ZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzk3YWQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2E4MTkuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZW5fbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2VfZW4uaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0ZmZlNi4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZSBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uPUVQRiBCYXNlIEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgRmVhdHVyZSBVcGRhdGVzCi1jb3B5cmlnaHQ9KGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLgotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLWxpY2Vuc2VUZXh0PVVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgc3ViamVjdCB0byB0aGUgc2FtZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB3aGljaCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgUHJvZHVjdCB3aGljaCBpbmNsdWRlZCB0aGlzIGZlYXR1cmUuCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTBkNDU0Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmJhc2UiCi0gICAgICBvcz0ibGludXgsd2luMzIiCi0gICAgICB3cz0iZ3RrLHdpbjMyIgotICAgICAgYXJjaD0ieDg2IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kcmF3MmQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5nZWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmZvcm1zIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuaW50cm8iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uaWJtLmljdSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVkaXQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLm9zZ2kiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuYXBhY2hlLmx1Y2VuZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnNlYXJjaCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWRpdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmJhc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudWkuaW50cm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51bWEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5YjUxNC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTNhODE5Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZW5fbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2VfZW4uaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWIyNTQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgRG9jIEZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotZGVzY3JpcHRpb249RVBGIERvY3VtZW50YXRpb24gRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzM1N2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmRvYyIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5kb2MuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTNkMjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjVlNjE4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlbl9saWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZV9lbi5odG1sCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNWQ5OWQuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBQbGF0Zm9ybSBGZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLWRlc2NyaXB0aW9uPUVQRiBQbGF0Zm9ybSBGZWF0dXJlLgotdXBkYXRlU2l0ZU5hbWU9RVBGIEZlYXR1cmUgVXBkYXRlcwotY29weXJpZ2h0PShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi1saWNlbnNlVGV4dD1Vc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHN1YmplY3QgdG8gdGhlIHNhbWUgdGVybXMgYW5kIGNvbmRpdGlvbnMgd2hpY2ggZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIFByb2R1Y3Qgd2hpY2ggaW5jbHVkZWQgdGhpcyBmZWF0dXJlLgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZlNmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtIgotICAgICAgb3M9ImxpbnV4LHdpbjMyIgotICAgICAgd3M9Imd0ayx3aW4zMiIKLSAgICAgIGFyY2g9Ing4NiIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uamNyYWZ0LmpzY2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC5zZXJ2bGV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXguc2VydmxldC5qc3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmphc3BlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5lbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5hbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUubHVjZW5lIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5uZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZGVidWcuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50b21jYXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanNjaC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5icm93c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUuYXBwbGljYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5uZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcubW9ydGJheS5qZXR0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5pYm0uaWN1IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLmJlYW5zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJjcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLm1hbmlwdWxhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1ZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmN2cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5jaGFuZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLmVkaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZS5lZGl0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lbWYub2NsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnF1ZXJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLnF1ZXJ5Lm9jbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im5ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vY2wuZWNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kcmF3MmQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nZWYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5hY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuYWN0aW9uLmlkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuZG5kIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmRuZC5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmRuZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLnJlbmRlci5hd3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY2xpcGJvYXJkLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5wcmludGluZy53aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay5icmlkZ2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmJhdGlrLmRvbSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2RlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay51dGlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnczYy5kb20uc3ZnIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS54ZXJjZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnhtbC5yZXNvbHZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsuY3NzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuYmF0aWsucGFyc2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5iYXRpay54bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcudzNjLmNzcy5zYWMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcudzNjLmRvbS5zbWlsIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLmNvbW1vbi5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudW1sMi51bWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NzQwNi4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjMxYTUuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wcm9kdWN0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVQRiBQcm9kdWN0IGZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBvcz0ibGludXgsd2luMzIiCi0gICAgICB3cz0iZ3RrLHdpbjMyIgotICAgICAgYXJjaD0ieDg2Ij4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9kZXNjcmlwdGlvbiI+Ci0gICAgICBbRW50ZXIgRmVhdHVyZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2NvcHlyaWdodCI+Ci0gICAgICBbRW50ZXIgQ29weXJpZ2h0IERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9saWNlbnNlIj4KLSAgICAgIFtFbnRlciBMaWNlbnNlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmV4ZWN1dGFibGUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvLnByb2plY3QgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRiNGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2E4MTkuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlbl9saWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgbGljZW5zZV9lbi5odG1sCmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyYzg4NC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AgRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbj1FUEYgUkNQIEZlYXR1cmUuCi11cGRhdGVTaXRlTmFtZT1FUEYgUkNQIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS54bWwgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTE0OTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnJjcCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2VUZXh0Ci0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yY3AudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmNwLmZlYXR1cmUvbGljZW5zZV9lbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlLy5wcm9qZWN0IGIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTE1MzI5Li4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzYTgxOS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZW5fbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2VfZW4uaHRtbApkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTg3OTcwLi4wMDAwMDAwCi0tLSBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1mZWF0dXJlTmFtZT1FUEYgUmljaHRleHQgRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1kZXNjcmlwdGlvbj1FUEYgUmljaHRleHQgRmVhdHVyZS4KLXVwZGF0ZVNpdGVOYW1lPUVQRiBGZWF0dXJlIFVwZGF0ZXMKLWNvcHlyaWdodD0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotbGljZW5zZVRleHQ9VXNlIG9mIHRoaXMgZmVhdHVyZSBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgZmVhdHVyZS4KZGlmZiAtLWdpdCBhLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyZjQ4ZS4uMDAwMDAwMAotLS0gYS8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQiCi0gICAgICBvcz0ibGludXgsd2luMzIiCi0gICAgICB3cz0iZ3RrLHdpbjMyIgotICAgICAgYXJjaD0ieDg2IgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZVRleHQKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uaWN1Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5hcGFjaGUuYW50Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uuc3d0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3IiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbCBiLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZS9saWNlbnNlX2VuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlL2xpY2Vuc2VfZW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyMDViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBleGNsdWRpbmc9ImNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9CU0VkaXRvclZpZXcuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvQ29udGVudFBhY2thZ2VUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvR3VpZGFuY2VUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUHJvZHVjdEVkaXRvclZpZXcuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUHJvZHVjdFZpZXdlci5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlRG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Sb2xlVGFza3NUYWIuamF2YXxjb20vaWJtL3VtYS9hdXRob3Jpbmcvdmlld3MvUm9sZVdvcmtQcm9kdWN0c1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrRGlzY2lwbGluZVRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrRG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9UYXNrR3VpZGFuY2VzVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1Rhc2tTdGVwVGFiLmphdmF8Y29tL2libS91bWEvYXV0aG9yaW5nL3ZpZXdzL1dvcmtQcm9kdWN0RG9jdW1lbnRhdGlvblRhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Xb3JrUHJvZHVjdEd1aWRhbmNlc1RhYi5qYXZhfGNvbS9pYm0vdW1hL2F1dGhvcmluZy92aWV3cy9Xb3JrUHJvZHVjdFRhc2tzVGFiLmphdmEiIGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTliMzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIEF1dGhvcmluZyBVSSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjMzNTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiYjJhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDI5IDE4OjA5OjQ5IFBTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjRjOGMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZ2VmLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zLAotIG9yZy5lY2xpcHNlLnVpLmludHJvLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnNlYXJjaCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5yZW5kZXIuYXd0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWJiYTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGhlbHAvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9oZWxwL2Jvb2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2IwODE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaGVscC9ib29rLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPHRvYyBsYWJlbD0iRVBGIENvbXBvc2VyIE1ldGhvZCBBdXRocm9pbmcgSGVscCBQYWdlIiAgdG9waWM9Imh0bWwvYm9vay5odG1sIj4KLQk8dG9waWMgbGFiZWw9Ik10aG9kIEF1dGhvcmluZyBPdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJBdXRob3JpbmcgVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwuaHRtbCIvPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9JdGVyYXRpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL0l0ZXJhdGlvbjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1BoYXNlMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUGhhc2UxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvUm9sZURlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOTk0NGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9TeW5jaEJhcjE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1N5bmNoQmFyMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzk5NDRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvU3luY2hCYXIyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9UZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvVGVtcGxhdGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hY3Rpdml0eTE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FjdGl2aXR5MjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWN0aXZpdHkyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRBbGxEZXBlbmRlbnRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2FkZEFsbERlcGVuZGVudEVsZW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9hZGRyZWZfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQwY2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvYWRkcmVmX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NoZWNrZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjM0NGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY2hlY2tlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jbG9zdXJlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1NTQxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nsb3N1cmVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb2xsYXBzZWFsbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkODBhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YzhiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2NvbGxhcHNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbm5lY3Rpb24xNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmExMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9jb25uZWN0aW9uMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE1ZmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ubmVjdGlvbjI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Nvbndhcm5fY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUwYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvY29ud2Fybl9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YTViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2RlY25vZGVfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZGVjbm9kZV9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NmVhYTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9kZWNub2RlX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY1MDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZW5kbm9kZV9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lbmRub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNzdmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2VuZG5vZGVfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9lcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlN2E5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Vycm9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIwNWIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRkOWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZXhwYW5kZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiODEzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2ZyZWV0ZXh0X3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnJlZXRleHRfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YjRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mcmVldGV4dF9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2R0b29sMTYvc2hvd19lbXB0eV91aV9mb2xkZXJzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRlMmFlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zaG93X2VtcHR5X3VpX2ZvbGRlcnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwYWZhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmVzX25hbWVfdG9nZ2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1ByaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1ZGU3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9QcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EwNGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvU3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwODIzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9TdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2ZsYXRMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjc0Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvZmxhdExheW91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NDg2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDNlMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX2Rvd25fZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGRjZjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDc0NzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvbW92ZV91cF9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyZGYxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODRmN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50X2Rpc2FibGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdmOGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfbGlua2VkX2VsZW1lbnRfZGlzYWJsZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3Nob3dfdWlfZm9sZGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTRlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvc2hvd191aV9mb2xkZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE3NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL2V0b29sMTYvdmFsaWRhdGVfbWV0aG9kX2xpYl9kaXNhYmxlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4NjRlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZV9tZXRob2RfbGliX2Rpc2FibGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4OTcyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0NvbGxhcHNlZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzM2MzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvQ29sbGFwc2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9EaXNhYmxlQ2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNjczNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVDaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0Rpc2FibGVVbmNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyYTc4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvRGlzYWJsZVVuY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9FeHBhbmRlZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTc0NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L0V4cGFuZGVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmIzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1VuY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZhOTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9VbmNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTEyNDE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9BdXRob3JpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0Jyb3dzaW5nUGVyc3BlY3RpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg5NjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uRXJyb3JMb2dWaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiNjM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db25maWd1cmF0aW9uVmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvQ29udGVudFZpZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9Db250ZW50Vmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvdmlldzE2L0xpYnJhcnlWaWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTGlicmFyeVZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3ZpZXcxNi9NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC92aWV3MTYvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vTmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0OTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9mdWxsL3dpemJhbi9zeW5jaHJvbml6YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9oaWRlVW5jaGVja2VkRWxlbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwOTM0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2hpZGVVbmNoZWNrZWRFbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbGlua19wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9saW5rX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxMzdlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL2xpbmtfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Zjg3NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tYXJxX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21hcnFfcGFsMjQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdkNzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbWFycV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL21vdmVfZG93bi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjgzNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX2Rvd24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvbW92ZV91cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMGMyYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9tb3ZlX3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2VsZWN0X3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1Y2FmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NlbGVjdF9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGZjZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zZWxlY3RfcGFsMjQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvYXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9hcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NhcGFiaWxpdHlwYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBiMWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2FwYWJpbGl0eXBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jaGVja2xpc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNhYTNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU5NWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2NvbnRlbnRwYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2FkOTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY29udGVudHBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9jdXN0b21jYXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyZDhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvY3VzdG9tY2F0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RlbGl2ZXJ5cHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmE3ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kZWxpdmVyeXByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTVhOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZGlzY2lwbGluZWdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MzA2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2Rpc2NpcGxpbmVncm91cC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTI1N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9kb21haW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9ndWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvZ3VpZGVsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvaXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjOGExNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL2l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RsaWJyYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0Zjk3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21ldGhvZGxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9tZXRob2RwbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTFhMjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWV0aG9kcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvbWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZmY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL21pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9vdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL291dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9waGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVjYjNjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjlhMDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3Njb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc2NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NjZiNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzY29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTdmYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9wcm9jZXNzcGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Byb2Nlc3NwbGFubmluZ3RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA2ODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcHJvY2Vzc3BsYW5uaW5ndGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZWJkZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTI0YWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3JvbGVkZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEyMmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZWRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvcm9sZXNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjY3YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS9yb2xlc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjMzZDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90YXNrZGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdGFza2Rlc2NyaXB0b3IxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZDY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rhc2tkZXNjcmlwdG9yMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTEzNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZWNobmlxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90ZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3YTdlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzU1YTJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvdG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS90b29sbWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3Rvb2xtZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTQ4ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93aGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya2Rlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrZGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3NoYXBlL3dvcmtvcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNWViYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3Jrb3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc2hhcGUvd3BndWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaGFwZS93cGd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3Nob3dDb25maWdFcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjYzN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zaG93Q29uZmlnRXJyb3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zdG5vZGVfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjIyZjRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3Rub2RlX3BhbDI0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2YjFmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N0bm9kZV9wYWwyNC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5ZDBmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3N5bmNiYXJfcGFsMTYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvc3luY2Jhcl9wYWwyNC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwN2QwN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy9zeW5jYmFyX3BhbDI0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUyMGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL2ljb25zL3dmX2VkaXRvcl9pY29uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGRjMWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2ZfZWRpdG9yX2ljb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvaWNvbnMvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGIzNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9pY29ucy93aXpiYW4vc3luY2hyb25pemF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTlhMzI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBBdXRob3JpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIENhdGVnb3J5Ci1tZXRob2RDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgUGVyc3BlY3RpdmUKLWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZT1BdXRob3JpbmcKLWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lPUJyb3dzaW5nCi0KLSMgVmlld3MKLWxpYnJhcnlWaWV3TmFtZT1MaWJyYXJ5Ci1jb25maWd1cmF0aW9uVmlld05hbWU9Q29uZmlndXJhdGlvbgotY29udGVudFZpZXdOYW1lPUNvbnRlbnQKLWNvbmZpZ3VyYXRpb25FcnJvckxvZ1ZpZXdOYW1lPUNvbmZpZ3VyYXRpb24gRXJyb3IgTG9nCi0KLSMgRWRpdG9ycwotbWV0aG9kRWxlbWVudEVkaXRvck5hbWU9TWV0aG9kIEVsZW1lbnQgRWRpdG9yCi1jb25maWd1cmF0aW9uRWRpdG9yTmFtZT1Db25maWd1cmF0aW9uIEVkaXRvcgotcHJvY2Vzc0VkaXRvck5hbWU9UHJvY2VzcyBFZGl0b3IKLWFjdGl2aXR5RGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGlhZ3JhbSBFZGl0b3IKLWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWU9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdG9yCi13b3JrUHJvZHVjdERlcGVkZW5jeURpYWdyYW1FZGl0b3JOYW1lPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gRWRpdG9yCi0KLSMgV2l6YXJkcwotbmV3TWV0aG9kTGlicmFyeVdpemFyZE5hbWU9TWV0aG9kIExpYnJhcnkKLW5ld01ldGhvZExpYnJhcnlXaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1uZXdNZXRob2RQbHVnaW5XaXphcmROYW1lPU1ldGhvZCBQbHVnLWluCi1uZXdNZXRob2RQbHVnaW5XaXphcmREZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgbWV0aG9kIHBsdWctaW4uCi1uZXdDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1NZXRob2QgQ29uZmlndXJhdGlvbgotbmV3Q29uZmlndXJhdGlvbldpemFyZERlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLQotIyBDaGVhdCBTaGVldHMKLW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZT1NZXRob2QgQXV0aG9yaW5nIENoZWF0IFNoZWV0cwotQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQ9R2V0dGluZyBTdGFydGVkCi1DaGVhdHNoZWV0UmV1c2FibGVDb250ZW50Q2F0ZWdvcnlUZXh0PUNyZWF0ZSBSZXVzYWJsZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFdyaXRlQ29udGVudENhdGVnb3J5VGV4dD1Xcml0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldFByb2Nlc3Nlc0NhdGVnb3J5VGV4dD1Xb3JrIHdpdGggUHJvY2Vzc2VzCi1DaGVhdHNoZWV0TmF2aWdhdGVNZXRob2RDb250ZW50PU5hdmlnYXRlIE1ldGhvZCBDb250ZW50Ci1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbj1DcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24KLUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW49Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluCi1DaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudD1BZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZQotQ2hlYXRzaGVldFRhaWxvck1ldGhvZEVsZW1lbnRzPVRhaWxvciBleGlzdGluZyBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cyBvciBHdWlkYW5jZSkgVXNpbmcgQ29udHJpYnV0aW9uCi1DaGVhdHNoZWV0UmVwbGFjZU1laHRvZEVsZW1lbnRzPVJlcGxhY2UgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpCi1DaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbms9QWRkIGEgTWV0aG9kIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsgKFVSTCkKLUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuPUFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1DaGVhdHNoZWV0Q3JlYXRlUHJvY2Vzcz1DcmVhdGUgYSBQcm9jZXNzIChDYXBhYmlsaXR5IFBhdHRlcm4gb3IgRGVsaXZlcnkgUHJvY2VzcykKLQotIyBBY3Rpb24gU2V0Ci1hdXRob3JpbmdBY3Rpb25TZXQ9QXV0aG9yaW5nCi1jaGVhdFNoZWV0c0FjdGlvblNldD1DaGVhdCBTaGVldHMKLQotIyBHbG9iYWwgQWN0aW9ucwotbmV3TGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW5ld0xpYnJhcnlBY3Rpb25Ub29sdGlwPUNyZWF0ZSBhIG5ldyBNZXRob2QgTGlicmFyeQotbmV3UGx1Z2luQWN0aW9uPU1ldGhvZCAmUGx1Zy1pbgotbmV3UGx1Z2luQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW4KLW5ld0NvbmZpZ0FjdGlvbj1NZXRob2QgJkNvbmZpZ3VyYXRpb24KLW5ld0NvbmZpZ0FjdGlvblRvb2x0aXA9Q3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uCi1vcGVuTGlicmFyeUFjdGlvbj1NZXRob2QgJkxpYnJhcnkKLW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIE1ldGhvZCBMaWJyYXJ5Ci1vcGVuQ29uZmlnQWN0aW9uPU1ldGhvZCAmQ29uZmlndXJhdGlvbgotb3BlbkNvbmZpZ0FjdGlvblRvb2x0aXA9T3BlbiBhbiBleGlzdGluZyBNZXRob2QgQ29uZmlndXJhdGlvbgotb3BlbkNoZWF0U2hlZXRzPSZDaGVhdCBTaGVldHMuLi4KLQotIyBMaWJyYXJ5IFZpZXcgQWN0aW9ucwotbGlua1dpdGhFZGl0b3I9TGluayB3aXRoIEVkaXRvcgotbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgd2l0aCBFZGl0b3IKLXNob3dQcmVzZW50YXRpb25OYW1lcz1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotc2hvd1ByZXNlbnRhdGlvbk5hbWVzVG9vbHRpcD1TaG93IFByZXNlbnRhdGlvbiBOYW1lcwotCi0jIENvbmZpZ3VyYXRpb24gVmlldyBBY3Rpb25zCi1yZWZyZXNoQ29uZmlnPVJlZnJlc2gKLXJlZnJlc2hDb25maWdUb29sdGlwPVJlZnJlc2ggQ29uZmlndXJhdGlvbgotCi0jIFByZWZlcmVuY2UgUGFnZQotYXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2U9QXV0aG9yaW5nCi1wcm9jZXNzRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi1saWJyYXJ5T3B0aW9ucz1MaWJyYXJ5IE9wdGlvbnMKLXN0YXJ0dXBBbmRTaHV0ZG93bj1TdGFydHVwIGFuZCBTaHV0ZG93bgotZGVidWc9RGVidWcKLW1vZGVsaW5nT3B0aW9ucz1Nb2RlbGluZyBPcHRpb25zCi1kaWFncmFtQXBwZWFyYW5jZT1EaWFncmFtIEFwcGVhcmFuY2UKLWJyZWFrZG93bkVsZW1lbnRBdHRyaWJ1dGVzPUJyZWFrZG93biBFbGVtZW50IEF0dHJpYnV0ZXMKLWxpYnJhcnlWaWV3T3B0aW9ucz1MaWJyYXJ5IFZpZXcgT3B0aW9ucwotCi0jIENvbW1hbmQgSGFuZGxlcgotc2VsZWN0QWxsPVNlbGVjdCBBbGwKLQotIyBQcm9wZXJ0aWVzIFZpZXcKLV9VSV9Qcm9jZXNzRWRpdG9yX21lbnU9UHJvY2VzcwotX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbT0mTmV3IENoaWxkCi1fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW09TiZldyBTaWJsaW5nCi1fVUlfU2hvd1Byb3BlcnRpZXNWaWV3X21lbnVfaXRlbT1TaG93IFByb3BlcnRpZXMgJlZpZXcKLV9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbT1SZSZmcmVzaAotX1VJX1Byb3BlcnRpZXNfR2VuZXJhbD1HZW5lcmFsCi1fVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uPURvY3VtZW50YXRpb24KLV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlPUd1aWRhbmNlCi1fVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cD1Xb3JrIFJvbGx1cAotX1VJX1Byb3BlcnRpZXNfVGVhbV9Sb2xsdXA9VGVhbSBSb2xsdXAKLV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cD1Xb3JrIFByb2R1Y3QgUm9sbHVwCi1fVUlfUHJvcGVydGllc19Sb2xlcz1Sb2xlcwotX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzPVdvcmsgUHJvZHVjdHMKLV9VSV9Qcm9wZXJ0aWVzX1N0ZXBzPVN0ZXBzCi1fVUlfUHJvcGVydGllc19UZWFtcz1UZWFtcwotCi1SaWNoVGV4dE1hcmtlclR5cGVOYW1lPUhUTUwgUHJvYmxlbXMKLUNvbmZpZ3VyYXRpb25NYXJrZXJUeXBlTmFtZT1Db25maWd1cmF0aW9uIFByb2JsZW1zCi1FeHBsYW5hdGlvblRleHQ9RXhwbGFuYXRpb24KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzk5YzNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9Im5ld1BsdWdpbldpemFyZCIKLSAgICAgICAgIG5hbWU9Ik5ldyBNZXRob2QgUGx1Zy1pbiBXaXphcmQgRXh0ZW5zaW9uIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QiIC8+Ci0gICAgICAgICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgbmFtZT0iTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZCBFeHRlbnNpb24iCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QiIC8+ICAgICAgICAgCi0KLQotICAgICAgICAgCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0iZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiCi0gICAgICAgICBuYW1lPSJFZGl0b3IgRGVzY3JpcHRpb24gUGFnZSBDb2x1bW4gUHJvdmlkZXIiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlci5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJ3aXphcmRSZWdpc3RyeVByb3ZpZGVyIgotICAgICAgICAgbmFtZT0iV2l6YXJkIFJlZ2lzdGVyeSBQcm92aWRlciIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iRWRpdG9yT3BlbmVyIiBuYW1lPSJFZGl0b3IgT3BlbmVyIiBzY2hlbWE9InNjaGVtYS9lZGl0b3JPcGVuZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iQ3VzdG9taXplZExvY2tlciIgbmFtZT0iQ3VzdG9taXplZCBMb2NrZXIiIHNjaGVtYT0ic2NoZW1hL0N1c3RvbWl6ZWRMb2NrZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibWV0aG9kUmljaFRleHQiIG5hbWU9Ik1ldGhvZCBSaWNoIFRleHQgRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9tZXRob2RSaWNoVGV4dC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtZXRob2RSaWNoVGV4dEVkaXRvciIgbmFtZT0iTWV0aG9kIFJpY2ggVGV4dCBFZGl0b3IgRXh0ZW5zaW9uIiBzY2hlbWE9InNjaGVtYS9tZXRob2RSaWNoVGV4dEVkaXRvci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb250ZW50UHJvdmlkZXJGYWN0b3JpZXMiIG5hbWU9IkNvbnRlbnQgUHJvdmlkZXIgRmFjdG9yaWVzIiBzY2hlbWE9InNjaGVtYS9jb250ZW50UHJvdmlkZXJGYWN0b3JpZXMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMiIG5hbWU9Ik1ldGhvZCBFbGVtZW50IEVkaXRvciBQYWdlIFByb3ZpZGVycyIgc2NoZW1hPSJzY2hlbWEvTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMuZXhzZCIvPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGZpeGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0F1dGhvcmluZ1BlcnNwZWN0aXZlLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgbmFtZT0iJWF1dGhvcmluZ1BlcnNwZWN0aXZlTmFtZSIvPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgZml4ZWQ9ImZhbHNlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC92aWV3MTYvQnJvd3NpbmdQZXJzcGVjdGl2ZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlIgotICAgICAgICAgICAgbmFtZT0iJWJyb3dzaW5nUGVyc3BlY3RpdmVOYW1lIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0xpYnJhcnlWaWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3IgotICAgICAgICAgICAgbmFtZT0iJWxpYnJhcnlWaWV3TmFtZSIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0NvbmZpZ3VyYXRpb25WaWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IgotICAgICAgICAgICAgbmFtZT0iJWNvbmZpZ3VyYXRpb25WaWV3TmFtZSIvPgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkudmlld3MuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db250ZW50VmlldyIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvdmlldzE2L0NvbnRlbnRWaWV3LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3IgotICAgICAgICAgICAgbmFtZT0iJWNvbnRlbnRWaWV3TmFtZSIvPgotICAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotICAgICAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdQZXJzcGVjdGl2ZSI+Ci0gICAgICAgICA8dmlldwotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciCi0gICAgICAgICAgICAgICBtb3ZlYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgIHJhdGlvPSIwLjVmIgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJib3R0b20iCi0gICAgICAgICAgICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIvPgotICAgICAgICAgPHZpZXdTaG9ydGN1dAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciLz4KLSAgICAgICAgIDx2aWV3U2hvcnRjdXQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3Ii8+Ci0gICAgICAgICA8c2hvd0luUGFydCBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldyIvPgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgICAgIAotICAgICAgPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5Ccm93c2luZ1BlcnNwZWN0aXZlIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICBjbG9zZWFibGU9ImZhbHNlIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXciCi0gICAgICAgICAgICAgICBtb3ZlYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgIHJhdGlvPSIwLjcwZiIKLSAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcD0icmlnaHQiCi0gICAgICAgICAgICAgICByZWxhdGl2ZT0ib3JnLmVjbGlwc2UudWkuZWRpdG9yc3MiLz4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVtZXRob2RFbGVtZW50RWRpdG9yTmFtZSIKLSAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvciIKLSAgICAgICAgICAgIG5hbWU9IiVjb25maWd1cmF0aW9uRWRpdG9yTmFtZSIKLSAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlcHJvY2Vzc0VkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHlEaWFncmFtRWRpdG9yTmFtZSIvPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIgotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvck5hbWUiLz4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IiCi0gICAgICAgICAgICBuYW1lPSIld29ya1Byb2R1Y3REZXBlZGVuY3lEaWFncmFtRWRpdG9yTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlbmV3TWV0aG9kTGlicmFyeVdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJW5ld01ldGhvZExpYnJhcnlXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPiAgICAgICAKLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4uZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlbmV3TWV0aG9kUGx1Z2luV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlbmV3TWV0aG9kUGx1Z2luV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkubmV3V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25XaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlbmV3Q29uZmlndXJhdGlvbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJW5ld0NvbmZpZ3VyYXRpb25XaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5Q29udHJpYnV0b3IiPgotICAgICAgPHByb3BlcnR5Q29udHJpYnV0b3IKLSAgICAgICAgICAgIHR5cGVNYXBwZXI9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FbGVtZW50VHlwZU1hcHBlciIKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkVsZW1lbnRMYWJlbFByb3ZpZGVyIj4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5IGNhdGVnb3J5PSJlbGVtZW50Ii8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeSBjYXRlZ29yeT0ib3RoZXIiLz4KLSAgICAgIDwvcHJvcGVydHlDb250cmlidXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVRhYnMiPgotICAgICAgPHByb3BlcnR5VGFicwotICAgICAgICAgICAgY29udHJpYnV0b3JJZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3IiPgotICAgICAgICAgPCEtLSBTVEFSVCBHRU5FUkFMIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuV29ya0JyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfR2VuZXJhbCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HZW5lcmFsIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuR2VuZXJhbCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0dlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5Xb3JrUHJvZHVjdERlc2NyaXB0b3IuR2VuZXJhbCIvPgotCQkgPCEtLSBFTkQgR0VORVJBTC0tPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIFNUQVJUIERPQ1VNRU5UQVRJT04gLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkRlc2NyaXB0b3IuRG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5HZW5lcmFsIi8+Ci0JCSA8IS0tIEVORCBET0NVTUVOVEFUSU9OIC0tPgotCQkKLQkJIDwhLS0gU1RBUlQgR1VJREFOQ0UgLS0+Ci0JCSAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX0d1aWRhbmNlIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkJyZWFrZG93bkVsZW1lbnQuR3VpZGFuY2UiLz4gIAotICAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuR3VpZGFuY2UiLz4gCi0gICAgICAgICA8IS0tIEVORCBHVUlEQU5DRS0tPgotICAgICAgICAgCi0JCSA8IS0tIEFDVElWSVRZIC0tPiAgICAgICAKLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Xb3JrX1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5Lkd1aWRhbmNlIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtSb2xsdXAiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19UZWFtX1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LldvcmtSb2xsdXAiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuVGVhbVJvbGx1cCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1dQX1JvbGx1cCIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LlRlYW1Sb2xsdXAiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuV29ya1Byb2R1Y3RzUm9sbHVwIi8+Ci0gICAgICAgIAotICAgICAgICAgPCEtLSBUQVNLIERFU0NSSVBUT1IgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfUm9sZXMiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZWxlbWVudCIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJwcm9wZXJ0aWVzLnRhYi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuUm9sZSIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1dvcmtQcm9kdWN0cyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlJvbGUiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19TdGVwcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yIFJlbGF0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLlN0ZXAiLz4KLSAgICAgICAgIAotICAgICAgICAgPCEtLSBST0xFIERFU0NSSVBUT1IgLS0+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX1Byb3BlcnRpZXNfV29ya1Byb2R1Y3RzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGFzayIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1RlYW1zIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuV29ya1Byb2R1Y3QiCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGVhbSIvPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIFRFQU0gUFJPRklMRSAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfUHJvcGVydGllc19Sb2xlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJlbGVtZW50IgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9InByb3BlcnRpZXMudGFiLlRlYW1Qcm9maWxlLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy50YWIuVGVhbVByb2ZpbGUuUm9sZSIvPgotICAgICAgICAgCi0gICAgICAgICA8IS0tIENPTVBPU0lURSBST0xFIC0tPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9Qcm9wZXJ0aWVzX1JvbGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImVsZW1lbnQiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0icHJvcGVydGllcy50YWIuUm9sZURlc2NyaXB0b3IuVGVhbSIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnRhYi5Db21wb3NpdGVSb2xlLlJvbGUiLz4KLSAgICAgIDwvcHJvcGVydHlUYWJzPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5U2VjdGlvbnMiPgotICAgICAgPHByb3BlcnR5U2VjdGlvbnMKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIj4KLSAgICAgICAgIDwhLS0gU1RBUlQgR0VORVJBTCBTRUNUSU9OIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eUdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRhc2tEZXNjcmlwdG9yLkdlbmVyYWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRhc2tEZXNjcmlwdG9yLkdlbmVyYWwiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlJvbGVEZXNjcmlwdG9yLkdlbmVyYWwiCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLkdlbmVyYWwiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLldvcmtQcm9kdWN0RGVzY3JpcHRvci5HZW5lcmFsIgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Xb3JrUHJvZHVjdERlc2NyaXB0b3IuR2VuZXJhbCI+ICAgICAgCi0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAgICAgIAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Xb3JrQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Xb3JrQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HZW5lcmFsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkJyZWFrZG93bkVsZW1lbnQuR2VuZXJhbCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPCEtLSBFTkQgR0VORVJBTCBTRUNUSU9OIC0tPgotICAgICAgICAKLSAgICAgICAgIDwhLS0gU1RBUlQgRE9DVU1FTlRBVElPTiBTRUNUSU9OIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Eb2N1bWVudGF0aW9uIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eURvY3VtZW50U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuRG9jdW1lbnRhdGlvbiI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5EZXNjcmlwdG9yLkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkRlc2NyaXB0b3IuRG9jdW1lbnRhdGlvbiI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5CcmVha2Rvd25FbGVtZW50LkRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk1pbGVzdG9uZURvY3VtZW50U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQnJlYWtkb3duRWxlbWVudC5Eb2N1bWVudCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gICAgICAgCi0gICAgICAgICA8IS0tIEVORCBET0NVTUVOVEFUSU9OIFNFQ1RJT04gLS0+Ci0gICAgICAKLSAgICAgICAgIDwhLS0gU1RBUlQgR1VJREFOQ0UgU0VDVElPTiAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQnJlYWtkb3duRWxlbWVudC5HdWlkYW5jZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEd1aWRhbmNlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQnJlYWtkb3duRWxlbWVudC5HdWlkYW5jZSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5Lkd1aWRhbmNlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uQWN0aXZpdHkuR3VpZGFuY2UiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDwhLS0gRU5EIEdVSURBTkNFIFNFQ1RJT04gLS0+Ci0gICAgICAgICAKLSAgICAgICAgIDwhLS0gQUNUSVZJVFkgLS0+ICAgIAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5BY3Rpdml0eS5Xb3JrUm9sbHVwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5BY3Rpdml0eS5Xb3JrUm9sbHVwIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5Ii8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLkFjdGl2aXR5LlRlYW1Sb2xsdXAiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5LlRlYW1Sb2xsdXAiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQWN0aXZpdHkuV29ya1Byb2R1Y3RzUm9sbHVwIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkFjdGl2aXR5LldvcmtQcm9kdWN0c1JvbGx1cCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPgotICAgICAgICAgPCEtLSBFTkQgQUNUSVZJVFkgLS0+Ci0gICAgICAgICAKLSAgICAgICAgIDwhLS0gU2VjdGlvbnMgZm9yIFRhc2tEZXNjcmlwdG9yIC0tPgotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5UYXNrRGVzY3JpcHRvci5Sb2xlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5UYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UYXNrRGVzY3JpcHRvci5Sb2xlIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+ICAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuV29ya1Byb2R1Y3QiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5UYXNrRGVzY3JpcHRvci5Xb3JrUHJvZHVjdCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuVGFza0Rlc2NyaXB0b3IuU3RlcCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uVGFza0Rlc2NyaXB0b3IuU3RlcCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciIvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5UYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIiLz4KLSAgICAgICAgIDwvcHJvcGVydHlTZWN0aW9uPiAKLSAgICAgICAgIAotICAgICAgICAgPCEtLSBTZWN0aW9ucyBmb3IgUm9sZURlc2NyaXB0b3IgLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlJvbGVEZXNjcmlwdG9yLldvcmtQcm9kdWN0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJwcm9wZXJ0aWVzLnNlY3Rpb24uUm9sZURlc2NyaXB0b3IuV29ya1Byb2R1Y3QiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gIAotICAgICAgICAgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICAgICAgICAgdGFiPSJwcm9wZXJ0aWVzLnRhYi5Sb2xlRGVzY3JpcHRvci5UZWFtIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Sb2xlRGVzY3JpcHRvclRlYW1TZWN0aW9uIgotICAgICAgICAgICAgICAgaWQ9InByb3BlcnRpZXMuc2VjdGlvbi5Sb2xlRGVzY3JpcHRvci5UZWFtIj4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciIvPgotICAgICAgICAgPC9wcm9wZXJ0eVNlY3Rpb24+IAotICAgICAgCi0KLSAgICAgICAgIDwhLS0gU2VjdGlvbiBmb3IgVGVhbVByb2ZpbGUgLS0+Ci0gICAgICAgICA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgICAgICAgICB0YWI9InByb3BlcnRpZXMudGFiLlRlYW1Qcm9maWxlLlJvbGUiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlRlYW1Qcm9maWxlUm9sZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLlRlYW1Qcm9maWxlLlJvbGUiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUiLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4gCi0gICAgICAgICAKLSAgICAgICAgIDwhLS0gU2VjdGlvbiBmb3IgQ29tcG9zaXRlUm9sZSAtLT4KLSAgICAgICAgIDxwcm9wZXJ0eVNlY3Rpb24KLSAgICAgICAgICAgICAgIHRhYj0icHJvcGVydGllcy50YWIuQ29tcG9zaXRlUm9sZS5Sb2xlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Db21wb3NpdGVSb2xlUm9sZVNlY3Rpb24iCi0gICAgICAgICAgICAgICBpZD0icHJvcGVydGllcy5zZWN0aW9uLkNvbXBvc2l0ZVJvbGUuUm9sZSI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlIi8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyIi8+Ci0gICAgICAgICA8L3Byb3BlcnR5U2VjdGlvbj4KLSAgICAgIDwvcHJvcGVydHlTZWN0aW9ucz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXV0aG9yaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVhdXRob3JpbmdQcmVmZXJlbmNlUGFnZSIvPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgbmFtZT0iJXByb2Nlc3NFZGl0b3IiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5CcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5CcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiICAgICAgICAgICAgCi0gICAgICAgICAgICBuYW1lPSIlYnJlYWtkb3duRWxlbWVudEF0dHJpYnV0ZXMiLz4gICAgICAgICAgICAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BdXRob3JpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlWaWV3UHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5Vmlld1ByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJWxpYnJhcnlWaWV3T3B0aW9ucyIvPgotICAgICAgPCEtLQotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVtZXRob2RBdXRob3JpbmdQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMubGlicmFyeXByZWZwYWdlIgotICAgICAgICAgICAgbmFtZT0iJWxpYnJhcnlPcHRpb25zIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMucm9vdHByZWZwYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuRGVidWdQcmVmUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkRlYnVnUHJlZlBhZ2UiCi0gICAgICAgICAgICBuYW1lPSIlZGVidWciLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5yb290cHJlZnBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Nb2RlbGluZ09wdGlvbnNQcmVmUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLk1vZGVsaW5nT3B0aW9uc1ByZWZQYWdlIgotICAgICAgICAgICAgbmFtZT0iJW1vZGVsaW5nT3B0aW9ucyIvPgotICAgICAgLS0+Ci0KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkF1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdBY3Rpb25zIj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3Q29udHJpYnV0aW9uLnJlZnJlc2hDb25maWd1cmF0aW9uIgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXciPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5SZWZyZXNoQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L1JlZnJlc2guZ2lmIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iKyIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvZXRvb2wxNi9SZWZyZXNoLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMucmVmcmVzaCIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaENvbmZpZyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2xiYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaENvbmZpZ1Rvb2x0aXAiLz4KLSAgICAgIDwvdmlld0NvbnRyaWJ1dGlvbj4KLSAgICAgIDx2aWV3Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3Q29udHJpYnV0aW9uLmxpbmtXaXRoRWRpdG9yIgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXciPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaW5rV2l0aEVkaXRvciIKLSAgICAgICAgICAgICAgIGRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L3N5bmNlZC5naWYiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvc3luY2VkLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMubGlua1dpdGhFZGl0b3IiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWxpbmtXaXRoRWRpdG9yIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJ0b2dnbGUiCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWxpbmtXaXRoRWRpdG9yVG9vbHRpcCIvPgotICAgICAgPC92aWV3Q29udHJpYnV0aW9uPgotICAgICAgPHZpZXdDb250cmlidXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdDb250cmlidXRpb24uc2hvd1ByZXNOYW1lcyIKLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuU2hvd1ByZXNlbnRhdGlvbk5hbWVzIgotICAgICAgICAgICAgICAgZGlzYWJsZWRJY29uPSJpY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvUHJlc19uYW1lX3RvZ2dsZS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLnNob3dQcmVzTmFtZXMiCi0gICAgICAgICAgICAgICBsYWJlbD0iJXNob3dQcmVzZW50YXRpb25OYW1lcyIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdHlsZT0idG9nZ2xlIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVzaG93UHJlc2VudGF0aW9uTmFtZXNUb29sdGlwIi8+Ci0gICAgICA8L3ZpZXdDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0gICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaGFuZGxlcnMuU2VsZWN0QWxsSGFuZGxlciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlc2VsZWN0QWxsIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQuc2VsZWN0QWxsQiIKLSAgICAgICAgICAgIG5hbWU9InNlbGVjdEFsbCIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmJpbmRpbmdzIj4KLSAgICAgIDxrZXkKLSAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UudWkuZWRpdC5zZWxlY3RBbGxCIgotICAgICAgICAgICAgY29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5jb250ZXh0cy53aW5kb3ciCi0gICAgICAgICAgICBzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIHNlcXVlbmNlPSJDdHJsK0EiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4KLSAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgIGxhYmVsPSIlY2hlYXRTaGVldHNBY3Rpb25TZXQiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmFjdGlvblNldCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICBsYWJlbD0iJW9wZW5DaGVhdFNoZWV0cyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLkNoZWF0U2hlZXRIZWxwTWVudUFjdGlvbiIKLSAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL2dyb3VwLmFzc2lzdCIgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnMuQ2hlYXRTaGVldEhlbHBNZW51QWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5kZWNvcmF0b3JzIj4KLSAgICAgIDxkZWNvcmF0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciIKLSAgICAgICAgICAgIGxhYmVsPSJNZXRob2QgRWxlbWVudCBMaWdodHdlaWdodCBMYWJlbCBEZWNvcmF0b3IiCi0gICAgICAgICAgICBsaWdodHdlaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGxvY2F0aW9uPSJUT1BfTEVGVCIKLSAgICAgICAgICAgIHN0YXRlPSJ0cnVlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCi0gICAgICAJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudW5yZXNvbHZlZFByb3h5TWFya2VyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gaWQ9Im1ldGhvZFJpY2hUZXh0IiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJVJpY2hUZXh0TWFya2VyVHlwZU5hbWUiPiAKLSAgICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJmYWxzZSIvPiAKLSAgICAgIDxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIi8+IAotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJndWlkIi8+Ci0gICAgICA8YXR0cmlidXRlIG5hbWU9Ik1ldGhvZEZpZWxkTmFtZSIvPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJjb25maWd1cmF0aW9uIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJUNvbmZpZ3VyYXRpb25NYXJrZXJUeXBlTmFtZSI+IAotICAgICAgPHBlcnNpc3RlbnQgdmFsdWU9ImZhbHNlIi8+IAotICAgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2JsZW1tYXJrZXIiLz4gCi0gICAgICA8YXR0cmlidXRlIG5hbWU9ImVycm9ySUQiLz4KLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29uZmlnR3VpZCIvPgotICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50R3VpZCIvPiAKLSAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2F1c2VHdWlkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+Ci0gICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkNvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgotICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jb25maWd1cmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiPgotICAgICAgPHVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Vc2VySW50ZXJhY3Rpb25IYW5kbGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm1ldGhvZFJpY2hUZXh0Ij4KLSAgICAgIDxtZXRob2RSaWNoVGV4dAotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RSaWNoVGV4dCIKLSAgICAgICAgICAgIHZlcnNpb249IjAiPgotICAgICAgPC9tZXRob2RSaWNoVGV4dD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHRFZGl0b3IiPgotICAgICAgPG1ldGhvZFJpY2hUZXh0RWRpdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZFJpY2hUZXh0RWRpdG9yIgotICAgICAgICAgICAgdmVyc2lvbj0iMCI+Ci0gICAgICA8L21ldGhvZFJpY2hUZXh0RWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL0N1c3RvbWl6ZWRMb2NrZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL0N1c3RvbWl6ZWRMb2NrZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjMDMzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9DdXN0b21pemVkTG9ja2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9IkN1c3RvbWl6ZWRMb2NrZXIiIG5hbWU9IkN1c3RvbWl6ZWQgTG9ja2VyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkN1c3RvbWl6ZWRMb2NrZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iQ3VzdG9taXplZExvY2tlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL01ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYmY3MmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMiIG5hbWU9Ik1ldGhvZCBFbGVtZW50IEVkaXRvciBQYWdlIFByb3ZpZGVycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBlbmFibGVzIGEgcGx1Zy1pbiB0byBhZGQsIHJlbW92ZSwgb3IgcmVwbGFjZSBvbmUgb3IgbW9yZSBwYWdlcyBpbiB0aGUgYXV0aG9yaW5nIGVkaXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZWRpdG9yUGFnZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlZGl0b3JQYWdlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24iLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gJmx0O2V4dGVuc2lvbgotICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkN1c3RvbUNhdGVnb3J5RWRpdG9yUGFnZVByb3ZpZGVyJnF1b3Q7Jmd0OwotICAmbHQ7ZWRpdG9yUGFnZQotICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5DdXN0b21DYXRlZ29yeUVzdGltYXRpb25QYWdlJnF1b3Q7Ci0gICBuYW1lPSZxdW90O0VzdGltYXRpb24mcXVvdDsKLSAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ3VzdG9tQ2F0ZWdvcnlFc3RpbWF0aW9uUGFnZSZxdW90OyZndDsKLSAgJmx0Oy9lZGl0b3JQYWdlJmd0OwotICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2NGFlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Im5ld1BsdWdpbldpemFyZCIgbmFtZT0iTmV3IE1ldGhvZCBQbHVnaW4gV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmV3Q29uZmlndXJhdGlvbldpemFyZCZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkRXh0ZW5kZXImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NuZmlndXJhdGlvbldpemFyZFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TZWxlY3RPcHRpb25zUGFnZSZxdW90OwotICAgICAgICAgICAgICAgdHlwZT0mcXVvdDtuZXcmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvTmV3UGx1Z2luV2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdQbHVnaW5XaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1NjI2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9OZXdQbHVnaW5XaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0ibmV3UGx1Z2luV2l6YXJkIiBuYW1lPSJOZXcgTWV0aG9kIFBsdWdpbiBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBieSByZXBsYWNpbmcgZXhpc3Rpbmcgd2l6YXJkIHBhZ2VzIG9yIGFkZGluZyBuZXcgb25lcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkRXh0ZW5kZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkRXh0ZW5kZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBleHRlbmRlci4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5JUHVibGlzaENvbmZpZ1dpemFyZEV4dGVuZGVyJmx0Oy9jb2RlJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkUGFnZSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgd2l6YXJkIHBhZ2UuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBleHRlbnNpb24gLSAmcXVvdDtyZXBsYWNlJnF1b3Q7IG9yICZxdW90O25ldyZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdG8gYmUgcmVwbGFjZWQgb3IgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgaW5zZXJ0aW5nIGEgbmV3IHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Imluc2VydCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zZXJ0aW9uIHR5cGUgZm9yIGEgbmV3IHdpemFyZCBwYWdlIC0gJnF1b3Q7YmVmb3JlJnF1b3Q7IG9yICZxdW90O2FmdGVyJnF1b3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdQbHVnaW5XaXphcmQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2l6YXJkCi0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkRXh0ZW5kZXImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZFBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7cmVwbGFjZSZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5NYWluUGFnZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNlbGVjdE9wdGlvbnNQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O25ldyZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdQbHVnaW5NYWluUGFnZSZxdW90OwotICAgICAgICAgICAgICAgaW5zZXJ0PSZxdW90O2FmdGVyJnF1b3Q7LyZndDsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICZsdDsvd2l6YXJkJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2NvbnRlbnRQcm92aWRlckZhY3Rvcmllcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvY29udGVudFByb3ZpZGVyRmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjg2YjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvY29udGVudFByb3ZpZGVyRmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9ImNvbnRlbnRQcm92aWRlckZhY3RvcmllcyIgbmFtZT0iQ29udGVudCBQcm92aWRlciBGYWN0b3JpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSUNvbnRlbnRQcm92aWRlckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2aWV3IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmViYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0iZGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIiIG5hbWU9IkVkaXRvciBEZXNjcmlwdGlvbiBQYWdlIENvbHVtbiBQcm92aWRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBlbmFibGVzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBtb3JlIGNvbHVtbnMgaW4gZGVzY3JpcHRpb24gcGFnZXMgb2YgdGhlIGF1dGhvcmluZyBlZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbHVtbiIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb2x1bW4iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3aWR0aCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJhbGlnbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSUNvbHVtblByb3ZpZGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cHJlJmd0OwotICZsdDtleHRlbnNpb24KLSAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciZxdW90OyZndDsKLSAgJmx0O2NvbHVtbgotICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvblRhYkV4dHJhQ29sdW1uJnF1b3Q7Ci0gICB3aWR0aD0mcXVvdDsyMCZxdW90OwotICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvblRhYkV4dHJhQ29sdW1uJnF1b3Q7Jmd0OwotICAmbHQ7L2NvbHVtbiZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9lZGl0b3JPcGVuZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2VkaXRvck9wZW5lci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2QxOWRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL2VkaXRvck9wZW5lci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiIGlkPSJlZGl0b3JPcGVuZXIiIG5hbWU9IkVkaXRvciBPcGVuZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgZXh0ZW5zaW9uIHRvIGRlZmluZSBlZGl0b3Igb3BlbmVkLiBUaGUgb3BlbmVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBJRCB0aGF0IG1hdGNoZXMgd2l0aCB0aGUgTWV0aG9kRWxlbWVudFByb3BlcnR5IG5hbWUuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IkVkaXRvck9wZW5lciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJFZGl0b3JPcGVuZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS9tZXRob2RSaWNoVGV4dC5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk0MTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9Im1ldGhvZFJpY2hUZXh0IiBuYW1lPSJNZXRob2QgUmljaCBUZXh0IEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIGRlZmluZSB3aGljaCBjbGFzcyBpcyB1c2VkIGZvciBhIE1ldGhvZCBSaWNoIFRleHQgd2lkZ2V0LiAgVGhlIGNsYXNzIG11c3QgaW1wbGVtZW50IElNZXRob2RSaWNoVGV4dC4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWV0aG9kUmljaFRleHQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWV0aG9kUmljaFRleHQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dCIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVmVyc2lvbiBtdXN0IGJlIGFuIGludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMi4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHRFZGl0b3IuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL21ldGhvZFJpY2hUZXh0RWRpdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZjYwZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zY2hlbWEvbWV0aG9kUmljaFRleHRFZGl0b3IuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIiBpZD0ibWV0aG9kUmljaFRleHRFZGl0b3IiIG5hbWU9Ik1ldGhvZCBSaWNoIFRleHQgRWRpdG9yIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBwbHVnLWluIHRvIGRlZmluZSB3aGljaCBjbGFzcyBpcyB1c2VkIGZvciBhIE1ldGhvZCBSaWNoIFRleHQgRWRpdG9yIHdpZGdldC4gIFRoZSBjbGFzcyBtdXN0IGltcGxlbWVudCBJTWV0aG9kUmljaFRleHRFZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1ldGhvZFJpY2hUZXh0RWRpdG9yIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1ldGhvZFJpY2hUZXh0RWRpdG9yIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3IiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFZlcnNpb24gbXVzdCBiZSBhbiBpbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDIuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc2NoZW1hL3dpemFyZFJlZ2lzdHJ5UHJvdmlkZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJlNjhlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NjaGVtYS93aXphcmRSZWdpc3RyeVByb3ZpZGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSIgaWQ9IndpemFyZFJlZ2lzdHJ5UHJvdmlkZXIiIG5hbWU9IldpemFyZCBSZWdpc3RlcnkgUHJvdmlkZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUmVnaXN0cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFJlZ2lzdHJ5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuSVdpemFyZFJlZ2lzdHJ5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGMyZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlQm91bmRzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VCb3VuZHNDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5vZGUgbm9kZTsKLQotCXByaXZhdGUgUG9pbnQgbmV3TG9jYXRpb24sIG9sZExvY2F0aW9uOwotCi0JcHJpdmF0ZSBpbnQgbmV3V2lkdGgsIG9sZFdpZHRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZUJvdW5kc0NvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENoYW5nZUJvdW5kc0NvbW1hbmQoTm9kZSBub2RlLCBQb2ludCBuZXdMb2NhdGlvbiwgaW50IG5ld1dpZHRoKSB7Ci0JCXN1cGVyKENoYW5nZUJvdW5kc0NvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld1dpZHRoID0gbmV3V2lkdGg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG5vZGUgIT0gbnVsbAotCQkJCSYmIG5ld0xvY2F0aW9uICE9IG51bGwKLQkJCQkmJiAobmV3V2lkdGggIT0gb2xkV2lkdGggfHwgIShub2RlLmdldExvY2F0aW9uKCkKLQkJCQkJCS5lcXVhbHMobmV3TG9jYXRpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkTG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCW9sZFdpZHRoID0gbm9kZS5nZXRXaWR0aCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0V2lkdGgobmV3V2lkdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0JCXRoaXMubm9kZSA9IG5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmV3TG9jYXRpb24oUG9pbnQgbG9jKSB7Ci0JCW5ld0xvY2F0aW9uID0gbG9jOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vZGUuc2V0V2lkdGgob2xkV2lkdGgpOwotCQlub2RlLnNldExvY2F0aW9uKG9sZExvY2F0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VIZWlnaHRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VIZWlnaHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDQ5NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlSGVpZ2h0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQ29tbWFuZCB0byBoYW5kbGUgTm9kZSdzIGhlaWdodCBjaGFuZ2VzLgotICogQ2hhbmdlQm91bmRzQ29tbWFuZCBoYW5kbGVzIE5vZGUncyB3aWR0aCBjaGFuZ2VzLiAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUhlaWdodENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBub2RlOwotCi0JcHJpdmF0ZSBQb2ludCBuZXdMb2NhdGlvbiwgb2xkTG9jYXRpb247Ci0KLQlwcml2YXRlIGludCBuZXdIZWlnaHQsIG9sZEhlaWdodDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJDaGFuZ2UgSGVpZ2h0IENvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ2hhbmdlSGVpZ2h0Q29tbWFuZChOb2RlIG5vZGUsIFBvaW50IG5ld0xvY2F0aW9uLCBpbnQgbmV3SGVpZ2h0KSB7Ci0JCXN1cGVyKENoYW5nZUhlaWdodENvbW1hbmQuTEFCRUwpOwotCQlzZXROb2RlKG5vZGUpOwotCQlzZXROZXdMb2NhdGlvbihuZXdMb2NhdGlvbi5nZXRDb3B5KCkpOwotCQl0aGlzLm5ld0hlaWdodCA9IG5ld0hlaWdodDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gbm9kZSAhPSBudWxsCi0JCQkJJiYgbmV3TG9jYXRpb24gIT0gbnVsbAotCQkJCSYmIChuZXdIZWlnaHQgIT0gb2xkSGVpZ2h0IHx8ICEobm9kZS5nZXRMb2NhdGlvbigpCi0JCQkJCQkuZXF1YWxzKG5ld0xvY2F0aW9uKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW9sZExvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQlvbGRIZWlnaHQgPSBub2RlLmdldEhlaWdodCgpOwotCQlyZWRvKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJbm9kZS5zZXRMb2NhdGlvbihuZXdMb2NhdGlvbik7Ci0JCW5vZGUuc2V0SGVpZ2h0KG5ld0hlaWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXdMb2NhdGlvbihQb2ludCBsb2MpIHsKLQkJbmV3TG9jYXRpb24gPSBsb2M7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJbm9kZS5zZXRIZWlnaHQob2xkSGVpZ2h0KTsKLQkJbm9kZS5zZXRMb2NhdGlvbihvbGRMb2NhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlTmFtZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZU5hbWVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTU2ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ2hhbmdlTmFtZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENoYW5nZU5hbWVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE5hbWVkTm9kZSBlbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgbmV3TmFtZSwgb2xkTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19NRVNTQUdFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2NoYW5nZU5hbWVDb21tYW5kX3VuZG9NZXNzYWdlOwotCi0JcHVibGljIENoYW5nZU5hbWVDb21tYW5kKE5hbWVkTm9kZSBlbGVtLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCWVsZW1lbnQgPSBlbGVtOwotCQlvbGROYW1lID0gZWxlbS5nZXROYW1lKCk7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWUudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghU3RyVXRpbC5pc0JsYW5rKG9sZE5hbWUpKSB7Ci0JCQllbGVtZW50LnNldE5hbWUob2xkTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFByb21wdEVkaXQobnVsbCwgVU5ET19NRVNTQUdFKSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIG1zZzsKLQotCQlQcm9tcHRFZGl0KE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy53YXJuaW5nRGlhbG9nX3RpdGxlOwotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDU0ZDE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTm9kZSBlbGVtZW50OwotCi0JcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWUsIG9sZE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kKE5vZGVFZGl0UGFydCBlbGVtLCBTdHJpbmcgbmV3TmFtZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXBhcnQgPSBlbGVtOwotCQllbGVtZW50ID0gKE5vZGUpIGVsZW0uZ2V0TW9kZWwoKTsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGVsZW1lbnQuZ2V0R3JhcGhOb2RlKCk7Ci0JCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRQcm9wZXJ0eSgpOwotCQlvbGROYW1lID0gKChQcm9wZXJ0eSkgbGlzdC5nZXQoMCkpLmdldFZhbHVlKCk7Ci0JCXRoaXMubmV3TmFtZSA9IG5ld05hbWUudHJpbSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJKChQcm9wZXJ0eSkgZWxlbWVudC5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpLmdldCgwKSkKLQkJCQkuc2V0VmFsdWUobmV3TmFtZSk7Ci0JCXBhcnQucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCSgoUHJvcGVydHkpIGVsZW1lbnQuZ2V0R3JhcGhOb2RlKCkuZ2V0UHJvcGVydHkoKS5nZXQoMCkpCi0JCQkJLnNldFZhbHVlKG9sZE5hbWUpOwotCQlwYXJ0LnJlZnJlc2goKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVCZW5kcG9pbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGMzMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlQmVuZHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlQmVuZHBvaW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIEFic29sdXRlQmVuZHBvaW50IHBvaW50OwotCi0JcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kKExpbmsgbGluaywgUG9pbnQgbG9jYXRpb24sIGludCBpbmRleCkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXBvaW50ID0gbmV3IEFic29sdXRlQmVuZHBvaW50KGxvY2F0aW9uKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBsaW5rICE9IG51bGwgJiYgcG9pbnQgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoaW5kZXgsIHBvaW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUxpbmtDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVMaW5rQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU0ZDAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0NyZWF0ZUxpbmtDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVmFsaWRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTGlua0NvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBOb2RlIHNvdXJjZSwgdGFyZ2V0OwotCi0JcHJpdmF0ZSBQb2ludCB0YXJnZXRFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfY3JlYXRlTGlua0NvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIENyZWF0ZUxpbmtDb21tYW5kKExpbmsgbmV3T2JqLCBOb2RlIHNyYykgewotCQlzdXBlcihMQUJFTCk7Ci0JCWxpbmsgPSBuZXdPYmo7Ci0JCXNvdXJjZSA9IHNyYzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsICYmIGxpbmsgIT0gbnVsbDsKLQkJaWYgKCFyZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCVN0cmluZyBtc2cgPSBWYWxpZGF0aW9uLmNoZWNrQ29ubmVjdChzb3VyY2UsIHRhcmdldCwgbGluayk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0KSB7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChzb3VyY2UuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCS0xMCwgMTApKSk7Ci0JCQlsaW5rLmdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChzb3VyY2UuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKAotCQkJCQkJCS0xMCwgLTEwKSkpOwotCQkJbGluay5nZXRCZW5kcG9pbnRzKCkuYWRkKAotCQkJCQluZXcgQWJzb2x1dGVCZW5kcG9pbnQoc291cmNlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkxMCwgLTEwKSkpOwotCQl9Ci0KLQkJbGluay5zZXRUYXJnZXRFbmRQb2ludCh0YXJnZXRFbmRQb2ludCk7Ci0JCWxpbmsuc2V0U291cmNlRW5kUG9pbnQoc291cmNlRW5kUG9pbnQpOwotCQlsaW5rLnNldFNvdXJjZShzb3VyY2UpOwotCQlsaW5rLnNldFRhcmdldCh0YXJnZXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb2RlIHRhcmdldCkgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFbmRQb2ludChQb2ludCBwKSB7Ci0JCXRhcmdldEVuZFBvaW50ID0gcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFbmRQb2ludChQb2ludCBwKSB7Ci0JCXNvdXJjZUVuZFBvaW50ID0gcDsKLQl9Ci0KLQlwdWJsaWMgUG9pbnQgZ2V0VGFyZ2V0RW5kUG9pbnQoKSB7Ci0JCXJldHVybiB0YXJnZXRFbmRQb2ludDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNvdXJjZUVuZFBvaW50LgotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTb3VyY2VFbmRQb2ludCgpIHsKLQkJcmV0dXJuIHNvdXJjZUVuZFBvaW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWxpbmsuc2V0U291cmNlRW5kUG9pbnQobnVsbCk7Ci0JCWxpbmsuc2V0VGFyZ2V0RW5kUG9pbnQobnVsbCk7Ci0JCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJaWYgKHNvdXJjZSA9PSB0YXJnZXQpIHsKLQkJCWxpbmsuZ2V0QmVuZHBvaW50cygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvQ3JlYXRlTm9kZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwNzc4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9DcmVhdGVOb2RlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVOb2RlQ29tbWFuZCBleHRlbmRzIERpYWdyYW1Nb2RpZnlDb21tYW5kIHsKLQotCXByaXZhdGUgUG9pbnQgbG9jOwotCi0JcHJpdmF0ZSBOb2RlIG5vZGU7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9jcmVhdGVOb2RlQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgQ3JlYXRlTm9kZUNvbW1hbmQoTm9kZSBuZXdPYmplY3QsIERpYWdyYW0gcGFyZW50LCBQb2ludCBsb2NhdGlvbikgewotCQlzdXBlcihMQUJFTCk7Ci0JCW5vZGUgPSBuZXdPYmplY3Q7Ci0JCWRpYWdyYW0gPSBwYXJlbnQ7Ci0JCWxvYyA9IGxvY2F0aW9uLmdldENvcHkoKTsKLQkJc2V0RGlhZ3JhbShwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vZGUuc2V0TG9jYXRpb24obnVsbCk7Ci0JCW5vZGUuc2V0RGlhZ3JhbShudWxsKTsKLQkJZGlhZ3JhbS5nZXROb2RlcygpLnJlbW92ZShub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRpYWdyYW1Nb2RpZnlDb21tYW5kI2RvRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQlub2RlLnNldExvY2F0aW9uKGxvYyk7Ci0JCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCWRpYWdyYW0uc2V0RGVmYXVsdE5hbWUoKE5hbWVkTm9kZSkgbm9kZSk7Ci0JCX0KLQkJZGlhZ3JhbS5nZXROb2RlcygpLmFkZChub2RlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoZGlhZ3JhbSBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCWlmIChkaWFncmFtLmlzUmVhZE9ubHkoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL0RlbGV0ZUJlbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwMTYzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVCZW5kcG9pbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUJlbmRwb2ludENvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgTGluayBsaW5rOwotCi0JcHJpdmF0ZSBBYnNvbHV0ZUJlbmRwb2ludCBiZW5kcG9pbnQ7Ci0KLQlwcml2YXRlIGludCBpbmRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBEZWxldGVCZW5kcG9pbnRDb21tYW5kKExpbmsgbGluaywgaW50IGluZGV4KSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQliZW5kcG9pbnQgPSBsaW5rLmdldEJlbmRwb2ludHMoKS5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBpbmRleCA+PSAwICYmIGJlbmRwb2ludCAhPSBudWxsICYmIGxpbmsgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlsaW5rLmdldEJlbmRwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLmFkZChpbmRleCwgYmVuZHBvaW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzMzY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBDb21tYW5kIGRlbGVnYXRlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BFUk1fREVMRVRFID0gImdlZi5lZGlhZ3JhbS4kcGVybSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWxldGVDb21tYW5kKGJvb2xlYW4gaGFyZERlbGV0ZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUuY2FuRXhlY3V0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWRlbGVnYXRlLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBzZXRQYXJ0VG9CZURlbGV0ZWQoT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIE5vZGUpCi0JCQlkZWxlZ2F0ZSA9IG5ldyBEZWxldGVOb2RlQ29tbWFuZChtb2RlbCk7Ci0JCWVsc2UKLQkJCWRlbGVnYXRlID0gbnVsbDsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJZGVsZWdhdGUudW5kbygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotCi0JCXByb3RlY3RlZCBNYXAgb3V0Z29pbmdDb25uZWN0aW9uc1RvVGFyZ2V0OwotCi0JCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCi0JCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0KLQkJcHVibGljIERlbGV0ZU5vZGVDb21tYW5kKE9iamVjdCBub2RlKSB7Ci0JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLQkJCWNvbnRhaW5lciA9IChOb2RlQ29udGFpbmVyKSB0aGlzLm5vZGUuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLQkJCS8vIFRoZXJlJ3MgYWx3YXlzIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoaXMgbm9kZSBoYXMgYWxyZWFkeSBiZWVuCi0JCQkvLyBkZWxldGVkIGJ5IHRoZSB0aW1lIHRoaXMgY29tbWFuZCBpcyBleGVjdXRlZCAoZWcuLCB3aGVuIHRoZQotCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotCQkJLy8gdG8gc2VlIGlmIHRoZSBub2RlIGV4aXN0cyBpbiB0aGUgZGlhZ3JhbS4gSWYgbm90LCBkbyBub3RoaW5nLgotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJCXJldHVybjsKLQkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UucHV0KGxpbmssIGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJfQotCQkJLy8gQ29tbWVudGluZyBiZWxvdyB0d28gbGluZXMsIExpbmtzIGdldCByZW1vdmVkIGZyb20gdGhlIG1vZGVsCi0JCQkvLyB3aGVuIGxpbmsuc2V0VGFyZ2V0KG51bGwpIG9yIGxpbmsuc2V0U291cmNlKG51bGwpIGlzIGRvbmUuICBGb3IgCi0JCQkvLyBOb2RlIGlmIHdlIGNsZWFyIGluY29taW5nL291dGdvaW5nIGNvbm5lY3Rpb25zLCBVbmRvIGNvbW1hbmQgd2lsbCBub3Qgd29yay4KLQkJCQotCQkJLy9ub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJLy9ub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJcmV0dXJuOwotCQkJY29udGFpbmVyLmdldE5vZGVzKCkuYWRkKGluZGV4LCBub2RlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldC5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KChOb2RlKSBvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQuZ2V0KGxpbmspKTsKLQkJCQlsaW5rLnNldFNvdXJjZShub2RlKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZS5rZXlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCWxpbmsuc2V0VGFyZ2V0KG5vZGUpOwotCQkJCWxpbmsuc2V0U291cmNlKChOb2RlKSBpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UuZ2V0KGxpbmspKTsKLQkJCX0KLQkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG51bGw7Ci0JCQlpbmNvbWluZ0Nvbm5lY3Rpb25zVG9Tb3VyY2UgPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JfQotCS8qCi0JICogTm90IGluIHVzZS4gTmVlZCBtb2RpZmljYXRpb24gZm9yIGZ1dHVyZSBmZWF0dXJlIGltcGxlbWVudGF0aW9ucy4gCi0JICogQ29tcG91bmQgQ29tbWFuZCBkZWxldGlvbiBkbyB0aGUgcmVjdXJzaXZlIGRlbGV0aW9uIGFuZCB1bmRvLiAKLQkgKi8KLS8vCXByaXZhdGUgc3RhdGljIGNsYXNzIERlbGV0ZU5vZGVDb21wb3VuZENvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgewotLy8JCXByb3RlY3RlZCBNYXAgaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlOwotLy8KLS8vCQlwcm90ZWN0ZWQgTWFwIG91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldDsKLS8vCi0vLwkJcHJvdGVjdGVkIE5vZGVDb250YWluZXIgY29udGFpbmVyOwotLy8KLS8vCQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotLy8KLS8vCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotLy8KLS8vCQlwdWJsaWMgRGVsZXRlTm9kZUNvbXBvdW5kQ29tbWFuZChPYmplY3Qgbm9kZSkgewotLy8JCQl0aGlzLm5vZGUgPSAoTm9kZSkgbm9kZTsKLS8vCQkJY29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIHRoaXMubm9kZS5lQ29udGFpbmVyKCk7Ci0vLwkJCWluY29taW5nQ29ubmVjdGlvbnNUb1NvdXJjZSA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCW91dGdvaW5nQ29ubmVjdGlvbnNUb1RhcmdldCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMubm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0vLwkJCQlvdXRnb2luZ0Nvbm5lY3Rpb25zVG9UYXJnZXQucHV0KGxpbmssIGxpbmsuZ2V0VGFyZ2V0KCkpOwotLy8JCQkJYWRkKG5ldyBEZWxldGVMaW5rQ29tbWFuZCggbGluaywgZmFsc2UpKTsKLS8vCQkJfQotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLm5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotLy8JCQkJaW5jb21pbmdDb25uZWN0aW9uc1RvU291cmNlLnB1dChsaW5rLCBsaW5rLmdldFNvdXJjZSgpKTsKLS8vCQkJCWFkZChuZXcgRGVsZXRlTGlua0NvbW1hbmQoIGxpbmssIGZhbHNlKSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0vLwkJCWluZGV4ID0gY29udGFpbmVyLmdldE5vZGVzKCkuaW5kZXhPZihub2RlKTsKLS8vCQkJLy8gVGhlcmUncyBhbHdheXMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhpcyBub2RlIGhhcyBhbHJlYWR5IGJlZW4KLS8vCQkJLy8gZGVsZXRlZCBieSB0aGUgdGltZSB0aGlzIGNvbW1hbmQgaXMgZXhlY3V0ZWQgKGVnLiwgd2hlbiB0aGUKLS8vCQkJLy8gcGFja2FnZSBjb250YWluaW5nIHRoaXMgY2xhc3MgaXMgYWxzbyBzZWxlY3RlZCkuIEhlbmNlLCB3ZSBjaGVjawotLy8JCQkvLyB0byBzZWUgaWYgdGhlIG5vZGUgZXhpc3RzIGluIHRoZSBkaWFncmFtLiBJZiBub3QsIGRvIG5vdGhpbmcuCi0vLwkJCWlmIChpbmRleCA9PSAtMSkKLS8vCQkJCXJldHVybjsKLS8vCi0vLwkJCXN1cGVyLmV4ZWN1dGUoKTsKLS8vCQkJY29udGFpbmVyLmdldE5vZGVzKCkucmVtb3ZlKGluZGV4KTsKLS8vCQkJCi0vLwkJfQotLy8KLS8vCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotLy8JCQlpZiAoaW5kZXggPT0gLTEpCi0vLwkJCQlyZXR1cm47Ci0vLwkJCWNvbnRhaW5lci5nZXROb2RlcygpLmFkZChpbmRleCwgbm9kZSk7Ci0vLwkJCXN1cGVyLnVuZG8oKTsKLS8vCQl9Ci0vLwotLy8JCS8qKgotLy8JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjY2FuRXhlY3V0ZSgpCi0vLwkJICovCi0vLwkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLS8vCQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobm9kZSkgIT0gbnVsbCkKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLS8vCQl9Ci0vLwl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVMaW5rQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGVsZXRlTGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwY2ZmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EZWxldGVMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZUxpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIExpbmsgbGluazsKLQotCXByaXZhdGUgTm9kZSBzcmMsIHRhcmdldDsKLQotCXByaXZhdGUgaW50IHNyY0luZGV4LCB0YXJnZXRJbmRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbDsgCi0KLQlwdWJsaWMgRGVsZXRlTGlua0NvbW1hbmQoTGluayBsaW5rLCBib29sZWFuIGlzSGFyZERlbGV0ZSkgewotCQlzdXBlcihMQUJFTCk7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXNyYyA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCXRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJaWYgKFZhbGlkYXRpb24uY2hlY2tEZWxldGUobGluaykgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGxpbmsgIT0gbnVsbCAmJiBzcmMgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgc2hvdWxkIHdvcmsgZXZlbiBpZiB0aGUgbGluayAodmlldykgd2FzIGRlbGV0ZWQuIEVnLiwgdXNlciBzZWxlY3RzIGEKLQkgKiBjbGFzcyBhbmQgb25lIG9mIGl0cyByZWZlcmVuY2VzLCBhbmQgaGl0cyBDdHJsK0RlbC4gVGhlIGNsYXNzIHdpbGwgYmUKLQkgKiBkZWxldGVkIGZpcnN0IGFuZCBpdCB3aWxsIGRlbGV0ZSBhbGwgaXRzIHJlZmVyZW5jZXMuIFdoZW4gdGhpcyBjb21tYW5kIGlzCi0JICogZXhlY3V0ZWQsIGl0IHNob3VsZCBkbyB0aGUgaGFyZC1kZWxldGUgcGFydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlzcmNJbmRleCA9IHNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaW5kZXhPZihsaW5rKTsKLQkJdGFyZ2V0SW5kZXggPSB0YXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmluZGV4T2YobGluayk7Ci0JCWlmIChzcmNJbmRleCAhPSAtMSAmJiB0YXJnZXRJbmRleCAhPSAtMSkgewotCQkJc3JjLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5yZW1vdmUoc3JjSW5kZXgpOwotCQkJdGFyZ2V0LmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5yZW1vdmUodGFyZ2V0SW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHNyY0luZGV4ICE9IC0xICYmIHRhcmdldEluZGV4ICE9IC0xKSB7Ci0JCQlzcmMuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLmFkZChzcmNJbmRleCwgbGluayk7Ci0JCQl0YXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmFkZCh0YXJnZXRJbmRleCwgbGluayk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvRGlhZ3JhbU1vZGlmeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmMTZiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9EaWFncmFtTW9kaWZ5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbU1vZGlmeUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgRU9iamVjdCBvYmplY3Q7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuVW5kbyA9IHRydWU7Ci0KLQlwdWJsaWMgRGlhZ3JhbU1vZGlmeUNvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQlPYmplY3Qgb2JqID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCW9iamVjdCA9IChFT2JqZWN0KSBvYmo7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlRXhlY3V0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkob2JqZWN0LCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmNvbW1hbmRfY2Fubm90RWRpdCwgCi0JCQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKHByZXBhcmVFeGVjdXRlKCkpIHsKLQkJCWRvRXhlY3V0ZSgpOwotCQkJY2FuVW5kbyA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQljYW5VbmRvID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kI2NhblVuZG8oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBjYW5VbmRvOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvRXhlY3V0ZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvTW92ZUJlbmRwb2ludENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiNzVjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9Nb3ZlQmVuZHBvaW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotLyoqCi0gKiBCZW5kcG9pbnQgbWFuaXB1bGF0aW9uIGNvbW1hbmRzIGNhbm5vdCBiZSBjaGFpbmVkIG9yIGNvbXBvdW5kZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlQmVuZHBvaW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIGludCBpbmRleDsKLQotCXByaXZhdGUgQWJzb2x1dGVCZW5kcG9pbnQgb2xkQmVuZHBvaW50OwotCi0JQWJzb2x1dGVCZW5kcG9pbnQgbmV3QmVuZHBvaW50OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VmX21vdmVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOyAKLQotCXB1YmxpYyBNb3ZlQmVuZHBvaW50Q29tbWFuZChMaW5rIGxpbmssIFBvaW50IGxvY2F0aW9uLCBpbnQgaW5kZXgpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQl0aGlzLmxpbmsgPSBsaW5rOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCW5ld0JlbmRwb2ludCA9IG5ldyBBYnNvbHV0ZUJlbmRwb2ludChsb2NhdGlvbik7Ci0JCW9sZEJlbmRwb2ludCA9IGxpbmsuZ2V0QmVuZHBvaW50cygpLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIGxpbmsgIT0gbnVsbCAmJiBpbmRleCA+PSAwICYmIG5ld0JlbmRwb2ludCAhPSBudWxsCi0JCQkJJiYgb2xkQmVuZHBvaW50ICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJbGluay5nZXRCZW5kcG9pbnRzKCkuc2V0KGluZGV4LCBuZXdCZW5kcG9pbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWxpbmsuZ2V0QmVuZHBvaW50cygpLnNldChpbmRleCwgb2xkQmVuZHBvaW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVjb25uZWN0TGlua0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5MzI5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWNvbm5lY3RMaW5rQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JcHJpdmF0ZSBib29sZWFuIGlzU291cmNlOwotCi0JcHJpdmF0ZSBMaW5rIGxpbms7Ci0KLQlwcml2YXRlIE5vZGUgbmV3Tm9kZSwgb2xkTm9kZTsKLQotCXByaXZhdGUgaW50IHZpZXdJbmRleDsKLQotCXByaXZhdGUgUG9pbnQgZW5kUG9pbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfcmVjb25uZWN0TGlua0NvbW1hbmRfbGFiZWw7IAotCi0JcHVibGljIFJlY29ubmVjdExpbmtDb21tYW5kKExpbmsgbGluaywgTm9kZSBuZXdOb2RlLCBib29sZWFuIGlzU291cmNlKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5saW5rID0gbGluazsKLQkJdGhpcy5uZXdOb2RlID0gbmV3Tm9kZTsKLQkJdGhpcy5pc1NvdXJjZSA9IGlzU291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuZFBvaW50KFBvaW50IHApIHsKLQkJZW5kUG9pbnQgPSBwLmdldENvcHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlib29sZWFuIHJlc3VsdCA9IGxpbmsgIT0gbnVsbCAmJiBuZXdOb2RlICE9IG51bGw7Ci0JCWlmICghcmVzdWx0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGlzU291cmNlKSB7Ci0JCQlyZXR1cm4gVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdChuZXdOb2RlLCBsaW5rLmdldFRhcmdldCgpLCBsaW5rKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFZhbGlkYXRpb24uY2hlY2tSZWNvbm5lY3QobGluay5nZXRTb3VyY2UoKSwgbmV3Tm9kZSwgbGluaykgPT0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gTGluawotCQlpZiAoaXNTb3VyY2UpIHsKLQkJCW9sZE5vZGUgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgeyAvLyBzYWZldHkgY2hlY2sgdG8gaGFuZGxlIGRhbmdsaW5nIGxpbmsKLQkJCQl2aWV3SW5kZXggPSBvbGROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQkJfQotCQkJbGluay5zZXRTb3VyY2UobmV3Tm9kZSk7Ci0JCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KGVuZFBvaW50KTsKLQkJfSBlbHNlIHsKLQkJCW9sZE5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgeyAvLyBzYWZldHkgY2hlY2sgdG8gaGFuZGxlIGRhbmdsaW5nIGxpbmsKLQkJCQl2aWV3SW5kZXggPSBvbGROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pbmRleE9mKGxpbmspOwotCQkJfQotCQkJbGluay5zZXRUYXJnZXQobmV3Tm9kZSk7Ci0JCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KGVuZFBvaW50KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGlzU291cmNlKSB7Ci0JCQluZXdOb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5yZW1vdmUobGluayk7Ci0JCQlvbGROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5hZGQodmlld0luZGV4LCBsaW5rKTsKLQkJfSBlbHNlIHsKLQkJCW5ld05vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLmFkZCh2aWV3SW5kZXgsIGxpbmspOwotCQl9Ci0JCW9sZE5vZGUgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvY29tbWFuZHMvUmVmcmVzaERpYWdyYW1Gcm9tQmFzZUFjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM1NjUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL1JlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IERpYWdyYW1VSVJlc291cmNlcy5yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw7IAotCi0JcHVibGljIFJlZnJlc2hEaWFncmFtRnJvbUJhc2VBY3Rpdml0eUNvbW1hbmQoKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2NvbW1hbmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMmQ3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9jb21tYW5kcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tYW5kcyBmb3IgZWRpdGluZyB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUwNDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JaW50IHkgPSA2MDsKLQotCWJvb2xlYW4geGF4aXNiZWdpbiA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgc3BhY2luZyA9IDQwOwotCi0JZmluYWwgc3RhdGljIGludCB5c3BhY2luZyA9IDIwOwotCi0JYm9vbGVhbiBtaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0KLQlpbnQgeCA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUUyA9ICJvdXRwdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRTID0gImlucHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCByZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKiogCi0JICogRWRpdFBhcnQgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoQWN0aXZpdHlEZXRhaWxEaWFncmFtIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSBtZXRob2Qgc3VwZXIucmVzZXRDaGlsZHJlbkxvY2F0aW9ucy4gSW4gdGhpcywgQWxsIHRoZSBUYXNrJ3MKLQkgKiBNYW5kYXRvcnlJbnB1dCB3b3JrcHJvZHVjdHMgcGxhY2VkIG9uIHRvcC4gYW5kIFJvbGVUYXNrIGNvbXBvc2l0ZSBpbiB0aGUKLQkgKiBtaWRkbGUuIGFuZCBUYXNrJ3Mgb3V0cHV0IHdvcmtwcm9kdWN0cyBzb3V0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCQlmaW5hbCBpbnQgeXNwYWNpbmcgPSA0MDsKLQkJTGlzdCByb2xlY29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbWlzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdGFza0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMucmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlOb2RlIG4gPSAoTm9kZSkgKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQlpZiAobi5nZXRMb2NhdGlvbigpID09IG51bGwgfHwgbi5nZXRMb2NhdGlvbigpLnggPT0gLTEpIHsKLQkJCQl0aGlzLnJlY2VudGx5QWRkZWRQYXJ0cy5hZGQoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgewotCQkJCXJvbGVjb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCU5vZGUgb2JqTm9kZSA9IChOb2RlKSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRNb2RlbCgpOwotCQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQl0YXNrTGlzdC5hZGQob2JqTm9kZSk7Ci0JCQkJCQlIYXNoTWFwIHRhc2tNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJTGlzdCBpbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlMaXN0IG91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl0YXNrTWFwLnB1dCgiaW5wdXRzIiwgaW5wdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGFza01hcC5wdXQoIm91dHB1dHMiLCBvdXRwdXRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbWFwLnB1dChvYmpOb2RlLCB0YXNrTWFwKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIG5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHBhcnQKLQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfSBlbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQkJCQkJfQotCQkJCQljYWxjU2l6ZShjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQltaXNjTGlzdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0KLQkJLy8gU2V0IHNpemUgZm9yIHRoZSByb2xlY29tcG9zaXRlLgotCQlpZiAoIXJvbGVjb21wb3NpdGVMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZWNvbXBvc2l0ZUxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgb2JqZWN0KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IxLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0b3IxLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCWlmICgoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpICgoRGVzY3JpcHRvck5vZGVFZGl0UGFydCkgb2JqKQotCQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFzayA9IChUYXNrRGVzY3JpcHRvcikgdGFza05vZGUKLQkJCQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIHdwaXRvciA9IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgd3BpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCB3cEVkaXRQYXJ0ID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHdwaXRvcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwQ29tcG9zaXRlTm9kZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgd3BFZGl0UGFydAotCQkJCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJCQlPYmplY3Qgd3BPYmplY3QgPSB3cENvbXBvc2l0ZU5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmICh3cE9iamVjdC5lcXVhbHModGFzaykpIHsKLQkJCQkJCQkJCWludCB3aWR0aCA9IHdwRWRpdFBhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCQkJCWludCBoZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQkJCQkoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQkJCQkJCQkJCW5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCkpOwotCQkJCQkJCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCQlMaXN0IGlucHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChJTlBVVFMpOwotCQkJCQkJCQkJCWlucHV0TGlzdC5hZGQod3BFZGl0UGFydCk7Ci0JCQkJCQkJCQl9IGVsc2UgaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQkJCQkJTGlzdCBvdXRwdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KE9VVFBVVFMpOwotCQkJCQkJCQkJCW91dHB1dExpc3QuYWRkKHdwRWRpdFBhcnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFyb2xlY29tcG9zaXRlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm9sZWNvbXBvc2l0ZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcUlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGNvbmZpcm1lZFNlcU91dHB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSByb2xlY29tcG9zaXRlTGlzdAotCQkJCQkJLmdldChpKSkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJRGVzY3JpcHRvck5vZGVFZGl0UGFydCB0YXNrID0gKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIGxpc3QKLQkJCQkJCQkuZ2V0KGopOwotCQkJCQlpZiAodGFzay5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVGFza05vZGUpIHsKLQkJCQkJCVRhc2tOb2RlIHRhc2tub2RlID0gKFRhc2tOb2RlKSB0YXNrLmdldE1vZGVsKCk7Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCS5zaXplKCk7IGsrKykgewotCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9ICgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5nZXQoaykpLmdldE1vZGVsKCkpOwotCQkJCQkJCWlmICh3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKHRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQlpZiAod3Bjb21wLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcUlucHV0TGlzdAotCQkJCQkJCQkJCQkuYWRkKGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJLmdldChrKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmb3IgKGludCBrID0gMDsgayA8IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGNvbXAgPSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQkJaWYgKHdwY29tcC5nZXRPYmplY3QoKS5lcXVhbHModGFza25vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJCQkJCWlmICh3cGNvbXAuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCQkJCWNvbmZpcm1lZFNlcU91dHB1dExpc3QKLQkJCQkJCQkJCQkJLmFkZChvdXRwdXRXb3JrUHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCQkJCQkuZ2V0KGspKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWNvbmZpcm1lZFNlcUlucHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFJbnB1dExpc3QpOwotCQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCX0KLQkJCQlMaXN0IHJvbGVDID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJvbGVDLmFkZChyb2xlY29tcG9zaXRlTGlzdC5nZXQoaSkpOwotCQkJCXNldE9iamVjdHNMb2NhdGlvbnMocm9sZUMpOwotCi0JCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQlpZiAoIWNvbmZpcm1lZFNlcU91dHB1dExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXNldE9iamVjdHNMb2NhdGlvbnMoY29uZmlybWVkU2VxT3V0cHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlpZiAoIW1pc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcmludCBTaXplIG9mIG1pc2M6ICIgKyBtaXNjTGlzdC5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoIWxvYWRpbmcpIHsKLQkJCQltaXNjZWxsYW5lb3VzID0gdHJ1ZTsKLQkJCX0KLQkJCXNldE9iamVjdHNMb2NhdGlvbnMobWlzY0xpc3QpOwotCQkJbWlzY2VsbGFuZW91cyA9IGZhbHNlOwotCQl9Ci0KLQkJbG9hZGluZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjU2l6ZShPYmplY3QgY2hpbGQpIHsKLQkJTGlzdCBsaXN0ID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCWludCBsYXJnZXN0V2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdEhlaWdodCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlOb2RlIG9iak5vZGUgPSAoTm9kZSkgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCWlmIChvYmpOb2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJCWludCBub2RlV2lkdGggPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJaW50IG5vZGVIZWlnaHQgPSAoKERlc2NyaXB0b3JOb2RlRWRpdFBhcnQpIG9iaikuZ2V0RmlndXJlKCkKLQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCWlmIChub2RlV2lkdGggPiBsYXJnZXN0V2lkdGgpCi0JCQkJCWxhcmdlc3RXaWR0aCA9IG5vZGVXaWR0aDsKLQkJCQlpZiAobm9kZUhlaWdodCA+IGxhcmdlc3RIZWlnaHQpCi0JCQkJCWxhcmdlc3RIZWlnaHQgPSBub2RlSGVpZ2h0OwotCQkJfQotCQl9Ci0JCSgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihsYXJnZXN0V2lkdGggKiAyICsgMTAsIDIwICsgbGFyZ2VzdEhlaWdodAotCQkJCQkJKiAobGlzdC5zaXplKCkgLyAyICsgMSkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0c0xvY2F0aW9ucyhMaXN0IGxpc3QpIHsKLQotCQl4YXhpc2JlZ2luID0gdHJ1ZTsKLQkJeCA9IDEwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCWlmIChwID09IG51bGwgfHwgcC54ID09IC0xKSB7Ci0JCQkJCQlpbnQgdmlld2VyV2lkdGggPSBwYXJ0LmdldFJvb3QoKS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQkJaWYgKCF4YXhpc2JlZ2luKSB7Ci0JCQkJCQkJeCA9IGNhY2hlZFBvaW50LnggKyBjYWNoZWRXaWR0aCArIHNwYWNpbmc7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBjaGVjayBpZiBwIGlzIG51bGwsIGNyZWF0ZSBQb2ludC4KLQkJCQkJCWlmIChwID09IG51bGwpCi0JCQkJCQkJcCA9IG5ldyBQb2ludCgpOwotCi0JCQkJCQlpZiAoIWxvYWRpbmcgJiYgbWlzY2VsbGFuZW91cykgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0gMTA7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXAueCA9IHg7Ci0JCQkJCQkJcC55ID0geTsKLQkJCQkJCX0KLQkJCQkJCW5vZGUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJCQlpZiAoIW1pc2NlbGxhbmVvdXMpCi0JCQkJCQkJY2FjaGVkUG9pbnQgPSBwOwotCQkJCQkJY2FjaGVkV2lkdGggPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJCWlmIChwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQgPiBjYWNoZWRIZWlnaHQpCi0JCQkJCQkJY2FjaGVkSGVpZ2h0ID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJeGF4aXNiZWdpbiA9IGZhbHNlOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlBvaW50IDogIiArIG5ldyBQb2ludCh4LCB5KS50b1N0cmluZygpICsgIkFuZCB3aWR0aD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkrIGNhY2hlZFdpZHRoCi0JCQkJCQkJCQkJCSsgIiwgSGVpZ2h0PSIgKyBjYWNoZWRIZWlnaHQgKyAiLCBXaWR0aCBvZiBWaWV3ZXI6ICIgKyB2aWV3ZXJXaWR0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyByZWNlbnRseSBhZGRkZWQgZWRpdHBhcnRzLiBVc3VhbGx5IGNhbGxlZCAKLQkgKiBieSBkaWFncmFtIHNlcnZpY2VzIHRvIGRvIGF1dG9sYXlvdXQgYWRqdXN0bWVudC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWNlbnRseUFkZGVkUGFydHMoKSB7Ci0JCXJldHVybiByZWNlbnRseUFkZGVkUGFydHM7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIHJlY2VudGx5IGFkZGVkIGVkaXRwYXJ0cyBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyUmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZWNlbnRseUFkZGVkUGFydHMuY2xlYXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQ2ZjU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSdzIEVkaXRQYXJ0LiBDcmVhdGVzIGFuIEVkaXRQYXJ0IGZvcgotICogQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0ncyBjaGlsZHJlbi4gIAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3RvcnkgaW1wbGVtZW50cyBFZGl0UGFydEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBFZGl0UGFydCBmb3IgYSBjaGlsZCB3aXRoIGluIHRoZSBjb250ZXh0LgotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KAotCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KChSb2xlVGFza0NvbXBvc2l0ZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCgKLQkJCQkJKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBSb2xlTm9kZSB8fCBtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlCi0JCQkJfHwgbW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JOb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCVR5cGVkTm9kZSBub2RlID0gKFR5cGVkTm9kZSkgbW9kZWw7Ci0JCQlzd2l0Y2ggKG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQljYXNlIFR5cGVkTm9kZS5TVEFSVDoKLQkJCQlyZXR1cm4gbmV3IFN0YXJ0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRU5EOgotCQkJCXJldHVybiBuZXcgRW5kTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuREVDSVNJT046Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLlNZTkNIX0JBUjoKLQkJCQlyZXR1cm4gbmV3IFN5bmNoQmFyTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuRlJFRV9URVhUOgotCQkJCXJldHVybiBuZXcgRnJlZVRleHROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0FjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzlmOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgQWN0aXZpdHlEaWFncmFtLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBlZGl0cGFydCBmb3IgQWN0aXZpdHkgRGlhZ3JhbS4gCi0JICogCi0JICogQHBhcmFtIG1vZGVsIHtAbGluayBBY3Rpdml0eURpYWdyYW19Ci0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KEFjdGl2aXR5RGlhZ3JhbSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYzk3NmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgZWRpdHBhcnQgZm9yIEFjdGl2aXR5RGlhZ3JhbSdzIGNoaWxkcmVuLiAKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3RvcnkjY3JlYXRlRWRpdFBhcnQob3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGlhZ3JhbSkgewotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydCgoQWN0aXZpdHlEaWFncmFtKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlRWRpdFBhcnQoKE5hbWVkTm9kZSkgbW9kZWwpOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJVHlwZWROb2RlIG5vZGUgPSAoVHlwZWROb2RlKSBtb2RlbDsKLQkJCXN3aXRjaCAobm9kZS5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgVHlwZWROb2RlLlNUQVJUOgotCQkJCXJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5FTkQ6Ci0JCQkJcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5ERUNJU0lPTjoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJCXJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQkJcmV0dXJuIG5ldyBGcmVlVGV4dE5vZGVFZGl0UGFydChub2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQmFzZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Jhc2VFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjE5N2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvQmFzZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXMuU2VsZWN0YWJsZUxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci0KLS8qKgotICogUHJvdmlkZXMgaW5mcmFzdHJ1Y3R1cmUgZm9yIGRlbGV0aW9uLCBkaXJlY3QtZWRpdGluZywgcHJvcGVydHkgc291cmNlIGFuZAotICogbW9kZWwtbGlzdGVuaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCB7Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgCi0JICogQHBhcmFtIG9iaiB7QGxpbmsgRU9iamVjdH0KLQkgKi8KLQlwdWJsaWMgQmFzZUVkaXRQYXJ0KEVPYmplY3Qgb2JqKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE1vZGVsKG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCSgoRU9iamVjdCkgZ2V0TW9kZWwoKSkuZUFkYXB0ZXJzKCkuYWRkKG1vZGVsTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKTsKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5TRUxFQ1RJT05fRkVFREJBQ0tfUk9MRSwKLQkJCQluZXcgTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3RhYmxlTGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJKChFT2JqZWN0KSBnZXRNb2RlbCgpKS5lQWRhcHRlcnMoKS5yZW1vdmUobW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RGlyZWN0RWRpdFRleHQoKSB7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWcpLmdldFRleHQoKTsKLQkJfSBlbHNlIGlmIChmaWcgaW5zdGFuY2VvZiBUZXh0RmxvdykgewotCQkJcmV0dXJuICgoVGV4dEZsb3cpIGZpZykuZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKTsKLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXREaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJbWFuYWdlciA9IGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldERpcmVjdEVkaXRNYW5hZ2VyKCk7Ci0KLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5zaG93KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxEaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0Q2VsbEVkaXRvci5jbGFzcywKLQkJCQluZXcgTGFiZWxDZWxsRWRpdG9yTG9jYXRvcihnZXREaXJlY3RFZGl0RmlndXJlKCkpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0JvdHRvbUFuY2hvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Cb3R0b21BbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI3ZjU2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0JvdHRvbUFuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgYm90dG9tIGFuY2hvciBmb3IgYSBmaWd1cmUncyBib3R0b20gbG9jYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIEJvdHRvbUFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlCb3R0b21BbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLmJvdHRvbSgpID4gcmVmZXJlbmNlLnkpCi0JCQlyZXR1cm4gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKG9mZiwgMCk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9DbG9zZXN0QW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYwNGE1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0Nsb3Nlc3RBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic3RyYWN0Q29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgdG8gZmluZCB0aGUgY2xvc2VzdCBsb2NhdGlvbiBpbiBmaWd1cmUKLSAqIGZvciBhbmNob3IuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xvc2VzdEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwdWJsaWMgQ2xvc2VzdEFuY2hvcihJRmlndXJlIGZpZ3VyZSkgewotCQlzdXBlcihmaWd1cmUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25BbmNob3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlyZXR1cm4gZ2V0TG9jYXRpb24oZ2V0T3duZXIoKSwgcmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG9jYXRpb24gaW4gdGhlIGNsb3Nlc3QgbG9jYXRpb24gaW4gZmlndXJlLCBiYXNlZCBvbiAKLQkgKiBmaWd1cmUgYm91bmRzIGFuZCB0aGUgcmVmZXJlbmNlIHBvaW50LiAgIAotCSAqIAotCSAqIEBwYXJhbSBmaWd1cmUge0BsaW5rIElGaWd1cmV9ICBGaWd1cmUgdG8gd2hpY2ggY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hpbmcuCi0JICogQHBhcmFtIHJlZmVyZW5jZSB7QGxpbmsgUG9pbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRMb2NhdGlvbihJRmlndXJlIGZpZ3VyZSwgUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVJlY3RhbmdsZSByID0gZmlndXJlLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJZmlndXJlLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCVJlY3RhbmdsZSBhYnNvbHV0ZUJvdW5kcyA9IHIuZ2V0Q29weSgpOwotCQlQb2ludCBwID0gbnVsbDsKLQkJc3dpdGNoIChyLmdldFBvc2l0aW9uKHJlZmVyZW5jZSkpIHsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSDoKLQkJCXAgPSByLmdldFRvcExlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEhfRUFTVDoKLQkJCXAgPSByLmdldFRvcFJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUOgotCQkJcCA9IHIuZ2V0VG9wUmlnaHQoKS50cmFuc2xhdGUoMCwgcmVmZXJlbmNlLnkgLSByLnkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfRUFTVDoKLQkJCXAgPSByLmdldEJvdHRvbVJpZ2h0KCk7Ci0JCQlicmVhazsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUocmVmZXJlbmNlLnggLSByLngsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuU09VVEhfV0VTVDoKLQkJCXAgPSByLmdldEJvdHRvbUxlZnQoKTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCkudHJhbnNsYXRlKDAsIHJlZmVyZW5jZS55IC0gci55KTsKLQkJCWJyZWFrOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIX1dFU1Q6Ci0JCQlwID0gci5nZXRUb3BMZWZ0KCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWludCB0b3BEaXN0YW5jZSA9IHJlZmVyZW5jZS55IC0gci55OwotCQkJaW50IHJpZ2h0RGlzdGFuY2UgPSByLnJpZ2h0KCkgLSByZWZlcmVuY2UueDsKLQkJCWludCBib3R0b21EaXN0YW5jZSA9IHIuYm90dG9tKCkgLSByZWZlcmVuY2UueTsKLQkJCWludCBsZWZ0RGlzdGFuY2UgPSByZWZlcmVuY2UueCAtIHIueDsKLQkJCWludFtdIGRpc3RhbmNlcyA9IHsgdG9wRGlzdGFuY2UsIHJpZ2h0RGlzdGFuY2UsIGJvdHRvbURpc3RhbmNlLAotCQkJCQlsZWZ0RGlzdGFuY2UgfTsKLQkJCWludCBpZCA9IEFuY2hvclV0aWwubWluKGRpc3RhbmNlcyk7Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZShsZWZ0RGlzdGFuY2UsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXAgPSByLmdldFRvcFJpZ2h0KCkudHJhbnNsYXRlKDAsIHRvcERpc3RhbmNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlwID0gci5nZXRCb3R0b21MZWZ0KCkudHJhbnNsYXRlKGxlZnREaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcCA9IHIuZ2V0VG9wTGVmdCgpLnRyYW5zbGF0ZSh0b3BEaXN0YW5jZSwgMCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcC5wZXJmb3JtVHJhbnNsYXRlKC1hYnNvbHV0ZUJvdW5kcy54LCAtYWJzb2x1dGVCb3VuZHMueSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTJhYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkRpYW1vbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5BbmNob3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkRpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Mb2NhdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciAgRGVjaXNpb25Ob2RlLCB1c2VkIGluIGFjdGl2aXR5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVFZGl0UGFydCBleHRlbmRzIE5vZGVFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUNvbm5lY3Rpb25BbmNob3JMb2NhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKG51bGwsIDI1NCwgMjA0LCAxNTMpOwotCi0JcHJpdmF0ZSBQb2ludCByZWNlbnRTb3VyY2VFbmRQb2ludDsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRWRpdFBhcnQoVHlwZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRmlndXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCURpYW1vbmQgZmlndXJlID0gbmV3IERpYW1vbmQoKTsKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCWZpZ3VyZS5zZXRTaXplKDQ4LCAyNCk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgc291cmNlRW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRTb3VyY2VFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgc291cmNlIGVuZCBwb2ludCBmcm9tIHRoZSBtb2RlbAotCQkJTGluayBsaW5rID0gKExpbmspIGNvbm5lY3Rpb24uZ2V0TW9kZWwoKTsKLQkJCXNvdXJjZUVuZFBvaW50ID0gbGluay5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJaXNSZWxhdGl2ZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlzb3VyY2VFbmRQb2ludCA9IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCQl9Ci0JCWlmIChzb3VyY2VFbmRQb2ludCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHNvdXJjZUVuZFBvaW50LCBpc1JlbGF0aXZlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2dldFNvdXJjZUNvbm5lY3Rpb25BbmNob3Iob3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3QpCi0JICovCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgcCA9IG51bGw7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcSA9IChDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgcmVxdWVzdDsKLQkJCXAgPSByZXEuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIGlmIChyZXF1ZXN0IGluc3RhbmNlb2YgTG9jYXRpb25SZXF1ZXN0KSB7Ci0JCQlwID0gKChMb2NhdGlvblJlcXVlc3QpIHJlcXVlc3QpLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJcmVjZW50U291cmNlRW5kUG9pbnQgPSBnZXRMb2NhdGlvbihwKTsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgcmVjZW50U291cmNlRW5kUG9pbnQsIHRydWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlRWRpdFBhcnQjZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlib29sZWFuIGlzUmVsYXRpdmUgPSBmYWxzZTsKLQkJUG9pbnQgdGFyZ2V0RW5kUG9pbnQ7Ci0JCWlmIChyZWNlbnRUYXJnZXRFbmRQb2ludCA9PSBudWxsKSB7Ci0JCQkvLyBnZXQgdGFyZ2V0IGVuZCBwb2ludCBmcm9tIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJdGFyZ2V0RW5kUG9pbnQgPSBsaW5rLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRhcmdldEVuZFBvaW50ID0gcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHRhcmdldEVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgdGFyZ2V0RW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoY29ubmVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVFZGl0UGFydCNnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotCSAqLwotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFRhcmdldEVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFRhcmdldEVuZFBvaW50LCB0cnVlKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5Db25uZWN0aW9uQW5jaG9yTG9jYXRvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCURpYW1vbmQgZiA9ICgoRGlhbW9uZCkgZ2V0RmlndXJlKCkpOwotCi0JCS8vIHRyYW5zbGF0ZSBwb2ludHMgdG8gYWJzb2x1dGUKLQkJUG9pbnRbXSBwb2ludHMgPSBuZXcgUG9pbnRbZi5nZXRQb2ludHMoKS5zaXplKCldOwotCQlmb3IgKGludCBpID0gZi5nZXRQb2ludHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUG9pbnQgcCA9IGYuZ2V0UG9pbnRzKCkuZ2V0UG9pbnQoaSk7Ci0JCQlmLnRyYW5zbGF0ZVRvQWJzb2x1dGUocCk7Ci0JCQlwb2ludHNbaV0gPSBwOwotCQl9Ci0KLQkJUG9pbnQgcCA9IEFuY2hvclV0aWwuZ2V0Q2xvc2VzdFBvaW50KHBvaW50cywgcmVmZXJlbmNlKTsKLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJUmVjdGFuZ2xlIHIgPSBmLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJCWYudHJhbnNsYXRlVG9BYnNvbHV0ZShyKTsKLQkJCXAucGVyZm9ybVRyYW5zbGF0ZSgtci54LCAtci55KTsKLQkJfQotCQlyZXR1cm4gcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhN2E2NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi0vKioKLSAqIEVkaXRQYXJ0IGZvciBXb3JrQnJlYWtkb3duIEVsZW1lbnRzIGluIGFuIEFjdGl2aXR5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvck5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBEZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2dldEltYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlJPTEVfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuUk9MRTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQlpZigoKE5vZGUpbW9kZWwpLmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQlyZXR1cm4gSW1hZ2VzLlRBU0tfREVTQ1JJUFRPUl8xNjsKLQkJCXJldHVybiBJbWFnZXMuVEFTS19ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgewotCQkJaWYoKChOb2RlKW1vZGVsKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSAoKExpbmtlZE9iamVjdCkgbW9kZWwpCi0JCQkJCS5nZXRPYmplY3QoKTsKLQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCQl9IGVsc2UgaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLkRFTElWRVJBQkxFOwotCQkJfSBlbHNlIGlmICh3cCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCQlyZXR1cm4gSW1hZ2VzLk9VVENPTUU7Ci0JCQl9Ci0JCQlyZXR1cm4gSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SXzE2OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgKgotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCWUsIHR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqOwotCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKGUsCi0JCQkJCQkJdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tSb2xlRGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU291cmNlQ29ubmVjdGlvbnMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsIG51bGwpOwotCX0KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0RGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUFjdGlvblNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUFjdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjNDU3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1BY3Rpb25TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuUmVjb25uZWN0TGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogU2VydmljZSBjbGFzcyB0byBhbGxvdyBjcmVhdGUgYW5kIHJlZ2lzdGVyIGNvbW1vbiBhY3Rpb24gdG8gdGhlIGFjdGlvbgotICogcmVnaXN0ZXIuIE1vc3Qgb2YgdGhlIGNvZGUgYXJlIG1vdmVkIGZyb20gdGhlIEVkaXRvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BY3Rpb25TZXJ2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9ICJhbGlnbl9ob3Jpem9udGFsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX2hvcml6b250YWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0gImFsaWduX3ZlcnRpY2FsX3RvX2F2ZXJhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0gImFsaWduX3ZlcnRpY2FsX3RvX2ZpcnN0X3NlbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKiBAcGFyYW0gZ3JhcGhpY2FsVmlld2VyIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9Ci0JICogQHBhcmFtIGVkaXREb21haW4gCXtAbGluayBEZWZhdWx0RWRpdERvbWFpbn0KLQkgKiBAcGFyYW0gYWN0aW9uUmVnaXN0cnkgCXtAbGluayBBY3Rpb25SZWdpc3RyeX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFjdGlvblNlcnZpY2UoR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlciwKLQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW4sIEFjdGlvblJlZ2lzdHJ5IGFjdGlvblJlZ2lzdHJ5KSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgR3JhcGhpY2FsVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgR3JhcGhpY2FsVmlld2VyCi0JICovCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWlnbkF2ZXJhZ2UgQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdG8gaG9yaXpvbnRhbCBhdmVyYWdlLiAgCi0JICovCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQlJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcml6QWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0FWRVJBR0U7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduQXZlcmFnZUFjdGlvbik7Ci0KLQkJcmV0dXJuIGhBbGlnbkF2ZXJhZ2VBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgd2l0aCAKLQkgKiByZXNwZWN0IHRvIGZpcnN0IHNlbGVjdGVkIGVkaXRwYXJ0LiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVySG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpIHsKLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIHktdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQlJQWN0aW9uIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0KSB7IAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciB2ZXJ0aWFsQWxpZ25BdmVyYWdlQWN0aW9uIGFjdGlvbi4gCi0JICogdmVydGlhbEFsaWduQXZlcmFnZUFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHZlcnRpY2FsbHkgdy5yLnQgYXZlcmFnZS4KLQkgKiAKLQkgKi8KLQkKLQlwdWJsaWMgSUFjdGlvbiByZWdpc3RlclZlcnRpY2FsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIGF2ZXJhZ2UgeC12YWx1ZSBvZiBhbGwgc2VsZWN0ZWQgbm9kZXMKLQkJSUFjdGlvbiB2QWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBmaXJzdCBzZWxlY3RlZC4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8geC12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCUlBY3Rpb24gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBhY3Rpb24gbWV0aG9kcwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduRmlyc3RlU0VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCBzZWxlY3RlZCBpdGVtcywgcmVtZW1iZXIgdGhlIHktdmFsdWUgb2YgdGhlCi0JCS8vIGZpcnN0IG5vZGUsCi0JCS8vIHNldCB0aGUgZm9sbG93aW5nIG5vZGVzIHRvIHRoZSBzYW1lIHktdmFsdWUKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyByZW1lbWJlciB0aGUgZmlyc3QgcGFydCB3ZSBtb3ZlCi0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy5oZWlnaHQgLSBmaXJzdFBhcnQKLQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJCS8vIGlzIHRoaXMgbm9kZSBpbiBhIGNvbnRhaW5lcj8KLQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIG1vdmUgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBvZmZzZXQKLQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy55IC0gcGFyZW50Qm91bmRzLnk7Ci0JCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCX0KLQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBub2RlCi0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54LCBmaXJzdFBhcnQKLQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55Ci0JCQkJCQkJCQktIG9mZnNldCksIGJvdW5kcy53aWR0aCk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciBob3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGhvcml6QWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCWludCB5c3VtID0gMDsKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyByZW1lbWJlciB0aGUgZmlyc3QgcGFydCB3ZSBtb3ZlCi0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0KLQkJCQl5c3VtICs9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQkJdG90YWwrKzsKLQkJCX0KLQkJfQotCQkvLyBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgeS12YWx1ZSBmb3IgYWxsIG5vZGVzCi0JCWludCB5YXZlID0gKGludCkgKChkb3VibGUpIHlzdW0gLyAoZG91YmxlKSB0b3RhbCk7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIG5vZGVzIGFnYWluIGFuZCBzZXQgdGhlbQotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIGNhbGN1bGF0ZSB0aGUgaGVpZ2h0IGRpZmZlcmVuY2UsIHNvIHRoYXQgZWxlbWVudHMgYXJlIGFsaWduZWQKLQkJCQkvLyB0aHJvdWdoIHRoZSBjZW50ZXJsaW5lCi0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy5oZWlnaHQgLSBmaXJzdFBhcnQKLQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5oZWlnaHQpIC8gMi4wKTsKLQkJCQkvLyBpcyB0aGlzIG5vZGUgaW5zaWRlIGEgY29udGFpbmVyPwotCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkvLyB3ZSBuZWVkIHRvIG1vdmUgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBvZmZzZXQKLQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy55IC0gcGFyZW50Qm91bmRzLnk7Ci0JCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQl9Ci0JCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBub2RlCi0JCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQluZXcgUG9pbnQoYm91bmRzLngsIHlhdmUgLSBvZmZzZXQpLCBib3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgdmVydGljYWxBbGlnblRvQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHZlcnRpY2FsQWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGZpcnN0UGFydCA9IG51bGw7Ci0JCWludCB0b3RhbCA9IDA7Ci0JCWludCB4c3VtID0gMDsKLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBzZWxlY3RlZCBwYXJ0cwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBub2RlcyBhbmQgY29udGFpbmVycwotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJLy8gc3VtIHRoZSB4IGNvb3JkaW5hdGVzIG9mIGVhY2ggZWxlbWVudAotCQkJCXhzdW0gKz0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLQkJCQkvLyByZW1lbWJlciBob3cgbWFueSBzZWxlY3RlZCBlbGVtZW50cyBhcHBsaWVkIHRvIHRoaXMgb3BlcmF0aW9uCi0JCQkJdG90YWwrKzsKLQkJCX0KLQkJfQotCQkvLyBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgeC12YWx1ZSBmb3IgYWxsIG5vZGVzCi0JCWludCB4YXZlID0gKGludCkgKChkb3VibGUpIHhzdW0gLyAoZG91YmxlKSB0b3RhbCk7Ci0JCS8vIGxvb3AgdGhyb3VnaCBhbGwgdGhlIG5vZGVzIGFnYWluIGFuZCBzZXQgdGhlbQotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMud2lkdGggLSBmaXJzdFBhcnQKLQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCS8vIGFyZSB3ZSBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGhhdmUgdG8gbW92ZSB0aGUgY29udGFpbmVyCi0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KHhhdmUgLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQkvLyBnZXQgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBhbGlnblRvUGFydCA9IG51bGw7Ci0JCS8vIGZpbmQgdGhlIGZpcnN0IGRpYWdyYW0gcGFydCB3ZSBjYW4gYWxpZ24gdG8KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCXx8IGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoYWxpZ25Ub1BhcnQgPT0gbnVsbCkgewotCQkJCQkvLyByZW1lbWJlciBpdCBhbmQgc3RvcAotCQkJCQlhbGlnblRvUGFydCA9IGVwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgc2V0IHRoZWlyIG5ldyBwb3NpdGlvbgotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQKLQkJCQkJfHwgZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHdlIGNhbiBza2lwIHRoZSBmaXJzdCBvbmUgc2luY2UgdGhpcyBpcyBhbiBhbGlnbi10bwotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgIShhbGlnblRvUGFydCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSkgewotCQkJCQkvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBmb3IgY2VudGVybGluZSBhbGlnbm1lbnQKLQkJCQkJaWYgKCEoZXAgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkpIHsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy53aWR0aCAtIGFsaWduVG9QYXJ0Ci0JCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aCkgLyAyLjApOwotCQkJCQkJLy8gaXMgdGhpcyBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJCQkvLyBhZGp1c3QgdGhlIG9mZnNldCBzaW5jZSB3ZSBhcmUgbW92aW5nIHRoZQotCQkJCQkJCS8vIGNvbnRhaW5lcgotCQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIG5ldyBQb2ludChhbGlnblRvUGFydAotCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54Ci0JCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSwgYm91bmRzLndpZHRoKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCQkJbmV3IFBvaW50KGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVBvaW50IHRwID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0JCQkJCQlib29sZWFuIHNvdXJjZSA9IGZhbHNlOwotCQkJCQkJUG9pbnQgZW5kUG9pbnQgPSBudWxsOwotCQkJCQkJTGlua0VkaXRQYXJ0IGxwID0gbnVsbDsKLQkJCQkJCS8vIGNoZWNrIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGVwKS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlscCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCWVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJCQkJCQl0cCA9IHRwLmdldFRyYW5zbGF0ZWQoZW5kUG9pbnQpOwotCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBjaGVjayBzb3VyY2UgY29ubmVjdGlvbnMgaWYgbm90IGZvdW5kIGluIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQkJaWYgKCFjb25uZWN0ZWQpIHsKLQkJCQkJCQlsaXN0ID0gKChOb2RlRWRpdFBhcnQpIGVwKS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFRhcmdldCgpLmVxdWFscyhhbGlnblRvUGFydCkpIHsKLQkJCQkJCQkJCWVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCQkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQkJCXRwID0gdHAuZ2V0VHJhbnNsYXRlZChlbmRQb2ludCk7Ci0JCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQkJc291cmNlID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGNvbm5lY3RlZCAmJiAoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpKSB7Ci0JCQkJCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCQkJCWludCBkZWx0YSA9IGNlbnRlclBvaW50LnggLSB0cC54OwotCQkJCQkJCWVuZFBvaW50LnggKz0gZGVsdGE7Ci0JCQkJCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQkJKExpbmspIGxwLmdldE1vZGVsKCksIChOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJCQkJc291cmNlKTsKLQkJCQkJCQljLnNldEVuZFBvaW50KGVuZFBvaW50KTsKLQkJCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJZiBmaXJzdCBzZWxlY3RlZCBlZGl0IHBhcnQgaXMgc3luY2Jhcm5vZGVlZGl0cGFydCwgbmVlZCB0bwotCQkJCS8vIGhhbmRsZSBkaWZmZXJlbnRseQotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgKGFsaWduVG9QYXJ0IGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpKSB7Ci0KLQkJCQkJUG9pbnQgc3AgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCS5nZXRMb2NhdGlvbigpOwotCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkvLyBjaGVjayBpZiB0aGUgcGFydCBpcyBjb25uZWN0ZWQgdmlhIHNvdXJjZSBjb25uZWN0aW9ucwotCQkJCQlMaXN0IGxpc3QgPSAoKE5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJUG9pbnQgc291cmNlRW5kUG9pbnQgPSAoKExpbmspIGxwLmdldE1vZGVsKCkpCi0JCQkJCQkJCQkuZ2V0U291cmNlRW5kUG9pbnQoKTsKLQkJCQkJCQlzcCA9IHNwLmdldFRyYW5zbGF0ZWQoc291cmNlRW5kUG9pbnQpOwotCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgbm90IGZvdW5kIGFib3ZlLCBjaGVjayBpZiBpdCBpcyBjb25uZWN0ZWQgdmlhIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJbGlzdCA9ICgoTm9kZUVkaXRQYXJ0KSBhbGlnblRvUGFydCkKLQkJCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCUxpbmtFZGl0UGFydCBscCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJCVBvaW50IHRhcmdldEVuZFBvaW50ID0gKChMaW5rKSBscC5nZXRNb2RlbCgpKQotCQkJCQkJCQkJCS5nZXRUYXJnZXRFbmRQb2ludCgpOwotCQkJCQkJCQlzcCA9IHNwLmdldFRyYW5zbGF0ZWQodGFyZ2V0RW5kUG9pbnQpOwotCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVwIGluc3RhbmNlb2YgU3luY2hCYXJOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVBvaW50IHRwID0gKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCS5nZXRDb3B5KCk7Ci0JCQkJCQlQb2ludCBhbGlnblRvQ2VudGVyID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJaW50IGRlbHRhID0gYWxpZ25Ub0NlbnRlci54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXAgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCVBvaW50IHRwID0gKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCS5nZXRDb3B5KCk7Ci0JCQkJCQlQb2ludCBjZW50ZXJQb2ludCA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRDZW50ZXIoKTsKLQkJCQkJCWludCBkZWx0YSA9IHNwLnggLSBjZW50ZXJQb2ludC54OwotCQkJCQkJdHAueCA9IHRwLnggKyBkZWx0YTsKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIHRwLCBlcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJZXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KHRwLngsIHRwLnkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRGlhZ3JhbUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTc0MWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuRGlhZ3JhbUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Sb290Q29tcG9uZW50RWRpdFBvbGljeTsKLQotLyoqCi0gKiBQcm92aWRlcyBFZGl0UGFydCBmb3IgRGlhZ3JhbS4gSGFuZGxlcyB0aGUgYmFzaWMgbGF5b3V0IG1lY2hhbmlzbQotICogaWYgdGhlIGNoaWxkcmVuIGxvY2F0aW9uIGlzIG5vdCBzZXQgaW4gdGhlIGRpYWdyYW0uICAKLSAqICAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBza2Fubm9vcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUNvbnRhaW5lckVkaXRQYXJ0IHsKLQotCVBvaW50IGNhY2hlZFBvaW50ID0gbmV3IFBvaW50KC0xLCAtMSk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgYm9vbGVhbiBtYXJrRGlydHkgPSBmYWxzZTsKLQotCXN0YXRpYyBpbnQgY2FjaGVkV2lkdGggPSAxMDsKLQotCXN0YXRpYyBpbnQgY2FjaGVkSGVpZ2h0ID0gMTA7Ci0KLQlwdWJsaWMgRGlhZ3JhbUVkaXRQYXJ0KERpYWdyYW0gbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlkZWJ1ZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRmlndXJlIGYgPSBuZXcgRnJlZWZvcm1MYXllcigpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGxheW91dCgpIHsKLQkJCQlpZiAoaGFzTWlzcGxhY2VkQ2hpbGRyZW4oKSkgewotCQkJCQlyZXNldENoaWxkcmVuTG9jYXRpb25zKCk7Ci0JCQkJfQotCQkJCXN1cGVyLmxheW91dCgpOwotCQkJfQotCi0JCX07Ci0KLQkJZi5zZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigyMCkpOwotCQlmLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkpOwotCQlyZXR1cm4gZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCQlpbnQgeSA9IDEwOwotCQlmaW5hbCBpbnQgc3BhY2luZyA9IDQwOwotCQlpbnQgb2NjdXBpZWQgPSAwOwotCQlpbnQgeGVsZW1lbnRzID0gMDsKLQkJaW50IHggPSAxMDsKLQkJYm9vbGVhbiBsb2NrZWQgPSBUbmdVdGlsLmlzTG9ja2VkKChFT2JqZWN0KSgoRGlhZ3JhbSlnZXRNb2RlbCgpKS5nZXRPYmplY3QoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJaW50IHdpZHRoID0gcGFydC5nZXRSb290KCkuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCWlmIChwYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCkuZ2V0Q29weSgpOwotCQkJCQlpZiAocCA9PSBudWxsIHx8IHAueCA9PSAtMSkgewotCQkJCQkJaWYgKHggKyBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCA+IHdpZHRoKSB7Ci0JCQkJCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyBzcGFjaW5nOwotCQkJCQkJCXhlbGVtZW50cyA9IDA7Ci0JCQkJCQkJeCA9IDEwOwotCQkJCQkJCWNhY2hlZFBvaW50LnggPSAtMTsKLQkJCQkJCQlvY2N1cGllZCA9IDA7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY2FjaGVkUG9pbnQueCAhPSAtMSkgewotCQkJCQkJCXggPSBjYWNoZWRQb2ludC54ICsgY2FjaGVkV2lkdGggKyBzcGFjaW5nOwotCQkJCQkJfQotCQkJCQkJKyt4ZWxlbWVudHM7Ci0JCQkJCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJCQkJcCA9IG5ldyBQb2ludCgtMSwgLTEpOwotCQkJCQkJfQotCQkJCQkJcC54ID0geDsKLQkJCQkJCXAueSA9IHk7Ci0JCQkJCQkvL25vZGUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJCQkvL09uIG9wZW5pbmcgYSBBRCBkaWFncmFtLCBlZGl0b3Igc2hvdWxkIGJlIG1hcmtlZCBkaXJ0eS4KLQkJCQkJCS8vSWYgZGlhZ3JhbSBpcyBub3Qgc2F2ZWQsIGNhbm5vdCBiZSBicm93c2VkLiBGb3JjaW5nIHRvIHNhdmUgdGhlIGRpYWdyYW0gb25jZS4KLQkJCQkJCWlmICghbG9ja2VkICYmICgoRGlhZ3JhbSkgZ2V0TW9kZWwoKSkuaXNOZXcoKQotCQkJCQkJCQkmJiAhKChEaWFncmFtKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkKLQkJCQkJCQkJJiYgbWFya0RpcnR5KSB7Ci0JCQkJCQkJQ2hhbmdlQm91bmRzQ29tbWFuZCBjYmMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZChub2RlLCBwLCBwYXJ0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGgpOwotCQkJCQkJCWdldFZpZXdlcigpLmdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKQotCQkJCQkJCQkJLmV4ZWN1dGUoY2JjKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gSWYgUGx1Z2luIGlzIExvY2tlZDogRG8gYXV0by1sYXlvdXQgYW5kIGRvbm90Ci0JCQkJCQkJLy8gc2F2ZSB0byBtb2RlbC4KLQkJCQkJCQlub2RlLnNldExvY2F0aW9uKHApOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQljYWNoZWRQb2ludCA9IHA7Ci0JCQkJCQljYWNoZWRXaWR0aCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJY2FjaGVkSGVpZ2h0ID0gcGFydC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlBvaW50IDogIiArIG5ldyBQb2ludCh4LCB5KS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJDYWNoZWQgOiB3aWR0aDogIiArIGNhY2hlZFdpZHRoICsgIiBIZWlnaHQgOiAiICsgY2FjaGVkSGVpZ2h0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlvY2N1cGllZCArPSB4OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWlzcGxhY2VkQ2hpbGRyZW4oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbW9kZWw7Ci0JCQkJCVBvaW50IHAgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCQkJCWlmIChwID09IG51bGwgfHwgcC54ID09IC0xKXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09NUE9ORU5UX1JPTEUsCi0JCQkJbmV3IFJvb3RDb21wb25lbnRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTlRBSU5FUl9ST0xFLAotCQkJCW5ldyBEaWFncmFtTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0I2FkZFBhcnRUb0VkaXQoQ29sbGVjdGlvbiwKLQkgKiAgICAgIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0VG9FZGl0KENvbGxlY3Rpb24gcGFydHNUb0VkaXQsIE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJTm9kZUNvbnRhaW5lckVkaXRQYXJ0IGVkaXRQYXJ0ID0gKE5vZGVDb250YWluZXJFZGl0UGFydCkgZmluZENoaWxkQnlNb2RlbChub2RlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoTm9kZUNvbnRhaW5lcikgbm9kZSkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJZWRpdFBhcnQuYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgbm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb3ZlcyBjb21wbGV0ZSBkaWFncmFtIGNoaWxkcmVuIHRvIGdpdmVuIGRlbHRhLiAKLQkgKiBAcGFyYW0gaW50ICAoWC1heGlzIGRlbHRhKQotCSAqIEBwYXJhbSBpbnQgIChZLWF4aXMgZGVsdGEpCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbW92ZUZpZ3VyZShpbnQgbW92ZVgsIGludCBtb3ZlWSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb2ludChib3VuZHMueCArIG1vdmVYLAotCQkJCQkJYm91bmRzLnkgKyBtb3ZlWSksIGJvdW5kcy5nZXRTaXplKCkpOwotCi0JCQkJLy8gYWxzbyBuZWVkIHRvIG1vdmUgdGhlIGJlbmQgcG9pbnRzCi0JCQkJTGlzdCBsaXN0ID0gcGFydC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rcGFydCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApIHsKLQkJCQkJCVBvaW50TGlzdCBwbGlzdCA9ICgoUG9seWxpbmVDb25uZWN0aW9uKSBsaW5rcGFydAotCQkJCQkJCQkuZ2V0RmlndXJlKCkpLmdldFBvaW50cygpOwotCQkJCQkJTGlzdCBwb2ludHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IHBsaXN0LnNpemUoKSAtIDE7IGkrKykgewotCQkJCQkJCVBvaW50IHAgPSBwbGlzdC5nZXRQb2ludChpKTsKLQkJCQkJCQlwID0gcC50cmFuc2xhdGUobmV3IFBvaW50KG1vdmVYLCBtb3ZlWSkpOwotCi0JCQkJCQkJb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IGJwID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCgKLQkJCQkJCQkJCXApOwotCQkJCQkJCXBvaW50cy5hZGQoYnApOwotCQkJCQkJfQotCi0JCQkJCQlsaW5rcGFydC5nZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0Um91dGluZ0NvbnN0cmFpbnQoCi0JCQkJCQkJCXBvaW50cyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQl0aGlzLnNldExheW91dENvbnN0cmFpbnQocGFydCwgcGFydC5nZXRGaWd1cmUoKSwgcik7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQYXJ0IG5vdCBtb3ZlZDogIiArIGNoaWxkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqCi0JICogT24gb3BlbmluZyBhIGRpYWdyYW0sIGVkaXRvciBzaG91bGQgYmUgbWFya2VkIGRpcnR5LgotCSAqIEludm9rZXIgb2YgRGlhZ3JhbUVkaXRQYXJ0IHNob3VsZCBleHBsaWNpdGx5IHNldCB0aGUgZmxhZyB0byBtYXJrIGVkaXRvciBkaXJ0eQotCSAqIG9yIG5vdC4gV2l0aG91IGhhbmRsaW5nIHRoaXMgd2lsbCBjYXVzZSBicm93c2luZyBwZXJzcGVjdGl2ZSBpbiBjb25zaXN0ZW50LiAgICAKLQkgKiBGb3IgZGVmZWN0OiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU2MDI5Ci0JICovCi0JcHVibGljIHZvaWQgbWFya0RpcnR5KGJvb2xlYW4gbWFya0RpcnR5KXsKLQkJdGhpcy5tYXJrRGlydHkgID0gbWFya0RpcnR5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1VcGRhdGVTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0RpYWdyYW1VcGRhdGVTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzhhNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9EaWFncmFtVXBkYXRlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBTZXJ2aWNlIGNsYXNzIHRvIGFsbG93IHVwZGF0aW5nIGRpYWdyYW0gdG8gYSBkZWZhdWx0IGxheW91dC4gTW9zdCBvZiB0aGUgY29kZQotICogYXJlIG1vdmVkIGZyb20gdGhlIEVkaXRvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1VcGRhdGVTZXJ2aWNlIHsKLQotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByaXZhdGUgQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnk7Ci0KLQlwdWJsaWMgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQlHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyLCBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluLAotCQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBncmFwaGljYWxWaWV3ZXI7Ci0JCXRoaXMuZWRpdERvbWFpbiA9IGVkaXREb21haW47Ci0JCXRoaXMuYWN0aW9uUmVnaXN0cnkgPSBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRTdGFjayBnZXRDb21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBnZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdCBkb21haW4uCi0JICogCi0JICogQHJldHVybiB0aGUgZWRpdCBkb21haW4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVmYXVsdEVkaXREb21haW4gZ2V0RWRpdERvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXREb21haW47Ci0JfQotCi0JLyoqCi0JICogTGF6aWx5IGNyZWF0ZXMgYW5kIHJldHVybnMgdGhlIGFjdGlvbiByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aW9uUmVnaXN0cnkgZ2V0QWN0aW9uUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBhY3Rpb25SZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBvbmx5IGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBvciBhbnkgZGlhZ3JhbSBuZWVkIGF1dG8tbGF5b3V0LgotCSAqIE1ldGhvZCB3aWxsIHZlcmlmeSByZWNlbnRseSBhZGRlZCBlZGl0cGFydHMgaW4gdGhlIEFjdGl2aXR5ZGV0YWlsZGlhZ3JhbSBlZGl0cGFydAotCSAqIGluZGlyZWN0bHkgZnJvbSBXb3JrQnJlYWtkb3duU3RydWN0dXJlIChtZWFucyBhbnkgZGVzY3JpcHRvcnMgY3JlYXRlZCBpbiB3YnMsIGNvcnJlc3BvbmRpbmcKLQkgKiBFZGl0UGFydCB3aWxsIGdldCBjcmVhdGVkIGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBWaWV3ZXIpIGFuZCBkb2VzIGF1dG8tbGF5b3V0Ci0JICogYWxsIHRoZSBuZXcgYWRkZWQgZWRpdHBhcnRzIGFuZCBleGlzdGluZyBvbmVzLiAKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGVwID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCUxpc3QgY2hpbGRyZW4gPSBkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCk7Ci0JCQlpZiAoIWNoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJCWludCByYyA9IDA7Ci0JCQkJCQlpZiAoYXJnMCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQkJCQlpZiAoIShhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkpCi0JCQkJCQkJCXJjID0gLTE7Ci0JCQkJCQl9IGVsc2UgaWYgKGFyZzEgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KQotCQkJCQkJCXJjID0gMTsKLQkJCQkJCXJldHVybiByYzsKLQkJCQkJfQotCi0JCQkJfTsKLQotCQkJCU9iamVjdFtdIGFycmF5ID0gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCQlmb3IgKGludCBhID0gMDsgYSA8IGFycmF5Lmxlbmd0aDsgYSsrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbYV07Ci0JCQkJCWFkanVzdFNpemUoZXApOwotCQkJCX0KLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IGFycmF5Lmxlbmd0aDsgYisrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbYl07Ci0JCQkJCWNsZWFuVXAoZXApOwotCQkJCX0KLQkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbY107Ci0JCQkJCXJlZHVjZUxpbmtMZW5ndGgoZXApOwotCQkJCX0KLS8vCQkJCWZvciAoaW50IGMgPSAwOyBjIDwgYXJyYXkubGVuZ3RoOyBjKyspIHsKLS8vCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotLy8JCQkJCWlmKGVwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCl7Ci0vLwkJCQkJCXJlc2V0U2l6ZXMoZXAsIGVwKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJcGFja0RpYWdyYW0oKTsKLQkJCQlkZXAuY2xlYXJSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCXByaXZhdGUgdm9pZCByZXNldFNpemVzKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAsIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFyZW50KSB7Ci0JCWlmICghKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkpIHsKLQkJCUxpc3Qgc291cmNlTGlua3MgPSBlcC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJaWYgKHNvdXJjZUxpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHNvdXJjZUxpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rID0gKExpbmtFZGl0UGFydCkgc291cmNlTGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpbnQgdyA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA+IGV3KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWxvY2F0aW9uLngrPSh3LWV3KS8yOwotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgZXAsCi0JCQkJCQkJCQkJCXRhcmdldCB9KSk7Ci0JCQkJCUlBY3Rpb24gdmFsaWduID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCk7Ci0JCQkJCXZhbGlnbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IHRhcmdldExpbmtzID0gZXAuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWlmICh0YXJnZXRMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCB0YXJnZXRMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHRhcmdldExpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJaW50IHcgPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPiBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgZXAsCi0JCQkJCQkJCQkJCXNvdXJjZSB9KSk7Ci0JCQkJCUlBY3Rpb24gdmFsaWduID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCk7Ci0JCQkJCXZhbGlnbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwYXJlbnQuZ2V0RmlndXJlKCkuZ2V0TGF5b3V0TWFuYWdlcigpLmxheW91dChwYXJlbnQuZ2V0RmlndXJlKCkpOwotCQkJaWYgKGVwIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgZCA9IDA7IGQgPCBjaGlsZHJlbi5zaXplKCk7IGQrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCQkuZ2V0KGQpOwotCQkJCQlyZXNldFNpemVzKHAsIGVwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JKi8KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgYSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYWxsIG5vZGVzIHdpdGggbGlua3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW5VcChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmICghKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkpIHsKLQkJCUxpc3Qgc291cmNlTGlua3MgPSBlcC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJaWYgKHNvdXJjZUxpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHNvdXJjZUxpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUxpbmtFZGl0UGFydCBsaW5rID0gKExpbmtFZGl0UGFydCkgc291cmNlTGlua3MuZ2V0KGIpOwotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHRhcmdldCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpbnQgdyA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS53aWR0aDsKLQkJCQkJaW50IGV3ID0gZXAuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQlpZiAodyA8IGV3KSB7Ci0JCQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3KTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlpbnQgaCA9IHRhcmdldC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJdGFyZ2V0LmdldEZpZ3VyZSgpCi0JCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQkJdGFyZ2V0LmdldEZpZ3VyZSgpLnNldFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCX0KLQkJCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IE9iamVjdFtdIHsgZXAsCi0JCQkJCQkJCQkJCXRhcmdldCB9KSk7Ci0JCQkJCUlBY3Rpb24gdmFsaWduID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9GSVJTVF9TRUxFQ1RFRCk7Ci0JCQkJCXZhbGlnbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IHRhcmdldExpbmtzID0gZXAuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWlmICh0YXJnZXRMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChpbnQgYiA9IDA7IGIgPCB0YXJnZXRMaW5rcy5zaXplKCk7IGIrKykgewotCQkJCQlMaW5rRWRpdFBhcnQgbGluayA9IChMaW5rRWRpdFBhcnQpIHRhcmdldExpbmtzLmdldChiKTsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgbGluawotCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJaW50IHcgPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGg7Ci0JCQkJCWludCBldyA9IGVwLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaWYgKHcgPCBldykgewotCQkJCQkJQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKChOb2RlKSBlcAotCQkJCQkJCQkuZ2V0TW9kZWwoKSksIHNvdXJjZS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSwgdyk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXNvdXJjZS5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXNvdXJjZS5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLnNldFNlbGVjdGlvbigKLQkJCQkJCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3RbXSB7IGVwLAotCQkJCQkJCQkJCQlzb3VyY2UgfSkpOwotCQkJCQlJQWN0aW9uIHZhbGlnbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpOwotCQkJCQl2YWxpZ24ucnVuKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGVwIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgZCA9IDA7IGQgPCBjaGlsZHJlbi5zaXplKCk7IGQrKykgewotCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCQkuZ2V0KGQpOwotCQkJCQljbGVhblVwKHApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICBGb3IgYXV0by1sYXlvdXQsIG5lZWQgdG8gYWRqdXN0IGNvbm5lY3Rpb24ob3IgbGluaykgbGVuZ3RoLCBiYXNlZCBvbgotCSAqICBjb25uZWN0aW5nIGVkaXRwYXJ0cyhmaWd1cmVzKS4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVkdWNlTGlua0xlbmd0aChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQpIHsKLQkJYm9vbGVhbiBtb3ZlZCA9IGZhbHNlOwotCQkvLyBvbmx5IG1vdmUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIGVsZW1lbnRzCi0JCWlmIChwYXJ0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBsaW5rZWRQYXJ0ID0gbnVsbDsKLQkJCWludCBwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUjsKLQkJCS8vIGlzIHRoaXMgZWxlbWVudCBsaW5rZWQgdG8gYW5vdGhlciBpdGVtPwotCQkJaWYgKHBhcnQuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSAoKExpbmtFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KDApKS5nZXRTb3VyY2UoKTsKLQkJCQlwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOwotCQkJfSBlbHNlIGlmIChwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmdldCgwKSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJcG9zaXRpb24gPSBQb3NpdGlvbkNvbnN0YW50cy5TT1VUSDsKLQkJCX0KLQkJCWlmIChsaW5rZWRQYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoIShsaW5rZWRQYXJ0LmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmtlZFBhcnQKLQkJCQkJCQkuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCS8vIGdldCB0aGUgcGFydCdzIHBvc2l0aW9uCi0JCQkJUmVjdGFuZ2xlIHBhcnRCb3VuZHMgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCS8vIGdldCB0aGUgbGlua2VkIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBsaW5rZWRQYXJ0Qm91bmRzID0gbGlua2VkUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBkZXRlcm1pbmUgaW4gd2hpY2ggZGlyZWN0aW9uIGlzIHRoZSBsaW5rZWQgcGFydAotCQkJCS8vIGludCBwb3NpdGlvbiA9IHBhcnRCb3VuZHMuZ2V0UG9zaXRpb24obGlua2VkUGFydEJvdW5kcwotCQkJCS8vIC5nZXRMb2NhdGlvbigpKTsKLQkJCQkvLyBhc3N1bWUgaXQgaXMgYmVsb3cgdXMsIHNvIHRoaXMgcGFydCBtb3ZlcyB1cAotCQkJCWludCBkaXJlY3Rpb24gPSAtMTsKLQkJCQlpZiAoKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuTk9SVEgpID09IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRICi0JCQkJCQl8fCAocG9zaXRpb24gJiBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpID09IFBvc2l0aW9uQ29uc3RhbnRzLkNFTlRFUikgewotCQkJCQkvLyBhYm92ZSB1cywgbW92ZSBkb3duCi0JCQkJCWRpcmVjdGlvbiA9IDE7Ci0JCQkJfQotCQkJCS8vIHNldCBuZXcgYm91bmRzIGZvciB0aGUgcGFydCBzbyB0aGF0IGl0IHNpdGVzIGp1c3Qgb3V0c2lkZSBvZgotCQkJCS8vIHRoZSBsaW5rZWQgcGFydAotCQkJCVJlY3RhbmdsZSB0ZXN0Qm91bmRzID0gcGFydEJvdW5kcy5nZXRDb3B5KCk7Ci0JCQkJaWYgKGRpcmVjdGlvbiA9PSAxKSB7Ci0JCQkJCXRlc3RCb3VuZHMueSA9IGxpbmtlZFBhcnRCb3VuZHMueSArIGxpbmtlZFBhcnRCb3VuZHMuaGVpZ2h0Ci0JCQkJCQkJKyBWRVJUX1BJWF9QQURESU5HOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRlc3RCb3VuZHMueSA9IGxpbmtlZFBhcnRCb3VuZHMueSAtIFZFUlRfUElYX1BBRERJTkcKLQkJCQkJCQktIHBhcnRCb3VuZHMuaGVpZ2h0OwotCQkJCX0KLQkJCQkvLyBzZXQgdGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIHBhcnQgaW4gdGhlIG1vZGVsCi0JCQkJUG9pbnQgbnAgPSBuZXcgUG9pbnQodGVzdEJvdW5kcy54LCB0ZXN0Qm91bmRzLnkpOwotCQkJCXBhcnQuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obnApOwotCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKChOb2RlKSBwYXJ0LmdldE1vZGVsKCksIG5wLAotCQkJCQkJcGFydEJvdW5kcy53aWR0aCk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW92ZWQ7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGFkanVzdCB0aGUgc2l6ZSBvZiBlZGl0cGFydC4gIAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RTaXplKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXApIHsKLQkJaWYgKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgewotCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgMSk7Ci0JCX0KLQkJLy8gQmVsb3cgQ29kZSBnZW5lcmljIE5vZGVDb250YWluZXJFZGl0UGFydCBtb2RpZmljYXRpb24uCi0JCWVsc2UgaWYgKGVwIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkvLyBUaGlzIGlzIHRvIGFsbG93IHVzZXIgY3VzdG9taXphYmxlIAotLy8JCQlTdHJpbmcgY291bnQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLS8vCQkJCQkJCS5nZXRTdHJpbmcoVGVtcGxhdGVDb25zdGFudHMuQUREX1JPTEVfVEFTS1NfQ09VTlQpOwotLy8JCQlpZihjb3VudCAhPSBudWxsIHx8IGNvdW50ICE9ICIiKXsKLS8vCQkJCWludCBpID0gSW50ZWdlci5wYXJzZUludChjb3VudCk7Ci0vLwkJCQlpZihpID4gMCl7Ci0vLwkJCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgaSk7Ci0vLwkJCQl9Ci0vLwkJCX1lbHNlewotLy8JCQkJYWRqdXN0U2l6ZSgoTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSBlcCwgNTApOwotLy8JCQl9Ci0JCQlhZGp1c3RTaXplKChOb2RlQ29udGFpbmVyRWRpdFBhcnQpIGVwLCA1MCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBIT1JJWl9QSVhfUEFERElORyA9IDMwOwotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgVkVSVF9QSVhfUEFERElORyA9IDIwOwotCi0JLyoqCi0JICogQWRqdXN0cyB0aGUgc2l6ZSBvZiBDb250YWluZXJFZGl0UGFydCB0byBhY2NvbW9kYXRlIG51bWJlciBvZiBlZGl0cGFydHMgaW4gYSByb3csCi0JICogcHVzaCB0aGUgcmVtYWluaW5nIHRoZSBlZGl0cGFydHMgaW4gdHdvIHNlY29uZCByb3cuIAotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciB7QGxpbmsgVG9vbGJhckxheW91dH0KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRqdXN0U2l6ZShOb2RlQ29udGFpbmVyRWRpdFBhcnQgZXAsIGludCBob3JpekNvdW50KSB7Ci0JCWludCByZXF1aXJlZFdpZHRoID0gMDsKLQkJaW50IHJvd01heEhlaWdodCA9IDA7Ci0JCWludCByb3dzID0gMDsKLQkJaW50IHdpZHRoU3VtID0gMDsKLQkJaW50IGhlaWdodFN1bSA9IDA7Ci0JCWludCBjb2x1bW4gPSAwOwotCQkvL2ludCBvcmlnaW5hbFdpZHRoID0gZXAuZ2V0RmlndXJlKCkuZ2V0U2l6ZSgpLndpZHRoOwotCQlMaXN0IGNoaWxkcmVuID0gZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgcCA9IDA7IHAgPCBjaGlsZHJlbi5zaXplKCk7KSB7Ci0JCQlpZiAoY29sdW1uID09IDApIHsKLQkJCQlyb3dzKys7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uIDwgaG9yaXpDb3VudCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCS5nZXQocCk7Ci0JCQkJRGltZW5zaW9uIGQgPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0JCQkJd2lkdGhTdW0gKz0gZC53aWR0aDsKLQkJCQlpZiAoZC5oZWlnaHQgPiByb3dNYXhIZWlnaHQpIHsKLQkJCQkJcm93TWF4SGVpZ2h0ID0gZC5oZWlnaHQ7Ci0JCQkJfQotCQkJCXArKzsKLQkJCQljb2x1bW4rKzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHdpZHRoU3VtID4gcmVxdWlyZWRXaWR0aCkgewotCQkJCQlyZXF1aXJlZFdpZHRoID0gd2lkdGhTdW07Ci0JCQkJfQotCQkJCWhlaWdodFN1bSArPSByb3dNYXhIZWlnaHQ7Ci0JCQkJcm93TWF4SGVpZ2h0ID0gMDsKLQkJCQl3aWR0aFN1bSA9IDA7Ci0JCQkJY29sdW1uID0gMDsKLQkJCX0KLQkJfQotCQlpZiAod2lkdGhTdW0gPiByZXF1aXJlZFdpZHRoKSB7Ci0JCQlyZXF1aXJlZFdpZHRoID0gd2lkdGhTdW07Ci0JCX0KLQkJaGVpZ2h0U3VtICs9IHJvd01heEhlaWdodDsKLQkJcmVxdWlyZWRXaWR0aCArPSBIT1JJWl9QSVhfUEFERElORwotCQkJCSogTWF0aC5taW4oaG9yaXpDb3VudCwgY2hpbGRyZW4uc2l6ZSgpKTsKLQkJaW50IHJlcXVpcmVkSGVpZ2h0ID0gaGVpZ2h0U3VtICsgKFZFUlRfUElYX1BBRERJTkcgKiByb3dzKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCgoKE5vZGUpIGVwLmdldE1vZGVsKCkpLCBlcAotCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpLCByZXF1aXJlZFdpZHRoKTsKLQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpKTsKLQkJKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5zZXRIZWlnaHQocmVxdWlyZWRIZWlnaHQpOwotCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpKTsKLQkJCWVwLmdldEZpZ3VyZSgpLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQoZXAuZ2V0RmlndXJlKCkpOwotCQkvLyBhZnRlciBsYXlvdXQsIGNoZWNrIHRoZSBib3R0b20tbW9zdCBjaGlsZCBmaWd1cmUgYWdhaW5zdCB0aGUgYm90dG9tCi0JCS8vIG9mIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIgaXMgbmVjZXNzYXJ5Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJR3JhcGhpY2FsRWRpdFBhcnQgbGFzdCA9IChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4uZ2V0KGNoaWxkcmVuCi0JCQkJCS5zaXplKCkgLSAxKTsKLQkJCVBvaW50IGNoaWxkQm90dG9tID0gbGFzdC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRCb3R0b20oKTsKLQkJCVBvaW50IHBhcmVudEJvdHRvbSA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCQkJaW50IGRlbHRhID0gcGFyZW50Qm90dG9tLnkgLSBjaGlsZEJvdHRvbS55IC0gKFZFUlRfUElYX1BBRERJTkcgLyAyKTsKLQkJCWVwLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQgLSBkZWx0YSkpOwotCQkJKChOb2RlKSBlcC5nZXRNb2RlbCgpKS5zZXRIZWlnaHQocmVxdWlyZWRIZWlnaHQgLSBkZWx0YSk7Ci0JCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0IC0gZGVsdGEpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFydCwKLQkJCUxpc3QgY29ubmVjdGVkKSB7Ci0JCS8vIG9ubHkgYWRkIHBhcnRzIGRpcmVjdGx5IG9uIHRoZSBkaWFncmFtIHN1cmZhY2UKLQkJaWYgKCFjb25uZWN0ZWQuY29udGFpbnMocGFydCkpIHsKLQkJCWlmICghKHBhcnQuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJaWYgKCFjb25uZWN0ZWQuY29udGFpbnMocGFydC5nZXRQYXJlbnQoKSkpIHsKLQkJCQkJY29ubmVjdGVkLmFkZChwYXJ0LmdldFBhcmVudCgpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWNvbm5lY3RlZC5hZGQocGFydCk7Ci0JCQl9Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSBudWxsOwotCQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgY2hpbGRyZW4uc2l6ZSgpOyB4KyspIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgY2hpbGRyZW4KLQkJCQkJCS5nZXQoeCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMocCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJCS8vIGlzIHRoaXMgZWxlbWVudCBsaW5rZWQgdG8gYW5vdGhlciBpdGVtPwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0LmdldFRhcmdldENvbm5lY3Rpb25zKCkuc2l6ZSgpOyB4KyspIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoTGlua0VkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFNvdXJjZSgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5zaXplKCk7IHgrKykgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChMaW5rRWRpdFBhcnQpIHBhcnQKLQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpLmdldCh4KSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJZW51bWVyYXRlQ29ubmVjdGVkUGFydHMobGlua2VkUGFydCwgY29ubmVjdGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGZpbmRzIHNpbmdsZSBlbGVtZW50cyBhbmQgZ3JvdXBzIG9mIGVsZW1lbnRzLCBhbmQgcG9zaXRpb25zCi0JICogdGhlbSBzdGFydGluZyBmcm9tIHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0gYW5kIGNvbnRpbnVvdXNseSBkb3duIHRoZSBwYWdlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwYWNrRGlhZ3JhbSgpIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJLy8gc3RhcnQgYXQgdGhlIHRvcCBvZiB0aGUgZGlhZ3JhbQotCQkvLyBEaW1lbnNpb24gZGlhZ3JhbVNpemUgPSBkaWFncmFtLmdldEZpZ3VyZSgpLmdldFNpemUoKTsKLQkJLy8gbm8gbmV3IHNoYXBlcyBjYW4gYmUgbW92ZWQgYWJvdmUgdGhpcyB5LWF4aXMgdmFsdWUKLQkJaW50IHJlc2VydmVkID0gMDsKLQkJLy8gdGhlc2UgYXJlIGVsZW1lbnRzIHdpdGhvdXQgY29ubmVjdGlvbnMKLQkJTGlzdCBzdHJhZ2dsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyB0aGVzZSBhcmUgZ3JvdXBzIG9mIGVsZW1lbnRzIGNvbm5lY3RlZCB3aXRoIGxpbmtzCi0JCUxpc3QgZ3JvdXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyB0aGVzZSBhcmUgdG9wIGxldmVsIHBhcnRzIG9uIHRoZSBkaWFncmFtIHRoYXQgaGF2ZSBiZWVuIGFkZGVkCi0JCUxpc3QgZGlhZ3JhbVBhcnRzID0gZGlhZ3JhbS5nZXRSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkaWFncmFtUGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBkaWFncmFtUGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGcgPSAwOyBnIDwgZ3JvdXBzLnNpemUoKSAmJiBmb3VuZCA9PSBmYWxzZTsgZysrKSB7Ci0JCQkJTGlzdCBncm91cCA9IChMaXN0KSBncm91cHMuZ2V0KGcpOwotCQkJCWlmIChncm91cC5jb250YWlucyhwKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlMaXN0IGNvbm5lY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhwLCBjb25uZWN0ZWQpOwotCQkJCWlmIChjb25uZWN0ZWQuc2l6ZSgpID09IDEpIHsKLQkJCQkJc3RyYWdnbGVycy5hZGQocCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZ3JvdXBzLmFkZChjb25uZWN0ZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBwcm9jZXNzIGVhY2ggZ3JvdXAgY2xvc2VzdCB0byB0aGUgdG9wIChtaW4geSB2YWx1ZSkKLQkJd2hpbGUgKGdyb3Vwcy5zaXplKCkgPiAwKSB7Ci0JCQlMaXN0IHRvcCA9IChMaXN0KSBncm91cHMuZ2V0KDApOwotCQkJaW50IHRvcFkgPSBnZXRWZXJ0aWNhbE1pblBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBncm91cHMuc2l6ZSgpOyB4KyspIHsKLQkJCQlMaXN0IGcgPSAoTGlzdCkgZ3JvdXBzLmdldCh4KTsKLQkJCQlpbnQgeSA9IGdldFZlcnRpY2FsTWluUGFydChnKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCWlmICh5IDwgdG9wWSkgewotCQkJCQl0b3AgPSBnOwotCQkJCQl0b3BZID0geTsKLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgbGltaXQgPSByZXNlcnZlZCArIDE7Ci0JCQlpbnQgdmVydGljYWxEZWx0YSA9IGxpbWl0IC0gdG9wWTsKLQkJCWludCBsZWZ0WCA9IGdldEhvcml6b250YWxNaW5QYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueDsKLQkJCWludCBob3Jpem9udGFsRGVsdGEgPSBIT1JJWl9QSVhfUEFERElORyAtIGxlZnRYOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCB0b3Auc2l6ZSgpOyB4KyspIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgdG9wCi0JCQkJCQkuZ2V0KHgpOwotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKE5vZGUpIHAKLQkJCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQoYm91bmRzLnggKyBob3Jpem9udGFsRGVsdGEsCi0JCQkJCQlib3VuZHMueSArIHZlcnRpY2FsRGVsdGEpLCBib3VuZHMud2lkdGgpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY2JjKTsKLQkJCQlwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLCBib3VuZHMueQotCQkJCQkJCQkrIHZlcnRpY2FsRGVsdGEpKTsKLQkJCX0KLQkJCWludCBib3R0b21ZID0gZ2V0VmVydGljYWxNYXhQYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJLmJvdHRvbSgpOwotCQkJcmVzZXJ2ZWQgPSBib3R0b21ZICsgKFZFUlRfUElYX1BBRERJTkcgKiAyKTsKLQkJCWdyb3Vwcy5yZW1vdmUodG9wKTsKLQkJfQotCQlpbnQgbmV4dCA9IEhPUklaX1BJWF9QQURESU5HOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHN0cmFnZ2xlcnMuc2l6ZSgpOyB4KyspIHsKLQkJCWludCBsaW1pdCA9IHJlc2VydmVkICsgMTsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBzdHJhZ2dsZXJzCi0JCQkJCS5nZXQoeCk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoKE5vZGUpIHAKLQkJCQkJLmdldE1vZGVsKCksIG5ldyBQb2ludChuZXh0LCBsaW1pdCksIGJvdW5kcy53aWR0aCk7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNiYyk7Ci0JCQlwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludChuZXh0LCBsaW1pdCkpOwotCQkJbmV4dCArPSBib3VuZHMud2lkdGggKyBIT1JJWl9QSVhfUEFERElORzsKLQkJfQotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueSA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRIb3Jpem9udGFsTWluUGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54IDwgcmMuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGdldFZlcnRpY2FsTWF4UGFydChMaXN0IHBhcnRzKSB7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcmMgPSBwYXJ0cy5zaXplKCkgPiAwID8gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJLmdldCgwKQotCQkJCTogbnVsbDsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBwYXJ0cy5zaXplKCk7IHgrKykgewotCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIHBhcnRzCi0JCQkJCS5nZXQoeCk7Ci0JCQlpZiAocC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5ib3R0b20oKSA+IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCS5ib3R0b20oKSkgewotCQkJCXJjID0gcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9FbmROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0YmQ5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0VuZE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkVuZE5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLQotLyoqCi0gKiBFZGl0UGFydCBmb3IgRmluYWwob3IgRW5kKSBub2RlIAotICoKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHVibGljIEVuZE5vZGVFZGl0UGFydChUeXBlZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVGaWd1cmUoKQotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRW5kTm9kZUZpZ3VyZSBmID0gbmV3IEVuZE5vZGVGaWd1cmUoKTsKLQkJZi5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQlmLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5yZWQpOwotCQlmLnNldFNpemUoMjQsIDI0KTsKLQkJcmV0dXJuIGY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGE5MmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIAotICogQ29uc3RyYWludCBmb3IgcGxhY2luZyBGcmVlVGV4dCBDZWxsIEVkaXRvci4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQlJRmlndXJlIGZpZ3VyZTsKLQkvKgotCSAqIENyZWF0ZXMgYSBuZXcgRnJlZVRleHRDZWxsRWRpdG9yTG9jYXRvciAKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIExhYmVsCi0JICovCi0JcHVibGljIEZyZWVUZXh0Q2VsbEVkaXRvckxvY2F0b3IoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCUZyZWVUZXh0RmlndXJlIGZpZyA9IChGcmVlVGV4dEZpZ3VyZSlmaWd1cmU7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBjZS5nZXRDb250cm9sKCk7Ci0JCVN0cmluZyBuID0gKFN0cmluZykgY2UuZ2V0VmFsdWUoKTsKLQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCVBvaW50IHNpemUgPSBnYy50ZXh0RXh0ZW50KG4pOwotCQlnYy5kaXNwb3NlKCk7Ci0JCWlmIChzaXplLnggIT0gMCkKLQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQl0ZXh0LnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQlSZWN0YW5nbGUgdGV4dEJvdW5kcyA9IG5ldyBSZWN0YW5nbGUodGV4dC5nZXRDbGllbnRBcmVhKCkueCwgdGV4dAotCQkJCS5nZXRDbGllbnRBcmVhKCkueSwgdGV4dC5nZXRDbGllbnRBcmVhKCkud2lkdGgsIHRleHQKLQkJCQkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCVJlY3RhbmdsZSBmaWdCb3VuZHMgPSBmaWcuZ2V0Q2xpZW50QXJlYSgpOwotCQlmaWcudHJhbnNsYXRlVG9BYnNvbHV0ZShmaWdCb3VuZHMpOwotCQlpbnQgZGVsdGEgPSAoZmlnQm91bmRzLndpZHRoIC0gdGV4dEJvdW5kcy53aWR0aCkgLyAyOwotCQlpbnQgeSA9IGZpZy5nZXRUZXh0Rmxvd1BhZ2UoKS5nZXRMb2NhdGlvbigpLnk7Ci0JCXRleHQuc2V0TG9jYXRpb24oZmlnQm91bmRzLnggKyBkZWx0YSwgeSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmlndXJlKElGaWd1cmUgZmlndXJlKSB7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpZ3VyZS4KLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRGaWd1cmUoKSB7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjM1ZDAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBkaXJlY3QgZWRpdCBvcGVyYXRpb24gYnkgY3JlYXRpbmcgYW5kIG1haW50YWluaW5nIHRoZSAKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3J9IGFuZCBleGVjdXRpbmcgdGhlIHJlc3VsdGluZyBjb21tYW5kIGlmIAotICogdGhlIGNlbGwgZWRpdG9yIHZhbHVlIGhhcyBjaGFuZ2VkLiBTcGVjaWZpY2FsbHkgZm9yIEZyZWVUZXh0LgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCQotCS8qCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCXByaXZhdGUgRm9udCBzY2FsZWRGb250OwotCXByb3RlY3RlZCBJRmlndXJlIGZpZ3VyZTsKLQkKLQlwdWJsaWMgRnJlZVRleHREaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIENsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIElGaWd1cmUgZmlndXJlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJYnJpbmdEb3duKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKGJvb2xlYW4gY2hlY2spIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JCWlmIChjaGVjaykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRPRE86IFJlbW92ZSB0aGlzIGNoZWNrIAotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlPYmplY3Qgd2JlbGVtZW50ID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUeXBlZE5vZGUgJiYgKChUeXBlZE5vZGUpbm9kZSkuZ2V0VHlwZSgpPT1UeXBlZE5vZGUuRlJFRV9URVhUKXsKLQkJCQlHcmFwaE5vZGUgZ25vZGUgPSAoKE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJbmFtZSA9ICgoUHJvcGVydHkpIGdub2RlLmdldFByb3BlcnR5KCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dENlbGxFZGl0b3IgZWRpdG9yID0gKFRleHRDZWxsRWRpdG9yKSBnZXRDZWxsRWRpdG9yKCk7Ci0JCWVkaXRvci5zZXRTdHlsZShTV1QuTVVMVEkpOwotCQlUZXh0IHQgPSAoVGV4dCkgZWRpdG9yLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9ICgoTm9kZUVkaXRQYXJ0KSB0aGlzLmdldEVkaXRQYXJ0KCkpCi0JCQkJLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JCWVkaXRvci5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJRm9udCBmID0gZmlndXJlLmdldEZvbnQoKTsKLQkJRm9udE1ldHJpY3MgZm0gPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZik7Ci0JCWludCBoID0gZm0uZ2V0SGVpZ2h0KCk7Ci0JCWludCB3ID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQl0LnNldFNpemUoaW5pdGlhbExhYmVsVGV4dC5sZW5ndGgoKSp3KzEwMCwgaCs1MCk7Ci0JCi0JCWlmKGYgIT0gbnVsbCkKLQkJCXQuc2V0Rm9udChmKTsKLQkJZWxzZQotCQkJdC5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXQuc2VsZWN0QWxsKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJaWYgKHZlcmlmeUxpc3RlbmVyICE9IG51bGwpCi0JCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTm9kZUVkaXRQYXJ0IHBhcnQsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMucGFydCA9IHBhcnQ7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZyk7IAotCQkJcGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0RWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjFjMDVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBkaXJlY3QgZWRpdGluZywgZnJlZSB0ZXh0IHByb3BlcnRpZXMgY2hhbmdlcyBsaWtlIGZvbnQsIGNvbG9yIGFuZCB0ZXh0LgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZyZWVUZXh0RWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCi0JcHJpdmF0ZSBGb250RGF0YSBmRGF0YTsKLQotCXByaXZhdGUgTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQlwdWJsaWMgRnJlZVRleHRFZGl0UGFydChOb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQkJcGFydCA9IHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlMYWJlbCBsID0gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCQlsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQlsLnNldFRleHRQbGFjZW1lbnQoUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQlyZXR1cm4gbDsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWlmICghKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQkJY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbmV3IENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kKHBhcnQsIChTdHJpbmcpIHJlcXVlc3QKLQkJCQkJCS5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNob3dDdXJyZW50RWRpdFZhbHVlKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQkJKChMYWJlbCkgZmlnKS5zZXRUZXh0KChTdHJpbmcpIHJlcXVlc3QuZ2V0Q2VsbEVkaXRvcigpCi0JCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQlmaWcuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdC5nZXRUeXBlKCkgPT0gUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQKLQkJCQkmJiAhKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5wZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlJRmlndXJlIGZpZyA9IGdldERpcmVjdEVkaXRGaWd1cmUoKTsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBsID0gKExhYmVsKSBmaWc7Ci0JCQlMaXN0IGFsaXN0ID0gKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXRQcm9wZXJ0eSgpOwotCQkJU3RyaW5nIGZvbnROYW1lID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX05BTUU7Ci0JCQlpbnQgZm9udFN0eWxlID0gU1dULk5PUk1BTDsKLQkJCWludCBmb250SGVpZ2h0ID0gVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UX1NJWkU7Ci0JCQlpbnQgZm9udFJlZCA9IFNXVC5DT0xPUl9SRUQ7Ci0JCQlpbnQgZm9udEJsdWUgPSBTV1QuQ09MT1JfQkxVRTsKLQkJCWludCBmb250R3JlZW4gPSBTV1QuQ09MT1JfR1JFRU47Ci0KLQkJCWlmIChhbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBhbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBpb3IubmV4dCgpOwotCQkJCQlpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQkJCWwuc2V0VGV4dChwcm9wLmdldFZhbHVlKCkpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSkpIHsKLQkJCQkJCWZvbnROYW1lID0gcHJvcC5nZXRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfU1RZTEUpKSB7Ci0JCQkJCQlmb250U3R5bGUgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpKSB7Ci0JCQkJCQlmb250SGVpZ2h0ID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVEKSkgewotCQkJCQkJZm9udFJlZCA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpKSB7Ci0JCQkJCQlmb250Qmx1ZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKSkgewotCQkJCQkJZm9udEdyZWVuID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsLnNldFRleHQoKChOb2RlKSBnZXRNb2RlbCgpKS5nZXRHcmFwaE5vZGUoKS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKGZvbnQgIT0gbnVsbCAmJiAhZm9udC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlmb250LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChjb2xvciAhPSBudWxsICYmICFjb2xvci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQljb2xvci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmRGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgZm9udEhlaWdodCwgZm9udFN0eWxlKTsKLQkJCWZvbnQgPSBuZXcgRm9udChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKSwgZkRhdGEpOwotCQkJY29sb3IgPSBuZXcgQ29sb3IobnVsbCwgZm9udFJlZCwgZm9udEdyZWVuLCBmb250Qmx1ZSk7Ci0JCQlsLnNldEZvbnQoZm9udCk7Ci0KLQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJZm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJY29sb3IuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvRnJlZVRleHROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxOWVmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0ZyZWVUZXh0Tm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkZyZWVUZXh0RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBkaXJlY3QgZWRpdGluZywgdGV4dCBmb250LCBjb2xvciBhbmQgc2l6ZSBjaGFuZ2VzLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgRnJlZVRleHROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCXByaXZhdGUgRm9udCBmb250OwotCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQotCXByaXZhdGUgRm9udERhdGEgZkRhdGE7Ci0KLQlwcml2YXRlIE5vZGVFZGl0UGFydCBwYXJ0OwotCi0JcHVibGljIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCQlwYXJ0ID0gdGhpczsgCi0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZyZWVUZXh0RmlndXJlIGwgPSBuZXcgRnJlZVRleHRGaWd1cmUoKTsKLQkJcmV0dXJuIGw7Ci0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVFZGl0UG9saWNpZXMoKTsKLQkJaWYgKCEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCQljcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbmV3IERpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREaXJlY3RFZGl0Q29tbWFuZChEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBDaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZChwYXJ0LCAoU3RyaW5nKSByZXF1ZXN0Ci0JCQkJCQkuZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBzaG93Q3VycmVudEVkaXRWYWx1ZShEaXJlY3RFZGl0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCQkJaWYgKGZpZyBpbnN0YW5jZW9mIEZyZWVUZXh0RmlndXJlKSB7Ci0JCQkJCSgoRnJlZVRleHRGaWd1cmUpIGZpZykuc2V0VGV4dCgoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJZmlnLmdldFVwZGF0ZU1hbmFnZXIoKS5wZXJmb3JtVXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZS5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRToKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0LmdldFR5cGUoKSA9PSBSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVAotCQkJCSYmICEoKE5vZGUpIGdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSkgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQlpZiAoZmlnIGluc3RhbmNlb2YgRnJlZVRleHRGaWd1cmUpIHsKLQkJCUZyZWVUZXh0RmlndXJlIGwgPSAoRnJlZVRleHRGaWd1cmUpIGZpZzsKLQkJCUxpc3QgYWxpc3QgPSAoKE5vZGUpIGdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpLmdldFByb3BlcnR5KCk7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCWludCBmb250U3R5bGUgPSBTV1QuTk9STUFMOwotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWludCBmb250UmVkID0gU1dULkNPTE9SX1JFRDsKLQkJCWludCBmb250Qmx1ZSA9IFNXVC5DT0xPUl9CTFVFOwotCQkJaW50IGZvbnRHcmVlbiA9IFNXVC5DT0xPUl9HUkVFTjsKLQotCQkJaWYgKGFsaXN0LnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGlvciA9IGFsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGlvci5uZXh0KCk7Ci0JCQkJCWlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUKSkgewotCQkJCQkJbC5zZXRUZXh0KHByb3AuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9OQU1FKSkgewotCQkJCQkJZm9udE5hbWUgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSkpIHsKLQkJCQkJCWZvbnRTdHlsZSA9IG5ldyBJbnRlZ2VyKHByb3AuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsKLQkJCQkJfSBlbHNlIGlmIChwcm9wLmdldEtleSgpLmVxdWFscygKLQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCkpIHsKLQkJCQkJCWZvbnRIZWlnaHQgPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0gZWxzZSBpZiAocHJvcC5nZXRLZXkoKS5lcXVhbHMoCi0JCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpKSB7Ci0JCQkJCQlmb250UmVkID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfQkxVRSkpIHsKLQkJCQkJCWZvbnRCbHVlID0gbmV3IEludGVnZXIocHJvcC5nZXRWYWx1ZSgpKS5pbnRWYWx1ZSgpOwotCQkJCQl9IGVsc2UgaWYgKHByb3AuZ2V0S2V5KCkuZXF1YWxzKAotCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfR1JFRU4pKSB7Ci0JCQkJCQlmb250R3JlZW4gPSBuZXcgSW50ZWdlcihwcm9wLmdldFZhbHVlKCkpLmludFZhbHVlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWwuc2V0VGV4dCgoKE5vZGUpIGdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlpZiAoZm9udCAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSkgewotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQkJaWYgKGNvbG9yICE9IG51bGwgJiYgIWNvbG9yLmlzRGlzcG9zZWQoKSkgewotCQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZEYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBmb250SGVpZ2h0LCBmb250U3R5bGUpOwotCQkJZm9udCA9IG5ldyBGb250KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLCBmRGF0YSk7Ci0JCQljb2xvciA9IG5ldyBDb2xvcihudWxsLCBmb250UmVkLCBmb250R3JlZW4sIGZvbnRCbHVlKTsKLQkJCWwuc2V0Rm9udChmb250KTsKLQotCQkJbC5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGNyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkgewotCQlGcmVlVGV4dEZpZ3VyZSBsID0gKEZyZWVUZXh0RmlndXJlKSBnZXRGaWd1cmUoKTsKLQkJcmV0dXJuIG5ldyBGcmVlVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBGcmVlVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiBnZXRGaWd1cmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0I2RlYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQlTdHJpbmcgZ2V0RGlyZWN0RWRpdFRleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJLy9yZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBGcmVlVGV4dEZpZ3VyZSkgewotCQkJcmV0dXJuICgoRnJlZVRleHRGaWd1cmUpIGZpZykuZ2V0VGV4dCgpOwotCQl9IAotCQlyZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsQ2VsbEVkaXRvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk4NDE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxDZWxsRWRpdG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIENvbnN0cmFpbnQgZm9yIExhYmVsIHBsYWNpbmcuIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgTGFiZWxDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCXByaXZhdGUgSUZpZ3VyZSBmaWc7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgV0lOX1hfT0ZGU0VUID0gLTQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgV0lOX1dfT0ZGU0VUID0gNTsKLQotCXByaXZhdGUgc3RhdGljIGludCBHVEtfWF9PRkZTRVQgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IEdUS19XX09GRlNFVCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFDX1hfT0ZGU0VUID0gLTM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFDX1dfT0ZGU0VUID0gOTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfWV9PRkZTRVQgPSAtMzsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQUNfSF9PRkZTRVQgPSA2OwotCi0JcHVibGljIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJZmlnID0gZmlndXJlOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvciNyZWxvY2F0ZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IpCi0JICovCi0KLQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCi0JCVJlY3RhbmdsZSByZWN0ID0gbnVsbDsKLQkJaWYgKGZpZyBpbnN0YW5jZW9mIExhYmVsKQotCQkJcmVjdCA9ICgoTGFiZWwpIGZpZykuZ2V0VGV4dEJvdW5kcygpLmludGVyc2VjdChmaWcuZ2V0Q2xpZW50QXJlYSgpKTsKLQkJZWxzZQotCQkJcmVjdCA9IGZpZy5nZXRDbGllbnRBcmVhKFJlY3RhbmdsZS5TSU5HTEVUT04pOwotCQlmaWcudHJhbnNsYXRlVG9BYnNvbHV0ZShyZWN0KTsKLQotCQlpbnQgeE9mZnNldCA9IDA7Ci0JCWludCB3T2Zmc2V0ID0gMDsKLQkJaW50IHlPZmZzZXQgPSAwOwotCQlpbnQgaE9mZnNldCA9IDA7Ci0KLQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFsc0lnbm9yZUNhc2UoImd0ayIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXhPZmZzZXQgPSBHVEtfWF9PRkZTRVQ7Ci0JCQl3T2Zmc2V0ID0gR1RLX1dfT0ZGU0VUOwotCQl9IGVsc2UgaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFsc0lnbm9yZUNhc2UoImNhcmJvbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXhPZmZzZXQgPSBNQUNfWF9PRkZTRVQ7Ci0JCQl3T2Zmc2V0ID0gTUFDX1dfT0ZGU0VUOwotCQkJeU9mZnNldCA9IE1BQ19ZX09GRlNFVDsKLQkJCWhPZmZzZXQgPSBNQUNfSF9PRkZTRVQ7Ci0JCX0gZWxzZSB7Ci0JCQl4T2Zmc2V0ID0gV0lOX1hfT0ZGU0VUOwotCQkJd09mZnNldCA9IFdJTl9XX09GRlNFVDsKLQkJfQotCi0JCXRleHQuc2V0Qm91bmRzKHJlY3QueCArIHhPZmZzZXQsIHJlY3QueSArIHlPZmZzZXQsCi0JCQkJcmVjdC53aWR0aCArIHdPZmZzZXQsIHJlY3QuaGVpZ2h0ICsgaE9mZnNldCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9MYWJlbERpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwZjkyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgZGlyZWN0IGVkaXQgb3BlcmF0aW9uIGJ5IGNyZWF0aW5nIGFuZCBtYWludGFpbmluZyB0aGUgCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yfSBhbmQgZXhlY3V0aW5nIHRoZSByZXN1bHRpbmcgY29tbWFuZCBpZiAKLSAqIHRoZSBjZWxsIGVkaXRvciB2YWx1ZSBoYXMgY2hhbmdlZC4gRm9yIHtAbGluayBMYWJlbH0uCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGFiZWxEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXB1YmxpYyBMYWJlbERpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwgQ2xhc3MgZWRpdG9yVHlwZSwKLQkJCUNlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bigpIHsKLQkJLy8gVGhpcyBtZXRob2QgbWlnaHQgYmUgcmUtZW50ZXJlZCB3aGVuIHN1cGVyLmJyaW5nRG93bigpIGlzIGNhbGxlZC4KLQkJRm9udCBkaXNwb3NlRm9udCA9IHNjYWxlZEZvbnQ7Ci0JCXNjYWxlZEZvbnQgPSBudWxsOwotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGRpc3Bvc2VGb250ICE9IG51bGwpCi0JCQlkaXNwb3NlRm9udC5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENlbGxFZGl0b3IoKSB7Ci0JCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCi0JCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShnZXRJbml0aWFsVGV4dCgpKTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRFZGl0UGFydCgpLmdldEZpZ3VyZSgpOwotCQlzY2FsZWRGb250ID0gZmlndXJlLmdldEZvbnQoKTsKLQkJRm9udERhdGEgZGF0YSA9IHNjYWxlZEZvbnQuZ2V0Rm9udERhdGEoKVswXTsKLQkJRGltZW5zaW9uIGZvbnRTaXplID0gbmV3IERpbWVuc2lvbigwLCBkYXRhLmdldEhlaWdodCgpKTsKLQkJZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNlbGwgZWRpdG9yIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUuIFRoZSBjZWxsIGVkaXRvciBpcwotCSAqIGNyZWF0ZWQgYnkgaW5zdGFudGlhdGluZyB0aGUgY2VsbCBlZGl0b3IgdHlwZSBwYXNzZWQgaW50byB0aGlzCi0JICogRGlyZWN0RWRpdE1hbmFnZXIncyBjb25zdHVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiAgICAgICAgICAgIHRoZSBjb21wb3NpdGUgdG8gY3JlYXRlIHRoZSBjZWxsIGVkaXRvciBvbgotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgY2VsbCBlZGl0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBjcmVhdGVDZWxsRWRpdG9yT24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZXR1cm4gbmV3IFRleHRDZWxsRWRpdG9yKGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULldSQVApOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHRleHQgc2hvd24gaW4gdGhlIGNlbGwgZWRpdG9yIGZvcgotCSAqICAgICAgICAgZGlyZWN0LWVkaXRpbmc7IGNhbm5vdCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxUZXh0KCkgewotCQlyZXR1cm4gKChCYXNlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpLmdldERpcmVjdEVkaXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIGluaXRpYWwgdGV4dCBvZiB0aGUgY2VsbCBlZGl0b3IgYW5kIHRvIGRldGVybWluZQotCSAqIHRoZSBmb250IHNpemUgb2YgdGhlIHRleHQuCi0JICogCi0JICogQHJldHVybiB0aGUgZmlndXJlIGJlaW5nIGVkaXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiAoKEJhc2VFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxZWQ0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBUZXh0IHBsYWNpbmcuIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yIGltcGxlbWVudHMgQ2VsbEVkaXRvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IgZm9yIHRoZSBnaXZlbiBMYWJlbAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgdGhlIExhYmVsCi0JICovCi0JcHVibGljIExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCXNldExhYmVsKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENlbGxFZGl0b3JMb2NhdG9yI3JlbG9jYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxvY2F0ZShDZWxsRWRpdG9yIGNlbGxlZGl0b3IpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQlQb2ludCBwcmVmID0gdGV4dC5jb21wdXRlU2l6ZSgtMSwgLTEpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGxhYmVsLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCWxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCXRleHQuc2V0Qm91bmRzKHJlY3QueCAtIDEsIHJlY3QueSAtIDEsIHByZWYueCArIDEsIHByZWYueSArIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIExhYmVsIGZpZ3VyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBMYWJlbAotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGlua0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L0xpbmtFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmJjYmRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTGlua0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWdvbkRlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlTGlua0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5MaW5rQmVuZHBvaW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLkxpbmtFbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5WYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgdG8gdXBkYXRlIHRoZSBhcHBlYXJhbmNlLCBhbmQgaW5zdGFsbHMgdGhlIGVkaXRwb2xpY2llcwotICogc3BlY2lmaWMgdGhlIHtAbGluayBMaW5rfSBhbmQgbGlzdGVucyB0byBjaGFuZ2VzIGluIHRoZSBkaWFncmFtIG1vZGVsLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0IHsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JcHVibGljIExpbmtFZGl0UGFydChMaW5rIGNvbm4pIHsKLQkJc3VwZXIoKTsKLQkJc2V0TW9kZWwoY29ubik7Ci0JfQotCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWdldExpbmsoKS5lQWRhcHRlcnMoKS5hZGQobW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdFBvbGljaWVzKCkgewotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTk5FQ1RJT05fRU5EUE9JTlRTX1JPTEUsCi0JCQkJbmV3IExpbmtFbmRwb2ludEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuQ09OTkVDVElPTl9ST0xFLAotCQkJCW5ldyBDb25uZWN0aW9uRWRpdFBvbGljeSgpIHsKLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIHJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkuZ2V0KAotCQkJCQkJCQlEZWxldGVDb21tYW5kLktFWV9QRVJNX0RFTEVURSk7Ci0JCQkJCQlib29sZWFuIHBlcm1EZWxldGUgPSBib29sID09IG51bGwgPyBmYWxzZSA6IGJvb2wKLQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJcmV0dXJuIG5ldyBEZWxldGVMaW5rQ29tbWFuZCgoTGluaykgZ2V0SG9zdCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpLCBwZXJtRGVsZXRlKTsKLQkJCQkJfQotCQkJCX0pOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTk5FQ1RJT05fQkVORFBPSU5UU19ST0xFLAotCQkJCW5ldyBMaW5rQmVuZHBvaW50RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVBvbHlsaW5lQ29ubmVjdGlvbiBjb25uID0gbmV3IFBvbHlsaW5lQ29ubmVjdGlvbigpOwotCQljb25uLnNldFRhcmdldERlY29yYXRpb24obmV3IFBvbHlnb25EZWNvcmF0aW9uKCkpOwotCQl1cGRhdGVBcHBlYXJhbmNlKCk7Ci0JCXJldHVybiBjb25uOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVBcHBlYXJhbmNlKCkgewotCQlpZiAoZmlndXJlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpbmsgbGluayA9IChMaW5rKSBnZXRNb2RlbCgpOwotCQlpZiAoVmFsaWRhdGlvbi5pc1JlYWRPbmx5KGxpbmspKSB7Ci0JCQlmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCWdldExpbmsoKS5lQWRhcHRlcnMoKS5yZW1vdmUobW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBnZXRMaW5rKCkgewotCQlyZXR1cm4gKExpbmspIGdldE1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKExpbmsuY2xhc3MpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFM6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQlyZWZyZXNoVGFyZ2V0QW5jaG9yKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCXJlZnJlc2hTb3VyY2VBbmNob3IoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXVwZGF0ZUFwcGVhcmFuY2UoKTsKLQkJZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldFJvdXRpbmdDb25zdHJhaW50KGdldExpbmsoKS5nZXRCZW5kcG9pbnRzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvTmFtZWROb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiNTIyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05hbWVkTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DaGFuZ2VOYW1lQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLS8qKgotICogRGlhZ3JhbSBjaGlsZHJlbiBzaG91bGQgZXh0ZW5kIHRoaXMgTmFtZWROb2RlRWRpdFBhcnQgaW4gb3JkZXIgdG8gc3VwcG9ydCBuYW1lIGZvciBmaWd1cmUuCi0gKiBOYW1lZE5vZGVFZGl0UGFydCBwcm92aWRlcyBpbnN0cnVjdHVyZSB0byBoYW5kbGUgdGhlIG5hbWUgd3JhcHBpbmcgYW5kIGNvbG9yLiBTdXBwb3J0IGRpcmVjdCAKLSAqIGVkaXRpbmcgZmVlZGJhY2suICAgCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOb2RlRWRpdFBhcnQgewotCi0JcHVibGljIE5hbWVkTm9kZUVkaXRQYXJ0KE5hbWVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlMYWJlbCBsID0gbmV3IFNlbGVjdGFibGVMYWJlbCgpOwotCQlsLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQlpZiAoZ2V0SW1hZ2UoKSAhPSBudWxsKSB7Ci0JCQlsLnNldEljb24oZ2V0SW1hZ2UoKSk7Ci0JCX0KLQkJbC5zZXRUZXh0UGxhY2VtZW50KFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKTsKLQkJbC5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXNldExhYmVsRm9yZWdyb3VuZENvbG9yKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TGFiZWxGb3JlZ3JvdW5kQ29sb3IoTGFiZWwgbCkgewotCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldE1vZGVsKCk7Ci0JCS8vIE9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJLy8gYm9vbGVhbiBzdXBwcmVzc2VkID0gaXNTdXBwcmVzc2VkKGUpOwotCQlib29sZWFuIHN1cHByZXNzZWQgPSBub2RlLmlzU3VwcHJlc3NlZCgpOwotCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCWlmICghc3VwcHJlc3NlZCkgewotCQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9ycy5JTkhFUklURURfRUxFTUVOVF9MQUJFTCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQlsLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN1cHByZXNzZWQpIHsKLQkJCWwuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9ycy5TVVBSRVNTRURfRUxFTUVOVF9MQUJFTCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWlmICghKChOb2RlKSBnZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpIHsKLQkJCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQkJY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBEaXJlY3RFZGl0UG9saWN5IGNyZWF0ZURpcmVjdEVkaXRQb2xpY3koKSB7Ci0JCXJldHVybiBuZXcgRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldERpcmVjdEVkaXRDb21tYW5kKERpcmVjdEVkaXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbmV3IENoYW5nZU5hbWVDb21tYW5kKChOYW1lZE5vZGUpIGdldE1vZGVsKCksCi0JCQkJCQkoU3RyaW5nKSByZXF1ZXN0LmdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2hvd0N1cnJlbnRFZGl0VmFsdWUoRGlyZWN0RWRpdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCUlGaWd1cmUgZmlnID0gZ2V0RGlyZWN0RWRpdEZpZ3VyZSgpOwotCQkJCVN0cmluZyBzID0gKFN0cmluZykgcmVxdWVzdC5nZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZmlnIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQkJKChMYWJlbCkgZmlnKS5zZXRUZXh0KHMpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmaWcgaW5zdGFuY2VvZiBUZXh0RmlndXJlKSB7Ci0JCQkJCSgoVGV4dEZpZ3VyZSkgZmlnKS5zZXRUZXh0KHMpOwotCQkJCX0KLQkJCQlmaWcuZ2V0VXBkYXRlTWFuYWdlcigpLnBlcmZvcm1VcGRhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTmFtZWROb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QuZ2V0VHlwZSgpID09IFJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVF9FRElUCi0JCQkJJiYgISgoTm9kZSkgZ2V0TW9kZWwoKSkuaXNSZWFkT25seSgpKSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9IGVsc2UgewotCQkJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXUkFQX1dJRFRIID0gMTI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfV1JBUF9XSURUSCA9IDM7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgbCA9IChMYWJlbCkgZmlnOwotCQkJc2V0TGFiZWxGb3JlZ3JvdW5kQ29sb3IobCk7Ci0JCQlTdHJpbmcgdGV4dDsKLQkJCS8vIEJlbG93IGNoZWNrIGlzIHJlcXVpcmVkIGZvciBFeHRlbmRlZCBBY3Rpdml0eSBwcmVzZW50YXRpb24gbmFtZQotCQkJLy8gc2hvdWxkIGJlIHVzZWQgZnJvbSBiYXNlLgotCQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIGdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCkpIHsKLQkJCQkJdGV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGV4dCA9ICgoTmFtZWROb2RlKSBnZXRNb2RlbCgpKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQKLQkJCQkJCXx8IGdldFBhcmVudCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJaW50IHcgPSBXUkFQX1dJRFRIOwotCQkJCQlpZiAodGhpcy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkKLQkJCQkJCXcgPSBXT1JLX1BST0RVQ1RfV1JBUF9XSURUSDsKLQkJCQkJCi0JCQkJCWlmKHRoaXMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIAotCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuaXNBdXRvTGF5b3V0KAotCQkJCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0TW9kZWwoKSkpewotCQkJCQkJLy8gVXNlZCAxNiBhcyBtaW4gbGVuZ3RoIGZvciB0YXNrbmFtZSwgZWxzZSBhZGQgc3BhY2VzIHRvIGl0LgotCQkJCQkJLy8gVE9ETzogZmluZCBiZXR0ZXIgc29sdXRpb24gZm9yIHRoaXMuCi0JCQkJCQlpZih0ZXh0Lmxlbmd0aCgpIDwgMTYpewotCQkJCQkJCWludCBnYXAgPSAxNiAtIHRleHQubGVuZ3RoKCk7Ci0JCQkJCQkJZm9yKGludCBpPTA7IGk8Z2FwLzI7IGkrKyl7Ci0JCQkJCQkJCXRleHQrPSIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlmb3IoaW50IGk9MDsgaTxnYXAvMjsgaSsrKXsKLQkJCQkJCQkJdGV4dCA9ICIgIit0ZXh0OyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXRleHQgPSB3cmFwKHRleHQsIHcpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJfQotCQkJbC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB3cmFwKFN0cmluZyBzLCBpbnQgd3JhcFdpZHRoKSB7Ci0JCVN0cmluZyB3cmFwcGVkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQnJlYWtJdGVyYXRvciBiaSA9IEJyZWFrSXRlcmF0b3IuZ2V0TGluZUluc3RhbmNlKCk7Ci0JCVN0cmluZyByZW1haW5pbmcgPSBzOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKHJlbWFpbmluZy5sZW5ndGgoKSA8PSB3cmFwV2lkdGgpIHsKLQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJYmkuc2V0VGV4dChyZW1haW5pbmcpOwotCQkJCWludCBwb3MgPSBiaS5mb2xsb3dpbmcod3JhcFdpZHRoKTsKLQkJCQlpZiAocG9zID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHBvcyA+PSByZW1haW5pbmcubGVuZ3RoKCkpIHsKLQkJCQkJCXdyYXBwZWQgKz0gcmVtYWluaW5nOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZy5zdWJzdHJpbmcoMCwgcG9zKSArICJcbiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcocG9zKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd3JhcHBlZDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlQ29udGFpbmVyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyMTg1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVDb250YWluZXJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5CZW5kcG9pbnRDb25uZWN0aW9uUm91dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZhblJvdXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzLk5vZGVDb250YWluZXJFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQucG9saWNpZXMuTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29tcG9uZW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLQotLyoqCi0gKiBOb2RlQ29udGFpbmVyRWRpdFBhcnQgbWFuYWdlcyB0aGUgY2hpbGQgZWRpdHBhcnRzIGluIGEge0BsaW5rIEdyYXBoaWNhbFZpZXdlcn0uCi0gKiBQcm92aWRlcyBpbnN0cnVjdHVyZSB0byBoYW5kbGUgdGhlIG5vdGlmaWNhdGlvbnMgZnJvbSBtb2RlbC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVDb250YWluZXJFZGl0UGFydCBleHRlbmRzIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQKLQkJaW1wbGVtZW50cyBMYXllckNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIEJlbmRwb2ludENvbm5lY3Rpb25Sb3V0ZXIgY1JvdXRlcjsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG1vZGVsTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JCX0KLQl9OwotCi0JcHVibGljIE5vZGVDb250YWluZXJFZGl0UGFydChOb2RlQ29udGFpbmVyIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJTm9kZUNvbnRhaW5lciBtb2RlbCA9IChOb2RlQ29udGFpbmVyKSAoKEVPYmplY3QpIGdldE1vZGVsKCkpOwotCQltb2RlbC5lQWRhcHRlcnMoKS5hZGQobW9kZWxMaXN0ZW5lcik7Ci0JCW1vZGVsLmFkZENvbnN1bWVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT01QT05FTlRfUk9MRSwgbmV3IENvbXBvbmVudEVkaXRQb2xpY3koKSB7Ci0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCQkJQm9vbGVhbiBib29sID0gKEJvb2xlYW4pIGRlbGV0ZVJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkuZ2V0KAotCQkJCQkJRGVsZXRlQ29tbWFuZC5LRVlfUEVSTV9ERUxFVEUpOwotCQkJCWJvb2xlYW4gcGVybURlbGV0ZSA9IGJvb2wgPT0gbnVsbCA/IGZhbHNlIDogYm9vbC5ib29sZWFuVmFsdWUoKTsKLQkJCQlEZWxldGVDb21tYW5kIGNtZCA9IG5ldyBEZWxldGVDb21tYW5kKHBlcm1EZWxldGUpOwotCQkJCWNtZC5zZXRQYXJ0VG9CZURlbGV0ZWQoZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQkJCXJldHVybiBjbWQ7Ci0JCQl9Ci0JCX0pOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBudWxsKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05UQUlORVJfUk9MRSwKLQkJCQluZXcgTm9kZUNvbnRhaW5lckVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTk9ERV9ST0xFLCBudWxsKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwKLQkJCQluZXcgTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCU5vZGVDb250YWluZXIgbW9kZWwgPSAoTm9kZUNvbnRhaW5lcikgKChFT2JqZWN0KSBnZXRNb2RlbCgpKTsKLQkJbW9kZWwuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGVsTGlzdGVuZXIpOwotCQltb2RlbC5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGZpbmRDaGlsZEJ5TW9kZWwoT2JqZWN0IG1vZGVsKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBjaGlsZCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQuZ2V0TW9kZWwoKSA9PSBtb2RlbCkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYXJ0VG9FZGl0KENvbGxlY3Rpb24gcGFydHNUb0VkaXQsIE9iamVjdCBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IGZpbmRDaGlsZEJ5TW9kZWwobm9kZSk7Ci0JCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBCYXNlRWRpdFBhcnQpIHsKLQkJCQlEaXJlY3RFZGl0TWFuYWdlciBlZGl0TWFuYWdlciA9ICgoQmFzZUVkaXRQYXJ0KSBlZGl0UGFydCkKLQkJCQkJCS5nZXREaXJlY3RFZGl0TWFuYWdlcigpOwotCQkJCWlmIChlZGl0TWFuYWdlciBpbnN0YW5jZW9mIFZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkJJiYgKChWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIpIGVkaXRNYW5hZ2VyKQotCQkJCQkJCQkudmFsaWRhdGUoKChOYW1lZE5vZGUpIG5vZGUpLmdldE5hbWUoKSkgIT0gbnVsbCkgewotCQkJCQlwYXJ0c1RvRWRpdC5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlQ29udGFpbmVyLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQlyZWZyZXNoVmlzdWFscygpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJcmVmcmVzaFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoVGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQotCQkJTGlzdCBwYXJ0c1RvRWRpdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJYWRkUGFydFRvRWRpdChwYXJ0c1RvRWRpdCwgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGdldFZpZXdlcigpLmdldENvbnRyb2woKS5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFydHNUb0VkaXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJhc2VFZGl0UGFydCBlZGl0UGFydCA9IChCYXNlRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCQllZGl0UGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE1vZGVsKCk7Ci0JCURpbWVuc2lvbiBzaXplID0gbmV3IERpbWVuc2lvbihub2RlLmdldFdpZHRoKCksIG5vZGUuZ2V0SGVpZ2h0KCkpOwotCQlpZiAoc2l6ZSA9PSBudWxsKSB7Ci0JCQlzaXplID0gbmV3IERpbWVuc2lvbig2MCwgMTAwKTsKLQkJfQotCQlQb2ludCBsb2MgPSBub2RlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChsb2MgPT0gbnVsbCkgewotCQkJbG9jID0gbmV3IFBvaW50KDEwLCAxMCk7Ci0JCX0KLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGxvYywgc2l6ZSk7Ci0KLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgcik7Ci0KLQkJaWYgKGNSb3V0ZXIgPT0gbnVsbCkgewotCQkJQ29ubmVjdGlvbkxheWVyIGNMYXllciA9IChDb25uZWN0aW9uTGF5ZXIpIGdldExheWVyKENPTk5FQ1RJT05fTEFZRVIpOwotCQkJRmFuUm91dGVyIHJvdXRlciA9IG5ldyBGYW5Sb3V0ZXIoKTsKLQkJCXJvdXRlci5zZXRTZXBhcmF0aW9uKDMwKTsKLQkJCWNSb3V0ZXIgPSBuZXcgQmVuZHBvaW50Q29ubmVjdGlvblJvdXRlcigpOwotCQkJcm91dGVyLnNldE5leHRSb3V0ZXIoY1JvdXRlcik7Ci0JCQljTGF5ZXIuc2V0Q29ubmVjdGlvblJvdXRlcihyb3V0ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuICgoTm9kZUNvbnRhaW5lcikgZ2V0TW9kZWwoKSkuZ2V0Tm9kZXMoKTsKLQl9Ci0JCi0JLyoqCi0JICogT25seSB1c2VmdWwgaW4gY2FzZSBvZiBBREQuIFBsYWNlZCBoZXJlIGluIG9yZGVyIHRvIGludm9rZSBpbiBzdWIgY2xhc3Nlcy4KLQkgKiBUT0RPOiAgTW92ZSB0aGlzIG1ldGhvZCB0byB1dGlsaXR5IGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKEVkaXRQYXJ0IHBhcnQpIHsKLQkJRWRpdFBhcnQgZGVwID0gKEVkaXRQYXJ0KSBwYXJ0LmdldFBhcmVudCgpOwotCQlpZihkZXAgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCApewotCQkJCi0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBhZGQgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KWRlcCk7Ci0JCQlpZighKChEaWFncmFtKWFkZC5nZXRNb2RlbCgpKS5pc1JlYWRPbmx5KCkpewotCQkJCWFkZC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwoZGVwLmdldENoaWxkcmVuKCkpOwotCQkKLQkJCQkvLyBjbGVhbiB1cCB0aGUgZGlhZ3JhbQotCQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4obnVsbCk7Ci0JCQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkgPSBuZXcgQWN0aW9uUmVnaXN0cnkoKTsKLQkJCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UgYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uU2VydmljZSgKLQkJCQkJCShHcmFwaGljYWxWaWV3ZXIpZ2V0UGFyZW50KCkuZ2V0Vmlld2VyKCksIGVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQkJCi0JCQkJRGlhZ3JhbVVwZGF0ZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtVXBkYXRlU2VydmljZSgKLQkJCQkJCShHcmFwaGljYWxWaWV3ZXIpZ2V0UGFyZW50KCkuZ2V0Vmlld2VyKCksIGVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ob2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5ODdmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L05vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ2hvcGJveEFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVMaW5rQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLlJlY29ubmVjdExpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29tcG9uZW50RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuUmVjb25uZWN0UmVxdWVzdDsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBjb25uZWN0aW9ucywgYW5kIGluc3RhbGxzIEVkaXRQb2xpY3kgZm9yICgKLSAqIHtAbGluayBFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFfSwge0BsaW5rIEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRX0sCi0gKiB7QGxpbmtFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFfSkKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVFZGl0UGFydCBleHRlbmRzIEJhc2VFZGl0UGFydCBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmdlZi5Ob2RlRWRpdFBhcnQgewotCi0JcHVibGljIE5vZGVFZGl0UGFydChOb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBuZXcgQ29tcG9uZW50RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZUNvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZGVsZXRlUmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5nZXQoCi0JCQkJCQlEZWxldGVDb21tYW5kLktFWV9QRVJNX0RFTEVURSk7Ci0JCQkJYm9vbGVhbiBwZXJtRGVsZXRlID0gYm9vbCA9PSBudWxsID8gZmFsc2UgOiBib29sLmJvb2xlYW5WYWx1ZSgpOwotCQkJCURlbGV0ZUNvbW1hbmQgY21kID0gbmV3IERlbGV0ZUNvbW1hbmQocGVybURlbGV0ZSk7Ci0JCQkJY21kLnNldFBhcnRUb0JlRGVsZXRlZChnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJcmV0dXJuIGNtZDsKLQkJCX0KLQkJfSk7Ci0KLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpIHsKLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbkNvbXBsZXRlQ29tbWFuZCgKLQkJCQkJCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlDcmVhdGVMaW5rQ29tbWFuZCBjbWQgPSAoQ3JlYXRlTGlua0NvbW1hbmQpIHJlcXVlc3QKLQkJCQkJCQkJLmdldFN0YXJ0Q29tbWFuZCgpOwotCQkJCQkJY21kLnNldFRhcmdldCgoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCi0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpLmVxdWFscygKLQkJCQkJCQkJCXJlcXVlc3QuZ2V0U291cmNlRWRpdFBhcnQoKSkpIHsKLQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNtZAotCQkJCQkJCQkJCS5zZXRUYXJnZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCQkuZ2V0VGFyZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkJCQkJCS5nZXRMb2NhdGlvbihyZXF1ZXN0Ci0JCQkJCQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbkNyZWF0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gbmV3IENyZWF0ZUxpbmtDb21tYW5kKAotCQkJCQkJCQlNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKSwKLQkJCQkJCQkJKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJCQkJCWlmIChyZXF1ZXN0LmdldFRhcmdldEVkaXRQYXJ0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZAotCQkJCQkJCQkJLnNldFNvdXJjZUVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCS5nZXRMb2NhdGlvbihyZXF1ZXN0LmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY21kLnNldFNvdXJjZUVuZFBvaW50KHJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXF1ZXN0LnNldFN0YXJ0Q29tbWFuZChjbWQpOwotCi0JCQkJCQlyZXR1cm4gY21kOwotCi0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RTb3VyY2VDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgdHJ1ZSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kLnNldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRUYXJnZXQoKSkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldFJlY29ubmVjdFRhcmdldENvbW1hbmQoCi0JCQkJCQkJUmVjb25uZWN0UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcmVxdWVzdC5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGNtZCA9IG5ldyBSZWNvbm5lY3RMaW5rQ29tbWFuZCgKLQkJCQkJCQkJbGluaywgKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpLCBmYWxzZSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJY21kLnNldEVuZFBvaW50KCgoQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRUYXJnZXQoKSkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJLmdldExvY2F0aW9uKCkpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlNFTEVDVElPTl9GRUVEQkFDS19ST0xFLCBudWxsKTsKLQkJLy8gQnkgZGVmYXVsdCwgY2FuJ3QgYWRkIGFueXRoaW5nIHRvIGEgbm9kZQotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gKE5vZGUpIGdldE1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxTb3VyY2VDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxUYXJnZXRDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcigKLQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25BbmNob3IgZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoJCQkKLQkJCXJlZnJlc2hWaXN1YWxzKCk7Ci0JCQlicmVhazsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJcmVmcmVzaFZpc3VhbHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFRhcmdldENvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uID0gKENvbm5lY3Rpb25FZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQkJY29ubi5yZWZyZXNoKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCXJlZnJlc2hTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQlyZWZyZXNoVGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCVJlY3RhbmdsZSBjb25zdHJhaW50ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgLTEpOwotCQlpZiAoZ2V0Tm9kZSgpLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCWNvbnN0cmFpbnQuc2V0TG9jYXRpb24oZ2V0Tm9kZSgpLmdldExvY2F0aW9uKCkpOwotCQljb25zdHJhaW50LndpZHRoID0gZ2V0Tm9kZSgpLmdldFdpZHRoKCk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIGNvbnN0cmFpbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjYWN0aXZhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQkoKE5vZGUpIGdldE1vZGVsKCkpLmFkZENvbnN1bWVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJKChOb2RlKSBnZXRNb2RlbCgpKS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDJkMGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSAgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuSW5zZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLS8qKgotICogIEEgYm9yZGVyIHdpdGggYSByYWlzZWQgbWFyZ2luLgotICogIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWlzZWRNYXJnaW5Cb3JkZXIgZXh0ZW5kcyBNYXJnaW5Cb3JkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5zZXRzIERFRkFVTFRfSU5TRVRTID0gbmV3IEluc2V0cygxMCwgMTAsIDEwLCAxMCk7Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKCkgewotCQl0aGlzKERFRkFVTFRfSU5TRVRTKTsKLQl9Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKEluc2V0cyBpbnNldHMpIHsKLQkJc3VwZXIoaW5zZXRzKTsKLQl9Ci0KLQlwdWJsaWMgUmFpc2VkTWFyZ2luQm9yZGVyKGludCB0LCBpbnQgbCwgaW50IGIsIGludCByKSB7Ci0JCXN1cGVyKHQsIGwsIGIsIHIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNnZXRJbnNldHMoSUZpZ3VyZSkKLQkgKi8KLQlwdWJsaWMgSW5zZXRzIGdldEluc2V0cyhJRmlndXJlIGZpZ3VyZSkgewotCQlyZXR1cm4gaW5zZXRzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjaXNPcGFxdWUoKQotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiBpc09wYXF1ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI3BhaW50KElGaWd1cmUsIEdyYXBoaWNzLCBJbnNldHMpCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnQoSUZpZ3VyZSBmaWd1cmUsIEdyYXBoaWNzIGcsIEluc2V0cyBpbnNldHMpIHsKLQkJZy5zZXRMaW5lU3R5bGUoR3JhcGhpY3MuTElORV9TT0xJRCk7Ci0JCWcuc2V0TGluZVdpZHRoKDEpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25MaWdodGVzdCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0UGFpbnRSZWN0YW5nbGUoZmlndXJlLCBpbnNldHMpOwotCQlyLnJlc2l6ZSgtMSwgLTEpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLnJpZ2h0KCksIHIueSk7Ci0JCWcuZHJhd0xpbmUoci54LCByLnksIHIueCwgci5ib3R0b20oKSk7Ci0JCWcuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkRhcmtlcik7Ci0JCWcuZHJhd0xpbmUoci54LCByLmJvdHRvbSgpLCByLnJpZ2h0KCksIHIuYm90dG9tKCkpOwotCQlnLmRyYXdMaW5lKHIucmlnaHQoKSwgci55LCByLnJpZ2h0KCksIHIuYm90dG9tKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9SZWxhdGl2ZVhZQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JlbGF0aXZlWFlBbmNob3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjYjc1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JlbGF0aXZlWFlBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJlbGF0aXZlIGFuY2hvciBmb3IgYSBmaWd1cmUncyBsb2NhdGlvbi4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVhZQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXByaXZhdGUgUG9pbnQgcmVsYXRpdmVMb2NhdGlvbjsKLQotCXB1YmxpYyBSZWxhdGl2ZVhZQW5jaG9yKElGaWd1cmUgZmlndXJlLCBQb2ludCBsb2NhdGlvbiwgYm9vbGVhbiBpc1JlbGF0aXZlKSB7Ci0JCXN1cGVyKGZpZ3VyZSk7Ci0JCXJlbGF0aXZlTG9jYXRpb24gPSBsb2NhdGlvbi5nZXRDb3B5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVBvaW50IHAgPSByZWxhdGl2ZUxvY2F0aW9uLmdldENvcHkoKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJcC5wZXJmb3JtVHJhbnNsYXRlKHIueCwgci55KTsKLQkJZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3IjZ2V0UmVmZXJlbmNlUG9pbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwODEyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmxvd0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IGlzIGNvbnRhaW5lciB3aXRoIHtAbGluayBGbG93TGF5b3V0fSwgYW5kIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nL3JlbW92aW5nIGNoaWxkIGVkaXRwYXJ0LiAKLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUNvbnRhaW5lckVkaXRQYXJ0IHsKLQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDI1NSwKLS8vCQkJMjU1LCAxNTYpOwotCQotCXByaXZhdGUgc3RhdGljICBDb2xvciBCR19DT0xPUjsKLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydChSb2xlVGFza0NvbXBvc2l0ZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZmlndXJlID0gbmV3IEZpZ3VyZSgpOwotCQlGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KCk7Ci0JCWxheW91dC5zZXRNaW5vclNwYWNpbmcoMjApOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBSYWlzZWRNYXJnaW5Cb3JkZXIoKSk7Ci0JCWZpZ3VyZS5zZXRCYWNrZ3JvdW5kQ29sb3IoZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQlmaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQjaGFuZGxlUHJvcGVydHlDaGFuZ2VkKE5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTm9kZUNvbnRhaW5lci5jbGFzcykpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJcmVmcmVzaENoaWxkcmVuKCk7Ci0KLQkJCS8vIHJlZnJlc2ggZGlhZ3JhbSdzIGNoaWxkcmVuCi0JCQlFZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBnZXRQYXJlbnQoKTsKLS8vCQkJaWYgKGRpYWdyYW1FZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0vLwkJCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW0pIGRpYWdyYW1FZGl0UGFydAotLy8JCQkJCQkuZ2V0TW9kZWwoKTsKLS8vCi0vLwkJCQlpZiAoIUdyYXBoaWNhbERhdGFIZWxwZXIuaXNBdXRvTGF5b3V0KGRpYWdyYW0pKSB7Ci0vLwkJCQkJKChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZGlhZ3JhbUVkaXRQYXJ0KQotLy8JCQkJCQkJLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbCgKLS8vCQkJCQkJCQkJZGlhZ3JhbUVkaXRQYXJ0LmdldENoaWxkcmVuKCkpOwotLy8JCQkJCURlZmF1bHRFZGl0RG9tYWluIGVkID0gKERlZmF1bHRFZGl0RG9tYWluKSBkaWFncmFtRWRpdFBhcnQKLS8vCQkJCQkJCS5nZXRWaWV3ZXIoKS5nZXRFZGl0RG9tYWluKCk7Ci0vLwkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWQuZ2V0RWRpdG9yUGFydCgpOwotLy8JCQkJCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IpIHsKLS8vCQkJCQkJKChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IpIGVkaXRvcikuY2xlYW5VcERpYWdyYW0oKTsKLS8vCQkJCQl9Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWRpYWdyYW1FZGl0UGFydC5yZWZyZXNoKCk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWRpYWdyYW1FZGl0UGFydC5yZWZyZXNoKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNjcmVhdGVFZGl0UG9saWNpZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIG5ldyBSb2xlVGFza0Zsb3dMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBudWxsKTsKLQl9Ci0JcHJvdGVjdGVkIENvbG9yIGdldEJhY2tncm91bmRDb2xvcigpewotCQlpZihCR19DT0xPUiAhPSBudWxsKSByZXR1cm4gQkdfQ09MT1I7Ci0JCQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCVN0cmluZyBjb2xvclN0cmluZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkFERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0IpOwotCQkJaWYoY29sb3JTdHJpbmcgIT0gbnVsbCAmJiBjb2xvclN0cmluZy5sZW5ndGgoKSA+IDApewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbG9yU3RyaW5nLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGcgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgcixnLGIpOwotCQkJCXJldHVybiBCR19DT0xPUjsKLQkJCX0KLQkJfQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCUJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkJCQkJMjU1LCAxNTYpOwotCQl9Ci0JCXJldHVybiBCR19DT0xPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N0YXJ0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWJjYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TdGFydE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIGNyZWF0aW5nIGZpZ3VyZSBmb3Ige0BsaW5rIFR5cGVkTm9kZS5TVEFSVH0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0YXJ0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBTdGFydE5vZGVFZGl0UGFydChUeXBlZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRQb2xpY3kgY3JlYXRlRGlyZWN0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVGaWd1cmUoKQotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJRWxsaXBzZSBmID0gbmV3IEVsbGlwc2UoKTsKLQkJZi5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2spOwotCQlmLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5yZWQpOwotCQlmLnNldFNpemUoMjAsIDIwKTsKLQkJcmV0dXJuIGY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1N5bmNoQmFyTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmMwMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9TeW5jaEJhck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkNvbm5lY3Rpb25BbmNob3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5EaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuTG9jYXRpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciBjcmVhdGluZyBmaWd1cmUgYW5kIGNyZWF0aW5nIHJlbGF0aXZlIGFuY2hvcnMKLSAqIGZvciB7QGxpbmsgVHlwZWROb2RlLlNZTkNfQkFSfQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN5bmNoQmFyTm9kZUVkaXRQYXJ0IGV4dGVuZHMgTm9kZUVkaXRQYXJ0IGltcGxlbWVudHMKLQkJQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sb3IgQkdfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgNTEsIDEwMiwgMTAyKTsKLQotCXByaXZhdGUgUG9pbnQgcmVjZW50VGFyZ2V0RW5kUG9pbnQ7Ci0KLQlwcml2YXRlIFBvaW50IHJlY2VudFNvdXJjZUVuZFBvaW50OwotCi0JcHVibGljIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KFR5cGVkTm9kZSBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkJhc2VFZGl0UGFydCNjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdFBvbGljeSBjcmVhdGVEaXJlY3RFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlY3RhbmdsZUZpZ3VyZSBmID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQlmLnNldEJhY2tncm91bmRDb2xvcihCR19DT0xPUik7Ci0JCWYuc2V0U2l6ZSgxMDAsIDUpOwotCQlyZXR1cm4gZjsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJYm9vbGVhbiBpc1JlbGF0aXZlID0gZmFsc2U7Ci0JCVBvaW50IHNvdXJjZUVuZFBvaW50ID0gbnVsbDsKLQkJaWYgKHJlY2VudFNvdXJjZUVuZFBvaW50ID09IG51bGwpIHsKLQkJCS8vIGdldCBzb3VyY2UgZW5kIHBvaW50IGZyb20gdGhlIG1vZGVsCi0JCQlMaW5rIGxpbmsgPSAoTGluaykgY29ubmVjdGlvbi5nZXRNb2RlbCgpOwotCQkJc291cmNlRW5kUG9pbnQgPSBsaW5rLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQlpc1JlbGF0aXZlID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXNvdXJjZUVuZFBvaW50ID0gcmVjZW50U291cmNlRW5kUG9pbnQ7Ci0JCX0KLQkJaWYgKHNvdXJjZUVuZFBvaW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUmVsYXRpdmVYWUFuY2hvcihnZXRGaWd1cmUoKSwgc291cmNlRW5kUG9pbnQsIGlzUmVsYXRpdmUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKGNvbm5lY3Rpb24pOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFNvdXJjZUNvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IHAgPSBudWxsOwotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSB7Ci0JCQlDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCByZXEgPSAoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QpIHJlcXVlc3Q7Ci0JCQlwID0gcmVxLmdldExvY2F0aW9uKCk7Ci0JCX0gZWxzZSBpZiAocmVxdWVzdCBpbnN0YW5jZW9mIExvY2F0aW9uUmVxdWVzdCkgewotCQkJcCA9ICgoTG9jYXRpb25SZXF1ZXN0KSByZXF1ZXN0KS5nZXRMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCXJlY2VudFNvdXJjZUVuZFBvaW50ID0gZ2V0TG9jYXRpb24ocCk7Ci0JCQlyZXR1cm4gbmV3IFJlbGF0aXZlWFlBbmNob3IoZ2V0RmlndXJlKCksIHJlY2VudFNvdXJjZUVuZFBvaW50LCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U291cmNlQ29ubmVjdGlvbkFuY2hvcihyZXF1ZXN0KTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJYm9vbGVhbiBpc1JlbGF0aXZlID0gZmFsc2U7Ci0JCVBvaW50IHRhcmdldEVuZFBvaW50ID0gbnVsbDsKLQkJaWYgKHJlY2VudFRhcmdldEVuZFBvaW50ID09IG51bGwpIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBjb25uZWN0aW9uLmdldE1vZGVsKCk7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCWlzUmVsYXRpdmUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJdGFyZ2V0RW5kUG9pbnQgPSByZWNlbnRUYXJnZXRFbmRQb2ludDsKLQkJfQotCQlpZiAodGFyZ2V0RW5kUG9pbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCB0YXJnZXRFbmRQb2ludCwgaXNSZWxhdGl2ZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihjb25uZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRUYXJnZXRDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlQb2ludCBwID0gbnVsbDsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uUmVxdWVzdCkgewotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxID0gKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0KSByZXF1ZXN0OwotCQkJcCA9IHJlcS5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBMb2NhdGlvblJlcXVlc3QpIHsKLQkJCXAgPSAoKExvY2F0aW9uUmVxdWVzdCkgcmVxdWVzdCkuZ2V0TG9jYXRpb24oKTsKLQkJfQotCQlpZiAocCAhPSBudWxsKSB7Ci0JCQlyZWNlbnRUYXJnZXRFbmRQb2ludCA9IGdldExvY2F0aW9uKHApOwotCQkJcmV0dXJuIG5ldyBSZWxhdGl2ZVhZQW5jaG9yKGdldEZpZ3VyZSgpLCByZWNlbnRUYXJnZXRFbmRQb2ludCwgdHJ1ZSk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0Q29ubmVjdGlvbkFuY2hvcihyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IjZ2V0TG9jYXRpb24oUG9pbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlyZXR1cm4gQ2xvc2VzdEFuY2hvci5nZXRMb2NhdGlvbihnZXRGaWd1cmUoKSwgcmVmZXJlbmNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1RleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjVlN2RiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBUZXh0RmxvdyBwbGFjaW5nLgotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmVDZWxsRWRpdG9yTG9jYXRvciBpbXBsZW1lbnRzIENlbGxFZGl0b3JMb2NhdG9yIHsKLQotCXByaXZhdGUgVGV4dEZpZ3VyZSBmaWd1cmU7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTGFiZWxUZXh0Q2VsbEVkaXRvckxvY2F0b3IgZm9yIHRoZSBnaXZlbiB0ZXh0IGZpZ3VyZQotCSAqIEBwYXJhbSB0ZgotCSAqLwotCXB1YmxpYyBUZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IoVGV4dEZpZ3VyZSB0ZikgewotCQlzZXRGaWd1cmUodGYpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2VsbEVkaXRvckxvY2F0b3IjcmVsb2NhdGUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQlUZXh0RmlndXJlQ2VsbEVkaXRvckxvY2F0b3IuZG9Mb2NhdGUoY2VsbGVkaXRvciwgZmlndXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZG9Mb2NhdGUoQ2VsbEVkaXRvciBjZSwgVGV4dEZpZ3VyZSBmaWcpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlLmdldENvbnRyb2woKTsKLQkJU3RyaW5nIG4gPSAoU3RyaW5nKSBjZS5nZXRWYWx1ZSgpOwotCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobik7Ci0JCWdjLmRpc3Bvc2UoKTsKLQkJaWYgKHNpemUueCAhPSAwKQotCQkJc2l6ZSA9IHRleHQuY29tcHV0ZVNpemUoc2l6ZS54LCBTV1QuREVGQVVMVCk7Ci0JCXRleHQuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCVJlY3RhbmdsZSB0ZXh0Qm91bmRzID0gbmV3IFJlY3RhbmdsZSh0ZXh0LmdldENsaWVudEFyZWEoKS54LCB0ZXh0Ci0JCQkJLmdldENsaWVudEFyZWEoKS55LCB0ZXh0LmdldENsaWVudEFyZWEoKS53aWR0aCwgdGV4dAotCQkJCS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJUmVjdGFuZ2xlIGZpZ0JvdW5kcyA9IGZpZy5nZXRDbGllbnRBcmVhKCk7Ci0JCWZpZy50cmFuc2xhdGVUb0Fic29sdXRlKGZpZ0JvdW5kcyk7Ci0JCWludCBkZWx0YSA9IChmaWdCb3VuZHMud2lkdGggLSB0ZXh0Qm91bmRzLndpZHRoKSAvIDI7Ci0JCWludCB5ID0gZmlnLmdldFRleHRGbG93UGFnZSgpLmdldExvY2F0aW9uKCkueTsKLQkJdGV4dC5zZXRMb2NhdGlvbihmaWdCb3VuZHMueCArIGRlbHRhLCB5KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dEZpZ3VyZSBnZXRGaWd1cmUoKSB7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlndXJlKFRleHRGaWd1cmUgZmlndXJlKSB7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmIyN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9UZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBNYW5hZ2VzIGRpcmVjdCBlZGl0aW5nIGFuZCBjcmVhdGluZyBjZWxsZWRpdG9yIGZvciB7QGxpbmsgVGV4dEZpZ3VyZX0KLSAqIAotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmVEaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIERpcmVjdEVkaXRNYW5hZ2VyIHsKLQotCUZvbnQgc2NhbGVkRm9udDsKLQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciB2ZXJpZnlMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBUZXh0RmlndXJlIGZpZ3VyZSA9IG51bGw7Ci0KLQlwdWJsaWMgVGV4dEZpZ3VyZURpcmVjdEVkaXRNYW5hZ2VyKEdyYXBoaWNhbEVkaXRQYXJ0IHNvdXJjZSwKLQkJCUNsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IsIFRleHRGaWd1cmUgZmlndXJlKSB7Ci0JCXN1cGVyKHNvdXJjZSwgZWRpdG9yVHlwZSwgbG9jYXRvcik7Ci0JCXRoaXMuZmlndXJlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dENlbGxFZGl0b3IgZWRpdG9yID0gKFRleHRDZWxsRWRpdG9yKSBnZXRDZWxsRWRpdG9yKCk7Ci0JCWVkaXRvci5zZXRTdHlsZShTV1QuTVVMVEkpOwotCQlUZXh0IHQgPSAoVGV4dCkgZWRpdG9yLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9ICgoTmFtZWROb2RlRWRpdFBhcnQpIHRoaXMuZ2V0RWRpdFBhcnQoKSkKLQkJCQkuZ2V0RGlyZWN0RWRpdFRleHQoKTsKLQkJZWRpdG9yLnNldFZhbHVlKGluaXRpYWxMYWJlbFRleHQpOwotCQl0LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdC5zZWxlY3RBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciN1bmhvb2tMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVuaG9va0xpc3RlbmVycygpIHsKLQkJc3VwZXIudW5ob29rTGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRDZWxsRWRpdG9yKCkgIT0gbnVsbCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQlpZiAodmVyaWZ5TGlzdGVuZXIgIT0gbnVsbCkKLQkJCQl0ZXh0LnJlbW92ZVZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQkJCXZlcmlmeUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZC4gU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIHR4dAotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB2YWxpZCwgYW4gZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQoKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLCBtc2cpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5jb21taXQoKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIE5hbWVkTm9kZUVkaXRQYXJ0IHBhcnQ7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbXNnOwotCi0JCVByb21wdEVkaXQoTmFtZWROb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsgCi0JCQlwYXJ0LnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ub3BBbmNob3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvVG9wQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmODI4MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Ub3BBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIENvbm5lY3Rpb24gYW5jaG9yIGZvciB0b3Agb2YgdGhlIGZpZ3VyZS4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFRvcEFuY2hvciBleHRlbmRzIEFic3RyYWN0Q29ubmVjdGlvbkFuY2hvciB7Ci0KLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0KLQlUb3BBbmNob3IoSUZpZ3VyZSBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKFBvaW50IHJlZmVyZW5jZSkgewotCQlSZWN0YW5nbGUgciA9IGdldE93bmVyKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlnZXRPd25lcigpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCWludCBvZmYgPSBvZmZzZXQ7Ci0JCWlmIChvZmYgPT0gLTEpCi0JCQlvZmYgPSByLndpZHRoIC8gMjsKLQkJaWYgKHIuY29udGFpbnMocmVmZXJlbmNlKSB8fCByLnkgPCByZWZlcmVuY2UueSkKLQkJCXJldHVybiByLmdldEJvdHRvbUxlZnQoKS50cmFuc2xhdGUob2ZmLCAtMSk7Ci0JCWVsc2UKLQkJCXJldHVybiByLmdldFRvcExlZnQoKS50cmFuc2xhdGUob2ZmLCAwKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyZDAwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdEaXJlY3RFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogTWFuYWdlcyBkaXJlY3QgZWRpdGluZyBhbmQgY3JlYXRpbmcgY2VsbCBlZGl0b3IgZm9yIHRoZSB7QGxpbmsgTGFiZWx9Ci0gKiBhbmQgdmFsaWRhdGVzIHRoZSBpbnB1dC4gCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIExhYmVsIGFjdGl2aXR5TGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFjdGl2aXR5RGlyZWN0RWRpdE1hbmFnZXIgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICB0aGUgc291cmNlIEVkaXRQYXJ0Ci0JICogQHBhcmFtIGVkaXRvclR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgZWRpdG9yCi0JICogQHBhcmFtIGxvY2F0b3IKLQkgKiAgICAgICAgICAgIHRoZSBDZWxsRWRpdG9yTG9jYXRvcgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIoR3JhcGhpY2FsRWRpdFBhcnQgc291cmNlLAotCQkJQ2xhc3MgZWRpdG9yVHlwZSwgQ2VsbEVkaXRvckxvY2F0b3IgbG9jYXRvciwgTGFiZWwgbGFiZWwpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQkJYWN0aXZpdHlMYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQkvLyBUaGlzIG1ldGhvZCBtaWdodCBiZSByZS1lbnRlcmVkIHdoZW4gc3VwZXIuYnJpbmdEb3duKCkgaXMgY2FsbGVkLgotCQlGb250IGRpc3Bvc2VGb250ID0gc2NhbGVkRm9udDsKLQkJc2NhbGVkRm9udCA9IG51bGw7Ci0JCXN1cGVyLmJyaW5nRG93bigpOwotCQlpZiAoZGlzcG9zZUZvbnQgIT0gbnVsbCkKLQkJCWRpc3Bvc2VGb250LmRpc3Bvc2UoKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOYW1lZE5vZGUgbm9kZSA9IChOYW1lZE5vZGUpIGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCWlmICh3YmVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpKSB7Ci0JCQkJCW5hbWUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5hbWVkTm9kZUVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpLAotCQkJCQkJCQkJCURpYWdyYW1VSVJlc291cmNlcy5lcnJfbmFtZV9lbXB0eSkpOyAKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2luaXRDZWxsRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q2VsbEVkaXRvcigpIHsKLQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCXZlcmlmeUxpc3RlbmVyID0gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBldmVudCkgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJCVN0cmluZyBvbGRUZXh0ID0gdGV4dC5nZXRUZXh0KCk7Ci0JCQkJU3RyaW5nIGxlZnRUZXh0ID0gb2xkVGV4dC5zdWJzdHJpbmcoMCwgZXZlbnQuc3RhcnQpOwotCQkJCVN0cmluZyByaWdodFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZyhldmVudC5lbmQsIG9sZFRleHQKLQkJCQkJCS5sZW5ndGgoKSk7Ci0JCQkJR0MgZ2MgPSBuZXcgR0ModGV4dCk7Ci0JCQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobGVmdFRleHQgKyBldmVudC50ZXh0ICsgcmlnaHRUZXh0KTsKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCQkJaWYgKHNpemUueCAhPSAwKQotCQkJCQlzaXplID0gdGV4dC5jb21wdXRlU2l6ZShzaXplLngsIFNXVC5ERUZBVUxUKTsKLQkJCQlnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpLnNldFNpemUoc2l6ZS54LCBzaXplLnkpOwotCQkJfQotCQl9OwotCQl0ZXh0LmFkZFZlcmlmeUxpc3RlbmVyKHZlcmlmeUxpc3RlbmVyKTsKLQotCQlTdHJpbmcgaW5pdGlhbExhYmVsVGV4dCA9IGFjdGl2aXR5TGFiZWwuZ2V0VGV4dCgpOwotCQlnZXRDZWxsRWRpdG9yKCkuc2V0VmFsdWUoaW5pdGlhbExhYmVsVGV4dCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkuZ2V0RmlndXJlKCk7Ci0JCXNjYWxlZEZvbnQgPSBmaWd1cmUuZ2V0Rm9udCgpOwotCQlGb250RGF0YSBkYXRhID0gc2NhbGVkRm9udC5nZXRGb250RGF0YSgpWzBdOwotCQlEaW1lbnNpb24gZm9udFNpemUgPSBuZXcgRGltZW5zaW9uKDAsIGRhdGEuZ2V0SGVpZ2h0KCkpOwotCQlhY3Rpdml0eUxhYmVsLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZm9udFNpemUpOwotCQlkYXRhLnNldEhlaWdodChmb250U2l6ZS5oZWlnaHQpOwotCQlzY2FsZWRGb250ID0gbmV3IEZvbnQobnVsbCwgZGF0YSk7Ci0KLQkJdGV4dC5zZXRGb250KHNjYWxlZEZvbnQpOwotCQl0ZXh0LnNlbGVjdEFsbCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI3VuaG9va0xpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW5ob29rTGlzdGVuZXJzKCkgewotCQlzdXBlci51bmhvb2tMaXN0ZW5lcnMoKTsKLQkJaWYgKGdldENlbGxFZGl0b3IoKSAhPSBudWxsKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJCXRleHQucmVtb3ZlVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCQkJdmVyaWZ5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gdHh0Ci0JICogQHJldHVybiBudWxsIGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHZhbGlkLCBhbiBlcnJvciBtZXNzYWdlIG90aGVyd2lzZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNjb21taXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbW1pdCgpIHsKLQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRlKChTdHJpbmcpIGdldENlbGxFZGl0b3IoKS5nZXRWYWx1ZSgpKTsKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlicmluZ0Rvd24oZmFsc2UpOwotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUHJvbXB0RWRpdCgoTmFtZWROb2RlRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCksIG1zZykpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmNvbW1pdCgpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcm9tcHRFZGl0IGltcGxlbWVudHMgUnVubmFibGUgewotCi0JCXByaXZhdGUgTmFtZWROb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOYW1lZE5vZGVFZGl0UGFydCBwYXJ0LCBTdHJpbmcgbXNnKSB7Ci0JCQl0aGlzLnBhcnQgPSBwYXJ0OwotCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVN0cmluZyB0aXRsZSA9IERpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX2Vycm9yRGlhbG9nX3RpdGxlX3RleHQwOyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAKLQkJCXBhcnQucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MGUzODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9WYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogTWFuYWdlcyBkaXJlY3QgZWRpdGluZyBhbmQgY3JlYXRpbmcgY2VsbCBlZGl0b3IgZm9yIHRoZSB7QGxpbmsgTGFiZWx9Ci0gKiBhbmQgdmFsaWRhdGVzIHRoZSBpbnB1dC4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyIGV4dGVuZHMgRGlyZWN0RWRpdE1hbmFnZXIgewotCi0JRm9udCBzY2FsZWRGb250OwotCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIHZlcmlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIExhYmVsIGFjdGl2aXR5TGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IEFjdGl2aXR5RGlyZWN0RWRpdE1hbmFnZXIgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICB0aGUgc291cmNlIEVkaXRQYXJ0Ci0JICogQHBhcmFtIGVkaXRvclR5cGUKLQkgKiAgICAgICAgICAgIHR5cGUgb2YgZWRpdG9yCi0JICogQHBhcmFtIGxvY2F0b3IKLQkgKiAgICAgICAgICAgIHRoZSBDZWxsRWRpdG9yTG9jYXRvcgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsCi0JCQlDbGFzcyBlZGl0b3JUeXBlLCBDZWxsRWRpdG9yTG9jYXRvciBsb2NhdG9yLCBMYWJlbCBsYWJlbCkgewotCQlzdXBlcihzb3VyY2UsIGVkaXRvclR5cGUsIGxvY2F0b3IpOwotCQlhY3Rpdml0eUxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oKSB7Ci0JCWJyaW5nRG93bih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlciNicmluZ0Rvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyaW5nRG93bihib29sZWFuIGNoZWNrKSB7Ci0JCS8vIFRoaXMgbWV0aG9kIG1pZ2h0IGJlIHJlLWVudGVyZWQgd2hlbiBzdXBlci5icmluZ0Rvd24oKSBpcyBjYWxsZWQuCi0JCUZvbnQgZGlzcG9zZUZvbnQgPSBzY2FsZWRGb250OwotCQlzY2FsZWRGb250ID0gbnVsbDsKLQkJc3VwZXIuYnJpbmdEb3duKCk7Ci0JCWlmIChkaXNwb3NlRm9udCAhPSBudWxsKQotCQkJZGlzcG9zZUZvbnQuZGlzcG9zZSgpOwotCQlpZiAoY2hlY2spIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKChOb2RlKSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpOwotCQkJU3RyaW5nIG5hbWUgPSAoKFByb3BlcnR5KSBub2RlLmdldFByb3BlcnR5KCkuZ2V0KDApKS5nZXRWYWx1ZSgpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKQotCQkJCQkJLmFzeW5jRXhlYygKLQkJCQkJCQkJbmV3IFByb21wdEVkaXQoCi0JCQkJCQkJCQkJKE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5nZWZfdmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0KSk7IAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjaW5pdENlbGxFZGl0b3IoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDZWxsRWRpdG9yKCkgewotCQlUZXh0IHRleHQgPSAoVGV4dCkgZ2V0Q2VsbEVkaXRvcigpLmdldENvbnRyb2woKTsKLQkJdmVyaWZ5TGlzdGVuZXIgPSBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCk7Ci0JCQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0LmdldFRleHQoKTsKLQkJCQlTdHJpbmcgbGVmdFRleHQgPSBvbGRUZXh0LnN1YnN0cmluZygwLCBldmVudC5zdGFydCk7Ci0JCQkJU3RyaW5nIHJpZ2h0VGV4dCA9IG9sZFRleHQuc3Vic3RyaW5nKGV2ZW50LmVuZCwgb2xkVGV4dAotCQkJCQkJLmxlbmd0aCgpKTsKLQkJCQlHQyBnYyA9IG5ldyBHQyh0ZXh0KTsKLQkJCQlQb2ludCBzaXplID0gZ2MudGV4dEV4dGVudChsZWZ0VGV4dCArIGV2ZW50LnRleHQgKyByaWdodFRleHQpOwotCQkJCWdjLmRpc3Bvc2UoKTsKLQkJCQlpZiAoc2l6ZS54ICE9IDApCi0JCQkJCXNpemUgPSB0ZXh0LmNvbXB1dGVTaXplKHNpemUueCwgU1dULkRFRkFVTFQpOwotCQkJCWdldENlbGxFZGl0b3IoKS5nZXRDb250cm9sKCkuc2V0U2l6ZShzaXplLngsIHNpemUueSk7Ci0JCQl9Ci0JCX07Ci0JCXRleHQuYWRkVmVyaWZ5TGlzdGVuZXIodmVyaWZ5TGlzdGVuZXIpOwotCi0JCVN0cmluZyBpbml0aWFsTGFiZWxUZXh0ID0gYWN0aXZpdHlMYWJlbC5nZXRUZXh0KCk7Ci0JCWdldENlbGxFZGl0b3IoKS5zZXRWYWx1ZShpbml0aWFsTGFiZWxUZXh0KTsKLQkJdGV4dC5zZWxlY3RBbGwoKTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKS5nZXRGaWd1cmUoKTsKLQkJc2NhbGVkRm9udCA9IGZpZ3VyZS5nZXRGb250KCk7Ci0JCUZvbnREYXRhIGRhdGEgPSBzY2FsZWRGb250LmdldEZvbnREYXRhKClbMF07Ci0JCURpbWVuc2lvbiBmb250U2l6ZSA9IG5ldyBEaW1lbnNpb24oMCwgZGF0YS5nZXRIZWlnaHQoKSk7Ci0JCWFjdGl2aXR5TGFiZWwudHJhbnNsYXRlVG9BYnNvbHV0ZShmb250U2l6ZSk7Ci0JCWRhdGEuc2V0SGVpZ2h0KGZvbnRTaXplLmhlaWdodCk7Ci0JCXNjYWxlZEZvbnQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQotCQl0ZXh0LnNldEZvbnQoc2NhbGVkRm9udCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjdW5ob29rTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmhvb2tMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnVuaG9va0xpc3RlbmVycygpOwotCQlpZiAoZ2V0Q2VsbEVkaXRvcigpICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBnZXRDZWxsRWRpdG9yKCkuZ2V0Q29udHJvbCgpOwotCQkJdGV4dC5yZW1vdmVWZXJpZnlMaXN0ZW5lcih2ZXJpZnlMaXN0ZW5lcik7Ci0JCQl2ZXJpZnlMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2NvbW1pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tbWl0KCkgewotCQlTdHJpbmcgbXNnID0gdmFsaWRhdGUoKFN0cmluZykgZ2V0Q2VsbEVkaXRvcigpLmdldFZhbHVlKCkpOwotCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCWJyaW5nRG93bihmYWxzZSk7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMoCi0JCQkJCW5ldyBQcm9tcHRFZGl0KChOYW1lZE5vZGVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSwgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb21wdEVkaXQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBOb2RlRWRpdFBhcnQgcGFydDsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChOb2RlRWRpdFBhcnQgcGFydCwgU3RyaW5nIG1zZykgewotCQkJdGhpcy5wYXJ0ID0gcGFydDsKLQkJCXRoaXMubXNnID0gbXNnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgamF2YS5sYW5nLlJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBEaWFncmFtVUlSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZV90ZXh0MDsgCi0JCQlTdHJpbmcgcHJvYmxlbSA9IERpYWdyYW1VSVJlc291cmNlcy5kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c7IAotCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1zZyk7IAotCQkJcGFydC5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ3N2YzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIFdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0uIFN1cHBvcnQgY3JlYXRpb24gCi0gKiBvZiBjaGlsZCBlZGl0cGFydCBpbiBXb3JrUFJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQlwdWJsaWMgV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeSNjcmVhdGVFZGl0UGFydChFZGl0UGFydCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJcmV0dXJuIG5ldyBEaWFncmFtRWRpdFBhcnQoKERpYWdyYW0pIG1vZGVsKTsKLQkJfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCgoTmFtZWROb2RlKSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gbmV3IExpbmtFZGl0UGFydCgoTGluaykgbW9kZWwpOwotCQl9Ci0JCS8vIHR5cGVkIG5vZGUgY3JlYXRpb24KLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQlUeXBlZE5vZGUgbm9kZSA9IChUeXBlZE5vZGUpIG1vZGVsOwotCQkJc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotCQkJY2FzZSBUeXBlZE5vZGUuU1RBUlQ6Ci0JCQkJcmV0dXJuIG5ldyBTdGFydE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkVORDoKLQkJCQlyZXR1cm4gbmV3IEVuZE5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOgotCQkJCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlRWRpdFBhcnQobm9kZSk7Ci0JCQljYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6Ci0JCQkJcmV0dXJuIG5ldyBTeW5jaEJhck5vZGVFZGl0UGFydChub2RlKTsKLQkJCWNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDoKLQkJCQlyZXR1cm4gbmV3IEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9XUE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkxZWJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV1BOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlNlbGVjdGFibGVMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLldQQ29tcGFydG1lbnRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQgCi0gKiBAc2VlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0Ci0gKi8KLXB1YmxpYyBjbGFzcyBXUE5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCWludCB0eXBlID0gMTsKLQotCXB1YmxpYyBXUE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCXR5cGUgPSAoKFdvcmtQcm9kdWN0Tm9kZSkgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQl9Ci0JCUxhYmVsIGwgPSBuZXcgU2VsZWN0YWJsZUxhYmVsKCk7Ci0JCWwuc2V0TGFiZWxBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuTEVGVCk7Ci0JCWwuc2V0VGV4dFBsYWNlbWVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCWwuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJRm9udCBmb250ID0gbmV3IEZvbnQobnVsbCwgIkFyaWFsIiwgOSwgU1dULk5PUk1BTCk7IC8vJE5PTi1OTFMtMSQKLQkJbC5zZXRGb250KGZvbnQpOwotCQlpZiAodHlwZSA9PSAxKQotCQkJbC5zZXRJY29uKEltYWdlcy5BUlRJRkFDVCk7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMikKLQkJCWwuc2V0SWNvbihJbWFnZXMuREVMSVZFUkFCTEUpOwotCQllbHNlIGlmICh0eXBlID09IDMpCi0JCQlsLnNldEljb24oSW1hZ2VzLk9VVENPTUUpOwotCQllbHNlCi0JCQlsLnNldEljb24oSW1hZ2VzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJbC5zZXRJY29uVGV4dEdhcCg1KTsKLQotCQlXUENvbXBhcnRtZW50RmlndXJlIHdwZmlndXJlID0gbmV3IFdQQ29tcGFydG1lbnRGaWd1cmUobCwgdHlwZSk7Ci0JCXJldHVybiB3cGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQmFzZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRNYW5hZ2VyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKSB7Ci0JCUxhYmVsIGwgPSAoTGFiZWwpICgoKFdQQ29tcGFydG1lbnRGaWd1cmUpIGdldEZpZ3VyZSgpKS5nZXRMYWJlbCgpKTsKLQkJcmV0dXJuIG5ldyBWYWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dENlbGxFZGl0b3IuY2xhc3MsCi0JCQkJbmV3IExhYmVsVGV4dENlbGxFZGl0b3JMb2NhdG9yKGwpLCBsKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQkJT2JqZWN0IGUgPSBub2RlLmdldE9iamVjdCgpOwotCQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5vZGUuZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQllLCB0eHQsIHN1cHByZXNzaW9uKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlJRmlndXJlIGdldERpcmVjdEVkaXRGaWd1cmUoKSB7Ci0JCXJldHVybiAoKChXUENvbXBhcnRtZW50RmlndXJlKSBnZXRGaWd1cmUoKSkuZ2V0TGFiZWwoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOWJlNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5BY3Rpdml0eUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLlRleHRGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQ29tbW9uIGVkaXRwYXJ0IGZvciBkaWZmZXJlbnQge0BsaW5rIERlc2NyaXB0b3J9Ci0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciB3b3JkLXdyYXAgb2YgZWRpdHBhcnQncyBvYmplY3QgbmFtZS4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydCBleHRlbmRzIE5hbWVkTm9kZUVkaXRQYXJ0IHsKLQotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVFZGl0UGFydChOYW1lZE5vZGUgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5OYW1lZE5vZGVFZGl0UGFydCNnZXRJbWFnZSgpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKCkgewotCQlJbWFnZSBpbWcgPSBudWxsOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0TW9kZWwoKTsKLQkJT2JqZWN0IG9iaiA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJaW1nID0gSW1hZ2VzLlBIQVNFOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJaW1nID0gSW1hZ2VzLklURVJBVElPTjsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJaW1nID0gSW1hZ2VzLkFDVElWSVRZOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlpbWcgPSBJbWFnZXMuVEFTS19ERVNDUklQVE9SOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJaW1nID0gSW1hZ2VzLk1JTEVTVE9ORTsKLQkJfQotCQlyZXR1cm4gaW1nOwotCX0KLQotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJQWN0aXZpdHlGaWd1cmUgZmlndXJlID0gbmV3IEFjdGl2aXR5RmlndXJlKCk7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2UoKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCWZpZ3VyZS5hZGQoaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JU3RyaW5nIGdldERpcmVjdEVkaXRUZXh0KCkgewotCQlUZXh0RmlndXJlIG5vdGUgPSAoVGV4dEZpZ3VyZSkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBub3RlLmdldFRleHQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJSUZpZ3VyZSBmaWcgPSBnZXREaXJlY3RFZGl0RmlndXJlKCk7Ci0JCWlmIChmaWcgaW5zdGFuY2VvZiBBY3Rpdml0eUZpZ3VyZSkgewotCQkJQWN0aXZpdHlGaWd1cmUgbCA9IChBY3Rpdml0eUZpZ3VyZSkgZmlnOwotCQkJZmlnLnNldEZvcmVncm91bmRDb2xvcihnZXRGb3JlZ3JvdW5kQ29sb3IoKSk7Ci0JCQlTdHJpbmcgdGV4dDsKLQkJCS8vIEJlbG93IGNoZWNrIGlzIHJlcXVpcmVkIGZvciBFeHRlbmRlZCBBY3Rpdml0eSBwcmVzZW50YXRpb24gbmFtZQotCQkJLy8gc2hvdWxkIGJlIHVzZWQgZnJvbSBiYXNlLgotCQkJaWYgKGdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgbm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIGdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkmJiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCkpIHsKLQkJCQkJdGV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIHdiZWxlbWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZXh0ID0gKChOYW1lZE5vZGUpIGdldE1vZGVsKCkpLmdldE5hbWUoKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJaWYgKGdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQKLQkJCQkJCXx8IGdldFBhcmVudCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCQkJaW50IHcgPSBXUkFQX1dJRFRIOwotCQkJCQlpZiAodGhpcy5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkKLQkJCQkJCXcgPSBXT1JLX1BST0RVQ1RfV1JBUF9XSURUSDsKLQkJCQkJdGV4dCA9IHdyYXAodGV4dCwgdyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJfQotCQkJbC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoKSB7Ci0JCU5hbWVkTm9kZSBub2RlID0gKE5hbWVkTm9kZSkgZ2V0TW9kZWwoKTsKLQkJaWYgKG5vZGUuaXNTdXBwcmVzc2VkKCkpIHsKLQkJCXJldHVybiBDb2xvcnMuU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKSB7Ci0JCQlyZXR1cm4gQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbG9yQ29uc3RhbnRzLmJsYWNrOwotCQl9Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5CYXNlRWRpdFBhcnQjY3JlYXRlRGlyZWN0RWRpdE1hbmFnZXIoKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJcmV0dXJuIG5ldyBUZXh0RmlndXJlRGlyZWN0RWRpdE1hbmFnZXIoKEdyYXBoaWNhbEVkaXRQYXJ0KSB0aGlzLAotCQkJCVRleHRDZWxsRWRpdG9yLmNsYXNzLCBuZXcgVGV4dEZpZ3VyZUNlbGxFZGl0b3JMb2NhdG9yKAotCQkJCQkJKFRleHRGaWd1cmUpIGdldEZpZ3VyZSgpKSwgKFRleHRGaWd1cmUpIGdldEZpZ3VyZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXQlNBY3Rpdml0eVByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBUbmdVdGlsCi0JCQkJCQkJCS5jaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShlLAotCQkJCQkJCQkJCXR4dCwgbm9kZS5nZXREaWFncmFtKCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUodHh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MWM2ZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5DaG9wYm94QW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUxpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLlJlY29ubmVjdExpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuQ29ubmVjdGlvbkFuY2hvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IGlzIGNvbnRhaW5lciB3aXRoIHtAbGluayBGbG93TGF5b3V0fSwgYW5kIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nL3JlbW92aW5nIGNoaWxkIGVkaXRwYXJ0LgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIE5vZGVDb250YWluZXJFZGl0UGFydAotCQlpbXBsZW1lbnRzIE5vZGVFZGl0UGFydCB7Ci0KLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JLy8JCTI1NSwgMjA1KTsKLQlwcml2YXRlIHN0YXRpYyBDb2xvciBCR19DT0xPUjsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KFdvcmtQcm9kdWN0Q29tcG9zaXRlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0JCUZsb3dMYXlvdXQgbGF5b3V0ID0gbmV3IEZsb3dMYXlvdXQoKTsKLQkJbGF5b3V0LnNldE1pbm9yU3BhY2luZygyMCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCWZpZ3VyZS5zZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJZmlndXJlLnNldEJhY2tncm91bmRDb2xvcihnZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCWZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5vZGVDb250YWluZXJFZGl0UGFydCNoYW5kbGVQcm9wZXJ0eUNoYW5nZWQoTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChOb2RlQ29udGFpbmVyLmNsYXNzKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQkJCQotCQkJYWRqdXN0U2l6ZSgpOwotCQkJCi0JCQkvLyByZWZyZXNoIGRpYWdyYW0ncyBjaGlsZHJlbgotCQkJRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0UGFyZW50KCk7Ci0JCQlkaWFncmFtRWRpdFBhcnQucmVmcmVzaCgpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJTGlzdCBsaXN0ID0gZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IHRIZWlnaHQgPSAyMDsKLQkJaW50IHRXaWR0aCA9IDIwOwotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpaXRlcmF0b3IubmV4dCgpOwotCQkJdEhlaWdodCs9ZWRpdHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCWlmKHRXaWR0aCA8IGVkaXRwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS53aWR0aCl7Ci0JCQkJdFdpZHRoID0gZWRpdHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJfQotCQl9Ci0JCSgoTm9kZSkgdGhpcy5nZXRNb2RlbCgpKS5zZXRIZWlnaHQodEhlaWdodCk7Ci0JCSgoTm9kZSkgdGhpcy5nZXRNb2RlbCgpKS5zZXRXaWR0aCh0V2lkdGgrMjApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3koKSB7Ci0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQoCi0JCQkJCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJQ3JlYXRlTGlua0NvbW1hbmQgY21kID0gKENyZWF0ZUxpbmtDb21tYW5kKSByZXF1ZXN0Ci0JCQkJCQkJCS5nZXRTdGFydENvbW1hbmQoKTsKLQkJCQkJCWNtZC5zZXRUYXJnZXQoKE5vZGUpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKSBpbnN0YW5jZW9mIENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSB7Ci0JCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0RWRpdFBhcnQoKS5lcXVhbHMoCi0JCQkJCQkJCQlyZXF1ZXN0LmdldFNvdXJjZUVkaXRQYXJ0KCkpKSB7Ci0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljbWQKLQkJCQkJCQkJCQkuc2V0VGFyZ2V0RW5kUG9pbnQoKChDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgcmVxdWVzdAotCQkJCQkJCQkJCQkJLmdldFRhcmdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdAotCQkJCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24oKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENvbm5lY3Rpb25DcmVhdGVDb21tYW5kKAotCQkJCQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUNyZWF0ZUxpbmtDb21tYW5kIGNtZCA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQkJTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCksCi0JCQkJCQkJCShOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCQkJCQlpZiAocmVxdWVzdC5nZXRUYXJnZXRFZGl0UGFydCgpIGluc3RhbmNlb2YgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IpIHsKLQkJCQkJCQljbWQKLQkJCQkJCQkJCS5zZXRTb3VyY2VFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkJCS5nZXRUYXJnZXRFZGl0UGFydCgpKQotCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24ocmVxdWVzdC5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNtZC5zZXRTb3VyY2VFbmRQb2ludChyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfQotCQkJCQkJcmVxdWVzdC5zZXRTdGFydENvbW1hbmQoY21kKTsKLQotCQkJCQkJcmV0dXJuIGNtZDsKLQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVjb25uZWN0U291cmNlQ29tbWFuZCgKLQkJCQkJCQlSZWNvbm5lY3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSByZXF1ZXN0LmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpOwotCQkJCQkJUmVjb25uZWN0TGlua0NvbW1hbmQgY21kID0gbmV3IFJlY29ubmVjdExpbmtDb21tYW5kKAotCQkJCQkJCQlsaW5rLCAoTm9kZSkgZ2V0SG9zdCgpLmdldE1vZGVsKCksIHRydWUpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiBjbWQ7Ci0JCQkJCX0KLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZWNvbm5lY3RUYXJnZXRDb21tYW5kKAotCQkJCQkJCVJlY29ubmVjdFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHJlcXVlc3QuZ2V0Q29ubmVjdGlvbkVkaXRQYXJ0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCk7Ci0JCQkJCQlSZWNvbm5lY3RMaW5rQ29tbWFuZCBjbWQgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQoCi0JCQkJCQkJCWxpbmssIChOb2RlKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgZmFsc2UpOwotCQkJCQkJaWYgKHJlcXVlc3QuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBDb25uZWN0aW9uQW5jaG9yTG9jYXRvcikgewotCQkJCQkJCWNtZC5zZXRFbmRQb2ludCgoKENvbm5lY3Rpb25BbmNob3JMb2NhdG9yKSByZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpLmdldExvY2F0aW9uKHJlcXVlc3QKLQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gY21kOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIG51bGwpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkNPTVBPTkVOVF9ST0xFLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKAotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm5lY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDaG9wYm94QW5jaG9yKGdldEZpZ3VyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkFuY2hvciBnZXRTb3VyY2VDb25uZWN0aW9uQW5jaG9yKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoCi0JCQlDb25uZWN0aW9uRWRpdFBhcnQgY29ubmVjdGlvbikgewotCQlyZXR1cm4gbmV3IENob3Bib3hBbmNob3IoZ2V0RmlndXJlKCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uQW5jaG9yIGdldFRhcmdldENvbm5lY3Rpb25BbmNob3IoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgQ2hvcGJveEFuY2hvcihnZXRGaWd1cmUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxTb3VyY2VDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxUYXJnZXRDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIGdldE5vZGUoKS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBnZXRNb2RlbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sb3IgZ2V0QmFja2dyb3VuZENvbG9yKCl7Ci0JCWlmKEJHX0NPTE9SICE9IG51bGwpIHJldHVybiBCR19DT0xPUjsKLQkJCi0JCWlmKEJHX0NPTE9SID09IG51bGwpewotCQkJU3RyaW5nIGNvbG9yU3RyaW5nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuQUREX1dQX0JPWF9CR19DT0xPUl9SR0IpOwotCQkJaWYoY29sb3JTdHJpbmcgIT0gbnVsbCAmJiBjb2xvclN0cmluZy5sZW5ndGgoKSA+IDApewotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbG9yU3RyaW5nLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGcgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaW50IGIgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJQkdfQ09MT1IgPSBuZXcgQ29sb3IobnVsbCwgcixnLGIpOwotCQkJCXJldHVybiBCR19DT0xPUjsKLQkJCX0KLQkJfQotCQlpZihCR19DT0xPUiA9PSBudWxsKXsKLQkJCUJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkJCQkJMjU1LCAyMDUpOwotCQl9Ci0JCXJldHVybiBCR19DT0xPUjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L1dvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzgxNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBQcm92aWRlcyBzdXBwb3J0IGZvciB7QGxpbmsgV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQgZXh0ZW5kcyBOYW1lZE5vZGVFZGl0UGFydCB7Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQoTmFtZWROb2RlIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTmFtZWROb2RlRWRpdFBhcnQjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQlXb3JrUHJvZHVjdE5vZGUgbm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpIG1vZGVsOwotCQkJc3dpdGNoIChub2RlLmdldFR5cGUoKSkgewotCQkJY2FzZSBXb3JrUHJvZHVjdE5vZGUuQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuIEltYWdlcy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl8xNjsKLQkJCWNhc2UgV29ya1Byb2R1Y3ROb2RlLkRFTElWRVJBQkxFOgotCQkJCXJldHVybiBJbWFnZXMuREVMSVZFUkFCTEU7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZS5PVVRDT01FOgotCQkJCXJldHVybiBJbWFnZXMuT1VUQ09NRTsKLQkJCX0KLQkJCXJldHVybiBJbWFnZXMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTY7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0Lk5hbWVkTm9kZUVkaXRQYXJ0I2NyZWF0ZURpcmVjdEVkaXRQb2xpY3koKQotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBjcmVhdGVEaXJlY3RFZGl0TWFuYWdlcigpIHsKLQkJTGFiZWwgbCA9IChMYWJlbCkgZ2V0RmlndXJlKCk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHRDZWxsRWRpdG9yLmNsYXNzLAotCQkJCW5ldyBMYWJlbFRleHRDZWxsRWRpdG9yTG9jYXRvcihsKSwgbCkgewotCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGdldEVkaXRQYXJ0KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQkJCU9iamVjdCBlID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJZSwgdHh0LCBzdXBwcmVzc2lvbik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci52YWxpZGF0ZSh0eHQpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExZmYzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUxheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0OWRjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0RpYWdyYW1MYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlSGVpZ2h0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVOb2RlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5Nb3ZlQmVuZHBvaW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25zdHJhaW5lZExheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEFuIEVkaXRQb2xpY3kgZm9yIHVzZSB3aXRoIDxjb2RlPkZpZ3VyZXM8L2NvZGU+IGluIHtAbGluayBYWUxheW91dH0gb2YgZGlhZ3JhbS4gVGhlIGNvbnN0cmFpbnQgZm9yCi0gKiBYWUxheW91dCBpcyBhIHtAbGluayBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlfS4gSW1wbGVtZW50cyB0aGUgY2hhbmdlY29uc3RyYWludCwgZGVsZXRlLAotICogcmVzaXplIGNvbW1hbmRzIG9mIHtAbGluayBDb25zdHJhaW5lZExheW91dEVkaXRQb2xpY3l9Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDaGFuZ2VDb25zdHJhaW50Q29tbWFuZChFZGl0UGFydCBjaGlsZCwKLQkJCU9iamVjdCBjb25zdHJhaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJCi0JCS8vIHNwZWNpYWwgZm9yIEFERAotCQlFZGl0UGFydCBwYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLQkJaWYocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpewotCQkJU3RyaW5nIGF1dG9sYXlvdXQgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldEF1dG9MYXlvdXRGbGFnKChBY3Rpdml0eURldGFpbERpYWdyYW0pKE5vZGUpcGFyZW50LmdldE1vZGVsKCkpOwotCQkJaWYoYXV0b2xheW91dCAhPSBudWxsKXsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KCgoTm9kZSlwYXJlbnQuZ2V0TW9kZWwoKSkuZ2V0R3JhcGhOb2RlKCksCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCwgCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9GQUxTRSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBjaGlsZC5nZXRNb2RlbCgpOwotCQlpbnQgZGlyZWN0aW9ucyA9IHJlcXVlc3QuZ2V0UmVzaXplRGlyZWN0aW9uKCk7Ci0JCQotCQlpZiAoKGRpcmVjdGlvbnMgJiBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSF9TT1VUSCkgCi0JCQkJPT0gUG9zaXRpb25Db25zdGFudHMuU09VVEgpewotCQkJUG9pbnQgbmV3TG9jYXRpb24gPSBub2RlLmdldExvY2F0aW9uKCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQlpbnQgbmV3SGVpZ2h0ID0gcmVxdWVzdC5nZXRTaXplRGVsdGEoKS5oZWlnaHQ7Ci0JCQlpZiAobmV3SGVpZ2h0ICE9IDApIHsKLQkJCQluZXdIZWlnaHQgKz0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodDsKLQkJCQlpZiAobmV3SGVpZ2h0IDwgMTApCi0JCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfSBlbHNlCi0JCQkJbmV3SGVpZ2h0ID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmhlaWdodDsKLQkJCXJldHVybiBuZXcgQ2hhbmdlSGVpZ2h0Q29tbWFuZChub2RlLCBuZXdMb2NhdGlvbiwgbmV3SGVpZ2h0KTsKLQkJfQotCQllbHNlewotCQkJLy8gT3RoZXIgZGlyZWN0aW9ucyBhcmUgRUFTVCBXRVNULiAKLQkJCVBvaW50IG5ld0xvY2F0aW9uID0gbm9kZS5nZXRMb2NhdGlvbigpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCXJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJaW50IG5ld1dpZHRoID0gcmVxdWVzdC5nZXRTaXplRGVsdGEoKS53aWR0aDsKLQkJCWlmIChuZXdXaWR0aCAhPSAwKSB7Ci0JCQkJbmV3V2lkdGggKz0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCWlmIChuZXdXaWR0aCA8IDEwKQotCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0gZWxzZQotCQkJCW5ld1dpZHRoID0gKChHcmFwaGljYWxFZGl0UGFydCkgY2hpbGQpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJcmV0dXJuIG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKG5vZGUsIG5ld0xvY2F0aW9uLCBuZXdXaWR0aCk7Ci0JCX0gCi0JfQotCi0JcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCVJlc2l6YWJsZUVkaXRQb2xpY3kgY2hpbGRQb2xpY3kgPSBuZXcgUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQlpZihjaGlsZCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgfHwKLQkJCQljaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpewotCQkJY2hpbGRQb2xpY3kuc2V0UmVzaXplRGlyZWN0aW9ucyhQb3NpdGlvbkNvbnN0YW50cy5OU0VXKTsKLQkJfWVsc2V7Ci0JCQljaGlsZFBvbGljeS5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLkVBU1RfV0VTVCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkUG9saWN5OwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkJZ2V0SG9zdEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJCXJldHVybiBuZXcgQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpIHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCQkJCShEaWFncmFtKSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSwgbG9jKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXNpemVDaGlsZHJlbkNvbW1hbmQoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCByZXNpemUgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCUNvbW1hbmQgYzsKLQkJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQ7Ci0JCUxpc3QgY2hpbGRyZW4gPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCWNoaWxkID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQljID0gY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoCi0JCQkJCXJlcXVlc3QsCi0JCQkJCWNoaWxkLAotCQkJCQl0cmFuc2xhdGVUb01vZGVsQ29uc3RyYWludChnZXRDb25zdHJhaW50Rm9yKHJlcXVlc3QsIGNoaWxkKSkpOwotCQkJcmVzaXplLmFkZChjKTsKLQkJCWlmICghY2hpbGQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5pc0VtcHR5KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSBjaGlsZC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCkgewotCQkJCQkJRWRpdFBhcnQgcm9vdGVkaXQgPSBjaGlsZC5nZXRQYXJlbnQoKTsKLQkJCQkJCUxpc3Qgc2VsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJaWYgKHJvb3RlZGl0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCQkJc2VsID0gKChEaWFncmFtRWRpdFBhcnQpIHJvb3RlZGl0KS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkJLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlFZGl0UGFydCBwYXJ0ID0gKChMaW5rRWRpdFBhcnQpIG9iaikuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQlpZiAoc2VsLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQkJCQkJTGluayBsaW5rID0gKExpbmspICgoTGlua0VkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJCQkJKChEaWFncmFtRWRpdFBhcnQpIHJvb3RlZGl0KS5nZXRWaWV3ZXIoKQotCQkJCQkJCQkJLmFwcGVuZFNlbGVjdGlvbigoTGlua0VkaXRQYXJ0KSBvYmopOwotCQkJCQkJCUxpc3QgYmxpc3QgPSBsaW5rLmdldEJlbmRwb2ludHMoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGJsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IGFicG9pbnQgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGJsaXN0Ci0JCQkJCQkJCQkJLmdldChqKTsKLQkJCQkJCQkJUG9pbnQgZGVsdGFQb2ludCA9IHJlcXVlc3QuZ2V0TW92ZURlbHRhKCk7Ci0JCQkJCQkJCSgoTGlua0VkaXRQYXJ0KSBvYmopLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJLnRyYW5zbGF0ZVRvQWJzb2x1dGUoZGVsdGFQb2ludCk7Ci0JCQkJCQkJCVBvaW50IHAgPSBhYnBvaW50LmdldFRyYW5zbGF0ZWQocmVxdWVzdAotCQkJCQkJCQkJCS5nZXRNb3ZlRGVsdGEoKSk7Ci0JCQkJCQkJCUNvbW1hbmQgYmVuZGNvbW1hbmQgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgcCwgaik7Ci0JCQkJCQkJCXJlc2l6ZS5hZGQoYmVuZGNvbW1hbmQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzaXplOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xhYmVsU2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5M2M1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGFiZWxTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotLyoqCi0gKiBIYW5kbGVzIHNlbGVjdGlvbiBvZiBhY3Rpdml0ZXMuIFByaW1hcnkgc2VsZWN0aW9uIGlzIGRlbm90ZWQgYnkgaGlnaGxpZ2h0IGFuZAotICogYSBmb2N1cyByZWN0YW5nbGUuIE5vcm1hbCBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQgb25seS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExhYmVsU2VsZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3kgewotCi0JcHJpdmF0ZSBTZWxlY3RhYmxlTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKTsKLQkJcmV0dXJuICgoU2VsZWN0YWJsZUxhYmVsKSBwYXJ0LmdldEZpZ3VyZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeSNoaWRlRm9jdXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkhhbmRsZXNFZGl0UG9saWN5I2hpZGVTZWxlY3Rpb24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWdldExhYmVsKCkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQlnZXRMYWJlbCgpLnNldEZvY3VzKGZhbHNlKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5I3Nob3dGb2N1cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlnZXRMYWJlbCgpLnNldEZvY3VzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25IYW5kbGVzRWRpdFBvbGljeSNzaG93U2VsZWN0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJZ2V0TGFiZWwoKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuU2VsZWN0aW9uSGFuZGxlc0VkaXRQb2xpY3kjc2hvd1NlbGVjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJZ2V0TGFiZWwoKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJZ2V0TGFiZWwoKS5zZXRGb2N1cyhmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtCZW5kcG9pbnRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGJmODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9MaW5rQmVuZHBvaW50RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkRlbGV0ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuTW92ZUJlbmRwb2ludENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkJlbmRwb2ludEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkJlbmRwb2ludFJlcXVlc3Q7Ci0KLS8qKgotICogQSBFZGl0UG9saWN5IHRvIGhhbmRsZSB0aGUgY3JlYXRlLCBtb3ZlIGFuZCBkZWxldGUgYmVuZHBvaW50cyBhY3Rpdml0aWVzIG9mIExpbmsuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rQmVuZHBvaW50RWRpdFBvbGljeSBleHRlbmRzIEJlbmRwb2ludEVkaXRQb2xpY3kgewotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQmVuZHBvaW50Q29tbWFuZChCZW5kcG9pbnRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQlnZXRDb25uZWN0aW9uKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQlyZXR1cm4gbmV3IENyZWF0ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJKExpbmspIHJlcXVlc3QuZ2V0U291cmNlKCkuZ2V0TW9kZWwoKSwgbG9jLCByZXF1ZXN0LmdldEluZGV4KCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldERlbGV0ZUJlbmRwb2ludENvbW1hbmQoQmVuZHBvaW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBuZXcgRGVsZXRlQmVuZHBvaW50Q29tbWFuZCgoTGluaykgZ2V0SG9zdCgpLmdldE1vZGVsKCksIHJlcXVlc3QKLQkJCQkuZ2V0SW5kZXgoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUJlbmRwb2ludENvbW1hbmQoQmVuZHBvaW50UmVxdWVzdCByZXF1ZXN0KSB7Ci0JCVBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJZ2V0Q29ubmVjdGlvbigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJcmV0dXJuIG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgoTGluaykgcmVxdWVzdC5nZXRTb3VyY2UoKS5nZXRNb2RlbCgpLAotCQkJCWxvYywgcmVxdWVzdC5nZXRJbmRleCgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL0xpbmtFbmRwb2ludEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0VuZHBvaW50RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA1YWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvTGlua0VuZHBvaW50RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Db25uZWN0aW9uRW5kcG9pbnRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSB0byBoYW5kbGUgdGhlIHNlbGVjdGlvbiBoYW5kbGVzIGZvciBjb25uZWN0aW9uLiAKLSAqICAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRW5kcG9pbnRFZGl0UG9saWN5IGV4dGVuZHMgQ29ubmVjdGlvbkVuZHBvaW50RWRpdFBvbGljeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBGb250IEJPTERfRk9OVDsKLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCXN1cGVyLmFkZFNlbGVjdGlvbkhhbmRsZXMoKTsKLQkJZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldExpbmVXaWR0aCgyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUG9seWxpbmVDb25uZWN0aW9uIGdldENvbm5lY3Rpb25GaWd1cmUoKSB7Ci0JCXJldHVybiAoUG9seWxpbmVDb25uZWN0aW9uKSBnZXRIb3N0RmlndXJlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJc3VwZXIuaGlkZVNlbGVjdGlvbigpOwotCQlnZXRIb3N0RmlndXJlKCkuc2V0Rm9udChudWxsKTsKLQkJZ2V0SG9zdEZpZ3VyZSgpLmludmFsaWRhdGVUcmVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJc3VwZXIucmVtb3ZlU2VsZWN0aW9uSGFuZGxlcygpOwotCQlnZXRDb25uZWN0aW9uRmlndXJlKCkuc2V0TGluZVdpZHRoKDApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCXN1cGVyLnNob3dTZWxlY3Rpb24oKTsKLQkJaWYgKEJPTERfRk9OVCA9PSBudWxsKSB7Ci0JCQlGb250RGF0YVtdIGRhdGEgPSBnZXRDb25uZWN0aW9uRmlndXJlKCkuZ2V0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspCi0JCQkJaWYgKChkYXRhW2ldLmdldFN0eWxlKCkgJiBTV1QuQk9MRCkgPT0gMCkKLQkJCQkJZGF0YVtpXS5zZXRTdHlsZShkYXRhW2ldLmdldFN0eWxlKCkgfCBTV1QuQk9MRCk7Ci0JCQlCT0xEX0ZPTlQgPSBuZXcgRm9udChudWxsLCBkYXRhKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuc2V0Rm9udChCT0xEX0ZPTlQpOwotCQlnZXRIb3N0RmlndXJlKCkuaW52YWxpZGF0ZVRyZWUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZjA1ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29udGFpbmVyRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLQotLyoqCi0gKiBBIEVkaXRQb2xpY3kgZm9yIHtAbGluayBOb2RlQ29udGFpbmVyRWRpdFBhcnR9IGZvciBkaXNhYmxpbmcgZGlyZWN0IGNoaWxkIGNyZWF0aW9uLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vZGVDb250YWluZXJFZGl0UG9saWN5IGV4dGVuZHMgQ29udGFpbmVyRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29udGFpbmVyRWRpdFBvbGljeSNnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9Ob2RlQ29udGFpbmVyRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmNDgxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL05vZGVDb250YWluZXJGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkZsb3dMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi0vKioKLSAqIEEgRWRpdFBvbGljeSBmb3Ige0BsaW5rIE5vZGVDb250YWluZXJFZGl0UGFydH0gdG8gZGlzYWJsZSB0aGUgYWxsIGVkaXRpbmcgZmVhdHVyZXMuCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9kZUNvbnRhaW5lckZsb3dMYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgRmxvd0xheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk9yZGVyZWRMYXlvdXRFZGl0UG9saWN5I2NyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQsCi0JICogICAgICBFZGl0UGFydCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRQYXJ0IGNoaWxkLCBFZGl0UGFydCBhZnRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuT3JkZXJlZExheW91dEVkaXRQb2xpY3kjY3JlYXRlTW92ZUNoaWxkQ29tbWFuZChFZGl0UGFydCwKLQkgKiAgICAgIEVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZU1vdmVDaGlsZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeSNnZXREZWxldGVEZXBlbmRhbnRDb21tYW5kKFJlcXVlc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVsZXRlRGVwZW5kYW50Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9lZGl0L3BvbGljaWVzL1JvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGZlODdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuRmxvd0xheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLS8qKgotICogRWRpdFBvbGljeSB0byBkaXNhYmxlIHRoZSBlZGl0aW5nIGZlYXR1cmUgaW4gYSB7QGxpbmsgRmxvd0xheW91dH0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrRmxvd0xheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBGbG93TGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tGbG93TGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydCwgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5PcmRlcmVkTGF5b3V0RWRpdFBvbGljeSNjcmVhdGVNb3ZlQ2hpbGRDb21tYW5kKG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydCwgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZU1vdmVDaGlsZENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsIEVkaXRQYXJ0IGFmdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQob3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3QpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2VkaXQvcG9saWNpZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDg1NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZWRpdC9wb2xpY2llcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBncmFwaGljYWwgZWRpdCBwb2xpY2llcyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvQWN0aXZpdHlGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhNGY3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0FjdGl2aXR5RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi0vKioKLSAqIEBhdXRob3IgSmFtZXMgVGhhcmlvCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaWd1cmUgZXh0ZW5kcyBUZXh0RmlndXJlIHsKLQotCXB1YmxpYyBBY3Rpdml0eUZpZ3VyZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NlbnRyZWRMYWJlbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9DZW50cmVkTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcwOWY4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NlbnRyZWRMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIENlbnRyZWRMYWJlbCBleHRlbmRzIExhYmVsIHsKLQotCXB1YmxpYyBDZW50cmVkTGFiZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENlbnRyZWRMYWJlbChTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0KLQlwdWJsaWMgQ2VudHJlZExhYmVsKEltYWdlIGkpIHsKLQkJc3VwZXIoaSk7Ci0JfQotCi0JcHVibGljIENlbnRyZWRMYWJlbChTdHJpbmcgcywgSW1hZ2UgaSkgewotCQlzdXBlcihzLCBpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjcGFpbnRGaWd1cmUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJaWYgKGlzT3BhcXVlKCkpCi0JCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSBnZXRCb3VuZHMoKTsKLQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnllbGxvdyk7Ci0JCWdyYXBoaWNzLnRyYW5zbGF0ZShib3VuZHMueCwgYm91bmRzLnkpOwotCQlpZiAoIWlzRW5hYmxlZCgpKSB7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoMSwgMSk7Ci0JCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25MaWdodGVzdCk7Ci0JCQlncmFwaGljcy5kcmF3VGV4dChnZXRTdWJTdHJpbmdUZXh0KCksIGdldFRleHRMb2NhdGlvbigpKTsKLQkJCWdyYXBoaWNzLnRyYW5zbGF0ZSgtMSwgLTEpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkRhcmtlcik7Ci0JCX0KLQkJZ3JhcGhpY3MuZHJhd1RleHQoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRUZXh0TG9jYXRpb24oKSk7Ci0JCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy55ZWxsb3cpOwotCQlncmFwaGljcy50cmFuc2xhdGUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbG9ycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db2xvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3ZTAyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogVGhlIGNvbG9yIGNvbnN0YW50cyByZWZlcmVuY2VkIGJ5IHRoZSBkaWFncmFtIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xvcnMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBJTkhFUklURURfRUxFTUVOVF9MQUJFTCA9IENvbG9yQ29uc3RhbnRzLmRhcmtHcmVlbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgU1VQUkVTU0VEX0VMRU1FTlRfTEFCRUwgPSBDb2xvckNvbnN0YW50cy5ncmF5OwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbXBvc2l0ZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Db21wb3NpdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyZmNjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZsb3dMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xvciBCR19DT0xPUiA9IG5ldyBDb2xvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgMjU1LAotCQkJMjU1LCAyMDUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1dJRFRIID0gNTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1BBQ0lORyA9IDEwOwotCi0JcHJpdmF0ZSBpbnQgbWF4V2lkdGggPSBERUZBVUxUX01BWF9XSURUSDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVGaWd1cmUoKSB7Ci0JCVRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJbGF5b3V0LnNldE1pbm9yQWxpZ25tZW50KEZsb3dMYXlvdXQuQUxJR05fQ0VOVEVSKTsKLQkJbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQlsYXlvdXQuc2V0U3BhY2luZyhTUEFDSU5HKTsKLQkJbGF5b3V0LnNldE9ic2VydmVWaXNpYmlsaXR5KHRydWUpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlzZXRCYWNrZ3JvdW5kQ29sb3IoQkdfQ09MT1IpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWF4V2lkdGgoaW50IHcpIHsKLQkJbWF4V2lkdGggPSB3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNnZXRQcmVmZXJyZWRTaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQlpZiAod0hpbnQgPiBtYXhXaWR0aCkgewotCQkJd0hpbnQgPSBtYXhXaWR0aDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJlZmVycmVkU2l6ZSh3SGludCwgaEhpbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9EaWFtb25kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0RpYW1vbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZmZTRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0RpYW1vbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBBIGZpZ3VyZSBmb3IgZGlhbW9uZCBzaGFwZS4gIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYW1vbmQgZXh0ZW5kcyBTaGFwZSB7Ci0KLQlwcml2YXRlIFBvaW50TGlzdCBkaWFtb25kID0gbmV3IFBvaW50TGlzdCg0KTsKLQotCS8qKgotCSAqIEBzZWUgU2hhcGUjZmlsbFNoYXBlKEdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBnKSB7Ci0JCWcuZmlsbFBvbHlnb24oZGlhbW9uZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBTaGFwZSNvdXRsaW5lU2hhcGUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGcpIHsKLQkJZy5kcmF3UG9seWdvbihkaWFtb25kKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmUjdmFsaWRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJci5jcm9wKGdldEluc2V0cygpKTsKLQkJci5yZXNpemUoLTEsIC0xKTsKLQkJZGlhbW9uZC5yZW1vdmVBbGxQb2ludHMoKTsKLQkJZGlhbW9uZC5hZGRQb2ludChyLmdldFRvcCgpKTsKLQkJZGlhbW9uZC5hZGRQb2ludChyLmdldFJpZ2h0KCkpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0Qm90dG9tKCkpOwotCQlkaWFtb25kLmFkZFBvaW50KHIuZ2V0TGVmdCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZSNwcmltVHJhbnNsYXRlKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByaW1UcmFuc2xhdGUoaW50IHgsIGludCB5KSB7Ci0JCXN1cGVyLnByaW1UcmFuc2xhdGUoeCwgeSk7Ci0JCWRpYW1vbmQudHJhbnNsYXRlKHgsIHkpOwotCX0KLQotCXB1YmxpYyBQb2ludExpc3QgZ2V0UG9pbnRzKCkgewotCQlyZXR1cm4gZGlhbW9uZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDFhMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9FbmROb2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotCi0vKioKLSAqIEZpZ3VyZSBmb3Ige0BsaW5rIFR5cGVkTm9kZX0gZW5kLgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVuZE5vZGVGaWd1cmUgZXh0ZW5kcyBFbGxpcHNlIHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI2ZpbGxTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlyLnNocmluayhyLndpZHRoIC8gOCwgci5oZWlnaHQgLyA4KTsKLQkJZ3JhcGhpY3MuZmlsbE92YWwocik7Ci0JfQotCi0JLyoqCi0JICogT3V0bGluZXMgdGhlIGVsbGlwc2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuU2hhcGUjb3V0bGluZVNoYXBlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvdXRsaW5lU2hhcGUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJc3VwZXIub3V0bGluZVNoYXBlKGdyYXBoaWNzKTsKLQotCQlSZWN0YW5nbGUgciA9IFJlY3RhbmdsZS5TSU5HTEVUT047Ci0JCXIuc2V0Qm91bmRzKGdldEJvdW5kcygpKTsKLQkJci5zaHJpbmsoZ2V0Qm91bmRzKCkud2lkdGggLyA4LCBnZXRCb3VuZHMoKS5oZWlnaHQgLyA4KTsKLQkJci53aWR0aC0tOwotCQlyLmhlaWdodC0tOwotCQlyLnNocmluaygobGluZVdpZHRoIC0gMSkgLyAyLCAobGluZVdpZHRoIC0gMSkgLyAyKTsKLQkJZ3JhcGhpY3MuZHJhd092YWwocik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ZyZWVUZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZDhlNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9GcmVlVGV4dEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWxhdGl2ZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LkZsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlBhcmFncmFwaFRleHRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuVGV4dEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0vKioKLSAqIEZpZ3VyZSB0byBzdXBwb3J0IGZyZWUgdGV4dCBpbiB0aGUgZGlhZ3JhbSwgd2l0aG91dCBhbiBpbWFnZSBhdHRhY2hlZCB0byBpdC4KLSAqIEZyZWVUZXh0RmlndXJlIHdyYXBwZXIgb3ZlciB7QGxpbmsgRmxvd1BhZ2V9IGFuZCB7QGxpbmsgVGV4dEZsb3d9LiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIGthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRnJlZVRleHRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBGbG93UGFnZSB0ZXh0Rmxvd1BhZ2U7Ci0KLQlwcml2YXRlIFRleHRGbG93IHRleHRGbG93OwotCi0JcHVibGljIEZyZWVUZXh0RmlndXJlKCkgewotCQl0ZXh0Rmxvd1BhZ2UgPSBuZXcgRmxvd1BhZ2UoKTsKLQkJdGV4dEZsb3dQYWdlLnNldEhvcml6b250YWxBbGlnbWVudChQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJYWRkKHRleHRGbG93UGFnZSwgbmV3IFJlbGF0aXZlTG9jYXRvcih0ZXh0Rmxvd1BhZ2UsCi0JCQkJUG9zaXRpb25Db25zdGFudHMuQUxXQVlTX0xFRlQpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dEZsb3cuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dEZsb3dQYWdlLnJlbW92ZUFsbCgpOwotCQl0ZXh0RmxvdyA9IG5ldyBUZXh0RmxvdygpOwotCQl0ZXh0Rmxvdy5zZXRGb250KFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0JCXRleHRGbG93LnNldExheW91dE1hbmFnZXIobmV3IFBhcmFncmFwaFRleHRMYXlvdXQodGV4dEZsb3csCi0JCQkJUGFyYWdyYXBoVGV4dExheW91dC5XT1JEX1dSQVBfVFJVTkNBVEUpKTsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQkJdGV4dEZsb3dQYWdlLmFkZCh0ZXh0Rmxvdyk7Ci0JfQotCi0JcHVibGljIEZsb3dQYWdlIGdldFRleHRGbG93UGFnZSgpIHsKLQkJcmV0dXJuIHRleHRGbG93UGFnZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Rm9udChGb250IGYpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZXRGb250KGYpOwotCQl0ZXh0Rmxvdy5zZXRGb250KGYpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3IgZmcpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlzdXBlci5zZXRGb3JlZ3JvdW5kQ29sb3IoZmcpOwotCQl0ZXh0Rmxvdy5zZXRGb3JlZ3JvdW5kQ29sb3IoZmcpOwotCX0KLQotCXB1YmxpYyBUZXh0RmxvdyBnZXRUZXh0RmxvdygpIHsKLQkJcmV0dXJuIHRleHRGbG93OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvSW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL0ltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRlMDFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogSW1hZ2UgbG9jYXRpb24gY29uc3RhbnRzIHJlZmVyZW5jZWQgaW4gZGlhZ3JhbS4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBJbWFnZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBBQ1RJVklUWSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9hY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJVEVSQVRJT04gPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvaXRlcmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFBIQVNFID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlKAotCQkJInNoYXBlL3BoYXNlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE1JTEVTVE9ORSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldEltYWdlKCJzaGFwZS9taWxlc3RvbmUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgUk9MRSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZSgKLQkJCSJzaGFwZS9yb2xlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFRBU0sgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2UoCi0JCQkic2hhcGUvdGFzay5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBUQVNLX0RFU0NSSVBUT1IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvdGFza2Rlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2hhcGUvd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIEFSVElGQUNUID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2FydGlmYWN0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERFTElWRVJBQkxFID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0SW1hZ2UoInNoYXBlL2RlbGl2ZXJhYmxlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIE9VVENPTUUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgic2hhcGUvb3V0Y29tZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBXT1JLX1BST0RVQ1QgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRJbWFnZSgiV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIFRBU0tfREVTQ1JJUFRPUl8xNiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlKCJzaGFwZS90YXNrZGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBST0xFX0RFU0NSSVBUT1JfMTYgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2hhcGUvcm9sZWRlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfMTYgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZSgic2hhcGUvd29ya2Rlc19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Ob3RlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL05vdGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhYjFlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL05vdGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBKYW1lcyBUaGFyaW8KLSAqIEBzaW5jZSAgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTm90ZUZpZ3VyZQotICAgICAgICBleHRlbmRzIFRleHRGaWd1cmUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT1JORVJfU0laRSA9IDQ7Ci0KLSAgICBwdWJsaWMgTm90ZUZpZ3VyZSgpIHsKLSAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnRvb2x0aXBCYWNrZ3JvdW5kKTsKLSAgICAgICAgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrKTsKLQotICAgICAgICBzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcihDT1JORVJfU0laRSkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0gICAgICAgIFJlY3RhbmdsZSByZWN0ID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCi0gICAgICAgIGdyYXBoaWNzLnRyYW5zbGF0ZShnZXRMb2NhdGlvbigpKTsKLQotICAgICAgICAvLyBmaWxsIHRoZSBub3RlCi0gICAgICAgIFBvaW50TGlzdCBvdXRsaW5lID0gbmV3IFBvaW50TGlzdCgpOwotCi0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQoMCwgMCk7Ci0gICAgICAgIG91dGxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIENPUk5FUl9TSVpFLCAwKTsKLSAgICAgICAgb3V0bGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gMSwgQ09STkVSX1NJWkUpOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotICAgICAgICBvdXRsaW5lLmFkZFBvaW50KDAsIHJlY3QuaGVpZ2h0IC0gMSk7Ci0KLSAgICAgICAgZ3JhcGhpY3MuZmlsbFBvbHlnb24ob3V0bGluZSk7Ci0KLSAgICAgICAgLy8gZHJhdyB0aGUgaW5uZXIgb3V0bGluZQotICAgICAgICBQb2ludExpc3QgaW5uZXJMaW5lID0gbmV3IFBvaW50TGlzdCgpOwotCi0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUgLSAxLCAwKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSBDT1JORVJfU0laRSAtIDEsIENPUk5FUl9TSVpFKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCBDT1JORVJfU0laRSk7Ci0gICAgICAgIGlubmVyTGluZS5hZGRQb2ludChyZWN0LndpZHRoIC0gQ09STkVSX1NJWkUgLSAxLCAwKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KDAsIDApOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQoMCwgcmVjdC5oZWlnaHQgLSAxKTsKLSAgICAgICAgaW5uZXJMaW5lLmFkZFBvaW50KHJlY3Qud2lkdGggLSAxLCByZWN0LmhlaWdodCAtIDEpOwotICAgICAgICBpbm5lckxpbmUuYWRkUG9pbnQocmVjdC53aWR0aCAtIDEsIENPUk5FUl9TSVpFKTsKLQotICAgICAgICBncmFwaGljcy5kcmF3UG9seWdvbihpbm5lckxpbmUpOwotCi0gICAgICAgIGdyYXBoaWNzLnRyYW5zbGF0ZShnZXRMb2NhdGlvbigpLmdldE5lZ2F0ZWQoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWM4YTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5SYWlzZWRNYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRmlndXJlIGZvciB7QGxpbmsgUm9sZVRhc2tDb21wb3NpdGV9LgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIGV4dGVuZHMgRmlndXJlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbG9yIEJHX0NPTE9SID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkyNTUsIDE1Nik7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1dJRFRIID0gNTAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTk9SX1NQQUNJTkcgPSAyMDsKLQotCXByaXZhdGUgRmlndXJlIHRhc2tzRmlndXJlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgewotCQlGbG93TGF5b3V0IGxheW91dCA9IG5ldyBGbG93TGF5b3V0KHRydWUpOwotCQlsYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9DRU5URVIpOwotCQlsYXlvdXQuc2V0TWFqb3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9MRUZUVE9QKTsKLQkJbGF5b3V0LnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQlsYXlvdXQuc2V0TWlub3JTcGFjaW5nKE1JTk9SX1NQQUNJTkcpOwotCQlsYXlvdXQuc2V0T2JzZXJ2ZVZpc2liaWxpdHkodHJ1ZSk7Ci0KLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlzZXRCb3JkZXIobmV3IFJhaXNlZE1hcmdpbkJvcmRlcigpKTsKLQkJc2V0QmFja2dyb3VuZENvbG9yKEJHX0NPTE9SKTsKLQkJc2V0T3BhcXVlKHRydWUpOwotCi0JCXRhc2tzRmlndXJlID0gbmV3IEZpZ3VyZSgpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyBEaW1lbnNpb24gZ2V0UHJlZmVycmVkU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCkgewotCQkJCUlGaWd1cmUgZmlyc3RDaGlsZCA9IChJRmlndXJlKSBnZXRDaGlsZHJlbigpLmdldCgwKTsKLQkJCQlpZiAoZmlyc3RDaGlsZCAhPSB0aGlzKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBmaXJzdENoaWxkLmdldFNpemUoKS53aWR0aDsgLy8gZmlyc3RDaGlsZC5nZXRTaXplKCkud2lkdGgKLQkJCQkJLy8gKwotCQkJCQkvLyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZS50aGlzLmdldEluc2V0cygpLmdldFdpZHRoKCkKLQkJCQkJLy8gKwotCQkJCQkvLyBNSU5PUl9TUEFDSU5HOwotCQkJCQlpZiAod0hpbnQgPCBvZmZzZXQpIHsKLQotCQkJCQl9Ci0JCQkJCXdIaW50ID0gd0hpbnQgLSBvZmZzZXQ7Ci0JCQkJCWlmICh3SGludCA+IE1BWF9XSURUSCkgewotCQkJCQkJd0hpbnQgPSBNQVhfV0lEVEg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGltZW5zaW9uIGRpbSA9IHN1cGVyLmdldFByZWZlcnJlZFNpemUod0hpbnQsIGhIaW50KTsKLQkJCQlyZXR1cm4gZGltOwotCQkJfQotCQl9OwotCQlGbG93TGF5b3V0IGZsb3dMYXlvdXQgPSBuZXcgRmxvd0xheW91dCgpOwotCQlmbG93TGF5b3V0LnNldE1pbm9yU3BhY2luZygxMCk7Ci0JCWZsb3dMYXlvdXQuc2V0TWlub3JBbGlnbm1lbnQoRmxvd0xheW91dC5BTElHTl9DRU5URVIpOwotCQl0YXNrc0ZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKGZsb3dMYXlvdXQpOwotCQl0YXNrc0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCXN1cGVyLmFkZCh0YXNrc0ZpZ3VyZSwgbnVsbCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZSNhZGQoSUZpZ3VyZSwgT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKElGaWd1cmUgZmlndXJlLCBPYmplY3QgY29uc3RyYWludCwgaW50IGluZGV4KSB7Ci0JCWlmIChnZXRDaGlsZHJlbigpLnNpemUoKSA9PSAxKSB7Ci0JCQlzdXBlci5hZGQoZmlndXJlLCBjb25zdHJhaW50LCAwKTsKLQkJfSBlbHNlIHsKLQkJCXRhc2tzRmlndXJlLmFkZChmaWd1cmUsIGNvbnN0cmFpbnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrRmxvd0xheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9Sb2xlVGFza0Zsb3dMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkNzg2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1JvbGVUYXNrRmxvd0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GbG93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tGbG93TGF5b3V0IGV4dGVuZHMgRmxvd0xheW91dCB7Ci0KLQlib29sZWFuIGFkanVzdCA9IGZhbHNlOwotCVdvcmtpbmdEYXRhIGRhdGE7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFJvbGVUYXNrRmxvd0xheW91dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlzSG9yaXpvbnRhbAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0Zsb3dMYXlvdXQoYm9vbGVhbiBpc0hvcml6b250YWwpIHsKLQkJc3VwZXIoaXNIb3Jpem9udGFsKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCXB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIHBhcmVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmKGFkanVzdCl7Ci0JCQlhZGp1c3RMYXlvdXQocGFyZW50KTsKLQkJfWVsc2UKLQkJCXN1cGVyLmxheW91dChwYXJlbnQpOwotCX0KLQljbGFzcyBXb3JraW5nRGF0YSB7Ci0JCWludCByb3dIZWlnaHQsIHJvd1dpZHRoLCByb3dDb3VudCwgcm93WCwgcm93WSwgbWF4V2lkdGg7Ci0JCVJlY3RhbmdsZSBib3VuZHNbXSwgYXJlYTsKLQkJSUZpZ3VyZSByb3dbXTsKLQl9Ci0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHN0YXRlIG9mIHJvdyBkYXRhLCB3aGljaCBpcyBpbnRlcm5hbCB0byB0aGUgbGF5b3V0IHByb2Nlc3MuIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0Um93KCkgewotCQlkYXRhLnJvd1ggPSAwOwotCQlkYXRhLnJvd0hlaWdodCA9IDA7Ci0JCWRhdGEucm93V2lkdGggPSAwOwotCQlkYXRhLnJvd0NvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZSBkYXRhIGZvciBsYXlpbmcgb3V0IGNoaWxkcmVuLCBiYXNlZCBvbiB0aGUgRmlndXJlIGdpdmVuIGFzIGlucHV0LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCB0aGUgcGFyZW50IGZpZ3VyZQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRWYXJpYWJsZXMoSUZpZ3VyZSBwYXJlbnQpIHsKLQkJZGF0YS5yb3cgPSBuZXcgSUZpZ3VyZVtwYXJlbnQuZ2V0Q2hpbGRyZW4oKS5zaXplKCldOwotCQlkYXRhLmJvdW5kcyA9IG5ldyBSZWN0YW5nbGVbZGF0YS5yb3cubGVuZ3RoXTsKLQkJZGF0YS5tYXhXaWR0aCA9IGRhdGEuYXJlYS53aWR0aDsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkanVzdExheW91dChJRmlndXJlIHBhcmVudCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWRhdGEgPSBuZXcgV29ya2luZ0RhdGEoKTsKLQkJUmVjdGFuZ2xlIHJlbGF0aXZlQXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCWRhdGEuYXJlYSA9IHRyYW5zcG9zZXIudChyZWxhdGl2ZUFyZWEpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyZW50LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJaW50IGR4OwotCi0JCS8vQ2FsY3VsYXRlIHRoZSBoaW50cyB0byBiZSBwYXNzZWQgdG8gY2hpbGRyZW4KLQkJaW50IHdIaW50ID0gLTE7Ci0JCWludCBoSGludCA9IC0xOwotCQlpZiAoaXNIb3Jpem9udGFsKCkpCi0JCQl3SGludCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkud2lkdGg7Ci0JCWVsc2UKLQkJCWhIaW50ID0gcGFyZW50LmdldENsaWVudEFyZWEoKS5oZWlnaHQ7Ci0KLQkJaW5pdFZhcmlhYmxlcyhwYXJlbnQpOwotCQlpbml0Um93KCk7Ci0JCWludCBpID0gMDsgCi0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlGaWd1cmUgZiA9IChJRmlndXJlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCURpbWVuc2lvbiBwcmVmID0gdHJhbnNwb3Nlci50KGdldENoaWxkU2l6ZShmLCB3SGludCwgaEhpbnQpKTsKLQkJCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZSgwLCAwLCBwcmVmLndpZHRoLCBwcmVmLmhlaWdodCk7Ci0KLQkJCWlmIChkYXRhLnJvd0NvdW50ID4gMCkgewotCQkJCWlmIChkYXRhLnJvd1dpZHRoICsgcHJlZi53aWR0aCA+IGRhdGEubWF4V2lkdGgpCi0JCQkJCWxheW91dFJvdyhwYXJlbnQpOwotCQkJfQotCQkJci54ID0gZGF0YS5yb3dYOwotCQkJci55ID0gZGF0YS5yb3dZOwotCQkJZHggPSByLndpZHRoICsgZ2V0TWlub3JTcGFjaW5nKCk7Ci0JCQlkYXRhLnJvd1ggKz0gZHg7Ci0JCQlkYXRhLnJvd1dpZHRoICs9IGR4OwotCQkJZGF0YS5yb3dIZWlnaHQgPSBNYXRoLm1heChkYXRhLnJvd0hlaWdodCwgci5oZWlnaHQpOwotCQkJZGF0YS5yb3cgW2RhdGEucm93Q291bnRdID0gZjsKLQkJCWRhdGEuYm91bmRzW2RhdGEucm93Q291bnRdID0gcjsKLQkJCWRhdGEucm93Q291bnQrKzsKLQkJCWkrKzsKLQkJfQotCQlpZiAoZGF0YS5yb3dDb3VudCAhPSAwKQotCQkJbGF5b3V0Um93KHBhcmVudCk7Ci0JCWRhdGEgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFkanVzdChib29sZWFuIGFkanVzdCkgewotCQl0aGlzLmFkanVzdCA9IGFkanVzdDsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1NlbGVjdGFibGVMYWJlbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9TZWxlY3RhYmxlTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5MjViOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1NlbGVjdGFibGVMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBBIGN1c3RvbWl6ZWQgTGFiZWwgZm9yIHNlbGVjdGlvbi4gUHJpbWFyeSBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQKLSAqIGFuZCBmb2N1cyByZWN0YW5nbGUuIE5vcm1hbCBzZWxlY3Rpb24gaXMgZGVub3RlZCBieSBoaWdobGlnaHQgb25seS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGFibGVMYWJlbCBleHRlbmRzIExhYmVsIHsKLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RlZDsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNGb2N1czsKLQotCXByaXZhdGUgUmVjdGFuZ2xlIGdldFNlbGVjdGlvblJlY3RhbmdsZSgpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldFRleHRCb3VuZHMoKTsKLQkJYm91bmRzLmV4cGFuZChuZXcgSW5zZXRzKDIsIDIsIDAsIDApKTsKLQkJdHJhbnNsYXRlVG9QYXJlbnQoYm91bmRzKTsKLQkJYm91bmRzLmludGVyc2VjdChnZXRCb3VuZHMoKSk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWwjcGFpbnRGaWd1cmUoR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLmZpbGxSZWN0YW5nbGUoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCX0KLQkJaWYgKGhhc0ZvY3VzKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldFhPUk1vZGUodHJ1ZSk7Ci0JCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMud2hpdGUpOwotCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldFNlbGVjdGlvblJlY3RhbmdsZSgpLnJlc2l6ZSgtMSwgLTEpKTsKLQkJCWdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0JCX0KLQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGlzIFNpbXBsZUFjdGl2aXR5TGFiZWwKLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdHJ1ZSB3aWxsIGNhdXNlIHRoZSBsYWJlbCB0byBhcHBlYXIgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJc2VsZWN0ZWQgPSBiOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBTaW1wbGVBY3Rpdml0eUxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSBhIGZvY3VzIHJlY3RhbmdsZSB0byBiZSBkcmF3biBhcm91bmQgdGhlIHRleHQKLQkgKiAgICAgICAgICAgIG9mIHRoZSBMYWJlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKGJvb2xlYW4gYikgewotCQloYXNGb2N1cyA9IGI7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL2ZpZ3VyZXMvVGV4dEZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9UZXh0RmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZTFhOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9UZXh0RmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVsYXRpdmVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LkZsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC50ZXh0LlBhcmFncmFwaFRleHRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuVGV4dEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGV4dEZpZ3VyZSBpcyBjdXN0b21pemFibGUgZmlndXJlIHRvIGFsbG93IHdvcmQtd3JhcGluZyBhbmQgd2l0aCBpbWFnZS4gCi0gKiB7QGxpbmsgTGFiZWx9IGRvIG5vdCBzdXBwb3J0IHdvcmQtd3JhcC4gIFRleHRGaWd1cmUgaXMgd3JhcHBlciBvdmVyIHtAbGluayBUZXh0Rmxvd30KLSAqIGFuZCB7QGxpbmsgRmxvd1BhZ2V9IHRvIHN1cHBvcnQgd29yZC13cmFwIGFuZCBpbWFnZS4gCi0gKiBAYXV0aG9yIEphbWVzIFRoYXJpbwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRleHRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHJpdmF0ZSBGbG93UGFnZSB0ZXh0Rmxvd1BhZ2U7Ci0KLQlwcml2YXRlIFRleHRGbG93IHRleHRGbG93OwotCi0JcHJpdmF0ZSBJbWFnZUZpZ3VyZSBpbWFnZUZpZ3VyZTsKLQotCXB1YmxpYyBUZXh0RmlndXJlKCkgewotCQl0ZXh0Rmxvd1BhZ2UgPSBuZXcgRmxvd1BhZ2UoKTsKLQkJdGV4dEZsb3dQYWdlLnNldEhvcml6b250YWxBbGlnbWVudChQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlpbWFnZUZpZ3VyZSA9IG5ldyBJbWFnZUZpZ3VyZSgpOwotCQlhZGQoaW1hZ2VGaWd1cmUsIG5ldyBSZWxhdGl2ZUxvY2F0b3IoaW1hZ2VGaWd1cmUsCi0JCQkJUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSk7Ci0JCWFkZCh0ZXh0Rmxvd1BhZ2UsIG5ldyBSZWxhdGl2ZUxvY2F0b3IodGV4dEZsb3dQYWdlLAotCQkJCVBvc2l0aW9uQ29uc3RhbnRzLkFMV0FZU19MRUZUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEltYWdlIGltYWdlKSB7Ci0JCWltYWdlRmlndXJlLnNldEltYWdlKGltYWdlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvdy5nZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQl0ZXh0Rmxvd1BhZ2UucmVtb3ZlQWxsKCk7Ci0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0JCXRleHRGbG93LnNldEZvbnQoVGVtcGxhdGVDb25zdGFudHMuREVGQVVMVF9GT05UKTsKLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9IQVJEKSk7Ci0JCXRleHRGbG93LnNldFRleHQobmV3VGV4dCk7Ci0JCXRleHRGbG93UGFnZS5hZGQodGV4dEZsb3cpOwotCX0KLQotCXB1YmxpYyBGbG93UGFnZSBnZXRUZXh0Rmxvd1BhZ2UoKSB7Ci0JCXJldHVybiB0ZXh0Rmxvd1BhZ2U7Ci0JfQotCi0JcHVibGljIFRleHRGbG93IGdldFRleHRGbG93KCkgewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUENvbXBhcnRtZW50RmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQQ29tcGFydG1lbnRGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3ZWQ3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQQ29tcGFydG1lbnRGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LlJhaXNlZE1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdQQ29tcGFydG1lbnRGaWd1cmUgZXh0ZW5kcyBGaWd1cmUgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb2xvciB3cENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCAyNTUsCi0JCQkyNTUsIDE1Nik7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIGFydGlmYWN0Q29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkyNTUsIDI1NSwgMTU2KTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgZGVsaXZlcmFibGVDb2xvciA9IG5ldyBDb2xvcigKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLCAyMDYsIDI1NSwgMjE2KTsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3Igb3V0Y29tZUNvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJMjA2LCAyNTUsIDEwMCk7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBuZXdXUE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5XUENvbXBhcnRtZW50RmlndXJlXzA7IAotCi0JcHVibGljIExhYmVsIGxhYmVsOwotCi0JV1BGaWd1cmUgZmlndXJlID0gbnVsbDsKLQotCS8qKgotCSAqIFdvcmtQcm9kdWN0IENvbXBhcnRtZW50IC0gV2l0aCBiYWNrZ3JvdW5kIGZpbGxlZCBkZXBlbmRpbmcgb24gVHlwZSBvZiB0aGUKLQkgKiBXb3JrUHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgV1BDb21wYXJ0bWVudEZpZ3VyZShMYWJlbCBuYW1lLCBpbnQgdHlwZSkgewotCQlsYWJlbCA9IG5hbWU7Ci0JCVRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlzZXRPcGFxdWUodHJ1ZSk7Ci0JCXNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQlpZiAodHlwZSA9PSAxKQotCQkJc2V0QmFja2dyb3VuZENvbG9yKGFydGlmYWN0Q29sb3IpOwotCQllbHNlIGlmICh0eXBlID09IDIpCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoZGVsaXZlcmFibGVDb2xvcik7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gMykKLQkJCXNldEJhY2tncm91bmRDb2xvcihvdXRjb21lQ29sb3IpOwotCQllbHNlCi0JCQlzZXRCYWNrZ3JvdW5kQ29sb3Iod3BDb2xvcik7Ci0JCWxhYmVsLnNldFRleHQobmV3V1BOYW1lKTsKLQkJYWRkKGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgTGFiZWwgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJbGFiZWwuc2V0VGV4dChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChMYWJlbCBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dQRmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTEwYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XUEZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdEJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEZpZ3VyZSBleHRlbmRzIEZpZ3VyZSB7Ci0KLQlwdWJsaWMgTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoKTsKLQotCXB1YmxpYyBXUEZpZ3VyZShMYWJlbCBsKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZChsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBnKSB7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ2V0Q2xpZW50QXJlYSgpOwotCQlSZWN0YW5nbGUgYmFyID0gY2xpZW50QXJlYS5nZXRDb3B5KCk7Ci0JCWJhci5jcm9wKG5ldyBJbnNldHMoMCwgNSwgNSwgNSkpOwotCQlnLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5ncmF5KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhci5nZXRUcmFuc2xhdGVkKDYsIDYpKTsKLQkJZy5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMueWVsbG93KTsKLQkJZy5maWxsUmVjdGFuZ2xlKGJhcik7Ci0JCWcuc2V0TGluZVN0eWxlKDIpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJc3VwZXIucGFpbnRGaWd1cmUoZyk7Ci0JfQotCi0JcHVibGljIExhYmVsIGdldEZpZ3VyZSgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsTmFtZShTdHJpbmcgbmFtZSkgewotCQlsYWJlbC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQljbGFzcyBCb3ggZXh0ZW5kcyBGaWd1cmUgewotCQlwdWJsaWMgQm94KEluc2V0cyBpbnNldHMpIHsKLQkJCXNldEJvcmRlcihuZXcgQm94Qm9yZGVyKGluc2V0cykpOwotCQkJVG9vbGJhckxheW91dCB0b29sYmFyTGF5b3V0ID0gbmV3IFRvb2xiYXJMYXlvdXQoKTsKLQkJCXRvb2xiYXJMYXlvdXQuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCQlzZXRMYXlvdXRNYW5hZ2VyKHRvb2xiYXJMYXlvdXQpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLnJlZCk7Ci0KLQkJfQotCi0JCXByaXZhdGUgY2xhc3MgQm94Qm9yZGVyIGV4dGVuZHMgQWJzdHJhY3RCb3JkZXIgewotCi0JCQlwdWJsaWMgSW5zZXRzIGluc2V0cyA9IG5ldyBJbnNldHMoMSwgMCwgMCwgMCk7Ci0KLQkJCXB1YmxpYyBCb3hCb3JkZXIoSW5zZXRzIGluc2V0cykgewotCQkJCXRoaXMuaW5zZXRzID0gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNnZXRJbnNldHMoSUZpZ3VyZSkKLQkJCSAqLwotCQkJcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQlyZXR1cm4gaW5zZXRzOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwYWludChJRmlndXJlIGZpZ3VyZSwgR3JhcGhpY3MgZ3JhcGhpY3MsIEluc2V0cyBpbnNldHMpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJCQlncmFwaGljcy5kcmF3TGluZShyZWN0LmdldFRvcExlZnQoKSwgcmVjdC5nZXRUb3BSaWdodCgpKTsKLQkJCX0KLQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBMYWJlbG5JbWFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwTGFiZWxuSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4MGRmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBMYWJlbG5JbWFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkltYWdlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuRmxvd1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLnRleHQuUGFyYWdyYXBoVGV4dExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQudGV4dC5UZXh0RmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV3JhcExhYmVsbkltYWdlIGV4dGVuZHMgRmlndXJlIHsKLQotCS8vIFRoZSBpbm5lciBUZXh0RmxvdwotCXByaXZhdGUgVGV4dEZsb3cgdGV4dEZsb3c7Ci0KLQlwcml2YXRlIEltYWdlIGltYWdlOwotCi0JcHVibGljIFdyYXBMYWJlbG5JbWFnZShJbWFnZSBpbWFnZSkgewotCQlzZXRCb3JkZXIobmV3IE1hcmdpbkJvcmRlcigzKSk7Ci0JCUltYWdlRmlndXJlIGZpZyA9IG5ldyBJbWFnZUZpZ3VyZSgpOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCWZpZy5zZXRJbWFnZShpbWFnZSk7Ci0JCWFkZChmaWcpOwotCQlGbG93UGFnZSBmbG93UGFnZSA9IG5ldyBGbG93UGFnZSgpOwotCi0JCXRleHRGbG93ID0gbmV3IFRleHRGbG93KCk7Ci0KLQkJdGV4dEZsb3cuc2V0TGF5b3V0TWFuYWdlcihuZXcgUGFyYWdyYXBoVGV4dExheW91dCh0ZXh0RmxvdywKLQkJCQlQYXJhZ3JhcGhUZXh0TGF5b3V0LldPUkRfV1JBUF9TT0ZUKSk7Ci0JCQotCQlmbG93UGFnZS5hZGQodGV4dEZsb3cpOwotCQlmbG93UGFnZS5zZXRTaXplKDQwLDQwKTsKLQotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlhZGQoZmxvd1BhZ2UpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBpbnNpZGUgdGhlIFRleHRGbG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgZmxvdyBpbnNpZGUgdGhlIHRleHQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dEZsb3cuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgb2YgdGhlIFRleHRGbG93IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgdGhlIG5ldyB0ZXh0IHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJdGV4dEZsb3cuc2V0VGV4dChuZXdUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgVGhlIGltYWdlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCXB1YmxpYyBUZXh0RmxvdyBnZXRUZXh0RmxvdygpewotCQlyZXR1cm4gdGV4dEZsb3c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBwYWJsZUxhYmVsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL1dyYXBwYWJsZUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODczYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9XcmFwcGFibGVMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRleHQgd3JhcCBpbiBhIGxhYmVsLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBhYmxlTGFiZWwgZXh0ZW5kcyBGaWd1cmUgaW1wbGVtZW50cyBQb3NpdGlvbkNvbnN0YW50cyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgRUxMSVBTSVMgPSAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbWFnZSBpY29uOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBzdWJTdHJpbmdUZXh0OwotCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dFNpemU7Ci0KLQlwcml2YXRlIERpbWVuc2lvbiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQotCXByaXZhdGUgRGltZW5zaW9uIGljb25TaXplID0gbmV3IERpbWVuc2lvbigwLCAwKTsKLQotCXByaXZhdGUgUG9pbnQgaWNvbkxvY2F0aW9uOwotCi0JcHJpdmF0ZSBQb2ludCB0ZXh0TG9jYXRpb247Ci0KLQlwcml2YXRlIGludCB0ZXh0QWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgaWNvbkFsaWdubWVudCA9IENFTlRFUjsKLQotCXByaXZhdGUgaW50IGxhYmVsQWxpZ25tZW50ID0gQ0VOVEVSOwotCi0JcHJpdmF0ZSBpbnQgdGV4dFBsYWNlbWVudCA9IFNPVVRIOwotCi0JcHJpdmF0ZSBpbnQgaWNvblRleHRHYXAgPSAzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfU0VMRUNURUQgPSBNQVhfRkxBRyA8PCAxLAotCQkJRkxBR19IQVNGT0NVUyA9IE1BWF9GTEFHIDw8IDIsIEZMQUdfV1JBUCA9IE1BWF9GTEFHIDw8IDUsCi0JCQlGTEFHX1dSQVBfQUxJR04gPSBNQVhfRkxBRyA8PCA2OwotCi0JLy8gVGhlIHByaW1hcnkgZGltZW5zaW9ucyB1c2VkIHRvIGNhbGN1bGF0ZSB0ZXh0IHNpemUuCi0JcHJpdmF0ZSBEaW1lbnNpb24gdGV4dERpbWVuc2lvbiA9IG5ldyBEaW1lbnNpb24oLTEsIC0xKTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHByZWZTaXplRGltZW5zaW9uID0gbmV3IERpbWVuc2lvbigtMSwgLTEpOwotCi0JcHJpdmF0ZSBpbnQgd3JhcFdpZHRoOwotCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyBpdHMgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzKSB7Ci0JCXNldFRleHQocyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIEltYWdlIGFzIGl0cyBpY29uLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICB0aGUgV3JhcHBlZExhYmVsIGltYWdlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBXcmFwcGFibGVMYWJlbChJbWFnZSBpKSB7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgV3JhcHBlZExhYmVsIHdpdGggcGFzc2VkIFN0cmluZyBhcyB0ZXh0IGFuZCBwYXNzZWQgSW1hZ2UgYXMKLQkgKiBpdHMgaWNvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIFdyYXBwZWRMYWJlbCB0ZXh0Ci0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIHRoZSBXcmFwcGVkTGFiZWwgaW1hZ2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFdyYXBwYWJsZUxhYmVsKFN0cmluZyBzLCBJbWFnZSBpKSB7Ci0JCXNldFRleHQocyk7Ci0JCXNldEljb24oaSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFsaWduT25IZWlnaHQoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgVE9QOgotCQkJbG9jLnkgPSBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJbG9jLnkgPSBib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQgLSBpbnNldHMuYm90dG9tOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlsb2MueSA9IChib3VuZHMuaGVpZ2h0IC0gc2l6ZS5oZWlnaHQpIC8gMjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhbGlnbk9uV2lkdGgoUG9pbnQgbG9jLCBEaW1lbnNpb24gc2l6ZSwgaW50IGFsaWdubWVudCkgewotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCXN3aXRjaCAoYWxpZ25tZW50KSB7Ci0JCWNhc2UgTEVGVDoKLQkJCWxvYy54ID0gaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBSSUdIVDoKLQkJCWxvYy54ID0gYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCAtIGluc2V0cy5yaWdodDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbG9jLnggPSAoYm91bmRzLndpZHRoIC0gc2l6ZS53aWR0aCkgLyAyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUFsaWdubWVudCgpIHsKLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJYWxpZ25PbkhlaWdodCh0ZXh0TG9jYXRpb24sIGdldFRleHRTaXplKCksIHRleHRBbGlnbm1lbnQpOwotCQkJYWxpZ25PbkhlaWdodChpY29uTG9jYXRpb24sIGljb25TaXplLCBpY29uQWxpZ25tZW50KTsKLQkJCWJyZWFrOwotCQljYXNlIE5PUlRIOgotCQljYXNlIFNPVVRIOgotCQkJYWxpZ25PbldpZHRoKHRleHRMb2NhdGlvbiwgZ2V0U3ViU3RyaW5nVGV4dFNpemUoKSwgdGV4dEFsaWdubWVudCk7Ci0JCQlhbGlnbk9uV2lkdGgoaWNvbkxvY2F0aW9uLCBpY29uU2l6ZSwgaWNvbkFsaWdubWVudCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhlIFdyYXBwZWRMYWJlbCB1c2luZyB0aGUgcGFzc2VkIERpbWVuc2lvbiBhcyB0aGUKLQkgKiBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eHRTaXplCi0JICogICAgICAgICAgICB0aGUgcHJlY2FsY3VsYXRlZCBzaXplIG9mIHRoZSBXcmFwcGVkTGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiB0aGUgV3JhcHBlZExhYmVsJ3Mgc2l6ZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZUxhYmVsU2l6ZShEaW1lbnNpb24gdHh0U2l6ZSkgewotCQlpbnQgZ2FwID0gaWNvblRleHRHYXA7Ci0JCWlmIChnZXRJY29uKCkgPT0gbnVsbCB8fCBnZXRUZXh0KCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJZ2FwID0gMDsKLQkJRGltZW5zaW9uIGQgPSBuZXcgRGltZW5zaW9uKDAsIDApOwotCQlpZiAodGV4dFBsYWNlbWVudCA9PSBXRVNUIHx8IHRleHRQbGFjZW1lbnQgPT0gRUFTVCkgewotCQkJZC53aWR0aCA9IGljb25TaXplLndpZHRoICsgZ2FwICsgdHh0U2l6ZS53aWR0aDsKLQkJCWQuaGVpZ2h0ID0gTWF0aC5tYXgoaWNvblNpemUuaGVpZ2h0LCB0eHRTaXplLmhlaWdodCk7Ci0JCX0gZWxzZSB7Ci0JCQlkLndpZHRoID0gTWF0aC5tYXgoaWNvblNpemUud2lkdGgsIHR4dFNpemUud2lkdGgpOwotCQkJZC5oZWlnaHQgPSBpY29uU2l6ZS5oZWlnaHQgKyBnYXAgKyB0eHRTaXplLmhlaWdodDsKLQkJfQotCQlyZXR1cm4gZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlTG9jYXRpb25zKCkgewotCQl0ZXh0TG9jYXRpb24gPSBuZXcgUG9pbnQoKTsKLQkJaWNvbkxvY2F0aW9uID0gbmV3IFBvaW50KCk7Ci0KLQkJY2FsY3VsYXRlUGxhY2VtZW50KCk7Ci0JCWNhbGN1bGF0ZUFsaWdubWVudCgpOwotCQlEaW1lbnNpb24gb2Zmc2V0ID0gZ2V0U2l6ZSgpLmdldERpZmZlcmVuY2UoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKLQkJb2Zmc2V0LndpZHRoICs9IGdldFRleHRTaXplKCkud2lkdGggLSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoOwotCQlzd2l0Y2ggKGxhYmVsQWxpZ25tZW50KSB7Ci0JCWNhc2UgQ0VOVEVSOgotCQkJb2Zmc2V0LnNjYWxlKDAuNWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEVGVDoKLQkJCW9mZnNldC5zY2FsZSgwLjBmKTsKLQkJCWJyZWFrOwotCQljYXNlIFJJR0hUOgotCQkJb2Zmc2V0LnNjYWxlKDEuMGYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBCT1RUT006Ci0JCQlvZmZzZXQuaGVpZ2h0ID0gb2Zmc2V0LmhlaWdodCAqIDI7Ci0JCQlvZmZzZXQuc2NhbGUoMC41Zik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCW9mZnNldC5zY2FsZSgwLjVmKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoICh0ZXh0UGxhY2VtZW50KSB7Ci0JCWNhc2UgRUFTVDoKLQkJY2FzZSBXRVNUOgotCQkJb2Zmc2V0LmhlaWdodCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJY2FzZSBTT1VUSDoKLQkJCW9mZnNldC53aWR0aCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCXRleHRMb2NhdGlvbi50cmFuc2xhdGUob2Zmc2V0KTsKLQkJaWNvbkxvY2F0aW9uLnRyYW5zbGF0ZShvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQbGFjZW1lbnQoKSB7Ci0JCWludCBnYXAgPSBpY29uVGV4dEdhcDsKLQkJaWYgKGljb24gPT0gbnVsbCB8fCB0ZXh0LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCWdhcCA9IDA7Ci0JCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQotCQlzd2l0Y2ggKHRleHRQbGFjZW1lbnQpIHsKLQkJY2FzZSBFQVNUOgotCQkJaWNvbkxvY2F0aW9uLnggPSBpbnNldHMubGVmdDsKLQkJCXRleHRMb2NhdGlvbi54ID0gaWNvblNpemUud2lkdGggKyBnYXAgKyBpbnNldHMubGVmdDsKLQkJCWJyZWFrOwotCQljYXNlIFdFU1Q6Ci0JCQl0ZXh0TG9jYXRpb24ueCA9IGluc2V0cy5sZWZ0OwotCQkJaWNvbkxvY2F0aW9uLnggPSBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLndpZHRoICsgZ2FwICsgaW5zZXRzLmxlZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBOT1JUSDoKLQkJCXRleHRMb2NhdGlvbi55ID0gaW5zZXRzLnRvcDsKLQkJCWljb25Mb2NhdGlvbi55ID0gZ2V0VGV4dFNpemUoKS5oZWlnaHQgKyBnYXAgKyBpbnNldHMudG9wOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09VVEg6Ci0JCQl0ZXh0TG9jYXRpb24ueSA9IGljb25TaXplLmhlaWdodCArIGdhcCArIGluc2V0cy50b3A7Ci0JCQlpY29uTG9jYXRpb24ueSA9IGluc2V0cy50b3A7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQgc2l6ZS4gVGhlIHRleHQgc2l6ZSBjYWxjdWxhdGVkCi0JICogdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIGlmIHRoZSBMYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYKLQkgKiB0ZXh0IHNpemUgd2l0aG91dCBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgdXNlCi0JICoge0BsaW5rICNjYWxjdWxhdGVUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIHRleHQsIHRha2luZyBpbnRvIGFjY291bnQgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFN1YlN0cmluZ1RleHQoKSwgZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKCkgewotCQkvLyByZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKTsKLQkJcmV0dXJuIEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhnZXRXcmFwcGVkVGV4dChnZXRTaXplKCkud2lkdGgsCi0JCQkJZ2V0U2l6ZSgpLmhlaWdodCksIGdldEZvbnQoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJMb2NhdGlvbnMoKSB7Ci0JCWljb25Mb2NhdGlvbiA9IHRleHRMb2NhdGlvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTGFiZWwncyBpY29uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIGljb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oKSB7Ci0JCXJldHVybiBpY29uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBMYWJlbCdzIGljb24uIFRoZSBkZWZhdWx0IGlzCi0JICoge0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn0uCi0JICogCi0JICogQHJldHVybiB0aGUgaWNvbiBhbGlnbm1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRJY29uQWxpZ25tZW50KCkgewotCQlyZXR1cm4gaWNvbkFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIExhYmVsJ3MgaWNvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgYm91bmRzCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0SWNvbkJvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZShib3VuZHMuZ2V0TG9jYXRpb24oKS50cmFuc2xhdGUoZ2V0SWNvbkxvY2F0aW9uKCkpLAotCQkJCWljb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgTGFiZWwncyBpY29uIHJlbGF0aXZlIHRvIHRoZSBMYWJlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpY29uJ3MgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldEljb25Mb2NhdGlvbigpIHsKLQkJaWYgKGljb25Mb2NhdGlvbiA9PSBudWxsKQotCQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiBpY29uTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2FwIGluIHBpeGVscyBiZXR3ZWVuIHRoZSBMYWJlbCdzIGljb24gYW5kIGl0cyB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEljb25UZXh0R2FwKCkgewotCQlyZXR1cm4gaWNvblRleHRHYXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldE1pbmltdW1TaXplKGludCwgaW50KQotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gZ2V0TWluaW11bVNpemUoaW50IHcsIGludCBoKSB7Ci0JCWlmIChtaW5TaXplICE9IG51bGwpCi0JCQlyZXR1cm4gbWluU2l6ZTsKLQkJbWluU2l6ZSA9IG5ldyBEaW1lbnNpb24oKTsKLQkJaWYgKGdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKQotCQkJbWluU2l6ZS5zZXRTaXplKGdldExheW91dE1hbmFnZXIoKS5nZXRNaW5pbXVtU2l6ZSh0aGlzLCB3LCBoKSk7Ci0KLQkJRGltZW5zaW9uIGxhYmVsU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShGaWd1cmVVdGlsaXRpZXMKLQkJCQkuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsIGdldEZvbnQoKSkuaW50ZXJzZWN0KAotCQkJCQkJRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFRleHQoKSwgZ2V0Rm9udCgpKSkpOwotCQlJbnNldHMgaW5zZXRzID0gZ2V0SW5zZXRzKCk7Ci0JCWxhYmVsU2l6ZS5leHBhbmQoaW5zZXRzLmdldFdpZHRoKCksIGluc2V0cy5nZXRIZWlnaHQoKSk7Ci0JCW1pblNpemUudW5pb24obGFiZWxTaXplKTsKLQkJcmV0dXJuIG1pblNpemU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRmlndXJlI2dldFByZWZlcnJlZFNpemUoaW50LCBpbnQpCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBnZXRQcmVmZXJyZWRTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCWlmIChwcmVmU2l6ZSA9PSBudWxsIHx8IHdIaW50ICE9IHByZWZTaXplRGltZW5zaW9uLndpZHRoCi0JCQkJfHwgaEhpbnQgIT0gcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0KSB7Ci0JCQlwcmVmU2l6ZSA9IGNhbGN1bGF0ZUxhYmVsU2l6ZShnZXRUZXh0U2l6ZSh3SGludCwgaEhpbnQpKTsKLQkJCUluc2V0cyBpbnNldHMgPSBnZXRJbnNldHMoKTsKLQkJCXByZWZTaXplLmV4cGFuZChpbnNldHMuZ2V0V2lkdGgoKSwgaW5zZXRzLmdldEhlaWdodCgpKTsKLQkJCWlmIChnZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCQlwcmVmU2l6ZS51bmlvbihnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0UHJlZmVycmVkU2l6ZSh0aGlzLCB3SGludCwKLQkJCQkJCWhIaW50KSk7Ci0JCX0KLQkJaWYgKHdIaW50ID49IDAgJiYgd0hpbnQgPCBwcmVmU2l6ZS53aWR0aCkgewotCQkJRGltZW5zaW9uIG1pblNpemUgPSBnZXRNaW5pbXVtU2l6ZSh3SGludCwgaEhpbnQpOwotCQkJRGltZW5zaW9uIHJlc3VsdCA9IHByZWZTaXplLmdldENvcHkoKTsKLQkJCXJlc3VsdC53aWR0aCA9IE1hdGgubWluKHJlc3VsdC53aWR0aCwgd0hpbnQpOwotCQkJcmVzdWx0LndpZHRoID0gTWF0aC5tYXgobWluU2l6ZS53aWR0aCwgcmVzdWx0LndpZHRoKTsKLQkJCXByZWZTaXplRGltZW5zaW9uLndpZHRoID0gcmVzdWx0LndpZHRoOwotCQkJcHJlZlNpemVEaW1lbnNpb24uaGVpZ2h0ID0gcmVzdWx0LndpZHRoOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcHJlZlNpemU7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgYW1vdW50IG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dCB3aWxsIGZpdCBpbiB0aGUgTGFiZWwsCi0JICogaW5jbHVkaW5nIGFuIGVsaXBzaXMgIi4uLiIgaWYgdHJ1bmNhdGlvbiBpcyByZXF1aXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdWJzdHJpbmcKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJTdHJpbmdUZXh0KCkgewotCQlpZiAoc3ViU3RyaW5nVGV4dCAhPSBudWxsKQotCQkJcmV0dXJuIHN1YlN0cmluZ1RleHQ7Ci0KLQkJc3ViU3RyaW5nVGV4dCA9IHRleHQ7Ci0JCURpbWVuc2lvbiBzaHJpbmsgPSBnZXRQcmVmZXJyZWRTaXplKGdldFNpemUoKS53aWR0aCwgZ2V0U2l6ZSgpLmhlaWdodCkKLQkJCQkuZ2V0RGlmZmVyZW5jZShnZXRTaXplKCkpOwotCQlEaW1lbnNpb24gZWZmZWN0aXZlU2l6ZSA9IGdldFRleHRTaXplKCkuZ2V0RXhwYW5kZWQoLXNocmluay53aWR0aCwKLQkJCQktc2hyaW5rLmhlaWdodCk7Ci0JCUZvbnQgY3VycmVudEZvbnQgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGN1cnJlbnRGb250KQotCQkJCS5nZXRIZWlnaHQoKTsKLQkJaW50IG1heExpbmVzID0gKGludCkgKGVmZmVjdGl2ZVNpemUuaGVpZ2h0IC8gKGRvdWJsZSkgZm9udEhlaWdodCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGFjY3VtbGF0ZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgcmVtYWluaW5nVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0VGV4dCgpKTsKLQkJaW50IGkgPSAwLCBqID0gMDsKLQotCQl3aGlsZSAocmVtYWluaW5nVGV4dC5sZW5ndGgoKSA+IDAgJiYgaisrIDwgbWF4TGluZXMpIHsKLQkJCWkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgY3VycmVudEZvbnQsCi0JCQkJCWVmZmVjdGl2ZVNpemUud2lkdGgpOwotCi0JCQlpZiAoYWNjdW1sYXRlZFRleHQubGVuZ3RoKCkgPiAwKQotCQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoaSA9PSAwIHx8IChyZW1haW5pbmdUZXh0Lmxlbmd0aCgpID4gaSAmJiBqID09IG1heExpbmVzKSkgewotCQkJCWludCBkb3RzV2lkdGggPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHMoRUxMSVBTSVMsCi0JCQkJCQljdXJyZW50Rm9udCkud2lkdGg7Ci0JCQkJaSA9IGdldExhcmdlc3RTdWJzdHJpbmdDb25maW5lZFRvKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwKLQkJCQkJCWN1cnJlbnRGb250LCBNYXRoLm1heChlZmZlY3RpdmVTaXplLndpZHRoIC0gZG90c1dpZHRoLAotCQkJCQkJCQkwKSk7Ci0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoRUxMSVBTSVMpOwotCQkJfSBlbHNlCi0JCQkJYWNjdW1sYXRlZFRleHQuYXBwZW5kKHJlbWFpbmluZ1RleHQuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCXJlbWFpbmluZ1RleHQuZGVsZXRlKDAsIGkpOwotCQl9Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0ID0gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIGN1cnJlbnQgdGV4dC4gSWYgdGhlIHRleHQgaXMgY3VycmVudGx5Ci0JICogdHJ1bmNhdGVkLCB0aGUgdHJ1bmNhdGVkIHRleHQgd2l0aCBpdHMgZWxsaXBzaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlCi0JICogc2l6ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyB0ZXh0LCB0YWtpbmcgaW50byBhY2NvdW50IHRydW5jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIERpbWVuc2lvbiBnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpIHsKLQkJaWYgKHN1YlN0cmluZ1RleHRTaXplID09IG51bGwpCi0JCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IGNhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCk7Ci0JCXJldHVybiBzdWJTdHJpbmdUZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBsYWJlbC4gTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlCi0JICogbGFiZWwsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkLiBDYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0KCl9IHRvIHJldHVybiB0aGUgbGFiZWwncyBjdXJyZW50IHRleHQgY29udGVudHMKLQkgKiB3aXRoIHRydW5jYXRpb24gY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgbGFiZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgTGFiZWwncyB0ZXh0LiBUaGUgZGVmYXVsdCB0ZXh0Ci0JICogYWxpZ25tZW50IGlzIHtAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0QWxpZ25tZW50KCkgewotCQlyZXR1cm4gdGV4dEFsaWdubWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib3VuZHMgb2YgdGhlIGxhYmVsJ3MgdGV4dC4gTm90ZSB0aGF0IHRoZSBib3VuZHMgYXJlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBib3VuZHMgb2YgdGhpcyBsYWJlbCdzIGNvbXBsZXRlIHRleHQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFJlY3RhbmdsZSBnZXRUZXh0Qm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0Qm91bmRzKCk7Ci0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKGJvdW5kcy5nZXRMb2NhdGlvbigpLnRyYW5zbGF0ZShnZXRUZXh0TG9jYXRpb24oKSksCi0JCQkJdGV4dFNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYWJlbCdzIHRleHQgcmVsYXRpdmUgdG8gdGhlIGxhYmVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IGdldFRleHRMb2NhdGlvbigpIHsKLQkJaWYgKHRleHRMb2NhdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIHRleHRMb2NhdGlvbjsKLQkJY2FsY3VsYXRlTG9jYXRpb25zKCk7Ci0JCXJldHVybiB0ZXh0TG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBwbGFjZW1lbnQgb2YgdGhlIGxhYmVsJ3MgdGV4dCByZWxhdGl2ZSB0byBpdHMgaWNvbi4KLQkgKiBUaGUgZGVmYXVsdCB0ZXh0IHBsYWNlbWVudCBpcyB7QGxpbmsgUG9zaXRpb25Db25zdGFudHMjRUFTVH0uCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0UGxhY2VtZW50KCkgewotCQlyZXR1cm4gdGV4dFBsYWNlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsYWJlbCdzIGNvbXBsZXRlIHRleHQuIE5vdGUgdGhhdCB0aGUgdGV4dCB1c2VkIHRvCi0JICogbWFrZSB0aGlzIGNhbGN1bGF0aW9uIGlzIHRoZSBsYWJlbCdzIGZ1bGwgdGV4dCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZQotCSAqIGxhYmVsJ3MgdGV4dCBpcyBjdXJyZW50bHkgYmVpbmcgdHJ1bmNhdGVkIGFuZCBpcyBkaXNwbGF5aW5nIGFuIGVsbGlwc2lzLgotCSAqIElmIHRoZSBzaXplIGNvbnNpZGVyaW5nIGN1cnJlbnQgdHJ1bmNhdGlvbiBpcyBkZXNpcmVkLCBjYWxsCi0JICoge0BsaW5rICNnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpfS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwncyBjb21wbGV0ZSB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb24gZ2V0VGV4dFNpemUoKSB7Ci0JCWlmICh0ZXh0U2l6ZSA9PSBudWxsKQotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSgpOwotCQlyZXR1cm4gdGV4dFNpemU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGFiZWwncyBjb21wbGV0ZSB0ZXh0LiBOb3RlIHRoYXQgdGhlIHRleHQgdXNlZCB0bwotCSAqIG1ha2UgdGhpcyBjYWxjdWxhdGlvbiBpcyB0aGUgbGFiZWwncyBmdWxsIHRleHQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUKLQkgKiBsYWJlbCdzIHRleHQgaXMgY3VycmVudGx5IGJlaW5nIHRydW5jYXRlZCBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcy4KLQkgKiBJZiB0aGUgc2l6ZSBjb25zaWRlcmluZyBjdXJyZW50IHRydW5jYXRpb24gaXMgZGVzaXJlZCwgY2FsbAotCSAqIHtAbGluayAjZ2V0U3ViU3RyaW5nVGV4dFNpemUoKX0uCi0JICogCi0JICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGxhYmVsJ3MgY29tcGxldGUgdGV4dAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGdldFRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAodGV4dFNpemUgPT0gbnVsbCkgewotCQkJdGV4dFNpemUgPSBjYWxjdWxhdGVUZXh0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLQkJCXRleHREaW1lbnNpb24ud2lkdGggPSB3aWR0aDsKLQkJCXRleHREaW1lbnNpb24uaGVpZ2h0ID0gaGVpZ2h0OwotCQl9Ci0JCXJldHVybiB0ZXh0U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGaWd1cmUjaW52YWxpZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgaW52YWxpZGF0ZSgpIHsKLQkJcHJlZlNpemUgPSBudWxsOwotCQltaW5TaXplID0gbnVsbDsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJdGV4dFNpemUgPSBudWxsOwotCQlzdWJTdHJpbmdUZXh0U2l6ZSA9IG51bGw7Ci0JCXN1YlN0cmluZ1RleHQgPSBudWxsOwotCQlzdXBlci5pbnZhbGlkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGFiZWwncyB0ZXh0IGlzIGN1cnJlbnRseSB0cnVuY2F0ZWQKLQkgKiBhbmQgaXMgZGlzcGxheWluZyBhbiBlbGxpcHNpcywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCdzIHRleHQgaXMgdHJ1bmNhdGVkCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGV4dFRydW5jYXRlZCgpIHsKLQkJcmV0dXJuICFnZXRTdWJTdHJpbmdUZXh0U2l6ZSgpLmVxdWFscyhnZXRUZXh0U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEZpZ3VyZSNwYWludEZpZ3VyZShHcmFwaGljcykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZiAoaXNTZWxlY3RlZCgpKSB7Ci0JCQlncmFwaGljcy5wdXNoU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLmZpbGxSZWN0YW5nbGUoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCX0KLQkJaWYgKGhhc0ZvY3VzKCkpIHsKLQkJCWdyYXBoaWNzLnB1c2hTdGF0ZSgpOwotCQkJZ3JhcGhpY3Muc2V0WE9STW9kZSh0cnVlKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWdyYXBoaWNzLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy53aGl0ZSk7Ci0JCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkucmVzaXplKC0xLCAtMSkpOwotCQkJZ3JhcGhpY3MucG9wU3RhdGUoKTsKLQkJfQotCQlpZiAoaXNPcGFxdWUoKSkKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlncmFwaGljcy50cmFuc2xhdGUoYm91bmRzLngsIGJvdW5kcy55KTsKLQkJaWYgKGljb24gIT0gbnVsbCkKLQkJCWdyYXBoaWNzLmRyYXdJbWFnZShpY29uLCBnZXRJY29uTG9jYXRpb24oKSk7Ci0KLQkJaWYgKCFpc0VuYWJsZWQoKSkgewotCQkJZ3JhcGhpY3MudHJhbnNsYXRlKDEsIDEpOwotCQkJZ3JhcGhpY3Muc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJ1dHRvbkxpZ2h0ZXN0KTsKLQkJCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQkJZ3JhcGhpY3MuZHJhd1RleHQoZ2V0U3ViU3RyaW5nVGV4dCgpLCBnZXRUZXh0TG9jYXRpb24oKSk7Ci0JCQlncmFwaGljcy50cmFuc2xhdGUoLTEsIC0xKTsKLQkJCWdyYXBoaWNzLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQl9Ci0JCWdyYXBoaWNzZHJhd1RleHQoZ3JhcGhpY3MpOwotCQlncmFwaGljcy50cmFuc2xhdGUoLWJvdW5kcy54LCAtYm91bmRzLnkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgaWNvbiB0byB0aGUgcGFzc2VkIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCBpbWFnZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uKEltYWdlIGltYWdlKSB7Ci0JCWlmIChpY29uID09IGltYWdlKQotCQkJcmV0dXJuOwotCQlpY29uID0gaW1hZ2U7Ci0JCS8vIENhbGwgcmVwYWludCwgaW4gY2FzZSB0aGUgaW1hZ2UgZGltZW5zaW9ucyBhcmUgdGhlIHNhbWUuCi0JCXJlcGFpbnQoKTsKLQkJaWYgKGljb24gPT0gbnVsbCkKLQkJCXNldEljb25EaW1lbnNpb24obmV3IERpbWVuc2lvbigpKTsKLQkJZWxzZQotCQkJc2V0SWNvbkRpbWVuc2lvbihuZXcgRGltZW5zaW9uKGltYWdlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgYWxpZ25tZW50IG9mIHRoZSBpY29uIHdpdGhpbiB0aGUgaWNvbiBkaW1lbnNpb24uIFRoZQotCSAqIGRpbWVuc2lvbiBzaG91bGQgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgSW1hZ2UgaXRzZWxmLCBzbyBjYWxsaW5nIHRoaXMKLQkgKiBtZXRob2Qgc2hvdWxkIGhhdmUgbm8gYWZmZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIGljb24gYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25BbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChpY29uQWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQlpY29uQWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCdzIGljb24gc2l6ZSB0byB0aGUgcGFzc2VkIERpbWVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZAotCSAqICAgICAgICAgICAgdGhlIG5ldyBpY29uIHNpemUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWNvbkRpbWVuc2lvbihEaW1lbnNpb24gZCkgewotCQlpZiAoZC5lcXVhbHMoaWNvblNpemUpKQotCQkJcmV0dXJuOwotCQlpY29uU2l6ZSA9IGQ7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBnYXAgaW4gcGl4ZWxzIGJldHdlZW4gdGhlIGxhYmVsJ3MgaWNvbiBhbmQgdGV4dCB0byB0aGUgcGFzc2VkCi0JICogdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDQuCi0JICogCi0JICogQHBhcmFtIGdhcAotCSAqICAgICAgICAgICAgdGhlIGdhcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uVGV4dEdhcChpbnQgZ2FwKSB7Ci0JCWlmIChpY29uVGV4dEdhcCA9PSBnYXApCi0JCQlyZXR1cm47Ci0JCWljb25UZXh0R2FwID0gZ2FwOwotCQlyZXBhaW50KCk7Ci0JCXJldmFsaWRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGVudGlyZSBsYWJlbCAoaWNvbiBhbmQgdGV4dCkuIElmIHRoaXMgZmlndXJlJ3MKLQkgKiBib3VuZHMgYXJlIGxhcmdlciB0aGFuIHRoZSBzaXplIG5lZWRlZCB0byBkaXNwbGF5IHRoZSBsYWJlbCwgdGhlIGxhYmVsCi0JICogd2lsbCBiZSBhbGlnbmVkIGFjY29yZGluZ2x5LiBWYWxpZCB2YWx1ZXMgYXJlOgotCSAqIDxVTD4KLQkgKiA8TEk+PEVNPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNDRU5URVJ9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1RPUH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0JPVFRPTX0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0xFRlR9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNSSUdIVH0KLQkgKiA8L1VMPgotCSAqIAotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgbGFiZWwgYWxpZ25tZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmIChsYWJlbEFsaWdubWVudCA9PSBhbGlnbikKLQkJCXJldHVybjsKLQkJbGFiZWxBbGlnbm1lbnQgPSBhbGlnbjsKLQkJY2xlYXJMb2NhdGlvbnMoKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhYmVsJ3MgdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgdGhlIG5ldyBsYWJlbCB0ZXh0Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHMpIHsKLQkJLy8gInRleHQiIHdpbGwgbmV2ZXIgYmUgbnVsbC4KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGV4dC5lcXVhbHMocykpCi0JCQlyZXR1cm47Ci0JCXRleHQgPSBzOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhbGlnbm1lbnQgb2YgdGhlIFRleHQgcmVsYXRpdmUgdG8gdGhlIGljb24uIFRoZSB0ZXh0IGFsaWdubWVudAotCSAqIG11c3QgYmUgb3J0aG9nb25hbCB0byB0aGUgdGV4dCBwbGFjZW1lbnQuIEZvciBleGFtcGxlLCBpZiB0aGUgcGxhY2VtZW50Ci0JICogaXMgRUFTVCwgdGhlbiB0aGUgdGV4dCBjYW4gYmUgYWxpZ25lZCB1c2luZyBUT1AsIENFTlRFUiwgb3IgQk9UVE9NLiBWYWxpZAotCSAqIHZhbHVlcyBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0NFTlRFUn08L0VNPgotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjVE9QfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjQk9UVE9NfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjTEVGVH0KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI1JJR0hUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHNlZSAjc2V0TGFiZWxBbGlnbm1lbnQoaW50KQotCSAqIEBwYXJhbSBhbGlnbgotCSAqICAgICAgICAgICAgdGhlIHRleHQgYWxpZ25tZW50Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRBbGlnbm1lbnQoaW50IGFsaWduKSB7Ci0JCWlmICh0ZXh0QWxpZ25tZW50ID09IGFsaWduKQotCQkJcmV0dXJuOwotCQl0ZXh0QWxpZ25tZW50ID0gYWxpZ247Ci0JCWNsZWFyTG9jYXRpb25zKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwbGFjZW1lbnQgb2YgdGV4dCByZWxhdGl2ZSB0byB0aGUgbGFiZWwncyBpY29uLiBWYWxpZCB2YWx1ZXMKLQkgKiBhcmU6Ci0JICogPFVMPgotCSAqIDxMST48RU0+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI0VBU1R9PC9FTT4KLQkgKiA8TEk+e0BsaW5rIFBvc2l0aW9uQ29uc3RhbnRzI05PUlRIfQotCSAqIDxMST57QGxpbmsgUG9zaXRpb25Db25zdGFudHMjU09VVEh9Ci0JICogPExJPntAbGluayBQb3NpdGlvbkNvbnN0YW50cyNXRVNUfQotCSAqIDwvVUw+Ci0JICogCi0JICogQHBhcmFtIHdoZXJlCi0JICogICAgICAgICAgICB0aGUgdGV4dCBwbGFjZW1lbnQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFBsYWNlbWVudChpbnQgd2hlcmUpIHsKLQkJaWYgKHRleHRQbGFjZW1lbnQgPT0gd2hlcmUpCi0JCQlyZXR1cm47Ci0JCXRleHRQbGFjZW1lbnQgPSB3aGVyZTsKLQkJcmV2YWxpZGF0ZSgpOwotCQlyZXBhaW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBSZWN0YW5nbGUgZ2V0U2VsZWN0aW9uUmVjdGFuZ2xlKCkgewotCQlSZWN0YW5nbGUgYm91bmRzID0gZ2V0VGV4dEJvdW5kcygpOwotCQlib3VuZHMuZXhwYW5kKG5ldyBJbnNldHMoMiwgMiwgMCwgMCkpOwotCQl0cmFuc2xhdGVUb1BhcmVudChib3VuZHMpOwotCQlib3VuZHMuaW50ZXJzZWN0KGdldEJvdW5kcygpKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBMYWJlbCdzIHRleHQuIE5vdGUgdGhhdCB0aGlzCi0JICogRGltZW5zaW9uIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIExhYmVsJ3MgZnVsbCB0ZXh0LCByZWdhcmRsZXNzIG9mCi0JICogd2hldGhlciBvciBub3QgaXRzIHRleHQgaXMgY3VycmVudGx5IHRydW5jYXRlZC4gSWYgdGV4dCBzaXplIGNvbnNpZGVyaW5nCi0JICogY3VycmVudCB0cnVuY2F0aW9uIGlzIGRlc2lyZWQsIHVzZSB7QGxpbmsgI2NhbGN1bGF0ZVN1YlN0cmluZ1RleHRTaXplKCl9LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxhYmVsJ3MgdGV4dCwgaWdub3JpbmcgdHJ1bmNhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIGNhbGN1bGF0ZVRleHRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlyZXR1cm4gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGdldFdyYXBwZWRUZXh0KHdpZHRoLCBoZWlnaHQpLAotCQkJCWdldEZvbnQoKSk7Ci0JfQotCi0JLy8gQ29kZSBmb3IgdGhlIFRleHQgV3JhcC4KLQkvLyBTdGFydHMgaGVyZS4KLQotCXByaXZhdGUgU3RyaW5nIGdldFdyYXBwZWRUZXh0KGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlpZiAoIWlzVGV4dFdyYXBwZWQoKSB8fCB3aWR0aCA9PSAtMSkKLQkJCXJldHVybiBnZXRUZXh0KCk7Ci0KLQkJaWYgKGlzSWNvbkV4aXN0KCkpIHsKLQkJCXN3aXRjaCAodGV4dFBsYWNlbWVudCkgewotCQkJY2FzZSBFQVNUOgotCQkJY2FzZSBXRVNUOgotCQkJCXdpZHRoIC09IGljb25TaXplLndpZHRoICsgZ2V0SWNvblRleHRHYXAoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTk9SVEg6Ci0JCQljYXNlIFNPVVRIOgotCQkJCWlmIChoZWlnaHQgIT0gLTEpCi0JCQkJCWhlaWdodCAtPSBpY29uU2l6ZS5oZWlnaHQgKyBnZXRJY29uVGV4dEdhcCgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJRm9udCBmID0gZ2V0Rm9udCgpOwotCQlpbnQgbWF4TGluZXMgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJaWYgKGhlaWdodCAhPSAtMSkgewotCQkJaW50IGZvbnRIZWlnaHQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZikuZ2V0SGVpZ2h0KCk7Ci0JCQltYXhMaW5lcyA9IChpbnQpIChoZWlnaHQgLyAoZG91YmxlKSBmb250SGVpZ2h0KTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBhY2N1bWxhdGVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nQnVmZmVyIHJlbWFpbmluZ1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRleHQoKSk7Ci0JCWludCBpID0gMCwgaiA9IDA7Ci0KLQkJd2hpbGUgKHJlbWFpbmluZ1RleHQubGVuZ3RoKCkgPiAwICYmIGorKyA8IG1heExpbmVzKSB7Ci0JCQlpZiAoKGkgPSBnZXRMaW5lV3JhcFBvc2l0aW9uKHJlbWFpbmluZ1RleHQudG9TdHJpbmcoKSwgZiwgaGVpZ2h0KSkgPT0gMCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGFjY3VtbGF0ZWRUZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQlhY2N1bWxhdGVkVGV4dC5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFjY3VtbGF0ZWRUZXh0LmFwcGVuZChyZW1haW5pbmdUZXh0LnN1YnN0cmluZygwLCBpKSk7Ci0JCQlyZW1haW5pbmdUZXh0LmRlbGV0ZSgwLCBpKTsKLQkJfQotCQlyZXR1cm4gYWNjdW1sYXRlZFRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJY29uRXhpc3QoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgaW50IGdldExpbmVXcmFwUG9zaXRpb24oU3RyaW5nIHN0cmluZywgRm9udCBmLCBpbnQgd2lkdGgpIHsKLQkJQnJlYWtJdGVyYXRvciBpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsKLQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCWludCBzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJaW50IGVuZCA9IGl0ZXIubmV4dCgpOwotCi0JCS8vIGlmIHRoZSBmaXJzdCBsaW5lIHNlZ21lbnQgZG9lcyBub3QgZml0IGluIHRoZSB3aWR0aCwKLQkJLy8gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiB3aXRoaW4gaXQgd2hlcmUgd2UgbmVlZCB0byBjdXQKLQkJaWYgKEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyhzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpLCBmKS53aWR0aCA+IHdpZHRoKSB7Ci0JCQlpdGVyID0gQnJlYWtJdGVyYXRvci5nZXRDaGFyYWN0ZXJJbnN0YW5jZSgpOwotCQkJaXRlci5zZXRUZXh0KHN0cmluZyk7Ci0JCQlzdGFydCA9IGl0ZXIuZmlyc3QoKTsKLQkJfQotCi0JCS8vIGtlZXAgaXRlcmF0aW5nIGFzIGxvbmcgYXMgd2lkdGggcGVybWl0cwotCQlkbwotCQkJZW5kID0gaXRlci5uZXh0KCk7Ci0JCXdoaWxlIChlbmQgIT0gQnJlYWtJdGVyYXRvci5ET05FCi0JCQkJJiYgRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN0cmluZy5zdWJzdHJpbmcoc3RhcnQsIGVuZCksCi0JCQkJCQlmKS53aWR0aCA8PSB3aWR0aCk7Ci0JCXJldHVybiAoZW5kID09IEJyZWFrSXRlcmF0b3IuRE9ORSkgPyBpdGVyLmxhc3QoKSA6IGl0ZXIucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXJnZXN0IHN1YnN0cmluZyBvZiA8aT5zPC9pPiBpbiBGb250IDxpPmY8L2k+IHRoYXQgY2FuIGJlCi0JICogY29uZmluZWQgdG8gdGhlIG51bWJlciBvZiBwaXhlbHMgaW4gPGk+YXZhaWxhYmxlV2lkdGg8aT4uCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBzdHJpbmcKLQkgKiBAcGFyYW0gZgotCSAqICAgICAgICAgICAgdGhlIGZvbnQKLQkgKiBAcGFyYW0gYXZhaWxhYmxlV2lkdGgKLQkgKiAgICAgICAgICAgIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkgKiBAcmV0dXJuIHRoZSBsYXJnZXN0IHN1YnN0cmluZyB0aGF0IGZpdHMgaW4gdGhlIGdpdmVuIHdpZHRoCi0JICogQHNpbmNlIDIuMCBDb3BpZWQgZnJvbSA8Y2xhc3M+RmlndXJlVXRpbGl0aWVzPGNsYXNzPiBDbGFzcywgdG8gYXZvaWQKLQkgKiAgICAgICAgY2FsbCBvZiBzdGF0aWMuCi0JICovCi0Jc3RhdGljIGludCBnZXRMYXJnZXN0U3Vic3RyaW5nQ29uZmluZWRUbyhTdHJpbmcgcywgRm9udCBmLAotCQkJaW50IGF2YWlsYWJsZVdpZHRoKSB7Ci0JCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3MoZik7Ci0JCWludCBtaW4sIG1heDsKLQkJZmxvYXQgYXZnID0gbWV0cmljcy5nZXRBdmVyYWdlQ2hhcldpZHRoKCk7Ci0JCW1pbiA9IDA7Ci0JCW1heCA9IHMubGVuZ3RoKCkgKyAxOwotCi0JCS8vIFRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGd1ZXNzCi0JCWludCBndWVzcyA9IDAsIGd1ZXNzU2l6ZSA9IDA7Ci0JCXdoaWxlICgobWF4IC0gbWluKSA+IDEpIHsKLQkJCS8vIFBpY2sgYSBuZXcgZ3Vlc3Mgc2l6ZQotCQkJLy8gTmV3IGd1ZXNzIGlzIHRoZSBsYXN0IGd1ZXNzIHBsdXMgdGhlIG1pc3Npbmcgd2lkdGggaW4gcGl4ZWxzCi0JCQkvLyBkaXZpZGVkIGJ5IHRoZSBhdmVyYWdlIGNoYXJhY3RlciBzaXplIGluIHBpeGVscwotCQkJZ3Vlc3MgPSBndWVzcyArIChpbnQpICgoYXZhaWxhYmxlV2lkdGggLSBndWVzc1NpemUpIC8gYXZnKTsKLQotCQkJaWYgKGd1ZXNzID49IG1heCkKLQkJCQlndWVzcyA9IG1heCAtIDE7Ci0JCQlpZiAoZ3Vlc3MgPD0gbWluKQotCQkJCWd1ZXNzID0gbWluICsgMTsKLQotCQkJLy8gTWVhc3VyZSB0aGUgY3VycmVudCBndWVzcwotCQkJZ3Vlc3NTaXplID0gRmlndXJlVXRpbGl0aWVzCi0JCQkJCS5nZXRUZXh0RXh0ZW50cyhzLnN1YnN0cmluZygwLCBndWVzcyksIGYpLndpZHRoOwotCi0JCQlpZiAoZ3Vlc3NTaXplIDwgYXZhaWxhYmxlV2lkdGgpCi0JCQkJLy8gV2UgZGlkIG5vdCB1c2UgdGhlIGF2YWlsYWJsZSB3aWR0aAotCQkJCW1pbiA9IGd1ZXNzOwotCQkJZWxzZQotCQkJCS8vIFdlIGV4Y2VlZGVkIHRoZSBhdmFpbGFibGUgd2lkdGgKLQkJCQltYXggPSBndWVzczsKLQkJfQotCQlyZXR1cm4gbWluOwotCX0KLQotCS8qKgotCSAqIFNldHMgdG8gd3JhcCB0ZXh0IGluIExhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlL2ZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXAoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1RleHRXcmFwcGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1dSQVAsIGIpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRleHQgd3JhcC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RleHRXcmFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGV4dCB3cmFwIHdpZHRoLgotCSAqIAotCSAqIEBwYXJhbSBpCi0JICogICAgICAgICAgICBUaGUgbGFiZWwgdGV4dCB3cmFwIHdpZHRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFdyYXBXaWR0aChpbnQgaSkgewotCQlpZiAodGhpcy53cmFwV2lkdGggPT0gaSkKLQkJCXJldHVybjsKLQkJdGhpcy53cmFwV2lkdGggPSBpOwotCQlyZXZhbGlkYXRlKCk7Ci0JCXJlcGFpbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIFRleHQgV3JhcCBBbGlnbm1lbnQsIHVzZSBvbmx5IGFmdGVyIHVzaW5nIDxtZXRob2Q+c2V0VGV4dFdyYXAoYm9vbGVhbik8L21ldGhvZD4KLQkgKiAKLQkgKiBAcGFyYW0gaQotCSAqICAgICAgICAgICAgVGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0V3JhcEFsaWdubWVudChpbnQgaSkgewotCQlpZiAoZ2V0VGV4dFdyYXBBbGlnbm1lbnQoKSA9PSBpKQotCQkJcmV0dXJuOwotCi0JCXNldEFsaWdubWVudEZsYWdzKGksIEZMQUdfV1JBUF9BTElHTik7Ci0JCXJlcGFpbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRBbGlnbm1lbnRGbGFncwotCSAqIAotCSAqIEBwYXJhbSBpbnQKLQkgKiAgICAgICAgICAgIGFsaWduCi0JICogQHBhcmFtIGludAotCSAqICAgICAgICAgICAgZmxhZ09mZnNldAotCSAqIAotCSAqIC0tLSBUT0RPIC0gY29waWVkIG5lZWRzIHRvIG1vZGlmeQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBbGlnbm1lbnRGbGFncyhpbnQgYWxpZ24sIGludCBmbGFnT2Zmc2V0KSB7Ci0JCWZsYWdzICY9IH4oMHg3ICogZmxhZ09mZnNldCk7Ci0JCXN3aXRjaCAoYWxpZ24pIHsKLQkJY2FzZSBDRU5URVI6Ci0JCQlmbGFncyB8PSAweDEgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgVE9QOgotCQkJZmxhZ3MgfD0gMHgyICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQljYXNlIExFRlQ6Ci0JCQlmbGFncyB8PSAweDMgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgUklHSFQ6Ci0JCQlmbGFncyB8PSAweDQgKiBmbGFnT2Zmc2V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgQk9UVE9NOgotCQkJZmxhZ3MgfD0gMHg1ICogZmxhZ09mZnNldDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHdyYXBWYWx1ZQotCSAqIEByZXR1cm4gUG9zaXRpb25Db25zdGFudCByZXByZXNlbnRpbmcgdGhlIGFsaWdubWVudAotCSAqLwotCXByaXZhdGUgaW50IGdldEFsaWdubWVudChpbnQgZmxhZ09mZnNldCkgewotCQlpbnQgd3JhcFZhbHVlID0gZmxhZ3MgJiAoMHg3ICogZmxhZ09mZnNldCk7Ci0JCWlmICh3cmFwVmFsdWUgPT0gMHgxICogZmxhZ09mZnNldCkKLQkJCXJldHVybiBDRU5URVI7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDIgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIFRPUDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4MyAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gTEVGVDsKLQkJZWxzZSBpZiAod3JhcFZhbHVlID09IDB4NCAqIGZsYWdPZmZzZXQpCi0JCQlyZXR1cm4gUklHSFQ7Ci0JCWVsc2UgaWYgKHdyYXBWYWx1ZSA9PSAweDUgKiBmbGFnT2Zmc2V0KQotCQkJcmV0dXJuIEJPVFRPTTsKLQotCQlyZXR1cm4gQ0VOVEVSOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHRleHQgd3JhcHBpbmcgd2lkdGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRXcmFwQWxpZ25tZW50KCkgewotCQlyZXR1cm4gZ2V0QWxpZ25tZW50KEZMQUdfV1JBUF9BTElHTik7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlyZXR1cm4gKGZsYWdzICYgRkxBR19IQVNGT0NVUykgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBGTEFHX1NFTEVDVEVEKSAhPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBncmFwaGljc2RyYXdUZXh0KEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCVN0cmluZyBzdWJTdHJpbmcgPSBnZXRTdWJTdHJpbmdUZXh0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN1YlN0cmluZywgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlGb250IGYgPSBnZXRGb250KCk7Ci0JCWludCBmb250SGVpZ2h0ID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKGYpLmdldEhlaWdodCgpOwotCQlpbnQgdGV4dFdpZHRoID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHN1YlN0cmluZywgZikud2lkdGg7Ci0JCWludCB5ID0gZ2V0VGV4dExvY2F0aW9uKCkueTsKLQotCQkvLyBJZiB0aGUgZm9udCdzIGxlYWRpbmcgYXJlYSBpcyAwIHRoZW4gd2UgbmVlZCB0byBhZGQgYW4gb2Zmc2V0IHRvCi0JCS8vIGF2b2lkIHRydW5jYXRpbmcgYXQgdGhlIHRvcCAoZS5nLiBLb3JlYW4gZm9udHMpCi0JCWlmICgwID09IEZpZ3VyZVV0aWxpdGllcy5nZXRGb250TWV0cmljcyhmKS5nZXRMZWFkaW5nKCkpIHsKLQkJCWludCBvZmZzZXQgPSAyOyAvLyAyIGlzIHRoZSBsZWFkaW5nIGFyZWEgZm9yIGRlZmF1bHQgRW5nbGlzaAotCQkJeSArPSBvZmZzZXQ7Ci0JCX0KLQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXh0IGFkZGVkIHRvIGRyYXciICsgdG9rZW4pOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgdG9rZW5XaWR0aCA9IEZpZ3VyZVV0aWxpdGllcy5nZXRUZXh0RXh0ZW50cyh0b2tlbiwgZikud2lkdGg7Ci0JCQlpbnQgeCA9IGdldFRleHRMb2NhdGlvbigpLng7Ci0JCQlzd2l0Y2ggKGdldFRleHRXcmFwQWxpZ25tZW50KCkpIHsKLQkJCWNhc2UgQ0VOVEVSOgotCQkJCXggKz0gKHRleHRXaWR0aCAtIHRva2VuV2lkdGgpIC8gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgUklHSFQ6Ci0JCQkJeCArPSB0ZXh0V2lkdGggLSB0b2tlbldpZHRoOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZ3JhcGhpY3MuZHJhd1RleHQodG9rZW4sIHgsIHkpOwotCQkJeSArPSBmb250SGVpZ2h0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZm9jdXMgc3RhdGUgb2YgdGhpcyBsYWJlbAotCSAqIAotCSAqIEBwYXJhbSBiCi0JICogICAgICAgICAgICB0cnVlIHdpbGwgY2F1c2UgYSBmb2N1cyByZWN0YW5nbGUgdG8gYmUgZHJhd24gYXJvdW5kIHRoZSB0ZXh0Ci0JICogICAgICAgICAgICBvZiB0aGUgTGFiZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cyhib29sZWFuIGIpIHsKLQkJaWYgKGhhc0ZvY3VzKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX0hBU0ZPQ1VTLCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGlzIGxhYmVsCi0JICogCi0JICogQHBhcmFtIGIKLQkgKiAgICAgICAgICAgIHRydWUgd2lsbCBjYXVzZSB0aGUgbGFiZWwgdG8gYXBwZWFyIHNlbGVjdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCWlmIChpc1NlbGVjdGVkKCkgPT0gYikKLQkJCXJldHVybjsKLQkJc2V0RmxhZyhGTEFHX1NFTEVDVEVELCBiKTsKLQkJcmVwYWludCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvZmlndXJlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwOGRkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi9maWd1cmVzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGdyYXBoaWNhbCBmaWd1cmVzIGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9BbmNob3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIxMWRiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0FuY2hvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYW5jaG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFuY2hvclV0aWwgewotCi0JcHVibGljIHN0YXRpYyBQb2ludCBnZXRDbG9zZXN0UG9pbnQoUG9pbnRbXSBwb2ludHMsIFBvaW50IHBvaW50KSB7Ci0JCWludCBzaXplID0gcG9pbnRzLmxlbmd0aDsKLQkJZG91YmxlW10gZGlzdGFuY2VzID0gbmV3IGRvdWJsZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWRpc3RhbmNlc1tpXSA9IHBvaW50c1tpXS5nZXREaXN0YW5jZShwb2ludCk7Ci0JCX0KLQkJcmV0dXJuIHBvaW50c1ttaW4oZGlzdGFuY2VzKV07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGRvdWJsZVtdIG51bWJlcnMpIHsKLQkJaWYgKG51bWJlcnMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWRvdWJsZSBtaW4gPSBudW1iZXJzWzBdOwotCQlpbnQgaWQgPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8IG51bWJlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWRvdWJsZSBuID0gbnVtYmVyc1tpXTsKLQkJCWlmIChuIDwgbWluKSB7Ci0JCQkJbWluID0gbjsKLQkJCQlpZCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBudW1iZXJzCi0JICogQHJldHVybgotCSAqIAkJaW5kZXggb2YgdGhlIHNtYWxsZXN0IG51bWJlciBpbiB0aGUgZ2l2ZW4gYXJyYXkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtaW4oaW50W10gbnVtYmVycykgewotCQlpZiAobnVtYmVycy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAtMTsKLQkJaW50IG1pbiA9IG51bWJlcnNbMF07Ci0JCWludCBpZCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJaW50IG4gPSBudW1iZXJzW2ldOwotCQkJaWYgKG4gPCBtaW4pIHsKLQkJCQltaW4gPSBuOwotCQkJCWlkID0gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaWQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0Nvbm5lY3Rpb25BbmNob3JMb2NhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0Nvbm5lY3Rpb25BbmNob3JMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MzRmZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9Db25uZWN0aW9uQW5jaG9yTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLQotLyoqCi0gKiBDb25zdHJhaW50IGZvciBwbGFjaW5nIGFuY2hvciBsb2NhdGlvbi4KLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkFuY2hvckxvY2F0b3IgewotCi0JLyoqCi0JICogR2V0cyByZWxhdGl2ZSBsb2NhdGlvbiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcmVmZXJlbmNlIHBvaW50Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24KLQkgKi8KLQlQb2ludCBnZXRMb2NhdGlvbihQb2ludCByZWZlcmVuY2UpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzMxYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtRWRpdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgaW5zdHJ1Y3R1cmUgdG8gbGlzdGVucyB0byBhY3Rpb25zIGxpa2UgTG9jYWxDb250cmlidXRpb24sIExvY2FsCi0gKiBSZXBsYWNlIGluIFdvcmtCcmVha2Rvd24gU3RydWN0dXJlLiBMb2FkcyBhdCB0aW1lIG9mIHBsdWdpbiBsb2FkLgotICogCi0gKiBAc2VlIFZhcnlBY3Rpdml0eUNvbW1hbmQKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbUVkaXRvclV0aWwgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0PElDb21tYW5kTGlzdGVuZXI+IGNvbW1hbmRMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIERpYWdyYW1FZGl0b3JVdGlsKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUVkaXRvclV0aWwgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKERpYWdyYW1FZGl0b3JVdGlsLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRGlhZ3JhbUVkaXRvclV0aWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBMaXN0PElDb21tYW5kTGlzdGVuZXI+IGdldFZhcnlDb21tYW5kTGlzdGVuZXJzKCkgewotCQlpZiAoY29tbWFuZExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJQ29tbWFuZExpc3RlbmVyPigpOwotCQl9Ci0KLQkJY29tbWFuZExpc3RlbmVycy5hZGQobmV3IElDb21tYW5kTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCkgewotCQkJCS8vIEdldCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkuCi0JCQkJT2JqZWN0IHdyYXBwZXIgPSAoKFZhcnlBY3Rpdml0eUNvbW1hbmQpIGNvbW1hbmQpLmdldFdyYXBwZXIoKTsKLQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLmNsb3NlRGlhZ3JhbUVkaXRvcnMod3JhcHBlciwgCi0JCQkJCQluZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCkpOwotCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIucmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKHdyYXBwZXIsCi0JCQkJCQluZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCksIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKSB7Ci0JCQkJcmV0dXJuIFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3M7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gR2V0IG9sZCBjb250cmlidXRvci9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkuCi0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChWYXJ5QWN0aXZpdHlDb21tYW5kKSBjb21tYW5kKS5nZXRSZXN1bHQoKTsKLQotCQkJCUxpc3QgbGlzdHggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgd3JhcHBlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5jbG9zZURpYWdyYW1FZGl0b3JzKHdyYXBwZXIsIAotCQkJCQkJCW5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKSk7Ci0JCQkJCWxpc3R4LmNsZWFyKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcmVFeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwb3N0VW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLnJlZnJlc2hQYXJlbnREaWFncmFtRWRpdG9ycygoKFZhcnlBY3Rpdml0eUNvbW1hbmQpIGNvbW1hbmQpLnN1cGVyQWN0aXZpdHksCi0JCQkJCQkJbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpLCBmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21tYW5kTGlzdGVuZXJzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbVVJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL0RpYWdyYW1VSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2RmOTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvRGlhZ3JhbVVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFJlc291cmNlIENsYXNzIGZvciB0aGUgQXV0aG9yaW5nIERpYWdyYW0gKEdFRikgcGFja2FnZXMuCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpYWdyYW1VSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlhZ3JhbVVJUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c19uYW1lX251bGwxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9uYW1lX2VtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZnJlc2hBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEZyb21CYXNlQ21kX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVEaWFncmFtX3Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbGlnbl9iZW5kX3BvaW50X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9ub2RlX3Byb3BlcnR5X3ZhbHVlX3Byb2JsZW1fbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbW1hbmRfY2Fubm90RWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEaWFncmFtVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJjZTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wcmV2aW91c19uYW1lX251bGwxPVVuZG8gb2YgYSBuYW1lIGNoYW5nZSBpcyBub3QgYWxsb3dlZCBpZiB0aGUgcHJldmlvdXMgbmFtZSBpcyBudWxsLgotZXJyX25hbWVfZW1wdHk9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1tb3ZlQWN0aW9uX2xhYmVsPU1vdmUKLQotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0PVNlbGVjdAotQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwPVNlbGVjdCBub2RlIG9yIGxpbmsKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX3RpdGxlPUFkZCBOb2RlCi1BYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnPUlYUkQwMDAyVzogQWRkaW5nIGEgbm9kZSB0byBkaWFncmFtIGZhaWxlZAotQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dD1MaW5rCi1BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3Q9U2VsZWN0IExpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA9Q3JlYXRlIG5ldyBsaW5rCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQ9U3RhcnQgTm9kZQotQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwPUNyZWF0ZSBuZXcgc3RhcnQgbm9kZQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9RnJlZSBUZXh0Ci1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcD1DcmVhdGUgbmV3IGZyZWUgdGV4dAotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1TeW5jaHJvbml6YXRpb24gQmFyCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPUNyZWF0ZSBuZXcgc3luY2hyb25pemF0aW9uIGJhcgotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PURlY2lzaW9uIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGRlY2lzaW9uIG5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQ9RW5kIE5vZGUKLUFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg9QWN0aXZpdHkgRGV0YWlsOgotQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcD1DcmVhdGUgbmV3IGVuZCBub2RlCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9Q3JlYXRlIG5ldyBhY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0PUl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwPUNyZWF0ZSBuZXcgaXRlcmF0aW9uCi1BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dD1QaGFzZQotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3Rvb2x0aXA9Q3JlYXRlIG5ldyBwaGFzZQotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdGV4dD1Sb2xlIERlc2NyaXB0b3IKLVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4PVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW06Ci1BYnN0cmFjdERpYWdyYW1fUm9sZURlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHJvbGUgZGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIG5ldyB0YXNrIGRlc2NyaXB0b3IKLUFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dD1EZWxpdmVyeSBQcm9jZXNzCi1BY3R2aXRpdml0eURpYWdyYW1fQ2FwYWJpbGl0eVBhdHRlcm5fdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm4KLUFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg9UGhhc2UKLUFjdHZpdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dD1JdGVyYXRpb24KLUFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0PUFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcD1DcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dD1BbGlnbgotQWJzdHJhY3REaWFncmFtRWRpdG9yX3JlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQ9UmVmcmVzaCBmcm9tIEJhc2UgQWN0aXZpdHkKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dD1Gb3JtYXQgVGV4dCBCb3guLi4KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEF2ZXJhZ2UKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ9SG9yaXpvbnRhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEZpcnN0IFNlbGVjdGVkCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0PVNhdmUKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U9U2F2aW5nIHswfQotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlPVJlZnJlc2ggRnJvbSBCYXNlCi1BYnN0cmFjdERpYWdyYW1fQmVuZFBvaW50X2NyZWF0ZT1DcmVhdGUgQmVuZHBvaW50Ci0KLUFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ9T3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbQotcmVmcmVzaEFjdGlvbl9sYWJlbD1SZWZyZXNoCi1yZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw9UmVmcmVzaCBGcm9tIEJhc2UKLWRpYWdyYW1fc2F2ZUVycm9yPUlVUEQwMDAxVzogU2F2aW5nIGRpYWdyYW0gZmFpbGVkCi0KLURlbGV0ZURpYWdyYW1fdGV4dD1EZWxldGUgRGlhZ3JhbQotRGVsZXRlRGlhZ3JhbV9wcm9tcHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlIGFuZCBkZWxldGUgdGhpcyBkaWFncmFtP1xuVGhpcyBjaGFuZ2UgaXMgcGVybWFuZW50IGFuZCBjYW5ub3QgYmUgdW5kb25lLgotYWxpZ25fYmVuZF9wb2ludF90ZXh0PUFsaWduIEJlbmQgUG9pbnQKLUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dF9jb25maWdlZGl0b3IwPUNvbmZpZ3VyYXRpb24gRWRpdG9yCi1kaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c9RXJyb3IgaW4gdGhlIG5vZGUncyBwcm9wZXJ0eSB2YWx1ZS4KLWRpYWdyYW1fZXJyb3JEaWFsb2dfdGl0bGVfdGV4dDA9RXJyb3IKLQotQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0PVJlc2V0IERpYWdyYW0gTGF5b3V0Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotY29tbWFuZF9jYW5ub3RFZGl0PUlVUEQwMDAzRTogQ2Fubm90IGVkaXQgZGlhZ3JhbQotCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGl0bGU9UGFyZW50IEVkaXRvciBDbG9zZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90ZXh0PXswfSBoYXMgY2xvc2VkLiBXb3VsZCB5b3UgYWxzbyBsaWtlIHRvIGNsb3NlIHsxfT8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVGVtcGxhdGVDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVGVtcGxhdGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4ZjMxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi91dGlsL1RlbXBsYXRlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0vKioKLSAqIENvbnN0YW50cyB1c2VkIGluIGF1dGhvcmluZyBkaWFncmFtCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVtcGxhdGVDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFkgPSAiYWN0aXZpdHkgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT04gPSAiaXRlcmF0aW9uIHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0UgPSAicGhhc2UgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5DSF9CQVIgPSAic3luY2hvbml6YXRpb24gYmFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDSVNJT05fTk9ERSA9ICJkZWNpc2lvbiBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfTk9ERSA9ICJzdGFydCBub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX05PREUgPSAiZW5kIG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1QgPSAid29yayBwcm9kdWN0IHRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SID0gInJvbGUgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUiA9ICJ0YXNrIGRlc2NyaXB0b3IgdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9ICJ3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0ZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSRUVfVEVYVCA9ICJmcmVlIHRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUT0RPOiBtb3ZlIHRoZXNlIGNvbnN0YW50cyB0byBvdGhlciBmaWxlLiBUaGlzIGNsYXNzIGRlZmluZSBvbmx5IHRlbXBsYXRlCi0JLy8gY29uc3RhbnRzCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX05BTUUgPSAicHJvcGVydHlfZm9udF9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9TVFlMRSA9ICJwcm9wZXJ0eV9mb250X3N0eWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRk9OVF9IRUlHSFQgPSAicHJvcGVydHlfZm9udF9oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX1JFRCA9ICJwcm9wZXJ0eV9mb250X3JlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0ZPTlRfQkxVRSA9ICJwcm9wZXJ0eV9mb250X2JsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9GT05UX0dSRUVOID0gInByb3BlcnR5X2ZvbnRfZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGb3IgZGVmYXVsdCBmb250cy4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZPTlRfTkFNRSA9IGdldEZvbnROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZPTlRfU0laRSA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UID0gbmV3IEZvbnQobnVsbCwgREVGQVVMVF9GT05UX05BTUUsCi0JCQlERUZBVUxUX0ZPTlRfU0laRSwgamF2YS5hd3QuRm9udC5QTEFJTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgREVGQVVMVF9GT05UX0lUQUxJQyA9IG5ldyBGb250KG51bGwsCi0JCQlERUZBVUxUX0ZPTlRfTkFNRSwgREVGQVVMVF9GT05UX1NJWkUsIGphdmEuYXd0LkZvbnQuSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTl8ySyA9ICJXaW5kb3dzIDIwMDAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRGb250TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ29ycnVwdGVkIEphcGFuZXNlIGNoYXJhY3RlcnMgaW4gQWN0aXZpdHkgRGlhZ3JhbXMKLQkJU3RyaW5nIGN1cnJlbnRMb2NhbGUgPSBQbGF0Zm9ybS5nZXROTCgpOwotCQlpZiAoY3VycmVudExvY2FsZSAhPSBudWxsCi0JCQkJJiYgY3VycmVudExvY2FsZS5zdGFydHNXaXRoKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSkgewotCQkJaWYgKFdJTl8ySy5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0IgPSAiQUREX1JPTEVfVEFTS1NfQk9YX0JHX0NPTE9SX1JHQiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfV1BfQk9YX0JHX0NPTE9SX1JHQiA9ICJBRERfV1BfQk9YX0JHX0NPTE9SX1JHQiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvVmFsaWRhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9WYWxpZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjE5ZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9WYWxpZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBWYWxpZGF0aW5nIHJvdXRpbmVzIGZvciBkaWFncmFtIGVkaXRpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX0Nhbk5vdENvbm5lY3QgPSBBdXRob3JpbmdVSVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX1NhbWVQcmVkQW5kU3VjYyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0OyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlcnJNc2dfQ2FuTm90RGVsZXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsgCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdXNlciBjYW4gY29ubmVjdCB0aGUgZ2l2ZW4gbm9kZXMuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuIG51bGwgaWYgY29ubmVjdGlvbiBpcyBhbGxvd2VkLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0KSB7Ci0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpICE9IHRhcmdldC5nZXREaWFncmFtKCkpCi0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7Ci0KLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHNvdXJjZS5nZXREaWFncmFtKCkKLQkJCQkJLmdldE9iamVjdCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJT2JqZWN0IHByb2MgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlwcm9jID0gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldFRvcEl0ZW0oKTsKLQkJCX0KLQkJCS8vIGdldCBhbGwgYnJlYWtkb3duIGVsZW1lbnRzIGluIHRoaXMgcHJvY2VzcwotCQkJTGlzdDxPYmplY3Q+IGFsbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJCXByb2MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJYWxsRWxlbWVudHMuYWRkKFRuZ1V0aWwudW53cmFwKG9iaikpOwotCQkJfQotCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCS8vIElmIHRhcmdldCBpcyBSZWFkT25seSAobWVhbnMgZXh0ZW5kcykgYW5kIGFsbG93IHRoZSBsaW5rIGlmCi0JCQkJLy8gaXRzIHBhcmVudCBhY3Rpdml0eSBpcyBhIENvbnRyaWJ1dG9yCi0JCQkJaWYgKHRhcmdldC5nZXREaWFncmFtKCkuaXNSZWFkT25seSgpKQotCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJaWYgKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWlmICh0YXJnZXQuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0LmdldE9iamVjdCgpLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZS5nZXRPYmplY3QoKSwKLQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGFyZ2V0LmlzUmVhZE9ubHkoKSkKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IGluY29taW5nIGNvbm5lY3Rpb24gdG8gc3RhcnQgbm9kZQotCQkJCQkJLy8gYW5kIEZyZWVUZXh0LgotCQkJCQkJaWYgKCgoVHlwZWROb2RlKSB0YXJnZXQpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1RBUlQKLQkJCQkJCQkJfHwgKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSB0YXJnZXQsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCQlwcmVkLCBhbGxFbGVtZW50cykpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJaWYgKHRhcmdldCA9PSBzb3VyY2UpIHsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJfQotCQkJCQkvLyBzaG91bGQgbm90IGFsbG93IG91dGdvaW5nIGNvbm5lY3Rpb24gZnJvbSBFbmQgTm9kZSBhbmQKLQkJCQkJLy8gRnJlZSBUZXh0Ci0JCQkJCWlmICgoKFR5cGVkTm9kZSkgc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkVORAotCQkJCQkJCXx8ICgoVHlwZWROb2RlKSBzb3VyY2UpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJZiBzb3VyY2UgYW5kIHRhcmdldCBhcmUgVHlwZWROb2RlcywgYXZvaWQgY2lyY3VsYXIKLQkJCQkJCSAqIGxvb3AgY29ubmVjdGlvbi4KLQkJCQkJCSAqLwotCQkJCQkJaWYgKGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoKFR5cGVkTm9kZSkgc291cmNlLAotCQkJCQkJCQkoVHlwZWROb2RlKSB0YXJnZXQpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbiB0byBzdGFydCBub2RlCi0JCQkJCQkvLyBhbmQgRnJlZVRleHQuCi0JCQkJCQlpZiAoKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVAotCQkJCQkJCQl8fCAoKFR5cGVkTm9kZSkgdGFyZ2V0KS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCX0KLQotCQkJCQkJQ29sbGVjdGlvbiBzcmNOb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIHNvdXJjZSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJaWYgKCFzcmNOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIHRhcmdldCwKLQkJCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQkJCQkJaWYgKG5vZGUuaXNSZWFkT25seSgpKQotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgKChOb2RlKSBpdGVyYXRvcgotCQkJCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQkJCWlmIChQcm9jZXNzVXRpbC5jaGVja0NpcmN1bGFyKHN1Y2MsIHByZWQsCi0JCQkJCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCi0JCQkJCQlpZiAodGFyZ2V0LmlzUmVhZE9ubHkoKSkKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0KLQkJCQkJCUNvbGxlY3Rpb24gc3JjTm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5nZXRTb3VyY2VOb2RlcygoVHlwZWROb2RlKSBzb3VyY2UsCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpICgoTm9kZSkgdGFyZ2V0KQotCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjTm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkJCQkubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcihzdWNjLCBwcmVkLAotCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpIHx8IHRhcmdldC5pc1JlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQl9Ci0KLQkJCWlmICgoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgdGFyZ2V0Ci0JCQkJCS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQl8fCAoc291cmNlLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCQkJCXx8IChzb3VyY2UuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgJiYgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBjb25uZWN0aW9uCi0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gdGFyZ2V0KSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfSBlbHNlIGlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJaWYgKHNvdXJjZS5pc1JlYWRPbmx5KCkgfHwgdGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKExpbmsgbGluaykgewotCi0JCS8vIGlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwKLQkJLy8gJiYgbGluay5nZXRUYXJnZXQoKS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJLy8gaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuaXNSZWFkT25seSgpKXsKLQkJLy8gaWYobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCS8vIGlmKCgoVHlwZWROb2RlKWxpbmsuZ2V0U291cmNlKCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkvLyB9Ci0JCS8vIGlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCS8vCQkJCQotCQkvLyBUeXBlZE5vZGUgdHlwZWRub2RlID0gKFR5cGVkTm9kZSlsaW5rLmdldFRhcmdldCgpOwotCQkvLyBpZih0eXBlZG5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5ERUNJU0lPTil7Ci0JCS8vIHJldHVybiBudWxsOwotCQkvLyB9Ci0JCS8vIGlmKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpewotCQkvLyB0eXBlZG5vZGUgPSAoVHlwZWROb2RlKWxpbmsuZ2V0U291cmNlKCk7Ci0JCS8vIGlmKHR5cGVkbm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKXsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwkJCQkKLQkJLy8gaWYgKGxpbmsuZ2V0U291cmNlKCkuaXNSZWFkT25seSgpKQotCQkvLyByZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJLy8JCQkJCi0JCS8vIGlmIChsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJLy8gfHwgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUgJiYgIUdyYXBoaWNhbERhdGFIZWxwZXIKLQkJLy8gLmdldFNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIGxpbmsuZ2V0U291cmNlKCksCi0JCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcykKLQkJLy8gLmlzRW1wdHkoKSkpIHsKLQkJLy8JCQkJCQotCQkvLyBDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0KLQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rLmdldFRhcmdldCgpLAotCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkvLyBpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJLy8gcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIH0KLQkJLy8gaWYgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJLy8gVHlwZWROb2RlIHR5cGVkbm9kZSA9IChUeXBlZE5vZGUpbGluay5nZXRTb3VyY2UoKTsKLQkJLy8gaWYodHlwZWRub2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyBpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpCi0JCS8vIHJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkvLyB9Ci0JCS8vIH0gZWxzZSBpZiAoKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCAmJgotCQkvLyBsaW5rLmdldFRhcmdldCgpLmlzUmVhZE9ubHkoKSkKLQkJLy8gfHwgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCAmJiBsaW5rLmdldFNvdXJjZSgpLmlzUmVhZE9ubHkoKSkpIHsKLQkJLy8gcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gU3BlY2lhbCBoYW5kbGUgZm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIGxpbmtzIGNhbm5vdCBiZSBkZWxldGVkLgotCQlpZiAodGFyZ2V0ICE9IG51bGwKLQkJCQkmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJfQotCi0JCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0KLQkJCS8vIFRhcmdldCA9IGJyZWFrZG93bmVsZW1lbnQKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkvLyBTb3VyY2UgPSBCcmVha2Rvd24gZWxlbWVudAotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuaXNSZWFkT25seSgpKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkvLyBTb3VyY2UgPSBUeXBlZE5vZGUKLQkJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCS8vIFNvdXJjZSA9IERlY2lzaW9uIE5vZGUKLQkJCQkJVHlwZWROb2RlIHNvdXJjZU5vZGUgPSAoVHlwZWROb2RlKSBzb3VyY2U7Ci0JCQkJCWlmICghdGFyZ2V0LmlzUmVhZE9ubHkoKSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0gZWxzZSBpZiAoc291cmNlTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkRFQ0lTSU9OKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfSBlbHNlIGlmIChzb3VyY2VOb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhzb3VyY2VOb2RlKTsKLQkJCQkJfSBlbHNlIGlmIChzb3VyY2VOb2RlLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ly8gVGFyZ2V0IGlzIFR5cGVkTm9kZQotCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0KLQkJCQlUeXBlZE5vZGUgdHlwZWROb2RlID0gKFR5cGVkTm9kZSkgdGFyZ2V0OwotCQkJCS8vIGlmIFRhcmdldCBpcyBUeXBlZE5vZGUgYW5kIGl0cyBhIERlY2lzaW9uUG9pbnQgLSBzaG91bGQgYmUKLQkJCQkvLyBibGFjay4KLQkJCQlpZiAodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCS8vIElmIFRhcmdldCBpcyBUeXBlZE5vZGUgYW5kIGFuZCBTb3VyY2UgaXMgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkvLyBhbmQgcmVhZG9ubHkKLQkJCQkvLyBMaW5rIHNob3VsZCBiZSBncmVlbi4KLQkJCQlpZiAoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCS8vIENoZWNrIFRhcmdldCAtIGlzIGhhdmluZyBhbnkgaW5kaXJlY3Qob3V0Z29pbmcKLQkJCQkJLy8gY29ubm5lY3Rpb24pIGNvbnRhaW5zIGRlY2lzaW9uIHBvaW50cy4KLQkJCQkJaWYgKGNoZWNrU3luY0Jhck91dGdvaW5nTGlua3MoKFR5cGVkTm9kZSkgdGFyZ2V0KSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWlmIChzb3VyY2UuaXNSZWFkT25seSgpKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfQotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJVHlwZWROb2RlIHNvdXJjZVR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIHNvdXJjZTsKLQkJCQkJLy8gU291cmNlIGlzIFR5cGVkIE5vZGUgYW5kIGl0cyBhIGRlY2lzaW9uIHBvaW50IHJldHVybgotCQkJCQkvLyBudWxsLgotCQkJCQlpZiAoc291cmNlVHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHNvdXJjZSBpcyBTeW5jQmFyIGFuZCBjaGVjayBhbGwgaXRzIGluY29taW5nCi0JCQkJCS8vIGNvbm5lY3Rpb25zLgotCQkJCQlpZiAoc291cmNlVHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhzb3VyY2VUeXBlZE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrRGVsZXRlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpCi0JCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbm9kZS5nZXREaWFncmFtKCk7Ci0JCWlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0Tm9kZXMgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFRhcmdldE5vZGVzKAotCQkJCQkJKFR5cGVkTm9kZSkgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmICh0YXJnZXQuaXNSZWFkT25seSgpKSB7Ci0JCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChkaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tSZWNvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQkJaWYgKHNvdXJjZS5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChsaW5rLmdldFRhcmdldCgpICE9IG51bGwpIHsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHRhcmdldE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluay5nZXRUYXJnZXQoKSwKLQkJCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAobm9kZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGVja0Nvbm5lY3Qoc291cmNlLCB0YXJnZXQsIGxpbmspOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHdpbGwgbm90IGFsbG93IG11bHRpcGxlIGxpbmsgYmV0d2VlbiB0d28gbm9kZXMuIE5lZWRzIHRvIGNhbGwKLQkgKiBDcmVha0xpbmtDb21tYW5kIGFuZCBSZWNvbm5lY3RMaW5rQ29tbWFuZC4gQW55IGFjdGlvbiBvbiBhIExpbmsgc2hvdWxkCi0JICogY2FsbCB0aGlzIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIExpbmsgbGluaykgYmVmb3JlIGFsbG93Ci0JICogdG8gY29ubmVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Nvbm5lY3QoTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0LCBMaW5rIGxpbmspIHsKLQotCQlpZiAoc291cmNlID09IHRhcmdldCAmJiAhKHNvdXJjZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQl9Ci0KLQkJTGlzdCBsaW5rcyA9IHNvdXJjZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCWlmIChsaW5rcyAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIGlzIG5lZWQgZm9yIHJlY29ubmVjdCB0byBzYW1lIHRhcmdldCBub2RlLgotCQkJaWYgKGxpbmtzLmNvbnRhaW5zKGxpbmspKSB7Ci0JCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJLy8gVGhpcyBpcyBuZWVkIGZvciBuZXcgY29ubmVjdCBhbmQgcmVjb25uZWN0IHRvIGRpZmZlcmVudCB0YXJnZXQKLQkJCS8vIG5vZGUuCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaW5rcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmt4ID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBsaW5reHRhcmdldCA9IGxpbmt4LmdldFRhcmdldCgpOwotCQkJCWlmIChsaW5reHRhcmdldCAhPSBudWxsICYmIGxpbmt4dGFyZ2V0LmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ29ubmVjdChzb3VyY2UsIHRhcmdldCk7Ci0JfQotCi0JLyoKLQkgKiBUbyBhdm9pZCBjaXJjdWxhciBsb29waW5nIGJldHdlZW4gc3luY2hyb25pemF0aW9uIGJhcnMuIElmIFN5Y25CYXIxIC0+Ci0JICogU3luY0JhcjIgKGNvbm5lY3RlZCkgdGhlbiBTeW5jQmFyMiAtPiBTeW5jQmFyMSBjYW5ub3QgY29ubmVjdC4gaWYKLQkgKiBzeW5jYmFyMSAtPiBzeW5jYmFyMi0+c3luY2JhcjMgdGhlbiBzeW5jYmFyMyAtPiBzeW5jYmFyMSBkaXNhbGxvd2VkLgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoVHlwZWROb2RlIHNOb2RlLAotCQkJVHlwZWROb2RlIHROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IHROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCU5vZGUgdHlwZWRub2RlID0gbGluay5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoc05vZGUuZXF1YWxzKHR5cGVkbm9kZSkpCi0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQlpZiAodHlwZWRub2RlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJCXJldHVybiBjaGVja1N5bmNCYXJDaXJjdWxhckxvb29wKHNOb2RlLAotCQkJCQkJCShUeXBlZE5vZGUpIHR5cGVkbm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIENoZWNrIGlmIFN5bmNCYXIgaW5Db21taW5nIGNvbm5lY3Rpb25zIGhhdmUgYW55IHNvdXJjZSBpcyBhCi0JICogcmVhZG9ubHkuIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKFR5cGVkTm9kZSB0eXBlZE5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIHsKLQkJCQlpZiAoc291cmNlLmlzUmVhZE9ubHkoKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCWlmICgoKFR5cGVkTm9kZSkgc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikKLQkJCQkJaWYgKGNoZWNrU3luY0JhckluY29taW5nTGlua3MoKFR5cGVkTm9kZSkgc291cmNlKSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gY2hlY2sgaWYgc3luY2hyb25pemF0aW9uIGJhciBvdXRnb2luZyBjb25uZWN0aW9uIGhhcyBhbnkgdGFyZ2V0Ci0JICogaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcyhUeXBlZE5vZGUgdHlwZWROb2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJaWYgKHRhcmdldC5pc1JlYWRPbmx5KCkpCi0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJfSBlbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlpZiAoKChUeXBlZE5vZGUpIHRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCWlmIChjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKChUeXBlZE5vZGUpIHRhcmdldCkgIT0gbnVsbCkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBsaW5rIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRPbmx5KExpbmsgbGluaykgewotCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5nZXREaWFncmFtKCkgaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCXJldHVybiBjaGVja0RlbGV0ZShsaW5rKSAhPSBudWxsOwotCQl9IGVsc2UgaWYgKHRhcmdldCAhPSBudWxsCi0JCQkJJiYgdGFyZ2V0LmdldERpYWdyYW0oKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJaWYgKChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UgaW5zdGFuY2VvZiBUYXNrTm9kZSAmJiBzb3VyY2UKLQkJCQkJLmlzUmVhZE9ubHkoKSkKLQkJCQkJfHwgKHRhcmdldCBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIHRhcmdldC5pc1JlYWRPbmx5KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOThhNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgYWN0aXZpdHkgZGlhZ3JhbXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZiODZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlNXVEdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5Ob2RlQ29udGFpbmVyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5TZWxlY3RhYmxlTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIGdyYXBoaWNhbCB2aWV3ZXIgb2YgdGhlIGVsZW1lbnQgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByb3RlY3RlZCBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJvdGVjdGVkIE9iamVjdCB3cmFwcGVyOwotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQljcmVhdGVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCB3cmFwcGVyKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQljcmVhdGVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR3JhcGhpY2FsVmlld2VyIG9uIHRoZSBzcGVjaWZpZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIgPSBuZXcgU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKCk7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ3JhcGhpY2FsIHZpZXdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBncmFwaGljYWwgdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBncmFwaGljYWxWaWV3ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCgKLQkJCQlDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0JCVNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyKSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQlTY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0IHJvb3QgPSBuZXcgU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCgpOwotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCQl2aWV3ZXIuc2V0RWRpdFBhcnRGYWN0b3J5KGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRGaWd1cmUoKSB7Ci0JCUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKTsKLQotCQkvLyBmaW5kIHRoZSBmaWd1cmUgdG8gYmUgc2F2ZWQKLQkJTGF5ZXJNYW5hZ2VyIGxtID0gKExheWVyTWFuYWdlcikgdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJTGF5ZXJNYW5hZ2VyLklEKTsKLQkJSUZpZ3VyZSBmaWd1cmUgPSBsbS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdXBwcmVzc2lvblRvRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJT2JqZWN0IGUgPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRpYWdyYW0gZm9yIGdpdmVuIG9iamVjdCAob25seSBmb3Ige0BsaW5rIEFjdGl2aXR5fSBhbmQgcGFja3MgdGhlIGJvdW5kcy4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlciAJe0BsaW5rIE9iamVjdH0gCQotCSAqIEBwYXJhbSBuZWVkUmVzZXQgYm9vbGVhbgotCSAqIEBwYXJhbSBmaWx0ZXIgCXtAbGluayBJRmlsdGVyfQotCSAqIEBwYXJhbSBzdXAJCXtAbGluayBTdXBwcmVzc2lvbn0KLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgbG9hZERpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGJvb2xlYW4gbmVlZFJlc2V0LAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBpbml0aWFsaXplIHRoZSB2aWV3ZXIgd2l0aCB0aGUgZWRpdCBwYXJ0Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gY3JlYXRlRWRpdFBhcnQod3JhcHBlciwgZmlsdGVyLCBzdXApOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0KLQkJLy8gYXNrIGZvciBpbW1lZGlhdGUgdXBkYXRlIG9mIHRoZSBjb250cm9sIHNvIHRoYXQgdGhlIGRpYWdyYW0gZmlndXJlCi0JCS8vIHdpbGwgYmUgY29tcHV0ZWQKLQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0KLQkJLy8gVGhpcyBjaGVjayBpcyBuZWVkZWQgZm9yIGJyb3dzaW5nLCBpbiBvcmRlciB0byByZW5kZXIgYWN0aXZpdHkgY29udHJpYnV0aW5nJ3MKLQkJLy8gY2hpbGRyZW4uICBJbiBwcm9jZXNzQXV0aG9yaW5nIHdlIGRvbid0IGRvIHJlYWxpemF0aW9uLCBpbiBvcmRlciB0byBkaXNwbGF5ZWQgCi0JCS8vIHJlYWxpemVkIGVsZW1lbnRzLCB3ZSBoYXZlIHRvIGNsZWFudXAgQUREIGRpYWdyYW0gYW5kIHJlY3JlYXRlLiBuZWVkdG9SZXNldCBvciBjbGVhbnVwZGlhZ3JhbS4KLQkJLy8gT25seSBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0uCi0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgZ2V0RGlhZ3JhbVR5cGUoKSAhPSBudWxsICYmIAotCQkJCWdldERpYWdyYW1UeXBlKCkuZXF1YWxzSWdub3JlQ2FzZShSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSl7Ci0JCQlpZihUbmdVdGlsLmhhc0NvbnRyaWJ1dG9yKChWYXJpYWJpbGl0eUVsZW1lbnQpbykpewotCQkJCW5lZWRSZXNldCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZWVkUmVzZXQpIHsKLQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCX0KLQotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotCQlpZiAoZmlndXJlICE9IG51bGwpIHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJCZWZvcmUgdXBkYXRlOiBEaWFncmFtIEJvdW5kcyA9ICIgKyBib3VuZHMpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYm91bmRzLnggPCAwIHx8IGJvdW5kcy55IDwgMCkgewotCQkJCSgoRGlhZ3JhbUVkaXRQYXJ0KSBlZGl0UGFydCkubW92ZUZpZ3VyZSgtYm91bmRzLngsIC1ib3VuZHMueSk7Ci0KLQkJCQlwYXJlbnQucGFjayh0cnVlKTsKLQotCQkJCWJvdW5kcyA9IGZpZ3VyZS5nZXRCb3VuZHMoKTsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQWZ0ZXIgdXBkYXRlOiBEaWFncmFtIEJvdW5kcyA9ICIgKyBib3VuZHMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWREaWFncmFtSW5mbyhHcmFwaGljYWxFZGl0UGFydCBwYXJ0LCBEaWFncmFtSW5mbyBkaWFncmFtSW5mbykgewotCQlMaXN0IGNoaWxkcmVuID0gcGFydC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE5vZGVDb250YWluZXJFZGl0UGFydCkgewotCQkJCWxvYWREaWFncmFtSW5mbygoR3JhcGhpY2FsRWRpdFBhcnQpIG8sIGRpYWdyYW1JbmZvKTsKLQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbzsKLQkJCQlPYmplY3QgbW9kZWwgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IGUgPSBtb2RlbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJCQllID0gKChMaW5rZWRPYmplY3QpIGUpLmdldE9iamVjdCgpOwotCQkJCX0KLQotCQkJCWlmIChlIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWJvb2xlYW4gc3VwcHJlc3NlZDsKLQkJCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChOYW1lZE5vZGUpIG1vZGVsKS5pc1N1cHByZXNzZWQoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQkJSUZpZ3VyZSBmID0gcGFydC5nZXRGaWd1cmUoKTsKLQkJCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmLmdldEJvdW5kcygpOwotCi0JCQkJCQlTdHJpbmcgYWx0VGFnID0gbnVsbDsKLQkJCQkJCWlmIChmIGluc3RhbmNlb2YgU2VsZWN0YWJsZUxhYmVsKSB7Ci0JCQkJCQkJYWx0VGFnID0gKChTZWxlY3RhYmxlTGFiZWwpIGYpLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJCWRpYWdyYW1JbmZvLmFkZEFyZWEoKE1ldGhvZEVsZW1lbnQpIGUsIGJvdW5kcy54LAotCQkJCQkJCWJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIGFsdFRhZywgc3VwcHJlc3NlZCk7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRWRpdFBhcnQgbm90IGhhbmRsZWQ6ICIgKyBvKTsKLQkJCQkvLyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHtAbGluayBEaWFncmFtSW5mb30KLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gZ2V0RGlhZ3JhbUluZm8oKSB7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSB0aGlzLmdyYXBoaWNhbFZpZXdlcgotCQkJCS5nZXRDb250ZW50cygpOwotCQlPYmplY3QgZWxlbWVudCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCWVsZW1lbnQgPSAoKExpbmtlZE9iamVjdCkgZWxlbWVudCkuZ2V0T2JqZWN0KCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlkaWFncmFtSW5mbyA9IG5ldyBEaWFncmFtSW5mbyhnZXREaWFncmFtVHlwZSgpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlsb2FkRGlhZ3JhbUluZm8ocGFydCwgZGlhZ3JhbUluZm8pOwotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBpbWFnZSBmcm9tIGZpZ3VyZSBjcmVhdGVkIGluIGxvYWREaWFncmFtIG1ldGhvZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlRGlhZ3JhbUltYWdlKCkgewotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotCi0JCVNXVEdyYXBoaWNzIGdyYXBoaWNzID0gbnVsbDsKLQkJR0MgZ2MgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQlpbnQgaGVpZ2h0ID0gYm91bmRzLmhlaWdodDsKLQkJCWludCB3aWR0aCA9IGJvdW5kcy53aWR0aDsKLQotCQkJLy8gY3JlYXRlIGEgbmV3IGltYWdlIGFuZCByZXBhaW50IHRoZSBncmFwaAotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJCWdjID0gbmV3IEdDKGltYWdlKTsKLQkJCWdyYXBoaWNzID0gbmV3IFNXVEdyYXBoaWNzKGdjKTsKLQkJCWZpZ3VyZS5wYWludChncmFwaGljcyk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCi0JCQlpZiAoZ3JhcGhpY3MgIT0gbnVsbCkKLQkJCQlncmFwaGljcy5kaXNwb3NlKCk7Ci0JCQlpZiAoZ2MgIT0gbnVsbCkKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUNvbnRyb2wgY3RybCA9IGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJCQljdHJsLmRpc3Bvc2UoKTsKLQkJCQl9Ci0KLQkJCQlncmFwaGljYWxWaWV3ZXIgPSBudWxsOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJU3VwcHJlc3Npb24gc3VwKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA4MTVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtQWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkRpYWdyYW1VcGRhdGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBBY3Rpdml0eURldGFpbCBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnQoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOy8vCi0JCWRpYWdyYW0uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWlmIChzdXAgIT0gbnVsbCkgewotCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQl9Ci0KLQkJZGlhZ3JhbS5zZXRPYmplY3QoZSk7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQoCi0JCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjbGVhblVwRGlhZ3JhbSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChkZXAuZ2V0Q2hpbGRyZW4oKSk7Ci0KLQkJLy8gY2xlYW4gdXAgdGhlIGRpYWdyYW0KLQkJRGVmYXVsdEVkaXREb21haW4gZWRpdGluZ0RvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbihudWxsKTsKLQkJQWN0aW9uUmVnaXN0cnkgYWN0aW9uUmVnaXN0cnkgPSBuZXcgQWN0aW9uUmVnaXN0cnkoKTsKLQotCQlEaWFncmFtQWN0aW9uU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbmV3IERpYWdyYW1BY3Rpb25TZXJ2aWNlKAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBlZGl0aW5nRG9tYWluLCBhY3Rpb25SZWdpc3RyeSk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCi0JCURpYWdyYW1VcGRhdGVTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVVwZGF0ZVNlcnZpY2UoCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGVkaXRpbmdEb21haW4sIGFjdGlvblJlZ2lzdHJ5KTsKLQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWFlODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LlByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogUHJvdmlkZXMgc2VydmljZSBtZXRob2RzIGZvciBjcmVhdGluZyBkaWFncmFtIGltYWdlcyBmb3IgYWN0aXZpdHkgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgaW1wbGVtZW50cyBJQWN0aXZpdHlEaWFncmFtU2VydmljZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgaG9sZGVyID0gbnVsbDsKLQotCXByaXZhdGUgRmlsZSBwdWJEaXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgdHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVW5jcmVhdGVkQUREID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSB0cnVlOwotCi0Jc3RhdGljIHsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkpOwotCQl0eXBlTWFwLnB1dChSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pKTsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1ksIG5ldyBJbnRlZ2VyKAotCQkJCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0SW50VHlwZShTdHJpbmcgZGlhZ3JhbVR5cGUpIHsKLQkJSW50ZWdlciB0eXBlID0gKEludGVnZXIpIHR5cGVNYXAuZ2V0KGRpYWdyYW1UeXBlKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGUuaW50VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtU2VydmljZSgpIHsKLQkJdGhpcyhudWxsLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSkpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKEZpbGUgcHViRGlyKSB7Ci0JCXRoaXMobnVsbCwgcHViRGlyKTsKLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtU2VydmljZShDb21wb3NpdGUgcGFyZW50LCBGaWxlIHB1YkRpcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCi0JcHJpdmF0ZSBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgZ2V0RGlhZ3JhbVZpZXdlcihpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJLy8gaWYgdGhlIHNoZWxsIHdpbmRvdyBpcyBkaXN0cm95ZWQsIHJlY3JlYXRlIGl0Ci0JCWlmICgodGhpcy5zaGVsbCAhPSBudWxsKSAmJiB0aGlzLnNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5wYXJlbnQgPSBudWxsOwotCQkJdGhpcy5zaGVsbCA9IG51bGw7Ci0JCX0KLQotCQlnZXRWaWV3ZXJIb2xkZXIocGFyZW50KTsKLQotCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGlhZ3JhbVZpZXdlcihob2xkZXIpOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoaG9sZGVyKTsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKGhvbGRlcik7Ci0JCQkKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFZpZXdlckhvbGRlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJaWYgKHNoZWxsID09IG51bGwgfHwgc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJc2hlbGwgPSBjcmVhdGVTaGVsbCgpOwotCQkJfQotCQkJc2hlbGwub3BlbigpOwotCQkJcGFyZW50ID0gc2hlbGw7Ci0JCX0KLQotCQlpZiAoaG9sZGVyICE9IG51bGwpIHsKLQkJCWhvbGRlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQlob2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlob2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoMSwgMSkpOyAvLyBzaXplIGNhbid0IGJlIDAsMAotCQkvLyBvdGhlcndpc2UgdGhlIGRpYWdyYW0KLQkJLy8gd2lsbCBub3QgYmUgcGFpbnRlZAotCQlob2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlob2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBTaGVsbCBjcmVhdGVTaGVsbCgpIHsKLQkJU2hlbGwgc2hlbGwgPSBudWxsOwotCQlEaXNwbGF5IGQgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJc2hlbGwgPSBuZXcgU2hlbGwoZCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQlzaGVsbC5zZXRCb3VuZHMoMCwgMCwgMCwgMCk7Ci0JCXNoZWxsLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKChzaGVsbCAhPSBudWxsKSAmJiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkpIHsKLQkJCXNoZWxsLmNsb3NlKCk7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBlbGVtZW50IGRpYWdyYW0gaW1hZ2UgYW5kIHJldHVybnMgdGhlIGltYWdlIGZpbGUgdXJsLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBJRmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqICAgICAgICAgICAgU3VwcHJlc3Npb24KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgaW1hZ2UgcGF0aCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyBkaXIKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlI3NhdmVEaWFncmFtKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyBEaWFncmFtSW5mbyBzYXZlRGlhZ3JhbShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgU3RyaW5nIGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBpbml0aWFsaXplIHRoZSBkaWFncmFtSW5mbwotCQlkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJLy8gZ3JhYiB0aGUgVUkgdGhyZWFkIHRvIGF2b2lkIHRocmVhZCBhY2Nlc3MgZXJyb3IKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCV9faW50ZXJuYWxfc2F2ZURpYWdyYW0od3JhcHBlciwgaW1nUGF0aCwgZGlhZ3JhbVR5cGUsIGZpbHRlciwgc3VwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNVc2VyRGVmaW5lZERpYWdyYW0oQWN0aXZpdHkgZSwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsJCQotCQkvLyBpZiB0aGVyZSBpcyBhIHVzZXIgZGVmaW5lZCBkaWFncmFtLCB1c2UgaXQKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyBpbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oKEFjdGl2aXR5KWUpOwotCQlzd2l0Y2ggKGdldEludFR5cGUoZGlhZ3JhbVR5cGUpKQotCQl7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCWlmICggaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKSAmJiBpbmZvLmNhblB1Ymxpc2hBREltYWdlKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQotCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJaWYgKCBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSAhPSBudWxsKSAmJiBpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCQkJCQkKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJaWYgKCBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpICkKLQkJCQl7Ci0JCQkJCXJldHVybiAoaW5mby5nZXRXUEREaWFncmFtKCkgIT0gbnVsbCApICYmIGluZm8uY2FuUHVibGlzaFdQREltYWdlKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBfX2ludGVybmFsX3NhdmVEaWFncmFtKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwgU3RyaW5nIGRpYWdyYW1UeXBlLAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkKLQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvL01ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KW87Ci0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpbzsKLQkJLy8gRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8gPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWludCB0eXBlID0gZ2V0SW50VHlwZShkaWFncmFtVHlwZSk7Ci0JCWlmICh0eXBlIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG51bGw7Ci0KLQkJLy8ga2VlcCB0aGUgZGlydHkgZmxhZyBhbmQgcmVzZXQgYmFjayB0byBhdm9pZCBtYWtlIHRoZSBsaWJyYXJ5IGRpcnR5Ci0JCWJvb2xlYW4gZGlydHlGbGFnID0gZS5lUmVzb3VyY2UoKS5pc01vZGlmaWVkKCk7Ci0KLQkJdHJ5IHsKLQkJCWlmICggaGFzVXNlckRlZmluZWREaWFncmFtKChBY3Rpdml0eSllLCBpbWdQYXRoLCBkaWFncmFtVHlwZSkgKQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQotCi0JCQkvLyBmaXJzdCBjaGVjayBpZiB3ZSBuZWVkIHRvIGdlbmVyYXRlIHRoZSBkaWFncmFtIG9yIG5vdAotCQkJLy8gaWYgdGhlIGRpYWdyYW0gaXMgc3VwcmVzc2VkLCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtCi0JCQkvLyBkb24ndCBjcmVhdGUgdGhlIGRpYWdyYW0gaWYgaXQncyBub3QgdGhlcmUsCi0JCQkvLyBpZCB0aGUgZGlhZ3JhbSBkb2VzIG5vdCBleGlzdCwgaXQncyBzdXByZXNzZWQKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBkID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGUsIHR5cGUsIGZhbHNlKTsKLQotCQkJLy8gQWxsb3cgdGhlIG9wdGlvbiB0byBwdWJsaXNoICd1bmNyZWF0ZWQnIGRpYWdyYW1zCi0JCQkvLyBieSBkZWZhdWx0LCB1bmNyZWF0ZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHdpbGwgYmUgcHVibGlzaGVkLAotCQkJLy8gdW5jcmVhdGVkIGRpYWdyYW1zIG9mIG90aGVyIHR5cGVzIHdpbGwgbm90IGJlIHB1Ymxpc2hlZAotCQkJYm9vbGVhbiBleGlzdCA9IChkICE9IG51bGwpOwotCQkJaWYgKGV4aXN0KSB7Ci0JCQkJaWYgKGQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJCXJldHVybjsKLQkJCQkKLQkJCQkvLyBJZiBhbiBleHRlbnNpb24gaGFzIGl0cyBvd24gZGlhZ3JhbS4gQmFzZSBpcyByZXBsYWNlZCBvciBjb250cmlidXRlZC4gCi0JCQkJLy8gZXh0ZW5zaW9uIGRpYWdyYW0gc2hvd3MgcmVhbGl6ZWQgZWxlbWVudCBpbiB1bmRlZmluZWQgbG9jYXRpb24uIAotCQkJCS8vIEluIHB1Ymxpc2hpbmcgZG9uJ3QgZGlzcGxheSBleHRlbnNpb24gZGlhZ3JhbSBldmVuIGlmIGl0IGhhcyBpdHMgb3duCi0JCQkJLy8gZGlhZ3JhbSBpZiByZWFsaXplZCBlbGVtZW50cyBhcmUgY29taW5nIGluIHRocm91Z2ggdmFyaWFiaWxpdHkuCi0JCQkJaWYodHlwZSA9PSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU0gJiYKLQkJCQkJCWNoZWNrVmFyaWFiaWxpdHkoZSwgZmlsdGVyLHR5cGUpICE9IG51bGwpewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQkKLQkJCX1lbHNlewotCQkJCQotCQkJCWlmKCh0eXBlID09IEdyYXBoaWNhbERhdGFIZWxwZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkpCi0JCQkJCXJldHVybjsKLQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIHVuIG9wZW5lZCBleHRlbnNpb24gcHVibGlzaC4KLQkJCQlpZih0eXBlID09IEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfRElBR1JBTSl7Ci0JCQkJCS8vIElmIG9wdGlvbiBpcyBub3QgY2hlY2tlZCwgZG9uJ3QgZ2VuZXJhdGUgYSBkaWFncmFtCi0JCQkJCWlmKCFwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbikgcmV0dXJuOwotCQkJCQkKLQkJCQkJLy9JZiBleHRlbnNpb24gaXMgbW9kaWZpZWQgZG9uJ3QgZ2VuZXJhdGUgaXQuCi0JCQkJCWlmKCFlLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZEJhc2UgPSBjaGVja1ZhcmlhYmlsaXR5KGUsIGZpbHRlciwgdHlwZSk7Ci0JCQkJCWlmKGNhbGN1bGF0ZWRCYXNlID09IG51bGwpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQkKLQkJCQkJCi0JCQkJCXdyYXBwZXIgPSBjYWxjdWxhdGVkQmFzZTsKLQkJCQkJZSA9IChBY3Rpdml0eSljYWxjdWxhdGVkQmFzZTsKLQkJCQkJZXhpc3QgPSB0cnVlOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAocHVibGlzaFVuY3JlYXRlZEFERCA9PSBmYWxzZSAmJiB0eXBlID09IEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pewotCQkJCQlib29sZWFuIGNvbnRyaWJ1dG9yZXhpc3QgPSBmYWxzZTsKLQkJCQkJLy8gVGhpcyBpcyBuZWVkLCBpZiBjb250cmlidXRvciBoYXMgYSBBREQgZGlhZ3JhLCBiYXNlIGRvbid0IAotCQkJCQkvLyBiYXNlIHNob3VsZCBnZW5lcmF0ZSBBREQgaW4gYnJvd3NpbmcuCi0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJCQkJY29uZmlnID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJfQotCQkJCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0KLQkJCQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCQkJCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQkJCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQkJCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQlpZihpdGVyYXRvciAhPSBudWxsKXsKLQkJCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpewotCQkJCQkJCQlPYmplY3QgYWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihhY3QgIT0gbnVsbCl7Ci0JCQkJCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZHggPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkuZ2V0VU1BRGlhZ3JhbSgoQWN0aXZpdHkpIGFjdCwgdHlwZSwgZmFsc2UpOwotCQkJCQkJCQkJaWYoZHggIT0gbnVsbCl7ICAgCi0JCQkJCQkJCQkJY29udHJpYnV0b3JleGlzdCA9IHRydWU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoIWNvbnRyaWJ1dG9yZXhpc3QpCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJdmlld2VyID0gZ2V0RGlhZ3JhbVZpZXdlcih0eXBlKTsKLQkJCQl2aWV3ZXIubG9hZERpYWdyYW0od3JhcHBlciwgIWV4aXN0LCBmaWx0ZXIsIHN1cCk7Ci0JCQkJZGlhZ3JhbUluZm8gPSB2aWV3ZXIuZ2V0RGlhZ3JhbUluZm8oKTsKLQkJCQlpZiAoZGlhZ3JhbUluZm8gIT0gbnVsbCAmJiAhZGlhZ3JhbUluZm8uaXNFbXB0eSgpKSB7Ci0JCQkJCWltYWdlID0gdmlld2VyLmNyZWF0ZURpYWdyYW1JbWFnZSgpOwotCQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQkJLy8gc2F2ZSB0aGUgaW1hZ2UKLQkJCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHB1YkRpciwgaW1nUGF0aCk7Ci0KLQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBjcmVhdGVkIG90aGVyd2lzZSBleGNlcHRpb24KLQkJCQkJCUZpbGUgcGFyZW50ID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkgewotCQkJCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKLQkJCQkJCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJCQkJbG9hZGVyLmRhdGEgPSBuZXcgSW1hZ2VEYXRhW10geyBpbWFnZS5nZXRJbWFnZURhdGEoKSB9OwotCQkJCQkJbG9hZGVyLnNhdmUob3MsIFNXVC5JTUFHRV9KUEVHKTsKLQotCQkJCQkJZGlhZ3JhbUluZm8uc2V0SW1hZ2VGaWxlUGF0aChpbWdQYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGNyZWF0ZSBkaWFncmFtIGltYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZTEpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQkJLy8gZGVsZXRlIHRoZSBuZXdseSBjcmVhdGVkIGRpYWdyYW0gZnJvbSB0aGUgbGlicmFyeQotCQkJaWYgKCFleGlzdCkgewotCQkJCWQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCQkoQWN0aXZpdHkpIGUsIHR5cGUsIGZhbHNlKTsKLQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZCk7Ci0JCQkJfQotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCi0JCQkJLy8gcmVzdG9yZSB0aGUgZGlydHkgZmxhZwotCQkJCWUuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQoZGlydHlGbGFnKTsKLQotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQl2aWV3ZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlMSkgewotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGNoZWNrVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJaW50IHR5cGUpIHsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEdldCBhbGwgQ29udHJpYnV0b3JzIGZyb20gcGFyZW50IGNoYWluIGFuZCBjb250cmlidXRvciBjaGFpbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnQgZS4KLQkJVmFyaWFiaWxpdHlJbmZvIGVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IGVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUFjdGl2aXR5IHJlcGxhY2VyID0gKEFjdGl2aXR5KSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKHZlLAotCQkJCWNvbmZpZyk7Ci0JCWlmIChyZXBsYWNlciAhPSBudWxsKSB7Ci0JCQl2ZSA9IHJlcGxhY2VyOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHJlcGxhY2VyRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0ocmVwbGFjZXIsIHR5cGUsIGZhbHNlKTsKLQkJCWlmIChyZXBsYWNlckRpYWdyYW0gIT0gbnVsbCkgewotCQkJCS8vYW55UmVwbGFjZXIuYWRkKHJlcGxhY2VyKTsKLQkJCQlyZXR1cm4gcmVwbGFjZXI7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGJhc2VEaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIKLQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSB2ZSwgdHlwZSwgZmFsc2UpOwotCQkJaWYgKGJhc2VEaWFncmFtICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBDaGVjayBmaXJzdCBpZiBiYXNlRGlhZ3JhbSBpcyBzdXBwcmVzc2VkLgotCQkJCWlmIChiYXNlRGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgPT0gdHJ1ZSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJLy8gRmluZCB0aGUgY29udHJpYnV0b3JzIG9mIEJhc2UKLQkJCQlWYXJpYWJpbGl0eUluZm8gdmVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgdmUpOwotCQkJCUxpc3QgdmVDb250cmlidXRvcnMgPSB2ZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycy5zaXplKCkgIT0gdmVDb250cmlidXRvcnMuc2l6ZSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIXZlQ29udHJpYnV0b3JzLmNvbnRhaW5zKG5leHQpKSB7Ci0JCQkJCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmU7Ci0JCQkJCi0JCQl9ZWxzZXsKLQkJCQkvLyBJZiBubyBiYXNlIGRpYWdyYW0sIGNoZWNrIGJhc2Ugb2YgYmFzZSBoYWQgYW55IGRpYWdyYW0uCi0JCQkJcmV0dXJuIGNoZWNrVmFyaWFiaWxpdHkodmUsIGZpbHRlciwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbmNyZWF0ZWRBREQgPSBmbGFnOwotCX0KLQkvKioKLQkgKiBTZXQgdGhlIHdpbmRvdydzIHByZWZlcmVuY2UgYXR0cmlidXRlIGZvciBBY2l0aXZ5dCBEaWFncmFtCi0JICogCi0JICovCi0JCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBmbGFnKXsKLQkJdGhpcy5wdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZsYWc7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldFJlYWxpemVkRm9yVW5tb2RpZmllZChPYmplY3QgYWN0aXZpdHksIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQkvLyBEb2VzIG5vdGhpbmcsIGp1c3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmExNWU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9BY3Rpdml0eURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5BY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHkgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbVZpZXdlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURpYWdyYW1FZGl0UGFydEZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHlEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCQlkaWFncmFtLnNldEZpbHRlcihmaWx0ZXIpOwotCQlpZiAoc3VwICE9IG51bGwpIHsKLQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJfQotCi0JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9XUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkN2E5OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy9nZWYvdmlld2VyL1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuV1BEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBXUCBEZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHsKLQotCXB1YmxpYyBXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJZGlhZ3JhbS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaWYgKHN1cCAhPSBudWxsKSB7Ci0JCQlkaWFncmFtLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCX0KLQotCQlkaWFncmFtLnNldE9iamVjdChlKTsKLQkJRWRpdFBhcnQgcGFydCA9IG5ldyBEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL2dlZi92aWV3ZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTJlMzI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvZ2VmL3ZpZXdlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBncmFwaGljYWwgdmlld2VycyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW1zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nUGVyc3BlY3RpdmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0M2RjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1BlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0NvbmZpZ3VyYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLk5ld1BsdWdpbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5XaXphcmRDYXRlZ29yaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGxhY2Vob2xkZXJGb2xkZXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jb25zb2xlLklDb25zb2xlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZFJlZ2lzdHJ5OwotCi0vKioKLSAqIFRoZSBNZXRob2QgQXV0aG9yaW5nIHBlcnNwZWN0aXZlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIEF1dGhvcmluZyBwZXJzcGVjdGl2ZSBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTUEVDVElWRV9JRCA9IEF1dGhvcmluZ1BlcnNwZWN0aXZlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IG5ld1dpemFyZFNob3J0Y3V0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJbmV3V2l6YXJkU2hvcnRjdXRzLmFkZChOZXdMaWJyYXJ5V2l6YXJkLldJWkFSRF9JRCk7Ci0JCW5ld1dpemFyZFNob3J0Y3V0cy5hZGQoTmV3UGx1Z2luV2l6YXJkLldJWkFSRF9JRCk7Ci0JCW5ld1dpemFyZFNob3J0Y3V0cy5hZGQoTmV3Q29uZmlndXJhdGlvbldpemFyZC5XSVpBUkRfSUQpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoaXMgcGVyc3BlY3RpdmUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJldmlvdXNseSBhY3RpdmUgcGVyc3BlY3RpdmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb3BlbigpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUGVyc3BlY3RpdmVSZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldFBlcnNwZWN0aXZlUmVnaXN0cnkoKTsKLQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb2xkUGVyc3BlY3RpdmUgPSBhY3RpdmVQYWdlLmdldFBlcnNwZWN0aXZlKCk7Ci0JCQlpZiAoIW9sZFBlcnNwZWN0aXZlLmdldElkKCkuZXF1YWxzKFBFUlNQRUNUSVZFX0lEKSkgewotCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUgPSByZWdpc3RyeQotCQkJCQkJLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChQRVJTUEVDVElWRV9JRCk7Ci0JCQkJYWN0aXZlUGFnZS5zZXRQZXJzcGVjdGl2ZShwZXJzcGVjdGl2ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gb2xkUGVyc3BlY3RpdmU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKHRydWUpOwotCQlTdHJpbmcgZWRpdG9yQXJlYSA9IGxheW91dC5nZXRFZGl0b3JBcmVhKCk7Ci0JCUlGb2xkZXJMYXlvdXQgdG9wTGVmdEZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoInRvcExlZnQiLCAvLyROT04tTkxTLTEkCi0JCQkJSVBhZ2VMYXlvdXQuTEVGVCwgMC4zMGYsIGVkaXRvckFyZWEpOwotCi0JCUlGb2xkZXJMYXlvdXQgYm90dG9tTGVmdEZvbGRlciA9IGxheW91dC5jcmVhdGVGb2xkZXIoImJvdHRvbUxlZnQiLCAvLyROT04tTkxTLTEkCi0JCQkJSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjUwZiwgInRvcExlZnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRvcExlZnRGb2xkZXIuYWRkVmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsKLQkJYm90dG9tTGVmdEZvbGRlci5hZGRWaWV3KENvbmZpZ3VyYXRpb25WaWV3LlZJRVdfSUQpOwotCi0JCUlQbGFjZWhvbGRlckZvbGRlckxheW91dCBvdXRwdXRGb2xkZXIgPSBsYXlvdXQuY3JlYXRlUGxhY2Vob2xkZXJGb2xkZXIoCi0JCQkJImJvdHRvbSIsIElQYWdlTGF5b3V0LkJPVFRPTSwgMC42NWYsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihOZXdTZWFyY2hVSS5TRUFSQ0hfVklFV19JRCk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJQ29uc29sZUNvbnN0YW50cy5JRF9DT05TT0xFX1ZJRVcpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQkJb3V0cHV0Rm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQcm9ncmVzc0NvbnN0YW50cy5QUk9HUkVTU19WSUVXX0lEKTsKLQotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoTmV3TGlicmFyeVdpemFyZC5XSVpBUkRfSUQpOwotCQlsYXlvdXQuYWRkTmV3V2l6YXJkU2hvcnRjdXQoTmV3UGx1Z2luV2l6YXJkLldJWkFSRF9JRCk7Ci0JCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dChOZXdDb25maWd1cmF0aW9uV2l6YXJkLldJWkFSRF9JRCk7Ci0KLQkJSVdpemFyZFJlZ2lzdHJ5IG5ld1dpemFyZFJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXROZXdXaXphcmRSZWdpc3RyeSgpOwotCQlJV2l6YXJkQ2F0ZWdvcnkgbmV3V2l6YXJkQ2F0ZWdvcnkgPSBuZXdXaXphcmRSZWdpc3RyeQotCQkJCS5maW5kQ2F0ZWdvcnkoV2l6YXJkQ2F0ZWdvcmllcy5ORVdfV0laQVJEU19DQVRFR09SWSk7Ci0JCUlXaXphcmREZXNjcmlwdG9yW10gd2l6YXJkRGVzY3JpcHRvcnMgPSBuZXdXaXphcmRDYXRlZ29yeS5nZXRXaXphcmRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2l6YXJkRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlXaXphcmREZXNjcmlwdG9yIHdpemFyZERlc2NyaXB0b3IgPSB3aXphcmREZXNjcmlwdG9yc1tpXTsKLQkJCVN0cmluZyB3aXphcmRJZCA9IHdpemFyZERlc2NyaXB0b3IuZ2V0SWQoKTsKLQkJCWlmICghbmV3V2l6YXJkU2hvcnRjdXRzLmNvbnRhaW5zKHdpemFyZElkKSkgewotCQkJCWxheW91dC5hZGROZXdXaXphcmRTaG9ydGN1dCh3aXphcmRJZCk7Ci0JCQl9Ci0JCX0KLQotCQlQZXJzcGVjdGl2ZUxpc3RVdGlsLmFkZFBlcnNwZWN0aXZlU2hvcnRMaXN0KGxheW91dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSGVscENvbnRleHRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSGVscENvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNDNkNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUhlbHBDb250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLS8qKgotICogQXV0aG9yaW5nIFVJIGhlbHAgY29udGV4dHMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdVSUhlbHBDb250ZXh0cyB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUk9PVF9DT05URVhUID0gQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRklMRV9ORVdfTElCUkFSWV9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX25ld19saWJyYXJ5X2NvbnRleHQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCUZJTEVfTkVXX1BMVUdJTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX25ld19wbHVnaW5fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlGSUxFX05FV19DT05GSUdVUkFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZpbGVfbmV3X2NvbmZpZ3VyYXRpb25fY29udGV4dCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX09QRU5fTElCUkFSWV9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX29wZW5fbGlicmFyeV9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX09QRU5fQ09ORklHVVJBVElPTl9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmaWxlX29wZW5fY29uZmlndXJhdGlvbl9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGSUxFX0lNUE9SVF9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZpbGVfaW1wb3J0X2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZJTEVfRVhQT1JUX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZmlsZV9leHBvcnRfY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgTElCUkFSWV9OQVZJR0FUT1JfVklFV19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJsaWJyYXJ5X25hdmlnYXRvcl92aWV3X2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09ORklHVVJBVElPTl9WSUVXX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fdmlld19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIFBMVUdJTl9FRElUT1JfREVTQ1JJUFRJT05fQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgInBsdWdpbl9lZGl0b3JfZGVzY3JpcHRpb25fYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbmZpZ3VyYXRpb25fZWRpdG9yX2FsbF9jb250ZXh0IjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIENPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImNvbnRlbnRfcGFja2FnZV9lZGl0b3JfYWxsX2NvbnRleHQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1JPTEVfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3Jfcm9sZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1RBU0tfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfdGFza19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1dPUktfUFJPRFVDVF9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl93b3JrX3Byb2R1Y3RfY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9HVUlEQU5DRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9ndWlkYW5jZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RJU0NJUExJTkVfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZGlzY2lwbGluZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RJU0NJUExJTkVfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RPTUFJTl9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9kb21haW5fY29udGV4dF9oZWxwX0lEIjsgLy8kTk9OLU5MUy0xJCAgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9XT1JLX1BST0RVQ1RfVFlQRV9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl93b3JrX3Byb2R1Y3RfdHlwZV9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1JPTEVfU0VUX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3JvbGVfc2V0X2NvbnRleHRfaGVscF9JRCI7IC8vJE5PTi1OTFMtMSQgIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfUk9MU0VfU0VUX0dST1VQSU5HX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX3JvbHNlX3NldF9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkICAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX1RPT0xfQ09OVEVYVF9IRUxQX0lEID0gUk9PVF9DT05URVhUICsgICJlZGl0b3JfdG9vbF9jb250ZXh0X2hlbHBfSUQiOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBFRElUT1JfQ1VTVE9NX0NBVEVHT1JZX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0X2hlbHBfSUQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fR0VORVJBTF9DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fREVUQUlMX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2RldGFpbF9jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX05PVEFUSU9OX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQiICA7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfREVTQ1JJUFRJT05fVEFJTE9SSU5HX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX1ZFUlNJT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fdmVyc2lvbl9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0VMRU1FTlRfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0RFU0NSSVBUSU9OX0lDT05fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25faWNvbl9jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEVESVRPUl9DUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQgPSBST09UX0NPTlRFWFQgKyAgImVkaXRvcl9jcF9kZXNjcmlwdGlvbl9jb250ZXh0X2hlbHBfSUQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRURJVE9SX0RQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCA9IFJPT1RfQ09OVEVYVCArICAiZWRpdG9yX2RwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCIgOyAvLyROT04tTkxTLTEkIAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX1dCU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJmb3JtX2VkaXRvcl9wcm9jZXNzX3dic19jb250ZXh0IiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1BST0NFU1NfT0JTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAgImZvcm1fZWRpdG9yX3Byb2Nlc3Nfb2JzX2NvbnRleHQiIDsgLy8kTk9OLU5MUy0xJCAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyAgRk9STV9FRElUT1JfUFJPQ0VTU19QQlNfQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICAiZm9ybV9lZGl0b3JfcHJvY2Vzc19wYnNfY29udGV4dCIgIDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBGT1JNX0VESVRPUl9QUk9DRVNTX0FMTEJTX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyAiZm9ybV9lZGl0b3JfcHJvY2Vzc19hbGxic19jb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nICBDT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUID0gUk9PVF9DT05URVhUICsgICJjb25maWd1cmF0aW9uX3B1Ymxpc2hfd2l6YXJkX2FsbF9wYWdlc19jb250ZXh0IiA7IC8vJE5PTi1OTFMtMSQgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIFJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCA9IFJPT1RfQ09OVEVYVCArICAicmljaF90ZXh0X2VkaXRvcl9jb250ZXh0X0lEIiAgOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0FDVElWSVRZX0RJQUdSQU1fQ09OVEVYVCA9IFJPT1RfQ09OVEVYVCArICJmb3JtX2VkaXRvcl9hY3Rpdml0eV9kaWFncmFtX2NvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0NPTlRFWFQgPSBST09UX0NPTlRFWFQgKyJmb3JtX2VkaXRvcl9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbV9jb250ZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIEZPUk1fRURJVE9SX1dQX0RFUEVOREVOQ1lfRElBR1JBTV9DT05URVhUID0gUk9PVF9DT05URVhUICsgImZvcm1fZWRpdG9yX3dwX2RlcGVuZGVuY3lfZGlhZ3JhbV9jb250ZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgIExJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEID0gUk9PVF9DT05URVhUICsgImxpYnJhcnlfdmlld19ub2RlX2NvbnRleHRfbm90X2ltcGxlbWVudGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nICBMQVlPVVRfRkxBVF9BQ1RJT04gPSBST09UX0NPTlRFWFQgKyAibGF5b3V0X2ZsYXRfYWN0aW9uIjsgCSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgIExBWU9VVF9ISUVSQVJDSElDQUxfQUNUSU9OID0gUk9PVF9DT05URVhUICsgImxheW91dF9oaWVyYXJjaGljYWxfYWN0aW9uIjsgCSAvLyROT04tTkxTLTEkCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYmJiOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBpbiB0aGUgQXV0aG9yaW5nIFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJSW1hZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0NPTExBUFNFRCA9ICJmdWxsL29iajE2L0NvbGxhcHNlZC5naWYiOyAvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0VYUEFOREVEID0gImZ1bGwvb2JqMTYvRXhwYW5kZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfUkVGUkVTSCA9ICJmdWxsL2V0b29sMTYvUmVmcmVzaC5naWYiOyAvLyROT04tTkxTLTEkIAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX1NUT1AgPSAiZnVsbC9ldG9vbDE2L1N0b3AuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX05BTUVfUFJJTlQgPSAiZnVsbC9ldG9vbDE2L1ByaW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfTkFNRV9PVlJfRVJST1IgPSAiZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0xBWU9VVF9GTEFUID0gImZ1bGwvZXRvb2wxNi9mbGF0TGF5b3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19OQU1FX0xBWU9VVF9ISUVSQVJDSElDQUwgPSAiZnVsbC9ldG9vbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT0xMQVBTRUQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfQ09MTEFQU0VEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0VYUEFOREVEID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX0VYUEFOREVEKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1JFRlJFU0ggPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfUkVGUkVTSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVE9QID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19OQU1FX1NUT1ApOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUFJJTlQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfUFJJTlQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09WUl9FUlJPUiA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcihJTUdfTkFNRV9PVlJfRVJST1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfTEFZT1VUX0ZMQVQgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfTEFZT1VUX0ZMQVQpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0xBWU9VVF9ISUVSQVJDSElDQUwgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19CQUNLID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQkFDSyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT0xMQVBTRUQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9DT0xMQVBTRUQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRVhQQU5ERUQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9FWFBBTkRFRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19GT1JXQVJEID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfRk9SV0FSRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19SRUZSRVNIID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfUkVGUkVTSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVE9QID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfU1RPUCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUklOVCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFNoYXJlZEltYWdlKElNR19OQU1FX1BSSU5UKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19PVlJfRVJST1IgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9PVlJfRVJST1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfTEFZT1VUX0ZMQVQgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfTkFNRV9MQVlPVVRfRkxBVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19MQVlPVVRfSElFUkFSQ0hJQ0FMID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX05BTUVfTEFZT1VUX0hJRVJBUkNISUNBTCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExMWNmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLlByb2JsZW1NYXJrZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuTGlicmFyeVZpZXdQcmVmUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBBdXRob3JpbmcgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQXV0aG9yaW5nVUlQbHVnaW4gcGx1Z2luOwotCi0JcHJpdmF0ZSBQcm9ibGVtTWFya2VyTWFuYWdlciBmUHJvYmxlbU1hcmtlck1hbmFnZXI7Ci0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBdXRob3JpbmdVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCQotCQkvLyBJbml0aWFsaXplIHRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLQkJQXV0aG9yaW5nVUlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChjb250ZXh0KTsKLQkJCi0JCUxpYnJhcnlWaWV3UHJlZlBhZ2UuaW5pdERlZmF1bHRzKGdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBBdXRob3JpbmdVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIFByb2JsZW1NYXJrZXJNYW5hZ2VyIGdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkgewotCQlpZiAoZlByb2JsZW1NYXJrZXJNYW5hZ2VyID09IG51bGwpCi0JCQlmUHJvYmxlbU1hcmtlck1hbmFnZXI9IG5ldyBQcm9ibGVtTWFya2VyTWFuYWdlcigpOwotCQlyZXR1cm4gZlByb2JsZW1NYXJrZXJNYW5hZ2VyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSBpbnRlcm5hbEdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnk9IG5ldyBJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpOwotCQlyZXR1cm4gZkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0KSB7Ci0JCWdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcih0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0F1dGhvcmluZ1VJUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmYwODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBBdXRob2luZyBVSSByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEF1dGhvcmluZ1VJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQXV0aG9yaW5nVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXNzaWduQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfaW5jbHVkZUVsZW1lbnRzT2ZUeXBlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuYXNzaWduQWN0aW9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhc3NpZ25BY3Rpb25fdGV4dDsKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19OYXZpZ2F0aW9uVmlld3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhc3NpZ25QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcmllc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NhcmR1bnJlc29sdmVkcmVmOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbUV4cGxhbmF0aW9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RpYWdyYW1GaWxlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldmlld1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRDcmVhdGVOZXdEaWFncmFtRmlsZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHREZWxldGVDdXN0b21DYXRlZ29yeUJlZm9yZVJlbW92ZUxhc3RSZWZUb0l0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmZXJlbmNlc1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZVdvcmtmbG93UGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0c1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1zU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcGVuZGVuY2llc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlcGVuZGVuY2llc1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGFpbFNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYWxJbmZvU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vdGF0aW9uU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhZmZpbmdTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFmZmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzU2VjdGlvbl9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RlcHNTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWlsb3JpbmdTZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eVNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkluZm9TZWN0aW9uX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZGl0aW9uYWxJbmZvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBsaWNhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uTGFiZWxfZWRpdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhbHRlcm5hdGl2ZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzc2lnbm1lbnRBcHByb2FjaGVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdXRob3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrZ3JvdW5kX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZUd1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicmllZkRlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwYmVmb3Jlc2F2ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJpZWZPdXRsaW5lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VEYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udHJpYnV0ZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsQ29udHJpYnV0ZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRyaWJ1dGVzX3RvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5cmlnaHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5kX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlcm5hbERlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlcm5hbElkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnb2Fsc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbHNPZkFkb3B0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWluRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0VsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vdEFwcGxpY2FibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vdGF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlc2VudGF0aW9uTmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvbXB0Zm9ybGliYXJ5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmFibGVIZWFsdGhDaGVja190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvYmxlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVycG9zZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhc29uRm9yTm90TmVlZGluZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsUmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNSZXBsYWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXByZXNlbnRhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0YWNoZWRGaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBza2lsbHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwc19uYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdG9wX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3lub255bXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZXBDb3B5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYWNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdfcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZUlkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0YWNoQnV0dG9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXR0YWNoVXJsQnV0dG9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2VUeXBlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXRhY2hCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1fc2F2ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG93bkJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcmRlckJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlQXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzZWxlY3RCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlRGVmYXVsdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hpc3RvcnlCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVUYXNrc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlVGFza3NQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlR3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUd1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX21vZGlmeV9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1JvbGVzUGFnZV9jb25maXJtX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrR3VpZGFuY2VQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZW1vdmVVbnJlc29sdmVkUmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVzb2x2ZU1pc3NpbmdSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX0F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdF9UYXNrc19NdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Um9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbDM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVRhc2tzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2VfYXZhaWxhYmxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbkVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld1BsdWdpbkVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZExpYnJhcnlHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFBhdGhMYWJlbF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZGVsaW5nR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VySW50ZXJmYWNlR3JvdXBfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWJ1Z0dyb3VwX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQcmVmZXJlbmNlSGlzdG9yeVNpemVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2FybmluZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0RGVmYXVsdENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdFByb2Nlc3NFbGVtZW50RXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub09wZW5MaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQ29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlQ29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUHJlc2VudGF0aW9uTmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5Db25maWdXaXphcmRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnRlcm5hbEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZVVwZ3JhZGVkTGlicmFyeUVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5pbmdMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkaW5nTGlicmFyeUVsZW1lbnRzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmluZ0ZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4aW5nQ29udGVudERlc2NyaXB0aW9uR1VJRHNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ0ludmFsaWRSZWZlcmVuY2VzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkRWRpdG9yVG9QZXJzcGVjdGl2ZVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hhbmdlSGlzdG9yeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybURlbGV0ZURpYWxvZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfbm9vcGVubGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9sb2FkaW5nbGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1zZ19yZWxvYWRMaWJyYXJ5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVsb2FkRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWxvYWREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFsb2dzX01vdmVEaWFsb2dfZXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX2NvbmZpZ3VyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV92aWV3czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbnNlbGVjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9yZW1vdmVWaWV3QnV0dG9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRpb25UYWJHdWlkYW5jZVdhcm5pbmdEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hhbmdlQWN0aXZpdHlUeXBlV2FybmluZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kRWxlbWVudERlc2NyaXB0aW9uRW1wdHlOYW1lRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9jb25maXJtUmVuYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2xvY2tQbHVnaW5MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25NZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3SGVscGVySGVhbHRoQ2hlY2tEaWFsb2dfbWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUVsZW1lbnREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGxnVGl0bGVfcmVsb2FkTGlicmFyeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVDb25maWdFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfY2hhbmdlQm91bmRzQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jaGFuZ2VOYW1lQ29tbWFuZF91bmRvTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jaGFuZ2VQcm9wZXJ0eVZhbHVlQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NyZWF0ZUxpbmtDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2NyZWF0ZU5vZGVDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX2RlbGV0ZUJlbmRwb2ludENvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZWZfZGVsZXRlQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9kZWxldGVMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl9yZWNvbm5lY3RMaW5rQ29tbWFuZF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl92YWxpZGF0aW5nRGlyZWN0RWRpdE1hbmFnZXJfYnJpbmdEb3duUHJvbXB0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VmX3ZhbGlkYXRpbmdGcmVlVGV4dEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlZl93b3JrUHJvZHVjdE5vZGVFZGl0UGFydF92YWxpZGF0ZU1lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpb25zX0VsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbl9tZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yTWVzc2FnZTE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW5hbWVFcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEVsZW1lbnREaWFsb2dfc2VsZWN0ZWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZV9lZGl0X3RleHQwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0Rlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X21pZ3JhdGlvbl9kaXJfZGxnX2Rlc2NyaXB0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX0RlZmF1bHRMaWJyYXJ5RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVmYXVsdEJyaWVmRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfR3VpZGFuY2VXaXRoQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9yZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeUVycm9yX3JlYXNvbjI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5RXJyb3JfcmVhc29uMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0xpYnJhcnlFcnJvcl9hZHZpY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0V4dGVybmFsSUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1B1cnBvc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1Njb3BlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Vc2FnZU5vdGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19BbHRlcm5hdGl2ZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0hvd1RvU3RhZmY7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0tleUNvbnNpZGVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1NjYWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SaXNrTGV2ZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1Byb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1R5cGVPZkNvbnRyYWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yd2FyZEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yd2FyZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RvcEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3bmFtZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvcl9tZW51OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TZWxlY3Rpb25QYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BhcmVudFBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTGlzdFBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVHJlZVBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfVGFibGVQYWdlX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfT2JqZWN0Q29sdW1uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NlbGZDb2x1bW5fbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTm9PYmplY3RTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9TaW5nbGVPYmplY3RTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NdWx0aU9iamVjdFNlbGVjdGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09wZW5FZGl0b3JFcnJvcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XaXphcmRfY2F0ZWdvcnk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kTW9kZWxXaXphcmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kTW9kZWxXaXphcmRfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kRWRpdG9yX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRGVmYXVsdEJhc2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVFeHRlbnNpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV2l6YXJkX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1dBUk5fRmlsZW5hbWVFeHRlbnNpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTW9kZWxPYmplY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWE1MRW5jb2Rpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWE1MRW5jb2RpbmdDaG9pY2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9GaWxlQ29uZmxpY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5rRGlhbG9nX2xpbmtUeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpbmtDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGVpZ2h0TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpZHRoTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18yMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18yMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18yMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18zNTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld18zNjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsdFRhZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbWFnZVNpemVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfSW5kZXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1ByZWRlY2Vzc29yczsKLQotCS8vIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX1NlbGVjdGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX01vZGVsSW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUHJlZml4OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZURpYWxvZ19tb3ZlX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNzaWduRGlhbG9nX2Fzc2lnbl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFzc2lnbkRpYWxvZ19yZWFzc2lnbl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFzc2lnbkRpYWxvZ19kZWVwY29wcHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNrbGlzdE9yZGVyX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9SZXBldGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX09uZ29pbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TeW5jaHJvbml6YXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfT3B0aW9uYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfVHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0V4cGFuZEFsbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfbW92aW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25XYXJuaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9BYnN0cmFjdE5ld0xpYnJhcnlQYWdlX05hbWVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdMaWJyYXJ5V2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeVBhdGhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeVR5cGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9PcGVuQ29uZmlndXJhdGlvbk1haW5QYWdlX3BhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X3JlcGxhY2Vpbmd3aXRoZm9ybWF0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlTGFiZWxQcm92aWRlcl91bnNlbGVjdGVkcGFja2FnZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbkVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RlcHNPcmRlckRpYWxvZ19zdGVwczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX1BsYW5uZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzcGVjaWZ5ZGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX011bHRpcGxlT2NjdXJyZW5jZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0V4aXRTdGF0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbHVtbnN0b0FkZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UZWFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkNoZWF0c2hlZXRWaWV3X3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbFVwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlVXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0luZGVudDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PdXRkZW50OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOwotCi0JLy8gcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfc2VsZWN0ZWRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXNzYWdlVmlld19lcnJtc2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19lcnJfc2F2aW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyX2NvcHlpbmdfZmlsZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jb3B5aW5nX2ZpbGVfZXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJfY29weWluZ19maWxlX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0Q29uZmlndXJhdGlvbl90b29sdGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaG9vc2VEZWZhdWx0RGlyZWN0b3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0Fzc2lnblVzZXJEaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYWRkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfd3BkSW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfbm90YUZpbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ191c2VBREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFEREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1JlcGxhY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfYWN0aW9uX2RlZXBDb3B5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9oaWRlVG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfQWRkQ2F0ZWdvcmllc1RpdGxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9TdWJDYXRlZ29yaWVzVGl0bGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0xvYWRpbmdNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGljazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV91cGRhdGVPbkNsaWNrVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9ub1VwZGF0ZU9uQ2xpY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2Vfbm9VcGRhdGVPbkNsaWNrVG9vbFRpcDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfY2Fubm90TW9kaWZ5RGVzdGluYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxBbGw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQmFzZUFjdGl2aXR5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NGb3JtRWRpdG9yX2NvbGxhcHNlQWxsQWN0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9TZWxlY3RDb2x1bW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9Db2x1bW5TZWxlY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2Vfc3dpdGNoQ29uZmlndXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2VfaW5oZXJpdFN1cHByZXNzaW9uU3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfU2VsZWN0QnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9JbnNlcnROZXdQaGFzZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZpZXdIZWxwZXJfcmVsb2FkTGliT25Sb2xsYmFja0Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmlld0hlbHBlcl9hbHJlYWR5ZGVsZXRlZGNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0FkZE1pc3NpbmdUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25HZW5lcmFsSW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FwcGx5UGF0dGVybjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfbm9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZUxhYmVsUHJvdmlkZXJfZXJyY2hpbGRwa2dzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfU3VwcHJlc3NEaWFsb2dfTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYXZlQXN3aXRoZG90c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfZGVmYXVsdFN5bmNocm9uaXphdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0xpYnJhcnlEaWFsb2dfbmV3bGlicmFyeV9hczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1BsdWdpbkRpYWxvZ19uZXdwbHVnaW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEVsZW1lbnREaWFsb2dfdGl0bGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5Db25maWdEaWFsb2duZXdjb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZV9CU0VkaXRvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9hbGlnbk1lbnVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlbW9kZWxsaWJyYXJ5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVfbGlicmFyeV9wcm9ibGVtX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb25fZGVsZXRlY29uZmlybV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfQ29udGVudEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfQnJvd3NlQnV0dG9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9TaG93RXJyb3JUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfY3JlYXRlRnJlZVRleHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yQ2hvb3Nlcl9SZXNvdXJjZXNFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRGVzY3JpcHRpb25OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RWRpdG9yX2Vycl9zYXZlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfZXJyZWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvblBhZ2VfQ29uZmlnQ29udGVudERlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGlyZWN0b3J5TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cmlidXRpb25TZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbUVkaXRvcl9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQQ29tcGFydG1lbnRGaWd1cmVfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdQcm9jZXNzVmlld0RpYWxvZ19OYW1lUGF0dGVybjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfUGF0dGVybjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdQcm9jZXNzVmlld0RpYWxvZ19DYXRlZ29yeVR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWdQcm9jZXNzVmlld0RpYWxvZ19CcmllZkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfU2VsZWN0Q2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWF0c2hlZXRfbG9hZF9mYWlsdXJlX2xvZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UGx1Z2luV2l6YXJkX2NyZWF0ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfbW92ZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVQbHVnaW5OYW1lRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkQURJbWFnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFEREltYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkV1BESW1hZ2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBREltYWdlSW5QdWJsaXNoaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVN1cHByZXNzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5VmlldzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV9jb25maWdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX25hbWVfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJlc2VudGF0aW9uTmFtZV9sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9icmllZkRlc2NfbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2RpbHZlZFBhcnRzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzeW5jaHJvbml6YXRpb25XaXphcmRfdGl0bGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfZXhwbGFpblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuUlRFOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2xvc2VSVEU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVhc3NldF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0KLQkvLyBOZXcgU3RyaW5nIFNlY3Rpb24gRGVzY3JpcHRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF90YWlsb3JpbmdTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9ub3RhdGlvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrcHJvZHVjdHR5cGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya3Byb2R1Y3R0eXBlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrbGlzdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhhbXBsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGFtcGxlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3VhYmxlYXNzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXN1YWJsZWFzc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdWFibGVhc3NldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdtYXRlcmlhbF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sbWVudG9yX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXNjaXBsaW5lZ3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZWdyb3VwaW5nX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X2RldGFpbFNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbWNhdGVnb3J5X0ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25jZXB0X2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlYXNzZXRfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9ydF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJhY3RpY2VfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9hZG1hcF9pY29uU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdF9saXN0X2xlbmd0aF9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZF9zZW1hbnRpY3NfYnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRfc2VtYW50aWNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9QcmVmZXJlbmNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzX1Rhc2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxfVGFzazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExheW91dEFjdGlvbkdyb3VwX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGF5b3V0QWN0aW9uR3JvdXBfZmxhdExheW91dEFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExheW91dEFjdGlvbkdyb3VwX2hpZXJhcmNoaWNhbExheW91dEFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VfV29ya0JyZWFrZG93bkVsZW1lbnRzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJlZmVyZW5jZV9EZXNjcmlwdG9yRWxlbWVudHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX2JyZWFrRG93bkVsZW1lbnRfRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX0FjdGl2aXR5X0RpYWdyYW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmVmZXJlbmNlX0FjdGl2aXR5X0RldGFpbF9EaWFncmFtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvblBhZ2VfUXVpY2tmaXhFcnJvcl9yZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlndXJhdGlvblBhZ2VfcXVpY2tmaXhFcnJvcl90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0TGlua1R5cGVQcmVmTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybXNfR3VpZGFuY2VXaXRoVXJsQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRhY2htZW50RGlhbG9nYXR0YWNoVXJsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGVfbWV0aG9kX2xpYnJhcnk7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZUNhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrQ2F0ZWdvcmllc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGx1Z2luX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGx1Z2luX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtwcm9kdWN0RGVzY3JpcHRpb25QYWdlX3Nsb3RfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzbG90U2VjdGlvbl9uYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNsb3RTZWN0aW9uX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2xvdHNMYWJlbF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3Nsb3RTZWN0aW9uX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZV9zbG90U2VjdGlvbl9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfc2xvdFNlY3Rpb25fZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzbG90Q29uZmlybURpYWxvZ190aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3cEZ1bEZpbGxzQ29uZmlybURpYWxvZ19tZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdwU2xvdEZ1bEZpbGxzQ29uZmlybURpYWxvZ19tZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ1Byb2JsZW1WaWV3T3B0aW9uc1RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGlkZUVycm9zVGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoaWRlV2FybmluZ3NUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGhpZGVJbmZvc1RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBBdXRob3JpbmdVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NzA1MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5EZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLlByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBBdXRob3JpbmcgVUkgc2VydmljZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0aG9yaW5nVUlTZXJ2aWNlIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQXV0aG9yaW5nVUlTZXJ2aWNlIGluc3RhbmNlID0gbmV3IEF1dGhvcmluZ1VJU2VydmljZSgpOwotCi0JLy8gVGhlIHN0YXR1cyBmbGFnLgotCXByaXZhdGUgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQXV0aG9yaW5nVUlTZXJ2aWNlKCkgewotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9CQkJCi0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCQlzdGFydCgpOwotCQkJCX0KLQkJCQlMaWJyYXJ5VUlVdGlsLnVwZGF0ZVNoZWxsVGl0bGUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJfQkJCQotCQl9KTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEF1dGhvcmluZ1VJU2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgQXV0aG9yaW5nIFVJIHNlcnZpY2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQlpZiAoIXN0YXJ0ZWQpIHsJCi0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hcHBseURlZmF1bHRWYWx1ZXNGb3JCcmVha2Rvd25FbGVtZW50QXR0cmlidXRlcygpOwotCi0JCQkvLyBJbml0aWFsaXplIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IKLQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UuZ2V0Q2xhc3MoKTsKLQkJCQotCQkJLy8gU2V0IGNvbmZpZ3VyYXRvciBmb3IgV0JTIGFkYXB0ZXIgZmFjdG9yeSBpZiBpdCdzIG5vdCBzZXQgeWV0Ci0JCQlpZihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCUNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlpZihhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKSA9PSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEluaXRpYWxpemUgdGhlIG1vdmUvcGFzdGUgY29tbWFuZC4KLQkJCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kCi0JCQkJCS5zZXRSZXNvdXJjZU1hbmFnZXIobmV3IENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24oKSk7Ci0KLQkJCS8vIEluaXRpYWxpemUgdGhlIEVkaXRvckNob29zZXIuCi0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCk7Ci0KLQkJCS8vIExvYWQgRWRpdG9yUGFnZSBQcm92aWRlcnMKLQkJCURlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmdldEluc3RhbmNlKCkubG9hZFByb3ZpZGVycygpOwotCi0JCQkvLyBTZXQgcHJvdmlkZXJzIGZvciBsaWJyYXJ5IGVkaXQuCi0JCQlQcm92aWRlcnMuc2V0Q29uZmlndXJhdG9yRmFjdG9yeShuZXcgSUNvbmZpZ3VyYXRvckZhY3RvcnkoKSB7Ci0JCQkJcHVibGljIElDb25maWd1cmF0b3IgY3JlYXRlQ29uZmlndXJhdG9yKAotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCQkJcmV0dXJuIG5ldyBQcm9jZXNzQ29uZmlndXJhdG9yKGNvbmZpZywgdHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCVByb3ZpZGVycwotCQkJCQkuc2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IobmV3IENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkpOwotCi0JCQlQcm92aWRlcnMuc2V0UHJlZmVyZW5jZVN0b3JlKExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0KLQkJCVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBuZXcgUHJlZmVyZW5jZVN0b3JlV3JhcHBlcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQkJUHJvdmlkZXJzLnNldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZShzdG9yZSk7Ci0KLQkJCUxpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4gY21kTGlzdGVuZXJzID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycygpOwotCQkJY21kTGlzdGVuZXJzLmFkZEFsbChEaWFncmFtRWRpdG9yVXRpbC5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRWYXJ5Q29tbWFuZExpc3RlbmVycygpKTsKLQkJCWZvciAoSXRlcmF0b3I8SUNvbW1hbmRMaXN0ZW5lcj4gaXRlciA9IGNtZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJUHJvdmlkZXJzLnJlZ2lzdGVyQ29tbWFuZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnN0YXJ0KCk7Ci0JCQkKLQkJCXN0YXJ0ZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcHMgdGhlIEF1dGhvcmluZyBVSSBzZXJ2aWNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlpZiAoc3RhcnRlZCkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnN0b3AoKTsJCQkKLQkJCXN0YXJ0ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvQXV0aG9yaW5nVUlUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTMyZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9BdXRob3JpbmdVSVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLQotLyoqCi0gKiBEZWZpbmVzIGFuZCBjYWNoZXMgdGhlIGNvbW1vbmx5IHJlZmVyZW5jZWQgdGV4dCBpbiB0aGUgQXV0aG9yaW5nIFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJVGV4dCB7Ci0KLQkvKioKLQkgKiBFZGl0b3IgZm9ybSBwYWdlIHRpdGxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NJR05fUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFzc2lnblBhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUklFU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2F0ZWdvcmllc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUkFCTEVfUEFSVFNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlUGFydHNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORVNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRV9QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGFuY2VQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVZJRVdfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByZXZpZXdQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRVNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZXNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9XT1JLRkxPV19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmZXJlbmNlV29ya2Zsb3dQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9TRVRTX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0c1BhZ2VfdGl0bGU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUFNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzUGFnZV90aXRsZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza3NQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SU19QQUdFX1RJVExFID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbE1lbnRvcnNQYWdlX3RpdGxlOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVFNfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0c1BhZ2VfdGl0bGU7IAotCi0JLyoqCi0JICogRWRpdG9yIHNlY3Rpb24gbmFtZXMgYW5kIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0lURU1TX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrSXRlbXNTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfSVRFTVNfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tJdGVtc1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVBFTkRFTkNJRVNfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ0lFU19TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXBlbmRlbmNpZXNTZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVUQUlMX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRldGFpbFNlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVRBSUxfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGV0YWlsU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfSU5GT19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nZW5lcmFsSW5mb1NlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFMX0lORk9fU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5pY29uU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuaWNvblNlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RhdGlvblNlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RhdGlvblNlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9QTFVHSU5TX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZmVyZW5jZWRQbHVnaW5zU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUZGSU5HX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0YWZmaW5nU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQUZGSU5HX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0YWZmaW5nU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURVBTX1NFQ1RJT05fTkFNRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzU2VjdGlvbl9uYW1lOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNURVBTX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzU2VjdGlvbl9kZXNjOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBSUxPUklOR19TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy50YWlsb3JpbmdTZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFJTE9SSU5HX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhaWxvcmluZ1NlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9TRUNUSU9OX05BTUUgPSBBdXRob3JpbmdVSVJlc291cmNlcy52YXJpYWJpbGl0eVNlY3Rpb25fbmFtZTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9TRUNUSU9OX0RFU0MgPSBBdXRob3JpbmdVSVJlc291cmNlcy52YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0lORk9fU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmVyc2lvbkluZm9TZWN0aW9uX25hbWU7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9JTkZPX1NFQ1RJT05fREVTQyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNMT1RfU0VDVElPTl9OQU1FID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2xvdFNlY3Rpb25fbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNMT1RfU0VDVElPTl9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2xvdFNlY3Rpb25fZGVzYzsKLQkvKioKLQkgKiBVSSBhbmQgZWxlbWVudCBhdHRyaWJ1dGUgbGFiZWxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERElUSU9OQUxfSU5GT19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkaXRpb25hbEluZm9fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbGljYXRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFsdGVybmF0aXZlc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdXRob3JzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFja2dyb3VuZF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRUxFTUVOVF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmFzZUVsZW1lbnRfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX0dVSURBTkNFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iYXNlR3VpZGFuY2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYnJpZWZEZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX09VVExJTkVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJyaWVmT3V0bGluZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9EQVRFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VEYXRlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VEZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0lURU1TX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja0l0ZW1zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVURVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbnRyaWJ1dGVzX3RleHQ7IAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7ICAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weXJpZ2h0X3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVE9SX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVybmFsRGVzY3JpcHRpb25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9JRF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZXJuYWxJZF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPQUxTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5nb2Fsc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5pbXBhY3RPZk5vdEhhdmluZ190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05TSURFUkFUSU9OU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMua2V5Q29uc2lkZXJhdGlvbnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9PRl9BRE9QVElPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubGV2ZWxzT2ZBZG9wdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1haW5EZXNjcmlwdGlvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5hbWVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRUxFTUVOVF9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3RWxlbWVudF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9BUFBMSUNBQkxFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5ub3RBcHBsaWNhYmxlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vdGF0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHSU5HX0dVSURBTkNFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wYWNrYWdpbmdHdWlkYW5jZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFTlRBVElPTl9OQU1FX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmVzZW50YXRpb25OYW1lX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvYmxlbV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnB1cnBvc2VfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05fRk9SX05PVF9ORUVESU5HX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWFzb25Gb3JOb3ROZWVkaW5nX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcGxhY2VzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcHJlc2VudGF0aW9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwcmVzZW50YXRpb25PcHRpb25zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJTExTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5za2lsbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RlcHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQX05BTUVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN0ZXBzX25hbWVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWU5PTllNU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3lub255bXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hFRF9GSUxFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hdHRhY2hlZEZpbGVfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy50eXBlX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JUVVFX0lEX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy51bmlxdWVJZF90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUklBQklMSVRZX1RZUEVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZhcmlhYmlsaXR5VHlwZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnZlcnNpb25fdGV4dDsgCi0KLQkvKioKLQkgKiBCdXR0b24gbGFiZWxzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVEFDSF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaEJ1dHRvbl90ZXh0OyAKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hfVVJMX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXR0YWNoVXJsQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUk9XU0VfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfVFlQRV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoYW5nZVR5cGVCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUl9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsZWFyQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTRUxFQ1RfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNlbGVjdEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFDSF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRldGFjaEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05fQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb3duQnV0dG9uX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5vcmRlckJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0QnV0dG9uX3RleHQ7IAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbW92ZUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9CVVRUT05fVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNlbGVjdEJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQX0JVVFRPTl9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudXBCdXR0b25fdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0hJU1RPUllfQlVUVE9OX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy52aWV3SGlzdG9yeUJ1dHRvbl90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMV0FZU19CVVRUT05fVEVYVCA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVkVSX0JVVFRPTl9URVhUID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9NUFRfQlVUVE9OX1RFWFQgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NBVEVHT1JJRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0OwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9Ccm93c2luZ1BlcnNwZWN0aXZlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0Jyb3dzaW5nUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzYWEzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL0Jyb3dzaW5nUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29udGVudFZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIE1ldGhvZCBCcm93c2luZyBwZXJzcGVjdGl2ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2luZ1BlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgcGVyc3BlY3RpdmUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfSUQgPSBCcm93c2luZ1BlcnNwZWN0aXZlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5I2NyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJbGF5b3V0LnNldEVkaXRvckFyZWFWaXNpYmxlKGZhbHNlKTsKLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCQlsYXlvdXQuYWRkVmlldyhDb25maWd1cmF0aW9uVmlldy5WSUVXX0lELCBJUGFnZUxheW91dC5MRUZULCAwLjMwZiwKLQkJCQllZGl0b3JBcmVhKTsKLQkJUGVyc3BlY3RpdmVMaXN0VXRpbC5hZGRQZXJzcGVjdGl2ZVNob3J0TGlzdChsYXlvdXQpOwotCQlsYXlvdXQuYWRkVmlldyhDb250ZW50Vmlldy5WSUVXX0lELCBJUGFnZUxheW91dC5SSUdIVCwgMC43MGYsIGVkaXRvckFyZWEpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoaXMgcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW4oKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQkJCWlmICh3aW5kb3dzICE9IG51bGwgJiYgd2luZG93cy5sZW5ndGggPiAwKSB7Ci0JCQkJCXdpbmRvdyA9IHdpbmRvd3NbMF07Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnNob3dQZXJzcGVjdGl2ZShQRVJTUEVDVElWRV9JRCwKLQkJCQkJCXdpbmRvdyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJGYWlsZWQgdG8gb3BlbiBicm93c2luZyBwZXJzcGVjdGl2ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUGVyc3BlY3RpdmVMaXN0VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9QZXJzcGVjdGl2ZUxpc3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmODgwYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9QZXJzcGVjdGl2ZUxpc3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzcGVjdGl2ZUxpc3RVdGlsIHsKLQotCS8qKgotCSAqIEFkZCB0aGUgQnJvd3NpbmcgYW5kIEF1dGhvcmluZyBwZXJzcGVjdGl2ZSBzaG9ydGN1dHMgdG8gdGhlIGdpdmVuIHBhZ2UKLQkgKiBsYXlvdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBlcnNwZWN0aXZlU2hvcnRMaXN0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQlsYXlvdXQuYWRkUGVyc3BlY3RpdmVTaG9ydGN1dChCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJbGF5b3V0LmFkZFBlcnNwZWN0aXZlU2hvcnRjdXQoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgaXMgdGhlIEF1dGhvcmluZwotCSAqIHBlcnNwZWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkgewotCQlTdHJpbmcgYWN0aXZlUGVyc3BlY3RpdmVJZCA9IFBlcnNwZWN0aXZlVXRpbC5nZXRBY3RpdmVQZXJzcGVjdGl2ZUlkKCk7Ci0JCWlmIChhY3RpdmVQZXJzcGVjdGl2ZUlkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBhY3RpdmVQZXJzcGVjdGl2ZUlkCi0JCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgaXMgdGhlIEJyb3dzaW5nCi0JICogcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQnJvd3NpbmdQZXJzcGVjdGl2ZSgpIHsKLQkJU3RyaW5nIGFjdGl2ZVBlcnNwZWN0aXZlSWQgPSBQZXJzcGVjdGl2ZVV0aWwuZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpOwotCQlpZiAoYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gYWN0aXZlUGVyc3BlY3RpdmVJZAotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOGJlMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLUNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyPXwKLQotI0JlbG93IHByb3BlcnR5ICJlZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMiIHNob3VsZCBub3QgYmUgdHJhbnNsYXRlZAotI0Rvbid0IGRlbGV0ZSBhIHNwYWNlIGFmdGVyICI6ICIKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLWVkaXRvcl90aXRsZV9jb2xvbl93aXRoX3NwYWNlcz06IAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEZvcm0gUGFnZSBUaXRsZXMKLWFzc2lnblBhZ2VfdGl0bGU9QXNzaWduCi1jYXRlZ29yaWVzUGFnZV90aXRsZT1DYXRlZ29yaWVzCi1kZWxpdmVyYWJsZVBhcnRzUGFnZV90aXRsZT1EZWxpdmVyYWJsZSBQYXJ0cwotZGVzY3JpcHRpb25QYWdlX3RpdGxlPURlc2NyaXB0aW9uCi1kaXNjaXBsaW5lc1BhZ2VfdGl0bGU9RGlzY2lwbGluZXMKLWRpc2NhcmR1bnJlc29sdmVkcmVmPURpc2NhcmQgdW5yZXNvbHZlZCByZWZlcmVuY2VzCi1ndWlkYW5jZVBhZ2VfdGl0bGU9R3VpZGFuY2UKLXByZXZpZXdQYWdlX3RpdGxlPVByZXZpZXcKLXJlZmVyZW5jZXNQYWdlX3RpdGxlPVJlZmVyZW5jZXMKLXJlZmVyZW5jZV90ZXh0PVJlZmVyZW5jZXM6Ci1yZWZlcmVuY2VXb3JrZmxvd1BhZ2VfdGl0bGU9UmVmZXJlbmNlIFdvcmtmbG93Ci1yb2xlc1BhZ2VfdGl0bGU9Um9sZXMKLXJvbGVTZXRzUGFnZV90aXRsZT1Sb2xlIFNldHMKLXN0ZXBzUGFnZV90aXRsZT1TdGVwcwotdGFza3NQYWdlX3RpdGxlPVRhc2tzCi10b29sTWVudG9yc1BhZ2VfdGl0bGU9VG9vbCBNZW50b3JzCi13b3JrUHJvZHVjdHNQYWdlX3RpdGxlPVdvcmsgUHJvZHVjdHMKLQotIyBTZWN0aW9uIE5hbWVzICYgRGVzY3JpcHRpb24KLWNoZWNrSXRlbXNTZWN0aW9uX25hbWU9Q2hlY2sgSXRlbXMKLWNoZWNrSXRlbXNTZWN0aW9uX2Rlc2M9U3BlY2lmeSB0aGUgY2hlY2sgaXRlbXMgdGhhdCBjb25zdGl0dXRlIHRoaXMgY2hlY2tsaXN0LgotZGVwZW5kZW5jaWVzU2VjdGlvbl9uYW1lPURlcGVuZGVuY2llcwotZGVwZW5kZW5jaWVzU2VjdGlvbl9kZXNjPVRoaXMgc2VjdGlvbiBkaXNwbGF5cyBkZXBlbmRlbmNpZXMgb2YgdGhpcyBjb250ZW50IHBhY2thZ2UgdG8gb3RoZXIgY29udGVudCBwYWNrYWdlcy4KLWRldGFpbFNlY3Rpb25fbmFtZT1EZXRhaWwgSW5mb3JtYXRpb24KLWRldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotZ2VuZXJhbEluZm9TZWN0aW9uX25hbWU9R2VuZXJhbCBJbmZvcm1hdGlvbgotZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgezB9LgotaWNvblNlY3Rpb25fbmFtZT1JY29uCi1pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgezB9Lgotbm90YXRpb25TZWN0aW9uX25hbWU9RGVsaXZlcnkgSW5mb3JtYXRpb24KLW5vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi1yZWZlcmVuY2VkUGx1Z2luc1NlY3Rpb25fbmFtZT1SZWZlcmVuY2VkIFBsdWctaW5zOgotcmVmZXJlbmNlZFBsdWdpbnNTZWN0aW9uX2Rlc2M9VGhpcyBzZWN0aW9uIGRpc3BsYXlzIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgdGhpcyBtZXRob2QgcGx1Zy1pbi4KLXN0YWZmaW5nU2VjdGlvbl9uYW1lPVN0YWZmaW5nIEluZm9ybWF0aW9uCi1zdGFmZmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHN0YWZmaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLXN0ZXBzU2VjdGlvbl9uYW1lPVN0ZXBzCi1zdGVwc1NlY3Rpb25fZGVzYz1TcGVjaWZ5IHRoZSBzdGVwcyB0byBwZXJmb3JtIHRoaXMgdGFzay4KLXRhaWxvcmluZ1NlY3Rpb25fbmFtZT1UYWlsb3JpbmcKLXRhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHRhaWxvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLXZhcmlhYmlsaXR5U2VjdGlvbl9uYW1lPUNvbnRlbnQgVmFyaWFiaWxpdHkKLXZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgezB9IHJlbGF0ZXMgdG8gYW5vdGhlciB7MH0uCi12ZXJzaW9uSW5mb1NlY3Rpb25fbmFtZT1WZXJzaW9uIEluZm9ybWF0aW9uCi12ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB7MH0uCi0KLSMgVUkgJiBFbGVtZW50IEF0dHJpYnV0ZSBMYWJlbHMKLWFkZGl0aW9uYWxJbmZvX3RleHQ9QWRkaXRpb25hbCBpbmZvcm1hdGlvbjoKLWFwcGxpY2F0aW9uX3RleHQ9QXBwbGljYXRpb246Ci1hY3Rpb25MYWJlbF9lZGl0PSZFZGl0Ci1hY3Rpb25MYWJlbF9maW5kRWxlbWVudEluTGliTmF2PSZTaG93IGluIExpYnJhcnkgVmlldwotYWx0ZXJuYXRpdmVzX3RleHQ9QWx0ZXJuYXRpdmVzOgotYXNzaWdubWVudEFwcHJvYWNoZXNfdGV4dD1Bc3NpZ25tZW50IGFwcHJvYWNoZXM6Ci1hdXRob3JzX3RleHQ9QXV0aG9yczoKLWJhY2tncm91bmRfdGV4dD1CYWNrZ3JvdW5kOgotYmFzZUVsZW1lbnRfdGV4dD1CYXNlOgotYmFzZUd1aWRhbmNlX3RleHQ9QmFzZSBndWlkYW5jZToKLWJyaWVmRGVzY3JpcHRpb25fdGV4dD1CcmllZiBkZXNjcmlwdGlvbjoKLWRlc2NyaXB0aW9uX3RleHQ9RGVzY3JpcHRpb246Ci1iYWNrdXBiZWZvcmVzYXZlX3RleHQ9QmFjayB1cCBiZWZvcmUgc2F2ZQotYnJpZWZPdXRsaW5lX3RleHQ9QnJpZWYgb3V0bGluZToKLWNoYW5nZURhdGVfdGV4dD1DaGFuZ2UgZGF0ZToKLWNoYW5nZURlc2NyaXB0aW9uX3RleHQ9Q2hhbmdlIGRlc2NyaXB0aW9uOgotY2hlY2tJdGVtc190ZXh0PUNoZWNrIEl0ZW1zCi1jb250cmlidXRlc190ZXh0PUNvbnRyaWJ1dGVzCi1sb2NhbENvbnRyaWJ1dGVzX3RleHQ9TG9jYWxDb250cmlidXRlcwotY29udHJpYnV0ZXNfdG9fdGV4dD1Db250cmlidXRlcyB0bwotY29weXJpZ2h0X3RleHQ9Q29weXJpZ2h0OgotZWRpdG9yX3RleHQ9RWRpdG9yCi1leHRlbmRzX3RleHQ9RXh0ZW5kcwotZXh0ZW5kX3RleHQ9RXh0ZW5kCi1leHRlcm5hbERlc2NyaXB0aW9uX3RleHQ9RXh0ZXJuYWwgZGVzY3JpcHRpb246Ci1leHRlcm5hbElkX3RleHQ9RXh0ZXJuYWwgSUQ6Ci1nb2Fsc190ZXh0PUdvYWxzOgotaW1wYWN0T2ZOb3RIYXZpbmdfdGV4dD1JbXBhY3Qgb2Ygbm90IGhhdmluZzoKLWtleUNvbnNpZGVyYXRpb25zX3RleHQ9S2V5IGNvbnNpZGVyYXRpb25zOgotbGV2ZWxzT2ZBZG9wdGlvbl90ZXh0PUxldmVsIG9mIGFkb3B0aW9uOgotbWFpbkRlc2NyaXB0aW9uX3RleHQ9TWFpbiBkZXNjcmlwdGlvbjoKLW5ld0VsZW1lbnRfdGV4dD1OZXcgezB9Ci1uYW1lX3RleHQ9TmFtZToKLW5vdEFwcGxpY2FibGVfdGV4dD1Ob3QgYXBwbGljYWJsZQotcGFja2FnaW5nR3VpZGFuY2VfdGV4dD1QYWNrYWdpbmcgZ3VpZGFuY2U6Ci1wcmVzZW50YXRpb25OYW1lX3RleHQ9UHJlc2VudGF0aW9uIG5hbWU6Ci1wcm9tcHRmb3JsaWJhcnlfdGV4dD1Qcm9tcHQgZm9yIG1ldGhvZCBsaWJyYXJ5IG9uIHN0YXJ0dXAKLWVuYWJsZUhlYWx0aENoZWNrX3RleHQ9RW5hYmxlIGludGVybmFsIGRlYnVnIHRvb2xzCi1ub3RhdGlvbl90ZXh0PU5vdGF0aW9uOgotcHJvYmxlbV90ZXh0PVByb2JsZW06Ci1wdXJwb3NlX3RleHQ9UHVycG9zZToKLXJlYXNvbkZvck5vdE5lZWRpbmdfdGV4dD1SZWFzb24gZm9yIG5vdCBuZWVkaW5nOgotcmVwbGFjZXNfdGV4dD1SZXBsYWNlcwotbG9jYWxSZXBsYWNlc190ZXh0PUxvY2FsUmVwbGFjZXMKLWV4dGVuZHNSZXBsYWNlc190ZXh0PUV4dGVuZHMgYW5kIFJlcGxhY2VzCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNfdGV4dD1SZXByZXNlbnRhdGlvbiBvcHRpb25zOgotcmVwcmVzZW50YXRpb25fdGV4dD1TZWxlY3RlZCByZXByZXNlbnRhdGlvbjoKLWF0dGFjaGVkRmlsZV90ZXh0PUF0dGFjaGVkIGZpbGUocykvVVJMKHMpOgotc2tpbGxzX3RleHQ9U2tpbGxzOgotc3RlcHNfdGV4dD1TdGVwczoKLXN0ZXBzX25hbWVfdGV4dD1OYW1lOgotc3RvcF90ZXh0PVN0b3AKLXByaW50X3RleHQ9UHJpbnQKLXN5bm9ueW1zX3RleHQ9U3lub255bXM6Ci10eXBlX3RleHQ9VHlwZToKLWNvcHlfdGV4dD1Db3B5Ci1kZWVwQ29weV90ZXh0PURlZXAgQ29weQotYmFja190ZXh0PUJhY2sKLW5ld19wbHVnaW49TmUmdyBNZXRob2QgUGx1Zy1pbgotbW92ZT0mTW92ZS4uLgotdW5pcXVlSWRfdGV4dD1VbmlxdWUgSUQ6Ci12YXJpYWJpbGl0eVR5cGVfdGV4dD1WYXJpYWJpbGl0eSB0eXBlOgotdmVyc2lvbl90ZXh0PVZlcnNpb246Ci0KLSMgQnV0dG9uIExhYmVscwotYWRkQnV0dG9uX3RleHQ9QWRkLi4uCi1hdHRhY2hCdXR0b25fdGV4dD1BdHRhY2ggRmlsZS4uLgotYXR0YWNoVXJsQnV0dG9uX3RleHQ9QXR0YWNoIFVybC4uLgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi1jaGFuZ2VUeXBlQnV0dG9uX3RleHQ9Q2hhbmdlIFR5cGUuLi4KLWNsZWFyQnV0dG9uX3RleHQ9Q2xlYXIKLWRlbGV0ZUJ1dHRvbl90ZXh0PURlbGV0ZQotZGV0YWNoQnV0dG9uX3RleHQ9RGV0YWNoCi1kaWFncmFtX3NhdmVFcnJvcj1FcnJvciBzYXZpbmcgZGlhZ3JhbQotZG93bkJ1dHRvbl90ZXh0PURvd24KLWRpcmVjdG9yeV90ZXh0PURpcmVjdG9yeToKLW9yZGVyQnV0dG9uX3RleHQ9T3JkZXIKLWVkaXRCdXR0b25fdGV4dD1FZGl0Li4uCi1yZW1vdmVCdXR0b25fdGV4dD1SZW1vdmUKLXJlbmFtZUFjdGlvbl90ZXh0PVJlbiZhbWUuLi4KLWFzc2lnbkFjdGlvbl90ZXh0PUFzc2lnbi4uLgotdW5hc3NpZ25BY3Rpb25fdGV4dD1VbmFzc2lnbgotcmVhc3NpZ25BY3Rpb25fdGV4dD1SZWFzc2lnbi4uLgotZGVlcENvcHlBY3Rpb25fdGV4dD1EZWVwIENvcHkuLi4KLXJlbW92ZV90ZXh0PVJlbW92ZQotcmVuYW1lX3RleHQ9UmVuYW1lCi1TYXZlQXNfdGV4dD1TYXZlIEFzCi1zZWxlY3RCdXR0b25fdGV4dD1TZWxlY3QuLi4KLWRlc2VsZWN0QnV0dG9uX3RleHQ9RGVzZWxlY3QKLXVwQnV0dG9uX3RleHQ9VXAKLW1ha2VEZWZhdWx0QnV0dG9uX3RleHQ9TWFrZSBEZWZhdWx0Ci12aWV3SGlzdG9yeUJ1dHRvbl90ZXh0PVZpZXcgSGlzdG9yeS4uLgotCi0jIFJvbGUgRWRpdG9yIFRhc2tzIFBhZ2UKLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU9VGFza3MKLXJvbGVUYXNrc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBpcyB0aGUgcGVyZm9ybWVyIG9mIHRoZSBmb2xsb3dpbmcgdGFza3MuCi1yb2xlVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0YXNrcwotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsPVByaW1hcnkgcGVyZm9ybWVyOgotcm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsMj1BZGRpdGlvbmFsIHBlcmZvcm1lcjoKLXJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdGFza3MgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotcm9sZVdvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbk5hbWU9V29yayBQcm9kdWN0czoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHdvcmsgcHJvZHVjdHMgdGhhdCB0aGlzIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yLgotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHdvcmsgcHJvZHVjdHM6Ci1yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsPVJlc3BvbnNpYmxlIGZvcjoKLXJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyPVdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgb3V0cHV0IG9mIHRhc2tzIHRoYXQgdGhpcyByb2xlIHBlcmZvcm1zOgotcm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gd29yayBwcm9kdWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBFZGl0b3IgR3VpZGFuY2UgUGFnZQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYW5jZQotcm9sZUd1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGd1aWRhbmNlLgotcm9sZUd1aWRhbmNlUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgR3VpZGFuY2U6Ci1yb2xlR3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGFuY2U6Ci1yb2xlR3VpZGFuY2VQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGd1aWRhbmNlIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBSb2xlIEVkaXRvciBDYXRlZ29yaWVzIFBhZ2UKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZT1DYXRlZ29yaWVzOgotcm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyByb2xlIGJlbG9uZ3MuCi1yb2xlQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWw9Um9sZSBTZXRzOgotcm9sZUNhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1DdXN0b20gQ2F0ZWdvcmllczoKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGUgc2V0czoKLXJvbGVDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DdXN0b20gY2F0ZWdvcmllczoKLXJvbGVDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjYXRlZ29yaWVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBUYXNrIEVkaXRvciBSb2xlcyBQYWdlCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzCi10YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1Bc3NpZ24gdGhlIHJvbGVzIHRvIHBlcmZvcm0gdGhpcyB0YXNrLgotdGFza1JvbGVzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgcm9sZXM6Ci10YXNrUm9sZXNQYWdlX3NlbGVjdGVkTGFiZWw9UHJpbWFyeSBwZXJmb3JtZXJzOgotdGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1BZGRpdGlvbmFsIHBlcmZvcm1lcnM6Ci10YXNrUm9sZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHJvbGVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLXRhc2tSb2xlc1BhZ2VfcHJpbWFyeVBlcmZvcm1lcl9tb2RpZnlfbWVzc2FnZT1JVVBBMDAwNDVXOiBEbyB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHByaW1hcnkgcGVyZm9ybWVyIHRvICcnezB9Jyc/Ci10YXNrUm9sZXNQYWdlX2NvbmZpcm1fdGl0bGU9Q29uZmlybSBwcmltYXJ5IHJvbGUgY2hhbmdlCi0KLSMgVGFzayBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Xb3JrIFByb2R1Y3RzCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzIGZvciB0aGlzIHRhc2suCi10YXNrV29ya1Byb2R1Y3RzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgV29yayBQcm9kdWN0cwotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbD1NYW5kYXRvcnkgaW5wdXRzOgotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDI9T3B0aW9uYWwgaW5wdXRzOgotdGFza1dvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9T3V0cHV0czoKLXRhc2tXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IHdvcmsgcHJvZHVjdHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFRhc2sgRWRpdG9yIEd1aWRhbmNlIFBhZ2UKLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLXRhc2tHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLXRhc2tHdWlkYW5jZVBhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIEd1aWRhbmNlOgotdGFza0d1aWRhbmNlUGFnZV9zZWxlY3RlZExhYmVsPUd1aWRhbmNlOgotdGFza0d1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFRhc2sgRWRpdG9yIENhdGVnb3JpZXMgUGFnZQotdGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpZXMKLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdGFzayBiZWxvbmdzLgotdGFza0NhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsPURpc2NpcGxpbmVzCi10YXNrQ2F0ZWdvcmllc1BhZ2VfYXZhaWxhYmxlTGFiZWwyPUN1c3RvbSBDYXRlZ29yaWVzCi10YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1EaXNjaXBsaW5lczoKLXRhc2tDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMj1DdXN0b20gY2F0ZWdvcmllczoKLXRhc2tDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBjYXRlZ29yaWVzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBXb3JrIFByb2R1Y3QgRWRpdG9yIFRhc2tzIFBhZ2UKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlY3Rpb25OYW1lPVRhc2tzCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb249VGhpcyB3b3JrIHByb2R1Y3QgaXMgYW4gaW5wdXQgb3Igb3V0cHV0IGZvciB0aGUgZm9sbG93aW5nIHRhc2tzLgotV29ya1Byb2R1Y3RfVGFza3NfQXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHRhc2tzCi1Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsPU1hbmRhdG9yeSBpbnB1dDoKLVdvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyPU9wdGlvbmFsIGlucHV0OgotV29ya1Byb2R1Y3RfVGFza3NfU2VsZWN0ZWRMYWJlbDM9T3V0cHV0OgotV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdGFza3MgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgUm9sZXMgUGFnZQotd29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU9Um9sZXMKLXdvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1UaGUgZm9sbG93aW5nIHJvbGVzIGFyZSByZXNwb25zaWJsZSBmb3Igb3IgbW9kaWZ5IHRoaXMgd29yayBwcm9kdWN0Lgotd29ya1Byb2R1Y3RSb2xlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHJvbGVzCi13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsPVJlc3BvbnNpYmxlIHJvbGU6Ci13b3JrUHJvZHVjdFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsMj1Nb2RpZnlpbmcgcm9sZXM6Ci13b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSByb2xlcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMjIFdvcmsgUHJvZHVjdCBFZGl0b3IgRGVsaXZlcmFibGUgUGFydHMgUGFnZQotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uTmFtZT1EZWxpdmVyYWJsZSBQYXJ0cwotd29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGNvbnN0aXR1dGUgdGhpcyBkZWxpdmVyYWJsZS4KLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHdvcmsgcHJvZHVjdHMgYXMgZGVsaXZlcmFibGUgcGFydHM6Ci13b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlbGVjdGVkTGFiZWw9V29yayBwcm9kdWN0cyBhcyBkZWxpdmVyYWJsZSBwYXJ0czoKLXdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gd29yayBwcm9kdWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgV29yayBQcm9kdWN0IEVkaXRvciBHdWlkYW5jZSBQYWdlCi13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9zZWN0aW9uTmFtZT1HdWlkYW5jZQotd29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBHdWlkYW5jZToKLXdvcmtQcm9kdWN0R3VpZGFuY2VQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGFuY2U6Ci13b3JrUHJvZHVjdEd1aWRhbmNlUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBndWlkYW5jZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFdvcmsgUHJvZHVjdCBFZGl0b3IgQ2F0ZWdvcmllcyBQYWdlCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlY3Rpb25OYW1lPUNhdGVnb3JpZXMKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHdvcmsgcHJvZHVjdCBiZWxvbmdzLgotd29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9hdmFpbGFibGVMYWJlbD1Eb21haW5zCi13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMj1Xb3JrIFByb2R1Y3QgS2luZHM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX2F2YWlsYWJsZUxhYmVsMz1DdXN0b20gQ2F0ZWdvcmllczoKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Eb21haW46Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwyPVdvcmsgcHJvZHVjdCBraW5kczoKLXdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDM9Q3VzdG9tIGNhdGVnb3JpZXM6Ci13b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IGNhdGVnb3JpZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFByYWN0aWNlIEVkaXRvciBSZWZlcmVuY2VzIFBhZ2UKLXByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9Q29udGVudCBFbGVtZW50cwotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgY29udGVudCBlbGVtZW50cyByZWZlcmVuY2VkIGJ5IHRoaXMgcHJhY3RpY2UuCi1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBjb250ZW50IGVsZW1lbnRzOgotcHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsPUNvbnRlbnQgZWxlbWVudHM6Ci1wcmFjdGljZVJlZmVyZW5jZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IENvbnRlbnQgZWxlbWVudHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIENhdGVnb3J5IEVkaXRvciBHdWlkYW5jZSBQYWdlCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VjdGlvbk5hbWU9R3VpZGFuY2UKLWNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB7MH0uCi1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIGd1aWRhbmNlOgotY2F0ZWdvcnlHdWlkYW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw9R3VpZGFuY2U6Ci1jYXRlZ29yeUd1aWRhbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gZ3VpZGFuY2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBEaXNjaXBsaW5lIEdyb3VwaW5nIEVkaXRvciBEaXNjaXBsaW5lcyBQYWdlCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbk5hbWU9RGlzY2lwbGluZXMKLWRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSBkaXNjaXBsaW5lcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIERpc2NpcGxpbmVzOgotZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlbGVjdGVkTGFiZWw9RGlzY2lwbGluZXM6Ci1kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gRGlzY2lwbGluZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Vc2VEZWZhdWx0RGlyZWN0b3J5QnV0dG9uTGFiZWw9VXNlIGRlZmF1bHQgZGlyZWN0b3J5Ci0KLSMgRGlzY2lwbGluZSBFZGl0b3IgVGFza3MgUGFnZQotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uTmFtZT1UYXNrcwotZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSB0YXNrcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lVGFza3NQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSB0YXNrczoKLWRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1UYXNrczoKLWRpc2NpcGxpbmVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gdGFza3MgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIERpc2NpcGxpbmUgRWRpdG9yIFJlZmVyZW5jZSBXb3JrZmxvdyBQYWdlCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlY3Rpb25OYW1lPVJlZmVyZW5jZSBXb3JrZmxvd3MKLWRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgcmVmZXJlbmNlIHdvcmtmbG93cyB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBSZWZlcmVuY2UgV29ya2Zsb3dzOgotZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsPVJlZmVyZW5jZSB3b3JrZmxvd3M6Ci1kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb249ezB9IFJlZmVyZW5jZSB3b3JrZmxvd3MgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIERvbWFpbiBFZGl0b3IgV29yayBQcm9kdWN0cyBQYWdlCi1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lPVdvcmsgUHJvZHVjdHMKLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbi4KLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHdvcmsgcHJvZHVjdHM6Ci1kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9V29yayBwcm9kdWN0czoKLWRvbWFpbldvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gd29yayBwcm9kdWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgV29yayBQcm9kdWN0IEtpbmQgRWRpdG9yIFdvcmsgUHJvZHVjdHMgUGFnZQotd29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZT1Xb3JrIFByb2R1Y3RzCi13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBiZWxvbmcgdG8gdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIHdvcmsgcHJvZHVjdHM6Ci13b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw9V29yayBwcm9kdWN0czoKLXdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gd29yayBwcm9kdWN0cyBoYXZlIGJlZW4gc2VsZWN0ZWQuCi0KLSMgUm9sZSBTZXQgR3JvdXBpbmcgRWRpdG9yIFJvbGUgU2V0cyBQYWdlCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU9Um9sZSBTZXRzCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgcm9sZSBzZXRzIHRoYXQgYmVsb25nIHRvIHRoaXMgcm9sZSBzZXQgZ3JvdXBpbmcuCi1yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2VfYXZhaWxhYmxlTGFiZWw9QXZhaWxhYmxlIFJvbGUgU2V0czoKLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWxlY3RlZExhYmVsPVJvbGUgc2V0czoKLXJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBSb2xlIFNldHMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFJvbGUgU2V0IEVkaXRvciBSb2xlcyBQYWdlCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25OYW1lPVJvbGVzCi1yb2xlU2V0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIHJvbGVzIHRoYXQgYmVsb25nIHRvIHRoaXMgcm9sZSBzZXQuCi1yb2xlU2V0Um9sZXNQYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSByb2xlczoKLXJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbD1Sb2xlczoKLXJvbGVTZXRSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gcm9sZXMgaGF2ZSBiZWVuIHNlbGVjdGVkLgotCi0jIFRvb2wgRWRpdG9yIFRvb2wgTWVudG9ycyBQYWdlCi10b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lPVRvb2wgTWVudG9ycwotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb249TWFuYWdlIHRoZSB0b29sIG1lbnRvcnMgdGhhdCBiZWxvbmcgdG8gdGhpcyB0b29sLgotdG9vbFRvb2xNZW50b3JzUGFnZV9hdmFpbGFibGVMYWJlbD1BdmFpbGFibGUgdG9vbCBtZW50b3JzOgotdG9vbFRvb2xNZW50b3JzUGFnZV9zZWxlY3RlZExhYmVsPVRvb2wgbWVudG9yczoKLXRvb2xUb29sTWVudG9yc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbj17MH0gVG9vbCBNZW50b3JzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBDdXN0b20gQ2F0ZWdvcnkgRWRpdG9yIEFzc2lnbiBQYWdlCi1jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VjdGlvbk5hbWU9Q29udGVudCBFbGVtZW50cwotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBjb25zdGl0dXRlIHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2F2YWlsYWJsZUxhYmVsPUF2YWlsYWJsZSBDb250ZW50IEVsZW1lbnRzOgotY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlbGVjdGVkTGFiZWw9Q29udGVudCBlbGVtZW50czoKLWN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uPXswfSBDb250ZW50IEVsZW1lbnRzIGhhdmUgYmVlbiBzZWxlY3RlZC4KLQotIyBOZXcgTWV0aG9kIFBsdWctaW4gV2l6YXJkCi1uZXdQbHVnaW5XaXphcmRfdGl0bGU9TmV3IE1ldGhvZCBQbHVnLWluCi1uZXdQbHVnaW5XaXphcmRQYWdlX3RpdGxlPUNyZWF0ZSBhIG5ldyBtZXRob2QgcGx1Zy1pbgotbmV3UGx1Z2luV2l6YXJkUGFnZV90ZXh0PVNwZWNpZnkgYSBuYW1lIGFuZCBwcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldyBtZXRob2QgcGx1Zy1pbi4KLW5ld1BsdWdpbkVycm9yX21zZz1JVVBBMDAyMUU6IEZhaWxlZCB0byBjcmVhdGUgdGhlIG1ldGhvZCBwbHVnLWluLgotbmV3UGx1Z2luRXJyb3JfcmVhc29uPUludGVybmFsIGVycm9yLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0jIFByZWZlcmVuY2UgUGFnZXMKLW1ldGhvZExpYnJhcnlHcm91cF90ZXh0PU1ldGhvZCBsaWJyYXJ5Ci1kZWZhdWx0UGF0aExhYmVsX3RleHQ9RGVmYXVsdCBwYXRoOgotbW9kZWxpbmdHcm91cF90ZXh0PU1vZGVsaW5nCi11c2VySW50ZXJmYWNlR3JvdXBfdGV4dD1Vc2VyIGludGVyZmFjZQotZGVidWdHcm91cF90ZXh0PURlYnVnCi1lbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94X3RleHQ9RW5hYmxlIG1ldGhvZCBsaWJyYXJ5IHZhbGlkYXRpb24KLWludmFsaWRQcmVmZXJlbmNlSGlzdG9yeVNpemVFcnJvcl9tc2c9UHJlZmVyZW5jZSBoaXN0b3J5IHNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmFuZ2luZyBmcm9tIHswfSB0byB7MX0uCi0KLSMgR2VuZXJpYyBkaWFsb2cgdGl0bGVzCi1jcmVhdGVEaWFsb2dfdGl0bGU9Q3JlYXRlIEVsZW1lbnQKLWRlbGV0ZURpYWxvZ190aXRsZT1EZWxldGUgRWxlbWVudAotZWRpdERpYWxvZ190aXRsZT1FZGl0IEVsZW1lbnQKLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yCi1tb3ZlRGlhbG9nX3RpdGxlPU1vdmUgRWxlbWVudAotcmVuYW1lRGlhbG9nX3RpdGxlPVJlbmFtZSBFbGVtZW50Ci13YXJuaW5nRGlhbG9nX3RpdGxlPVdhcm5pbmcKLQotIyBBZGQgQ29uZmlndXJhdGlvbiB0byBQcm9jZXNzIEVycm9yIERpYWxvZwotYWRkQ29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9QWRkIENvbmZpZ3VyYXRpb24gdG8gUHJvY2VzcwotCi0jIFNldCBEZWZhdWx0IENvbmZpZ3VyYXRpb24gRXJyb3IgRGlhbG9nCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9U2V0IERlZmF1bHQgQ29uZmlndXJhdGlvbiBmb3IgUHJvY2VzcwotCi0jIEVkaXQgUHJvY2VzcyBFcnJvciBEaWFsb2cKLWVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nX3RpdGxlPUVkaXQgUHJvY2VzcyBFbGVtZW50Ci0KLSMgT3BlbiBMaWJyYXJ5IERpYWxvZwotb3BlbkxpYnJhcnlEaWFsb2dfdGl0bGU9T3BlbiBNZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSB3YXMgbm90IHNhdmVkIHByb3Blcmx5LiBEbyB5b3Ugd2FudCB0byBpZ25vcmUgdGhlIGVycm9yIGFuZCBwcm9jZWVkIHRvIG9wZW4gYW5vdGhlciBsaWJyYXJ5PwotCi0jIFNhdmUgTGlicmFyeSBEaWFsb2cKLXNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlPVNhdmUgTWV0aG9kIExpYnJhcnkKLXNhdmVMaWJyYXJ5RGlhbG9nX3RleHQ9VGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gbW9kaWZpZWQuIERvIHlvdSB3YW50IHRvIHNhdmUgdGhlIGNoYW5nZXM/Ci0KLSMgVXBncmFkZSBMaWJyYXJ5IERpYWxvZwotdXBncmFkZUxpYnJhcnlEaWFsb2dfdGl0bGU9VXBncmFkZSBNZXRob2QgTGlicmFyeQotCi0jIERlbGV0ZSBFbGVtZW50IFJlZmVyZW5jZSBEaWFsb2cKLWRlbGV0ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcnezF9Jyc/Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLW5vT3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDBFOiBObyBvcGVuIG1ldGhvZCBsaWJyYXJ5LlxuXG5BIG1ldGhvZCBsaWJyYXJ5IG11c3QgYmUgb3BlbmVkIGJlZm9yZSBhIG5ldyBtZXRob2QgZWxlbWVudCBjYW4gYmUgYWRkZWQuXG5cbkNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSBvciBvcGVuIGFuIGV4aXN0aW5nIG9uZSBhbmQgdHJ5IGFnYWluLgotZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZz1JVVBBMDAwMUU6IFRoZSB7MH0gbmFtZSBpcyBtaXNzaW5nLlxuXG5BbGwgbWV0aG9kIGFuZCBwcm9jZXNzIGVsZW1lbnRzIG11c3QgaGF2ZSBhIG5hbWUuXG5cbkNsaWNrIE9LIGFuZCBlbnRlciBhIHZhbGlkIG5hbWUgZm9yIHRoZSBlbGVtZW50LgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQQTAwMDJFOiBUaGUgbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLlxuXG5BIG1ldGhvZCBlbGVtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIGVsZW1lbnQuCi1jcmVhdGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDNFOiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQuCi1kZWxldGVDb25maWdFcnJvcl9tc2c9SVVQQTAwMDRXOiBUaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGRlbGV0ZWQuCi1pbnRlcm5hbEVycm9yX21zZz1JVVBBMDAwNUU6IEFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWludmFsaWRQcmVzZW50YXRpb25OYW1lRXJyb3JfbXNnPUlVUEEwMDA2RTogVGhlIHNwZWNpZmllZCBwcmVzZW50YXRpb24gbmFtZSBpcyBpbnZhbGlkLlxuXG5DbGljayBPSyBhbmQgZW50ZXIgYSBkaWZmZXJlbnQgbmFtZS4KLWludmFsaWRDb25maWdFcnJvcl9tc2c9SVVQQTAwMDdFOiBUaGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gJyd7MH0nJyBpcyBub3QgYSBzdWJzZXQgb2YgdGhlIHByb2Nlc3MnJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuXG5JbiBvcmRlciB0byBtYWludGFpbiB0aGUgaW50ZWdyaXR5IG9mIGEgcHJvY2VzcywgaXRzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtdXN0IGJlIGEgc3VwZXJzZXQgb2YgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy5cblxuU2VsZWN0IGFub3RoZXIgY29uZmlndXJhdGlvbiBvciBtb2RpZnkgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0byBpbmNsdWRlIHRoZSBjb250ZW50IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFuZCB0cnkgYWdhaW4uCi1zZXREZWZhdWx0Q29uZmlnRXJyb3JfbXNnPUlVUEEwMDA4RTogVGhlIHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uICcnezB9JycgaXMgbm90IGEgc3VwZXJzZXQgb2YgdGhlIG90aGVyIGNvbmZpZ3VyYXRpb25zIHJlZmVyZW5jZWQgYnkgdGhlIHByb2Nlc3MuXG5cbkluIG9yZGVyIHRvIG1haW50YWluIHRoZSBpbnRlZ3JpdHkgb2YgYSBwcm9jZXNzLCBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIG11c3QgYmUgYSBzdXBlcnNldCBvZiBhbGwgb3RoZXIgY29uZmlndXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLlxuXG5TZWxlY3QgYW5vdGhlciBjb25maWd1cmF0aW9uIG9yIG1vZGlmeSB0aGUgY29udGVudCBvZiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhbmQgdHJ5IGFnYWluLgotb3BlbkxpYnJhcnlFcnJvcl9tc2c9SVVQQTAwMDlFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIGxvYWRlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEwRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSBzYXZlZC4KLXNhdmVMaWJyYXJ5VG9FcnJvcl9tc2c9SVVQQTAwMTBFOiBUaGUgbWV0aG9kIGxpYnJhcnkgY2Fubm90IGJlIHNhdmVkIHRvICcnezB9JycuCi1lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2c9SVVQQTAwMTFFOiBUaGUgZWxlbWVudCAnJ3swfScnIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZC4KLXVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnPUlVUEEwMDEyRTogVGhlIG1ldGhvZCBsaWJyYXJ5IGNhbm5vdCBiZSB1cGdyYWRlZC4KLW9wZW5Db25maWdXaXphcmRFcnJvcl9tc2c9SVVQQTAwMTZFOiBUaGUgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZCBjYW5ub3QgYmUgb3BlbmVkLgotCi0jIEVycm9yIFJlYXNvbnMKLWVycm9yX3JlYXNvbj1BbiBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbnRlcm5hbEVycm9yX3JlYXNvbj1BbiBpbnRlcm5hbCBlcnJvciBoYXMgb2NjdXJyZWQuXG5cbkNsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi11cGdyYWRlTGlicmFyeUVycm9yX3JlYXNvbj1JVVBBMDAxOEU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBsb2FkaW5nIHRoZSBtZXRob2QgbGlicmFyeSBlbGVtZW50cy5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLXNhdmVVcGdyYWRlZExpYnJhcnlFcnJvcl9yZWFzb249SVVQQTAwMTlFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgc2F2aW5nIHRoZSB1cGdyYWRlZCBtZXRob2QgbGlicmFyeS5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotY29uZmlndXJhdGlvblBhZ2VfUXVpY2tmaXhFcnJvcl9yZWFzb24xPUlVUEEwMDIwVzpVbmFibGUgdG8gZml4IHRoZSBwcm9ibGVtIGZvciBlbGVtZW50ICcnezB9Jycgc2luY2UgaXQgaXMgaW4gYSBzdWJ0cmFjdGVkIGNhdGVnb3J5LiBcblxuIFlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBzdWJ0cmFjdGVkIGNhdGVnb3J5LgotY29uZmlndXJhdGlvblBhZ2VfcXVpY2tmaXhFcnJvcl90aXRsZT1RdWljayBGaXgKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotb3BlbmluZ0xpYnJhcnlUYXNrX25hbWU9T3BlbmluZyBtZXRob2QgbGlicmFyeS4uLgotc2F2aW5nTGlicmFyeVRhc2tfbmFtZT1TYXZpbmcgbWV0aG9kIGxpYnJhcnkgLi4uCi11cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lPVVwZ3JhZGluZyBtZXRob2QgbGlicmFyeS4uLgotbG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2tfbmFtZT1Mb2FkaW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLi4uCi1zYXZpbmdVcGdyYWRlZEVsZW1lbnRzVGFza19uYW1lPVNhdmluZyBtZXRob2QgbGlicmFyeSBlbGVtZW50cyBpbiBuZXcgZmlsZSBmb3JtYXQuLi4KLXNhdmluZ1Rhc2tfbmFtZT1TYXZpbmcgJyd7MH0nJy4uLgotc2F2aW5nRmlsZXNUYXNrX25hbWU9U2F2aW5nIGZpbGVzLi4uCi1maXhpbmdDb250ZW50RGVzY3JpcHRpb25HVUlEc1Rhc2tfbmFtZT1GaXhpbmcgY29udGVudCBkZXNjcmlwdGlvbiBHVUlEcy4uLgotZGVsZXRpbmdJbnZhbGlkUmVmZXJlbmNlc1Rhc2tfbmFtZT1EZWxldGluZyBpbnZhbGlkIHJlZmVyZW5jZXMuLi4KLQotCi0jIEFkZCBFZGl0b3IgVG8gQnJvd3NpbmcgUGVyc3BlY3RpdmUgV2FybmluZyBEaWFsb2cKLWFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZz1JVVBBMDA0Nlc6IFRoaXMgcGVyc3BlY3RpdmUgaGFzIGJlZW4gc3BlY2lhbGx5IGRlc2lnbmVkIHRvIG1heGltaXplIHlvdXIgdXNlciBleHBlcmllbmNlIG9mIGJyb3dzaW5nIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QgbGlicmFyeSBlbGVtZW50cy4gTm8gZWRpdG9yIGNhbiBiZSBhZGRlZCBvciBkaXNwbGF5ZWQgaGVyZS4KLQotIyBDaGFuZ2UgSGlzdG9yeSBEaWFsb2cKLUNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGU9Q2hhbmdlIERlc2NyaXB0aW9uIEhpc3RvcnkKLUNoYW5nZUhpc3RvcnlEaWFsb2dfbGFiZWw9Q2hhbmdlIGhpc3Rvcnk6Ci0KLSMgTWV0aG9kIEVsZW1lbnQgRGVsZXRlIEFjdGlvbgotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1Db25maXJtIERlbGV0aW9uCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnP1xuXG5UaGUgZm9sbG93aW5nIGVsZW1lbnQocykgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBpdGVtKHMpIHRvIGJlIGRlbGV0ZWQ6IHsxfQotCi0jIE5ldyBMaWJyYXJ5IERpYWxvZwotZXJyb3JEaWFsb2dfbWVzc2FnZT1JVVBBMDAyMkU6IFRoZSAgbWV0aG9kIGxpYnJhcnkgJyd7MH0nJyBjYW5ub3QgYmUgY3JlYXRlZC4KLWVycm9yRGlhbG9nX2Vycm9yPUNhbm5vdCBjcmVhdGUgYSBtZXRob2QgbGlicmFyeSB3aXRoaW4gYW5vdGhlciBtZXRob2QgbGlicmFyeS4KLWVycl9ub29wZW5saWJyYXJ5PUlVUEEwMDQwRTogTm8gb3BlbiBtZXRob2QgbGlicmFyeS5cblxuQSBtZXRob2QgbGlicmFyeSBtdXN0IGJlIG9wZW5lZCBiZWZvcmUgYSBuZXcgbWV0aG9kIHBsdWctaW4gY2FuIGJlIGFkZGVkLlxuXG5DcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkgb3Igb3BlbiBhbiBleGlzdGluZyBvbmUgYW5kIHRyeSBhZ2Fpbi4KLWVycl9sb2FkaW5nbGlicmFyeT1FcnJvciBsb2FkaW5nIGxpYnJhcnkKLW1zZ19yZWxvYWRMaWJyYXJ5PUVycm9yIHVuZG9pbmcgdGhlIGZhaWxlZCBkZWxldGlvbi4gVGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgbmVlZHMgdG8gYmUgcmVsb2FkZWQuCi0KLSMgUmVsb2FkIExpYnJhcnkgRGlhbG9nCi1yZWxvYWREaWFsb2dfbWVzc2FnZT1UaGUgbGlicmFyeSBuZWVkcyB0byBiZSByZWxvYWRlZCB0byByZXN0b3JlIGl0cyBvcmlnaW5hbCBzdGF0ZS4KLXJlbG9hZERpYWxvZ190aXRsZT1SZWxvYWQgTGlicmFyeQotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yVGl0bGU9TW92ZSBFcnJvcgotZGlhbG9nc19Nb3ZlRGlhbG9nX2Vycm9yTWVzc2FnZT1FcnJvciBkdXJpbmcgbW92ZQotCi0jIFByb2Nlc3MgRm9ybSBFZGl0b3IKLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZT1TYXZlCi1wcm9jZXNzRm9ybUVkaXRvclNhdmVEaWFsb2dfbWVzc2FnZTE9VGhpcyBjaGFuZ2Ugd2lsbCBhZmZlY3QgYWxsIGRpYWdyYW1zIGluIHlvdXIgcHJvY2Vzcy4gVGhlIGVkaXRvciB3aWxsIGJlIHNhdmVkIGFmdGVyIHlvdXIgY2hhbmdlLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLXByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMj1UaGUgZWRpdG9yIHdpbGwgYmUgc2F2ZWQgYWZ0ZXIgeW91ciBjaGFuZ2UuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi0jIENvbmZpZ3VyYXRpb24gVmlldyBQYWdlCi1jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU9Q29uZmlybSBSZW1vdmluZwotY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB2aWV3ICcnezB9Jyc/Ci1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfdGl0bGU9V2FybmluZwotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbj1Db25maWd1cmF0aW9uOgotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdzPUNvbmZpZ3VyYXRpb24gVmlld3MKLWNvbmZpZ1ZpZXdQYWdlX3ZpZXdzPVZpZXdzCi1jb2x1bW5zZWxlY3Rpb25fdGV4dD1Db2x1bW4gc2VsZWN0aW9uOgotY29uZmlnVmlld1BhZ2VfYWRkVmlld0J1dHRvblRleHQ9QWRkIFZpZXcuLi4KLWNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0PVJlbW92ZSBWaWV3Ci1jb25maWdWaWV3UGFnZV9tYWtlRGVmYXVsdEJ1dHRvblRleHQ9TWFrZSBEZWZhdWx0Ci1jb25maWdWaWV3UGFnZVZpZXdFeGlzdHNEaWFsb2dfbWVzc2FnZT1JVVBBMDAyM1c6IFZpZXcgd2l0aCBuYW1lICcnezB9JycgYWxyZWFkeSBleGlzdHMuCi1jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld1NlY3Rpb25UaXRsZT1QdWJsaXNoZWQgTmF2aWdhdGlvbiBWaWV3cwotY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZT1TcGVjaWZ5IHRoZSB2aWV3cyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgd2hlbiB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgcHVibGlzaGVkLiBUbyBjcmVhdGUgYSB2aWV3LCBjbGljayBBZGQgVmlldyB0byBzZWxlY3QgYW55IHN0YW5kYXJkIG9yIGN1c3RvbSBjYXRlZ29yeSB3aXRoaW4gdGhlIGNvbmZpZ3VyYXRpb24uICBUaGUgc2VsZWN0ZWQgY2F0ZWdvcnkgd2lsbCByZXByZXNlbnQgdGhlIHZpZXcgYW5kIHRoZSBjYXRlZ29yeSdzIHN1Yi1jYXRlZ29yaWVzIGFuZCBjb250ZW50IGVsZW1lbnRzIHdpbGwgcmVwcmVzZW50IHRoZSB2aWV3J3MgdHJlZSBlbGVtZW50cy4KLQotIyBEZXNjcmlwdGlvbiBUYWIKLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlPUNvbnZlcnQgR3VpZGFuY2UKLWRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxPUlVUEEwMDQwVzogIFBsZWFzZSBzYXZlIHRoZSBlZGl0b3IgZmlyc3QuCi1kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMj1UaGVyZSBhcmUgbm8gY29tcGF0aWJsZSBndWlkYW5jZSBmb3IgdGhpcyB0eXBlLgotCi1jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlPUNvbnZlcnQgQWN0aXZpdHkKLSMgQXNzb2NpYXRpb24gRm9ybSBQYWdlCi1Bc3NvY2lhdGlvbkZvcm1QYWdlX0JyaWVmRGVzY3JpcHRpb25MYWJlbD1CcmllZiBkZXNjcmlwdGlvbiBvZiBzZWxlY3RlZCBlbGVtZW50OgotCi0jIE1ldGhvZCBFbGVtZW50IERlc2NyaXB0aW9uCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfdGl0bGU9RW50ZXIgRWxlbWVudCBOYW1lCi1tZXRob2RFbGVtZW50RGVzY3JpcHRpb25FbXB0eU5hbWVEaWFsb2dfbWVzc2FnZT1UaGUgbmFtZSBmaWVsZCBjYW5ub3QgYmUgZW1wdHkuCi0KLSMgTWV0aG9kIFBsdWctaW4gRGVzY3JpcHRpb24KLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUmVtb3ZlUmVmQ29uZmlybV9tZXNzYWdlPURlc2VsZWN0aW5nIHRoZSByZWZlcmVuY2VkIHBsdWctaW4ocykgYXNzb2NpYXRlZCB3aXRoIHBsdWctaW4gJyd7MH0nJyB3aWxsIHByb2R1Y2UgaW52YWxpZCByZWxhdGlvbnNoaXBzIHRoYXQgd2lsbCBiZSBkZWxldGVkLlxuXG5UaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLiBEbyB5b3Ugd2FudCB0byBwcm9jZWVkIHdpdGggdGhpcyBjaGFuZ2U/Ci1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZT1Zb3UgYXJlIGFib3V0IHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIG1ldGhvZCBwbHVnLWluIGZyb20gJyd7MH0nJyB0byAnJ3sxfScnLiBUaGlzIGFjdGlvbiB3aWxsIHNhdmUgYW5kIGNsb3NlIGFueSBvcGVuIGVkaXRvcnMgb2YgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoaXMgcGx1Zy1pbiBhbmQgcmVuYW1lIHRoZSBwbHVnLWluIGZvbGRlciB0byB0aGUgbmV3IG5hbWUuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotbWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWVfdGl0bGU9UmVuYW1lIE1ldGhvZCBQbHVnLWluCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyPUNvdWxkIG5vdCByZW5hbWUgcGx1Zy1pbiBmb2xkZXIgdG8gbmV3IG5hbWUKLW1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWw9TG9jayBwbHVnLWluCi1tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlPUNoYW5naW5nIHRoZSBsb2NrIHN0YXRlIG9mIHRoaXMgcGx1Zy1pbiAnJ3swfScnIHdpbGwgc2F2ZSBhbmQgY2xvc2UgYW55IG9wZW4gZWRpdG9ycyBvZiBlbGVtZW50cyBiZWxvbmdpbmcgdG8gaXQuIERvIHlvdSB3YW50IHByb2NlZWQgd2l0aCB0aGlzIGNoYW5nZT8KLQotIyBQcm9jZXNzIERlc2NyaXB0aW9uCi1wcm9jZXNzRGVzY3JpcHRpb25OYW1lQ2hhbmdlQ29uZmlybV90aXRsZT1SZW5hbWUKLXByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U9WW91IGFyZSBhYm91dCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBwcm9jZXNzLiBUaGlzIHdpbGwgc2F2ZSB0aGlzIGVkaXRvciBhbmQgcmVuYW1lIHRoZSBwcm9jZXNzIGZvbGRlciB0byB0aGUgbmV3IG5hbWUuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotcHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvblRpdGxlPUNvbmZpZ3VyYXRpb24KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uU2VjdGlvbk1lc3NhZ2U9U3BlY2lmeSBhbGwgdGhlIGNvbmZpZ3VyYXRpb25zIHZhbGlkIGZvciB0aGlzIHByb2Nlc3MuIFNlbGVjdCBvbmUgY29uZmlndXJhdGlvbiBhcyB0aGUgZGVmYXVsdCBhbmQgaXQgbmVlZHMgdG8gYmUgYSBzdXBlci1zZXQgb2YgYWxsIHRoZSBvdGhlciBjb25maWd1cmF0aW9ucy4KLXByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9ucz1Db25maWd1cmF0aW9uczoKLXByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0PShkZWZhdWx0KQotUHJvY2Vzc0Rlc2NyaXB0aW9uX3NlbGVjdENvbmZpZ3VyYXRpb249U2VsZWN0IHRoZSBjb25maWd1cmF0aW9ucyB0byBhZGQKLVByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQwPVRoaXMgd2lsbCBzYXZlIHRoZSBjdXJyZW50IGVkaXRvciBhbmQgdGhlIGNoYW5nZSB3aWxsIGJlIHBlcm1hbmVudC4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlPVRoZSBmb2xsb3dpbmcgZGVzY3JpcHRvcnMgYXJlIG5vdCB1c2VkIGFueXdoZXJlIGFmdGVyIGRlbGV0aW9uIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50cy5cblNlbGVjdCBkZXNjcmlwdG9ycyB5b3Ugd2FudCB0byBkZWxldGUuCi0KLSMgVmlldyBIZWxwZXIKLXZpZXdIZWxwZXJIZWFsdGhDaGVja0RpYWxvZ190aXRsZT1MaWJyYXJ5IEhlYWx0aCBDaGVjawotdmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2s9UGVyZm9ybWluZyBoZWFsdGggY2hlY2sgb24gbGlicmFyeS4uLgotdmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U9VGhlIGhlYWx0aCBjaGVjayBvbiBvcGVuIGxpYnJhcnkgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZC4gU2VlIHRoZSByZXBvcnQgaW4gdGhlIGxvZyBmaWxlLgotCi0jIEF0dGFjaCBHdWlkYW5jZSBGaWxlIERpYWxvZwotYXR0YWNoR3VpZGFuY2VGaWxlRGlhbG9nX3RpdGxlPUF0dGFjaCBGaWxlCi0KLSMgQ3JlYXRlIEVsZW1lbnQgRXJyb3IgRGlhbG9nCi1jcmVhdGVFbGVtZW50RGlhbG9nX3RpdGxlPUNyZWF0ZSBOZXcgezB9Ci1jcmVhdGVOZXdFbGVtZW50RXJyb3JfbXNnPUVycm9yIGNyZWF0aW5nIG5ldyB7MH0uCi0KLWRsZ1RpdGxlX3JlbG9hZExpYnJhcnk9UmVsb2FkIExpYnJhcnkKLWNyZWF0ZUVsZW1lbnRFcnJvcl9yZWFzb249VGhlIHswfSBuYW1lIGNhbm5vdCBiZSBlbXB0eS5cblxuU3BlY2lmeSBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbj1UaGUgY29uZmlndXJhdGlvbiBpcyByZWZlcmVuY2VkIGJ5IHByb2Nlc3MgJyd7MH0nJwotCi0jIENoYW5nZUJvdW5kc0NvbW1hbmQKLWdlZl9jaGFuZ2VCb3VuZHNDb21tYW5kX2xhYmVsPUNoYW5nZSBCb3VuZHMKLSMgQ2hhbmdlTmFtZUNvbW1hbmQKLWdlZl9jaGFuZ2VOYW1lQ29tbWFuZF9sYWJlbD1DaGFuZ2UgTmFtZQotZ2VmX2NoYW5nZU5hbWVDb21tYW5kX3VuZG9NZXNzYWdlPUNhbm5vdCB1bmRvIHRoZSBuYW1lIGNoYW5nZS5cblxuVW5kbyBuYW1lIGNoYW5nZSBpcyBub3QgYWxsb3dlZCBpZiBwcmV2aW91cyBuYW1lIGlzIG51bGwuCi0jIENoYW5nZVByb3BlcnR5VmFsdWVDb21tYW5kCi1nZWZfY2hhbmdlUHJvcGVydHlWYWx1ZUNvbW1hbmRfbGFiZWw9Q2hhbmdlIFByb3BlcnR5IFZhbHVlCi0jIENyZWF0ZUJlbmRwb2ludENvbW1hbmQKLWdlZl9jcmVhdGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPUNyZWF0ZSBCZW5kcG9pbnQKLSMgQ3JlYXRlTGlua0NvbW1hbmQKLWdlZl9jcmVhdGVMaW5rQ29tbWFuZF9sYWJlbD1MaW5rIENyZWF0aW9uCi0jIENyZWF0ZU5vZGVDb21tYW5kCi1nZWZfY3JlYXRlTm9kZUNvbW1hbmRfbGFiZWw9Q3JlYXRlIE5ldyBOb2RlCi0jIERlbGV0ZUJlbmRwb2ludENvbW1hbmQKLWdlZl9kZWxldGVCZW5kcG9pbnRDb21tYW5kX2xhYmVsPURlbGV0ZSBCZW5kcG9pbnQKLSMgRGVsZXRlQ29tbWFuZAotZ2VmX2RlbGV0ZUNvbW1hbmRfbGFiZWw9RGVsZXRlCi0jIERlbGV0ZUxpbmtDb21tYW5kCi1nZWZfZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw9RGVsZXRlIENvbm5lY3Rpb24KLSMgTW92ZUJlbmRwb2ludENvbW1hbmQKLWdlZl9tb3ZlQmVuZHBvaW50Q29tbWFuZF9sYWJlbD1Nb3ZlIEJlbmRwb2ludAotIyBSZWNvbm5lY3RMaW5rQ29tbWFuZAotZ2VmX3JlY29ubmVjdExpbmtDb21tYW5kX2xhYmVsPVJlY29ubmVjdCBMaW5rCi0KLSMgVmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyCi1nZWZfdmFsaWRhdGluZ0RpcmVjdEVkaXRNYW5hZ2VyX2JyaW5nRG93blByb21wdD1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLSMgVmFsaWRhdGluZ0ZyZWVUZXh0RWRpdE1hbmFnZXIKLWdlZl92YWxpZGF0aW5nRnJlZVRleHRFZGl0TWFuYWdlcl9icmluZ0Rvd25Qcm9tcHQ9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi0jIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0Ci1nZWZfd29ya1Byb2R1Y3ROb2RlRWRpdFBhcnRfdmFsaWRhdGVNZXNzYWdlPVRoZSBuYW1lIGNhbm5vdCBiZSBlbXB0eS4gUGxlYXNlIHNwZWNpZnkgYSB2YWxpZCBuYW1lLgotCi0jIEVsZW1lbnRzVmlld0RlbGV0ZUFjdGlvbgotYWN0aW9uc19FbGVtZW50c1ZpZXdEZWxldGVBY3Rpb25fbWVzc2FnZT1UaGUgY29uZmlndXJhdGlvbiAnJ3swfScnIGNhbm5vdCBiZSBkZWxldGVkIHNpbmNlIGl0IGlzIHN0aWxsIGluIHVzZSBieSBwcm9jZXNzICcnezF9JycuCi0KLSMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yCi1hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclRpdGxlPURlbGV0ZSBFcnJvcgotYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JNZXNzYWdlPVVuaGFuZGxlZCBleGNlcHRpb24KLWFjdGlvbnNfTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yX2RlbGV0ZUVycm9yUmVhc29uPVNlZSBkZXRhaWxzCi0KLSMgTWV0aG9kRWxlbWVudEVkaXRvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlPVNhdmUgRXJyb3IKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMT1JVVBBMDAyMEU6IEVycm9yIHNhdmluZyBmaWxlCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI9Q29tbWl0IEVycm9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yUmVhc29uMT1TZWUgbG9nIGZpbGUgZm9yIG1vcmUgZGV0YWlscwotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjI9U2VlIGRldGFpbHMKLWVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvclRpdGxlPVJlbmFtZSBFcnJvcgotZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX2ludmFsaWRFZGl0b3JNc2c9T25lIG9yIG1hbnkgZmlsZXMgb2YgdGhpcyBlZGl0b3IgaGF2ZSBiZWVuIHJlbW92ZWQuIFRoZSBlZGl0b3IgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBoYXMgdG8gY2xvc2UuCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlPUludmFsaWQgRWRpdG9yCi1lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JNZXNzYWdlMT1FcnJvciByZW5hbWluZyBmaWxlKHMpICcnezB9JycKLQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlCi1yZW5hbWVFcnJvcl90aXRsZT1SZW5hbWUgRWxlbWVudAotcmVuYW1lRXJyb3JfbXNnPUlVUEEwMDEzRTogVGhlIHJlbmFtZSBvcGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZC4KLVNlbGVjdEVsZW1lbnREaWFsb2dfc2VsZWN0ZWxlbWVudF90ZXh0PVNlbGVjdCBFbGVtZW50Ci0KLSMgRWRpdG9yQ2hvb3NlcgotZWRpdG9yc19FZGl0b3JDaG9vc2VyX3N5c3RlbUVycm9yRGlhbG9nX3RpdGxlPU9wZW4gTWV0aG9kIEVkaXRvcgotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EZXNjcmlwdGlvbkxhYmVsPURlc2NyaXB0aW9uOgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX1NlbGVjdEFsbEJ1dHRvbkxhYmVsPVNlbGVjdCBBbGwKLU9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGVfZWRpdF90ZXh0MD1FZGl0IEVsZW1lbnQKLWVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlPUlVUEEwMDIzRTogQ2Fubm90IG9wZW4gdGhlIGVkaXRvciBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGU9U2VsZWN0IEltYWdlIEZpbGUKLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlOYW1lPU5ldyBMaWJyYXJ5Ci1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfRGVzY3JpcHRpb25MYWJlbD1EZXNjcmlwdGlvbjoKLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uPVNlbGVjdCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbnMgYW5kIGNsaWNrIEZpbmlzaCB0byBvcGVuIHRoZW0uCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfRGVzZWxlY3RBbGxCdXR0b25MYWJlbD1EZXNlbGVjdCBBbGwKLUVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0PVNwZWNpZnkgdGhlIGRpcmVjdG9yeSBvZiBuZXdseSBtaWdyYXRlZCB7MH0gdG8gcmVwbGFjZSB0aGUgc2VsZWN0ZWQgezB9Ci1lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uPUEgc3lzdGVtIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuQ2xvc2Ugc29tZSBvZiB0aGUgb3BlbmVkIGVkaXRvcnMgYW5kIHRyeSBhZ2Fpbi4KLQotIyBEZXNjcmlwdGlvbkZvcm1QYWdlCi1mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RpdGxlPUltYWdlIGlzIGludmFsaWQKLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VUb29CaWdEaWFsb2dfdGVtcGxhdGU9SVVQQTAwMzFFOiBUaGUgc2VsZWN0ZWQgaW1hZ2UgJyd7MH0nJyBpcyBsYXJnZXIgdGhhbiB0aGUgYWxsb3dlZCBzaXplICh7MX0gYnkgezJ9KS4gUGxlYXNlIHNlbGVjdCBhbm90aGVyIGltYWdlLgotZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlPUltYWdlIGlzIGludmFsaWQKLWZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZT1JVVBBMDAzMkU6IFRoZSBzZWxlY3RlZCBmaWxlICcnezB9JycgZG9lcyBub3QgZXhpc3QuIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBpbWFnZS4KLURlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19TZWxlY3RCdXR0b25MYWJlbD1TZWxlY3QuLi4KLUF1dGhvcmluZ1VJUGx1Z2luX0Fic3RyYWN0TmV3TGlicmFyeVBhZ2VfRGVmYXVsdExpYnJhcnlEZXNjcmlwdGlvbj1NZXRob2QgbGlicmFyeSBkZXNjcmlwdGlvbgotQXV0aG9yaW5nVUlQbHVnaW5fTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlX0RlZmF1bHRCcmllZkRlc2NyaXB0aW9uPU1ldGhvZCBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZUFuZENsb3NlUGFnZURlc2NyaXB0aW9uPUFsbCBlZGl0b3JzIG11c3QgYmUgY2xvc2VkLiBTZWxlY3QgdGhlIG9uZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkIGZpcnN0LCBpZiBhcHBsaWNhYmxlLgotCi0jIFRlbXBsYXRlRGVzY3JpcHRpb25QYWdlCi1mb3Jtc19HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnPVRoZSBzZWxlY3RlZCBmaWxlIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudCB0byB0aGlzIEd1aWRhbmNlLgotZm9ybXNfR3VpZGFuY2VXaXRoVXJsQXR0YWNobWVudHNEZXNjcmlwdGlvblBhZ2VfYWxyZWFkeUF0dGFjaGVkX21zZz1UaGUgc2VsZWN0ZWQgVVJMIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudCB0byB0aGlzIEd1aWRhbmNlLgotCi0jIE5ldyBMaWJyYXJ5IEVycm9yIERpYWxvZwotbmV3TGlicmFyeUVycm9yX21zZz1JVVBBMDAxNEU6IFVuYWJsZSB0byBjcmVhdGUgdGhlIG1ldGhvZCBsaWJyYXJ5LgotbmV3TGlicmFyeUludGVybmxFcnJvcl9yZWFzb249QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotbmV3TGlicmFyeUVycm9yX3JlYXNvbjE9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBwYXRoICcnezB9JycgaXMgaW52YWxpZC4KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24yPUEgbWV0aG9kIGxpYnJhcnkgYWxyZWFkeSBleGlzdHMgaW4gJyd7MH0nJy4KLW5ld0xpYnJhcnlFcnJvcl9yZWFzb24zPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuCi1uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlPVNlbGVjdCBPSyB0byBzcGVjaWZ5IGFub3RoZXIgbWV0aG9kIGxpYnJhcnkgcGF0aC4KLQotI1Byb2Nlc3MgbGl0ZXJhbHMKLVByb2Nlc3NfRXh0ZXJuYWxJRD1FeHRlcm5hbCBJRDoKLVByb2Nlc3NfUHVycG9zZT1QdXJwb3NlOgotUHJvY2Vzc19TY29wZT1TY29wZToKLVByb2Nlc3NfVXNhZ2VOb3Rlcz1Vc2FnZSBOb3RlczoKLVByb2Nlc3NfQWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlczoKLVByb2Nlc3NfSG93VG9TdGFmZj1Ib3cgdG8gU3RhZmY6Ci1Qcm9jZXNzX0tleUNvbnNpZGVyYXRpb249S2V5IENvbnNpZGVyYXRpb25zOgotUHJvY2Vzc19TY2FsZT1TY2FsZToKLVByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcz1Qcm9qZWN0IENoYXJhY3RlcmlzdGljczoKLVByb2Nlc3NfUmlza0xldmVsPVJpc2sgTGV2ZWw6Ci1Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWU9RXN0aW1hdGluZyBUZWNobmlxdWVzOgotUHJvY2Vzc19Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPVByb2plY3QgTWVtYmVyIEV4cGVydGlzZToKLVByb2Nlc3NfVHlwZU9mQ29udHJhY3Q9VHlwZSBPZiBDb250cmFjdDoKLQotIyBFZGl0b3IgUHJldmlldyBOYXZpZ2F0aW9uIEJ1dHRvbnMKLWJhY2tCdXR0b25fdGV4dD1CYWNrCi1mb3J3YXJkQnV0dG9uX3RleHQ9Rm9yd2FyZAotZm9yd2FyZF90ZXh0PUZvcndhcmQKLXN0b3BCdXR0b25fdGV4dD1TdG9wCi1yZWZyZXNoQnV0dG9uX3RleHQ9UmVmcmVzaAotcmVmcmVzaF90ZXh0PVJlZnJlc2gKLW5ld25hbWVfdGV4dD1OZXcgbmFtZToKLXByaW50QnV0dG9uX3RleHQ9UHJpbnQKLQotIyBDb250ZXh0IG1lbnVzCi1fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW09JlJlZnJlc2gKLV9VSV9TaG93UHJvcGVydGllc1ZpZXdfbWVudV9pdGVtPSZTaG93IFByb3BlcnRpZXMKLQotX1VJX01ldGhvZEVkaXRvcl9tZW51PSZNZXRob2QgRWRpdG9yCi1fVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtPSZOZXcKLV9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbT1OJmV3IFNpYmxpbmcKLQotX1VJX1NlbGVjdGlvblBhZ2VfbGFiZWw9U2VsZWN0aW9uCi1fVUlfUGFyZW50UGFnZV9sYWJlbD1QYXJlbnQKLV9VSV9MaXN0UGFnZV9sYWJlbD1MaXN0Ci1fVUlfVHJlZVBhZ2VfbGFiZWw9VHJlZQotX1VJX1RhYmxlUGFnZV9sYWJlbD1UYWJsZQotX1VJX1RhYmxlVHJlZVBhZ2VfbGFiZWw9VGFibGVUcmVlCi1fVUlfT2JqZWN0Q29sdW1uX2xhYmVsPU9iamVjdAotX1VJX1NlbGZDb2x1bW5fbGFiZWw9U2VsZgotCi1fVUlfTm9PYmplY3RTZWxlY3RlZD1TZWxlY3RlZCBOb3RoaW5nCi1fVUlfU2luZ2xlT2JqZWN0U2VsZWN0ZWQ9U2VsZWN0ZWQgT2JqZWN0OiB7MH0KLV9VSV9NdWx0aU9iamVjdFNlbGVjdGVkPVNlbGVjdGVkIHswfSBPYmplY3RzCi0KLV9VSV9PcGVuRWRpdG9yRXJyb3JfbGFiZWw9T3BlbiBFZGl0b3IKLQotX1VJX1dpemFyZF9jYXRlZ29yeT1FeGFtcGxlIEVNRiBNb2RlbCBDcmVhdGlvbiBXaXphcmRzCi0KLV9VSV9NZXRob2RNb2RlbFdpemFyZF9sYWJlbD1NZXRob2QgTW9kZWwKLV9VSV9NZXRob2RNb2RlbFdpemFyZF9kZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgTWV0aG9kIG1vZGVsCi0KLV9VSV9NZXRob2RFZGl0b3JfbGFiZWw9TWV0aG9kIE1vZGVsIEVkaXRvcgotCi1fVUlfTWV0aG9kRWRpdG9yRmlsZW5hbWVEZWZhdWx0QmFzZT1NeQotX1VJX01ldGhvZEVkaXRvckZpbGVuYW1lRXh0ZW5zaW9uPW1ldGhvZAotCi1fVUlfV2l6YXJkX2xhYmVsPU5ldwotCi1fV0FSTl9GaWxlbmFtZUV4dGVuc2lvbj1UaGUgZmlsZW5hbWUgbXVzdCBlbmQgaW4gJycuezB9JycKLQotX1VJX01vZGVsT2JqZWN0PU1vZGVsIE9iamVjdAotX1VJX1hNTEVuY29kaW5nPVhNTCBFbmNvZGluZwotX1VJX1hNTEVuY29kaW5nQ2hvaWNlcz1VVEYtOCBBU0NJSSBVVEYtMTYgVVRGLTE2QkUgVVRGLTE2TEUgSVNPLTg4NTktMQotX1VJX1dpemFyZF9pbml0aWFsX29iamVjdF9kZXNjcmlwdGlvbj1TZWxlY3QgYSBtb2RlbCBvYmplY3QgdG8gY3JlYXRlCi0KLV9VSV9GaWxlQ29uZmxpY3RfbGFiZWw9RmlsZSBDb25mbGljdAotX1dBUk5fRmlsZUNvbmZsaWN0PVRoZXJlIGFyZSB1bnNhdmVkIGNoYW5nZXMgdGhhdCBjb25mbGljdCB3aXRoIGNoYW5nZXMgbWFkZSBvdXRzaWRlIHRoZSBlZGl0b3IuIERvIHlvdSB3aXNoIHRvIGRpc2NhcmQgdGhpcyBlZGl0b3IncyBjaGFuZ2VzPwotCi0jIEFkZCBMaW5rIERpYWxvZwotYWRkTGlua0RpYWxvZ19saW5rVHlwZT1UeXBlOgotb3BlbkxpbmtDaGVja2JveF90ZXh0PU9wZW4gbGluayBpbiBhIHNlcGFyYXRlIGJyb3dzZXIgd2luZG93Ci0KLSMgQWRkIEltYWdlIERpYWxvZwotaGVpZ2h0TGFiZWxfdGV4dD1IZWlnaHQ6Ci13aWR0aExhYmVsX3RleHQ9V2lkdGg6Ci1FbGVtZW50c1ZpZXdfMjA9Y2FwYWJpbGl0eSBwYXR0ZXJuCi1FbGVtZW50c1ZpZXdfMjE9ZGVsaXZlcnkgcHJvY2VzcwotRWxlbWVudHNWaWV3XzIyPXByb2Nlc3MKLUVsZW1lbnRzVmlld18zNT17MH0gaXMgcmVhZC1vbmx5LiBNYWtlIGl0IHdyaXRhYmxlIGJlZm9yZSBjb250aW51aW5nLgotRWxlbWVudHNWaWV3XzM2PUVycm9yIGxvYWRpbmcgbGlicmFyeQotYWx0VGFnTGFiZWxfdGV4dD1BTFQgdGFnOgotaW1hZ2VTaXplTGFiZWxfdGV4dD1IZWlnaHQgYW5kIHdpZHRoIG9mIGltYWdlIG11c3QgYmUgYXQgbGVhc3QgMTAgYW5kIG5vIG1vcmUgdGhhbiA2MDAuIEludmFsaWQgaGVpZ2h0IGFuZCB3aWR0aCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHN1aXRhYmxlIHNpemUuCi0KLSMgUHJvY2VzcyBFZGl0b3IKLVByb2Nlc3NFZGl0b3I9UHJvY2Vzc0VkaXRvcgotUHJvY2Vzc0VkaXRvcl9OYW1lPU5hbWUKLVByb2Nlc3NFZGl0b3JfUHJlc2VudGF0aW9uTmFtZT1QcmVzZW50YXRpb24gTmFtZQotUHJvY2Vzc0VkaXRvcl9JbmRleD1JbmRleAotUHJvY2Vzc0VkaXRvcl9QcmVkZWNlc3NvcnM9UHJlZGVjZXNzb3JzCi0jQ29uZmlndXJhdGlvblBhZ2VfU2VsZWN0ZWQ9U2VsZWN0ZWQ6IAotQ2hlY2tsaXN0T3JkZXJfZGVzY3JpcHRpb249U2VsZWN0IGEgY2hlY2sgaXRlbSBhbmQgY2xpY2sgVXAgb3IgRG93biB0byBjaGFuZ2UgaXRzIG9yZGVyLgotRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQ9UmVuYW1pbmcuLi4KLVByb2Nlc3NFZGl0b3JfTW9kZWxJbmZvPU1vZGVsIEluZm8KLVByb2Nlc3NFZGl0b3JfUHJlZml4PVByZWZpeAotTW92ZURpYWxvZ19tb3ZlX3RleHQ9TW92ZQotQXNzaWduRGlhbG9nX2Fzc2lnbl90ZXh0PUFzc2lnbgotQXNzaWduRGlhbG9nX3JlYXNzaWduX3RleHQ9UmVhc3NpZ24KLUNoZWNrbGlzdE9yZGVyX3RpdGxlPU9yZGVyIENoZWNrIEl0ZW1zCi1Qcm9jZXNzRWRpdG9yX1JlcGV0YWJsZT1SZXBlYXRhYmxlCi1Qcm9jZXNzRWRpdG9yX09uZ29pbmc9T25nb2luZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3luY2hyb25pemF0aW9uPVN5bmNocm9uaXplLi4uCi1Qcm9jZXNzRWRpdG9yX0V2ZW50RHJpdmVuPUV2ZW50LURyaXZlbgotUHJvY2Vzc0VkaXRvcl9EZWxpdmVyYWJsZT1EZWxpdmVyYWJsZQotUHJvY2Vzc0VkaXRvcl9PcHRpb25hbD1PcHRpb25hbAotRmlsdGVyRGlhbG9nX1R5cGVfdGV4dD1NZXRob2QgRWxlbWVudCBUeXBlOgotRmlsdGVyRGlhbG9nX0V4cGFuZEFsbD1FeHBhbmQgQWxsCi1Nb3ZlRGlhbG9nX21vdmluZ190ZXh0PU1vdmluZy4uLgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZz1JVVBBMDAyNVc6IFNoYXBlIGljb24gZm9yIHswfSBpcyBub3QgZm91bmQgaW4gcGF0aDogezF9Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWRTaGFwZUljb25FcnJvcj1JVVBBMDAyNUU6IEVycm9yOiBTaGFwZSBpY29uIHNlY3Rpb246IHswfQotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9OYW1lTGFiZWw9TmFtZToKLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi1BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfTmFtZUxhYmVsPU5hbWU6Ci1BdXRob3JpbmdVSVBsdWdpbl9uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgQ29uZmlndXJhdGlvbgotbmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZT1OZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24KLXByZWZlcmVuY2VfV29ya0JyZWFrZG93bkVsZW1lbnRzPVBoYXNlLCBJdGVyYXRpb24sIEFjdGl2aXR5IGFuZCBNaWxlc3RvbmUKLXByZWZlcmVuY2VfRGVzY3JpcHRvckVsZW1lbnRzPVJvbGUsIFRhc2sgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1wcmVmZXJlbmNlX2JyZWFrRG93bkVsZW1lbnRfRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHdpbGwgYmUgc2VsZWN0ZWQgYnkgZGVmYXVsdCBpbiB0aGUgcHJvY2VzcyBlZGl0b3I6Ci1wcmVmZXJlbmNlX0FjdGl2aXR5X0RpYWdyYW09QWN0aXZpdHkgRGlhZ3JhbSAKLXByZWZlcmVuY2VfQWN0aXZpdHlfRGV0YWlsX0RpYWdyYW09QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLQotIyBOZXcgTWV0aG9kIExpYnJhcnkgV2l6YXJkCi1uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlPU5ldyBNZXRob2QgTGlicmFyeQotbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlPUNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLW5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbj1TcGVjaWZ5IGEgcGF0aCBhbmQgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0jbmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uXzE9U3BlY2lmeSBhIG5hbWUsIGRlc2NyaXB0aW9uIGFuZCBzdG9yYWdlIHR5cGUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkuCi1saWJyYXJ5UGF0aExhYmVsX3RleHQ9UGF0aDoKLWxpYnJhcnlUeXBlTGFiZWxfdGV4dD1UeXBlOgotCi1BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlPVNhdmUgY2hhbmdlcwotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbj1PbmUgb3IgbW9yZSBtZXRob2QgZWxlbWVudHMgaGF2ZSBiZWVuIG1vZGlmaWVkLiBTZWxlY3QgdGhlIG9uZXMgdGhhdCBuZWVkIHRvIGJlIHNhdmVkLgotQXV0aG9yaW5nVUlQbHVnaW5fT3BlbkNvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGU9T3BlbiBNZXRob2QgQ29uZmlndXJhdGlvbnMKLUF1dGhvcmluZ1VJUGx1Z2luX09wZW5Db25maWd1cmF0aW9uV2l6YXJkX3dpbmRvd1RpdGxlPU9wZW4gTWV0aG9kIENvbmZpZ3VyYXRpb25zCi1FbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dD1SZXBsYWNpbmcgezB9Li4uCi1EZXNjcmlwdGlvbkZvcm1QYWdlX0xvYWROb2RlSWNvbldhcm5pbmc9SVVQQTAwMjZXOiBOb2RlIGljb24gZm9yIHswfSBpcyBub3QgZm91bmQgaW4gcGF0aDogezF9Ci0jTWVzc2FnZUxhYmVsUHJvdmlkZXJfdW5zZWxlY3RlZHBhY2thZ2VzPScnezB9JycgY29udGFpbnMgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgZWxlbWVudHMgaW4gdW5zZWxlY3RlZCBwYWNrYWdlcwotRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvcj1JVVBBMDAyNkU6IEVycm9yOiBOb2RlIGljb24gc2VjdGlvbjogezB9Ci1TdGVwc09yZGVyRGlhbG9nX3N0ZXBzPVN0ZXBzOiAKLVN0ZXBzT3JkZXJEaWFsb2dfdGl0bGU9T3JkZXIgVGFzayBTdGVwcwotUHJvY2Vzc0VkaXRvcl9QbGFubmVkPVBsYW5uZWQKLXNwZWNpZnlkaXJlY3RvcnlfdGV4dD1QbGVhc2Ugc3BlY2lmeSBhIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBtZXRob2QgbGlicmFyeSB0bwotUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzPU11bHRpcGxlIE9jY3VycmVuY2VzCi1Qcm9jZXNzRWRpdG9yX0VudHJ5U3RhdGU9RW50cnkgU3RhdGUKLVByb2Nlc3NFZGl0b3JfRXhpdFN0YXRlPUV4aXQgU3RhdGUKLXNlbGVjdENvbHVtbnN0b0FkZF90ZXh0PVNlbGVjdCB0aGUgY29sdW1ucyB0byBhZGQKLVByb2Nlc3NFZGl0b3JfVHlwZT1UeXBlCi1Qcm9jZXNzRWRpdG9yX1RlYW09VGVhbQotRmlsdGVyRGlhbG9nX3RpdGxlPVNlbGVjdCBEaWFsb2c6IAotCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGQ9JkFkZCBmcm9tIE1ldGhvZCBDb250ZW50Li4uCi1GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGw9Q29sbGFwc2UgQWxsCi1PcGVuQ2hlYXRzaGVldFZpZXdfdGl0bGU9T3BlbiBDaGVhdFNoZWV0IFZpZXcKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcD1SJm9sbCBVcAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd249UiZvbGwgRG93bgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwPSZNb3ZlIFVwCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Nb3ZlRG93bj1Nb3ZlIERvJnduCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9JbmRlbnQ9JkluZGVudAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3V0ZGVudD0mT3V0ZGVudAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsPVJldmUmYWwKLVByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlPVJldmVhbAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weT0mQ29weS4uLgotRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dD1OYW1lIHBhdHRlcm5zIChtYXRjaGluZyBuYW1lcyB3aWxsIGJlIHNob3duKTogCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9QcmVmZXJlbmNlcz1QcmVmZXJlbmNlJnMuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdGl0bGU9TWV0aG9kIExpYnJhcnk6IAotI01lc3NhZ2VWaWV3X3NlbGVjdGVkX3RleHQ9U2VsZWN0ZWQ6IAotTWVzc2FnZVZpZXdfZXJybXNnX3RleHQ9RGVzY3JpcHRpb24KLUVsZW1lbnRzVmlld19lcnJfc2F2aW5nPUlVUEEwMDI3RTogRXJyb3Igc2F2aW5nICcnezB9Jyd7MX0KLQotZXJyX2NvcHlpbmdfZmlsZV90aXRsZT1FcnJvciBjb3B5aW5nIGZpbGUKLWVycl9jb3B5aW5nX2ZpbGVfZXJyb3I9SVVQQTAwMjhFOiBUaGUgaWNvbiBjb3VsZCBub3QgYmUgYXNzaWduZWQuIAotZXJyX2NvcHlpbmdfZmlsZV9yZWFzb249QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29weWluZyB0aGUgc2VsZWN0ZWQgZmlsZS4gQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWVycl9wcm9jZXNzaW5nX2ZpbGVfdGl0bGU9RXJyb3IgcHJvY2Vzc2luZyBmaWxlCi1lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwPUVkaXQgY29uZmlndXJhdGlvbgotZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0PUlVUEEwMDE1RTogQ2Fubm90IGVkaXQgZWxlbWVudAotU2F2ZVRoaXNBY3Rpb25fc2F2ZW9iamVjdD1TYXZlIFRoaXMgT2JqZWN0Li4uCi1FbGVtZW50c1ZpZXdfcmVwbGFjZV90ZXh0PVJlcGxhY2UKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0V4dGVuZD0mRXh0ZW5kLi4uCi1Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQ9Q2hvb3NlIGRlc3RpbmF0aW9uIGZvciBzZWxlY3RlZCBlbGVtZW50KHMpOgotY2hvb3NlRGVmYXVsdERpcmVjdG9yeV90ZXh0PUNob29zZSBhIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBsaWJyYXJpZXM6Ci1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcz0mU3VwcHJlc3MKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMj0mUHVibGlzaGluZyBPcHRpb25zLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Bc3NpZ25Vc2VyRGlhZ3JhbT0mVXNlciBEZWZpbmVkIERpYWdyYW1zLi4uCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdGl0bGU9QXNzaWduIHVzZXIgZGVmaW5lZCBkaWFncmFtcwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2U9QWN0aXZpdHkgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hZGRJbWFnZT1BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbToKLVVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZT1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtOgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX25vdGFGaWxlPUlVUEEwMDA0RTogVGhlIHNwZWNpZmllZCBwYXRoIGlzIG5vdCBhIGZpbGUuCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uPVNlbGVjdC4uLgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2VudGVyZWRJbWFnZU5vdEZvdW5kPUlVUEEwMDI0RTogVGhlIHNwZWNpZmllZCBpbWFnZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgbGlicmFyeS4gTWFrZSBzdXJlIHlvdSBlbnRlciB0aGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSdzIHJvb3QgZGlyZWN0b3J5LgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3NlbGVjdGVkSW1hZ2VOb3RGb3VuZD1JVVBBMDAzMEU6IFRoZSBpbWFnZSB5b3Ugc2VsZWN0ZWQgaXMgbm90IGluIHRoZSBsaWJyYXJ5LgotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZUFESW1hZ2U9VXNlIEFjdGl2aXR5IGRpYWdyYW0gaW1hZ2UgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi1Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2U9VXNlIEFjdGl2aXR5IGRldGFpbCBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlPVVzZSBXb3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtIGltYWdlIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29udHJpYnV0ZT0mTG9jYWwgQ29udHJpYnV0aW9uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlPUxvY2FsIFJlcGxhY2VtZW4mdAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fRGlhZ3JhbXM9RGlhJmdyYW1zCi1Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weT0mRGVlcCBDb3B5Li4uCi1GaWx0ZXJEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1CcmllZiBEZXNjcmlwdGlvbjoKLUNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwPVNob3cvSGlkZSBVbmNoZWNrZWQgRWxlbWVudHMKLUNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uPURlc2NyaXB0aW9uOgotQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGljaz1SZS1jYWxjdWxhdGUgZXJyb3JzIHdoZW5ldmVyIGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZAotQ29uZmlndXJhdGlvblBhZ2VfdXBkYXRlT25DbGlja1Rvb2xUaXA9UmUtY2FsY3VsYXRlIGVycm9ycyB3aGVuZXZlciBjb25maWd1cmF0aW9uIGlzIGNoYW5nZWQKLUNvbmZpZ3VyYXRpb25QYWdlX25vVXBkYXRlT25DbGljaz1SZS1jYWxjdWxhdGUgZXJyb3JzIG9ubHkgd2hlbiBSZWZyZXNoIGJ1dHRvbiBpcyBjbGlja2VkIGFuZCB3aGVuIHNhdmluZwotQ29uZmlndXJhdGlvblBhZ2Vfbm9VcGRhdGVPbkNsaWNrVG9vbFRpcD1SZS1jYWxjdWxhdGUgZXJyb3JzIG9ubHkgd2hlbiBSZWZyZXNoIGJ1dHRvbiBpcyBjbGlja2VkIGFuZCB3aGVuIHNhdmluZwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGw9UHVibGlzaCAmTm9uZQotRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb249UGF0dGVybnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYSwgd2hlcmUgKj1hbnkgc3RyaW5nLCA/PWFueSBjaGFyYWN0ZXIKLUNvbmZpZ3VyYXRpb25QYWdlX1RyZWVUaXRsZUxhYmVsPUNvbnRlbnQ6Ci1Db25maWd1cmF0aW9uUGFnZV9Mb2FkaW5nTWVzc2FnZT1Mb2FkaW5nIGNvbmZpZ3VyYXRpb24sIHBsZWFzZSB3YWl0IC4uLgotQ29uZmlndXJhdGlvblBhZ2VfQWRkQ2F0ZWdvcmllc1RpdGxlTGFiZWw9QWRkIHRoZXNlIENhdGVnb3JpZXM6Ci1Db25maWd1cmF0aW9uUGFnZV9TdWJDYXRlZ29yaWVzVGl0bGVMYWJlbD1TdWJ0cmFjdCB0aGVzZSBDYXRlZ29yaWVzOgotTW92ZURpYWxvZ192YWxpZGRlc3RpbmF0aW9uX3RleHQ9VGhlIHNwZWNpZmllZCBtb3ZlIGRlc3RpbmF0aW9uIGlzIGludmFsaWQuCi1Nb3ZlRGlhbG9nX2Nhbm5vdE1vZGlmeURlc3RpbmF0aW9uPUlVUEEwMDM0RTogVGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uIGNhbm5vdCBiZSBtb2RpZmllZC4KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbD1QdWJsaXNoIEEmbGwKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5CYXNlQWN0aXZpdHk9T3BlbiAmQmFzZSBBY3Rpdml0eQotUHJvY2Vzc0Zvcm1FZGl0b3JfZXhwYW5BbGxBY3Rpb25MYWJlbD1FJnhwYW5kIEFsbAotUHJvY2Vzc0Zvcm1FZGl0b3JfY29sbGFwc2VBbGxBY3Rpb25MYWJlbD1DbyZsbGFwc2UgQWxsCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtPU9wZW4gJkFjdGl2aXR5IERpYWdyYW0KLVByb2Nlc3NFZGl0b3JfcHJvbXB0VG9EZWxldGVCZWZvcmVSZXZlYWw9VGhlIHVuc3VwcHJlc3NlZCBkZXNjcmlwdG9ycyBsaXN0ZWQgaW4gRGV0YWlscyBtdXN0IGJlIGRlbGV0ZWQgdG8gYXZvaWQgZHVwbGljYXRpb24gYWZ0ZXIgcmV2ZWFsaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZW0gYW5kIGNvbnRpbnVlLgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX1NlbGVjdENvbHVtbnM9U2VsZWN0IHRoZSBjb2x1bW5zIHRvIGFkZAotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT1PcGVuIEFjdGl2aXR5ICZEZXRhaWwgRGlhZ3JhbQotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX0NvbHVtblNlbGVjdGlvbj1Db2x1bW4gc2VsZWN0aW9uOgotUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N3aXRjaENvbmZpZ3VyYXRpb249U3dpdGNoIHRvIHRoZSBQcm9jZXNzJyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2hlbiBhY3RpdmF0aW5nIGEgUHJvY2VzcyBlZGl0b3IKLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zdXBwcmVzc2lvbkdyb3VwVGl0bGU9U3VwcHJlc3Npb24KLVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9pbmhlcml0U3VwcHJlc3Npb25TdGF0ZT1Jbmhlcml0IHN1cHByZXNzaW9uIHN0YXRlcwotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW09T3BlbiAmV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWw9Q2xlYXIKLURlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsPVNlbGVjdC4uLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5zZXJ0TmV3UGhhc2U9SW5zZXJ0IE5ldyBQaGFzZQotVmlld0hlbHBlcl9yZWxvYWRMaWJPblJvbGxiYWNrRXJyb3I9Q291bGQgbm90IHJlY292ZXIgZnJvbSBhIHBlcnNpc3RlbmNlIGVycm9yLiBUaGUgbGlicmFyeSBuZWVkcyB0byBiZSByZWxvYWRlZCB0byByZXN0b3JlIGl0cyBvcmlnaW5hbCBzdGF0ZS4KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRfdGV4dD1UaGUgZWxlbWVudCAnJ3swfScnIGlzIGFscmVhZHkgZGVsZXRlZC4KLVZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQ9VGhlIGVsZW1lbnQgJyd7MH0nJyBpcyBhbHJlYWR5IGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcnezF9Jyc/Ci1Db25maWd1cmF0aW9uUGFnZV9BZGRNaXNzaW5nVG9vbFRpcD1GaXggZXJyb3JzIGFuZCB3YXJuaW5ncwotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb249RGVzY3JpcHRpb24KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkdlbmVyYWxJbmZvPUdlbmVyYWwgSW5mb3JtYXRpb24gCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BcHBseVBhdHRlcm49QXBwbHkgUGEmdHRlcm4KLU1vdmVEaWFsb2dfc2VsZWN0ZGVzdGluYXRpb25fdGV4dD1QbGVhc2Ugc2VsZWN0IGEgZGVzdGluYXRpb24uCi1Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZz1ObyBtb3ZlIGRlc3RpbmF0aW9uIHNwZWNpZmllZC4KLU1ldGhvZExpYnJhcnlFZGl0b3JfdHJvdWJsZW9iamVjdD0uIFRyb3VibGUgb2JqZWN0OiAKLU1lc3NhZ2VMYWJlbFByb3ZpZGVyX2VycmNoaWxkcGtncz1BIGNoaWxkIGNvbnRlbnQgcGFja2FnZSBvciBwcm9jZXNzIGNvbnRhaW5zIGVsZW1lbnRzIHdpdGggbWlzc2luZyByZWZlcmVuY2VzCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlPURpYWdyYW0gUHVibGlzaGluZyBPcHRpb25zCi1Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX01lc3NhZ2U9UGxlYXNlIHNlbGVjdCB0aGUgZGlhZ3JhbShzKSB0byBwdWJsaXNoIG9yIGRlc2VsZWN0IHRvIG5vdCBwdWJsaXNoCi1Qcm9jZXNzRWRpdG9yX1RpdGxlPVByb2Nlc3MgRWRpdG9yOiAKLVNhdmVBc3dpdGhkb3RzX3RleHQ9U2F2ZSBBcy4uLgotUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlPVdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZQotUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbj1UZWFtIEFsbG9jYXRpb24KLVByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZT1Xb3JrIFByb2R1Y3QgVXNhZ2UKLVByb2Nlc3NFZGl0b3JfQ29uc29saWRhdGVkVmlldz1Db25zb2xpZGF0ZWQgVmlldwotUHJvY2Vzc0VkaXRvcl9jb25maXJtQXV0b1N5bmNoPVRoaXMgb3BlcmF0aW9uIHJlZnJlc2hlcyB0aGUgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgb3IgYWxsIGRlc2NyaXB0b3JzIGJlbG93IHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyAiU3luY2hyb25pemVkIHdpdGggc291cmNlIiBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlaXIgUHJvcGVydGllcyB2aWV3LiAgSXQgcmVmcmVzaGVzIHRoZXNlIGRlc2NyaXB0b3JzIHdpdGggdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgb2YgdGhlIGxpbmtlZCBtZXRob2QgY29udGVudCBlbGVtZW50cyB1bmRlciB0aGUgcHJvY2VzcycgZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgTm90ZSB0aGF0IGl0IHdpbGwgbm90IHVwZGF0ZSBhbnkgZHluYW1pY2FsbHkgbGlua2VkIChncmVlbiBpdGFsaWMpIGRlc2NyaXB0b3JzLiAgRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLVByb2Nlc3NFZGl0b3JfZGVmYXVsdFN5bmNocm9uaXphdGlvbj1EZWZhdWx0IFN5bmNocm9uaXphdGlvbiBmcm9tIG1ldGhvZCBjb250ZW50Ci1Db25maWd1cmF0aW9uUGFnZV9EZXNjcmlwdGlvbjE9Q29uZmlndXJhdGlvbgotQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yPVBsdWctaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uCi1OZXdMaWJyYXJ5RGlhbG9nX25ld2xpYnJhcnlfYXM9Q3JlYXRlIE5ldyBMaWJyYXJ5IEFzCi1OZXdQbHVnaW5EaWFsb2dfbmV3cGx1Z2luX3RleHQ9TmV3IE1ldGhvZCBQbHVnLWluCi1TZWxlY3RFbGVtZW50RGlhbG9nX3RpdGxlX3RleHQ9U2VsZWN0IHRoZSBlbGVtZW50IG9yIG9uZSBvZiBpdHMgY29udHJpYnV0b3JzOgotT3BlbkNvbmZpZ0RpYWxvZ25ld2NvbmZpZ190ZXh0PU5ldyBDb25maWd1cmF0aW9uOgotcHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yPVByb2Nlc3MgRWRpdG9yCi0KLSMgQWJzdHJhY3REaWFncmFtRWRpdG9yCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQ9QWxpZ24KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfZm9ybWF0VGV4dEJveEFjdGl2aXR5X3RleHQ9Rm9ybWF0IFRleHQgQm94Li4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PUhvcml6b250YWxseSB0byBGaXJzdCBTZWxlY3RlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1WZXJ0aWNhbGx5IHRvIEF2ZXJhZ2UKLU1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGU9R2VuZXJhbCBJbmZvcm1hdGlvbgotTW92ZURpYWxvZ19pbnZhbGlkX21vdmVfZGVzdGluYXRpb25fcHJvYmxlbV9tc2c9SVVQQTAwNDFFOiBUaGUgc2VsZWN0ZWQgZWxlbWVudChzKSBjYW5ub3QgYmUgbW92ZWQgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KLU1ldGhvZExpYnJhcnlFZGl0b3Jfc2F2ZW1vZGVsbGlicmFyeT1TYXZpbmcgbW9kZWwgbGlicmFyeSAuLi4KLU1ldGhvZExpYnJhcnlFZGl0b3JfZXJyb3JfZGlhbG9nX3RpdGxlPUVycm9yCi1NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVfbGlicmFyeV9wcm9ibGVtX21zZz1JVVBBMDAzM0U6IFByb2JsZW0gZW5jb3VudGVyZWQgaW4gc2F2aW5nIGxpYnJhcnkuCi1NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dD1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0PUNvbnRlbnQgRWxlbWVudHM6IAotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9Ccm93c2VCdXR0b25MYWJlbD1Ccm93c2UuLi4KLUF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlRGVzY3JpcHRpb249U3BlY2lmeSBhIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VUaXRsZT1TYXZlIGNoYW5nZXMgYW5kIGNsb3NlIGFsbCBlZGl0b3JzCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2F2ZQotQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dD1BdHRhY2ggRmlsZQotQXR0YWNobWVudERpYWxvZ2F0dGFjaFVybF90ZXh0PUF0dGFjaCBVcmwKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnQ9Q29uZmlndXJhdGlvbiBDb250ZW50Ci1PcGVuQ29uZmlnRGlhbG9nb3BlbmNvbmZpZ190ZXh0PU9wZW4gQ29uZmlndXJhdGlvbgotRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dD1SZXBsYWNlLi4uCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfU2F2ZV9tZXNzYWdlPVNhdmluZyB7MH0KLUNvbmZpZ3VyYXRpb25QYWdlX1Nob3dFcnJvclRvb2xUaXA9U2hvdyBjb25maWd1cmF0aW9uIGVycm9ycwotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRm9ybVByZWZpeD1Db25maWd1cmF0aW9uOiAKLUNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQ9Q2hlY2sgSXRlbXM6IAotQWJzdHJhY3REaWFncmFtRWRpdG9yX01vdmVOb2RlX2xhYmVsPU1vdmUgTm9kZQotQ29uZmlndXJhdGlvblBhZ2VfTWFrZUNsb3N1cmVUb29sVGlwPUZpeCBlcnJvcnMKLUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZ19kZXNjcmlwdGlvbj1PcmRlciBOYXZpZ2F0aW9uIFZpZXdzCi1OZXdQbHVnaW5EaWFsb2dfcmVmZXJlbmNlcGx1Z2luX3RleHQ9UmVmZXJlbmNlIFBsdWctaW5zOgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2NyZWF0ZUZyZWVUZXh0X3RleHQ9Q3JlYXRlIGEgRnJlZSBUZXh0Ci1EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbD1Ob2RlIEljb24gUHJldmlldzoKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9jYW5ub3RfY29ubmVjdF90ZXh0PUlVUEEwMDMyVzogQ2Fubm90IGNvbm5lY3QKLURpYWdyYW1WYWxpZGF0aW9uX2Vycl9zYW1lcHJlZGFuZHN1Y190ZXh0PUlVUEEwMDMzVzogQ2Fubm90IGhhdmUgdGhlIHNhbWUgYnJlYWtkb3duIGVsZW1lbnQgYXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvcgotCi0jIEVkaXRvckNob29zZXIKLUVkaXRvckNob29zZXJfbG9hZGRFcnJvckRsZ1RpdGxlPU9wZW4gRWRpdG9yCi1FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yPVRoaXMgZWxlbWVudCBoYXMgZXJyb3JzLiBJdCBpcyByZWNvbW1lbmRlZCB0byBmaXggdGhlc2UgZXJyb3JzIGJlZm9yZSBjb250aW51aW5nIChzZWUgZGV0YWlscykuXG5cbkNsaWNrIE9LIHRvIGNvbnRpbnVlIHdpdGhvdXQgb3BlbmluZyB0aGUgZWRpdG9yLiBDbG9zZSB0aGlzIGRpYWxvZyB0byBvcGVuIHRoZSBlZGl0b3IuCi1Db25maWd1cmF0aW9uUGFnZV9Gb3JtUHJlZml4PUNvbmZpZ3VyYXRpb246IAotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uTmFtZT1OYW1lOgotQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dD1GaWxlIFVSTDoKLVN0ZXBzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb249U2VsZWN0IGEgc3RlcCBhbmQgY2xpY2sgVXAgb3IgRG93biB0byBjaGFuZ2UgaXRzIG9yZGVyLgotTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJfc2F2ZT1FcnJvciBkdXJpbmcgc2F2aW5nCi1NZXNzYWdlVmlld19lcnJlbGVtZW50X3RleHQ9UmVmZXJlbmNpbmcgRWxlbWVudAotTWVzc2FnZVZpZXdfcmVmZWxlbWVudF90ZXh0PVJlZmVyZW5jZWQgRWxlbWVudAotCi0jQWN0aXZpdHkgRGlhZ3JhbQotQWN0aXZpdHlEaWFncmFtRWRpdG9yX2NyZWF0ZVN0YXJ0Tm9kZV90ZXh0PUNyZWF0ZSBhIFN0YXJ0IE5vZGUKLUNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbj1TZWxlY3QgdGhlIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi1Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbl90ZXh0PU9yZGVyIGRpYWxvZwotQXV0aG9yaW5nVUlQbHVnaW5fQWJzdHJhY3ROZXdMaWJyYXJ5UGFnZV9EaXJlY3RvcnlMYWJlbD1EaXJlY3Rvcnk6Ci1Sb290UHJlZlBhZ2VfZW5hYmxlcHJvY2Vzc2NvbnRyaWJ1dGlvbl90ZXh0PUVuYWJsZSBQcm9jZXNzIENvbnRyaWJ1dGlvbgotQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dD1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtZXRob2QgY29uZmlndXJhdGlvbi4KLUNvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbkRlc2NyaXB0aW9uTGFiZWw9RGVzY3JpcHRpb246Ci1Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfTmF2aWdhdGlvblZpZXdzPU5hdmlnYXRpb24gVmlld3M6IAotQ29udHJpYnV0aW9uU2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1DaG9vc2luZyBDb250cmlidXRvcnMgZm9yICcnezB9JycKLUVsZW1lbnRzVmlld19vcGVuVmFyaWFiaWxpdHlEaWFsb2dBY3Rpb25fdGV4dD0mT3BlbiB2aWEgdmFyaWFiaWxpdHkgZWxlbWVudHMKLVZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZT1jaG9vc2luZyB2YXJpYWJpbGl0eSBlbGVtZW50cyBmb3IgJyd7MH0nJwotVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsPVZhcmlhYmlsaXR5IGVsZW1lbnRzIGZvciAnJ3swfScnCi1EZXNjcmlwdGlvbkZvcm1QYWdlX1NoYXBlSWNvblByZXZpZXdfTGFiZWw9U2hhcGUgSWNvbiBQcmV2aWV3OgotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9kZWxldGVfdGV4dD1DYW5ub3QgZGVsZXRlCi1BY3Rpdml0eURpYWdyYW1FZGl0b3Jfb3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV90ZXh0PU9wZW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi1NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZV9zZWN0aW9uX2Rlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1ldGhvZCBsaWJyYXJ5LgotRGVzY3JpcHRpb25Gb3JtUGFnZV9Ob2RlSWNvblByZXZpZXdfQ2xlYXJCdXR0b25MYWJlbD1DbGVhcgotV1BDb21wYXJ0bWVudEZpZ3VyZV8wPU5ldyBXb3JrUHJvZHVjdCBEZXNjcmlwdG9yCi1wcm9tcHRmb3JfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZF90ZXh0PVB1Ymxpc2ggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBjcmVhdGVkIGluIHByb2Nlc3MgZWRpdG9yCi1wcm9tcHRfZm9yX3B1Ymxpc2hfZXh0ZW5kX2FjdGl2aXR5X2RpYWdyYW09UHVibGlzaCBhY3Rpdml0eSBkaWFncmFtcyBmb3IgdW5tb2RpZmllZCBhY3Rpdml0eSBleHRlbnNpb25zCi0KLSNDb25maWdQcm9jZXNzVmlld0RpYWxvZwotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfTmFtZVBhdHRlcm49TmFtZSBwYXR0ZXJucyAobWF0Y2hpbmcgbmFtZXMgd2lsbCBiZSBzaG93bik6Ci1zaG93SW5SZXNvdXJjZU5hdmlnYXRvckFjdGlvbl9sYWJlbD0mU2hvdyBpbiBSZXNvdXJjZSBOYXZpZ2F0b3IKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1BhdHRlcm49UGF0dGVybnMgYXJlIHNlcGFyYXRlZCBieSBjb21tYSwgd2hlcmUgKj1hbnkgc3RyaW5nLCA/PWFueSBjaGFyYWN0ZXIKLWVycl9wcm9jZXNzaW5nX2ZpbGVfZGVzY3JpcHRpb249SVVQQTAwMjlFOiBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBzZWxlY3RlZCBmaWxlLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQ2F0ZWdvcnlUeXBlPUNhdGVnb3J5IFR5cGUgOgotQ29uZmlnUHJvY2Vzc1ZpZXdEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbj1CcmllZiBEZXNjcmlwdGlvbjoKLUNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXM9U2VsZWN0IENhdGVnb3JpZXMKLQotI2xvZyBtZXNzYWdlcwotY2hlYXRzaGVldF9sb2FkX2ZhaWx1cmVfbG9nX21zZz1GYWlsZWQgdG8gb3BlbiB0aGUgcmVxdWVzdGVkIGNoZWF0c2hlZXQ6IAotCi1uZXdDb25maWd1cmF0aW9uV2lyYXpkX2NyZWF0ZUVycm9yPUlVUEEwMDM1RTogVGhlIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Ci1uZXdQbHVnaW5XaXphcmRfY3JlYXRlRXJyb3I9SVVQQTAwMzZFOiBUaGUgcGx1Zy1pbiBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLWVycm9yRGlhbG9nX21vdmVFcnJvcj1JVVBBMDAzN0U6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSBtb3ZlZCBzdWNjZXNzZnVsbHkKLXJlbmFtZURpYWxvZ19yZW5hbWVFcnJvcj1JVVBBMDAzOEU6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSByZW5hbWVkIHN1Y2Nlc3NmdWxseQotZXJyb3JEaWFsb2dfY3JlYXRlRXJyb3I9SVVQQTAwMzlFOiBUaGUgZWxlbWVudCBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkKLWR1cGxpY2F0ZVBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQQTAxMDFFOiBUaGUgbmFtZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzLiBFbnRlciBhIGRpZmZlcmVudCBuYW1lIGFuZCB0cnkgYWdhaW4uCi0KLSNOZXcgU3RyaW5ncyBmb3IgUHJvY2Vzc0VkaXRvciBDb250ZXh0IG1lbnUgZGlhZ3JhbSBpbWFnZXMKLVByb2Nlc3NFZGl0b3JfQWN0aW9uX0FkZEFESW1hZ2U9QXNzaWduIEFEIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlPVJlZnJlc2ggRXJyb3IKLVByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yTXNnPUVycm9yIHJlZnJlc2hpbmcgZWRpdG9yCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRBRERJbWFnZT1Bc3NpZ24gQUREIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9BZGRXUERJbWFnZT1Bc3NpZ24gV1BEIEltYWdlLi4uCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VBREltYWdlSW5QdWJsaXNoaW5nPVVzZSBBRCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX3Byb21wdFRvRGVsZXRlQmVmb3JlU3VwcHJlc3M9VGhlIHN1cHByZXNzZWQgZGVzY3JpcHRvcnMgbGlzdGVkIGluIERldGFpbHMgbXVzdCBiZSBkZWxldGVkIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGFmdGVyIHN1cHByZXNzaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cy4gQ2xpY2sgT0sgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZW0gYW5kIGNvbnRpbnVlLgotUHJvY2Vzc0VkaXRvcl9BY3Rpb25fVXNlQURESW1hZ2VJblB1Ymxpc2hpbmc9VXNlIEFERCBJbWFnZSBpbiBQdWJsaXNoaW5nCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9Vc2VXUERJbWFnZUluUHVibGlzaGluZz1Vc2UgV1BEIEltYWdlIGluIFB1Ymxpc2hpbmcKLVByb2Nlc3NFZGl0b3JfRGlhZ3JhbUltYWdlX0lucHV0RGlhbG9nX2luaXRpYWxWYWx1ZT1JbWFnZSBQYXRoCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TaG93TGlua2VkRWxlbWVudGluTGlicmFyeVZpZXc9UyZob3cgTGlua2VkIEVsZW1lbnQgaW4gTGlicmFyeSBWaWV3Ci1Qcm9jZXNzRWRpdG9yX3VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb25fbGFiZWw9VXBkYXRlIFN1cHByZXNzaW9uIGZyb20gJkJhc2UKLVByb2Nlc3NFZGl0b3JfQ29udGV4dE1lbnVfRGlhZ3JhbUltYWdlcz1EaWFncmFtIEltYWdlcwotCi0jU3RyaW5ncyBmb3Igc3luY2hyb25pemF0aW9uIHdpemFyZCBvbiBwcm9jZXNzIGVkaXRvcidzIEJTCi1zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlPVN5bmNocm9uaXphdGlvbiBEZXNjcmlwdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV90ZXh0PVJlYWQgdGhlIGluZm9ybWF0aW9uIGJlbG93IFwKLXRoYXQgZXhwbGFpbnMgd2hhdCBjdXN0b20gc3luY2hyb25pemF0aW9uIHdpbGwgYWNjb21wbGlzaC4KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlPVNlbGVjdCBDb25maWd1cmF0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0Q29uZmlnUGFnZV90ZXh0PVNlbGVjdCB0aGUgY29uZmlndXJhdGlvbiBcCi10aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbi4gIFlvdXIgc2VsZWN0aW9uIGRldGVybWluZXMgd2hpY2ggY29udHJpYnV0aW9ucyBhbmQgcmVwbGFjZW1lbnRzIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHN5bmNocm9uaXphdGlvbi4KLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX2NvbmZpZ0xhYmVsPUNvbmZpZ3VyYXRpb246Ci1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfdGl0bGU9U2VsZWN0IFByb3BlcnRpZXMgdG8gU3luY2hyb25pemUKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcm9wZXJ0aWVzX2xhYmxlPVByb3BlcnRpZXMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlPU5hbWUKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmVzZW50YXRpb25OYW1lX2xhYmxlPVByZXNlbnRhdGlvbiBOYW1lCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlPUJyaWVmIERlc2NyaXB0aW9uCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2Vfb3B0aW9uYWxJbm91dHNfbGFiZWw9T3B0aW9uYWwgSW5wdXRzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlPU1hbmRhdG9yeSBJbnB1dHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9vdXRwdXRzX2xhYmVsPU91dHB1dHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsPVByaW1hcnkgUGVyZm9ybWVyCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYWRkblBlcmZvcm1lcnNfbGFibGU9QWRkaXRpb25hbCBQZXJmb3JtZXJzCi1zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcmVzcG9uc2libGVSb2xlc19sYWJsZT1SZXNwb25zaWJsZSBSb2xlcwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsPUNvbnRhaW5lZCBBcnRpZmFjdHMKLXN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbD1EZWxpdmVyYWJsZSBQYXJ0cwotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsPVN0ZXBzIFNlbGVjdGlvbgotc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RleHQ9Q2hvb3NlIHRoZSBwcm9wZXJ0aWVzIG9mIFwKLXRoZSBtZXRob2QgY29udGVudCB0aGF0IHlvdSB3YW50IHRvIGJlIGNvbnNpZGVyZWQgZm9yIHN5bmNocm9uaXphdGlvbi4KLXN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZT1TeW5jaHJvbml6YXRpb24gUHJldmlldwotc3luY2hyb25pemF0aW9uV2l6YXJkX3ByZXZpZXdQYWdlX3RleHQ9UmV2aWV3IHRoZSBwcm9wb3NlZCBzeW5jaHJvbml6YXRpb24gZGV0YWlscyBiZWxvdy4KLXNlbGVjdEVkaXRvcnNUb0Rpc2NhcmRDb25mbGljdENoYW5nZXM9VGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyB0aGF0IGNvbmZsaWN0IHdpdGggY2hhbmdlcyBtYWRlIG91dHNpZGUgdGhlIGVkaXRvcnMuXG5TZWxlY3QgdGhlIGVkaXRvcnMgeW91IHdpc2ggdG8gZGlzY2FyZCB0aGVpciBjaGFuZ2VzLgotc3luY2hyb25pemF0aW9uV2l6YXJkX3RpdGxlX3RleHQ9U3luY2hyb25pemF0aW9uIFdpemFyZAotc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dD1UaGlzIHdpemFyZCBzdXBwb3J0cyB5b3UgaW4gcmVmcmVzaGluZyBcCi10aGUgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgb3IgYWxsIGRlc2NyaXB0b3JzIGJlbG93IHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBhcyBcCi0iU3luY2hyb25pemUgd2l0aCBTb3VyY2UiIGluIHRoZSBHZW5lcmFsIHRhYiBvZiB0aGVpciBQcm9wZXJ0aWVzIHZpZXcuICBPbmx5IHRoZSBwcm9wZXJ0aWVzIHRoYXQgeW91IFwKLXNlbGVjdCBpbiB0aGlzIHdpemFyZCBhcmUgcmVmcmVzaGVkIGluIHRoZSBkZXNjcmlwdG9ycy4gIFlvdSBjYW4gYWxzbyBzZWxlY3QgYW55IHZhbGlkIGNvbmZpZ3VyYXRpb24gXAotZm9yIHlvdXIgcHJvY2VzcyB0byBiZSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZSByZWZyZXNoLiAgTm90ZSB0aGF0IHRoZSB3aXphcmQgd2lsbCBub3QgdXBkYXRlIGFueSBcCi1keW5hbWljYWxseSBsaW5rZWQgKGdyZWVuIGl0YWxpYykgZGVzY3JpcHRvcnMuCi0KLW9wZW5SVEU9T3BlbiByaWNoIHRleHQgZWRpdG9yCi1jbG9zZVJURT1DbG9zZSByaWNoIHRleHQgZWRpdG9yCi0KLSNOZXcgU3RyaW5ncwotcm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJvbGUgc2V0LgotZGlzY2lwbGluZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2NpcGxpbmUuCi13b3JrcHJvZHVjdHR5cGVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB3b3JrIHByb2R1Y3Qga2luZC4KLWRvbWFpbnNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGRvbWFpbi4KLXRvb2xzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB0b29sLgotY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLQotY29uY2VwdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY29uY2VwdC4KLWNoZWNrbGlzdF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgY2hlY2tsaXN0LgotZXhhbXBsZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZXhhbXBsZS4KLWd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgZ3VpZGVsaW5lLgotcm9hZG1hcF9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcm9hZG1hcC4KLXJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIHJldXNhYmxlIGFzc2V0Lgotc3VwcG9ydGluZ21hdGVyaWFsX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyBzdXBwb3J0aW5nIG1hdGVyaWFsLgotcmVwb3J0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyByZXBvcnQuCi1wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgcHJhY3RpY2UuCi10ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVtcGxhdGUuCi10ZXJtZGVmaW5pdGlvbl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdG9vbG1lbnRvcl9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uPU1hbmFnZSB0aGUgZ3VpZGFuY2VzIHRoYXQgYmVsb25nIHRvIHRoaXMgdG9vbCBtZW50b3IuCi13aGl0ZXBhcGVyX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb249TWFuYWdlIHRoZSBndWlkYW5jZXMgdGhhdCBiZWxvbmcgdG8gdGhpcyB3aGl0ZXBhcGVyLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbj1NYW5hZ2UgdGhlIGd1aWRhbmNlcyB0aGF0IGJlbG9uZyB0byB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbi4KLQotI05ldyBTdHJpbmcgU2VjdGlvbiBEZXNjcmlwdGlvbgotcm9sZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvbGUuCi1yb2xlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZSByZWxhdGVzIHRvIGFub3RoZXIgcm9sZS4KLXJvbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZS4KLQotdGFza19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhc2suCi10YXNrX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRhc2suCi10YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdGFzayByZWxhdGVzIHRvIGFub3RoZXIgdGFzay4KLXRhc2tfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFzay4KLQotYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcnRpZmFjdC4KLWFydGlmYWN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotYXJ0aWZhY3RfdGFpbG9yaW5nU2VjdGlvbl9kZXNjPVByb3ZpZGUgdGFpbG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYXJ0aWZhY3QuCi1hcnRpZmFjdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGFydGlmYWN0IHJlbGF0ZXMgdG8gYW5vdGhlciBhcnRpZmFjdC4KLWFydGlmYWN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFydGlmYWN0LgotCi1vdXRjb21lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3V0Y29tZS4KLW91dGNvbWVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIG91dGNvbWUuCi1vdXRjb21lX25vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV90YWlsb3JpbmdTZWN0aW9uX2Rlc2M9UHJvdmlkZSB0YWlsb3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvdXRjb21lLgotb3V0Y29tZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIG91dGNvbWUgcmVsYXRlcyB0byBhbm90aGVyIG91dGNvbWUuCi1vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG91dGNvbWUuCi0KLWRlbGl2ZXJhYmxlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX25vdGF0aW9uU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGVsaXZlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLWRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYz1Qcm92aWRlIHRhaWxvcmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlbGl2ZXJhYmxlLgotZGVsaXZlcmFibGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyBkZWxpdmVyYWJsZSByZWxhdGVzIHRvIGFub3RoZXIgZGVsaXZlcmFibGUuCi1kZWxpdmVyYWJsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZWxpdmVyYWJsZS4KLQotZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUuCi1kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZGlzY2lwbGluZSByZWxhdGVzIHRvIGFub3RoZXIgZGlzY2lwbGluZS4KLWRpc2NpcGxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZS4KLQotZG9tYWluX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZG9tYWluLgotZG9tYWluX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRvbWFpbi4KLWRvbWFpbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRvbWFpbiByZWxhdGVzIHRvIGFub3RoZXIgZG9tYWluLgotZG9tYWluX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRvbWFpbi4KLQotd29ya3Byb2R1Y3R0eXBlX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB3b3JrIHByb2R1Y3Qga2luZCByZWxhdGVzIHRvIGFub3RoZXIgd29yayBwcm9kdWN0IGtpbmQuCi13b3JrcHJvZHVjdHR5cGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29yayBwcm9kdWN0IGtpbmQuCi0KLXJvbGVzZXRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLXJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZSBzZXQuCi1yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZSBzZXQgcmVsYXRlcyB0byBhbm90aGVyIHJvbGUgc2V0Lgotcm9sZXNldF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlIHNldC4KLQotdG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCi10b29sX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wuCi10b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgdG9vbCByZWxhdGVzIHRvIGFub3RoZXIgdG9vbC4KLXRvb2xfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbC4KLQotY29uY2VwdF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbmNlcHQuCi1jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbmNlcHQuCi1jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY29uY2VwdCByZWxhdGVzIHRvIGFub3RoZXIgY29uY2VwdC4KLWNvbmNlcHRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29uY2VwdC4KLQotY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2hlY2tsaXN0LgotY2hlY2tsaXN0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoZWNrbGlzdC4KLWNoZWNrbGlzdF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGNoZWNrbGlzdCByZWxhdGVzIHRvIGFub3RoZXIgY2hlY2tsaXN0LgotY2hlY2tsaXN0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoZWNrbGlzdC4KLQotZXhhbXBsZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4YW1wbGUuCi1leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGV4YW1wbGUuCi1leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgZXhhbXBsZSByZWxhdGVzIHRvIGFub3RoZXIgZXhhbXBsZS4KLWV4YW1wbGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXhhbXBsZS4KLQotZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGd1aWRlbGluZS4KLWd1aWRlbGluZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGd1aWRlbGluZSByZWxhdGVzIHRvIGFub3RoZXIgZ3VpZGVsaW5lLgotZ3VpZGVsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGd1aWRlbGluZS4KLQotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbiByZWxhdGVzIHRvIGFub3RoZXIgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9uLgotCi1wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByYWN0aWNlLgotcHJhY3RpY2VfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcHJhY3RpY2UuCi1wcmFjdGljZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHByYWN0aWNlIHJlbGF0ZXMgdG8gYW5vdGhlciBwcmFjdGljZS4KLXByYWN0aWNlX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByYWN0aWNlLgotCi1yZXBvcnRfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZXBvcnQuCi1yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwb3J0LgotcmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcmVwb3J0IHJlbGF0ZXMgdG8gYW5vdGhlciByZXBvcnQuCi1yZXBvcnRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwb3J0LgotCi1yZXN1YWJsZWFzc2V0X2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXN1YWJsZWFzc2V0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJldXNhYmxlIGFzc2V0LgotcmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJldXNhYmxlIGFzc2V0IHJlbGF0ZXMgdG8gYW5vdGhlciByZXVzYWJsZSBhc3NldC4KLXJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmV1c2FibGUgYXNzZXQuCi0KLXJvYWRtYXBfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2FkbWFwLgotcm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2FkbWFwLgotcm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHJvYWRtYXAgcmVsYXRlcyB0byBhbm90aGVyIHJvYWRtYXAuCi1yb2FkbWFwX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJvYWRtYXAuCi0KLXN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLXN1cHBvcnRpbmdtYXRlcmlhbF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwgcmVsYXRlcyB0byBhbm90aGVyIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3VwcG9ydGluZyBtYXRlcmlhbC4KLQotdGVtcGxhdGVfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZW1wbGF0ZS4KLXRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRlbXBsYXRlLgotdGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M9U3BlY2lmeSBob3cgdGhpcyB0ZW1wbGF0ZSByZWxhdGVzIHRvIGFub3RoZXIgdGVtcGxhdGUuCi10ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZW1wbGF0ZS4KLQotdGVybWRlZmluaXRpb25fZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB0ZXJtIGRlZmluaXRpb24uCi10ZXJtZGVmaW5pdGlvbl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRlcm0gZGVmaW5pdGlvbiByZWxhdGVzIHRvIGFub3RoZXIgdGVybSBkZWZpbml0aW9uLgotdGVybWRlZmluaXRpb25fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGVybSBkZWZpbml0aW9uLgotCi10b29sbWVudG9yX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi10b29sbWVudG9yX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvb2wgbWVudG9yLgotdG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHRvb2wgbWVudG9yIHJlbGF0ZXMgdG8gYW5vdGhlciB0b29sIG1lbnRvci4KLXRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdG9vbCBtZW50b3IuCi0KLXdoaXRlcGFwZXJfZGV0YWlsU2VjdGlvbl9kZXNjPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3aGl0ZXBhcGVyLgotd2hpdGVwYXBlcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3aGl0ZXBhcGVyLgotd2hpdGVwYXBlcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIHdoaXRlcGFwZXIgcmVsYXRlcyB0byBhbm90aGVyIHdoaXRlcGFwZXIuCi13aGl0ZXBhcGVyX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHdoaXRlcGFwZXIuCi0KLWRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lZ3JvdXBpbmdfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLWRpc2NpcGxpbmVncm91cGluZ192YXJpYWJpbGl0eVNlY3Rpb25fZGVzYz1TcGVjaWZ5IGhvdyB0aGlzIGRpc2NpcGxpbmUgZ3JvdXBpbmcgcmVsYXRlcyB0byBhbm90aGVyIGRpc2NpcGxpbmUgZ3JvdXBpbmcuCi1kaXNjaXBsaW5lZ3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZGlzY2lwbGluZSBncm91cGluZy4KLQotcm9sZXNldGdyb3VwaW5nX2RldGFpbFNlY3Rpb25fZGVzYz1Qcm92aWRlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgcm9sZXNldCBncm91cGluZy4KLXJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotcm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgcm9sZXNldCBncm91cGluZyByZWxhdGVzIHRvIGFub3RoZXIgcm9sZXNldCBncm91cGluZy4KLXJvbGVzZXRncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByb2xlc2V0IGdyb3VwaW5nLgotCi1jdXN0b21jYXRlZ29yeV9kZXRhaWxTZWN0aW9uX2Rlc2M9UHJvdmlkZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGN1c3RvbSBjYXRlZ29yeS4KLWN1c3RvbWNhdGVnb3J5X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjPVNwZWNpZnkgaG93IHRoaXMgY3VzdG9tIGNhdGVnb3J5IHJlbGF0ZXMgdG8gYW5vdGhlciBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYz1Qcm92aWRlIHZlcnNpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjdXN0b20gY2F0ZWdvcnkuCi1jdXN0b21jYXRlZ29yeV9JY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgY3VzdG9tIGNhdGVnb3J5LgotCi1wbHVnaW5fZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIHBsdWctaW4uCi1wbHVnaW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M9UHJvdmlkZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbWV0aG9kIHBsdWctaW4uCi0KLWNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNvbmNlcHQuCi1jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGNoZWNrbGlzdC4KLXRvb2xtZW50b3JfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRvb2wgbWVudG9yLgotd2hpdGVwYXBlcl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgd2hpdGVwYXBlci4KLWVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb24uCi10ZXJtZGVmaW5pdGlvbl9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgdGVybSBkZWZpbml0aW9uLgotdGVtcGxhdGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHRlbXBsYXRlLgotcmV1c2FibGVhc3NldF9pY29uU2VjdGlvbl9kZXNjPUN1c3RvbWl6ZSB0aGUgaWNvbnMgZm9yIHRoaXMgcmV1c2FibGUgYXNzZXQuCi1yZXBvcnRfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJlcG9ydC4KLXByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M9Q3VzdG9taXplIHRoZSBpY29ucyBmb3IgdGhpcyBwcmFjdGljZS4KLWV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGV4YW1wbGUuCi1ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIGd1aWRlbGluZS4KLXJvYWRtYXBfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHJvYWRtYXAuCi1zdXBwb3J0aW5nbWF0ZXJpYWxfaWNvblNlY3Rpb25fZGVzYz1DdXN0b21pemUgdGhlIGljb25zIGZvciB0aGlzIHN1cHBvcnRpbmcgbWF0ZXJpYWwuCi0KLXB1Ymxpc2hfY2F0ZWdvcmllc190ZXh0PVB1Ymxpc2ggdGhpcyBjYXRlZ29yeSB3aXRoIHRoZSBjYXRlZ29yaXplZCBtZXRob2QgZWxlbWVudHMuCi1lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY190aXRsZT1GaWxlIENoYW5nZWQKLWVkaXRvcl9lcnJvcl9hY3RpdmF0ZWRfb3V0b2ZzeW5jX21lc3NhZ2U9VGhlIGZpbGUgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIGxvYWQgdGhlIGNoYW5nZXM/Ci0KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPUFjdGl2aXR5IFZhcmlhYmlsaXR5Ci0KLXZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlPVZhcmlhYmlsaXR5Ci0KLWNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfdGl0bGU9Q2lyY3VsYXIgZGVwZW5kZW5jeQotCi1hcHBseV9wYXR0ZXJuX2Vycm9yX3RpdGxlPUFwcGx5IFBhdHRlcm4KLWFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnPUFjdGl2aXR5ICcnezB9JycgY2Fubm90IGFwcGx5IHBhdHRlcm4gd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi0KLSNzZXQgZGVmYXVsdCBoaXN0b3J5IHNpemUKLWRlZmF1bHRfbGlzdF9sZW5ndGhfbGFiZWw9UHJlZmVyZW5jZSBoaXN0b3J5IHNpemU6Ci0KLVByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzX1Rhc2s9U3VwcHJlc3MgJlRhc2tzCi1Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxfVGFzaz1SZXZlYWwgJlRhc2tzCi0KLSNFeHRlbmQgU2VtYW50aWNzIHByZWZlcmVuY2UgY2hlY2sKLWV4dGVuZF9zZW1hbnRpY3NfYnV0dG9uX3RleHQ9VXNlIG5ldyAmRXh0ZW5kcyBzZW1hbnRpY3MKLWV4dGVuZF9zZW1hbnRpY3NfdGV4dD1FeHRlbmRpbmcgZWxlbWVudHMgb3ZlcnJpZGUgdG8tbWFueSByZWxhdGlvbnNoaXBzIGluc3RlYWQgb2YgYWRkaW5nIHRvIHRoZSBpbmhlcml0ZWQgZWxlbWVudHMuCi0KLSMgV29yayBQcm9kdWN0IHNsb3RzCi13b3JrcHJvZHVjdERlc2NyaXB0aW9uUGFnZV9zbG90X3RleHQ9SXMgV29yayBQcm9kdWN0IFNsb3QKLXNsb3RTZWN0aW9uX25hbWU9U2xvdHMgSW5mb3JtYXRpb24KLXNsb3RTZWN0aW9uX2Rlc2M9U2VsZWN0IHRoZSBzbG90cyB0aGF0IHRoaXMgd29yayBwcm9kdWN0IGZ1bGZpbGxzLgotc2xvdHNMYWJlbF90ZXh0PVNsb3RzOgotYXJ0aWZhY3Rfc2xvdFNlY3Rpb25fZGVzYz1TZWxlY3QgdGhlIHNsb3RzIHRoYXQgdGhpcyBhcnRpZmFjdCBmdWxmaWxscy4KLW91dGNvbWVfc2xvdFNlY3Rpb25fZGVzYz1TZWxlY3QgdGhlIHNsb3RzIHRoYXQgdGhpcyBvdXRjb21lIGZ1bGZpbGxzLgotZGVsaXZlcmFibGVfc2xvdFNlY3Rpb25fZGVzYz1TZWxlY3QgdGhlIHNsb3RzIHRoYXQgdGhpcyBkZWxpdmVyYWJsZSBmdWxmaWxscy4KLXNsb3RDb25maXJtRGlhbG9nX3RpdGxlPVdvcmsgUHJvZHVjdCBTbG90cwotd3BGdWxGaWxsc0NvbmZpcm1EaWFsb2dfbWVzc2FnZT1UaGVyZSBhcmUgc2xvdHMgcHJlc2VudCB3aGljaCB0aGlzIFdvcmsgcHJvZHVjdCBmdWxmaWxscy4gVGhvc2UgcmVmZXJlbmNlcyB3aWxsIGJlIHJlbW92ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotd3BTbG90RnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2U9VGhpcyBXb3JrIFByb2R1Y3Qgc2xvdCBmdWxmaWxscyBvdGhlciB3b3JrIHByb2R1Y3QuIFRob3NlIHJlZmVyZW5jZXMgd2lsbCBiZSByZW1vdmVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRVBGIDEuMiBOTCBzdHJpbmdzLgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBMYXlvdXQgQWN0aW9uIGdyb3VwCi0jIE5vdGU6IE1uZW1vbmljcyBkbyBub3Qgd29yayBvbiB0aGVzZQotTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWw9TWV0aG9kIFBsdWctaW4gUHJlc2VudGF0aW9uCi1MYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsPUZsYXQKLUxheW91dEFjdGlvbkdyb3VwX2hpZXJhcmNoaWNhbExheW91dEFjdGlvbl9sYWJlbD1IaWVyYXJjaGljYWwKLQotVmFsaWRhdGVfbWV0aG9kX2xpYnJhcnk9VmFsaWRhdGUgTWV0aG9kIExpYnJhcnkKLQotTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9zaG93T3duZXJJbkxpYnJhcnlWaWV3PVNob3cgb3duZXIgb2YgdGhpcyB1bnJlc29sdmVkIHJlZmVyZW5jZSBpbiBMaWJyYXJ5IHZpZXcKLU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZT1SZW1vdmUgdGhpcyB1bnJlc29sdmVkIHJlZmVyZW5jZQotcHJvbXB0RGVsZXRlQ3VzdG9tQ2F0ZWdvcnlCZWZvcmVSZW1vdmVMYXN0UmVmVG9JdD1Zb3UgYXJlIGFib3V0IHRvIHJlbW92ZSB0aGUgbGFzdCByZWZlcmVuY2UgdG8gezB9IGluIHRoZSBwbHVnLWluLiBUaGUgZWxlbWVudChzKSB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi1Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcl9yZXNvbHZlTWlzc2luZ1JlZmVyZW5jZT1BZGQgcmVmZXJlbmNlCi0KLWRlZmF1bHRMaW5rVHlwZVByZWZMYWJlbD1DaG9vc2UgdGhlIGRlZmF1bHQgZWxlbWVudCBsaW5rIHR5cGUgd2hlbiBkcmFnZ2luZyBmcm9tIHRoZSBMaWJyYXJ5IHZpZXcuCi1wcm9tcHRDcmVhdGVOZXdEaWFncmFtRmlsZV9tc2c9Tm8gZGlhZ3JhbSBmaWxlIGV4aXN0cyBmb3IgdGhpcyBwcm9jZXNzLiBEbyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgb25lPwotTmV3RGlhZ3JhbUZpbGVfdGl0bGU9TmV3IERpYWdyYW0gRmlsZQotSXRlbXNGaWx0ZXJEaWFsb2dfVXBkYXRlVHJlZUpvYl9uYW1lPVVwZGF0ZSBmaWx0ZXIgdHJlZQotCi1Qcm9ibGVtRXhwbGFuYXRpb25UZXh0PVByb2JsZW0gRXhwbGFuYXRpb24KLWNvbmZpZ1Byb2JsZW1WaWV3T3B0aW9uc1RleHQ9Q29uZmlndXJhdGlvbiBwcm9ibGVtIHZpZXcgb3B0aW9ucwotaGlkZUVycm9zVGV4dD1IaWRlIGVycm9ycwotaGlkZVdhcm5pbmdzVGV4dD1IaWRlIHdhcm5pbmdzCi1oaWRlSW5mb3NUZXh0PUhpZGUgaW5mb3MKLQotCi0KLQotQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2luY2x1ZGVFbGVtZW50c09mVHlwZT1JbmNsdWRlIGVsZW1lbnRzIG9mIHR5cGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvVUlBY3Rpb25EaXNwYXRjaGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL1VJQWN0aW9uRGlzcGF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDFjNjY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvVUlBY3Rpb25EaXNwYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBIYW5kbGVzIFVJIGFjdGlvbnMgaW4gdGhlIHdvcmtiZW5jaC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJQWN0aW9uRGlzcGF0Y2hlciBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBVSUFjdGlvbkRpc3BhdGNoZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJvdGVjdGVkIExpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKLQotCXByb3RlY3RlZCBMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SURvdWJsZUNsaWNrTGlzdGVuZXI+KCk7Ci0KLQlwcml2YXRlIEN1cnJlbnRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IG5ldyBDdXJyZW50U2VsZWN0aW9uKCk7Ci0KLQlwcml2YXRlIElEb3VibGVDbGlja0xpc3RlbmVyIGRvdWJsZUNsaWNrTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVUlBY3Rpb25EaXNwYXRjaGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChVSUFjdGlvbkRpc3BhdGNoZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBVSUFjdGlvbkRpc3BhdGNoZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIFVJQWN0aW9uRGlzcGF0Y2hlcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYW4gYWN0aW9uIGRpc3BhdGNoZXIgb2YgbXkgb3duCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICovCi0JcHVibGljIFVJQWN0aW9uRGlzcGF0Y2hlcihPYmplY3Qgb3duZXIpIHsKLQkJLy8gQ3JlYXRlIHRoZSBkb3VibGUgY2xpY2sgbGlzdGVuZXIgdXNlZCBmb3IgbGF1bmNoaW5nIHRoZSBNZXRob2QKLQkJLy8gZWRpdG9ycy4KLQkJZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZSkgewotCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCkKLQkJCQkJCQkuZ2V0QWN0aXZlUGFydCgpLmdldFNpdGUoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0W10gc2VsT2JqcyA9IHNlbC50b0FycmF5KCk7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IG51bGw7Ci0KLQkJCQkJaWYgKChzZWxPYmpzICE9IG51bGwpICYmIChzZWxPYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQkvLyBPcGVuIHRoZSBBdXRob3JpbmcgcGVyc2VwZWN0aXZlLgotCQkJCQkJVUlBY3Rpb25EaXNwYXRjaGVyLm9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpOwotCi0JCQkJCQkvLyBMb2NhdGUgdGhlIHNlbGVjdGVkIE1ldGhvZCBlbGVtZW50LgotCQkJCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHNlbE9ianNbMF0pOwotCQkJCQkJQ29uZmlndXJhdGlvblZpZXcgdmlldyA9IENvbmZpZ3VyYXRpb25WaWV3LmdldFZpZXcoKTsJCQkJCQkKLQkJCQkJCWlmICgodmlldyAhPSBudWxsICkgJiYgc2l0ZS5lcXVhbHModmlldy5nZXRTaXRlKCkpICkgewotCQkJCQkJCS8vIERvdWJsZS1jbGljayBvcmdpbmF0ZWQgZnJvbSB0aGUgQ29uZmlndXJhdGlvbgotCQkJCQkJCS8vIHZpZXcuCi0JCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJCQkJCQkJQ29udHJpYnV0aW9uU2VsZWN0aW9uIGNvbnRyaWJTZWxlY3Rpb24gPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gY29udHJpYlNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRTZWxlY3RlZENvbnRyaWJ1dG9yKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc2VsZWN0ZWRPYmplY3QgPSBvYmo7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQkJCQlzZWxlY3RlZE9iamVjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gQWRkIGEgcGVyc3BlY3RpdmUgbGlzdGVuZXIgdG8gZW5hYmxlL2Rpc2FibGUgZG91YmxlLWNsaWNrIGxpc3RlbmluZy4KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXb3JrYmVuY2hXaW5kb3cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmIChhY3RpdmVXb3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJYWN0aXZlV29ya2JlbmNoV2luZG93Ci0JCQkJCS5hZGRQZXJzcGVjdGl2ZUxpc3RlbmVyKG5ldyBJUGVyc3BlY3RpdmVMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQWN0aXZhdGVkKElXb3JrYmVuY2hQYWdlIHBhZ2UsCi0JCQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYykgewotCQkJCQkJCWlmIChkZXNjLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJCQkJCWFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQ2hhbmdlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MsIFN0cmluZyBpZCkgewotCQkJCQkJfQotCQkJCQl9KTsKLQkJfQotCi0JCWlmIChQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCWFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZG91YmxlQ2xpY2tMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZWRpdENvbmZpZ3VyYXRpb24oU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGxpYnJhcnkgcGVyc3BlY3RpdmUKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkxpYnJhcnlQZXJzcGVjdGl2ZSgpIHsKLQkJUGVyc3BlY3RpdmVVdGlsLm9wZW5QZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd2tiUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJVmlld1BhcnQgdmlld1BhcnQgPSB3a2JQYWdlLmZpbmRWaWV3KExpYnJhcnlWaWV3LlZJRVdfSUQpOwotCQlpZiAodmlld1BhcnQgIT0gbnVsbCkKLQkJCXdrYlBhZ2UuaGlkZVZpZXcodmlld1BhcnQpOwotCQl2aWV3UGFydCA9IHdrYlBhZ2UuZmluZFZpZXcoQ29uZmlndXJhdGlvblZpZXcuVklFV19JRCk7Ci0JCXdrYlBhZ2UuYWN0aXZhdGUodmlld1BhcnQpOwotCX0KLQotCS8qKgotCSAqIE9wZW4gYXV0aG9yaW5nIHBlcnNwZWN0aXZlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5BdXRob3JpbmdQZXJzcGVjdGl2ZSgpIHsKLQkJUGVyc3BlY3RpdmVVdGlsLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdrYlBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSVZpZXdQYXJ0IHZpZXdQYXJ0ID0gd2tiUGFnZS5maW5kVmlldyhMaWJyYXJ5Vmlldy5WSUVXX0lEKTsKLQkJd2tiUGFnZS5hY3RpdmF0ZSh2aWV3UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50U2VsZWN0aW9uLnNlbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblNvdXJjZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRTZWxlY3Rpb24uc291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgY3VycmVudCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2V0U2VsZWN0aW9uKHRoaXMsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc291cmNlLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCWN1cnJlbnRTZWxlY3Rpb24uc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJY3VycmVudFNlbGVjdGlvbi5zb3VyY2UgPSBzb3VyY2U7Ci0KLQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc291cmNlLAotCQkJCQlzZWxlY3Rpb24pOwotCi0JCQkvLyBBdm9pZCBjb25jdXJyZW50IGVycm9yLgotCQkJTGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBwcm9jZXNzZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8SVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcj4oKTsKLQkJCXdoaWxlIChzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkJCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMKLQkJCQkJCS5yZW1vdmUoMCk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZChsaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCi0JCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZEFsbChwcm9jZXNzZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZG91YmxlIGNsaWNrIGxpc3RlbmVyCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIWRvdWJsZUNsaWNrTGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJZG91YmxlQ2xpY2tMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBkb3VibGUgY2xpY2sgbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEb3VibGVDbGlja0xpc3RlbmVyKElEb3VibGVDbGlja0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWRvdWJsZUNsaWNrTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGRvdWJsZSBjbGljayBldmVudAotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZURvdWJsZUNsaWNrRXZlbnQoRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCS8vIEF2b2lkIGNvbmN1cnJlbnQgZXJyb3IuCi0JCQlMaXN0PElEb3VibGVDbGlja0xpc3RlbmVyPiBwcm9jZXNzZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8SURvdWJsZUNsaWNrTGlzdGVuZXI+KCk7Ci0JCQl3aGlsZSAoZG91YmxlQ2xpY2tMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJCUlEb3VibGVDbGlja0xpc3RlbmVyIGxpc3RlbmVyID0gKElEb3VibGVDbGlja0xpc3RlbmVyKSBkb3VibGVDbGlja0xpc3RlbmVycwotCQkJCQkJLnJlbW92ZSgwKTsKLQkJCQl0cnkgewotCQkJCQlsaXN0ZW5lci5kb3VibGVDbGljayhldmVudCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQkJZG91YmxlQ2xpY2tMaXN0ZW5lcnMuYWRkQWxsKHByb2Nlc3NlZEl0ZW1zKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDdXJyZW50U2VsZWN0aW9uIHsKLQotCQlwdWJsaWMgSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSA9IG51bGw7Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gc2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0Fic3RyYWN0TW92ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0Fic3RyYWN0TW92ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDVkZTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BYnN0cmFjdE1vdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogTW92ZXMgYnJlYWtkb3duIGVsZW1lbnQgaW4gYSBwcm9jZXNzIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb3ZlQWN0aW9uIGV4dGVuZHMKLQkJQ29tbWFuZEFjdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJV29ya2JlbmNoUGFydEFjdGlvbiwgSU1vZGlmeWluZ0FjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0VkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RNb3ZlQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKG51bGwsIHRleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1cHBvcnQgbW92ZSBvbmx5IG9uZSBhY3Rpdml0eSBmb3Igbm93Ci0JCS8vCi0JCWlmKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IGUgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRJdGVtUHJvdmlkZXIoZSk7Ci0JCQlyZXR1cm4gZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgJiYgaXAgIT0gbnVsbCAmJiBpcC5nZXRQYXJlbnQoZSkgaW5zdGFuY2VvZiBBY3Rpdml0eTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBzdXBwb3J0IG1vdmUgb25seSBvbmUgYWN0aXZpdHkgZm9yIG5vdwotCQkvLwotCQlpZihhY2NlcHQoc2VsZWN0aW9uKSkgewotCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElCU0l0ZW1Qcm92aWRlciBnZXRJdGVtUHJvdmlkZXIoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKWRvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCU9iamVjdCBpcCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZihpcCBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAoSUJTSXRlbVByb3ZpZGVyKSBpcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSBnZXRJdGVtUHJvdmlkZXIoZWxlbWVudCk7Ci0JCWlmKGlwICE9IG51bGwpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilpcCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCXJldHVybiBjcmVhdGVNb3ZlQ29tbWFuZCgoQWN0aXZpdHkpcGFyZW50LCBlbGVtZW50LCBpcC5nZXRFQ2xhc3NlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGNyZWF0ZU1vdmVDb21tYW5kKEFjdGl2aXR5IGFjdCwgT2JqZWN0IGVsZW1lbnQsIENvbGxlY3Rpb248RUNsYXNzPiBlQ2xhc3Nlcyk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9BY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjYyMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFEREluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQWN0aW9uIHRvIHNob3cgdGhlIEFEREluZm9EaWFsb2csIHRvIHNob3cgdGhlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbXMKLSAqIGluIHRoZSBwcm9jZXNzLiBOb3QgaW4gdXNlLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByb3RlY3RlZCBPYmplY3Qgc2VsZWN0ZWQ7Ci0JCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9BY3Rpb24oKSB7Ci0JCXN1cGVyKCJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQkKLQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQURERmlsdGVyKG51bGwsIG51bGwsIG51bGwpOwotCQkKLQkJQURESW5mb0RpYWxvZyBmZCA9IG5ldyBBRERJbmZvRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBnZXRPYmplY3QoKSwgIkFjdGl2aXR5IiwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwpOwotCi0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5zZXRUaXRsZSgiQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJAotCQlmZC5vcGVuKCk7Ci0JCUxpc3QgbGlzdCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCi0JCXRyeSB7Ci0JCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdleCgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5FZGl0b3JJbnB1dCgKLQkJCQkJbGlzdC5nZXQoMCksIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKChQcm9jZXNzKWdldE9iamVjdCgpKSk7Ci0JCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZXgoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuY2xhc3MKLQkJCQkJLmdldE5hbWUoKSk7Ci0JCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCWVkaXRvci5zZXRQYXJlbnRFZGl0b3IocGFyZW50KTsKLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCWV4Y2VwdGlvbik7Ci0JCX0KLQkJLy8gb3BlbiBlZGl0b3IKLQotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKXsKLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLQkKLQlwdWJsaWMgSVdvcmtiZW5jaFBhZ2UgZ2V0UGFnZXgoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCX0KLQlwdWJsaWMgY2xhc3MgQURERmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCQlwdWJsaWMgQURERmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBWaWV3ZXIgdmlld2VyLCBTdHJpbmcgZmlsdGVyU3RyKSB7Ci0JCQlzdXBlcihtZXRob2RDb25maWcsIHZpZXdlciwgZmlsdGVyU3RyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQlpZihvYmogaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBvYmosIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQlpZihkICE9IG51bGwgKSByZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Bc3NpZ25BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Bc3NpZ25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4MTlhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQXNzaWduQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLkN1c3RvbWVDYXRlZ29yeUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQXNzaWduRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBBc3NpZ24gbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlICAxLjUKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbkFjdGlvbiBleHRlbmRzIEN1c3RvbWVDYXRlZ29yeUFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgQXNzaWduQWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIobGliVmlldywgQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWduQWN0aW9uX3RleHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkb1J1bigpIHsJCQotCQlDb2xsZWN0aW9uIGVsZW1lbnRzVG9Bc3NpZ24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0TGlicmFyeVZpZXcoKS5nZXRTZWxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQl8fCAoZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJZWxlbWVudHNUb0Fzc2lnbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUFzc2lnbkRpYWxvZyBkbGcgPSBnZXREaWFsb2coZWxlbWVudHNUb0Fzc2lnbik7Ci0JCWRsZy5vcGVuKCk7Ci0JfQotCQotCXByb3RlY3RlZCBBc3NpZ25EaWFsb2cgZ2V0RGlhbG9nKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIEFzc2lnbkRpYWxvZy5uZXdBc3NpZ25EaWFsb2coZ2V0TGlicmFyeVZpZXcoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSwgZWxlbWVudHMpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy9yZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjYW5Bc3NpZ24oc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnRzIGNhbiBiZSBhc3NpZ25lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuQXNzaWduKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXJldHVybiBnZXRTZWxlY3Rpb25QYXJlbnRPYmplY3QoKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5OwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzBlYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db250cmlidXRpb25TZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIEVkaXRzIGFuIGVsZW1lbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbiBleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgSUQgZm9yIHRoaXMgYWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JRCA9IENvbmZpZ3VyYXRpb25WaWV3RWRpdEFjdGlvbi5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQlwcml2YXRlIENvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmlidXRvclNlbGVjdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQljb250cmlidXRvclNlbGVjdG9yID0gbmV3IENvbnRyaWJ1dGlvblNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gY29udHJpYnV0b3JTZWxlY3RvcgotCQkJCQkJLmdldFNlbGVjdGVkQ29udHJpYnV0b3IoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCQllbGVtZW50TGlzdC5hZGQob2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA8IDEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGlzIGFjdGlvbiBpbiByZXNwb25zZSB0byB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGNoYW5nZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZCA9IHNlbGVjdGlvbjsKLQotCQlib29sZWFuIGVuYWJsZVRoZU1lbnUgPSB0cnVlOwotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlPYmplY3QgcmVhbE9iaiA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKCEocmVhbE9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQkJZW5hYmxlVGhlTWVudSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmICgocmVhbE9iaiBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykKLQkJCQkJfHwgKHJlYWxPYmogaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSBpZiAoKHJlYWxPYmogaW5zdGFuY2VvZiBQaGFzZSkKLQkJCQkJfHwgKHJlYWxPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJfHwgKHJlYWxPYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCQllbmFibGVUaGVNZW51ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZW5hYmxlVGhlTWVudTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhODFlNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0NyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5JRWRpdG9yS2VlcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Db21tYW5kU3RhdHVzQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBDcmVhdGVzIGEgbmV3IE1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIENvbW1hbmRXcmFwcGVyIGltcGxlbWVudHMKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENyZWF0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlzdXBlcihjb21tYW5kKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbG9hZEN1cnJlbnRMaWJyYXJ5T25Sb2xsYmFja0Vycm9yKCkgewotCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFdyYXBwZXIjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJQ29tbWFuZCBjbWQgPSBUbmdVdGlsLnVud3JhcCh0aGlzKTsKLQotCQlzdXBlci5leGVjdXRlKCk7Ci0KLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKSBjb21tYW5kKQotCQkJCQkuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlpZiAoQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpKSB7CQkJCQkKLQkJCQkJcmVsb2FkQ3VycmVudExpYnJhcnlPblJvbGxiYWNrRXJyb3IoKTsKLQkJCQl9IGVsc2UgaWYgKCFDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNTYXZlRXJyb3Ioc3RhdHVzKSkgewotCQkJCQlkaXNwbGF5RXJyb3Ioc3RhdHVzKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJY21kID0gdGhpczsKLQotCQkJd2hpbGUgKGNtZCBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyCi0JCQkJCSYmICEoY21kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpKSB7Ci0JCQkJY21kID0gKChDb21tYW5kV3JhcHBlcikgY21kKS5nZXRDb21tYW5kKCk7Ci0JCQl9Ci0KLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgewotCQkJCU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kIGFkZENtZCA9ICgoTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIGNtZCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBhZGRDbWQuZ2V0U3RhdHVzKCk7Ci0JCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCWlmIChDb21tYW5kU3RhdHVzQ2hlY2tlci5oYXNSb2xsYmFja0Vycm9yKHN0YXR1cykpIHsKLQkJCQkJCXJlbG9hZEN1cnJlbnRMaWJyYXJ5T25Sb2xsYmFja0Vycm9yKCk7Ci0JCQkJCX0gZWxzZSBpZiAoIUNvbW1hbmRTdGF0dXNDaGVja2VyLmhhc1NhdmVFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCQlkaXNwbGF5RXJyb3Ioc3RhdHVzKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbjw/PiByZXN1bHQgPSBnZXRDb21tYW5kKCkuZ2V0UmVzdWx0KCk7Ci0JCWZvciAoT2JqZWN0IG8gOiByZXN1bHQpIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdCkgb2JqKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCS8vIE9wZW4gdGhlIGVkaXRvciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZWxlbWVudC4KLQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKS5vcGVuRWRpdG9yKG9iaik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNjYW5VbmRvKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRBY3Rpb25EZWxlZ2F0ZSNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZSgpIHsKLQkJQ29tbWFuZEFjdGlvbkRlbGVnYXRlIGNtZCA9IChDb21tYW5kQWN0aW9uRGVsZWdhdGUpIGdldENvbW1hbmQoKTsKLQkJcmV0dXJuIGNtZC5nZXRJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kQWN0aW9uRGVsZWdhdGUjZ2V0VGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlDb21tYW5kQWN0aW9uRGVsZWdhdGUgY21kID0gKENvbW1hbmRBY3Rpb25EZWxlZ2F0ZSkgZ2V0Q29tbWFuZCgpOwotCQlyZXR1cm4gY21kLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZEFjdGlvbkRlbGVnYXRlI2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlDb21tYW5kQWN0aW9uRGVsZWdhdGUgY21kID0gKENvbW1hbmRBY3Rpb25EZWxlZ2F0ZSkgZ2V0Q29tbWFuZCgpOwotCQlyZXR1cm4gY21kLmdldFRvb2xUaXBUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5KAotCQkJCQlnZXRMYWJlbCgpLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ19jcmVhdGVFcnJvcgotCQkJCQksIHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU3MGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9DdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFzc2lnbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBEZWVwIGNvcHkgY3VzdG9tZSBjYXRlZ29yeSBhY3Rpb24KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbiBleHRlbmRzIEFzc2lnbkFjdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliVmlldwotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIobGliVmlldyk7Ci0JCXNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVlcENvcHlBY3Rpb25fdGV4dCk7Ci0JfQotCQotCXByb3RlY3RlZCBBc3NpZ25EaWFsb2cgZ2V0RGlhbG9nKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIEFzc2lnbkRpYWxvZy5uZXdEZWVwQ29weURpYWxvZyhnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBlbGVtZW50cyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvRGlhZ3JhbVByaW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvRGlhZ3JhbVByaW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDhkNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0RpYWdyYW1QcmludEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucHJpbnQuUHJpbnRHcmFwaGljYWxWaWV3ZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuUHJpbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByaW50aW5nLlByaW50ZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIAotICogUHJpbnQgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJpbnRBY3Rpb24gZXh0ZW5kcyBQcmludEFjdGlvbiB7Ci0KLQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyOwotCS8qKgotCSAqIEBwYXJhbSBwYXJ0Ci0JICovCi0JcHVibGljIERpYWdyYW1QcmludEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0LCBHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKHBhcnQpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0JCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5QcmludEFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy9HcmFwaGljYWxWaWV3ZXIgdmlld2VyOwotCQlQcmludERpYWxvZyBkaWFsb2cgPSBuZXcgUHJpbnREaWFsb2codmlld2VyLmdldENvbnRyb2woKS5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCVByaW50ZXJEYXRhIGRhdGEgPSBkaWFsb2cub3BlbigpOwotCQkKLQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJUHJpbnRHcmFwaGljYWxWaWV3ZXJPcGVyYXRpb24gb3AgPSAKLQkJCQkJCW5ldyBQcmludEdyYXBoaWNhbFZpZXdlck9wZXJhdGlvbihuZXcgUHJpbnRlcihkYXRhKSwgdmlld2VyKTsKLQkJCW9wLnJ1bihnZXRXb3JrYmVuY2hQYXJ0KCkuZ2V0VGl0bGUoKSk7Ci0JCX0KLQkJc3VwZXIucnVuKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldCBncmFwaGljYWwgdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gZ3JhcGhpY2FsIHZpZXdlcgotCSAqIEByZXR1cm4gdmlld2VyCi0JICovCi0JcHVibGljIEdyYXBoaWNhbFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkYTU0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2U7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgdGhlIExpYnJhcnkgdmlldyBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHVibGljIElWaWV3UGFydCBnZXRBY3RpdmVWaWV3KCk7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVWaWV3KElWaWV3UGFydCBwYXJ0KTsKLQotCXB1YmxpYyB2b2lkIHNoYXJlR2xvYmFsQWN0aW9ucyhJUGFnZSBwYWdlLCBJQWN0aW9uQmFycyBhY3Rpb25CYXJzKTsKLQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpOwotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpOwotCi0JcHVibGljIHZvaWQgZGlzYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0KLQlwdWJsaWMgdm9pZCBlbmFibGVHbG9iYWxFZGl0TWVudSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSU1vZGlmeWluZ0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lNb2RpZnlpbmdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxMzQ1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSU1vZGlmeWluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RpZnlpbmdBY3Rpb24gZXh0ZW5kcyBJQWN0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0lXb3JrYmVuY2hQYXJ0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSVdvcmtiZW5jaFBhcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjYjAyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSVdvcmtiZW5jaFBhcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3Igd29ya2JlbmNoIHBhcnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXb3JrYmVuY2hQYXJ0QWN0aW9uIHsKLQl2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSW5kZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvSW5kZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzQ0YmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0luZGVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEluZGVudHMgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEgcHJvY2VzcyB0cmVlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIEluZGVudEFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBJbmRlbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkJCi0JCXByaXZhdGUgQ29sbGVjdGlvbjxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50czsKLQkJcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQkJcHJpdmF0ZSBTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCQlwcml2YXRlIEFjdGl2aXR5IG9sZFBhcmVudDsKLQkJcHJpdmF0ZSBBY3Rpdml0eSBuZXdQYXJlbnQ7Ci0JCXByaXZhdGUgaW50IG9sZEluZGV4OwotCQlwcml2YXRlIE1hcDxXb3JrQnJlYWtkb3duRWxlbWVudCwgV29ya09yZGVyPiBjaXJjdWxhcldvcmtPcmRlcnM7Ci0KLQkJcHVibGljIEluZGVudENvbW1hbmQoQ29sbGVjdGlvbjxCcmVha2Rvd25FbGVtZW50PiBjb2xsZWN0aW9uLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJdGhpcy5lbGVtZW50cyA9IGNvbGxlY3Rpb247Ci0JCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCQlzZXRMYWJlbChMQUJFTCk7Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCWlmKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSBudWxsOwotCQkJCWZvciAoSXRlcmF0b3I8QnJlYWtkb3duRWxlbWVudD4gaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IHByb2MgPT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCXByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSk7Ci0JCQkJfQotCQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHByb2MuZVJlc291cmNlKCk7Ci0JCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHByb2MuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJCWVsZW1lbnQgPSBlbGVtZW50cy5pdGVyYXRvcigpLm5leHQoKTsKLQkJCW9sZFBhcmVudCA9IGVsZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZihvbGRQYXJlbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCW9sZEluZGV4ID0gb2xkUGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihlbGVtZW50KTsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9sZFBhcmVudCwgCi0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KGlwLmdldENoaWxkcmVuKG9sZFBhcmVudCkpOwotCQkJaW50IGluZGV4ID0gY2hpbGRyZW4uaW5kZXhPZihlbGVtZW50KTsKLQkJCWlmKGluZGV4ID4gMCkgewotCQkJCU9iamVjdCBwcmV2ID0gY2hpbGRyZW4uZ2V0KGluZGV4IC0gMSk7Ci0JCQkJaWYocHJldiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCW5ld1BhcmVudCA9IChBY3Rpdml0eSkgcHJldjsKLQkJCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQobmV3UGFyZW50LCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWxlbWVudCksIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQluZXdQYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZWxlbWVudCk7Ci0JCQkKLQkJCS8vIHJlbW92ZSBjaXJjdWxhciB3b3JrIG9yZGVycwotCQkJLy8KLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmKGNpcmN1bGFyV29ya09yZGVycyA9PSBudWxsKSB7Ci0JCQkJCWNpcmN1bGFyV29ya09yZGVycyA9IG5ldyBIYXNoTWFwPFdvcmtCcmVha2Rvd25FbGVtZW50LCBXb3JrT3JkZXI+KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaXJjdWxhcldvcmtPcmRlcnMuY2xlYXIoKTsKLQkJCQl9Ci0JCQkJV29ya09yZGVyIHdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKG5ld1BhcmVudCwgZWxlbWVudCk7Ci0JCQkJaWYod28gIT0gbnVsbCkgewkKLQkJCQkJbmV3UGFyZW50LmdldExpbmtUb1ByZWRlY2Vzc29yKCkucmVtb3ZlKHdvKTsKLQkJCQkJY2lyY3VsYXJXb3JrT3JkZXJzLnB1dChuZXdQYXJlbnQsIHdvKTsKLQkJCQl9Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50OwotCQkJCXdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKHdiZSwgbmV3UGFyZW50KTsKLQkJCQlpZih3byAhPSBudWxsKSB7Ci0JCQkJCXdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnJlbW92ZSh3byk7Ci0JCQkJCWNpcmN1bGFyV29ya09yZGVycy5wdXQod2JlLCB3byk7Ci0JCQkJfQotCQkJfQkJCQotCQkJCi0JCQkvLyBtb3ZlIHRoZSBwcm9jZXNzIHBhY2FrZ2Ugb2YgdGhlIGFjdGl2aXR5IHRvIG5ldyBwYXJlbnQgcGFja2FnZQotCQkJLy8KLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgbmV3UGFyZW50LmVDb250YWluZXIoKTsKLQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSkgZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVkbygpIHsKLQkJCWV4ZWN1dGUoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZihjaXJjdWxhcldvcmtPcmRlcnMgIT0gbnVsbCAmJiAhY2lyY3VsYXJXb3JrT3JkZXJzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoTWFwLkVudHJ5PFdvcmtCcmVha2Rvd25FbGVtZW50LCBXb3JrT3JkZXI+IGVudHJ5IDogY2lyY3VsYXJXb3JrT3JkZXJzLmVudHJ5U2V0KCkpIHsKLQkJCQkJZW50cnkuZ2V0S2V5KCkuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJCWNpcmN1bGFyV29ya09yZGVycy5jbGVhcigpOwotCQkJfQotCQkJb2xkUGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKG9sZEluZGV4LCBlbGVtZW50KTsJCQkKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgb2xkUGFyZW50LmVDb250YWluZXIoKTsKLQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSkgZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fSW5kZW50OwotCi0JcHJpdmF0ZSBQcm9jZXNzRWRpdG9yIGVkaXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBJbmRlbnRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBJbmRlbnRBY3Rpb24oKSB7Ci0JCXRoaXMoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSU5ERU5UKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfSU5ERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1cHBvcnQgaW5kZW50IG9ubHkgb25lIGFjdGl2aXR5IGZvciBub3cKLQkJLy8KLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldCA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwkJCQkKLQkJCX0KLQkJfQotCQlzZXRFbmFibGVkKHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JCQotCQkvL1RPRE86IHN1cHBvcnQgaW5kZW50IG11bHRpcGxlIGFjdGl2aXRpZXMgaW4gc2VsZWN0aW9uCi0vLwkJQXJyYXlMaXN0PEFjdGl2aXR5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eT4oKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0vLwkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJbGlzdC5hZGQoKEFjdGl2aXR5KSBlbGVtZW50KTsKLS8vCQkJfQotLy8JCX0KLS8vCQlpZihsaXN0LmlzRW1wdHkoKSkgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlyZXR1cm4gbmV3IEluZGVudENvbW1hbmQoc2VsZWN0aW9uLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xheW91dEFjdGlvbkdyb3VwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGF5b3V0QWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2N2JhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGF5b3V0QWN0aW9uR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wYWNrYWdldmlldy5MYXlvdXRBY3Rpb25Hcm91cAotICoKLSAqLwotcHVibGljIGNsYXNzIExheW91dEFjdGlvbkdyb3VwIGV4dGVuZHMgTXVsdGlBY3Rpb25Hcm91cCB7Ci0KLQlwdWJsaWMgTGF5b3V0QWN0aW9uR3JvdXAoTGlicmFyeVZpZXcgbGliVmlldykgewotCQlzdXBlcihjcmVhdGVBY3Rpb25zKGxpYlZpZXcpLCBnZXRTZWxlY3RlZFN0YXRlKGxpYlZpZXcpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBBY3Rpb25Hcm91cCNmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsQWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmZpbGxBY3Rpb25CYXJzKGFjdGlvbkJhcnMpOwotCQljb250cmlidXRlVG9WaWV3TWVudShhY3Rpb25CYXJzLmdldE1lbnVNYW5hZ2VyKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29udHJpYnV0ZVRvVmlld01lbnUoSU1lbnVNYW5hZ2VyIHZpZXdNZW51KSB7Ci0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCS8vIENyZWF0ZSBsYXlvdXQgc3ViIG1lbnUKLQkJCi0JCUlNZW51TWFuYWdlciBsYXlvdXRTdWJNZW51PSBuZXcgTWVudU1hbmFnZXIoQXV0aG9yaW5nVUlSZXNvdXJjZXMuTGF5b3V0QWN0aW9uR3JvdXBfbGFiZWwpOyAKLQkJZmluYWwgU3RyaW5nIGxheW91dEdyb3VwTmFtZT0gImxheW91dCI7IC8vJE5PTi1OTFMtMSQKLQkJU2VwYXJhdG9yIG1hcmtlcj0gbmV3IFNlcGFyYXRvcihsYXlvdXRHcm91cE5hbWUpOwotCi0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCXZpZXdNZW51LmFkZChtYXJrZXIpOwotCQl2aWV3TWVudS5hcHBlbmRUb0dyb3VwKGxheW91dEdyb3VwTmFtZSwgbGF5b3V0U3ViTWVudSk7Ci0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKyItZW5kIikpOy8vJE5PTi1OTFMtMSQJCQotCQlhZGRBY3Rpb25zKGxheW91dFN1Yk1lbnUpOwotCX0KLQotCXN0YXRpYyBpbnQgZ2V0U2VsZWN0ZWRTdGF0ZShMaWJyYXJ5VmlldyBsaWJWaWV3KSB7Ci0JCWlmIChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQkKLQlzdGF0aWMgSUFjdGlvbltdIGNyZWF0ZUFjdGlvbnMoTGlicmFyeVZpZXcgbGliVmlldykgewotCQlJQWN0aW9uIGZsYXRMYXlvdXRBY3Rpb249IG5ldyBMYXlvdXRBY3Rpb24obGliVmlldywgdHJ1ZSk7Ci0JCWZsYXRMYXlvdXRBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5MYXlvdXRBY3Rpb25Hcm91cF9mbGF0TGF5b3V0QWN0aW9uX2xhYmVsKTsgCi0JCWZsYXRMYXlvdXRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX0xBWU9VVF9GTEFUKTsKLQkJSUFjdGlvbiBoaWVyYXJjaGljYWxMYXlvdXQ9IG5ldyBMYXlvdXRBY3Rpb24obGliVmlldywgZmFsc2UpOwotCQloaWVyYXJjaGljYWxMYXlvdXQuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5MYXlvdXRBY3Rpb25Hcm91cF9oaWVyYXJjaGljYWxMYXlvdXRBY3Rpb25fbGFiZWwpOwotCQloaWVyYXJjaGljYWxMYXlvdXQuc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX0xBWU9VVF9ISUVSQVJDSElDQUwpOwotCQkKLQkJcmV0dXJuIG5ldyBJQWN0aW9uW117ZmxhdExheW91dEFjdGlvbiwgaGllcmFyY2hpY2FsTGF5b3V0fTsKLQl9Ci19Ci0KLWNsYXNzIExheW91dEFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElBY3Rpb24gewotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0ZsYXRMYXlvdXQ7Ci0JcHJpdmF0ZSBMaWJyYXJ5VmlldyBmbGliVmlldzsKLQotCXB1YmxpYyBMYXlvdXRBY3Rpb24oTGlicmFyeVZpZXcgbGliVmlldywgYm9vbGVhbiBmbGF0KSB7Ci0JCXN1cGVyKCIiLCBBU19SQURJT19CVVRUT04pOyAvLyROT04tTkxTLTEkCi0KLQkJZklzRmxhdExheW91dD0gZmxhdDsKLQkJZmxpYlZpZXc9IGxpYlZpZXc7Ci0JCWlmIChmSXNGbGF0TGF5b3V0KQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLCBBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MQVlPVVRfRkxBVF9BQ1RJT04pOwotCQllbHNlCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMsIEF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxBWU9VVF9ISUVSQVJDSElDQUxfQUNUSU9OKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpICE9IGZJc0ZsYXRMYXlvdXQpIHsKLQkJCVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UudG9nZ2xlTGF5b3V0KCk7Ci0JCQkvLyBzYXZlIHN0YXRlCi0JCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuc2V0TGF5b3V0KFBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuZ2V0TGF5b3V0QXNTdHJpbmcoKSk7Ci0JCX0KLQkJZmxpYlZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCWZsaWJWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJZmxpYlZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1M2Y5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkN1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5SZWRvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5VbmRvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5MaWJyYXJ5RVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TdWJDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgdmlldyBhY3Rpb24gYmFyIGNvbnRyaWJ1dG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMKLQkJSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBhY3RpdmUgZWRpdG9yLgotCXByb3RlY3RlZCBJVmlld1BhcnQgYWN0aXZlVmlld1BhcnQ7Ci0KLQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIElBY3Rpb25CYXJzIHZpZXdBY3Rpb25CYXJzOwotCi0JLy8gTGlicmFyeSB2aWV3IGVkaXQgYWN0aW9uCi0JcHJvdGVjdGVkIExpYnJhcnlWaWV3RWRpdEFjdGlvbiBsaWJyYXJ5Vmlld0VkaXRBY3Rpb247Ci0KLQkvLyBDb25maWd1cmF0aW9uIHZpZXcgZWRpdCBhY3Rpb24KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uIGNvbmZpZ1ZpZXdFZGl0QWN0aW9uOwotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0JCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIFByb3BlcnRpZXMgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBzaG93UHJvcGVydGllc1ZpZXdBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0pIHsgCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIHZpZXdlciBvZiB0aGUgY3VycmVudCBlZGl0b3IgaWYgdGhlIGVkaXRvciBpbXBsZW1lbnRzCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcn0uCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gcmVmcmVzaFZpZXdlckFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfUmVmcmVzaFZpZXdlcl9tZW51X2l0ZW0pIHsgCi0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChhY3RpdmVWaWV3UGFydCBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgYWN0aXZlVmlld1BhcnQpLmdldFZpZXdlcigpOwotCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCQlyZWZyZXNoVmlld2VyKHZpZXdlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259IGNvcnJlc3BvbmRpbmcgdG8KLQkgKiBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0gcHJvdmlkZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlQ2hpbGRBY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZSBhZGRlZCBmb3IKLQkgKiBDcmVhdGVDaGlsZCBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBJTWVudU1hbmFnZXIgY3JlYXRlQ2hpbGRNZW51TWFuYWdlcjsKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBjb250YWluIG9uZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gY29ycmVzcG9uZGluZwotCSAqIHRvIGVhY2ggZGVzY3JpcHRvciBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbQotCSAqIHByb3ZpZGVyLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZVNpYmxpbmdBY3Rpb25zOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgbWVudSBtYW5hZ2VyIGludG8gd2hpY2ggbWVudSBjb250cmlidXRpb24gaXRlbXMgc2hvdWxkIGJlCi0JICogYWRkZWQgZm9yIENyZWF0ZVNpYmxpbmcgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcihFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJdGhpcy5lZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQkJCi0JCXZhbGlkYXRlQWN0aW9uID0gbmV3IExpYnJhcnlWYWxpZGF0ZUFjdGlvbigpOwotCQkoKExpYnJhcnlWYWxpZGF0ZUFjdGlvbil2YWxpZGF0ZUFjdGlvbikucHV0Q29udGV4dERhdGEoTGlicmFyeUVWYWxpZGF0b3IuQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUiwKLQkJCQlQcm9jZXNzRWRpdG9yLmFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIFNlcGFyYXRvcnMgZm9yIGVkaXRvciBhZGRpdGlvbnMgdG8gdGhlIHRvb2wgYmFyLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2Qtc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIm1ldGhvZC1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yCi0JICogYWRkaXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9NZW51KG1lbnVNYW5hZ2VyKTsKLQotCQlJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX01ldGhvZEVkaXRvcl9tZW51LCAiY29tLmlibS5tZXRob2RNZW51SUQiKTsgLy8kTk9OLU5MUy0xJCAgCi0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoInNldHRpbmdzIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVDaGlsZCBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCi0JCWNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSk7IAotCQlzdWJtZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gUHJlcGFyZSBmb3IgQ3JlYXRlU2libGluZyBpdGVtIGFkZGl0aW9uIG9yIHJlbW92YWwuCi0JCWNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5fVUlfQ3JlYXRlU2libGluZ19tZW51X2l0ZW0pOyAKLQkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gRm9yY2UgYW4gdXBkYXRlIGJlY2F1c2UgRWNsaXBzZSBoaWRlcyBlbXB0eSBtZW51cyBub3cuCi0JCXN1Ym1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCQltZW51TWFuYWdlci51cGRhdGVBbGwodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZEdsb2JhbEFjdGlvbnMoc3VibWVudU1hbmFnZXIpOwotCX0KLQotCXB1YmxpYyBJVmlld1BhcnQgZ2V0QWN0aXZlVmlldygpIHsKLQkJcmV0dXJuIGFjdGl2ZVZpZXdQYXJ0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVZpZXcoSVZpZXdQYXJ0IHBhcnQpIHsKLQkJLy8gVE9ETyAtIG1heSBuZWVkIHRvIGNoZWNrIG90aGVyIG1ldGhvZAotCQlpZiAocGFydCAhPSBudWxsKQotCQkJc3VwZXIuc2V0QWN0aXZlVmlldyhwYXJ0KTsKLQkJaWYgKHBhcnQgPT0gYWN0aXZlVmlld1BhcnQpCi0JCQlyZXR1cm47Ci0JCWlmIChhY3RpdmVWaWV3UGFydCAhPSBudWxsKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCX0KLQkJaWYgKHBhcnQgPT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmICghKHBhcnQgaW5zdGFuY2VvZiBJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSkKLQkJCXJldHVybjsKLQkJYWN0aXZlVmlld1BhcnQgPSBwYXJ0OwotCQllZGl0aW5nRG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBwYXJ0KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0KLQkJLy8gU3dpdGNoIHRvIHRoZSBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyLgotCQlpZiAoc2VsZWN0aW9uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl9IGVsc2UgewotCQkJc2VsZWN0aW9uUHJvdmlkZXIgPSBwYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBGYWtlIGEgc2VsZWN0aW9uIGNoYW5nZWQgZXZlbnQgdG8gdXBkYXRlIHRoZSBtZW51cy4KLQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSAhPSBudWxsKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHNlbGVjdGlvblByb3ZpZGVyLAotCQkJCQkJc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCX0KLQkJfQotCi0JCWFjdGl2YXRlKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlhY3RpdmVWaWV3UGFydC5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMpOwotCi0JCWRlbGV0ZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQljdXRBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJY29weUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQlwYXN0ZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQl1bmRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4obnVsbCk7Ci0JCXJlZG9BY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQotCQlpZiAobG9hZFJlc291cmNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWxvYWRSZXNvdXJjZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKG51bGwpOwotCQl9Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihkZWxldGVBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlicmFyeVZpZXdFZGl0QWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGN1dEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb3B5QWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHBhc3RlQWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNhYmxlR2xvYmFsRWRpdE1lbnUoKSB7Ci0JCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKGxpYnJhcnlWaWV3RWRpdEFjdGlvbiAhPSBudWxsKQotCQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoY29uZmlnVmlld0VkaXRBY3Rpb24gIT0gbnVsbCkKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNvcHlBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl1bmRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZWRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJaWYgKGxpYnJhcnlWaWV3RWRpdEFjdGlvbiAhPSBudWxsKQotCQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWlmIChjb25maWdWaWV3RWRpdEFjdGlvbiAhPSBudWxsKQotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJY3V0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWNvcHlBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdW5kb0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZWRvQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2FjdGl2YXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlVmlld1BhcnQuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkJCi0JCWRlbGV0ZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQljdXRBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJY29weUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQlwYXN0ZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQl1bmRvQWN0aW9uLnNldEVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCXJlZG9BY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQotCQlpZiAobG9hZFJlc291cmNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWxvYWRSZXNvdXJjZUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQl9Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihkZWxldGVBY3Rpb24pOwotCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlicmFyeVZpZXdFZGl0QWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGN1dEFjdGlvbik7Ci0JCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb3B5QWN0aW9uKTsKLQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHBhc3RlQWN0aW9uKTsKLQkJaWYgKHZhbGlkYXRlQWN0aW9uICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih2YWxpZGF0ZUFjdGlvbik7Ci0JCX0KLQotCQlpZiAoY29udHJvbEFjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29udHJvbEFjdGlvbik7Ci0JCX0gICAgICAJCQotCi0JCXVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciN1cGRhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKGFjdGl2ZVZpZXdQYXJ0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCTogYWN0aXZlVmlld1BhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA/IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uCi0JCQkJOiBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JCWRlbGV0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCWxpYnJhcnlWaWV3RWRpdEFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCWN1dEFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCWNvcHlBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQlwYXN0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCXVuZG9BY3Rpb24udXBkYXRlKCk7Ci0JCXJlZG9BY3Rpb24udXBkYXRlKCk7Ci0KLQkJaWYgKGxvYWRSZXNvdXJjZUFjdGlvbiAhPSBudWxsKSB7Ci0JCQlsb2FkUmVzb3VyY2VBY3Rpb24udXBkYXRlKCk7Ci0JCX0KLQotCQlpZiAodmFsaWRhdGVBY3Rpb24gIT0gbnVsbCkgewotCQkJdmFsaWRhdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHN0cnVjdHVyZWRTZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcn0sIGhhbmRsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50fSBieSBxdWVyeWluZyBmb3IKLQkgKiB0aGUgY2hpbGRyZW4gYW5kIHNpYmxpbmdzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBzZWxlY3RlZCBvYmplY3QgYW5kCi0JICogdXBkYXRpbmcgdGhlIG1lbnVzIGFjY29yZGluZ2x5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIFJlbW92ZSBhbnkgbWVudSBpdGVtcyBmb3Igb2xkIHNlbGVjdGlvbi4KLQkJaWYgKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zKTsKLQkJfQotCQlpZiAoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciwgY3JlYXRlU2libGluZ0FjdGlvbnMpOwotCQl9Ci0KLQkJLy8gUXVlcnkgdGhlIG5ldyBzZWxlY3Rpb24gZm9yIGFwcHJvcHJpYXRlIG5ldyBjaGlsZC9zaWJsaW5nIGRlc2NyaXB0b3JzCi0JCUNvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycyA9IG51bGw7Ci0KLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJJiYgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQpCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0KLQkJCW5ld0NoaWxkRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhvYmplY3QsIG51bGwpOwotCQl9Ci0KLQkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KLQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCQlzZWxlY3Rpb24pOwotCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdlbmVyYXRlcyBhIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlQ2hpbGRBY3Rpb259Ci0JICogZm9yIGVhY2ggb2JqZWN0IGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgYW5kIHJldHVybnMgdGhlCi0JICogY29sbGVjdGlvbiBvZiB0aGVzZSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdlbmVyYXRlQ3JlYXRlQ2hpbGRBY3Rpb25zKENvbGxlY3Rpb24gZGVzY3JpcHRvcnMsCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlDb2xsZWN0aW9uIGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBkZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlhY3Rpb25zLmFkZChuZXcgTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24oZWRpdGluZ0RvbWFpbiwKLQkJCQkJCXNlbGVjdGlvbiwgaS5uZXh0KCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdlbmVyYXRlcyBhCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9ufSBmb3IgZWFjaAotCSAqIG9iamVjdCBpbiA8Y29kZT5kZXNjcmlwdG9yczwvY29kZT4sIGFuZCByZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogdGhlc2UgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb24gZGVzY3JpcHRvcnMsCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlDb2xsZWN0aW9uIGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBkZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlhY3Rpb25zLmFkZChuZXcgTWV0aG9kQ3JlYXRlU2libGluZ0FjdGlvbihhY3RpdmVWaWV3UGFydCwKLQkJCQkJCXNlbGVjdGlvbiwgaS5uZXh0KCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cyBiYXNlZCBvbiB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlCi0JICogPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbiwgYnkgaW5zZXJ0aW5nIHRoZW0gYmVmb3JlIHRoZSBzcGVjaWZpZWQKLQkgKiBjb250cmlidXRpb24gaXRlbSA8Y29kZT5jb250cmlidXRpb25JRDwvY29kZT4uIElmIDxjb2RlPklEPC9jb2RlPiBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCB0aGV5IGFyZSBzaW1wbHkgYWRkZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCi0JCQlDb2xsZWN0aW9uIGFjdGlvbnMsIFN0cmluZyBjb250cmlidXRpb25JRCkgewotCQlpZiAoYWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUlBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pIGkubmV4dCgpOwotCQkJCWlmIChjb250cmlidXRpb25JRCAhPSBudWxsKSB7Ci0JCQkJCW1hbmFnZXIuaW5zZXJ0QmVmb3JlKGNvbnRyaWJ1dGlvbklELCBhY3Rpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5tYW5hZ2VyPC9jb2RlPiBhbGwKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW19cyBiYXNlZCBvbiB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb259cyBjb250YWluZWQgaW4gdGhlCi0JICogPGNvZGU+YWN0aW9uczwvY29kZT4gY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlTWFuYWdlcihJQ29udHJpYnV0aW9uTWFuYWdlciBtYW5hZ2VyLAotCQkJQ29sbGVjdGlvbiBhY3Rpb25zKSB7Ci0JCWlmIChhY3Rpb25zICE9IG51bGwpIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtYW5hZ2VyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gTG9vayBpbnRvIFN1YkNvbnRyaWJ1dGlvbkl0ZW1zCi0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYnV0aW9uSXRlbSA9IGl0ZW1zW2ldOwotCQkJCXdoaWxlIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgU3ViQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQljb250cmlidXRpb25JdGVtID0gKChTdWJDb250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQotCQkJCQkJCS5nZXRJbm5lckl0ZW0oKTsKLQkJCQl9Ci0KLQkJCQkvLyBEZWxldGUgdGhlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1zIHdpdGggbWF0Y2hpbmcgYWN0aW9uLgotCQkJCWlmIChjb250cmlidXRpb25JdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQlJQWN0aW9uIGFjdGlvbiA9ICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgY29udHJpYnV0aW9uSXRlbSkKLQkJCQkJCQkuZ2V0QWN0aW9uKCk7Ci0JCQkJCWlmIChhY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpIHsKLQkJCQkJCW1hbmFnZXIucmVtb3ZlKGNvbnRyaWJ1dGlvbkl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwb3B1bGF0ZXMgdGhlIHBvcC11cCBtZW51IGJlZm9yZSBpdCBhcHBlYXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJc3VwZXIubWVudUFib3V0VG9TaG93KG1lbnVNYW5hZ2VyKTsKLQkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOwotCi0JCXN1Ym1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0pOyAKLQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJcmVmcmVzaFZpZXdlckFjdGlvbi5zZXRFbmFibGVkKHJlZnJlc2hWaWV3ZXJBY3Rpb24uaXNFbmFibGVkKCkpOwotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigidWktYWN0aW9ucyIsIHJlZnJlc2hWaWV3ZXJBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkgICAgU3RyaW5nIGtleSA9IChzdHlsZSAmIEFERElUSU9OU19MQVNUX1NUWUxFKSA9PSAwID8gImFkZGl0aW9ucy1lbmQiIDogImFkZGl0aW9ucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICBpZiAodmFsaWRhdGVBY3Rpb24gIT0gbnVsbCkKLQkgICAgewotCSAgICAgIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShrZXksIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHZhbGlkYXRlQWN0aW9uKSk7Ci0JICAgIH0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KElBY3Rpb25CYXJzLAotCSAqICAgICAgSVdvcmtiZW5jaFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycywgcGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXZpZXdBY3Rpb25CYXJzID0gYWN0aW9uQmFyczsKLQotCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0KLQkJbGlicmFyeVZpZXdFZGl0QWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RWRpdEFjdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25MYWJlbF9lZGl0KTsgCi0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihMaWJyYXJ5Vmlld0VkaXRBY3Rpb24uQUNUSU9OX0lELAotCQkJCWxpYnJhcnlWaWV3RWRpdEFjdGlvbik7Ci0KLQkJY3V0QWN0aW9uID0gY3JlYXRlQ3V0QWN0aW9uKCk7Ci0JCWN1dEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0NVVCkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0QWN0aW9uKTsKLQotCQljb3B5QWN0aW9uID0gY3JlYXRlQ29weUFjdGlvbigpOwotCQljb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJY29weUFjdGlvbik7Ci0KLQkJcGFzdGVBY3Rpb24gPSBjcmVhdGVQYXN0ZUFjdGlvbigpOwotCQlwYXN0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1BBU1RFKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJcGFzdGVBY3Rpb24pOwotCi0JCWRlbGV0ZUFjdGlvbiA9IGNyZWF0ZURlbGV0ZUFjdGlvbigpOwotCQlkZWxldGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJZGVsZXRlQWN0aW9uKTsKLQkJCi0JCXVuZG9BY3Rpb24gPSBuZXcgVW5kb0FjdGlvbigpOwotCQl1bmRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ETykpOwotCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJdW5kb0FjdGlvbik7Ci0KLQkJcmVkb0FjdGlvbiA9IG5ldyBSZWRvQWN0aW9uKCk7Ci0JCXJlZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPKSk7Ci0JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlJFRE8uZ2V0SWQoKSwKLQkJCQlyZWRvQWN0aW9uKTsKLQotCQlsaWJyYXJ5Vmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQotCQljb250cmlidXRlVG9Ub29sQmFyKGFjdGlvbkJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjdXQgYWN0aW9uCi0JICogQHJldHVybiBhY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDdXRBY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBwYXN0ZSBhY3Rpb24KLQkgKiBAcmV0dXJuIGFjdGlvbgotCSAqLwotCXByb3RlY3RlZCBQYXN0ZUFjdGlvbiBjcmVhdGVQYXN0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQYXN0ZUFjdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGNvcHkgYWN0aW9uCi0JICogQHJldHVybiBhY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvcHlBY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBkZWxldGUgYWN0aW9uCi0JICogQHJldHVybiBhY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVBY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2dldEFjdGlvbkJhcnMoKQotCSAqLwotCXB1YmxpYyBJQWN0aW9uQmFycyBnZXRBY3Rpb25CYXJzKCkgewotCQlyZXR1cm4gdmlld0FjdGlvbkJhcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5VmFsaWRhdGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5VmFsaWRhdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhNWRlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZhbGlkYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0RpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWNDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5FTUZFZGl0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lWYWxpZGF0aW9uTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLkxpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5MaWJyYXJ5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2V0U2VsZWN0aW9uVGFyZ2V0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRlQWN0aW9uIGV4dGVuZHMgVmFsaWRhdGVBY3Rpb24gewotCXByaXZhdGUgSGFzaFNldCByZXNvdXJjZXM7Ci0JcHJpdmF0ZSBib29sZWFuIHN1Y2Nlc3M7Ci0JcHJpdmF0ZSBib29sZWFuIHNob3dTdWNjZXNzID0gdHJ1ZTsKLQlwcml2YXRlIE1hcCBjb250ZXh0RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCQllY2xpcHNlUmVzb3VyY2VzVXRpbCA9IG5ldyBMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcigpOwotCX0KLQkKLQlwdWJsaWMgTGlicmFyeVZhbGlkYXRlQWN0aW9uKGJvb2xlYW4gc2hvd1N1Y2Nlc3MpIHsKLQkJdGhpcygpOwotCQl0aGlzLnNob3dTdWNjZXNzICA9IHNob3dTdWNjZXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwdXRDb250ZXh0RGF0YShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJY29udGV4dERhdGEucHV0KGtleSwgdmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5WYWxpZGF0ZUFjdGlvbiN2YWxpZGF0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ25vc3RpYyB2YWxpZGF0ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCSAgICBpZihyZXNvdXJjZXMgPT0gbnVsbCkgewotCSAgICAJcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkgICAgfQotCSAgICBlbHNlIHsKLQkgICAgCXJlc291cmNlcy5jbGVhcigpOwotCSAgICB9Ci0JICAgIGJvb2xlYW4gZGVwZW5kZW5jeUluZm9NZ3JTZXQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbiBlT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCWVPYmplY3RzLmFkZChlbGVtZW50KTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdCllbGVtZW50KS5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCQlpZiAoISBkZXBlbmRlbmN5SW5mb01nclNldCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7CQotCQkJCQlwdXRDb250ZXh0RGF0YShMaWJyYXJ5RVZhbGlkYXRvci5DVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUiwgbmV3IERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKGxpYikpOwotCQkJCQlkZXBlbmRlbmN5SW5mb01nclNldCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCSAgICBpbnQgY291bnQgPSBlT2JqZWN0cy5zaXplKCk7Ci0JICAgIGVPYmplY3RzID0gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5Lm1ha2VUYXJnZXRzRGlzam9pbnQoZU9iamVjdHMpOwotCQlMaWJyYXJ5SXRlcmF0b3IgbGliSXRlciA9IG5ldyBMaWJyYXJ5SXRlcmF0b3IoZU9iamVjdHMsIHRydWUsIExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5ERUVQLCB0cnVlKTsKLQkJd2hpbGUobGliSXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gbGliSXRlci5uZXh0KCk7Ci0JCQljb3VudCsrOwotCQkJaWYobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9ICgoRU9iamVjdClvKS5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkgICAgcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzaygiIiwgY291bnQpOyAvLyROT04tTkxTLTEkCi0KLS8vCSAgICBmaW5hbCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IAotLy8JICAgICAgZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluID8gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpIDogbnVsbDsKLQotCSAgICBEaWFnbm9zdGljaWFuIGRpYWdub3N0aWNpYW4gPSAKLQkgICAgICBuZXcgRGlhZ25vc3RpY2lhbigpCi0JICAgICAgewotCSAgICAgICAgcHVibGljIFN0cmluZyBnZXRPYmplY3RMYWJlbChFT2JqZWN0IGVPYmplY3QpCi0JICAgICAgICB7Ci0vLwkgICAgICAgICAgaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwgJiYgIWVPYmplY3QuZUlzUHJveHkoKSkKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKWFkYXB0ZXJGYWN0b3J5LmFkYXB0KGVPYmplY3QsIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0vLwkgICAgICAgICAgICBpZiAoaXRlbUxhYmVsUHJvdmlkZXIgIT0gbnVsbCkKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1MYWJlbFByb3ZpZGVyLmdldFRleHQoZU9iamVjdCk7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgfQotLy8JICAKLS8vCSAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0T2JqZWN0TGFiZWwoZU9iamVjdCk7Ci0JICAgICAgICAJCi0JICAgICAgICAJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlT2JqZWN0KTsKLQkgICAgICAgIH0KLQotCSAgICAgICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoRUNsYXNzIGVDbGFzcywgRU9iamVjdCBlT2JqZWN0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KQotCSAgICAgICAgewotCSAgICAgICAgICBwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOwotCSAgICAgICAgICBpZihjb250ZXh0ID09IG51bGwpIHsKLQkgICAgICAgIAkgIGNvbnRleHQgPSBjb250ZXh0RGF0YTsJICAgICAgICAJICAKLQkgICAgICAgICAgfQotCSAgICAgICAgICBlbHNlIHsKLQkgICAgICAgIAkgIGNvbnRleHQucHV0QWxsKGNvbnRleHREYXRhKTsKLQkgICAgICAgICAgfQotCSAgICAgICAgICByZXR1cm4gc3VwZXIudmFsaWRhdGUoZUNsYXNzLCBlT2JqZWN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JICAgICAgICB9CSAgICAgICAgCi0JICAgICAgICAKLQkgICAgICB9OwotCSAgICAgIAotCSAgICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZU9iamVjdHMpOwotCSAgICAgIGludCBtYXggPSBsaXN0LnNpemUoKSAtIDE7Ci0JICAgICAgU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JICAgIAkgIE9iamVjdCBlID0gbGlzdC5nZXQoaSk7Ci0JICAgIAkgIGlmKGUgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkgICAgCQkgIHN0ckJ1Zi5hcHBlbmQoKChOYW1lZEVsZW1lbnQpZSkuZ2V0TmFtZSgpKS5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCSAgfQotCSAgICAgIH0KLQkgICAgICBPYmplY3QgZSA9IG1heCA8IDAgPyBudWxsIDogbGlzdC5nZXQobWF4KTsKLQkgICAgICBpZihlIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0gICAgCQkgIHN0ckJ1Zi5hcHBlbmQoKChOYW1lZEVsZW1lbnQpZSkuZ2V0TmFtZSgpKTsKLSAgICAJICB9Ci0JICAgICAgQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWNzID0gCi0JICAgICAgICAgIG5ldyBCYXNpY0RpYWdub3N0aWMKLQkgICAgICAgICAgICAoRU9iamVjdFZhbGlkYXRvci5ESUFHTk9TVElDX1NPVVJDRSwKLQkgICAgICAgICAgICAgMCwKLQkgICAgICAgICAgICAgRWNvcmVQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nCi0JICAgICAgICAgICAgICAgKCJfVUlfRGlhZ25vc3RpY1Jvb3RfZGlhZ25vc3RpYyIsIC8vJE5PTi1OTFMtMSQgCi0JICAgICAgICAgICAgICAgIG5ldyBPYmplY3QgW10geyBzdHJCdWYudG9TdHJpbmcoKSB9KSwgCi0JICAgICAgICAgICAgIGxpc3QudG9BcnJheSgpKTsKLQkgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkgICAgCSAgRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCSAgICAJICBwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUKLQkgICAgCSAgKEVNRkVkaXRVSVBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9WYWxpZGF0aW5nX21lc3NhZ2UiLCBuZXcgT2JqZWN0IFtdIHtkaWFnbm9zdGljaWFuLmdldE9iamVjdExhYmVsKGVPYmplY3QpfSkpOyAvLyROT04tTkxTLTEkCi0JICAgIAkgIGRpYWdub3N0aWNpYW4udmFsaWRhdGUoZU9iamVjdCwgZGlhZ25vc3RpY3MpOwotCSAgICAgIH0KLQkgICAgICBzdWNjZXNzID0gZGlhZ25vc3RpY3MuZ2V0U2V2ZXJpdHkoKSA9PSBEaWFnbm9zdGljLk9LOwotCSAgICAgIHJldHVybiBkaWFnbm9zdGljczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uI2hhbmRsZURpYWdub3N0aWMob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRGlhZ25vc3RpYyhEaWFnbm9zdGljIGRpYWdub3N0aWMpIHsKLQkJaWYoZGlhZ25vc3RpYyAhPSBudWxsKSB7Ci0JCQlpZihzaG93U3VjY2VzcyB8fCAhaXNTdWNjZXNzZnVsKCkpIHsKLQkJCQkvLyBzYXZlIHRoZSByZWZlcmVuY2UgdG8gRWNsaXBzZVJlc291cmNlc1V0aWwgYW5kIHNldCBlY2xpcHNlUmVzb3VyY2VzVXRpbCB0byBudWxsCi0JCQkJLy8gc28gc3VwZXIgbWV0aG9kIHdpbGwgbm90IHRyeSB0byBkZWFsIHdpdGggdGhlIG1hcmtlcnMKLQkJCQkvLwotCQkJCUVjbGlwc2VSZXNvdXJjZXNVdGlsIHNhdmVkUmVmID0gZWNsaXBzZVJlc291cmNlc1V0aWw7Ci0JCQkJZWNsaXBzZVJlc291cmNlc1V0aWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCXN1cGVyLmhhbmRsZURpYWdub3N0aWMoZGlhZ25vc3RpYyk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQllY2xpcHNlUmVzb3VyY2VzVXRpbCA9IHNhdmVkUmVmOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZGVhbGluZyB3aXRoIG1hcmtlcnMKLQkJCS8vCi0JCQlpZiAoZWNsaXBzZVJlc291cmNlc1V0aWwgIT0gbnVsbCkJCQkJCi0JCQl7Ci0JCQkJLy8gZGVsZXRlIG9sZCBtYXJrZXJzCi0JCQkJLy8JCQkJCQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJZWNsaXBzZVJlc291cmNlc1V0aWwuZGVsZXRlTWFya2VycygoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCQkJaWYgKCFkaWFnbm9zdGljLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKQotCQkJCXsKLQkJCQkJTWFwIGRpYWdub3N0aWNUb1Jlc291cmNlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQkJCXsKLQkJCQkJCURpYWdub3N0aWMgY2hpbGREaWFnbm9zdGljID0gKERpYWdub3N0aWMpaS5uZXh0KCk7Ci0JCQkJCQlMaXN0IGRhdGEgPSBjaGlsZERpYWdub3N0aWMuZ2V0RGF0YSgpOwotCQkJCQkJaWYgKCFkYXRhLmlzRW1wdHkoKSkgewotCQkJCQkJCU9iamVjdCBvID0gZGF0YS5nZXQoMCk7Ci0JCQkJCQkJaWYobyBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpbykuZVJlc291cmNlKCk7Ci0JCQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWRpYWdub3N0aWNUb1Jlc291cmNlTWFwLnB1dChjaGlsZERpYWdub3N0aWMsIHJlc291cmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkJCQkJCQotCQkJCQkvLyBjcmVhdGUgbWFya2VycwotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBkaWFnbm9zdGljVG9SZXNvdXJjZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQkJCXsKLQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaS5uZXh0KCk7Ci0JCQkJCQlEaWFnbm9zdGljIGNoaWxkRGlhZ25vc3RpYyA9IChEaWFnbm9zdGljKWVudHJ5LmdldEtleSgpOwotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQllY2xpcHNlUmVzb3VyY2VzVXRpbC5jcmVhdGVNYXJrZXJzKHJlc291cmNlLCBjaGlsZERpYWdub3N0aWMpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBzZWxlY3QgdGhlIGZpcnN0IG9iamVjdCB3aXRoIHByb2JsZW0gaW4gdGhlIHZpZXdlciBpZiBwb3NzaWJsZQotCQkJCQkvLwotCQkJCQlMaXN0IGRhdGEgPSAoKERpYWdub3N0aWMpZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLmdldCgwKSkuZ2V0RGF0YSgpOwotCQkJCQlpZiAoIWRhdGEuaXNFbXB0eSgpKQotCQkJCQl7Ci0JCQkJCQlPYmplY3QgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsJCQkJCQkKLQkJCQkJCU9iamVjdCBlID0gZGF0YS5nZXQoMCk7Ci0JCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIElTZXRTZWxlY3Rpb25UYXJnZXQpCi0JCQkJCQl7Ci0JCQkJCQkJKChJU2V0U2VsZWN0aW9uVGFyZ2V0KXBhcnQpLnNlbGVjdFJldmVhbChuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChwYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKQotCQkJCQkJewotCQkJCQkJCXZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKXBhcnQpLmdldFZpZXdlcigpOwotCQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkKLQkJCQkJCQl7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZGF0YS5nZXQoMCkpLCB0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCQlpZih2aWV3ZXIgPT0gbnVsbCkgewotCQkJCQlPYmplY3QgcGFydCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpCi0JCQkJCXsKLQkJCQkJCXZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKXBhcnQpLmdldFZpZXdlcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCS8vIGNsZWFyIGRlY29yYXRpb24gY2FjaGUKLQkJCQkJLy8KLQkJCQkJTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yLmNsZWFyRGVjb3JhdGlvbkNhY2hlKCk7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCXJlZnJlc2hWaWV3cygpOwotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdzKCkgewotCQkvLyBubyBlcnJvciBtYXJrZXJzIGZvciBjb25maWd1cmF0aW9uIHZpZXcKLQkJLy8KLS8vCQlDb25maWd1cmF0aW9uVmlldy5nZXRWaWV3KCkuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpIHsKLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3Q29weUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3Q29weUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E3YjM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0NvcHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weVRvQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ2xpcGJvYXJkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotCi0vKioKLSAqIENvcGllcyBhbiBlbGVtZW50IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0NvcHlBY3Rpb24gZXh0ZW5kcyBDb3B5QWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY29tbWFuZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCQkoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKS5yZXNldENvcHlNYXBzKCk7Ci0JCQl9Ci0JCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvcHlUb0NsaXBib2FyZENvbW1hbmQpIHsKLQkJCQlTdHJpbmcgbGlua3MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29weVRvQ2xpcGJvYXJkQ29tbWFuZCljb21tYW5kKS5nZXRTb3VyY2VPYmplY3RzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGl0ZW0gPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbTsKLQkJCQkJCVN0cmluZyBocmVmID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGUsCi0JCQkJCQkJCW51bGwsICJodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChsaW5rcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlsaW5rcyArPSBTdHJVdGlsLkxJTkVfRkVFRDsKLQkJCQkJCX0KLQkJCQkJCWxpbmtzICs9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rKGUsIHRydWUsCi0JCQkJCQkJCSJmaWxlOi8vIiArIGhyZWYpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxpbmtzLmxlbmd0aCgpID4gMCkgewotCQkJCQloYW5kbGVDb3B5VGV4dEhUTUxUb0NsaXBib2FyZChsaW5rcyk7Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIucnVuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGNvcHlpbmcgdGhlIGxpbmtzIHRvIHRoZSBjbGlwYm9hcmQgYXMgVGV4dCBhbmQgSFRNTAotCSAqIEBwYXJhbSBsaW5rcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNvcHlUZXh0SFRNTFRvQ2xpcGJvYXJkKFN0cmluZyBsaW5rcykgewotCQlDbGlwYm9hcmRVdGlsLmNvcHlUZXh0SFRNTFRvQ2xpcGJvYXJkKGxpbmtzKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJfQotCi0JCWNvbW1hbmQgPSBjcmVhdGVDb21tYW5kKGNvbGxlY3Rpb24pOwotCi0JCXJldHVybiBjb21tYW5kLmNhbkV4ZWN1dGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0N1dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3Q3V0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyY2NkZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3Q3V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogQ3V0cyBhbiBlbGVtZW50IGluIHRoZSBMaWJyYXJ5IHZpZXcgdG8gdGhlIGNsaXBib2FyZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3Q3V0QWN0aW9uIGV4dGVuZHMgQ3V0QWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY29tbWFuZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlCi0JCQlzdXBlci5ydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdEZWxldGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Y0NGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5JRWRpdG9yS2VlcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLS8qKgotICogRGVsZXRlcyBhbiBlbGVtZW50IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiB7Ci0JCi0JLyoqIAotCSAqIERlbGV0cyBhbiBlbGVtZW50IGluIGxpYnJhcnkgdmlldwotCSAqIAotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbigpIHsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlcyBhbiBlbGVtZW50IGluIGxpYnJhcnkgdmlldyBhZnRlciBjb25maXJtaW5nIHdpdGggdXNlcgotCSAqIEBwYXJhbSBjb25maXJtCi0JICovCi0JcHVibGljIExpYnJhcnlWaWV3RGVsZXRlQWN0aW9uKGJvb2xlYW4gY29uZmlybSkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbmZpcm0gPSBjb25maXJtOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jZGlkRGVsZXRlKENvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlkRGVsZXRlKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCXN1cGVyLmRpZERlbGV0ZShkZWxldGVkRWxlbWVudHMpOwotCQkKLQkJLy8gQ2xvc2UgYWxsIG9wZW4gZWRpdG9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGRlbGV0ZWQgZWxlbWVudHMuCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQlJRWRpdG9yS2VlcGVyLlJFRkVSRU5DRS5nZXRFZGl0b3JLZWVwZXIoKQotCQkJCQkJLmNsb3NlRWRpdG9yc09uRGVsZXRpb24oKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KE9iamVjdCBvYmplY3QpIHsKLQkJZm9yKDsgb2JqZWN0IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXI7IG9iamVjdCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRPd25lcigpKTsKLQkJb2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICYmIFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpID8KLQkJCShDdXN0b21DYXRlZ29yeSkgb2JqZWN0IDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUFycmF5TGlzdCBmaWx0ZXJlZFNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgVG5nVXRpbAotCQkJCQkJCS5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3RDdXN0b21DYXRlZ29yeSA9IGdldFJvb3RDdXN0b21DYXRlZ29yeShlKTsKLQkJCQlDdXN0b21DYXRlZ29yeSBjYyA9IChDdXN0b21DYXRlZ29yeSkgZWxlbWVudDsKLQkJCQlpZiAocm9vdEN1c3RvbUNhdGVnb3J5ICE9IG51bGwgJiYgCi0JCQkJCQlVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihyb290Q3VzdG9tQ2F0ZWdvcnkpID09IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNjKSkgewotCQkJCQkvLyBzZWxlY3RlZCBjdXN0b21lIGNhdGVnb3J5IGlzIGluIHRoZSBjdXJyZW50IHBsdWdpbi4KLQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBzZWxlY3Rpb24gaW5zdGVhZCBvZiBpdHMKLQkJCQkJLy8gd3JhcHBlciBzbyB0aGUgZWxlbWVudAotCQkJCQkvLyB3aWxsIGJlIGRlbGV0ZWQgcGVybWFuZW50bHkgZnJvbSB0aGUgbGlicmFyeQotCQkJCQkvLwotCQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZWxlbWVudCk7CQkJCQkKLQkJCQl9Ci0JCQl9IGVsc2UgewkJCQkKLQkJCQlpZihlIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcikgZTsKLS8vCQkJCQlpZih3cmFwcGVyLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciAmJgotLy8JCQkJCQkJIShUbmdVdGlsLnVud3JhcCh3cmFwcGVyLmdldE93bmVyKCkpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKSB7Ci0vLwkJCQkJCS8vIGRpc2FsbG93IGRlbGV0aW5nIGVsZW1lbnQgd2hlbiBpdHMgcmVmZXJlbmNlIGluCi0vLwkJCQkJCS8vIEN1c3RvbUNhdGVnb3J5IHRyZWUKLS8vCQkJCQkJLy8gdGhhdCBpcyBub3QgZGlyZWN0bHkgdW5kZXIgYSBDdXN0b21DYXRlZ29yeSBpcwotLy8JCQkJCQkvLyBzZWxlY3RlZAotLy8JCQkJCQkvLwotLy8JCQkJCQljb250aW51ZTsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoVG5nVXRpbC5pc1VuZGVyQ3VzdG9tQ2F0ZWdvcnlUcmVlKHdyYXBwZXIpKSB7Ci0JCQkJCQkvLyBkaXNhbGxvdyBkZWxldGluZyBlbGVtZW50IHVuZGVyIGEgY3VzdG9tIGNhdGVnb3J5IHRoYXQgaXMgbm90IGEgY3VzdG9tIGNhdGVnb3J5Ci0JCQkJCQkvLwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAod3JhcHBlci5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyAKLQkJCQkJCQl8fCB3cmFwcGVyLmdldEZlYXR1cmUoKSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMpIAotCQkJCQl7Ci0JCQkJCQlPYmplY3Qgb3duZXIgPSB3cmFwcGVyLmdldE93bmVyKCk7Ci0JCQkJCQlpZihvd25lciBpbnN0YW5jZW9mIEVPYmplY3QgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QgJiYgCi0JCQkJCQkJCVVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvd25lcikgPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gY2F0ZWdvcnkgZ3JvdXBpbmcgYW5kIGNhdGVnb3J5IGFyZSBpbiB0aGUgc2FtZSBwbHVnaW4KLQkJCQkJCQkvLyBhZGQgdGhlIGVsZW1lbnQgdG8gdGhlIHNlbGVjdGlvbiBpbnN0ZWFkIG9mIGl0cyB3cmFwcGVyIHNvIHRoZSBlbGVtZW50IAotCQkJCQkJCS8vIHdpbGwgYmUgZGVsZXRlZCBwZXJtYW5lbnRseSBmcm9tIHRoZSBsaWJyYXJ5Ci0JCQkJCQkJLy8KLQkJCQkJCQlmaWx0ZXJlZFNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChmaWx0ZXJlZFNlbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHN1cGVyCi0JCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWx0ZXJlZFNlbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI3BlcmZvcm1EZWxldGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWxldGUoKSB7Ci0JCUhhc2hTZXQgY29uZmlnc1RvRGVsZXRlID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJY29uZmlnc1RvRGVsZXRlLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCAmJiAhcGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKG9iamVjdCkpIHsKLQkJCQkJRU9iamVjdCBjb250YWluZXIgPSAoKEVPYmplY3QpIG9iamVjdCkuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQXZvaWQgZGVsZXRpbmcgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBhIHByb2Nlc3MuCi0JCWlmICghY29uZmlnc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJSGFzaFNldCBjb25maWdHVUlEc1RvRGVsZXRlID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3NUb0RlbGV0ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQljb25maWdHVUlEc1RvRGVsZXRlLmFkZChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCX0KLQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKQotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCXJlc291cmNlU2V0Ci0JCQkJCS5sb2FkT3Bwb3NpdGVGZWF0dXJlcygKLQkJCQkJCQlDb2xsZWN0aW9ucwotCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3QoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kQ29uZmlndXJhdGlvbl9EZXBlbmRlbnRQcm9jZXNzZXMpLAotCQkJCQkJCWNvbmZpZ0dVSURzVG9EZWxldGUpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzVG9EZWxldGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0KLQkJCQlMaXN0IHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERlcGVuZGVudFByb2Nlc3Nlcyhjb25maWcpOwotCQkJCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgcmVmZXJlbmNlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCVN0cmluZyBwcm9jZXNzTmFtZSA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSByZWZlcmVuY2VzCi0JCQkJCQkJLmdldCgwKSkuZ2V0TmFtZSgpOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWxldGVEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlQ29uZmlnRXJyb3JfbXNnLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZUNvbmZpZ0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQlwcm9jZXNzTmFtZSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJfQotCi0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShtb2RpZmllZFJlc291cmNlcywKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheSgKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLCAKLQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb25maXJtRGVsZXRlKCkpIHsKLQkJCS8vIENvbGxlY3QgdGhlIGluZm9ybWF0aW9uIG9mIFJlZnJlc2hhYmxlIE9iamVjdHMKLQkJCS8vICggUmVmZXJlbmNlIE9iamVjdHMgc2hvdWxkIGJlIHJlZnJlc2hlZCBpbiBuYXZpZ2F0aW9uIHRyZWUpIC0KLQkJCUFycmF5TGlzdCByZWZyZXNoTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZGVsZXRpbmdPYmplY3QgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGRlbGV0aW5nT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkvLyBjaGVjayBmb3IgdmFyaWFiaWxpdHkKLQkJCQkJaWYgKGRlbGV0aW5nT2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gVG5nVXRpbAotCQkJCQkJCQkuZ2V0R2VuZXJhbGl6ZXJzKChWYXJpYWJpbGl0eUVsZW1lbnQpIGRlbGV0aW5nT2JqZWN0KTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYVJlZmVyZW5jZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlyZWZyZXNoTGlzdC5hZGQoYVJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCkgKGNvbW1hbmQgaW5zdGFuY2VvZiBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCA/IGNvbW1hbmQgOiBudWxsKTsKLQkJCQotCQkJLy8gZXhlY3V0ZSBhY3R1YWwgZGVsZXRlIGNvbW1hbmQuCi0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQotCQkJLy8gZGVsZXRlIHRoZSByZWZlcmVuY2luZyBkZXNjcmlwdG9ycyBpZiB0aGVyZSBpcyBhbnkKLQkJCS8vCi0JCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnNUb0RlbGV0ZSA9IGNtZC5nZXREZXNjcmlwdG9yc1RvRGVsZXRlKCk7Ci0JCQkJaWYoZGVzY3JpcHRvcnNUb0RlbGV0ZSAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJCQlQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShkZXNjcmlwdG9yc1RvRGVsZXRlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlZnJlc2ggdGhlIHJlZnJlc2hsaXN0IG9iamVjdHMgaW4gbmF2aWdhdGlvbiB0cmVlLgotCQkJaWYgKHJlZnJlc2hMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlUcmVlVmlld2VyIHZpZXdlciA9ICgoVHJlZVZpZXdlcikgKExpYnJhcnlWaWV3LmdldFZpZXcoKQotCQkJCQkJLmdldFZpZXdlcigpKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmcmVzaExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgcHJvcGVyeSBjaGFuZ2Ugd2l0aCBvbGQgYW5kIG5ldyB2YWx1ZQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAJCQlwcm9wZXJ0eSBuYW1lIGZvciB3aGljaCB2YWx1ZSBpcyBnb2luZyB0byBjaGFuZ2UKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKiAJCQlPbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogCQkJTmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkJCU9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGN1c3RvbWNhdGVnb3J5IENvcHkvRGVsZXRlIGFjdGlvbiBJZiBwYXJlbnQgb2YKLQkgKiBjdXN0b21jYXRlZ29yeSBzZWxlY3RlZCwgaWdub3JlIHRoZSBjdXN0b21jYXRlZ29yeSwgb3RoZXJ3aXNlIGNvbXBvdW5kCi0JICogY29tbWFuZCBjcmVhdGVzIGEgY29tbWFuZCBmb3IgcGFyZW50IGFuZCBhIGNvbW1hbmQgZm9yIGNoaWxkLAotCSAqIENvbXBvdW5kQ29tbWFuZCB3aWxsIGV4ZWN1dGUgYm90aCBjb21tYW5kcywgY29tbWFuZCBmb3IgcGFyZW50IHdpbGwKLQkgKiByZW1vdmUgcGFyZW50IGl0c2VsZiBhbmQgcmVtb3ZlcyBjaGlsZCB0b28sIG5leHQgaXQgdHJ5IHRvIGV4ZWN1dGUKLQkgKiBjb21tYW5kIGZvciBjaGlsZCwgY29tbWFuZCB3aWxsIGZhaWwgYmVjYXVzZSBjaGlsZCBnb3QgcmVtb3ZlIGluIGNvbW1hbmQKLQkgKiBmb3IgcGFyZW50LiAKLQkgKiBUT0RPOiBoYW5kbGUgcHJvcGVybHkgaW4gUmVtb3ZlQ29tbWFuZCBmb3IgdGhpcyBjYXNlIGluc3RlYWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWx0ZXJDdXN0b21DYXRlZ29yeVNlbGVjdGlvbihPYmplY3QgZSwgTGlzdCBmaWx0ZXJlZFNlbGVjdGlvbikgewotCQlpZiAoZSBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJfSBlbHNlIHsKLQkJCU9iamVjdCBvd25lciA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIGUpLmdldE93bmVyKCk7Ci0JCQl3aGlsZSAob3duZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaWYgKCFmaWx0ZXJlZFNlbGVjdGlvbi5jb250YWlucyhvd25lcikpIHsKLQkJCQkJCWZpbHRlcmVkU2VsZWN0aW9uLmFkZChlKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKQotCQkJCQkJYnJlYWs7Ci0JCQkJCW93bmVyID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgb3duZXIpLmdldE93bmVyKCk7Ci0JCQkJCWlmICghKG93bmVyIGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJCWlmICghZmlsdGVyZWRTZWxlY3Rpb24uY29udGFpbnMob3duZXIpKSB7Ci0JCQkJCQkJZmlsdGVyZWRTZWxlY3Rpb24uYWRkKGUpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RWRpdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RWRpdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjYwZGQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0VkaXRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotCi0KLS8qKgotICogRWRpdHMgYW4gZWxlbWVudCBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdFZGl0QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBJRCBmb3IgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lEID0gTGlicmFyeVZpZXdFZGl0QWN0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb24gc2VsZWN0ZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld0VkaXRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3RlZC5pdGVyYXRvcigpOyBvYmplY3RzLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gb2JqZWN0cy5uZXh0KCk7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhpcyBhY3Rpb24gaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIHNlbGVjdGlvbiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXNlbGVjdGVkID0gbmV3IEhhc2hTZXQoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IG9iamVjdHMubmV4dCgpOwotCQkJT2JqZWN0IHJlYWxPYmogPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCWlmIChyZWFsT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIHJlYWxPYmopCi0JCQkJCSYmICEocmVhbE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmICEocmVhbE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSkgewotCQkJCXNlbGVjdGVkLmFkZChyZWFsT2JqKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAhc2VsZWN0ZWQuaXNFbXB0eSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTkzYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotCi0vKioKLSAqIAotICogRmluZHMgYW4gZWxlbWVudCBpbiBsaWJyYXJ5IHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBJRCBmb3IgdGhpcyBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0lEID0gTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQkKLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZDsKLQotCQotCXB1YmxpYyBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHRhcmdldFZpZXcgPT0gbnVsbCkKLQkJCXRhcmdldFZpZXcgPSBMaWJyYXJ5Vmlldy5nZXRWaWV3KCk7Ci0KLQkJLy8gc2VsZWN0IGN1cnJlbnRTZWxlY3Rpb24gaW4gTGliIFZpZXcKLQkJaWYgKHRhcmdldFZpZXcgIT0gbnVsbCAmJiBzZWxlY3RlZCAhPSBudWxsICYmICFzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQotCQkJdHJ5IHsKLQkJCQl0YXJnZXRWaWV3LmdldFNpdGUoKS5nZXRQYWdlKCkuc2hvd1ZpZXcoTGlicmFyeVZpZXcuVklFV19JRCk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBwZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihwZSk7Ci0JCQl9Ci0KLQkJCWZpbmFsIE9iamVjdCBzZWxlY3RlZE9iamVjdCA9IHNlbGVjdGVkLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoCi0JCQkJCQkJCXNlbGVjdGVkT2JqZWN0KTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24jdXBkYXRlU2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZCA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCU9iamVjdCByZWFsT2JqID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAocmVhbE9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3UGFzdGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NTg4YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3UGFzdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLklMaWJyYXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotCi0KLS8qKgotICogUGFzdGVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgY2xpcGJvYXJkIHRvIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNTU5Ci0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5Vmlld1Bhc3RlQWN0aW9uIGV4dGVuZHMgUGFzdGVBY3Rpb24gaW1wbGVtZW50cwotCQlJTGlicmFyeUFjdGlvbiB7Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXBlcmZvcm1QYXN0ZSgpOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtIHBhc3RlIG9wZXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1QYXN0ZSgpIHsKLQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgY21kID0gKChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKWNvbW1hbmQpOwotCQkJT2JqZWN0IG93bmVyID0gY21kLmdldE93bmVyKCk7Ci0JCQlpZihvd25lciBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCQlvd25lciA9ICgoQWRhcHRlcilvd25lcikuZ2V0VGFyZ2V0KCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGNoZWNrIHRhcmdldCBmb3IgbW9kaWZpYWJsZQotCQkJLy8KLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KChFT2JqZWN0KSBvd25lciwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlnZXRUZXh0KCksIG51bGwsIHN0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJCi0JCWlmIChjb21tYW5kID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCXN1cGVyLnJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSB8fCBzZWxlY3Rpb24uc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2V7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogTm90aWZ5IHByb3BlcnkgY2hhbmdlIHdpdGggb2xkIGFuZCBuZXcgdmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogCQkJcHJvcGVydHkgbmFtZSBmb3Igd2hpY2ggdmFsdWUgaXMgZ29pbmcgdG8gY2hhbmdlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogCQkJT2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIAkJCU5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlQcm9wZXJ0eUNoYW5nZShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb24jc2V0UHJvZ3Jlc3NNb25pdG9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIHRoZSBwcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKHByb2dyZXNzTW9uaXRvciA9PSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL0xpYnJhcnlWaWV3U2ltcGxlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczZGQwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBCYXNlIGZvciBzaW1wbGUgbGlicmFyeSBhY3Rpb24gY2xhc3NlcwotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgIDEuNQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlicmFyeVZpZXdTaW1wbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBMaWJyYXJ5VmlldyBsaWJyYXJ5VmlldzsKLQkKLQkvKioKLQkgKiBAcGFyYW0gbGliVmlldwotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIExpYnJhcnlWaWV3U2ltcGxlQWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQlsaWJyYXJ5VmlldyA9IGxpYlZpZXc7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvUnVuKCk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWRvUnVuKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlicmFyeVZpZXcgZ2V0TGlicmFyeVZpZXcoKSB7Ci0JCXJldHVybiBsaWJyYXJ5VmlldzsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3Rpb25QYXJlbnRPYmplY3QoKSB7Ci0JCVRyZWVJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IGdldExpYnJhcnlWaWV3KCkuZ2V0VHJlZVZpZXdlcigpLmdldFRyZWUoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGVkSXRlbXMgPT0gbnVsbCB8fCBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlUcmVlSXRlbSBpdGVtID0gc2VsZWN0ZWRJdGVtc1swXS5nZXRQYXJlbnRJdGVtKCk7Ci0JCXJldHVybiBUbmdVdGlsLnVud3JhcChpdGVtLmdldERhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYXZlKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlKSB7Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCXRyeSB7Ci0JCQlIYXNoU2V0PFJlc291cmNlPiBzZWVucyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSByZXNvdXJlc1RvU2F2ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0Lm5leHQoKTsKLQkJCQlpZiAoISBzZWVucy5jb250YWlucyhyZXMpKSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQkJCXNlZW5zLmFkZChyZXMpOwotCQkJCX0KLQkJCX0KLQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDdXN0b21lQ2F0ZWdvcnlBY3Rpb24gZXh0ZW5kcyBMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbiB7Ci0JCXB1YmxpYyBDdXN0b21lQ2F0ZWdvcnlBY3Rpb24oTGlicmFyeVZpZXcgbGliVmlldywgU3RyaW5nIHRleHQpIHsKLQkJCXN1cGVyKGxpYlZpZXcsIHRleHQpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja01vZGlmeSgpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0TGlicmFyeVZpZXcoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJfHwgKGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KSkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlpZiAoISBjaGVja01vZGlmeShlbGVtZW50KSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkJCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja01vZGlmeShPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCXx8IChlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCkpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkvLyBIYW5kbGUgQ3VzdG9tQ2F0ZWdvcnkgc3BlY2lhbGx5LgotCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCQljb250YWluZXIsIGdldExpYnJhcnlWaWV3KCkuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ19tb3ZlRXJyb3IsCi0JCQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTGlua1dpdGhFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaW5rV2l0aEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTYzNDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9MaW5rV2l0aEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBMaW5rcyBlZGl0b3Igd2l0aCBhbiBlbGVtZW50IGluIGxpYnJhcnkgdmlldwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTGlua1dpdGhFZGl0b3IgaW1wbGVtZW50cyBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgTGlicmFyeVZpZXcgdGFyZ2V0VmlldzsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIGVkaXRvclBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkvLyBTZWxlY3QgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudGx5Ci0JCQkJLy8gc2VsZWN0ZWQgZWRpdG9yLgotCQkJCU9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0WzFdOwotCQkJCW9iamVjdHNbMF0gPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRBY3RpdmVNZXRob2RFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChvYmplY3RzWzBdICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYWJsZSB0aGUgc2VsZWN0aW9uQ2hhbmdlZCBtZXRob2QgZnJvbSBmaXJpbmcgZnJvbSB0aGlzIHNlbGVjdGlvbiBjaGFuZ2UKLQkJCQkJZW5hYmxlZCA9IGZhbHNlOwotCQkJCQl0YXJnZXRWaWV3LnNldFNlbGVjdGlvblRvVmlld2VyKG9iamVjdHNbMF0pOwotCQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGVuYWJsZWQpIHsKLQkJCS8vIHJlbW92ZSBsaXN0ZW5lcnMgZnJvbSBlZGl0b3JwYXJ0Ci0JCQl0YXJnZXRWaWV3LmdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKAotCQkJCQllZGl0b3JQYXJ0TGlzdGVuZXIpOwotCi0JCQllbmFibGVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZWxlY3QgZWxlbWVudCBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgZWRpdG9yCi0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFsxXTsKLQkJCW9iamVjdHNbMF0gPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0QWN0aXZlTWV0aG9kRWRpdG9ySW5wdXQoKTsKLQkJCWlmIChvYmplY3RzWzBdICE9IG51bGwpIHsKLQkJCQl0YXJnZXRWaWV3LnNldFNlbGVjdGlvblRvVmlld2VyKG9iamVjdHNbMF0pOwotCQkJfQotCi0JCQkvLyBhZGQgbGlzdGVuZXJzIHRvIGVkaXRvcnBhcnQKLQkJCXRhcmdldFZpZXcuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIoZWRpdG9yUGFydExpc3RlbmVyKTsKLQotCQkJZW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJMaW5rV2l0aEVkaXRvciBzZWxlY3Rpb24gaXMgIiArIHNlbGVjdGlvbik7Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5zZWxlY3RFZGl0b3Ioc2VsLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRJbWFnZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZEltYWdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDg5OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZEFkZEltYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuTWV0aG9kQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlJpY2hUZXh0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBBZGQgSW1hZ2UgZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQWRkSW1hZ2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RBZGRJbWFnZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgQSBSaWNoIFRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCAmJiByaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJTWV0aG9kQWRkSW1hZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1ldGhvZEFkZEltYWdlRGlhbG9nKERpc3BsYXkKLQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkoKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJaWYgKGRpYWxvZy5nZXRGaWxlVG9Db3B5KCkgIT0gbnVsbCkgewotCQkJCQkvLyBDb3B5IHRoZSBpbWFnZSB0byB0aGUgcmVzb3VyY2UgZm9sZGVyIGlmIG5lY2Vzc2FyeS4KLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBpbWFnZUxpbmsgPSBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKExpYnJhcnlVSVV0aWwuZ2V0VVJMRm9yQXR0YWNobWVudChEaXNwbGF5Ci0JCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgZGlhbG9nCi0JCQkJCQkJCS5nZXRGaWxlVG9Db3B5KCksCi0JCQkJCQkJCSgoSU1ldGhvZFJpY2hUZXh0KSByaWNoVGV4dCkKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpLCB0cnVlKSk7Ci0JCQkJCQlpZiAoaW1hZ2VMaW5rID09IG51bGwpIHsKLQkJCQkJCQkvLyB1c2VyIGhpdCBjYW5jZWwgb24gUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCQkJCQkoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuc2V0Rm9jdXMoKTsKLQkJCQkJCQkoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuYWRkSW1hZ2UoaW1hZ2VMaW5rLCAiIiArIGRpYWxvZy5nZXRIZWlnaHQoKSwgIiIgKyBkaWFsb2cuZ2V0V2lkdGgoKSwgZGlhbG9nLmdldEFsdFRhZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJpY2hUZXh0Ci0JCQkJCQkJLmV4ZWN1dGVDb21tYW5kKAotCQkJCQkJCQkJUmljaFRleHRDb21tYW5kLkFERF9JTUFHRSwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJCWltYWdlTGluaywKLQkJCQkJCQkJCQkJIiIgKyBkaWFsb2cuZ2V0SGVpZ2h0KCksICIiICsgZGlhbG9nLmdldFdpZHRoKCksIGRpYWxvZy5nZXRBbHRUYWcoKSB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRMaW5rQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQWRkTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBlYWZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RBZGRMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLk1ldGhvZEFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRMaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGEgbGluayB0byBhIFJpY2ggVGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBZGRMaW5rQWN0aW9uIGV4dGVuZHMgQWRkTGlua0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RBZGRMaW5rQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIEEgUmljaCBUZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCU1ldGhvZEFkZExpbmtEaWFsb2cgZGlhbG9nID0gbmV3IE1ldGhvZEFkZExpbmtEaWFsb2coRGlzcGxheQotCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJKElNZXRob2RSaWNoVGV4dCkgcmljaFRleHQpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCVN0cmluZyBsaW5rVVJMID0gZGlhbG9nLmdldExpbmsoKS5nZXRVUkwoKTsKLQkJCQkJaWYgKGxpbmtVUkwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlpZiAoZGlhbG9nLmdldEZpbGVUb0NvcHkoKSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gbGluayB0byBhIGZpbGUsIGNyZWF0ZSB0aGUgVVJMCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbGlua1VSTCA9IExpYnJhcnlVSVV0aWwuZ2V0VVJMRm9yQXR0YWNobWVudChEaXNwbGF5Ci0JCQkJCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBkaWFsb2cKLQkJCQkJCQkJCQkuZ2V0RmlsZVRvQ29weSgpLAotCQkJCQkJCQkJCSgoSU1ldGhvZFJpY2hUZXh0KSByaWNoVGV4dCkKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCksIHRydWUpOwotCQkJCQkJCQlpZiAobGlua1VSTCA9PSBudWxsKSB7Ci0JCQkJCQkJCQkvLyB1c2VyIGhpdCBjYW5jZWwgb24gUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIHVybCA9ICI8YSBocmVmPVwiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQkJCQkJCQl1cmwgKz0gTmV0VXRpbAotCQkJCQkJCQkJCQkuZW5jb2RlRmlsZVVSTChOZXRVdGlsLkZJTEVfVVJJX1BSRUZJWAotCQkJCQkJCQkJCQkJCSsgbGlua1VSTCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl1cmwgKz0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKCIuLyIgKyBsaW5rVVJMKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCXVybCArPSAiXCIiICsgKGRpYWxvZy5nZXRPcGVuTGlua0luTmV3V2luZG93KCkgPyAiICIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQlNZXRob2RBZGRMaW5rRGlhbG9nLk9QRU5fTElOS19JTl9ORVdfV0lORE9XX0FUVFJJQlVURSA6ICIiKSArICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIj4iICsgbmV3IEZpbGUobGlua1VSTCkuZ2V0TmFtZSgpICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJbGlua1VSTCA9IHVybDsKLQotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmFkZEhUTUwobGlua1VSTCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfSFRNTCwKLQkJCQkJCQkJCWxpbmtVUkwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzdXBlci5leGVjdXRlKHJpY2hUZXh0KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZUNoaWxkQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NTE2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kQ3JlYXRlQ2hpbGRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5TdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotCi0KLS8qKgotICogTWV0aG9kIENyZWF0ZSBDaGlsZCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXRob2RDcmVhdGVDaGlsZEFjdGlvbiBleHRlbmRzIFN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24gewotCS8qKgotCSAqIFRoaXMgZGVzY3JpYmVzIHRoZSBjaGlsZCB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVzY3JpcHRvcjsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiBhbiBhY3Rpb24gdGhhdCBjcmVhdGVzIGEgY2hpbGQgc3BlY2lmaWVkCi0JICogYnkgPGNvZGU+ZGVzY3JpcHRvcjwvY29kZT4gZm9yIHRoZSBzaW5nbGUgb2JqZWN0IGluIHRoZQotCSAqIDxjb2RlPnNlbGVjdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZENyZWF0ZUNoaWxkQWN0aW9uKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uLCBPYmplY3QgZGVzY3JpcHRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmVkaXRpbmdEb21haW4gPSBlZGl0aW5nRG9tYWluOwotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQljb25maWd1cmVBY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGNvbW1hbmQgZm9yIHtAbGluawotCSAqIFN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24jY3JlYXRlQWN0aW9uQ29tbWFuZH0uCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWN0aW9uQ29tbWFuZChFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJaWYgKGNvbGxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvd25lciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlDb21tYW5kIGNtZCA9IG51bGw7Ci0KLQkJCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgQ29tbWFuZFBhcmFtZXRlcgotCQkJCQkmJiAoKENvbW1hbmRQYXJhbWV0ZXIpIGRlc2NyaXB0b3IpLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJQ29tbWFuZFBhcmFtZXRlciBuZXdDaGlsZFBhcmFtZXRlciA9IChDb21tYW5kUGFyYW1ldGVyKSBkZXNjcmlwdG9yOwotCQkJCUNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIgaGVscGVyID0gKEhlbHBlcikgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZWRpdGluZ0RvbWFpbikuZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChvd25lciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChFT2JqZWN0KSBvd25lcikuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgewotLy8JCQkJCQloZWxwZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIG87Ci0vLwkJCQkJCWJyZWFrOwotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQljbWQgPSBuZXcgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkJCShFT2JqZWN0KSBvd25lciwgbmV3Q2hpbGRQYXJhbWV0ZXIKLQkJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLCBuZXdDaGlsZFBhcmFtZXRlcgotCQkJCQkJCQkuZ2V0VmFsdWUoKSwgbmV3Q2hpbGRQYXJhbWV0ZXIuZ2V0SW5kZXgoKSwKLQkJCQkJCWNvbGxlY3Rpb24sIGhlbHBlcikgewotCQkJCX07Ci0JCQl9IGVsc2UgewotCQkJCWNtZCA9IENyZWF0ZUNoaWxkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgb3duZXIsCi0JCQkJCQlkZXNjcmlwdG9yLCBjb2xsZWN0aW9uKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBDcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZChjbWQpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5TdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXN1cGVyUnVuKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZjRmMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBNZXRob2QgQ3JlYXRlIFNpYmlsaW5nIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZENyZWF0ZVNpYmxpbmdBY3Rpb24gZXh0ZW5kcwotCQlTdGF0aWNTZWxlY3Rpb25Db21tYW5kQWN0aW9uIHsKLQotCS8qKgotCSAqIFRoaXMgZGVzY3JpYmVzIHRoZSBzaWJsaW5nIHRvIGJlIGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkZXNjcmlwdG9yOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIGFuIGFjdGlvbiB0aGF0IGNyZWF0ZXMgYSBzaWJsaW5nIHNwZWNpZmllZAotCSAqIGJ5IDxjb2RlPmRlc2NyaXB0b3I8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RDcmVhdGVTaWJsaW5nQWN0aW9uKElWaWV3UGFydCB2aWV3UGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlPYmplY3QgZGVzY3JpcHRvcikgewotCQlzdXBlcigpOwotCQlpZiAodmlld1BhcnQgaW5zdGFuY2VvZiBJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB7Ci0JCQllZGl0aW5nRG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSB2aWV3UGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQl0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQljb25maWd1cmVBY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgdGhlIGNvbW1hbmQgZm9yIHtAbGluawotCSAqIFN0YXRpY1NlbGVjdGlvbkNvbW1hbmRBY3Rpb24jY3JlYXRlQWN0aW9uQ29tbWFuZH0uCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWN0aW9uQ29tbWFuZChFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJaWYgKGNvbGxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCUNvbW1hbmQgY21kID0gQ3JlYXRlQ2hpbGRDb21tYW5kLmNyZWF0ZShlZGl0aW5nRG9tYWluLCBudWxsLAotCQkJCQlkZXNjcmlwdG9yLCBjb2xsZWN0aW9uKTsKLQkJCXJldHVybiBuZXcgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQoY21kKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNkZmIxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLnZpZXdlci5JVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZUNoaWxkQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVTaWJsaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3ViQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci0KLS8qKgotICogVGhlIGNvbnRyaWJ1dG9yIGZvciBhIE1ldGhvZCBlZGl0b3IuCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBwcm92aWRlci4KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyOwotCi0JLy8gSGFuZGxlIHRoZSBTaG93IFByb3BlcnRpZXMgdmlldyBhY3Rpb24uCi0JcHJvdGVjdGVkIElBY3Rpb24gc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCWdldFN0cmluZygiX1VJX1Nob3dQcm9wZXJ0aWVzVmlld19tZW51X2l0ZW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGFnZSgpLnNob3dWaWV3KCJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFRoaXMgYWN0aW9uIHJlZnJlc2hlcyB0aGUgdmlld2VyIG9mIHRoZSBjdXJyZW50IGVkaXRvciBpZiB0aGUgZWRpdG9yCi0JICogaW1wbGVtZW50cyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiByZWZyZXNoVmlld2VyQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCWdldFN0cmluZygiX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZG9SZWZyZXNoKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogVGhpcyB3aWxsIGNvbnRhaW4gb25lCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0gY29ycmVzcG9uZGluZyB0bwotCSAqIGVhY2ggZGVzY3JpcHRvciBnZW5lcmF0ZWQgZm9yIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBieSB0aGUgaXRlbSBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVDaGlsZEFjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBtZW51IG1hbmFnZXIgaW50byB3aGljaCBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBzaG91bGQgYmUKLQkgKiBhZGRlZCBmb3IgQ3JlYXRlQ2hpbGQgYWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1lbnVNYW5hZ2VyIGNyZWF0ZUNoaWxkTWVudU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgY29udGFpbiBvbmUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNyZWF0ZVNpYmxpbmdBY3Rpb259IGNvcnJlc3BvbmRpbmcKLQkgKiB0byBlYWNoIGRlc2NyaXB0b3IgZ2VuZXJhdGVkIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24gYnkgdGhlIGl0ZW0KLQkgKiBwcm92aWRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVTaWJsaW5nQWN0aW9uczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIG1lbnUgbWFuYWdlciBpbnRvIHdoaWNoIG1lbnUgY29udHJpYnV0aW9uIGl0ZW1zIHNob3VsZCBiZQotCSAqIGFkZGVkIGZvciBDcmVhdGVTaWJsaW5nIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXI7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCk7Ci0JCXRoaXMubmFtZSA9ICJNZXRob2RFbGVtZW50RWRpdG9yIjsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBjb250cmlidXRvci4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yKFN0cmluZyBuYW1lKSB7Ci0JCWxvYWRSZXNvdXJjZUFjdGlvbiA9IG5ldyBMb2FkUmVzb3VyY2VBY3Rpb24oKTsKLQkJdmFsaWRhdGVBY3Rpb24gPSBuZXcgTGlicmFyeVZhbGlkYXRlQWN0aW9uKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkZWxldGUgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBEZWxldGVBY3Rpb24oKTsKLQl9Ci0KLQkgLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQob3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnMpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCXN1cGVyLmluaXQoYWN0aW9uQmFycyk7Ci0JCQotLy8JCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotLy8JCQkJLmdldFNoYXJlZEltYWdlcygpOwotLy8KLS8vCQlkZWxldGVBY3Rpb24gPSBjcmVhdGVEZWxldGVBY3Rpb24oKTsKLS8vCQlkZWxldGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotLy8JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotLy8JCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpLAotLy8JCQkJZGVsZXRlQWN0aW9uKTsKLS8vCi0vLwkJY3V0QWN0aW9uID0gY3JlYXRlQ3V0QWN0aW9uKCk7Ci0vLwkJY3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLS8vCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DVVQpKTsKLS8vCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwgY3V0QWN0aW9uKTsKLS8vCi0vLwkJY29weUFjdGlvbiA9IGNyZWF0ZUNvcHlBY3Rpb24oKTsKLS8vCQljb3B5QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLS8vCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0vLwkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotLy8JCQkJY29weUFjdGlvbik7Ci0vLwotLy8JCXBhc3RlQWN0aW9uID0gY3JlYXRlUGFzdGVBY3Rpb24oKTsKLS8vCQlwYXN0ZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0vLwkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfUEFTVEUpKTsKLS8vCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5QQVNURS5nZXRJZCgpLAotLy8JCQkJcGFzdGVBY3Rpb24pOwotLy8KLS8vCQl1bmRvQWN0aW9uID0gbmV3IFVuZG9BY3Rpb24oKTsKLS8vCQl1bmRvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihzaGFyZWRJbWFnZXMKLS8vCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9VTkRPKSk7Ci0vLwkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotLy8JCQkJdW5kb0FjdGlvbik7Ci0vLwotLy8JCXJlZG9BY3Rpb24gPSBuZXcgUmVkb0FjdGlvbigpOwotLy8JCXJlZG9BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotLy8JCQkJLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX1JFRE8pKTsKLS8vCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0vLwkJCQlyZWRvQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvcHkgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvcHlBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHBhc3RlIGFjdGlvbgotCSAqIEByZXR1cm4gQWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhc3RlQWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjdXQgYWN0aW9uCi0JICogQHJldHVybiBBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDdXRBY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgU2VwYXJhdG9ycyBmb3IgZWRpdG9yIGFkZGl0aW9ucyB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IobmFtZSArICItYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0cyBlbmFibGVkIGZsYWcKLQkgKiBAcGFyYW0gZW5hYmxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHRvIHRoZSBtZW51IGJhciBhIG1lbnUgYW5kIHNvbWUgc2VwYXJhdG9ycyBmb3IgZWRpdG9yCi0JICogYWRkaXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdWItbWVudXMgZm9yIG9iamVjdCBjcmVhdGlvbiBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotLy8JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudU1hbmFnZXIpOwotLy8JCUlNZW51TWFuYWdlciBzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLS8vCQkJCWdldFN0cmluZygiX1VJXyIgKyBuYW1lICsgIl9tZW51IiksICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLiIgKyBuYW1lICsgIk1lbnVJRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0vLwkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoImFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJzZXR0aW5ncyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhY3Rpb25zIikpOyAvLyROT04tTkxTLTEkCi0vLwkJc3VibWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCS8vIFByZXBhcmUgZm9yIENyZWF0ZUNoaWxkIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLS8vCQljcmVhdGVDaGlsZE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKAotLy8JCQkJZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0vLwkJc3VibWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkvLyBQcmVwYXJlIGZvciBDcmVhdGVTaWJsaW5nIGl0ZW0gYWRkaXRpb24gb3IgcmVtb3ZhbC4KLS8vCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0vLwkJCQlnZXRTdHJpbmcoIl9VSV9DcmVhdGVTaWJsaW5nX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotLy8JCXN1Ym1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkvLyBGb3JjZSBhbiB1cGRhdGUgYmVjYXVzZSBFY2xpcHNlIGhpZGVzIGVtcHR5IG1lbnVzIG5vdy4KLS8vCQlzdWJtZW51TWFuYWdlci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0vLwkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLS8vCQkJCW1lbnVNYW5hZ2VyLnVwZGF0ZUFsbCh0cnVlKTsKLS8vCQkJfQotLy8JCX0pOwotLy8KLS8vCQlhZGRHbG9iYWxBY3Rpb25zKHN1Ym1lbnVNYW5hZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSBhY3RpdmUgZWRpdG9yIGNoYW5nZXMsIHRoaXMgcmVtZW1iZXJzIHRoZSBjaGFuZ2UgYW5kIHJlZ2lzdGVycwotCSAqIHdpdGggaXQgYXMgYSBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHBhcnQpOwotCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQgcGFydCkgewotCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQlzZXRBY3RpdmVFZGl0b3IocGFydCk7Ci0JCX0KLQkJCi0JCS8vIFN3aXRjaCB0byB0aGUgbmV3IHNlbGVjdGlvbiBwcm92aWRlci4KLQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlpZiAocGFydCA9PSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlciA9IHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIEZha2UgYSBzZWxlY3Rpb24gY2hhbmdlZCBldmVudCB0byB1cGRhdGUgdGhlIG1lbnVzLgotCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCQlzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50cwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJ9LCBoYW5kbGluZwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudH0gYnkgcXVlcnlpbmcgZm9yCi0JICogdGhlIGNoaWxkcmVuIGFuZCBzaWJsaW5ncyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VsZWN0ZWQgb2JqZWN0IGFuZAotCSAqIHVwZGF0aW5nIHRoZSBtZW51cyBhY2NvcmRpbmdseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBSZW1vdmUgYW55IG1lbnUgaXRlbXMgZm9yIG9sZCBzZWxlY3Rpb24uCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWRlcG9wdWxhdGVNYW5hZ2VyKGNyZWF0ZUNoaWxkTWVudU1hbmFnZXIsIGNyZWF0ZUNoaWxkQWN0aW9ucyk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zKTsKLQkJfQotCi0JCS8vIFF1ZXJ5IHRoZSBuZXcgc2VsZWN0aW9uIGZvciBhcHByb3ByaWF0ZSBuZXcgY2hpbGQvc2libGluZwotCQkvLyBkZXNjcmlwdG9ycy4KLQkJQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBuZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBudWxsOwotCi0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCSYmICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBvYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSAoKElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcikKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQotCQkJbmV3Q2hpbGREZXNjcmlwdG9ycyA9IGRvbWFpbi5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgbnVsbCk7Ci0JCQluZXdTaWJsaW5nRGVzY3JpcHRvcnMgPSBkb21haW4uZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhudWxsLCBvYmplY3QpOwotCQl9Ci0KLQkJLy8gR2VuZXJhdGUgYWN0aW9ucyBmb3Igc2VsZWN0aW9uOyBwb3B1bGF0ZSBhbmQgcmVkcmF3IHRoZSBtZW51cy4KLQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMobmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCQlzZWxlY3Rpb24pOwotCQljcmVhdGVTaWJsaW5nQWN0aW9ucyA9IGdlbmVyYXRlQ3JlYXRlU2libGluZ0FjdGlvbnMoCi0JCQkJbmV3U2libGluZ0Rlc2NyaXB0b3JzLCBzZWxlY3Rpb24pOwotCi0JCWlmIChjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJY3JlYXRlQ2hpbGRNZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQkJaWYgKGNyZWF0ZVNpYmxpbmdNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucywKLQkJCQkJbnVsbCk7Ci0JCQljcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIudXBkYXRlKHRydWUpOwotCQl9Ci0JCWlmICghKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEZvcm1FZGl0b3IpKSB7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2VuZXJhdGVzIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DcmVhdGVDaGlsZEFjdGlvbn0KLQkgKiBmb3IgZWFjaCBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUKLQkgKiBjb2xsZWN0aW9uIG9mIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gYWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWFjdGlvbnMuYWRkKG5ldyBDcmVhdGVDaGlsZEFjdGlvbihhY3RpdmVFZGl0b3IsIHNlbGVjdGlvbiwKLQkJCQkJCWkubmV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZW5lcmF0ZXMgYQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3JlYXRlU2libGluZ0FjdGlvbn0gZm9yIGVhY2gKLQkgKiBvYmplY3QgaW4gPGNvZGU+ZGVzY3JpcHRvcnM8L2NvZGU+LCBhbmQgcmV0dXJucyB0aGUgY29sbGVjdGlvbiBvZgotCSAqIHRoZXNlIGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLAotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQ29sbGVjdGlvbiBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJYWN0aW9ucy5hZGQobmV3IENyZWF0ZVNpYmxpbmdBY3Rpb24oYWN0aXZlRWRpdG9yLAotCQkJCQkJc2VsZWN0aW9uLCBpLm5leHQoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcG9wdWxhdGVzIHRoZSBzcGVjaWZpZWQgPGNvZGU+bWFuYWdlcjwvY29kZT4gd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zIGJhc2VkIG9uIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLCBieSBpbnNlcnRpbmcgdGhlbSBiZWZvcmUgdGhlIHNwZWNpZmllZAotCSAqIGNvbnRyaWJ1dGlvbiBpdGVtIDxjb2RlPmNvbnRyaWJ1dGlvbklEPC9jb2RlPi4gSWYgPGNvZGU+SUQ8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIHRoZXkgYXJlIHNpbXBseSBhZGRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU1hbmFnZXIoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlciwKLQkJCUNvbGxlY3Rpb24gYWN0aW9ucywgU3RyaW5nIGNvbnRyaWJ1dGlvbklEKSB7Ci0JCWlmIChhY3Rpb25zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFjdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJSUFjdGlvbiBhY3Rpb24gPSAoSUFjdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dGlvbklEICE9IG51bGwpIHsKLQkJCQkJbWFuYWdlci5pbnNlcnRCZWZvcmUoY29udHJpYnV0aW9uSUQsIGFjdGlvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFuYWdlci5hZGQoYWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJlbW92ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hbmFnZXI8L2NvZGU+IGFsbAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbX1zIGJhc2VkIG9uIHRoZQotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbn1zIGNvbnRhaW5lZCBpbiB0aGUKLQkgKiA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlcG9wdWxhdGVNYW5hZ2VyKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsCi0JCQlDb2xsZWN0aW9uIGFjdGlvbnMpIHsKLQkJaWYgKGFjdGlvbnMgIT0gbnVsbCkgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBMb29rIGludG8gU3ViQ29udHJpYnV0aW9uSXRlbXMKLQkJCQlJQ29udHJpYnV0aW9uSXRlbSBjb250cmlidXRpb25JdGVtID0gaXRlbXNbaV07Ci0JCQkJd2hpbGUgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBTdWJDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJCWNvbnRyaWJ1dGlvbkl0ZW0gPSAoKFN1YkNvbnRyaWJ1dGlvbkl0ZW0pIGNvbnRyaWJ1dGlvbkl0ZW0pCi0JCQkJCQkJLmdldElubmVySXRlbSgpOwotCQkJCX0KLQotCQkJCS8vIERlbGV0ZSB0aGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbXMgd2l0aCBtYXRjaGluZyBhY3Rpb24uCi0JCQkJaWYgKGNvbnRyaWJ1dGlvbkl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0JCQkJCUlBY3Rpb24gYWN0aW9uID0gKChBY3Rpb25Db250cmlidXRpb25JdGVtKSBjb250cmlidXRpb25JdGVtKQotCQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQkJaWYgKGFjdGlvbnMuY29udGFpbnMoYWN0aW9uKSkgewotCQkJCQkJbWFuYWdlci5yZW1vdmUoY29udHJpYnV0aW9uSXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHBvcHVsYXRlcyB0aGUgcG9wLXVwIG1lbnUgYmVmb3JlIGl0IGFwcGVhcnMuCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlci4KLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEFkZCB0aGUgZWRpdCBtZW51IGFjdGlvbnMuCi0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh1bmRvQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShyZWRvQWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkvLyBtZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY3V0QWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjb3B5QWN0aW9uKSk7Ci0JCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShwYXN0ZUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGRlbGV0ZUFjdGlvbikpOwotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlci4KLQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucy1lbmQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQlpZiAoZW5hYmxlZCkgewotCQkJTWVudU1hbmFnZXIgc3VibWVudU1hbmFnZXIgPSBudWxsOwotCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCWdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX21lbnVfaXRlbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcG9wdWxhdGVNYW5hZ2VyKHN1Ym1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMsIG51bGwpOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJhZGRpdGlvbnMiLCBzdWJtZW51TWFuYWdlcik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3VibWVudU1hbmFnZXIgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCWdldFN0cmluZygiX1VJX0NyZWF0ZVNpYmxpbmdfbWVudV9pdGVtIikpOyAvLyROT04tTkxTLTEkCi0JCQlwb3B1bGF0ZU1hbmFnZXIoc3VibWVudU1hbmFnZXIsIGNyZWF0ZVNpYmxpbmdBY3Rpb25zLCBudWxsKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiYWRkaXRpb25zIiwgc3VibWVudU1hbmFnZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGluc2VydHMgZ2xvYmFsIGFjdGlvbnMgYmVmb3JlIHRoZSAiYWRkaXRpb25zLWVuZCIgc2VwYXJhdG9yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJhZGRpdGlvbnMtZW5kIiwgbmV3IFNlcGFyYXRvcigidWktYWN0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJ1aS1hY3Rpb25zIiwgc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJlZnJlc2hWaWV3ZXJBY3Rpb24uc2V0RW5hYmxlZChyZWZyZXNoVmlld2VyQWN0aW9uLmlzRW5hYmxlZCgpKTsKLQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoInVpLWFjdGlvbnMiLCByZWZyZXNoVmlld2VyQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkgICAgU3RyaW5nIGtleSA9IChzdHlsZSAmIEFERElUSU9OU19MQVNUX1NUWUxFKSA9PSAwID8gImFkZGl0aW9ucy1lbmQiIDogImFkZGl0aW9ucyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICBpZiAodmFsaWRhdGVBY3Rpb24gIT0gbnVsbCkKLQkgICAgewotCSAgICAgIG1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShrZXksIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHZhbGlkYXRlQWN0aW9uKSk7Ci0JICAgIH0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaCB0aGUgdmlld2VyCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2goKSB7Ci0JCWlmIChhY3RpdmVFZGl0b3IgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgYWN0aXZlRWRpdG9yKS5nZXRWaWV3ZXIoKTsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbGxSZWZlcmVuY2VzT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJLy8gZml4IGFjdGlvbnMgLS0gaWYgbmV3IHBhZ2UgaXMgYW4gSUZvcm1QYWdlLCB3ZSBkb24ndCB3YW50IEVNRiBhY3Rpb25zCi0JCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0QWN0aW9uQmFycygpOwotCQkJaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEZvcm1FZGl0b3IpIHsKLQkJCQlJRm9ybVBhZ2UgcGFnZSA9ICgoRm9ybUVkaXRvcilhY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOyAKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewkJCQotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSwKLQkJCQkJCQludWxsKTsKLQkJCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJCW51bGwpOwotCQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJCQkJbnVsbCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCWRlbGV0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQljdXRBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCWNvcHlBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJCQlwYXN0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJdW5kb0FjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCQkJcmVkb0FjdGlvbik7Ci0JCQl9Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCQlzdXBlci5hY3RpdmF0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Nb3ZlRG93bkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWEwZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVEb3duQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZURvd25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogTW92ZXMgdXAgYnJlYWtkb3duIGVsZW1lbnQgaW4gYSBwcm9jZXNzIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTW92ZURvd25BY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZURvd247Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL2V0b29sMTYvbW92ZV9kb3duLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkiZnVsbC9ldG9vbDE2L21vdmVfZG93bl9kaXNhYmxlZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlRG93bkFjdGlvbigpIHsKLQkJc3VwZXIoTEFCRUwpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSU1HX0RFU0MpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfREVTQyk7Ci0JCXNldFRvb2xUaXBUZXh0KExBQkVMKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVNb3ZlQ29tbWFuZChBY3Rpdml0eSBhY3QsIE9iamVjdCBlbGVtZW50LAotCQkJQ29sbGVjdGlvbjxFQ2xhc3M+IGNsYXNzZXMpIHsKLQkJcmV0dXJuIG5ldyBNb3ZlRG93bkNvbW1hbmQoYWN0LCBlbGVtZW50LCBjbGFzc2VzKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsJCQotCQlpZihzdXBlci5hY2NlcHQoc2VsZWN0aW9uKSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXAgPSBnZXRJdGVtUHJvdmlkZXIoZWxlbWVudCk7Ci0JCQlpZihpcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuICFpcC5pc0xhc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTW92ZVVwQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTYxMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL01vdmVVcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVVcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBNb3ZlcyB1cCBicmVha2Rvd24gZWxlbWVudCBpbiBhIHByb2Nlc3MgdHJlZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNb3ZlVXBBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE1vdmVBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fTW92ZVVwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQyA9IEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkuZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9ldG9vbDE2L21vdmVfdXAuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0MgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvZXRvb2wxNi9tb3ZlX3VwX2Rpc2FibGVkLmdpZiIpOyAvLyROT04tTkxTLTEkIAotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBNb3ZlVXBBY3Rpb24oKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKElNR19ERVNDKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX0RFU0MpOwotCQlzZXRUb29sVGlwVGV4dChMQUJFTCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlTW92ZUNvbW1hbmQoQWN0aXZpdHkgYWN0LCBPYmplY3QgZWxlbWVudCwKLQkJCUNvbGxlY3Rpb248RUNsYXNzPiBjbGFzc2VzKSB7Ci0JCXJldHVybiBuZXcgTW92ZVVwQ29tbWFuZChhY3QsIGVsZW1lbnQsIGNsYXNzZXMpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewkJCi0JCWlmKHN1cGVyLmFjY2VwdChzZWxlY3Rpb24pKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpcCA9IGdldEl0ZW1Qcm92aWRlcihlbGVtZW50KTsKLQkJCWlmKGlwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gIWlwLmlzRmlyc3RFbGVtZW50KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL011bHRpQWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgwZGFkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTXVsdGlBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cDsKLQotLyoqCi0gKiBBIE11bHRpQWN0aW9uR3JvdXAgd2lsbCBkaXNwbGF5IGEgbGlzdCBvZiBJQWN0aW9ucyBpbiBhIG1lbnUgYnkgdHJhbnNmb3JtaW5nIHRoZW0KLSAqIGludG8gTWVudUl0ZW1zLiBUaGUgbGlzdCBvZiBsYWJlbHMgZ2l2ZW4gd2lsbCBiZSB3aGF0IGlzIGRpc3BsYXllZCBpbiB0aGUgVmlld01lbnUgZm9yIAotICogdGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uICh0aGUgYWN0aW9uIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBhY3Rpb24gYXJyYXkpLgotICogVGhlIGFjdGlvbnMgYXJlIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBzdGF0ZSBiYXNlZAotICogc28gdGhhdCBhZnRlciBhbiBhY3Rpb24gaXMgZXhlY3V0ZWQgdGhlIGxhYmVsIHdpbGwgaGF2ZSBhIHNlbGVjdGlvbiBjaGVjay4KLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5hY3Rpb25zLk11bHRpQWN0aW9uR3JvdXAuY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JCi0JcHVibGljIElBY3Rpb25bXSBOT19BQ1RJT05TID0gbmV3IElBY3Rpb25bMF07Ci0JCi0JcHJpdmF0ZSBJQWN0aW9uW10gZkFjdGlvbnM7IAotCQotCXByaXZhdGUgaW50IGZDdXJyZW50U2VsZWN0aW9uOwotCXByaXZhdGUgTWVudUl0ZW1bXSBmSXRlbXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBncm91cCB3aXRoIGEgZ2l2ZW4gc2V0IG9mIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cAotCSAqIEBwYXJhbSBjdXJyZW50U2VsZWN0aW9uCWRlY2lkZXMgd2hpY2ggYWN0aW9uIGlzIHNlbGVjdGVkIGluIHRoZSBtZW51IG9uIHN0YXJ0IHVwLgotCSAqIAkJCQkJCQlEZW5vdGVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgYWN0aW9ucyBhcnJheSBvZiB0aGUgY3VycmVudAotCSAqIAkJCQkJCQlzZWxlY3RlZCBzdGF0ZS4gSXQgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIE11bHRpQWN0aW9uR3JvdXAoSUFjdGlvbltdIGFjdGlvbnMsIGludCBjdXJyZW50U2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEFjdGlvbnMoYWN0aW9ucywgY3VycmVudFNlbGVjdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWN0aW9uIGdyb3VwLiBDbGllbnRzIHVzaW5nIHRoaXMgY29uc3RydWN0b3IgbXVzdCBzZXQgdGhlIGFjdGlvbnMKLQkgKiBpbW1lZGlhdGVseSBhZnRlciBjcmVhdGluZyB0aGUgbXVsdGkgYWN0aW9uIGdyb3VwIGJ5IGNhbGxpbmcge0BsaW5rICNzZXRBY3Rpb25zKElBY3Rpb25bXSwgaW50KX0uCi0JICovCi0JcHJvdGVjdGVkIE11bHRpQWN0aW9uR3JvdXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbnMJCQl0aGUgYWN0aW9ucyBmb3IgdGhpcyBtdWx0aSBncm91cCwgYXQgbGVhc3Qgb25lCi0JICogQHBhcmFtIGN1cnJlbnRTZWxlY3Rpb24JZGVjaWRlcyB3aGljaCBhY3Rpb24gaXMgc2VsZWN0ZWQgaW4gdGhlIG1lbnUgb24gc3RhcnQgdXAuCi0JICogCQkJCQkJCURlbm90ZXMgdGhlIGxvY2F0aW9uIGluIHRoZSBhY3Rpb25zIGFycmF5IG9mIHRoZSBjdXJyZW50Ci0JICogCQkJCQkJCXNlbGVjdGVkIHN0YXRlLiBJdCBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRBY3Rpb25zKElBY3Rpb25bXSBhY3Rpb25zLCBpbnQgY3VycmVudFNlbGVjdGlvbikgewotCQlmQ3VycmVudFNlbGVjdGlvbj0gY3VycmVudFNlbGVjdGlvbjsKLQkJZkFjdGlvbnMgPSBhY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGFjdGlvbnMgdG8gdGhlIGdpdmVuIG1lbnUgbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25zKElNZW51TWFuYWdlciB2aWV3TWVudSkgewotCi0JCXZpZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmSXRlbXM9IG5ldyBNZW51SXRlbVtmQWN0aW9ucy5sZW5ndGhdOwotCi0JCWZvciAoaW50IGk9IDA7IGkgPCBmQWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJZmluYWwgaW50IGo9IGk7Ci0KLQkJCXZpZXdNZW51LmFkZChuZXcgQ29udHJpYnV0aW9uSXRlbSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGZpbGwoTWVudSBtZW51LCBpbnQgaW5kZXgpIHsKLQkJCQkJCi0JCQkJCWludCBzdHlsZT0gU1dULkNIRUNLOwotCQkJCQlpZiAoKGZBY3Rpb25zW2pdLmdldFN0eWxlKCkgJiBJQWN0aW9uLkFTX1JBRElPX0JVVFRPTikgIT0gMCkKLQkJCQkJCXN0eWxlPSBTV1QuUkFESU87Ci0JCQkJCQotCQkJCQlNZW51SXRlbSBtaT0gbmV3IE1lbnVJdGVtKG1lbnUsIHN0eWxlLCBpbmRleCk7Ci0JCQkJCUltYWdlRGVzY3JpcHRvciBkPSBmQWN0aW9uc1tqXS5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLQkJCQkJbWkuc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQoZCkpOwotCQkJCQlmSXRlbXNbal09IG1pOwotCQkJCQltaS5zZXRUZXh0KGZBY3Rpb25zW2pdLmdldFRleHQoKSk7Ci0JCQkJCW1pLnNldFNlbGVjdGlvbihmQ3VycmVudFNlbGVjdGlvbiA9PSBqKTsKLQkJCQkJbWkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlpZiAoZkN1cnJlbnRTZWxlY3Rpb24gPT0gaikgewotCQkJCQkJCQlmSXRlbXNbZkN1cnJlbnRTZWxlY3Rpb25dLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlmQWN0aW9uc1tqXS5ydW4oKTsKLQotCQkJCQkJCS8vIFVwZGF0ZSBjaGVja2VkIHN0YXRlCi0JCQkJCQkJZkl0ZW1zW2ZDdXJyZW50U2VsZWN0aW9uXS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCQkJCWZDdXJyZW50U2VsZWN0aW9uPSBqOwotCQkJCQkJCWZJdGVtc1tmQ3VycmVudFNlbGVjdGlvbl0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0R5bmFtaWMoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTZlNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdDb25maWd1cmF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdDb25maWd1cmF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgTmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCS8vIFRoZSBjdXJyZW50IHdvcmtiZW5jaCB3aW5kb3cuCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCS8vIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBvYmplY3QuCi0JcHJpdmF0ZSBJU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbkFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0KElXb3JrYmVuY2hXaW5kb3cpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKElBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBudWxsOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKTsKLQkJfQotCQlpZiAod29ya2JlbmNoID09IG51bGwpIHsKLQkJCXdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTmV3Q29uZmlndXJhdGlvbldpemFyZCB3aXphcmQgPSBuZXcgTmV3Q29uZmlndXJhdGlvbldpemFyZCgpOwotCQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXdpemFyZC5pbml0KHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0JCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgd2l6YXJkKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdDb25maWd1cmF0aW9uV2l6YXJkX3RpdGxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuQ29uZmlnV2l6YXJkRXJyb3JfbXNnLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5pbnRlcm5hbEVycm9yX3JlYXNvbiwgIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9OZXdQbHVnaW5BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1Njc5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvTmV3UGx1Z2luQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3UGx1Z2luV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgYW5kIGNyZWF0ZXMgYSBuZXcgcGx1Zy1pbiB3aGVuIHRoZQotICogdXNlciBzZWxlY3RzIHRoZSBGaW5pc2ggYnV0dG9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cwotCQlJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gVGhlIGNhY2hlZCB3aW5kb3cgb2JqZWN0LgotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdQbHVnaW5BY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3UGx1Z2luQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQoSVdvcmtiZW5jaFdpbmRvdykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCU1ldGhvZExpYnJhcnkgdGFyZ2V0TGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAodGFyZ2V0TGliID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlFcnJvcl9tc2cpOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkodGFyZ2V0TGliLCBzaGVsbCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF90aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZF9jcmVhdGVFcnJvciwgCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IHdpbmRvdyAhPSBudWxsID8gKHdpbmRvdy5nZXRXb3JrYmVuY2goKSA9PSBudWxsID8gUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCTogd2luZG93LmdldFdvcmtiZW5jaCgpKQotCQkJCTogUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlleGVjdXRlKHdvcmtiZW5jaCwgbnVsbCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uLCBJU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgd29ya2JlbmNoLgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBhY3RpdmUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBleGVjdXRlKElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlOZXdQbHVnaW5XaXphcmQgd2l6YXJkID0gbmV3IE5ld1BsdWdpbldpemFyZCgpOwotCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiB8fCBzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJd2l6YXJkLmluaXQod29ya2JlbmNoLCAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JCX0KLQotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKCFQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5vcGVuUGVyc3BlY3RpdmUoQXV0aG9yaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5DaGVhdHNoZWV0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA1MzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuQ2hlYXRzaGVldFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLnZpZXdzLkNoZWF0U2hlZXRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludHJvLklJbnRyb1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbjsKLQotLyoqCi0gKiBPcGVuIGNoZWF0IHNoZWV0IHZpZXcKLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5DaGVhdHNoZWV0VmlldyBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElJbnRyb0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPcGVuQ2hlYXRzaGVldFZpZXcoKSB7Ci0JCXN1cGVyKEF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5DaGVhdHNoZWV0Vmlld190aXRsZSk7IAotCX0KLQotCS8qIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaW50cm8uY29uZmlnLklJbnRyb0FjdGlvbiNydW4ob3JnLmVjbGlwc2UudWkuaW50cm8uSUludHJvU2l0ZSwgamF2YS51dGlsLlByb3BlcnRpZXMpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElJbnRyb1NpdGUgc2l0ZSwgUHJvcGVydGllcyBwYXJhbXMpIHsKLQkJU3RyaW5nIGNoZWF0c2hlZXRfaWQgPSBwYXJhbXMuZ2V0UHJvcGVydHkoImlucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRvZ2dsZV9zdHIgPSBwYXJhbXMuZ2V0UHJvcGVydHkoInRvZ2dsZSIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIElORk86IGNoZWF0c2hlZXQgaWQgPSAiICsgY2hlYXRzaGVldF9pZCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cKLQkJaWYgKHRvZ2dsZV9zdHIgIT0gbnVsbCAmJiB0b2dnbGVfc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0b2dnbGVBY3RpdmVWaWV3KCk7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gQ2hlYXRTaGVldFZpZXcgb2JqID0gbmV3IENoZWF0U2hlZXRWaWV3KCk7Ci0JCQlhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLnNob3dWaWV3KAotCQkJCQkib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMudmlld3MuQ2hlYXRTaGVldFZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJQ2hlYXRTaGVldFZpZXcgY3NWaWV3ID0gKENoZWF0U2hlZXRWaWV3KSBhY3RpdmVXaW5kb3cKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQljc1ZpZXcuc2V0SW5wdXQoY2hlYXRzaGVldF9pZCk7Ci0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhwKSB7Ci0JCQkvLyAkJCQgZXJyb3IgaGFuZGxpbmcgaGVyZS4KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIGFjdGl2ZSB2aWV3Ci0JICoKLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlQWN0aXZlVmlldygpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyBhY3RpdmVXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0JCS8vIGRlLW1heGltYWl6ZSB0aGUgd2VsY29tZSwgaS5lLiB0aGUgaW50cm8gdmlldyB3aW5kb3cgb3IgYW55IGFjdGl2ZQotCQkvLyB2aWV3Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFdvcmtiZW5jaFBhZ2UpIHsKLQkJCQkvL1dvcmtiZW5jaFBhZ2UgcmVhbFBhZ2UgPSAoV29ya2JlbmNoUGFnZSkgcGFnZTsKLQotCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYgPSBwYWdlLmdldEFjdGl2ZVBhcnRSZWZlcmVuY2UoKTsKLQotCQkJCWlmIChwYXJ0UmVmICE9IG51bGwpIHsKLQkJCQkJKChXb3JrYmVuY2hQYWdlKSBwYWdlKS50b2dnbGVab29tKHBhcnRSZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MmI0ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udHJpYnV0aW9uU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi0vKioKLSAqIE9wZW4gYSBtZXRob2QgZWxlbWVudCBlZGl0b3IgZGVsZWdhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuRWxlbWVudEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQlwcml2YXRlIENvbnRyaWJ1dGlvblNlbGVjdGlvbiBjb250cmlidXRvclNlbGVjdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIE9wZW5FbGVtZW50QWN0aW9uRGVsZWdhdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWNvbnRyaWJ1dG9yU2VsZWN0b3IgPSBuZXcgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJQXJyYXlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRhcmdldFBhcnQgPSAiICsgdGFyZ2V0UGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uVmlldykgewotCQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0ZWQuaXRlcmF0b3IoKTsgb2JqZWN0cy5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGNvbnRyaWJ1dG9yU2VsZWN0b3IKLQkJCQkJCQkuZ2V0U2VsZWN0ZWRDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0cy5uZXh0KCkpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA8IDEpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IGVsZW1lbnRMaXN0Lml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBvYmplY3RzLm5leHQoKTsKLQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKGVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL09wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcyYzRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLQotCi0vKioKLSAqIE9wZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yIGRlbGVnYXRpb24gYWN0aW9uIAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5FbGVtZW50V29ya2JlbmNoQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcwotCQlCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLy8gcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZSgpIHsKLQkJdGhpcygKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuRWxlbWVudFdvcmtiZW5jaEFjdGlvbkRlbGVnYXRlX2VkaXRfdGV4dDApOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgT3BlbkVsZW1lbnRXb3JrYmVuY2hBY3Rpb25EZWxlZ2F0ZShTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJLy8gdGhpcy53aW5kb3cgPSB3aW5kb3c7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIE9wZW4gZWxlbWVudCBhY3Rpb24hIik7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgNTogIiArIHNlbGVjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0KLQkJaWYgKFBlcnNwZWN0aXZlTGlzdFV0aWwuaXNCcm93c2luZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCA2OiAiICsgZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCS8vIGlmICghUGVyc3BlY3RpdmVMaXN0VWl0bC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkgfHwKLQkJLy8gc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCWlmIChzZWxlY3RlZC5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gZW5hYmxlTWVudSA9IHRydWU7Ci0JCWZvciAoSXRlcmF0b3Igb2JqZWN0cyA9IHNlbGVjdGVkLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3RzLm5leHQoKSk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQllbmFibGVNZW51ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVNZW51KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvT3V0ZGVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTRmNjJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogVXBkYXRlIHN1cHByZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gYmFzZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIE91dGRlbnRBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE91dGRlbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBBREFQVEVSX0ZBQ1RPUklFUyA9IHsKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQl9OwotCQkKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzOwotCQlwcml2YXRlIFNldCBtb2RpZmllZFJlc291cmNlczsKLQkJcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0JCXByaXZhdGUgQWN0aXZpdHkgb2xkUGFyZW50OwotCQlwcml2YXRlIEFjdGl2aXR5IG5ld1BhcmVudDsKLQkJcHJpdmF0ZSBpbnQgb2xkSW5kZXg7Ci0JCXByaXZhdGUgaW50IG5ld0luZGV4OwotCQlwcml2YXRlIExpc3Q8T2JqZWN0PiBuZXdDaGlsZHJlbjsKLQotCQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXB1YmxpYyBPdXRkZW50Q29tbWFuZChDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGNvbGxlY3Rpb24sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQl0aGlzLmVsZW1lbnRzID0gY29sbGVjdGlvbjsKLQkJCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJCXNldExhYmVsKExBQkVMKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZihuZXdDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJbmV3Q2hpbGRyZW4uY2xlYXIoKTsKLQkJCQluZXdDaGlsZHJlbiA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCVByb2Nlc3MgcHJvYyA9IG51bGw7Ci0JCQkJZm9yIChJdGVyYXRvcjxCcmVha2Rvd25FbGVtZW50PiBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgcHJvYyA9PSBudWxsICYmIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQkJCQl9Ci0JCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gcHJvYy5lUmVzb3VyY2UoKTsKLQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocHJvYy5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJZWxlbWVudCA9IGVsZW1lbnRzLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJb2xkUGFyZW50ID0gZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWlmKG9sZFBhcmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJb2xkSW5kZXggPSBvbGRQYXJlbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGVsZW1lbnQpOwotCQkJTWFwPExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAgPSBuZXcgSGFzaE1hcDxMaXN0PE9iamVjdD4sIEludGVnZXI+KCk7Ci0JCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gQURBUFRFUl9GQUNUT1JJRVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQlhZGFwdGVyRmFjdG9yeQkKLQkJCQl9OwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9sZFBhcmVudCwgCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihpcC5nZXRDaGlsZHJlbihvbGRQYXJlbnQpKTsKLQkJCQlpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKGVsZW1lbnQpOwotCQkJCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwotCQkJCWludCBuZXdDaGlsZHJlbkZyb21JbmRleCA9IGluZGV4ICsgMTsKLQkJCQlpZihuZXdDaGlsZHJlbkZyb21JbmRleCA8IHNpemUpIHsKLQkJCQkJZm9yKGludCBqID0gbmV3Q2hpbGRyZW5Gcm9tSW5kZXg7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChqKTsKLQkJCQkJCWlmKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGNoaWxkKSkgewotCQkJCQkJCS8vIGNhbm5vdCBvdXRkZW50IGFjdGl2aXR5IHRoYXQgaGF2ZSBpbmhlcml0ZWQgc2libGluZyBiZWxvdyBpdAotCQkJCQkJCS8vCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNoaWxkcmVuVG9TdGFydEluZGV4TWFwLnB1dChjaGlsZHJlbiwgSW50ZWdlci52YWx1ZU9mKG5ld0NoaWxkcmVuRnJvbUluZGV4KSk7Ci0JCQkJfQotCQkJfQotCQkJaWYoIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpICYmICFjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQluZXdQYXJlbnQgPSBvbGRQYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZihuZXdQYXJlbnQgIT0gbnVsbCkgewotCQkJCW5ld0luZGV4ID0gbmV3UGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihvbGRQYXJlbnQpICsgMTsKLQkJCQlpZighY2hpbGRyZW5Ub1N0YXJ0SW5kZXhNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCW5ld0NoaWxkcmVuID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4+IGl0ZXIgPSBjaGlsZHJlblRvU3RhcnRJbmRleE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5PExpc3Q8T2JqZWN0PiwgSW50ZWdlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLQkJCQkJCUxpc3QgY2hpbGRyZW4gPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCW5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbi5zdWJMaXN0KGVudHJ5LmdldFZhbHVlKCkuaW50VmFsdWUoKSwgY2hpbGRyZW4uc2l6ZSgpKSk7Ci0JCQkJCX0KLQkJCQkJaWYoIURlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCwgbmV3Q2hpbGRyZW4sIHRydWUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQobmV3UGFyZW50LCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oZWxlbWVudCksIHRydWUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCW5ld1BhcmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChuZXdJbmRleCwgZWxlbWVudCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIG5ld1BhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpZWxlbWVudC5lQ29udGFpbmVyKCkpOwotCi0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotLy8JCQkJCSgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwobmV3Q2hpbGRyZW4pOwkJCQotCQkJCQkvLyBtb3ZlIHRoZSBwcm9jZXNzIHBhY2FrZ2Ugb2YgdGhlIGFjdGl2aXR5IHRvIG5ldyBwYXJlbnQgcGFja2FnZQotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkKLQkJCQkJCQkoKEFjdGl2aXR5KWVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKChCcmVha2Rvd25FbGVtZW50KSBjaGlsZCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJb2xkUGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKG9sZEluZGV4LCBlbGVtZW50KTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudFBrZyA9IChQcm9jZXNzUGFja2FnZSkgb2xkUGFyZW50LmVDb250YWluZXIoKTsKLQkJCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSllbGVtZW50LmVDb250YWluZXIoKSk7Ci0JCQkJaWYobmV3Q2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCQkoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdDaGlsZHJlbik7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0NoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQoKE1ldGhvZFBhY2thZ2UpKChBY3Rpdml0eSljaGlsZCkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX091dGRlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIE91dGRlbnRBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBPdXRkZW50QWN0aW9uKCkgewotCQl0aGlzKExBQkVMKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX09VVERFTlQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciN1cGRhdGVTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1cHBvcnQgaW5kZW50IG9ubHkgb25lIGFjdGl2aXR5IGZvciBub3cKLQkJLy8KLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldCA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQocmV0KTsKLQkJcmV0dXJuIHJldDsKLQkJCi0JCS8vVE9ETzogc3VwcG9ydCBpbmRlbnQgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBzZWxlY3Rpb24KLS8vCQlBcnJheUxpc3Q8QWN0aXZpdHk+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLS8vCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlsaXN0LmFkZCgoQWN0aXZpdHkpIGVsZW1lbnQpOwotLy8JCQl9Ci0vLwkJfQotLy8JCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZihkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCXJldHVybiBuZXcgT3V0ZGVudENvbW1hbmQoc2VsZWN0aW9uLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0JCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDg1NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Byb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuU3luY2hyb25pemVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0KLS8qKgotICogRGVmYXVsdCBTeW5jaHJvbml6ZSBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuCi0gKiBTeW5jaHJvbml6YXRpb24gdGFrZXMgcGxhY2UgZnJvbSBtZXRob2QgdG8gcHJvY2VzcyBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24gZXh0ZW5kcyBDb21tYW5kQWN0aW9uSGFuZGxlciAKLWltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24KLXsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgYWN0aXZlV29ya2JlbmNoUGFydDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SdW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIFByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb24oKSB7Ci0JCXN1cGVyKG51bGwsIExpYnJhcnlFZGl0UmVzb3VyY2VzLkF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIHdpdGggbGFiZWwgdGV4dAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJc3VwZXIobnVsbCwgbGFiZWxUZXh0KTsgCi0JfQotCQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLklXb3JrYmVuY2hQYXJ0QWN0aW9uI3NldEFjdGl2ZVdvcmtiZW5jaFBhcnQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlV29ya2JlbmNoUGFydChJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0KSB7Ci0JCWFjdGl2ZVdvcmtiZW5jaFBhcnQgPSB3b3JrYmVuY2hQYXJ0OwotCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIElFZGl0aW5nRG9tYWluUHJvdmlkZXIpIHsKLQkJCWRvbWFpbiA9ICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgd29ya2JlbmNoUGFydCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplQ29tbWFuZChnZXRUZXh0KCksIHNlbGVjdGlvbikgewotCQkJLyoKLQkJCSAqIAotCQkJICogCi0JCQkgKiBAc2VlIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmQjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQkJfQotCQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJYWJvcnRlZCA9IHRydWU7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9jZXNzIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZihhY3RpdmVXb3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpYWN0aXZlV29ya2JlbmNoUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KWUpLmdldFByb2Nlc3MoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIAotCQkJCQkmJiAhKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCkuaXNSZWFkT25seSgpKSB7Ci0JCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJCi0JCQkJCS8vIGRlc2NyaXB0b3IgbXVzdCBiZSBsaW5rZWQgYW5kIGlzIG5vdCBzdXBwcmVzc2VkCi0JCQkJCS8vCi0JCQkJCXZhbGlkID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYykgIT0gbnVsbCAmJiAhZGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCk7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGV4Y2x1ZGUgYnJlYWtkb3duIGVsZW1lbnQgd2l0aG91dCBhIHN1cGVyIGFjdGl2aXR5IGxpa2UgVGVhbVByb2ZpbGUncyBvd24gUm9sZURlc2NyaXB0b3IKLQkJCQkJLy8KLQkJCQkJaWYgKCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSAKLQkJCQkJewotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgKChQcm9jZXNzKWVsZW1lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2YWxpZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWxpZCA9IGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZih2YWxpZCkgewotCQkJCXNlbGVjdGVkLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCkpOwotCX0KLQotCi0gICAvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljYW5SdW4gPSAoKFN5bmNocm9uaXplQ29tbWFuZCkgY29tbWFuZCkuaW5pdGlsaXplKCk7Ci0JCQl9Ci0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZSk7IAotCi0JCWlmIChjYW5SdW4pIHsKLQkJCXN1cGVyLnJ1bigpOwotCQkJLy8gaWYoKChBdXRvU3luY2hyb25pemVDb21tYW5kKWNvbW1hbmQpLmlzU3VjZXNzZnVsKCkpIHsKLQkJCS8vIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyhnZXRUZXh0KCksCi0JCQkvLyAiU3luY2hyb25pemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIik7Ci0JCQkvLwkJCQkKLQkJCS8vIH0KLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQlnZXRUZXh0KCksCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoKTsgCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZWFzc2lnbkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlYXNzaWduQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODlmN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlYXNzaWduQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkFzc2lnbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBSZWFzc2lnbiBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgIDEuNQotICovCi1wdWJsaWMgY2xhc3MgUmVhc3NpZ25BY3Rpb24gZXh0ZW5kcyBBc3NpZ25BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIFJlYXNzaWduQWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIobGliVmlldyk7Ci0JCXNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVhc3NpZ25BY3Rpb25fdGV4dCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvUnVuKCkgewkJCi0JCWlmICghY2hlY2tNb2RpZnkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmRvUnVuKCk7Ci0JfQotCQotCXByb3RlY3RlZCBBc3NpZ25EaWFsb2cgZ2V0RGlhbG9nKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIEFzc2lnbkRpYWxvZy5uZXdSZWFzc2lnbkRpYWxvZyhnZXRMaWJyYXJ5VmlldygpLmdldFNpdGUoKS5nZXRTaGVsbCgpLCBlbGVtZW50cywKLQkJCQkoTWV0aG9kRWxlbWVudCkgZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1JlZnJlc2hDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViZDUxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVmcmVzaENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQ29uZmlndXJhdGlvblZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotCi0vKioKLSAqIFJlZnJlc2ggQ29uZmlndXJhdGlvbiBhY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uVmlldyB0YXJnZXRWaWV3OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlI2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJdGFyZ2V0VmlldyA9IChDb25maWd1cmF0aW9uVmlldykgdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCXRhcmdldFZpZXcucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9SZW5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjZDUzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvUmVuYW1lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBSZW5hbWVzIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUFjdGlvbiBleHRlbmRzCi0JCUNvbW1hbmRBY3Rpb25IYW5kbGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaFBhcnRBY3Rpb24sIElNb2RpZnlpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lQWN0aW9uX3RleHQ7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyBSZW5hbWVBY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIobnVsbCwgdGV4dCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBSZW5hbWVBY3Rpb24oKSB7Ci0JCXRoaXMoTEFCRUwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWxlY3RlZCBtZXRob2QgZWxlbWVudHMgY2FuIGJlCi0JICogcmVuYW1lZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVuYW1lKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoIShkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHx8IHNlbGVjdGlvbi5zaXplKCkgPiAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTmFtZWRFbGVtZW50Ci0JCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYoY2FuUmVuYW1lKHNlbGVjdGlvbikpIHsKLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkJcmV0ID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCX0KLQkJc2V0RW5hYmxlZChyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAoc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJaWYobyBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJcmV0dXJuIG5ldyBSZW5hbWVDb21tYW5kKChOYW1lZEVsZW1lbnQpIG8sIG51bGwpOwotCQl9Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlhY3RpdmVQYXJ0ID0gd29ya2JlbmNoUGFydDsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBzdXBlclJ1bigpIHsKLQkJZmluYWwgTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBUbmdVdGlsLnVud3JhcChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotLy8JCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLS8vCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCW9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShlLmVSZXNvdXJjZSgpKTsKLS8vCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0vLwkJCQlSZXBvc2l0b3J5UHJvdmlkZXIgcHJvdmlkZXIgPSBSZXBvc2l0b3J5UHJvdmlkZXIuZ2V0UHJvdmlkZXIoZmlsZS5nZXRQcm9qZWN0KCkpOwotLy8JCQkJaWYocHJvdmlkZXIgIT0gbnVsbCkgewotLy8JCQkJCUlGaWxlSGlzdG9yeVByb3ZpZGVyIGhpc3RvcnlQcm92aWRlciA9IHByb3ZpZGVyLmdldEZpbGVIaXN0b3J5UHJvdmlkZXIoKTsKLS8vCQkJCQlGaWxlTW9kaWZpY2F0aW9uVmFsaWRhdG9yIG1vZFZhbGlkYXRvciA9IHByb3ZpZGVyLmdldEZpbGVNb2RpZmljYXRpb25WYWxpZGF0b3IyKCk7Ci0vLwkJCQkJU3RyaW5nIGlkID0gcHJvdmlkZXIuZ2V0SUQoKTsKLS8vCQkJCQlTdWJzY3JpYmVyIHN1YnNjcmliZXIgPSBwcm92aWRlci5nZXRTdWJzY3JpYmVyKCk7Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGlkKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQlTaGVsbCBzaGVsbCA9IGFjdGl2ZVBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQotCQkvLyBjaGVjayBpZiBjb250YWluZXIncyByZXNvdXJjZSBjYW4gYmUgbW9kaWZpZWQKLQkJLy8KLQkJaWYgKGUuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkmJiBlLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKSAhPSBlLmVSZXNvdXJjZSgpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLmVDb250YWluZXIoKSwgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ19yZW5hbWVFcnJvciwKLQkJCQkJCXN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRQotCQkuY3JlYXRlTmFtZVZhbGlkYXRvcihlLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQlJSW5wdXRWYWxpZGF0b3IgaW5wdXRWYWxpZGF0b3IgPSBuZXcgSUlucHV0VmFsaWRhdG9yKCkgewotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldFNpbXBsZUVycm9yTWVzc2FnZSh2YWxpZGF0b3IKLQkJCQkJCQkuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCi0JCWJvb2xlYW4gZ2V0SW5wdXQgPSB0cnVlOwotCQlJbnB1dERpYWxvZyBpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVfdGV4dCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXduYW1lX3RleHQsIGUuZ2V0TmFtZSgpLAotCQkJCWlucHV0VmFsaWRhdG9yKTsKLQkJd2hpbGUgKGdldElucHV0KSB7Ci0JCQlnZXRJbnB1dCA9IGZhbHNlOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGlucHV0RGxnLmdldFZhbHVlKCkudHJpbSgpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQluZXdOYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdOYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKCFuZXdOYW1lLmVxdWFscyhlLmdldE5hbWUoKSkpIHsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQlTdHJpbmdbXSBjb25maWdOYW1lcyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ05hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJaWYgKG5ld05hbWUuZXF1YWxzKGNvbmZpZ05hbWVzW2ldKSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbmFtZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCQkJCQluZXdOYW1lKSk7Ci0JCQkJCQkJCWdldElucHV0ID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChnZXRJbnB1dCA9PSB0cnVlKSB7Ci0JCQkJCQlpbnB1dERsZyA9IG5ldyBJbnB1dERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lX3RleHQsCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld25hbWVfdGV4dCwgZQotCQkJCQkJCQkuZ2V0TmFtZSgpLCBpbnB1dFZhbGlkYXRvcik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZSwgKG5ldyBPYmplY3RbXSB7IGUuZ2V0TmFtZSgpLCBuZXdOYW1lIH0pKTsgCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsgCi0JCQkJCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIHRpdGxlLCBtc2cpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMoKE1ldGhvZFBsdWdpbillKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJUmVuYW1lQ29tbWFuZCByZW5hbWVDbWQgPSAoUmVuYW1lQ29tbWFuZCkgY29tbWFuZDsKLQkJCQkJcmVuYW1lQ21kLnNldE5ld05hbWUobmV3TmFtZSk7Ci0JCQkJCXJlbmFtZUNtZC5zZXRTaGVsbChzaGVsbCk7Ci0JCQkJCXN1cGVyLnJ1bigpOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVQYXJ0LmdldFNpdGUoKQotCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJCQlzdXBlclJ1bigpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvUmVuYW1lKGZpbmFsIE5hbWVkRWxlbWVudCBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQluZXcgUmVuYW1lQ29tbWFuZChlLCBuZXdOYW1lKS5leGVjdXRlKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlbmFtZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewkJCi0JCXByaXZhdGUgTmFtZWRFbGVtZW50IGU7Ci0JCXByaXZhdGUgU3RyaW5nIG5ld05hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIG9sZE5hbWU7Ci0JCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlbmFtZWRSZXNvdXJjZXM7Ci0JCQotCQlwdWJsaWMgUmVuYW1lQ29tbWFuZChOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMuZSA9IGU7Ci0JCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCQl9CQkKLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5ld05hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByb2xsYmFjaygpIHsKLQkJCS8vIHJlc3RvcmUgb2xkIG5hbWUKLQkJCS8vCi0JCQlzZXROYW1lKG9sZE5hbWUpOwotCQkJCi0JCQkvLyByZXN0b3JlIG9sZCBsb2NhdGlvbgotCQkJLy8KLQkJCWlmKCFyZW5hbWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCWFkanVzdExvY2F0aW9uKHJlbmFtZWRSZXNvdXJjZXMsIG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCkpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaGFuZGxlUGVyc2lzdGVuY2VFeGNlcHRpb24oRXhjZXB0aW9uIGUxKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZTEpOwotCi0JCQlTdHJpbmcgZGV0YWlscyA9IGUxLmdldE1lc3NhZ2UoKSAhPSBudWxsID8gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KCI6IHswfSIsIG5ldyBPYmplY3RbXSB7IGUxLmdldE1lc3NhZ2UoKSB9KSA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X2Vycl9zYXZpbmcsCi0JCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSwKLQkJCQkJCQlkZXRhaWxzIH0pOwotCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24obXNnKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRQZXJzaXN0ZXJGb3IoZS5lUmVzb3VyY2UoKSkKLQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQWRqdXN0cyBsb2NhdGlvbiBvZiBhbGwgYWZmZWN0ZWQgcmVzb3VyY2VzLgotCQkgKiAKLQkJICogQHJldHVybiByZXNvdXJjZXMgd2hvc2UgbG9jYXRpb24gaGFzIGJlZW4gYWRqdXN0ZWQKLQkJICovCi0JCXByaXZhdGUgSVN0YXR1cyBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uPFJlc291cmNlPiByZW5hbWVkUmVzb3VyY2VzKSB7Ci0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb1JlbmFtZSA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCSYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKChNZXRob2RFbGVtZW50KSBlKSkgewotCQkJCXJlc291cmNlc1RvUmVuYW1lLmFkZCgoKENvbnRlbnRFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJCXJlc291cmNlc1RvUmVuYW1lLmFkZChlLmVSZXNvdXJjZSgpKTsKLQkJCXJldHVybiBhZGp1c3RMb2NhdGlvbihyZXNvdXJjZXNUb1JlbmFtZSwgcmVuYW1lZFJlc291cmNlcyk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBBZGp1c3RzIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VzLgotCQkgKiAKLQkJICogQHJldHVybiByZXNvdXJjZXMgd2hvc2UgbG9jYXRpb24gaGFzIGJlZW4gYWRqdXN0ZWQKLQkJICovCi0JCXByaXZhdGUgSVN0YXR1cyBhZGp1c3RMb2NhdGlvbihDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb1JlbmFtZSwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVuYW1lZFJlc291cmNlcykgewotCQkJRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldFBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzVG9SZW5hbWUpIHsKLQkJCQkJVVJJIG9sZFVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJCQlwZXJzaXN0ZXIuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UpOwotCQkJCQlpZighcmVzb3VyY2UuZ2V0VVJJKCkuZXF1YWxzKG9sZFVSSSkpIHsKLQkJCQkJCXJlbmFtZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZXgpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCWUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQkJCi0JCQotCQlwcml2YXRlIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJZS5zZXROYW1lKG5ld05hbWUpOwotCQkJCi0JCQkvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBQcm9jZXNzQ29tcG9uZW50IHRvIGtlZXAgaXRzCi0JCQkvLyBuYW1lIGFuZCB0aGUgbmFtZSBvZiBpdHMgcHJvY2VzcyBpbiBzeW5jLgotCQkJaWYgKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7Ci0JCQkJcHJvYy5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCW9sZE5hbWUgPSBlLmdldE5hbWUoKTsJCQkKLQkJCXNldE5hbWUobmV3TmFtZSk7Ci0JCQkKLQkJCXJlbmFtZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkvLyByZW5hbWUgZmlsZShzKQotCQkJLy8KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gYWRqdXN0TG9jYXRpb24ocmVuYW1lZFJlc291cmNlcyk7Ci0JCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlyb2xsYmFjaygpOwotCQkJCQkJRXhjZXB0aW9uIGV4ID0gKEV4Y2VwdGlvbikgc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQkJCQkJdGhyb3cgZXggaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uID8gKFJ1bnRpbWVFeGNlcHRpb24pIGV4IDogbmV3IFdyYXBwZWRFeGNlcHRpb24oZXgpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQkJCi0JCQl9OwotCQkKLQkJCWJvb2xlYW4gcmVzdWx0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlbmFtaW5nX3RleHQpOwotCQkJaWYoIXJlc3VsdCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoZSwgCi0JCQkJCXNoZWxsID09IG51bGwgPyBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkgOiBzaGVsbCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3JlbmFtZUVycm9yLAotCQkJCQkJc3RhdHVzKTsKLQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlyb2xsYmFjaygpOwotCQkJCQl9Ci0JCQkJCQotCQkJCX0sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJLy8gU2F2ZSB0aGUgbW9kaWZpZWQgZmlsZShzKS4KLQkJCS8vCi0JCQlydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFNhdmUgdGhlIG1vZGlmaWVkIGZpbGUocykuCi0JCQkJCS8vCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUoZS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwkJCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsJCQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWhhbmRsZVBlcnNpc3RlbmNlRXhjZXB0aW9uKGUxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJvbGxiYWNrKCk7CQkJCQkJCi0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBjaGFuZ2UgZGlhZ3JhbSByZXNvdXJjZSBhcyB3ZWxsCi0JCQkJCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlKS5nZXRQcm9jZXNzKCk7CQotCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1nci51cGRhdGVSZXNvdXJjZVVSSSgpOwotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQl0cnkgeyAKLQkJCQkJCQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZW5hbWluZ190ZXh0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCQlleGVjdXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZSA9IG51bGw7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU2F2ZVRoaXNBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjZmMDlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TYXZlVGhpc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotCi0vKioKLSAqIEFjdGlvbiBmb3Igc2F2aW5nIHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVRoaXNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VsZWN0ZWRPYmplY3RzOwotCi0JcHVibGljIFNhdmVUaGlzQWN0aW9uKCkgewotCQlzdXBlcihBdXRob3JpbmdVSVJlc291cmNlcy5TYXZlVGhpc0FjdGlvbl9zYXZlb2JqZWN0KTsgCi0JfQotCi0JLyoqCi0JICogVXBkYXRlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAJCQlTZWxlY3Rpb24KLQkgKiBAcmV0dXJuIAotCSAqIAkJCWJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciB1cGRhdGUgd2FzIGRvbmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBvYmplY3RzID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOykgewotCQkJc2VsZWN0ZWRPYmplY3RzLmFkZChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4udW53cmFwKG9iamVjdHMKLQkJCQkJLm5leHQoKSkpOwotCQl9Ci0KLQkJcmV0dXJuIHNlbGVjdGVkT2JqZWN0cy5zaXplKCkgPT0gMQotCQkJCSYmIHNlbGVjdGVkT2JqZWN0cy5nZXQoMCkgaW5zdGFuY2VvZiBFT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChzZWxlY3RlZE9iamVjdHMgPT0gbnVsbCB8fCBzZWxlY3RlZE9iamVjdHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQlTV1QuU0FWRSk7Ci0JCVN0cmluZyBwYXRoID0gZmQub3BlbigpOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlVUkkgZmlsZVVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHRvIHBlcnNpc3QgdGhlIG1vZGVsLgotCQlSZXNvdXJjZSByZXMgPSBuZXcgWE1JUmVzb3VyY2VGYWN0b3J5SW1wbCgpLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQlPYmplY3Qgb2JqID0gc2VsZWN0ZWRPYmplY3RzLmdldCgwKTsKLQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKChFT2JqZWN0KSBvYmopOwotCQl0cnkgewotCQkJcmVzLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dEZXRhaWxzUHJvYmxlbVZpZXdBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93RGV0YWlsc1Byb2JsZW1WaWV3QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjRkOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dEZXRhaWxzUHJvYmxlbVZpZXdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU2hvd0RldGFpbHNQcm9ibGVtVmlld0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubWFya2Vycy5pbnRlcm5hbC5Qcm9ibGVtVmlldzsKLQotLyoqCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93RGV0YWlsc1Byb2JsZW1WaWV3QWN0aW9uIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIFByb2JsZW1WaWV3IHRhcmdldFZpZXc7Ci0JcHJpdmF0ZSBJTWFya2VyIHNlbGVjdGVkTWFya2VyOwotCXByaXZhdGUgU3RyaW5nIG1hcmtkZXJEZXRhaWxUeXBlOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZSNpbml0KG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCXRhcmdldFZpZXcgPSAoUHJvYmxlbVZpZXcpIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoc2VsZWN0ZWRNYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQl0cnkgewotCQkJCi0JCQlTdHJpbmcgbGFiZWxTdHJpbmcgPSAoU3RyaW5nKSBzZWxlY3RlZE1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJCVN0cmluZyB0ZXh0U3RyaW5nID0gZ2V0RGlhbG9nVGV4dFN0cmluZyhzZWxlY3RlZE1hcmtlciwgbWFya2RlckRldGFpbFR5cGUpOwotCQkJaWYgKHRleHRTdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU2hvd0RldGFpbHNQcm9ibGVtVmlld0RpYWxvZyBzaG93RGlhbG9nID0gbmV3IFNob3dEZXRhaWxzUHJvYmxlbVZpZXdEaWFsb2coCi0JCQkJCXRhcmdldFZpZXcuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIGxhYmVsU3RyaW5nLCB0ZXh0U3RyaW5nKTsKLQkJCXNob3dEaWFsb2cub3BlbigpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCQkKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREaWFsb2dUZXh0U3RyaW5nKElNYXJrZXIgbWFya2VyLCBTdHJpbmcgdHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsJCQotCQkKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHMoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyID09IG51bGwgPyAiIiA6IHN0cjsvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQltYXJrZGVyRGV0YWlsVHlwZSA9IG51bGw7Ci0JCXNlbGVjdGVkTWFya2VyID0gbnVsbDsJCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1Nob3dQcmVzZW50YXRpb25OYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGNmNTE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TaG93UHJlc2VudGF0aW9uTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLQotLyoqCi0gKiBTaG93IFByZXNlbnRhdGlvbiBuYW1lcyBpbiBsaWJyYXJ5IHZpZXcKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU2hvd1ByZXNlbnRhdGlvbk5hbWVzIGltcGxlbWVudHMgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3IHRhcmdldFZpZXc7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGUjaW5pdChvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQl0YXJnZXRWaWV3ID0gKExpYnJhcnlWaWV3KSB2aWV3OwotCi0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0Uuc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWVzKCFQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpOwotCQl0YXJnZXRWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9TeW5jaHJvbml6YXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlMWYyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvU3luY2hyb25pemF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25DaG9pY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TeW5jaHJvbml6YXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5TeW5jaHJvbml6ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFN5bmNocm9uaXphaXRvbiBhY3Rpb24gZm9yIHByb2Nlc3MgZWxlbWVudHMuIFN5bmNocm9uaXphdGlvbiB0YWtlcyBwbGFjZSBmcm9tIG1ldGhvZAotICogZWxlbWVudCB0byBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTGUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25BY3Rpb24gZXh0ZW5kcyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uIAotaW1wbGVtZW50cyBJV29ya2JlbmNoUGFydEFjdGlvbgotewotCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICoKLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uQWN0aW9uKCkgewotCQlzdXBlcihMaWJyYXJ5RWRpdFJlc291cmNlcy5NYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWwpOyAKLQl9Ci0JCi0JLyoKLQkgKiBTZXQgUHJvY2VzcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3MoUHJvY2VzcyBhUHJvY2VzcykgewotCQl0aGlzLnNlbGVjdGVkUHJvY2VzcyA9IGFQcm9jZXNzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJSdW4oKSB7Ci0JCXN1cGVyLnJ1bigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMgPSBuZXcgU3luY2hyb25pemF0aW9uQ2hvaWNlcygpOwotCQkJCWNob2ljZXMuc2V0U2VsZWN0ZWRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQkJCi0JCQkJLy8gSW5zdGFudGlhdGUgYW5kIGluaXRpYWxpemUgdGhlIHdpemFyZC4KLQkJCQlTeW5jaHJvbml6YXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFN5bmNocm9uaXphdGlvbldpemFyZChjaG9pY2VzKTsKLQotCQkJCS8vIEluc3RhbnRpYXRlIHRoZSB3aXphcmQgY29udGFpbmVyIHdpdGggdGhlIHdpemFyZCBhbmQgb3BlbiBpdC4KLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJCQkJCQkJd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsJCi0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogIiArIGNob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJaWYgKCFjaG9pY2VzLmlzRmluaXNoUHJlc3NlZCgpKQotCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJLy8gU2V0IHN5bmNoRmVhdHVyZXMgJ3N5bmNGZWF0dXJlU2V0JwotCQkJCUhhc2hTZXQgc3luY0ZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCQkJCWFkZENob2ljZXNUb1NldChzeW5jRmVhdHVyZVNldCwgY2hvaWNlcyk7Ci0JCQkJLy8gTWV0aG9kIGNvbmZpZyBjYW4gYmUgb2J0YWluZWQgYnkgJ2Nob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKScKLQkJCQkKLQkJCQlTeW5jaHJvbml6ZUNvbW1hbmQgY21kID0gKFN5bmNocm9uaXplQ29tbWFuZCljb21tYW5kOwotCQkJCWNtZC5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNob2ljZXMuZ2V0U2VsZWN0ZWRDb25maWcoKSk7Ci0JCQkJY21kLnNldFN5bmNocm9uaXphdGlvbkZlYXR1cmVzKHN5bmNGZWF0dXJlU2V0KTsKLQkJCQkKLQkJCQlzdXBlclJ1bigpOwotCQkJfQotCQl9KTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENob2ljZXNUb1NldChIYXNoU2V0IHN5bmNTZXQsIFN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlpZiAoY2hvaWNlcy5nZXRTeW5jTmFtZSgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY1ByZXNOYW1lKCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0JyaWVmRGVzYygpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNPcHRJbnB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNNYW5JbnB1dCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jT3V0cHV0KCkgPT0gU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCl7Ci0JCQlzeW5jU2V0LmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jUHJpbVBlcmZvcm1lcigpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jQWRkblBlcmZvcm1lcigpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jUmVzcFJvbGUoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSk7Ci0JCX0KLQkJaWYgKGNob2ljZXMuZ2V0U3luY0NvbnRBcnRpZmFjdCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQl9Ci0JCWlmIChjaG9pY2VzLmdldFN5bmNEZWxpdlBhcnQoKSA9PSBTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKXsKLQkJCXN5bmNTZXQuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpKTsKLQkJfQotCQlpZiAoY2hvaWNlcy5nZXRTeW5jU2VsU3RlcCgpID09IFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpewotCQkJc3luY1NldC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9VbmFzc2lnbkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VuYXNzaWduQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDlkN2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VuYXNzaWduQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5DdXN0b21lQ2F0ZWdvcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBVbmFzc2lnbiBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgIDEuNQotICovCi1wdWJsaWMgY2xhc3MgVW5hc3NpZ25BY3Rpb24gZXh0ZW5kcyBDdXN0b21lQ2F0ZWdvcnlBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIFVuYXNzaWduQWN0aW9uKExpYnJhcnlWaWV3IGxpYlZpZXcpIHsKLQkJc3VwZXIobGliVmlldywgQXV0aG9yaW5nVUlSZXNvdXJjZXMudW5hc3NpZ25BY3Rpb25fdGV4dCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRvUnVuKCkgewotCQlpZiAoISBjaGVja01vZGlmeSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VjZVRvU2F2ZSA9IGRvUnVuQmVmb3JlU2F2ZSgpOwotCQlzYXZlKHJlc291Y2VUb1NhdmUpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0byBzYXZlCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBkb1J1bkJlZm9yZVNhdmUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZ2V0TGlicmFyeVZpZXcoKS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBlbGVtZW50OwotCi0JCUVPYmplY3QgY29udGFpbmVyID0gY2F0ZWdvcnkuZUNvbnRhaW5lcigpOwotCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShjb250YWluZXIsCi0JCQkJZ2V0TGlicmFyeVZpZXcoKS5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX21vdmVFcnJvciwgc3RhdHVzKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlPYmplY3QgcGFyZW50ID0gZ2V0U2VsZWN0aW9uUGFyZW50T2JqZWN0KCk7Ci0JCWlmICghIChwYXJlbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUN1c3RvbUNhdGVnb3J5IHBhcmVudENjID0gKEN1c3RvbUNhdGVnb3J5KSBwYXJlbnQ7CQkJCQkJCi0JCXVuYXNzaWduKGdldExpYnJhcnlWaWV3KCkuZ2V0U2l0ZSgpLmdldFNoZWxsKCksIGVsZW1lbnQsIHBhcmVudENjLCBuZXcgQXJyYXlMaXN0KCkpOwotCQkKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXJlbnRDYy5lUmVzb3VyY2UoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmFzc2lnbihTaGVsbCBzaGVsbCwgZmluYWwgT2JqZWN0IGVsZW1lbnQsIGZpbmFsIEN1c3RvbUNhdGVnb3J5IHBhcmVudENjLCBmaW5hbCBBcnJheUxpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJZmluYWwgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpOwotCQlmaW5hbCBBcnJheUxpc3QgZWxlbWVudHMgID0gbmV3IEFycmF5TGlzdCgpOwotCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQotCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5yZW1vdmVJdGVtc0Zyb21Nb2RlbDEoZWxlbWVudHMsIHBhcmVudENjLCB1c2VkQ2F0ZWdvcmllcywKLQkJCQkJCWhlbHBlci5nZXRBY3Rpb25NYW5hZ2VyKCksIEN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5nZXRBbmNlc3RvcnMocGFyZW50Q2MpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJCi0JCQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Njk0OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogVXBkYXRlIHN1cHByZXNzaW9uIGluZm9ybWF0aW9uIGZyb20gYmFzZSBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24gZXh0ZW5kcwotCQlDb21tYW5kQWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hQYXJ0QWN0aW9uLCBJTW9kaWZ5aW5nQWN0aW9uIHsKLQotCXByaXZhdGUgUHJvY2Vzc0VkaXRvciBlZGl0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRleHQKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbihTdHJpbmcgdGV4dCkgewotCQlzdXBlcihudWxsLCB0ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqCi0JICovCi0JcHVibGljIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24oKSB7Ci0JCXRoaXMoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl91cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uX2xhYmVsKTsgCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJQXJyYXlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoU3VwcHJlc3Npb24uaXNWYWxpZChlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYobGlzdC5zaXplKCkgPT0gMSAmJiAKLQkJCQlQcm9jZXNzVXRpbC5pc1JvbGxlZFVwRGVzY3JpcHRvcihsaXN0LmdldCgwKSwgKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db21tYW5kQWN0aW9uSGFuZGxlciNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZChnZXRUZXh0KCksIHNlbGVjdGlvbiwgZWRpdG9yLmdldEFkYXB0ZXJGYWN0b3J5KCksIGVkaXRvci5nZXRTdXBwcmVzc2lvbigpKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kI2V4ZWN1dGUoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCQkKLQkJCQlpZighZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCWVkaXRvci5yZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQjdW5kbygpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQkJc3VwZXIudW5kbygpOwotCQkJCQotCQkJCWlmKCFnZXRBZmZlY3RlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbiNzZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoSVdvcmtiZW5jaFBhcnQgd29ya2JlbmNoUGFydCkgewotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSUVkaXRpbmdEb21haW5Qcm92aWRlcikgewotCQkJZG9tYWluID0gKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKXdvcmtiZW5jaFBhcnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlpZih3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHdvcmtiZW5jaFBhcnQ7Ci0JCX0JCQotCQllbHNlIGlmKHdvcmtiZW5jaFBhcnQgPT0gbnVsbCkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29tbWFuZEFjdGlvbkhhbmRsZXIjcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlzdXBlclJ1bigpOwotCQkJCQl9Ci0JCQkKLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvYWN0aW9ucy9Vc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTc5NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuTmV3Q29uZmlndXJhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuRXJyb3JEaWFsb2dOb1JlYXNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLlVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5Vc2VySW5wdXRzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVycy5EZWxlZ2F0ZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogSW1wbGVtZW50cyBoYW5kbGluZyBvZiB1c2VyIGludGVyYWN0aW9uIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlckludGVyYWN0aW9uSGFuZGxlciBpbXBsZW1lbnRzIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHsKLQotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwcml2YXRlIElNZXNzZW5nZXIgbWVzc2VuZ2VyID0gbmV3IElNZXNzZW5nZXIoKSB7Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2cpIHsKLQkJCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JCQkJLy8KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1zZyk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJdGl0bGUsIG1zZyk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0Vycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBJU3RhdHVzIHN0YXR1cykgewotCQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQkJc2hvd0Vycm9yKHRpdGxlLCBtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkJLy8KLQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCBzdGF0dXMpOwotCQkJCQkJfQotCi0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuRXhjZXB0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0Vycm9yKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywKLQkJCQlmaW5hbCBTdHJpbmcgcmVhc29uLCBmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJCW1zZywgcmVhc29uLCBleGNlcHRpb24pOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2csCi0JCQkJZmluYWwgU3RyaW5nIHJlYXNvbikgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbXNnLCByZWFzb24pOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZygKLQkJCQkJCXRpdGxlLCBtc2csIHJlYXNvbik7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJbXNnKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0luZm8oamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2hvd0luZm8oZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKHRpdGxlLCBtc2cpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5SW5mbyh0aXRsZSwKLQkJCQkJCW1zZyk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsCi0JCSAqICAgICAgamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNob3dFcnJvcihmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBtc2csCi0JCQkJZmluYWwgU3RyaW5nIHJlYXNvbiwgZmluYWwgU3RyaW5nIGRldGFpbHMsCi0JCQkJZmluYWwgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCQkvLwotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLAotCQkJCQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQkJCX0KLQotCQkJCX0pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJCW1zZywgcmVhc29uLCBkZXRhaWxzLCBleGNlcHRpb24pOwotCQkJfQotCQl9Ci0KLQl9OwotCi0JcHVibGljIFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiAgICAgICAgICAgIHRoZSBzaGVsbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGVsbChTaGVsbCBzaGVsbCkgewotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlciNnZXRVSUNvbnRleHQoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VUlDb250ZXh0KCkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJfQotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3QoamF2YS51dGlsLkxpc3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyLCBib29sZWFuLCBqYXZhLnV0aWwuTGlzdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIExpc3Qgc2VsZWN0KExpc3Qgb2JqZWN0c1RvU2VsZWN0LCBmaW5hbCBJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkJCWJvb2xlYW4gbXVsdGlwbGUsIExpc3QgaW50aXRpYWxTZWxlY3Rpb24sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlJTGFiZWxQcm92aWRlciBscCA9IG5ldyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWlmIChtdWx0aXBsZSkgewotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCk7Ci0JCQlVbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBVbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQlzaGVsbCwgb2JqZWN0c1RvU2VsZWN0LCBjb250ZW50UHJvdmlkZXIsIGxwLCBtc2cpOwotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3Qgb2Jqc1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkJaWYgKG9ianMgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Jqcy5sZW5ndGggPT0gMCkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEFycmF5cy5hc0xpc3Qob2Jqcyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCXNoZWxsLCBscCk7Ci0KLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5zZXRFbGVtZW50cyhvYmplY3RzVG9TZWxlY3QudG9BcnJheSgpKTsKLQkJCWRsZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCQlkbGcuc2V0TWVzc2FnZShtc2cpOwotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRGaWx0ZXIobnVsbCk7Ci0JCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlPYmplY3Qgb2JqID0gZGxnLmdldEZpcnN0UmVzdWx0KCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYmopOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3RPbmUoaW50W10sCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgc2VsZWN0T25lKGludFtdIGFjdGlvbnMsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJZmluYWwgU3RyaW5nW10gYnV0dG9uTGFiZWxzID0gbmV3IFN0cmluZ1thY3Rpb25zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJYnV0dG9uTGFiZWxzW2ldID0gZ2V0QWN0aW9uVGV4dChhY3Rpb25zW2ldKTsKLQkJfQotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzaGVsbCA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaW1hZ2UgPSBzaGVsbC5nZXRJbWFnZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJTWVzc2FnZURpYWxvZyBtc2dEbGcgPSBuZXcgTWVzc2FnZURpYWxvZyhzaGVsbCwgdGl0bGUsIGltYWdlLCBtc2csCi0JCQkJCU1lc3NhZ2VEaWFsb2cuUVVFU1RJT04sIGJ1dHRvbkxhYmVscywgMCk7Ci0JCQlpbnQgaWQgPSBtc2dEbGcub3BlbigpOwotCQkJcmV0dXJuIGFjdGlvbnNbaWRdOwotCQl9IGVsc2UgewotCQkJRXJyb3JEaWFsb2dOb1JlYXNvbiBkbGcgPSBuZXcgRXJyb3JEaWFsb2dOb1JlYXNvbihzaGVsbCwgdGl0bGUsCi0JCQkJCW1zZywgc3RhdHVzLCBJU3RhdHVzLk9LIHwgSVN0YXR1cy5JTkZPIHwgSVN0YXR1cy5XQVJOSU5HCi0JCQkJCQkJfCBJU3RhdHVzLkVSUk9SKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidXR0b25MYWJlbHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVN0cmluZyBsYWJlbCA9IGJ1dHRvbkxhYmVsc1tpXTsKLQkJCQkJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIGksIGxhYmVsLCBpID09IDApOwotCQkJCQl9Ci0JCQkJCWlmIChzaG91bGRTaG93RGV0YWlsc0J1dHRvbigpKSB7Ci0JCQkJCQlkZXRhaWxzQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLlNIT1dfREVUQUlMU19MQUJFTCwgZmFsc2UpOwotCQkJCQl9Ci0KLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRXJyb3JEaWFsb2dOb1JlYXNvbiNidXR0b25QcmVzc2VkKGludCkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBpZCkgewotCQkJCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5ERVRBSUxTX0lEKSB7Ci0JCQkJCQlzdXBlci5idXR0b25QcmVzc2VkKGlkKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXNldFJldHVybkNvZGUoaWQpOwotCQkJCQkJY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlpbnQgaWQgPSBkbGcub3BlbigpOwotCQkJcmV0dXJuIGFjdGlvbnNbaWRdOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFjdGlvbiB0ZXh0Ci0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqIEByZXR1cm4gQWN0aW9uIHRleHQgLSBlaXRoZXIgQUJPUlQsIENBTkNFTCwgT0ssIFJFVFJZCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uVGV4dChpbnQgYWN0aW9uKSB7Ci0JCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0FCT1JUOgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQUJPUlRfTEFCRUw7Ci0JCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTDoKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fT0s6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fUkVUUlk6Ci0JCQlyZXR1cm4gSURpYWxvZ0NvbnN0YW50cy5SRVRSWV9MQUJFTDsKLQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTOgotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMOwotCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTzoKLQkJCXJldHVybiBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlciNnZXRNZXNzZW5nZXIoKQotCSAqLwotCXB1YmxpYyBJTWVzc2VuZ2VyIGdldE1lc3NlbmdlcigpIHsKLQkJcmV0dXJuIG1lc3NlbmdlcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyI3JlcXVlc3RJbnB1dChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVxdWVzdElucHV0KGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG1zZywgZmluYWwgTGlzdCB1c2VySW5wdXRzKSB7Ci0JCWlmICh1c2VySW5wdXRzID09IG51bGwgfHwgdXNlcklucHV0cy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChEaXNwbGF5LmdldEN1cnJlbnQoKSA9PSBudWxsKSB7Ci0JCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCS8vCi0JCQlmaW5hbCBib29sZWFuIHJldEhvbGRlcltdID0gbmV3IGJvb2xlYW5bMV07Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXJldEhvbGRlclswXSA9IGRvUmVxdWVzdElucHV0KHRpdGxlLCBtc2csIHVzZXJJbnB1dHMpOwotCQkJCX0KLQotCQkJfSk7Ci0JCQlyZXR1cm4gcmV0SG9sZGVyWzBdOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGRvUmVxdWVzdElucHV0KHRpdGxlLCBtc2csIHVzZXJJbnB1dHMpOwotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9SZXF1ZXN0SW5wdXQoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBMaXN0IHVzZXJJbnB1dHMpIHsKLQkJZmluYWwgVXNlcklucHV0IHVzZXJJbnB1dCA9IChVc2VySW5wdXQpIHVzZXJJbnB1dHMuZ2V0KDApOwotCQlpZiAodXNlcklucHV0LmdldENvbnRleHQoKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQpIHsKLQkJCU1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQgY21kID0gKE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQpIHVzZXJJbnB1dAotCQkJCQkuZ2V0Q29udGV4dCgpOwotCQkJaWYgKGNtZC5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpIHsKLQkJCQlOZXdDb25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdDb25maWd1cmF0aW9uV2l6YXJkKCk7Ci0JCQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0JCQkJd2l6YXJkLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNtZC5nZXRDaGlsZCgpKTsKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCQl1c2VySW5wdXQuc2V0SW5wdXQod2l6YXJkLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKS5nZXROYW1lKCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKHVzZXJJbnB1dHMuc2l6ZSgpID09IDEgJiYgdXNlcklucHV0LmdldFR5cGUoKSA9PSBVc2VySW5wdXQuVEVYVCAmJiB1c2VySW5wdXQuZ2V0TGFiZWwoKSA9PSBudWxsKSB7Ci0JCQkvLyB1c2VyIElucHV0RGlhbG9nIGZvciB0aGlzIGNhc2UgdW50aWwgd2UgZml4IHRoaXMgZGlhbG9nIGJveAotCQkJLy8KLQkJCUlJbnB1dFZhbGlkYXRvciB2YWxpZGF0b3IgPSB1c2VySW5wdXQuZ2V0VmFsaWRhdG9yKCkgIT0gbnVsbCA/IG5ldyBJSW5wdXRWYWxpZGF0b3IoKSB7Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJcmV0dXJuIHVzZXJJbnB1dC5nZXRWYWxpZGF0b3IoKS5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCX0KLQkJCQotCQkJfSA6IG51bGw7Ci0JCQlJbnB1dERpYWxvZyBkbGcgPSBuZXcgSW5wdXREaWFsb2coUGxhdGZvcm1VSQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQl0aXRsZSwgbXNnLCAoU3RyaW5nKXVzZXJJbnB1dC5nZXRJbnB1dCgpLCB2YWxpZGF0b3IpOwotCQkJaWYoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQl1c2VySW5wdXQuc2V0SW5wdXQoZGxnLmdldFZhbHVlKCkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlVc2VySW5wdXRzRGlhbG9nIGRpYWxvZyA9IG5ldyBVc2VySW5wdXRzRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksIHVzZXJJbnB1dHMsCi0JCQkJdGl0bGUsIG1zZyk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZy5nZXRSZXN1bHQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxN2RkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhY3Rpb25zIGZvciB0aGUgQXV0aG9yaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3YmIyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NlbGxlZGl0b3JzL0Fic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVHJlZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgY2hlY2sgYm94IGNlbGwgZWRpdG9yCi0gKiBAYXV0aG9yIEFuIE1pbmcKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciB7Ci0KLQkvLyB0aGUgY2VsbCBtb2RpZmllcgotCXByaXZhdGUgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IG51bGw7Ci0KLQkvLyB0cmVlIGVkaXRvcgotCXByaXZhdGUgVHJlZUVkaXRvciB0cmVlRWRpdG9yID0gbnVsbDsKLQotCS8vIHRoZSB0cmVlCi0JcHJpdmF0ZSBUcmVlIHRyZWUgPSBudWxsOwotCi0JLy8gdGhlIGNvbnRyb2wgZWRpdG9yCi0JcHJpdmF0ZSBDb250cm9sIGNvbnRyb2wgPSBudWxsOwotCi0JLy8gdGhlIGNvbHVtbiBpbmRleAotCXByaXZhdGUgaW50IGNvbHVtbkluZGV4OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHRyZWUKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHRyZWUpIHsKLQkJdGhpcy50cmVlID0gKFRyZWUpIHRyZWU7Ci0JCXRoaXMudHJlZUVkaXRvciA9IG5ldyBUcmVlRWRpdG9yKHRoaXMudHJlZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBTZXQgY2VsbCBtb2RpZmllcgotCSAqIEBwYXJhbSBtb2RpZmllcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENlbGxNb2RpZmllcihJQ2VsbE1vZGlmaWVyIG1vZGlmaWVyKSB7Ci0JCXRoaXMubW9kaWZpZXIgPSBtb2RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGNlbGwgbW9kaWZpZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlDZWxsTW9kaWZpZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUNlbGxNb2RpZmllciBnZXRDZWxsTW9kaWZpZXIoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGlmaWVyOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJbWFnZSBnZXRJbWFnZShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbW9kaWZ5KFRyZWVJdGVtIGl0ZW0sIFN0cmluZyBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQkvKgotCSAqID09PT09PT1pbiBmYWN0IGJlbG93IGNvZGVzIGFyZSBmb3IgdGhlIGR5bmFtaWMgY2VsbCBlZGl0b3IgKHJlYWwgY29udHJvbAotCSAqICJidXR0b24iKT09PT09Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yVG8oVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWlmICh0cmVlRWRpdG9yLmdldEl0ZW0oKSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY29udHJvbCA9PSBudWxsKQotCQkJY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wodHJlZSk7Ci0JCWhvb2tDb250cm9sKGNvbnRyb2wsIGl0ZW0sIGNvbHVtbnByb3BlcnR5KTsKLQotCQl0cmVlRWRpdG9yLm1pbmltdW1XaWR0aCA9IGNvbnRyb2wuZ2V0U2l6ZSgpLng7Ci0JCXRyZWVFZGl0b3IuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCXRyZWVFZGl0b3Iuc2V0RWRpdG9yKGNvbnRyb2wsIGl0ZW0sIGNvbHVtbkluZGV4KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZUVkaXRvckZyb20oVHJlZUl0ZW0gaXRlbSwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWNvbnRyb2wuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyZWVFZGl0b3Iuc2V0RWRpdG9yKG51bGwsIG51bGwsIGNvbHVtbkluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBjcmVhdGVDb250cm9sKFRyZWUgcGFyZW50KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhvb2tDb250cm9sKENvbnRyb2wgY29udHJvbCwgVHJlZUl0ZW0gaXRlbSwKLQkJCVN0cmluZyBjb2x1bW5wcm9wZXJ0eSk7Ci0KLQkvKioKLQkgKiBHZXQgY29sdW1uIGluZGV4Ci0JICogQHJldHVybgotCSAqIAkJaW5kZXgKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KCkgewotCQlyZXR1cm4gY29sdW1uSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0IGluZGV4IGZvciBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uSW5kZXgKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleChpbnQgY29sdW1uSW5kZXgpIHsKLQkJdGhpcy5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2VsbGVkaXRvcnMvUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlY2Q0M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jZWxsZWRpdG9ycy9Qcm9jZXNzQ2hlY2tCb3hDZWxsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQ2hlY2sgQm94IGNlbGwgZWRpdG9yIGZvciBwcm9jZXNzIGZvcm0gcGFnZSwgV0JTLCBUQSwgV1BVCi0gKiAKLSAqIEBhdXRob3IgQW4gTWluZwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDaGVja0JveENlbGxFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciB7Ci0JCi0JLy8gY2hlY2tib3ggaW1hZ2VzCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSBjaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJImZ1bGwvb2JqMTYvQ2hlY2suZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgSW1hZ2UgdW5jaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJImZ1bGwvb2JqMTYvVW5jaGVjay5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSBkaXNhYmxlQ2hlY2tJbWFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJImZ1bGwvb2JqMTYvRGlzYWJsZUNoZWNrLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBJbWFnZSBkaXNhYmxlVW5jaGVja0ltYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkiZnVsbC9vYmoxNi9EaXNhYmxlVW5jaGVjay5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB0cmVlCi0JICovCi0JcHVibGljIFByb2Nlc3NDaGVja0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHRyZWUpIHsKLQkJc3VwZXIodHJlZSk7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yI2dldEltYWdlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJZmluYWwgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IGdldENlbGxNb2RpZmllcigpOwotCQlPYmplY3QgZWxlbWVudCA9IGl0ZW0uZ2V0RGF0YSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0vLwkJaWYgKGNvbHVtbnByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORwotLy8JCQkJfHwgY29sdW1ucHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFCi0vLwkJCQl8fCBjb2x1bW5wcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotLy8JCQlpZiAoIShUbmdVdGlsLnVud3JhcChlbGVtZW50KSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSkgewotLy8JCQkJcmV0dXJuIG51bGw7Ci0vLwkJCX0KLS8vCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IG1vZGlmaWVyLmdldFZhbHVlKGVsZW1lbnQsIGNvbHVtbnByb3BlcnR5KTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKQotCQkJcmV0dXJuIG51bGw7Ci0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gbW9kaWZpZXIuY2FuTW9kaWZ5KGVsZW1lbnQsIGNvbHVtbnByb3BlcnR5KTsKLQotCQlpZiAoKChCb29sZWFuKSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXJldHVybiBjYW5Nb2RpZnkgPyBjaGVja0ltYWdlIDogZGlzYWJsZUNoZWNrSW1hZ2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gY2FuTW9kaWZ5ID8gdW5jaGVja0ltYWdlIDogZGlzYWJsZVVuY2hlY2tJbWFnZTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjbW9kaWZ5KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeShUcmVlSXRlbSBpdGVtLCBTdHJpbmcgY29sdW1ucHJvcGVydHkpIHsKLQkJZmluYWwgSUNlbGxNb2RpZmllciBtb2RpZmllciA9IGdldENlbGxNb2RpZmllcigpOwotCQlpZiAoIW1vZGlmaWVyLmNhbk1vZGlmeShpdGVtLmdldERhdGEoKSwgY29sdW1ucHJvcGVydHkpKQotCQkJcmV0dXJuOwotCQltb2RpZmllci5tb2RpZnkoaXRlbSwgY29sdW1ucHJvcGVydHksIG5ldyBCb29sZWFuKCEoKEJvb2xlYW4pIG1vZGlmaWVyCi0JCQkJLmdldFZhbHVlKGl0ZW0uZ2V0RGF0YSgpLCBjb2x1bW5wcm9wZXJ0eSkpLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiA9PT09PT09aW4gZmFjdCBiZWxvdyBjb2RlcyBhcmUgZm9yIHRoZSBkeW5hbWljIGNlbGwgZWRpdG9yIChyZWFsIGNvbnRyb2wKLQkgKiAiYnV0dG9uIik9PT09PQotCSAqLwotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woVHJlZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24ucGFjaygpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3IjaG9va0NvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCwgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW0sIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sLCBUcmVlSXRlbSBpdGVtLAotCQkJZmluYWwgU3RyaW5nIGNvbHVtbnByb3BlcnR5KSB7Ci0JCWZpbmFsIElDZWxsTW9kaWZpZXIgbW9kaWZpZXIgPSBnZXRDZWxsTW9kaWZpZXIoKTsKLQkJZmluYWwgT2JqZWN0IGVsZW1lbnQgPSBpdGVtOwotCQlmaW5hbCBCdXR0b24gY2hlY2tib3ggPSAoQnV0dG9uKSBjb250cm9sOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCWNoZWNrYm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltb2RpZmllci5tb2RpZnkoZWxlbWVudCwgY29sdW1ucHJvcGVydHksIG5ldyBCb29sZWFuKGNoZWNrYm94Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpKTsKLQkJCX0KLQkJfTsKLQkJY2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvQ2hlYXRzaGVldFN3aXRjaEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjE5OGY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DaGVhdHNoZWV0U3dpdGNoSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLk9wZW5DaGVhdFNoZWV0QWN0aW9uOwotCi0vKioKLSAqIFN3aXRjaHMgY2hlYXQgc2hlZXQgYW5kIG9wZW5zIGl0LgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVhdHNoZWV0U3dpdGNoSm9iIGV4dGVuZHMgSm9iIHsKLQlwcml2YXRlIFN0cmluZyBjaGVhdHNoZWV0SWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugd2l0aCBjaGVhdCBzaGVldCBuYW1lIGFuZCBJZAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGNoZWF0c2hlZXRJZAotCSAqLwotCXB1YmxpYyBDaGVhdHNoZWV0U3dpdGNoSm9iKFN0cmluZyBuYW1lLCBTdHJpbmcgY2hlYXRzaGVldElkKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0aGlzLmNoZWF0c2hlZXRJZCA9IGNoZWF0c2hlZXRJZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW5ldyBPcGVuQ2hlYXRTaGVldEFjdGlvbihjaGVhdHNoZWV0SWQpLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NyZWF0ZVBsdWdpbkFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL0NyZWF0ZVBsdWdpbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc4NzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvY2hlYXRzaGVldHMvYWN0aW9ucy9DcmVhdGVQbHVnaW5BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5OZXdQbHVnaW5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLklDaGVhdFNoZWV0TWFuYWdlcjsKLQotLyoqCi0gKiBDcmVhdGUgTWV0aG9kIFBsdWctaW4gY2hlYXQgc2hlZXQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZVBsdWdpbkFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElDaGVhdFNoZWV0QWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgSUNoZWF0U2hlZXRBY3Rpb24jcnVuKFN0cmluZ1tdLCBJQ2hlYXRTaGVldE1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIHBhcmFtcywgSUNoZWF0U2hlZXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJTmV3UGx1Z2luQWN0aW9uLmV4ZWN1dGUoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvU3dpdGNoQ2hlYXRzaGVldFRvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvU3dpdGNoQ2hlYXRzaGVldFRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MTM1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL1N3aXRjaENoZWF0c2hlZXRUby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldE1hbmFnZXI7Ci0KLS8qKgotICogQ3JlYXRlIHN3aXRjaCBjaGVhdCBzaGVldCBhY3Rpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3dpdGNoQ2hlYXRzaGVldFRvIGV4dGVuZHMgQWN0aW9uIGltcGxlbWVudHMgSUNoZWF0U2hlZXRBY3Rpb24gewotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldEFjdGlvbiNydW4oamF2YS5sYW5nLlN0cmluZ1tdLCBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5JQ2hlYXRTaGVldE1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIHBhcmFtcywgSUNoZWF0U2hlZXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQotCQlpZiAocGFyYW1zLmxlbmd0aCA8PSAwKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBjc19pZCA9IHBhcmFtc1swXTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogaW4gU3dpdGNoQ2hlYXRzaGVldFRvLnJ1biguLi4pIGNzX0lEID0KLQkJLy8gIiArIGNzX2lkKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNoZWF0c2hlZXRTd2l0Y2hKb2Igc3dpdGNoSm9iID0gbmV3IENoZWF0c2hlZXRTd2l0Y2hKb2IoCi0JCQkJIlN3aXRjaCBDaGVhdHNoZWV0IiwgY3NfaWQpOyAvLyROT04tTkxTLTEkCi0JCXN3aXRjaEpvYi5zY2hlZHVsZSg1MCk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9jaGVhdHNoZWV0cy9hY3Rpb25zL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlOWFmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2NoZWF0c2hlZXRzL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgYWN0aW9ucyBmb3IgdGhlIEF1dGhvcmluZyBjaGVhdHNoZWV0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0FEREluZm9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwMjE3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQURESW5mb0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5BdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBGaWx0ZXIgRGlhbG9nIC0gYWxsb3cgdGhlIHVzZXIgdG8gZmlsdGVyIHRoZSBjb250ZW50IGVsZW1lbnQsIGNvbnRlbnQKLSAqIGNhdGVnb3JpZXMsIGN1c3RvbSBjYXRlZ29yaWVzLCBBbGwgdHlwZXMgb2YgY29udGVudGVsZW1lbnRzIGJhc2VkIG9uIGxvY2F0aW9uIG9mIHRoZSB1c2Ugb2YgdGhlIGZpbHRlcgotICogZGlhbG9nLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEFEREluZm9EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJRG91YmxlQ2xpY2tMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uLCBjYW5jZWxCdXR0b247Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQkvL3ByaXZhdGUgU3RyaW5nIHBhdHRlcm4sIGZpbHRlclR5cGVTdHI7Ci0KLQkvL3Byb3RlY3RlZCBDb21ibyBmaWx0ZXJUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGUsIHRhYlN0cjsKLQotCXByaXZhdGUgT2JqZWN0IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIHZpZXdlclNlbGVjdGlvblNpbmdsZSA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHZpZXdlckxhYmVsID0gbnVsbDsKLQkKLQkvKgotCSAqIFRyZWV2aWV3ZXIgZm9yIENvbnRlbnRFbGVtZW50cyB0byBkaXNwbGF5LgotCSAqLwotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJLy8gcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsICIiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci0KLQkvKgotCSAqIERpYWxvZyBBdHRyaWJ1dGVzCi0JICovCi0JLy8gcHJpdmF0ZSBib29sZWFuIGFueUNoaWxkcyA9IHRydWU7Ci0JcHJpdmF0ZSBMaXN0IGFscmVhZHlTZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JUGF0dGVybiByZWdleFBhdHRlcm47Ci0KLQkvLyBwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQlwcm90ZWN0ZWQgRmlsdGVySGVscGVyIGhlbHBlcjsKLQotCXByaXZhdGUgQnV0dG9uIGV4cGFuZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbGxhcHNlQnV0dG9uOwotCi0JcHJpdmF0ZSBPYmplY3QgaW5wdXQ7Ci0KLQkvL3ByaXZhdGUgU3RyaW5nW10gdHlwZXM7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBmaWx0ZXIgYmFzZWQgb24KLQkgKiB0YWJTdHIsIGZpbHRlcnMgb3V0IHRoZSBsaXN0IG9mIGVsZW1lbnRzIGJhc2VkIG9uIGFscmVhZHkgZXhpc3RpbmcKLQkgKiBzZWxlY3RlZCBlbGVtZW50IGluIHRoZSBzZWxlY3RlZCB0YWJsZS4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlcgotCSAqIGZvciB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgQURESW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGNvbnRlbnRFbGVtZW50LAotCQkJU3RyaW5nIHRhYlN0ciwgTGlzdCBhbHJlYWR5RXhpc3RzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5maWx0ZXIgPSBudWxsOwotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBhbHJlYWR5RXhpc3RzOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsCi0JCQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0KTsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwgU3RyaW5nIHRhYlN0ciwKLQkJCUxpc3QgYWxyZWFkeUV4aXN0cywgT2JqZWN0IGlucHV0KSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIGZpbHRlciwgbnVsbCwgdGFiU3RyLCBhbHJlYWR5RXhpc3RzKTsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuCi0JICogdGFiU3RyIGlzIHVzZWQgZm9yIHRoZSBzZWFyY2h0eXBlIG9ubHkuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElGaWx0ZXIgZmlsdGVyLAotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCi0JCWhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBBRERJbmZvRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0ciwgTGlzdCBhbHJlYWR5RXhpc3RzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBhbHJlYWR5RXhpc3RzOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsCi0JCQkJYWxyZWFkeUV4aXN0cyk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBPbmx5IGZvciBtZXRob2Rjb25maWd1cmF0aW9uLiBUaGlzCi0JICogY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlciBmb3IKLQkgKiB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQkvLyBwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb24sIFN0cmluZyB0YWJTdHIpIHsKLQkvLyBzdXBlcihwYXJlbnRTaGVsbCk7Ci0JLy8gdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCS8vIHRoaXMudGFiU3RyID0gdGFiU3RyOwotCS8vIHRoaXMuZmlsdGVyID0gbnVsbDsKLQkvLyB0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWd1cmF0aW9uOwotCS8vIGhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JLy8gaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCS8vIH0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHZlcnkgZ2VuZXJpYywgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBmaWx0ZXIsIGlucHV0Ci0JICogYW5kIGNvbnRlbnRwcm92aWRlciBzaG91bGQgYmUgaGFuZGxlZCBleHBsaWNpdGx5IGJ5IGNhbGxpbmcgYmVsb3cgbWV0aG9kLgotCSAqIHNldEZpbHRlcihJRmlsdGVyKSBzZXRJbnB1dChPYmplY3QpCi0JICogc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkUHJvdmlkZXIpCi0JICogCi0JICovCi0JcHVibGljIEFEREluZm9EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotCQkJc2F2ZVZhbHVlcygpOwotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JCWNsb3NlKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlVmFsdWVzKCl7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlcgotCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJT2JqZWN0W10gb2JqZWN0QXJyID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3RBcnJbaV0pOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlzZWxlY3RlZExpc3QuYWRkKG9iaik7Ci0JCQkJfSAKLQkJCX0KLQkJfQotCX0KLQkJCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgY2FuY2VsIGJ1dHRvbiBvZiB0aGlzIGRpYWxvZyBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRpdGxlIGZvciBkaWFsb2cgYm94IGVnOiBTZWxlY3QgRGlhbG9nIEZvciBSb2xlLCBkaWFsb2dUaXRsZSBuZWVkcyB0bwotCSAqICJSb2xlIgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyBkaWFsb2dUaXRsZSkgewotCQl0aGlzLmRpYWxvZ1RpdGxlID0gZGlhbG9nVGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJaWYgKGRpYWxvZ1RpdGxlID09IG51bGwpCi0JCQlkaWFsb2dUaXRsZSA9IHRhYlN0cjsKLQkJc2hlbGwuc2V0VGV4dCgiQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gSW5mbzogIiArIGRpYWxvZ1RpdGxlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykgQWRkcyBidXR0b25zIHRvIHRoaXMgZGlhbG9nJ3MgYnV0dG9uIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgYnV0dG9uIGJhciBjb21wb3NpdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFsb2cgYXJlYSBhbmQgY29udHJvbHMgYW5kIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdGhlCi0JICogICAgICAgICAgICBwYXJlbnQgY29tcG9zaXRlIHRvIGNvbnRhaW4gdGhlIGRpYWxvZyBhcmVhCi0JICogQHJldHVybiB0aGUgZGlhbG9nIGFyZWEgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJLy9HcmlkRGF0YSBnRCA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCUxhYmVsIHR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJewotCQkJdHlwZUxhYmVsLnNldFRleHQoIlNlbGVjdCB0aGUgYWN0aXZpdHkgdG8gbW9kaWZ5IEFERCIpOyAvLyROT04tTkxTLTEkCi0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXR5cGVMYWJlbC5zZXRMYXlvdXREYXRhKGdEMSk7Ci0KLQkJfQotLy8JCWZpbHRlclR5cGUgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0vLwkJewotLy8JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLS8vCQkJZ0QxLmhvcml6b250YWxTcGFuID0gMjsKLS8vCQkJZ0QxLndpZHRoSGludCA9IDM5MDsKLS8vCQkJZmlsdGVyVHlwZS5zZXRMYXlvdXREYXRhKGdEMSk7Ci0vLwkJfQotLy8KLS8vCQlpZiAodHlwZXMgPT0gbnVsbCkgewotLy8JCQlmaWxsRmlsdGVyVHlwZUNvbWJvKCk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyh0eXBlcyk7Ci0vLwkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotLy8JCQkJZmlsdGVyVHlwZVN0ciA9IGZpbHRlclR5cGUuZ2V0SXRlbSgwKTsKLS8vCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGUuZ2V0SXRlbSgwKSk7Ci0vLwkJCQlpZiAodGFiU3RyID09IG51bGwpIHsKLS8vCQkJCQl0YWJTdHIgPSBmaWx0ZXJUeXBlU3RyOwotLy8JCQkJCWhlbHBlci5zZXRUYWJTdHIodGFiU3RyKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlmaWx0ZXJUeXBlLnNlbGVjdCgwKTsKLQotLy8JCUxhYmVsIGN0cmxfcGF0dGVybkxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotLy8JCXsKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0KTsgLy8kTk9OLU5MUy0xJAotLy8JCQlnRC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0vLwkJCWN0cmxfcGF0dGVybkxhYmVsLnNldExheW91dERhdGEoZ0QpOwotLy8JCX0KLQotLy8JCWN0cmxfcGF0dGVybiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0vLwkJewotLy8JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLS8vCQkJZ0QxLmhvcml6b250YWxTcGFuID0gMzsKLS8vCQkJY3RybF9wYXR0ZXJuLnNldExheW91dERhdGEoZ0QxKTsKLS8vCQkJY3RybF9wYXR0ZXJuLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIoCi0vLwkJCQkJbmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19QYXR0ZXJuX3RleHQgKyAgCi0vLwkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbikpOwotLy8JCX0KLS8vCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbDEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0vLwkJewotLy8JCQljdHJsX3BhdHRlcm5MYWJlbDEuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJY3RybF9wYXR0ZXJuTGFiZWwxLnNldExheW91dERhdGEoZ0QpOwotLy8JCX0KLQkJCi0JCUNvbXBvc2l0ZSBidXR0b25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsJCQotCQkKLQkJR3JpZERhdGEgZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZDIpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbnNMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlidXR0b25zTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlidXR0b25zTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uc0xheW91dCk7Ci0JCQotCQlleHBhbmRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5CVVRUT04xKTsKLQotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgCi0JCQotCQlleHBhbmRCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0V4cGFuZEFsbCkpOwkJCi0KLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0KLQkJY29sbGFwc2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJY29sbGFwc2VCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjb2xsYXBzZWFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGwpOyAKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQkKLQkJZ2QyID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQotCQljb2xsYXBzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0JCWNyZWF0ZVZpZXdlckxhYmVsKGNvbXBvc2l0ZSk7Ci0JCS8vIGNyZWF0ZSBhIHRyZWV2aWV3ZXIgYXJlYS4KLQkJY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQnJpZWZEZXNjcmlwdGlvbik7IAotCQljdHJsX2JyaWVmX2Rlc2MgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlnZC5oZWlnaHRIaW50ID0gNjA7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJLy8gUmVzdG9yZSB0aGUgbGFzdCBzdGF0ZQotCQljcmVhdGVMaW5lKGNvbXBvc2l0ZSwgMyk7Ci0KLQkJLy8gUmV0dXJuIHJlc3VsdHMuCi0JCWFkZExpc3RlbmVyKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNyZWF0ZURpYWxvZ0FyZWEuZmlsdGVyVHlwZVN0ciA9ICIgKwotCQkvLyBmaWx0ZXJUeXBlU3RyKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgdmlld2VyIGluIHRoZSBwYXJlbnQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAodmlld2VyU2VsZWN0aW9uU2luZ2xlKSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfQotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBQaG9uZzogdGhpcyBpcyB0b28gbWVzc3kuIElmIHlvdSByZWxpZXMgb24gdGhlIGNvbnRlbnRFbGVtZW50IHRvCi0JCQkvLyBkZXRlcm1pbmUgdGhlIGlucHV0IGZvciB0aGUgdmlld2VyCi0JCQkvLyB0aGVuIHlvdSBzaG91bGQgZGVjbGFyZSBhIGlucHV0IGZpZWxkIGluc3RlYWQgYW5kIG1vdmUgdGhpcyBjb2RlCi0JCQkvLyB0byBjb25zdHJ1Y3RvcgotCQkJLy8KLQkJCS8vIHNvcnRlciBuZWVkcyBvciBub3QuIFRPRE8KLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJaWYgKCgoUHJvY2VzcykgY29udGVudEVsZW1lbnQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlpZiAodGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpCi0JCQkJCQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKSAKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKSkgewotCQkJCQkJCQl0cmVlVmlld2VyCi0JCQkJCQkJCQkJLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXRyZWVWaWV3ZXIuc2V0SW5wdXQoKChQcm9jZXNzKSBjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCQkuZUNvbnRhaW5lcigpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQl0cmVlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJfSBlbHNlCi0JCQkJCQl0cmVlVmlld2VyLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHJlZVZpZXdlci5zZXRJbnB1dChVbWFVdGlsCi0JCQkJCQkJLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0cmVlVmlld2VyCi0JCQkJCQkuc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCX0KLQkJfQotCi0JCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJaWYgKHRhYlN0ci5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpKSB7IAotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlckZvckFsbCgpKTsKLQkJfSBlbHNlIHsKLQkJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGaWx0ZXJTb3J0ZXIoKSk7Ci0JCX0KLQotCQkvLyB0cmVlVmlld2VyLmV4cGFuZFRvTGV2ZWwoMyk7Ci0JCS8vIHRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDMwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXNwZWMuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShzcGVjKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWaWV3ZXJMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAJCWlmICh2aWV3ZXJMYWJlbCAhPSBudWxsKSB7Ci0gICAJCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodmlld2VyTGFiZWwpOwotICAgCQl9Ci0gICAJfQotCQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNlbGVjdGlvblNpbmdsZShib29sZWFuIHNpbmdsZSkgewotCQl2aWV3ZXJTZWxlY3Rpb25TaW5nbGUgPSBzaW5nbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyI2RvdWJsZUNsaWNrKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHMgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlPYmplY3QgZWxlbWVudCA9IHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIGlmKCEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkvLyBpZighKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JCQlzZWxlY3RlZExpc3QuYWRkKGVsZW1lbnQpOwotCQl9Ci0JCWNsb3NlKCk7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRyYXZlcnNlVHJlZShUcmVlSXRlbVtdIGl0ZW1zLCBMaXN0IGxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW1bXSBpdGVtc3ggPSBpdGVtc1tpXS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zeC5sZW5ndGggPiAxKSB7Ci0JCQkJbGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQl0cmF2ZXJzZVRyZWUoaXRlbXN4LCBsaXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCi0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBldmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdXBkYXRlU2VsZWN0aW9uKGV2ZW50KTsKLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgYnV0dG9uIGVuYWJsZW1lbnQgc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJLy8gb2tCdXR0b24uc2V0RW5hYmxlZChnZXRTZWxlY3Rpb24oKS5sZW5ndGggPiAwKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudE9iamVjdChPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyBBcnJheUxpc3QgZGVzY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZCA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgfHwKLQkJCQlzZWxlY3RlZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpewotCQkJT2JqZWN0IHVud3JhcCA9ICBUbmdVdGlsLnVud3JhcChzZWxlY3RlZCk7Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKHVud3JhcCk7Ci0JCX1lbHNlIHsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oc2VsZWN0ZWQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFNldCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gdG8gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRCcmllZkRlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCX0KLQkJfQotCX0KLQotCQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoKSB7Ci0KLQkJZXhwYW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0KLQkJCX0KLQkJfSk7Ci0JCWNvbGxhcHNlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyZWVWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQotCQkJfQotCQl9KTsKLQotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0U2VsZWN0ZWRJdGVtcygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkTGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVyRm9yVGFicygpIHsKLQotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHsKLQkJCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ2F0ZWdvcnlGaWx0ZXIpewotCQkJCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBjb250ZW50Y2F0ZWdvcnkuCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTc0NTIKLQkJCQkJaGVscGVyLnNldENvbnRlbnRDYXRlZ29yeVRhYlN0cih0YWJTdHIpOwotCQkJCX0KLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgZmlsdGVyKQotCQkJCQkJLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgewotCQkJCSgoRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIGZpbHRlcikuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9ZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKSB7Ci0JCQkJKChFeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IpIGZpbHRlcikuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElQcm9jZXNzRmlsdGVyKSB7Ci0JCQlpZiAodGFiU3RyCi0JCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlMpKSB7Ci0JCQkJYWRhcHRlckZhY3RvcnkgPVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOwotCQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0gZWxzZSBpZiAodGFiU3RyCi0JCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTKSkgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcik7IAotCQkJCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4aXN0aW5nRWxlbWVudHMoTGlzdCBsaXN0KSB7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGxpc3Q7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaGVscGVyLnNldEFscmVhZHlTZWxlY3RlZExpc3QobGlzdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRmlsdGVySGVscGVyIGdldEhlbHBlcigpIHsKLQkJcmV0dXJuIHRoaXMuaGVscGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlQXJyYXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogc2V0cyB0aGUgQ29udGVudFByb3ZpZGVyIHVzZWQgYnkgVHJlZVZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotCQl0aGlzLmNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBjb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogc2V0IHRoZSBGaWx0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbHRlciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB0aGlzLmZpbHRlcikKLQkJCQkJCS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlcikgewotCQkJCSgoRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHRoaXMuZmlsdGVyKS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucHV0KE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyTGFiZWwoU3RyaW5nIHZpZXdlckxhYmVsKSB7Ci0JCXRoaXMudmlld2VyTGFiZWwgPSB2aWV3ZXJMYWJlbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0Fzc2lnbkRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0Fzc2lnbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGMyMmI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Bc3NpZ25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3U2ltcGxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5VbmFzc2lnbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlVuaXF1ZU5hbWVQTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIERpYWxvZyBmb3IgYXNzaWdpbmcgTWV0aG9kRWxlbWVudCB3aXRoaW4gTWV0aG9kTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCUFycmF5TGlzdCB1c2VkQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBPYmplY3QgZGVzdGluYXRpb247Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFzc2lnbmluZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBQcm9ncmVzc01vbml0b3JQYXJ0IHByb2dyZXNzTW9uaXRvclBhcnQ7Ci0KLQlwcml2YXRlIEN1cnNvciB3YWl0Q3Vyc29yOwotCQotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWRVSSA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBBc3NpZ25EaWFsb2cgbmV3QXNzaWduRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgQXNzaWduRGlhbG9nKHBhcmVudFNoZWxsLCBlbGVtZW50cyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQXNzaWduRGlhbG9nIG5ld1JlYXNzaWduRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLAotCQkJQ29sbGVjdGlvbiBlbGVtZW50cywgTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgUmVhc3NpZ25EaWFsb2cocGFyZW50U2hlbGwsIGVsZW1lbnRzLCBwYXJlbnRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBc3NpZ25EaWFsb2cgbmV3RGVlcENvcHlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBDdXN0b21DYXRlZ29yeURlZXBDb3B5RGlhbG9nKHBhcmVudFNoZWxsLCBlbGVtZW50cyk7Ci0JfQotCQotCXByb3RlY3RlZCBBc3NpZ25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIENvbGxlY3Rpb24gZWxlbWVudHNUb0Fzc2lnbikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLQkJLy8gZmlsdGVyIG91dCB0aGUgcHJlZGVmaW5lZCBlbGVtZW50cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBnZXR0aW5nIG1vdmVkCi0JCS8vCi0JCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvQXNzaWduLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQpOyAKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkvLyB0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDMwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoc3BlYyk7Ci0JCX0KLQotCQl0cmVlVmlld2VyLnNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0KLQkJR3JpZExheW91dCBwbWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXBtbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0ID0gY3JlYXRlUHJvZ3Jlc3NNb25pdG9yUGFydChjb21wb3NpdGUsIHBtbGF5b3V0KTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydAotCQkJCS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQl3YWl0Q3Vyc29yID0gcGFyZW50LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUN1cnNvcigKLQkJCQlTV1QuQ1VSU09SX1dBSVQpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkFzc2lnbkRpYWxvZ19hc3NpZ25fdGV4dCk7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJZGVzdGluYXRpb24gPSBUbmdVdGlsLnVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWlmIChkb0Fzc2lnbigpKSB7Ci0JCQlzdXBlci5va1ByZXNzZWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkRGVzdGluYXRpb24oKSB7Ci0JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkb0Fzc2lnbigpIHsKLQkJLy9UbyBkbzogCi0JCS8vKDEpIEltcGxlbWVudCBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNrIGZvciBpc1ZhbGlkRGVzdGluYXRpb24gKG5pY2UgdG8gaGF2ZSB0aGUgY2hlY2sKLQkJLy8gICAgYXQgdGhpcyBwb2ludCwgYWx0aG91Z2ggdGhlIGNpcmN1bGF0IGNoZWNrIHdvdWxkIGJlIGRvbmUgZHVyaW5nICJydW4iIGFjdGlvbiB0b28gCi0JCS8vKDIpIENoYW5nZSAibW92ZSIgdG8gImFzc2lnbiIgc3RyaW5ncwotCQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0OyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtc2cpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWlzVmFsaWREZXN0aW5hdGlvbigpKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgcHJvYmxlbSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOyAKLQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJKEVPYmplY3QpIGRlc3RpbmF0aW9uLCBnZXRTaGVsbCgpKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbjsgCi0JCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJYXNzaWduaW5nID0gdHJ1ZTsJCQotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXNzaWduQWN0aW9uX3RleHQpOwotCQkJCXRyeSB7Ci0JCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gZG9Xb3JrQmVmb3JlU2F2ZSgpOwotCQkJCQlMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbi5zYXZlKHJlc291cmVzVG9TYXZlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlhc3NpZ25pbmcgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJc2hlbGwuc2V0Q3Vyc29yKHdhaXRDdXJzb3IpOwotCi0JCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5zZXRWaXNpYmxlKHRydWUpOwotCQlJU3RhdHVzIHN0YXQgPSBudWxsOwotCQl0cnkgewotCQkJc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBwcm9ncmVzc01vbml0b3JQYXJ0LCBzaGVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJcHJvZ3Jlc3NNb25pdG9yUGFydC5kb25lKCk7Ci0JCX0KLQkJaWYoc3RhdCAhPSBudWxsICYmICFzdGF0LmlzT0soKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGRvV29ya0JlZm9yZVNhdmUoKSB7Ci0JCWZpbmFsIExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIgaGVscGVyID0gbmV3IExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXIoKTsKLQkJZmluYWwgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGRlc3RpbmF0aW9uOwotCQlmaW5hbCBDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCi0JCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UuYWRkSXRlbXNUb01vZGVsMShlbGVtZW50cywgY2F0ZWdvcnksCi0JCQkJCQl1c2VkQ2F0ZWdvcmllcywgaGVscGVyLmdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCUN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5nZXRBbmNlc3RvcnMoY2F0ZWdvcnkpKTsKLQkJCQlyZXNvdXJlc1RvU2F2ZS5hZGQoY2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCXJldHVybiByZXNvdXJlc1RvU2F2ZTsKLQl9Ci0JCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoYXNzaWduaW5nKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgUHJvZ3Jlc3NNb25pdG9yUGFydCBjcmVhdGVQcm9ncmVzc01vbml0b3JQYXJ0KAotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZExheW91dCBwbWxheW91dCkgewotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvclBhcnQoY29tcG9zaXRlLCBwbWxheW91dCwgU1dULkRFRkFVTFQpIHsKLQkJCVN0cmluZyBjdXJyZW50VGFzayA9IG51bGw7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc2V0QmxvY2tlZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc2V0QmxvY2tlZChJU3RhdHVzIHJlYXNvbikgewotCQkJCXN1cGVyLnNldEJsb2NrZWQocmVhc29uKTsKLQkJCQlpZiAoIWxvY2tlZFVJKS8vIERvIG5vdCBzaG93IGJsb2NrZWQgaWYgd2UgYXJlIGxvY2tpbmcgdGhlIFVJCi0JCQkJCWdldEJsb2NrZWRIYW5kbGVyKCkuc2hvd0Jsb2NrZWQoZ2V0U2hlbGwoKSwgdGhpcywgcmVhc29uLAotCQkJCQkJCWN1cnJlbnRUYXNrKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNjbGVhckJsb2NrZWQoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBjbGVhckJsb2NrZWQoKSB7Ci0JCQkJc3VwZXIuY2xlYXJCbG9ja2VkKCk7Ci0JCQkJaWYgKCFsb2NrZWRVSSkvLyBEbyBub3QgdmxlYXIgaWYgd2UgbmV2ZXIgc2V0IGl0Ci0JCQkJCWdldEJsb2NrZWRIYW5kbGVyKCkuY2xlYXJCbG9ja2VkKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjYmVnaW5UYXNrKGphdmEubGFuZy5TdHJpbmcsCi0JCQkgKiAgICAgIGludCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0JCQkJc3VwZXIuYmVnaW5UYXNrKG5hbWUsIHRvdGFsV29yayk7Ci0JCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3NldFRhc2tOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQkJc3VwZXIuc2V0VGFza05hbWUobmFtZSk7Ci0JCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3N1YlRhc2soamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQkJCXN1cGVyLnN1YlRhc2sobmFtZSk7Ci0JCQkJLy8gSWYgd2UgaGF2ZW4ndCBnb3QgYW55dGhpbmcgeWV0IHVzZSB0aGlzIHZhbHVlIGZvciBtb3JlCi0JCQkJLy8gY29udGV4dAotCQkJCWlmIChjdXJyZW50VGFzayA9PSBudWxsKQotCQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBBcnJheUxpc3QgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBnZXREZXN0aW5hdGlvbigpIHsKLQkJcmV0dXJuIGRlc3RpbmF0aW9uOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlYXNzaWduRGlhbG9nIGV4dGVuZHMgQXNzaWduRGlhbG9nIHsKLQkJCi0JCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50RWxlbWVudDsKLQkJCi0JCXByb3RlY3RlZCBSZWFzc2lnbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgCi0JCQkJQ29sbGVjdGlvbiBlbGVtZW50cywgTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtZW50KSB7Ci0JCQlzdXBlcihwYXJlbnRTaGVsbCwgZWxlbWVudHMpOwotCQkJdGhpcy5wYXJlbnRFbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBwYXJlbnRFbGVtZW50OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZG9Xb3JrQmVmb3JlU2F2ZSgpIHsKLQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmVzVG9TYXZlID0gc3VwZXIuZG9Xb3JrQmVmb3JlU2F2ZSgpOwotCQkJcmVzb3VyZXNUb1NhdmUuYWRkKHBhcmVudEVsZW1lbnQuZVJlc291cmNlKCkpOwkJCQotCQkJVW5hc3NpZ25BY3Rpb24udW5hc3NpZ24oZ2V0U2hlbGwoKSwgZ2V0RWxlbWVudHMoKS5nZXQoMCksIHBhcmVudEVsZW1lbnQsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCQlyZXR1cm4gcmVzb3VyZXNUb1NhdmU7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCQluZXdTaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkFzc2lnbkRpYWxvZ19yZWFzc2lnbl90ZXh0KTsgCi0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5RGVlcENvcHlEaWFsb2cgZXh0ZW5kcyBBc3NpZ25EaWFsb2cgewotCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZzsKLQkJcHJpdmF0ZSBVbmlxdWVOYW1lUE5hbWVIYW5kbGVyIG5hbWVIYW5kbGVyOwotCQkKLQkJcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5RGVlcENvcHlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIAotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsLCBlbGVtZW50cyk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBkb1dvcmtCZWZvcmVTYXZlKCkgewotCQkJaWYgKGdldEVsZW1lbnRzKCkgPT0gbnVsbAotCQkJCQl8fCAhKGdldEVsZW1lbnRzKCkuZ2V0KDApIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJCXx8ICEoZ2V0RGVzdGluYXRpb24oKSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCQkKLQkJCUN1c3RvbUNhdGVnb3J5IHNvdXJjZSA9IChDdXN0b21DYXRlZ29yeSkgZ2V0RWxlbWVudHMoKS5nZXQoMCk7Ci0JCQlDdXN0b21DYXRlZ29yeSB0YXJnZXRQYXJlbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGdldERlc3RpbmF0aW9uKCk7Ci0JCQkKLQkJCWluaXREZWVwQ29weSh0YXJnZXRQYXJlbnQpOyAKLQkJCUN1c3RvbUNhdGVnb3J5IGNvcHkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGRlZXBDb3B5KHNvdXJjZSk7CQkJCi0JCQkKLQkJCS8vSVRleHRSZWZlcmVuY2VSZXBsYWNlciB0eHRSZWZSZXBsYWNlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCk7Ci0JCQljdXN0b21DYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY29weSk7Ci0JCQl0YXJnZXRQYXJlbnQuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZChjb3B5KTsKLQkJCQotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyZXNUb1NhdmUgPSBuZXcgQXJyYXlMaXN0KCk7CQkJCQotCQkJcmVzb3VyZXNUb1NhdmUuYWRkKHRhcmdldFBhcmVudC5lUmVzb3VyY2UoKSk7Ci0JCQkKLQkJCXJldHVybiByZXNvdXJlc1RvU2F2ZTsKLQkJfQkJCi0JCQotCQlwcml2YXRlIEVPYmplY3QgZGVlcENvcHkoRU9iamVjdCBzb3VyY2UpIHsJCQkKLQkJCUVPYmplY3QgY29weSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShzb3VyY2UuZUNsYXNzKCkpOwotCQkJaGFuZGxlTmFtZXMoc291cmNlLCBjb3B5KTsKLQkJCi0JCQlMaXN0IGZlYXR1cmVzID0gc291cmNlLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsJCQkJCi0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkpOwotCQkJCWNvcHlGZWF0dXJlVmFsdWUoc291cmNlLCBjb3B5LCBmZWF0dXJlKTsKLQkJCX0KLQkJCXJldHVybiBjb3B5OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZU5hbWVzKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGNvcHkpIHsKLQkJCWlmIChjb3B5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlPYmplY3QgbmFtZSA9IHNvdXJjZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCU9iamVjdCBwbmFtZSA9IHNvdXJjZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkKLQkJCQljb3B5LmVTZXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgbmFtZSk7Ci0JCQkJY29weS5lU2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBwbmFtZSk7Ci0KLQkJCQluYW1lSGFuZGxlci5lbnN1cmVVbmlxdWUoKEN1c3RvbUNhdGVnb3J5KSBjb3B5KTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNvcHlGZWF0dXJlVmFsdWUoRU9iamVjdCBzb3VyY2VPYmosIEVPYmplY3QgY29waWVkT2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQkJCQotCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJY29weUF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShzb3VyY2VPYmosIGNvcGllZE9iaiwgKEVBdHRyaWJ1dGUpIGZlYXR1cmUpOwkJCQkKLQkJCX0gZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQljb3B5UmVmZXJlbmNlRmVhdHVyZVZhbHVlKHNvdXJjZU9iaiwgY29waWVkT2JqLCAoRVJlZmVyZW5jZSkgZmVhdHVyZSk7Ci0JCQl9Ci0JCQkKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNvcHlBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoRU9iamVjdCBzb3VyY2VPYmosCi0JCQkJRU9iamVjdCBjb3BpZWRPYmosIEVBdHRyaWJ1dGUgZmVhdHVyZSkgewotCQkJT2JqZWN0IHNvdXJjZVZhbHVlID0gc291cmNlT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoc291cmNlVmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCU9iamVjdCBjb3BpZWRWYWx1ZSA9IHNvdXJjZVZhbHVlOwotCi0JCQlpZiAoc291cmNlT2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKSkgewotCQkJCQljb3BpZWRWYWx1ZSA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJLy9NaWdyYXRpb25VdGlsIGE7Ci0JCQl9Ci0KLQkJCWNvcGllZE9iai5lU2V0KGZlYXR1cmUsIGNvcGllZFZhbHVlKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjb3B5UmVmZXJlbmNlRmVhdHVyZVZhbHVlKEVPYmplY3Qgc291cmNlT2JqLCBFT2JqZWN0IGNvcGllZE9iaiwgRVJlZmVyZW5jZSBmZWF0dXJlKSB7Ci0JCQlPYmplY3Qgc291cmNlVmFsdWUgPSBzb3VyY2VPYmouZUdldChmZWF0dXJlKTsKLQkJCWlmIChzb3VyY2VWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJT2JqZWN0IGNvcGllZFZhbHVlID0gc291cmNlVmFsdWU7Ci0KLQkJCWlmIChmZWF0dXJlLmlzQ29udGFpbm1lbnQoKSkgewotCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3Q8RU9iamVjdD4gc291cmNlTGlzdCA9IChMaXN0PEVPYmplY3Q+KSBzb3VyY2VWYWx1ZTsKLQkJCQkJTGlzdDxFT2JqZWN0PiBjb3BpZWRMaXN0ID0gKExpc3Q8RU9iamVjdD4pIGNvcGllZE9iagotCQkJCQkJCS5lR2V0KGZlYXR1cmUpOwotCQkJCQlmb3IgKEVPYmplY3Qgc29iaiA6IHNvdXJjZUxpc3QpIHsKLQkJCQkJCUVPYmplY3QgY29iaiA9IGRlZXBDb3B5KHNvYmopOwotCQkJCQkJY29waWVkTGlzdC5hZGQoY29iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb3BpZWRWYWx1ZSA9IGRlZXBDb3B5KChFT2JqZWN0KSBzb3VyY2VWYWx1ZSk7Ci0KLQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3Qgc291cmNlTGlzdCA9IChMaXN0KSBzb3VyY2VWYWx1ZTsKLQkJCQlMaXN0IGNvcGllZExpc3QgPSAoTGlzdCkgY29waWVkT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJZm9yIChPYmplY3Qgc29iaiA6IHNvdXJjZUxpc3QpIHsKLQkJCQkJT2JqZWN0IGNvYmogPSBzb2JqOwotCQkJCQlpZiAoc29iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQljb2JqID0gKEN1c3RvbUNhdGVnb3J5KSBkZWVwQ29weSgoQ3VzdG9tQ2F0ZWdvcnkpIHNvYmopOwotCQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgY2NvYmogPSAoQ3VzdG9tQ2F0ZWdvcnkpIGNvYmo7Ci0JCQkJCQljdXN0b21DYXRlZ29yeVBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoY2NvYmopOwotCQkJCQl9Ci0JCQkJCWNvcGllZExpc3QuYWRkKGNvYmopOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWNvcGllZE9iai5lU2V0KGZlYXR1cmUsIGNvcGllZFZhbHVlKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCQluZXdTaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlZXBDb3B5X3RleHQpOyAKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluaXREZWVwQ29weShDdXN0b21DYXRlZ29yeSB0YXJnZXRQYXJlbnQpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbih0YXJnZXRQYXJlbnQpOwotCQkJY3VzdG9tQ2F0ZWdvcnlQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJCW5hbWVIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoY3VzdG9tQ2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCQkKLQl9Ci0KLQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0F0dGFjaG1lbnREaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9BdHRhY2htZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTA3MGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0F0dGFjaG1lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIE9wZW5zIGRpYWxvZyB0byBhdHRhY2ggYXR0YWNobWVudHMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRhY2htZW50RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8qKgotCSAqIFRoZSBPSyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBDYW5jZWwgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCi0JcHJpdmF0ZSBUZXh0IGF0dGFjaG1lbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBBdHRhY2htZW50RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgZGlhbG9nQXJlYS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgZGlhbG9nQXJlYS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCB1cmxMYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCXVybExhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ0ZpbGVVUkxfdGV4dCk7IAotCQlhdHRhY2htZW50ID0gbmV3IFRleHQoZGlhbG9nQXJlYSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJYXR0YWNobWVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYXR0YWNobWVudC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCQlva0J1dHRvbgotCQkJCQkJCS5zZXRFbmFibGVkKGF0dGFjaG1lbnQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoaW1hZ2VGaWxlICE9IG51bGwgJiYgaW1hZ2VGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShpbWFnZUZpbGUpOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIHVybCA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCQkJYXR0YWNobWVudC5zZXRUZXh0KHVybCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF0dGFjaG1lbnREaWFsb2dhdHRhY2hGaWxlX3RleHQpOyAKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIENhbmNlbCBidXR0b24uCi0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0KLQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCS8vIFN0cmluZyB1cmwgPSBhdHRhY2htZW50LmdldFRleHQoKTsKLQkJLy8gaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJLy8JCQkKLQkJLy8gfQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBGaWxlIE5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRQYXRoKCkgewotCQlyZXR1cm4gYXR0YWNobWVudC5nZXRUZXh0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9DaGFuZ2VIaXN0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTQzMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NoYW5nZUhpc3RvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBEaWFsb2cgdG8gc2hvdyBjaGFuZ2UgaGlzdG9yeSBvZiBhbiBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VIaXN0b3J5RGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8qKgotCSAqIFRoZSBPSyBidXR0b24uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBDYW5jZWwgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBDaGFuZ2VIaXN0b3J5RGlhbG9nKFNoZWxsIHBhcmVudCwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIGRpYWxvZ0FyZWEuZ2V0TGF5b3V0RGF0YSgpOwotCQlnZC52ZXJ0aWNhbEluZGVudCA9IDEwOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2xhYmVsKTsgCi0KLQkJdGFibGUgPSBuZXcgVGFibGUoZGlhbG9nQXJlYSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJfQotCi0JCWluaXRDaGFuZ2VIaXN0b3J5VGFibGUoKTsKLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfdGl0bGUpOyAKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0Q2hhbmdlSGlzdG9yeVRhYmxlKCkgewotCQlTdHJpbmcgY2hhbmdlRGVzYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSAoKENvbnRlbnRFbGVtZW50KSBlbGVtZW50KQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQljaGFuZ2VEZXNjID0gY29udGVudERlc2NyaXB0aW9uLmdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWNoYW5nZURlc2MgPSAoKE1ldGhvZFBsdWdpbikgZWxlbWVudCkuZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCWlmIChjaGFuZ2VEZXNjICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAotCQkJCQljaGFuZ2VEZXNjLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5DaGFuZ2VIaXN0b3J5RGlhbG9nX2RlbGltaXRlcik7IAotCQkJTGlzdCBzdHJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQl3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXN0ckxpc3QuYWRkKHRvay5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSBzdHJMaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQkJaXRlbS5zZXRUZXh0KChTdHJpbmcpIHN0ckxpc3QuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCW9rQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODVmMmUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLS8qKgotICogT3BlbiBhbiBkaWFsb2cgdG8gYWRkIHZpZXdzIGludG8gY29uZmlndXJhdGlvbgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyBleHRlbmRzIEl0ZW1zRmlsdGVyRGlhbG9nIHsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gbnVsbDsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJfQotCQkJCWlmIChwcmVzZW50YXRpb25OYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJlc2VudGF0aW9uTmFtZSA9IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWU7Ci0JCQl9Ci0JCX07Ci0JCWhlbHBlci5zZXRTaG93UHJlc2VudGF0aW9uTmFtZSh0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODE5ZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbmZpZ3VyYXRpb25PcmRlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLQotLyoqCi0gKiBPcGVuIGEgZGlhbG9nIHRvIG9yZGVyIGNvbmZpZ3VyYXRpb24gdmlld3MKLSAqIEBhdXRob3IgWGlhbmcgRG9uZyBIdQotICogQHNpbmNlIDEuMgotICogIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3MzgyNwotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGJhc2VDb21wb3NpdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3VwLCBjdHJsX2Rvd247Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfdmlld3M7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdzVGFibGVWaWV3ZXI7Ci0KLS8vCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHZpZXdzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciB2aWV3c1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcjsKLQkKLQlwcml2YXRlIEFycmF5TGlzdCBjb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nKFNoZWxsIHBhcmVudCwgCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5hY3Rpb25NYW5hZ2VyID0gYWN0aW9uTWFuYWdlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQliYXNlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJYmFzZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkvLyBFbXB0eSBsaW5lCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgNCk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKAotCQkJCWJhc2VDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nX05hdmlnYXRpb25WaWV3cywgMyk7Ci0KLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZpZXdzID0gbmV3IFRhYmxlKGJhc2VDb21wb3NpdGUsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwMDsKLQkJCWN0cmxfdmlld3Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJdmlld3NUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3ZpZXdzKTsKLQkJdmlld3NUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodmlld3NWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQl2aWV3c1RhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIodmlld3NWaWV3ZXJMYWJlbFByb3ZpZGVyKTsKLQotCQlDb21wb3NpdGUgb3JkZXJCdXR0b25QYW5lID0gbmV3IENvbXBvc2l0ZShiYXNlQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCW9yZGVyQnV0dG9uUGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQljdHJsX3VwID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhUKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2Rvd24gPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ET1dOX0JVVFRPTl9URVhUKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJLy8gRW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGluZShiYXNlQ29tcG9zaXRlLCA0KTsKLQotCQlzdXBlcgotCQkJCS5nZXRTaGVsbCgpCi0JCQkJLnNldFRleHQoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2dfZGVzY3JpcHRpb24pOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCXJldHVybiBiYXNlQ29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbmNvbCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbmNvbDsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IG5Db2wpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5Db2w7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJzKCkgewotCQl2aWV3c1ZpZXdlckNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdzVmlld2VyTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJfQotCi0JCX07Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJdmlld3NUYWJsZVZpZXdlcgotCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld3NUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlpZiAodmlld3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0gZWxzZQotCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCQlpZiAodmlld3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCQkKLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQotCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb3ZlVXBJdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKTsKLQkJCQlNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCBjbWQgPSBuZXcgTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQoCi0JCQkJCQljb25maWcsIG1vdmVVcEl0ZW1zLCBmZWF0dXJlLDEpOwotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJdmlld3NUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAodmlld3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwKSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlpZiAodmlld3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3c1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKTsKLQkJCQlNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCBjbWQgPSBuZXcgTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQoCi0JCQkJCQljb25maWcsIG1vdmVEb3duSXRlbXMsIGZlYXR1cmUsMCk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQl2aWV3c1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDApIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmICh2aWV3c1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHZpZXdzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZCBpbml0aWFsIGRhdGEgZnJvbSBtb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsKLQkJdmlld3NUYWJsZVZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLS8vCQlhbGxTdGVwcy5hcHBseSgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IGNvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJT2JqZWN0IGNtZCA9IGNvbW1hbmRzLmdldChpKTsKLQkJCQlpZiAoY21kIGluc3RhbmNlb2YgTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQpIHsKLQkJCQkJKChNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZCkgY21kKS51bmRvKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmNhbmNlbFByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNjMzNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0NvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogT3BlbiBhbiBkaWFsb2cgdG8gb3JkZXIgY29udGVudCBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYmFzZUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zdGVwczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc3RlcHNUYWJsZVZpZXdlcjsKLQotCS8vIHByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXI7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcjsKLQotCS8vIHByaXZhdGUgVGFzayBjb250ZW50RWxlbWVudDsKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50OwotCi0JLy8gdGhlIEVsZW1lbnQgdG8gdXNlIGZvciBzb3J0aW5nCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IHNvcnRFbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY29tbWFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgdmlld2VyX3NvcnQ7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU29ydCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdDxTdHJpbmc+IHNvcnRUeXBlc0xpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIKLQkJCQkJLmdldENhdGVnb3J5U29ydFR5cGVzKCk7Ci0JCQlyZXR1cm4gc29ydFR5cGVzTGlzdC50b0FycmF5KCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTb3J0ID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCVN0cmluZyBzdHIgPSAoKFN0cmluZykgb2JqZWN0KTsKLQkJCQlyZXR1cm4gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldFNvcnRUeXBlRGlzcGxheU5hbWUoc3RyKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgPGNvZGU+QWR2YW5jZWRTZWFyY2hEaWFsb2c8L2NvZGU+IGdpdmViIHRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcihjb250ZW50RWxlbWVudCkpIHsKLQkJCXRoaXMuc29ydEVsZW1lbnQgPSBjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNvcnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCX0KLQkJdGhpcy5hY3Rpb25NYW5hZ2VyID0gYWN0aW9uTWFuYWdlcjsKLQkJdGhpcy5hbGxTdGVwcyA9IG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJhc2VDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoCi0JCQkJYmFzZUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db250ZW50RWxlbWVudHNPcmRlckRpYWxvZ19Db250ZW50RWxlbWVudF90ZXh0LAotCQkJCTMpOyAKLQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfc3RlcHMgPSBuZXcgVGFibGUoYmFzZUNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBvcmRlckJ1dHRvblBhbmUgPSBuZXcgQ29tcG9zaXRlKGJhc2VDb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJb3JkZXJCdXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJfQotCi0JCWN0cmxfdXAgPSBjcmVhdGVCdXR0b24ob3JkZXJCdXR0b25QYW5lLCBBdXRob3JpbmdVSVRleHQuVVBfQlVUVE9OX1RFWFQpOwotCQljdHJsX3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWN0cmxfZG93biA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWNyZWF0ZUxhYmVsKG9yZGVyQnV0dG9uUGFuZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfTGFiZWwsIDEpOwotCQlDb21ibyBjdHJsX3NvcnQgPSBuZXcgQ29tYm8ob3JkZXJCdXR0b25QYW5lLCBTV1QuU0lOR0xFIHwgU1dULkZMQVQKLQkJCQl8IFNXVC5SRUFEX09OTFkpOwotCQl2aWV3ZXJfc29ydCA9IG5ldyBDb21ib1ZpZXdlcihjdHJsX3NvcnQpOwotCQl2aWV3ZXJfc29ydC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU29ydCk7Ci0JCXZpZXdlcl9zb3J0LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclNvcnQpOwotCQl2aWV3ZXJfc29ydC5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCS8vIHNldCBpbml0aWFsIHNlbGVjdGlvbgotCQlTdHJpbmcgc29ydFR5cGUgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoc29ydEVsZW1lbnQpOwotCQl2aWV3ZXJfc29ydC5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc29ydFR5cGUpLCB0cnVlKTsKLQkJZW5hYmxlQnV0dG9ucygpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxpbmUoYmFzZUNvbXBvc2l0ZSwgNCk7Ci0KLQkJc3VwZXIKLQkJCQkuZ2V0U2hlbGwoKQotCQkJCS5zZXRUZXh0KAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2dfZGVzY3JpcHRpb25fdGV4dCk7IAotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCS8vIGNvbnRyaWJ1dG9ycyBjYW5ub3QgY2hhbmdlIHRoZSBzb3J0IHR5cGUgLSB0aGUgYmFzZSBlbGVtZW50J3Mgc29ydCBpcwotCQkvLyB1c2VkCi0JCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSB8fCBUbmdVdGlsLmlzQ29udHJpYnV0b3IoY29udGVudEVsZW1lbnQpKSB7Ci0JCQl2aWV3ZXJfc29ydC5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJdmlld2VyX3NvcnQuZ2V0Q29tYm8oKS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0KLQkJcmV0dXJuIGJhc2VDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IG5Db2wpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5Db2w7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIGJ1dHRvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgT0sgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotCQkJCXRydWUpOwotCi0JCS8vIENyZWF0ZSB0aGUgQ2FuY2VsIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFByb3ZpZGVycygpIHsKLQkJc3RlcHNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQotCQkJCS8vIGlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJLy8gYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJLy8gY29udGVudEVsZW1lbnQsCi0JCQkJLy8gQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpOwotCQkJCS8vIH0KLQkJCQkvLyBMaXN0IHJldHVybkxpc3QgPQotCQkJCS8vIENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cyhzb3J0RWxlbWVudCwKLQkJCQkvLyBhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCS8vIHJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTLAotCQkJCQkJCWZlYXR1cmUpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoCi0JCQkJCQlzb3J0RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICEoKExpc3QpICgoQ29udGVudENhdGVnb3J5KSBjb250ZW50RWxlbWVudCkKLQkJCQkJCS5lR2V0KGZlYXR1cmUpKS5jb250YWlucyhlbGVtZW50KTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVycygpIHsKLQotCQlzdGVwc1RhYmxlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQkJTW92ZUluQ2F0ZWdvcnlDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoCi0JCQkJCQkoQ29udGVudENhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZVVwSXRlbXMsCi0JCQkJCQlhbGxTdGVwcywgZmVhdHVyZSwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCAxKTsKLQotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQotCQkJCWVuYWJsZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJCQlNb3ZlSW5DYXRlZ29yeUNvbW1hbmQgY21kID0gbmV3IE1vdmVJbkNhdGVnb3J5Q29tbWFuZCgKLQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIGNvbnRlbnRFbGVtZW50LCBtb3ZlRG93bkl0ZW1zLAotCQkJCQkJYWxsU3RlcHMsIGZlYXR1cmUsCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgMCk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCi0JCQkJZW5hYmxlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXJfc29ydAotCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zb3J0Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCVN0cmluZyBzb3J0VHlwZSA9IChTdHJpbmcpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCQkJCS5nZXRDYXRlZ29yeVNvcnRQcm9wZXJ0eShjb250ZW50RWxlbWVudCk7Ci0KLQkJCQkJCWlmIChwcm9wID09IG51bGwpIHsKLQkJCQkJCQlwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyCi0JCQkJCQkJCQkuY3JlYXRlTmV3U29ydFByb3BlcnR5KHNvcnRUeXBlKTsKLQkJCQkJCQlhY3Rpb25NYW5hZ2VyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJCQkJCQkJCXByb3AsIC0xKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWN0aW9uTWFuYWdlci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb3AsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJCQkJCQlzb3J0VHlwZSwgLTEpOwotCQkJCQkJfQotCQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJCWVuYWJsZUJ1dHRvbnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlzdGVwc1RhYmxlVmlld2VyLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJYWxsU3RlcHMuYXBwbHkoKTsKLQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IGNvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJT2JqZWN0IGNtZCA9IGNvbW1hbmRzLmdldChpKTsKLQkJCQlpZiAoY21kIGluc3RhbmNlb2YgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKSB7Ci0JCQkJCSgoTW92ZUluQ2F0ZWdvcnlDb21tYW5kKSBjbWQpLnVuZG8oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5hYmxlQnV0dG9ucygpIHsKLQkJaWYgKGlzU2hvdWxkRW5hYmxlVXAoKSkgewotCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UKLQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJaWYgKGlzU2hvdWxkRW5hYmxlRG93bigpKSB7Ci0JCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlCi0JCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvdWxkRW5hYmxlVXAoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmCi0JCQkJIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmIAotCQkJCUNhdGVnb3J5U29ydEhlbHBlci5pc01hbnVhbENhdGVnb3J5U29ydChzb3J0RWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvdWxkRW5hYmxlRG93bigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYKLQkJCQkoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgJiYKLQkJCQkhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoc29ydEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250cmlidXRpb25TZWxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Db250cmlidXRpb25TZWxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZmI3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvQ29udHJpYnV0aW9uU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBkaWFsb2cgZm9yIHNlbGVjdGluZyBlbGVtZW50IHRvIGRldGV0bWluZSB3aGljaCBlbGVtZW50IGVkaXRvciB0byBvcGVuIGluCi0gKiBjYXNlIG9mIHZhcmlhYmlsaXR5IHJlbGF0aW9uc2hpcC4gVGhpcyB3aWxsIG9ubHkgdGFrZSBlZmZlY3QgaWYgdXNlcgotICogZG91YmxlLWNsaWNrcyBmcm9tIGNvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRyaWJ1dGlvblNlbGVjdGlvbiB7Ci0KLQlwcml2YXRlIEhhc2hTZXQgZmlsdGVyRWxlbWVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBDb250cmlidXRpb25GaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMoCi0JCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKSkgewotCQkJCQlpZiAoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHJldHVybiBmYWxzZTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpCi0JCQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqZWN0ID0gaW9yLm5leHQoKTsKLQkJCQkJaWYgKCgoQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCQlpb3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGFueUNhdGVnb3JpemVkRWxlbWVudEFjY2VwdGVkKChDdXN0b21DYXRlZ29yeSkgb2JqLAotCQkJCQkJZmlsdGVyRWxlbWVudExpc3QpOwotCQkJfQotCQkJaWYgKChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkKLQkJCQkJJiYgZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzcyl7IAotCQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKG9iaikpewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiBjaGVja1Byb2Nlc3NQa2cob2JqKTsKLQkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gY2hlY2tQcm9jZXNzRWxlbWVudHMob2JqKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX07Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tQcm9jZXNzUGtnKE9iamVjdCBvYmopewotCQkKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZihvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSl7Ci0JCQlpZihmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCl7Ci0JCQkJaWYoZmlsdGVyRWxlbWVudExpc3QuY29udGFpbnMoKChQcm9jZXNzQ29tcG9uZW50KW9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJbGlzdCA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmopLmdldFByb2Nlc3MoKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJfWVsc2V7Ci0JCQkJbGlzdCA9ICgoUHJvY2Vzc1BhY2thZ2Upb2JqKS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQl9Ci0JCQkKLQkJfQotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCXsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCl7Ci0JCQkJaWYoY2hlY2tQcm9jZXNzUGtnKGNoaWxkKSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpewotCQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKGNoaWxkKSkgcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayBhbnkgcHJvY2VzcyBlbGVtZW50cwotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogCQkJQm9vbGVhbiB2YWx1ZSAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1Byb2Nlc3NFbGVtZW50cyhPYmplY3Qgb2JqKXsKLQkJTGlzdCBsaXN0ID0gKChQcm9jZXNzKW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotCQl7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpewotCQkJCWlmKGZpbHRlckVsZW1lbnRMaXN0LmNvbnRhaW5zKCgoQnJlYWtkb3duRWxlbWVudCljaGlsZCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGFueSBjYXRlZ29yaXplZCBlbGVtZW50cyB0byBiZSBhY2NlcHRlZC4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuCi0JICogCQlCb29sZWFuIHZhbHVlIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIGFueSBjYXRlZ29yaWV6ZWQgZWxlbWVudHMgdG8gYmUgYWNjZXB0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbnlDYXRlZ29yaXplZEVsZW1lbnRBY2NlcHRlZChDdXN0b21DYXRlZ29yeSBvYmosCi0JCQlIYXNoU2V0IGxpc3QpIHsKLQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlMaXN0IGVsZW1lbnRzID0gb2JqLmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAobGlzdC5jb250YWlucyhvYmplY3QpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlhbnlDYXRlZ29yaXplZEVsZW1lbnRBY2NlcHRlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLyoqCi0JICogRGlzcGxheSBjb250cmlidXRpb24gc2VsZWN0aW9uIGRpYWxvZyB3aGljaCBsaXN0cyBlbGVtZW50cyBhbmQgaXQncwotCSAqIGNvbnRyaWJ1dG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29udHJpYnV0aW9uU2VsZWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIEl0IHNob3dzIGRpYWxvZyBib3ggZm9yIGFsbCB0aGUgY29udHJpYnV0b3JzLiBVc2VyIGlzIGV4cGVjdGVkIHRvIHNlbGVjdAotCSAqIG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIAkJCUVsZW1lbnQgZm9yIHdoaWNoIGNvbnRyaWJ1dG9yIGFyZSBzaG93bgotCSAqIEByZXR1cm4KLQkgKiAJCQlTZWxlY3RlZCBjb250cmlidXRvcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2VsZWN0ZWRDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCkgewotCQlmaWx0ZXJFbGVtZW50TGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCS8vIEdldCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvLyBnZXQgbGlzdCBvZiBjb250cmlidXRvcnMKLQkJTGlzdCBjb250cmlidXRvcnMgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJLmdldENvbnRyaWJ1dG9ycyhlbGVtZW50LCBjb25maWcpOwotCQlpZiAoKGNvbnRyaWJ1dG9ycyAhPSBudWxsKSAmJiAoIWNvbnRyaWJ1dG9ycy5pc0VtcHR5KCkpKSB7Ci0JCQkvLyBjbGVhciB0aGUgYXJyYXkKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCS8vIGFkZCBlbGVtZW50IGFuZCBpdCdzIGNvbnRyaWJ1dG9ycwotCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnQpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGNvbnRyaWJ1dG9ycyk7Ci0JCQlmaWx0ZXJFbGVtZW50TGlzdC5hZGRBbGwoZWxlbWVudExpc3QpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdG9yLm5leHQoKTsKLQkJCQlMaXN0IGdyb3VwaW5ncyA9IG51bGw7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpIGUpOwotCi0JCQkJfQotCQkJCWlmIChlIGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQlncm91cGluZ3MgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoKGdyb3VwaW5ncyAhPSBudWxsKSAmJiAoIWdyb3VwaW5ncy5pc0VtcHR5KCkpKQotCQkJCQlmaWx0ZXJFbGVtZW50TGlzdC5hZGRBbGwoZ3JvdXBpbmdzKTsKLQotCQkJfQotCi0JCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBDb250cmlidXRpb25GaWx0ZXIoKTsKLQkJCS8vIEl0ZW1zRmlsdGVyRGlhbG9nIGRsZyA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkvLyAuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCS8vIGZpbHRlciwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQpOwotCQkJLy8gZGxnLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbXSB7IEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UIH07Ci0JCQlDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2cgZGxnID0gbmV3IENvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZygKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCWRsZy5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWRsZy5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVCk7Ci0JCQlkbGcuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQkJZGxnLnNldFR5cGVzKHN0cik7Ci0JCQlkbGcuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQlkbGcuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKSksCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0KLQkJCVN0cmluZyB0aXRsZSA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db250cmlidXRpb25TZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3RpdGxlLCAKLQkJCQkJCQluZXcgU3RyaW5nW10geyBlbGVtZW50LmdldE5hbWUoKSB9KTsKLQotCQkJZGxnLnNldFRpdGxlKHRpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0KLQkJCUxpc3QgcmVzdWx0ID0gZGxnLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCWlmICgocmVzdWx0ID09IG51bGwpIHx8IChyZXN1bHQuaXNFbXB0eSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gcmVzdWx0LmdldCgwKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9EaWFsb2dIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9EaWFsb2dIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5MWQ0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRGlhbG9nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NBY3Rpdml0eUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlZhcmlhYmlsaXR5UHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBjb2xsZWN0IGlucHV0IGRhdGEgZnJvbSB1c2VycyB1c2luZyBkaWFsb2cgYm94ZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFsb2dIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdEVsZW1lbnRzRm9yKEJyZWFrZG93bkVsZW1lbnQgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhYk5hbWUpIHsKLQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBmaWx0ZXIsIHRhYk5hbWUsIG51bGwsCi0JCQkJY29uZmlnKTsKLQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZShmYWxzZSk7Ci0JCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQlmZC5vcGVuKCk7Ci0JCXJldHVybiBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdFRhc2tzRm9yKEFjdGl2aXR5IGFjdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIoY29uZmlnLCBudWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5UQVNLUywgYWN0KTsKLQotCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoYWN0LCBmaWx0ZXIsIGNvbmZpZywgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdEVsZW1lbnRzRm9yKE9iamVjdCBvYmplY3QsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlyZXR1cm4gc2VsZWN0VGFza3NGb3IoKEFjdGl2aXR5KSBvYmplY3QsIGNvbmZpZyk7Ci0JCQl9IGVsc2UgaWYgKGFkYXB0ZXJGYWN0b3J5ID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMsIChBY3Rpdml0eSkgb2JqZWN0KTsKLQkJCQlyZXR1cm4gc2VsZWN0RWxlbWVudHNGb3IoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCwgZmlsdGVyLAotCQkJCQkJY29uZmlnLCB0YWJOYW1lKTsKLQkJCX0gZWxzZSBpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoCi0JCQkJCQljb25maWcsIG51bGwsIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsCi0JCQkJCQkoQWN0aXZpdHkpIG9iamVjdCk7Ci0JCQkJcmV0dXJuIHNlbGVjdEVsZW1lbnRzRm9yKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QsIGZpbHRlciwKLQkJCQkJCWNvbmZpZywgdGFiTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQkJCXJldHVybiBzZWxlY3RFbGVtZW50c0ZvcigoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBmaWx0ZXIsCi0JCQkJCQljb25maWcsIHRhYk5hbWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IHNlbGVjdEFjdGl2aXRpZXNGb3IoQWN0aXZpdHkgYWN0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGludCBjb21tYW5kKSB7Ci0JCS8vIHJldHVybiBudWxsOwotCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVM7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NBY3Rpdml0eUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUywgYWN0LCBjb21tYW5kKTsKLQkJTGlzdCBzZWxlY3Rpb24gPSBzZWxlY3RFbGVtZW50c0ZvcihhY3QsIGZpbHRlciwgY29uZmlnLCB0YWJOYW1lKTsKLQkJQXJyYXlMaXN0IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQlhY3Rpdml0aWVzLmFkZChwcm9jKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXRpZXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjIxM2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9GaWx0ZXJTb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLQotCi0vKioKLSAqIEEge0BsaW5rIEl0ZW1zRmlsdGVyRGlhbG9nfSBkaWFsb2cgdmlld2VyIHNvcnRlciB0byBvcmRlciB0aGUgZGlzcGxheSBmb3IgY2VydGFpbiBlbGVtZW50IGFuZCBwYWNrYWdlcy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJTb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCi0JcHVibGljIEZpbHRlclNvcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbGxhdG9yCi0JICovCi0JcHVibGljIEZpbHRlclNvcnRlcihDb2xsYXRvciBjb2xsYXRvcikgewotCQlzdXBlcihjb2xsYXRvcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3IjY29tcGFyZShvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQotCQlpZiAoIShlMSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB8fCAhKGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQlpbnQgY2F0MSA9IGNhdGVnb3J5KGUxKTsKLQkJCWludCBjYXQyID0gY2F0ZWdvcnkoZTIpOwotCi0JCQlpZiAoY2F0MSAhPSBjYXQyKQotCQkJCXJldHVybiBjYXQxIC0gY2F0MjsKLQkJfQotCi0JCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiAmJiBlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZTE7Ci0JCVN0cmluZyBuYW1lMjsKLQotCQlpZiAodmlld2VyID09IG51bGwgfHwgISh2aWV3ZXIgaW5zdGFuY2VvZiBDb250ZW50Vmlld2VyKSkgewotCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJbmFtZTIgPSBlMi50b1N0cmluZygpOwotCQl9IGVsc2UgewotCQkJSUJhc2VMYWJlbFByb3ZpZGVyIHByb3YgPSAoKENvbnRlbnRWaWV3ZXIpIHZpZXdlcikKLQkJCQkJLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChwcm92IGluc3RhbmNlb2YgSUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlJTGFiZWxQcm92aWRlciBscHJvdiA9IChJTGFiZWxQcm92aWRlcikgcHJvdjsKLQkJCQluYW1lMSA9IGxwcm92LmdldFRleHQoZTEpOwotCQkJCW5hbWUyID0gbHByb3YuZ2V0VGV4dChlMik7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUxID0gZTEudG9TdHJpbmcoKTsKLQkJCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5hbWUxID09IG51bGwpCi0JCQluYW1lMSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKG5hbWUyID09IG51bGwpCi0JCQluYW1lMiA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbGxhdG9yLmNvbXBhcmUobmFtZTEsIG5hbWUyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyQ29tcGFyYXRvciNzb3J0KG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0W10pCi0JICovCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBWaWV3ZXIgdmlld2VyLCBPYmplY3RbXSBlbGVtZW50cykgewotCQlBcnJheXMuc29ydChlbGVtZW50cywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJcmV0dXJuIEZpbHRlclNvcnRlci50aGlzLmNvbXBhcmUodmlld2VyLCBhLCBiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyRm9yQWxsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvRmlsdGVyU29ydGVyRm9yQWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0YTJhNjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0ZpbHRlclNvcnRlckZvckFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db250ZW50Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLQotLyoqCi0gKiBBIEZpbHRlciBzb3J0ZXIgZm9yIHtAbGluayBJdGVtc0ZpbHRlckRpYWxvZ30gdXNpbmcge0BsaW5rIEFsbEZpbHRlcn0KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyU29ydGVyRm9yQWxsIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCXB1YmxpYyBGaWx0ZXJTb3J0ZXJGb3JBbGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbGxhdG9yCi0JICovCi0JcHVibGljIEZpbHRlclNvcnRlckZvckFsbChDb2xsYXRvciBjb2xsYXRvcikgewotCQlzdXBlcihjb2xsYXRvcik7Ci0JfQotCi0JcHVibGljIGludCBjYXRlZ29yeShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJcmV0dXJuIDA7Ci0JCWVsc2UKLQkJCXJldHVybiAxOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3QgZTEsIE9iamVjdCBlMikgewotCi0JCWlmICghKGUxIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8ICEoZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCWludCBjYXQxID0gY2F0ZWdvcnkoZTEpOwotCQkJaW50IGNhdDIgPSBjYXRlZ29yeShlMik7Ci0KLQkJCWlmIChjYXQxICE9IGNhdDIpCi0JCQkJcmV0dXJuIGNhdDEgLSBjYXQyOwotCQl9Ci0KLQkJaWYgKGUxIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICYmIGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIShlMSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB8fCAhKGUyIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCVN0cmluZyBuYW1lMTsKLQkJU3RyaW5nIG5hbWUyOwotCi0JCWlmICh2aWV3ZXIgPT0gbnVsbCB8fCAhKHZpZXdlciBpbnN0YW5jZW9mIENvbnRlbnRWaWV3ZXIpKSB7Ci0JCQluYW1lMSA9IGUxLnRvU3RyaW5nKCk7Ci0JCQluYW1lMiA9IGUyLnRvU3RyaW5nKCk7Ci0JCX0gZWxzZSB7Ci0JCQlJQmFzZUxhYmVsUHJvdmlkZXIgcHJvdiA9ICgoQ29udGVudFZpZXdlcikgdmlld2VyKQotCQkJCQkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKHByb3YgaW5zdGFuY2VvZiBJTGFiZWxQcm92aWRlcikgewotCQkJCUlMYWJlbFByb3ZpZGVyIGxwcm92ID0gKElMYWJlbFByb3ZpZGVyKSBwcm92OwotCQkJCW5hbWUxID0gbHByb3YuZ2V0VGV4dChlMSk7Ci0JCQkJbmFtZTIgPSBscHJvdi5nZXRUZXh0KGUyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZTEgPSBlMS50b1N0cmluZygpOwotCQkJCW5hbWUyID0gZTIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlpZiAobmFtZTEgPT0gbnVsbCkKLQkJCW5hbWUxID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAobmFtZTIgPT0gbnVsbCkKLQkJCW5hbWUyID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNvcnQoZmluYWwgVmlld2VyIHZpZXdlciwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJQXJyYXlzLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCXJldHVybiBGaWx0ZXJTb3J0ZXJGb3JBbGwudGhpcy5jb21wYXJlKHZpZXdlciwgYSwgYik7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9JdGVtc0ZpbHRlckRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0l0ZW1zRmlsdGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWZkYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL0l0ZW1zRmlsdGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5FeFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2guaW50ZXJuYWwuY29yZS50ZXh0LlBhdHRlcm5Db25zdHJ1Y3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEZpbHRlciBEaWFsb2cgLSBhbGxvdyB0aGUgdXNlciB0byBmaWx0ZXIgdGhlIGNvbnRlbnQgZWxlbWVudCwgY29udGVudAotICogY2F0ZWdvcmllcywgY3VzdG9tIGNhdGVnb3JpZXMsIEFsbCB0eXBlcyBvZiBjb250ZW50ZWxlbWVudHMgYmFzZWQgb24gbG9jYXRpb24gb2YgdGhlIHVzZSBvZiB0aGUgZmlsdGVyCi0gKiBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgSXRlbXNGaWx0ZXJEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBJRG91YmxlQ2xpY2tMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIG9rQnV0dG9uLCBjYW5jZWxCdXR0b247Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjdHJsX3BhdHRlcm4sIGN0cmxfYnJpZWZfZGVzYzsKLQotCXByaXZhdGUgU3RyaW5nIHBhdHRlcm4sIGZpbHRlclR5cGVTdHI7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gZmlsdGVyVHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIGRpYWxvZ1RpdGxlLCB0YWJTdHI7Ci0KLQlwcml2YXRlIE9iamVjdCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHNlbGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiB2aWV3ZXJTZWxlY3Rpb25TaW5nbGUgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyB2aWV3ZXJMYWJlbCA9IG51bGw7Ci0JCi0JLyoKLQkgKiBUcmVldmlld2VyIGZvciBDb250ZW50RWxlbWVudHMgdG8gZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCS8vIHJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LCAiIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXRBZGFwdGVyKChNZXRob2RQbHVnaW4pb2JqZWN0LCBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmdldEZ1bGxOYW1lKG9iamVjdCk7Ci0JCQkJfQotCQkJfSAKLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoKLQkgKiBEaWFsb2cgQXR0cmlidXRlcwotCSAqLwotCS8vIHByaXZhdGUgYm9vbGVhbiBhbnlDaGlsZHMgPSB0cnVlOwotCXByaXZhdGUgTGlzdCBhbHJlYWR5U2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCVBhdHRlcm4gcmVnZXhQYXR0ZXJuOwotCi0JLy8gcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JcHJvdGVjdGVkIEZpbHRlckhlbHBlciBoZWxwZXI7Ci0KLQlwcml2YXRlIFN0cmluZyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCA9ICIuTEVWRUxfSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgUEFUVEVSTl9JRCA9ICIuUGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBUWVBFX0lEID0gIi5UeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgRElBTE9HX05BTUU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBhbmRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb2xsYXBzZUJ1dHRvbjsKLQotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCi0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlczsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIGZpbHRlciBiYXNlZCBvbgotCSAqIHRhYlN0ciwgZmlsdGVycyBvdXQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgYmFzZWQgb24gYWxyZWFkeSBleGlzdGluZwotCSAqIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIHNlbGVjdGVkIHRhYmxlLiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGNvbnRlbnRFbGVtZW50LAotCQkJU3RyaW5nIHRhYlN0ciwgTGlzdCBhbHJlYWR5RXhpc3RzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnRhYlN0ciA9IHRhYlN0cjsKLQkJdGhpcy5maWx0ZXIgPSBudWxsOwotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBhbHJlYWR5RXhpc3RzOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsCi0JCQkJdGhpcy5hbHJlYWR5U2VsZWN0ZWRMaXN0KTsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsIFN0cmluZyB0YWJTdHIsCi0JCQlMaXN0IGFscmVhZHlFeGlzdHMsIE9iamVjdCBpbnB1dCkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBmaWx0ZXIsIG51bGwsIHRhYlN0ciwgYWxyZWFkeUV4aXN0cyk7Ci0JCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEZpbHRlckRpYWxvZy4gVGhpcyBjb25zdHJ1Y3RvciB3aWxsIHVzZSBwYXNzZWQgZmlsdGVyLgotCSAqIHRhYlN0ciBpcyB1c2VkIGZvciB0aGUgc2VhcmNodHlwZSBvbmx5LiBJbml0aWFsaXplcyB0aGUgQ29udGVudFByb3ZpZGVyCi0JICogZm9yIHRoZSB0cmVldmlld2VyLgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVtc0ZpbHRlckRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUZpbHRlciBmaWx0ZXIsCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQsIFN0cmluZyB0YWJTdHIpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihjb250ZW50RWxlbWVudCwgdGFiU3RyLCBudWxsLCBudWxsLCBudWxsKTsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgdXNlIHBhc3NlZCBmaWx0ZXIuCi0JICogdGFiU3RyIGlzIHVzZWQgZm9yIHRoZSBzZWFyY2h0eXBlIG9ubHkuIEluaXRpYWxpemVzIHRoZSBDb250ZW50UHJvdmlkZXIKLQkgKiBmb3IgdGhlIHRyZWV2aWV3ZXIuCi0JICogCi0JICovCi0JcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBJRmlsdGVyIGZpbHRlciwKLQkJCU9iamVjdCBjb250ZW50RWxlbWVudCwgU3RyaW5nIHRhYlN0ciwgTGlzdCBhbHJlYWR5RXhpc3RzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMudGFiU3RyID0gdGFiU3RyOwotCQl0aGlzLmFscmVhZHlTZWxlY3RlZExpc3QgPSBhbHJlYWR5RXhpc3RzOwotCQloZWxwZXIgPSBuZXcgRmlsdGVySGVscGVyKGNvbnRlbnRFbGVtZW50LCB0YWJTdHIsIG51bGwsIG51bGwsCi0JCQkJYWxyZWFkeUV4aXN0cyk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRmlsdGVyRGlhbG9nLiBPbmx5IGZvciBtZXRob2Rjb25maWd1cmF0aW9uLiBUaGlzCi0JICogY29uc3RydWN0b3Igd2lsbCB1c2UgcGFzc2VkIGZpbHRlci4gSW5pdGlhbGl6ZXMgdGhlIENvbnRlbnRQcm92aWRlciBmb3IKLQkgKiB0aGUgdHJlZXZpZXdlci4KLQkgKiAKLQkgKi8KLQkvLyBwdWJsaWMgSXRlbXNGaWx0ZXJEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9iamVjdCBjb250ZW50RWxlbWVudCwKLQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZ3VyYXRpb24sIFN0cmluZyB0YWJTdHIpIHsKLQkvLyBzdXBlcihwYXJlbnRTaGVsbCk7Ci0JLy8gdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCS8vIHRoaXMudGFiU3RyID0gdGFiU3RyOwotCS8vIHRoaXMuZmlsdGVyID0gbnVsbDsKLQkvLyB0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBtZXRob2RDb25maWd1cmF0aW9uOwotCS8vIGhlbHBlciA9IG5ldyBGaWx0ZXJIZWxwZXIoY29udGVudEVsZW1lbnQsIHRhYlN0ciwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JLy8gaW5pdFByb3ZpZGVyRm9yVGFicygpOwotCS8vIH0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHZlcnkgZ2VuZXJpYywgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSBmaWx0ZXIsIGlucHV0Ci0JICogYW5kIGNvbnRlbnRwcm92aWRlciBzaG91bGQgYmUgaGFuZGxlZCBleHBsaWNpdGx5IGJ5IGNhbGxpbmcgYmVsb3cgbWV0aG9kLgotCSAqIHNldEZpbHRlcihJRmlsdGVyKSBzZXRJbnB1dChPYmplY3QpCi0JICogc2V0Q29udGVudFByb3ZpZGVyKElTdHJ1Y3R1cmVkUHJvdmlkZXIpCi0JICogCi0JICovCi0JcHVibGljIEl0ZW1zRmlsdGVyRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJaGVscGVyID0gbmV3IEZpbHRlckhlbHBlcihudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaWYgYSBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLQkJCXNhdmVWYWx1ZXMoKTsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JCWlmKGNvbXBvc2VkQWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0JCQljb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgY2FuY2VsIGJ1dHRvbiBvZiB0aGlzIGRpYWxvZyBoYXMgYmVlbiBwcmVzc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JICAgIGlmICh0cmVlSm9iICE9IG51bGwpIHsKLQkgICAgCXRyZWVKb2IuY2FuY2VsKCk7Ci0JICAgIH0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCQlpZihjb21wb3NlZEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpewotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCSAgICBpZiAodHJlZUpvYiAhPSBudWxsKSB7Ci0JICAgIAl0cmVlSm9iLmNhbmNlbCgpOwotCSAgICB9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aXRsZSBmb3IgZGlhbG9nIGJveCBlZzogU2VsZWN0IERpYWxvZyBGb3IgUm9sZSwgZGlhbG9nVGl0bGUgbmVlZHMgdG8KLQkgKiAiUm9sZSIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcy5kaWFsb2dUaXRsZSA9IGRpYWxvZ1RpdGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCWlmIChkaWFsb2dUaXRsZSA9PSBudWxsKQotCQkJZGlhbG9nVGl0bGUgPSB0YWJTdHI7Ci0JCXNoZWxsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX3RpdGxlICsgZGlhbG9nVGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiAobm9uLUphdmFkb2MpIEFkZHMgYnV0dG9ucyB0byB0aGlzIGRpYWxvZydzIGJ1dHRvbiBiYXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBiYXIgY29tcG9zaXRlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhbG9nIGFyZWEgYW5kIGNvbnRyb2xzIGFuZCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHRoZQotCSAqICAgICAgICAgICAgcGFyZW50IGNvbXBvc2l0ZSB0byBjb250YWluIHRoZSBkaWFsb2cgYXJlYQotCSAqIEByZXR1cm4gdGhlIGRpYWxvZyBhcmVhIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQljb21wb3NpdGUuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDEwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMTA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCB0eXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXsKLQkJCXR5cGVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19UeXBlX3RleHQpOyAKLQkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJdHlwZUxhYmVsLnNldExheW91dERhdGEoZ0QxKTsKLQotCQl9Ci0JCWZpbHRlclR5cGUgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdEMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ0QxLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdEMS53aWR0aEhpbnQgPSAzOTA7Ci0JCQlmaWx0ZXJUeXBlLnNldExheW91dERhdGEoZ0QxKTsKLQkJfQotCi0JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQlmaWxsRmlsdGVyVHlwZUNvbWJvKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHR5cGVzKTsKLQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCWZpbHRlclR5cGVTdHIgPSBmaWx0ZXJUeXBlLmdldEl0ZW0oMCk7Ci0JCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZS5nZXRJdGVtKDApKTsKLQkJCQlpZiAodGFiU3RyID09IG51bGwpIHsKLQkJCQkJdGFiU3RyID0gZmlsdGVyVHlwZVN0cjsKLQkJCQkJaGVscGVyLnNldFRhYlN0cih0YWJTdHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaWx0ZXJUeXBlLnNlbGVjdCgwKTsKLQotCQlMYWJlbCBjdHJsX3BhdHRlcm5MYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJewotCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl90ZXh0KTsgCi0JCQlHcmlkRGF0YSBnRCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wYXR0ZXJuTGFiZWwuc2V0TGF5b3V0RGF0YShnRCk7Ci0JCX0KLQotCQljdHJsX3BhdHRlcm4gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBnRDEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCWdEMS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQljdHJsX3BhdHRlcm4uc2V0TGF5b3V0RGF0YShnRDEpOwotCQkJY3RybF9wYXR0ZXJuLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCW5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fdGV4dCArICAKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfUGF0dGVybl9kZXNjcmlwdGlvbikpOwotCQl9Ci0JCUxhYmVsIGN0cmxfcGF0dGVybkxhYmVsMSA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJewotCQkJY3RybF9wYXR0ZXJuTGFiZWwxLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX1BhdHRlcm5fZGVzY3JpcHRpb24pOyAKLQkJCUdyaWREYXRhIGdEID0gbmV3IEdyaWREYXRhKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmFsc2UsIGZhbHNlLCAzLCAxKTsKLQkJCWdELndpZHRoSGludCA9IDU1MDsKLQkJCWN0cmxfcGF0dGVybkxhYmVsMS5zZXRMYXlvdXREYXRhKGdEKTsKLQkJfQotCQkKLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwkJCi0JCQotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uc0xheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbnNMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWJ1dHRvbnNMYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlidXR0b25zQ29tcG9zaXRlLnNldExheW91dChidXR0b25zTGF5b3V0KTsKLQkJCi0JCWV4cGFuZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULkJVVFRPTjEpOwotCi0JCWV4cGFuZEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImV4cGFuZGFsbC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZXhwYW5kQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19FeHBhbmRBbGwpOyAKLQkJCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7CQkKLQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0KLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQotCQljb2xsYXBzZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbGxhcHNlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCk7IAotCQljb2xsYXBzZUJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0NvbGxhcHNlQWxsKSk7Ci0JCQotCQlnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCi0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QyKTsKLQkJCi0JCWNyZWF0ZUxpbmUoY29tcG9zaXRlLCAzKTsKLQkJY3JlYXRlVmlld2VyTGFiZWwoY29tcG9zaXRlKTsKLQkJLy8gY3JlYXRlIGEgdHJlZXZpZXdlciBhcmVhLgotCQljcmVhdGVWaWV3ZXIoY29tcG9zaXRlKTsKLQotCQlyZXN0b3JlTGFzdFNldHRpbmdzKCk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRmlsdGVyRGlhbG9nX0JyaWVmRGVzY3JpcHRpb24pOyAKLQkJY3RybF9icmllZl9kZXNjID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQl7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJZ2QuaGVpZ2h0SGludCA9IDYwOwotCQkJY3RybF9icmllZl9kZXNjLnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCS8vIFJlc3RvcmUgdGhlIGxhc3Qgc3RhdGUKLQkJY3JlYXRlTGluZShjb21wb3NpdGUsIDMpOwotCi0JCS8vIFJldHVybiByZXN1bHRzLgotCQlhZGRMaXN0ZW5lcigpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyB2aWV3ZXIgaW4gdGhlIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmICh2aWV3ZXJTZWxlY3Rpb25TaW5nbGUpIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJfSBlbHNlIHsKLQkJCXRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCi0JCS8vIFNldCB0aGUgaW5wdXQgdG8gdHJlZVZpZXdlcgotCQl0cmVlVmlld2VyLnNldElucHV0KGdldElucHV0KCkpOwotCi0JCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJaWYgKHRhYlN0ci5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpKSB7IAotCQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IEZpbHRlclNvcnRlckZvckFsbCgpKTsKLQkJfSBlbHNlIHsKLQkJCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBGaWx0ZXJTb3J0ZXIoKSk7Ci0JCX0KLQotCQlHcmlkRGF0YSBzcGVjID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXsKLQkJCXNwZWMud2lkdGhIaW50ID0gMzAwOwotCQkJc3BlYy5oZWlnaHRIaW50ID0gMzAwOwotCQkJc3BlYy5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbnB1dCBpZiBleHRlcm5hbGx5IHNldCBieSBzZXRJbnB1dCBpbnZva2VyLgotCSAqIEVsc2UsIGNhbGN1bGF0ZXMgdGhlIGlucHV0IGJhc2VkIG9uIHRoZSBPYmplY3Qgc2V0IHRvIHRoZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0SW5wdXQoKXsKLQkJaWYoaW5wdXQgIT0gbnVsbCl7Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX1lbHNlewotCQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2Vzcyljb250ZW50RWxlbWVudDsKLQkJCQkJCWlmIChwcm9jZXNzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlpZiAoISh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkKLQkJCQkJCQkJCXx8IHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApIAotCQkJCQkJCQkJfHwgdGFiU3RyLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpKSkgewotCQkJCQkJCXJldHVybiBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXJldHVybiBwcm9jZXNzOwotCQkJCQkJfQotCQkJCX0gCi0JCQkJcmV0dXJuIFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgY29udGVudEVsZW1lbnQpOwotCQkJfSAKLQkJCXJldHVybiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlckxhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgIAkJaWYgKHZpZXdlckxhYmVsICE9IG51bGwpIHsKLSAgIAkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dCh2aWV3ZXJMYWJlbCk7Ci0gICAJCX0KLSAgIAl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKGJvb2xlYW4gc2luZ2xlKSB7Ci0JCXZpZXdlclNlbGVjdGlvblNpbmdsZSA9IHNpbmdsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXIjZG91YmxlQ2xpY2sob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gcy5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcwotCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXNlbGVjdGVkTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0gCi0JCXNhdmVMYXN0U2V0dGluZ3MoKTsKLQkJY2xvc2UoKTsKLQkJaWYoY29tcG9zZWRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaWFsb2cgc3RvcmUgdG8gY2FjaGUgdmFsdWVzIGludG8KLQkgKi8KLQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IChEaWFsb2dTZXR0aW5ncykgQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSAoRGlhbG9nU2V0dGluZ3MpIGRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oRElBTE9HX05BTUUgKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCk7Ci0JCWlmIChzZWN0aW9uID09IG51bGwpCi0JCQlzZWN0aW9uID0gKERpYWxvZ1NldHRpbmdzKSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19OQU1FCi0JCQkJCSsgU1RPUkVfRVhQQU5ERURfTEVWRUxfSUQpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIGRpYWxvZyBzZXR0aW5ncyB0byByZXN0b3JlIHdpZGdldCB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGF0IHRoZXkKLQkgKiBoZWxkIGxhc3QgdGltZSB0aGlzIGRpYWxvZyB3YXMgdXNlZCB0byBjb21wbGV0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVMYXN0U2V0dGluZ3MoKSB7Ci0JCURJQUxPR19OQU1FID0gdGFiU3RyOwotCQlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IChEaWFsb2dTZXR0aW5ncykgZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJU3RyaW5nIHRlbXAgPSBkaWFsb2dTZXR0aW5ncy5nZXQoRElBTE9HX05BTUUgKyBQQVRURVJOX0lEKTsgCi0JCWlmICh0ZW1wICE9IG51bGwgJiYgdGVtcC5sZW5ndGgoKSA+IDApIHsgCi0JCQlwYXR0ZXJuID0gZGlhbG9nU2V0dGluZ3MuZ2V0KERJQUxPR19OQU1FICsgUEFUVEVSTl9JRCk7IAotCQkJZmlsdGVyVHlwZVN0ciA9IGRpYWxvZ1NldHRpbmdzLmdldChESUFMT0dfTkFNRSArIFRZUEVfSUQpOyAKLQkJCWZpbHRlclR5cGUuc2V0VGV4dChmaWx0ZXJUeXBlU3RyKTsKLQkJCXJlZ2V4UGF0dGVybiA9IGdldFJlZ0V4KHBhdHRlcm4pOwotCQkJCi0JCQkvL1RyaW0gIioiIGZyb20gcGF0dGVybiBzdHJpbmcgYmVmb3JlIGRpc3BsYXkuIFRoaXMgYWN0aW9uIGlzIGp1c3QgZm9yIGRpc3BsYXkuCi0vLwkJCWlmKHBhdHRlcm4gIT0gbnVsbCl7Ci0vLwkJCQlpZihwYXR0ZXJuLmxhc3RJbmRleE9mKEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HKSAKLS8vCQkJCQkJPT0gcGF0dGVybi5sZW5ndGgoKS0xKXsKLS8vCQkJCQlwYXR0ZXJuID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgcGF0dGVybi5sZW5ndGgoKS0xKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJY3RybF9wYXR0ZXJuLnNldFRleHQocGF0dGVybik7Ci0JCQkKLQkJCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJCWhlbHBlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCWhlbHBlci5zZXRSZWdleFBhdHRlcm4ocmVnZXhQYXR0ZXJuKTsKLQkJCQloZWxwZXIuc2V0RmlsdGVyVHlwZVN0cihmaWx0ZXJUeXBlU3RyKTsKLQkJCX0KLQkJCWluaXRQcm92aWRlckZvclRhYnMoKTsKLQotCQl9Ci0JCUxpc3QgZWxlbWVudHMgPSAoTGlzdCkgRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAuZ2V0KERJQUxPR19OQU1FCi0JCQkJKyBTVE9SRV9FWFBBTkRFRF9MRVZFTF9JRCk7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChlbGVtZW50cyAhPSBudWxsICYmICFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCXRyeSB7Ci0JCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGVsZW1lbnRzLnRvQXJyYXkoKSk7Ci0JCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRyYXZlcnNlVHJlZShUcmVlSXRlbVtdIGl0ZW1zLCBMaXN0IGxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW1bXSBpdGVtc3ggPSBpdGVtc1tpXS5nZXRJdGVtcygpOwotCQkJaWYgKGl0ZW1zeC5sZW5ndGggPiAxKSB7Ci0JCQkJbGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQl0cmF2ZXJzZVRyZWUoaXRlbXN4LCBsaXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmNlIE9LIHdhcyBwcmVzc2VkLCB3cml0ZSB3aWRnZXQgdmFsdWVzIHRvIHRoZSBkaWFsb2cgc3RvcmUgc28gdGhhdAotCSAqIHRoZXkgd2lsbCBwZXJzaXN0IGludG8gdGhlIG5leHQgaW52b2NhdGlvbiBvZiB0aGlzIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVWYWx1ZXMoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQlPYmplY3RbXSBvYmplY3RBcnIgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RBcnIubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iamVjdEFycltpXSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IAotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2VzcyAKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCXNlbGVjdGVkTGlzdC5hZGQob2JqKTsKLQkJCQl9IAotCQkJfQotCQl9Ci0JCXNhdmVMYXN0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbGFzdCBzZXR0aW5ncyBvZiBkaWFsb2cuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUxhc3RTZXR0aW5ncygpIHsKLQotCQkvLyBlY2xpcHNlIGRvY3MgZm9ySURpYWxvZ1NldHRpbmdzIGZvciB1bmRlcnN0YW5kaW5nLgotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlESUFMT0dfTkFNRSA9IHRhYlN0cjsKLQkJT2JqZWN0W10gZXhwYW5kZWRFbGVtZW50cyA9IHRyZWVWaWV3ZXIuZ2V0RXhwYW5kZWRFbGVtZW50cygpOwotCQlMaXN0IGV4cGFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFN0cmluZ1tdIGV4cGFuZGVkQ2F0ZWdvcnlJZHMgPSBuZXcgU3RyaW5nW2V4cGFuZGVkRWxlbWVudHMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBhbmRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZXhwYW5kZWRFbGVtZW50c1tpXTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQlleHBhbmRMaXN0LmFkZChleHBhbmRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQlzZXR0aW5ncy5wdXQoRElBTE9HX05BTUUgKyBQQVRURVJOX0lELCBwYXR0ZXJuKTsKLQkJc2V0dGluZ3MucHV0KERJQUxPR19OQU1FICsgVFlQRV9JRCwgZmlsdGVyVHlwZVN0cik7Ci0JCUZpbHRlckNvbnN0YW50cy5oYXNoTWFwLnB1dChESUFMT0dfTkFNRSArIFNUT1JFX0VYUEFOREVEX0xFVkVMX0lELAotCQkJCWV4cGFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIGV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl1cGRhdGVTZWxlY3Rpb24oZXZlbnQpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBidXR0b24gZW5hYmxlbWVudCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkvLyBva0J1dHRvbi5zZXRFbmFibGVkKGdldFNlbGVjdGlvbigpLmxlbmd0aCA+IDApOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50T2JqZWN0KE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlyZXR1cm4gTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgc2VsZWN0aW9uIG9iamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIEFycmF5TGlzdCBkZXNjcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB8fAotCQkJCXNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcil7Ci0JCQlPYmplY3QgdW53cmFwID0gIFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24odW53cmFwKTsKLQkJfWVsc2UgewotCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogU2V0IHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZmlsbEZpbHRlclR5cGVDb21ibygpIHsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25GaWx0ZXIpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5PTkxZX0NPTlRFTlRfRUxFTUVOVFMuZXF1YWxzKHRhYlN0cikpIHsKLQkJCVN0cmluZyBzcGFjZSA9ICItIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1syNl07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5DSEVDS0xJU1RTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5ST0FETUFQOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5URU1QTEFURVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5URVJNX0RFRklOSVRJT05TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5ET01BSU5TOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuVE9PTFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLmNhdGVnb3J5U3Rycy5jb250YWlucyh0YWJTdHIpKSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzJdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJc3RyWzFdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUy5lcXVhbHNJZ25vcmVDYXNlKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMl07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlzdHJbMV0gPSBGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUzsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSBpZiAoRmlsdGVyQ29uc3RhbnRzLmJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMV07Ci0JCQlzdHJbMF0gPSAoU3RyaW5nKSB0YWJTdHI7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5jb250ZW50RWxlbWVudFN0cnMuY29udGFpbnModGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1szXTsKLQkJCXN0clswXSA9IHRhYlN0cjsKLQkJCXN0clsxXSA9IEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTOwotCQkJc3RyWzJdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCQlmaWx0ZXJUeXBlLnNldEl0ZW1zKHN0cik7Ci0JCQlmaWx0ZXJUeXBlU3RyID0gc3RyWzBdOwotCQl9IGVsc2UgaWYgKEZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMuZXF1YWxzKHRhYlN0cikpIHsgLy8gMTcyOTU2Ci0JCQlTdHJpbmcgc3BhY2UgPSAiLSI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbMjhdOwotCQkJaW50IGkgPSAwOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ09OVEVOVF9QQUNLQUdFUzsKLQkJCXN0cltpKytdID0gc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUk9MRVM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCQkJc3RyW2krK10gPSBzcGFjZSArIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JCQlzdHJbaSsrXSA9IHNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCQkrIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuUk9BRE1BUDsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuVEVNUExBVEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuc3BhY2UKLQkJCQkJKyBGaWx0ZXJDb25zdGFudHMuVEVSTV9ERUZJTklUSU9OUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJCSsgRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuRE9NQUlOUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLlRPT0xTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVM7Ci0JCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfSBlbHNlIGlmIChGaWx0ZXJDb25zdGFudHMuQ09ORklHX0NPTlRFTlRfRUxFTUVOVC5lcXVhbHModGFiU3RyKSkgewotCQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxXTsKLQkJCXN0clswXSA9IChTdHJpbmcpIHRhYlN0cjsKLQkJCWZpbHRlclR5cGUuc2V0SXRlbXMoc3RyKTsKLQkJCWZpbHRlclR5cGVTdHIgPSBzdHJbMF07Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzFdOwotCQkJc3RyWzBdID0gKFN0cmluZykgdGFiU3RyOwotCQkJZmlsdGVyVHlwZS5zZXRJdGVtcyhzdHIpOwotCQkJZmlsdGVyVHlwZVN0ciA9IHN0clswXTsKLQkJfQotCX0KLQotCXB1YmxpYyBsb25nIGRlbGF5ID0gODAwOwotCQotCXByaXZhdGUgY2xhc3MgVXBkYXRlVHJlZUpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIFVwZGF0ZVRyZWVKb2IoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkJLy8gbmVlZCB0byBydW4gdGhpcyBpbiBVSSB0aHJlYWQKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmICh0cmVlVmlld2VyID09IG51bGwgfHwgCi0JCQkJCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkgPT0gbnVsbCB8fAotCQkJCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmNsZWFyQWxsKHRydWUpOwotCQkJCQlpZiAoY3RybF9wYXR0ZXJuLmdldFRleHQoKSAhPSBudWxsCi0JCQkJCQkJJiYgY3RybF9wYXR0ZXJuLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlwYXR0ZXJuID0gY3RybF9wYXR0ZXJuLmdldFRleHQoKS50cmltKCk7Ci0JCQkJCQkvLyBpZihwYXR0ZXJuLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLkFOWV9TVFJJTkcpPiAtMQotCQkJCQkJLy8gfHwgcGF0dGVybi5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5BTllfQ0hBUkFDVEVSKSA+Ci0JCQkJCQkvLyAtMSl7Ci0JCQkJCQkvLyAgICAgICAgICAgICAgCi0JCQkJCQkvLyB9ZWxzZXsKLQkJCQkJCS8vIHBhdHRlcm4gPSBwYXR0ZXJuK0ZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HOwotCQkJCQkJLy8gfQotCQkJCQl9IGVsc2UgewotCQkJCQkJcGF0dGVybiA9IEZpbHRlckNvbnN0YW50cy5BTllfU1RSSU5HOwotCQkJCQkJLy8gcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXJlZ2V4UGF0dGVybiA9IGdldFJlZ0V4KHBhdHRlcm4pOwotCQkJCQlpZiAoaGVscGVyICE9IG51bGwpIHsKLQkJCQkJCWhlbHBlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCQkJaGVscGVyLnNldFJlZ2V4UGF0dGVybihyZWdleFBhdHRlcm4pOwotCQkJCQkJaGVscGVyLnNldEZpbHRlclR5cGVTdHIoZmlsdGVyVHlwZVN0cik7Ci0JCQkJCQloZWxwZXIuc2V0VGFiU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hUcmVlVmlld2VyKCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBVcGRhdGVUcmVlSm9iIHRyZWVKb2IgPSBuZXcgVXBkYXRlVHJlZUpvYihBdXRob3JpbmdVSVJlc291cmNlcy5JdGVtc0ZpbHRlckRpYWxvZ19VcGRhdGVUcmVlSm9iX25hbWUpOwotCQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKCkgewotCQljdHJsX3BhdHRlcm4uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCi0JCQkgIGlmICh0cmVlSm9iLmdldFN0YXRlKCkgPT0gSm9iLk5PTkUpIHsKLQkJCSAgICAvLyBXZSBzaG91bGQgc2NoZWR1bGUgdGhlIGpvYiB0byBydW4KLQkJCSAgICB0cmVlSm9iLnNjaGVkdWxlKGRlbGF5KTsKLQkJCSAgfSBlbHNlIGlmICh0cmVlSm9iLmdldFN0YXRlKCkgPT0gSm9iLldBSVRJTkcgfHwKLQkJCQkJICB0cmVlSm9iLmdldFN0YXRlKCkgPT0gSm9iLlNMRUVQSU5HKXsKLQkJCSAgICAvLyBDYW5jZWwgdGhlIHByZXZpb3VzIGpvYiwgYW5kIHJlc2NoZWR1bGUKLQkJCSAgICB0cmVlSm9iLmNhbmNlbCgpOwotCQkJICAgIHRyZWVKb2Iuc2NoZWR1bGUoZGVsYXkpOwotCQkJICB9Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbHRlclR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIHVwZGF0ZUZvbnRMaXN0KCk7Ci0JCQkJaWYgKGZpbHRlclR5cGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IC0xKSB7Ci0JCQkJCWZpbHRlclR5cGVTdHIgPSBmaWx0ZXJUeXBlLmdldEl0ZW0oZmlsdGVyVHlwZQotCQkJCQkJCS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQl9Ci0JCQkJZmlsdGVyVHlwZVN0ci50cmltKCk7Ci0JCQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQkJCWhlbHBlci5zZXRQYXR0ZXJuKHBhdHRlcm4pOwotCQkJCQloZWxwZXIuc2V0UmVnZXhQYXR0ZXJuKHJlZ2V4UGF0dGVybik7Ci0JCQkJCWhlbHBlci5zZXRGaWx0ZXJUeXBlU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCQloZWxwZXIuc2V0VGFiU3RyKGZpbHRlclR5cGVTdHIpOwotCQkJCX0KLQkJCQkvLyBpbml0UHJvdmlkZXJGb3JUYWJzKCk7Ci0JCQkJcmVmcmVzaFRyZWVWaWV3ZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IHNlbGVjdGlvbmV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkJCQotCQkJCWV4cGFuZE9yQ29sbGFwc2UodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQljb2xsYXBzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlleHBhbmRPckNvbGxhcHNlKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldFNlbGVjdGVkSXRlbXMoKSB7Ci0JCXJldHVybiBzZWxlY3RlZExpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlckZvclRhYnMoKSB7Ci0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsdGVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyKSB7Ci0JCQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNhdGVnb3J5RmlsdGVyKXsKLQkJCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgY29udGVudGNhdGVnb3J5LgotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDUyCi0JCQkJCWhlbHBlci5zZXRDb250ZW50Q2F0ZWdvcnlUYWJTdHIodGFiU3RyKTsKLQkJCQl9Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5zZXRIZWxwZXIoaGVscGVyKTsKLQkJCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHsKLQkJCQkoKERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSBmaWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfWVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcikgewotCQkJCSgoRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKSBmaWx0ZXIpLnNldEhlbHBlcihoZWxwZXIpOwotCQkJfQotCQl9Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJUHJvY2Vzc0ZpbHRlcikgewotCQkJaWYgKHRhYlN0cgotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTKSkgewotCQkJCWFkYXB0ZXJGYWN0b3J5ID1UbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsKLQkJCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9IGVsc2UgaWYgKHRhYlN0cgotCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUykpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpOyAKLQkJCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJCWNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpewotCQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGluZGV4KSB7Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKTsgCi0JCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJY29tcG9zZWRBZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4aXN0aW5nRWxlbWVudHMoTGlzdCBsaXN0KSB7Ci0JCXRoaXMuYWxyZWFkeVNlbGVjdGVkTGlzdCA9IGxpc3Q7Ci0JCWlmIChoZWxwZXIgIT0gbnVsbCkgewotCQkJaGVscGVyLnNldEFscmVhZHlTZWxlY3RlZExpc3QobGlzdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRmlsdGVySGVscGVyIGdldEhlbHBlcigpIHsKLQkJcmV0dXJuIHRoaXMuaGVscGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlQXJyYXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogc2V0cyB0aGUgQ29udGVudFByb3ZpZGVyIHVzZWQgYnkgVHJlZVZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50UHJvdmlkZXIoSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMuY29udGVudFByb3ZpZGVyID0gY29udGVudFByb3ZpZGVyOwotCQl0aGlzLmNvbXBvc2VkQWRhcHRlckZhY3RvcnkgPSBjb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qCi0JICogUGFzc2luZyBTdHJpbmdbXSBhcnJheSBmaWxscyB0aGUgRmlsdGVyVHlwZSBsaXN0IGluIGRyb3Bkb3duIGNvbWJvIGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlcyhTdHJpbmdbXSBzdHIpIHsKLQkJdGhpcy50eXBlcyA9IHN0cjsKLQl9Ci0KLQkvKgotCSAqIHNldCB0aGUgRmlsdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5maWx0ZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklGaWx0ZXIpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUZpbHRlcikgdGhpcy5maWx0ZXIpCi0JCQkJCQkuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2YgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIpIHsKLQkJCQkoKERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyKSB0aGlzLmZpbHRlcikuc2V0SGVscGVyKGhlbHBlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCXRoaXMuaW5wdXQgPSBpbnB1dDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlckxhYmVsKFN0cmluZyB2aWV3ZXJMYWJlbCkgewotCQl0aGlzLnZpZXdlckxhYmVsID0gdmlld2VyTGFiZWw7Ci0JfQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFRyZWVWaWV3ZXIoKXsKLQkJdHJ5IHsKLQkJCS8vIFRvIGltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgZmlsdGVyLCBmaWx0ZXIgZmlyc3QgYW5kIHJlc2V0IHZpc2libGUgdG8KLQkJCS8vIHRydWUuVGhpcyB3aWxsIGF2b2lkIHRoZSBmbGlja2VyaW5nIGluIFVJIGF0IHRpbWUgb2YgZmlsdGVyaW5nCi0JCQkvLyBlbGVtZW50cyBpbiB0aGUgdHJlZSBzdHJ1Y3R1cmUKLQkJCQotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuY2xlYXJBbGwodHJ1ZSk7Ci0JCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJdHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQkJCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBleHBhbmRPckNvbGxhcHNlKGJvb2xlYW4gZXhwYW5kKXsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCWlmKGV4cGFuZCl7Ci0JCQl0cmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCQl9ZWxzZXsKLQkJCXRyZWVWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJfQotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIFBhdHRlcm4gZ2V0UmVnRXgoU3RyaW5nIHBhdHRlcm4pewotCQl0cnl7Ci0JCQlyZXR1cm4gUGF0dGVybkNvbnN0cnVjdG9yLmNyZWF0ZVBhdHRlcm4ocGF0dGVybiwgZmFsc2UsIGZhbHNlKTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCXJldHVybiBQYXR0ZXJuQ29uc3RydWN0b3IuY3JlYXRlUGF0dGVybihGaWx0ZXJDb25zdGFudHMuQU5ZX1NUUklORywgZmFsc2UsIGZhbHNlKTsgCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEFkZEltYWdlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkSW1hZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1ODA2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkSW1hZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZEltYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBIVE1MCi0gKiA8aW1nPiB0YWcgaW4gdGhlIFJpY2ggVGV4dCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RBZGRJbWFnZURpYWxvZyBleHRlbmRzIEFkZEltYWdlRGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSEVJR0hUID0gNjAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9XSURUSCA9IDYwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDIwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMjAwOwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEZpbGUgZmlsZVRvQ29weTsKLQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRMb2M7Ci0KLQlwcml2YXRlIGludCBoZWlnaHQgPSBERUZBVUxUX0hFSUdIVDsKLQotCXByaXZhdGUgaW50IHdpZHRoID0gREVGQVVMVF9XSURUSDsKLQotCXByaXZhdGUgU3RyaW5nIGFsdFRhZyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRleHQgaGVpZ2h0VGV4dDsKLQotCXByaXZhdGUgVGV4dCB3aWR0aFRleHQ7Ci0KLQlwcml2YXRlIFRleHQgYWx0VGFnVGV4dDsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGV2ZW50LndpZGdldCA9PSB1cmxUZXh0KSB7Ci0JCQkJCQlGaWxlIHVybEZpbGUgPSBuZXcgRmlsZSh1cmxUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQkJaWYgKHVybEZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0JCQkJCQkJZmlsZVRvQ29weSA9IHVybEZpbGU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWZpbGVUb0NvcHkgPSBuZXcgRmlsZShlbGVtZW50TG9jLCB1cmxUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGZpbGVUb0NvcHkuaXNGaWxlKCkgJiYgZmlsZVRvQ29weS5jYW5SZWFkKCkpIHsKLQkJCQkJCQkvLyBUcnkgdG8gZ2V0IHRoZSBpbWFnZSBpbmZvLgotCQkJCQkJCXNldEltYWdlSW5mbyhmaWxlVG9Db3B5LmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQloZWlnaHQgPSBJbnRlZ2VyLnBhcnNlSW50KGhlaWdodFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCXdpZHRoID0gSW50ZWdlci5wYXJzZUludCh3aWR0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmlsZVRvQ29weS5pc0ZpbGUoKSAmJiBmaWxlVG9Db3B5LmNhblJlYWQoKSAmJiBoZWlnaHQgPiAwCi0JCQkJCQkJJiYgd2lkdGggPiAwKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZiB0aGUgYWJvdmUgZmFpbHMsIGxldCB0aGUgdXNlciBjbGljayBvayBpZiB0aGUgZmlsZSBpcyByZWFkYWJsZQotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZpbGVUb0NvcHkuaXNGaWxlKCkgJiYgZmlsZVRvQ29weS5jYW5SZWFkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2hlbGwuCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEFkZEltYWdlRGlhbG9nKFNoZWxsIHBhcmVudCwgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JCWVsZW1lbnRMb2MgPSBSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgobWV0aG9kRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5CYXNlRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlCi0JICogICAgICBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSA0OwotCQkoKEdyaWREYXRhKSB1cmxUZXh0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCXVybFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodXJsVGV4dExpc3RlbmVyKTsKLQkJdXJsVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJYnJvd3NlQnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGJyb3dzZVNlbGVjdGlvbkFkYXB0ZXIpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKG1ldGhvZEVsZW1lbnQpKTsKLQkJCQlTdHJpbmcgYXR0YWNoRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGF0dGFjaEZpbGUgIT0gbnVsbCAmJiBhdHRhY2hGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCQl0cnkgewotCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwgZGlhbG9nCi0JCQkJCQkJCS5nZXRGaWxlTmFtZSgpKTsKLQkJCQkJCXVybFRleHQuc2V0VGV4dChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJTGFiZWwgaGVpZ2h0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhlaWdodExhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuaGVpZ2h0TGFiZWxfdGV4dCk7IAotCi0JCWhlaWdodFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQloZWlnaHRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQloZWlnaHRUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX0hFSUdIVCk7IC8vJE5PTi1OTFMtMSQKLQkJaGVpZ2h0VGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgaW1hZ2VTaXplTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlnZC52ZXJ0aWNhbFNwYW4gPSAyOwotCQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQkJaW1hZ2VTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCX0KLQkJaW1hZ2VTaXplTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5pbWFnZVNpemVMYWJlbF90ZXh0KTsgCi0KLQkJTGFiZWwgd2lkdGhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJd2lkdGhMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLndpZHRoTGFiZWxfdGV4dCk7IAotCi0JCXdpZHRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXdpZHRoVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJd2lkdGhUZXh0LnNldFRleHQoIiIgKyBERUZBVUxUX1dJRFRIKTsgLy8kTk9OLU5MUy0xJAotCQl3aWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUxhYmVsIGFsdExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhbHRMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFsdFRhZ0xhYmVsX3RleHQpOyAKLQkJYWx0VGFnVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlhbHRUYWdUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCWFsdFRhZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBldmVudCkgewotCQkJCWFsdFRhZyA9IGFsdFRhZ1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHRvIGJlIGNvcGllZCB0byBhIHJlc291cmNlIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlVG9Db3B5KCkgewotCQlyZXR1cm4gZmlsZVRvQ29weTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SW1hZ2VJbmZvKFN0cmluZyBpbWFnZU5hbWUpIHsKLQkJRmlsZSBpbWFnZUZpbGUgPSBuZXcgRmlsZShpbWFnZU5hbWUpOwotCQlpZiAoaW1hZ2VGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGltYWdlTmFtZSk7Ci0JCQkJaGVpZ2h0VGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKGltYWdlRGF0YS5oZWlnaHQpKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihpbWFnZURhdGEud2lkdGgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2V0IGRlZmF1bHQgaGVpZ2h0L3dpZHRoIGlmIHdlIGNhbid0IG9idGFpbiBJbWFnZURhdGEKLQkJCQloZWlnaHRUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoREVGQVVMVF9IRUlHSFQpKTsKLQkJCQl3aWR0aFRleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihERUZBVUxUX1dJRFRIKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQloZWlnaHRUZXh0LnNldFRleHQoU3RyaW5nLnZhbHVlT2YoREVGQVVMVF9IRUlHSFQpKTsKLQkJCXdpZHRoVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKERFRkFVTFRfV0lEVEgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGhlaWdodC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIE1hdGgubWluKE1BWF9IRUlHSFQsIE1hdGgubWF4KDEwLCBoZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSB3aWR0aC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdpZHRoKCkgewotCQlyZXR1cm4gTWF0aC5taW4oTUFYX1dJRFRILCBNYXRoLm1heCgxMCwgd2lkdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBBTFQgdGFnLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0VGFnKCkgewotCQlyZXR1cm4gYWx0VGFnOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRMaW5rRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kQWRkTGlua0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjdiMjViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9NZXRob2RBZGRMaW5rRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWRkTGlua0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRMaW5rRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBsaW5rIHR5cGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgSFRNTCA8YT4KLSAqIHRhZyBpbiB0aGUgUmljaCBUZXh0IEVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEFkZExpbmtEaWFsb2cgZXh0ZW5kcyBBZGRMaW5rRGlhbG9nIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX1VSTCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElOS19GSUxFID0gTElOS19VUkwgKyAxOwotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfRUxFTUVOVF9MSU5LID0gTElOS19VUkwgKyAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJTktfRUxFTUVOVF9MSU5LX1dJVEhfVFlQRSA9IExJTktfVVJMICsgMzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSU5LX0VMRU1FTlRfTElOS19XSVRIX1VTRVJfVEVYVCA9IExJTktfVVJMICsgNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVMRU1FTlRfVFlQRV9MQUJFTFMgPSB7Ci0JCQlMaWJyYXJ5VUlSZXNvdXJjZXMubGlua1RvVVJMX25hbWUsCi0JCQlMaWJyYXJ5VUlSZXNvdXJjZXMubGlua1RvRmlsZV9uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rX25hbWUsCi0JCQlMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lLAotCQkJTGlicmFyeVVJUmVzb3VyY2VzLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0X25hbWUgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTElOS19JTl9ORVdfV0lORE9XX0FUVFJJQlVURSA9ICJ0YXJnZXQ9XCJfYmxhbmtcIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0OwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudExvYzsKLQotCXByaXZhdGUgQ29tYm8gbGlua1R5cGVDb21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIG9wZW5MaW5rQ2hlY2tib3g7Ci0KLQlwcml2YXRlIGludCBsaW5rVHlwZTsKLQotCXByaXZhdGUgYm9vbGVhbiBvcGVuTGlua0luTmV3V2luZG93ID0gdHJ1ZTsKLQotCXByaXZhdGUgRmlsZSBmaWxlVG9Db3B5OwotCQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGxpbmtUeXBlID09IExJTktfRklMRSAmJiBldmVudC53aWRnZXQgPT0gdXJsVGV4dCkgewotCQkJCQkJRmlsZSB1cmxGaWxlID0gbmV3IEZpbGUodXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJCWlmICh1cmxGaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJCWZpbGVUb0NvcHkgPSB1cmxGaWxlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmaWxlVG9Db3B5ID0gbmV3IEZpbGUoZWxlbWVudExvYywgdXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJCX0KLQkJCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZmlsZVRvQ29weS5pc0ZpbGUoKSAmJiBmaWxlVG9Db3B5LmNhblJlYWQoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHVybFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgQSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQWRkTGlua0RpYWxvZyhTaGVsbCBwYXJlbnQsIElNZXRob2RSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihwYXJlbnQsIHJpY2hUZXh0LmdldEJhc2VQYXRoKCkpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IHJpY2hUZXh0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJZWxlbWVudExvYyA9IFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChtZXRob2RFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkJhc2VEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUKLQkgKiAgICAgIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0KLQkJTGFiZWwgbGlua1R5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGlua1R5cGVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZExpbmtEaWFsb2dfbGlua1R5cGUpOwotCQlsaW5rVHlwZUxhYmVsLm1vdmVBYm92ZSh1cmxMYWJlbCk7Ci0JCQotCQl1cmxUZXh0LnJlbW92ZU1vZGlmeUxpc3RlbmVyKHVybFRleHRNb2RpZnlMaXN0ZW5lcik7Ci0JCXVybFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0KLQkJbGlua1R5cGVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgY29tYm9HcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQljb21ib0dyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGlua1R5cGVDb21iby5zZXRMYXlvdXREYXRhKGNvbWJvR3JpZERhdGEpOwotCQlsaW5rVHlwZUNvbWJvLnNldEl0ZW1zKEVMRU1FTlRfVFlQRV9MQUJFTFMpOwotCQlsaW5rVHlwZUNvbWJvLnNldFRleHQoRUxFTUVOVF9UWVBFX0xBQkVMU1swXSk7Ci0JCWxpbmtUeXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlsaW5rVHlwZSA9IGxpbmtUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChsaW5rVHlwZSAhPSBMSU5LX1VSTCk7Ci0JCQkJdXJsRGlzcGxheU5hbWVMYWJlbC5zZXRFbmFibGVkKGxpbmtUeXBlID09IExJTktfVVJMKTsKLQkJCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0RW5hYmxlZChsaW5rVHlwZSA9PSBMSU5LX1VSTCk7Ci0JCQkJaWYgKGxpbmtUeXBlID09IExJTktfVVJMKSB7Ci0JCQkJCXVybERpc3BsYXlOYW1lVGV4dAotCQkJCQkJCS5zZXRUZXh0KHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0VGV4dCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1cmxEaXNwbGF5TmFtZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJb3BlbkxpbmtDaGVja2JveC5zZXRFbmFibGVkKGxpbmtUeXBlID09IExJTktfVVJMCi0JCQkJCQl8fCBsaW5rVHlwZSA9PSBMSU5LX0ZJTEUpOwotCQkJCXVybFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobGlua1R5cGUgIT0gTElOS19GSUxFKSB7Ci0JCQkJCWZpbGVUb0NvcHkgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlsaW5rVHlwZUNvbWJvLm1vdmVBYm92ZSh1cmxMYWJlbCk7Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuQlJPV1NFX0JVVFRPTl9URVhUKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWlmIChsaW5rVHlwZSA9PSBMSU5LX0ZJTEUpIHsKLQkJCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGJhc2VQYXRoKTsKLQkJCQkJU3RyaW5nIGF0dGFjaEZpbGUgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoYXR0YWNoRmlsZSAhPSBudWxsICYmIGF0dGFjaEZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpYWxvZy5nZXRGaWx0ZXJQYXRoKCksIGRpYWxvZwotCQkJCQkJCQkJLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJCXVybFRleHQuc2V0VGV4dChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIE1ldGhvZEVsZW1lbnQgbGluawotCQkJCWVsc2UgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBBZGRMaW5rRmlsdGVyKCkgewotCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJaWYob2JqIGluc3RhbmNlb2YgTWlsZXN0b25lKSByZXR1cm4gZmFsc2U7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBtZXRob2RFbGVtZW50LAotCQkJCQkJCUZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUyk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJQXJyYXlMaXN0IHNlbCA9IGZkLmdldFNlbGVjdGVkSXRlbXMoKTsKLQkJCQkJaWYgKHNlbC5zaXplKCkgPiAwKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IHNlbGVjdGVkRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBzZWwKLQkJCQkJCQkJLmdldCgwKTsKLQkJCQkJCVN0cmluZyB1cmwgPSBudWxsOwotCQkJCQkJU3RyaW5nIGhyZWYgPSBSZXNvdXJjZUhlbHBlci5nZXRVcmwoc2VsZWN0ZWRFbGVtZW50LAotCQkJCQkJCQltZXRob2RFbGVtZW50LCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAobGlua1R5cGUgPT0gTElOS19FTEVNRU5UX0xJTktfV0lUSF9VU0VSX1RFWFQpIHsKLQkJCQkJCQlTdHJpbmcgbGlua05hbWUgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkKLQkJCQkJCQkJCS5nZXRTZWxlY3RlZCgpLmdldFRleHQoKTsKLQkJCQkJCQlpZiAobGlua05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCQkJCWxpbmtOYW1lID0gc2VsZWN0ZWRFbGVtZW50LmdldE5hbWUoKTsKLQkJCQkJCQl1cmwgPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJCQkJLmdldEVsZW1lbnRMaW5rKHNlbGVjdGVkRWxlbWVudCwgbGlua05hbWUsCi0JCQkJCQkJCQkJCSJmaWxlOi8vIiArIGhyZWYpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gd2l0aFR5cGUgPSAobGlua1R5cGUgPT0gTElOS19FTEVNRU5UX0xJTktfV0lUSF9UWVBFKSA/IHRydWUKLQkJCQkJCQkJCTogZmFsc2U7Ci0JCQkJCQkJdXJsID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJCQkJCS5nZXRFbGVtZW50TGluayhzZWxlY3RlZEVsZW1lbnQsIHdpdGhUeXBlLAotCQkJCQkJCQkJCQkiZmlsZTovLyIgKyBocmVmKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJdXJsVGV4dC5zZXRUZXh0KHVybCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlicm93c2VCdXR0b24ubW92ZUFib3ZlKHVybERpc3BsYXlOYW1lTGFiZWwpOwotCi0JCW9wZW5MaW5rQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgY2hlY2tCb3hHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQljaGVja0JveEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJb3BlbkxpbmtDaGVja2JveC5zZXRMYXlvdXREYXRhKGNoZWNrQm94R3JpZERhdGEpOwotCQlvcGVuTGlua0NoZWNrYm94LnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbkxpbmtDaGVja2JveF90ZXh0KTsKLQkJb3BlbkxpbmtDaGVja2JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCW9wZW5MaW5rQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkxpbmtJbk5ld1dpbmRvdyA9IG9wZW5MaW5rQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXVybERpc3BsYXlOYW1lVGV4dC5zZXRUZXh0KHJpY2hUZXh0LmdldFNlbGVjdGVkKCkuZ2V0VGV4dCgpKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgdG8gYmUgY29waWVkIHRvIGEgcmVzb3VyY2UgZm9sZGVyLgotCSAqLwotCXB1YmxpYyBGaWxlIGdldEZpbGVUb0NvcHkoKSB7Ci0JCXJldHVybiBmaWxlVG9Db3B5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGxpbmsgc2hvdWxkIGJlIG9wZW5lZCBpbiBhIG5ldyBicm93c2VyCi0JICogd2luZG93LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE9wZW5MaW5rSW5OZXdXaW5kb3coKSB7Ci0JCXJldHVybiBvcGVuTGlua0luTmV3V2luZG93OwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlTdHJpbmcgdXJsID0gdXJsVGV4dC5nZXRUZXh0KCk7Ci0JCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAobGlua1R5cGUgPT0gTElOS19VUkwpIHsKLQkJCQlTdHJpbmcgdXJsRGlzcGxheU5hbWUgPSB1cmxEaXNwbGF5TmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJCWlmICh1cmxEaXNwbGF5TmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl1cmxEaXNwbGF5TmFtZSA9IHVybDsKLQkJCQl9Ci0JCQkJU3RyaW5nIGZ1bGxVUkwgPSAiPGEgaHJlZj1cIiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQl1cmwKLQkJCQkJCSsgIlwiIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCShvcGVuTGlua0luTmV3V2luZG93ID8gIiAiICsgT1BFTl9MSU5LX0lOX05FV19XSU5ET1dfQVRUUklCVVRFIDogIiIpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkiPiIgKyB1cmxEaXNwbGF5TmFtZSArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbGluay5zZXRVUkwoZnVsbFVSTCk7Ci0JCQl9IGVsc2UgewotCQkJCWxpbmsuc2V0VVJMKHVybCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgd2lkZ2V0IHRleHQgdG8gYmxhbmsgc28gc3VwZXIub2tQcmVzc2VkIGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZQotCQkvLyBhYm92ZS4KLQkJdXJsVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCXVybFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kRWxlbWVudEZpbHRlcnNQcm9ibGVtVmlld0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxYmIwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvTWV0aG9kRWxlbWVudEZpbHRlcnNQcm9ibGVtVmlld0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0KLS8qKgotICogRGlhbG9nIGZvciBzaG93aW5nIGRldGFpbHMgaW4gUHJvYmxlbSBWaWV3Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEZpbHRlcnNQcm9ibGVtVmlld0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnRGaWx0ZXJzUHJvYmxlbVZpZXdEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQkJCi0JCUdyb3VwIG9wdGlvbkdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvcHRpb25Hcm91cC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJb3B0aW9uR3JvdXAuc2V0VGV4dCgiT3B0aW9ucyIpOwotCi0JCWZvciAoaW50IGkgPSAxOyBpIDw9IDEwOyBpKyspIHsKLQkJCUJ1dHRvbiBidXR0b24gPSBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KG9wdGlvbkdyb3VwLAotCQkJCQkiT3B0aW9uICIgKyBpLCAxKTsKLQkJfQotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dCgiTWV0aG9kIEVsZW1lbnQgRmlsdGVyIE9wdGlvbnMiKTsgCi0JfQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01vdmVEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9Nb3ZlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWY1OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL01vdmVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuTW92ZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBEaWFsb2cgZm9yIG1vdmluZyBNZXRob2RFbGVtZW50IHdpdGhpbiBNZXRob2RMaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZURpYWxvZyBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQkvLyBwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWRVSSA9IGZhbHNlOwotCi0JLy8gVGhlIHByb2dyZXNzIG1vbml0b3IKLQlwcml2YXRlIFByb2dyZXNzTW9uaXRvclBhcnQgcHJvZ3Jlc3NNb25pdG9yUGFydDsKLQotCXByaXZhdGUgRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHJpdmF0ZSBPYmplY3QgZGVzdGluYXRpb247Ci0KLQlwcml2YXRlIEN1cnNvciB3YWl0Q3Vyc29yOwotCi0JcHJpdmF0ZSBib29sZWFuIG1vdmluZzsKLQotCXB1YmxpYyBNb3ZlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBDb2xsZWN0aW9uIGVsZW1lbnRzVG9Nb3ZlLAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5lZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQotCQkvLyBmaWx0ZXIgb3V0IHRoZSBwcmVkZWZpbmVkIGVsZW1lbnRzIHRvIHByZXZlbnQgdGhlbSBmcm9tIGdldHRpbmcgbW92ZWQKLQkJLy8KLQkJZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9Nb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX2Rlc3RpbmF0aW9uX3RleHQpOyAKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkvLyB0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIodGhpcyk7Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDMwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDMwMDsKLQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoc3BlYyk7Ci0JCX0KLQotCQl0cmVlVmlld2VyLnNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0KLQkJLy8gSW5zZXJ0IGEgcHJvZ3Jlc3MgbW9uaXRvcgotCQlHcmlkTGF5b3V0IHBtbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJcG1sYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCXByb2dyZXNzTW9uaXRvclBhcnQgPSBjcmVhdGVQcm9ncmVzc01vbml0b3JQYXJ0KGNvbXBvc2l0ZSwgcG1sYXlvdXQpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0Ci0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9ncmVzc01vbml0b3JQYXJ0LnNldFZpc2libGUoZmFsc2UpOwotCi0JCXdhaXRDdXJzb3IgPSBwYXJlbnQuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKAotCQkJCVNXVC5DVVJTT1JfV0FJVCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvZ3Jlc3NNb25pdG9yUGFydCBjcmVhdGVQcm9ncmVzc01vbml0b3JQYXJ0KAotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZExheW91dCBwbWxheW91dCkgewotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvclBhcnQoY29tcG9zaXRlLCBwbWxheW91dCwgU1dULkRFRkFVTFQpIHsKLQkJCVN0cmluZyBjdXJyZW50VGFzayA9IG51bGw7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjc2V0QmxvY2tlZChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc2V0QmxvY2tlZChJU3RhdHVzIHJlYXNvbikgewotCQkJCXN1cGVyLnNldEJsb2NrZWQocmVhc29uKTsKLQkJCQlpZiAoIWxvY2tlZFVJKS8vIERvIG5vdCBzaG93IGJsb2NrZWQgaWYgd2UgYXJlIGxvY2tpbmcgdGhlIFVJCi0JCQkJCWdldEJsb2NrZWRIYW5kbGVyKCkuc2hvd0Jsb2NrZWQoZ2V0U2hlbGwoKSwgdGhpcywgcmVhc29uLAotCQkJCQkJCWN1cnJlbnRUYXNrKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuUHJvZ3Jlc3NNb25pdG9yUGFydCNjbGVhckJsb2NrZWQoKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBjbGVhckJsb2NrZWQoKSB7Ci0JCQkJc3VwZXIuY2xlYXJCbG9ja2VkKCk7Ci0JCQkJaWYgKCFsb2NrZWRVSSkvLyBEbyBub3QgdmxlYXIgaWYgd2UgbmV2ZXIgc2V0IGl0Ci0JCQkJCWdldEJsb2NrZWRIYW5kbGVyKCkuY2xlYXJCbG9ja2VkKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLlByb2dyZXNzTW9uaXRvclBhcnQjYmVnaW5UYXNrKGphdmEubGFuZy5TdHJpbmcsCi0JCQkgKiAgICAgIGludCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0JCQkJc3VwZXIuYmVnaW5UYXNrKG5hbWUsIHRvdGFsV29yayk7Ci0JCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3NldFRhc2tOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQkJc3VwZXIuc2V0VGFza05hbWUobmFtZSk7Ci0JCQkJY3VycmVudFRhc2sgPSBuYW1lOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5Qcm9ncmVzc01vbml0b3JQYXJ0I3N1YlRhc2soamF2YS5sYW5nLlN0cmluZykKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQkJCXN1cGVyLnN1YlRhc2sobmFtZSk7Ci0JCQkJLy8gSWYgd2UgaGF2ZW4ndCBnb3QgYW55dGhpbmcgeWV0IHVzZSB0aGlzIHZhbHVlIGZvciBtb3JlCi0JCQkJLy8gY29udGV4dAotCQkJCWlmIChjdXJyZW50VGFzayA9PSBudWxsKQotCQkJCQljdXJyZW50VGFzayA9IG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I2NvbmZpZ3VyZVNoZWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIG5ld1NoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJbmV3U2hlbGwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX21vdmVfdGV4dCk7IAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJZGVzdGluYXRpb24gPSBUbmdVdGlsLnVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWlmIChkb01vdmUoKSkgewotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZERlc3RpbmF0aW9uKCkgewotCQkvLyBwcmV2ZW50aW5nIG1vdmluZyBlbGVtZW50cyB0byBjYXRlZ29yeQotCQkvLwotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGRvIG5vdCBhbGxvdyBtb3ZpbmcgaW50byBTdGFuZGFyZCBDYXRlZ29yaWVzCi0JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgY29udGFpbmVycyBmb3IgY29tcGF0aWJsZSB0eXBlcyB3aWxsIG5vdCB3b3JrIGlmIHdlIHdhbnQgdG8gbW92ZSBhIHN1Yi1hcnRpZmFjdAotCQkvLyB0byBhIGNvbnRlbnQgcGFja2FnZQotCQkvLwotCQkKLS8vCQkvLyBkbyBub3QgYWxsb3cgbW92ZSBpZiBkZXN0aW5hdGlvbiBpcyBub3QgdGhlIHNhbWUgdHlwZSBhcyBldmVyeQotLy8JCS8vIGVsZW1lbnRzJyBlQ29udGFpbmVyCi0vLwkJT2JqZWN0IHJlYWxEZXN0ID0gZGVzdGluYXRpb247Ci0vLwkJaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIHsKLS8vCQkJcmVhbERlc3QgPSAoKFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBkZXN0aW5hdGlvbikKLS8vCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0vLwkJfQotLy8JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCXJlYWxEZXN0ID0gKChUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcikgZGVzdGluYXRpb24pLmdldFRhcmdldCgpOwotLy8JCX0JCQotLy8JCXRyeSB7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLS8vCQkJCWlmIChlIGluc3RhbmNlb2YgRU9iamVjdCkgewotLy8JCQkJCWlmICghcmVhbERlc3QuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKAotLy8JCQkJCQkJKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCkpKQotLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLS8vCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLQkJCi0JCS8vRG8gbm90IGFsbG93IG1vdmluZyBpbnRvIGEgZGVzdGluYXRpb24gd2hpY2ggaXMgCi0JCS8vbG9ja2VkIHRocm91Z2ggZXh0ZW5kZWQgbG9ja2VyLgotCQlpZihWaWV3SGVscGVyLmlzRXh0ZW5kZWRMb2NrZWQoZGVzdGluYXRpb24pKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkKLQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrKSB7Ci0JCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlpZiAoISBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRm9yTW92aW5nVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJCQkoKFZhcmlhYmlsaXR5RWxlbWVudCkgZGVzdGluYXRpb24sIGVsZW1lbnRzKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCS8vIFN1YiBBcnRpZmFjdCBjaXJjdWxhciBjaGVjayBjb2RlCi0JCWVsc2UgaWYoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBBcnRpZmFjdCl7Ci0JCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvckFydGlmYWN0cygoQXJ0aWZhY3QpZGVzdGluYXRpb24sIAotCQkJCQllbGVtZW50cyk7Ci0JCX0JCQotCQkKLQkJQ29tbWFuZCBhZGRDb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgZGVzdGluYXRpb24sCi0JCQkJbnVsbCwgZWxlbWVudHMpOwotCQlib29sZWFuIHJlc3VsdDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGFkZENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJYWRkQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKCFyZXN1bHQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlkZXN0aW5hdGlvbiA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGRlc3RpbmF0aW9uKQotCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQotCQkvLyBJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgoRU9iamVjdCkKLQkJLy8gZGVzdGluYXRpb24sIGdldFNoZWxsKCkpOwotCQkvLyBpZiAoc3RhdHVzLmlzT0soKSkgewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBlbHNlIHsKLQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdldFN0cmluZygiQXV0aG9yaW5nVUlQbHVnaW4ubW92ZURpYWxvZy50aXRsZSIpLAotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vIHN0YXR1cyk7Ci0JCS8vIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZG9Nb3ZlKCkgewotCQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIHByb2JsZW0gPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX25vbW92ZV9kZXN0aW5hdGlvbl9wcm9ibGVtX21zZzsgCi0JCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19zZWxlY3RkZXN0aW5hdGlvbl90ZXh0OyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBtc2cpOyAKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWlzVmFsaWREZXN0aW5hdGlvbigpKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgcHJvYmxlbSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1vdmVEaWFsb2dfaW52YWxpZF9tb3ZlX2Rlc3RpbmF0aW9uX3Byb2JsZW1fbXNnOyAKLQkJCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Nb3ZlRGlhbG9nX3ZhbGlkZGVzdGluYXRpb25fdGV4dDsgCi0JCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCQkJZGlhbG9nLmRpc3BsYXlFcnJvcih0aXRsZSwgcHJvYmxlbSwgbXNnKTsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJKEVPYmplY3QpIGRlc3RpbmF0aW9uLCBnZXRTaGVsbCgpKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19jYW5ub3RNb2RpZnlEZXN0aW5hdGlvbjsgCi0JCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgc3RhdHVzKTsgCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJbW92aW5nID0gdHJ1ZTsKLQkJZmluYWwgU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQlzaGVsbC5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0KLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlwcm9ncmVzc01vbml0b3JQYXJ0LnNldFZpc2libGUodHJ1ZSk7Ci0JCXByb2dyZXNzTW9uaXRvclBhcnQKLQkJCQkuYmVnaW5UYXNrKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuTW92ZURpYWxvZ19tb3ZpbmdfdGV4dCwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgCi0JCU1vdmVPcGVyYXRpb24gbW92ZU9wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBjb21tYW5kCi0JCQkvLwotCQkJQ29tbWFuZCBjb21tYW5kID0gQWRkQ29tbWFuZC5jcmVhdGUoZWRpdGluZ0RvbWFpbiwgZGVzdGluYXRpb24sCi0JCQkJCW51bGwsIGVsZW1lbnRzKTsKLQotCQkJbW92ZU9wID0gbmV3IE1vdmVPcGVyYXRpb24oY29tbWFuZCwgcHJvZ3Jlc3NNb25pdG9yUGFydCwgc2hlbGwpOwotCQkJbW92ZU9wLnJ1bigpOwotCQl9IGZpbmFsbHkgewotCQkJbW92aW5nID0gZmFsc2U7Ci0JCQlwcm9ncmVzc01vbml0b3JQYXJ0LmRvbmUoKTsKLQotCQkJLy8gY2xlYXIgY3Vyc29yCi0JCQlpZiAoc2hlbGwgIT0gbnVsbCAmJiAhc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJc2hlbGwuc2V0Q3Vyc29yKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vdmVPcCAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG1vdmVPcC5nZXRTdGF0dXMoKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvclRpdGxlOyAKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpYWxvZ3NfTW92ZURpYWxvZ19lcnJvck1lc3NhZ2U7IAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQl0aXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJCQlpZiAobW92ZU9wLnJlbG9hZE5lZWRlZCgpKSB7Ci0JCQkJCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYnJhcnkoc2hlbGwsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAobW92aW5nKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9PcGVuQ29uZmlnRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvT3BlbkNvbmZpZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWMzODg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9PcGVuQ29uZmlnRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9wZW5Db25maWdEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ09ORklHX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5PcGVuQ29uZmlnRGlhbG9nbmV3Y29uZmlnX3RleHQ7IAotCi0JLy8gQ29tYm8gY29tYm9fY29uZmlnczsKLQlTdHJpbmcgc2VlbGN0ZWROYW1lOwotCi0JQnV0dG9uW10gY3RybF9jb25maWdzID0gbnVsbDsKLQotCVRleHQgY3RybF9uZXdfY29uZmlnID0gbnVsbDsKLQotCXB1YmxpYyBPcGVuQ29uZmlnRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJZmluYWwgR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJYXJlYS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCXsKLQkJCUdyb3VwIGcgPSBuZXcgR3JvdXAoYXJlYSwgU1dULk5PTkUpOwotCQkJewotCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJZy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJZy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCX0KLQotCQkJU3RyaW5nW10gbmFtZXMgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbk5hbWVzKAotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJaWYgKG5hbWVzICE9IG51bGwpIHsKLQkJCQljdHJsX2NvbmZpZ3MgPSBuZXcgQnV0dG9uW25hbWVzLmxlbmd0aCArIDFdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3RybF9jb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gTkVXX0NPTkZJR19URVhUOwotCQkJCQlpZiAoaSA8IG5hbWVzLmxlbmd0aCkgewotCQkJCQkJbmFtZSA9IG5hbWVzW2ldOwotCQkJCQl9Ci0JCQkJCWN0cmxfY29uZmlnc1tpXSA9IG5ldyBCdXR0b24oZywgU1dULlJBRElPKTsKLQkJCQkJY3RybF9jb25maWdzW2ldLnNldFRleHQobmFtZSk7Ci0JCQkJCXsKLQkJCQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKAotCQkJCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJCQkJY3RybF9jb25maWdzW2ldLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQljdHJsX25ld19jb25maWcgPSBuZXcgVGV4dChnLCBTV1QuQk9SREVSKTsKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJCQljdHJsX25ld19jb25maWcuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0KLQkJCS8vIHNldCBpbWFnZSBhbmQgdGl0bGUKLQkJCXN1cGVyCi0JCQkJCS5nZXRTaGVsbCgpCi0JCQkJCS5zZXRUZXh0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLk9wZW5Db25maWdEaWFsb2dvcGVuY29uZmlnX3RleHQpOyAKLQkJfQotCi0JCXJldHVybiBhcmVhOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlzZWVsY3RlZE5hbWUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN0cmxfY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGN0cmxfY29uZmlnc1tpXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXNlZWxjdGVkTmFtZSA9IGN0cmxfY29uZmlnc1tpXS5nZXRUZXh0KCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChzZWVsY3RlZE5hbWUuZXF1YWxzKE5FV19DT05GSUdfVEVYVCkpIHsKLQkJCXNlZWxjdGVkTmFtZSA9IGN0cmxfbmV3X2NvbmZpZy5nZXRUZXh0KCk7Ci0JCX0KLQotCQlpZiAoc2VlbGN0ZWROYW1lID09IG51bGwgfHwgc2VlbGN0ZWROYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3Rpb24oKSB7Ci0JCWlmIChzdXBlci5vcGVuKCkgPT0gRGlhbG9nLk9LKSB7Ci0JCQlyZXR1cm4gc2VlbGN0ZWROYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9TZWN0aW9uc09yZGVyRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2VjdGlvbnNPcmRlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjRkNjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9TZWN0aW9uc09yZGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0KLS8qKgotICogRGlhbG9nIHRvIG9yZGVyIHRoZSB7QGxpbmsgU3RlcH1zLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uc09yZGVyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGJhc2VDb21wb3NpdGU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX3VwLCBjdHJsX2Rvd247Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfc3RlcHM7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHN0ZXBzVGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IGFsbFNlY3Rpb25zOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgc3RlcHNWaWV3ZXJMYWJlbFByb3ZpZGVyOwotCi0JLy8gcHJpdmF0ZSBUYXNrIGNvbnRlbnRFbGVtZW50OwotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXI7Ci0KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkFkdmFuY2VkU2VhcmNoRGlhbG9nPC9jb2RlPiBnaXZlYiB0aGUgcGFyZW50IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBTZWN0aW9uc09yZGVyRGlhbG9nKFNoZWxsIHBhcmVudCwgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQsCi0JCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlLAotCQkJU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSBjb250ZW50RWxlbWVudDsKLQkJdGhpcy5hY3Rpb25NYW5hZ2VyID0gYWN0aW9uTWFuYWdlcjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCWFsbFNlY3Rpb25zID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJhc2VDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDQ7Ci0JCWJhc2VDb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQliYXNlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsIG1lc3NhZ2UsIDQpOwotCi0JCS8vIEVtcHR5IGxpbmUKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgIiAiLCA0KTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3JlYXRlTGFiZWwoYmFzZUNvbXBvc2l0ZSwgbGFiZWwsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGJhc2VDb21wb3NpdGUsICIgIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9zdGVwcyA9IG5ldyBUYWJsZShiYXNlQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDA7Ci0JCQljdHJsX3N0ZXBzLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zdGVwcyk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyKTsKLQkJc3RlcHNUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHN0ZXBzVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIG9yZGVyQnV0dG9uUGFuZSA9IG5ldyBDb21wb3NpdGUoYmFzZUNvbXBvc2l0ZSwgU1dULk5VTEwpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlvcmRlckJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJY3RybF91cCA9IGNyZWF0ZUJ1dHRvbihvcmRlckJ1dHRvblBhbmUsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kb3duID0gY3JlYXRlQnV0dG9uKG9yZGVyQnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCk7Ci0JCWN0cmxfZG93bi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gRW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChiYXNlQ29tcG9zaXRlLCAiICIsIDQpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGluZShiYXNlQ29tcG9zaXRlLCA0KTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCXJldHVybiBiYXNlQ29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaW5lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBuY29sKSB7Ci0JCUxhYmVsIGxpbmUgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwKLQkJCQl8IFNXVC5CT0xEKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuY29sOwotCQlsaW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBuQ29sKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBuQ29sOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyBidXR0b25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKGFsbFNlY3Rpb25zID09IG51bGwpIHsKLQkJCQkJYWxsU2VjdGlvbnMgPSBuZXcgU2VjdGlvbkxpc3QoY29udGVudEVsZW1lbnQsCi0JCQkJCQkJU2VjdGlvbkxpc3QuU1RFUFNfRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpOwotCQkJCX0KLQkJCQlyZXR1cm4gYWxsU2VjdGlvbnMudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXN0ZXBzVmlld2VyTGFiZWxQcm92aWRlciA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKQotCQkJCQkJLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdGVwc1RhYmxlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfSBlbHNlCi0JCQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCQkJJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0gZWxzZQotCQkJCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY29udGVudEVsZW1lbnQsIG1vdmVVcEl0ZW1zLCBhbGxTZWN0aW9ucywgMSk7Ci0JCQkJYWN0aW9uTWFuYWdlci5leGVjdXRlKGNtZCk7Ci0JCQkJY29tbWFuZHMuYWRkKGNtZCk7Ci0KLQkJCQlzdGVwc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCUFycmF5TGlzdCBtb3ZlRG93bkl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVEb3duSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoCi0JCQkJCQljb250ZW50RWxlbWVudCwgbW92ZURvd25JdGVtcywgYWxsU2VjdGlvbnMsIDApOwotCQkJCWFjdGlvbk1hbmFnZXIuZXhlY3V0ZShjbWQpOwotCQkJCWNvbW1hbmRzLmFkZChjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWlmIChzdGVwc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0SW5wdXQoY29udGVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBPSyBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQlhbGxTZWN0aW9ucy5hcHBseSgpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjYW5jZWxQcmVzc2VkKCkgewotCQlpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IGNvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJT2JqZWN0IGNtZCA9IGNvbW1hbmRzLmdldChpKTsKLQkJCQlpZiAoY21kIGluc3RhbmNlb2YgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKSB7Ci0JCQkJCSgoTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKSBjbWQpLnVuZG8oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2hvd0RldGFpbHNQcm9ibGVtVmlld0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1Nob3dEZXRhaWxzUHJvYmxlbVZpZXdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU1Mjk1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU2hvd0RldGFpbHNQcm9ibGVtVmlld0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotCi0vKioKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuNQotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNob3dEZXRhaWxzUHJvYmxlbVZpZXdEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dFN0cmluZzsKLQlwcml2YXRlIFN0cmluZyBsYWJlbFN0cmluZzsKLQkKLQlwdWJsaWMgU2hvd0RldGFpbHNQcm9ibGVtVmlld0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGxhYmVsU3RyaW5nLCBTdHJpbmcgdGV4dFN0cmluZykgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMudGV4dFN0cmluZyA9IHRleHRTdHJpbmc7Ci0JCXRoaXMubGFiZWxTdHJpbmcgPSBsYWJlbFN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMTA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxMDsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFN0cmluZyk7IAotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQkKLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkKLQkJVGV4dCB0ZXh0ID0gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDQwMCwgMik7Ci0JCXRleHQuc2V0VGV4dCh0ZXh0U3RyaW5nKTsKLQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXRleHQuc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2JsZW1FeHBsYW5hdGlvblRleHQpOyAKLQl9CQotCQotCXByb3RlY3RlZCBQb2ludCBnZXRJbml0aWFsU2l6ZSgpIHsKLQkJUG9pbnQgY2FsY3VsYXRlZFNpemUgPSBzdXBlci5nZXRJbml0aWFsU2l6ZSgpOwotCQlpZiAoY2FsY3VsYXRlZFNpemUueCA8IDY3NSkgewotCQkJY2FsY3VsYXRlZFNpemUueCA9IDY3NTsKLQkJfQotCQlyZXR1cm4gY2FsY3VsYXRlZFNpemU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU3dpdGNoQ29uZmlnRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvU3dpdGNoQ29uZmlnRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGE4YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1N3aXRjaENvbmZpZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHN3aXRjaCB0aGUgY3VycmVudCBDb25maWd1cmF0aW9uIHRvIGEgcmVjb21tZW5kZWQKLSAqIENvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTd2l0Y2hDb25maWdEaWFsb2cgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQkKLQlwcml2YXRlIElFZGl0b3JQYXJ0IHBhcnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gcmVjb21tZW5kZWRDb25maWcKLQkgKiAgICAgICAgICAgIFRoZSByZWNvbW1lbmRlZCBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBTd2l0Y2hDb25maWdEaWFsb2coU2hlbGwgc2hlbGwsIElFZGl0b3JQYXJ0IHBhcnQpIHsKLQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCQl0aGlzLnBhcnQgPSBwYXJ0OwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBkaWFsb2cgaWZmIHRoZSBnaXZlbiByZWNvbW1lbmRlZENvbmZpZyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUKLQkgKiBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlnCi0JICogCi0JICogcmV0dXJucyBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEIGlmIGRpYWxvZyB3YXNuJ3Qgc2hvd24sIG9yIGlmIGNvbmZpZyB3YXMKLQkgKiBzd2l0Y2hlZCByZXR1cm5zIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEIGlmIGRpYWxvZyB3YXMgc2hvd24gYW5kIHVzZXIKLQkgKiBkaWQgbm90IGNsaWNrIFllcwotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IHNoZWxsICE9IG51bGwgPyBzaGVsbC5nZXREaXNwbGF5KCkgOiBudWxsOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5ID0gTXNnQm94LmdldERpc3BsYXkoKTsKLQkJfQotCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkvLyBjb3VsZCBub3QgZ2V0IGRpc3BsYXkKLQkJCXJldHVybjsKLQkJfQotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJaWYgKCgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXBhcnQpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpICgoSUVkaXRvclBhcnQpIHBhcnQpCi0JCQkJCQkJLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChpbnB1dC5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKSAhPSBudWxsKSB7Ci0JCQkJCQlvYmogPSBpbnB1dC5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKS5lQ29udGFpbmVyKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJCWlmICgoKFByb2Nlc3NFZGl0b3IpcGFydCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJb2JqID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldE1ldGhvZEVkaXRvcklucHV0KHBhcnQpOwotCQkJCX0KLQkJCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIHJlY29tbWVuZGVkQ29uZmlnID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQlTdHJpbmcgc3dpdGNoQ29uZmlnUHJlZiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFN3aXRjaENvbmZpZygpOwotCQkJCQlpZiAoTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuTkVWRVIuZXF1YWxzKHN3aXRjaENvbmZpZ1ByZWYpKSB7Ci0JCQkJCQkvLyBDYWxsIHRoaXMgdG8gcmVmcmVzaCBhY3RpdmUgcGFydCBpZiBuZWVkZWQuCi0JCQkJCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0vLwkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0vLwkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkgIT0gcmVjb21tZW5kZWRDb25maWcpIHsKLQkJCQkJCWZpbmFsIFN0cmluZyBjb25maWdOYW1lID0gcmVjb21tZW5kZWRDb25maWcuZ2V0TmFtZSgpOwotCQkJCQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVC5lcXVhbHMoc3dpdGNoQ29uZmlnUHJlZikpIHsKLQkJCQkJCQlNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZSBkaWFsb2cgPSBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZQotCQkJCQkJCS5vcGVuWWVzTm9RdWVzdGlvbihzaGVsbCwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5zd2l0Y2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc3dpdGNoQ29uZmlnRGlhbG9nX3RleHQsCi0JCQkJCQkJCQkJCWNvbmZpZ05hbWUpLAotCQkJCQkJCQkJbnVsbCwgZmFsc2UsIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLAotCQkJCQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0U3dpdGNoQ29uZmlnUHJlZmVyZW5jZUtleSgpKTsKLQkJCQkJCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCkgewotCQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLAotCQkJCQkJCQkJCQkJY29uZmlnTmFtZSk7Ci0JCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJCQkJY29uZmlnKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBDYWxsIHRoaXMgdG8gcmVmcmVzaCBhY3RpdmUgcGFydCBpZiBuZWVkZWQuCi0JCQkJCQkJCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfSBlbHNlIGlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVMuZXF1YWxzKHN3aXRjaENvbmZpZ1ByZWYpKSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGNvbmZpZ05hbWUpOwotCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oCi0JCQkJCQkJCQljb25maWcpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bihTaGVsbCBzaGVsbCwgSUVkaXRvclBhcnQgcGFydCkgewotCQlTd2l0Y2hDb25maWdEaWFsb2cgZGlhbG9nID0gbmV3IFN3aXRjaENvbmZpZ0RpYWxvZyhEaXNwbGF5Ci0JCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAoSUVkaXRvclBhcnQpcGFydCk7Ci0JCWRpYWxvZy5leGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVXNlckRlZmluZWREaWFncmFtRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RpYWxvZ3MvVXNlckRlZmluZWREaWFncmFtRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MThlZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1VzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogRGlhbG9nIHRvIGFzc2lnbiB1c2VyIGRlZmluZWQgZGlhZ3JhbSB0byBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlckRlZmluZWREaWFncmFtRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgQnV0dG9uIGFzc2lnbkFESW1hZ2VCdXR0b24sIGFzc2lnbkFEREltYWdlQnV0dG9uLAotCQkJYXNzaWduV1BESW1hZ2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjbGVhckFESW1hZ2VCdXR0b24sIGNsZWFyQURESW1hZ2VCdXR0b24sCi0JCQljbGVhcldQREltYWdlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gdXNlQURJbWFnZUJ1dHRvbiwgdXNlQURESW1hZ2VCdXR0b24sIHVzZVdQREltYWdlQnV0dG9uOwotCi0JcHJpdmF0ZSBUZXh0IGFkSW1hZ2VUZXh0LCBhZGRJbWFnZVRleHQsIHdwZEltYWdlVGV4dDsKLQotCXByaXZhdGUgSUVkaXRvclBhcnQgZWRpdG9yOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGFyZWE7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0YWJOYW1lID0gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGlhZ3JhbSwgYWN0aXZpdHlEZXRhaWxEaWFncmFtLAotCQkJd3BkRGlhZ3JhbTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBidXR0b25XaWR0aEhpbnQgPSA2MDsKLQkKLQlwcml2YXRlIFNldCBleGlzdGluZ0xpc3Q7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzV3JhcHBlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBpc1dyYXBwZWQKLQkgKi8KLQlwdWJsaWMgVXNlckRlZmluZWREaWFncmFtRGlhbG9nKFNoZWxsIHBhcmVudCwgSUVkaXRvclBhcnQgZWRpdG9yLAotCQkJQWN0aXZpdHkgYWN0aXZpdHksIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGlzV3JhcHBlZCkgewotCQlzdXBlcihwYXJlbnQpOwotCi0JCXRoaXMuZWRpdG9yID0gZWRpdG9yOwotCQl0aGlzLmlzV3JhcHBlZCA9IGlzV3JhcHBlZDsKLQkJCi0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5maWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKGNvbmZpZywgbnVsbCwgdGFiTmFtZSkgewotCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKTsKLQkJCQkJaWYgKG5hbWUKLQkJCQkJCQkuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMpCi0JCQkJCQkJJiYgCi0JCQkJCQkJISgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICgob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQkKLQkJZXhpc3RpbmdMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlhcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlmaW5hbCBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7Ci0JCWFyZWEuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCS8vIFVzZSBBRCBJbWFnZSBmb3IgcHVibGlzaGluZwotCQlMYWJlbCBibGFua0xhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYmxhbmtMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVzZUFESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5DSEVDSyk7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURJbWFnZSk7IAotCQlHcmlkRGF0YSBidXR0b25HRCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlidXR0b25HRC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXVzZUFESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HRCk7Ci0KLQkJLy8gQXNzaWduIGFjdGl2aXR5IGRpYWdyYW0gaW1hZ2UKLQkJTGFiZWwgYUxhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkSW1hZ2UpOyAKLQotCQlhZEltYWdlVGV4dCA9IG5ldyBUZXh0KGFyZWEsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCWFkSW1hZ2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCWFzc2lnbkFESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5OT05FKTsKLQkJYXNzaWduQURJbWFnZUJ1dHRvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ19hc3NpZ25CdXR0b24pOyAKLQkJR3JpZERhdGEgYnV0dG9uR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlidXR0b25HcmlkRGF0YS53aWR0aEhpbnQgPSBidXR0b25XaWR0aEhpbnQ7Ci0JCWFzc2lnbkFESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJY2xlYXJBREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWNsZWFyQURJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsZWFyQnV0dG9uX3RleHQpOyAKLQkJY2xlYXJBREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCS8vIFVzZSBBREQgSW1hZ2UgZm9yIHB1Ymxpc2hpbmcKLQkJYmxhbmtMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWJsYW5rTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VBRERJbWFnZUJ1dHRvbiA9IG5ldyBCdXR0b24oYXJlYSwgU1dULkNIRUNLKTsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfdXNlQURESW1hZ2UpOyAKLQkJYnV0dG9uR0QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJYnV0dG9uR0QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQl1c2VBRERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdEKTsKLQotCQkvLyBBc3NpZ24gYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gaW1hZ2UKLQkJYUxhYmVsID0gbmV3IExhYmVsKGFyZWEsIFNXVC5OT05FKTsKLQkJYUxhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2FkZEltYWdlKTsgCi0KLQkJYWRkSW1hZ2VUZXh0ID0gbmV3IFRleHQoYXJlYSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlhZGRJbWFnZVRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJYXNzaWduQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5OT05FKTsKLQkJYXNzaWduQURESW1hZ2VCdXR0b24KLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Vc2VyRGVmaW5lZERpYWdyYW1EaWFsb2dfYXNzaWduQnV0dG9uKTsgCi0JCWFzc2lnbkFEREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR3JpZERhdGEpOwotCi0JCWNsZWFyQURESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5OT05FKTsKLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsZWFyQnV0dG9uX3RleHQpOyAKLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQkvLyBVc2UgV1BEIEltYWdlIGZvciBwdWJsaXNoaW5nCi0JCWJsYW5rTGFiZWwgPSBuZXcgTGFiZWwoYXJlYSwgU1dULk5PTkUpOwotCQlibGFua0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJdXNlV1BESW1hZ2VCdXR0b24gPSBuZXcgQnV0dG9uKGFyZWEsIFNXVC5DSEVDSyk7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX3VzZVdQREltYWdlKTsgCi0JCWJ1dHRvbkdEID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyApOwotCQlidXR0b25HRC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldExheW91dERhdGEoYnV0dG9uR0QpOwotCi0JCS8vIEFzc2lnbiB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtIGltYWdlCi0JCWFMYWJlbCA9IG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSk7Ci0JCWFMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ193cGRJbWFnZSk7IAotCi0JCXdwZEltYWdlVGV4dCA9IG5ldyBUZXh0KGFyZWEsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJd3BkSW1hZ2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCWFzc2lnbldQREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWFzc2lnbldQREltYWdlQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVXNlckRlZmluZWREaWFncmFtRGlhbG9nX2Fzc2lnbkJ1dHRvbik7IAotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGJ1dHRvbkdyaWREYXRhKTsKLQotCQljbGVhcldQREltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihhcmVhLCBTV1QuTk9ORSk7Ci0JCWNsZWFyV1BESW1hZ2VCdXR0b24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5jbGVhckJ1dHRvbl90ZXh0KTsgCi0JCWNsZWFyV1BESW1hZ2VCdXR0b24uc2V0TGF5b3V0RGF0YShidXR0b25HcmlkRGF0YSk7Ci0KLQkJLy8gbG9hZERhdGEKLQkJbG9hZERhdGEoKTsKLQkJCi0JCS8vIGRpc2FibGVDb250cm9scwotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChhY3Rpdml0eSkgfHwgaXNXcmFwcGVkKXsKLQkJCWRpc2FibGVDb250cm9scygpOwotCQl9Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBzZXQgaW1hZ2UgYW5kIHRpdGxlCi0JCXN1cGVyCi0JCQkJLmdldFNoZWxsKCkKLQkJCQkuc2V0VGV4dCgKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZ190aXRsZSk7IAotCi0JCXJldHVybiBhcmVhOwotCX0KLQotCS8qKgotCSAqIERpc2FibGUgY29udHJvbHMKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNhYmxlQ29udHJvbHMoKQotCXsKLQkJdXNlQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJdXNlQURESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXVzZVdQREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJYXNzaWduQURJbWFnZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJYXNzaWduQURESW1hZ2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWFzc2lnbldQREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJY2xlYXJBREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljbGVhckFEREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljbGVhcldQREltYWdlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBpbml0aWFsIGRhdGEKLQkgKgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsJCQotCQkvLwkgbG9hZCBleGlzdGluZyBzdXBwb3J0aW5nIG1hdGVyaWFscyBsaXN0Ci0JCWV4aXN0aW5nTGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpKTsKLQotCQkKLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbyhhY3Rpdml0eSk7Ci0JCWlmIChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8KLQkJCQkJLmdldEFjdGl2aXR5RGlhZ3JhbSgpKSk7Ci0JCQlhY3Rpdml0eURpYWdyYW0gPSBpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpOwotCQkJCi0JCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCX0KLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJYWRkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGluZm8KLQkJCQkJLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKSk7Ci0JCQlhY3Rpdml0eURldGFpbERpYWdyYW0gPSBpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJCi0JCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCX0KLQkJaWYgKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCXdwZEltYWdlVGV4dAotCQkJCQkuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoaW5mby5nZXRXUEREaWFncmFtKCkpKTsKLQkJCXdwZERpYWdyYW0gPSBpbmZvLmdldFdQRERpYWdyYW0oKTsKLQkJCQotCQkJZXhpc3RpbmdMaXN0LmFkZCh3cGREaWFncmFtKTsKLQkJfQotCi0JCXVzZUFESW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSk7Ci0JCXVzZUFEREltYWdlQnV0dG9uLnNldFNlbGVjdGlvbihpbmZvLmNhblB1Ymxpc2hBRERJbWFnZSgpKTsKLQkJdXNlV1BESW1hZ2VCdXR0b24uc2V0U2VsZWN0aW9uKGluZm8uY2FuUHVibGlzaFdQREltYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlhc3NpZ25BREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzbSA9IG9wZW5GaWx0ZXJEaWFsb2coKTsKLQkJCQkJaWYgKHNtICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2aXR5RGlhZ3JhbSA9IHNtOwotCQkJCQkJYWRJbWFnZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoc20pKTsKLQkJCQkJCWV4aXN0aW5nTGlzdC5hZGQoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFzc2lnbkFEREltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRyeSB7Ci0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzbSA9IG9wZW5GaWx0ZXJEaWFsb2coKTsKLQkJCQkJaWYgKHNtICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IHNtOwotCQkJCQkJYWRkSW1hZ2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHNtKSk7Ci0JCQkJCQlleGlzdGluZ0xpc3QuYWRkKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhc3NpZ25XUERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0cnkgewotCQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwgc20gPSBvcGVuRmlsdGVyRGlhbG9nKCk7Ci0JCQkJCWlmIChzbSAhPSBudWxsKSB7Ci0JCQkJCQl3cGREaWFncmFtID0gc207Ci0JCQkJCQl3cGRJbWFnZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoc20pKTsKLQkJCQkJCWV4aXN0aW5nTGlzdC5hZGQod3BkRGlhZ3JhbSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljbGVhckFESW1hZ2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZXhpc3RpbmdMaXN0LnJlbW92ZShhY3Rpdml0eURpYWdyYW0pOwotCQkJCWFkSW1hZ2VUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYWN0aXZpdHlEaWFncmFtID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJBRERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlleGlzdGluZ0xpc3QucmVtb3ZlKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJYWRkSW1hZ2VUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYWN0aXZpdHlEZXRhaWxEaWFncmFtID0gbnVsbDsKLQkJCX0KLQkJfSk7Ci0KLQkJY2xlYXJXUERJbWFnZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlleGlzdGluZ0xpc3QucmVtb3ZlKHdwZERpYWdyYW0pOwotCQkJCXdwZEltYWdlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdwZERpYWdyYW0gPSBudWxsOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVuIGEgZmlsdGVyIGRpYWxvZwotCSAqLwotCXByaXZhdGUgU3VwcG9ydGluZ01hdGVyaWFsIG9wZW5GaWx0ZXJEaWFsb2coKSB7Ci0JCi0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBhY3Rpdml0eSwKLQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIEFycmF5cy5hc0xpc3QoZXhpc3RpbmdMaXN0LnRvQXJyYXkoKSkpOwotCQkKLQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJZmQuc2V0Vmlld2VyU2VsZWN0aW9uU2luZ2xlKHRydWUpOwotCQlmZC5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGFjdGl2aXR5KSk7Ci0JCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlmZC5vcGVuKCk7Ci0KLQkJTGlzdCBsaXN0ID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQlpZiAoKGxpc3QgIT0gbnVsbCkgJiYgKCFsaXN0LmlzRW1wdHkoKSkpIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldCgwKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQlyZXR1cm4gKFN1cHBvcnRpbmdNYXRlcmlhbCkgb2JqOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIE9LIGJ1dHRvbiBpcyBzZWxlY3RlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWlmIChUbmdVdGlsLmlzTG9ja2VkKGFjdGl2aXR5KSB8fCBpc1dyYXBwZWQpewotCQkJLy8gdGhlbiBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLi4ganVzdCByZXR1cm4KLQkJCXN1cGVyLm9rUHJlc3NlZCgpOwotCQl9Ci0JCWJvb2xlYW4gZWRpdG9yRGlydHkgPSBmYWxzZTsKLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbyhhY3Rpdml0eSk7Ci0KLQkJLy8gc2V0IGFjdGl2aXR5IGRpYWdyYW0KLQkJaWYgKGFjdGl2aXR5RGlhZ3JhbSAhPSBpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpKSB7Ci0JCQllZGl0b3JEaXJ0eSA9IHRydWU7Ci0JCX0KLQkJaW5mby5zZXRBY3Rpdml0eURpYWdyYW0oYWN0aXZpdHlEaWFncmFtKTsKLQotCQkvLyBzZXQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkJaWYgKCFlZGl0b3JEaXJ0eSkgewotCQkJaWYgKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSAhPSBpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKQotCQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJfQotCQlpbmZvLnNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCi0JCS8vIHNldCB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JCWlmICghZWRpdG9yRGlydHkpIHsKLQkJCWlmICh3cGREaWFncmFtICE9IGluZm8uZ2V0V1BERGlhZ3JhbSgpKQotCQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJfQotCQlpbmZvLnNldFdQRERpYWdyYW0od3BkRGlhZ3JhbSk7Ci0KLQkJLy8gc2V0IGNhbiBwdWJsaXNoIGZsYWcgZm9yIGFjdGl2aXR5IGRpYWdyYW0KLQkJYm9vbGVhbiBvbGRDYW5QdWJsaXNoRmxhZyA9IGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKTsKLQkJYm9vbGVhbiBuZXdDYW5QdWJsaXNoRmxhZyA9IHVzZUFESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICgoIWVkaXRvckRpcnR5KSAmJiAob2xkQ2FuUHVibGlzaEZsYWcgIT0gbmV3Q2FuUHVibGlzaEZsYWcpKQotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQlpbmZvLnNldFB1Ymxpc2hBREltYWdlKHVzZUFESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIHNldCBjYW4gcHVibGlzaCBmbGFnIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotCQlvbGRDYW5QdWJsaXNoRmxhZyA9IGluZm8uY2FuUHVibGlzaEFEREltYWdlKCk7Ci0JCW5ld0NhblB1Ymxpc2hGbGFnID0gdXNlQURESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICgoIWVkaXRvckRpcnR5KSAmJiAob2xkQ2FuUHVibGlzaEZsYWcgIT0gbmV3Q2FuUHVibGlzaEZsYWcpKQotCQkJZWRpdG9yRGlydHkgPSB0cnVlOwotCQlpbmZvLnNldFB1Ymxpc2hBRERJbWFnZSh1c2VBRERJbWFnZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gc2V0IGNhbiBwdWJsaXNoIGZsYWcgZm9yIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0KLQkJb2xkQ2FuUHVibGlzaEZsYWcgPSBpbmZvLmNhblB1Ymxpc2hXUERJbWFnZSgpOwotCQluZXdDYW5QdWJsaXNoRmxhZyA9IHVzZVdQREltYWdlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAoKCFlZGl0b3JEaXJ0eSkgJiYgKG9sZENhblB1Ymxpc2hGbGFnICE9IG5ld0NhblB1Ymxpc2hGbGFnKSkKLQkJCWVkaXRvckRpcnR5ID0gdHJ1ZTsKLQkJaW5mby5zZXRQdWJsaXNoV1BESW1hZ2UodXNlV1BESW1hZ2VCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRURpdG9yIGRpcnR5PSIgKyBlZGl0b3JEaXJ0eSk7Ci0JCWlmIChlZGl0b3JEaXJ0eSkgewotCi0JCQlpZiAoIXByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCXNhdmVBY3RpdmVFZGl0b3IoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ190aXRsZTsgCi0JCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX21lc3NhZ2UyOyAKLQkJLy8gaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoUHJvY2Vzc0VkaXRvcikgZWRpdG9yKS5yZXNvdXJjZXNUb1NhdmUKLQkJCQkJCQkJLmFkZCgoKFByb2Nlc3NDb21wb25lbnQpICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBlZGl0b3IKLQkJCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0TWV0aG9kRWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkuZVJlc291cmNlKCkpOwotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIGRvbmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQl9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9WYXJpYWJpbGl0eVNlbGVjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1ZhcmlhYmlsaXR5U2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmY2JlMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL1ZhcmlhYmlsaXR5U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGRpYWxvZyBmb3Igc2hvd2luZyBhbmQgcG9zc2libHkgc2VsZWN0aW5nIGFueSB2YXJpYWJpbGl0eSByZWxhdGVkIHRvIHRoZQotICogZ2l2ZW4gZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBWYXJpYWJpbGl0eVNlbGVjdGlvbiB7Ci0KLQlwcml2YXRlIEhhc2hTZXQgZmlsdGVyRWxlbWVudExpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBWYXJpYWJpbGl0eUZpbHRlciBleHRlbmRzIEFsbEZpbHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpICE9IG51bGwpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCQkoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCQkmJiBmaWx0ZXJFbGVtZW50TGlzdC5jb250YWlucyhvYmopKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogRGlzcGxheSB2YXJpYWJpbGl0eSBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGxpc3RzIGVsZW1lbnRzIGFuZCBpdCdzCi0JICogdmFyaWFiaWxpdGllcy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlTZWxlY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogSXQgc2hvd3MgZGlhbG9nIGJveCBmb3IgYWxsIHRoZSBjb250cmlidXRvcnMuIFVzZXIgaXMgZXhwZWN0ZWQgdG8gc2VsZWN0Ci0JICogb25lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJT2JqZWN0IHNlbGVjdGVkIGJ5IHVzZXIKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJU2V0IGVsZW1lbnRTZXQgPSBuZXcgSGFzaFNldCgpOwotCQllbGVtZW50U2V0LmFkZChlbGVtZW50KTsKLQkJZWxlbWVudFNldCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFZhcmlhYmlsaXR5RWxlbWVudHMoZWxlbWVudFNldCwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGVsZW1lbnRTZXQpOwotCQlpZiAoIWVsZW1lbnRTZXQuaXNFbXB0eSgpKSB7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVsZW1lbnRTZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0b3IubmV4dCgpOwotCQkJCUxpc3QgZ3JvdXBpbmdzID0gbnVsbDsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50KTsKLQotCQkJCX0KLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJCWdyb3VwaW5ncyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJZ3JvdXBpbmdzID0gZ2V0QW5jZXN0b3JzKChDdXN0b21DYXRlZ29yeSljb250ZW50RWxlbWVudCk7Ci0JCQkJfQotCi0JCQkJaWYgKChncm91cGluZ3MgIT0gbnVsbCkgJiYgKCFncm91cGluZ3MuaXNFbXB0eSgpKSkKLQkJCQkJZmlsdGVyRWxlbWVudExpc3QuYWRkQWxsKGdyb3VwaW5ncyk7Ci0KLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgVmFyaWFiaWxpdHlGaWx0ZXIoKTsKLQkJCVN0cmluZ1tdIHN0ciA9IG5ldyBTdHJpbmdbXSB7IEZpbHRlckNvbnN0YW50cy5DT05GSUdfQ09OVEVOVF9FTEVNRU5UIH07Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBkbGcgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQlkbGcuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlkbGcuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLkNPTkZJR19DT05URU5UX0VMRU1FTlQpOwotCQkJZGxnLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCWRsZy5zZXRUeXBlcyhzdHIpOwotCQkJZGxnLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0KLQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJJiYgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpKSB7Ci0JCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpCi0JCQkJCQkubGVuZ3RoKCkgPiAwKQotCQkJCQllbGVtZW50TmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlkbGcKLQkJCQkJLnNldFZpZXdlckxhYmVsKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuVmFyaWFiaWxpdHlTZWxlY3Rpb25fZmlsdGVyZGlhbG9nX3ZpZXdlckxhYmVsLCAobmV3IFN0cmluZ1tdIHsgZWxlbWVudE5hbWUgfSkpKTsKLQotCQkJU3RyaW5nIHRpdGxlID0gTWVzc2FnZUZvcm1hdAotCQkJCQkuZm9ybWF0KAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlZhcmlhYmlsaXR5U2VsZWN0aW9uX2ZpbHRlcmRpYWxvZ190aXRsZSwgCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgZWxlbWVudE5hbWUgfSk7Ci0KLQkJCWRsZy5zZXRUaXRsZSh0aXRsZSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCi0JCQlMaXN0IHJlc3VsdCA9IGRsZy5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0JCQlpZiAoKHJlc3VsdCA9PSBudWxsKSB8fCAocmVzdWx0LmlzRW1wdHkoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHJlc3VsdC5nZXQoMCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYW5jZXN0b3JzIGZvciB0aGUgZ2l2ZW4gQ3VzdG9tIENhdGVnb3J5LgotCSAqIHRha2VuIGZyb20gYXV0aG9yaW5nLnVpLkN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZQotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBbmNlc3RvcnMoQ3VzdG9tQ2F0ZWdvcnkgbWV0aG9kT2JqZWN0KSB7Ci0JCUxpc3QgYW5jZXN0b3JMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW9iakxpc3QuYWRkKG1ldGhvZE9iamVjdCk7Ci0JCWdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG9iakxpc3QpOwotCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRBbmNlc3RvcnMoTGlzdCBhbmNlc3Rvckxpc3QsIExpc3QgbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCi0JCUxpc3QgYWxsUGFyZW50Q3VzdENhdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kT2JqZWN0TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUN1c3RvbUNhdGVnb3J5IGVsZW1lbnQgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJTGlzdCBwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhlbGVtZW50KTsKLQkJCWFsbFBhcmVudEN1c3RDYXRzLmFkZEFsbChwYXJlbnRMaXN0KTsKLQkJfQotCi0JCWFuY2VzdG9yTGlzdC5hZGRBbGwobWV0aG9kT2JqZWN0TGlzdCk7Ci0JCUxpc3QgbmV4dENoZWNrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsUGFyZW50Q3VzdENhdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFhbmNlc3Rvckxpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQluZXh0Q2hlY2tMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBuZXh0Q2hlY2tMaXN0KTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZGlhbG9ncy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzcxMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpYWxvZ3MgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4ZDU3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2RuZC9FZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuRHJhZ0FuZERyb3BGZWVkYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogRHJvcCBhZGFwdGVyIGZvciBkcmFnIGFuZCBkcm9wCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0aW5nRG9tYWluVGFibGVUcmVlVmlld2VyRHJvcEFkYXB0ZXIgZXh0ZW5kcwotCQlFZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIgewotCi0JcHVibGljIEVkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlcihFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIoZG9tYWluLCB2aWV3ZXIpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuRWRpdGluZ0RvbWFpblZpZXdlckRyb3BBZGFwdGVyI2RyYWdFbnRlcihvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCQlzdXBlci5kcmFnRW50ZXIoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcmFnT3ZlcihvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmRldGFpbCA9PSBETkQuRFJPUF9OT05FKSB7Ci0JCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQl9Ci0KLQkJc3VwZXIuZHJhZ092ZXIoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNkcm9wQWNjZXB0KG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRyb3BBY2NlcHQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfTk9ORSkgewotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfQ09QWTsKLQkJfQotCi0JCXN1cGVyLmRyb3BBY2NlcHQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkVkaXRpbmdEb21haW5WaWV3ZXJEcm9wQWRhcHRlciNoZWxwZXIob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGVscGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlUYWJsZSB0YWJsZSA9IG51bGw7Ci0JCVRhYmxlSXRlbSBpdGVtID0gbnVsbDsKLQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFRhYmxlVHJlZVZpZXdlcikgewotCQkJdGFibGUgPSAoKFRhYmxlVHJlZVZpZXdlcikgdmlld2VyKS5nZXRUYWJsZVRyZWUoKS5nZXRUYWJsZSgpOwotCQkJaXRlbSA9IHRhYmxlLmdldEl0ZW0odGFibGUudG9Db250cm9sKGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCWV2ZW50Lml0ZW0gPSBpdGVtOwotCQl9Ci0KLQkJc3VwZXJIZWxwZXIoZXZlbnQpOwotCi0JCWlmIChpdGVtICE9IG51bGwgJiYgKGV2ZW50LmZlZWRiYWNrICYgRE5ELkZFRURCQUNLX1NFTEVDVCkgIT0gMCkgewotCQkJdGFibGUuc2V0U2VsZWN0aW9uKG5ldyBUYWJsZUl0ZW1bXSB7IGl0ZW0gfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgZHJvcCB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gaXRlbQotCSAqIEByZXR1cm4gZHJvcCB0YXJnZXQgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXREcm9wVGFyZ2V0KFdpZGdldCBpdGVtKSB7Ci0JCXJldHVybiBleHRyYWN0RHJvcFRhcmdldChpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkcm9wIGFjdGlvbiBzaG91bGQgYmUgaW52b2tlZC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5FZGl0aW5nRG9tYWluVmlld2VyRHJvcEFkYXB0ZXIjZHJvcChvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkvLyBBIGNvbW1hbmQgd2FzIGNyZWF0ZWQgaWYgdGhlIHNvdXJjZSB3YXMgYXZhaWxhYmxlIGVhcmx5LCBhbmQgdGhlCi0JCS8vIGluZm9ybWF0aW9uIHVzZWQgdG8gY3JlYXRlIGl0IHdhcyBjYWNoZWQuLi4KLQkJaWYgKGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uICE9IG51bGwpIHsKLQkJCS8vIFJlY3JlYXRlIHRoZSBjb21tYW5kLgotCQkJY29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uLmNyZWF0ZUNvbW1hbmQoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIE90aGVyd2lzZSwgdGhlIHNvdXJjZSBzaG91bGQgYmUgYXZhaWxhYmxlIG5vdyBhcyBldmVudC5kYXRhLCBhbmQKLQkJCS8vIHdlIGNhbiBjcmVhdGUgdGhlIGNvbW1hbmQuCi0JCQlzb3VyY2UgPSBleHRyYWN0RHJhZ1NvdXJjZShldmVudC5kYXRhKTsKLQkJCU9iamVjdCB0YXJnZXQgPSBnZXREcm9wVGFyZ2V0KGV2ZW50Lml0ZW0pOwotCQkJY29tbWFuZCA9IERyYWdBbmREcm9wQ29tbWFuZC5jcmVhdGUoZG9tYWluLCB0YXJnZXQsCi0JCQkJCWdldExvY2F0aW9uKGV2ZW50KSwgZXZlbnQub3BlcmF0aW9ucywgb3JpZ2luYWxPcGVyYXRpb24sCi0JCQkJCXNvdXJjZSk7Ci0JCX0KLQotCQkvLyBJZiB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS4uLgotCQlpZiAoY29tbWFuZC5jYW5FeGVjdXRlKCkpIHsKLQkJCS8vIEV4ZWN1dGUgaXQuCi0JCQlkb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kKTsKLQkJfSBlbHNlIHsKLQkJCS8vIE90aGVyd2lzZSwgbGV0J3MgY2FsbCB0aGUgd2hvbGUgdGhpbmcgb2ZmLgotCQkJZXZlbnQuZGV0YWlsID0gRE5ELkRST1BfTk9ORTsKLQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0KLQkJLy8gQ2xlYW4gdXAgdGhlIHN0YXRlLgotCQljb21tYW5kID0gbnVsbDsKLQkJY29tbWFuZFRhcmdldCA9IG51bGw7Ci0JCXNvdXJjZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHRoZSBzYW1lIHdheSBmb3IgZWFjaCBvZiB0aGUKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0TGlzdGVuZXJ9IG1ldGhvZHMsIGV4Y2VwdCBmb3IgbGVhdmUKLQkgKiBhbmQgZHJvcC4gSWYgdGhlIHNvdXJjZSBpcyBhdmFpbGFibGUgZWFybHksIGl0IGNyZWF0ZXMgb3IgcmV2YWxpZGF0ZXMgdGhlCi0JICoge0BsaW5rIERyYWdBbmREcm9wQ29tbWFuZH0sIGFuZCB1cGRhdGVzIHRoZSBldmVudCdzIGRldGFpbCAob3BlcmF0aW9uKQotCSAqIGFuZCBmZWVkYmFjayAoZHJhZyB1bmRlciBlZmZlY3QpLCBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN1cGVySGVscGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkvLyBJZiB3ZSBjYW4ndCBkbyBhbnl0aGluZyBlbHNlLCB3ZSdsbCBwcm92aWRlIHRoZSBkZWZhdWx0IHNlbGVjdAotCQkvLyBmZWVkYmFjayBhbmQgZW5hYmxlIGF1dG8tc2Nyb2xsIGFuZCBhdXRvLWV4cGFuZCBlZmZlY3RzLgotCQlldmVudC5mZWVkYmFjayA9IERORC5GRUVEQkFDS19TRUxFQ1QgfCBnZXRBdXRvRmVlZGJhY2soKTsKLQotCQkvLyBJZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgaXQsIHRyeSB0byBnZXQgdGhlIHNvdXJjZSBlYXJseS4gV2UgY2FuJ3QKLQkJLy8gZ2l2ZSBmZWVkYmFjayBpZiBpdCdzIG5vdCBhdmFpbGFibGUgeWV0ICh0aGlzIGlzIHBsYXRmb3JtLWRlcGVuZGVudCkuCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJc291cmNlID0gZ2V0RHJhZ1NvdXJjZShldmVudCk7Ci0JCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gR2V0IHRoZSB0YXJnZXQgb2JqZWN0IGZyb20gdGhlIGl0ZW0gd2lkZ2V0IGFuZCB0aGUgbW91c2UgbG9jYXRpb24gaW4KLQkJLy8gaXQuCi0JCU9iamVjdCB0YXJnZXQgPSBnZXREcm9wVGFyZ2V0KGV2ZW50Lml0ZW0pOwotCQlmbG9hdCBsb2NhdGlvbiA9IGdldExvY2F0aW9uKGV2ZW50KTsKLQotCQkvLyBEZXRlcm1pbmUgaWYgd2UgY2FuIGNyZWF0ZSBhIHZhbGlkIGNvbW1hbmQgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCi0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQkvLyBJZiB3ZSBkb24ndCBoYXZlIGEgcHJldmlvdXMgY2FjaGVkIGNvbW1hbmQuLi4KLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJLy8gV2UnbGwgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbmZvcm1hdGlvbiB3ZSB1c2UgdG8gY3JlYXRlIHRoZQotCQkJLy8gY29tbWFuZCwgc28gdGhhdCB3ZSBjYW4gcmVjcmVhdGUgaXQgaW4gZHJvcC4KLQkJCWRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uID0gbmV3IERyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uKAotCQkJCQlkb21haW4sIHRhcmdldCwgbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsCi0JCQkJCW9yaWdpbmFsT3BlcmF0aW9uLCBzb3VyY2UpOwotCi0JCQkvLyBSZW1lbWJlciB0aGUgdGFyZ2V0OyBjcmVhdGUgdGhlIGNvbW1hbmQgYW5kIHRlc3QgaWYgaXQgaXMKLQkJCS8vIGV4ZWN1dGFibGUuCi0JCQljb21tYW5kVGFyZ2V0ID0gdGFyZ2V0OwotCQkJY29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uLmNyZWF0ZUNvbW1hbmQoKTsKLQkJCXZhbGlkID0gY29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBDaGVjayBpZiB0aGUgY2FjaGVkIGNvbW1hbmQgY2FuIHByb3ZpZGUgRE5ECi0JCQkvLyBmZWVkYmFjay9yZXZhbGlkYXRpb24uCi0JCQlpZiAodGFyZ2V0ID09IGNvbW1hbmRUYXJnZXQKLQkJCQkJJiYgY29tbWFuZCBpbnN0YW5jZW9mIERyYWdBbmREcm9wRmVlZGJhY2spIHsKLQkJCQkvLyBJZiBzbywgcmV2YWxpZGF0ZSB0aGUgY29tbWFuZC4KLQkJCQl2YWxpZCA9ICgoRHJhZ0FuZERyb3BGZWVkYmFjaykgY29tbWFuZCkudmFsaWRhdGUodGFyZ2V0LAotCQkJCQkJbG9jYXRpb24sIGV2ZW50Lm9wZXJhdGlvbnMsIG9yaWdpbmFsT3BlcmF0aW9uLCBzb3VyY2UpOwotCi0JCQkJLy8gS2VlcCB0cmFjayBvZiBhbnkgY2hhbmdlcyB0byB0aGUgY29tbWFuZCBpbmZvcm1hdGlvbi4KLQkJCQlkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbigKLQkJCQkJCWRvbWFpbiwgdGFyZ2V0LCBsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywKLQkJCQkJCW9yaWdpbmFsT3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJZiBub3QsIGRpc3Bvc2UgdGhlIGN1cnJlbnQgY29tbWFuZCBhbmQgY3JlYXRlIGEgbmV3IG9uZS4KLQkJCQlkcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbiA9IG5ldyBEcmFnQW5kRHJvcENvbW1hbmRJbmZvcm1hdGlvbigKLQkJCQkJCWRvbWFpbiwgdGFyZ2V0LCBsb2NhdGlvbiwgZXZlbnQub3BlcmF0aW9ucywKLQkJCQkJCW9yaWdpbmFsT3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJCWNvbW1hbmRUYXJnZXQgPSB0YXJnZXQ7Ci0JCQkJY29tbWFuZC5kaXNwb3NlKCk7Ci0JCQkJY29tbWFuZCA9IGRyYWdBbmREcm9wQ29tbWFuZEluZm9ybWF0aW9uLmNyZWF0ZUNvbW1hbmQoKTsKLQkJCQl2YWxpZCA9IGNvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQkJfQotCQl9Ci0KLQkJLy8gSWYgdGhpcyBjb21tYW5kIGNhbiBwcm92aWRlIGRldGFpbGVkIGRyYWcgYW5kIGRyb3AgZmVlZGJhY2suLi4KLQkJaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBEcmFnQW5kRHJvcEZlZWRiYWNrKSB7Ci0JCQkvLyBVc2UgaXQgZm9yIHRoZSBvcGVyYXRpb24gYW5kIGRyYWcgdW5kZXIgZWZmZWN0LgotCQkJRHJhZ0FuZERyb3BGZWVkYmFjayBkcmFnQW5kRHJvcEZlZWRiYWNrID0gKERyYWdBbmREcm9wRmVlZGJhY2spIGNvbW1hbmQ7Ci0JCQlldmVudC5kZXRhaWwgPSBkcmFnQW5kRHJvcEZlZWRiYWNrLmdldE9wZXJhdGlvbigpOwotCQkJZXZlbnQuZmVlZGJhY2sgPSBkcmFnQW5kRHJvcEZlZWRiYWNrLmdldEZlZWRiYWNrKCkKLQkJCQkJfCBnZXRBdXRvRmVlZGJhY2soKTsKLQkJfSBlbHNlIGlmICghdmFsaWQpIHsKLQkJCS8vIFRoZXJlIGlzIG5vIGV4ZWN1dGFibGUgY29tbWFuZCwgc28gd2UnZCBiZXR0ZXIgbml4IHRoZSB3aG9sZQotCQkJLy8gZGVhbC4KLQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL0xpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMjdiYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLlZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIGRyYWcgYWRhcHRlciBmb3IgdGhlIExpYnJhcnkgVmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlciBleHRlbmRzIFZpZXdlckRyYWdBZGFwdGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWRpdG9yRHJhZ0FkYXB0ZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXIoVmlld2VyIHZpZXdlcikgewotCQlzdXBlcih2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIGRyYWdnaW5nIGlzIGluaXRpYXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkcmFnU3RhcnQoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmRyYWdTdGFydChldmVudCk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWV2ZW50LmRvaXQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLnRvTGlzdCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYKLQkJCQkJIShzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSAmJgotCQkJCQkhKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWV2ZW50LmRvaXQgPSB0cnVlOwotCQkJfQotCQl9CQkKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gdHJhbnNmZXIgdGhlIGRhdGEuCi0JICovCi0JcHVibGljIHZvaWQgZHJhZ1NldERhdGEoRHJhZ1NvdXJjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGUpIHx8Ci0JCQkJVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlKSkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCi0JCQlTdHJpbmcgbGlua3MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLnRvTGlzdCgpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlTdHJpbmcgbGlua1RleHQgPSBnZXRIeXBlcmxpbmsoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudCk7CQkJCQkKLQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCQkJaWYgKGxpbmtzLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWxpbmtzICs9IFN0clV0aWwuTElORV9GRUVEOwotCQkJCQkJfQotCQkJCQkJbGlua3MgKz0gbmV3IFN0cmluZyhTdHJVdGlsLmdldFVURjhCeXRlcyhsaW5rVGV4dCkpOwkJCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGxpbmtzLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWxpbmtzICs9IFN0clV0aWwuTElORV9GRUVEOwotCQkJCQkJfQotCQkJCQkJbGlua3MgKz0gbGlua1RleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQlpZiAobGlua3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZXZlbnQuZGF0YSA9IGxpbmtzOwotCQkJfQotCQl9Ci0JCXN1cGVyLmRyYWdTZXREYXRhKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoeXBlcmxpbmsgZm9yIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEh5cGVybGluayhNZXRob2RFbGVtZW50IGRyYWdFbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnQgZHJvcEVsZW1lbnQgPSBudWxsOwotCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChhY3RpdmVFZGl0b3IgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gYWN0aXZlRWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQlkcm9wRWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGRyYWdFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCl7Ci0JCQlkcmFnRWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudClkcmFnRWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQl9Ci0KLQkJU3RyaW5nIGhyZWYgPSBSZXNvdXJjZUhlbHBlci5nZXRVcmwoZHJhZ0VsZW1lbnQsIGRyb3BFbGVtZW50LCAiLmh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gb2JleSBMaWJyYXJ5Vmlld1ByZWZQYWdlCi0JCVN0cmluZyBkZWZhdWx0TGlua1R5cGUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJQl9WSUVXX0RORF9ERUZBVUxUX0xJTktUWVBFKTsKLQkJU3RyaW5nIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoUmVzb3VyY2VIZWxwZXIuRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFR5cGUuZXF1YWxzKGRlZmF1bHRMaW5rVHlwZSkpIHsKLQkJCXRleHQgPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGlua1RleHQoZHJhZ0VsZW1lbnQsIHRydWUpOwotCQl9IGVsc2UgewotCQkJdGV4dCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRMaW5rVGV4dChkcmFnRWxlbWVudCwgZmFsc2UpOwotCQl9Ci0JCQotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudExpbmsoZHJhZ0VsZW1lbnQsIHRleHQsCi0JCQkJImZpbGU6Ly8iICsgaHJlZiwgZGVmYXVsdExpbmtUeXBlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9kbmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODU3ZjU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZG5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRyYWcgYW5kIGRyb3Agc3VwcG9ydCBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWJzdHJhY3RCYXNlRm9ybUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0QmFzZUZvcm1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlZmRhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWJzdHJhY3RCYXNlRm9ybUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9ycy5JTWV0aG9kRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgbWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJhc2VGb3JtRWRpdG9yIGV4dGVuZHMgRm9ybUVkaXRvciBpbXBsZW1lbnRzIElNZXRob2RFZGl0b3IgewotCi0JLy8gR2xvYmFsIG1hcCB1c2VkIHRvIHJlY29yZCB3aGljaCBlZGl0b3IgbW9kaWZpZXMgdGhlIHNoYXJlZCByZXNvdXJjZQotCS8vIGZpcnN0LgotCS8vIFRoaXMgZW5hYmxlcyB0aGUgYXBwcm9wcmlhdGUgZWRpdG9ycyB0byBiZSBmbGFnZ2VkIGFzIGRpcnR5LgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIFNIQVJFRF9SRVNPVVJDRV9UT19FRElUT1JTX01BUCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBJZiB0cnVlLCBkZWJ1ZyB0cmFjaW5nIGlzIGVuYWJsZWQuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIENvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwgZGF0YSBiZWluZyBlZGl0ZWQgYnkKLQkvLyB0aGlzIGVkaXRvci4KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEJhc2VGb3JtRWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFBhZ2VzKCk7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHNhdmluZyBsaWJyYXJ5OiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVBc0FsbG93ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVkaXRvcidzIGRpcnR5IHN0YXRlIGJ5IGFkZGluZyBhICIqIiB0byB0aGUgZWRpdG9yIHRhYiBhbmQKLQkgKiBlbmFibGluZyB0aGUgU2F2ZSBidXR0b24uCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlRGlydHlTdGF0dXMoKSB7Ci0JCXN1cGVyLmVkaXRvckRpcnR5U3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWJzdHJhY3REaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWJzdHJhY3REaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGQ4NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0Fic3RyYWN0RGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5jb21tYW5kcy5DcmVhdGVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZUxpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLkNyZWF0ZU5vZGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmNvbW1hbmRzLk1vdmVCZW5kcG9pbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtQWN0aW9uU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkZyZWVUZXh0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUNvbnRhaW5lckVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuU3luY2hCYXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5GcmVlVGV4dEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuRGlhZ3JhbVByaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLlByb2Nlc3NEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2tFdmVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5kbmQuVGVtcGxhdGVUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZG5kLlRlbXBsYXRlVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQ29weVRlbXBsYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhbGV0dGUuUGFsZXR0ZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFsZXR0ZS5QYWxldHRlVmlld2VyUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhbGV0dGUuRmx5b3V0UGFsZXR0ZUNvbXBvc2l0ZS5GbHlvdXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yV2l0aEZseW91dFBhbGV0dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbFZpZXdlcktleUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLlNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Gb250RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgZGlhZ3JhbSBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbSBUaGFyaW8KLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1FZGl0b3IgZXh0ZW5kcwotCQlHcmFwaGljYWxFZGl0b3JXaXRoRmx5b3V0UGFsZXR0ZSBpbXBsZW1lbnRzIElNZXRob2RFZGl0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfRlJPTV9CQVNFX0FDVElWSVRZID0gInJlZnJlc2hfZnJvbV9iYXNlX2FjdGl2aXR5IjsgLy8kTk9OLU5MUy0xJAotCS8vIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfQVZFUkFHRSA9Ci0JLy8gImFsaWduX2hvcml6b250YWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEID0KLQkvLyAiYWxpZ25faG9yaXpvbnRhbF90b19maXJzdF9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fVkVSVF9BVkVSQUdFID0KLQkvLyAiYWxpZ25fdmVydGljYWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEID0KLQkvLyAiYWxpZ25fdmVydGljYWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlRfRElBTE9HID0gImZvbnRfZGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9MSU5LID0gImNyZWF0ZV9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9MSU5LID0gInNlbGVjdF9saW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9CRU5EX1BPSU5UID0gImNyZWF0ZV9iZW5kX3BvaW50IjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GUkVFX1RFWFQgPSAiY3JlYXRlX2ZyZWVfdGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0ggPSAicmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0JFTkRfUE9JTlQgPSAiYWxpZ25fYmVuZF9wb2ludCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfRE9DS19MT0NBVElPTiA9ICJEb2NrIGxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFMRVRURV9TSVpFID0gIlBhbGV0dGUgU2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBTEVUVEVfU1RBVEUgPSAiUGFsZXR0ZSBzdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUEFMRVRURV9TSVpFID0gMTMwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0RJQUdSQU0gPSAiZGVsZXRlX2FjdHZpdHlfZGV0YWlsX2RpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEtleUhhbmRsZXIgc2hhcmVkS2V5SGFuZGxlcjsKLQotCXByaXZhdGUgUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3Q7Ci0KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0KLQlwcml2YXRlIENvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIgY21kU3RhY2tFdmVudExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIENyZWF0aW9uRmFjdG9yeSBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQotCXByb3RlY3RlZCBEaWFncmFtQWN0aW9uU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwb3NlZDsKLQotCS8qKgotCSAqIFRoZSBwYXJlbnQgaXMgdGhlIGVkaXRvciBmcm9tIHdoZXJlIHRoZSB1c2VyIG9wZW5lZCB0aGlzIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgcGFyZW50RWRpdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBsaXN0ZW4gZm9yIG91ciBwYXJlbnQgZWRpdG9yIGFuZCBvdXIgb3duIGNsb3NpbmcuIFdoZW4gaXQKLQkgKiBkb2VzLCB3ZSBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGNsb3NlIHRoaXMgZGlhZ3JhbSBhcyB3ZWxsLgotCSAqLwotCXByb3RlY3RlZCBJUGFydExpc3RlbmVyIHBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCQlJRWRpdG9yUGFydCBtZSA9IEFic3RyYWN0RGlhZ3JhbUVkaXRvci50aGlzOwotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIGVkaXRvciBjbG9zZWQgYXMgYSByZXN1bHQgb2YgdXNlciBhY3Rpb24gb3IgdGhlCi0JCQkvLyB3b3JrYmVuY2ggY2xvc2luZwotCQkJLy8gSVdvcmtiZW5jaCB3YiA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCQlpZiAocGFydCA9PSBtZSkgewotCQkJCXNldFBhcmVudEVkaXRvcihudWxsKTsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKTsKLQkJCQlwYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCQkJCS8vIHJlbW92ZSB0aGlzIGRpYWdyYW0gaWYgaXQgaXMgbmV3Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkuZ2V0Q29udGVudHMoKSkuZ2V0TW9kZWwoKTsKLQkJCQkvLyBtYWtlIHN1cmUgd2UgcmVtb3ZlIHRoZSBVTUEgZGlhZ3JhbSBmcm9tIHRoZSBtb2RlbCBpZiBpdCBpcwotCQkJCS8vIG5ldyAobmV2ZXIgc2F2ZWQpCi0JCQkJaWYgKGRpYWdyYW0uaXNOZXcoKSkgewotCQkJCQlpZiAoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJfQotCQkJCQlpZihpc1Jlc291cmNlQ2hhbmdlZEJ5T3RoZXIoKSkgewotCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmICghd2IuaXNDbG9zaW5nKCkpIHsKLQkJCS8vIC8vIGFyZSB3ZSBiZWluZyBub3RpZmllZCBhYm91dCBvdXIgcGFyZW50IGVkaXRvciBvYmplY3Q/Ci0JCQkvLyBpZiAoZ2V0UGFyZW50RWRpdG9yKCkgIT0gbnVsbCkgewotCQkJLy8gaWYgKHBhcnQgPT0gZ2V0UGFyZW50RWRpdG9yKCkpIHsKLQkJCS8vIElXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQkJLy8gLy8geWVzLCBhc2sgdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIGNsb3NlIHRoaXMKLQkJCS8vIC8vIGVkaXRvcgotCQkJLy8gaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkvLyAuZ2V0RGVmYXVsdCgpCi0JCQkvLyAuZ2V0TXNnRGlhbG9nKCkKLQkJCS8vIC5kaXNwbGF5UHJvbXB0KAotCQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLlBhcmVudEVkaXRvckNsb3NlLnRpdGxlIiksCi0JCQkvLyAvLyROT04tTkxTLTEkCi0JCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJCS8vIC5mb3JtYXRTdHJpbmcoCi0JCQkvLyAiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5QYXJlbnRFZGl0b3JDbG9zZS50ZXh0IiwKLQkJCS8vIGdldFBhcmVudEVkaXRvcigpLmdldFRpdGxlKCksIG1lLmdldFRpdGxlKCkpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyAvLyB5ZXMsIGNsb3NlIHRoaXMgZGlhZ3JhbSwgYXNrIHRvIHNhdmUgY2hhbmdlcwotCQkJLy8gcGFnZS5jbG9zZUVkaXRvcihtZSwgdHJ1ZSk7Ci0JCQkvLyB9Ci0JCQkvLyAvLyBlaXRoZXIgd2F5LCBvdXIgcGFyZW50IGlzIGNsb3NlZCBhbmQgd2UgY2FuIHN0b3AKLQkJCS8vIC8vIGxpc3RlbmluZwotCQkJLy8gcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBGb250IGZvbnQ7Ci0KLQlwcml2YXRlIENvbG9yIGNvbG9yOwotCi0JcHJpdmF0ZSBDb21tYW5kIHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQgPSBuZXcgQ29tbWFuZChEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlKSB7IAotCQlwcml2YXRlIEFycmF5TGlzdCBvbGRDb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQotCQkJLy8gYmFjayB1cCBvbGQgZGlhZ3JhbSBjb250ZW50Ci0JCQkvLwotCQkJb2xkQ29udGVudC5jbGVhcigpOwotCQkJb2xkQ29udGVudC5hZGRBbGwoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkpOwotCi0JCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlZnJlc2hGcm9tQmFzZShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQlpZiAoZWRpdFBhcnQuaXNBY3RpdmUoKSkgewotCQkJCWVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCX0KLQkJCWRpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQljcmVhdGVFZGl0UGFydCgpOwotCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkuY2xlYXIoKTsKLQkJCWRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmFkZEFsbChvbGRDb250ZW50KTsKLQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJfQotCQkJZGlhZ3JhbS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCWNyZWF0ZUVkaXRQYXJ0KCk7Ci0JCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIE1hcCB0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcDsKLQkvKioKLQkgKiBSZWNvcmRzIHRpbWUgd2hlbiB0aGUgbW9kZWwgZmlyc3QgaGFzIGJlZW4gY2hhbmdlZCBieSB0aGlzIGVkaXRvci4gVGhpcyB3aWxsIGJlIHVzZWQgbGF0ZXIKLQkgKiB0byBkZXRlcm1pbmUgaWYgc2F2ZSBpcyBuZWVkZWQgdG8gcmV2ZXJzZSB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgbG9uZyBjaGFuZ2VUaW1lID0gLTE7Ci0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZzsKLQotCWNsYXNzIERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIGV4dGVuZHMgQ29udGV4dE1lbnVQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBXb3JrZmxvd0NvbnRleHRNZW51UHJvdmlkZXIgYXNzb2ljYXRlZCB3aXRoIHRoZSBnaXZlbgotCQkgKiB2aWV3ZXIgYW5kIGFjdGlvbiByZWdpc3RyeS4KLQkJICogCi0JCSAqIEBwYXJhbSB2aWV3ZXIKLQkJICogICAgICAgICAgICB0aGUgdmlld2VyCi0JCSAqIEBwYXJhbSByZWdpc3RyeQotCQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gcmVnaXN0cnkKLQkJICovCi0JCXB1YmxpYyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcihFZGl0UGFydFZpZXdlciB2aWV3ZXIsCi0JCQkJQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJCXN1cGVyKHZpZXdlcik7Ci0JCQlzZXRBY3Rpb25SZWdpc3RyeShyZWdpc3RyeSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBDb250ZXh0TWVudVByb3ZpZGVyI2J1aWxkQ29udGV4dE1lbnUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1aWxkQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJCUdFRkFjdGlvbkNvbnN0YW50cy5hZGRTdGFuZGFyZEFjdGlvbkdyb3VwcyhtZW51KTsKLQotCQkJSUFjdGlvbiBhY3Rpb247Ci0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LlVORE8uZ2V0SWQoKSk7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIGFjdGlvbik7Ci0KLQkJCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfVU5ETywgYWN0aW9uKTsKLQotCQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpCi0JCQkJCS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJCWlmICghVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKSB7Ci0JCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfRURJVCwgYWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5HUk9VUF9WSUVXLCBhY3Rpb24pOwotCi0JCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihGT05UX0RJQUxPRyk7Ci0JCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQkJfQotCi0JCQlJQWN0aW9uIGNyZWF0ZUZyZWVUZXh0QWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCUNSRUFURV9GUkVFX1RFWFQpOwotCQkJaWYgKGNyZWF0ZUZyZWVUZXh0QWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJY3JlYXRlRnJlZVRleHRBY3Rpb24pOwotCQkJfQotCi0JCQkvLyBJQWN0aW9uIG1vdmVBY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihNT1ZFKTsKLQkJCS8vIGlmKG1vdmVBY3Rpb24uaXNFbmFibGVkKCkpewotCQkJLy8gbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsbW92ZUFjdGlvbik7Ci0JCQkvLyB9Ci0JCQlJQWN0aW9uIGxpbmtBY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfTElOSyk7Ci0JCQlpZiAobGlua0FjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgbGlua0FjdGlvbik7Ci0JCQl9Ci0JCQlJQWN0aW9uIHNlbGVjdGxpbmtBY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJU0VMRUNUX0xJTkspOwotCQkJaWYgKHNlbGVjdGxpbmtBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCXNlbGVjdGxpbmtBY3Rpb24pOwotCQkJfQotCQkJSUFjdGlvbiBiZW5kcG9pbnRBY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJQ1JFQVRFX0JFTkRfUE9JTlQpOwotCQkJaWYgKGJlbmRwb2ludEFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCWJlbmRwb2ludEFjdGlvbik7Ci0JCQl9Ci0JCQlJQWN0aW9uIGFsaWduYmVuZHBvaW50YWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCUFMSUdOX0JFTkRfUE9JTlQpOwotCQkJaWYgKGFsaWduYmVuZHBvaW50YWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQkJYWxpZ25iZW5kcG9pbnRhY3Rpb24pOwotCQkJfQotCQkJCi0JCQkvL1ByaW50IEFjdGlvbiBmb3IgZGlhZ3JhbSB0aHJvdWdoIENvbnRleHQgTWVudS4KLQkJCS8vIEVuYWJsZSB0aGlzIGNvZGUgd2hlbiBwcmludCByZXF1aXJlZCBmb3IgZGlhZ3JhbS4KLS8vCQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5QUklOVC5nZXRJZCgpKTsKLS8vCQkJaWYoYWN0aW9uLmlzRW5hYmxlZCgpKXsKLS8vCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuR1JPVVBfUFJJTlQsIGFjdGlvbik7Ci0vLwkJCX0KLQkJCQotCQkJY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0JCX0KLQotCQlwcml2YXRlIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkgewotCQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGFjdGlvbiByZWdpc3RyeQotCQkgKiAKLQkJICogQHBhcmFtIHJlZ2lzdHJ5Ci0JCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiByZWdpc3RyeQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0QWN0aW9uUmVnaXN0cnkoQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJCWFjdGlvblJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldEVkaXREb21haW4obmV3IERlZmF1bHRFZGl0RG9tYWluKHRoaXMpKTsKLQkJZ2V0RWRpdERvbWFpbigpLnNldENvbW1hbmRTdGFjayhuZXcgQ29tbWFuZFN0YWNrKCkgewotCQkJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJCQlDb21tYW5kIGNtZCA9IGdldFVuZG9Db21tYW5kKCk7Ci0JCQkJaWYgKGNtZCAhPSBudWxsICYmICFjbWQuY2FuVW5kbygpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmlzRGlydHkoKTsKLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrI2V4ZWN1dGUob3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJaWYoY29tbWFuZCA9PSBudWxsIHx8ICFjb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmKGNoYW5nZVRpbWUgPT0gLTEpIHsKLQkJCQkJY2hhbmdlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQlzdXBlci5leGVjdXRlKGNvbW1hbmQpOwotCQkJfQotCQl9KTsKLQotCQkvLyBhZGQgQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcgotCQkvLwotCQljbWRTdGFja0V2ZW50TGlzdGVuZXIgPSBuZXcgQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc3RhY2tDaGFuZ2VkKENvbW1hbmRTdGFja0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldERldGFpbCgpID09IENvbW1hbmRTdGFjay5QT1NUX0VYRUNVVEUpIHsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlnZXRFZGl0RG9tYWluKCkuZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrRXZlbnRMaXN0ZW5lcigKLQkJCQljbWRTdGFja0V2ZW50TGlzdGVuZXIpOwotCQkvLyBhZGQgb3VyIHBhcnQgbGlzdGVuZXIgaWYgZWl0aGVyIHBhcmVudCBvciB0aGlzIGNsb3NlcwotCQlJV29ya2JlbmNoIHdiID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW4gPSB3Yi5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbi5nZXRBY3RpdmVQYWdlKCk7Ci0JCXBhZ2UuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWdldENvbW1hbmRTdGFjaygpCi0JCQkJLnJlbW92ZUNvbW1hbmRTdGFja0V2ZW50TGlzdGVuZXIoY21kU3RhY2tFdmVudExpc3RlbmVyKTsKLQotCQlpZiAoaXNEaXJ0eSgpKSB7Ci0JCQkvLyBjaGFuZ2VzIGRpc2NhcmRlZCwgcmV2ZXJzZSB0byBzYXZlZAotCQkJLy8KLQkJCXJldmVyc2VUb1NhdmVkKCk7Ci0JCX0KLQotCQlpZiAoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbS5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCi0JCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmb250LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29sb3IgIT0gbnVsbCAmJiAhY29sb3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQljb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQl9Ci0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1Jlc291cmNlQ2hhbmdlZEJ5T3RoZXIoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpLmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKXsKLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCXJldHVybiBmaWxlLmxhc3RNb2RpZmllZCgpID4gY2hhbmdlVGltZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJldmVyc2VUb1NhdmVkKCkgewotCQkvLyBzYXZlIHRoZSB1bmRvbmUgY2hhbmdlcyBvbmx5IGlmIHRoZSByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgdGhpcyBlZGl0b3IKLQkJLy8KLQkJYm9vbGVhbiBzYXZlTmVlZGVkID0gZ2V0Q29tbWFuZFN0YWNrKCkuaXNEaXJ0eSgpICYmIGlzUmVzb3VyY2VDaGFuZ2VkQnlPdGhlcigpOwotCQljaGFuZ2VUaW1lID0gLTE7Ci0JCXdoaWxlIChnZXRDb21tYW5kU3RhY2soKS5pc0RpcnR5KCkpIHsKLQkJCWdldENvbW1hbmRTdGFjaygpLnVuZG8oKTsKLQkJfQotCQlpZiAoc2F2ZU5lZWRlZCkgewotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUoZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYnJhcnkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQlSRUZSRVNIX0ZST01fQkFTRV9BQ1RJVklUWSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCQkvLyB0aGUgYWxpZ24gbWVudSBpcyBhIGNhc2NhZGluZyBtZW51Ci0JCUlDb250cmlidXRpb25JdGVtIGNpID0gY3JlYXRlQWxpZ25NZW51KCk7Ci0JCWlmIChjaS5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUKLQkJCQkJLmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCQluZXcgU2VwYXJhdG9yKCkpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGNpKTsKLQkJCW1lbnUKLQkJCQkJLmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCQluZXcgU2VwYXJhdG9yKCkpOwotCQl9Ci0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKERFTEVURV9ESUFHUkFNKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUKLQkJCQkJLmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCQluZXcgU2VwYXJhdG9yKCkpOwotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCQltZW51Ci0JCQkJCS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbSBjcmVhdGVBbGlnbk1lbnUoKSB7Ci0JCS8vIGNyZWF0ZSBhIG5ldyBtZW51IG1hbmFnZXIgZm9yIHRoZSBjYXNjYWRpbmcgbWVudQotCQlNZW51TWFuYWdlciBhbGlnbk1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfYWxpZ25NZW51X3RleHQpIHsgCi0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpbnQgdG90YWwgPSAwOwotCQkJCS8vIGVuYWJsZSB0aGUgbWVudSBvbmx5IGlmIDIgb3IgbW9yZSBub2RlcyBvciBub2RlIGNvbnRhaW5lcnMKLQkJCQkvLyBhcmUgc2VsZWN0ZWQKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJLy8gbmVlZCBhdCBsZWFzdCB0d28gdGhpbmdzIHNlbGVjdGVkIHRvIGFsaWduCi0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPiAxKSB7Ci0JCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldChhKTsKLQkJCQkJCS8vIHdlIGNhbiBhbGlnbiBub2RlcyBhbmQgY29udGFpbmVycwotCQkJCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0Ci0JCQkJCQkJCXx8IGVkaXRQYXJ0IGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lckVkaXRQYXJ0KSB7Ci0JCQkJCQkJLy8gYWRkIHVwIHRoZSBlbGVtZW50cyB3ZSBuZWVkLCB0aGVyZSBtYXkgYmUgbW9yZQotCQkJCQkJCS8vIGVsZW1lbnRzIHNlbGVjdGVkIChsaW5rcywgZXRjLikKLQkJCQkJCQl0b3RhbCsrOwotCQkJCQkJCWlmICh0b3RhbCA+IDEpIHsKLQkJCQkJCQkJLy8gd2Ugb25seSBuZWVkIHRvIGtub3cgdGhlcmUgaXMgbW9yZSB0aGFuIDEsIHNvCi0JCQkJCQkJCS8vIHdlIGNhbiBzdG9wIGhlcmUKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0b3RhbCA+IDE7Ci0JCQl9Ci0JCX07Ci0JCS8vIGFkZCB0aGUgYWN0aW9ucyB0byB0aGlzIG1lbnUKLQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fSE9SWl9BVkVSQUdFKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQpKTsKLQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJRGlhZ3JhbUFjdGlvblNlcnZpY2UuQUxJR05fVkVSVF9BVkVSQUdFKSk7Ci0JCWFsaWduTWVudU1hbmFnZXIuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCURpYWdyYW1BY3Rpb25TZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpKTsKLQkJcmV0dXJuIGFsaWduTWVudU1hbmFnZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZyb21CYXNlKCkgewotCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHJlZnJlc2hGcm9tQmFzZUNvbW1hbmQpOwotCi0JCS8vIERpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlZnJlc2hGcm9tQmFzZShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCS8vIE9iamVjdCBhY3QgPSBkaWFncmFtLmdldE9iamVjdCgpOwotCQkvLyBpZihlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCS8vIGVkaXRQYXJ0LmRlYWN0aXZhdGUoKTsKLQkJLy8gfQotCQkvLyBkaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkvLyBlZGl0UGFydCA9IGNyZWF0ZUVkaXRQYXJ0KGFjdCk7Ci0JCS8vIGdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCQlJQWN0aW9uIGFjdGlvbjsKLQotCQkvLyByZXBsYWNlIGRlZmF1bHQgZGVsZXRlIGFjdGlvbiB3aXRoIGEgY3VzdG9tIG9uZQotCQkvLwotCQlhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJcmVnaXN0cnkucmVtb3ZlQWN0aW9uKGFjdGlvbik7Ci0JCQlnZXRTZWxlY3Rpb25BY3Rpb25zKCkucmVtb3ZlKGFjdGlvbik7Ci0JCX0KLQkJYWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbigoSVdvcmtiZW5jaFBhcnQpIHRoaXMpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5Xb3JrYmVuY2hQYXJ0QWN0aW9uI2lzRW5hYmxlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuRGVsZXRlQWN0aW9uI2NhbGN1bGF0ZUVuYWJsZWQoKQotCQkJICovCi0JCQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVFbmFibGVkKCkgewotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsKLQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZihlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkvLyBPYmplY3Qgb2JqID0gKChFZGl0UGFydCllZGl0UGFydCkuZ2V0TW9kZWwoKTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSAoKE5hbWVkTm9kZSlvYmopLmdldE9iamVjdCgpOwotCQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIHJldHVybiBmYWxzZTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIHJldHVybiBzdXBlci5jYWxjdWxhdGVFbmFibGVkKCk7Ci0JCQkvLyB9Ci0JCQkvLyBUT0RPOiB1bmNvbW1lbnQgdGhpcyBjb2RlIGlmIHdlIGFyZSByZWFkeSB0byB0ZXN0IGRlbGV0aW5nCi0JCQkvLyBCcmVha2Rvd25FbGVtZW50IG5vZGUKLQkJCS8vCi0JCQkvLyAvKiAobm9uLUphdmFkb2MpCi0JCQkvLyAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuRGVsZXRlQWN0aW9uI3J1bigpCi0JCQkvLyAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRPYmplY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVkaXRQYXJ0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gKChFZGl0UGFydCkgZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoKE5hbWVkTm9kZSkgb2JqKS5nZXRPYmplY3QoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY3JlYXRlQ29tbWFuZCgKLQkJCQkJCQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkJCQlkb21haW4gPSBudWxsOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCQkJZG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCQkJbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCWVsZW1lbnRzKSk7Ci0JCQkJCWRlbGV0ZUFjdGlvbi5ydW4oKTsKLQkJCQkJaWYgKGRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQkJCXN1cGVyLnJ1bigpOwotCi0JCQkJCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vIAotCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCXN1cGVyLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJYWN0aW9uID0gbmV3IENvcHlUZW1wbGF0ZUFjdGlvbih0aGlzKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQkvLyByZWZyZXNoIGRpYWdyYW0gZnJvbSBiYXNlIGFjdGlvbgotCQkvLwotCQlhY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCkgeyAKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIFJFRlJFU0hfRlJPTV9CQVNFX0FDVElWSVRZOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVmcmVzaEZyb21CYXNlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKTsKLQkJCQlyZXR1cm4gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCQkJfQotCQl9OwotCQlyZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCS8vIGFjdGlvbiA9IG5ldyBNYXRjaFdpZHRoQWN0aW9uKHRoaXMpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQotCQkvLyBhY3Rpb24gPSBuZXcgTWF0Y2hIZWlnaHRBY3Rpb24odGhpcyk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCS8vIGFjdGlvbiA9IG5ldyBMb2dpY1Bhc3RlVGVtcGxhdGVBY3Rpb24odGhpcyk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCi0JCS8vIGFjdGlvbiA9IG5ldyBJbmNyZW1lbnREZWNyZW1lbnRBY3Rpb24odGhpcywgdHJ1ZSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgSW5jcmVtZW50RGVjcmVtZW50QWN0aW9uKHRoaXMsIGZhbHNlKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBEaXJlY3RFZGl0QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLkxFRlQpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuUklHSFQpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuVE9QKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0JCS8vCi0JCS8vIGFjdGlvbiA9IG5ldyBBbGlnbm1lbnRBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsCi0JCS8vIFBvc2l0aW9uQ29uc3RhbnRzLkJPVFRPTSk7Ci0JCS8vIHJlZ2lzdHJ5LnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0JCS8vIGdldFNlbGVjdGlvbkFjdGlvbnMoKS5hZGQoYWN0aW9uLmdldElkKCkpOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWxpZ25tZW50QWN0aW9uKChJV29ya2JlbmNoUGFydCl0aGlzLAotCQkvLyBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQkvLyByZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkvLyBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJLy8KLQkJLy8gYWN0aW9uID0gbmV3IEFsaWdubWVudEFjdGlvbigoSVdvcmtiZW5jaFBhcnQpdGhpcywKLQkJLy8gUG9zaXRpb25Db25zdGFudHMuTUlERExFKTsKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJLy8gZ2V0U2VsZWN0aW9uQWN0aW9ucygpLmFkZChhY3Rpb24uZ2V0SWQoKSk7Ci0KLQkJSUFjdGlvbiBhY3Rpb24xID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0KSB7IAotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gRk9OVF9ESUFMT0c7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQl0cnkgewotCQkJCQkJRWRpdFBhcnQgc2VsZWN0ZWRFZGl0UGFydCA9IChFZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkJLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuZ2V0KDApOwotCQkJCQkJCi0JCQkJCQlGb250RGlhbG9nIGZkID0gbmV3IEZvbnREaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJLy8gUmVzdG9yaW5nIG9sZCB2YWx1ZXMuCi0JCQkJCQlpZihzZWxlY3RlZEVkaXRQYXJ0ICE9IG51bGwpewotCQkJCQkJCXJlc3RvcmVGb250RGF0YShzZWxlY3RlZEVkaXRQYXJ0LCBmZCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWlmIChzZWxlY3RlZEVkaXRQYXJ0IGluc3RhbmNlb2YgRnJlZVRleHROb2RlRWRpdFBhcnQpIHsKLQkJCQkJCQlpZiAoZmQuZ2V0Rm9udExpc3QoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCUZvbnREYXRhIGZEYXRhID0gZmQuZ2V0Rm9udExpc3QoKVswXTsKLQkJCQkJCQkJaWYgKGZEYXRhICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChmb250ICE9IG51bGwgJiYgIWZvbnQuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCQkJZm9udC5kaXNwb3NlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkvLyBpZihjb2xvciAhPSBudWxsICYmICFmb250LmlzRGlzcG9zZWQoKSl7Ci0JCQkJCQkJCQkvLyBjb2xvci5kaXNwb3NlKCk7Ci0JCQkJCQkJCQkvLyB9Ci0JCQkJCQkJCQlmb250ID0gbmV3IEZvbnQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0RGlzcGxheSgpLCBmRGF0YSk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCWlmKGZkLmdldFJHQigpICE9IG51bGwpCi0JCQkJCQkJCQljb2xvciA9IG5ldyBDb2xvcihudWxsLCBmZC5nZXRSR0IoKSk7Ci0JCQkJCQkJCQkKLQkJCQkJCQkJCSgoRnJlZVRleHRGaWd1cmUpICgoRnJlZVRleHROb2RlRWRpdFBhcnQpIHNlbGVjdGVkRWRpdFBhcnQpCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKSkuc2V0Rm9udChmb250KTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJaWYoY29sb3IgIT0gbnVsbCkKLQkJCQkJCQkJCSgoRnJlZVRleHRGaWd1cmUpICgoRnJlZVRleHROb2RlRWRpdFBhcnQpIHNlbGVjdGVkRWRpdFBhcnQpCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKSkKLQkJCQkJCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0KLQkJCQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKE5vZGUpIHNlbGVjdGVkRWRpdFBhcnQKLQkJCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpOwotCQkJCQkJCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlCi0JCQkJCQkJCQkJCS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCi0JCQkJCQkJCQlTdHJpbmcgdGV4dCA9ICgoRnJlZVRleHRGaWd1cmUpICgoRnJlZVRleHROb2RlRWRpdFBhcnQpIHNlbGVjdGVkRWRpdFBhcnQpCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKSkuZ2V0VGV4dCgpOwotCQkJCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUKTsKLQkJCQkJCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJcHJvcGVydHkuc2V0VmFsdWUodGV4dCk7Ci0JCQkJCQkJCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJc2V0UHJvcGVydHkoCi0JCQkJCQkJCQkJCWxpc3QsCi0JCQkJCQkJCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSwKLQkJCQkJCQkJCQkJZkRhdGEuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1NUWUxFLAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmRGF0YS5nZXRTdHlsZSgpKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0hFSUdIVCwKLQkJCQkJCQkJCQkJbmV3IEludGVnZXIoZkRhdGEuZ2V0SGVpZ2h0KCkpCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkJaWYoZmQuZ2V0UkdCKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQsCi0JCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKGZkLmdldFJHQigpLnJlZCkKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQlzZXRQcm9wZXJ0eSgKLQkJCQkJCQkJCQkJbGlzdCwKLQkJCQkJCQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9CTFVFLAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmZC5nZXRSR0IoKS5ibHVlKQotCQkJCQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCXNldFByb3BlcnR5KAotCQkJCQkJCQkJCQlsaXN0LAotCQkJCQkJCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOLAotCQkJCQkJCQkJCQluZXcgSW50ZWdlcihmZC5nZXRSR0IoKS5ncmVlbikKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzZWxlY3RlZEVkaXRQYXJ0LnJlZnJlc2goKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQkJcmV0dXJuICgoKFR5cGVkTm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eUJ5S2V5KExpc3QgbGlzdCwgU3RyaW5nIGtleSkgewotCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpcm9yID0gbGlzdC5pdGVyYXRvcigpOyBpcm9yLmhhc05leHQoKTspIHsKLQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSBpcm9yLm5leHQoKTsKLQkJCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHByb3BlcnR5LmdldEtleSgpLmVxdWFscyhrZXkpKSB7Ci0JCQkJCQkJCXJldHVybiBwcm9wZXJ0eTsKLQkJCQkJCQl9IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShMaXN0IGxpc3QsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCi0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIGtleSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJcHJvcGVydHkgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpOwotCQkJCQlwcm9wZXJ0eS5zZXRLZXkoa2V5KTsKLQkJCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZXN0b3JlRm9udERhdGEoRWRpdFBhcnQgc2VsZWN0ZWRFZGl0UGFydCwgRm9udERpYWxvZyBmZCl7Ci0JCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9ICgoTm9kZSkgc2VsZWN0ZWRFZGl0UGFydAotCQkJCQkJLmdldE1vZGVsKCkpLmdldEdyYXBoTm9kZSgpOwotCQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUKLQkJCQkJCS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCQlpZihsaXN0ICE9IG51bGwgJiYgIWxpc3QuaXNFbXB0eSgpKXsKLQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gbnVsbDsKLQkJCQkJCVN0cmluZyBmb250bmFtZSA9IG51bGwsIGZvbnRTdHlsZSA9IG51bGwsIGZvbnRIZWlnaHQgPSBudWxsLCByZWQgPSBudWxsLCBibHVlID0gbnVsbCwgZ3JlZW4gPSBudWxsOwotCi0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9OQU1FKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwgKXsKLQkJCQkJCQlmb250bmFtZSA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXByb3BlcnR5ID0gZ2V0UHJvcGVydHlCeUtleShsaXN0LCBUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX1NUWUxFKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwgKXsKLQkJCQkJCQlmb250U3R5bGUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfSEVJR0hUKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQkJCWZvbnRIZWlnaHQgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfUkVEKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQkJCXJlZCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlwcm9wZXJ0eSA9IGdldFByb3BlcnR5QnlLZXkobGlzdCwgVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9CTFVFKTsKLQkJCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQkJCWJsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJcHJvcGVydHkgPSBnZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsIFRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfR1JFRU4pOwotCQkJCQkJaWYocHJvcGVydHkgIT0gbnVsbCl7Ci0JCQkJCQkJZ3JlZW4gPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlGb250RGF0YSBmRGF0YSA9IG5ldyBGb250RGF0YSgpOwotCQkJCQkJZkRhdGEuc2V0TmFtZShmb250bmFtZSk7Ci0JCQkJCQlmRGF0YS5zZXRIZWlnaHQoKG5ldyBJbnRlZ2VyKGZvbnRIZWlnaHQpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCWZEYXRhLnNldFN0eWxlKChuZXcgSW50ZWdlcihmb250U3R5bGUpKS5pbnRWYWx1ZSgpKTsKLQkJCQkJCQotCQkJCQkJLy8sIChuZXcgSW50ZWdlcihmb250U3R5bGUpKS5pbnRWYWx1ZSgpLCAobmV3IEludGVnZXIoZm9udEhlaWdodCkpLmludFZhbHVlKCkpOwotCQkJCQkJaWYoIHJlZCAhPSBudWxsICYmIGJsdWUgIT0gbnVsbCAmJiBncmVlbiAhPSBudWxsKXsKLQkJCQkJCQlSR0IgcmdiID0gbmV3IFJHQihuZXcgSW50ZWdlcihyZWQpLmludFZhbHVlKCksCi0JCQkJCQkJCQluZXcgSW50ZWdlcihncmVlbikuaW50VmFsdWUoKSwKLQkJCQkJCQkJCSBuZXcgSW50ZWdlcihibHVlKS5pbnRWYWx1ZSgpCi0JCQkJCQkJCQkgKTsKLQkJCQkJCQlmZC5zZXRSR0IocmdiKTsKLS8vCQkJCQkJCWlmKHJnYiAhPSBudWxsKXsKLS8vCQkJCQkJCQlyZ2IucmVkID0gbmV3IEludGVnZXIocmVkKS5pbnRWYWx1ZSgpOwotLy8JCQkJCQkJCXJnYi5ibHVlID0gbmV3IEludGVnZXIoYmx1ZSkuaW50VmFsdWUoKTsKLS8vCQkJCQkJCQlyZ2IuZ3JlZW4gPSBuZXcgSW50ZWdlcihncmVlbikuaW50VmFsdWUoKTsKLS8vCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZkLnNldEZvbnRMaXN0KG5ldyBGb250RGF0YVtde2ZEYXRhfSk7Ci0JCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24xKTsKLQotCQkvLyBKaW5odWEgWGkKLQkJLy8gYWRkZWQgdGhpcyB0byBjb25zb2xpZGF0ZSBjb21tb24gYWN0aW9ucyBpbnRvIGEgc2VydmljZSBjbGFzcwotCQlhY3Rpb25TZXJ2aWNlID0gbmV3IERpYWdyYW1BY3Rpb25TZXJ2aWNlKGdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkJCWdldEVkaXREb21haW4oKSwgcmVnaXN0cnkpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVySG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVySG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkF2ZXJhZ2VBY3Rpb24oKTsKLQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0KLQkJLy8gLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIGF2ZXJhZ2UgeS12YWx1ZSBvZiBhbGwgbm9kZXMKLQkJLy8gSUFjdGlvbiBoQWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzCi0JCS8vIC5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BYnN0cmFjdERpYWdyYW1FZGl0b3IuaEFsaWduQXZlcmFnZUFjdGlvbi50ZXh0IikpCi0JCS8vIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIGhvcml6QWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBBTElHTl9IT1JaX0FWRVJBR0U7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihoQWxpZ25BdmVyYWdlQWN0aW9uKTsKLQkJLy8KLQkJLy8gLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIHktdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQkvLyBJQWN0aW9uIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMKLQkJLy8gLmdldFN0cmluZygiRGlhZ3JhbVVJLkFic3RyYWN0RGlhZ3JhbUVkaXRvci5oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uLnRleHQiKSkKLQkJLy8geyAvLyROT04tTkxTLTEkCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJLy8gaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIEFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQ7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQkJLy8KLQkJLy8gLy8gYWxpZ24gdmVydGljYWxseSB0byBhdmVyYWdlIHgtdmFsdWUgb2YgYWxsIHNlbGVjdGVkIG5vZGVzCi0JCS8vIElBY3Rpb24gdkFsaWduQXZlcmFnZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLnZBbGlnbkF2ZXJhZ2VBY3Rpb24udGV4dCIpKQotCQkvLyB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyB2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJLy8gfQotCQkvLwotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyByZXR1cm4gQUxJR05fVkVSVF9BVkVSQUdFOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24odkFsaWduQXZlcmFnZUFjdGlvbik7Ci0JCS8vCi0JCS8vIC8vIGFsaWduIHZlcnRpY2FsbHkgdG8geC12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCS8vIElBY3Rpb24gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcwotCQkvLyAuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWJzdHJhY3REaWFncmFtRWRpdG9yLnZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24udGV4dCIpKQotCQkvLyB7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKCk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJLy8gcmV0dXJuIEFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQ7Ci0JCS8vIH0KLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfRlJFRV9URVhULAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLm1vdmVBY3Rpb25fbGFiZWwpIHsgCi0KLQkJCXB1YmxpYyB2b2lkIHNldEltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLQkJCQlzdXBlci5zZXRJbWFnZURlc2NyaXB0b3IobmV3SW1hZ2UpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5ydW5XaXRoRXZlbnQoZXZlbnQpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzdXBlci5ydW4oKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA+IDApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gTU9WRTsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdGV4dCkgeyAKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikgewotCQkJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMSk7Ci0JCQkJCUxpc3QgdGFyZ2V0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKHNvdXJjZUVkaXRQYXJ0IGluc3RhbmNlb2YgRnJlZVRleHROb2RlRWRpdFBhcnQKLQkJCQkJCQl8fCB0YXJnZXRFZGl0UGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoc291cmNlRWRpdFBhcnQgaW5zdGFuY2VvZiBOb2RlRWRpdFBhcnQpIHsKLQkJCQkJCXRhcmdldExpc3QgPSAoKE5vZGVFZGl0UGFydCkgc291cmNlRWRpdFBhcnQpCi0JCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJaWYgKCF0YXJnZXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHRhcmdldExpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTGlua0VkaXRQYXJ0IG9iaiA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRTb3VyY2UoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCWlmICh0YXJnZXRFZGl0UGFydC5lcXVhbHMob2JqLmdldFRhcmdldCgpKSkKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl0YXJnZXRMaXN0ID0gKChOb2RlRWRpdFBhcnQpIHNvdXJjZUVkaXRQYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWlmICghdGFyZ2V0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0YXJnZXRMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmtFZGl0UGFydCBvYmogPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKHRhcmdldEVkaXRQYXJ0LmVxdWFscyhvYmouZ2V0U291cmNlKCkpKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAodGFyZ2V0RWRpdFBhcnQuZXF1YWxzKG9iai5nZXRUYXJnZXQoKSkpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQlpZiAoc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpCi0JCQkJCQlsaW5rLnNldFNvdXJjZSgoTm9kZSkgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCWlmICh0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkKLQkJCQkJCWxpbmsuc2V0VGFyZ2V0KChOb2RlKSB0YXJnZXRFZGl0UGFydC5nZXRNb2RlbCgpKTsKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDcmVhdGVMaW5rQ29tbWFuZCgKLQkJCQkJCQlsaW5rLCAoTm9kZSkgc291cmNlRWRpdFBhcnQuZ2V0TW9kZWwoKSk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IHBhcnQgPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBGcmVlVGV4dE5vZGVFZGl0UGFydCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBDUkVBVEVfTElOSzsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihsaW5rQWN0aW9uKTsKLQotCQlJQWN0aW9uIHNlbGVjdExpbmtBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua19zZWxlY3QpIHsgCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSkgewotCQkJCQlFZGl0UGFydCBwYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIE5vZGVFZGl0UGFydCkgewotCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIHBhcnQpCi0JCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlMaW5rRWRpdFBhcnQgbGlua3BhcnQgPSAoTGlua0VkaXRQYXJ0KSBsaXN0LmdldCgwKTsKLQkJCQkJCQlsaW5rcGFydC5zZXRTZWxlY3RlZCgxKTsKLQkJCQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZWxlY3QobGlua3BhcnQpOwotCQkJCQkJCS8vIHBhcnQuc2V0U2VsZWN0ZWQoMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBTRUxFQ1RfTElOSzsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHNlbGVjdExpbmtBY3Rpb24pOwotCi0JCUlBY3Rpb24gY3JlYXRlQmVuZFBvaW50QWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0JlbmRQb2ludF9jcmVhdGUpIHsgCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSkgewotCQkJCQlFZGl0UGFydCBwYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCkgewotCQkJCQkJLy8gcmV0dXJuIHRydWU7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgKChMaW5rRWRpdFBhcnQpIHBhcnQpLmdldE1vZGVsKCk7Ci0JCQkJCQlMaXN0IGJlbmRwb2ludHMgPSBsaW5rLmdldEJlbmRwb2ludHMoKTsKLQkJCQkJCWlmIChiZW5kcG9pbnRzID09IG51bGwgfHwgYmVuZHBvaW50cy5zaXplKCkgPCAxKSB7Ci0JCQkJCQkJUG9pbnQgc3AgPSBsaW5rLmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCQkJUG9pbnQgdHAgPSBsaW5rLmdldFRhcmdldEVuZFBvaW50KCk7Ci0JCQkJCQkJaWYgKHNwID09IG51bGwpIHsKLQkJCQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJc3AgPSAoKE5vZGUpIGxpbmsuZUNvbnRhaW5lcigpKQotCQkJCQkJCQkJCQkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXNwID0gbGluay5nZXRTb3VyY2UoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICh0cCA9PSBudWxsKSB7Ci0JCQkJCQkJCXRwID0gbGluay5nZXRUYXJnZXQoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCX0KLQkJCQkJCQlQb2ludCBiUG9pbnQgPSBuZXcgUG9pbnQoKTsKLQkJCQkJCQliUG9pbnQueCA9IChzcC54ICsgdHAueCkgLyAyOwotCQkJCQkJCWJQb2ludC55ID0gKHNwLnkgKyB0cC55KSAvIDI7Ci0JCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDcmVhdGVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJbGluaywgYlBvaW50LCAwKTsKLQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSkgewotCQkJCQlFZGl0UGFydCBwYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBDUkVBVEVfQkVORF9QT0lOVDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihjcmVhdGVCZW5kUG9pbnRBY3Rpb24pOwotCi0JCUlBY3Rpb24gcmVmcmVzaEFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLnJlZnJlc2hBY3Rpb25fbGFiZWwpIHsgCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJCX0KLQkJCQlkaWFncmFtLnJlbW92ZUNvbnN1bWVyKEFic3RyYWN0RGlhZ3JhbUVkaXRvci50aGlzKTsKLQkJCQljcmVhdGVFZGl0UGFydCgpOwotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gUkVGUkVTSDsKLQkJCX0KLQkJfTsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihyZWZyZXNoQWN0aW9uKTsKLQkJSUFjdGlvbiBkZWxldGVEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV90ZXh0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKEF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuRGVsZXRlRGlhZ3JhbV90ZXh0LCAKLQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fcHJvbXB0KSkgeyAKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJLmdldENvbnRlbnRzKCkpLmdldE1vZGVsKCk7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGlhZ3JhbS5nZXRVTUFEaWFncmFtKCkpOwotCQkJCQlkb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBERUxFVEVfRElBR1JBTTsKLQkJCX0KLQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGRlbGV0ZURpYWdyYW1BY3Rpb24pOwotCQlJQWN0aW9uIGFsaWduQmVuZFBvaW50QWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuYWxpZ25fYmVuZF9wb2ludF90ZXh0KSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRWRpdFBhcnQgcGFydCA9IChFZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCkgewotCQkJCQlMaW5rRWRpdFBhcnQgbGlua3BhcnQgPSAoKExpbmtFZGl0UGFydCkgcGFydCk7Ci0JCQkJCUxpbmsgbGluayA9IChMaW5rKSBsaW5rcGFydC5nZXRNb2RlbCgpOwotCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpID4gMCkgewotCi0JCQkJCQlHcmFwaGljYWxFZGl0UGFydCBzcGFydCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGxpbmtwYXJ0Ci0JCQkJCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQkJCQlHcmFwaGljYWxFZGl0UGFydCB0cGFydCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGxpbmtwYXJ0Ci0JCQkJCQkJCS5nZXRUYXJnZXQoKSk7Ci0KLQkJCQkJCVBvaW50IHNwID0gc3BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlQb2ludCB0cCA9IHRwYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCi0JCQkJCQlpZiAoc3BhcnQgaW5zdGFuY2VvZiBEZWNpc2lvbk5vZGVFZGl0UGFydAotCQkJCQkJCQl8fCBzcGFydCBpbnN0YW5jZW9mIFN5bmNoQmFyTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJc3AgPSAoKFR5cGVkTm9kZSkgc3BhcnQuZ2V0TW9kZWwoKSkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQlMaXN0IGxpc3QgPSAoKE5vZGVFZGl0UGFydCkgc3BhcnQpCi0JCQkJCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmtFZGl0UGFydCBscCA9IChMaW5rRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKHRwYXJ0KSkgewotCQkJCQkJCQkJUG9pbnQgc291cmNlRW5kUG9pbnQgPSAoKExpbmspIGxwCi0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJCQkJCQkJc3AgPSBzcC5nZXRUcmFuc2xhdGVkKHNvdXJjZUVuZFBvaW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKHRwYXJ0IGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlRWRpdFBhcnQKLQkJCQkJCQkJfHwgdHBhcnQgaW5zdGFuY2VvZiBTeW5jaEJhck5vZGVFZGl0UGFydCkgewotCQkJCQkJCXRwID0gKChUeXBlZE5vZGUpIHRwYXJ0LmdldE1vZGVsKCkpLmdldExvY2F0aW9uKCk7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChOb2RlRWRpdFBhcnQpIHRwYXJ0KQotCQkJCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlMaW5rRWRpdFBhcnQgbHAgPSAoTGlua0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGxwLmdldFNvdXJjZSgpLmVxdWFscyhzcGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IHRhcmdldEVuZFBvaW50ID0gKChMaW5rKSBscAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJCQkJCQkJCXRwID0gdHAuZ2V0VHJhbnNsYXRlZCh0YXJnZXRFbmRQb2ludCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJQWJzb2x1dGVCZW5kcG9pbnQgb2xkYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGxpbmsKLQkJCQkJCQkJCS5nZXRCZW5kcG9pbnRzKCkuZ2V0KGkpOwotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IGJwID0gbmV3IEFic29sdXRlQmVuZHBvaW50KAotCQkJCQkJCQkJbmV3IFBvaW50KC0xLCAtMSkpOwotCQkJCQkJCUFic29sdXRlQmVuZHBvaW50IHByZXZpb3VzYnAgPSBudWxsOwotCQkJCQkJCWludCBkZWx0YSA9IDQwOwotCQkJCQkJCWludCBwb3NpdGlvbiA9IDA7Ci0KLQkJCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQkJCXBvc2l0aW9uID0gc3AuZ2V0UG9zaXRpb24ob2xkYnApOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXByZXZpb3VzYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGxpbmsKLQkJCQkJCQkJCQkuZ2V0QmVuZHBvaW50cygpLmdldChpIC0gMSk7Ci0JCQkJCQkJCXBvc2l0aW9uID0gcHJldmlvdXNicC5nZXRQb3NpdGlvbihvbGRicCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYgKHBvc2l0aW9uID09IFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRICi0JCQkJCQkJCQl8fCBwb3NpdGlvbiA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkgewotCQkJCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQkJCQlpZiAoc3AueCAtIGRlbHRhIDwgb2xkYnAueAotCQkJCQkJCQkJCQkmJiBzcC54ICsgZGVsdGEgPiBvbGRicC54Ci0JCQkJCQkJCQkJCSYmICEoc3AueCA9PSBvbGRicC54KSkgewotCQkJCQkJCQkJCWJwLnggPSBzcC54OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKHByZXZpb3VzYnAueCAtIGRlbHRhIDwgb2xkYnAueAotCQkJCQkJCQkJCQkmJiBwcmV2aW91c2JwLnggKyBkZWx0YSA+IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgIShwcmV2aW91c2JwLnggPT0gb2xkYnAueCkpIHsKLQkJCQkJCQkJCQlicC54ID0gcHJldmlvdXNicC54OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgLSAxID09IGkpIHsKLQkJCQkJCQkJCWlmICh0cC55IC0gZGVsdGEgPCBvbGRicC55Ci0JCQkJCQkJCQkJCSYmIHRwLnkgKyBkZWx0YSA+IG9sZGJwLnkKLQkJCQkJCQkJCQkJJiYgISh0cC55ID09IG9sZGJwLnkpKSB7Ci0JCQkJCQkJCQkJYnAueSA9IHRwLnk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlicC55ID0gb2xkYnAueTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAocG9zaXRpb24gPT0gUG9zaXRpb25Db25zdGFudHMuRUFTVAotCQkJCQkJCQkJfHwgcG9zaXRpb24gPT0gUG9zaXRpb25Db25zdGFudHMuV0VTVCkgewotCi0JCQkJCQkJCWlmIChpID09IDApIHsKLQkJCQkJCQkJCWlmIChzcC55IC0gZGVsdGEgPCBvbGRicC55Ci0JCQkJCQkJCQkJCSYmIHNwLnkgKyBkZWx0YSA+IG9sZGJwLnkKLQkJCQkJCQkJCQkJJiYgIShzcC55ID09IG9sZGJwLnkpKSB7Ci0JCQkJCQkJCQkJYnAueSA9IHNwLnk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlpZiAocHJldmlvdXNicC55IC0gZGVsdGEgPCBvbGRicC55Ci0JCQkJCQkJCQkJCSYmIHByZXZpb3VzYnAueSArIGRlbHRhID4gb2xkYnAueQotCQkJCQkJCQkJCQkmJiAhKHByZXZpb3VzYnAueSA9PSBvbGRicC55KSkgewotCQkJCQkJCQkJCWJwLnkgPSBwcmV2aW91c2JwLnk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSAtIDEgPT0gaSkgewotCQkJCQkJCQkJaWYgKHRwLnggLSBkZWx0YSA8IG9sZGJwLngKLQkJCQkJCQkJCQkJJiYgdHAueCArIGRlbHRhID4gb2xkYnAueAotCQkJCQkJCQkJCQkmJiAhKHRwLnggPT0gb2xkYnAueCkpIHsKLQkJCQkJCQkJCQlicC54ID0gdHAueDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWJwLnggPSBvbGRicC54OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChicC54ID09IC0xICYmIGJwLnkgIT0gLTEpIHsKLQkJCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCQlsaW5rLCBuZXcgUG9pbnQob2xkYnAueCwgYnAueSksIGkpOwotCQkJCQkJCQkvLyAoKFJvb3RFZGl0UGFydClnZXRSb290KCkpLmdldFZpZXdlcigpLmdldEVkaXREb21haW4oKS5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYnAueCAhPSAtMSAmJiBicC55ID09IC0xKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgTW92ZUJlbmRwb2ludENvbW1hbmQoCi0JCQkJCQkJCQkJbGluaywgbmV3IFBvaW50KGJwLngsIG9sZGJwLnkpLCBpKTsKLQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGJwLnggIT0gLTEgJiYgYnAueSAhPSAtMSkgewotCQkJCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IE1vdmVCZW5kcG9pbnRDb21tYW5kKAotCQkJCQkJCQkJCWxpbmssIG5ldyBQb2ludChicC54LCBicC55KSwgaSk7Ci0JCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJTGlzdCBsaXN0ID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAobGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQlpZiAobGlzdC5nZXQoMCkgaW5zdGFuY2VvZiBMaW5rRWRpdFBhcnQpIHsKLQkJCQkJCUxpbmtFZGl0UGFydCBwYXJ0ID0gKExpbmtFZGl0UGFydCkgbGlzdC5nZXQoMCk7Ci0JCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgcGFydC5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0QmVuZHBvaW50cygpLnNpemUoKSA+IDApCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9CRU5EX1BPSU5UOwotCQkJfQotCi0JCX07Ci0JCQotCQkvLyBWaWV3ZXIgUHJpbnQgQWN0aW9uCi0JCWFjdGlvbiA9IG5ldyBEaWFncmFtUHJpbnRBY3Rpb24odGhpcywgZ2V0R3JhcGhpY2FsVmlld2VyKCkpOwotCQlyZWdpc3RyeS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFsaWduQmVuZFBvaW50QWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjcmVhdGVBbkFjdGlvbihTdHJpbmcgYWN0aW9uTmFtZSwKLQkJCUNyZWF0aW9uRmFjdG9yeSBjcmVhdGlvbkZhY3RvcnksIFN0cmluZyBhY3Rpb25JZCwKLQkJCVN0cmluZyB0b29sdGlwU3RyaW5nLCBJbWFnZURlc2NyaXB0b3IgaW1hZ2VkZXNjKSB7Ci0JCWZpbmFsIENyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRpb25GYWN0b3J5OwotCQlmaW5hbCBTdHJpbmcgaWQgPSBhY3Rpb25JZDsKLQkJZmluYWwgU3RyaW5nIHRvb2x0aXAgPSB0b29sdGlwU3RyaW5nOwotCQlmaW5hbCBJbWFnZURlc2NyaXB0b3IgaW1hZ2VkZXNjcmlwdG9yID0gaW1hZ2VkZXNjOwotCQlyZXR1cm4gbmV3IEFjdGlvbihhY3Rpb25OYW1lKSB7IAotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ3JlYXRlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IENyZWF0ZVJlcXVlc3QoKTsKLQkJCQkvLyBDcmVhdGlvbkZhY3RvcnkgZmFjdG9yeSA9IGdldEZhY3RvcnkodGVtcGxhdGUpOwotCQkJCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlyZXF1ZXN0LnNldEZhY3RvcnkoZmFjdG9yeSk7Ci0JCQkJcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsIDEwKSk7Ci0KLQkJCQlpZiAocmVxdWVzdC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJUG9pbnQgbG9jID0gcmVxdWVzdC5nZXRMb2NhdGlvbigpOwotCQkJCQlEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENyZWF0ZU5vZGVDb21tYW5kKAotCQkJCQkJCShOb2RlKSByZXF1ZXN0LmdldE5ld09iamVjdCgpLCBwYXJlbnQsIGxvYyk7Ci0JCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBpZDsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJCQlyZXR1cm4gdG9vbHRpcDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQlvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLQkJCQlzdXBlci5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VkZXNjcmlwdG9yKTsKLQkJCX0KLQotCQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQkJcmV0dXJuIGltYWdlZGVzY3JpcHRvcjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFsZXR0ZVZpZXdlclByb3ZpZGVyIGNyZWF0ZVBhbGV0dGVWaWV3ZXJQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBQYWxldHRlVmlld2VyUHJvdmlkZXIoZ2V0RWRpdERvbWFpbigpKSB7Ci0JCQlwcml2YXRlIElNZW51TGlzdGVuZXIgbWVudUxpc3RlbmVyOwotCi0JCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVQYWxldHRlVmlld2VyKFBhbGV0dGVWaWV3ZXIgdmlld2VyKSB7Ci0JCQkJc3VwZXIuY29uZmlndXJlUGFsZXR0ZVZpZXdlcih2aWV3ZXIpOwotCQkJCS8vIFRPRE8gdmlld2VyLnNldEN1c3RvbWl6ZXIobmV3IExvZ2ljUGFsZXR0ZUN1c3RvbWl6ZXIoKSk7Ci0JCQkJdmlld2VyCi0JCQkJCQkuYWRkRHJhZ1NvdXJjZUxpc3RlbmVyKG5ldyBUZW1wbGF0ZVRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyKAotCQkJCQkJCQl2aWV3ZXIpKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgaG9va1BhbGV0dGVWaWV3ZXIoUGFsZXR0ZVZpZXdlciB2aWV3ZXIpIHsKLQkJCQlzdXBlci5ob29rUGFsZXR0ZVZpZXdlcih2aWV3ZXIpOwotCQkJCWZpbmFsIENvcHlUZW1wbGF0ZUFjdGlvbiBjb3B5ID0gKENvcHlUZW1wbGF0ZUFjdGlvbikgZ2V0QWN0aW9uUmVnaXN0cnkoKQotCQkJCQkJLmdldEFjdGlvbihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSk7Ci0JCQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb3B5KTsKLQkJCQlpZiAobWVudUxpc3RlbmVyID09IG51bGwpCi0JCQkJCW1lbnVMaXN0ZW5lciA9IG5ldyBJTWVudUxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQkJCQkJbWFuYWdlci5hcHBlbmRUb0dyb3VwKAotCQkJCQkJCQkJR0VGQWN0aW9uQ29uc3RhbnRzLkdST1VQX0NPUFksIGNvcHkpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCXZpZXdlci5nZXRDb250ZXh0TWVudSgpLmFkZE1lbnVMaXN0ZW5lcihtZW51TGlzdGVuZXIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvcldpdGhGbHlvdXRQYWxldHRlI2dldFBhbGV0dGVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIEZseW91dFByZWZlcmVuY2VzIGdldFBhbGV0dGVQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG5ldyBGbHlvdXRQcmVmZXJlbmNlcygpIHsKLQkJCXB1YmxpYyBpbnQgZ2V0RG9ja0xvY2F0aW9uKCkgewotCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCS5nZXRJbnQoUEFMRVRURV9ET0NLX0xPQ0FUSU9OKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRQYWxldHRlU3RhdGUoKSB7Ci0JCQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldEludChQQUxFVFRFX1NUQVRFKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRQYWxldHRlV2lkdGgoKSB7Ci0JCQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldEludChQQUxFVFRFX1NJWkUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXREb2NrTG9jYXRpb24oaW50IGxvY2F0aW9uKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCQkJUEFMRVRURV9ET0NLX0xPQ0FUSU9OLCBsb2NhdGlvbik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFBhbGV0dGVTdGF0ZShpbnQgc3RhdGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJCQlQQUxFVFRFX1NUQVRFLCBzdGF0ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFBhbGV0dGVXaWR0aChpbnQgd2lkdGgpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoCi0JCQkJCQlQQUxFVFRFX1NJWkUsIHdpZHRoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgS2V5SGFuZGxlciBnZXRDb21tb25LZXlIYW5kbGVyKCkgewotCQlpZiAoc2hhcmVkS2V5SGFuZGxlciA9PSBudWxsKSB7Ci0JCQlzaGFyZWRLZXlIYW5kbGVyID0gbmV3IEtleUhhbmRsZXIoKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmICgoZXZlbnQuc3RhdGVNYXNrID09IFNXVC5DVFJMKQotCQkJCQkJCSYmIChldmVudC5rZXlDb2RlID09IFNXVC5BUlJPV19SSUdIVCkpIHsKLQkJCQkJCW1vdmUoMSk7Ci0JCQkJCX0KLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpCi0JCQkJCQkJJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX0RPV04pKSB7Ci0JCQkJCQltb3ZlKDIpOwotCi0JCQkJCX0KLQkJCQkJaWYgKChldmVudC5zdGF0ZU1hc2sgPT0gU1dULkNUUkwpCi0JCQkJCQkJJiYgKGV2ZW50LmtleUNvZGUgPT0gU1dULkFSUk9XX1VQKSkgewotCQkJCQkJbW92ZSgzKTsKLQkJCQkJfQotCQkJCQlpZiAoKGV2ZW50LnN0YXRlTWFzayA9PSBTV1QuQ1RSTCkKLQkJCQkJCQkmJiAoZXZlbnQua2V5Q29kZSA9PSBTV1QuQVJST1dfTEVGVCkpIHsKLQkJCQkJCW1vdmUoNCk7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gc3VwZXIua2V5UHJlc3NlZChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gbW92ZShpbnQgZGlyZWN0aW9uKSB7Ci0JCQkJCUxpc3QgbGlzdCA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJCUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGxpc3QuZ2V0KDApOwotCQkJCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCVBvaW50IHBvaW50ID0gbm9kZS5nZXRMb2NhdGlvbigpOwotCQkJCQkJaW50IG5ld3ggPSBwb2ludC54OwotCQkJCQkJaW50IG5ld3kgPSBwb2ludC55OwotCQkJCQkJaW50IHByZXNzbGVuZ3RoID0gMTsKLQkJCQkJCXN3aXRjaCAoZGlyZWN0aW9uKSB7Ci0JCQkJCQljYXNlIDE6Ci0JCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcgUG9pbnQocG9pbnQueCsxMCxwb2ludC55KSk7Ci0JCQkJCQkJbmV3eCA9IHBvaW50LnggKyBwcmVzc2xlbmd0aDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMjoKLQkJCQkJCQkvLyBub2RlLnNldExvY2F0aW9uKG5ldyBQb2ludChwb2ludC54LHBvaW50LnkrMTApKTsKLQkJCQkJCQluZXd5ICs9IHByZXNzbGVuZ3RoOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAzOgotCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3IFBvaW50KHBvaW50LngscG9pbnQueS0xMCkpOwotCQkJCQkJCW5ld3kgLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQ6Ci0JCQkJCQkJLy8gbm9kZS5zZXRMb2NhdGlvbihuZXcgUG9pbnQocG9pbnQueC0xMCxwb2ludC55KSk7Ci0JCQkJCQkJbmV3eCAtPSBwcmVzc2xlbmd0aDsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCQkJCW5vZGUsIG5ldyBQb2ludChuZXd4LCBuZXd5KSwgbm9kZS5nZXRXaWR0aCgpKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQkvLyBUT0RPLSBjaGVjayBhZGRpbmcgbW9yZSBiZW5kcG9pbnQsIGNhcHR1cmUgYmVuZHBvaW50Ci0JCQkJCS8vIGluZGV4IG9uIGZseQotCQkJCQlpZiAocGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgTGluaykgewotCQkJCQkJTGluayBsaW5rID0gKExpbmspIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCUxpc3QgYmxpc3QgPSBsaW5rLmdldEJlbmRwb2ludHMoKTsKLQkJCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCQlpZiAoYmxpc3QgIT0gbnVsbCAmJiBibGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJQWJzb2x1dGVCZW5kcG9pbnQgcG9pbnQgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGJsaXN0Ci0JCQkJCQkJCQkuZ2V0KGluZGV4KTsKLQkJCQkJCQlpbnQgbmV3eCA9IHBvaW50Lng7Ci0JCQkJCQkJaW50IG5ld3kgPSBwb2ludC55OwotCQkJCQkJCWludCBwcmVzc2xlbmd0aCA9IDU7Ci0JCQkJCQkJc3dpdGNoIChkaXJlY3Rpb24pIHsKLQkJCQkJCQljYXNlIDE6Ci0JCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3Ci0JCQkJCQkJCS8vIFBvaW50KHBvaW50LngrMTAscG9pbnQueSkpOwotCQkJCQkJCQluZXd4ID0gcG9pbnQueCArIHByZXNzbGVuZ3RoOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDI6Ci0JCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3Ci0JCQkJCQkJCS8vIFBvaW50KHBvaW50LngscG9pbnQueSsxMCkpOwotCQkJCQkJCQluZXd5ICs9IHByZXNzbGVuZ3RoOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDM6Ci0JCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3Ci0JCQkJCQkJCS8vIFBvaW50KHBvaW50LngscG9pbnQueS0xMCkpOwotCQkJCQkJCQluZXd5IC09IHByZXNzbGVuZ3RoOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQljYXNlIDQ6Ci0JCQkJCQkJCS8vIG5vZGUuc2V0TG9jYXRpb24obmV3Ci0JCQkJCQkJCS8vIFBvaW50KHBvaW50LngtMTAscG9pbnQueSkpOwotCQkJCQkJCQluZXd4IC09IHByZXNzbGVuZ3RoOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQlkZWZhdWx0OgotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLQkJCQkJCQkJCWxpbmssIG5ldyBQb2ludChuZXd4LCBuZXd5KSwgaW5kZXgpOwotCQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQl9OwotCQkJc2hhcmVkS2V5SGFuZGxlcgotCQkJCQkucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5ERUwsIDEyNywgMCksCi0JCQkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQkJCQlBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKSk7Ci0JCQlzaGFyZWRLZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuRjIsIDApLAotCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCQlHRUZBY3Rpb25Db25zdGFudHMuRElSRUNUX0VESVQpKTsKLQotCQl9Ci0JCXJldHVybiBzaGFyZWRLZXlIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGdyYXBoaWNhbFZpZXdlciBmb3IgdGhpcyBFZGl0b3JQYXJ0LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBncmFwaGljYWwgdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0R3JhcGhpY2FsVmlld2VyKEdyYXBoaWNhbFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIuc2V0R3JhcGhpY2FsVmlld2VyKHZpZXdlcik7Ci0JCWlmIChhY3Rpb25TZXJ2aWNlICE9IG51bGwpIHsKLQkJCWFjdGlvblNlcnZpY2Uuc2V0R3JhcGhpY2FsVmlld2VyKHZpZXdlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCQlTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLQotCQkvLyBMaXN0IHpvb21MZXZlbHMgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQkvLyB6b29tTGV2ZWxzLmFkZChab29tTWFuYWdlci5GSVRfQUxMKTsKLQkJLy8gem9vbUxldmVscy5hZGQoWm9vbU1hbmFnZXIuRklUX1dJRFRIKTsKLQkJLy8gem9vbUxldmVscy5hZGQoWm9vbU1hbmFnZXIuRklUX0hFSUdIVCk7Ci0JCS8vIHJvb3QuZ2V0Wm9vbU1hbmFnZXIoKS5zZXRab29tTGV2ZWxDb250cmlidXRpb25zKHpvb21MZXZlbHMpOwotCQkvLwotCQkvLyBJQWN0aW9uIHpvb21JbiA9IG5ldyBab29tSW5BY3Rpb24ocm9vdC5nZXRab29tTWFuYWdlcigpKTsKLQkJLy8gSUFjdGlvbiB6b29tT3V0ID0gbmV3IFpvb21PdXRBY3Rpb24ocm9vdC5nZXRab29tTWFuYWdlcigpKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbih6b29tSW4pOwotCQkvLyBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHpvb21PdXQpOwotCQkvLyBnZXRTaXRlKCkuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKS5yZWdpc3RlckFjdGlvbih6b29tSW4pOwotCQkvLyBnZXRTaXRlKCkuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKS5yZWdpc3RlckFjdGlvbih6b29tT3V0KTsKLQotCQl2aWV3ZXIuc2V0Um9vdEVkaXRQYXJ0KHJvb3QpOwotCi0JCS8vIHZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkobmV3IE1ldGhvZEVsZW1lbnRFZGl0UGFydEZhY3RvcnkoKSk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCi0JCUNvbnRleHRNZW51UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoCi0JCQkJZ2V0R3JhcGhpY2FsVmlld2VyKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZXh0TWVudShwcm92aWRlcik7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KAotCQkJCSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMud29ya2Zsb3cuY29udGV4dG1lbnUiLCAvLyROT04tTkxTLTEkCi0JCQkJcHJvdmlkZXIsIGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQotCQl2aWV3ZXIuc2V0S2V5SGFuZGxlcihuZXcgR3JhcGhpY2FsVmlld2VyS2V5SGFuZGxlcih2aWV3ZXIpCi0JCQkJLnNldFBhcmVudChnZXRDb21tb25LZXlIYW5kbGVyKCkpKTsKLQotCQkvLyBsb2FkUHJvcGVydGllcygpOwotCi0JCS8vIEFjdGlvbnMKLQkJLy8gSUFjdGlvbiBzaG93UnVsZXJzID0gbmV3Ci0JCS8vIFRvZ2dsZVJ1bGVyVmlzaWJpbGl0eUFjdGlvbihnZXRHcmFwaGljYWxWaWV3ZXIoKSk7Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc2hvd1J1bGVycyk7Ci0JCS8vICAgIAkKLQkJLy8gSUFjdGlvbiBzbmFwQWN0aW9uID0gbmV3Ci0JCS8vIFRvZ2dsZVNuYXBUb0dlb21ldHJ5QWN0aW9uKGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzbmFwQWN0aW9uKTsKLQkJLy8KLQkJLy8gSUFjdGlvbiBzaG93R3JpZCA9IG5ldyBUb2dnbGVHcmlkQWN0aW9uKGdldEdyYXBoaWNhbFZpZXdlcigpKTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzaG93R3JpZCk7Ci0KLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWhhbmRsZUFjdGl2YXRpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBsaXN0ZW5lcik7Ci0JCWdldEdyYXBoaWNhbENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotCi0JCWdldEdyYXBoaWNhbENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuTW91c2VEb3VibGVDbGljaywgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWhhbmRsZURvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCX0KLQotCQl9KTsKLQkJaWYgKGdldERpYWdyYW1UeXBlKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSkKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJZ2V0R3JhcGhpY2FsQ29udHJvbCgpLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0NPTlRFWFQpOwotCQllbHNlIGlmIChnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XKSkKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJCWdldEdyYXBoaWNhbENvbnRyb2woKSwgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfQUNUSVZJVFlfRElBR1JBTV9DT05URVhUKTsgCi0JCWVsc2UgaWYgKGdldERpYWdyYW1UeXBlKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWSkpCi0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKGdldEdyYXBoaWNhbENvbnRyb2woKSwgQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfV1BfREVQRU5ERU5DWV9ESUFHUkFNX0NPTlRFWFQpOwotCi0JCURpc3BsYXkgZGlzcGxheSA9IGdldEdyYXBoaWNhbENvbnRyb2woKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChnZXRQYWxldHRlUm9vdCgpICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBvYmogPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgb2JqKSkgewotCQkJCQkJCUxpc3QgbGlzdCA9IGdldFBhbGV0dGVSb290KCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVBhbGV0dGVFbnRyeSBlbnRyeSA9IChQYWxldHRlRW50cnkpIGl0b3IubmV4dCgpOwotCQkJCQkJCQllbnRyeS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gZ2V0UGFsZXR0ZVJvb3QoKS5nZXRDaGlsZHJlbigpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJUGFsZXR0ZUVudHJ5IGVudHJ5ID0gKFBhbGV0dGVFbnRyeSkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWVudHJ5LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCi0JCWN1cnJlbnRDb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQotCQkvLyBsaXN0ZW4gdG8gY2hhbmdlIGZvciBjdXJyZW50IHNlbGVjdGlvbiBvZiBNZXRob2RDb25maWd1cmF0aW9uIG9yIGNoYW5nZXMgaW4gCi0JCS8vIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJLy8KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQl9Ci0JCQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuUFJJTlQuZ2V0SWQoKSk7Ci0JCWlmKGFjdGlvbiBpbnN0YW5jZW9mIERpYWdyYW1QcmludEFjdGlvbil7Ci0JCQkoKERpYWdyYW1QcmludEFjdGlvbilhY3Rpb24pLnNldFZpZXdlcih2aWV3ZXIpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUdyYXBoaWNhbFZpZXdlcigpOwotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0KLQkJVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIgbGlzdGVuZXIgPSBjcmVhdGVEcm9wVGFyZ2V0TGlzdGVuZXIoKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLmFkZERyb3BUYXJnZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBBYnN0cmFjdEVkaXRQYXJ0Vmlld2VyCi0JCS8vIGdldEdyYXBoaWNhbFZpZXdlcigpLmFkZERyb3BUYXJnZXRMaXN0ZW5lcigKLQkJLy8gbmV3IFRleHRUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcihnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJLy8gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKSB7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZiAoZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuRlJFRV9URVhUKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuRlJFRV9URVhUKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkZSRUVfVEVYVDsKLQkJCQl9Ci0KLQkJCX07Ci0JCUNyZWF0aW9uRmFjdG9yeSBjcmVhdGlvbkZhY3RvcnkgPSBmcmVlVHh0Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEcm9wVGFyZ2V0TGlzdGVuZXIoKQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lciBjcmVhdGVEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVtcGxhdGVUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcihnZXRHcmFwaGljYWxWaWV3ZXIoKSkgewotCi0JCQlwcm90ZWN0ZWQgQ3JlYXRpb25GYWN0b3J5IGdldEZhY3RvcnkoT2JqZWN0IHRlbXBsYXRlKSB7Ci0JCQkJcmV0dXJuIChDcmVhdGlvbkZhY3RvcnkpIHRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwCi0JCQkJCQkuZ2V0KHRlbXBsYXRlKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRpb25DaGFuZ2VkKEV2ZW50IGV2ZW50KSB7Ci0JCUlBY3Rpb24gY29weSA9IG51bGw7Ci0JCWlmIChldmVudC50eXBlID09IFNXVC5EZWFjdGl2YXRlKQotCQkJY29weSA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKEFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpKTsKLQkJaWYgKGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSkgIT0gY29weSkgewotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCQlBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwgY29weSk7Ci0JCQlnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnVpLnBhcnRzLkdyYXBoaWNhbEVkaXRvcldpdGhGbHlvdXRQYWxldHRlI2dldFBhbGV0dGVSb290KCkKLQkgKi8KLQlwcm90ZWN0ZWQgUGFsZXR0ZVJvb3QgZ2V0UGFsZXR0ZVJvb3QoKSB7Ci0JCWlmIChwYWxldHRlUm9vdCA9PSBudWxsKSB7Ci0JCQljcmVhdGVQYWxldHRlUm9vdCgpOwotCQl9Ci0JCXJldHVybiBwYWxldHRlUm9vdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlUGFsZXR0ZVJvb3QoKSB7Ci0JCXBhbGV0dGVSb290ID0gbmV3IFBhbGV0dGVSb290KCk7Ci0JCXBhbGV0dGVSb290LmFkZEFsbChjcmVhdGVDYXRlZ29yaWVzKHBhbGV0dGVSb290KSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGNyZWF0ZUNhdGVnb3JpZXMoUGFsZXR0ZVJvb3Qgcm9vdCkgewotCQlMaXN0IGNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJUGFsZXR0ZUNvbnRhaW5lciBwYWxldHRlQ29udGFpbmVyID0gY3JlYXRlQ29udHJvbEdyb3VwKHJvb3QpOwotCQlpZiAocGFsZXR0ZUNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQljYXRlZ29yaWVzLmFkZChwYWxldHRlQ29udGFpbmVyKTsKLQkJfQotCi0JCXJldHVybiBjYXRlZ29yaWVzOwotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCS8vIHNhdmVEaWFncmFtKCk7Ci0JCS8vIHNhdmVTY3JlZW4oKTsKLQotCQlmaW5hbCBNZXRob2RFbGVtZW50IGUgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVNhZmVSdW5uYWJsZS5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvcgotCQkJCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfdGV4dCwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgCi0JCQkJCW1vbml0b3IKLQkJCQkJCQkuc2V0VGFza05hbWUoRGlhZ3JhbVVJUmVzb3VyY2VzLmJpbmQoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX21lc3NhZ2UKLQkJCQkJCQkJCSwgZS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSA/IGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiBlLmdldE5hbWUoKSkpOyAKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKGUuZVJlc291cmNlKCkpOwotCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pICgoRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJCQkJCS5nZXRDb250ZW50cygpKS5nZXRNb2RlbCgpOwotCQkJCQkJZGlhZ3JhbS5zZXROZXcoZmFsc2UpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRTaXRlKCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXRUZXh0KCksCi0JCQkJCQkJCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLmRpYWdyYW1fc2F2ZUVycm9yCi0JCQkJCQkJCQkJLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCQkvLyBSZWZyZXNoIHRoZSBuZWNlc3Nhcnkgc3RhdGUuCi0JCQkJCS8vCi0JCQkJCS8vZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLm1hcmtTYXZlTG9jYXRpb24oKTsKLQkJCQkJZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJCWNoYW5nZVRpbWUgPSAtMTsKLQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpLmlzRGlydHkoKTsKLQl9Ci0KLQkvKiogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJaWYgKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmlzUmVhZE9ubHkoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVkaXRQYXJ0KCkgewotCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQlPYmplY3Qgb2JqZWN0OwotCQlpZiAoZWRpdG9ySW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCW9iamVjdCA9IGVkaXRvcklucHV0LmdldFdyYXBwZXIoKTsKLQkJfSBlbHNlIHsKLQkJCW9iamVjdCA9IGVkaXRvcklucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJfQotCQkKLQkJY2hhbmdlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQllZGl0UGFydCA9IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpOwotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gcGFzcyBhbG9uZyB0aGUgU3VwcHJlc3Npb24gaW5zdGFuY2UgZnJvbSBpbnB1dCB0byBkaWFncmFtIG1vZGVsCi0JCS8vCi0JCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oZWRpdG9ySW5wdXQuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCWRpYWdyYW0uc2V0T2JqZWN0KG9iamVjdCk7Ci0JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQotCQlpZighZGlhZ3JhbS5pc05ldygpKSB7Ci0JCQljaGFuZ2VUaW1lID0gLTE7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQotCQlNZXRob2RFbGVtZW50IGUgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVkaXRQYXJ0KCk7Ci0KLQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCk7Ci0JCQlzZXRQYXJ0TmFtZShnZXRQYXJ0TmFtZVByZWZpeCgpCi0JCQkJCSsgZS5nZXROYW1lKCkKLQkJCQkJKyAiLCAiICsgZWRpdG9ySW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc2V0VGl0bGVJbWFnZShnZXRUeXBlSW1hZ2UoZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaWFncmFtVHlwZSgpOwotCi0JLyoqCi0JICogR2V0IHBhcmVudCBlZGl0b3IKLQkgKiBAcmV0dXJuIGVkaXRvcgotCSAqLwotCXB1YmxpYyBJRWRpdG9yUGFydCBnZXRQYXJlbnRFZGl0b3IoKSB7Ci0JCXJldHVybiBwYXJlbnRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RWRpdG9yKElFZGl0b3JQYXJ0IHBhcmVudEVkaXRvcikgewotCQl0aGlzLnBhcmVudEVkaXRvciA9IHBhcmVudEVkaXRvcjsKLQl9Ci0JCi0JLy9BZGRpbmcgbGlicmFyeWNobmFnZWQgbGlzdGVuZXIsIGlmIGNvbmZpZ3VyYXRpb24gZ290IGNoYW5nZWQgZGlhZ3JhbSBuZWVkcyB0byByZWZyZXNoCi0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCXN3aXRjaCAob3B0aW9uKSB7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24uY29udGFpbnMoY3VycmVudENvbmZpZykpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsJCQkJCQotCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKTsKLQkJCQkJCWFjdGlvbi5ydW4oKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0Uuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCQl9Ci0JCQkJfQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBoYW5kbGVkIGJ5IGxpYlN2Y0xpc3RlbmVyCi0JCQkvLwotLy8JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NPTkZJR1VSQVRJT05fU0VMRUNURUQ6IHsKLS8vCQkJCWNvbmZpZ0NoYW5nZWQoKTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCQotCXByaXZhdGUgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJY29uZmlnQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0JCQotCX07Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ0NoYW5nZWQoKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZihjdXJyZW50Q29uZmlnICE9IGNvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGRpYWdyYW0gZWRpdG9yIG9yIHByb2Nlc3MgZWRpdG9yIG9mIHRoZSBwcm9jZXNzCi0JCQkvLyB0aGF0IG93bnMgdGhpcyBkaWFncmFtCi0JCQkvLwotCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9ICBhY3RpdmVQYXJ0ID09IHRoaXM7Ci0JCQlpZighcmVmcmVzaCkgewotCQkJCWlmKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpICgoUHJvY2Vzc0VkaXRvcilhY3RpdmVQYXJ0KS5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3QgcHJvY0NvbXAgPSBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCUVPYmplY3QgZGlhZ3JhbSA9ICgoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRVTUFEaWFncmFtKCk7Ci0JCQkJCXJlZnJlc2ggPSBVbWFVdGlsLmlzQ29udGFpbmVkQnkoZGlhZ3JhbSwgcHJvY0NvbXApOwotCQkJCX0KLQkJCX0KLQkJCWlmKHJlZnJlc2gpIHsKLQkJCQljdXJyZW50Q29uZmlnID0gY29uZmlnOwotCQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCk7Ci0JCQkJYWN0aW9uLnJ1bigpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvbkxpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKiBvdmVycmlkZSB0byBkb25vdCBhbGxvdyBhbnkgbm9kZSBzZWxlY3Rpb24gaW4gQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JICogaWYgYWN0aXZpdHkgaXMgZXh0ZW5kcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQlpZihlZGl0UGFydCAhPSBudWxsKXsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQlpZihkaWFncmFtLmlzUmVhZE9ubHkoKSB8fCBUbmdVdGlsLmlzTG9ja2VkKGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkpewotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNlbGVjdChlZGl0UGFydCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaERpYWdyYW0oKXsKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVGUkVTSCkucnVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGRpc3Bvc2VkOwotCX0KLQotCQotLy8JLyoKLS8vCSAqIE1ldGhvZCBzZXRzIHRoZSBjb250ZXh0IG1lbnUgY29udHJpYnV0aW5nIGl0ZW1zIHN0YXRlLgotLy8JICogVGhpcyBpcyBlZmZpY2llbnQgd2F5IGluc3RlYWQgb2YgZG9pbmcgYXQgZWFjaCBhY3Rpb24uIAotLy8JICogVW5jb21tZW50IHRoaXMgY29kZSwgb25jZSBhbGwgdGhlIHBsYWNlIGlzRW5hYmxlZCBDb2RlIGlzIHJlbW92ZWQuCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHNldFN0YXRlTWVudUNvbnRyaWJ1dGVJdGVtcygpewotLy8JCQotLy8JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLS8vCQlpZihlZGl0UGFydHMuc2l6ZSgpID09IDApewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihERUxFVEVfRElBR1JBTSkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQl9Ci0vLwkJaWYoZWRpdFBhcnRzLnNpemUoKSA9PSAxKXsKLS8vCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpZWRpdFBhcnRzLmdldCgwKTsKLS8vCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oU0VMRUNUX0xJTkspLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCWlmIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0vLwkJCQlpZigoKFR5cGVkTm9kZSkgZWRpdFBhcnQuZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5GUkVFX1RFWFQpCi0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihGT05UX0RJQUxPRykuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFNFTEVDVF9MSU5LKS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJfQotLy8JCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIExpbmtFZGl0UGFydCl7Ci0vLwkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfQkVORF9QT0lOVCkuc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCUxpbmsgbGluayA9IChMaW5rKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0vLwkJCQlpZihsaW5rLmdldEJlbmRwb2ludHMoKS5zaXplKCkgPiAwKXsKLS8vCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBTElHTl9CRU5EX1BPSU5UKS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCQotLy8JCX0KLS8vCQlpZihlZGl0UGFydHMuc2l6ZSgpID09IDIpewotLy8JCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfTElOSykuc2V0RW5hYmxlZCh0cnVlKTsgCi0vLwkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGVkaXRQYXJ0cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLS8vCQkJCU9iamVjdCBwYXJ0ID0gaXRvci5uZXh0KCk7Ci0vLwkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEZyZWVUZXh0RWRpdFBhcnQpCi0vLwkJCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0xJTkspLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCQotLy8JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0vLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotLy8JCXN1cGVyLnNldEZvY3VzKCk7Ci0vLwkJLy8gUmVmcmVzaCBpcyBleHBlbnNpdmUgb3BlcmF0aW9uLgotLy8JCS8vIFRPRE8gLSBmaW5kIHByb2Nlc3Mgc29sdXRpb24gZm9yIG5vdGlmaWNhdGlvbiBiZXR3ZWVuIAotLy8JCS8vIGJhc2UgZGlhZ3JhbSBhbmQgZXh0ZW5kIGRpYWdyYW0uICAgICAKLS8vCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCk7Ci0vLwkJaWYoKChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCkpLmlzUmVhZE9ubHkoKSl7Ci0vLwkJCWdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFJFRlJFU0gpLnJ1bigpOwotLy8JCX0KLS8vCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpewotLy8JCQlpZigoKFZhcmlhYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSBudWxsKXsKLS8vCQkJCWlmKCEoKFZhcmlhYmlsaXR5RWxlbWVudCllbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLk5BX0xJVEVSQUwpKXsKLS8vCQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkJCi0vLwkJfQotLy8JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjYWNhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuRGlhZ3JhbVVwZGF0ZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5GcmVlVGV4dE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLkRpYWdyYW1VSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuTWFycXVlZVRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9ESUFHUkFNX0xBWU9VVCA9ICJyZXNldF9kaWFncmFtX2xheW91dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3JlYXRpb25GYWN0b3J5IHJvbGVOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgdGFza05vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSB3cGROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxDbGVhblVwID0gZmFsc2U7Ci0JcHJpdmF0ZSBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQotCS8vIGEgaGFjawotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydEZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCQkvLyByZXR1cm4gbmV3IEVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJLy8KLQkJLy8gcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQkvLyBpZihtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkvLyByZXR1cm4gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KChBY3Rpdml0eURldGFpbERpYWdyYW0pCi0JCS8vIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUpIHsKLQkJLy8gcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KChSb2xlVGFza0NvbXBvc2l0ZSkgbW9kZWwpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSl7Ci0JCS8vIHJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpCi0JCS8vIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKG1vZGVsIGluc3RhbmNlb2YgUm9sZU5vZGUKLQkJLy8gfHwgbW9kZWwgaW5zdGFuY2VvZiBUYXNrTm9kZQotCQkvLyB8fCBtb2RlbCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUKLQkJLy8gKQotCQkvLyB7Ci0JCS8vIHJldHVybiBuZXcgRGVzY3JpcHRvck5vZGVFZGl0UGFydCgoTmFtZWROb2RlKSBtb2RlbCk7Ci0JCS8vIH0KLQkJLy8gZWxzZSBpZihtb2RlbCBpbnN0YW5jZW9mIExpbmspIHsKLQkJLy8gcmV0dXJuIG5ldyBMaW5rRWRpdFBhcnQoKExpbmspIG1vZGVsKTsKLQkJLy8gfQotCQkvLyBpZihtb2RlbCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkvLyBUeXBlZE5vZGUgbm9kZSA9IChUeXBlZE5vZGUpIG1vZGVsOwotCQkvLyBzd2l0Y2gobm9kZS5nZXRUeXBlKCkpIHsKLQkJLy8gY2FzZSBUeXBlZE5vZGUuU1RBUlQ6IHJldHVybiBuZXcgU3RhcnROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkVORDogcmV0dXJuIG5ldyBFbmROb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOiByZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KG5vZGUpOwotCQkvLyBjYXNlIFR5cGVkTm9kZS5TWU5DSF9CQVI6IHJldHVybiBuZXcgU3luY2hCYXJOb2RlRWRpdFBhcnQobm9kZSk7Ci0JCS8vIGNhc2UgVHlwZWROb2RlLkZSRUVfVEVYVDogcmV0dXJuIG5ldyBGcmVlVGV4dEVkaXRQYXJ0KG5vZGUpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZURpYWdyYW1FZGl0UGFydCgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZURpYWdyYW1FZGl0UGFydCgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQl9Ci0KLS8vCS8qCi0vLwkgKiAobm9uLUphdmFkb2MpCi0vLwkgKiAKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0KQotLy8JICovCi0vLwlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUpIHsKLS8vCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCS5jcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLS8vCQlkaWFncmFtLnNldE9iamVjdChlKTsKLS8vCQlFZGl0UGFydCBwYXJ0ID0gbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KGRpYWdyYW0pOwotLy8JCXBhcnQuc2V0TW9kZWwoZGlhZ3JhbSk7Ci0vLwkJZGlhZ3JhbS5hZGRDb25zdW1lcih0aGlzKTsKLS8vCQlyZXR1cm4gcGFydDsKLS8vCX0KLQkJCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2dldFBhcnROYW1lUHJlZml4KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7IAotCX0KLQotCXByb3RlY3RlZCBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZUNvbnRyb2xHcm91cChQYWxldHRlUm9vdCByb290KSB7Ci0JCWluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCi0JCVBhbGV0dGVHcm91cCBjb250cm9sR3JvdXAgPSBuZXcgUGFsZXR0ZUdyb3VwKCJDb250cm9sIEdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJVG9vbEVudHJ5IHRvb2wgPSBuZXcgUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwCi0JCSk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQkJcm9vdC5zZXREZWZhdWx0RW50cnkodG9vbCk7Ci0KLQkJdG9vbCA9IG5ldyBNYXJxdWVlVG9vbEVudHJ5KCk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMjQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCUNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5IGNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5GUkVFX1RFWFQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZyZWV0ZXh0X3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29udHJvbEdyb3VwLmFkZEFsbChlbnRyaWVzKTsKLQkJcmV0dXJuIGNvbnRyb2xHcm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCi0JCWlmIChyb2xlTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlyb2xlTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJUm9sZVRhc2tDb21wb3NpdGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1I7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCUNyZWF0aW9uRmFjdG9yeSBjcmVhdGlvbkZhY3RvcnkgPSByb2xlTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAodGFza05vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotCQkJdGFza05vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCU5hbWVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJY3JlYXRpb25GYWN0b3J5ID0gdGFza05vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHdwZE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotCQkJd3BkTm9kZUNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJTmFtZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuVEFTS19ERVNDUklQVE9SOwotCQkJCX0KLQotCQkJfTsKLQkJfQotCQljcmVhdGlvbkZhY3RvcnkgPSB3cGROb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEVkaXRvciBJbnB1dAotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFZGl0b3JJbnB1dCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlCi0JCSAqLwotCQlwdWJsaWMgRWRpdG9ySW5wdXQoT2JqZWN0IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCQlzdXBlcihlLCBzdXBwcmVzc2lvbik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFNldCBmb2N1cyBvbiB0aGUgZWRpdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuR3JhcGhpY2FsRWRpdG9yI3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJc3VwZXIuc2V0Rm9jdXMoKTsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKS5yZWZyZXNoKCk7Ci0JCWlmICghaW5pdGlhbENsZWFuVXApIHsKLQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCQlpbml0aWFsQ2xlYW5VcCA9IHRydWU7Ci0JCQkvLyBMb2NrZWQgUGx1Z2luIGNhc2U6IERpc3BsYXkgZ2VuZXJhdGVkIEFERCBkaWFncmFtLCBQZXJtaXNzaW9uIGRlbmllZCB0byBzYXZlLCAgCi0JCQkvLyBhbmQgTm8gZGlydHkgZmxhZyBvbiBlZGl0b3IuIAotCQkJaWYoVG5nVXRpbC5pc0xvY2tlZChnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KCkpKXsKLQkJCQkvLyBGbHVzaCBhbGwgY29tbWFuZHMsIG1lYW5zIHdpbGwgbm90IHNhdmUuCi0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJCQkvLyBGaXJlIGRpcnR5IGZsYWcgcHJvcGVydHkgY2hhbmdlLCBubyBkaXJ0eSBmbGFnIG9uIGVkaXRvci4KLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhbiBkaWFncmFtCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwRGlhZ3JhbSgpIHsKLS8vCQlNZXRob2RFbGVtZW50IG9iaiA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpKQotLy8JCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJRGlhZ3JhbVVwZGF0ZVNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtVXBkYXRlU2VydmljZSgKLQkJCQlnZXRHcmFwaGljYWxWaWV3ZXIoKSwgZ2V0RWRpdERvbWFpbigpLCBnZXRBY3Rpb25SZWdpc3RyeSgpKTsKLQkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCQkvLyBpZiAoVG5nVXRpbC5pc0dlbmVyYWxpemVyKG9iaiwKLQkJLy8gZ2V0RXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMoKSkKLQkJLy8gJiYgIWluaXRpYWxDbGVhblVwKSB7Ci0JCS8vIGluaXRpYWxDbGVhblVwID0gdHJ1ZTsKLQkJLy8gSUFjdGlvbiByZXNldCA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkvLyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQkvLyByZXNldC5ydW4oKTsKLQkJLy8gZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkvLyB9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVRvQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvQ29udGV4dE1lbnUobWVudSk7Ci0KLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSAhaXNSZWFkT25seSgpOwotCi0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5pbnNlcnRCZWZvcmUoREVMRVRFX0RJQUdSQU0sIGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlQWN0aW9ucygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQlBY3Rpb24gcmVzZXRMYXlvdXRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQpIHsgCi0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihSRUZSRVNIKS5ydW4oKTsKLQkJCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYoZGVwLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiAhZGVwLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKXsKLQkJCQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGRlcC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmKCEobmV4dCBpbnN0YW5jZW9mIEZyZWVUZXh0Tm9kZUVkaXRQYXJ0KSl7Ci0JCQkJCQkJCWxvY2FsLmFkZChuZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpLmFkZEFsbChsb2NhbCk7Ci0JCQkJCWNsZWFuVXBEaWFncmFtKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQkJcmV0dXJuIGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuc2l6ZSgpID09IDA7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIFJFU0VUX0RJQUdSQU1fTEFZT1VUOwotCQkJfQotCi0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24ocmVzZXRMYXlvdXRBY3Rpb24pOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBleHRlbmRBbmRDb250cmlidXRlVmFyaWFiaWxpdHlUeXBlcyA9IG51bGw7Ci0KLS8vCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0RXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMoKSB7Ci0vLwkJaWYgKGV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzID09IG51bGwpIHsKLS8vCQkJZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzCi0vLwkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKTsKLS8vCQkJZXh0ZW5kQW5kQ29udHJpYnV0ZVZhcmlhYmlsaXR5VHlwZXMKLS8vCQkJCQkuYWRkKFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFU19MSVRFUkFMKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGV4dGVuZEFuZENvbnRyaWJ1dGVWYXJpYWJpbGl0eVR5cGVzOwotLy8JfQotCQotCS8qKgotCSAqIEJyZWFrIGRvd24gYWRhcHRlciBmYWN0b3J5IGNsYXNzCi0JICovCi0JcHVibGljIGNsYXNzIEJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd3Bic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCi0JCXB1YmxpYyBCcmVha2Rvd25BZGFwdGVyRmFjdG9yeShNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykKLQkJewotCQkJLy8gY3JlYXRlIGFkYXB0IGZhY3RvcmllcwotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl3cGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdQQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQljYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCQkJLy8gc2V0IGNvbmZpZ3VyYXRpb24gZmlsdGVyCi0JCQlEaWFncmFtQWRhcHRlckZhY3RvcnlGaWx0ZXIgY29uZmlndXJhdG9yID0gbmV3IERpYWdyYW1BZGFwdGVyRmFjdG9yeUZpbHRlcigKLQkJCQkJbWV0aG9kQ29uZmlnLCB0aGlzKTsKLQotCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCQl0YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCWNic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKQotCQl7Ci0JCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh0YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJCX0KLQotCQkJaWYgKHdwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAoY2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRGlhZ3JhbSBBZGFwdGVyIGZhY3RvcnkgZmlsdGVyCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyIGV4dGVuZHMgUHJvY2Vzc0NvbmZpZ3VyYXRvcgotCQkJaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnlGaWx0ZXIgewotCi0JCXByaXZhdGUgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkJLyoKLQkJICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbUFkYXB0ZXJGYWN0b3J5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlzdXBlcihtZXRob2RDb25maWcpOwotCQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gV0JTIEFkYXB0ZXIgRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3Rvcnkud2JzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIFRlYW0gQWxsb2NhdGlvbiBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRUQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBmYWN0b3J5LnRic0FkYXB0ZXJGYWN0b3J5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBXUCBVc2FnZSBBZGFwdGVyIEZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS53cGJzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGNvbnNvbGlkYXRlZCB2aWV3IGFkYXB0ZXIgZmFjdG9yeQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIGZhY3RvcnkuY2JzQWRhcHRlckZhY3Rvcnk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGZhY3RvcnkgIT0gbnVsbCl7Ci0JCQlmYWN0b3J5LmNsZWFyKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0JyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0JyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMwZTk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQnJlYWtkb3duIEVsZW1lbnQgaW5wdXQgZm9yIGFuIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA3LCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgewotCi0JcHJpdmF0ZSBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dChPYmplY3Qgb2JqZWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlzdXBlcigoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQl9Ci0JCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHN1cHByZXNzaW9uLgotCSAqLwotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd3JhcHBlci4KLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBvdGhlciA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIG9iajsKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50KCkgPT0gb3RoZXIuZ2V0TWV0aG9kRWxlbWVudCgpCi0JCQkJCSYmIHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKSA9PSBvdGhlci5nZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBzdXBlci5oYXNoQ29kZSgpOwotCQlyZXN1bHQgXj0gc3VwcHJlc3Npb24uZ2V0UHJvY2VzcygpLmhhc2hDb2RlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbHVtbkRlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db2x1bW5EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjMyYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbHVtbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiBDb2x1bW4gZGVzY3JpcHRvcnMgdXNlZCBmb3IgcHJvY2VzcyBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2x1bW5EZXNjcmlwdG9yIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTY3MTg0NzY5ODU5NzA5OTdMOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9OT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTExfRURJVE9SX1RZUEVfVEVYVCA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU4gPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOID0gMzsKLQotCXB1YmxpYyBTdHJpbmcgaWQ7Ci0KLQlwdWJsaWMgU3RyaW5nIGxhYmVsOwotCi0JcHVibGljIGludCB3aWR0aDsKLQotCXB1YmxpYyBib29sZWFuIHJlc2l6YWJsZTsKLQotCXB1YmxpYyBpbnQgY2VsbEVkaXRvclR5cGU7Ci0KLQlwdWJsaWMgaW50IHdlaWdodDsKLQotCXB1YmxpYyBpbnQgYWxpZ25tZW50OwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogCQkJSUQgb2YgdGhlIGNvbHVtbgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIAkJCUNvbHVtbiBOYW1lCi0JICogQHBhcmFtIHdlaWdodAotCSAqIAkJCUNvbHVtbiB3ZWlnaHQKLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAJCQlDb2x1bW4gV2lkdGgKLQkgKiBAcGFyYW0gcmVzaXphYmxlCi0JICogCQkJRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIGNvbHVtbiBpcyByZXNpemFibGUgb3Igbm90Ci0JICogQHBhcmFtIGNlbGxFZGl0b3JUeXBlCi0JICogCQkJQ29sdW1uIGNlbGwgZWRpdG9yIHR5cGUKLQkgKi8KLQlwdWJsaWMgQ29sdW1uRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgaW50IHdlaWdodCwgaW50IHdpZHRoLAotCQkJYm9vbGVhbiByZXNpemFibGUsIGludCBjZWxsRWRpdG9yVHlwZSkgewotCQl0aGlzKGlkLCBsYWJlbCwgd2VpZ2h0LCB3aWR0aCwgcmVzaXphYmxlLCBjZWxsRWRpdG9yVHlwZSwgU1dULkxFRlQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAJCQlJRCBvZiB0aGUgY29sdW1uCi0JICogQHBhcmFtIGxhYmVsCi0JICogCQkJQ29sdW1uIE5hbWUKLQkgKiBAcGFyYW0gd2VpZ2h0Ci0JICogCQkJQ29sdW1uIHdlaWdodAotCSAqIEBwYXJhbSB3aWR0aAotCSAqIAkJCUNvbHVtbiBXaWR0aAotCSAqIEBwYXJhbSByZXNpYWJsZQotCSAqIAkJCUZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gaXMgcmVzaXphYmxlIG9yIG5vdAotCSAqIEBwYXJhbSBjZWxsRWRpdG9yVHlwZQotCSAqIAkJCUNvbHVtbiBjZWxsIGVkaXRvciB0eXBlCi0JICogQHBhcmFtIGFsaWdubWVudAotCSAqIAkJCUNvbHVtbiBhbGlnbm1lbnQKLQkgKi8KLQlwdWJsaWMgQ29sdW1uRGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCwgaW50IHdlaWdodCwgaW50IHdpZHRoLAotCQkJYm9vbGVhbiByZXNpYWJsZSwgaW50IGNlbGxFZGl0b3JUeXBlLCBpbnQgYWxpZ25tZW50KSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnJlc2l6YWJsZSA9IHJlc2lhYmxlOwotCQl0aGlzLndlaWdodCA9IHdlaWdodDsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmNlbGxFZGl0b3JUeXBlID0gY2VsbEVkaXRvclR5cGU7Ci0JCXRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Db25maWd1cmF0aW9uRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NjkwZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlndXJhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlndXJhdGlvbkVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotCi0vKioKLSAqIFRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FZGl0b3IgZXh0ZW5kcyBNZXRob2RFbGVtZW50RWRpdG9yIGltcGxlbWVudHMgSUdvdG9NYXJrZXIgewotCi0JLyoqCi0JICogVGhlIGVkaXRvciBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfSUQgPSBDb25maWd1cmF0aW9uRWRpdG9yLmNsYXNzLmdldE5hbWUoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGRlZmF1bHRDb25maWdQYWdlUHJvdmlkZXI7Ci0KLQlDb25maWd1cmF0aW9uUGFnZSBjb25maWdQYWdlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25FZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgc3VwZXIuZ2V0RWRpdG9ySW5wdXQoKSkKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHByb2JhYmx5IG9wZW5lZCBmcm9tIFByb2JsZW1zIFZpZXcKLQkJCS8vIGNyZWF0ZSBhIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dAotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UoKChGaWxlRWRpdG9ySW5wdXQpaW5wdXQpLmdldEZpbGUoKSk7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlpbnB1dCA9IG5ldyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoKE1ldGhvZENvbmZpZ3VyYXRpb24pZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGdldERlZmF1bHRQYWdlUHJvdmlkZXIoKSB7Ci0JCWlmIChkZWZhdWx0Q29uZmlnUGFnZVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlZmF1bHRDb25maWdQYWdlUHJvdmlkZXIgPSBuZXcgQ29uZmlndXJhdGlvbkVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdENvbmZpZ1BhZ2VQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gZmlyc3QgZ2V0IG9yaWdpbmFsIGxpc3QKLQkJTWFwPE9iamVjdCxTdHJpbmc+IHBhZ2VNYXAgPSBnZXREZWZhdWx0UGFnZVByb3ZpZGVyKCkuZ2V0UGFnZXMobmV3IExpbmtlZEhhc2hNYXA8T2JqZWN0LFN0cmluZz4oKSwgdGhpcywgZWxlbWVudE9iaik7Ci0JCQotCQkvLyBsZXQgZXh0ZW5zaW9ucyBtb2RpZnkKLQkJTGlzdDxJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbj4gcGFnZVByb3ZpZGVycyA9IGdldEFsbFBhZ2VQcm92aWRlcnMoKTsKLQkJaWYgKHBhZ2VQcm92aWRlcnMgIT0gbnVsbCAmJiBwYWdlUHJvdmlkZXJzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gZXh0ZW5zaW9uIDogcGFnZVByb3ZpZGVycykgewotCQkJCXBhZ2VNYXAgPSBleHRlbnNpb24uZ2V0UGFnZXMocGFnZU1hcCwgdGhpcywgZWxlbWVudE9iaik7Ci0JCQl9Ci0JCX0KLQkJLy8gbm93IGFkZCBwYWdlcwotCQl0cnkgewotCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0LCBTdHJpbmc+IHBhZ2VFbnRyeSA6IHBhZ2VNYXAuZW50cnlTZXQoKSkgewotCQkJCU9iamVjdCBwYWdlID0gcGFnZUVudHJ5LmdldEtleSgpOwotCQkJCVN0cmluZyBuYW1lID0gcGFnZUVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJCWluZGV4ID0gYWRkUGFnZSgoQ29udHJvbClwYWdlKTsKLQkJCQl9IGVsc2UgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRm9ybVBhZ2UpIHsKLQkJCQkJaW5kZXggPSBhZGRQYWdlKChJRm9ybVBhZ2UpcGFnZSk7Ci0JCQkJfSBlbHNlIGlmIChwYWdlIGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQkJaW5kZXggPSBhZGRQYWdlKChJRWRpdG9yUGFydClwYWdlLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCQlzZXRQYWdlVGV4dChpbmRleCwgbmFtZSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblBhZ2UpIHsKLQkJCQkJY29uZmlnUGFnZSA9IChDb25maWd1cmF0aW9uUGFnZSlwYWdlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNjcmVhdGVJbnB1dChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBuZXcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KChNZXRob2RDb25maWd1cmF0aW9uKSBlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PExpc3RlbmVyPiBzZXRGb2N1c0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXI+KCk7Ci0JCi0JCi0JLyoqCi0JICogQWRkIGdpdmVuIGxpc3RlbmVyIHRvIGxpc3Qgb2YgZm9jdXMgbGlzdGVuZXJzCi0JICogQHBhcmFtIGxpcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRvU2V0Rm9jdXNMaXNlbmVycyhMaXN0ZW5lciBsaXMpIHsKLQkJc2V0Rm9jdXNMaXN0ZW5lcnMuYWRkKGxpcyk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I3NldEZvY3VzKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsgICAgCQotICAgIAlFdmVudCBlID0gbmV3IEV2ZW50KCk7Ci0gICAgCWUuZGF0YSA9IGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOyAgIAkKLSAgICAJZm9yIChpbnQgaT0wOyBpPHNldEZvY3VzTGlzdGVuZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgCQlMaXN0ZW5lciBsaXMgPSAoTGlzdGVuZXIpIHNldEZvY3VzTGlzdGVuZXJzLmdldChpKTsKLSAgICAJCWxpcy5oYW5kbGVFdmVudChlKTsKLSAgICAJfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLSAgICAJLy8gYWN0aXZhdGUgY29uZmlnIHBhZ2UKLSAgICAJc2V0QWN0aXZlUGFnZSgxKTsKLSAgICAJaWYgKGNvbmZpZ1BhZ2UgIT0gbnVsbCkgewotICAgIAkJY29uZmlnUGFnZS5nb3RvTWFya2VyKG1hcmtlcik7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZG9RdWlja0ZpeChJTWFya2VyIG1hcmtlcikgewotICAgIAljb25maWdQYWdlLmRvUXVpY2tGaXgobWFya2VyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvQ29uZmlndXJhdGlvbkVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiN2FmMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0NvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0KLS8qKgotICogQW4gZWRpdG9yIGlucHV0IGZvciB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJLy8gbWV0aG9kQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQkJc3VwZXIoY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJLy8gcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb247Ci0JCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbikgc3VwZXIuZ2V0TWV0aG9kRWxlbWVudCgpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA7IAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JDaG9vc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjVjNDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuZWRpdG9ycy5JTWV0aG9kRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBMYXVuY2hlcyBhIE1ldGhvZCBlZGl0b3IgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgYSBnaXZlbiBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yQ2hvb3NlciBpbXBsZW1lbnRzIElFZGl0b3JLZWVwZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRWRpdG9yQ2hvb3NlciBzaW5nbGV0b24gPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWRpdG9yQ2hvb3NlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKHNpbmdsZXRvbiA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEVkaXRvckNob29zZXIuY2xhc3MpIHsKLQkJCQlpZiAoc2luZ2xldG9uID09IG51bGwpIHsKLQkJCQkJc2luZ2xldG9uID0gbmV3IEVkaXRvckNob29zZXIoKTsKLQkJCQkJSUVkaXRvcktlZXBlci5SRUZFUkVOQ0Uuc2V0RWRpdG9yS2VlcGVyKHNpbmdsZXRvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JcHVibGljIEVkaXRvckNob29zZXIoKSB7Ci0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBPcGVucyB0aGUgcmVzcGVjdGl2ZSBlZGl0b3IgZGVwZW5kaW5nIG9uIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKE9iamVjdCBvYmopIHsKLQkJdHJ5IHsKLQkJCW9iaiA9IFZpZXdIZWxwZXIuaGFuZGxlRGFuZ2xpbmcob2JqKTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmopOwotCi0JCQlBcnJheUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoKEVPYmplY3QpIG9iaikuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlcyAhPSBudWxsICYmICFyZXMuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCWVycm9ycy5hZGRBbGwocmVzLmdldEVycm9ycygpKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQlSZXNvdXJjZSBwcmVzUmVzID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iaikKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChwcmVzUmVzICE9IG51bGwgJiYgIXByZXNSZXMuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQllcnJvcnMuYWRkQWxsKHByZXNSZXMuZ2V0RXJyb3JzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJCQlmaW5hbCBNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCQkwLAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVkaXRvckNob29zZXJfUmVzb3VyY2VzRXJyb3IsIG51bGwpOyAKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJRGlhZ25vc3RpYyBlID0gKERpYWdub3N0aWMpIGl0ZXIubmV4dCgpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywKLQkJCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMCwgZQotCQkJCQkJCQkJCS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQkJCQkJbXVsdGlTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FZGl0b3JDaG9vc2VyX2xvYWRkRXJyb3JEbGdUaXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FZGl0b3JDaG9vc2VyX1Jlc291cmNlc0Vycm9yLCAKLQkJCQkJCQkJCQltdWx0aVN0YXR1cykgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlFZGl0b3JPcGVuZXIgb3BlbmVyID0gRWRpdG9yT3BlbmVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldE9wZW5lcihvYmopOwotCQkJaWYgKCBvcGVuZXIgIT0gbnVsbCAmJiBvcGVuZXIuY2FuT3BlbihvYmopICkgewotCQkJCW9wZW5lci5vcGVuRWRpdG9yKG9iaik7Ci0JCQl9IGVsc2UgaWYgKChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgfHwgKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBUYXNrKSB8fCAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkgfHwgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQkJCXx8IChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB8fCAob2JqIGluc3RhbmNlb2YgVG9vbCkKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykKLQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQkJb3BlbkVkaXRvcigoTWV0aG9kRWxlbWVudCkgb2JqLCBNZXRob2RFbGVtZW50RWRpdG9yLkVESVRPUl9JRCk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgY3VzdENhdCA9IChDdXN0b21DYXRlZ29yeSkgb2JqOwotCQkJCWlmKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoY3VzdENhdCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBvYmosIE1ldGhvZEVsZW1lbnRFZGl0b3IuRURJVE9SX0lEKTsKLQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIG9iaiwgUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCi0JCQkJLy8gb3BlbiBwcm9wZXJ0aWVzIHZpZXcgYnkgZGVmYXVsdCB3aGVuIHdlIG9wZW4gUHJvY2VzcyBFZGl0b3IKLQkJCQl0cnkgewotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5zaG93VmlldygKLQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9wZXJ0eVNoZWV0IiwgbnVsbCwgSVdvcmtiZW5jaFBhZ2UuVklFV19WSVNJQkxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQlPYmplY3QgY29udGFpbmVyID0gKChQcm9jZXNzKSBvYmopLmVDb250YWluZXIoKTsKLQkJCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlvcGVuRWRpdG9yKChNZXRob2RFbGVtZW50KSBjb250YWluZXIsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5FRElUT1JfSUQpOwotCQkJCX0KLQkJCX1lbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJb3BlbkVkaXRvcigoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqLAotCQkJCQkJQ29uZmlndXJhdGlvbkVkaXRvci5FRElUT1JfSUQpOwotCQkJfWVsc2UgaWYob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KW9iaik7Ci0JCQkJT2JqZWN0IGNvbnRhaW5lciA9IHByb2Nlc3MuZUNvbnRhaW5lcigpOwotCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCW9wZW5FZGl0b3IoKE1ldGhvZEVsZW1lbnQpIGNvbnRhaW5lciwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLkVESVRPUl9JRCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJdC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfRWRpdG9yQ2hvb3Nlcl9zeXN0ZW1FcnJvckRpYWxvZ19tZXNzYWdlOyAKLQkJCVN0cmluZyByZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX0VkaXRvckNob29zZXJfc3lzdGVtRXJyb3JEaWFsb2dfcmVhc29uOyAKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCByZWFzb24sIHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIENvbmZpZ3VyYXRpb24gZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIGVkaXRvcklkKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJQ29uZmlndXJhdGlvbkVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCgKLQkJCQljb25maWcpOwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQllZGl0b3JJbnB1dCwgZWRpdG9ySWQpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBNZXRob2QgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogICAgICAgICAgICBUaGUgZWRpdG9yIElELgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGVkaXRvcklkKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQllbGVtZW50KTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJZWRpdG9ySW5wdXQsIGVkaXRvcklkKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIChicmluZ3MgdG8gZnJvbnQsIGJ1dCBkb2VzIG5vdCBnaXZlIGZvY3VzKSB0aGUgTWV0aG9kIGVkaXRvciBmb3IKLQkgKiB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiB0aGVyZSBpcyBubyBvcGVuIGVkaXRvciBmb3IgdGhlIG9iamVjdCwgZG9lcwotCSAqIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdEVkaXRvcihPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlvYmogPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKG9iaik7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQl0LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKQotCQkJZWRpdG9ySW5wdXQgPSBuZXcgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KAotCQkJCQkoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqKTsKLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCWVkaXRvcklucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJaWYgKGVkaXRvcklucHV0ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBwYWdlLmZpbmRFZGl0b3IoZWRpdG9ySW5wdXQpOwotCQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkKLQkJCQlwYWdlLmJyaW5nVG9Ub3AoZWRpdG9yUGFydCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBSZXR1cm5zIHNlbGVjdGVkIGVkaXRvciBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG9iamVjdCB3aGljaCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIE1ldGhvZCBlZGl0b3IgaXMgZWRpdGluZyAob3IKLQkgKiAgICAgICAgIG51bGwgaWYgdGhlcmUgaXMgbm8gZWRpdG9yIG9yIGlmIHRoZSBlZGl0b3IgaXMgbm90IGEgTWV0aG9kIGVkaXRvcikuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3RpdmVNZXRob2RFZGl0b3JJbnB1dCgpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCXJldHVybiBnZXRNZXRob2RFZGl0b3JJbnB1dChlZGl0b3JQYXJ0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE1ldGhvZEVkaXRvcklucHV0KElFZGl0b3JQYXJ0IGVkaXRvclBhcnQpIHsKLQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yUGFydC5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KQotCQkJCXJldHVybiAoKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KQotCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQpCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyB0aGUgTWV0aG9kIGVkaXRvciBmb3IgdGhlIGdpdmVuIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VFZGl0b3IoT2JqZWN0IG9iaikgewotCQl0cnkgewotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZmluZEVkaXRvcihvYmopOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJCQkuY2xvc2VFZGl0b3IoZWRpdG9yLCBmYWxzZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSUVkaXRvclBhcnQgZmluZEVkaXRvcihPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmZpbmRFZGl0b3IoCi0JCQkJCQkJZWRpdG9ySW5wdXQpOwotCQkJcmV0dXJuIGVkaXRvcjsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBkaXJ0eSBlZGl0b3JzIGZvciB0aGUgZ2l2ZW4gZWxlbWVudHMKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuCUxpc3Qgb2YgZGlydHkgZWRpdG9yCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNXaXRoRGlydHlFZGl0b3IoQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQkvLyBBcnJheUxpc3QgY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCWVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSB7Ci0JCQkJCWVsZW1lbnQgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZSA9PSBlbGVtZW50IHx8IFVtYVV0aWwuaXNDb250YWluZWRCeShlbGVtZW50LCBlKSkgewotCQkJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBhbGwgb3BlbiBNZXRob2QgZWRpdG9ycyBvZm9yIHRoZSBnaXZlbiAoZGVsZXRlZCkgZWxlbWVudCBhbmQKLQkgKiBhbGwgb2YgaXRzIGNoaWxkcmVuIGFuZCBncmFuZCBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgdGhlIGRlbGV0ZWQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRWRpdG9yc09uRGVsZXRpb24oT2JqZWN0IGUpIHsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdCBjbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCWVsZW1lbnQgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSB7Ci0JCQkJCWVsZW1lbnQgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJJiYgKGVsZW1lbnQuZUNvbnRhaW5lcigpID09IG51bGwgfHwgVW1hVXRpbAotCQkJCQkJCQkuaXNDb250YWluZWRCeShlbGVtZW50LCBlKSkpIHsKLQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgc2l6ZSA9IGNsb3NlRWRpdG9yUmVmcy5zaXplKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VzW2ldID0gKElFZGl0b3JSZWZlcmVuY2UpIGNsb3NlRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCX0KLQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMocmVmZXJlbmNlcywgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBDbG9zZXMgYWxsIE1ldGhvZCBFZGl0b3JzIHdpdGhvdXQgc2F2aW5nLgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VBbGxNZXRob2RFZGl0b3JzKCkgewotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCXdvcmtiZW5jaC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gY2xvc2VFZGl0b3JSZWZzID0gZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKTsKLQkJCQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMoY2xvc2VFZGl0b3JSZWZzLnRvQXJyYXkobmV3IElFZGl0b3JSZWZlcmVuY2VbY2xvc2VFZGl0b3JSZWZzLnNpemUoKV0pLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBhIGxpc3Qgb2YgYWxsIG9wZW4gTWV0aG9kIEVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBnZXRPcGVuTWV0aG9kRWRpdG9ycygpIHsKLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlmaW5hbCBMaXN0PElFZGl0b3JSZWZlcmVuY2U+IG1ldGhvZEVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCXdvcmtiZW5jaC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQkJCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gcmVmZXJlbmNlLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCQlTdHJpbmcgZWRpdG9ySWQgPSByZWZlcmVuY2UuZ2V0SWQoKTsKLQkJCQkJCWlmIChlZGl0b3JJZC5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5lcGYiKSB8fCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWVkaXRvclBhcnQgaW5zdGFuY2VvZiBJTWV0aG9kRWRpdG9yKSB7Ci0JCQkJCQkJbWV0aG9kRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBtZXRob2RFZGl0b3JSZWZzOwotCX0KLQotCS8qKgotCSAqIENsb3NlIGFsbCBNZXRob2RFZGl0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gUGx1Z2luLgotCSAqIFdpbGwgY2F1c2UgYSB1c2VyLXByb21wdCBmb3IgZWFjaCBkaXJ0eSBlZGl0b3IKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU1ldGhvZEVkaXRvcnNGb3JQbHVnaW5FbGVtZW50cyhNZXRob2RQbHVnaW4gbWV0aG9kcGx1Z2luKSB7Ci0JCWlmIChBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgIT0gbnVsbAotCQkJCSYmIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gbGlzdCA9IGdldE9wZW5NZXRob2RFZGl0b3JzKCk7Ci0JCQlMaXN0PElFZGl0b3JSZWZlcmVuY2U+IGVkaXRvclJlZnNUb0Nsb3NlID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQkJZm9yIChJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZmVyZW5jZSA6IGxpc3QpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JSZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCQllbGVtZW50ID0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSB7Ci0JCQkJCQllbGVtZW50ID0gKChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpOwotCQkJCQl9IGVsc2UgaWYoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSl7Ci0JCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSlpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCQllbGVtZW50ID0gZUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJCWlmKGVsZW1lbnQgPT0gbnVsbCl7Ci0JCQkJCQkJaWYoZUlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKXsKLQkJCQkJCQkJZWxlbWVudCA9IChNZXRob2RFbGVtZW50KVRuZ1V0aWwudW53cmFwKGVJbnB1dC5nZXRXcmFwcGVyKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsCi0JCQkJCQkJJiYgKGVsZW1lbnQuZUNvbnRhaW5lcigpID09IG51bGwgfHwgVW1hVXRpbAotCQkJCQkJCQkJLmlzQ29udGFpbmVkQnkoZWxlbWVudCwgbWV0aG9kcGx1Z2luKSkpIHsKLQkJCQkJCWlmICghZWxlbWVudC5lcXVhbHMobWV0aG9kcGx1Z2luKSkKLQkJCQkJCQllZGl0b3JSZWZzVG9DbG9zZS5hZGQoZWRpdG9yUmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKGVkaXRvclJlZnNUb0Nsb3NlLnRvQXJyYXkobmV3IElFZGl0b3JSZWZlcmVuY2VbZWRpdG9yUmVmc1RvQ2xvc2Uuc2l6ZSgpXSksIHRydWUpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNkNGYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9FZGl0b3JPcGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotLyoqCi0gKiBhYnN0cmFjdCBjbGFzcyBmb3IgZWRpdG9yIG9wZW5lbnIgZXh0ZW5zaW9uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWRpdG9yT3BlbmVyIHsKLQotCXB1YmxpYyBFZGl0b3JPcGVuZXIoKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBjYW5PcGVuKE9iamVjdCBvYmopOwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG9wZW5FZGl0b3IoT2JqZWN0IG9iaikgdGhyb3dzIEV4Y2VwdGlvbiA7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yT3BlbmVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0VkaXRvck9wZW5lckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxYWY4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvRWRpdG9yT3BlbmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBFZGl0b3IgT3BlbmVuciBFeHRlbnNpb25zCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JPcGVuZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJFZGl0b3JPcGVuZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImNsYXNzIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJfTkFNRSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiaWQiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQl9OQU1FID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFZGl0b3JPcGVuZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIGxpYnJhcnkgbWFuYWdlciBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCXByaXZhdGUgTWFwPFN0cmluZywgRWRpdG9yT3BlbmVyRWxlbWVudD4gb3BlbmVyRWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVkaXRvck9wZW5lckVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRWRpdG9yT3BlbmVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEVkaXRvck9wZW5lckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVkaXRvck9wZW5lckZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludAotCQkvLyBjb250cmlidXRvcnMuCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFJJQl9OQU1FKTsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJfTkFNRSk7Ci0JCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgaWQgIT0gbnVsbCAmJiBpZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7CQkJCQkJCQotCQkJCQkJCUVkaXRvck9wZW5lckVsZW1lbnQgcHJvdmlkZXIgPSBvcGVuZXJFbGVtZW50cy5nZXQoaWQpOwotCQkJCQkJCWlmKHByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQkJCQkJCXByb3ZpZGVyID0gbmV3IEVkaXRvck9wZW5lckVsZW1lbnQoCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIGlkKTsKLQkJCQkJCQkJb3BlbmVyRWxlbWVudHMucHV0KGlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRWRpdG9yT3BlbmVyIGdldE9wZW5lcihPYmplY3Qgb2JqKSB7Ci0JCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudClvYmopOwotCQkJCi0JCQl3aGlsZSAoZSAhPSBudWxsICkgewotCQkJCUxpc3QgcHJvcHMgPSBlLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJCWlmICggcHJvcHMgIT0gbnVsbCAmJiBwcm9wcy5zaXplKCkgPiAwICkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KWl0cC5uZXh0KCk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBwcm9wLmdldE5hbWUoKTsKLQkJCQkJCUVkaXRvck9wZW5lciBvcGVuZXI9IGNyZWF0ZUV4dGVuc2lvbihpZCk7Ci0JCQkJCQlpZiAoIG9wZW5lciAhPSBudWxsICkgewkJCQkJCQotCQkJCQkJCXJldHVybiBvcGVuZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQotCQkJCQotCQkJCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gdHJ5IGlmIHRoZSBpZCBpcyBkZWZpbmVkIGluIHRoZSBwbHVnaW4KLQkJCQllID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0V4dGVuc2lvbihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG9wZW5lckVsZW1lbnRzLmNvbnRhaW5zS2V5KGlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBsYXlvdXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgZXh0ZW5zaW9uIGlkCi0JICogQHJldHVybiBMYXlvdXRFeHRlbnNpb24KLQkgKi8KLQlwcml2YXRlIEVkaXRvck9wZW5lciBjcmVhdGVFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCQotCQlpZiAoICFoYXNFeHRlbnNpb24oaWQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUVkaXRvck9wZW5lckVsZW1lbnQgcHJvdmlkZXIgPSAoRWRpdG9yT3BlbmVyRWxlbWVudCkgb3BlbmVyRWxlbWVudHMuZ2V0KGlkKTsKLQkJdHJ5IHsKLQkJCUNsYXNzIGNsYXp6ID0gcHJvdmlkZXIuYnVuZGxlLmxvYWRDbGFzcyhwcm92aWRlci5jbGFzc05hbWUpOwotCQkJcmV0dXJuIChFZGl0b3JPcGVuZXIpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFZGl0b3JPcGVuZXJFbGVtZW50IHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJU3RyaW5nIGlkOwotCQlwcml2YXRlIEVkaXRvck9wZW5lckVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL0dyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTkxYjIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXUERlcGVuZGVuY3lFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZWRpdC5XUERpYWdyYW1FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5EaWFncmFtVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudXRpbC5UZW1wbGF0ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLk1hcnF1ZWVUb29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVTZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5HRUZBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgZm9yIGdyYXBoaWNhbCB3b3JrIHByb2R1Y3QgZGVwZW5lZGVuY3kgZGlhZ3JhbQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMCAKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSB3cE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLS8vCXByaXZhdGUgSVByb3BlcnR5U2hlZXRFbnRyeSByb290RW50cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1dQX05PREUgPSAiY3JlYXRlX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3Jfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEdyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ3JlYXRpb25GYWN0b3JpZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpOwotCi0JCWlmICh3cE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkgewotCQkJd3BOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJV29ya1Byb2R1Y3ROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQkJCQlub2RlLnNldERpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KHdwZCk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuV09SS19QUk9EVUNUOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IHdwTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCi0JCWJvb2xlYW4gY2FuTW9kaWZ5ID0gIWlzUmVhZE9ubHkoKTsKLQotCQkvLyBJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKFBST1BFUlRJRVNfUEFHRSk7Ci0JCS8vIGlmKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkvLyBtZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJLy8gfQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9XUF9OT0RFKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQkvLyBBY3Rpb25SZWdpc3RyeSByZWdpc3RyeSA9IGdldEFjdGlvblJlZ2lzdHJ5KCk7Ci0JCS8vIElBY3Rpb24gYWN0aW9uOwotCQkvLwotCQkvLyBhY3Rpb24gPSBuZXcgQWN0aW9uKCJTaG93ICZQcm9wZXJ0aWVzIFZpZXciKSB7Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCS8vIHJldHVybiBQUk9QRVJUSUVTX1BBR0U7Ci0JCS8vIH0KLQkJLy8gcHVibGljIHZvaWQgcnVuKCkgewotCQkvLyB0cnkgewotCQkvLwotCQkvLyBnZXRTaXRlKCkuZ2V0UGFnZSgpLnNob3dWaWV3KAotCQkvLyAib3JnLmVjbGlwc2UudWkudmlld3MuUHJvcGVydHlTaGVldCIpOwotCQkvLyAvLyBzZXRJZCgiU2hvd19Qcm9wZXJ0aWVzIik7Ci0JCS8vIH0KLQkJLy8gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkvLyAvL0F1dGhvcmluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXhjZXB0aW9uKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJLy8gTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQkvLyByZXR1cm4gKGVkaXRQYXJ0cy5zaXplKCkgPT0gMSAmJiBlZGl0UGFydHMuZ2V0KDApIGluc3RhbmNlb2YKLQkJLy8gRWRpdFBhcnQpOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vCQkKLQkJLy8gcmVnaXN0cnkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQsIHdwTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX1dQX05PREUsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQ29udHJvbEdyb3VwKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0JCVBhbGV0dGVHcm91cCBjb250cm9sR3JvdXAgPSBuZXcgUGFsZXR0ZUdyb3VwKCJDb250cm9sIEdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQotCQlMaXN0IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJVG9vbEVudHJ5IHRvb2wgPSBuZXcgUGFubmluZ1NlbGVjdGlvblRvb2xFbnRyeShEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1NlbGVjdF90b29sdGlwCi0JCSk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJInNlbGVjdF9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDI0LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyaWVzLmFkZCh0b29sKTsKLQkJcm9vdC5zZXREZWZhdWx0RW50cnkodG9vbCk7Ci0KLQkJdG9vbCA9IG5ldyBNYXJxdWVlVG9vbEVudHJ5KCk7Ci0JCXRvb2wuc2V0U21hbGxJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRvb2wuc2V0TGFyZ2VJY29uKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJIm1hcnFfcGFsMjQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCXRvb2wgPSBuZXcgQ29ubmVjdGlvbkNyZWF0aW9uVG9vbEVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0LCBEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcCwgCi0JCQkJbnVsbCwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJsaW5rX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZCh0b29sKTsKLQkJQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkgY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkZSRUVfVEVYVCwgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQlQYWxldHRlU2VwYXJhdG9yIHNlcCA9IG5ldyBQYWxldHRlU2VwYXJhdG9yKAotCQkJCUdyYXBoaWNhbFdQRGVwZW5kZW5jeUVkaXRvci5jbGFzcy5nZXROYW1lKCkgKyAic2VwMSIpOyAvLyROT04tTkxTLTEkCi0JCXNlcAotCQkJCS5zZXRVc2VyTW9kaWZpY2F0aW9uUGVybWlzc2lvbihQYWxldHRlRW50cnkuUEVSTUlTU0lPTl9OT19NT0RJRklDQVRJT04pOwotCQllbnRyaWVzLmFkZChzZXApOyAKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5XT1JLX1BST0RVQ1QsIHdwTm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCQljb250cm9sR3JvdXAuYWRkQWxsKGVudHJpZXMpOwotCQlyZXR1cm4gY29udHJvbEdyb3VwOwotCX0KLQotCXByb3RlY3RlZCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFdQRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdERpYWdyYW1FZGl0b3IjY3JlYXRlRGlhZ3JhbUVkaXRQYXJ0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRGlhZ3JhbUVkaXRQYXJ0KCkgewotCQkgRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0ID0gbmV3IERpYWdyYW1FZGl0UGFydChNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKSk7Ci0JCSBlZGl0UGFydC5tYXJrRGlydHkodHJ1ZSk7Ci0JCSByZXR1cm4gZWRpdFBhcnQ7Ci0JfQotCQotLy8JcHJvdGVjdGVkIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KE9iamVjdCBlKSB7Ci0vLwkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBkaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotLy8JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLS8vCQlkaWFncmFtLnNldE9iamVjdChlKTsKLS8vCQlFZGl0UGFydCBwYXJ0ID0gbmV3IERpYWdyYW1FZGl0UGFydChkaWFncmFtKTsKLS8vCQlwYXJ0LnNldE1vZGVsKGRpYWdyYW0pOwotLy8JCWRpYWdyYW0uYWRkQ29uc3VtZXIodGhpcyk7Ci0vLwkJcmV0dXJuIHBhcnQ7Ci0vLwl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fcHJlZml4OyAKLQl9Ci0KLQkvKioKLQkgKiBBbiBlZGl0b3IgaW5wdXQgCi0JICoKLQkgKgotCSAqLwotCS8qKgotCSAqIEBhdXRob3Igc2hpbHBhdAotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIEVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQotCQkvKioKLQkJICogQHBhcmFtIGUKLQkJICovCi0JCXB1YmxpYyBFZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCQkgKi8KLQkJcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKSB7Ci0JCQkvLyBpZiAodHlwZS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgewotCQkJLy8gcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCQkvLyB9ZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotLy8JCXByaXZhdGUgT2JqZWN0IGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotLy8KLS8vCQkJaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0vLwkJCQkvLyBjcmVhdGUgYSBuZXcgcm9vdAotLy8JCQkJUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0vLwkJCQlyb290RW50cnkgPSByb290OwotLy8JCQl9Ci0vLwkJCWlmIChyb290RW50cnkgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0RW50cnkpIHsKLS8vCQkJCS8vID0gd3BFZGl0UGFydC5nZXRWaWV3ZXIoKTsKLS8vCQkJCS8vIElTZWxlY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldwotLy8JCQkJLy8gQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoV1ApOwotLy8JCQkJLy8gKChQcm9wZXJ0eVNoZWV0RW50cnkpIHJvb3RFbnRyeSkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotLy8JCQl9Ci0vLwkJCXJldHVybiByb290RW50cnk7Ci0vLwkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXb3JrZmxvd0VkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhhMzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9HcmFwaGljYWxXb3JrZmxvd0VkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5lZGl0LkFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLmVkaXQuQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuRGlhZ3JhbVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnV0aWwuVGVtcGxhdGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLkNvbm5lY3Rpb25DcmVhdGlvblRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5NYXJxdWVlVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbm5pbmdTZWxlY3Rpb25Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuR0VGQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEFuIGVkaXRvciBmb3IgZ3JhcGhpY2FsIHdvcmtmbG93Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxXb3JrZmxvd0VkaXRvciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9XT1JLRkxPV19ERVRBSUxfRElBR1JBTSA9ICJvcGVuX3dvcmtmbG93X2RldGFpbF9kaWFncmFtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9TVEFSVF9OT0RFID0gImNyZWF0ZV9zdGFydF9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FTkRfTk9ERSA9ICJjcmVhdGVfZW5kX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1NZTkNfQkFSID0gImNyZWF0ZV9zeW5jX2JhciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfREVDSVNJT05fQkFSID0gImNyZWF0ZV9kZWNpc2lvbl9iYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0FDVElWSVRZID0gImNyZWF0ZV9hY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUEhBU0UgPSAiY3JlYXRlX3BoYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9JVEVSQVRJT04gPSAiY3JlYXRlX2l0ZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfVEFTS19ERVNDUklQVE9SID0gImNyZWF0ZV90YXNrX2Rlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBhY3Rpdml0eU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBwaGFzZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBpdGVyYXRpb25Ob2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3Rvcnkgc3luY2hCYXJDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBzdGFydE5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0KLQlwcml2YXRlIENyZWF0aW9uRmFjdG9yeSBlbmROb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JcHJpdmF0ZSBDcmVhdGlvbkZhY3RvcnkgdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlCi0JICovCi0JcHVibGljIEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDcmVhdGlvbkZhY3RvcmllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJaWYgKGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJYWN0aXZpdHlOb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQkvLyBBY3Rpdml0eU5vZGUgbm9kZSA9Ci0JCQkJCS8vIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlOb2RlKCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkFDVElWSVRZOwotCQkJCX0KLQotCQkJfTsKLQkJQ3JlYXRpb25GYWN0b3J5IGNyZWF0aW9uRmFjdG9yeSA9IGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAocGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlwaGFzZU5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCS8vIEFjdGl2aXR5Tm9kZSBub2RlID0KLQkJCQkJLy8gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eU5vZGUoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKTsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRPYmplY3RUeXBlKCkgewotCQkJCQlyZXR1cm4gVGVtcGxhdGVDb25zdGFudHMuUEhBU0U7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBwaGFzZU5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCWl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCS8vIEFjdGl2aXR5Tm9kZSBub2RlID0KLQkJCQkJLy8gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eU5vZGUoKTsKLQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJbm9kZS5zZXRVTUFEaWFncmFtKGRpYWdyYW0uZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQkJbm9kZS5zZXREaWFncmFtKGRpYWdyYW0pOwotCQkJCQlub2RlLnNldE9iamVjdChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLklURVJBVElPTjsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSA9IG5ldyBDcmVhdGlvbkZhY3RvcnkoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE5ld09iamVjdCgpIHsKLQkJCQkJVHlwZWROb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVR5cGVkTm9kZSgpOwotCQkJCQlub2RlLnNldFR5cGUoVHlwZWROb2RlLlNZTkNIX0JBUik7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLlNZTkNIX0JBUikpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5TWU5DSF9CQVI7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBzeW5jaEJhckNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAoZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQlkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQkJbm9kZS5zZXRUeXBlKFR5cGVkTm9kZS5ERUNJU0lPTik7Ci0JCQkJCW5vZGUuc2V0T2JqZWN0KEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkubmV3VHlwZWRHcmFwaE5vZGUoVHlwZWROb2RlLkRFQ0lTSU9OKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkRFQ0lTSU9OX05PREU7Ci0JCQkJfQotCi0JCQl9OwotCQljcmVhdGlvbkZhY3RvcnkgPSBkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3Rvcnk7Ci0JCXRlbXBsYXRlTmFtZVRvQ3JlYXRpb25GYWN0b3J5TWFwLnB1dChjcmVhdGlvbkZhY3RvcnkuZ2V0T2JqZWN0VHlwZSgpLAotCQkJCWNyZWF0aW9uRmFjdG9yeSk7Ci0KLQkJaWYgKHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkJc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuU1RBUlQpOwotCQkJCQlub2RlLnNldE9iamVjdChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLm5ld1R5cGVkR3JhcGhOb2RlKFR5cGVkTm9kZS5TVEFSVCkpOwotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdFR5cGUoKSB7Ci0JCQkJCXJldHVybiBUZW1wbGF0ZUNvbnN0YW50cy5TVEFSVF9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5OwotCQl0ZW1wbGF0ZU5hbWVUb0NyZWF0aW9uRmFjdG9yeU1hcC5wdXQoY3JlYXRpb25GYWN0b3J5LmdldE9iamVjdFR5cGUoKSwKLQkJCQljcmVhdGlvbkZhY3RvcnkpOwotCi0JCWlmIChlbmROb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQllbmROb2RlQ3JlYXRpb25GYWN0b3J5ID0gbmV3IENyZWF0aW9uRmFjdG9yeSgpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0TmV3T2JqZWN0KCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZShUeXBlZE5vZGUuRU5EKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoR3JhcGhpY2FsRGF0YUhlbHBlcgotCQkJCQkJCS5uZXdUeXBlZEdyYXBoTm9kZShUeXBlZE5vZGUuRU5EKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLkVORF9OT0RFOwotCQkJCX0KLQotCQkJfTsKLQkJY3JlYXRpb25GYWN0b3J5ID0gZW5kTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQotCQlpZiAodGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCQl0YXNrRGVzY3JpcHRvck5vZGVDcmVhdGlvbkZhY3RvcnkgPSBuZXcgQ3JlYXRpb25GYWN0b3J5KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXROZXdPYmplY3QoKSB7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCW5vZGUuc2V0VU1BRGlhZ3JhbShkaWFncmFtLmdldFVNQURpYWdyYW0oKSk7Ci0JCQkJCW5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSk7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJCQkJcmV0dXJuIFRlbXBsYXRlQ29uc3RhbnRzLlRBU0tfREVTQ1JJUFRPUjsKLQkJCQl9Ci0KLQkJCX07Ci0JCWNyZWF0aW9uRmFjdG9yeSA9IHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeTsKLQkJdGVtcGxhdGVOYW1lVG9DcmVhdGlvbkZhY3RvcnlNYXAucHV0KGNyZWF0aW9uRmFjdG9yeS5nZXRPYmplY3RUeXBlKCksCi0JCQkJY3JlYXRpb25GYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQotCQlib29sZWFuIGNhbk1vZGlmeSA9ICFpc1JlYWRPbmx5KCk7Ci0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCU9QRU5fV09SS0ZMT1dfREVUQUlMX0RJQUdSQU0pOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCQltZW51Lmluc2VydEFmdGVyKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoCi0JCQkJR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9TVEFSVF9OT0RFKTsKLQkJaWYgKGFjdGlvbi5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBhY3Rpb24pOwotCQl9Ci0KLQkJLy8gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0ZSRUVfVEVYVCk7Ci0JCS8vIGlmKGFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkvLyBtZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJLy8gfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9TWU5DX0JBUik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9ERUNJU0lPTl9CQVIpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfRU5EX05PREUpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJbWVudS5pbnNlcnRBZnRlcihHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCBuZXcgU2VwYXJhdG9yKAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihDUkVBVEVfQUNUSVZJVFkpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQ1JFQVRFX0lURVJBVElPTik7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9QSEFTRSk7Ci0JCWlmIChhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJfQotCi0JCWFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKENSRUFURV9UQVNLX0RFU0NSSVBUT1IpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJLy8gT3BlbiB3b3JrZmxvdyBkZXRhaWwgYWN0aW9uCi0JCS8vCi0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dCkgeyAKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIE9QRU5fV09SS0ZMT1dfREVUQUlMX0RJQUdSQU07Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQl0cnkgewotCQkJCQkJRWRpdFBhcnQgc2VsZWN0ZWRFZGl0UGFydCA9IChFZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkJLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuZ2V0KDApOwotCQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKQotCQkJCQkJCQkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgKChOb2RlKSBzZWxlY3RlZEVkaXRQYXJ0Ci0JCQkJCQkJCQkJLmdldE1vZGVsKCkpLmdldE9iamVjdCgpLAotCQkJCQkJCQkoKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCkpCi0JCQkJCQkJCQkJLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFNpdGUoKQotCQkJCQkJCQkuZ2V0UGFnZSgpCi0JCQkJCQkJCS5vcGVuRWRpdG9yKAotCQkJCQkJCQkJCWlucHV0LAotCQkJCQkJCQkJCVByb2Nlc3NFZGl0b3IuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fRURJVE9SX0lEKTsKLQkJCQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSAhPSAxKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCQkJcmV0dXJuIChlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlICYmICgoTGlua2VkT2JqZWN0KSBlZGl0UGFydAotCQkJCQkJLmdldE1vZGVsKCkpLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJLy8gSUFjdGlvbiBzdGFydE5vZGVBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy4KLQkJLy8gZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLlN0YXJ0Tm9kZS50ZXh0IikpeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyAvL0NyZWF0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0ZW1wbGF0ZSk7Ci0JCS8vIGlmIChzdGFydE5vZGVDcmVhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJLy8gcmV0dXJuOwotCQkvLyByZXF1ZXN0LnNldEZhY3Rvcnkoc3RhcnROb2RlQ3JlYXRpb25GYWN0b3J5KTsKLQkJLy8gcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsMTApKTsKLQkJLy8JCQkJCi0JCS8vIGlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkvLyBQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCS8vIC8vKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJLy8gRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3Ci0JCS8vIENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKXJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCS8vIHBhcmVudCwgbG9jKTsKLQkJLy8gZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJLy8gcmV0dXJuIENSRUFURV9TVEFSVF9OT0RFOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQkvLyByZXR1cm4KLQkJLy8gRGlhZ3JhbVVJUmVzb3VyY2VzLmdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5TdGFydE5vZGUudG9vbHRpcCIpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oc3RhcnROb2RlQWN0aW9uKTsKLQkJLy8JCQotCQkvLwkJCi0JCS8vIElBY3Rpb24gZW5kTm9kZUFjdGlvbiA9IG5ldyBBY3Rpb24oRGlhZ3JhbVVJUmVzb3VyY2VzLgotCQkvLyBnZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uRW5kTm9kZS50ZXh0IikpeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCi0JCS8vIHB1YmxpYyB2b2lkIHJ1bigpewotCQkvLyBDcmVhdGVSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ3JlYXRlUmVxdWVzdCgpOwotCQkvLyBpZiAoZW5kTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vIHJlcXVlc3Quc2V0RmFjdG9yeShlbmROb2RlQ3JlYXRpb25GYWN0b3J5KTsKLQkJLy8gcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsMTApKTsKLQkJLy8JCQkJCi0JCS8vIGlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkvLyBQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCS8vIERpYWdyYW0gcGFyZW50ID0gKERpYWdyYW0pZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJLy8gb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldwotCQkvLyBDcmVhdGVOb2RlQ29tbWFuZCgoTm9kZSlyZXF1ZXN0LmdldE5ld09iamVjdCgpLAotCQkvLyBwYXJlbnQsIGxvYyk7Ci0JCS8vIGdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBwdWJsaWMgU3RyaW5nIGdldElkKCl7Ci0JCS8vIHJldHVybiBDUkVBVEVfRU5EX05PREU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCl7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCS8vIHJldHVybgotCQkvLyBEaWFncmFtVUlSZXNvdXJjZXMuZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkVuZE5vZGUudG9vbHRpcCIpOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oZW5kTm9kZUFjdGlvbik7Ci0JCS8vCQkKLQkJLy8gSUFjdGlvbiBzeW5jQmFyQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtVUlSZXNvdXJjZXMuCi0JCS8vIGdldFN0cmluZygiRGlhZ3JhbVVJLkFjdGl2aXR5RGlhZ3JhbS5TeW5jQmFyLnRleHQiKSl7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCl7Ci0JCS8vIENyZWF0ZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVSZXF1ZXN0KCk7Ci0JCS8vIC8vQ3JlYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KHRlbXBsYXRlKTsKLQkJLy8gaWYgKHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5ID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8gcmVxdWVzdC5zZXRGYWN0b3J5KHN5bmNoQmFyQ3JlYXRpb25GYWN0b3J5KTsKLQkJLy8gcmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMTAsMTApKTsKLQkJLy8JCQkJCi0JCS8vIGlmIChyZXF1ZXN0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkvLyBQb2ludCBsb2MgPSByZXF1ZXN0LmdldExvY2F0aW9uKCk7Ci0JCS8vIC8vKChHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvUmVsYXRpdmUobG9jKTsKLQkJLy8gRGlhZ3JhbSBwYXJlbnQgPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkvLyBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3Ci0JCS8vIENyZWF0ZU5vZGVDb21tYW5kKChOb2RlKXJlcXVlc3QuZ2V0TmV3T2JqZWN0KCksCi0JCS8vIHBhcmVudCwgbG9jKTsKLQkJLy8gZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKXsKLQkJLy8gcmV0dXJuIENSRUFURV9TWU5DX0JBUjsKLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKXsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcy5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uU3luY0Jhci50b29sdGlwIik7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfTsKLQkJLy8gZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihzeW5jQmFyQWN0aW9uKTsKLQkJLy8JCQotCQkvLwkJCi0JCS8vIElBY3Rpb24gZGVjaXNpb25CYXJBY3Rpb24gPSBuZXcgQWN0aW9uKERpYWdyYW1VSVJlc291cmNlcy4KLQkJLy8gZ2V0U3RyaW5nKCJEaWFncmFtVUkuQWN0aXZpdHlEaWFncmFtLkRlY2lzaW9uQmFyLnRleHQiKSl7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkKLQkJLy8gcHVibGljIHZvaWQgcnVuKCl7Ci0JCS8vIENyZWF0ZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBDcmVhdGVSZXF1ZXN0KCk7Ci0JCS8vIC8vQ3JlYXRpb25GYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KHRlbXBsYXRlKTsKLQkJLy8gaWYgKGRlY2lzaW9uTm9kZUNyZWF0aW9uRmFjdG9yeSA9PSBudWxsKQotCQkvLyByZXR1cm47Ci0JCS8vIHJlcXVlc3Quc2V0RmFjdG9yeShkZWNpc2lvbk5vZGVDcmVhdGlvbkZhY3RvcnkpOwotCQkvLyByZXF1ZXN0LnNldExvY2F0aW9uKG5ldyBQb2ludCgxMCwxMCkpOwotCQkvLwkJCQkKLQkJLy8gaWYgKHJlcXVlc3QuZ2V0TmV3T2JqZWN0KCkgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCS8vIFBvaW50IGxvYyA9IHJlcXVlc3QuZ2V0TG9jYXRpb24oKTsKLQkJLy8gLy8oKEdyYXBoaWNhbEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShsb2MpOwotCQkvLyBEaWFncmFtIHBhcmVudCA9IChEaWFncmFtKWVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCS8vIG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcKLQkJLy8gQ3JlYXRlTm9kZUNvbW1hbmQoKE5vZGUpcmVxdWVzdC5nZXROZXdPYmplY3QoKSwKLQkJLy8gcGFyZW50LCBsb2MpOwotCQkvLyBnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRJZCgpewotCQkvLyByZXR1cm4gQ1JFQVRFX0RFQ0lTSU9OX0JBUjsKLQkJLy8gfQotCQkvLyBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKXsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJLy8gcmV0dXJuCi0JCS8vIERpYWdyYW1VSVJlc291cmNlcy5nZXRTdHJpbmcoIkRpYWdyYW1VSS5BY3Rpdml0eURpYWdyYW0uRGVjaXNpb25CYXIudG9vbHRpcCIpOwotCQkvLyB9Ci0JCS8vCQkJCi0JCS8vIH07Ci0JCS8vIGdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oZGVjaXNpb25CYXJBY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQsIHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX1NUQVJUX05PREUsCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcCwgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzdG5vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQsIGZyZWVUeHROb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfRlJFRV9URVhULAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcCwgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0LCBzeW5jaEJhckNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX1NZTkNfQkFSLCBEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzeW5jYmFyX3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dCwgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfREVDSVNJT05fQkFSLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZGVjbm9kZV9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0LCBlbmROb2RlQ3JlYXRpb25GYWN0b3J5LCAKLQkJCQlDUkVBVEVfRU5EX05PREUsIERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImVuZG5vZGVfcGFsMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQsIGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0FDVElWSVRZLAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcAotCQkJCSwgQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdGV4dCwgaXRlcmF0aW9uTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX0lURVJBVElPTiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJIkl0ZXJhdGlvbjE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0LCBwaGFzZU5vZGVDcmVhdGlvbkZhY3RvcnksIAotCQkJCUNSRUFURV9QSEFTRSwgRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwCi0JCQkJLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJIlBoYXNlMTYuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3RleHQsIHRhc2tEZXNjcmlwdG9yTm9kZUNyZWF0aW9uRmFjdG9yeSwgCi0JCQkJQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiwKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXAKLQkJCQksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiVGFza0Rlc2NyaXB0b3IuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0KLQkJLy8gZG8gbm90aGluZyBpZiAwIG9yIG1vcmUgdGhhbiAxIGVkaXQgcGFydHMgYXJlIHNlbGVjdGVkCi0JCS8vCi0JCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0KLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUKLQkJCQkmJiAobm9kZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUpIGVkaXRQYXJ0LmdldE1vZGVsKCkpLmdldE9iamVjdCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCS8vIG9wZW4gYWN0aXZpdHkgZGlhZ3JhbSBvZiB0aGUgc2VsZWN0ZWQgYWN0aXZpdHkgaW4gYSBuZXcgZWRpdG9yCi0JCQkvLwotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSBnZXRFZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gbm9kZS5pc1JlYWRPbmx5KCkgPyBub2RlLmdldFdyYXBwZXIoKSA6IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFZGl0b3JJbnB1dChvYmplY3QsIGVkaXRvcklucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuV09SS0ZMT1dfRURJVE9SX0lEKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFBhbGV0dGVDb250YWluZXIgY3JlYXRlQ29udHJvbEdyb3VwKFBhbGV0dGVSb290IHJvb3QpIHsKLQkJaW5pdGlhbGl6ZUNyZWF0aW9uRmFjdG9yaWVzKCk7Ci0KLQkJUGFsZXR0ZUdyb3VwIGNvbnRyb2xHcm91cCA9IG5ldyBQYWxldHRlR3JvdXAoIkNvbnRyb2wgR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JCUxpc3QgZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlUb29sRW50cnkgdG9vbCA9IG5ldyBQYW5uaW5nU2VsZWN0aW9uVG9vbEVudHJ5KERpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXAKLQkJKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkic2VsZWN0X3BhbDE2LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0b29sLnNldExhcmdlSWNvbihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJzZWxlY3RfcGFsMjQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJpZXMuYWRkKHRvb2wpOwotCQlyb290LnNldERlZmF1bHRFbnRyeSh0b29sKTsKLQotCQl0b29sID0gbmV3IE1hcnF1ZWVUb29sRW50cnkoKTsKLQkJdG9vbC5zZXRTbWFsbEljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwxNi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG9vbC5zZXRMYXJnZUljb24oQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkibWFycV9wYWwyNC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cmllcy5hZGQodG9vbCk7Ci0KLQkJdG9vbCA9IG5ldyBDb25uZWN0aW9uQ3JlYXRpb25Ub29sRW50cnkoRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fTGlua190b29sdGlwLCAKLQkJCQludWxsLCBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImxpbmtfcGFsMTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImxpbmtfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKHRvb2wpOwotCi0JCUNvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5IGNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlNUQVJUX05PREUsIHN0YXJ0Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJInN0bm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkic3Rub2RlX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9GcmVlVGV4dF90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLkZSRUVfVEVYVCwgZnJlZVR4dE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmcmVldGV4dF9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnJlZXRleHRfcGFsMjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXAsIAotCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlNZTkNIX0JBUiwgc3luY2hCYXJDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzeW5jYmFyX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJzeW5jYmFyX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29tYmluZWQgPSBuZXcgQ29tYmluZWRUZW1wbGF0ZUNyZWF0aW9uRW50cnkoCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuREVDSVNJT05fTk9ERSwgZGVjaXNpb25Ob2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZGVjbm9kZV9wYWwxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZGVjbm9kZV9wYWwyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuRU5EX05PREUsIGVuZE5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJlbmRub2RlX3BhbDE2LmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJlbmRub2RlX3BhbDI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJUGFsZXR0ZVNlcGFyYXRvciBzZXAgPSBuZXcgUGFsZXR0ZVNlcGFyYXRvcigKLQkJCQlHcmFwaGljYWxXb3JrZmxvd0VkaXRvci5jbGFzcy5nZXROYW1lKCkgKyAic2VwMSIpOyAvLyROT04tTkxTLTEkCi0JCXNlcAotCQkJCS5zZXRVc2VyTW9kaWZpY2F0aW9uUGVybWlzc2lvbihQYWxldHRlRW50cnkuUEVSTUlTU0lPTl9OT19NT0RJRklDQVRJT04pOwotCQllbnRyaWVzLmFkZChzZXApOyAKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQsIAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcCwgCi0JCQkJVGVtcGxhdGVDb25zdGFudHMuQUNUSVZJVFksIGFjdGl2aXR5Tm9kZUNyZWF0aW9uRmFjdG9yeSwKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MTYuZ2lmIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImFjdGl2aXR5MjQuZ2lmIikvLyROT04tTkxTLTEkCi0JCSk7Ci0JCWVudHJpZXMuYWRkKGNvbWJpbmVkKTsKLQotCQljb21iaW5lZCA9IG5ldyBDb21iaW5lZFRlbXBsYXRlQ3JlYXRpb25FbnRyeSgKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0LCAKLQkJCQlEaWFncmFtVUlSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5JVEVSQVRJT04sIGl0ZXJhdGlvbk5vZGVDcmVhdGlvbkZhY3RvcnksCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJJdGVyYXRpb24xNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KERpYWdyYW1VSVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QSEFTRSwgcGhhc2VOb2RlQ3JlYXRpb25GYWN0b3J5LAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiUGhhc2UxNi5naWYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiYWN0aXZpdHkyNC5naWYiKS8vJE5PTi1OTFMtMSQKLQkJKTsKLQkJZW50cmllcy5hZGQoY29tYmluZWQpOwotCi0JCWNvbWJpbmVkID0gbmV3IENvbWJpbmVkVGVtcGxhdGVDcmVhdGlvbkVudHJ5KAotCQkJCURpYWdyYW1VSVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwgCi0JCQkJRGlhZ3JhbVVJUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90b29sdGlwLCAKLQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5UQVNLX0RFU0NSSVBUT1IsCi0JCQkJdGFza0Rlc2NyaXB0b3JOb2RlQ3JlYXRpb25GYWN0b3J5LCBBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoIlRhc2tEZXNjcmlwdG9yLmdpZiIpLCAvLyROT04tTkxTLTEkCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJhY3Rpdml0eTI0LmdpZiIpLy8kTk9OLU5MUy0xJAotCQkpOwotCQllbnRyaWVzLmFkZChjb21iaW5lZCk7Ci0KLQkJY29udHJvbEdyb3VwLmFkZEFsbChlbnRyaWVzKTsKLQkJcmV0dXJuIGNvbnRyb2xHcm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKEFjdGl2aXR5KSBlKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVEaWFncmFtRWRpdFBhcnQoKQotCSAqLwotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVEaWFncmFtRWRpdFBhcnQoKSB7Ci0JCUFjdGl2aXR5RGlhZ3JhbUVkaXRQYXJ0IGFkRWRpdFBhcnQgPSBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQoTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKSk7Ci0JCWFkRWRpdFBhcnQubWFya0RpcnR5KHRydWUpOwotCQlyZXR1cm4gYWRFZGl0UGFydDsKLQl9Ci0KLS8vCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3QgZSkgewotLy8JCUFjdGl2aXR5RGlhZ3JhbSBkaWFncmFtID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotLy8JCQkJLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotLy8JCWRpYWdyYW0uc2V0T2JqZWN0KGUpOwotLy8JCUVkaXRQYXJ0IHBhcnQgPSBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnQoZGlhZ3JhbSk7Ci0vLwkJcGFydC5zZXRNb2RlbChkaWFncmFtKTsKLS8vCQlkaWFncmFtLmFkZENvbnN1bWVyKHRoaXMpOwotLy8JCXJldHVybiBwYXJ0OwotLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVOYW1lKEFjdGl2aXR5IGFjdCkgewotCQlpZiAoYWN0IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9EZWxpdmVyeVByb2Nlc3NfdGV4dDsgCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7IAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbVVJUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg7IAotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIERpYWdyYW1VSVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7IAotCQl9Ci0JCXJldHVybiBEaWFncmFtVUlSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQ7IAotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0VHlwZUltYWdlKE9iamVjdCBvYmplY3QpIHsKLS8vCQlJSXRlbUxhYmVsUHJvdmlkZXIgYWRhcHRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChvYmplY3QsCi0vLwkJCQkJCUlJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0vLwkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotLy8JCQkvLyByZXR1cm4gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotLy8JCQkvLyAoKFVSTClhZGFwdGVyLmdldEltYWdlKG9iamVjdCkpLmdldENvbnRlbnQoKSk7Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCi0JLyoqCi0JICogQW4gZWRpdG9yIGlucHV0IGZvciBncmFoaWNhbCB3b3JrZmxvdyBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVkaXRvcklucHV0IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IHsKLQotCQkvKioKLQkJICogQHBhcmFtIGUKLQkJICovCi0JCXB1YmxpYyBFZGl0b3JJbnB1dChPYmplY3QgZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJCXN1cGVyKGUsIHN1cHByZXNzaW9uKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQWJzdHJhY3REaWFncmFtRWRpdG9yI2NyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIEVkaXRQYXJ0RmFjdG9yeSBjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9JRWRpdG9yS2VlcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvSUVkaXRvcktlZXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njk3Njg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9JRWRpdG9yS2VlcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIHdoaWNoIG1hbmFnZXMgb3BlbmluZy9jbG9zaW5nIG9mIGFuIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFZGl0b3JLZWVwZXIgewotCi0JLyoqCi0JICogUmVmZXJlbmNlIGNsYXNzIGZvciBlZGl0b3Iga2VlcGVyCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFJlZmVyZW5jZSB7Ci0JCXByaXZhdGUgSUVkaXRvcktlZXBlciBlZGl0b3JLZWVwZXI7Ci0KLQkJcHJpdmF0ZSBSZWZlcmVuY2UoKSB7Ci0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEVkaXRvcktlZXBlcihJRWRpdG9yS2VlcGVyIGVkaXRvcktlZXBlcikgewotCQkJdGhpcy5lZGl0b3JLZWVwZXIgPSBlZGl0b3JLZWVwZXI7Ci0JCX0KLQotCQlwdWJsaWMgSUVkaXRvcktlZXBlciBnZXRFZGl0b3JLZWVwZXIoKSB7Ci0JCQlyZXR1cm4gZWRpdG9yS2VlcGVyOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZWZlcmVuY2UgUkVGRVJFTkNFID0gbmV3IFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogT3BlbiBhbiBlZGl0b3IgZm9yIHRoZSBnaXZlbiBlbGVtZW50Ci0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXZvaWQgb3BlbkVkaXRvcihPYmplY3Qgb2JqZWN0KTsKLQotCS8qKgotCSAqIENsb3NlcyBhbiBvcGVuIGVkaXRvciBpZiBlbGVtZW50IGlzIGRlbGV0ZWQKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICovCi0Jdm9pZCBjbG9zZUVkaXRvcnNPbkRlbGV0aW9uKE9iamVjdCBvYmplY3QpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzNGQyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZhbGlkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudEVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkVsZW1lbnRIVE1MVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5WaWV3SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5GdWxseVJldmVydGlibGVDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnN5bmNoLklTeW5jaHJvbml6YXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5JRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldDsKLQotLyoqCi0gKiBUaGUgTWV0aG9kIEVsZW1lbnQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvciBleHRlbmRzIEFic3RyYWN0QmFzZUZvcm1FZGl0b3IgaW1wbGVtZW50cwotCQlJR290b01hcmtlciwgSUVkaXRpbmdEb21haW5Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFJlc291cmNlSW5mbyB7Ci0JCWxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCWxvbmcgbG9hZFN0YW1wOwkJCi0JCWJvb2xlYW4gb3ZlcndyaXRlOwotCQlib29sZWFuIGFkanVzdExvY2F0aW9uOyAKLQkJCi0JCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7CQkKLQkJCi0JCVJlc291cmNlSW5mbyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOwotCQkJcmVmcmVzaCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBJU3luY2hyb25pemF0aW9uSGVscGVyLklOU1RBTkNFLmdldE1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsKLQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZSkgewotCQkJCWxvYWRTdGFtcCA9ICgoSUxpYnJhcnlSZXNvdXJjZSlyZXNvdXJjZSkuZ2V0TG9hZFN0YW1wKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsb2FkU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgZWRpdG9yIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IE1ldGhvZEVsZW1lbnRFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIGludCBwcmV2aWV3X3BhZ2VfaW5kZXggPSAtMTsKLQotCXByb3RlY3RlZCBFbGVtZW50SFRNTFZpZXdlciBwcmV2aWV3ZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZWxlbWVudE9iaiA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JLy8gVGhlIHJpY2ggdGV4dCBjb250cm9sIG9yIGVkaXRvciB3aG9zZSBjb250ZW50IHdhcyBsYXN0IG1vZGlmaWVkIGJlZm9yZQotCS8vIHRoZSBTYXZlIG9yIFNhdmUgQWxsIGJ1dHRvbiBrZXkgaXMgc2VsZWN0ZWQuCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBtb2RpZmllZFJpY2hUZXh0ID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyIG5hbWVDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZEVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQkJbmFtZUNoYW5nZWQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyPigpOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0KLQlwcm90ZWN0ZWQgQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlydHk7Ci0KLQlwcml2YXRlIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXI7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiB3aWRnZXRzVG9SZXN0b3JlVmFsdWUgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0KLQlwcml2YXRlIGxvbmcgY2hhbmdlVGltZSA9IC0xOwotCi0JcHVibGljIE9iamVjdCB3aWRnZXRUb0NoZWNrOwotCi0JcHJpdmF0ZSBPYmplY3QgY3VycmVudEZlYXR1cmVFZGl0b3I7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjdXJyZW50RWRpdGVkRmVhdHVyZTsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyIGZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciA9IG51bGw7Ci0JCi0JLyoqCi0JICogRXh0ZW5zaW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlcnMiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0PElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uPiBhbGxQYWdlUHJvdmlkZXJzOwotCXByb3RlY3RlZCBzdGF0aWMgSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gZGVmYXVsdFBhZ2VQcm92aWRlcjsKLQotCS8qKgotCSAqIExpc3RlbnMgZm9yIHdvcmtzcGFjZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IucmVzb3VyY2VDaGFuZ2VkKCk6IGV2ZW50ID0gIiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoZWxlbWVudE9iai5lSXNQcm94eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQl0cnkgewotCQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCQkJcHJvdGVjdGVkIE1hcCBVUklUb1VzZWRSZXNvdXJjZU1hcCA9IGdldFVSSVRvVXNlZFJlc291cmNlTWFwKCk7Ci0KLQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJCQkJaWYgKGRlbHRhLmdldEZsYWdzKCkgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUwotCQkJCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgKElSZXNvdXJjZURlbHRhLkNIQU5HRUQgfCBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSkgIT0gMCkgewotCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgVVJJVG9Vc2VkUmVzb3VyY2VNYXAKLQkJCQkJCQkJCQkuZ2V0KFVSSS5jcmVhdGVGaWxlVVJJKGRlbHRhCi0JCQkJCQkJCQkJCQkuZ2V0UmVzb3VyY2UoKS5nZXRMb2NhdGlvbigpCi0JCQkJCQkJCQkJCQkudG9TdHJpbmcoKSkpOwotCQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSAhPSAwKSB7Ci0JCQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCQkJCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZW1vdmVkUmVzb3VyY2VzKCkgewotCQkJCQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlSZXNvdXJjZURlbHRhVmlzaXRvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0JCQkJZGVsdGEuYWNjZXB0KHZpc2l0b3IpOwotCi0JCQkJcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOwotCQkJCWlmICghdmlzaXRvci5nZXRSZW1vdmVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpICYmICFpc0RpcnR5KCkpIHsKLQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudEVkaXRvci50aGlzLmRpc3Bvc2UoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfTsKLQotCWNsYXNzIEFjdGl2YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIsIElXaW5kb3dMaXN0ZW5lciB7Ci0KLQkJLyoqIENhY2hlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuICovCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7Ci0KLQkJLyoqIEluZGljYXRlcyB3aGV0aGVyIGFjdGl2YXRpb24gaGFuZGxpbmcgaXMgY3VycmVudGx5IGJlIGRvbmUuICovCi0JCXByaXZhdGUgYm9vbGVhbiBmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSBmYWxzZTsKLQotCQkvKioKLQkJICogVGhlIHBhcnQgc2VydmljZS4KLQkJICogCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXByaXZhdGUgSVBhcnRTZXJ2aWNlIGZQYXJ0U2VydmljZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0JCSAqIAotCQkgKiBAcGFyYW0gcGFydFNlcnZpY2UKLQkJICogICAgICAgICAgICB0aGUgcGFydCBzZXJ2aWNlIG9uIHdoaWNoIHRvIGFkZCB0aGUgcGFydCBsaXN0ZW5lcgotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZhdGlvbkxpc3RlbmVyKElQYXJ0U2VydmljZSBwYXJ0U2VydmljZSkgewotCQkJZlBhcnRTZXJ2aWNlID0gcGFydFNlcnZpY2U7Ci0JCQlmUGFydFNlcnZpY2UuYWRkUGFydExpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBEaXNwb3NlcyB0aGlzIGFjdGl2YXRpb24gbGlzdGVuZXIuCi0JCSAqIAotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlBhcnRTZXJ2aWNlLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkucmVtb3ZlV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCQlmUGFydFNlcnZpY2UgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRBY3RpdmF0ZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gcGFydDsKLQkJCWhhbmRsZUFjdGl2YXRpb24oKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0QnJvdWdodFRvVG9wKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydENsb3NlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnREZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQlmQWN0aXZlUGFydCA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydE9wZW5lZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgPT0gTWV0aG9kRWxlbWVudEVkaXRvci50aGlzKSB7Ci0JCQkJaWYgKCFpc0lucHV0VmFsaWQoKSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfaW52YWxpZEVkaXRvclRpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9pbnZhbGlkRWRpdG9yTXNnKTsgCi0JCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jbG9zZShmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQlpZiAoUmVzb3VyY2VVdGlsLmhhc091dE9mU3luY2godXNlZFJlc291cmNlcykpIHsKLQkJCQkJaGFuZGxlRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJc2V0UmVzb3VyY2VJbmZvcyh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIHRyaWdnZXJpbmcgYSBlbGVtZW50IHN0YXRlIGNoZWNrIGluIHRoZQotCQkgKiBlZGl0b3IuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZhdGlvbigpIHsKLQkJCWlmIChmSXNIYW5kbGluZ0FjdGl2YXRpb24gfHwgTWV0aG9kRWxlbWVudEVkaXRvci50aGlzLmRpc3Bvc2VkKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGZBY3RpdmVQYXJ0ID09IE1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcykgewotCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJaGFuZGxlQWN0aXZhdGUoZkFjdGl2ZVBhcnQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWZJc0hhbmRsaW5nQWN0aXZhdGlvbiA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0FjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dBY3RpdmF0ZWQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKSB7Ci0JCQkJLyoKLQkJCQkgKiBXb3JrYXJvdW5kIGZvciBwcm9ibGVtIGRlc2NyaWJlZCBpbgotCQkJCSAqIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE3MzEgV2lsbCBiZQotCQkJCSAqIHJlbW92ZWQgd2hlbiBTV1QgaGFzIHNvbHZlZCB0aGUgcHJvYmxlbS4KLQkJCQkgKi8KLQkJCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dEZWFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93KQotCQkgKiBAc2luY2UgMy4xCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBY3RpdmF0aW9uTGlzdGVuZXIgYWN0aXZhdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRmlsZUNoYW5nZWRSZXF1aXJlZCA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIEhhc2hTZXQ8UmVzb3VyY2U+IGxhc3RVc2VkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkOwotCi0JcHJvdGVjdGVkIEhhc2hNYXA8UmVzb3VyY2UsIFJlc291cmNlSW5mbz4gcmVzb3VyY2VJbmZvTWFwOwotCi0JcHJpdmF0ZSBJRmlsZSBlbGVtZW50RmlsZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50RWRpdG9yKCkgewotCQlzdXBlcigpOwotCQkKLQkJLy8gbW92ZWQgdGhlIGRldGFpbHMgb3V0IHNvIHRoYXQgdXNlciBjYW4gb3ZlcnJpZGUgdGhlIHRpY2sgdXBkYXRvcgotCQkvLyBKaW5odWEgWGkgMy8xNS8yMDA3Ci0JCWNyZWF0ZUVkaXRvckVycm9yVGlja1VwZGF0ZXIoKTsKLQkJY3JlYXRlQWN0aW9uTWFuYWdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JFcnJvclRpY2tVcGRhdGVyKCkgewotCQkKLQkJdGhpcy5mTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgPSBuZXcgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbk1hbmFnZXIoKSB7Ci0JCWFjdGlvbk1nciA9IG5ldyBBY3Rpb25NYW5hZ2VyKCkgewotCi0JCQlwcm90ZWN0ZWQgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrIGNyZWF0ZUNvbW1hbmRTdGFjaygpIHsKLQkJCQlyZXR1cm4gbmV3IEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayh0aGlzKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIGRvRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkJCS8vIENoZWNrIG1vZGlmeSBmaXJzdC4KLQkJCQkJCWlmIChjb21tYW5kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcyA9ICgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjb21tYW5kKQotCQkJCQkJCQkJLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwKLQkJCQkJCQkJCSYmICEobW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSkgewotCQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJCQkJCS5jaGVja01vZGlmeShtb2RpZmllZFJlc291cmNlcywKLQkJCQkJCQkJCQkJCWdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yLnRoaXMKLQkJCQkJCQkJCQkJLmhhbmRsZUVycm9yKHN0YXR1cyk7Ci0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUVPYmplY3Qgb3duZXIgPSBUbmdVdGlsLmdldE93bmVyKGNvbW1hbmQpOwotCQkJCQkJCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQob3duZXIsCi0JCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5KAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX21zZ0Nhbm5vdEVkaXQsIAotCQkJCQkJCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChjaGFuZ2VUaW1lID09IC0xKSB7Ci0JCQkJCQkJY2hhbmdlVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiByZXQgPSBzdXBlci5kb0V4ZWN1dGUoY29tbWFuZCk7Ci0JCQkJCQlpZiAoIXJldCAmJiBjaGFuZ2VUaW1lICE9IC0xKSB7Ci0JCQkJCQkJY2hhbmdlVGltZSA9IC0xOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LAotCQkJCQlvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCQkJZmluYWwgSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsCi0JCQkJCQkuY2hlY2tFZGl0KG9iamVjdCwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVybiBzdXBlci5kb0FjdGlvbihhY3Rpb25UeXBlLCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJCWluZGV4KTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB0aGlzIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGEgbm9uLVVJIHRocmVhZAotCQkJCQkvLyBzbyBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgZGlhbG9nIHdpbGwgYmUgc2hvd24gaW4gYSBVSSB0aHJlYWQKLQkJCQkJLy8KLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdERpYWxvZ19tc2dDYW5ub3RFZGl0LCAKLQkJCQkJCQkJCXN0YXR1cyk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQkvLyBkb24ndCBzYXZlIHJlc291cmNlIHRoYXQgaXMgY2hhbmdlZCBvdXRzaWRlIG9mIHRoaXMgZWRpdG9yCi0JCQkJLy8KLQkJCQlpZiAoY2hhbmdlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlib29sZWFuIGNhblNhdmU7Ci0JCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQljYW5TYXZlID0gZmlsZS5sYXN0TW9kaWZpZWQoKSA+IGNoYW5nZVRpbWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljYW5TYXZlID0gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJCXRyeSB7Ci0JCQkJCWlmKGNhblNhdmUpIHsKLQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCS5yZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKGdldEVkaXRvclNpdGUoKQotCQkJCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQljaGFuZ2VUaW1lID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWFjdGlvbk1nci5nZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcigKLQkJCQluZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuc3RhcnRMaXN0ZW5pbmdUbyhhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5hbWVDaGFuZ2VkKCkgewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc2V0UGFydE5hbWUoKTsKLQkJCQlpZiAocGFnZXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBwYWdlID0gaXRlci5uZXh0KCk7Ci0KLQkJCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgSVJlZnJlc2hhYmxlKSB7Ci0JCQkJCQkJKChJUmVmcmVzaGFibGUpIHBhZ2UpLnJlZnJlc2hOYW1lKGVsZW1lbnRPYmoKLQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0pOwotCX0KLQkKLQlwdWJsaWMgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGFjdGlvbk1ncjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yI2luaXQoSUVkaXRvclNpdGUsCi0JICogICAgICBJRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlzZXRTaXRlKHNpdGUpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHByb2JhYmx5IG9wZW5lZCBmcm9tIFByb2JsZW1zIFZpZXcKLQkJCS8vIGNyZWF0ZSBhIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dAotCQkJZWxlbWVudEZpbGUgPSAoKEZpbGVFZGl0b3JJbnB1dClpbnB1dCkuZ2V0RmlsZSgpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQoCi0JCQkJCWVsZW1lbnRGaWxlLAotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLgotCQkJCQkJZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlucHV0ID0gbmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgKLQkJCQkJZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJc2V0SW5wdXQoaW5wdXQpOwotCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKG5ldyBNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcih0aGlzKSk7Ci0JCWFjdGl2YXRpb25MaXN0ZW5lciA9IG5ldyBBY3RpdmF0aW9uTGlzdGVuZXIoc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRQYXJ0U2VydmljZSgpKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudE9iaik7Ci0JCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlzZXRUaXRsZUltYWdlKHRpdGxlSW1hZ2UpOwotCi0JCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCk7Ci0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBjb21tYW5kU3RhY2spOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5zZXRJbnB1dChpbnB1dCk7Ci0KLQkJLy8gR2V0IG1ldGhvZCBlbGVtZW50IG9iamVjdCBmcm9tIEVkaXRvciBpbnB1dC4KLQkJLy8KLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQllbGVtZW50T2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQlzZXRQYXJ0TmFtZSgpOwotCQllbGVtZW50T2JqLmVBZGFwdGVycygpLmFkZChuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCi0JCWlmIChmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCkKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci51cGRhdGVFZGl0b3JJbWFnZShlbGVtZW50T2JqKTsKLQotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKQotCXsKLQkJcmV0dXJuIGVsZW1lbnRPYmo7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlSW5mb3MoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWlmKHJlc291cmNlSW5mb01hcCA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUluZm9NYXAgPSBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgUmVzb3VyY2VJbmZvPigpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlSW5mbyBpbmZvID0gcmVzb3VyY2VJbmZvTWFwLmdldChyZXNvdXJjZSk7Ci0JCQlpZihpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IFJlc291cmNlSW5mbyhyZXNvdXJjZSk7Ci0JCQkJcmVzb3VyY2VJbmZvTWFwLnB1dChyZXNvdXJjZSwgaW5mbyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbmZvLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCQljaGVja0ZpbGVDaGFuZ2VkUmVxdWlyZWQgPSB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBvdmV3cml0ZVJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2VJbmZvIGluZm8gPSByZXNvdXJjZUluZm9NYXAuZ2V0KHJlc291cmNlKTsKLQkJCWlmKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8ub3ZlcndyaXRlID0gdHJ1ZTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlSW5mb3MoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWlmKHJlc291cmNlSW5mb01hcCAhPSBudWxsICYmICFyZXNvdXJjZUluZm9NYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXNvdXJjZUluZm9NYXAuY2xlYXIoKTsKLQkJfQotCQl1cGRhdGVSZXNvdXJjZUluZm9zKHJlc291cmNlcyk7Ci0JfQotCQotCXByaXZhdGUgbG9uZyBnZXRMb2FkU3RhbXAoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VJbmZvIGluZm8gPSByZXNvdXJjZUluZm9NYXAuZ2V0KHJlc291cmNlKTsKLQkJcmV0dXJuIGluZm8gIT0gbnVsbCA/IGluZm8ubG9hZFN0YW1wIDogSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZXJlIGlzIGFueSByZXNvdXJjZSBpbiB0aGUgZ2l2ZW4gPGNvZGU+dXNlZFJlc291cmNlczwvY29kZT4KLQkgKiB0aGF0IGhhcyBiZWVuIHJlbG9hZGVkIHNpbmNlIGxhc3QgdXBkYXRlIG9mIGxvYWQgdGltZSBzdGFtcHMgYnkgdGhpcwotCSAqIGVkaXRvcgotCSAqIAotCSAqIEBwYXJhbSB1c2VkUmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrUmVsb2FkZWQoQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQodXNlZFJlc291cmNlcyk7Ci0JCWJvb2xlYW4geG1pID0gcmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0IAotCQkJJiYgKChJTGlicmFyeVJlc291cmNlU2V0KXJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZW5jZVR5cGUoKS5lcXVhbHMoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQkJbG9uZyBvbGRTdGFtcCA9IGdldExvYWRTdGFtcChyZXNvdXJjZSk7Ci0JCQkJbG9uZyBjdXJyZW50U3RhbXAgPSAoKElMaWJyYXJ5UmVzb3VyY2UpcmVzb3VyY2UpLmdldExvYWRTdGFtcCgpOwotCQkJCWlmIChvbGRTdGFtcCAhPSBjdXJyZW50U3RhbXApIHsKLQkJCQkJaWYoeG1pKSB7Ci0JCQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHJlc291cmNlCi0JCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQlpZiAod3NSZXMgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE91dE9mU3luY1Jlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzKSB7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG91dE9mU3luY1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1c2VkUmVzb3VyY2VzKSB7Ci0JCQlpZihpc091dE9mU3luYyhyZXNvdXJjZSkpIHsKLQkJCQlvdXRPZlN5bmNSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3V0T2ZTeW5jUmVzb3VyY2VzOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiBpc091dE9mU3luYyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZUluZm8gaW5mbyA9IHJlc291cmNlSW5mb01hcC5nZXQocmVzb3VyY2UpOwotCQlsb25nIHN0YW1wID0gSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5nZXRNb2RpZmljYXRpb25TdGFtcChyZXNvdXJjZSk7Ci0JCWlmKHN0YW1wICE9IElSZXNvdXJjZS5OVUxMX1NUQU1QKSB7Ci0JCQlpZihpbmZvID09IG51bGwgfHwgaW5mby5tb2RpZmljYXRpb25TdGFtcCAhPSBzdGFtcCkgewotCQkJCWlmKElTeW5jaHJvbml6YXRpb25IZWxwZXIuSU5TVEFOQ0UuaXNTeW5jaHJvbml6ZWQocmVzb3VyY2UpKSB7Ci0JCQkJCS8vIHJlZnJlc2ggdGhlIGNhY2hlZCBzdGFtcAotCQkJCQkvLwotCQkJCQlpZihpbmZvID09IG51bGwpIHsKLQkJCQkJCXJlc291cmNlSW5mb01hcC5wdXQocmVzb3VyY2UsIG5ldyBSZXNvdXJjZUluZm8ocmVzb3VyY2UpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWluZm8ubW9kaWZpY2F0aW9uU3RhbXAgPSBJU3luY2hyb25pemF0aW9uSGVscGVyLklOU1RBTkNFLmdldE1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsgCi0JCQkJCX0JCQkJCQkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAhSVN5bmNocm9uaXphdGlvbkhlbHBlci5JTlNUQU5DRS5pc1N5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlQ2hhbmdlZChDb2xsZWN0aW9uIHVzZWRSZXNvdXJjZXMpIHsKLQkJLy8gY2hlY2sgcmVzb3VyY2Ugc2V0IHR5cGUgYW5kIGNvbnRpbnVlIHRvIGNoZWNrIGZvciBjaGFuZ2VkIGZpbGUgaWYgdGhlCi0JCS8vIHR5cGUgaXMgWE1JCi0JCS8vCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQodXNlZFJlc291cmNlcyk7Ci0JCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQKLQkJCQkmJiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZW5jZVR5cGUoKS5lcXVhbHMoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB1c2VkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZihpc091dE9mU3luYyhyZXNvdXJjZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9tcHRSZWxvYWRGaWxlcygpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yX2Vycm9yX2FjdGl2YXRlZF9vdXRvZnN5bmNfdGl0bGU7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfZXJyb3JfYWN0aXZhdGVkX291dG9mc3luY19tZXNzYWdlOwotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJdGl0bGUsIG1zZyk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYW5kbGVGaWxlQ2hhbmdlZChmaW5hbCBDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzKSB7Ci0JCWJvb2xlYW4gcmV0ID0gcHJvbXB0UmVsb2FkRmlsZXMoKTsKLQkJaWYgKHJldCkgewotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMTApOyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoX3RleHQpOyAKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCXRyeSB7Ci0KLQkJCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHVzZWRSZXNvdXJjZXMpIHsKLQkJCQkJCQlpZiAoIW5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJCQkJLmV4aXN0cygpKSB7Ci0JCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gcmVzb3VyY2VJbmZvTWFwICE9IG51bGwgPyAKLQkJCQkJCQkJZ2V0T3V0T2ZTeW5jUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpIDoKLQkJCQkJCQkJUmVzb3VyY2VVdGlsLmdldE91dE9mU3luY1Jlc291cmNlcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCi0JCQkJCQkvLyB1bmxvYWQgdGhlIHJlbW92ZWQgcmVzb3VyY2VzCi0JCQkJCQkvLwotCQkJCQkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZW1vdmVkUmVzb3VyY2VzKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDIpOwotCi0JCQkJCQkvLyBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRlZFJlc291cmNlcyA9IG1hbmFnZXIKLQkJCQkJCQkJCS5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkJCQkJaWYgKCFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKQotCQkJCQkJCQkJfHwgIXJlbG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJCQkvLyBzYXZlIGNoYW5nZWQgcmVzb3VyY2VzIGJlZm9yZSByZWZyZXNoIHNvCi0JCQkJCQkJCS8vIGFjdGlvbgotCQkJCQkJCQkvLyBtYW5hZ2VyIHdpbGwgbm90IHRyeSB0byBzYXZlIHRoZXNlIGNoYW5nZWQKLQkJCQkJCQkJLy8gcmVzb3VyY2VzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmFkZEFsbChyZWxvYWRlZFJlc291cmNlcyk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5sYXN0VXNlZFJlc291cmNlcwotCQkJCQkJCQkJCS5yZW1vdmVBbGwocmVtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IudGhpcy5jaGFuZ2VkUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJbW9uaXRvci53b3JrZWQoNCk7Ci0KLQkJCQkJCS8vIHJlZnJlc2ggb3V0LW9mLXN5bmNoIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCQkJCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXRyeSB7Ci0JCQkJZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldFByb2dyZXNzU2VydmljZSgpCi0JCQkJCQkucnVuSW5VSSgKLQkJCQkJCQkJbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhnZXRTaXRlKCkuZ2V0U2hlbGwoKSksCi0JCQkJCQkJCXJ1bm5hYmxlLCBuZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsgCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBlLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0TmFtZSgpIHsKLQkJU3RyaW5nIHBhcnROYW1lID0gZWxlbWVudE9iai5nZXROYW1lKCk7Ci0JCWlmIChwYXJ0TmFtZSA9PSBudWxsKSB7Ci0JCQlwYXJ0TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0UGFydE5hbWUocGFydE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbj4gZ2V0QWxsUGFnZVByb3ZpZGVycygpIHsKLQkJaWYgKGFsbFBhZ2VQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJYWxsUGFnZVByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9ucyhBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgTUVUSE9EX1BBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FLCBJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbi5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIGFsbFBhZ2VQcm92aWRlcnM7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gZ2V0RGVmYXVsdFBhZ2VQcm92aWRlcigpIHsKLQkJaWYgKGRlZmF1bHRQYWdlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdFBhZ2VQcm92aWRlciA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0UGFnZVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhZ2VzKCkgewotCQkvLyBmaXJzdCBnZXQgb3JpZ2luYWwgbGlzdAotCQlNYXA8T2JqZWN0LFN0cmluZz4gcGFnZU1hcCA9IGdldERlZmF1bHRQYWdlUHJvdmlkZXIoKS5nZXRQYWdlcyhuZXcgTGlua2VkSGFzaE1hcDxPYmplY3QsU3RyaW5nPigpLCB0aGlzLCBlbGVtZW50T2JqKTsKLQkJCi0JCS8vIGxldCBleHRlbnNpb25zIG1vZGlmeQotCQlMaXN0PElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uPiBwYWdlUHJvdmlkZXJzID0gZ2V0QWxsUGFnZVByb3ZpZGVycygpOwotCQlpZiAocGFnZVByb3ZpZGVycyAhPSBudWxsICYmIHBhZ2VQcm92aWRlcnMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiBleHRlbnNpb24gOiBwYWdlUHJvdmlkZXJzKSB7Ci0JCQkJcGFnZU1hcCA9IGV4dGVuc2lvbi5nZXRQYWdlcyhwYWdlTWFwLCB0aGlzLCBlbGVtZW50T2JqKTsKLQkJCX0KLQkJfQotCQkvLyBub3cgYWRkIHBhZ2VzCi0JCXRyeSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxPYmplY3QsIFN0cmluZz4gcGFnZUVudHJ5IDogcGFnZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJT2JqZWN0IHBhZ2UgPSBwYWdlRW50cnkuZ2V0S2V5KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwYWdlRW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQlpZiAocGFnZSBpbnN0YW5jZW9mIENvbnRyb2wpIHsKLQkJCQkJaW5kZXggPSBhZGRQYWdlKChDb250cm9sKXBhZ2UpOwotCQkJCX0gZWxzZSBpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCQlpbmRleCA9IGFkZFBhZ2UoKElGb3JtUGFnZSlwYWdlKTsKLQkJCQl9IGVsc2UgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQlpbmRleCA9IGFkZFBhZ2UoKElFZGl0b3JQYXJ0KXBhZ2UsIGdldEVkaXRvcklucHV0KCkpOwotCQkJCX0KLQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCXNldFBhZ2VUZXh0KGluZGV4LCBuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXNldFBhcnROYW1lKGVsZW1lbnRPYmouZ2V0TmFtZSgpKTsKLQotCQkJaWYgKCEoZWxlbWVudE9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlIHx8IGVsZW1lbnRPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKQotCQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0KLQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IodCk7Ci0JCQlkaXNwb3NlKCk7Ci0JCQlpZih0IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKXQ7Ci0JCQl9Ci0JCQlpZih0IGluc3RhbmNlb2YgRXJyb3IpIHsKLQkJCQl0aHJvdyAoRXJyb3IpIHQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdEJhc2VGb3JtRWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigKLQkJCS8vIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCi0JCQlpZiAoYWN0aXZhdGlvbkxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlhY3RpdmF0aW9uTGlzdGVuZXIuZGlzcG9zZSgpOwotCQkJfQotCi0JCQltb2RpZmllZFJpY2hUZXh0ID0gbnVsbDsKLQotCQkJZGlzcG9zZUVkaXRvckVycm9yVGlja1VwZGF0ZXIoKTsKLQkJCQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLnN0b3BMaXN0ZW5pbmdUbyhhY3Rpb25NZ3IuZ2V0Q29tbWFuZFN0YWNrKCkpOwotCQkJfQotCi0JCQlpZiAoaXNEaXJ0eSgpKSB7Ci0JCQkJYWN0aW9uTWdyLnVuZG9BbGwoKTsKLQkJCX0KLQkJCWFjdGlvbk1nci5kaXNwb3NlKCk7Ci0JCQllbGVtZW50T2JqLmVBZGFwdGVycygpLnJlbW92ZShuYW1lQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQotCQkJaWYocmVzb3VyY2VJbmZvTWFwICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZUluZm9NYXAuY2xlYXIoKTsKLQkJCQlyZXNvdXJjZUluZm9NYXAgPSBudWxsOwkJCQkKLQkJCX0KLQkJCQotCQkJaWYoY2hhbmdlZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5jbGVhcigpOwotCQkJCWNoYW5nZWRSZXNvdXJjZXMgPSBudWxsOwotCQkJfQotCQkJCi0JCQlpZihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyA9IG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWlmKFBlcnNwZWN0aXZlVXRpbC5pc0FjdGl2ZVBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJCS8vIHVubG9hZCBhbGwgcmVzb3VyY2VzIG9mIGNvbnRlbnQgZGVzY3JpcHRpb24gdGhhdCBhcmUgbm90IHVzZWQgYnkgCi0JCQl9Ci0JCQkKLQkJCWlmKGxhc3RVc2VkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQlsYXN0VXNlZFJlc291cmNlcy5jbGVhcigpOwotCQkJCWxhc3RVc2VkUmVzb3VyY2VzID0gbnVsbDsKLQkJCX0JCQkJCQkgCi0JCX0gZmluYWxseSB7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQlkaXNwb3NlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRWRpdG9yRXJyb3JUaWNrVXBkYXRlcigpCi0JewotCQlpZiAoIGZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciAhPSBudWxsICkgewotCQkJZk1ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyLmRpc3Bvc2UoKTsKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdEJhc2VGb3JtRWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmIChkaXJ0eSkKLQkJCXJldHVybiB0cnVlOwotCQlkaXJ0eSA9IGFjdGlvbk1nci5pc1NhdmVOZWVkZWQoKTsKLQkJcmV0dXJuIGRpcnR5OwotCX0KLQotCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlpZiAocGVyc2lzdGVyID09IG51bGwpIHsKLQkJCXBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVyOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIGFjdGlvbk1nci5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNldCBtb2RpZmllZCByaWNoIHRleHQgZmllbGQKLQkgKiBAcGFyYW0gbW9kaWZpZWRSaWNoVGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkUmljaFRleHQoSU1ldGhvZFJpY2hUZXh0IG1vZGlmaWVkUmljaFRleHQpIHsKLQkJdGhpcy5tb2RpZmllZFJpY2hUZXh0ID0gbW9kaWZpZWRSaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIG1vZGlmaWVkIHJpY2ggdGV4dCAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kaWZpZWRSaWNoVGV4dChJTWV0aG9kUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwgJiYgIXJpY2hUZXh0LmlzRGlzcG9zZWQoKQotCQkJCSYmIHJpY2hUZXh0LmdldE1vZGlmaWVkKCkpIHsKLQkJCUVPYmplY3QgbW9kYWxPYmplY3QgPSByaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZSA9IHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKTsKLQkJCWlmIChtb2RhbE9iamVjdCAhPSBudWxsICYmIG1vZGFsT2JqZWN0RmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG9sZENvbnRlbnQgPSBtb2RhbE9iamVjdC5lR2V0KG1vZGFsT2JqZWN0RmVhdHVyZSk7Ci0JCQkJaWYgKCFtdXN0UmVzdG9yZVZhbHVlKHJpY2hUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCQlPYmplY3QgbmV3Q29udGVudCA9IHJpY2hUZXh0LmdldFRleHQoKTsKLQkJCQkJcmljaFRleHQuc2V0SW5pdGlhbFRleHQoKFN0cmluZyluZXdDb250ZW50KTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgbW9kYWxPYmplY3QsCi0JCQkJCQkJCW1vZGFsT2JqZWN0RmVhdHVyZSwgbmV3Q29udGVudCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBsYXN0IG1vZGlmaWVkIHJpY2ggdGV4dCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kaWZpZWRSaWNoVGV4dCgpIHsKLQkJc2F2ZU1vZGlmaWVkUmljaFRleHQobW9kaWZpZWRSaWNoVGV4dCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24gY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBMaWJyYXJ5VmFsaWRhdGVBY3Rpb24oZmFsc2UpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWYWxpZGF0ZUFjdGlvbiNyZWZyZXNoVmlld3MoKQotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld3MoKSB7Ci0JCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnJlZnJlc2hWaWV3cygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlcyhDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxFT2JqZWN0PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQllbGVtZW50cy5hZGRBbGwocmVzb3VyY2UuZ2V0Q29udGVudHMoKSk7Ci0JCQl9Ci0JCX0KLQkJTGlicmFyeVZhbGlkYXRlQWN0aW9uIHZhbGlkYXRlQWN0aW9uID0gY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpOwotCQl2YWxpZGF0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZWxlbWVudHMpKTsKLQkJdmFsaWRhdGVBY3Rpb24ucnVuKCk7Ci0JCXJldHVybiB2YWxpZGF0ZUFjdGlvbi5pc1N1Y2Nlc3NmdWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5BYnN0cmFjdEJhc2VGb3JtRWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5kb1NhdmU6IHNhdmluZyBjaGFuZ2VzIHRvIG1ldGhvZCBsaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNhdmVNb2RpZmllZFJpY2hUZXh0KG1vZGlmaWVkUmljaFRleHQpOwotCi0JCWdldFBlcnNpc3RlcigpOwotCQl0cnkgewotCQkJLy8gY2hlY2sgZm9yIG1vZGlmaWFibGUKLQkJCS8vCi0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkKLQkJCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzVG9TYXZlID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4obW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCQkvLyB1cGRhdGUgdmVyc2lvbiBpbmZvIGluIGxpYnJhcnkgcmVzb3VyY2UgaWYgbmVlZGVkIGJ5IGFkZGluZwotCQkJLy8gbGlicmFyeSByZXNvdXJjZSB0byBjb2xsZWN0aW9uCi0JCQkvLyBvZiBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFBlcnNpc3RlbmNlVXRpbAotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG1lKTsKLQkJCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJCWlmIChsaWJSZXNvdXJjZSAhPSBudWxsCi0JCQkJCQkJCQkmJiAhbW9kaWZpZWRSZXNvdXJjZXMuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiAhcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mbwotCQkJCQkJCQkJCQkuY29udGFpbnMobGliUmVzb3VyY2UpCi0JCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCQkJLmNoZWNrVG9vbFZlcnNpb24obGliUmVzb3VyY2UpICE9IDApIHsKLQkJCQkJCQkJcmVzb3VyY2VzVG9VcGRhdGVWZXJzaW9uSW5mby5hZGQobGliUmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXNvdXJjZXNUb1NhdmUuYWRkQWxsKHJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8pOwotCQkJfQotCi0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeSgKLQkJCQkJcmVzb3VyY2VzVG9TYXZlLCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQloYW5kbGVFcnJvcihzdGF0dXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gY2hlY2sgZm9yIG91dC1vZi1zeW5jaAotCQkJLy8KLQkJCWlmIChjaGVja0ZpbGVDaGFuZ2VkKHJlc291cmNlc1RvU2F2ZSkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51cGRhdGVfb3V0b2ZzeW5jaF90aXRsZTsKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfbXNnOwotCQkJCWlmICghQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCh0aXRsZSwgbXNnKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBmbGFnIHRoZSByZXNvdXJjZXMgdG8gdXBkYXRlIHZlcnNpb24gaW5mbyBhcyBtb2RpZmllZCBzbyB0aGV5Ci0JCQkvLyB3aWxsIGJlIHNhdmVkCi0JCQkvLwotCQkJaWYgKCFyZXNvdXJjZXNUb1VwZGF0ZVZlcnNpb25JbmZvLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvVXBkYXRlVmVyc2lvbkluZm8uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlyZXNvdXJjZS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGlzVmFsaWRhdGVSZXNvdXJjZXNCZWZvcmVTYXZlUmVxdWlyZWQoKSkgewotCQkJCS8vIHZhbGlkYXRlCi0JCQkJLy8KLQkJCQlpZighdmFsaWRhdGVSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBubyB2YWxpZGF0aW9uIGJlZm9yZSBzYXZlCi0JCQkJLy8gcmVtb3ZlIGFsbCB2YWxpZGF0aW9uIGVycm9ycyBtYXJrZXJzIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IG1ldGhvZCBlbGVtZW50Ci0JCQkJLy8KLQkJCQlpZihMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRS5oYXNNYXJrZXJzKGVsZW1lbnRPYmopKSB7Ci0JCQkJCUxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLklOU1RBTkNFLmRlbGV0ZU1hcmtlcnMoZWxlbWVudE9iaik7Ci0JCQkJCQotCQkJCQkvLyByZWZyZXNoIGxpYnJhcnkgdmlldwotCQkJCQkvLwotCQkJCQlMaWJyYXJ5VmlldyB2aWV3ID0gTGlicmFyeVZpZXcuZ2V0VmlldygpOwotCQkJCQlpZih2aWV3ICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5jbGVhckRlY29yYXRpb25DYWNoZSgpOwotCQkJCQkJdmlldy5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCQotCQkJLy8gU2F2ZS4KLQkJCS8vCi0JCQlPYmplY3Qgb2xkVmFsdWUgPSBwZXJzaXN0ZXIuZ2V0U2F2ZU9wdGlvbnMoKS5nZXQoCi0JCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5PUFRJT05TX09WRVJXUklUQUJMRV9SRVNPVVJDRVMpOyAKLQotCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiA9IG51bGw7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLk9QVElPTlNfT1ZFUldSSVRBQkxFX1JFU09VUkNFUywgCi0JCQkJCQlnZXRPdmVyd3JpdGFibGVSZXNvdXJjZXMoKSk7Ci0JCQkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb1NhdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOyAKLQkJCQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclJlYXNvbjEKLQkJCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCQl0aXRsZSwgbXNnLCByZWFzb24sIGUpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJZGlydHkgPSBmYWxzZTsKLQkJCQkJYWN0aW9uTWdyLnNhdmVJc0RvbmUoKTsKLQkJCQkJY2hhbmdlVGltZSA9IC0xOwotCQkJCQlyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uID0gZ2V0UmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKCk7CQotCQkJCQlzZXRSZXNvdXJjZUluZm9zKGdldFVzZWRSZXNvdXJjZXMoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yOyAKLQkJCQkJfQotCQkJCQlTdHJpbmdXcml0ZXIgZGV0YWlscyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKGRldGFpbHMpKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvclRpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3Jfc2F2ZUVycm9yTWVzc2FnZTI7IAotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXRpdGxlLCBtZXNzYWdlLCByZWFzb24sIGRldGFpbHMudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcGVyc2lzdGVyLmdldFNhdmVPcHRpb25zKCkucHV0KAotCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLk9QVElPTlNfT1ZFUldSSVRBQkxFX1JFU09VUkNFUywKLQkJCQkJCW9sZFZhbHVlKTsKLQkJCX0KLQotCQkJLy8gUmVuYW1lCi0JCQkvLwotCQkJLy9Db2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uID0gZ2V0UmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKCk7CQkJCQkJCi0JCQlpZiAocmVzb3VyY2VzVG9BZGp1c3RMb2NhdGlvbiAhPSBudWxsICYmICFyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JzX01ldGhvZEVsZW1lbnRFZGl0b3JfcmVuYW1lRXJyb3JUaXRsZTsgCi0JCQkJCVN0cmluZyB0ZW1wbGF0ZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9yZW5hbWVFcnJvck1lc3NhZ2UxOyAKLQkJCQkJU3RyaW5nQnVmZmVyIGZpbGVMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJT2JqZWN0IG9iaiA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQkJCQlpZihvYmogPT0gbnVsbCkgewotCQkJCQkJCW9iaiA9IHJlc291cmNlOwotCQkJCQkJfQotCQkJCQkJZmlsZUxpc3QuYXBwZW5kKG9iaikuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRlbXBsYXRlLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGVMaXN0IH0pOwotCQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQkJOiBlLmdldE1lc3NhZ2UoKTsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKHJlYXNvbikpIHsKLQkJCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24yOyAKLQkJCQkJfQotCQkJCQlTdHJpbmdXcml0ZXIgZGV0YWlscyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKGRldGFpbHMpKTsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3JlbmFtZUVycm9yVGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JNZXNzYWdlMjsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIG1lc3NhZ2UsIHJlYXNvbiwgZGV0YWlscy50b1N0cmluZygpLCBlKTsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0KLQkJCQlyZXNvdXJjZXNUb0FkanVzdExvY2F0aW9uLmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlWaWV3SGVscGVyLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE92ZXJ3cml0YWJsZVJlc291cmNlcygpIHsKLQkJaWYocmVzb3VyY2VJbmZvTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VJbmZvIGluZm8gPSAoUmVzb3VyY2VJbmZvKSBpdGVyLm5leHQoKTsKLQkJCWlmKGluZm8ub3ZlcndyaXRlKSB7Ci0JCQkJcmVzb3VyY2VzLmFkZChpbmZvLnJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0UmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKCkgewotCQlpZihyZXNvdXJjZUluZm9NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJQXJyYXlMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUluZm9NYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZUluZm8gaW5mbyA9IChSZXNvdXJjZUluZm8pIGl0ZXIubmV4dCgpOwotCQkJaWYoaW5mby5hZGp1c3RMb2NhdGlvbikgewotCQkJCXJlc291cmNlcy5hZGQoaW5mby5yZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZGF0ZVJlc291cmNlc0JlZm9yZVNhdmVSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGVyc2lzdGVyKCkuc2F2ZShyZXNvdXJjZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JUaXRsZTsgCi0JCQkJU3RyaW5nIHRlbXBsYXRlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWRpdG9yc19NZXRob2RFbGVtZW50RWRpdG9yX3NhdmVFcnJvck1lc3NhZ2UxOyAKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGVtcGxhdGUsCi0JCQkJCQluZXcgT2JqZWN0W10geyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSB9KTsKLQkJCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXRvcnNfTWV0aG9kRWxlbWVudEVkaXRvcl9zYXZlRXJyb3JSZWFzb24xCi0JCQkJCQk6IGUuZ2V0TWVzc2FnZSgpOyAKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIG1zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByZXZpZXdQYWdlKCkgewotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0Q29udGFpbmVyKCk7Ci0JCUNvbXBvc2l0ZSBwcmV2aWV3Q29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcHJldmlld0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJUHJldmlld1BhZ2UgcGFnZSA9IG5ldyBQcmV2aWV3UGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJcHJldmlld2VyID0gcGFnZS5nZXRQcmV2aWV3Vmlld2VyKCk7Ci0KLQkJcHJldmlld19wYWdlX2luZGV4ID0gYWRkUGFnZShwcmV2aWV3Q29tcG9zaXRlKTsKLQkJc2V0UGFnZVRleHQocHJldmlld19wYWdlX2luZGV4LCBBdXRob3JpbmdVSVJlc291cmNlcy5wcmV2aWV3UGFnZV90aXRsZSk7IAotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGxpc3RlbiB0byB0aGUgdGFiIGNoYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYWdlQ2hhbmdlKGludCBuZXdQYWdlSW5kZXgpIHsKLQkJc3VwZXIucGFnZUNoYW5nZShuZXdQYWdlSW5kZXgpOwotCi0JCWlmIChwcmV2aWV3X3BhZ2VfaW5kZXggPT0gbmV3UGFnZUluZGV4ICYmIHByZXZpZXdlciAhPSBudWxsKSB7Ci0JCQkvLyBVc2UgdGhlIGRlZmF1bHQgbGF5b3V0IG1hbmFnZXIuCi0JCQkvL3ByZXZpZXdlci5zZXRMYXlvdXRNYW5hZ2VyKG51bGwpOwotCQkJcHJldmlld2VyLnNob3dFbGVtZW50Q29udGVudChlbGVtZW50T2JqKTsKLQkJfQotCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChuZXdQYWdlSW5kZXgpOwotCQlpZiAocGFnZSBpbnN0YW5jZW9mIE11bHRpUGFnZUVkaXRvclBhcnQpIHsKLQkJCUlWaWV3UGFydCBwcm9wZXJ0aWVzVmlldyA9IGdldEVkaXRvclNpdGUoKS5nZXRQYWdlKCkuZmluZFZpZXcoIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByb3BlcnRpZXNWaWV3IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldCkgewotCQkJCSgoUHJvcGVydHlTaGVldClwcm9wZXJ0aWVzVmlldykucGFydEFjdGl2YXRlZCh0aGlzKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlydHkoKSB7Ci0JCWRpcnR5ID0gdHJ1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmUgdmFsdWUgb2YgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4KLQkgKiAJCWJvb2xlYW4gdmFsdWUgdG8gaW5kaWNhdGUgd2hldGhlciBjb250cm9sIHdhcyByZXN0b3JlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtdXN0UmVzdG9yZVZhbHVlKE9iamVjdCBjb250cm9sLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHdpZGdldFRvQ2hlY2sgPT0gY29udHJvbCkgewotCQkJLy8gdGhlIGNvbnRyb2wgaXMgY3VycmVudGx5IGJlaW5nIGNoZWNrZWQgZm9yIGVkaXRhYmxlLCBidXQgdGhlcmUgaXMKLQkJCS8vIHN0aWxsIGZvY3VzIGxvc3QKLQkJCS8vIGV2ZW50IGlzIGJlaW5nIHNlbnQgb3V0IGV2ZW4gdGhlIGNoZWNrIGlzIG5vdCBjb21wbGV0ZWQgeWV0LgotCQkJLy8gcmV0dXJuIHRydWUgc28gdGhlIGZvY3VzTG9zdCgpIHdpbGwgbm90IG1ha2UgYW55IGNoYW5nZSB0byB0aGUKLQkJCS8vIGNvbnRyb2wuCi0JCQkvLwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlPYmplY3QgZWRpdENvbnRyb2wgPSBjb250cm9sOwotCQlpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBNZXRob2RSaWNoVGV4dEVkaXRvcikgewotCQkJZWRpdENvbnRyb2wgPSAoKE1ldGhvZFJpY2hUZXh0RWRpdG9yKSBjb250cm9sKS5nZXRSaWNoVGV4dENvbnRyb2woKTsKLQkJfQotCQlib29sZWFuIHJlc3RvcmUgPSB3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoZWRpdENvbnRyb2wpOwotCQlpZiAoIXJlc3RvcmUpIHsKLQkJCXN5bmNocm9uaXplZCAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlKSB7Ci0JCQkJcmVzdG9yZSA9IHdpZGdldHNUb1Jlc3RvcmVWYWx1ZS5jb250YWlucyhlZGl0Q29udHJvbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3RvcmUpIHsKLQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQlUZXh0IHRleHQgPSAoKFRleHQpIGVkaXRDb250cm9sKTsKLQkJCQl0ZXh0LnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotCQkJfSBlbHNlIGlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIElNZXRob2RSaWNoVGV4dCkgewotCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGVkaXRDb250cm9sOwotCQkJCXJpY2hUZXh0LnNldFRleHQoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLnJlbW92ZShlZGl0Q29udHJvbCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3RvcmU7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IExpc3RlbmVyIAotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIE1vZGlmeUxpc3RlbmVyIGltcGxlbWVudHMKLQkJCW9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIgewotCi0JCXByaXZhdGUgRU9iamVjdCBlbGVtZW50OwotCi0JCXByaXZhdGUgYm9vbGVhbiBjaGVja0NvbnRhaW5lclJlc291cmNlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBkaXNhYmxlZCA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQkJcHVibGljIE1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQkJc3VwZXIoKTsKLQkJCWNoZWNrQ29udGFpbmVyUmVzb3VyY2UgPSBjaGVja0NvbnRhaW5lcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVzdG9yZVRleHQoT2JqZWN0IGNvbnRyb2wsIFN0cmluZyB0eHQpIHsKLQkJCWJvb2xlYW4gb2xkID0gZGlzYWJsZWQ7Ci0JCQl0cnkgewotCQkJCWRpc2FibGVkID0gdHJ1ZTsKLQkJCQlPYmplY3QgZWRpdENvbnRyb2wgPSBjb250cm9sOwotCQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIE1ldGhvZFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQkJCWVkaXRDb250cm9sID0gKChNZXRob2RSaWNoVGV4dEVkaXRvcikgY29udHJvbCkKLQkJCQkJCQkuZ2V0UmljaFRleHRDb250cm9sKCk7Ci0JCQkJfQotCQkJCWlmIChlZGl0Q29udHJvbCBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJVGV4dCB0ZXh0ID0gKChUZXh0KSBlZGl0Q29udHJvbCk7Ci0JCQkJCXRleHQuc2V0VGV4dCh0eHQpOwotCQkJCX0gZWxzZSBpZiAoZWRpdENvbnRyb2wgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZWRpdENvbnRyb2w7Ci0JCQkJCXJpY2hUZXh0LnNldFRleHQodHh0KTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWRpc2FibGVkID0gb2xkOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNoZWNrRWRpdChFT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb250cm9sLAotCQkJCWJvb2xlYW4gY2hlY2tDb250YWluZXJSZXNvdXJjZSkgewotCQkJLy8ga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCB3aWRnZXQgc28gbXVzdFJlc3RvcmVWYWx1ZSgpIGNhbgotCQkJLy8gdXNlIGl0IHRvIGNoZWNrCi0JCQkvLyB3aGV0aGVyIGEgZm9jdXMgbG9zdCBldmVudCBpcyB0cmlnZ2VyZWQgZHVyaW5nIGEgY2hlY2tFZGl0LgotCQkJLy8gbXVzdFJlc3RvcmVWYWx1ZSgpIHRoZW4KLQkJCS8vIHJldHVybnMgdHJ1ZSBzbyBmb2N1c0xvc3QoKSB3aWxsIG5vdCB0cnkgdG8gbWFrZSBjaGFuZ2UgdG8gdGhlCi0JCQkvLyB2YWx1ZSBib3VuZCB0byB0aGUgd2lkZ2V0Ci0JCQkvLwotCQkJd2lkZ2V0VG9DaGVjayA9IGNvbnRyb2w7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuY2hlY2tFZGl0OiBlbnRlciwgY29udHJvbD0iICsgY29udHJvbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoY29udHJvbCkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXN5bmNocm9uaXplZCAod2lkZ2V0c1RvUmVzdG9yZVZhbHVlKSB7Ci0JCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMoY29udHJvbCkpIHsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChlbGVtZW50LCBnZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0KLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIElSaWNoVGV4dCkgewotCQkJCQkJCSgoSVJpY2hUZXh0KSBjb250cm9sKS5yZXN0b3JlVGV4dCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoY29udHJvbCA9PSBjdXJyZW50RmVhdHVyZUVkaXRvcikgewotCQkJCQkJCQlyZXN0b3JlVGV4dChjb250cm9sLCAoU3RyaW5nKSBlbGVtZW50Ci0JCQkJCQkJCQkJLmVHZXQoY3VycmVudEVkaXRlZEZlYXR1cmUpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2Ygd2lkZ2V0cyB3aG9zZQotCQkJCQkJCQkvLyB2YWx1ZSBuZWVkcwotCQkJCQkJCQkvLyB0byBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgb25lLi4KLQkJCQkJCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmFkZChjb250cm9sKTsKLQkJCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLmNoZWNrRWRpdDogYWRkZWQgd2lkZ2V0IHRvIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoY2hlY2tDb250YWluZXJSZXNvdXJjZSkgewotCQkJCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwKLQkJCQkJCQkJJiYgZWxlbWVudC5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkgIT0gZWxlbWVudAotCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSkgewotCQkJCQkJCXN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KGVsZW1lbnQuZUNvbnRhaW5lcigpLAotCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQkvLyAvLyBBZGQgdGhlIGNvbnRyb2wgdG8gdGhlIGxpc3Qgb2Ygd2lkZ2V0cwotCQkJCQkJCQkvLyB3aG9zZSB2YWx1ZQotCQkJCQkJCQkvLyAvLyBuZWVkcyB0byBiZSByZXN0b3JlZCB0byB0aGUgb3JpZ2luYWwgb25lLgotCQkJCQkJCQkvLyBpZiAoZGVidWcpIHsKLQkJCQkJCQkJLy8gU3lzdGVtLm91dAotCQkJCQkJCQkvLyAucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5jaGVja0VkaXQ6Ci0JCQkJCQkJCS8vIGFkZGVkIHdpZGdldCB0byB3aWRnZXRzVG9SZXN0b3JlVmFsdWUiKTsKLQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyB9Ci0JCQkJCQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgSVJpY2hUZXh0KSB7Ci0JCQkJCQkJCQkoKElSaWNoVGV4dCkgY29udHJvbCkucmVzdG9yZVRleHQoKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChjb250cm9sID09IGN1cnJlbnRGZWF0dXJlRWRpdG9yKSB7Ci0JCQkJCQkJCQkJcmVzdG9yZVRleHQoY29udHJvbCwgKFN0cmluZykgZWxlbWVudAotCQkJCQkJCQkJCQkJLmVHZXQoY3VycmVudEVkaXRlZEZlYXR1cmUpKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJd2lkZ2V0c1RvUmVzdG9yZVZhbHVlLmFkZChjb250cm9sKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsIAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwgCi0JCQkJCQkJc3RhdHVzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvLyBjbGVhciB0aGUgcmVmZXJlbmNlIHdoZW4gdGhlIGNoZWNrIGlzIGRvbmUKLQkJCQkvLwotCQkJCXdpZGdldFRvQ2hlY2sgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBlbnRlciwgZGlzYWJsZWQ9IiArIGRpc2FibGVkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCFkaXNhYmxlZCAmJiBlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoZS53aWRnZXQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJT2JqZWN0IHdpZGdldCA9IGUud2lkZ2V0OwotCQkJCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBCcm93c2VyKSB7Ci0JCQkJCXdpZGdldCA9ICgoQnJvd3Nlcikgd2lkZ2V0KQotCQkJCQkJCS5nZXREYXRhKElNZXRob2RSaWNoVGV4dC5QUk9QRVJUWV9OQU1FKTsKLQkJCQkJaWYgKHdpZGdldCA9PSBudWxsKSB7Ci0JCQkJCQl3aWRnZXQgPSBlLndpZGdldDsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IHdpZGdldD0iICsgd2lkZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCWlmICh3aWRnZXRzVG9SZXN0b3JlVmFsdWUuY29udGFpbnMod2lkZ2V0KSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogd2lkZ2V0IGZvdW5kIGluIHdpZGdldHNUb1Jlc3RvcmVWYWx1ZSwgZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmICghY2hlY2tFZGl0KGVsZW1lbnQsIHdpZGdldCwgY2hlY2tDb250YWluZXJSZXNvdXJjZSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IGNoZWNrRWRpdCBmYWlsZWQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgSU1ldGhvZFJpY2hUZXh0KSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIHdpZGdldDsKLQkJCQkJc2V0TW9kaWZpZWRSaWNoVGV4dChyaWNoVGV4dCk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lci5tb2RpZnlUZXh0OiBhZGRpbmcgdG8gbW9kaWZpZWRSaWNoVGV4dHMgbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyLm1vZGlmeVRleHQ6IG1hcmtpbmcgZWRpdG9yIGFzIGRpcnR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJc2V0RGlydHkoKTsKLQkJCX0KLQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIubW9kaWZ5VGV4dDogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgdW5kZXJseWluZyBtb2RlbCBlbGVtZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnQKLQkJICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RWxlbWVudChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgZGlzYWJsZSBmbGFnLgotCQkgKiAKLQkJICogQHBhcmFtIGRpc2FibGVkCi0JCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGlnbm9yZSB0aGUgbW9kaWZ5IGV2ZW50cy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERpc2FibGUoYm9vbGVhbiBkaXNhYmxlZCkgewotCQkJdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgaW5zdGFuY2Ugb2YgTW9kaWZ5TGlzdGVuZXIgdGhhdCBzdXBwb3J0cyB0ZWFtIGFuZCBDTQotCSAqIGludGVncmF0aW9uIEFueSBjb250cm9sIGluIHRoZSBlZGl0b3IsIGlmIGl0IG5lZWRzIGEgTW9kaWZ5TGlzdGVuZXIsIG11c3QKLQkgKiB1c2Ugb25lIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTW9kaWZ5TGlzdGVuZXIgY3JlYXRlTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBjcmVhdGVNb2RpZnlMaXN0ZW5lcihlT2JqLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgaW5zdGFuY2Ugb2YgTW9kaWZ5TGlzdGVuZXIgdGhhdCBzdXBwb3J0cyB0ZWFtIGFuZCBDTQotCSAqIGludGVncmF0aW9uIEFueSBjb250cm9sIGluIHRoZSBlZGl0b3IsIGlmIGl0IG5lZWRzIGEgTW9kaWZ5TGlzdGVuZXIsIG11c3QKLQkgKiB1c2Ugb25lIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBjaGVja0NvbnRhaW5lcgotCSAqICAgICAgICAgICAgaWYgdHJ1ZSB3aWxsIGNoZWNrIHRoZSBjb250YWluZXIgb2YgdGhlIGdpdmVuIG9iamVjdCBmb3IKLQkgKiAgICAgICAgICAgIGVkaXRhYmxlIGFzIHdlbGwgd2hlbiBjaGVja2luZyB0aGUgZ2l2ZW4gb2JqZWN0IGZvciBlZGl0YWJsZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCU1vZGlmeSBMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBNb2RpZnlMaXN0ZW5lciBjcmVhdGVNb2RpZnlMaXN0ZW5lcihFT2JqZWN0IGVPYmosCi0JCQlib29sZWFuIGNoZWNrQ29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoZU9iaiwgY2hlY2tDb250YWluZXIpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCBjb250cm9sIHRvIGJlIHRoZSBjdXJyZW50IGVkaXRvciBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoT2JqZWN0IGNvbnRyb2wsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQljdXJyZW50RmVhdHVyZUVkaXRvciA9IGNvbnRyb2w7Ci0JCWN1cnJlbnRFZGl0ZWRGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb25pdG9yQ2hhbmdlKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeQotCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucmVmcmVzaFByb3ZpZGVycyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiZXh0ZW5zaW9uOiBVSUQ9IiArIGV4dGVuc2lvbi5nZXRVbmlxdWVJZGVudGlmaWVyKCkgKyAiLCAiICsgZXh0ZW5zaW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8UmVzb3VyY2UsIFJlc291cmNlSW5mbz4gZ2V0UmVzb3VyY2VJbmZvTWFwKCkgewotCQlpZihyZXNvdXJjZUluZm9NYXAgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VJbmZvTWFwID0gbmV3IEhhc2hNYXA8UmVzb3VyY2UsIFJlc291cmNlSW5mbz4oKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VJbmZvTWFwOwotCX0KLQotCS8qKgotCSAqIEFkZCByZXNvdXJjZSB0byBhZGp1c3QgbG9jYXRpb24KLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZVRvQWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJUmVzb3VyY2VJbmZvIGluZm8gPSBnZXRSZXNvdXJjZUluZm9NYXAoKS5nZXQocmVzb3VyY2UpOwotCQlpZihpbmZvID09IG51bGwpIHsKLQkJCWluZm8gPSBuZXcgUmVzb3VyY2VJbmZvKHJlc291cmNlKTsKLQkJCWdldFJlc291cmNlSW5mb01hcCgpLnB1dChyZXNvdXJjZSwgaW5mbyk7Ci0JCX0KLQkJaW5mby5hZGp1c3RMb2NhdGlvbiA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0VXNlZEZlYXR1cmVzKCkgewotCQlyZXR1cm4gZWxlbWVudE9iai5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyByZXNvdXJjZXMgdGhhdCBhcmUgY3VycmVudGx5IGJlaW5nIHVzZWQgYnkgdGhpcyBlZGl0b3JzCi0JICogCi0JICogQHJldHVybgotCSAqIAkJbGlzdCBvZiB1c2VkIHJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRVc2VkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50T2JqLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQkJTGlzdCBhbGxGZWF0dXJlcyA9IGdldFVzZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gYWxsRmVhdHVyZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgYWxsRmVhdHVyZXMKLQkJCQkJLmdldChpKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgZWxlbWVudE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWZvciAoaW50IGogPSB2YWx1ZXMuc2l6ZSgpIC0gMTsgaiA+IC0xOyBqLS0pIHsKLQkJCQkJRU9iamVjdCB2YWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMuZ2V0KGopOwotCQkJCQlpZiAodmFsdWUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJcmVzb3VyY2VzLmFkZCh2YWx1ZS5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnRPYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCQkmJiAocmVzb3VyY2UgPSAoKEVPYmplY3QpIHZhbHVlKS5lUmVzb3VyY2UoKSkgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbGFzdFVzZWRSZXNvdXJjZXMgPSByZXNvdXJjZXM7Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0VVJJVG9Vc2VkUmVzb3VyY2VNYXAoKSB7Ci0JCUhhc2hNYXA8VVJJLCBSZXNvdXJjZT4gbWFwID0gbmV3IEhhc2hNYXA8VVJJLCBSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0VXNlZFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJbWFwLnB1dChyZXNvdXJjZS5nZXRVUkkoKSwgcmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwgCi0JCQkJc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIHRoZSBhY3RpdmF0aW9uIG9mIHRoaXMgdmlldy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVBY3RpdmF0ZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIFRPRE86IFJldmlldyBpbXBsZW1lbnRhdGlvbi4KLQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG1ldGhvZCBsaWJyYXJ5IG9wZW4gaXMgbm90IGNsb3NlZC4KLQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnlQcm9qZWN0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZiAoY2hlY2tGaWxlQ2hhbmdlZFJlcXVpcmVkKSB7Ci0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gZ2V0VXNlZFJlc291cmNlcygpOwotCQkJaWYgKGNoZWNrRmlsZUNoYW5nZWQodXNlZFJlc291cmNlcykpIHsKLQkJCQloYW5kbGVGaWxlQ2hhbmdlZCh1c2VkUmVzb3VyY2VzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsKLQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9XQVJOX0ZpbGVDb25mbGljdDsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5UHJvbXB0KAotCQkJCXRpdGxlLCBtc2cpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgY2hhbmdlZCByZXNvdXJjZXMgd2hlbiB0aGlzIHZpZXcgaXMgYWN0aXZhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoKSB7Ci0JCWlmICgoZWxlbWVudE9iai5lSXNQcm94eSgpIHx8ICFjaGFuZ2VkUmVzb3VyY2VzLmlzRW1wdHkoKSkKLQkJCQkmJiAoIWlzRGlydHkoKSB8fCBoYW5kbGVEaXJ0eUNvbmZsaWN0KCkpKSB7Ci0JCQkvLyBlZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0KLQkJCS8vIGZvciAoSXRlcmF0b3IgaSA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaS5uZXh0KCk7Ci0JCQkvLyBpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJLy8gaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCS8vIHRyeSB7Ci0JCQkvLyAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkucmVsb2FkKG51bGwpOwotCQkJLy8gfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyByZXNvdXJjZS51bmxvYWQoKTsKLQkJCS8vIHRyeSB7Ci0JCQkvLyByZXNvdXJjZS5sb2FkKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQkvLyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBvciBub3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lucHV0VmFsaWQoKSB7Ci0JCWlmIChlbGVtZW50T2JqICE9IG51bGwgJiYgZWxlbWVudE9iai5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IGUgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlbGVtZW50T2JqKTsKLQkJCXJldHVybiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgIWUuZUlzUHJveHkoKSAmJiBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RMaWJyYXJ5KGUpID09IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhZ2VzKCkgewotCQl3aGlsZSAoZ2V0UGFnZUNvdW50KCkgPiAwKSB7Ci0JCQlyZW1vdmVQYWdlKDApOwotCQl9Ci0JCWFkZFBhZ2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2goZmluYWwgYm9vbGVhbiBmb3JjZSkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSBsYXN0VXNlZFJlc291cmNlczsKLQkJCQkJCWlmICghZm9yY2UgJiYgIWVsZW1lbnRPYmouZUlzUHJveHkoKQotCQkJCQkJCQkmJiAhY2hlY2tSZWxvYWRlZCh1c2VkUmVzb3VyY2VzKSkgewotCQkJCQkJCS8vIG5vIHJlc291cmNlIHJlbG9hZGVkLCBubyBuZWVkIHRvIHJlZnJlc2gKLQkJCQkJCQkvLwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWludCBhY3RpdmVQYWdlSW5kZXggPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQltb2RpZmllZFJpY2hUZXh0ID0gbnVsbDsKLQkJCQkJCWlmIChpc0RpcnR5KCkpIHsKLQkJCQkJCQlhY3Rpb25NZ3IudW5kb0FsbCgpOwotCQkJCQkJCWRpcnR5ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZWxlbWVudE9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJZWxlbWVudE9iai5lQWRhcHRlcnMoKS5yZW1vdmUobmFtZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCQkJRU9iamVjdCBlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc29sdmUoCi0JCQkJCQkJCQllbGVtZW50T2JqKTsKLQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkJCSYmICFlLmVJc1Byb3h5KCkKLQkJCQkJCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlKSA9PSBMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSkgewotCQkJCQkJCQlzZXRJbnB1dChjcmVhdGVJbnB1dCgoTWV0aG9kRWxlbWVudCkgZSkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIGlucHV0IGVsZW1lbnQgaXMgaW52YWxpZCwgY2xvc2UgdGhlIGVkaXRvcgotCQkJCQkJCQkvLwotCQkJCQkJCQljbG9zZShmYWxzZSk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzZXRSZXNvdXJjZUluZm9zKHVzZWRSZXNvdXJjZXMpOwotCQkJCQkJdXBkYXRlUGFnZXMoKTsKLQkJCQkJCWlmIChhY3RpdmVQYWdlSW5kZXggIT0gLTEpIHsKLQkJCQkJCQlzZXRBY3RpdmVQYWdlKGFjdGl2ZVBhZ2VJbmRleCk7Ci0JCQkJCQl9Ci0JCQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCi0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlyZWZyZXNoKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMpIHsKLQkJLy8gc2F2ZSBjaGFuZ2VkIHJlc291cmNlcyBiZWZvcmUgcmVmcmVzaCBzbyBhY3Rpb24gbWFuYWdlciB3aWxsIG5vdCB0cnkKLQkJLy8gdG8gc2F2ZSB0aGVzZSBjaGFuZ2VkIHJlc291cmNlcwotCQkvLwotCQl0aGlzLmNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKGNoYW5nZWRSZXNvdXJjZXMpOwotCQlyZWZyZXNoKGZhbHNlKTsKLQkJdGhpcy5jaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7CQkKLQl9Ci0KLQotCS8qKgotCSAqIFB1YmxpYyBtZXRob2QgdG8gcmVmcmVzaCBlZGl0b3IgdGl0bGUgaW1hZ2Ugb24gY2VydGFpbiBhY3Rpb24uCi0JICogZS5nLiBJZiBtZXRob2RQbHVnaW4gaXMgbG9ja2VkLCBlZGl0b3IgdGl0bGUgaW1hZ2Ugc2hvdWxkIGJlIGdyZXktZWQgb3V0LgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFRpdGxlSW1hZ2UoKSB7Ci0JCWlmIChmTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIgIT0gbnVsbCkKLQkJCWZNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlci51cGRhdGVFZGl0b3JJbWFnZShlbGVtZW50T2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVkVGl0bGVJbWFnZShJbWFnZSBpbWFnZSkgewotCQlzZXRUaXRsZUltYWdlKGltYWdlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlpZihtYXJrZXIuZ2V0UmVzb3VyY2UoKSA9PSBlbGVtZW50RmlsZSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3QgdmFsID0gbWFya2VyLmdldEF0dHJpYnV0ZShMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5HVUlEKTsKLQkJCQlpZih2YWwgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSB2YWw7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJaWYoZSAhPSBlbGVtZW50T2JqKSB7Ci0JCQkJCQkvLyB3cm9uZyBlbGVtZW50IGlzIG9wZW5lZCBiZWNhdXNlIGVsZW1lbnQgZnJvbSB0aGUKLQkJCQkJCS8vIG1hcmtlciBpcyBub3QgdGhlIHRvcCBlbGVtZW50IGluIGl0cyByZXNvdXJjZQotCQkJCQkJLy8gY2xvc2UgdGhpcyBlZGl0b3IgYW5kIG9wZW4gdGhlIHJpZ2h0IG9uZQotCQkJCQkJLy8KLQkJCQkJCWNsb3NlKGZhbHNlKTsKLQkJCQkJCUlFZGl0b3JLZWVwZXIuUkVGRVJFTkNFLmdldEVkaXRvcktlZXBlcigpLm9wZW5FZGl0b3IoZSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQotCQkJfQotCQl9Ci0JCQotCQkvLyBvcGVuIGRlc2NyaXB0aW9uIHBhZ2UKLQkJc2V0QWN0aXZlUGFnZSgwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gZGlzcG9zZWQ7Ci0JfQotCi0JcHVibGljIEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhOThiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kRWxlbWVudEVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5JTWV0aG9kRWxlbWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBBbiBlZGl0b3IgaW5wdXQgZm9yIG1ldGhvZCBlbGVtZW50IGVkaXRvcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCwgSU1ldGhvZEVsZW1lbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0KLQkvLyB0aGUgY3VycmVudCBvYmplY3QgYmVpbmcgZWRpdGVkIGJ5IHRoZSBSVEUKLQlwcml2YXRlIEVPYmplY3QgZk1vZGFsT2JqZWN0OwotCi0JLy8gdGhlIGN1cnJlbnQgZmVhdHVyZSBiZWluZyBlZGl0ZWQgYnkgdGhlIFJURQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZNb2RhbE9iamVjdEZlYXR1cmU7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KE1ldGhvZEVsZW1lbnQgZSkgewotCQltZXRob2RFbGVtZW50ID0gZTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gTmFtZSBvZiBtZXRob2QgZWxlbWVudCArICIuIiArIG5hbWUgb2YgZmVhdHVyZSBiZWluZyBlZGl0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0TmFtZSgpOwotCQlpZiAoZk1vZGFsT2JqZWN0RmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgKz0gIi4iOwotCQkJcmVzdWx0ICs9IGZNb2RhbE9iamVjdEZlYXR1cmUuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TWV0aG9kRWxlbWVudCgpICYmCi0JCQlmTW9kYWxPYmplY3QgPT0gKChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIG9iaikuZ2V0TW9kYWxPYmplY3QoKSAmJgotCQkJZk1vZGFsT2JqZWN0RmVhdHVyZSA9PSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgb2JqKS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBtZXRob2RFbGVtZW50Lmhhc2hDb2RlKCk7Ci0JCWlmIChmTW9kYWxPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzdWx0IF49IGZNb2RhbE9iamVjdC5oYXNoQ29kZSgpOwotCQl9Ci0JCWlmIChmTW9kYWxPYmplY3RGZWF0dXJlICE9IG51bGwpIHsKLQkJCXJlc3VsdCBePSBmTW9kYWxPYmplY3RGZWF0dXJlLmhhc2hDb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIGZNb2RhbE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG9iamVjdCkgewotCQlmTW9kYWxPYmplY3QgPSBvYmplY3Q7Ci0JfQotCi0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRNb2RhbE9iamVjdEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmTW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlmTW9kYWxPYmplY3RGZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9NZXRob2RFbGVtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNWI4YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgZm9yIE1ldGhvZEVsZW1lbnRFZGl0b3IKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCS8vIGluc3BlY3QgaW5wdXQKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBnZXRNZXRob2RFbGVtZW50RnJvbUlucHV0KGlucHV0KTsKLQkJaWYgKGlucHV0RWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBubyBNZXRob2RFbGVtZW50IGluIGluY29taW5nIGlucHV0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0gICAgICAgIElFZGl0b3JJbnB1dCBleGlzdGluZ0VkaXRvcklucHV0OwotICAgICAgICBJRWRpdG9yUGFydCBlZGl0b3IgPSBlZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpKSB7Ci0gICAgICAgIAkvLyBleGlzdGluZyBlZGl0b3IgaXMgbm90IGEgTWV0aG9kRWxlbWVudEVkaXRvcgotICAgICAgICAJcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGV4aXN0aW5nRWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXRob2RFbGVtZW50IGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChleGlzdGluZ0VkaXRvcklucHV0KTsKLQkJaWYgKGV4aXN0aW5nRWRpdG9ySW5wdXRFbGVtZW50ID09IG51bGwpIHsKLQkJCS8vIG5vIE1ldGhvZEVsZW1lbnQgaW4gZXhpc3RpbmcgZWRpdG9yCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIGlmIChleGlzdGluZ0VkaXRvcklucHV0RWxlbWVudC5lcXVhbHMoaW5wdXRFbGVtZW50KSkgewotICAgICAgICAJLy8gZWRpdG9yIGlzIGVkaXRpbmcgdGhlIE1ldGhvZEVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGlucHV0Ci0gICAgICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJTWV0aG9kRWxlbWVudCBpbnB1dEVsZW1lbnQgPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCS8vIHByb2JhYmx5IG9wZW5lZCBmcm9tIFByb2JsZW1zIFZpZXcKLQkJCWlucHV0RWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KCgoRmlsZUVkaXRvcklucHV0KWlucHV0KS5nZXRGaWxlKCksCi0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuCi0JCQkJCWdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJfQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCWlucHV0RWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGlucHV0RWxlbWVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZExpYnJhcnlFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1ZDg0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kTGlicmFyeUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZUlPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogVGhlIG1ldGhvZCBsaWJyYXJ5IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUVkaXRvciBleHRlbmRzIE1ldGhvZEVsZW1lbnRFZGl0b3IgewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3Ijc2V0UGFydE5hbWUoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnROYW1lKCkgewotCQlTdHJpbmcgcGFydE5hbWUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3RpdGxlOyAKLQkJaWYgKGVsZW1lbnRPYmouZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXBhcnROYW1lICs9IGVsZW1lbnRPYmouZ2V0TmFtZSgpOwotCQkJOwotCQl9Ci0JCXNldFBhcnROYW1lKHBhcnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2FkZFBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCWFkZFBhZ2UobmV3IE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKHRoaXMpKTsKLQkJCWNyZWF0ZVByZXZpZXdQYWdlKCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIENsb3NlIGFsbCB0aGUgZWRpdG9ycy4KLQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCi0JCS8vIENsZWFyIHRoZSBMaWJyYXJ5IFZpZXcuCi0JCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5zZXRJbnB1dEZvclZpZXdlcihudWxsKTsKLQotCQl0cnkgewotCQkJLy8gQ2xvc2UgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3IKLQkJCQkJLmJlZ2luVGFzaygKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5NZXRob2RMaWJyYXJ5RWRpdG9yX3NhdmVtb2RlbGxpYnJhcnksIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IAotCi0JCQl0cnkgewotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlFZGl0b3JfZXJyX3NhdmU7IAotCQkJCVN0cmluZyBlcnJEZXRhaWxzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZXguZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCQkJZXJyRGV0YWlscyA9IGV4LmdldE1lc3NhZ2UoKTsgCi0JCQkJfQotCQkJCWlmIChleCBpbnN0YW5jZW9mIE11bHRpRmlsZUlPRXhjZXB0aW9uKSB7Ci0JCQkJCU9iamVjdCB0cm91YmxlT2JqID0gKChNdWx0aUZpbGVJT0V4Y2VwdGlvbikgZXgpCi0JCQkJCQkJLmdldFRyb3VibGVPYmplY3QoKTsKLQkJCQkJaWYgKHRyb3VibGVPYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQllcnJEZXRhaWxzID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl90cm91Ymxlb2JqZWN0ICsgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UGF0aCgoTWV0aG9kRWxlbWVudCkgdHJvdWJsZU9iaik7IAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9lcnJvcl9kaWFsb2dfdGl0bGU7IAotCQkJCVN0cmluZyBwcm9ibGVtID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeUVkaXRvcl9zYXZlX2xpYnJhcnlfcHJvYmxlbV9tc2c7IAotCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBwcm9ibGVtLCBlcnJNc2csIGVyckRldGFpbHMpOyAKLQkJCX0gZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJcmV0dXJuIG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSA6IGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg0MzMwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNEaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUmljaFRleHRDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udHJvbERlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIE1ldGhvZCBFZGl0b3IgUmljaCBUZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RSaWNoVGV4dCBleHRlbmRzIFJpY2hUZXh0IGltcGxlbWVudHMgSU1ldGhvZFJpY2hUZXh0IHsKLQotCS8vIFRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQkKLQkvLyB0aGUgTWV0aG9kRWxlbWVudCdzIENvbnRlbnREZXNjcmlwdGlvbgotCXByaXZhdGUgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbjsKLQotCS8vIFRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBFT2JqZWN0IG1vZGFsT2JqZWN0OwotCi0JLy8gVGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQotCS8vIFRoZSByZXNvdXJjZSBiZWluZyBlZGl0ZWQgICAgICAgCi0JcHJvdGVjdGVkIFJlc291cmNlIHJlc291cmNlOwotCQotCS8vIHRoZSBkZWNvcmF0ZWRGaWVsZCBsYWJlbAotCXByb3RlY3RlZCBMYWJlbCBsYWJlbDsKLQkKLQlwcm90ZWN0ZWQgQ29udHJvbERlY29yYXRpb24gY29udHJvbERlY29yYXRpb247Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEltYWdlIGVycm9yRmllbGREZWNvcmF0aW9uSW1hZ2UgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19FUlJPUikuZ2V0SW1hZ2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gRmllbGQgbmFtZSBiZWluZyBlZGl0ZWQKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZCB3aXRoIHRoZSB0cmFpbGluZyA6IHJlbW92ZWQgICAgIAotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lVHJpbTsKLQkKLQkvLyBtYXJrZXIgaGVscGVyCi0JcHJvdGVjdGVkIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIG1hcmtlckhlbHBlcjsKLQkKLS8vCS8vIG1hcmtlciBhdHRyaWJ1dGUKLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfRklFTEROQU1FID0gIk1ldGhvZEZpZWxkTmFtZSI7Ci0KLS8vCS8vIG1hcmtlciBJRAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHN0eWxlIGZvciB0aGUgZWRpdG9yLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMuCi0JICovCi0JcHVibGljIE1ldGhvZFJpY2hUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIGJhc2VQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwcmVzZW50YXRpb24gbmFtZXMgb2YgYWxsIGVsZW1lbnQgbGlua3MuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgdGlkeVRleHQoU3RyaW5nIHRleHQpIHsKLQkJLyoKLQkJICogIHRoaXMgd2lsbCBkbyB0aGUgZm9sbG93aW5nIHRvIHRoZSBIVE1MOgotCQkgKiAgMS4gIHVwZGF0ZSBFbGVtZW50IExpbmtzCi0JCSAqICAyLiAgY2hhbmdlIDxBIC4uPiB0byA8YSAuLj4KLQkJICogIDMuICBjaGFuZ2UgPC9BPiB0byA8L2E+Ci0JCSAqICA0LiAgYWRkIGRvdWJsZS1xdW90ZXMgKCIpIGFyb3VuZCBhbGwgYXR0cmlidXRlIHZhbHVlcyBpZiB0aGV5IGFyZSBtaXNzaW5nCi0JCSAqLwotCQkKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLnZhbGlkYXRlUmljaFRleHRDb250ZW50KG1ldGhvZEVsZW1lbnQsIHRleHQsCi0JCQkJbmV3IFJpY2hUZXh0Q29udGVudFZhbGlkYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KSB7Ci0JCXRoaXMubWV0aG9kRWxlbWVudCA9IG1ldGhvZEVsZW1lbnQ7Ci0JCWlmICh0aGlzLm1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpIHRoaXMubWV0aG9kRWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCWlmICh0aGlzLm1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsgCi0JCQl0aGlzLmNvbnRlbnREZXNjcmlwdGlvbiA9ICgoRGVzY3JpYmFibGVFbGVtZW50KXRoaXMubWV0aG9kRWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0TW9kYWxPYmplY3QoKSB7Ci0JCXJldHVybiBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3QoRU9iamVjdCBtb2RhbE9iamVjdCkgewotCQl0aGlzLm1vZGFsT2JqZWN0ID0gbW9kYWxPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldE1vZGFsT2JqZWN0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0RmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZSkgewotCQl0aGlzLm1vZGFsT2JqZWN0RmVhdHVyZSA9IG1vZGFsT2JqZWN0RmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKLQkJcmV0dXJuIGZpZWxkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWNvcmF0ZWRGaWVsZExhYmVsKExhYmVsIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCU9iamVjdCBkYXRhID0gbGFiZWwuZ2V0RGF0YShCYXNlRm9ybVBhZ2UuTEFCRUxfREVDT1JBVE9SX0tFWSk7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIENvbnRyb2xEZWNvcmF0aW9uKSB7Ci0JCQkJY29udHJvbERlY29yYXRpb24gPSAoQ29udHJvbERlY29yYXRpb24pZGF0YTsKLQkJCQljb250cm9sRGVjb3JhdGlvbi5zZXRJbWFnZShlcnJvckZpZWxkRGVjb3JhdGlvbkltYWdlKTsKLQkJCQljb250cm9sRGVjb3JhdGlvbi5oaWRlKCk7Ci0JCQl9Ci0JCQl1cGRhdGVGaWVsZE5hbWVGcm9tTGFiZWwobGFiZWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChMYWJlbCBsYWJlbCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGxhYmVsLmdldFRleHQoKTsKLQkJCWlmICghdGhpcy5maWVsZE5hbWUuZXF1YWxzKGZpZWxkTmFtZSkpIHsKLQkJCQl0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJCQlpbnQgY29sb25JbmRleCA9IGZpZWxkTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCQkJaWYgKGNvbG9uSW5kZXggPT0gLTEpCi0JCQkJCWNvbG9uSW5kZXggPSBmaWVsZE5hbWUubGVuZ3RoKCk7Ci0JCQkJdGhpcy5maWVsZE5hbWVUcmltID0gZmllbGROYW1lLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KS50cmltKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGFiZWwgbGFiZWwpIHsKLQkJc2V0TWV0aG9kRWxlbWVudChlbGVtZW50KTsKLQkJc2V0RGVjb3JhdGVkRmllbGRMYWJlbChsYWJlbCk7Ci0JCW1hcmtlckhlbHBlciA9IE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyLklOU1RBTkNFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGZvcm1hdHRlZFRleHQ7Ci0JCXRyeSB7Ci0JCQkvLyBjbGVhciBtYXJrZXJzIGZpcnN0Ci0JCQljbGVhck1hcmtlcnMoKTsKLQkJCS8vIENhbGwgSlRpZHkgdG8gZm9ybWF0IHRoZSBzb3VyY2UgdG8gWEhUTUwuCi0JCQlmb3JtYXR0ZWRUZXh0ID0gaHRtbEZvcm1hdHRlci5mb3JtYXRIVE1MKHRleHQpOwotCQkJaWYgKGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCkgIT0gbnVsbCkgewotCQkJCVN0cmluZyBlcnJvclN0cmluZyA9IGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCk7Ci0JCQkJLy8gY3JlYXRlIG1hcmtlcnMKLQkJCQl0cnkgewotCQkJCQljcmVhdGVNYXJrZXIoZXJyb3JTdHJpbmcpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2V4KSB7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihjZXgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmb3JtYXR0ZWRUZXh0OwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJNYXJrZXJzKCkgewotCQltYXJrZXJIZWxwZXIuZGVsZXRlTWFya2Vycyhjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0pOwotCQlzZXRFcnJvckRlc2NyaXB0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCQloaWRlRXJyb3JEZWNvcmF0aW9uKCk7Ci0JCXJlZnJlc2hEZWNvcmF0b3JzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yRGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLQkJaWYgKGNvbnRyb2xEZWNvcmF0aW9uICE9IG51bGwpIHsKLQkJCWNvbnRyb2xEZWNvcmF0aW9uLnNldERlc2NyaXB0aW9uVGV4dCh0ZXh0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRGVjb3JhdG9ycygpIHsKLQkJLy8gcmVmcmVzaAotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLnVwZGF0ZShNZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5ERUNPUkFUT1JfSUQpOwotCX0KLQkKLQkKLQkvKgotCSAqIFRPRE86Ci0JICogaGFkIHRvIHVuZG8gY2hhbmdlIGluIERlc2NyaWJhYmxlRWxlbWVudEltcGwgdG8gc2V0IHByZXNlbnRhdGlvbiBvbiBhbnkgbmV3IG9iagotCSAqIHNvIGVkaXRvciB3aWxsIG5lZWQgdG8gYXNzaWduIHByZXNlbnRhdGlvbiB3aGVuIGZpZWxkIGlzIGVkaXRlZCBzbyB0aGF0IHRoZSBtYXJrZXIKLQkgKiBjYW4gYmUgYWRkZWQgdG8gdGhlIHByZXNlbnRhdGlvbidzIHJlc291cmNlCi0JICovCi0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTWFya2VyKFN0cmluZyBmdWxsRXJyTXNnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24uZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlNYXRjaGVyIG0gPSBIVE1MRm9ybWF0dGVyLmpUaWR5RXJyb3JQYXJzZXIubWF0Y2hlcihmdWxsRXJyTXNnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJaWYgKG0uZmluZCgpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyBlcnJvck1zZyA9IG0uZ3JvdXAoNCk7Ci0JCQkJQmFzaWNEaWFnbm9zdGljIGRpYWdub3N0aWNzID0gCi0JCQkgICAgICAgICAgbmV3IEJhc2ljRGlhZ25vc3RpYwotCQkJICAgICAgICAgICAgKEhUTUxGb3JtYXR0ZXIuRElBR05PU1RJQ19TT1VSQ0UsCi0JCQkgICAgICAgICAgICAgMCwgIiIsIC8vJE5PTi1OTFMtMSQKLQkJCSAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBjb250ZW50RGVzY3JpcHRpb24sIGZpZWxkTmFtZVRyaW0gfSk7Ci0JCi0JCQkJZGlhZ25vc3RpY3MuYWRkKCAKLQkJCQkJbmV3IEJhc2ljRGlhZ25vc3RpYyhEaWFnbm9zdGljLkVSUk9SLAotCQkJCQkJbG9jYXRpb24sIDAsIGVycm9yTXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgY29udGVudERlc2NyaXB0aW9uLCBmaWVsZE5hbWVUcmltIH0pKTsKLQkKLQkJICAgICAgICBtYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VycyhkaWFnbm9zdGljcyk7Ci0JCSAgICAgICAgc2V0RXJyb3JEZXNjcmlwdGlvbihlcnJvck1zZyk7Ci0JCSAgICAgICAgc2hvd0Vycm9yRGVjb3JhdGlvbigpOwotCQkJCXJlZnJlc2hEZWNvcmF0b3JzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWNsZWFyTWFya2VycygpOwotCQlyZWZyZXNoRGVjb3JhdG9ycygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzaG93RXJyb3JEZWNvcmF0aW9uKCkgewotICAgICAgICBpZiAoY29udHJvbERlY29yYXRpb24gIT0gbnVsbCkgewotICAgICAgICAJY29udHJvbERlY29yYXRpb24uc2hvdygpOwotICAgICAgICB9Ci0JfQotCi0JcHVibGljIHZvaWQgaGlkZUVycm9yRGVjb3JhdGlvbigpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xEZWNvcmF0aW9uICE9IG51bGwpIHsKLSAgICAgICAgCWNvbnRyb2xEZWNvcmF0aW9uLmhpZGUoKTsKLSAgICAgICAgfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCS8vIGNoZWNrIGlmIGxhYmVsIHRleHQgd2FzIGNoYW5nZWQgKHRoaXMgaGFwcGVucyB3aGVuIFJURSBpcyBleHBhbmRlZCkKLQkJLy8gdGhpcyBpcyBjYWxsZWQgd2hlbiBSVEUgaXMgdG9nZ2xlZCBpbiBlZGl0b3IgLSByZWFkIG5ldyBmaWVsZE5hbWUKLQkJaWYgKHVwZGF0ZUZpZWxkTmFtZUZyb21MYWJlbChsYWJlbCkpCi0JCQloaWRlRXJyb3JEZWNvcmF0aW9uKCk7Ci0JCXN1cGVyLnNldFRleHQodGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL01ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmNTc5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvTWV0aG9kUmljaFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RBZGRJbWFnZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHRUb29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRPcmRlcmVkTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRUYWJsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRVbm9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJvbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ2xlYXJDb250ZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnROYW1lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnRTaXplQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZvbnRTdHlsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JbmRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSXRhbGljQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLk91dGRlbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3Vic2NyaXB0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlN1cGVyc2NyaXB0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlRpZHlBY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5VbmRlcmxpbmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLQotLyoqCi0gKiBBIFJpY2ggVGV4dCBlZGl0b3Igd2l0aCBhZGRlZCBleHRlbnNpb25zIHRvIHN1cHBvcnQgTWV0aG9kIGJyb3dzaW5nIGFuZAotICogYXV0aG9yaW5nLiBJbmNsdWRlcyBhIHRvb2wgYmFyIGFuZCBhbiBpbnRlZ3JhdGVkIEhUTUwgc291cmNlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFJpY2hUZXh0RWRpdG9yIGV4dGVuZHMgUmljaFRleHRFZGl0b3IgaW1wbGVtZW50cwotCQlJTWV0aG9kUmljaFRleHRFZGl0b3IgewotCi0JLy8gVGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JLy8gVGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQlwcml2YXRlIEVPYmplY3QgbW9kYWxPYmplY3Q7Ci0KLQkvLyBUaGUgbW9kYWwgb2JqZWN0IGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIGVkaXRvci4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGhyZWZzLgotCSAqLwotCXB1YmxpYyBNZXRob2RSaWNoVGV4dEVkaXRvcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIFN0cmluZyBiYXNlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgTGFiZWwgbGFiZWwsIElFZGl0b3JTaXRlIGVkaXRvclNpdGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSwgZWRpdG9yU2l0ZSwgYmFzZVBhdGgpOwotCQl0aGlzLm1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50OwotCQlpbml0KG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wuCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICBUaGUgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MuCi0JICovCi0JcHJvdGVjdGVkIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kUmljaFRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBSaWNoIFRleHQgZWRpdG9yIHRvb2wgYmFyIHdpdGggYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBUaGUgUmljaCB0ZXh0IGVkaXRvciB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpIHsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEZvbnRTdHlsZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGb250TmFtZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBGb250U2l6ZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7CQkKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEN1dEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBDb3B5QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFBhc3RlQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IENsZWFyQ29udGVudEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBCb2xkQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEl0YWxpY0FjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBVbmRlcmxpbmVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgU3Vic2NyaXB0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFN1cGVyc2NyaXB0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFRpZHlBY3Rpb25Hcm91cCh0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRPcmRlcmVkTGlzdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRVbm9yZGVyZWRMaXN0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE91dGRlbnRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSW5kZW50QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEZpbmRSZXBsYWNlQWN0aW9uKHRoaXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmV4ZWN1dGUocmljaFRleHQpOwotCQkJfQotCQl9KTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IE1ldGhvZEFkZExpbmtBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgTWV0aG9kQWRkSW1hZ2VBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkVGFibGVBY3Rpb24odGhpcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RhbE9iamVjdCgpIHsKLQkJcmV0dXJuIG1vZGFsT2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdChFT2JqZWN0IG1vZGFsT2JqZWN0KSB7Ci0JCXRoaXMubW9kYWxPYmplY3QgPSBtb2RhbE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCkgewotCQlyZXR1cm4gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGFsT2JqZWN0RmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgbW9kYWxPYmplY3RGZWF0dXJlKSB7Ci0JCXRoaXMubW9kYWxPYmplY3RGZWF0dXJlID0gbW9kYWxPYmplY3RGZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMYWJlbCBsYWJlbCkgewotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBJTWV0aG9kUmljaFRleHQpCi0JCQkoKElNZXRob2RSaWNoVGV4dClyaWNoVGV4dCkuaW5pdChtZXRob2RFbGVtZW50LCBsYWJlbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1ByZXZpZXdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVlZjU3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJldmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5FbGVtZW50SFRNTFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBQcmV2aWV3IHBhZ2UgaW4gdGhlIE1ldGhvZCBFZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXZpZXdQYWdlIHsKLQotCXByaXZhdGUgRWxlbWVudEhUTUxWaWV3ZXIgcHJldmlld2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgUHJldmlld1BhZ2UoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBVc2UgdGhlIFZpZXdGb3JtIGNvbnRyb2wgdG8gZ2l2ZSBpdCB0aGUgRWNsaXBzZSBXb3JrYmVuY2ggd2luZG93Ci0JCS8vIGxvb2sgJiBmZWVsLgotCQlWaWV3Rm9ybSB2aWV3Rm9ybSA9IG5ldyBWaWV3Rm9ybShjb21wb3NpdGUsIFNXVC5ERUZBVUxUKTsKLQkJdmlld0Zvcm0ubWFyZ2luSGVpZ2h0ID0gMDsKLQkJdmlld0Zvcm0ubWFyZ2luV2lkdGggPSAwOwotCQl2aWV3Rm9ybS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXZpZXdGb3JtLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIFNldCB0b29sYmFyCi0JCUNvbnRyb2wgdG9vbGJhciA9IGNyZWF0ZVRvb2xiYXIodmlld0Zvcm0pOwotCQl2aWV3Rm9ybS5zZXRUb3BSaWdodCh0b29sYmFyKTsKLQotCQkvLyBTZXQgY29udGVudAotCQlDb250cm9sIGNvbnRlbnQgPSBjcmVhdGVDb250ZW50KHZpZXdGb3JtKTsKLQkJdmlld0Zvcm0uc2V0Q29udGVudChjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgcHJldmlldyBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQ29udGVudChWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29udGVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmV2aWV3ZXIgPSBuZXcgRWxlbWVudEhUTUxWaWV3ZXIoY29udGVudCk7Ci0JCXJldHVybiAoQ29udHJvbCkgY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gRWxlbWVudFZpZXdlcgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3ZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEhUTUxWaWV3ZXIgZ2V0UHJldmlld1ZpZXdlcigpIHsKLQkJcmV0dXJuIHByZXZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgVG9vbGJhciBJdCBoYXMgR28gYmFjaywgR28gZm9yd2FyZCwgU3RvcCBhbmQgcmVmcmVzaCBidXR0b25zCi0JICogCi0JICogQHBhcmFtIFZpZXdGb3JtCi0JICogICAgICAgICAgICBwYXJlbnQKLQkgKiBAcmV0dXJuIFRvb2xiYXIKLQkgKi8KLQlwcml2YXRlIFRvb2xCYXIgY3JlYXRlVG9vbGJhcihWaWV3Rm9ybSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBicm93c2VyIG5hdmlnYXRpb24gdG9vbGJhci4KLQkJVG9vbEJhciB0b29sYmFyID0gbmV3IFRvb2xCYXIocGFyZW50LCBTV1QuRkxBVCk7Ci0KLQkJLy8gQWRkIHRoZSBCYWNrIGJ1dHRvbi4KLQkJVG9vbEl0ZW0gYmFja0J1dHRvbiA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuTk9ORSk7Ci0JCWJhY2tCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0JBQ0spOwotCQliYWNrQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJhY2tCdXR0b25fdGV4dCk7IAotCQliYWNrQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBwcmV2aWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5iYWNrKCk7Ci0JCQkJfQotCQkJfTsKLQkJfSk7Ci0KLQkJLy8gQWRkIHRoZSBGb3dhcmQgYnV0dG9uLgotCQlUb29sSXRlbSBmb3J3YXJkQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJZm9yd2FyZEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRk9SV0FSRCk7Ci0JCWZvcndhcmRCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9yd2FyZEJ1dHRvbl90ZXh0KTsgCi0JCWZvcndhcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmZvcndhcmQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFN0b3AgYnV0dG9uLgotCQlUb29sSXRlbSBzdG9wQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJc3RvcEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfU1RPUCk7Ci0JCXN0b3BCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcEJ1dHRvbl90ZXh0KTsgCi0JCXN0b3BCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLnN0b3AoKTsKLQkJCQl9Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFJlZnJlc2ggYnV0dG9uLgotCQlUb29sSXRlbSByZWZyZXNoQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xiYXIsIFNXVC5OT05FKTsKLQkJcmVmcmVzaEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfUkVGUkVTSCk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVmcmVzaEJ1dHRvbl90ZXh0KTsgCi0JCXJlZnJlc2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vIEJyb3dzZXIgYnJvd3NlciA9IHByZXZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJLy8gaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCS8vIGJyb3dzZXIucmVmcmVzaCgpOwotCQkJCS8vIH0KLQotCQkJCXByZXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9OwotCQl9KTsKLQotCQkvLyBBZGQgdGhlIFByaW50IGJ1dHRvbi4KLQkJVG9vbEl0ZW0gcHJpbnRCdXR0b24gPSBuZXcgVG9vbEl0ZW0odG9vbGJhciwgU1dULk5PTkUpOwotCQlwcmludEJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfUFJJTlQpOwotCQlwcmludEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5wcmludEJ1dHRvbl90ZXh0KTsgCi0JCXByaW50QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlwcmV2aWV3ZXIucHJpbnQoKTsKLQkJCX07Ci0JCX0pOwotCi0JCXJldHVybiB0b29sYmFyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGMyZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5TZXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuTG9jYWxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JV29ya2JlbmNoUGFydEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZhbGlkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLkVkaXRpbmdEb21haW5UYWJsZVRyZWVWaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FUEZQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5JTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUVkaXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Db21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uTGlicmFyeUVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBFZGl0b3IgZm9yIHByb2Nlc3MgYXV0aG9yaW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9yIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElNZW51TGlzdGVuZXIsIElTZWxlY3Rpb25Qcm92aWRlciwKLQkJSVZpZXdlclByb3ZpZGVyLCBJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB7Ci0KLQkvKioKLQkgKiBUaGUgZWRpdG9yIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9IFByb2Nlc3NFZGl0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0ZMT1dfRURJVE9SX0lEID0gR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9FRElUT1JfSUQgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUERFUEVOREVOQ1lfRURJVE9SX0lEID0gR3JhcGhpY2FsV1BEZXBlbmRlbmN5RWRpdG9yLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqIENvbHVtbiBkZXNjcmlwdG9yIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIFByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSksCi0JCQkzLCAyMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCksCi0JCQkwLCA0MCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRUZJWCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCksIDAsIDgwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX01PREVMX0lORk8gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyksIDAsIDEyMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVFlQRSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUpLAotCQkJMCwgODAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19QUkVERUNFU1NPUlMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpLCAyLCAxMDAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX0lTX1JFUEVBVEFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSksIDEsIDYwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU4pOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PTkdPSU5HID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19FVkVOVF9EUklWRU4gPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfVEVBTSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUywgUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9URUFNUyksCi0JCQkxLCAxMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19FTlRSWV9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfRVhJVF9TVEFURSA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCk7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSksIDMsIDIwMCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfREVMSVZFUkFCTEUgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUsCi0JCQlQcm9jZXNzVXRpbC5nZXRDb2x1bW5EaXNwbGF5TmFtZShJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFKSwgMSwgMTAwLCB0cnVlLAotCQkJQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19JU19PUFRJT05BTCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCwKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwpLCAxLCA2MCwgdHJ1ZSwKLQkJCUNvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DSEVDS19CT09MRUFOKTsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSVNfUExBTk5FRCA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yKAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELAotCQkJUHJvY2Vzc1V0aWwuZ2V0Q29sdW1uRGlzcGxheU5hbWUoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEKSwgMSwgNjAsIHRydWUsCi0JCQlDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCVByb2Nlc3NVdGlsLmdldENvbHVtbkRpc3BsYXlOYW1lKElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSwgMSwgNjAsCi0JCQl0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX0ZPUk1fSUQgPSAid2JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFfRk9STV9JRCA9ICJ0YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUEJTX0ZPUk1fSUQgPSAid3BicyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNPTElEQVRFRF9GT1JNX0lEID0gImNvbnNvbGlkYXRlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlEaWFncmFtRWRpdG9ySGVscGVyIGRpYWdyYW1FZGl0b3JIZWxwZXIgPSBudWxsOwotCi0JLy8gY2hhbmdlIHRoZSBkZWZhdWx0IG9yZGVyIGJhc2VkIG9uIDE1Mjg2NyAtIFB1Ymxpc2ggb3B0aW9uIGFuZCBwcmVmcmVuY2VzCi0JLyogV0JTOiBQcmVzZW50YXRpb24gTmFtZSwgSW5kZXgsIFByZWRlY2Vzc29ycywgTW9kZWwgSW5mbywgVHlwZSwgUGxhbm5lZCwKLQkJCVJlcGVhdGFibGUsIE11bHRpcGxlIE9jY3VycmVuY2VzLCBPbmdvaW5nLCBFdmVudC1kcml2ZW4sIE9wdGlvbmFsCi0JCVRBOiBQcmVzZW50YXRpb24gTmFtZSwgTW9kZWwgSW5mbywgVGVhbSwgVHlwZSwgUGxhbm5lZCwgTXVsdGlwbGUKLQkJCU9jY3VycmVuY2VzLCBPcHRpb25hbAotCQlXb3JrIFByb2R1Y3QgVXNhZ2U6IFByZXNlbnRhdGlvbiBOYW1lLCBNb2RlbCBJbmZvLCBFbnRyeSBTdGF0ZSwgRXhpdCBTdGF0ZSwgCi0JCQlEZWxpdmVyYWJsZSwgVHlwZSwgUGxhbm5lZCwgTXVsdGlwbGUgT2NjdXJyZW5jZXMsIE9wdGlvbmFsCi0JKi8KLQkvLyBKaW5odWEgWGksIDA4LzIxLzIwMDYKLQkKLQkvLyB0aGUgZGVmYXVsdCBsaXN0IG11c3QgYmUgYXZhaWxhYmxlIGluIHRoZSBsaWJyYXJ5IHBsdWdpbiBhcyB3ZWxsLgotCS8vIGR1cGxpY2F0ZSBkZWZpbml0aW9uIGZvciBub3csIHdpbGwgbmVlZCB0byBtZXJnZSB0b2dldGhlciBsYXRlcgotCS8vIHNlZSBQcmVmZXJlbmNlQ29uc3RhbnRzLm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtbkRlc2NyaXB0b3I+IERFRkFVTFRfVEJTX0NPTFVNTlMgPSBBcnJheXMKLQkJCS5hc0xpc3QobmV3IENvbHVtbkRlc2NyaXB0b3JbXSB7Ci0JCQkJCUNPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQkvLyBDT0xfREVTQ19JRCwKLQkJCQkJLy9DT0xfREVTQ19QUkVGSVgsIAotCQkJCQlDT0xfREVTQ19NT0RFTF9JTkZPLCBDT0xfREVTQ19URUFNLCBDT0xfREVTQ19UWVBFLAotCQkJCQlDT0xfREVTQ19JU19QTEFOTkVELAotCQkJCQlDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIENPTF9ERVNDX0lTX09QVElPTkFMIH0pOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IERFRkFVTFRfV1BCU19DT0xVTU5TID0gQXJyYXlzCi0JCQkuYXNMaXN0KG5ldyBDb2x1bW5EZXNjcmlwdG9yW10gewotCQkJCQlDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJLy8gQ09MX0RFU0NfSUQsCi0JCQkJCS8vQ09MX0RFU0NfUFJFRklYLCAKLQkJCQkJQ09MX0RFU0NfTU9ERUxfSU5GTywgQ09MX0RFU0NfRU5UUllfU1RBVEUsCi0JCQkJCUNPTF9ERVNDX0VYSVRfU1RBVEUsIAotCQkJCQlDT0xfREVTQ19ERUxJVkVSQUJMRSwgQ09MX0RFU0NfVFlQRSwgCi0JCQkJCUNPTF9ERVNDX0lTX1BMQU5ORUQsIENPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywgQ09MX0RFU0NfSVNfT1BUSU9OQUwgfSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uRGVzY3JpcHRvcj4gREVGQVVMVF9XQlNfQ09MVU1OUyA9IEFycmF5cwotCQkJLmFzTGlzdChuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsgQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQkJCUNPTF9ERVNDX0lELCAKLQkJCQkJLy9DT0xfREVTQ19QUkVGSVgsIAotCQkJCQlDT0xfREVTQ19QUkVERUNFU1NPUlMsIENPTF9ERVNDX01PREVMX0lORk8sCi0JCQkJCUNPTF9ERVNDX1RZUEUsIENPTF9ERVNDX0lTX1BMQU5ORUQsIAotCQkJCQlDT0xfREVTQ19JU19SRVBFQVRBQkxFLCBDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIENPTF9ERVNDX0lTX09OR09JTkcsCi0JCQkJCUNPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTiwgQ09MX0RFU0NfSVNfT1BUSU9OQUwKLQkJCQkJIH0pOwotCi0JIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDb2x1bW5EZXNjcmlwdG9yPiBBTExfV0JTX0NPTFVNTlMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbkRlc2NyaXB0b3I+KAotCQkJREVGQVVMVF9XQlNfQ09MVU1OUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uRGVzY3JpcHRvcj4gQUxMX1RCU19DT0xVTU5TID0gbmV3IEFycmF5TGlzdDxDb2x1bW5EZXNjcmlwdG9yPigKLQkJCURFRkFVTFRfVEJTX0NPTFVNTlMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENvbHVtbkRlc2NyaXB0b3I+IEFMTF9XUEJTX0NPTFVNTlMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbkRlc2NyaXB0b3I+KAotCQkJREVGQVVMVF9XUEJTX0NPTFVNTlMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDb2x1bW5EZXNjcmlwdG9yPiBpZFRvQ29sdW1uRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ29sdW1uRGVzY3JpcHRvcj4oKTsKLQlzdGF0aWMgewotCQlBTExfV0JTX0NPTFVNTlMuYWRkKENPTF9ERVNDX1BSRUZJWCk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJQUxMX1dQQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfUFJFRklYKTsKLQkJCi0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX05BTUUuaWQsCi0JCQkJQ09MX0RFU0NfTkFNRSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lELmlkLCBDT0xfREVTQ19JRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1BSRUZJWC5pZCwKLQkJCQlDT0xfREVTQ19QUkVGSVgpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19NT0RFTF9JTkZPLmlkLAotCQkJCUNPTF9ERVNDX01PREVMX0lORk8pOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19UWVBFLmlkLAotCQkJCUNPTF9ERVNDX1RZUEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19QUkVERUNFU1NPUlMuaWQsCi0JCQkJQ09MX0RFU0NfUFJFREVDRVNTT1JTKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfUkVQRUFUQUJMRS5pZCwKLQkJCQlDT0xfREVTQ19JU19SRVBFQVRBQkxFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfT05HT0lORy5pZCwKLQkJCQlDT0xfREVTQ19JU19PTkdPSU5HKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfSVNfRVZFTlRfRFJJVkVOLmlkLAotCQkJCUNPTF9ERVNDX0lTX0VWRU5UX0RSSVZFTik7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX1RFQU0uaWQsCi0JCQkJQ09MX0RFU0NfVEVBTSk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0VOVFJZX1NUQVRFLmlkLAotCQkJCUNPTF9ERVNDX0VOVFJZX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfRVhJVF9TVEFURS5pZCwKLQkJCQlDT0xfREVTQ19FWElUX1NUQVRFKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoCi0JCQkJQ09MX0RFU0NfUFJFU0VOVEFUSU9OX05BTUUuaWQsIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJUHJvY2Vzc0VkaXRvci5pZFRvQ29sdW1uRGVzY3JpcHRvck1hcC5wdXQoQ09MX0RFU0NfREVMSVZFUkFCTEUuaWQsCi0JCQkJQ09MX0RFU0NfREVMSVZFUkFCTEUpOwotCQlQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwLnB1dChDT0xfREVTQ19JU19PUFRJT05BTC5pZCwKLQkJCQlDT0xfREVTQ19JU19PUFRJT05BTCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KENPTF9ERVNDX0lTX1BMQU5ORUQuaWQsCi0JCQkJQ09MX0RFU0NfSVNfUExBTk5FRCk7Ci0JCVByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAucHV0KAotCQkJCUNPTF9ERVNDX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUy5pZCwKLQkJCQlDT0xfREVTQ19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCi0JCUFMTF9XQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9UQlNfQ09MVU1OUy5hZGQoQ09MX0RFU0NfTkFNRSk7Ci0JCUFMTF9XUEJTX0NPTFVNTlMuYWRkKENPTF9ERVNDX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhZGRBZGFwdGVyRmFjdG9yeUxpc3RlbmVycyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzRWRpdG9yRHJvcEFkYXB0ZXIgZXh0ZW5kcwotCQkJRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGRvbWFpbgotCQkgKiBAcGFyYW0gdmlld2VyCi0JCSAqLwotCQlwdWJsaWMgUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKEVkaXRpbmdEb21haW4gZG9tYWluLCBWaWV3ZXIgdmlld2VyKSB7Ci0JCQlzdXBlcihkb21haW4sIHZpZXdlcik7Ci0JCX0KLQotCQkvKiogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyI2dldERyb3BUYXJnZXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0KQotCQkgKi8KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXREcm9wVGFyZ2V0KFdpZGdldCBpdGVtKSB7Ci0JCQlPYmplY3QgdGFyZ2V0ID0gc3VwZXIuZ2V0RHJvcFRhcmdldChpdGVtKTsKLQkJCWlmICh0YXJnZXQgPT0gbnVsbCAmJiBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCXRhcmdldCA9IHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGFyZ2V0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kbmQuRWRpdGluZ0RvbWFpblRhYmxlVHJlZVZpZXdlckRyb3BBZGFwdGVyI2Ryb3Aob3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkcm9wKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJaWYgKGN1cnJlbnRWaWV3ZXIgaW5zdGFuY2VvZiBJQWN0aW9uVHlwZVByb3ZpZGVyKSB7Ci0JCQkJKChJQWN0aW9uVHlwZVByb3ZpZGVyKSBjdXJyZW50Vmlld2VyKS5zZXRJbnB1dERhdGEobmV3IFBvaW50KAotCQkJCQkJZXZlbnQueCwgZXZlbnQueSkpOwotCQkJfQotCQkJc3VwZXIuZHJvcChldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbjsKLQotCXByb3RlY3RlZCBWaWV3ZXIgY3VycmVudFZpZXdlcjsKLQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbiB2aWV3U2VsZWN0aW9uOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnQgc2VsZWN0ZWRQcm9jZXNzQ29tcG9uZW50OwotCi0JcHJvdGVjdGVkIFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXIgcHJvY2Vzc0NvbXBvbmVudExpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCQlTdHJpbmcgbmFtZSA9IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpOwotCQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJCW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXNldFBhcnROYW1lKG5hbWUpOwotCi0JCQkJaWYgKHBhZ2VzICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGFnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGFnZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzRGVzY3JpcHRpb24pIHsKLQkJCQkJCQkoKFByb2Nlc3NEZXNjcmlwdGlvbikgcGFnZSkKLQkJCQkJCQkJCS5yZWZyZXNoRWxlbWVudE5hbWUobmFtZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBwcm9wQ29udGVudFByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZzsKLQotCXByb3RlY3RlZCBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYnJhcnlMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJc3dpdGNoIChvcHRpb24pIHsKLQkJCS8vIGNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVEOgotCQkJLy8gLy8gY2xvc2UgYWxsIG9wZW4gZGlhZ3JhbSBlZGl0b3JzCi0JCQkvLyAvLwotCQkJLy8gSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPQotCQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBlZGl0b3JSZWZzW2ldLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkvLyBpZihlZGl0b3JQYXJ0IGluc3RhbmNlb2YgR3JhcGhpY2FsV29ya2Zsb3dFZGl0b3IKLQkJCS8vIHx8IGVkaXRvclBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRm9ybUVkaXRvcikgewotCQkJLy8gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcihlZGl0b3JQYXJ0LCB0cnVlKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VFZGl0b3IoUHJvY2Vzc0Zvcm1FZGl0b3IudGhpcywgdHJ1ZSk7Ci0JCQljYXNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQ6IHsKLQkJCQlpZiAoY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24uY29udGFpbnMoY3VycmVudENvbmZpZykpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UKLQkJCQkJCQkJLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY3VycmVudENvbmZpZyk7Ci0JCQkJCQlyZWZyZXNoQWxsKCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFCi0JCQkJCQkJCS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkJLy8gaGFuZGxlZCBieSBsaWJTdmNMaXN0ZW5lcgotCQkJCS8vIGNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ09ORklHVVJBVElPTl9TRUxFQ1RFRDogewotCQkJCS8vIGNvbmZpZ0NoYW5nZWQoKTsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0KLQkJCX0KLQotCQl9Ci0KLQl9OwotCi0JcHJvdGVjdGVkIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbmZpZ0NoYW5nZWQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQl9OwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBXQlNUYWI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIE9CU1RhYjsKLQotCXByb3RlY3RlZCBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgUEJTVGFiOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwcm9jVGFiOwotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlPiBleHRlbnNpb25UYWJzID0gbnVsbDsKLQotCXByb3RlY3RlZCBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VbXSBic1BhZ2VzOwotCi0JcHJvdGVjdGVkIEVQRlByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHVibGljIENvbGxlY3Rpb24gcmVzb3VyY2VzVG9TYXZlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGZpcnN0RXhwYW5kZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGEgbGlzdGVuZXIgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHBhcnQgYWN0aXZhdGlvbiBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydEFjdGl2YXRpb25MaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7Ci0JCQkJcmVtb3ZlUHJvcGVydGllc0Ryb3BEb3duTWVudShwYXJ0KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJLy8gaWYoIWZpcnN0RXhwYW5kZWQpIHsKLQkJCS8vIHN5bmNocm9uaXplZChQcm9jZXNzRm9ybUVkaXRvci50aGlzKSB7Ci0JCQkvLyBpZihmaXJzdEV4cGFuZGVkKSB7Ci0JCQkvLyAoKEFic3RyYWN0VHJlZVZpZXdlcikgV0JTVGFiLmdldFZpZXdlcigpKS5leHBhbmRBbGwoKTsKLQkJCS8vICgoQWJzdHJhY3RUcmVlVmlld2VyKSBPQlNUYWIuZ2V0Vmlld2VyKCkpLmV4cGFuZEFsbCgpOwotCQkJLy8gKChBYnN0cmFjdFRyZWVWaWV3ZXIpIFBCU1RhYi5nZXRWaWV3ZXIoKSkuZXhwYW5kQWxsKCk7Ci0JCQkvLyBmaXJzdEV4cGFuZGVkID0gdHJ1ZTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7Ci0JCQkJcHJvcGVydHlTaGVldFBhZ2UgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9wZXJ0eVNoZWV0KSB7Ci0JCQkJcmVtb3ZlUHJvcGVydGllc0Ryb3BEb3duTWVudShwYXJ0KTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIHByZWZTdG9yZUxpc3RlbmVyOwotCi0JLy8gcHJpdmF0ZSBQcm9jZXNzQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByb3RlY3RlZCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbjsKLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNocm9uaXppbmdTZWxlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnB1dENoYW5nZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgPSBuZXcgSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIoKSB7Ci0KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQkJcmV0dXJuIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJCXJldHVybiBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JfTsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNpc1ZhbGlkYXRlUmVzb3VyY2VzQmVmb3JlU2F2ZVJlcXVpcmVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkYXRlUmVzb3VyY2VzQmVmb3JlU2F2ZVJlcXVpcmVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjY3JlYXRlVmFsaWRhdGVSZXNvdXJjZUFjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIExpYnJhcnlWYWxpZGF0ZUFjdGlvbiBjcmVhdGVWYWxpZGF0ZVJlc291cmNlQWN0aW9uKCkgewotCQlMaWJyYXJ5VmFsaWRhdGVBY3Rpb24gdmFsaWRhdGVBY3Rpb24gPSBzdXBlci5jcmVhdGVWYWxpZGF0ZVJlc291cmNlQWN0aW9uKCk7Ci0JCXZhbGlkYXRlQWN0aW9uLnB1dENvbnRleHREYXRhKExpYnJhcnlFVmFsaWRhdG9yLkNUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIsCi0JCQkJYWRhcHRlckZhY3RvcnlQcm92aWRlcik7Ci0JCXJldHVybiB2YWxpZGF0ZUFjdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5wdXRDaGFuZ2VkKE9iamVjdCBuZXdJbnB1dCkgewotCQlpbnB1dENoYW5nZWQgPSBmYWxzZTsKLQkJaWYgKCEobmV3SW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpKQotCQkJcmV0dXJuOwotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgbmV3SW5wdXQ7Ci0KLQkJT2JqZWN0IG9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJc2VsZWN0ZWRQcm9jZXNzID0gZ2V0VG9wQnJlYWtkb3duRWxlbWVudChzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQpOwotCQkJc3VwcHJlc3Npb24gPSBnZXRTdXBwcmVzc2lvbihzZWxlY3RlZFByb2Nlc3MpOwotCi0JCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZihwYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQkvLyAoKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSlwYWdlKS5zZXRQcm9jZXNzKHByb2MpOwotCQkJLy8gfQotCQkJLy8gfQotCi0JCQlpZiAoV0JTVGFiICE9IG51bGwpIHsKLQkJCQlXQlNUYWIuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJfQotCQkJCi0JCQlpZiAoIE9CU1RhYiAhPSBudWxsICkgewotCQkJCU9CU1RhYi5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQl9Ci0JCQkKLQkJCWlmICggUEJTVGFiICE9IG51bGwgKSB7Ci0JCQkJUEJTVGFiLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBwcm9jVGFiICE9IG51bGwgKSB7Ci0JCQkJcHJvY1RhYi5zZXRQcm9jZXNzKHNlbGVjdGVkUHJvY2Vzcyk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQlmb3IgKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRQYWdlIDogZXh0ZW5zaW9uVGFicykgewotCQkJCQlleHRQYWdlLnNldFByb2Nlc3Moc2VsZWN0ZWRQcm9jZXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3MgIGdldFRvcEJyZWFrZG93bkVsZW1lbnQoUHJvY2Vzc0NvbXBvbmVudCBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQpIHsKLQkJcmV0dXJuIChQcm9jZXNzKSBQcm9jZXNzVXRpbC5nZXRUb3BCcmVha2Rvd25FbGVtZW50KHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCk7Ci0JfQotCQotCSAgIC8qKgotICAgICAqIEBwYXJhbSBzZWxlY3RlZFByb2Nlc3MKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzKSB7Ci0gICAgICAgIHJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihzZWxlY3RlZFByb2Nlc3MpOwotICAgIH0KLQotICAgIAotCS8vIHByaXZhdGUgU3RyaW5nIGdldFRpdGxlUHJlZml4KCkgewotCS8vIElFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JLy8gaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JLy8gT2JqZWN0IG9iaiA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JLy8gUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBvYmo7Ci0JLy8gUHJvY2VzcyBwcm9jID0gcGMuZ2V0UHJvY2VzcygpOwotCS8vIGlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0NBUEFCSUxJVFlfUEFUVEVSTjsKLQkvLyB9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkvLyByZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1M7Ci0JLy8gfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgUHJvY2Vzc0NvbnRyaWJ1dGlvbikgewotCS8vIHJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJPQ0VTU19DT05UUklCVVRJT047Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JLy8gLmdldFN0cmluZygiQXV0aG9yaW5nVUkuUHJvY2Vzc0VkaXRvci5UaXRsZSIpOyAvLyROT04tTkxTLTEkCi0JLy8gfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldFByb2NUaXRsZUltYWdlKCkgewotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCU9iamVjdCBvYmogPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQpLmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBvYmo7Ci0JCQkJUHJvY2VzcyBwcm9jID0gcGMuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfQ0FQQUJJTElUWV9QQVRURVJOOwotCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19ERUxJVkVSWV9QUk9DRVNTOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBQcm9wZXJ0aWVzIHZpZXcgZHJvcCBkb3duIG1lbnUKLQkgKiAKLQkgKiBAcGFyYW0gcGFydAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3BlcnRpZXNEcm9wRG93bk1lbnUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXQpIHsKLQkJCUlWaWV3U2l0ZSB2aWV3ID0gKChQcm9wZXJ0eVNoZWV0KSBwYXJ0KS5nZXRWaWV3U2l0ZSgpOwotCi0JCQlJTWVudU1hbmFnZXIgbWVudU1nciA9IHZpZXcuZ2V0QWN0aW9uQmFycygpLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCQkvLyBJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gbWVudU1nci5nZXRJdGVtcygpOwotCQkJLy8gZm9yIChpbnQgaT0wOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspCi0JCQkvLyB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIklkID0iICsgaSArICIgIiArIGl0ZW1zW2ldLmdldElkKCkgKyAiJCIpOwotCQkJLy8gfQotCQkJbWVudU1nci5yZW1vdmVBbGwoKTsKLQkJCW1lbnVNZ3IudXBkYXRlQWxsKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIodGhpcyk7Ci0KLQkJLy8gVE9ETzogbmVlZCByZXZpc2l0Ci0JCS8vIHNpdGUuc2V0U2VsZWN0aW9uUHJvdmlkZXIobmV3IEZvcm1FZGl0b3JTZWxlY3Rpb25Qcm92aWRlcih0aGlzKSk7Ci0JCS8vIGFjdGlvbk1hbmFnZXIgPSBnZXRBY3Rpb25NYW5hZ2VyKCk7Ci0KLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrIHRoYXQgd2lsbCBub3RpZnkgdGhpcyBlZGl0b3IgYXMgY29tbWFuZHMgYXJlCi0JCS8vIGV4ZWN1dGVkLgotCQkvLwotCQlDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpOyAvLyBuZXcKLQkJLy8gQmFzaWNDb21tYW5kU3RhY2soKTsKLQotCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBzZXQgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQncyBhZmZlY3RlZCBvYmplY3RzIHRvCi0JCS8vIGJlIHRoZSBzZWxlY3Rpb24gb2YgdGhlIHZpZXdlciB3aXRoIGZvY3VzLgotCQkvLwotCQljb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIobmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tbWFuZFN0YWNrQ2hhbmdlZChmaW5hbCBFdmVudE9iamVjdCBldmVudCkgewotCQkJCWJvb2xlYW4gcnVuID0gZmFsc2U7Ci0JCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCXN3aXRjaCAoKChDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQpIGV2ZW50KS5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuRVhFQ1VURUQ6Ci0JCQkJCWNhc2UgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LlVORE86Ci0JCQkJCQlydW4gPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlydW4gPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAocnVuKSB7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCi0JCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCQkvLwotCQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSAoKENvbW1hbmRTdGFjaykgZXZlbnQKLQkJCQkJCQkJCS5nZXRTb3VyY2UoKSkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKTsKLQkJCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKCEoVG5nVXRpbC51bndyYXAobW9zdFJlY2VudENvbW1hbmQpIGluc3RhbmNlb2YgU2V0Q29tbWFuZCkpIHsKLQkJCQkJCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihtb3N0UmVjZW50Q29tbWFuZAotCQkJCQkJCQkJCQkJLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZUNoaWxkQ29tbWFuZAotCQkJCQkJCQkJCQkmJiBjdXJyZW50Vmlld2VyIGluc3RhbmNlb2YgUHJvY2Vzc1ZpZXdlcikgewotCQkJCQkJCQkJCU9iamVjdFtdIGFyciA9IG1vc3RSZWNlbnRDb21tYW5kCi0JCQkJCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkudG9BcnJheSgpOwotCQkJCQkJCQkJCWlmIChhcnIubGVuZ3RoID09IDEpIHsKLQkJCQkJCQkJCQkJUHJvY2Vzc1ZpZXdlciB2aWV3ZXIgPSAoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcjsKLQkJCQkJCQkJCQkJdmlld2VyLmVkaXRFbGVtZW50KGFyclswXSwgMCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkvLyBpZiAocHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJCQkJCS8vIHByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotCQllZGl0aW5nRG9tYWluID0gbmV3IFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrKTsKLQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQltYW5hZ2VyLmFkZExpc3RlbmVyKGxpYnJhcnlMaXN0ZW5lcik7Ci0JCQltYW5hZ2VyLnN0YXJ0TGlzdGVuaW5nVG8oYWN0aW9uTWdyLmdldENvbW1hbmRTdGFjaygpKTsKLQotCQkJLy8gVE9ETzogbmVlZCB0byByZXZpc2l0IHRoaXMgY29kZQotCQkJaWYgKCFhZGRBZGFwdGVyRmFjdG9yeUxpc3RlbmVycykgewotCQkJCWFkZEFkYXB0ZXJGYWN0b3J5TGlzdGVuZXJzID0gdHJ1ZTsKLQkJCQltYW5hZ2VyLnN0YXJ0TGlzdGVuaW5nVG8oVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQltYW5hZ2VyLnN0YXJ0TGlzdGVuaW5nVG8oVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQltYW5hZ2VyLnN0YXJ0TGlzdGVuaW5nVG8oVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJLy9zZXRUaXRsZUltYWdlKGdldFByb2NUaXRsZUltYWdlKCkpOwotCi0JCXNldFBhcnRGYWNhZGUoaW5wdXQpOwotCi0JCS8vIGdldCBtZXRob2QgZWxlbWVudCBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQllbGVtZW50T2JqID0gbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQotCQlpZiAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudE9iaik7Ci0JCQlzZWxlY3RlZFByb2Nlc3MgPSBzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZUFkYXB0ZXJzKCkuYWRkKHByb2Nlc3NDb21wb25lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBsaXN0ZW4gdG8gcmVzb3VyY2UgY2hhbmdlIHRvIHVwZGF0ZSBkaXJ0eSBmbGFnCi0JCS8vCi0JCS8vIGFkZFJlc291cmNlQ2hhbmdlZExpc3RlbmVyKCk7Ci0KLQkJLy8gYWRkIHBhcnQgbGlzdGVuZXIgdG8gbGlzdGVuIHRvIHByb3BlcnR5U2hlZXQgY2xvc2UgZXZlbnQKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKAotCQkJCXBhcnRBY3RpdmF0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGlucHV0Q2hhbmdlZChpbnB1dCk7Ci0KLQkJLy8gbGlzdGVuIHRvIHRoZSBjaGFuZ2Ugb2YgY29sdW1uIGxpc3QgaW4gcHJlZmVyZW5jZSBzdG9yZQotCQkvLwotCQlpZiAocHJlZlN0b3JlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJcHJlZlN0b3JlTGlzdGVuZXIgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KSB7Ci0JCQkJCVByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBwYWdlID0gbnVsbDsKLQkJCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKAotCQkJCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkgewotCQkJCQkJcGFnZSA9IFdCU1RhYjsKLQkJCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscygKLQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpIHsKLQkJCQkJCXBhZ2UgPSBPQlNUYWI7Ci0JCQkJCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKSkgewotCQkJCQkJcGFnZSA9IFBCU1RhYjsKLQkJCQkJfQotCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlDb2x1bW5EZXNjcmlwdG9yW10gY29scyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJCQkJCWV2ZW50LmdldFByb3BlcnR5KCkpKTsKLQkJCQkJCXBhZ2UudXBkYXRlQ29sdW1ucyhjb2xzKTsKLQkJCQkJCWlmIChwYWdlID09IFdCU1RhYiB8fCBwYWdlID09IE9CU1RhYikgewotCQkJCQkJCS8vIHVwZGF0ZSBjb25zb2xpZGF0ZWQgdmlldyBhcyB3ZWxsCi0JCQkJCQkJLy8KLQkJCQkJCQkvLyBnZXQgV0JTIGNvbHVtbnMKLQkJCQkJCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KGdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0KLQkJCQkJCQkvLyBnZXQgVEJTIGNvbHVtbnMgCi0JCQkJCQkJQ29sdW1uRGVzY3JpcHRvcltdIHRlYW1Db2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQotCQkJCQkJCS8vIGlmIFRCUyBjb2x1bW5zIGhhcyBURUFNIGNvbHVtbiB0aGVuIGFkZCB0byBjb25zb2xpZGF0ZWQgdmlldwotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbUNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUNvbHVtbkRlc2NyaXB0b3IgY29sRGVzYyA9IHRlYW1Db2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCQkJCQkJaWYgKGNvbERlc2MgPT0gQ09MX0RFU0NfVEVBTSkgewotCQkJCQkJCQkJbGlzdC5hZGQoY29sRGVzYyk7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1ucyA9IG5ldyBDb2x1bW5EZXNjcmlwdG9yW2xpc3Quc2l6ZSgpXTsKLQkJCQkJCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCQkJCQkJcHJvY1RhYi51cGRhdGVDb2x1bW5zKGNvbHVtbnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0KLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0JCQotCQlkaWFncmFtRWRpdG9ySGVscGVyID0gbmV3IERpYWdyYW1FZGl0b3JIZWxwZXIoKTsKLQotCX0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBpbnB1dAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcnRGYWNhZGUoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0gICAgICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0gICAgICAgIHNldFRpdGxlSW1hZ2UoZ2V0UHJvY1RpdGxlSW1hZ2UoKSk7Ci0gICAgfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBzZWxlY3Rpb24gaW50byB3aGljaGV2ZXIgdmlld2VyIGlzIGFjdGl2ZS4gCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwgJiYgY29sbGVjdGlvbiAhPSBudWxsICYmICFjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBpdGVtcyBpbiB0aGUgY3VycmVudCBjb250ZW50IHZpZXdlciBvZgotCQkJCQkvLyB0aGUgZWRpdG9yLgotCQkJCQkvLwotCQkJY3VycmVudFZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCWNvbGxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbkFjdGlvbkJhckNvbnRyaWJ1dG9yIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlyZXR1cm4gKEVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvcikgZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gY2xvc2UgYWxsIGRpYWdyYW0gZWRpdG9ycyBvZiB0aGlzIHByb2Nlc3MKLQkJLy8KLQkJY2xvc2VBbGxEaWFncmFtRWRpdG9ycygpOwotCQkKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmU3RvcmVMaXN0ZW5lcik7Ci0KLQkJLy8gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vCi0JCS8vIGdldFNpdGUoKS5nZXRQYWdlKCkucmVtb3ZlUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0KLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCi0JCWlmIChnZXRBY3Rpb25CYXJDb250cmlidXRvcigpLmdldEFjdGl2ZUVkaXRvcigpID09IHRoaXMpIHsKLQkJCWdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2V0QWN0aXZlRWRpdG9yKG51bGwpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJbWFuYWdlci5zdG9wTGlzdGVuaW5nVG8oZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKSk7Ci0JCX0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0KLQkJaWYgKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFByb2Nlc3NDb21wb25lbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKAotCQkJCQlwcm9jZXNzQ29tcG9uZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gcmVtb3ZlUmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIoKTsKLQotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoCi0JCQkJcGFydEFjdGl2YXRpb25MaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBzYXZlTmVlZGVkID0gaXNEaXJ0eSgpOwotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQkJaWYoZGlhZ3JhbUVkaXRvckhlbHBlciAhPSBudWxsKQotCQkJZGlhZ3JhbUVkaXRvckhlbHBlci5kaXNwb3NlKCk7Ci0KLQotCQkvLyBjYWxsIHRoaXMgdG8gc2V0IG1vZGlmaWVkIGZsYWcgb2Ygc3VwcHJlc3Npb24gdG8gZmFsc2UKLQkJLy8KLQkJc3VwcHJlc3Npb24uc2F2ZUlzRG9uZSgpOwotCi0JCWlmIChzYXZlTmVlZGVkKSB7Ci0JCQkvLyB1c2VyIGRpc2NhcmRlZCBhbGwgdGhlIGNoYW5nZXMsIHNhdmUgdGhlIHJlc291cmNlcyBhZnRlciBjaGFuZ2VzCi0JCQkvLyBhcmUgdW5kb25lLgotCQkJLy8gVE9ETzogcmVsb2FkIHRoZSBwcm9jZXNzIGNvbXBvbmVudCByZXNvdXJjZSBpbnN0ZWFkIHNpbmNlIGl0IGlzCi0JCQkvLyBub3Qgc2hhcmVkLgotCQkJLy8KLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIFJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCS8vIHNhdmVSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkvLyB9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VBbGxEaWFncmFtRWRpdG9ycygpIHsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmKHdvcmtiZW5jaFBhZ2UgPT0gbnVsbCkgewotCQkJLy8gd29ya2JlbmNoIGlzIGNsb3NpbmcsIGFsbCBlZGl0b3Igd2lsbCBiZSBjbG9zZWQgc28gbm8gbmVlZCB0byBjbG9zZSB0aGUgZGlhZ3JhbSBlZGl0b3IgaGVyZQotCQkJLy8KLQkJCXJldHVybjsKLQkJfQotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gZGlhZ3JhbUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0PElFZGl0b3JSZWZlcmVuY2U+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpCi0JCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCWlmIChkaWFncmFtSW5wdXQgIT0gbnVsbCkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJCQkmJiBzZWxlY3RlZFByb2Nlc3MgPT0gVG5nVXRpbAotCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQkJZGlhZ3JhbUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoIWRpYWdyYW1FZGl0b3JSZWZzLmlzRW1wdHkoKSkgewotCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZnMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtkaWFncmFtRWRpdG9yUmVmcy5zaXplKCldOwotCQkJZGlhZ3JhbUVkaXRvclJlZnMudG9BcnJheShyZWZzKTsKLQkJCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3JzKHJlZnMsIHRydWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzY3JpcHRpb25QYWdlKCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKHNlbGVjdGVkUHJvY2VzcyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJLy8gRGVsaXZlcnkgUHJvY2VzcwotCQkJYWRkUGFnZSgwLCBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24odGhpcykpOwotCQl9IGVsc2UgewotCQkJLy8gQ2FwYWJpbGl0eSBQYXR0ZXJuCi0JCQkvLyBQcm9jZXNzIENvbnRyaWJ1dGlvbgotCQkJYWRkUGFnZSgwLCBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uKHRoaXMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjYWRkUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBhZ2VzKCkgewotCQl0cnkgewotCQkJYWRkRGVzY3JpcHRpb25QYWdlKCk7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCQkvLyBjcmVhdGUgRE5EIHRyYW5zZmVyIG9iamVjdHMKLQkJCS8vIGludCBkbmRPcGVyYXRpb25zID0gRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCQkvLyBUcmFuc2ZlcltdIHRyYW5zZmVycyA9IG5ldyBUcmFuc2ZlcltdCi0JCQkvLyB7TG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0KLQkJCS8vIHByZWZlcmVuY2UgaXMgbWFuYWdlZCBieSBsaWJyYXJ5IHBsdWdpbiwKLQkJCS8vIHNpbmNlIHRoaXMgcHJlZmVyZW5jZXMgaXMgYWxzbyB1c2VkIGZvciBicm93c2luZyBhbmQgcHVibGlzaGluZwotCQkJLy8gSmluaHVhIFhpIDA4LzIxLzIwMDYKLQkJCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCVByZWZlcmVuY2VVdGlsLnZhbGlkYXRlUHJlZmVyZW5jZXMoKTsKLQkJCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkKLQkJCUxpc3QgcGFnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCS8vIFdCUyB0YWIKLQkJCVdCU1RhYiA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UodGhpcywgV0JTX0ZPUk1fSUQsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZSk7IAotCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbkRlc2NyaXB0b3JzID0gdG9Db2x1bW5EZXNjcmlwdG9ycyhzdG9yZQotCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJY3VycmVudENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFCi0JCQkJCS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkuc2V0RmlsdGVyKFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UpOwotCQkJfQotCQkJV0JTVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCVdCU1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlpbnQgaWQgPSBhZGRQYWdlKFdCU1RhYi5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKSk7Ci0JCQlzZXRQYWdlVGV4dChpZCwgV0JTVGFiLmdldFRpdGxlKCkpOwotCQkJV0JTVGFiLnNldFRhYkluZGV4KGlkKTsKLQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIFdCU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCQlwYWdlcy5hZGQoV0JTVGFiKTsKLQkJCS8vIHZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldwotCQkJLy8gUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOwotCQkJLy8gdmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkKLQkJCS8vIHsKLQkJCS8vIHB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpCi0JCQkvLyB7Ci0JCQkvLyBVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5oYW5kbGVEb3VibGVDbGlja0V2ZW50KGV2ZW50KTsKLQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiZG91YmxlIGNsaWNrZWQgLi4uIik7Ci0JCQkvLyAvLwotCQkJLy8gLy8gU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikKLQkJCS8vIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZWwiK3NlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkvLyAvLwotCQkJLy8gUHJvZHVjdEVkaXRvclZpZXcuZ2V0VmlldygpLmdldFByb2R1Y3RWaWV3ZXIoKS5zZXRJbnB1dChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJLy8gfQotCQkJLy8gfSk7Ci0JCQkvLyBhZGRQYWdlKFdCU1RhYik7Ci0KLQkJCS8vIE9CUyB0YWIKLQkJCU9CU1RhYiA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UodGhpcywgVEFfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbik7IAotCQkJY29sdW1uRGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpKTsKLQkJCS8vIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19BZGFwdGVyRmFjdG9yaWVzKCksCi0JCQkvLyBjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkuc2V0RmlsdGVyKFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UpOwotCQkJfQotCQkJT0JTVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCU9CU1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlpZCA9IGFkZFBhZ2UoT0JTVGFiLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCXNldFBhZ2VUZXh0KGlkLCBPQlNUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlPQlNUYWIuc2V0VGFiSW5kZXgoaWQpOwotCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIE9CU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCQlwYWdlcy5hZGQoT0JTVGFiKTsKLQkJCS8vIHZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldwotCQkJLy8gUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOwotCQkJLy8gYWRkUGFnZShPQlNUYWIpOwotCi0JCQkvLyBQQlMgdGFiCi0JCQlQQlNUYWIgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKHRoaXMsIFdQQlNfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrUHJvZHVjdFVzYWdlKTsgCi0JCQljb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMpKTsKLQkJCS8vIHNldENvbHVtbkluZGV4VG9OYW1lTWFwKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19BZGFwdGVyRmFjdG9yaWVzKCksCi0JCQkvLyBjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkuc2V0RmlsdGVyKFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UpOwotCQkJfQotCQkJUEJTVGFiLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCVBCU1RhYi5zZXRDb2x1bW5EZXNjcmlwdG9ycyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCQlpZCA9IGFkZFBhZ2UoUEJTVGFiLmNyZWF0ZUNvbnRyb2woZ2V0Q29udGFpbmVyKCkpKTsKLQkJCXNldFBhZ2VUZXh0KGlkLCBQQlNUYWIuZ2V0VGl0bGUoKSk7Ci0JCQlQQlNUYWIuc2V0VGFiSW5kZXgoaWQpOwotCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIFBCU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0JCQlwYWdlcy5hZGQoUEJTVGFiKTsKLQkJCS8vIHZpZXdlci5hZGREcm9wU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsIG5ldwotCQkJLy8gUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOwotCQkJLy8gYWRkUGFnZShQQlNUYWIpOwotCi0JCQkvLyBjb25zb2xpZGF0ZWQgdGFiCi0JCQlwcm9jVGFiID0gbmV3IFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSh0aGlzLAotCQkJCQlDT05TT0xJREFURURfRk9STV9JRCwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Db25zb2xpZGF0ZWRWaWV3KTsgCi0JCQlwcm9jVGFiLnNldFJlYWRPbmx5KHRydWUpOwotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJLnNldEZpbHRlcihQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFKTsKLQkJCX0KLQkJCXByb2NUYWIuc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotLy8JCQljb2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLS8vCQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSk7Ci0vLwkJCQotCQkJLy8gZ2V0IFdCUyBjb2x1bW5zCi0JCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0b3JlCi0JCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKTsKLQotCQkJLy8gZ2V0IFRCUyBjb2x1bW5zIAotCQkJQ29sdW1uRGVzY3JpcHRvcltdIHRlYW1Db2x1bW5EZXNjcmlwdG9ycyA9IHRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpOwotCi0JCQkvLyBpZiBUQlMgY29sdW1ucyBoYXMgVEVBTSBjb2x1bW4gdGhlbiBhZGQgdG8gY29uc29saWRhdGVkIHZpZXcKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbUNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQ29sdW1uRGVzY3JpcHRvciBjb2xEZXNjID0gdGVhbUNvbHVtbkRlc2NyaXB0b3JzW2ldOwotCQkJCWlmIChjb2xEZXNjID09IENPTF9ERVNDX1RFQU0pIHsKLQkJCQkJbGlzdC5hZGQoY29sRGVzYyk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCQlwcm9jVGFiLnNldENvbHVtbkRlc2NyaXB0b3JzKGNvbHVtbnMpOwotCQkJCi0JCQlpZCA9IGFkZFBhZ2UocHJvY1RhYi5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKSk7Ci0JCQlzZXRQYWdlVGV4dChpZCwgcHJvY1RhYi5nZXRUaXRsZSgpKTsKLQkJCXByb2NUYWIuc2V0VGFiSW5kZXgoaWQpOwotCQkJdmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHByb2NUYWIuZ2V0Vmlld2VyKCk7Ci0JCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQkJcGFnZXMuYWRkKHByb2NUYWIpOwotCi0JCQkKLQkJCS8vIFRPRE86IHByb3Blcmx5IGltcGxlbWVudCBleHRlbnNpb24gcG9pbnQKLQkJCS8vIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHN1cHBvc2VkIHRvIGxldCBleHRlbnNpb25zIG1vZGlmeSB0aGUgCi0JCQkvLyBsaXN0IG9mIHBhZ2VzLiAgQnV0IHRoaXMgZWRpdG9yIGlzIHNvIG1lc3N5IHRoYXQgd2UgY2FuJ3QKLQkJCS8vIGp1c3QgcHV0IHRoZSBwYWdlcyBpbiBhIG1hcCB0byBiZSBwYXNzZWQgdG8gZXh0ZW5zaW9ucwotCQkJLy8gKGxpa2UgaW4gdGhlIE1ldGhvZEVsZW1lbnRFZGl0b3IpLgotCQkJCi0JCQkvLyBjaGVjayBmb3IgZXh0ZW5zdGlvbiBwb2ludCBhbmQgYWRkIHRoZSBwYWdlIGlmIHRoZXJlCi0JCQlNYXA8T2JqZWN0LFN0cmluZz4gcGFnZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPE9iamVjdCxTdHJpbmc+KCk7Ci0JCQlMaXN0PElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uPiBwYWdlUHJvdmlkZXJzID0gZ2V0QWxsUGFnZVByb3ZpZGVycygpOwotCQkJaWYgKHBhZ2VQcm92aWRlcnMgIT0gbnVsbCAmJiBwYWdlUHJvdmlkZXJzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHBhZ2VQcm92aWRlcnMpIHsKLQkJCQkJcGFnZU1hcCA9IGV4dGVuc2lvbi5nZXRQYWdlcyhwYWdlTWFwLCB0aGlzLCBzZWxlY3RlZFByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFwYWdlTWFwLmlzRW1wdHkoKSkgewotCQkJCWV4dGVuc2lvblRhYnMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZT4oKTsKLQkJCQlmb3IgKE1hcC5FbnRyeTxPYmplY3QsIFN0cmluZz4gcGFnZUVudHJ5IDogcGFnZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJCU9iamVjdCBwYWdlID0gcGFnZUVudHJ5LmdldEtleSgpOwotCQkJCQlTdHJpbmcgbmFtZSA9IHBhZ2VFbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBDb250cm9sKSB7Ci0JCQkJCQlpbmRleCA9IGFkZFBhZ2UoKENvbnRyb2wpcGFnZSk7Ci0JCQkJCX0gZWxzZSBpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCQkJaWYgKHBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHsKLQkJCQkJCQlQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0ZW5kZWRQYWdlID0gKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgcGFnZTsKLQkJCQkJCQlleHRlbnNpb25UYWJzLmFkZChleHRlbmRlZFBhZ2UpOwotCQkJCQkJCWluZGV4ID0gYWRkUGFnZShleHRlbmRlZFBhZ2UKLQkJCQkJCQkJCS5jcmVhdGVDb250cm9sKGdldENvbnRhaW5lcigpKSk7Ci0JCQkJCQkJc2V0UGFnZVRleHQoaW5kZXgsIGV4dGVuZGVkUGFnZS5nZXRUaXRsZSgpKTsKLQkJCQkJCQlleHRlbmRlZFBhZ2Uuc2V0VGFiSW5kZXgoaW5kZXgpOwotCQkJCQkJCXZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBleHRlbmRlZFBhZ2UKLQkJCQkJCQkJCS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQljcmVhdGVDb250ZXh0TWVudUZvcih2aWV3ZXIpOwotCQotCQkJCQkJCXBhZ2VzLmFkZChleHRlbmRlZFBhZ2UpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHBhZ2UgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQkJaW5kZXggPSBhZGRQYWdlKChJRWRpdG9yUGFydClwYWdlLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJfQotCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlzZXRQYWdlVGV4dChpbmRleCwgbmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWJzUGFnZXMgPSBuZXcgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlW3BhZ2VzLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYnNQYWdlc1tpXSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIHBhZ2VzLmdldChpKTsKLQkJCX0KLQotCQkJLy8gYnNQYWdlcyA9IG5ldyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2VbXSB7IFdCU1RhYiwKLQkJCS8vIE9CU1RhYiwKLQkJCS8vIFBCU1RhYiwgcHJvY1RhYiB9OwotCi0JCQkvLyBpZihnZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcklucHV0KSB7Ci0JCQkvLyBpbnQgcGFnZUlkID0KLQkJCS8vICgoUHJvY2Vzc0VkaXRvcklucHV0KWdldEVkaXRvcklucHV0KCkpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCS8vIGlmKHBhZ2VJZCAhPSAtMSkgewotCQkJLy8gc2V0QWN0aXZlUGFnZSgwKTsKLQkJCS8vIHNldEFjdGl2ZVBhZ2UocGFnZUlkKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQotCQkJaW5wdXRDaGFuZ2VkKGdldEVkaXRvcklucHV0KCkpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aXZlUGFnZShpbnQgcGFnZUluZGV4KSB7Ci0JCXN1cGVyLnNldEFjdGl2ZVBhZ2UocGFnZUluZGV4KTsKLQotCQkvLyB3b3JrIGFyb3VuZCBmb3IgYWN0aXZlIHBhZ2UgdGhhdCBpcyBub3QgYSBmb3JtIHBhZ2UuIFN1cGVyIG1ldGhvZAotCQkvLyBkb2VzIG5vdCBjYWxsIHBhZ2VDaGFuZ2UoKSBpbiB0aGlzIGNhc2UKLQkJLy8KLQkJaGFuZGxlUGFnZUNoYW5nZSgpOwotCQlpZiAocGFnZUluZGV4ID4gMCAmJiBic1BhZ2VzLmxlbmd0aCA8PSBwYWdlSW5kZXgpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSBic1BhZ2VzW3BhZ2VJbmRleF0uZ2V0Vmlld2VyKCk7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJSVNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uID0gbnVsbDsKLQkJCQlpZiAoZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3JJbnB1dCkgewotCQkJCQlpbml0aWFsU2VsZWN0aW9uID0gKChQcm9jZXNzRWRpdG9ySW5wdXQpIGdldEVkaXRvcklucHV0KCkpCi0JCQkJCQkJLmdldEluaXRpYWxTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKGluaXRpYWxTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZFByb2Nlc3MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb247Ci0JCQkJfQotCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNzZXRBY3RpdmVQYWdlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElGb3JtUGFnZSBzZXRBY3RpdmVQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJaW50IGlkID0gLTE7Ci0JCUlGb3JtUGFnZSBhY3RpdmVQYWdlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IHBhZ2UgPSBwYWdlcy5nZXQoaSk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIElGb3JtUGFnZSkgewotCQkJCUlGb3JtUGFnZSBmcGFnZSA9IChJRm9ybVBhZ2UpIHBhZ2U7Ci0JCQkJaWYgKGZwYWdlLmdldElkKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJaWQgPSBpOwotCQkJCQlhY3RpdmVQYWdlID0gZnBhZ2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihpZCA9PSAtMSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBic1BhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIHBhZ2UgPSBic1BhZ2VzW2ldOwotCQkJCWlmIChwYWdlLmdldElkKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJaWQgPSBwYWdlLmdldFRhYkluZGV4KCk7Ci0JCQkJCWFjdGl2ZVBhZ2UgPSBwYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoaWQgPT0gLTEgJiYgZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRQYWdlIDogZXh0ZW5zaW9uVGFicykgewotCQkJCWV4dFBhZ2Uuc2V0UHJvY2VzcyhzZWxlY3RlZFByb2Nlc3MpOwotCQkJCWlmIChleHRQYWdlLmdldElkKCkuZXF1YWxzKHBhZ2VJZCkpIHsKLQkJCQkJaWQgPSBleHRQYWdlLmdldFRhYkluZGV4KCk7Ci0JCQkJCWFjdGl2ZVBhZ2UgPSBleHRQYWdlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCXNldEFjdGl2ZVBhZ2UoaWQpOwotCQkJcmV0dXJuIGFjdGl2ZVBhZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBhZ2VDaGFuZ2UoKSB7Ci0JCWludCBpZCA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGlkICE9IC0xKSB7Ci0JCQlPYmplY3QgcGFnZSA9IHBhZ2VzLmdldChpZCk7Ci0JCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NEZXNjcmlwdGlvbikgewotCQkJCSgoUHJvY2Vzc0Rlc2NyaXB0aW9uKSBwYWdlKS5zZXRGb3JtVGV4dCgpOwotCQkJfQotCQkJaWYgKFdCU1RhYiAhPSBudWxsICYmIGlkID09IFdCU1RhYi5nZXRUYWJJbmRleCgpKSB7Ci0JCQkJc2V0Q3VycmVudFZpZXdlcihXQlNUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChPQlNUYWIgIT0gbnVsbCAmJiBpZCA9PSBPQlNUYWIuZ2V0VGFiSW5kZXgoKSkgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIoT0JTVGFiLmdldFZpZXdlcigpKTsKLQkJCX0gZWxzZSBpZiAoUEJTVGFiICE9IG51bGwgJiYgaWQgPT0gUEJTVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKFBCU1RhYi5nZXRWaWV3ZXIoKSk7Ci0JCQl9IGVsc2UgaWYgKHByb2NUYWIgIT0gbnVsbCAmJiBpZCA9PSBwcm9jVGFiLmdldFRhYkluZGV4KCkpIHsKLQkJCQlzZXRDdXJyZW50Vmlld2VyKHByb2NUYWIuZ2V0Vmlld2VyKCkpOwotCQkJfSBlbHNlIGlmIChleHRlbnNpb25UYWJzICE9IG51bGwpIHsKLQkJCQlmb3IgKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRQYWdlIDogZXh0ZW5zaW9uVGFicykgewotCQkJCQlpZiAoaWQgPT0gZXh0UGFnZS5nZXRUYWJJbmRleCgpKQotCQkJCQkJc2V0Q3VycmVudFZpZXdlcihleHRQYWdlLmdldFZpZXdlcigpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNldEN1cnJlbnRWaWV3ZXIobnVsbCk7Ci0JCQl9Ci0KLQkJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQkJaGFuZGxlUGFnZUNoYW5nZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBjb250ZXh0IG1lbnUgZm9yIHRoZSBnaXZlIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlzZXRTZWxlY3Rpb24oc2VsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9MSU5LIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX01PVkU7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBMb2NhbFRyYW5zZmVyLmdldEluc3RhbmNlKCkgfTsKLQkJdmlld2VyLmFkZERyb3BTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywKLQkJCQluZXcgUHJvY2Vzc0VkaXRvckRyb3BBZGFwdGVyKGVkaXRpbmdEb21haW4sIHZpZXdlcikpOwotCQkKLQkJZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCBETkQuRFJPUF9DT1BZOwotCQl0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IExvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl2aWV3ZXIuYWRkRHJhZ1N1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJhZ0FkYXB0ZXIodmlld2VyKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50Vmlld2VyKFZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gSWYgaXQgaXMgY2hhbmdpbmcuLi4KLQkJLy8KLQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gdmlld2VyKSB7Ci0JCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCQkvLyBDcmVhdGUgdGhlIGxpc3RlbmVyIG9uIGRlbWFuZC4KLQkJCQkvLwotCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkvLyBUaGlzIGp1c3Qgbm90aWZpZXMgdGhvc2UgdGhpbmdzIHRoYXQgYXJlIGFmZmVjdGVkIGJ5IHRoZQotCQkJCQkvLyBzZWN0aW9uLgotCQkJCQkvLwotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKAotCQkJCQkJCVNlbGVjdGlvbkNoYW5nZWRFdmVudCBzZWxlY3Rpb25DaGFuZ2VkRXZlbnQpIHsKLQkJCQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb25DaGFuZ2VkRXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJLy8gU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCBvbmUuCi0JCQkvLwotCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRWaWV3ZXIKLQkJCQkJCS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJCX0KLQotCQkJLy8gU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXcgb25lLgotCQkJLy8KLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQkJCX0KLQotCQkJLy8gUmVtZW1iZXIgaXQuCi0JCQkvLwotCQkJY3VycmVudFZpZXdlciA9IHZpZXdlcjsKLQotCQkJLy8gU2V0IGFkYXB0ZXIgZmFjdG9yeSBvZiBlZGl0aW5nRG9tYWluIHRvIHRoYXQgb2YgdGhlIGN1cnJlbnQgdmlldwotCQkJLy8KLQkJCWlmIChjdXJyZW50Vmlld2VyIGluc3RhbmNlb2YgUHJvY2Vzc1ZpZXdlcikgewotCQkJCUlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gKChQcm9jZXNzVmlld2VyKSBjdXJyZW50Vmlld2VyKQotCQkJCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJCWlmIChjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcikgewotCQkJCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciA9ICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcik7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIKLQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCSgoRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuc2V0RWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVkaXRpbmdEb21haW4uc2V0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKHByb3BDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJcHJvcENvbnRlbnRQcm92aWRlci5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFNldCB0aGUgZWRpdG9ycyBzZWxlY3Rpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgdmlld2VyJ3MKLQkJCS8vIHNlbGVjdGlvbi4KLQkJCS8vCi0JCQlzZXRTZWxlY3Rpb24oY3VycmVudFZpZXdlciA9PSBudWxsID8gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWQotCQkJCQk6IGN1cnJlbnRWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZSk7Ci0JCWlmIChhY3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjdDsKLQkJfQotCi0JCS8vIFRPRE86IGhhbmRsZSBlbGVtZW50IHRoYXQgZG9lcyBub3QgZGlyZWN0bHkgYmVsb25nIHRvIGFuIGFjdGl2aXR5Ci0JCS8vIChsaWtlIGRlbGl2ZXJhYmxlIHBhcnQgb2YgYSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9yKQotCQkvLwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJcmV0dXJuICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKSkKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoVmlld2VyIHZpZXdlciwKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIG90aGVyU2VsLCBib29sZWFuIGFsdGVybmF0ZVNlbGVjdGlvbikgewotCQlpZiAoYWx0ZXJuYXRlU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlPYmplY3QgY3VycmVudFNlbGVjdGlvbiA9IG51bGw7Ci0JCQlpZiAoc2VsLnNpemUoKSA9PSAxKSB7Ci0JCQkJY3VycmVudFNlbGVjdGlvbiA9IHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAoY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJQWN0aXZpdHkgYWN0ID0gZ2V0UGFyZW50QWN0aXZpdHkoCi0JCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRTZWxlY3Rpb24sCi0JCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcikpOwotCQkJCQlpZiAoYWN0ICE9IG90aGVyU2VsLmdldEZpcnN0RWxlbWVudCgpKSB7Ci0JCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG90aGVyU2VsLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihvdGhlclNlbCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG90aGVyU2VsLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjc2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHN5bmNocm9uaXppbmdTZWxlY3Rpb24pIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIC8vIGNoZWNrIGlmIHRoZSByZXNvdXJjZXMgb2Ygc2VsZWN0ZWQgb2JqZWN0cyBhcmUgb3V0IG9mIHN5bmNoIG9yIGFueQotCQkvLyBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0cwotCQkvLyAvLyBiZWNhbWUgcHJveHkgdGhlbiByZWZyZXNoIHRoZW0gaWYgbmVlZGVkCi0JCS8vIC8vCi0JCS8vIGlmKHJlZnJlc2hPdXRPZlN5bmNoKHNlbGVjdGlvbikpIHsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLQkJdmlld1NlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJQXJyYXlMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBBcnJheUxpc3Qoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVycyk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJMaXN0Ci0JCQkJCS5nZXQoaSk7Ci0JCQlsaXN0ZW5lcgotCQkJCQkuc2VsZWN0aW9uQ2hhbmdlZChuZXcgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KHRoaXMsIHNlbGVjdGlvbikpOwotCQl9Ci0KLQkJLy8gc3luY2hyb25pemUgc2VsZWN0aW9uIGluIGFsbCBCUyB2aWV3cyBpZiBvbmx5IG9uZSBlbGVtZW50IGlzIHNlbGVjdGVkCi0JCS8vCi0JCXN5bmNocm9uaXplU2VsZWN0aW9uKHNlbGVjdGlvbiwgY3VycmVudFZpZXdlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoT3V0T2ZTeW5jaChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoY3VycmVudFZpZXdlciAhPSBudWxsICYmIHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlib29sZWFuIHJlZnJlc2hSZXF1aXJlZCA9IGZhbHNlOwotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlIYXNoU2V0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gKChFT2JqZWN0KSBlKTsKLQkJCQkJaWYgKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQkJZU9iamVjdCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKGVPYmplY3QpOwotCQkJCQkJcmVmcmVzaFJlcXVpcmVkID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmplY3QuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQlSZXNvdXJjZVV0aWwuY2hlY2tPdXRPZlN5bmNoUmVzb3VyY2VzKHJlc291cmNlcywKLQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkgfHwgIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCWJvb2xlYW4gcmV0ID0gcHJvbXB0UmVsb2FkRmlsZXMoKTsKLQkJCQkJaWYgKHJldCkgewotCQkJCQkJLy8gdW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlbW92ZWRSZXNvdXJjZXMpOwotCQkJCQkJfQotCi0JCQkJCQlDb2xsZWN0aW9uIHJlbG9hZGVkUmVzb3VyY2VzID0gbnVsbDsKLQkJCQkJCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkvLyBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLgotCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMgPSBtYW5hZ2VyCi0JCQkJCQkJCQkJLnJlbG9hZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQkJCQkJfHwgcmVsb2FkZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlZnJlc2ggb3V0LW9mLXN5bmNoIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaCgKLQkJCQkJCQkJCShSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlZnJlc2hSZXF1aXJlZCkgewotCQkJCWN1cnJlbnRWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbiwgVmlld2VyIGN1cnJlbnRWaWV3ZXIpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXppbmdTZWxlY3Rpb24gPSB0cnVlOwotCQkJaWYgKGN1cnJlbnRWaWV3ZXIgIT0gbnVsbAotCQkJCQkmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmIChzZWwuc2l6ZSgpID09IDEpIHsKLQkJCQkJT2JqZWN0IHNlbGVjdGVkID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBvdGhlclNlbCA9IG51bGw7Ci0JCQkJCWJvb2xlYW4gYWx0ZXJuYXRlU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJCUFycmF5TGlzdCBzZWxlY3RlZFBhdGggPSBudWxsOwotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KChTdHJ1Y3R1cmVkVmlld2VyKSBjdXJyZW50Vmlld2VyKTsKLQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlmICgoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZCkKLQkJCQkJCQkJLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIGdldCBwYXRoCi0JCQkJCQkJCS8vCi0JCQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWQpOwotCQkJCQkJCQlzZWxlY3RlZFBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgc2VsZWN0ZWQ7Ci0JCQkJCQkJCWRvIHsKLQkJCQkJCQkJCXNlbGVjdGVkUGF0aC5hZGQoMCwgZSk7Ci0JCQkJCQkJCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZSk7Ci0JCQkJCQkJCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwYXJlbnQ7Ci0JCQkJCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKHBhcmVudCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkJCQkJLmFkYXB0KAotCQkJCQkJCQkJCQkJCQlwYXJlbnQsCi0JCQkJCQkJCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJCQkJZSA9IHBhcmVudDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSB3aGlsZSAodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmIChwcm9jVGFiLmdldFZpZXdlcigpID09IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQlzZWxlY3RlZCA9IFRuZ1V0aWwudW53cmFwKHNlbGVjdGVkKTsKLQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZCk7Ci0JCQkJCQl9IGVsc2UgaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dFBhZ2UgOiBleHRlbnNpb25UYWJzKSB7Ci0JCQkJCQkJCWlmIChleHRQYWdlLmdldFZpZXdlcigpID09IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJCXNlbGVjdGVkID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWQpOwotCQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCXNlbGVjdGVkKTsJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaWYgKHByb2NUYWIuZ2V0Vmlld2VyKCkgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCXByb2NUYWIuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJaWYgKGV4dGVuc2lvblRhYnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGV4dFBhZ2UgOiBleHRlbnNpb25UYWJzKSB7Ci0JCQkJCQkJCWlmIChleHRQYWdlLmdldFZpZXdlcigpICE9IGN1cnJlbnRWaWV3ZXIpCi0JCQkJCQkJCQlleHRQYWdlLmdldFZpZXdlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCXx8IHNlbGVjdGVkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJCQkJb3RoZXJTZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJQWN0aXZpdHkgYWN0ID0gZ2V0UGFyZW50QWN0aXZpdHkoCi0JCQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgc2VsZWN0ZWQsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQkJCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJb3RoZXJTZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihhY3QpOwotCQkJCQkJCQlhbHRlcm5hdGVTZWxlY3Rpb24gPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJTZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gb3duIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkJCQkJCS8vCi0JCQkJCQlWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCQkJCQkJaWYgKCBXQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBXQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIodmlld2VyLCBvdGhlclNlbCwKLQkJCQkJCQkJCQlhbHRlcm5hdGVTZWxlY3Rpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKCBPQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBPQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIodmlld2VyLCBvdGhlclNlbCwKLQkJCQkJCQkJCQlhbHRlcm5hdGVTZWxlY3Rpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJaWYgKCBQQlNUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBQQlNUYWIuZ2V0Vmlld2VyKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiB2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgZmFsc2UpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHZpZXdlciwgb3RoZXJTZWwsCi0JCQkJCQkJCQkJYWx0ZXJuYXRlU2VsZWN0aW9uKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoc2VsZWN0ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCS8vIGluaGVyaXRlZCBlbGVtZW50IGlzIHNlbGVjdGVkCi0JCQkJCQkvLwotCQkJCQkJVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCQkJCQlpZiAoIFdCU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IFdCU1RhYi5nZXRWaWV3ZXIoKTsKLQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsIFdCU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCQkJCQkJCi0JCQkJCQlpZiAoIE9CU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IE9CU1RhYi5nZXRWaWV3ZXIoKTsJCQkJCQkKLQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsIE9CU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIFBCU1RhYiAhPSBudWxsICkgewotCQkJCQkJCXZpZXdlciA9IFBCU1RhYi5nZXRWaWV3ZXIoKTsJCQkJCQkKLQkJCQkJCQlpZiAodmlld2VyICE9IGN1cnJlbnRWaWV3ZXIpIHsKLQkJCQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsIFBCU1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoIHByb2NUYWIgIT0gbnVsbCApIHsKLQkJCQkJCQl2aWV3ZXIgPSBwcm9jVGFiLmdldFZpZXdlcigpOwotCQkJCQkJCWlmICh2aWV3ZXIgIT0gY3VycmVudFZpZXdlcikgewotCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaW5kU2VsZWN0aW9uKAotCQkJCQkJCQkJCXNlbGVjdGVkUGF0aCwgcHJvY1RhYi5nZXRBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0UGFnZSA6IGV4dGVuc2lvblRhYnMpIHsKLQkJCQkJCQkJdmlld2VyID0gZXh0UGFnZS5nZXRWaWV3ZXIoKTsKLQkJCQkJCQkJaWYgKHZpZXdlciAhPSBjdXJyZW50Vmlld2VyKSB7Ci0JCQkJCQkJCQlzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCQkJZmluZFNlbGVjdGlvbigKLQkJCQkJCQkJCQkJCQlzZWxlY3RlZFBhdGgsCi0JCQkJCQkJCQkJCQkJZXh0UGFnZQotCQkJCQkJCQkJCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCQkJCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJc3luY2hyb25pemluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmluZFNlbGVjdGlvbihMaXN0IHNlbGVjdGVkUGF0aCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWludCBzaXplID0gc2VsZWN0ZWRQYXRoLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJT2JqZWN0IGUgPSBzZWxlY3RlZFBhdGguZ2V0KDApOwotCQlPYmplY3Qgc2VsZWN0aW9uID0gZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihlKTsKLQkJZmluZF9zZWxlY3Rpb246IGZvciAoaW50IGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQllID0gc2VsZWN0ZWRQYXRoLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJCWlmIChlbGVtZW50ID09IGUpIHsKLQkJCQkJc2VsZWN0aW9uID0gY2hpbGQ7Ci0JCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCQljaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpOwotCQkJCQljb250aW51ZSBmaW5kX3NlbGVjdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhayBmaW5kX3NlbGVjdGlvbjsKLQkJfQotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8vIEltcGxlbWVudHMgSVNlbGVjdGlvblByb3ZpZGVyCi0JLy8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHZpZXdTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlciNnZXRFZGl0aW5nRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlciNnZXRWaWV3ZXIoKQotCSAqLwotCXB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkgewotCQlyZXR1cm4gY3VycmVudFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSBpcyBhbnkKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlBZGFwdGVyIEZhY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcGFnZSBvZiB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlJRm9ybVBhZ2UgcGFnZSA9IGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQlpZiAocGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBwYWdlKQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkoKElNZW51TGlzdGVuZXIpIGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpKQotCQkJCS5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCQkKLQkJLy8gcG9wdWxhdGUgY29udHJpYnV0ZWQgbWVudSBpdGVtcwotCQkvLwotCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IGdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQlpZihhY3RpdmVQYWdlIGluc3RhbmNlb2YgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSB7Ci0JCQlJQWN0aW9uW10gYWN0aW9ucyA9ICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKWFjdGl2ZVBhZ2UpLmdldEFkZGl0aW9uYWxBY3Rpb25zKCk7Ci0JCQlpZihhY3Rpb25zICE9IG51bGwgJiYgYWN0aW9ucy5sZW5ndGggPiAwKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlBY3Rpb24gYWN0aW9uID0gYWN0aW9uc1tpXTsKLQkJCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgYWN0aW9uIGluc3RhbmNlb2YgQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uKSB7Ci0JCQkJCQkoKEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbilhY3Rpb24pLnNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJV29ya2JlbmNoUGFydEFjdGlvbikgewotCQkJCQkJKChJV29ya2JlbmNoUGFydEFjdGlvbikgYWN0aW9uKQotCQkJCQkJCQkuc2V0QWN0aXZlV29ya2JlbmNoUGFydCh0aGlzKTsKLQkJCQkJfQotCQkJCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJvcGVydHkgc2hlZXQgcGFnZQotCSAqIEByZXR1cm4KLQkgKiAJCQlQcm9wZXJ0eVNoZWV0IFBhZ2UKLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UgPSAoRVBGUHJvcGVydHlTaGVldFBhZ2UpIGNyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCk7Ci0KLQkJCS8vIHsKLQkJCS8vIHB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwKLQkJCS8vIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyCi0JCQkvLyBzdGF0dXNMaW5lTWFuYWdlcikgewotCQkJLy8gc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLAotCQkJLy8gc3RhdHVzTGluZU1hbmFnZXIpOwotCQkJLy8gfQotCQkJLy8KLQkJCS8vIHB1YmxpYyB2b2lkIHNldEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQkJLy8gc3VwZXIuc2V0QWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQkJCS8vIGdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCkuc2hhcmVHbG9iYWxBY3Rpb25zKHRoaXMsIGFjdGlvbkJhcnMpOwotCQkJLy8gfQotCQkJLy8gfTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2V0dGluZyBwcm92aWRlciAiKTsKLQkJCWlmIChjdXJyZW50Vmlld2VyICE9IG51bGwpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpICgoUHJvY2Vzc1ZpZXdlcikgY3VycmVudFZpZXdlcikKLQkJCQkJCS5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCQlwcm9wQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJY29udGVudFByb3ZpZGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCXByb3BlcnR5U2hlZXRQYWdlCi0JCQkJCQkuc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihwcm9wQ29udGVudFByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvcGVydHlTaGVldFBhZ2U7Ci0JfQotCi0gICAgLyoqCi0gICAgICogCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIGNyZWF0ZVByb3BlcnR5U2hlZXRQYWdlKCkgewotICAgICAgICByZXR1cm4gbmV3IEVQRlByb3BlcnR5U2hlZXRQYWdlKHRoaXMpOwotICAgIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSkgewotCQkJcmV0dXJuIGdldFByb3BlcnR5U2hlZXRQYWdlKCk7Ci0JCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhJR290b01hcmtlci5jbGFzcykpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoa2V5KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciNnZXRDb250cmlidXRvcklkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKSB7Ci0JCXJldHVybiBnZXRTaXRlKCkuZ2V0SWQoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm4gY29sdW1uIGRlc2NyaXB0b3IgbGlzdCBmb3IgZ2l2ZW4gc3RyaW5nCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUxpc3QgdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChTdHJpbmcgc3RyKSB7Ci0JCUVMaXN0IGNvbHVtbkRlc2NyaXB0b3JzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQlPYmplY3QgY29sdW1uRGVzY3JpcHRvciA9IFByb2Nlc3NFZGl0b3IuaWRUb0NvbHVtbkRlc2NyaXB0b3JNYXAKLQkJCQkJLmdldCh0b2tlbik7Ci0JCQlpZiAoY29sdW1uRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJY29sdW1uRGVzY3JpcHRvcnMuYWRkKGNvbHVtbkRlc2NyaXB0b3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2x1bW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYXJyYXkgb2YgY29sdW1uIGRlc2NyaXB0b3JzIGZvciB0aGUgZ2l2ZW4gc3RyaW5nCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sdW1uRGVzY3JpcHRvcltdIHRvQ29sdW1uRGVzY3JpcHRvcnMoU3RyaW5nIHN0cikgewotCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0JCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCXJldHVybiBjb2x1bW5zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3IjZ2V0Q3VycmVudFBhZ2UoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q3VycmVudFBhZ2UoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDdXJyZW50UGFnZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBzdXBwcmVzc2lvbiBpbmZvCi0JICovCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlnQ2hhbmdlZCgpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgIT0gY3VycmVudENvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGVkaXRvciBvciBkaWFncmFtIGVkaXRvcgotCQkJLy8gb2YgYW55IGFjdGl2aXR5IGluIHRoaXMgcHJvY2VzcwotCQkJLy8KLQkJCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpOwotCQkJYm9vbGVhbiByZWZyZXNoID0gYWN0aXZlUGFydCA9PSB0aGlzOwotCQkJaWYgKCFyZWZyZXNoKSB7Ci0JCQkJaWYgKGFjdGl2ZVBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkoKElFZGl0b3JQYXJ0KSBhY3RpdmVQYXJ0KQotCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJcmVmcmVzaCA9IGlucHV0LmdldFN1cHByZXNzaW9uKCkuZ2V0UHJvY2VzcygpID09IHNlbGVjdGVkUHJvY2VzczsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWc7Ci0JCQkJcmVmcmVzaEFsbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNzZXRJbnB1dChvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCAhPSBnZXRFZGl0b3JJbnB1dCgpKSB7Ci0JCQlpbnB1dENoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yI3VwZGF0ZVBhZ2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQYWdlcygpIHsKLQkJLy8gcmVtb3ZlIGFuZCBhZGQgZGVzY3JpcHRpb24gcGFnZSBpZiB0aGUgbW9kZWwueG1pIG9yIGNvbnRlbnQueG1pIG9mCi0JCS8vIHRoZSBwcm9jZXNzIGhhdmUgYmVlbiBjaGFuZ2VkCi0JCS8vCi0JCVJlc291cmNlIG1vZGVsUmVzb3VyY2UgPSBzZWxlY3RlZFByb2Nlc3MuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlIGNvbnRlbnRSZXNvdXJjZSA9IHNlbGVjdGVkUHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJaWYgKGNoYW5nZWRSZXNvdXJjZXMuY29udGFpbnMobW9kZWxSZXNvdXJjZSkKLQkJCQl8fCAoY29udGVudFJlc291cmNlICE9IG51bGwgJiYgY2hhbmdlZFJlc291cmNlcwotCQkJCQkJLmNvbnRhaW5zKGNvbnRlbnRSZXNvdXJjZSkpKSB7Ci0JCQlyZW1vdmVQYWdlKDApOwotCQkJdHJ5IHsKLQkJCQlhZGREZXNjcmlwdGlvblBhZ2UoKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZSwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvck1zZywgZSk7IAotCQkJfQotCQl9Ci0JCWlmIChpbnB1dENoYW5nZWQpIHsKLQkJCWlucHV0Q2hhbmdlZChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVmcmVzaEFsbCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEFsbCgpIHsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlkb1JlZnJlc2hBbGwodHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIHZpZXdlcnMgCi0JICogQHBhcmFtIHVwZGF0ZUlEcwotCSAqIAkJCWlmIHRydWUsIHRoZW4gcmVmcmVzaCBhbGwgaW5kZXggaW4gdmlld2VycwotCSAqLwotCXB1YmxpYyB2b2lkIGRvUmVmcmVzaEFsbChib29sZWFuIHVwZGF0ZUlEcykgewotLy8JCWlmICh1cGRhdGVJRHMpIHsKLS8vCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotLy8JCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHNlbGVjdGVkUHJvY2Vzcyk7Ci0vLwkJCVByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwKLS8vCQkJCQlzZWxlY3RlZFByb2Nlc3MpOwotLy8KLS8vCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotLy8JCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHNlbGVjdGVkUHJvY2Vzcyk7Ci0vLwkJfQotCi0JCXVwZGF0ZUlEcyh1cGRhdGVJRHMpOwotCQkKLSAgICAgICAgaWYgKFdCU1RhYiAhPSBudWxsICYmIFdCU1RhYi5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBXQlNUYWIuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoT0JTVGFiICE9IG51bGwgJiYgT0JTVGFiLmdldFZpZXdlcigpICE9IG51bGwpIHsKLSAgICAgICAgCU9CU1RhYi5nZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFBCU1RhYiAhPSBudWxsICYmIFBCU1RhYi5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgIAlQQlNUYWIuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9jVGFiICE9IG51bGwgJiYgcHJvY1RhYi5nZXRWaWV3ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgIAlwcm9jVGFiLmdldFZpZXdlcigpLnJlZnJlc2goKTsKLSAgICAgICAgfQotCi0JCQotCQlpZiAoZXh0ZW5zaW9uVGFicyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSBleHRQYWdlIDogZXh0ZW5zaW9uVGFicykgewotCQkJCWV4dFBhZ2UuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlLnJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQkKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdXBkYXRlSURzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlSURzKGJvb2xlYW4gdXBkYXRlSURzKSB7Ci0gICAgICAgIGlmICh1cGRhdGVJRHMpIHsKLSAgICAgICAgICAgIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChXQlNUYWIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHNlbGVjdGVkUHJvY2Vzcyk7Ci0gICAgICAgICAgICAgICAgUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LCBzZWxlY3RlZFByb2Nlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHByb2NUYWIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLSAgICAgICAgICAgICAgICBQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHNlbGVjdGVkUHJvY2Vzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotCS8qKgotCSAqIFJlZnJlc2ggYWxsIG9wZW4gcHJvY2VzcyBlZGl0b3JzCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEFsbFByb2Nlc3NFZGl0b3JzKCkgewotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IGdldFNpdGUoKS5nZXRQYWdlKCkKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCSgoUHJvY2Vzc0VkaXRvcikgZWRpdG9yKS5kb1JlZnJlc2hBbGwoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvciNnZXRBY3RpdmVQYWdlSW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBJRm9ybVBhZ2UgZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCkgewotCQlpbnQgaW5kZXggPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCXJldHVybiBzdXBlci5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gYnNQYWdlc1tpbmRleCAtIDFdOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzID0gc3VwZXIuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJaWYgKHN1cHByZXNzaW9uLmlzU2F2ZU5lZWRlZCgpCi0JCQkJJiYgIW1vZGlmaWVkUmVzb3VyY2VzLmNvbnRhaW5zKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudAotCQkJCQkJLmVSZXNvdXJjZSgpKSkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHNlbGVjdGVkUHJvY2Vzc0NvbXBvbmVudC5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKHJlc291cmNlc1RvU2F2ZSk7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjZG9TYXZlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJc3VwcHJlc3Npb24uc2F2ZVRvTW9kZWwoKTsKLQkJc3VwZXIuZG9TYXZlKG1vbml0b3IpOwotCQlzdXBwcmVzc2lvbi5zYXZlSXNEb25lKCk7Ci0JCXJlc291cmNlc1RvU2F2ZS5jbGVhcigpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvciNpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlpZiAoc3VwcHJlc3Npb24uaXNTYXZlTmVlZGVkKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZmlyZVByb3BlcnR5Q2hhbmdlKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoaW50IHByb3BlcnR5SWQpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BlcnR5SWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IjZ2V0VXNlZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFVzZWRSZXNvdXJjZXMoKSB7Ci0JCUhhc2hTZXQ8UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQotCQkvLyBtb2RlbC54bWkKLQkJLy8KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50T2JqLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdXNlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0KLQkJLy8gY29udGVudC54bWkKLQkJLy8KLQkJcmVzb3VyY2UgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl1c2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQotCQkvLyBjb25maWd1cmF0aW9uLnhtaQotCQkvLwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNlbGVjdGVkUHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCXJlc291cmNlID0gY29uZmlnLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQl1c2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXNvdXJjZXMgb2Ygb3RoZXIgcHJvY2Vzc2VzIHRoYXQgdGhpcyBwcm9jZXNzIGlzIGRlcGVuZGluZyBvbgotCQkvLwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5RnJvbVRhYigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJc2VsZWN0ZWRQcm9jZXNzKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlyZXNvdXJjZSA9ICgoRU9iamVjdCkgb2JqKS5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQl1c2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbGFzdFVzZWRSZXNvdXJjZXMgPSB1c2VkUmVzb3VyY2VzOwotCi0JCXJldHVybiB1c2VkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnlGcm9tVGFiKCkgewotICAgICAgICByZXR1cm4gV0JTVGFiLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBzZWxlY3RlZCBvYmplY3RzIGNhbiBiZSByZXZlYWxlZCBvciBub3QgYW5kIHJldHVucyByZXN1bHQKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogCQkJTGlzdCBvZiBvYmplY3RzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogCQkJQWRhcHRlciBmYWN0b3J5IG9mIHRoZSBzZWxlY3RlZCBvYmplY3RzCi0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogCQkJU3VwcHJlc3Npb24gaW5mb3JtYXRpb24KLQkgKiBAcmV0dXJuCi0JICogCQlCb29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgc2VsZWN0ZWQgb2JqZWN0cyBjYW4gYmUgcmV2ZWFsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmV2ZWFsKENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCS8vIE5PIG1vcmUgY2hlY2sgZm9yIGR1cGxpY2F0aW9uIG9mIG5hbWUgYW5kIHByZXNlbnRhdGlvbiBuYW1lCi0JCS8vCi0vLwkJLy8gY2hlY2sgaWYgcmV2ZWFsaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cyB3aWxsIGNhdXNlIG5hbWUgZHVwbGljYXRpb24KLS8vCQkvLwotLy8JCVN0cmluZyBtc2cgPSBzdXBwcmVzc2lvbi5jaGVja0R1cGxpY2F0ZU5hbWVBZnRlclJldmVhbChzZWxlY3Rpb24sCi0vLwkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJaWYgKG1zZyAhPSBudWxsKSB7Ci0vLwkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0vLwkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9SZXZlYWxfVGl0bGUsIC8vJE5PTi1OTFMtMSQgCi0vLwkJCQkJbXNnKTsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCi0vLwkJLy8gY2hlY2sgaWYgcmV2ZWFsaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cyB3aWxsIGNhdXNlIGR1cGxpY2F0ZQotLy8JCS8vIGRlc2NyaXB0b3JzLgotLy8JCS8vIElmIHNvLCBwcm9tcHQgdXNlciB0byBkZWxldGUgdGhlIGR1cGxpY2F0ZXMgYmVmb3JlIGNvbnRpbnVpbmcuCi0vLwkJLy8KLS8vCQlDb2xsZWN0aW9uIGR1cGxpY2F0ZXMgPSBQcm9jZXNzVXRpbAotLy8JCQkJLmdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJSZXZlYWwoc2VsZWN0aW9uKTsKLS8vCQlpZiAoIWR1cGxpY2F0ZXMuaXNFbXB0eSgpKSB7Ci0vLwkJCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLS8vCQkJCQkuZ2V0SWQoKSwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGR1cGxpY2F0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlEZXNjcmlwdG9yIGRlc2MgPSAoRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0vLwkJCQlTdHJpbmcgZGVzY1R4dCA9IFRuZ1V0aWwuZ2V0VHlwZVRleHQoZGVzYykKLS8vCQkJCQkJKyAiOiAiICsgZGVzYy5nZXRQcmVzZW50YXRpb25OYW1lKCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEF1dGhvcmluZ1VJUGx1Z2luCi0vLwkJCQkJCS5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMCwgZGVzY1R4dCwgbnVsbCkpOwotLy8JCQl9Ci0vLwkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotLy8JCQkJCS5nZXREZWZhdWx0KCkKLS8vCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmV2ZWFsX1RpdGxlLCAvLyROT04tTkxTLTEkIAotLy8JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9wcm9tcHRUb0RlbGV0ZUJlZm9yZVJldmVhbCwgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQkJc3RhdHVzKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCi0vLwkJCS8vIGRlbGV0ZSBkdXBsaWNhdGUgZGVzY3JpcHRvcnMKLS8vCQkJdHJ5IHsKLS8vCQkJCVByb2Nlc3NEZWxldGVBY3Rpb24uZGVsZXRlKGR1cGxpY2F0ZXMpOwotLy8JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0luaGVyaXRlZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCS8vIHByZWZlcmVuY2UgaXMgbWFuYWdlZCBieSBsaWJyYXJ5IHBsdWdpbiwKLQkJLy8gc2luY2UgdGhpcyBwcmVmZXJlbmNlcyBpcyBhbHNvIHVzZWQgZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0JCS8vIEppbmh1YSBYaSAwOC8yMS8yMDA2Ci0JCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJLy8gLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiBzdG9yZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtRWRpdG9ySGVscGVyIGdldERpYWdyYW1FZGl0b3JIZWxwZXIoKXsKLQkJaWYoZGlhZ3JhbUVkaXRvckhlbHBlciA9PSBudWxsKXsKLQkJCWRpYWdyYW1FZGl0b3JIZWxwZXIgPSBuZXcgRGlhZ3JhbUVkaXRvckhlbHBlcigpOwotCQkJZGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtTWFuYWdlcihzZWxlY3RlZFByb2Nlc3MpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtRWRpdG9ySGVscGVyOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB3aXRob3V0IGFueSBjb2RlIGNoYW5nZSBqdXN0IGZvciB7QGxpbmsgUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yfSB0byBhY2Nlc3MgaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2VkaXRvcnMvUHJvY2Vzc0VkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjg0MDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Db3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSU1vZGlmeWluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSVdvcmtiZW5jaFBhcnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkluZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTWV0aG9kTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Nb3ZlRG93bkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTW92ZVVwQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5PdXRkZW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5Qcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5TeW5jaHJvbml6YXRpb25BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkRpYWxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuVXNlckRlZmluZWREaWFncmFtRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5FUEZQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQURJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFEREltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtRWRpdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUERESW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkxvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlJlcGxhY2VBY3Rpdml0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5EaWFncmFtT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXhwb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24uU3VwcHJlc3Npb25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotCi0vKioKLSAqIEFjdGlvbiBiYXIgY29udHJpYnR1dG9yIGZvciBwcm9jZXNzIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmUgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlNZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgewotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElBY3Rpb24+IHJlZ2lzdGVyZWRBY3Rpb25zID0gbmV3IEFycmF5TGlzdDxJQWN0aW9uPigpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9ja2VkOwotCi0JcHJvdGVjdGVkIElBY3Rpb24gcm9sbHVwQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcCkgewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWJvb2xlYW4gd2FzUm9sbGVkVXAgPSBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQlic0l0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcCghYnNJdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKTsKLQkJCSgoSUNoYW5nZU5vdGlmaWVyKSBic0l0ZW1Qcm92aWRlcikKLQkJCQkJLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJbmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCQkJKEludGVybmFsRU9iamVjdCkgc2VsZWN0ZWRBY3Rpdml0eSwKLQkJCQkJCQkJCU5vdGlmaWNhdGlvbi5BREQsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlKSwKLQkJCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCB0cnVlLCBmYWxzZSkpOwotCi0JCQlpZiAoYnNJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCS8vIFJlZnJlc2hpbmcgZm9yIGdyZWVuIGFjdGl2aXRpZXMgZHVyaW5nIHJvbGx1cAotCQkJCURlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcjsKLQkJCQlwcm92aWRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJbmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgcHJvdmlkZXIsCi0JCQkJCQkJCXByb3ZpZGVyKSwgcHJvdmlkZXIsIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlpZiAod2FzUm9sbGVkVXApIHsKLQkJCQlQcm9jZXNzVmlld2VyIHZpZXdlciA9IChQcm9jZXNzVmlld2VyKSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuY3VycmVudFZpZXdlcjsKLQkJCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbChzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCi0JCQkJLy8gZXZlbnRob3VnaCB3ZSBzd2l0Y2hlZCBvZmYgY3JlYXRpbmcgbmV3IGFjdGl2aXRpZXMgaW4KLQkJCQkvLyBXQlMsCi0JCQkJLy8gdXNlciBjYW4gc3RpbGwgY3JlYXRlIHRocnUgQUQuIEhlbmNlIHdlIG5lZWQgdG8gdXBkYXRlCi0JCQkJLy8gSURzCi0JCQkJLy8gYWZ0ZXJ3YXJkcwotCQkJCWRvUmVmcmVzaCgpOwotCQkJfQotCQl9Ci0KLQl9OwotCi0JcHJvdGVjdGVkIE1vdmVVcEFjdGlvbiBtb3ZlVXBBY3Rpb24gPSBuZXcgTW92ZVVwQWN0aW9uKCkgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYoIWlzRWRpdGluZ0FsbG93ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5hY2NlcHQoc2VsZWN0aW9uKTsKLQkJfQkJCi0JfTsKLQotCXByb3RlY3RlZCBNb3ZlRG93bkFjdGlvbiBtb3ZlRG93bkFjdGlvbiA9IG5ldyBNb3ZlRG93bkFjdGlvbigpIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWlmKCFpc0VkaXRpbmdBbGxvd2VkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0KHNlbGVjdGlvbik7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIHByZWZlcmVuY2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUHJlZmVyZW5jZXMpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gb3BlbiBwcm9jZXNzIHByZWZlcmVuY2UgcGFnZQotCQkJb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWwKLQkJCQkJLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbigKLQkJCQkJCQlnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5Qcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJbnVsbCwgbnVsbCkub3BlbigpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIG9wZW5CYXNlQWN0aXZpdHkgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkJhc2VBY3Rpdml0eSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHNlbGVjdGVkQWN0aXZpdHkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgYmFzZSk7Ci0JCQl0cnkgewotCQkJCWludCBpZCA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihiYXNlKTsKLQotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQoCi0JCQkJCQkoTWV0aG9kRWxlbWVudCkgcHJvYy5lQ29udGFpbmVyKCkpOwotCQkJCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIGdldFBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCQkJaW5wdXQsIFByb2Nlc3NFZGl0b3IuRURJVE9SX0lEKTsKLQkJCQllZGl0b3Iuc2V0QWN0aXZlUGFnZShpZCk7Ci0JCQkJZWRpdG9yLmJzUGFnZXNbaWQgLSAxXS5nZXRWaWV3ZXIoKQotCQkJCQkJLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBvcGVuV29ya2Zsb3dFZGl0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGlhZ3JhbSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRyeSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEdyYXBoaWNhbFdvcmtmbG93RWRpdG9yLkVkaXRvcklucHV0KAotCQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBnZXRTdXBwcmVzc2lvbigpKTsKLQkJCQkJSUVkaXRvclBhcnQgcGFydCA9IGdldFBhZ2UoKS5vcGVuRWRpdG9yKGlucHV0LAotCQkJCQkJCVByb2Nlc3NFZGl0b3IuV09SS0ZMT1dfRURJVE9SX0lEKTsKLQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBwYXJ0OwotCQkJCQkJZWRpdG9yLnNldFBhcmVudEVkaXRvcihwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQlleGNlcHRpb24pOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCX07Ci0JCi0JcHJpdmF0ZSBjbGFzcyBPcGVuRGlhZ3JhbUVkaXRvckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQkJcHJpdmF0ZSBpbnQgZGlhZ3JhbVR5cGU7Ci0KLQkJcHVibGljIE9wZW5EaWFncmFtRWRpdG9yQWN0aW9uKFN0cmluZyB0ZXh0LCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJCXN1cGVyKHRleHQpOwotCQkJdGhpcy5kaWFncmFtVHlwZSA9IGRpYWdyYW1UeXBlOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGdldEltYWdlRGVzY3JpcHRvcihkaWFncmFtVHlwZSkpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoZGlhZ3JhbVR5cGUpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKGludCBkaWFncmFtVHlwZSkgewotCQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCXJldHVybiBBREltYWdlcy5JTUdfREVTQ19FRElUT1I7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQlyZXR1cm4gQURESW1hZ2VzLklNR19ERVNDX0VESVRPUjsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJcmV0dXJuIFdQRERJbWFnZXMuSU1HX0RFU0NfRURJVE9SOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKGludCBkaWFncmFtVHlwZSkgewotCQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCXJldHVybiBBREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19FRElUT1I7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQlyZXR1cm4gQURESW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0VESVRPUjsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJcmV0dXJuIFdQRERJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRURJVE9SOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmKCFQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChzZWxlY3RlZE9iamVjdCkpIHsKLQkJCQkJbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoZ2V0UHJvY2VzcygpLCB0aGlzKTsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBtZ3IuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJaWYobWdyLmlzTmV3UmVzb3VyY2UoKSAmJiAhbmV3IEZpbGUoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSkuZXhpc3RzKCkpIHsKLQkJCQkJCWJvb2xlYW4gcmVzdWx0ID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuTmV3RGlhZ3JhbUZpbGVfdGl0bGUsCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdENyZWF0ZU5ld0RpYWdyYW1GaWxlX21zZyk7Ci0JCQkJCQlpZihyZXN1bHQpIHsKLQkJCQkJCQlyZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0KLQkJCQkJCQkvLyBzdGlsbCBrZWVwIHRoZSBmbGFnIHJlc291cmNlSXNOZXcgc2V0IHNvIGVkaXRvciB3aWxsIGJlIG1hcmtlZCBkaXJ0eQotCQkJCQkJCS8vCi0JCQkJCQkJbWdyLnNldFJlc291cmNlSXNOZXcodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJb3BlbkRpYWdyYW0oZGlhZ3JhbVR5cGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCWV4Y2VwdGlvbik7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSUFjdGlvbiBuZXdBY3Rpdml0eURpYWdyYW1FZGl0b3IgPSBuZXcgT3BlbkRpYWdyYW1FZGl0b3JBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuQWN0aXZpdHlEaWFncmFtLCBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0KLQlwcml2YXRlIElBY3Rpb24gbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yID0gbmV3IE9wZW5EaWFncmFtRWRpdG9yQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fT3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKTsKLQotCXByaXZhdGUgSUFjdGlvbiBuZXdXUERpYWdyYW1FZGl0b3IgPSBuZXcgT3BlbkRpYWdyYW1FZGl0b3JBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9PcGVuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSwKLQkJCUlEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKTsKLQotCS8vIE9wZW4gd29ya2Zsb3cgZGV0YWlsIGFjdGlvbgotCS8vCi0JcHJvdGVjdGVkIElBY3Rpb24gb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5BY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0cnkgewotCQkJCQlJRWRpdG9yUGFydCBwYXJlbnQgPSBnZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IuRWRpdG9ySW5wdXQoCi0JCQkJCQkJc2VsZWN0ZWRPYmplY3QsIGdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlJRWRpdG9yUGFydCBwYXJ0ID0gZ2V0UGFnZSgpLm9wZW5FZGl0b3IoaW5wdXQsCi0JCQkJCQkJUHJvY2Vzc0VkaXRvci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9FRElUT1JfSUQpOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX09wZW5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KAotCQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBnZXRTdXBwcmVzc2lvbigpKSB7Ci0JCQkJCX07Ci0JCQkJCUlFZGl0b3JQYXJ0IHBhcnQgPSBnZXRQYWdlKCkub3BlbkVkaXRvcihpbnB1dCwKLQkJCQkJCQlQcm9jZXNzRWRpdG9yLldQREVQRU5ERU5DWV9FRElUT1JfSUQpOwotCQkJCQlpZiAocGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9IChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHBhcnQ7Ci0JCQkJCQllZGl0b3Iuc2V0UGFyZW50RWRpdG9yKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gcmVwbGFjZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXBsYWNlKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljbWQgPSBuZXcgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCgKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weSA9IG5ldyBBY3Rpb24oCi0JCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dCkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZCA9IG5ldyBMb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZCgKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcik7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKGNtZCAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuSW5VSShydW5uYWJsZSwgZ2V0VGV4dCgpKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjb250cmlidXRlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0NvbnRyaWJ1dGUpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNtZCA9IG5ldyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQoCi0JCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGJzSXRlbVByb3ZpZGVyKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCS8vIFByb2Nlc3NVdGlsLmNvbnRyaWJ1dGVUb0FjdGl2aXR5KChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilic0l0ZW1Qcm92aWRlciwKLQkJCQkvLyAoKFByb2Nlc3NGb3JtRWRpdG9yKWFjdGl2ZUVkaXRvcikuZWRpdGluZ0RvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBjbGFzcyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgZXh0ZW5kcyBTdXBwcmVzc2lvbkNvbW1hbmQgewotCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIExpc3Qgc2VsZWN0aW9uLAotCQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJc3VwZXIoc3VwcHJlc3Npb24sIHNlbGVjdGlvbiwgc3VwcHJlc3NlZCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKLQkJCWlmICghZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKSB7Ci0JCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGlzUmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQoKSkgewotCQkJCQlpZiAoUHJvY2Vzc0VkaXRvci5oYXNJbmhlcml0ZWQoc2VsZWN0aW9uKSkgewotCQkJCQkJZWRpdG9yLnJlZnJlc2hBbGxQcm9jZXNzRWRpdG9ycygpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZWRpdG9yLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWRpdG9yLmZpcmVQcm9wZXJ0eUNoYW5nZShJRWRpdG9yUGFydC5QUk9QX0RJUlRZKTsKLQotCQkJCS8vIERvIERpYWdyYW0gRWRpdG9ycyByZWZyZXNoCi0JCQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5jbG9zZURpYWdyYW1FZGl0b3JzKGVsZW1lbnQsIGxpc3QpOwotCQkJCQlEaWFncmFtRWRpdG9ySGVscGVyLnJlZnJlc2hQYXJlbnREaWFncmFtRWRpdG9ycyhlbGVtZW50LAotCQkJCQkJCWxpc3QsIHRydWUpOwotCQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uLlN1cHByZXNzaW9uQ29tbWFuZCNkaWRFeGVjdXRlKCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRpZEV4ZWN1dGUoKSB7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24uU3VwcHJlc3Npb25Db21tYW5kI2RpZFVuZG8oKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlkVW5kbygpIHsKLQkJCXJlZnJlc2goKTsKLQkJfQotCi0JfQotCi0JLy9UT0RPOiBtb3ZlIHRoaXMgYWN0aW9uIHRvIGl0cyBvd24gQ29tbWFuZEFjdGlvbkhhbmRsZXIgY2xhc3MsIHNlZSBJbmRlbkFjdGlvbgotCXByaXZhdGUgSUFjdGlvbiBzdXBwcmVzc1Rhc2tBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NfVGFzaykgewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCS8vIGNoZWNrIGlmIHN1cHByZXNzaW5nIHRoZSBzZWxlY3RlZCBlbGVtZW50cyB3aWxsIGNhdXNlCi0JCQkvLyBkdXBsaWNhdGUgZGVzY3JpcHRvcnMuCi0JCQkvLyBJZiBzbywgcHJvbXB0IHVzZXIgdG8gZGVsZXRlIHRoZSBkdXBsaWNhdGVzIGJlZm9yZQotCQkJLy8gY29udGludWluZy4KLQkJCS8vCi0KLQkJCWZpbmFsIExpc3QgdGFza0Rlc2NyaXB0b3JzID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9ycyhzZWxlY3Rpb24pOwotCQkJCi0JCQkvLyBOTyBNT1JFIENIRUNLIEZPUiBEVVBMSUNBVElPTiBPRiBOQU1FLCBQUkVTRU5UQVRJT04gTkFNRSwgT1IgTElOS0VEIEVMRU1FTlQKLQotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpCi0JCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQgY21kID0gbmV3IEVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCgKLQkJCQkJCQlnZXRTdXBwcmVzc2lvbigpLCB0YXNrRGVzY3JpcHRvcnMsIHRydWUpOwotCQkJCQljbWQuc2V0TGFiZWwoZ2V0VGV4dCgpKTsKLQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJYm9vbGVhbiBzaG93ID0gdHJ1ZTsKLQkJCS8vIHVwZGF0ZSBjb250ZXh0IGJhciBtZW51IGFmdGVyIHBlcmZvcm1pbmcgc3VwcHJlc3MKLQkJCWlmIChnZXRBZGFwdGVyRmFjdG9yeSgpID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb24uc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKCEoc2VsZWN0aW9uLmdldChpKSBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IHNlbGVjdGlvbgotCQkJCQkJCS5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpKQotCQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXNob3cgPSBmYWxzZTsKLQotCQkJcmV2ZWFsVGFza0FjdGlvbi5zZXRFbmFibGVkKHNob3cpOwotCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoc2hvdyk7Ci0KLQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJYXV0b1N5bmNocm9uaXplLnNldEVuYWJsZWQoYXV0b1N5bmNocm9uaXplCi0JCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldEVuYWJsZWQobWFudWFsU3luY2hyb25pemVBY3Rpb24KLQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUFjdGlvbiBzdXBwcmVzc0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzcykgewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCS8vIE5PIE1PUkUgQ0hFQ0sgRk9SIERVUExJQ0FUSU9OIE9GIE5BTUUsIFBSRVNFTlRBVElPTiBOQU1FLCBPUiBMSU5LRUQgRUxFTUVOVAotCQkJCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIGlmIChnZXRTdXBwcmVzc2lvbigpLnN1cHByZXNzKHNlbGVjdGlvbikpIHsKLQkJCQkJLy8gaWYgKGhhc0luaGVyaXRlZChzZWxlY3Rpb24pKSB7Ci0JCQkJCS8vIGVkaXRvci5yZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKTsKLQkJCQkJLy8gfSBlbHNlIHsKLQkJCQkJLy8gZWRpdG9yLmRvUmVmcmVzaEFsbChmYWxzZSk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gfQotCQkJCQkvLyBlZGl0b3IuZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCi0JCQkJCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBjbWQgPSBuZXcgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKAotCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQkJCWNtZC5zZXRMYWJlbChnZXRUZXh0KCkpOwotCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCX0KLQotCQkJfSk7Ci0KLQkJCS8vIHVwZGF0ZSBjb250ZXh0IGJhciBtZW51IGFmdGVyIHBlcmZvcm1pbmcgc3VwcHJlc3MKLQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuUmV2ZWFsKHNlbGVjdGlvbikpOwotCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKHNlbGVjdGlvbikpOwotCi0JCQkvLyBlbmFibGUgc3luY2hyb25pemUgYWN0aW9ucyBjb3JyZWN0bHkKLQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbiB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uID0gbmV3IFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VBY3Rpb24oKTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIHJldmVhbEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWwpIHsKLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoUHJvY2Vzc0VkaXRvci5jYW5SZXZlYWwoc2VsZWN0aW9uLCBnZXRBZGFwdGVyRmFjdG9yeSgpLCBnZXRTdXBwcmVzc2lvbigpKSkgewotCQkJCS8vIGZpbmFsIFByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpCi0JCQkJLy8gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0KLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJCS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIGlmIChnZXRTdXBwcmVzc2lvbigpLnJldmVhbChzZWxlY3Rpb24pKSB7Ci0JCQkJCQkvLyBpZiAoaGFzSW5oZXJpdGVkKHNlbGVjdGlvbikpIHsKLQkJCQkJCS8vIGVkaXRvci5yZWZyZXNoQWxsUHJvY2Vzc0VkaXRvcnMoKTsKLQkJCQkJCS8vIH0gZWxzZSB7Ci0JCQkJCQkvLyBlZGl0b3IuZG9SZWZyZXNoQWxsKGZhbHNlKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIH0KLQkJCQkJCS8vIGVkaXRvci5maXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSk7Ci0KLQkJCQkJCUVkaXRvclN1cHByZXNzaW9uQ29tbWFuZCBjbWQgPSBuZXcgRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kKAotCQkJCQkJCQlnZXRTdXBwcmVzc2lvbigpLCBzZWxlY3Rpb24sIGZhbHNlKTsKLQkJCQkJCWNtZC5zZXRMYWJlbChnZXRUZXh0KCkpOwotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQkJLy8gdXBkYXRlIGNvbnRleHQgYmFyIG1lbnUgYWZ0ZXIgcGVyZm9ybWluZyByZXZlYWwKLQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbChzZWxlY3Rpb24pKTsKLQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGdldFN1cHByZXNzaW9uKCkuY2FuU3VwcHJlc3MoCi0JCQkJCQlzZWxlY3Rpb24pKTsKLQkJCQkvLyBlbmFibGUgc3luY2hyb25pemUgYWN0aW9ucyBjb3JyZWN0bHkKLQkJCQlhdXRvU3luY2hyb25pemUuc2V0RW5hYmxlZChhdXRvU3luY2hyb25pemUKLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2VsZWN0aW9uCi0JCQkJCQkJCS50b0FycmF5KCkpKSk7Ci0JCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24uc2V0RW5hYmxlZChtYW51YWxTeW5jaHJvbml6ZUFjdGlvbgotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gcmV2ZWFsVGFza0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9SZXZlYWxfVGFzaykgewotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWZpbmFsIExpc3QgdGFza0Rlc2NyaXB0b3JzID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9ycyhzZWxlY3Rpb24pOwotCQkJaWYgKFByb2Nlc3NFZGl0b3IuY2FuUmV2ZWFsKHRhc2tEZXNjcmlwdG9ycywgZ2V0QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJZ2V0U3VwcHJlc3Npb24oKSkpIHsKLQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldEFjdGl2ZUVkaXRvcigpLmdldEVkaXRvclNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJRWRpdG9yU3VwcHJlc3Npb25Db21tYW5kIGNtZCA9IG5ldyBFZGl0b3JTdXBwcmVzc2lvbkNvbW1hbmQoCi0JCQkJCQkJCWdldFN1cHByZXNzaW9uKCksIHRhc2tEZXNjcmlwdG9ycywgZmFsc2UpOwotCQkJCQkJY21kLnNldExhYmVsKGdldFRleHQoKSk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQotCQkJCS8vIGVuYWJsZSBzeW5jaHJvbml6ZSBhY3Rpb25zIGNvcnJlY3RseQotCQkJCWF1dG9TeW5jaHJvbml6ZS5zZXRFbmFibGVkKGF1dG9TeW5jaHJvbml6ZQotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJLnRvQXJyYXkoKSkpKTsKLQkJCQltYW51YWxTeW5jaHJvbml6ZUFjdGlvbi5zZXRFbmFibGVkKG1hbnVhbFN5bmNocm9uaXplQWN0aW9uCi0JCQkJCQkudXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkudG9BcnJheSgpKSkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIE9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IHNlbGVjdGVkQWN0aXZpdHkgPSBudWxsOwotCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGlvbjsKLQotCXByb3RlY3RlZCBJQWN0aW9uIHN1cHByZXNzRGlhZ3JhbUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzczIpIHsKLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJaWYgKCFzdXBlci5pc0VuYWJsZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAhKGJzSXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgYnNJdGVtUHJvdmlkZXIpCi0JCQkJCS5pc1JlYWRPbmx5KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKCFwcm9tcHRTYXZlQWN0aXZlRWRpdG9yKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpOwotCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSkgewotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkuZ2V0RGlhZ3JhbVR5cGVUZXh0KChEaWFncmFtKSBvYmplY3QpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUNvbGxlY3Rpb24gZGlhZ3JhbXMgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCS5nZXREaWFncmFtcyhzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCUFycmF5TGlzdCB1bnN1cHByZXNzZWREaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIWRpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXVuc3VwcHJlc3NlZERpYWdyYW1zLmFkZChkaWFncmFtKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coYWN0aXZlRWRpdG9yCi0JCQkJCS5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZGlhZ3JhbXMsIGNvbnRlbnRQcm92aWRlciwKLQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlKTsKLQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnModW5zdXBwcmVzc2VkRGlhZ3JhbXMpOwotCQkJZGxnCi0JCQkJCS5zZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1N1cHByZXNzRGlhbG9nX1RpdGxlKTsKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0KLQkJCU9iamVjdFtdIGRpYWdyYW1zVG9SZXZlYWwgPSBkbGcuZ2V0UmVzdWx0KCk7Ci0KLQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gY2hhbmdlZCA9IHRydWU7Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIHJlYWxseSBhbnkgY2hhbmdlCi0JCQkvLwotCQkJaWYgKGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoID09IHVuc3VwcHJlc3NlZERpYWdyYW1zLnNpemUoKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlhZ3JhbXNUb1JldmVhbC5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIXVuc3VwcHJlc3NlZERpYWdyYW1zLmNvbnRhaW5zKGRpYWdyYW1zVG9SZXZlYWxbaV0pKSB7Ci0JCQkJCQljaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoYW5nZWQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJCQlkaWFncmFtLnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1zVG9SZXZlYWxbaV07Ci0JCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkJCQl9Ci0KLQkJCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJCQkvLwotCQkJCXNhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gbmV3U3VwcHJlc3NEaWFncmFtQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1N1cHByZXNzMikgewotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlpZiAoIXN1cGVyLmlzRW5hYmxlZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuICEoYnNJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBic0l0ZW1Qcm92aWRlcikKLQkJCQkJLmlzUmVhZE9ubHkoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoIXByb21wdFNhdmVBY3RpdmVFZGl0b3IoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQkvLyBUT0RPOiBDaGFuZ2UgdG8gZXhhY3Qgc3RyaW5nLgotCQkJCQlyZXR1cm4gRGlhZ3JhbUVkaXRvckhlbHBlcgotCQkJCQkJCS5nZXREaWFncmFtVHlwZVN0cmluZygob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSkgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlDb2xsZWN0aW9uIGRpYWdyYW1zID0gKChQcm9jZXNzRWRpdG9yKSBnZXRBY3RpdmVFZGl0b3IoKSkKLQkJCQkJLmdldERpYWdyYW1FZGl0b3JIZWxwZXIoKS5nZXREaWFncmFtcyhzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCUFycmF5TGlzdDxvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtPiBwdWJsaXNoRGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0+KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCXN3aXRjaCAoRGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKSkgewotCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQkJCWlmIChEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBRChzZWxlY3RlZEFjdGl2aXR5KSkgewotCQkJCQkJcHVibGlzaERpYWdyYW1zLmFkZChkaWFncmFtKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQkJaWYgKERpYWdyYW1PcHRpb25zLmlzUHVibGlzaEFERChzZWxlY3RlZEFjdGl2aXR5KSkgewotCQkJCQkJcHVibGlzaERpYWdyYW1zLmFkZChkaWFncmFtKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCQlpZiAoRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoV1BERChzZWxlY3RlZEFjdGl2aXR5KSkgewotCQkJCQkJcHVibGlzaERpYWdyYW1zLmFkZChkaWFncmFtKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coYWN0aXZlRWRpdG9yCi0JCQkJCS5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKSwgZGlhZ3JhbXMsIGNvbnRlbnRQcm92aWRlciwKLQkJCQkJbGFiZWxQcm92aWRlciwKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19NZXNzYWdlKTsKLQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMocHVibGlzaERpYWdyYW1zKTsKLQkJCWRsZwotCQkJCQkuc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9TdXBwcmVzc0RpYWxvZ19UaXRsZSk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCi0JCQlPYmplY3RbXSBkaWFncmFtc1RvUmV2ZWFsID0gZGxnLmdldFJlc3VsdCgpOwotCi0JCQlpZiAoZGlhZ3JhbXNUb1JldmVhbCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlib29sZWFuIGNoYW5nZWQgPSB0cnVlOwotCi0JCQkvLyBjaGVjayBpZiB0aGVyZSBpcyByZWFsbHkgYW55IGNoYW5nZQotCQkJLy8KLQkJCWlmIChkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aCA9PSBwdWJsaXNoRGlhZ3JhbXMuc2l6ZSgpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtc1RvUmV2ZWFsLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICghcHVibGlzaERpYWdyYW1zLmNvbnRhaW5zKGRpYWdyYW1zVG9SZXZlYWxbaV0pKSB7Ci0JCQkJCQljaGFuZ2VkID0gZmFsc2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNoYW5nZWQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlzd2l0Y2ggKERpYWdyYW1FZGl0b3JIZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpIHsKLQkJCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hBRChzZWxlY3RlZEFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUREKHNlbGVjdGVkQWN0aXZpdHksIGZhbHNlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaFdQREQoc2VsZWN0ZWRBY3Rpdml0eSwgZmFsc2UpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1zVG9SZXZlYWwubGVuZ3RoOyBpKyspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGRpYWdyYW1zVG9SZXZlYWxbaV07Ci0JCQkJCXN3aXRjaCAoRGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKSkgewotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKHNlbGVjdGVkQWN0aXZpdHksIHRydWUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFERChzZWxlY3RlZEFjdGl2aXR5LCB0cnVlKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaFdQREQoc2VsZWN0ZWRBY3Rpdml0eSwgdHJ1ZSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBzYXZlIHRoZSBlZGl0b3IKLQkJCQkvLwotCQkJCXNhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gbmV3QXNzaWduVXNlckRpYWdyYW0gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW0pIHsKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLy8gVE9ETzogbmVjZXNzYXJ5IGNoYW5nZXMgVXNlckRlZmluZWREaWFncmFtRGlhbG9nJ3MgRGlhZ3JhbUluZm8uCi0JCQlVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2cgZGlhbG9nID0gbmV3IFVzZXJEZWZpbmVkRGlhZ3JhbURpYWxvZygKLQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgYWN0aXZlRWRpdG9yLAotCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBnZXRQcm9jZXNzKCkuZ2V0RGVmYXVsdENvbnRleHQoKSwgVG5nVXRpbAotCQkJCQkJCS5pc1dyYXBwZWQoc2VsZWN0ZWRPYmplY3QpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIGRpYWdyYW1QdWJsaXNoTm9uZSA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9TdXBwcmVzc0FsbCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlwdWJsaXNoRGlhZ3JhbXNGb3JQcm9jZXNzKGZhbHNlKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gZGlhZ3JhbXNQdWJsaXNoQWxsID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JldmVhbEFsbCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlwdWJsaXNoRGlhZ3JhbXNGb3JQcm9jZXNzKHRydWUpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uIHN1cHByZXNzQWxsRGlhZ3JhbXMgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU3VwcHJlc3NBbGwpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJc2V0QWxsRGlhZ3JhbVN1cHByZXNzZWQodHJ1ZSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gcmV2ZWFsQWxsRGlhZ3JhbXMgPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUmV2ZWFsQWxsKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXNldEFsbERpYWdyYW1TdXBwcmVzc2VkKGZhbHNlKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBhZGRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQWRkKSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygKLQkJCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCkKLQkJCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQkJfQotCQkJCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0RWxlbWVudHNGb3IoCi0JCQkJCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCwgY29uZmlnLAotCQkJCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJCQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsCi0JCQkJCQkJCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkJCQkJLmNyZWF0ZURyb3BDb21tYW5kKAotCQkJCQkJCQkJCQlzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQsIHNlbGVjdGlvbik7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfSk7Ci0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjb3B5QWN0aXZpdHlBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQ29weSkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Moc2VsZWN0ZWRBY3Rpdml0eSkKLQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJfQotCQkJTGlzdCBzZWxlY3Rpb24gPSBEaWFsb2dIZWxwZXIuc2VsZWN0QWN0aXZpdGllc0ZvcihzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQljb25maWcsIElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWSk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotCi0JCQkJCQkvLyBQcm9jZXNzIHByb2MgPQotCQkJCQkJLy8gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJCQkvLyBpZiAoRGVwZW5kZW5jeUNoZWNrZXIuaGFzQ3ljbGljRGVwZW5kZW5jeShhY3QsIHByb2MpKQotCQkJCQkJLy8gewotCQkJCQkJLy8gT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0JCQkJCQkvLyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQkJCQkvLyBTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkvLyAuYmluZCgKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotCQkJCQkJLy8gYXJncyk7Ci0JCQkJCQkvLwotCQkJCQkJLy8gU3RyaW5nIHRpdGxlID0KLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU7Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS8vIC5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gaXRvci5yZW1vdmUoKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIGVsc2UgaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3QpKSB7Ci0JCQkJCQkvLyBPYmplY3RbXSBhcmdzID0geyBzZWxlY3RlZEFjdGl2aXR5LmdldE5hbWUoKSwKLQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS8vIC5iaW5kKAotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJLy8gYXJncyk7Ci0JCQkJCQkvLwotCQkJCQkJLy8gU3RyaW5nIHRpdGxlID0KLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkvLyAuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vCi0JCQkJCQkvLyBpdG9yLnJlbW92ZSgpOwotCQkJCQkJLy8gcmV0dXJuOwotCQkJCQkJLy8gfQotCi0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyCi0JCQkJCQkJCS5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsIHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQlpdG9yLnJlbW92ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUFjdGl2aXR5RHJvcENvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RHJvcENvbW1hbmQoc2VsZWN0ZWRBY3Rpdml0eSwKLQkJCQkJc2VsZWN0aW9uLCBudWxsLCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gY21kLmNoZWNrQ29weSgpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCXRpdGxlLCBzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljbWQuc2V0VHlwZShJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkpOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBleHRlbmRBY3Rpdml0eUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9FeHRlbmQpIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQkJY29uZmlnID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQWN0aXZpdHkpCi0JCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCX0KLQkJCUxpc3Qgc2VsZWN0aW9uID0gRGlhbG9nSGVscGVyLnNlbGVjdEFjdGl2aXRpZXNGb3Ioc2VsZWN0ZWRBY3Rpdml0eSwKLQkJCQkJY29uZmlnLCBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORCk7Ci0KLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotCi0JCQkJCQkvLyBQcm9jZXNzIHByb2MgPQotCQkJCQkJLy8gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJCQkvLyBpZiAoRGVwZW5kZW5jeUNoZWNrZXIuaGFzQ3ljbGljRGVwZW5kZW5jeShhY3QsIHByb2MpKQotCQkJCQkJLy8gewotCQkJCQkJLy8gT2JqZWN0W10gYXJncyA9IHsgc2VsZWN0ZWRBY3Rpdml0eS5nZXROYW1lKCksCi0JCQkJCQkvLyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQkJCQkvLyBTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkvLyAuYmluZCgKLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotCQkJCQkJLy8gYXJncyk7Ci0JCQkJCQkvLwotCQkJCQkJLy8gU3RyaW5nIHRpdGxlID0KLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfdGl0bGU7Ci0JCQkJCQkvLyBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS8vIC5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gaXRvci5yZW1vdmUoKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIGVsc2UgaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihhY3QpKSB7Ci0JCQkJCQkvLyBPYmplY3RbXSBhcmdzID0geyBzZWxlY3RlZEFjdGl2aXR5LmdldE5hbWUoKSwKLQkJCQkJCS8vIGFjdC5nZXROYW1lKCkgfTsKLQkJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS8vIC5iaW5kKAotCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJLy8gYXJncyk7Ci0JCQkJCQkvLwotCQkJCQkJLy8gU3RyaW5nIHRpdGxlID0KLQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotCQkJCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkvLyAuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vCi0JCQkJCQkvLyBpdG9yLnJlbW92ZSgpOwotCQkJCQkJLy8gcmV0dXJuOwotCQkJCQkJLy8gfQotCi0JCQkJCQkvKgotCQkJCQkJICogSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVja0FjdCA/Ci0JCQkJCQkgKiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeUFmdGVyRmlsdGVyU2VsZWN0aW9uCi0JCQkJCQkgKiAoYWN0LCBzZWxlY3RlZEFjdGl2aXR5LAotCQkJCQkJICogVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkgOgotCQkJCQkJICogRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LAotCQkJCQkJICogc2VsZWN0ZWRBY3Rpdml0eSk7Ci0JCQkJCQkgKi8KLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2tBY3QgPyBEZXBlbmRlbmN5Q2hlY2tlcgotCQkJCQkJCQkuY2hlY2tDaXJjdWxhckZvckFwcGx5aW5nVmFyaWFiaWxpdHlFbGVtZW50KAotCQkJCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIGFjdCwgdHJ1ZSkKLQkJCQkJCQkJOiBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeSgKLQkJCQkJCQkJCQlhY3QsIHNlbGVjdGVkQWN0aXZpdHkpOwotCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0dXMpOwotCQkJCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUFjdGl2aXR5RHJvcENvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RHJvcENvbW1hbmQoc2VsZWN0ZWRBY3Rpdml0eSwKLQkJCQkJc2VsZWN0aW9uLCBudWxsLCBnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gY21kLmNoZWNrRXh0ZW5kKCk7Ci0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJdGl0bGUsIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNtZC5zZXRUeXBlKElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EKTsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIElBY3Rpb24gZGVlcENvcHlBY3Rpdml0eUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX2FjdGlvbl9kZWVwQ29weSkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQkJcnVubmVyLnJ1bihuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJCWNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEFjdGl2aXR5KQotCQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJfQotCQkJCQlMaXN0IHNlbGVjdGlvbiA9IERpYWxvZ0hlbHBlci5zZWxlY3RBY3Rpdml0aWVzRm9yKAotCQkJCQkJCXNlbGVjdGVkQWN0aXZpdHksIGNvbmZpZywKLQkJCQkJCQlJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWSk7Ci0KLQkJCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQotCQkJCQkJCWlmIChvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvOwotCi0JCQkJCQkJCS8vIFByb2Nlc3MgcHJvYyA9Ci0JCQkJCQkJCS8vIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotCQkJCQkJCQkvLyBpZiAoUHJvY2Vzc1V0aWwuaGFzQ3ljbGljRGVwZW5kZW5jeShhY3QsCi0JCQkJCQkJCS8vIHByb2MpKSB7Ci0JCQkJCQkJCS8vIE9iamVjdFtdIGFyZ3MgPSB7IHNlbGVjdGVkQWN0aXZpdHkuZ2V0TmFtZSgpLAotCQkJCQkJCQkvLyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQkJCQkJCS8vIFN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJLy8gLmJpbmQoCi0JCQkJCQkJCS8vIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotCQkJCQkJCQkvLyBhcmdzKTsKLQkJCQkJCQkJLy8KLQkJCQkJCQkJLy8gU3RyaW5nIHRpdGxlID0KLQkJCQkJCQkJLy8gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl90aXRsZTsKLQkJCQkJCQkJLy8gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS8vIC5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsKLQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkvLyBpdG9yLnJlbW92ZSgpOwotCQkJCQkJCQkvLyB9Ci0KLQkJCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlcgotCQkJCQkJCQkJCS5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhY3QsCi0JCQkJCQkJCQkJCQlzZWxlY3RlZEFjdGl2aXR5KTsKLQkJCQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotCQkJCQkJCQkJCQkJCXN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJaXRvci5yZW1vdmUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEcm9wQ29tbWFuZCgKLQkJCQkJCQlzZWxlY3RlZEFjdGl2aXR5LCBzZWxlY3Rpb24sIG51bGwsCi0JCQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSxuZXcgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcihjb25maWcpKTsKLQkJCQkJY21kLnNldFR5cGUoSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpOwotCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCi0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIE9iamVjdCBzZWxlY3RlZE9iamVjdDsKLQotCXByb3RlY3RlZCBJQWN0aW9uIGV4cGFuZEFsbEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRm9ybUVkaXRvcl9leHBhbkFsbEFjdGlvbkxhYmVsKSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJVmlld2VyIHZpZXdlciA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5jdXJyZW50Vmlld2VyOwotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIpIHsKLQkJCQkoKFRyZWVWaWV3ZXIpIHZpZXdlcikuZXhwYW5kVG9MZXZlbChzZWxlY3RlZE9iamVjdCwKLQkJCQkJCUFic3RyYWN0VHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBjb2xsYXBzZUFsbEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRm9ybUVkaXRvcl9jb2xsYXBzZUFsbEFjdGlvbkxhYmVsKSB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJVmlld2VyIHZpZXdlciA9ICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5jdXJyZW50Vmlld2VyOwotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFRyZWVWaWV3ZXIpIHsKLQkJCQkoKFRyZWVWaWV3ZXIpIHZpZXdlcikuY29sbGFwc2VUb0xldmVsKHNlbGVjdGVkT2JqZWN0LAotCQkJCQkJQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBTeW5jaHJvbml6YXRpb25BY3Rpb24gbWFudWFsU3luY2hyb25pemVBY3Rpb24gPSBuZXcgU3luY2hyb25pemF0aW9uQWN0aW9uKCkgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzdXBlci5ydW4oKTsKLQotCQkJLy8gcmVmcmVzaCBwcm9wZXJ0aWVzIHZpZXcgYWZ0ZXIgc3luY2gKLQkJCUVQRlByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoRVBGUHJvcGVydHlTaGVldFBhZ2UpICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCQkuZ2V0UHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlwYWdlLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbiBhdXRvU3luY2hyb25pemUgPSBuZXcgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbigpIHsKLQkJcHJpdmF0ZSB2b2lkIHN1cGVyUnVuKCkgewotCQkJc3VwZXIucnVuKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJaWYgKCFBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfZGVmYXVsdFN5bmNocm9uaXphdGlvbiwKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfY29uZmlybUF1dG9TeW5jaCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQkvLyAoKFN5bmNocm9uaXplQ29tbWFuZCljb21tYW5kKS5zZXRVSUNvbnRleHQoZ2V0QWN0aXZlRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQlzdXBlclJ1bigpOwotCi0JCQkJCS8vIHJlZnJlc2ggcHJvcGVydGllcyB2aWV3IGFmdGVyIHN5bmNoCi0JCQkJCUVQRlByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoRVBGUHJvcGVydHlTaGVldFBhZ2UpICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKQotCQkJCQkJCS5nZXRQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlwYWdlLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIHNob3dJbkxpYnJhcnlWaWV3ID0gbmV3IEFjdGlvbigKLQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1Nob3dMaW5rZWRFbGVtZW50aW5MaWJyYXJ5VmlldywKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCSJmdWxsL2V0b29sMTYvc2hvd19saW5rZWRfZWxlbWVudC5naWYiKSkgeyAvLyROT04tTkxTLTEkICAgLy8pIAotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWZpbmFsIE9iamVjdCBsaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKGxpbmtlZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnNldFNlbGVjdGlvblRvVmlld2VyKAotCQkJCQkJCQlsaW5rZWRFbGVtZW50KTsKLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElBY3Rpb24gYXNzaWduVXNlckRpYWdyYW0gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fQXNzaWduVXNlckRpYWdyYW0pIHsKLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJVXNlckRlZmluZWREaWFncmFtRGlhbG9nIGRpYWxvZyA9IG5ldyBVc2VyRGVmaW5lZERpYWdyYW1EaWFsb2coCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGFjdGl2ZUVkaXRvciwKLQkJCQkJc2VsZWN0ZWRBY3Rpdml0eSwgZ2V0UHJvY2VzcygpLmdldERlZmF1bHRDb250ZXh0KCksIFRuZ1V0aWwKLQkJCQkJCQkuaXNXcmFwcGVkKHNlbGVjdGVkT2JqZWN0KSk7Ci0KLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCX0KLQl9OwotCi0JLy8gcHJpdmF0ZSBJQWN0aW9uIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm8gPSBuZXcKLQkvLyBBY3Rpdml0eURldGFpbERpYWdyYW1JbmZvQWN0aW9uKCl7Ci0JLy8gcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JLy8gcmV0dXJuIHNlbGVjdGVkQWN0aXZpdHk7Ci0JLy8gfQotCS8vIHB1YmxpYyBJV29ya2JlbmNoUGFnZSBnZXRQYWdleCgpIHsKLQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JLy8gcmV0dXJuIGdldFBhZ2UoKTsKLQkvLyB9Ci0JLy8gfTsKLQotCXByaXZhdGUgYm9vbGVhbiBvbGRMb2NrZWQ7Ci0KLQlwcml2YXRlIEluZGVudEFjdGlvbiBpbmRlbnRBY3Rpb24gPSBuZXcgSW5kZW50QWN0aW9uKCkgewotCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoIWlzRWRpdGluZ0FsbG93ZWQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci51cGRhdGVTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIE91dGRlbnRBY3Rpb24gb3V0ZGVudEFjdGlvbiA9IG5ldyBPdXRkZW50QWN0aW9uKCkgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKCFpc0VkaXRpbmdBbGxvd2VkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCX0KLQl9OwotCi0JcHVibGljIFByb2Nlc3NFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcik7Ci0KLQkJLy8gZG9uJ3Qgc2hvdyB2YWxpZGF0ZSBhY3Rpb24KLQkJLy8KLQkJdmFsaWRhdGVBY3Rpb24gPSBudWxsOwotCi0JCS8vIHNldCBkaXNhYmxlZCBpbWFnZSBkZXNjcmlwdG9ycwotCQlzaG93SW5MaWJyYXJ5Vmlldy5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvZXRvb2wxNi9zaG93X2xpbmtlZF9lbGVtZW50X2Rpc2FibGVkLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCQotCX0KLQotCXB1YmxpYyBQcm9jZXNzRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkRpYWdyYW0oaW50IGRpYWdyYW1UeXBlKSB7Ci0JCXRyeSB7Ci0JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgRGlhZ3JhbUVkaXRvcklucHV0KAotCQkJCQlzZWxlY3RlZE9iamVjdCwgZ2V0U3VwcHJlc3Npb24oKSwgZGlhZ3JhbVR5cGUpOwotCQkJRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW1FZGl0b3IoZ2V0UGFnZSgpLCBpbnB1dCwKLQkJCQkJRGlhZ3JhbUVkaXRvckhlbHBlci5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBY3Rpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsICYmICFyZWdpc3RlcmVkQWN0aW9ucy5jb250YWlucyhhY3Rpb24pKSB7Ci0JCQlyZWdpc3RlcmVkQWN0aW9ucy5hZGQoYWN0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyQWN0aW9ucygpIHsKLQkJcmVnaXN0ZXJBY3Rpb24oYXV0b1N5bmNocm9uaXplKTsKLQkJcmVnaXN0ZXJBY3Rpb24obWFudWFsU3luY2hyb25pemVBY3Rpb24pOwotCQlyZWdpc3RlckFjdGlvbih1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKTsKLQkJcmVnaXN0ZXJBY3Rpb24oaW5kZW50QWN0aW9uKTsKLQkJcmVnaXN0ZXJBY3Rpb24ob3V0ZGVudEFjdGlvbik7Ci0JCXJlZ2lzdGVyQWN0aW9uKG1vdmVEb3duQWN0aW9uKTsKLQkJcmVnaXN0ZXJBY3Rpb24obW92ZVVwQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcgotCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPyAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbgotCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCQlib29sZWFuIGVkaXRpbmdBbGxvd2VkID0gaXNFZGl0aW5nQWxsb3dlZCgpOwotCQlmb3IgKElBY3Rpb24gYWN0aW9uIDogcmVnaXN0ZXJlZEFjdGlvbnMpIHsKLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBDb21tYW5kQWN0aW9uSGFuZGxlcikgewotCQkJCWFjdGlvbi5zZXRFbmFibGVkKCgoQ29tbWFuZEFjdGlvbkhhbmRsZXIpIGFjdGlvbikKLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oc3RydWN0dXJlZFNlbGVjdGlvbikpOwotCQkJfQotCQkJZWxzZSBpZiAoYWN0aW9uIGluc3RhbmNlb2YgSU1vZGlmeWluZ0FjdGlvbikgewotCQkJCWFjdGlvbi5zZXRFbmFibGVkKGVkaXRpbmdBbGxvd2VkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCW1hbnVhbFN5bmNocm9uaXplQWN0aW9uLnNldFByb2Nlc3MoZ2V0UHJvY2VzcygpKTsKLQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlRWRpdG9yIGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlRWRpdG9yCi0JCQkJOiBhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZ2lzdGVyZWRBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFjdGlvbiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0QWN0aW9uKSB7Ci0JCQkJKChJV29ya2JlbmNoUGFydEFjdGlvbikgYWN0aW9uKQotCQkJCQkJLnNldEFjdGl2ZVdvcmtiZW5jaFBhcnQoYWN0aXZlRWRpdG9yKTsKLQkJCX0KLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSB7Ci0JCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGFjdGlvbik7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQotCQkvLyBjYWxsIHNldCBBY3RpdmUgcGFnZSBleHBsaWNpdGx5IGluIG9yZGVyIHRvIGdldCBjb3JyZWN0IGFjdGlvbgotCQkvLyBiYXJzCi0JCXNldEFjdGl2ZVBhZ2UoYWN0aXZlRWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjZGVhY3RpdmF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIElTZWxlY3Rpb25Qcm92aWRlciA/IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcgotCQkJCTogYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZ2lzdGVyZWRBY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFjdGlvbiA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0QWN0aW9uKSB7Ci0JCQkJKChJV29ya2JlbmNoUGFydEFjdGlvbikgYWN0aW9uKS5zZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KG51bGwpOwotCQkJfQotCQkJaWYgKGFjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgYWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCQlyZWdpc3RlckFjdGlvbnMoKTsKLQkJY29udHJpYnV0ZVRvVG9vbEJhcihhY3Rpb25CYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBhY3RpdmVFZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBbGxEaWFncmFtU3VwcHJlc3NlZChmaW5hbCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMTsKLQotCQlpZiAoIUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCXRpdGxlLCBtZXNzYWdlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5zZXRBbGxEaWFncmFtU3VwcHJlc3NlZChnZXRQcm9jZXNzKCksCi0JCQkJCQlzdXBwcmVzc2VkKTsKLQkJCQlkb1NhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVibGlzaERpYWdyYW1zRm9yUHJvY2VzcyhmaW5hbCBib29sZWFuIHB1Ymxpc2gpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMTsKLQotCQlpZiAoIUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCXRpdGxlLCBtZXNzYWdlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0KLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihnZXRQcm9jZXNzKCkpIHsKLQotCQkJCQkvKioKLQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTg5NDkwMTQ0NzYzNzExMTRMOwotCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCXRyeSB7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUQoYWN0aXZpdHksIHB1Ymxpc2gpOwotCQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFERChhY3Rpdml0eSwgcHVibGlzaCk7Ci0JCQkJCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoV1BERChhY3Rpdml0eSwgcHVibGlzaCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCWRvU2F2ZUFjdGl2ZUVkaXRvcigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJvbXB0U2F2ZUFjdGl2ZUVkaXRvcigpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Zvcm1FZGl0b3JTYXZlRGlhbG9nX3RpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NGb3JtRWRpdG9yU2F2ZURpYWxvZ19tZXNzYWdlMjsKLQkJaWYgKGFjdGl2ZUVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCS8vIHNhdmUgdGhlIGVkaXRvcgotCQkvLwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShhY3RpdmVFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFNoZWxsKCkKLQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1NhdmVBY3RpdmVFZGl0b3IoKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVBY3RpdmVFZGl0b3IoKSB7Ci0JCSgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5yZXNvdXJjZXNUb1NhdmUuYWRkKGdldFByb2Nlc3MoKQotCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCWFjdGl2ZUVkaXRvci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIERlbGV0ZUFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCXByb3RlY3RlZCB2b2lkIHNhdmVDdXJyZW50RWRpdG9yKCkgewotCQkJCWlmIChhY3RpdmVFZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWFjdGl2ZUVkaXRvci5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikKLQkJCQkJCS5nZXRBY3RpdmVQYWdlSW5zdGFuY2UoKTsKLQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpZCA9IGFjdGl2ZVBhZ2UuZ2V0SWQoKTsKLQkJCQkJaWYgKGlkID09IFByb2Nlc3NFZGl0b3IuV0JTX0ZPUk1fSUQKLQkJCQkJCQl8fCBpZCA9PSBQcm9jZXNzRWRpdG9yLlRBX0ZPUk1fSUQKLQkJCQkJCQl8fCBpZCA9PSBQcm9jZXNzRWRpdG9yLldQQlNfRk9STV9JRAotCQkJCQkJCXx8IGlkID09IFByb2Nlc3NFZGl0b3IuQ09OU09MSURBVEVEX0ZPUk1fSUQpIHsKLQkJCQkJCS8vIGZvciBhbGwgb3RoZXIgcGFnZXMsIGRpc2FibGUgREVMRVRFCi0JCQkJCQlzdXBlci5ydW4oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ3V0QWN0aW9uIGNyZWF0ZUN1dEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBDdXRBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihQcm9jZXNzRGVsZXRlQWN0aW9uCi0JCQkJCQkuZmlsdGVyU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlib29sZWFuIHVuZXhlY3V0YWJsZSA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJdW5leGVjdXRhYmxlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodW5leGVjdXRhYmxlKSB7Ci0JCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQYXN0ZUFjdGlvbiBjcmVhdGVQYXN0ZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBQYXN0ZUFjdGlvbigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKFByb2Nlc3NEZWxldGVBY3Rpb24KLQkJCQkJCS5maWx0ZXJTZWxlY3Rpb24oc2VsZWN0aW9uKSk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogT3ZlcnJpZGVkIHRvIHVzZSBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZAotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5QYXN0ZUFjdGlvbiNjcmVhdGVDb21tYW5kKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQKLQkJCSAqLwotCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZChkb21haW4sCi0JCQkJCQkJc2VsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpLCBudWxsLAotCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IENvcHlBY3Rpb24oKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCSgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJCQkJLnJlc2V0Q29weU1hcHMoKTsKLQkJCQl9Ci0JCQkJc3VwZXIucnVuKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5FZGl0aW5nRG9tYWluQWN0aW9uQmFyQ29udHJpYnV0b3IjYWRkR2xvYmFsQWN0aW9ucyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLmFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCQltZW51TWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgbmV3IFNlcGFyYXRvcigiZml4ZWQtYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLy8gbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLAotCQkvLyBpbnNlcnROZXdQaGFzZUFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLQkJc2hvd0luTGlicmFyeVZpZXcKLQkJCQkuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fU2hvd0xpbmtlZEVsZW1lbnRpbkxpYnJhcnlWaWV3KTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKG1vdmVVcEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChtb3ZlRG93bkFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChpbmRlbnRBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQob3V0ZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChzaG93SW5MaWJyYXJ5Vmlldyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0aW5nQWxsb3dlZCgpIHsKLQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikKLQkJCQkuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCXJldHVybiAhKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgJiYgKChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGFjdGl2ZVBhZ2UpCi0JCQkJLmJhc2ljSXNSZWFkT25seSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSAoKFByb2Nlc3NFZGl0b3IpIGFjdGl2ZUVkaXRvcikKLQkJCQkuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCWlmICghaXNFZGl0aW5nQWxsb3dlZCgpKSB7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigKLQkJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChzaG93SW5MaWJyYXJ5Vmlldyk7Ci0JCQlpZiAoYnNJdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJLy8gJiYgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpCi0JCQkvLyBic0l0ZW1Qcm92aWRlcikuaGFzQ2hpbGRyZW4oc2VsZWN0ZWRPYmplY3QpCi0JCQkpIHsKLQkJCQltZW51TWFuYWdlci5hZGQoZXhwYW5kQWxsQWN0aW9uKTsKLQkJCQltZW51TWFuYWdlci5hZGQoY29sbGFwc2VBbGxBY3Rpb24pOwotCQkJfQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQlyZWZyZXNoVmlld2VyQWN0aW9uLnNldEVuYWJsZWQocmVmcmVzaFZpZXdlckFjdGlvbi5pc0VuYWJsZWQoKSk7Ci0JCQltZW51TWFuYWdlci5hZGQocmVmcmVzaFZpZXdlckFjdGlvbik7Ci0JCQltZW51TWFuYWdlci5hZGQoc2hvd1Byb3BlcnRpZXNWaWV3QWN0aW9uKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IChJU2VsZWN0aW9uUHJvdmlkZXIpIGFjdGl2ZUVkaXRvcjsKLQotCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSA9PSBudWxsCi0JCQkJJiYgKHNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigpID09IG51bGwgfHwgc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpKSB7Ci0JCQkvLyBmYWtlIGEgc2VsZWN0aW9uIGNoYW5nZSBldmVudCB3aXRoIHRoZSBwcm9jZXNzIHNlbGVjdGVkIGlmIG5vCi0JCQkvLyBlbGVtZW50IGlzIHNlbGVjdGVkIHlldC4KLQkJCS8vCi0JCQlzZWxlY3Rpb25DaGFuZ2VkKG5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoc2VsZWN0aW9uUHJvdmlkZXIsCi0JCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGdldFByb2Nlc3MoKSkpKTsKLQkJfQotCQkvLyBkaXNhYmxlIGFsbCBuZXcgYWN0aW9uIGlmIGl0J3Mgcm9sbGVkIHVwCi0JCWJvb2xlYW4gaXNSb2xsZWRVUCA9IGJzSXRlbVByb3ZpZGVyICE9IG51bGwKLQkJCQkmJiBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCXN1cGVyLnNldEVuYWJsZWQoIWlzUm9sbGVkVVApOwotCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCi0JCS8vIGFkZCBtYXJrZXJzCi0JCS8vCi0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJmaXhlZC1hZGRpdGlvbnMiLCBuZXcgU2VwYXJhdG9yKCJwcmVmZXJlbmNlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoInByZWZlcmVuY2UiLCBwcmVmZXJlbmNlQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJmaXhlZC1hZGRpdGlvbnMiLCBuZXcgU2VwYXJhdG9yKCJvcGVuIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAoYnNJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCSYmIFRuZ1V0aWwudW53cmFwKGJzSXRlbVByb3ZpZGVyKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCWNvbnRyaWJ1dGVBY3Rpb24pOwotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLAotCQkJCQlyZXBsYWNlQWN0aW9uKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5KTsKLQkJfQotCi0JCWlmICghaXNSb2xsZWRVUCkgewotCQkJaWYgKGNyZWF0ZUNoaWxkQWN0aW9ucyAhPSBudWxsICYmICFjcmVhdGVDaGlsZEFjdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKAotCQkJCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIGFkZEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmV2ZWFsQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHJldmVhbEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChzdXBwcmVzc0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCBzdXBwcmVzc0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWlzUm9sbGVkVVApIHsKLQkJCWlmIChzdXBwcmVzc1Rhc2tBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHN1cHByZXNzVGFza0FjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChyZXZlYWxUYXNrQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuaW5zZXJ0QmVmb3JlKCJmaXhlZC1hZGRpdGlvbnMiLCByZXZlYWxUYXNrQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmICh1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoCi0JCQkJCSJmaXhlZC1hZGRpdGlvbnMiLCB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKChzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQgIT0gbnVsbCkgJiYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpKSB7Ci0JCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIG1vdmVVcEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgbW92ZURvd25BY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBJbmRlbnQvb3V0ZGVudAotCQkvLwotCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIGluZGVudEFjdGlvbik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZSgiZml4ZWQtYWRkaXRpb25zIiwgb3V0ZGVudEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgc2hvd0luTGlicmFyeVZpZXcpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKChzZWxlY3RlZEFjdGl2aXR5ICE9IG51bGwpICYmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsKSkgewotCQkJaWYgKGJzSXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCXJvbGx1cEFjdGlvbgotCQkJCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9BY3Rpb25fUm9sbERvd24pOwotCQkJfSBlbHNlIHsKLQkJCQlyb2xsdXBBY3Rpb24KLQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX1JvbGxVcCk7Ci0JCQl9Ci0JCQltZW51TWFuYWdlci5hcHBlbmRUb0dyb3VwKCJvcGVuIiwgcm9sbHVwQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJfQotCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkvLyAiUmV1c2UiIG1lbnUKLQkJCS8vCi0JCQlNZW51TWFuYWdlciByZXVzZVN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0FwcGx5UGF0dGVybik7Ci0JCQlyZXVzZVN1Yk1lbnUuYWRkKGNvcHlBY3Rpdml0eUFjdGlvbik7Ci0JCQlyZXVzZVN1Yk1lbnUuYWRkKGV4dGVuZEFjdGl2aXR5QWN0aW9uKTsKLQkJCXJldXNlU3ViTWVudS5hZGQoZGVlcENvcHlBY3Rpdml0eUFjdGlvbik7Ci0KLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJcmV1c2VTdWJNZW51KTsKLQkJfQotCi0JCWlmIChhdXRvU3luY2hyb25pemUuaXNFbmFibGVkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJYXV0b1N5bmNocm9uaXplKTsKLQkJfQotCQlpZiAobWFudWFsU3luY2hyb25pemVBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEJlZm9yZShJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJbWFudWFsU3luY2hyb25pemVBY3Rpb24pOwotCQl9Ci0KLQkJaWYgKCEoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgTWlsZXN0b25lKSkgewotCQkJLy8gTWVudU1hbmFnZXIgZGlhZ3JhbVN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX0FjdGlvbl9EaWFncmFtcyk7Ci0JCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGVkQWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIG9wZW5CYXNlQWN0aXZpdHkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKG9wZW5Xb3JrZmxvd0VkaXRvckFjdGlvbik7Ci0JCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKG9wZW5Xb3JrZmxvd0RldGFpbEVkaXRvckFjdGlvbik7Ci0JCQkJLy8gZGlhZ3JhbVN1Yk1lbnUuYWRkKG9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24pOwotCQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChzdXBwcmVzc0RpYWdyYW1BY3Rpb24pOwotCQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChhc3NpZ25Vc2VyRGlhZ3JhbSk7Ci0JCQl9Ci0JCQkvLyBpZiAoc2VsZWN0ZWRBY3Rpdml0eSA9PSBnZXRQcm9jZXNzKCkpIHsKLQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChzdXBwcmVzc0FsbERpYWdyYW1zKTsKLQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChyZXZlYWxBbGxEaWFncmFtcyk7Ci0JCQkvLyB9Ci0JCQkvLyBFbmFibGUgdGhpcyBjb2RlIGlmIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUluZm9EaWFsb2cgaXMgbmVlZC4KLQkJCS8vIGlmKHNlbGVjdGVkQWN0aXZpdHkgIT0gbnVsbCl7Ci0JCQkvLyBkaWFncmFtU3ViTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCS8vIGRpYWdyYW1TdWJNZW51LmFkZChhY3Rpdml0eURldGFpbERpYWdyYW1JbmZvKTsKLQkJCS8vIH0KLQkJCS8vIG1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBkaWFncmFtU3ViTWVudSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTWVudU1hbmFnZXIgbmV3RGlhZ3JhbVN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfQWN0aW9uX0RpYWdyYW1zKTsgCi0JCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvcik7Ci0JCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcik7Ci0JCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld1dQRGlhZ3JhbUVkaXRvcik7Ci0JCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld1N1cHByZXNzRGlhZ3JhbUFjdGlvbik7Ci0JCQkJbmV3RGlhZ3JhbVN1Yk1lbnUuYWRkKG5ld0Fzc2lnblVzZXJEaWFncmFtKTsKLQotCQkJfQotCi0JCQlpZiAoc2VsZWN0ZWRBY3Rpdml0eSA9PSBnZXRQcm9jZXNzKCkpIHsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQoZGlhZ3JhbXNQdWJsaXNoQWxsKTsKLQkJCQluZXdEaWFncmFtU3ViTWVudS5hZGQoZGlhZ3JhbVB1Ymxpc2hOb25lKTsKLQkJCX0KLQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBuZXdEaWFncmFtU3ViTWVudSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChic0l0ZW1Qcm92aWRlciAhPSBudWxsCi0JCS8vIHRoaXMgaXMgYW4gZXhwZW5zaXZlIGNoZWNrLCByZW1vdmVkIGl0Ci0JCS8vCi0JCS8vICYmICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKQotCQkvLyBic0l0ZW1Qcm92aWRlcikuaGFzQ2hpbGRyZW4oc2VsZWN0ZWRPYmplY3QpCi0JCSkgewotCQkJbWVudU1hbmFnZXIuYXBwZW5kVG9Hcm91cCgib3BlbiIsIGV4cGFuZEFsbEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmFwcGVuZFRvR3JvdXAoIm9wZW4iLCBjb2xsYXBzZUFsbEFjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KSAoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgYWN0aXZlRWRpdG9yCi0JCQkJLmdldEVkaXRvcklucHV0KCkpLmdldE1ldGhvZEVsZW1lbnQoKSkuZ2V0UHJvY2VzcygpOwotCX0KLQotCXByb3RlY3RlZCBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuICgoUHJvY2Vzc0VkaXRvcikgYWN0aXZlRWRpdG9yKS5zdXBwcmVzc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZXBvcHVsYXRlRHluYW1pY01lbnVJdGVtcygpIHsKLQkJLy8gUmVtb3ZlIGFueSBtZW51IGl0ZW1zIGZvciBvbGQgc2VsZWN0aW9uLgotCQkvLwotCQlpZiAoY3JlYXRlQ2hpbGRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlkZXBvcHVsYXRlTWFuYWdlcihjcmVhdGVDaGlsZE1lbnVNYW5hZ2VyLCBjcmVhdGVDaGlsZEFjdGlvbnMpOwotCQl9Ci0JCWlmIChjcmVhdGVTaWJsaW5nTWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZGVwb3B1bGF0ZU1hbmFnZXIoY3JlYXRlU2libGluZ01lbnVNYW5hZ2VyLCBjcmVhdGVTaWJsaW5nQWN0aW9ucyk7Ci0JCX0KLQkJY3JlYXRlQ2hpbGRBY3Rpb25zID0gbnVsbDsKLQkJY3JlYXRlU2libGluZ0FjdGlvbnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCBhY3Rpb24gc3RhdGUgdG8gZW5hYmxlZCBvciBkaXNhYmxlZAotCSAqIAotCSAqIEBwYXJhbSBsb2NrZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY3Rpb25TdGF0ZSgpIHsKLQkJaWYgKGxvY2tlZCkgewotCQkJLy8gZGlzYWJsZSBtb2RpZnlpbmcgYWN0aW9ucwotCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljdXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkKLQkJCWZvcihJQWN0aW9uIGFjdGlvbiA6IHJlZ2lzdGVyZWRBY3Rpb25zKSB7Ci0JCQkJaWYoYWN0aW9uIGluc3RhbmNlb2YgSU1vZGlmeWluZ0FjdGlvbikgewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKCFvbGRMb2NrZWQpIHsKLQkJCS8vIHVwZGF0ZSBzdGF0ZSBvZiBtb2RpZnlpbmcgYWN0aW9ucwotCQkJLy8KLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQoY3V0QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQocGFzdGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZGVsZXRlQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pKTsKLQkJCQotCQkJZm9yKElBY3Rpb24gYWN0aW9uIDogcmVnaXN0ZXJlZEFjdGlvbnMpIHsKLQkJCQlpZihhY3Rpb24gaW5zdGFuY2VvZiBJTW9kaWZ5aW5nQWN0aW9uKSB7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGFjdGlvbiBpbnN0YW5jZW9mIENvbW1hbmRBY3Rpb25IYW5kbGVyID8gCi0JCQkJCQkJKChDb21tYW5kQWN0aW9uSGFuZGxlcilhY3Rpb24pLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pIDogdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiBlbmFibGVkID0gIWxvY2tlZDsKLQotCQlhZGRBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJY29udHJpYnV0ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCS8vIHN0YXRlIG9mIHRoZXNlIGFjdGlvbnMgaXMgc2V0IGluIHVwZGF0ZUFjdGlvbnMoKQotCQkvLwotCQkvLyBtb3ZlRG93bkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkvLyBtb3ZlVXBBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8gcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCS8vIHN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXJlcGxhY2VBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJbG9jYWxSZXBsYWNlbWVudEFuZERlZXBDb3B5LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXJldmVhbEFsbERpYWdyYW1zLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXN1cHByZXNzQWxsRGlhZ3JhbXMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJc3VwcHJlc3NEaWFncmFtQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWNvcHlBY3Rpdml0eUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlleHRlbmRBY3Rpdml0eUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlkZWVwQ29weUFjdGl2aXR5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2VuZXJhdGVDcmVhdGVDaGlsZEFjdGlvbnMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZW5lcmF0ZUNyZWF0ZUNoaWxkQWN0aW9ucyhkZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZW5lcmF0ZUNyZWF0ZVNpYmxpbmdBY3Rpb25zKENvbGxlY3Rpb24gZGVzY3JpcHRvcnMsCi0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAobG9ja2VkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2VuZXJhdGVDcmVhdGVTaWJsaW5nQWN0aW9ucyhkZXNjcmlwdG9ycywgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3Ijc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlJU2VsZWN0aW9uIHNlbCA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbDsKLQkJCW9sZExvY2tlZCA9IGxvY2tlZDsKLQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0KLQkJCXNlbGVjdGlvbiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkudG9MaXN0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJc2VsZWN0ZWRPYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWwpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChzZWxlY3RlZE9iamVjdCk7Ci0JCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gb2JqOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlzZWxlY3RlZEFjdGl2aXR5ID0gKEFjdGl2aXR5KSBvYmo7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKTsKLQkJCQkJLy8gYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCQlzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQkJCQl9Ci0JCQkJQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgYWN0aXZlRWRpdG9yKQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQlPYmplY3QgcHJvdmlkZXJPYmogPSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCXNlbGVjdGVkT2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm92aWRlck9iaiBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikKLQkJCQkJYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBwcm92aWRlck9iajsKLQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBvYmo7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWRlcG9wdWxhdGVEeW5hbWljTWVudUl0ZW1zKCk7Ci0JCQkJYnNJdGVtUHJvdmlkZXIgPSBudWxsOwotCQkJCXNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCQkJc2VsZWN0ZWRBY3Rpdml0eSA9IG51bGw7Ci0JCQkJc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50ID0gbnVsbDsKLQkJCQlzZWxlY3RlZE9iamVjdCA9IG51bGw7Ci0JCQl9Ci0KLQkJCXVwZGF0ZUFjdGlvbnMoKTsKLQotCQl9IGVsc2UgewotCQkJZGVwb3B1bGF0ZUR5bmFtaWNNZW51SXRlbXMoKTsKLQkJCWJzSXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJCXNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCQlzZWxlY3RlZEFjdGl2aXR5ID0gbnVsbDsKLQkJCXNlbGVjdGVkQnJlYWtkb3duRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQkvLyAvLyB0ZXN0IGNvZGUKLQkJLy8gLy8KLQkJLy8gaWYoc2VsZWN0ZWRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9Ci0JCS8vIHNlbGVjdGVkQWN0aXZpdHkuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0JCS8vIGlmKFN0cmluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGF0dHJpYi5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKSkpCi0JCS8vIHsKLQkJLy8gTGlzdCB2YWx1ZXMgPQotCQkvLyBDb25maWd1cmF0aW9uSGVscGVyLmdldFN0cmluZ0F0dHJpYnV0ZShzZWxlY3RlZEFjdGl2aXR5LCBhdHRyaWIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGF0dHJpYi5nZXROYW1lKCkgKyAiOiAiICsgdmFsdWVzKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGFjdGlvbnMgaW5jbHVkaW5nIGVuYWJsaW5nL2Rpc2FibGluZyB0aGVtIGJhc2VkIG9uIHNlbGVjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGlvbnMoKSB7Ci0JCXNob3dJbkxpYnJhcnlWaWV3Ci0JCQkJLnNldEVuYWJsZWQoc2VsZWN0ZWRCcmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcgotCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBzZWxlY3RlZEJyZWFrZG93bkVsZW1lbnQpICE9IG51bGwpOwotCi0JCWlmICghbG9ja2VkICYmIHNlbGVjdGlvbiAhPSBudWxsICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7CQkJCQotCQkJCU9iamVjdCBvID0gc2VsZWN0aW9uLmdldCgwKTsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJaWYoUHJvY2Vzc1V0aWwuaXNSb2xsZWRVcERlc2NyaXB0b3IobywgYWRhcHRlckZhY3RvcnkpKSB7Ci0JCQkJCXJldmVhbEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoc2VsZWN0aW9uKSkgewotCQkJCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfSBlbHNlIGlmIChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKHNlbGVjdGlvbikpIHsKLQkJCQkJCXN1cHByZXNzQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV2ZWFsQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5SZXZlYWwoc2VsZWN0aW9uKSk7Ci0JCQkJc3VwcHJlc3NBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblN1cHByZXNzKAotCQkJCQkJc2VsZWN0aW9uKSk7Ci0JCQl9Ci0KLQkJCS8vIEFjdGlvbiBFbmFibGUvRGlzYWJsZSBmb3IgU3VwcHJlc3MgVGFzay9SZXZlYWwgVGFzayBjb250ZXh0IG1lbnUKLQkJCWJvb2xlYW4gc2hvdyA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbi5zaXplKCk7IGkrKykgewotCQkJCWlmIChnZXRBZGFwdGVyRmFjdG9yeSgpID09IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCi0JCQkJCWlmICghKHNlbGVjdGlvbi5nZXQoaSkgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBzZWxlY3Rpb24KLQkJCQkJCQkuZ2V0KGkpIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSkgewotCQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJc2hvdyA9IGZhbHNlOwotCQkJfQotCQkJaWYgKHNob3cpIHsKLQkJCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JzKHNlbGVjdGlvbik7Ci0JCQkJc3VwcHJlc3NUYXNrQWN0aW9uLnNldEVuYWJsZWQoZ2V0U3VwcHJlc3Npb24oKS5jYW5TdXBwcmVzcygKLQkJCQkJCXRhc2tEZXNjcmlwdG9ycykpOwotCQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChnZXRTdXBwcmVzc2lvbigpLmNhblJldmVhbCgKLQkJCQkJCXRhc2tEZXNjcmlwdG9ycykpOwotCQkJfSBlbHNlIHsKLQkJCQlzdXBwcmVzc1Rhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV2ZWFsVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJLy8gYm9vbGVhbiBoYXNJbmhlcml0ZWQgPSBmYWxzZTsKLQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCS8vIE9iamVjdCBpdGVtID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZiAoaXRlbSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkvLyAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtKQotCQkJLy8gLmlzUmVhZE9ubHkoKSkgewotCQkJLy8gaGFzSW5oZXJpdGVkID0gdHJ1ZTsKLQkJCS8vIGJyZWFrOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gdXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUFjdGlvbi5zZXRFbmFibGVkKGhhc0luaGVyaXRlZCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXZlYWxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzdXBwcmVzc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXN1cHByZXNzVGFza0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldmVhbFRhc2tBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQkvLyBTZXQgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gQWN0aW9uIGVuYWJsZSBzdGF0ZS4KLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQl8fCBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotLy8JCQlzZXRBY3Rpb25TdGF0ZUZvckFERCgpOwotCQkJc2V0RGlhZ3JhbXNDb250ZXh0TWVudVN0YXRlKCk7Ci0JCX0KLQotCQkvLyBjaGFuZ2UgYWN0aW9uIHN0YXRlIGZvciBsb2NrZWQgcGx1Z2luCi0JCXNldEFjdGlvblN0YXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBwYXJ0KSB7Ci0JCWlmICh0aGlzLmFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQlpbnQgcGFnZSA9ICgoUHJvY2Vzc0VkaXRvcikgdGhpcy5hY3RpdmVFZGl0b3IpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnMgPSB0aGlzLmFjdGl2ZUVkaXRvci5nZXRFZGl0b3JTaXRlKCkKLQkJCQkJLmdldEFjdGlvbkJhcnMoKTsKLQotCQkJLy8gVE9ETyAtIG5lZWQgdG8gZ2V0IElGb3JtUGFnZSBhbmQgY29tcGFyZSBvbiB0aGF0IHJhdGhlciB0aGFuCi0JCQkvLyBpbnRlZ2VyIHBhZ2UgaWQuIFRoZXNlIGlkIHdpbGwgY2hhbmdlIGlmIHdlIHJlcG9zaXRpb24gcGFnZXMuCi0JCQlpZiAocGFnZSA9PSAwKSB7CQkJCi0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DVVQuZ2V0SWQoKSwKLQkJCQkJCW51bGwpOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCW51bGwpOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5SRURPLmdldElkKCksCi0JCQkJCQludWxsKTsKLQkJCX0gZWxzZSBpZiAocGFnZSA9PSA0KSB7Ci0JCQkJYWN0aW9uQmFycy5jbGVhckdsb2JhbEFjdGlvbkhhbmRsZXJzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwKLQkJCQkJCWRlbGV0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuQ1VULmdldElkKCksCi0JCQkJCQljdXRBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSwKLQkJCQkJCWNvcHlBY3Rpb24pOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJCQlwYXN0ZUFjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRJZCgpLAotCQkJCQkJdW5kb0FjdGlvbik7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCQkJcmVkb0FjdGlvbik7Ci0JCQl9Ci0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3VwZXJEb1JlZnJlc2goKSB7Ci0JCXN1cGVyLmRvUmVmcmVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaCgpIHsKLQkJaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGRpc3BsYXksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gdXBkYXRlIElEcwotCQkJCQkvLwotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkJfHwgYWRhcHRlckZhY3RvcnkgPT0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHByb2MpOwotLy8JCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCVByb2Nlc3NVdGlsLnJlZnJlc2hQcmVkZWNjZXNzb3JMaXN0cyhhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0vLwkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKCkgdG9vazogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQkJCQkJfQotCi0JCQkJCXN1cGVyRG9SZWZyZXNoKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogU2V0IEFjdGlvbiBzdGF0ZSBmb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gaW4gQ29udGV4dCBNZW51IG9uIHNlbGVjdGlvbgotCSAqIG9mIEFjdGl2aXR5LiBJZiBhbiBBY3Rpdml0eSBjb25zaXN0IGF0bGVhc3Qgb25lIHRhc2tkZXNjcmlwdG9yIGFuZCBpdHMKLQkgKiBwcmltYXJ5IHBlcmZvcm1lciBpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIHRoZW4gc3RhdGUgaXMgZW5hYmxlZCBlbHNlCi0JICogc3RhdGUgaXMgZGlzYWJsZWQgaW4gY29udGV4dCBtZW51IChwcm9jZXNzIGVkaXRvcikuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QWN0aW9uU3RhdGVGb3JBREQoKSB7Ci0KLQkJLy8gc2V0IEFERCBBY3Rpb24gc3RhdGUgZmFsc2UKLQkJb3BlbldvcmtmbG93RGV0YWlsRWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIHNldCBBRCBBY3Rpb24gc3RhdGUgdHJ1ZSBhbHdheXMKLQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJLy8gc2V0IFdQRCBEaWFncmFtIE1lbnUgQWN0aW9uIHN0YXRlIHRydSBhbHdheXMKLQkJb3BlbldQRGVwZW5kZW5jeUVkaXRvckFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCWlmIChzZWxlY3RlZE9iamVjdCAhPSBudWxsKSB7Ci0KLQkJCWlmIChnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChzZWxlY3RlZE9iamVjdCkpIHsKLQkJCQlvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW9wZW5XUERlcGVuZGVuY3lFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdHkgPSBzZWxlY3RlZEFjdGl2aXR5OwotCQkJfSBlbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgc2VsZWN0ZWRPYmplY3QpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkvLyBJZiBBY3Rpdml0eSBpcyBzZXQgdG8gbG9jYWwgY29udHJpYnV0aW9uLAotCQkJCS8vIG5lZWQgdG8gZ2V0IGJyZWFrZG93biBlbGVtZW50cyBvZiBsb2NhbCBjb250cmlidXRlZAotCQkJCS8vIGFjdGl2aXR5ICsgYmFzZSBhY3Rpdml0eS4gQW5kIGJhc2UgYWN0aXZpdHkgYnJlYWtkb3duCi0JCQkJLy8gZWxlbWVudHMKLQkJCQkvLyBhcmUgY29sbGVjdGVkIGFmdGVyIHdoaWxlIGxvb3AgZW5kcykKLQkJCQkvLyBpZiAoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTX0xJVEVSQUwuZXF1YWxzKGFjdGl2aXR5Ci0JCQkJLy8gLmdldFZhcmlhYmlsaXR5VHlwZSgpKSkgewotCQkJCS8vIGxpc3QuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCQkJCS8vIH0KLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIEZvciBBRCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBBRCBkaWFncmFtLCBkb25vdCBzaG93IEFEIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudSBmb3IKLQkJCS8vIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJRGlhZ3JhbSBkaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKAotCQkJCQlhY3Rpdml0eSwgR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJb3BlbldvcmtmbG93RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBGb3IgV1BEIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCS8vIFdQRCBkaWFncmFtLCBkb25vdCBzaG93IFdQRCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCS8vIGZvciByZWFkb25seSBhY3Rpdml0eS4KLQkJCWRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCWFjdGl2aXR5LAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0sIGZhbHNlKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlvcGVuV1BEZXBlbmRlbmN5RWRpdG9yQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBDb2xsZWN0IHRoZSBicmVha2Rvd24gZWxlbWVudHMgdG8gdmVyaWZ0eSB0YXNrZGVzY3JpcHRvcnMgYXJlCi0JCQkvLyBub3QuCi0JCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJLy8gRm9yIEFERCBkaWFncmFtIG1lbnUgb3B0aW9uLCBpZiBCYXNlIEFjdGl2aXR5IGRvbm90IGhhdmUgYW55Ci0JCQkvLyBBREQgZGlhZ3JhbSwgZG9ub3Qgc2hvdyBBREQgZGlhZ3JhbSBvcHRpb24gaW4gY29udGV4dCBtZW51Ci0JCQkvLyBmb3IKLQkJCS8vIHJlYWRvbmx5IGFjdGl2aXR5LgotCQkJZGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbSgKLQkJCQkJYWN0aXZpdHksIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sCi0JCQkJCWZhbHNlKTsKLQkJCWlmIChkaWFncmFtID09IG51bGwKLQkJCQkJJiYgc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgTGlzdCwgdG8gZmluZCB0YXNrZGVzY3JpcHRvciBhbmQgaGFzCi0JCQkJLy8gcHJpbWFyeSByb2xlIHdpdGhpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCQkJLy8gdGhlbiBlbmFibGUgdGhlIGFjdGlvbi4KLQkJCQlmaW5kUm9sZURlc2M6Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCWlmICghZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQob2JqKSkgewotCQkJCQkJCUxpc3Q8Um9sZURlc2NyaXB0b3I+IHByaW1hcnlQZXJmb3JtZXJzID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pICgoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgYWN0aXZlRWRpdG9yKQotCQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCQkJaWYgKGZhY3RvcnkgaW5zdGFuY2VvZiBFeHBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSAoKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgZmFjdG9yeSkKLQkJCQkJCQkJCQkuZ2V0RmlsdGVyKCk7Ci0JCQkJCQkJCWZvciAoUm9sZURlc2NyaXB0b3IgZSA6IHByaW1hcnlQZXJmb3JtZXJzKSB7Ci0JCQkJCQkJCQlpZiAoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChlKQotCQkJCQkJCQkJCQkmJiAhZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoZSkpIHsKLQkJCQkJCQkJCQlvcGVuV29ya2Zsb3dEZXRhaWxFZGl0b3JBY3Rpb24KLQkJCQkJCQkJCQkJCS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCQkJCWJyZWFrIGZpbmRSb2xlRGVzYzsKLQkJCQkJCQkJCX0JCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogU2V0IEFjdGlvbiBzdGF0ZSBmb3IgT3BlbiBEaWFncmFtIEFjdGlvbnMgaW4gQ29udGV4dCBNZW51IG9uCi0JICogc2VsZWN0aW9uIG9mIEFjdGl2aXR5LiBDaGVja2luZyBjb25kaXRpb24gdG8gaGFuZGxlIGlmIGFjdGl2aXR5IHN1cHByZXNzZWQsIGlmIGFjdGl2aXR5IGRvbid0IGhhdmUKLQkgKiBhbnkgdGFza2Rlc2NyaXB0b3IgYW5kIHByaW1hcnkgcGVyZm9ybWVyLCBpZiBiYXNlIGFjdGl2aXR5IGRvbid0IGhhdmUgZGlhZ3JhbS4gCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldERpYWdyYW1zQ29udGV4dE1lbnVTdGF0ZSgpIHsKLQotCQkvLyBzZXQgQUREIEFjdGlvbiBzdGF0ZSBmYWxzZQotCQluZXdBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJLy8gc2V0IEFEIEFjdGlvbiBzdGF0ZSB0cnVlIGFsd2F5cwotCQluZXdBY3Rpdml0eURpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQkvLyBzZXQgV1BEIERpYWdyYW0gTWVudSBBY3Rpb24gc3RhdGUgdHJ1IGFsd2F5cwotCQluZXdXUERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCi0JCQlpZiAoZ2V0U3VwcHJlc3Npb24oKS5pc1N1cHByZXNzZWQoc2VsZWN0ZWRPYmplY3QpKSB7Ci0JCQkJbmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5ld0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQluZXdXUERpYWdyYW1FZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlPYmplY3QgdW53cmFwcGVkID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRPYmplY3QpOwotCQkJaWYoISh1bndyYXBwZWQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdW53cmFwcGVkOwotCQkJTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQotCQkJLy9UT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgZGlhZ3JhbXMgaW4gaW1tZWRpYXRlIGJhc2UgaW5zdGVhZCBvZiByb290IGJhc2UKLQkJCQotCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0gZGlhZ3JhbSA9ICgoUHJvY2Vzc0VkaXRvcikgZ2V0QWN0aXZlRWRpdG9yKCkpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySGVscGVyKCkuZ2V0RGlhZ3JhbShhY3Rpdml0eSwKLQkJCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJbmV3QWN0aXZpdHlEaWFncmFtRWRpdG9yLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQkvLyBGb3IgV1BEIGRpYWdyYW0gbWVudSBvcHRpb24sIGlmIEJhc2UgQWN0aXZpdHkgZG9ub3QgaGF2ZSBhbnkKLQkJCS8vIFdQRCBkaWFncmFtLCBkb25vdCBzaG93IFdQRCBkaWFncmFtIG9wdGlvbiBpbiBjb250ZXh0IG1lbnUKLQkJCS8vIGZvciByZWFkb25seSBhY3Rpdml0eS4KLQkJCWRpYWdyYW0gPSAoKFByb2Nlc3NFZGl0b3IpIGdldEFjdGl2ZUVkaXRvcigpKQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvckhlbHBlcigpLmdldERpYWdyYW0oYWN0aXZpdHksCi0JCQkJCQkJSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pOwotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCW5ld1dQRGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJLy8gQ29sbGVjdCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHRvIHZlcmlmdHkgdGFza2Rlc2NyaXB0b3JzIGFyZQotCQkJLy8gbm90LgotCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0KLQkJCS8vIEZvciBBREQgZGlhZ3JhbSBtZW51IG9wdGlvbiwgaWYgQmFzZSBBY3Rpdml0eSBkb25vdCBoYXZlIGFueQotCQkJLy8gQUREIGRpYWdyYW0sIGRvbm90IHNob3cgQUREIGRpYWdyYW0gb3B0aW9uIGluIGNvbnRleHQgbWVudQotCQkJLy8gZm9yCi0JCQkvLyByZWFkb25seSBhY3Rpdml0eS4KLQkJCWRpYWdyYW0gPSAoKFByb2Nlc3NFZGl0b3IpIGdldEFjdGl2ZUVkaXRvcigpKQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvckhlbHBlcigpLmdldERpYWdyYW0oYWN0aXZpdHksCi0JCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKTsKLQotCQkJaWYgKGRpYWdyYW0gPT0gbnVsbAotCQkJCQkmJiBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCW5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBMaXN0LCB0byBmaW5kIHRhc2tkZXNjcmlwdG9yIGFuZCBoYXMKLQkJCQkvLyBwcmltYXJ5IHJvbGUgd2l0aGluIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJCQkvLyB0aGVuIGVuYWJsZSB0aGUgYWN0aW9uLgotCQkJCWZpbmRSb2xlRGVzYzoKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJaWYgKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvYmopKSB7Ci0JCQkJCQkJTGlzdDxSb2xlRGVzY3JpcHRvcj4gcHJpbWFyeVBlcmZvcm1lcnMgPSAoKFRhc2tEZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJCQkJCQlBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZG9tYWluID0gKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgKChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBhY3RpdmVFZGl0b3IpCi0JCQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBkb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJCQlpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJCQkJCQlJRmlsdGVyIGZpbHRlciA9ICgoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KSBmYWN0b3J5KQotCQkJCQkJCQkJCS5nZXRGaWx0ZXIoKTsKLQkJCQkJCQkJZm9yIChSb2xlRGVzY3JpcHRvciBlIDogcHJpbWFyeVBlcmZvcm1lcnMpIHsKLQkJCQkJCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuYWNjZXB0KGUpCi0JCQkJCQkJCQkJCSYmICFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCQkJCQkJCW5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcgotCQkJCQkJCQkJCQkJLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZFJvbGVEZXNjOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL1Byb2Nlc3NFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWM1NzhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9Qcm9jZXNzRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci0KLS8qKgotICogQW4gZWRpdG9yIGlucHV0IGZvciBwcm9jZXNzIGVkaXRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VkaXRvcklucHV0IGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IHsKLQlwcml2YXRlIElTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQlwcml2YXRlIGludCBhY3RpdmVQYWdlID0gLTE7Ci0KLQlwdWJsaWMgUHJvY2Vzc0VkaXRvcklucHV0KE1ldGhvZEVsZW1lbnQgZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWN0aXZlIHBhZ2Ugb2YgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIGFjdGl2ZVBhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFjdGl2ZSBwYWdlIGZvciB0aGUgZWRpdG9yCi0JICogQHBhcmFtIGFjdGl2ZVBhZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKGludCBhY3RpdmVQYWdlKSB7Ci0JCXRoaXMuYWN0aXZlUGFnZSA9IGFjdGl2ZVBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGluaXRpYWwgc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqIAkJCVNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldEluaXRpYWxTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBpbml0aWFsU2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldCBpbml0aWFsIHNlbGVjdGlvbiAKLQkgKiBAcGFyYW0gaW5pdGlhbFNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTZWxlY3Rpb24oSVNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCXRoaXMuaW5pdGlhbFNlbGVjdGlvbiA9IGluaXRpYWxTZWxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZWRpdG9ycy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMjcyNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9lZGl0b3JzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIG1ldGhvZCwgcHJvY2VzcyBhbmQgYWN0aXZpdHkgZGlhZ3JhbSBlZGl0b3JzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BYnN0cmFjdEJhc2VGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BYnN0cmFjdEJhc2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliMjM0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWJzdHJhY3RCYXNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgVUkgZmlsdGVycy4gU3VwcG9ydHMgbXVsdGlwbGUgZmlsdGVycy4KLSAqIFN1cHBvcnQgZmlsdGVyaW5nIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBwYXR0ZXJuIGFuZCB0eXBlLiAKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RCYXNlRmlsdGVyIHsKLQotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJvdGVjdGVkIElGaWx0ZXJbXSBhZGRpdGlvbmFsRmlsdGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBhZGRlZCBmb3IgZnV0aGVyIGZpbHRlcmluZy4gRm9yIGV4YW1wbGUsIHdlIG1heSBzZXQgYSBmaWxlciB0byBwcmV2ZW50Ci0JICogZ2VuZXJhbGl6ZXJzIGFzIGJhc2UgZWxlbWVudCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JICogCi0JICogQHBhcmFtIGFkZGl0aW9uYWxGaWx0ZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEZpbHRlcnMoSUZpbHRlcltdIGFkZGl0aW9uYWxGaWx0ZXJzKSB7Ci0JCXRoaXMuYWRkaXRpb25hbEZpbHRlcnMgPSBhZGRpdGlvbmFsRmlsdGVyczsKLQl9Ci0KLQlwdWJsaWMgRmlsdGVySGVscGVyIGdldEhlbHBlcigpIHsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQl9Ci0KLQkvKgotCSAqIHN1YmNsYXNzIG1ldGhvZCBzaG91bGQgY2FsbCB0aGlzIGJlZm9yZSByZXR1cm5pbmcgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCS8vIEppbmh1YSBYaSwgYWRkZWQgZm9yIGZ1dGhlciBmaWx0ZXJpbmcuCi0JCS8vIEZvciBleGFtcGxlLCB3ZSBtYXkgc2V0IGEgZmlsZXIgdG8gcHJldmVudCBnZW5lcmFsaXplcnMgYXMgYmFzZQotCQkvLyBlbGVtZW50IHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkJaWYgKGFkZGl0aW9uYWxGaWx0ZXJzICE9IG51bGwgJiYgYWRkaXRpb25hbEZpbHRlcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsRmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChhZGRpdGlvbmFsRmlsdGVyc1tpXS5hY2NlcHQob2JqKSA9PSBmYWxzZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiZGU1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0vKioKLSAqIEFjdGl2aXR5IHZhcmlhYmlsaXR5IGZpbHRlcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyIGV4dGVuZHMgRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yIHsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCQotCXByaXZhdGUgTGlzdCB0cmVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgZ2VuZXJhbGl6ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBiYXNlZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGJhZGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lLCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlcik7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJCi0JCS8vIGxvYWQgdGhlIHBhcmVudGxpc3QKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlciA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUZpbHRlclV0aWwuZ2V0U3ViVHJlZShhZGFwdGVyLCBhY3Rpdml0eSwgdHJlZUxpc3QpOwotCQlGaWx0ZXJVdGlsLmdldEdlbmVyYWxpemVycyh0cmVlTGlzdCwgZ2VuZXJhbGl6ZXJzKTsKLQkJRmlsdGVyVXRpbC5nZXRWYXJpYWJpbGl0eUJhc2UodHJlZUxpc3QsIGJhc2VlbGVtZW50cyk7Ci0JCQotCQlGaWx0ZXJVdGlsLmdldFN1YlRyZWUoYWRhcHRlciwgZ2VuZXJhbGl6ZXJzLCBiYWRlbGVtZW50cyk7Ci0JCUZpbHRlclV0aWwuZ2V0U3ViVHJlZShhZGFwdGVyLCBiYXNlZWxlbWVudHMsIGJhZGVsZW1lbnRzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjaGlsZEFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSl7Ci0JCQkJaWYodGhpcy5hY3Rpdml0eS5lcXVhbHMoKEFjdGl2aXR5KSBvYmopKSAKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKChBY3Rpdml0eSlvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZihlICE9IG51bGwgJiYgYWN0aXZpdHkuZXF1YWxzKGUpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBvYmopOwotCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSB0aGlzLmFjdGl2aXR5KTsKLQkJCQlpZiAoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcwotCQkJCQkJJiYgdGFyZ2V0UHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJaWYoVG5nVXRpbC5jb250YWlucyhnZW5lcmFsaXplcnMsIG9iaikgCi0JCQkJLy9Db21tZW50IHRoaXMgb3V0IGR1ZSB0byAxODI1MzEsIG90aGVyIGNhc2VzIG1pc3NpbmcgdGhpcyBjaGVjayBoZXJlCi0JCQkJLy9zaG91bGQgYmUgY29tcGVuc2F0ZWQgYnkgY2lyY3VsYXIgY2hlY2sgYWZ0ZXIgZmlsdGVyIHNlbGVjdGlvbi4KLQkJCQkvL0JldHRlciBmaXggaXMgdG8gaW5jbHVkZSB0aGUgY2lyY3VsYXIgY2hlY2sgaW50byB0aGUgZmlsdGVyIGxvZ2ljLgkJCi0JCQkJLy8gfHwgVG5nVXRpbC5jb250YWlucyhiYXNlZWxlbWVudHMsIG9iaikJCQkJCQkKLQkJCQkvLwkJfHxUbmdVdGlsLmNvbnRhaW5zKGJhZGVsZW1lbnRzLCBvYmopCi0JCQkJCQkpewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2Vzcykgb2JqOwotLy8JCQkJaWYgKHByb2MuZXF1YWxzKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0aGlzLmFjdGl2aXR5KSkpCi0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLS8vCQkJCWlmKFRuZ1V0aWwuY29udGFpbnMoY29udHJpYnV0b3JzLCBvYmopKSByZXR1cm4gZmFsc2U7Ci0vLwkJCQlpZihUbmdVdGlsLmNvbnRhaW5zKHZhcmlhYmlsaXR5YmFzZXMsIG9iaikpIHJldHVybiBmYWxzZTsKLS8vCQkJCWlmKG9iai5lcXVhbHMoRmlsdGVyVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAKLS8vCQkJCQkJYWN0aXZpdHkpKSkgcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0JCQkKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWRkTGlua0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FkZExpbmtGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4ZjA0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQWRkTGlua0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Db250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUFsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBGaWx0ZXIgZm9yIEFkZExpbmsgaW4gUmljaFRleHRFZGl0b3IuCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQWRkTGlua0ZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzIElBbGxGaWx0ZXIgewotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCi0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZihvYmogPT0gbnVsbCApcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbHRlclR5cGVTdHJpbmcgPSBoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpOwotCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwKLQkJCQkmJiAhKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCWlmIChvYmouZXF1YWxzKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZmlsdGVyVHlwZVN0cmluZyA9PSBudWxsCi0JCQkJfHwgZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUykpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJCXJldHVybiAhKChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iaikuZ2V0RGlzY2lwbGluZXMoKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCXJldHVybiB0cnVlOy8vIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpb2JqKS5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQkJcmV0dXJuICEoKFJvbGVTZXRHcm91cGluZykgb2JqKS5nZXRSb2xlU2V0cygpLmlzRW1wdHkoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ly8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldClvYmopLmlzRW1wdHkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCQotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVMpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UQVNLUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2spCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUykpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFMpKSB7IC8vMTcyOTU2Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05DRVBUUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5FWEFNUExFUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUykpIHsKLQkJCQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5URU1QTEFURVMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5URVJNX0RFRklOSVRJT05TKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTKSkgewotCQkJCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlMpKSB7Ci0JCQkKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSB8fCBvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0IHx8IG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAoT2JqZWN0IG9iaiwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHMoCi0JCQkJCXR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FsbEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0FsbEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGJhYTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9BbGxGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuUHJvY2Vzc2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogRmlsdGVyIGZvciBhbGwgZWxlbWVudHMgZWc6IHVzZWQgaW4ge0BsaW5rIEN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZX0gCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWxsRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMgSUFsbEZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXIjZ2V0T2JqZWN0KCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbHRlclR5cGVTdHJpbmcgPSBoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpOwotCQlPYmplY3QgY29udGVudEVsZW1lbnQgPSBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWlmIChoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKAotCQkJCQkJKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkuY29udGFpbnMob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwKLQkJCQkmJiAhKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgfHwgb2JqIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCWlmKG9iaiA9PSBudWxsKXsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iai5lcXVhbHMoaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChmaWx0ZXJUeXBlU3RyaW5nID09IG51bGwKLQkJCQl8fCBmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTKQotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5NRVRIT19QTFVHSU5TKQotCQkJCXx8IGZpbHRlclR5cGVTdHJpbmcKLQkJCQkJCS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk9OTFlfQ09OVEVOVF9FTEVNRU5UUykpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmopKSB7Ci0JCQkJCWlmICgoKEN1c3RvbUNhdGVnb3J5KSBvYmopLmdldENhdGVnb3JpemVkRWxlbWVudHMoKQotCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCQkJLmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCUNvbGxlY3Rpb24gbGlzdCA9ICgoQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLwkJCi0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQkJcmV0dXJuICEoKERpc2NpcGxpbmVHcm91cGluZykgb2JqKS5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ly8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlvYmopLmlzRW1wdHkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdENhdGVnb3JpZXNHcm91cChvYmosIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQkJcmV0dXJuICEoKFJvbGVTZXRHcm91cGluZykgb2JqKS5nZXRSb2xlU2V0cygpLmlzRW1wdHkoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ly8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldClvYmopLmlzRW1wdHkoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gYWNjZXB0Q2F0ZWdvcmllc0dyb3VwKG9iaiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ET01BSU5TKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlRPT0xTKSkgewotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBhY2NlcHRDYXRlZ29yaWVzR3JvdXAob2JqLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUk9MRVMpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVEFTS1MpKSB7IAotCi0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKSkgeyAKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSkpIHsgCi0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUykpIHsgLy8xNzI5NTYKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5FWEFNUExFUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRXhhbXBsZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfWVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKQotCQkJCXJldHVybiB0cnVlOwotCQl9ZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUykpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybkJhc2VkT25UeXBlKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5URU1QTEFURVMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5URVJNX0RFRklOSVRJT05TKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTKSkgewotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIGFjY2VwdE1ldGhvZFBsdWdpbihvYmosIGNvbnRlbnRFbGVtZW50KTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKQotCQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGVTdHJpbmcuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlMpKSB7Ci0JCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5CYXNlZE9uVHlwZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUgfHwgb2JqIGluc3RhbmNlb2YgVGFzawotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCB8fCBvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSByZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlU3RyaW5nLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMpKSB7Ci0KLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHJldHVybiB0cnVlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiBhY2NlcHRNZXRob2RQbHVnaW4ob2JqLCBjb250ZW50RWxlbWVudCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZVN0cmluZy5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLlBST0NFU1NFUykpIHsKLQotCQkJaWYgKCFoZWxwZXIubWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkvLyBpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gYWNjZXB0TWV0aG9kUGx1Z2luKG9iaiwgY29udGVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb2xsZWN0aW9uIGxpc3QgPSAoKFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJLmdldENoaWxkcmVuKG9iaik7Ci0JCQkJZm9yIChJdGVyYXRvciBpb3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGlvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCQlpZiAoKChDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLmlzRW1wdHkoKSkKLQkJCQkJCWlvci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQkJCS8vcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGNoaWxkQWNjZXB0KG9iaik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBwdWJsaWMgRmlsdGVySGVscGVyIGdldEhlbHBlcigpIHsKLQkvLyByZXR1cm4gaGVscGVyOwotCS8vIH0KLQkvLwotCS8vCQotCS8vIHB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JLy8gdGhpcy5oZWxwZXIgPSBoZWxwZXI7Ci0JLy8gfQotCXByb3RlY3RlZCBMaXN0IGdldEFuY2VzdG9ycyhDdXN0b21DYXRlZ29yeSBtZXRob2RPYmplY3QpIHsKLQkJTGlzdCBhbmNlc3Rvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJTGlzdCBvYmpMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCi0JCWdldEFuY2VzdG9ycyhhbmNlc3Rvckxpc3QsIG9iakxpc3QpOwotCi0JCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QW5jZXN0b3JzKExpc3QgYW5jZXN0b3JMaXN0LCBMaXN0IG1ldGhvZE9iamVjdExpc3QpIHsKLQkJaWYgKG1ldGhvZE9iamVjdExpc3QuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGFuY2VzdG9yTGlzdDsKLQotCQlMaXN0IGFsbFBhcmVudEN1c3RDYXRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZE9iamVjdExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDdXN0b21DYXRlZ29yeSBlbGVtZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoZWxlbWVudCk7Ci0JCQlhbGxQYXJlbnRDdXN0Q2F0cy5hZGRBbGwocGFyZW50TGlzdCk7Ci0KLQkJfQotCi0JCWFuY2VzdG9yTGlzdC5hZGRBbGwobWV0aG9kT2JqZWN0TGlzdCk7Ci0JCUxpc3QgbmV4dENoZWNrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsUGFyZW50Q3VzdENhdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFhbmNlc3Rvckxpc3QuY29udGFpbnMoZWxlbWVudCkpCi0JCQkJbmV4dENoZWNrTGlzdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0TWV0aG9kUGx1Z2luKE9iamVjdCBvYmosIE9iamVjdCBjb250ZW50RWxlbWVudCkgewotCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkuY29udGFpbnMob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdENhdGVnb3JpZXNHcm91cChPYmplY3Qgb2JqLCBTdHJpbmcgdHlwZSkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCS5nZXRDaGlsZHJlbihvYmopOwotCQkJaWYgKGxpc3QuaXNFbXB0eSgpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICgoKENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFscygKLQkJCQkJdHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NhdGVnb3J5RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ2F0ZWdvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmOGNhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ2F0ZWdvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBGaWx0ZXIgZm9yIHtAbGluayBDb250ZW50Q2F0ZWdvcnl9Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcnlGaWx0ZXIgZXh0ZW5kcyBBYnN0cmFjdEJhc2VGaWx0ZXIgaW1wbGVtZW50cwotCQlJQ2F0ZWdvcnlGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ2F0ZWdvcnlGaWx0ZXIjZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aCgpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENhdGVnb3J5UGFja2FnZVBhdGgoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoaGVscGVyLmdldENvbnRlbnRDYXRlZ29yeVRhYlN0cigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDYXRlZ29yeUZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIWhlbHBlci5jaGVja09iamVjdEFjY2VwdGVkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIGhlbHBlci5hY2NlcHRNZXRob2RQbHVnaW4ob2JqKTsKLQkJfQotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NvbnRlbnRGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Db250ZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NjkwNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0NvbnRlbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEZpbHRlciBpbXBsZW1lbnRzIHtAbGluayBJQ29udGVudEZpbHRlcn0uIEZpbHRlciBjb250ZW50IGVsZW1lbnQgaW4gY29udGVudCBwYWNrYWdlLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzIElDb250ZW50RmlsdGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuSUNvbnRlbnRGaWx0ZXIjZ2V0Q29udGVudFBhY2thZ2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFBhY2thZ2VQYXRoKCkgewotCQlyZXR1cm4gaGVscGVyLmdldFBhdGhCYXNlZE9uVGFiU3RyaW5nKGhlbHBlci5nZXRUYWJTdHIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ29udGVudEZpbHRlciNnZXRPYmplY3QoKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBmdXJ0aGVyIGZpbHRlcmluZwotCQlpZiAoIWhlbHBlci5jaGVja09iamVjdEFjY2VwdGVkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIGhlbHBlci5hY2NlcHRNZXRob2RQbHVnaW4ob2JqKTsKLQkJfQotCi0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gaGVscGVyLmFjY2VwdENvbnRlbnRQYWNrYWdlKG9iaik7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DdXN0b21DYXRlZ29yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODU0MGQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9DdXN0b21DYXRlZ29yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ3VzdG9tRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLQotLyoqCi0gKiBGaWx0ZXIgc3BlY2lmaWMgZm9yIHtAbGluayBDdXN0b21DYXRlZ29yeX0gZWxlbWVudHMuIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5RmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSUN1c3RvbUZpbHRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXIjZ2V0Q29udGVudFBhY2thZ2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFBhY2thZ2VQYXRoKCkgewotCQlyZXR1cm4gaGVscGVyLmdldFBhdGhCYXNlZE9uVGFiU3RyaW5nKGhlbHBlci5nZXRUYWJTdHIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQ3VzdG9tRmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklDdXN0b21GaWx0ZXIjZ2V0U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIGNhbid0IGJlIGFjY2RlcHRlZCBieSBzdXBlciwgcmV0dXJuLgotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIWhlbHBlci5jaGVja09iamVjdEFjY2VwdGVkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIGhlbHBlci5hY2NlcHRNZXRob2RQbHVnaW4ob2JqKTsKLQkJfQotCi0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0Rlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxZjc2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLQotLyoqCi0gKiAgTWV0aG9kIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgZmlsdGVyIGZvciBmaWx0ZXJpbmcgZWxlbWVudHMgYmFzZWQgb24gZmlsdGVyIHBhdHRlcm4KLSAqICBhbmQgdHlwZSBhZnRlciBlbGVtZW50cyBhcmUgcmVhbGl6ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhaXRvbi4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciBleHRlbmRzIENvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JU3RyaW5nIGZpbHRlclN0cjsKLQotCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCi0JcHJvdGVjdGVkIFZpZXdlciB2aWV3ZXI7Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlWaWV3ZXIgdmlld2VyLCBTdHJpbmcgZmlsdGVyU3RyKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZyk7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQl0aGlzLmZpbHRlclN0ciA9IGZpbHRlclN0cjsKLQkJdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAodmlld2VyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb24uZXF1YWxzKG9iaik7Ci0JCX0KLQotCQlpZiAoIXN1cGVyLmFjY2VwdChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZihoZWxwZXIgIT0gbnVsbCkgewotCQkJaWYgKGhlbHBlci5pc1Nob3dQcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm5PblByZXNlbnRhdGlvbk5hbWUob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWhlbHBlci5tYXRjaFBhdHRlcm4ob2JqKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFoZWxwZXIuaXNPYmplY3RJblNlbGVjdGVkSXRlbXMob2JqKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNoaWxkQWNjZXB0KG9iaikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JcHVibGljIGphdmEudXRpbC5Db2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmosCi0JCQlvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIGNoaWxkRmVhdHVyZSkgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqLCBjaGlsZEZlYXR1cmUpOwotCQkvLyBNb2RpZmllZCBjb2RlIHRvIGhhbmRsZSB0aGUgZmlsdGVyaW5nCi0JCS8vIHRvIGNoZWNrIGlmIHRoZSB2YXJpYWJpbGl0eSBvZiBwYXJlbnQgaXMgbm90IE4vQSwgZmlsdGVyIG91dCBhbHJlYWR5Ci0JCS8vIGV4aXNpdG5nCi0JCS8vIGVsZW1lbnQgZnJvbSBjaGlsZHJlbiBsaXN0LgotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iaiwgY2hpbGRGZWF0dXJlKTsKLQkJaWYoY29sICE9IG51bGwpewotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjb2wuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0b3IubmV4dCgpOwotCQkJaWYgKCFhY2NlcHQoZWxlbWVudCkpCi0JCQkJaXRvci5yZW1vdmUoKTsKLQkJfQotCQl9ZWxzZXsKLQkJCWNvbCA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhlbHBlcihGaWx0ZXJIZWxwZXIgaGVscGVyKSB7Ci0JCXRoaXMuaGVscGVyID0gaGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKQotCXsKLQkJc3VwZXIuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl0aGlzLm1ldGhvZENvbmZpZ3VyYXRpb24gPSBjb25maWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmEyMDZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotCi0KLS8qKgotICoge0BsaW5rIFByb2Nlc3N9IGZpbHRlciBmb3IgZmlsdGVyaW5nIHtAbGluayBQcm9jZXNzfSBlbGVtZW50cy4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyIGV4dGVuZHMgQWJzdHJhY3RCYXNlRmlsdGVyIGltcGxlbWVudHMKLQkJSVByb2Nlc3NGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JRmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gaWYgY2FuJ3QgYmUgYWNjZGVwdGVkIGJ5IHN1cGVyLCByZXR1cm4uCi0JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghaGVscGVyLmlzT2JqZWN0SW5TZWxlY3RlZEl0ZW1zKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghbWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChjaGlsZEFjY2VwdChvYmopKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybihPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmIG5vIHZhbGlkIGZpbHRlciB0eXBlIG9yIHBhdHRlcm4sIGFsd2F5cyByZXR1cm4gdHJ1ZQotCQlTdHJpbmcgZmlsdGVyVHlwZVN0ciA9IGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCk7Ci0JCS8vIFN0cmluZyBwYXR0ZXJuID0gaGVscGVyLmdldFBhdHRlcm4oKTsKLQkJU3RyaW5nIHRhYlN0ciA9IGhlbHBlci5nZXRUYWJTdHIoKTsKLQkJUGF0dGVybiByZWdleFBhdHRlcm4gPSBoZWxwZXIuZ2V0UmVnZXhQYXR0ZXJuKCk7Ci0JCWlmIChoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpID09IG51bGwgfHwgaGVscGVyLmdldFBhdHRlcm4oKSA9PSBudWxsCi0JCQkJfHwgaGVscGVyLmdldFBhdHRlcm4oKS5lcXVhbHNJZ25vcmVDYXNlKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKGZpbHRlclR5cGVTdHIuZXF1YWxzSWdub3JlQ2FzZSh0YWJTdHIpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJTWF0Y2hlciBtID0gcmVnZXhQYXR0ZXJuLm1hdGNoZXIoKChCcmVha2Rvd25FbGVtZW50KSBvYmopCi0JCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQlib29sZWFuIGZvdW5kID0gbS5tYXRjaGVzKCk7Ci0JCQkJaWYgKGZvdW5kKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZWxzZSBmb3IgYWxsIG90aGVyIHR5cGVzIG9mIGVsZW1lbnRzCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJLy8gdGhlIEFsbCBjYXNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRBY3Rpdml0aWVzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgTGlzdCBhY3Rpdml0eUxpc3QpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlhY3Rpdml0eUxpc3QuYWRkKHBhcmVudCk7Ci0JCQlnZXRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCwKLQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJfQotCX0KLQlwdWJsaWMgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBQcm9jZXNzQ29uZmlndXJhdG9yKGNvbmZpZykgfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvRXhQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTI2NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0V4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZpbHRlciB0aGF0IHN0aWxsIHNob3dzIGNlcnRhaW4gZWxlbWVudHMgZHVyaW5nIHByb2Nlc3MgYXV0aG9yaW5nIHRoYXQKLSAqIFByb2Nlc3NDb25maWd1cmF0b3IgZG9lcyBub3Qgc2hvdy4gRmlsdGVyIGVsZW1lbnRzIGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuIGFuZCB0eXBlLgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciBleHRlbmRzCi0JCVByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgewotCi0JU3RyaW5nIGZpbHRlclN0cjsKLQotCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQlWaWV3ZXIgdmlld2VyOwotCQotCXByb3RlY3RlZCBGaWx0ZXJIZWxwZXIgaGVscGVyOwotCS8qKgotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIEV4UHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywKLQkJCVZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCS8vdGhpcy5maWx0ZXJTdHIgPSBmaWx0ZXJTdHI7Ci0JCXRoaXMubWV0aG9kQ29uZmlndXJhdGlvbiA9IG1ldGhvZENvbmZpZzsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAodmlld2VyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCi0JCWlmKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb24uZXF1YWxzKG9iaik7Ci0JCX0KLQotLy8JCWlmICghc3VwZXIuYWNjZXB0KG9iaikpCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLS8vCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotLy8JCQlyZXR1cm4gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhvYmopOwotLy8JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZihMb2cuREVCVUcpIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiT2JqZWN0IGZpbHRlcmVkOiAiICsgKG9iaiA9PSBudWxsID8gbnVsbCA6IG9iai50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotLy8JCX0KLQkJaWYgKGhlbHBlci5pc1Nob3dQcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybk9uUHJlc2VudGF0aW9uTmFtZShvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoIWhlbHBlci5pc09iamVjdEluU2VsZWN0ZWRJdGVtcyhvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hpbGRBY2NlcHQob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcikgewotCQl0aGlzLmhlbHBlciA9IGhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykKLQl7Ci0JCXN1cGVyLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJdGhpcy5tZXRob2RDb25maWd1cmF0aW9uID0gY29uZmlnOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9HdWlkYW5jZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0d1aWRhbmNlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0M2Q4YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL0d1aWRhbmNlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLQotLyoqCi0gKiBGaWx0ZXIgZm9yIHtAbGluayBHdWlkYW5jZX0gdHlwZSBlbGVtZW50cy4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGFuY2VGaWx0ZXIgZXh0ZW5kcyBDb250ZW50RmlsdGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLS8vCQkgV2hlbiB0eXBlIGlzIHNlbGVjdGVkIGFsbG93IHRob3NlIENsYXNzIHR5cGVzIHRvIGRpc3BsYXkuCi0JCUNsYXNzIGNscyA9IEZpbHRlckluaXRpYWxpemVyLmdldEluc3RhbmNlKCkuCi0JCQkJCQlnZXRDbGFzc0ZvclR5cGUoaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKSk7Ci0JCWlmKGNscyAhPSBudWxsKXsKLQkJCWlmKGNscy5pc0luc3RhbmNlKG9iaikpewotCQkJCXJldHVybiB0cnVlOwotCQkJfWVsc2V7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIEZvciBhbGwgQ29udGVudEVsZW1lbnQgLSB0aGVzZSBndWlkYW5jZXMgYXJlIGFzc29jaWF0ZWQKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCB8fCBvYmogaW5zdGFuY2VvZiBDb25jZXB0Ci0JCQkJfHwgb2JqIGluc3RhbmNlb2YgRXhhbXBsZSB8fCBvYmogaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUgfHwgb2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkJCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCS8vIEZvciB0YXNrIGV4dHJhIGd1aWRhbmNlcwotCQlpZihoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2spewotCQkJaWYob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIEZvciB3b3JrUHJvZHVjdCBFeHRyYSBndWlkYW5jZXMuCi0JCWlmKGhlbHBlci5nZXRDb250ZW50RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpewotCQkJaWYob2JqIGluc3RhbmNlb2YgUmVwb3J0IHx8IG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NBY3Rpdml0eUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NBY3Rpdml0eUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUxNTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzQWN0aXZpdHlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBBY3Rpdml0eSBGaWx0ZXIgZm9yIGRvaW5nIFByb2Nlc3MgY29weS9leHRlbmQKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBY3Rpdml0eUZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgY29tbWFuZCA9IDA7Ci0KLQlwcml2YXRlIEFjdGl2aXR5VmFyaWFiaWxpdHlGaWx0ZXIgZGVsZWdhdGVGaWx0ZXI7Ci0KLQlwdWJsaWMgUHJvY2Vzc0FjdGl2aXR5RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHksIGludCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQlkZWxlZ2F0ZUZpbHRlciA9IG5ldyBBY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lLCBhY3Rpdml0eSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciNzZXRIZWxwZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscGVyKEZpbHRlckhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIuc2V0SGVscGVyKGhlbHBlcik7Ci0JCWRlbGVnYXRlRmlsdGVyLnNldEhlbHBlcihoZWxwZXIpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gYW55IGFjdGl2aXR5IGNhbiBiZSBkZWVwLWNvcGllZAotCQkvLwotCQlpZihjb21tYW5kID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZICYmIAotCQkJCShvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQotCQl9Ci0JCQotLy8JCWlmICgob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0vLwkJCQkvLyBpZiBzb3VyY2UgYW5kIHRhZ2V0IGlzIHNhbWUgcHJvY2VzcywgYmxvY2sgaXQKLS8vCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCk7Ci0vLwkJCQlpZiAoISh0aGlzLmNvbW1hbmQgPT0gSUFjdGlvblR5cGVQcm92aWRlci5DT1BZKSkgewotLy8JCQkJCWlmIChwcm9jLmVxdWFscyh0aGlzLmFjdGl2aXR5KSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0vLwkJCQkvLyBpZiBzb3VyY2UgYW5kIHRhZ2V0IGlzIHNhbWUgcHJvY2VzcywgYmxvY2sgaXQKLS8vCQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSBvYmo7Ci0vLwkJCQlpZiAoISh0aGlzLmNvbW1hbmQgPT0gSUFjdGlvblR5cGVQcm92aWRlci5DT1BZKSkgewotLy8JCQkJCWlmIChwcm9jLmVxdWFscyh0aGlzLmFjdGl2aXR5KSkKLS8vCQkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotLy8JCQkJUHJvY2VzcyBzcmNQcm9jID0gVG5nVXRpbAotLy8JCQkJCQkuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgb2JqKTsKLS8vCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwKLS8vCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHRoaXMuYWN0aXZpdHkpOwotLy8JCQkJaWYgKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MKLS8vCQkJCQkJJiYgdGFyZ2V0UHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSAoUHJvY2Vzcykgb2JqOwotLy8JCQkJaWYgKHByb2MuZXF1YWxzKHRoaXMuYWN0aXZpdHkpKQotLy8JCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfQotLy8KLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfSBlbHNlCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlzd2l0Y2goY29tbWFuZCkgewotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQ6Ci0JCQkJCXJldHVybiBkZWxlZ2F0ZUZpbHRlci5hY2NlcHQob2JqKTsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuQ09QWToKLQkJCQkJLy8gZGlzYWxsb3cgY29weWluZyBmcm9tIGRlbGl2ZXJ5IHByb2Nlc3MgdG8gY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCQkJCS8vCi0JCQkJCVByb2Nlc3Mgc3JjUHJvYyA9IG51bGw7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkvLyBpZiBzb3VyY2UgYW5kIHRhZ2V0IGlzIHNhbWUgcHJvY2VzcywgYmxvY2sgaXQKLQkJCQkJCXNyY1Byb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iaikuZ2V0UHJvY2VzcygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgb2JqOwotCQkJCQkJc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiZSk7Ci0JCQkJCX0KLQkJCQkJaWYoc3JjUHJvYyAhPSBudWxsKSB7Ci0JCQkJCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGhpcy5hY3Rpdml0eSk7Ci0JCQkJCQlpZiAoc3JjUHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcwotCQkJCQkJCQkmJiB0YXJnZXRQcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NHdWlkYW5jZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NHdWlkYW5jZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWQ0ZTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzR3VpZGFuY2VGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotCi0KLS8qKgotICogR3VpZGFuY2UgRmlsdGVyIGZvciBXb3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikpIHsKLQkJCUNvbGxlY3Rpb24gY29sID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopOwotCQkJaWYgKGNvbC5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZWxzZQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzUm9sZUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NSb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYmVjYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Sb2xlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBSb2xlU2V0fSwge0BsaW5rIFJvbGVTZXRHcm91cGluZ30gaW4gc3BlY2lmaWMge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiBiYXNlZCBvbiBzZWFyY2ggcGF0dGVybi4gCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1JvbGVGaWx0ZXIgZXh0ZW5kcyBEZXNjcmlwdG9yQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwdWJsaWMgUHJvY2Vzc1JvbGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFRhYmxlVmlld2VyIHZpZXdlciwKLQkJCVN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVJdGVtUHJvdmlkZXIpIHx8IChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKSkKLQkJCXJldHVybiB0cnVlOwotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKXsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSAoVG5nVXRpbC5nZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudClvYmopKTsKLQkJCWlmKGl0ZXIgIT0gbnVsbCl7Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpewotCQkJCQlSb2xlU2V0R3JvdXBpbmcgZ3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKWl0ZXIubmV4dCgpOwotCQkJCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpUm9sZVNldHMgaXMgZW1wdHksIAotCQkJCQkvLyBpZiByb2xlc2V0J3Mgcm9sZXMgYXJlIGVtcHR5IGRvbm90IHNob3cgRGlzY2lwbGluZSBncm91cGluZyAKLQkJCQkJaWYoIWdyb3VwaW5nLmdldFJvbGVTZXRzKCkuaXNFbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBUT0RPIDogQ2hlY2sgZm9yIChyZWN1cnNpdmUpUm9sZVNldHMgaXMgZW1wdHksIAotCQkJLy8gaWYgcm9sZXNldCdzIHJvbGVzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgZ3JvdXBpbmcgCi0JCQlyZXR1cm4gISgoUm9sZVNldEdyb3VwaW5nKW9iaikuZ2V0Um9sZVNldHMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZVNldCl7Ci0JCQlyZXR1cm4gISgoUm9sZVNldClvYmopLmdldFJvbGVzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTViOTc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFdvcmtQcm9kdWN0fXMgYmFzZWQgb24ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259IGFuZCBzZWFyY2ggcGF0dGVybi4KLSAqIGFuZCB7QGxpbmsgV29ya1Byb2R1Y3RUeXBlfSAgCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIgewotCi0JQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlID0gbnVsbDsKLQotCXB1YmxpYyBQcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIENsYXNzIHR5cGUpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLndvcmtQcm9kdWN0VHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJaWYgKHdvcmtQcm9kdWN0VHlwZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlIGlmIChvYmouZ2V0Q2xhc3MoKS5lcXVhbHModGhpcy53b3JrUHJvZHVjdFR5cGUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVGFza0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NUYXNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWNiNzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NUYXNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UYXNrSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBUYXNrfXMgaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259IGJhc2VkIG9uIHNlYXJjaCBwYXR0ZXJuLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUYXNrRmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NUYXNrRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBUYWJsZVZpZXdlciB2aWV3ZXIsCi0JCQlTdHJpbmcgdGFiTmFtZSkgewotCQlzdXBlcihjb25maWcsIHZpZXdlciwgdGFiTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgewotCQkJaWYgKCgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaikuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRhc2tJdGVtUHJvdmlkZXIpIHx8IChvYmogaW5zdGFuY2VvZiBUYXNrKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZihvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpewotCQkJSXRlcmF0b3IgaXRlciA9IChUbmdVdGlsLmdldENvbnRyaWJ1dG9ycygoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikpOwotCQkJaWYoaXRlciAhPSBudWxsKXsKLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQkJCURpc2NpcGxpbmVHcm91cGluZyBncm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpaXRlci5uZXh0KCk7Ci0JCQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlEaXNjaXBsaW5lIGlzIGVtcHR5LCAKLQkJCQkJLy8gaWYgZGlzY2lwbGluZSdzIHRhc2tzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgZ3JvdXBpbmcgCi0JCQkJCWlmKCFncm91cGluZy5nZXREaXNjaXBsaW5lcygpLmlzRW1wdHkoKSkgcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJLy8gVE9ETyA6IENoZWNrIGZvciAocmVjdXJzaXZlKURpc2NpcGxpbmUgaXMgZW1wdHksIAotCQkJLy8gaWYgZGlzY2lwbGluZSdzIHRhc2tzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgZ3JvdXBpbmcgCi0JCQlyZXR1cm4gISgoRGlzY2lwbGluZUdyb3VwaW5nKW9iaikuZ2V0RGlzY2lwbGluZXMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJaWYob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSl7Ci0JCQlJdGVyYXRvciBpdGVyID0gKFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKSk7Ci0JCQlpZihpdGVyICE9IG51bGwpewotCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKXsKLQkJCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpaXRlci5uZXh0KCk7Ci0JCQkJCS8vIFRPRE8gOiBDaGVjayBmb3IgKHJlY3Vyc2l2ZSlEaXNjaXBsaW5lIGlzIGVtcHR5LCAKLQkJCQkJLy8gaWYgZGlzY2lwbGluZSdzIHRhc2tzIGFyZSBlbXB0eSBkb25vdCBzaG93IERpc2NpcGxpbmUgCi0JCQkJCWlmKCFkaXNjaXBsaW5lLmdldFRhc2tzKCkuaXNFbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gISgoRGlzY2lwbGluZSlvYmopLmdldFRhc2tzKCkuaXNFbXB0eSgpOwotCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvUHJvY2Vzc1ZpZXdGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVmlld0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODQ2NTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzVmlld0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5DYXRlZ29yaWVzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlciB7QGxpbmsgUHJvY2Vzc31lcyB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259IHVzZWQgaW4KLSAqIHtAbGluayBJdGVtc0ZpbHRlckRpYWxvZ30uCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3RmlsdGVyIGV4dGVuZHMgRGVzY3JpcHRvckNvbmZpZ3VyYXRpb25GaWx0ZXIgewotCi0JcHVibGljIFByb2Nlc3NWaWV3RmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBWaWV3ZXIgdmlld2VyLAotCQkJU3RyaW5nIGZpbHRlclN0cikgewotCQlzdXBlcihtZXRob2RDb25maWcsIHZpZXdlciwgZmlsdGVyU3RyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBmaWx0ZXJUeXBlID0gaGVscGVyLmdldEZpbHRlclR5cGVTdHIoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTKSkgewotCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0IHx8IG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSB8fCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpOwotCQl9IGVsc2UgaWYgKGZpbHRlclR5cGUuZXF1YWxzSWdub3JlQ2FzZShGaWx0ZXJDb25zdGFudHMuRE9NQUlOUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRG9tYWluKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlCi0JCQkJLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0JCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVG9vbCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyVHlwZQotCQkJCS5lcXVhbHNJZ25vcmVDYXNlKEZpbHRlckNvbnN0YW50cy5DVVNUT01fQ0FURUdPUklFUykpIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeTsKLQkJfSBlbHNlIGlmIChmaWx0ZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUykpIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSb2xlU2V0IHx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgRG9tYWluIHx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBUb29sIHx8IG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZwotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmc7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1Byb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2ZmMzBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkRvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFdvcmtQcm9kdWN0fXMgd2l0aCBpbiB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0uIAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlciBleHRlbmRzIERlc2NyaXB0b3JDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXB1YmxpYyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlUYWJsZVZpZXdlciB2aWV3ZXIsIFN0cmluZyB0YWJOYW1lKSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQlpZiAoKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBvYmopLmdldFRleHQob2JqKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWlmICgoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VGV4dChvYmopLmVxdWFsc0lnbm9yZUNhc2UoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcikKLQkJCQl8fCAob2JqIGluc3RhbmNlb2YgRG9tYWluKQotCQkJCXx8IChvYmogaW5zdGFuY2VvZiBEb21haW5JdGVtUHJvdmlkZXIpCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9SZWZlcmVuY2VXb3JrRmxvd0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JlZmVyZW5jZVdvcmtGbG93RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYTAxZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JlZmVyZW5jZVdvcmtGbG93RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLklBbGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotCi0vKioKLSAqIEZpbHRlcnMgdGhlIHtAbGluayBQcm9jZXNzfXMgZm9yIHJlZmVyZW5jZSB3b3JrZmxvd3Mgb2Yge0BsaW5rIERpc2NpcGxpbmV9LiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VXb3JrRmxvd0ZpbHRlciBleHRlbmRzIEFic3RyYWN0QmFzZUZpbHRlciBpbXBsZW1lbnRzCi0JCUlBbGxGaWx0ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JQWxsRmlsdGVyI2dldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlciNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyBpZiBjYW4ndCBiZSBhY2NkZXB0ZWQgYnkgc3VwZXIsIHJldHVybi4KLQkJaWYgKCFzdXBlci5hY2NlcHQob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJT2JqZWN0IGNvbnRlbnRFbGVtZW50ID0gaGVscGVyLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAob2JqLmVxdWFscyhoZWxwZXIuZ2V0Q29udGVudEVsZW1lbnQoKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGhlbHBlci5nZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkgIT0gbnVsbCkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlpZiAoaGVscGVyLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKS5jb250YWlucygKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqKS5nZXRQcm9jZXNzKCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZihoZWxwZXIuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghaGVscGVyLm1hdGNoUGF0dGVybihvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaWYgKE1ldGhvZEVsZW1lbnRVdGlsLmdldEFsbE1vZGVscyhjb250ZW50RWxlbWVudCkKLQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBsaXN0ID0gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaW9yID0gbGlzdC5pdGVyYXRvcigpOyBpb3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpb3IubmV4dCgpOwotCQkJCWlmICgoKENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldENoaWxkcmVuKAotCQkJCQkJb2JqZWN0KS5pc0VtcHR5KCkpCi0JCQkJCWlvci5yZW1vdmUoKTsKLQkJCX0KLQkJCWlmIChsaXN0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkpIHsKLQkJCQlpZiAoKChQcm9jZXNzUGFja2FnZSkgb2JqKS5nZXRQcm9jZXNzRWxlbWVudHMoKS5pc0VtcHR5KCkKLQkJCQkJCSYmICgoUHJvY2Vzc1BhY2thZ2UpIG9iaikuZ2V0Q2hpbGRQYWNrYWdlcygpLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JvbGVGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Sb2xlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Y2M0M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL1JvbGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFJvbGV9IAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRmlsdGVyIGV4dGVuZHMgQWxsRmlsdGVyIHsKLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBjb250ZW50RWxlbWVudCA9IGdldEhlbHBlcigpLmdldENvbnRlbnRFbGVtZW50KCk7Ci0JCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAob2JqLmVxdWFscyhjb250ZW50RWxlbWVudCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldEhlbHBlcigpLmdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0SGVscGVyKCkuZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICghZ2V0SGVscGVyKCkubWF0Y2hQYXR0ZXJuKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoTWV0aG9kRWxlbWVudFV0aWwuZ2V0QWxsTW9kZWxzKGNvbnRlbnRFbGVtZW50KQotCQkJCQkJCS5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQwZTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBQcm9jZXNzfSdzIHtAbGluayBSb2xlfSB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlQcm9jZXNzUm9sZUZpbHRlciBleHRlbmRzIFByb2Nlc3NSb2xlRmlsdGVyIHsKLQotCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eVByb2Nlc3NSb2xlRmlsdGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJVGFibGVWaWV3ZXIgdmlld2VyLCBTdHJpbmcgdGFiTmFtZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3VwZXIoY29uZmlnLCB2aWV3ZXIsIHRhYk5hbWUpOwotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAoc3VwZXIuY2hpbGRBY2NlcHQob2JqKSkgewotLy8JCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KHRoaXMuYWN0aXZpdHkpLmNvbnRhaW5zKG9iaikpIHsKLS8vCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJfSBlbHNlCi0vLwkJCQlyZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0VmFsaWREZXNjcmlwdG9yKG9iaiwgYWN0aXZpdHksIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDhjNjkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NUYXNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NDb21tYW5kVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBQcm9jZXNzfSdzIHtAbGluayBUYXNrfSB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5UHJvY2Vzc1Rhc2tGaWx0ZXIgZXh0ZW5kcyBQcm9jZXNzVGFza0ZpbHRlciB7Ci0KLQlBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0KLQlwdWJsaWMgVmFyaWFiaWxpdHlQcm9jZXNzVGFza0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLS8vCQkJaWYgKFByb2Nlc3NVdGlsLmdldFZhcmlhYmlsaXR5RWxlbWVudCh0aGlzLmFjdGl2aXR5KS5jb250YWlucyhvYmopKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0gZWxzZQotLy8JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIGFjdGl2aXR5LCBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvVmFyaWFiaWxpdHlQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJjMmJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9WYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Qcm9jZXNzQ29tbWFuZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLQotCi0vKioKLSAqIEZpbHRlcnMge0BsaW5rIFByb2Nlc3N9J3Mge0BsaW5rIFdvcmtQcm9kdWN0fSB3aXRoaW4ge0BsaW5rIE1ldGhvZENvbmZpZ3VyYXRpb259Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5UHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIGV4dGVuZHMKLQkJUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyIHsKLQotCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQotCXB1YmxpYyBWYXJpYWJpbGl0eVByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVRhYmxlVmlld2VyIHZpZXdlciwgU3RyaW5nIHRhYk5hbWUsIEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXN1cGVyKGNvbmZpZywgdmlld2VyLCB0YWJOYW1lKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLS8vCQkJaWYgKFByb2Nlc3NVdGlsLmdldFZhcmlhYmlsaXR5RWxlbWVudCh0aGlzLmFjdGl2aXR5KS5jb250YWlucyhvYmopKSB7Ci0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJCX0gZWxzZQotLy8JCQkJcmV0dXJuIHRydWU7Ci0JCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosIGFjdGl2aXR5LCBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvV29ya1Byb2R1Y3RGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Xb3JrUHJvZHVjdEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDYyMTM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZmlsdGVycy9Xb3JrUHJvZHVjdEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBGaWx0ZXJzIHtAbGluayBXb3JrUHJvZHVjdH0gYmFzZWQgb24gc2VhcmNoIHBhdHRlcm4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RGaWx0ZXIgZXh0ZW5kcyBDb250ZW50RmlsdGVyIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9maWx0ZXJzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ZDQ3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ZpbHRlcnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZmlsdGVycyBmb3IgdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Fzc29jaWF0aW9uRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQXNzb2NpYXRpb25Gb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU5OTFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQXNzb2NpYXRpb25Gb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29udGVudEVsZW1lbnRzT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5FZGl0b3JzQ29udGV4dEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgQXNzb2NpYXRpb24gdHlwZSBmb3JtIHBhZ2VzIGluIHRoZSBNZXRob2QgZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25Gb3JtUGFnZSBleHRlbmRzIEJhc2VGb3JtUGFnZSBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9QUkVGSVggPSAiQXV0aG9yaW5nVUlfIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXJTZWxlY3RlZDMgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgob2JqZWN0KTsKLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBhU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgYUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciB2aWV3ZXJfc2VsZWN0ZWQsIHZpZXdlcl9zZWxlY3RlZDIsIHZpZXdlcl9zZWxlY3RlZDM7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9zZWxlY3RlZCwgY3RybF9zZWxlY3RlZDIsIGN0cmxfc2VsZWN0ZWQzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9yZW1vdmUsIGN0cmxfYWRkMiwgY3RybF9yZW1vdmUyLCBjdHJsX2FkZDMsCi0JCQljdHJsX3JlbW92ZTM7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfdXAxLCBjdHJsX2Rvd24xLCBjdHJsX3VwMiwgY3RybF9kb3duMiwgY3RybF91cDMsCi0JCQljdHJsX2Rvd24zOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9icmllZkRlc2M7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfc2VsZWN0LCBjdHJsX2NsZWFyOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCB1c2VkQ2F0ZWdvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBMYWJlbCBsYWJlbF9DYXRlZ29yeSwgbGFiZWxfQ2F0ZWdvcnkyLCBsYWJlbF9DYXRlZ29yeTM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXNlQ2F0ZWdvcnkxID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VDYXRlZ29yeTIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZUNhdGVnb3J5MyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDaGFuZ2UxID0gdHJ1ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NoYW5nZTIgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2hhbmdlMyA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMiA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24gbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbjsKLQkvLyBzdHJpbmdzIHVzZWQgaW4gdGhlIGZvcm0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm1OYW1lUHJlZml4ID0gIkZvcm0gcHJlZml4IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uTmFtZSA9ICJTZWN0aW9uIG5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25EZXNjID0gIlNlY3Rpb24gZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlbGVjdGVkTGFiZWwgPSAiU2VsZWN0ZWQgTGFiZWwgMSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRMYWJlbDIgPSAiU2VsZWN0ZWQgTGFiZWwgMiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBTdHJpbmcgc2VsZWN0ZWRMYWJlbDMgPSAiU2VsZWN0ZWQgTGFiZWwgMyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERhdGEgbW9kZWwgbWV0aG9kcy4KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBuZXdJdGVtcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IG5ld0l0ZW1zKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QgbmV3SXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlVXBJdGVtc0luU2VsZWN0ZWRJdGVtczEoQXJyYXlMaXN0IG1vdmVVcEl0ZW1zKSB7Ci0JCWlmICghbW92ZVVwSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpOwotCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3Qgb3JkZXJMaXN0ID0gZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKTsKLQkJCVN0cmluZ1tdIHBhdGggPSBnZXRNb2RlbFN0cnVjdHVyZVBhdGgoKTsKLQkJCWlmIChmZWF0dXJlICE9IG51bGwgJiYgb3JkZXJMaXN0ICE9IG51bGwgJiYgcGF0aCAhPSBudWxsKSB7Ci0JCQkJTW92ZUluQ2F0ZWdvcnlDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoCi0JCQkJCQkoQ29udGVudENhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZVVwSXRlbXMsIG9yZGVyTGlzdCwKLQkJCQkJCWZlYXR1cmUsIHBhdGgsIDEpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlRG93bkl0ZW1zSW5TZWxlY3RlZEl0ZW1zMShBcnJheUxpc3QgbW92ZURvd25JdGVtcykgewotCQlpZiAoIW1vdmVEb3duSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpOwotCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3Qgb3JkZXJMaXN0ID0gZ2V0Q29udGVudEVsZW1lbnRPcmRlckxpc3QoKTsKLQkJCVN0cmluZ1tdIHBhdGggPSBnZXRNb2RlbFN0cnVjdHVyZVBhdGgoKTsKLQkJCWlmIChmZWF0dXJlICE9IG51bGwgJiYgb3JkZXJMaXN0ICE9IG51bGwgJiYgcGF0aCAhPSBudWxsKSB7Ci0JCQkJTW92ZUluQ2F0ZWdvcnlDb21tYW5kIGNtZCA9IG5ldyBNb3ZlSW5DYXRlZ29yeUNvbW1hbmQoCi0JCQkJCQkoQ29udGVudENhdGVnb3J5KSBjb250ZW50RWxlbWVudCwgbW92ZURvd25JdGVtcywgb3JkZXJMaXN0LAotCQkJCQkJZmVhdHVyZSwgcGF0aCwgMCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBWaWV3ZXIgbWV0aG9kcy4KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkgewotCX0KLQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRNb2RlbFN0cnVjdHVyZVBhdGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuICJjb250ZW50ZWxlbWVudCI7fSAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzIoKSB7Ci0JCXJldHVybiBnZXRUYWJTdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZzMoKSB7Ci0JCXJldHVybiBnZXRUYWJTdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIGdldEZpbHRlclR5cGVzIHNob3VsZCBiZSBvdmVycmlkZSB0byBwYXNzIHR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlcygpewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKiBnZXRGaWx0ZXJUeXBlcyBzaG91bGQgYmUgb3ZlcnJpZGUgdG8gcGFzcyB0eXBlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMyKCl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKgotCSAqIGdldEZpbHRlclR5cGVzIHNob3VsZCBiZSBvdmVycmlkZSB0byBwYXNzIHR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlczMoKXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JLy8gRmlsdGVyIGluZm8uCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyLCBmaWx0ZXIyLCBmaWx0ZXIzOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMygpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvLyBPcmRlcmluZyBvZiBjb250cmlidXRlZCBjYXRlZ29yaXplZCBlbGVtZW50cyBpbiBjdXN0b20KLQkvLyBjYXRlZ29yaWVzCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX29yZGVyaW5nOwotCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIHZpZXdlcl9zb3J0MTsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyU29ydCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlMaXN0PFN0cmluZz4gc29ydFR5cGVzTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRUeXBlcygpOwotCQkJcmV0dXJuIHNvcnRUeXBlc0xpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyU29ydCA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlTdHJpbmcgc3RyID0gKChTdHJpbmcpb2JqZWN0KTsKLQkJCQlyZXR1cm4gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldFNvcnRUeXBlRGlzcGxheU5hbWUoc3RyKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIG5hbWUpOwotCQl0aGlzLmVkaXRvclRhYk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCi0JCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCi0JCS8vIENyZWF0ZSBhIHNlY3Rpb24uCi0JCWFTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLCBTZWN0aW9uLlRJVExFX0JBUgotCQkJCXwgU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQlhU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJYVNlY3Rpb24uc2V0VGV4dChnZXRTZWN0aW9uTmFtZSgpKTsKLQkJYVNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlhU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJYUNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGFTZWN0aW9uKTsKLQkJYUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJYVNlY3Rpb24uc2V0Q2xpZW50KGFDb21wb3NpdGUpOwotCi0JCWludCBudW1UYWJsZXNVc2VkID0gMDsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKQotCQkJbnVtVGFibGVzVXNlZCsrOwotCQlpZiAodXNlQ2F0ZWdvcnkyKQotCQkJbnVtVGFibGVzVXNlZCsrOwotCQlpZiAodXNlQ2F0ZWdvcnkzKQotCQkJbnVtVGFibGVzVXNlZCsrOwotCi0JCWlmICh1c2VDYXRlZ29yeTEpIHsKLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhQ29tcG9zaXRlLCAxKTsKLQkJCWxhYmVsX0NhdGVnb3J5ID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIGdldFNlbGVjdGVkTGFiZWwoKSk7Ci0KLQkJCWlmIChjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSkKLQkJCQljdHJsX3NlbGVjdGVkID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCBMQVJHRV9TSVpFKTsKLQkJCQllbHNlIGlmIChudW1UYWJsZXNVc2VkID09IDIpCi0JCQkJCWN0cmxfc2VsZWN0ZWQgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgTUVESVVNX1NJWkUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9zZWxlY3RlZCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCBTTUFMTF9TSVpFKTsKLQkJCX0KLQotCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXYpOyAKLQkJCXZpZXdlcl9zZWxlY3RlZCA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZCk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKTsKLQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAoIWlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkKLQkJCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSk7Ci0KLQkJCWNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnModG9vbGtpdCwgYUNvbXBvc2l0ZSk7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UxKSB7Ci0JCQkJY3RybF9hZGQgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCQkoY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEpID8gU0VMRUNUX0JVVFRPTgotCQkJCQkJCQk6IEFERF9CVVRUT04pOwotCQkJCWN0cmxfcmVtb3ZlID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQkJKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKSA/IENMRUFSX0JVVFRPTgotCQkJCQkJCQk6IFJFTU9WRV9CVVRUT04pOwotCi0JCQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQkJCQljdHJsX3VwMSA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgVVBfQlVUVE9OKTsKLQkJCQkJY3RybF9kb3duMSA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgRE9XTl9CVVRUT04pOwotCQkJCQljdHJsX29yZGVyaW5nID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBPUkRFUl9CVVRUT04pOwotCQkJCQljdHJsX29yZGVyaW5nLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCUNvbWJvIGN0cmxfc29ydDEgPSBjcmVhdGVDb21ib1dpdGhMYWJlbCh0b29sa2l0LCBwYW5lMiwgTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfTGFiZWwpOwotCQkJCQl2aWV3ZXJfc29ydDEgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF9zb3J0MSk7Ci0JCQkJCXZpZXdlcl9zb3J0MS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU29ydCk7Ci0JCQkJCXZpZXdlcl9zb3J0MS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTb3J0KTsKLQkJCQkJdmlld2VyX3NvcnQxLnNldElucHV0KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJLy8gc2V0IGluaXRpYWwgc2VsZWN0aW9uCi0JCQkJCVN0cmluZyBzb3J0VHlwZSA9IENhdGVnb3J5U29ydEhlbHBlci5nZXRDYXRlZ29yeVNvcnRWYWx1ZShjb250ZW50RWxlbWVudCk7Ci0JCQkJCXZpZXdlcl9zb3J0MS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc29ydFR5cGUpLCB0cnVlKTsKLQotCQkJCQkvLyBjdHJsX29yZGVyaW5nLnNldExheW91dERhdGEobmV3Ci0JCQkJCS8vIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJQ29tcG9zaXRlIHBhbmUzID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkyID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTMsIGdldFNlbGVjdGVkTGFiZWwyKCkpOwotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKQotCQkJCWN0cmxfc2VsZWN0ZWQyID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTMsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZDIgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMywgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkMiA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCBTTUFMTF9TSVpFKTsKLQkJCX0KLQkJCXZpZXdlcl9zZWxlY3RlZDIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZDIpOwotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDIpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpOwotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkMik7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQotCQkJQ29tcG9zaXRlIHBhbmU0ID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTIpIHsKLQkJCQljdHJsX2FkZDIgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsIEFERF9CVVRUT04pOwotCQkJCWN0cmxfcmVtb3ZlMiA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwgUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyKSB7Ci0JCQkJCWN0cmxfdXAyID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24yID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LCBET1dOX0JVVFRPTik7Ci0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTQpOwotCQl9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MykgewotCQkJQ29tcG9zaXRlIHBhbmU1ID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIDEpOwotCQkJbGFiZWxfQ2F0ZWdvcnkzID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTUsIGdldFNlbGVjdGVkTGFiZWwzKCkpOwotCQkJaWYgKGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zKQotCQkJCWN0cmxfc2VsZWN0ZWQzID0gY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTUsIFNJTkdMRV9ST1cpOwotCQkJZWxzZSB7Ci0JCQkJaWYgKG51bVRhYmxlc1VzZWQgPT0gMSkKLQkJCQkJY3RybF9zZWxlY3RlZDMgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgTEFSR0VfU0laRSk7Ci0JCQkJZWxzZSBpZiAobnVtVGFibGVzVXNlZCA9PSAyKQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU1LCBNRURJVU1fU0laRSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3NlbGVjdGVkMyA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmU1LCBTTUFMTF9TSVpFKTsKLQkJCX0KLQkJCXZpZXdlcl9zZWxlY3RlZDMgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZDMpOwotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXJTZWxlY3RlZDMpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpOwotCQkJdmlld2VyX3NlbGVjdGVkMy5zZXRJbnB1dChjb250ZW50RWxlbWVudCk7Ci0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQkJY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyX3NlbGVjdGVkMyk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmU1KTsKLQotCQkJQ29tcG9zaXRlIHBhbmU2ID0gY3JlYXRlQ29tcG9zaXRlRm9yQnV0dG9ucyh0b29sa2l0LCBhQ29tcG9zaXRlKTsKLQkJCWlmIChhbGxvd0NoYW5nZTMpIHsKLQkJCQljdHJsX2FkZDMgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIEFERF9CVVRUT04pOwotCQkJCWN0cmxfcmVtb3ZlMyA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwgUkVNT1ZFX0JVVFRPTik7Ci0KLQkJCQlpZiAoaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQzKSB7Ci0JCQkJCWN0cmxfdXAzID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LCBVUF9CVVRUT04pOwotCQkJCQljdHJsX2Rvd24zID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LCBET1dOX0JVVFRPTik7Ci0JCQkJfQotCQkJfQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTYpOwotCQl9Ci0KLQkJc2V0RW5hYmxlZEFkZEJ1dHRvbnModHJ1ZSk7Ci0KLQkJc2V0V2lkZ2V0V2lkdGhzKCk7Ci0JCUNvbXBvc2l0ZSBwYW5lNyA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfQk9USCwgMSwgMSwgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWxMYXJnZSgKLQkJCQl0b29sa2l0LAotCQkJCXBhbmU3LAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkFzc29jaWF0aW9uRm9ybVBhZ2VfQnJpZWZEZXNjcmlwdGlvbkxhYmVsKTsgCi0JCWN0cmxfYnJpZWZEZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTcpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihhQ29tcG9zaXRlKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250ZXh0SGVscCgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5hYmxlZEFkZEJ1dHRvbnMoYm9vbGVhbiB2YWx1ZSkgewotCQlpZiAoYWxsb3dDaGFuZ2UxKQotCQkJY3RybF9hZGQuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTIgJiYgYWxsb3dDaGFuZ2UyKQotCQkJY3RybF9hZGQyLnNldEVuYWJsZWQodmFsdWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkzICYmIGFsbG93Q2hhbmdlMykKLQkJCWN0cmxfYWRkMy5zZXRFbmFibGVkKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbmFibGVkUmVtb3ZlQnV0dG9ucyhib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChhbGxvd0NoYW5nZTEpCi0JCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHZhbHVlKTsKLQkJaWYgKHVzZUNhdGVnb3J5MiAmJiBhbGxvd0NoYW5nZTIpCi0JCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMgJiYgYWxsb3dDaGFuZ2UzKQotCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKSB7Ci0JCS8vIHNldEVuYWJsZWRBZGRCdXR0b25zKGZhbHNlKTsKLQkJc2V0RW5hYmxlZFJlbW92ZUJ1dHRvbnMoZmFsc2UpOwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQlpZiAodXNlQ2F0ZWdvcnkyKQotCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCWlmICh1c2VDYXRlZ29yeTMpCi0JCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlld2VycygpIHsKLQotCQl2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkvLyBDaGVjayBpZiBleGlzdGluZyBlbGVtZW50IGlzIGNvbnRyaWJ1dG9yL2NvbnRyaWJ1dGVzIGZvciBzdGFuZGFyZAotCQkvLyBjYXRlZ29yaWVzCi0JCS8vIHNob3VsZCBub3Qgc2hvd24gaW4gdGhlIHRhYmxldmlld2VyLgotCQkvLyBDb21tZW50ZWQgYmVsb3cgdG8gYWxsb3cgY29udHJpYnV0b3JzIHRvIGRpc3BsYXkgaW4gdGhlIGxpc3QgYm94Ci0JCS8vIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KXsKLQkJLy8gaWYoIShjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSl7Ci0JCS8vIE9iamVjdFtdIGVsZW1lbnRzID0KLQkJLy8gY29udGVudFByb3ZpZGVyU2VsZWN0ZWQuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkvLyBmb3IoaW50IGk9MDsgaTxlbGVtZW50cy5sZW5ndGg7IGkrKyl7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCS8vIGlmKFVJSGVscGVyLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KWVsZW1lbnQpKXsKLQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlbW92ZShlbGVtZW50KTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MikgewotCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0JCQkvLyBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSl7Ci0JCQkvLyBPYmplY3RbXSBlbGVtZW50cyA9Ci0JCQkvLyBjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIuZ2V0RWxlbWVudHMoY29udGVudEVsZW1lbnQpOwotCQkJLy8gZm9yKGludCBpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspewotCQkJLy8gT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCl7Ci0JCQkvLyBpZihVSUhlbHBlci5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCllbGVtZW50KSl7Ci0JCQkvLyB2aWV3ZXJfc2VsZWN0ZWQyLnJlbW92ZShlbGVtZW50KTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIH0KLQotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCXZpZXdlcl9zZWxlY3RlZDMucmVmcmVzaCgpOwotCQkJLy8gaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpewotCQkJLy8gT2JqZWN0W10gZWxlbWVudHMgPQotCQkJLy8gY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzLmdldEVsZW1lbnRzKGNvbnRlbnRFbGVtZW50KTsKLQkJCS8vIGZvcihpbnQgaT0wOyBpPGVsZW1lbnRzLmxlbmd0aDsgaSsrKXsKLQkJCS8vIE9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpewotCQkJLy8gaWYoVUlIZWxwZXIuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpZWxlbWVudCkpewotCQkJLy8gdmlld2VyX3NlbGVjdGVkMy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCX0KLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVuYWJsZUNvbnRyb2xzKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZW5hYmxlQ29udHJvbHModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKSB7Ci0JCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCQljdHJsX3NlbGVjdGVkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpOwotCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoYWxsb3dDaGFuZ2UxICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl9zZWxlY3RlZAotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCQlpZiAoYWxsb3dDaGFuZ2UxICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZW5hYmxlVXBEb3duQnV0dG9uczEoKTsKLQotCQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbgotCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZkRlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKHNlbGVjdGlvbgotCQkJCQkJCQkJCQkJLnNpemUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9KTsKLQotCQkJaWYgKGFsbG93Q2hhbmdlMSkgewotCQkJCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZpZXdlcl9zZWxlY3RlZC5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAoZ2V0RmlsdGVyKCkgIT0gbnVsbCkgewotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksIGdldEZpbHRlcigpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nKCkpOwotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLnNldFRpdGxlKGdldFRhYlN0cmluZygpKTsKLQkJCQkJCQlpZihjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMSl7Ci0JCQkJCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmQuc2V0RXhpc3RpbmdFbGVtZW50cyhzZWxlY3RlZExpc3QpOwotCQkJCQkJCWlmKGdldEZpbHRlclR5cGVzKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCWZkLnNldFR5cGVzKGdldEZpbHRlclR5cGVzKCkpOwotCQkJCQkJCX0KLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMShmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zRnJvbU1vZGVsMShybUl0ZW1zKTsKLQkJCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodXNlQ2F0ZWdvcnkyKSB7Ci0JCQkvLyBBZGQgZm9jdXMgbGlzdGVuZXIgb24gcHJpbWFyeSB0YXNrcyBsaXN0Ci0JCQljdHJsX3NlbGVjdGVkMi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCWRpc2FibGVCdXR0b25zQW5kRGVzZWxlY3RUYWJsZXMoKTsKLQotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDIKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQkJCWlmIChhbGxvd0NoYW5nZTIgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJCQljdHJsX3JlbW92ZTIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmRGVzYwotCQkJCQkJCQkJCS5zZXRUZXh0KGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oc2VsZWN0aW9uCi0JCQkJCQkJCQkJCQkuc2l6ZSgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCX0pOwotCi0JCQlpZiAoYWxsb3dDaGFuZ2UyKSB7Ci0JCQkJY3RybF9hZGQyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHZpZXdlcl9zZWxlY3RlZDIuZ2V0VGFibGUoKQotCQkJCQkJCQkuZ2V0SXRlbXMoKTsKLQkJCQkJCUxpc3Qgc2VsZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXNlbGVjdGVkTGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChnZXRGaWx0ZXIyKCkgIT0gbnVsbCkgewotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksIGdldEZpbHRlcjIoKSwKLQkJCQkJCQkJCWdldENvbnRlbnRFbGVtZW50KCksIGdldFRhYlN0cmluZzIoKSk7Ci0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQuc2V0VGl0bGUoZ2V0VGFiU3RyaW5nMigpKTsKLQkJCQkJCQlmZC5zZXRFeGlzdGluZ0VsZW1lbnRzKHNlbGVjdGVkTGlzdCk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEl0ZW1zVG9Nb2RlbDIoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl9zZWxlY3RlZDIucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZTIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtc0Zyb21Nb2RlbDIocm1JdGVtcyk7Ci0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5yZWZyZXNoKCk7Ci0KLQkJCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQkJdmlld2VyX3NlbGVjdGVkMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJCWN0cmxfc2VsZWN0ZWQzLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJZGlzYWJsZUJ1dHRvbnNBbmREZXNlbGVjdFRhYmxlcygpOwotCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGFsbG93Q2hhbmdlMyAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQkJY3RybF9yZW1vdmUzLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyX3NlbGVjdGVkMwotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJCQkJaWYgKGFsbG93Q2hhbmdlMyAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCQkJCWN0cmxfcmVtb3ZlMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQkJCWN0cmxfYnJpZWZEZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihzZWxlY3Rpb24KLQkJCQkJCQkJCQkJCS5zaXplKCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0KLQkJCWlmIChhbGxvd0NoYW5nZTMpIHsKLQkJCQljdHJsX2FkZDMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCVRhYmxlSXRlbVtdIGl0ZW1zID0gdmlld2VyX3NlbGVjdGVkMy5nZXRUYWJsZSgpCi0JCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQkJTGlzdCBzZWxlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJc2VsZWN0ZWRMaXN0LmFkZChpdGVtc1tpXS5nZXREYXRhKCkpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEZpbHRlcjMoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyMygpLAotCQkJCQkJCQkJZ2V0Q29udGVudEVsZW1lbnQoKSwgZ2V0VGFiU3RyaW5nMygpKTsKLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5zZXRUaXRsZShnZXRUYWJTdHJpbmczKCkpOwotCQkJCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoc2VsZWN0ZWRMaXN0KTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkSXRlbXNUb01vZGVsMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJfQotCQkJCQkJdmlld2VyX3NlbGVjdGVkMy5yZWZyZXNoKCk7Ci0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZW1vdmUzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl9zZWxlY3RlZDMKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCQkJcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKHJtSXRlbXMpOwotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDMucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXZpZXdlcl9zZWxlY3RlZDMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZEZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmIChhbGxvd0NoYW5nZTEgJiYgaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQljdHJsX3VwMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCUFycmF5TGlzdCBtb3ZlVXBJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJbW92ZVVwSXRlbXNJblNlbGVjdGVkSXRlbXMxKG1vdmVVcEl0ZW1zKTsKLQkJCQkJfQotCQkJCQkvLyB2aWV3ZXJfc2VsZWN0ZWQucmVmcmVzaCgpOwotCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX2Rvd24xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQltb3ZlRG93bkl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJbW92ZURvd25JdGVtc0luU2VsZWN0ZWRJdGVtczEobW92ZURvd25JdGVtcyk7Ci0JCQkJCX0KLQkJCQkJLy8gdmlld2VyX3NlbGVjdGVkLnJlZnJlc2goKTsKLQkJCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJCQkJZW5hYmxlVXBEb3duQnV0dG9uczEoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9vcmRlcmluZy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUNvbnRlbnRFbGVtZW50c09yZGVyRGlhbG9nIGRsZyA9IG5ldyBDb250ZW50RWxlbWVudHNPcmRlckRpYWxvZygKLQkJCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBnZXRBY3Rpb25NYW5hZ2VyKCkpOwotCQkJCQlkbGcuc2V0RmVhdHVyZShnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSk7Ci0JCQkJCWRsZy5vcGVuKCk7Ci0JCQkJCWlmIChhbGxvd0NoYW5nZTEgJiYgaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKSB7Ci0JCQkJCQlTdHJpbmcgc29ydFR5cGUgPSBDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoY29udGVudEVsZW1lbnQpOwotCQkJCQkJdmlld2VyX3NvcnQxLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzb3J0VHlwZSksIHRydWUpOwotCQkJCQkJdmlld2VyX3NvcnQxLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJCi0JCQl2aWV3ZXJfc29ydDEuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NvcnQxCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlTdHJpbmcgc29ydFR5cGUgPSAoU3RyaW5nKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJaWYgKCFDYXRlZ29yeVNvcnRIZWxwZXIuZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoY29udGVudEVsZW1lbnQpLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gQ2F0ZWdvcnlTb3J0SGVscGVyLmdldENhdGVnb3J5U29ydFByb3BlcnR5KGNvbnRlbnRFbGVtZW50KTsKLQkJCQkJCQotCQkJCQkJaWYgKHByb3AgPT0gbnVsbCkgewkJCQotCQkJCQkJCXByb3AgPSBDYXRlZ29yeVNvcnRIZWxwZXIuY3JlYXRlTmV3U29ydFByb3BlcnR5KHNvcnRUeXBlKTsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCQkJCQkJcHJvcCwgLTEpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJcHJvcCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJCQkJCQkJc29ydFR5cGUsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCUxpYnJhcnlWaWV3LmdldFZpZXcoKS5yZWZyZXNoVmlld3MoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJCQllbmFibGVVcERvd25CdXR0b25zMSgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpZiAodXNlQ2F0ZWdvcnkxKSB7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UxKSB7Ci0JCQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoYWxsb3dDaGFuZ2UxICYmIHNlbGVjdGlvbi5zaXplKCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCWlmIChhbGxvd0NoYW5nZTIpIHsKLQkJCQljdHJsX2FkZDIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGFsbG93Q2hhbmdlMiAmJiBzZWxlY3Rpb24uc2l6ZSgpID4gMAotCQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfcmVtb3ZlMi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodXNlQ2F0ZWdvcnkzKSB7Ci0JCQlpZiAoYWxsb3dDaGFuZ2UzKSB7Ci0JCQkJY3RybF9hZGQzLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkMwotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChhbGxvd0NoYW5nZTMgJiYgc2VsZWN0aW9uLnNpemUoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX3JlbW92ZTMuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZW5hYmxlVXBEb3duQnV0dG9uczEoKTsKLQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSkgewotCQkJaWYgKCFUbmdVdGlsLmlzTG9ja2VkKGNvbnRlbnRFbGVtZW50KSkgewotCQkJCXZpZXdlcl9zb3J0MS5nZXRDb21ibygpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXZpZXdlcl9zb3J0MS5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBzZXREaXJ0eShib29sZWFuIGIpIHsKLQkJLy8gUGhvbmcgKDAzLzA3LzIwMDUpOiB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIGVkaXRvciBpcyBhbHJlYWR5IHRha2VuCi0JCS8vIGNhcmUgaW4gTWV0aG9kRWxlbWVudEVkaXRvciwgdHJhbnNwYXJlbnQgZnJvbSB1c2VyCi0JCS8vIGludGVyYWN0aW9uLiBObyBmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9ESVJUWSkgc2hvdWxkIGJlIGNhbGxlZAotCQkvLyBzb21ld2hlcmUgZWxzZS4KLQkJLy8gTk9URTogdW5uZWNlc3NhcnkgY2FsbHMgdG8gZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpIHdpbGwgY2F1c2UKLQkJLy8gcGVyZm9ybWFuY2UgcHJvYmxlbS4KLQkJLy8gZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcmllcy5zaXplKCkgPiAwKQotCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlQ2F0ZWdvcmllcyhjb250ZW50RWxlbWVudCwKLQkJCQkJdXNlZENhdGVnb3JpZXMpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyU2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlclNlbGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclNlbGVjdGVkMiAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlclNlbGVjdGVkMyAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyU2VsZWN0ZWQzLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VjdGlvbiBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCS8vIFRWVCBpc3N1ZSBzaW5nbGUgcXVvdGUgCi0JCS8vIEZvcm1hdCBzaG91bGQgYmUgZG9uZSBvbmx5IGZvciBDYXRlZ29yeUd1aWRhbmNlUGFnZSwgQXV0aG9yaW5nVUkuY2F0ZWdvcnlHdWlkYW5jZXNQYWdlLnNlY3Rpb25EZXNjcmlwdGlvbiBrZXkgCi0JCS8vIGhhdmUgaGFzIHJlcGxhY2VtZW50IHZhcmlhYmxlIGluIGl0cyB2YWx1ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gY2hlY2sgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0JICAgLyogCi0JICAgICogTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0JICAgIFN0cmluZ3Mgd2hpY2ggY29udGFpbiByZXBsYWNlbWVudCB2YXJpYWJsZXMgYXJlIHByb2Nlc3NlZCBieSB0aGUgIAotCSAgICBNZXNzYWdlRm9ybWF0IGNsYXNzIChzaW5nbGUgcXVvdGUgbXVzdCBiZSBjb2RlZCBhcyAyIGNvbnNlY3V0aXZlIHNpbmdsZSAgCi0JICAgIHF1b3RlcyAnJykuIFN0cmluZ3Mgd2hpY2ggZG8gTk9UIGNvbnRhaW4gcmVwbGFjZW1lbnQgdmFyaWFibGVzIGFyZSBOT1QgICAKLQkgICAgcHJvY2Vzc2VkIGJ5IHRoZSBNZXNzYWdlRm9ybWF0IGNsYXNzIChzaW5nbGUgcXVvdGUgbXVzdCBiZSBjb2RlZCBhcyAxCi0JCXNpbmdsZSBxdW90ZSAnKS4qLwotCQkKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCSYmICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiLmVxdWFsc0lnbm9yZUNhc2UoZ2V0SWQoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIE5MUy5iaW5kKGdldElkKCkgKyAiX3NlY3Rpb25EZXNjcmlwdGlvbiIsIExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3Qgc2VsZWN0ZWQgbGFibGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQkvLyBpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkvLyByZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybWF0U3RyaW5nKFBBQ0tBR0VfUFJFRklYICsgZ2V0SWQoKSArCi0JCS8vICIuc2VsZWN0ZWRMYWJlbCIsIExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyB9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlY29uZCBzZWxlY3RlZCBsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aGlyZCBzZWxlY3RlZCBsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtdWx0aXBsZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtdWx0aXBsZSBzZWN0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKG1lc3NhZ2UsIG5ldyBJbnRlZ2VyKGNvdW50KSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldCBkZXNjcmlwdGlvbiBmb3Igc2VjdGlvbgotCSAqIEBwYXJhbSBzZWN0aW9uRGVzYwotCSAqIAkJCURlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VjdGlvbkRlc2MoU3RyaW5nIHNlY3Rpb25EZXNjKSB7Ci0JCXRoaXMuc2VjdGlvbkRlc2MgPSBzZWN0aW9uRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZmlyc3QgbGFiZWwKLQkgKiBAcGFyYW0gc2VsZWN0ZWRMYWJlbDEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZExhYmVsKFN0cmluZyBzZWxlY3RlZExhYmVsMSkgewotCQl0aGlzLnNlbGVjdGVkTGFiZWwgPSBzZWxlY3RlZExhYmVsMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgc2Vjb25kIGxhYmVsCi0JICogQHBhcmFtIHNlbGVjdGVkTGFiZWwyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRMYWJlbDIoU3RyaW5nIHNlbGVjdGVkTGFiZWwyKSB7Ci0JCXRoaXMuc2VsZWN0ZWRMYWJlbDIgPSBzZWxlY3RlZExhYmVsMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhpcmQgbGFiZWwKLQkgKiBAcGFyYW0gc2VsZWN0ZWRMYWJlbDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZExhYmVsMyhTdHJpbmcgc2VsZWN0ZWRMYWJlbDMpIHsKLQkJdGhpcy5zZWxlY3RlZExhYmVsMyA9IHNlbGVjdGVkTGFiZWwzOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gZm9yIHRoZSBmaXJzdCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMShib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIGZvciB0aGUgc2Vjb25kIGNhdGVnb3J5IHRvIGJlIGVpdGhlciBzaW5nbGUgc2VsZWN0aW9uIG9yIG11bHRpcGxlIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yKGJvb2xlYW4gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjIpIHsKLQkJdGhpcy5jYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMiA9IGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24yOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gZm9yIHRoZSB0aGlyZCBjYXRlZ29yeSB0byBiZSBlaXRoZXIgc2luZ2xlIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMyhib29sZWFuIGNhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24zKSB7Ci0JCXRoaXMuY2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjMgPSBjYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHVzZSBmaXJzdCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTEoYm9vbGVhbiB1c2VDYXRlZ29yeTEpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTEgPSB1c2VDYXRlZ29yeTE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byB1c2Ugc2Vjb25kIGNhdGVnb3J5Ci0JICogQHBhcmFtIHVzZUNhdGVnb3J5MgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZUNhdGVnb3J5Mihib29sZWFuIHVzZUNhdGVnb3J5MikgewotCQl0aGlzLnVzZUNhdGVnb3J5MiA9IHVzZUNhdGVnb3J5MjsKLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIHVzZSB0aGlyZCBjYXRlZ29yeQotCSAqIEBwYXJhbSB1c2VDYXRlZ29yeTMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VDYXRlZ29yeTMoYm9vbGVhbiB1c2VDYXRlZ29yeTMpIHsKLQkJdGhpcy51c2VDYXRlZ29yeTMgPSB1c2VDYXRlZ29yeTM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciBmaXJzdCB0YWJsZSBpbiBVSQotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTEoYm9vbGVhbiBhbGxvd0NoYW5nZTEpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTEgPSBhbGxvd0NoYW5nZTE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBhbGxvdyBjaGFuZ2VzIGZvciB0aGUgc2Vjb25kIHRhYmxlIGluIFVJCi0JICogQHBhcmFtIGFsbG93Q2hhbmdlMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93Q2hhbmdlMihib29sZWFuIGFsbG93Q2hhbmdlMikgewotCQl0aGlzLmFsbG93Q2hhbmdlMiA9IGFsbG93Q2hhbmdlMjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYW4gb3B0aW9uIHRvIGFsbG93IGNoYW5nZXMgZm9yIHRoaXJkIHRhYmxlLgotCSAqIEBwYXJhbSBhbGxvd0NoYW5nZTMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NoYW5nZTMoYm9vbGVhbiBhbGxvd0NoYW5nZTMpIHsKLQkJdGhpcy5hbGxvd0NoYW5nZTMgPSBhbGxvd0NoYW5nZTM7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBzaG93IGZpcnN0IHNldCBvZiB1cC9kb3duIGJ1dHRvbnMKLQkgKiBAcGFyYW0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKAotCQkJYm9vbGVhbiBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEpIHsKLQkJdGhpcy5pc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEgPSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDE7Ci0JfQotCi0JLyoqCi0JICogU2V0IGFuIG9wdGlvbiB0byBzaG93IHNlY29uZCBzZXQgb2YgdXAvZG93biBidXR0b25zCi0JICogQHBhcmFtIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMigKLQkJCWJvb2xlYW4gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyKSB7Ci0JCXRoaXMuaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyID0gaXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQyOwotCX0KLQotCS8qKgotCSAqIFNldCBhbiBvcHRpb24gdG8gc2hvdyB0aGlyZCBzZXQgb2YgdXAvZG93biBidXR0b25zLgotCSAqIEBwYXJhbSBpc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDMoCi0JCQlib29sZWFuIGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMykgewotCQl0aGlzLmlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMyA9IGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMzsKLQl9Ci0KLQkvLyBjYWxjdWxhdGUgd2lkdGhzIGZvciBsYWJlbHMgYW5kIHRhYmxlcywgYmFzZWQgb24gd2lkdGggb2YgbGFiZWxzCi0JcHJvdGVjdGVkIHZvaWQgc2V0V2lkZ2V0V2lkdGhzKCkgewotCQlpbnQgYWxsQ2F0ZWdvcmllc1dpZHRoID0gMCwgY2F0ZWdvcnlXaWR0aCA9IDAsIGNhdGVnb3J5MldpZHRoID0gMCwgY2F0ZWdvcnkzV2lkdGggPSAwOwotCQlpbnQgbGFyZ2VzdFdpZHRoID0gMDsKLQkJLy8gaWYgKHVzZUNhdGVnb3J5MSkgYWxsQ2F0ZWdvcmllc1dpZHRoID0KLQkJLy8gbGFiZWxfYWxsQ2F0ZWdvcmllcy5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCWlmICh1c2VDYXRlZ29yeTEpCi0JCQljYXRlZ29yeVdpZHRoID0gbGFiZWxfQ2F0ZWdvcnkKLQkJCQkJLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCWNhdGVnb3J5MldpZHRoID0gbGFiZWxfQ2F0ZWdvcnkyLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkueDsKLQkJaWYgKHVzZUNhdGVnb3J5MykKLQkJCWNhdGVnb3J5M1dpZHRoID0gbGFiZWxfQ2F0ZWdvcnkzLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULAotCQkJCQlTV1QuREVGQVVMVCkueDsKLQotCQlpZiAodXNlQ2F0ZWdvcnkxKQotCQkJbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgoYWxsQ2F0ZWdvcmllc1dpZHRoLCBjYXRlZ29yeVdpZHRoKTsKLQkJaWYgKHVzZUNhdGVnb3J5MikKLQkJCWxhcmdlc3RXaWR0aCA9IE1hdGgubWF4KGxhcmdlc3RXaWR0aCwgY2F0ZWdvcnkyV2lkdGgpOwotCQlpZiAodXNlQ2F0ZWdvcnkzKQotCQkJbGFyZ2VzdFdpZHRoID0gTWF0aC5tYXgobGFyZ2VzdFdpZHRoLCBjYXRlZ29yeTNXaWR0aCk7Ci0KLQkJaWYgKHVzZUNhdGVnb3J5MSkgewotCQkJLy8gKChHcmlkRGF0YSlsYWJlbF9hbGxDYXRlZ29yaWVzLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0KLQkJCS8vIGxhcmdlc3RXaWR0aDsKLQkJCS8vICgoR3JpZERhdGEpY3RybF9hbGxBdmFpbGFibGUuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPQotCQkJLy8gbGFyZ2VzdFdpZHRoOwotCQkJKChHcmlkRGF0YSkgbGFiZWxfQ2F0ZWdvcnkuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBsYXJnZXN0V2lkdGg7Ci0JCQkoKEdyaWREYXRhKSBjdHJsX3NlbGVjdGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTIpIHsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5Mi5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGN0cmxfc2VsZWN0ZWQyLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JCWlmICh1c2VDYXRlZ29yeTMpIHsKLQkJCSgoR3JpZERhdGEpIGxhYmVsX0NhdGVnb3J5My5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGxhcmdlc3RXaWR0aDsKLQkJCSgoR3JpZERhdGEpIGN0cmxfc2VsZWN0ZWQzLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbGFyZ2VzdFdpZHRoOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udGV4dEhlbHAoKSB7Ci0JCS8vIGluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBjaGVjayB0aGUgc3ViY2xhc3MgdHlwZSB0byBzZXQgdXAgYQotCQkvLyBkaWZmZXJlbnQKLQkJLy8gY29udGV4dCBwYWdlIGZvciBlY2ggdHlwZSBvZiBhc3NvY2lhdGlvbnMKLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZXRQYXJ0Q29udHJvbCgpLCBnZXRDb250ZW50RWxlbWVudCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGNvbnRleHQgbWVudSBmb3IgdGhlIGdpdmVuIHZpZXdlcgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZXh0TWVudUZvcihmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3Iob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJY29udGV4dE1lbnUuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQljb250ZXh0TWVudS5hZGRNZW51TGlzdGVuZXIodGhpcyk7Ci0JCU1lbnUgbWVudSA9IGNvbnRleHRNZW51LmNyZWF0ZUNvbnRleHRNZW51KHZpZXdlci5nZXRDb250cm9sKCkpOwotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGNvbnRleHRNZW51LCB2aWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXIjbWVudUFib3V0VG9TaG93KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcihvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwotCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVVcERvd25CdXR0b25zMSgpIHsKLQkJaWYgKGN0cmxfdXAxICE9IG51bGwpIHsKLQkJCWlmIChpc1Nob3VsZEVuYWJsZVVwMSgpKSB7Ci0JCQkJY3RybF91cDEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF91cDEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN0cmxfZG93bjEgIT0gbnVsbCkgewotCQkJaWYgKGlzU2hvdWxkRW5hYmxlRG93bjEoKSkgewotCQkJCWN0cmxfZG93bjEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9kb3duMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3VsZEVuYWJsZVVwMSgpIHsKLQkJaWYgKHZpZXdlcl9zZWxlY3RlZCAhPSBudWxsICYmIGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3NlbGVjdGVkCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJgotCQkJCQlzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYKLQkJCQkJdmlld2VyX3NlbGVjdGVkLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYKLQkJCQkJIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpICYmIAotCQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG91bGRFbmFibGVEb3duMSgpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfc2VsZWN0ZWQKLQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGlzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSAmJgotCQkJCXNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJgotCQkJCSh2aWV3ZXJfc2VsZWN0ZWQuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyX3NlbGVjdGVkCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMSkgJiYKLQkJCQkhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkgJiYKLQkJCQlDYXRlZ29yeVNvcnRIZWxwZXIuaXNNYW51YWxDYXRlZ29yeVNvcnQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9CYXNlRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQmFzZUZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWY2NzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9CYXNlRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5Db250cm9sRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5IeXBlcmxpbmtFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgTWV0aG9kIGVkaXRvciBmb3JtIHBhZ2VzLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzYzODIKLSAqLwotcHVibGljIGNsYXNzIEJhc2VGb3JtUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQotCS8qKgotCSAqIEJ1dHRvbiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfQlVUVE9OID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9CVVRUT04gPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBfQlVUVE9OID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPV05fQlVUVE9OID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IE9SREVSX0JVVFRPTiA9IDQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBTRUxFQ1RfQlVUVE9OID0gNTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENMRUFSX0JVVFRPTiA9IDY7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBBVFRBQ0hfQlVUVE9OID0gNzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFVEFDSF9CVVRUT04gPSA4OwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEFUVEFDSF9VUkxfQlVUVE9OID0gOTsKLQkKLQkvKioKLQkgKiBUYWJsZSB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTTUFMTF9TSVpFID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FRElVTV9TSVpFID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExBUkdFX1NJWkUgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0lOR0xFX1JPVyA9IDM7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQotCXByb3RlY3RlZCBTY3JvbGxlZEZvcm0gZm9ybTsKLQotCXByb3RlY3RlZCBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFN0cmluZyBlZGl0b3JUYWJOYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBlZGl0b3JOYW1lOwotCi0JcHJvdGVjdGVkIE1ldGhvZFVuaXQgbWV0aG9kVW5pdDsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50OwotCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29udGVudEVsZW1lbnRQYXRoOwotCi0JcHJpdmF0ZSBpbnQgU0VDVElPTl9JRDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExBQkVMX0RFQ09SQVRPUl9LRVkgPSAibGFiZWxDb250cm9sRGVjb3JhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9ybSBlZGl0b3IuCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqLwotCXB1YmxpYyBCYXNlRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKGVkaXRvciwgaWQsIHRpdGxlKTsKLQkJZGVidWcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBDb250ZW50RWxlbWVudCBvYmplY3QgZnJvbSB0aGUgZWRpdG9yIGlucHV0LgotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCW1ldGhvZEVsZW1lbnQgPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnRPZlBhdGggPSAgbWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgPwotCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgbWV0aG9kRWxlbWVudCkuZ2V0UHJvY2VzcygpIDogbWV0aG9kRWxlbWVudDsKLQkJY29udGVudEVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKGVsZW1lbnRPZlBhdGgpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCW1ldGhvZFVuaXQgPSAoTWV0aG9kVW5pdCltZXRob2RFbGVtZW50OwotCQl9Ci0JCWlmIChtZXRob2RFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCWNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBtZXRob2RFbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRFbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCW1ldGhvZFVuaXQgPSBjb250ZW50RGVzY3JpcHRpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCWZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCXRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgVGhlIGFzc29jaWF0ZWQgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCBldmVudC4KLQkgKiBAcGFyYW0gbwotCSAqICAgICAgICAgICAgPz8/Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGV2ZW50LCBpbnQgbykgewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgZm9yIHRoZSBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGVkaXRvck5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdG9yTmFtZShTdHJpbmcgZWRpdG9yTmFtZSkgewotCQl0aGlzLmVkaXRvck5hbWUgPSBlZGl0b3JOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIE1ldGhvZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICBBIFRhYmxlVmlld2VyLgotCSAqIEByZXR1cm4gQSBsaXN0IG9mIE1ldGhvZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgTGlzdDw/PiByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHMoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgdmlld2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpKS5nZXRFbGVtZW50cyh2aWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCUxpc3Q8T2JqZWN0PiBlbGVtZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJZWxlbWVudExpc3QuYWRkKGVsZW1lbnRzW2ldKTsKLQkJcmV0dXJuIGVsZW1lbnRMaXN0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzZWN0aW9uIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgc2VjdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIHNlY3Rpb24gZGVzY3JpcHRpb24uCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTZWN0aW9uLkRFU0NSSVBUSU9OCi0JCQkJfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVEIHwgU2VjdGlvbi5USVRMRV9CQVIpOwotCQlHcmlkRGF0YSB0ZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLS8vCQlTdHJpbmcgdGV4dCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGRlc2NyaXB0aW9uLAotLy8JCQkJbmV3IFN0cmluZ1tdIHsgTGlicmFyeVVJVGV4dC5nZXRVSVRleHRMb3dlcihtZXRob2RFbGVtZW50KSB9KTsKLS8vCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKHRleHQpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5XUkFQCi0JCQkJfCBTV1QuTEVGVF9UT19SSUdIVCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IChob3Jpem9udGFsU3BhbiA9PSAyKSA/IDExNSA6IDEwMDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlIHdpdGhvdXQgd3JhcCBhbmQgbm8gd2lkdGhIaW50LgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbFdpdGhOb1dyYXAoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5MRUZUX1RPX1JJR0hUKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZERhdGFTdHlsZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJLy9ncmlkRGF0YS53aWR0aEhpbnQgPSAoaG9yaXpvbnRhbFNwYW4gPT0gMikgPyAxMTUgOiAxMDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQsIEdyaWREYXRhLkJFR0lOTklORywgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIExhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgdGV4dCwgR3JpZERhdGEuQkVHSU5OSU5HLAotCQkJCWhvcml6b250YWxTcGFuKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYmxhbmsgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVCbGFua0xhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwKLQkJCQkiIiwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBob3Jpem9udGFsU3Bhbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGV4dCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRleHQgc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ3RoCi0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCBob3Jpem9udGFsU3BhbikgewotCQlUZXh0IGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZVRleHQocGFyZW50LCAiIiwgc3R5bGUpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZS1saW5lIHRleHQgY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgU1dULkRFRkFVTFQsIDEwMCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHRleHRTdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRleHQgc3R5bGUuCi0JICogQHBhcmFtIGdyaWREYXRhU3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBHcmlkRGF0YSBzdHlsZS4KLQkgKiBAcGFyYW0gaGVpZ2h0Ci0JICogICAgICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSB3aWR0aAotCSAqICAgICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGNvbnRyb2wuCi0JICogQHBhcmFtIGhvcml6b250YWxTcGFuCi0JICogICAgICAgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0YWtlbiB1cCBieSB0aGUgVGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHRleHRTdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsCi0JCQlpbnQgd2lkdGgsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHRMYWJlbCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHRMYWJlbCk7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHRleHRTdHlsZSwgZ3JpZERhdGFTdHlsZSwKLQkJCQloZWlnaHQsIHdpZHRoLCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvdWJsZS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCA0MCwgMzAwLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc2luZ2xlIG9yIG11bHRpLWxpbmUgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gY29udHJvbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgaGVpZ2h0LCBpbnQgc2luZ2xlT3JNdWx0aSkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCTMwMCwgMik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNpbmdsZSBvciBtdWx0aS1saW5lIHRleHQgY29udHJvbCB3aXRoIGEgbGFiZWwgaW4gYSBjb21wb3NpdGUuCi0JICogCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IGhlaWdodCwgaW50IHNpbmdsZU9yTXVsdGksIFN0cmluZyBmaWxsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCQotCQlpbnQgaG9yaXpvbnRhbFNwYW4gPSBjYWxjdWxhdGVTcGFuKGZpbGxUZXh0KTsKLQkJCi0JCWlmKGhvcml6b250YWxTcGFuPT0xKXsKLQkJCVRleHQgdGV4dCA9IGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlRSQVZFUlNFX1RBQl9ORVhULCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwsIGhlaWdodCwgMjAwLCAxKTsKLQkJCVRleHQgdGV4dDIgPSBjcmVhdGVUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIHNpbmdsZU9yTXVsdGkgfCBTV1QuV1JBUAotCQkJCQl8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsIDEwMCwgMSk7Ci0JCQl0ZXh0Mi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwKLQkJCQkJIiIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdGV4dDsKLQkJfWVsc2V7Ci0JCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBzaW5nbGVPck11bHRpIHwgU1dULldSQVAKLQkJCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuVFJBVkVSU0VfVEFCX05FWFQsCi0JCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCQkzMDAsIDMpOwotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb3VibGUtbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQsIDIpOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgNDAsIDMwMCwgMik7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaW5nbGUgb3IgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsIGludCBoZWlnaHQsIGludCBzaW5nbGVPck11bHRpKSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0LCAyKTsKLQkJcmV0dXJuIGNyZWF0ZVRleHRFZGl0KHRvb2xraXQsIHBhcmVudCwgc2luZ2xlT3JNdWx0aSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuVFJBVkVSU0VfVEFCX05FWFQsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMLCBoZWlnaHQsCi0JCQkJMzAwLCAzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBhdXRob3IgaG9wZXNoYXJlZAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib2JveDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvV2l0aExhYmVsMyhGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGxhYmVsVGV4dCkgewotCQljcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIGxhYmVsVGV4dCwgMik7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkgfFNXVC5UUkFWRVJTRV9UQUJfTkVYVCwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxjdWxhdGUgdGhlIHRleHQncyBob3Jpem9udGFsIHNwYW4uCi0JICogCi0JICogQGF1dGhvciBob3Blc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgY2FsY3VsYXRlU3BhbihTdHJpbmcgZmlsbFRleHQpewotCQlpbnQgbGVuZ3RoID0gZmlsbFRleHQubGVuZ3RoKCk7Ci0KLQkJaWYobGVuZ3RoIDwgNjApCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuIDI7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFyZ2UgdGV4dCBjb250cm9sIHdpdGggYSBsYWJlbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiA8cD4KLQkgKiBVc2VkIGZvciB0aGUgQnJpZWYgRGVzY3JpcHRpb24gYm94LgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbExhcmdlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBsYWJlbFRleHQpOwotCQkoKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IFNXVC5ERUZBVUxUOwotCQlyZXR1cm4gY3JlYXRlVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCwgODAsIFNXVC5ERUZBVUxULCAzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGh5cGVybGluayBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBoeXBlcmxpbmsuCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICBUaGUgaHlwZXJsaW5rIGltYWdlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SW1hZ2VIeXBlcmxpbms8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBjcmVhdGVJbWFnZUh5cGVybGluayhGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIEltYWdlIGltYWdlKSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSB0b29sa2l0LmNyZWF0ZUltYWdlSHlwZXJsaW5rKHBhcmVudCwgU1dULkxFRlQKLQkJCQl8IFNXVC5UT1ApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxpbmsuc2V0SW1hZ2UoaW1hZ2UpOwotCQlpZiAodGV4dCAhPSBudWxsKQotCQkJbGluay5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGh5cGVybGluayBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc2VjdGlvbklkCi0JICogICAgICAgICAgICBUaGUgc2N0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SW1hZ2VIeXBlcmxpbms8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBjcmVhdGVIeXBlckxpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZSwgaW50IHNlY3Rpb25JRCkgewotCQlTRUNUSU9OX0lEID0gc2VjdGlvbklEOwotCQlJbWFnZUh5cGVybGluayBleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluaygKLQkJCQlleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSwgU0VDVElPTl9JRCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gZXhwYW5kTGluazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgcmljaCB0ZXh0IHN0eWxlLgotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiAgICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGNvbnRyb2wuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIHRleHQgY29udHJvbC4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUZXh0IGNvbnRyb2wuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LAotCQkJaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4sIExhYmVsIGxhYmVsKSB7Ci0JCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0KHRvb2xraXQsCi0JCQkJcGFyZW50LCAiIiwgc3R5bGUsIGNvbnRlbnRFbGVtZW50UGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJcmljaFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiByaWNoVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JTWV0aG9kUmljaFRleHQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHRFZGl0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVSaWNoVGV4dEVkaXQodG9vbGtpdCwgcGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIFNXVC5ERUZBVUxULAotCQkJCVNXVC5ERUZBVUxULCAxLCBudWxsKTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVEZWNvcmF0ZWRMYWJlbChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgZGVjb3JhdGVkTGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBwYXJlbnQsIHRleHQpOwotCQlpbnQgbWFyZ2luID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpLmdldE1heGltdW1EZWNvcmF0aW9uV2lkdGgoKTsgCi0JCSgoR3JpZERhdGEpZGVjb3JhdGVkTGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsSW5kZW50ID0gbWFyZ2luOwotCQlDb250cm9sRGVjb3JhdGlvbiBsYWJlbENvbnRyb2xEZWNvcmF0aW9uID0gbmV3IENvbnRyb2xEZWNvcmF0aW9uKGRlY29yYXRlZExhYmVsLCBTV1QuTEVGVCB8IFNXVC5CT1RUT00pOwotCQlkZWNvcmF0ZWRMYWJlbC5zZXREYXRhKExBQkVMX0RFQ09SQVRPUl9LRVksIGxhYmVsQ29udHJvbERlY29yYXRpb24pOwotCQlyZXR1cm4gZGVjb3JhdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSByaWNoIHRleHQgY29udHJvbCB3aXRoIGEgaW1hZ2UgaHlwZXJMaW5rIGFuZCBsYWJlbCBvbiBhIGZvcm0KLQkgKiBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgbGFiZWwuCi0JICogQHBhcmFtIHNlY3Rpb25JZAotCSAqICAgICAgICAgICAgVGhlIHNlY3Rpb24gSUQuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JUmljaE1ldGhvZFRleHQ8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQlGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LAotCQkJaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJSW1hZ2VIeXBlcmxpbmsgbGluayA9IGNyZWF0ZUltYWdlSHlwZXJsaW5rKHRvb2xraXQsIHBhcmVudCwgbnVsbCwKLQkJCQlBdXRob3JpbmdVSUltYWdlcy5JTUdfQ09MTEFQU0VEKTsKLQkJbGluay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5vcGVuUlRFKTsKLQkJLy8gY3JlYXRlIGxhYmVsIHdpdGggQ29udHJvbERlY29yYXRpb24gaGVyZSBmb3IgbWFya2VycwotCQlMYWJlbCBkZWNvcmF0ZWRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCXdpZHRoLCBob3Jpem9udGFsU3BhbiwgZGVjb3JhdGVkTGFiZWwpOwotCi0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQkJbGluay5zZXREYXRhKCJUaXRsZSIsIGxhYmVsVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJbGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgd2l0aCBhIGltYWdlIGh5cGVyTGluayBhbmQgbGFiZWwgb24gYSBmb3JtCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogICAgICAgICAgICBUaGUgdGV4dCBmb3IgdGhlIGxhYmVsLgotCSAqIEBwYXJhbSBzZWN0aW9uSWQKLQkgKiAgICAgICAgICAgIFRoZSBzZWN0aW9uIElELgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SVJpY2hNZXRob2RUZXh0PC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCUZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQsCi0JCQlpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWN0aW9uSUQpIHsKLQkJZmluYWwgaW50IFNFQ1RJT05fSUQgPSBzZWN0aW9uSUQ7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVybGluayh0b29sa2l0LCBwYXJlbnQsIG51bGwsCi0JCQkJQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0NPTExBUFNFRCk7Ci0JCWxpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0KLQkJLy8gY3JlYXRlIGxhYmVsIHdpdGggQ29udHJvbERlY29yYXRpb24gaGVyZSBmb3IgbWFya2VycwotCQlMYWJlbCBkZWNvcmF0ZWRMYWJlbCA9IGNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwsIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LAotCQkJCXdpZHRoLCAxLCBkZWNvcmF0ZWRMYWJlbCk7Ci0KLQkJbGluay5zZXRIcmVmKGNvbnRyb2wpOwotCQlsaW5rLnNldERhdGEoIlRpdGxlIiwgbGFiZWxUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlsaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUsIFNFQ1RJT05fSUQpOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGVkaXRvciBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSByaWNoIHRleHQgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgY29udHJvbC4KLQkgKiBAcGFyYW0gd2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgdGV4dCBjb250cm9sLgotCSAqIEBwYXJhbSBob3Jpem9udGFsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGFrZW4gdXAgYnkgdGhlIFRleHQgY29udHJvbC4KLQkgKiBAcmV0dXJuIFRoZSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0RWRpdG9yPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGNyZWF0ZVJpY2hUZXh0RWRpdG9yKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LAotCQkJaW50IHdpZHRoLCBpbnQgaG9yaXpvbnRhbFNwYW4sIExhYmVsIGxhYmVsKSB7Ci0JCUlNZXRob2RSaWNoVGV4dEVkaXRvciBlZGl0b3IgPSBNZXRob2RGb3JtVG9vbGtpdC5jcmVhdGVSaWNoVGV4dEVkaXRvcigKLQkJCQl0b29sa2l0LCBwYXJlbnQsICIiLCBzdHlsZSwgY29udGVudEVsZW1lbnRQYXRoLCBtZXRob2RFbGVtZW50LCBsYWJlbCwgZ2V0RWRpdG9yKCkuZ2V0RWRpdG9yU2l0ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWVkaXRvci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBDb21ib2JveCBzdHlsZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlKSB7Ci0JCUNvbWJvIGNvbnRyb2wgPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21ib2JveCBjb250cm9sIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFksCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tYm9ib3ggY29udHJvbCB3aXRoIGEgbGFiZWwgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqICAgICAgICAgICAgVGhlIHRleHQgZm9yIHRoZSBMYWJlbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBDb21ib2JveCBzdHlsZS4KLQkgKiBAcGFyYW0gZ3JpZERhdGFTdHlsZQotCSAqICAgICAgICAgICAgVGhlIEdyaWREYXRhIHN0eWxlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9ib3g8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDQ29tYm9XaXRoTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0TGFiZWwsIGludCBzdHlsZSwgaW50IGdyaWREYXRhU3R5bGUpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCB0ZXh0TGFiZWwpOwotCQlyZXR1cm4gY3JlYXRlQ29tYm8ocGFyZW50LCBzdHlsZSwgZ3JpZERhdGFTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbWJvYm94IGNvbnRyb2wgd2l0aCBhIGxhYmVsIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IGZvciB0aGUgTGFiZWwuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ib2JveDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIENvbWJvIGNyZWF0ZUNvbWJvV2l0aExhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQkJcmV0dXJuIGNyZWF0ZUNvbWJvKHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5GTEFUIHwgU1dULlJFQURfT05MWSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHNlY3Rpb24KLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgc2VjdGlvbi4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LCBTZWN0aW9uIHNlY3Rpb24pIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIHZlcnRpY2FsU3BhbgotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiByb3cgY2VsbHMgdGFrZW4gdXAgYnkgdGhlIENvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBDb21wb3NpdGUuCi0JICogQHBhcmFtIG51bUNvbHVtbnMKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZC4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IHZlcnRpY2FsU3BhbiwKLQkJCWludCBob3Jpem9udGFsU3BhbiwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gdmVydGljYWxTcGFuOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobnVtQ29sdW1ucywgZmFsc2UpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB2ZXJ0aWNhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93IGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBDb21wb3NpdGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHZlcnRpY2FsU3BhbikgewotCQlyZXR1cm4gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHBhcmVudCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCXZlcnRpY2FsU3BhbiwgMSwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSBmb3IgZGlzcGxheWluZyBidXR0b25zIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICBUaGUgQ29tcG9zaXRlIHR5cGUuCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZUZvckJ1dHRvbnMoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBwYXJlbnQsIEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIsIFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgMSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGV4cGFuZGVkIGNvbXBvc2l0ZSBpbiB0aGUgZm9ybQotCSAqIDxwPgotCSAqIFVzZWQgdG8gaG9sZCBhbiBleHBhbmRlZCByaWNoIHRleHQgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUV4cGFuZGVkQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gZXhwYW5kZWRDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRhYmxlIG9uIGEgZm9ybSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgVGhlIFRhYmxlIHN0eWxlLgotCSAqIEBwYXJhbSBncmlkRGF0YVN0eWxlCi0JICogICAgICAgICAgICBUaGUgR3JpZERhdGEgc3R5bGUuCi0JICogQHBhcmFtIGhlaWdodAotCSAqICAgICAgICAgICAgVGhlIGhlaWdodCBvZiB0aGUgVGFibGUuCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICBUaGUgd2lkdGggb2YgdGhlIFRhYmxlLgotCSAqIEBwYXJhbSB2ZXJ0aWNhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93IGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUYWJsZS4KLQkgKiBAcGFyYW0gaG9yaXpvbnRhbFNwYW4KLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRha2VuIHVwIGJ5IHRoZSBUYWJsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRhYmxlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBncmlkRGF0YVN0eWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCi0JCQlpbnQgdmVydGljYWxTcGFuLCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJVGFibGUgdGFibGUgPSB0b29sa2l0LmNyZWF0ZVRhYmxlKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IHZlcnRpY2FsU3BhbjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgb24gYSBmb3JtIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIFRoZSB0YWJsZSB0YWJsZS4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRhYmxlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRhYmxlIGNyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBTTUFMTF9TSVpFOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCTU2LCAyMDAsIDEsIDEpOwotCQljYXNlIE1FRElVTV9TSVpFOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCTExMiwgMjAwLCAxLCAxKTsKLQkJY2FzZSBMQVJHRV9TSVpFOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCTIwMCwgMjAwLCAxLCAxKTsKLQkJY2FzZSBTSU5HTEVfUk9XOgotCQkJcmV0dXJuIGNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIDIwLCAyMDAsIDEsIDEpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1dHRvbiBvbiBhIGZvcm0gcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgVGhlIGJ1dHRvbiB0eXBlLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB0eXBlKSB7Ci0JCUJ1dHRvbiBidXR0b247Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIEFERF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIFJFTU9WRV9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5SRU1PVkVfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIFVQX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBET1dOX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQljYXNlIE9SREVSX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0Lk9SREVSX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBTRUxFQ1RfQlVUVE9OOgotCQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LAotCQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTEVBUl9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5DTEVBUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVRUQUNIX0JVVFRPTjoKLQkJCWJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkFUVEFDSF9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVRUQUNIX1VSTF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5BVFRBQ0hfVVJMX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCQlicmVhazsJCQotCQljYXNlIERFVEFDSF9CVVRUT046Ci0JCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsCi0JCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVRBQ0hfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgaGVpZ2h0IG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCUhlaWdodCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCkgewotCQlyZXR1cm4gZm9ybS5nZXRCb3VuZHMoKS5oZWlnaHQgLSAzICogMzI7Ci0JfQotCi0JLyoqCi0JICogR2V0IHdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4KLQkgKiAJCVdpZHRoIG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpIHsKLQkJcmV0dXJuIGZvcm0uZ2V0Qm91bmRzKCkud2lkdGggLSAyICogMzI7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4YWY3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NhdGVnb3J5R3VpZGFuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIGNvbnRlbnQgZWxlbWVudCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKiBUT0RPIC0gY2hhbmdlIG5hbWUgb2YgY2xhc3MgdG8gQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5R3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImNhdGVnb3J5R3VpZGFuY2VzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENhdGVnb3J5R3VpZGFuY2VQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuR1VJREFOQ0VfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGxpc3QgPSBNZXRob2RFbGVtZW50VXRpbAotCQkJCQkJLmdldFNlbGVjdGVkR3VpZGFuY2VzKGNvbnRlbnRFbGVtZW50KTsKLQkJCQlMaXN0IGxvY2FsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvciAmJiBjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2wpIHx8IG9iagotCQkJCQkJCS5lcXVhbHMoY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKSkgewotCQkJCQkJbG9jYWwuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGxvY2FsLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCShFeGFtcGxlKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gcmVtb3ZlIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkiZnJvbSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DaGVja2xpc3RJdGVtc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ2hlY2tsaXN0SXRlbXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmM4ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DaGVja2xpc3RJdGVtc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU2VjdGlvbnNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFkZFRvU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZW1vdmVGcm9tU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIFRoZSBDaGVjayBJdGVtIHBhZ2UgaW4gdGhlIENoZWNrbGlzdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tsaXN0SXRlbXNQYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiY2hlY2tsaXN0Q2hlY2tJdGVtc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRleHQgY3RybF9uYW1lOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGQsIGN0cmxfZGVsZXRlLCBjdHJsX3VwLCBjdHJsX2Rvd24sIGN0cmxfb3JkZXI7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfY2hlY2tJdGVtczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgY2hlY2tJdGVtc1RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBTZWN0aW9uTGlzdCBhbGxjaGVja0l0ZW1zOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgYWN0aXZlQ29udHJvbDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHRFZGl0b3IgY3RybF9leHBhbmRlZDsKLQotCXByaXZhdGUgSW1hZ2VIeXBlcmxpbmsgZXhwYW5kTGluazsKLQotCXByaXZhdGUgTGFiZWwgZXhwYW5kTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQlwcml2YXRlIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGV4cGFuZGVkQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9tYWluZGVzYzsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY2hlY2tJdGVtc1ZpZXdlckNvbnRlbnRQcm92aWRlcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgY2hlY2tJdGVtc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIENoZWNrbGlzdCBjaGVja2xpc3Q7Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBjdXJyZW50SXRlbTsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tsaXN0SXRlbXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCU1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCBtZXRob2RFbGVtZW50SW5wdXQgPSAoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KSBpbnB1dDsKLQkJY2hlY2tsaXN0ID0gKENoZWNrbGlzdCkgbWV0aG9kRWxlbWVudElucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZm9ybSBjb250ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQotCQlTdHJpbmcgZWxlbWVudExhYmVsID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCk7Ci0JCWZvcm0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREFOQ0UKLQkJCQkrICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKTogIiArIG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQlmb3JtU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5OT19USVRMRSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQl9Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCi0JCS8vIENyZWF0ZSB0aGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uLgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRQotCQkJCQkJfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5DSEVDS19JVEVNU19TRUNUSU9OX05BTUUpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuQ0hFQ0tfSVRFTVNfU0VDVElPTl9ERVNDKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQlFZGl0b3JzQ29udGV4dEhlbHBlci5zZXRIZWxwKGdlbmVyYWxDb21wb3NpdGUuZ2V0UGFyZW50KCksIGNoZWNrbGlzdCk7Ci0KLQkJQ29tcG9zaXRlIHBhbmUxID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJcGFuZTEuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlwYW5lMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCX0KLQotCQlMYWJlbCBsX25hbWUgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHBhbmUxLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEVDS19JVEVNU19URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfY2hlY2tJdGVtcyA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFuZTEsIFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQkJY3RybF9jaGVja0l0ZW1zLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJaW5pdFByb3ZpZGVycygpOwotCi0JCWNoZWNrSXRlbXNUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX2NoZWNrSXRlbXMpOwotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkuc2V0Q29udGVudFByb3ZpZGVyKGNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXIpOwotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihjaGVja0l0ZW1zVmlld2VyTGFiZWxQcm92aWRlcik7Ci0KLQkJQ29tcG9zaXRlIHBhbmUyID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCXBhbmUyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsKLQkJcGFuZTIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWN0cmxfYWRkID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsCi0JCQkJU1dULk5PTkUpOwotCQljdHJsX2FkZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQljdHJsX2RlbGV0ZSA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERUxFVEVfQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kZWxldGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWN0cmxfdXAgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwgQXV0aG9yaW5nVUlUZXh0LlVQX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX2Rvd24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuRE9XTl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX2Rvd24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX29yZGVyID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk9SREVSX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfb3JkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gbmFtZQotCQlMYWJlbCBuYW1lTGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9uYW1lID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsICIiLCBTV1QuU0lOR0xFKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJY3RybF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3JlYXRlQmxhbmtMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCA0KTsKLQkJCi0JCWN0cmxfbWFpbmRlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGluaygKLQkJCQl0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkyNTAsIDMwMCwgNCk7Ci0KLQkJY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihleHBhbmRlZENvbXBvc2l0ZSk7Ci0KLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCQllbmFibGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaWJyYXJ5IGFuZCBzZWxlY3Rpb24gbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIoY3VycmVudEl0ZW0pOwotCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0KLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQoKEVPYmplY3QpIGNoZWNrbGlzdCwKLS8vCQkJCQkJZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotLy8JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQlsb2FkRGF0YSgpOwotLy8JCQkJfQotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJbG9hZERhdGEoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZGVhY3RpdmF0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZE5hbWUgPSBjdXJyZW50SXRlbS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdOYW1lID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkJCQkJLy9uZXdOYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdOYW1lKTsKLQkJCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkgPT0gbnVsbAotCQkJCQkJCXx8IGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS19JVEVNKTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoTGlicmFyeVVJVGV4dC5URVhUX0NIRUNLX0lURU0pKTsgCi0JCQkJCQlpZiAob2xkTmFtZSAhPSBudWxsICYmIG9sZE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlnZXRFZGl0b3JTaXRlKCkKLQkJCQkJCQkJCS5nZXRBY3Rpb25CYXJzKCkKLQkJCQkJCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCQkJCQkuc2V0RXJyb3JNZXNzYWdlKAotCQkJCQkJCQkJCQlQbGF0Zm9ybVVJCi0JCQkJCQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCQkJLmdldFNoYXJlZEltYWdlcygpCi0JCQkJCQkJCQkJCQkJLmdldEltYWdlKAotCQkJCQkJCQkJCQkJCQkJSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spLAotCQkJCQkJCQkJCQltc2cpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKCFvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWN1cnJlbnRJdGVtLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQluZXdOYW1lLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbWFpbmRlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9tYWluZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCXNhdmVNYWluRGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2FkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gY2hpbGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVNlY3Rpb24oKTsKLQkJCQlTdHJpbmcgbmV3TmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJQXV0aG9yaW5nVUlUZXh0Lk5FV19FTEVNRU5UX1RFWFQsCi0JCQkJCQluZXcgU3RyaW5nW10geyBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0hFQ0tfSVRFTSB9KTsKLQkJCQljaGlsZC5zZXROYW1lKG5ld05hbWUpOwotCQkJCUFkZFRvU2VjdGlvbkxpc3RDb21tYW5kIGNtZCA9IG5ldyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgY2hpbGQsIGFsbGNoZWNrSXRlbXMpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJY2hpbGQpKTsKLQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIG5ld05hbWUubGVuZ3RoKCkpOwotCQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkJLnNldEVycm9yTWVzc2FnZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZWxldGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCQkuc2V0RXJyb3JNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLnRvTGlzdCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSB7Ci0JCQkJCQlSZW1vdmVGcm9tU2VjdGlvbkxpc3QgY21kID0gbmV3IFJlbW92ZUZyb21TZWN0aW9uTGlzdCgKLQkJCQkJCQkJY2hlY2tsaXN0LCAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBvLAotCQkJCQkJCQlhbGxjaGVja0l0ZW1zKTsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQllZGl0SXRlbShudWxsKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF91cC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNoZWNrSXRlbXNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJY2hlY2tsaXN0LCBtb3ZlVXBJdGVtcywgYWxsY2hlY2tJdGVtcywgMSk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kb3duLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCWNoZWNrbGlzdCwgbW92ZURvd25JdGVtcywgYWxsY2hlY2tJdGVtcywgMCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQotCQkJCWNoZWNrSXRlbXNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKGNoZWNrbGlzdCkpIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9vcmRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTZWN0aW9uc09yZGVyRGlhbG9nIGRsZyA9IG5ldyBTZWN0aW9uc09yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWNoZWNrbGlzdCwKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX3RpdGxlLCAKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX2Rlc2NyaXB0aW9uLCAKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoZWNrbGlzdE9yZGVyX2NoZWNrbGlzdGl0ZW1zX3RleHQpOyAKLQkJCQlkbGcub3BlbigpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVDb250cm9scyhib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZWxldGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9vcmRlci5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJLy8gU2F2ZSB0aGUgSXRlbSBvcmRlci4KLQkJaWYgKGFsbGNoZWNrSXRlbXMgIT0gbnVsbCkgewotCQkJYWxsY2hlY2tJdGVtcy5hcHBseSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIHdpdGggZGF0YSBmcm9tIHRoZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCWFsbGNoZWNrSXRlbXMgPSBudWxsOwotCQljaGVja0l0ZW1zVGFibGVWaWV3ZXIuc2V0SW5wdXQoY2hlY2tsaXN0KTsKLQkJY2hlY2tJdGVtc1RhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJZWRpdEl0ZW0oY3VycmVudEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEVkaXQgY3VycmVudCBJdGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0SXRlbShvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSkgewotCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQotCQlpZiAoY3RybF9tYWluZGVzYy5nZXRNb2RpZmllZCgpKSB7Ci0JCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCX0KLQotCQljdXJyZW50SXRlbSA9IGl0ZW07Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY3VycmVudEl0ZW0gIT0gbnVsbCkgewotCQkJbmFtZSA9IGN1cnJlbnRJdGVtLmdldE5hbWUoKTsKLQkJCWRlc2MgPSBjdXJyZW50SXRlbS5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCS5zZXRFcnJvck1lc3NhZ2UoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldFRleHQoZGVzYyA9PSBudWxsID8gIiIgOiBkZXNjKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0KGN1cnJlbnRJdGVtKTsKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCS8vIGNsb3NlIGFueSBGaW5kL1JlcGxhY2UgZGlhbG9nIG9wZW4gaW4gdGhlIFJURQotCQkJY3RybF9tYWluZGVzYy5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXRFbGVtZW50KGN1cnJlbnRJdGVtKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUoY3VycmVudEl0ZW0gPT0gbnVsbCk7Ci0KLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gY29udHJvbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ29udHJvbHMoKSB7Ci0JCWlmIChjaGVja2xpc3QuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhjdXJyZW50SXRlbSkpIHsKLQkJCWlmICghVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQljdHJsX25hbWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgbGlzdGVuZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobGliTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCQkJfQotCQkJbGliTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpIHsKLQkJZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkvLyBIeXBlcmxpbmsgZGVzYwotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOyAKLQkJZXhwYW5kTGluay5zZXRVbmRlcmxpbmVkKGZhbHNlKTsKLQkJZXhwYW5kTGluay5hZGRIeXBlcmxpbmtMaXN0ZW5lcihuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCXRvZ2dsZShlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVG9nZ2xlIERlc2NyaXB0aW9uIGNvbnRyb2wgdG8gZXhwYW5kIGFuZCBjb250cm9sIHN0YXRlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSN0b2dnbGUob3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCWlmIChjdXJyZW50SXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoY3RybF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkID0gY3JlYXRlUmljaFRleHRFZGl0b3IodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCVNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCWdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCksIGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSwgMiwgZXhwYW5kTGFiZWwpOwotCQkJY3RybF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQlzZWN0aW9uQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ29tcG9zaXRlKTsKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJZXhwYW5kTGFiZWwuc2V0VGV4dChjdXJyZW50SXRlbS5nZXROYW1lKCkgKwotCQkJCQkiIC0gIiArIChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpLmdldERhdGEoIlRpdGxlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmIChlZGl0YWJsZSkgewotCQkJCWN0cmxfZXhwYW5kZWQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCXNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChyaWNoVGV4dCk7Ci0JCX0KLQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGVkaXRvcikgewotCQlhY3RpdmVDb250cm9sID0gZWRpdG9yOwotCX0KLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCWNoZWNrSXRlbXNWaWV3ZXJDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0ICE9IGNoZWNrbGlzdCkKLQkJCQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCQkJaWYgKGFsbGNoZWNrSXRlbXMgPT0gbnVsbCkgewotCQkJCQlhbGxjaGVja0l0ZW1zID0gbmV3IFNlY3Rpb25MaXN0KGNoZWNrbGlzdCwKLQkJCQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbGNoZWNrSXRlbXMudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWNoZWNrSXRlbXNWaWV3ZXJMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAhY2hlY2tsaXN0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoCi0JCQkJCQllbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZU1haW5EZXNjcmlwdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRJdGVtICE9IG51bGwpIHsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCTogY3RybF9tYWluZGVzYzsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50SXRlbS5nZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsCi0JCQkJCW9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50SXRlbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbkRlc2NyaXB0aW9uKCksCi0JCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJRm9ybUVkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1NlbGVjdGlvbigpIHsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjaGVja0l0ZW1zVGFibGVWaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpKSB7Ci0JCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQlpZiAoY2hlY2tJdGVtc1RhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQoY2hlY2tsaXN0KSAmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCWlmIChjaGVja0l0ZW1zVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgY2hlY2tJdGVtc1RhYmxlVmlld2VyCi0JCQkJCS5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZChjaGVja2xpc3QpICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJZWRpdEl0ZW0oKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ1ZpZXdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ1ZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NWZkNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWdWaWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuQ29uZmlndXJhdGlvbkFkZFZpZXdzRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Db25maWd1cmF0aW9uT3JkZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1ZpZXdGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Db25maWd1cmF0aW9uVmlld0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5Gb3JtQ29sb3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLQotLyoqCi0gKiBQYWdlIGZvciBjdXN0b21pemluZyBwdWJsaXNoaW5nIHZpZXdzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTczODI3Ci0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzQyNjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1ZpZXdQYWdlIGV4dGVuZHMgRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBmb3JtUHJlZml4ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvbjsgCi0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIENUYWJGb2xkZXIgdGFiRm9sZGVyOwotCXByaXZhdGUgQ1RhYkl0ZW0gdGFiRGVmYXVsdHZpZXdJdGVtOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVtb3ZlQnV0dG9uLCBtYWtlRGVmYXVsdEJ1dHRvbiwgb3JkZXJCdXR0b247Ci0KLQlwcml2YXRlIE9iamVjdCBzZWxlY3RlZEl0ZW0gPSBudWxsOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIENvbmZpZ1ZpZXdQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZV9jb25maWd1cmF0aW9uVmlld3MsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX3ZpZXdzKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgY29uZmlnSW5wdXQgPSAoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKLQkJY29uZmlnID0gY29uZmlnSW5wdXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCi0JCWFjdGlvbk1nciA9ICgoQ29uZmlndXJhdGlvbkVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQkvLyBnZXQgcGx1Z2luIGxvZ2dlcgotCQlsb2dnZXIgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJZm9ybS5zZXRUZXh0KGZvcm1QcmVmaXggKyBjb25maWcuZ2V0TmFtZSgpKTsKLQkJdG9vbGtpdCA9IG1hbmFnZWRGb3JtLmdldFRvb2xraXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCS8vIENyZWF0ZSB0aGUgdmlldyBzZWN0aW9uLgotCQlTZWN0aW9uIHZpZXdTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGZvcm0uZ2V0Qm9keSgpLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdmlld1NlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXZpZXdTZWN0aW9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uVGl0bGUpOyAKLQkJdmlld1NlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VfY29uZmlndXJhdGlvblZpZXdTZWN0aW9uTWVzc2FnZSk7IAotCQl2aWV3U2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZpZXdTZWN0aW9uKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl2aWV3U2VjdGlvbi5zZXRDbGllbnQocGFyZW50KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudC5nZXRQYXJlbnQoKSwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCWNyZWF0ZUJ1dHRvblBhbmUocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFiZm9sZGVyIHBhbmUKLQkJY3JlYXRlVGFiUGFuZShwYXJlbnQpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhcmVudCk7Ci0JCWxvYWREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5UT1AgfCBTV1QuQk9SREVSKTsKLQkJdGFiRm9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdGFiRm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIHNldCB0YWJmb2xkZXIgYmFja2dyb3VuZCBjb2xvcgotCQlDb2xvciBzZWxlY3RlZENvbG9yID0gdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRDb2xvcihGb3JtQ29sb3JzLlRCX0JHKTsKLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbkJhY2tncm91bmQobmV3IENvbG9yW10geyBzZWxlY3RlZENvbG9yLCB0b29sa2l0LmdldENvbG9ycygpLmdldEJhY2tncm91bmQoKSB9LCBuZXcgaW50W10geyA1MCB9KTsKLQkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHRhYkZvbGRlcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYnV0dG9uUGFuZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0KLQkJQnV0dG9uIGFkZEJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX2FkZFZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWFkZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBDb25maWdQcm9jZXNzVmlld0RpYWxvZyBmZCA9IG5ldwotCQkJCS8vIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkvLyBjb25maWcpOwotCQkJCS8vIENvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nLnNldERlZmF1bHRJbWFnZShEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCkpOwotCQkJCUlGaWx0ZXIgZmlsdGVyID0gbmV3IFByb2Nlc3NWaWV3RmlsdGVyKGNvbmZpZywgbnVsbCwKLQkJCQkJCUZpbHRlckNvbnN0YW50cy5BTExfRUxFTUVOVFMpOwotCQkJCUNvbmZpZ3VyYXRpb25BZGRWaWV3c0RpYWxvZyBmZCA9IG5ldyBDb25maWd1cmF0aW9uQWRkVmlld3NEaWFsb2coCi0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpKTsKLQkJCQlmZC5zZXRUeXBlcyhnZXRUeXBlcygpKTsKLQkJCQlmZAotCQkJCQkJLnNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ1Byb2Nlc3NWaWV3RGlhbG9nX1NlbGVjdENhdGVnb3JpZXMpOyAKLQkJCQlmZC5zZXRJbnB1dChjb25maWcpOwotCQkJCWZkLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJCWZkLnNldEV4aXN0aW5nRWxlbWVudHMoY29uZmlnLmdldFByb2Nlc3NWaWV3cygpKTsKLQkJCQlmZC5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikpLAotCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQlMaXN0IHZpZXdzID0gZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCi0JCQkJLy8gYWRkIHZpZXcgdG8gY29uZmlndXJhdGlvbgotCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQotCQkJCQkJaWYgKGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5jb250YWlucygKLQkJCQkJCQkJKENvbnRlbnRDYXRlZ29yeSkgb2JqKSkgewotCQkJCQkJCVN0cmluZyBuYW1lID0gKChDb250ZW50Q2F0ZWdvcnkpIG9iaikuZ2V0TmFtZSgpOwotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ190aXRsZTsgCi0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlVmlld0V4aXN0c0RpYWxvZ19tZXNzYWdlLCBuYW1lKTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksCi0JCQkJCQkJCQkoQ29udGVudENhdGVnb3J5KSBvYmosIC0xKTsKLQkJCQkJCQlpZihzdGF0dXMpewotCQkJCQkJCQlhZGRWaWV3KChDb250ZW50Q2F0ZWdvcnkpIG9iaik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQkvLyByZW1vdmUgYnV0dG9uCi0JCXJlbW92ZUJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX3JlbW92ZVZpZXdCdXR0b25UZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXJlbW92ZVZpZXcoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gbWFrZSBkZWZhdWx0IGJ1dHRvbgotCQltYWtlRGVmYXVsdEJ1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJYnV0dG9uUGFuZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ1ZpZXdQYWdlX21ha2VEZWZhdWx0QnV0dG9uVGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCW1ha2VEZWZhdWx0QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQltYWtlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQltYWtlRGVmYXVsdFZpZXcoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlvcmRlckJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKAotCQkJCWJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3JkZXJCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlvcmRlckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbmZpZ3VyYXRpb25PcmRlckRpYWxvZyBkbGcgPSBuZXcgQ29uZmlndXJhdGlvbk9yZGVyRGlhbG9nKAotCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCWNvbmZpZywKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSk7Ci0JCQkJaW50IHJldCA9IGRsZy5vcGVuKCk7Ci0JCQkJaWYocmV0ID09IFdpbmRvdy5PSykgcmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihidXR0b25QYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNlbGVjdGVkIHZpZXcKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVmlldygpIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGRvbid0IGNoYW5nZSBkZWZhdWx0IHZpZXcgaWYgdGhlIHZpZXcgaXMgbm90IHJlbW92ZWQuCi0JCS8vIDE1NTAyNSAtIGVycm9yIHdoZW4gcmVtb3ZpbmcgdGhlIHZpZXcgaW4gY29uZmlndXJhdGlvbgotCQlTdHJpbmcgaXRlbVRleHQgPSBpdGVtLmdldFRleHQoKTsJCQotCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25maWdWaWV3UGFnZVJlbW92ZVZpZXdEaWFsb2dfdGl0bGU7IAotCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnVmlld1BhZ2VSZW1vdmVWaWV3RGlhbG9nX21lc3NhZ2UsIGl0ZW0gCi0JCS5nZXRUZXh0KCkpOwotCQlib29sZWFuIHJldCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtZXNzYWdlKTsKLQotCQlpZiAoIXJldCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIHJlbW92ZURlZmF1bHQgPSBmYWxzZTsKLQkJaWYgKHRhYkRlZmF1bHR2aWV3SXRlbSAhPSBudWxsICYmIGl0ZW0gPT0gdGFiRGVmYXVsdHZpZXdJdGVtKSB7Ci0JCQlyZW1vdmVEZWZhdWx0ID0gdHJ1ZTsKLQkJfQotCi0JCQlMaXN0IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQkJLy8gaWYgdGhlcmUgaXMgYSBkZWZhdWx0IHZpZXcgdGFiLCBhbmQgaXQncyB0aGUgb25lIHNsZWN0ZWQgdG8gYmUgcmVtb3ZlZAotCQkJaWYgKHJlbW92ZURlZmF1bHQpIHsKLQkJCQlTdHJpbmcgZGVmYXVsdFRleHQgPSAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OyAKLQkJCQlpbnQgaWR4ID0gaXRlbVRleHQubGFzdEluZGV4T2YoZGVmYXVsdFRleHQpOwotCQkJCWlmIChpZHggPiAwKSB7Ci0JCQkJCWl0ZW1UZXh0ID0gaXRlbVRleHQuc3Vic3RyaW5nKDAsaWR4KTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGl0b3IubmV4dCgpOwotCQkJCQotCQkJCWlmIChjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKGl0ZW1UZXh0KSkgewotCQkJCQkvLyByZW1vdmUgaXQgZnJvbSB2aWV3cwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBjb25maWcsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCQkJCWNhdGVnb3J5LCAtMSk7Ci0KLQkJCQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0KLQkJCQkJaWYgKChkZWZhdWx0VmlldyAhPSBudWxsKSAmJiAoZGVmYXVsdFZpZXcuZXF1YWxzKGNhdGVnb3J5KSkpIHsKLQkJCQkJCWlmICh2aWV3cy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29uZmlnLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCksCi0JCQkJCQkJCQkJCShDb250ZW50Q2F0ZWdvcnkpIHZpZXdzLmdldCgwKSwgLTEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHJlbW92ZSB0YWIgaXRlbQotCQkJCQlpdGVtLmRpc3Bvc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCXZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCQlpZiAoKHZpZXdzID09IG51bGwpIHx8ICh2aWV3cy5zaXplKCkgPD0gMCkpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1ha2VEZWZhdWx0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQkvLyBtYWtlIHRoZSAxc3QgdGFiIGFzIHRoZSBkZWZhdWx0IHZpZXcgaWYgdGhlIGRlZmF1bHQgb25lIGlzIHJlbW92ZWQKLQkJaWYgKHJlbW92ZURlZmF1bHQpIHsKLQkJCUNvbnRyb2xbXSB0YWJMaXN0ID0gdGFiRm9sZGVyLmdldFRhYkxpc3QoKTsKLQkJCWlmICh0YWJMaXN0ICE9IG51bGwgJiYgdGFiTGlzdC5sZW5ndGggPiAwKSB7Ci0JCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJCQltYWtlRGVmYXVsdFZpZXcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB2aWV3Ci0JICogCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRWaWV3KENvbnRlbnRDYXRlZ29yeSBvYmopIHsKLQkJc2VsZWN0ZWRJdGVtID0gb2JqOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJVHJlZVZpZXdlciB0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25WaWV3RmlsdGVyKGNvbmZpZywgdHJlZVZpZXdlcik7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQWRhcHRlckZhY3RvcnkoY29uZmlnRmlsdGVyKTsKLQotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQoc2VsZWN0ZWRJdGVtLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCi0JCQkJcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzZWxlY3RlZEl0ZW0pLnRvQXJyYXkoKTsKLQkJCQkvLyByZXR1cm4gaXRlbVByb3ZpZGVyLmdldEVsZW1lbnRzKHNlbGVjdGVkSXRlbSkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXIoY29uZmlnLAotCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXRyeSB7Ci0JCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZpZyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciBjcmVhdGluZyB0cmVldmlld2VyIGZvciBjb25maWciLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuVE9QKTsKLQkJaXRlbS5zZXRUZXh0KCgoQ29udGVudENhdGVnb3J5KSBvYmopLmdldE5hbWUoKSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCS8vIG1ha2UgYWxsIGJ1dHRvbnMgZW5hYmxlZAotCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJbWFrZURlZmF1bHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihjb21wb3NpdGUpOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIE1ha2Ugc2VsZWN0ZWQgYXMgZGVmYXVsdCB2aWV3Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VEZWZhdWx0VmlldygpIHsKLQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKTsKLQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBpdG9yLm5leHQoKTsKLQkJCWlmIChjYXRlZ29yeS5nZXROYW1lKCkuZXF1YWxzKGl0ZW0uZ2V0VGV4dCgpKSkgewotCQkJCWNsZWFyRGVmYXVsdFZpZXdJbmRpY2F0b3IoKTsKLQkJCQkvLyBtYWtlIHRoYXQgdmlldyBkZWZhdWx0Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29uZmlnLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQkJCWNhdGVnb3J5LCAtMSk7Ci0JCQkJc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkRGF0YSgpIHsKLQkJLy8gZ2V0IHByb2Nlc3Mgdmlld3MKLQkJTGlzdCB2aWV3cyA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkvLyBjcmVhdGUgdmlldyBpbiBVSQotCQkJYWRkVmlldygoQ29udGVudENhdGVnb3J5KSBpdG9yLm5leHQoKSk7Ci0JCX0KLQotCQkvLyBnZXQgZGVmYXVsdCB2aWV3Ci0JCUNvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldyA9IGNvbmZpZy5nZXREZWZhdWx0VmlldygpOwotCQlpbnQgY250ID0gdGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOwotCQlpZiAoZGVmYXVsdFZpZXcgIT0gbnVsbCkgewotCQkJLy8gaWYgZGVmYXVsdCB2aWV3IGlzIGRlZmluZWQsIHNlbGVjdCB0aGF0IHZpZXcKLQkJCUNUYWJJdGVtW10gaXRlbXMgPSB0YWJGb2xkZXIuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGl0ZW1zW2ldLmdldFRleHQoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoZGVmYXVsdFZpZXcuZ2V0TmFtZSgpKSkgewotCQkJCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKGl0ZW1zW2ldKTsKLQkJCQkJc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbXNbaV0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY250ID4gMCkgewotCQkJLy8gZWxzZSBzZWxlY3QgZmlyc3QgdmlldwotCQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaCgpewotCQlDb250ZW50Q2F0ZWdvcnkgZGVmYXVsdFZpZXcgPSBjb25maWcuZ2V0RGVmYXVsdFZpZXcoKTsKLQkJU3RyaW5nIGRlZmF1bHRWaWV3TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmKGRlZmF1bHRWaWV3IT1udWxsKSB7Ci0JCQlkZWZhdWx0Vmlld05hbWUgPSBkZWZhdWx0Vmlldy5nZXROYW1lKCk7Ci0JCQljbGVhckRlZmF1bHRWaWV3SW5kaWNhdG9yKCk7Ci0JCX0KLQkJU3RyaW5nIHNlbGVjdGVkVmlldyA9IHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKS5nZXRUZXh0KCk7Ci0JCU1hcCBvcmlnVmlld3MgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IoaW50IGk9MDtpPHRhYkZvbGRlci5nZXRJdGVtQ291bnQoKTtpKyspewotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGkpOwotCQkJb3JpZ1ZpZXdzLnB1dChpdGVtLmdldFRleHQoKSwgaXRlbS5nZXRDb250cm9sKCkpOwotCQl9Ci0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWludCBpbmRleCA9IDA7Ci0JCWludCBzZWxlY3RlZEluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdmlld3MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCkgJiYgaW5kZXg8dGFiRm9sZGVyLmdldEl0ZW1Db3VudCgpOykgewotCQkJU3RyaW5nIHZpZXcgPSAoKENvbnRlbnRDYXRlZ29yeSlpdG9yLm5leHQoKSkuZ2V0TmFtZSgpOwotCQkJQ1RhYkl0ZW0gaXRlbSA9IHRhYkZvbGRlci5nZXRJdGVtKGluZGV4KyspOwotCQkJaXRlbS5zZXRUZXh0KHZpZXcpOwotCQkJaXRlbS5zZXRDb250cm9sKChDb250cm9sKW9yaWdWaWV3cy5nZXQodmlldykpOwotCQkJaWYodmlldy5lcXVhbHMoZGVmYXVsdFZpZXdOYW1lKSkgc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoaXRlbSk7Ci0JCQlpZih2aWV3LmVxdWFscyhzZWxlY3RlZFZpZXcpKSBzZWxlY3RlZEluZGV4ID0gaW5kZXgtMTsKLQkJfQotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGVkSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGFwcGVuZGVkICIoZGVmYXVsdCkiIGZyb20gdGhlIHRhYiBmb3IgdGhlIGRlZmF1bHQKLQkgKiB2aWV3LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2hhbmdpbmcgdGhlIGRlZmF1bHQgdmlldyEKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJEZWZhdWx0Vmlld0luZGljYXRvcigpIHsKLQkJQ29udGVudENhdGVnb3J5IGRlZmF1bHRWaWV3ID0gY29uZmlnLmdldERlZmF1bHRWaWV3KCk7Ci0JCWlmIChkZWZhdWx0VmlldyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZpZXdUYWJOYW1lID0gZGVmYXVsdFZpZXcuZ2V0TmFtZSgpCi0JCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fZGVmYXVsdDsgCi0JCQlDVGFiSXRlbVtdIGl0ZW1zID0gdGFiRm9sZGVyLmdldEl0ZW1zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBpdGVtc1tpXS5nZXRUZXh0KCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKGRlZmF1bHRWaWV3VGFiTmFtZSkpIHsKLQkJCQkJaXRlbXNbaV0uc2V0VGV4dChkZWZhdWx0Vmlldy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhcHBlbmRzICIoZGVmYXVsdCkiIHRvIHRoZSB0YWIgb2YgdGhlIGRlZmF1bHQgdmlldy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdFZpZXdJbmRpY2F0b3IoQ1RhYkl0ZW0gaXRlbSkgewotCQl0YWJEZWZhdWx0dmlld0l0ZW0gPSBpdGVtOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBpdGVtLmdldFRleHQoKQotCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9kZWZhdWx0OyAKLQkJaXRlbS5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0VHlwZXMoKSB7Ci0JCVN0cmluZ1tdIENhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW10geyBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVMsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLkFMTF9FTEVNRU5UUywgRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVTLAotCQkJCUZpbHRlckNvbnN0YW50cy5ET01BSU5TLCBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFMsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMsIEZpbHRlckNvbnN0YW50cy5UT09MUyB9OwotCQlyZXR1cm4gQ2F0ZWdvcmllczsKLQl9Ci0JCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmY3OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiB0aGUgQ29uZmlndXJhdGlvbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUkVGSVggPSBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25Gb3JtUHJlZml4OyAKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb25EZXNjcmlwdGlvbiwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb24pOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCUNvbmZpZ3VyYXRpb25FZGl0b3JJbnB1dCBjb25maWdJbnB1dCA9IChDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQpIGlucHV0OwotCQljb25maWcgPSBjb25maWdJbnB1dC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCXZlcnNpb25TZWN0aW9uT24gPSBmYWxzZTsKLQkJZGV0YWlsU2VjdGlvbk9uID0gZmFsc2U7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbk9uID0gZmFsc2U7Ci0JCWZ1bGxEZXNjT24gPSBmYWxzZTsKLQkJa2V5Q29uc2lkZXJhdGlvbk9uID0gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwkJCi0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkRlc2NyaXB0aW9uRGVzY3JpcHRpb25fdGV4dDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0NvbmZpZ3VyYXRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzYyZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db25maWd1cmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29uZmlndXJhdGlvbkVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNhdGVnb3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNhdGVnb3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5Db25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLk1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5DbG9zdXJlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5JQ29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QbHVnaW5VSVBhY2thZ2VDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25QYWdlIGV4dGVuZHMgRm9ybVBhZ2UgaW1wbGVtZW50cyBJR290b01hcmtlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hFRF9CWV9DT05GSUdfRURJVE9SID0gIlRvdWNoZWRCeUNvbmZpZ0VkaXRvciI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybVByZWZpeCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Zvcm1QcmVmaXg7IAotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQkKLQlwcml2YXRlIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIGNvbmZpZ1ZpZXdlcjsKLQlwcml2YXRlIENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIgY29udFByb3ZpZGVyOwotCXByaXZhdGUgQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyIGFkZENhdGVnb3J5Vmlld2VyOwotCXByaXZhdGUgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyIHN1YkNhdGVnb3J5Vmlld2VyOwotCQotCXByaXZhdGUgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlciBjb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyOwotCXByaXZhdGUgSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlciBhZGRDYXRlZ29yeUhpZGVVbmNoZWNrZWRGaWx0ZXI7Ci0JcHJpdmF0ZSBIaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyIHN1YkNhdGVnb3J5SGlkZVVuY2hlY2tlZEZpbHRlcjsKLQkKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJMaXN0ZW5lciA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlciBtYXJrZXJIZWxwZXIgPSBDb25maWd1cmF0aW9uTWFya2VySGVscGVyLklOU1RBTkNFOwotCWJvb2xlYW4gaXNEaXJ0eSA9IGZhbHNlOwotCXByb3RlY3RlZCBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JU2Nyb2xsZWRGb3JtIGZvcm0gPSBudWxsOwotCXByaXZhdGUgQnV0dG9uIHVwZGF0ZU9uQ2xpY2s7Ci0JcHJpdmF0ZSBCdXR0b24gbm9VcGRhdGVPbkNsaWNrOwotCXByaXZhdGUgQnV0dG9uIGNsb3N1cmVCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZml4V2FybmluZ0J1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZWZyZXNoQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGhpZGVCdXR0b247Ci0JcHJpdmF0ZSBUZXh0IGVsZW1EZXNwQ29udGVudFRleHQ7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIGNvbmZpZ1Byb3BlcnRpZXM7Ci0JcHJpdmF0ZSBCdXR0b24gaGlkZUVycm9yQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGhpZGVXYXJuQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGhpZGVJbmZvQnV0dG9uOwotCi0KLQlwcm90ZWN0ZWQgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB0cmVlU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJLyoqCi0JCSAqCUhhbmRsZXMgdGhlIHNlbGVjdGlvbiBvZiBhbiBpdGVtIGluIHRoZSB0cmVlIHZpZXdlcgotCQkgKgotCQkgKglAcGFyYW0gZXZlbnQgSVNlbGVjdGlvbgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKENvbmZpZ3VyYXRpb25QYWdlLnRoaXMuZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb249IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQ9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJc2VsZWN0ZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCQkJaWYgKHNlbGVjdGVkRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbURlc3BDb250ZW50VGV4dCAhPSBudWxsICYmIHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCS8vIGRpc3BsYXkgc2VsZWN0ZWQgZWxlbWVudCdzIGRlc2NyaXB0aW9uCi0JCQkJCQlTdHJpbmcgYnJpZWZEZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3RlZEVsZW1lbnQpLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCWVsZW1EZXNwQ29udGVudFRleHQuc2V0VGV4dChicmllZkRlc2MgIT0gbnVsbCA/IGJyaWVmRGVzYyA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xvc3VyZUxpc3RlbmVyIGNsb3N1cmVMaXN0ZW5lciA9IG5ldyBDbG9zdXJlTGlzdGVuZXIoKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlcnJvckFkZGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCQlJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpOwotCQkJaWYgKGNvbmZpZ01nci5nZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpLnRvSGlkZShlcnJvcikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltYXJrZXJIZWxwZXIuY3JlYXRlTWFya2VyKGNvbmZpZywgZXJyb3IpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGVycm9yUmVtb3ZlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotCQkJbWFya2VySGVscGVyLmRlbGV0ZU1hcmtlcihjb25maWcsIGVycm9yKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBlcnJvclVwZGF0ZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLQkJCW1hcmtlckhlbHBlci5hZGp1c3RNYXJrZXIobnVsbCwgY29uZmlnLCBlcnJvcik7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lciBsYXlvdXRMaXN0ZW5lciA9IG5ldyBJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGF5b3V0Q2hhbmdlZChib29sZWFuIGlzRmxhdCkgewotCQkJcmVmcmVzaFZpZXdlcnMoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0Rlc2NyaXB0aW9uMSwgCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24yKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCWZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCWZvcm0uc2V0VGV4dChmb3JtUHJlZml4ICsgY29uZmlnLmdldE5hbWUoKSk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU2VjdGlvbiB0cmVlU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCXRyZWVTZWN0aW9uLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJdHJlZVNlY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9Db25maWdDb250ZW50KTsgCi0JCXRyZWVTZWN0aW9uLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX0NvbmZpZ0NvbnRlbnREZXNjcmlwdGlvbik7IAotCQl0cmVlU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQljcmVhdGVDb250ZW50KHRvb2xraXQsIHRyZWVTZWN0aW9uKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIGZpbmFsbHkgc2V0IHRoZSBpbnB1dC4KLQkJc2V0SW5wdXQoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCi0JCWluaXRpYWxpemVWaWV3ZXJzU2VsZWN0aW9uKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQotCQlDb25maWd1cmF0aW9uRWRpdG9ySW5wdXQgY29uZmlnSW5wdXQgPSAoQ29uZmlndXJhdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKLQkJY29uZmlnID0gY29uZmlnSW5wdXQuZ2V0Q29uZmlndXJhdGlvbigpOwotCQlhY3Rpb25NZ3IgPSAoKENvbmZpZ3VyYXRpb25FZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWNvbmZpZ1Byb3BlcnRpZXMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpLmdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRyZWUgY29udGVudAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogQHBhcmFtIHNlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQsIFNlY3Rpb24gc2VjdGlvbikgewotCQlDb21wb3NpdGUgc2VjdGlvbkNsaWVudCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQlzZWN0aW9uQ2xpZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlzZWN0aW9uLnNldENsaWVudChzZWN0aW9uQ2xpZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCB0cnVlKTsKLQkJc2VjdGlvbkNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKAotCQkJCXNlY3Rpb25DbGllbnQuZ2V0UGFyZW50KCksCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9FRElUT1JfQUxMX0NPTlRFWFQpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uQ2xpZW50KTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNiwgZmFsc2UpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCUNvbXBvc2l0ZSByYWRpb0NvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JCWdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlyYWRpb0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJcmFkaW9Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQkKLQkJdXBkYXRlT25DbGljayA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV91cGRhdGVPbkNsaWNrLCBTV1QuUkFESU8pOwotCQl1cGRhdGVPbkNsaWNrLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX3VwZGF0ZU9uQ2xpY2tUb29sVGlwKTsgCi0JCXVwZGF0ZU9uQ2xpY2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkRFRkFVTFQsIGZhbHNlLCBmYWxzZSkpOwotCQl1cGRhdGVPbkNsaWNrLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV91cGRhdGVPbkNsaWNrVG9vbFRpcCkpOwotCQl1cGRhdGVPbkNsaWNrLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCi0JCW5vVXBkYXRlT25DbGljayA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHJhZGlvQ29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9ub1VwZGF0ZU9uQ2xpY2ssIFNXVC5SQURJTyk7Ci0JCW5vVXBkYXRlT25DbGljay5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9ub1VwZGF0ZU9uQ2xpY2tUb29sVGlwKTsgCi0JCW5vVXBkYXRlT25DbGljay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuREVGQVVMVCwgZmFsc2UsIGZhbHNlKSk7Ci0JCW5vVXBkYXRlT25DbGljay5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2Vfbm9VcGRhdGVPbkNsaWNrVG9vbFRpcCkpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZhbHNlLCBmYWxzZSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWdyb3VwLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlnUHJvYmxlbVZpZXdPcHRpb25zVGV4dCk7Ci0KLQkJaGlkZUVycm9yQnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChncm91cCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuaGlkZUVycm9zVGV4dCk7Ci0JCWhpZGVXYXJuQnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChncm91cCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuaGlkZVdhcm5pbmdzVGV4dCk7Ci0JCWhpZGVJbmZvQnV0dG9uID0gU1dUVXRpbC5jcmVhdGVDaGVja2JveChncm91cCxBdXRob3JpbmdVSVJlc291cmNlcy5oaWRlSW5mb3NUZXh0KTsKLQkJCi0JCWhpZGVFcnJvckJ1dHRvbi5zZXRTZWxlY3Rpb24oY29uZmlnUHJvcGVydGllcy5pc0hpZGVFcnJvcnMoKSk7Ci0JCWhpZGVXYXJuQnV0dG9uLnNldFNlbGVjdGlvbihjb25maWdQcm9wZXJ0aWVzLmlzSGlkZVdhcm5pbmdzKCkpOwotCQloaWRlSW5mb0J1dHRvbi5zZXRTZWxlY3Rpb24oY29uZmlnUHJvcGVydGllcy5pc0hpZGVJbmZvcygpKTsJCQotCi0JCQotCQkKLQkJaGlkZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgIiIsIFNXVC5QVVNIIC8vJE5PTi1OTFMtMSQKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJaGlkZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImhpZGVVbmNoZWNrZWRFbGVtLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQloaWRlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwKTsgCi0JCWhpZGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWhpZGVCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX2hpZGVUb29sVGlwKSk7Ci0JCQotCQlmaXhXYXJuaW5nQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWZpeFdhcm5pbmdCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFNoYXJlZEltYWdlKCJhZGRyZWZfY28uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWZpeFdhcm5pbmdCdXR0b24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXApOyAKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQpKTsKLQkJZml4V2FybmluZ0J1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfQWRkTWlzc2luZ1Rvb2xUaXApKTsKLQotCQkvLyBBZGQgdGhlIGNsb3N1cmUgYnV0dG9uLgotCQljbG9zdXJlQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCWNsb3N1cmVCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJjbG9zdXJlX2NvLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQljbG9zdXJlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX01ha2VDbG9zdXJlVG9vbFRpcCk7IAotCQljbG9zdXJlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCkpOwotCQljbG9zdXJlQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9NYWtlQ2xvc3VyZVRvb2xUaXApKTsKLQkJLy8gY2xvc3VyZUJ1dHRvbi5zZXRUZXh0KCIiKTsKLQotCQlyZWZyZXNoQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCAiIiwgU1dULlBVU0gpOyAvLyROT04tTkxTLTEkCi0JCXJlZnJlc2hCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX1JFRlJFU0gpOwotCQlyZWZyZXNoQnV0dG9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hCdXR0b25fdGV4dCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORAotCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSAzOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJcmVmcmVzaEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJfQotCQlyZWZyZXNoQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZWZyZXNoQnV0dG9uX3RleHQpKTsKLQotCQkvLyBDcmVhdGUgVmlld2VyIGFuZCBIYW5kbGUgTGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcnModG9vbGtpdCwgc2VjdGlvbkNsaWVudCk7Ci0KLQkJTGFiZWwgZWxlbURlc3BMYWJlbCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoc2VjdGlvbkNsaWVudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfRGVzY3JpcHRpb24pOyAKLQkJR3JpZERhdGEgZ2QxID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkMS5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWVsZW1EZXNwTGFiZWwuc2V0TGF5b3V0RGF0YShnZDEpOwotCi0JCWVsZW1EZXNwQ29udGVudFRleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoc2VjdGlvbkNsaWVudCwgIiIsIFNXVC5OT05FIC8vJE5PTi1OTFMtMSQKLQkJCQl8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuV1JBUCk7Ci0JCUdyaWREYXRhIGdkMiA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZDIuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkMi5ob3Jpem9udGFsU3BhbiA9IDY7Ci0JCWdkMi5oZWlnaHRIaW50ID0gNTA7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc2VjdGlvbkNsaWVudCk7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JCWVsZW1EZXNwQ29udGVudFRleHQuc2V0TGF5b3V0RGF0YShnZDIpOwotCQkKLQkJLy8gc2V0IHRleHQgd2lkZ2V0IHRvIHZpZXdlcnMgc28gdGhleSBjYW4gdXBkYXRlIGRlc2NyaXB0aW9uIGZpZWxkCi0JCWNvbmZpZ1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodHJlZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRyZWVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0cmVlU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCWhpZGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJaGlkZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQlyZWZyZXNoQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJlZnJlc2hCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJZml4V2FybmluZ0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQlmaXhXYXJuaW5nQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCWNsb3N1cmVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJY2xvc3VyZUJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWaWV3ZXJzU2VsZWN0aW9uKCkgewotCQlpbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCi0gICAgCUxpc3Q8TWV0aG9kUGFja2FnZT4gcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBhY2thZ2U+KGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotLy8gICAgCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0vLyAgICAJaW5pdGlhbGl6ZVZpZXdlclNlbGVjdGlvbihjb25maWdWaWV3ZXIsIHBsdWdpbnMpOwotICAgIAlpbml0aWFsaXplVmlld2VyU2VsZWN0aW9uKGNvbmZpZ1ZpZXdlciwgcGFja2FnZXMpOwotCQkKLQkJLy8gcmVhZCBmcm9tIGNvbmZpZyBhbmQgY2hlY2sgdGhlIGFwcHJvcHJpYXRlIGl0ZW1zIGluIHRoZSBDQyB2aWV3ZXJzCi0JCUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRDYXRzID0gbmV3IEFycmF5TGlzdDxDb250ZW50Q2F0ZWdvcnk+KGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCQlpbml0aWFsaXplVmlld2VyU2VsZWN0aW9uKGFkZENhdGVnb3J5Vmlld2VyLCBhZGRDYXRzKTsKLSAgICAJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IHN1YkNhdHMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLSAgICAJaW5pdGlhbGl6ZVZpZXdlclNlbGVjdGlvbihzdWJDYXRlZ29yeVZpZXdlciwgc3ViQ2F0cyk7Ci0gICAgCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZpZXdlclNlbGVjdGlvbihDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciB2aWV3ZXIsIExpc3Q8PyBleHRlbmRzIE9iamVjdD4gZWxlbWVudHMpIHsKLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpCi0JCQl2aWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGVsZW1lbnRzLnRvQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcnMoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHNlY3Rpb25DbGllbnQpIHsKLQkJQ29tcG9zaXRlIGNvbmZpZ1ZpZXdlckxhYmVsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbkNsaWVudCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRU5ELCB0cnVlLCBmYWxzZSk7Ci0JCWNvbmZpZ1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWNvbmZpZ1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCUNvbXBvc2l0ZSBhZGRDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uQ2xpZW50KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5FTkQsIHRydWUsIGZhbHNlKTsKLQkJYWRkQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWFkZENhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJCi0JCS8vIGNyZWF0ZSB0aGUgbGlicmFyeSB0cmVlIHZpZXdlcgotCQljb25maWdWaWV3ZXIgPSBuZXcgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2QudmVydGljYWxTcGFuID0gMzsKLQkJY29uZmlnVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWNvbnRQcm92aWRlciA9IG5ldyBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJY29uZmlnVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250UHJvdmlkZXIpOwotCQlsYWJlbFByb3ZpZGVyID0gbmV3IENvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyKGNvbnRQcm92aWRlcik7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljcmVhdGVWaWV3ZXJMYWJlbEFuZEJ1dHRvbnModG9vbGtpdCwgY29uZmlnVmlld2VyTGFiZWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfVHJlZVRpdGxlTGFiZWwsIGNvbmZpZ1ZpZXdlcik7Ci0KLQkJCi0JCQotCQlhZGRDYXRlZ29yeVZpZXdlciA9IG5ldyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQ9IDIwMDsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENhdGVnb3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb25maWcpKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0KLQkJY3JlYXRlVmlld2VyTGFiZWxBbmRCdXR0b25zKHRvb2xraXQsIGFkZENhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Db25maWd1cmF0aW9uUGFnZV9BZGRDYXRlZ29yaWVzVGl0bGVMYWJlbCwgYWRkQ2F0ZWdvcnlWaWV3ZXIpOwotCQotCQlDb21wb3NpdGUgc3ViQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRU5ELCB0cnVlLCBmYWxzZSk7Ci0JCXN1YkNhdHNWaWV3ZXJMYWJlbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlzdWJDYXRzVmlld2VyTGFiZWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQotCQlzdWJDYXRlZ29yeVZpZXdlciA9IG5ldyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIoc2VjdGlvbkNsaWVudCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdkLmhlaWdodEhpbnQ9IDIwMDsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IENhdGVnb3J5Q29udGVudFByb3ZpZGVyKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGNvbmZpZykpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRlZ29yeUxhYmVsUHJvdmlkZXIoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkpOwotCQljcmVhdGVWaWV3ZXJMYWJlbEFuZEJ1dHRvbnModG9vbGtpdCwgc3ViQ2F0c1ZpZXdlckxhYmVsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25QYWdlX1N1YkNhdGVnb3JpZXNUaXRsZUxhYmVsLCBzdWJDYXRlZ29yeVZpZXdlcik7Ci0JCQotCQkvLyBhZGQgbGlzdGVuZXIgc28gdGhlIDIgQ2F0ZWdvcnkgdmlld2VycyBhcmUgaW4gc3luYwotCQkvLyB0aGF0IGlzLCB3aGVuIGFuIGl0ZW0gaXMgY2hlY2tlZCBpbiBvbmUsIGl0IGlzIHVuY2hlY2tlZCBpbiB0aGUgb3RoZXIKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoZmluYWwgQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCS8vUG90ZW50aWFsbHkgbG9uZyBvcGVyYXRpb24gLSBzaG93IGEgYnVzeSBjdXJzb3IKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzdWJDYXRlZ29yeVZpZXdlci5nZXRUcmVlKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmIChldmVudC5nZXRDaGVja2VkKCkpCi0JCQkJCQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuc2V0Q2hlY2tlZChldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQotCQlzdWJDYXRlZ29yeVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIobmV3IElDaGVja1N0YXRlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9Qb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiAtIHNob3cgYSBidXN5IGN1cnNvcgotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGFkZENhdGVnb3J5Vmlld2VyLmdldFRyZWUoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkKLQkJCQkJCQlhZGRDYXRlZ29yeVZpZXdlci5zZXRDaGVja2VkKGV2ZW50LmdldEVsZW1lbnQoKSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVmlld2VyTGFiZWxBbmRCdXR0b25zKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBmaW5hbCBUcmVlVmlld2VyIHZpZXdlcikgewotCQlMYWJlbCBsYWJlbCA9IHRvb2xraXQuY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5FTkQsIHRydWUsIGZhbHNlKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlCdXR0b24gZXhwYW5kQnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCBudWxsLCBTV1QuUFVTSCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkVORCwgZmFsc2UsIGZhbHNlKTsKLQkJZXhwYW5kQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlleHBhbmRCdXR0b24uc2V0SW1hZ2UoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKCJleHBhbmRhbGwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWV4cGFuZEJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKTsgCi0JCWV4cGFuZEJ1dHRvbi5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIoCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfRXhwYW5kQWxsKSk7Ci0JCQotCQlleHBhbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdmlld2VyLmV4cGFuZEFsbCgpOwotCQkJfQotCQl9KTsKLQotCi0JCUJ1dHRvbiBjb2xsYXBzZUJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgbnVsbCwgU1dULlBVU0gpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuUklHSFQsIFNXVC5FTkQsIGZhbHNlLCBmYWxzZSk7Ci0JCWNvbGxhcHNlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQljb2xsYXBzZUJ1dHRvbi5zZXRJbWFnZShBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoImNvbGxhcHNlYWxsLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xsYXBzZUJ1dHRvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5GaWx0ZXJEaWFsb2dfQ29sbGFwc2VBbGwpOyAKLQkJY29sbGFwc2VCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVMaXN0ZW5lcihuZXcgQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkZpbHRlckRpYWxvZ19Db2xsYXBzZUFsbCkpOwotCQljb2xsYXBzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl2aWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpIHsKLQkJLy8gdGhlIGZvbGxvd2luZyBtYXkgbm90IGJlIHRoZSBtb3N0IGVmZmljaWVudCB3YXkKLQkJLy8gbmVlZCBhIGZhc3Qgd2F5IHRvIHVwZGF0ZSB0aGUgY2xvc3VyZQotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHJlSW5pdCBjbG9zdXJlIGZvciBjb25maWcgYWRkIG5vdGlmaWNhdGlvbiEiKTsKLQotCQljcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29uZmlndXJhdGlvbkNsb3N1cmUoKSB7Ci0JCWNsb3N1cmUgPSBuZXcgQ29uZmlndXJhdGlvbkNsb3N1cmUoYWN0aW9uTWdyLCBjb25maWcpOwotCQljbG9zdXJlLmFkZExpc3RlbmVyKGNsb3N1cmVMaXN0ZW5lcik7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuc2V0Q2xvc3VyZShjbG9zdXJlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciBjb25uZmlndXJhdGlvbiB2aWV3ZXIKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0SW5wdXQoT2JqZWN0IGlucHV0KSB7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLnNldElucHV0KGlucHV0KTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIuc2V0SW5wdXQoaW5wdXQpOwotCQkKLQkJY29uZmlnVmlld2VyLmV4cGFuZEFsbCgpOwotCQljb25maWdWaWV3ZXIuY29sbGFwc2VBbGwoKTsKLQkJYWRkQ2F0ZWdvcnlWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmV4cGFuZEFsbCgpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5jb2xsYXBzZUFsbCgpOwotCi0vLwkJdXBkYXRlQ2hlY2tTdGF0ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFZpZXdlcnMoKSB7Ci0JCWNvbmZpZ1ZpZXdlci5yZWZyZXNoKCk7Ci0JCWFkZENhdGVnb3J5Vmlld2VyLnJlZnJlc2goKTsKLQkJc3ViQ2F0ZWdvcnlWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzaG93SGlkZUVsZW1lbnRzKCkgewotCQljb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLQkJYWRkQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLQkJc3ViQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyLnRvZ2dsZUhpZGVVbmNoZWNrZWQoKTsKLQkJcmVmcmVzaFZpZXdlcnMoKTsKLS8vCQl1cGRhdGVDaGVja1N0YXRlcygpOyAvLyBuZWRlZCB0byBoYXZlIHRoaXMgdG8gdXBkYXRlIHRoZSBjaGVjayBzdGF0dXMKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpIHsKLQkJLy8gbG9hZGluZyB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIG1pZ2h0IGJlIHNsb3csCi0JCS8vIGRpc3BsYXkgYSBwcm9ncmVzcyBiYXIKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQljcmVhdGVDb25maWd1cmF0aW9uQ2xvc3VyZSgpOwotCQkJfQotCi0JCX07Ci0KLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ29uZmlndXJhdGlvblBhZ2VfTG9hZGluZ01lc3NhZ2UpOyAKLQotCQljb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyID0gbmV3IEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIoY29uZmlnVmlld2VyKTsKLQkJY29uZmlnVmlld2VyLmFkZEZpbHRlcihjb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyKTsKLQkJYWRkQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyID0gbmV3IEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIoYWRkQ2F0ZWdvcnlWaWV3ZXIpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5hZGRGaWx0ZXIoYWRkQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyKTsKLQkJc3ViQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyID0gbmV3IEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIoc3ViQ2F0ZWdvcnlWaWV3ZXIpOwotCQlzdWJDYXRlZ29yeVZpZXdlci5hZGRGaWx0ZXIoc3ViQ2F0ZWdvcnlIaWRlVW5jaGVja2VkRmlsdGVyKTsKLQkJCi0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaGlkZUVycm9yQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhpZGVzQnV0dG9uV2lkZ2V0U2VsZWN0ZWQoZSwKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DT05GSUdfUFJPUEJMRU1fSElERV9FUlJPUlMpOwotCQkJfQotCQl9KTsKLQkJCi0JCWhpZGVXYXJuQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUhpZGVzQnV0dG9uV2lkZ2V0U2VsZWN0ZWQoZSwKLQkJCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DT05GSUdfUFJPUEJMRU1fSElERV9XQVJOSU5HUyk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaGlkZUluZm9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlSGlkZXNCdXR0b25XaWRnZXRTZWxlY3RlZChlLAotCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0lORk9TKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljbG9zdXJlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmb3JtLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQltYWtlQ2xvc3VyZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9OwotCQl9KTsKLQkJZml4V2FybmluZ0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZm9ybS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZml4V2FybmluZygpOwotCQkJCQl9Ci0JCQkJfSk7CQkJCQotCQkJfTsKLQkJfSk7Ci0JCXJlZnJlc2hCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZvcm0uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0JCQkJCQlzaG93RXJyb3JzKCk7Ci0JCQkJCX0KLQkJCQl9KTsJCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCQloaWRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzaG93SGlkZUVsZW1lbnRzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGFkZCBhIGNoZWNrIHN0YXRlIGNoYW5nZSBsaXN0ZW5lcgotCQlJQ2hlY2tTdGF0ZUxpc3RlbmVyIGNvbmZpZ0NoZWNrU3RhdGVMaXN0ZW5lciA9IG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldnQpIHsKLQkJCQkKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmb3JtLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAodXBkYXRlT25DbGljay5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0JCQkJCQkJLy8gdXBkYXRlIHRoZSBjbG9zdXJlIGVycm9yCi0JCQkJCQkJc2hvd0Vycm9ycygpOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUobmV3IE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoY29uZmlnLCBUT1VDSEVEX0JZX0NPTkZJR19FRElUT1IsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQkKLQkJCX0KLQkJfTsKLQkJCi0JCUlDaGVja1N0YXRlTGlzdGVuZXIgY2F0c0NoZWNrU3RhdGVMaXN0ZW5lciA9IG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZvcm0uZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNhdmVDb250ZW50Q2F0ZWdvcnlTZWxlY3Rpb25zVG9Db25maWd1cmF0aW9uKCk7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIGNsb3N1cmUgZXJyb3IKLQkJCQkJCXNob3dFcnJvcnMoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCQkKLQkJY29uZmlnVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjb25maWdDaGVja1N0YXRlTGlzdGVuZXIpOwotCQlhZGRDYXRlZ29yeVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIoY2F0c0NoZWNrU3RhdGVMaXN0ZW5lcik7Ci0JCXN1YkNhdGVnb3J5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihjYXRzQ2hlY2tTdGF0ZUxpc3RlbmVyKTsKLQotCQkvLyBsaXN0ZW4gdG8gdGhlIGxpYnJhcnkgY2hhbmdlcyBhbmQgYXV0b21hdGljYWxseSB1cGRhdGUgdGhlCi0JCS8vIGNvbmZpZ3VyYXRpb24gdmlldwotCQlsaWJMaXN0ZW5lciA9IG5ldyBJTGlicmFyeUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbjxPYmplY3Q+IGNoYW5nZWRJdGVtcykgewotCQkJCS8vIGZvciBwZXJmb3JtYW5jZSByZWFzb24sIHdlIHNob3VsZCBub3QgcmVzcG9uc2UgdG8gZXZlcnkKLQkJCQkvLyBsaWJyYXJ5IGNoYW5nZQotCQkJCS8vIG9ubHkgY292ZXIgcGFja2FnZSBhbmQgcGx1Z2luIGNoYW5nZXMKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRAotCQkJCQkJfHwgb3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxEKSB7Ci0JCQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBjaGFuZ2VkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCQkJT2JqZWN0IG8gPSBjaGFuZ2VkSXRlbXMudG9BcnJheSgpWzBdOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJCQkJfHwgbyBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQkJcmVJbml0aWFsaXplQ29uZmlnRmFjdG9yeSgpOwotCQkJCQkJCXJlZnJlc2hWaWV3ZXJzKCk7Ci0vLwkJCQkJCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCQkJCQkJCXNob3dFcnJvcnMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCQl9Ci0JCQotCQkvLyBsaXN0ZW4gdG8gcGx1Z2luIHByZXNlbnRhdGlvbiBsYXlvdXQgY2hhbmdlcwotCQlQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmFkZExpc3RlbmVyKGxheW91dExpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzaG93RXJyb3JzKCkgewotCQkvLyBzYXZlIHRoZSBwcmV2aW91cyBpbnZhbGlkIGVsZW1lbnRzCi0JCUxpc3Q8T2JqZWN0PiBpbnZhbGlkID0gY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKTsKLQotCQljbG9zdXJlLmNoZWNrRXJyb3IoKTsKLQkJCi0JCWlmIChjb25maWdWaWV3ZXJIaWRlVW5jaGVja2VkRmlsdGVyLmlzSGlkZVVuY2hlY2tlZCgpKSB7Ci0JCQljb25maWdWaWV3ZXIucmVmcmVzaCgpOwotCQl9IGVsc2UgewotCQkJLy8gZ2V0IHRoZSBuZXcgZXJyb3IgZWxlbWVudHMsIGFkZCB0byB0aGUgcHJldmlvdXMgZXJyb3IgZWxlbWVudHMsCi0JCQkvLyBhbmQgdXBkYXRlIHRoZW0gdG8gdXBkYXRlIHRoZSBlcnJvci93YXJuaW5nIGltYWdlcwotCQkJaW52YWxpZC5hZGRBbGwoY2xvc3VyZS5nZXRJbnZhbGlkRWxlbWVudHMoKSk7Ci0KLQkJCS8vIGFsc28gYWRkIHRoZSBVSSBmb2xkZXJzCi0JCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNwID0gKENvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIpIGNvbmZpZ1ZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQlpbnZhbGlkLmFkZEFsbChjcC5nZXRVSUVsZW1lbnRzKCkpOwotCi0JCQljb25maWdWaWV3ZXIudXBkYXRlKGludmFsaWQudG9BcnJheSgpLCBudWxsKTsKLQkJfQotCi0JfQotCi0JCi0JLyoqCi0JICogTWFrZSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1ha2VDbG9zdXJlKCkgewotCQljbG9zdXJlLmZpeEVycm9ycygpOwotCQlyZWZyZXNoVmlld2VycygpOwotLy8JCXVwZGF0ZUNoZWNrU3RhdGVzKCk7Ci0JCXNhdmVDb25maWd1cmF0aW9uKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBGaXggYWxsIHdhcm5pbmdzIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpeFdhcm5pbmcoKSB7Ci0KLQkJY2xvc3VyZS5maXhQcm9ibGVtcygpOwotCQlyZWZyZXNoVmlld2VycygpOwkKLS8vCQl1cGRhdGVDaGVja1N0YXRlcygpOwotCQlzYXZlQ29uZmlndXJhdGlvbigpOwotCi0JfQotCi0JLyoqCi0JICogU2F2ZSBjb25maWd1cmF0aW9uCi0JICogQHJldHVybgotCSAqIAkJVHJ1ZSBpZiBjb25maWd1cmF0aW9uIGlzIHNhdmUgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzYXZlQ29uZmlndXJhdGlvbigpIHsKLQkJQ29uZmlndXJhdGlvbkRhdGEgY29uZmlnRGF0YSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKQotCQkJCQkJCQkJLmdldENvbmZpZ3VyYXRpb25EYXRhKCk7Ci0JCQotCQljb25maWdEYXRhLnNldEVuYWJsZVVwZGF0ZShmYWxzZSk7Ci0JCWJvb2xlYW4gcmV0ID0gZG9TYXZlQ29uZmlndXJhdGlvbigpOwotCQljb25maWdEYXRhLnNldEVuYWJsZVVwZGF0ZSh0cnVlKTsKLQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9TYXZlQ29uZmlndXJhdGlvbigpIHsKLQotCQlib29sZWFuIG9sZE5vdGlmeSA9IGNvbmZpZy5lRGVsaXZlcigpOwotCSAgICB0cnkKLQkgICAgewotCSAgICAJCi0JICAgIAlMaXN0PE1ldGhvZFBhY2thZ2U+IG9sZFBhY2thZ2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQYWNrYWdlPihjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQkgICAgCUxpc3Q8TWV0aG9kUGx1Z2luPiBvbGRQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JICAgIAkKLQkgICAgCVNldDxNZXRob2RQYWNrYWdlPiBuZXdQYWNrYWdlcyA9IGdldENoZWNrZWRNZXRob2RQYWNrYWdlcyhjb25maWdWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCSAgICAJU2V0PE1ldGhvZFBsdWdpbj4gbmV3UGx1Z2lucyA9IGdldENoZWNrZWRNZXRob2RQbHVnaW5zKGNvbmZpZ1ZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JICAgIAkKLQkgICAgCW9sZFBhY2thZ2VzLnJlbW92ZUFsbChuZXdQYWNrYWdlcyk7Ci0JICAgIAlvbGRQbHVnaW5zLnJlbW92ZUFsbChuZXdQbHVnaW5zKTsKLQkgICAgCQotCSAgICAJbmV3UGFja2FnZXMucmVtb3ZlQWxsKGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCSAgICAJbmV3UGx1Z2lucy5yZW1vdmVBbGwoY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQkgICAgCQotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tTWV0aG9kUGx1Z2luTGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgb2xkUGx1Z2lucykgPT0gZmFsc2UpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG9sZFBhY2thZ2VzKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCWlmIChDb25maWd1cmF0aW9uVXRpbC5hZGRDb2xsVG9NZXRob2RQbHVnaW5MaXN0KGFjdGlvbk1nciwgY29uZmlnLCBuZXdQbHVnaW5zKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG5ld1BhY2thZ2VzKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCi0JICAgIAkvLyB2YWxpZGF0ZSBiZWZvcmUgc2F2ZQotCQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGFjdGlvbk1nciwgY29uZmlnKTsKLQotCQkJYWN0aW9uTWdyLmV4ZWN1dGUobmV3IE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoY29uZmlnLCBUT1VDSEVEX0JZX0NPTkZJR19FRElUT1IsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKSk7Ci0KLQkJCXJldHVybiB0cnVlOwotCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbmZpZy5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKiAJCVRydWUgaWYgY29uZmlndXJhdGlvbiBpcyBzYXZlIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZUNvbnRlbnRDYXRlZ29yeVNlbGVjdGlvbnNUb0NvbmZpZ3VyYXRpb24oKSB7Ci0JCQotICAgIAlMaXN0PENvbnRlbnRDYXRlZ29yeT4gb2xkQWRkQ2F0cyA9IG5ldyBBcnJheUxpc3Q8Q29udGVudENhdGVnb3J5Pihjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLSAgICAJTGlzdDxDb250ZW50Q2F0ZWdvcnk+IG9sZFN1YkNhdHMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oY29uZmlnLmdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpKTsKLSAgICAJCi0gICAgCVNldDxDb250ZW50Q2F0ZWdvcnk+IG5ld0FkZENhdHMgPSBnZXRDaGVja2VkQ29udGVudENhdGVnb3JpZXMoYWRkQ2F0ZWdvcnlWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotICAgIAlTZXQ8Q29udGVudENhdGVnb3J5PiBuZXdTdWJDYXRzID0gZ2V0Q2hlY2tlZENvbnRlbnRDYXRlZ29yaWVzKHN1YkNhdGVnb3J5Vmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLSAgICAJCi0gICAgCW9sZEFkZENhdHMucmVtb3ZlQWxsKG5ld0FkZENhdHMpOwotICAgIAlvbGRTdWJDYXRzLnJlbW92ZUFsbChuZXdTdWJDYXRzKTsKLSAgICAJCi0gICAgCW5ld0FkZENhdHMucmVtb3ZlQWxsKGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotICAgIAluZXdTdWJDYXRzLnJlbW92ZUFsbChjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCQkKLQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tQWRkZWRDYXRlZ29yeUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG9sZEFkZENhdHMpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJaWYgKCFuZXdBZGRDYXRzLmlzRW1wdHkoKSkgewotCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb0FkZGVkQ2F0ZWdvcnlMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBuZXdBZGRDYXRzKSA9PSBmYWxzZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkKLQkJCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IHBsdWdpbk1hcCA9IE1ldGhvZEVsZW1lbnRVdGlsLmJ1aWxkTWFwKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JCQlIYXNoU2V0PE1ldGhvZFBsdWdpbj4gbmV3QWRkZWRQbHVnaW5zID0gbmV3IEhhc2hTZXQ8TWV0aG9kUGx1Z2luPigpOwotCQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gbmV3QWRkQ2F0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjYXQgPSBpdC5uZXh0KCk7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdCk7Ci0JCQkJaWYgKCEgcGx1Z2luTWFwLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRHdWlkKCkpKSB7Ci0JCQkJCWlmICghIG5ld0FkZGVkUGx1Z2lucy5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCQluZXdBZGRlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoISBuZXdBZGRlZFBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBsdWdpbkxpc3QoYWN0aW9uTWdyLCBjb25maWcsIG5ld0FkZGVkUGx1Z2lucykgPT0gZmFsc2UpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oYWN0aW9uTWdyLCBjb25maWcpOwotCQkJfQotCQkJCi0JCX0KLQkJaWYgKENvbmZpZ3VyYXRpb25VdGlsLnJlbW92ZUNvbGxGcm9tU3VidHJhY3RlZENhdGVnb3J5TGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgb2xkU3ViQ2F0cykgPT0gZmFsc2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvU3VidHJhY3RlZENhdGVnb3J5TGlzdChhY3Rpb25NZ3IsIGNvbmZpZywgbmV3U3ViQ2F0cykgPT0gZmFsc2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJYWN0aW9uTWdyLmV4ZWN1dGUobmV3IE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoY29uZmlnLCBUT1VDSEVEX0JZX0NPTkZJR19FRElUT1IsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBTZXQ8Q29udGVudENhdGVnb3J5PiBnZXRDaGVja2VkQ29udGVudENhdGVnb3JpZXMoT2JqZWN0W10gY2hlY2tlZEl0ZW1zKSB7Ci0JCVNldDxDb250ZW50Q2F0ZWdvcnk+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBpdGVtID0gVG5nVXRpbC51bndyYXAoY2hlY2tlZEl0ZW1zW2ldKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0vLwkJCQlpZiAoY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNvbnRhaW5zKExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbigoQ29udGVudENhdGVnb3J5KWl0ZW0pKSkgewotCQkJCQlyZXN1bHQuYWRkKChDb250ZW50Q2F0ZWdvcnkpaXRlbSk7Ci0vLwkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNldDxNZXRob2RQYWNrYWdlPiBnZXRDaGVja2VkTWV0aG9kUGFja2FnZXMoT2JqZWN0W10gY2hlY2tlZEl0ZW1zKSB7Ci0JCVNldDxNZXRob2RQYWNrYWdlPiByZXN1bHQgPSBuZXcgSGFzaFNldDxNZXRob2RQYWNrYWdlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWRJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGl0ZW0gPSBUbmdVdGlsLnVud3JhcChjaGVja2VkSXRlbXNbaV0pOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJcmVzdWx0LmFkZCgoTWV0aG9kUGFja2FnZSlpdGVtKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcm90ZWN0ZWQgU2V0PE1ldGhvZFBsdWdpbj4gZ2V0Q2hlY2tlZE1ldGhvZFBsdWdpbnMoT2JqZWN0W10gY2hlY2tlZEl0ZW1zKSB7Ci0JCVNldDxNZXRob2RQbHVnaW4+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PE1ldGhvZFBsdWdpbj4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBpdGVtID0gVG5nVXRpbC51bndyYXAoY2hlY2tlZEl0ZW1zW2ldKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmVzdWx0LmFkZCgoTWV0aG9kUGx1Z2luKWl0ZW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGliTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGliTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobGF5b3V0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5yZW1vdmVMaXN0ZW5lcihsYXlvdXRMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoY2xvc3VyZSAhPSBudWxsKSB7Ci0JCQljbG9zdXJlLmRpc3Bvc2UoKTsKLQkJCWNsb3N1cmUgPSBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJLy8gc2VsZWN0IHByb2JsZW0gaW4gbWFpbiB2aWV3ZXIKLQkJCi0JCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIuSU5TVEFOQ0UuZ2V0RXJyb3JNZXRob2RFbGVtZW50KG1hcmtlcik7Ci0KLQkJaWYgKGUgIT0gbnVsbCAmJiBjb25maWdWaWV3ZXIgIT0gbnVsbCkgewotCQkJY29uZmlnVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGUpKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9RdWlja0ZpeChJTWFya2VyIG1hcmtlcikgewotCQlpZiAoIG1hcmtlciA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hcmtlckhlbHBlci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQobWFya2VyKTsJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRDb25maWd1cmF0aW9uRGF0YSgpLmlzRWxlbWVudEluU3VidHJhY3RlZENhdGVnb3J5KGVsZW1lbnQpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25QYWdlX1F1aWNrZml4RXJyb3JfcmVhc29uMSwgCi0JCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpfSkpOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uZmlndXJhdGlvblBhZ2VfcXVpY2tmaXhFcnJvcl90aXRsZSwgCi0JCQkJCQltZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IG93bmVyID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJY29uZmlnVmlld2VyLnNldENoZWNrZWQob3duZXIsIHRydWUpOwotCQlzYXZlQ29uZmlndXJhdGlvbigpOwotCQlzaG93RXJyb3JzKCk7CQkJCQkKLSAgIH0KLQotCWNsYXNzIENvbmZpZ1NldFByb3BlcnR5Q29tbWFuZCBleHRlbmRzIE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQgewkJCi0JCXB1YmxpYyBDb25maWdTZXRQcm9wZXJ0eUNvbW1hbmQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCXN1cGVyKGVsZW1lbnQsIGtleSwgdmFsdWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcmVkbygpIHsKLQkJCXN1cGVyLnJlZG8oKTsKLQkJCWNvbmZpZ1Byb3BlcnRpZXMuc2V0VmFsdWUoa2V5LCB2YWx1ZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkJc3VwZXIudW5kbygpOwotCQkJYm9vbGVhbiBiID0gY29uZmlnUHJvcGVydGllcy5zZXROb3RpZnlMaXN0ZW5lcnMoZmFsc2UpOwotCQkJY29uZmlnUHJvcGVydGllcy5zZXRWYWx1ZShrZXksIG9sZFZhbHVlKTsKLQkJCWNvbmZpZ1Byb3BlcnRpZXMuc2V0Tm90aWZ5TGlzdGVuZXJzKGIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUhpZGVzQnV0dG9uV2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSwgU3RyaW5nIGtleSkgewotCQlPYmplY3Qgb2JqID0gZS5nZXRTb3VyY2UoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJ1dHRvbikgewotCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIG9iajsKLQkJCVN0cmluZyB2YWx1ZSA9IGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSA/IEJvb2xlYW4uVFJVRS50b1N0cmluZygpCi0JCQkJCTogQm9vbGVhbi5GQUxTRS50b1N0cmluZygpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUobmV3IENvbmZpZ1NldFByb3BlcnR5Q29tbWFuZChjb25maWcsIGtleSwgdmFsdWUpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50RWxlbWVudEd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTk3OGM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLS8qKgotICogQ2xhc3MgZm9yIEd1aWRhbmNlIHRhYiBwYWdlIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yLgotICogQ2xhc3MgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UgcmVwbGFjZXMgQ2F0ZWdvcnlHdWlkYW5jZVBhZ2UgYW5kIGhhbmRsZXMKLSAqIGFsbCBjb250ZW50ZWxlbWVudCdzIGd1aWRhbmNlIHRhYiBmZWF0dXJlLiAgCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJjYXRlZ29yeUd1aWRhbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRBbGxvd0NoYW5nZTIodHJ1ZSk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkJCS5nZXRTZWxlY3RlZEd1aWRhbmNlcyhjb250ZW50RWxlbWVudCk7Ci0JCQkJTGlzdCBsb2NhbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IgJiYgY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sKSB8fCBvYmoKLQkJCQkJCQkuZXF1YWxzKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSkpIHsKLQkJCQkJCWxvY2FsLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBsb2NhbC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIENvbnNvbGlkYXRpbmcgdGhlIHNlcGFyYXRlIGZvcm0gcGFnZSBjb2RlCi0JCQkJLy8gdG8gYWNjb21vZGF0ZSBiZXR0ZXIgZmlsdGVyaW5nLgotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLS8vCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotLy8JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCQkoRXN0aW1hdGUpIGl0ZW0sIC0xKTsKLS8vCQkJCQl9IGVsc2UgCi0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJKFRvb2xNZW50b3IpIGl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBJbiBjYXNlIG9mIFdvcmtQcm9kdWN0LCBXb3JrUHJvZHVjdCBpcyBhc3NvY2lhdGVkIHRvIFRvb2xNZW50b3IsCi0JCQkJLy8gRXN0aW1hdGUsIFJlcG9ydCBhbmQgVGVtcGxhdGUgZ3VpZGFuY2UKLQkJCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSAKLS8vCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGUpIHsKLS8vCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQsCi0vLwkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSwKLS8vCQkJCQkJCQlpdGVtLCAtMSk7Ci0vLwkJCQkJfQotCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCBjb250ZW50RWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byBhZGQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJ0byAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJKyBjb250ZW50RWxlbWVudC5nZXRUeXBlKCkKLQkJCQkJCQkJCQkJCQkuZ2V0TmFtZSgpCi0JCQkJCQkJCQkJCSsgIjoiICsgY29udGVudEVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBJbiBjYXNlIG9mIFRhc2ssIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBUb29sTWVudG9yIGFuZAotCQkJCS8vIEVzdGltYXRlIGd1aWRhbmNlCi0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gCi0vLwkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotLy8JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKSwgbnVsbCwKLS8vCQkJCQkJCQktMSk7Ci0vLwkJCQkJfQotCQkJCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB7Ci0JCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIGl0ZW0sCi0JCQkJCQkJCS0xKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIEluIGNhc2Ugb2YgV29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0IGlzIGFzc29jaWF0ZWQgdG8gVG9vbE1lbnRvciwKLQkJCQkvLyBFc3RpbWF0ZSwgUmVwb3J0IGFuZCBUZW1wbGF0ZSBndWlkYW5jZQotCQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQljb250ZW50RWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLCBpdGVtLCAtMSk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwgaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gCi0vLwkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRlKSB7Ci0vLwkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50LAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCksCi0vLwkJCQkJCQkJbnVsbCwgLTEpOwotLy8JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgaXRlbSwKLQkJCQkJCQkJLTEpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBtZXRob2QgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQkoQ29uY2VwdCkgaXRlbSwgLTEpOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCShTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKQotCQkJCQkJCQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBjb250ZW50RWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyVHlwZXMoKQotCSAqICAgICAgVHlwZXMgYXJlIHJldHVybmVkIGluIG9yZGVyIHRvIGRpc3BsYXkgaW4gdGhlIGZpbHRlciBkaWFsb2cgZm9yCi0JICogICAgICBzZWFyY2ggYmFzZWQgb24gdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RmlsdGVyVHlwZXMoKSB7Ci0JCQotCQlTdHJpbmdbXSBzdHI7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCXN0ciA9IG5ldyBTdHJpbmdbMTFdOwotCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCXN0ciA9IG5ldyBTdHJpbmdbMTNdOwotCQl9IGVsc2UKLQkJCXN0ciA9IG5ldyBTdHJpbmdbOV07Ci0JCWludCBpID0gMDsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVVU0FCTEVfQVNTRVRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykgewotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCQkvLyBUT0RPIEVzdGltYXRlIGNvbnRlbnRlbGVtZW50Ci0JCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUkVQT1JUUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQkJLy8gVE9ETyBFc3RpbWF0ZSBjb250ZW50ZWxlbWVudAotCQl9Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLkNPTlRFTlRfUEFDS0FHRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJCi0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVzX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZXNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbil7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluc19ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzayl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0d1aWRhbmNlUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVG9vbCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbHNfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENvbmNlcHQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIENoZWNrbGlzdCl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFeGFtcGxlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkZWxpbmUpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvYWRtYXApewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUmVwb3J0KXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJldXNhYmxlYXNzZXRfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQlpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlbXBsYXRlKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV9ndWlkYW5jZXBhZ2Vfc2VjdGlvbmRlc2NyaXB0aW9uOwotCQl9Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUb29sTWVudG9yKXsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2d1aWRhbmNlcGFnZV9zZWN0aW9uZGVzY3JpcHRpb247Ci0JCX0KLQkJaWYoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSl7Ci0JCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZ3VpZGFuY2VwYWdlX3NlY3Rpb25kZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJaWYoY29udGVudEVsZW1lbnQgIT0gbnVsbCkKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb24sIGNvbnRlbnRFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNhdGVnb3J5R3VpZGFuY2VzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jYXRlZ29yeUd1aWRhbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Db250ZW50UGFja2FnZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGIyNDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLQotLyoqCi0gKiBUaGUgZGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIENvbnRlbnQgUGFja2FnZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUkVGSVggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfQ09OVEVOVF9QQUNLQUdFCi0JCQkrICI6ICI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2RlcGVuZGVuY3k7Ci0KLQlwcml2YXRlIENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQljb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSkgbWV0aG9kRWxlbWVudDsKLQkJZGV0YWlsU2VjdGlvbk9uID0gZmFsc2U7Ci0JCWZ1bGxEZXNjT24gPSBmYWxzZTsKLQkJa2V5Q29uc2lkZXJhdGlvbk9uID0gZmFsc2U7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbk9uID0gZmFsc2U7Ci0JCXZlcnNpb25TZWN0aW9uT24gPSBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3JlYXRlRGVwZW5kZW5jeVNlY3Rpb24odG9vbGtpdCk7Ci0JCS8vIFNldCBmb2N1cyBvbiB0aGUgTmFtZSB0ZXh0IGNvbnRyb2wuCi0JCURpc3BsYXkgZGlzcGxheSA9IGZvcm0uZ2V0Qm9keSgpLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYoY3RybF9uYW1lLmlzRGlzcG9zZWQoKSkgcmV0dXJuOwotCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJY3RybF9uYW1lLnNldFNlbGVjdGlvbigwLCBjdHJsX25hbWUuZ2V0VGV4dCgpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXBlbmRlbmN5U2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCVNlY3Rpb24gZGVwZW5kZW5jeVNlY3Rpb24gPSBjcmVhdGVTZWN0aW9uKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsIAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVBFTkRFTkNJRVNfU0VDVElPTl9OQU1FLCAKLQkJCQlBdXRob3JpbmdVSVRleHQuREVQRU5ERU5DSUVTX1NFQ1RJT05fREVTQyk7Ci0JCUNvbXBvc2l0ZSBkZXBlbmRlbmN5Q29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRlcGVuZGVuY3lTZWN0aW9uKTsKLQotCQlUYWJsZSBjdHJsX3RhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShkZXBlbmRlbmN5Q29tcG9zaXRlLCBTV1QuVl9TQ1JPTEwKLQkJCQl8IFNXVC5DSEVDSyB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQ09MT1JfQkxVRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQkJY3RybF90YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfZGVwZW5kZW5jeSA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKGN0cmxfdGFibGUpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCgoQ29udGVudFBhY2thZ2UpZWxlbWVudCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfZGVwZW5kZW5jeS5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2RlcGVuZGVuY3kuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsCi0JCQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQkJCi0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQlyZXR1cm4gZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoY29udGVudFBhY2thZ2UpLnRvQXJyYXkoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJY3RybF9kZXBlbmRlbmN5LnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkpOwotCQljdHJsX2RlcGVuZGVuY3kuc2V0SW5wdXQoY29udGVudFBhY2thZ2UpOwotCi0JCWN0cmxfZGVwZW5kZW5jeS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQljdHJsX2RlcGVuZGVuY3kuc2V0QWxsR3JheWVkKHRydWUpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRlcGVuZGVuY3lDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQkKLQkJZm9ybS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkvLyByZWZyZXNoVmlld2VycygpOwotCQkJCWN0cmxfZGVwZW5kZW5jeS5yZWZyZXNoKCk7Ci0JCQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQkJY3RybF9kZXBlbmRlbmN5LnNldEFsbEdyYXllZCh0cnVlKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9kZXBlbmRlbmN5LmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJKChDaGVja2JveFRhYmxlVmlld2VyKSBvYmopLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogR2V0IGRlcGVuZGVuY3kgcGFja2FnZXMgZm9yIHRoZSBnaXZlbiBjb250ZW50IHBhY2thZ2UKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIGRlcGVuZGVuY3kgcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxDb250ZW50UGFja2FnZT4gZ2V0RGVwZW5kZW5jaWVzUGFja2FnZXMoQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UpIHsKLQotCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50UGFja2FnZS5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb250ZW50RWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCWVsZW1lbnRzLmFkZCgoQ29udGVudEVsZW1lbnQpIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCX0KLQkJCWVsZW1lbnRzLmFkZEFsbChNZXRob2RFbGVtZW50VXRpbAotCQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpKTsKLQotCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZSkgewotLyoJCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0TW9kaWZpZWRXb3JrUHJvZHVjdHMoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldFByaW1hcnlUYXNrcygoUm9sZSkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldFNlY29uZGFyeVRhc2tzKChSb2xlKSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0U2Vjb25kYXJ5VGFza3MoKFJvbGUpIGNvbnRlbnRFbGVtZW50KSk7Ci0JCQkJfSovCi0JCQl9Ci0JCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldFBlcmZvcm1lZEJ5KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0UGVyZm9ybWVkQnkoKSk7Ci0JCQkJfQotCQkJCWlmICgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKCgoVGFzaykgY29udGVudEVsZW1lbnQpCi0JCQkJCQkJLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzCi0JCQkJCQkJLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCQl9Ci0JCQkJaWYgKCgoVGFzaykgY29udGVudEVsZW1lbnQpLmdldE9wdGlvbmFsSW5wdXQoKSAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbCgoKFRhc2spIGNvbnRlbnRFbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJCX0KLQkJCQlpZiAoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3V0cHV0KCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoKChUYXNrKSBjb250ZW50RWxlbWVudCkuZ2V0T3V0cHV0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0vKgkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cwotCQkJCQkJCS5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkpOwotCQkJCX0KLQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRPdXRwdXR0aW5nVGFza3MoKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudCkgIT0gbnVsbCkgewotCQkJCQllbGVtZW50cy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0T3V0cHV0dGluZ1Rhc2tzKChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQpKTsKLQkJCQl9Ci0JCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlcygoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLmFkZEFsbChsaXN0KTsKLQkJCQl9Ki8KLQkJCX0KLQotCQl9Ci0KLQkJTGlzdDxDb250ZW50UGFja2FnZT4gY3BMaXN0ID0gbmV3IEFycmF5TGlzdDxDb250ZW50UGFja2FnZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnRzLmdldChpKSkuZUNvbnRhaW5lcigpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJaWYgKCFjb250ZW50UGFja2FnZS5lcXVhbHMob2JqZWN0KSkgewotCQkJCQlpZiAoIWNwTGlzdC5jb250YWlucygoQ29udGVudFBhY2thZ2Upb2JqZWN0KSkgewotCQkJCQkJY3BMaXN0LmFkZCgoQ29udGVudFBhY2thZ2Upb2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY3BMaXN0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50UGFja2FnZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fREVTQywKLQkJCQluZXcgU3RyaW5nW10geyBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKGNvbnRlbnRQYWNrYWdlKSB9KTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5ZDA3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5QXNzaWduUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQXNzaWduIHBhZ2UgaW4gdGhlIEN1c3RvbSBDYXRlZ29yeSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0KLQkvL3ByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgYWxsU3RlcHM7Ci0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCXByaXZhdGUgQnV0dG9uIGluY2x1ZGVDaGVja0JveDsKLQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgdHlwZUNvbWJvVmlld2VyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQVNTSUdOX1BBR0VfVElUTEUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQkKLQkJY3JlYXRlSW5jbHVkZUNvbXBvc2l0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmNsdWRlQ29tcG9zaXRlKCkgewotCQljcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIGFDb21wb3NpdGUpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGFDb21wb3NpdGUsIEdyaWREYXRhLkZJTExfQk9USCwgMSwgMSwgMik7Ci0JCWluY2x1ZGVDaGVja0JveCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX2luY2x1ZGVFbGVtZW50c09mVHlwZSwgU1dULkNIRUNLKTsKLQkJaW5jbHVkZUNoZWNrQm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORykpOwotCQlDb21ibyB0eXBlQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORykpOwotCQl0eXBlQ29tYm9WaWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIodHlwZUNvbWJvKTsKLQkJdHlwZUNvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXR5cGVDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmdldFR5cGVUZXh0KChFQ2xhc3MpIGVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXR5cGVDb21ib1ZpZXdlci5zZXRJbnB1dChMaWJyYXJ5VXRpbC5nZXRJbmNsdWRlZEVsZW1lbnRUeXBlcygpKTsKLQkJCi0JCS8vIHBvcHVsYXRlIGRhdGEKLQkJLy8KLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoY2F0ZWdvcnksIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DVVNUT01fQ0FURUdPUllfX0lOQ0xVREVEX0VMRU1FTlRTKTsKLQkJaWYocHJvcCAhPSBudWxsKSB7Ci0JCQlpbmNsdWRlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJRUNsYXNzaWZpZXIgY2xzID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXIocHJvcC5nZXRWYWx1ZSgpKTsKLQkJCWlmKGNscyBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCXR5cGVDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2xzKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0eXBlQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJLy8KLQkJaW5jbHVkZUNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdHlwZUNvbWJvVmlld2VyLmdldENvbWJvKCkuc2V0RW5hYmxlZChpbmNsdWRlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCXVwZGF0ZUluY2x1ZGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXR5cGVDb21ib1ZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoaW5jbHVkZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXVwZGF0ZUluY2x1ZGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUluY2x1ZGUoKSB7Ci0JCWlmKGluY2x1ZGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJU3RyaW5nIHR5cGU7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHR5cGVDb21ib1ZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQl0eXBlID0gU3RyVXRpbC5FTVBUWV9TVFJJTkc7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0eXBlID0gKChFQ2xhc3MpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0TmFtZSgpOwotCQkJfQotCQkJTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZCBjbWQgPSBuZXcgTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZChjYXRlZ29yeSwKLQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNVU1RPTV9DQVRFR09SWV9fSU5DTFVERURfRUxFTUVOVFMsIHR5cGUpOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmV4ZWN1dGUoY21kKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJlbW92ZSBwcm9wZXJ0eSAiaW5jbHVkZSIKLQkJCS8vCi0JCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShjYXRlZ29yeSwgTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNVU1RPTV9DQVRFR09SWV9fSU5DTFVERURfRUxFTUVOVFMpOwotCQkJaWYocHJvcCAhPSBudWxsKSB7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgY2F0ZWdvcnksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCksIHByb3AsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCQlzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cyhjb250ZW50RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWFkZEl0ZW1zVG9Nb2RlbDEoYWRkSXRlbXMsIGNhdGVnb3J5LCB1c2VkQ2F0ZWdvcmllcywKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGdldEFuY2VzdG9ycyhjYXRlZ29yeSkpOwotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcywgCi0JCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSwKLQkJCUFycmF5TGlzdCB1c2VkQ2F0ZWdvcmllcywKLQkJCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXIsCi0JCQlMaXN0PE9iamVjdD4gYW5jZXN0b3JzCi0JCQkpIHsKLQkJYm9vbGVhbiBvayA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoY2F0ZWdvcnksIGFkZEl0ZW1zKTsKLQkJaWYoISBvaykgewotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl90aXRsZTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnKTsJCQkJCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9MaXN0PE9iamVjdD4gYW5jZXN0b3JzID0gZ2V0QW5jZXN0b3JzKGNhdGVnb3J5KTsKLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBjdXN0b21DYXRlZ29yeSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGN1c3RvbUNhdGVnb3J5IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQkJCSYmIFRuZ1V0aWwKLQkJCQkJCQkJLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgY3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJfSBlbHNlIGlmIChhbmNlc3RvcnMuY29udGFpbnMoY3VzdG9tQ2F0ZWdvcnkpKSB7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGN1c3RvbUNhdGVnb3J5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBvYmplY3QgPSAoKFByb2Nlc3NDb21wb25lbnQpIGN1c3RvbUNhdGVnb3J5KQotCQkJCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0N1c3RvbUNhdGVnb3J5KAotCQkJCQkJCQlhY3Rpb25NYW5hZ2VyLCBjYXRlZ29yeSwgb2JqZWN0LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQkJCWFjdGlvbk1hbmFnZXIsIGNhdGVnb3J5LCBjdXN0b21DYXRlZ29yeSwgdXNlZENhdGVnb3JpZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy9zZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCXJlbW92ZUl0ZW1zRnJvbU1vZGVsMShybUl0ZW1zLCBjYXRlZ29yeSwgdXNlZENhdGVnb3JpZXMsCi0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBnZXRBbmNlc3RvcnMoY2F0ZWdvcnkpKTsKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcywKLQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnksCi0JCUFycmF5TGlzdCB1c2VkQ2F0ZWdvcmllcywKLQkJSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWFuYWdlciwKLQkJTGlzdDxPYmplY3Q+IGFuY2VzdG9ycwotCQkpIHsKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+IGN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kRWxlbWVudD4oKTsKLQkJCU1ldGhvZFBsdWdpbiBjdXJyZW50UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotLy8JCQkJCUFkYXB0ZXIgYWRhcHRlciA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0vLwkJCQkJCQkJCWNhdGVnb3J5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCWlmIChhZGFwdGVyICE9IG51bGwKLS8vCQkJCQkJCSYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0vLwkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLS8vCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oY2F0ZWdvcnkpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJCWlmIChUbmdVdGlsLnVud3JhcChvKSA9PSBlKSB7Ci0vLwkJCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlLmFkZChvKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIHdpbGwgZGVsZXRlIGUgaWYgaXQgaXMgaW4gdGhlIGN1cnJlbnQgcGx1Z2luIGFuZAotCQkJCQkvLyB0aGUgbGFzdCBzdXBlciBjdXN0b20gY2F0ZWdvcnkgb2YgZSBpbiB0aGUgY3VycmVudCBwbHVnaW4KLQkJCQkJLy8KLQkJCQkJaWYoVG5nVXRpbC5pc0luUGx1Z2luV2l0aExlc3NUaGFuT25lU3VwZXJDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIGUsIGN1cnJlbnRQbHVnaW4pKSB7Ci0JCQkJCQljdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuYWRkKGUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJYWN0aW9uTWFuYWdlciwgY2F0ZWdvcnksIGUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQotCQkJaWYgKGN1c3RvbUNhdGVnb3JpZXNUb0RlbGV0ZS5zaXplKCkgPiAwKSB7Ci0JCQkJaW50IGkgPSAwOwotCQkJCVN0cmluZ0J1ZmZlciBlbGVtZW50U3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kRWxlbWVudD4gaXQgPSBjdXN0b21DYXRlZ29yaWVzVG9EZWxldGUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXQubmV4dCgpKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCWlmIChpID4gMCkgewotCQkJCQkJCWVsZW1lbnRTdHIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbGVtZW50U3RyLmFwcGVuZCgoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpKTsKLQotCQkJCQkJaSsrOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWlmKCFBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUNvbmZpcm1hdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5yZW1vdmVfdGV4dCwKLQkJCQkJCU5MUy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdERlbGV0ZUN1c3RvbUNhdGVnb3J5QmVmb3JlUmVtb3ZlTGFzdFJlZlRvSXQsIGVsZW1lbnRTdHIpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUxpYnJhcnlWaWV3RGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZTsgCi0JCQkJCQljb25maXJtID0gZmFsc2U7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXN1cGVyLnJ1bigpOwotCQkJCQkJfSBjYXRjaCAoTWVzc2FnZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBkZXRhaWxzID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZSk7Ci0JCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U7IAotCQkJCQkJCVN0cmluZyByZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvclJlYXNvbjsgCi0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCByZWFzb24sCi0JCQkJCQkJCQkJCWRldGFpbHMsIGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCQkJCQkJLy8gbGlicmFyeSBuZWVkIHRvIGJlIHJlbG9hZGVkCi0JCQkJCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQkJCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLm9wZW5MaWJyYXJ5KGxpYkRpcik7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfTsKLQkJCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJCWRlbGV0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJY3VzdG9tQ2F0ZWdvcmllc1RvRGVsZXRlKSk7Ci0JCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJfQotCQkJLy9zZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFuY2VzdG9ycyBmb3IgdGhlIGdpdmVuIEN1c3RvbSBDYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0PiBnZXRBbmNlc3RvcnMoQ3VzdG9tQ2F0ZWdvcnkgbWV0aG9kT2JqZWN0KSB7Ci0JCUxpc3Q8T2JqZWN0PiBhbmNlc3Rvckxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJTGlzdDxPYmplY3Q+IG9iakxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJb2JqTGlzdC5hZGQobWV0aG9kT2JqZWN0KTsKLQkJZ2V0QW5jZXN0b3JzKGFuY2VzdG9yTGlzdCwgb2JqTGlzdCk7Ci0JCXJldHVybiBhbmNlc3Rvckxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGdldEFuY2VzdG9ycyhMaXN0PE9iamVjdD4gYW5jZXN0b3JMaXN0LCBMaXN0PE9iamVjdD4gbWV0aG9kT2JqZWN0TGlzdCkgewotCQlpZiAobWV0aG9kT2JqZWN0TGlzdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gYW5jZXN0b3JMaXN0OwotCi0JCUxpc3QgYWxsUGFyZW50Q3VzdENhdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBtZXRob2RPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IChDdXN0b21DYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IHBhcmVudExpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGVsZW1lbnQpOwotCQkJYWxsUGFyZW50Q3VzdENhdHMuYWRkQWxsKHBhcmVudExpc3QpOwotCQl9Ci0KLQkJYW5jZXN0b3JMaXN0LmFkZEFsbChtZXRob2RPYmplY3RMaXN0KTsKLQkJTGlzdDxPYmplY3Q+IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsUGFyZW50Q3VzdENhdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFhbmNlc3Rvckxpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQluZXh0Q2hlY2tMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBnZXRBbmNlc3RvcnMoYW5jZXN0b3JMaXN0LCBuZXh0Q2hlY2tMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQUxMX0VMRU1FTlRTOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25GaWx0ZXIgZXh0ZW5kcyBBbGxGaWx0ZXIgewotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2VzcykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeSgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaikpIHsKLQkJCQkJcmV0dXJuICEoKChDdXN0b21DYXRlZ29yeSkgb2JqKS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCQkuaXNFbXB0eSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJLy8gaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJCS8vIHJldHVybgotCQkJCS8vIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpb2JqKS5pc0VtcHR5KCk7Ci0JCQkJLy8gfQotCQkJCS8vIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KXsKLQkJCQkvLyByZXR1cm4KLQkJCQkvLyBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KW9iaikuaXNFbXB0eSgpOwotCQkJCS8vIH0KLQkJCQlyZXR1cm4gIShnZXRIZWxwZXIoKS5pc0NvbnRyaWJ1dG9yKChDb250ZW50RWxlbWVudCkgb2JqKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25GaWx0ZXIoKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5QXNzaWduUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeUFzc2lnblBhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyNTgwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0N1c3RvbUNhdGVnb3J5RGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiY3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBjb250ZW50RWxlbWVudDsKLQkJcHVibGlzaENhdGVnb3J5T24gPSB0cnVlOwotCQlzZXRJY29uU2VjdGlvbk9uKHRydWUpOwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuQ1VTVE9NX0NBVEVHT1JJRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUZpbHRlcigpOwotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKEN1c3RvbUNhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCWNhdGVnb3J5KSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmN1c3RvbWNhdGVnb3J5X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSAgQXV0aG9yaW5nVUlSZXNvdXJjZXMuY3VzdG9tY2F0ZWdvcnlfSWNvblNlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NWYxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogRGVzY3JpcHRpb24gcGFnZSBmb3IgZGVsaXZlcnkgcHJvY2VzcwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3NjYWxlLCBjdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yaXNrX2xldmVsLCBjdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlczsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlLAotCQkJY3RybF90eXBlX29mX2NvbnRyYWN0OwotCi0JcHJpdmF0ZSBEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Zvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2VzczsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jY3JlYXRlRGV0YWlsU2VjdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZURldGFpbFNlY3Rpb24odG9vbGtpdCk7Ci0KLQkJLy8gc2NhbGUKLQkJY3RybF9zY2FsZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19TY2FsZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBwcm9qZWN0IGNoYXJhY3RlcmlzdGljcwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdENoYXJhY3RlcmlzdGljcywgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyByaXNrIGxldmVsCi0JCWN0cmxfcmlza19sZXZlbCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Jpc2tMZXZlbCwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBFc3RpbWF0aW5nIHRlY2huaXF1ZQotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0VzdGltYXRpbmdUZWNobmlxdWUsIDQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsgCi0KLQkJLy8gUHJvamVjdCBNZW1iZXIgZXhwZXJ0aXNlCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKAotCQkJCXRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NfUHJvamVjdE1lbWJlckV4cGVydGlzZSwgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBUeXBlIG9mIGNvbnRyYWN0Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1R5cGVPZkNvbnRyYWN0LCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihkZXRhaWxDb21wb3NpdGUpOwotCi0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2xvYWREYXRhKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRGF0YSgpIHsKLQkJc3VwZXIubG9hZERhdGEoKTsKLQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNvbnRlbnQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbikgZGVsaXZlcnlQcm9jZXNzCi0JCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQlTdHJpbmcgc2NhbGUgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCVN0cmluZyBwcm9qZWN0Q2hhciA9IGNvbnRlbnQuZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQlTdHJpbmcgZXN0aW1hdGluZ1RlY2huaXF1ZSA9IGNvbnRlbnQuZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCQlTdHJpbmcgcmlza0xldmVsID0gY29udGVudC5nZXRSaXNrTGV2ZWwoKTsKLQkJU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpZXNlID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCVN0cmluZyB0eXBlT2ZDb250cmFjdCA9IGNvbnRlbnQuZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCQljdHJsX3NjYWxlLnNldFRleHQoc2NhbGUgPT0gbnVsbCA/ICIiIDogc2NhbGUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MKLQkJCQkuc2V0VGV4dChwcm9qZWN0Q2hhciA9PSBudWxsID8gIiIgOiBwcm9qZWN0Q2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMKLQkJCQkuc2V0VGV4dChlc3RpbWF0aW5nVGVjaG5pcXVlID09IG51bGwgPyAiIiA6IGVzdGltYXRpbmdUZWNobmlxdWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcmlza19sZXZlbC5zZXRUZXh0KHJpc2tMZXZlbCA9PSBudWxsID8gIiIgOiByaXNrTGV2ZWwpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJvamVjdF9tZW1iZXJfZXhwZXJ0aXNlCi0JCQkJLnNldFRleHQocHJvamVjdE1lbWJlckV4cGVydGllc2UgPT0gbnVsbCA/ICIiIDogcHJvamVjdE1lbWJlckV4cGVydGllc2UpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdHlwZV9vZl9jb250cmFjdAotCQkJCS5zZXRUZXh0KHR5cGVPZkNvbnRyYWN0ID09IG51bGwgPyAiIiA6IHR5cGVPZkNvbnRyYWN0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0Rlc2NyaXB0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKTsKLQkJZmluYWwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJZmluYWwgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjb250ZW50ID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQljdHJsX3NjYWxlLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfc2NhbGUuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCkpOwotCQljdHJsX3NjYWxlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfc2NhbGUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3NjYWxlOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldFNjYWxlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9wcm9qZWN0X2NoYXJhY3RlcmlzdGljcy5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfcHJvamVjdF9jaGFyYWN0ZXJpc3RpY3M7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9yaXNrX2xldmVsLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSk7Ci0JCWN0cmxfcmlza19sZXZlbC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Jpc2tfbGV2ZWwuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3Jpc2tfbGV2ZWw7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0Umlza0xldmVsKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBkZWxpdmVyeVByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0KGRlbGl2ZXJ5UHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2VzdGltYXRpbmdfdGVjaG5pcXVlcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfZXN0aW1hdGluZ190ZWNobmlxdWVzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5zZXRNb2RhbE9iamVjdChkZWxpdmVyeVByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZQotCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3Byb2plY3RfbWVtYmVyX2V4cGVydGlzZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQluZXcgTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCTogY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2U7Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWRlbGl2ZXJ5UHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX3R5cGVfb2ZfY29udHJhY3Quc2V0TW9kYWxPYmplY3QoZGVsaXZlcnlQcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfdHlwZV9vZl9jb250cmFjdC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfdHlwZV9vZl9jb250cmFjdDsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRUeXBlT2ZDb250cmFjdCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZGVsaXZlcnlQcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRGVzY3JpcHRpb24jcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9lc3RpbWF0aW5nX3RlY2huaXF1ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Byb2plY3RfY2hhcmFjdGVyaXN0aWNzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9qZWN0X21lbWJlcl9leHBlcnRpc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3Jpc2tfbGV2ZWwuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX3NjYWxlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF90eXBlX29mX2NvbnRyYWN0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNThjM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EZXNjcmlwdGlvbkZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLkNvbHVtbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5Db252ZXJ0R3VpZGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBEZXNjcmlwdGlvbiBwYWdlcyBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc2MzgyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmlwdGlvbkZvcm1QYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIGltcGxlbWVudHMgSVJlZnJlc2hhYmxlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9XSURUSCA9IDE1MDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfQVBQTElDQUJMRV9URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMubm90QXBwbGljYWJsZV90ZXh0OyAKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29udHJpYnV0ZXNfdGV4dDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX0NPTlRSSUJVVEVTX1RFWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzX3RleHQ7ICAKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZHNfdGV4dDsgCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EU19SRVBMQUNFU19URVhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXh0ZW5kc1JlcGxhY2VzX3RleHQ7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0JCi0JLy8gQ29tcG9zaXRlcyBhbmQgc2VjdGlvbnMuCi0JcHJvdGVjdGVkIFNlY3Rpb24gZm9ybVNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGU7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBnZW5lcmFsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHZhcmlhYmlsaXR5U2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdmFyaWFiaWxpdHlDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB2ZXJzaW9uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdmVyc2lvbkNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGljb25TZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBpY29uQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBDYW52YXMgcGFuZTE7Ci0KLQlwcml2YXRlIENhbnZhcyBwYW5lMzsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGRldGFpbFNlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGRldGFpbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBTZWN0aW9uIG5vdGF0aW9uU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgbm90YXRpb25Db21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiB0YWlsb3JpbmdTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0YWlsb3JpbmdDb21wb3NpdGU7Ci0KLQkvLyBFZGl0IGNvbnRyb2xzLgotCXByb3RlY3RlZCBUZXh0IGN0cmxfbmFtZTsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfcHJlc2VudGF0aW9uX25hbWU7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3RybF90eXBlX2xhYmVsOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3R5cGVfYnV0dG9uOwotCi0JcHJvdGVjdGVkIFRleHQgY3RybF9icmllZl9kZXNjOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBjdHJsX2Z1bGxfZGVzYzsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgY3RybF9rZXk7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgdmlld2VyX3ZhcmlhYmlsaXR5OwotCi0JcHJvdGVjdGVkIENvbWJvIGN0cmxfdmFyaWFiaWxpdHk7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWxfYmFzZTsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBiYXNlX3ZpZXdlcjsKLQotCXByb3RlY3RlZCBUYWJsZSBjdHJsX2Jhc2U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfYmFzZV9idXR0b247Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBhY3RpdmVDb250cm9sOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yczsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfY2hhbmdlX2RhdGU7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGVzYzsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb247Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWxfY29weXJpZ2h0OwotCi0JcHJvdGVjdGVkIFRhYmxlVmlld2VyIGNvcHlyaWdodF92aWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGFibGUgY3RybF9jb3B5cmlnaHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb3B5cmlnaHRfYnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmREZXRhaWxMaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZERldGFpbExhYmVsOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZE5vdGF0aW9uTGluazsKLQotCXByb3RlY3RlZCBMYWJlbCBleHBhbmROb3RhdGlvbkxhYmVsOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZFRhaWxvcmluZ0xpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kVGFpbG9yaW5nTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfcHVycG9zZTsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfZXh0ZXJuYWxfaWQ7Ci0KLQlwcml2YXRlIEltYWdlIHNoYXBlSW1hZ2U7Ci0KLQlwcml2YXRlIEltYWdlIG5vZGVJbWFnZTsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9zZWxlY3Rfc2hhcGVJY29uX2J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBjdHJsX3NlbGVjdF9ub2RlSWNvbl9idXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uOwotCQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZFZlcnNpb25MaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZFZlcnNpb25MYWJlbDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmRMaW5rOwotCi0JcHJvdGVjdGVkIExhYmVsIGV4cGFuZExhYmVsOwotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXJCYXNlOwotCQotCXByaXZhdGUgSUNvbHVtblByb3ZpZGVyIGNvbHVtblByb3ZpZGVyOwotCQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyVmFyaWFiaWxpdHkgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdmFyT2JqZWN0ID0gKFZhcmlhYmlsaXR5VHlwZSkgb2JqZWN0OwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuTkEpCi0JCQkJcmV0dXJuIE5PVF9BUFBMSUNBQkxFX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykKLQkJCQlyZXR1cm4gQ09OVFJJQlVURVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikKLQkJCQlyZXR1cm4gTE9DQUxfQ09OVFJJQlVURVNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpCi0JCQkJcmV0dXJuIEVYVEVORFNfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKQotCQkJCXJldHVybiBSRVBMQUNFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpCi0JCQkJcmV0dXJuIExPQ0FMX1JFUExBQ0VTX1RFWFQ7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKQotCQkJCXJldHVybiBFWFRFTkRTX1JFUExBQ0VTX1RFWFQ7Ci0JCQkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyQmFzZSA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChvYmplY3QpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29weXJpZ2h0Q29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBjb3B5cmlnaHRMYWJlbFByb3ZpZGVyQmFzZSA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCQotCXByb3RlY3RlZCBGb2N1c0FkYXB0ZXIgbmFtZUZvY3VzTGlzdGVuZXIgPSBuZXcgRm9jdXNBZGFwdGVyKCkgewotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kRWxlbWVudC5nZXROYW1lKCkgOwotCQkJU3RyaW5nIG5hbWUgPSBjdHJsX25hbWUuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQllLndpZGdldCwgbWV0aG9kRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKG5hbWUuZXF1YWxzKG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCS8vIDE3ODQ2MgotCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQlpZiAob2xkQ29udGVudC5pbmRleE9mKCImIikgPCAwICYmIG5hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbXNnID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnLAotCQkJCQkJbmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0TmFtZVZhbGlkYXRvcigpOwotCQkJCWlmKHZhbGlkYXRvciA9PSBudWxsKXsKLQkJCQkJdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJfQotCQkJCW1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpOwotCQkJfQotCQkJaWYgKG1zZyA9PSBudWxsICYmICFuYW1lLmVxdWFscyhtZXRob2RFbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCQlpZihuYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3I0X21zZywKLQkJCQkJCQluYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQluYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShjdHJsX25hbWUuZ2V0VGV4dCgpKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuYW1lKTsgLy8xODMwODQKLQkJCQlpZiAoIW5hbWUuZXF1YWxzKG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpKSkgewkJCQkJCQotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBtZXRob2RFbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJbmFtZSwgLTEpOwotCQkJCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJCS5oYXNQcmVzZW50YXRpb24obWV0aG9kRWxlbWVudCkpIHsKLQkJCQkJCVJlc291cmNlIGNvbnRlbnRSZXNvdXJjZSA9IGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmIChjb250ZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCQkuYWRkUmVzb3VyY2VUb0FkanVzdExvY2F0aW9uKGNvbnRlbnRSZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KG5hbWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy9GaXggbWlzc2luZyAiJiIgaW4gZXJyb3IgZGlhbG9nCi0JCQkJaWYgKG1zZy5pbmRleE9mKCImIikgPj0gMCkgey8vJE5PTi1OTFMtMSQKLQkJCQkJbXNnID0gbXNnLnJlcGxhY2UoIiYiLCAiJiYiKTsvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVFcnJvcl90aXRsZSwgCi0JCQkJCQkJCW1zZyk7Ci0JCQkJY3RybF9uYW1lLnNldFRleHQobWV0aG9kRWxlbWVudC5nZXROYW1lKCkpOwotCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBFZGl0aW5nIGFuZCBkaXNwbGF5IGZsYWdzLgotCXByb3RlY3RlZCBib29sZWFuIGRlc2NFeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRldGFpbFNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RhdGlvblNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YWlsb3JpbmdTZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyc2lvblNlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbGVtZW50U2VjdGlvbkV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGljb25TZWN0aW9uRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZnVsbERlc2NPbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBrZXlDb25zaWRlcmF0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnJpZWZEZXNjT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWxlbWVudFR5cGVPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGVudEZpZWxkT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHZlcnNpb25TZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW55QXR0cmlidXRlTW9kaWZpZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYWxTZWN0aW9uT24gPSB0cnVlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm90YXRpb25TZWN0aW9uT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRldGFpbFNlY3Rpb25PbiA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YWlsb3JpbmdTZWN0aW9uT24gPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHZhcmlhYmlsaXR5U2VjdGlvbk9uID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzbG90U2VjdGlvbk9uPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHB1cnBvc2VPbiA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZXJuYWxJZE9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpY29uU2VjdGlvbk9uID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaENhdGVnb3J5T24gPSBmYWxzZTsKLQotCS8vIGNvbW1lbnRlZCBiZWNhdXNlIHRoZXNlIHZhcmlhYmxlcyBhcmUgbm90IGluIHVzZQotCS8vIHByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlUeXBlTm9uZSA9IE5PVF9BUFBMSUNBQkxFX1RFWFQ7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVDb250cmlidXRlcyA9IENPTlRSSUJVVEVTX1RFWFQ7Ci0JLy8gcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eVR5cGVFeHRlbmRzID0gRVhURU5EU19URVhUOwotCS8vIHByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlUeXBlUmVwbGFjZXMgPSBSRVBMQUNFU19URVhUOwotCi0JLy8gSW50ZXJuYWwgSURzIGZvciB0aGUgc2VjdGlvbnMuCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgR0VORVJBTF9TRUNUSU9OX0lEID0gMTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFVEFJTF9TRUNUSU9OX0lEID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fU0VDVElPTl9JRCA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9TRUNUSU9OX0lEID0gNDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRBSUxPUklOR19TRUNUSU9OX0lEID0gNTsKLQotCXByaXZhdGUgaW50IHdhcm5pbmdDb3VudCA9IDE7Ci0KLQlwcml2YXRlIGludCBTRUNUSU9OUyA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgU0hBUEVJQ09OX1dJRFRIX01BWCA9IDMyOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFNIQVBFSUNPTl9IRUlHSFRfTUFYID0gMzI7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTk9ERUlDT05fV0lEVEhfTUFYID0gMTY7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTk9ERUlDT05fSEVJR0hUX01BWCA9IDE2OwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2VkOwotCi0JLy8gVG8gaGFuZGxlIHRoZSBpMTE4biBwcm9wZXJseSBhbmQgYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi0JcHVibGljIFN0cmluZyBnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgdGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBTdHJpbmcgbm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB2YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgU3RyaW5nIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIFN0cmluZyB2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBMYWJlbCBub2RlSWNvblBhdGg7Ci0KLQlwcml2YXRlIExhYmVsIHNoYXBlSWNvblBhdGg7Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBpbWFnZVR5cGVzID0gbmV3IFN0cmluZ1tdIHsgIiouZ2lmOyouanBnOyoucG5nOyouaWNvOyouYm1wIiB9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmdbXSBpbWFnZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsgIkltYWdlIChnaWYsIGpwZWcsIHBuZywgaWNvLCBibXApIiB9OyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDb250ZW50IGZpbHRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWdlLgotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDb250ZW50IGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyQmFzZSgpIHsKLQkJY29udGVudFByb3ZpZGVyQmFzZSA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUFycmF5TGlzdCBiYXNlX3NlbGVjdGVkX2xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKQotCQkJCQliYXNlX3NlbGVjdGVkX2xpc3QuYWRkKGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJcmV0dXJuIGJhc2Vfc2VsZWN0ZWRfbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJhc2Vfdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJCYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgZm9ybSBlZGl0b3IuCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgdW5pcXVlIElEIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZm9ybSBwYWdlLgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yLCBTdHJpbmcgaWQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVmFyaWFiaWxpdHlUeXBlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCi0JCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlW10gdHlwZXM7Ci0KLQkJcHVibGljIFZhcmlhYmlsaXR5VHlwZUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgVmFyaWFiaWxpdHlUeXBlW10gdHlwZXMpIHsKLQkJCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXRoaXMudHlwZXMgPSB0eXBlczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSBtZXRob2RFbGVtZW50Ci0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUCi0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkJhc2VGb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQotCQlWYXJpYWJpbGl0eVR5cGVbXSB0eXBlczsKLQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCXR5cGVzID0gbmV3IFZhcmlhYmlsaXR5VHlwZVtdIHsKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCX07Ci0JCX0gZWxzZSB7Ci0JCQl0eXBlcyA9IG5ldyBWYXJpYWJpbGl0eVR5cGVbXSB7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUwotCQkJfTsKLQkJfQotCQljb250ZW50UHJvdmlkZXJWYXJpYWJpbGl0eSA9IG5ldyBWYXJpYWJpbGl0eVR5cGVDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgdHlwZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCQljcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQlzZXRDb250ZXh0SGVscCgpOwotCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJbG9hZERhdGEoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpIHsKLQkJVUlIZWxwZXIuc2V0Rm9ybVRleHQoZm9ybSwgbWV0aG9kRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAc2VlIFRuZ1V0aWwjZ2V0TGFiZWwgQ29kZSBtb3ZlZCB0byBUbmdVdGlsLmdldExhYmVsKGJlbG93IG1vcmUgc3BlY2lmaWMKLQkgKiAgICAgIG1ldGhvZClyZXR1cm5zIGxhYmVsIHdpdGggdmFyaWFiaWxpdHlJbmZvCi0JICogICAgICA8Y29kZT5UbmdVdGlsLmdldExhYmVsKFZhcmlhYmlsaXR5RWxlbWVudCBvYmplY3QsIFN0cmluZyBhbHRlcm5hdGl2ZUxhYmVsLCBib29sZWFuIHByZWZlckJhc2UpPC9jb2RlPgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCwgU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwsCi0JCQlib29sZWFuIHByZWZlckJhc2UpIHsKLQkJU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGFsdGVybmF0aXZlTGFiZWwpOwotCQlpZiAocHJlZmVyQmFzZSAmJiBvYmplY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gb2JqZWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJU3RyaW5nIHZhcmlhYmlsaXR5VHh0ID0gbnVsbDsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCS5jb250cmlidXRlc190b190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkubG9jYWxDb250cmlidXRlc190ZXh0OyAJCQkKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewkJCQkJCi0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmV4dGVuZHNfdGV4dDsKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkucmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJLmV4dGVuZHNSZXBsYWNlc190ZXh0OyAKLQkJCX0KLQkJCWlmICh2YXJpYWJpbGl0eVR4dCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobGFiZWwpCi0JCQkJCQkuYXBwZW5kKCIgKCIpLmFwcGVuZCh2YXJpYWJpbGl0eVR4dCkuYXBwZW5kKCIgJyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJVG5nVXRpbC5nZXRMYWJlbChvYmplY3QKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpKS5hcHBlbmQoIiciKTsgLy8kTk9OLU5MUy0xJAotCQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0Ci0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCXN0ckJ1ZgotCQkJCQkJCS5hcHBlbmQoIiBpbiAnIikuYXBwZW5kKGJhc2VQbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIicpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlsYWJlbCA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgY29udGVudAotCSAqIAotCSAqIEBwYXJhbSB0b29sa2l0Ci0JICogICAgICAgICAgICBUaGUgZm9ybSB0b29sa2l0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQljcmVhdGVGb3JtQ29tcG9zaXRlcyh0b29sa2l0KTsKLQkJbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkvLyBDcmVhdGUgdGhlIEdlbmVyYWwgc2VjdGlvbi4KLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKHRvb2xraXQpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBEZXRhaWwgc2VjdGlvbi4KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJY3JlYXRlRGV0YWlsU2VjdGlvbih0b29sa2l0KTsKLQkJCVNFQ1RJT05TKys7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIE5vdGF0aW9uIHNlY3Rpb24uCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJY3JlYXRlTm90YXRpb25TZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgVGFpbG9yaW5nIFNlY3Rpb24uCi0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVRhaWxvcmluZ1NlY3Rpb24odG9vbGtpdCk7Ci0JCQlTRUNUSU9OUysrOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBWZXJzaW9uIHNlY3Rpb24uCi0JCWlmICh2ZXJzaW9uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVWZXJzaW9uU2VjdGlvbih0b29sa2l0KTsKLQkJCWNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCQlTRUNUSU9OUysrOwotCQl9CQkKLQkJCi0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJY3JlYXRlVmFyaWFiaWxpdHlTZWN0aW9uKHRvb2xraXQpOwotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmFyaWFiaWxpdHlDb21wb3NpdGUpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIHRoZSBTbG90IFNlY3Rpb24KLQkJaWYgKHNsb3RTZWN0aW9uT24pIHsKLQkJCWNyZWF0ZVNsb3RTZWN0aW9uKHRvb2xraXQpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0KLQkJLy8gSWNvbiBTZWN0aW9uCi0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQljcmVhdGVJY29uU2VjdGlvbih0b29sa2l0KTsKLQkJCWNyZWF0ZUljb25TZWN0aW9uQ29udGVudCgpOwotCQkJU0VDVElPTlMrKzsKLQkJfQotCi0JCWlmIChleHBhbmRlZENvbXBvc2l0ZSAhPSBudWxsKQotCQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JtQ29tcG9zaXRlcyhGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIENyZWF0ZSB0aGUgbWFpbiBzZWN0aW9uICh1c2VkIGZvciBzd2FwcGluZyBkaXNwbGF5IG9mCi0JCS8vIHNlY3Rpb25Db21wb3NpdGUgYW5kIGV4cGFuZGVkQ29tcG9zaXRlKS4KLQkJZm9ybVNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksIFNlY3Rpb24uTk9fVElUTEUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZm9ybVNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJfQotCi0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCW1haW5Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCUZvcm1MYXlvdXQgbGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCW1haW5Db21wb3NpdGUuc2V0TGF5b3V0KCBsYXlvdXQpOwotCQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KG1haW5Db21wb3NpdGUpOwotCQl9Ci0JCQotCQotCQkvLyBjaGVjayBmb3IgZXh0ZW5zdGlvbiBwb2ludCBhbmQgYWRkIHRoZSBwYWdlIGlmIHRoZXJlCi0JCUxpc3Q8Pz4gY29sdW1uUHJvdmlkZXJzID0gRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDb2x1bW5Qcm92aWRlcnMoKTsKLQotCQlpZiAoY29sdW1uUHJvdmlkZXJzID09IG51bGwgfHwgY29sdW1uUHJvdmlkZXJzLnNpemUoKSA9PSAwKSB7Ci0JCQljcmVhdGVTZWN0aW9uQ29tcG9zaXRlKG1haW5Db21wb3NpdGUsIDAsIDEwMCk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUNvbHVtbkVsZW1lbnQgY29sdW1uID0gKENvbHVtbkVsZW1lbnQpIGNvbHVtblByb3ZpZGVycy5nZXQoaSk7Ci0JCQkJCU9iamVjdCBwcm92aWRlckNsYXNzID0gY29sdW1uLmdldENvbnRyaWJ1dG9yQ2xhc3MoKTsKLQkJCQkJaW50IHdpZHRoID0gY29sdW1uLmdldFdpZHRoKCk7Ci0JCQkJCVN0cmluZyBhbGlnbm1lbnQgPSBjb2x1bW4uZ2V0QWxpZ25tZW50KCk7Ci0JCQkJCQotCQkJCQlpZiAocHJvdmlkZXJDbGFzcyBpbnN0YW5jZW9mIElDb2x1bW5Qcm92aWRlcikgewotCQkJCQkJY29sdW1uUHJvdmlkZXIgPSAoSUNvbHVtblByb3ZpZGVyKSBwcm92aWRlckNsYXNzOwotCQkJCQkJCi0JCQkJCQlpZiAoYWxpZ25tZW50LmVxdWFscygibGVmdCIpKSB7Ci0JCQkJCQkJY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCB3aWR0aCwKLQkJCQkJCQkJCTEwMCk7Ci0KLQkJCQkJCQlDb21wb3NpdGUgY29sdW1uQ29tcG9zaXRlID0gY29sdW1uUHJvdmlkZXIKLQkJCQkJCQkJCS5zZXRDb2x1bW4oKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpLCB0b29sa2l0LCBtYWluQ29tcG9zaXRlKTsKLQkJCQkJCQl7CQkJCQkJCQotCQkJCQkJCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQkJCQkJCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQkJCQkJCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQkJCQkJCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUpOwotCQkJCQkJCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KAotCQkJCQkJCQkJCXNlY3Rpb25Db21wb3NpdGUsIDApOwotCQkJCQkJCQljb2x1bW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmIChhbGlnbm1lbnQuZXF1YWxzKCJyaWdodCIpKSB7Ci0JCQkJCQkJY3JlYXRlU2VjdGlvbkNvbXBvc2l0ZShtYWluQ29tcG9zaXRlLCAwLAotCQkJCQkJCQkJMTAwIC0gd2lkdGgpOwotCi0JCQkJCQkJQ29tcG9zaXRlIGNvbHVtbkNvbXBvc2l0ZSA9IGNvbHVtblByb3ZpZGVyCi0JCQkJCQkJCQkuc2V0Q29sdW1uKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSwgdG9vbGtpdCwgbWFpbkNvbXBvc2l0ZSk7Ci0JCQkJCQkJewkKLQkJCQkJCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJCQkJCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCQkJCQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KAotCQkJCQkJCQkJCXNlY3Rpb25Db21wb3NpdGUsIDUpOwotCQkJCQkJCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCQkJCQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJCQkJCQljb2x1bW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCQkJCQkJY29sdW1uQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgZm9yIHRoZSBSaWNoVGV4dEVkaXRvci4KLQkJZXhwYW5kZWRDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQl7Ci0JCQlUYWJsZVdyYXBEYXRhIHRkID0gbmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0KLQkJLy8gQWRkIHRoZSBleHBhbmQvY29sbGFwc2UgaHlwZXJsaW5rIGltYWdlLgotCQlleHBhbmRMaW5rID0gdG9vbGtpdC5jcmVhdGVJbWFnZUh5cGVybGluayhleHBhbmRlZENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlleHBhbmRMaW5rLnNldEltYWdlKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCk7Ci0JCWV4cGFuZExpbmsuc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2xvc2VSVEUpOwotCQlleHBhbmRMaW5rLnNldFVuZGVybGluZWQoZmFsc2UpOwotCQlleHBhbmRMaW5rLmFkZEh5cGVybGlua0xpc3RlbmVyKG5ldyBIeXBlcmxpbmtBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChIeXBlcmxpbmtFdmVudCBlKSB7Ci0JCQkJdG9nZ2xlKGUpOwotCQkJfQotCQl9KTsKLQotCQkvLyBBZGQgdGhlIGV4cGFuZC9jb2xsYXBzZSBoeXBlcmxpbmsgdGV4dC4KLQkJZXhwYW5kTGFiZWwgPSBjcmVhdGVEZWNvcmF0ZWRMYWJlbCh0b29sa2l0LCBleHBhbmRlZENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBFUEYgTWFpbiBzZWN0aW9uIGNvbXBvc2l0ZSB3aGVyZSBhbGwgZ2VuZXJhbCwgZGV0YWlsIHNlY3Rpb24gcmVzaWRlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWN0aW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBsZWZ0TWFyZ2luLAotCQkJaW50IHJpZ2h0TWFyZ2luKSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJewotCQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGVmdE1hcmdpbiwgMCk7Ci0JCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01KTsKLQkJCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmlnaHRNYXJnaW4sIC01KTsKLQkJCXNlY3Rpb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBHZW5lcmFsIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlnZW5lcmFsU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXRHZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQlnZW5lcmFsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxTZWN0aW9uKTsKLQkJKChHcmlkTGF5b3V0KSBnZW5lcmFsQ29tcG9zaXRlLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gNDsKLQkJY3JlYXRlR2VuZXJhbFNlY3Rpb25Db250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2VuZXJhbCBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb25Db250ZW50KCkgewotCQkvLyBBZGQgdGhlIE5hbWUgbGFiZWwgYW5kIHRleHQgY29udHJvbC4KLQkJY3RybF9uYW1lID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwzKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0Lk5BTUVfVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUpOwotCi0JCS8vIEFkZCB0aGUgUHJlc2VudGF0aW9uIG5hbWUgbGFiZWwgYW5kIHRleHQgY29udHJvbC4KLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZSA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5QUkVTRU5UQVRJT05fTkFNRV9URVhULAotCQkJCVNXVC5ERUZBVUxULCBTV1QuU0lOR0xFKTsKLQotCQlpZiAoZWxlbWVudFR5cGVPbikgewotCQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlRZUEVfVEVYVCwgMik7Ci0JCQljdHJsX3R5cGVfbGFiZWwgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCQljdHJsX3R5cGVfbGFiZWwuc2V0QmFja2dyb3VuZChEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkJLmdldFN5c3RlbUNvbG9yKDE5KSk7Ci0JCQkJY3RybF90eXBlX2xhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWN0cmxfdHlwZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihnZW5lcmFsQ29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9UWVBFX0JVVFRPTl9URVhULCBTV1QuUFVTSCk7Ci0JCQkJewotCQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQkJCWN0cmxfdHlwZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkJfQotCQkJCWlmIChDb252ZXJ0R3VpZGFuY2VUeXBlCi0JCQkJCQkuZ2V0VmFsaWROZXdHdWlkYW5jZVR5cGVzKChHdWlkYW5jZSkgbWV0aG9kRWxlbWVudCkgPT0gbnVsbCkgewotCQkJCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDModG9vbGtpdCwKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlVOSVFVRV9JRF9URVhULAotCQkJCQlTV1QuREVGQVVMVCwgU1dULlNJTkdMRSk7Ci0JCX0KLQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCWN0cmxfYnJpZWZfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMyh0b29sa2l0LAotCQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkJNDAsIFNXVC5NVUxUSSB8IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JCX0JCQotCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uID0gdG9vbGtpdAotCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LlBVQkxJU0hfQ0FURUdPUklFU19URVhULCBTV1QuQ0hFQ0spOyAKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmFyaWFiaWxpdHlTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WQVJJQUJJTElUWV9TRUNUSU9OX05BTUUsCi0JCQkJZ2V0VmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCQotCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZhcmlhYmlsaXR5U2VjdGlvbik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl2YXJpYWJpbGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uLnNldENsaWVudCh2YXJpYWJpbGl0eUNvbXBvc2l0ZSk7Ci0KLQkJY3RybF92YXJpYWJpbGl0eSA9IGNyZWF0ZUNvbWJvV2l0aExhYmVsMyh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfVFlQRV9URVhUKTsKLQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkgPSBuZXcgQ29tYm9WaWV3ZXIoY3RybF92YXJpYWJpbGl0eSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMjQ7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCQl2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclZhcmlhYmlsaXR5KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlclZhcmlhYmlsaXR5KTsKLQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldElucHV0KG1ldGhvZEVsZW1lbnQpOwotCi0JCXRvb2xraXQuY3JlYXRlTGFiZWwodmFyaWFiaWxpdHlDb21wb3NpdGUsICIiLCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvL1N0cmluZyBiYXNlRWxlbWVudCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0TG93ZXIobWV0aG9kRWxlbWVudCk7Ci0JCWxhYmVsX2Jhc2UgPSBjcmVhdGVMYWJlbCh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQsIDIpOwotCQljdHJsX2Jhc2UgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwgU1dULlNJTkdMRQotCQkJCXwgU1dULlJFQURfT05MWSwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuQkVHSU5OSU5HLCA1LCAzMDAsIDEsIDIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI0OwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJY3RybF9iYXNlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJYmFzZV92aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9iYXNlKTsKLQkJaW5pdENvbnRlbnRQcm92aWRlckJhc2UoKTsKLQkJYmFzZV92aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyQmFzZSk7Ci0JCWJhc2Vfdmlld2VyLnNldElucHV0KG1ldGhvZEVsZW1lbnQpOwotCi0JCUNvbXBvc2l0ZSBiYXNlQnV0dG9uUGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2YXJpYWJpbGl0eUNvbXBvc2l0ZSwgCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HLCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJCWJhc2VCdXR0b25QYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWN0cmxfYmFzZV9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihiYXNlQnV0dG9uUGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IEJVVFRPTl9XSURUSDsKLQkJCWN0cmxfYmFzZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBTZXQgZm9jdXMgb24gdGhlIE5hbWUgdGV4dCBjb250cm9sLgotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJCi0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQlpZiAobWV0aG9kVW5pdCAhPSBudWxsICYmIG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwpCi0JCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWN0cmxfbmFtZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCi0JCWlmIChicmllZkRlc2NPbikgewotCQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAocHVycG9zZU9uKSB7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChmdWxsRGVzY09uKSB7Ci0JCQljdHJsX2Z1bGxfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJY3RybF9rZXkuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChleHRlcm5hbElkT24pIHsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChlbGVtZW50VHlwZU9uKSB7Ci0JCQljdHJsX3R5cGVfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9Ci0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJY3RybF92YXJpYWJpbGl0eS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5LmdldFNlbGVjdGlvbigpKQotCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkgPT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQljdHJsX2NoYW5nZV9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWN0cmxfYXV0aG9ycy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQljdHJsX3ZlcnNpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY29weXJpZ2h0X2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCXNldENvcHlyaWdodEJ1dHRvbkRlc2VsZWN0KCk7Ci0JCX0KLQkJaWYgKGljb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZQotCQkJCQkmJiBjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKSAhPSBudWxsKTsKLQkJCWN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUKLQkJCQkJJiYgY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSAhPSBudWxsKTsKLQkJfQotCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQkKLQkJaWYgKHB1Ymxpc2hDYXRlZ29yeU9uKSB7Ci0JCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCX0KLQkJCi0JCWlmIChjb2x1bW5Qcm92aWRlciAhPSBudWxsKQotCQkJY29sdW1uUHJvdmlkZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBEZXRhaWwgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJZGV0YWlsU2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fTkFNRSwKLQkJCQlnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWRldGFpbENvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBkZXRhaWxTZWN0aW9uKTsKLQkJY3JlYXRlRGV0YWlsU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZGV0YWlsQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEZXRhaWwgc2VjdGlvbiBjb250ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxTZWN0aW9uQ29udGVudCgpIHsKLQkJaWYgKHB1cnBvc2VPbikgewotCQkJY3RybF9wdXJwb3NlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBVUlBPU0VfVEVYVCwgNDAsIDQwMCwKLQkJCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQl9Ci0KLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCWN0cmxfZnVsbF9kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk1BSU5fREVTQ1JJUFRJT05fVEVYVCwKLQkJCQkJMTAwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQl9Ci0KLQkJaWYgKGtleUNvbnNpZGVyYXRpb25PbikgewotCQkJY3RybF9rZXkgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuS0VZX0NPTlNJREVSQVRJT05TX1RFWFQsCi0JCQkJCTQwLCA0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5vdGF0aW9uIHNlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJbm90YXRpb25TZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OT1RBVElPTl9TRUNUSU9OX05BTUUsCi0JCQkJZ2V0Tm90YXRpb25TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCW5vdGF0aW9uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIG5vdGF0aW9uU2VjdGlvbik7Ci0JCWNyZWF0ZU5vdGF0aW9uU2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Iobm90YXRpb25Db21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5vdGF0aW9uIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFRhaWxvcmluZyBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhaWxvcmluZ1NlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl0YWlsb3JpbmdTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9OQU1FLAotCQkJCWdldFRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbigpKTsKLQkJdGFpbG9yaW5nQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHRhaWxvcmluZ1NlY3Rpb24pOwotCQljcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcih0YWlsb3JpbmdDb21wb3NpdGUpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKSB7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNsb3Qgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTbG90U2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzIHRvIG1vbml0b3IgZm9jdXMgYW5kIG1vZGlmaWNhdGlvbiBjaGFuZ2VzIGluIHRoZSBlZGl0Ci0JICogY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQltb2RlbE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKG1ldGhvZEVsZW1lbnQpOwotCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIobWV0aG9kVW5pdCk7Ci0JCWFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQotCQkKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJZm9ybS5nZXRQYXJlbnQoKS5hZGRMaXN0ZW5lcihTV1QuQWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYoZGlzcG9zZWQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQlyZWZyZXNoKCFUbmdVdGlsLmlzTG9ja2VkKG1ldGhvZEVsZW1lbnQpKTsKLQkJCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJCQkKLQkJCQkvLyBkbyByZWZyZXNoIHZhcmlhYmlsaXR5IGFuZCBjb3B5cmlnaHQgdmlld2VyCi0JCQkJaWYodmFyaWFiaWxpdHlTZWN0aW9uT24pCi0JCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQlpZih2ZXJzaW9uU2VjdGlvbk9uKQotCQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWFkZEdlbmVyYWxTZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQlhZGREZXRhaWxTZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCX0KLQotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJYWRkVmVyc2lvblNlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJfQotCi0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQlhZGRJY29uU2VjdGlvbkxpc3RlbmVycygpOwotCQl9Ci0KLQkJaWYgKHZhcmlhYmlsaXR5U2VjdGlvbk9uKSB7Ci0JCQl2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfdmFyaWFiaWxpdHkKLQkJCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkKLQkJCQkJCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBlZGl0b3IKLQkJCQkJCQkJCQkuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJCQkJCQkJCQkoVmFyaWFiaWxpdHlUeXBlKSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpLCAtMSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTkEpIHsKLQkJCQkJCQkJaWYgKGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkJCQkuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJCQkJbnVsbCwgLTEpOwotCQkJCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9iYXNlX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCQkJYmFzZV92aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCUxpc3Qgc2VsZWN0aW9uQmFzZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCQlzZWxlY3Rpb25CYXNlTGlzdC5hZGQoYmFzZSk7Ci0JCQkJCQkJCWN0cmxfYmFzZV9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQkJYmFzZV92aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCX0KLQkJCQkJCQlzZXRGb3JtVGV4dFdpdGhWYXJpYWJsZUluZm8oKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBJQ29sdW1uUHJvdmlkZXIKLQkJCQkJCQlpZiAoY29sdW1uUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJCQljb2x1bW5Qcm92aWRlci5yZWZyZXNoKGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQotCQkJY3RybF9iYXNlX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJCQkJCUxpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQsIHRydWUpKTsKLQkJCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUoTGlicmFyeVVJVGV4dC5nZXRVSVRleHQobWV0aG9kRWxlbWVudCwgdHJ1ZSkpOwotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJCQkJaWYgKGZkLmdldFNlbGVjdGVkSXRlbXMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJSVN0YXR1cyBpc3RhdHVzID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbigKLQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LCAoVmFyaWFiaWxpdHlFbGVtZW50KSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuZ2V0KDApKTsKLQkJCQkJCQlpZighaXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIGlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsJCQkJCQkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCQlib29sZWFuIHN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIGZkCi0JCQkJCQkJCQkJCQkJLmdldFNlbGVjdGVkSXRlbXMoKS5nZXQoMCksIC0xKTsKLQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJCXN0YXR1cyA9IGVkaXRvcgotCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkJCQkJCQkJKFZhcmlhYmlsaXR5VHlwZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKQotCQkJCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJCQkvLyBJQ29sdW1uUHJvdmlkZXIKLQkJCQkJaWYgKGNvbHVtblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCWNvbHVtblByb3ZpZGVyLnJlZnJlc2goZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWlmICgoY3RybF9iYXNlICE9IG51bGwpICYmICghKGN0cmxfYmFzZS5pc0Rpc3Bvc2VkKCkpKSkKLQkJCQkJCWN0cmxfYmFzZS5yZWRyYXcoKTsKLQkJCQkJaWYgKChiYXNlX3ZpZXdlciAhPSBudWxsKQotCQkJCQkJCSYmICghKGJhc2Vfdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpKSkKLQkJCQkJCWJhc2Vfdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRHZW5lcmFsU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuYW1lRm9jdXNMaXN0ZW5lcik7Ci0KLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RFbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoY3RybF9wcmVzZW50YXRpb25fbmFtZQotCQkJCQkJLmdldFRleHQoKSk7CQkJCQotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQltZXRob2RFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uIHdoZW4gdGhlIGZvY3VzIG9mIHRoZSBjb21wb25lbnQgaXMgbG9zdCAKLQkJCQlpZihjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKXsKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5jbGVhclNlbGVjdGlvbigpOwotCQkJCX0gICAgCi0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNHYWluZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCS8vIHdoZW4gdXNlciB0YWIgdG8gdGhpcyBmaWVsZCwgc2VsZWN0IGFsbCB0ZXh0Ci0JCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZWxlY3RBbGwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGJyaWVmRGVzY09uKSB7Ci0JCQljdHJsX2JyaWVmX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2JyaWVmX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCi0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXIjZm9jdXNMb3N0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kRWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9icmllZl9kZXNjLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudFR5cGVPbikgewotCQkJaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCWN0cmxfdHlwZV9idXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0JCQkJCQlpZiAoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlOyAKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UxOyAKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24oKTsKLQkJCQkJCQlkZWxldGVBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihMaWJyYXJ5Vmlldy5nZXRWaWV3KCkKLQkJCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQkJCQkJCWRlbGV0ZUFjdGlvbgotCQkJCQkJCQkJLnNlbGVjdGlvbkNoYW5nZWQobmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQpKTsKLQkJCQkJCQlDb21tYW5kIGNtZCA9IGRlbGV0ZUFjdGlvbgotCQkJCQkJCQkJLmNyZWF0ZUNvbW1hbmQoQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkJLnNpbmdsZXRvbihtZXRob2RFbGVtZW50KSk7Ci0JCQkJCQkJaWYgKGNtZCBpbnN0YW5jZW9mIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSB7Ci0JCQkJCQkJCUd1aWRhbmNlIG5ld0d1aWRhbmNlOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbmV3R3VpZGFuY2UgPSBDb252ZXJ0R3VpZGFuY2VUeXBlCi0JCQkJCQkJCQkJLmNvbnZlcnRHdWlkYW5jZSgKLQkJCQkJCQkJCQkJCShHdWlkYW5jZSkgbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJCQkJCW51bGwsCi0JCQkJCQkJCQkJCQkoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIGNtZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQl0cnkgeyBjbWQuZGlzcG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChuZXdHdWlkYW5jZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VFZGl0b3IoCi0JCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCQkJCQkJCW5ld0d1aWRhbmNlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX3RpdGxlOyAKLQkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uVGFiR3VpZGFuY2VXYXJuaW5nRGlhbG9nX21lc3NhZ2UyOyAKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHB1Ymxpc2hDYXRlZ29yeU9uKQl7Ci0JCQljdHJsX3B1Ymxpc2hfY2F0ZWdvcmllc19idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CQkJCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewkJCQkKLQkJCQkJU3RyaW5nIHZhbCA9IG5ldyBCb29sZWFuKGN0cmxfcHVibGlzaF9jYXRlZ29yaWVzX2J1dHRvbi5nZXRTZWxlY3Rpb24oKSkudG9TdHJpbmcoKTsJCQkJCi0JCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVG5nVXRpbC5nZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShtZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJCQkKLQkJCQkJaWYgKHByb3AgPT0gbnVsbCkgewkJCQotCQkJCQkJcHJvcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQkJCQkJcHJvcC5zZXROYW1lKFRuZ1V0aWwuUFVCTElTSF9DQVRFR09SWV9QUk9QRVJUWSk7Ci0JCQkJCQlwcm9wLnNldFZhbHVlKHZhbCk7Ci0JCQkJCQkJCQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwKLQkJCQkJCQkJcHJvcCwgLTEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwcm9wLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJCQkJdmFsLCAtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldE5hbWVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREZXRhaWxTZWN0aW9uTGlzdGVuZXJzKCkgewotCQlpZiAoZnVsbERlc2NPbikgewotCQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJY3RybF9mdWxsX2Rlc2MuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfZnVsbF9kZXNjLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9mdWxsX2Rlc2M7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRyb2w9IiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogY29udGVudCBub3QgbW9kaWZpZWQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IHJlc3RvcmVkIG9sZCBjb250ZW50LCBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2Z1bGxfZGVzYy5kZWFjdGl2YXRlTGlzdGVuZXI6IHNhdmluZyBtb2RpZmllZCBjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogc2F2ZWQgc3RhdHVzPSIgKyBzdWNjZXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfZnVsbF9kZXNjLmRlYWN0aXZhdGVMaXN0ZW5lcjogZXhpdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWlmIChrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJCWN0cmxfa2V5LnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfa2V5LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQkJY3RybF9rZXkuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCWN0cmxfa2V5LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCTogY3RybF9rZXk7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRGVzY3JpcHRpb25Gb3JtUGFnZS5jdHJsX2tleS5kZWFjdGl2YXRlTGlzdGVuZXI6IGNvbnRyb2w9IiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogY29udGVudCBub3QgbW9kaWZpZWQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCJEZXNjcmlwdGlvbkZvcm1QYWdlLmN0cmxfa2V5LmRlYWN0aXZhdGVMaXN0ZW5lcjogcmVzdG9yZWQgb2xkIGNvbnRlbnQsIGV4aXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksCi0JCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBzYXZlZCBzdGF0dXM9IiArIHN1Y2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkRlc2NyaXB0aW9uRm9ybVBhZ2UuY3RybF9rZXkuZGVhY3RpdmF0ZUxpc3RlbmVyOiBleGl0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2xzIHdpdGggZGF0YSBmcm9tIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGF0YSgpIHsKLQkJaWYgKGdlbmVyYWxTZWN0aW9uT24pIHsKLQkJCWxvYWRHZW5lcmFsU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAoZGV0YWlsU2VjdGlvbk9uKSB7Ci0JCQlsb2FkRGV0YWlsU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWxvYWROb3RhdGlvblNlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJbG9hZFRhaWxvcmluZ1NlY3Rpb25EYXRhKCk7Ci0JCX0KLQkJaWYgKHZlcnNpb25TZWN0aW9uT24pIHsKLQkJCWxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKTsKLQkJfQotCQlpZiAoaWNvblNlY3Rpb25PbikgewotCQkJbG9hZEljb25TZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWlmICh2YXJpYWJpbGl0eVNlY3Rpb25PbikgewotCQkJdmFyaWFiaWxpdHlTZWN0aW9uRGF0YSgpOwotCQl9Ci0JCWZvcm0uZ2V0Qm9keSgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZEdlbmVyYWxTZWN0aW9uRGF0YSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBtZXRob2RFbGVtZW50LmdldE5hbWUoKTsKLQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSAobWV0aG9kRWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQljdHJsX25hbWUuc2V0VGV4dChuYW1lID09IG51bGwgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUKLQkJCQkuc2V0VGV4dChwcmVzZW50YXRpb25OYW1lID09IG51bGwgPyAiIiA6IHByZXNlbnRhdGlvbk5hbWUpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVsZW1lbnRUeXBlT24pIHsKLQkJCS8vIFN0cmluZyB0eXBlID0gbWV0aG9kRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHR5cGUgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dChtZXRob2RFbGVtZW50KTsKLQkJCWN0cmxfdHlwZV9sYWJlbC5zZXRUZXh0KHR5cGUgPT0gbnVsbCA/ICIiIDogdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoYnJpZWZEZXNjT24pIHsKLQkJCVN0cmluZyBicmllZl9kZXNjID0gbWV0aG9kRWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChicmllZl9kZXNjID09IG51bGwgPyAiIiA6IGJyaWVmX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWlmIChwdWJsaXNoQ2F0ZWdvcnlPbikgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBUbmdVdGlsLmdldFB1Ymxpc2hDYXRlZ29yeVByb3BlcnR5KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCVN0cmluZyB2YWwgPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQkJY3RybF9wdWJsaXNoX2NhdGVnb3JpZXNfYnV0dG9uLnNldFNlbGVjdGlvbigobmV3IEJvb2xlYW4odmFsKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWREZXRhaWxTZWN0aW9uRGF0YSgpIHsKLQkJaWYgKGZ1bGxEZXNjT24pIHsKLQkJCVN0cmluZyBmdWxsX2Rlc2MgPSAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldFRleHQoZnVsbF9kZXNjID09IG51bGwgPyAiIiA6IGZ1bGxfZGVzYyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoa2V5Q29uc2lkZXJhdGlvbk9uKSB7Ci0JCQlTdHJpbmcga2V5Q29uc2lkZXJhdGlvbnMgPSAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJY3RybF9rZXkKLQkJCQkJLnNldFRleHQoa2V5Q29uc2lkZXJhdGlvbnMgPT0gbnVsbCA/ICIiIDoga2V5Q29uc2lkZXJhdGlvbnMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JCi0KLQlwcml2YXRlIHZvaWQgbG9hZFRhaWxvcmluZ1NlY3Rpb25EYXRhKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkTm90YXRpb25TZWN0aW9uRGF0YSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFyaWFiaWxpdHlTZWN0aW9uRGF0YSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGNvbnRlbnRFbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQlMaXN0IHNlbGVjdGlvblZhcmlhYmlsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2VsZWN0aW9uVmFyaWFiaWxpdHlMaXN0LmFkZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCXNlbGVjdGlvblZhcmlhYmlsaXR5TGlzdCk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24obmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3RybF9leHBhbmRlZCA9PSBudWxsKSB7Ci0JCQljdHJsX2V4cGFuZGVkID0gY3JlYXRlUmljaFRleHRFZGl0b3IodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCVNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJCWdldFJpY2hUZXh0RWRpdG9ySGVpZ2h0KCksIGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSwgMiwKLQkJCQkJZXhwYW5kTGFiZWwpOwotCQkJY3RybF9leHBhbmRlZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGRlc2NFeHBhbmRGbGFnKSB7Ci0JCQlleHBhbmRlZENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCW1haW5Db21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChtYWluQ29tcG9zaXRlKTsKLQkJCWVuYWJsZVNlY3Rpb25zKHRydWUpOwotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gZ2V0QWN0aXZlUmljaFRleHRDb250cm9sKCk7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQkJCXJpY2hUZXh0LnNldEZpbmRSZXBsYWNlQWN0aW9uKGN0cmxfZXhwYW5kZWQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5zZXRNb2RhbE9iamVjdChudWxsKTsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKG51bGwpOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQltYWluQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWZvcm1TZWN0aW9uLnNldENsaWVudChleHBhbmRlZENvbXBvc2l0ZSk7Ci0JCQllbmFibGVTZWN0aW9ucyhmYWxzZSk7Ci0JCQlleHBhbmRMYWJlbC5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpCi0JCQkJCS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0ID0gKElNZXRob2RSaWNoVGV4dCkgZS5nZXRIcmVmKCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEluaXRpYWxUZXh0KHJpY2hUZXh0LmdldFRleHQoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUocmljaFRleHQKLQkJCQkJLmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0RmluZFJlcGxhY2VBY3Rpb24ocmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLmFkZExpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJYm9vbGVhbiBlZGl0YWJsZSA9ICFUbmdVdGlsLmlzTG9ja2VkKG1ldGhvZEVsZW1lbnQpOwotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQlpZiAoZWRpdGFibGUpIHsKLQkJCQljdHJsX2V4cGFuZGVkLnNldEZvY3VzKCk7Ci0JCQl9Ci0JCQlzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2wocmljaFRleHQpOwotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dClpbnB1dCkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0LmdldE1vZGFsT2JqZWN0RmVhdHVyZSgpKTsKLQkJCX0KLQkJfQotCQlmb3JtLmdldEJvZHkoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCWRlc2NFeHBhbmRGbGFnID0gIWRlc2NFeHBhbmRGbGFnOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY3RpdmVSaWNoVGV4dENvbnRyb2woSU1ldGhvZFJpY2hUZXh0IGN0cmwpIHsKLQkJYWN0aXZlQ29udHJvbCA9IGN0cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0aXZlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjT24oYm9vbGVhbiBicmllZkRlc2NPbikgewotCQl0aGlzLmJyaWVmRGVzY09uID0gYnJpZWZEZXNjT247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnVsbERlc2NPbihib29sZWFuIGZ1bGxEZXNjT24pIHsKLQkJdGhpcy5mdWxsRGVzY09uID0gZnVsbERlc2NPbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRLZXlDb25zaWRlcmF0aW9uT24oYm9vbGVhbiBrZXlDb25zaWRlcmF0aW9uT24pIHsKLQkJdGhpcy5rZXlDb25zaWRlcmF0aW9uT24gPSBrZXlDb25zaWRlcmF0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRUeXBlT24KLQkgKiAgICAgICAgICAgIFRoZSBlbGVtZW50VHlwZU9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50VHlwZU9uKGJvb2xlYW4gZWxlbWVudFR5cGVPbikgewotCQl0aGlzLmVsZW1lbnRUeXBlT24gPSBlbGVtZW50VHlwZU9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgYW55QXR0cmlidXRlTW9kaWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbnlBdHRyaWJ1dGVNb2RpZmllZCgpIHsKLQkJcmV0dXJuIGFueUF0dHJpYnV0ZU1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGlzIGlmIGFueSBhdHRyaWJ1dGUgaXMgbW9kaWZpZWQuIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBjaGFuZ2UKLQkgKiBkYXRlIGZpZWxkIGluIHZlcnNpb24gc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYW55QXR0cmlidXRlTW9kaWZpZWQKLQkgKiAgICAgICAgICAgIFRoZSBhbnlBdHRyaWJ1dGVNb2RpZmllZCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW55QXR0cmlidXRlTW9kaWZpZWQoYm9vbGVhbiBhbnlBdHRyaWJ1dGVNb2RpZmllZCkgewotCQl0aGlzLmFueUF0dHJpYnV0ZU1vZGlmaWVkID0gYW55QXR0cmlidXRlTW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2ZXJzaW9uU2VjdGlvbk9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmVyc2lvblNlY3Rpb25PbigpIHsKLQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZlcnNpb25TZWN0aW9uT24KLQkgKiAgICAgICAgICAgIFRoZSB2ZXJzaW9uU2VjdGlvbk9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uU2VjdGlvbk9uKGJvb2xlYW4gdmVyc2lvblNlY3Rpb25PbikgewotCQl0aGlzLnZlcnNpb25TZWN0aW9uT24gPSB2ZXJzaW9uU2VjdGlvbk9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIFZlcnNpb24gSW5mb3JtYXRpb24gc2VjdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQl2ZXJzaW9uU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXZlcnNpb25TZWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fSU5GT19TRUNUSU9OX05BTUUpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXREZXNjcmlwdGlvbihnZXRWZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uKCkpOwotCQl2ZXJzaW9uU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdmVyc2lvbkNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHZlcnNpb25TZWN0aW9uKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdmVyc2lvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpKTsKLQkJdmVyc2lvblNlY3Rpb24uc2V0Q2xpZW50KHZlcnNpb25Db21wb3NpdGUpOwotCX0KLQkKLQkKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgVmVyc2lvbiBzZWN0aW9uIGNvbnRlbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVmVyc2lvblNlY3Rpb25Db250ZW50KCkgewotCQlTdHJpbmcgZmlsbFRleHQgPSAobWV0aG9kVW5pdC5nZXRWZXJzaW9uKCkgPT0gbnVsbCA/ICIiIDogbWV0aG9kVW5pdC5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbiA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNCh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX1RFWFQsIFNXVC5ERUZBVUxULCBTV1QuU0lOR0xFLCBmaWxsVGV4dCk7Ci0KLQkJZmlsbFRleHQgPSBtZXRob2RVbml0LmdldENoYW5nZURhdGUoKSA9PSBudWxsID8gIiIgLy8kTk9OLU5MUy0xJAotCQkJCTogRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoRGF0ZUZvcm1hdC5GVUxMKS5mb3JtYXQoCi0JCQkJCQltZXRob2RVbml0LmdldENoYW5nZURhdGUoKSk7Ci0JCWN0cmxfY2hhbmdlX2RhdGUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbDQodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX0RBVEVfVEVYVCwgU1dULkRFRkFVTFQsIFNXVC5TSU5HTEUsIGZpbGxUZXh0KTsKLQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsNSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5DSEFOR0VfREVTQ1JJUFRJT05fVEVYVCwgNDAsIFNXVC5NVUxUSSk7Ci0KLQkJY3RybF9hdXRob3JzID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWw1KHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCwgNDAsIFNXVC5NVUxUSSk7Ci0KLQkJbGFiZWxfY29weXJpZ2h0ID0gY3JlYXRlTGFiZWwodG9vbGtpdCwgdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ09QWVJJR0hUX1RFWFQsIDIpOwotCQljdHJsX2NvcHlyaWdodCA9IGNyZWF0ZVRhYmxlKHRvb2xraXQsIHZlcnNpb25Db21wb3NpdGUsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5SRUFEX09OTFksIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwsCi0JCQkJNSwgNDAwLCAxLCAyKTsKLQotCQljb3B5cmlnaHRfdmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfY29weXJpZ2h0KTsKLQkJaW5pdENvbnRlbnRQcm92aWRlckNvcHlyaWdodCgpOwotCQljb3B5cmlnaHRfdmlld2VyLnNldExhYmVsUHJvdmlkZXIoY29weXJpZ2h0TGFiZWxQcm92aWRlckJhc2UpOwotCQljb3B5cmlnaHRfdmlld2VyLnNldElucHV0KG1ldGhvZEVsZW1lbnQpOwotCQlDb21wb3NpdGUgYnV0dG9ucGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCB2ZXJzaW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJYnV0dG9ucGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0VMRUNUX0JVVFRPTl9URVhULCBTV1QuU0lNUExFKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gQlVUVE9OX1dJRFRIOwotCQkJY29weXJpZ2h0X2J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0ID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9ucGFuZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTRUxFQ1RfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBCVVRUT05fV0lEVEg7Ci0JCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQotCQkvLyBDcmVhdGUgdGhlIGV4cGFuZGVkIGNvbXBvc2l0ZS4KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodmVyc2lvbkNvbXBvc2l0ZSk7Ci0JCS8vdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoYnV0dG9ucGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJDb3B5cmlnaHQoKSB7Ci0JCWNvcHlyaWdodENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAobWV0aG9kVW5pdC5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCWxpc3QuYWRkKG1ldGhvZFVuaXQKLQkJCQkJCQkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJfQotCQl9OwotCQljb3B5cmlnaHRfdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb3B5cmlnaHRDb250ZW50UHJvdmlkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25TZWN0aW9uTGlzdGVuZXJzKCkgewotCQljdHJsX3ZlcnNpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF92ZXJzaW9uLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBtZXRob2RVbml0Ci0JCQkJCQkuZ2V0VmVyc2lvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsCi0JCQkJCQkuZ2V0UGxhaW5UZXh0KGN0cmxfdmVyc2lvbi5nZXRUZXh0KCkpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCW1ldGhvZFVuaXQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXV0aG9ycy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2F1dGhvcnMuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IG1ldGhvZFVuaXQKLQkJCQkJCS5nZXRBdXRob3JzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwKLQkJCQkJCS5nZXRQbGFpblRleHQoY3RybF9hdXRob3JzLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJbWV0aG9kVW5pdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY29weXJpZ2h0X2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUxpc3QgYWxyZWFkeUV4c3RpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGN0cmxfY29weXJpZ2h0LmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGN0cmxfY29weXJpZ2h0LmdldEl0ZW1zKClbMF07Ci0JCQkJCWlmIChpdGVtLmdldERhdGEoKSAhPSBudWxsKQotCQkJCQkJYWxyZWFkeUV4c3RpbmcuYWRkKGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlmaWx0ZXIsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQlGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIGFscmVhZHlFeHN0aW5nKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJZmQuZ2V0U2VsZWN0ZWRJdGVtcygpOwotCQkJCWlmIChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkuc2l6ZSgpID4gMCkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJbWV0aG9kVW5pdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLmdldCgwKSwKLQkJCQkJCQktMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29weXJpZ2h0X3ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2NoYW5nZV9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gbWV0aG9kVW5pdAotCQkJCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfY2hhbmdlX2Rlc2MuZ2V0VGV4dCgpOwotCQkJCW5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UoU3RyVXRpbC5MSU5FX0ZFRUQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIG1ldGhvZFVuaXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljb3B5cmlnaHRfYnV0dG9uX2Rlc2VsZWN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCW1ldGhvZFVuaXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLCBudWxsLCAtMSk7Ci0JCQkJaWYgKHN0YXR1cykgewotCQkJCQljb3B5cmlnaHRfdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogdXBkYXRlIHRoZSBjaGFuZ2UgZGF0ZSBpZiBhbnkgYXR0cmlidXRlIGlzIG1vZGlmaWVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNoYW5nZURhdGUoKSB7Ci0KLQkJRGF0ZSBjaGFuZ2VEYXRlID0gbWV0aG9kVW5pdC5nZXRDaGFuZ2VEYXRlKCk7Ci0JCURhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LkZVTEwpOwotCi0JCVN0cmluZyBvbGRDb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNoYW5nZURhdGUgIT0gbnVsbCkgewotCQkJb2xkQ29udGVudCA9IGRmLmZvcm1hdChjaGFuZ2VEYXRlKTsKLQkJfQotCi0JCURhdGUgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpOwotCQlTdHJpbmcgbmV3Q29udGVudCA9IGRmLmZvcm1hdChjdXJyZW50RGF0ZSk7Ci0JCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJbWV0aG9kVW5pdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCksIGN1cnJlbnREYXRlLCAtMSk7Ci0JCQlpZiAoIXN0YXR1cykgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9jaGFuZ2VfZGF0ZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFZlcnNpb25TZWN0aW9uRGF0YSgpIHsKLQotCQljdHJsX3ZlcnNpb24KLQkJCQkuc2V0VGV4dChtZXRob2RVbml0LmdldFZlcnNpb24oKSA9PSBudWxsID8gIiIgOiBtZXRob2RVbml0LmdldFZlcnNpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9hdXRob3JzCi0JCQkJLnNldFRleHQobWV0aG9kVW5pdC5nZXRBdXRob3JzKCkgPT0gbnVsbCA/ICIiIDogbWV0aG9kVW5pdC5nZXRBdXRob3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBjaGFuZ2VEZXNjID0gbWV0aG9kVW5pdC5nZXRDaGFuZ2VEZXNjcmlwdGlvbigpID09IG51bGwgPyAiIiA6IG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsgLy8kTk9OLU5MUy0xJAotCQljaGFuZ2VEZXNjID0gY2hhbmdlRGVzYy5yZXBsYWNlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNoYW5nZUhpc3RvcnlEaWFsb2dfZGVsaW1pdGVyLCBTdHJVdGlsLkxJTkVfRkVFRCk7Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dChjaGFuZ2VEZXNjKTsKLQkJY3RybF9jaGFuZ2VfZGF0ZQotCQkJCS5zZXRUZXh0KG1ldGhvZFVuaXQuZ2V0Q2hhbmdlRGF0ZSgpID09IG51bGwgPyAiIiAvLyROT04tTkxTLTEkCi0JCQkJCQk6IERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKERhdGVGb3JtYXQuRlVMTCkuZm9ybWF0KAotCQkJCQkJCQltZXRob2RVbml0LmdldENoYW5nZURhdGUoKSkpOwotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRvZ2dsZShIeXBlcmxpbmtFdmVudCBlLCBpbnQgaWQpIHsKLQkJLy8gVE9ETy0gd2Ugc2hvdWxkIGNvbWJpbmUgdGhlc2UgbWV0aG9kcyBpbnRvIG9uZS4gT25lIHdheSB0byBkbyBpdCwKLQkJLy8gZGlzcG9pbmcKLQkJLy8gY3RybF9leHBhbmRlZCBldmVyeSB0aW1lIGl0IGNvbGxhcHNlcyBhbmQgY3JlYXRpbmcgaXQgd2hlbiB3ZSBleHBhbmQuCi0JCS8vIEF0IHByZXNlbnQsIHRoZXJlIGlzIG5vIG1ldGhvZCB0byBkaXNwb3NlCi0JCXRvZ2dsZShlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGljb25TZWN0aW9uT24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJY29uU2VjdGlvbk9uKCkgewotCQlyZXR1cm4gaWNvblNlY3Rpb25PbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWNvblNlY3Rpb25PbgotCSAqICAgICAgICAgICAgVGhlIGljb25TZWN0aW9uT24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb25TZWN0aW9uT24oYm9vbGVhbiBpY29uU2VjdGlvbk9uKSB7Ci0JCXRoaXMuaWNvblNlY3Rpb25PbiA9IGljb25TZWN0aW9uT247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgSWNvbiBzZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUljb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJaWNvblNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCUdyaWREYXRhIHRkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWljb25TZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlpY29uU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5JQ09OX1NFQ1RJT05fTkFNRSk7Ci0JCWljb25TZWN0aW9uLnNldERlc2NyaXB0aW9uKGdldEljb25TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWljb25TZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlpY29uQ29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoaWNvblNlY3Rpb24pOwotCQlpY29uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlpY29uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCB0cnVlKSk7Ci0JCWljb25TZWN0aW9uLnNldENsaWVudChpY29uQ29tcG9zaXRlKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUljb25TZWN0aW9uQ29udGVudCgpIHsKLQkJQ29tcG9zaXRlIHNoYXBlSWNvbkNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBpY29uQ29tcG9zaXRlLAotCQkJCTEpOwotCQlzaGFwZUljb25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXNoYXBlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotLy8JCWNyZWF0ZUxhYmVsKAotLy8JCQkJdG9vbGtpdCwKLS8vCQkJCXNoYXBlSWNvbkNvbXBvc2l0ZSwKLS8vCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbCwgMik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gTm8gd3JhcCBuZWVkZWQKLQkJY3JlYXRlTGFiZWxXaXRoTm9XcmFwKAotCQkJCXRvb2xraXQsCi0JCQkJc2hhcGVJY29uQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfU2hhcGVJY29uUHJldmlld19MYWJlbCwKLQkJCQlHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJMik7IAotCQkKLQkJcGFuZTEgPSBuZXcgQ2FudmFzKHNoYXBlSWNvbkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0KLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA2MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDYwOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0QmFja2dyb3VuZChDb2xvckNvbnN0YW50cy5saWdodEdyYXkpOwotCQl9Ci0JCS8vIHBhbmUxLnNldFNpemUoMzAsMzApOwotCQlDb21wb3NpdGUgcGFuZTIgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIHNoYXBlSWNvbkNvbXBvc2l0ZSk7Ci0JCWN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmUyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsLCBTV1QuTk9ORSk7IAotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24gPSB0b29sa2l0Ci0JCQkJLmNyZWF0ZUJ1dHRvbigKLQkJCQkJCXBhbmUyLAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9TaGFwZUljb25QcmV2aWV3X0NsZWFyQnV0dG9uTGFiZWwsIFNXVC5OT05FKTsgCi0JCWlmIChjb250ZW50RWxlbWVudC5nZXRTaGFwZWljb24oKSA9PSBudWxsKQotCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQotCQlDb21wb3NpdGUgbm9kZUljb25Db21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgaWNvbkNvbXBvc2l0ZSwgMSk7Ci0JCW5vZGVJY29uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlub2RlSWNvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLS8vCQljcmVhdGVMYWJlbCgKLS8vCQkJCXRvb2xraXQsCi0vLwkJCQlub2RlSWNvbkNvbXBvc2l0ZSwKLS8vCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X0xhYmVsLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBObyB3cmFwIG5lZWQgZm9yIAotCQljcmVhdGVMYWJlbFdpdGhOb1dyYXAoCi0JCQkJdG9vbGtpdCwKLQkJCQlub2RlSWNvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19MYWJlbCwKLQkJCQlHcmlkRGF0YS5CRUdJTk5JTkcsCi0JCQkJMik7IAotCQlwYW5lMyA9IG5ldyBDYW52YXMobm9kZUljb25Db21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCi0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNDA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlwYW5lMy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXBhbmUzLnNldEJhY2tncm91bmQoQ29sb3JDb25zdGFudHMubGlnaHRHcmF5KTsKLQkJfQotCQlDb21wb3NpdGUgcGFuZTQgPSBjcmVhdGVDb21wb3NpdGVGb3JCdXR0b25zKHRvb2xraXQsIG5vZGVJY29uQ29tcG9zaXRlKTsKLQkJY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uID0gdG9vbGtpdAotCQkJCS5jcmVhdGVCdXR0b24oCi0JCQkJCQlwYW5lNCwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTm9kZUljb25QcmV2aWV3X1NlbGVjdEJ1dHRvbkxhYmVsLCBTV1QuTk9ORSk7IAotCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbiA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJcGFuZTQsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX05vZGVJY29uUHJldmlld19DbGVhckJ1dHRvbkxhYmVsLCBTV1QuTk9ORSk7IAotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKSA9PSBudWxsKQotCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UKLQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQotCQluZXcgTGFiZWwoaWNvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzaGFwZUljb25QYXRoID0gY3JlYXRlTGFiZWxXaXRoTm9XcmFwKHRvb2xraXQsCi0JCQkJaWNvbkNvbXBvc2l0ZSwgIiIsIEdyaWREYXRhLkJFR0lOTklORywgMSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25QYXRoID0gY3JlYXRlTGFiZWxXaXRoTm9XcmFwKHRvb2xraXQsCi0JCQkJaWNvbkNvbXBvc2l0ZSwgIiIsIEdyaWREYXRhLkJFR0lOTklORywgMik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJbmV3IExhYmVsKG5vZGVJY29uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0vLwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotLy8JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPTI7Ci0vLwkJbm9kZUljb25QYXRoLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEljb25TZWN0aW9uTGlzdGVuZXJzKCkgewotCi0JCWN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0vLwkJCQkJRmlsZSBsaWJEaXJGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpKTsKLQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlqYXZhLm5ldC5VUkkgc2hhcGVJY29uVXJpID0gbnVsbDsKLQkJCQkJCUZpbGVEaWFsb2cgZmlsZUNob29zZXIgPSBuZXcgRmlsZURpYWxvZyhEaXNwbGF5Ci0JCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk9QRU4pOwotCQkJCQkJZmlsZUNob29zZXIuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5EZXNjcmlwdGlvbkZvcm1QYWdlX0ljb25GaWxlQ2hvb3NlckRpYWxvZ190aXRsZSk7IAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyRXh0ZW5zaW9ucyhpbWFnZVR5cGVzKTsgCi0JCQkJCQlmaWxlQ2hvb3Nlci5zZXRGaWx0ZXJOYW1lcyhpbWFnZU5hbWVzKTsgCi0JCQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gbnVsbDsKLQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IG51bGw7Ci0JCQkJCQl3aGlsZSAodHJ1ZSkgewotCQkJCQkJCWltYWdlRmlsZSA9IGZpbGVDaG9vc2VyLm9wZW4oKTsKLQkJCQkJCQlmaWxlbmFtZSA9IGZpbGVDaG9vc2VyLmdldEZpbGVOYW1lKCk7Ci0JCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmIChuZXcgRmlsZShpbWFnZUZpbGUpLmV4aXN0cygpKSB7Ci0vLwkJCQkJCQkJCUltYWdlRGF0YSBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKAotLy8JCQkJCQkJCQkJCWltYWdlRmlsZSk7Ci0vLwkJCQkJCQkJCWlmIChpbWFnZURhdGEud2lkdGggPiBTSEFQRUlDT05fV0lEVEhfTUFYCi0vLwkJCQkJCQkJCQkJfHwgaW1hZ2VEYXRhLmhlaWdodCA+IFNIQVBFSUNPTl9IRUlHSFRfTUFYKSB7Ci0vLwkJCQkJCQkJCQkvLyBtc2cgdXNlciAtIGltYWdlIHRvbyBiaWcKLS8vCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0vLwkJCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLS8vCQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0vLwkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZSwgLy8kTk9OLU5MUy0xJCAKLS8vCQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotLy8JCQkJCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlVG9vQmlnRGlhbG9nX3RlbXBsYXRlLCAvLyROT04tTkxTLTEkCi0vLwkJCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJaW1hZ2VGaWxlLAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCQkJU0hBUEVJQ09OX1dJRFRIX01BWCksCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJbmV3IEludGVnZXIoCi0vLwkJCQkJCQkJCQkJCQkJCQkJCQkJCQlTSEFQRUlDT05fSEVJR0hUX01BWCkgfSkpOwotLy8JCQkJCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJCQkJYnJlYWs7Ci0vLwkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJLy8gbXNnIHVzZXIgLSBmaWxlIGRvZXNuJ3QgZXhpc3QKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZU5vdEZvdW5kRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGVtcGxhdGUsIAotCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBpbWFnZUZpbGUgfSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IGNvcHlSZXNvdXJjZVRvTGliKGN0cmxfc2VsZWN0X3NoYXBlSWNvbl9idXR0b24uZ2V0U2hlbGwoKSwgZmlsZW5hbWUsCi0JCQkJCQkJCQkJZmlsZUNob29zZXIuZ2V0RmlsdGVyUGF0aCgpLAotCQkJCQkJCQkJCW1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybCk7Ci0JCQkJCQkJCQlzaGFwZUljb25VcmkgPSBuZXcgVVJJKE5ldFV0aWwKLQkJCQkJCQkJCQkJLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwKLQkJCQkJCQkJCQkJCQkuZ2V0UmVsYXRpdmVQYXRoKGZpbGUsCi0JCQkJCQkJCQkJCQkJCQluZXcgRmlsZShnZXRQbHVnaW5QYXRoKG1ldGhvZEVsZW1lbnQpKSkpKTsKLQkJCQkJCQkJCWlmIChzaGFwZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQkJbWV0aG9kRWxlbWVudCwKLQkJCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLAotCQkJCQkJCQkJCQkJCQlzaGFwZUljb25VcmksIC0xKTsKLQkJCQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJc2hhcGVJbWFnZSA9IG5ldyBJbWFnZSgKLQkJCQkJCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCksIGZpbGUKLQkJCQkJCQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KHNoYXBlSWNvblVyaS5nZXRQYXRoKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCXNoYXBlSWNvblVyaSA9IG51bGw7Ci0JCQkJCQkJCXNoYXBlSW1hZ2UgPSBudWxsOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX2Vycm9yLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3JlYXNvbiwgCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV90aXRsZSwgCi0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyX3Byb2Nlc3NpbmdfZmlsZV9kZXNjcmlwdGlvbiwgZXgpOyAKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChzaGFwZUltYWdlICE9IG51bGwpIHsKLQkJCQkJCQlwYW5lMS5yZWRyYXcoKTsKLQkJCQkJCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY3RybF9jbGVhcl9zaGFwZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2NsZWFyX3NoYXBlSWNvbl9idXR0b24KLQkJCQkuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJbWV0aG9kRWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLAotCQkJCQkJCQludWxsLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlwYW5lMS5yZWRyYXcoKTsKLQkJCQkJCWN0cmxfY2xlYXJfc2hhcGVJY29uX2J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCXNoYXBlSWNvblBhdGguc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfc2VsZWN0X25vZGVJY29uX2J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLS8vCQkJCQlGaWxlIGxpYkRpckZpbGUgPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCkpOwotCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWphdmEubmV0LlVSSSBub2RlSWNvblVyaSA9IG51bGw7Ci0JCQkJCQlGaWxlRGlhbG9nIGZpbGVDaG9vc2VyID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheQotCQkJCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCQkJCWZpbGVDaG9vc2VyLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9JY29uRmlsZUNob29zZXJEaWFsb2dfdGl0bGUpOyAKLQkJCQkJCWZpbGVDaG9vc2VyLnNldEZpbHRlckV4dGVuc2lvbnMoaW1hZ2VUeXBlcyk7IAotCQkJCQkJZmlsZUNob29zZXIuc2V0RmlsdGVyTmFtZXMoaW1hZ2VOYW1lcyk7IAotCQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCQkJCQkJd2hpbGUgKHRydWUpIHsKLQkJCQkJCQlpbWFnZUZpbGUgPSBmaWxlQ2hvb3Nlci5vcGVuKCk7Ci0JCQkJCQkJZmlsZW5hbWUgPSBmaWxlQ2hvb3Nlci5nZXRGaWxlTmFtZSgpOwotCQkJCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAobmV3IEZpbGUoaW1hZ2VGaWxlKS5leGlzdHMoKSkgewotCQkJCQkJCQkJSW1hZ2VEYXRhIGltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEoCi0JCQkJCQkJCQkJCWltYWdlRmlsZSk7Ci0JCQkJCQkJCQlpZiAoaW1hZ2VEYXRhLndpZHRoID4gTk9ERUlDT05fV0lEVEhfTUFYCi0JCQkJCQkJCQkJCXx8IGltYWdlRGF0YS5oZWlnaHQgPiBOT0RFSUNPTl9IRUlHSFRfTUFYKSB7Ci0JCQkJCQkJCQkJLy8gbXNnIHVzZXIgLSBpbWFnZSB0b28gYmlnCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZm9ybXNfRGVzY3JpcHRpb25Gb3JtUGFnZV9pbWFnZVRvb0JpZ0RpYWxvZ190ZW1wbGF0ZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCQkJCQkJCQlpbWFnZUZpbGUsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCU5PREVJQ09OX1dJRFRIX01BWCksCi0JCQkJCQkJCQkJCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCU5PREVJQ09OX0hFSUdIVF9NQVgpIH0pKTsKLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkvLyBtc2cgdXNlciAtIGZpbGUgZG9lc24ndCBleGlzdAotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19EZXNjcmlwdGlvbkZvcm1QYWdlX2ltYWdlTm90Rm91bmREaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0Rlc2NyaXB0aW9uRm9ybVBhZ2VfaW1hZ2VOb3RGb3VuZERpYWxvZ190ZW1wbGF0ZSwgCi0JCQkJCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGltYWdlRmlsZSB9KSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGltYWdlRmlsZSAhPSBudWxsICYmIGltYWdlRmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlTdHJpbmcgdXJsID0gY29weVJlc291cmNlVG9MaWIoY3RybF9zZWxlY3Rfbm9kZUljb25fYnV0dG9uLmdldFNoZWxsKCksIGZpbGVuYW1lLAotCQkJCQkJCQkJCWZpbGVDaG9vc2VyLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJCQltZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwpOwotCQkJCQkJCQkJbm9kZUljb25VcmkgPSBuZXcgVVJJKE5ldFV0aWwKLQkJCQkJCQkJCQkJLmVuY29kZUZpbGVVUkwoRmlsZVV0aWwKLQkJCQkJCQkJCQkJCQkuZ2V0UmVsYXRpdmVQYXRoKGZpbGUsCi0JCQkJCQkJCQkJCQkJCQluZXcgRmlsZShnZXRQbHVnaW5QYXRoKG1ldGhvZEVsZW1lbnQpKSkpKTsKLQkJCQkJCQkJCWlmIChub2RlSWNvblVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJCQkJCQltZXRob2RFbGVtZW50LAotCQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCS5nZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwKLQkJCQkJCQkJCQkJCQkJbm9kZUljb25VcmksIC0xKTsKLQkJCQkJCQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJbm9kZUltYWdlID0gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLAotCQkJCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KG5vZGVJY29uVXJpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJbm9kZUljb25VcmkgPSBudWxsOwotCQkJCQkJCQlub2RlSW1hZ2UgPSBudWxsOwotCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCQlpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX2Vycm9yLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfY29weWluZ19maWxlX3JlYXNvbiwgCi0JCQkJCQkJCQkJCQkJZXguZ2V0TWVzc2FnZSgpKTsKLQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX3RpdGxlLCAKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJfcHJvY2Vzc2luZ19maWxlX2Rlc2NyaXB0aW9uLCBleCk7IAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKG5vZGVJbWFnZSAhPSBudWxsKSB7Ci0JCQkJCQkJcGFuZTMucmVkcmF3KCk7Ci0JCQkJCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJY3RybF9jbGVhcl9ub2RlSWNvbl9idXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQljdHJsX2NsZWFyX25vZGVJY29uX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQltZXRob2RFbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIG51bGwsIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJcmV0dXJuOwotCQkJCXBhbmUzLnJlZHJhdygpOwotCQkJCWN0cmxfY2xlYXJfbm9kZUljb25fYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCW5vZGVJY29uUGF0aC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIHNlbGVjdGVkIHNoYXBlTm9kZUljb24gYW5kIG5vZGVJY29uIHRvIHJlc291cmNlcyBmb2xkZXIgb2YKLQkgKiBjb250ZW50IGVsZW1lbnQuIFByb21wdHMgdG8gb3ZlcndyaXRlIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMuCi0JICogQHBhcmFtIHNGaWxlTmFtZQotCSAqIEBwYXJhbSBzRmlsZVBhdGgKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5UmVzb3VyY2VUb0xpYihTaGVsbCBzaGVsbCwgU3RyaW5nIHNGaWxlTmFtZSwgU3RyaW5nIHNGaWxlUGF0aCwKLQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBuZXdGaWxlID0gTGlicmFyeVVJVXRpbC5jb3B5UmVzb3VyY2VUb0xpYihzaGVsbCwgbmV3IEZpbGUoc0ZpbGVQYXRoLCBzRmlsZU5hbWUpLCBtZXRob2RFbGVtZW50KTsKLQkJaWYgKG5ld0ZpbGUgIT0gbnVsbCkKLQkJCXJldHVybiBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQllbHNlIAotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZEljb25TZWN0aW9uRGF0YSgpIHsKLQkJcGFuZTEuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkvLyBwYWludCB0aGUgZ3JleSBiYWNrZ3JvdW5kCi0JCQkJUmVjdGFuZ2xlIGNsaWVudFJlY3QgPSBwYW5lMS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0KLQkJCQlqYXZhLm5ldC5VUkkgdXJpID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCk7Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXRoID0gY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkuZ2V0UGF0aCgpOwotCQkJCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkJCQkJLy8gQ2hlY2sgZm9yIHRoZSB1cmkgY29udGFpbnMgdGhlIHJlbGF0aXZlIHRvIGxpYnJhcnkuCi0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4obWV0aG9kRWxlbWVudCk7Ci0JCQkJCQkJCQlpZihwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSkgPiAtMSl7Ci0JCQkJCQkJCQkJcGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIHBhdGg7CQotCQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQkJcGF0aCA9IGdldFBsdWdpblBhdGgobWV0aG9kRWxlbWVudCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcGF0aDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJaWYgKHNoYXBlSW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCQkJc2hhcGVJbWFnZSA9IG5ldyBJbWFnZSgKLQkJCQkJCQkJCQkJRGlzcGxheS5nZXRDdXJyZW50KCksIHBhdGgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpICE9IG51bGwpewotCQkJCQkJCQkJc2hhcGVJY29uUGF0aC5zZXRUZXh0KGNvbnRlbnRFbGVtZW50LmdldFNoYXBlaWNvbigpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2xpZW50UmVjdCA9IHBhbmUxLmdldENsaWVudEFyZWEoKTsKLQkJCQkJCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQkJCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkJCQkJLmdldFN5c3RlbUNvbG9yKDE1KSk7Ci0JCQkJCQkJCWUuZ2MuZmlsbFJlY3RhbmdsZShjbGllbnRSZWN0KTsKLQkJCQkJCQkJZS5nYy5kcmF3SW1hZ2Uoc2hhcGVJbWFnZSwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS54LAotCQkJCQkJCQkJCXNoYXBlSW1hZ2UuZ2V0Qm91bmRzKCkueSwgc2hhcGVJbWFnZQotCQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLndpZHRoLCBzaGFwZUltYWdlCi0JCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkuaGVpZ2h0LCBwYW5lMQotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS54LCBwYW5lMQotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS55LCBwYW5lMQotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS53aWR0aCwgcGFuZTEKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAod2FybmluZ0NvdW50ID09IDEpIHsKLQkJCQkJCQkJCXdhcm5pbmdDb3VudCsrOwotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkU2hhcGVJY29uV2FybmluZywgKG5ldyBPYmplY3RbXSB7IG1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpLCBwYXRoIH0pKTsgCi0JCQkJCQkJCQlNc2dCb3guc2hvd1dhcm5pbmcobXNnKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkRlc2NyaXB0aW9uRm9ybVBhZ2VfTG9hZFNoYXBlSWNvbkVycm9yLCAobmV3IE9iamVjdFtdIHsgZXguZ2V0TWVzc2FnZSgpIH0pKSk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCQlwYW5lMS5yZWRyYXcoKTsKLQkJaWYoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkgIT0gbnVsbCl7Ci0JCQlzaGFwZUljb25QYXRoLnNldFRleHQoY29udGVudEVsZW1lbnQuZ2V0U2hhcGVpY29uKCkuZ2V0UGF0aCgpKTsKLQkJfQotCQkKLQkJcGFuZTMuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQkvLyBwYWludCB0aGUgZ3JleSBiYWNrZ3JvdW5kCi0JCQkJUmVjdGFuZ2xlIGNsaWVudFJlY3QgPSBwYW5lMy5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQllLmdjLnNldEJhY2tncm91bmQoRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U3lzdGVtQ29sb3IoMTUpKTsKLQkJCQllLmdjLmZpbGxSZWN0YW5nbGUoY2xpZW50UmVjdCk7Ci0KLQkJCQlqYXZhLm5ldC5VUkkgdXJpID0gY29udGVudEVsZW1lbnQuZ2V0Tm9kZWljb24oKTsKLQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHBhdGggPSBjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpLmdldFBhdGgoKTsKLQkJCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihtZXRob2RFbGVtZW50KTsKLQkJCQkJCQkJCWlmKHBhdGguaW5kZXhPZihwbHVnaW4uZ2V0TmFtZSgpKSA+IC0xKXsKLQkJCQkJCQkJCQlwYXRoID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkKLQkJCQkJCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcGF0aDsJCi0JCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCQlwYXRoID0gZ2V0UGx1Z2luUGF0aChtZXRob2RFbGVtZW50KQotCQkJCQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBwYXRoOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJaWYgKG5vZGVJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlub2RlSW1hZ2UgPSBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksCi0JCQkJCQkJCQkJCXBhdGgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkgIT0gbnVsbCl7Ci0JCQkJCQkJCQlub2RlSWNvblBhdGguc2V0VGV4dChjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpLmdldFBhdGgoKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJY2xpZW50UmVjdCA9IHBhbmUzLmdldENsaWVudEFyZWEoKTsKLQkJCQkJCQkJZS5nYy5zZXRDbGlwcGluZyhjbGllbnRSZWN0KTsKLQkJCQkJCQkJZS5nYy5zZXRCYWNrZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCQkJCQkJLmdldFN5c3RlbUNvbG9yKDE1KSk7Ci0JCQkJCQkJCWUuZ2MuZmlsbFJlY3RhbmdsZShjbGllbnRSZWN0KTsKLQkJCQkJCQkJZS5nYy5kcmF3SW1hZ2Uobm9kZUltYWdlLAotCQkJCQkJCQkJCW5vZGVJbWFnZS5nZXRCb3VuZHMoKS54LCBub2RlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS55LCBub2RlSW1hZ2UKLQkJCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCwgbm9kZUltYWdlCi0JCQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkuaGVpZ2h0LCBwYW5lMwotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS54LCBwYW5lMwotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS55LCBwYW5lMwotCQkJCQkJCQkJCQkJLmdldENsaWVudEFyZWEoKS53aWR0aCwgcGFuZTMKLQkJCQkJCQkJCQkJCS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAod2FybmluZ0NvdW50ID09IDEpIHsKLQkJCQkJCQkJCXdhcm5pbmdDb3VudCsrOwotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25XYXJuaW5nLCAobmV3IE9iamVjdFtdIHsgbWV0aG9kRWxlbWVudC5nZXROYW1lKCksIHBhdGggfSkpOyAKLQkJCQkJCQkJCU1zZ0JveC5zaG93V2FybmluZyhtc2cpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuRGVzY3JpcHRpb25Gb3JtUGFnZV9Mb2FkTm9kZUljb25FcnJvciwgKG5ldyBPYmplY3RbXSB7IGV4LmdldE1lc3NhZ2UoKSB9KSkpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQkJcGFuZTMucmVkcmF3KCk7Ci0JCWlmKGNvbnRlbnRFbGVtZW50LmdldE5vZGVpY29uKCkgIT0gbnVsbCl7Ci0JCQlub2RlSWNvblBhdGguc2V0VGV4dChjb250ZW50RWxlbWVudC5nZXROb2RlaWNvbigpLmdldFBhdGgoKSk7Ci0JCX0KLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVTZWN0aW9ucyhib29sZWFuIGVuYWJsZSkgewotCQlpZiAoZ2VuZXJhbFNlY3Rpb25PbikgewotCQkJZ2VuZXJhbFNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCWdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyA9IGdlbmVyYWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQlnZW5lcmFsU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRldGFpbFNlY3Rpb25PbikgewotCQkJZGV0YWlsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChkZXRhaWxTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCWRldGFpbFNlY3Rpb25FeHBhbmRGbGFnID0gZGV0YWlsU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQkJZGV0YWlsU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJbm90YXRpb25TZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJCWlmIChlbmFibGUpIHsKLQkJCQlub3RhdGlvblNlY3Rpb24uc2V0RXhwYW5kZWQobm90YXRpb25TZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCW5vdGF0aW9uU2VjdGlvbkV4cGFuZEZsYWcgPSBub3RhdGlvblNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCW5vdGF0aW9uU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCXRhaWxvcmluZ1NlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCXRhaWxvcmluZ1NlY3Rpb24uc2V0RXhwYW5kZWQodGFpbG9yaW5nU2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQl0YWlsb3JpbmdTZWN0aW9uRXhwYW5kRmxhZyA9IHRhaWxvcmluZ1NlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCXRhaWxvcmluZ1NlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJCX0KLQkJfQotCQlpZiAodmVyc2lvblNlY3Rpb25PbikgewotCQkJdmVyc2lvblNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCXZlcnNpb25TZWN0aW9uLnNldEV4cGFuZGVkKHZlcnNpb25TZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCQl9IGVsc2UgewotCQkJCXZlcnNpb25TZWN0aW9uRXhwYW5kRmxhZyA9IHZlcnNpb25TZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCQl2ZXJzaW9uU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JCWlmIChpY29uU2VjdGlvbk9uKSB7Ci0JCQlpY29uU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCQlpZiAoZW5hYmxlKSB7Ci0JCQkJaWNvblNlY3Rpb24uc2V0RXhwYW5kZWQoaWNvblNlY3Rpb25FeHBhbmRGbGFnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWNvblNlY3Rpb25FeHBhbmRGbGFnID0gaWNvblNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCWljb25TZWN0aW9uLnNldEV4cGFuZGVkKGVuYWJsZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZhcmlhYmlsaXR5U2VjdGlvbk9uKSB7Ci0JCQl2YXJpYWJpbGl0eVNlY3Rpb24uc2V0VmlzaWJsZShlbmFibGUpOwotCQkJaWYgKGVuYWJsZSkgewotCQkJCXZhcmlhYmlsaXR5U2VjdGlvbi5zZXRFeHBhbmRlZChlbGVtZW50U2VjdGlvbkV4cGFuZEZsYWcpOwotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50U2VjdGlvbkV4cGFuZEZsYWcgPSB2YXJpYWJpbGl0eVNlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJCXZhcmlhYmlsaXR5U2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHNoYXBlSW1hZ2UgIT0gbnVsbCkgewotCQkJc2hhcGVJbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKG5vZGVJbWFnZSAhPSBudWxsKSB7Ci0JCQlub2RlSW1hZ2UuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyVmFyaWFiaWxpdHkgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlclZhcmlhYmlsaXR5LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoY29udGVudFByb3ZpZGVyVmFyaWFiaWxpdHkgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyVmFyaWFiaWxpdHkuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChsYWJlbFByb3ZpZGVyQmFzZSAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyQmFzZS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvcHlyaWdodExhYmVsUHJvdmlkZXJCYXNlICE9IG51bGwpIHsKLQkJCWNvcHlyaWdodExhYmVsUHJvdmlkZXJCYXNlLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJaWYgKGNvbHVtblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbHVtblByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlkaXNwb3NlZCA9IHRydWU7Ci0JfQkJCi0KLQlwcml2YXRlIHZvaWQgc2V0Q29weXJpZ2h0QnV0dG9uRGVzZWxlY3QoKSB7Ci0JCWlmIChtZXRob2RVbml0LmdldENvcHlyaWdodFN0YXRlbWVudCgpICE9IG51bGwpIHsKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3QKLQkJCQkJLnNldEVuYWJsZWQoKG1ldGhvZFVuaXQKLQkJCQkJCQkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkuZ2V0TmFtZSgpID09IG51bGwpID8gZmFsc2UKLQkJCQkJCQk6IHRydWUpOwotCQl9IGVsc2UKLQkJCWNvcHlyaWdodF9idXR0b25fZGVzZWxlY3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWlmIChUbmdVdGlsLmlzTG9ja2VkKG1ldGhvZEVsZW1lbnQpKQotCQkJY29weXJpZ2h0X2J1dHRvbl9kZXNlbGVjdC5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0SGVscCgpIHsKLQkJaWYgKG1haW5Db21wb3NpdGUgIT0gbnVsbCkgewotCQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChtYWluQ29tcG9zaXRlLmdldFBhcmVudCgpLAotCQkJCQlnZXRDb250ZW50RWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZXhwYW5kZWRDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCgKLQkJCQkJZXhwYW5kZWRDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLlJJQ0hfVEVYVF9FRElUT1JfQ09OVEVYVF9JRCk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuSVJlZnJlc2hhYmxlI3JlZnJlc2hOYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgIShjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJCWN0cmxfbmFtZS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQljdHJsX25hbWUuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJc2V0Rm9ybVRleHRXaXRoVmFyaWFibGVJbmZvKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQkKLQl9Ci0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24oKXsKLQkJaWYoZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkRFVEFJTF9TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0R2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbigpewotCQlpZihnZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uIT0gbnVsbCl7Ci0JCQlyZXR1cm4gZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbjsKLQkJfQotCQlyZXR1cm4gQXV0aG9yaW5nVUlUZXh0LkdFTkVSQUxfSU5GT19TRUNUSU9OX0RFU0M7Ci0JfQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFpbG9yaW5nU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiB0YWlsb3JpbmdTZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5UQUlMT1JJTkdfU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIG5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuTk9UQVRJT05fU0VDVElPTl9ERVNDOwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uKCl7Ci0JCWlmKHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uOwotCQl9Ci0JCXJldHVybiBBdXRob3JpbmdVSVRleHQuVkFSSUFCSUxJVFlfU0VDVElPTl9ERVNDOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRJY29uU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHVicwotCQlpZihpY29uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIGljb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5JQ09OX1NFQ1RJT05fREVTQzsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlpZih2ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwpewotCQkJcmV0dXJuIHZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb247Ci0JCX0KLQkJcmV0dXJuIEF1dGhvcmluZ1VJVGV4dC5WRVJTSU9OX0lORk9fU0VDVElPTl9ERVNDOwotCX0KLQotCS8qKiAKLQkgKiBGb2xsb3dpbmcgbWV0aG9kcyBiZWxvdyBleHBvc2VkIHB1YmxpYyBpbiBvcmRlciB0byBhbGxvdyAKLQkgKiB0ZXN0IGF1dG9tYXRpb24gdG8gYWNjZXNzIHRoZSBmb3JtIG9iamVjdHMgdGhyb3VnaCB0ZXN0IG9iamVjdHMKLQkgKiBvZiBhbnkgYXV0b21hdGlvbiB0b29scy4KLQkgKi8KLQkKLQkvKioKLQkgKiBHZXQgYnJpZWYgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfYnJpZWZfZGVzYy4KLQkgKi8KLQlwdWJsaWMgVGV4dCBnZXRDdHJsX2JyaWVmX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogU2V0IGJyaWVmIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGN0cmxfYnJpZWZfZGVzYyBUaGUgY3RybF9icmllZl9kZXNjIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2JyaWVmX2Rlc2MoVGV4dCBjdHJsX2JyaWVmX2Rlc2MpIHsKLQkJdGhpcy5jdHJsX2JyaWVmX2Rlc2MgPSBjdHJsX2JyaWVmX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IG1haW4gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN0cmxfZnVsbF9kZXNjLgotCSAqLwotCXB1YmxpYyBJTWV0aG9kUmljaFRleHQgZ2V0Q3RybF9mdWxsX2Rlc2MoKSB7Ci0JCXJldHVybiBjdHJsX2Z1bGxfZGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgbWFpbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBjdHJsX2Z1bGxfZGVzYyBUaGUgY3RybF9mdWxsX2Rlc2MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN0cmxfZnVsbF9kZXNjKElNZXRob2RSaWNoVGV4dCBjdHJsX2Z1bGxfZGVzYykgewotCQl0aGlzLmN0cmxfZnVsbF9kZXNjID0gY3RybF9mdWxsX2Rlc2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZXNlbnRhdGlvbiBuYW1lCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLgotCSAqLwotCXB1YmxpYyBUZXh0IGdldEN0cmxfcHJlc2VudGF0aW9uX25hbWUoKSB7Ci0JCXJldHVybiBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBwcmVzZW50YXRpb24gbmFtZQotCSAqIEBwYXJhbSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIFRoZSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX3ByZXNlbnRhdGlvbl9uYW1lKFRleHQgY3RybF9wcmVzZW50YXRpb25fbmFtZSkgewotCQl0aGlzLmN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjdHJsX3ByZXNlbnRhdGlvbl9uYW1lOwotCX0KLQotCS8qKgotCSAqIEdldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3RybF9leHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGdldEN0cmxfZXhwYW5kZWQoKSB7Ci0JCXJldHVybiBjdHJsX2V4cGFuZGVkOwotCX0KLQotCS8qKgotCSAqIFNldCBleHBhbmRlZCByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBjdHJsX2V4cGFuZGVkIFRoZSBjdHJsX2V4cGFuZGVkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdHJsX2V4cGFuZGVkKElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkKSB7Ci0JCXRoaXMuY3RybF9leHBhbmRlZCA9IGN0cmxfZXhwYW5kZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdHJsX2tleS4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IGdldEN0cmxfa2V5KCkgewotCQlyZXR1cm4gY3RybF9rZXk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGN0cmxfa2V5IFRoZSBjdHJsX2tleSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3RybF9rZXkoSU1ldGhvZFJpY2hUZXh0IGN0cmxfa2V5KSB7Ci0JCXRoaXMuY3RybF9rZXkgPSBjdHJsX2tleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZSl7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKHBsdWdpbik7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM2Y2QyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlzY2lwbGluZSBkaXNjaXBsaW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZSA9IChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJZGlzY2lwbGluZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNTAwZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRGlzY2lwbGluZSBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIERpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmVHcm91cGluZyA9IChEaXNjaXBsaW5lR3JvdXBpbmcpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJZGlzY2lwbGluZUdyb3VwaW5nKSB9KTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZWdyb3VwaW5nX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lZ3JvdXBpbmdfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVncm91cGluZ192ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWZhYmZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGlzY2lwbGluZXMgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAiZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgRGlzY2lwbGluZUdyb3VwaW5nIGRpc2NpcGxpbmVHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRJU0NJUExJTkVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChEaXNjaXBsaW5lR3JvdXBpbmcpIG9iamVjdCkuZ2V0RGlzY2lwbGluZXMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLAotCQkJCQlkaXNjaXBsaW5lR3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpLAotCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJZGlzY2lwbGluZUdyb3VwaW5nLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nRGlzY2lwbGluZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0Rpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWYzZjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUmVmZXJlbmNlIFdvcmtmbG93IHBhZ2UgaW4gdGhlIERpc2NpcGxpbmUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELAotCQkJCUF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VfV09SS0ZMT1dfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZGlzY2lwbGluZS5nZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJLy8gT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJLy8gaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCS8vIFByb2Nlc3MgcHJvY2VzcyA9Ci0JCQkvLyAoUHJvY2VzcykoKFByb2Nlc3NDb21wb25lbnQpb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCQkvLyBpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkvLyBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCS8vIGRpc2NpcGxpbmUsCi0JCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLCBwcm9jZXNzLAotCQkJLy8gLTEpOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCS8vIGRpc2NpcGxpbmUsCi0JCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLCBvYmplY3QsCi0JCQkvLyAtMSk7Ci0JCQkvLyB9Ci0JCQlNZXRob2RFbGVtZW50IG9iamVjdCA9IChNZXRob2RFbGVtZW50KSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqZWN0ID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCX0KLQkJCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpOwotCQkJCWlmIChVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShkaXNjaXBsaW5lLAotCQkJCQkJZmVhdHVyZSwgb2JqZWN0KSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQlkaXNjaXBsaW5lLCBmZWF0dXJlLCBvYmplY3QsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlkaXNjaXBsaW5lLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5QUk9DRVNTRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgUmVmZXJlbmNlV29ya0Zsb3dGaWx0ZXIoKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVJlZmVyZW5jZVdvcmtmbG93UGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVSZWZlcmVuY2VXb3JrZmxvd1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRGlzY2lwbGluZVRhc2tzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lVGFza3NQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWY4OWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9EaXNjaXBsaW5lVGFza3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29udGVudEVsZW1lbnRPcmRlckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgRGlzY2lwbGluZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lVGFza3NQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRpc2NpcGxpbmVUYXNrc1BhZ2UiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBEaXNjaXBsaW5lIGRpc2NpcGxpbmU7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVUYXNrc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UQVNLU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy9yZXR1cm4gKChEaXNjaXBsaW5lKSBvYmplY3QpLmdldFRhc2tzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoY29udGVudEVsZW1lbnQsIAotCQkJCQkJYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8JY2hlY2sgdG8gbWFpbnRhaW4gbWFueS10by1vbmUgcnVsZSBmb3IgZG9tYWluLXdvcmtwcm9kdWN0Ci0vLwkJCQlMaXN0IGRpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXModGFzayk7Ci0vLwkJCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiBkaXNjaXBsaW5lcy5zaXplKCkgPiAwKQl7Ci0vLwkJCQkJT2JqZWN0IGFzc29jaWF0ZWREaXNjaXBsaW5lID0gZGlzY2lwbGluZXMuZ2V0KDApOwotLy8JCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0vLwkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9lcnJSZWxhdGlvbnNoaXBFeGlzdHMsCi0vLwkJCQkJCQluZXcgT2JqZWN0W10gewotLy8JCQkJCQkJCQl0YXNrLmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJCS5nZXRMYWJlbFdpdGhQYXRoKGFzc29jaWF0ZWREaXNjaXBsaW5lKSwKLS8vCQkJCQkJCQkJZGlzY2lwbGluZS5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZyk7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotCQkJCQotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5UQVNLUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgVGFzayk7Ci0JCQl9Ci0JCX07Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRpc2NpcGxpbmVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kaXNjaXBsaW5lVGFza3NQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2lwbGluZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TW9kZWxTdHJ1Y3R1cmVQYXRoKCkgewotCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OGZmNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Eb21haW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImRvbWFpbkRlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRG9tYWluIGRvbWFpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbkRlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBkb21haW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIERvbWFpbik7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlkb21haW4pIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5fdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0RvbWFpbldvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGUxOGM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvRG9tYWluV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFdvcmsgUHJvZHVjdHMgcGFnZSBpbiB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIHJlbW92ZSB0aGUgdG8tb25lIFVJIHJlc3RyaWN0aW9uIG9uIHdwLWRvbWlhbiAoUjM5NTM5MCkgMjAwNy0wOC0zMAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluV29ya1Byb2R1Y3RzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJkb21haW5Xb3JrUHJvZHVjdHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEb21haW4gZG9tYWluOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbldvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJZG9tYWluID0gKERvbWFpbikgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0SXNVcEFuZERvd25CdXR0b25zUmVxdWlyZWQxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCS8vcmV0dXJuICgoRG9tYWluKSBvYmplY3QpLmdldFdvcmtQcm9kdWN0cygpLnRvQXJyYXkoKTsKLQkJCQlpZiAoYWxsU3RlcHMgPT0gbnVsbCkgewotCQkJCQlhbGxTdGVwcyA9IG5ldyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCgKLQkJCQkJCQljb250ZW50RWxlbWVudCwKLQkJCQkJCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdC5DT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZLAotCQkJCQkJCWdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpKTsKLQkJCQl9Ci0JCQkJTGlzdCByZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKAotCQkJCQkJY29udGVudEVsZW1lbnQsIGFsbFN0ZXBzLnRvQXJyYXkoKSk7Ci0JCQkJcmV0dXJuIHJldHVybkxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVdXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBjaGVjayB0byBtYWludGFpbiBtYW55LXRvLW9uZSBydWxlIGZvciBkb21haW4td29ya3Byb2R1Y3QKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlMaXN0IGRvbWFpbnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgZWxlbWVudCk7Ci0JCQkJaWYgKGRvbWFpbnMgIT0gbnVsbCAmJiBkb21haW5zLnNpemUoKSA+IDApCXsKLQkJCQkJT2JqZWN0IGFzc29jaWF0ZWREb21haW4gPSBkb21haW5zLmdldCgwKTsKLS8vCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJCS5mb3JtYXQoCi0vLwkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotLy8JCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQkJZWxlbWVudC5nZXROYW1lKCksCi0vLwkJCQkJCQkJCVRuZ1V0aWwKLS8vCQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChhc3NvY2lhdGVkRG9tYWluKSwKLS8vCQkJCQkJCQkJZG9tYWluLmdldE5hbWUoKSB9KTsKLS8vCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0vLwkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLS8vCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8vIGNoZWNrIGlmIHRoaXMgb3BlcmF0aW9uIHdpbGwgbW9kaWZ5IHRoZSBlbGVtZW50IGluIG9wcG9zaXRlCi0JCQkJLy8gZmVhdHVyZSB2YWx1ZQotCQkJCS8vCQotLy8JCQkJaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShkb21haW4sCi0vLwkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgZWxlbWVudCkpIHsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0JCQl9Ci0KLQkJCWFjdGlvbk1ncgotCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGRvbWFpbiwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCksCi0JCQkJCQkJYWRkSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgZG9tYWluLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJaWYgKGdldEhlbHBlcigpLmlzQ29udHJpYnV0b3IoKENvbnRlbnRFbGVtZW50KSBvYmopKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRvbWFpbldvcmtQcm9kdWN0c1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5kb21haW5Xb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZG9tYWluV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRlbnRDYXRlZ29yeU9yZGVyRmVhdHVyZSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWY0YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Db250ZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBHdWlkYW5jZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gImd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEd1aWRhbmNlIGd1aWRhbmNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudExhYmVsOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9jb250ZW50OwotCi0JcHJpdmF0ZSBpbnQgY29udGVudEZpZWxkSGVpZ2h0ID0gNDAwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWd1aWRhbmNlID0gKEd1aWRhbmNlKSBjb250ZW50RWxlbWVudDsKLQkJZWxlbWVudExhYmVsID0gTGlicmFyeVVJVGV4dC5nZXRVSVRleHQoZ3VpZGFuY2UpOwotCQlzZXRFbGVtZW50VHlwZU9uKHRydWUpOwotCQlpZiAoZ3VpZGFuY2UgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikKLQkJCXNldEJyaWVmRGVzY09uKGZhbHNlKTsKLQkJc2V0RnVsbERlc2NPbihmYWxzZSk7Ci0JCXNldEtleUNvbnNpZGVyYXRpb25PbihmYWxzZSk7Ci0JCXNldEljb25TZWN0aW9uT24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Rm9ybVByZWZpeCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGb3JtUHJlZml4KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREFOQ0UpCi0JCQkJLmFwcGVuZCgiICgiKS5hcHBlbmQoZWxlbWVudExhYmVsKS5hcHBlbmQoIik6ICIpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgVGhlIGZvcm0gdG9vbGtpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3RybF9jb250ZW50ID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTUFJTl9ERVNDUklQVElPTl9URVhULAotCQkJCWNvbnRlbnRGaWVsZEhlaWdodCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWN0cmxfY29udGVudC5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfY29udGVudC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJY3RybF9jb250ZW50LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfY29udGVudC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfY29udGVudDsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9jb250ZW50LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCWlmIChndWlkYW5jZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudCA9IG51bGw7Ci0JCQlpZiAoZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCkgIT0gbnVsbCkgewotCQkJCWNvbnRlbnQgPSBndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJCWN0cmxfY29udGVudC5zZXRUZXh0KGNvbnRlbnQgPT0gbnVsbCA/ICIiIDogY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZ3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBNYWluIERlc2NyaXB0aW9uIHRleHQgYm94LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudEZpZWxkSGVpZ2h0KCkgewotCQlyZXR1cm4gY29udGVudEZpZWxkSGVpZ2h0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGUgTWFpbiBEZXNjcmlwdGlvbiB0ZXh0IGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50RmllbGRIZWlnaHQoaW50IGNvbnRlbnRGaWVsZEhlaWdodCkgewotCQl0aGlzLmNvbnRlbnRGaWVsZEhlaWdodCA9IGNvbnRlbnRGaWVsZEhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJcmV0dXJuICgoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldFR5cGUoKQotCQkJCQkJCS5lcXVhbHMoKChHdWlkYW5jZSkgY29udGVudEVsZW1lbnQpLmdldFR5cGUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gU2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcuCi0JCSgoQ29udGVudEZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQlndWlkYW5jZSkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCWlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlcil7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53aGl0ZXBhcGVyX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud2hpdGVwYXBlcl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndoaXRlcGFwZXJfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29uY2VwdCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jb25jZXB0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29uY2VwdF92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbmNlcHRfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQ2hlY2tsaXN0KXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNoZWNrbGlzdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuY2hlY2tsaXN0X2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGVja2xpc3RfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5leGFtcGxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXhhbXBsZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4YW1wbGVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGVsaW5lKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmd1aWRlbGluZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZ3VpZGVsaW5lX2RldGFpbFNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5ndWlkZWxpbmVfaWNvblNlY3Rpb25fZGVzYzsKLQkJfQotCQllbHNlIGlmKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5lc3RpbWF0aW9uY29uc2lkZXJhdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmVzdGltYXRpb25jb25zaWRlcmF0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5zdXBwb3J0aW5nbWF0ZXJpYWxfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN1cHBvcnRpbmdtYXRlcmlhbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3VwcG9ydGluZ21hdGVyaWFsX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJlcG9ydCl7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXBvcnRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcG9ydF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVwb3J0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvYWRtYXApewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9hZG1hcF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvYWRtYXBfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2FkbWFwX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlbXBsYXRlKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVtcGxhdGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZW1wbGF0ZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlbXBsYXRlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKXsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGVybWRlZmluaXRpb25fdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50ZXJtZGVmaW5pdGlvbl92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRlcm1kZWZpbml0aW9uX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVzdWFibGVhc3NldF92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlc3VhYmxlYXNzZXRfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZXVzYWJsZWFzc2V0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQkJZWxzZSBpZihjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFRvb2xNZW50b3IpewotCQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbG1lbnRvcl92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xtZW50b3JfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmljb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sbWVudG9yX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMThjYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9HdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBpbiBhIEd1aWRhbmNlICh3aXRoIGF0dGFjaG1lbnRzKSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYXR0YWNoLCBjdHJsX2RldGFjaCwgY3RybF9hdHRhY2hfdXJsIDsgLy9jdHJsX3JlbW92ZSA7Ci0KLQlwcml2YXRlIExpc3QgY3RybF9hdHRhY2hlZF9maWxlczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRV9BVFRBQ0hNRU5UX0xBU1RfRElSRUNUT1JZX0JST1dTRURfUFJFRiA9ICJndWlkYW5jZV9hdHRhY2htZW50X2xhc3RfZGlyX2Jyb3dzZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0KLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQVRUQUNIRURfRklMRV9URVhULCAyKTsKLQkJY3RybF9hdHRhY2hlZF9maWxlcyA9IG5ldyBMaXN0KGdlbmVyYWxDb21wb3NpdGUsIFNXVC5TSU5HTEUKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGxpc3RHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQkVHSU5OSU5HLAotCQkJCXRydWUsIHRydWUpOwotCQlsaXN0R3JpZERhdGEuaGVpZ2h0SGludCA9IDMwOwotCQlsaXN0R3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnNldExheW91dERhdGEobGlzdEdyaWREYXRhKTsKLQotCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQotCQljdHJsX2F0dGFjaCA9IGNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIEFUVEFDSF9CVVRUT04pOwotCQljdHJsX2F0dGFjaF91cmwgPSBjcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBBVFRBQ0hfVVJMX0JVVFRPTik7Ci0JCWN0cmxfZGV0YWNoID0gY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgREVUQUNIX0JVVFRPTik7Ci0JCQotCQlsYWJlbF9iYXNlLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkJBU0VfRUxFTUVOVF9URVhUKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQljdHJsX2F0dGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cKLQkJCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmF0dGFjaEd1aWRhbmNlRmlsZURpYWxvZ190aXRsZSk7IAotCQkJCVN0cmluZyBsYXN0RGlyID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldFN0cmluZygKLQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYpOwotCQkJCWlmIChsYXN0RGlyICE9IG51bGwgJiYgbGFzdERpci50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3REaXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aChndWlkYW5jZSkpOwotCQkJCX0KLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCWlmIChkaWFsb2cuZ2V0RmlsZU5hbWUoKSAhPSBudWxsICYmIGRpYWxvZy5nZXRGaWxlTmFtZSgpICE9ICIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgZmlsZVRvQXR0YWNoID0gbmV3IEZpbGUoZGlhbG9nLmdldEZpbHRlclBhdGgoKSwKLQkJCQkJCQkJZGlhbG9nLmdldEZpbGVOYW1lKCkpOwotCQkJCQkJU3RyaW5nIGZpbGVVcmwgPSBMaWJyYXJ5VUlVdGlsLmdldFVSTEZvckF0dGFjaG1lbnQoY3RybF9hdHRhY2guZ2V0U2hlbGwoKSwKLQkJCQkJCQkJZmlsZVRvQXR0YWNoLCBndWlkYW5jZSwgdHJ1ZSk7Ci0JCQkJCQlpZiAoZmlsZVVybCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gdXNlciBoaXQgY2FuY2VsIG9uIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWlmIChjdHJsX2F0dGFjaGVkX2ZpbGVzLmluZGV4T2YoZmlsZVVybCkgIT0gLTEpIHsKLQkJCQkJCQkvLyBmaWxlIGlzIGFscmVhZHkgYW4gYXR0YWNobWVudAotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXR0YWNobWVudERpYWxvZ2F0dGFjaEZpbGVfdGV4dCwgCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcm1zX0d1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlX2FscmVhZHlBdHRhY2hlZF9tc2cpOyAKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChmaWxlVXJsKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkJCQkJCQkJCS5zZXRWYWx1ZSgKLQkJCQkJCQkJCQkJR1VJREFOQ0VfQVRUQUNITUVOVF9MQVNUX0RJUkVDVE9SWV9CUk9XU0VEX1BSRUYsCi0JCQkJCQkJCQkJCWRpYWxvZy5nZXRGaWx0ZXJQYXRoKCkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hdHRhY2hfdXJsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFkZExpbmtEaWFsb2cgZGlhbG9nID0gbmV3IEFkZExpbmtEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCQotCQkJCQlpZiggZGlhbG9nLmdldExpbmsoKSAhPSBudWxsKSB7IAotCQkJCQkJCi0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBsaW5rVXJsID0gZGlhbG9nLmdldExpbmsoKS5nZXRVUkwoKTsKLQkJCQkJCQlTdHJpbmcgbGlua05hbWUgPSBkaWFsb2cuZ2V0TGluaygpLmdldE5hbWUoKTsKLQkJCQkJCQlpZiAobGlua05hbWUgPT0gbnVsbCB8fCBsaW5rTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCQlsaW5rTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGxpbmtVcmwpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlVUkwgdXJsID0gbmV3IFVSTChsaW5rVXJsKTsKLQkJCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQkJCQkJCWlmIChtdWUuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoIm5vIHByb3RvY29sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJbGlua1VybCA9IE5ldFV0aWwuSFRUUF9VUklfUFJFRklYICsgbGlua1VybDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gIjxhIGhyZWY9XCIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCQkJCQl1cmxTdHJpbmcgKz0gTmV0VXRpbAotCQkJCQkJCQkJCS5lbmNvZGVGaWxlVVJMKGxpbmtVcmwpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXVybFN0cmluZyArPSBOZXRVdGlsLmVuY29kZUZpbGVVUkwobGlua1VybCk7Ci0JCQkJCQkJfQotCQkJCQkJCXVybFN0cmluZyArPSAiXCI+IiArIGxpbmtOYW1lICsgIjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlsaW5rVXJsID0gdXJsU3RyaW5nOwotCQkJCQkJCS8vU3RyaW5nIGxpbmtEaXNwbGF5TmFtZSA9IGRpYWxvZy5nZXRMaW5rKCkuZ2V0TmFtZSgpOwkJCQkJCQkKLQkJCQkJCQkKLQkJCQkJCQlpZiAobGlua1VybCA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIHVzZXIgaGl0IGNhbmNlbCBvbiBBZGRMaW5rRGlhbG9nCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGN0cmxfYXR0YWNoZWRfZmlsZXMuaW5kZXhPZihsaW5rVXJsKSAhPSAtMSkgewotCQkJCQkJCQkvLyBJZiBsaW5rIGFscmVhZHkgZXhpc3RzCi0JCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJCS5kaXNwbGF5SW5mbygKLQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF0dGFjaG1lbnREaWFsb2dhdHRhY2hVcmxfdGV4dCwgCi0JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5mb3Jtc19HdWlkYW5jZVdpdGhVcmxBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZV9hbHJlYWR5QXR0YWNoZWRfbXNnKTsgCi0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQkJY3RybF9hdHRhY2hlZF9maWxlcy5hZGQobGlua1VybCk7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpLAotCQkJCQkJCQkJZ2V0RmlsZXNGcm9tTGlzdEN0cmwoKSwgLTEpOwotCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkvLyBUT0RPOiBEaXNwbGF5IGFuIGVycm9yIGRpYWxvZy4KLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQljdHJsX2RldGFjaC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2F0dGFjaGVkX2ZpbGVzLnJlbW92ZShjdHJsX2F0dGFjaGVkX2ZpbGVzCi0JCQkJCQkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCksCi0JCQkJCQlnZXRGaWxlc0Zyb21MaXN0Q3RybCgpLCAtMSk7Ci0KLQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkvLyBjdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJLy8gLy9jdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIFN0cmluZyBvbGRDb250ZW50ID0KLQkJLy8gKChHdWlkYW5jZURlc2NyaXB0aW9uKWd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpKS5nZXRBdHRhY2htZW50cygpOwotCQkvLyBjdHJsX2F0dGFjaGVkX2ZpbGVzLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJLy8gZ3VpZGFuY2UuZ2V0UHJlc2VudGF0aW9uKCksCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJLy8gY3RybF9hdHRhY2hlZF9maWxlcy5nZXRUZXh0KCksIC0xKTsKLQkJLy8gaWYoIXN0YXR1cyl7Ci0JCS8vIC8vY3RybF9hdHRhY2hlZF9maWxlcy5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9hdHRhY2guc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfYXR0YWNoX3VybC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9kZXRhY2guc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQotCQkvLyBjdHJsX3JlbW92ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlpZiAoZ3VpZGFuY2UgIT0gbnVsbCkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlTdHJpbmcgdGhpcmRwYXJ0eWZvcm1hdCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCXNldEZpbGVzVG9MaXN0Q3RybCh0aGlyZHBhcnR5Zm9ybWF0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgc3RyaW5nIG9mIGZpbGVzLCBhZGQgdGhlIGZpbGVzIHRvIHRoZSBMaXN0IGNvbnRyb2wKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RmlsZXNUb0xpc3RDdHJsKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCWphdmEudXRpbC5MaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbAotCQkJCS5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChmaWxlU3RyaW5nKTsKLQkJY3RybF9hdHRhY2hlZF9maWxlcy5yZW1vdmVBbGwoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBhdHRhY2htZW50ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQljdHJsX2F0dGFjaGVkX2ZpbGVzLmFkZChhdHRhY2htZW50KTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBmaWxlcyBhcyBhIHN0cmluZwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlc0Zyb21MaXN0Q3RybCgpIHsKLQkJU3RyaW5nIGZpbGVzW10gPSBjdHJsX2F0dGFjaGVkX2ZpbGVzLmdldEl0ZW1zKCk7Ci0JCXJldHVybiBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9TdHJpbmcoQXJyYXlzLmFzTGlzdChmaWxlcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JQ29sdW1uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSUNvbHVtblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTE2YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JQ29sdW1uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYmUgdXNlZCBhZGQgY29sdW1ucyBvbiBkZXNjcmlwdGlvbiB0YWIgb2YgYWxsIGVkaXRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29sdW1uUHJvdmlkZXIgICB7Ci0KLQotCS8qKgotCSAqIFNldCBjb2x1bW4gY29tcG9zaXRlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgZWRpdG9yCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZSBzZXRDb2x1bW4oTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IsIEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCS8qKgotCSAqIFJlZnJlc2ggc3RhdGUgb2YgYWxsIGNvbnRyb2xzCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIHZhbHVlKTsKLQkKLQkKLQkvKioKLQkgKiBEaXNwb3NlIHRoZSBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvSVJlZnJlc2hhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTZhNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9JUmVmcmVzaGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gcmVmcmVzaCBhIGZvcm0gdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW4gY2FzZSBvZiBtb2RlbCBjaGFuZ2Ugb3V0c2lkZSBvZiB0aGUgZm9ybQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hhYmxlIHsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIG5hbWUgb2YgdGhlIGZvcm0KLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXZvaWQgcmVmcmVzaE5hbWUoU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RGb3JtVG9vbGtpdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RGb3JtVG9vbGtpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE3NmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kRm9ybVRvb2xraXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotCi0vKioKLSAqIEEgaGVscCBjbGFzcyBmb3IgY3JlYXRpbmcgVUkgd2lkZ2V0cyBhZGFwdGVkIGFkYXB0ZWQgdG8gd29yayBpbiBFY2xpcHNlCi0gKiBmb3Jtcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RGb3JtVG9vbGtpdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgUmljaCBUZXh0IGNvbnRyb2wgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHRleHQgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlci4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGhyZWZzLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0PC9jb2RlPiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2RSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSwgU3RyaW5nIGJhc2VQYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBuZXcgTWV0aG9kUmljaFRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCQlyaWNoVGV4dC5pbml0KG1ldGhvZEVsZW1lbnQsIGxhYmVsKTsKLQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFJpY2ggVGV4dCBlZGl0b3IgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRyb2wuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSBpbml0aWFsIHRleHQgZm9yIHRoZSB2aWV3ZXIuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlci4KLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGhyZWZzLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SU1ldGhvZFJpY2hUZXh0RWRpdG9yPC9jb2RlPiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRob2RSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcigKLQkJCUZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUsCi0JCQlTdHJpbmcgYmFzZVBhdGgsIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCwgTGFiZWwgbGFiZWwsIElFZGl0b3JTaXRlIGVkaXRvclNpdGUpIHsKLQkJSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGVkaXRvciA9IG5ldyBNZXRob2RSaWNoVGV4dEVkaXRvcihwYXJlbnQsIHN0eWxlLAotCQkJCWJhc2VQYXRoLCBtZXRob2RFbGVtZW50LCBsYWJlbCwgZWRpdG9yU2l0ZSk7Ci0JCWVkaXRvci5nZXRDb250cm9sKCkuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsCi0JCQkJRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmY3YzM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIERlc2NyaXB0aW9uIHBhZ2UgZm9yIG1ldGhvZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5RGVzY3JpcHRpb25Gb3JtUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQgPSAyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfbmFtZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZ2VuZXJhbFNlY3Rpb247Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQlwcml2YXRlIFRleHQgdGV4dEF1dGhvcnM7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9jaGFuZ2VfZGF0ZTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NoYW5nZV9kZXNjOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2NvcHlyaWdodDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKAotCQkJCWVkaXRvciwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uUGFnZV90aXRsZSk7IAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQotCQkvLyBnZXQgTWV0aG9kTGlicmFyeSBvYmplY3QgZnJvbSBFZGl0b3IgaW5wdXQKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCi0JCU9iamVjdCBvYmogPSBtZXRob2RFbGVtZW50SW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJbGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSBvYmo7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBmb3JtIGNvbnRlbnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjY3JlYXRlRm9ybUNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCQkvLyBjcmVhdGUgZm9ybSB0b29sa2l0Ci0JCVNjcm9sbGVkRm9ybSBmb3JtID0gbWFuYWdlZEZvcm0uZ2V0Rm9ybSgpOwotCQlGb3JtVG9vbGtpdCB0b29sa2l0ID0gbWFuYWdlZEZvcm0uZ2V0VG9vbGtpdCgpOwotCQlmb3JtLnNldFRleHQoZ2V0RWRpdG9yKCkuZ2V0UGFydE5hbWUoKSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJZm9ybS5nZXRCb2R5KCkuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQ3JlYXRlIGVkaXRvciBjb250ZW50Ci0JCWNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCwgZm9ybS5nZXRCb2R5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlZGl0b3IgdGFiIGNvbnRlbnQKLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqIEBwYXJhbSBlZGl0b3JDb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZSkgewotCQkvLyBDcmVhdGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uCi0JCWdlbmVyYWxTZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKGVkaXRvckNvbXBvc2l0ZSwKLQkJCQlTZWN0aW9uLkRFU0NSSVBUSU9OIHwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRAotCQkJCQkJfCBTZWN0aW9uLlRJVExFX0JBUik7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldExheW91dERhdGEodGQpOwotCQlnZW5lcmFsU2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1ldGhvZExpYnJhcnlEZXNjcmlwdGlvbkZvcm1QYWdlX3NlY3Rpb25fdGl0bGUpOyAKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2Vfc2VjdGlvbl9kZXNjcmlwdGlvbik7IAotCQlnZW5lcmFsU2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxTZWN0aW9uKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0Q2xpZW50KGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5hbWVfdGV4dCk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWxfbmFtZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfbmFtZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULlNJTkdMRSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX25hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBicmllZiBkZXNjCi0JCUxhYmVsIGxfYnJpZWZfZGVzYyA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvbl90ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9icmllZl9kZXNjID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gNDAwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIEF1dGhvcnMKLQkJTGFiZWwgbGFiZWwgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXV0aG9yc190ZXh0KTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0ZXh0QXV0aG9ycyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQl0ZXh0QXV0aG9ycy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCS8vIENoYW5nZSBEYXRlCi0JCUxhYmVsIGxfY2hhbmdlZGF0ZSA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IERFRkFVTFRfVkVSVElDQUxfSU5ERU5UOwotCQkJbF9jaGFuZ2VkYXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGF0ZSA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCSIiLCBTV1QuUkVBRF9PTkxZKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBBdXRob3JzCi0JCUxhYmVsIGxfY2hhbmdlX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkNIQU5HRV9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NoYW5nZV9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9jaGFuZ2VfZGVzYyA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIiwgU1dULk1VTFRJKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDQwOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWN0cmxfY2hhbmdlX2Rlc2Muc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBWZXJzaW9uCi0JCUxhYmVsIGxfdmVyc2lvbiA9IHRvb2xraXQuY3JlYXRlTGFiZWwoZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQljdHJsX3ZlcnNpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5NVUxUSSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX3ZlcnNpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJTGFiZWwgbF9jb3B5cmlnaHQgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuY29weXJpZ2h0X3RleHQpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX2NvcHlyaWdodCA9IHRvb2xraXQuY3JlYXRlVGV4dChnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA0MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQljdHJsX2NvcHlyaWdodC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCi0JCWFkZExpc3RlbmVycygpOwotCQlsb2FkRGF0YSgpOwotCi0JCS8vIFNldCBmb2N1cyBvbiB0aGUgbmFtZSBhdHRyaWJ1dGUKLQkJRGlzcGxheSBkaXNwbGF5ID0gZWRpdG9yQ29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJaWYgKCEoZGlzcGxheSA9PSBudWxsIHx8IGRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZERhdGEoKSB7Ci0JCVN0cmluZyBuYW1lID0gbGlicmFyeS5nZXROYW1lKCk7Ci0JCVN0cmluZyBicmllZl9kZXNjID0gbGlicmFyeS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkJY3RybF9uYW1lLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobmFtZSkpOwotCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChicmllZl9kZXNjKSk7Ci0JCXRleHRBdXRob3JzLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRBdXRob3JzKCkpKTsKLQkJaWYgKGxpYnJhcnkuZ2V0Q2hhbmdlRGF0ZSgpICE9IG51bGwpIHsKLQkJCWN0cmxfY2hhbmdlX2RhdGUuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5LmdldENoYW5nZURhdGUoKQotCQkJCQkudG9Mb2NhbGVTdHJpbmcoKSkpOwotCQl9Ci0JCWN0cmxfY2hhbmdlX2Rlc2Muc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChsaWJyYXJ5Ci0JCQkJLmdldENoYW5nZURlc2NyaXB0aW9uKCkpKTsKLQkJY3RybF92ZXJzaW9uLnNldFRleHQoVG5nVXRpbC5jaGVja051bGwobGlicmFyeS5nZXRWZXJzaW9uKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgZm9jdXMgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlsaWJyYXJ5LnNldE5hbWUoY3RybF9uYW1lLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYnJpZWZfZGVzYy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRCcmllZkRlc2NyaXB0aW9uKGN0cmxfYnJpZWZfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQl0ZXh0QXV0aG9ycy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJbGlicmFyeS5zZXRBdXRob3JzKHRleHRBdXRob3JzLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfY2hhbmdlX2Rlc2MuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0Q2hhbmdlRGVzY3JpcHRpb24oY3RybF9jaGFuZ2VfZGVzYy5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3ZlcnNpb24uYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWxpYnJhcnkuc2V0VmVyc2lvbihjdHJsX3ZlcnNpb24uZ2V0VGV4dCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9jb3B5cmlnaHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZGQyYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5FZGl0b3JDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuVmlld0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZVJlZmVyZW5jZXNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5QbHVnaW5SZWZlcmVuY2VDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotCi0vKioKLSAqIERlc2NyaXB0aW9uIHBhZ2UgZm9yIG1ldGhvZCBwbHVnaW4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NjM4MgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSBpbXBsZW1lbnRzIElSZWZyZXNoYWJsZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BSRUZJWCA9IExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfUExVR0lOCi0JCQkrICI6ICI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfcl9icmllZl9kZXNjOwotCi0JcHJvdGVjdGVkIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9yZWZNb2RlbDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIHJlZk1vZGVsU2VjdGlvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcmVmTW9kZWxDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9jaGFuZ2VhYmxlOwotCi0JcHVibGljIGJvb2xlYW4gbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlciB1c2VyQ2hhbmdlYWJsZUFkYXB0ZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbmFtZU1vZGlmeUxpc3RlbmVyOwotCQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHJlZk1vZGVsU2VsQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkTGlzdCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlNZXRob2RQbHVnaW4gc2VsZWN0ZWRPYmogPSAoTWV0aG9kUGx1Z2luKSBzZWxlY3RlZExpc3QKLQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKHNlbGVjdGVkT2JqID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0VGV4dChzZWxlY3RlZE9iagotCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJfQotCX07Ci0JCi0JcHJvdGVjdGVkIElDaGVja1N0YXRlTGlzdGVuZXIgcmVmTW9kZWxDaGVja1N0YXRlTGlzdGVuZXIgPSBuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQkJY3RybF9yX2JyaWVmX2Rlc2Muc2V0VGV4dCgoKE1ldGhvZFBsdWdpbikgb2JqKQotCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQotCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQocGx1Z2luKSkgewotCQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChvYmosICFldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCS8vIFRPRE86IENoYW5nZSB0aGlzIHRvIGJlIG5vdCB1bi1kb2FibGUgZHVlIHRvIHRoZSBjaXJjdWxhcgotCQkJCS8vIGRlcGVuZGVuY3kgY2hlY2suCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgcGx1Z2luLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmosIC0xKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZmluYWwgTWV0aG9kUGx1Z2luIGJhc2UgPSAoTWV0aG9kUGx1Z2luKSBvYmo7Ci0JCQkJCi0JCQkJaWYocmVtb3ZlQWxsUmVmZXJlbmNlcyhiYXNlKSl7Ci0JCQkJCWN0cmxfcmVmTW9kZWwuc2V0Q2hlY2tlZChiYXNlLCBmYWxzZSk7Ci0JCQkJfWVsc2V7Ci0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKGJhc2UsIHRydWUpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvLyBjaGFuZ2UgdGhpcyB0byBiZSBub3QgdW4tZG9hYmxlIGR1ZSB0byB0aGUgY2lyY3VsYXIKLQkJCQkvLyBkZXBlbmRlbmN5IGNoZWNrCi0JCQkJLy8gcGx1Z2luLmdldEJhc2VzKCkucmVtb3ZlKG9iaik7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgcGx1Z2luLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJCQkoTWV0aG9kUGx1Z2luKSBvYmosIC0xKTsKLQkJCX0KLQotCQkJLy8gZG91YmxlIGNoZWNrIGNpcmN1bGFyIGRlcGVuZGVuY3ksIG5vdCBuZWNlc3NhcnkgaGVyZQotCQkJUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5oYXNDaXJjdWxhckNvbmZsaWN0V2l0aFBsdWdpbihwbHVnaW4pOwotCi0JCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCX0KLQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0KLQkJdXNlckNoYW5nZWFibGVBZGFwdGVyID0gbmV3IFVzZXJDaGFuZ2VhYmxlQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtZXRob2RFbGVtZW50OwotCQlpZiAodXNlckNoYW5nZWFibGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXBsdWdpbi5lQWRhcHRlcnMoKS5hZGQodXNlckNoYW5nZWFibGVBZGFwdGVyKTsKLQkJfQotCQlkZXRhaWxTZWN0aW9uT24gPSBmYWxzZTsKLQkJZnVsbERlc2NPbiA9IGZhbHNlOwotCQlrZXlDb25zaWRlcmF0aW9uT24gPSBmYWxzZTsKLQkJdmFyaWFiaWxpdHlTZWN0aW9uT24gPSBmYWxzZTsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJY3JlYXRlUmVmZXJlbmNlU2VjdGlvbih0b29sa2l0KTsKLQkJLy8gU2V0IGZvY3VzIG9uIHRoZSBOYW1lIHRleHQgY29udHJvbC4KLQkJRGlzcGxheSBkaXNwbGF5ID0gZm9ybS5nZXRCb2R5KCkuZ2V0RGlzcGxheSgpOwotCQlpZiAoIShkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZihjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSByZXR1cm47Ci0JCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVmZXJlbmNlQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0KLQkJVGFibGUgY3RybF90YWJsZSA9IHRvb2xraXQuY3JlYXRlVGFibGUocmVmTW9kZWxDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORwotCQkJCQl8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTAwOwotCQkJY3RybF90YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWN0cmxfcmVmTW9kZWwgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcihjdHJsX3RhYmxlKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfcmVmTW9kZWwuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQotCQljcmVhdGVSZWZNb2RlbEJyaWVmRGVzY0ZpZWxkKHRvb2xraXQpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHJlZk1vZGVsQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZWZNb2RlbEJyaWVmRGVzY0ZpZWxkKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJTGFiZWwgbF9yX2JyaWVmX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZUxhYmVsKHJlZk1vZGVsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWxfcl9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9yX2JyaWVmX2Rlc2MgPSB0b29sa2l0LmNyZWF0ZVRleHQocmVmTW9kZWxDb21wb3NpdGUsCi0JCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWN0cmxfcl9icmllZl9kZXNjLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVmZXJlbmNlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIFJlZiBNb2RlbCBTZWN0aW9uCi0JCXJlZk1vZGVsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uREVTQ1JJUFRJT04gfCBTZWN0aW9uLlRXSVNUSUUgfCBTZWN0aW9uLkVYUEFOREVECi0JCQkJCQl8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJR3JpZERhdGEgdGQxID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXJlZk1vZGVsU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkMSk7Ci0JCXJlZk1vZGVsU2VjdGlvbgotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9OQU1FKTsKLQkJcmVmTW9kZWxTZWN0aW9uCi0JCQkJLnNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJVGV4dC5SRUZFUkVOQ0VEX1BMVUdJTlNfU0VDVElPTl9ERVNDKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlyZWZNb2RlbENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHJlZk1vZGVsU2VjdGlvbik7Ci0JCXJlZk1vZGVsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZWZNb2RlbENvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJcmVmTW9kZWxTZWN0aW9uLnNldENsaWVudChyZWZNb2RlbENvbXBvc2l0ZSk7Ci0JCWNyZWF0ZVJlZmVyZW5jZUNvbnRlbnQodG9vbGtpdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2hlY2tib3hGb3JDdXJyZW50QmFzZShMaXN0PE1ldGhvZFBsdWdpbj4gY3VycmVudEJhc2VMaXN0KSB7Ci0JCWN0cmxfcmVmTW9kZWwuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudEJhc2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gbW9kZWwgPSAoTWV0aG9kUGx1Z2luKSBjdXJyZW50QmFzZUxpc3QuZ2V0KGkpOwotCQkJY3RybF9yZWZNb2RlbC5zZXRDaGVja2VkKG1vZGVsLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCi0JCWZpbmFsIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJcmVmcmVzaFJlZmVyZW5jZWRNb2RlbHMoKTsKLQotCQkJCWlmICghcGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJcmVmcmVzaChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVmcmVzaCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbmFtZS5yZW1vdmVGb2N1c0xpc3RlbmVyKG5hbWVGb2N1c0xpc3RlbmVyKTsKLQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHBsdWdpbiwgdHJ1ZSk7Ci0JCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX25hbWUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoY3RybF9uYW1lLmdldFRleHQoKS5lcXVhbHMocGx1Z2luLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIENoZWNrIGludmFsaWQgY2hhcmFjdGVycyBmaXJzdC4KLQkJCQkKLQkJCQkvLyAxNzg0NjIKLQkJCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCQlTdHJpbmcgbmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJaWYgKG9sZENvbnRlbnQuaW5kZXhPZigiJiIpIDwgMCAmJiBuYW1lLmluZGV4T2YoIiYiKSA+IC0xKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJbXNnID0gTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJCQkJbmFtZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQltc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUobnVsbCwgbmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIHZhbGlkTmFtZSA9IFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUoY3RybF9uYW1lCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJLy8gQ2hlY2sgZHVwbGljYXRlIHBsdWctaW4gbmFtZS4KLQkJCQkJbXNnID0gTGlicmFyeVV0aWwuY2hlY2tQbHVnaW5OYW1lKHBsdWdpbiwgdmFsaWROYW1lKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQkJCWlmICghdmFsaWROYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCQkJCW1zZyA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luRGVzY3JpcHRpb25QYWdlX2NvbmZpcm1SZW5hbWUsIChuZXcgT2JqZWN0W10geyBwbHVnaW4uZ2V0TmFtZSgpLCBjdHJsX25hbWUuZ2V0VGV4dCgpIH0pKTsgCi0JCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY29uZmlybVJlbmFtZV90aXRsZTsgCi0JCQkJCQlpZiAoIU1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oc2hlbGwsIHRpdGxlLCBtc2cpKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldFRleHQocGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmNsb3NlTWV0aG9kRWRpdG9yc0ZvclBsdWdpbkVsZW1lbnRzKHBsdWdpbik7Ci0JCQkJCQljdHJsX25hbWUuc2V0VGV4dCh2YWxpZE5hbWUpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQlwbHVnaW4sIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHZhbGlkTmFtZSwgLTEpOwotCi0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWZvcm0uc2V0VGV4dChGT1JNX1BSRUZJWCArIHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCi0JCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZSBlZGl0b3IKLQkJCQkJCS8vCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkJCQkJZWRpdG9yLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGVkaXRvcgotCQkJCQkJCQkJCS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCXBlcnNpc3RlcgotCQkJCQkJCQkJCQkuYWRqdXN0TG9jYXRpb24ocGx1Z2luLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQkJCQkJCQlWaWV3SGVscGVyCi0JCQkJCQkJCQkJCQkucmVsb2FkQ3VycmVudExpYmFyeU9uUm9sbGJhY2tFcnJvcihnZXRTaXRlKCkKLQkJCQkJCQkJCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJCQkJCQkJCQkJLmdldFRleHQoKSwKLQkJCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfY2Fubm90UmVuYW1lUGx1Z2luRm9sZGVyCi0JCQkJCQkJCQkJCQkJLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfbmFtZS5zZXRUZXh0KHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJCXNoZWxsLmdldFRleHQoKSwgbXNnKTsKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfbmFtZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQljdHJsX25hbWUuc2VsZWN0QWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQl9KTsKLQotCi0KLQkJYWRkUmVmZXJlbmNlZE1vZGVsTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VkTW9kZWxMaXN0ZW5lcigpIHsKLQkJY3RybF9yZWZNb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocmVmTW9kZWxTZWxDaGFuZ2VkTGlzdGVuZXIpOwotCi0JCWN0cmxfcmVmTW9kZWwuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHJlZk1vZGVsQ2hlY2tTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJc3VwZXIucmVmcmVzaChlZGl0YWJsZSk7Ci0JCWN0cmxfcl9icmllZl9kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBWZXJzaW9uIHNlY3Rpb24gY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVWZXJzaW9uU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZVZlcnNpb25TZWN0aW9uQ29udGVudCgpOwotCi0JCWN0cmxfY2hhbmdlYWJsZSA9IHRvb2xraXQKLQkJCQkuY3JlYXRlQnV0dG9uKAotCQkJCQkJdmVyc2lvbkNvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbkRlc2NyaXB0aW9uUGFnZV9sb2NrUGx1Z2luTGFiZWwsIFNXVC5DSEVDSyk7IAotCi0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uU2VjdGlvbkxpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkVmVyc2lvblNlY3Rpb25MaXN0ZW5lcnMoKTsKLQotCQljdHJsX2NoYW5nZWFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0KLQkJCQkKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHBsdWdpbiwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2VfbG9ja1BsdWdpbl9tZXNzYWdlLAotCQkJCQkJCQkJcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihzaGVsbC5nZXRUZXh0KCksIG1lc3NhZ2UpKSB7Ci0JCQkJCQkvLyBjbG9zZSBlZGl0b3JzIG9uIGFueSBjaGFuZ2UgaW4gY3RybF9jaGFuZ2VhYmxlCi0JCQkJCQkvLyBpZiAoY3RybF9jaGFuZ2VhYmxlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VNZXRob2RFZGl0b3JzRm9yUGx1Z2luRWxlbWVudHMocGx1Z2luKTsKLQkJCQkJCWJvb2xlYW4gcmV0ID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJcGx1Z2luLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwKLQkJCQkJCQkJbmV3IEJvb2xlYW4oIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSksCi0JCQkJCQkJCS0xKTsKLQkJCQkJCS8vIGluIGNhc2Ugb2YgcmVhZG9ubHkgZmlsZSwgcm9sbCBiYWNrIGNoYW5nZXMuCi0JCQkJCQlpZiAoIXJldCkgewotCQkJCQkJCWN0cmxfY2hhbmdlYWJsZS5zZXRTZWxlY3Rpb24oIWN0cmxfY2hhbmdlYWJsZQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIH0KLQkJCQkJCXJlZnJlc2goIWN0cmxfY2hhbmdlYWJsZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBhY3Rpb25NZ3IudW5kbygpOwotCQkJCQkJY3RybF9jaGFuZ2VhYmxlLnNldFNlbGVjdGlvbighY3RybF9jaGFuZ2VhYmxlCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCQlyZWZyZXNoKCFjdHJsX2NoYW5nZWFibGUuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJLy8gcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0RGlhbG9nX3RpdGxlLAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfbXNnQ2Fubm90RWRpdCwKLQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWNvcHlyaWdodF92aWV3ZXIucmVmcmVzaCgpOwotCQkJCQotCQkJCS8vIHJlZnJlc2ggZWRpdG9yIHRpdGxlIGltYWdlLiAKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpZ2V0RWRpdG9yKCkpLnJlZnJlc2hUaXRsZUltYWdlKCk7Ci0JCQl9Ci0KLQkJCQotCQl9KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKSB7Ci0JCXN1cGVyLmxvYWRWZXJzaW9uU2VjdGlvbkRhdGEoKTsKLQkJY3RybF9jaGFuZ2VhYmxlCi0JCQkJLnNldFNlbGVjdGlvbighcGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBVc2VyQ2hhbmdlYWJsZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZFBsdWdpbi5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCXNldFVzZXJDaGFuZ2VhYmxlKGIuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4gdXNlckNoYW5nZWFibGUpIHsKLQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJcmV0dXJuOwotCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCXBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuLnZhbHVlT2YodXNlckNoYW5nZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlwbHVnaW4uZUFkYXB0ZXJzKCkucmVtb3ZlKHVzZXJDaGFuZ2VhYmxlQWRhcHRlcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBNZXRob2RQbHVnaW4gPGNvZGU+YmFzZTwvY29kZT4gaXMgb25lIGluIHRoZSBnaXZlbgotCSAqIHBsdWdpbnMgY29sbGVjdGlvbiBvciBiYXNlIG9mIGFueSBwbHVnaW4gaW4gdGhlIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gcGx1Z2lucwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNPbmVPckJhc2VPZihNZXRob2RQbHVnaW4gYmFzZSwgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luIDogcGx1Z2lucykgewotCQkJaWYoYmFzZSA9PSBwbHVnaW4gfHwgTWlzYy5pc0Jhc2VPZihiYXNlLCBwbHVnaW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFsbFJlZmVyZW5jZXMoTWV0aG9kUGx1Z2luIHVuQ2hlY2tlZFBsdWdpbikgewotCQlBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPiByZW1vdmVkQmFzZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJcmVtb3ZlZEJhc2VzLmFkZCh1bkNoZWNrZWRQbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxNZXRob2RQbHVnaW4+KHVuQ2hlY2tlZFBsdWdpbiwgZmFsc2UpIHsKLQkJCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pb2JqZWN0KS5nZXRCYXNlcygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4gZW1wdHkgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJCQlyZXR1cm4gZW1wdHkuaXRlcmF0b3IoKTsKLQkJCX0KLQkJCi0JCX07IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGJhc2UgPSBpdGVyLm5leHQoKTsKLQkJCUFycmF5TGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4ocGx1Z2luLmdldEJhc2VzKCkpOwotCQkJcGx1Z2lucy5yZW1vdmUodW5DaGVja2VkUGx1Z2luKTsKLQkJCWlmKCFpc09uZU9yQmFzZU9mKGJhc2UsIHBsdWdpbnMpKSB7Ci0JCQkJcmVtb3ZlZEJhc2VzLmFkZChiYXNlKTsKLQkJCX0KLQkJfQotCQkKLQkJQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4gYWZmZWN0ZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCQotCQkvLyBnZXQgYWxsIHBsdWctaW5zIGluIGxpYnJhcnkgdGhhdCBleHRlbmQgdGhpcyBwbHVnLWluCi0JCS8vCi0JCUxpc3Q8Pz4gcGx1Z2lucyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBtcCA9IChNZXRob2RQbHVnaW4pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1wICE9IHBsdWdpbiAmJiBNaXNjLmlzQmFzZU9mKHBsdWdpbiwgbXApKSB7CQkJCQotCQkJCWFmZmVjdGVkUGx1Z2lucy5hZGQobXApOwotCQkJfQotCQl9Ci0JCQotCQlBcnJheUxpc3Q8UmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQ+IGNvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZD4oKTsKLQkJZm9yIChNZXRob2RQbHVnaW4gYmFzZSA6IHJlbW92ZWRCYXNlcykgewkJCQotCQkJaWYoVW1hVXRpbC5oYXNSZWZlcmVuY2UocGx1Z2luLCBiYXNlKSkgewotCQkJCWNvbW1hbmRzLmFkZChuZXcgUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQocGx1Z2luLCBiYXNlKSk7Ci0JCQl9Ci0JCQlmb3IgKE1ldGhvZFBsdWdpbiBtcCA6IGFmZmVjdGVkUGx1Z2lucykgewotCQkJCUFycmF5TGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KG1wLmdldEJhc2VzKCkpOwotCQkJCWJhc2VzLnJlbW92ZShiYXNlKTsKLQkJCQlpZighaXNPbmVPckJhc2VPZihiYXNlLCBiYXNlcykgJiYgVW1hVXRpbC5oYXNSZWZlcmVuY2UobXAsIGJhc2UpKSB7Ci0JCQkJCWNvbW1hbmRzLmFkZChuZXcgUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQobXAsIGJhc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RQbHVnaW5EZXNjcmlwdGlvblJlbW92ZVJlZkNvbmZpcm1fbWVzc2FnZSwKLQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHNoZWxsLmdldFRleHQoKSwgbWVzc2FnZSkpIHsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewotCQkJCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkvLyB1bmRvIHRoZSBleGVjdXRlZCBjb21tYW5kcwotCQkJCQlmb3IgKDsgaSA+IDA7IGktLSkgewotCQkJCQkJYWN0aW9uTWdyLnVuZG8oKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnBsdWdpbl9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucGx1Z2luX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFJlZmVyZW5jZWRNb2RlbHMoKSB7Ci0JCS8vIENsZWFyIHRoZSBvbGQgaXRlbXMgYW5kIGFkZCB0aGUgbmV3bHkgYWxsb3dhYmxlIGl0ZW1zLgotCQljdHJsX3JlZk1vZGVsLmdldFRhYmxlKCkuY2xlYXJBbGwoKTsKLQkJY3RybF9yZWZNb2RlbC5yZWZyZXNoKCk7Ci0KLQkJTGlzdCBhbGxvd2FibGVMaXN0ID0gUGx1Z2luUmVmZXJlbmNlQ2hlY2tlcgotCQkJCS5nZXRBcHBsaWNhYmxlQmFzZVBsdWdpbnMocGx1Z2luKTsKLQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KGFsbG93YWJsZUxpc3QsIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCWN0cmxfcmVmTW9kZWwuYWRkKGFsbG93YWJsZUxpc3QudG9BcnJheSgpKTsKLQotCQlMaXN0PE1ldGhvZFBsdWdpbj4gY3VycmVudEJhc2VMaXN0ID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCXNldENoZWNrYm94Rm9yQ3VycmVudEJhc2UoY3VycmVudEJhc2VMaXN0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1ByYWN0aWNlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZWIwNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZURlc2NyaXB0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgaW4gYSBQcmFjdGljZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlIHsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfYWRkaXRpb25hbF9pbmZvLCBjdHJsX3Byb2JsZW0sCi0JCQljdHJsX2JhY2tncm91bmQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2dvYWxzLCBjdHJsX2FwcGxpY2F0aW9uLCBjdHJsX2xldmVsc19hZG9wdGlvbjsKLQotCXByaXZhdGUgUHJhY3RpY2UgZ3VpZGFuY2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCWd1aWRhbmNlID0gKFByYWN0aWNlKSBjb250ZW50RWxlbWVudDsKLQkJc2V0Q29udGVudEZpZWxkSGVpZ2h0KDIwMCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2NyZWF0ZUVkaXRvckNvbnRlbnQob3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQotCQljdHJsX2FkZGl0aW9uYWxfaW5mbyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFERElUSU9OQUxfSU5GT19URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJY3RybF9nb2FscyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkdPQUxTX1RFWFQsIDQwLCA0MDAsCi0JCQkJREVUQUlMX1NFQ1RJT05fSUQpOwotCQljdHJsX2FwcGxpY2F0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuQVBQTElDQVRJT05fVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfcHJvYmxlbSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlBST0JMRU1fVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfYmFja2dyb3VuZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkJBQ0tHUk9VTkRfVEVYVCwgNDAsIDQwMCwKLQkJCQlERVRBSUxfU0VDVElPTl9JRCk7Ci0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTEVWRUxfT0ZfQURPUFRJT05fVEVYVCwgNDAsCi0JCQkJNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7Ci0KLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlRGVzY3JpcHRpb25QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJZmluYWwgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yCi0JCQkJLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGd1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpKTsKLQotCQljdHJsX2FkZGl0aW9uYWxfaW5mbwotCQkJCS5zZXRNb2RhbE9iamVjdCgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9hZGRpdGlvbmFsX2luZm8uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSk7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYWRkaXRpb25hbF9pbmZvLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hZGRpdGlvbmFsX2luZm87Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBZGRpdGlvbmFsSW5mbygpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYXBwbGljYXRpb24KLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hcHBsaWNhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfYXBwbGljYXRpb247Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBcHBsaWNhdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfZ29hbHMuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2dvYWxzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkpOwotCQljdHJsX2dvYWxzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfZ29hbHMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2dvYWxzOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0R29hbHMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpLAotCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Byb2JsZW0uc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Byb2JsZW0uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpKTsKLQkJY3RybF9wcm9ibGVtLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJvYmxlbS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHJvYmxlbTsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQcm9ibGVtKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2JhY2tncm91bmQKLQkJCQkuc2V0TW9kYWxPYmplY3QoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfYmFja2dyb3VuZC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkpOwotCQljdHJsX2JhY2tncm91bmQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9iYWNrZ3JvdW5kLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9iYWNrZ3JvdW5kOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEJhY2tncm91bmQoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfbGV2ZWxzX2Fkb3B0aW9uCi0JCQkJLnNldE1vZGFsT2JqZWN0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2xldmVsc19hZG9wdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfbGV2ZWxzX2Fkb3B0aW9uOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldExldmVsc09mQWRvcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQuZ2V0VGV4dCgpCi0JCQkJCQk6IGN0cmxfbGV2ZWxzX2Fkb3B0aW9uLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQljdHJsX2FkZGl0aW9uYWxfaW5mby5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWN0cmxfYXBwbGljYXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2dvYWxzLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9wcm9ibGVtLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9sZXZlbHNfYWRvcHRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX2JhY2tncm91bmQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgaW5pdGlhbCBkYXRhIGZyb20gbW9kZWwKLQkgKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0JCWlmIChndWlkYW5jZSAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWN0cmxfYWRkaXRpb25hbF9pbmZvCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QWRkaXRpb25hbEluZm8oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFkZGl0aW9uYWxJbmZvKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3Byb2JsZW0KLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRQcm9ibGVtKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2JhY2tncm91bmQKLQkJCQkJLnNldFRleHQoZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkgPT0gbnVsbCA/ICIiIDogZ3VpZGFuY2VEZXNjcmlwdGlvbi5nZXRCYWNrZ3JvdW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2FwcGxpY2F0aW9uCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0QXBwbGljYXRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEFwcGxpY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2dvYWxzCi0JCQkJCS5zZXRUZXh0KGd1aWRhbmNlRGVzY3JpcHRpb24uZ2V0R29hbHMoKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldEdvYWxzKCkpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2xldmVsc19hZG9wdGlvbgotCQkJCQkuc2V0VGV4dChndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSA9PSBudWxsID8gIiIgOiBndWlkYW5jZURlc2NyaXB0aW9uLmdldExldmVsc09mQWRvcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJhY3RpY2VSZWZlcmVuY2VzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4M2U1ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9QcmFjdGljZVJlZmVyZW5jZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJlZmVyZW5jZXMgcGFnZSBpbiB0aGUgUHJhY3RpY2UgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInByYWN0aWNlUmVmZXJlbmNlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFByYWN0aWNlIHByYWN0aWNlOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcmFjdGljZVJlZmVyZW5jZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUkVGRVJFTkNFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXByYWN0aWNlID0gKFByYWN0aWNlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlsaXN0LmFkZEFsbChwcmFjdGljZS5nZXRDb250ZW50UmVmZXJlbmNlcygpKTsKLQkJCQlsaXN0LmFkZEFsbChwcmFjdGljZS5nZXRBY3Rpdml0eVJlZmVyZW5jZXMoKSk7Ci0JCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSwgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHByYWN0aWNlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5PTkxZX0NPTlRFTlRfRUxFTUVOVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQWxsRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgcmV0dXJuIGZhbHNlOwotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIAotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJhY3RpY2VSZWZlcmVuY2VzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByYWN0aWNlUmVmZXJlbmNlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5wcmFjdGljZVJlZmVyZW5jZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3OGVhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi5maWd1cmVzLkNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNlbGxlZGl0b3JzLkFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2VsbGVkaXRvcnMuUHJvY2Vzc0NoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRlY29yYXRpbmdMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIEJyZWFkb3duIHN0cnVjdHVyZSBlZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UgZXh0ZW5kcyBQcm9jZXNzRm9ybVBhZ2UKLQkJaW1wbGVtZW50cyBJVmlld2VyUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhUX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRYVF9GQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFQ2xhc3M+IEVDTEFTU0VTOwotCQotCXByaXZhdGUgaW50IHRhYkluZGV4ID0gMDsKLQkKLQlzdGF0aWMgewotCQlFQ0xBU1NFUyA9IG5ldyBBcnJheUxpc3Q8RUNsYXNzPigpOwotCQlFQ0xBU1NFUy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMKLQkJCVZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29sb3JQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBEZWNvcmF0aW5nTGFiZWxQcm92aWRlciBkZWNvcmF0aW5nTGFiZWxQcm92aWRlcjsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICovCi0JCXB1YmxpYyBQcm9jZXNzQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcigKLQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSksCi0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGVjb3JhdG9yTWFuYWdlcigpLmdldExhYmVsRGVjb3JhdG9yKCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsJCQkKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWRlY29yYXRpbmdMYWJlbFByb3ZpZGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQkJCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlpZihjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGdldEltYWdlKG9iamVjdCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEZvcmVncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoaXNTdXBwcmVzc2VkKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIENvbG9ycy5TVVBSRVNTRURfRUxFTUVOVF9MQUJFTDsKLQkJCX0KLQkJCWVsc2UgaWYgKGlzRXh0ZXJuYWwoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gQ29sb3JzLklOSEVSSVRFRF9FTEVNRU5UX0xBQkVMOwotCQkJfQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwcmVzc2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3Npb24oKQotCQkJCQkJLmlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZCgKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VkaXRvcikgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlLnRoaXMKLQkJCQkJLmdldEVkaXRvcigpKS5nZXRTdXBwcmVzc2lvbigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIENvbG9yIGdldEJhY2tncm91bmQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCS8vIGxldCBPUyB0YWtlIGNvbnRyb2wgb3ZlciB0cmVlIHdpZGdldCBiYWNrZ3JvdW5kCi0JCQkvLyByYXRoZXIgdGhhbiBzZW5kaW5nIG9uZSBmaXhlZCBiYWNrZ3JvdW5kLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQudXRpbC5WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyI2lzRXh0ZXJuYWwoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChlbGVtZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNnZXRGb250KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoaXNFeHRlcm5hbChlbGVtZW50KSkgewotCQkJCXJldHVybiBpdGFsaWNGb250OwotCQkJfQotCQkJcmV0dXJuIHJlZ3VsYXJGb250OwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlkZWNvcmF0aW5nTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JCQlzdXBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGV4dGVuZHMgVGV4dENlbGxFZGl0b3IgewotCQlwcm90ZWN0ZWQgT2JqZWN0IGxhc3RJbnZhbGlkRWxlbWVudDsKLQotCQlwcml2YXRlIGludCBjb2x1bW5JbmRleDsKLQotCQkvKioKLQkJICogQHBhcmFtIHBhcmVudAotCQkgKi8KLQkJcHVibGljIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXgoaW50IGNvbHVtbkluZGV4KSB7Ci0JCQl0aGlzLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbHVtbkluZGV4KCkgewotCQkJcmV0dXJuIGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRMYXN0SW52YWxpZEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbGFzdEludmFsaWRFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGlzVmFsaWQoU3RyaW5nIHR4dCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCBlID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBtc2cgPSBpc1ZhbGlkKGUsIHR4dCk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGFzdEludmFsaWRFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBpc1ZhbGlkKE9iamVjdCBlLCBTdHJpbmcgdHh0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ2VsbEVkaXRvclZhbGlkYXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBDZWxsRWRpdG9yVmFsaWRhdG9yKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCQlyZXR1cm4gY2VsbEVkaXRvci5pc1ZhbGlkKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJcHVibGljIFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIoVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3IpIHsKLQkJCXRoaXMuY2VsbEVkaXRvciA9IGNlbGxFZGl0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGNlbGxFZGl0b3IuZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0UHJvY2Vzc0VsZW1lbnRFcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JCQkJCQl2aWV3ZXIuZWRpdEVsZW1lbnQoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSwKLQkJCQkJCQkJY2VsbEVkaXRvci5nZXRDb2x1bW5JbmRleCgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIgZXh0ZW5kcyBGb2N1c0FkYXB0ZXIgewotCS8vIHByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0JLy8KLQkvLyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JLy8gdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JLy8gRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkvLwotCS8vIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkvLyBpZiAoY2VsbEVkaXRvci5nZXRMYXN0SW52YWxpZEVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JLy8gQXV0aG9yaW5nVUlQbHVnaW4KLQkvLyAuZ2V0RGVmYXVsdCgpCi0JLy8gLmdldE1zZ0RpYWxvZygpCi0JLy8gLmRpc3BsYXlFcnJvcigKLQkvLyBBdXRob3JpbmdVSVJlc291cmNlcwotCS8vIC5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLmVkaXRQcm9jZXNzRWxlbWVudEVycm9yRGlhbG9nLnRpdGxlIiksCi0JLy8gLy8kTk9OLU5MUy0xJAotCS8vIGNlbGxFZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCkpOwotCS8vIHZpZXdlci5lZGl0RWxlbWVudChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpLAotCS8vIGNlbGxFZGl0b3IuZ2V0Q29sdW1uSW5kZXgoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIH0pOwotCS8vIH0KLQkvLyB9Ci0KLQkvLyBwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiB2YWxpZE5hbWVQcm9tcHRlZCA9IGZhbHNlOwotCS8vIHByaXZhdGUgaW50IHByb21wdENvdW50ID0gMDsKLQotCS8vIHByaXZhdGUgTWV0aG9kRWxlbWVudCBwcm9tcHRlZEVsZW1lbnQ7Ci0KLQkvLyBwcml2YXRlIFRhYmxlVHJlZVZpZXdlciB0YWJsZVRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvLyBwcml2YXRlIGludCB0YWJJbmRleDsKLQotCS8vIHByaXZhdGUgT2JqZWN0IHRhYkZvbGRlcjsKLQotCXByb3RlY3RlZCBQcm9jZXNzVmlld2VyIHZpZXdlcjsKLQotCXByb3RlY3RlZCBUZXh0Q2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgbmFtZUNlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIHByZWRMaXN0Q2VsbEVkaXRvcjsKLQotCXByb3RlY3RlZCBDb21ib0JveENlbGxFZGl0b3IgY29tYm9Cb3hDZWxsRWRpdG9yOwotCi0JcHJvdGVjdGVkIENoZWNrYm94Q2VsbEVkaXRvciBjaGVja0JveENlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yOwotCi0JLy8gcHJpdmF0ZSBIYXNoTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVhZE9ubHk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVkaXRvcgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0aXRsZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IsIFN0cmluZyBpZCwKLQkJCVN0cmluZyB0aXRsZSkgewotCQlzdXBlcihlZGl0b3IsIGlkLCB0aXRsZSk7Ci0JfQotCQotCS8qKgotCSAqIElmIHJldHVybnMgdHJ1ZSwgZWRpdGluZyBpcyBkaXNhYmxlZCBvciBub3QgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2VzcyAKLQkgKiBicmVha2Rvd24gc3RydWN0dXJlLgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCWlmIChpc1JlYWRPbmx5KSB7Ci0JCQlyZXR1cm4gaXNSZWFkT25seTsKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5pc0xvY2tlZChwcm9jZXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgcmV0dXJucyB0cnVlLCBlZGl0aW5nIGlzIGRpc2FibGVkIG9yIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzIAotCSAqIGJyZWFrZG93biBzdHJ1Y3R1cmUuCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gYmFzaWNJc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNSZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGUgbW9kaWZ5aW5nIHByb2Nlc3MgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqIAotCSAqIEBwYXJhbSBpc1JlYWRPbmx5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiBpc1JlYWRPbmx5KSB7Ci0JCXRoaXMuaXNSZWFkT25seSA9IGlzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIGl0ZW0gcHJvdmlkZXIgZm9yIGVhY2ggZWxlbWVudCBpbiAKLQkgKiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFNldHMgY29sdW1uIGRlc2NyaXB0b3JzIHRvIGRlZmluZSB0aGUgY29sdW1ucyBvZiB0aGUgdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uRGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZXNjcmlwdG9ycyhDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMpIHsKLQkJdGhpcy5jb2x1bW5EZXNjcmlwdG9ycyA9IGNvbHVtbkRlc2NyaXB0b3JzOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJTWFwPEludGVnZXIsIFN0cmluZz4gY29sdW1uSW5kZXhUb05hbWVNYXAgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJY29sdW1uSW5kZXhUb05hbWVNYXAucHV0KG5ldyBJbnRlZ2VyKGkpLAotCQkJCQkJY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQpOwotCQkJfQotCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFRleHQoQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQlMaXN0PFdvcmtPcmRlcj4gYWRkTGlzdCA9IG5ldyBBcnJheUxpc3Q8V29ya09yZGVyPigpOwotCQkJTGlzdDxXb3JrT3JkZXI+IHByZWRUb0JlRGVsZXRlZCA9IG5ldyBBcnJheUxpc3Q8V29ya09yZGVyPigpOwotCQkJaWYoUHJlZGVjZXNzb3JMaXN0LnByZXBhcmVVcGRhdGVQcmVkZWNlc3NvcnMoYWRhcHRlckZhY3RvcnksIHdiZSwgdHh0LCBhZGRMaXN0LCBwcmVkVG9CZURlbGV0ZWQpKSB7Ci0JCQkJaWYoIXByZWRUb0JlRGVsZXRlZC5pc0VtcHR5KCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCXdiZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCXByZWRUb0JlRGVsZXRlZCwgLTEpOwotCQkJCX0KLQkJCQlpZighYWRkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJCQl3YmUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCWFkZExpc3QsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJUHJvY2Vzc1V0aWwuc2V0QXR0cmlidXRlKGFjdGlvbk1nciwgZSwgcHJvcCwgdHh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRleHQoQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgcHJvcCkgewotCQkvLyBoYW5kbGUgZWRpdGluZyBwcmVzZW50YXRpb24gbmFtZSBvZiBleHRlbmRpbmcvY29udHJpYnV0aW5nIGFjdGl2aXR5Ci0JCS8vIHNwZWNpYWxseQotCQkvLwotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FCi0JCQkJJiYgUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCXJldHVybiAoKERlc2NyaWJhYmxlRWxlbWVudCkgZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQl9Ci0KLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChlLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZShlLCBwcm9wKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGFiIGluZGV4IGZvciB0aGUgZm9ybSBwYWdlCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFiSW5kZXgoaW50IGlkKSB7Ci0JCSB0YWJJbmRleCA9IGlkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGFiIGluZGV4IGZvciB0aGUgZm9ybSBwYWdlCi0JICovCi0JcHVibGljIGludCBnZXRUYWJJbmRleCgpIHsKLQkJcmV0dXJuIHRhYkluZGV4OwotCX0KLQotCS8qKgotCSAqIFNldCB0YWIgZm9sZGVyCi0JICogQHBhcmFtIHRhYkZvbGRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYkZvbGRlcihDVGFiRm9sZGVyIHRhYkZvbGRlcikgewotCQkvLyB0aGlzLnRhYkZvbGRlciA9IHRhYkZvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNjcmVhdGVGb3JtQ29udGVudChvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCS8vIGNyZWF0ZSBmb3JtIHRvb2xraXQKLQkJU2Nyb2xsZWRGb3JtIGZvcm0gPSBtYW5hZ2VkRm9ybS5nZXRGb3JtKCk7Ci0JCUZvcm1Ub29sa2l0IHRvb2xraXQgPSBtYW5hZ2VkRm9ybS5nZXRUb29sa2l0KCk7Ci0JCWZvcm0uc2V0VGV4dChnZXRFZGl0b3IoKS5nZXRQYXJ0TmFtZSgpKTsKLQotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlTZWN0aW9uIHNlY3Rpb24gPSB0b29sa2l0LmNyZWF0ZVNlY3Rpb24oZm9ybS5nZXRCb2R5KCksCi0JCQkJU2VjdGlvbi5FWFBBTkRFRCB8IFNlY3Rpb24uVElUTEVfQkFSKTsKLQkJVGFibGVXcmFwRGF0YSB0ZCA9IG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCLAotCQkJCVRhYmxlV3JhcERhdGEuRklMTF9HUkFCKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJc2VjdGlvbgotCQkJCS5zZXRUZXh0KGdldFRpdGxlKCkKLQkJCQkJCSsgIiAiICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlX0JTRWRpdG9yKTsgLy8kTk9OLU5MUy0xJCAKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQkvLyBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJQ29udHJvbCBjb250cm9sID0gY3JlYXRlQ29udHJvbChjb21wb3NpdGUpOwotCQl0b29sa2l0LmFkYXB0KGNvbnRyb2wsIHRydWUsIHRydWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNjAwOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVByb2Nlc3NFZGl0b3IgZWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIGdldEVkaXRvcigpOwotCQkvLyBlZGl0b3IuY3JlYXRlQ29udGV4dE1lbnVGb3IodGFibGVUcmVlVmlld2VyKTsKLQkJZWRpdG9yLmNyZWF0ZUNvbnRleHRNZW51Rm9yKHZpZXdlcik7Ci0KLQkJc2V0SW5wdXQocHJvY2Vzcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGUgY29udHJvbAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJQ29udHJvbAotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyB0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJLy8gVGhpcyBpcyB0aGUgcGFnZSBmb3IgdGhlIHRhYmxlIHRyZWUgdmlld2VyLgotCQkvLwotCQlDb21wb3NpdGUgY29tcCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl2aWV3ZXIgPSBuZXcgUHJvY2Vzc1ZpZXdlcihjb21wLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdmlld2VyLnNldHVwQ29sdW1ucyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOwotCi0KLQkJdmlld2VyLnNldEFjdGlvbk1hbmFnZXIoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCS5nZXRBY3Rpb25NYW5hZ2VyKCkpOwotCi0JCXRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHZpZXdlci5nZXRDZWxsRWRpdG9yUGFyZW50KCkpOwotCQljb21ib0JveENlbGxFZGl0b3IgPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKHZpZXdlcgotCQkJCS5nZXRDZWxsRWRpdG9yUGFyZW50KCksIG5ldyBTdHJpbmdbXSB7IFRYVF9UUlVFLCBUWFRfRkFMU0UgfSk7Ci0JCWNoZWNrQm94Q2VsbEVkaXRvciA9IG5ldyBDaGVja2JveENlbGxFZGl0b3Iodmlld2VyCi0JCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSk7Ci0KLQkJLy9zZXQgYWxsIGVkaXRvcnMgYW5kIG1vZGlmaWVycwotCQlzZXRBbGxFZGl0b3JzQW5kTW9kaWZpZXJzKCk7Ci0JCQotCQl2aWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDMpOwotCQl2aWV3ZXIuc2V0SW5wdXQocHJvY2Vzcyk7Ci0KLS8vCQkgaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSA7Ci0vLwkJIFRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBUTkdPYmpUcmFuc2Zlci5nZXRJbnN0YW5jZSgpCi0vLwkJIH07Ci0vLwkJIHRhYmxlVHJlZVZpZXdlci5hZGREcm9wU3VwcG9ydChETkQuRFJPUF9NT1ZFLCB0cmFuc2ZlcnMsIG5ldwotLy8JCSBCU1RhYkRyb3BBZGFwdGVyKHRhYmxlVHJlZVZpZXdlcikpOwotCi0JCS8vIEJTRWRpdG9yVmlldy5nZXRWaWV3KCkuY3JlYXRlQ29udGV4dE1lbnVGb3IodGFibGVUcmVlVmlld2VyKTsKLQkJLy8gcmV0dXJuIHRhYmxlVHJlZVZpZXdlci5nZXRDb250cm9sKCk7Ci0KLQkJc2V0Q29udGV4dEhlbHAodmlld2VyLmdldENvbnRyb2woKSk7Ci0KLQkJcmV0dXJuIGNvbXA7Ci0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTZXQgYWxsIGVkaXRvcnMgYW5kIG1vZGlmaWVycyBmb3IgdGhlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBbGxFZGl0b3JzQW5kTW9kaWZpZXJzKCkKLQl7Ci0JCXNldENlbGxFZGl0b3JzKCk7Ci0JCXNldENoZWNrQm94Q2VsbEVkaXRvcnMoKTsKLQotCQkvLyBTZXQgdGhlIGNlbGwgbW9kaWZpZXIKLQkJdmlld2VyLnNldENlbGxNb2RpZmllcihuZXcgSUNlbGxNb2RpZmllcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXIjY2FuTW9kaWZ5KGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGNhbk1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjYW5Nb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0KLQkJCQlpZiAoaXNSZWFkT25seSgpIHx8Ci0JCQkJCQkoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpLmlzUmVhZE9ubHkoKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotLy8JCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpCi0vLwkJCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmICEoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotLy8JCQkJCQkJCS5pc1JlYWRPbmx5KCkpKSB7Ci0vLwkJCQkJQ29sbGVjdGlvbiB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCQl0eXBlcy5hZGQoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCk7Ci0vLwkJCQkJaWYgKFRuZ1V0aWwKLS8vCQkJCQkJCS5pc0dlbmVyYWxpemVyKAotLy8JCQkJCQkJCQkoVmFyaWFiaWxpdHlFbGVtZW50KSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotLy8JCQkJCQkJCQkJCS5nZXRPd25lcigpLCB0eXBlcykpCi0vLwkJCQkJCXJldHVybiBmYWxzZTsKLS8vCQkJCX0KLQkJCQkKLQkJCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRAotCQkJCQkJfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFCi0JCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8KLQkJCQkJCXx8IHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkJJiYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUgfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkKLQkJCQkJCSYmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI2dldFZhbHVlKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5TdHJpbmcpCi0JCQkgKi8KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VmFsdWU6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCVN0cmluZyB2YWwgPSBnZXRUZXh0KGUsIHByb3BlcnR5KTsKLQkJCQlzd2l0Y2ggKGdldENlbGxFZGl0b3JUeXBlKHByb3BlcnR5KSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWlmIChUWFRfVFJVRS5lcXVhbHNJZ25vcmVDYXNlKHZhbCkpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigxKTsKLQkJCQkJfQotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCXJldHVybiB2YWw7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ0hFQ0tfQk9PTEVBTjoKLQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWwpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiB2YWw7Ci0JCQkJfQotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyI21vZGlmeShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnkoZmluYWwgT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwKLQkJCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RpZnk6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSsiLCB2YWx1ZT0iK3ZhbHVlKTsKLQkJCQlXaWRnZXQgaXRlbSA9IChXaWRnZXQpIGVsZW1lbnQ7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChpdGVtCi0JCQkJCQkuZ2V0RGF0YSgpKTsKLQotCQkJCWZpbmFsIGludCBjb2x1bW5JbmRleCA9IGdldENvbHVtbkluZGV4KHByb3BlcnR5KTsKLQkJCQlDZWxsRWRpdG9yIGNlbGxFZGl0b3IgPSB2aWV3ZXIuZ2V0Q2VsbEVkaXRvcnMoKVtjb2x1bW5JbmRleF07Ci0JCQkJU3RyaW5nIGVyck1zZyA9IGNlbGxFZGl0b3IuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQkJaWYgKGVyck1zZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgdHh0OwotCQkJCXN3aXRjaCAoZ2V0Q2VsbEVkaXRvclR5cGUocHJvcGVydHkpKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVDoKLQkJCQkJdHh0ID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWludCBpbmRleCA9ICgoTnVtYmVyKSB2YWx1ZSkuaW50VmFsdWUoKTsKLQkJCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQkJCXR4dCA9IFRYVF9UUlVFOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHh0ID0gVFhUX0ZBTFNFOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCXR4dCA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXR4dCA9IFRuZ1V0aWwuY2hlY2tOdWxsKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlzZXRUZXh0KGJlLCBwcm9wZXJ0eSwgdHh0KTsKLQkJCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRQotCQkJCQkJJiYgU3RyVXRpbC5pc0JsYW5rKGJlLmdldE5hbWUoKSkpIHsKLQkJCQkJYmUuc2V0TmFtZSh0eHQpOwotCQkJCX0KLQkJCQkKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0IGNlbGwgZWRpdG9yIGZvciB0aGUgZ2l2ZW4gY29sdW1uCi0JICogQHBhcmFtIGNvbHVtbklECi0JICogQHBhcmFtIGNvbHVtbkluZGV4Ci0JICogQHJldHVybgotCSAqIAkJCUNlbGwgRWRpdG9yCi0JICovCi0JcHVibGljIENlbGxFZGl0b3IgZ2V0Q2VsbEVkaXRvcihTdHJpbmcgY29sdW1uSUQsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoY29sdW1uSUQgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJaWYgKHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IoCi0JCQkJCQl2aWV3ZXIuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAoKFByb2Nlc3NFZGl0b3IpZ2V0RWRpdG9yKCkpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQlib29sZWFuIGlnbm9yZVN1cHByZXNzZWQgPSB0cnVlOwotCQkJCQkJcmV0dXJuIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgZSwKLQkJCQkJCQkJCQl0eHQsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvcgotCQkJCQkJLnNldFZhbGlkYXRvcihuZXcgQ2VsbEVkaXRvclZhbGlkYXRvcigKLQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IpKTsKLQkJCQkvLyBwcmVzZW50YXRpb25OYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkRm9jdXNMaXN0ZW5lcihuZXcKLQkJCQkvLyBWYWxpZGF0aW5nRm9jdXNBZGFwdGVyKHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yKSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IuZ2V0Q29udHJvbCgpLmFkZExpc3RlbmVyKAotCQkJCQkJU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcigKLQkJCQkJCQkJcHJlc2VudGF0aW9uTmFtZUNlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCXByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yLnNldENvbHVtbkluZGV4KGNvbHVtbkluZGV4KTsKLQotCQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWVDZWxsRWRpdG9yOwotCQl9IGVsc2UgaWYgKGNvbHVtbklEID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJaWYgKG5hbWVDZWxsRWRpdG9yID09IG51bGwpIHsKLQkJCQluYW1lQ2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3Iodmlld2VyCi0JCQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAoKFByb2Nlc3NFZGl0b3IpZ2V0RWRpdG9yKCkpLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbAotCQkJCQkJCQkuY2hlY2tBY3Rpdml0eU5hbWUoYWRhcHRlckZhY3RvcnksIGUsIHR4dCwgc3VwcHJlc3Npb24pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQluYW1lQ2VsbEVkaXRvci5zZXRWYWxpZGF0b3IobmV3IENlbGxFZGl0b3JWYWxpZGF0b3IoCi0JCQkJCQluYW1lQ2VsbEVkaXRvcikpOwotCQkJCS8vIG5hbWVDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRGb2N1c0xpc3RlbmVyKG5ldwotCQkJCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIobmFtZUNlbGxFZGl0b3IpKTsKLQkJCQluYW1lQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihuYW1lQ2VsbEVkaXRvcikpOwotCQkJfQotCQkJbmFtZUNlbGxFZGl0b3Iuc2V0Q29sdW1uSW5kZXgoY29sdW1uSW5kZXgpOwotCi0JCQlyZXR1cm4gbmFtZUNlbGxFZGl0b3I7Ci0JCX0gZWxzZSBpZiAoY29sdW1uSUQgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVERUNFU1NPUlMpIHsKLQkJCWlmIChwcmVkTGlzdENlbGxFZGl0b3IgPT0gbnVsbCkgewotCQkJCXByZWRMaXN0Q2VsbEVkaXRvciA9IG5ldyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3Iodmlld2VyCi0JCQkJCQkuZ2V0Q2VsbEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJCQkJZSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmNoZWNrUHJlZGVjZXNzb3JMaXN0KAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUsIHR4dCwgYWRhcHRlckZhY3RvcnksCi0JCQkJCQkJCXByb2Nlc3MsIG51bGwpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlwcmVkTGlzdENlbGxFZGl0b3Iuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKAotCQkJCQkJcHJlZExpc3RDZWxsRWRpdG9yKSk7Ci0JCQkJLy8gcHJlZExpc3RDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRGb2N1c0xpc3RlbmVyKG5ldwotCQkJCS8vIFZhbGlkYXRpbmdGb2N1c0FkYXB0ZXIocHJlZExpc3RDZWxsRWRpdG9yKSk7Ci0JCQkJcHJlZExpc3RDZWxsRWRpdG9yLmdldENvbnRyb2woKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBWYWxpZGF0aW5nRGVhY3RpdmF0ZUxpc3RlbmVyKHByZWRMaXN0Q2VsbEVkaXRvcikpOwotCQkJfQotCQkJcHJlZExpc3RDZWxsRWRpdG9yLnNldENvbHVtbkluZGV4KGNvbHVtbkluZGV4KTsKLQotCQkJcmV0dXJuIHByZWRMaXN0Q2VsbEVkaXRvcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgY2VsbCBlZGl0b3JzIGZvciBhbGwgY29sdW1ucyAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsRWRpdG9ycygpIHsKLQkJQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3IENlbGxFZGl0b3JbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gZ2V0Q2VsbEVkaXRvcihjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZCwgaSk7Ci0JCQlpZiAoY2VsbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJY2VsbEVkaXRvcnNbaV0gPSBjZWxsRWRpdG9yOwotCQkJfSBlbHNlIHsKLQkJCQlzd2l0Y2ggKGNvbHVtbkRlc2NyaXB0b3JzW2ldLmNlbGxFZGl0b3JUeXBlKSB7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJY2VsbEVkaXRvcnNbaV0gPSBjb21ib0JveENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gdGV4dENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gY2hlY2tCb3hDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JfQotCQotCQotCQotCi0JLyoqCi0JICogU2V0IGlucHV0IGZvciB2aWV3ZXIKLQkgKiBAcGFyYW0gbmV3SW5wdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG5ld0lucHV0IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcHJvY2VzcyA9IChQcm9jZXNzKSBuZXdJbnB1dDsKLQkJCWlmIChwcm9jZXNzLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQl2aWV3ZXIuc2V0SW5wdXQocHJvY2Vzcy5lQ29udGFpbmVyKCkpOwotCQkJCS8vIHZpZXdlci5leHBhbmRBbGwoKTsKLS8vCQkJCXZpZXdlci5yZXZlYWwocHJvY2Vzcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXZpZXdlci5zZXRJbnB1dChudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldENvbHVtbkluZGV4KFN0cmluZyBwcm9wZXJ0eSkgewotCQlPYmplY3RbXSBjb2xQcm9wcyA9IHZpZXdlci5nZXRDb2x1bW5Qcm9wZXJ0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sUHJvcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb2xQcm9wc1tpXSA9PSBwcm9wZXJ0eSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRDZWxsRWRpdG9yVHlwZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJQ29sdW1uRGVzY3JpcHRvciBkZXNjID0gY29sdW1uRGVzY3JpcHRvcnNbaV07Ci0JCQlpZiAoZGVzYy5pZCA9PSBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBkZXNjLmNlbGxFZGl0b3JUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdmlld2VyCi0JICovCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHByb2Nlc3MgYXMgaW5wdXQKLQkgKiBAcGFyYW0gcHJvYwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3MoUHJvY2VzcyBwcm9jKSB7Ci0JCWlmIChwcm9jZXNzICE9IHByb2MpIHsKLQkJCXNldElucHV0KHByb2MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWRhcHRlckZhY3RvcnkuCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGNvbHVtbnMgd2l0aCBuZXcgY29sdW1uIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIG5ld0NvbHVtbkRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29sdW1ucyhDb2x1bW5EZXNjcmlwdG9yW10gbmV3Q29sdW1uRGVzY3JpcHRvcnMpIHsKLQkJc2V0Q29sdW1uRGVzY3JpcHRvcnMobmV3Q29sdW1uRGVzY3JpcHRvcnMpOwotCQl2aWV3ZXIuc2V0dXBDb2x1bW5zKG5ld0NvbHVtbkRlc2NyaXB0b3JzKTsJCi0JCXNldEFsbEVkaXRvcnNBbmRNb2RpZmllcnMoKTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIHsKLQkJLy8gKChDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5kaXNwb3NlKCk7Ci0JCS8vIH0KLQotCQlpZiAodmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpICE9IG51bGwpIHsKLQkJCXZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAodmlld2VyLmdldExhYmVsUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0SGVscChDb250cm9sIGNvbnRyb2wpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhYyA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFsbEZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHdic0ZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IG9ic0ZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHBic0ZhYyA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IGN1cnJlbnQgZGFkcHRlciBmYWMgPSAiICsgYWRhcHRlckZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBhbGwgZGFkcHRlciBmYWMgPSAiICsgYWxsRmFjKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IHdicyBkYWRwdGVyIGZhYyA9ICIgKyB3YnNGYWMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogb2JzIGRhZHB0ZXIgZmFjID0gIiArIG9ic0ZhYyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIERFQlVHOiBwYnMgZGFkcHRlciBmYWMgPSAiICsgcGJzRmFjKTsKLQotCQlpZiAoYWRhcHRlckZhYyA9PSB3YnNGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfV0JTX0NPTlRFWFQpOwotCQllbHNlIGlmIChhZGFwdGVyRmFjID09IG9ic0ZhYykKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29udHJvbCwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRk9STV9FRElUT1JfUFJPQ0VTU19PQlNfQ09OVEVYVCk7Ci0JCWVsc2UgaWYgKGFkYXB0ZXJGYWMgPT0gcGJzRmFjKQotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250cm9sLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GT1JNX0VESVRPUl9QUk9DRVNTX1BCU19DT05URVhUKTsKLQkJZWxzZSBpZiAoYWRhcHRlckZhYyA9PSBhbGxGYWMpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbnRyb2wsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkZPUk1fRURJVE9SX1BST0NFU1NfQUxMQlNfQ09OVEVYVCk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYWRkaXRpb25hbCBhY3Rpb25zIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbnRleHQgbWVudS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQkJQWN0aW9ucwotCSAqLwotCXB1YmxpYyBJQWN0aW9uW10gZ2V0QWRkaXRpb25hbEFjdGlvbnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgY2hlY2sgYm94IGNlbGwgZWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrQm94Q2VsbEVkaXRvcnMoKSB7Ci0JCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQWJzdHJhY3RDaGVja0JveENlbGxFZGl0b3JbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJc3dpdGNoIChjb2x1bW5EZXNjcmlwdG9yc1tpXS5jZWxsRWRpdG9yVHlwZSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NIRUNLX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gbmV3IFByb2Nlc3NDaGVja0JveENlbGxFZGl0b3Iodmlld2VyCi0JCQkJCQkJLmdldENlbGxFZGl0b3JQYXJlbnQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gbnVsbDsKLQkJCX0KLQkJfQotCQkoKFByb2Nlc3NWaWV3ZXIpIHZpZXdlcikuc2V0Q2hlY2tCb3hDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGEyYjVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuRWRpdG9yc0NvbnRleHRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlVJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGlzdFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgcHJvY2VzcyBkZXNjcmlwdGlvbi4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gUHJvY2Vzc0Rlc2NyaXB0aW9uUGFnZQotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgUHJvY2Vzc0Zvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicHJvY2Vzc0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVCA9IDI7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCX07Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfc2NvcGUsIGN0cmxfdXNhZ2Vfbm90ZXM7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2FsdGVybmF0aXZlcywgY3RybF9ob3dfdG9fc3RhZmYsCi0JCQljdHJsX2tleV9jb25zaWRlcmF0aW9uOwotCi0JcHJpdmF0ZSBTZWN0aW9uIGNvbmZpZ1NlY3Rpb247Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbmZpZ0NvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpZ1NlY3Rpb25FeHBhbmRGbGFnID0gZmFsc2U7Ci0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgbGlzdF9jb25maWd1cmF0aW9uczsKLQotCXByaXZhdGUgTGlzdFZpZXdlciBjb25maWdMaXN0Vmlld2VyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBidXR0b25BZGQ7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1dHRvblJlbW92ZTsKLQotCS8vIHByaXZhdGUgQnV0dG9uIGJ1dHRvbkVkaXQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBidXR0b25NYWtlRGVmYXVsdDsKLQotCXByaXZhdGUgVGV4dCB0ZXh0Q29uZmlnRGVzY3JpcHRpb247Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgY29uZmlnTGlzdEFkYXB0ZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0vLwlwcml2YXRlIEFkYXB0ZXIgcHJvY2Vzc0xpc3RlbmVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1R5cGU7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBuYW1lTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzcG9zZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVzY3JpcHRpb24oRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlc2NyaXB0aW9uUGFnZV90aXRsZSk7IAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcHJvY2Vzc1R5cGUgPSBMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dExvd2VyKHByb2Nlc3MpOwotCQl2ZXJzaW9uU2VjdGlvbk9uID0gZmFsc2U7Ci0JCXZhcmlhYmlsaXR5U2VjdGlvbk9uID0gZmFsc2U7Ci0JCWV4dGVybmFsSWRPbiA9IHRydWU7Ci0JCXB1cnBvc2VPbiA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZWRpdG9yIHRhYiBjb250ZW50Ci0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiAgICAgICAgICAgIFRoZSBmb3JtIHRvb2xraXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCXN1cGVyLmNyZWF0ZUVkaXRvckNvbnRlbnQodG9vbGtpdCk7Ci0JCWNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKHRvb2xraXQpOwotCQkvLyBTZXQgZm9jdXMgb24gdGhlIE5hbWUgdGV4dCBjb250cm9sLgotCQlEaXNwbGF5IGRpc3BsYXkgPSBmb3JtLmdldEJvZHkoKS5nZXREaXNwbGF5KCk7Ci0JCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpIHJldHVybjsKLQkJCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgY3RybF9uYW1lLmdldFRleHQoKS5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQkvLyBjcmVhdGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uCi0JCWdlbmVyYWxTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCAKLQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fTkFNRSwgCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuR0VORVJBTF9JTkZPX1NFQ1RJT05fREVTQywKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IHByb2Nlc3NUeXBlIH0pKTsKLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsU2VjdGlvbik7Ci0KLQkJLy8gbmFtZQotCQljdHJsX25hbWUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQpOwotCi0JCS8vIFByZXNlbnRhdGlvbiBuYW1lCi0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUgPSBjcmVhdGVUZXh0RWRpdFdpdGhMYWJlbCh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5QUkVTRU5UQVRJT05fTkFNRV9URVhUKTsKLQotCQkvLyBicmllZiBkZXNjCi0JCWN0cmxfYnJpZWZfZGVzYyA9IGNyZWF0ZVRleHRFZGl0V2l0aExhYmVsMih0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQkvLyBFeHRlcm5hbCBJZAotCQljdHJsX2V4dGVybmFsX2lkID0gY3JlYXRlVGV4dEVkaXRXaXRoTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0V4dGVybmFsSUQpOyAKLQotCQkvLyBQdXJwb3NlCi0JCWN0cmxfcHVycG9zZSA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19QdXJwb3NlLCA0MCwgNDAwLCBHRU5FUkFMX1NFQ1RJT05fSUQpOyAKLQkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGdlbmVyYWxDb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBkZXRhaWwgc2VjdGlvbgotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGV0YWlsU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIGNyZWF0ZSBkZXRhaWwgc2VjdGlvbgotCQlkZXRhaWxTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCAKLQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fTkFNRSwgCi0JCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuREVUQUlMX1NFQ1RJT05fREVTQywKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IHByb2Nlc3NUeXBlIH0pKTsKLQkJZGV0YWlsQ29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRldGFpbFNlY3Rpb24pOwotCi0JCS8vIGZ1bGwgZGVzY3JpcHRpb24KLQkJY3RybF9mdWxsX2Rlc2MgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5NQUlOX0RFU0NSSVBUSU9OX1RFWFQsIDEwMCwKLQkJCQk0MDAsIERFVEFJTF9TRUNUSU9OX0lEKTsKLQotCQkvLyBzY29wZQotCQljdHJsX3Njb3BlID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJZGV0YWlsQ29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX1Njb3BlLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIHVzYWdlIG5vdGVzCi0JCWN0cmxfdXNhZ2Vfbm90ZXMgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Vc2FnZU5vdGVzLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGFsdGVybmF0aXZlcwotCQljdHJsX2FsdGVybmF0aXZlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQl0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0FsdGVybmF0aXZlcywgNDAsIDQwMCwgREVUQUlMX1NFQ1RJT05fSUQpOyAKLQotCQkvLyBob3cgdG8gc3RhZmYKLQkJY3RybF9ob3dfdG9fc3RhZmYgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19Ib3dUb1N0YWZmLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCS8vIGtleSBjb25zaWRlcmF0aW9uCi0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJdG9vbGtpdCwKLQkJCQlkZXRhaWxDb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc19LZXlDb25zaWRlcmF0aW9uLCA0MCwgNDAwLCBERVRBSUxfU0VDVElPTl9JRCk7IAotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKGRldGFpbENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbmZpZ3VyYXRpb25TZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJLy8gY3JlYXRlIENvbmZpZ3VyYXRpb24gc2VjdGlvbgotCQljb25maWdTZWN0aW9uID0gY3JlYXRlU2VjdGlvbih0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLCAKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvblNlY3Rpb25UaXRsZSwgCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2NvbmZpZ3VyYXRpb25TZWN0aW9uTWVzc2FnZSk7Ci0JCWNvbmZpZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBjb25maWdTZWN0aW9uKTsKLQkJKChHcmlkTGF5b3V0KSBjb25maWdDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCi0JCUxhYmVsIGxfZWxlbWVudCA9IHRvb2xraXQKLQkJCQkuY3JlYXRlTGFiZWwoCi0JCQkJCQljb25maWdDb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcm9jZXNzRGVzY3JpcHRpb25fY29uZmlndXJhdGlvbnMpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkVORCwgdHJ1ZSwKLQkJCQkJdHJ1ZSwgMiwgMSk7Ci0JCQlsX2VsZW1lbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlsaXN0X2NvbmZpZ3VyYXRpb25zID0gVUlIZWxwZXIuY3JlYXRlTGlzdCh0b29sa2l0LCBjb25maWdDb21wb3NpdGUsCi0JCQkJU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLndpZHRoSGludCA9IDIwMDsKLQkJCWxpc3RfY29uZmlndXJhdGlvbnMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY29uZmlnTGlzdFZpZXdlciA9IG5ldyBMaXN0Vmlld2VyKGxpc3RfY29uZmlndXJhdGlvbnMpOwotCQljb25maWdMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdMaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkJImljb25zL2NoZWNrZWQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyB0eHQgPSBsYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJaWYgKGVsZW1lbnQgPT0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKSB7Ci0JCQkJCXR4dCA9IHR4dAotCQkJCQkJCSsgIiAiICsgQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uX2RlZmF1bHQ7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJCXJldHVybiB0eHQ7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBidXR0b25QYW5lbCA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGNvbmZpZ0NvbXBvc2l0ZSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5DRU5URVIsIFNXVC5DRU5URVIsIGZhbHNlLAotCQkJCQlmYWxzZSk7Ci0JCQkvLyBncmlkRGF0YS53aWR0aEhpbnQgPSA4MDsKLQkJCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSA0OwotCQkJYnV0dG9uUGFuZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlidXR0b25QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJfQotCQkvLyBBZGQgYnV0dG9uCi0JCUJ1dHRvbiBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWRkQnV0dG9uX3RleHQsIFNXVC5OT05FKTsgCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJYnV0dG9uQWRkID0gYnV0dG9uOwotCi0JCS8vIFJlbW92ZSBidXR0b24KLQkJYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oYnV0dG9uUGFuZWwsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbW92ZUJ1dHRvbl90ZXh0LCBTV1QuTk9ORSk7IAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWJ1dHRvblJlbW92ZSA9IGJ1dHRvbjsKLQotCQkvLyAvLyBFZGl0IGJ1dHRvbgotCQkvLyBidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgIkVkaXQuLi4iLCBTV1QuTk9ORSk7Ci0JCS8vIHsKLQkJLy8gR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJLy8gZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSBERUZBVUxUX1ZFUlRJQ0FMX0lOREVOVCAqIDY7Ci0JCS8vIGJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJLy8gfQotCQkvLyBidXR0b25FZGl0ID0gYnV0dG9uOwotCQkvLwkJCi0JCS8vCQkKLQkJLy8gTWFrZSBEZWZhdWx0IGJ1dHRvbgotCQlidXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lbCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMubWFrZURlZmF1bHRCdXR0b25fdGV4dCwgU1dULk5PTkUpOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlidXR0b25NYWtlRGVmYXVsdCA9IGJ1dHRvbjsKLQotCQkvLyBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uCi0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdAotCQkJCS5jcmVhdGVMYWJlbCgKLQkJCQkJCWNvbmZpZ0NvbXBvc2l0ZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbl9jb25maWd1cmF0aW9uRGVzY3JpcHRpb24pOyAKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkVORCwgdHJ1ZSwKLQkJCQkJZmFsc2UsIDIsIDEpOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24gPSB0b29sa2l0LmNyZWF0ZVRleHQoY29uZmlnQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gREVGQVVMVF9WRVJUSUNBTF9JTkRFTlQ7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gODA7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJdGV4dENvbmZpZ0Rlc2NyaXB0aW9uLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29uZmlnQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtUGFnZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotLy8JCWlmIChwcm9jZXNzTGlzdGVuZXIgIT0gbnVsbCkgewotLy8JCQlwcm9jZXNzLmVBZGFwdGVycygpLnJlbW92ZShwcm9jZXNzTGlzdGVuZXIpOwotLy8JCX0KLQotCQlpZiAoY29uZmlnTGlzdEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJY29uZmlnTGlzdEFkYXB0ZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJZGlzcG9zZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIGNvbmZpZ3VyYXRpb25zCi0JICoKLQkgKi8KLQljbGFzcyBDb25maWdMaXN0SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIgewotCQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgQ29uZmlnTGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJcHJvY2Vzcy5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgamF2YS51dGlsLkNvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCi0JCQlpZiAoZGVmYXVsdENvbmZpZyAhPSBudWxsCi0JCQkJCSYmICFwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmNvbnRhaW5zKGRlZmF1bHRDb25maWcpKSB7Ci0JCQkJcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS5hZGQoMCwgZGVmYXVsdENvbmZpZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFByb2Nlc3MuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ6Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaCkKLQkJCQljb25maWdMaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlTW9kZWxDb250cm9scygpIHsKLQkJaWYgKChjdHJsX25hbWUgIT0gbnVsbCkgJiYgKCFjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSkgewotCQkJdXBkYXRlQ29udHJvbChjdHJsX25hbWUsIHByb2Nlc3MuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoKGN0cmxfYnJpZWZfZGVzYyAhPSBudWxsKSAmJiAoIWN0cmxfYnJpZWZfZGVzYy5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQl1cGRhdGVDb250cm9sKGN0cmxfYnJpZWZfZGVzYywgcHJvY2Vzcy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9Ci0JCWlmICgoY3RybF9wcmVzZW50YXRpb25fbmFtZSAhPSBudWxsKQotCQkJCSYmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQl1cGRhdGVDb250cm9sKGN0cmxfcHJlc2VudGF0aW9uX25hbWUsIHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIFRleHQgY29udHJvbCBpZmYgdGhlIG5ld1RleHQgaXMgZGlmZmVyZW50IHRoYW4gd2hhdCdzIHRoZXJlCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29udHJvbChUZXh0IHRleHQsIFN0cmluZyBuZXdUZXh0KSB7Ci0JCWlmICghdGV4dC5nZXRUZXh0KCkuZXF1YWxzKFRuZ1V0aWwuY2hlY2tOdWxsKG5ld1RleHQpKSkgewotCQkJdGV4dC5zZXRUZXh0KFRuZ1V0aWwuY2hlY2tOdWxsKG5ld1RleHQpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIElNZXRob2RSaWNoVGV4dCBjb250cm9sIGlmZiB0aGUgbmV3VGV4dCBpcyBkaWZmZXJlbnQgdGhhbiB3aGF0J3MgdGhlcmUKLQkgKiBAcGFyYW0gdGV4dAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVDb250cm9sKElNZXRob2RSaWNoVGV4dCB0ZXh0LCBTdHJpbmcgbmV3VGV4dCkgewotCQlpZiAoIXRleHQuZ2V0VGV4dCgpLmVxdWFscyhUbmdVdGlsLmNoZWNrTnVsbChuZXdUZXh0KSkpIHsKLQkJCXRleHQuc2V0VGV4dChUbmdVdGlsLmNoZWNrTnVsbChuZXdUZXh0KSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGluaXRpYWwgZGF0YSBmcm9tIG1vZGVsCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbG9hZERhdGEoKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIGNvbnRlbnQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24pIHByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkJU3RyaW5nIGV4dGVybmFsSUQgPSBjb250ZW50LmdldEV4dGVybmFsSWQoKTsKLQkJU3RyaW5nIHB1cnBvc2UgPSBjb250ZW50LmdldFB1cnBvc2UoKTsKLQkJU3RyaW5nIGZ1bGxEZXNjID0gY29udGVudC5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIHNjb3BlID0gY29udGVudC5nZXRTY29wZSgpOwotCQlTdHJpbmcgdXNhZ2VOb3RlcyA9IGNvbnRlbnQuZ2V0VXNhZ2VOb3RlcygpOwotCQlTdHJpbmcgYWx0ZXJuYXRpdmVzID0gY29udGVudC5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJU3RyaW5nIGhvd1RvU3RhZmYgPSBjb250ZW50LmdldEhvd3RvU3RhZmYoKTsKLQkJU3RyaW5nIGtleUNvbnNpZGVyYXRpb24gPSBjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJdXBkYXRlTW9kZWxDb250cm9scygpOwotCi0JCXVwZGF0ZUNvbnRyb2woY3RybF9leHRlcm5hbF9pZCwgZXh0ZXJuYWxJRCk7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9wdXJwb3NlLCBwdXJwb3NlKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX2Z1bGxfZGVzYywgZnVsbERlc2MpOwotCQl1cGRhdGVDb250cm9sKGN0cmxfc2NvcGUsIHNjb3BlKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX3VzYWdlX25vdGVzLCB1c2FnZU5vdGVzKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX2FsdGVybmF0aXZlcywgYWx0ZXJuYXRpdmVzKTsKLQkJdXBkYXRlQ29udHJvbChjdHJsX2hvd190b19zdGFmZiwgaG93VG9TdGFmZik7Ci0JCXVwZGF0ZUNvbnRyb2woY3RybF9rZXlfY29uc2lkZXJhdGlvbiwga2V5Q29uc2lkZXJhdGlvbik7Ci0KLQkJaWYgKGNvbmZpZ0xpc3RBZGFwdGVyID09IG51bGwpIHsKLQkJCWNvbmZpZ0xpc3RBZGFwdGVyID0gbmV3IENvbmZpZ0xpc3RJdGVtUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JCWNvbmZpZ0xpc3RWaWV3ZXIuc2V0SW5wdXQoY29uZmlnTGlzdEFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCBsaXN0ZW5lcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0vLwkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCXRoaXMuZWRpdG9yID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSk7Ci0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCWZpbmFsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIGNvbnRlbnQgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24pIHByb2Nlc3MKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCW1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKHByb2Nlc3MpOwotCQljb250ZW50TW9kaWZ5TGlzdGVuZXIgPSBlZGl0b3IuY3JlYXRlTW9kaWZ5TGlzdGVuZXIocHJvY2VzcwotCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0KLQkJZm9ybS5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKCFkZXNjRXhwYW5kRmxhZykKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2V4cGFuZGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotCQkJCX0KLQkJCQlmb3JtU2VjdGlvbi5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xNb3ZlZChDb250cm9sRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlmb3JtLmdldFBhcmVudCgpLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChUbmdVdGlsLmlzTG9ja2VkKHByb2Nlc3MpKSB7Ci0JCQkJCXJlZnJlc2goZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZnJlc2godHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGVkaXRvci5jcmVhdGVNb2RpZnlMaXN0ZW5lcihwcm9jZXNzLmVDb250YWluZXIoKSwKLQkJCQl0cnVlKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQllLndpZGdldCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3TmFtZSA9IGN0cmxfbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJCWlmIChuZXdOYW1lLmVxdWFscyhwcm9jZXNzLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQkJCi0JCQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQkJaWYgKG5ld05hbWUuaW5kZXhPZignJicpID4gLTEpIHsgLy9GSVhNRTogdGhpcyBtdXN0IGdvIHRvIHZhbGlkYXRvciBjb2RlCi0JCQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csIG5ld05hbWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZU5hbWVWYWxpZGF0b3IoCi0JCQkJCQkJcHJvY0NvbXAsCi0JCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJCW1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5ld05hbWUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAobXNnID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvY2Vzc0Rlc2NyaXB0aW9uTmFtZUNoYW5nZUNvbmZpcm1fdGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb2Nlc3NEZXNjcmlwdGlvbk5hbWVDaGFuZ2VDb25maXJtX21lc3NhZ2U7IAotCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsIG1lc3NhZ2UpKSB7Ci0JCQkJCQllLmRvaXQgPSB0cnVlOwotCi0JCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCXByb2Nlc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIGN0cmxfbmFtZQotCQkJCQkJCQkJCS5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJY3RybF9uYW1lLnNldFRleHQocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2NDb21wLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCQkJCQljdHJsX25hbWUuZ2V0VGV4dCgpLCAtMSk7Ci0KLQkJCQkJCXNldEZvcm1UZXh0KCk7Ci0KLQkJCQkJCS8vIGFkanVzdCBwbHVnaW4gbG9jYXRpb24gYW5kIHNhdmUgdGhlIGVkaXRvcgotCQkJCQkJLy8KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkJCS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJCQllZGl0b3IKLQkJCQkJCQkJCQkuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQkJCQlpZihlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJCQkJCQkvLyBzYXZlIGZhaWxlZAotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZWRpdG9yCi0JCQkJCQkJCQkJLmdldFBlcnNpc3RlcigpOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJcGVyc2lzdGVyLmFkanVzdExvY2F0aW9uKHByb2Nlc3MKLQkJCQkJCQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCQkJdGhyb3cgZTsKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyBhZGp1c3QgZGlhZ3JhbSByZXNvdXJjZSBhcyB3ZWxsCi0JCQkJCQkJCS8vCi0JCQkJCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2Nlc3MsIHRoaXMpOwotCQkJCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQltZ3IudXBkYXRlUmVzb3VyY2VVUkkoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljdHJsX25hbWUuc2V0VGV4dChwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVuYW1lRGlhbG9nX3RpdGxlLCBtc2cpOyAKLQkJCQkJY3RybF9uYW1lLnNldFRleHQocHJvY2Vzcy5nZXROYW1lKCkpOwotCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWN0cmxfbmFtZS5zZXRGb2N1cygpOwotCQkJCQkJCWN0cmxfbmFtZS5zZWxlY3RBbGwoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJY3RybF9uYW1lLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJZS53aWRnZXQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKChjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFRleHQoKSAhPSBudWxsKQotCQkJCQkJJiYgKCFjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFRleHQoKS5lcXVhbHMoIiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQkJaWYgKCFjdHJsX3ByZXNlbnRhdGlvbl9uYW1lLmdldFRleHQoKS5lcXVhbHMob2xkQ29udGVudCkpIHsKLQotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQlwcm9jZXNzLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLS8vCQkJCQkJTGlicmFyeVZpZXcgZWxlbWVudHNWaWV3ID0gTGlicmFyeVZpZXcuZ2V0VmlldygpOwotLy8JCQkJCQlpZiAoZWxlbWVudHNWaWV3ICE9IG51bGwpCi0vLwkJCQkJCQllbGVtZW50c1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVzdG9yZSB0aGUgb2xkIG5hbWUgZmlyc3QsIHRoZW4gcHJlc2VudCB0aGUgZXJyb3IKLQkJCQkJLy8gbWVzc2FnZSBib3gKLQkJCQkJY3RybF9wcmVzZW50YXRpb25fbmFtZS5zZXRUZXh0KHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVkaXREaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW52YWxpZFByZXNlbnRhdGlvbk5hbWVFcnJvcl9tc2cpOyAKLQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLQkJCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJLy8gd2hlbiB1c2VyIHRhYiB0byB0aGlzIGZpZWxkLCBzZWxlY3QgYWxsIHRleHQKLQkJCQljdHJsX3ByZXNlbnRhdGlvbl9uYW1lLnNlbGVjdEFsbCgpOwotCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBmb2N1cyBvZiB0aGUgY29tcG9uZW50IGlzIGxvc3QgCi0JCQkJaWYoY3RybF9wcmVzZW50YXRpb25fbmFtZS5nZXRTZWxlY3Rpb25Db3VudCgpID4gMCl7Ci0JCQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCQl9IH0KLQkJfSk7Ci0KLQkJY3RybF9icmllZl9kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9icmllZl9kZXNjLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBwcm9jZXNzLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWUud2lkZ2V0LCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9icmllZl9kZXNjLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJcHJvY2VzcywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJCQljdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChuZXdDb250ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9leHRlcm5hbF9pZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2V4dGVybmFsX2lkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0RXh0ZXJuYWxJZCgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9leHRlcm5hbF9pZCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfZXh0ZXJuYWxfaWQuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQlwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3VjY2VzcykgewotCQkJCQkJY3RybF9leHRlcm5hbF9pZC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWN0cmxfcHVycG9zZS5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCWN0cmxfcHVycG9zZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3B1cnBvc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX3B1cnBvc2U7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0UHVycG9zZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9wdXJwb3NlLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwgbmV3Q29udGVudCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9mdWxsX2Rlc2Muc2V0TW9kYWxPYmplY3QocHJvY2Vzcy5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCWN0cmxfZnVsbF9kZXNjLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQljdHJsX2Z1bGxfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX2Z1bGxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfZnVsbF9kZXNjOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJY3RybF9mdWxsX2Rlc2MsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3Njb3BlLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3Njb3BlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKSk7Ci0JCWN0cmxfc2NvcGUuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9zY29wZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfc2NvcGU7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0U2NvcGUoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWN0cmxfc2NvcGUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIHByb2Nlc3MKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX3VzYWdlX25vdGVzLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX3VzYWdlX25vdGVzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpKTsKLQkJY3RybF91c2FnZV9ub3Rlcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQljdHJsX3VzYWdlX25vdGVzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF91c2FnZV9ub3RlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRVc2FnZU5vdGVzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX3VzYWdlX25vdGVzLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKSwKLQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWx0ZXJuYXRpdmVzLnNldE1vZGFsT2JqZWN0KHByb2Nlc3MuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSk7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfYWx0ZXJuYXRpdmVzLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCTogY3RybF9hbHRlcm5hdGl2ZXM7Ci0JCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgb2xkQ29udGVudCA9IGNvbnRlbnQuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2FsdGVybmF0aXZlcywgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgbmV3Q29udGVudCwKLQkJCQkJCQktMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2hvd190b19zdGFmZi5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9ob3dfdG9fc3RhZmYuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpKTsKLQkJY3RybF9ob3dfdG9fc3RhZmYuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9ob3dfdG9fc3RhZmYuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2hvd190b19zdGFmZjsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gY29udGVudC5nZXRIb3d0b1N0YWZmKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2hvd190b19zdGFmZiwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgcHJvY2VzcwotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCksIG5ld0NvbnRlbnQsCi0JCQkJCQkJLTEpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5zZXRNb2RhbE9iamVjdChwcm9jZXNzLmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9rZXlfY29uc2lkZXJhdGlvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2tleV9jb25zaWRlcmF0aW9uOwotCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjb250ZW50LmdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljdHJsX2tleV9jb25zaWRlcmF0aW9uLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSwKLQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljb25maWdMaXN0Vmlld2VyCi0JCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnTGlzdFZpZXdlcgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHNlbGVjdGlvbgotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJCQlpZiAoY29uZmlnID09IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkgewotCQkJCQkJCQlidXR0b25SZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJCVN0cmluZyBkZXNjID0gY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQl0ZXh0Q29uZmlnRGVzY3JpcHRpb24uc2V0VGV4dChkZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCWJ1dHRvbkFkZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KHByb2Nlc3MpOwotCi0JCQkJZmluYWwgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIgaW5wdXQgPSBuZXcgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlsaWIsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlpbnB1dCwKLQkJCQkJCWNvbnRlbnRQcm92aWRlciwKLQkJCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRGVzY3JpcHRpb25fc2VsZWN0Q29uZmlndXJhdGlvbikgeyAKLQkJCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQkJCQlnZXRWaWV3ZXIoKS5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQotCQkJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLAotCQkJCQkJCQkJT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJCS8vIGludCBjb3VudCA9Ci0JCQkJCQkJCS8vIGNvbmZpZ0xpc3RWaWV3ZXIuZ2V0TGlzdCgpLmdldEl0ZW1Db3VudCgpOwotCQkJCQkJCQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQkJCQkvLyBpZihlbGVtZW50ID09Ci0JCQkJCQkJCS8vIGNvbmZpZ0xpc3RWaWV3ZXIuZ2V0RWxlbWVudEF0KGkpKSByZXR1cm4KLQkJCQkJCQkJLy8gZmFsc2U7Ci0JCQkJCQkJCS8vIH0KLQkJCQkJCQkJLy8gcmV0dXJuIHRydWU7Ci0JCQkJCQkJCXJldHVybiAhcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKS5jb250YWlucygKLQkJCQkJCQkJCQllbGVtZW50KTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIGNvbnRyb2w7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJCQkJCWlucHV0LmRpc3Bvc2UoKTsKLQkJCQkJCXJldHVybiBzdXBlci5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJT2JqZWN0IG9ic1tdID0gZGxnLmdldFJlc3VsdCgpOwotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCQkJLy8gZ2V0IGRlZmF1bHQgY29uZmlndXJhdGlvbgotLy8JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyA9IHByb2Nlc3MKLS8vCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9icy5sZW5ndGg7IGkrKykgewotCQkJCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9ic1tpXTsKLQkJCQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotLy8JCQkJCQkJCXx8IGNoZWNrVmFsaWRpdHlGb3JTdXBlclNldChkZWZhdWx0Q29uZmlnLAotLy8JCQkJCQkJCQkJY29uZmlnKSkgewotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHByb2Nlc3MsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgY29uZmlnLAotCQkJCQkJCQkJLTEpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hZGRDb25maWdFcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW52YWxpZENvbmZpZ0Vycm9yX21zZywgY29uZmlnLmdldE5hbWUoKSkpOyAKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYnV0dG9uUmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdMaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBwcm9jZXNzLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwKLQkJCQkJCXNlbGVjdGlvbi50b0xpc3QoKSwgLTEpOwotCQkJfQotCQl9KTsKLQotCQlidXR0b25NYWtlRGVmYXVsdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gcHJvY2VzcwotCQkJCQkJCS5nZXREZWZhdWx0Q29udGV4dCgpOwotCi0JCQkJCWlmIChjdXJyZW50Q29uZmlnICE9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkgewotCQkJCQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJCQkJCUxpc3QgdmFsaWRDb250ZXh0ID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHZhbGlkQ29udGV4dC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRvcgotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlpZiAoIShjaGVja1ZhbGlkaXR5Rm9yU3VwZXJTZXQoCi0JCQkJCQkJCQkoTWV0aG9kQ29uZmlndXJhdGlvbikgc2VsZWN0aW9uCi0JCQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSwgY29uZmlnKSkpIHsKLQkJCQkJCQkJaXNWYWxpZCA9IGZhbHNlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaXNWYWxpZCkgewotCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULCBwcm9jZXNzLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSwKLQkJCQkJCQkJCXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSwgLTEpOwotCQkJCQkJCWlmICghc3RhdHVzKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJYnV0dG9uUmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgc2VsZWN0ZWRDb25maWdOYW1lID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBzZWxlY3Rpb24KLQkJCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0TmFtZSgpOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNldERlZmF1bHRDb25maWdFcnJvckRpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2V0RGVmYXVsdENvbmZpZ0Vycm9yX21zZywgc2VsZWN0ZWRDb25maWdOYW1lKSk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIGFsbCB0aGUgY29udHJvbHMKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJaWYgKCFjdHJsX25hbWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghY3RybF9wcmVzZW50YXRpb25fbmFtZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfcHJlc2VudGF0aW9uX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghY3RybF9icmllZl9kZXNjLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfcHVycG9zZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfcHVycG9zZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKCFjdHJsX2Z1bGxfZGVzYy5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWN0cmxfZnVsbF9kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWN0cmxfYWx0ZXJuYXRpdmVzLmlzRGlzcG9zZWQoKSkgewotCQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JCWlmICghY3RybF9leHRlcm5hbF9pZC5pc0Rpc3Bvc2VkKCkpCi0JCQljdHJsX2V4dGVybmFsX2lkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKCFjdHJsX2tleV9jb25zaWRlcmF0aW9uLmlzRGlzcG9zZWQoKSkKLQkJCWN0cmxfa2V5X2NvbnNpZGVyYXRpb24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlpZiAoIWN0cmxfaG93X3RvX3N0YWZmLmlzRGlzcG9zZWQoKSkKLQkJCWN0cmxfaG93X3RvX3N0YWZmLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaWYgKCFjdHJsX3Njb3BlLmlzRGlzcG9zZWQoKSkKLQkJCWN0cmxfc2NvcGUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlpZiAoIWN0cmxfdXNhZ2Vfbm90ZXMuaXNEaXNwb3NlZCgpKQotCQkJY3RybF91c2FnZV9ub3Rlcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2V4cGFuZGVkICE9IG51bGwgJiYgIWN0cmxfZXhwYW5kZWQuaXNEaXNwb3NlZCgpKSB7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJfQotCQlpZiAoIWJ1dHRvbkFkZC5pc0Rpc3Bvc2VkKCkpCi0JCQlidXR0b25BZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmICghYnV0dG9uTWFrZURlZmF1bHQuaXNEaXNwb3NlZCgpKQotCQkJYnV0dG9uTWFrZURlZmF1bHQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmICghYnV0dG9uUmVtb3ZlLmlzRGlzcG9zZWQoKSkKLQkJCWJ1dHRvblJlbW92ZS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgc3VwZXJzZXQgb2Ygc2VsZWN0ZWQKLQkgKiBjb25maWd1cmF0aW9uIG9yIG5vdAotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrVmFsaWRpdHlGb3JTdXBlclNldChNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkvLyBnZXQgZGVmYXVsdCBwbHVnaW5zIGFuZCBwYWNrYWdlcwotCQlMaXN0IGRlZmF1bHRQbHVnaW5zID0gZGVmYXVsdENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJTGlzdCBkZWZhdWx0UGFja2FnZXMgPSBkZWZhdWx0Q29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCQkvLyBnZXQgY29uZml1Z3JhdGlvbiBwbHVnaW5zIGFuZCBwYWNha2dlcwotCQlMaXN0IHBhY2thZ2VzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlib29sZWFuIHBsdWdpbkNvbnRhaW5zID0gZmFsc2U7Ci0JCWJvb2xlYW4gcGFja2FnZUNvbnRhaW5zID0gZmFsc2U7Ci0JCWlmICgocGx1Z2lucyAhPSBudWxsKSApIHsKLQkJCXBsdWdpbkNvbnRhaW5zID0gZGVmYXVsdFBsdWdpbnMuY29udGFpbnNBbGwocGx1Z2lucyk7Ci0JCX0KLQkJaWYgKChwYWNrYWdlcyAhPSBudWxsKSApIHsKLQkJCXBhY2thZ2VDb250YWlucyA9IGRlZmF1bHRQYWNrYWdlcy5jb250YWluc0FsbChwYWNrYWdlcyk7Ci0JCX0KLQotCQlyZXR1cm4gKHBsdWdpbkNvbnRhaW5zKSAmJiAocGFja2FnZUNvbnRhaW5zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVTZWN0aW9ucyhib29sZWFuIGVuYWJsZSkgewotCQlnZW5lcmFsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCWlmIChlbmFibGUpIHsKLQkJCWdlbmVyYWxTZWN0aW9uLnNldEV4cGFuZGVkKGdlbmVyYWxTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQlnZW5lcmFsU2VjdGlvbkV4cGFuZEZsYWcgPSBnZW5lcmFsU2VjdGlvbi5pc0V4cGFuZGVkKCk7Ci0JCQlnZW5lcmFsU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQl9Ci0KLQkJZGV0YWlsU2VjdGlvbi5zZXRWaXNpYmxlKGVuYWJsZSk7Ci0JCWlmIChlbmFibGUpIHsKLQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcpOwotCQl9IGVsc2UgewotCQkJZGV0YWlsU2VjdGlvbkV4cGFuZEZsYWcgPSBkZXRhaWxTZWN0aW9uLmlzRXhwYW5kZWQoKTsKLQkJCWRldGFpbFNlY3Rpb24uc2V0RXhwYW5kZWQoZW5hYmxlKTsKLQkJfQotCQljb25maWdTZWN0aW9uLnNldFZpc2libGUoZW5hYmxlKTsKLQkJaWYgKGVuYWJsZSkgewotCQkJY29uZmlnU2VjdGlvbi5zZXRFeHBhbmRlZChjb25maWdTZWN0aW9uRXhwYW5kRmxhZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb25maWdTZWN0aW9uRXhwYW5kRmxhZyA9IGNvbmZpZ1NlY3Rpb24uaXNFeHBhbmRlZCgpOwotCQkJY29uZmlnU2VjdGlvbi5zZXRFeHBhbmRlZChlbmFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IG5hbWUgZm9yIHRoZSBmb3JtCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybVRleHQoKSB7Ci0KLQkJZm9ybS5zZXRUZXh0KExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KHByb2Nlc3MpCi0JCQkJKyAiOiAiICsgbWV0aG9kRWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVmcmVzaCBmb3JtIG5hbWUKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hFbGVtZW50TmFtZShmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoKGN0cmxfbmFtZSAhPSBudWxsKSAmJiAhKGN0cmxfbmFtZS5pc0Rpc3Bvc2VkKCkpKSB7Ci0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJY3RybF9uYW1lLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCQljdHJsX25hbWUuc2V0VGV4dChuZXdOYW1lKTsKLQkJCQkJCWN0cmxfbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCQkJCQkJc2V0Rm9ybVRleHQoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQl9OwotCQkJCWlmIChjdHJsX25hbWUuZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF9uYW1lLmdldERpc3BsYXkoKS5zeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb250ZXh0SGVscCgpIHsKLQkJc3VwZXIuc2V0Q29udGV4dEhlbHAoKTsKLQkJRWRpdG9yc0NvbnRleHRIZWxwZXIuc2V0SGVscChnZXRQYXJ0Q29udHJvbCgpLCBwcm9jZXNzVHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYmM2ZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBQcm9jZXNzIGZvcm0gcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGb3JtUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJvdGVjdGVkIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGVkaXRvcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBmb3JtIGVkaXRvci4KLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBmb3JtIHBhZ2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NGb3JtUGFnZShGb3JtRWRpdG9yIGVkaXRvciwgU3RyaW5nIGlkLCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIoZWRpdG9yLCBpZCwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCi0JCS8vIEdldCB0aGUgUHJvY2VzcyBvYmplY3QgZnJvbSB0aGUgZWRpdG9yIGlucHV0LgotCQlNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQgbWV0aG9kRWxlbWVudElucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0KLQkJT2JqZWN0IG9iaiA9IG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlwcm9jZXNzID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmopLmdldFByb2Nlc3MoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUHJvY2Vzc0Zvcm1VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGQxYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Qcm9jZXNzRm9ybVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgdGhlIFByb2Nlc3MgZWRpdG9yIGZvcm0gcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRm9ybVV0aWwgewotCi0JLyoqCi0JICogQ29udmVydHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gY29sdW1uIGRlc2NyaXB0b3JzIGxpc3QKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBjb2x1bW4gZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMaXN0IHRvQ29sdW1uRGVzY3JpcHRvckxpc3QoU3RyaW5nIHN0cikgewotCQlFTGlzdCBjb2x1bW5EZXNjcmlwdG9ycyA9IG5ldyBCYXNpY0VMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0ciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpOwotCQkJT2JqZWN0IGNvbHVtbkRlc2NyaXB0b3IgPSBQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwCi0JCQkJCS5nZXQodG9rZW4pOwotCQkJaWYgKGNvbHVtbkRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWNvbHVtbkRlc2NyaXB0b3JzLmFkZChjb2x1bW5EZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGludG8gY29sdW1uIGRlc2NyaXB0b3JzIGFycmF5IGxpc3QKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqIAkJQXJyYXkgaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sdW1uRGVzY3JpcHRvcltdIHRvQ29sdW1uRGVzY3JpcHRvcnMoU3RyaW5nIHN0cikgewotCQlMaXN0IGxpc3QgPSB0b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0JCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5zID0gbmV3IENvbHVtbkRlc2NyaXB0b3JbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkoY29sdW1ucyk7Ci0JCXJldHVybiBjb2x1bW5zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlQ2F0ZWdvcmllc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUNhdGVnb3JpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MDU3MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlQ2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUNhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVDYXRlZ29yaWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZUNhdGVnb3JpZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0FURUdPUklFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRDYXRlZ29yeUlzU2luZ2xlU2VsZWN0aW9uMShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRzKChSb2xlKSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBUT0RPOiBUZXN0IG9uLXRoZS1mbHkgY3JlYXRpb24gb2YgY2F0ZWdvcnkgY29udHJpYnV0b3IKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFRvUm9sZVNldChnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCQlyb2xlU2V0LCByb2xlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBUT0RPOiBUZXN0IG9uLXRoZS1mbHkgY3JlYXRpb24gb2YgY2F0ZWdvcnkgY29udHJpYnV0b3IKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21Sb2xlU2V0KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCByb2xlU2V0LCByb2xlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHJvbGUsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgcm9sZSwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDdXN0b21DYXRlZ29yeUZpbHRlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZUNhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZURlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YjM1MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLlZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotCi0KLS8qKgotICogVGhlIERlc2NyaXB0aW9uIHBhZ2UgZm9yIHRoZSBSb2xlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uUGFnZSBleHRlbmRzIERlc2NyaXB0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlRGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUk9MRSA9IEF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfc2tpbGxzOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9hc3NpZ247Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3N5bm9ueW1zOwotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb25QYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuREVTQ1JJUFRJT05fUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlub3RhdGlvblNlY3Rpb25PbiA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlRWRpdG9yQ29udGVudChGb3JtVG9vbGtpdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQkJc3VwZXIuY3JlYXRlRWRpdG9yQ29udGVudCh0b29sa2l0KTsKLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEJBU0VfUk9MRSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU3RhZmZpbmcgc2VjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVOb3RhdGlvblNlY3Rpb25Db250ZW50KCk7Ci0JCW5vdGF0aW9uU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TVEFGRklOR19TRUNUSU9OX05BTUUpOwotCQlub3RhdGlvblNlY3Rpb24uc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlUZXh0LlNUQUZGSU5HX1NFQ1RJT05fREVTQyk7Ci0JCWN0cmxfc2tpbGxzID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5TS0lMTFNfVEVYVCwgNDAsIDQwMCwKLQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJY3RybF9hc3NpZ24gPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFTU0lHTk1FTlRfQVBQUk9BQ0hFU19URVhULAotCQkJCTQwLCA0MDAsIE5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQljdHJsX3N5bm9ueW1zID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmtGb3JTZWN0aW9uKHRvb2xraXQsCi0JCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5TWU5PTllNU19URVhULCA0MCwgNDAwLAotCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQotCQlpZiAobm90YXRpb25TZWN0aW9uT24pIHsKLQkJCWN0cmxfc2tpbGxzLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWN0cmxfc2tpbGxzLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpKTsKLQkJCWN0cmxfc2tpbGxzLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3NraWxscy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfc2tpbGxzOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0U2tpbGxzKCk7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX2Fzc2lnbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2Fzc2lnbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpKTsKLQkJCWN0cmxfYXNzaWduLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX2Fzc2lnbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfYXNzaWduOwotCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZQotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9zeW5vbnltcy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX3N5bm9ueW1zLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkpOwotCQkJY3RybF9zeW5vbnltcy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9zeW5vbnltcy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQk6IGN0cmxfc3lub255bXM7Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uKSByb2xlCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRTeW5vbnltcygpOwotCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJY3RybF9za2lsbHMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9hc3NpZ24uc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJY3RybF9zeW5vbnltcy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkRGF0YSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZERhdGEoKSB7Ci0JCXN1cGVyLmxvYWREYXRhKCk7Ci0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlTdHJpbmcgc2tpbGxzID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldFNraWxscygpOwotCQkJU3RyaW5nIGFzc2lnbiA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24pIHJvbGUuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQkJU3RyaW5nIHN5bm9ueW1zID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbikgcm9sZS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJLmdldFN5bm9ueW1zKCk7Ci0JCi0JCQljdHJsX3NraWxscy5zZXRUZXh0KHNraWxscyA9PSBudWxsID8gIiIgOiBza2lsbHMpOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX2Fzc2lnbi5zZXRUZXh0KGFzc2lnbiA9PSBudWxsID8gIiIgOiBhc3NpZ24pOyAvLyROT04tTkxTLTEkCi0JCQljdHJsX3N5bm9ueW1zLnNldFRleHQoc3lub255bXMgPT0gbnVsbCA/ICIiIDogc3lub255bXMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENvbnRlbnRGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBTZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZy4KLQkJKChDb250ZW50RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXJvbGUpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkU2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV92YXJpYWJpbGl0eVNlY3Rpb25fZGVzYzsKLQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVHdWlkYW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUd1aWRhbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE3NDRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZUd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIEd1aWRhbmNlIHBhZ2UgaW4gdGhlIFJvbGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlR3VpZGFuY2VQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJvbGUgcm9sZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVHdWlkYW5jZVBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5HVUlEQU5DRV9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBVSUhlbHBlci5nZXRTZWxlY3RlZEd1aWRhbmNlcyhyb2xlKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2UgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXJvbGUsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCShQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIHJvbGUsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJcm9sZSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksCi0JCQkJCQkJKFJldXNhYmxlQXNzZXQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIGFkZCBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJInRvICIgKyByb2xlLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHJvbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZSBpdGVtID0gKEd1aWRhbmNlKSBpdC5uZXh0KCk7Ci0KLQkJCQkvLyBHdWlkYW5jZSBmb3IgdGhlIG1ldGhvZCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQlyb2xlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCQkJCShDb25jZXB0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksCi0JCQkJCQkJKEV4YW1wbGUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCByb2xlLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXJvbGUsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJcm9sZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJCQkJCQkoR3VpZGVsaW5lKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQlyb2xlLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIgKyByb2xlLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHJvbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0RGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyNTVlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXREZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXREZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldERlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldCByb2xlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldERlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldCA9IChSb2xlU2V0KSBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQpOwotCQkJfQotCQl9OwotCi0JCS8vIHNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nCi0JCSgoQ2F0ZWdvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJcm9sZVNldCkgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRVNFVFM7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0X3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWRkN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGZvciB0aGUgRG9tYWluIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZVNldEdyb3VwaW5nIHJvbGVTZXRHcm91cGluZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZykgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXJvbGVTZXRHcm91cGluZykgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVzZXRncm91cGluZ19nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJdGhpcy5kZXRhaWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQl0aGlzLnZhcmlhYmlsaXR5U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZXNldGdyb3VwaW5nX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlc2V0Z3JvdXBpbmdfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRHcm91cGluZ1JvbGVTZXRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMmYyODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0R3JvdXBpbmdSb2xlU2V0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGUgU2V0cyBwYWdlIGluIHRoZSBSb2xlIFNldCBHcm91cGluZyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IFJlbmFtZSB0aGlzIGNsYXNzIHRvIFJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZSBhbmQgbW92ZSBpdCB0byB0aGUKLSAqIG9tLmlibS5ybWMuYXV0aG9yaW5nLnVpLnV0aWwuZm9ybXMgcGFja2FnZQotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nUm9sZVNldHMoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFX1NFVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlU2V0R3JvdXBpbmcgPSAoUm9sZVNldEdyb3VwaW5nKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFJvbGVTZXRHcm91cGluZykgb2JqZWN0KS5nZXRSb2xlU2V0cygpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCXJvbGVTZXRHcm91cGluZywKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJCWFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQlyb2xlU2V0R3JvdXBpbmcsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpLAotCQkJCQlybUl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTRVRTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCk7Ci0JCQl9Ci0JCX07Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ1JvbGVTZXRzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdSb2xlU2V0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwzKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldEdyb3VwaW5nUm9sZVNldHNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlU2V0Um9sZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkOWU0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVTZXRSb2xlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgUm9sZXMgcGFnZSBpbiB0aGUgUm9sZSBTZXQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIExva2FuYXRoIEphZ2dhCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldFJvbGVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJyb2xlU2V0Um9sZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlU2V0IHJvbGVTZXQ7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJvbGVTZXRSb2xlc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ST0xFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGVTZXQgPSAoUm9sZVNldCkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvL3JldHVybiAoKFJvbGVTZXQpIG9iamVjdCkuZ2V0Um9sZXMoKS50b0FycmF5KCk7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgQ29udGVudEVsZW1lbnRPcmRlckxpc3QoCi0JCQkJCQkJY29udGVudEVsZW1lbnQsCi0JCQkJCQkJQ29udGVudEVsZW1lbnRPcmRlckxpc3QuQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfT05MWSwKLQkJCQkJCQlnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSk7Ci0JCQkJfQotCQkJCUxpc3QgcmV0dXJuTGlzdCA9IENhdGVnb3J5U29ydEhlbHBlci5zb3J0Q2F0ZWdvcnlFbGVtZW50cyhjb250ZW50RWxlbWVudCwgCi0JCQkJCQlhbGxTdGVwcy50b0FycmF5KCkpOwotCQkJCXJldHVybiByZXR1cm5MaXN0LnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCXJvbGVTZXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwgYWRkSXRlbXMsCi0JCQkJCS0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksCi0JCQkJCXJvbGVTZXQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSwgcm1JdGVtcywKLQkJCQkJLTEpOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5ST0xFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBDb250ZW50RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlU2V0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVNldFJvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVTZXRSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlVGFza3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVUYXNrc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NWFkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1JvbGVUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAicm9sZVRhc2tzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRBU0tTX1BBR0VfVElUTEUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXJvbGUgPSAoUm9sZSkgY29udGVudEVsZW1lbnQ7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMShmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrcygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkMik7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCQkJCXJvbGUsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgcm9sZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCBybUl0ZW1zLCAtMSk7Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRTZWNvbmRhcnlUYXNrcygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHRhc2spKSB7Ci0JCQkJCXRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RGlydHkodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJdGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnJlbW92ZShyb2xlKTsKLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVEFTS1M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRhc2spOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlVGFza3NQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVRhc2tzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVUYXNrc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlV29ya1Byb2R1Y3RzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Sb2xlV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTIxMGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvUm9sZVdvcmtQcm9kdWN0c1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuSU1hbmFnZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFdvcmsgUHJvZHVjdHMgcGFnZSBpbiB0aGUgUm9sZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVXb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInJvbGVXb3JrUHJvZHVjdHNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBSb2xlIHJvbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQlyb2xlID0gKFJvbGUpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5jcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtIG1hbmFnZWRGb3JtKSB7Ci0JCXN1cGVyLmNyZWF0ZUZvcm1Db250ZW50KG1hbmFnZWRGb3JtKTsKLQkJY3RybF9hZGQyLnNldFZpc2libGUoZmFsc2UpOwotCQljdHJsX3JlbW92ZTIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoUm9sZSkgb2JqZWN0KS5nZXRSZXNwb25zaWJsZUZvcigpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCByb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIGFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgcm1JdGVtcy5zaXplKCk7IGkrKykgewotLy8JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRSZXNwb25zaWJsZVJvbGUoCi0vLwkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgKFdvcmtQcm9kdWN0KSBybUl0ZW1zLmdldChpKSwgbnVsbCk7Ci0vLwkJCX0KLQkJCQotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCByb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXRNb2RpZmllZFdvcmtQcm9kdWN0cygoUm9sZSkgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHJvbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYlN0cmluZygpIHsKLQkJcmV0dXJuIEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMucm9sZVdvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5yb2xlV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJvbGVXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tDYXRlZ29yaWVzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrQ2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0YTRiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tDYXRlZ29yaWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNhdGVnb3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DdXN0b21DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBDYXRlZ29yaWVzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0NhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tDYXRlZ29yaWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0NhdGVnb3JpZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuQ0FURUdPUklFU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRhc2sgPSAoVGFzaykgY29udGVudEVsZW1lbnQ7Ci0vLwkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMSh0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UyKHRydWUpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lcygoVGFzaykgb2JqZWN0KS50b0FycmF5KCk7CQkJCQotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IGRpc2NpcGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoZGlzY2lwbGluZSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotLy8JCQkJCUxpc3QgZGlzY2lwbGluZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lcyh0YXNrKTsKLS8vCQkJCQlpZiAoZGlzY2lwbGluZXMgIT0gbnVsbCAmJiBkaXNjaXBsaW5lcy5zaXplKCkgPiAwKQl7Ci0vLwkJCQkJCU9iamVjdCBhc3NvY2lhdGVkRGlzY2lwbGluZSA9IGRpc2NpcGxpbmVzLmdldCgwKTsKLS8vCQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLS8vCQkJCQkJLmZvcm1hdCgKLS8vCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZXJyUmVsYXRpb25zaGlwRXhpc3RzLAotLy8JCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0vLwkJCQkJCQkJCQl0YXNrLmdldE5hbWUoKSwKLS8vCQkJCQkJCQkJCVRuZ1V0aWwKLS8vCQkJCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERpc2NpcGxpbmUpLAotLy8JCQkJCQkJCQkJKChEaXNjaXBsaW5lKSBkaXNjaXBsaW5lKS5nZXROYW1lKCkgfSk7Ci0vLwkJCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93V2FybmluZygKLS8vCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLQotCQkJCQkKLQkJCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0Rpc2NpcGxpbmUoZ2V0QWN0aW9uTWFuYWdlcigpLAotCQkJCQkJKERpc2NpcGxpbmUpIGRpc2NpcGxpbmUsIHRhc2ssIHVzZWRDYXRlZ29yaWVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGl0Lm5leHQoKTsKLQkJCQlMaWJyYXJ5TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUZyb21EaXNjaXBsaW5lKAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBkaXNjaXBsaW5lLCB0YXNrLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoVGFzaykgb2JqZWN0KQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHRhc2ssIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KAotCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLCBjdXN0b21DYXRlZ29yeSwgdGFzaywgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuRElTQ0lQTElORVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyMiA9IG5ldyBDdXN0b21DYXRlZ29yeUZpbHRlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza0NhdGVnb3JpZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDIoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDIoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrQ2F0ZWdvcmllc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvblN0cmluZygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tDYXRlZ29yaWVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmNWE2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tEZXNjcmlwdGlvblBhZ2UiOyAvLyROT04tTkxTLTEkCQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1RBU0sgPSBBdXRob3JpbmdVSVRleHQuQkFTRV9FTEVNRU5UX1RFWFQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2FsdGVybmF0aXZlczsKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNjcmVhdGVFZGl0b3JDb250ZW50KEZvcm1Ub29sa2l0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCQljdHJsX2FsdGVybmF0aXZlcyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCWRldGFpbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFMVEVSTkFUSVZFU19URVhULCA0MCwgNDAwLAotCQkJCURFVEFJTF9TRUNUSU9OX0lEKTsKLQkJbGFiZWxfYmFzZS5zZXRUZXh0KEJBU0VfVEFTSyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCQlTdHJpbmcgcHVycG9zZSA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2suZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJLmdldFB1cnBvc2UoKTsKLQkJU3RyaW5nIGFsdGVybmF0aXZlcyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24pIHRhc2sKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEFsdGVybmF0aXZlcygpOwotCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChwdXJwb3NlID09IG51bGwgPyAiIiA6IHB1cnBvc2UpOyAvLyROT04tTkxTLTEkCQotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRUZXh0KGFsdGVybmF0aXZlcyA9PSBudWxsID8gIiIgOiBhbHRlcm5hdGl2ZXMpOyAvLyROT04tTkxTLTEkCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJZmluYWwgTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCk7Ci0KLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpKTsKLQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfcHVycG9zZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQk6IGN0cmxfcHVycG9zZTsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzawotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRQdXJwb3NlKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQljb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBlZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKAotCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQljdHJsX2FsdGVybmF0aXZlcy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJOiBjdHJsX2FsdGVybmF0aXZlczsKLQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbikgdGFzawotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRBbHRlcm5hdGl2ZXMoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjcmVmcmVzaChib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goYm9vbGVhbiBlZGl0YWJsZSkgewotCQlzdXBlci5yZWZyZXNoKGVkaXRhYmxlKTsKLQkJY3RybF9hbHRlcm5hdGl2ZXMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRBU0tTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRhc2spOwotCQkJfQotCQl9OwotCi0JCS8vIFNldCBhZGRpdGlvbmFsIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IGNoZWNraW5nLgotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJdGFzaykgfSk7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza19kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrR3VpZGFuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tHdWlkYW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4NDU0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tHdWlkYW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5HdWlkYW5jZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgR3VpZGFuY2UgcGFnZSBpbiB0aGUgVGFzayBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza0d1aWRhbmNlUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGFzayB0YXNrOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza0d1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJc2V0VXNlQ2F0ZWdvcnkyKGZhbHNlKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0QWxsb3dDaGFuZ2UxKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBVSUhlbHBlci5nZXRTZWxlY3RlZEd1aWRhbmNlcyh0YXNrKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gR3VpZGFuY2VzIGZvciBjb250ZW50IGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IAotCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCShQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIHRhc2ssIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQkoVG9vbE1lbnRvcikgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQkoUmV1c2FibGVBc3NldCkgaXRlbSwgLTEpOwotCQkJCX0gCi0JCQkJZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiArIHRhc2suZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIjoiICsgdGFzay5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJCXNldERpcnR5KHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIEd1aWRhbmNlIGZvciB0aGUgbWV0aG9kIGVsZW1lbnQuCi0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCXRhc2ssCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLAotCQkJCQkJCQkJKENoZWNrbGlzdCkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJKENvbmNlcHQpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFeGFtcGxlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQkoRXhhbXBsZSkgaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCShQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksIHRhc2ssIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJZWRpdG9yLmdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbigKLQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwKLQkJCQkJCQkoU3VwcG9ydGluZ01hdGVyaWFsKSBpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkJCQl0YXNrLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCShHdWlkZWxpbmUpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCXRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfVG9vbE1lbnRvcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQllZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQl0YXNrLAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCShSZXVzYWJsZUFzc2V0KSBpdGVtLCAtMSk7Ci0JCQkJfSAKLS8vCQkJCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFc3RpbWF0ZSkgewotLy8JCQkJCWVkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotLy8JCQkJCQkJdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0ZSgpLAotLy8JCQkJCQkJbnVsbCwgLTEpOwotLy8JCQkJfSAKLQkJCQllbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJIlVuYWJsZSB0byByZW1vdmUgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCSJmcm9tICIgKyB0YXNrLmdldFR5cGUoKS5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICI6IiArIHRhc2suZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQl9Ci0JCQl9Ci0JCQlzZXREaXJ0eSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1JvbGVzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrUm9sZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTgwNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrUm9sZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ29udGVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGVzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrUm9sZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gInRhc2tSb2xlc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza1JvbGVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlJPTEVTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChUYXNrKSBvYmplY3QpLmdldFBlcmZvcm1lZEJ5KCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwxKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewkJCi0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZCk7Ci0JCQlMaXN0IGFkZEl0ZW1zRmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZEl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucygoKFJvbGUpIGFkZEl0ZW1zLmdldChpKSkpKSB7Ci0JCQkJCWFkZEl0ZW1zRmlsdGVyZWQuYWRkKGFkZEl0ZW1zLmdldChpKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFkZEl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRhc2ssCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChSb2xlKSBhZGRJdGVtcy5nZXQoaSkpKSkgewotCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLmFkZChhZGRJdGVtcy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJCXJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlJPTEVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0JbmV3IENvbnRlbnRGaWx0ZXIgKCl7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYodGFzay5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpICE9IG51bGwpewotCQkJCQlMaXN0IGxpc3QgPSB0YXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCQkJCWZvcihJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBSb2xlKXsKLQkJCQkJCQlpZihvYmogPT0gbmV4dCkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbigoVmFyaWFiaWxpdHlFbGVtZW50KW5leHQsIG9iaikpCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFJvbGUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjIoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgQ29udGVudEZpbHRlciAoKXsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZih0YXNrLmdldFBlcmZvcm1lZEJ5KCkgIT0gbnVsbCl7Ci0JCQkJCQotCQkJCQlMaXN0IGxpc3QgPSB0YXNrLmdldFBlcmZvcm1lZEJ5KCk7Ci0JCQkJCWZvcihJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQkJCQlPYmplY3QgbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBSb2xlKXsKLQkJCQkJCQlpZihvYmogPT0gbmV4dCkgcmV0dXJuIGZhbHNlOwotCQkJCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbigoUm9sZSluZXh0LCBvYmopKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBSb2xlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSb2xlIGZpbHRlcgotCSAqCi0JICovCi0JcHVibGljIGNsYXNzIFJvbGVGaWx0ZXIgZXh0ZW5kcyBDb250ZW50RmlsdGVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYodGFzay5nZXRQZXJmb3JtZWRCeSgpICE9IG51bGwpewotCQkJCUxpc3QgbGlzdCA9IHRhc2suZ2V0UGVyZm9ybWVkQnkoKTsKLQkJCQlmb3IoSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJCQlPYmplY3QgbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFJvbGUpewotCQkJCQkJaWYob2JqID09IG5leHQpIHJldHVybiBmYWxzZTsKLQkJCQkJCWlmKCFjaGVja0NvbnRyaWJ1dGlvbigoUm9sZSluZXh0LCBvYmopKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgUm9sZSk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ2hlY2sgY29udHJpYnV0aW9uCi0JICogQHBhcmFtIGNvbnRyaWJ1dG9yCi0JICogQHBhcmFtIG9iagotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoZWNrQ29udHJpYnV0aW9uKFZhcmlhYmlsaXR5RWxlbWVudCBjb250cmlidXRvciwgT2JqZWN0IG9iail7Ci0JCWlmKFRuZ1V0aWwuaXNDb250cmlidXRvcihjb250cmlidXRvcikgJiYgb2JqIGluc3RhbmNlb2YgUm9sZSl7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IGNvbnRyaWJ1dG9yLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJaWYoZS5lcXVhbHMob2JqKSkgcmV0dXJuIGZhbHNlOwotCQkJCWlmKFRuZ1V0aWwuaXNDb250cmlidXRvcihlKSkKLQkJCQkJcmV0dXJuIGNoZWNrQ29udHJpYnV0aW9uKGUsIG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrUm9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1JvbGVzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9UYXNrU3RlcHNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tTdGVwc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZTRjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tTdGVwc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuU2VjdGlvbnNPcmRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkVkaXRvcnNDb250ZXh0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZUZyb21TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNYW5hZ2VkRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuSHlwZXJsaW5rRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0KLS8qKgotICogVGhlIFN0ZXBzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrU3RlcHNQYWdlIGV4dGVuZHMgQmFzZUZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidGFza1N0ZXBzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGV4dCBjdHJsX25hbWU7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9kZWxldGUsIGN0cmxfdXAsIGN0cmxfZG93biwgY3RybF9vcmRlcmluZzsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zdGVwczsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc3RlcHNUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3QgYWxsU3RlcHM7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXNjRXhwYW5kRmxhZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dEVkaXRvciBjdHJsX2V4cGFuZGVkOwotCi0JcHJvdGVjdGVkIEltYWdlSHlwZXJsaW5rIGV4cGFuZExpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBmb3JtU2VjdGlvbjsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlOwotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2VuZXJhbENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kZWRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGN0cmxfbWFpbmRlc2M7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXI7Ci0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uIGN1cnJlbnRTdGVwOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBjb250ZW50TW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhc2tTdGVwc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5TVEVQU19QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IG1ldGhvZEVsZW1lbnRJbnB1dCA9IChNZXRob2RFbGVtZW50RWRpdG9ySW5wdXQpIGlucHV0OwotCQl0YXNrID0gKFRhc2spIG1ldGhvZEVsZW1lbnRJbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuY3JlYXRlRm9ybUNvbnRlbnQoSU1hbmFnZWRGb3JtCi0JICogICAgICBtYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb3JtQ29udGVudChJTWFuYWdlZEZvcm0gbWFuYWdlZEZvcm0pIHsKLQkJc3VwZXIuY3JlYXRlRm9ybUNvbnRlbnQobWFuYWdlZEZvcm0pOwotCi0JCWZvcm0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LmdldFVJVGV4dCh0YXNrKSArICI6ICIgKyB0YXNrLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3JtU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihmb3JtLmdldEJvZHkoKSwgU2VjdGlvbi5OT19USVRMRSk7Ci0JCXsKLQkJCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCQlmb3JtU2VjdGlvbi5zZXRMYXlvdXREYXRhKHRkKTsKLQkJCWZvcm1TZWN0aW9uLnNldExheW91dChuZXcgVGFibGVXcmFwTGF5b3V0KCkpOwotCQl9Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIGZvciB0aGUgc2VjdGlvbnMuCi0JCXNlY3Rpb25Db21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShmb3JtU2VjdGlvbiwgU1dULk5PTkUpOwotCQlzZWN0aW9uQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQkJZm9ybVNlY3Rpb24uc2V0Q2xpZW50KHNlY3Rpb25Db21wb3NpdGUpOwotCi0JCS8vIENyZWF0ZSB0aGUgR2VuZXJhbCBJbmZvcm1hdGlvbiBzZWN0aW9uLgotCQlnZW5lcmFsU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihzZWN0aW9uQ29tcG9zaXRlLAotCQkJCVNlY3Rpb24uVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTiB8IFNlY3Rpb24uVFdJU1RJRQotCQkJCQkJfCBTZWN0aW9uLkVYUEFOREVEKTsKLQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5TVEVQU19TRUNUSU9OX05BTUUpOwotCQlnZW5lcmFsU2VjdGlvbi5zZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVRleHQuU1RFUFNfU0VDVElPTl9ERVNDKTsKLQkJZ2VuZXJhbFNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWdlbmVyYWxDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShnZW5lcmFsU2VjdGlvbik7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdlbmVyYWxDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDQsIGZhbHNlKSk7Ci0JCWdlbmVyYWxTZWN0aW9uLnNldENsaWVudChnZW5lcmFsQ29tcG9zaXRlKTsKLQotCQlFZGl0b3JzQ29udGV4dEhlbHBlci5zZXRIZWxwKGdlbmVyYWxDb21wb3NpdGUuZ2V0UGFyZW50KCksIHRhc2spOwotCi0JCUNvbXBvc2l0ZSBwYW5lMSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gMTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJCXBhbmUxLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcGFuZTEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQl9Ci0KLQkJTGFiZWwgbF9uYW1lID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYW5lMSwgQXV0aG9yaW5nVUlUZXh0LlNURVBTX1RFWFQpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJbF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3RybF9zdGVwcyA9IHRvb2xraXQuY3JlYXRlVGFibGUocGFuZTEsIFNXVC5NVUxUSSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gMTUwOwotCQkJY3RybF9zdGVwcy5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWluaXRQcm92aWRlcnMoKTsKLQotCQlzdGVwc1RhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfc3RlcHMpOwotCQlzdGVwc1RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzdGVwc1ZpZXdlckNvbnRlbnRQcm92aWRlcik7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIpOwotCi0JCUNvbXBvc2l0ZSBwYW5lMiA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGdlbmVyYWxDb21wb3NpdGUpOwotCQlwYW5lMi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljdHJsX2FkZCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLCBBdXRob3JpbmdVSVRleHQuQUREX0JVVFRPTl9URVhULAotCQkJCVNXVC5OT05FKTsKLQkJY3RybF9hZGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3RybF9kZWxldGUgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYW5lMiwKLQkJCQlBdXRob3JpbmdVSVRleHQuREVMRVRFX0JVVFRPTl9URVhULCBTV1QuTk9ORSk7Ci0JCWN0cmxfZGVsZXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQljdHJsX3VwID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsIEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCwKLQkJCQlTV1QuTk9ORSk7Ci0JCWN0cmxfdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9kb3duID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFuZTIsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQsIFNXVC5OT05FKTsKLQkJY3RybF9kb3duLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJY3RybF9vcmRlcmluZyA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhbmUyLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5PUkRFUl9CVVRUT05fVEVYVCwgU1dULk5PTkUpOwotCQljdHJsX29yZGVyaW5nLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIG5hbWUKLQkJTGFiZWwgbmFtZUxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TVEVQX05BTUVfVEVYVCk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDQ7Ci0JCQluYW1lTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJY3RybF9uYW1lID0gdG9vbGtpdC5jcmVhdGVUZXh0KGdlbmVyYWxDb21wb3NpdGUsICIiLCBTV1QuU0lOR0xFKTsgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSA0OwotCQkJY3RybF9uYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJY3JlYXRlQmxhbmtMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCA0KTsKLQotCQljdHJsX21haW5kZXNjID0gY3JlYXRlUmljaFRleHRFZGl0V2l0aExpbmsoCi0JCQkJdG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQsCi0JCQkJMjUwLCAzMDAsIDQpOwotCi0JCWNyZWF0ZVJpY2hUZXh0RWRpdG9yU2VjdGlvbigpOwotCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTIpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoZXhwYW5kZWRDb21wb3NpdGUpOwotCi0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJbG9hZERhdGEoKTsKLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzIHRvIG1vbml0b3IgZm9jdXMgYW5kIG1vZGlmaWNhdGlvbiBjaGFuZ2VzIGluIHRoZSBlZGl0Ci0JICogY29udHJvbHMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlmaW5hbCBNZXRob2RFbGVtZW50RWRpdG9yIGVkaXRvciA9IChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJY29udGVudE1vZGlmeUxpc3RlbmVyID0gZWRpdG9yLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGN1cnJlbnRTdGVwKTsKLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWZvcm0uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0vLwkJCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KChFT2JqZWN0KSB0YXNrLCBnZXRTaXRlKCkKLS8vCQkJCQkJLmdldFNoZWxsKCkpOwotLy8JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQlsb2FkRGF0YSgpOwotLy8JCQkJfQotCQkJCWlmIChmb3JtICE9IG51bGwgJiYgIWZvcm0uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCVVJSGVscGVyLnNldEZvcm1UZXh0KGZvcm0sIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJbG9hZERhdGEoKTsKLQkJCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCkpIHsKLQkJCQkJZW5hYmxlQ29udHJvbHMoZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWNoZWNrU2VsZWN0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJZGVhY3RpdmF0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlmb3JtLmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlpZiAoY3RybF9leHBhbmRlZCAhPSBudWxsKSB7Ci0JCQkJCSgoR3JpZERhdGEpIGN0cmxfZXhwYW5kZWQuZ2V0TGF5b3V0RGF0YSgpKS5oZWlnaHRIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKTsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQl9Ci0JCQkJZm9ybVNlY3Rpb24ubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9uYW1lLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbmFtZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJaWYgKGN1cnJlbnRTdGVwICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBjdXJyZW50U3RlcC5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBuZXdDb250ZW50ID0gY3RybF9uYW1lLmdldFRleHQoKTsKLQkJCQkJaWYgKGN0cmxfbmFtZS5nZXRUZXh0KCkgPT0gbnVsbAotCQkJCQkJCXx8IGN0cmxfbmFtZS5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5yZW5hbWVEaWFsb2dfdGl0bGUsIExpYnJhcnlVSVRleHQuVEVYVF9TVEVQKTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoTGlicmFyeVVJVGV4dC5URVhUX1NURVApKTsgCi0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnKTsKLQkJCQkJCWN0cmxfbmFtZS5zZXRTZWxlY3Rpb24oMCwgb2xkQ29udGVudC5sZW5ndGgoKSk7Ci0JCQkJCX0gZWxzZSBpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBjdXJyZW50U3RlcCwKLQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX21haW5kZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCWN0cmxfbWFpbmRlc2MuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQlzYXZlTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJY2hlY2tTZWxlY3Rpb24oKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCWN0cmxfYWRkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBjaGlsZCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2VjdGlvbigpOwotCQkJCVN0cmluZyBuZXdOYW1lID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlBdXRob3JpbmdVSVRleHQuTkVXX0VMRU1FTlRfVEVYVCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IExpYnJhcnlVSVRleHQuVEVYVF9TVEVQIH0pOwotCQkJCWNoaWxkLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IEFkZFRvU2VjdGlvbkxpc3RDb21tYW5kKHRhc2ssCi0JCQkJCQljaGlsZCwgYWxsU3RlcHMpOwotCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5leGVjdXRlKGNtZCk7Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc3RlcHNUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2hpbGQpKTsKLQkJCQljdHJsX25hbWUuc2V0Rm9jdXMoKTsKLQkJCQljdHJsX25hbWUuc2V0U2VsZWN0aW9uKDAsIG5ld05hbWUubGVuZ3RoKCkpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX2RlbGV0ZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHN0ZXBzVGFibGVWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24udG9MaXN0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIHsKLQkJCQkJCVJlbW92ZUZyb21TZWN0aW9uTGlzdCBjbWQgPSBuZXcgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0KAotCQkJCQkJCQl0YXNrLCAob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBvLCBhbGxTdGVwcyk7Ci0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCWVkaXRTdGVwKG51bGwpOwotCQkJfQotCQl9KTsKLQotCQljdHJsX3VwLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJQXJyYXlMaXN0IG1vdmVVcEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1vdmVVcEl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCU1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCBjbWQgPSBuZXcgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kKAotCQkJCQkJdGFzaywgbW92ZVVwSXRlbXMsIGFsbFN0ZXBzLCAxKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX2Rvd24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzdGVwc1RhYmxlVmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJQXJyYXlMaXN0IG1vdmVEb3duSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW92ZURvd25JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQlNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQgY21kID0gbmV3IE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZCgKLQkJCQkJCXRhc2ssIG1vdmVEb3duSXRlbXMsIGFsbFN0ZXBzLCAwKTsKLQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZXhlY3V0ZShjbWQpOwotCi0JCQkJc3RlcHNUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkJLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgLSAxCi0JCQkJCQkmJiAhVG5nVXRpbC5pc0xvY2tlZCh0YXNrKSkgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQljdHJsX29yZGVyaW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNlY3Rpb25zT3JkZXJEaWFsb2cgZGxnID0gbmV3IFNlY3Rpb25zT3JkZXJEaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJdGFzaywKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlN0ZXBzT3JkZXJEaWFsb2dfdGl0bGUsIAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuU3RlcHNPcmRlckRpYWxvZ19kZXNjcmlwdGlvbiwgCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zdGVwc190ZXh0KTsgCi0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlQ29udHJvbHMoYm9vbGVhbiBlZGl0YWJsZSkgewotCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQljdHJsX21haW5kZXNjLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfZGVsZXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljdHJsX2Rvd24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfb3JkZXJpbmcuc2V0RW5hYmxlZCh0cnVlKTsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgIT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkvLyBTYXZlIHRoZSBzdGVwIG9yZGVyLgotCQlpZiAoYWxsU3RlcHMgIT0gbnVsbCkgewotCQkJYWxsU3RlcHMuYXBwbHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBjb250cm9scyB3aXRoIGRhdGEgZnJvbSB0aGUgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWREYXRhKCkgewotCQlhbGxTdGVwcyA9IG51bGw7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIuc2V0SW5wdXQodGFzayk7Ci0JCXN0ZXBzVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQllZGl0U3RlcChjdXJyZW50U3RlcCk7Ci0JfQotCi0JLyoqCi0JICogRWRpdCBjdXJyZW50IHN0ZXAuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVkaXRTdGVwKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBzdGVwKSB7Ci0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCi0JCWlmIChjdHJsX21haW5kZXNjLmdldE1vZGlmaWVkKCkpIHsKLQkJCXNhdmVNYWluRGVzY3JpcHRpb24oKTsKLQkJfQotCi0JCWN1cnJlbnRTdGVwID0gc3RlcDsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjdXJyZW50U3RlcCAhPSBudWxsKSB7Ci0JCQluYW1lID0gY3VycmVudFN0ZXAuZ2V0TmFtZSgpOwotCQkJZGVzYyA9IGN1cnJlbnRTdGVwLmdldFNlY3Rpb25EZXNjcmlwdGlvbigpOwotCQkJY3RybF9uYW1lLnNldEZvY3VzKCk7Ci0JCX0KLQkJY3RybF9uYW1lLnNldFRleHQobmFtZSA9PSBudWxsID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldFRleHQoZGVzYyA9PSBudWxsID8gIiIgOiBkZXNjKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX21haW5kZXNjLnNldE1vZGFsT2JqZWN0KGN1cnJlbnRTdGVwKTsKLQkJY3RybF9tYWluZGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKSk7Ci0JCWlmIChzdGVwID09IG51bGwpIHsKLQkJCS8vIGNsb3NlIGFueSBGaW5kL1JlcGxhY2UgZGlhbG9nIG9wZW4gaW4gdGhlIFJURQotCQkJY3RybF9tYWluZGVzYy5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCS5zZXRFbGVtZW50KGN1cnJlbnRTdGVwKTsKLQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJLnNldERpc2FibGUoY3VycmVudFN0ZXAgPT0gbnVsbCk7Ci0KLQkJZW5hYmxlQ29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUgbmFtZSBhbmQgZGVzY3JpcHRpb24gY29udHJvbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5hYmxlQ29udHJvbHMoKSB7Ci0JCWlmICh0YXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoY3VycmVudFN0ZXApKSB7Ci0JCQlpZiAoIVRuZ1V0aWwuaXNMb2NrZWQoY29udGVudEVsZW1lbnQpKSB7Ci0JCQkJY3RybF9uYW1lLnNldEVkaXRhYmxlKHRydWUpOwotCQkJCWN0cmxfbWFpbmRlc2Muc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX25hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJY3RybF9tYWluZGVzYy5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlIGxpc3RlbmVyCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybVBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmljaFRleHRFZGl0b3JTZWN0aW9uKCkgewotCQlleHBhbmRlZENvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKGZvcm1TZWN0aW9uLCBTV1QuTk9ORSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCi0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kTGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsoZXhwYW5kZWRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZXhwYW5kTGluay5zZXRJbWFnZShBdXRob3JpbmdVSUltYWdlcy5JTUdfRVhQQU5ERUQpOwotCQlleHBhbmRMaW5rLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNsb3NlUlRFKTsgCi0JCWV4cGFuZExpbmsuc2V0VW5kZXJsaW5lZChmYWxzZSk7Ci0JCWV4cGFuZExpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cGFuZExhYmVsID0gY3JlYXRlRGVjb3JhdGVkTGFiZWwodG9vbGtpdCwgZXhwYW5kZWRDb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBEZXNjcmlwdGlvbiBjb250cm9sIHRvIGV4cGFuZCBhbmQgY29udHJvbCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0b2dnbGUoSHlwZXJsaW5rRXZlbnQgZSkgewotCQlpZiAoY3VycmVudFN0ZXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGN0cmxfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9leHBhbmRlZCA9IGNyZWF0ZVJpY2hUZXh0RWRpdG9yKHRvb2xraXQsIGV4cGFuZGVkQ29tcG9zaXRlLAotCQkJCQlTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCQlnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpLCBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCksIDIsIGV4cGFuZExhYmVsKTsKLQkJCWN0cmxfZXhwYW5kZWQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCWlmIChkZXNjRXhwYW5kRmxhZykgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXhwYW5kZWRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoc2VjdGlvbkNvbXBvc2l0ZSk7Ci0JCQlJTWV0aG9kUmljaFRleHQgcmljaFRleHQgPSBhY3RpdmVDb250cm9sOwotCQkJcmljaFRleHQuc2V0VGV4dChjdHJsX2V4cGFuZGVkLmdldFRleHQoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSByaWNoVGV4dC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLCBsaXN0ZW5lcgotCQkJCQkJLmdldExpc3RlbmVyKCkpOwotCQkJfQotCQkJaWYgKGN0cmxfZXhwYW5kZWQuZ2V0TW9kaWZpZWQoKSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkuc2F2ZU1vZGlmaWVkUmljaFRleHQoY3RybF9leHBhbmRlZCk7Ci0JCQl9Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9IGVsc2UgewotCQkJc2VjdGlvbkNvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWV4cGFuZGVkQ29tcG9zaXRlLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlmb3JtU2VjdGlvbi5zZXRDbGllbnQoZXhwYW5kZWRDb21wb3NpdGUpOwotCQkJZXhwYW5kTGFiZWwuc2V0VGV4dChjdXJyZW50U3RlcC5nZXROYW1lKCkgKwotCQkJCQkiIC0gIiArIChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUuZ2V0U291cmNlKCkpLmdldERhdGEoIlRpdGxlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlNZXRob2RSaWNoVGV4dCByaWNoVGV4dCA9IChJTWV0aG9kUmljaFRleHQpIGUuZ2V0SHJlZigpOwotCQkJY3RybF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChyaWNoVGV4dC5nZXRUZXh0KCkpOwotCQkJY3RybF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChyaWNoVGV4dC5nZXRNb2RhbE9iamVjdCgpKTsKLQkJCWN0cmxfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKHJpY2hUZXh0Ci0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKHJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkpOwotCQkJZm9yIChJdGVyYXRvciBpID0gcmljaFRleHQuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwgbGlzdGVuZXIKLQkJCQkJCS5nZXRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWJvb2xlYW4gZWRpdGFibGUgPSAhVG5nVXRpbC5pc0xvY2tlZChjb250ZW50RWxlbWVudCk7Ci0JCQljdHJsX2V4cGFuZGVkLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmIChlZGl0YWJsZSkgewotCQkJCWN0cmxfZXhwYW5kZWQuc2V0Rm9jdXMoKTsKLQkJCX0KLQkJCWFjdGl2ZUNvbnRyb2wgPSByaWNoVGV4dDsKLQkJfQotCi0JCWZvcm0uZ2V0Qm9keSgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJZGVzY0V4cGFuZEZsYWcgPSAhZGVzY0V4cGFuZEZsYWc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXN0ZXBzVmlld2VyQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKGFsbFN0ZXBzID09IG51bGwpIHsKLQkJCQkJYWxsU3RlcHMgPSBuZXcgU2VjdGlvbkxpc3QodGFzaywKLQkJCQkJCQlTZWN0aW9uTGlzdC5TVEVQU19GT1JfRUxFTUVOVF9PTkxZKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGFsbFN0ZXBzLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlzdGVwc1ZpZXdlckxhYmVsUHJvdmlkZXIgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICF0YXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY29udGFpbnMoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVNYWluRGVzY3JpcHRpb24oKSB7Ci0JCWlmIChjdXJyZW50U3RlcCAhPSBudWxsKSB7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQk6IGN0cmxfbWFpbmRlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gY3VycmVudFN0ZXAuZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLAotCQkJCQlvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgY3VycmVudFN0ZXAsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCUZvcm1FZGl0b3IgZWRpdG9yID0gZ2V0RWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tTZWxlY3Rpb24oKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc3RlcHNUYWJsZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spKSB7Ci0JCQljdHJsX2RlbGV0ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQlpZiAoc3RlcHNUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwCi0JCQkJCSYmICFUbmdVdGlsLmlzTG9ja2VkKHRhc2spICYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCWN0cmxfdXAuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJaWYgKHN0ZXBzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgc3RlcHNUYWJsZVZpZXdlcgotCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJJiYgIVRuZ1V0aWwuaXNMb2NrZWQodGFzaykgJiYgc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJY3RybF9kb3duLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQllZGl0U3RlcCgob3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1dvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvVGFza1dvcmtQcm9kdWN0c1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTllZDVjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rhc2tXb3JrUHJvZHVjdHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBXb3JrIFByb2R1Y3RzIHBhZ2UgaW4gdGhlIFRhc2sgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrV29ya1Byb2R1Y3RzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ0YXNrV29ya1Byb2R1Y3RzUGFnZSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFRhc2sgdGFzazsKLQotCXByaXZhdGUgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza1dvcmtQcm9kdWN0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5XT1JLX1BST0RVQ1RTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJdGFzayA9IChUYXNrKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRBbGxvd0NoYW5nZTEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMih0cnVlKTsKLQkJc2V0QWxsb3dDaGFuZ2UzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLmNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRNYW5kYXRvcnlJbnB1dCgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSByZXRyaWV2ZVRhYmxlVmlld2VyQ29udGVudHModmlld2VyX3NlbGVjdGVkMik7Ci0JCQlMaXN0IGFkZEl0ZW1zRmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZEl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucygoKFdvcmtQcm9kdWN0KSBhZGRJdGVtcy5nZXQoaSkpKSkgewotCQkJCQlhZGRJdGVtc0ZpbHRlcmVkLmFkZChhZGRJdGVtcy5nZXQoaSkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhZGRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIHJtSXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKFRhc2spIG9iamVjdCkuZ2V0T3B0aW9uYWxJbnB1dCgpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJTGlzdCBhZGRJdGVtc0ZpbHRlcmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRJdGVtcy5zaXplKCk7IGkrKykgewotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnMoKChXb3JrUHJvZHVjdCkgYWRkSXRlbXMuZ2V0KGkpKSkpIHsKLQkJCQkJYWRkSXRlbXNGaWx0ZXJlZC5hZGQoYWRkSXRlbXMuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkSXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLAotCQkJCQkJYWRkSXRlbXNGaWx0ZXJlZCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDIoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB0YXNrLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoVGFzaykgb2JqZWN0KS5nZXRPdXRwdXQoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZDMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlclNlbGVjdGVkMyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMyhBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0YXNrLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX091dHB1dCgpLCBhZGRJdGVtcywgLTEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgdGFzaywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCBybUl0ZW1zLCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcjMoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcjMoKSB7Ci0JCXJldHVybiBmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudGFza1dvcmtQcm9kdWN0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50YXNrV29ya1Byb2R1Y3RzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRhc2tXb3JrUHJvZHVjdHNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xEZXNjcmlwdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4ZGIwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xEZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIERvbWFpbiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xEZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBEZXNjcmlwdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidG9vbERlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFRvb2wgdG9vbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xEZXNjcmlwdGlvblBhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9QQUdFX1RJVExFKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXRvb2wgPSAoVG9vbCkgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgQ2F0ZWdvcnlGaWx0ZXIoKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIChvYmogaW5zdGFuY2VvZiBUb29sKTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJLnNldEFkZGl0aW9uYWxGaWx0ZXJzKG5ldyBJRmlsdGVyW10geyBuZXcgVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcigKLQkJCQkJCXRvb2wpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuVE9PTFM7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbF9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy50b29sX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Ub29sVG9vbE1lbnRvcnNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xUb29sTWVudG9yc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1NjU3Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1Rvb2xUb29sTWVudG9yc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTW92ZUluQ2F0ZWdvcnlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5DYXRlZ29yeVNvcnRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnRlbnRFbGVtZW50T3JkZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFRvb2wgTWVudG9ycyBwYWdlIGluIHRoZSBUb29sIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBMb2thbmF0aCBKYWdnYQotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRvb2xUb29sTWVudG9yc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAidG9vbFRvb2xNZW50b3JzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVG9vbCB0b29sOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0JCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBhbGxTdGVwczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRvb2xUb29sTWVudG9yc1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsIEF1dGhvcmluZ1VJVGV4dC5UT09MX01FTlRPUlNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl0b29sID0gKFRvb2wpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JCXNldElzVXBBbmREb3duQnV0dG9uc1JlcXVpcmVkMSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkvL3JldHVybiB0b29sLmdldFRvb2xNZW50b3JzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoCi0JCQkJCQljb250ZW50RWxlbWVudCwgYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZSh0b29sLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCBlbGVtZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCB0b29sLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCksIGFkZEl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIHRvb2wsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSwgcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlciA9IG5ldyBHdWlkYW5jZUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMudG9vbFRvb2xNZW50b3JzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy50b29sVG9vbE1lbnRvcnNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnRvb2xUb29sTWVudG9yc1BhZ2Vfc2VsZWN0ZWRMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBnZXRDb250ZW50RWxlbWVudE9yZGVyTGlzdCgpIHsKLQkJcmV0dXJuIGFsbFN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ODhkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5DYXRlZ29yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgQ2F0ZWdvcmllcyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogcmVtb3ZlIHRoZSB0by1vbmUgVUkgcmVzdHJpY3Rpb24gb24gd3AtZG9taWFuIChSMzk1MzkwKSAyMDA3LTA4LTMwCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkNBVEVHT1JJRVNfUEFHRV9USVRMRSk7Ci0JfQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlzZXRVc2VDYXRlZ29yeTModHJ1ZSk7Ci0JCXNldENhdGVnb3J5SXNTaW5nbGVTZWxlY3Rpb24xKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5nZXREb21haW5zKChXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgZG9tYWluID0gYWRkSXRlbXMuZ2V0KDApOwotCQkJTGlzdCBkb21haW5zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RG9tYWlucyh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAoZG9tYWlucyAhPSBudWxsICYmIGRvbWFpbnMuc2l6ZSgpID4gMCkJewotCQkJCU9iamVjdCBhc3NvY2lhdGVkRG9tYWluID0gZG9tYWlucy5nZXQoMCk7Ci0vLwkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotLy8JCQkJLmZvcm1hdCgKLS8vCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLS8vCQkJCQkJbmV3IE9iamVjdFtdIHsKLS8vCQkJCQkJCQl3b3JrUHJvZHVjdC5nZXROYW1lKCksCi0vLwkJCQkJCQkJVG5nVXRpbAotLy8JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoYXNzb2NpYXRlZERvbWFpbiksCi0vLwkJCQkJCQkJKChEb21haW4pIGRvbWFpbikuZ2V0TmFtZSgpIH0pOwotLy8JCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKAotLy8JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLS8vCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRUb0RvbWFpbihnZXRBY3Rpb25NYW5hZ2VyKCksCi0JCQkJCShEb21haW4pIGRvbWFpbiwgd29ya1Byb2R1Y3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbURvbWFpbigKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgZG9tYWluLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFdvcmtQcm9kdWN0VHlwZXMoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDIoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9Xb3JrUHJvZHVjdFR5cGUoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIHdwVHlwZSwgd29ya1Byb2R1Y3QsIHVzZWRDYXRlZ29yaWVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlRnJvbVdvcmtQcm9kdWN0VHlwZSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgd3BUeXBlLCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMygpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoCi0JCQkJCQkoV29ya1Byb2R1Y3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQzLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDMoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjdXN0b21DYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCUxpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkuYWRkVG9DdXN0b21DYXRlZ29yeSgKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKSwgY3VzdG9tQ2F0ZWdvcnksIHdvcmtQcm9kdWN0LCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMyhBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGphdmEudXRpbC5JdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoCi0JCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCksIGN1c3RvbUNhdGVnb3J5LCB3b3JrUHJvZHVjdCwgdXNlZENhdGVnb3JpZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcyKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0VGFiU3RyaW5nMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmczKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IENhdGVnb3J5RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgRG9tYWluKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIyKCkgewotCQlyZXR1cm4gZmlsdGVyMiA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyMygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyMygpIHsKLQkJcmV0dXJuIGZpbHRlcjMgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlGaWx0ZXIoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2Vfc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RDYXRlZ29yaWVzUGFnZV9zZWxlY3RlZExhYmVsMjsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbDMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbDMoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX3NlbGVjdGVkTGFiZWwzOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdENhdGVnb3JpZXNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlZDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVsaXZlcmFibGUgUGFydHMgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2UoRm9ybUVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIoZWRpdG9yLCBGT1JNX1BBR0VfSUQsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFTElWRVJBQkxFX1BBUlRTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRGVsaXZlcmFibGUgd3AgPSAoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0OwotCQkJCXJldHVybiB3cC5nZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYWRkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0IGl0ZW0gPSAoV29ya1Byb2R1Y3QpIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSwgaXRlbSwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdCBpdGVtID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCksIGl0ZW0sCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRDb250ZW50RWxlbWVudCgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlmaWx0ZXIgPSBuZXcgV29ya1Byb2R1Y3RGaWx0ZXIoKSB7Ci0JCQkvKgotCQkJICogQXJyYXlMaXN0KGJhZGxpc3QpIGlzIHVzZWQgdG8gc3RvcmUgYWxsCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgZm9yIHN1YnBhcnRzIG9mCi0JCQkgKiBnZW5lcmFsaXplci9iYXNldmFyaWFiaWxpdHkgY2FuIGJlIHJlamVjdGVkLiBEZWxpdmVyYWJsZSBjYW5ub3QKLQkJCSAqIGhvbGQgaW5mb3JtYXRpb24gdG8gd2hvIGl0c2VsZiBpcyBhY3RpbmcgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJCSAqLwotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQkvKiAKLQkJCQkJICogQ2hlY2sgRGVsaXZlcmFibGUgYW5kIERlbGl2ZXJhYmxlUGFydHMgYXNzb2NpYXRpb24KLQkJCQkJICogY2lyY3VsYXIgZGVwZW5kZW5jeS4KLQkJCQkJKi8KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJLyoKLQkJCQkJCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBjaGFpbmVkIGRlbGl2ZXJhYmxlIHBhcnRzCi0JCQkJCQkgKiAodHJlZSkgY29udGFpbiB3b3JrUHJvZHVjdCAoZWRpdG9yIG9iamVjdCkuCi0JCQkJCQkgKi8KLQkJCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygKLQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosIChEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWNoZWNrVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBvYmosIGJhZGxpc3QpKSB7Ci0JCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBicm93c2UgdGhyb3VnaCBiYWRsaXN0IGFuZCBpdHMgZGVsaXZlcmFibGUgcGFydHMuCi0JCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJhZGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCVVJSGVscGVyLmRlbGl2ZXJhYmxlUGFydHNDaGFpbigoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJfQotCQkJCQkJaWYgKHRlbXBsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIHJldHVybiB0cnVlIGlmIGFib3ZlIGNvbmRpdGlvbiBhcmUgc3VjY2Vzc2Z1bAotCQkJCQkgKi8KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGVja1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3QgYmFkbGlzdCkgewotCi0JCS8qCi0JCSAqIENoZWNrIGVkaXRvciBvYmplY3QncyB2YXJpYWJpbGl0eSBiYXNlIG9iamVjdCBpcyBjaGlsZCBpbgotCQkgKiBEZWxpdmVyYWJsZShlKSB0cmVlLiB0aGVuIERlbGl2ZXJhYmxlKGUpc2hvdWxkbm90IGJlIGFjY2VwdGVkLiBEMSAtPgotCQkgKiBEMiAtPiBEMyAoIC0+IGluZGljYXRlcyBkZWxpdmVyYWJsZSBwYXJ0IHJlbGF0aW9uc2hpcCkgRDYgY29udHJpYnV0ZXMKLQkJICogRDMuIEQ2IGNhbm5vdCBzZWxlY3QgRDEsRDIgYXMgZGVsaXZlcmFibGUgcGFydC4KLQkJICovCi0JCWlmICh3b3JrUHJvZHVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IHdvcmtQcm9kdWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhlLCAoRGVsaXZlcmFibGUpIG9iaikpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgZWRpdG9yIERlbGl2ZXJhYmxlJ3MgZ2VuZXJhbGl6ZXIsIGlmIGdlbmVyYWxpemVyJ3Mgc3VicGFydHMKLQkJICogKHRyZWUpIGNvbnRhaW5zIHBhc3NlZCBkZWxpdmVyYWJsZS4gUmV0dXJuIGZhbHNlLgotCQkgKi8KLQotCQlJdGVyYXRvciBpdCA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKHdvcmtQcm9kdWN0KTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIGdlbmVyYWxpemVyIGlzIGFkZGVkIHRvIGJhZGxpc3QsIGJlY2F1c2UgaWYgdmFyaWFiaWxpdHkgYmFzZQotCQkJCSAqIGlzIGZpbHRlcmVkIGJlZm9yZSBjb21pbmcgdG8gY2hpbGRBY2NlcHQob2JqZWN0KSBtZXRob2QsIHRoaXMKLQkJCQkgKiB3aWxsIHByZXZlbnRzIGFueSBzdWJwYXJ0cyBvZiBnZW5lcmFsaXplciB0byBiZSBhZGRlZCBhcyBhCi0JCQkJICogZGVsaXZlcmFibGUgcGFydCBvZiBEZWxpdmVyYWJsZSAoRWRpdG9yIG9iamVjdCBvciBsb2NhbAotCQkJCSAqIGRlZmluZWQgdmFyaWFibGUid29ya1Byb2R1Y3QiKS4KLQkJCQkgKiAKLQkJCQkgKiBlZzogRDEgLT4gRDIgLT4gRDMuICgtPiBpbmRpY2F0ZXMgZGVsaXZlcmFibGUgcGFydCkuIEQxCi0JCQkJICogY29udHJpYnV0ZXMgRDUuIGFuZCBENSdzIGRlbGl2ZXJhYmxlIHBhcnRzIGFzc2lnbiBmaWx0ZXIKLQkJCQkgKiBzaG91bGRub3Qgc2hvdyBEMiBhbmQgRDMuCi0JCQkJICogCi0JCQkJICovCi0JCQkJYmFkbGlzdC5hZGQodmUpOwotCQkJCWlmICh2ZS5lcXVhbHMoZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoZSwgKERlbGl2ZXJhYmxlKSB2ZSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCS8qCi0JCSAqIAotCQkgKi8KLQkJaWYgKGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCU9iamVjdCBvYmogPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIG9iaiwKLQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QncyBnZW5lcmFsaXplcidzIGRlbGl2ZXJhYmxlIHBhcnRzIGxpc3QgZG9ub3QgaGF2ZQotCQkgKiB3b3JrUHJvZHVjdC4KLQkJICovCi0JCUl0ZXJhdG9yIGl0MSA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGUpOwotCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCWlmICh2ZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHZlLmVxdWFscyhlKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghVUlIZWxwZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQl9Ci0KLQkJLyoKLQkJICogQ2hlY2sgd29ya1Byb2R1Y3Qgb2JqZWN0IChlZGl0b3Igb2JqZWN0KSdzIHZhcmlhYmlsaXR5IGFuZCBpdHMKLQkJICogZGVsaXZlcmFibGVzIHNob3VsZCBub3QgY29udGFpbiBwYXNzZWQgb2JqZWN0LgotCQkgKi8KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCwgbGlzdCk7Ci0JCWlmIChsaXN0LmNvbnRhaW5zKGUpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8qCi0JCSAqIENoZWNrIHBhc3NlZCBvYmplY3QgdmFyaWFiaWxpdHkgYW5kIGl0cyBkZWxpdmVyYWJsZXMgc2hvdWxkIG5vdAotCQkgKiBjb250YWluIHdvcmtwcm9kdWN0KGRlbGl2ZXJhYmxlIG9yIGVkaXRvciBvYmplY3QpLiBJZiBpdCBjb250YWlucywKLQkJICogcGFzc2VkIG9iamVjdCBzaG91bGRub3QgYmUgYWNjZXB0ZWQuCi0JCSAqLwotCQlkZWxpdmVyYWJsZVBhcnRzVmFyaWFiaWxpdHkoKERlbGl2ZXJhYmxlKSBlLCBsaXN0KTsKLQkJaWYgKGxpc3QuY29udGFpbnMod29ya1Byb2R1Y3QpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsaXZlcmFibGVQYXJ0c1ZhcmlhYmlsaXR5KERlbGl2ZXJhYmxlIGUsIExpc3Qgcm9vdHMpIHsKLQkJTGlzdCBsaXN0ID0gKChEZWxpdmVyYWJsZSkgZSkuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCXJvb3RzLmFkZCgoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoZSk7Ci0JCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0MQotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlbGl2ZXJhYmxlUGFydHNWYXJpYWJpbGl0eSgoRGVsaXZlcmFibGUpIG9iaiwgcm9vdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQlJdGVyYXRvciBpdDEgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhlKTsKLQkJCXdoaWxlIChpdDEuaGFzTmV4dCgpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxLm5leHQoKTsKLQkJCQlVSUhlbHBlci5kZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSB2ZSwgcm9vdHMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50KQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQgY291bnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oY291bnQsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2VfbXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVsaXZlcmFibGVQYXJ0c1BhZ2Vfc2VjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VsZWN0ZWRMYWJlbCgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZWxpdmVyYWJsZVBhcnRzUGFnZV9zZWxlY3RlZExhYmVsOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTg2MmQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3JtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkNvbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLldvcmtQcm9kdWN0RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqIFRoZSBEZXNjcmlwdGlvbiBwYWdlIGluIGEgV29yayBQcm9kdWN0IChBcnRpZmFjdCwgRGVsaXZlcmFibGUgYW5kIE91dGNvbWUpCi0gKiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0RGVzY3JpcHRpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfaW1wYWN0OwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yZWFzb247Ci0KLQkvLyBGb3IgQXJ0aWZhY3QKLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2JyaWVmX291dGxpbmU7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnM7Ci0KLQkvLyBGb3IgRGVsaXZlcmFibGUKLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCBjdHJsX2V4dGVybmFsX2Rlc2MsIGN0cmxfcGFja2FnaW5nX2d1aWRhbmNlOwotCi0JcHJpdmF0ZSBJTWV0aG9kUmljaFRleHQgY3RybF9yZXByZXNlbnRhdGlvbjsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGN0cmxfbm90YXRpb247Ci0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JLy8gRm9yIHNsb3RzCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9zbG90X2J1dHRvbjsKLQkKLQlwcml2YXRlIFNlY3Rpb24gc2xvdFNlY3Rpb247Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgc2xvdENvbXBvc2l0ZTsKLQkKLQlwcml2YXRlIFN0cmluZyBzbG90U2VjdGlvbkRlc2NyaXB0aW9uOwotCQotCXByaXZhdGUgQnV0dG9uIGFkZFNsb3RCdXR0b24sIHJlbW92ZVNsb3RCdXR0b247Ci0JCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3Nsb3Q7Ci0JCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBzbG90Vmlld2VyOwotCi0JLy8gc2xvdHMgY29udGVudCBwcm92aWRlcgotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc2xvdENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oKTsKLQkJCWxpc3QuYWRkQWxsKHdvcmtQcm9kdWN0LmdldEZ1bGZpbGxzKCkpOwotCQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgc2xvdExhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBjb250ZW50RWxlbWVudDsKLQkJcHVycG9zZU9uID0gdHJ1ZTsKLQkJZXh0ZXJuYWxJZE9uID0gdHJ1ZTsKLQkJaWYgKCEoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBPdXRjb21lKSkgewotCQkJbm90YXRpb25TZWN0aW9uT24gPSB0cnVlOwotCQl9Ci0JCXRhaWxvcmluZ1NlY3Rpb25PbiA9IHRydWU7Ci0JCWljb25TZWN0aW9uT24gPSB0cnVlOwotCQlzbG90U2VjdGlvbk9uID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbkNvbnRlbnQoKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uQ29udGVudCgpOwotCi0JCWN0cmxfc2xvdF9idXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0RGVzY3JpcHRpb25QYWdlX3Nsb3RfdGV4dCwKLQkJCQlTV1QuQ0hFQ0spOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQljdHJsX3Nsb3RfYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpIHsKLQkJc3VwZXIuY3JlYXRlTm90YXRpb25TZWN0aW9uQ29udGVudCgpOwotCi0JCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQljdHJsX2JyaWVmX291dGxpbmUgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24odG9vbGtpdCwKLQkJCQkJbm90YXRpb25Db21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9PVVRMSU5FX1RFWFQsIDQwLAotCQkJCQk0MDAsIE5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQkJY3RybF9yZXByZXNlbnRhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LlJFUFJFU0VOVEFUSU9OX1RFWFQsIDQwLAotCQkJCQk0MDAsIE5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQkJY3RybF9ub3RhdGlvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0Lk5PVEFUSU9OX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQl9IGVsc2UgaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWN0cmxfZXh0ZXJuYWxfZGVzYyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCQlub3RhdGlvbkNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlUZXh0LkVYVEVSTkFMX0RFU0NSSVBUSU9OX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2UgPSBjcmVhdGVSaWNoVGV4dEVkaXRXaXRoTGlua0ZvclNlY3Rpb24oCi0JCQkJCXRvb2xraXQsIG5vdGF0aW9uQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuUEFDS0FHSU5HX0dVSURBTkNFX1RFWFQsIDQwLCA0MDAsCi0JCQkJCU5PVEFUSU9OX1NFQ1RJT05fSUQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjY3JlYXRlVGFpbG9yaW5nU2VjdGlvbkNvbnRlbnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhaWxvcmluZ1NlY3Rpb25Db250ZW50KCkgewotCQlzdXBlci5jcmVhdGVUYWlsb3JpbmdTZWN0aW9uQ29udGVudCgpOwotCQljdHJsX2ltcGFjdCA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCXRhaWxvcmluZ0NvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LklNUEFDVF9PRl9OT1RfSEFWSU5HX1RFWFQsCi0JCQkJNDAsIDQwMCwgVEFJTE9SSU5HX1NFQ1RJT05fSUQpOwotCQljdHJsX3JlYXNvbiA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbih0b29sa2l0LAotCQkJCXRhaWxvcmluZ0NvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuUkVBU09OX0ZPUl9OT1RfTkVFRElOR19URVhULCA0MCwgNDAwLAotCQkJCVRBSUxPUklOR19TRUNUSU9OX0lEKTsKLQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucyA9IGNyZWF0ZVJpY2hUZXh0RWRpdFdpdGhMaW5rRm9yU2VjdGlvbigKLQkJCQkJdG9vbGtpdCwgdGFpbG9yaW5nQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSVRleHQuUkVQUkVTRU5UQVRJT05fT1BUSU9OU19URVhULCA0MCwgNDAwLAotCQkJCQlOT1RBVElPTl9TRUNUSU9OX0lEKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUVkaXRvckNvbnRlbnQoRm9ybVRvb2xraXQgdG9vbGtpdCkgewotCQlzdXBlci5jcmVhdGVFZGl0b3JDb250ZW50KHRvb2xraXQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBzbG90IHNlY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNsb3RTZWN0aW9uKEZvcm1Ub29sa2l0IHRvb2xraXQpIHsKLQotCQlzbG90U2VjdGlvbiA9IGNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuU0xPVF9TRUNUSU9OX05BTUUsIHRoaXMuc2xvdFNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCXNsb3RDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2xvdFNlY3Rpb24pOwotCQlzbG90Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzbG90Q29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCg1LCBmYWxzZSkpOwotCQljcmVhdGVTbG90U2VjdGlvbkNvbnRlbnQoKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3Ioc2xvdENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNsb3RTZWN0aW9uQ29udGVudCgpIHsKLQkJY3JlYXRlTGFiZWwodG9vbGtpdCwgc2xvdENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zbG90c0xhYmVsX3RleHQsIDIpOwotCQljdHJsX3Nsb3QgPSBjcmVhdGVUYWJsZSh0b29sa2l0LCBzbG90Q29tcG9zaXRlLCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5SRUFEX09OTFksIEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkJFR0lOTklORywKLQkJCQk1LCAzMDAsIDEsIDIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDMwOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJY3RybF9zbG90LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJc2xvdFZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3Nsb3QpOwotCQlzbG90Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihzbG90Q29udGVudFByb3ZpZGVyKTsKLQkJc2xvdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHNsb3RMYWJlbFByb3ZpZGVyKTsKLQkJc2xvdFZpZXdlci5zZXRJbnB1dChtZXRob2RFbGVtZW50KTsKLQotCQlDb21wb3NpdGUgYnV0dG9uUGFuZSA9IGNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzbG90Q29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5ELCAxLCAxLCAxKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpOwotCQkJYnV0dG9uUGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCi0JCWFkZFNsb3RCdXR0b24gPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihidXR0b25QYW5lLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5BRERfQlVUVE9OX1RFWFQsIFNXVC5TSU1QTEUpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEud2lkdGhIaW50ID0gQlVUVE9OX1dJRFRIOwotCQkJYWRkU2xvdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQkKLQkJcmVtb3ZlU2xvdEJ1dHRvbiA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKGJ1dHRvblBhbmUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFTU9WRV9CVVRUT05fVEVYVCwgU1dULlNJTVBMRSk7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBCVVRUT05fV0lEVEg7Ci0JCQlyZW1vdmVTbG90QnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXJlbW92ZVNsb3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWZpbmFsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJLmdldEFjdGlvbk1hbmFnZXIoKTsKLQotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyBhZGQgYWxsIHNsb3QgcmVsYXRlZCBsaXN0ZW5lcnMKLQkJCi0JCWlmIChzbG90U2VjdGlvbk9uKSB7Ci0JCQlhZGRTbG90TGlzdGVuZXJzKCk7Ci0JCX0KLQkJCi0JCQotCQlpZiAocHVycG9zZU9uKSB7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJY3RybF9wdXJwb3NlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJY3RybF9wdXJwb3NlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQljdHJsX3B1cnBvc2UuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX3B1cnBvc2U7Ci0JCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFB1cnBvc2UoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLAotCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJaWYgKGV4dGVybmFsSWRPbikgewotCQkJY3RybF9leHRlcm5hbF9pZC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9leHRlcm5hbF9pZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldEV4dGVybmFsSWQoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY3RybF9leHRlcm5hbF9pZCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGN0cmxfZXh0ZXJuYWxfaWQuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlpZiAodGFpbG9yaW5nU2VjdGlvbk9uKSB7Ci0JCQljdHJsX2ltcGFjdC5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX2ltcGFjdC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSk7Ci0JCQljdHJsX2ltcGFjdC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9pbXBhY3QuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX2ltcGFjdDsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQljdHJsX3JlYXNvbi5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSk7Ci0JCQljdHJsX3JlYXNvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJY3RybF9yZWFzb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJOiBjdHJsX3JlYXNvbjsKLQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQkJY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQljb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSwKLQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQlpZiAoc3VjY2VzcyAmJiBpc1ZlcnNpb25TZWN0aW9uT24oKSkgewotCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCi0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucwotCQkJCQkJLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbl9vcHRpb25zLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJbmV3IExpc3RlbmVyKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJCQk6IGN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9uczsKLQkJCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJCQkJCQkuZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkJCS5tdXN0UmVzdG9yZVZhbHVlKGNvbnRyb2wsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQkJCQl1cGRhdGVDaGFuZ2VEYXRlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUuc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9icmllZl9vdXRsaW5lLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkpOwotCQkJCWN0cmxfYnJpZWZfb3V0bGluZS5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfYnJpZWZfb3V0bGluZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfYnJpZWZfb3V0bGluZTsKLQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRCcmllZk91dGxpbmUoKTsKLQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCS5nZXRUZXh0KCkgOiBjdHJsX2JyaWVmX291dGxpbmUuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLAotCQkJCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9yZXByZXNlbnRhdGlvbi5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSk7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbi5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfcmVwcmVzZW50YXRpb24uYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBkZXNjRXhwYW5kRmxhZyA/IGN0cmxfZXhwYW5kZWQKLQkJCQkJCQkJOiBjdHJsX3JlcHJlc2VudGF0aW9uOwotCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldFJlcHJlc2VudGF0aW9uKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQkuZ2V0VGV4dCgpIDogY3RybF9yZXByZXNlbnRhdGlvbi5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdWNjZXNzID0gYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfbm90YXRpb24uc2V0TW9kYWxPYmplY3QoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfbm90YXRpb24uc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpKTsKLQkJCQljdHJsX25vdGF0aW9uLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJY3RybF9ub3RhdGlvbi5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfbm90YXRpb247Ci0JCQkJCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24pIHdvcmtQcm9kdWN0Ci0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0Tm90YXRpb24oKTsKLQkJCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJCQkubXVzdFJlc3RvcmVWYWx1ZShjb250cm9sLCBvbGRDb250ZW50KSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBuZXdDb250ZW50ID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCS5nZXRUZXh0KCkgOiBjdHJsX25vdGF0aW9uLmdldFRleHQoKTsKLQkJCQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsIGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCQkJaWYgKHN1Y2Nlc3MgJiYgaXNWZXJzaW9uU2VjdGlvbk9uKCkpIHsKLQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50RWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQljdHJsX2V4dGVybmFsX2Rlc2Muc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCkpOwotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGRlc2NFeHBhbmRGbGFnID8gY3RybF9leHBhbmRlZAotCQkJCQkJCQk6IGN0cmxfZXh0ZXJuYWxfZGVzYzsKLQkJCQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkKLQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJCWNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwKLQkJCQkJCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNoYW5nZURhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlLnNldE1vZGFsT2JqZWN0KGNvbnRlbnRFbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlCi0JCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkpOwotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlCi0JCQkJCQkuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQljdHJsX3BhY2thZ2luZ19ndWlkYW5jZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCW5ldyBMaXN0ZW5lcigpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJCQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZGVzY0V4cGFuZEZsYWcgPyBjdHJsX2V4cGFuZGVkCi0JCQkJCQkJCQkJOiBjdHJsX3BhY2thZ2luZ19ndWlkYW5jZTsKLQkJCQkJCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgb2xkQ29udGVudCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB3b3JrUHJvZHVjdAotCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSkKLQkJCQkJCQkJCQkuZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQkJCQkJCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpCi0JCQkJCQkJCQkJLm11c3RSZXN0b3JlVmFsdWUoY29udHJvbCwgb2xkQ29udGVudCkpIHsKLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfQotCQkJCQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJCQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQkJCQljb250ZW50RWxlbWVudAotCQkJCQkJCQkJCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCQkJCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJCQkJCWlmIChzdWNjZXNzICYmIGlzVmVyc2lvblNlY3Rpb25PbigpKSB7Ci0JCQkJCQkJCQkJdXBkYXRlQ2hhbmdlRGF0ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogU2xvdCBMaXN0ZW5lcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU2xvdExpc3RlbmVycygpCXsKLQkJLy8gd29yayBwcm9kdWN0IHNsb3QgY2hlY2sgYnV0dG9uCi0JCWN0cmxfc2xvdF9idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQm9vbGVhbiBpc1Nsb3QgPSBuZXcgQm9vbGVhbihjdHJsX3Nsb3RfYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQlpZiAoaXNTbG90LmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCS8vIGlmIHRoaXMgYmVjb21pbmcgYSBzbG90IGl0c2VsZgotCQkJCQlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsRmlsbHMgPSB3b3JrUHJvZHVjdAotCQkJCQkJCS5nZXRGdWxmaWxscygpOwotCQkJCQlpZiAoZnVsRmlsbHMgIT0gbnVsbCAmJiBmdWxGaWxscy5zaXplKCkgIT0gMCkgewotCQkJCQkJYm9vbGVhbiB2YWwgPSBBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zbG90Q29uZmlybURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy53cEZ1bEZpbGxzQ29uZmlybURpYWxvZ19tZXNzYWdlKTsKLQkJCQkJCWlmICghdmFsKSB7Ci0JCQkJCQkJY3RybF9zbG90X2J1dHRvbi5zZXRTZWxlY3Rpb24od29ya1Byb2R1Y3QKLQkJCQkJCQkJCS5nZXRJc0Fic3RyYWN0KCkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJd29ya1Byb2R1Y3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwKLQkJCQkJCQkJCWZ1bEZpbGxzLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewkJCQkJCi0JCQkJCUxpc3QgZnVsRmlsbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZ1bEZpbGxzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRGdWxsRmlsbHMod29ya1Byb2R1Y3QpKTsKLQkJCQkJaWYgKGZ1bEZpbGxzICE9IG51bGwgJiYgZnVsRmlsbHMuc2l6ZSgpICE9IDApIHsKLQkJCQkJCWJvb2xlYW4gdmFsID0gQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2xvdENvbmZpcm1EaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMud3BTbG90RnVsRmlsbHNDb25maXJtRGlhbG9nX21lc3NhZ2UpOwotCQkJCQkJaWYgKCF2YWwpIHsKLQkJCQkJCQljdHJsX3Nsb3RfYnV0dG9uLnNldFNlbGVjdGlvbih3b3JrUHJvZHVjdAotCQkJCQkJCQkJLmdldElzQWJzdHJhY3QoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBmdWxGaWxscy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCQkJCXdwLAotCQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLAotCQkJCQkJCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCi0JCQkJfQotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIG1ldGhvZEVsZW1lbnQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGFzc2lmaWVyX0lzQWJzdHJhY3QoKSwgaXNTbG90LAotCQkJCQkJLTEpOwotCQkJCQotCQkJCWlmIChpc1Nsb3QpIHsJCQotCQkJCQlhZGRTbG90QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkU2xvdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJYWRkU2xvdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBXb3JrUHJvZHVjdEZpbHRlcigpIHsKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG9iaiArICIgIiArICgoV29ya1Byb2R1Y3QpIG9iaikuZ2V0SXNBYnN0cmFjdCgpKTsKLQkJCQkJCQlyZXR1cm4gKChXb3JrUHJvZHVjdCkgb2JqKS5nZXRJc0Fic3RyYWN0KCkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBhbHJlYWR5RXhpc3RpbmcgPSBuZXcgQXJyYXlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oKTsKLQkJCQlhbHJlYWR5RXhpc3RpbmcuYWRkQWxsKHdvcmtQcm9kdWN0LmdldEZ1bGZpbGxzKCkpOwotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBtZXRob2RFbGVtZW50LAotCQkJCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUywgYWxyZWFkeUV4aXN0aW5nKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUoZmFsc2UpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMpOwotCQkJCWZkLm9wZW4oKTsKLQkJCQkKLQkJCQlpZiAoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpLnNpemUoKSA+IDApIHsKLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oCi0JCQkJCQkJSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCksIGZkCi0JCQkJCQkJCQkuZ2V0U2VsZWN0ZWRJdGVtcygpLCAtMSk7Ci0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJLy8gcmVmcmVzaCBzbG90IHZpZXdlcgotCQkJCQlzbG90Vmlld2VyLnJlZnJlc2goKTsJCi0JCQkJfQkJCi0JCQl9Ci0JCX0pOwotCQkKLQkJcmVtb3ZlU2xvdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2xvdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwKLQkJCQkJCQlzZWxlY3Rpb24udG9MaXN0KCksIC0xKTsKLQkJCQkJCi0JCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJLy8gcmVmcmVzaCBzbG90IHZpZXdlcgotCQkJCQlzbG90Vmlld2VyLnJlZnJlc2goKTsKLQkJCQkJcmVtb3ZlU2xvdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9CQotCQl9KTsKLQkJCi0JCXNsb3RWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2xvdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiAhVG5nVXRpbC5pc0xvY2tlZCh3b3JrUHJvZHVjdCkpIHsKLQkJCQkJcmVtb3ZlU2xvdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNyZWZyZXNoKGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXN1cGVyLnJlZnJlc2goZWRpdGFibGUpOwotCQkKLQkJaWYgKHNsb3RTZWN0aW9uT24pICB7Ci0JCQljdHJsX3Nsb3RfYnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCi0JCQlCb29sZWFuIGlzQWJzdHJhY3QgPSB3b3JrUHJvZHVjdC5nZXRJc0Fic3RyYWN0KCk7Ci0JCQlpZiAoaXNBYnN0cmFjdCAhPSBudWxsICYmIGVkaXRhYmxlKSB7Ci0JCQkJaWYgKGlzQWJzdHJhY3QuYm9vbGVhblZhbHVlKCkpICB7Ci0JCQkJCWFkZFNsb3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWRkU2xvdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCQlhZGRTbG90QnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCi0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNsb3RWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCQlyZW1vdmVTbG90QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlbW92ZVNsb3RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICh0YWlsb3JpbmdTZWN0aW9uT24pIHsKLQkJCWN0cmxfaW1wYWN0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWN0cmxfcmVhc29uLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KQotCQkJCWN0cmxfcmVwcmVzZW50YXRpb25fb3B0aW9ucy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKG5vdGF0aW9uU2VjdGlvbk9uKSB7Ci0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCWN0cmxfYnJpZWZfb3V0bGluZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQkJY3RybF9yZXByZXNlbnRhdGlvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQkJY3RybF9ub3RhdGlvbi5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQl9Ci0JCQlpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCQkJY3RybF9wYWNrYWdpbmdfZ3VpZGFuY2Uuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZERhdGEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWREYXRhKCkgewotCQlzdXBlci5sb2FkRGF0YSgpOwotCi0JCS8vIElzQWJzdHJhY3QgYXR0cmlidXRlCi0JCWlmIChzbG90U2VjdGlvbk9uKSB7Ci0JCQlCb29sZWFuIGlzQWJzdHJhY3QgPSB3b3JrUHJvZHVjdC5nZXRJc0Fic3RyYWN0KCk7Ci0JCQlpZiAoaXNBYnN0cmFjdCAhPSBudWxsKSB7Ci0JCQkJY3RybF9zbG90X2J1dHRvbi5zZXRTZWxlY3Rpb24oaXNBYnN0cmFjdC5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9IGVsc2UKLQkJCQljdHJsX3Nsb3RfYnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbikgd29ya1Byb2R1Y3QKLQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCi0JCWlmIChwdXJwb3NlT24pIHsKLQkJCVN0cmluZyBwdXJwb3NlID0gY29udGVudC5nZXRQdXJwb3NlKCk7Ci0JCQljdHJsX3B1cnBvc2Uuc2V0VGV4dChwdXJwb3NlID09IG51bGwgPyAiIiA6IHB1cnBvc2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHRhaWxvcmluZ1NlY3Rpb25PbikgewotCQkJU3RyaW5nIGltcGFjdCA9IGNvbnRlbnQuZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJCVN0cmluZyByZWFzb24gPSBjb250ZW50LmdldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0JCQljdHJsX2ltcGFjdC5zZXRUZXh0KGltcGFjdCA9PSBudWxsID8gIiIgOiBpbXBhY3QpOyAvLyROT04tTkxTLTEkCQotCQkJY3RybF9yZWFzb24uc2V0VGV4dChyZWFzb24gPT0gbnVsbCA/ICIiIDogcmVhc29uKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX3JlcHJlc2VudGF0aW9uX29wdGlvbnMKLQkJCQkJCS5zZXRUZXh0KCgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJCQkJLmdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoZXh0ZXJuYWxJZE9uKSB7Ci0JCQlTdHJpbmcgZXh0ZXJuYWxfaWQgPSBjb250ZW50LmdldEV4dGVybmFsSWQoKTsKLQkJCWN0cmxfZXh0ZXJuYWxfaWQuc2V0VGV4dChleHRlcm5hbF9pZCA9PSBudWxsID8gIiIgOiBleHRlcm5hbF9pZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChub3RhdGlvblNlY3Rpb25PbikgewotCQkJaWYgKHdvcmtQcm9kdWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQljdHJsX2JyaWVmX291dGxpbmUKLQkJCQkJCS5zZXRUZXh0KCgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkKLQkJCQkJCQkJLmdldEJyaWVmT3V0bGluZSgpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0QnJpZWZPdXRsaW5lKCkpOyAvLyROT04tTkxTLTEkCQkJCi0JCQkJY3RybF9yZXByZXNlbnRhdGlvbgotCQkJCQkJLnNldFRleHQoKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCQkuZ2V0UmVwcmVzZW50YXRpb24oKSA9PSBudWxsID8gIiIgOiAoKEFydGlmYWN0RGVzY3JpcHRpb24pIGNvbnRlbnQpLmdldFJlcHJlc2VudGF0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJY3RybF9ub3RhdGlvbgotCQkJCQkJLnNldFRleHQoKChBcnRpZmFjdERlc2NyaXB0aW9uKSBjb250ZW50KS5nZXROb3RhdGlvbigpID09IG51bGwgPyAiIiA6ICgoQXJ0aWZhY3REZXNjcmlwdGlvbikgY29udGVudCkuZ2V0Tm90YXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAod29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCWN0cmxfZXh0ZXJuYWxfZGVzYwotCQkJCQkJLnNldFRleHQoKChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSBjb250ZW50KQotCQkJCQkJCQkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWN0cmxfcGFja2FnaW5nX2d1aWRhbmNlCi0JCQkJCQkuc2V0VGV4dCgoKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIGNvbnRlbnQpCi0JCQkJCQkJCS5nZXRQYWNrYWdpbmdHdWlkYW5jZSgpID09IG51bGwgPyAiIiA6ICgoRGVsaXZlcmFibGVEZXNjcmlwdGlvbikgY29udGVudCkuZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRGaWx0ZXIoKQotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCkgewotCQkJTGlzdCBiYWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QKLQkJCQkJCQkJJiYgKChDb250ZW50RWxlbWVudCkgZ2V0SGVscGVyKCkKLQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnQoKSkuZ2V0VHlwZSgpLmVxdWFscygKLQkJCQkJCQkJCQkoKENvbnRlbnRFbGVtZW50KSBvYmopLmdldFR5cGUoKSkpIHsKLQkJCQkJCQkvLyBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY3kgZnJvbSBkZWxpdmVyYWJsZQotCQkJCQkJCS8vIHBhcnRzIGFuZCB2YXJpYWJpbGl0eQotCQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZQotCQkJCQkJCQkJJiYgd29ya1Byb2R1Y3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJCQlpZiAoIVVJSGVscGVyLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoCi0JCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSBvYmosCi0JCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSB3b3JrUHJvZHVjdCkpIHsKLQkJCQkJCQkJCWJhZGxpc3QuYWRkKG9iaik7Ci0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCgoRGVsaXZlcmFibGUpIG9iaikKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICghVUlIZWxwZXIKLQkJCQkJCQkJCQkJLmNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoCi0JCQkJCQkJCQkJCQkJKERlbGl2ZXJhYmxlKSAoKERlbGl2ZXJhYmxlKSBvYmopCi0JCQkJCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCQkJCQkJCShEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QpKSB7Ci0JCQkJCQkJCQkJYmFkbGlzdC5hZGQob2JqKTsKLQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJSXRlcmF0b3IgaXQxID0gVG5nVXRpbAotCQkJCQkJCQkJCS5nZXRHZW5lcmFsaXplcnMoKERlbGl2ZXJhYmxlKSBvYmopOwotCQkJCQkJCQl3aGlsZSAoaXQxLmhhc05leHQoKSkgewotCQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQxCi0JCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCQkJCQkJCWlmICh2ZS5lcXVhbHMob2JqKSkKLQkJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQkJCWlmICghVUlIZWxwZXIKLQkJCQkJCQkJCQkJCS5jaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKAotCQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHZlLAotCQkJCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdvcmtQcm9kdWN0KSkgewotCQkJCQkJCQkJCQliYWRsaXN0LmFkZChvYmopOwotCQkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0KLQkJCQkJCQkJLy8gYnJvd3NlIHRocm91Z2ggYmFkbGlzdCBhbmQgaXRzIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIHBhcnRzLgotCQkJCQkJCQlMaXN0IHRlbXBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmFkbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlPYmplY3QgYmFkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJVUlIZWxwZXIuZGVsaXZlcmFibGVQYXJ0c0NoYWluKAotCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIGJhZCwgdGVtcGxpc3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICh0ZW1wbGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCX0KLQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQotCQkvLyBzZXQgYWRkaXRpb25hbCBmaWx0ZXIgZm9yIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCBjaGVja2luZwotCQkoKENvbnRlbnRGaWx0ZXIpIGZpbHRlcikKLQkJCQkuc2V0QWRkaXRpb25hbEZpbHRlcnMobmV3IElGaWx0ZXJbXSB7IG5ldyBWYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyKAotCQkJCQkJd29ya1Byb2R1Y3QpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2xvYWRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3RfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYXJ0aWZhY3Rfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFydGlmYWN0X2ljb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnNsb3RTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5hcnRpZmFjdF9zbG90U2VjdGlvbl9kZXNjOwotCQl9Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXRoaXMuZ2VuZXJhbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZ2VuZXJhbEluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnZlcnNpb25TZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5vdXRjb21lX3ZlcnNpb25JbmZvU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5ub3RhdGlvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm91dGNvbWVfdGFpbG9yaW5nU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5pY29uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9pY29uU2VjdGlvbl9kZXNjOwotCQkJdGhpcy5zbG90U2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMub3V0Y29tZV9zbG90U2VjdGlvbl9kZXNjOwotCQl9Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQl0aGlzLmdlbmVyYWxTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9nZW5lcmFsSW5mb1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuZGV0YWlsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfZGV0YWlsU2VjdGlvbl9kZXNjOwotCQkJdGhpcy52YXJpYWJpbGl0eVNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3ZhcmlhYmlsaXR5U2VjdGlvbl9kZXNjOwotCQkJdGhpcy52ZXJzaW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdmVyc2lvbkluZm9TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLm5vdGF0aW9uU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfbm90YXRpb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnRhaWxvcmluZ1NlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX3RhaWxvcmluZ1NlY3Rpb25fZGVzYzsKLQkJCXRoaXMuaWNvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGl2ZXJhYmxlX2ljb25TZWN0aW9uX2Rlc2M7Ci0JCQl0aGlzLnNsb3RTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWxpdmVyYWJsZV9zbG90U2VjdGlvbl9kZXNjOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0R3VpZGFuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0R3VpZGFuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGUzOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdEd1aWRhbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkd1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5VSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuRm9ybUVkaXRvcjsKLQotCi0vKioKLSAqIFRoZSBHdWlkYW5jZSBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RHdWlkYW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdEd1aWRhbmNlUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkdVSURBTkNFX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldFVzZUNhdGVnb3J5MihmYWxzZSk7Ci0JCXNldFVzZUNhdGVnb3J5MyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIFVJSGVscGVyLmdldFNlbGVjdGVkR3VpZGFuY2VzKHdvcmtQcm9kdWN0KTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBhZGRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gVGhlIGd1aWRhbmNlIGZvciB0aGUgY29udGVudCBlbGVtZW50LgotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQkJCQkJCShDaGVja2xpc3QpIGl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIChQcmFjdGljZSkgaXRlbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2VzKCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXBvcnQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmFibGUgdG8gYWRkIGd1aWRhbmNlICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQkidG8gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgd29ya1Byb2R1Y3QuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHdvcmtQcm9kdWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIGl0Lm5leHQoKTsKLQotCQkJCS8vIFRoZSBndWlkYW5jZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudC4KLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQlhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgd29ya1Byb2R1Y3QsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgR3VpZGVsaW5lKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCAoUHJhY3RpY2UpIGl0ZW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLAotCQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHdvcmtQcm9kdWN0LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBUZW1wbGF0ZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQkJCQlpdGVtLCAtMSk7Ci0JCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB3b3JrUHJvZHVjdCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkiVW5hYmxlIHRvIHJlbW92ZSBndWlkYW5jZSAiICsgaXRlbS5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsgaXRlbS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJImZyb20gIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgd29ya1Byb2R1Y3QuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJCQkJCQkrICI6IiArIHdvcmtQcm9kdWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGVzY3JpcHRpb25Gb3JtUGFnZSNnZXRUYWJTdHJpbmcoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IEd1aWRhbmNlRmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXBvcnQpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFJvbGVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE5NTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RSb2xlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi0KLS8qKgotICogVGhlIFJvbGVzIHBhZ2UgaW4gdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogVE9ETzogUmVuYW1lIHRoaXMgY2xhc3MgdG8gV29ya1Byb2R1Y3RSb2xlc0Zvcm1QYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFJvbGVzUGFnZSBleHRlbmRzIEFzc29jaWF0aW9uRm9ybVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1fUEFHRV9JRCA9ICJ3b3JrUHJvZHVjdFJvbGVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Um9sZXNQYWdlKEZvcm1FZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGVkaXRvciwgRk9STV9QQUdFX0lELCBBdXRob3JpbmdVSVRleHQuUk9MRVNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgY29udGVudEVsZW1lbnQ7Ci0JCWFjdGlvbk1nciA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJc2V0VXNlQ2F0ZWdvcnkzKGZhbHNlKTsKLQkJc2V0Q2F0ZWdvcnlJc1NpbmdsZVNlbGVjdGlvbjEodHJ1ZSk7Ci0JCXNldEFsbG93Q2hhbmdlMShmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMihmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZXMoKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXNUb01vZGVsMShBcnJheUxpc3QgYWRkSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFhZGRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSBhZGRJdGVtcy5nZXQoMCk7Ci0JCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUocm9sZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB3b3JrUHJvZHVjdCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCByb2xlLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLAotCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLS8vCQkJTGlicmFyeU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zZXRSZXNwb25zaWJsZVJvbGUoZ2V0QWN0aW9uTWFuYWdlcigpLAotLy8JCQkJCXdvcmtQcm9kdWN0LCBudWxsKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRlci5uZXh0KCk7Ci0JCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgcm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkMigpIHsKLQkJY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1vZGlmaWVkQnkoKFdvcmtQcm9kdWN0KSBvYmplY3QpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl2aWV3ZXJfc2VsZWN0ZWQyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXJTZWxlY3RlZDIpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFJvbGVzUGFnZV9tdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uTmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0ZWRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtQcm9kdWN0Um9sZXNQYWdlX3NlbGVjdGVkTGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlbGVjdGVkTGFiZWwyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwyKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RSb2xlc1BhZ2Vfc2VsZWN0ZWRMYWJlbDI7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9mb3Jtcy9Xb3JrUHJvZHVjdFRhc2tzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTY1OTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUYXNrc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgVGFza3MgcGFnZSBpbiB0aGUgV29yayBQcm9kdWN0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUYXNrc1BhZ2UgZXh0ZW5kcyBBc3NvY2lhdGlvbkZvcm1QYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1BBR0VfSUQgPSAid29ya1Byb2R1Y3RUYXNrc1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFRhc2tzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LlRBU0tTX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGNvbnRlbnRFbGVtZW50OwotCQlhY3Rpb25NZ3IgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCXNldEFsbG93Q2hhbmdlMShmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMihmYWxzZSk7Ci0JCXNldEFsbG93Q2hhbmdlMyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG9UYXNrcygKLQkJCQkJCShXb3JrUHJvZHVjdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gcmV0cmlldmVUYWJsZVZpZXdlckNvbnRlbnRzKHZpZXdlcl9zZWxlY3RlZDIpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNyZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zRnJvbU1vZGVsMShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCB0YXNrLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQkJd29ya1Byb2R1Y3QsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2luaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXJTZWxlY3RlZDIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkMiA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGF2YWlsYWJsZVRhc2tzTGlzdCA9IExpYnJhcnlNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRBdmFpbGFibGVUYXNrcyh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKGF2YWlsYWJsZVRhc2tzTGlzdCAhPSBudWxsICYmIGF2YWlsYWJsZVRhc2tzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGl0ID0gYXZhaWxhYmxlVGFza3NMaXN0Lml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAodGFzay5nZXRPcHRpb25hbElucHV0KCkuY29udGFpbnMod29ya1Byb2R1Y3QpKQotCQkJCQkJCXNlbGVjdGVkVGFza3MuYWRkKHRhc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBzZWxlY3RlZFRhc2tzLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwyKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IHJldHJpZXZlVGFibGVWaWV3ZXJDb250ZW50cyh2aWV3ZXJfc2VsZWN0ZWQpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWlmICghZWxlbWVudExpc3QuY29udGFpbnModGFzaykpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGFzaywKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJCQl3b3JrUHJvZHVjdCwgLTEpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI3JlbW92ZUl0ZW1zRnJvbU1vZGVsMihBcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXNGcm9tTW9kZWwyKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIFVwZGF0ZSB0aGUgbW9kZWwuCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBybUl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJCXdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKCkgewotCQljb250ZW50UHJvdmlkZXJTZWxlY3RlZDMgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0dGluZ1Rhc2tzKAotCQkJCQkJKFdvcmtQcm9kdWN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyX3NlbGVjdGVkMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtc1RvTW9kZWwzKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyBVcGRhdGUgdGhlIG1vZGVsLgotCQlpZiAoIWFkZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGFkZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXQubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIHRhc2ssCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB3b3JrUHJvZHVjdCwgLTEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwzKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdC5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFzaywKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCksIHdvcmtQcm9kdWN0LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCBjb3VudCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbihjb3VudCwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuV29ya1Byb2R1Y3RfVGFza3NfTXVsdGlwbGVTZWxlY3REZXNjcmlwdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjZ2V0U2VjdGlvbk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlbGVjdGVkTGFiZWwoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5Xb3JrUHJvZHVjdF9UYXNrc19TZWxlY3RlZExhYmVsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMigpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwyOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWxlY3RlZExhYmVsMygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3RlZExhYmVsMygpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLldvcmtQcm9kdWN0X1Rhc2tzX1NlbGVjdGVkTGFiZWwzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTI5ZjA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuQ2F0ZWdvcnlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgRGVzY3JpcHRpb24gcGFnZSBmb3IgdGhlIFdvcmsgcHJvZHVjdCBUeXBlIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlIGV4dGVuZHMgRGVzY3JpcHRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgV29ya1Byb2R1Y3RUeXBlIHdvcmtQcm9kdWN0VHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZURlc2NyaXB0aW9uUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1BBR0VfVElUTEUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzdXBlci5pbml0KHNpdGUsIGlucHV0KTsKLQkJd29ya1Byb2R1Y3RUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgY29udGVudEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjZ2V0RmlsdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWZpbHRlciA9IG5ldyBDYXRlZ29yeUZpbHRlcigpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gc2V0IGFkZGl0aW9uYWwgZmlsdGVyIGZvciB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQgY2hlY2tpbmcKLQkJKChDYXRlZ29yeUZpbHRlcikgZmlsdGVyKQotCQkJCS5zZXRBZGRpdGlvbmFsRmlsdGVycyhuZXcgSUZpbHRlcltdIHsgbmV3IFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoCi0JCQkJCQl3b3JrUHJvZHVjdFR5cGUpIH0pOwotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFiU3RyaW5nKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRlc2NyaXB0aW9uRm9ybVBhZ2UjbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFNlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJdGhpcy5nZW5lcmFsU2VjdGlvbkRlc2NyaXB0aW9uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya3Byb2R1Y3R0eXBlX2dlbmVyYWxJbmZvU2VjdGlvbl9kZXNjOwotCQl0aGlzLmRldGFpbFNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZV9kZXRhaWxTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmFyaWFiaWxpdHlTZWN0aW9uRGVzY3JpcHRpb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrcHJvZHVjdHR5cGVfdmFyaWFiaWxpdHlTZWN0aW9uX2Rlc2M7Ci0JCXRoaXMudmVyc2lvblNlY3Rpb25EZXNjcmlwdGlvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLndvcmtwcm9kdWN0dHlwZV92ZXJzaW9uSW5mb1NlY3Rpb25fZGVzYzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL1dvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzI4ZGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Xb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1vdmVJbkNhdGVnb3J5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLQotLyoqCi0gKiBUaGUgV29yayBQcm9kdWN0cyBwYWdlIGluIHRoZSBXb3JrIFByb2R1Y3QgVHlwZSBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlIGV4dGVuZHMgQXNzb2NpYXRpb25Gb3JtUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QQUdFX0lEID0gIndvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGU7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQkKLQlwcml2YXRlIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGFsbFN0ZXBzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZShGb3JtRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IsIEZPUk1fUEFHRV9JRCwgQXV0aG9yaW5nVUlUZXh0LldPUktfUFJPRFVDVFNfUEFHRV9USVRMRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCQl3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKSBjb250ZW50RWxlbWVudDsKLQkJYWN0aW9uTWdyID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQlzZXRVc2VDYXRlZ29yeTIoZmFsc2UpOwotCQlzZXRVc2VDYXRlZ29yeTMoZmFsc2UpOwotCQlzZXRJc1VwQW5kRG93bkJ1dHRvbnNSZXF1aXJlZDEodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjaW5pdENvbnRlbnRQcm92aWRlclNlbGVjdGVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyU2VsZWN0ZWQoKSB7Ci0JCWNvbnRlbnRQcm92aWRlclNlbGVjdGVkID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJLy9yZXR1cm4gKChXb3JrUHJvZHVjdFR5cGUpIG9iamVjdCkuZ2V0V29ya1Byb2R1Y3RzKCkudG9BcnJheSgpOwotCQkJCWlmIChhbGxTdGVwcyA9PSBudWxsKSB7Ci0JCQkJCWFsbFN0ZXBzID0gbmV3IENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KAotCQkJCQkJCWNvbnRlbnRFbGVtZW50LAotCQkJCQkJCUNvbnRlbnRFbGVtZW50T3JkZXJMaXN0LkNPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFksCi0JCQkJCQkJZ2V0Q29udGVudENhdGVnb3J5T3JkZXJGZWF0dXJlKCkpOwotCQkJCX0KLQkJCQlMaXN0IHJldHVybkxpc3QgPSBDYXRlZ29yeVNvcnRIZWxwZXIuc29ydENhdGVnb3J5RWxlbWVudHMoY29udGVudEVsZW1lbnQsIAotCQkJCQkJYWxsU3RlcHMudG9BcnJheSgpKTsKLQkJCQlyZXR1cm4gcmV0dXJuTGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlcl9zZWxlY3RlZC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyU2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2FkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zVG9Nb2RlbDEoQXJyYXlMaXN0IGFkZEl0ZW1zKSB7Ci0JCWlmICghYWRkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIHdvcmtQcm9kdWN0VHlwZSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLAotCQkJCQlhZGRJdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkFzc29jaWF0aW9uRm9ybVBhZ2UjcmVtb3ZlSXRlbXNGcm9tTW9kZWwxKEFycmF5TGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtc0Zyb21Nb2RlbDEoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gVXBkYXRlIHRoZSBtb2RlbC4KLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCB3b3JrUHJvZHVjdFR5cGUsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwKLQkJCQkJcm1JdGVtcywgLTEpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldFRhYlN0cmluZygpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJTdHJpbmcoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EZXNjcmlwdGlvbkZvcm1QYWdlI2dldEZpbHRlcigpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyID0gbmV3IFdvcmtQcm9kdWN0RmlsdGVyKCkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQlpZiAoZ2V0SGVscGVyKCkuaXNDb250cmlidXRvcigoQ29udGVudEVsZW1lbnQpIG9iaikpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCXJldHVybiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE11bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24oaW50IGNvdW50KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNdWx0aXBsZVNlbGVjdERlc2NyaXB0aW9uKGNvdW50LCBBdXRob3JpbmdVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlX211bHRpcGxlU2VsZWN0RGVzY3JpcHRpb24pOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQXNzb2NpYXRpb25Gb3JtUGFnZSNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uRGVzY3JpcHRpb247Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Bc3NvY2lhdGlvbkZvcm1QYWdlI2dldFNlY3Rpb25OYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlSZXNvdXJjZXMud29ya1Byb2R1Y3RUeXBlV29ya1Byb2R1Y3RzUGFnZV9zZWN0aW9uTmFtZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDb250ZW50Q2F0ZWdvcnlPcmRlckZlYXR1cmUoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldE1vZGVsU3RydWN0dXJlUGF0aCgpIHsKLQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0IGdldENvbnRlbnRFbGVtZW50T3JkZXJMaXN0KCkgewotCQlyZXR1cm4gYWxsU3RlcHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2Zvcm1zL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjczNzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvZm9ybXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZm9ybSBwYWdlcyBmb3IgdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBlZGl0b3JzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjOGU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0lQcm9ibGVtQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIAotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5JUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gcHJvYmxlbXMgY2hhbmdlZC4gVGhpcyBjYWxsIGlzIHBvc3RlZCBpbiBhbiBheW5jaCBleGVjLCB0aGVyZWZvcmUgcGFzc2VkCi0JICogcmVzb3VyY2VzIG11c3Qgbm90IGV4aXN0LgotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzICBBIHNldCB3aXRoIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+SVJlc291cmNlPC9jb2RlPiB0aGF0Ci0JICogZGVzY3JpYmUgdGhlIHJlc291cmNlcyB0aGF0IGhhZCBhbiBwcm9ibGVtIGNoYW5nZS4KLQkgKiBAcGFyYW0gaXNNYXJrZXJDaGFuZ2UgSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgY2hhbmdlIHdhcyBhIG1hcmtlciBjaGFuZ2UsIGlmCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgY2hhbmdlIGNhbWUgZnJvbSBhbiBhbm5vdGF0aW9uIG1vZGVsIG1vZGlmaWNhdGlvbi4KLQkgKi8KLQl2b2lkIHByb2JsZW1zQ2hhbmdlZChJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzLCBib29sZWFuIGlzTWFya2VyQ2hhbmdlKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYzODUyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBIYXNoTWFwPEltYWdlRGVzY3JpcHRvciwgSW1hZ2U+IGZSZWdpc3RyeT0gbmV3IEhhc2hNYXA8SW1hZ2VEZXNjcmlwdG9yLCBJbWFnZT4oMTApOwotCXByaXZhdGUgRGlzcGxheSBmRGlzcGxheTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoZSBjdXJyZW50IG9yIGRlZmF1bHQgZGlzcGxheSwKLQkgKiByZXNwZWN0aXZlbHkuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQl0aGlzKEF1dGhvcmluZ1VJUGx1Z2luLmdldFN0YW5kYXJkRGlzcGxheSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGUgZ2l2ZW4gZGlzcGxheS4gQWxsIGltYWdlcwotCSAqIG1hbmFnZWQgYnkgdGhpcyByZWdpc3RyeSB3aWxsIGJlIGRpc3Bvc2VkIHdoZW4gdGhlIGRpc3BsYXkgZ2V0cyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheSB0aGUgZGlzcGxheSB0aGUgaW1hZ2VzIG1hbmFnZWQgYnkgdGhpcyByZWdpc3RyeSBhcmUgYWxsb2NhdGVkIGZvciAKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoRGlzcGxheSBkaXNwbGF5KSB7Ci0JCWZEaXNwbGF5PSBkaXNwbGF5OwotCQlBc3NlcnQuaXNOb3ROdWxsKGZEaXNwbGF5KTsKLQkJaG9va0Rpc3BsYXkoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbWFnZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB3aGljaCB0aGUgcmVnaXN0cnkgbWFuYWdlcyBhbiBpbWFnZQotCSAqIEByZXR1cm4gdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICBpZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW4ndCBjcmVhdGUgdGhlIHJlcXVlc3RlZCBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0KEltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9yID09IG51bGwpCi0JCQlkZXNjcmlwdG9yPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJCi0JCUltYWdlIHJlc3VsdD0gKEltYWdlKWZSZWdpc3RyeS5nZXQoZGVzY3JpcHRvcik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCi0JCUFzc2VydC5pc1RydWUoZkRpc3BsYXkgPT0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0U3RhbmRhcmREaXNwbGF5KCksICJBbGxvY2F0aW5nIGltYWdlIGZvciB3cm9uZyBkaXNwbGF5LiIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdD0gZGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmUmVnaXN0cnkucHV0KGRlc2NyaXB0b3IsIHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIGltYWdlcyBtYW5hZ2VkIGJ5IHRoaXMgcmVnaXN0cnkuCi0JICovCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcj0gZlJlZ2lzdHJ5LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCUltYWdlIGltYWdlPSAoSW1hZ2UpaXRlci5uZXh0KCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJZlJlZ2lzdHJ5LmNsZWFyKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBob29rRGlzcGxheSgpIHsKLQkJZkRpc3BsYXkuZGlzcG9zZUV4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWRpc3Bvc2UoKTsKLQkJCX0JCi0JCX0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODY0ZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnZpZXdzdXBwb3J0LkltYWdlSW1hZ2VEZXNjcmlwdG9yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBJbWFnZURlc2NyaXB0b3IgewotCi0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSW1hZ0ltYWdlRGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2UgaW1hZ2UpIHsKLQkJc3VwZXIoKTsKLQkJZkltYWdlPSBpbWFnZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJbWFnZURlc2NyaXB0b3IjZ2V0SW1hZ2VEYXRhKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEYXRhIGdldEltYWdlRGF0YSgpIHsKLQkJcmV0dXJuIGZJbWFnZS5nZXRJbWFnZURhdGEoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gKG9iaiAhPSBudWxsKSAmJiBnZXRDbGFzcygpLmVxdWFscyhvYmouZ2V0Q2xhc3MoKSkgJiYgZkltYWdlLmVxdWFscygoKEltYWdlSW1hZ2VEZXNjcmlwdG9yKW9iaikuZkltYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBPYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmSW1hZ2UuaGFzaENvZGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlNzgxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRFZGl0b3JFcnJvclRpY2tVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlByb2JsZW1zTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBDb2RlIHRha2VuIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSmF2YUVkaXRvckVycm9yVGlja1VwZGF0ZXIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50RWRpdG9yRXJyb3JUaWNrVXBkYXRlciBpbXBsZW1lbnRzIElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudEVkaXRvciBmTWV0aG9kRWxlbWVudEVkaXRvcjsKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIgZkxhYmVsUHJvdmlkZXI7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEVkaXRvckVycm9yVGlja1VwZGF0ZXIoTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChlZGl0b3IpOwotCQlmTWV0aG9kRWxlbWVudEVkaXRvcj0gZWRpdG9yOwotCQlmTGFiZWxQcm92aWRlcj0gbmV3IE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIoKTsKLQkJZkxhYmVsUHJvdmlkZXIuYWRkTGFiZWxEZWNvcmF0b3IobmV3IFByb2JsZW1zTGFiZWxEZWNvcmF0b3IobnVsbCkpOwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5hZGRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciNwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgcHJvYmxlbXNDaGFuZ2VkKElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJaWYgKCFpc01hcmtlckNoYW5nZSkKLQkJCXJldHVybjsKLQotCQlJRWRpdG9ySW5wdXQgaW5wdXQ9IGZNZXRob2RFbGVtZW50RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgeyAvLyBtaWdodCBydW4gYXN5bmMsIHRlc3RzIG5lZWRlZAotCQkJTWV0aG9kRWxlbWVudCBtZWxlbWVudCA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcklucHV0KWlucHV0KS5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQlpZiAobWVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJbWVsZW1lbnQgPSAoKFByb2Nlc3NDb21wb25lbnQpIG1lbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQl9Ci0JCQlpZiAobWVsZW1lbnQgIT0gbnVsbCkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZT0gUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKG1lbGVtZW50KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNoYW5nZWRSZXNvdXJjZXNbaV0uZXF1YWxzKHJlc291cmNlKSkgewotCQkJCQkJdXBkYXRlRWRpdG9ySW1hZ2UobWVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRWRpdG9ySW1hZ2UoTWV0aG9kRWxlbWVudCBtZWxlbWVudCkgewotCQlJbWFnZSB0aXRsZUltYWdlPSBmTWV0aG9kRWxlbWVudEVkaXRvci5nZXRUaXRsZUltYWdlKCk7Ci0JCWlmICh0aXRsZUltYWdlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJbWFnZSBuZXdJbWFnZTsKLQkJbmV3SW1hZ2U9IGZMYWJlbFByb3ZpZGVyLmdldEltYWdlKG1lbGVtZW50KTsKLQkJaWYgKHRpdGxlSW1hZ2UgIT0gbmV3SW1hZ2UpIHsKLQkJCXBvc3RJbWFnZUNoYW5nZShuZXdJbWFnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9zdEltYWdlQ2hhbmdlKGZpbmFsIEltYWdlIG5ld0ltYWdlKSB7Ci0JCVNoZWxsIHNoZWxsPSBmTWV0aG9kRWxlbWVudEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWZNZXRob2RFbGVtZW50RWRpdG9yLnVwZGF0ZWRUaXRsZUltYWdlKG5ld0ltYWdlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZMYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLX0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODgyMjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudEltYWdlRGVzY3JpcHRvcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IgewotCQotCS8qKiBGbGFnIHRvIHJlbmRlciB0aGUgZXJyb3IgYWRvcm5tZW50LiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SPQkJCTB4MDQwOwotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgZkJhc2VJbWFnZTsKLQlwcml2YXRlIGludCBmRmxhZ3M7Ci0JcHJpdmF0ZSBQb2ludCBmU2l6ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUltYWdlIGFuIGltYWdlIGRlc2NyaXB0b3IgdXNlZCBhcyB0aGUgYmFzZSBpbWFnZQotCSAqIEBwYXJhbSBmbGFncyBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIGFkb3JubWVudHMgYXJlIHRvIGJlIHJlbmRlcmVkLiBTZWUgPGNvZGU+c2V0QWRvcm5tZW50czwvY29kZT4KLQkgKiAJZm9yIHZhbGlkIHZhbHVlcy4KLQkgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGltYWdlCi0JICogQHNlZSAjc2V0QWRvcm5tZW50cyhpbnQpCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IoSW1hZ2VEZXNjcmlwdG9yIGJhc2VJbWFnZSwgaW50IGZsYWdzLCBQb2ludCBzaXplKSB7Ci0JCWZCYXNlSW1hZ2U9IGJhc2VJbWFnZTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmQmFzZUltYWdlKTsKLQkJZkZsYWdzPSBmbGFnczsKLQkJQXNzZXJ0LmlzVHJ1ZShmRmxhZ3MgPj0gMCk7Ci0JCWZTaXplPSBzaXplOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZTaXplKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRvcnMgYWRvcm5tZW50cy4gVmFsaWQgdmFsdWVzIGFyZTogPGNvZGU+QUJTVFJBQ1Q8L2NvZGU+LCA8Y29kZT5GSU5BTDwvY29kZT4sCi0JICogPGNvZGU+U1lOQ0hST05JWkVEPC9jb2RlPiwgPC9jb2RlPlNUQVRJQzxjb2RlPiwgPC9jb2RlPlJVTk5BQkxFPGNvZGU+LCA8L2NvZGU+V0FSTklORzxjb2RlPiwgCi0JICogPC9jb2RlPkVSUk9SPGNvZGU+LCA8L2NvZGU+T1ZFUlJJRERFUzxjb2RlPiwgPGNvZGU+SU1QTEVNRU5UUzwvY29kZT4sIDxjb2RlPkNPTlNUUlVDVE9SPC9jb2RlPiwKLQkgKiA8Y29kZT5ERVBSRUNBVEVEPC9jb2RlPiwgIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aG9zZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRvcm5tZW50cyB0aGUgaW1hZ2UgZGVzY3JpcHRvcnMgYWRvcm5tZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkb3JubWVudHMoaW50IGFkb3JubWVudHMpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShhZG9ybm1lbnRzID49IDApOwotCQlmRmxhZ3M9IGFkb3JubWVudHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBhZG9ybm1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgYWRvcm5tZW50cwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWRyb25tZW50cygpIHsKLQkJcmV0dXJuIGZGbGFnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHNpemUgdGhlIHNpemUgb2YgdGhlIGltYWdlIHJldHVybmVkIGZyb20gY2FsbGluZyA8Y29kZT5jcmVhdGVJbWFnZSgpPC9jb2RlPgotCSAqIEBzZWUgSW1hZ2VEZXNjcmlwdG9yI2NyZWF0ZUltYWdlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZVNpemUoUG9pbnQgc2l6ZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHNpemUpOwotCQlBc3NlcnQuaXNUcnVlKHNpemUueCA+PSAwICYmIHNpemUueSA+PSAwKTsKLQkJZlNpemU9IHNpemU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGltYWdlIGNyZWF0ZWQgYnkgY2FsbGluZyA8Y29kZT5jcmVhdGVJbWFnZSgpPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBjcmVhdGVkIGJ5IGNhbGxpbmcgPGNvZGU+Y3JlYXRlSW1hZ2UoKTwvY29kZT4KLQkgKiBAc2VlIEltYWdlRGVzY3JpcHRvciNjcmVhdGVJbWFnZSgpCi0JICovCi0JcHVibGljIFBvaW50IGdldEltYWdlU2l6ZSgpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChmU2l6ZS54LCBmU2l6ZS55KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGZTaXplOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIE9iamVjdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgIU1ldGhvZEVsZW1lbnRJbWFnZURlc2NyaXB0b3IuY2xhc3MuZXF1YWxzKG9iamVjdC5nZXRDbGFzcygpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yIG90aGVyPSAoTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcilvYmplY3Q7Ci0JCXJldHVybiAoZkJhc2VJbWFnZS5lcXVhbHMob3RoZXIuZkJhc2VJbWFnZSkgJiYgZkZsYWdzID09IG90aGVyLmZGbGFncyAmJiBmU2l6ZS5lcXVhbHMob3RoZXIuZlNpemUpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBPYmplY3QuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZCYXNlSW1hZ2UuaGFzaENvZGUoKSB8IGZGbGFncyB8IGZTaXplLmhhc2hDb2RlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBNZXRob2QgZGVjbGFyZWQgaW4gQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlJbWFnZURhdGEgYmc9IGdldEltYWdlRGF0YShmQmFzZUltYWdlKTsKLQkJCQotCQkKLQkJZHJhd0ltYWdlKGJnLCAwLCAwKTsKLQkJCQkKLQkJZHJhd1RvcFJpZ2h0KCk7Ci0JCWRyYXdCb3R0b21SaWdodCgpOwotCQlkcmF3Qm90dG9tTGVmdCgpOwotCQkKLQotCX0KLQkKLQlwcml2YXRlIEltYWdlRGF0YSBnZXRJbWFnZURhdGEoSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJSW1hZ2VEYXRhIGRhdGE9IGRlc2NyaXB0b3IuZ2V0SW1hZ2VEYXRhKCk7IC8vIHNlZSBidWcgNTE5NjU6IGdldEltYWdlRGF0YSBjYW4gcmV0dXJuIG51bGwKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJZGF0YT0gREVGQVVMVF9JTUFHRV9EQVRBOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJJbWFnZSBkYXRhIG5vdCBhdmFpbGFibGU6ICIgKyBkZXNjcmlwdG9yLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGRhdGE7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBkcmF3VG9wUmlnaHQoKSB7CQkKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgZHJhd0JvdHRvbVJpZ2h0KCkgewotCX0JCQotCQotCXByaXZhdGUgdm9pZCBkcmF3Qm90dG9tTGVmdCgpIHsKLQkJUG9pbnQgc2l6ZT0gZ2V0U2l6ZSgpOwotCQlpbnQgeD0gMDsKLQkJaWYgKChmRmxhZ3MgJiBFUlJPUikgIT0gMCkgewotCQkJSW1hZ2VEYXRhIGRhdGE9IGdldEltYWdlRGF0YShBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19PVlJfRVJST1IpOwotCQkJZHJhd0ltYWdlKGRhdGEsIHgsIHNpemUueSAtIGRhdGEuaGVpZ2h0KTsKLQkJCXgrPSBkYXRhLndpZHRoOwotCQl9Ci0JfQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL1Byb2JsZW1NYXJrZXJNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL1Byb2JsZW1NYXJrZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMjIzMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9pbnRlcm5hbC9Qcm9ibGVtTWFya2VyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogTGlzdGVucyB0byByZXNvdXJjZSBkZWx0YXMgYW5kIGZpbHRlcnMgZm9yIG1hcmtlciBjaGFuZ2VzIG9mIHR5cGUgSU1hcmtlci5QUk9CTEVNCi0gKiBWaWV3ZXJzIHNob3dpbmcgZXJyb3IgdGlja3Mgc2hvdWxkIHJlZ2lzdGVyIGFzIGxpc3RlbmVyIHRvCi0gKiB0aGlzIHR5cGUuCi0gKiAKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudmlld3N1cHBvcnQuUHJvYmxlbU1hcmtlck1hbmFnZXIKLSAqLwotcHVibGljIGNsYXNzIFByb2JsZW1NYXJrZXJNYW5hZ2VyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogVmlzaXRvcnMgdXNlZCB0byBsb29rIGlmIHRoZSBlbGVtZW50IGNoYW5nZSBkZWx0YSBjb250YWlucyBhIG1hcmtlciBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvamVjdEVycm9yVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0KLQkJcHJpdmF0ZSBIYXNoU2V0PElSZXNvdXJjZT4gZkNoYW5nZWRFbGVtZW50czsgCi0JCQotCQlwdWJsaWMgUHJvamVjdEVycm9yVmlzaXRvcihIYXNoU2V0PElSZXNvdXJjZT4gY2hhbmdlZEVsZW1lbnRzKSB7Ci0JCQlmQ2hhbmdlZEVsZW1lbnRzPSBjaGFuZ2VkRWxlbWVudHM7Ci0JCX0KLQkJCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlcz0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgaW5zdGFuY2VvZiBJUHJvamVjdCAmJiBkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCUlQcm9qZWN0IHByb2plY3Q9IChJUHJvamVjdCkgcmVzOwotCQkJCWlmICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkvLyBvbmx5IHRyYWNrIG9wZW4gSmF2YSBwcm9qZWN0cwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJY2hlY2tJbnZhbGlkYXRlKGRlbHRhLCByZXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjaGVja0ludmFsaWRhdGUoSVJlc291cmNlRGVsdGEgZGVsdGEsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJaW50IGtpbmQ9IGRlbHRhLmdldEtpbmQoKTsKLQkJCWlmIChraW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQgfHwga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRCB8fCAoa2luZCA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIGlzRXJyb3JEZWx0YShkZWx0YSkpKSB7Ci0JCQkJLy8gaW52YWxpZGF0ZSB0aGUgcmVzb3VyY2UgYW5kIGFsbCBwYXJlbnRzCi0JCQkJd2hpbGUgKHJlc291cmNlLmdldFR5cGUoKSAhPSBJUmVzb3VyY2UuUk9PVCAmJiBmQ2hhbmdlZEVsZW1lbnRzLmFkZChyZXNvdXJjZSkpIHsKLQkJCQkJcmVzb3VyY2U9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCX0gCi0JCX0JCi0JCQotCQlwcml2YXRlIGJvb2xlYW4gaXNFcnJvckRlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CQotCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gMCkgewotCQkJCUlNYXJrZXJEZWx0YVtdIG1hcmtlckRlbHRhcz0gZGVsdGEuZ2V0TWFya2VyRGVsdGFzKCk7Ci0JCQkJZm9yIChpbnQgaT0gMDsgaSA8IG1hcmtlckRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobWFya2VyRGVsdGFzW2ldLmlzU3VidHlwZU9mKElNYXJrZXIuUFJPQkxFTSkpIHsKLQkJCQkJCWludCBraW5kPSBtYXJrZXJEZWx0YXNbaV0uZ2V0S2luZCgpOwotCQkJCQkJaWYgKGtpbmQgPT0gSVJlc291cmNlRGVsdGEuQURERUQgfHwga2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJaW50IHNldmVyaXR5PSBtYXJrZXJEZWx0YXNbaV0uZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIC0xKTsKLQkJCQkJCWludCBuZXdTZXZlcml0eT0gbWFya2VyRGVsdGFzW2ldLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSk7Ci0JCQkJCQlpZiAobmV3U2V2ZXJpdHkgIT0gc2V2ZXJpdHkpCi0JCQkJCQkJcmV0dXJuIHRydWU7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVyczsKLQkKLQkKLQlwdWJsaWMgUHJvYmxlbU1hcmtlck1hbmFnZXIoKSB7Ci0JCWZMaXN0ZW5lcnM9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkCi0JICovCQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlIYXNoU2V0PElSZXNvdXJjZT4gY2hhbmdlZEVsZW1lbnRzPSBuZXcgSGFzaFNldDxJUmVzb3VyY2U+KCk7Ci0JCQotCQl0cnkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGE9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgIT0gbnVsbCkKLQkJCQlkZWx0YS5hY2NlcHQobmV3IFByb2plY3RFcnJvclZpc2l0b3IoY2hhbmdlZEVsZW1lbnRzKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJaWYgKCFjaGFuZ2VkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VzPSAoSVJlc291cmNlW10pIGNoYW5nZWRFbGVtZW50cy50b0FycmF5KG5ldyBJUmVzb3VyY2VbY2hhbmdlZEVsZW1lbnRzLnNpemUoKV0pOwotCQkJZmlyZUNoYW5nZXMoY2hhbmdlcywgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUFubm90YXRpb25Nb2RlbExpc3RlbmVyI21vZGVsQ2hhbmdlZChJQW5ub3RhdGlvbk1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJQW5ub3RhdGlvbk1vZGVsIG1vZGVsKSB7Ci0JCS8vIG5vIGFjdGlvbgotCX0JCi0JCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIGZvciBwcm9ibGVtIG1hcmtlciBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElQcm9ibGVtQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGlzdGVuZXJzLmlzRW1wdHkoKSkgeyAKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWZMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgPGNvZGU+SVByb2JsZW1DaGFuZ2VkTGlzdGVuZXI8L2NvZGU+LgotCSAqLwkKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCWlmIChmTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVDaGFuZ2VzKGZpbmFsIElSZXNvdXJjZVtdIGNoYW5nZXMsIGZpbmFsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5PSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CQkKLQkJCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciBjdXJyPSAoSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQkJCWN1cnIucHJvYmxlbXNDaGFuZ2VkKGNoYW5nZXMsIGlzTWFya2VyQ2hhbmdlKTsKLQkJCQkJfQkKLQkJCQl9Ci0JCQl9KTsKLQkJfQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2E1MWJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5TWFpblBhZ2UyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSwgYnJpZWYgZGVzY3JpcHRpb24gYW5kCi0gKiB0eXBlIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeU1haW5QYWdlMiBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gTmV3TGlicmFyeU1haW5QYWdlMi5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQlwcml2YXRlIFRleHQgYnJpZWZEZXNjVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uW10gcmFkaW9CdXR0b25zOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeU1haW5QYWdlMigpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZE1haW5QYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZE1haW5QYWdlX2Rlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5OQU1FX1RFWFQpOwotCi0JCW5hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCSgoR3JpZERhdGEpIG5hbWVUZXh0LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCUxhYmVsIGJyaWVmRGVzY0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCWJyaWVmRGVzY0xhYmVsLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMKTsKLQkJYnJpZWZEZXNjVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSA3MDsKLQkJKChHcmlkRGF0YSkgYnJpZWZEZXNjVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IDQ4MDsKLQotCQlMYWJlbCBsaWJyYXJ5VHlwZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCWxpYnJhcnlUeXBlTGFiZWwuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5saWJyYXJ5VHlwZUxhYmVsX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0eXBlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl0eXBlQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCU1hcCB0eXBlcyA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlUeXBlcygpOwotCQlyYWRpb0J1dHRvbnMgPSBuZXcgQnV0dG9uW3R5cGVzLnNpemUoKV07Ci0JCWludCByYWRpb0J1dHRvbkluZGV4ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0eXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSAoU3RyaW5nKSB0eXBlcy5nZXQodHlwZUlkKTsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24odHlwZUNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJCXJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCX0KLQkJCX0pOwotCQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0eXBlTmFtZSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXREYXRhKFRZUEVfSUQsIHR5cGVJZCk7Ci0JCQlyYWRpb0J1dHRvbnNbcmFkaW9CdXR0b25JbmRleCsrXSA9IHJhZGlvQnV0dG9uOwotCQl9Ci0KLQkJaWYgKHJhZGlvQnV0dG9ucy5sZW5ndGggPiAwKSB7Ci0JCQlyYWRpb0J1dHRvbnNbMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCU5ld0xpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRXaXphcmRQYWdlKGdldExpYnJhcnlUeXBlKCkpOwotCQlpZiAod2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQl3aXphcmRQYWdlLm9uRW50ZXJQYWdlKGdldExpYnJhcnlOYW1lKCkpOwotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWVUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSB0eXBlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlCdXR0b24gcmFkaW9CdXR0b24gPSByYWRpb0J1dHRvbnNbaV07Ci0JCQlpZiAocmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b24uZ2V0RGF0YShUWVBFX0lEKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFN0cmluZykgcmFkaW9CdXR0b25zWzBdLmdldERhdGEoVFlQRV9JRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZDIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzdkMjFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5OZXdMaWJyYXJ5TWFpblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmV3TGlicmFyeVdpemFyZDIgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3TGlicmFyeVdpemFyZDIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIG1haW4gd2l6YXJkIHBhZ2UuCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5TWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkMigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCW1haW5QYWdlID0gbmV3IE5ld0xpYnJhcnlNYWluUGFnZSgpOwotCQlhZGRQYWdlKG1haW5QYWdlKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0TGlicmFyeVR5cGVzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHBlcnNpc3RlbmNlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcGFnZUlkID0gcGVyc2lzdGVuY2VJZCArICJQYWdlIjsgLy8kTk9OLU5MUy0xJAotCQkJTmV3TGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVXaXphcmRQYWdlKHBhZ2VJZCwgcGVyc2lzdGVuY2VJZCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCQkKLQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwYWdlc1tpXS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG1haW5QYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgbmFtZSA9IG1haW5QYWdlLmdldExpYnJhcnlOYW1lKCk7Ci0JCVN0cmluZyB0eXBlID0gbWFpblBhZ2UuZ2V0TGlicmFyeVR5cGUoKTsKLQkJTmV3TGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE5ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFdpemFyZFBhZ2UodHlwZSk7Ci0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHR5cGUsIHBhZ2UuZ2V0U2VsZWN0aW9ucygpKTsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQlhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkobGlicmFyeSk7Ci0JCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCQkub3BlblBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCQkJfQotCQkJcmVhc29uICs9ICJcblxuIiArIEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9hZHZpY2U7ICAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5ld2x5IG9wZW5lZCBvciBjcmVhdGVkIG1ldGhvZCBsaWJyYXJ5IHRvIHRoZSByZWNlbnRseSBvcGVuZWQKLQkgKiBtZXRob2QgbGlicmFyaWVzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBsaWJyYXJ5VVJJID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcigKLQkJCQkJbGlicmFyeSkuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVVSSShsaWJyYXJ5VVJJKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlYmIwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIFVJIHNlcnZpY2VzIGZvciB0aGUgQXV0aG9yaW5nIGFuZCBCcm93c2luZyBwZXJzcGVjdGl2ZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MDVlZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIAotICogUHJlZmVyZW5jZSBjb25zdGFudHMgZm9yIGFwcGxpY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzIGltcGxlbWVudHMgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9FTkFCTEVfUFJPQ0VTU19DT05UUklCVVRJT04gPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0xJQl9WSUVXX0xBWU9VVCA9ICJsYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSA9ICJsaWJWaWV3RE5ERGVmYXVsdExpbmtUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZXMgdGhlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3YXMgb3BlbmVkIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExheW91dChTdHJpbmcgdmFsdWUpIHsKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCVBSRUZfTElCX1ZJRVdfTEFZT1VULCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3YXMgb3BlbmVkIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGF5b3V0KCkgewotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlQUkVGX0xJQl9WSUVXX0xBWU9VVCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTBhZDE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0KLS8qKgotICogUHJlZmVyZW5jZUluaXRpYWxpemVyIGZvciBBdXRob3JpbmdQbHVnaW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIFdlIGRvbid0IG5lZWQgaXQgaGVyZS4gSXQncyBiZWVuIG1vdmVkIHRvIGxpYnJhcnlQbHVnaW4KLS8vCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TLAotLy8JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0vLwkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV0JTX0NPTFVNTlMpKTsKLS8vCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TLAotLy8JCQkJUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlCi0vLwkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpKTsKLS8vCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUywKLS8vCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotLy8JCQkJCQkudG9TdHJpbmcoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUykpOwotLy8JCXN0b3JlLnNldERlZmF1bHQoCi0vLwkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLAotLy8JCQkJdHJ1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0F1dGhvcmluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWI1NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNvbW1vblByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBBdXRob3JpbmcgcHJlZmVyZW5jZSBwYWdlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQmFzZVByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJTW9kaWZ5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9QUkVGRVJFTkNFX0hJU1RPUllfU0laRSA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFID0gMjA7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgZGVmYXVsdExpYnJhcnlQYXRoVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlc0NoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94OwotCi0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveDsKLQotCXByaXZhdGUgVGV4dCBwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgb2YgdGhpcwotCSAqIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBNZXRob2QgbGlicmFyeSBncm91cC4KLQkJR3JvdXAgbGlicmFyeUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5R3JvdXBfdGV4dCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwobGlicmFyeUdyb3VwLCBBdXRob3JpbmdVSVJlc291cmNlcy5kZWZhdWx0UGF0aExhYmVsX3RleHQpOwotCQlkZWZhdWx0TGlicmFyeVBhdGhUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGxpYnJhcnlHcm91cCk7Ci0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihsaWJyYXJ5R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0KLQkJZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChsaWJyYXJ5R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGlzY2FyZHVucmVzb2x2ZWRyZWYsIDMpOwotCi0JCS8vIENyZWF0ZSB0aGUgTW9kZWxpbmcgZ3JvdXAuCi0JCUdyb3VwIG1vZGVsaW5nR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm1vZGVsaW5nR3JvdXBfdGV4dCwgMSk7Ci0KLQkJdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3gobW9kZWxpbmdHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfc2VtYW50aWNzX2J1dHRvbl90ZXh0KTsKLQotCQkvLyBDcmVhdGUgdGhlIFVJIGdyb3VwLgotCQlHcm91cCB1c2VySW50ZXJmYWNlR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnVzZXJJbnRlcmZhY2VHcm91cF90ZXh0LCAyKTsKLQotCQljcmVhdGVMYWJlbCh1c2VySW50ZXJmYWNlR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVmYXVsdF9saXN0X2xlbmd0aF9sYWJlbCk7Ci0JCXByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodXNlckludGVyZmFjZUdyb3VwLAotCQkJCSIiLCAyNSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgdGhlIGRlYnVnIGdyb3VwLgotCQlHcm91cCBkZWJ1Z0dyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZWJ1Z0dyb3VwX3RleHQsIDIpOwotCi0JCWVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChkZWJ1Z0dyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3hfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCWRlZmF1bHRMaWJyYXJ5UGF0aFRleHQuc2V0VGV4dChMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0KLQkJZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzQ2hlY2tib3guc2V0U2VsZWN0aW9uKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSk7Ci0KLQkJdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94LnNldFNlbGVjdGlvbihMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpKTsKLQotCQlwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0LnNldFRleHQoIiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgQ29tbW9uUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCkpOyAKLQotCQllbmFibGVMaWJyYXJ5VmFsaWRhdGlvbkNoZWNrYm94LnNldFNlbGVjdGlvbihBdXRob3JpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgbGlzdGVuZXJzIHRvIHRoZSBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQotCQlwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXNldFZhbGlkKHRydWUpOwotCi0JCWludCB2YWx1ZSA9IDA7Ci0JCWlmIChlLndpZGdldCA9PSBwcmVmZXJlbmNlSGlzdG9yeVNpemVUZXh0KSB7Ci0JCQl2YWx1ZSA9IGdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpOwotCQkJaWYgKHZhbHVlIDwgTUlOX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFCi0JCQkJCXx8IHZhbHVlID4gTUFYX1BSRUZFUkVOQ0VfSElTVE9SWV9TSVpFKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW52YWxpZFByZWZlcmVuY2VIaXN0b3J5U2l6ZUVycm9yX21zZywKLQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQluZXcgSW50ZWdlcihNSU5fUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUpLAotCQkJCQkJCQkJCW5ldyBJbnRlZ2VyKE1BWF9QUkVGRVJFTkNFX0hJU1RPUllfU0laRSkgfSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHNwZWNpYWwgcHJvY2Vzc2luZyB3aGVuIHRoaXMgcGFnZSdzIERlZmF1bHRzIGJ1dHRvbiBoYXMgYmVlbgotCSAqIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQotCQlTdHJpbmcgZGVmYXVsdExpYnJhcnlQYXRoID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5pdGlhbERlZmF1bHRMaWJyYXJ5UGF0aCgpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXREZWZhdWx0TGlicmFyeVBhdGgoZGVmYXVsdExpYnJhcnlQYXRoKTsKLQkJZGVmYXVsdExpYnJhcnlQYXRoVGV4dC5zZXRUZXh0KGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0KLQkJYm9vbGVhbiBkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMgPSBMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuc2V0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKGRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyk7Ci0JCWRpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlc0NoZWNrYm94Ci0JCQkJLnNldFNlbGVjdGlvbihkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMpOwotCi0JCWJvb2xlYW4gdXNlTmV3RXh0ZW5kc1NlbWFudGljcyA9IExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcyh1c2VOZXdFeHRlbmRzU2VtYW50aWNzKTsKLQkJdXNlTmV3RXh0ZW5kc1NlbWFudGljc0NoZWNrYm94LnNldFNlbGVjdGlvbih1c2VOZXdFeHRlbmRzU2VtYW50aWNzKTsKLQotCQlpbnQgcHJlZmVyZW5jZUhpc3RvcnlTaXplID0gQ29tbW9uUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVmYXVsdFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpOwotCQlDb21tb25QcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUocHJlZmVyZW5jZUhpc3RvcnlTaXplKTsKLQkJcHJlZmVyZW5jZUhpc3RvcnlTaXplVGV4dC5zZXRUZXh0KCIiICsgcHJlZmVyZW5jZUhpc3RvcnlTaXplKTsgLy8kTk9OLU5MUy0xJAotCi0JCWJvb2xlYW4gZW5hYmxlTGlicmFyeVZhbGlkYXRpb24gPSBBdXRob3JpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpOwotCQlBdXRob3JpbmdVSVByZWZlcmVuY2VzCi0JCQkJLnNldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKTsKLQkJZW5hYmxlTGlicmFyeVZhbGlkYXRpb25DaGVja2JveC5zZXRTZWxlY3Rpb24oZW5hYmxlTGlicmFyeVZhbGlkYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVmYXVsdExpYnJhcnlQYXRoKGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLnNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhnZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSk7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKGdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSk7Ci0JCUNvbW1vblByZWZlcmVuY2VzLnNldFByZWZlcmVuY2VIaXN0b3J5U2l6ZShnZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSk7Ci0JCUF1dGhvcmluZ1VJUHJlZmVyZW5jZXMKLQkJCS5zZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbihnZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgc2V0dGluZ3MgZm9yIGJyb3dzaW5nCi0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkudXBkYXRlTGF5b3V0U2V0dGluZ3MoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBkZWZhdWx0IG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBkZWZhdWx0TGlicmFyeVBhdGhUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBkaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXNDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCB1c2UgbmV3IGV4dGVuZHMgc2VtYW50aWNzIHByZWZlcmVuY2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpIHsKLQkJcmV0dXJuIHVzZU5ld0V4dGVuZHNTZW1hbnRpY3NDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwcmVmZWZyZW5jZSBoaXN0b3J5IHNpemUuCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSB7Ci0JCXJldHVybiBTdHJVdGlsLmdldEludFZhbHVlKHByZWZlcmVuY2VIaXN0b3J5U2l6ZVRleHQuZ2V0VGV4dCgpLnRyaW0oKSwKLQkJCQkwKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZW5hYmxlZCBsaWJyYXJ5IHZhbGlkYXRpb24gcHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIGVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGRpcmVjdG9yeSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5EaXJlY3RvcnlEaWFsb2coKSB7Ci0JCXRyeSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGNvbXBvc2l0ZS5nZXRTaGVsbCgpLAotCQkJCQlTV1QuTk9ORSk7Ci0JCQlTdHJpbmcgcGF0aCA9IGRkLm9wZW4oKTsKLQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQlkZWZhdWx0TGlicmFyeVBhdGhUZXh0LnNldFRleHQocGF0aCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Zjc0ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9BdXRob3JpbmdVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgQXV0aG9yaW5nIFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEF1dGhvcmluZ1VJUHJlZmVyZW5jZXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiA9ICJlbmFibGVkTGlicmFyeVZhbGlkYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTiA9IGZhbHNlOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVOQUJMRV9MSUJSQVJZX1ZBTElEQVRJT04sCi0JCQkJREVGQVVMVF9FTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGVuYWJsZSBtZXRob2QgbGlicmFyeSB2YWxpZGF0aW9uIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlZmF1bHRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgbGlicmFyeSB2YWxpZGF0aW9uIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oRU5BQkxFX0xJQlJBUllfVkFMSURBVElPTik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIGxpYnJhcnkgdmFsaWRhdGlvbiBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFbmFibGVMaWJyYXJ5VmFsaWRhdGlvbihib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShFTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OLCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0JyZWFrZG93bkVsZW1lbnRQcmVmUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9CcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NDQ2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0JyZWFrZG93bkVsZW1lbnRQcmVmUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5QcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBicmVha2Rvd24gZWxlbWVudCBhdHRyaWJ1dGVzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRQcmVmUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQnV0dG9uIHdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudFBsYW5uZWRCdXR0b24sCi0JCQl3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uLAotCQkJd29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nQnV0dG9uLAotCQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24sCi0JCQlkZXNjcmlwdG9yTXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbiwgZGVzY3JpcHRvclBsYW5uZWRCdXR0b24sCi0JCQlkZXNjcmlwdG9yRXZlbnREcml2ZW5CdXR0b24sIGRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uLAotCQkJZGVzY3JpcHRvclJlcGV0YWJsZUJ1dHRvbjsKLQotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50UHJlZlBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9icmVha0Rvd25FbGVtZW50X0Rlc2NyaXB0aW9uKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNyZWF0ZSBncm91cCBmb3IgYWN0aXZpdHkgZWxlbWVudHMKLQkJR3JvdXAgd29ya0JyZWFrZG93bkVsZW1lbnRHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9Xb3JrQnJlYWtkb3duRWxlbWVudHMsIDEsIHRydWUpOwotCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfT3B0aW9uYWwpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9QbGFubmVkKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbkJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9FdmVudERyaXZlbik7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50T25nb2luZ0J1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCXdvcmtCcmVha2Rvd25FbGVtZW50R3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9PbmdvaW5nKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24gPSBjcmVhdGVDaGVja2JveCgKLQkJCQl3b3JrQnJlYWtkb3duRWxlbWVudEdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlKTsKLQotCQkvLyBjcmVhdGUgZ3JvdXAgZm9yIGRlc2NyaXB0b3IgZWxlbWVudHMKLQkJR3JvdXAgZGVzY3JpcHRvckdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlX0Rlc2NyaXB0b3JFbGVtZW50cywgMSwgdHJ1ZSk7Ci0JCWRlc2NyaXB0b3JPcHRpb25hbEJ1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX09wdGlvbmFsKTsKLQkJZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9NdWx0aXBsZU9jY3VycmVuY2VzKTsKLQkJZGVzY3JpcHRvclBsYW5uZWRCdXR0b24gPSBjcmVhdGVDaGVja2JveChkZXNjcmlwdG9yR3JvdXAsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9QbGFubmVkKTsKLQkJZGVzY3JpcHRvckV2ZW50RHJpdmVuQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfRXZlbnREcml2ZW4pOwotCQlkZXNjcmlwdG9yT25nb2luZ0J1dHRvbiA9IGNyZWF0ZUNoZWNrYm94KGRlc2NyaXB0b3JHcm91cCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX09uZ29pbmcpOwotCQlkZXNjcmlwdG9yUmVwZXRhYmxlQnV0dG9uID0gY3JlYXRlQ2hlY2tib3goZGVzY3JpcHRvckdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfUmVwZXRhYmxlKTsKLQotCQkvLyBJbml0aWFsaXplIHZhbHVlcwotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFByZWZlcmVuY2VQYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlzdG9yZVZhbHVlcygpOwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hcHBseURlZmF1bHRWYWx1ZXNGb3JCcmVha2Rvd25FbGVtZW50QXR0cmlidXRlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIHZhbHVlcyBvZiB0aGUgY29udHJvbHMgYmFjayB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCS8vCi0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWwod29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzKHdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkKHdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbgotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuc2V0V29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbih3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmcod29ya0JyZWFrZG93bkVsZW1lbnRPbmdvaW5nQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRXb3JrQnJlYWtkb3duRWxlbWVudFJlcGVhdGFibGUod29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVzY3JpcHRvck9wdGlvbmFsKGRlc2NyaXB0b3JPcHRpb25hbEJ1dHRvbgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldERlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzKGRlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzQnV0dG9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXREZXNjcmlwdG9yUGxhbm5lZChkZXNjcmlwdG9yUGxhbm5lZEJ1dHRvbgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldERlc2NyaXB0b3JFdmVudERyaXZlbihkZXNjcmlwdG9yRXZlbnREcml2ZW5CdXR0b24KLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldERlc2NyaXB0b3JPbmdvaW5nKGRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uCi0JCQkJLmdldFNlbGVjdGlvbigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0RGVzY3JpcHRvclJlcGVhdGFibGUoZGVzY3JpcHRvclJlcGV0YWJsZUJ1dHRvbgotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkZWZhdWx0IHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCQkKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFdmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQotCQlkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvclBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJZGVzY3JpcHRvckV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWRlc2NyaXB0b3JPbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWRlc2NyaXB0b3JSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50T3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50T3B0aW9uYWwoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50TXVsdGlwbGVPY2N1cnJhbmNlc0J1dHRvbgotCQkJCS5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50UGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRQbGFubmVkKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudEV2ZW50RHJpdmVuKCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmdCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50T25nb2luZygpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpKTsKLQotCQlkZXNjcmlwdG9yT3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JPcHRpb25hbCgpKTsKLQkJZGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXNCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzKCkpOwotCQlkZXNjcmlwdG9yUGxhbm5lZEJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvclBsYW5uZWQoKSk7Ci0JCWRlc2NyaXB0b3JFdmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvckV2ZW50RHJpdmVuKCkpOwotCQlkZXNjcmlwdG9yT25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RGVzY3JpcHRvck9uZ29pbmcoKSk7Ci0JCWRlc2NyaXB0b3JSZXBldGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlc2NyaXB0b3JSZXBlYXRhYmxlKCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Db21tb25QcmVmUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTFiZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvQ29tbW9uUHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLlByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGNvbW1vbiBvcHRpb25zCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uUHJlZlBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gZG8gbm90aGluZyBpbiB0aGlzIGNvbW1vbiBwcmVmZXJlbmNlIHBhZ2UKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVHcmlkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkRpcmVjdG9yeURpYWxvZyhDb21wb3NpdGUgcGFyZW50LCBUZXh0IHBhdGhfY3RyKSB7Ci0JCXRyeSB7Ci0JCQlEaXJlY3RvcnlEaWFsb2cgZGQgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHBhcmVudC5nZXRTaGVsbCgpLAotCQkJCQlTV1QuTk9ORSk7Ci0KLQkJCVN0cmluZyBkZXN0aW5hdGlvbiA9IGRkLm9wZW4oKTsKLQkJCWlmIChkZXN0aW5hdGlvbiAhPSBudWxsKSB7Ci0JCQkJcGF0aF9jdHIuc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0byBjcmVhdGUgYSBMYWJlbAotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgTGFiZWwKLQkgKiBAcGFyYW0gdGV4dCBMYWJlbCB0ZXh0Ci0JICogQHBhcmFtIHNwYW4gaG9yaXpvbnRhbCBzcGFuCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBMYWJlbAotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gY3JlYXRlIGEgcmFkaW8gYnV0dG9uCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlIG9mIHRoZSBidXR0b24KLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGJ1dHRvbiBsYWJlbAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgUmFkaW8gQnV0dG9uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8gfCBTV1QuTEVGVCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gY3JlYXRlIGEgbGluZQotCSAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNvbXBvc2l0ZSBvZiB0aGUgbGluZQotCSAqIEBwYXJhbSBuY29sIGhvcml6b250YWwgc3BhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG5jb2wpIHsKLQkJTGFiZWwgbGluZSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTAotCQkJCXwgU1dULkJPTEQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IG5jb2w7Ci0JCWxpbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCQkvLyByZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5TG9jYXRpb25EYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlMb2NhdGlvbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2NmI0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlMb2NhdGlvbkRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkNvbW1vblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIExvY2F0aW9uIERhdGEgZm9yIGxpYnJhcnkgCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICogZml4IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU3NDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TG9jYXRpb25EYXRhIHsKLQotCXByaXZhdGUgU3RyaW5nIHBhcmVudEZvbGRlcjsKLQotCXByaXZhdGUgU3RyaW5nIGxpYk5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBsaWJCcmllZkRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2luZ2xlTGliRmlsZTsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWZMaWJEaXJDaGVja2VkOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeUZpbGUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzT2tQcmVzc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2tQcmVzc2VkKCkgewotCQlyZXR1cm4gaXNPa1ByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlzT2tQcmVzc2VkCi0JICogICAgICAgICAgICBUaGUgaXNPa1ByZXNzZWQgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9rUHJlc3NlZChib29sZWFuIGlzT2tQcmVzc2VkKSB7Ci0JCXRoaXMuaXNPa1ByZXNzZWQgPSBpc09rUHJlc3NlZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPa1ByZXNzZWQ7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGlzU2luZ2xlTGliRmlsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZUxpYkZpbGUoKSB7Ci0JCXJldHVybiBpc1NpbmdsZUxpYkZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlzU2luZ2xlTGliRmlsZQotCSAqICAgICAgICAgICAgVGhlIGlzU2luZ2xlTGliRmlsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2luZ2xlTGliRmlsZShib29sZWFuIGlzU2luZ2xlTGliRmlsZSkgewotCQl0aGlzLmlzU2luZ2xlTGliRmlsZSA9IGlzU2luZ2xlTGliRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGxpYk5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJOYW1lKCkgewotCQlyZXR1cm4gbGliTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIEZ1bGwgcGF0aCBvZiBsaWJyYXJ5LnhtaQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeUZpbGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRGb2xkZXIoKSArIEZpbGUuc2VwYXJhdG9yICsgbGlicmFyeUZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpYk5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBsaWJOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWJOYW1lKFN0cmluZyBsaWJOYW1lKSB7Ci0JCXRoaXMubGliTmFtZSA9IGxpYk5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJlbnRGb2xkZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRGb2xkZXIoKSB7Ci0JCXJldHVybiBwYXJlbnRGb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudEZvbGRlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudEZvbGRlciB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50Rm9sZGVyKFN0cmluZyBwYXJlbnRGb2xkZXIpIHsKLQkJdGhpcy5wYXJlbnRGb2xkZXIgPSBwYXJlbnRGb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsaWJCcmllZkRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGliQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGxpYkJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpYkJyaWVmRGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIFRoZSBsaWJCcmllZkRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaWJCcmllZkRlc2NyaXB0aW9uKFN0cmluZyBsaWJCcmllZkRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMubGliQnJpZWZEZXNjcmlwdGlvbiA9IGxpYkJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZMaWJEaXJDaGVja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmTGliRGlyQ2hlY2tlZCgpIHsKLQkJcmV0dXJuIGRlZkxpYkRpckNoZWNrZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlZkxpYkRpckNoZWNrZWQKLQkgKiAgICAgICAgICAgIFRoZSBkZWZMaWJEaXJDaGVja2VkIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZMaWJEaXJDaGVja2VkKGJvb2xlYW4gZGVmTGliRGlyQ2hlY2tlZCkgewotCQl0aGlzLmRlZkxpYkRpckNoZWNrZWQgPSBkZWZMaWJEaXJDaGVja2VkOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHByZWZlcmVuY2VzIGZyb20gdGhlIHN0b3JlCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlTdHJpbmcgbGFzdERpciA9IHN0b3JlCi0JCQkJLmdldFN0cmluZyhMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfTElCUkFSWV9QQVJFTlRfRElSRUNUT1JZKTsKLQkJdGhpcy5zZXRQYXJlbnRGb2xkZXIobGFzdERpcik7Ci0KLQkJYm9vbGVhbiBsYXN0Q2hlY2tlZCA9IHN0b3JlCi0JCQkJLmdldEJvb2xlYW4oTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQpOwotCQkvLyB0aGUgY29udGFpbnMgbWV0aG9kIGRvZXMgbm90IHNlZW0gdG8gd29yayBzbyB1c2UgbGFzdCBkaXIgYXMgYW4KLQkJLy8gYXBwcm94aW1hdGlvbiBpZgotCQkvLyAoc3RvcmUuY29udGFpbnMoTGliYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xBU1RfREVGQVVMVF9ESVJFQ1RPUllfQ0hFQ0tFRCkpCi0JCWlmIChsYXN0RGlyID09IG51bGwgfHwgbGFzdERpci50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCXRoaXMuc2V0RGVmTGliRGlyQ2hlY2tlZCh0cnVlKTsKLQkJZWxzZQotCQkJdGhpcy5zZXREZWZMaWJEaXJDaGVja2VkKGxhc3RDaGVja2VkKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBkaWFsb2cgY2hvaWNlcyB0byB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZVRvUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmdldFBhcmVudEZvbGRlcigpKTsKLQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJc3RvcmUuc2V0VmFsdWUoCi0JCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSwKLQkJCQlmaWxlLmdldFBhcmVudCgpKTsKLQkJc3RvcmUuc2V0VmFsdWUoCi0JCQkJTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQsCi0JCQkJdGhpcy5pc0RlZkxpYkRpckNoZWNrZWQoKSk7Ci0KLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjFjMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBDb25zdGFudHMgZm9yIGxpYnJhcnkKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzIGV4dGVuZHMgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZDI0NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogSW5pdGlhbGl6ZXIgZm9yIGxpYnJhcnkgcHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoTGlicmFyeVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9SQURJT19TQVZFX0NIT0lDRSwgMSk7Ci0JCQotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TLAotCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XQlNfQ09MVU1OUykpOwotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TLAotCQkJCVByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZQotCQkJCQkJLnRvU3RyaW5nKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUykpOwotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUywKLQkJCQlQcm9jZXNzRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJCQkJCS50b1N0cmluZyhQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoCi0JCQkJQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSwKLQkJCQl0cnVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvTGlicmFyeVZpZXdQcmVmUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5Vmlld1ByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjljNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5Vmlld1ByZWZQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuaW50ZXJuYWwucGFnZXNldHVwLkRlZmF1bHRWYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLldvcmtzcGFjZVZpZXdlclByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlJhZGlvR3JvdXBGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogTGlicmFyeSB2aWV3IG9wdGlvbnMgcHJlZmVyZW5jZSBwYWdlCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZpZXdQcmVmUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCQotCXB1YmxpYyBMaWJyYXJ5Vmlld1ByZWZQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJQ29tcG9zaXRlIHBhcmVudCA9IGdldEZpZWxkRWRpdG9yUGFyZW50KCk7Ci0JCVJhZGlvR3JvdXBGaWVsZEVkaXRvciBkZWZhdWx0TGlua1R5cGVFZGl0b3IgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKAotCSAgICAJICAgICAJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSUJfVklFV19ETkRfREVGQVVMVF9MSU5LVFlQRSwKLQkgICAgCSAgICAgCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZGVmYXVsdExpbmtUeXBlUHJlZkxhYmVsLCAxLAotCSAgICAJICAgICAJCQluZXcgU3RyaW5nW11bXSB7Ci0JICAgIAkgICAgIAkJCQkJe0xpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua19uYW1lLCBSZXNvdXJjZUhlbHBlci5FTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmt9LAotCSAgICAJICAgICAJCQkJCXtMaWJyYXJ5VUlSZXNvdXJjZXMuZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lLCBSZXNvdXJjZUhlbHBlci5FTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZX0sCi0JICAgIAkgICAgIAkJCQkJe0xpYnJhcnlVSVJlc291cmNlcy5lbGVtZW50TGlua1dpdGhVc2VyVGV4dF9uYW1lLCBSZXNvdXJjZUhlbHBlci5FTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHR9Ci0JICAgIAkgICAgIAkJCX0sIHBhcmVudCwgdHJ1ZSk7Ci0JCWRlZmF1bHRMaW5rVHlwZUVkaXRvci5zZXRQcmVmZXJlbmNlU3RvcmUoZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWFkZEZpZWxkKGRlZmF1bHRMaW5rVHlwZUVkaXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIHByaW50aW5nIHByZWZlcmVuY2VzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0RGVmYXVsdHMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlzdG9yZS5zZXREZWZhdWx0KEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJQl9WSUVXX0RORF9ERUZBVUxUX0xJTktUWVBFLAotCQkJCVJlc291cmNlSGVscGVyLkVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGluayk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL1Byb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDdiZWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIFByb2Nlc3NFZGl0b3IKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UsIFNlbGVjdGlvbkxpc3RlbmVyLCBNb2RpZnlMaXN0ZW5lciB7Ci0KLQkvLyBwcml2YXRlIFRleHQgbGluZVdpZHRoVGV4dDsKLQkvLyBwcml2YXRlIEJ1dHRvbiBpbmRlbnRDaGVja2JveDsKLQkvLyBwcml2YXRlIFRleHQgaW5kZW50U2l6ZVRleHQ7Ci0JLy8gcHJpdmF0ZSBDb21ibyBic0NvbWJvOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9Xb3JrQnJlYWtkb3duU3RydWN0dXJlOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQlNfVFhUID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbjsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCU19UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX1dvcmtQcm9kdWN0VXNhZ2U7IAotCi0JcHJpdmF0ZSBMaXN0Vmlld2VyIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcjsKLQotCS8vIHByaXZhdGUgTGlzdFZpZXdlciB0YnNTZWxlY3RlZENvbExpc3Q7Ci0JLy8gcHJpdmF0ZSBMaXN0Vmlld2VyIHdwYnNTZWxlY3RlZENvbExpc3Q7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdCB3YnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgamF2YS51dGlsLkxpc3QgdGJzQ29sdW1uRGVzY3JpcHRvcnM7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5MaXN0IHdwYnNDb2x1bW5EZXNjcmlwdG9yczsKLQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRvd25CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiB1cEJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJTX05BTUVTID0gbmV3IFN0cmluZ1tdIHsgV0JTX1RYVCwgVEJTX1RYVCwKLQkJCVdQQlNfVFhUIH07Ci0KLQlwcml2YXRlIExpc3RbXSBjb2x1bW5EZXNjcmlwdG9yTGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0W10gQUxMX0NPTFVNTl9ERVNDUklQVE9SX0xJU1RTID0gbmV3IExpc3RbXSB7Ci0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XQlNfQ09MVU1OUywgUHJvY2Vzc0VkaXRvci5BTExfVEJTX0NPTFVNTlMsCi0JCQlQcm9jZXNzRWRpdG9yLkFMTF9XUEJTX0NPTFVNTlMgfTsKLQotCS8vIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nIHByZWZlcmVuY2UKLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hBbHdheXNCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTd2l0Y2hOZXZlckJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbjsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbHVtbkRlc2NyaXB0b3JQcm92aWRlciBpbXBsZW1lbnRzCi0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciwgSUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBDb2x1bW5EZXNjcmlwdG9yUHJvdmlkZXIoKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChqYXZhLnV0aWwuTGlzdCkgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2x1bW5EZXNjcmlwdG9yKSBlbGVtZW50KS5sYWJlbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjYWRkTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgd3JhcHBlciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAoIHdyYXBwZXIgaW5zdGFuY2VvZiBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyICkgewotCQkJcmV0dXJuICgoUHJlZmVyZW5jZVN0b3JlV3JhcHBlcil3cmFwcGVyKS5nZXRTdG9yZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0RGF0YSgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlDb21wb3NpdGUgY29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCWNvbHVtbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29sdW1uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbHVtbnNlbGVjdGlvbl90ZXh0KTsgCi0KLQkJZmluYWwgQ29tYm8gYnNDb21ibyA9IG5ldyBDb21ibyhjb2x1bW5zQ29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZCi0JCQkJfCBTV1QuQk9SREVSKTsKLQkJYnNDb21iby5zZXRJdGVtcyhCU19OQU1FUyk7Ci0JCWJzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUuZ2V0U291cmNlKCk7Ci0JCQkJaW50IGlkID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlpZiAoaWQgIT0gLTEpIHsKLQkJCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkJLnNldElucHV0KGNvbHVtbkRlc2NyaXB0b3JMaXN0c1tpZF0pOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJfQotCi0JCX0pOwotCQlic0NvbWJvLnNlbGVjdCgwKTsKLQotCQlDb21wb3NpdGUgbGlzdENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsaXN0Q29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlsaXN0Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSBzdWJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpc3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlzdWJDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXN1YkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIgPSBuZXcgTGlzdFZpZXdlcihzdWJDb21wb3NpdGUsIFNXVC5NVUxUSQotCQkJCXwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCWZpbmFsIENvbHVtbkRlc2NyaXB0b3JQcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgQ29sdW1uRGVzY3JpcHRvclByb3ZpZGVyKCk7Ci0JCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldExhYmVsUHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldElucHV0KHdic0NvbHVtbkRlc2NyaXB0b3JzKTsKLQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUxpc3QgcmVtb3ZlTGlzdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpKS50b0xpc3QoKTsKLQkJCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX0lEKQotCQkJCQkJfHwgcmVtb3ZlTGlzdAotCQkJCQkJCQkuY29udGFpbnMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSkpIHsKLQkJCQkJLy8gaWYgcHJlc2VudCBuYW1lIG9yIGlkIHNlbGVjdGVkLCAKLQkJCQkJLy8gZGlzYWJsZSAicmVtb3ZlIiwidXAiIGFuZCAiZG93biIgYnV0dG9uCi0JCQkJCS8vCi0JCQkJCWlmKHJlbW92ZUJ1dHRvbi5pc0VuYWJsZWQoKSkgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlpZih1cEJ1dHRvbi5pc0VuYWJsZWQoKSkgdXBCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWlmKGRvd25CdXR0b24uaXNFbmFibGVkKCkpIGRvd25CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYoIXJlbW92ZUJ1dHRvbi5pc0VuYWJsZWQoKSkgcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWlmKCF1cEJ1dHRvbi5pc0VuYWJsZWQoKSkgdXBCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJaWYoIWRvd25CdXR0b24uaXNFbmFibGVkKCkpIGRvd25CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCQotCQotCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIHdic1NlbGVjdGVkQ29sdW1uc1RhYmxlLnNldEl0ZW1zKG5ldyBTdHJpbmdbXSB7Ci0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfRVZFTlRfRFJJVkVOLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLAotCQkvLyB9KTsKLQotCQkvLyBDVGFiSXRlbSB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wod2JzU2VsZWN0ZWRDb2x1bW5zVGFibGUuZ2V0Q29udHJvbCgpKTsKLQotCQkvLyB0YnNTZWxlY3RlZENvbExpc3QgPSBuZXcgTGlzdFZpZXdlcihjb2x1bW5zQ29tcG9zaXRlLCBTV1QuQ0hFQ0sgfAotCQkvLyBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJLy8gdGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0TGFiZWxQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SW5wdXQodGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YnNTZWxlY3RlZENvbExpc3Quc2V0SXRlbXMobmV3IFN0cmluZ1tdIHsKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsCi0JCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsCi0JCS8vIH0pOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpOwotCQkvLyB0YWJJdGVtLnNldENvbnRyb2wodGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdCA9IG5ldyBMaXN0Vmlld2VyKGNvbHVtbnNDb21wb3NpdGUsIFNXVC5DSEVDSyB8Ci0JCS8vIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldENvbnRlbnRQcm92aWRlcihpdGVtUHJvdmlkZXIpOwotCQkvLyB3cGJzU2VsZWN0ZWRDb2xMaXN0LnNldExhYmVsUHJvdmlkZXIoaXRlbVByb3ZpZGVyKTsKLQkJLy8gd3Bic1NlbGVjdGVkQ29sTGlzdC5zZXRJbnB1dCh3cGJzQ29sdW1uRGVzY3JpcHRvcnMpOwotCQkvLyB0YWJJdGVtID0gbmV3IENUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQkvLyB0YWJJdGVtLnNldFRleHQoIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIik7Ci0JCS8vIHRhYkl0ZW0uc2V0Q29udHJvbCh3cGJzU2VsZWN0ZWRDb2xMaXN0LmdldENvbnRyb2woKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbnNDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGxpc3RDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJYnV0dG9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkFERF9CVVRUT05fVEVYVCk7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaW50IGlkID0gYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCU9iamVjdCBpbnB1dCA9IEFMTF9DT0xVTU5fREVTQ1JJUFRPUl9MSVNUU1tpZF07Ci0JCQkJZmluYWwgTGlzdCBzZWxlY3RlZENvbHVtbnMgPSBjb2x1bW5EZXNjcmlwdG9yTGlzdHNbaWRdOwotCQkJCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJaW5wdXQsCi0JCQkJCQlpdGVtUHJvdmlkZXIsCi0JCQkJCQlpdGVtUHJvdmlkZXIsCi0JCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RDb2x1bW5zdG9BZGRfdGV4dCkgeyAKLQkJCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCQkJCQlnZXRWaWV3ZXIoKS5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQotCQkJCQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLAotCQkJCQkJCQkJT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkJCXJldHVybiAhc2VsZWN0ZWRDb2x1bW5zLmNvbnRhaW5zKGVsZW1lbnQpOwotCQkJCQkJCX0KLQotCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gY29udHJvbDsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlpZiAoZGxnLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkJc2VsZWN0ZWRDb2x1bW5zLmFkZEFsbChBcnJheXMuYXNMaXN0KGRsZy5nZXRSZXN1bHQoKSkpOwotCQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQotCQlyZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucmVtb3ZlQnV0dG9uX3RleHQpOyAKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWphdmEudXRpbC5MaXN0IGNvbHVtbnMgPSAoamF2YS51dGlsLkxpc3QpIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldElucHV0KCk7Ci0JCQkJTGlzdCByZW1vdmVMaXN0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpLnRvTGlzdCgpOwotCQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfSUQpCi0JCQkJCQl8fCByZW1vdmVMaXN0Ci0JCQkJCQkJCS5jb250YWlucyhQcm9jZXNzRWRpdG9yLkNPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FKSkgewotCQkJCQkvLyBjYW5ub3QgcmVtb3ZlIG5hbWUgb3IgSUQgY29sdW1uCi0JCQkJCS8vCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY29sdW1ucy5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQotCQl9KTsKLQotCQl1cEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cEJ1dHRvbi5zZXRUZXh0KEF1dGhvcmluZ1VJVGV4dC5VUF9CVVRUT05fVEVYVCk7Ci0JCXVwQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCXVwQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpCi0JCQkJCXJldHVybjsKLQkJCQlFTGlzdCBjb2x1bW5zID0gKEVMaXN0KSBzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaW50IGlkID0gY29sdW1ucy5pbmRleE9mKHNlbGVjdGVkKTsKLQkJCQlpZiAoYnNDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDAgJiYgaWQgPCAzKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA+IDAgJiYgaWQgPCAyKQotCQkJCQlyZXR1cm47Ci0JCQkJY29sdW1ucy5tb3ZlKGlkIC0gMSwgaWQpOwotCQkJCXNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXNlbGVjdGVkKSwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZG93bkJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlkb3duQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LkRPV05fQlVUVE9OX1RFWFQpOwotCQlkb3duQnV0dG9uLnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCWRvd25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuOwotCQkJCUVMaXN0IGNvbHVtbnMgPSAoRUxpc3QpIHNlbGVjdGVkQ29sdW1uTGlzdFZpZXdlci5nZXRJbnB1dCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpbnQgaWQgPSBjb2x1bW5zLmluZGV4T2Yoc2VsZWN0ZWQpOwotCQkJCQotCQkJCWlmIChpZCA9PSBjb2x1bW5zLnNpemUoKSAtIDEgfHwgKGJzQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwICYmIGlkIDwgMikpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoaWQgPT0gY29sdW1ucy5zaXplKCkgLSAxIHx8IChic0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGlkIDwgMSkpCi0JCQkJCXJldHVybjsKLQkJCQljb2x1bW5zLm1vdmUoaWQgKyAxLCBpZCk7Ci0JCQkJc2VsZWN0ZWRDb2x1bW5MaXN0Vmlld2VyLnJlZnJlc2goKTsKLQkJCQlzZWxlY3RlZENvbHVtbkxpc3RWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWQpLCB0cnVlKTsKLQkJCX0KLQotCQl9KTsKLQotCQlHcm91cCBjb25maWdTd2l0Y2hHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5TSEFET1dfT1VUKTsKLQkJY29uZmlnU3dpdGNoR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbmZpZ1N3aXRjaEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb25maWdTd2l0Y2hHcm91cAotCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JQcmVmZXJlbmNlUGFnZV9zd2l0Y2hDb25maWd1cmF0aW9uKTsgCi0KLQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uID0gbmV3IEJ1dHRvbihjb25maWdTd2l0Y2hHcm91cCwgU1dULlJBRElPKTsKLQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLmFsd2F5c0J1dHRvbl90ZXh0KTsKLQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24gPSBuZXcgQnV0dG9uKGNvbmZpZ1N3aXRjaEdyb3VwLCBTV1QuUkFESU8pOwotCQljb25maWdTd2l0Y2hOZXZlckJ1dHRvbi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5uZXZlckJ1dHRvbl90ZXh0KTsKLQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uID0gbmV3IEJ1dHRvbihjb25maWdTd2l0Y2hHcm91cCwgU1dULlJBRElPKTsKLQkJY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnByb21wdEJ1dHRvbl90ZXh0KTsKLQotCQlzZXRTd2l0Y2hDb25maWdCdXR0b24oTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0U3dpdGNoQ29uZmlnKCkpOwotCi0JCS8vIGluaGVyaXQgc3VwcHJlc3Npb24gc3RhdGVzCi0JCUdyb3VwIHN1cHByZXNzaW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuU0hBRE9XX09VVCk7Ci0JCXN1cHByZXNzaW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlzdXBwcmVzc2lvbkdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzdXBwcmVzc2lvbkdyb3VwCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX3N1cHByZXNzaW9uR3JvdXBUaXRsZSk7IAotCi0JCWluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbiA9IG5ldyBCdXR0b24oc3VwcHJlc3Npb25Hcm91cCwgU1dULkNIRUNLKTsKLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvclByZWZlcmVuY2VQYWdlX2luaGVyaXRTdXBwcmVzc2lvblN0YXRlKTsgCi0KLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUpKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyBkYXRhIGZyb20gcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0RGF0YSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCVN0cmluZyBzdHIgPSBzdG9yZQotCQkJCS5nZXRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlCi0JCQkJCS5nZXREZWZhdWx0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKTsKLQkJfQotCQl3YnNDb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NFZGl0b3IudG9Db2x1bW5EZXNjcmlwdG9yTGlzdChzdHIpOwotCi0JCXN0ciA9IHN0b3JlLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJc3RyID0gc3RvcmUKLQkJCQkJLmdldERlZmF1bHRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMpOwotCQl9Ci0JCXRic0NvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0VkaXRvci50b0NvbHVtbkRlc2NyaXB0b3JMaXN0KHN0cik7Ci0KLQkJc3RyID0gc3RvcmUuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUyk7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJc3RyID0gc3RvcmUKLQkJCQkJLmdldERlZmF1bHRTdHJpbmcoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQkJfQotCQl3cGJzQ29sdW1uRGVzY3JpcHRvcnMgPSBQcm9jZXNzRWRpdG9yLnRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQotCQkvLyBsb2FkIGFuZCBzZXQgdG8gdGhlIGRlZmF1bHQgaWYgbm90aGluZyBpbiB0aGUgc3RvcmUKLQkJLy8gMTU0NzU4IC0gUHJvY2Vzc2VzOiBXQlMgaXMgYmxhbmsgYXMgZGVmYXVsdCBwcmVmZXJlbmNlIGlzIG5vdCBzZXQgZm9yIHRoZSBmaXJzdCB0aW1lCi0JCWlmICggd2JzQ29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpID09IDAgKSB7Ci0JCQl3YnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dCU19DT0xVTU5TKTsKLQkJCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TLAotCQkJCQl0b1N0cmluZyh3YnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQkKLQkJfQotCQkKLQkJaWYgKCB0YnNDb2x1bW5EZXNjcmlwdG9ycy5zaXplKCkgPT0gMCApIHsKLQkJCXRic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfVEJTX0NPTFVNTlMpOwotCQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMsCi0JCQkJCXRvU3RyaW5nKHRic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCX0KLQkJCi0JCWlmICggd3Bic0NvbHVtbkRlc2NyaXB0b3JzLnNpemUoKSA9PSAwICkgewotCQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzLmFkZEFsbChQcm9jZXNzRWRpdG9yLkRFRkFVTFRfV1BCU19DT0xVTU5TKTsKLQkJCXN0b3JlLnNldFZhbHVlKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUywKLQkJCQkJdG9TdHJpbmcod3Bic0NvbHVtbkRlc2NyaXB0b3JzKSk7Ci0JCX0KLQkJCi0JCWNvbHVtbkRlc2NyaXB0b3JMaXN0cyA9IG5ldyBMaXN0W10geyB3YnNDb2x1bW5EZXNjcmlwdG9ycywKLQkJCQl0YnNDb2x1bW5EZXNjcmlwdG9ycywgd3Bic0NvbHVtbkRlc2NyaXB0b3JzIH07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlLnBlcmZvcm1EZWZhdWx0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0KLQkJd2JzQ29sdW1uRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJd2JzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9XQlNfQ09MVU1OUyk7Ci0KLQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJdGJzQ29sdW1uRGVzY3JpcHRvcnMuYWRkQWxsKFByb2Nlc3NFZGl0b3IuREVGQVVMVF9UQlNfQ09MVU1OUyk7Ci0KLQkJd3Bic0NvbHVtbkRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCXdwYnNDb2x1bW5EZXNjcmlwdG9ycy5hZGRBbGwoUHJvY2Vzc0VkaXRvci5ERUZBVUxUX1dQQlNfQ09MVU1OUyk7Ci0KLQkJaW5oZXJpdFN1cHByZXNzaW9uQnV0dG9uCi0JCQkJLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCQkJLmdldERlZmF1bHRCb29sZWFuKAotCQkJCQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFKSk7Ci0KLQkJc2V0U3dpdGNoQ29uZmlnQnV0dG9uKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMsCi0JCQkJdG9TdHJpbmcod2JzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVEJTX0NPTFVNTlMsCi0JCQkJdG9TdHJpbmcodGJzQ29sdW1uRGVzY3JpcHRvcnMpKTsKLQkJc3RvcmUuc2V0VmFsdWUoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TLAotCQkJCXRvU3RyaW5nKHdwYnNDb2x1bW5EZXNjcmlwdG9ycykpOwotCQlzdG9yZS5zZXRWYWx1ZSgKLQkJCQlBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9JTkhFUklUX1NVUFBSRVNTSU9OX1NUQVRFLAotCQkJCWluaGVyaXRTdXBwcmVzc2lvbkJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCS8vIHN3aXRjaCBjb25maWcgcHJlZmVyZW5jZSBpcyBpbiBsaWJyYXJ5LnVpCi0JCUxpYnJhcnlVSVByZWZlcmVuY2VzLnNldFN3aXRjaENvbmZpZyhnZXRTd2l0Y2hDb25maWdWYWx1ZSgpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBnaXZlbiBsaXN0IGludG8gc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICogQHJldHVybiAKLQkgKiAJCQlTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhqYXZhLnV0aWwuTGlzdCBjb2x1bW5EZXNjcmlwdG9ycykgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gY29sdW1uRGVzY3JpcHRvcnMuc2l6ZSgpIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc3RyQnVmLmFwcGVuZCgoKENvbHVtbkRlc2NyaXB0b3IpIGNvbHVtbkRlc2NyaXB0b3JzLmdldChpKSkuaWQpCi0JCQkJCS5hcHBlbmQoJywnKTsKLQkJfQotCQlzdHJCdWYuYXBwZW5kKCgoQ29sdW1uRGVzY3JpcHRvcikgY29sdW1uRGVzY3JpcHRvcnMuZ2V0KG1heCkpLmlkKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KE1vZGlmeUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN3aXRjaENvbmZpZ1ZhbHVlKCkgewotCQlpZiAoY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUzsKLQkJaWYgKGNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSOwotCQlpZiAoY29uZmlnU3dpdGNoUHJvbXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVDsKLQotCQkvLyByZXR1cm4gUHJvbXB0IHZhbHVlIGFzIGEgZGVmYXVsdAotCQlyZXR1cm4gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTd2l0Y2hDb25maWdCdXR0b24oU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVMuZXF1YWxzKHZhbHVlKSkgewotCQkJY29uZmlnU3dpdGNoQWx3YXlzQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQljb25maWdTd2l0Y2hQcm9tcHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfSBlbHNlIGlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUi5lcXVhbHModmFsdWUpKSB7Ci0JCQljb25maWdTd2l0Y2hBbHdheXNCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaE5ldmVyQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgeyAvLyBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQKLQkJCWNvbmZpZ1N3aXRjaEFsd2F5c0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJY29uZmlnU3dpdGNoTmV2ZXJCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWNvbmZpZ1N3aXRjaFByb21wdEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQkKLQkJLy8gY2hhbmdlIHRvIHVzZSBMaWJyYXJ5UGx1Z2luIHN0b3JlCi0JCS8vIHdlIG5lZWQgdG8gc2hhcmUgdGhlIHByZWZlcmVuY2UgaW4gTGlicmFyeSBicm93c2luZyBhbmQgcHVibGlzaGluZwotCQkvLyBKaW5odWEgWGkgMDgvMTkvMjAwNgotCQkvLyBjaGFuZ2VkIHRvIHVzZSBDb21tb25VSVBsdWdpbiBzdG9yZQotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB3cmFwcGVyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmICggd3JhcHBlciBpbnN0YW5jZW9mIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKXdyYXBwZXIpLmdldFN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Sb290UHJlZlBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWRlMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9Sb290UHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkNvbW1vblVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBSb290IHByZWZlcmVuY2UgcGFnZQotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvb3RQcmVmUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZV90YWI7Ci0KLQkvLyBwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gRGlzYWJsZWluZyBlbmFibGUgcHJvY2VzcyBjb250cmlidXRpb24gcHJlZmVyZW5jZSBmb3Igbm93LgotCS8vIHByaXZhdGUgQnV0dG9uIGVuYWJsZVByb2Nlc3NDb250cmlidXRpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBjb21wb3NpdGVfdGFiIDw8IHBhcmVudAotCQljb21wb3NpdGVfdGFiID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlX3RhYiwgU1dULkNIRUNLKTsKLQkJLy8gZW5hYmxlUHJvY2Vzc0NvbnRyaWJ1dGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmdldFN0cmluZygiQXV0aG9yaW5nVUkuUm9vdFByZWZQYWdlLmVuYWJsZXByb2Nlc3Njb250cmlidXRpb24udGV4dCIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQkvLyBmb250ID0gbnVsbDsKLQkJcmV0dXJuIGNvbXBvc2l0ZV90YWI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJLy8gdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB3cmFwcGVyID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmICggd3JhcHBlciBpbnN0YW5jZW9mIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgKSB7Ci0JCQlyZXR1cm4gKChQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKXdyYXBwZXIpLmdldFN0b3JlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLy8gcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHNwYW4pIHsKLQkvLyBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkvLyBsYWJlbC5zZXRUZXh0KHRleHQpOwotCS8vIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkvLyBkYXRhLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkvLyBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCS8vIGxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JLy8gcmV0dXJuIGxhYmVsOwotCS8vIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiNTM5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWJzdHJhY3RTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWJzdHJhY3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjdlMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Fic3RyYWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEuYmVhbnMuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnZpZXcuVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGEgc2VjdGlvbiBpbiBhIHRhYiBpbiB0aGUgcHJvcGVydGllcyB2aWV3LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24gaW1wbGVtZW50cwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlOwotCi0JcHJvdGVjdGVkIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbmV3IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFNlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBmb3IgY3VycmVudCBzZWxlY3Rpb24gb2YgTWV0aG9kQ29uZmlndXJhdGlvbgotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGdldCBsb2dnZXIKLQkJbG9nZ2VyID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcCwgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhjb21wLCBwYWdlKTsKLQkJdGhpcy5wYWdlID0gcGFnZTsKLQl9Ci0KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCQlzd2l0Y2ggKG9wdGlvbikgewotCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VEOiB7Ci0JCQkJc2VjdGlvblJlZnJlc2goKTsKLQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHNlY3Rpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VjdGlvblJlZnJlc2goKSB7Ci0JCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCVRhYiB0YWIgPSBwYWdlLmdldEN1cnJlbnRUYWIoKTsKLQkJCWlmICh0YWIgIT0gbnVsbCkgewotCQkJCUlTZWN0aW9uIHNlY3Rpb24gPSB0YWIuZ2V0U2VjdGlvbkF0SW5kZXgoMCk7Ci0KLQkJCQlpZiAoKHNlY3Rpb24gIT0gbnVsbCkKLQkJCQkJCSYmIChzZWN0aW9uIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uKSkgewotCQkJCQlzZWN0aW9uLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGxpYnJhcnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJyYXJ5TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3NldElucHV0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2V0SW5wdXQocGFydCwgc2VsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZXRJbnB1dDo6c2VsZWN0aW9uIC0gIitzZWxlY3Rpb24pOwotCQlBc3NlcnQuaXNUcnVlKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJT2JqZWN0IGlucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlpbml0RWxlbWVudERhdGEoaW5wdXQpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRFbGVtZW50RGF0YShPYmplY3QgaW5wdXQpIHsKLQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaW5wdXQ7Ci0JCQlpZiAoVG5nVXRpbC5pc0xvY2tlZCh0aGlzLmVsZW1lbnQpKQotCQkJCXRoaXMuZWRpdGFibGUgPSBmYWxzZTsKLQkJCWVsc2UgewotCQkJCXRoaXMuZWRpdGFibGUgPSB0cnVlOwotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkKLQkJCQkJCXRoaXMuZWRpdGFibGUgPSBmYWxzZTsKLQkJCQkJZWxzZQotCQkJCQkJdGhpcy5lZGl0YWJsZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXRoaXMuZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAoaW5wdXQpOwotCQkJdGhpcy5lZGl0YWJsZSA9IGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGZpcnN0IGVsZW1lbnQgZnJvbSBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHByb2Nlc3MgZWRpdG9yCi0JICogCi0JICogQHJldHVybgotCSAqIAkJcHJvY2VzcyBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VkaXRvciBnZXRFZGl0b3IoKSB7Ci0JCXJldHVybiBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRFZGl0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gSXRlbVByb3ZpZGVyCi0JICogCi0JICogQHJldHVybgotCSAqIAkJCWFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlciBnZXRBZGFwdGVyKCkgewotCQl0cnkgewotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoCi0JCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gQWRhcHRlciBmYWN0b3J5Ci0JICogCi0JICogQHJldHVybgotCSAqIAkJCWFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZQotCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQuCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJnZXRFbGVtZW50OjpzZWxlY3Rpb24gLSAiK3NlbGVjdGlvbik7Ci0JCQl0cnkgewotCQkJCWluaXRFbGVtZW50RGF0YShpbnB1dCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkiRXJyb3IgZ2V0dGluZyBlbGVtZW50IGZyb20gdGhlIHNlbGVjdGlvbiAiICsgZWxlbWVudCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCXByb3BlcnR5IHNoZWV0IHBhZ2UKLQkgKi8KLQlwdWJsaWMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZ2V0UHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnBhZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmJlYW5zLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvZXBydHlDaGFuZ2VFdmVudCIgKyBldnQpOwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGZpbHRlciBsaXN0IG9mIGVsZW1lbnRzLiBGaWx0ZXIgaXMgYmFzZWQgb24gY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBsaXN0Ci0JICogCQkJT3JpZ2luYWwgbGlzdAotCSAqIEByZXR1cm4KLQkgKiAJCQlmaWx0ZXJlZCBsaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsdGVyZWRMaXN0KExpc3QgbGlzdCkgewotCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oTGlicmFyeVNlcnZpY2UKLQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCWlmIChjb25maWd1cmF0b3IuYWNjZXB0KG9iaikpIHsKLQkJCQkJbmV3TGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIAotCSAqIAkJCWRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdldEFkYXB0ZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJcGFyZW50ID0gYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgcGFyZW50KQotCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCXJldHVybiBjb25maWc7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKCJBYnN0cmFjdFNlY3Rpb246OmdldERlZmF1bHRDb25maWd1cmF0aW9uIC0gSUJTSXRlbVByb3ZpZGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCQljdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJLy8gaWYgY29uZmlndXJhdGlvbiBpcyBub3Qgc2VsZWN0ZWQsIHVzZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJCXJldHVybiBnZXREZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQotCS8vIHB1YmxpYyB2b2lkIHVwZGF0ZVRpdGxlKE9iamVjdCBvYmopCi0JLy8gewotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZVByZWZpeCgpICsgKChCcmVha2Rvd25FbGVtZW50KW9iaikuZ2V0TmFtZSgpOwotCS8vIFRhYmJlZFByb3BlcnR5Q29tcG9zaXRlIGNvbXAgPSAoVGFiYmVkUHJvcGVydHlDb21wb3NpdGUpCi0JLy8gcGFnZS5nZXRDb250cm9sKCk7Ci0JLy8gVGFiYmVkUHJvcGVydHlUaXRsZSB0aXRsZSA9IGNvbXAuZ2V0VGl0bGUoKTsKLQkvLyBpZiAodGl0bGVJbWFnZSA9PSBudWxsKQotCS8vIHsKLQkvLyB0aXRsZUltYWdlID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpOwotCS8vIH0KLQkvLyB0aXRsZS5zZXRUaXRsZShuYW1lLCB0aXRsZUltYWdlKTsKLQkvLyB9Ci0JCi0JCi0JCi0JLyoqCi0JICogR2V0IG5hbWUgcHJlZml4IGZvciB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuICJQcm9jZXNzRWxlbWVudDogIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eURvY3VtZW50U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5RG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmQ4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5RG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYmJlZFByb3BlcnR5Q29tcG9zaXRlOwotCi0KLS8qKgotICogVGhlIGRvY3VtZW50IHRhYiBmb3IgQWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBBY3Rpdml0eSBlbGVtZW50OwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBtYWluRGVzY1RleHQ7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIG1haW5EZXNjQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBwdXJwb3NlVGV4dDsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgcHVycG9zZUNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHQgYWx0ZXJuYXRpdmVzVGV4dDsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgYWx0ZXJuYXRpdmVzQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIElNZXRob2RSaWNoVGV4dCBob3dUb1N0YWZmVGV4dDsKLQkKLQlwcm90ZWN0ZWQgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgaG93VG9TdGFmZkNvbnRhaW5lcjsKLQotCXByaXZhdGUgTGlzdGVuZXIgcHVycG9zZUxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogcHVycG9zZVRleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UHVycG9zZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXB1cnBvc2VUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBtYWluRGVzY0xpc3RlbmVyID0gbmV3IExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogbWFpbkRlc2NUZXh0OwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCW1haW5EZXNjVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCksIG5ld0NvbnRlbnQsCi0JCQkJCQktMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBhbHRlcm5hdGl2ZXNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IGFsdGVybmF0aXZlc1RleHQ7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChBY3Rpdml0eURlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJYWx0ZXJuYXRpdmVzVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCBuZXdDb250ZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBob3dUb1N0YWZmTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQkJCUlNZXRob2RSaWNoVGV4dCBjb250cm9sID0gZXhwYW5kRmxhZyA/IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJOiBob3dUb1N0YWZmVGV4dDsKLQkJCWlmICghY29udHJvbC5nZXRNb2RpZmllZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG9sZENvbnRlbnQgPSAoKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRIb3d0b1N0YWZmKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJaG93VG9TdGFmZlRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCksIG5ld0NvbnRlbnQsIC0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jY3JlYXRlRG9jdW1lbnRTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb2N1bWVudFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgbWFpbkRlc2NoZWlnaHRIaW50ID0gMTAwOwotCi0JCXN1cGVyLmNyZWF0ZURvY3VtZW50U2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIG1haW4gZGVzY3JpcHRpb24KLQkJbWFpbkRlc2NDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBtYWluRGVzY2hlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIobWFpbkRlc2NDb250YWluZXIubGluayk7Ci0JCW1haW5EZXNjVGV4dCA9IG1haW5EZXNjQ29udGFpbmVyLnJpY2hUZXh0OwotCi0JCS8vIHB1cnBvc2UKLQkJcHVycG9zZUNvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHVycG9zZSk7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKHB1cnBvc2VDb250YWluZXIubGluayk7Ci0JCXB1cnBvc2VUZXh0ID0gcHVycG9zZUNvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBjcmVhdGUgYWx0ZXJuYXRpdmVzCi0JCWFsdGVybmF0aXZlc0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2FsdGVybmF0aXZlcyk7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKGFsdGVybmF0aXZlc0NvbnRhaW5lci5saW5rKTsKLQkJYWx0ZXJuYXRpdmVzVGV4dCA9IGFsdGVybmF0aXZlc0NvbnRhaW5lci5yaWNoVGV4dDsKLQkJCi0JCS8vIGNyZWF0ZSBob3d0b1N0YWZmCi0JCWhvd1RvU3RhZmZDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9ob3dUb1N0YWZmKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIoaG93VG9TdGFmZkNvbnRhaW5lci5saW5rKTsKLQkJaG93VG9TdGFmZlRleHQgPSBob3dUb1N0YWZmQ29udGFpbmVyLnJpY2hUZXh0OwotCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJCi0JCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCi0JCXB1cnBvc2VUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCXB1cnBvc2VUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwdXJwb3NlTGlzdGVuZXIpOwotCQkKLQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQltYWluRGVzY1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCW1haW5EZXNjVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbWFpbkRlc2NMaXN0ZW5lcik7Ci0JCQkJCi0JCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3QoZWxlbWVudCk7Ci0JCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkpOwotCQlhbHRlcm5hdGl2ZXNUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBhbHRlcm5hdGl2ZXNMaXN0ZW5lcik7Ci0JCQotCQlob3dUb1N0YWZmVGV4dC5zZXRNb2RhbE9iamVjdChlbGVtZW50KTsKLQkJaG93VG9TdGFmZlRleHQuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpKTsKLQkJaG93VG9TdGFmZlRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGhvd1RvU3RhZmZMaXN0ZW5lcik7Ci0JfQotCQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJcHVycG9zZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQltYWluRGVzY1RleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlhbHRlcm5hdGl2ZXNUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJaG93VG9TdGFmZlRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkvLyBoaWRlIGZpZWxkcyBmb3IgdG9wLWxldmVsIHByb2Nlc3NlczoKLQkJaWYgKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2VzcyhlbGVtZW50KSkgewotCQkJYnJpZWZEZXNjTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlicmllZkRlc2NUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCQkJZXh0ZXJuYWxJRExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJZXh0ZXJuYWxJRFRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCW1haW5EZXNjQ29udGFpbmVyLnNldFZpc2libGUoZmFsc2UpOwotCQkJcHVycG9zZUNvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWFsdGVybmF0aXZlc0NvbnRhaW5lci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWhvd1RvU3RhZmZDb250YWluZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkKLQkJCS8vIG1vdmUgdXNhZ2UgZ3VpZGFuY2UgdG8gYmUgcmlnaHQgYWZ0ZXIgcHJlZml4IGZpZWxkCi0JCQl1c2FnZUd1aWRhbmNlQ29udGFpbmVyLm1vdmVCZWxvdyhwcmVmaXhUZXh0KTsKLQkJCQotCQl9IGVsc2UgewotCQkJYnJpZWZEZXNjTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWJyaWVmRGVzY1RleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWV4dGVybmFsSURMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJZXh0ZXJuYWxJRFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWtleUNvbnNpZGVyYXRpb25zQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQltYWluRGVzY0NvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQkJcHVycG9zZUNvbnRhaW5lci5zZXRWaXNpYmxlKHRydWUpOwotCQkJYWx0ZXJuYXRpdmVzQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlob3dUb1N0YWZmQ29udGFpbmVyLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkvLyBtb3ZlIHVzYWdlIGd1aWRhbmNlIHRvIGJlIHJpZ2h0IGFmdGVyIGV4dGVybmFsSUQgZmllbGQKLQkJCXVzYWdlR3VpZGFuY2VDb250YWluZXIubW92ZUJlbG93KGV4dGVybmFsSURUZXh0KTsKLQkJfQotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCQkvLyBtYWtlIHBhcmVudCBiZSB0b3RhbGx5IHJlcGFpbnRlZAotCQlwYXJlbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JCQkJQWN0aXZpdHlEZXNjcmlwdGlvbiBjb250ZW50ID0gKEFjdGl2aXR5RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQltYWluRGVzY1RleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJcHVycG9zZVRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJYWx0ZXJuYXRpdmVzVGV4dAotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlob3dUb1N0YWZmVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCX0KLQkJCQkKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCW1haW5EZXNjVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCXB1cnBvc2VUZXh0LnNldFRleHQoY29udGVudC5nZXRQdXJwb3NlKCkpOwotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0VGV4dChjb250ZW50LmdldEFsdGVybmF0aXZlcygpKTsKLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRUZXh0KGNvbnRlbnQuZ2V0SG93dG9TdGFmZigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbikpIHsgCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0KLQkJCQkJfSBlbHNlIGlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3B1cnBvc2UpKSB7IAotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRUZXh0KGNvbnRlbnQuZ2V0UHVycG9zZSgpKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkpOwotCQkJCQl9IGVsc2UgaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X2FsdGVybmF0aXZlcykpIHsgCi0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0QWx0ZXJuYXRpdmVzKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQKLQkJCQkJCQkJLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJCQkJfSBlbHNlIGlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKS5lcXVhbHMoCi0JCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9ob3dUb1N0YWZmKSkgeyAKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50LmdldEhvd3RvU3RhZmYoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQltYWluRGVzY1RleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJbWFpbkRlc2NUZXh0LnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJbWFpbkRlc2NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlwdXJwb3NlVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSk7Ci0JCQkJcHVycG9zZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCWFsdGVybmF0aXZlc1RleHQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJYWx0ZXJuYXRpdmVzVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpKTsKLQkJCQlhbHRlcm5hdGl2ZXNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlob3dUb1N0YWZmVGV4dC5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSk7Ci0JCQkJaG93VG9TdGFmZlRleHQuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IGRvY3VtZW50YXRpb24gc2VjdGlvbiA6IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R2VuZXJhbFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjOTY2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5BY3Rpdml0eVZhcmlhYmlsaXR5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuUHJvY2Vzc1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5TaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5Db252ZXJ0QWN0aXZpdHlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIEFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUdlbmVyYWxTZWN0aW9uIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiB7Ci0JcHJvdGVjdGVkIEFjdGl2aXR5IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0FQUExJQ0FCTEVfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5vdEFwcGxpY2FibGVfdGV4dDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVURVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvbnRyaWJ1dGVzX3RleHQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORFNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmV4dGVuZHNfdGV4dDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRVNfVEVYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlcGxhY2VzX3RleHQ7IAotCi0JcHJpdmF0ZSBUZXh0IG1vZGVsSW5mb1RleHQ7Ci0KLQlwcml2YXRlIExhYmVsIGFjdGl2aXR5VHlwZUxhYmVsOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdHlwZV90ZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF90eXBlX2J1dHRvbjsKLQotCXByaXZhdGUgQ29tYm8gY3RybF92YXJpYWJpbGl0eTsKLQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgdmlld2VyX3ZhcmlhYmlsaXR5OwotCi0JcHJpdmF0ZSBUZXh0IGJhc2VUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QnV0dG9uOwotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIHZhcmlhYmlsaXR5TGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJPYmplY3QgPSAoVmFyaWFiaWxpdHlUeXBlKSBvYmplY3Q7Ci0JCQlpZiAodmFyT2JqZWN0ID09IFZhcmlhYmlsaXR5VHlwZS5OQSkKLQkJCQlyZXR1cm4gTk9UX0FQUExJQ0FCTEVfVEVYVDsKLQkJCWlmICh2YXJPYmplY3QgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKQotCQkJCXJldHVybiBDT05UUklCVVRFU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykKLQkJCQlyZXR1cm4gRVhURU5EU19URVhUOwotCQkJaWYgKHZhck9iamVjdCA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpCi0JCQkJcmV0dXJuIFJFUExBQ0VTX1RFWFQ7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgdmFyaWFiaWxpdHlDb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3QgdmFyaWFiaWxpdHlUeXBlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl2YXJpYWJpbGl0eVR5cGVzTGlzdC5hZGQoVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQkJdmFyaWFiaWxpdHlUeXBlc0xpc3QuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJCXZhcmlhYmlsaXR5VHlwZXNMaXN0LmFkZChWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZXNMaXN0LnRvQXJyYXkoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJLy8gZ2V0IGFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIE1vZGVsIEluZm8KLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Nb2RlbEluZm8pOyAKLQotCQltb2RlbEluZm9UZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCQltb2RlbEluZm9UZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQltb2RlbEluZm9UZXh0LnNldFRleHQoZ2V0TW9kZWxJbmZvKCkpOwotCi0JCS8vIFR5cGUgb2YgYW4gQWN0aXZpdHkKLQkJYWN0aXZpdHlUeXBlTGFiZWwgPSBGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1R5cGUpOwotCQkKLQkJY3RybF90eXBlX3RleHQgPSB0b29sa2l0LmNyZWF0ZVRleHQoZ2VuZXJhbENvbXBvc2l0ZSwgIiIsIFNXVC5SRUFEX09OTFkpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQljdHJsX3R5cGVfdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQljdHJsX3R5cGVfYnV0dG9uID0gdG9vbGtpdC5jcmVhdGVCdXR0b24oZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlBdXRob3JpbmdVSVRleHQuQ0hBTkdFX1RZUEVfQlVUVE9OX1RFWFQsIFNXVC5QVVNIKTsKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWN0cmxfdHlwZV9idXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJaWYgKENvbnZlcnRBY3Rpdml0eURpYWxvZy5nZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMoZWxlbWVudCkgPT0gbnVsbCkgewotCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfQotCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBWYXJpYWJpbGl0eSBUeXBlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5WQVJJQUJJTElUWV9UWVBFX1RFWFQpOwotCi0JCWN0cmxfdmFyaWFiaWxpdHkgPSBGb3JtVUkuY3JlYXRlQ29tYm8odG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgMik7Ci0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQljdHJsX3ZhcmlhYmlsaXR5LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0KLQkJdmlld2VyX3ZhcmlhYmlsaXR5ID0gbmV3IENvbWJvVmlld2VyKGN0cmxfdmFyaWFiaWxpdHkpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxKSk7Ci0JCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRDb250ZW50UHJvdmlkZXIodmFyaWFiaWxpdHlDb250ZW50UHJvdmlkZXIpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0TGFiZWxQcm92aWRlcih2YXJpYWJpbGl0eUxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJTGFiZWwgYmxhbmtMYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWJsYW5rTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQkvLyBCYXNlIGVsZW1lbnRzCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CQVNFX0VMRU1FTlRfVEVYVCk7Ci0KLQkJYmFzZVRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlKTsKLQkJewotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJCXwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWJhc2VUZXh0LnNldExheW91dERhdGEoZ2QpOwotCQl9Ci0JCWJhc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCS8vIEJ1dHRvbiB0byBzZWxlY3QKLQkJc2VsZWN0QnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5TRUxFQ1RfQlVUVE9OX1RFWFQpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8QWJzdHJhY3REaWFncmFtRWRpdG9yPiBnZXREaXJ0eURpYWdyYW1FZGl0b3JzKCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZmVyZW5jZXMgPSB3b3JrYmVuY2hQYWdlCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7IAotCQlBcnJheUxpc3Q8QWJzdHJhY3REaWFncmFtRWRpdG9yPiBkaXJ0eUVkaXRvcnMgPSBuZXcgQXJyYXlMaXN0PEFic3RyYWN0RGlhZ3JhbUVkaXRvcj4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJSUVkaXRvcklucHV0IGlucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgJiYgcHJvY2VzcyA9PSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpZWxlbWVudCkpIHsKLQkJCQkJCQlkaXJ0eUVkaXRvcnMuYWRkKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIGVkaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpcnR5RWRpdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQkJY3RybF90eXBlX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlmaW5hbCBQcm9jZXNzRWRpdG9yIGVkaXRvciA9IChQcm9jZXNzRWRpdG9yKSBnZXRFZGl0b3IoKTsKLQkJCQkvLyBhbGxvdyBjaGFuZ2luZyB0eXBlIG9ubHkgaWYgdGhlIHByb2Nlc3MgZWRpdG9yIGFuZCBhbGwgb2YgaXRzIGRpYWdyYW0gZWRpdG9ycyBhcmUgbm90IGRpcnR5Ci0JCQkJLy8KLQkJCQlpZiAoZWRpdG9yLmlzRGlydHkoKSB8fCAhZ2V0RGlydHlEaWFncmFtRWRpdG9ycygpLmlzRW1wdHkoKSkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5jaGFuZ2VBY3Rpdml0eVR5cGVXYXJuaW5nRGlhbG9nX3RpdGxlOyAKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblRhYkd1aWRhbmNlV2FybmluZ0RpYWxvZ19tZXNzYWdlMTsgCi0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5V2FybmluZyh0aXRsZSwgbWVzc2FnZSk7Ci0JCQkJfSBlbHNlICB7Ci0JCQkJCW5hbWVUZXh0LnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCW5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwKLQkJCQkJCQlwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQotCQkJCQlBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IENvbnZlcnRBY3Rpdml0eURpYWxvZwotCQkJCQkucXVlcnlVc2VyQW5kQ29udmVydCgoQWN0aXZpdHkpIGVsZW1lbnQsIG51bGwsIG51bGwpOwotCQkJCQkKLQkJCQkJaWYgKG5ld0FjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQluZXdBY3Rpdml0eSk7Ci0JCQkJCQkvLyBkZWFsIHdpdGggcHJvcGVydHkgc2hlZXQgZGlyZWN0bHkuCi0JCQkJCQlnZXRQcm9wZXJ0eVNoZWV0UGFnZSgpLnNlbGVjdGlvbkNoYW5nZWQoZ2V0UGFydCgpLAotCQkJCQkJCQlzZWwpOwotCQkJCQkJLy8gZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCQkoKFByb2Nlc3NWaWV3ZXIpICgoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBnZXRFZGl0b3IoKQotCQkJCQkJCQkuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCkpLmdldFZpZXdlcigpKQotCQkJCQkJCQkuZXhwYW5kVG9MZXZlbChuZXdBY3Rpdml0eSwgMyk7Ci0JCQkJCX0KLQkJCQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQkJbmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVEZWFjdGl2YXRlTGlzdGVuZXIpOwotCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkvLyByZWZyZXNoIGFueSBkaXJ0eSBkaWFncmFtIGVkaXRvciBhbmQgY2xlYXIgdGhlIGRpcnR5IGZsYWcKLQkJCQkJCQkvLwotCQkJCQkJCUxpc3Q8QWJzdHJhY3REaWFncmFtRWRpdG9yPiBkaXJ0eURpYWdyYW1FZGl0b3JzID0gZ2V0RGlydHlEaWFncmFtRWRpdG9ycygpOwotCQkJCQkJCWZvciAoQWJzdHJhY3REaWFncmFtRWRpdG9yIGRpYWdyYW1FZGl0b3IgOiBkaXJ0eURpYWdyYW1FZGl0b3JzKSB7Ci0JCQkJCQkJCWRpYWdyYW1FZGl0b3IucmVmcmVzaCgpOwotCQkJCQkJCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9IGRpYWdyYW1FZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJCQkJCQlpZihkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcilkb2NQcm92aWRlcikubWFya0RvY3VtZW50QXNTYXZlZCgoSUZpbGVFZGl0b3JJbnB1dCkgZGlhZ3JhbUVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCQkJfQkJCQotCQkJCQkJCX0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQljdHJsX3ZhcmlhYmlsaXR5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl92YXJpYWJpbGl0eQotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSAoVmFyaWFiaWxpdHlUeXBlKSBzZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJCWlmICh2ZSAhPSBudWxsICYgdmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJCWlmKHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKQotLy8JCQkJCQkJJiYgdmUgaW5zdGFuY2VvZiBQcm9jZXNzKXsKLS8vCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcwotLy8JCQkJCQkuYmluZCgKLS8vCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotLy8JCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCVZhcmlhYmlsaXR5VHlwZSB2dHlwZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0vLwkJCQkJCWlmKHZ0eXBlICE9IG51bGwpewotLy8JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odnR5cGUpOwotLy8JCQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihzZWwpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCXJldHVybjsKLS8vCQkJCQl9Ci0vLwkJCQkJaWYgKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcigoQWN0aXZpdHkpIHZlKQotLy8JCQkJCQkJJiYgdHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfTElURVJBTCkpIHsKLS8vCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksCi0vLwkJCQkJCQkJKChBY3Rpdml0eSkgdmUpLmdldE5hbWUoKSB9OwotLy8JCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0vLwkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCVZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBlbGVtZW50Ci0vLwkJCQkJCQkJLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotLy8JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotLy8JCQkJCQkJCXZhcmlhYmlsaXR5VHlwZSk7Ci0vLwkJCQkJCXZpZXdlcl92YXJpYWJpbGl0eS5zZXRTZWxlY3Rpb24oCi0vLwkJCQkJCQkJbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24sIHRydWUpOwotLy8KLS8vCQkJCQkJcmV0dXJuOwotLy8JCQkJCX0KLQkJCQkJCi0JCQkJCWlmKHR5cGUgIT0gVmFyaWFiaWxpdHlUeXBlLk5BKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXRlID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihlbGVtZW50LCAoQWN0aXZpdHkpIHZlLCB0eXBlKTsKLQkJCQkJCWlmKCFzdGF0ZS5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCBzdGF0ZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQotCQkJCQkJCS8vIHNldCB2YXJpYWJpbGl0eSB0byBiYWNrIHdoYXRldmVyIGl0IHdhcyBmb3IgVUkKLQkJCQkJCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQkJdmFyaWFiaWxpdHlUeXBlKTsKLQkJCQkJCQl2aWV3ZXJfdmFyaWFiaWxpdHkuc2V0U2VsZWN0aW9uKG5ld1ZhcmlhYmlsaXR5U2VsZWN0aW9uLCB0cnVlKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpLAotCQkJCQkJCXR5cGUsIC0xKTsKLQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCWlmIChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJCQkJCXx8IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmICh0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuTkEpKQotCQkJCQkJCQllbGVtZW50LnNldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJCQkJfHwgZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAodHlwZS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKQotCQkJCQkJCQl8fCB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpCi0JCQkJCQkJCXx8IHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5OQSkpCi0JCQkJCQkJZWxlbWVudC5zZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJCQlpZiAodmUgIT0gbnVsbCkgewotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwKLQkJCQkJCQkJCQludWxsLCAtMSk7Ci0KLQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJYmFzZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlMaXN0IHNlbGVjdGlvbkJhc2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGVsZW1lbnQKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlzZWxlY3Rpb25CYXNlTGlzdC5hZGQoYmFzZSk7Ci0JCQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJfQotCQkJCS8vIHNldEZvcm1UZXh0V2l0aFZhcmlhYmxlSW5mbygpOwotCQkJfQotCQl9KTsKLQotCQlzZWxlY3RCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDb25maWd1cmF0aW9uKCk7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuQUNUSVZJVElFUzsKLQotCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gKFZhcmlhYmlsaXR5VHlwZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5Ci0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgQWN0aXZpdHlWYXJpYWJpbGl0eUZpbHRlcihjb25maWcsIG51bGwsCi0JCQkJCQl0YWJOYW1lLCBlbGVtZW50KTsKLQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCB0YWJOYW1lLCBudWxsLCBjb25maWcpOwotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZSh0YWJOYW1lKTsKLQkJCQlmZC5vcGVuKCk7Ci0KLQkJCQlMaXN0IHNlbGVjdGVkSXRlbXMgPSBmZC5nZXRTZWxlY3RlZEl0ZW1zKCk7Ci0KLQkJCQlpZiAoc2VsZWN0ZWRJdGVtcyAhPSBudWxsICYmICFzZWxlY3RlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3QgbyA9IHNlbGVjdGVkSXRlbXMuZ2V0KDApOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgbzsKLS8vCQkJCQkJaWYgKGlzRGlyZWN0UGFyZW50KGFjdCkKLS8vCQkJCQkJCQl8fCAoKGFjdCBpbnN0YW5jZW9mIFByb2Nlc3MpICYmIHR5cGUuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKQotLy8JCQkJCQkJCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykpKSAKLS8vCQkJCQkJewotLy8JCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMSwKLS8vCQkJCQkJCQkJCQlhcmdzKTsKLS8vCi0vLwkJCQkJCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl90aXRsZTsKLS8vCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkJCQkJCQlyZXR1cm47Ci0vLwkJCQkJCX0KLS8vCQkJCQkJaWYgKGlzQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCkpIHsKLS8vCQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpLCBhY3QuZ2V0TmFtZSgpIH07Ci0vLwkJCQkJCQlTdHJpbmcgbWVzc2FnZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0vLwkJCQkJCQkJCS5iaW5kKAotLy8JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0vLwkJCQkJCQkJCQkJYXJncyk7Ci0vLwotLy8JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0vLwkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLS8vCQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgIiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkJCQkJcmV0dXJuOwotLy8JCQkJCQl9Ci0vLwkJCQkJCS8vIGJsb2NrIGZvciBjaGlsZHJlbgotLy8JCQkJCQlpZiAoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdCkKLS8vCQkJCQkJCQkmJiB0eXBlLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19MSVRFUkFMKSkgewotLy8JCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudC5nZXROYW1lKCksIGFjdC5nZXROYW1lKCkgfTsKLS8vCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMKLS8vCQkJCQkJCQkJLmJpbmQoCi0vLwkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotLy8JCQkJCQkJCQkJCWFyZ3MpOwotLy8KLS8vCQkJCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX3RpdGxlOwotLy8JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0vLwkJCQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1lc3NhZ2UsICIiKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCQkJCXJldHVybjsKLS8vCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5QWZ0ZXJGaWx0ZXJTZWxlY3Rpb24oZWxlbWVudCwgKEFjdGl2aXR5KSBvLCB0eXBlKTsKLQkJCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfdGl0bGU7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwgc3RhdHVzLmdldE1lc3NhZ2UoKSk7CQkJCQkJCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvOwotCi0JCQkJCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IG5ldyBQcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IoCi0JCQkJCQkJCWdldERlZmF1bHRDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJQWN0aXZpdHlWYXJpYWJpbGl0eUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kKAotCQkJCQkJCQllbGVtZW50LCB2ZSwgdHlwZSwgY29uZmlndXJhdG9yKTsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0KLQkJCQkJCWJhc2VUZXh0LnNldFRleHQoVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKHZlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JLyoqCi0JICogR2V0IG1vZGVsIGluZm9ybWF0aW9uIGZvciB0aGUgYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICogCQkJbW9kZWwgaW5mbyBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNb2RlbEluZm8oKSB7Ci0JCVN0cmluZyBpbmZvID0gbnVsbDsKLQotCQl0cnkgewotCQkJT2JqZWN0IG8gPSBnZXRBZGFwdGVyKCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgbzsKLQkJCQlpbmZvID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoZWxlbWVudCwKLQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBwcmludCBleGNlcHRpb24KLQkJfQotCQlpZiAoIShTdHJVdGlsLmlzQmxhbmsoaW5mbykpKQotCQkJcmV0dXJuIGluZm87Ci0JCWVsc2UKLQkJCXJldHVybiBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCi0JCWN0cmxfdHlwZV9idXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWN0cmxfdmFyaWFiaWxpdHkuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyX3ZhcmlhYmlsaXR5LmdldFNlbGVjdGlvbigpKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTkEpIHsKLQkJCXNlbGVjdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCi0JCQkJbW9kZWxJbmZvVGV4dC5zZXRUZXh0KGdldE1vZGVsSW5mbygpKTsKLQotCQkJCWN0cmxfdHlwZV90ZXh0LnNldFRleHQoUHJvcGVydGllc1V0aWwuZ2V0VHlwZShlbGVtZW50KSk7Ci0KLQkJCQkvLyBoaWRlL3Nob3cgY29tYm8KLQkJCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpCi0JCQkJCQkmJiAoZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsIHx8IGVsZW1lbnQKLQkJCQkJCQkJLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpKSB7Ci0JCQkJCWFjdGl2aXR5VHlwZUxhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJCQljdHJsX3R5cGVfdGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJY3RybF90eXBlX2J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhY3Rpdml0eVR5cGVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQljdHJsX3R5cGVfdGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQljdHJsX3R5cGVfYnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gbmV3VmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCXZhcmlhYmlsaXR5VHlwZSk7Ci0JCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihuZXdWYXJpYWJpbGl0eVNlbGVjdGlvbiwgdHJ1ZSk7Ci0KLQkJCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkKLQkJCQkJYmFzZVRleHQuc2V0VGV4dChUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbWVudAotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKTsKLQkJCQllbHNlCi0JCQkJCWJhc2VUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJLy8gbWFrZSB2YXJpYWJpbGl0eSB0eXBlIGNvbWJvIGRpc2FibGVkIGluY2FzZSB0eXBlIGlzIGVpdGhlciBsb2NhbCBjb250cmlidXRlcyBvciBsb2NhbCByZXBsYWNlcy4KLQkJCQlpZiAodmFyaWFiaWxpdHlUeXBlCi0JCQkJCQkuZXF1YWxzKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pCi0JCQkJCQl8fCAodmFyaWFiaWxpdHlUeXBlCi0JCQkJCQkJCS5lcXVhbHMoVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSkpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQkJVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJCQkJdmlld2VyX3ZhcmlhYmlsaXR5LnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0gZWxzZQotCQkJCQljdHJsX3ZhcmlhYmlsaXR5LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgQWN0aXZpdHkgZ2VuZXJhbCBzZWN0aW9uIDogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfQ0FQQUJJTElUWV9QQVRURVJOICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUyArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUEhBU0UgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9JVEVSQVRJT04gKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZQotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9BQ1RJVklUWSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eUd1aWRhbmNlU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Mjc0YmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5R3VpZGFuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzR3VpZGFuY2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIFRoZSBhY3Rpdml0eSBndWlkYW5jZSBzZWN0aW9uLiBJdCBsaXN0IGFsbCBhdmFpYWJsZSBndWlkYW5jZXMgb2YgYW4gYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX3JlbW92ZV8xLCBjdHJsX2FkZF8yLCBjdHJsX3JlbW92ZV8yOwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMywgY3RybF9yZW1vdmVfMywgY3RybF9hZGRfNCwgY3RybF9yZW1vdmVfNDsKLQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xLCBjdHJsX3RhYmxlXzIsIGN0cmxfdGFibGVfMywgY3RybF90YWJsZV80OwotCi0JcHJpdmF0ZSBTZWN0aW9uIGNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24sIGVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbjsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyXzEsIHZpZXdlcl8yLCB2aWV3ZXJfMywgdmlld2VyXzQ7Ci0KLQkvLyBlbGVtZW50Ci0JcHJpdmF0ZSBBY3Rpdml0eSBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQotCXByaXZhdGUgSUZpbHRlciByb2FkTWFwRmlsdGVyID0gbnVsbDsKLQotCXByaXZhdGUgSUZpbHRlciBnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBJRmlsdGVyIHN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcm9hZCBtYXAgZ3VpZGFuY2UgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0Um9hZE1hcEZpbHRlcigpIHsKLQkJaWYgKHJvYWRNYXBGaWx0ZXIgPT0gbnVsbCkgewotCQkJcm9hZE1hcEZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQl0YWJOYW1lKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCVN0cmluZyBuYW1lID0gKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRUZXh0KG9iaik7Ci0JCQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUm9hZG1hcCIpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSEoKEd1aWRhbmNlSXRlbVByb3ZpZGVyKSBvYmopLmdldENoaWxkcmVuKG9iaikKLQkJCQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9IGVsc2UgewotCQkJKChQcm9jZXNzR3VpZGFuY2VGaWx0ZXIpIHJvYWRNYXBGaWx0ZXIpLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCi0JCXJldHVybiByb2FkTWFwRmlsdGVyOwotCX0KLQotCS8qKgotCSAqIEdldCBHZW5lcmFsIGd1aWRhbmNlIGZpbHRlcgotCSAqIAotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldEdlbmVyYWxHdWlkYW5jZUZpbHRlcigpIHsKLQkJaWYgKGdlbmVyYWxHdWlkYW5jZUZpbHRlciA9PSBudWxsKSB7Ci0JCQlnZW5lcmFsR3VpZGFuY2VGaWx0ZXIgPSBuZXcgUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCksIG51bGwsIHRhYk5hbWUpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmIChzdXBlci5jaGlsZEFjY2VwdChvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYgKCgoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIG9iaikuZ2V0Q2hpbGRyZW4ob2JqKQotCQkJCQkJCQkuaXNFbXB0eSgpKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlDbGFzcyBjbHMgPSBGaWx0ZXJJbml0aWFsaXplci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldENsYXNzRm9yVHlwZShoZWxwZXIuZ2V0RmlsdGVyVHlwZVN0cigpKTsKLQkJCQkJaWYgKGNscyAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY2xzLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBDaGVja2xpc3QpIHx8IChvYmogaW5zdGFuY2VvZiBDb25jZXB0KQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBFeGFtcGxlKQotCQkJCQkJCXx8IChvYmogaW5zdGFuY2VvZiBHdWlkZWxpbmUpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQl9Ci0JCQl9OwotCQl9ZWxzZSB7Ci0JCQkoKFByb2Nlc3NHdWlkYW5jZUZpbHRlcikgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyKS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYWxHdWlkYW5jZUZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgU3VwcG9ydGluZyBtYXRlcmljYWwgZ3VpZGFuY2UgZmlsdGVyCi0JICogCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0U3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKCkgewotCQlpZiAoc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoCi0JCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZUl0ZW1Qcm92aWRlcikKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSBzdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIpLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24KLQkJY3JlYXRlR3VpZGFuY2VTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVTZWN0aW9uKCkgewotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSkgewotCQkJaWYgKGNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0RXhwYW5kZWQoZmFsc2UpOwotCQkJaWYgKGVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5pc0V4cGFuZGVkKCkpCi0JCQkJZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKGZhbHNlKTsKLQotCQkJaWYgKGNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJY29tbXVuaWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWlmIChlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNWaXNpYmxlKCkpCi0JCQkJZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldFZpc2libGUoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKCFjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQljb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLnNldEV4cGFuZGVkKHRydWUpOwotCQkJaWYgKCFlZHVjYXRpb25NYXRlcmlhbFNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRFeHBhbmRlZCh0cnVlKTsKLQotCQkJaWYgKCFjb21tdW5pY2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWlmICghZWR1Y2F0aW9uTWF0ZXJpYWxTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAgVXBkYXRlIGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlIGZsYWcuIENvbnRyb2xzIGNhbiBiZWNvbWUgZWRpdGFibGUgb3IgdW4tZWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRfMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRfMy5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY3RybF9hZGRfNC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWVsZW1lbnQgPSAoQWN0aXZpdHkpIGdldEVsZW1lbnQoKTsKLQotCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl2aWV3ZXJfMi5yZWZyZXNoKCk7Ci0JCQkJdmlld2VyXzMucmVmcmVzaCgpOwotCQkJCXZpZXdlcl80LnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjZXJ0YWluIHNlY3Rpb25zLgotCQkJCXRvZ2dsZVNlY3Rpb24oKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgZ3VpZGFuY2Ugc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3VpZGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHRhYmxlSGVpZ2h0ID0gNTA7Ci0JCVN0cmluZyBzZWN0aW9uVGl0bGUgPSBudWxsOwotCQlTdHJpbmcgc2VjdGlvbkRlc2MgPSBudWxsOwotCQlTdHJpbmcgdGFibGVUaXRsZSA9IG51bGw7Ci0JCS8vIExhYmVsIHRhYmxlTGFiZWwgPSBudWxsOwotCi0JCS8vIFJPQURNQVAKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Sb2FkbWFwVGl0bGU7IAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1JvYWRtYXBEZXNjcmlwdGlvbjsgCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfMSA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzEpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChlbGVtZW50LmdldFJvYWRtYXBzKCkpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMQotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQotCQkvLyBHRU5FUkFMIEdVSURBTkNFCi0JCXsKLQkJCXNlY3Rpb25UaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfR2VuZXJhbEd1aWRhbmNlVGl0bGU7IAotCQkJc2VjdGlvbkRlc2MgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uOyAKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZTsgCi0KLQkJCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQkJc2VjdGlvblRpdGxlLCBzZWN0aW9uRGVzYyk7Ci0KLQkJCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCQlzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJCUNvbXBvc2l0ZSBwYW5lMSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMSwgdGFibGVUaXRsZSk7Ci0KLQkJCWN0cmxfdGFibGVfMiA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSwgdGFibGVIZWlnaHQpOwotCQkJdmlld2VyXzIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8yKTsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoKSkudG9BcnJheSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXZpZXdlcl8yLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQkJdmlld2VyXzIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8yLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCi0JCQljdHJsX2FkZF8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7Ci0JCQljdHJsX3JlbW92ZV8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7Ci0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUxKTsKLQkJfQotCi0JCS8vIENPTU1VTklDQVRJT04gTUFURVJJQUwKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxUaXRsZTsgCi0JCQlzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfQ29tbXVuaWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb247IAotCQkJdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfU2VsZWN0ZWRfQ29tbXVuaWNhdGlvbk1hdGVyaWFsOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV8zID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfMyA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzMpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkJCSgoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50KQotCQkJCQkJCQkJCS5nZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpKQotCQkJCQkJCQkudG9BcnJheSgpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMy5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8zLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMy5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMyA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMyA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQkJCWNvbW11bmljYXRpb25NYXRlcmlhbFNlY3Rpb24gPSBzZWN0aW9uOwotCi0JCX0KLQotCQkvLyBFRFVDQVRJT04gTUFURVJJQUwKLQkJewotCQkJc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlOyAKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uOyAKLQkJCXRhYmxlVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1NlbGVjdGVkX0VkdWNhdGlvbk1hdGVyaWFsOyAKLQotCQkJU2VjdGlvbiBzZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkJLy8gY3JlYXRlIGNvbXBvc2l0ZQotCQkJQ29tcG9zaXRlIHNlY3Rpb25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJCXNlY3Rpb24sIDIsIGZhbHNlKTsKLQotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQkJY3RybF90YWJsZV80ID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCQl2aWV3ZXJfNCA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzQpOwotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkJCSgoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50KQotCQkJCQkJCQkJCS5nZXRFZHVjYXRpb25NYXRlcmlhbHMoKSkudG9BcnJheSgpOwotCQkJCQl9IGVsc2UKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfNC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl80LnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfNC5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfNCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQkJCWVkdWNhdGlvbk1hdGVyaWFsU2VjdGlvbiA9IHNlY3Rpb247Ci0KLQkJfQotCi0JCS8vIGhpZGUvc2hvdyBjZXJ0YWluIHNlY3Rpb25zCi0JCXRvZ2dsZVNlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdldEFkYXB0ZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJcGFyZW50ID0gYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb246OmFkZExpc3RlbmVycyAtIElCU0l0ZW1Qcm92aWRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldFJvYWRNYXBGaWx0ZXIoKTsKLQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsCi0JCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPQURNQVAsIGVsZW1lbnQuZ2V0Um9hZG1hcHMoKSk7Ci0KLQkJCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPQURNQVApOwotCQkJCQlmZC5zZXRJbnB1dChVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoKEVPYmplY3QpIGVsZW1lbnQpKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJYWRkR3VpZGFuY2VzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJcmVtb3ZlR3VpZGFuY2VzKHJtSXRlbXMpOwotCQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8yCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEdlbmVyYWxHdWlkYW5jZUZpbHRlcigpOwotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwKLQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UsIGdldEV4aXN0aW5nRWxlbWVudHMoKSk7IAotCi0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCWZkLnNldElucHV0KFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJZmQuc2V0VHlwZXMoZ2V0RmlsdGVyVHlwZXMoKSk7Ci0JCQkJCWZkLm9wZW4oKTsKLQkJCQkJYWRkR3VpZGFuY2VzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCXZpZXdlcl8yLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzIKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJcmVtb3ZlR3VpZGFuY2VzKHJtSXRlbXMpOwotCQkJCQkJdmlld2VyXzIucmVmcmVzaCgpOwotCi0JCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCQl2aWV3ZXJfMi5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzMKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMwotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8zCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCi0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbEZpbHRlcigpOwotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgcHJvYywKLQkJCQkJCQkJRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTLCBwcm9jCi0JCQkJCQkJCQkJLmdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkpOwotCi0JCQkJCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UpOwotCQkJCQkJZmQKLQkJCQkJCQkJLnNldElucHV0KFVtYVV0aWwKLQkJCQkJCQkJCQkuZ2V0TWV0aG9kTGlicmFyeSgoRU9iamVjdCkgZWxlbWVudCkpOwotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0KLQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCQkJCQkJcHJvYywKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpLAotCQkJCQkJCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKSwgLTEpOwotCQkJCQl9Ci0KLQkJCQkJdmlld2VyXzMucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCQljdHJsX3JlbW92ZV8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfMwotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0KLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSBlbGVtZW50OwotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwKLQkJCQkJCQkJCQkJcHJvYywKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJCXJtSXRlbXMsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl8zLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQl7Ci0JCQljdHJsX3RhYmxlXzQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl80Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdmlld2VyXzQKLQkJCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXJfNAotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQljdHJsX2FkZF80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxGaWx0ZXIoKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIHByb2MsCi0JCQkJCQkJCUZpbHRlckNvbnN0YW50cy5TVVBQT1JUSU5HX01BVEVSSUFMUywgcHJvYwotCQkJCQkJCQkJCS5nZXRFZHVjYXRpb25NYXRlcmlhbHMoKSk7Ci0KLQkJCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRSk7Ci0JCQkJCQlmZAotCQkJCQkJCQkuc2V0SW5wdXQoVW1hVXRpbAotCQkJCQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwKLQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLAotCQkJCQkJCQkJCWZkLmdldFNlbGVjdGVkSXRlbXMoKSwgLTEpOwotCi0JCQkJCQl2aWV3ZXJfNC5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJY3RybF9yZW1vdmVfNC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzQKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJCQlEZWxpdmVyeVByb2Nlc3MgcHJvYyA9IChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJCQlwcm9jLAotCQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJCQkJCQkJCXJtSXRlbXMsIC0xKTsKLQkJCQkJCX0KLQkJCQkJCXZpZXdlcl80LnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzQuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCi0JCQkJCX0KLQkJCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQWRkIGd1aWRhbmNlcyB0byB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBhZGRJdGVtcwotCSAqIAkJCQlsaXN0IG9mIGd1aWRhbmNlcyB0byBhZGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkR3VpZGFuY2VzKEFycmF5TGlzdCBhZGRJdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCUFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZCBjb21tYW5kID0gbmV3IEFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZCgKLQkJCQllbGVtZW50LCBhZGRJdGVtcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBndWlkYW5jZXMgZnJvbSB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIHJlbW92ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVHdWlkYW5jZXMoQXJyYXlMaXN0IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gZ3VpZGFuY2VzIGZvciBhY3Rpdml0eQotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKSwgaXRlbSwKLQkJCQkJCQktMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyCi0JCQkJCQkJLmxvZ0Vycm9yKCJDYW4ndCByZW1vdmUgR3VpZGFuY2U6ICIgKyBpdGVtLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBpdGVtLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBleGlzdGluZyBndWlkYW5jZXMgb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkJbGlzdCBvZiBleGlzdGluZyBndWlkYW5jZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMoKSB7Ci0KLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDaGVja2xpc3RzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRDb25jZXB0cygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0RXhhbXBsZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldEd1aWRlbGluZXMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFJldXNhYmxlQXNzZXRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBuZXcgRGlhZ3JhbUluZm8oKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgIT0gbnVsbCkKLQkJCWl0ZW1MaXN0LmFkZChpbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQkJaWYgKGluZm8uZ2V0V1BERGlhZ3JhbSgpICE9IG51bGwpCi0JCQlpdGVtTGlzdC5hZGQoaW5mby5nZXRXUEREaWFncmFtKCkpOwotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICogQHJldHVybgotCSAqIAkJCWxpc3Qgb2Ygc2VsZWN0ZWQgZ3VpZGFuY2VzCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdGVkR3VpZGFuY2VzKCkgewotCQlMaXN0IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENoZWNrbGlzdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENvbmNlcHRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRFeGFtcGxlcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKSk7Ci0JCUxpc3Qgc3VwcG9ydGluZ01hdGVyaWFscyA9IGVsZW1lbnQuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpOwotCQlEaWFncmFtSW5mbyBpbmZvID0gbmV3IERpYWdyYW1JbmZvKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHN1cHBvcnRpbmdNYXRlcmlhbHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKQotCQkJCWlmICghaW5mby5pc0RpYWdyYW0oKFN1cHBvcnRpbmdNYXRlcmlhbCkgb2JqKSkgewotCQkJCQlpdGVtTGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgZmlsdGVyIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEZpbHRlclR5cGVzKCkgewotCQlTdHJpbmdbXSBzdHIgPSBuZXcgU3RyaW5nWzE0XTsKLQkJaW50IGkgPSAwOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5HVUlEQU5DRTsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlCi0JCQkJKyBGaWx0ZXJDb25zdGFudHMuRVNUSU1BVEVfQ09OU0lERVJBVElPTlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkVYQU1QTEVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5HVUlERUxJTkVTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5QUkFDVElDRVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFUE9SVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlJFVVNBQkxFX0FTU0VUUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuVE9PTF9NRU5UT1JTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5XSElURV9QQVBFUlM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRFUk1fREVGSU5JVElPTlM7Ci0JCXJldHVybiBzdHI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVJvbGx1cFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVJvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2ZTAwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlSb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5FeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFjdGl2aXR5Um9sbHVwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JLy8gY29udHJvbHMKLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcm90ZWN0ZWQgU2VjdGlvbiBzZWN0aW9uOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcm9sbHVwQ29tcG9zaXRlOwotCi0JcHJpdmF0ZSBQcm9jZXNzVmlld2VyIHZpZXdlcjsKLQotCS8vIHByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQkvLyBlbGVtZW50Ci0JcHJpdmF0ZSBBY3Rpdml0eSBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQkvLyBwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlOwotCi0JcHJvdGVjdGVkIENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9yczsKLQotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IEFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgcHJlZmVyZW5jZSBzdG9yZQotCQlzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgcm9sbHVwIHNlY3Rpb24KLQkJY3JlYXRlUm9sbHVwU2VjdGlvbihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSByb2xsdXAgc2VjdGlvbiBvbiB0aGUgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVSb2xsdXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJc2VjdGlvbiA9IEZvcm1VSQotCQkJCS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUm9sbHVwLCAKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uKTsgCi0KLQkJLy8gY3JlYXRlIHJvbGx1cCBjb21wb3NpdGUKLQkJcm9sbHVwQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uLCAyLCBmYWxzZSk7Ci0KLQkJLy8gc2V0IHNlY3Rpb24gbGFiZWxzCi0JCXNldFNlY3Rpb25MYWJlbHMoKTsKLQotCQkvLyBjcmVhdGUgdmlld2VyCi0JCXZpZXdlciA9IG5ldyBQcm9jZXNzVmlld2VyKHJvbGx1cENvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJLy8gZ3JpZERhdGEuaGVpZ2h0SGludCA9IDYwMDsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBpbml0QWRhcHRlckZhY3RvcnkKLQkJaW5pdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gc2V0IHVwIGNvbHVtbnMKLQkJdmlld2VyLnNldHVwQ29sdW1ucyhjb2x1bW5EZXNjcmlwdG9ycyk7Ci0JCXNldENvbHVtbkluZGV4VG9OYW1lTWFwKGFkYXB0ZXJGYWN0b3J5LCBjb2x1bW5EZXNjcmlwdG9ycyk7Ci0KLQkJLy8gc2V0IHVwIHByb3ZpZGVycwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJdmlld2VyCi0JCQkJLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0KLQkJLy8gZG8gcm9sbCB1cAotCQlyb2xsVXAoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCByb2xsVXAoKSB7Ci0JCS8vIHNldCB1cCBjb2x1bW5zCi0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlhZGFwdGVyLnNldFJvbGxlZFVwKHRydWUpOwotCQl2aWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwKLQkJCUNvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb2x1bW5JbmRleFRvTmFtZU1hcC5wdXQobmV3IEludGVnZXIoaSksIGNvbHVtbkRlc2NyaXB0b3JzW2ldLmlkKTsKLQkJfQotCQkoKElDb2x1bW5Bd2FyZSkgZmFjdG9yeSkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoY29sdW1uSW5kZXhUb05hbWVNYXApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgQWN0aXZpdHkgb2JqZWN0Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQllbGVtZW50ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlyb2xsVXAoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoCi0JCQkJCSJFcnJvciByZWZyZXNoaW5nIGFjdGl2aXR5IHdvcmsgcm9sbCB1cCBzZWN0aW9uIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGFkYXB0ZXIgZmFjdG9yeQotCSAqCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBTZXQgbGFiZWwgZm9yIHRoZSBzZWN0aW9uCi0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRTZWN0aW9uTGFiZWxzKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlUZWFtUm9sbHVwU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5VGVhbVJvbGx1cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1MmZmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlUZWFtUm9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoZSB0ZWFtIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVRlYW1Sb2xsdXBTZWN0aW9uIGV4dGVuZHMgQWN0aXZpdHlSb2xsdXBTZWN0aW9uIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNpbml0QWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJLy8gZ2V0IGNvbHVtbiBkZXNjcmlwdG9ycwotCQljb2x1bW5EZXNjcmlwdG9ycyA9IFByb2Nlc3NGb3JtVXRpbC50b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUykpOwotCi0JCS8vIGNyZWF0ZSBhZGFwdGVyIGZhY3RvcnkKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFjdGl2aXR5Um9sbHVwU2VjdGlvbiNzZXRTZWN0aW9uTGFiZWxzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWN0aW9uTGFiZWxzKCkgewotCQlzZWN0aW9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9UZWFtUm9sbHVwKTsgCi0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9UZWFtUm9sbHVwRGVzY3JpcHRpb24pOyAKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUHJvZHVjdHNSb2xsdXBTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MTljMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0FjdGl2aXR5V29ya1Byb2R1Y3RzUm9sbHVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzRm9ybVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIFRoZSB3b3JrIHByb2R1Y3RzIHJvbGx1cCBzZWN0aW9uIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVdvcmtQcm9kdWN0c1JvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gUHJvY2Vzc0Zvcm1VdGlsLnRvQ29sdW1uRGVzY3JpcHRvcnMoc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUykpOwotCi0JCS8vIGNyZWF0ZSBhZGFwdGVyIGZhY3RvcnkKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BY3Rpdml0eVJvbGx1cFNlY3Rpb24jc2V0U2VjdGlvbkxhYmVscygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VjdGlvbkxhYmVscygpIHsKLQkJc2VjdGlvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwKTsgCi0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbik7IAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQWN0aXZpdHlXb3JrUm9sbHVwU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTAzZmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9BY3Rpdml0eVdvcmtSb2xsdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbHVtbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5BcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogVGhlIHdvcmsgcm9sbHVwIHNlY3Rpb24gZm9yIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5V29ya1JvbGx1cFNlY3Rpb24gZXh0ZW5kcyBBY3Rpdml0eVJvbGx1cFNlY3Rpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI2luaXRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEFkYXB0ZXJGYWN0b3J5KCkgewotCQkvLyBnZXQgY29sdW1uIGRlc2NyaXB0b3JzCi0JCWNvbHVtbkRlc2NyaXB0b3JzID0gZ2V0Q29sdW1uRGVzY3JpcHRvcnMoKTsKLQotCQkvLyBjcmVhdGUgYWRhcHRlciBmYWN0b3J5Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgQ29sdW1uRGVzY3JpcHRvcltdIGdldENvbHVtbkRlc2NyaXB0b3JzKCkgewotCQlDb2x1bW5EZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSB0b0NvbHVtbkRlc2NyaXB0b3JzKHN0b3JlCi0JCQkJLmdldFN0cmluZyhBcHBsaWNhdGlvblByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUykpOwotCQkKLQkJLy8gZG9uJ3Qgc2hvdyBjb2x1bW4gIlByZWRlY2Vzc29ycyIKLQkJLy8KLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGRlc2NyaXB0b3JzW2ldID09IFByb2Nlc3NFZGl0b3IuQ09MX0RFU0NfUFJFREVDRVNTT1JTKSB7Ci0JCQkJaW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQkJCQotCQl9Ci0JCWlmKGluZGV4ICE9IC0xKSB7Ci0JCQlDb2x1bW5EZXNjcmlwdG9yW10gY29sRGVzY3JpcHRvcnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltkZXNjcmlwdG9ycy5sZW5ndGggLSAxXTsKLQkJCWlmKGluZGV4ID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVzY3JpcHRvcnMsIDAsIGNvbERlc2NyaXB0b3JzLCAwLCBpbmRleCk7Ci0JCQl9Ci0JCQlpbnQgbGVuID0gZGVzY3JpcHRvcnMubGVuZ3RoIC0gMSAtIGluZGV4OwotCQkJaWYobGVuID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZGVzY3JpcHRvcnMsIGluZGV4ICsgMSwgY29sRGVzY3JpcHRvcnMsIGluZGV4LCBsZW4pOwotCQkJfQotCQkJcmV0dXJuIGNvbERlc2NyaXB0b3JzOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHN0cmluZyBpbnRvIGNvbHVtIGRlc2NyaXB0b3IgbGlzdAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICogCQlMaXN0IG9mIGNvbHVtbiBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUxpc3QgdG9Db2x1bW5EZXNjcmlwdG9yTGlzdChTdHJpbmcgc3RyKSB7Ci0JCUVMaXN0IGNvbHVtbkRlc2NyaXB0b3JzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQkvLyBET04iVCBQVVQgSU5ERVggQ09MVU1OCi0JCQlpZiAoISh0b2tlbi5lcXVhbHMoUHJvY2Vzc0VkaXRvci5DT0xfREVTQ19JRC5pZCkpKSB7Ci0JCQkJT2JqZWN0IGNvbHVtbkRlc2NyaXB0b3IgPSBQcm9jZXNzRWRpdG9yLmlkVG9Db2x1bW5EZXNjcmlwdG9yTWFwCi0JCQkJCQkuZ2V0KHRva2VuKTsKLQkJCQlpZiAoY29sdW1uRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCWNvbHVtbkRlc2NyaXB0b3JzLmFkZChjb2x1bW5EZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbkRlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgc3RyaW5nIGludG8gY29sdW1uIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIHN0cgotCSAqIEByZXR1cm4KLQkgKiAJCWxpc3Qgb2YgY29sdW1uIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2x1bW5EZXNjcmlwdG9yW10gdG9Db2x1bW5EZXNjcmlwdG9ycyhTdHJpbmcgc3RyKSB7Ci0JCUxpc3QgbGlzdCA9IHRvQ29sdW1uRGVzY3JpcHRvckxpc3Qoc3RyKTsKLQkJQ29sdW1uRGVzY3JpcHRvcltdIGNvbHVtbnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShjb2x1bW5zKTsKLQkJcmV0dXJuIGNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWN0aXZpdHlSb2xsdXBTZWN0aW9uI3NldFNlY3Rpb25MYWJlbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFNlY3Rpb25MYWJlbHMoKSB7Ci0JCXNlY3Rpb24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXApOyAKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X1dvcmtSb2xsdXBEZXNjcmlwdGlvbik7IAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQnJlYWtkb3duRWxlbWVudERvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNiZWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQmFzZUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZXZlbnRzLkh5cGVybGlua0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5JbWFnZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgYnJlYWtkb3duIGVsZW1lbnQgZG9jdW1lbnRhdGlvbiBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCi0JLy8gY29udHJvbHMKLQlwcm90ZWN0ZWQgVGV4dCBwcmVmaXhUZXh0OwotCQotCXByb3RlY3RlZCBMYWJlbCBwcmVmaXhMYWJlbDsKLQotCXByb3RlY3RlZCBUZXh0IGJyaWVmRGVzY1RleHQ7Ci0JCi0JcHJvdGVjdGVkIExhYmVsIGJyaWVmRGVzY0xhYmVsOwotCQotCXByb3RlY3RlZCBUZXh0IGV4dGVybmFsSURUZXh0OwotCi0JcHJvdGVjdGVkIExhYmVsIGV4dGVybmFsSURMYWJlbDsKLQotCXByb3RlY3RlZCBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJvdGVjdGVkIFNlY3Rpb24gZG9jdW1lbnRTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBkb2N1bWVudENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgZXhwYW5kRG9jdW1lbnRDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0RWRpdG9yIGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQ7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IHVzYWdlR3VpZGFuY2U7Ci0JCi0JcHJvdGVjdGVkIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHVzYWdlR3VpZGFuY2VDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGtleUNvbnNpZGVyYXRpb25zOwotCQotCXByb3RlY3RlZCBSaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lciBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfZG9jdW1lbnRfZXhwYW5kZWRfVGV4dDsKLQotCXByb3RlY3RlZCBJbWFnZUh5cGVybGluayBleHBhbmREb2N1bWVudExpbms7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgZXhwYW5kRG9jdW1lbnRMYWJlbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEZsYWdUZXh0ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgSU1ldGhvZFJpY2hUZXh0IGFjdGl2ZUNvbnRyb2w7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBhY3RpdmVDb250cm9sVGV4dDsKLQotCS8vIGVsZW1lbnQKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudCBlbGVtZW50OwotCi0JLy8gYWN0aW9uIG1hbmFnZXIKLQlwcm90ZWN0ZWQgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JLy8gbW9kaWZ5IGxpc3RlbmVyCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgY29udGVudE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudFBhdGg7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFN0cmluZyBjb250ZW50RWxlbWVudE5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lciB1c2FnZUd1aWRhbmNlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IHVzYWdlR3VpZGFuY2U7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpKS5nZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJdXNhZ2VHdWlkYW5jZSwgb2xkQ29udGVudCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgbmV3Q29udGVudCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgTGlzdGVuZXIga2V5Q29uc2lkZXJhdGlvbnNMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCToga2V5Q29uc2lkZXJhdGlvbnM7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCWtleUNvbnNpZGVyYXRpb25zLCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCBuZXdDb250ZW50LAotCQkJCQkJLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBvYmplY3QKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCi0JCS8vIHNldCBjb250ZW50IGVsZW1lbnQgcGF0aAotCQljb250ZW50RWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZWxlbWVudCk7IAotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgRG9jbWVudCBzZWN0aW9uCi0JCWNyZWF0ZURvY3VtZW50U2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQotCQlwYXJlbnQuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCWlmIChjdHJsX2RvY3VtZW50X2V4cGFuZGVkICE9IG51bGwpIHsKLQkJCQkJKChHcmlkRGF0YSkgY3RybF9kb2N1bWVudF9leHBhbmRlZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCQkoKEdyaWREYXRhKSBjdHJsX2RvY3VtZW50X2V4cGFuZGVkLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotCQkJCX0KLQkJCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjb250cm9sTW92ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJCi0JCXByZWZpeFRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZS53aWRnZXQsCi0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCXByZWZpeFRleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChwcmVmaXhUZXh0LmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLCBuZXdDb250ZW50LAotCQkJCQkJCS0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJcHJlZml4VGV4dC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlicmllZkRlc2NUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJCWJyaWVmRGVzY1RleHQsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChicmllZkRlc2NUZXh0Ci0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLAotCQkJCQkJCW5ld0NvbnRlbnQsIC0xKTsKLQkJCQkJaWYgKHN0YXR1cykgewotCQkJCQkJYnJpZWZEZXNjVGV4dC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCQotCQlleHRlcm5hbElEVGV4dC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7CQkJCQotCQkJCQotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRFeHRlcm5hbElkKCk7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCQlleHRlcm5hbElEVGV4dCwgb2xkQ29udGVudCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlTdHJpbmcgbmV3Q29udGVudCA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KGV4dGVybmFsSURUZXh0Ci0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQllbGVtZW50LmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksCi0JCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJCQlpZiAoc3RhdHVzKSB7Ci0JCQkJCQlleHRlcm5hbElEVGV4dC5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQotCQl1c2FnZUd1aWRhbmNlLnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQl1c2FnZUd1aWRhbmNlLnNldE1vZGFsT2JqZWN0RmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpKTsKLQkJdXNhZ2VHdWlkYW5jZS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgdXNhZ2VHdWlkYW5jZUxpc3RlbmVyKTsKLQkJCi0JCWtleUNvbnNpZGVyYXRpb25zLnNldE1vZGFsT2JqZWN0KGVsZW1lbnQpOwotCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkpOwotCQlrZXlDb25zaWRlcmF0aW9ucwotCQkJCS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwga2V5Q29uc2lkZXJhdGlvbnNMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIGRvY3VtZW50YXRpb24gc2VjdGlvbiBvbiB0aGUgZ2l2ZW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50U2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJLy8gY3JlYXRlIGRvY3VtZW50IHNlY3Rpb24KLQkJZG9jdW1lbnRTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0RvY3VtZW50SW5mb3JtYXRpb25UaXRsZSwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbiwgUHJvcGVydGllc1V0aWwuZ2V0VHlwZUxvd2VyKGVsZW1lbnQpKSk7IAotCi0JCS8vIGNyZWF0ZSBkb2N1bWVudCBjb21wb3NpdGUKLQkJZG9jdW1lbnRDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGRvY3VtZW50U2VjdGlvbiwgMywKLQkJCQlmYWxzZSk7Ci0KLQkJLy8gcHJlZml4Ci0JCXByZWZpeExhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZml4LCBob3Jpem9udGFsU3Bhbik7IAotCQlwcmVmaXhUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQpOwotCi0JCS8vIGJyaWVmIGRlc2NyaXB0aW9uCi0JCWJyaWVmRGVzY0xhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbiwgaG9yaXpvbnRhbFNwYW4pOyAKLQkJYnJpZWZEZXNjVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLAotCQkJCWhlaWdodEhpbnQpOwotCQkKLQkJLy8gZXh0ZXJuYWwgSUQKLQkJZXh0ZXJuYWxJRExhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGRvY3VtZW50Q29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzX0V4dGVybmFsSUQsIGhvcml6b250YWxTcGFuKTsgCi0JCWV4dGVybmFsSURUZXh0ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZG9jdW1lbnRDb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSB1c2FnZSBndWlkYW5jZQotCQl1c2FnZUd1aWRhbmNlQ29udGFpbmVyID0gRm9ybVVJLmNyZWF0ZVJpY2hUZXh0V2l0aExpbmsodG9vbGtpdCwKLQkJCQlkb2N1bWVudENvbXBvc2l0ZSwgaGVpZ2h0SGludCwgY29udGVudEVsZW1lbnRQYXRoLCBlbGVtZW50LAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc191c2FnZUd1aWRhbmNlKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIodXNhZ2VHdWlkYW5jZUNvbnRhaW5lci5saW5rKTsKLQkJdXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2VDb250YWluZXIucmljaFRleHQ7Ci0KLQkJLy8gY3JlYXRlIGtleSBjb25zaWRlcmF0aW9ucwotCQlrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfa2V5Q29uc2lkZXJhdGlvbnMpOwotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5saW5rKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uc0NvbnRhaW5lci5yaWNoVGV4dDsKLQotCQkvLyBjcmVhdGUgZXhwYW5kZWQgY29tcG9zaXRlCi0JCWV4cGFuZERvY3VtZW50Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LAotCQkJCWRvY3VtZW50U2VjdGlvbiwgMiwgdHJ1ZSk7Ci0KLQkJLy8gSHlwZXJsaW5rIGRlc2MKLQkJZXhwYW5kRG9jdW1lbnRMaW5rID0gRm9ybVVJLmNyZWF0ZUltYWdlSHlwZXJMaW5rKHRvb2xraXQsCi0JCQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUsIEF1dGhvcmluZ1VJSW1hZ2VzLklNR19FWFBBTkRFRCwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5jbG9zZVJURSk7IAotCQlhZGRIeXBlckxpbmtMaXN0ZW5lcihleHBhbmREb2N1bWVudExpbmspOwotCi0JCS8vIGV4cGFuZCBsYWJlbAotCQlleHBhbmREb2N1bWVudExhYmVsID0gQmFzZUZvcm1QYWdlLmNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIGV4cGFuZERvY3VtZW50Q29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIeXBlckxpbmtMaXN0ZW5lcihJbWFnZUh5cGVybGluayBsaW5rKSB7Ci0JCWxpbmsuYWRkSHlwZXJsaW5rTGlzdGVuZXIobmV3IEh5cGVybGlua0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJCQl0b2dnbGUoZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBJTWV0aG9kUmljaFRleHRFZGl0b3IgdG9nZ2xlKEh5cGVybGlua0V2ZW50IGUpIHsKLQkJSU1ldGhvZFJpY2hUZXh0IGN0cmwgPSAoSU1ldGhvZFJpY2hUZXh0KSBlLmdldEhyZWYoKTsKLQkJaWYgKGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQgPT0gbnVsbCkgewotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0RWRpdG9yKAotCQkJCQl0b29sa2l0LCBleHBhbmREb2N1bWVudENvbXBvc2l0ZSwKLQkJCQkJIiIsIFNXVC5NVUxUSSB8IFNXVC5XUkFQLCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsIGV4cGFuZERvY3VtZW50TGFiZWwsIGdldEVkaXRvcigpLmdldEVkaXRvclNpdGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvckhlaWdodCgpOwotCQkJCWdyaWREYXRhLndpZHRoSGludCA9IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKTsKLQkJCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQkvLyBkb2Vzbid0IHNlZW0gdG8gd29yayAtIFJURSBpcyBub3QgcHJvcGVyIHdpZHRoIHVudGlsIHdpbmRvdyBpcyByZXNpemVkCi0vLwkJCQkoKEdyaWREYXRhKWV4cGFuZERvY3VtZW50Q29tcG9zaXRlLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gZ2V0UmljaFRleHRFZGl0b3JXaWR0aCgpOwotLy8JCQkJKChHcmlkRGF0YSlwYXJlbnQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBnZXRSaWNoVGV4dEVkaXRvcldpZHRoKCk7Ci0vLwkJCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCQkJfQotCi0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZXhwYW5kRmxhZykgewotCQkJZG9jdW1lbnRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCWRvY3VtZW50U2VjdGlvbi5zZXRDbGllbnQoZG9jdW1lbnRDb21wb3NpdGUpOwotCi0JCQlleHBhbmREb2N1bWVudENvbXBvc2l0ZS5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJY3RybCA9IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpOwotCQkJY3RybC5zZXRUZXh0KGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuZ2V0VGV4dCgpKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gY3RybC5nZXRMaXN0ZW5lcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmljaFRleHRMaXN0ZW5lciBsaXN0ZW5lciA9IChSaWNoVGV4dExpc3RlbmVyKSBpLm5leHQoKTsKLQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyLmdldEV2ZW50VHlwZSgpLAotCQkJCQkJbGlzdGVuZXIuZ2V0TGlzdGVuZXIoKSk7Ci0JCQl9Ci0KLQkJCWlmIChjdHJsX2RvY3VtZW50X2V4cGFuZGVkLmdldE1vZGlmaWVkKCkpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKQotCQkJCQkJLnNhdmVNb2RpZmllZFJpY2hUZXh0KGN0cmxfZG9jdW1lbnRfZXhwYW5kZWQpOwotCQkJfQotCi0JCQljdHJsLnNldEZvY3VzKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBleHBhbmRlZAotCQkJZG9jdW1lbnRDb21wb3NpdGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlkb2N1bWVudFNlY3Rpb24uc2V0Q2xpZW50KGV4cGFuZERvY3VtZW50Q29tcG9zaXRlKTsKLQotCQkJZXhwYW5kRG9jdW1lbnRDb21wb3NpdGUuc2V0VmlzaWJsZSh0cnVlKTsKLQotCQkJZXhwYW5kRG9jdW1lbnRMYWJlbC5zZXRUZXh0KChTdHJpbmcpICgoSW1hZ2VIeXBlcmxpbmspIGUKLQkJCQkJLmdldFNvdXJjZSgpKS5nZXREYXRhKCJUaXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0QWN0aXZlUmljaFRleHRDb250cm9sKGN0cmwpOwotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRJbml0aWFsVGV4dChjdHJsLmdldFRleHQoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGN0cmwuZ2V0TW9kYWxPYmplY3QoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0RmVhdHVyZShjdHJsCi0JCQkJCS5nZXRNb2RhbE9iamVjdEZlYXR1cmUoKSk7Ci0JCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldEZpbmRSZXBsYWNlQWN0aW9uKGN0cmwuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGN0cmwuZ2V0TGlzdGVuZXJzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSAoUmljaFRleHRMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5hZGRMaXN0ZW5lcihsaXN0ZW5lci5nZXRFdmVudFR5cGUoKSwKLQkJCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkpOwotCQkJfQotCi0JCX0KLQotCQlkb2N1bWVudFNlY3Rpb24ubGF5b3V0KHRydWUpOwotCi0JCS8vIHNldCBlZGl0YWJsZQotCQlpZiAoY3RybF9kb2N1bWVudF9leHBhbmRlZCAhPSBudWxsKQotCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0KLQkJZXhwYW5kRmxhZyA9ICFleHBhbmRGbGFnOwotCQlyZXR1cm4gY3RybF9kb2N1bWVudF9leHBhbmRlZDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJLy8gdXBkYXRlIHNlY3Rpb24gbmFtZQotCQkJCWRvY3VtZW50U2VjdGlvbgotCQkJCQkJLnNldERlc2NyaXB0aW9uKFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCXByZWZpeFRleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWJyaWVmRGVzY1RleHQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlleHRlcm5hbElEVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCQl1c2FnZUd1aWRhbmNlLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJCWtleUNvbnNpZGVyYXRpb25zCi0JCQkJCQkJLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJfQotCi0JCQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGdldEVkaXRvcigpLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGVsZW1lbnQpOwotCQkJCWNvbnRlbnRNb2RpZnlMaXN0ZW5lciA9IGdldEVkaXRvcigpLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKAotCQkJCQkJZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciAhPSBudWxsCi0JCQkJCQkmJiBtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwKLQkJCQkJCSYmIGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKHRydWUpOwotCQkJCX0KLQotCQkJCXByZWZpeFRleHQuc2V0VGV4dChlbGVtZW50LmdldFByZWZpeCgpKTsKLQkJCQlicmllZkRlc2NUZXh0LnNldFRleHQoZWxlbWVudC5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQkJCWV4dGVybmFsSURUZXh0LnNldFRleHQoY29udGVudC5nZXRFeHRlcm5hbElkKCkpOwotCi0JCQkJdXNhZ2VHdWlkYW5jZS5zZXRUZXh0KGNvbnRlbnQuZ2V0VXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRUZXh0KGNvbnRlbnQuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0KLQkJCQlpZiAoZXhwYW5kRmxhZykgewotCQkJCQlpZiAoZXhwYW5kRG9jdW1lbnRMYWJlbC5nZXRUZXh0KCkuZXF1YWxzKAotCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc191c2FnZUd1aWRhbmNlKSkgCi0JCQkJCXsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRVc2FnZUd1aWRhbmNlKCkpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZC5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkpOwotCQkJCQl9IGVsc2UgaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpCi0JCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucykpIAotCQkJCQl7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFRleHQoY29udGVudAotCQkJCQkJCQkuZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldE1vZGFsT2JqZWN0KGNvbnRlbnQpOwotCQkJCQkJY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQkJCQkuc2V0TW9kYWxPYmplY3RGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBjb250ZW50TW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCXByZWZpeFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJYnJpZWZEZXNjVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkKLQkJCQlleHRlcm5hbElEVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwotCQkJCXVzYWdlR3VpZGFuY2Uuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJdXNhZ2VHdWlkYW5jZS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpKTsKLQkJCQl1c2FnZUd1aWRhbmNlLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlrZXlDb25zaWRlcmF0aW9ucy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSk7Ci0JCQkJa2V5Q29uc2lkZXJhdGlvbnMuYWRkTW9kaWZ5TGlzdGVuZXIoY29udGVudE1vZGlmeUxpc3RlbmVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIGJyZWFrZG93biBlbGVtZW50IGRvY3VtZW50YXRpb24gc2VjdGlvbiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXByZWZpeFRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlicmllZkRlc2NUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJZXh0ZXJuYWxJRFRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl1c2FnZUd1aWRhbmNlLnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJa2V5Q29uc2lkZXJhdGlvbnMuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGl2ZSAidW5leHBhbmRlZCIgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZVJpY2hUZXh0Q29udHJvbChJTWV0aG9kUmljaFRleHQgY3RybCkgewotCQlhY3RpdmVDb250cm9sID0gY3RybDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3RpdmUgInVuZXhwYW5kZWQiIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IGdldEFjdGl2ZVJpY2hUZXh0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGFjdGl2ZUNvbnRyb2w7Ci0JfQotCQotCS8qKgotCSAqIEdldCBoZWlnaHQgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHJldHVybgotCSAqIAkJSGVpZ2h0IG9mIHRoZSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmljaFRleHRFZGl0b3JIZWlnaHQoKSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuaGVpZ2h0IC0gMyAqIDMyOwotCX0KLQotCS8qKgotCSAqIEdldCB3aWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuCi0JICogCQlXaWR0aCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJpY2hUZXh0RWRpdG9yV2lkdGgoKSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkud2lkdGggLSAyICogMzI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzczMDI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC52aWV3LlRhYmJlZFByb3BlcnR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnZpZXcuVGFiYmVkUHJvcGVydHlUaXRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBicmVha2Rvd25FbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JLy8gY29udHJvbHMKLQlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQotCXByb3RlY3RlZCBTZWN0aW9uIGdlbmVyYWxTZWN0aW9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBnZW5lcmFsQ29tcG9zaXRlLCBjaGVja0JveENvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBUZXh0IG5hbWVUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgcHJlc2VudGF0aW9uTmFtZVRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBtdWx0aXBsZUJ1dHRvbiwgb3B0aW9uYWxCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBwbGFubmVkQnV0dG9uLCBzdXByZXNzZWRCdXR0b247Ci0KLQlwcm90ZWN0ZWQgaW50IG51bU9mQ29sdW1ucyA9IDQ7Ci0KLQlwcm90ZWN0ZWQgaW50IGhvcml6b250YWxTcGFuID0gMzsKLQotCS8vIHByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQkvLyBlbGVtZW50Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8vIG1vZGlmeSBsaXN0ZW5lcgotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBtb2RlbE1vZGlmeUxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG5hbWVNb2RpZnlMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCWZpbmFsIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXIgbmFtZURlYWN0aXZhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCW5hbWVUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRFZGl0b3IoKQotCQkJCQkJLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJbWVzc2FnZSA9IFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCwgbmFtZVRleHQuZ2V0VGV4dCgpLAotCQkJCQkJc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCQkJfQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCWlmICghbmFtZVRleHQuZ2V0VGV4dCgpLmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCQkJCQkmJiAoZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50Ci0JCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKAotCQkJCQkJCQkJCXByb2NDb21wLAotCQkJCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0KLQkJCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQkJCW1zZyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW5hbWVfTWVzc2FnZTsgCi0KLQkJCQkJCQlpZiAoQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW5hbWVfVGl0bGUsIG1zZykpIHsgCi0JCQkJCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCQkJbmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCQkvLyBuYW1lVGV4dC5zZXRUZXh0KGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQotCQkJCQkJCQl9Ci0JCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJcHJvY0NvbXAsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJCQkJCQluYW1lVGV4dC5nZXRUZXh0KCksIC0xKTsKLQkJCQkJCQkJZ2V0RWRpdG9yKCkuc2V0UGFydE5hbWUoKTsKLQotCQkJCQkJCQkvLyBhZGp1c3QgcGx1Z2luIGxvY2F0aW9uIGFuZCBzYXZlIHRoZQotCQkJCQkJCQkvLyBlZGl0b3IKLQkJCQkJCQkJLy8KLQkJCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheQotCQkJCQkJCQkJCS5nZXREZWZhdWx0KCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpOwotCQkJCQkJCQkJCWVkaXRvcgotCQkJCQkJCQkJCQkJLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZWRpdG9yCi0JCQkJCQkJCQkJCQkuZ2V0UGVyc2lzdGVyKCk7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJcGVyc2lzdGVyCi0JCQkJCQkJCQkJCQkJLmFkanVzdExvY2F0aW9uKGVsZW1lbnQKLQkJCQkJCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJCQkJCXRocm93IGU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCS8vCSBhZGp1c3QgZGlhZ3JhbSByZXNvdXJjZSBhcyB3ZWxsCi0JCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQkJCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoKFByb2Nlc3MpIGVsZW1lbnQsIHRoaXMpOwotCQkJCQkJCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCQltZ3IudXBkYXRlUmVzb3VyY2VVUkkoKTsKLQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0pOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vIHJlcGxhY2Ugd2l0aCBleGlzdGluZyBuYW1lCi0JCQkJCQkJCW5hbWVUZXh0LnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJCQkJCXJldHVybjsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHJlc3RvcmUgdGhlIG9sZCBuYW1lIGZpcnN0LCB0aGVuIHByZXNlbnQgdGhlCi0JCQkJCQkJLy8gZXJyb3IgbWVzc2FnZSBib3gKLQkJCQkJCQluYW1lVGV4dC5zZXRUZXh0KG9sZENvbnRlbnQpOwotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19JbnZhbGlkTmFtZVRpdGxlLCBtc2cpOyAKLQkJCQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQkJCQluYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJCQkJCW5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCQkJCQkJCQkJbmFtZVRleHQuZ2V0VGV4dCgpLCAtMSk7Ci0JCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgb2xkIG5hbWUgZmlyc3QsIHRoZW4gcHJlc2VudCB0aGUgZXJyb3IKLQkJCQkvLyBtZXNzYWdlIGJveAotCQkJCW5hbWVUZXh0LnNldFRleHQob2xkQ29udGVudCk7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWROYW1lVGl0bGUsIG1lc3NhZ2UpOyAKLQkJCQllLmRvaXQgPSBmYWxzZTsKLQkJCQluYW1lVGV4dC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbmFtZVRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJCW5hbWVUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXIgcHJlc2VudGF0aW9uTmFtZURlYWN0aXZhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQkJaWYgKCgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLm11c3RSZXN0b3JlVmFsdWUoCi0JCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LCBvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQkJCi0JCQkvLyB5b3UgY2FuIGhhdmUgYmxhbmsgcHJlc2VudGF0aW9uIG5hbWUgZm9yIGFjdGl2aXR5IHRoYXQgZXh0ZW5kcyAKLQkJCWlmIChTdHJVdGlsLmlzQmxhbmsocHJlc2VudGF0aW9uTmFtZVRleHQuZ2V0VGV4dCgpKQotCQkJCQkmJiBlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkJCSYmIHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLQkJCQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpKSB7Ci0JCQkJCQotCQkJCQllLmRvaXQgPSB0cnVlOwotCQkJCQlpZiAoIXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKS5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQkJaWYgKCFzdGF0dXMpIHsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0RWRpdG9yKCkKLQkJCQkJCS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCW1lc3NhZ2UgPSBQcm9jZXNzVXRpbAotCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50LAotCQkJCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCksIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQkJCX0KLQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCWUuZG9pdCA9IHRydWU7Ci0JCQkJaWYgKCFwcmVzZW50YXRpb25OYW1lVGV4dC5nZXRUZXh0KCkuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQkJCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFRleHQoKSwgLTEpOwotCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyByZXN0b3JlIHRoZSBvbGQgbmFtZSBmaXJzdCwgdGhlbiBwcmVzZW50IHRoZSBlcnJvcgotCQkJCS8vIG1lc3NhZ2UgYm94Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZSwgbWVzc2FnZSk7IAotCQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBCcmVha2Rvd25FbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQkJLy8gdGhpcy50YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSA9IHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JCWNyZWF0ZUdlbmVyYWxTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkTGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JLyoqCi0JICogIEFkZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGV2ZW50LndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJfQotCQkJCi0JCX0pOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbmFtZURlYWN0aXZhdGVMaXN0ZW5lcik7Ci0KLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2V0Q3VycmVudEZlYXR1cmVFZGl0b3IoZXZlbnQud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQkJfQotCQkJCi0JCX0pOwkJCi0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVzZW50YXRpb25OYW1lRGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJLy8gd2hlbiB1c2VyIHRhYiB0byB0aGlzIGZpZWxkLCBzZWxlY3QgYWxsIHRleHQKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkgIAotCQkJfQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiB0aGUgZm9jdXMgb2YgdGhlIGNvbXBvbmVudCBpcyBsb3N0IAotCQkJCWlmKHByZXNlbnRhdGlvbk5hbWVUZXh0LmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKXsKLQkJCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuY2xlYXJTZWxlY3Rpb24oKTsKLQkgICAgICAgICAgICB9IAotCQkJfQotCQl9KTsKLQkJCi0JCW11bHRpcGxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihtdWx0aXBsZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJbXVsdGlwbGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQKLQkJCQkJCQkuZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlvcHRpb25hbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKG9wdGlvbmFsQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlvcHRpb25hbEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09wdGlvbmFsKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXBsYW5uZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuCi0JCQkJCQkJCS52YWx1ZU9mKHBsYW5uZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlzdXByZXNzZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkvLyByZXZlYWxpbmcKLQkJCQkJUHJvY2Vzc0VkaXRvciBlZGl0b3IgPSBnZXRFZGl0b3IoKTsKLQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBlZGl0b3IuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJYm9vbGVhbiBjYW5SZXZlYWwgPSBQcm9jZXNzRWRpdG9yLmNhblJldmVhbCgKLQkJCQkJCQlBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IGVsZW1lbnQgfSksCi0JCQkJCQkJRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQlzdXBwcmVzc2lvbik7Ci0JCQkJCi0JCQkJCWlmICghY2FuUmV2ZWFsKQkJCQkJCi0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwkKLQkJCQkJZWxzZQotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgQm9vbGVhbgotCQkJCQkJCQkudmFsdWVPZihzdXByZXNzZWRCdXR0b24uZ2V0U2VsZWN0aW9uKCkpLCAtMSk7Ci0JCQkJaWYgKCFzdGF0dXMpCi0JCQkJCXN1cHJlc3NlZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRTdXBwcmVzc2VkKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZ2VuZXJhbCBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkvLyBjcmVhdGUgZ2VuZXJhbCBzZWN0aW9uCi0JCWdlbmVyYWxTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlLCAKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb24sIFByb3BlcnRpZXNVdGlsLmdldFR5cGVMb3dlcihlbGVtZW50KSkpOyAKLQotCQkvLyBjcmVhdGUgZ2VuZXJhbCBjb21wb3NpdGUKLQkJZ2VuZXJhbENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZ2VuZXJhbFNlY3Rpb24sCi0JCQkJbnVtT2ZDb2x1bW5zLCBmYWxzZSk7Ci0KLQkJLy8gbmFtZQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX25hbWUpOyAKLQkJbmFtZVRleHQgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBTV1QuREVGQVVMVCwKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gcHJlc2VudGF0aW9uIG5hbWUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZSk7IAotCQlwcmVzZW50YXRpb25OYW1lVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIGhvcml6b250YWxTcGFuKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlIGZvciBjaGVja2JveAotCQljaGVja0JveENvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwsIG51bU9mQ29sdW1ucywgdHJ1ZSk7Ci0KLQkJLy8gb3B0aW9uYWwKLQkJb3B0aW9uYWxCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW9wdGlvbmFsQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbCk7IAotCi0JCS8vIE11bHRpcGxlIE9jdXJyYW5jZXMKLQkJbXVsdGlwbGVCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW11bHRpcGxlQnV0dG9uLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5CcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZSk7IAotCi0JCS8vIHBsYW5uZWQKLQkJcGxhbm5lZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVDaGVja0J1dHRvbih0b29sa2l0LCBjaGVja0JveENvbXBvc2l0ZSwKLQkJCQkxKTsKLQkJcGxhbm5lZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fUGxhbm5lZCk7IAotCi0JCS8vIHN1cHJlc3NlZAotCQlzdXByZXNzZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN1cHJlc3NlZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3VwcmVzc2VkKTsgCi0JCXN1cHJlc3NlZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihnZW5lcmFsQ29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY2hlY2tCb3hDb21wb3NpdGUpOwotCi0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGxpc3RuZXIgZm9yIG5hbWUgYW5kIHByZXNlbnRhdGlvbiBuYW1lCi0JICoKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmFtZU1vZGlmeUxpc3RlbmVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lciB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCQkgKi8KLQotCQlwdWJsaWMgTmFtZU1vZGlmeUxpc3RlbmVyKEVPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCi0JCQlnZXRFZGl0b3IoKS5zdXBlcihlbGVtZW50LCBjaGVja0NvbnRhaW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXN1cGVyLm1vZGlmeVRleHQoZSk7Ci0KLQkJCXVwZGF0ZVRpdGxlKG5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmFtZSBtb2RpZnkgbGlzdGVuZXIgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKiBAcGFyYW0gZU9iagotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBNb2RpZnlMaXN0ZW5lciBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoZU9iaiwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBNb2RpZnlMaXN0ZW5lciBjcmVhdGVOYW1lTW9kaWZ5TGlzdGVuZXIoRU9iamVjdCBlT2JqLAotCQkJYm9vbGVhbiBjaGVja0NvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE5hbWVNb2RpZnlMaXN0ZW5lcihlT2JqLCBjaGVja0NvbnRhaW5lcik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRpdGxlIG9mIHRoZSBwcm9wZXJ0aWVzIHBhZ2UKLQkgKiBAcGFyYW0gdHh0Ci0JICogCQkJbmV3IHRpdGxlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVGl0bGUoU3RyaW5nIHR4dCkgewotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWVQcmVmaXgoKSArIHR4dDsKLQkJVGFiYmVkUHJvcGVydHlDb21wb3NpdGUgY29tcCA9IChUYWJiZWRQcm9wZXJ0eUNvbXBvc2l0ZSkgcGFnZQotCQkJCS5nZXRDb250cm9sKCk7Ci0JCVRhYmJlZFByb3BlcnR5VGl0bGUgdGl0bGUgPSBjb21wLmdldFRpdGxlKCk7Ci0KLQkJdGl0bGUuc2V0VGl0bGUobmFtZSwgZ2V0SW1hZ2UoZWxlbWVudCkpOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAobGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQkJcmV0dXJuIHRpdGxlSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJLy8gZ2V0IEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0Ci0JCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCQkvLyB1cGRhdGUgc2VjdGlvbiBuYW1lCi0JCQkJZ2VuZXJhbFNlY3Rpb24KLQkJCQkJCS5zZXREZXNjcmlwdGlvbihQcm9wZXJ0aWVzUmVzb3VyY2VzLmJpbmQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uLCBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlTG93ZXIoZWxlbWVudCkpKTsgCi0KLQkJCQkvLyBNb2RlbCBNb2RpZnkgbGlzdGVuZXIgZm9yIHByZXNlbnRhdGlvbiBuYW1lCi0JCQkJaWYgKG1vZGVsTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dAotCQkJCQkJCS5yZW1vdmVNb2RpZnlMaXN0ZW5lcihtb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQl9Ci0JCQkJbW9kZWxNb2RpZnlMaXN0ZW5lciA9IGdldEVkaXRvcigpLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKGVsZW1lbnQpOwotCi0JCQkJLy8gTW9kaWZ5IGxpc3RlbmVyIGZvciBuYW1lCi0JCQkJaWYgKG5hbWVNb2RpZnlMaXN0ZW5lciAhPSBudWxsKQotCQkJCQluYW1lVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihuYW1lTW9kaWZ5TGlzdGVuZXIpOwotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJCW5hbWVNb2RpZnlMaXN0ZW5lciA9IGNyZWF0ZU5hbWVNb2RpZnlMaXN0ZW5lcigKLQkJCQkJCQkoKFByb2Nlc3MpIGVsZW1lbnQpLmVDb250YWluZXIoKSwgdHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbmFtZU1vZGlmeUxpc3RlbmVyID0gY3JlYXRlTmFtZU1vZGlmeUxpc3RlbmVyKGVsZW1lbnQpOwotCQkJCX0KLQotCQkJCWlmIChtb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIG1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgbW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQkJaWYgKG5hbWVNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBuYW1lTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJbmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuc2V0VGV4dChlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0KLQkJCQlpZiAobW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBtb2RlbE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKG5hbWVNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSBuYW1lTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCW5hbWVUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5hbWVNb2RpZnlMaXN0ZW5lcik7Ci0JCQkJcHJlc2VudGF0aW9uTmFtZVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQltdWx0aXBsZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJb3B0aW9uYWxCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNPcHRpb25hbCgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXBsYW5uZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNQbGFubmVkKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJLy8gZ2V0IHNlbGVjdGVkIG9yaWdpbmFsIGlucHV0IG9iamVjdAotCQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaWYgKGdldEVkaXRvcigpLmdldFN1cHByZXNzaW9uKCkuaXNJblN1cHByZXNzZWRMaXN0KAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgaW5wdXQpKSB7Ci0JCQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcmVzc2VkQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQlzdXByZXNzZWRCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIGJyZWFrZG93biBlbGVtZW50IGdlbmVyYWwgc2VjdGlvbiIgKyBlbGVtZW50LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQluYW1lVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJbmFtZVRleHQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCW11bHRpcGxlQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlvcHRpb25hbEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJcGxhbm5lZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLS8vCQlzdXByZXNzZWRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9CcmVha2Rvd25FbGVtZW50R3VpZGFuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTMwOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0JyZWFrZG93bkVsZW1lbnRHdWlkYW5jZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5JdGVtc0ZpbHRlckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc0d1aWRhbmNlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIFRoZSBicmVha2Rvd24gZWxlbWVudCBndWlkYW5jZSBzZWN0aW9uLiBJdCBsaXN0IGFsbCBhdmFpbGFibGUgZ3VpZGFuY2VzIGZvciBhbiBicmVha2Rvd24gZWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50R3VpZGFuY2VTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9yZW1vdmVfMTsKLQotCXByaXZhdGUgVGFibGUgY3RybF90YWJsZV8xOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciB2aWV3ZXJfMTsKLQotCS8vIGVsZW1lbnQKLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID0gbnVsbDsKLQotCQotCi0JLyoqCi0JICogR2V0IEdlbmVyYWwgZ3VpZGFuY2UgZmlsdGVyCi0JICogCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0R2VuZXJhbEd1aWRhbmNlRmlsdGVyKCkgewotCQlpZiAoZ2VuZXJhbEd1aWRhbmNlRmlsdGVyID09IG51bGwpIHsKLQkJCWdlbmVyYWxHdWlkYW5jZUZpbHRlciA9IG5ldyBQcm9jZXNzR3VpZGFuY2VGaWx0ZXIoCi0JCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgdGFiTmFtZSkgewotCQkJCXB1YmxpYyBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKHN1cGVyLmNoaWxkQWNjZXB0KG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAoKChHdWlkYW5jZUl0ZW1Qcm92aWRlcikgb2JqKS5nZXRDaGlsZHJlbihvYmopCi0JCQkJCQkJCS5pc0VtcHR5KCkpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJCUNsYXNzIGNscyA9IEZpbHRlckluaXRpYWxpemVyLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q2xhc3NGb3JUeXBlKGhlbHBlci5nZXRGaWx0ZXJUeXBlU3RyKCkpOwotCQkJCQlpZiAoY2xzICE9IG51bGwpIHsKLQkJCQkJCWlmIChjbHMuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdCkgfHwgKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpCi0JCQkJCQkJfHwgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkKLQkJCQkJCQl8fCAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCX0KLQkJCX07Ci0JCX1lbHNlIHsKLQkJCSgoUHJvY2Vzc0d1aWRhbmNlRmlsdGVyKSBnZW5lcmFsR3VpZGFuY2VGaWx0ZXIpLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhbEd1aWRhbmNlRmlsdGVyOwotCX0KLQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24KLQkJY3JlYXRlR3VpZGFuY2VTZWN0aW9uKHBhcmVudCk7Ci0KLQkJLy8gYWRkIGxpc3RlbmVycwotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQkvLyB1cGRhdGUgY29udHJvbHMKLQkJdXBkYXRlQ29udHJvbHMoKTsKLQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJLy8gZ2V0IGFjdGl2aXR5IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0KLQkvKioKLQkgKiAgVXBkYXRlIGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlIGZsYWcuIENvbnRyb2xzIGNhbiBiZWNvbWUgZWRpdGFibGUgb3IgdW4tZWRpdGFibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5BYnN0cmFjdFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvc2hvdyBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkVycm9yIHJlZnJlc2hpbmcgYWN0aXZpdHkgZ3VpZGFuY2Ugc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGd1aWRhbmNlIHNlY3Rpb24gb24gdGhlIGdpdmVuIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlR3VpZGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW50IHRhYmxlSGVpZ2h0ID0gNTA7Ci0JCVN0cmluZyBzZWN0aW9uVGl0bGUgPSBudWxsOwotCQlTdHJpbmcgc2VjdGlvbkRlc2MgPSBudWxsOwotCQlTdHJpbmcgdGFibGVUaXRsZSA9IG51bGw7Ci0KLQkJLy8gR0VORVJBTCBHVUlEQU5DRQotCQl7Ci0JCQlzZWN0aW9uVGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlOyAKLQkJCXNlY3Rpb25EZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9HZW5lcmFsR3VpZGFuY2VEZXNjcmlwdGlvbjsgCi0JCQl0YWJsZVRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5BY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U7IAotCi0JCQlTZWN0aW9uIHNlY3Rpb24gPSBGb3JtVUkuY3JlYXRlU2VjdGlvbih0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJCXNlY3Rpb25UaXRsZSwgc2VjdGlvbkRlc2MpOwotCi0JCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCQlDb21wb3NpdGUgc2VjdGlvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQkJc2VjdGlvbiwgMiwgZmFsc2UpOwotCi0JCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTEsIHRhYmxlVGl0bGUpOwotCi0JCQljdHJsX3RhYmxlXzEgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXZpZXdlcl8xID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KGdldFNlbGVjdGVkR3VpZGFuY2VzKCkpLnRvQXJyYXkoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQl2aWV3ZXJfMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl2aWV3ZXJfMS5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsCi0JCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOwotCi0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdldEFkYXB0ZXIoKTsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJcGFyZW50ID0gYnNJdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiQWN0aXZpdHlHdWlkYW5jZVNlY3Rpb246OmFkZExpc3RlbmVycyAtIElCU0l0ZW1Qcm92aWRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXsKLQkJCWN0cmxfdGFibGVfMS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyXzEKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0pOwotCi0JCQl2aWV3ZXJfMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEdlbmVyYWxHdWlkYW5jZUZpbHRlcigpOwotCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwKLQkJCQkJCQlGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0UsIGdldFNlbGVjdGVkR3VpZGFuY2VzKCkpOwotCi0JCQkJCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0FETUFQKTsKLQkJCQkJZmQuc2V0SW5wdXQoVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KChFT2JqZWN0KSBlbGVtZW50KSk7Ci0JCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEd1aWRhbmNlcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCUFycmF5TGlzdCBybUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCXJlbW92ZUd1aWRhbmNlcyhybUl0ZW1zKTsKLQkJCQkJCXZpZXdlcl8xLnJlZnJlc2goKTsKLQotCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJdmlld2VyXzEuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgZ3VpZGFuY2VzIHRvIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGFkZEl0ZW1zCi0JICogCQkJCWxpc3Qgb2YgZ3VpZGFuY2VzIHRvIGFkZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRHdWlkYW5jZXMoTGlzdDxHdWlkYW5jZT4gYWRkSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQgY29tbWFuZCA9IG5ldyBBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQoCi0JCQkJZWxlbWVudCwgYWRkSXRlbXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZ3VpZGFuY2VzIGZyb20gdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcm1JdGVtcwotCSAqIAkJCQlsaXN0IG9mIGd1aWRhbmNlcyB0byByZW1vdmUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlR3VpZGFuY2VzKExpc3Q8R3VpZGFuY2U+IHJtSXRlbXMpIHsKLQkJLy8gdXBkYXRlIHRoZSBtb2RlbAotCQlpZiAoIXJtSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgaXQubmV4dCgpOwotCi0JCQkJLy8gZ3VpZGFuY2VzIGZvciBhY3Rpdml0eQotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJCQkJaXRlbSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksIGl0ZW0sCi0JCQkJCQkJLTEpOwotCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQkJCQkJCWl0ZW0sIC0xKTsKLQkJCQl9IGVsc2UgewotCQkJCQlsb2dnZXIKLQkJCQkJCQkubG9nRXJyb3IoIkNhbid0IHJlbW92ZSBHdWlkYW5jZTogIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIGd1aWRhbmNlcwotCSAqIEByZXR1cm4KLQkgKiAJCQlsaXN0IG9mIGV4aXN0aW5nIHNlbGVjdGVkIGd1aWRhbmNlcwotCSAqLwotCXByaXZhdGUgTGlzdDxHdWlkYW5jZT4gZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoKSB7Ci0JCUxpc3Q8R3VpZGFuY2U+IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENoZWNrbGlzdHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldENvbmNlcHRzKCkpOwotCQlpdGVtTGlzdC5hZGRBbGwoZWxlbWVudC5nZXRFeGFtcGxlcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0R3VpZGVsaW5lcygpKTsKLQkJaXRlbUxpc3QuYWRkQWxsKGVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKSk7Ci0JCWl0ZW1MaXN0LmFkZEFsbChlbGVtZW50LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSk7Ci0KLQkJcmV0dXJuIGl0ZW1MaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBsaXN0IG9mIGZpbHRlciB0eXBlcwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRGaWx0ZXJUeXBlcygpIHsKLQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1sxNF07Ci0JCWludCBpID0gMDsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuR1VJREFOQ0U7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNIRUNLTElTVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLkNPTkNFUFRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZQotCQkJCSsgRmlsdGVyQ29uc3RhbnRzLkVTVElNQVRFX0NPTlNJREVSQVRJT05TOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5FWEFNUExFUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuR1VJREVMSU5FUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuUFJBQ1RJQ0VTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVBPUlRTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlNVUFBPUlRJTkdfTUFURVJJQUxTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URU1QTEFURVM7Ci0JCXN0cltpKytdID0gRmlsdGVyQ29uc3RhbnRzLnNwYWNlICsgRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUzsKLQkJc3RyW2krK10gPSBGaWx0ZXJDb25zdGFudHMuc3BhY2UgKyBGaWx0ZXJDb25zdGFudHMuV0hJVEVfUEFQRVJTOwotCQlzdHJbaSsrXSA9IEZpbHRlckNvbnN0YW50cy5zcGFjZSArIEZpbHRlckNvbnN0YW50cy5URVJNX0RFRklOSVRJT05TOwotCQlyZXR1cm4gc3RyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvQ29tcG9zaXRlUm9sZVJvbGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZmEyMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0NvbXBvc2l0ZVJvbGVSb2xlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLkZpbHRlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSBjb21wb3NpdGUgcm9sZSAtIHJvbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlUm9sZVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KS5nZXRBZ2dyZWdhdGVkUm9sZXMoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoQ29tcG9zaXRlUm9sZSkgZWxlbWVudDsKLQotCQlTdHJpbmcgdGl0bGUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkNvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU7Ci0JCVN0cmluZyBkZXNjID0gUHJvcGVydGllc1Jlc291cmNlcy5Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uOwotCQlTdHJpbmcgdGFibGUxID0gUHJvcGVydGllc1Jlc291cmNlcy5Db21wb3NpdGVSb2xlX1JvbGVfVGFibGUxOwotCQlzZXRUYWJEYXRhKHRpdGxlLCBkZXNjLCB0YWJsZTEpOyAKLQkJc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQllbGVtZW50ID0gKENvbXBvc2l0ZVJvbGUpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgQ29tcG9zaXRlIHJvbGUgLSByb2xlIHNlY3RpbiAiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBjb21wb3NpdGUgcm9sZXMgCi0JICogQHBhcmFtIGl0ZW1zCi0JICogCQlMaXN0IG9mIHJvbGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZChMaXN0IGl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCShDb21wb3NpdGVSb2xlKSBlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksCi0JCQkJCQkJKFJvbGUpIG9iaiwgLTEpOwotCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJUm9sZSByb2xlID0gKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChyb2xlICE9IG51bGwpCi0JCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELAotCQkJCQkJCQkoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQkJCQkJcm9sZSwgLTEpOwotCQkJCQllbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcik7IAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXROYW1lKCksCi0JCQkJCQkJCSgoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCkuZ2V0TmFtZSgpIH07Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGUsIG1mLmZvcm1hdChhcmdzKSk7IAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI3JlbW92ZShqYXZhLnV0aWwuQXJyYXlMaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShBcnJheUxpc3Qgcm1JdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmICghcm1JdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0b3IubmV4dCgpOwotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsCi0JCQkJCQkoQ29tcG9zaXRlUm9sZSkgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksIHJvbGUsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSAoKENvbXBvc2l0ZVJvbGUpIGVsZW1lbnQpLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGdldEZpbHRlcigpLCBlbGVtZW50LAotCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUywgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWZkLnNldFRpdGxlKEZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCWZkLm9wZW4oKTsKLQkJYWRkKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkgewotCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5ST0xFX0RFU0NSSVBUT1JTOwotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzKCk7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IChQcm9jZXNzKSBnZXRQcm9jZXNzKGVsZW1lbnQpOwotCQlJRmlsdGVyIGRlc2NyaXB0b3JGaWx0ZXIgPSBnZXREZXNjcmlwdG9yRmlsdGVyKCk7Ci0JCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlkZXNjcmlwdG9yRmlsdGVyLCBwcm9jZXNzLCB0YWJOYW1lLCBleGlzdGluZ0VsZW1lbnRzKTsKLQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMpOwotCQkJZmQub3BlbigpOwotCQkJYWRkKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IEZpbmQgcGFyZW50IHVudGlsIGl0J3MgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQlwcm9jZXNzIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvY2VzcyhCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJcmV0dXJuIHBhcmVudDsKLQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldFByb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZGVzY3JpcHRvciBwcm9jZXNzIGZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBJRmlsdGVyIGdldERlc2NyaXB0b3JGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCS8vIExpc3QgbGlzdCA9ICgoQWN0aXZpdHkpb2JqKS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJaWYgKG9iai5lcXVhbHMoZWxlbWVudCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckRvY3VtZW50U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDM3OGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9EZXNjcmlwdG9yRG9jdW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLlJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0KLS8qKgotICogVGhlIGRvY3VtZW50IHRhYiBzZWN0aW9uIGZvciBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEb2N1bWVudFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uIHsKLQotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIElNZXRob2RSaWNoVGV4dCByZWZpbmVkRGVzYzsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJSU1ldGhvZFJpY2hUZXh0IGNvbnRyb2wgPSBleHBhbmRGbGFnID8gY3RybF9kb2N1bWVudF9leHBhbmRlZAotCQkJCQk6IHJlZmluZWREZXNjOwotCQkJaWYgKCFjb250cm9sLmdldE1vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgb2xkQ29udGVudCA9ICgoRGVzY3JpcHRvckRlc2NyaXB0aW9uKSBlbGVtZW50Ci0JCQkJCS5nZXRQcmVzZW50YXRpb24oKSkuZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0JCQlpZiAoKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkubXVzdFJlc3RvcmVWYWx1ZSgKLQkJCQkJcmVmaW5lZERlc2MsIG9sZENvbnRlbnQpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBjb250cm9sLmdldFRleHQoKTsKLQkJCWlmICghbmV3Q29udGVudC5lcXVhbHMob2xkQ29udGVudCkpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50Ci0JCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLAotCQkJCQkJbmV3Q29udGVudCwgLTEpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2NyZWF0ZURvY3VtZW50U2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlRG9jdW1lbnRTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCWludCBoZWlnaHRIaW50ID0gMjAwOwotCi0JCS8vIHJlZmluZWQgZGVzY3JpcHRpb24KLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgcmVmaW5lZENvbnRhaW5lciA9IEZvcm1VSS5jcmVhdGVSaWNoVGV4dFdpdGhMaW5rKHRvb2xraXQsCi0JCQkJZG9jdW1lbnRDb21wb3NpdGUsIGhlaWdodEhpbnQsIGNvbnRlbnRFbGVtZW50UGF0aCwgZWxlbWVudCwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkRlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uKTsKLQkJYWRkSHlwZXJMaW5rTGlzdGVuZXIocmVmaW5lZENvbnRhaW5lci5saW5rKTsKLQkJcmVmaW5lZERlc2MgPSByZWZpbmVkQ29udGFpbmVyLnJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdChnZXRFbGVtZW50KCkpOwotCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQlyZWZpbmVkRGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlyZWZpbmVkRGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNhdmVNb2RpZmllZFJpY2hUZXh0KCk7Ci0KLQkJCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gY29udGVudCA9IChEZXNjcmlwdG9yRGVzY3JpcHRpb24pIGVsZW1lbnQKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlyZWZpbmVkRGVzYy5yZW1vdmVNb2RpZnlMaXN0ZW5lcihjb250ZW50TW9kaWZ5TGlzdGVuZXIpOwkJCi0JCQkJfQotCQkJCi0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldEVsZW1lbnQoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIGNvbnRlbnRNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJCi0JCQkJcmVmaW5lZERlc2Muc2V0VGV4dChjb250ZW50LmdldFJlZmluZWREZXNjcmlwdGlvbigpKTsKLQotCQkJCWlmIChleHBhbmRGbGFnKSB7Ci0JCQkJCWlmIChleHBhbmREb2N1bWVudExhYmVsLmdldFRleHQoKQotCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLkRlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uKSkgeyAKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRSZWZpbmVkRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQlyZWZpbmVkRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkpOwotCQkJCXJlZmluZWREZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyBkZXNjcmlwdG9yIGRvY3VtZW50YXRpb24gc2VjdGlvbiA6IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2IxOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24gewotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzeW5jaHJvbml6ZWRCdXR0b247Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCS8vIGdldCBEZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVHZW5lcmFsU2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlR2VuZXJhbFNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlzdXBlci5jcmVhdGVHZW5lcmFsU2VjdGlvbihjb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIGNoZWNrYm94Ci0JCWNoZWNrQm94Q29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgbnVtT2ZDb2x1bW5zLCB0cnVlKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkKTsgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKHN5bmNocm9uaXplZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJc3luY2hyb25pemVkQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCWVsZW1lbnQgPSAoRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCQkJc3luY2hyb25pemVkQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50Ci0JCQkJCQkuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBEZXNjcmlwdG9yIGdlbmVyYWwgc2VjdGlvbjogIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jZ2V0TmFtZVByZWZpeCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9FUEZQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOGNiNmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VQRlByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLlByb2Nlc3NFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Qcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5lZGl0b3IuSUZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBwcm9wZXJ0eSBzaGVldCBwYWdlIGZvciBwcm9jZXNzIGVsZW1lbnRzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVQRlByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgewotCi0JcHJpdmF0ZSBJUHJvcGVydHlTaGVldEVudHJ5IHJvb3RFbnRyeTsKLQotCXByaXZhdGUgc3RhdGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHNvdXJjZVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyOwotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0VkaXRvciBwcm9jZXNzRWRpdG9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybVBhZ2VJRCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlIGZvcm1QYWdlID0gbnVsbDsKLQotCXB1YmxpYyBFUEZQcm9wZXJ0eVNoZWV0UGFnZShQcm9jZXNzRWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigoSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpIGVkaXRvcik7Ci0KLQkJYWN0aW9uTWdyID0gKChQcm9jZXNzRWRpdG9yKSBlZGl0b3IpLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJcHJvY2Vzc0VkaXRvciA9IGVkaXRvcjsKLQotCX0KLQotCS8qKgotCSAqIEdldCBhY3Rpb24gbWFuYWdlcgotCSAqIEByZXR1cm4KLQkgKiAJCQlBY3Rpb24gTWFuYWdlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJcmV0dXJuIGFjdGlvbk1ncjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCBwcm9wZXJ0eSBzaGVldCBwYWdlCi0JICogQHJldHVybgotCSAqIAkJCVByb2Nlc3MgRWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIHByb2Nlc3NFZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGFzIHRoZSBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIuCi0JICogPHA+Ci0JICogQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBvbmx5IHZhbGlkIGlmIHlvdSBhcmUgdXNpbmcgdGhpcyBwYWdlJ3MgZGVmYXVsdAotCSAqIHJvb3QgZW50cnkuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHNvdXJjZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoSVByb3BlcnR5U291cmNlUHJvdmlkZXIgbmV3UHJvdmlkZXIpIHsKLQkJc291cmNlUHJvdmlkZXIgPSBuZXdQcm92aWRlcjsKLQkJaWYgKHJvb3RFbnRyeSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYSBuZXcgcm9vdAotCQkJUHJvcGVydHlTaGVldEVudHJ5IHJvb3QgPSBuZXcgUHJvcGVydHlTaGVldEVudHJ5KCk7Ci0KLQkJCXJvb3RFbnRyeSA9IHJvb3Q7Ci0JCX0KLQkJaWYgKHNvdXJjZVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCS8vIHNldCB0aGUgcHJvcGVydHkgc291cmNlIHByb3ZpZGVyIGZvciByb290IGVudHJ5Ci0JCQlpZiAocm9vdEVudHJ5IGluc3RhbmNlb2YgUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0JCQkJKChQcm9wZXJ0eVNoZWV0RW50cnkpIHJvb3RFbnRyeSkKLQkJCQkJCS5zZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHNvdXJjZVByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBwcm9wZXJ0eSBzb3VyY2UgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGdldFByb3BlcnR5U291cmNlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBzb3VyY2VQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gc2VsZWN0aW9uIG9mIHRoZSBvYmplY3QgZnJvbSBicmVha2Rvd24gc3RydWN0dXJlIG9mIHRoZSBwcm9jZXNzIGVkaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsKSB7Ci0JCXNlbGVjdGlvbiA9IHNlbDsKLQotCQlpZiAocGFydCBpbnN0YW5jZW9mIFByb2Nlc3NFZGl0b3IpIHsKLQkJCXByb2Nlc3NFZGl0b3IgPSAoUHJvY2Vzc0VkaXRvcikgcGFydDsKLQkJCWFjdGlvbk1nciA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkJSUZvcm1QYWdlIGFjdGl2ZVBhZ2UgPSBwcm9jZXNzRWRpdG9yLmdldEFjdGl2ZVBhZ2VJbnN0YW5jZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpCi0JCQkJZm9ybVBhZ2UgPSAoUHJvY2Vzc0JyZWFrZG93blN0cnVjdHVyZUZvcm1QYWdlKSBhY3RpdmVQYWdlOwotCQkJZm9ybVBhZ2VJRCA9IGFjdGl2ZVBhZ2UgIT0gbnVsbCA/IGFjdGl2ZVBhZ2UuZ2V0SWQoKSA6IG51bGw7Ci0JCX0KLQotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHBhcnQsIHNlbGVjdGlvbik7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UjaGFuZGxlUGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVQYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBQcm9jZXNzRWRpdG9yKSB7Ci0JCQlwcm9jZXNzRWRpdG9yID0gKFByb2Nlc3NFZGl0b3IpIHBhcnQ7Ci0JCQlzZWxlY3Rpb24gPSBwcm9jZXNzRWRpdG9yLmdldFNlbGVjdGlvbigpOwotCQkJYWN0aW9uTWdyID0gcHJvY2Vzc0VkaXRvci5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JCQlJRm9ybVBhZ2UgYWN0aXZlUGFnZSA9IHByb2Nlc3NFZGl0b3IuZ2V0QWN0aXZlUGFnZUluc3RhbmNlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSBpbnN0YW5jZW9mIFByb2Nlc3NCcmVha2Rvd25TdHJ1Y3R1cmVGb3JtUGFnZSkKLQkJCQlmb3JtUGFnZSA9IChQcm9jZXNzQnJlYWtkb3duU3RydWN0dXJlRm9ybVBhZ2UpIGFjdGl2ZVBhZ2U7Ci0JCQlmb3JtUGFnZUlEID0gYWN0aXZlUGFnZSAhPSBudWxsID8gYWN0aXZlUGFnZS5nZXRJZCgpIDogbnVsbDsKLQkJfQotCi0JCXN1cGVyLmhhbmRsZVBhcnRBY3RpdmF0ZWQocGFydCk7Ci0JCQotCQl0aGlzLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY3VycmVudCBhZGFwdGVyIGZhY3Rvcnkgb2YgZWRpdG9yCi0JICogQHJldHVybgotCSAqIAkJCUFkYXB0ZXIgRmFjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmb3JtUGFnZS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UjcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQkvLyB3aWxsIHNlZSBpZiB0aGlzIHdvcmtzLi4KLQkJdHJ5IHsKLQkJCXN1cGVyLnJlZnJlc2goKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCQotLy8gVE9ETyAtIGdldCByaWQgb2YgaW50ZXJuYWwgQVBJcy4KLS8vCQlpZiAodGhpcy5nZXRDdXJyZW50VGFiKCkgIT0gbnVsbCkgewotLy8JCQl0aGlzLmdldEN1cnJlbnRUYWIoKS5yZWZyZXNoKCk7Ci0vLwotLy8JCQkvLyBhbHNvIHJlZnJlc2ggc2VjdGlvbgotLy8JCQlJU2VjdGlvbiBzZWN0aW9uID0gdGhpcy5nZXRDdXJyZW50VGFiKCkuZ2V0U2VjdGlvbkF0SW5kZXgoMCk7Ci0vLwkJCWlmIChzZWN0aW9uICE9IG51bGwpIHsKLS8vCQkJCXNlY3Rpb24ucmVmcmVzaCgpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0ZGU3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudExhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotCi0vKioKLSAqIExhYmVsIHByb3ZpZGVyIGZvciB0aGUgdGl0bGUgYmFyIGZvciB0aGUgdGFiYmVkIHByb3BlcnR5IHNoZWV0IHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJVHlwZU1hcHBlciB0eXBlTWFwcGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBFbGVtZW50TGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHlwZU1hcHBlciA9IG5ldyBFbGVtZW50VHlwZU1hcHBlcigpOwotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3RzKSB7Ci0JCWlmIChvYmplY3RzID09IG51bGwgfHwgb2JqZWN0cy5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUltYWdlIGltYWdlID0gTGlicmFyeVVJSW1hZ2VzLklNR19QUk9DRVNTOwotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIGltYWdlOwotCQl9IGVsc2UgewotCQkJT2JqZWN0IG9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkpOwotCQkJfQotCQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQotCQkJcmV0dXJuIHRpdGxlSW1hZ2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdHMpIHsKLQkJaWYgKG9iamVjdHMgPT0gbnVsbCB8fCBvYmplY3RzLmVxdWFscyhTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZKSkgewotCQkJcmV0dXJuIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Ob0l0ZW1zOyAKLQkJfQotCQlmaW5hbCBib29sZWFuIG11bHRpcGxlW10gPSB7IGZhbHNlIH07Ci0JCWZpbmFsIE9iamVjdCBvYmplY3QgPSBnZXRPYmplY3Qob2JqZWN0cywgbXVsdGlwbGUpOwotCQlpZiAob2JqZWN0ID09IG51bGwgfHwgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0cykuc2l6ZSgpID4gMSkgewotCQkJT2JqZWN0IHNpemUgPSBuZXcgSW50ZWdlcigoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3RzKS5zaXplKCkpOwotCQkJU3RyaW5nIG1zZyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuYmluZChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSXRlbXNTZWxlY3RlZCwgKG5ldyBPYmplY3RbXSB7IHNpemUgfSkpOyAKLQkJCXJldHVybiBtc2c7Ci0JCX0gZWxzZSB7Ci0KLQkJCU9iamVjdCBvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqZWN0KTsKLQkJCXJldHVybiBnZXROYW1lKG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzVXRpbC5nZXRUeXBlKG9iaik7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW5hbWUgPSBwcmVmaXggKyAiIDogIiArICgoQnJlYWtkb3duRWxlbWVudCkgb2JqKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCW5hbWUgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlOyAKLQkJfQotCi0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBhIG11bHRpcGxlIG9iamVjdCBzZWxlY3Rpb24gaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBsYWJlbAotCSAqIHByb3ZpZGVyLiBJZiB0aGUgb2JqZWN0cyBpcyBhIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLCBzZWUgaWYgYWxsIHRoZQotCSAqIG9iamVjdHMgaW4gdGhlIHNlbGVjdGlvbiBhcmUgdGhlIHNhbWUgYW5kIGlmIHNvLCB3ZSB3YW50IHRvIHByb3ZpZGUKLQkgKiBsYWJlbHMgZm9yIHRoZSBjb21tb24gc2VsZWN0ZWQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0cwotCSAqICAgICAgICAgICAgYSBzaW5nbGUgb2JqZWN0IG9yIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0JICogQHBhcmFtIG11bHRpcGxlCi0JICogICAgICAgICAgICBmaXJzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyB0cnVlIGlmIHRoZXJlIGlzIG11bHRpcGxlCi0JICogICAgICAgICAgICB1bmVxdWFsIHNlbGVjdGVkIGVsZW1lbnRzIGluIGEgSVN0cnVjdHVyZWRTZWxlY3Rpb24uCi0JICogQHJldHVybiB0aGUgb2JqZWN0IHRvIGdldCBsYWJlbHMgZm9yLgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldE9iamVjdChPYmplY3Qgb2JqZWN0cywgYm9vbGVhbiBtdWx0aXBsZVtdKSB7Ci0JCUFzc2VydC5pc05vdE51bGwob2JqZWN0cyk7Ci0JCU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlpZiAob2JqZWN0cyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIG9iamVjdHM7Ci0JCQlvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJLy8gb25lIGVsZW1lbnQgc2VsZWN0ZWQKLQkJCQltdWx0aXBsZVswXSA9IGZhbHNlOwotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCQkvLyBtdWx0aXBsZSBlbGVtZW50cyBzZWxlY3RlZAotCQkJbXVsdGlwbGVbMF0gPSB0cnVlOwotLy8JCQlDbGFzcyBmaXJzdENsYXNzID0gdHlwZU1hcHBlci5tYXBUeXBlKG9iamVjdCwgb2JqZWN0LmdldENsYXNzKCkpOwotCQkJQ2xhc3MgZmlyc3RDbGFzcyA9IHR5cGVNYXBwZXIubWFwVHlwZShvYmplY3QpOwotCQkJLy8gZGV0ZXJtaW5lIGlmIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgc2VsZWN0aW9uIGFyZSB0aGUgc2FtZSB0eXBlCi0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaS5uZXh0KCk7Ci0vLwkJCQkJQ2xhc3MgbmV4dENsYXNzID0gdHlwZU1hcHBlci5tYXBUeXBlKG5leHQsIG5leHQKLS8vCQkJCQkJCS5nZXRDbGFzcygpKTsKLQkJCQkJQ2xhc3MgbmV4dENsYXNzID0gdHlwZU1hcHBlci5tYXBUeXBlKG5leHQpOwotCQkJCQlpZiAoIW5leHRDbGFzcy5lcXVhbHMoZmlyc3RDbGFzcykpIHsKLQkJCQkJCS8vIHR3byBlbGVtZW50cyBub3QgZXF1YWwgPT0gbXVsdGlwbGUgc2VsZWN0ZWQgdW5lcXVhbAotCQkJCQkJbXVsdGlwbGVbMF0gPSBmYWxzZTsKLQkJCQkJCW9iamVjdCA9IG51bGw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW11bHRpcGxlWzBdID0gZmFsc2U7Ci0JCQlvYmplY3QgPSBvYmplY3RzOwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0VsZW1lbnRUeXBlTWFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudFR5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlYzA1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvRWxlbWVudFR5cGVNYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlcjsKLQotCi0vKioKLSAqIFR5cGUgbWFwcGVyIGZvciB0aGUgbG9naWMgZXhhbXBsZS4gV2Ugd2FudCB0byBnZXQgdGhlIEdFRiBtb2RlbCBvYmplY3QgZnJvbQotICogdGhlIHNlbGVjdGVkIGVsZW1lbnQgaW4gdGhlIG91dGxpbmUgdmlldyBhbmQgdGhlIGRpYWdyYW0uIFdlIGNhbiB0aGVuIGZpbHRlcgotICogb24gdGhlIG1vZGVsIG9iamVjdCB0eXBlLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50VHlwZU1hcHBlciBpbXBsZW1lbnRzIElUeXBlTWFwcGVyIHsKLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVHlwZU1hcHBlciNtYXBUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENsYXNzIG1hcFR5cGUoT2JqZWN0IG9iamVjdCkgewotLy8JCUNsYXNzIHR5cGUgPSBlZmZlY3RpdmVUeXBlOwotCQlDbGFzcyB0eXBlID0gbnVsbDsKLQkJaWYgKG9iamVjdCAhPSBudWxsKSB7Ci0JCQl0eXBlID0gb2JqZWN0LmdldENsYXNzKCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXR5cGUgPSAoKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0Q2xhc3MoKTsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gdHlwZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Zvcm1VSS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL0Zvcm1VSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWVkMmMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Gb3JtVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5CYXNlRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RGb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0LklNZXRob2RSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuUmljaFRleHRJbWFnZUxpbmtDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSW1hZ2VIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0KLS8qKgotICogVGhlIFVJIHV0aWwgY2xhc3MgdGFpbG9yZWQgZm9yIHByb3BlcnRpZXMgdmlldyBmb3IgcHJvY2VzcyBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9ybVVJIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMzAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGFiZWwgX2NyZWF0ZUxhYmVsKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgc3RyLCBpbnQgZ3JpZERhdGFTdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUxhYmVsIGxhYmVsID0gdG9vbGtpdC5jcmVhdGVMYWJlbChwYXJlbnQsIHN0cik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWREYXRhU3R5bGUpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBzdHIpIHsKLQkJLy8gbWFrZSBob3Jpem9uYXRhbFNwYW4gMQotCQlyZXR1cm4gX2NyZWF0ZUxhYmVsKHRvb2xraXQsIHBhcmVudCwgc3RyLCBHcmlkRGF0YS5CRUdJTk5JTkcsIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGFiZWwgY3JlYXRlTGFiZWwoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBzdHIsIGludCBob3Jpem9udGFsU3BhbikgewotCQkvLyBtYWtlIGhvcml6b25hdGFsU3BhbiAyCi0JCXJldHVybiBfY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFyZW50LCBzdHIsIEdyaWREYXRhLkJFR0lOTklORywKLQkJCQlob3Jpem9udGFsU3Bhbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGV4dCBfY3JlYXRlVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHRleHRTdHlsZSwgaW50IGdyaWREYXRhU3R5bGUsIGludCBoZWlnaHQsIGludCB3aWR0aCwKLQkJCWludCBob3Jpem9udGFsU3BhbikgewotCQlUZXh0IGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZVRleHQocGFyZW50LCAiIiwgdGV4dFN0eWxlKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkRGF0YVN0eWxlKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGhlaWdodDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGg7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUZXh0KHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgU1dULkRFRkFVTFQsIERFRkFVTFRfV0lEVEgsCi0JCQkJU1dULkRFRkFVTFQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgaGVpZ2h0KSB7Ci0JCXJldHVybiBfY3JlYXRlVGV4dCh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQLAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCwgaGVpZ2h0LCBERUZBVUxUX1dJRFRILCBTV1QuREVGQVVMVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBoZWlnaHQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlyZXR1cm4gX2NyZWF0ZVRleHQodG9vbGtpdCwgcGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULldSQVAsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBoZWlnaHQsIERFRkFVTFRfV0lEVEgsIGhvcml6b250YWxTcGFuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWV0aG9kUmljaFRleHQgX2NyZWF0ZVJpY2hUZXh0KEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIFN0cmluZyBwYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBMYWJlbCBsYWJlbCkgewotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IE1ldGhvZEZvcm1Ub29sa2l0LmNyZWF0ZVJpY2hUZXh0KHRvb2xraXQsCi0JCQkJcGFyZW50LAotCQkJCSIiLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCwgcGF0aCwgbWV0aG9kRWxlbWVudCwgbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSBoZWlnaHQ7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IHdpZHRoOwotCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIGNyZWF0ZVJpY2hUZXh0V2l0aExpbmsoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBoZWlnaHQsIFN0cmluZyBwYXRoLAotCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCUltYWdlSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVJbWFnZUh5cGVyTGluayh0b29sa2l0LCBwYXJlbnQsIEF1dGhvcmluZ1VJSW1hZ2VzLklNR19DT0xMQVBTRUQsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlblJURSk7Ci0JCWxpbmsuc2V0RGF0YSgiVGl0bGUiLCBsYWJlbFRleHQpOyAvLyROT04tTkxTLTEkCi0JCUxhYmVsIGRlY29yYXRlZExhYmVsID0gQmFzZUZvcm1QYWdlLmNyZWF0ZURlY29yYXRlZExhYmVsKHRvb2xraXQsIHBhcmVudCwgbGFiZWxUZXh0KTsKLQkJKChHcmlkRGF0YSlkZWNvcmF0ZWRMYWJlbC5nZXRMYXlvdXREYXRhKCkpLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQotCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IF9jcmVhdGVSaWNoVGV4dCh0b29sa2l0LCBwYXJlbnQsIGhlaWdodCwgREVGQVVMVF9XSURUSCwgcGF0aCwKLQkJCQltZXRob2RFbGVtZW50LCBkZWNvcmF0ZWRMYWJlbCk7Ci0JCWxpbmsuc2V0SHJlZihjb250cm9sKTsKLQotCQlyZXR1cm4gbmV3IFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyKGNvbnRyb2wsIGxpbmssIGRlY29yYXRlZExhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlSHlwZXJsaW5rIGNyZWF0ZUltYWdlSHlwZXJMaW5rKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBJbWFnZSBpbWFnZSwgU3RyaW5nIHRvb2xUaXApIHsKLQkJSW1hZ2VIeXBlcmxpbmsgbGluayA9IHRvb2xraXQuY3JlYXRlSW1hZ2VIeXBlcmxpbmsocGFyZW50LCBTV1QuTEVGVAotCQkJCXwgU1dULlRPUCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxpbmsuc2V0SW1hZ2UoaW1hZ2UpOwotCQlsaW5rLnNldFRvb2xUaXBUZXh0KHRvb2xUaXApOwotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gdG9vbGtpdC5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU2VjdGlvbi5ERVNDUklQVElPTgotCQkJCXwgU2VjdGlvbi5UV0lTVElFIHwgU2VjdGlvbi5FWFBBTkRFRCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlY3Rpb24uc2V0VGV4dCh0aXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBnZFN0eWxlKSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihwYXJlbnQsIFNlY3Rpb24uREVTQ1JJUFRJT04KLQkJCQl8IFNlY3Rpb24uVFdJU1RJRSB8IFNlY3Rpb24uRVhQQU5ERUQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShnZFN0eWxlKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VjdGlvbi5zZXRUZXh0KHRpdGxlKTsKLQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCXRvb2xraXQuY3JlYXRlQ29tcG9zaXRlU2VwYXJhdG9yKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKEZvcm1Ub29sa2l0IHRvb2xraXQsCi0JCQlTZWN0aW9uIHNlY3Rpb24sIGludCBudW1PZkNvbHVtbnMsIGJvb2xlYW4gZXhwYW5kZWQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHNlY3Rpb24pOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQobnVtT2ZDb2x1bW5zLCBmYWxzZSkpOwotCQlpZiAoIWV4cGFuZGVkKQotCQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJZWxzZQotCQkJY29tcG9zaXRlLnNldFZpc2libGUoZmFsc2UpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoRm9ybVRvb2xraXQgdG9vbGtpdCwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBncmlkU3R5bGUpIHsKLQkJQ29tcG9zaXRlIHBhbmUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoZ3JpZFN0eWxlKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXJldHVybiBwYW5lOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IGdyaWRTdHlsZSwgaW50IG51bU9mQ29sdW1ucywKLQkJCWJvb2xlYW4gZXF1YWxTaXplQ29sdW1uKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKGdyaWRTdHlsZSk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gbnVtT2ZDb2x1bW5zOwotCQlwYW5lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KG51bU9mQ29sdW1ucywgZXF1YWxTaXplQ29sdW1uKTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBhbmUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXJldHVybiBwYW5lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEJ1dHRvbiBfY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgYnV0dG9uU3RyLCBpbnQgc3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlCdXR0b24gY29udHJvbCA9IHRvb2xraXQuY3JlYXRlQnV0dG9uKHBhcmVudCwgYnV0dG9uU3RyLCBzdHlsZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEJ1dHRvbiBfY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgYnV0dG9uU3RyLCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGNvbnRyb2wgPSB0b29sa2l0LmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblN0ciwgc3R5bGUpOwotCQljb250cm9sLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0JCi0JCi0KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBfY3JlYXRlQ29tYm8oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm8oRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBob3Jpem9udGFsU3BhbikgewotCQlyZXR1cm4gX2NyZWF0ZUNvbWJvKHRvb2xraXQsIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5GTEFUCi0JCQkJfCBTV1QuUkVBRF9PTkxZLCBob3Jpem9udGFsU3Bhbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihGb3JtVG9vbGtpdCB0b29sa2l0LCBDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblN0cikgewotCQlyZXR1cm4gX2NyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYXJlbnQsIGJ1dHRvblN0ciwgU1dULk5PTkUpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgc3R5bGUsIGludCBob3Jpem9udGFsU3BhbikgewotCQlyZXR1cm4gX2NyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYXJlbnQsICIiLCBzdHlsZSwgaG9yaXpvbnRhbFNwYW4pOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgQnV0dG9uIGNyZWF0ZUNoZWNrQnV0dG9uKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikKLQl7Ci0JCUJ1dHRvbiBjb250cm9sID0gdG9vbGtpdC5jcmVhdGVCdXR0b24ocGFyZW50LCAiIiwgU1dULkNIRUNLKTsJCS8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVGFibGUgX2NyZWF0ZVRhYmxlKEZvcm1Ub29sa2l0IHRvb2xraXQsIENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgdGFibGVTdHlsZSwgaW50IGdyaWRTdHlsZSwgaW50IGhlaWdodCwgaW50IHdpZHRoLAotCQkJaW50IHZlcnRpY2FsU3BhbiwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCVRhYmxlIHRhYmxlID0gdG9vbGtpdC5jcmVhdGVUYWJsZShwYXJlbnQsIHRhYmxlU3R5bGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShncmlkU3R5bGUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0OwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJZ3JpZERhdGEudmVydGljYWxTcGFuID0gdmVydGljYWxTcGFuOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGFibGUgY3JlYXRlVGFibGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gX2NyZWF0ZVRhYmxlKHRvb2xraXQsIHBhcmVudCwgU1dULk1VTFRJLCBHcmlkRGF0YS5GSUxMX0JPVEgsCi0JCQkJMjAwLCAyMDAsIDEsIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGFibGUgY3JlYXRlVGFibGUoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBoZWlnaHQpIHsKLQkJcmV0dXJuIF9jcmVhdGVUYWJsZSh0b29sa2l0LCBwYXJlbnQsIFNXVC5NVUxUSSwgR3JpZERhdGEuRklMTF9CT1RILAotCQkJCWhlaWdodCwgMjAwLCAxLCAxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvTWlsZXN0b25lRG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGU1NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL01pbGVzdG9uZURvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucmljaHRleHQuSU1ldGhvZFJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotCi0vKioKLSAqIFRoZSBkb2N1bWVudCB0YWIgc2VjdGlvbiBmb3IgTWlsZXN0b25lCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZURvY3VtZW50U2VjdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24gewotCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgSU1ldGhvZFJpY2hUZXh0IG1haW5EZXNjOwotCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQlJTWV0aG9kUmljaFRleHQgY29udHJvbCA9IGV4cGFuZEZsYWcgPyBjdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCTogbWFpbkRlc2M7Ci0JCQlpZiAoIWNvbnRyb2wuZ2V0TW9kaWZpZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBvbGRDb250ZW50ID0gKChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkpCi0JCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKTsKLQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKG1haW5EZXNjLAotCQkJCQlvbGRDb250ZW50KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBuZXdDb250ZW50ID0gY29udHJvbC5nZXRUZXh0KCk7Ci0JCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwgbmV3Q29udGVudCwKLQkJCQkJCS0xKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJZWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI2NyZWF0ZURvY3VtZW50U2VjdGlvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlRG9jdW1lbnRTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0JCWludCBoZWlnaHRIaW50ID0gMjAwOwotCi0JCS8vIG1haW4gZGVzY3JpcHRpb24KLQkJUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIgbWFpbkRlc2NDb250YWluZXIgPSBGb3JtVUkuY3JlYXRlUmljaFRleHRXaXRoTGluayh0b29sa2l0LAotCQkJCWRvY3VtZW50Q29tcG9zaXRlLCBoZWlnaHRIaW50LCBjb250ZW50RWxlbWVudFBhdGgsIGVsZW1lbnQsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX21haW5EZXNjcmlwdGlvbik7Ci0JCWFkZEh5cGVyTGlua0xpc3RlbmVyKG1haW5EZXNjQ29udGFpbmVyLmxpbmspOwotCQltYWluRGVzYyA9IG1haW5EZXNjQ29udGFpbmVyLnJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jYWRkTGlzdGVuZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZExpc3RlbmVycygpOwotCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdChnZXRFbGVtZW50KCkpOwotCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQltYWluRGVzYy5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnREb2N1bWVudFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQltYWluRGVzYy5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50RG9jdW1lbnRTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBnZXRFZGl0b3IoKSkuc2F2ZU1vZGlmaWVkUmljaFRleHQoKTsKLQotCQkJCWVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZWxlbWVudAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCi0JCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJCW1haW5EZXNjLnJlbW92ZU1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7CQkKLQkJCQl9Ci0JCQkKLQkJCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCQlpZiAoY29udGVudE1vZGlmeUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJaWYgKGNvbnRlbnRNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50LmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCQkuc2V0RGlzYWJsZSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQltYWluRGVzYy5zZXRUZXh0KGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCi0JCQkJaWYgKGV4cGFuZEZsYWcpIHsKLQkJCQkJaWYgKGV4cGFuZERvY3VtZW50TGFiZWwuZ2V0VGV4dCgpLmVxdWFscygKLQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfbWFpbkRlc2NyaXB0aW9uKSkgCi0JCQkJCXsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0VGV4dChjb250ZW50Ci0JCQkJCQkJCS5nZXRNYWluRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkLnNldFNlbGVjdGlvbigwKTsKLQkJCQkJCWN0cmxfZG9jdW1lbnRfZXhwYW5kZWQuc2V0TW9kYWxPYmplY3QoY29udGVudCk7Ci0JCQkJCQljdHJsX2RvY3VtZW50X2V4cGFuZGVkCi0JCQkJCQkJCS5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjb250ZW50TW9kaWZ5TGlzdGVuZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB7Ci0JCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgY29udGVudE1vZGlmeUxpc3RlbmVyKQotCQkJCQkJCS5zZXREaXNhYmxlKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdChjb250ZW50KTsKLQkJCQltYWluRGVzYy5zZXRNb2RhbE9iamVjdEZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCW1haW5EZXNjLmFkZE1vZGlmeUxpc3RlbmVyKGNvbnRlbnRNb2RpZnlMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3Igd2hpbGUgcmVmcmVzaGluZyBtaWxlc3RvbmUgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIDoiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9PQlNSZWxhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3YjQ4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvT0JTUmVsYXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzUm9sZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGJhc2UgT0JTIHJlbGF0aW9uIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgT0JTUmVsYXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCB0b29sa2l0OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9hZGRfMSwgY3RybF9hZGRfMiwgY3RybF9yZW1vdmU7Ci0KLQlwcml2YXRlIFRhYmxlIGN0cmxfc2VsZWN0ZWQ7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzYzsKLQkKLQlwcml2YXRlIFN0cmluZyB0YWJsZTE7Ci0KLQkvLyBlbGVtZW50Ci0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCS8vIGFjdGlvbiBtYW5hZ2VyCi0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCS8vIGJ5IGRlZmF1bHQgdGhpcyBidXR0b24gaXMgZmFsc2UKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24gPSBmYWxzZTsKLQotCS8vIGZpbHRlcgotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcihnZXRDb25maWd1cmF0aW9uKCksIG51bGwsCi0JCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCQlpbml0KCk7Ci0KLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCS8vIGNyZWF0ZSBzZWN0aW9uCi0JCWNyZWF0ZVNlY3Rpb24ocGFyZW50KTsKLQotCQkvLyBhZGQgbGlzdGVuZXJzCi0JCWFkZExpc3RlbmVycygpOwotCi0JCS8vIHVwZGF0ZSBjb250cm9scwotCQl1cGRhdGVDb250cm9scygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBicmVha2Rvd25lbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkvLyBnZXQgdG9vbGtpdAotCQl0b29sa2l0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCi0JCS8vIGdldCBhY3Rpb24gbWFuYWdlcgotCQlhY3Rpb25NZ3IgPSBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRBY3Rpb25NYW5hZ2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFiRGF0YShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjLCBTdHJpbmcgdGFibGUxKSB7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5kZXNjID0gZGVzYzsKLQkJdGhpcy50YWJsZTEgPSB0YWJsZTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2VjdGlvbgotCQlTZWN0aW9uIGFTZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgcGFyZW50LAotCQkJCXRpdGxlLCBkZXNjKTsKLQotCQkvLyBjcmVhdGUgZ2VuZXJhbCBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgYVNlY3Rpb24sIDIsCi0JCQkJZmFsc2UpOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZTEpOwotCi0JCWN0cmxfc2VsZWN0ZWQgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEpOwotCQl2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF9zZWxlY3RlZCk7Ci0KLQkJaW5pdENvbnRlbnRQcm92aWRlcigpOwotCi0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBjb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkvLyBjcmVhdGUgYnV0dG9ucwotCQljdHJsX2FkZF8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQlpZiAoc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uKSB7Ci0JCQljdHJsX2FkZF8yID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCX0KLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IoY29tcG9zaXRlKTsKLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocGFuZTEpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgRGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVmYXVsdENvbmZpZ3VyYXRpb24oKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBnZXRBZGFwdGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCXBhcmVudCA9IGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHBhcmVudCkKLQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlyZXR1cm4gY29uZmlnOwotCQl9IGVsc2UgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiT0JTUmVsYXRpb25TZWN0aW9uOjpnZXREZWZhdWx0Q29uZmlndXJhdGlvbiAtIElCU0l0ZW1Qcm92aWRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGxpc3RlbmVycwotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8vIEFkZCBmb2N1cyBsaXN0ZW5lciBvbiBwcmltYXJ5IHRhc2tzIGxpc3QKLQkJY3RybF9zZWxlY3RlZC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9KTsKLQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkFkZERpYWxvZygpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChzaG93QWRkRnJvbVByb2Nlc3NCdXR0b24pIHsKLQkJCWN0cmxfYWRkXzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlvcGVuQWRkRnJvbVByb2Nlc3NEaWFsb2coKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCWN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZShybUl0ZW1zKTsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCQkvLyBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFbGVtZW50ICIrZWxlbWVudC5nZXROYW1lKCkgKwotCQkvLyAiRWRpdGFibGUtIitlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8xICE9IG51bGwpCi0JCQljdHJsX2FkZF8xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMiAhPSBudWxsKQotCQkJY3RybF9hZGRfMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQlpZiAoY3RybF9yZW1vdmUgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY3RybF9yZW1vdmUgIT0gbnVsbCkKLQkJCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQkvLyBwcm90ZWN0ZWQgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KQotCS8vIHsKLQkvLyBBY3Rpdml0eSBhY3Rpdml0eSA9IG51bGw7Ci0JLy8gQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPQotCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JLy8gYUZhY3RvcnkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyBPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JLy8gaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCS8vIHsKLQkvLyBhY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCS8vIH0KLQkvLwkJCi0JLy8gcmV0dXJuIGFjdGl2aXR5OwotCS8vIH0KLQkKLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCX0KLQotCS8qKgotCSAqIE9wZW4gVUkgRGlhbG9nIHRvIGFkZCBtZXRob2QgZWxlbWVudHMKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JfQotCi0JLyoqCi0JICogT3BlbiBVSSBEaWFsb2cgdG8gYWRkIGRlc2NyaXB0b3IgZWxlbWVudHMKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpIHsKLQl9Ci0KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGQoT2JqZWN0W10gaXRlbXMpIHt9Ci0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJY29udGVudFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3NvckRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGYzMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotLyoqCi0gKiBEaWFsb2cgZm9yIGFkZGluZyBwcmVkZWNlc3NvciBkZXBlbmRlbmN5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkZWNlc3NvckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIFRleHQgcHJlZElkVGV4dDsKLQotCXByaXZhdGUgVGV4dCBwcmVzZW50YXRpb25OYW1lOwotCi0JcHJpdmF0ZSBDb21ibyBkZXBlbmRlbmN5OwotCi0JLyoqIERlcGVuZGVuY3kgTGl0ZXJhbHMgKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fU1RBUlQgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fRklOSVNIID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX0ZJTklTSF9UT19GSU5JU0g7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX1NUQVJUID0gUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrT3JkZXJUeXBlX1NUQVJUX1RPX1NUQVJUOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIOyAKLQotCXByaXZhdGUgU3RyaW5nW10gZGVwZW5kZW5jeUxpc3QgPSBuZXcgU3RyaW5nW10geyBGSU5JU0hfVE9fU1RBUlQsCi0JCQlGSU5JU0hfVE9fRklOSVNILCBTVEFSVF9UT19TVEFSVCwgU1RBUlRfVE9fRklOSVNIIH07Ci0KLQlwcml2YXRlIFdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIE9iamVjdCBwcm9jZXNzOwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgTGlzdCBwcmVkZWNlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3QgcHJlZE1hcExpc3Q7Ci0KLQlwcml2YXRlIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JNYXAgcHJlZE1hcDsKLQotCS8qKgotCSAqIERpYWxvZyBmb3Igc2V0dGluZyBwcmVkZWNlc3NvciBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAJCQlUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAJCQlXb3JrIEJyZWFrIGRvd24gRWxlbWVudAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogCQkJUHJvY2VzcyBvZiB0aGUgd29ya2JyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogCQkJQWRhcHRlciBGYWN0b3J5IAotCSAqIEBwYXJhbSBwcmVkTWFwCi0JICogCQkJUHJlZGVjZXNzb3IgTWFwCi0JICogQHBhcmFtIHByZWRNYXBMaXN0Ci0JICogCQkJUHJlZGVjZXNzb3IgTWFwIGxpc3QKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogCQkJQWN0aW9uIE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQsCi0JCQlPYmplY3QgcHJvY2VzcywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlQcmVkZWNlc3Nvck1hcCBwcmVkTWFwLCBMaXN0IHByZWRNYXBMaXN0LCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCi0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5wcmVkTWFwID0gcHJlZE1hcDsKLQkJdGhpcy5wcmVkTWFwTGlzdCA9IHByZWRNYXBMaXN0OwotCQl0aGlzLmFjdGlvbk1nciA9IGFjdGlvbk1ncjsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBkaWFsb2cgaGVhZGVyCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfSGVhZGVyTWVzc2FnZSk7IAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIGJsYW5rIGxhYmVsCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIFByZWRlY2Vzc29yIElEIGluZGV4Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfSW5kZXgpOyAKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcHJlZElkVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDEwMDsKLQkJcHJlZElkVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCS8vIHByZWRJZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCS8vIFByZXNlbnRhaW9uIE5hbWUKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19QcmVzZW50YXRpb25OYW1lKTsgCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXByZXNlbnRhdGlvbk5hbWUgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCXByZXNlbnRhdGlvbk5hbWUuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlwcmVzZW50YXRpb25OYW1lLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVdvcmtPcmRlciB3byA9IHByZWRNYXAuZ2V0V29ya09yZGVyKCk7Ci0JCXByZXNlbnRhdGlvbk5hbWUuc2V0VGV4dChQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHdvLmdldFByZWQoKSkpOwotCi0JCS8vIERlcGVuZGVuY3kKLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5QcmVkZWNlc3NvckRpYWxvZ19EZXBlbmRlbmN5KTsgCi0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWRlcGVuZGVuY3kgPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyk7Ci0JCWRlcGVuZGVuY3kuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWRlcGVuZGVuY3kuc2V0SXRlbXMoZGVwZW5kZW5jeUxpc3QpOwotCi0JCVN0cmluZyBkZXBlZGVuY3lOYW1lID0gd28uZ2V0TGlua1R5cGUoKS5nZXROYW1lKCk7Ci0JCWlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IEZJTklTSF9UT19GSU5JU0g7Ci0JCX0gZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IEZJTklTSF9UT19TVEFSVDsKLQkJfSBlbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIKSB7Ci0JCQlkZXBlZGVuY3lOYW1lID0gU1RBUlRfVE9fRklOSVNIOwotCQl9IGVsc2UgaWYgKHdvLmdldExpbmtUeXBlKCkgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCkgewotCQkJZGVwZWRlbmN5TmFtZSA9IFNUQVJUX1RPX1NUQVJUOwotCQl9Ci0JCWRlcGVuZGVuY3kuc2V0VGV4dChkZXBlZGVuY3lOYW1lKTsKLQotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGluZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlwcmVkSWRUZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IG5ld0lkOwotCQkJCXRyeSB7Ci0JCQkJCW5ld0lkID0gbmV3IEludGVnZXIocHJlZElkVGV4dC5nZXRUZXh0KCkpLmludFZhbHVlKCk7Ci0JCQkJCWlmIChuZXdJZCA8IDApCi0JCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX3ByZWRlY2Vzc29yc192YWxpZE51bWJlclRpdGxlLCAKLQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlKTsgCi0KLQkJCQkJcHJlZElkVGV4dC5zZXRUZXh0KG5ldyBJbnRlZ2VyKHByZWRNYXAuZ2V0SWQoKSkudG9TdHJpbmcoKSk7Ci0JCQkJCXByZWRJZFRleHQuc2V0Rm9jdXMoKTsKLQkJCQkJcHJlZElkVGV4dC5zZWxlY3RBbGwoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChhbHJlYWR5RXhpc3RzKG5ld0lkKSkgewotCQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQotCQkJCQlwcmVkSWRUZXh0LnNlbGVjdEFsbCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHByZWRJRExpc3QgPSBnZXRQcmVkSWQobmV3SWQpOwotCQkJCWlmIChwcmVkSURMaXN0ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCVN0cmluZyBzdHIgPSBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdChlbGVtZW50LAotCQkJCQkJcHJlZElETGlzdCwgYWRhcHRlckZhY3RvcnksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0JCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgc3RyKTsgCi0JCQkJCXByZWRJZFRleHQuc2V0VGV4dChuZXcgSW50ZWdlcihwcmVkTWFwLmdldElkKCkpLnRvU3RyaW5nKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXByZXNlbnRhdGlvbk5hbWUuc2V0VGV4dChnZXROYW1lKG5ld0lkKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZXNlbnRhdGlvbiBuYW1lL25hbWUgZm9yIHRoaXMgcHJlZGVjZXNzb3IgaWQKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShpbnQgbmV3SWQpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJcHJvY2Vzcyk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlJbnRlZ2VyIGlkID0gbmV3IEludGVnZXIoaXRlbVByb3ZpZGVyLmdldElkKCkpOwotCQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQotCQkJaWYgKG5ld0lkID09IGlkLmludFZhbHVlKCkpIHsKLQkJCQluYW1lID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmopLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJCW5hbWUgPSAoKEJyZWFrZG93bkVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgd2hldGhlciBwcmVkZWNlc3NvciBJZCBhbHJlYWR5IGV4aXN0cwotCSAqIAotCSAqIEBwYXJhbSBuZXdJZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUV4aXN0cyhpbnQgbmV3SWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZE1hcExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSAoUHJlZGVjZXNzb3JNYXApIGl0b3IubmV4dCgpOwotCQkJaWYgKChtYXAuZ2V0SWQoKSA9PSBuZXdJZCkgJiYgKHByZWRNYXAuZ2V0SWQoKSAhPSBuZXdJZCkpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZSwgCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2UpOyAKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29tbWFuZCBzZXBhcmF0ZWQgbGlzdCBvZiBhbGwgcHJlZGVjZXNzb3IKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKGludCBuZXdJZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWlmIChwcmVkTWFwLmdldElkKCkgPT0gbWFwLmdldElkKCkpIHsKLQkJCQlidWYuYXBwZW5kKG5ld0lkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVmLmFwcGVuZChtYXAuZ2V0SWQoKSk7Ci0JCQl9Ci0KLQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHBhcmVudCk7Ci0JCXBhcmVudAotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfVGl0bGUpOyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkvLyBuZXcgaWQKLQkJaW50IG5ld0lkID0gbmV3IEludGVnZXIocHJlZElkVGV4dC5nZXRUZXh0KCkpLmludFZhbHVlKCk7Ci0JCS8vIG5lIGxpbmsgdHlwZQotCQlXb3JrT3JkZXJUeXBlIHdvcmtPcmRlclR5cGUgPSBnZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkJaWYgKChuZXdJZCAhPSBwcmVkTWFwLmdldElkKCkpCi0JCQkJfHwgKCF3b3JrT3JkZXJUeXBlLmVxdWFscyhwcmVkTWFwLmdldFdvcmtPcmRlcigpLmdldExpbmtUeXBlKCkpKSkgewotCQkJU3RyaW5nIHByZWRJRExpc3QgPSBnZXRQcmVkSWQobmV3SWQpOwotCQkJaWYgKHByZWRJRExpc3QgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCVN0cmluZyBzdHIgPSBQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdChlbGVtZW50LCBwcmVkSURMaXN0LAotCQkJCQlhZGFwdGVyRmFjdG9yeSwgcHJvY2VzcywgcHJlZGVjZXNzb3JzKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvckRpYWxvZ1RpdGxlLCBzdHIpOyAKLQkJCQlwcmVkSWRUZXh0LnNldFRleHQobmV3IEludGVnZXIocHJlZE1hcC5nZXRJZCgpKS50b1N0cmluZygpKTsKLQkJCX0KLQotCQkJLy8gcmVtb3ZlIGl0Ci0JCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCXByZWRNYXAuZ2V0V29ya09yZGVyKCksIC0xKTsKLQkJCWlmICghc3RhdHVzKSB7Ci0JCQkJY2xvc2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0KLQkJCWludCBzaXplID0gcHJlZGVjZXNzb3JzLnNpemUoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkZWNlc3NvcnMKLQkJCQkJCS5nZXQoaSk7Ci0KLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZmluZF9wcmVkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudAotCQkJCQkJLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICh3by5nZXRQcmVkKCkgPT0gZSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghZm91bmQpIHsKLQkJCQkJV29ya09yZGVyIHdvID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCk7Ci0JCQkJCXdvLnNldFByZWQoZSk7Ci0JCQkJCXdvLnNldExpbmtUeXBlKHdvcmtPcmRlclR5cGUpOwotCQkJCQlib29sZWFuIHN0YXQgPSBhY3Rpb25NZ3IKLQkJCQkJCQkuZG9BY3Rpb24oCi0JCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQl3bywgLTEpOwotCQkJCQlpZiAoIXN0YXQpCi0JCQkJCQlyZXR1cm47Ci0KLQkJCQkJcHJlZE1hcC5zZXRJZChuZXdJZCk7Ci0JCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKHdvKTsKLQkJCQkJcHJlZE1hcExpc3QuYWRkKHByZWRNYXApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIEdldCB3b3JrIG9yZGVyIGxpbmsgdHlwZSBmcm9tIFVJCi0JICogCi0JICogQHJldHVybiAKLQkgKiAJCQlXb3JrIE9yZGVyIHR5cGUKLQkgKi8KLQlwcml2YXRlIFdvcmtPcmRlclR5cGUgZ2V0V29ya09yZGVyVHlwZSgpIHsKLQkJaW50IGluZGV4ID0gZGVwZW5kZW5jeS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlXb3JrT3JkZXJUeXBlIHR5cGU7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQ7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gMSkgewotCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSDsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSAyKSB7Ci0JCQl0eXBlID0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVDsKLQkJfSBlbHNlIHsKLQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSDsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCi0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9QcmVkZWNlc3Nvck1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDUwMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1ByZWRlY2Vzc29yTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiBNYXAgb2YgcHJlZGVjZXNzb3IgSUQgYW5kIGNvcnJlc3BvbmRpbmcgd29yayBvcmRlcgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVkZWNlc3Nvck1hcCB7Ci0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcml2YXRlIFdvcmtPcmRlciB3bzsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIAkJUHJlZGVjZXNzb3IgSUQKLQkgKiBAcGFyYW0gd28KLQkgKiAJCVdvcmtPcmRlciBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JNYXAoaW50IGlkLCBXb3JrT3JkZXIgd28pIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLndvID0gd287Ci0JfQotCi0JLyoqCi0JICogR2V0IHByZWRlY2Vzc29yIElECi0JICogQHJldHVybgotCSAqIAkJCVByZWRlY2Vzc29yIElECi0JICovCi0JcHVibGljIGludCBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IFByZWRlY2Vzc29yIElECi0JICogQHBhcmFtIGlkCi0JICogCQkJUHJlZGVjZXNzb3IgSUQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkKLQkvKioKLQkgKiBHZXQgd29yayBvcmRlcgotCSAqIEByZXR1cm4KLQkgKiAJCVdvcmsgT3JkZXIKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGdldFdvcmtPcmRlcigpIHsKLQkJcmV0dXJuIHRoaXMud287Ci0JfQotCi0JLyoqCi0JICogU2V0IFdvcmsgT3JkZXIKLQkgKiBAcGFyYW0gd28KLQkgKiAJCQlXb3JrIE9yZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya09yZGVyKFdvcmtPcmRlciB3bykgewotCQl0aGlzLndvID0gd287Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODJkZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLS8qKgotICogUHJvcGVydGllcyByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnRpZXNSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gUHJvcGVydGllc1Jlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCi0JCQkJCQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X2d1aWRhbmNlSW5mb3JtYXRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X29wdGlvbkluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfZGV0YWlsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaWxlc3RvbmVfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlsZXN0b25lX2RldGFpbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3Jfc3RlcEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXNjcmlwdG9yX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfYnJpZWZEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX21haW5EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX3B1cnBvc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlX1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlX1JvbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UeXBlX1dvcmtQcm9kdWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0X1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfTW9kZWxJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfcHJlc2VudGF0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9hbHRlcm5hdGl2ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfaG93VG9TdGFmZjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X2tleUNvbnNpZGVyYXRpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfdXNhZ2VHdWlkYW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Sb2FkbWFwVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRWR1Y2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9Sb2FkbWFwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1NlbGVjdGVkX0dlbmVyYWxHdWlkYW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfU2VsZWN0ZWRfRWR1Y2F0aW9uTWF0ZXJpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfRGlhZ3JhbVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0RpYWdyYW1EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9BREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X0FEREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dQREltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1VzZUFESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVXNlQURESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVXNlV1BESW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfQXNzaWduOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1dvcmtSb2xsdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfVGVhbVJvbGx1cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlfV29ya1JvbGx1cERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5X1RlYW1Sb2xsdXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eV9Xb3JrUHJvZHVjdHNSb2xsdXBEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9NdWx0aXBsZU9jdXJyYW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9PcHRpb25hbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9FdmVudERyaXZlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9PbmdvaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX0RFUEVOREVOQ1lfVEVYVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0FkZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRfU3RlcHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1N0ZXBEaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGU0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfVGFza3NfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX1JvbGVzX1RhYmxlMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9UeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdQRGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1RlYW1fU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbXBvc2l0ZVJvbGVfUm9sZV9TZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcG9zaXRlUm9sZV9Sb2xlX1NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21wb3NpdGVSb2xlX1JvbGVfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRlYW1Qcm9maWxlX1JvbGVfVGFibGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfUmljaFRleHRfQ29sbGFwc2VJbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JpY2hUZXh0X0V4cGFuZEltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQWRkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQWRkRnJvbVByb2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19SZW5hbWVfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JlbW92ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfRG93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQnV0dG9uX0xpbmtNZXRob2RFbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWROYW1lVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19JbnZhbGlkTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1JlbmFtZV9UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRQcmVzZW50YXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX1RlYW1EaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Db21wb3NpdGVSb2xlQXNzaWduRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc19Ob0l0ZW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NfSXRlbXNTZWxlY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzX05vUHJvcGVydGllc0F2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19IZWFkZXJNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX0luZGV4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWRlY2Vzc29yRGlhbG9nX1ByZXNlbnRhdGlvbk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfRGVwZW5kZW5jeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVkZWNlc3NvckRpYWxvZ19QcmVkZWNlc3NvckVycm9yRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3BlcnRpZXNSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Qcm9wZXJ0aWVzVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2VmMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9wZXJ0aWVzIAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHR5cGUgb2YgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogCQlUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBwcmVmaXggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLkJyZWFrZG93bkVsZW1lbnRfVHlwZV9OYW1lOyAKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXByZWZpeCA9IExpYnJhcnlVSVRleHQuVEVYVF9DQVBBQklMSVRZX1BBVFRFUk47Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfREVMSVZFUllfUFJPQ0VTUzsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJPQ0VTUzsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1BIQVNFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0lURVJBVElPTjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX0FDVElWSVRZOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEFTS19ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlwcmVmaXggPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9MRV9ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVF9ERVNDUklQVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX01JTEVTVE9ORTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJcHJlZml4ID0gTGlicmFyeVVJVGV4dC5URVhUX1RFQU1fUFJPRklMRTsKLQkJfQotCi0JCXJldHVybiBwcmVmaXg7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0eXBlIG9mIHRoZSBvYmplY3QgaW4gbG93ZXIgY2FzZQotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICogCQlUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZUxvd2VyKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHR5cGUgPSBnZXRUeXBlKG9iaik7Ci0JCQotCQlyZXR1cm4gU3RyVXRpbC50b0xvd2VyKHR5cGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Byb3BlcnRpZXNWaWV3Q29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1ZpZXdDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2NzUwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUHJvcGVydGllc1ZpZXdDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIHByb3BlcnRpZXMgdmlldwotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc1ZpZXdDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ERVNDUklQVE9SID0gIlJvbGVEZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1BST0RVQ1RTID0gIldvcmtQcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfREVTQ1JJUFRPUiA9ICJUYXNrRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVTID0gIlJvbGVzIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVsYXRpb25TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVsYXRpb25TZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDllYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbGF0aW9uU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgdXNlZCB0byBkaXNwbGF5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGlvblNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JLy8gZWxlbWVudAotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQkvLyBhY3Rpb24gbWFuYWdlcgotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF8yLCBjdHJsX2FkZF8zLCBjdHJsX2FkZF80OwotCi0JcHJpdmF0ZSBCdXR0b24gY3RybF9yZW1vdmVfMSwgY3RybF9yZW1vdmVfMiwgY3RybF9yZW1vdmVfMywgY3RybF9yZW1vdmVfNDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfYWRkX3Byb2NfMSwgY3RybF9hZGRfcHJvY18yLCBjdHJsX2FkZF9wcm9jXzMsCi0JCQljdHJsX2FkZF9wcm9jXzQ7OwotCi0JcHJpdmF0ZSBUYWJsZSBjdHJsX3RhYmxlXzEsIGN0cmxfdGFibGVfMiwgY3RybF90YWJsZV8zLCBjdHJsX3RhYmxlXzQ7Ci0KLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIxLCB0YWJsZVZpZXdlcjIsIHRhYmxlVmlld2VyMywKLQkJCXRhYmxlVmlld2VyNDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmX2Rlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWJTdHJpbmc7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGUsIGRlc2MsIHRhYmxlMSwgdGFibGUyLCB0YWJsZTMsIHRhYmxlNDsKLQotCXByaXZhdGUgaW50IHRhYmxlQ291bnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZDsKLQotCVByb2Nlc3MgcHJvY2VzczsKLQotCUlGaWx0ZXIgZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCWluaXQoKTsKLQotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gY3JlYXRlIHNlY3Rpb24KLQkJY3JlYXRlU2VjdGlvbihwYXJlbnQpOwotCi0JCS8vIGFkZCBsaXN0ZW5lcnMKLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRyb2xzCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJEYXRhKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFN0cmluZyB0YWJsZTEsIFN0cmluZyB0YWJsZTIsIFN0cmluZyB0YWJsZTMsIFN0cmluZyB0YWJsZTQsIFN0cmluZyB0YWJTdHJpbmcpIHsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl0aGlzLnRhYmxlMSA9IHRhYmxlMTsKLQkJdGhpcy50YWJsZTIgPSB0YWJsZTI7Ci0JCXRoaXMudGFibGUzID0gdGFibGUzOwotCQl0aGlzLnRhYmxlNCA9IHRhYmxlNDsKLQkJCi0JCXRoaXMudGFiU3RyaW5nID0gdGFiU3RyaW5nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlRGF0YShpbnQgdGFibGVDb3VudCwgYm9vbGVhbltdIGNoYW5nZXNBbGxvd2VkKSB7Ci0JCXRoaXMudGFibGVDb3VudCA9IHRhYmxlQ291bnQ7Ci0JCXRoaXMuY2hhbmdlc0FsbG93ZWQgPSBjaGFuZ2VzQWxsb3dlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBnZXQgZGVzY3JpcHRvciBvYmplY3QKLQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gZ2V0IHRvb2xraXQKLQkJdG9vbGtpdCA9IGdldFdpZGdldEZhY3RvcnkoKTsKLQotCQkvLyBnZXQgYWN0aW9uIG1hbmFnZXIKLQkJYWN0aW9uTWdyID0gRVBGUHJvcGVydHlTaGVldFBhZ2UuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuQWJzdHJhY3RQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJ5IHsKLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJZWxlbWVudCA9IChEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0KLQkJCQlpbml0Q29udGVudFByb3ZpZGVyMSgpOwotCQkJCWluaXRDb250ZW50UHJvdmlkZXIyKCk7Ci0JCQkJaW5pdENvbnRlbnRQcm92aWRlcjMoKTsKLQkJCQlpbml0Q29udGVudFByb3ZpZGVyNCgpOwotCi0JCQkJLy8gaGlkZS9zaG93IGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlCi0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIGRlc2NyaXB0b3IgcmVsYXRpb24gc2VjdGlvbjogIiArIGVsZW1lbnQsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIGNvbnRyb2xzIGJhc2VkIG9uIGVkaXRhYmxlIGJvb2xlYW4gdmFsdWUuIENvbnRyb2xzIGNvdWxkIGJlCi0JICogZWRpdGFibGUgb3IgcmVhZC1vbmx5IGFmdGVyIHRoaXMuCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRWxlbWVudCAiK2VsZW1lbnQuZ2V0TmFtZSgpICsKLQkJLy8gIkVkaXRhYmxlLSIrZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfMSAhPSBudWxsKQotCQkJY3RybF9hZGRfMS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkXzIgIT0gbnVsbCkKLQkJCWN0cmxfYWRkXzIuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF8zICE9IG51bGwpCi0JCQljdHJsX2FkZF8zLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfNCAhPSBudWxsKQotCQkJY3RybF9hZGRfNC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQotCQlpZiAoY3RybF9hZGRfcHJvY18xICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX2FkZF9wcm9jXzIgIT0gbnVsbCkKLQkJCWN0cmxfYWRkX3Byb2NfMi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJaWYgKGN0cmxfYWRkX3Byb2NfMyAhPSBudWxsKQotCQkJY3RybF9hZGRfcHJvY18zLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfcHJvY180ICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjEKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKHRydWUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmVfMS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCWlmICh0YWJsZVZpZXdlcjIgIT0gbnVsbCkgewotCQkJc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlcjIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDAgJiYgZWRpdGFibGUpIHsKLQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCQlpZiAoY3RybF9yZW1vdmVfMiAhPSBudWxsKQotCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFibGVWaWV3ZXIzICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIzLmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwICYmIGVkaXRhYmxlKSB7Ci0JCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQljdHJsX3JlbW92ZV8zLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRhYmxlVmlld2VyNCAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyNC5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3RybF9yZW1vdmVfNC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UgYWxsIGxhYmVsIGFuZCBjb250ZW50IHByb3ZpZGVycwotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZmlyc3QgdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBzZWNvbmQgdGFibGUgaW4gcHJvcGVydGllcyB2aWV3Ci0JICoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSB0aGlyZCB0YWJsZSBpbiBwcm9wZXJ0aWVzIHZpZXcKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIzKCkgewotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIGZvdXJ0aCB0YWJsZSBpbiBwcm9wZXJ0aWVzIHZpZXcKLQkgKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXI0KCkgewotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIGRlc2NyaXB0b3JzIGZyb20gdGhlIHByb2Nlc3MKLQkgKiBAcmV0dXJuCi0JICogCQkJTGlzdCBvZiBkZXNjcmlwdG9ycwotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZmlsdGVyIHdoaWNoIGFsbG93cyBmaWx0ZXJpbmcgZWxlbWVudCBiYXNlZCBvbiBtZXRob2QgY29uZmlndXJhdGlvbiAKLQkgKiBAcmV0dXJuCi0JICogCQlGaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpbnQgdGFibGVIZWlnaHQgPSA4MDsKLQotCQkvLyBjcmVhdGUgc2VjdGlvbgotCQlTZWN0aW9uIGFTZWN0aW9uID0gRm9ybVVJLmNyZWF0ZVNlY3Rpb24odG9vbGtpdCwgY29tcG9zaXRlLAotCQkJCXRpdGxlLCBkZXNjKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBhU2VjdGlvbiwKLQkJCQkyLCBmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIDEKLQkJaW50IGNvdW50ID0gMDsKLQkJewotCQkJQ29tcG9zaXRlIHBhbmUxID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZTEpOwotCi0JCQljdHJsX3RhYmxlXzEgPSBGb3JtVUkuY3JlYXRlVGFibGUodG9vbGtpdCwgcGFuZTEsIHRhYmxlSGVpZ2h0KTsKLQkJCXRhYmxlVmlld2VyMSA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3RhYmxlXzEpOwotCQkJaW5pdENvbnRlbnRQcm92aWRlcjEoKTsKLQotCQkJdGFibGVWaWV3ZXIxLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCQl0YWJsZVZpZXdlcjEuc2V0SW5wdXQoZWxlbWVudCk7Ci0KLQkJCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTEKLQkJCUNvbXBvc2l0ZSBwYW5lMiA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzEgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQkJCWN0cmxfcmVtb3ZlXzEgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvLyBjcmVhdGUgdGFibGUyCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCUNvbXBvc2l0ZSBwYW5lMyA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBwYW5lMywgdGFibGUyKTsKLQotCQkJY3RybF90YWJsZV8yID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUzLCB0YWJsZUhlaWdodCk7Ci0JCQl0YWJsZVZpZXdlcjIgPSBuZXcgVGFibGVWaWV3ZXIoY3RybF90YWJsZV8yKTsKLQkJCWluaXRDb250ZW50UHJvdmlkZXIyKCk7Ci0KLQkJCXRhYmxlVmlld2VyMi5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQkJdGFibGVWaWV3ZXIyLnNldElucHV0KGVsZW1lbnQpOwotCi0JCQkvLyBjcmVhdGUgYnV0dG9ucyBmb3IgdGFibGUyCi0JCQlDb21wb3NpdGUgcGFuZTQgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpOwotCQkJaWYgKGNoYW5nZXNBbGxvd2VkW2NvdW50XSkgewotCQkJCWN0cmxfYWRkXzIgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU0LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZCk7IAotCQkJCWN0cmxfYWRkX3Byb2NfMiA9IEZvcm1VSQotCQkJCQkJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNCwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0FkZEZyb21Qcm9jZXNzKTsgCi0JCQkJY3RybF9yZW1vdmVfMiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTQsCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHBhbmUzKTsKLQkJfQotCi0JCWNvdW50Kys7Ci0KLQkJLy8gQ3JlYXRlIHRhYmxlMwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQlDb21wb3NpdGUgcGFuZTUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTUsIHRhYmxlMyk7Ci0KLQkJCWN0cmxfdGFibGVfMyA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNSwgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXIzID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMyk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyMygpOwotCi0JCQl0YWJsZVZpZXdlcjMuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyMy5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlMgotCQkJQ29tcG9zaXRlIHBhbmU2ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lNiwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzMgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTYsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQkJCWN0cmxfcmVtb3ZlXzMgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU2LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lNSk7Ci0JCX0KLQkJY291bnQrKzsKLQotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQlDb21wb3NpdGUgcGFuZTcgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJCUdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgcGFuZTcsIHRhYmxlNCk7Ci0KLQkJCWN0cmxfdGFibGVfNCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lNywgdGFibGVIZWlnaHQpOwotCQkJdGFibGVWaWV3ZXI0ID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfNCk7Ci0JCQlpbml0Q29udGVudFByb3ZpZGVyNCgpOwotCi0JCQl0YWJsZVZpZXdlcjQuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCXRhYmxlVmlld2VyNC5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkJLy8gY3JlYXRlIGJ1dHRvbnMgZm9yIHRhYmxlNAotCQkJQ29tcG9zaXRlIHBhbmU4ID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCQlHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIKLQkJCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF80ID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lOCwKLQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJCQljdHJsX2FkZF9wcm9jXzQgPSBGb3JtVUkKLQkJCQkJCS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTgsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGRGcm9tUHJvY2Vzcyk7IAotCQkJCWN0cmxfcmVtb3ZlXzQgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmU4LAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1JlbW92ZSk7IAotCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lOCk7Ci0KLQkJfQotCi0JCS8vIGNyZWF0ZSBicmllZiBkZXNjcmlwdGlvbgotCQlpbnQgaGVpZ2h0SGludCA9IDQwOwotCQkvLyBpbnQgaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX2JyaWVmRGVzY3JpcHRpb24sIGhlaWdodEhpbnQpOyAKLQkJY3RybF9icmllZl9kZXNjID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgc2VjdGlvbkNvbXBvc2l0ZSwKLQkJCQloZWlnaHRIaW50LCBoZWlnaHRIaW50KTsKLQkJY3RybF9icmllZl9kZXNjLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihzZWN0aW9uQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGRMaXN0ZXJlcnMKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCS8qKgotCQkgKiBGaXJzdCBzZXQgb2YgbGlzdGVuZXJzCi0JCSAqLwotCQlpbnQgY291bnQgPSAwOwotCQlpZiAoY291bnQgPCB0YWJsZUNvdW50KSB7Ci0JCQljdHJsX3RhYmxlXzEuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNBZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCXRhYmxlVmlld2VyMQotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMQotCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCWlmICgoc2VsZWN0aW9uLnNpemUoKSA+IDApICYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzEuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmIChjaGFuZ2VzQWxsb3dlZFtjb3VudF0pIHsKLQkJCQljdHJsX2FkZF8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMSgpKTsKLQotCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJLmdldFNoZWxsKCksIGZpbHRlciwgZWxlbWVudCwgdGFiU3RyaW5nLAotCQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQlmZC5zZXRUaXRsZSh0YWJTdHJpbmcpOwotCQkJCQkJZmQub3BlbigpOwotCQkJCQkJYWRkSXRlbXMxKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQl0YWJsZVZpZXdlcjEucmVmcmVzaCgpOwotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHMxKCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczEoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjEucmVmcmVzaCgpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIxCi0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zMShybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjEucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJY291bnQrKzsKLQotCQkvKioKLQkJICogU2Vjb25kIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfMi5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQkJCQljdHJsX3JlbW92ZV8yLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXIyCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIyCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJCQkJaWYgKGN0cmxfcmVtb3ZlXzIgIT0gbnVsbCkKLQkJCQkJCQkJCWN0cmxfcmVtb3ZlXzIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJCQlTdHJpbmcgZGVzYyA9ICgoTWV0aG9kRWxlbWVudCkgc2VsZWN0aW9uCi0JCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKQotCQkJCQkJCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJCWlmIChkZXNjID09IG51bGwpIHsKLQkJCQkJCQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KGRlc2MpOwotCQkJCQkJCX0gZWxzZSBpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDEpIHsKLQkJCQkJCQkJY3RybF9icmllZl9kZXNjCi0JCQkJCQkJCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uICsgIiAtICIgKyBzZWxlY3Rpb24uc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCi0JCQlpZiAoY2hhbmdlc0FsbG93ZWRbY291bnRdKSB7Ci0JCQkJY3RybF9hZGRfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZ2V0RXhpc3RpbmdFbGVtZW50czIoKSk7Ci0JCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkuZ2V0U2hlbGwoKSwgZmlsdGVyLCBlbGVtZW50LCB0YWJTdHJpbmcsCi0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCWZkLnNldFRpdGxlKHRhYlN0cmluZyk7Ci0JCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQlhZGRJdGVtczIoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCXRhYmxlVmlld2VyMi5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfYWRkX3Byb2NfMi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgPSBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpOwotCQkJCQkJcHJvY2VzcyA9IGdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IGdldEV4aXN0aW5nRWxlbWVudHMyKCk7Ci0JCQkJCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coCi0JCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCQkJCQkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyLCBwcm9jZXNzLAotCQkJCQkJCQkJZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSwgZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCQkJYWRkRnJvbVByb2Nlc3NJdGVtczIoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMgotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczIocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIyLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjIuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIFRoaXJkIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfMy5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIzCi0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXIzCi0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXIzCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzMuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzMygpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zMyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX2FkZF9wcm9jXzMuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCWRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyID0gZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKTsKLQkJCQkJCXByb2Nlc3MgPSBnZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIgIT0gbnVsbCAmJiBwcm9jZXNzICE9IG51bGwpIHsKLQkJCQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBnZXRFeGlzdGluZ0VsZW1lbnRzMygpOwotCQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKAotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciwgcHJvY2VzcywKLQkJCQkJCQkJCWdldERlc2NyaXB0b3JUYWJOYW1lKCksIGV4aXN0aW5nRWxlbWVudHMpOwotCi0JCQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCQkJZmQub3BlbigpOwotCQkJCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMzKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQljdHJsX3JlbW92ZV8zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyMwotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJcm1JdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJCQlyZW1vdmVJdGVtczMocm1JdGVtcyk7Ci0JCQkJCQkJdGFibGVWaWV3ZXIzLnJlZnJlc2goKTsKLQotCQkJCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJCQl0YWJsZVZpZXdlcjMuc2V0U2VsZWN0aW9uKG51bGwsIHRydWUpOwotCQkJCQkJCWN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJY3RybF9yZW1vdmVfMy5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JCWNvdW50Kys7Ci0KLQkJLyoqCi0JCSAqIEZvdXRoIHNldCBvZiBsaXN0ZW5lcnMKLQkJICovCi0JCWlmIChjb3VudCA8IHRhYmxlQ291bnQpIHsKLQkJCWN0cmxfdGFibGVfNC5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkKLQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJdGFibGVWaWV3ZXI0Ci0JCQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpCi0JCQkJCQkJCWN0cmxfcmVtb3ZlXzQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQkJCVN0cmluZyBkZXNjID0gKChNZXRob2RFbGVtZW50KSBzZWxlY3Rpb24KLQkJCQkJCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVzYyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoZGVzYyk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJCQkJCQljdHJsX2JyaWVmX2Rlc2MKLQkJCQkJCQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTXVsdGlwbGVTZWxlY3Rpb24gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOyAvLyROT04tTkxTLTEkIAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0KLQkJCWlmICgobmV3IEJvb2xlYW4oY2hhbmdlc0FsbG93ZWRbY291bnRdKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQljdHJsX2FkZF80LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50TGlzdChnZXRFeGlzdGluZ0VsZW1lbnRzNCgpKTsKLQkJCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCS5nZXRTaGVsbCgpLCBmaWx0ZXIsIGVsZW1lbnQsIHRhYlN0cmluZywKLQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJZmQuc2V0VGl0bGUodGFiU3RyaW5nKTsKLQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCWFkZEl0ZW1zNChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJdGFibGVWaWV3ZXI0LnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJY3RybF9hZGRfcHJvY180LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlkZXNjcmlwdG9yUHJvY2Vzc2ZpbHRlciA9IGdldEZpbHRlckZvckRlc2NyaXB0b3JzKCk7Ci0JCQkJCQlwcm9jZXNzID0gZ2V0UHJvY2VzcygpOwotCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9jZXNzZmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gZ2V0RXhpc3RpbmdFbGVtZW50czQoKTsKLQkJCQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZygKLQkJCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkJCQkJZGVzY3JpcHRvclByb2Nlc3NmaWx0ZXIsIHByb2Nlc3MsCi0JCQkJCQkJCQlnZXREZXNjcmlwdG9yVGFiTmFtZSgpLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCQkJCWZkLm9wZW4oKTsKLQkJCQkJCQlhZGRGcm9tUHJvY2Vzc0l0ZW1zNChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQkJCQkJCXRhYmxlVmlld2VyNC5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCWN0cmxfcmVtb3ZlXzQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGFibGVWaWV3ZXI0Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJCQlBcnJheUxpc3Qgcm1JdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlybUl0ZW1zLmFkZEFsbChzZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJCQkJCXJlbW92ZUl0ZW1zNChybUl0ZW1zKTsKLQkJCQkJCQl0YWJsZVZpZXdlcjQucmVmcmVzaCgpOwotCi0JCQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQkJCXRhYmxlVmlld2VyNC5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0JCQkJCQkJY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQljdHJsX3JlbW92ZV80LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczEoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMihMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMzKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczQoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMihMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczMoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXM0KExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczEoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMihMaXN0IGxpc3QpIHsKLQl9OwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgbGlzdCkgewotCX07Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczQoTGlzdCBsaXN0KSB7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMxKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czIoKSB7Ci0JCXJldHVybiBudWxsOwotCX07Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfTsKLQotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHM0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9OwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JlbW92ZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyM2RiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogQ29tbWFuZCB0byByZW1vdmUgZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50czsKLQotCXByaXZhdGUgRGVzY3JpcHRvciBkZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBDb21tYW5kIGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBmZWF0dXJlSUQ7Ci0KLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlczsKLQotCS8qKgotCSAqIFJlbW92ZSByZWxhdGlvbnNoaXBzCi0JICovCi0JcHVibGljIFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKERlc2NyaXB0b3IgZGVzYywgTGlzdCBlbGVtZW50cywgaW50IGZlYXR1cmVJRCkgewotCi0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmRlc2MgPSBkZXNjOwotCQl0aGlzLmZlYXR1cmVJRCA9IGZlYXR1cmVJRDsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQotCQlMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlEZXNjcmlwdG9yIG8gPSAoRGVzY3JpcHRvcikgZWxlbWVudHMuZ2V0KGkpOwotCi0JCQlib29sZWFuIGNoZWNrUmVmOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpCi0JCQl7Ci0JCQkJY2hlY2tSZWYgPSBQcm9jZXNzVXRpbC5jaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclJlZmVyZW5jZXMoQ29sbGVjdGlvbnMKLQkJCQkuc2luZ2xldG9uKGRlc2MpLCAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvLCB0cnVlLCBmZWF0dXJlSUQpOwotCQkJfQotCQkJZWxzZQotCQkJCWNoZWNrUmVmID0gUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyhkZXNjLCBvKTsKLQkJCQotCQkJaWYgKCFjaGVja1JlZikgewotCQkJCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZGVzYyk7Ci0JCQkJaWYgKGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG8pKQotCQkJCQlub3RVc2VkUmVmZXJlbmNlcy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJT2JqZWN0W10gcmVmVG9CZURlbGV0ZWQgPSBSZWZlcmVuY2VTZWxlY3Rpb24KLQkJCQkJLmdldFJlZmVyZW5jZXMobm90VXNlZFJlZmVyZW5jZXMpOwotCQkJcmVmZXJlbmNlcyA9IEFycmF5cy5hc0xpc3QocmVmVG9CZURlbGV0ZWQpOwotCQl9Ci0JCQotCQlyZWRvKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChkZXNjIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotLy8JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkobnVsbCk7Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmVBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkucmVtb3ZlQWxsKAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QXNzaXN0ZWRCeSgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZUFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRPcHRpb25hbElucHV0KCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRPdXRwdXQoKS5yZW1vdmVBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGRlc2MgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJewotCQkJc3dpdGNoIChmZWF0dXJlSUQpewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCSgoUm9sZURlc2NyaXB0b3IpIGRlc2MpLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID09IG51bGwpIHsKLQkJCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBuZXcgRGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKAotCQkJCQkJcmVmZXJlbmNlcywgZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpIHsKLQotCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCQkJcmV0dXJuIFByb2Nlc3NEZWxldGVBY3Rpb24uZGVsZXRlKGVsZW1lbnRzKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQlkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0KLQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQotCQkJaWYgKGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChkZXNjLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCi0JCWlmIChkZXNjIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JCXsKLQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotLy8JCQkJT2JqZWN0IG8gPSBlbGVtZW50cy5nZXQoMCk7Ci0vLwkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotLy8JCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLnNldFBlcmZvcm1lZFByaW1hcmlseUJ5KChSb2xlRGVzY3JpcHRvcilvKTsKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZEFsbCgKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5nZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoZWxlbWVudHMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGRlc2MpLmdldE91dHB1dCgpLmFkZEFsbChlbGVtZW50cyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQl7Ci0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCSgoUm9sZURlc2NyaXB0b3IpIGRlc2MpLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgIXJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQl0cnkgewotCQkJCWlmIChkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgIT0gbnVsbCkKLQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLnVuZG8oKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotCXsKLQkJaWYgKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKQotCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmRpc3Bvc2UoKTsKLQkJaWYocmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCX0KLQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjA4Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvblRpdGxlPUdlbmVyYWwgSW5mb3JtYXRpb24KLVByb2Nlc3NfRG9jdW1lbnRJbmZvcm1hdGlvblRpdGxlPURvY3VtZW50YXRpb24gSW5mb3JtYXRpb24KLUFjdGl2aXR5X2d1aWRhbmNlSW5mb3JtYXRpb25UaXRsZT1HdWlkYW5jZQotQnJlYWtkb3duRWxlbWVudF9vcHRpb25JbmZvcm1hdGlvblRpdGxlPUJyZWFrZG93biBPcHRpb25zCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZT1TdGVwcwotCi1UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBzdGVwcyB0byBwZXJmb3JtIHRoaXMgdGFzayBkZXNjcmlwdG9yLgotCi1Qcm9jZXNzX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLVByb2Nlc3NfZG9jdW1lbnRJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZG9jdW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHswfS4KLQotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXNjcmlwdG9yLgotRGVzY3JpcHRvcl9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXNjcmlwdG9yLgotTWlsZXN0b25lX2dlbmVyYWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1pbGVzdG9uZS4KLU1pbGVzdG9uZV9kZXRhaWxJbmZvcm1hdGlvbkRlc2NyaXB0aW9uPVByb3ZpZGUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtaWxlc3RvbmUuCi0KLUJyZWFrZG93bkVsZW1lbnRfZ2VuZXJhbEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYnJlYWtkb3duIGVsZW1lbnQuCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotRGVzY3JpcHRvcl9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdG9uPVByb3ZpZGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGRlc2NyaXB0b3IuCi1BY3Rpdml0eV9nZW5lcmFsSW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhY3Rpdml0eS4KLQotQnJlYWtkb3duRWxlbWVudF9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYnJlYWtkb3duIGVsZW1lbnQuCi1BY3Rpdml0eV9Eb2N1bWVudEluZm9ybWF0aW9uRGVzY3JpcHRpb249UHJvdmlkZSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgYWN0aXZpdHkuCi1EZXNjcmlwdG9yX2RvY3VtZW50SW5mb3JtYXRpb25EZXNjcmlwdGlvbj1Qcm92aWRlIGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBkZXNjcmlwdG9yLgotUHJvY2Vzc19Ob25lPTw8IE5PTkUgPj4KLVByb2Nlc3NfbmFtZT1OYW1lOgotUHJvY2Vzc19QcmVzZW50YXRpb25OYW1lPVByZXNlbnRhdGlvbiBuYW1lOgotUHJvY2Vzc19icmllZkRlc2NyaXB0aW9uPUJyaWVmIGRlc2NyaXB0aW9uOgotUHJvY2Vzc19tYWluRGVzY3JpcHRpb249IE1haW4gZGVzY3JpcHRpb246Ci1Qcm9jZXNzX3B1cnBvc2U9UHVycG9zZToKLVByb2Nlc3NfcHJlZml4PVByZWZpeDoKLQotQnJlYWtkb3duRWxlbWVudF9UeXBlX05hbWU9QnJlYWtkb3duIEVsZW1lbnQKLQotUHJvY2Vzc19UeXBlX1Rhc2s9TWV0aG9kIHRhc2s6Ci1Qcm9jZXNzX1R5cGVfUm9sZT1NZXRob2Qgcm9sZToKLVByb2Nlc3NfVHlwZV9Xb3JrUHJvZHVjdD1NZXRob2Qgd29yayBwcm9kdWN0OgotCi1Xb3JrUHJvZHVjdF9UeXBlPVdvcmsgUHJvZHVjdCBUeXBlOgotCi1BY3Rpdml0eV9Nb2RlbEluZm89TW9kZWwgaW5mb3JtYXRpb246Ci1BY3Rpdml0eV9UeXBlPUFjdGl2aXR5IFR5cGU6Ci1BY3Rpdml0eV9wcmVzZW50YXRpb25OYW1lPVByZXNlbnRhdGlvbiBuYW1lOgotQWN0aXZpdHlfYWx0ZXJuYXRpdmVzPUFsdGVybmF0aXZlczoKLUFjdGl2aXR5X2hvd1RvU3RhZmY9SG93IHRvIHN0YWZmOgotQnJlYWtkb3duRWxlbWVudF9rZXlDb25zaWRlcmF0aW9ucz1LZXkgY29uc2lkZXJhdGlvbnM6Ci1Qcm9jZXNzX3VzYWdlR3VpZGFuY2U9VXNhZ2UgZ3VpZGFuY2U6Ci0KLUFjdGl2aXR5X1JvYWRtYXBUaXRsZT1Sb2FkbWFwcwotQWN0aXZpdHlfUm9hZG1hcERlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiByb2FkbWFwcy4KLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZVRpdGxlPUdlbmVyYWwgR3VpZGFuY2UKLUFjdGl2aXR5X0dlbmVyYWxHdWlkYW5jZURlc2NyaXB0aW9uPVByb3ZpZGUgbGlua3MgdG8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0aGUgZm9ybSBvZiBndWlkYW5jZS4KLUFjdGl2aXR5X0NvbW11bmljYXRpb25NYXRlcmlhbFRpdGxlPUNvbW11bmljYXRpb24gTWF0ZXJpYWxzCi1BY3Rpdml0eV9Db21tdW5pY2F0aW9uTWF0ZXJpYWxEZXNjcmlwdGlvbj1Qcm92aWRlIGxpbmtzIHRvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YgY29tbXVuaWNhdGlvbiBtYXRlcmlhbHMuCi1BY3Rpdml0eV9FZHVjYXRpb25NYXRlcmlhbFRpdGxlPUVkdWNhdGlvbiBNYXRlcmlhbHMKLUFjdGl2aXR5X0VkdWNhdGlvbk1hdGVyaWFsRGVzY3JpcHRpb249UHJvdmlkZSBsaW5rcyB0byBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRoZSBmb3JtIG9mIGVkdWNhdGlvbiBtYXRlcmlhbHMuCi0KLUFjdGl2aXR5X1NlbGVjdGVkX1JvYWRtYXA9Um9hZG1hcHM6Ci1BY3Rpdml0eV9TZWxlY3RlZF9HZW5lcmFsR3VpZGFuY2U9R3VpZGFuY2U6Ci1BY3Rpdml0eV9TZWxlY3RlZF9Db21tdW5pY2F0aW9uTWF0ZXJpYWw9Q29tbXVuaWNhdGlvbiBNYXRlcmlhbHM6Ci1BY3Rpdml0eV9TZWxlY3RlZF9FZHVjYXRpb25NYXRlcmlhbD1FZHVjYXRpb24gTWF0ZXJpYWxzOgotCi1BY3Rpdml0eV9EaWFncmFtVGl0bGU9RGlhZ3JhbQotQWN0aXZpdHlfRGlhZ3JhbURlc2NyaXB0aW9uID0gUHJvdmlkZSBkaWFncmFtIGltYWdlcyBmb3IgdGhpcyB7MH0uCi1BY3Rpdml0eV9BREltYWdlPUFjdGl2aXR5IERpYWdyYW0KLUFjdGl2aXR5X0FEREltYWdlPUFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1BY3Rpdml0eV9XUERJbWFnZT1Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi1BY3Rpdml0eV9Vc2VBREltYWdlPVVzZSBBY3Rpdml0eSBEaWFncmFtIGZvciBwdWJsaXNoaW5nCi1BY3Rpdml0eV9Vc2VBRERJbWFnZT1Vc2UgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gZm9yIHB1Ymxpc2hpbmcKLUFjdGl2aXR5X1VzZVdQREltYWdlPVVzZSBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtIGZvciBwdWJsaXNoaW5nCi1BY3Rpdml0eV9Bc3NpZ249QXNzaWduLi4uCi0KLVRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzPVN0ZXBzOgotVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlPVN0ZXBzCi1UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZT1TZWxlY3Qgc3RlcHMKLQotQWN0aXZpdHlfV29ya1JvbGx1cD1Xb3JrIFJvbGx1cAotQWN0aXZpdHlfVGVhbVJvbGx1cD1UZWFtIFJvbGx1cAotQWN0aXZpdHlfV29ya1Byb2R1Y3RzUm9sbHVwPVdvcmsgUHJvZHVjdHMgUm9sbHVwCi1BY3Rpdml0eV9Xb3JrUm9sbHVwRGVzY3JpcHRpb249UmV2aWV3IHRoZSB3b3JrIHJvbGwtdXAgZm9yIHRoaXMgYWN0aXZpdHkgaW4gdGhpcyBzZWN0aW9uLgotQWN0aXZpdHlfVGVhbVJvbGx1cERlc2NyaXB0aW9uPVJldmlldyB0aGUgdGVhbSByb2xsLXVwIGZvciB0aGlzIGFjdGl2aXR5IGluIHRoaXMgc2VjdGlvbi4KLUFjdGl2aXR5X1dvcmtQcm9kdWN0c1JvbGx1cERlc2NyaXB0aW9uPVJldmlldyB0aGUgd29yayBwcm9kdWN0IHJvbGwtdXAgZm9yIHRoaXMgYWN0aXZpdHkgaW4gdGhpcyBzZWN0aW9uLgotQnJlYWtkb3duRWxlbWVudF9PcHRpb25fTXVsdGlwbGVPY3VycmFuY2U9TXVsdGlwbGUgT2NjdXJyZW5jZXMKLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX09wdGlvbmFsPU9wdGlvbmFsCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9QbGFubmVkPVBsYW5uZWQKLUJyZWFrZG93bkVsZW1lbnRfT3B0aW9uX1N1cHJlc3NlZD1TdXBwcmVzc2VkCi0KLVdvcmtCcmVha2Rvd25FbGVtZW50X0V2ZW50RHJpdmVuPUV2ZW50IERyaXZlbgotV29ya0JyZWFrZG93bkVsZW1lbnRfT25nb2luZz1PbmdvaW5nCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9SZXBlYXRhYmxlPVJlcGVhdGFibGUKLVdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29ycz1QcmVkZWNlc3NvcnM6Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5PURlcGVuZGVuY3k6Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9JRF9URVhUPUluZGV4Ci1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9QUkVTRU5UQVRJT05fTkFNRV9URVhUPVByZXNlbnRhdGlvbiBOYW1lCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0NPTF9ERVBFTkRFTkNZX1RFWFQ9RGVwZW5kZW5jeQotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9BZGQ9QWRkCi1Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQ9RWRpdAotV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmU9UmVtb3ZlCi0KLVdvcmtPcmRlclR5cGVfRklOSVNIX1RPX1NUQVJUPUZpbmlzaCBUbyBTdGFydAotV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fRklOSVNIPUZpbmlzaCBUbyBGaW5pc2gKLVdvcmtPcmRlclR5cGVfU1RBUlRfVE9fRklOSVNIPVN0YXJ0IFRvIEZpbmlzaAotV29ya09yZGVyVHlwZV9TVEFSVF9UT19TVEFSVD1TdGFydCBUbyBTdGFydAotCi1CcmVha2Rvd25FbGVtZW50X09wdGlvbl9TeW5jaHJvbml6ZWQ9U3luY2hyb25pemVkIHdpdGggc291cmNlCi0KLURlc2NyaXB0b3JfUmVmaW5lZERlc2NyaXB0aW9uPVJlZmluZWQgZGVzY3JpcHRpb246Ci0KLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZT1Sb2xlcwotVGFza0Rlc2NyaXB0b3JfUm9sZXNfU2VjdGlvbkRlc2NyaXB0aW9uPUFzc2lnbiB0aGUgcm9sZSBkZXNjcmlwdG9ycyB0byBwZXJmb3JtIHRoaXMgdGFzayBkZXNjcmlwdG9yLgotVGFza0Rlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVByaW1hcnkgUGVyZm9ybWVyczoKLVRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMj1BZGRpdGlvbmFsIFBlcmZvcm1lcnM6Ci1UYXNrRGVzY3JpcHRvcl9Sb2xlc19UYWJsZTM9QXNzaXN0ZWQgQnk6Ci0KLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9V29yayBQcm9kdWN0cwotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBmb3IgdGhpcyB0YXNrIGRlc2NyaXB0b3IuCi1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPU1hbmRhdG9yeSBJbnB1dDoKLVRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9T3B0aW9uYWwgSW5wdXQ6Ci1UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUzPUV4dGVybmFsIElucHV0OgotVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlND1PdXRwdXQ6Ci0KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1NlY3Rpb25UaXRsZT1UYXNrcwotUm9sZURlc2NyaXB0b3JfVGFza3NfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgcm9sZSBkZXNjcmlwdG9yIGlzIHBlcmZvcm1lciBvZiBmb2xsb3dpbmcgdGFzayBkZXNjcmlwdG9ycy4KLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMT1QcmltYXJ5IFBlcmZvcm1lcjoKLVJvbGVEZXNjcmlwdG9yX1Rhc2tzX1RhYmxlMj1BZGRpdGlvbmFsIFBlcmZvcm1lcnM6Ci1Sb2xlRGVzY3JpcHRvcl9UYXNrc19UYWJsZTM9QXNzaXN0ZWQgQnk6Ci0KLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uVGl0bGU9V29yayBQcm9kdWN0cwotUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbj1UaGlzIHJvbGUgZGVzY3JpcHRvciBpcyByZXNwb25zaWJsZSBmb3IgYW5kIG1vZGlmaWVzIGZvbGxvd2luZyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMuCi1Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxPVJlc3BvbnNpYmxlIGZvcjoKLVJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTI9TW9kaWZpZXM6Ci0KLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uVGl0bGU9Um9sZXMKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19TZWN0aW9uRGVzY3JpcHRpb249VGhlIGZvbGxvd2luZyByb2xlIGRlc2NyaXB0b3JzIGFyZSByZXNwb25zaWJsZSBmb3IgYW5kIG1vZGlmaWVzIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUm9sZXNfVGFibGUxPVJlc3BvbnNpYmxlIGZvcjoKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Sb2xlc19UYWJsZTI9TW9kaWZpZWQgYnk6Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3JfVHlwZT1UeXBlOgotV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZT1BY3Rpdml0eSBFbnRyeSBTdGF0ZToKLVdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZT1BY3Rpdml0eSBFeGl0IFN0YXRlOgotCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZT1EZWxpdmVyYWJsZSBQYXJ0cwotV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb249VGhlIGRlbGl2ZXJhYmxlIGhhcyBmb2xsb3dpbmcgZGVsaXZlcmFibGUgcGFydHMuCi1XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1RhYmxlMT1EZWxpdmVyYWJsZSBQYXJ0cwotCi1Sb2xlRGVzY3JpcHRvcl9UZWFtX1NlY3Rpb25UaXRsZT1UZWFtcwotUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb249VGhpcyByb2xlIGRlc2NyaXB0b3IgcmVmZXJzIHRvIGZvbGxvd2luZyB0ZWFtcy4KLVJvbGVEZXNjcmlwdG9yX1RlYW1fVGFibGUxPVRlYW1zOgotCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvblRpdGxlPVJvbGVzCi1Db21wb3NpdGVSb2xlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uPVRoaXMgY29tcG9zaXRlIHJvbGUgaGFzIGZvbGxvd2luZyBhZ2dyZWdhdGVkIHJvbGVzLgotQ29tcG9zaXRlUm9sZV9Sb2xlX1RhYmxlMT1BZ2dyZWdhdGVkIFJvbGVzOgotCi1UZWFtUHJvZmlsZV9Sb2xlX1NlY3Rpb25UaXRsZT1Sb2xlcwotVGVhbVByb2ZpbGVfUm9sZV9TZWN0aW9uRGVzY3JpcHRpb249QWRkIG9yIHJlbW92ZSByb2xlcyB0by9mcm9tIHRoZSB0ZWFtIHByb2ZpbGUuCi1UZWFtUHJvZmlsZV9Sb2xlX1RhYmxlMT1Sb2xlczoKLQotUHJvY2Vzc19SaWNoVGV4dF9Db2xsYXBzZUltYWdlPWNvbGxhcHNlZC5naWYKLVByb2Nlc3NfUmljaFRleHRfRXhwYW5kSW1hZ2U9ZXhwYW5kZWQuZ2lmCi1Qcm9jZXNzX0FkZD1BZGQuLi4KLVByb2Nlc3NfQWRkRnJvbVByb2Nlc3M9QWRkIGZyb20gUHJvY2Vzcy4uLgotUHJvY2Vzc19SZW5hbWVfTWVzc2FnZT1Zb3UgYXJlIGFib3V0IHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIHByb2Nlc3MuIFRoaXMgd2lsbCBzYXZlIHRoaXMgZWRpdG9yIGFuZCByZW5hbWUgdGhlIHByb2Nlc3MgZm9sZGVyIHRvIHRoZSBuZXcgbmFtZS4gRG8geW91IHdhbnQgdG8gY29udGludWU/Ci1Qcm9jZXNzX1JlbW92ZT1SZW1vdmUKLVByb2Nlc3NfVXA9VXAKLVByb2Nlc3NfRG93bj1Eb3duCi1Qcm9jZXNzX011bHRpcGxlU2VsZWN0aW9uPU11bHRpcGxlIFNlbGVjdGlvbgotUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQ9TGluayBNZXRob2QgRWxlbWVudC4uLgotUHJvY2Vzc19CdXR0b25fQ2xlYXJNZXRob2RFbGVtZW50PUNsZWFyCi0KLSMjIEVycm9yL1dhcm5pbmcKLVByb2Nlc3NfSW52YWxpZE5hbWVUaXRsZT1JbnZhbGlkIG5hbWUKLVByb2Nlc3NfSW52YWxpZE5hbWU9SVVQQTAwODFFOiBUaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLVByb2Nlc3NfUmVuYW1lX1RpdGxlPVJlbmFtZQotUHJvY2Vzc19JbnZhbGlkUHJlc2VudGF0aW9uTmFtZT1JVVBBMDA4MkU6IFRoZSBwcmVzZW50YXRpb24gbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgcHJlc2VudGF0aW9uIG5hbWUuCi1Qcm9jZXNzX0xpbmtNZXRob2RFbGVtZW50VGl0bGU9TGluayBNZXRob2QgRWxlbWVudAotUHJvY2Vzc19JbnZhbGlkTGlua01ldGhvZEVsZW1lbnQ9SVVQQTAwODNFOiBDYW5ub3QgbGluayB0byAnJ3swfScnIHNpbmNlIHRoaXMgTWV0aG9kRWxlbWVudCBpcyBhbHJlYWR5IGJlaW5nIHVzZWQgZm9yIGFub3RoZXIgZGVzY3JpcHRvciB1bmRlciB0aGUgc2FtZSBwYXJlbnQuCi1Qcm9jZXNzX0Fzc2lnbm1lbnRJbmZvVGl0bGU9SW5mb3JtYXRpb24KLVByb2Nlc3NfVGVhbUFzc2lnbkVycm9yPUlVUEEwMDg0RTogQ2Fubm90IGFkZCAnJ3swfScnIHRvIHRoZSB0ZWFtICcnezF9JycgXG5cblJvbGUgZGVzY3JpcHRvcihzKSBtdXN0IGhhdmUgbWV0aG9kIGVsZW1lbnQgcm9sZSBhc3NvY2lhdGVkIHdpdGggaXQgdG8gYmUgYXNzaWduZWQgdG8gdGVhbS5cblxuIEZpeCB0aGUgYXNzb2NpYXRpb24gZmlyc3QgYW5kIHRyeSBhZ2Fpbi4KLVByb2Nlc3NfVGVhbURpYWxvZ01lc3NhZ2U9U2VsZWN0IHRlYW1zCi1Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZT1UZWFtcwotCi1Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3I9SVVQQTAwODVFOiBDYW5ub3QgYWRkICcnezB9JycgdG8gdGhlIGRlbGl2ZXJhYmxlICcnezF9Jycgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBtZXRob2QgZWxlbWVudCB3b3JrcHJvZHVjdCBhc3NvY2lhdGVkIHdpdGggaXQuCi1Qcm9jZXNzX0NvbXBvc2l0ZVJvbGVBc3NpZ25FcnJvcj1JVVBBMDA4NkU6IENhbm5vdCBhZGQgICcnezB9JycgdG8gdGhlIENvbXBvc2l0ZSByb2xlICcnezF9Jycgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBtZXRob2QgZWxlbWVudCByb2xlIGFzc29jaWF0ZWQgd2l0aCBpdC4KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyTWVzc2FnZT1JVVBBMDA4N1c6IFBsZWFzZSBlbnRlciB2YWxpZCBudW1iZXIgZm9yIHByZWRlY2Vzc29ycy4KLVByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGU9SW52YWxpZCBQcmVkZWNlc3NvciBJZAotCi1Qcm9jZXNzX05vSXRlbXM9Tm8gaXRlbXMgc2VsZWN0ZWQKLVByb2Nlc3NfSXRlbXNTZWxlY3RlZD17MH0gaXRlbXMgc2VsZWN0ZWQKLVByb2Nlc3NfTm9Qcm9wZXJ0aWVzQXZhaWxhYmxlPU5vIFByb3BlcnRpZXMgYXZhaWxhYmxlCi0KLVByZWRlY2Vzc29yRGlhbG9nX1RpdGxlPVByZWRlY2Vzc29yIERlcGVuZGVuY3kKLVByZWRlY2Vzc29yRGlhbG9nX0hlYWRlck1lc3NhZ2U9RW50ZXIgZGVwZW5kZW5jeSB0eXBlIGZvciBwcmVkZWNlc3NvcjoKLVByZWRlY2Vzc29yRGlhbG9nX0luZGV4PUluZGV4OgotUHJlZGVjZXNzb3JEaWFsb2dfUHJlc2VudGF0aW9uTmFtZT1QcmVzZW50YXRpb24gTmFtZToKLVByZWRlY2Vzc29yRGlhbG9nX0RlcGVuZGVuY3k9RGVwZW5kZW5jeToKLVByZWRlY2Vzc29yRGlhbG9nX1ByZWRlY2Vzc29yRXJyb3JEaWFsb2dUaXRsZT1QcmVkZWNlc3NvcgotUHJlZGVjZXNzb3JEaWFsb2dfUHJlZGVjZXNzb3JFcnJvck1lc3NhZ2U9SVVQQTAwODhFOiBQcmVkZWNlc3NvciB3aXRoIHRoYXQgSWQgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgd29yayBicmVha2Rvd24gZWxlbWVudC4KLQotUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZz1JVVBBMDA5MEU6IFRoZXJlIHdhcyBhbiBlcnJvciBlZGl0aW5nIGEgcHJvcGVydHkuCi1Qcm9jZXNzRWRpdG9yRm9ybVByb3BlcnRpZXNfY2VsbEVkaXRvcl9pbnZhbGlkUHJlZGNlc3Nvcl9wcm9ibGVtX21zZz1JVVBBMDA4OVc6IEludmFsaWQgcHJlZGVjZXNzb3IgbGlzdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMTZjN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1JvbGVEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRpYWxvZ3MuSXRlbXNGaWx0ZXJEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NSb2xlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTGlua01ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFJvbGUgRGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIGV4dGVuZHMgRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgTGFiZWwgY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX21ldGhvZF9lbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0J1dHRvbjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgUm9sZURlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbWV0aG9kIGVsZW1lbnQKLQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbCA9IEZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LAotCQkJCWdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UeXBlX1JvbGUpOyAKLQotCQljdHJsX21ldGhvZF9lbGVtZW50ID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgMSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBTV1QuTk9ORSwgMiwgdHJ1ZSk7Ci0JCWxpbmtCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQlsaW5rQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudCk7IAotCi0JCWNsZWFyQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJY2xlYXJCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudCk7IAotCi0JCS8vIHNob3cvaGlkZSBtZXRob2Qgcm9sZQotCQl0b2dnbGVNZXRob2RSb2xlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZU1ldGhvZFJvbGUoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJY3RybF9tZXRob2RfZWxlbWVudF9sYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlsaW5rQnV0dG9uLnNldFZpc2libGUoZmFsc2UpOwotCQkJY2xlYXJCdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsX21ldGhvZF9lbGVtZW50X2xhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFZpc2libGUodHJ1ZSk7Ci0JCQlsaW5rQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCQljbGVhckJ1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzUm9sZUZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0Um9sZSgpICE9IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudC5nZXRSb2xlKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgRmlsdGVyQ29uc3RhbnRzLlJPTEVTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJc2V0TWV0aG9kRWxlbWVudChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQljbGVhckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwKLQkJCQkJCW51bGwsIC0xKTsKLQkJCQkvLyB1cGRhdGUgbWV0aG9kIGVsZW1lbnQgY29udHJvbAotCQkJCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlMSkgewotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWV0aG9kRWxlbWVudChMaXN0IGl0ZW1zKSB7Ci0JCWlmICgoaXRlbXMgIT0gbnVsbCkgJiYgKGl0ZW1zLnNpemUoKSA+PSAxKSkgewotCQkJaWYgKGl0ZW1zLmdldCgwKSBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRlbXMuZ2V0KDApOwotCi0vLwkJCQlMaXN0IGxpc3QgPSBQcm9jZXNzVXRpbAotLy8JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLS8vCQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZ2V0QWRhcHRlcigpLAotLy8JCQkJCQkJCWVsZW1lbnQpOwotCQkJCWJvb2xlYW4gY2FuQXNzaWduID0gdHJ1ZTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotLy8JCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotLy8JCQkJCQlpZiAoKCFyb2xlRGVzYy5lcXVhbHMoZWxlbWVudCkpCi0vLwkJCQkJCQkJJiYgKCFyb2xlRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0vLwkJCQkJCQlSb2xlIGV4aXNpbmdSb2xlID0gcm9sZURlc2MuZ2V0Um9sZSgpOwotLy8JCQkJCQkJaWYgKHJvbGUuZXF1YWxzKGV4aXNpbmdSb2xlKSkgewotLy8JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotLy8JCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChjYW5Bc3NpZ24pIHsKLQkJCQkJTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IG5ldyBMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQoCi0JCQkJCQkJZWxlbWVudCwgcm9sZSwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUpOwotCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCS8vIHNldCBzZWxlY3Rpb24gdG8gc2FtZSBlbGVtZW50IHRvIGVuYWJsZSBjb3JyZWN0IGFjdGlvbnMKLQkJCQkJZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudCk7IAotCQkJCQlPYmplY3RbXSBhcmdzID0geyByb2xlLmdldE5hbWUoKSB9OwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoUm9sZURlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRSb2xlKCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRSb2xlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3VwZGF0ZUNvbnRyb2xzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQotCQlsaW5rQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQljbGVhckJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqOwotCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQl8fCAocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkpIHsKLQkJCQluYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCQlwcmVzZW50YXRpb25OYW1lVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmFtZVRleHQuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQkJCXByZXNlbnRhdGlvbk5hbWVUZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5yZWZyZXNoKCk7Ci0KLQkJCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWVsZW1lbnQgPSAoUm9sZURlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCi0JCQkJLy8gc2hvdy9oaWRlIG1ldGhvZCByb2xlCi0JCQkJdG9nZ2xlTWV0aG9kUm9sZSgpOwotCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBSb2xlRGVzY3JpcHRvciBnZW5lcmFsIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0NPTVBPU0lURV9ST0xFICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9MRV9ERVNDUklQVE9SICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvclRlYW1TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JUZWFtU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzdiNDA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvclRlYW1TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIFJvbGUgZGVzY3JpcHRvciAtIHRlYW0gcHJvZmlsZSBzZWN0aW9uCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yVGVhbVNlY3Rpb24gZXh0ZW5kcyBPQlNSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSW1hZ2UgdGl0bGVJbWFnZSA9IG51bGw7Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldFNlbGVjdGVkVGVhbXMoZWxlbWVudCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50OwotCi0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uVGl0bGUsIAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfVGVhbV9TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9UZWFtX1RhYmxlMSk7IAotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBSb2xlIERlc2NyaXB0b3IgdGVhbSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChPYmplY3RbXSBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgaXRlbXNbaV07Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCUNvbXBvc2l0ZVJvbGUgY29tcFJvbGUgPSBQcm9jZXNzVXRpbAotCQkJCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlKChDb21wb3NpdGVSb2xlKSBlbGVtZW50KTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQljb21wUm9sZSwgLTEpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKCFpc1BhcnRPZlRlYW0ocm9sZSwgdGVhbSkpIHsKLQkJCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgdGVhbSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCXJvbGVEZXNjLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtQXNzaWduRXJyb3IpOyAKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7IGVsZW1lbnQuZ2V0TmFtZSgpLCB0ZWFtLmdldE5hbWUoKSB9OwotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBtZi5mb3JtYXQoYXJncyk7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBnZXRFZGl0b3IoKS5nZXRUaXRsZSgpOwotCQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtZXNzYWdlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQURELCB0ZWFtLAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQllbGVtZW50LCAtMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVtb3ZlKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBpdG9yLm5leHQoKTsKLQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGVhbSwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJZWxlbWVudCwgLTEpOwotCi0JCQkJLy8gR2V0IHRoZSBsaXN0IG9mIHJvbGVEZXNjcmlwdG9ycyBmcm9tIHRlYW0gcHJvZmlsZSB3aGljaAotCQkJCS8vIGhhcyBzYW1lIHJvbGUgb3JpZ2luYWwgcm9sZSBkZXNjcmlwdG9yCi0JCQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCQkJCUxpc3Qgcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbVJvbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSB0ZWFtUm9sZXMuZ2V0KGkpOwotCi0JCQkJCWlmIChyb2xlRGVzYy5nZXRSb2xlKCkuZXF1YWxzKHJvbGUpKQotCQkJCQl7Ci0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIHJvbGVEZXNjcmlwb3IganVzdCBoYXMgb25lIGVsZW1lbnQsIGRlbGV0ZSB0aGF0IG9uZSB0b28uCi0JCQkJLy8gc2luY2UgdGhhdCB3b3VsZCBiZSB0aGUgbGFzdCBvbmUKLQkJCQlpZiAocm9sZURlc2NMaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRlYW0sCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzY0xpc3QuZ2V0KDApLCAtMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRPZlRlYW0oUm9sZSByb2xlLCBUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCUxpc3QgdGVhbVJvbGVzID0gdGVhbS5nZXRUZWFtUm9sZXMoKTsKLQkJTGlzdCByb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJcm9sZXMuYWRkKHJvbGVEZXNjLmdldFJvbGUoKSk7Ci0JCX0KLQotCQlpZiAocm9sZXMuY29udGFpbnMocm9sZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGREaWFsb2coKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5BZGREaWFsb2coKSB7Ci0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHRlYW1Db250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IGl0ZW1zID0gZ2V0VGVhbXMoKTsKLQkJCQlpdGVtcy5yZW1vdmVBbGwoZ2V0U2VsZWN0ZWRUZWFtcyhlbGVtZW50KSk7Ci0JCQkJcmV0dXJuIGl0ZW1zLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlJTGFiZWxQcm92aWRlciB0ZWFtTGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgTGlzdFNlbGVjdGlvbkRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIGVsZW1lbnQsCi0JCQkJdGVhbUNvbnRlbnRQcm92aWRlciwgdGVhbUxhYmVsUHJvdmlkZXIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UZWFtRGlhbG9nTWVzc2FnZSk7IAotCQl0aXRsZUltYWdlID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRJbWFnZSgpOwotCQlMaXN0U2VsZWN0aW9uRGlhbG9nLnNldERlZmF1bHRJbWFnZSh0aXRsZUltYWdlKTsKLQotCQlkbGcuc2V0VGl0bGUoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1EaWFsb2dUaXRsZSk7IAotCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRsZy5vcGVuKCk7Ci0JCWFkZChkbGcuZ2V0UmVzdWx0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQlQYXJlbnQgb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IFRlYW1zIGZyb20gcGFyZW50Ci0JICogCi0JICogQHJldHVybgotCSAqIAkJCUxpc3Qgb2YgdGVhbXMKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VGVhbXMoKSB7Ci0JCUFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChlbGVtZW50KTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZWxlbWVudDsKLQkJCQkJCWl0ZW1zLmFkZCh0ZWFtKTsKLQkJCQkJCS8vIGFkZCBhbnkgc3ViIHRlYW1zIGlmIHRoZXJlCi0JCQkJCQlMaXN0IHN1YlRlYW1zID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCQkJCQlpdGVtcy5hZGRBbGwoc3ViVGVhbXMpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXBhcmVudCA9IGdldFBhcmVudCgoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgc2VsZWN0ZWQgdGVhbXMgZm9yIHRoYXQgcm9sZSBkZXNjcmlwdG9yCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAJCUxpc3Qgb2Ygc2VsZWN0ZWQgdGVhbSAKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U2VsZWN0ZWRUZWFtcyhFT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldFRlYW1Qcm9maWxlcygoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBpbnB1dCk7Ci0JCX0gZWxzZSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgb2JqZWN0OwotCQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFRlYW1Qcm9maWxlcyhyb2xlRGVzYywgZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTVmZWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Sb2xlRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLkRlc2NyaXB0b3JQcm9jZXNzRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5JQWN0aW9uVHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogUm9sZSBEZXNjcmlwdG9yIC0gd29yayBwcm9kdWN0IHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JXb3JrUHJvZHVjdFNlY3Rpb24gZXh0ZW5kcyBSZWxhdGlvblNlY3Rpb24gewotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogR2V0IHByb2Nlc3Mgd29yayBwcm9kdWN0IGZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSBuZXcgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJbnVsbCwgRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCi0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjEoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSZXNwb25zaWJsZUZvcigpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIxLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjIoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TW9kaWZpZXMoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMi5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDI7Ci0JCQotCQlzZXRUYWJEYXRhKFByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25UaXRsZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlJvbGVEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19TZWN0aW9uRGVzY3JpcHRpb24sCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Sb2xlRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUxLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUm9sZURlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMiwKLQkJCQludWxsLAotCQkJCW51bGwsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7IAotCi0JCWJvb2xlYW5bXSBjaGFuZ2VzQWxsb3dlZCA9IHsgdHJ1ZSwgZmFsc2UgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQllbGVtZW50ID0gKFJvbGVEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRFbGVtZW50c0luU2NvcGUoZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlBc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9Sb2xlRGVzY3JpcHRvcigKLQkJCQkJKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50LCBpdGVtcywKLQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1JFU1BPTlNJQkxFX0ZPUiwgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0IGdldFdvcmtQcm9kdWN0cyhMaXN0IGl0ZW1zKSB7Ci0JCUxpc3Qgd3BMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXdwTGlzdC5hZGQoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZW1zLmdldChpKSkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB3cExpc3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0cygoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldFByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBvYmogPSBQcm9jZXNzVXRpbC5nZXRSb290UHJvY2VzcyhhRmFjdG9yeSwgYWRhcHRlciwgZWxlbWVudCk7Ci0JCXJldHVybiAoUHJvY2Vzcykgb2JqOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZ2V0QWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwgbGlzdCk7Ci0JCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkvLyBVbmNvbW1lbnQgdG8gc2hvdyBleHRlbmRlZCBhY3Rpdml0eSdzIHdvcmtwcm9kdWN0cwotCQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCS8vIE9iamVjdCBvYmplY3QgPQotCQkJCS8vICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqKS5nZXRQYXJlbnQob2JqKTsKLQkJCQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZ2V0QWN0aXZpdGllc0luU2NvcGUoCi0JCQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkvLyBlbGVtZW50LCBsaXN0KTsKLQkJCQkvLyBpZihsaXN0LmNvbnRhaW5zKG9iamVjdCkpIHJldHVybiB0cnVlOwotCQkJCS8vIH0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JUYWJOYW1lKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0b3JUYWJOYW1lKCkgewotCQlyZXR1cm4gRmlsdGVyQ29uc3RhbnRzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmRlMTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5Qcm9jZXNzVGFza0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkxpbmtNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotLyoqCi0gKiBUaGUgZ2VuZXJhbCB0YWIgc2VjdGlvbiBmb3IgVGFzayBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24gZXh0ZW5kcwotCQlXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3IgZWxlbWVudDsKLQotCXByaXZhdGUgQnV0dG9uIHN5bmNocm9uaXplZEJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX21ldGhvZF9lbGVtZW50OwotCi0JcHJpdmF0ZSBCdXR0b24gbGlua0J1dHRvbjsKLQkKLQlwcml2YXRlIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLldvcmtCcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgVGFza0Rlc2NyaXB0b3Igb2JqZWN0Ci0JCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgY2hlY2tib3gKLQkJY2hlY2tCb3hDb21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCBudW1PZkNvbHVtbnMsIHRydWUpOwotCi0JCS8vIHN5bmNocm9uaXplZCB3aXRoIHNvdXJjZQotCQlzeW5jaHJvbml6ZWRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuQnJlYWtkb3duRWxlbWVudF9PcHRpb25fU3luY2hyb25pemVkKTsgCi0KLQkJLy8gbWV0aG9kIGVsZW1lbnQKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19UeXBlX1Rhc2spOyAKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCi0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50TmFtZShlbGVtZW50KSk7Ci0JCWN0cmxfbWV0aG9kX2VsZW1lbnQuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IEZvcm1VSS5jcmVhdGVDb21wb3NpdGUodG9vbGtpdCwKLQkJCQlnZW5lcmFsQ29tcG9zaXRlLCBTV1QuTk9ORSwgMiwgdHJ1ZSk7Ci0JCWxpbmtCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gsIDEpOwotCQlsaW5rQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9MaW5rTWV0aG9kRWxlbWVudCk7IAotCi0JCWNsZWFyQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJY2xlYXJCdXR0b24KLQkJCQkuc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQnV0dG9uX0NsZWFyTWV0aG9kRWxlbWVudCk7IAotCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWV0aG9kRWxlbWVudChMaXN0IGl0ZW1zKSB7Ci0JCWlmICgoaXRlbXMgIT0gbnVsbCkgJiYgKGl0ZW1zLnNpemUoKSA+PSAxKSkgewotCQkJaWYgKGl0ZW1zLmdldCgwKSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRlbXMuZ2V0KDApOwotCi0vLwkJCQlMaXN0IHNpYmxpbmdzID0gUHJvY2Vzc1V0aWwKLS8vCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGdldEFkYXB0ZXIoKSwKLS8vCQkJCQkJCQllbGVtZW50KTsKLQkJCQlib29sZWFuIGNhbkFzc2lnbiA9IHRydWU7Ci0vLwkJCQotLy8KLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotLy8JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotLy8JCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotLy8JCQkJCQlpZiAoKCF0YXNrRGVzYy5lcXVhbHMoZWxlbWVudCkpCi0vLwkJCQkJCQkJJiYgKCF0YXNrRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0vLwkJCQkJCQlUYXNrIGV4aXNpbmdUYXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotLy8JCQkJCQkJaWYgKHRhc2suZXF1YWxzKGV4aXNpbmdUYXNrKSkgewotLy8JCQkJCQkJCWNhbkFzc2lnbiA9IGZhbHNlOwotLy8JCQkJCQkJCWJyZWFrOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCWlmIChjYW5Bc3NpZ24pIHsKLQkJCQkJTGlua01ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IG5ldyBMaW5rTWV0aG9kRWxlbWVudENvbW1hbmQoCi0JCQkJCQkJZWxlbWVudCwgdGFzaywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0spOwotCQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCi0JCQkJCS8vIHNldCBzZWxlY3Rpb24gdG8gc2FtZSBlbGVtZW50IHRvIGVuYWJsZSBjb3JyZWN0IGFjdGlvbnMKLQkJCQkJZ2V0RWRpdG9yKCkuc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0ludmFsaWRMaW5rTWV0aG9kRWxlbWVudCk7IAotCQkJCQlPYmplY3RbXSBhcmdzID0geyB0YXNrLmdldE5hbWUoKSB9OwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWV0aG9kRWxlbWVudE5hbWUoVGFza0Rlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRUYXNrKCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRUYXNrKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2FkZExpc3RlbmVycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGRMaXN0ZW5lcnMoKTsKLQotCQlzeW5jaHJvbml6ZWRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKHN5bmNocm9uaXplZEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJbGlua0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzVGFza0ZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgRmlsdGVyQ29uc3RhbnRzLlRBU0tTKTsKLQkJCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudC5nZXRUYXNrKCkpOwotCQkJCX0KLQkJCQlJdGVtc0ZpbHRlckRpYWxvZyBmZCA9IG5ldyBJdGVtc0ZpbHRlckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCWZpbHRlciwgZWxlbWVudCwgRmlsdGVyQ29uc3RhbnRzLlRBU0tTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0KLQkJCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlmZC5zZXRWaWV3ZXJTZWxlY3Rpb25TaW5nbGUodHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlRBU0tTKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJc2V0TWV0aG9kRWxlbWVudChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQkKLQkJY2xlYXJCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksCi0JCQkJCQludWxsLCAtMSk7Ci0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiN1cGRhdGVDb250cm9scygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRyb2xzKCk7Ci0JCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJbGlua0J1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJY2xlYXJCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCi0JCQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCXN5bmNocm9uaXplZEJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudAotCQkJCQkJLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJIkVycm9yIHJlZnJlc2hpbmcgVGFza0Rlc2NyaXB0b3IgZ2VuZXJhbCBzZWN0aW9uOiAiICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9UQVNLX0RFU0NSSVBUT1IgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmM2Q0MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yUm9sZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1JvbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQotLyoqCi0gKiBUaGUgVGFzayBkZXNjcmlwdG9yIC0gcm9sZSB0YWIgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvclJvbGVTZWN0aW9uIGV4dGVuZHMgUmVsYXRpb25TZWN0aW9uIHsKLQlwcml2YXRlIElGaWx0ZXIgcm9sZUZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyByb2xlZGVzY3JpcHRvciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCWlmIChyb2xlRmlsdGVyID09IG51bGwpIHsKLQkJCXJvbGVGaWx0ZXIgPSBuZXcgUHJvY2Vzc1JvbGVGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuUk9MRVMpOwotCQl9Ci0JCXJldHVybiByb2xlRmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMSgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMigpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXIzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyMygpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgKLQkJCQkJCSgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKSkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQotCQlsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQotCQlpbnQgbnVtT2ZUYWJsZXMgPSAzOwotCQkKLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25UaXRsZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1JvbGVzX1RhYmxlMywKLQkJCQludWxsLAotCQkJCUZpbHRlckNvbnN0YW50cy5ST0xFUyk7Ci0JCQotCQlib29sZWFuW10gY2hhbmdlc0FsbG93ZWQgPSB7IHRydWUsIHRydWUsIHRydWUgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldERlc2NyaXB0b3JzRnJvbVByb2Nlc3MoKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRFbGVtZW50c0luU2NvcGUoZ2V0QWRhcHRlckZhY3RvcnkoKSwgZWxlbWVudCwKLQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCi0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFJvbGVzKExpc3QgaXRlbXMpIHsKLQkJTGlzdCByb2xlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyb2xlTGlzdC5hZGQoKChSb2xlRGVzY3JpcHRvcikgaXRlbXMuZ2V0KGkpKS5nZXRSb2xlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJvbGVMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFzc2lzdGVkQnkoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHJvbGUpKQotCQkJCQkJbmV3TGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX1BSSU1BUllfUEVSRk9STUVSLCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEl0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJTGlzdCBlbGVtZW50TGlzdCA9IGdldFJvbGVzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QXNzaXN0ZWRCeSgpKSk7Ci0JCQotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCQlSb2xlIHJvbGUgPSAoUm9sZSkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHJvbGUpKQotCQkJCQkJbmV3TGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BRERJVElPTkFMX1BFUkZPUk1FUiwgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRSb2xlcygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0Um9sZXMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpKTsKLQotCQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyhyb2xlKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduUm9sZVRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfQVNTSVNURURfQlksIGdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRBc3Npc3RlZEJ5KCkpOwotCi0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCQkJaXRlbXMsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMihqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZLCBlbGVtZW50LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0KLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLCBpdGVtcywKLQkJCQkJLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zMShqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczEoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMSgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czEoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RXhpc3RpbmdFbGVtZW50czIoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEV4aXN0aW5nRWxlbWVudHMyKCkgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMygpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEFzc2lzdGVkQnkoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEZpbHRlckZvckRlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbHRlciBnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LCBsaXN0KTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRQcm9jZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3Qgb2JqID0gUHJvY2Vzc1V0aWwuZ2V0Um9vdFByb2Nlc3MoYUZhY3RvcnksIGFkYXB0ZXIsIGVsZW1lbnQpOwotCQlyZXR1cm4gKFByb2Nlc3MpIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yU3RlcFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmYWM3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSBzdGVwIHNlY3Rpb24KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JTdGVwU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciBlbGVtZW50OwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQlwcml2YXRlIEZvcm1Ub29sa2l0IHRvb2xraXQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZCwgY3RybF9yZW1vdmUsIGN0cmxfdXAsIGN0cmxfZG93bjsKLQotCXByaXZhdGUgVGFibGUgY3RybF9zZWxlY3RlZDsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyOwotCi0JLy8gcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZfZGVzYzsKLQlwcml2YXRlIEltYWdlIHRpdGxlSW1hZ2U7Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5BYnN0cmFjdFNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LAotCQkJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpIHsKLQotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQkJaW5pdCgpOwotCi0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBjcmVhdGUgc3RlcHMgc2VjdGlvbgotCQljcmVhdGVTdGVwU2VjdGlvbihwYXJlbnQpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZQotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vIGdldCBhY3Rpdml0eSBvYmplY3QKLQkJZWxlbWVudCA9IChUYXNrRGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCi0JCS8vIGdldCB0b29sa2l0Ci0JCXRvb2xraXQgPSBnZXRXaWRnZXRGYWN0b3J5KCk7Ci0KLQkJLy8gZ2V0IGFjdGlvbiBtYW5hZ2VyCi0JCWFjdGlvbk1nciA9IEVQRlByb3BlcnR5U2hlZXRQYWdlLmdldEFjdGlvbk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLkFic3RyYWN0UHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQllbGVtZW50ID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCS8vIGhpZGUvcmVmcmVzaCBjb250cm9scwotCQkJCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKCJFcnJvciByZWZyZXNoaW5nIFRhc2tEZXNjcmlwdG9yIHN0ZXAgc2VjdGlvbiIgKyBlbGVtZW50LCBleCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQWJzdHJhY3RTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBjb250cm9scyBiYXNlZCBvbiBlZGl0YWJsZSBmbGFnLiBDb250cm9scyB3aWxsIGJlIGVpdGhlciBlZGl0YWJsZSAKLQkgKiBvciByZWFkLW9ubHkgYWZ0ZXIgdXBkYXRpbmcgdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJY3RybF9hZGQuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChlbGVtZW50LmdldFRhc2soKSA9PSBudWxsKQotCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVsc2UgewotCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQlpZiAoc3RlcHMgIT0gbnVsbCAmJiBzdGVwcy5zaXplKCkgPiAwKSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJZWxzZSAKLQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCAmJiBlZGl0YWJsZSkgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQl9IGVsc2UgewotCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgU3RlcCBzZWN0aW9uIG9uIHRoZSBnaXZlbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVN0ZXBTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gY3JlYXRlIHN0ZXAgc2VjdGlvbgotCQlTZWN0aW9uIHN0ZXBTZWN0aW9uID0gRm9ybVVJCi0JCQkJLmNyZWF0ZVNlY3Rpb24oCi0JCQkJCQl0b29sa2l0LAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9zdGVwSW5mb3JtYXRpb25UaXRsZSwgCi0JCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX3N0ZXBJbmZvcm1hdGlvbkRlc2NyaXB0aW9uKTsgCi0KLQkJLy8gY3JlYXRlIHN0ZXAgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzdGVwQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzdGVwU2VjdGlvbiwKLQkJCQkyLCBmYWxzZSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkX1N0ZXBzKTsgCi0KLQkJY3RybF9zZWxlY3RlZCA9IEZvcm1VSS5jcmVhdGVUYWJsZSh0b29sa2l0LCBwYW5lMSk7Ci0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjdHJsX3NlbGVjdGVkKTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRJbnB1dChlbGVtZW50KTsKLQotCQkvLyBjcmVhdGUgYnV0dG9uIGNvbXBvc2l0ZQotCQlDb21wb3NpdGUgcGFuZTIgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCQkJR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQl8IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKTsKLQotCQkvLyBjcmVhdGUgYnV0dG9ucwotCQljdHJsX2FkZCA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOwotCQljdHJsX2FkZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3RybF9yZW1vdmUgPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIHBhbmUyLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfUmVtb3ZlKTsgCi0JCWN0cmxfcmVtb3ZlLnNldEVuYWJsZWQoZmFsc2UpOwotCQljdHJsX3VwID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1VwKTsgCi0JCWN0cmxfZG93biA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Eb3duKTsgCi0KLQkJaWYgKGVsZW1lbnQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgewotCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIGJyaWVmIGRlc2NyaXB0aW9uCi0JCS8vIGludCBoZWlnaHRIaW50ID0gNDA7Ci0JCS8vIGludCBob3Jpem9udGFsU3BhbiA9IDI7Ci0JCS8vIExhYmVsIGxhYmVsID0gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLmJyaWVmRGVzY3JpcHRpb24iKSwKLQkJLy8gaGVpZ2h0SGludCk7Ci0JCS8vIGN0cmxfYnJpZWZfZGVzYyA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIHN0ZXBDb21wb3NpdGUsCi0JCS8vIGhlaWdodEhpbnQsIGhlaWdodEhpbnQpOwotCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0RWRpdGFibGUoZmFsc2UpOwotCQkvLwkJCi0JCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHN0ZXBDb21wb3NpdGUpOwotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgbGlzdGVuZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gQWRkIGZvY3VzIGxpc3RlbmVyIG9uIHByaW1hcnkgdGFza3MgbGlzdAotCQljdHJsX3NlbGVjdGVkLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgJiYgZWRpdGFibGUpIHsKLQkJCQkJY3RybF9yZW1vdmUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGlvbi5zaXplKCkgPiAwKSAmJiBlZGl0YWJsZSkgewotCQkJCQljdHJsX3JlbW92ZS5zZXRFbmFibGVkKHRydWUpOwotCi0JCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMAotCQkJCQkJCSYmIHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfdXAuc2V0RW5hYmxlZChmYWxzZSk7Ci0KLQkJCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIKLQkJCQkJCQkuZ2V0VGFibGUoKS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCQkmJiBzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl9IGVsc2UKLQkJCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCX0KLQotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQkJU3RyaW5nIGRlc2MgPSAoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkKLQkJCQkJCQkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkvLyBjdHJsX2JyaWVmX2Rlc2Muc2V0VGV4dChkZXNjKTsKLQkJCQl9IGVsc2UgaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCS8vIGN0cmxfYnJpZWZfZGVzYy5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJQcm9jZXNzLk11bHRpcGxlU2VsZWN0aW9uIikKLQkJCQkJLy8gKyAiIC0gIiArIHNlbGVjdGlvbi5zaXplKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9hZGQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgc3RlcENvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCi0JCQkJCQlyZXR1cm4gZ2V0U3RlcHMoKS50b0FycmF5KCk7Ci0vLwkJCQkJCS8vIGdldCBhbGwgc3RlcHMKLS8vCQkJCQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLS8vCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLS8vCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoCi0vLwkJCQkJCQkJZWxlbWVudCkuZ2V0RGVmYXVsdENvbnRleHQoKTsKLS8vCQkJCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSgKLS8vCQkJCQkJCQllbGVtZW50LmdldFRhc2soKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLS8vCQkJCQkJCQkJCS5nZXRUYXNrX1N0ZXBzKCksIGNvbmZpZyk7Ci0vLwotLy8JCQkJCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotLy8JCQkJCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotLy8JCQkJCQlyZXR1cm4gc3RlcHMudG9BcnJheSgpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCUlMYWJlbFByb3ZpZGVyIHN0ZXBMYWJlbFByb3ZpZGVyID0gbmV3IFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIoCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKE9iamVjdCBvYmopIHsKLQotCQkJCQkJYm9vbGVhbiBmbGFnID0gIWVsZW1lbnQuZ2V0VGFzaygpLmdldFByZXNlbnRhdGlvbigpCi0JCQkJCQkJCS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zKG9iaik7Ci0JCQkJCQlyZXR1cm4gZmxhZzsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBMaXN0U2VsZWN0aW9uRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZWxlbWVudC5nZXRUYXNrKCksIHN0ZXBDb250ZW50UHJvdmlkZXIsCi0JCQkJCQlzdGVwTGFiZWxQcm92aWRlciwgUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9TdGVwRGlhbG9nTWVzc2FnZSk7IAotCQkJCXRpdGxlSW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLmdldEltYWdlKCk7Ci0JCQkJTGlzdFNlbGVjdGlvbkRpYWxvZy5zZXREZWZhdWx0SW1hZ2UodGl0bGVJbWFnZSk7Ci0JCQkJZGxnLnNldFRpdGxlKFByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfU3RlcERpYWxvZ1RpdGxlKTsKLQkJCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZGxnLm9wZW4oKTsKLQotCQkJCWFkZFN0ZXBzKGRsZy5nZXRSZXN1bHQoKSk7Ci0JCQkJCi0JCQkJLy8gZW5hYmxlL2Rpc2FibGUgYWRkIGJ1dHRvbgotCQkJCUxpc3Qgc3RlcHMgPSBnZXRTdGVwcygpOwotCQkJCWlmIChzdGVwcyAhPSBudWxsICYmIHN0ZXBzLnNpemUoKSA+IDApIAotCQkJCQljdHJsX2FkZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQotCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfcmVtb3ZlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZVN0ZXBzKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJCS8vIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihudWxsLCB0cnVlKTsKLQkJCQkJLy8gY3RybF9icmllZl9kZXNjLnNldFRleHQoIiIpOwotCQkJCX0KLQkJCQkvLyBjdHJsX3JlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkKLQkJCQkvLyBlbmFibGUvZGlzYWJsZSBhZGQgYnV0dG9uCi0JCQkJTGlzdCBzdGVwcyA9IGdldFN0ZXBzKCk7Ci0JCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgc3RlcHMuc2l6ZSgpID4gMCkgCi0JCQkJCWN0cmxfYWRkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZSAKLQkJCQkJY3RybF9hZGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdXAuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCUFycmF5TGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCUJhc2ljRUxpc3Qgc3RlcExpc3QgPSAoQmFzaWNFTGlzdCkgZWxlbWVudAotCQkJCQkJCS5nZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBzdGVwTGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQlpZiAoaW5kZXggPiAwKQotCQkJCQkJCXN0ZXBMaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQkJCQkJLy8gVE9ETyAtIHdyaXRlIGEgY29tbWFuZC4gCi0JCQkJCS8vIGFjdGl2YXRlIGRpcnR5IGZsYWcKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBlbGVtZW50LAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCQkJCXN0ZXBMaXN0LCAtMSk7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwgc3RlcHMsCi0JCQkJCQkJLTEpOwotCi0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPiAwICYmIGVkaXRhYmxlKQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQljdHJsX3VwLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCQkJaWYgKHZpZXdlci5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCkgPCB2aWV3ZXIuZ2V0VGFibGUoKQotCQkJCQkJLmdldEl0ZW1Db3VudCgpIC0gMQotCQkJCQkJJiYgZWRpdGFibGUpCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF9kb3duLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCX0pOwotCi0JCWN0cmxfZG93bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlBcnJheUxpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJQXJyYXlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpdGVtcy5hZGRBbGwoc2VsZWN0aW9uLnRvTGlzdCgpKTsKLQkJCQkJQmFzaWNFTGlzdCBzdGVwTGlzdCA9IChCYXNpY0VMaXN0KSBlbGVtZW50Ci0JCQkJCQkJLmdldFNlbGVjdGVkU3RlcHMoKTsKLQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQkJCWludCBpbmRleCA9IHN0ZXBMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQotCQkJCQkJaWYgKGluZGV4IDwgc3RlcExpc3Quc2l6ZSgpIC0gMSkKLQkJCQkJCQlzdGVwTGlzdC5tb3ZlKGluZGV4ICsgaXRlbXMuc2l6ZSgpLCBvYmplY3QpOwotCi0JCQkJCX0KLQkJCQkJc3RlcHMuYWRkQWxsKHN0ZXBMaXN0KTsKLQotCQkJCQkvLyBUT0RPIC0gd3JpdGUgYSBjbW1hbmQuIEhhY2tpbmcgaXQgZm9yIG5vdyB0byBhY3RpdmF0ZQotCQkJCQkvLyBkaXJ0eSBmbGFnCi0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCQlzdGVwTGlzdCwgLTEpOwotCQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHN0ZXBzLAotCQkJCQkJCS0xKTsKLQotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpID4gMCAmJiBlZGl0YWJsZSkKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY3RybF91cC5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJCWlmICh2aWV3ZXIuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpIDwgdmlld2VyLmdldFRhYmxlKCkKLQkJCQkJCS5nZXRJdGVtQ291bnQoKSAtIDEKLQkJCQkJCSYmIGVkaXRhYmxlKQotCQkJCQljdHJsX2Rvd24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllbHNlCi0JCQkJCWN0cmxfZG93bi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiBTdGVwcyB0byB0YXNrIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gYWRkSXRlbXMKLQkgKiAJCQlMaXN0IG9mIHN0ZXBzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFN0ZXBzKE9iamVjdFtdIGFkZEl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKGFkZEl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkSXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24gaXRlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24pIGFkZEl0ZW1zW2ldOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhc3NpZ25lZCBzdGVwcyBmb3IgdGhlIHRhc2sgZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBybUl0ZW1zCi0JICogCQkJTGlzdCBvZiBzdGVwcyAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RlcHMoTGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJtSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiBpdGVtID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbikgaXQubmV4dCgpOwotCi0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSwKLQkJCQkJCWl0ZW0sIC0xKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXQgc3RlcHMgdGhhdCBjb3VsZCBiZSBhc3NpZ25lZCB0byB0aGlzIHRhc2sgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0U3RlcHMoKXsKLQkJLy8JZ2V0IGFsbCBzdGVwcwotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycwotCQkJCS5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygKLQkJCQllbGVtZW50KS5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlMaXN0IHN0ZXBzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKAotCQkJCWVsZW1lbnQuZ2V0VGFzaygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfU3RlcHMoKSwgY29uZmlnKTsKLQotCQkvLyByZW1vdmUgYWxyZWFkeSBleGlzdGluZyBzdGVwcwotCQlzdGVwcy5yZW1vdmVBbGwoZWxlbWVudC5nZXRTZWxlY3RlZFN0ZXBzKCkpOwotCQlyZXR1cm4gc3RlcHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzFiMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm9wZXJ0aWVzL1Rhc2tEZXNjcmlwdG9yV29ya1Byb2R1Y3RTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLklBY3Rpb25UeXBlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi0vKioKLSAqIFRoZSB0YXNrIGRlc2NyaXB0b3IgLSB3b3JrIHByb2R1Y3Qgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvcldvcmtQcm9kdWN0U2VjdGlvbiBleHRlbmRzIFJlbGF0aW9uU2VjdGlvbiB7Ci0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgcHJvY2VzcyB3b3JrIHByb2R1Y3QgZmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWZpbHRlciA9IG5ldyBQcm9jZXNzV29ya1Byb2R1Y3RGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLAotCQkJCQlGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0KLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjEoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIxKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyMS5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdENvbnRlbnRQcm92aWRlcjIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZW50UHJvdmlkZXIyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KAotCQkJCQkJKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKQotCQkJCQkJLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyMygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRlbnRQcm92aWRlcjMoKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBnZXRGaWx0ZXJlZExpc3QoCi0JCQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCkpCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfQotCQl9OwotCQl0YWJsZVZpZXdlcjMuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2luaXRDb250ZW50UHJvdmlkZXI0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyNCgpIHsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKSkKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyNC5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWludCBudW1PZlRhYmxlcyA9IDQ7Ci0JCXNldFRhYkRhdGEoUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfU2VjdGlvblRpdGxlLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1NlY3Rpb25EZXNjcmlwdGlvbiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTEsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5UYXNrRGVzY3JpcHRvcl9Xb3JrUHJvZHVjdHNfVGFibGUyLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGFza0Rlc2NyaXB0b3JfV29ya1Byb2R1Y3RzX1RhYmxlMywKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRhc2tEZXNjcmlwdG9yX1dvcmtQcm9kdWN0c19UYWJsZTQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQotCQlib29sZWFuW10gY2hhbmdlc0FsbG93ZWQgPSB7IHRydWUsIHRydWUsIHRydWUsIHRydWUgfTsKLQkJc2V0VGFibGVEYXRhKG51bU9mVGFibGVzLCBjaGFuZ2VzQWxsb3dlZCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWVsZW1lbnQgPSAoVGFza0Rlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJfQotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RGVzY3JpcHRvcnNGcm9tUHJvY2VzcygpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEVsZW1lbnRzSW5TY29wZShnZXRBZGFwdGVyRmFjdG9yeSgpLCBlbGVtZW50LAotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRXb3JrUHJvZHVjdHMoTGlzdCBpdGVtcykgewotCQlMaXN0IHdwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl3cExpc3QuYWRkKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVtcy5nZXQoaSkpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gd3BMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczEoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQllbGVtZW50TGlzdC5hZGRBbGwoZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRFeHRlcm5hbElucHV0KCkpKTsKLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmV3TGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yIGNtZCA9IG5ldyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoCi0JCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIG5ld0xpc3QsCi0JCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXMyKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgZWxlbWVudExpc3QgPSBnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJZWxlbWVudExpc3QuYWRkQWxsKGdldFdvcmtQcm9kdWN0cygoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkuZ2V0RXh0ZXJuYWxJbnB1dCgpKSk7Ci0KLQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbXMuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgb2JqOwotCQkJCQlpZiAoIWVsZW1lbnRMaXN0LmNvbnRhaW5zKHdwKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgY21kID0gbmV3IEFzc2lnbldQVG9UYXNrRGVzY3JpcHRvcigKLQkJCQkJCShUYXNrRGVzY3JpcHRvcikgZWxlbWVudCwgbmV3TGlzdCwKLQkJCQkJCUlBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCwKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkSXRlbXMzKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGVsZW1lbnRMaXN0ID0gZ2V0V29ya1Byb2R1Y3RzKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWVsZW1lbnRMaXN0LmFkZEFsbChnZXRXb3JrUHJvZHVjdHMoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkKLQkJCQkJLmdldE9wdGlvbmFsSW5wdXQoKSkpOwotCi0JCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZW1zLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIG9iajsKLQkJCQkJaWYgKCFlbGVtZW50TGlzdC5jb250YWlucyh3cCkpCi0JCQkJCQluZXdMaXN0LmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50LCBuZXdMaXN0LAotCQkJCQkJSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVULAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRJdGVtczQoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCUFzc2lnbldQVG9UYXNrRGVzY3JpcHRvciBjbWQgPSBuZXcgQXNzaWduV1BUb1Rhc2tEZXNjcmlwdG9yKAotCQkJCQkoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQsIGl0ZW1zLAotCQkJCQlJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1VUUFVULCBnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMShMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jcmVtb3ZlSXRlbXMyKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUl0ZW1zMihMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZCBjbWQgPSBuZXcgUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQoZWxlbWVudCwKLQkJCQkJaXRlbXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCk7Ci0JCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNyZW1vdmVJdGVtczMoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMzKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCVJlbW92ZURlc2NyaXB0b3JDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVEZXNjcmlwdG9yQ29tbWFuZChlbGVtZW50LAotCQkJCQlpdGVtcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI3JlbW92ZUl0ZW1zNChqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtczQoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJUmVtb3ZlRGVzY3JpcHRvckNvbW1hbmQgY21kID0gbmV3IFJlbW92ZURlc2NyaXB0b3JDb21tYW5kKGVsZW1lbnQsCi0JCQkJCWl0ZW1zLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldEV4aXN0aW5nRWxlbWVudHMxKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRFeGlzdGluZ0VsZW1lbnRzMSgpIHsKLQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMigpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czIoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzMygpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czMoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRFeHRlcm5hbElucHV0KCk7Ci0JfTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRFeGlzdGluZ0VsZW1lbnRzNCgpCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0RXhpc3RpbmdFbGVtZW50czQoKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPdXRwdXQoKTsKLQl9OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2dldFByb2Nlc3MoKQotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBvYmogPSBQcm9jZXNzVXRpbC5nZXRSb290UHJvY2VzcyhhRmFjdG9yeSwgYWRhcHRlciwgZWxlbWVudCk7Ci0JCXJldHVybiAoUHJvY2Vzcykgb2JqOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNnZXRGaWx0ZXJGb3JEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RmlsdGVyRm9yRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVzY3JpcHRvclByb2Nlc3NGaWx0ZXIoZ2V0Q29uZmlndXJhdGlvbigpKSB7Ci0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGlsZEFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUxpc3QgbGlzdDEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QxKTsKLQkJCQkJaWYgKGxpc3QxLmNvbnRhaW5zKG9iaikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXMxKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXMxKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWl0ZW1zLnJlbW92ZUFsbCgoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCQkJCWl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jYWRkRnJvbVByb2Nlc3NJdGVtczIoamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnJvbVByb2Nlc3NJdGVtczIoTGlzdCBpdGVtcykgewotCQlpZiAoIWl0ZW1zLmlzRW1wdHkoKSkgewotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQkJaXRlbXMucmVtb3ZlQWxsKCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpLmdldEV4dGVybmFsSW5wdXQoKSk7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIGVsZW1lbnQsCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJaXRlbXMsIC0xKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLlJlbGF0aW9uU2VjdGlvbiNhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zMyhMaXN0IGl0ZW1zKSB7Ci0JCWlmICghaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0TWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQlpdGVtcy5yZW1vdmVBbGwoKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLAotCQkJCQlpdGVtcywgLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuUmVsYXRpb25TZWN0aW9uI2FkZEZyb21Qcm9jZXNzSXRlbXM0KGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZyb21Qcm9jZXNzSXRlbXM0KExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BRERfTUFOWSwgZWxlbWVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIGl0ZW1zLCAtMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5SZWxhdGlvblNlY3Rpb24jZ2V0RGVzY3JpcHRvclRhYk5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRvclRhYk5hbWUoKSB7Ci0JCXJldHVybiBGaWx0ZXJDb25zdGFudHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JTOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UZWFtUHJvZmlsZVJvbGVTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvVGVhbVByb2ZpbGVSb2xlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg0YWY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9UZWFtUHJvZmlsZVJvbGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWRkUm9sZVRvVGVhbUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIHRlYW0gcHJvZmlsZSAtIHJvbGUvY29tcG9zaXRlIHJvbGUgc2VjdGlvbgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZVJvbGVTZWN0aW9uIGV4dGVuZHMgT0JTUmVsYXRpb25TZWN0aW9uIHsKLQotCUxpc3Qgcm9sZUxpc3QgPSBudWxsOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgdGFiYmVkUHJvcGVydHlTaGVldFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0Q29udGVudFByb3ZpZGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGVudFByb3ZpZGVyKCkgewotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCB0ZWFtUm9sZXMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKQotCQkJCQkJCXx8IChyb2xlRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSkKLQkJCQkJCW5ld0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCQl9Ci0KLQkJCQkvLyByZXR1cm4gKChUZWFtUHJvZmlsZSllbGVtZW50KS5nZXRUZWFtUm9sZXMoKS50b0FycmF5KCk7Ci0JCQkJcmV0dXJuIGdldEZpbHRlcmVkTGlzdChuZXdMaXN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGVsZW1lbnQ7Ci0KLQkJc2V0VGFiRGF0YShQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvblRpdGxlLCAKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlRlYW1Qcm9maWxlX1JvbGVfU2VjdGlvbkRlc2NyaXB0aW9uLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuVGVhbVByb2ZpbGVfUm9sZV9UYWJsZTEpOyAKLQkJc2hvd0FkZEZyb21Qcm9jZXNzQnV0dG9uID0gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCQkJCWVsZW1lbnQgPSAoVGVhbVByb2ZpbGUpIGdldEVsZW1lbnQoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcigiRXJyb3IgcmVmcmVzaGluZyBUZWFtIFByb2ZpbGUgcm9sZSBzZWN0aW9uICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mVGVhbShSb2xlIHJvbGUsIFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSB0ZWFtLmdldFRlYW1Sb2xlcygpOwotCQlMaXN0IHJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSB0ZWFtUm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQlyb2xlcy5hZGQocm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJfQotCi0JCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkKExpc3QgaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGUpCi0JCQkJCQkmJiAoIWlzUGFydE9mVGVhbSgoUm9sZSkgb2JqLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSkgewotCQkJCQlyb2xlcy5hZGQoKFJvbGUpIG9iaik7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIXJvbGVzLmlzRW1wdHkoKSkgewotCQkJCUFkZFJvbGVUb1RlYW1Db21tYW5kIGNtZCA9IG5ldyBBZGRSb2xlVG9UZWFtQ29tbWFuZCgKLQkJCQkJCShUZWFtUHJvZmlsZSkgZWxlbWVudCwgcm9sZXMpOwotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRnJvbVByb2Nlc3MoTGlzdCBpdGVtcykgewotCQkvLyB1cGRhdGUgdGhlIG1vZGVsCi0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBpdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJQ29tcG9zaXRlUm9sZSBjb21wUm9sZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKENvbXBvc2l0ZVJvbGUpIG9iaik7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJY29tcFJvbGUsIC0xKTsKLQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZWxlbWVudCwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQlvYmosIC0xKTsKLQkJCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlzUGFydE9mVGVhbShyb2xlLCAoVGVhbVByb2ZpbGUpIGVsZW1lbnQpKSB7Ci0JCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJCQlyb2xlRGVzYywgLTEpOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5BREQsIGVsZW1lbnQsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRUZWFtUHJvZmlsZV9UZWFtUm9sZXMoKSwKLQkJCQkJCQkJCQlvYmosIC0xKTsKLQotCQkJCQkJLy8gZmlyZSBOb3RpZmljYXRpb24KLQkJCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCQlBY3Rpdml0eSBwYXJlbnQgPSAoQWN0aXZpdHkpIGdldFBhcmVudEFjdGl2aXR5KGVsZW1lbnQpOwotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCi0JCQkJCQlmaXJlTm90aWZpY2F0aW9uKGNoaWxkcmVuLCAoUm9sZURlc2NyaXB0b3IpIG9iaik7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1RlYW1Bc3NpZ25FcnJvcik7IAotCQkJCQkJT2JqZWN0W10gYXJncyA9IHsgKChSb2xlRGVzY3JpcHRvcikgb2JqKS5nZXROYW1lKCksCi0JCQkJCQkJCSgoVGVhbVByb2ZpbGUpIGVsZW1lbnQpLmdldE5hbWUoKSB9OwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlTm90aWZpY2F0aW9uKENvbGxlY3Rpb24gY2hpbGRyZW4sIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQoKEFjdGl2aXR5KSBvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKChBY3Rpdml0eSkgb2JqKTsKLQkJCQlmaXJlTm90aWZpY2F0aW9uKGNoaWxkcmVuLCByb2xlRGVzYyk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyIGFjdGl2aXR5QWRhcHRlciA9IChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iajsKLQkJCQlmaXJlTm90aWZpY2F0aW9uKGFjdGl2aXR5QWRhcHRlci5nZXRDaGlsZHJlbihvMSksIHJvbGVEZXNjKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmo7Ci0JCQkJaWYgKCgoUm9sZURlc2NyaXB0b3IpIHByb3ZpZGVyLmdldFZhbHVlKCkpLmdldFJvbGUoKS5lcXVhbHMoCi0JCQkJCQlyb2xlRGVzYy5nZXRSb2xlKCkpKSB7Ci0JCQkJCXByb3ZpZGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24oCi0JCQkJCQkJbmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgcHJvdmlkZXIsCi0JCQkJCQkJCQlwcm92aWRlciksIHByb3ZpZGVyLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5PQlNSZWxhdGlvblNlY3Rpb24jcmVtb3ZlKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEFycmF5TGlzdCBybUl0ZW1zKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJaWYgKCFybUl0ZW1zLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm1JdGVtcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIGVsZW1lbnQsCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJCQkJKFJvbGVEZXNjcmlwdG9yKSBvYmosIC0xKTsKLQkJCQl9Ci0KLQkJCQkvLyBmaW5kIG1hdGNoaW5nIHJvbGVEZXNjcmlwdG9yIGluIHRlYW0gcm9sZXMKLQkJCQlMaXN0IHJvbGVEZXNjTGlzdCA9IGZpbmRSb2xlRGVzY3JpcHRvcigoT2JqZWN0KSBvYmopOwotCQkJCWZvciAoSXRlcmF0b3Igcm9sZURlc2NJdG9yID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IHJvbGVEZXNjSXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjSXRvcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgZWxlbWVudCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLAotCQkJCQkJcm9sZURlc2MsIC0xKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZmluZFJvbGVEZXNjcmlwdG9yKE9iamVjdCBvYmopIHsKLQkJTGlzdCB0ZWFtUm9sZXMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJTGlzdCByb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1Sb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdG9yT2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCWlmIChpdG9yT2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zaXRlUm9sZSkgewotCQkJCQlMaXN0IGZpcnN0T2JqZWN0QWdnUm9sZXMgPSAoKENvbXBvc2l0ZVJvbGUpIG9iaikKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCUxpc3Qgc2Vjb25kT2JqZWN0QWdnUm9sZXMgPSAoKENvbXBvc2l0ZVJvbGUpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlpZiAoZmlyc3RPYmplY3RBZ2dSb2xlcy5lcXVhbHMoc2Vjb25kT2JqZWN0QWdnUm9sZXMpKSB7Ci0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKGl0b3JPYmplY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmICgoaXRvck9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQkJJiYgKCEoaXRvck9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpKSkgewotCQkJCQlPYmplY3Qgb2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlPYmplY3QgaXRvck9ialJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBpdG9yT2JqZWN0KQotCQkJCQkJCS5nZXRSb2xlKCk7Ci0JCQkJCWlmIChvYmpSb2xlLmVxdWFscyhpdG9yT2JqUm9sZSkpIHsKLQkJCQkJCXJvbGVEZXNjTGlzdC5hZGQoaXRvck9iamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcm9sZURlc2NMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLk9CU1JlbGF0aW9uU2VjdGlvbiNvcGVuQWRkRGlhbG9nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuQWRkRGlhbG9nKCkgewotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoKChUZWFtUHJvZmlsZSkgZWxlbWVudCkKLQkJCQkJCS5nZXRUZWFtUm9sZXMoKSk7Ci0JCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgZ2V0RmlsdGVyKCksIGVsZW1lbnQsCi0JCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMsIGV4aXN0aW5nRWxlbWVudHMpOwotCQlmZC5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLlJPTEVTKTsKLQkJU3RyaW5nW10gc3RyID0gbmV3IFN0cmluZ1tde0ZpbHRlckNvbnN0YW50cy5ST0xFU307Ci0JCWZkLnNldFR5cGVzKHN0cik7Ci0JCWZkLm9wZW4oKTsKLQkJYWRkKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuT0JTUmVsYXRpb25TZWN0aW9uI29wZW5BZGRGcm9tUHJvY2Vzc0RpYWxvZygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkFkZEZyb21Qcm9jZXNzRGlhbG9nKCkgewotCQlMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSAoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRUZWFtUm9sZXMoKTsKLQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGdldFByb2Nlc3MoZWxlbWVudCk7Ci0JCUlGaWx0ZXIgZGVzY3JpcHRvckZpbHRlciA9IGdldERlc2NyaXB0b3JGaWx0ZXIoKTsKLQotCQlpZiAoZGVzY3JpcHRvckZpbHRlciAhPSBudWxsICYmIHByb2Nlc3MgIT0gbnVsbCkgewotCQkJSXRlbXNGaWx0ZXJEaWFsb2cgZmQgPSBuZXcgSXRlbXNGaWx0ZXJEaWFsb2coUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJZGVzY3JpcHRvckZpbHRlciwgcHJvY2VzcywKLQkJCQkJRmlsdGVyQ29uc3RhbnRzLlJPTEVfREVTQ1JJUFRPUlMsIGV4aXN0aW5nRWxlbWVudHMpOwotCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlmZC5zZXRUaXRsZShGaWx0ZXJDb25zdGFudHMuUk9MRV9ERVNDUklQVE9SUyk7Ci0JCQlmZC5vcGVuKCk7Ci0JCQlhZGRGcm9tUHJvY2VzcyhmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHBhcmVudCBGaW5kIHBhcmVudCB1bnRpbCBpdCdzIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJCVByb2Nlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlc2NyaXB0b3IgZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RGVzY3JpcHRvckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcihnZXRDb25maWd1cmF0aW9uKCkpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGNoaWxkQWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlMaXN0IHBhcmVudHNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgZWxlbWVudCwgcGFyZW50c0xpc3QpOwotCQkJCQlpZiAocGFyZW50c0xpc3QuY29udGFpbnMob2JqKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAob2JqLmVxdWFscyhnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KSkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJTGlzdCBjaGlsZExpc3QgPSAoKEFjdGl2aXR5KSBvYmopLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJCWlmIChjaGlsZExpc3QuY29udGFpbnMoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCUxpc3QgbGlzdCA9IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKTsKLQkJCQkJaWYgKGxpc3QuY29udGFpbnMob2JqKSl7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCQkJTGlzdCBiZWxlbWVudHMgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQkJaWYoIWJlbGVtZW50cy5pc0VtcHR5KCkpewotLy8JCQkJCQkJaWYoY29udGFpbnNUeXBlKGJlbGVtZW50cywgUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0vLwkJCQkJCQkJCQkJZ2V0SGVscGVyKCkpKQotLy8JCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IHBhcmVudEFjdGl2aXR5ID0gZ2V0UGFyZW50QWN0aXZpdHkoKEJyZWFrZG93bkVsZW1lbnQpIG9iaik7Ci0JCQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJCQkJaWYgKHBhcmVudC5lcXVhbHMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJaWYgKHBhcmVudEFjdGl2aXR5IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWlmIChnZXRCYXNlQWN0aXZpdGllcygoQWN0aXZpdHkpIHBhcmVudCkuY29udGFpbnMoCi0JCQkJCQkJCXBhcmVudEFjdGl2aXR5KSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWlmIChnZXRBbGxvd2FibGVBY3Rpdml0aWVzKCkuY29udGFpbnMocGFyZW50QWN0aXZpdHkpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopCi0JCQkJCQkJLmdldFBhcmVudChvYmopOwotCQkJCQlpZiAoZ2V0UGFyZW50QWN0aXZpdHkoZWxlbWVudCkuZXF1YWxzKG9iamVjdCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJb2JqZWN0ID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQkJfQotCQkJCQkJaWYgKGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKS5jb250YWlucyhvYmplY3QpKQotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikKLQkJCQkJCQkuZ2V0UGFyZW50KG9iaik7Ci0JCQkJCWlmIChnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KS5lcXVhbHMocGFyZW50KSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlPYmplY3Qgb2JqZWN0ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKQotCQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCUxpc3QgbGlzdCA9IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKTsKLQkJCQkJCWlmIChsaXN0LmNvbnRhaW5zKG9iamVjdCkpewotCQkJCQkJCXJldHVybiB0cnVlOwotLy8JCQkJCQkJTGlzdCBiZWxlbWVudHMgPSAoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQkJCWlmKCFiZWxlbWVudHMuaXNFbXB0eSgpKXsKLS8vCQkJCQkJCQlpZihjb250YWluc1R5cGUoYmVsZW1lbnRzLCBSb2xlRGVzY3JpcHRvci5jbGFzcyxnZXRIZWxwZXIoKSkpCi0vLwkJCQkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQlwcml2YXRlIExpc3QgZ2V0QmFzZUFjdGl2aXRpZXMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpCi0JCQkJLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuTkEpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0KLQkJCQlsaXN0LmFkZCh2ZSk7Ci0KLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgdmU7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJCVBhcmVudCBhY3Rpdml0eQotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgYWN0aXZpdHkgcGFyZW50IHJlY3Vyc2l2ZWx5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gYWN0aXZpdHlMaXN0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlBY3Rpdml0eSBwYXJlbnQsIExpc3QgYWN0aXZpdHlMaXN0KSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJT2JqZWN0IG8gPSBhZGFwdGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWFjdGl2aXR5TGlzdC5hZGQob2JqKTsKLQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJT2JqZWN0IG8xID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmopLmdldFZhbHVlKCk7Ci0JCQkJCWFjdGl2aXR5TGlzdC5hZGQobzEpOwotCQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG8xLAotCQkJCQkJCWFjdGl2aXR5TGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zVHlwZShMaXN0IGxpc3QsIENsYXNzIGNsYXNzMSwgRmlsdGVySGVscGVyIGhlbHBlcikgewotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgCi0JCQkJCSYmIGNsYXNzMS5pc0luc3RhbmNlKG9iaikKLQkJCQkJJiYgaGVscGVyLm1hdGNoZXIob2JqKSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZihvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJcmV0dXJuIGNvbnRhaW5zVHlwZSgoKEFjdGl2aXR5KW9iaikuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQkJCWNsYXNzMSwgaGVscGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsbCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICogCi0JICogQHJldHVybgotCSAqIAkJTGlzdCBvZiBhY3Rpdml0aWVzIGluIHNjb3BlCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldEFsbG93YWJsZUFjdGl2aXRpZXMoKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gcGFyZW50IGFjdGl2aXR5Ci0JCU9iamVjdCBvYmplY3QgPSBnZXRQYXJlbnRBY3Rpdml0eShlbGVtZW50KTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJLy8gZ2V0IGFsbCBjaGlsZCBhY3Rpdml0aWVzIGluIHNjb3BlCi0JCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iamVjdCwgbGlzdCk7Ci0JCX0KLQkJLy8gZ2V0IGJhc2UgYWN0aXZpdGllcyBmb3IgYWxsIGFjdGl2aXRpZXMgaW4gc2NvcGUKLQkJSGFzaFNldCBiYXNlQWN0aXZ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWJhc2VBY3RpdnRpZXMuYWRkQWxsKGdldEJhc2VBY3Rpdml0aWVzKChBY3Rpdml0eSkgb2JqKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXR1cm4gY29tcGxldGUgbGlzdCBvZiBjaGlsZCBhY3Rpdml0aWVzIGFuZCBpdCdzIGJhc2UgYWN0aXZpdGllcwotCQlsaXN0LmFkZEFsbChiYXNlQWN0aXZ0aWVzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya0JyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlkMjYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuQ29sdW1uRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuUHJvY2Vzc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9Cb3hDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFRoZSBnZW5lcmFsIHRhYiBzZWN0aW9uIGZvciBXb3JrQnJlYWtkb3duRWxlbWVudAotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudDsKLQotCXByb3RlY3RlZCBCdXR0b24gZXZlbnREcml2ZW5CdXR0b24sIG9uZ29pbmdCdXR0b24sIHJlcGVhdGFibGVCdXR0b247Ci0KLQkvLyBwcm90ZWN0ZWQgVGV4dCBwcmVkZWNlc3NvclRleHQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRCdXR0b24sIGVkaXRCdXR0b24sIHJlbW92ZUJ1dHRvbjsKLQotCS8vIHByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZXZlbnREcml2ZW5CdXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQkvLyBwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIG9uZ29pbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQkvLyBwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIHJlcGVhdGFibGVCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8vIHByaXZhdGUgTGlzdGVuZXIgcHJlZGVjZXNzb3JzTGlzdGVuZXI7Ci0KLQkvLyBwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZpZXdlcjsKLQotCS8vIHByaXZhdGUgVGFibGUgdGFibGU7Ci0JcHJpdmF0ZSBUZXh0Q2VsbEVkaXRvciB0ZXh0Q2VsbEVkaXRvcjsKLQotCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGlkQ2VsbEVkaXRvcjsKLQotCXByaXZhdGUgQ29tYm9Cb3hDZWxsRWRpdG9yIGNvbWJvQm94Q2VsbEVkaXRvcjsKLQotCS8vIHByZWRlY2Vzc29yIG1hcCBsaXN0Ci0JcHJpdmF0ZSBMaXN0IHByZWRNYXBMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBjbGFzcyBWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgZXh0ZW5kcyBUZXh0Q2VsbEVkaXRvciB7Ci0JCXByb3RlY3RlZCBPYmplY3QgbGFzdEludmFsaWRFbGVtZW50OwotCi0JCXByaXZhdGUgaW50IGNvbHVtbkluZGV4OwotCi0JCS8qKgotCQkgKiBAcGFyYW0gcGFyZW50Ci0JCSAqLwotCQlwdWJsaWMgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCX0KLQotCQl2b2lkIHNldENvbHVtbkluZGV4KGludCBjb2x1bW5JbmRleCkgewotCQkJdGhpcy5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb2x1bW5JbmRleCgpIHsKLQkJCXJldHVybiBjb2x1bW5JbmRleDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0TGFzdEludmFsaWRFbGVtZW50KCkgewotCQkJcmV0dXJuIGxhc3RJbnZhbGlkRWxlbWVudDsKLQkJfQotCi0JCVN0cmluZyBpc1ZhbGlkKFN0cmluZyB0eHQpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCQlPYmplY3QgZSA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgbXNnID0gaXNWYWxpZChlLCB0eHQpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlsYXN0SW52YWxpZEVsZW1lbnQgPSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxhc3RJbnZhbGlkRWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgaXNWYWxpZChPYmplY3QgZSwgU3RyaW5nIHR4dCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKiogRGVwZW5kZW5jeSBMaXRlcmFscyAqICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19TVEFSVCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9GSU5JU0hfVE9fU1RBUlQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfRklOSVNIX1RPX0ZJTklTSDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVE9fU1RBUlQgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtPcmRlclR5cGVfU1RBUlRfVE9fU1RBUlQ7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1RPX0ZJTklTSCA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya09yZGVyVHlwZV9TVEFSVF9UT19GSU5JU0g7IAotCi0JLyoqIENvbHVtbiBpZHMgKiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSUQgPSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVTRU5UQVRJT05fTkFNRSA9IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0RFUEVOREVOQ1kgPSAiZGVwZW5kZW5jeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBDb2x1bW4gZGVzY3JpcHRvciBjb25zdGFudHMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbHVtbkRlc2NyaXB0b3IgQ09MX0RFU0NfSUQgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcigKLQkJCUNPTF9JRCwKLQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfSURfVEVYVCwgMCwgMTAwLCB0cnVlLCBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfVEVYVCwgU1dULkNFTlRFUik7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5EZXNjcmlwdG9yIENPTF9ERVNDX1BSRVNFTlRBVElPTl9OQU1FID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlDT0xfUFJFU0VOVEFUSU9OX05BTUUsCi0JCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQ09MX1BSRVNFTlRBVElPTl9OQU1FX1RFWFQsIDEsIDI1MCwgdHJ1ZSwgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX05PTkUpOyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sdW1uRGVzY3JpcHRvciBDT0xfREVTQ19ERVBFTkRFTkNZID0gbmV3IENvbHVtbkRlc2NyaXB0b3IoCi0JCQlDT0xfREVQRU5ERU5DWSwKLQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9DT0xfREVQRU5ERU5DWV9URVhULCAyLCAxMDAsIHRydWUsIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9DT01CT19CT09MRUFOKTsgCi0KLQlDb2x1bW5EZXNjcmlwdG9yW10gY29sdW1uRGVzY3JpcHRvcnMgPSBuZXcgQ29sdW1uRGVzY3JpcHRvcltdIHsKLQkJCUNPTF9ERVNDX0lELCBDT0xfREVTQ19QUkVTRU5UQVRJT05fTkFNRSwgQ09MX0RFU0NfREVQRU5ERU5DWSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2VsbEVkaXRvclZhbGlkYXRvciBpbXBsZW1lbnRzIElDZWxsRWRpdG9yVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBDZWxsRWRpdG9yVmFsaWRhdG9yKFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvciBjZWxsRWRpdG9yKSB7Ci0JCQl0aGlzLmNlbGxFZGl0b3IgPSBjZWxsRWRpdG9yOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiBjZWxsRWRpdG9yLmlzVmFsaWQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFZhbGlkYXRpbmdEZWFjdGl2YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXByaXZhdGUgVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQkJVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihWYWxpZGF0aW5nVGV4dENlbGxFZGl0b3IgY2VsbEVkaXRvcikgewotCQkJdGhpcy5jZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlZhbGlkYXREZWFjdGl2YXRlZTo6cnVuIik7Ci0JCQkJCWlmIChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gY2VsbEVkaXRvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGdldEVkaXRvcigpLmdldFRpdGxlKCk7Ci0JCQkJCQlTdHJpbmcgcHJvYmxlbSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvckZvcm1Qcm9wZXJ0aWVzX3RleHRFZGl0Q2VsbF9wcm9ibGVtX21zZzsgCi0JCQkJCQlNc2dEaWFsb2cgZGlhbG9nID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJCWRpYWxvZy5kaXNwbGF5RXJyb3IodGl0bGUsIHByb2JsZW0sIG1lc3NhZ2UpOyAKLQkJCQkJCXZpZXdlci5lZGl0RWxlbWVudChjZWxsRWRpdG9yLmdldExhc3RJbnZhbGlkRWxlbWVudCgpLAotCQkJCQkJCQljZWxsRWRpdG9yLmdldENvbHVtbkluZGV4KCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNpbml0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0KLQkJLy8gZ2V0IHdvcmticmVha2Rvd25lbGVtZW50IG9iamVjdAotCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uI2NyZWF0ZUdlbmVyYWxTZWN0aW9uKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHZW5lcmFsU2VjdGlvbihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXN1cGVyLmNyZWF0ZUdlbmVyYWxTZWN0aW9uKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gRXZlbnQgRHJpdmVuCi0JCWV2ZW50RHJpdmVuQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUNoZWNrQnV0dG9uKHRvb2xraXQsIGNoZWNrQm94Q29tcG9zaXRlLAotCQkJCTEpOwotCQlldmVudERyaXZlbkJ1dHRvbi5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRXZlbnREcml2ZW4pOyAKLQotCQkvLyBPbmdvaW5nCi0JCW9uZ29pbmdCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMSk7Ci0JCW9uZ29pbmdCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X09uZ29pbmcpOyAKLQotCQkvLyByZXBlYXRhYmxlCi0JCXJlcGVhdGFibGVCdXR0b24gPSBGb3JtVUkuY3JlYXRlQ2hlY2tCdXR0b24odG9vbGtpdCwgY2hlY2tCb3hDb21wb3NpdGUsCi0JCQkJMik7Ci0JCXJlcGVhdGFibGVCdXR0b24uc2V0VGV4dChQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X1JlcGVhdGFibGUpOyAKLQotCQkvLyBwcmVkZWNlc3NvcnMKLQkJLy8gRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCS8vIFByb3BlcnRpZXNSZXNvdXJjZXMuZ2V0U3RyaW5nKCJXb3JrQnJlYWtkb3duRWxlbWVudC5QcmVkZWNlc3NvcnMiKSk7Ci0JCS8vIHByZWRlY2Vzc29yVGV4dCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCS8vIFNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0JCS8vIHByZWRlY2Vzc29yVGV4dC5zZXRUZXh0KGdldFByZWRlY2Vzc29yc0xpc3QoKSk7Ci0KLQkJLy8gZGVwZW5lbmN5IHR5cGUKLQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5KTsgCi0KLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSB2aWV3ZXIKLQkJCWNyZWF0ZVZpZXdlcihnZW5lcmFsQ29tcG9zaXRlLCAyKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciBjcmVhdGluZyB2aWV3ZXIgZm9yIHdvcmticmVha2Rvd24gZWxlbWVudCBnZW5lcmFsIHNlY3Rpb246ICIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gY3JlYXRlIGJ1dHRvbiBwYW5lCi0JCUNvbXBvc2l0ZSBidXR0b25QYW5lID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoZ2VuZXJhbENvbXBvc2l0ZSk7Ci0JCWJ1dHRvblBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQlidXR0b25QYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgYnV0dG9uUGFuZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uUGFuZSwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtCcmVha2Rvd25FbGVtZW50X0RlcGVuZGVuY3lfQWRkKTsgCi0JCWVkaXRCdXR0b24gPSBGb3JtVUkuY3JlYXRlQnV0dG9uKHRvb2xraXQsIGJ1dHRvblBhbmUsCi0JCQkJUHJvcGVydGllc1Jlc291cmNlcy5Xb3JrQnJlYWtkb3duRWxlbWVudF9EZXBlbmRlbmN5X0VkaXQpOyAKLQkJcmVtb3ZlQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25QYW5lLAotCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuV29ya0JyZWFrZG93bkVsZW1lbnRfRGVwZW5kZW5jeV9SZW1vdmUpOyAKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJZXZlbnREcml2ZW5CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKGV2ZW50RHJpdmVuQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlldmVudERyaXZlbkJ1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc0V2ZW50RHJpdmVuKCkKLQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCW9uZ29pbmdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsCi0JCQkJCQllbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4KLQkJCQkJCQkJLnZhbHVlT2Yob25nb2luZ0J1dHRvbi5nZXRTZWxlY3Rpb24oKSksIC0xKTsKLQkJCQlpZiAoIXN0YXR1cykKLQkJCQkJb25nb2luZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZWxlbWVudC5nZXRJc09uZ29pbmcoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVwZWF0YWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCWVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihyZXBlYXRhYmxlQnV0dG9uLmdldFNlbGVjdGlvbigpKSwgLTEpOwotCQkJCWlmICghc3RhdHVzKQotCQkJCQlyZXBlYXRhYmxlQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzUmVwZWF0YWJsZSgpCi0JCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIExpc3QgcHJlZExpc3QgPSBlbGVtZW50LmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCQkJV29ya09yZGVyIG8gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJCQlvLnNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKTsKLQotCQkJCS8vIHByZWRMaXN0LmFkZChvKTsKLQotCQkJCVByZWRlY2Vzc29yTWFwIG1hcCA9IG5ldyBQcmVkZWNlc3Nvck1hcCgtMSwgKFdvcmtPcmRlcikgbyk7Ci0JCQkJcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0KLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCXZpZXdlci5lZGl0RWxlbWVudChtYXAsIDApOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBnZXQgc2VsZWN0aW9uCi0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCQkJUHJlZGVjZXNzb3JNYXAgcHJlZE1hcCA9IChQcmVkZWNlc3Nvck1hcCkgc2VsZWN0aW9uCi0JCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCQkJCQlPYmplY3QgcHJvY2VzcyA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCi0JCQkJCVByZWRlY2Vzc29yRGlhbG9nIGRsZyA9IG5ldyBQcmVkZWNlc3NvckRpYWxvZyhQbGF0Zm9ybVVJCi0JCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksIGVsZW1lbnQsIHByb2Nlc3MsIGdldEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJcHJlZE1hcCwgcHJlZE1hcExpc3QsIGFjdGlvbk1ncik7Ci0JCQkJCWRsZy5vcGVuKCk7Ci0KLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcgotCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJCQlQcmVkZWNlc3Nvck1hcCBtYXAgPSAoUHJlZGVjZXNzb3JNYXApIHNlbGVjdGlvbgotCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJcHJlZE1hcExpc3QucmVtb3ZlKG1hcCk7Ci0KLQkJCQkJV29ya09yZGVyIHdvID0gbWFwLmdldFdvcmtPcmRlcigpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLAotCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCksCi0JCQkJCQkJCQl3bywgLTEpOwotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCi0JCQkJfQotCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmIGVkaXRhYmxlKSB7Ci0JCQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQllZGl0QnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCS8vIHByaXZhdGUgU3RyaW5nIGdldFByZWRlY2Vzc29yc0xpc3QoKQotCS8vIHsKLQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldEJTQWRhcHRlcigpOwotCS8vIHJldHVybiBhZGFwdGVyLmdldEF0dHJpYnV0ZShlbGVtZW50LCBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUyk7Ci0JLy8gfQotCS8vIHByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpCi0JLy8gewotCS8vIHN1cGVyLmFkZExpc3RlbmVycygpOwotCS8vCQkKLQkvLyBldmVudERyaXZlbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihldmVudERyaXZlbkJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyBvbmdvaW5nQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG9uZ29pbmdCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gcmVwZWF0YWJsZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihyZXBlYXRhYmxlQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIC8vcHJlZGVjZXNzb3JUZXh0LmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBwcmVkZWNlc3NvcnNMaXN0ZW5lcik7Ci0JLy8gfQotCS8vCQotCS8vIHByb3RlY3RlZCB2b2lkIHJlbW92ZUxpc3RlbmVycygpCi0JLy8gewotCS8vIHN1cGVyLnJlbW92ZUxpc3RlbmVycygpOwotCS8vCQkJCi0JLy8gZXZlbnREcml2ZW5CdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoZXZlbnREcml2ZW5CdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JLy8gb25nb2luZ0J1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihvbmdvaW5nQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCS8vIHJlcGVhdGFibGVCdXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIocmVwZWF0YWJsZUJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkvLyAvL3ByZWRlY2Vzc29yVGV4dC5yZW1vdmVMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgcHJlZGVjZXNzb3JzTGlzdGVuZXIpOwotCS8vIH0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJc3VwZXIudXBkYXRlQ29udHJvbHMoKTsKLQkJZXZlbnREcml2ZW5CdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCW9uZ29pbmdCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXJlcGVhdGFibGVCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCXZpZXdlci5nZXRUYWJsZSgpLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlhZGRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEgJiYgZWRpdGFibGUpIHsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLS8vCQlpZiAoKEVQRlByb3BlcnR5U2hlZXRQYWdlLmZvcm1QYWdlSUQKLS8vCQkJCS5lcXVhbHMoUHJvY2Vzc0VkaXRvci5UQV9GT1JNX0lEKSkKLS8vCQkJCXx8IChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlECi0vLwkJCQkJCS5lcXVhbHMoUHJvY2Vzc0VkaXRvci5XUEJTX0ZPUk1fSUQpKSkgewotCQlpZiAoIShFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRWRpdG9yLldCU19GT1JNX0lEKSB8fCBFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlECi0JCQkJLmVxdWFscyhQcm9jZXNzRWRpdG9yLkNPTlNPTElEQVRFRF9GT1JNX0lEKSkpIHsKLQkJCWFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl2aWV3ZXIuZ2V0VGFibGUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQl0cnkgewotCQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJc3VwZXIucmVmcmVzaCgpOwotCQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJCWV2ZW50RHJpdmVuQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzRXZlbnREcml2ZW4oKQotCQkJCQkJLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlvbmdvaW5nQnV0dG9uLnNldFNlbGVjdGlvbihlbGVtZW50LmdldElzT25nb2luZygpCi0JCQkJCQkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJlcGVhdGFibGVCdXR0b24uc2V0U2VsZWN0aW9uKGVsZW1lbnQuZ2V0SXNSZXBlYXRhYmxlKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJLy8gcHJlZGVjZXNzb3JUZXh0LnNldFRleHQoZ2V0UHJlZGVjZXNzb3JzTGlzdCgpKTsKLQotCQkJCS8vIHJlLWluaXRpYWxpemUgcHJlZExpc3QKLQkJCQlwcmVkTWFwTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbml0aWFsaXplUHJlZExpc3QoKTsKLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXJyb3IgcmVmcmVzaGluZyBXb3JrYnJlYWtkb3duIGVsZW1lbnQgZ2VuZXJhbCBzZWN0aW9uOiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4pIHsKLQkJLy8gY3JlYXRlIHByb2Nlc3Mgdmlld2VyCi0JCXZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNTA7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gaG9yaXpvbnRhbFNwYW47Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gc2V0IHVwIGNvbHVtbnMKLQkJU3RyaW5nW10gY29sUHJvcHMgPSBuZXcgU3RyaW5nW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWNvbFByb3BzW2ldID0gY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQ7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odmlld2VyLmdldFRhYmxlKCksCi0JCQkJCWNvbHVtbkRlc2NyaXB0b3JzW2ldLmFsaWdubWVudCk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5EZXNjcmlwdG9yc1tpXS5sYWJlbCk7Ci0JCQljb2x1bW4uc2V0UmVzaXphYmxlKGNvbHVtbkRlc2NyaXB0b3JzW2ldLnJlc2l6YWJsZSk7Ci0JCQljb2x1bW4uc2V0V2lkdGgoY29sdW1uRGVzY3JpcHRvcnNbaV0ud2lkdGgpOwotCi0JCX0KLQkJdmlld2VyLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoY29sUHJvcHMpOwotCi0JCS8vIHRhYmxlID0gdmlld2VyLmdldFRhYmxlKCk7Ci0KLQkJLy8gZmluYWwgVGFibGVDdXJzb3IgY3Vyc29yID0gbmV3IFRhYmxlQ3Vyc29yKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCS8vIGZpbmFsIENvbnRyb2xFZGl0b3IgZWRpdG9yID0gbmV3IENvbnRyb2xFZGl0b3IoY3Vyc29yKTsKLQkJLy8gZWRpdG9yLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJLy8gZWRpdG9yLmdyYWJWZXJ0aWNhbCA9IHRydWU7Ci0KLQkJLy8gZmluYWwgVGFibGVDdXJzb3IgY3Vyc29yID0gbmV3IFRhYmxlQ3Vyc29yKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCS8vIC8vIGNyZWF0ZSBhbiBlZGl0b3IgdG8gZWRpdCB0aGUgY2VsbCB3aGVuIHRoZSB1c2VyIGhpdHMgIkVOVEVSIgotCQkvLyAvLyB3aGlsZSBvdmVyIGEgY2VsbCBpbiB0aGUgdGFibGUKLQkJLy8gZmluYWwgQ29udHJvbEVkaXRvciBlZGl0b3IgPSBuZXcgQ29udHJvbEVkaXRvcihjdXJzb3IpOwotCQkvLyBlZGl0b3IuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkvLyBlZGl0b3IuZ3JhYlZlcnRpY2FsID0gdHJ1ZTsKLQkJLy8KLQkJLy8gY3Vyc29yLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkvLyAvLyB3aGVuIHRoZSBUYWJsZUVkaXRvciBpcyBvdmVyIGEgY2VsbCwgc2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIHJvdwotCQkvLyBpbgotCQkvLyAvLyB0aGUgdGFibGUKLQkJLy8gcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyB0YWJsZS5zZXRTZWxlY3Rpb24obmV3IFRhYmxlSXRlbVtdIHsgY3Vyc29yLmdldFJvdygpfSk7Ci0JCS8vIH0KLQkJLy8gLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIgaW4gdGhlIFRhYmxlQ3Vyc29yLCBwb3AgdXAgYSB0ZXh0Ci0JCS8vIGVkaXRvciBzbyB0aGF0Ci0JCS8vIC8vIHRoZXkgY2FuIGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY2VsbAotCQkvLyBwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBmaW5hbCBUZXh0IHRleHQgPSBuZXcgVGV4dChjdXJzb3IsIFNXVC5OT05FKTsKLQkJLy8gVGFibGVJdGVtIHJvdyA9IGN1cnNvci5nZXRSb3coKTsKLQkJLy8gaW50IGNvbHVtbiA9IGN1cnNvci5nZXRDb2x1bW4oKTsKLQkJLy8gdGV4dC5zZXRUZXh0KHJvdy5nZXRUZXh0KGNvbHVtbikpOwotCQkvLyB0ZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkvLyBwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJLy8gLy8gY2xvc2UgdGhlIHRleHQgZWRpdG9yIGFuZCBjb3B5IHRoZSBkYXRhIG92ZXIKLQkJLy8gLy8gd2hlbiB0aGUgdXNlciBoaXRzICJFTlRFUiIKLQkJLy8gaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkvLyBUYWJsZUl0ZW0gcm93ID0gY3Vyc29yLmdldFJvdygpOwotCQkvLyBpbnQgY29sdW1uID0gY3Vyc29yLmdldENvbHVtbigpOwotCQkvLyBpZiAoY29sdW1uID09IDEpIHJldHVybjsKLQkJLy8gcm93LnNldFRleHQoY29sdW1uLCB0ZXh0LmdldFRleHQoKSk7Ci0JCS8vIHRleHQuZGlzcG9zZSgpOwotCQkvLyB9Ci0JCS8vIC8vIGNsb3NlIHRoZSB0ZXh0IGVkaXRvciB3aGVuIHRoZSB1c2VyIGhpdHMgIkVTQyIKLQkJLy8gaWYgKGUuY2hhcmFjdGVyID09IFNXVC5FU0MpIHsKLQkJLy8gdGV4dC5kaXNwb3NlKCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9KTsKLQkJLy8gZWRpdG9yLnNldEVkaXRvcih0ZXh0KTsKLQkJLy8gdGV4dC5zZXRGb2N1cygpOwotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyAvLyBIaWRlIHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIGhpdHMgdGhlICJDVFJMIiBvciAiU0hJRlQiIGtleS4KLQkJLy8gLy8gVGhpcyBhbG93cyB0aGUgdXNlciB0byBzZWxlY3QgbXVsdGlwbGUgaXRlbXMgaW4gdGhlIHRhYmxlLgotCQkvLyBjdXJzb3IuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkvLyBpZiAoZS5rZXlDb2RlID09IFNXVC5DVFJMCi0JCS8vIHx8IGUua2V5Q29kZSA9PSBTV1QuU0hJRlQKLQkJLy8gfHwgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDAKLQkJLy8gfHwgKGUuc3RhdGVNYXNrICYgU1dULlNISUZUKSAhPSAwKSB7Ci0JCS8vIGN1cnNvci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0pOwotCQkvLyAvLyBTaG93IHRoZSBUYWJsZUN1cnNvciB3aGVuIHRoZSB1c2VyIHJlbGVhc2VzIHRoZSAiU0hJRlQiIG9yICJDVFJMIgotCQkvLyBrZXkuCi0JCS8vIC8vIFRoaXMgc2lnbmFscyB0aGUgZW5kIG9mIHRoZSBtdWx0aXBsZSBzZWxlY3Rpb24gdGFzay4KLQkJLy8gdGFibGUuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7Ci0JCS8vIHB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJLy8gaWYgKGUua2V5Q29kZSA9PSBTV1QuQ09OVFJPTCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCS8vIHJldHVybjsKLQkJLy8gaWYgKGUua2V5Q29kZSA9PSBTV1QuU0hJRlQgJiYgKGUuc3RhdGVNYXNrICYgU1dULkNPTlRST0wpICE9IDApCi0JCS8vIHJldHVybjsKLQkJLy8gaWYgKGUua2V5Q29kZSAhPSBTV1QuQ09OVFJPTAotCQkvLyAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuQ09OVFJPTCkgIT0gMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBpZiAoZS5rZXlDb2RlICE9IFNXVC5TSElGVCAmJiAoZS5zdGF0ZU1hc2sgJiBTV1QuU0hJRlQpICE9IDApCi0JCS8vIHJldHVybjsKLQkJLy8KLQkJLy8gVGFibGVJdGVtW10gc2VsZWN0aW9uID0gdGFibGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIFRhYmxlSXRlbSByb3cgPSAoc2VsZWN0aW9uLmxlbmd0aCA9PSAwKSA/Ci0JCS8vIHRhYmxlLmdldEl0ZW0odGFibGUuZ2V0VG9wSW5kZXgoKSkgOiBzZWxlY3Rpb25bMF07Ci0JCS8vIHRhYmxlLnNob3dJdGVtKHJvdyk7Ci0JCS8vIGN1cnNvci5zZXRTZWxlY3Rpb24ocm93LCAwKTsKLQkJLy8gY3Vyc29yLnNldFZpc2libGUodHJ1ZSk7Ci0JCS8vIGN1cnNvci5zZXRGb2N1cygpOwotCQkvLyB9Ci0JCS8vIH0pOwotCi0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iaikgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUHJlZE1hcExpc3Q6OiIrcHJlZE1hcExpc3QpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJCXJldHVybiAoKExpc3QpIHByZWRNYXBMaXN0KS50b0FycmF5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJZ2V0QWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXb3JrQnJlYWtkb3duRWxlbWVudEdlbmVyYWxTZWN0aW9uOjpsYWJlbFByb3ZpZGVyCi0JCQkJLy8gT2JqZWN0LSAiICsgb2JqKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUHJlZGVjZXNzb3JNYXApIHsKLQkJCQkJaW50IGlkID0gKChQcmVkZWNlc3Nvck1hcCkgb2JqKS5nZXRJZCgpOwotCQkJCQlXb3JrT3JkZXIgd28gPSAoKFByZWRlY2Vzc29yTWFwKSBvYmopLmdldFdvcmtPcmRlcigpOwotCi0JCQkJCWlmIChpID09IDApIHsKLQkJCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihpZCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGkgPT0gMSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHdvLmdldFByZWQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IHdvLmdldFByZWQoKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuYW1lKSkgewotCQkJCQkJCQlyZXR1cm4gd28uZ2V0UHJlZCgpLmdldE5hbWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gbmFtZTsKLQkJCQkJfQotCQkJCQlpZiAoaSA9PSAyKSB7Ci0JCQkJCQlpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19GSU5JU0gpCi0JCQkJCQkJcmV0dXJuIEZJTklTSF9UT19GSU5JU0g7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKQotCQkJCQkJCXJldHVybiBGSU5JU0hfVE9fU1RBUlQ7Ci0JCQkJCQllbHNlIGlmICh3by5nZXRMaW5rVHlwZSgpID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpCi0JCQkJCQkJcmV0dXJuIFNUQVJUX1RPX1NUQVJUOwotCQkJCQkJZWxzZSBpZiAod28uZ2V0TGlua1R5cGUoKSA9PSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSCkKLQkJCQkJCQlyZXR1cm4gU1RBUlRfVE9fRklOSVNIOwotCQkJCQkJcmV0dXJuIHdvLmdldExpbmtUeXBlKCkuZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCi0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCi0JCXRleHRDZWxsRWRpdG9yID0gbmV3IFRleHRDZWxsRWRpdG9yKHZpZXdlci5nZXRUYWJsZSgpKTsKLQkJY29tYm9Cb3hDZWxsRWRpdG9yID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VGFibGUoKSwKLQkJCQluZXcgU3RyaW5nW10geyBGSU5JU0hfVE9fU1RBUlQsIEZJTklTSF9UT19GSU5JU0gsCi0JCQkJCQlTVEFSVF9UT19TVEFSVCwgU1RBUlRfVE9fRklOSVNIIH0pOwotCi0JCXNldENlbGxFZGl0b3JzKCk7Ci0JCXNldENlbGxNb2RpZmllcnMoKTsKLQotCQlpbml0aWFsaXplUHJlZExpc3QoKTsKLQkJdmlld2VyLnNldElucHV0KHByZWRNYXBMaXN0KTsKLQkJdmlld2VyLnJlZnJlc2goKTsKLQotCX0KLQotCXByaXZhdGUgaW50IGdldENlbGxFZGl0b3JUeXBlKFN0cmluZyBwcm9wZXJ0eSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb2x1bW5EZXNjcmlwdG9yIGRlc2MgPSBjb2x1bW5EZXNjcmlwdG9yc1tpXTsKLQkJCWlmIChkZXNjLmlkID09IHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIGRlc2MuY2VsbEVkaXRvclR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9OT05FOwotCX0KLQotCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoU3RyaW5nIGNvbHVtbklELCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJaWYgKGNvbHVtbklEID09IENPTF9JRCkgewotCQkJaWYgKGlkQ2VsbEVkaXRvciA9PSBudWxsKSB7Ci0JCQkJaWRDZWxsRWRpdG9yID0gbmV3IFZhbGlkYXRpbmdUZXh0Q2VsbEVkaXRvcih2aWV3ZXIuZ2V0VGFibGUoKSkgewotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGlzVmFsaWQoT2JqZWN0IGUsIFN0cmluZyB0eHQpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsaWRhdGluZ1RleHRDZWxsRWRpdG9yOjppc1ZhbGlkIik7Ci0JCQkJCQllID0gVG5nVXRpbC51bndyYXAoZSk7Ci0KLQkJCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JCQkJCQlPYmplY3QgcHJvY2VzcyA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCi0JCQkJCQlMaXN0IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQkJCQkJU3RyaW5nIHN0ciA9IGdldFByZWRJZCgpOwotCQkJCQkJU3RyaW5nIHJlc3VsdCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5jaGVja1ByZWRlY2Vzc29yTGlzdCh3YmUsIHN0ciwKLQkJCQkJCQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpLCBwcm9jZXNzLAotCQkJCQkJCQkJCXByZWRlY2Vzc29ycyk7Ci0KLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJaWRDZWxsRWRpdG9yCi0JCQkJCQkuc2V0VmFsaWRhdG9yKG5ldyBDZWxsRWRpdG9yVmFsaWRhdG9yKGlkQ2VsbEVkaXRvcikpOwotCQkJCWlkQ2VsbEVkaXRvci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsCi0JCQkJCQluZXcgVmFsaWRhdGluZ0RlYWN0aXZhdGVMaXN0ZW5lcihpZENlbGxFZGl0b3IpKTsKLQkJCX0KLQkJCWlkQ2VsbEVkaXRvci5zZXRDb2x1bW5JbmRleChjb2x1bW5JbmRleCk7Ci0KLQkJCXJldHVybiBpZENlbGxFZGl0b3I7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2VsbEVkaXRvcnMoKSB7Ci0JCUNlbGxFZGl0b3JbXSBjZWxsRWRpdG9ycyA9IG5ldyBDZWxsRWRpdG9yW2NvbHVtbkRlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCUNlbGxFZGl0b3IgY2VsbEVkaXRvciA9IGdldENlbGxFZGl0b3IoY29sdW1uRGVzY3JpcHRvcnNbaV0uaWQsIGkpOwotCQkJaWYgKGNlbGxFZGl0b3IgIT0gbnVsbCkgewotCQkJCWNlbGxFZGl0b3JzW2ldID0gY2VsbEVkaXRvcjsKLQkJCX0gZWxzZSB7Ci0JCQkJc3dpdGNoIChjb2x1bW5EZXNjcmlwdG9yc1tpXS5jZWxsRWRpdG9yVHlwZSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gdGV4dENlbGxFZGl0b3I7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWNlbGxFZGl0b3JzW2ldID0gY29tYm9Cb3hDZWxsRWRpdG9yOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQljZWxsRWRpdG9yc1tpXSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENlbGxNb2RpZmllcnMoKSB7Ci0JCS8vIFNldCB0aGUgY2VsbCBtb2RpZmllcgotCQl2aWV3ZXIuc2V0Q2VsbE1vZGlmaWVyKG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNhbk1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KTsKLQkJCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgUHJlZGVjZXNzb3JNYXApKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKHByb3BlcnR5ID09IENPTF9QUkVTRU5UQVRJT05fTkFNRSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0VmFsdWU6IGVsZW1lbnQ9IitlbGVtZW50KyIsCi0JCQkJLy8gcHJvcGVydHk9Iitwcm9wZXJ0eSk7Ci0KLQkJCQlTdHJpbmcgdmFsID0gbnVsbDsKLQkJCQlzd2l0Y2ggKGdldENlbGxFZGl0b3JUeXBlKHByb3BlcnR5KSkgewotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX1RFWFQ6Ci0JCQkJCXZhbCA9IG5ldyBJbnRlZ2VyKCgoUHJlZGVjZXNzb3JNYXApIGVsZW1lbnQpLmdldElkKCkpCi0JCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiB2YWw7Ci0JCQkJY2FzZSBDb2x1bW5EZXNjcmlwdG9yLkNFTExfRURJVE9SX1RZUEVfQ09NQk9fQk9PTEVBTjoKLQkJCQkJaW50IHZhbHVlID0gKCgoUHJlZGVjZXNzb3JNYXApIGVsZW1lbnQpLmdldFdvcmtPcmRlcigpKQotCQkJCQkJCS5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCk7Ci0JCQkJCWlmIChXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVF9WQUxVRSA9PSB2YWx1ZSkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDApOwotCQkJCQl9IGVsc2UgaWYgKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9WQUxVRSA9PSB2YWx1ZSkgewotCQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDEpOwotCQkJCQl9IGVsc2UgaWYgKFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlRfVkFMVUUgPT0gdmFsdWUpIHsKLQkJCQkJCXJldHVybiBuZXcgSW50ZWdlcigyKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlyZXR1cm4gbmV3IEludGVnZXIoMyk7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vZGlmeShmaW5hbCBPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LAotCQkJCQlPYmplY3QgdmFsdWUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm1vZGlmeTogZWxlbWVudD0iK2VsZW1lbnQrIiwKLQkJCQkvLyBwcm9wZXJ0eT0iK3Byb3BlcnR5KyIsIHZhbHVlPSIrdmFsdWUpOwotCQkJCVRhYmxlSXRlbSBpdGVtID0gKFRhYmxlSXRlbSkgZWxlbWVudDsKLQkJCQlQcmVkZWNlc3Nvck1hcCBwcmVkTWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdGVtLmdldERhdGEoKTsKLQkJCQlXb3JrT3JkZXIgd28gPSBwcmVkTWFwLmdldFdvcmtPcmRlcigpOwotCi0JCQkJaWYgKHByb3BlcnR5LmVxdWFscyhDT0xfSUQpKSB7Ci0JCQkJCWl0ZW0uc2V0VGV4dCgwLCB2YWx1ZS50b1N0cmluZygpKTsKLQotCQkJCQlpbnQgcHJlZElkOwotCQkJCQl0cnkgewotCQkJCQkJcHJlZElkID0gbmV3IEludGVnZXIodmFsdWUudG9TdHJpbmcoKSkuaW50VmFsdWUoKTsKLQkJCQkJCWlmIChwcmVkSWQgPCAwKQotCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5V2FybmluZygKLQkJCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfcHJlZGVjZXNzb3JzX3ZhbGlkTnVtYmVyVGl0bGUsIAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19wcmVkZWNlc3NvcnNfdmFsaWROdW1iZXJNZXNzYWdlKTsgCi0JCQkJCQlwcmVkTWFwTGlzdC5yZW1vdmUocHJlZE1hcCk7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXByZWRNYXAuc2V0SWQocHJlZElkKTsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBpbnQgY29sdW1uSW5kZXggPSBnZXRDb2x1bW5JbmRleChwcm9wZXJ0eSk7Ci0JCQkJQ2VsbEVkaXRvciBjZWxsRWRpdG9yID0gdmlld2VyLmdldENlbGxFZGl0b3JzKClbY29sdW1uSW5kZXhdOwotCQkJCVN0cmluZyBlcnJNc2cgPSBjZWxsRWRpdG9yLmdldEVycm9yTWVzc2FnZSgpOwotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJV29ya09yZGVyVHlwZSB0eXBlOwotCQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgZ2V0QlNBZGFwdGVyKCk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0JCQkJCi0JCQkJc3dpdGNoIChnZXRDZWxsRWRpdG9yVHlwZShwcm9wZXJ0eSkpIHsKLQkJCQljYXNlIENvbHVtbkRlc2NyaXB0b3IuQ0VMTF9FRElUT1JfVFlQRV9URVhUOgkJCQkJCi0JCQkJCU9iamVjdCBwcm9jZXNzID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0KLQkJCQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwkJCQkJCi0JCQkJCVN0cmluZyBzdHIgPSBnZXRQcmVkSWQoKTsKLQkJCQkJU3RyaW5nIHJlc3VsdCA9IFByb2Nlc3NVdGlsLmNoZWNrUHJlZGVjZXNzb3JMaXN0KHdiZSwgc3RyLAotCQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCksIHByb2Nlc3MsIHByZWRlY2Vzc29ycyk7Ci0KLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlMaXN0PFdvcmtPcmRlcj4gYWRkTGlzdCA9IG5ldyBBcnJheUxpc3Q8V29ya09yZGVyPigpOwotCQkJCQkJTGlzdDxXb3JrT3JkZXI+IHByZWRUb0JlRGVsZXRlZCA9IG5ldyBBcnJheUxpc3Q8V29ya09yZGVyPigpOwotCQkJCQkJUHJlZGVjZXNzb3JMaXN0LnByZXBhcmVVcGRhdGVQcmVkZWNlc3NvcnMoZ2V0QWRhcHRlckZhY3RvcnkoKSwgd2JlLCBwcmVkZWNlc3NvcnMsIGFkZExpc3QsIHByZWRUb0JlRGVsZXRlZCk7Ci0JCQkJCQlpZighcHJlZFRvQmVEZWxldGVkLmlzRW1wdHkoKSkgewotCQkJCQkJCWFjdGlvbk1nci5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLAotCQkJCQkJCQkJd2JlLAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCXByZWRUb0JlRGVsZXRlZCwgLTEpOwotCQkJCQkJfQotCQkJCQkJaWYoIWFkZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuQUREX01BTlksCi0JCQkJCQkJCQkJCXdiZSwKLQkJCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwKLQkJCQkJCQkJCQkJYWRkTGlzdCwgLTEpOwotCQkJCQkJCWlmKHN0YXR1cykgewotCQkJCQkJCQkvL1RPRE86IHJldmlldyB0aGlzCi0JCQkJCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKGFkZExpc3QuZ2V0KGFkZExpc3Quc2l6ZSgpIC0gMSkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBnZXRFZGl0b3IoKS5nZXRUaXRsZSgpOwotCQkJCQkJU3RyaW5nIHByb2JsZW0gPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JGb3JtUHJvcGVydGllc19jZWxsRWRpdG9yX2ludmFsaWRQcmVkY2Vzc29yX3Byb2JsZW1fbXNnOyAKLQkJCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQkJZGlhbG9nLmRpc3BsYXlXYXJuaW5nKHRpdGxlLCBwcm9ibGVtLCByZXN1bHQpOyAKLQkJCQkJCXByZWRNYXBMaXN0LnJlbW92ZShwcmVkTWFwKTsKLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ29sdW1uRGVzY3JpcHRvci5DRUxMX0VESVRPUl9UWVBFX0NPTUJPX0JPT0xFQU46Ci0JCQkJCWJvb2xlYW4gcmVtb3ZlZCA9IGZhbHNlOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmVDb3B5ID0gbnVsbDsKLQkJCQkJV29ya09yZGVyIG8gPSBudWxsOwotCQkJCQlpbnQgaW5kZXggPSAoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJbyA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKG8uZ2V0UHJlZCgpID09IHdvLmdldFByZWQoKSkKLQkJCQkJCXsJCQkJCQkJCi0JCQkJCQkJaWYgKG8uZ2V0TGlua1R5cGUoKS5nZXRWYWx1ZSgpICE9IGluZGV4KSB7Ci0JCQkJCQkJCXdiZUNvcHkgPSBvLmdldFByZWQoKTsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQkJCQkJCQkKLQkJCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQkJCQkJfSBlbHNlIGlmIChpbmRleCA9PSAxKSB7Ci0JCQkJCQl0eXBlID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIOwotCQkJCQl9IGVsc2UgaWYgKGluZGV4ID09IDIpIHsKLQkJCQkJCXR5cGUgPSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocmVtb3ZlZCAmJiB3YmVDb3B5ICE9IG51bGwpIHsJCQkJCQotCQkJCQkJd28uc2V0UHJlZCh3YmVDb3B5KTsKLQkJCQkJCXdvLnNldExpbmtUeXBlKHR5cGUpOwotCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSBhY3Rpb25NZ3IKLQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQl3YmUsCi0JCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCQkJCQkJCXdvLCAtMSk7Ci0JCQkJCQlpZiAoc3RhdHVzKQotCQkJCQkJCXByZWRNYXAuc2V0V29ya09yZGVyKG8pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgd28sCi0JCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLCB0eXBlLAotCQkJCQkJCQktMSk7Ci0JCQkJCX0JCQkJCQkKLQkJCQkJCi0JCQkJCWJyZWFrOwotCi0JCQkJZGVmYXVsdDoKLQkJCQkJdHlwZSA9IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSDsKLQkJCQl9Ci0KLQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgbGlzdCBvZiBpdGVtIHByb3ZpZGVycyBmb3IgcHJlZGVjZXNzb3JzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCS8vIHByaXZhdGUgT2JqZWN0IGdldFByZWRJdGVtUHJvdmlkZXJzKCkKLQkvLyB7Ci0JLy8gSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRCU0FkYXB0ZXIoKTsKLQkvLyBpZiAoYWRhcHRlciAhPSBudWxsKQotCS8vIHJldHVybiBhZGFwdGVyLmdldFByZWRlY2Vzc29ycygpOwotCS8vICAgIAkKLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEJTQWRhcHRlcigpIHsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOy8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGdldEVsZW1lbnQoKTsKLQotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBmYWN0b3J5LmFkYXB0KAotCQkJCQllbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIHByb3ZpZGVyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gY29sdW1uIGluZGV4IGZvciBwcm9wZXJ0eQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgcHJvcGVydHkpIHsKLQkJT2JqZWN0W10gY29sUHJvcHMgPSB2aWV3ZXIuZ2V0Q29sdW1uUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbFByb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sUHJvcHNbaV0gPT0gcHJvcGVydHkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkFic3RyYWN0U2VjdGlvbiNnZXROYW1lUHJlZml4KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVQcmVmaXgoKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfVEVBTV9QUk9GSUxFICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfTUlMRVNUT05FICsgIjogIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfV09SS19QUk9EVUNUX0VMRU1FTlQgKyAiOiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZElkKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRNYXBMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gKFByZWRlY2Vzc29yTWFwKSBpdG9yLm5leHQoKTsKLQkJCWJ1Zi5hcHBlbmQobWFwLmdldElkKCkpOwotCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgcHJlZCBsaXN0Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQcmVkTGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUxpc3QgcHJlZFByb3ZpZGVycyA9IG51bGw7Ci0KLQkJCS8vIGdldCB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCQllbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCk7Ci0KLQkJCS8vIGdldCBwcmVkZWNlc3NvciBpdGVtIHByb3ZpZGVycwotCQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHByb3ZpZGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGZhY3RvcnkKLQkJCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQlwcmVkUHJvdmlkZXJzID0gKChJQlNJdGVtUHJvdmlkZXIpIHByb3ZpZGVyKQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5lZWQgZm9sbG93aW5nIGZvciBzcGVjaWFsIGNhc2UgKFdyYXBwZXJJdGVtUHJvdmlkZXJzKS4KLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlPYmplY3QgaW5wdXQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcHJlZFByb3ZpZGVycyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGlucHV0KQotCQkJCQkJCS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCBsaW5rIHRvIHByZWRlY2Vzc29ycwotCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChwcmVkUHJvdmlkZXJzICE9IG51bGwpKSB7Ci0JCQkJTGlzdCBwcmVkTGlzdCA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZW1JdGVyYXRvciA9IHByZWRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlbUl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCU9iamVjdCBpdGVtT2JqID0gKE9iamVjdCkgaXRlbUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtT2JqKS5nZXRUYXJnZXQoKTsKLQkJCQkJfQotCQkJCQlpZiAodGFyZ2V0T2JqICE9IG51bGwpIHsKLQkJCQkJCWludCBpZCA9ICgoSUJTSXRlbVByb3ZpZGVyKSBpdGVtT2JqKS5nZXRJZCgpOwotCQkJCQkJZm91bmQgPSBhZGRQcmVkZWNlc3NvcihwcmVkTGlzdCwgaWQsIHRhcmdldE9iaik7Ci0KLQkJCQkJCWlmICgoIWZvdW5kKQotCQkJCQkJCQkmJiAodGFyZ2V0T2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIHRhcmdldE9iajsKLQkJCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsID0gdmUKLQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCQl0YXJnZXRPYmogPSBlbDsKLQotCQkJCQkJCQkvLyBhZGQgYmFzZSB2YXJpYWJpbGl0eSBvYmplY3QKLQkJCQkJCQkJYWRkUHJlZGVjZXNzb3IocHJlZExpc3QsIGlkLCB0YXJnZXRPYmopOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRvcj1wcmVkTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCi0JCQkJLy8gewotCQkJCS8vIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkvLyBPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCS8vIGlmIChvIGluc3RhbmNlb2YgV29ya09yZGVyKQotCQkJCS8vIHsKLQkJCQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudDo6V29ya09yZGVyID0gIisgKChXb3JrT3JkZXIpCi0JCQkJLy8gbykuZ2V0UHJlZCgpKTsKLQkJCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSAoKFdvcmtPcmRlcikgbykuZ2V0UHJlZCgpOwotCQkJCS8vIGlmICh3YmUgIT0gbnVsbCkKLQkJCQkvLyB7Ci0JCQkJLy8gZm9yIChJdGVyYXRvciBpdGVtSXRlcmF0b3I9cHJlZFByb3ZpZGVycy5pdGVyYXRvcigpOwotCQkJCS8vIGl0ZW1JdGVyYXRvci5oYXNOZXh0KCk7KQotCQkJCS8vIHsKLQkJCQkvLyBPYmplY3QgaXRlbU9iaiA9IChPYmplY3QpIGl0ZW1JdGVyYXRvci5uZXh0KCk7Ci0JCQkJLy8gT2JqZWN0IHRhcmdldE9iaiA9IG51bGw7Ci0JCQkJLy8gaWYgKGl0ZW1PYmogaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCS8vIHsKLQkJCQkvLyB0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldFZhbHVlKCk7Ci0JCQkJLy8gfQotCQkJCS8vIGlmIChpdGVtT2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJCQkvLyB7Ci0JCQkJLy8gdGFyZ2V0T2JqID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWl0ZW1PYmopLmdldFRhcmdldCgpOwotCQkJCS8vIH0KLQkJCQkvLyBpZiAodGFyZ2V0T2JqICE9IG51bGwpCi0JCQkJLy8gewotCQkJCS8vIGlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpCi0JCQkJLy8gewotCQkJCS8vIC8vIGNyZWF0ZSBtYXBPYmplY3RMaXN0Ci0JCQkJLy8gaW50IGlkID0gKChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1PYmopLmdldElkKCk7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkvLyBwcmVkTWFwTGlzdC5hZGQobWFwKTsKLQkJCQkvLwkJCi0JCQkJLy8gZm91bmQ9dHJ1ZTsKLQkJCQkvLyBicmVhazsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBpZiAoIWZvdW5kKQotCQkJCS8vIHsKLQkJCQkvLyAvLyBpZiBwcm92aWRlciBpcyBub3QgZm91bmQsIHRoZW4gYWRkIHdpdGggaWQ9MAotCQkJCS8vIC8vIGRvIGl0IG9ubHkgZm9yIFRlYW1BbGxvY2F0aW9uIGFuZCBXb3JrUHJvZHVjdFVzYWdlIHZpZXcKLQkJCQkvLyAvLyBpZgotCQkJCS8vICgoRVBGUHJvcGVydHlTaGVldFBhZ2UuZm9ybVBhZ2VJRC5lcXVhbHMoUHJvY2Vzc0Zvcm1FZGl0b3IuVEFfRk9STV9JRCkpCi0JCQkJLy8gfHwKLQkJCQkvLyAvLwotCQkJCS8vIChFUEZQcm9wZXJ0eVNoZWV0UGFnZS5mb3JtUGFnZUlELmVxdWFscyhQcm9jZXNzRm9ybUVkaXRvci5XUEJTX0ZPUk1fSUQpKSkKLQkJCQkvLyB7Ci0JCQkJLy8gUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKDAsIChXb3JrT3JkZXIpIG8pOwotCQkJCS8vIHByZWRNYXBMaXN0LmFkZChtYXApOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoIkluaXRpYWxpemluZyBQcmVkZWNlc3NvciBMaXN0IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRQcmVkZWNlc3NvcihMaXN0IHByZWRMaXN0LCBpbnQgaWQsIE9iamVjdCB0YXJnZXRPYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnQ6OldvcmtPcmRlciA9ICIrICgoV29ya09yZGVyKQotCQkJCS8vIG8pLmdldFByZWQoKSk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlID0gKChXb3JrT3JkZXIpIG8pLmdldFByZWQoKTsKLQotCQkJCWlmICh0YXJnZXRPYmouZXF1YWxzKHdiZSkpIHsKLQkJCQkJLy8gY3JlYXRlIG1hcE9iamVjdExpc3QKLQkJCQkJUHJlZGVjZXNzb3JNYXAgbWFwID0gbmV3IFByZWRlY2Vzc29yTWFwKGlkLCAoV29ya09yZGVyKSBvKTsKLQkJCQkJcHJlZE1hcExpc3QuYWRkKG1hcCk7Ci0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDdjMTcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLkl0ZW1zRmlsdGVyRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZmlsdGVycy5EZXNjcmlwdG9yUHJvY2Vzc0ZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZpbHRlcnMuUHJvY2Vzc1NwZWNpZmljV29ya1Byb2R1Y3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5maWx0ZXJzLlByb2Nlc3NXb3JrUHJvZHVjdEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXIuRmlsdGVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFzc2lnbldQVG9EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5MaW5rTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotCi0KLS8qKgotICogVGhlIGdlbmVyYWwgdGFiIHNlY3Rpb24gZm9yIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIGV4dGVuZHMKLQkJRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uIHsKLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9tZXRob2RfZWxlbWVudDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3dvcmtQcm9kdWN0X3R5cGU7Ci0KLQlwcml2YXRlIFRleHQgYWN0aXZpdHlFbnRyeVN0YXRlLCBhY3Rpdml0eUV4aXRTdGF0ZTsKLQotCXByaXZhdGUgQnV0dG9uIGxpbmtCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjbGVhckJ1dHRvbjsKLQkKLQlwcml2YXRlIFRhYmxlIGN0cmxfdGFibGVfMTsKLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgdmlld2VyXzE7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjdHJsX2FkZF8xLCBjdHJsX2FkZF9wcm9jXzEsIGN0cmxfcmVtb3ZlXzE7Ci0KLQlwcml2YXRlIFNlY3Rpb24gZGVsaXZlcmFibGVTZWN0aW9uOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciB3cE1vZGVsTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jaW5pdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkvLyBnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdAotCQllbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkJyZWFrZG93bkVsZW1lbnRHZW5lcmFsU2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVTZWN0aW9uKCkgewotCQlpZiAoIShlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCWlmIChkZWxpdmVyYWJsZVNlY3Rpb24uaXNFeHBhbmRlZCgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRFeHBhbmRlZChmYWxzZSk7Ci0JCQlpZiAoZGVsaXZlcmFibGVTZWN0aW9uLmlzVmlzaWJsZSgpKQotCQkJCWRlbGl2ZXJhYmxlU2VjdGlvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghZGVsaXZlcmFibGVTZWN0aW9uLmlzRXhwYW5kZWQoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0JCQlpZiAoIWRlbGl2ZXJhYmxlU2VjdGlvbi5pc1Zpc2libGUoKSkKLQkJCQlkZWxpdmVyYWJsZVNlY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWxpdmVyYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlTdHJpbmcgc2VjdGlvblRpdGxlID0gUHJvcGVydGllc1Jlc291cmNlcy5XUERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0X1NlY3Rpb25UaXRsZTsgCi0JCVN0cmluZyBzZWN0aW9uRGVzYyA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9TZWN0aW9uRGVzY3JpcHRpb247IAotCQlTdHJpbmcgdGFibGVUaXRsZSA9IFByb3BlcnRpZXNSZXNvdXJjZXMuV1BEZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydF9UYWJsZTE7IAotCi0JCVNlY3Rpb24gc2VjdGlvbiA9IEZvcm1VSS5jcmVhdGVTZWN0aW9uKHRvb2xraXQsIGNvbXBvc2l0ZSwKLQkJCQlzZWN0aW9uVGl0bGUsIHNlY3Rpb25EZXNjKTsKLQotCQkvLyBjcmVhdGUgY29tcG9zaXRlCi0JCUNvbXBvc2l0ZSBzZWN0aW9uQ29tcG9zaXRlID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uLAotCQkJCTIsIGZhbHNlKTsKLQotCQlDb21wb3NpdGUgcGFuZTEgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsIHNlY3Rpb25Db21wb3NpdGUsCi0JCQkJR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIHBhbmUxLCB0YWJsZVRpdGxlKTsKLQotCQlpbnQgdGFibGVIZWlnaHQgPSA4MDsKLQkJY3RybF90YWJsZV8xID0gRm9ybVVJLmNyZWF0ZVRhYmxlKHRvb2xraXQsIHBhbmUxLCB0YWJsZUhlaWdodCk7Ci0JCXZpZXdlcl8xID0gbmV3IFRhYmxlVmlld2VyKGN0cmxfdGFibGVfMSk7Ci0JCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJCQlnZXRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBlbGVtZW50LmdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBkZWxpdmVyYWJsZVBhcnRzLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdG9yCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKHdwRGVzYy5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsCi0JCQkJCQkJfHwgd3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpCi0JCQkJCQluZXdMaXN0LmFkZCh3cERlc2MpOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0RmlsdGVyZWRMaXN0KG5ld0xpc3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJdmlld2VyXzEuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlcl8xLnNldElucHV0KGVsZW1lbnQpOwotCi0JCS8vIGNyZWF0ZSBidXR0b25zIGZvciB0YWJsZTIKLQkJQ29tcG9zaXRlIHBhbmUyID0gRm9ybVVJLmNyZWF0ZUNvbXBvc2l0ZSh0b29sa2l0LCBzZWN0aW9uQ29tcG9zaXRlLAotCQkJCUdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUgotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0NFTlRFUik7Ci0KLQkJY3RybF9hZGRfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19BZGQpOyAKLQkJY3RybF9hZGRfcHJvY18xID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBwYW5lMiwKLQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfQWRkRnJvbVByb2Nlc3MpOyAKLQkJY3RybF9yZW1vdmVfMSA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgcGFuZTIsIFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19SZW1vdmUpOyAKLQotCQl0b29sa2l0LnBhaW50Qm9yZGVyc0ZvcihwYW5lMSk7Ci0KLQkJZGVsaXZlcmFibGVTZWN0aW9uID0gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5CcmVha2Rvd25FbGVtZW50R2VuZXJhbFNlY3Rpb24jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCS8vIGlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCS8vIHsKLQkJLy8gbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jY3JlYXRlR2VuZXJhbFNlY3Rpb24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUdlbmVyYWxTZWN0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlR2VuZXJhbFNlY3Rpb24oY29tcG9zaXRlKTsKLQotCQkvLyBtZXRob2QgZWxlbWVudAotCQlGb3JtVUkuY3JlYXRlTGFiZWwodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwgUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX1R5cGVfV29ya1Byb2R1Y3QpOyAKLQkJY3RybF9tZXRob2RfZWxlbWVudCA9IEZvcm1VSS5jcmVhdGVUZXh0KHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsCi0JCQkJU1dULkRFRkFVTFQsIDEpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQljdHJsX21ldGhvZF9lbGVtZW50LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBGb3JtVUkuY3JlYXRlQ29tcG9zaXRlKHRvb2xraXQsCi0JCQkJZ2VuZXJhbENvbXBvc2l0ZSwgU1dULk5PTkUsIDIsIHRydWUpOwotCQlsaW5rQnV0dG9uID0gRm9ybVVJLmNyZWF0ZUJ1dHRvbih0b29sa2l0LCBidXR0b25Db21wb3NpdGUsIFNXVC5QVVNILCAxKTsKLQkJbGlua0J1dHRvbgotCQkJCS5zZXRUZXh0KFByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19CdXR0b25fTGlua01ldGhvZEVsZW1lbnQpOyAKLQotCQljbGVhckJ1dHRvbiA9IEZvcm1VSS5jcmVhdGVCdXR0b24odG9vbGtpdCwgYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCwgMSk7Ci0JCWNsZWFyQnV0dG9uCi0JCQkJLnNldFRleHQoUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0J1dHRvbl9DbGVhck1ldGhvZEVsZW1lbnQpOyAKLQotCQkvLyB0eXBlCi0JCUZvcm1VSS5jcmVhdGVMYWJlbCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLCBQcm9wZXJ0aWVzUmVzb3VyY2VzLldvcmtQcm9kdWN0X1R5cGUpOyAKLQkJY3RybF93b3JrUHJvZHVjdF90eXBlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCQljdHJsX3dvcmtQcm9kdWN0X3R5cGUuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50VHlwZShlbGVtZW50KSk7Ci0JCWN0cmxfd29ya1Byb2R1Y3RfdHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQkvLyBhY3Rpdml0eUVudHJ5c3RhdGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSk7IAotCQlhY3Rpdml0eUVudHJ5U3RhdGUgPSBGb3JtVUkuY3JlYXRlVGV4dCh0b29sa2l0LCBnZW5lcmFsQ29tcG9zaXRlLAotCQkJCVNXVC5ERUZBVUxULCBob3Jpem9udGFsU3Bhbik7Ci0KLQkJLy8gYWN0aXZpdHlFeGl0c3RhdGUKLQkJRm9ybVVJLmNyZWF0ZUxhYmVsKHRvb2xraXQsIGdlbmVyYWxDb21wb3NpdGUsIFByb3BlcnRpZXNSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKTsgCi0JCWFjdGl2aXR5RXhpdFN0YXRlID0gRm9ybVVJLmNyZWF0ZVRleHQodG9vbGtpdCwgZ2VuZXJhbENvbXBvc2l0ZSwKLQkJCQlTV1QuREVGQVVMVCwgaG9yaXpvbnRhbFNwYW4pOwotCi0JCS8vIENSRUFURSBERUxJVkVSQUJMRSBTRUNUSU9OCi0JCWNyZWF0ZURlbGl2ZXJhYmxlU2VjdGlvbihjb21wb3NpdGUpOwotCQl0b2dnbGVTZWN0aW9uKCk7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZShXb3JrUHJvZHVjdERlc2NyaXB0b3IgZWxlbWVudCkgewotCQlTdHJpbmcgc3RyID0gUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX05vbmU7IAotCQlpZiAoZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpICE9IG51bGwpIHsKLQkJCXN0ciA9IGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnRUeXBlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50KSB7Ci0JCVN0cmluZyBzdHIgPSBQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTm9uZTsgCi0JCWlmIChlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgIT0gbnVsbCkgewotCQkJc3RyID0gZWxlbWVudC5nZXRXb3JrUHJvZHVjdCgpLmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm9wZXJ0aWVzLkRlc2NyaXB0b3JHZW5lcmFsU2VjdGlvbiNhZGRMaXN0ZW5lcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0KLQkJYWN0aXZpdHlFbnRyeVN0YXRlLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJCSgoTWV0aG9kRWxlbWVudEVkaXRvcikgZ2V0RWRpdG9yKCkpLnNldEN1cnJlbnRGZWF0dXJlRWRpdG9yKGUud2lkZ2V0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpKTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBnZXRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnQgPSBlbGVtZW50LmdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJYWN0aXZpdHlFbnRyeVN0YXRlLCBvbGRDb250ZW50KSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyBuZXdDb250ZW50ID0gU3RyVXRpbC5nZXRQbGFpblRleHQoYWN0aXZpdHlFbnRyeVN0YXRlCi0JCQkJCQkuZ2V0VGV4dCgpKTsKLQkJCQlpZiAoIW5ld0NvbnRlbnQuZXF1YWxzKG9sZENvbnRlbnQpKSB7Ci0JCQkJCWJvb2xlYW4gc3RhdHVzID0gYWN0aW9uTWdyCi0JCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJSUFjdGlvbk1hbmFnZXIuU0VULAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCWFjdGl2aXR5RW50cnlTdGF0ZS5zZXRUZXh0KG5ld0NvbnRlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlhY3Rpdml0eUV4aXRTdGF0ZS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5zZXRDdXJyZW50RmVhdHVyZUVkaXRvcihlLndpZGdldCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBlbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RWxlbWVudCgpOwotCQkJCVN0cmluZyBvbGRDb250ZW50ID0gZWxlbWVudC5nZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCQkJCWlmICgoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGdldEVkaXRvcigpKS5tdXN0UmVzdG9yZVZhbHVlKAotCQkJCQkJYWN0aXZpdHlFeGl0U3RhdGUsIG9sZENvbnRlbnQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBTdHJVdGlsLmdldFBsYWluVGV4dChhY3Rpdml0eUV4aXRTdGF0ZQotCQkJCQkJLmdldFRleHQoKSk7Ci0JCQkJaWYgKCFuZXdDb250ZW50LmVxdWFscyhvbGRDb250ZW50KSkgewotCQkJCQlib29sZWFuIHN0YXR1cyA9IGFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlNFVCwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksCi0JCQkJCQkJCQluZXdDb250ZW50LCAtMSk7Ci0JCQkJCWlmIChzdGF0dXMpIHsKLQkJCQkJCWFjdGl2aXR5RXhpdFN0YXRlLnNldFRleHQobmV3Q29udGVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfdGFibGVfMS5hZGRGb2N1c0xpc3RlbmVyKG5ldyBGb2N1c0FkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKQotCQkJCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWRkXzEuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc1dvcmtQcm9kdWN0RmlsdGVyKAotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLCBudWxsLCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTKTsgCi0JCQkJLy8gYmxvY2sgaXQncyBkZWxpdmVyYWJsZSBwYXJ0cwotCQkJCUxpc3QgZXhpc3RpbmdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpCi0JCQkJCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSkpOwotCQkJCS8vIGJsb2NrIGl0c2VsZgotCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpOwotCQkJCS8vIGFsc28gYmxvY2sgaXQncyBwYXJlbnQgd29yayBwcm9kdWN0cywgaWYgYW55Ci0JCQkJZXhpc3RpbmdFbGVtZW50cwotCQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbikgZ2V0UGFyZW50V29ya1Byb2R1Y3RzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBlbGVtZW50LCBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLAotCQkJCQkJZXhpc3RpbmdFbGVtZW50cyk7Ci0JCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJZmQuc2V0VGl0bGUoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUUyk7Ci0JCQkJZmQub3BlbigpOwotCQkJCWFkZEl0ZW1zKGZkLmdldFNlbGVjdGVkSXRlbXMoKSk7Ci0JCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCi0JCQl9Ci0JCX0pOwotCi0JCWN0cmxfYWRkX3Byb2NfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGFiTmFtZSA9IEZpbHRlckNvbnN0YW50cy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlM7Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkQWxsKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0KLQkJCQlleGlzdGluZ0VsZW1lbnRzCi0JCQkJCQkuYWRkQWxsKGdldFBhcmVudERlbGl2ZXJhYmxlcygoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSk7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGVsZW1lbnQpOwotCi0JCQkJSUZpbHRlciBkZXNjcmlwdG9yRmlsdGVyID0gZ2V0RGVzY3JpcHRvckZpbHRlcigpOwotCQkJCWlmIChkZXNjcmlwdG9yRmlsdGVyICE9IG51bGwgJiYgcHJvY2VzcyAhPSBudWxsKSB7Ci0JCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkuZ2V0U2hlbGwoKSwgZGVzY3JpcHRvckZpbHRlciwgcHJvY2VzcywgdGFiTmFtZSwKLQkJCQkJCQlleGlzdGluZ0VsZW1lbnRzKTsKLQkJCQkJZmQuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQkJCWZkLnNldFRpdGxlKHRhYk5hbWUpOwotCQkJCQlmZC5vcGVuKCk7Ci0JCQkJCWFkZEZyb21Qcm9jZXNzSXRlbXMoZmQuZ2V0U2VsZWN0ZWRJdGVtcygpKTsKLQkJCQkJdmlld2VyXzEucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3RybF9yZW1vdmVfMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlcl8xCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIHVwZGF0ZSB0aGUgbW9kZWwKLQkJCQkJQXJyYXlMaXN0IHJtSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCXJtSXRlbXMuYWRkQWxsKHNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQkJCXJlbW92ZUl0ZW1zKHJtSXRlbXMpOwotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0KLQkJCQkJLy8gY2xlYXIgdGhlIHNlbGVjdGlvbgotCQkJCQl2aWV3ZXJfMS5zZXRTZWxlY3Rpb24obnVsbCwgdHJ1ZSk7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWxpbmtCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3RyaW5nIHRhYk5hbWUgPSBGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTOyAKLQkJCQlDbGFzcyB3b3JrUHJvZHVjdFR5cGUgPSBudWxsOwotCQkJCWlmIChlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgIT0gbnVsbCkgewotCQkJCQl3b3JrUHJvZHVjdFR5cGUgPSBlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkuZ2V0Q2xhc3MoKTsKLQkJCQl9Ci0JCQkJTGlzdCBleGlzdGluZ0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWlmIChlbGVtZW50LmdldFdvcmtQcm9kdWN0KCkgIT0gbnVsbCkgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9IGVsZW1lbnQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGQod3ApOwotCQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJTGlzdCBzdWJBcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlnZXRBbGxTdWJBcnRpZmFjdHMoKEFydGlmYWN0KSB3cCwgc3ViQXJ0aWZhY3RzLAotCQkJCQkJCQkoKEFydGlmYWN0KSB3cCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGRBbGwoc3ViQXJ0aWZhY3RzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCUxpc3QgbGlzdCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkuZ2V0U2libGluZ3MoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGdldEFkYXB0ZXIoKSwKLQkJCQkJCQkJZWxlbWVudCk7Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlpZiAoKCF3cERlc2MuZXF1YWxzKGVsZW1lbnQpKQotCQkJCQkJCQkmJiAoIXdwRGVzYy5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQotCQkJCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQkJCWV4aXN0aW5nRWxlbWVudHMuYWRkKHdwKTsKLQotCQkJCQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCQkJTGlzdCBzdWJBcnRpZmFjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlnZXRBbGxTdWJBcnRpZmFjdHMoKEFydGlmYWN0KSB3cCwKLQkJCQkJCQkJCQkJc3ViQXJ0aWZhY3RzLCAoKEFydGlmYWN0KSB3cCkKLQkJCQkJCQkJCQkJCQkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQkJCQkJCQkJZXhpc3RpbmdFbGVtZW50cy5hZGRBbGwoc3ViQXJ0aWZhY3RzKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlJRmlsdGVyIGZpbHRlciA9IG5ldyBQcm9jZXNzU3BlY2lmaWNXb3JrUHJvZHVjdEZpbHRlcigKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgdGFiTmFtZSwgd29ya1Byb2R1Y3RUeXBlKTsKLQotCQkJCUl0ZW1zRmlsdGVyRGlhbG9nIGZkID0gbmV3IEl0ZW1zRmlsdGVyRGlhbG9nKFBsYXRmb3JtVUkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQkJZmlsdGVyLCBlbGVtZW50LCB0YWJOYW1lLCBleGlzdGluZ0VsZW1lbnRzKTsKLQotCQkJCWZkLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWZkLnNldFZpZXdlclNlbGVjdGlvblNpbmdsZSh0cnVlKTsKLQkJCQlmZC5zZXRUaXRsZSh0YWJOYW1lKTsKLQkJCQlmZC5vcGVuKCk7Ci0JCQkJc2V0TWV0aG9kRWxlbWVudChmZC5nZXRTZWxlY3RlZEl0ZW1zKCkpOwotCi0JCQkJLy8gdXBkYXRlIG1ldGhvZCBlbGVtZW50IGNvbnRyb2wKLQkJCQljdHJsX21ldGhvZF9lbGVtZW50LnNldFRleHQoZ2V0TWV0aG9kRWxlbWVudE5hbWUoZWxlbWVudCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZTEpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQljbGVhckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpLAotCQkJCQkJbnVsbCwgLTEpOwotCQkJCS8vIHVwZGF0ZSBtZXRob2QgZWxlbWVudCBjb250cm9sCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUxKSB7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRBbGxTdWJBcnRpZmFjdHMoQXJ0aWZhY3QgYXJ0aWZhY3QsIExpc3Qgc3ViQXJ0aWZhY3RzLAotCQkJTGlzdCBjb250YWluZWRBcnRpZmFjdHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY29udGFpbmVkQXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJaWYgKCFzdWJBcnRpZmFjdHMuY29udGFpbnMob2JqKSkKLQkJCQkJc3ViQXJ0aWZhY3RzLmFkZChvYmopOwotCQkJCWdldEFsbFN1YkFydGlmYWN0cygoQXJ0aWZhY3QpIG9iaiwgc3ViQXJ0aWZhY3RzLAotCQkJCQkJKChBcnRpZmFjdCkgb2JqKS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvcGVydGllcy5EZXNjcmlwdG9yR2VuZXJhbFNlY3Rpb24jdXBkYXRlQ29udHJvbHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRyb2xzKCkgewotCQlzdXBlci51cGRhdGVDb250cm9scygpOwotCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQlhY3Rpdml0eUV4aXRTdGF0ZS5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCWxpbmtCdXR0b24uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWNsZWFyQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlhY3Rpdml0eUVudHJ5U3RhdGUuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWFjdGl2aXR5RXhpdFN0YXRlLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCi0JCWlmIChjdHJsX2FkZF8xICE9IG51bGwpCi0JCQljdHJsX2FkZF8xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQlpZiAoY3RybF9hZGRfcHJvY18xICE9IG51bGwpCi0JCQljdHJsX2FkZF9wcm9jXzEuc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCWlmIChjdHJsX3JlbW92ZV8xICE9IG51bGwpCi0JCQljdHJsX3JlbW92ZV8xLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJZWxlbWVudCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQotCQkJCXN1cGVyLnJlZnJlc2goKTsKLQotCQkJCS8vIE1vZGVsIE1vZGlmeSBsaXN0ZW5lciBmb3IgYWN0aXZpdHkgZW50cnkgc3RhdGUgYW5kIGFjdGl2aXR5Ci0JCQkJLy8gZXhpdCBzdGF0ZQotCQkJCWlmICh3cE1vZGVsTW9kaWZ5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlhY3Rpdml0eUVudHJ5U3RhdGUKLQkJCQkJCQkucmVtb3ZlTW9kaWZ5TGlzdGVuZXIod3BNb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJYWN0aXZpdHlFeGl0U3RhdGUKLQkJCQkJCQkucmVtb3ZlTW9kaWZ5TGlzdGVuZXIod3BNb2RlbE1vZGlmeUxpc3RlbmVyKTsKLQotCQkJCX0KLQotCQkJCXdwTW9kZWxNb2RpZnlMaXN0ZW5lciA9IGdldEVkaXRvcigpLmNyZWF0ZU1vZGlmeUxpc3RlbmVyKAotCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCk7Ci0KLQkJCQlpZiAod3BNb2RlbE1vZGlmeUxpc3RlbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvci5Nb2RpZnlMaXN0ZW5lcikgewotCQkJCQkoKE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHdwTW9kZWxNb2RpZnlMaXN0ZW5lcikKLQkJCQkJCQkuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUodHJ1ZSk7Ci0JCQkJfQotCi0JCQkJY3RybF9tZXRob2RfZWxlbWVudC5zZXRUZXh0KGdldE1ldGhvZEVsZW1lbnROYW1lKGVsZW1lbnQpKTsKLQkJCQljdHJsX3dvcmtQcm9kdWN0X3R5cGUuc2V0VGV4dChnZXRNZXRob2RFbGVtZW50VHlwZShlbGVtZW50KSk7Ci0JCQkJYWN0aXZpdHlFbnRyeVN0YXRlLnNldFRleHQoZWxlbWVudC5nZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSk7Ci0JCQkJYWN0aXZpdHlFeGl0U3RhdGUuc2V0VGV4dChlbGVtZW50LmdldEFjdGl2aXR5RXhpdFN0YXRlKCkpOwotCi0JCQkJaWYgKHdwTW9kZWxNb2RpZnlMaXN0ZW5lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRFZGl0b3IuTW9kaWZ5TGlzdGVuZXIpIHsKLQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yLk1vZGlmeUxpc3RlbmVyKSB3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpCi0JCQkJCQkJLnNldERpc2FibGUoZmFsc2UpOwotCQkJCX0KLQotCQkJCWFjdGl2aXR5RW50cnlTdGF0ZS5hZGRNb2RpZnlMaXN0ZW5lcih3cE1vZGVsTW9kaWZ5TGlzdGVuZXIpOwotCQkJCWFjdGl2aXR5RXhpdFN0YXRlLmFkZE1vZGlmeUxpc3RlbmVyKHdwTW9kZWxNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJCQlpZiAodmlld2VyXzEgIT0gbnVsbCkgewotCQkJCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JCQkJfQotCi0JCQkJLy8gaGlkZS9zaG93IGNlcnRhaW4gc2VjdGlvbnMuCi0JCQkJdG9nZ2xlU2VjdGlvbigpOwotCi0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCSJFcnJvciByZWZyZXNoaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBnZW5lcmFsIHNlY3Rpb24gOiAiICsgZWxlbWVudCwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSXRlbXMoTGlzdCBpdGVtcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCkgewotCQkJTGlzdCB3cHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCQkJJiYgKCFpc1BhcnRPZkRlbGl2ZXJhYmxlKChXb3JrUHJvZHVjdCkgb2JqLAotCQkJCQkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KSkpIHsKLQkJCQkJd3BzLmFkZCgoV29ya1Byb2R1Y3QpIG9iaik7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXdwcy5pc0VtcHR5KCkpIHsKLQkJCQlBc3NpZ25XUFRvRGVsaXZlcmFibGUgY21kID0gbmV3IEFzc2lnbldQVG9EZWxpdmVyYWJsZSgKLQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQsIHdwcyk7Ci0JCQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQkJCX0KLQkJfQotCQl2aWV3ZXJfMS5yZWZyZXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWx0ZXIgZ2V0RGVzY3JpcHRvckZpbHRlcigpIHsKLQotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JQcm9jZXNzRmlsdGVyKGdldENvbmZpZ3VyYXRpb24oKSkgewotCQkJcHJvdGVjdGVkIGJvb2xlYW4gY2hpbGRBY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWdldEFjdGl2aXRpZXNJblNjb3BlKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGVsZW1lbnQsIGxpc3QpOwotCQkJCQlpZiAobGlzdC5jb250YWlucyhvYmopKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGcm9tUHJvY2Vzc0l0ZW1zKExpc3QgaXRlbXMpIHsKLQkJaWYgKGl0ZW1zICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKHdwICE9IG51bGwpIHsKLQkJCQkJCWlmICghaXNQYXJ0T2ZEZWxpdmVyYWJsZSh3cCwKLQkJCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkpIHsKLQkJCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApOwotCQkJCQkJCWFjdGlvbk1ncgotCQkJCQkJCQkJLmRvQWN0aW9uKAotCQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJCQkJCQkJCXdwRGVzYywgLTEpOwotCQkJCQkJfQotCQkJCQkJYWN0aW9uTWdyCi0JCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQlJQWN0aW9uTWFuYWdlci5BREQsCi0JCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJCQkJCQkJb2JqLCAtMSk7Ci0JCQkJCQkKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgKLQkJCQkJCQkJUHJvcGVydGllc1Jlc291cmNlcy5Qcm9jZXNzX0RlbGl2ZXJhYmxlQXNzaWduRXJyb3IpOyAKLQkJCQkJCU9iamVjdFtdIGFyZ3MgPSB7Ci0JCQkJCQkJCSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopLmdldE5hbWUoKSwKLQkJCQkJCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldE5hbWUoKSB9OwotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlJbmZvKAotCQkJCQkJCQkJCVByb3BlcnRpZXNSZXNvdXJjZXMuUHJvY2Vzc19Bc3NpZ25tZW50SW5mb1RpdGxlLCBtZi5mb3JtYXQoYXJncykpOyAKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUl0ZW1zKExpc3QgaXRlbXMpIHsKLQkJaWYgKCFpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSAoT2JqZWN0KSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCWFjdGlvbk1ncgotCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLlJFTU9WRSwKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwKLQkJCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaiwgLTEpOwotCQkJCX0KLQotCQkJCS8vIGZpbmQgbWF0Y2hpbmcgZGVsaXZlcmFibGUgcGFydHMKLQkJCQlPYmplY3Qgd3BEZXNjID0gZmluZERlbGl2ZXJhYmxlUGFydHMoKE9iamVjdCkgb2JqKTsKLQkJCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlbGVtZW50LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJCQl3cERlc2MsIC0xKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0IGZpbmREZWxpdmVyYWJsZVBhcnRzKE9iamVjdCBvYmopIHsKLQkJTGlzdCBwYXJ0cyA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcGFydHMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRvck9iamVjdCA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCWlmIChpdG9yT2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCU9iamVjdCBvYmpXUCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCU9iamVjdCBpdG9yV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRvck9iamVjdCkKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJaWYgKG9ialdQLmVxdWFscyhpdG9yV1ApKSB7Ci0JCQkJCQlyZXR1cm4gaXRvck9iamVjdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmQgcGFyZW50IHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgcGFyZW50IGRlbGl2ZXJhYmxlcwotCSAqIAotCSAqIEBwYXJhbSBickVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFBhcmVudERlbGl2ZXJhYmxlcyhCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudCkgewotCQlMaXN0IHBhcmVudERlbGl2ZXJhYmxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJYnJFbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlickVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50OwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBwYXJlbnQ7Ci0JCQkJaWYgKHdwZGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQkJcGFyZW50RGVsaXZlcmFibGVzLmFkZCh3cGRlc2MpOwotCQkJCX0KLQkJCX0KLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50RGVsaXZlcmFibGVzOwotCX0KLQkvKioKLQkgKiBGaW5kIGFsbCBzaWJsaW5nIHdvcmsgcHJvZHVjdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRQYXJlbnRXb3JrUHJvZHVjdHMoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJSGFzaFNldCB3b3JrUHJvZHVjdHMgPSBuZXcgSGFzaFNldCgpOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCWJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50OwotCQkJCWlmICh3cGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXdvcmtQcm9kdWN0cy5hZGQod3BkZXNjLmdldFdvcmtQcm9kdWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJTGlzdCBickVsZW1lbnRzID0gKChBY3Rpdml0eSkgcGFyZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJFbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWlmICh3cCAhPSBudWxsKQotCQkJCQkJd29ya1Byb2R1Y3RzLmFkZCh3cCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3BlcnRpZXMuRGVzY3JpcHRvckdlbmVyYWxTZWN0aW9uI2dldE5hbWVQcmVmaXgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZVByZWZpeCgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWV0aG9kRWxlbWVudChMaXN0IGl0ZW1zKSB7Ci0JCWlmICgoaXRlbXMgIT0gbnVsbCkgJiYgKGl0ZW1zLnNpemUoKSA+PSAxKSkgewotCQkJaWYgKGl0ZW1zLmdldCgwKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGl0ZW1zLmdldCgwKTsKLQotLy8JCQkJTGlzdCBsaXN0ID0gUHJvY2Vzc1V0aWwKLS8vCQkJCQkJLmdldFNpYmxpbmdzKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0vLwkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGdldEFkYXB0ZXIoKSwKLS8vCQkJCQkJCQllbGVtZW50KTsKLQkJCQlib29sZWFuIGNhbkFzc2lnbiA9IHRydWU7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotLy8JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLS8vCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmo7Ci0vLwkJCQkJCWlmICgoIXdwRGVzYy5lcXVhbHMoZWxlbWVudCkpCi0vLwkJCQkJCQkJJiYgKCF3cERlc2MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotLy8JCQkJCQkJV29ya1Byb2R1Y3QgZXhpc2luZ1dQID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0vLwkJCQkJCQlpZiAod3AuZXF1YWxzKGV4aXNpbmdXUCkpIHsKLS8vCQkJCQkJCQljYW5Bc3NpZ24gPSBmYWxzZTsKLS8vCQkJCQkJCQlicmVhazsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLQkJCQlpZiAoY2FuQXNzaWduKSB7Ci0JCQkJCUxpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBjbWQgPSBuZXcgTGlua01ldGhvZEVsZW1lbnRDb21tYW5kKAotCQkJCQkJCWVsZW1lbnQsIHdwLAotCQkJCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCk7Ci0JCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0KLQkJCQkJLy8gc2V0IHNlbGVjdGlvbiB0byBzYW1lIGVsZW1lbnQgdG8gZW5hYmxlIGNvcnJlY3QgYWN0aW9ucwotCQkJCQlnZXRFZGl0b3IoKS5zZXRTZWxlY3Rpb24oZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCU1lc3NhZ2VGb3JtYXQgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfSW52YWxpZExpbmtNZXRob2RFbGVtZW50KTsgCi0JCQkJCU9iamVjdFtdIGFyZ3MgPSB7IHdwLmdldE5hbWUoKSB9OwotCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheUluZm8oCi0JCQkJCQkJCQlQcm9wZXJ0aWVzUmVzb3VyY2VzLlByb2Nlc3NfTGlua01ldGhvZEVsZW1lbnRUaXRsZSwgbWYuZm9ybWF0KGFyZ3MpKTsgCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFydE9mRGVsaXZlcmFibGUoV29ya1Byb2R1Y3Qgd3AsCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUpIHsKLQotCQlMaXN0IGRlbGl2ZXJhYmxlUGFydHMgPSBQcm9jZXNzVXRpbAotCQkJCS5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJaWYgKGRlbGl2ZXJhYmxlUGFydHMuY29udGFpbnMod3ApKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3BlcnRpZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FhN2M3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvcGVydGllcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0YWJiZWQgcGFnZXMgZm9yIHRoZSBicmVha2Rvd24gZWxlbWVudHMgUHJvcGVydGllcyB2aWV3LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5Q29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9DYXRlZ29yeUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjU2ZDc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklWaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRvbWFpbnNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0c0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRvb2xzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBDb250ZW50IHByb3ZpZGVyIGZvciBDdXN0b20gQ2F0ZWdvcnkgdmlldyBvZiBjb25maWd1cmF0aW9uIHBhZ2UKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKi8KLQotcHVibGljIGNsYXNzIENhdGVnb3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgewotCi0JLy8gdGhlcmUgaXMgYSBwcm9ibGVtIGluIHRoZSBwYXNzZWQgaW4gQWRhcHRlckZhY3RvcnkKLQkvLyBpdCBjYW4ndCBmaW5kIHRoZSBjb3JyZWN0IHBhcmVudCBmcm9tIHRoZSBjaGlsZAotCS8vIG5lZWQgdG8gYnVpbGQgYSBtYXAgb2YgY2hpbGQgdG8gaXQncyBwYXJlbnQgaWYgdGhlIGNoaWxkIGlzIGEgVUkKLQkvLyBmb2xkZXIKLQkvLyBjbGVhciB0aGUgbWFwIHdoZW4gdGhlIGlucHV0IGlzIHNldAotCXByaXZhdGUgTWFwPE9iamVjdCwgT2JqZWN0PiBjaGlsZFVJUGFyZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDYXRlZ29yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJLy8gYWRkIHN0YW5kYXJkIGNhdGVnb3JpZXMgVUkgZm9sZGVycyBhcyBhcHByb3ByaWF0ZQotCQkJRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZGlzY2lwbGluZXMgPSAoRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXREaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKGRpc2NpcGxpbmVzICE9IG51bGwgJiYgIWRpc2NpcGxpbmVzLmdldENoaWxkcmVuKGRpc2NpcGxpbmVzKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZGlzY2lwbGluZXMpOwotCQkJfQotCQkJRG9tYWluc0l0ZW1Qcm92aWRlciBkb21haW5zID0gKERvbWFpbnNJdGVtUHJvdmlkZXIpVG5nVXRpbC5nZXREb21haW5zSXRlbVByb3ZpZGVyKChNZXRob2RQbHVnaW4pcGFyZW50RWxlbWVudCk7Ci0JCQlpZiAoZG9tYWlucyAhPSBudWxsICYmICFkb21haW5zLmdldENoaWxkcmVuKGRvbWFpbnMpLmlzRW1wdHkoKSkgewotCQkJCWNoaWxkcmVuLmFkZChkb21haW5zKTsKLQkJCX0KLQkJCVdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIgd3BUeXBlcyA9IChXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKVRuZ1V0aWwuZ2V0V29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcigoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpOwotCQkJaWYgKHdwVHlwZXMgIT0gbnVsbCAmJiAhd3BUeXBlcy5nZXRDaGlsZHJlbih3cFR5cGVzKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQod3BUeXBlcyk7Ci0JCQl9Ci0JCQlSb2xlU2V0c0l0ZW1Qcm92aWRlciByb2xlU2V0cyA9IChSb2xlU2V0c0l0ZW1Qcm92aWRlcilUbmdVdGlsLmdldFJvbGVTZXRzSXRlbVByb3ZpZGVyKChNZXRob2RQbHVnaW4pcGFyZW50RWxlbWVudCk7Ci0JCQlpZiAocm9sZVNldHMgIT0gbnVsbCAmJiAhcm9sZVNldHMuZ2V0Q2hpbGRyZW4ocm9sZVNldHMpLmlzRW1wdHkoKSkgewotCQkJCWNoaWxkcmVuLmFkZChyb2xlU2V0cyk7Ci0JCQl9Ci0JCQlUb29sc0l0ZW1Qcm92aWRlciB0b29scyA9IChUb29sc0l0ZW1Qcm92aWRlcilUbmdVdGlsLmdldFRvb2xzSXRlbVByb3ZpZGVyKChNZXRob2RQbHVnaW4pcGFyZW50RWxlbWVudCk7Ci0JCQlpZiAodG9vbHMgIT0gbnVsbCAmJiAhdG9vbHMuZ2V0Q2hpbGRyZW4odG9vbHMpLmlzRW1wdHkoKSkgewotCQkJCWNoaWxkcmVuLmFkZCh0b29scyk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGFkZCBDdXN0b21DYXRlZ29yaWVzIHByb3ZpZGVyCi0JCQkvLyBnZXQgcm9vdCBDQyBvZiBwbHVnaW4KLQkJCUN1c3RvbUNhdGVnb3J5IHJvb3RDQyA9IChUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeSgoTWV0aG9kUGx1Z2luKXBhcmVudEVsZW1lbnQpKTsKLQkJCWlmIChyb290Q0MgIT0gbnVsbCAmJiAhcm9vdENDLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQljaGlsZHJlbi5hZGQocm9vdENDKTsKLQkJCX0KLS8vCQkJY2hpbGRyZW4gPSB1bndyYXBGVldJUHMoY2hpbGRyZW4pOwotLy8JCQljaGlsZHJlbiA9IGZpbHRlckNhdGVnb3J5RWxlbWVudHMocGFyZW50RWxlbWVudCwgY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSkpOwotCQkJY2hpbGRyZW4gPSBmaWx0ZXJQbHVnaW4oY2hpbGRyZW4pOwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpKSk7Ci0vLwkJCWNoaWxkcmVuID0gdW53cmFwRlZXSVBzKGNoaWxkcmVuKTsKLQkJCWNoaWxkcmVuID0gZmlsdGVyQ2F0ZWdvcnlFbGVtZW50cyhwYXJlbnRFbGVtZW50LCBjaGlsZHJlbik7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpKSk7Ci0vLwkJCWNoaWxkcmVuID0gdW53cmFwRlZXSVBzKGNoaWxkcmVuKTsKLQkJCWNoaWxkcmVuID0gZmlsdGVyQ2F0ZWdvcnlFbGVtZW50cyhwYXJlbnRFbGVtZW50LCBjaGlsZHJlbik7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KHN1cGVyLmdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpKSk7Ci0JCQljaGlsZHJlbiA9IGZpbHRlclBsdWdpbihjaGlsZHJlbik7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQljaGlsZHJlbi5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdXBlci5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSkpOwotCQl9Ci0JCWNyZWF0ZUNoaWxkUGFyZW50TWFwKHBhcmVudEVsZW1lbnQsIGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuLnRvQXJyYXkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNoaWxkUGFyZW50TWFwKE9iamVjdCBwYXJlbnQsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4uc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkvLyBpZiB0aGUgcGFyZW50IGlzIGEgVUkgZm9sZGVyLCBtYXAgdGhlIGNoaWxkIHRvIHRoZSBwYXJlbnQKLQkJCS8vIHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgcGFyZW50IGxhdGVyCi0JCQkvLyBpZiAoICEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKQotCQkJewotCQkJCWNoaWxkVUlQYXJlbnRNYXAucHV0KGNoaWxkLCBwYXJlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiBmaWx0ZXJQbHVnaW4oQ29sbGVjdGlvbjxPYmplY3Q+IGVsZW1lbnRzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkvLyBmaWx0ZXIgb3V0IHBsdWdpbnMgdGhhdCBoYXZlIG5vIENDJ3MKLQkJCQlpZiAoIWhhc0NoaWxkcmVuKChNZXRob2RQbHVnaW4pZWxlbWVudCkgfHwgIWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyBmaWx0ZXIgb3V0IHBsdWdpbiBwYWNrYWdlcyB0aGF0IGhhdmUgbm8gcGx1Z2lucyB3aXRoIENDJ3MKLQkJCQlpZiAoIWhhc0NoaWxkcmVuKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKWVsZW1lbnQpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIpIHsKLQkJCQkvLyByZW1vdmUgIkNvbmZpZ3VyYXRpb25zIiBmb2xkZXIKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gZmlsdGVyQ2F0ZWdvcnlFbGVtZW50cyhPYmplY3QgcGFyZW50LCBDb2xsZWN0aW9uPE9iamVjdD4gZWxlbWVudHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSkgewotCQkJCS8vIHJlbW92ZSBub24tQ29udGVudENhdGVnb3J5Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCQotLy8JcHJpdmF0ZSBDb2xsZWN0aW9uPE9iamVjdD4gdW53cmFwRlZXSVBzKENvbGxlY3Rpb248T2JqZWN0PiBlbGVtZW50cykgewotLy8JCUNvbGxlY3Rpb248T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotLy8JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0vLwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLS8vCQkJCXJlc3VsdC5hZGQoZ2V0Rmlyc3RUcmVlSXRlbUZvckNDKChDdXN0b21DYXRlZ29yeSllbGVtZW50KSk7Ci0vLwkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotLy8JCQkJcmVzdWx0LmFkZChlbGVtZW50KTsKLS8vCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0vLwkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChjaGlsZFVJUGFyZW50TWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gY2hpbGRVSVBhcmVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJCS8vIHRyeSB0byBkZXRlcm1pbmUgcGFyZW50Ci0vLwkJCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0vLwkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSAmJiAKLS8vCQkJCQllbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0vLwkJCQlyZXR1cm4gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChDb250ZW50Q2F0ZWdvcnkpZWxlbWVudCk7Ci0vLwkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLS8vCQkJCXBhcmVudCA9IGdldEZpcnN0VHJlZUl0ZW1Gb3JDQygoQ3VzdG9tQ2F0ZWdvcnkpcGFyZW50KTsKLS8vCQkJfQotLy8JCQllbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0vLwkJCQlwYXJlbnQgPSBUbmdVdGlsLnVud3JhcChwYXJlbnQpOwotLy8JCQl9Ci0vLwkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiBnZXRUcmVlSXRlbXMoT2JqZWN0IGl0ZW0pIHsKLQkJTGlzdDxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkvLyBnZXQgSVRyZWVDb250ZW50UHJvdmlkZXIgYWRhcGF0ZXIKLQkJTGlzdCBub3RpZnlDaGFuZ2VkTGlzdGVuZXJzID0gVG5nVXRpbC5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKGFkYXB0ZXJGYWN0b3J5LCBpdGVtKTsKLQkJaWYgKCFub3RpZnlDaGFuZ2VkTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihsaXN0ZW5lciBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotCQkJCQkJJiYgVG5nVXRpbC51bndyYXAobGlzdGVuZXIpID09IGl0ZW0pIHsKLQkJCQkJcmVzdWx0LmFkZChsaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzdWx0LmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJc3VwZXIuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJY2hpbGRVSVBhcmVudE1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAoKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIElWaWV3ZXJOb3RpZmljYXRpb24pKSB7Ci0JCQlmaW5hbCBJVmlld2VyTm90aWZpY2F0aW9uIHZudCA9IChJVmlld2VyTm90aWZpY2F0aW9uKSBub3RpZmljYXRpb247Ci0JCQlmaW5hbCBPYmplY3QgZWxlbWVudCA9IHZudC5nZXRFbGVtZW50KCk7Ci0JCQlmaW5hbCBDaGVja2JveFRyZWVWaWV3ZXIgY3RybCA9ICgoQ2hlY2tib3hUcmVlVmlld2VyKSBzdXBlci52aWV3ZXIpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAodm50LmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJfHwgdm50LmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpKSB7Ci0KLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWN0cmwucmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJY2hpbGRVSVBhcmVudE1hcC5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NhdGVnb3J5TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNGY2NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBMYWJlbCBwcm92aWRlciBmb3IgQ3VzdG9tIENhdGVnb3J5IHZpZXcgb2YgY29uZmlndXJhdGlvbiBwYWdlCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICovCi0KLXB1YmxpYyBjbGFzcyBDYXRlZ29yeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnlMYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VGcm9tT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0VGV4dCBieSBmb3J3YXJkaW5nIGl0IHRvCi0JICogYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dCBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dH0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KQotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2MgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHJvYy5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQllbHNlCi0JCQkJLy8gaWYgcHJvY2VzcyBpcyBudWxsLCByZXR1cm4gcHJvY2Vzc2NvbXBvbmVudCBuYW1lCi0JCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29sdW1uRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29sdW1uRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTkwYTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbHVtbkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIE1vZGVscyBhIDxjb2x1bW4+IGVsZW1lbnQgaW4gdGhlICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIgotICogZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uRWxlbWVudCB7Ci0KLQkvLyBwbHVnaW4gYnVuZGxlCi0JQnVuZGxlIGJ1bmRsZTsKLQkKLQkvLyBUaGUgY29sdW1uIElELgotCXByaXZhdGUgU3RyaW5nIGlkOwotCQotCS8vIFRoZSBjb2x1bW4gd2lkdGguCi0JcHJpdmF0ZSBpbnQgd2lkdGg7Ci0JCi0JLy8gVGhlIGNvbHVtbiBhbGlnbm1lbnQKLQlwcml2YXRlIFN0cmluZyBhbGlnbm1lbnQ7Ci0KLQkvLyBUaGUgY29udHJpYnV0b3IgY2xhc3MgZm9yIHRoZSBjb2x1bW4uCi0JcHJpdmF0ZSBTdHJpbmcgY29udHJpYnV0b3JDbGFzczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAJCQkgIEluc3RhbGxlZCBCdW5kbGUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIFRoZSBjb2x1bW4gSUQuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSB3aWR0aCBvZiB0aGUgY29sdW1uICAgICAKLQkgKiBAcGFyYW0gY29udHJpYnV0b3JDbGFzcwotCSAqICAgICAgICAgICAgVGhlIGNvbHVtbiBjb250cmlidXRvciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgQ29sdW1uRWxlbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgaWQsIGludCB3aWR0aCwgU3RyaW5nIGFsaWdubWVudCwgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3MpIHsKLQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmFsaWdubWVudCA9IGFsaWdubWVudDsKLQkJdGhpcy5jb250cmlidXRvckNsYXNzID0gY29udHJpYnV0b3JDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gSUQuCi0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIElELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIHdpZHRoCi0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIHdpZHRoCi0JICovCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gYWxpZ25tZW50Ci0JICogCi0JICogQHJldHVybiBUaGUgY29sdW1uIGFsaWdubWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWxpZ25tZW50KCkgewotCQlyZXR1cm4gYWxpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiBjb250cmlidXRvciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjb2x1bW4gY29udHJpYnV0b3IgY2xhc3MuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDb250cmlidXRvckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MoY29udHJpYnV0b3JDbGFzcyk7Ci0JCXJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjM5ZTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ1BhY2thZ2VDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklWaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkNvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIHsKLQotCS8vIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGUgcGFzc2VkIGluIEFkYXB0ZXJGYWN0b3J5Ci0JLy8gaXQgY2FuJ3QgZmluZCB0aGUgY29ycmVjdCBwYXJlbnQgZnJvbSB0aGUgY2hpbGQKLQkvLyBuZWVkIHRvIGJ1aWxkIGEgbWFwIG9mIGNoaWxkIHRvIGl0J3MgcGFyZW50IGlmIHRoZSBjaGlsZCBpcyBhIFVJCi0JLy8gZm9sZGVyCi0JLy8gY2xlYXIgdGhlIG1hcCB3aGVuIHRoZSBpbnB1dCBpcyBzZXQKLQlNYXA8T2JqZWN0LCBPYmplY3Q+IGNoaWxkVUlQYXJlbnRNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLQotCUxpc3Q8T2JqZWN0PiB1aUZvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQotCXB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0VUlFbGVtZW50cygpIHsKLQkJcmV0dXJuIHVpRm9sZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gaW5zdGFuY2UKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29uZmlnUGFja2FnZUNvbnRlbnRQcm92aWRlcigvL0NvbmZpZ3VyYXRpb25GYWN0b3J5IGNvbmZpZ0ZhY3RvcnksCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeS8qICwgYm9vbGVhbiBzaG93TWV0aG9kTW9kZWxPbmx5ICovKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGl0ZW1zID0gZ2V0VmFsaWRJdGVtcyhwYXJlbnRFbGVtZW50LCBzdXBlcgotCQkJCS5nZXRDaGlsZHJlbihwYXJlbnRFbGVtZW50KSk7Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQotCQlPYmplY3RbXSBpdGVtcyA9IGdldFZhbGlkSXRlbXMoaW5wdXRFbGVtZW50LCBzdXBlcgotCQkJCS5nZXRFbGVtZW50cyhpbnB1dEVsZW1lbnQpKTsKLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1VJRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiAoZSBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIKLQkJCQl8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlciB8fAotCQkJCWUgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyCi0JCSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRVSVRhcmdldEVsZW1lbnQoT2JqZWN0IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIGUpLmVDb250YWluZXIoKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIGU7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKENvbnRlbnRJdGVtUHJvdmlkZXIpIGUpLmdldFBhcmVudChudWxsKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIGUpLmdldFBhcmVudChudWxsKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJT2JqZWN0IHRhcmdldCA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiB0YXJnZXQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFZhbGlkSXRlbXMoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCi0JCUxpc3Q8T2JqZWN0PiBwa2dzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlID0gTGlicmFyeVV0aWwudW53cmFwKGVsZW1lbnRzW2ldKTsKLQkJCWJvb2xlYW4gdWlGb2xkZXIgPSBpc1VJRm9sZGVyKGUpOwotCQkJaWYgKHVpRm9sZGVyIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCXx8IGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlwa2dzLmFkZChlKTsKLQotCQkJCWlmICh1aUZvbGRlcikgewotCQkJCQl1aUZvbGRlcnMuYWRkKGUpOwotCQkJCX0KLQotCQkJCS8vIGlmIHRoZSBwYXJlbnQgaXMgYSBVSSBmb2xkZXIsIG1hcCB0aGUgY2hpbGQgdG8gdGhlIHBhcmVudAotCQkJCS8vIHNvIHRoYXQgd2UgY2FuIGdldCB0aGUgcGFyZW50IGxhdGVyCi0JCQkJLy8gaWYgKCAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkKLQkJCQl7Ci0JCQkJCWNoaWxkVUlQYXJlbnRNYXAucHV0KGUsIHBhcmVudCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwa2dzLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChjaGlsZFVJUGFyZW50TWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gY2hpbGRVSVBhcmVudE1hcC5nZXQoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5sZW5ndGggPiAwKTsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQljaGlsZFVJUGFyZW50TWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmICgobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgSVZpZXdlck5vdGlmaWNhdGlvbikpIHsKLQkJCWZpbmFsIElWaWV3ZXJOb3RpZmljYXRpb24gdm50ID0gKElWaWV3ZXJOb3RpZmljYXRpb24pIG5vdGlmaWNhdGlvbjsKLQkJCWZpbmFsIE9iamVjdCBlbGVtZW50ID0gdm50LmdldEVsZW1lbnQoKTsKLQkJCWZpbmFsIENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIGN0cmwgPSAoKENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKSBzdXBlci52aWV3ZXIpOwotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAodm50LmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJLyp8fCB2bnQuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCovKSkgewotCi0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljdHJsLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl1aUZvbGRlcnMuY2xlYXIoKTsKLQkJY2hpbGRVSVBhcmVudE1hcC5jbGVhcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ1BhY2thZ2VMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMGRmMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkVsZW1lbnREZXBlbmRlbmN5RXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0JcHJpdmF0ZSBDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBhZlByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBjb250ZW50UHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ29uZmlnUGFja2FnZUxhYmVsUHJvdmlkZXIoCi0JCQlDb25maWdQYWNrYWdlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQl0aGlzLmNvbnRlbnRQcm92aWRlciA9IGNvbnRlbnRQcm92aWRlcjsKLQkJYWZQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoY29udGVudFByb3ZpZGVyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotCXByaXZhdGUgRWxlbWVudERlcGVuZGVuY3lFcnJvciBnZXRGaXJzdENoaWxkRXJyb3IoT2JqZWN0IGUpIHsKLQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IG51bGw7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gY29udGVudFByb3ZpZGVyLmdldENoaWxkcmVuKGUpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCB8fCBjaGlsZHJlbi5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gY2hpbGRyZW5baV07Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCXJldHVybiBnZXRGaXJzdENoaWxkRXJyb3Iob2JqZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3IgPSBjbG9zdXJlLmdldEVycm9yKG9iamVjdCk7Ci0JCQkJaWYgKGVycm9yICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGVycm9yOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRJbWFnZSBieSBmb3J3YXJkaW5nIGl0IHRvCi0JICogYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlfQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjbG9zdXJlICE9IG51bGwpIHsKLQotCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCWVycm9yID0gZ2V0Rmlyc3RDaGlsZEVycm9yKG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWVycm9yID0gY2xvc3VyZS5nZXRFcnJvcihvYmplY3QpOwotCQkJfQotCi0JCQlpZiAoZXJyb3IgIT0gbnVsbCkgewotCQkJCWlmIChlcnJvci5pc0Vycm9yKCkgfHwgZXJyb3IuaXNDaGlsZEVycm9yKCkpIHsKLQkJCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkKLQkJCQkJCQkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19FUlJPUl9UU0spOyAKLQkJCQl9IGVsc2UgaWYgKGVycm9yLmlzV2FybmluZygpIHx8IGVycm9yLmlzQ2hpbGRXYXJuaW5nKCkpIHsKLQkJCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkKLQkJCQkJCQkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFmUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2VGcm9tT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRzIHtAbGluayBJTGFiZWxQcm92aWRlcn0uZ2V0VGV4dCBieSBmb3J3YXJkaW5nIGl0IHRvCi0JICogYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0VGV4dCBJSXRlbUxhYmVsUHJvdmlkZXIuZ2V0VGV4dH0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KQotCQkJCQkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2MgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcHJvYy5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQllbHNlCi0JCQkJLy8gaWYgcHJvY2VzcyBpcyBudWxsLCByZXR1cm4gcHJvY2Vzc2NvbXBvbmVudCBuYW1lCi0JCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGFmUHJvdmlkZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQljb250ZW50UHJvdmlkZXIgPSBudWxsOwotCQlhZlByb3ZpZGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbG9zdXJlKENvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUpIHsKLQkJdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWd1cmF0aW9uRWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTMxODJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25FZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29uZmlnVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Db25maWd1cmF0aW9uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Db25maWd1cmF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCXB1YmxpYyBNYXA8T2JqZWN0LCBTdHJpbmc+IGdldFBhZ2VzKE1hcDxPYmplY3QsIFN0cmluZz4gcGFnZU1hcCwKLQkJCUZvcm1FZGl0b3IgZWRpdG9yLCBPYmplY3QgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcGFnZU1hcC5wdXQobmV3IENvbmZpZ3VyYXRpb25EZXNjcmlwdGlvbihlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb25maWd1cmF0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb25maWdWaWV3UGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gcGFnZU1hcDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Db25maWd1cmF0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzJiMDkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0NvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYuZmlndXJlcy5Db2xvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldyB0cmVlLAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29sb3JQcm92aWRlciB7Ci0JTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCi0JcHVibGljIENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRJbWFnZSBieSBmb3J3YXJkaW5nIGl0IHRvIGFuCi0JICogb2JqZWN0IHRoYXQgaW1wbGVtZW50cwotCSAqIHtAbGluayBJSXRlbUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UgSUl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlfQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHJldHVybiB0aGUgZGVmYXVsdCBpbWFnZQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudHMge0BsaW5rIElMYWJlbFByb3ZpZGVyfS5nZXRUZXh0IGJ5IGZvcndhcmRpbmcgaXQgdG8gYW4KLQkgKiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0JICoge0BsaW5rIElJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0IElJdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0fQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJZWxlbWVudCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmplY3QsIGNvbmZpZyk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZWxlbWVudCA9ICgoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0KQotCQkJCQkuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJfQotCQkKLQkJaWYoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQl9Ci0KLQkJCS8vIG5hbWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldE5hbWUoKE1ldGhvZEVsZW1lbnQpb2JqZWN0LAotCQkJLy8gY29uZmlnKTsKLQkJfQotCQkKLQkJSVdvcmtiZW5jaEFkYXB0ZXIgYWRhcHRlciA9IChJV29ya2JlbmNoQWRhcHRlcikgKG9iamVjdCBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyID8KLQkJCQlvYmplY3QgOiAob2JqZWN0IGluc3RhbmNlb2YgSUFkYXB0YWJsZSA/ICgoSUFkYXB0YWJsZSkgb2JqZWN0KS5nZXRBZGFwdGVyKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzKSA6IG51bGwpKTsKLQkJaWYoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRMYWJlbChvYmplY3QpOwotCQl9Ci0JCQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQluYW1lID0gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqZWN0LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgaW5kZXgpIHsKLQkJLy8gYnkgZGVmYXVsdCwgcmV0dXJuIHRoZSBkZWZhdWx0IGltYWdlCi0JCXJldHVybiBnZXRJbWFnZShvYmplY3QpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb25maWcgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb2xvclByb3ZpZGVyI2dldEZvcmVncm91bmQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sb3IgZ2V0Rm9yZWdyb3VuZChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoaXNTdXBwcmVzc2VkKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gQ29sb3JzLlNVUFJFU1NFRF9FTEVNRU5UX0xBQkVMOwotCQl9Ci0JCWVsc2UgaWYgKGlzRXh0ZXJuYWwoZWxlbWVudCkpIHsKLQkJCXJldHVybiBDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU3VwcHJlc3NlZChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKS5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlPYmplY3QgdG9wID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRUb3BJdGVtKCk7Ci0JCQlpZih0b3AgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oKFByb2Nlc3MpIHRvcCkuaXNTdXBwcmVzc2VkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbG9yUHJvdmlkZXIjZ2V0QmFja2dyb3VuZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIGxldCBPUyB0YWtlIGNvbnRyb2wgb3ZlciB0cmVlIHdpZGdldCBiYWNrZ3JvdW5kCi0JCS8vIHJhdGhlciB0aGFuIHNlbmRpbmcgb25lIGZpeGVkIGJhY2tncm91bmQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlciNpc0V4dGVybmFsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZWxlbWVudCkgfHwgUHJvY2Vzc1V0aWwuaXNDb250cmlidXRlZChlbGVtZW50KTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIjZ2V0Rm9udChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBGb250IGdldEZvbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gaXRhbGljRm9udDsKLQkJfQotCQllbHNlIGlmKFByb2Nlc3NVdGlsLmlzQ29udHJpYnV0ZWQoZWxlbWVudCkpIHsKLQkJCXJldHVybiBib2xkSXRhbGljRm9udDsKLQkJfQotCQlyZXR1cm4gcmVndWxhckZvbnQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0Rlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YmJlZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIDxDb2x1bW5FbGVtZW50PiBlbGVtZW50cyBkZWZpbmVkIHZpYSB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FID0gImRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBBdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX1dJRFRIID0gIndpZHRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0FMSUdOTUVOVCA9ICJhbGlnbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9ERUZBVUxUX1dJRFRIID0gMjA7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnRhaW5zIHRoZSBlZGl0b3IgY29sdW1uIHByb3ZpZGVycyBsb2FkZWQgdmlhIHRoZQotCS8vICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0JcHJpdmF0ZSBBcnJheUxpc3QgY29sdW1uUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8JIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIgaW5zdGFuY2UgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKERlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRGVzY3JpcHRpb25QYWdlQ29sdW1uUHJvdmlkZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEZXNjcmlwdGlvblBhZ2VDb2x1bW5Qcm92aWRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBjb2x1bW4gcHJvdmlkZXJzCi0JICogCi0JICogQHJldHVybiBhbGwgdGhlIGNvbHVtbiBwcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0Q29sdW1uUHJvdmlkZXJzKCkgewotLy8JCUxpc3QgY29sdW1ucyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3ZpZGVycy5zaXplKCk7IGkrKykgewotLy8JCQlDb2x1bW5FbGVtZW50IGVsZW1lbnQgPSAoQ29sdW1uRWxlbWVudCkgY29sdW1uUHJvdmlkZXJzCi0vLwkJCQkJLmdldChpKTsKLS8vCQkJT2JqZWN0IGNvbnRyaWJ1dG9yQ2xhc3MgPSBudWxsOwotLy8JCQl0cnkgewotLy8JCQkJY29udHJpYnV0b3JDbGFzcyA9IGVsZW1lbnQuZ2V0Q29udHJpYnV0b3JDbGFzcygpOwotLy8JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQl9Ci0vLwkJCWNvbHVtbnMuYWRkKGNvbnRyaWJ1dG9yQ2xhc3MpOwotLy8JCX0KLS8vCQlyZXR1cm4gY29sdW1uczsKLQkJcmV0dXJuIGNvbHVtblByb3ZpZGVyczsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgdGhlIGNvbmZpZ3VyYXRpb24gcHJvdmlkZXJzIHNwZWNpZmllZCB2aWEgdGhlCi0JICogImRlc2NyaXB0aW9uUGFnZUNvbHVtblByb3ZpZGVyIiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIHZvaWQgbG9hZFByb3ZpZGVycygpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJQ09MVU1OX1BST1ZJREVSU19FWFRFTlNJT05fTkFNRVNQQUNFLAotCQkJCUNPTFVNTl9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0lEKTsKLQkJCQkJCVN0cmluZyB3aWR0aFN0ciA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfV0lEVEgpOwotCQkJCQkJaW50IHdpZHRoID0gcGFyc2VXaWR0aCh3aWR0aFN0cik7Ci0JCQkJCQlTdHJpbmcgYWxpZ25tZW50ID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQ09MVU1OX1BST1ZJREVSX0VYVEVOU0lPTl9BVFRSX0FMSUdOTUVOVCk7Ci0JCQkJCQlTdHJpbmcgY29udHJpYnV0b3JDbGFzcyA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDT0xVTU5fUFJPVklERVJfRVhURU5TSU9OX0FUVFJfQ0xBU1MpOyAKLQkJCQkJCUNvbHVtbkVsZW1lbnQgZWxlbWVudCA9IG5ldyBDb2x1bW5FbGVtZW50KGJ1bmRsZSwKLQkJCQkJCQkJaWQsIHdpZHRoLCBhbGlnbm1lbnQsIGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQkJCQkJY29sdW1uUHJvdmlkZXJzLmFkZChlbGVtZW50KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkJIkZhaWxlZCB0byBsb2FkIEVkaXRvciBjb2x1bW4gUHJvdmlkZXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGludCBwYXJzZVdpZHRoKFN0cmluZyBzdHIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHN0cik7Ci0JCX0KLQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXJldHVybiBDT0xVTU5fREVGQVVMVF9XSURUSDsKLQkJfQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRWRpdG9yUGFnZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0VkaXRvclBhZ2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZGE4N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRWRpdG9yUGFnZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIE1vZGVscyBhIDxlZGl0b3JQYWdlPiBlbGVtZW50IGluIHRoZSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5FZGl0b3JQYWdlUHJvdmlkZXIiCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JQYWdlRWxlbWVudCB7Ci0KLQkvLyBwbHVnaW4gYnVuZGxlCi0JQnVuZGxlIGJ1bmRsZTsKLQkKLQkvLyBUaGUgcGFnZSBJRC4KLQlwcml2YXRlIFN0cmluZyBpZDsKLQkKLQkvLyBUaGUgcGFnZSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvLyBUaGUgY29udHJpYnV0b3IgY2xhc3MgZm9yIHRoZSBwYWdlLgotCXByaXZhdGUgU3RyaW5nIGNvbnRyaWJ1dG9yQ2xhc3M7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlCi0JICogCQkJICBJbnN0YWxsZWQgQnVuZGxlCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBUaGUgcGFnZSBJRC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIHBhZ2UgbmFtZS4gICAgICAgICAgICAKLQkgKiBAcGFyYW0gY29udHJpYnV0b3JDbGFzcwotCSAqICAgICAgICAgICAgVGhlIHBhZ2UgY29udHJpYnV0b3IgY2xhc3MuCi0JICovCi0JcHVibGljIEVkaXRvclBhZ2VFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIFN0cmluZyBjb250cmlidXRvckNsYXNzKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY29udHJpYnV0b3JDbGFzcyA9IGNvbnRyaWJ1dG9yQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFnZSBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYWdlIElELgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFnZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhZ2UgY29udHJpYnV0b3IgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBUaGUgcGFnZSBjb250cmlidXRvciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24gZ2V0Q29udHJpYnV0b3JDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKGNvbnRyaWJ1dG9yQ2xhc3MpOwotCQlyZXR1cm4gKElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uKWNsYXp6Lm5ld0luc3RhbmNlKCk7CQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL0V4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMDE2NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVmlld2VyUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEV4cG9zZWRBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9IaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9IaWRlVW5jaGVja2VkVmlld2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODFmMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSGlkZVVuY2hlY2tlZFZpZXdlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Db250YWluZXJDaGVja2VkVHJlZVZpZXdlcjsKLQotLyoqCi0gKiBGaWx0ZXIgZm9yIHZpZXdlcnMgb2YgY29uZmlndXJhdGlvbiBwYWdlLgotICogSWYgaGlkZVVuY2hlY2tlZCBpcyBzZXQsIGl0IHdpbGwgZmlsdGVyIHVuY2hlY2tlZCBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqLwotcHVibGljIGNsYXNzIEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQotCXByaXZhdGUgQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgdmlld2VyOwotCQotCXByaXZhdGUgYm9vbGVhbiBoaWRlVW5jaGVja2VkID0gZmFsc2U7Ci0JCi0JcHVibGljIEhpZGVVbmNoZWNrZWRWaWV3ZXJGaWx0ZXIoQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGhpZGVVbmNoZWNrZWQgJiYgIWlzQ2hlY2tlZChlbGVtZW50KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlVW5jaGVja2VkKCkgewotCQlyZXR1cm4gaGlkZVVuY2hlY2tlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0b2dnbGVIaWRlVW5jaGVja2VkKCkgewotCQloaWRlVW5jaGVja2VkID0gIWhpZGVVbmNoZWNrZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0NoZWNrZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJTGlzdDxPYmplY3Q+IGNoZWNrZWRJdGVtcyA9IEFycmF5cy5hc0xpc3Qodmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQkJcmV0dXJuIGNoZWNrZWRJdGVtcy5jb250YWlucyhlbGVtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9JQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiNDdhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9JQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgewotCUlDb250ZW50UHJvdmlkZXIgY3JlYXRlUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIElWaWV3UGFydCB2aWV3KTsKLQlJRmlsdGVyIGNyZWF0ZUZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgVmlld2VyIHZpZXdlcik7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9JTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvSU1ldGhvZEVsZW1lbnRFZGl0b3JQYWdlUHJvdmlkZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiNDlmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9JTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIGFsbCBwYWdlcyBhZGRlZCB0aHJvdWdoIGV4dGVuc2lvbiBwb2ludHMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RFbGVtZW50RWRpdG9yUGFnZVByb3ZpZGVyRXh0ZW5zaW9uIHsKLQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBvZiBwYWdlcyB0byBuYW1lcy4KLQkgKiBQYWdlcyBzaG91bGQgYmUgQ29udHJvbCwgSUZvcm1QYWdlLCBvciBJRWRpdG9yUGFydAotCSAqIE5hbWVzIGFyZSB0aGUgcGFydE5hbWUgKGZvciB0aGUgSUVkaXRvclBhcnQgb3IgQ29udHJvbCAtLSBJRm9ybVBhZ2VzIGRvIG5vdCBuZWVkIHRvIHByb3ZpZGUgYSBuYW1lIGluIHRoZSBtYXApLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlTWFwIG1hcCBvZiBwYWdlcyB0byBuYW1lcwotCSAqIEBwYXJhbSBlZGl0b3IgZWRpdG9yIHRoYXQgcGFnZXMgYXJlIGFkZGVkIHRvCi0JICogQHBhcmFtIGlucHV0IG9iamVjdCBiZWluZyBlZGl0ZWQKLQkgKiBAcmV0dXJuIGEgbWFwCi0JICogIAotCSAqLwotCXB1YmxpYyBNYXA8T2JqZWN0LFN0cmluZz4gZ2V0UGFnZXMoTWFwPE9iamVjdCxTdHJpbmc+IHBhZ2VNYXAsIEZvcm1FZGl0b3IgZWRpdG9yLCBPYmplY3QgaW5wdXQpOwotCi0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRFZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50RWRpdG9yRGVmYXVsdFBhZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDk0YTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRFZGl0b3JEZWZhdWx0UGFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNoZWNrbGlzdEl0ZW1zUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkNvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuQ29udGVudFBhY2thZ2VEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeUFzc2lnblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5DdXN0b21DYXRlZ29yeURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lR3JvdXBpbmdEaXNjaXBsaW5lc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5EaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuRGlzY2lwbGluZVRhc2tzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbkRlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkRvbWFpbldvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5HdWlkYW5jZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLkd1aWRhbmNlV2l0aEF0dGFjaG1lbnRzRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5NZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5QcmFjdGljZURlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlByYWN0aWNlUmVmZXJlbmNlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlQ2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Sb2xlRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldERlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVTZXRHcm91cGluZ1JvbGVTZXRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuUm9sZVNldFJvbGVzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlJvbGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0NhdGVnb3JpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza0Rlc2NyaXB0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLlRhc2tSb2xlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5UYXNrU3RlcHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVGFza1dvcmtQcm9kdWN0c1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Ub29sRGVzY3JpcHRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuVG9vbFRvb2xNZW50b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmZvcm1zLldvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZm9ybXMuV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVEZXNjcmlwdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5mb3Jtcy5Xb3JrUHJvZHVjdFR5cGVXb3JrUHJvZHVjdHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmVkaXRvci5Gb3JtRWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudEVkaXRvckRlZmF1bHRQYWdlUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJTWV0aG9kRWxlbWVudEVkaXRvclBhZ2VQcm92aWRlckV4dGVuc2lvbiB7Ci0KLQlwdWJsaWMgTWFwPE9iamVjdCwgU3RyaW5nPiBnZXRQYWdlcyhNYXA8T2JqZWN0LFN0cmluZz4gcGFnZU1hcCwgRm9ybUVkaXRvciBlZGl0b3IsIE9iamVjdCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgTWV0aG9kTGlicmFyeURlc2NyaXB0aW9uRm9ybVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXBhZ2VNYXAucHV0KG5ldyBNZXRob2RQbHVnaW5EZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRQYWNrYWdlRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUm9sZSkgewotCQkJcGFnZU1hcC5wdXQobmV3IFJvbGVEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgUm9sZVdvcmtQcm9kdWN0c1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgUm9sZUNhdGVnb3JpZXNQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgVGFzaykgewotCQkJcGFnZU1hcC5wdXQobmV3IFRhc2tEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgVGFza1N0ZXBzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBUYXNrUm9sZXNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFRhc2tXb3JrUHJvZHVjdHNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFRhc2tDYXRlZ29yaWVzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCXBhZ2VNYXAucHV0KG5ldyBXb3JrUHJvZHVjdERlbGl2ZXJhYmxlUGFydHNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJfQotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFdvcmtQcm9kdWN0Q2F0ZWdvcmllc1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJaWYgKFRuZ1V0aWwuaXNBbGxvd2VkQXR0YWNobWVudHMoKEd1aWRhbmNlKWlucHV0KSkgewotCQkJCXBhZ2VNYXAucHV0KG5ldyBHdWlkYW5jZVdpdGhBdHRhY2htZW50c0Rlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBQcmFjdGljZSkgewotCQkJCXBhZ2VNYXAucHV0KG5ldyBQcmFjdGljZURlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCQlwYWdlTWFwLnB1dChuZXcgUHJhY3RpY2VSZWZlcmVuY2VzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBDaGVja2xpc3QpIHsKLQkJCQlwYWdlTWFwLnB1dChuZXcgR3VpZGFuY2VEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQkJcGFnZU1hcC5wdXQobmV3IENoZWNrbGlzdEl0ZW1zUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFnZU1hcC5wdXQobmV3IEd1aWRhbmNlRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJfQotCQkJaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBQcmFjdGljZSkpCi0JCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJcGFnZU1hcC5wdXQobmV3IERpc2NpcGxpbmVEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgRGlzY2lwbGluZVRhc2tzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBEaXNjaXBsaW5lUmVmZXJlbmNlV29ya2Zsb3dQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgRGlzY2lwbGluZUdyb3VwaW5nRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IERpc2NpcGxpbmVHcm91cGluZ0Rpc2NpcGxpbmVzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcGFnZU1hcC5wdXQobmV3IERvbWFpbkRlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBEb21haW5Xb3JrUHJvZHVjdHNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgV29ya1Byb2R1Y3RUeXBlRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFdvcmtQcm9kdWN0VHlwZVdvcmtQcm9kdWN0c1BhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ29udGVudEVsZW1lbnRHdWlkYW5jZVBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgUm9sZVNldERlc2NyaXB0aW9uUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBSb2xlU2V0Um9sZXNQYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IENvbnRlbnRFbGVtZW50R3VpZGFuY2VQYWdlKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgUm9sZVNldEdyb3VwaW5nRGVzY3JpcHRpb25QYWdlKGVkaXRvciksIG51bGwpOwotCQkJcGFnZU1hcC5wdXQobmV3IFJvbGVTZXRHcm91cGluZ1JvbGVTZXRzKGVkaXRvciksIG51bGwpOwotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgVG9vbCkgewotCQkJcGFnZU1hcC5wdXQobmV3IFRvb2xEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgVG9vbFRvb2xNZW50b3JzUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJCXBhZ2VNYXAucHV0KG5ldyBDb250ZW50RWxlbWVudEd1aWRhbmNlUGFnZShlZGl0b3IpLCBudWxsKTsKLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ3VzdG9tQ2F0ZWdvcnlEZXNjcmlwdGlvblBhZ2UoZWRpdG9yKSwgbnVsbCk7Ci0JCQlwYWdlTWFwLnB1dChuZXcgQ3VzdG9tQ2F0ZWdvcnlBc3NpZ25QYWdlKGVkaXRvciksIG51bGwpOwotCQl9Ci0JCXJldHVybiBwYWdlTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGI2ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExhYmVsRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklEZWNvcmF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogTGFiZWwgZGVjb3JhdG9yIGZvciBtZXRob2QgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzIElMYWJlbERlY29yYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgSUxhYmVsRGVjb3JhdG9yIGRlbGVnYXRlRGVjb3JhdG9yOwotCQotCXByaXZhdGUgc3RhdGljIElMYWJlbERlY29yYXRvciBnZXREZWxlZ2F0ZURlY29yYXRvcigpIHsKLQkJaWYgKGRlbGVnYXRlRGVjb3JhdG9yID09IG51bGwpIHsKLQkJCWRlbGVnYXRlRGVjb3JhdG9yID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREZWNvcmF0b3JNYW5hZ2VyKCkuZ2V0TGFiZWxEZWNvcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gZGVsZWdhdGVEZWNvcmF0b3I7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShPYmplY3QgZWxlbWVudCkgewotCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCS8vIGRvbid0IGRlY29yYXRlIGljb24gb2YgcHJlZGVmaW5lZCBlbGVtZW50cyBpbiBsaWJyYXJ5IHZpZXcgYi9jIHNvbWUgb2YgdGhlbSBhcmUgc2hvd24gYXMgVUkgZm9sZGVyCi0JCS8vCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIFRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRXb3Jrc3BhY2VSZXNvdXJjZShlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnRMYWJlbERlY29yYXRvcigpIHsKLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvciNkZWNvcmF0ZUltYWdlKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsJCQotCQlJUmVzb3VyY2Ugd3NSZXMgPSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShlbGVtZW50KTsKLQkJaWYod3NSZXMgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBnZXREZWxlZ2F0ZURlY29yYXRvcigpLmRlY29yYXRlSW1hZ2UoaW1hZ2UsIHdzUmVzKTsKLQkJfQotCQlyZXR1cm4gZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5kZWNvcmF0ZUltYWdlKGltYWdlLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlVGV4dChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWdldERlbGVnYXRlRGVjb3JhdG9yKCkuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUlSZXNvdXJjZSB3c1JlcyA9IGdldFdvcmtzcGFjZVJlc291cmNlKGVsZW1lbnQpOwotCQlpZih3c1JlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RGVsZWdhdGVEZWNvcmF0b3IoKS5pc0xhYmVsUHJvcGVydHkod3NSZXMsIHByb3BlcnR5KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXREZWxlZ2F0ZURlY29yYXRvcigpLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJEZWNvcmF0aW9uQ2FjaGUoKSB7Ci0JCUlEZWNvcmF0b3JNYW5hZ2VyIGRlY29yYXRvck1hbmFnZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKTsKLQkJZGVjb3JhdG9yTWFuYWdlci51cGRhdGUoIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzLk1ldGhvZEVsZW1lbnRMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxOTc0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9NZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50TGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciBpbXBsZW1lbnRzCi0JCUlMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3Igb3ZlcmxheSA9IG51bGw7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPUkFUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuTWV0aG9kRWxlbWVudExpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMaWdodHdlaWdodExhYmVsRGVjb3JhdG9yI2RlY29yYXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlY29yYXRlKE9iamVjdCBlbGVtZW50LCBJRGVjb3JhdGlvbiBkZWNvcmF0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlpZihMaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlci5pc0ludmFsaWQoZWxlbWVudCkKLS8vCQkJCQl8fCBNZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5pc0ludmFsaWQoZWxlbWVudCkKLQkJCQkJKSB7Ci0JCQkJZGVjb3JhdGlvbi5hZGRPdmVybGF5KGdldEVycm9yT3ZlcmxheSgpKTsKLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQkKLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RXJyb3JPdmVybGF5KCkgewotCQlpZihvdmVybGF5ID09IG51bGwpIHsKLQkJCW92ZXJsYXkgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL292cjE2L2Vycm9yX292ci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBvdmVybGF5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI3JlbW92ZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvTWV0aG9kRWxlbWVudFVJTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RiZTQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL01ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQ29kZSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS52aWV3c3VwcG9ydC5KYXZhVUlMYWJlbFByb3ZpZGVyCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRVSUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0JCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdCBmTGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQotCUlMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQotCXByaXZhdGUgQXJyYXlMaXN0PElMYWJlbERlY29yYXRvcj4gZkxhYmVsRGVjb3JhdG9yczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgcHJvdmlkZXIgd2l0aCBkZWZhdWx0IGZsYWdzLgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50VUlMYWJlbFByb3ZpZGVyKCkgewotCQlmTGFiZWxEZWNvcmF0b3JzPSBudWxsOyAKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBhIGRlY29yYXRvciB0byB0aGUgbGFiZWwgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMYWJlbERlY29yYXRvcihJTGFiZWxEZWNvcmF0b3IgZGVjb3JhdG9yKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzID09IG51bGwpIHsKLQkJCWZMYWJlbERlY29yYXRvcnM9IG5ldyBBcnJheUxpc3Q8SUxhYmVsRGVjb3JhdG9yPigyKTsKLQkJfQotCQlmTGFiZWxEZWNvcmF0b3JzLmFkZChkZWNvcmF0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGZMYWJlbERlY29yYXRvcnMgIT0gbnVsbCAmJiBpbWFnZSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkxhYmVsRGVjb3JhdG9ycy5zaXplKCk7IGkrKykgewotCQkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3I9IChJTGFiZWxEZWNvcmF0b3IpIGZMYWJlbERlY29yYXRvcnMuZ2V0KGkpOwotCQkJCWltYWdlPSBkZWNvcmF0b3IuZGVjb3JhdGVJbWFnZShpbWFnZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIHJlc3VsdD0gZkxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCXJldHVybiBkZWNvcmF0ZUltYWdlKHJlc3VsdCwgZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZVRleHQoU3RyaW5nIHRleHQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJdGV4dD0gZGVjb3JhdG9yLmRlY29yYXRlVGV4dCh0ZXh0LCBlbGVtZW50KTsKLQkJCX0KLQkJfQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGFiZWxQcm92aWRlciNnZXRUZXh0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCVN0cmluZyByZXN1bHQ9IGZMYWJlbFByb3ZpZGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCXJldHVybiBkZWNvcmF0ZVRleHQocmVzdWx0LCBlbGVtZW50KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJZGVjb3JhdG9yLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWZMYWJlbERlY29yYXRvcnM9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxhYmVsRGVjb3JhdG9ycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgZkxhYmVsRGVjb3JhdG9ycy5zaXplKCk7IGkrKykgewotCQkJCUlMYWJlbERlY29yYXRvciBkZWNvcmF0b3I9IChJTGFiZWxEZWNvcmF0b3IpIGZMYWJlbERlY29yYXRvcnMuZ2V0KGkpOwotCQkJCWRlY29yYXRvci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjaXNMYWJlbFByb3BlcnR5KE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiB0cnVlOwkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJQmFzZUxhYmVsUHJvdmlkZXIjcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChmTGFiZWxEZWNvcmF0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBmTGFiZWxEZWNvcmF0b3JzLnNpemUoKTsgaSsrKSB7Ci0JCQkJSUxhYmVsRGVjb3JhdG9yIGRlY29yYXRvcj0gKElMYWJlbERlY29yYXRvcikgZkxhYmVsRGVjb3JhdG9ycy5nZXQoaSk7Ci0JCQkJZGVjb3JhdG9yLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlmTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElMYWJlbERlY29yYXRvcltdIGdldERlY29yYXRvcnMoYm9vbGVhbiBlcnJvcnRpY2ssIElMYWJlbERlY29yYXRvciBleHRyYSkgewotCQlpZiAoZXJyb3J0aWNrKSB7Ci0JCQlpZiAoZXh0cmEgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgSUxhYmVsRGVjb3JhdG9yW10ge307Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgSUxhYmVsRGVjb3JhdG9yW10geyBleHRyYSB9OwotCQkJfQotCQl9Ci0JCWlmIChleHRyYSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElMYWJlbERlY29yYXRvcltdIHsgZXh0cmEgfTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogRmlyZXMgYSBsYWJlbCBwcm92aWRlciBjaGFuZ2VkIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycwotICAgICAqIE9ubHkgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGFyZSBub3RpZmllZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBldmVudCBhIGxhYmVsIHByb3ZpZGVyIGNoYW5nZWQgZXZlbnQKLSAgICAgKgotICAgICAqIEBzZWUgSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciNsYWJlbFByb3ZpZGVyQ2hhbmdlZAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChmaW5hbCBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIE9iamVjdFtdIGxpc3RlbmVycyA9IGZMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBmaW5hbCBJTGFiZWxQcm92aWRlckxpc3RlbmVyIGwgPSAoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotICAgICAgICAgICAgU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIGwubGFiZWxQcm92aWRlckNoYW5nZWQoZXZlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9Qcm9ibGVtc0xhYmVsRGVjb3JhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMWMzMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvUHJvYmxlbXNMYWJlbERlY29yYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5pbnRlcm5hbC5JbWFnZURlc2NyaXB0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmludGVybmFsLkltYWdlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuaW50ZXJuYWwuTWV0aG9kRWxlbWVudEltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotCi0vKioKLSAqIENvZGUgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5qZHQudWkuUHJvYmxlbXNMYWJlbERlY29yYXRvciAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yIGltcGxlbWVudHMgSUxhYmVsRGVjb3JhdG9yLCBJTGlnaHR3ZWlnaHRMYWJlbERlY29yYXRvciB7Ci0JCi0JLyoqCi0JICogVGhpcyBpcyBhIHNwZWNpYWwgPGNvZGU+TGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDwvY29kZT4gY2FycnlpbmcgYWRkaXRpb25hbCAKLQkgKiBpbmZvcm1hdGlvbiB3aGV0aGVyIHRoZSBldmVudCBvcmlnaW5zIGZyb20gYSBtYWtlciBjaGFuZ2UuCi0JICogPHA+Ci0JICogPGNvZGU+UHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudDwvY29kZT5zIGFyZSBvbmx5IGdlbmVyYXRlZCBieSA8Y29kZT4KLQkgKiBQcm9ibGVtc0xhYmVsRGVjb3JhdG9yPC9jb2RlPnMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvYmxlbXNMYWJlbENoYW5nZWRFdmVudCBleHRlbmRzIExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgewotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRD0gMUw7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gZk1hcmtlckNoYW5nZTsKLQotCQkvKioKLQkJICogTm90ZTogVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IuCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnRTb3VyY2UgdGhlIGJhc2UgbGFiZWwgcHJvdmlkZXIKLQkJICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZSB0aGUgY2hhbmdlZCByZXNvdXJjZXMKLQkJICogQHBhcmFtIGlzTWFya2VyQ2hhbmdlIDxjb2RlPnRydWU8Y29kZT4gaWYgdGhlIGNoYW5nZSBpcyBhIG1hcmtlciBjaGFuZ2U7IG90aGVyd2lzZQotCQkgKiAgPGNvZGU+ZmFsc2U8L2NvZGU+IAotCQkgKi8KLQkJcHVibGljIFByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQoSUJhc2VMYWJlbFByb3ZpZGVyIGV2ZW50U291cmNlLCBJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2UsIGJvb2xlYW4gaXNNYXJrZXJDaGFuZ2UpIHsKLQkJCXN1cGVyKGV2ZW50U291cmNlLCBjaGFuZ2VkUmVzb3VyY2UpOwotCQkJZk1hcmtlckNoYW5nZT0gaXNNYXJrZXJDaGFuZ2U7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBldmVudCBvcmlnaW5zIGZyb20gbWFya2VyIGNoYW5nZXMuIElmIDxjb2RlPmZhbHNlPC9jb2RlPiBhbiBhbm5vdGF0aW9uIAotCQkgKiBtb2RlbCBjaGFuZ2UgaXMgdGhlIG9yaWdpbi4gSW4gdGhpcyBjYXNlIHZpZXdlcnMgbm90IGRpc3BsYXlpbmcgd29ya2luZyBjb3BpZXMgY2FuIGlnbm9yZSB0aGVzZSAKLQkJICogZXZlbnRzLgotCQkgKiAKLQkJICogQHJldHVybiBpZiB0aGlzIGV2ZW50IG9yaWdpbnMgZnJvbSBhIG1hcmtlciBjaGFuZ2UuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc01hcmtlckNoYW5nZSgpIHsKLQkJCXJldHVybiBmTWFya2VyQ2hhbmdlOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JUSUNLX0VSUk9SPSBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yLkVSUk9SOwkKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgZlJlZ2lzdHJ5OwotCXByaXZhdGUgYm9vbGVhbiBmVXNlTmV3UmVnaXN0cnk9IGZhbHNlOwotCXByaXZhdGUgSVByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgZkxpc3RlbmVyczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvYmxlbXNMYWJlbERlY29yYXRvcjwvY29kZT4uCi0JICovCi0JcHVibGljIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JCWZVc2VOZXdSZWdpc3RyeT0gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogTm90ZTogVGhpcyBjb25zdHJ1Y3RvciBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIENsaWVudHMgc2hvdWxkIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHJlZ2lzdHJ5IFRoZSByZWdpc3RyeSB0byB1c2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBKYXZhIHBsdWdpbidzCi0JICogIGltYWdlIHJlZ2lzdHJ5Ci0JICovCi0JcHVibGljIFByb2JsZW1zTGFiZWxEZWNvcmF0b3IoSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJZlJlZ2lzdHJ5PSByZWdpc3RyeTsKLQkJZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCWlmIChmUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZlJlZ2lzdHJ5PSBmVXNlTmV3UmVnaXN0cnkgPyBuZXcgSW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSA6IEF1dGhvcmluZ1VJUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZSZWdpc3RyeTsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTGFiZWxEZWNvcmF0b3IjZGVjb3JhdGVUZXh0KFN0cmluZywgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb3JhdGVUZXh0KFN0cmluZyB0ZXh0LCBPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gdGV4dDsKLQl9CQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUxhYmVsRGVjb3JhdG9yI2RlY29yYXRlSW1hZ2UoSW1hZ2UsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZGVjb3JhdGVJbWFnZShJbWFnZSBpbWFnZSwgT2JqZWN0IG9iaikgewotCQlpbnQgYWRvcm5tZW50RmxhZ3M9IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhvYmopOwotCQlpZiAoYWRvcm5tZW50RmxhZ3MgIT0gMCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2VJbWFnZT0gbmV3IEltYWdlSW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJCVJlY3RhbmdsZSBib3VuZHM9IGltYWdlLmdldEJvdW5kcygpOwotCQkJcmV0dXJuIGdldFJlZ2lzdHJ5KCkuZ2V0KG5ldyBNZXRob2RFbGVtZW50SW1hZ2VEZXNjcmlwdG9yKGJhc2VJbWFnZSwgYWRvcm5tZW50RmxhZ3MsIG5ldyBQb2ludChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpKSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seS4gQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIG9iaiB0aGUgZWxlbWVudCB0byBjb21wdXRlIHRoZSBmbGFncyBmb3IKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZG9ybm1lbnQgZmxhZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVBZG9ybm1lbnRGbGFncyhPYmplY3Qgb2JqKSB7Ci0JCXRyeSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBnZXRFcnJvclRpY2tzRnJvbU1hcmtlcnMoKE1ldGhvZEVsZW1lbnQpIG9iaiwgUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKG9iaiksIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCXJldHVybiBnZXRFcnJvclRpY2tzRnJvbU1hcmtlcnMobnVsbCwgKElSZXNvdXJjZSkgb2JqLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuTUFSS0VSX05PVF9GT1VORCkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJCi0JCQlBdXRob3JpbmdVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0RXJyb3JUaWNrc0Zyb21NYXJrZXJzKE1ldGhvZEVsZW1lbnQgZSwgSVJlc291cmNlIHJlcywKLQkJCWludCBkZXB0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzID09IG51bGwgfHwgIXJlcy5pc0FjY2Vzc2libGUoKSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW50IGluZm8gPSAwOwotCi0JCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzLmZpbmRNYXJrZXJzKElNYXJrZXIuUFJPQkxFTSwgdHJ1ZSwgZGVwdGgpOwotCQlpZiAobWFya2VycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoICYmIChpbmZvICE9IEVSUk9SVElDS19FUlJPUik7IGkrKykgewotCQkJCUlNYXJrZXIgY3VyciA9IG1hcmtlcnNbaV07Ci0JCQkJaW50IHByaW9yaXR5ID0gY3Vyci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSwgLTEpOwotCQkJCWlmIChwcmlvcml0eSA9PSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SCi0JCQkJCQkmJiAoZSA9PSBudWxsIHx8IGUKLQkJCQkJCQkJLmdldEd1aWQoKQotCQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJCWN1cnIKLQkJCQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuR1VJRCkpKSkgewotCQkJCQlpbmZvID0gRVJST1JUSUNLX0VSUk9SOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcihmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQlmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcj0gbnVsbDsKLQkJfQotCQlpZiAoZlJlZ2lzdHJ5ICE9IG51bGwgJiYgZlVzZU5ld1JlZ2lzdHJ5KSB7Ci0JCQlmUmVnaXN0cnkuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZkxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlmTGlzdGVuZXJzPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCX0KLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQlpZiAoZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI9IG5ldyBJUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSkgewotCQkJCQlmaXJlUHJvYmxlbXNDaGFuZ2VkKGNoYW5nZWRSZXNvdXJjZXMsIGlzTWFya2VyQ2hhbmdlKTsKLQkJCQl9Ci0JCQl9OwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb2JsZW1NYXJrZXJNYW5hZ2VyKCkuYWRkTGlzdGVuZXIoZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0JfQkKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJaWYgKGZMaXN0ZW5lcnMuaXNFbXB0eSgpICYmIGZQcm9ibGVtQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvYmxlbU1hcmtlck1hbmFnZXIoKS5yZW1vdmVMaXN0ZW5lcihmUHJvYmxlbUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJZlByb2JsZW1DaGFuZ2VkTGlzdGVuZXI9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVQcm9ibGVtc0NoYW5nZWQoSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcywgYm9vbGVhbiBpc01hcmtlckNoYW5nZSkgewotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsICYmICFmTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudD0gbmV3IFByb2JsZW1zTGFiZWxDaGFuZ2VkRXZlbnQodGhpcywgY2hhbmdlZFJlc291cmNlcywgaXNNYXJrZXJDaGFuZ2UpOwotCQkJT2JqZWN0W10gbGlzdGVuZXJzPSBmTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKS5sYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxpZ2h0d2VpZ2h0TGFiZWxEZWNvcmF0b3IjZGVjb3JhdGUoamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRGVjb3JhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNvcmF0ZShPYmplY3QgZWxlbWVudCwgSURlY29yYXRpb24gZGVjb3JhdGlvbikgeyAKLQkJaW50IGFkb3JubWVudEZsYWdzPSBjb21wdXRlQWRvcm5tZW50RmxhZ3MoZWxlbWVudCk7Ci0JCWlmIChhZG9ybm1lbnRGbGFncyA9PSBFUlJPUlRJQ0tfRVJST1IpIHsKLQkJCWRlY29yYXRpb24uYWRkT3ZlcmxheShBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19PVlJfRVJST1IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9WYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NzI3Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9wcm92aWRlcnMvVmFyaWFiaWxpdHlFbGVtZW50TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRm9udFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcmlhYmlsaXR5RWxlbWVudExhYmVsUHJvdmlkZXIgZXh0ZW5kcwotCQlBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRm9udFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgRm9udCByZWd1bGFyRm9udDsKLQotCXByb3RlY3RlZCBzdGF0aWMgRm9udCBib2xkRm9udDsKLQotCXByb3RlY3RlZCBzdGF0aWMgRm9udCBpdGFsaWNGb250OwotCQotCXByb3RlY3RlZCBzdGF0aWMgRm9udCBib2xkSXRhbGljRm9udDsKLQotCXByb3RlY3RlZCBzdGF0aWMgRm9udCBzdHJpa2VvdXRGb250OwkKLQotCXN0YXRpYyB7Ci0JCUZvbnQgZGVmYXVsdEZvbnQgPSBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpOwotCQlyZWd1bGFyRm9udCA9IGRlZmF1bHRGb250OwotCQlGb250RGF0YVtdIGZkcyA9IEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkuZ2V0Rm9udERhdGEoKTsKLQkJaWYgKGZkcy5sZW5ndGggPiAwKSB7Ci0JCQlGb250RGF0YSBmZCA9IGZkc1swXTsKLQkJCWludCBoID0gZmQuZ2V0SGVpZ2h0KCk7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCWJvbGRGb250ID0gbmV3IEZvbnQoZGlzcGxheSwgZmQuZ2V0TmFtZSgpLCBoLCBmZC5nZXRTdHlsZSgpCi0JCQkJCXwgU1dULkJPTEQpOwotCQkJaXRhbGljRm9udCA9IG5ldyBGb250KGRpc3BsYXksIGZkLmdldE5hbWUoKSwgaCwgZmQuZ2V0U3R5bGUoKQotCQkJCQl8IFNXVC5JVEFMSUMpOwotCQkJYm9sZEl0YWxpY0ZvbnQgPSBuZXcgRm9udChkaXNwbGF5LCBmZC5nZXROYW1lKCksIGgsIGZkLmdldFN0eWxlKCkKLQkJCQkJfCBTV1QuQk9MRCB8IFNXVC5JVEFMSUMpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IGdldEl0YWxpY0ZvbnQoKSB7Ci0JCXJldHVybiBpdGFsaWNGb250OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBnZXREZWZhdWx0Rm9udCgpIHsKLQkJcmV0dXJuIHJlZ3VsYXJGb250OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnRMYWJlbFByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgRm9udCBnZXRGb250KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChpc0V4dGVybmFsKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gaXRhbGljRm9udDsKLQkJfQotCQlyZXR1cm4gYm9sZEZvbnQ7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNFeHRlcm5hbChPYmplY3QgZWxlbWVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcHJvdmlkZXJzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI2ZjNlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3Byb3ZpZGVycy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBleHRlbnNpb24gcG9pbnQgbWFuYWdlbWVudCBmb3IgdGhlIEF1dGhvcmluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS9yaWNodGV4dC9JTWV0aG9kUmljaFRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0YTY0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIFJpY2ggVGV4dCBjb250cm9sIHVzZWQgaW4gdGhlIE1ldGhvZCBlZGl0b3JzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kUmljaFRleHQgZXh0ZW5kcyBJUmljaFRleHQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kYWwgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGFsT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kYWxPYmplY3QoRU9iamVjdCBtb2RhbE9iamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1vZGFsIG9iamVjdCBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TW9kYWxPYmplY3RGZWF0dXJlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RhbCBvYmplY3QgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RhbE9iamVjdEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIG1vZGFsT2JqZWN0RmVhdHVyZSk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBNZXRob2RSaWNoVGV4dCB3aXRoIHRoZSBlZGl0ZWQgTWV0aG9kRWxlbW50IGFuZCBuYW1lIG9mIHRoZSBmaWVsZAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZpZWxkTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMYWJlbCBsYWJlbCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L0lNZXRob2RSaWNoVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWY1MzlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvSU1ldGhvZFJpY2hUZXh0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0VG9vbEJhcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIFJpY2ggVGV4dCBlZGl0b3IgdXNlZCBpbiB0aGUgTWV0aG9kIGVkaXRvcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RSaWNoVGV4dEVkaXRvciBleHRlbmRzIElNZXRob2RSaWNoVGV4dCwgSVJpY2hUZXh0RWRpdG9yIHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSBSaWNoIFRleHQgZWRpdG9yIHRvb2wgYmFyIHdpdGggYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBUaGUgUmljaCB0ZXh0IGVkaXRvciB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpOwotCQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIFJpY2ggVGV4dCBvciBIVE1MIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIDAgZm9yIHRoZSBSaWNoIFRleHQgdGFiLCAxIGZvciB0aGUgSFRNTCB0YWIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCk7CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3JpY2h0ZXh0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDhlZmY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvcmljaHRleHQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcmljaCB0ZXh0IGVkaXRpbmcgc3VwcG9ydCBmb3IgdGhlIGVkaXRvcnMgYW5kIFByb3BlcnRpZXMgdmlldy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQXV0aG9yaW5nQWNjZXNzaWJsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNGJjZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0F1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lcjsKLQotLyoqCi0gKiBBY2Nlc3NpYmxlIGxpc3RlbmVyIHdoaWxlIGF1dGhvcmluZyB0aGUgY29udGVudAotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRob3JpbmdBY2Nlc3NpYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBBY2Nlc3NpYmxlTGlzdGVuZXIgewotCQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSl7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIEF1dGhvcmluZ0FjY2Vzc2libGVMaXN0ZW5lcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKXsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lciNnZXREZXNjcmlwdGlvbihvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVzY3JpcHRpb24oQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJZS5yZXN1bHQgPSB0aGlzLmRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldEhlbHAob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUxpc3RlbmVyI2dldEtleWJvYXJkU2hvcnRjdXQob3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGdldEtleWJvYXJkU2hvcnRjdXQoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVMaXN0ZW5lciNnZXROYW1lKG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7CQkKLQkJZS5yZXN1bHQgPSB0aGlzLm5hbWU7Ci0JfQotCQotCQotCS8qKgotCSAqIFNldCBuYW1lIGZvciB0aGUgbGlzdGVuZXIKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VySGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWExOTIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuSUNvbmZpZ3VyYXRpb25FcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuTWFya2VyVmlld1V0aWw7Ci0KLS8qKgotICogIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgQ29uZmlndXJhdGlvbiBlcnJvciBtYXJrZXJzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlciB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlciBJTlNUQU5DRSA9IG5ldyBDb25maWd1cmF0aW9uTWFya2VySGVscGVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FUlJPUl9JRCA9ICJlcnJvcklEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09ORklHX0dVSUQgPSAiY29uZmlnR3VpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FU1NBR0VfSUQgPSAibWVzc2FnZUlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRVJST1JfRUxFTUVOVF9HVUlEID0gImVsZW1lbnRHdWlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0FVU0VfRUxFTUVOVF9HVUlEID0gImNhdXNlR3VpZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG1hcmtlciBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktFUl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkKLS8vCXByaXZhdGUgTWFwPEVsZW1lbnREZXBlbmRlbmN5RXJyb3IsIElNYXJrZXI+IGVycm9yTWFya2VyTWFwID0gbmV3IEhhc2hNYXA8RWxlbWVudERlcGVuZGVuY3lFcnJvciwgSU1hcmtlcj4oKTsKLQkKLQkvLyBwcml2YXRlIGNvbnN0cnVjdG9yCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uTWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCQlpZihwcmogIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfQ09ORklHX0dVSUQpOwotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotCQkJCQkJCQkvLwotCQkJCQkJCQltYXJrQ29udGFpbmVycyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5jcmVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJCUludGVnZXIgY291bnQ7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCWNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvdW50ID0gbmV3IEludGVnZXIoMCk7Ci0JCQl9Ci0JCQljb3VudCsrOwotCQkJcHV0KG9iamVjdCwgY291bnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoY29udGFpbnNLZXkob2JqZWN0KSkgewotCQkJCUludGVnZXIgY291bnQgPSBnZXQob2JqZWN0KTsKLQkJCQlpZiAoY291bnQgPT0gMSkgewotCQkJCQkvLyByZW1vdmUgb2JqZWN0Ci0JCQkJCXJlbW92ZShvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50LS07Ci0JCQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBtYXJrQ29udGFpbmVycyhNZXRob2RFbGVtZW50IGUpIHsKLQkJCWZvcihFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbDsgY29udGFpbmVyID0gY29udGFpbmVyLmVDb250YWluZXIoKSkgewotCQkJCWluY3JlbWVudChjb250YWluZXIpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVubWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlkZWNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJNYXAgY29udGFpbmVyc09mTWFya2VkT2JqZWN0cyA9IG5ldyBDb250YWluZXJNYXAoKTsJCi0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXJrZXJJRCgpIHsKLQkJcmV0dXJuIE1BUktFUl9JRDsKLQl9Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNnZXRGaWxlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiAoSUZpbGUpIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24odXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCSAgICBTdHJpbmcgc2NoZW1lID0gdXJpLnNjaGVtZSgpOwotCSAgICBpZiAoInBsYXRmb3JtIi5lcXVhbHMoc2NoZW1lKSAmJiB1cmkuc2VnbWVudENvdW50KCkgPiAxICYmICJyZXNvdXJjZSIuZXF1YWxzKHVyaS5zZWdtZW50KDApKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JICAgIHsKLQkgICAgICBTdHJpbmdCdWZmZXIgcGxhdGZvcm1SZXNvdXJjZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgZm9yIChpbnQgaiA9IDEsIHNpemUgPSB1cmkuc2VnbWVudENvdW50KCk7IGogPCBzaXplOyArK2opCi0JICAgICAgewotCSAgICAgICAgcGxhdGZvcm1SZXNvdXJjZVBhdGguYXBwZW5kKCcvJyk7Ci0JICAgICAgICBwbGF0Zm9ybVJlc291cmNlUGF0aC5hcHBlbmQoVVJJLmRlY29kZSh1cmkuc2VnbWVudChqKSkpOwotCSAgICAgIH0KLQkgICAgICByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKHBsYXRmb3JtUmVzb3VyY2VQYXRoLnRvU3RyaW5nKCkpKTsKLQkgICAgfQotCSAgICByZXR1cm4gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIFVzZWQgYnkgZGVjb3JhdG9ycyB0byBkZXRlcm1pbmUgdG8gcHV0IGFuIGVycm9yIHRpY2sgb24gdGhlIE9iamVjdAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcikgewotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9ICgoQ29uZmlndXJhdGlvbnNJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZihjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iaikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlpZiAoSU5TVEFOQ0UuaGFzTWFya2VycygoTWV0aG9kQ29uZmlndXJhdGlvbilvYmopKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlpZiAoSU5TVEFOQ0UuaGFzTWFya2VycygoTWV0aG9kQ29uZmlndXJhdGlvbilvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMuY29udGFpbnNLZXkob2JqZWN0KTsKLQl9Ci0JCSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJdHJ5IHsKLQkgICAgCUlNYXJrZXIgbWFya2VyID0gZ2V0TWFya2VyKGNvbmZpZywgZXJyb3IpOwotCSAgICAJaWYgKG1hcmtlciAhPSBudWxsKSB7Ci0JICAgIAkJbWFya2VyLmRlbGV0ZSgpOwotCSAgICAJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhjb25maWcpOwotCSAgICAJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotICAgIH0KLQkKLSAgICBwdWJsaWMgSU1hcmtlciBjcmVhdGVNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLS8vICAgIAlpZiAoZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0vLyAgICAJaWYgKGVycm9yLmdldENhdXNlTWV0aG9kRWxlbWVudCgpID09IG51bGwpIHJldHVybiBudWxsOwotICAgIAkKLSAgICAJSU1hcmtlciBleGlzdGluZ01hcmtlciA9IGdldE1hcmtlcihjb25maWcsIGVycm9yKTsKLSAgICAJaWYgKGV4aXN0aW5nTWFya2VyICE9IG51bGwpIHsKLSAgICAJCWFkanVzdE1hcmtlcihleGlzdGluZ01hcmtlciwgY29uZmlnLCBlcnJvcik7Ci0gICAgCQlyZXR1cm4gZXhpc3RpbmdNYXJrZXI7Ci0gICAgCX0KLSAgICAJdHJ5IHsKLQkgICAgCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldElSZXNvdXJjZShjb25maWcpOwotCSAgICAJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkgICAgCQlJTWFya2VyIG1hcmtlciA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihnZXRNYXJrZXJJRCgpKTsKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKElERS5FRElUT1JfSURfQVRUUiwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQlhZGp1c3RNYXJrZXIobWFya2VyLCBjb25maWcsIGVycm9yKTsKLQkgICAgCQljb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLm1hcmtDb250YWluZXJzKGNvbmZpZyk7Ci0JICAgIAkJcmV0dXJuIG1hcmtlcjsKLQkgICAgCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkanVzdE1hcmtlcihJTWFya2VyIG1hcmtlciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLSAgICAJaWYgKGNvbmZpZyA9PSBudWxsIHx8IGVycm9yID09IG51bGwpIHJldHVybjsKLSAgICAgICAJdHJ5IHsKLSAgICAgICAJCWlmIChtYXJrZXIgPT0gbnVsbCkgewotICAgICAgIAkJCS8vIHRyeSB0byBmaW5kIG1hcmtlcgotICAgICAgIAkJCW1hcmtlciA9IGdldE1hcmtlcihjb25maWcsIGVycm9yKTsKLSAgICAgICAJCX0KLSAgICAgICAJCWlmIChtYXJrZXIgPT0gbnVsbCkgcmV0dXJuOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCBlcnJvci5nZXRTZXZlcml0eSgpKTsKLQkgICAgCVN0cmluZyBtZXNzYWdlID0gZ2V0TWVzc2FnZShlcnJvcik7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgbWVzc2FnZSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTElORV9OVU1CRVIsIDApOwotCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0NPTkZJR19HVUlELCBjb25maWcuZ2V0R3VpZCgpKTsKLQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoQVRUUl9FUlJPUl9JRCwgZXJyb3IuZ2V0SWQoKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlKEFUVFJfTUVTU0FHRV9JRCwgZXJyb3IuZ2V0TWVzc2FnZUlkKCkpOwotCQkJCi0JICAgIAlpZiAoZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVycm9yLmdldEVycm9yTWV0aG9kRWxlbWVudCgpKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShBVFRSX0VSUk9SX0VMRU1FTlRfR1VJRCwgZXJyb3IuZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkuZ2V0R3VpZCgpKTsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE1hcmtlclZpZXdVdGlsLk5BTUVfQVRUUklCVVRFLCBlcnJvci5nZXRFcnJvck1ldGhvZEVsZW1lbnQoKS5nZXROYW1lKCkpOwotCSAgICAJfQotCSAgICAJaWYgKGVycm9yLmdldENhdXNlTWV0aG9kRWxlbWVudCgpICE9IG51bGwpIHsKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKEFUVFJfQ0FVU0VfRUxFTUVOVF9HVUlELCBlcnJvci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQoKS5nZXRHdWlkKCkpOwotCSAgICAJfQotCSAgICAJCi0JCQlJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgYXR0QWRkZXIgPSBFeHRlbnNpb25IZWxwZXIuZ2V0TWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIoKTsKLQkJCWlmIChhdHRBZGRlciAhPSBudWxsKSB7Ci0JCQkJYXR0QWRkZXIuYWRkQWRkdGlvbmFsQXR0cmlidXRlcyhtYXJrZXIsIGVycm9yKTsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotICAgfQotICAgIAkKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXJrZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLQkJaWYgKGdldE1hcmtlcihjb25maWcsIGVycm9yKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYSBtYWtlciB3aXRoIGlkIGVxdWFscyB0byB0aGUgcmV0dXJuIG9mIHtAbGluayAjZ2V0TWFya2VySUQoKX0gICAgICAgICAgICAgIAotICAgICAqIGlzIGF2YWlsYWJsZSBpbiB0aGUgSVJlc291cmNlIGNvbXB1dGVkIGZyb20gdGhlIHNwZWNpZmllZCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqIEBwYXJhbSBvYmplY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqIEByZXR1cm4gYm9vbGVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc01hcmtlcnMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLSAgICAJSVJlc291cmNlIHJlc291cmNlID0gZ2V0SVJlc291cmNlKGNvbmZpZyk7Ci0gICAgICAgIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgIAl0cnkgewotCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCXJldHVybiBtYXJrZXJzLmxlbmd0aCA+IDA7Ci0JICAJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJTWFya2VyIGdldE1hcmtlcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcikgewotICAgIAlpZiAoY29uZmlnID09IG51bGwgfHwgZXJyb3IgPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICAJdHJ5IHsKLQkgICAgCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldElSZXNvdXJjZShjb25maWcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCVN0cmluZyBtYXJrZXJFcnJvcklkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShBVFRSX0VSUk9SX0lEKTsKLQkJCQkJaWYgKGVycm9yLmdldElkKCkuZXF1YWxzKG1hcmtlckVycm9ySWQpKSB7Ci0JCQkJCQlyZXR1cm4gbWFya2VyOwotCQkJCQl9Ci0JCQkJfQotCSAgICAgICAgfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TWVzc2FnZShJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0gICAgCXJldHVybiBlcnJvci5nZXRFcnJvck1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0SVJlc291cmNlKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0gICAgCVJlc291cmNlIHJlc291cmNlID0gY29uZmlnLmVSZXNvdXJjZSgpOwotICAgICAgICBVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0gICAgICAgIHVyaSA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0gICAgICAgIHJldHVybiBnZXRGaWxlKHVyaSk7Ci0KLSAgICB9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnKElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyBjb25maWdHdWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShBVFRSX0NPTkZJR19HVUlEKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChjb25maWdHdWlkKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbillOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXJyb3JNZXRob2RFbGVtZW50KElNYXJrZXIgbWFya2VyKSB7Ci0JCWlmIChtYXJrZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyBlcnJvckd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEFUVFJfRVJST1JfRUxFTUVOVF9HVUlEKTsKLQkJCWlmIChlcnJvckd1aWQgIT0gbnVsbCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChlcnJvckd1aWQpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldENhdXNlTWV0aG9kRWxlbWVudChJTWFya2VyIG1hcmtlcikgewotCQlpZiAobWFya2VyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY2F1c2VHdWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShBVFRSX0NBVVNFX0VMRU1FTlRfR1VJRCk7Ci0JCQlpZiAoY2F1c2VHdWlkICE9IG51bGwpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoY2F1c2VHdWlkKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYzI2NTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkNvbmZpZ3VyYXRpb25FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb247Ci0KLS8qKgotICogIE1hcmtlclJlc29sdXRpb24gZm9yIENvbmZpZ3VyYXRpb24gZXJyb3JzCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24gaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbiB7Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVycm9yRWxlbWVudDsKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudDsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kRWxlbWVudCBlcnJvckVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgY2F1c2VFbGVtZW50KSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLmVycm9yRWxlbWVudCA9IGVycm9yRWxlbWVudDsKLQkJdGhpcy5jYXVzZUVsZW1lbnQgPSBjYXVzZUVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Jlc29sdmVNaXNzaW5nUmVmZXJlbmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicXVpY2sgZml4IG1lIik7Ci0JCXRyeSB7Ci0JCQkgICAvLyBnZXQgdGhlIG1hcmtlciByZXNvdXJjZSBmaWxlCi0JICAgICAgICBpZiAoKG1hcmtlci5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgSUZpbGUpKSB7Ci0JICAgICAgCi0JICAgICAgICAJSUZpbGUgZmlsZSA9IChJRmlsZSkgbWFya2VyLmdldFJlc291cmNlKCk7Ci0JICAgICAgICAJCi0JICAgICAgICAJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkgICAgICAgIAlNZXRob2RFbGVtZW50IGNvbmZpZyA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KGZpbGUsIHJlc291cmNlU2V0KTsKLQkgICAgICAgIAlJRWRpdG9yUGFydCBlZGl0b3IgPSBFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZmluZEVkaXRvcihjb25maWcpOwotCSAgICAgICAgCWlmICggZWRpdG9yIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvbkVkaXRvciApIHsKLQkgICAgICAgIAkJKChDb25maWd1cmF0aW9uRWRpdG9yKWVkaXRvcikuZG9RdWlja0ZpeChtYXJrZXIpOwotCSAgICAgICAgCX0KLQkgICAgICAgIAkKLQkgICAgICAgIH0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4ICkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotICAgICAgICAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9Db25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTZkNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0NvbmZpZ3VyYXRpb25NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb24ncwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgaW1wbGVtZW50cyBJTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU1hcmtlclJlc29sdXRpb25bXSBFTVBUWV9SRVNPTFVUSU9OUyA9IG5ldyBJTWFya2VyUmVzb2x1dGlvblswXTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZ3VyYXRpb25NYXJrZXJIZWxwZXIgbWFya2VySGVscGVyID0gQ29uZmlndXJhdGlvbk1hcmtlckhlbHBlci5JTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yI2dldFJlc29sdXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHVibGljIElNYXJrZXJSZXNvbHV0aW9uW10gZ2V0UmVzb2x1dGlvbnMoSU1hcmtlciBtYXJrZXIpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBtYXJrZXJIZWxwZXIuZ2V0Q29uZmlnKG1hcmtlcik7Ci0JCU1ldGhvZEVsZW1lbnQgZXJyb3JFbGVtZW50ID0gbWFya2VySGVscGVyLmdldEVycm9yTWV0aG9kRWxlbWVudChtYXJrZXIpOwotCQlNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudCA9IG1hcmtlckhlbHBlci5nZXRDYXVzZU1ldGhvZEVsZW1lbnQobWFya2VyKTsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gY3JlYXRlIE1hcmtlclJlc29sdXRpb25zCi0JCQlyZXR1cm4gbmV3IElNYXJrZXJSZXNvbHV0aW9uW10ge25ldyBDb25maWd1cmF0aW9uTWFya2VyUmVzb2x1dGlvbihjb25maWcsIGVycm9yRWxlbWVudCwgY2F1c2VFbGVtZW50KX07Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX1JFU09MVVRJT05TOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9FZGl0b3JzQ29udGV4dEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0VkaXRvcnNDb250ZXh0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDg3MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0VkaXRvcnNDb250ZXh0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEVkaXRvcnMgY29udGV4dCBoZWxwZXIKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yc0NvbnRleHRIZWxwZXIgewotCi0JLyoqCi0JICogU2V0IGNvbnRleHQgaGVscCBmb3IgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gdWlDb21wb3NpdGUKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoQ29udHJvbCB1aUNvbXBvc2l0ZSwgT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1JPTEVfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfVEFTS19DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9XT1JLX1BST0RVQ1RfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0dVSURBTkNFX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RJU0NJUExJTkVfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RJU0NJUExJTkVfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERvbWFpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ET01BSU5fQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1dPUktfUFJPRFVDVF9UWVBFX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX1JPTEVfU0VUX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9ST0xTRV9TRVRfR1JPVVBJTkdfQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRvb2wpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfVE9PTF9DT05URVhUX0hFTFBfSUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfQ1VTVE9NX0NBVEVHT1JZX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5QTFVHSU5fRURJVE9SX0RFU0NSSVBUSU9OX0FMTF9DT05URVhUKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTlRFTlRfUEFDS0FHRV9FRElUT1JfQUxMX0NPTlRFWFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX0VESVRPUl9BTExfQ09OVEVYVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogU2V0IGNvbnRleHQgaGVscCBmb3IgcHJvY2VzcyB0eXBlCi0JICogCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICogQHBhcmFtIHByb2NUeXBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoQ29udHJvbCB1aUNvbXBvc2l0ZSwgU3RyaW5nIHByb2NUeXBlKSB7Ci0JCWlmICgocHJvY1R5cGUgIT0gbnVsbCAmJiBwcm9jVHlwZQotCQkJCS5lcXVhbHNJZ25vcmVDYXNlKCJjYXBhYmlsaXR5IHBhdHRlcm4iKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1VSQotCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCQkuc2V0SGVscCgKLQkJCQkJCQl1aUNvbXBvc2l0ZSwKLQkJCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5FRElUT1JfQ1BfREVTQ1JJUFRJT05fQ09OVEVYVF9IRUxQX0lEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgocHJvY1R5cGUgIT0gbnVsbCAmJiBwcm9jVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJkZWxpdmVyeSBwcm9jZXNzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuRURJVE9SX0RQX0RFU0NSSVBUSU9OX0NPTlRFWFRfSEVMUF9JRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkVESVRPUl9EUF9ERVNDUklQVElPTl9DT05URVhUX0hFTFBfSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL0xpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4YzE5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlZhbGlkYXRlQWN0aW9uLkVjbGlwc2VSZXNvdXJjZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Db250ZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLlByb2Nlc3Nlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgZXh0ZW5kcyBFY2xpcHNlUmVzb3VyY2VzVXRpbCB7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIgSU5TVEFOQ0UgPSBuZXcgTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEID0gImd1aWQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIElQYXJlbnRQcm92aWRlciB7Ci0JCWZpbmFsIElQYXJlbnRQcm92aWRlciBjb250YWluZXJQcm92aWRlciA9IG5ldyBJUGFyZW50UHJvdmlkZXIoKSB7Ci0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFBhcmVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJZmluYWwgSVBhcmVudFByb3ZpZGVyIHBhcmVudEN1c3RvbUNhdGVnb3J5UHJvdmlkZXIgPSBuZXcgSVBhcmVudFByb3ZpZGVyKCkgewotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRQYXJlbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpb2JqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlmaW5hbCBJUGFyZW50UHJvdmlkZXIgcGFyZW50U3RhbmRhcmRDYXRlZ29yeVByb3ZpZGVyID0gbmV3IElQYXJlbnRQcm92aWRlcigpIHsKLQotCQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UGFyZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgb2JqZWN0OwotCQkJCQlMaXN0IHBhcmVudERpc2NpcGxpbmVzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZShkaXNjaXBsaW5lKTsKLQkJCQkJTGlzdCBkaXNjaXBsaW5lR3JvdXBpbmdzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcyhkaXNjaXBsaW5lKTsKLQkJCQkJaWYoIXBhcmVudERpc2NpcGxpbmVzLmlzRW1wdHkoKSAmJiAhZGlzY2lwbGluZUdyb3VwaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBwYXJlbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGRpc2NpcGxpbmVHcm91cGluZ3MpOwotCQkJCQkJcGFyZW50cy5hZGRBbGwocGFyZW50RGlzY2lwbGluZXMpOwotCQkJCQkJcmV0dXJuIHBhcmVudHM7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXR1cm4gcGFyZW50RGlzY2lwbGluZXMuaXNFbXB0eSgpID8gZGlzY2lwbGluZUdyb3VwaW5ncyA6IHBhcmVudERpc2NpcGxpbmVzOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Um9sZVNldEdyb3VwcygoUm9sZVNldCkgb2JqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlDb2xsZWN0aW9uPD8+IGdldFBhcmVudHMoT2JqZWN0IG9iamVjdCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVycm9yQ2FsY3VsYXRvciBleHRlbmRzIEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBTZXQ8TWV0aG9kRWxlbWVudD4+IHsJCQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgRXJyb3JDYWxjdWxhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRpYWxpemUoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdGlhbGl6ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRpYWxpemUoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCQl0cnkgewotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHdzUm9vdC5maW5kTWFya2VycyhJTlNUQU5DRS5nZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCQlpZihlICE9IG51bGwpIHsKLQkJCQkJCQlpZihlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJZSA9IChNZXRob2RFbGVtZW50KSBQZXJzaXN0ZW5jZVV0aWwucmVzb2x2ZShlLAotCQkJCQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGFkZCB0aGUgZWxlbWVudCB0byB0aGlzIHNldAotCQkJCQkJCS8vCi0JCQkJCQkJYWRkRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZEVycm9yKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8TWV0aG9kRWxlbWVudD4oKTsKLQkJCQkJcHV0KHBsdWdpbiwgZWxlbWVudHMpOwotCQkJCX0KLQkJCQllbGVtZW50cy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUVycm9yKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCWVsZW1lbnRzLnJlbW92ZShlKTsKLQkJCQkJaWYoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzRXJyb3JzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTZXQ8TWV0aG9kRWxlbWVudD4gZWxlbWVudHMgPSBnZXQocGx1Z2luKTsKLQkJCQlpZihlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCWlmKGVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCS8vIGNoZWNrIGlmIGUgaXMgY29udGFpbmVyIG9mIGFueSBlcnJvciBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCUhhc2hTZXQ8T2JqZWN0PiBwcm9jZXNzZWRDaGlsZHJlbiA9IG51bGw7Ci0JCQkJCWZvciAoTWV0aG9kRWxlbWVudCBtZSA6IGVsZW1lbnRzKSB7Ci0JCQkJCQlpZihVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZihtZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCQkJaWYocHJvY2Vzc2VkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCQkJCQlwcm9jZXNzZWRDaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGlzUGFyZW50T2YobWUsIGUsIElQYXJlbnRQcm92aWRlci5wYXJlbnRDdXN0b21DYXRlZ29yeVByb3ZpZGVyLCBwcm9jZXNzZWRDaGlsZHJlbikpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihtZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCQkJCS8vIG1lIG11c3QgYmUgYSBzdGFuZGFyZCBjYXRlZ29yeQotCQkJCQkJCS8vIGN1cnJlbnRseSBhbGwgY29udGVudCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4KLQkJCQkJCQkvLyBzdGFuZGFyZCBjYXRlZ29yaWVzIGFyZSBub3QgY29udGFpbmVkIGJ5Ci0JCQkJCQkJLy8gcHJlZGVmaW5lZCBjb250ZW50IHBhY2thZ2UgIlN0YW5kYXJkIENhdGVnb3JpZXMiCi0JCQkJCQkJLy8gd2UgbmVlZCB0byBoYW5kbGUgdGhpcyBzcGVjaWFsbHkgaGVyZQotCQkJCQkJCS8vCi0JCQkJCQkJaWYoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlICYmIGUgPT0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnN0YW5kYXJkQ2F0ZWdvcnlQYXRoKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYocHJvY2Vzc2VkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCQkJCQlwcm9jZXNzZWRDaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb2Nlc3NlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGlzUGFyZW50T2YobWUsIGUsIElQYXJlbnRQcm92aWRlci5wYXJlbnRTdGFuZGFyZENhdGVnb3J5UHJvdmlkZXIsIHByb2Nlc3NlZENoaWxkcmVuKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNQYXJlbnRPZihPYmplY3QgY2hpbGQsIE9iamVjdCBwYXJlbnQsIElQYXJlbnRQcm92aWRlciBwYXJlbnRQcm92aWRlciwgU2V0PE9iamVjdD4gcHJvY2Vzc2VkQ2hpbGRyZW4pIHsKLQkJCXByb2Nlc3NlZENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlmb3IgKE9iamVjdCBteVBhcmVudCA6IHBhcmVudFByb3ZpZGVyLmdldFBhcmVudHMoY2hpbGQpKSB7CQkJCQotCQkJCWlmKG15UGFyZW50ID09IHBhcmVudCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYoIXByb2Nlc3NlZENoaWxkcmVuLmNvbnRhaW5zKG15UGFyZW50KSAmJiBpc1BhcmVudE9mKG15UGFyZW50LCBwYXJlbnQsIHBhcmVudFByb3ZpZGVyLCBwcm9jZXNzZWRDaGlsZHJlbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFcnJvckNhbGN1bGF0b3IgZXJyb3JDYWxjdWxhdG9yID0gbmV3IEVycm9yQ2FsY3VsYXRvcigpOwkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNnZXRGaWxlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoVVJJIHVyaSkgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiAoSUZpbGUpIEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24odXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZSh1cmkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSU1hcmtlckhlbHBlciNhZGp1c3RNYXJrZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlciwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRqdXN0TWFya2VyKElNYXJrZXIgbWFya2VyLCBEaWFnbm9zdGljIGRpYWdub3N0aWMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXQgPSBzdXBlci5hZGp1c3RNYXJrZXIobWFya2VyLCBkaWFnbm9zdGljKTsKLQkJaWYoIWRpYWdub3N0aWMuZ2V0RGF0YSgpLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0IG8gPSBkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoR1VJRCwgKChNZXRob2RFbGVtZW50KW8pLmdldEd1aWQoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgobykpOwotCSAgICAJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSURFLkVESVRPUl9JRF9BVFRSLCAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLk1ldGhvZEVsZW1lbnRFZGl0b3IiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAJCWVycm9yQ2FsY3VsYXRvci5hZGRFcnJvcigoTWV0aG9kRWxlbWVudCkgbyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW52YWxpZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IFByb2Nlc3NlcwotCQkJLy8KLQkJCVByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBpcCA9IChQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJCU1ldGhvZEVsZW1lbnQgbzsJCQkKLQkJCXJldHVybiAoKG8gPSBpcC5nZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSkgIT0gbnVsbCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKG8pKQotCQkJCXx8ICgobyA9IGlwLmdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSkgIT0gbnVsbCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKG8pKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdAotCQkJLy8KLQkJCW9iamVjdCA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpOwkJCQotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSAoKENvbnRlbnRJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDb3JlQ29udGVudFBhY2thZ2UoKTsKLQkJCWlmKGNvcmVDb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQlvYmplY3QgPSBjb3JlQ29udGVudFBrZy5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3Q6IGVpdGhlciBUYXNrcywgUm9sZXMsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlCi0JCQkvLwotCQkJQ29sbGVjdGlvbjw/PiBjaGlsZHJlbiA9ICgoVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpb2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlcnJvckNhbGN1bGF0b3IuaGFzRXJyb3JzKChNZXRob2RFbGVtZW50KSBjaGlsZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQlvYmplY3QgPSAoKFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuICgob2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KSkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGVycm9yQ2FsY3VsYXRvcgotCQkJCS5oYXNFcnJvcnMoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNoYXNNYXJrZXJzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTWFya2VycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsJCQkKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEZpbGUob2JqZWN0KTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5nZXRHdWlkKCk7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlpZihndWlkLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5oYXNNYXJrZXJzKG9iamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKE9iamVjdCBkYXR1bSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmdldEZpbGUoZGF0dW0pOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqZWN0OwotCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZ2V0R3VpZCgpOwotCQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwkJCQkJCQotCQkJCQkJaWYoZ3VpZC5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKSkpIHsKLQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJZXJyb3JDYWxjdWxhdG9yLnJlbW92ZUVycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGluY2x1ZGVTdWJ0eXBlcywgaW50IGRlcHRoKSB7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewkJCQkKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKGdldE1hcmtlcklEKCksIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQkJZXJyb3JDYWxjdWxhdG9yLnJlbW92ZUVycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkKLQkJCX0JCQkKLQkJfQotCQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMocmVzb3VyY2UsIGluY2x1ZGVTdWJ0eXBlcywgZGVwdGgpOwotCX0KLQotCS8vT3ZlcnJpZGUgdG8gc2VwZXJhdGUgZXJyb3IgbWVzc2FnZSBpbiBlcnJvciBkaWFsb2cgYW5kIHByb2JsZW1zIHZpZXcgKGJ1ZyAxNzQzNTEpCi0JLy9Ob3RlOiBiZXR0ZXIgZml4IGlzIHRvIGV4dGVuZCBCYXNpY0RpYWdub3N0aWMgdG8gZW5jYXBzdWxhdGUgYm90aCB0eXBlcyBvZiBtc2dzIC0+IHRvIGRvIGxhdGVyCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wb3NlTWVzc2FnZShEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgewotCQlpbnQgaXggPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKS5pbmRleE9mKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnMik7Ci0JCWlmIChpeCA+IDApIHsKLQkJCXJldHVybiBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKS5zdWJzdHJpbmcoMCwgaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jb21wb3NlTWVzc2FnZShkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL01hcmtlclJlc29sdXRpb25HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxMjU5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuV29ya2JlbmNoTWFya2VyUmVzb2x1dGlvbjsKLQotLyoqCi0gKiBDcmVhdGUgcmVzb2x1dGlvbnMgZm9yIHRoZSBnaXZlbiBtYXJrZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIGltcGxlbWVudHMgSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNYXJrZXJSZXNvbHV0aW9uW10gRU1QVFlfUkVTT0xVVElPTlMgPSBuZXcgSU1hcmtlclJlc29sdXRpb25bMF07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2hvd093bmVySW5MaWJyYXJ5VmlldyBpbXBsZW1lbnRzIElNYXJrZXJSZXNvbHV0aW9uIHsKLQotCQlwcml2YXRlIE9iamVjdCBvd25lcjsKLQotCQkvKioKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqLwotCQlwcml2YXRlIFNob3dPd25lckluTGlicmFyeVZpZXcoT2JqZWN0IG93bmVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb24jZ2V0TGFiZWwoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJCXJldHVybiBBdXRob3JpbmdVSVJlc291cmNlcy5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yX3Nob3dPd25lckluTGlicmFyeVZpZXc7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNydW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bihJTWFya2VyIG1hcmtlcikgewotCQkJTGlicmFyeVZpZXcuZ2V0VmlldygpLnNldFNlbGVjdGlvblRvVmlld2VyKG93bmVyKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFya2VyUmVzb2x1dGlvbiBleHRlbmRzIFdvcmtiZW5jaE1hcmtlclJlc29sdXRpb24gewotCQlwcml2YXRlIElNYXJrZXIgY3VycmVudE1hcmtlcjsKLQkJcHJpdmF0ZSBSZWZlcmVuY2VJbmZvIHJlZmVyZW5jZUluZm87Ci0KLQkJcHVibGljIE1hcmtlclJlc29sdXRpb24oSU1hcmtlciBjdXJyZW50TWFya2VyLCBSZWZlcmVuY2VJbmZvIHJlZmVyZW5jZUluZm8pIHsKLQkJCXRoaXMuY3VycmVudE1hcmtlciA9IGN1cnJlbnRNYXJrZXI7Ci0JCQl0aGlzLnJlZmVyZW5jZUluZm8gPSByZWZlcmVuY2VJbmZvOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JTWFya2VyUmVzb2x1dGlvbiNnZXRMYWJlbCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIEF1dGhvcmluZ1VJUmVzb3VyY2VzLk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3JfcmVtb3ZlVW5yZXNvbHZlZFJlZmVyZW5jZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklNYXJrZXJSZXNvbHV0aW9uI3J1bihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKElNYXJrZXIgbWFya2VyKSB7Ci0JCQlSZWZlcmVuY2VJbmZvIHJlZkluZm8gPSBjdXJyZW50TWFya2VyLmVxdWFscyhtYXJrZXIpID8gcmVmZXJlbmNlSW5mbyA6IGdldFJlZmVyZW5jZUluZm8obWFya2VyKTsKLQkJCWlmKHJlZkluZm8gPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmKHJlZkluZm8ucmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJKChMaXN0PD8+KXJlZkluZm8ub3duZXIuZUdldChyZWZJbmZvLnJlZmVyZW5jZSkpLnJlbW92ZShyZWZJbmZvLmluZGV4KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlZkluZm8ub3duZXIuZVNldChyZWZJbmZvLnJlZmVyZW5jZSwgbnVsbCk7Ci0JCQl9Ci0JCQlib29sZWFuIHZhbGlkYXRlID0gZmFsc2U7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlZkluZm8ub3duZXIuZVJlc291cmNlKCk7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRQZXJzaXN0ZXJGb3IocmVzb3VyY2UpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJdmFsaWRhdGUgPSB0cnVlOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQl9Ci0JCQlpZih2YWxpZGF0ZSkgeyAJCQkJCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRNYXJrZXJNYW5hbmdlcigpLmRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIElNYXJrZXJbXSBmaW5kT3RoZXJNYXJrZXJzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0JCQlBcnJheUxpc3Q8SU1hcmtlcj4gc2ltaWxhck1hcmtlckxpc3QgPSBuZXcgQXJyYXlMaXN0PElNYXJrZXI+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJaWYoIWN1cnJlbnRNYXJrZXIuZXF1YWxzKG1hcmtlcikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuTUFSS0VSX0lELmVxdWFscyhtYXJrZXIuZ2V0VHlwZSgpKSkgewotCQkJCQkJCXNpbWlsYXJNYXJrZXJMaXN0LmFkZChtYXJrZXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlJTWFya2VyW10gc2ltaWxhck1hcmtlcnMgPSBuZXcgSU1hcmtlcltzaW1pbGFyTWFya2VyTGlzdC5zaXplKCldOwotCQkJc2ltaWxhck1hcmtlckxpc3QudG9BcnJheShzaW1pbGFyTWFya2Vycyk7Ci0JCQlyZXR1cm4gc2ltaWxhck1hcmtlcnM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJLy8gVE9ETyBwcm92aWRlIGRldGFpbGVkIGRlc2NyaXB0aW9uCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJCS8vIFRPRE8gcHJvdmlkZSBpbWFnZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlZmVyZW5jZUluZm8gewotCQlwcml2YXRlIEVPYmplY3Qgb3duZXI7Ci0JCXByaXZhdGUgRVJlZmVyZW5jZSByZWZlcmVuY2U7Ci0JCXByaXZhdGUgaW50IGluZGV4OwotCQkKLQkJcHVibGljIFJlZmVyZW5jZUluZm8oRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWZlcmVuY2UsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIFJlZmVyZW5jZUluZm8gZ2V0UmVmZXJlbmNlSW5mbyhJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLlBST1hZX1VSSSk7Ci0JCQlTdHJpbmcgb3duZXJHVUlEID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLk9XTkVSX0dVSUQpOwotCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKG1hcmtlci5nZXRSZXNvdXJjZSgpKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgb3duZXIgPSByZXNvdXJjZS5nZXRFT2JqZWN0KG93bmVyR1VJRCk7Ci0JCQkJCWlmKG93bmVyICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJCQkJCS8vIGZpbmQgdGhlIHByb3h5Ci0JCQkJCQkvLwotCQkJCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCQkJCQlmaW5kX3Byb3h5X2xvb3A6Ci0JCQkJCQlmb3IgKEVSZWZlcmVuY2UgcmVmIDogb3duZXIuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKSkgewotCQkJCQkJCWlmKHJlZi5pc0NoYW5nZWFibGUoKSAmJiAhcmVmLmlzRGVyaXZlZCgpKSB7Ci0JCQkJCQkJCWlmKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIG93bmVyLmVHZXQocmVmKTsKLQkJCQkJCQkJCWludCBpZCA9IDA7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYoby5lSXNQcm94eSgpICYmIHVyaS5lcXVhbHMoby5lUHJveHlVUkkoKSkpIHsKLQkJCQkJCQkJCQkJaW5kZXggPSBpZDsKLQkJCQkJCQkJCQkJcmVmZXJlbmNlID0gcmVmOwotCQkJCQkJCQkJCQlicmVhayBmaW5kX3Byb3h5X2xvb3A7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWlkKys7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIG93bmVyLmVHZXQocmVmLCBmYWxzZSk7Ci0JCQkJCQkJCQlpZihvICE9IG51bGwgJiYgby5lSXNQcm94eSgpICYmIHVyaS5lcXVhbHMoby5lUHJveHlVUkkoKSkpIHsKLQkJCQkJCQkJCQlyZWZlcmVuY2UgPSByZWY7Ci0JCQkJCQkJCQkJYnJlYWsgZmluZF9wcm94eV9sb29wOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZmVyZW5jZUluZm8ob3duZXIsIHJlZmVyZW5jZSwgaW5kZXgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IjZ2V0UmVzb2x1dGlvbnMob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgSU1hcmtlclJlc29sdXRpb25bXSBnZXRSZXNvbHV0aW9ucyhJTWFya2VyIG1hcmtlcikgewotCQlSZWZlcmVuY2VJbmZvIHJlZkluZm8gPSBnZXRSZWZlcmVuY2VJbmZvKG1hcmtlcik7Ci0JCWlmKHJlZkluZm8gIT0gbnVsbCkgewotCQkJT2JqZWN0IHNlbGVjdGFibGVPd25lciA9IGdldFNlbGVjdGFibGVPYmplY3QocmVmSW5mby5vd25lcik7Ci0JCQlJTWFya2VyUmVzb2x1dGlvbiBtYXJrZXJSZXNvbHV0aW9uID0gbmV3IE1hcmtlclJlc29sdXRpb24obWFya2VyLCByZWZJbmZvKTsKLQkJCWlmKHNlbGVjdGFibGVPd25lciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBJTWFya2VyUmVzb2x1dGlvbltdIHsKLQkJCQkJCW1hcmtlclJlc29sdXRpb24sCi0JCQkJCQluZXcgU2hvd093bmVySW5MaWJyYXJ5VmlldyhzZWxlY3RhYmxlT3duZXIpCi0JCQkJfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBuZXcgSU1hcmtlclJlc29sdXRpb25bXSB7Ci0JCQkJCQltYXJrZXJSZXNvbHV0aW9uCi0JCQkJfTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRU1QVFlfUkVTT0xVVElPTlM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHNlbGVjdGFibGUgb2JqZWN0IAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEByZXR1cm4KLQkgKiAJCQlvYmplY3QgaXRzZWxmCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGFibGVPYmplY3QoRU9iamVjdCBvd25lcikgewotCQlpZihvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBvd25lciBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50IHx8IG93bmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgCi0JCQkJfHwgb3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQkJaWYob3duZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KChNZXRob2RFbGVtZW50KSBvd25lcik7Ci0JCQlpZihwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHByb2NDb21wOwotCQkJfQotCQl9Ci0JCWlmKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCXJldHVybiBvd25lcjsKLQkJfQotCQlpZihvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAmJiBvd25lci5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIG93bmVyLmVDb250YWluZXIoKTsgCi0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlpZihlICE9IG93bmVyKSB7Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0YWJsZU9iamVjdChlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvTWV0aG9kUmljaFRleHRNYXJrZXJIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTRlNDNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9NZXRob2RSaWNoVGV4dE1hcmtlckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uVmFsaWRhdGVBY3Rpb24uRWNsaXBzZVJlc291cmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIGJhc2VkIG9uIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5MaWJyYXJ5VmFsaWRhdGlvbk1hcmtlckhlbHBlciAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIGV4dGVuZHMgRWNsaXBzZVJlc291cmNlc1V0aWwgewkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyIElOU1RBTkNFID0gbmV3IE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFya2VyIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubWV0aG9kUmljaFRleHQiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gbWFya2VyIGF0dHJpYnV0ZQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNRVRIT0RfRklFTEROQU1FID0gIk1ldGhvZEZpZWxkTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHByaXZhdGUgY29uc3RydWN0b3IKLQlwcml2YXRlIE1ldGhvZFJpY2hUZXh0TWFya2VySGVscGVyKCkgewotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250YWluZXJNYXAgZXh0ZW5kcyBIYXNoTWFwPE9iamVjdCwgSW50ZWdlcj4gewotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgQ29udGFpbmVyTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRNYXAoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQkJaW5pdE1hcCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQljbGVhcigpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWluaXRNYXAoKTsKLQkJCQl9CQkJCQotCQkJfSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBpbml0TWFwKCkgewotCQkJY2xlYXIoKTsKLQkJCQotCQkJLy8gZmlsbCB0aGlzIHNldCB3aXRoIGNvbnRhaW5lcnMgb2YgbWFya2VkIG9iamVjdHMKLQkJCS8vCi0vLwkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotLy8JCQlpZihsaWIgIT0gbnVsbCkgewotLy8JCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLS8vCQkJCWlmKHByaiAhPSBudWxsKSB7Ci0vLwkJCQkJdHJ5IHsKLS8vCQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBwcmouZmluZE1hcmtlcnMoSU5TVEFOQ0UuZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0vLwkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpOwotLy8JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotLy8JCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJLy8gcmVtb3ZlIGl0cyBjb250YWluZXJzIGZyb20gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkJCS8vCi0vLwkJCQkJCQkJbWFya0NvbnRhaW5lcnMoZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGluY3JlbWVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlJbnRlZ2VyIGNvdW50OwotCQkJaWYgKGNvbnRhaW5zS2V5KG9iamVjdCkpIHsKLQkJCQljb3VudCA9IGdldChvYmplY3QpOwotCQkJfSBlbHNlIHsKLQkJCQljb3VudCA9IG5ldyBJbnRlZ2VyKDApOwotCQkJfQotCQkJY291bnQrKzsKLQkJCXB1dChvYmplY3QsIGNvdW50KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBkZWNyZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGNvbnRhaW5zS2V5KG9iamVjdCkpIHsKLQkJCQlJbnRlZ2VyIGNvdW50ID0gZ2V0KG9iamVjdCk7Ci0JCQkJaWYgKGNvdW50ID09IDEpIHsKLQkJCQkJLy8gcmVtb3ZlIG9iamVjdAotCQkJCQlyZW1vdmUob2JqZWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQljb3VudC0tOwotCQkJCQlwdXQob2JqZWN0LCBjb3VudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgbWFya0NvbnRhaW5lcnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlmb3IoRU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGw7IGNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCkpIHsKLQkJCQlpbmNyZW1lbnQoY29udGFpbmVyKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1bm1hcmtDb250YWluZXJzKE1ldGhvZEVsZW1lbnQgZSkgewotCQkJZm9yKEVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7IGNvbnRhaW5lciAhPSBudWxsOyBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpKSB7Ci0JCQkJZGVjcmVtZW50KGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyTWFwIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMgPSBuZXcgQ29udGFpbmVyTWFwKCk7CQotCQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFya2VySUQoKSB7Ci0JCXJldHVybiBNQVJLRVJfSUQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuTWFya2VySGVscGVyI2dldEZpbGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpbGUgZ2V0RmlsZShVUkkgdXJpKSB7Ci0JCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIChJRmlsZSkgRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbih1cmkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlKHVyaSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJTWFya2VySGVscGVyI2FkanVzdE1hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyLCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGp1c3RNYXJrZXIoSU1hcmtlciBtYXJrZXIsIERpYWdub3N0aWMgZGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHJldCA9IHN1cGVyLmFkanVzdE1hcmtlcihtYXJrZXIsIGRpYWdub3N0aWMpOwotCQlpZighZGlhZ25vc3RpYy5nZXREYXRhKCkuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3QgbyA9IGRpYWdub3N0aWMuZ2V0RGF0YSgpLmdldCgwKTsKLQkJCU9iamVjdCBzdHIgPSBkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoR1VJRCwgKChNZXRob2RFbGVtZW50KW8pLmdldEd1aWQoKSk7Ci0JCQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBUbmdVdGlsLmdldExhYmVsKG8pICsgIiwgIiArIHN0cik7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQltYXJrZXIuc2V0QXR0cmlidXRlKElERS5FRElUT1JfSURfQVRUUiwgIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChzdHIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKE1FVEhPRF9GSUVMRE5BTUUsIChTdHJpbmcpc3RyKTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ludmFsaWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCS8vIHRoaXMgaXMgYW4gVUkgb2JqZWN0OiBQcm9jZXNzZXMKLQkJCS8vCi0JCQlQcm9jZXNzZXNJdGVtUHJvdmlkZXIgaXAgPSAoUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlPYmplY3QgbzsKLQkJCXJldHVybiAoKG8gPSBpcC5nZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSkgIT0gbnVsbCAmJiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG8pKQotCQkJCXx8ICgobyA9IGlwLmdldERlbGl2ZXJ5UHJvY2Vzc1BhY2thZ2UoKSkgIT0gbnVsbCAmJiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG8pKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyCi0JCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEl0ZW1Qcm92aWRlcikgewotCQkJLy8gdGhpcyBpcyBhbiBVSSBvYmplY3QKLQkJCS8vCi0JCQlvYmplY3QgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpb2JqZWN0KS5nZXRUYXJnZXQoKTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSB7Ci0JCQkvLyB0aGlzIGlzIGFuIFVJIG9iamVjdDogZWl0aGVyIFRhc2tzLCBSb2xlcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcilvYmplY3QpLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy5jb250YWluc0tleShvYmopIHx8IElOU1RBTkNFLmhhc01hcmtlcnMob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjb250YWluZXJzT2ZNYXJrZWRPYmplY3RzLmNvbnRhaW5zS2V5KG9iamVjdCkgfHwgSU5TVEFOQ0UuaGFzTWFya2VycyhvYmplY3QpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLk1hcmtlckhlbHBlciNoYXNNYXJrZXJzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTWFya2VycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldEZpbGUob2JqZWN0KTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKQotCQkJewotCQkJCXRyeQotCQkJCXsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5nZXRHdWlkKCk7Ci0JCQkJCUlNYXJrZXJbXSBtYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoZ2V0TWFya2VySUQoKSwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCQlpZihndWlkLmVxdWFscyhtYXJrZXIuZ2V0QXR0cmlidXRlKEdVSUQpKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5oYXNNYXJrZXJzKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlZCB0byBoYW5kbGUgZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIGlmIHRoZSBvYmplY3QgYWxyZWFkeSBoYXMgYmVlbiB1bmxvYWRlZAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlNYXJrZXJIZWxwZXIjZ2V0RmlsZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKE9iamVjdCBkYXR1bSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmdldEZpbGUoZGF0dW0pOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZWxldGVNYXJrZXJzKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0RmlsZShvYmplY3QpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5Ci0JCQkJewotCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudClvYmplY3QpLmdldEd1aWQoKTsKLQkJCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJCWlmKGd1aWQuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoR1VJRCkpICYmIChmaWVsZE5hbWUgPT0gbnVsbCB8fAotCQkJCQkJCQlmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSkgewotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLS8vCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLS8vCQkJCQkJCWlmKGUgIT0gbnVsbCkgewotLy8JCQkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMudW5tYXJrQ29udGFpbmVycyhlKTsKLS8vCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotCQkJCXsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLmRlbGV0ZU1hcmtlcnMob2JqZWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiBpbmNsdWRlU3VidHlwZXMsIGludCBkZXB0aCkgewotLy8JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7CQkJCQotLy8JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLS8vCQkJCQlNZXRob2RFbGVtZW50IGUgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0vLwkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCS8vIHJlbW92ZSBpdHMgY29udGFpbmVycyBmcm9tIGNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMKLS8vCQkJCQkJLy8KLS8vCQkJCQkJY29udGFpbmVyc09mTWFya2VkT2JqZWN0cy51bm1hcmtDb250YWluZXJzKGUpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCi0vLwkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCi0vLwkJCX0JCQkKLS8vCQl9Ci0JCQkKLQkJc3VwZXIuZGVsZXRlTWFya2VycyhyZXNvdXJjZSwgaW5jbHVkZVN1YnR5cGVzLCBkZXB0aCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU1hcmtlcnMoSVJlc291cmNlIHJlc291cmNlLCBEaWFnbm9zdGljIGRpYWdub3N0aWMsIERpYWdub3N0aWMgcGFyZW50RGlhZ25vc3RpYykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5jcmVhdGVNYXJrZXJzKHJlc291cmNlLCBkaWFnbm9zdGljLCBwYXJlbnREaWFnbm9zdGljKTsKLS8vCQlTdHJpbmcgZmllbGROYW1lID0gbnVsbDsKLS8vCQlpZighZGlhZ25vc3RpYy5nZXREYXRhKCkuaXNFbXB0eSgpICYmIGRpYWdub3N0aWMuZ2V0RGF0YSgpLnNpemUoKSA+IDEpIHsKLS8vCQkJZmllbGROYW1lID0gKFN0cmluZylkaWFnbm9zdGljLmdldERhdGEoKS5nZXQoMSk7Ci0vLwkJfQotLy8JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIGZpZWxkTmFtZSAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7CQkJCQotLy8JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhnZXRNYXJrZXJJRCgpLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotLy8JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQkJSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotLy8JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHVUlEKTsKLS8vCQkJCQlpZihmaWVsZE5hbWUuZXF1YWxzKG1hcmtlci5nZXRBdHRyaWJ1dGUoTUVUSE9EX0ZJRUxETkFNRSkpKSB7Ci0vLwkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLS8vCQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkvLyBhZGQgaXRzIGNvbnRhaW5lcnMgdG8gY29udGFpbmVyc09mTWFya2VkT2JqZWN0cwotLy8JCQkJCQkJLy8KLS8vCQkJCQkJCWNvbnRhaW5lcnNPZk1hcmtlZE9iamVjdHMubWFya0NvbnRhaW5lcnMoZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwotLy8JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQotLy8JCQl9CQkJCi0vLwkJfQotCi0JfQotCQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcG9zZU1lc3NhZ2UoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBEaWFnbm9zdGljIHBhcmVudERpYWdub3N0aWMpCi0gICAgewotICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKTsKLSAgICAgIGlmIChwYXJlbnREaWFnbm9zdGljICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYXJlbnRNZXNzYWdlID0gcGFyZW50RGlhZ25vc3RpYy5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChwYXJlbnRNZXNzYWdlICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZSAhPSBudWxsID8gcGFyZW50TWVzc2FnZSArICIgIiArIG1lc3NhZ2UgOiBwYXJlbnRNZXNzYWdlOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmVmcmVzaEhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SZWZyZXNoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTIwYWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SZWZyZXNoSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLQotLyoqCi0gKiBOb3RpZnkgY2hhbmdlcyBpbiByZXNvdXJjZXMgdG8gcmVmcmVzaAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEhhbmRsZXIgaW1wbGVtZW50cyBJUmVmcmVzaEhhbmRsZXIgewotCQotCXByaXZhdGUgVmlld1BhcnQgdmlldzsKLQotCi0JcHVibGljIFJlZnJlc2hIYW5kbGVyKFZpZXdQYXJ0IHZpZXcpIHsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQl9Ci0JCi0JcHJpdmF0ZSBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCWlmKHZpZXcgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsKLQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcil2aWV3KS5nZXRWaWV3ZXIoKTsKLQkJCWlmKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWlmIChjdHJsLmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQlkb1JlZnJlc2godmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JCX0gZWxzZSB7Ci0JCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvUmVmcmVzaChudWxsKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2goU2hlbGwgc2hlbGwpIHsKLQkJZmluYWwgYm9vbGVhbiByZWZyZXNoVmlld3MgPSAhUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpLmlzRW1wdHkoKQotCQkJCXx8ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRSZW1vdmVkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q2hhbmdlZFJlc291cmNlcygpKTsKLQkJQXJyYXlMaXN0PElSZXNvdXJjZT4gYWRkZWRXc1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKSk7Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQl8fCAhYWRkZWRXc1Jlc291cmNlcy5pc0VtcHR5KCkgfHwgcmVmcmVzaFZpZXdzKSB7Ci0JCQlibG9ja2luZ1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywgY2hhbmdlZFJlc291cmNlcywKLQkJCQkJYWRkZWRXc1Jlc291cmNlcywgc2hlbGwpOwotCQl9Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCXJlbW92ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQljaGFuZ2VkUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAoIWFkZGVkV3NSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWFkZGVkV3NSZXNvdXJjZXMpOwotCQl9Ci0JCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKQotCQkJCQkuY2xlYXIoKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJsb2NraW5nUmVmcmVzaChmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBDb2xsZWN0aW9uPElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsCi0JCQlTaGVsbCBzaGVsbCkgewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJbW9uaXRvcgotCQkJCQkJLnN1YlRhc2soQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX1JlZnJlc2hWaWV3ZXJfbWVudV9pdGVtKTsKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl0cnkgewotCQkJCQkvLyBtb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZG9SZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCQkJYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQl0cnkgewotCQkJdmlldy5nZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkKLQkJCQkJLnJ1bkluVUkoCi0JCQkJCQkJY29udGV4dCwKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlTdHJpbmcgdGl0bGUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRWRpdG9yX3JlZnJlc2hFcnJvclRpdGxlOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkJZS50b1N0cmluZygpLCBlKTsKLQkJfQotCX0KLQotCQotCS8qKgotCSAqIE11c3QgYmUgc3luY2hyb25pemVkIHRvIGF2b2lkIHN0ZXBwaW5nIG9uIGVhY2ggb3RoZXIgaW4gcmVsb2FkaW5nCi0JICogcmVzb3VyY2VzL3JlZnJlc2hpbmcgVUkKLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcwotCSAqIEBwYXJhbSBjaGFuZ2VkUmVzb3VyY2VzCi0JICogQHBhcmFtIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIElSZXNvdXJjZSBvYmplY3RzIHRoYXQgYXJlIGp1c3QgbmV3bHkgYWRkZWQgdG8KLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIHJlZnJlc2hWaWV3cwotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgZG9SZWZyZXNoKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzLCBDb2xsZWN0aW9uPElSZXNvdXJjZT4gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpIHsKLQkJSGFzaFNldDxJRWRpdG9yUGFydD4gZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0PElFZGl0b3JQYXJ0PigpOwotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVSZW1vdmVkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMsIGVkaXRvcnNUb1JlZnJlc2gpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JCX0KLQkJaWYgKGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzICE9IG51bGwKLQkJCQkmJiAhYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG1nci5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLmxvYWROZXdSZXNvdXJjZXMoYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMpOwotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQpLmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZUFsbE1hcmtlcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPElFZGl0b3JQYXJ0PiBlZGl0b3JzVG9SZWZyZXNoKSB7Ci0JCXJldHVybiBoYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIG51bGwsIGVkaXRvcnNUb1JlZnJlc2gpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZW1vdmVkUmVzb3VyY2VzCi0JICogQHBhcmFtIGVkaXRvcnNUb1JlZnJlc2gKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiB1bmxvYWRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbjxJRWRpdG9yUGFydD4gZWRpdG9yc1RvUmVmcmVzaCkgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gdmlldy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlBcnJheUxpc3Q8SUVkaXRvclBhcnQ+IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclBhcnQ+KCk7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KHJlbW92ZWRSZXNvdXJjZXMpOwotCQlpZiAoZWRpdG9yc1RvUmVmcmVzaCA9PSBudWxsKSB7Ci0JCQllZGl0b3JzVG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJfQotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSAhPSBudWxsID8gaW5wdXQKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCkuZVJlc291cmNlKCkgOiBudWxsOwotCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IHJlbW92ZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCXJlc291cmNlID0gKFJlc291cmNlKSByZW1vdmVkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCQlicmVhayBjaGVja19yZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBzZWxlY3RlZCA9IHNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7IGkrKykgewotCQkJCWVkaXRvcnNUb1JlZnJlc2guYWRkKChJRWRpdG9yUGFydCkgc2VsZWN0ZWRbaV0pOwotCQkJfQotCQl9Ci0KLQkJLy8gVW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcy4KLQkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZW1vdmVkUmVzb3VyY2VzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVzZWRSZXNvdXJjZXMgPSAoKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGVkaXRvcikKLQkJCQkJCS5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdC5zaXplKCk7IGorKykgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVtb3ZlZFJlc291cmNlTGlzdC5nZXQoaik7Ci0JCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlbW92ZWRSZXNvdXJjZXM7Ci0JfQotCi0KLQkvKioKLQkgKiBSZWxvYWQgdGhlIGNoYW5nZWQgcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gZWRpdG9yc05vdFRvUmVmcmVzaAotCSAqIEBwYXJhbSBlZGl0b3JzVG9SZWZyZXNoCi0JICogQHJldHVybiBMaXN0IG9mIGNoYW5nZWQgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGVkaXRvcnNOb3RUb1JlZnJlc2gsIENvbGxlY3Rpb248SUVkaXRvclBhcnQ+IGVkaXRvcnNUb1JlZnJlc2gpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB2aWV3LmdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUGFydD4gZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oY2hhbmdlZFJlc291cmNlcyk7Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlpZihyZXN1bHQgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBlZGl0b3IgPSByZXN1bHRbaV07Ci0JCQkJCWlmICgoZWRpdG9yc05vdFRvUmVmcmVzaCA9PSBudWxsIHx8ICFlZGl0b3JzTm90VG9SZWZyZXNoCi0JCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpCi0JCQkJCQkJJiYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCB8fCAhZWRpdG9yc1RvUmVmcmVzaAotCQkJCQkJCQkJLmNvbnRhaW5zKGVkaXRvcikpKSB7Ci0JCQkJCQlkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QucmVtb3ZlKGVkaXRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYWxsIHJlc291cmNlcyB1c2VkIGJ5IGRpcnR5IGVkaXRvcnMgd2l0aCBjb25mbGljdCBmcm9tIHRoZQotCQkJLy8gY29sbGVjdGlvbiBvZiBjaGFuZ2VkIHJlc291cmNlcyBhZnRlciB1cGRhdGluZyBjYWNoZWQgbW9kaWZpY2F0aW9uIHN0YW1wCi0JCQkvLyBzbyB0aGV5IHdpbGwgbm90IGJlIHByb21wdGVkIHRvIHJlbG9hZCBhZ2FpbiB1bnRpbCB0aGUgbmV4dCBleHRlcm5hbCBjaGFuZ2UKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5zaXplKCk7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnRFZGl0b3IgZWRpdG9yID0gKE1ldGhvZEVsZW1lbnRFZGl0b3IpIGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdAotCQkJCQkJLmdldChpKTsJCQkJCi0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gdXNlZFJlc291cmNlcyA9IGVkaXRvci5nZXRVc2VkUmVzb3VyY2VzKCk7Ci0JCQkJdXNlZFJlc291cmNlcy5yZXRhaW5BbGwoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQkJZWRpdG9yLnVwZGF0ZVJlc291cmNlSW5mb3ModXNlZFJlc291cmNlcyk7Ci0JCQkJZWRpdG9yLm92ZXdyaXRlUmVzb3VyY2VzKHVzZWRSZXNvdXJjZXMpOwotCQkJCWNoYW5nZWRSZXNvdXJjZUxpc3QucmVtb3ZlQWxsKHVzZWRSZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjaGFuZ2VkUmVzb3VyY2VMaXN0LmlzRW1wdHkoKSkgewotCQkJLy8gUmVsb2FkIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIHJlc291cmNlcy4KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5yZWxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZUxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoCi0JCQlBcnJheUxpc3Q8SUVkaXRvclBhcnQ+IGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCkgewotCQlyZXR1cm4gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCwgdmlldy5nZXRTaXRlKCkuZ2V0U2hlbGwoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoTGlzdDw/PiBkaXJ0eUVkaXRvcnMsIFNoZWxsIHNoZWxsKSB7Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9GaWxlQ29uZmxpY3RfbGFiZWw7Ci0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5zZWxlY3RFZGl0b3JzVG9EaXNjYXJkQ29uZmxpY3RDaGFuZ2VzOwotCQlyZXR1cm4gc2VsZWN0RWRpdG9ycyhkaXJ0eUVkaXRvcnMsIHRpdGxlLCBtc2csIHNoZWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3RbXSBzZWxlY3RFZGl0b3JzKExpc3Q8Pz4gZWRpdG9ycywgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTaGVsbCBzaGVsbCkgewotCQkvLyBwcm9tcHQgdXNlciB0byBkaXNjYXJkIGNoYW5nZXMgaW4gZWRpdG9ycyB0aGF0IGNvbmZsaWN0IHdpdGggb3V0c2lkZQotCQkvLyBjaGFuZ2UKLQkJLy8KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJTGlzdDw/PiBmQ29udGVudHM7Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJaWYgKGZDb250ZW50cyAhPSBudWxsICYmIGZDb250ZW50cyA9PSBpbnB1dEVsZW1lbnQpCi0JCQkJCXJldHVybiBmQ29udGVudHMudG9BcnJheSgpOwotCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCQlpZiAobmV3SW5wdXQgaW5zdGFuY2VvZiBMaXN0KQotCQkJCQlmQ29udGVudHMgPSAoTGlzdDw/PikgbmV3SW5wdXQ7Ci0JCQkJZWxzZQotCQkJCQlmQ29udGVudHMgPSBudWxsOwotCi0JCQl9Ci0KLQkJfTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKElFZGl0b3JQYXJ0KSBlbGVtZW50KS5nZXRUaXRsZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQlyZXR1cm4gKChJRWRpdG9yUGFydCkgZWxlbWVudCkuZ2V0VGl0bGVJbWFnZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JCUxpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IExpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsCi0JCQkJZWRpdG9ycywgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCQlkbGcuc2V0VGl0bGUodGl0bGUpOwotCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRsZy5vcGVuKCk7Ci0JCXJldHVybiBkbGcuZ2V0UmVzdWx0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTMwMjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9SaWNoVGV4dEltYWdlTGlua0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5yaWNodGV4dC5JTWV0aG9kUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkltYWdlSHlwZXJsaW5rOwotCi0vKioKLSAqIFNpbXBsZSBjb250YWluZXIgY2xhc3MgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBmb3IgRm9ybVVJIGNvbnZlbmllbmNlIG1ldGhvZHMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VMaW5rQ29udGFpbmVyIHsKLQlwdWJsaWMgSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0OwotCXB1YmxpYyBJbWFnZUh5cGVybGluayBsaW5rOwotCXB1YmxpYyBMYWJlbCBsYWJlbDsKLQkKLQlwdWJsaWMgUmljaFRleHRJbWFnZUxpbmtDb250YWluZXIoSU1ldGhvZFJpY2hUZXh0IHJpY2hUZXh0LCBJbWFnZUh5cGVybGluayBsaW5rLCBMYWJlbCBsYWJlbCkgewotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQl9Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlQmVsb3coQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCWxpbmsubW92ZUJlbG93KGNvbnRyb2wpOwotCQl9Ci0JCWlmIChsYWJlbCAhPSBudWxsKSB7Ci0JCQlsYWJlbC5tb3ZlQmVsb3cobGluayk7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5tb3ZlQmVsb3cobGFiZWwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZHJhdygpIHsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJbGluay5yZWRyYXcoKTsKLQkJfQotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJbGFiZWwucmVkcmF3KCk7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmdldENvbnRyb2woKS5yZWRyYXcoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9VSUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjllYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5CcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1FZGl0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLkNvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNjcm9sbGVkRm9ybTsKLQotCi0vKioKLSAqIEhlbHBlciBVdGlsaXR5IGNsYXNzIGZvciBVSQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJSGVscGVyIHsKLQotCS8qKgotCSAqIFNldHRpbmcgaXRlbXMgaW4gYSB0YWJsZQotCSAqIAotCSAqIEBwYXJhbSB0YWJsZQotCSAqIEBwYXJhbSBpdGVtcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJdGVtcyhUYWJsZSB0YWJsZSwgQXJyYXlMaXN0IGl0ZW1zKSB7Ci0JCXRhYmxlLnJlbW92ZUFsbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCWl0ZW0uc2V0VGV4dCgoU3RyaW5nKSBpdGVtcy5nZXQoaSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGxpc3Qgb24gdGhlIGdpdmVuIGNvbXBvc2l0ZSB3aXRoIGdpdmVuIHN0eWxlCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZUxpc3QoRm9ybVRvb2xraXQgdG9vbGtpdCwgQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBzdHlsZSkgewotCQlMaXN0IGxpc3QgPSBuZXcgTGlzdChwYXJlbnQsIHN0eWxlIHwgU1dULk5VTEwpOwotCQl0b29sa2l0LmFkYXB0KGxpc3QsIHRydWUsIHRydWUpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB3aWxsIHJldHVybiBPYmplY3RbXSBvZiBndWlkYW5jZSBleGNsdWRpbmcgUHJhY3RpY2UuCi0JICogTWV0aG9kRWxlbWVudFV0aWwjZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoRU9iamVjdCkgY2FsY3VsYXRlcyBhbGwgZ3VpZGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRTZWxlY3RlZEd1aWRhbmNlcyhDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCkgewotCQlqYXZhLnV0aWwuTGlzdCBsaXN0ID0gTWV0aG9kRWxlbWVudFV0aWwKLQkJCQkuZ2V0U2VsZWN0ZWRHdWlkYW5jZXMoY29udGVudEVsZW1lbnQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKQotCQkJCWl0LnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rm9ybVBhZ2VUaXRsZVByZWZpeEZvcihNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnRMYWJlbCA9IExpYnJhcnlVSVRleHQuZ2V0VUlUZXh0KG1ldGhvZEVsZW1lbnQpOwotCQlpZiAobWV0aG9kRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX1dPUktfUFJPRFVDVCArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgaWYgKG1ldGhvZEVsZW1lbnQgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRSArICIgKCIgKyBlbGVtZW50TGFiZWwgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVsZW1lbnRMYWJlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGV4dCBmb3IgdGhlIGdpdmVuIGZvcm0gYmFzZWQgb24gdGhlIGdpdmVuIGVsZW1lbnQsIGluY2x1ZGluZyB2YXJpYWJsZSBpbmZvcm1hdGlvbiBvZiB0aGUgZWxlbWVudAotCSAqIGlmIHRoZXJlIGlzIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gZm9ybQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZvcm1UZXh0KFNjcm9sbGVkRm9ybSBmb3JtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGZvcm0gIT0gbnVsbCAmJiAhZm9ybS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHIuYXBwZW5kKGdldEZvcm1QYWdlVGl0bGVQcmVmaXhGb3IoZWxlbWVudCkpOwotCQkJc3RyLmFwcGVuZChBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0b3JfdGl0bGVfY29sb25fd2l0aF9zcGFjZXMpOwotCQkJCi0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJc3RyLmFwcGVuZChUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQsCi0JCQkJCQkiIiwgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQuZ2V0TmFtZSgpICE9IG51bGwpewotCQkJCXN0ci5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkJfQotCQkJZm9ybS5zZXRUZXh0KHN0ci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZ2l2ZW4gZGVsaXZlcmFibGVzIGxlYWRzIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gdG9CZVBhcnQKLQkgKiBAcGFyYW0gZGVsaXZlcmFibGUKLQkgKiBAcmV0dXJuCi0JICogCQkJQm9vbGVhbiB2YWx1ZSB0byBpbmRpY2F0ZSB3aGV0aGVyIGNpY3VsYXIgZGVwZW5kZW5jeSBpcyBkZXRlY3RlZAotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHtAbGluayBEZXBlbmRlbmN5Q2hlY2tlciNjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKERlbGl2ZXJhYmxlLCBEZWxpdmVyYWJsZSl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJEZWxpdmVyYWJsZXMoRGVsaXZlcmFibGUgdG9CZVBhcnQsCi0JCQlEZWxpdmVyYWJsZSBkZWxpdmVyYWJsZSkgewotCQlyZXR1cm4gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyh0b0JlUGFydCwgZGVsaXZlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgZGVsaXZlcmFibGUgcGFydHMgYXJlIGluIGNoYWluCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gcm9vdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaXZlcmFibGVQYXJ0c0NoYWluKERlbGl2ZXJhYmxlIGUsIGphdmEudXRpbC5MaXN0IHJvb3RzKSB7Ci0JCWphdmEudXRpbC5MaXN0IGxpc3QgPSBlLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJvb3RzLmFkZChvYmopOwotCQkJCQlkZWxpdmVyYWJsZVBhcnRzQ2hhaW4oKERlbGl2ZXJhYmxlKSBvYmosIHJvb3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXNvbHZlIGNvbnRlbnQgZWxlbWVudCBuYW1lIGNvbmZsaWN0cwotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlQ29udGVudEVsZW1lbnROYW1lQ29uZmxpY3QoRU9iamVjdCBjb250YWluZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVJlZmVyZW5jZQotCQkJcmVmZXJlbmNlKSB7Ci0KLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKGNvbnRhaW5lcgotCQkJCSwgcmVmZXJlbmNlLAotCQkJCShDb250ZW50RWxlbWVudCkgZWxlbWVudCwgbmV3IFZhbGlkYXRvckZhY3RvcnkuVHlwZUZpbHRlcihlbGVtZW50KSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZWxlbWVudC5nZXROYW1lKCkpOwotCQkKLQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsgCi0JCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dCwKLQkJCQkJU3RyVXRpbC50b0xvd2VyKGZlYXR1cmVUeHQpLCBlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZWxlbWVudC5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBkbGdNc2csIGN1cnJlbnRWYWx1ZSwKLQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRGlhZ3JhbSBlZGl0b3JzIG9mIG9iamVjdCBpdHNlbGYgd2lsbCBiZSBjbG9zZWQuIEFuZCBQYXJlbnQgZGlhZ3JhbSBlZGl0b3JzIAotCSAqIHdpbGwgYmUgcmVmcmVzaGVkLiAgCi0JICogIEBkZXByZWNhdGVkICAoc2VlOiAge0BsaW5rIERpYWdyYW1FZGl0b3JIZWxwZXJ9IC0gcmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKCkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hPcGVuRGlhZ3JhbUVkaXRvcnNPZlBhcmVudChPYmplY3QgcmVmcmVzaEVsZW1lbnQsIGphdmEudXRpbC5MaXN0IG9wZW5FZGl0b3JSZWZzKSB7Ci0JCW9wZW5FZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBOb3cgcmVmcmVzaCBvYmplY3QncyBwYXJlbnQncyBkaWFncmFtcy4KLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmIChiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJCQlyZWZyZXNoT3BlbkRpYWdyYW1FZGl0b3JzT2ZQYXJlbnQocGFyZW50LCBvcGVuRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhyZWZyZXNoRWxlbWVudCkpCi0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQllbHNlIGlmKHJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCU9iamVjdCBsb2NhbFJlZnJlc2hFbGVtZW50ID0gcmVmcmVzaEVsZW1lbnQ7Ci0JCQkJCQkJd2hpbGUoKGxvY2FsUmVmcmVzaEVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWxSZWZyZXNoRWxlbWVudCkuZ2V0T3duZXIoKSE9IG51bGwpewotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkuZXF1YWxzKGVsZW1lbnQpKXsKLQkJCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvY2FsUmVmcmVzaEVsZW1lbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWxvY2FsUmVmcmVzaEVsZW1lbnQpLmdldE93bmVyKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJQ29sbGVjdGlvbiBjID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJCWlmKGMgIT0gbnVsbCAmJiBjLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSl7Ci0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gb3BlbkVkaXRvclJlZnMuc2l6ZSgpOwotCQkvL0lFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChJRWRpdG9yUmVmZXJlbmNlKSBvcGVuRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yICl7Ci0JCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZWRpdG9yKS5yZWZyZXNoRGlhZ3JhbSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycyBpbmNsdWRpbmcgcGFyZW50IGVkaXRvcnMKLQkgKiBAcGFyYW0gY2xvc2VFbGVtZW50Ci0JICogQHBhcmFtIGNsb3NlRWRpdG9yUmVmcwotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlRGlhZ3JhbUVkaXRvcnNJbmNsdWRpbmdQYXJlbnQoT2JqZWN0IGNsb3NlRWxlbWVudCwgamF2YS51dGlsLkxpc3QgY2xvc2VFZGl0b3JSZWZzKSB7Ci0JCWNsb3NlRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0IGJpbnB1dCA9IChCcmVha2Rvd25FbGVtZW50RWRpdG9ySW5wdXQpaW5wdXQ7Ci0JCQkJCWlmIChiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0V3JhcHBlcigpOwotCQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQlPYmplY3QgcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQkJCQkJaWYocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlpZihlbGVtZW50LmVxdWFscyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCQkJY2xvc2VEaWFncmFtRWRpdG9yc0luY2x1ZGluZ1BhcmVudChwYXJlbnQsIGNsb3NlRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKQotCQkJCXsKLQkJCQkJCS8vY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkKLQkJCQkJCWlmKCgoQWN0aXZpdHkpZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhjbG9zZUVsZW1lbnQpKQotCQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCWVsc2UgaWYoY2xvc2VFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQkhPSBudWxsKQotCQkJCQkJCQlpZigoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWNsb3NlRWxlbWVudCkuZ2V0T3duZXIoKQotCQkJCQkJCQkJLmVxdWFscyhlbGVtZW50KSl7Ci0JCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2xvc2VFbGVtZW50KS5nZXRPd25lcigpCi0JCQkJCQkJCQlpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkJCQkJCQkJY2xvc2VFbGVtZW50KS5nZXRPd25lcigpKS5nZXRPd25lcigpLmVxdWFscyhlbGVtZW50KSkKLQkJCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX1lbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMoY2xvc2VFbGVtZW50KSl7Ci0JCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIEdldCBiYXNlIGFjdGl2aXR5IGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICogCQkJQmFzZSBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldEJhc2VBY3Rpdml0eShBY3Rpdml0eSBhY3Rpdml0eSl7Ci0JCXdoaWxlICghYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlUeXBlKCkuZXF1YWxzKAotCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0aXZpdHkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHZlOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCQotCS8qKgotCSAqIENsb3NlIGRpYWdyYW0gZWRpdG9ycwotCSAqIAotCSAqIEBwYXJhbSBjbG9zZUVsZW1lbnQKLQkgKiBAcGFyYW0gY2xvc2VFZGl0b3JSZWZzCi0JICogIEBkZXByZWNhdGVkIChzZWU6ICB7QGxpbmsgRGlhZ3JhbUVkaXRvckhlbHBlcn0pCi0JICogIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzKE9iamVjdCBjbG9zZUVsZW1lbnQsIGphdmEudXRpbC5MaXN0IGNsb3NlRWRpdG9yUmVmcykgewotCQljbG9zZUVkaXRvclJlZnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZiAoYmlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50ID0gYmlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQkJCQkJaWYoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkKLQkJCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcnMocGFyZW50LCBjbG9zZUVkaXRvclJlZnMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQgPSBiaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSAKLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSAoKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCWlmIChkaWFncmFtSW5wdXQgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpZiAoZWxlbWVudC5lcXVhbHMoY2xvc2VFbGVtZW50KSkgewotCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gY2hlY2sgd2hldGhlciBlbGVtZW50IGlzIGNoaWxkIG9mIGNsb3NlRWxlbWVudAotCQkJCQkJLy8gZGlyZWN0bHkvaW5kaXJlY3RseQotCQkJCQkJaWYgKGNsb3NlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCVByb2Nlc3NVdGlsLmdldENoaWxkRWxlbWVudHMoCi0JCQkJCQkJCQkoQWN0aXZpdHkpIGNsb3NlRWxlbWVudCwgQWN0aXZpdHkuY2xhc3MsCi0JCQkJCQkJCQljb2xsZWN0aW9uKTsKLQkJCQkJCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkJCQljbG9zZUVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWludCBzaXplID0gY2xvc2VFZGl0b3JSZWZzLnNpemUoKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXJlZmVyZW5jZXNbaV0gPSAoSUVkaXRvclJlZmVyZW5jZSkgY2xvc2VFZGl0b3JSZWZzLmdldChpKTsKLQkJfQotCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZlcmVuY2VzLCBmYWxzZSk7Ci0JCXJlZmVyZW5jZXMgPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBEaWFncmFtIGVkaXRvcnMgb2Ygb2JqZWN0IGl0c2VsZiB3aWxsIGJlIGNsb3NlZC4gQW5kIFBhcmVudCBkaWFncmFtIGVkaXRvcnMgCi0JICogd2lsbCBiZSByZWZyZXNoZWQuICBjb2RlIG5vdCB0ZXN0ZWQgdXNlIHJlZnJlc2hPcGVuRGlhZ3JhbUVkaXRvcnMgbWV0aG9kLgotCSAqIE5vdCB1c2VkIGN1cnJlbnRseQotCSAqIEBwYXJhbSBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0RpYWdyYW1FZGl0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJamF2YS51dGlsLkxpc3QgY2xvc2VFZGl0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlqYXZhLnV0aWwuTGlzdCByZWZyZXNoRWRpdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWRpdG9yRWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRFZGl0b3JJbnB1dCBiaW5wdXQgPSAoQnJlYWtkb3duRWxlbWVudEVkaXRvcklucHV0KWlucHV0OwotCQkJCQlpZihiaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpewotCQkJCQkJZWRpdG9yRWxlbWVudCA9IGJpbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCX1lbHNlewotCQkJCQkJZWRpdG9yRWxlbWVudCA9IGJpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZiAoZGlhZ3JhbUlucHV0ICE9IG51bGwpIHsKLQkJCQkJCWVkaXRvckVsZW1lbnQgPSBkaWFncmFtSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGVkaXRvckVsZW1lbnQgIT0gbnVsbCl7Ci0JCQkJCWlmKGVkaXRvckVsZW1lbnQuZXF1YWxzKG9iamVjdCkpewotCQkJCQkJY2xvc2VFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWlmKGVkaXRvckVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQkJaWYoKChBY3Rpdml0eSllZGl0b3JFbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNvbnRhaW5zKG9iamVjdCkpCi0JCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCQlPYmplY3QgbG9jYWwgPSBvYmplY3Q7Ci0JCQkJCQkJCXdoaWxlKChsb2NhbCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCkhPSBudWxsKXsKLQkJCQkJCQkJCWlmKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCkKLQkJCQkJCQkJCQkJLmVxdWFscyhlZGl0b3JFbGVtZW50KSl7Ci0JCQkJCQkJCQkJcmVmcmVzaEVkaXRvcnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlsb2NhbCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpbG9jYWwpLmdldE93bmVyKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZSBpZihlZGl0b3JFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCUNvbGxlY3Rpb24gYyA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZWRpdG9yRWxlbWVudCkuZ2V0Q2hpbGRyZW4oZWRpdG9yRWxlbWVudCk7Ci0JCQkJCQkJaWYoYyAhPSBudWxsICYmIGMuY29udGFpbnMob2JqZWN0KSl7Ci0JCQkJCQkJCXJlZnJlc2hFZGl0b3JzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBDbG9zZSBlZGl0b3IgcmVmZXJlbmNlcyBhbmQgcmVmcmVzaCBlZGl0b3JzLgotCQlpbnQgc2l6ZSA9IGNsb3NlRWRpdG9ycy5zaXplKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VzW2ldID0gKElFZGl0b3JSZWZlcmVuY2UpIGNsb3NlRWRpdG9ycy5nZXQoaSk7Ci0JCX0KLQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMocmVmZXJlbmNlcywgZmFsc2UpOwotCQlyZWZlcmVuY2VzID0gbnVsbDsKLQkJCi0JCXNpemUgPSByZWZyZXNoRWRpdG9ycy5zaXplKCk7Ci0JCS8vSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElFZGl0b3JSZWZlcmVuY2UpIHJlZnJlc2hFZGl0b3JzLmdldChpKTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IgKXsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3IpLnJlZnJlc2hEaWFncmFtKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93UHJvYmxlbXNWaWV3KCkgewotIAkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIKLQkJLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgIT0gbnVsbCAmJgotCQkJCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpICE9IG51bGwpIHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlWaWV3UGFydCB2aWV3ID0gcGFnZS5maW5kVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQkJCQkJaWYgKHZpZXcgPT0gbnVsbCkgewotCQkJCQkJCXBhZ2Uuc2hvd1ZpZXcoSVBhZ2VMYXlvdXQuSURfUFJPQkxFTV9WSUVXLCBudWxsLCBJV29ya2JlbmNoUGFnZS5WSUVXX1ZJU0lCTEUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY291bGRuJ3Qgb3BlbiB0aGUKLQkJCQkJLy8gcHJvYmxlbSB2aWV3LCB0b28KLQkJCQkJLy8gYmFkLi4KLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL1VJTGF5b3V0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlMYXlvdXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmZTBjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3V0aWwvVUlMYXlvdXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ1RhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuRm9ybUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLQotCi0vKioKLSAqIExheW91dCBIZWxwZXIgZm9yIFVJLiAKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJTGF5b3V0SGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBvc2l0ZSBlZGl0b3JDb21wb3NpdGUsIHByZXZpZXdDb21wb3NpdGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZSB0YWJzIGluIGZvcm0gCi0JICogQHBhcmFtIGZvcm0KLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVUYWJzKFNjcm9sbGVkRm9ybSBmb3JtLCBGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCS8vIGNyZWF0ZSB0YWJmb2xkZXIKLQkJdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIoZm9ybS5nZXRCb2R5KCksIFNXVC5GTEFUIHwgU1dULlRPUCk7Ci0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKHRkKTsKLQotCQkvLyBzZXQgdGFiZm9sZGVyIGJhY2tncm91bmQgY29sb3IKLQkJQ29sb3Igc2VsZWN0ZWRDb2xvciA9IHRvb2xraXQuZ2V0Q29sb3JzKCkKLQkJCQkuZ2V0Q29sb3IoRm9ybUNvbG9ycy5TRVBBUkFUT1IpOwotCQl0YWJGb2xkZXIuc2V0U2VsZWN0aW9uQmFja2dyb3VuZChuZXcgQ29sb3JbXSB7IHNlbGVjdGVkQ29sb3IsCi0JCQkJdG9vbGtpdC5nZXRDb2xvcnMoKS5nZXRCYWNrZ3JvdW5kKCkgfSwgbmV3IGludFtdIHsgNTAgfSk7Ci0KLQkJLy8gY3JlYXRlIGVkaXRvciB0YWIgaXRlbSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9zaXRlCi0JCUNUYWJJdGVtIGVkaXRvckl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCWVkaXRvckl0ZW0uc2V0VGV4dChBdXRob3JpbmdVSVRleHQuRURJVE9SX1RFWFQpOwotCQllZGl0b3JDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCk7Ci0JCWVkaXRvckl0ZW0uc2V0Q29udHJvbChlZGl0b3JDb21wb3NpdGUpOwotCi0JCS8vIGNyZWF0ZSBwcmV2aWV3IHRhYiBpdGVtIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb21wb3NpdGUKLQkJQ1RhYkl0ZW0gcHJldmlld0l0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCXByZXZpZXdJdGVtLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlBSRVZJRVdfUEFHRV9USVRMRSk7Ci0JCXByZXZpZXdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUodG9vbGtpdCk7Ci0JCXByZXZpZXdJdGVtLnNldENvbnRyb2wocHJldmlld0NvbXBvc2l0ZSk7Ci0KLQkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFiRm9sZGVyKTsKLQotCQl0b29sa2l0LmFkYXB0KHRhYkZvbGRlciwgdHJ1ZSwgdHJ1ZSk7Ci0KLQkJdGFiRm9sZGVyLnNldFNlbGVjdGlvbigwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgY29tcG9zaXRlIG9uIHRoZSBmb3JtCi0JICogCi0JICogQHBhcmFtIHRvb2xraXQKLQkgKiBAcmV0dXJuCi0JICogCQkJVUkgY29tcG9zaXRlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShGb3JtVG9vbGtpdCB0b29sa2l0KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZSh0YWJGb2xkZXIpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBUYWJsZVdyYXBMYXlvdXQoKSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gZWRpdG9yIGNvbXBvc2l0ZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKiAJCVVJIENvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGdldEVkaXRvckNvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGVkaXRvckNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcHJldmlldyBjb21wb3NpdGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogCQlQcmV2aWV3IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGdldFByZXZpZXdDb21wb3NpdGUoKSB7Ci0JCXJldHVybiBwcmV2aWV3Q29tcG9zaXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NDU2NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIHRoZSBBdXRob3JpbmcgVUkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9BYnN0cmFjdEJhc2VWaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0QmFzZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkNWJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0QmFzZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5JQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBNZXRob2QgTGlicmFyeSB2aWV3cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzZVZpZXcgZXh0ZW5kcyBTYXZlYWJsZUxpYnJhcnlWaWV3UGFydAotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIsIElTZWxlY3Rpb25Qcm92aWRlciwKLQkJSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIsIElNZW51TGlzdGVuZXIsIElWaWV3ZXJQcm92aWRlciwgSUdvdG9NYXJrZXIgewotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JcHJvdGVjdGVkIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHJvdGVjdGVkIFVJQWN0aW9uRGlzcGF0Y2hlciBhY3Rpb25EaXNwYXRjaGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotCi0JcHJvdGVjdGVkIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgPT0gQWJzdHJhY3RCYXNlVmlldy50aGlzKSB7Ci0JCQkJaGFuZGxlQWN0aXZhdGUocGFydCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0JfTsKLQkJCi0JLyoqCi0JICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiBvZiB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWN0aXZhdGUoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBTZXQgdGhlIHJpZ2h0IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGVkaXRpbmcgZG9tYWluLgotCQllZGl0aW5nRG9tYWluLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQotCQkvLyBSZWNvbXB1dGUgdGhlIHJlYWQgb25seSBzdGF0ZS4KLQkJaWYgKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VUb1JlYWRPbmx5TWFwKCkgIT0gbnVsbCkgewotCQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVRvUmVhZE9ubHlNYXAoKS5jbGVhcigpOwotCi0JCQkvLyBSZWZyZXNoIGFueSBhY3Rpb25zIHRoYXQgbWF5IGJlY29tZSBlbmFibGVkIG9yIGRpc2FibGVkLgotCQkJc2V0U2VsZWN0aW9uKGdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCS8vIHRoaXMgd2luZG93IGxpc3RlbmVyIGlzIGZvciBvcGVuaW5nIHRoZSBsaWJyYXJ5IHdoZW4gdGhlIAotCS8vIHZpZXcgZmlyc3QgYmVjb21lcyB2aXNpYmxlCi0JcHJpdmF0ZSBJV2luZG93TGlzdGVuZXIgd2luZG93TGlzdGVuZXIgPSBuZXcgSVdpbmRvd0xpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aW5kb3dEZWFjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQl3aW5kb3cuZ2V0V29ya2JlbmNoKCkucmVtb3ZlV2luZG93TGlzdGVuZXIodGhpcyk7Ci0JCQlib29sZWFuIGlzVmlzaWJsZSA9IGdldFNpdGUoKS5nZXRQYWdlKCkuaXNQYXJ0VmlzaWJsZShBYnN0cmFjdEJhc2VWaWV3LnRoaXMpOwotCQkJaWYgKGlzVmlzaWJsZSkgewotCQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zdGFydHVwT3BlbkxpYnJhcnkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZE1ldGhvZFZpZXdQYXJ0TGlzdGVuZXIoZ2V0Vmlld0lkKCkpOwotCQkJfQotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgY29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIERpc3BsYXlzIGEgZGlhbG9nIHRoYXQgYXNrcyBpZiBjb25mbGljdGluZyBjaGFuZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlRGlydHlDb25mbGljdCgpIHsKLQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuX1VJX0ZpbGVDb25mbGljdF9sYWJlbDsgCi0JCVN0cmluZyBtc2cgPSBBdXRob3JpbmdVSVJlc291cmNlcy5fV0FSTl9GaWxlQ29uZmxpY3Q7IAotCQlyZXR1cm4gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJdGl0bGUsIG1zZyk7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlcyBjaGFuZ2VkIHJlc291cmNlcyB3aGVuIHRoaXMgdmlldyBpcyBhY3RpdmF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZFJlc291cmNlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0KCk7Ci0KLQkJYWN0aW9uRGlzcGF0Y2hlciA9IG5ldyBVSUFjdGlvbkRpc3BhdGNoZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSB2aWV3ZXIuCi0JCWNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYWN0aW9uIGJhciBjb250cmlidXRvci4KLQkJdHJ5IHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yID0gY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmluaXQoZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCksIGdldFNpdGUoKQotCQkJCQkuZ2V0UGFnZSgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCS8vIEFkZCBhIHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSB2aWV3ZXIuCi0JCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID09IG51bGwpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgc2VsZWN0aW9uQ2hhbmdlZEV2ZW50KSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb24oc2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBBZGQgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIuCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIodGhpcyk7Ci0KLQkJT2JqZWN0IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCXNldElucHV0Rm9yVmlld2VyKGxpYnJhcnkpOwotCQkJTGlicmFyeVVJVXRpbC51cGRhdGVTaGVsbFRpdGxlKCk7Ci0JCX0KLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggIT0gbnVsbCkgewotCQkJd29ya2JlbmNoLmFkZFdpbmRvd0xpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCWVkaXRpbmdEb21haW4gPSBtYW5hZ2VyLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQotCQlJVmlld1NpdGUgc2l0ZSA9IChJVmlld1NpdGUpIHRoaXMuZ2V0U2l0ZSgpOwotCQlzaXRlLnNldFNlbGVjdGlvblByb3ZpZGVyKHRoaXMpOwotCQlzaXRlLmdldFBhZ2UoKS5hZGRQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVzIGEgY29udGV4dCBtZW51IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRleHRNZW51Rm9yKGZpbmFsIFN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyKSB7Ci0JCU1lbnVNYW5hZ2VyIGNvbnRleHRNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCIjUG9wVXAiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbnRleHRNZW51LnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJY29udGV4dE1lbnUuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQlNZW51IG1lbnUgPSBjb250ZXh0TWVudS5jcmVhdGVDb250ZXh0TWVudSh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KG1lbnUpOwotCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShjb250ZXh0TWVudSwgdmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJdHJ5IHsKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcodGhpcyk7Ci0JCQlhY3Rpb25CYXJDb250cmlidXRvci5tZW51QWJvdXRUb1Nob3cobWVudU1hbmFnZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlciNnZXRFZGl0aW5nRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJYWN0aW9uRGlzcGF0Y2hlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWFjdGlvbkRpc3BhdGNoZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNnZXRBZGFwdGVyKENsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGtleSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2dldFNlbGVjdGlvbigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gYWN0aW9uRGlzcGF0Y2hlci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNldFNlbGVjdGlvbih0aGlzLCBzZWxlY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNvdXJjZSwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYWN0aW9uRGlzcGF0Y2hlci5zZXRTZWxlY3Rpb24oc291cmNlLCBzZWxlY3Rpb24pOwotCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oc291cmNlLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldElucHV0Rm9yVmlld2VyKG51bGwpOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlzZXRJbnB1dEZvclZpZXdlcihsaWJyYXJ5KTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyhBYnN0cmFjdEJhc2VWaWV3LnRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKAotCQkvLyByZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLnJlbW92ZVBhcnRMaXN0ZW5lcihwYXJ0TGlzdGVuZXIpOwotCi0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmIChhY3Rpb25CYXJDb250cmlidXRvci5nZXRBY3RpdmVWaWV3KCkgPT0gdGhpcykgewotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlVmlldyhudWxsKTsKLQkJfQotCi0JCWlmIChwcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlJV29ya2JlbmNoIHdvcmtiZW5jaCA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQl3b3JrYmVuY2gucmVtb3ZlV2luZG93TGlzdGVuZXIod2luZG93TGlzdGVuZXIpOwotCQl9Ci0KLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhY2Nlc3NlcyBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9wZXJ0eSBzaGVldC4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5U2hlZXRQYWdlIGdldFByb3BlcnR5U2hlZXRQYWdlKCkgewotCQlpZiAocHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCkgewotCQkJcHJvcGVydHlTaGVldFBhZ2UgPSBuZXcgUHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCQkJcHVibGljIHZvaWQgbWFrZUNvbnRyaWJ1dGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLAotCQkJCQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLAotCQkJCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCQkJCXN1cGVyLm1ha2VDb250cmlidXRpb25zKG1lbnVNYW5hZ2VyLCB0b29sQmFyTWFuYWdlciwKLQkJCQkJCQlzdGF0dXNMaW5lTWFuYWdlcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgc2V0QWN0aW9uQmFycyhJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCQkJCXN1cGVyLnNldEFjdGlvbkJhcnMoYWN0aW9uQmFycyk7Ci0JCQkJCWlmIChhY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpb25CYXJDb250cmlidXRvci5zaGFyZUdsb2JhbEFjdGlvbnModGhpcywKLQkJCQkJCQkJYWN0aW9uQmFycyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcHJvcGVydHlTaGVldFBhZ2UKLQkJCQkJLnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQkJCWFkYXB0ZXJGYWN0b3J5KSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5U2hlZXRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuaWRlLklHb3RvTWFya2VyI2dvdG9NYXJrZXIoSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobWFya2VyLmdldFR5cGUoKS5lcXVhbHMoRVZhbGlkYXRvci5NQVJLRVIpKSB7Ci0JCQkJU3RyaW5nIHVyaUF0dHJpYnV0ZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoCi0JCQkJCQlFVmFsaWRhdG9yLlVSSV9BVFRSSUJVVEUsIG51bGwpOwotCQkJCWlmICh1cmlBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSh1cmlBdHRyaWJ1dGUpOwotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkKLQkJCQkJCQkuZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQkJCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlzZXRTZWxlY3Rpb25Ub1ZpZXdlcihDb2xsZWN0aW9ucwotCQkJCQkJCQkuc2luZ2xldG9uKGVkaXRpbmdEb21haW4uZ2V0V3JhcHBlcihlT2JqZWN0KSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgc2V0cyB0aGUgc2VsZWN0aW9uIGludG8gd2hpY2hldmVyIHZpZXdlciBpcyBhY3RpdmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWZpbmFsIENvbGxlY3Rpb24gdGhlU2VsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJaWYgKHRoZVNlbGVjdGlvbiAhPSBudWxsICYmICF0aGVTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFRyeSB0byBzZWxlY3QgdGhlIGl0ZW1zIGluIHRoZSBjdXJyZW50IGNvbnRlbnQgdmlld2VyIG9mCi0JCQkJCS8vIHRoZSBlZGl0b3IuCi0JCQkJCVZpZXdlciB2aWV3ZXIgPSBnZXRWaWV3ZXIoKTsKLQkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJCQl0aGVTZWxlY3Rpb24udG9BcnJheSgpKSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0Q29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJaWYoY29udGVudFByb3ZpZGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkvLyBQcm9jZXNzIHRoZSBjb250cmlidXRvcnMuCi0JCQkvLwotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJImNvbnRlbnRQcm92aWRlckZhY3RvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCU9iamVjdCBleHQgPSBudWxsOwotCQkJCWV4dF93YWxrOgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIHZpZXdJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2aWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoZ2V0Vmlld0lkKCkuZXF1YWxzKHZpZXdJZCkpIHsKLQkJCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpCi0JCQkJCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQkJaWYgKGV4dCBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXJGYWN0b3J5KSB7Ci0JCQkJCQkJCQkJY29udGVudFByb3ZpZGVyRmFjdG9yeSA9IChJQ29udGVudFByb3ZpZGVyRmFjdG9yeSkgZXh0OwotCQkJCQkJCQkJCWJyZWFrIGV4dF93YWxrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGNvbnRlbnRQcm92aWRlckZhY3Rvcnk7CQkKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGEgbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldENvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsJCQotCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjcCA9IG51bGw7Ci0JCWlmKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJSUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBmYWN0b3J5LmNyZWF0ZVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCB0aGlzKTsKLQkJCWlmKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKSB7Ci0JCQkJY3AgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3AgIT0gbnVsbCA/IGNwIDogbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVmlld2VyIGdldFZpZXdlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmlld2VyIGluIHRoZSBnaXZlbiBwYXJlbnQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQHJldHVybiBhIG5ldyBhY3Rpb25CYXJDb250cmlidXRlcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIGNyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnB1dCBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBtb2RlbCBuZXcgaW5wdXQgZm9yIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJbnB1dEZvclZpZXdlcihPYmplY3QgbW9kZWwpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRWaWV3SWQoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RMb2NrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQWJzdHJhY3RMb2NrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2MDA0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0Fic3RyYWN0TG9ja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TG9ja2VyIHsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0xvY2tlZChPYmplY3Qgc2VsZWN0aW9uKTsgCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MzM3MDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLklkZW50aXR5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvcHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuZG5kLkxvY2FsVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuUGVyc3BlY3RpdmVMaXN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuQ29uZmlndXJhdGlvblZpZXdFZGl0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5JTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3Q29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmRuZC5MaWJyYXJ5Vmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuQ29uZmlndXJhdGlvbkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcm92aWRlcnMuSUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLkNsaXBib2FyZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5IVE1MVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3U2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgY29udGVudCBvZiB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLSAqIDxwPgotICogVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpcyBzZXQgdmlhIHRoZSBDb25maWd1cmF0aW9uIGNvbWJvYm94IGluIHRoZSBzeXN0ZW0KLSAqIHRvb2xiYXIuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uVmlldyBleHRlbmRzIEFic3RyYWN0QmFzZVZpZXcgaW1wbGVtZW50cwotCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoZSB2aWV3IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfSUQgPSBDb25maWd1cmF0aW9uVmlldy5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFN0cmluZyBjb25maWdOYW1lOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIElEb3VibGVDbGlja0xpc3RlbmVyIGRvdWJsZUNsaWNrTGlzdGVuZXI7Ci0KLQlwcml2YXRlIElGaWx0ZXIgY29uZmlnRmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXcoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I2luaXQoSVZpZXdTaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSk7Ci0JCWNyZWF0ZUFjdGlvbnMoc2l0ZSk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LAotCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkNPTkZJR1VSQVRJT05fVklFV19DT05URVhUKTsKLQotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCQkvLyBPcGVuIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCXNldENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDcmVhdGVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc2V0SW5wdXRGb3JWaWV3ZXIobnVsbCk7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIHsKLQkJCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVNldChNZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXNldE1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCk7Ci0JCS8vIEFkZCBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyLgotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyI2xpYnJhcnlDaGFuZ2VkKGludCwKLQkgKiAgICAgIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLQkJc3dpdGNoIChvcHRpb24pIHsKLQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVEOgotCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCWlmICgoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCWdldEN1cnJlbnRDb25maWcoKSkpIHsKLQkJCQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJLy8gQnVnemlsbGEgZGVmZWN0IDE2NDczOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogICAgICAgICAgICAgICAgICAgICAgIAotCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeyAgCi0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsgICAgICAgICAgICAgICAKLQkJCQkJCWlmICgoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkJCQkJLmVxdWFscyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpICAgICAgICAgICAgICAgICAgCi0JCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpKSB7ICAgICAgICAgICAgICAKLQkJCQkJCQlzZXRDb250ZW50RGVzY3JpcHRpb24oKChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50KSAgIAotCQkJCQkJCQkJLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IHZpZXdlZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnTmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcodGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZGlzYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0JCWVsc2UKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmVuYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0KLQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbnRyb2xzLgotCQlDb21wb3NpdGUgY29udGVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQl0cmVlVmlld2VyID0gbmV3IFRyZWVWaWV3ZXIoY29udGVudCk7Ci0JCXRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gQWRkIGRyYWctYW5kLWRyb3Agc3VwcG9ydC4KLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7IEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpLAotCQkJCUxvY2FsVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9OwotCQl0cmVlVmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywKLQkJCQluZXcgTGlicmFyeVZpZXdlckRyYWdBZGFwdGVyKHRyZWVWaWV3ZXIpKTsKLQotCQkvLyBBZGQgYSBkb3VibGUgY2xpY2sgbGlzdGVuZXIuCi0JCWRvdWJsZUNsaWNrTGlzdGVuZXIgPSBuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuaGFuZGxlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JCXRyZWVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQotCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUFjdGlvbnMoSVZpZXdTaXRlIHZpZXdTaXRlKSB7Ci0JCUlBY3Rpb24gZWRpdEFjdGlvbiA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uTGFiZWxfZWRpdCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5lZGl0Q29uZmlndXJhdGlvbihjb25maWdOYW1lKTsKLQkJCX0KLQkJfTsKLQkJZWRpdEFjdGlvbgotCQkJCS5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5lZGl0Q29uZmlndXJhdGlvbl90b29sdGlwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXQoKSB7Ci0JCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsuCi0JCWNvbmZpZ05hbWUgPSBudWxsOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyRmFjdG9yeSkuZGlzcG9zZSgpOwotCQkJfQotCQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCWVkaXRpbmdEb21haW4uc2V0QWRhcHRlckZhY3RvcnkobnVsbCk7Ci0JCUlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCUlCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gZW1wdHlTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpOwotCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JfQotCQotCXByaXZhdGUgSUZpbHRlciBjcmVhdGVGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJSUNvbnRlbnRQcm92aWRlckZhY3RvcnkgY3BGYWN0b3J5ID0gZ2V0Q29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCQlJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCWlmKGNwRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmaWx0ZXIgPSBjcEZhY3RvcnkuY3JlYXRlRmlsdGVyKGNvbmZpZywgdHJlZVZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlciAhPSBudWxsID8gZmlsdGVyIDogbmV3IENvbmZpZ3VyYXRpb25WaWV3RmlsdGVyKGNvbmZpZywgdHJlZVZpZXdlcik7Ci0JfQotCQotCS8qKgotCSAqIFNldHMgdGhlIGdpdmVuIE1ldGhvZCBDb25maWd1cmF0aW9uIGFzIHRoaXMgdmlld2VyJ3MgaW5wdXQKLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlDb250cm9sIGN0cmwgPSB0aGlzLmdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSA9PSBjb25maWcpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB0aXRsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbmZpZ05hbWUgPSBjb25maWcuZ2V0TmFtZSgpOwotCQkJY29uZmlnRmlsdGVyID0gY3JlYXRlRmlsdGVyKGNvbmZpZyk7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JCQlBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7CQkJCi0JCQlpZihjb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRQcm92aWRlciA9IGNyZWF0ZUNvbnRlbnRQcm92aWRlcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udGVudFByb3ZpZGVyLnNldEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJCX0KLQkJCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IENvbmZpZ3VyYXRpb25MYWJlbFByb3ZpZGVyKGNvbmZpZywKLQkJCQkJYWRhcHRlckZhY3RvcnkpKTsKLQkJCXRpdGxlID0gY29uZmlnLmdldE5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsuCi0JCQljb25maWdOYW1lID0gbnVsbDsKLQkJCWlmIChhZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlckZhY3RvcnkpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCQkJZWRpdGluZ0RvbWFpbi5zZXRBZGFwdGVyRmFjdG9yeShudWxsKTsKLQkJCUlDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gdHJlZVZpZXdlci5nZXRDb250ZW50UHJvdmlkZXIoKTsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IHRyZWVWaWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJaWYgKGxhYmVsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBlbXB0eVNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0JCQlhY3Rpb25EaXNwYXRjaGVyLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0JCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5zZXRTZWxlY3Rpb24oZW1wdHlTZWxlY3Rpb24pOwotCQl9Ci0KLQkJdHJlZVZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQlzZXRDb250ZW50RGVzY3JpcHRpb24odGl0bGUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhpcyB2aWV3ZXIncyBpbnB1dCB0byB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSkgewotCQljb25maWdOYW1lID0gbmFtZTsKLQotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQljb25maWdOYW1lID0gY29uZmlnLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChjb25maWdOYW1lICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgY29uZmlnTmFtZSk7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlzZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5jb25maWdOYW1lID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChkb3VibGVDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIENvbmZpZ3VyYXRpb25WaWV3IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvblZpZXcgZ2V0VmlldygpIHsKLS8vCQl0cnkgewotLy8JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotLy8JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0vLwkJCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLS8vCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyhWSUVXX0lEKTsKLS8vCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLS8vCQkJCQl2aWV3ID0gYWN0aXZlUGFnZS5zaG93VmlldyhWSUVXX0lEKTsKLS8vCQkJCX0KLS8vCQkJCXJldHVybiAoQ29uZmlndXJhdGlvblZpZXcpIHZpZXc7Ci0vLwkJCX0KLS8vCi0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIG51bGw7Ci0JCQotCQlib29sZWFuIHNob3cgPSBWaWV3SGVscGVyLmlzVmlld0luQ3VycmVudFBlcnNwZWN0aXZlKFZJRVdfSUQpOwotCQlyZXR1cm4gKENvbmZpZ3VyYXRpb25WaWV3KVZpZXdIZWxwZXIuZmluZFZpZXcoVklFV19JRCwgc2hvdyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjZ2V0Vmlld2VyKCkKLQkgKi8KLQlwdWJsaWMgVmlld2VyIGdldFZpZXdlcigpIHsKLQkJcmV0dXJuIHRyZWVWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb25maWd1cmF0aW9uVmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJCUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciB7Ci0KLQkJcHJpdmF0ZSBMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uIGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb247Ci0KLQkJcHVibGljIENvbmZpZ3VyYXRpb25WaWV3QWN0aW9uQmFyQ29udHJpYnV0b3IoRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluKTsKLQkJCQotCQkJLy8gZG9uJ3Qgc2hvdyB2YWxpZGF0ZSBhY3Rpb24KLQkJCS8vCi0JCQl2YWxpZGF0ZUFjdGlvbiA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJCUlTaGFyZWRJbWFnZXMgc2hhcmVkSW1hZ2VzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQljb3B5QWN0aW9uID0gY3JlYXRlQ29weUFjdGlvbigpOwotCQkJY29weUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3Ioc2hhcmVkSW1hZ2VzCi0JCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9DT1BZKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5DT1BZLmdldElkKCksCi0JCQkJCWNvcHlBY3Rpb24pOwotCi0JCQl2aWV3QWN0aW9uQmFycyA9IGFjdGlvbkJhcnM7Ci0JCQljb25maWdWaWV3RWRpdEFjdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uVmlld0VkaXRBY3Rpb24oCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2VkaXQpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCQkib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLm9wZW5FbGVtZW50IiwgLy8kTk9OLU5MUy0xJAotCQkJCQljb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uID0gbmV3IExpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24oCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFjdGlvbkxhYmVsX2ZpbmRFbGVtZW50SW5MaWJOYXYpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCQlMaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLkFDVElPTl9JRCwKLQkJCQkJbGlicmFyeVZpZXdGaW5kRWxlbWVudEFjdGlvbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2FjdGl2YXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQkJYWN0aXZlVmlld1BhcnQuYWRkUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQkJOiBhY3RpdmVWaWV3UGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdWaWV3RWRpdEFjdGlvbik7Ci0JCQlzZWxlY3Rpb25Qcm92aWRlcgotCQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pOwotCQkJY29weUFjdGlvbi5zZXRFZGl0aW5nRG9tYWluKGVkaXRpbmdEb21haW4pOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGNvcHlBY3Rpb24pOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZGVhY3RpdmF0ZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQkJYWN0aXZlVmlld1BhcnQucmVtb3ZlUHJvcGVydHlMaXN0ZW5lcih0aGlzKTsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVNlbGVjdGlvblByb3ZpZGVyID8gKElTZWxlY3Rpb25Qcm92aWRlcikgYWN0aXZlVmlld1BhcnQKLQkJCQkJOiBhY3RpdmVWaWV3UGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoY29uZmlnVmlld0VkaXRBY3Rpb24pOwotCQkJc2VsZWN0aW9uUHJvdmlkZXIKLQkJCQkJLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uKTsKLQkJCWNvcHlBY3Rpb24uc2V0RWRpdGluZ0RvbWFpbihudWxsKTsKLQkJCXNlbGVjdGlvblByb3ZpZGVyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihjb3B5QWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciN1cGRhdGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyID0gYWN0aXZlVmlld1BhcnQgaW5zdGFuY2VvZiBJU2VsZWN0aW9uUHJvdmlkZXIgPyAoSVNlbGVjdGlvblByb3ZpZGVyKSBhY3RpdmVWaWV3UGFydAotCQkJCQk6IGFjdGl2ZVZpZXdQYXJ0LmdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiA/IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uCi0JCQkJCTogU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQlsaWJyYXJ5Vmlld0ZpbmRFbGVtZW50QWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoc3RydWN0dXJlZFNlbGVjdGlvbik7Ci0JCQljb3B5QWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzYWJsZUdsb2JhbEVkaXRNZW51KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc2FibGVHbG9iYWxFZGl0TWVudSgpIHsKLQkJCWNvbmZpZ1ZpZXdFZGl0QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2VuYWJsZUdsb2JhbEVkaXRNZW51KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQkJY29uZmlnVmlld0VkaXRBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIExpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQkJLy8gQWRkIG91ciBzdGFuZGFyZCBtYXJrZXJzLgotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoImVkaXQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gQWRkIG91ciBvdGhlciBzdGFuZGFyZCBtYXJrZXIuCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiYWRkaXRpb25zLWVuZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlhZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oY29uZmlnVmlld0VkaXRBY3Rpb24pKTsKLQkJCWlmIChQZXJzcGVjdGl2ZUxpc3RVdGlsLmlzQXV0aG9yaW5nUGVyc3BlY3RpdmUoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQkJCWxpYnJhcnlWaWV3RmluZEVsZW1lbnRBY3Rpb24pKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlQ29weUFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29weUFjdGlvbiBjcmVhdGVDb3B5QWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBMaWJyYXJ5Vmlld0NvcHlBY3Rpb24oKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlyZXR1cm4gbmV3IElkZW50aXR5Q29tbWFuZChzZWxlY3Rpb24pOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIGxpbmtzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJZGVudGl0eUNvbW1hbmQpIGNvbW1hbmQpCi0JCQkJCQkJLmdldFJlc3VsdCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGl0ZW0gPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXRlbTsKLQkJCQkJCQlTdHJpbmcgaHJlZiA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkJCQkuZ2V0VXJsKGUsIG51bGwsICJodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAobGlua3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWxpbmtzICs9IFN0clV0aWwuTElORV9GRUVEOwotCQkJCQkJCX0KLQkJCQkJCQlsaW5rcyArPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50TGluayhlLCB0cnVlLAotCQkJCQkJCQkJImZpbGU6Ly8iICsgaHJlZik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAobGlua3MubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlDbGlwYm9hcmRVdGlsLmNvcHlUZXh0SFRNTFRvQ2xpcGJvYXJkKGxpbmtzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihWaWV3ZXIgdmlld2VyKSB7Ci0JCQlyZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpCi0JICovCi0JcHVibGljIElMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IgY3JlYXRlQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblZpZXdBY3Rpb25CYXJDb250cmlidXRvcihlZGl0aW5nRG9tYWluKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRJbnB1dEZvclZpZXdlcihPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRGb3JWaWV3ZXIoT2JqZWN0IG1vZGVsKSB7Ci0JCWlmICgobW9kZWwgPT0gbnVsbCkgfHwgKG1vZGVsIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIG1vZGVsKTsKLQkJfSBlbHNlIHsKLQkJCXJlc2V0KCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJaWYoY29uZmlnRmlsdGVyIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIpIHsKLQkJCSgoQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIpY29uZmlnRmlsdGVyKS5yZWZyZXNoVmlld2VyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIFZJRVdfSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDNmNWM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdGaWx0ZXIgZXh0ZW5kcyBDb25maWd1cmF0aW9uRmlsdGVyIHsKLQotCXByb3RlY3RlZCBWaWV3ZXIgdmlld2VyOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld0ZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgVmlld2VyIHZpZXdlcikgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlZnJlc2hWaWV3ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoVmlld2VyKCkgewotCQl2aWV3ZXIucmVmcmVzaCgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjk4ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db25maWd1cmF0aW9uVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIHNlbGVjdGFibGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYQotICogdHJlZSB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25WaWV3ZXIgZXh0ZW5kcyBDaGVja2JveFRyZWVWaWV3ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgZ2l2ZW4gZWxlbWVudCBpbiB0aGUgdHJlZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZXhwYW5kVG9MZXZlbChlbGVtZW50LCAwKTsKLQkJV2lkZ2V0IGN0cmwgPSBzdXBlci5maW5kSXRlbShlbGVtZW50KTsKLQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl0ZW1zLmFkZChjdHJsKTsKLQkJCXN1cGVyLnNldFNlbGVjdGlvbihpdGVtcyk7Ci0JCQl0aGlzLmdldFRyZWUoKS5zZXRGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSBjb250ZW50IG9mIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBPYmplY3QgZWxlbWVudCwgZmluYWwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLQkJT2JqZWN0W10gY2hlY2tlZCA9IHRoaXMuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JCXN1cGVyLnJlZnJlc2goZWxlbWVudCwgdXBkYXRlTGFiZWxzKTsKLQkJdGhpcy5zZXRDaGVja2VkRWxlbWVudHMoY2hlY2tlZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbnRlbnRWaWV3LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0NvbnRlbnRWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODhhYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Db250ZW50Vmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5VSUFjdGlvbkRpc3BhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1JbWFnZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIFRoZSBDb250ZW50IHZpZXcuCi0gKiA8cD4KLSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IENvbnRlbnRWaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgRWxlbWVudEhUTUxWaWV3ZXIgY29udGVudFZpZXdlcjsKLQotCXByaXZhdGUgT2JqZWN0IGRpc3BsYXllZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIgcGFydExpc3RlbmVyID0gbmV3IElQYXJ0TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBDb250ZW50VmlldyAmJiBwYXJ0ID09IENvbnRlbnRWaWV3LnRoaXMpIHsKLQkJCQloYW5kbGVTZWxlY3Rpb24oVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuZ2V0U2VsZWN0aW9uU291cmNlKCksIFVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpCi0JCQkJICAgICAgICAuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0Q2xvc2VkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCX07Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWhhbmRsZVNlbGVjdGlvbihldmVudC5nZXRTb3VyY2UoKSwgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbGlicmFyeUNoYW5nZWQoaW50IG9wdGlvbiwgQ29sbGVjdGlvbiBjaGFuZ2VkSXRlbXMpIHsKLS8vCQkJaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQKLS8vCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCkgewotLy8JCQkJaWYgKGNvbnRlbnRWaWV3ZXIgIT0gbnVsbCkgewotLy8JCQkJCWNvbnRlbnRWaWV3ZXIuc2V0SHRtbEJ1aWxkZXIobmV3IEh0bWxCdWlsZGVyKCkpOwotLy8JCQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnJlZHJhdygpOwotLy8JCQkJfQotLy8JCQl9Ci0KLQkJCWlmIChjaGFuZ2VkSXRlbXMgIT0gbnVsbCAmJiBkaXNwbGF5ZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoY2hhbmdlZEl0ZW1zLmNvbnRhaW5zKGRpc3BsYXllZEVsZW1lbnQpKSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnNldFVybCgiYWJvdXQ6YmxhbmsiKTsgLy8kTk9OLU5MUy0xJAotCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQljbGVhbnVwKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJY2xlYW51cCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJY2xlYW51cCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0JCQlpZiAoY29udGVudFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJY29udGVudFZpZXdlci5zZXRIdG1sQnVpbGRlcihuZXcgSHRtbEJ1aWxkZXIoKSk7Ci0JCQkJY29udGVudFZpZXdlci5nZXRCcm93c2VyKCkucmVkcmF3KCk7Ci0JCQl9Ci0JCX0KLQl9OwotCQotCS8vIFBhZ2UgbmF2aWdhdGlvbiBhY3Rpb25zLgotCXByaXZhdGUgQWN0aW9uIGJhY2tBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBmb3J3YXJkQWN0aW9uOwotCi0JcHJpdmF0ZSBBY3Rpb24gc3RvcEFjdGlvbjsKLQotCXByaXZhdGUgQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLQlwcml2YXRlIEFjdGlvbiBwcmludEFjdGlvbjsKLQotCS8vIEEgaGlkZGVuIGNvbXBvc2l0ZSB0byBob2xkIHRoZSBkaWFncmFtIHZpZXdlciBmb3IgZGlhZ3JhbSBpbWFnZQotCS8vIGdlbmVyYXRpb24uCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGlhZ3JhbVZpZXdlckhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRWaWV3KCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJCWNvbnRlbnRWaWV3ZXIgPSBuZXcgRWxlbWVudEhUTUxWaWV3ZXIocGFyZW50KTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxLCAxKSk7IC8vIHNpemUKLQkJCS8vIGNhbid0IGJlCi0JCQkvLyAwLDAKLQkJCS8vIG90aGVyd2lzZQotCQkJLy8gdGhlCi0JCQkvLyBkaWFncmFtCi0JCQkvLyB3aWxsIG5vdAotCQkJLy8gYmUKLQkJCS8vIHBhaW50ZWQKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSBwYWdlIG5hdmlnYXRpb24gdG9vbCBidXR0b25zLgotCQkJY3JlYXRlQWN0aW9ucygpOwotCi0JCQkvLyBBZGQgYSBwYXJ0IGxpc3RlbmVyIHRvIG1vbml0b3IgcGFydCBhY3RpdmF0aW9uIGFuZCB1cGRhdGUgdGhpcwotCQkJLy8gdmlldwotCQkJLy8gYXMgYW5kIHdoZW4gbmVlZGVkLgotCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKAotCQkJCQlwYXJ0TGlzdGVuZXIpOwotCi0JCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcigKLQkJCQkJbmV3IElQZXJzcGVjdGl2ZUxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBlcnNwZWN0aXZlQ2hhbmdlZChJV29ya2JlbmNoUGFnZSBwYWdlLAotCQkJCQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGRlc2MsIFN0cmluZyBpZCkgewotCQkJCQkJCWlmIChkZXNjLmdldElkKCkuZXF1YWxzKAotCQkJCQkJCQkJQnJvd3NpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCkpIHsKLQkJCQkJCQkJaWYgKGlkCi0JCQkJCQkJCQkJLmVxdWFscyhJV29ya2JlbmNoUGFnZS5DSEFOR0VfRURJVE9SX0FSRUFfU0hPVykpIHsKLQkJCQkJCQkJCXBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUoZmFsc2UpOwotCQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJCQkJLmRpc3BsYXlXYXJuaW5nKAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLndhcm5pbmdEaWFsb2dfdGl0bGUsIAotCQkJCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmFkZEVkaXRvclRvUGVyc3BlY3RpdmVXYXJuaW5nX21zZyk7IAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQotCQkJLy8gQWRkIHNlbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdG8gdXBkYXRlIHRoaXMgdmlldyBhcyBhbmQgd2hlbgotCQkJLy8gbmVlZGVkLgotCQkJVUlBY3Rpb25EaXNwYXRjaGVyLmdldEluc3RhbmNlKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKAotCQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRMaXN0ZW5lcihsaWJyYXJ5Q2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETzogRGlzcGxheSBhbiBlcnJvciBkaWFsb2cuCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjc2V0Rm9jdXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJY29udGVudFZpZXdlci5zZXRGb2N1cygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQlnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0UGFydFNlcnZpY2UoKS5yZW1vdmVQYXJ0TGlzdGVuZXIoCi0JCQkJcGFydExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb25zIGZvciB0aGlzIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJYmFja0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnJvd3NlciBicm93c2VyID0gY29udGVudFZpZXdlci5nZXRCcm93c2VyKCk7Ci0JCQkJaWYgKGJyb3dzZXIgIT0gbnVsbCkgewotCQkJCQlicm93c2VyLmJhY2soKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWJhY2tBY3Rpb24uc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5iYWNrX3RleHQpOyAKLQkJYmFja0FjdGlvbi5zZXRUb29sVGlwVGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5iYWNrX3RleHQpOyAKLQkJYmFja0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQlJU2hhcmVkSW1hZ2VzLklNR19UT09MX0JBQ0spKTsKLQotCQlmb3J3YXJkQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCcm93c2VyIGJyb3dzZXIgPSBjb250ZW50Vmlld2VyLmdldEJyb3dzZXIoKTsKLQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCWJyb3dzZXIuZm9yd2FyZCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRfdGV4dCk7IAotCQlmb3J3YXJkQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLmZvcndhcmRfdGV4dCk7IAotCQlmb3J3YXJkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCUlTaGFyZWRJbWFnZXMuSU1HX1RPT0xfRk9SV0FSRCkpOwotCi0JCXN0b3BBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCWlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkJYnJvd3Nlci5zdG9wKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlzdG9wQWN0aW9uLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcF90ZXh0KTsgCi0JCXN0b3BBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3RvcF90ZXh0KTsgCi0JCXN0b3BBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJSW1hZ2VzLklNR19ERVNDX1NUT1ApOwotCi0JCXJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEJyb3dzZXIgYnJvd3NlciA9IGNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpOwotCQkJCS8vIGlmIChicm93c2VyICE9IG51bGwpIHsKLQkJCQkvLyBicm93c2VyLnJlZnJlc2goKTsKLQkJCQkvLyB9Ci0KLQkJCQkvLyBuZWVkIHRvIHJlZ2VuZXJhdGUgdGhlIGNvbnRlbnQKLQkJCQljb250ZW50Vmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQlyZWZyZXNoQWN0aW9uLnNldFRvb2xUaXBUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlZnJlc2hfdGV4dCk7IAotCQlyZWZyZXNoQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSUltYWdlcy5JTUdfREVTQ19SRUZSRVNIKTsKLQotCQlwcmludEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY29udGVudFZpZXdlci5wcmludCgpOwotCQkJfQotCQl9OwotCQlwcmludEFjdGlvbi5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByaW50X3RleHQpOyAKLQkJcHJpbnRBY3Rpb24uc2V0VG9vbFRpcFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJpbnRfdGV4dCk7IAotCQlwcmludEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlJbWFnZXMuSU1HX0RFU0NfUFJJTlQpOwotCi0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCW1hbmFnZXIuYWRkKGJhY2tBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChmb3J3YXJkQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQoc3RvcEFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChwcmludEFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWaWV3VmlzaWJsZSgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKQotCQkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyhnZXRWaWV3SWQoKSk7Ci0JCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZXMgdGhlIGdpdmVuIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgTGlicmFyeSBvciBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgVGhlIHNlbGVjdGlvbiBpbiB0aGUgTGlicmFyeSBvciBDb25maWd1cmF0aW9uIHZpZXcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uKE9iamVjdCBzb3VyY2UsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCB8fCAhaXNWaWV3VmlzaWJsZSgpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCi0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlPYmplY3RbXSBzZWxlY3RlZEVsZW1lbnRzID0gc2VsLnRvQXJyYXkoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdOwotCQkJCQotCQkJCS8vIGRvbid0IHVud3JhcCB0aGUgb2JqZWN0LiAKLQkJCQkvLyBGb3IgYWN0aXZpdHksIHdlIG5lZWQgdG8gd3JhcHBlZCBpdGVtIHByb3ZpZGVyIHRvIGdldCB0aGUgc3VwcHJlc3Mgc3RhdHVzLgotCQkJCS8vIE9iamVjdCBlbGVtZW50ID0gTGlicmFyeVV0aWwudW53cmFwKHNlbGVjdGVkRWxlbWVudCk7Ci0JCQkJaWYgKGRpc3BsYXllZEVsZW1lbnQgIT0gbnVsbCAmJiBkaXNwbGF5ZWRFbGVtZW50ID09IGVsZW1lbnQpIHsKLQkJCQkJZGlzcGxheWVkRWxlbWVudCA9IG51bGw7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKGRpc3BsYXlDb250ZW50UGFnZShzb3VyY2UsIGVsZW1lbnQpKSB7Ci0JCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCX0KLQkJCX1lbHNlewotCQkJCWNvbnRlbnRWaWV3ZXIuZ2V0QnJvd3NlcigpLnNldFVybCgiYWJvdXQ6YmxhbmsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpc3BsYXllZEVsZW1lbnQgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25maWdTb3VyY2UoT2JqZWN0IHNvdXJjZSkgewotCQlyZXR1cm4gKHNvdXJjZSAhPSBudWxsKSAmJiAoc291cmNlIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblZpZXcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWdyKCkgewotCQlyZXR1cm4gCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXRFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpZXdJZCgpIHsKLQkJcmV0dXJuIFZJRVdfSUQ7Ci0JfQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBjb250ZW50IHBhZ2UgZm9yIHRoZSBnaXZlbiBDb250ZW50RWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogICAgICAgICAgICBUaGUgTGlicmFyeSBvciBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSBzZWxlY3RlZCBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IHBhZ2UgaXMgZGlzcGxheWVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzcGxheUNvbnRlbnRQYWdlKE9iamVjdCBzb3VyY2UsIE9iamVjdCByYXdfZWxlbWVudCkgewotCQlPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChyYXdfZWxlbWVudCk7Ci0JCWVsZW1lbnQgPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBudWxsOwotCQlib29sZWFuIGlzQnJvd3NpbmcgPSBQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJYm9vbGVhbiBpc0NvbmZpZ1NvdXJjZSA9IGlzQ29uZmlnU291cmNlKHNvdXJjZSk7Ci0KLQkJLy8gaWYgaW4gYnJvd3NpbmcgYnV0IHRoZSBzb3VyY2UgaXMgbm90IGZyb20gY29uZmlncnVhdGlvbiB2aWV3Ci0JCS8vIGlnbm9yZSBpdAotCQlpZiAoaXNCcm93c2luZyAmJiAhaXNDb25maWdTb3VyY2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChpc0NvbmZpZ1NvdXJjZSkgewotCQkJLy8gR2V0IHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyIGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJbGF5b3V0TWdyID0gZ2V0TGF5b3V0TWdyKCk7Ci0JCQlpZiAoIGxheW91dE1nciA9PSBudWxsICkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gQWRkIHRoZSBhY3Rpdml0eSBkaWFncmFtIHNlcnZpY2UgdG8gZ2VuZXJhdGUgZGlhZ3JhbSBpbWFnZXMuCi0JCQkKLQkJCVN0cmluZyBuZXdEaWFncmFtcyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoIlBVQkxJU0hfTkVXX0RJQUdSQU0iKTsgLy8kTk9OLU5MUy0xJAotCQkJQm9vbGVhbiBuZXdEaWFncmFtID0gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCQlpZihuZXdEaWFncmFtcyAhPSBudWxsICYmIG5ld0RpYWdyYW1zLmxlbmd0aCgpID4gMCl7Ci0JCQkJbmV3RGlhZ3JhbSA9IG5ldyBCb29sZWFuKG5ld0RpYWdyYW1zKTsKLQkJCX0KLQkJCWlmKG5ld0RpYWdyYW0uYm9vbGVhblZhbHVlKCkpewotCQkJCURpYWdyYW1JbWFnZVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSAoRGlhZ3JhbUltYWdlU2VydmljZSkgbGF5b3V0TWdyCi0JCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCQkJaWYgKGRpYWdyYW1TZXJ2aWNlID09IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVNlcnZpY2UgPSBuZXcgRGlhZ3JhbUltYWdlU2VydmljZSgKLQkJCQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIsCi0JCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlLnNldENvbmZpZyhsYXlvdXRNZ3IuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJCX0KLS8vCQkJCSBGb3IgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gCi0JCQkJYm9vbGVhbiBvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChvcHRpb24pOwotCQkJCQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIAotCQkJCW9wdGlvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24ob3B0aW9uKTsKLQkJCX1lbHNlewotLy8JCQkJIEFkZCB0aGUgYWN0aXZpdHkgZGlhZ3JhbSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGRpYWdyYW0gaW1hZ2VzLgotCQkJCUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSAoQWN0aXZpdHlEaWFncmFtU2VydmljZSkgbGF5b3V0TWdyCi0JCQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQkJCWlmIChkaWFncmFtU2VydmljZSA9PSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1TZXJ2aWNlID0gbmV3IEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoCi0JCQkJCQkJZGlhZ3JhbVZpZXdlckhvbGRlciwKLQkJCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJCWxheW91dE1nci5zZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKGRpYWdyYW1TZXJ2aWNlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gRm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIAotCQkJCWJvb2xlYW4gb3B0aW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQob3B0aW9uKTsKLQkJCQkKLQkJCQkvLyBGb3IgQWN0aXZpdHkgRGlhZ3JhbSAKLQkJCQlvcHRpb24gPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKG9wdGlvbik7Ci0JCQl9Ci0JCQkKLQkJCQotCQkJCi0JCX0KLQotCQljb250ZW50Vmlld2VyLnNldExheW91dE1hbmFnZXIobGF5b3V0TWdyKTsKLQkJY29udGVudFZpZXdlci5zaG93RWxlbWVudENvbnRlbnQocmF3X2VsZW1lbnQpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBNZXRob2QgZWxlbWVudC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBIVE1MIGNvbnRlbnQgcGFnZSBpcyBkaXNwbGF5ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5SFRNTENvbnRlbnRQYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCWVsZW1lbnQgPSBWaWV3SGVscGVyLmhhbmRsZURhbmdsaW5nKGVsZW1lbnQpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQljb250ZW50Vmlld2VyLnNldExheW91dE1hbmFnZXIobnVsbCk7Ci0JCQljb250ZW50Vmlld2VyLnNob3dFbGVtZW50Q29udGVudChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudEhUTUxWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudEhUTUxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjOWViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0VsZW1lbnRIVE1MVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Ccm93c2luZ0xheW91dFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTG9jYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuT3BlbldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuV2luZG93RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkN1cnNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIGVsZW1lbnQgaW4gYSBTV1QgQnJvd3Nlci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEhUTUxWaWV3ZXIgewotCi0vLwkvLyBUaGUgZGVmYXVsdCBIVE1MIHdyYXBwZXJzIGZvciBkaXNhYmxpbmcgdGhlICJEaXNwbGF5IFRyZWUgQnJvd3NlciIgbGluawotLy8JLy8gaW4gdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfV1JBUFBFUl9TVEFSVCA9ICI8aHRtbD48aGVhZD4gPG1ldGEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLThcIj48L2hlYWQ+PHRpdGxlPlJhdGlvbmFsIFVuZmllZCBQcm9jZXNzPC90aXRsZT4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPHNjcmlwdCBsYW5ndWFnZT1cImphdmFzY3JpcHRcIj5mdW5jdGlvbiBpbml0KCkgeyBwYXJlbnQub3J5X3RvYz1cImRpc2FibGVcIjsgcGFyZW50LmNvbnRlbnRmcmFtZS5sb2NhdGlvbj1cIiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05URU5UX1dSQVBQRVJfRU5EID0gIlwiOyB9PC9zY3JpcHQ+PC9oZWFkPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWVzZXQgcm93cz1cIjEwMCUsKlwiIGZyYW1lYm9yZGVyPVwibm9cIiBib3JkZXI9XCIwXCIgZnJhbWVzcGFjaW5nPVwiMFwiIGlkPVwiY29udGVudGZyYW1lc2V0XCIgbmFtZT1cImNvbnRlbnRmcmFtZXNldFwiPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWUgc3JjPVwiYWJvdXQ6YmxhbmtcIiBpZD1cImNvbnRlbnRmcmFtZVwiIG5hbWU9XCJjb250ZW50ZnJhbWVcIiBzY3JvbGxpbmc9XCJhdXRvXCIvPiIgLy8kTk9OLU5MUy0xJAotLy8JCQkrICI8ZnJhbWUgc3JjPVwiYWJvdXQ6YmxhbmtcIiBpZD1cImJsYW5rZnJhbWVcIiBuYW1lPVwiYmxhbmtmcmFtZVwiIG9ubG9hZD1cImluaXQoKVwiLz4iIC8vJE5PTi1OTFMtMSQKLS8vCQkJKyAiPC9mcmFtZXNldD48L2h0bWw+IjsgLy8kTk9OLU5MUy0xJAotCi0vLwkvLyBUaGUgZGVmYXVsdCBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgcHJvY2VzcyBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJJTlRfV1JBUFBFUl9TVEFSVCA9IERFRkFVTFRfQ09OVEVOVF9XUkFQUEVSX1NUQVJUCi0vLwkJCSsgInByaW50KCk7IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BSSU5UX1dSQVBQRVJfRU5EID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfRU5EOwotLy8KLS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOVF9GSUxFID0gInByaW50Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgSFRNTCB3cmFwcGVycyBmb3IgZGlzYWJsaW5nIHRoZSAiRGlzcGxheSBUcmVlIEJyb3dzZXIiIGxpbmsgaW4gdGhlCi0JLy8gSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JcHJpdmF0ZSBTdHJpbmcgY29udGVudFdyYXBwZXJTYXJ0OwotLy8KLS8vCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRXcmFwcGVyRW5kOwotCi0vLwkvLyBUaGUgSFRNTCB3cmFwcGVycyBmb3IgcHJpbnRpbmcgdGhlIEhUTUwgY29udGVudCBwYWdlcy4KLS8vCXByaXZhdGUgU3RyaW5nIHByaW50V3JhcHBlclNhcnQ7Ci0vLwotLy8JcHJpdmF0ZSBTdHJpbmcgcHJpbnRXcmFwcGVyRW5kOwotLy8KLS8vCS8vIFRoZSBidWlsdC1pbiBicm93c2VyIGZvciBwcmludGluZyB0aGUgSFRNTCBwYWdlcy4KLS8vCS8vIGRvbid0IHVzZSBhIHNlY29uZCAKLS8vCXByaXZhdGUgQnJvd3NlciBwcmludEJyb3dzZXI7Ci0KLQlwcm90ZWN0ZWQgQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudExvY2F0aW9uID0gbnVsbDsKLQotCS8vIHNhdmUgdGhlIGN1cnJlbnQgdGV4dCBmcm9tIHRoZSBzdGF0dXMgbGlzdGVuZXIKLQkvLyB3ZSBuZWVkIHRoaXMgdG8gb3BlbiBicm93c2VyIHdpdGggdGhpcyB1cmwgCi0JLy8gc2luY2UgdW5kZXIgbGludXggYnJvd3NlciBjYW4ndCBiZSBvcGVuZWQgYXV0b21hdGljYWxseSwgd2hpY2ggaXMgcmVhbGx5IGJhZAotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCi0JcHJpdmF0ZSBDdXJzb3Igd2FpdEN1cnNvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50SFRNTFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQlodG1sQnVpbGRlciA9IG5ldyBIdG1sQnVpbGRlcigpOwotCQljcmVhdGVDb250cm9sKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgU1dUIGJyb3dzZXIgY29udHJvbHMgZm9yIHZpZXdpbmcgYW5kIHByaW50aW5nIHRoZSBIVE1MCi0JICogY29udGVudCBwYWdlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbCgpIHsKLQkJdHJ5IHsKLQkJCWJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWJyb3dzZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIfEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQkJCWJyb3dzZXIuYWRkTG9jYXRpb25MaXN0ZW5lcihuZXcgTG9jYXRpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb2NhdGlvbiBjaGFuZ2VkIik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgY2hhbmdpbmcoTG9jYXRpb25FdmVudCBlKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJsb2NhdGlvbiBjaGFuZ2luZy4uLiIpOwotCQkJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCi0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IGdldEVsZW1lbnRVcmwoZS5sb2NhdGlvbik7Ci0JCQkJCWlmICggbG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbi5zdGFydHNXaXRoKFJlc291cmNlSGVscGVyLlVSTF9TVFJfSkFWQVNDUklQVCkpCi0JCQkJCXsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoaXNMb2NhdGlvbkNoYW5nZWQobG9jYXRpb24pKSB7Ci0JCQkJCQkvLyBTYXZlIHRoZSBjdXJyZW50IGxvY2F0aW9uIGZvciBwcmludGluZyBwdXJwb3Nlcy4KLQkJCQkJCWN1cnJlbnRMb2NhdGlvbiA9IGxvY2F0aW9uOwotCQkJCQkJZ2VuZXJhdGVIdG1sKGN1cnJlbnRMb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJYnJvd3Nlci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpCi0JCQl7Ci0JCQkJcHVibGljIHZvaWQgY2hhbmdlZChTdGF0dXNUZXh0RXZlbnQgZXZlbnQpCi0JCQkJewotCQkJCQkvLyBHZXQgdGhlIGN1cnJlbnQgdGV4dC4KLQkJCQkJU3RyaW5nIHRleHQgPSBldmVudC50ZXh0OwotCQkJCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKQotCQkJCQl7Ci0JCQkJCQkvLyBTYXZlIHRoZSBjdXJyZW50IHRleHQgZm9yIGFwcGxpY2F0aW9uIGxhdW5jaGluZyBwdXJwb3Nlcy4KLQkJCQkJCWN1cnJlbnRUZXh0ID0gdGV4dDsKLQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJTdGF0dXMgY2hhbmdlZDogIiArIHRleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQkKLQkJCWJyb3dzZXIuYWRkT3BlbldpbmRvd0xpc3RlbmVyKG5ldyBPcGVuV2luZG93TGlzdGVuZXIoKXsKLQotCQkJCXB1YmxpYyB2b2lkIG9wZW4oV2luZG93RXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gaGFuZGxlIG9wZW4gd2luZG93LgotCQkJCQkvLyB3aXRoIG1vemlsbGEgaW4gbGludXgsIG9wZW4gd2luZG93IGRvZXMgbm90IHdvcmsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIk9wZW4gd2luZG93IGV2ZW50OiAiICsgZXZlbnQpOwotCQkJCQkKLQkJCQkJLy8gd2luZG93cyBjYW4gbGF1bmNoIHRoZSBicm93c2VyIHdpdGhvdXQgcHJvYmxlbQotCQkJCQkvLyBsaW51eCBuZWVkcyBtb3JlIGNhcmUKLQkJCQkJaWYgKFNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKQotCQkJCQl7Ci0JCQkJCSAgICBwdWJsaWMgdm9pZCBydW4oKQotCQkJCQkJewotCQkJCQkJCXRyeQotCQkJCQkJCXsKLS8vCQkJCQkJCQkvLyBpZiB0aGUgdXJsIGlzIGEgcmVzb3VyY2Ugd2l0aCByZWxhdGl2ZSBwYXRoLCBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoCi0vLwkJCQkJCQkJaWYgKCBjdXJyZW50VGV4dC5zdGFydHNXaXRoKCJmaWxlOiIpICkKLS8vCQkJCQkJCQl7Ci0vLwkJCQkJCQkJCS8vIGdldCB0aGUgZmlsZSBwYXRoIGZyb20gdGhlIAotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJCQkKLS8vCQkJCQkJCQkvLyBvcGVuIGFub3RoZXIgc3d0IGJyb3dzZXIgc2luY2Ugd2UgaGF2ZSBubyAoc2ltcGxlKSB3YXkgb2YgY3JlYXRpbmcgYSBzeXN0ZW0gZGVmYXVsdCBicm93c2VyCi0vLwkJCQkJCQkJLy8gdGhlIEVjbGlwc2UgZ3V5cyBoaWRlIGFsbCB0aGUgZ29vZCBhcGlzIGFzIGludGVybmFsCi0JCQkJCQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7Ci0JCQkJCQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJCQkJCXNoZWxsLnNldExheW91dChsYXlvdXQpOwotCQkJCQkJCQlCcm93c2VyIHBvcHVwX2Jyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJCQkJCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USHxHcmlkRGF0YS5HUkFCX0hPUklaT05UQUx8R3JpZERhdGEuR1JBQl9WRVJUSUNBTCkpOwotCQkJCQkJCQlwb3B1cF9icm93c2VyLnNldFVybChjdXJyZW50VGV4dCk7Ci0JCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJCXNoZWxsLm9wZW4oKTsKLQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJCQkJewotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfX0pOwotCQkJCi0vLwkJCS8vIGRvbid0IHVzZSBhIHNlcGVyYXRlIGJyb3dzZXIgZm9yIHByaW50aW5nIHNpbmNlIHRoaXMgd2lsbCBsb3NlIHRoZSAKLS8vCQkJLy8gc3RhdGVzIG9mIHRoZSBjdXJyZW50IHBhZ2UsIGZvciBleGFtcGxlLCB0aGUgZXhwYW5kZWQgc2VjdGlvbnMsIGV0Yy4KLS8vCQkJLy8gSmluaHVhIFhpLCAgMy81LzIwMDcKLS8vCQkJLy8gQ3JlYXRlIHRoZSBoaWRkZW4gYnJvd3NlciB1c2VkIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50Ci0vLwkJCS8vIHBhZ2VzLgotLy8JCQlwcmludEJyb3dzZXIgPSBuZXcgQnJvd3NlcihwYXJlbnQsIFNXVC5OT05FKTsKLS8vCQkJcHJpbnRCcm93c2VyLnNldFNpemUoMSwgMSk7Ci0vLwkJCXByaW50QnJvd3Nlci5zZXRWaXNpYmxlKGZhbHNlKTsKLS8vCi0vLwkJCS8vIExpbnV4OiBUaGVyZSBpcyB1bnVzZWQgc3BhY2UgaW4gcHJldmlldy9icm93c2luZywgd2hpY2ggaXMgaW4gZ3JleS4KLS8vCQkJLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGxpbnV4Ci0vLwkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0vLwkJCWdkLmhlaWdodEhpbnQgPSAxOwotLy8JCQlwcmludEJyb3dzZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCQotCQkJLy8gUmVhZCB0aGUgSFRNTCB3cmFwcGVycyBmb3IgZGlzYWJsaW5nIHRoZSAiRGlzcGxheSBUcmVlIEJyb3dzZXIiCi0JCQkvLyBsaW5rIGluIHRoZSBIVE1MIGNvbnRlbnQgcGFnZXMuCi0vLwkJCWNvbnRlbnRXcmFwcGVyU2FydCA9IEhUTUxXcmFwcGVycwotLy8JCQkJCS5nZXRTdHJpbmcoIkNPTlRFTlRfV1JBUFBFUl9TVEFSVCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChjb250ZW50V3JhcHBlclNhcnQgPT0gbnVsbCkgewotLy8JCQkJY29udGVudFdyYXBwZXJTYXJ0ID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLS8vCQkJY29udGVudFdyYXBwZXJFbmQgPSBIVE1MV3JhcHBlcnMuZ2V0U3RyaW5nKCJDT05URU5UX1dSQVBQRVJfRU5EIik7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaWYgKGNvbnRlbnRXcmFwcGVyRW5kID09IG51bGwpIHsKLS8vCQkJCWNvbnRlbnRXcmFwcGVyRW5kID0gREVGQVVMVF9DT05URU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLQotLy8JCQkvLyBSZWFkIHRoZSBIVE1MIHdyYXBwZXJzIGZvciBwcmludGluZyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotLy8JCQlwcmludFdyYXBwZXJTYXJ0ID0gSFRNTFdyYXBwZXJzLmdldFN0cmluZygiUFJJTlRfV1JBUFBFUl9TVEFSVCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCWlmIChwcmludFdyYXBwZXJTYXJ0ID09IG51bGwpIHsKLS8vCQkJCXByaW50V3JhcHBlclNhcnQgPSBERUZBVUxUX1BSSU5UX1dSQVBQRVJfU1RBUlQ7Ci0vLwkJCX0KLS8vCQkJcHJpbnRXcmFwcGVyRW5kID0gSFRNTFdyYXBwZXJzLmdldFN0cmluZygiUFJJTlRfV1JBUFBFUl9FTkQiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlpZiAocHJpbnRXcmFwcGVyRW5kID09IG51bGwpIHsKLS8vCQkJCXByaW50V3JhcHBlckVuZCA9IERFRkFVTFRfUFJJTlRfV1JBUFBFUl9FTkQ7Ci0vLwkJCX0KLQotCQkJd2FpdEN1cnNvciA9IHBhcmVudC5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1DdXJzb3IoCi0JCQkJCVNXVC5DVVJTT1JfV0FJVCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlicm93c2VyID0gbnVsbDsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xvY2F0aW9uQ2hhbmdlZChTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgY3VycmVudExvY2F0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0JCQlsb2NhdGlvbiA9IGxvY2F0aW9uLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJU3RyaW5nIG9sZExvY2F0aW9uID0gZ2V0VXJsKGN1cnJlbnRMb2NhdGlvbik7Ci0KLQkJCS8vIFNvbWUgdGltZXMgdGhlIGN1cnJlbnQgVVJMIGlzIGEgZnVsbCBwYXRoLCBzbyBqdXN0IGNvbXBhcmUgdGhlIGVuZC4KLQkJCQotCQkJLy8gIGJ1ZyBpbiBJRTYsIHRoZSBsb2NhdGlvbiBpbiB0aGUgbG9jYXRpb24gY2hhbmdlIGV2ZW50IG1pZ2h0IGJlIHRydW5jYXRlZCBpZiB0aGUgdXJsIGlzIHRvbyBsb25nLCAKLQkJCS8vIGNvdWxkIGJlIHVwIHRvIDE1OSBjaGFyYWN0ZXJzLgotCQkJCi0JCQlyZXR1cm4gb2xkTG9jYXRpb24uaW5kZXhPZihsb2NhdGlvbikgIT0gMDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAhbG9jYXRpb24uZW5kc1dpdGgoY3VycmVudExvY2F0aW9uKQotCQkJCQkmJiAhY3VycmVudExvY2F0aW9uLmVuZHNXaXRoKGxvY2F0aW9uKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU1dUIGJyb3dzZXIgdGhhdCBkaXNwbGF5cyB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotCSAqLwotCXB1YmxpYyBCcm93c2VyIGdldEJyb3dzZXIoKSB7Ci0JCXJldHVybiBicm93c2VyOwotCX0KLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQlicm93c2VyLnNldEZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIEJ1aWxkZXIuCi0JICovCi0JcHVibGljIEh0bWxCdWlsZGVyIGdldEh0bWxCdWlsZGVyKCkgewotCQkKLQkJaWYgKCBodG1sQnVpbGRlciAhPSBudWxsICkgewotCQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS51cGRhdGUoaHRtbEJ1aWxkZXIpOwotCQl9Ci0JCXJldHVybiBodG1sQnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIEJ1aWxkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHRtbEJ1aWxkZXIoSHRtbEJ1aWxkZXIgYnVpbGRlcikgewotCQl0aGlzLmh0bWxCdWlsZGVyID0gYnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBFbGVtZW50IExheW91dCBNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dE1hbmFnZXIoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyKSB7Ci0JCWh0bWxCdWlsZGVyLnNldExheW91dE1hbmFnZXIobGF5b3V0TWdyKTsKLQl9Ci0KLQotCQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dFbGVtZW50Q29udGVudChPYmplY3QgcmF3X2VsZW1lbnQpIHsKLQotCQlzdGFydFdhaXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIGZpbGVfdXJsID0gZ2VuZXJhdGVIdG1sKHJhd19lbGVtZW50LCBnZXRIdG1sQnVpbGRlcigpKTsKLQkJCi0JCQkvLyBTZXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gYXZvaWQgcmUtZ2VuZXJhdGluZyB0aGUgSFRNTCBmaWxlIGluCi0JCQkvLyByZXNwb25kIHRvIGEgbG9jYXRpb24gY2hhbmdlLgotCQkJY3VycmVudExvY2F0aW9uID0gZmlsZV91cmw7Ci0JCQlicm93c2VyLnNldFVybChmaWxlX3VybCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQkJZW5kV2FpdCgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlbmVyYXRlSHRtbChPYmplY3QgcmF3X2VsZW1lbnQsIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmdldERlbGVnYXRlKCkuZ2VuZXJhdGVIdG1sKHJhd19lbGVtZW50LCBodG1sQnVpbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSHRtbChTdHJpbmcgdXJsKSB7Ci0JCXN0YXJ0V2FpdCgpOwotCQl0cnkgewotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZW5lcmF0ZUh0bWwodXJsKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQllbmRXYWl0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBVUkwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudFVybChTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24ubGVuZ3RoKCkgPT0gMAotCQkJCXx8IGxvY2F0aW9uLmVxdWFscygiYWJvdXQ6YmxhbmsiKSAgLy8kTk9OLU5MUy0xJAotCQkJCXx8IGxvY2F0aW9uLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChSZXNvdXJjZUhlbHBlci5VUkxfU1RSX0pBVkFTQ1JJUFQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWxvY2F0aW9uID0gZ2V0VXJsKGxvY2F0aW9uKTsKLQkJaWYgKGxvY2F0aW9uLmluZGV4T2YoUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIpID49IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSB1cmwgaXMgYW4gZWxlbWVudCB1cmwsIGNoZWNrIHRoZSBndWlkCi0JCWlmICggUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21GaWxlTmFtZShsb2NhdGlvbikgPT0gbnVsbCApCi0JCXsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVcmwoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyBwdWJsaXNoX2RpciA9IGdldEh0bWxCdWlsZGVyKCkuZ2V0UHVibGlzaERpcigpOwotCQlTdHJpbmcgdXJsID0gZml4UGF0aChsb2NhdGlvbik7Ci0JCWludCBpbmRleCA9IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoCi0JCQkJZml4UGF0aChwdWJsaXNoX2RpcikudG9Mb3dlckNhc2UoKSk7Ci0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKGluZGV4ICsgcHVibGlzaF9kaXIubGVuZ3RoKCkpOwotCQl9Ci0JCWluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGZpeFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwbGF0Zm9ybSA9IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQkJaWYgKCJ3aW4zMiIuZXF1YWxzKHBsYXRmb3JtKSB8fCAid3BmIi5lcXVhbHMocGxhdGZvcm0pKSB7IC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKLQkJCS8vIG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLklFCi0JCQkJcGF0aCA9IFVSTERlY29kZXIuZGVjb2RlKHBhdGgsICJJU08tODg1OS0xIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gb3JnLmVjbGlwc2Uuc3d0LmJyb3dzZXIuTW96aWxsYQotCQkJCXBhdGggPSBVUkxEZWNvZGVyLmRlY29kZShwYXRoLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKEZpbGUuc2VwYXJhdG9yQ2hhciAhPSAnLycpIHsKLQkJCQlyZXR1cm4gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCX0KLQkJCXJldHVybiBwYXRoOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSBjdXJyZW50IEhUTUwgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJYm9vbGVhbiBiID0gdGhpcy5icm93c2VyLmV4ZWN1dGUoIndpbmRvdy5wcmludCgpOyIpOyAvLyROT04tTkxTLTEkCi0vLwkJaWYgKCAhYiApIHsKLS8vCQkJZmluYWwgU3RyaW5nIHByaW50RmlsZSA9IGh0bWxCdWlsZGVyLmdldFB1Ymxpc2hEaXIoKSArIFBSSU5UX0ZJTEU7Ci0vLwkJCWlmIChjdXJyZW50TG9jYXRpb24gIT0gbnVsbCkgewotLy8JCQkJU3RyaW5nQnVmZmVyIHdyYXBwZXJIVE1MID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQkJd3JhcHBlckhUTUwuYXBwZW5kKHByaW50V3JhcHBlclNhcnQpLmFwcGVuZChjdXJyZW50TG9jYXRpb24pCi0vLwkJCQkJCS5hcHBlbmQocHJpbnRXcmFwcGVyRW5kKTsKLS8vCQkJCVN0cmluZyBodG1sVGV4dCA9IHdyYXBwZXJIVE1MLnRvU3RyaW5nKCk7Ci0vLwkJCQlpZiAoRmlsZVV0aWwud3JpdGVVVEY4RmlsZShwcmludEZpbGUsIGh0bWxUZXh0KSkgewotLy8JCQkJCXByaW50QnJvd3Nlci5zZXRVcmwocHJpbnRGaWxlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRXYWl0KCkgewotCQlwYXJlbnQuZ2V0U2hlbGwoKS5zZXRDdXJzb3Iod2FpdEN1cnNvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFdhaXQoKSB7Ci0JCXBhcmVudC5nZXRTaGVsbCgpLnNldEN1cnNvcihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbnRlbnQuCi0JICogPHA+Ci0JICogUmVnZW5lcmF0ZXMgdGhlIGNvbnRlbnQgYmVmb3JlIHJlZnJlc2hpbmcgdGhlIGJyb3dzZXIuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZ2VuZXJhdGVIdG1sKGN1cnJlbnRMb2NhdGlvbik7Ci0JCWJyb3dzZXIucmVmcmVzaCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50c1ZpZXdDb250ZXh0SGVscC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9FbGVtZW50c1ZpZXdDb250ZXh0SGVscC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWIyMDU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvRWxlbWVudHNWaWV3Q29udGV4dEhlbHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAKLSAqIENvbnRleHQgSGVscCBmb3IgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50c1ZpZXdDb250ZXh0SGVscCB7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWxwIG9mIHRoZSBnaXZlbiBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoSVNlbGVjdGlvbiBzZWxlY3Rpb24sIENvbXBvc2l0ZSB1aUNvbXBvc2l0ZSkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3RlZCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkvLyBpZiBtdWx0aXBsZSBpdGVtcyBzZWxlY3RlZCwgb25seSB0aGUgZmlyc3QgaXRlbSdzIGNvbnRleHQgaGVscCB3aWxsCi0JCS8vIGJlIGRpc3BsYXllZAotCQlPYmplY3Qgb2JqID0gc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIFNldHRpbmcgaGVscCBmb3IgdGhlIHNlbGVjdGlvbiBvYmogPSAiICsKLQkJLy8gb2JqKTsKLQkJc2V0SGVscChvYmosIHVpQ29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBoZWxwIG9mIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHVpQ29tcG9zaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhlbHAoT2JqZWN0IG9iaiwgQ29tcG9zaXRlIHVpQ29tcG9zaXRlKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvYmogPSBMaWJyYXJ5VXRpbC51bndyYXAob2JqKTsKLQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoCi0JCQkJCXVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBEb21haW4pKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpKSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgob2JqIGluc3RhbmNlb2YgVG9vbCkpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZykpIHsKLQkJCVBsYXRmb3JtVUkKLQkJCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRIZWxwU3lzdGVtKCkKLQkJCQkJLnNldEhlbHAoCi0JCQkJCQkJdWlDb21wb3NpdGUsCi0JCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHVpQ29tcG9zaXRlLAotCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5MSUJSQVJZX1ZJRVdfTk9ERV9DT05URVhUX05PVF9JTVBMRU1FTlRFRCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1aUNvbXBvc2l0ZSwKLQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9WSUVXX05PREVfQ09OVEVYVF9OT1RfSU1QTEVNRU5URUQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodWlDb21wb3NpdGUsCi0JCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlQbGF0Zm9ybVVJCi0JCQkJCS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJCS5zZXRIZWxwKAotCQkJCQkJCXVpQ29tcG9zaXRlLAotCQkJCQkJCUF1dGhvcmluZ1VJSGVscENvbnRleHRzLkxJQlJBUllfVklFV19OT0RFX0NPTlRFWFRfTk9UX0lNUExFTUVOVEVEKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0hUTUxXcmFwcGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzJjOTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhlIEhUTUwgd3JhcHBlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFdyYXBwZXJzIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlCi0JCQkuZ2V0QnVuZGxlKEhUTUxXcmFwcGVycy5jbGFzcy5nZXROYW1lKCkpOwotCi0JLyoqCi0JICogRGVmYXVsdCBwcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmb3JtIGJlaW5nCi0JICogaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgSFRNTFdyYXBwZXJzKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgZ2l2ZW4gdGhlIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBmb3JtYXR0ZWQgbWVzc2FnZSBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBUaGUgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBhcmd1bWVudHMuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIGZvcm1hdHRlZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcga2V5LCBPYmplY3RbXSBhcmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJncyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvSFRNTFdyYXBwZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzA2NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9IVE1MV3JhcHBlcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ09OVEVOVF9XUkFQUEVSX1NUQVJUPVwKLSAgPGh0bWw+XAotICA8aGVhZD5cCi0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij5cCi0gIDwvaGVhZD5cCi0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPlwKLSAgZnVuY3Rpb24gaW5pdCgpIHsgcGFyZW50Lm9yeV90b2M9ImRpc2FibGUiOyBwYXJlbnQuY29udGVudGZyYW1lLmxvY2F0aW9uPSIKLSAgCi1DT05URU5UX1dSQVBQRVJfRU5EPVwKLSAgIjsgfVwKLSAgPC9zY3JpcHQ+XAotICA8L2hlYWQ+XAotICA8ZnJhbWVzZXQgcm93cz0iMTAwJSwqIiBmcmFtZWJvcmRlcj0ibm8iIGJvcmRlcj0iMCIgZnJhbWVzcGFjaW5nPSIwIiBpZD0iY29udGVudGZyYW1lc2V0IiBuYW1lPSJjb250ZW50ZnJhbWVzZXQiPlwKLSAgPGZyYW1lIHNyYz0iYWJvdXQ6YmxhbmsiIGlkPSJjb250ZW50ZnJhbWUiIG5hbWU9ImNvbnRlbnRmcmFtZSIgc2Nyb2xsaW5nPSJhdXRvIi8+XAotICA8ZnJhbWUgc3JjPSJhYm91dDpibGFuayIgaWQ9ImJsYW5rZnJhbWUiIG5hbWU9ImJsYW5rZnJhbWUiIG9ubG9hZD0iaW5pdCgpIi8+XAotICA8L2ZyYW1lc2V0PlwKLSAgPC9odG1sPgotCi1QUklOVF9XUkFQUEVSX1NUQVJUPVwKLSAgPGh0bWw+XAotICA8aGVhZD5cCi0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij5cCi0gIDwvaGVhZD5cCi0gIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPlwKLSAgZnVuY3Rpb24gaW5pdCgpIHsgcGFyZW50Lm9yeV90b2M9ImRpc2FibGUiOyB9XAotICA8L3NjcmlwdD5cCi0gIDwvaGVhZD5cCi0gIDxmcmFtZXNldCByb3dzPSIxMDAlLCoiIGZyYW1lYm9yZGVyPSJubyIgYm9yZGVyPSIwIiBmcmFtZXNwYWNpbmc9IjAiIGlkPSJwcmludGZyYW1lc2V0IiBuYW1lPSJwcmludGZyYW1lc2V0IiBvbmxvYWQ9ImphdmFzY3JpcHQ6cHJpbnQoKSI+XAotICA8ZnJhbWUgc3JjPSJhYm91dDpibGFuayIgaWQ9ImJsYW5rZnJhbWUiIG5hbWU9ImJsYW5rZnJhbWUiIG9ubG9hZD0iaW5pdCgpIi8+XAotICA8ZnJhbWUgc3JjPSIKLQotUFJJTlRfV1JBUFBFUl9FTkQ9XAotICAiIGlkPSJwcmludGZyYW1lIiBuYW1lPSJwcmludGZyYW1lIiBzY3JvbGxpbmc9ImF1dG8iIG9ubG9hZD0iamF2YXNjcmlwdDpwYXJlbnQucHJpbnRmcmFtZS5mb2N1cygpIi8+XAotICA8L2ZyYW1lc2V0PlwKLSAgPGh0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9MaWJyYXJ5Vmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9MaWJyYXJ5Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWU3ODU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTGlicmFyeVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS52aWV3ZXIuSVZpZXdlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uQ3V0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLlBhc3RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmRuZC5Mb2NhbFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLlVJQWN0aW9uRGlzcGF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuQXNzaWduQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5DcmVhdGVNZXRob2RFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGF5b3V0QWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdDb3B5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5Vmlld0N1dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeVZpZXdEZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3UGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlWaWV3U2ltcGxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5OZXdQbHVnaW5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlJlYXNzaWduQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5SZW5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLlVuYXNzaWduQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Nb3ZlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZGlhbG9ncy5Td2l0Y2hDb25maWdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5kaWFsb2dzLlZhcmlhYmlsaXR5U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZG5kLkxpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuSUVkaXRvcktlZXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuTWV0aG9kRWxlbWVudEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkucHJlZmVyZW5jZXMuQXV0aG9yaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByb3ZpZGVycy5NZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS51dGlsLkxpYnJhcnlWYWxpZGF0aW9uTWFya2VySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudXRpbC5SZWZyZXNoSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnV0aWwuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSU5hbWVkRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5JbXBvcnRFeHBvcnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSURvdWJsZUNsaWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5TaG93SW5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm1hcmtlcnMuaW50ZXJuYWwuTWFya2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5uYXZpZ2F0b3IuUmVzb3VyY2VOYXZpZ2F0b3I7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgdmlldy4KLSAqIDxwPgotICogRGlzcGxheXMgdGhlIHBoeXNpY2FsIHJlcHJlc2VudGF0aW9uIG9mIGEgTWV0aG9kIExpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VmlldyBleHRlbmRzIEFic3RyYWN0QmFzZVZpZXcgaW1wbGVtZW50cyBJUmVmcmVzaEhhbmRsZXIsCi0JCUlTaG93SW5UYXJnZXQgewotCi0JLyoqCi0JICogVGhlIHZpZXcgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklFV19JRCA9IExpYnJhcnlWaWV3LmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByb3RlY3RlZCBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgSURvdWJsZUNsaWNrTGlzdGVuZXIgZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXByaXZhdGUgTGF5b3V0QWN0aW9uR3JvdXAgZkxheW91dEFjdGlvblNldDsKLQkKLQlwcml2YXRlIFN0cmluZyBQRVJGT1JNX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3Jpbmcudmlldy5MaWJyYXJ5Vmlldy5wZXJmb3JtVmFsaWRhdG9yQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSUFjdGlvbiBwZXJmb3JtTGlicmFyeVZhbGlkYXRpb25BY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuVmFsaWRhdGVfbWV0aG9kX2xpYnJhcnksIEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkiZnVsbC9ldG9vbDE2L3ZhbGlkYXRlX21ldGhvZF9saWIuZ2lmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJVmlld0hlbHBlci5jaGVja0xpYnJhcnlIZWFsdGgoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9CQkKLQl9OwotCQotCS8vIExpc3RlbiB0byBwcm9jZXNzIGVkaXRvciBhY3RpdmF0aW9uIGFuZCBwcm9tcHQgdGhlIHVzZXIgdG8gbG9hZCB0aGUKLQkvLyB0aGUgcHJvY2VzcydzIGRlZmF1bHQgQ29uZmlndXJhdGlvbiBpbnRvIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0JcHJpdmF0ZSBJUGFydExpc3RlbmVyIGVkaXRvclBhcnRMaXN0ZW5lciA9IG5ldyBJUGFydExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHBhcnRPcGVuZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGFydEJyb3VnaHRUb1RvcChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQpIHsKLQkJCQlTd2l0Y2hDb25maWdEaWFsb2cucnVuKERpc3BsYXkKLQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgKElFZGl0b3JQYXJ0KXBhcnQpOwotCQkJfQotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBsb25nIGxhc3RSZWZyZXNoVGltZVN0YW1wOwotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUxpc3RlbmVyID0gbmV3IElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHx8Ci0JCQkJCWV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFKSB7Ci0JCQkJLy8gcHJvamVjdCBhYm91dCB0byBiZSBjbG9zZWQgb3IgZGVsZXRlZAotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQl0cnkgewotCQkJCQlpZiAocHJvamVjdC5leGlzdHMoKSAmJiBwcm9qZWN0LmlzT3BlbigpICYmIHByb2plY3QuaGFzTmF0dXJlKE1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCkpIHsKLQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5jbG9zZUFsbE1ldGhvZEVkaXRvcnMoKTsKLQkJCQkJCUlQcm9qZWN0IGN1cnJQcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotCQkJCQkJaWYgKHByb2plY3QgPT0gY3VyclByb2plY3QpIHsKLQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2V4KSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGNleCk7Ci0JCQkJfSBjYXRjaCAoTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gbGV4KSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGxleCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCQkKLQkJCX0KLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQkJCQotCQkJdHJ5IHsKLQkJCQljbGFzcyBSZXNvdXJjZURlbHRhVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKQotCQkJCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1BUktFUlMpID09IElSZXNvdXJjZURlbHRhLk1BUktFUlMpIHsKLQkJCQkJCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQ6Ci0JCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQkJCQkvLyBzaG93IFByb2JsZW1zIFZpZXcKLQkJCQkJCQkJVUlIZWxwZXIuc2hvd1Byb2JsZW1zVmlldygpOwotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gd2F0Y2ggZm9yIHByb2plY3QgbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJZWxzZSBpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsgIAotCQkJCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgewotCQkJCQkJCQlpZiAoKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IDApICYmICAgICAgICAgICAgICAgIAotCQkJCQkJCQkJCSgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkRFU0NSSVBUSU9OKSAhPSAwKSkgewotCQkJCQkJCQkJLy8gdGVzdGVkIHVzaW5nIHRoZSBNb3ZlLi4gY29tbWFuZCBpbiB0aGUgUmVzb3VyY2UgTmF2aWdhdG9yIHZpZXcgICAgICAgICAgICAgCi0JCQkJCQkJCQkvLyB0aGUgUkVQTEFDRUQgZmxhZyBvbmx5IHNlZW1lZCB0byBvY2N1ciB3aGVuIHRoZSBsaWJyYXJ5IHdhcyBtb3ZlZCAgICAgICAgICAKLQkJCQkJCQkJCS8vIG91dHNpZGUgb2YgRVBGIGFuZCBFUEYgd2FzIHJlLXN0YXJ0ZWQsIHNvIG1ha2Ugc3VyZSBpdCdzIGNsZWFyLCBvdGhlcndpc2UgIAotCQkJCQkJCQkJLy8gd2UgcmVsb2FkIHRoZSBsaWJyYXJ5IHJpZ2h0IGFmdGVyIGxvYWRpbmcgaXQgd2hlbiBzdGFydGluZyBFUEYgICAgICAgICAgICAgCi0JCQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQkJCQkJCQlpZihsaWJNZ3IgaW5zdGFuY2VvZiBYTUlMaWJyYXJ5TWFuYWdlcikgewotCQkJCQkJCQkJCVhNSUxpYnJhcnlNYW5hZ2VyIHhtaUxpYk1nciA9ICgoWE1JTGlicmFyeU1hbmFnZXIpbGliTWdyKTsKLQkJCQkJCQkJCQlpZihwcm9qZWN0LmVxdWFscyh4bWlMaWJNZ3IuZ2V0TWV0aG9kTGlicmFyeVByb2plY3QoKSkpIHsJCi0JCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCQkJCQkJCQl4bWlMaWJNZ3IuaGFuZGxlTGlicmFyeU1vdmVkKCk7Ci0JCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSAhPSAwKSB7Ci0JCQkJCQkJCQkvLyBwcm9qZWN0J3Mgb3BlbiBzdGF0ZSB3YXMgY2hhbmdlZAotCQkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpICYmIHByb2plY3QuaGFzTmF0dXJlKE1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlLk5BVFVSRV9JRCkgJiYKLQkJCQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCQkJCQkJCQkvLyBwcm9qZWN0IGlzIG5vdyBvcGVuLCBvcGVuIHRoZSBsaWJyYXJ5Ci0JCQkJCQkJCQkJamF2YS5uZXQuVVJJIHByb2plY3RMb2NhdGlvbiA9IHByb2plY3QuZ2V0TG9jYXRpb25VUkkoKTsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLm9wZW5NZXRob2RMaWJyYXJ5KCJ4bWkiLCBwcm9qZWN0TG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9CQkJCQotCQkJCX07Ci0JCQkJCi0JCQkJUmVzb3VyY2VEZWx0YVZpc2l0b3IgdmlzaXRvciA9IG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJUmVmcmVzaExpc3RlbmVyIHJlZnJlc2hMaXN0ZW5lciA9IG5ldyBJUmVmcmVzaExpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeVJlZnJlc2hlZChJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpICE9IG51bGwKLQkJCQkJJiYgIWV2ZW50LmdldFJlZnJlc2hlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCQlDb250cm9sIGN0cmwgPSBnZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJaWYgKGN0cmwuZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCQkJZG9SZWZyZXNoKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHJsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlkb1JlZnJlc2gobnVsbCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVZpZXcoKSB7Ci0JCS8vIHJlYWQgbGF5b3V0IHByZWYKLQkJaWYgKFBsdWdpblVJUGFja2FnZUNvbnRleHQuRkxBVF9MQVlPVVQuZXF1YWxzKEFwcGxpY2F0aW9uUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRMYXlvdXQoKSkpIHsKLQkJCVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0Uuc2V0TGF5b3V0RmxhdCgpOwotCQl9IGVsc2UgaWYgKFBsdWdpblVJUGFja2FnZUNvbnRleHQuSElFUkFSQ0hJQ0FMX0xBWU9VVC5lcXVhbHMoQXBwbGljYXRpb25QcmVmZXJlbmNlQ29uc3RhbnRzLmdldExheW91dCgpKSkgewotCQkJUGx1Z2luVUlQYWNrYWdlQ29udGV4dC5JTlNUQU5DRS5zZXRMYXlvdXRIaWVyYXJjaGljYWwoKTsKLQkJfQotCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZVBhcnRDb250cm9sKHBhcmVudCk7Ci0JCQotCQltYWtlQWN0aW9ucygpOwotCQkKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYXJlbnQsCi0JCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuTElCUkFSWV9OQVZJR0FUT1JfVklFV19DT05URVhUKTsKLQotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0UmVmcmVzaEhhbmRsZXIodGhpcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJZkxheW91dEFjdGlvblNldD0gbmV3IExheW91dEFjdGlvbkdyb3VwKHRoaXMpOwotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJZkxheW91dEFjdGlvblNldC5maWxsQWN0aW9uQmFycyhhY3Rpb25CYXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCS8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSB0aGUgZ2xvYmFsIGVkaXQgYWN0aW9uIHdvcmsgdGhlIGZpcnN0IHRpbWUuCi0JCWFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZVZpZXcodGhpcyk7Ci0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0ZWQgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0ZWQuaXNFbXB0eSgpKQotCQkJYWN0aW9uQmFyQ29udHJpYnV0b3IuZGlzYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0JCWVsc2UKLQkJCWFjdGlvbkJhckNvbnRyaWJ1dG9yLmVuYWJsZUdsb2JhbEVkaXRNZW51KCk7Ci0KLQkJaWYgKHRyZWVWaWV3ZXIgIT0gbnVsbCkgewotCQkJdHJlZVZpZXdlci5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdHJlZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIFZpZXdlciBnZXRWaWV3ZXIoKSB7Ci0JCXJldHVybiB0cmVlVmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHVuZGVybHlpbmcgdHJlZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIjaGFuZGxlTGFiZWxQcm92aWRlckNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVMYWJlbFByb3ZpZGVyQ2hhbmdlZCgKLQkJCQkJTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUmVzb3VyY2UKLQkJCQkJCSYmIGV2ZW50LmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSUxhYmVsRGVjb3JhdG9yKSB7Ci0JCQkJCXRoaXMucmVmcmVzaCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLmhhbmRsZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQotCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZQotCQkvLyBleGVjdXRlZC4KLQkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gc2V0IHRoZSBtb3N0IHJlY2VudCBjb21tYW5kJ3MgYWZmZWN0ZWQgb2JqZWN0cyB0bwotCQkvLyBiZSB0aGUgc2VsZWN0aW9uIG9mIHRoZSB2aWV3ZXIgd2l0aCBmb2N1cy4KLQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKG5ldyBDb21tYW5kU3RhY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJZmlyZVByb3BlcnR5Q2hhbmdlKElFZGl0b3JQYXJ0LlBST1BfRElSVFkpOwotCi0JCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgotCQkJCQkJQ29tbWFuZCBtb3N0UmVjZW50Q29tbWFuZCA9ICgoQ29tbWFuZFN0YWNrKSBldmVudAotCQkJCQkJCQkuZ2V0U291cmNlKCkpLmdldE1vc3RSZWNlbnRDb21tYW5kKCk7Ci0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKG1vc3RSZWNlbnRDb21tYW5kCi0JCQkJCQkJCQkuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCQotCQkJCQkJCWlmKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgQ3JlYXRlTWV0aG9kRWxlbWVudENvbW1hbmQpIHsJCQkJCQkJCQotCQkJCQkJCQkvLyBXb3JrLWFyb3VuZCB0byByZWZyZXNoIGljb25zIG9mIG5ld2x5IGNyZWF0ZWQgZWxlbWVudHMsIHdob3NlIGRlY29yYXRpb24KLQkJCQkJCQkJLy8gc29tZXRpbWVzIGdvdCBvdXQgb2Ygc3luYy4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJVmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQkJCQkJCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSB7Ci0JCQkJCQkJCQlPYmplY3RbXSBlbGVtZW50cyA9IG1vc3RSZWNlbnRDb21tYW5kCi0JCQkJCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKS50b0FycmF5KCk7Ci0JCQkJCQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpdmlld2VyKS51cGRhdGUoZWxlbWVudHMsIG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKHByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwKLQkJCQkJCQkJJiYgcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwKLQkJCQkJCQkJJiYgIXByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkKLQkJCQkJCQkJJiYgcHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQkJcHJvcGVydHlTaGVldFBhZ2UucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbCkgewotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IFBlcnNpc3RlbmNlU2VydmljZS5JTlNUQU5DRQotCQkJCS5jcmVhdGVSZXNvdXJjZVNldChTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpKTsKLQotCQllZGl0aW5nRG9tYWluID0gbmV3IFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCByZXNvdXJjZVNldCk7Ci0KLQotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJYWRhcHRlckZhY3RvcnkpKTsKLQotCQkvLyB0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihhZGFwdGVyRmFjdG9yeSkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IERlY29yYXRpbmdMYWJlbFByb3ZpZGVyKAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoYWRhcHRlckZhY3RvcnkpLAotCQkJCW5ldyBNZXRob2RFbGVtZW50TGFiZWxEZWNvcmF0b3IoKSkpOwotCi0JCS8vIEFkZCBhIGRvdWJsZSBjbGljayBsaXN0ZW5lciBmb3IgbGF1bmNoaW5nIHRoZSBNZXRob2QgZWRpdG9ycy4KLQkJZG91YmxlQ2xpY2tMaXN0ZW5lciA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKLQkJCQlVSUFjdGlvbkRpc3BhdGNoZXIuZ2V0SW5zdGFuY2UoKS5oYW5kbGVEb3VibGVDbGlja0V2ZW50KGV2ZW50KTsKLQkJCX0KLQkJfTsKLQkJdHJlZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKGRvdWJsZUNsaWNrTGlzdGVuZXIpOwotCi0JCWdldFNpdGUoKS5nZXRQYWdlKCkuYWRkUGFydExpc3RlbmVyKGVkaXRvclBhcnRMaXN0ZW5lcik7Ci0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpCi0JCQkJLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VMaXN0ZW5lcik7Ci0JCQotCQljcmVhdGVDb250ZXh0TWVudUZvcih0cmVlVmlld2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNzZXRJbnB1dEZvclZpZXdlcihPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRGb3JWaWV3ZXIoT2JqZWN0IG1vZGVsKSB7Ci0JCUNvbnRyb2wgY3RybCA9IHRoaXMuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBtb2RlbCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCS8vIFByZXZlbnQgbWVtb3J5IGxlYWsuCi0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVtcHR5U2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKTsKLQkJCWFjdGlvbkRpc3BhdGNoZXIuc2V0U2VsZWN0aW9uKGVtcHR5U2VsZWN0aW9uKTsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5nZXRJbnN0YW5jZSgpLnNldFNlbGVjdGlvbihlbXB0eVNlbGVjdGlvbik7Ci0KLQkJCWdldFZpZXdlcigpLnNldElucHV0KG1vZGVsKTsKLQkJCQotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJSUZpbHRlciBmaWx0ZXIgPSAoKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KS5nZXRGaWx0ZXIoKTsKLQkJCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJTmFtZWRGaWx0ZXIpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoKElOYW1lZEZpbHRlcikgZmlsdGVyKS5nZXROYW1lKCk7Ci0JCQkJCWlmKG5hbWUgIT0gbnVsbCkgewotCQkJCQkJc2V0Q29udGVudERlc2NyaXB0aW9uKG5hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdXBkYXRlTGFzdFJlZnJlc2hUaW1lc3RhbXAoKTsKLQkJfSBlbHNlIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiTGlicmFyeSB2aWV3ZXIgaW5wdXQgaXMgbm90IGEgTWV0aG9kTGlicmFyeSBvYmplY3Q6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVMYXN0UmVmcmVzaFRpbWVzdGFtcCgpIHsKLQkJbGFzdFJlZnJlc2hUaW1lU3RhbXAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgdmlldy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlWaWV3IGdldFZpZXcoKSB7Ci0vLwkJcmV0dXJuIChMaWJyYXJ5VmlldykgVmlld0hlbHBlci5vcGVuVmlldyhWSUVXX0lEKTsKLQkJYm9vbGVhbiBzaG93ID0gVmlld0hlbHBlci5pc1ZpZXdJbkN1cnJlbnRQZXJzcGVjdGl2ZShWSUVXX0lEKTsKLQkJcmV0dXJuIChMaWJyYXJ5VmlldylWaWV3SGVscGVyLmZpbmRWaWV3KFZJRVdfSUQsIHNob3cpOwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkFic3RyYWN0QmFzZVZpZXcjc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCSgoTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcikgYWN0aW9uQmFyQ29udHJpYnV0b3IpCi0JCQkJLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCi0JCXN1cGVyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsJCQotCi0vLwkJKChMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKSBhY3Rpb25CYXJDb250cmlidXRvcikuY2hlY2tMb2NrZWQoKTsKLQkJCi0JCS8vIGlmIG9ubHkgb25lIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHNob3cgcGF0aCB0byBpdHMgZmlsZSBpbiBzdGF0dXMgbGluZQotCQkvLwotCQlJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAoc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEVPYmplY3QpIG8pLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlVUkkgdXJpID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5pc0ZpbGUoKSkgewotCQkJCQkJCQlwYXRoID0gdXJpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQlpZiAobyBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9ICgoQ29udGVudEVsZW1lbnQpIG8pCi0JCQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJCQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXNvdXJjZSA9IGNvbnRlbnQuZVJlc291cmNlKCk7Ci0JCQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJVVJJIGNvbnRlbnRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQkJCQkJCQkJaWYgKGNvbnRlbnRVUkkgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJcGF0aCA9IHBhdGgKLQkJCQkJCQkJCQkJCQkJKyAiLC4iICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgY29udGVudFVSSS5kZXJlc29sdmUodXJpKS50b0ZpbGVTdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShwYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZWZyZXNoVmlld3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc3VwZXIubGlicmFyeVNldChsaWJyYXJ5KTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci5yZWdpc3RlckVkaXRpbmdEb21haW4oZWRpdGluZ0RvbWFpbik7Ci0JCQotCQkJbWFuYWdlci5hZGRQcm9wZXJ0eUxpc3RlbmVyKG5ldyBJUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotCQkJCQkvLyBUT0RPOiBSZXBsYWNlIGhhcmRjb2RlZCBjb25zdGFudCB3aXRoIHZhcmlhYmxlLgotCQkJCQlpZiAocHJvcElkID09IDEpIHsKLQkJCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShQUk9QX0RJUlRZKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdGlvbiBiYXIgZm9yIHRoZSBsaWJyYXJ5IHZpZXcKLQkgKi8KLQljbGFzcyBMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCQlwcml2YXRlIElBY3Rpb24gbmV3UGx1Z2luQWN0aW9uID0gbmV3IE5ld1BsdWdpbkFjdGlvbigKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdfcGx1Z2luKTsKLQotCQlwcml2YXRlIElBY3Rpb24gbW92ZUFjdGlvbiA9IG5ldyBBY3Rpb24oQXV0aG9yaW5nVUlSZXNvdXJjZXMubW92ZSkgewotCi0JCQlwcml2YXRlIHZvaWQgZG9Nb3ZlKCkgewotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBMaWJyYXJ5Vmlldy50aGlzLnNlbGVjdGlvbjsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCXx8IChlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCkpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCS8vIEhhbmRsZSBDdXN0b21DYXRlZ29yeSBzcGVjaWFsbHkuCi0JCQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCQkJCWNvbnRhaW5lciwgZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX21vdmVFcnJvciwKLQkJCQkJCQkJCQkJc3RhdHVzKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50c1RvTW92ZS5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUT0RPOiBQcm9tcHQgdGhlIHVzZXIgdGhlIHNhdmUgZWRpdGluZyBjaGFuZ2VzIGZvcgotCQkJCS8vIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBtb3ZlZC4KLQotCQkJCS8vIFJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBtb3ZlIGxpc3QgaWYgdGhlaXIgY29udGFpbmVycyBhcmUKLQkJCQkvLyBhbHJlYWR5IGluIHRoZSBtb3ZlIGxpc3QuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnRzVG9Nb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlib29sZWFuIGlzQ29udGFpbmVkID0gZmFsc2U7Ci0JCQkJCWNoZWNrX2NvbnRhaW5lZDogZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb01vdmUKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKFVtYVV0aWwuaXNDb250YWluZWRCeShlbGVtZW50LCBlKSkgewotCQkJCQkJCWlzQ29udGFpbmVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBjaGVja19jb250YWluZWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGlzQ29udGFpbmVkKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU1vdmVEaWFsb2cgZGxnID0gbmV3IE1vdmVEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCksCi0JCQkJCQllbGVtZW50c1RvTW92ZSwgZWRpdGluZ0RvbWFpbik7Ci0JCQkJZGxnLm9wZW4oKTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJCQlydW5uZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGdldEFjdGlvbkJhcnMoKQotCQkJCQkJLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCWRvTW92ZSgpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIExpYnJhcnlWaWV3U2ltcGxlQWN0aW9uIGFzc2lnbkFjdGlvbiA9IG5ldyBBc3NpZ25BY3Rpb24oTGlicmFyeVZpZXcudGhpcyk7Ci0JCQotCQlwcml2YXRlIExpYnJhcnlWaWV3U2ltcGxlQWN0aW9uIHVuYXNzaWduQWN0aW9uID0gbmV3IFVuYXNzaWduQWN0aW9uKExpYnJhcnlWaWV3LnRoaXMpOwotCQkKLQkJcHJpdmF0ZSBMaWJyYXJ5Vmlld1NpbXBsZUFjdGlvbiByZWFzc2lnbkFjdGlvbiA9IG5ldyBSZWFzc2lnbkFjdGlvbihMaWJyYXJ5Vmlldy50aGlzKTsKLQotCQlwcml2YXRlIExpYnJhcnlWaWV3U2ltcGxlQWN0aW9uIGN1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24gPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlEZWVwQ29weUFjdGlvbihMaWJyYXJ5Vmlldy50aGlzKTsKLQkJCi0JCXByaXZhdGUgUmVuYW1lQWN0aW9uIHJlbmFtZUFjdGlvbiA9IG5ldyBSZW5hbWVBY3Rpb24oKTsKLQotCQlwcml2YXRlIElBY3Rpb24gcmVwbGFjZUFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X3JlcGxhY2VBY3Rpb25fdGV4dCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFnZXRQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKHRydWUpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlmaW5hbCBQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlQcm9jZXNzIHByb2MgPSBwcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0JCQkJZmluYWwgU3RyaW5nIHR5cGVTdHI7Ci0JCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQl0eXBlU3RyID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3XzIwOwotCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQl0eXBlU3RyID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3XzIxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXR5cGVTdHIgPSBBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfMjI7Ci0JCQkJfQotCQkJCURpcmVjdG9yeURpYWxvZyBkaXJEbGcgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKGdldFNpdGUoKQotCQkJCQkJLmdldFNoZWxsKCkpOwotCQkJCWRpckRsZy5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19yZXBsYWNlX3RleHQpOwotCQkJCWRpckRsZwotCQkJCQkJLnNldE1lc3NhZ2UoTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld19taWdyYXRpb25fZGlyX2RsZ19kZXNjcmlwdGlvbl90ZXh0LAotCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHR5cGVTdHIgfSkpOwotCQkJCWZpbmFsIFN0cmluZyBkaXIgPSBkaXJEbGcub3BlbigpOwotCQkJCWlmIChkaXIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJYm9vbGVhbiByZXQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCUltcG9ydEV4cG9ydFV0aWwucmVwbGFjZShwcm9jQ29tcCwKLQkJCQkJCQkJCQkJCQlkaXIpOwotCQkJCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSwKLQkJCQkJCQkJTWVzc2FnZUZvcm1hdAotCQkJCQkJCQkJCS5mb3JtYXQoCi0JCQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5FbGVtZW50c1ZpZXdfcmVwbGFjZWluZ3dpdGhmb3JtYXRfdGV4dCwKLQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHR5cGVTdHIgfSkpOwotCi0JCQkJaWYgKHJldCkgewotCQkJCQkvLyBSZW9wZW4gdGhlIGxpYnJhcnkuCi0JCQkJCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeSgKLQkJCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHJpdmF0ZSBJQWN0aW9uIG9wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuRWxlbWVudHNWaWV3X29wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbl90ZXh0KSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJCQkJVmFyaWFiaWxpdHlTZWxlY3Rpb24gdmFyaWFiaWxpdHlTZWxlY3Rpb24gPSBuZXcgVmFyaWFiaWxpdHlTZWxlY3Rpb24oKTsKLQkJCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gdmFyaWFiaWxpdHlTZWxlY3Rpb24KLQkJCQkJCQkuZ2V0U2VsZWN0ZWRWYXJpYWJpbGl0eShlbGVtZW50KTsKLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJCUVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5vcGVuRWRpdG9yKHNlbGVjdGVkT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JCXByaXZhdGUgYm9vbGVhbiBjYW5Nb3ZlOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGNhbkFzc2lnbjsKLQotCQlwcml2YXRlIElBY3Rpb24gc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uX2xhYmVsKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVJlc291cmNlTmF2aWdhdG9yIG5hdmlnYXRvcjsKLQkJCQl0cnkgewotCQkJCQluYXZpZ2F0b3IgPSAoUmVzb3VyY2VOYXZpZ2F0b3IpIGdldFBhZ2UoKS5zaG93VmlldygKLQkJCQkJCQkib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlPYmplY3Qgb2JqID0gVG5nVXRpbAotCQkJCQkJCS51bndyYXAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCQkJSVJlc291cmNlIHdzUmVzID0gUGVyc2lzdGVuY2VVdGlsLmdldFdvcmtzcGFjZVJlc291cmNlKG9iaik7Ci0JCQkJCWlmICh3c1JlcyAhPSBudWxsKSB7Ci0JCQkJCQluYXZpZ2F0b3IuZ2V0Vmlld2VyKCkuc2V0U2VsZWN0aW9uKAotCQkJCQkJCQluZXcgU3RydWN0dXJlZFNlbGVjdGlvbih3c1JlcyksIHRydWUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGNhblJlbmFtZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBMaWJyYXJ5Vmlld0FjdGlvbkJhckNvbnRyaWJ1dG9yKEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbikgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbik7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZURlbGV0ZUFjdGlvbigpCi0JCSAqLwotCQlwcm90ZWN0ZWQgRGVsZXRlQWN0aW9uIGNyZWF0ZURlbGV0ZUFjdGlvbigpIHsKLQkJCUxpYnJhcnlWaWV3RGVsZXRlQWN0aW9uIGFjdGlvbiA9IG5ldyBMaWJyYXJ5Vmlld0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5FbGVtZW50c1ZpZXdQYXN0ZUFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlpZiAobG9ja2VkKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JUaXRsZTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXN1cGVyLnJ1bigpOwotCQkJCQl9IGNhdGNoIChNZXNzYWdlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTdHJpbmcgZGV0YWlscyA9IFRuZ1V0aWwudG9TdGFja1RyYWNlU3RyaW5nKGUpOwotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5hY3Rpb25zX0xpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvcl9kZWxldGVFcnJvck1lc3NhZ2U7Ci0JCQkJCQlTdHJpbmcgcmVhc29uID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYWN0aW9uc19MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3JfZGVsZXRlRXJyb3JSZWFzb247Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcih0aXRsZSwgbWVzc2FnZSwgcmVhc29uLCBkZXRhaWxzLAotCQkJCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmFpbGVkKCkgewotCQkJCQkvLyBMaWJyYXJ5IG5lZWQgdG8gYmUgcmVsb2FkZWQuCi0JCQkJCVZpZXdIZWxwZXIucmVsb2FkQ3VycmVudExpYnJhcnkoZ2V0U2l0ZSgpLmdldFNoZWxsKCksIEF1dGhvcmluZ1VJUmVzb3VyY2VzLm1zZ19yZWxvYWRMaWJyYXJ5KTsKLQotCQkJCQkvLyBVc2VyIHRyaWVkIHRvIHNlbGVjdCB0aGUgb2xkIHNlbGVjdGlvbi4KLQkJCQkJaWYgKGFjdGl2ZVZpZXdQYXJ0IGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7Ci0JCQkJCQlmaW5hbCBBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCk7Ci0JCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCQkJCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlcgotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgYWN0aXZlVmlld1BhcnQpCi0JCQkJCQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCQkJCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJCQkJCWVsZW1lbnRzKSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJYWN0aW9uLnNldFByb2dyZXNzTW9uaXRvcihnZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKQotCQkJCQkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlQ3V0QWN0aW9uKCkKLQkJICovCi0JCXByb3RlY3RlZCBDdXRBY3Rpb24gY3JlYXRlQ3V0QWN0aW9uKCkgewotCQkJcmV0dXJuIG5ldyBMaWJyYXJ5Vmlld0N1dEFjdGlvbigpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5FbGVtZW50c1ZpZXdQYXN0ZUFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlpZiAobG9ja2VkKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2NyZWF0ZUNvcHlBY3Rpb24oKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvcHlBY3Rpb24gY3JlYXRlQ29weUFjdGlvbigpIHsKLQkJCXJldHVybiBuZXcgTGlicmFyeVZpZXdDb3B5QWN0aW9uKCl7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWlmKCBWaWV3SGVscGVyLmhhc0N1c3RvbWl6ZWRMb2NrZXIoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pICYmIGxvY2tlZCApewkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5MaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjY3JlYXRlUGFzdGVBY3Rpb24oKQotCQkgKi8KLQkJcHJvdGVjdGVkIFBhc3RlQWN0aW9uIGNyZWF0ZVBhc3RlQWN0aW9uKCkgewotCQkJTGlicmFyeVZpZXdQYXN0ZUFjdGlvbiBhY3Rpb24gPSBuZXcgTGlicmFyeVZpZXdQYXN0ZUFjdGlvbigpIHsKLQkJCQkvKioKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5FbGVtZW50c1ZpZXdQYXN0ZUFjdGlvbiN1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlpZiAobG9ja2VkKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCQlhY3Rpb24uc2V0UHJvZ3Jlc3NNb25pdG9yKGdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpCi0JCQkJCS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlyZXR1cm4gYWN0aW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrTG9ja2VkKCkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJYm9vbGVhbiB3YXNMb2NrZWQgPSBsb2NrZWQ7Ci0vLwkJCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJCQlpZihWaWV3SGVscGVyLmhhc0N1c3RvbWl6ZWRMb2NrZXIoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pICl7CQkJCQkKLQkJCQkJbG9ja2VkID0gVmlld0hlbHBlci5pc0xvY2tlZFdpdGhDdXN0b21pemVkTG9ja2VyKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsJCQkJCQotCQkJCX1lbHNlewotCQkJCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKHdhc0xvY2tlZCAhPSBsb2NrZWQpIHsKLQkJCQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQoZGVsZXRlQWN0aW9uCi0JCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikpOwotCQkJCQljdXRBY3Rpb24uc2V0RW5hYmxlZChjdXRBY3Rpb24KLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSk7Ci0JCQkJCXBhc3RlQWN0aW9uLnNldEVuYWJsZWQocGFzdGVBY3Rpb24KLQkJCQkJCQkudXBkYXRlU2VsZWN0aW9uKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKSk7Ci0JCQkJCWJvb2xlYW4gZW5hYmxlZCA9ICFsb2NrZWQ7Ci0JCQkJCXJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCQltb3ZlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQkJCQotCQkJCQkvL2Fzc2lnbkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCQl1bmFzc2lnbkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCQlyZWFzc2lnbkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCQkvL2N1c3RvbUNhdGVnb3J5RGVlcENvcHlBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHVwZGF0ZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewkJCQotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkKLQkJCXJlbmFtZUFjdGlvbi5zZXRBY3RpdmVXb3JrYmVuY2hQYXJ0KExpYnJhcnlWaWV3LnRoaXMpOwotCQkJY2FuUmVuYW1lID0gcmVuYW1lQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWwpOwotCi0vLwkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoc2VsKTsKLQkJCWlmKFZpZXdIZWxwZXIuaGFzQ3VzdG9taXplZExvY2tlcihzZWwpICl7CQkJCQkKLQkJCQlsb2NrZWQgPSBWaWV3SGVscGVyLmlzTG9ja2VkV2l0aEN1c3RvbWl6ZWRMb2NrZXIoc2VsKTsKLQkJCX1lbHNlewotCQkJCWxvY2tlZCA9IFZpZXdIZWxwZXIuaXNMb2NrZWQoc2VsKTsKLQkJCX0KLQkJCQotCQkJYm9vbGVhbiBlbmFibGVkID0gIWxvY2tlZDsKLQkJCWlmKGNhblJlbmFtZSAmJiAhZW5hYmxlZCkgewotCQkJCXJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJfQotCQkJbW92ZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCi0JCQl1bmFzc2lnbkFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJcmVhc3NpZ25BY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQotCQkJY2FuTW92ZSA9IGNhbk1vdmUoc2VsKTsKLQkJCQotCQkJY2FuQXNzaWduID0gYXNzaWduQWN0aW9uLnVwZGF0ZVNlbGVjdGlvbihzZWwpOwotCi0JCQlpZiAoIWxvY2tlZCAmJiBzZWwuc2l6ZSgpID09IDEKLQkJCQkJJiYgc2VsLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXJlcGxhY2VBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVwbGFjZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQotCQkJaWYgKHNlbC5zaXplKCkgPT0gMSkgewotCQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcCgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCW9wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbgotCQkJCQkJLnNldEVuYWJsZWQob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJCQkJCSYmICFUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgb2JqKSk7Ci0JCQkJc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24KLQkJCQkJCS5zZXRFbmFibGVkKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuTGlicmFyeUFjdGlvbkJhckNvbnRyaWJ1dG9yI2VuYWJsZUdsb2JhbEVkaXRNZW51KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuYWJsZUdsb2JhbEVkaXRNZW51KCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkVkaXRpbmdEb21haW5BY3Rpb25CYXJDb250cmlidXRvciNhZGRHbG9iYWxBY3Rpb25zKElNZW51TWFuYWdlcikKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQlzdXBlci5hZGRHbG9iYWxBY3Rpb25zKG1lbnVNYW5hZ2VyKTsKLQkJCW1lbnVNYW5hZ2VyLmluc2VydEFmdGVyKCJmaXhlZC1hZGRpdGlvbnMiLCBuZXdQbHVnaW5BY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gY2FuTW92ZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpCi0JCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKQotCQkJCQkJJiYgIVRuZ1V0aWwuaXNQcmVkZWZpbmVkKChNZXRob2RFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkcyBTZXBhcmF0b3JzIGZvciBlZGl0b3IgYWRkaXRpb25zIHRvIHRoZSB0b29sIGJhci4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0vLwkJCXRvb2xCYXJNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJtZXRob2Qtc2V0dGluZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJdG9vbEJhck1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoIm1ldGhvZC1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXBlcmZvcm1MaWJyYXJ5VmFsaWRhdGlvbkFjdGlvbi5zZXRJZChQRVJGT1JNX0lEKTsKLQkJCWlmIChBdXRob3JpbmdVSVByZWZlcmVuY2VzLmdldEVuYWJsZUxpYnJhcnlWYWxpZGF0aW9uKCkpIHsKLQkJCQl0b29sQmFyTWFuYWdlci5hZGQocGVyZm9ybUxpYnJhcnlWYWxpZGF0aW9uQWN0aW9uKTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBMaWJyYXJ5QWN0aW9uQmFyQ29udHJpYnV0b3IjbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIpIHsKLQkJCWNoZWNrTG9ja2VkKCk7Ci0JCQkKLQkJCQotCi0JCQkvLyBBZGQgb3VyIHN0YW5kYXJkIG1hcmtlci4KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmaXhlZC1hZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJmaXhlZC1hZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigiZWRpdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBBZGQgdGhlIGVkaXQgbWVudSBhY3Rpb25zLgotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxpYnJhcnlWaWV3RWRpdEFjdGlvbikpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGNvcHlBY3Rpb24pKTsKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShwYXN0ZUFjdGlvbikpOwotCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZGVsZXRlQWN0aW9uKSk7Ci0JCQlpZiAoY2FuUmVuYW1lKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKHJlbmFtZUFjdGlvbikpOwotCQkJfQotCQkJaWYgKGNhbk1vdmUpIHsKLQkJCQltZW51TWFuYWdlci5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obW92ZUFjdGlvbikpOwotCQkJfQotCQkJCi0JCQlpZiAoY2FuQXNzaWduKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFzc2lnbkFjdGlvbikpOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSh1bmFzc2lnbkFjdGlvbikpOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShyZWFzc2lnbkFjdGlvbikpOwotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShjdXN0b21DYXRlZ29yeURlZXBDb3B5QWN0aW9uKSk7CQkJCQotCQkJfQotCi0JCQltZW51TWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigidmlldyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG9wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLQkJCQkJCW9wZW5WYXJpYWJpbGl0eURpYWxvZ0FjdGlvbikpOwotCQkJfQotCQkJaWYgKHNob3dJblJlc291cmNlTmF2aWdhdG9yQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKAotCQkJCQkJc2hvd0luUmVzb3VyY2VOYXZpZ2F0b3JBY3Rpb24pKTsKLQkJCX0KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCQkvLyBBZGQgb3VyIG90aGVyIHN0YW5kYXJkIG1hcmtlciB3aGVyZSBvdGhlciBwbHVnaW5zIHdpbGwgY29udHJpYnV0ZQotCQkJLy8gbWVudQotCQkJLy8KLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCJhZGRpdGlvbnMtZW5kIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCWFkZEdsb2JhbEFjdGlvbnMobWVudU1hbmFnZXIpOwotCi0JCQlpZiAoIWxvY2tlZCkgewotCQkJCU1lbnVNYW5hZ2VyIHN1Ym1lbnVNYW5hZ2VyID0gbnVsbDsKLQkJCQlzdWJtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9DcmVhdGVDaGlsZF9tZW51X2l0ZW0pOwotCQkJCXBvcHVsYXRlTWFuYWdlcihzdWJtZW51TWFuYWdlciwgY3JlYXRlQ2hpbGRBY3Rpb25zLCBudWxsKTsKLQkJCQltZW51TWFuYWdlci5pbnNlcnRCZWZvcmUoImZpeGVkLWFkZGl0aW9ucyIsIHN1Ym1lbnVNYW5hZ2VyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0vLwkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgQWN0aW9uKCJUZXN0IikgewotLy8JCQkJLyoKLS8vCQkJCSAqIChub24tSmF2YWRvYykKLS8vCQkJCSAqCi0vLwkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLS8vCQkJCSAqLwotLy8JCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJCS8vIHJlbG9hZAotLy8JCQkJCS8vCi0vLy8vCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotLy8vLwkJCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0vLy8vCQkJCQkJT2JqZWN0IG9iamVjdCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikKLS8vLy8JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0vLy8vCQkJCQkJb2JqZWN0ID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLS8vLy8JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0vLy8vCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0vLy8vCQkJCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoSUxpYnJhcnlSZXNvdXJjZVNldCkgZQotLy8vLwkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLS8vLy8JCQkJCQkJcmVzb3VyY2VTZXQudW5sb2FkKGUpOwotLy8vLwkJCQkJCQlVUkkgdXJpID0gZS5lUHJveHlVUkkoKTsKLS8vLy8JCQkJCQkJRU9iamVjdCBuZXdPYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KGUsIHVyaSwKLS8vLy8JCQkJCQkJCQl0cnVlKTsKLS8vLy8JCQkJCQkJcmVmcmVzaFZpZXdzKCk7Ci0vLy8vCQkJCQkJfQotLy8vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJCS8vIHBsdWdpbi9jb25maWcgZm9sZGVyCi0vLwkJCQkJLy8KLS8vCQkJCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpOwotLy8JCQkJCWlmKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0vLwkJCQkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIGZpbGVQZXJzaXN0ZXIgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHBlcnNpc3RlcjsKLS8vCQkJCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotLy8JCQkJCQl0cnkgewotLy8JCQkJCQkJRmlsZSBmaWxlID0gZmlsZVBlcnNpc3Rlci5jcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIoInBsdWdpbjEwMCIsIGxpYnJhcnkpOwotLy8JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwbHVnaW4gZGlyOiAiICsgZmlsZSk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLS8vCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJdHJ5IHsKLS8vCQkJCQkJCUZpbGUgZmlsZSA9IGZpbGVQZXJzaXN0ZXIuZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGlicmFyeSk7Ci0vLwkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNvbmZpZyBkaXI6ICIgKyBmaWxlKTsKLS8vCQkJCQkJfQotLy8JCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotLy8JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfSk7Ci0JCQkKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciNyZWZyZXNoVmlld2VyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpZXdlcihmaW5hbCBWaWV3ZXIgdmlld2VyKSB7Ci0JCQlpZiAodmlld2VyID09IExpYnJhcnlWaWV3LnRoaXMuZ2V0Vmlld2VyKCkpIHsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDMpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSk7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gUmVmcmVzaCBhbGwgbG9hZGVkIHJlc291cmNlcyBhbmQgbG9hZCBuZXdseSBhZGRlZCByZXNvdXJjZXMKLQkJCQkJCQkvLwotCQkJCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBtYW5hZ2VyCi0JCQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJCQlJTGlicmFyeVJlc291cmNlU2V0IGxpYlJlc291cmNlU2V0OwotCQkJCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0Ci0JCQkJCQkJCQkJJiYgKGxpYlJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KQotCQkJCQkJCQkJCQkJLmdldFBlcnNpc3RlbmNlVHlwZSgpCi0JCQkJCQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJCQkJCQlTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRSkpIHsKLQkJCQkJCQkJCQotCQkJCQkJCQkJbGliUmVzb3VyY2VTZXQubG9hZE5ld1Jlc291cmNlcygpOwotCQkJCQkJCQkJCi0JCQkJCQkJCQlMaXN0IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlMaXN0IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KAotCQkJCQkJCQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyCi0JCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJCVN0cmluZyBsb2MgPSByZXNvdXJjZS5nZXRVUkkoKQotCQkJCQkJCQkJCQkJLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyCi0JCQkJCQkJCQkJCQkuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihsb2MpOwotCQkJCQkJCQkJCWlmICh3c1JlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCQl9IGVsc2UgaWYgKCF3c1JlcwotCQkJCQkJCQkJCQkJLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCQkJCQkJCQljaGFuZ2VkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbW9uaXRvci53b3JrZWQoMik7Ci0JCQkJCQkJCQlpZiAocmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkKLQkJCQkJCQkJCQkJJiYgY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQlkb1JlZnJlc2gocmVtb3ZlZFJlc291cmNlcywKLQkJCQkJCQkJCQkJCWNoYW5nZWRSZXNvdXJjZXMsIG51bGwsIGZhbHNlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpCi0JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpCi0JCQkJCQkJLmdldFByb2dyZXNzU2VydmljZSgpLnJ1bkluVUkoY29udGV4dCwgcnVubmFibGUsCi0JCQkJCQkJCQludWxsKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfcmVmcmVzaEVycm9yVGl0bGU7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJdGl0bGUsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXN1cGVyLnJlZnJlc2hWaWV3ZXIodmlld2VyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2NyZWF0ZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBjcmVhdGVBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJSUxpYnJhcnlBY3Rpb25CYXJDb250cmlidXRvciBhY3Rpb25CYXIgPSBuZXcgTGlicmFyeVZpZXdBY3Rpb25CYXJDb250cmlidXRvcigKLQkJCQllZGl0aW5nRG9tYWluKTsKLQkJcmV0dXJuIGFjdGlvbkJhcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNjcmVhdGVDb250ZXh0TWVudUZvcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udGV4dE1lbnVGb3IoZmluYWwgU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIuY3JlYXRlQ29udGV4dE1lbnVGb3Iodmlld2VyKTsKLQkJaW50IGRuZE9wZXJhdGlvbnMgPSBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTks7Ci0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10geyBIVE1MVHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwKLQkJCQlUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSwgTG9jYWxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH07Ci0JCXZpZXdlci5hZGREcmFnU3VwcG9ydChkbmRPcGVyYXRpb25zLCB0cmFuc2ZlcnMsCi0JCQkJbmV3IExpYnJhcnlWaWV3ZXJEcmFnQWRhcHRlcih2aWV3ZXIpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNtZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCXN1cGVyLm1lbnVBYm91dFRvU2hvdyhtZW51TWFuYWdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0I2luaXQob3JnLmVjbGlwc2UudWkuSVZpZXdTaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdTaXRlIHNpdGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmluaXQoc2l0ZSk7Ci0JCi0JCS8vIGFkZCBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZm9yIGxpYnJhcnkgdmFsaWRhdGlvbiBwcmVmZXJlbmNlCi0JCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJaWYgKGV2ZW50Ci0JCQkJCQkJCS5nZXRQcm9wZXJ0eSgpCi0JCQkJCQkJCS5lcXVhbHMoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlQcmVmZXJlbmNlcy5FTkFCTEVfTElCUkFSWV9WQUxJREFUSU9OKSkgewotCQkJCQkJCUJvb2xlYW4gZW5hYmxlZCA9IChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCQkJCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciA9IGdldFZpZXdTaXRlKCkKLQkJCQkJCQkJLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOwotCQkJCQkKLQkJCQkJCQlpZiAoZW5hYmxlZCAhPSBudWxsICYmIGVuYWJsZWQuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJcGVyZm9ybUxpYnJhcnlWYWxpZGF0aW9uQWN0aW9uCi0JCQkJCQkJCQkJLnNldElkKFBFUkZPUk1fSUQpOwotCQkJCQkJCQl0b29sQmFyTWFuYWdlci5pbnNlcnRBZnRlcigiYWRkaXRpb25zIiwgcGVyZm9ybUxpYnJhcnlWYWxpZGF0aW9uQWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSB0b29sQmFyTWFuYWdlci5nZXRJdGVtcygpOwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gKElDb250cmlidXRpb25JdGVtKSBpdGVtc1tpXTsKLQkJCQkJCQkJCWlmIChpdGVtLmdldElkKCkuZXF1YWxzKFBFUkZPUk1fSUQpKQotCQkJCQkJCQkJCXRvb2xCYXJNYW5hZ2VyLnJlbW92ZShpdGVtKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQl0b29sQmFyTWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuQWJzdHJhY3RCYXNlVmlldyNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0UmVmcmVzaEhhbmRsZXIobnVsbCk7Ci0KLQkJaWYgKGZMYXlvdXRBY3Rpb25TZXQgIT0gbnVsbCkJCi0JCQlmTGF5b3V0QWN0aW9uU2V0LmRpc3Bvc2UoKTsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCWlmIChkb3VibGVDbGlja0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihkb3VibGVDbGlja0xpc3RlbmVyKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBJdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuIFByb2Nlc3NDb21wb25lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmoKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudDsKLQkJZm9yIChwYXJlbnQgPSBvYmo7IChwYXJlbnQgIT0gbnVsbCAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKTspIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gKFByb2Nlc3NDb21wb25lbnQpIHBhcmVudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gZXh0ZW5kcwotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIHsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGVyck1zZzsKLQotCQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBlcnJNc2c7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBvcGVucyBhIE1ldGhvZCBMaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gdGhlIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVN0YXR1c1dvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgU3RhdHVzV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCi0JCQkvLyBUaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBnZXRzIGludm9rZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHJ1bnMuCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5pbmdMaWJyYXJ5VGFza19uYW1lLAotCQkJCQkJMik7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBYTUlMaWJyYXJ5VXRpbAotCQkJCQkJCS5vcGVuTWV0aG9kTGlicmFyeShwYXRoKTsKLQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeSgKLQkJCQkJCQlsaWJyYXJ5KTsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuc2V0U2F2ZWRMaWJyYXJ5UGF0aChwYXRoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJaWYgKGV4IGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQkJCQkJaWYgKG1lc3NhZ2Uuc3RhcnRzV2l0aCgiIyMjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBwcm9qZWN0RmlsZU5hbWUgPSBtZXNzYWdlLnN1YnN0cmluZygzKTsKLQkJCQkJCQlTdHJpbmcgcHJvbXB0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkVsZW1lbnRzVmlld18zNSwKLQkJCQkJCQkJCShuZXcgT2JqZWN0W10geyBwcm9qZWN0RmlsZU5hbWUgfSkpOwotCQkJCQkJCWlmIChNc2dCb3gucHJvbXB0KHByb21wdCwgU1dULlJFVFJZIHwgU1dULkNBTkNFTCkgPT0gU1dULlJFVFJZKSB7Ci0JCQkJCQkJCW9wZW5MaWJyYXJ5KHBhdGgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMub3BlbkxpYnJhcnlFcnJvcl9tc2csCi0JCQkJCQkJCQkJZXgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBUaGlzIHJ1bnMgdGhlIG9wdGlvbnMsIGFuZCBzaG93cyBwcm9ncmVzcy4KLQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coZ2V0U2l0ZSgpLmdldFNoZWxsKCkpLnJ1bih0cnVlLCBmYWxzZSwKLQkJCQkJb3BlcmF0aW9uKTsKLQkJCWlmIChvcGVyYXRpb24uZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJCWdldFNpdGUoKS5nZXRQYWdlKCkuY2xvc2VBbGxFZGl0b3JzKGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5BYnN0cmFjdEJhc2VWaWV3I2hhbmRsZUFjdGl2YXRlKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUFjdGl2YXRlKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJc3VwZXIuaGFuZGxlQWN0aXZhdGUocGFydCk7Ci0KLQkJLy8gVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLgotCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbWV0aG9kIGxpYnJhcnkgb3BlbiBpcyBub3QgY2xvc2VkLgotCQlYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeVByb2plY3QoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKQotCQkJCS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuU2F2ZWFibGVMaWJyYXJ5Vmlld1BhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCS8vIFRoaXMgdmlldyBzaG91bGQgbm90IHBhcnRpY2lwYXRlIGluIGFsbCB0aGUgc2F2ZSBjb21tYW5kcy4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5TYXZlYWJsZUxpYnJhcnlWaWV3UGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCQotCS8qKgotCSAqIFVzZWQgYnkgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLkxpbmtXaXRoRWRpdG9yIEdpdmVuIGFuCi0JICogb2JqZWN0IHRoYXQgaXMgYSBNZXRob2RFbGVtZW50LCBzZWxlY3RzIHRoYXQgb2JqZWN0IGluIHRoZSBMaWIgTmF2Ci0JICogCi0JICogQHBhcmFtIG8KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb25Ub1ZpZXdlcihPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpKQotCQkJcmV0dXJuOwotCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXN1cGVyLnNldFNlbGVjdGlvblRvVmlld2VyKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHsgbyB9KSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgbyk7Ci0KLQkJCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBwbHVnaW5BZGFwdGVyID0gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkuZ2V0QWRhcHRlcihwbHVnaW4sIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0KLQkJCU1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgbGlicmFyeUFkYXB0ZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCQkuZ2V0QWRhcHRlcihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuY2xhc3MpOwotCi0JCQkvLyBleHBhbmQgcGx1Z2luIHBhY2thZ2VzCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIHBsdWdpblRyZWVBZGFwdGVyID0gbGlicmFyeUFkYXB0ZXIuZ2V0UGx1Z2luSXRlbVByb3ZpZGVyKHBsdWdpbik7Ci0JCQl3aGlsZSAocGx1Z2luVHJlZUFkYXB0ZXIgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSB7Ci0JCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHBsdWdpblRyZWVBZGFwdGVyLCB0cnVlKTsKLQkJCQlwbHVnaW5UcmVlQWRhcHRlciA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilwbHVnaW5UcmVlQWRhcHRlcikuZ2V0UGx1Z2luSXRlbVByb3ZpZGVyKHBsdWdpbik7Ci0JCQl9Ci0JCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUocGx1Z2luLCB0cnVlKTsKLQotCQkJCi0JCQlpZiAobyBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsJCQkJCi0JCQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KW8pOwotCQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCQlvID0gcHJvYy5lQ29udGFpbmVyKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50IHx8IG8gaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCi0JCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHBsdWdpbkFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGx1Z2luKQotCQkJCQkJLnRvQXJyYXkoKVsxXSwgdHJ1ZSk7Ci0JCQkJLy8gRXhwYW5kIHRoZSBwcm9jZXNzIHBhY2thZ2VzLgotCQkJCWV4cGFuZFRyZWVWaWV3ZXJQYWNrYWdlcygoKE1ldGhvZEVsZW1lbnQpIG8pLmVDb250YWluZXIoKSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIG1ldGhvZENvbnRlbnRQa2cgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBwbHVnaW5BZGFwdGVyCi0JCQkJCQkuZ2V0Q2hpbGRyZW4ocGx1Z2luKS50b0FycmF5KClbMF07Ci0JCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKG1ldGhvZENvbnRlbnRQa2csIHRydWUpOwotCi0JCQkJaWYgKG8gaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewkJCQkJCi0JCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3RDQyA9IFRuZ1V0aWwKLQkJCQkJCQkuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbik7Ci0JCQkJCQkJCQkJCi0JCQkJCS8vIGZpbmQgdGhlIHRyZWUgcGF0aCB0byB0aGUgY3VzdG9tIGNhdGVnb3J5IGZyb20gdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5Ci0JCQkJCS8vCi0JCQkJCWZpbmFsIExpc3Q8T2JqZWN0PiB0cmVlUGF0aCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQlmb3IoQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG87IGNjICE9IHJvb3RDQzspIHsKLQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBjYyk7Ci0JCQkJCQljYyA9IChDdXN0b21DYXRlZ29yeSkgQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYykuZ2V0KDApOwkJCQkJCSAKLQkJCQkJfQotCQkJCQkKLQkJCQkJbyA9IGV4cGFuZFRyZWUocm9vdENDLCB0cmVlUGF0aCk7Ci0JCQkJCQotCQkJCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCQlPYmplY3Qgc3RkQ2F0cyA9IG1ldGhvZENvbnRlbnRQa2cuZ2V0Q2hpbGRyZW4obykudG9BcnJheSgpWzFdOwotCQkJCQkJCQkKLQkJCQkJLy8gZmluZCB0aGUgdHJlZSBwYXRoIHRvIHRoZSBjYXRlZ29yeSBmcm9tIHRoZSByb290ICJTdGFuZGFyZCBDYXRlZ29yaWVzIiBjYXRlZ29yeQotCQkJCQkvLwotCQkJCQlmaW5hbCBMaXN0PE9iamVjdD4gdHJlZVBhdGggPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCQkvLyBkaXNjaXBsaW5lcyBjYW4gbmVzdAotCQkJCQkJT2JqZWN0IGRpcyA9IG87Ci0JCQkJCQlkbyB7Ci0JCQkJCQkJdHJlZVBhdGguYWRkKDAsIGRpcyk7Ci0JCQkJCQkJTGlzdCBwYXJlbnREaXNjID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZSgoRGlzY2lwbGluZSlkaXMpOwotCQkJCQkJCWlmIChwYXJlbnREaXNjLmlzRW1wdHkoKSkgYnJlYWs7Ci0JCQkJCQkJZGlzID0gcGFyZW50RGlzYy5nZXQoMCk7CQkJCQkJIAotCQkJCQkJfSB3aGlsZSAodHJ1ZSk7Ci0JCQkJCQkvLyBnZXQgZGlzY2lwbGluZSBncm91cAotCQkJCQkJaWYgKCFBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKWRpcykuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJRGlzY2lwbGluZUdyb3VwaW5nIGRnID0gKERpc2NpcGxpbmVHcm91cGluZykgQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZUdyb3VwcygoRGlzY2lwbGluZSlkaXMpLmdldCgwKTsKLQkJCQkJCQl0cmVlUGF0aC5hZGQoMCwgZGcpOwotCQkJCQkJfQotCQkJCQkJLy8gZ2V0ICJEaXNjaXBsaW5lcyIKLQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBUbmdVdGlsLmdldERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKHBsdWdpbikpOwotCQkJCQkJbyA9IGV4cGFuZFRyZWUoc3RkQ2F0cywgdHJlZVBhdGgpOwotCQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQkJCQkvLyByb2xlc2V0cyBjYW5ub3QgbmVzdAotCQkJCQkJdHJlZVBhdGguYWRkKDAsIG8pOwotCQkJCQkJUm9sZVNldEdyb3VwaW5nIHJzZyA9IChSb2xlU2V0R3JvdXBpbmcpIEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpbykuZ2V0KDApOwkJCQkJCSAKLQkJCQkJCXRyZWVQYXRoLmFkZCgwLCByc2cpOwotCQkJCQkJLy8gZ2V0ICJSb2xlU2V0cyIKLQkJCQkJCXRyZWVQYXRoLmFkZCgwLCBUbmdVdGlsLmdldFJvbGVTZXRzSXRlbVByb3ZpZGVyKHBsdWdpbikpOwotCQkJCQkJbyA9IGV4cGFuZFRyZWUoc3RkQ2F0cywgdHJlZVBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHN0ZENhdHMsIHRydWUpOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3QgY29yZUNvbnRlbnQgPSBtZXRob2RDb250ZW50UGtnLmdldENoaWxkcmVuKG8pCi0JCQkJCQkJLnRvQXJyYXkoKVswXTsKLQkJCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKGNvcmVDb250ZW50LCB0cnVlKTsKLQotCQkJCQkvLyBFeHBhbmQgdGhlIGNvbnRlbnQgcGFja2FnZXMuCi0JCQkJCWV4cGFuZFRyZWVWaWV3ZXJQYWNrYWdlcygoKE1ldGhvZEVsZW1lbnQpIG8pLmVDb250YWluZXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQotCQlzdXBlci5zZXRTZWxlY3Rpb25Ub1ZpZXdlcihBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IG8gfSkpOwotCi0JCWlmKG8gaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICYmIG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCS8vIG9wZW4gdGhlIHByb2Nlc3MgaW4gaXRzIGVkaXRvciBhbmQgc2VsZWN0IHRoZSBicmVha2Rvd24gZWxlbWVudAotCQkJLy8KLQkJCUlFZGl0b3JLZWVwZXIuUkVGRVJFTkNFLmdldEVkaXRvcktlZXBlcigpLm9wZW5FZGl0b3Iobyk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmZpbmRFZGl0b3IobmV3IE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCgoTWV0aG9kRWxlbWVudCkgbykpOwotCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgUHJvY2Vzc0VkaXRvcikgewotCQkJCVByb2Nlc3NFZGl0b3IgcHJvY0VkaXRvciA9ICgoUHJvY2Vzc0VkaXRvcillZGl0b3IpOwotCQkJCVN0cmluZyBwYWdlSWQ7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgfHwgb2JqZWN0IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJcGFnZUlkID0gUHJvY2Vzc0VkaXRvci5UQV9GT1JNX0lEOwotCQkJCX0KLQkJCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlwYWdlSWQgPSBQcm9jZXNzRWRpdG9yLldQQlNfRk9STV9JRDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBhZ2VJZCA9IFByb2Nlc3NFZGl0b3IuV0JTX0ZPUk1fSUQ7Ci0JCQkJfQotCQkJCXByb2NFZGl0b3Iuc2V0QWN0aXZlUGFnZShwYWdlSWQpOwotCQkJCXByb2NFZGl0b3Iuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYmplY3QpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBleHBhbmRUcmVlKE9iamVjdCByb290LCBMaXN0IHRyZWVQYXRoKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSByb290OwotCQlpbnQgc2l6ZSA9IHRyZWVQYXRoLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBlID0gdHJlZVBhdGguZ2V0KGkpOwotCQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZFN0YXRlKHBhcmVudCwgdHJ1ZSk7Ci0JCQkvLyBnZXQgd3JhcHBlcgotCQkJLy8KLQkJCUxpc3Qgbm90aWZ5Q2hhbmdlZExpc3RlbmVycyA9IFRuZ1V0aWwuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycyhhZGFwdGVyRmFjdG9yeSwgZSk7Ci0JCQlpZiAoIW5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQkJZmluZF93cmFwcGVyOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub3RpZnlDaGFuZ2VkTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZihsaXN0ZW5lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJCQkmJiBUbmdVdGlsLnVud3JhcChsaXN0ZW5lcikgPT0gZSkgewotCQkJCQkJRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIGxpc3RlbmVyOwotCQkJCQkJZm9yKDt3cmFwcGVyICE9IG51bGwgJiYgd3JhcHBlci5nZXRPd25lcigpICE9IHBhcmVudDsgCi0JCQkJCQkJd3JhcHBlciA9IFRuZ1V0aWwuZ2V0V3JhcHBlcih3cmFwcGVyLmdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSwgZSkpIHsJCQkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQkJCXBhcmVudCA9IHdyYXBwZXI7Ci0JCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnQgPSBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFRyZWVWaWV3ZXJQYWNrYWdlcyhFT2JqZWN0IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSB8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWV4cGFuZFRyZWVWaWV3ZXJQYWNrYWdlcyhlLmVDb250YWluZXIoKSk7Ci0JCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkU3RhdGUoZSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLklSZWZyZXNoSGFuZGxlciNyZWZyZXNoKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUNvbnRyb2wgY3RybCA9IGdldFZpZXdlcigpLmdldENvbnRyb2woKTsKLQkJaWYgKGN0cmwgPT0gbnVsbCB8fCBjdHJsLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQlpZiAoY3RybC5nZXREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkgewotCQkJZG9SZWZyZXNoKGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJfSBlbHNlIHsKLQkJCWN0cmwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9SZWZyZXNoKG51bGwpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBibG9ja2luZ1JlZnJlc2goZmluYWwgQXJyYXlMaXN0IHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlmaW5hbCBBcnJheUxpc3QgY2hhbmdlZFJlc291cmNlcywKLQkJCWZpbmFsIENvbGxlY3Rpb24gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsCi0JCQlmaW5hbCBib29sZWFuIHJlZnJlc2hWaWV3cywgU2hlbGwgc2hlbGwpIHsKLQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vbml0b3IKLQkJCQkJCS5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLl9VSV9SZWZyZXNoVmlld2VyX21lbnVfaXRlbSk7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCWRvUmVmcmVzaChyZW1vdmVkUmVzb3VyY2VzLCBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJCQkJCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLCByZWZyZXNoVmlld3MpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCUlSdW5uYWJsZUNvbnRleHQgY29udGV4dCA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCQl0cnkgewotCQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpCi0JCQkJCS5ydW5JblVJKAotCQkJCQkJCWNvbnRleHQsCi0JCQkJCQkJcnVubmFibGUsCi0JCQkJCQkJbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShMaWJyYXJ5U2VydmljZQotCQkJCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9yZWZyZXNoRXJyb3JUaXRsZTsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsCi0JCQkJCWUudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNdXN0IGJlIHN5bmNocm9uaXplZCB0byBhdm9pZCBzdGVwcGluZyBvbiBlYWNoIG90aGVyIGluIHJlbG9hZGluZwotCSAqIHJlc291cmNlcy9yZWZyZXNoaW5nIFVJCi0JICogCi0JICogQHBhcmFtIHJlbW92ZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcwotCSAqIEBwYXJhbSBhZGRlZFdvcmtzcGFjZVJlc291cmNlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiBJUmVzb3VyY2Ugb2JqZWN0cyB0aGF0IGFyZSBqdXN0IG5ld2x5IGFkZGVkIHRvCi0JICogICAgICAgICAgICB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSByZWZyZXNoVmlld3MKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGRvUmVmcmVzaChDb2xsZWN0aW9uIHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMsIENvbGxlY3Rpb24gYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMsCi0JCQlib29sZWFuIHJlZnJlc2hWaWV3cykgewotCQlIYXNoU2V0IGVkaXRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoIXJlbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVSZW1vdmVkUmVzb3VyY2VzKHJlbW92ZWRSZXNvdXJjZXMsIGVkaXRvcnNUb1JlZnJlc2gpOwotCQkJcmVmcmVzaFZpZXdzID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVDaGFuZ2VkUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIGVkaXRvcnNUb1JlZnJlc2gsCi0JCQkJCXJlZnJlc2hWaWV3cyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocmVmcmVzaFZpZXdzKSB7Ci0JCQkJcmVmcmVzaFZpZXdzKCk7Ci0JCQl9Ci0KLQkJCWlmICghZWRpdG9yc1RvUmVmcmVzaC5pc0VtcHR5KCkpIHsKLQkJCQkvLyByZWZyZXNoIHRoZSBlZGl0b3JzIHRoYXQgaGFuZGxlUmVtb3ZlZFJlc291cmNlcyByZXF1ZXN0ZWQKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkaXRvcnNUb1JlZnJlc2guaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVkaXRvciA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvcikgewotCQkJCQkJKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMgIT0gbnVsbAotCQkJCSYmICFhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbWdyLmdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkKLQkJCQkJCQkubG9hZE5ld1Jlc291cmNlcyhhZGRlZFdvcmtzcGFjZVJlc291cmNlcyk7Ci0JCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkuZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpLnZhbGlkYXRlQWxsTWFya2VycygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZpZXdPYmplY3QoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJJiYgIShvIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uCi0JCQkJCQl8fCBvIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQgfHwgKG8gaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSAmJiBVbWFVdGlsCi0JCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudCgoTWV0aG9kRWxlbWVudCkgbykgPT0gbnVsbCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2goSVJlZnJlc2hFdmVudCBldmVudCwgU2hlbGwgc2hlbGwpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJSZWZyZXNoZWQgb2JqZWN0czogIiArIGV2ZW50LmdldFJlZnJlc2hlZE9iamVjdHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIHJlZnJlc2ggPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXZlbnQuZ2V0UmVmcmVzaGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1ZpZXdPYmplY3QoZSkpIHsKLQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocmVmcmVzaCkgewotCQkJcmVmcmVzaFZpZXdzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIExpYnJhcnkgVmlldwotCSAqIAotCSAqIEBwYXJhbSBzaGVsbAotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlZnJlc2goU2hlbGwgc2hlbGwpIHsKLQkJZmluYWwgYm9vbGVhbiByZWZyZXNoVmlld3MgPSAhUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFJlbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcygpLmlzRW1wdHkoKQotCQkJCXx8ICFSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRSZXNvdXJjZXMoKS5pc0VtcHR5KCk7Ci0JCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdChSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UmVtb3ZlZFJlc291cmNlcygpKTsKLQkJQXJyYXlMaXN0IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkpOwotCQlBcnJheUxpc3QgYWRkZWRXc1Jlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEFkZGVkV29ya3NwYWNlUmVzb3VyY2VzKCkpOwotCi0JCWlmICghcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkgfHwgIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJfHwgIWFkZGVkV3NSZXNvdXJjZXMuaXNFbXB0eSgpIHx8IHJlZnJlc2hWaWV3cykgewotCQkJYmxvY2tpbmdSZWZyZXNoKHJlbW92ZWRSZXNvdXJjZXMsIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQkJCWFkZGVkV3NSZXNvdXJjZXMsIHJlZnJlc2hWaWV3cywgc2hlbGwpOwotCQl9Ci0KLQkJaWYgKCFyZW1vdmVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlbW92ZWRSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCXJlbW92ZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWlmICghY2hhbmdlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRDaGFuZ2VkUmVzb3VyY2VzKCkucmVtb3ZlQWxsKAotCQkJCQljaGFuZ2VkUmVzb3VyY2VzKTsKLQkJfQotCQlpZiAoIWFkZGVkV3NSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKS5yZW1vdmVBbGwoCi0JCQkJCWFkZGVkV3NSZXNvdXJjZXMpOwotCQl9Ci0JCWlmIChyZWZyZXNoVmlld3MpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKQotCQkJCQkuY2xlYXIoKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRBZGRlZFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlczIKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gaGFuZGxlUmVtb3ZlZFJlc291cmNlcyhDb2xsZWN0aW9uIHJlbW92ZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGVkaXRvcnNUb1JlZnJlc2gpIHsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdCBkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCByZW1vdmVkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdChyZW1vdmVkUmVzb3VyY2VzKTsKLQkJaWYgKGVkaXRvcnNUb1JlZnJlc2ggPT0gbnVsbCkgewotCQkJZWRpdG9yc1RvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkvLyBmaW5kIGFsbCBlZGl0b3Igd2l0aCBkaXJ0eSBjb25mbGljdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiBlZGl0b3IuaXNEaXJ0eSgpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvcklucHV0IGlucHV0ID0gKE1ldGhvZEVsZW1lbnRFZGl0b3JJbnB1dCkgZWRpdG9yCi0JCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGlucHV0LmdldE1ldGhvZEVsZW1lbnQoKSAhPSBudWxsID8gaW5wdXQKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KCkuZVJlc291cmNlKCkgOiBudWxsOwotCQkJCWlmICghcmVtb3ZlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJQ29sbGVjdGlvbiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkJLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgcmVtb3ZlZFJlc291cmNlTGlzdAotCQkJCQkJCS5zaXplKCk7IGorKykgewotCQkJCQkJcmVzb3VyY2UgPSAoUmVzb3VyY2UpIHJlbW92ZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQkJZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LmFkZChlZGl0b3IpOwotCQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkID0gc2VsZWN0RGlydHlFZGl0b3JzKGRpcnR5RWRpdG9yc1dpdGhDb25mbGljdCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZWRpdG9yc1RvUmVmcmVzaC5hZGQoc2VsZWN0ZWRbaV0pOwotCQkJfQotCQl9Ci0KLQkJLy8gVW5sb2FkIHRoZSByZW1vdmVkIHJlc291cmNlcy4KLQkJUGVyc2lzdGVuY2VVdGlsLnVubG9hZChyZW1vdmVkUmVzb3VyY2VzKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCUNvbGxlY3Rpb24gdXNlZFJlc291cmNlcyA9ICgoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yKQotCQkJCQkJLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQljaGVja19yZXNvdXJjZTogZm9yIChpbnQgaiA9IDA7IGogPCByZW1vdmVkUmVzb3VyY2VMaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSByZW1vdmVkUmVzb3VyY2VMaXN0LmdldChqKTsKLQkJCQkJaWYgKHVzZWRSZXNvdXJjZXMuY29udGFpbnMocmVzb3VyY2UpKSB7Ci0JCQkJCQllZGl0b3JzVG9SZWZyZXNoLmFkZChlZGl0b3IpOwotCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY2hhbmdlZFJlc291cmNlcwotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzLAotCQkJQ29sbGVjdGlvbiBlZGl0b3JzVG9SZWZyZXNoLCBib29sZWFuIGZvcmNlUmVmcmVzaFZpZXdzKSB7Ci0JCWlmICghZm9yY2VSZWZyZXNoVmlld3MpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoYW5nZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UKLQkJCQkJCSYmICgoSUxpYnJhcnlSZXNvdXJjZSkgcmVzb3VyY2UpLmdldExvYWRTdGFtcCgpID4gbGFzdFJlZnJlc2hUaW1lU3RhbXApIHsKLQkJCQkJZm9yY2VSZWZyZXNoVmlld3MgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhhbmRsZUNoYW5nZWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcywgbnVsbCwKLQkJCQlmb3JjZVJlZnJlc2hWaWV3cywgZWRpdG9yc1RvUmVmcmVzaCk7Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlcyBMaWJyYXJ5IFZpZXcgd2hlbiByZXNvdXJjZXMgY2hhbmdlCi0JICogCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMKLQkgKiBAcGFyYW0gZWRpdG9yc05vdFRvUmVmcmVzaAotCSAqIEBwYXJhbSBmb3JjZVJlZnJlc2hWaWV3cwotCSAqIEBwYXJhbSBlZGl0b3JzVG9SZWZyZXNoCi0JICogQHJldHVybiBMaXN0IG9mIGNoYW5nZWQgcmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gaGFuZGxlQ2hhbmdlZFJlc291cmNlcyhDb2xsZWN0aW9uIGNoYW5nZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uIGVkaXRvcnNOb3RUb1JlZnJlc2gsIGJvb2xlYW4gZm9yY2VSZWZyZXNoVmlld3MsCi0JCQlDb2xsZWN0aW9uIGVkaXRvcnNUb1JlZnJlc2gpIHsKLQkJQ29udHJvbCBjdHJsID0gZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCA9PSBudWxsIHx8IGN0cmwuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IGdldFNpdGUoKS5nZXRQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUGFydD4gZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0ID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUGFydD4oKTsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oY2hhbmdlZFJlc291cmNlcyk7Ci0JCS8vIGZpbmQgYWxsIGVkaXRvciB3aXRoIGRpcnR5IGNvbmZsaWN0Ci0JCS8vCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclJlZmVyZW5jZSByZWZlcmVuY2UgPSBlZGl0b3JSZWZlcmVuY2VzW2ldOwotCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50RWRpdG9yICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkuZ2V0VXNlZFJlc291cmNlcygpOwotCQkJCWNoZWNrX3Jlc291cmNlOiBmb3IgKGludCBqID0gMDsgaiA8IGNoYW5nZWRSZXNvdXJjZUxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QuZ2V0KGopOwotCQkJCQlpZiAodXNlZFJlc291cmNlcy5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5hZGQoZWRpdG9yKTsKLQkJCQkJCWJyZWFrIGNoZWNrX3Jlc291cmNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsIEFycmF5TGlzdCBlZGl0b3JMaXN0VG9SZWZyZXNoID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZWRpdG9yc1RvUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQllZGl0b3JMaXN0VG9SZWZyZXNoLmFkZEFsbChlZGl0b3JzVG9SZWZyZXNoKTsKLQkJfQotCQlpZiAoIWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHJlc3VsdCA9IHNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnNXaXRoQ29uZmxpY3QpOwotCQkJaWYocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgZWRpdG9yID0gcmVzdWx0W2ldOwotCQkJCQlpZiAoKGVkaXRvcnNOb3RUb1JlZnJlc2ggPT0gbnVsbCB8fCAhZWRpdG9yc05vdFRvUmVmcmVzaAotCQkJCQkJCS5jb250YWlucyhlZGl0b3IpKQotCQkJCQkJCSYmIChlZGl0b3JzVG9SZWZyZXNoID09IG51bGwgfHwgIWVkaXRvcnNUb1JlZnJlc2gKLQkJCQkJCQkJCS5jb250YWlucyhlZGl0b3IpKSkgewotCQkJCQkJZWRpdG9yTGlzdFRvUmVmcmVzaC5hZGQoZWRpdG9yKTsKLQkJCQkJCWRpcnR5RWRpdG9yc1dpdGhDb25mbGljdC5yZW1vdmUoZWRpdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHJlbW92ZSBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgZGlydHkgZWRpdG9ycyB3aXRoIGNvbmZsaWN0IGZyb20gdGhlCi0JCQkvLyBjb2xsZWN0aW9uIG9mIGNoYW5nZWQgcmVzb3VyY2VzIGFmdGVyIHVwZGF0aW5nIGNhY2hlZCBtb2RpZmljYXRpb24gc3RhbXAKLQkJCS8vIHNvIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gcmVsb2FkIGFnYWluIHVudGlsIHRoZSBuZXh0IGV4dGVybmFsIGNoYW5nZQotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZGlydHlFZGl0b3JzV2l0aENvbmZsaWN0Ci0JCQkJCQkuZ2V0KGkpOwkJCQkKLQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gZWRpdG9yLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQl1c2VkUmVzb3VyY2VzLnJldGFpbkFsbChjaGFuZ2VkUmVzb3VyY2VMaXN0KTsKLQkJCQllZGl0b3IudXBkYXRlUmVzb3VyY2VJbmZvcyh1c2VkUmVzb3VyY2VzKTsKLQkJCQllZGl0b3Iub3Zld3JpdGVSZXNvdXJjZXModXNlZFJlc291cmNlcyk7Ci0JCQkJY2hhbmdlZFJlc291cmNlTGlzdC5yZW1vdmVBbGwodXNlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIHJlZnJlc2hWaWV3cyA9IGZhbHNlOwotCQlpZiAoIWNoYW5nZWRSZXNvdXJjZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRWRpdG9yUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmZXJlbmNlLmdldEVkaXRvcih0cnVlKTsKLQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEVkaXRvciAmJiAhZWRpdG9yLmlzRGlydHkoKSkgewotCQkJCQlDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzID0gKChNZXRob2RFbGVtZW50RWRpdG9yKSBlZGl0b3IpCi0JCQkJCQkJLmdldFVzZWRSZXNvdXJjZXMoKTsKLQkJCQkJY2hlY2tfcmVzb3VyY2U6IGZvciAoaW50IGogPSAwOyBqIDwgY2hhbmdlZFJlc291cmNlTGlzdAotCQkJCQkJCS5zaXplKCk7IGorKykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGNoYW5nZWRSZXNvdXJjZUxpc3QKLQkJCQkJCQkJLmdldChqKTsKLQkJCQkJCWlmICh1c2VkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJCQkJCWVkaXRvckxpc3RUb1JlZnJlc2guYWRkKGVkaXRvcik7Ci0JCQkJCQkJYnJlYWsgY2hlY2tfcmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbG9hZCB0aGUgc2VsZWN0ZWQgY2hhbmdlZCByZXNvdXJjZXMuCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlbG9hZGVkUmVzb3VyY2VzID0gbWFuYWdlcgotCQkJCQkJLnJlbG9hZFJlc291cmNlcyhjaGFuZ2VkUmVzb3VyY2VMaXN0KTsKLQotCQkJCXJlZnJlc2hWaWV3cyA9ICFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZvcmNlUmVmcmVzaFZpZXdzIHx8IHJlZnJlc2hWaWV3cykgewotCQkJcmVmcmVzaFZpZXdzKCk7Ci0JCX0KLQkJaWYgKCFlZGl0b3JMaXN0VG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JMaXN0VG9SZWZyZXNoLnNpemUoKTsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudEVkaXRvciBlZGl0b3IgPSAoTWV0aG9kRWxlbWVudEVkaXRvcikgZWRpdG9yTGlzdFRvUmVmcmVzaAotCQkJCQkJLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQllZGl0b3IucmVmcmVzaCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIExpYnJhcnkgYW5kIENvbmZpZ3VyYXRpb24gdmlld3MgaWYgbmVjZXNzYXJ5Ci0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlZnJlc2hWaWV3cygpIHsKLQkJRU9iamVjdCBpbnB1dCA9IChFT2JqZWN0KSBnZXRWaWV3ZXIoKS5nZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0LmVJc1Byb3h5KCkpIHsKLQkJCQlzZXRJbnB1dEZvclZpZXdlcihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShpbnB1dCkpOwotCQkJfSBlbHNlIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFZpZXdlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCWdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQl1cGRhdGVMYXN0UmVmcmVzaFRpbWVzdGFtcCgpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkJCU9iamVjdCBvID0gbnVsbDsKLQkJCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJCQkmJiAobyA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJCSYmICgoRU9iamVjdCkgbykuZUlzUHJveHkoKSkgewotCQkJCQkJbyA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNvbHZlKChFT2JqZWN0KSBvKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIobyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJVmlld0hlbHBlci5yZXN0b3JlU2VsZWN0aW9uKGdldFZpZXdlcigpLCBzZWxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ29uZmlndXJhdGlvblZpZXcgY29uZmlnVmlldyA9IENvbmZpZ3VyYXRpb25WaWV3LmdldFZpZXcoKTsKLQkJaWYgKGNvbmZpZ1ZpZXcgIT0gbnVsbCkgewotCQkJQ29udHJvbCBjdHJsID0gY29uZmlnVmlldy5nZXRWaWV3ZXIoKS5nZXRDb250cm9sKCk7Ci0JCQlpZiAoY3RybCAhPSBudWxsICYmICFjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJCWlucHV0ID0gKEVPYmplY3QpIGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJCQlpZiAoaW5wdXQuZUlzUHJveHkoKSkgewotCQkJCQkJY29uZmlnVmlldy5zZXRJbnB1dEZvclZpZXdlcihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLnJlc29sdmUoaW5wdXQpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gY29uZmlnVmlldy5nZXRWaWV3ZXIoKQotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQljb25maWdWaWV3LmdldFZpZXdlcigpLnJlZnJlc2goKTsKLQkJCQkJCVZpZXdIZWxwZXIucmVzdG9yZVNlbGVjdGlvbihjb25maWdWaWV3LmdldFZpZXdlcigpLCBzZWxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBzZWxlY3REaXJ0eUVkaXRvcnMoTGlzdDw/PiBkaXJ0eUVkaXRvcnMpIHsKLQkJcmV0dXJuIFJlZnJlc2hIYW5kbGVyLnNlbGVjdERpcnR5RWRpdG9ycyhkaXJ0eUVkaXRvcnMsIGdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiByZW5hbWUgYW4gZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBlbGVtZW50IHRvIHJlbmFtZQotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICogICAgICAgICAgICB0aGUgbmV3IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuUmVuYW1lKGZpbmFsIE5hbWVkRWxlbWVudCBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJUmVuYW1lQWN0aW9uLmRvUmVuYW1lKGUsIG5ld05hbWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldCNzaG93KG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG93KFNob3dJbkNvbnRleHQgY29udGV4dCkgewotCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBTaG93SW5Db250ZXh0IGZyb20gcHJvYmxlbXMgdmlldwotCQkvLwotCQlpZiAoY29udGV4dC5nZXRJbnB1dCgpIGluc3RhbmNlb2YgTWFya2VyQWRhcHRlcikgewotCQkJSVZpZXdQYXJ0IHZpZXcgPSBnZXRWaWV3U2l0ZSgpLmdldFBhZ2UoKS5maW5kVmlldygKLQkJCQkJIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb2JsZW1WaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IHZpZXcuZ2V0Vmlld1NpdGUoKQotCQkJCQkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvblByb3ZpZGVyCi0JCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCU9iamVjdCBvID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJTWFya2VyKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcikgbzsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIG1hcmtlcgotCQkJCQkJCS5nZXRBdHRyaWJ1dGUoTGlicmFyeVZhbGlkYXRpb25NYXJrZXJIZWxwZXIuR1VJRCk7Ci0JCQkJCWlmIChndWlkICE9IG51bGwpIHsKLQkJCQkJCUlSZXNvdXJjZSB3c1JlcyA9IG1hcmtlci5nZXRSZXNvdXJjZSgpOwotCQkJCQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7CQkJCQkJCi0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYk1nci5nZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCQkuZ2V0UmVzb3VyY2UoCi0JCQkJCQkJCQkJVVJJLmNyZWF0ZUZpbGVVUkkod3NSZXMuZ2V0TG9jYXRpb24oKQotCQkJCQkJCQkJCQkJLnRvU3RyaW5nKCkpLCBmYWxzZSk7Ci0JCQkJCQlPYmplY3QgZWxlbWVudDsKLQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQllbGVtZW50ID0gcmVzb3VyY2UuZ2V0RU9iamVjdChndWlkKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWVsZW1lbnQgPSBsaWJNZ3IuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQkJCX0KLQkJCQkJCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXNldFNlbGVjdGlvblRvVmlld2VyKGVsZW1lbnQpOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJSVNlbGVjdGlvbiBjb250ZXh0U2VsZWN0aW9uID0gY29udGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKGNvbnRleHQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBUcmVlU2VsZWN0aW9uKSB7Ci0JCQkvLyBmcm9tIHNlYXJjaCByZXN1bHRzIHZpZXcKLQkJCVRyZWVTZWxlY3Rpb24gc2VsID0gKFRyZWVTZWxlY3Rpb24pY29udGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJCXNldFNlbGVjdGlvblRvVmlld2VyKHNlbC5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCX0gZWxzZSBpZiAoY29udGV4dFNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCS8vIGZyb20gcHJvYmxlbXMgdmlldywgcGVyaGFwcyBvdGhlcnM/Ci0JCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKWNvbnRleHRTZWxlY3Rpb247Ci0JCQlPYmplY3QgZmlyc3RPYmogPSBzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoZmlyc3RPYmogaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSAoSVJlc291cmNlKWZpcnN0T2JqOwotCQkJCUlMaWJyYXJ5TWFuYWdlciBsaWJNZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwkJCQkJCQotCQkJCVJlc291cmNlIHJlc291cmNlID0gbGliTWdyLmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkuZ2V0UmVzb3VyY2UoCi0JCQkJCQkJCVVSSS5jcmVhdGVGaWxlVVJJKHdzUmVzLmdldExvY2F0aW9uKCkKLQkJCQkJCQkJCQkudG9TdHJpbmcoKSksIGZhbHNlKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQlpZihlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJc2V0U2VsZWN0aW9uVG9WaWV3ZXIoZWxlbWVudCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRWaWV3SWQoKSB7Ci0JCXJldHVybiBWSUVXX0lEOwotCX0KLQotCXB1YmxpYyBUcmVlVmlld2VyIGdldFRyZWVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0cmVlVmlld2VyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyLnNldENvbnRlbnREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Mb2NrZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xvY2tlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg5ODRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL0xvY2tlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgTG9ja2VyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiQ3VzdG9taXplZExvY2tlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQl9OQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJpZCIgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCX05BTUUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIExvY2tlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8gQSBtYXAgb2YgbGlicmFyeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMb2NrZXJFbGVtZW50PiBsb2NrZXJFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9ja2VyRWxlbWVudD4oKTsKLQkKLQkvL0EgbWFwIHRvIG1hbmFnZSBpZCBhbmQgbG9ja2VyIHBhaXJzLgotCXByaXZhdGUgTWFwPFN0cmluZywgQWJzdHJhY3RMb2NrZXI+IGxvY2tlck1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQWJzdHJhY3RMb2NrZXI+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2NrZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZihpbnN0YW5jZSA9PSBudWxsKXsKLQkJCXN5bmNocm9uaXplZChMb2NrZXJGYWN0b3J5LmNsYXNzKXsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMb2NrZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTG9ja2VyRmFjdG9yeSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJLmdldEF0dHJpYnV0ZShDTEFTU19BVFRSSUJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkuZ2V0QXR0cmlidXRlKElEX0FUVFJJQl9OQU1FKTsKLQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBpZCAhPSBudWxsICYmIGlkLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsJCQkJCQkJCi0JCQkJCQkJTG9ja2VyRWxlbWVudCBwcm92aWRlciA9IGxvY2tlckVsZW1lbnRzLmdldChpZCk7Ci0JCQkJCQkJaWYocHJvdmlkZXIgPT0gbnVsbCApIHsKLQkJCQkJCQkJcHJvdmlkZXIgPSBuZXcgTG9ja2VyRWxlbWVudCgKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgaWQpOwotCQkJCQkJCQlsb2NrZXJFbGVtZW50cy5wdXQoaWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBBYnN0cmFjdExvY2tlciBnZXRMb2NrZXIoT2JqZWN0IG9iaikgewotCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoKE1ldGhvZEVsZW1lbnQpb2JqKTsJCQkKLQkJCWlmIChlICE9IG51bGwgKSB7Ci0JCQkJTGlzdCBwcm9wcyA9IGUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQkJaWYgKCBwcm9wcyAhPSBudWxsICYmIHByb3BzLnNpemUoKSA+IDAgKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRwID0gcHJvcHMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpaXRwLm5leHQoKTsKLQkJCQkJCVN0cmluZyBpZCA9IHByb3AuZ2V0TmFtZSgpOwotCQkJCQkJQWJzdHJhY3RMb2NrZXIgbG9ja2VyPSBnZXRMb2NrZXIoaWQpOwotCQkJCQkJaWYgKCBsb2NrZXIgIT0gbnVsbCApIHsJCQkJCQkKLQkJCQkJCQlyZXR1cm4gbG9ja2VyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0TG9ja2VyIGdldExvY2tlcihTdHJpbmcgaWQpIHsKLQotCQlpZiAoICFsb2NrZXJFbGVtZW50cy5jb250YWluc0tleShpZCkgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vcmV0dXJuIGNyZWF0ZWQgaW5zdGFuY2UKLQkJaWYobG9ja2VyTWFwLmNvbnRhaW5zS2V5KGlkKSApewotCQkJcmV0dXJuIGxvY2tlck1hcC5nZXQoaWQpOwotCQl9Ci0JCQotCQlMb2NrZXJFbGVtZW50IHByb3ZpZGVyID0gKExvY2tlckVsZW1lbnQpIGxvY2tlckVsZW1lbnRzLmdldChpZCk7Ci0JCXRyeSB7Ci0JCQlDbGFzcyBjbGF6eiA9IHByb3ZpZGVyLmJ1bmRsZS5sb2FkQ2xhc3MocHJvdmlkZXIuY2xhc3NOYW1lKTsKLQkJCUFic3RyYWN0TG9ja2VyIGxvY2tlckluc3RhbmNlID0gKEFic3RyYWN0TG9ja2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQkJbG9ja2VyTWFwLnB1dChpZCwgbG9ja2VySW5zdGFuY2UpOwotCQkJcmV0dXJuIGxvY2tlckluc3RhbmNlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIExvY2tlckVsZW1lbnQgewotCQlCdW5kbGUgYnVuZGxlOwotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlTdHJpbmcgaWQ7Ci0JCXByaXZhdGUgTG9ja2VyRWxlbWVudChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaWQpIHsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmN2UzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL01ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXI7Ci0KLS8qKgotICogQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgY2xhc3MgdGhhdCBzdXBwb3J0cyBNZXRob2RFbGVtZW50cy4KLSAqIFNwZWNpZmljYWxseSwgaGFzIGNoYW5nZXMgdG8gc3VwcG9ydCBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVycy4KLSAqIAotICogQWxzbywgZXhwYW5kcyB0aGUgdHJlZSBmb3IgY2hlY2tlZCBpdGVtcyB3aGVuIHRoZXkgYXJlIHNldCB2aWEKLSAqIHNldENoZWNrZWRFbGVtZW50cyguLikgaWZmIGV4cGFuZFdoZW5DaGVja2luZyBpcyB0cnVlLgotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgZXh0ZW5kcwotCQlDb250YWluZXJDaGVja2VkVHJlZVZpZXdlciB7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhwYW5kV2hlbkNoZWNraW5nID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0IGNoaWxkcmVuQ2hlY2tTdGF0ZUxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci4KLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNDaGVja2JveFRyZWVWaWV3ZXIoQ29tcG9zaXRlKQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgICAgIGluaXRWaWV3ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSxpbnQpCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotICAgICAgICBzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgaW5pdFZpZXdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlci4KLSAgICAgKiBAc2VlIENoZWNrYm94VHJlZVZpZXdlciNDaGVja2JveFRyZWVWaWV3ZXIoVHJlZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIoVHJlZSB0cmVlKSB7Ci0gICAgICAgIHN1cGVyKHRyZWUpOwotICAgICAgICBpbml0Vmlld2VyKCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGluaXRWaWV3ZXIoKSB7Ci0gICAgICAgIHNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0gICAgICAgIGFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBkb0NoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50LmdldEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBhZGRUcmVlTGlzdGVuZXIobmV3IElUcmVlVmlld2VyTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlQ29sbGFwc2VkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmVlRXhwYW5kZWQoVHJlZUV4cGFuc2lvbkV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgV2lkZ2V0IGl0ZW0gPSBmaW5kSXRlbShldmVudC5nZXRFbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgVHJlZUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZUl0ZW0oKFRyZWVJdGVtKSBpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgaXRlbSBoYXMgZXhwYW5kZWQuIFVwZGF0ZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgaXRzIGNoaWxkcmVuLiAKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSXRlbShUcmVlSXRlbSBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtLmdldENoZWNrZWQoKSAmJiAhaXRlbS5nZXRHcmF5ZWQoKSkgewotICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5JdGVtcyhpdGVtKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjaGVjayBzdGF0ZSBvZiBhbGwgY3JlYXRlZCBjaGlsZHJlbgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNoaWxkcmVuSXRlbXMoVHJlZUl0ZW0gcGFyZW50KSB7Ci0gICAgICAgIEl0ZW1bXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHBhcmVudCk7Ci0gICAgICAgIGJvb2xlYW4gc3RhdGUgPSBwYXJlbnQuZ2V0Q2hlY2tlZCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBUcmVlSXRlbSBjdXJyID0gKFRyZWVJdGVtKSBjaGlsZHJlbltpXTsKLSAgICAgICAgICAgIGlmIChjdXJyLmdldERhdGEoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICgoY3Vyci5nZXRDaGVja2VkKCkgIT0gc3RhdGUpIHx8IGN1cnIuZ2V0R3JheWVkKCkpKSB7Ci0gICAgICAgICAgICAgICAgY3Vyci5zZXRDaGVja2VkKHN0YXRlKTsKLSAgICAgICAgICAgICAgICBjdXJyLnNldEdyYXllZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5Q2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXJzKG5ldyBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50KHRoaXMsIGN1cnIuZ2V0RGF0YSgpLAotICAgICAgICAgICAgICAgIAkJc3RhdGUpKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW5JdGVtcyhjdXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLQkvKioKLQkgKiBVcGRhdGUgZWxlbWVudCBhZnRlciBhIGNoZWNrc3RhdGUgY2hhbmdlLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0gICAgcHVibGljIHZvaWQgZG9DaGVja1N0YXRlQ2hhbmdlZChPYmplY3QgZWxlbWVudCkgewotICAgICAgICBXaWRnZXQgaXRlbSA9IGZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0gICAgICAgICAgICBUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgaXRlbTsKLSAgICAgICAgICAgIHRyZWVJdGVtLnNldEdyYXllZChmYWxzZSk7Ci0gICAgICAgICAgICB1cGRhdGVDaGlsZHJlbkl0ZW1zKHRyZWVJdGVtKTsKLSAgICAgICAgICAgIHVwZGF0ZVBhcmVudEl0ZW1zKHRyZWVJdGVtLmdldFBhcmVudEl0ZW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGFyZW50cyhPYmplY3QgZWxlbWVudCkgewotICAgICAgICBXaWRnZXQgaXRlbSA9IGZpbmRJdGVtKGVsZW1lbnQpOwotICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtKSB7Ci0gICAgICAgICAgICBUcmVlSXRlbSB0cmVlSXRlbSA9IChUcmVlSXRlbSkgaXRlbTsKLSAgICAgICAgICAgIHVwZGF0ZVBhcmVudEl0ZW1zKHRyZWVJdGVtLmdldFBhcmVudEl0ZW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVcGRhdGVzIHRoZSBjaGVjayAvIGdyYXkgc3RhdGUgb2YgYWxsIHBhcmVudCBpdGVtcwotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVBhcmVudEl0ZW1zKFRyZWVJdGVtIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oaXRlbSk7Ci0gICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zQ2hlY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBjb250YWluc1VuY2hlY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFRyZWVJdGVtIGN1cnIgPSAoVHJlZUl0ZW0pIGNoaWxkcmVuW2ldOwotICAgICAgICAgICAgICAgIGNvbnRhaW5zQ2hlY2tlZCB8PSBjdXJyLmdldENoZWNrZWQoKTsKLSAgICAgICAgICAgICAgICBjb250YWluc1VuY2hlY2tlZCB8PSAoIWN1cnIuZ2V0Q2hlY2tlZCgpIHx8IGN1cnIuZ2V0R3JheWVkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaXRlbS5zZXRDaGVja2VkKGNvbnRhaW5zQ2hlY2tlZCk7Ci0gICAgICAgICAgICBpdGVtLnNldEdyYXllZChjb250YWluc0NoZWNrZWQgJiYgY29udGFpbnNVbmNoZWNrZWQpOwotICAgICAgICAgICAgaWYgKGV4cGFuZFdoZW5DaGVja2luZyAmJiBpdGVtLmdldENoZWNrZWQoKSkgewotICAgICAgICAgICAgCWl0ZW0uc2V0RXhwYW5kZWQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVQYXJlbnRJdGVtcyhpdGVtLmdldFBhcmVudEl0ZW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXIjc2V0Q2hlY2tlZEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3RbXSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkRWxlbWVudHMoT2JqZWN0W10gZWxlbWVudHMpIHsKLSAgICAJLy8gZml4IGVsZW1lbnRzIGxpc3QgdG8gdXNlIG91ciB3cmFwcGVycwotICAgIAlMaXN0PE9iamVjdD4gdHJlZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gICAgCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLSAgICAJaWYgKGdldENvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIHsKLSAgICAJCWFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcilnZXRDb250ZW50UHJvdmlkZXIoKSkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLSAgICAJfQotICAgIAlmb3IgKGludCBpID0gMDtpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0gICAgCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICYmIGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLSAgICAJCQl0cmVlRWxlbWVudHMuYWRkKFRuZ1V0aWwuZ2V0RmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlckZvckNDKGFkYXB0ZXJGYWN0b3J5LCAoQ3VzdG9tQ2F0ZWdvcnkpZWxlbWVudCkpOwotICAgIAkJfSBlbHNlIHsKLSAgICAJCQl0cmVlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotICAgIAkJfQotICAgIAl9Ci0gICAgICAgIHN1cGVyLnNldENoZWNrZWRFbGVtZW50cyh0cmVlRWxlbWVudHMudG9BcnJheSgpKTsKLSAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IHRyZWVFbGVtZW50cykgewotICAgICAgICAJZG9DaGVja1N0YXRlQ2hhbmdlZChlbGVtZW50KTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0b3AtbW9zdCBjaGVja2VkIGVsZW1lbnRzIGluIHRoaXMgdmlld2VyJ3MgdHJlZSwgCi0gICAgICogaW5jbHVkaW5nIGN1cnJlbnRseSBoaWRkZW4gb25lcyB0aGF0IGFyZSBtYXJrZWQgYXMKLSAgICAgKiBjaGVja2VkIGJ1dCBhcmUgdW5kZXIgYSBjb2xsYXBzZWQgYW5jZXN0b3IuCi0gICAgICoKLSAgICAgKiBPbmx5IHJldHVybnMgd2hpdGUtY2hlY2tlZCBpdGVtcywgbm90IGdyYXllZCBpdGVtcwotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgY2hlY2tlZCBlbGVtZW50cwotICAgICAqCi0gICAgICogQHNlZSAjc2V0Q2hlY2tlZEVsZW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdFtdIGdldFRvcENoZWNrZWRFbGVtZW50cygpIHsKLSAgICAgICAgQXJyYXlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIENvbnRyb2wgdHJlZSA9IGdldENvbnRyb2woKTsKLSAgICAgICAgaW50ZXJuYWxDb2xsZWN0VG9wQ2hlY2tlZCh2LCB0cmVlKTsKLSAgICAgICAgcmV0dXJuIHYudG9BcnJheSgpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBHYXRoZXJzIHRoZSB0b3AtbW9zdCBjaGVja2VkIHN0YXRlcyBvZiB0aGUgZ2l2ZW4gd2lkZ2V0IGFuZCBpdHMKLSAgICAgKiBkZXNjZW5kZW50cywgZm9sbG93aW5nIGEgcHJlLW9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgdHJlZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXN1bHQgYSB3cml0YWJsZSBsaXN0IG9mIGVsZW1lbnRzIChlbGVtZW50IHR5cGU6IDxjb2RlPk9iamVjdDwvY29kZT4pCi0gICAgICogQHBhcmFtIHdpZGdldCB0aGUgd2lkZ2V0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGludGVybmFsQ29sbGVjdFRvcENoZWNrZWQoTGlzdCByZXN1bHQsIFdpZGdldCB3aWRnZXQpIHsKLSAgICAgICAgSXRlbVtdIGl0ZW1zID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtICYmICgoVHJlZUl0ZW0pIGl0ZW0pLmdldENoZWNrZWQoKSAmJiAhKChUcmVlSXRlbSkgaXRlbSkuZ2V0R3JheWVkKCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgZGF0YSA9IGl0ZW0uZ2V0RGF0YSgpOwotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0LmFkZChkYXRhKTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFRyZWVJdGVtICYmICghKChUcmVlSXRlbSkgaXRlbSkuZ2V0Q2hlY2tlZCgpIHx8ICgoVHJlZUl0ZW0pIGl0ZW0pLmdldEdyYXllZCgpKSkgewotICAgICAgICAgICAgCWludGVybmFsQ29sbGVjdFRvcENoZWNrZWQocmVzdWx0LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNFeHBhbmRXaGVuQ2hlY2tpbmcoKSB7Ci0JCXJldHVybiBleHBhbmRXaGVuQ2hlY2tpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kV2hlbkNoZWNraW5nKGJvb2xlYW4gZXhwYW5kV2hlbkNoZWNraW5nKSB7Ci0JCXRoaXMuZXhwYW5kV2hlbkNoZWNraW5nID0gZXhwYW5kV2hlbkNoZWNraW5nOwotCX0KLQkKLQkvKioKLQkgKiBub3RpZmllZCB3aGVuIGNoaWxkcmVuIGNoZWNrc3RhdGUgaXMgY2hhbmdlZCAoYnkgY2hlY2tpbmcgYSBwYXJlbnQpCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQljaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGVja1N0YXRlTGlzdGVuZXJzKGZpbmFsIENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChmaW5hbCBPYmplY3QgbGlzdGVuZXIgOiBjaGlsZHJlbkNoZWNrU3RhdGVMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLSAgICAgICAgICAgIFNhZmVSdW5uZXIucnVuKG5ldyBTYWZlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgIAkoKElDaGVja1N0YXRlTGlzdGVuZXIpbGlzdGVuZXIpLmNoZWNrU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTFjMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9NZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUl0ZW07Ci0KLS8qKgotICogQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIgdGhhdCBkb2VzIG5vdCBjaGVjayBhIHBhcmVudCB3aGVuIGFsbCBjaGlsZHJlbiBhcmUgY2hlY2tlZC4KLSAqIFBhcmVudCB3aWxsIHJlbWFpbiBncmF5ZWQgdW50aWwgY2hlY2tlZCBieSB0aGUgdXNlci4KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMiBleHRlbmRzIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgc3VwZXIocGFyZW50KTsKLSAgICAgICAgaW5pdFZpZXdlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIuCi0gICAgICogQHNlZSBDaGVja2JveFRyZWVWaWV3ZXIjQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSxpbnQpCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZENvbnRhaW5lckNoZWNrZWRUcmVlVmlld2VyMihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLSAgICAgICAgc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGluaXRWaWV3ZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGFpbmVyQ2hlY2tlZFRyZWVWaWV3ZXIyLgotICAgICAqIEBzZWUgQ2hlY2tib3hUcmVlVmlld2VyI0NoZWNrYm94VHJlZVZpZXdlcihUcmVlKQotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RDb250YWluZXJDaGVja2VkVHJlZVZpZXdlcjIoVHJlZSB0cmVlKSB7Ci0gICAgICAgIHN1cGVyKHRyZWUpOwotICAgICAgICBpbml0Vmlld2VyKCk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGNoZWNrIC8gZ3JheSBzdGF0ZSBvZiBhbGwgcGFyZW50IGl0ZW1zCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFyZW50SXRlbXMoVHJlZUl0ZW0gaXRlbSkgewotICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJdGVtW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihpdGVtKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY29udGFpbnNDaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zVW5jaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgVHJlZUl0ZW0gY3VyciA9IChUcmVlSXRlbSkgY2hpbGRyZW5baV07Ci0gICAgICAgICAgICAgICAgY29udGFpbnNDaGVja2VkIHw9IGN1cnIuZ2V0Q2hlY2tlZCgpOwotICAgICAgICAgICAgICAgIGNvbnRhaW5zVW5jaGVja2VkIHw9ICghY3Vyci5nZXRDaGVja2VkKCkgfHwgY3Vyci5nZXRHcmF5ZWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdGVtLnNldENoZWNrZWQoY29udGFpbnNDaGVja2VkKTsKLS8vICAgICAgICAgICAgaXRlbS5zZXRHcmF5ZWQoY29udGFpbnNDaGVja2VkICYmIGNvbnRhaW5zVW5jaGVja2VkKTsKLSAgICAgICAgICAgIGl0ZW0uc2V0R3JheWVkKGNvbnRhaW5zQ2hlY2tlZCk7Ci0gICAgICAgICAgICBpZiAoZXhwYW5kV2hlbkNoZWNraW5nICYmIGl0ZW0uZ2V0Q2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICAJaXRlbS5zZXRFeHBhbmRlZCh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZVBhcmVudEl0ZW1zKGl0ZW0uZ2V0UGFyZW50SXRlbSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3OGQ4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db2x1bW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5RHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVFeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzCi0JCUlBY3Rpb25UeXBlUHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1BZX1RYVCA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLmNvcHlfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVORF9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5leHRlbmRfdGV4dDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRVBfQ09QWV9UWFQgPSBBdXRob3JpbmdVSVJlc291cmNlcy5kZWVwQ29weV90ZXh0OyAKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aW9uVGV4dChpbnQgYWN0aW9uVHlwZSkgewotCQlzd2l0Y2ggKGFjdGlvblR5cGUpIHsKLQkJY2FzZSBDT1BZOgotCQkJcmV0dXJuIENPUFlfVFhUOwotCQljYXNlIEVYVEVORDoKLQkJCXJldHVybiBFWFRFTkRfVFhUOwotCQljYXNlIERFRVBfQ09QWToKLQkJCXJldHVybiBERUVQX0NPUFlfVFhUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0KLQlwcml2YXRlIE1lbnUgYWN0aW9uVHlwZVBvcHVwOwotCi0JcHJpdmF0ZSBQb2ludCBhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQotCQlmaW5hbCBUcmVlIHRyZWUgPSBnZXRUcmVlKCk7Ci0JCXRyZWUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdHJlZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJYWRkVHJlZUxpc3RlbmVyKG5ldyBJVHJlZVZpZXdlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRJdGVtUHJvdmlkZXJFeHBhbmRlZChldmVudC5nZXRFbGVtZW50KCksIGZhbHNlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdHJlZUV4cGFuZGVkKFRyZWVFeHBhbnNpb25FdmVudCBldmVudCkgewotCQkJCXNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKGV2ZW50LmdldEVsZW1lbnQoKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gdHJlZS5nZXRBY2Nlc3NpYmxlKCk7Ci0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyIChuZXcgQWNjZXNzaWJsZUFkYXB0ZXIgKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZSAoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQlzdXBlci5nZXROYW1lKGUpOwotCQkJCWlmIChlLmNoaWxkSUQgPj0gMCkgewotCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoID09IDEpIHsKLQkJCQkJCVN0cmluZyBzdHJpbmdUb1JlYWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJVHJlZUl0ZW0gaXRlbSA9IChUcmVlSXRlbSkgaXRlbXNbMF07Ci0JCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCQkJVHJlZUNvbHVtbltdIGNvbHVtbnMgPSB0cmVlLmdldENvbHVtbnMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJVHJlZUNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zW2ldOwotCQkJCQkJCQlzdHJpbmdUb1JlYWQgKz0gY29sdW1uLmdldFRleHQoKSArICIgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBpdGVtLmdldFRleHQoaSk7Ci0JCQkJCQkJfQotCQkJCQkJCWUucmVzdWx0ID0gc3RyaW5nVG9SZWFkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgY29sdW5tcyBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIGFycmF5IG9mIGRlc2NyaXB0b3JzCi0JICogQHBhcmFtIGNvbHVtbkRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXBDb2x1bW5zKENvbHVtbkRlc2NyaXB0b3JbXSBjb2x1bW5EZXNjcmlwdG9ycykgewotCQkvLyBSZW1vdmUgYWxsIG9sZCBUcmVlQ29sdW1ucy4KLQkJVHJlZUNvbHVtbltdIGNvbHMgPSBnZXRUcmVlKCkuZ2V0Q29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGNvbHMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY29sc1tpXS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlTdHJpbmdbXSBjb2xQcm9wcyA9IG5ldyBTdHJpbmdbY29sdW1uRGVzY3JpcHRvcnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5EZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29sUHJvcHNbaV0gPSBjb2x1bW5EZXNjcmlwdG9yc1tpXS5pZDsKLQkJCVRyZWVDb2x1bW4gY29sdW1uID0gbmV3IFRyZWVDb2x1bW4oZ2V0VHJlZSgpLAotCQkJCQljb2x1bW5EZXNjcmlwdG9yc1tpXS5hbGlnbm1lbnQpOwotCQkJY29sdW1uLnNldFRleHQoY29sdW1uRGVzY3JpcHRvcnNbaV0ubGFiZWwpOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZShjb2x1bW5EZXNjcmlwdG9yc1tpXS5yZXNpemFibGUpOwotCQkJY29sdW1uLnNldFdpZHRoKGNvbHVtbkRlc2NyaXB0b3JzW2ldLndpZHRoKTsKLQkJfQotCi0JCXNldENvbHVtblByb3BlcnRpZXMoY29sUHJvcHMpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEl0ZW1Qcm92aWRlckV4cGFuZGVkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGV4cGFuZCkgewotCQlPYmplY3QgYWRhcHRlciA9IGdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldEV4cGFuZGVkKEJvb2xlYW4udmFsdWVPZihleHBhbmQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudFByb3ZpZGVyKCkgPT0gbnVsbCA/IG51bGwKLQkJCQk6ICgoQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcigpKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVHJlZVZpZXdlciNzZXRFeHBhbmRlZChJdGVtLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEV4cGFuZGVkKEl0ZW0gbm9kZSwgYm9vbGVhbiBleHBhbmQpIHsKLQkJc3VwZXIuc2V0RXhwYW5kZWQobm9kZSwgZXhwYW5kKTsKLQkJT2JqZWN0IGFkYXB0ZXIgPSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG5vZGUuZ2V0RGF0YSgpLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcik7Ci0JCQlpZiAoYnNJdGVtUHJvdmlkZXIuaXNFeHBhbmRlZCgpID09IG51bGwpIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5zZXRFeHBhbmRlZCgoQm9vbGVhbi52YWx1ZU9mKGV4cGFuZCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFeHBhbmRlZChJdGVtIGl0ZW0sIE9iamVjdCBlbGVtZW50KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdChlbGVtZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmKGFkYXB0ZXIuaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJQm9vbGVhbiBleHBhbmQgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuaXNFeHBhbmRlZCgpOwotCQkJCWlmIChleHBhbmQgIT0gbnVsbCkgewotCQkJCQlzZXRFeHBhbmRlZFN0YXRlKGl0ZW0sIGV4cGFuZC5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFic3RyYWN0VHJlZVZpZXdlciNpbnRlcm5hbFJlZnJlc2goV2lkZ2V0LAotCSAqICAgICAgT2JqZWN0LCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGludGVybmFsUmVmcmVzaChXaWRnZXQgd2lkZ2V0LCBPYmplY3QgZWxlbWVudCwKLQkJCWJvb2xlYW4gZG9TdHJ1Y3QsIGJvb2xlYW4gdXBkYXRlTGFiZWxzKSB7Ci0JCXN1cGVyLmludGVybmFsUmVmcmVzaCh3aWRnZXQsIGVsZW1lbnQsIGRvU3RydWN0LCB1cGRhdGVMYWJlbHMpOwotCi0JCWlmIChkb1N0cnVjdCkgewotCQkJcHJlc2VydmVFeHBhbmRlZFN0YXRlKHdpZGdldCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByZXNlcnZlRXhwYW5kZWRTdGF0ZShXaWRnZXQgd2lkZ2V0KSB7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBJdGVtKSB7Ci0JCQlJdGVtIGl0ZW0gPSAoSXRlbSkgd2lkZ2V0OwotCQkJc2V0RXhwYW5kZWQoaXRlbSwgaXRlbS5nZXREYXRhKCkpOwotCQl9IGVsc2UgewotCQkJSXRlbVtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4od2lkZ2V0KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlJdGVtIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSXRlbSkgewotCQkJCQlJdGVtIGl0ZW0gPSAoSXRlbSkgY2hpbGQ7Ci0JCQkJCXNldEV4cGFuZGVkKGl0ZW0sIGl0ZW0uZ2V0RGF0YSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxJbml0aWFsaXplVHJlZShDb250cm9sIHdpZGdldCkgewotCQlzdXBlci5pbnRlcm5hbEluaXRpYWxpemVUcmVlKHdpZGdldCk7Ci0JCXByZXNlcnZlRXhwYW5kZWRTdGF0ZSh3aWRnZXQpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCi0JcHJpdmF0ZSBJQWN0aW9uTWFuYWdlciBhY3Rpb25NYW5hZ2VyOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjZ2V0QWN0aW9uVHlwZSgpCi0JICovCi0vLwlwdWJsaWMgaW50IGdldEFjdGlvblR5cGUoKSB7Ci0vLwkJaWYgKGFjdGlvblR5cGVQb3B1cCA9PSBudWxsKSB7Ci0vLwkJCWNyZWF0ZUFjdGlvblR5cGVQb3B1cCgpOwotLy8JCX0KLS8vCi0vLwkJRGlzcGxheS5nZXRDdXJyZW50KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotLy8KLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJYWN0aW9uVHlwZSA9IDA7Ci0vLwkJCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotLy8JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUodHJ1ZSk7Ci0vLwkJCX0KLS8vCi0vLwkJfSk7Ci0vLwotLy8JCXJldHVybiBhY3Rpb25UeXBlOwotLy8JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjdGlvblR5cGVQb3B1cChpbnRbXSBjaG9pY2VzKSB7Ci0JCWFjdGlvblR5cGVQb3B1cCA9IG5ldyBNZW51KGdldENvbnRyb2woKSk7Ci0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlNZW51SXRlbSBpdGVtID0gKChNZW51SXRlbSkgZS5nZXRTb3VyY2UoKSk7Ci0JCQkJU3RyaW5nIHRleHQgPSBpdGVtLmdldFRleHQoKTsKLQkJCQlpZiAodGV4dCA9PSBDT1BZX1RYVCkgewotCQkJCQlQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IEVYVEVORF9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gSUFjdGlvblR5cGVQcm92aWRlci5FWFRFTkQ7Ci0JCQkJfSBlbHNlIGlmICh0ZXh0ID09IERFRVBfQ09QWV9UWFQpIHsKLQkJCQkJUHJvY2Vzc1RyZWVWaWV3ZXIudGhpcy5hY3Rpb25UeXBlID0gREVFUF9DT1BZOwotCQkJCX0KLQotCQkJCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWN0aXZpdHlEcm9wQ29tbWFuZCkgewotCQkJCQlBY3Rpdml0eURyb3BDb21tYW5kIGNtZCA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJCWNtZC5zZXRUeXBlKFByb2Nlc3NUcmVlVmlld2VyLnRoaXMuYWN0aW9uVHlwZSk7Ci0JCQkJCWNtZC5zZXRMYWJlbCh0ZXh0KTsKLQkJCQkJCi0JCQkJCWlmIChQcm9jZXNzVHJlZVZpZXdlci50aGlzLmFjdGlvblR5cGUgPT0gREVFUF9DT1BZICkgewotCQkJCQkJY21kLnNldEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IobmV3IEFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCi0JCQkJaWYgKGFjdGlvbk1hbmFnZXIgIT0gbnVsbAotCQkJCQkJJiYgY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQlhY3Rpb25NYW5hZ2VyLmV4ZWN1dGUoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJfQotCi0JCQkJYWN0aW9uVHlwZVBvcHVwLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCi0JCX07Ci0JCQotCQlmb3IgKGludCBhY3Rpb25UeXBlIDogY2hvaWNlcykgewotCQkJTWVudUl0ZW0gbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0oYWN0aW9uVHlwZVBvcHVwLCBTV1QuQ0FTQ0FERSk7Ci0JCQltZW51SXRlbS5zZXRUZXh0KGdldEFjdGlvblRleHQoYWN0aW9uVHlwZSkpOwotCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXIjc2V0SW5wdXREYXRhKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dERhdGEoT2JqZWN0IG9iamVjdCkgewotCQlhY3Rpb25UeXBlUG9wdXBMb2NhdGlvbiA9IChQb2ludCkgb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyI2V4ZWN1dGUob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNtZCwgaW50W10gY2hvaWNlcykgewotCQljcmVhdGVBY3Rpb25UeXBlUG9wdXAoY2hvaWNlcyk7Ci0KLQkJdGhpcy5jb21tYW5kID0gY21kOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0TG9jYXRpb24oYWN0aW9uVHlwZVBvcHVwTG9jYXRpb24pOwotCQlhY3Rpb25UeXBlUG9wdXAuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIGRlZmF1bHQgYmVoYXZpb3Igb2YgYWN0aXZhdGluZyB0ZXh0IGNlbGwgZWRpdG9yIGZyb20gc2luZ2xlIG1vdXNlIGNsaWNrIHRvIGRvdWJsZSBtb3VzZSBjbGljawotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhvb2tFZGl0aW5nU3VwcG9ydChDb250cm9sIGNvbnRyb2wpIHsKLQkJdHJ5IHsKLQkJCVRyZWVWaWV3ZXJFZGl0b3IuY3JlYXRlKHRoaXMsIG5ldyBDb2x1bW5WaWV3ZXJFZGl0b3JBY3RpdmF0aW9uU3RyYXRlZ3kodGhpcykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdG9yQWN0aXZhdGlvbkV2ZW50KAotCQkJCQkJQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBldmVudC5ldmVudFR5cGUgPT0gQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvbkV2ZW50Lk1PVVNFX0RPVUJMRV9DTElDS19TRUxFQ1RJT04KLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5QUk9HUkFNTUFUSUMKLQkJCQkJfHwgZXZlbnQuZXZlbnRUeXBlID09IENvbHVtblZpZXdlckVkaXRvckFjdGl2YXRpb25FdmVudC5UUkFWRVJTQUw7Ci0JCQkJfQotCQkJfSxDb2x1bW5WaWV3ZXJFZGl0b3IuREVGQVVMVCk7Ci0JCX0KLQkJY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJLy8gd29yay1hcm91bmQgZm9yIGEgYnVnIGluIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlckVkaXRvci5jcmVhdGUoVHJlZVZpZXdlciwgU1dURm9jdXNDZWxsTWFuYWdlciwgQ29sdW1uVmlld2VyRWRpdG9yQWN0aXZhdGlvblN0cmF0ZWd5LCBpbnQpCi0JCQkvLyB0aGF0IHRyaWVkIHRvIGNhbGwgU1dURm9jdXNDZWxsTWFuYWdlci5pbml0KCkgZXZlbiBTV1RGb2N1c0NlbGxNYW5hZ2VyIGlzIG51bGwJCQotCQl9Ci0JCXN1cGVyLmhvb2tFZGl0aW5nU3VwcG9ydChjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSUFjdGlvblR5cGVQcm92aWRlciNzZXRBY3Rpb25NYW5hZ2VyKElBY3Rpb25NYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbk1hbmFnZXIoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCWFjdGlvbk1hbmFnZXIgPSBhY3Rpb25NZ3I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9Qcm9jZXNzVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczYmZiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1Byb2Nlc3NWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jZWxsZWRpdG9ycy5BYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgUHJvY2VzcyBlbGVtZW50cyBpbiBhIHRyZWUgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWaWV3ZXIgZXh0ZW5kcyBQcm9jZXNzVHJlZVZpZXdlciB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXM7Ci0KLQlwcml2YXRlIEFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yW10gY2hlY2tCb3hDZWxsRWRpdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gcGFyZW50IC0gdW5kZXJseWluZyB0cmVlCi0JICogCi0JICogQHJldHVybiBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENlbGxFZGl0b3JQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRUcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGNoZWNrIGJveCBjZWxsIGVkaXRvcnMKLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tCb3hDZWxsRWRpdG9ycwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoZWNrQm94Q2VsbEVkaXRvcnMoCi0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvcltdIGNoZWNrQm94Q2VsbEVkaXRvcnMpIHsKLQkJdGhpcy5jaGVja0JveENlbGxFZGl0b3JzID0gY2hlY2tCb3hDZWxsRWRpdG9yczsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja0JveENlbGxFZGl0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZWRpdG9yLnNldENvbHVtbkluZGV4KGkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlByb2Nlc3NUcmVlVmlld2VyI2hvb2tDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaG9va0NvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXN1cGVyLmhvb2tDb250cm9sKGNvbnRyb2wpOwotCQlnZXRUcmVlKCkuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCW1vZGlmeUl0ZW0oZSk7Ci0JCQl9Ci0JCX0pOwotCQkvLyBnZXRUcmVlKCkuYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCl7Ci0JCS8vIHB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpewotCQkvLyBzZXRVbnNldEVkaXRvcihlKTsKLQkJLy8gfQotCQkvLyB9KTsKLQkJTGlzdGVuZXIgcGFpbnRMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuUGFpbnRJdGVtOiB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZXZlbnQuaW5kZXggPSAiKyBldmVudC5pbmRleCk7Ci0JCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoZXZlbnQpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJVHJlZUNvbHVtbiBjb2wgPSBnZXRUcmVlKCkuZ2V0Q29sdW1uKGV2ZW50LmluZGV4KTsKLQkJCQkJaW50IHggPSBldmVudC54ICsgY29sLmdldFdpZHRoKCkgLyAyOwotCQkJCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCQlpbnQgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgKGV2ZW50LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDIpOwotCQkJCQlldmVudC5nYy5kcmF3SW1hZ2UoaW1hZ2UsIHggLSByZWN0LndpZHRoIC8gMiwgZXZlbnQueQotCQkJCQkJCSsgb2Zmc2V0KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZ2V0VHJlZSgpLmFkZExpc3RlbmVyKFNXVC5QYWludEl0ZW0sIHBhaW50TGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5Qcm9jZXNzVHJlZVZpZXdlciNkb1VwZGF0ZUl0ZW0ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuSXRlbSwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVJdGVtKEl0ZW0gaXRlbSwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIuZG9VcGRhdGVJdGVtKGl0ZW0sIGVsZW1lbnQpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwgJiYgY29sdW1uUHJvcGVydGllcyAhPSBudWxsCi0JCQkJJiYgY29sdW1uUHJvcGVydGllcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrQm94Q2VsbEVkaXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlBYnN0cmFjdENoZWNrQm94Q2VsbEVkaXRvciBlZGl0b3IgPSBjaGVja0JveENlbGxFZGl0b3JzW2ldOwotCQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJKChUcmVlSXRlbSkgaXRlbSkuc2V0VGV4dChpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBnZXRDaGVja0JveENlbGxFZGl0b3JJbWFnZShldmVudC5pbmRleCwgKFRyZWVJdGVtKSBldmVudC5pdGVtKTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGdldENoZWNrQm94Q2VsbEVkaXRvckltYWdlKGludCBjb2x1bW5JbmRleCwgVHJlZUl0ZW0gaXRlbSkgewotCQlpZiAoY2hlY2tCb3hDZWxsRWRpdG9ycyA9PSBudWxsCi0JCQkJfHwgY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2hlY2tCb3hDZWxsRWRpdG9yc1tjb2x1bW5JbmRleF0uZ2V0SW1hZ2UoaXRlbSwKLQkJCQljb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbkluZGV4XSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIjc2V0Q2VsbE1vZGlmaWVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDZWxsTW9kaWZpZXIoSUNlbGxNb2RpZmllciBtb2RpZmllcikgewotCQlzdXBlci5zZXRDZWxsTW9kaWZpZXIobW9kaWZpZXIpOwotCi0JCWlmIChjaGVja0JveENlbGxFZGl0b3JzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hlY2tCb3hDZWxsRWRpdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUFic3RyYWN0Q2hlY2tCb3hDZWxsRWRpdG9yIGVkaXRvciA9IGNoZWNrQm94Q2VsbEVkaXRvcnNbaV07Ci0JCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQllZGl0b3Iuc2V0Q2VsbE1vZGlmaWVyKG1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIG1vdXNlIGRvd24gbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kaWZ5SXRlbShNb3VzZUV2ZW50IGV2ZW50KSB7Ci0JCVBvaW50IHB0ID0gbmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpOwotCQlUcmVlSXRlbSBpdGVtID0gZ2V0VHJlZSgpLmdldEl0ZW0ocHQpOwotCQlpZiAoaXRlbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VHJlZSgpLmdldENvbHVtbkNvdW50KCk7IGkrKykgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSBpdGVtLmdldEJvdW5kcyhpKTsKLQkJCWlmIChyZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCUltYWdlIGltYWdlID0gZ2V0Q2hlY2tCb3hDZWxsRWRpdG9ySW1hZ2UoaSwgaXRlbSk7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlSZWN0YW5nbGUgaW1nUmVjdCA9IGltYWdlLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSBNYXRoLm1heCgwLCAocmVjdC5oZWlnaHQgLSBpbWdSZWN0LmhlaWdodCkgLyAyKTsKLQkJCQlpbnQgeCA9IHJlY3QueCArIHJlY3Qud2lkdGggLyAyIC0gaW1nUmVjdC53aWR0aCAvIDI7Ci0JCQkJaW50IHkgPSByZWN0LnkgKyBvZmZzZXQ7Ci0JCQkJaW1nUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgaW1nUmVjdC53aWR0aCwgaW1nUmVjdC5oZWlnaHQpOwotCQkJCWlmIChpbWdSZWN0LmNvbnRhaW5zKHB0KSkgewotCQkJCQljaGVja0JveENlbGxFZGl0b3JzW2ldLm1vZGlmeShpdGVtLCBjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyI3NldENvbHVtblByb3BlcnRpZXMoamF2YS5sYW5nLlN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtblByb3BlcnRpZXMoU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQlzdXBlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQl0aGlzLmNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5Qcm9wZXJ0aWVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1NhdmVhYmxlTGlicmFyeVZpZXdQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZDM4ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS92aWV3cy9TYXZlYWJsZUxpYnJhcnlWaWV3UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhbGwgdmlld3MgdGhhdCByZXF1aXJlcyB0aGUgc3VwcG9ydCBvZiBzYXZpbmcgYSBNZXRob2QKLSAqIExpYnJhcnkgdmlhIHRoZSBTYXZlIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYXZlYWJsZUxpYnJhcnlWaWV3UGFydCBleHRlbmRzIFZpZXdQYXJ0IGltcGxlbWVudHMKLQkJSVNhdmVhYmxlUGFydCB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yCi0JCQkJCS5iZWdpblRhc2soCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nTGlicmFyeVRhc2tfbmFtZSwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgCi0JCQlTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlmaXJlUHJvcGVydHlDaGFuZ2UoSUVkaXRvclBhcnQuUFJPUF9ESVJUWSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luCi0JCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeVRvRXJyb3JfbXNnLCBsaWJQYXRoKSwgCi0JCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgCi0JCQkJCQkJCWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlT25DbG9zZU5lZWRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlT25DbG9zZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL1ZpZXdIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmVjN2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvVmlld0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgdmlld3MgYW5kIGVkaXRvcnMgaW4gdGhlIEF1dGhvcmluZwotICogcGVyc3BlY3RpdmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWaWV3SGVscGVyIHsKLQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgb3BlbiBsaWJyYXJ5IGlmIGl0IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTxjb2RlPiBpZiB0aGUgdXNlciBzYXZlZCBvciBkaXNjYXJkZWQgdGhlIGNoYW5nZSwKLQkgKiAJCSAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBjYW5jZWxsZWQgdGhlIGFjdGlvbiB0aGF0Ci0JICogICAgICAgICB0cmlnZ2VyZWQgdGhpcyBjYWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9tcHRTYXZlKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlNb2RpZmllZCgpKSB7Ci0JCQlpbnQgcmV0ID0gTXNnQm94LnByb21wdChBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIAotCQkJCQlTV1QuWUVTIHwgU1dULk5PIHwgU1dULkNBTkNFTCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBTV1QuWUVTOgotCQkJCXRyeSB7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTXNnRGlhbG9nIGRpYWxvZyA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKTsKLQkJCQkJZGlhbG9nCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RXJyb3JfbXNnLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7IAotCi0JCQkJCXJldHVybiBkaWFsb2cKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX3RleHQpOyAKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSBpZiBpdCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjaG9pY2UgdGhlIHVzZXIgbWFkZSB3aGVuIHByb21wdGVkIHRvIHNhdmUgLSBvbmUgb2YgU1dULllFUywgU1dULk5PLCBTV1QuQ0FOQ0VMCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgcHJvbXB0U2F2ZUludCgpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5TW9kaWZpZWQoKSkgewotCQkJaW50IHJldCA9IE1zZ0JveC5wcm9tcHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGUsIAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190ZXh0LCAKLQkJCQkJU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQl0cnkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5zYXZlTGlicmFyeUVycm9yX21zZywgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOyAKLQkJCQl9Ci0JCQkJcmV0dXJuIFNXVC5ZRVM7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQkvLyBEaXNjYXJkIGFsbCBjaGFuZ2VzIGJ5IHJlc2V0dGluZyBhbGwgcmVzb3VyY2VzIGFzIHVuY2hhbmdlZC4KLQkJCQltYW5hZ2VyLmRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCQkJCXJldHVybiBTV1QuTk87Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gU1dULkNBTkNFTDsKLQl9Ci0KLQkvKioKLQkgKiBjbG9zZXMgYWxsIGVkaXRvcnMgb24gdGhlIGFjdGl2ZSBwYWdlCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VBbGxFZGl0b3JzKCkgewotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIGNsb3NlcyB0aGUgTWVzc2FnZVZpZXcgKGVycm9yIHZpZXcpCi0vLwkgKgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VNZXNzYWdlVmlldygpIHsKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotLy8JCQkJLmhpZGVWaWV3KE1lc3NhZ2VWaWV3LmdldFZpZXcoKSk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBoYW5kbGVzIGEgZGFuZ2xpbmcgb2JqZWN0Ci0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAJCQlPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBoYW5kbGVEYW5nbGluZyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJJiYgKChFT2JqZWN0KSBvYmplY3QpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuYmluZChBdXRob3JpbmdVSVJlc291cmNlcy5lbGVtZW50QWxyZWFkeURlbGV0ZWRFcnJvcl9tc2csICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCkpKTsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlPYmplY3QgdmFsdWUgPSBhZGFwdGVyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmICgoRU9iamVjdCkgdmFsdWUpLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQlPYmplY3Qgb3duZXIgPSBUbmdVdGlsLnVud3JhcChhZGFwdGVyLmdldFBhcmVudCh2YWx1ZSkpOwotCQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkJLy8gVGhpcyBpcyBhIFVJIGl0ZW0gcHJvdmlkZXIuCi0JCQkJCW93bmVyID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvd25lcikuZ2V0VGFyZ2V0KCk7Ci0JCQkJfQotCQkJCVN0cmluZyBvd25lck5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG93bmVyKS5nZXROYW1lKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUoKTsKLQkJCQlpZiAoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwgCi0JCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLlZpZXdIZWxwZXJfYWxyZWFkeWRlbGV0ZWRjb25maXJtX3RleHQsICgoTWV0aG9kRWxlbWVudCkgdmFsdWUpCi0JCQkJCQkJCQkuZ2V0TmFtZSgpLCBvd25lck5hbWUpKSkgeyAKLQkJCQkJCS8vIFJlbW92ZSB0aGUgYXNzb2NpYXRpb24uCi0JCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCSgoQ29sbGVjdGlvbikgKChFT2JqZWN0KSBvd25lcikuZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJCS5yZW1vdmUodmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuZWxlbWVudEFscmVhZHlEZWxldGVkRXJyb3JfbXNnLCAoKE1ldGhvZEVsZW1lbnQpIHZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qIFRPRE86IElzIHRoaXMgc3RpbGwgbmVlZGVkPwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQWxsQW5kU2F2ZUFsbCgpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBEbyB0aGUgd29yayB3aXRoaW4gYW4gb3BlcmF0aW9uIGJlY2F1c2UgdGhpcyBpcyBhIGxvbmcgcnVubmluZwotCQkvLyBhY3Rpdml0eSB0aGF0IG1vZGlmaWVzIHRoZSB3b3JrYmVuY2guCi0JCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJLy8gVGhpcyBpcyB0aGUgbWV0aG9kIHRoYXQgZ2V0cyBpbnZva2VkIHdoZW4gdGhlIG9wZXJhdGlvbiBydW5zLgotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzayhBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkaW5nTGlicmFyeVRhc2submFtZSIpLCAzKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRyeSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkubG9hZGluZ0xpYnJhcnlFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTW9kZWxTdG9yYWdlLmxvYWRBbGxQcm94aWVzKGxpYik7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnNldFRhc2tOYW1lKEF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuc2F2aW5nVXBncmFkZWRFbGVtZW50c1Rhc2submFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgbGliCi0JCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShMaWJyYXJ5UHJvY2Vzc29yLmdldEluc3RhbmNlKCkKLQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCksIHRydWUpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkudXBncmFkZUxpYnJhcnlEaWFsb2cudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeUVycm9yLm1zZyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnNhdmVVcGdyYWRlZExpYnJhcnlFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQkvLyBSdW4gdGhlIG9wZXJhdGlvbiBhbmQgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuCi0JCQluZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCkpCi0JCQkJCS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuZ2V0U3RyaW5nKCJBdXRob3JpbmdVSS51cGdyYWRlTGlicmFyeURpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCS5nZXRTdHJpbmcoIkF1dGhvcmluZ1VJLnVwZ3JhZGVMaWJyYXJ5RXJyb3IubXNnIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJLmdldFN0cmluZygiQXV0aG9yaW5nVUkuaW50ZXJuYWxFcnJvci5yZWFzb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUpOwotCQl9Ci0JfQotCSovCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEp1ZGdlIGlmIHRoZXJlIGlzIGEgZGVmaW5lZCBjdXN0b21pemVkIGxvY2tlcgotCSAqIEByZXR1cm4gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDdXN0b21pemVkTG9ja2VyKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbil7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwkJCQotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBudWxsOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICl7Ci0JCQkJCWxvY2tlciA9IExvY2tlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMb2NrZXIoZWxlbWVudCk7CQotCQkJCX1lbHNlewotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpZWxlbWVudCk7Ci0JCQkJCWlmKHBsdWdpbiAhPSBudWxsICApewotCQkJCQkJbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCQotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCQlpZihsb2NrZXIgIT0gbnVsbCApewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIGxvY2tlZC4KLQkgKiBJZiB0aGVyZSBpcyBhIGN1c3RvbWl6ZWQgbG9ja2VyLCB1c2UgaXQsIG90aGVyd2lzZSBjaGVjayBpdCB3aXRoIHRoZSBsb2NrZWQgZmxhZyBvZiAKLQkgKiBNZXRob2QgcGx1Z2luCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRXaXRoQ3VzdG9taXplZExvY2tlcihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewkJCQotCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBzZWxlY3RlZEl0ZW07Ci0JCQl3aGlsZSAoZWxlbWVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCWVsZW1lbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZWxlbWVudCkuZ2V0UGFyZW50KG51bGwpOwotCQkJfQkJCQotCQkJT2JqZWN0IHVud3JhcEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQotCQkJaWYgKHVud3JhcEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICkgewkKLQkJCQkKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TG9ja2VyKGVsZW1lbnQpOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKGVsZW1lbnQpKXsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpdW53cmFwRWxlbWVudCk7Ci0JCQkJaWYocGx1Z2luICE9IG51bGwgKXsKLQkJCQkJQWJzdHJhY3RMb2NrZXIgbG9ja2VyID0gTG9ja2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldExvY2tlcihwbHVnaW4pOwkJCQkJCi0JCQkJCWlmKGxvY2tlciAhPSBudWxsICl7Ci0JCQkJCQlpZiggbG9ja2VyLmlzTG9ja2VkKHNlbGVjdGVkSXRlbSkpewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9ZWxzZSBpZiggVG5nVXRpbC5pc0xvY2tlZCgoRU9iamVjdCkgdW53cmFwRWxlbWVudCkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZSBkZXN0aW5hdGlvbiBpcyBsb2NrZWQgYnkgYSBjdXN0b21pemVkIGxvY2tlci4KLQkgKiBOb3RlOiBTb21lIGl0ZW0gY291bGQgYmUgbG9ja2VkIGJ5IGEgZXh0ZW50ZWQgbG9ja2VyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZExvY2tlZChPYmplY3QgZGVzdGluYXRpb24pIHsKLQkJdHJ5IHsKLQkJCWlmIChkZXN0aW5hdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJT2JqZWN0IGVsZW1lbnQgPSBkZXN0aW5hdGlvbjsKLQkJCXdoaWxlIChlbGVtZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJZWxlbWVudCA9ICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBlbGVtZW50KS5nZXRQYXJlbnQobnVsbCk7Ci0JCQl9Ci0JCQllbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQlBYnN0cmFjdExvY2tlciBsb2NrZXIgPSBMb2NrZXJGYWN0b3J5LmdldEluc3RhbmNlKCkKLQkJCQkJLmdldExvY2tlcihwbHVnaW4pOwotCQkJCQlpZiAobG9ja2VyICE9IG51bGwgJiYgbG9ja2VyLmlzTG9ja2VkKGRlc3RpbmF0aW9uKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpeGVzIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIEdVSURzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhDb250ZW50RGVzY3JpcHRpb25HVUlEcygpIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUludGVybmFsRU9iamVjdCBlbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50LmVQcm94eVVSSSgpID09IG51bGwpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBlbGVtZW50OwotCQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBjb250YWluZXIgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50Ci0JCQkJCQkJCQkuZUNvbnRhaW5lcigpOwotCQkJCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKGNvbnRhaW5lcgotCQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJCQlpZiAoIWd1aWQuZXF1YWxzKGNvbnRlbnQuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJY29udGVudC5zZXRHdWlkKGd1aWQpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMKLQkJCQkJCQkJCQkJLmFkZChjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLmJpbmQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc2F2aW5nVGFza19uYW1lLCByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkpOwotCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCS5ydW5XaXRoUHJvZ3Jlc3MoCi0JCQkJCQlydW5uYWJsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmZpeGluZ0NvbnRlbnREZXNjcmlwdGlvbkdVSURzVGFza19uYW1lKTsgCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrUHJveHkoSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQsIEVSZWZlcmVuY2UgcmVmLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmogPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCVN0cmluZyBlcnJNc2cgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlZCA9PSBlT2JqKSB7Ci0JCQkJCWVyck1zZyA9ICJVbnJlc29sdmVkIHByb3h5IjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAoIXJlZi5nZXRFVHlwZSgpLmlzSW5zdGFuY2UocmVzb2x2ZWQpKSB7Ci0JCQkJCWVyck1zZyA9ICJJbnZhbGlkIGRhdGEiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChlcnJNc2cgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aDsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQkJCXBhdGggPSByZWYuZ2V0RVR5cGUoKS5nZXROYW1lKCkKLQkJCQkJCQkJKyAiKCIgKyBNaXNjLmdldFBhdGhSZWxhdGl2ZVRvTGlicmFyeSgoTmFtZWRFbGVtZW50KSBlbGVtZW50KSArICIpLiIgKyByZWYuZ2V0TmFtZSgpICsgIiA9ICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gZXJyTXNnCi0JCQkJCQkJKyAiIGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgcGF0aCArIHJlc29sdmVkOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTGlicmFyeSBoZWFsdGggY2hlY2sKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0xpYnJhcnlIZWFsdGgoKSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dJbmZvKAotCQkJCQkJIisrKysgTElCUkFSWSBIRUFMVEggQ0hFQ0sgUkVQT1JUIC0gU1RBUlQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdXcml0ZXIgc3RyV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJCVByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHN0cldyaXRlcik7Ci0JCQkJcHJpbnRXcml0ZXIucHJpbnRsbigpOwotCQkJCXByaW50V3JpdGVyCi0JCQkJCQkucHJpbnRsbigiVU5SRVNPTFZFRC9JTlZBTElEIFBST1hJRVMgSU4gWC1SRUZFUkVOQ0VTIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcmludFdyaXRlcgotCQkJCQkJLnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGVsZW1lbnQ7Ci0JCQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGNvbnRhaW5lciA9IChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gVW1hVXRpbC5nZW5lcmF0ZUdVSUQoY29udGFpbmVyCi0JCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQkJCWlmICghZ3VpZC5lcXVhbHMoY29udGVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRoIGludmFsaWQgR1VJRDogIiArIGNvbnRlbnQuZ2V0R3VpZCgpICsgIiBpbiAnIiArIGNvbnRlbnQuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCQkJIkNvbnRlbnREZXNjcmlwdGlvbiB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgY29udGVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0KLQkJCQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJCQkJCQkvLyBjaGVjayBpZiB0aGUgY29udGVudC54bWkgb2YgdGhlIHByb2Nlc3MgaXMgaW4KLQkJCQkJCQkJLy8gdGhlIHJpZ2h0IHBsYWNlCi0JCQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsCi0JCQkJCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoY29udGVudCk7Ci0JCQkJCQkJCWlmIChwcm9jQ29tcCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlTdHJpbmcgbW9kZWxQYXRoID0gcHJvY0NvbXAuZVJlc291cmNlKCkKLQkJCQkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQkJCQkJRmlsZSBkaXIgPSBuZXcgRmlsZShtb2RlbFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBjb250ZW50LmVSZXNvdXJjZSgpCi0JCQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJtb2RlbCBwYXRoOiAiICsKLQkJCQkJCQkJCS8vIG1vZGVsUGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQgcGF0aDogIiArCi0JCQkJCQkJCQkvLyBjb250ZW50UGF0aCk7Ci0JCQkJCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQotCQkJCQkJCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoY29udGVudFBhdGgpCi0JCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJCQlpZiAoIWRpci5lcXVhbHMoY29udGVudERpcikpIHsKLQkJCQkJCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJCQkJCSJDb250ZW50IGZpbGUgb2YgIiArIGNvbnRhaW5lci5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiICciICsgY29udGFpbmVyLmdldE5hbWUoKSArICInIGluICciICsgbW9kZWxQYXRoICsgIiBpcyBtaXNwbGFjZWQ6ICIgKyBjb250ZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY2hlY2sgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBpbiBjcm9zcyByZWZlcmVuY2VzCi0JCQkJCQlBcnJheUxpc3QgeFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxSZWZlcmVuY2VzKCkpOwotCQkJCQkJeFJlZmVyZW5jZXMucmVtb3ZlQWxsKGVsZW1lbnQuZUNsYXNzKCkKLQkJCQkJCQkJLmdldEVBbGxDb250YWlubWVudHMoKSk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0geFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KHJlZiwgZmFsc2UpOwotCQkJCQkJCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIHZhbHVlOwotCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuYmFzaWNJdGVyYXRvcigpOyBpdGVyMQotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCVN0cmluZyBtc2cgPSBjaGVja1Byb3h5KGVsZW1lbnQsIHJlZiwKLQkJCQkJCQkJCQkJCWl0ZXIxLm5leHQoKSk7Ci0JCQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXByaW50V3JpdGVyLnByaW50bG4obXNnKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tQcm94eShlbGVtZW50LCByZWYsIHZhbHVlKTsKLQkJCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJCQlwcmludFdyaXRlci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIlVucmVzb2x2ZWQgcHJveHkgaW4gJyIgKyBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICsgIic6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCX0KLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQlzdHJXcml0ZXIudG9TdHJpbmcoKSk7Ci0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCQkiKysrKyBMSUJSQVJZIEhFQUxUSCBDSEVDSyBSRVBPUlQgLSBFTkQgKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9OwotCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlcl9wZXJmb3JtSGVhbHRoQ2hlY2spKSB7IAotCQkJU3RyaW5nIHRpdGxlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX3RpdGxlOyAKLQkJCVN0cmluZyBtZXNzYWdlID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMudmlld0hlbHBlckhlYWx0aENoZWNrRGlhbG9nX21lc3NhZ2U7IAotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCQltZXNzYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZXMgaW52YWxpZCByZWZlcmVuY2UgaW4gdGhlIG9wZW4gbGlicmFyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJSW50ZXJuYWxFT2JqZWN0IGVsZW1lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQuZVByb3h5VVJJKCkgPT0gbnVsbCkgewotCQkJCQkJQXJyYXlMaXN0IHhSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsUmVmZXJlbmNlcygpKTsKLQkJCQkJCXhSZWZlcmVuY2VzLnJlbW92ZUFsbChlbGVtZW50LmVDbGFzcygpCi0JCQkJCQkJCS5nZXRFQWxsQ29udGFpbm1lbnRzKCkpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHhSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChyZWYsIGZhbHNlKTsKLQkJCQkJCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRUxpc3QpIHsKLQkJCQkJCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSB2YWx1ZTsKLQkJCQkJCQkJCUFycmF5TGlzdCBpbnZhbGlkUHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBsaXN0LmJhc2ljSXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlPYmplY3QgdiA9IGl0ZXIxLm5leHQoKTsKLQkJCQkJCQkJCQlpZiAoaXNJbnZhbGlkUmVmZXJlbmNlKGVsZW1lbnQsIHJlZiwgdikpIHsKLQkJCQkJCQkJCQkJaW52YWxpZFByb3hpZXMuYWRkKHYpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICghaW52YWxpZFByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJcmVtb3ZlSW52YWxpZFJlZmVyZW5jZXMoZWxlbWVudCwgbGlzdCwKLQkJCQkJCQkJCQkJCWludmFsaWRQcm94aWVzKTsKLQkJCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZWxlbWVudAotCQkJCQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChpc0ludmFsaWRSZWZlcmVuY2UoZWxlbWVudCwgcmVmLCB2YWx1ZSkpIHsKLQkJCQkJCQkJCWVsZW1lbnQuZVNldChyZWYsIG51bGwpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJQXV0aG9yaW5nVUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJLmxvZ0Vycm9yKAotCQkJCQkJCQkJCSJVbnJlc29sdmVkIHByb3h5IGluICciICsgZWxlbWVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSArICInOiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbW9uaXRvci5zdWJUYXNrKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ0ZpbGVzVGFza19uYW1lKTsgCi0JCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhBdXRob3JpbmdVSVJlc291cmNlcy5iaW5kKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnNhdmluZ1Rhc2tfbmFtZSwgcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpKTsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBib29sZWFuIGlzSW52YWxpZFJlZmVyZW5jZShJbnRlcm5hbEVPYmplY3QgZWxlbWVudCwKLQkJCQkJRVJlZmVyZW5jZSByZWYsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgZU9iaiA9IChJbnRlcm5hbEVPYmplY3QpIHZhbHVlOwotCQkJCQlpZiAoZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlFT2JqZWN0IHJlc29sdmVkID0gZWxlbWVudC5lUmVzb2x2ZVByb3h5KGVPYmopOwotCQkJCQkJaWYgKCFyZWYuZ2V0RVR5cGUoKS5pc0luc3RhbmNlKHJlc29sdmVkKSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHJlbW92ZUludmFsaWRSZWZlcmVuY2VzKEludGVybmFsRU9iamVjdCBlbGVtZW50LAotCQkJCQlJbnRlcm5hbEVMaXN0IHZhbHVlcywgQ29sbGVjdGlvbiBpbnZhbGlkUHJveGllcykgewotCQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCh2YWx1ZXMuYmFzaWNMaXN0KCkpOwotCQkJCWxpc3QucmVtb3ZlQWxsKGludmFsaWRQcm94aWVzKTsKLQkJCQl2YWx1ZXMuY2xlYXIoKTsKLQkJCQlpbnQgbWF4ID0gbGlzdC5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGVsZW1lbnQuZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBsaXN0Ci0JCQkJCQkJLmdldChpKSkpOwotCQkJCX0KLQkJCQl2YWx1ZXMuYWRkQWxsKGxpc3QpOwotCQkJfQotCi0JCX07Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLmRlbGV0aW5nSW52YWxpZFJlZmVyZW5jZXNUYXNrX25hbWUpOyAKLQotCX0KLQotCS8qKgotCSAqIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeS4gIFVzZWQgb24gYSByb2xsYmFjayBlcnJvcgotCSAqIEBwYXJhbSBzaGVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGliYXJ5T25Sb2xsYmFja0Vycm9yKFNoZWxsIHNoZWxsKSB7Ci0JCXJlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBBdXRob3JpbmdVSVJlc291cmNlcy5WaWV3SGVscGVyX3JlbG9hZExpYk9uUm9sbGJhY2tFcnJvcik7Ci0JfQotCi0JLyoqCi0JICogZGlzcGxheXMgdGhlIG1lc3NhZ2UgYW5kIHJlbG9hZHMgdGhlIGN1cnJlbnQgbGlicmFyeSAKLQkgKiBAcGFyYW0gc2hlbGwKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxvYWRDdXJyZW50TGlicmFyeShmaW5hbCBTaGVsbCBzaGVsbCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gTXNnQm94LmdldERpc3BsYXkoKTsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KHNoZWxsLCBtZXNzYWdlKTsgCi0JCQl9Ci0JCQkKLQkJfTsKLQkJaWYoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlydW5uYWJsZS5ydW4oKTsKLQkJfQkJCi0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlbG9hZEN1cnJlbnRMaWJyYXJ5KFNoZWxsIHNoZWxsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCQl9Ci0JCVN0cmluZyB0aXRsZSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLnJlbG9hZERpYWxvZ190aXRsZTsgCi0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCW1lc3NhZ2UgPSBBdXRob3JpbmdVSVJlc291cmNlcy5yZWxvYWREaWFsb2dfbWVzc2FnZTsgCi0JCX0KLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKHRpdGxlLAotCQkJCW1lc3NhZ2UpOwotCi0JCS8vIFRoZSBsaWJyYXJ5IG5lZWRzIHRvIGJlIHJlbG9hZGVkLgotCQlTdHJpbmcgbGliRGlyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCUxpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShsaWJEaXIpOwotCX0KLQotCS8qKgotCSAqIG9wZW5zIHRoZSBnaXZlbiB2aWV3SWQKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogQHJldHVybgotCSAqIAkJCVZpZXcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElWaWV3UGFydCBvcGVuVmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXJldHVybiBmaW5kVmlldyh2aWV3SWQsIHRydWUpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBvcGVucyB0aGUgZ2l2ZW4gdmlld0lkCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEByZXR1cm4KLQkgKiAJCQlWaWV3Ci0JICovCi0JcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZmluZFZpZXcoU3RyaW5nIHZpZXdJZCwgYm9vbGVhbiBzaG93KSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIGFsd2F5cyBjcmVhdGUgdGhlIHZpZXcKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsJCQkJCQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoICFzaG93ICkgewotCQkJCQlhY3RpdmVQYWdlLmhpZGVWaWV3KHZpZXcpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmlldzsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLCAKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuaW50ZXJuYWxFcnJvcl9tc2csIAotCQkJCQllKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWaWV3SW5DdXJyZW50UGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCkgewkJCi0JCVN0cmluZyBwZXJzcGVjdGl2ZUlkID0gUGVyc3BlY3RpdmVVdGlsLmdldEFjdGl2ZVBlcnNwZWN0aXZlSWQoKTsKLQkJcmV0dXJuIGlzVmlld0luUGVyc3BlY3RpdmUodmlld0lkLCBwZXJzcGVjdGl2ZUlkKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVjaWVkZSB3aGV0aGVyIHRoZSB2aWV3IGRlZmluZGVkIGluIHRoZSBwZXJzcGVjdGl2ZSBvciBub3QKLQkgKiAKLQkgKiBAYXV0aG9yIGRhdmlkIHpob25nd2VpCi0JICogQHBhcmFtIHZpZXdJZAotCSAqIEBwYXJhbSBwZXJwZWN0aXZlSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmlld0luUGVyc3BlY3RpdmUoU3RyaW5nIHZpZXdJZCwgU3RyaW5nIHBlcnNwZWN0aXZlSWQpIHsKLQkJaWYgKHZpZXdJZCA9PSBudWxsIHx8IHBlcnNwZWN0aXZlSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZmluYWwgU3RyaW5nIE5BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS51aSI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgRVhURU5TSU9OUE9JTlRfSUQgPSAicGVyc3BlY3RpdmVFeHRlbnNpb25zIjsvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBUQVJHRVRfSUQgPSAidGFyZ2V0SUQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVcgPSAidmlldyI7Ly8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFZJRVdTSE9SVENVVCA9ICJ2aWV3U2hvcnRjdXQiOy8vJE5PTi1OTFMtMSQKLQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBudWxsOwotCQlpZiAoZXh0ZW5zaW9uUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChOQU1FU1BBQ0UsIEVYVEVOU0lPTlBPSU5UX0lEKTsKLQkJfQotCi0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShUQVJHRVRfSUQpOwotCQkJCQkJaWYgKHBlcnNwZWN0aXZlSWQuZXF1YWxzKGlkKSkgewotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlldyIKLQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50c0ZvclZpZXcgPSBjb25maWdFbGVtZW50LmdldENoaWxkcmVuKFZJRVcpOwotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgY29uZmlnRWxlbWVudHNGb3JWaWV3Lmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzRm9yVmlld1trXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQkJLy8gZGVjaWRlIHdoZXRoZXIgaXMgZGVmaW5lZCBpbiAidmlld1Nob3J0Y3V0IgotCQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzRm9yVmlld1Nob3J0Y3V0ID0gY29uZmlnRWxlbWVudAotCQkJCQkJCSAgICAgICAgLmdldENoaWxkcmVuKFZJRVdTSE9SVENVVCk7Ci0JCQkJCQkJZm9yIChpbnQgbCA9IDA7IGwgPCBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dC5sZW5ndGg7IGwrKykgewotCQkJCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlndXJhdGlvbkVsZW1lbnQgPSBjb25maWdFbGVtZW50c0ZvclZpZXdTaG9ydGN1dFtsXTsKLQkJCQkJCQkJaWYgKHZpZXdJZC5lcXVhbHMoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKElEKSkpIHsKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFZpZXcoQWJzdHJhY3RCYXNlVmlldyBjb25maWdWaWV3KSB7Ci0JCUNvbnRyb2wgY3RybCA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0Q29udHJvbCgpOwotCQlpZiAoY3RybCAhPSBudWxsICYmICFjdHJsLmlzRGlzcG9zZWQoKSkgewotCQkJT2JqZWN0IGlucHV0ID0gIGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkuZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaW5wdXQ7Ci0JCQkJaWYgKGVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQljb25maWdWaWV3LnNldElucHV0Rm9yVmlld2VyKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCS5yZXNvbHZlKGVPYmplY3QpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkKLQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCkucmVmcmVzaCgpOwotCQkJCQlyZXN0b3JlU2VsZWN0aW9uKGNvbmZpZ1ZpZXcuZ2V0Vmlld2VyKCksIHNlbGVjdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzdG9yZVNlbGVjdGlvbihWaWV3ZXIgdmlld2VyLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWJvb2xlYW4gcmVzdG9yZSA9IGZhbHNlOwotCQkJQXJyYXlMaXN0IHJlc29sdmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0cnVjdHVyZWRTZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCWlmIChlT2JqLmVJc1Byb3h5KCkpIHsKLQkJCQkJCWVPYmogPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShlT2JqKTsKLQkJCQkJCXJlc3RvcmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJCQlyZXNvbHZlZExpc3QuYWRkKGVPYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlc3RvcmUpIHsKLQkJCQl2aWV3ZXIKLQkJCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb2x2ZWRMaXN0KSwKLQkJCQkJCQkJdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3ZpZXdzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzM5YmM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvdmlld3MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdmlld3MgZm9yIHRoZSBBdXRob3JpbmcgYW5kIEJyb3dzaW5nIHBlcnNwZWN0aXZlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL0NvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhOGRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLS8qKgotICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgQ29uZmlndXJhdGlvbiB0YWJsZSBpbiB0aGUgT3BlbiBDb25maWd1cmF0aW9uCi0gKiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50OwotCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzN2JkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBmb3IgYSBuZXcKLSAqIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX05ld0NvbmZpZ3VyYXRpb25NYWluUGFnZV9wYWdlVGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9OZXdDb25maWd1cmF0aW9uTWFpblBhZ2VfcGFnZURlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL05ldy5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUsIDIpOwotCi0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGNvbXBvc2l0ZSwgNDAwLCA4MCwgMik7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJU3RyaW5nIG5hbWUgPSAibmV3X2NvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQkJaWYobGliICE9IG51bGwpIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldE5leHRBdmFpbGFibGVOYW1lKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgbmFtZSk7Ci0JCX0KLQkJbmFtZVRleHQuc2V0VGV4dChuYW1lKTsgCi0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChuYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBjb25maWdOYW1lID0gZ2V0Q29uZmlndXJhdGlvbk5hbWUoKTsKLQotCQlpZiAoIXZhbGlkYXRlQ29uZmlndXJhdGlvbk5hbWUoY29uZmlnTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjb25maWd1cmF0aW9uRXhpc3RzKGNvbmZpZ05hbWUpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCi0JCXJldHVybiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzCi0JICogaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggdGhlIHNhbWUgbmFtZQotCSAqICAgICAgICAgYWxyZWFkeSBleGlzdHMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maWd1cmF0aW9uRXhpc3RzKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZ05hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjb25maWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY29uZmlnTmFtZXNbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUNvbmZpZ3VyYXRpb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIFRPRE86IENhbGwgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSB2YWxpZGF0b3Igd2hlbiBpdCBpcyByZWFkeS4KLQkJU3RyaW5nIGVycm1zZyA9IFRuZ1V0aWwuY2hlY2tFbGVtZW50TmFtZShuYW1lLAotCQkJCUxpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJaWYgKGVycm1zZyAhPSBudWxsKSB7Ci0JCQllcnJtc2cgPSBlcnJtc2cucmVwbGFjZUFsbCgiXG5cbiIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXNldEVycm9yTWVzc2FnZShlcnJtc2cpOwotCQlyZXR1cm4gZXJybXNnID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlndXJhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBjb25maWd1cmF0aW9uIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzlmYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0NvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdDb25maWd1cmF0aW9uV2l6YXJkLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIE5ldyBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdDb25maWd1cmF0aW9uV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAkKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UgbWFpblBhZ2U7Ci0KLQkvLyBUaGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0NvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKG1haW5QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShOZXdDb25maWd1cmF0aW9uTWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgTmV3Q29uZmlndXJhdGlvbk1haW5QYWdlIGNyZWF0ZU1haW5QYWdlKCkgewotCQlyZXR1cm4gbmV3IE5ld0NvbmZpZ3VyYXRpb25NYWluUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24gaXMgY3JlYXRlZCBpbiB0aGUgTGlicmFyeSB2aWV3IHZpYSB0aGUgY29udGV4dCBtZW51LiBVcG9uCi0JICogY29tcGxldGluZyB0aGlzIHdpemFyZCwgdGhlIG5ld2x5IGNyZWF0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gd2lsbCBiZQotCSAqIGluaXRpYWxpemVkIHdpdGggdGhlIG5hbWUgYW5kIGJyaWVmIGRlc2NyaXB0aW9uIGVudGVyZWQgYnkgdGhlIHVzZXIgaW4KLQkgKiB0aXMgd2l6YXJkLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmV0ID0gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihtYWluUGFnZS5nZXRDb25maWd1cmF0aW9uTmFtZSgpLAotCQkJCW1haW5QYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKSwgbWFpblBhZ2UpOwotCQlpZihyZXQpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCS5nZXRDdXJyZW50UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUobGlicmFyeS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3Q29uZmlndXJhdGlvbldpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIGZvciB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gYnJpZWZEZXNjCi0JICogICAgICAgICAgICB0aGUgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSB3aXphcmRQYWdlCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciBtZXNzYWdlcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIGNyZWF0ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBicmllZkRlc2MsCi0JCQlXaXphcmRQYWdlIHdpemFyZFBhZ2UpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGMgPSBjb25maWcgPT0gbnVsbCA/IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSA6IGNvbmZpZzsKLQkJCWMuc2V0TmFtZShuYW1lKTsKLQkJCQotCQkJaWYgKCEgbmFtZUNoZWNrKG5hbWUsIHdpemFyZFBhZ2UsIGxpYnJhcnksIGMpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihuYW1lLCBsaWJyYXJ5KTsKLQkJCX0KLQotCQkJaWYgKGJyaWVmRGVzYyAhPSBudWxsKSB7Ci0JCQkJY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oYnJpZWZEZXNjKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0NvbmZpZ3VyYXRpb25XaXphcmRfdGl0bGUsCi0JCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLmludGVybmFsRXJyb3JfbXNnLCBlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBuYW1lQ2hlY2soU3RyaW5nIG5hbWUsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSwgCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnksIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCS8vIEZpeCBmb3IgYnVnemlsbGEgMTc4NDYyLgotCQlTdHJpbmcgZXJybXNnID0gbnVsbDsKLQkJaWYgKG5hbWUuaW5kZXhPZigiJiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJZXJybXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRFbGVtZW50TmFtZUVycm9yNF9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVOYW1lVmFsaWRhdG9yKGxpYnJhcnksIG1ldGhvZENvbmZpZyk7Ci0JCQllcnJtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChuYW1lKTsKLQkJfQotCi0JCWlmIChlcnJtc2cgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2UoZXJybXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuZXdseSBjcmVhdGVkIG1ldGhvZCBjb25mZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN1cGVyUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmVzdWx0SG9sZGVyWzBdID0gc3VwZXJQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeU1haW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmFjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld0xpYnJhcnlNYWluUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciB0aGUgbmFtZSBhbmQgYnJpZWYgZGVzY3JpcHRpb24KLSAqIGZvciBhIG5ldyBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5TWFpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBOZXdMaWJyYXJ5TWFpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgQ29tYm8gbGlicmFyeVBhdGhDb21ibzsKLQotCXByaXZhdGUgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByaXZhdGUgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgbGlicmFyeVR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5TWFpblBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlXaXphcmRNYWluUGFnZV9kZXNjcmlwdGlvbik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9OZXcuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5saWJyYXJ5UGF0aExhYmVsX3RleHQpOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8gPSBjcmVhdGVDb21ib2JveChjb21wb3NpdGUpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkJST1dTRV9CVVRUT05fVEVYVCk7Ci0KLQkJY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LkRFU0NSSVBUSU9OX1RFWFQpOwotCi0JCWJyaWVmRGVzY1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDgwLCAxKTsKLQotCQlNYXAgdHlwZXMgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5VHlwZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHR5cGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWxpYnJhcnlUeXBlID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBkZWZhdWx0TGlicmFyeVBhdGggPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKTsKLQkJRmlsZSBkZWZhdWx0TGlicmFyeURpciA9IG5ldyBGaWxlKGRlZmF1bHRMaWJyYXJ5UGF0aCk7Ci0JCVN0cmluZyBuZXdMaWJyYXJ5UGF0aCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAxOzsgaSsrKSB7Ci0JCQlGaWxlIG5ld0xpYnJhcnlEaXIgPSBuZXcgRmlsZShkZWZhdWx0TGlicmFyeURpciwgIkxpYnJhcnkiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghbmV3TGlicmFyeURpci5leGlzdHMoKSkgewotCQkJCW5ld0xpYnJhcnlQYXRoID0gbmV3TGlicmFyeURpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCUxpc3Q8U3RyaW5nPiBuZXdMaWJyYXJ5UGF0aHNMaXN0ID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0TmV3TGlicmFyeVBhdGhzTGlzdCgpOwotCQlpZiAobmV3TGlicmFyeVBhdGggIT0gbnVsbCAmJiBuZXdMaWJyYXJ5UGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QuYWRkKDAsIG5ld0xpYnJhcnlQYXRoKTsKLQkJfQotCQlpZiAobmV3TGlicmFyeVBhdGhzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBuZXdMaWJyYXJ5UGF0aHMgPSBuZXcgU3RyaW5nW25ld0xpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpXTsKLQkJCW5ld0xpYnJhcnlQYXRoc0xpc3QudG9BcnJheShuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRJdGVtcyhuZXdMaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG5ld0xpYnJhcnlQYXRoc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWxpYnJhcnlQYXRoQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwsIFNXVC5OT05FKTsKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCVN0cmluZyBsaWJQYXRoID0gZ2V0TGlicmFyeVBhdGgoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBuZXcgRmlsZShsaWJQYXRoKS5nZXROYW1lKCk7Ci0JCWlmICghbGliUGF0aC5lcXVhbHMobGliTmFtZSkpIHsKLQkJCXJldHVybiBsaWJOYW1lOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQYXRoQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY1RleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBsaWJyYXJ5VHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTBmYzY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUGVyc3BlY3RpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gTmV3TGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcml2YXRlIE5ld0xpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5V2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIG51bGwpOwotCQltYWluUGFnZSA9IG5ldyBOZXdMaWJyYXJ5TWFpblBhZ2UoKTsKLQkJYWRkUGFnZShtYWluUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG1haW5QYWdlLmdldExpYnJhcnlOYW1lKCk7Ci0JCQlTdHJpbmcgZGVzYyA9IG1haW5QYWdlLmdldExpYnJhcnlEZXNjcmlwdGlvbigpOwotCQkJU3RyaW5nIHR5cGUgPSBtYWluUGFnZS5nZXRMaWJyYXJ5VHlwZSgpOwotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBvcHRpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUobWFpblBhZ2UuZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCQlpZiAoWE1JTGlicmFyeVV0aWwuY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKGxpYnJhcnlQYXRoCi0JCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfQotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHR5cGUsIG9wdGlvbnMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCWlmIChkZXNjLmxlbmd0aCgpID4gMCkgewotCQkJCQlsaWJyYXJ5LnNldEJyaWVmRGVzY3JpcHRpb24oZGVzYyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE5ld0xpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVBlcnNwZWN0aXZlVXRpbAotCQkJCQkJLm9wZW5QZXJzcGVjdGl2ZShBdXRob3JpbmdQZXJzcGVjdGl2ZS5QRVJTUEVDVElWRV9JRCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAocmVhc29uID09IG51bGwpIHsKLQkJCQlyZWFzb24gPSBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5SW50ZXJubEVycm9yX3JlYXNvbjsKLQkJCX0KLQkJCXJlYXNvbiArPSAiXG5cbiIgKyBBdXRob3JpbmdVSVJlc291cmNlcy5uZXdMaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbik7Ci0JCQl9IGVsc2UgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3TGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld0xpYnJhcnlFcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbk1haW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhZmRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luTWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiwKLSAqIGF1dGhvcnMgYW5kIHJlZmVyZW5jZWQgbWF0aG9kIHBsdWctaW5zIGZvciBhIG5ldyBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdQbHVnaW5NYWluUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE5ld1BsdWdpbk1haW5QYWdlLmNsYXNzLmdldE5hbWUoKTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCBuYW1lVGV4dExhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgbmFtZVRleHQ7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgYXV0aG9yc1RleHQ7Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgcmVmZXJlbmNlZFBsdWdpbnNMYWJlbDsKLQkKLQlwcm90ZWN0ZWQgQ2hlY2tib3hUYWJsZVZpZXdlciByZWZlcmVuY2VkUGx1Z2luc1ZpZXdlcjsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2luczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbk1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLm5ld1BsdWdpbldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5XaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vTmV3LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbk1haW5QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJY3JlYXRlTmFtZUZpZWxkKGNvbXBvc2l0ZSk7Ci0KLQkJY3JlYXRlQnJpZWZEZXNjRmllbGQoY29tcG9zaXRlKTsKLQotCQljcmVhdGVBdXRob3JzRmllbGQoY29tcG9zaXRlKTsKLQotCQljcmVhdGVSZWZlcmVuY2VkTW9kZWxzVmlld2VyKGNvbXBvc2l0ZSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlZmVyZW5jZWRNb2RlbHNWaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlyZWZlcmVuY2VkUGx1Z2luc0xhYmVsID0gY3JlYXRlVmVydGljYWxseUFsaWduZWRMYWJlbChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlUZXh0LlJFRkVSRU5DRURfUExVR0lOU19TRUNUSU9OX05BTUUpOwotCi0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29tcG9zaXRlLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJR3JpZERhdGEgcmVmZXJlbmNlZFBsdWdpbnNHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgKLQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhLmhlaWdodEhpbnQgPSAxNTA7Ci0JCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YSgKLQkJCQlyZWZlcmVuY2VkUGx1Z2luc0dyaWREYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdXRob3JzRmllbGQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVCk7Ci0KLQkJYXV0aG9yc1RleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQoY29tcG9zaXRlLCA0MDAsIDQwLCAxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCcmllZkRlc2NGaWVsZChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGNvbXBvc2l0ZSwgNDAwLCA4MCwgMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTmFtZUZpZWxkKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJbmFtZVRleHRMYWJlbCA9IGNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVRleHQuTkFNRV9URVhUKTsKLQotCQluYW1lVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlpbml0TmFtZUZpZWxkKCk7Ci0JCQotCQlpbml0UmVmZXJlbmNlZE1vZGVsc1ZpZXdlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lRmllbGQoKSB7Ci0JCVN0cmluZyBuYW1lID0gIm5ld19wbHVnLWluIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGwpIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldE5leHRBdmFpbGFibGVOYW1lKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZ2V0TWV0aG9kUGx1Z2lucygpLCBuYW1lKTsKLQkJfQotCQluYW1lVGV4dC5zZXRUZXh0KG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRSZWZlcmVuY2VkTW9kZWxzVmlld2VyKCkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQlyZWZlcmVuY2VkUGx1Z2luc1ZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQotCQlwbHVnaW5zID0gTW9kZWxTdG9yYWdlLmdldEJhc2VNb2RlbHMoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW3BsdWdpbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2lucy5nZXQoaSk7Ci0JCQlpdGVtc1tpXSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCX0KLQotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZmVyZW5jZWRQbHVnaW5zVmlld2VyLmFkZChpdC5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJYWRkTmFtZUZpZWxkTGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmFtZUZpZWxkTGlzdGVuZXJzKCkgewotCQluYW1lVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChuYW1lVGV4dCAhPSBudWxsKSB7Ci0JCQluYW1lVGV4dC5zZXRGb2N1cygpOwotCQkJbmFtZVRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHZhbGlkYXRlUGx1Z2luTmFtZShnZXRQbHVnaW5OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBwbHVnLWluIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIHBsdWctaW4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwbHVnLWluIG5hbWUgaXMgdmFsaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGVycm1zZyA9IExpYnJhcnlVdGlsLmNoZWNrUGx1Z2luTmFtZShudWxsLCBuYW1lKTsKLQkJaWYgKGVycm1zZyAhPSBudWxsKSB7Ci0JCQkvLyBSZW1vdmUgbmV3bGluZSBjaGFyYWN0ZXJzIGZyb20gdGhlIG1lc3NhZ2UgdG8gZml0IGl0IGluIHRoZSBlcnJvcgotCQkJLy8gbWVzc2FnZSBhcmVhIG9mIHRoZSB3aXphcmQgcGFnZS4KLQkJCWVycm1zZyA9IGVycm1zZy5yZXBsYWNlQWxsKCJcblxuIiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm1zZyk7Ci0JCXJldHVybiBlcnJtc2cgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBtZXRob2QgcGx1Zy1pbiBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbk5hbWUoKSB7Ci0JCXJldHVybiBuYW1lVGV4dC5nZXRUZXh0KCkgIT0gbnVsbCA/IG5hbWVUZXh0LmdldFRleHQoKS50cmltKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIG1ldGhvZCBwbHVnLWluIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGUgbmV3IG1ldGhvZCBwbHVnLWluCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWV0aG9kIHBsdWctaW4gYXV0aG9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhdXRob3JzIGZvciB0aGUgbmV3IG1ldGhvZCBwbHVnLWluCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yc1RleHQuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHJlZmVyZW5jZWQgbWV0aG9kIHBsdWctaW5zIGZvciB0aGUgbmV3IG1ldGhvZAotCSAqIHBsdWctaW4uCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlZCBtZXRob2QgcGx1Zy1pbnMgZm9yIHRoZSBuZXcgbWV0aG9kCi0JICogICAgICAgICBwbHVnLWluCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFJlZmVyZW5jZWRQbHVnaW5zKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlZFBsdWdpbnNWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvTmV3UGx1Z2luV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzVjZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL05ld1BsdWdpbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkVkaXRvckNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS52aWV3cy5MaWJyYXJ5VmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgbWV0aG9kIFBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTmV3UGx1Z2luV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBOZXdQbHVnaW5XaXphcmQuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5uZXdQbHVnaW5XaXphcmQiOyAvLyROT04tTkxTLTEkCQotCi0JLy8gVGhlIG1haW4gd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIE5ld1BsdWdpbk1haW5QYWdlIG1haW5QYWdlOwotCi0JLy8gVGhlIG5ldyBtZXRob2QgcGx1Zy1pbi4KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIG5ld1BsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1BsdWdpbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpIHsKLQkJcmV0dXJuIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlci5pbml0KHdvcmtiZW5jaCwgc2VsZWN0aW9uKTsKLQkJc2V0V2luZG93VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJbWFpblBhZ2UgPSBjcmVhdGVNYWluUGFnZSgpOwotCQkJc3VwZXIuYWRkUGFnZShtYWluUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBBcnJheUxpc3Q8SVdpemFyZFBhZ2U+KCk7Ci0KLQkJCUlXaXphcmRQYWdlIHBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoTmV3UGx1Z2luTWFpblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1haW5QYWdlID0gY3JlYXRlTWFpblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQobWFpblBhZ2UpOwotCQkJfQotCi0JCQlzdXBlci5nZXROZXdXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgaXQubmV4dCgpOwotCQkJCXN1cGVyLmFkZFBhZ2Uod2l6YXJkUGFnZSk7Ci0JCQl9Ci0KLQkJCXdpemFyZEV4dGVuZGVyLmluaXRXaXphcmRQYWdlcyh3aXphcmRQYWdlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1haW4gd2l6YXJkIHBhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgTmV3UGx1Z2luTWFpblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTmV3UGx1Z2luTWFpblBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCXRyeSB7Ci0JCQluZXdQbHVnaW4gPSBMaWJyYXJ5U2VydmljZVV0aWwuY3JlYXRlTWV0aG9kUGx1Z2luKG1haW5QYWdlCi0JCQkJCS5nZXRQbHVnaW5OYW1lKCksIG1haW5QYWdlLmdldEJyaWVmRGVzY3JpcHRpb24oKSwgbWFpblBhZ2UKLQkJCQkJLmdldEF1dGhvcnMoKSwgbWFpblBhZ2UuZ2V0UmVmZXJlbmNlZFBsdWdpbnMoKSk7Ci0KLQkJCWluaXRNZXRob2RQbHVnaW4obmV3UGx1Z2luKTsKLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcmVhc29uID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpCi0JCQkJCTogQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luRXJyb3JfcmVhc29uOwotCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMubmV3UGx1Z2luV2l6YXJkX3RpdGxlLAotCQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5uZXdQbHVnaW5FcnJvcl9tc2csIHJlYXNvbiwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBtZXRob2QgcGx1Zy1pbiB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSwgdXBkYXRlcyB0aGUKLQkgKiBMaWJycmF5IHZpZXcgYW5kIG9wZW5zIHRoZSBtZXRob2QgcGx1Zy1pbiBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBuZXdseSBjcmVhdGVkIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGx1Zy1pbiBpcyBpbml0aWFsaXplZCBjb3JyZWN0bHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbml0TWV0aG9kUGx1Z2luKGZpbmFsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJdHJ5IHsKLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRNZXRob2RQbHVnaW4ocGx1Z2luKTsKLQkJCX0KLQotCQkJRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vIFNlbGVjdCB0aGUgbmV3IG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0JCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJCQkJc2VsZWN0aW9uLmFkZChwbHVnaW4pOwotCQkJCQlMaWJyYXJ5Vmlldy5nZXRWaWV3KCkuc2V0U2VsZWN0aW9uVG9WaWV3ZXIoc2VsZWN0aW9uKTsKLQotCQkJCQkvLyBPcGVuIHRoZSBuZXcgbWV0aG9kIHBsdWctaW4gZWRpdG9yLgotCQkJCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihuZXdQbHVnaW4pOwotCQkJCX0KLQkJCX0pOwotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIG1ldGhvZCBwbHVnLWluICciIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHBsdWdpbi5nZXROYW1lKCkgKyAiJyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHN1cGVyUGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1GaW5pc2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0SG9sZGVyID0gbmV3IGJvb2xlYW5bMV07Ci0JCUxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyIHJ1bm5lciA9IG5ldyBMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lcigpOwotCQlydW5uZXIucnVuKG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmVzdWx0SG9sZGVyWzBdID0gc3VwZXJQZXJmb3JtRmluaXNoKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCXJldHVybiByZXN1bHRIb2xkZXJbMF07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TYXZlQWxsRWRpdG9yc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TYXZlQWxsRWRpdG9yc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyY2UzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU2F2ZUFsbEVkaXRvcnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUGFnZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGxpc3RzIHRoZSBjdXJyZW50bHkgb3BlbiBlZGl0b3JzIGFuZCBwcm9tcHRzIHRoZSB1c2VyIHRvCi0gKiBzYXZlIHRoZW0gYmVmb3JlIHBlcmZvcm1pbmcgYW4gaW1wb3J0IG9yIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlQWxsRWRpdG9yc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSA9IEF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9zYXZlQW5kQ2xvc2VQYWdlVGl0bGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRV9BTkRfQ0xPU0VfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVBbmRDbG9zZVBhZ2VEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1BBR0VfVElUTEUgPSBBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2Vfc2F2ZVRpdGxlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfUEFHRV9ERVNDID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX3NhdmVEZXNjcmlwdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBkb0Nsb3NlOwotCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGN0cmxfY2hrYm94VGFibGVWaWV3ZXI7Ci0KLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbDsKLQotCS8qKgotCSAqIEFkZHMgdGhpcyB3aXphcmQgcGFnZSB0byBhIHdpemFyZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCSAqIFRoaXMgcGFnZSB3aWxsIGJlIGFkZGVkIGlmZiB0aGVyZSBhcmUgZGlydHkgbWV0aG9kIGVkaXRvcnMuCi0JICogaWYgZG9DbG9zZSBpcyB0cnVlIGFuZCB0aGVyZSBhcmUgbm8gZGlydHkgZWRpdG9ycywgdGhpcyBtZXRob2Qgd2lsbAotCSAqIGNsb3NlIGFsbCBtZXRob2QgZWRpdG9ycy4KLQkgKiAKLQkgKiBAcGFyYW0gd2l6YXJkCi0JICogICAgICAgICAgICBUaGUgd2l6YXJkIHRvIHdoaWNoIHRoaXMgcGFnZSBtaWdodCBiZSBhZGRlZC4KLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqICAgICAgICAgICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoaXMgcGFnZSB3aWxsIGNsb3NlIGVkaXRvcnMgd2hlbgotCSAqICAgICAgICAgICAgbmV4dCBpcyBjbGlja2VkLiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwYWdlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHdpemFyZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkUGFnZUlmTmVlZGVkKFdpemFyZCB3aXphcmQsIGJvb2xlYW4gZG9DbG9zZSkgewotCQlpZiAoaXNVbnNhdmVkRWRpdG9yKCkpIHsKLQkJCXdpemFyZC5hZGRQYWdlKG5ldyBTYXZlQWxsRWRpdG9yc1BhZ2UoZG9DbG9zZSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoaXMgd2l6YXJkIHBhZ2UgdG8gYSB3aXphcmQgb25seSB3aGVuIG5lY2Vzc2FyeS4KLQkgKiBUaGlzIHBhZ2Ugd2lsbCBiZSBhZGRlZCBpZmYgdGhlcmUgYXJlIGRpcnR5IG1ldGhvZCBlZGl0b3JzLgotCSAqIGlmIGRvQ2xvc2UgaXMgdHJ1ZSBhbmQgdGhlcmUgYXJlIG5vIGRpcnR5IGVkaXRvcnMsIHRoaXMgbWV0aG9kIHdpbGwKLQkgKiBjbG9zZSBhbGwgbWV0aG9kIGVkaXRvcnMuCi0JICogCi0JICogQHBhcmFtIHdpemFyZAotCSAqICAgICAgICAgICAgVGhlIHdpemFyZCB3aGljaCB0aGlzIHBhZ2UgbWlnaHQgYmUgYWRkZWQuCi0JICogQHBhcmFtIGRvQ2xvc2UKLQkgKiAgICAgICAgICAgIElmIDxjb2RlPnRydWU8L2NvZGU+LCB0aGlzIHBhZ2Ugd2lsbCBjbG9zZSBlZGl0b3JzIHdoZW4KLQkgKiAgICAgICAgICAgIG5leHQgaXMgY2xpY2tlZC4gCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFnZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSB3aXphcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZFBhZ2VJZk5lZWRlZChXaXphcmQgd2l6YXJkLCBib29sZWFuIGRvQ2xvc2UsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlKSB7Ci0JCWlmIChpc1Vuc2F2ZWRFZGl0b3IoKSkgewotCQkJU2F2ZUFsbEVkaXRvcnNQYWdlIHBhZ2UgPSBuZXcgU2F2ZUFsbEVkaXRvcnNQYWdlKGRvQ2xvc2UpOwotCQkJaWYgKHRpdGxlICE9IG51bGwpIHsKLQkJCQlwYWdlLnNldFRpdGxlKHRpdGxlKTsKLQkJCX0KLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLQkJCX0KLQkJCXdpemFyZC5hZGRQYWdlKHBhZ2UpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGludGFuY2UuCi0JICovCi0JcHVibGljIFNhdmVBbGxFZGl0b3JzUGFnZShib29sZWFuIGNsb3NlKSB7Ci0JCXN1cGVyKFNBVkVfUEFHRV9USVRMRSk7Ci0JCXRoaXMuZG9DbG9zZSA9IGNsb3NlOwotCQlpZiAoZG9DbG9zZSkgewotCQkJc2V0VGl0bGUoU0FWRV9BTkRfQ0xPU0VfUEFHRV9USVRMRSk7Ci0JCQlzZXREZXNjcmlwdGlvbihTQVZFX0FORF9DTE9TRV9QQUdFX0RFU0MpOwotCQl9IGVsc2UgewotCQkJc2V0VGl0bGUoU0FWRV9QQUdFX1RJVExFKTsKLQkJCXNldERlc2NyaXB0aW9uKFNBVkVfUEFHRV9ERVNDKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoY29udGFpbmVyLAotCQkJCVNXVC5CT1JERVIgfCBTV1QuRklMTCB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gKElFZGl0b3JSZWZlcmVuY2UpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIHJlZi5nZXRFZGl0b3IoZmFsc2UpLmdldFRpdGxlSW1hZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRJbnB1dChFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk1ldGhvZEVkaXRvcnMoKS50b0FycmF5KCkpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvclJlZmVyZW5jZSkgewotCQkJCQlpZiAoKChJRWRpdG9yUmVmZXJlbmNlKWVsZW1lbnQpLmlzRGlydHkoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSkpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkRFRkFVTFQsIFNXVC5CRUdJTk5JTkcsCi0JCQkJZmFsc2UsIHRydWUpKTsKLQotCQlzZWxlY3RBbGwgPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlzZWxlY3RBbGwKLQkJCQkuc2V0VGV4dChBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlzZWxlY3RBbGwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5CRUdJTk5JTkcsIGZhbHNlLAotCQkJCXRydWUpKTsKLQotCQlkZXNlbGVjdEFsbCA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWRlc2VsZWN0QWxsCi0JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMuQXV0aG9yaW5nVUlQbHVnaW5fU2F2ZUFsbEVkaXRvcnNQYWdlX0Rlc2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgZmFsc2UsCi0JCQkJdHJ1ZSkpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoICgpIHsKLQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIgIT0gbnVsbCkgewotCQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpICE9IG51bGwpIHsKLQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkgIT0gbnVsbCkgewotCQkJCQlpZiAoY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCkubGVuZ3RoID09IDApIHsKLQkJCQkJCWlmIChjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsKQotCQkJCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJc2VsZWN0QWxsLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJZGVzZWxlY3RBbGwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaWYgKGdldFdpemFyZCgpICE9IG51bGwpIHsKLQkJCUlXaXphcmRDb250YWluZXIgY29udGFpbmVyID0gZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgV2l6YXJkRGlhbG9nKSB7Ci0JCQkJKChXaXphcmREaWFsb2cpY29udGFpbmVyKS5hZGRQYWdlQ2hhbmdlZExpc3RlbmVyKG5ldyBJUGFnZUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcGFnZUNoYW5nZWQoUGFnZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQkJc2VsZWN0QWxsLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJZGVzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIG91ciBzYXZlIChhbmQgcG9zc2libHkgY2xvc2UpIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcGVyZm9ybVNhdmVBbmRDbG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmV4dFBhZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNhdmVBbmRDbG9zZSgpIHsKLQkJT2JqZWN0W10gY2hlY2tlZEFycmF5ID0gY3RybF9jaGtib3hUYWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGVja2VkQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5zYXZlRWRpdG9yKAotCQkJCQkJCSgoSUVkaXRvclJlZmVyZW5jZSkgY2hlY2tlZEFycmF5W2ldKQotCQkJCQkJCQkJLmdldEVkaXRvcihmYWxzZSksIGZhbHNlKTsKLQkJfQotCQlwZXJmb3JtQ2xvc2UoZG9DbG9zZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwZXJmb3JtQ2xvc2UoYm9vbGVhbiBkb0Nsb3NlKSB7Ci0JCWlmIChkb0Nsb3NlKSB7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkuY2xvc2VBbGxNZXRob2RFZGl0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja2VkIHdoZXRoZXIgdGhlcmUgaXMgYW55IHVuc2F2ZWQgZWRpdG9yIG9wZW4KLQkgKiAKLQkgKiBAcGFyYW0gZG9DbG9zZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhbiB1bnNhdmVkIGVkaXRvciBvcGVuCi0JICogCXRydWUgaWYgZG9DbG9zZSBpcyB0cnVlIGFuZCB0aGVyZSBpcyBhbiBvcGVuIGVkaXRvcgotCSAqICBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5zYXZlZEVkaXRvcigpIHsKLQkJYm9vbGVhbiBhbkVkaXRvcklzRGlydHkgPSBmYWxzZTsKLQkJTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBtZXRob2RFZGl0b3JzID0gRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5NZXRob2RFZGl0b3JzKCk7Ci0JCWZvciAoSXRlcmF0b3I8SUVkaXRvclJlZmVyZW5jZT4gaXRlcmF0b3IgPSBtZXRob2RFZGl0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQlhbkVkaXRvcklzRGlydHkgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIGFuRWRpdG9ySXNEaXJ0eTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09wZW5FZGl0b3IoYm9vbGVhbiBkb0Nsb3NlKSB7Ci0JCUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gbWV0aG9kRWRpdG9ycyA9IEVkaXRvckNob29zZXIuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuTWV0aG9kRWRpdG9ycygpOwotCQlyZXR1cm4gZG9DbG9zZSAmJiBtZXRob2RFZGl0b3JzLnNpemUoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uQ2hvaWNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkNob2ljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1M2EyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uQ2hvaWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogSXQgc3RvcmVzIGFuZCBtYW5hZ2VzIGFsbCBjaG9pY2VzIGZvciBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uQ2hvaWNlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX05PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IFNZTkNfRlJPTV9DT05FVE5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBTWU5DX0ZST01fUFJPQ0VTUyA9IDI7Ci0JCi0JcHJpdmF0ZSBQcm9jZXNzIHNlbGVjdGVkUHJvY2VzczsKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gc2VsZWN0ZWRDb25maWc7Ci0JcHJpdmF0ZSBpbnQgc3luY05hbWU9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNQcmVzTmFtZT0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY0JyaWVmRGVzYz0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY09wdElucHV0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jTWFuSW5wdXQ9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNPdXRwdXQ9IFNZTkNfRlJPTV9DT05FVE5UOwotCXByaXZhdGUgaW50IHN5bmNQcmltUGVyZm9ybWVyPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jQWRkblBlcmZvcm1lcj0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JcHJpdmF0ZSBpbnQgc3luY1Jlc3BSb2xlPSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jQ29udEFydGlmYWN0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jRGVsaXZQYXJ0PSBTWU5DX0ZST01fQ09ORVROVDsKLQlwcml2YXRlIGludCBzeW5jU2VsU3RlcD0gU1lOQ19GUk9NX0NPTkVUTlQ7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGaW5pc2hQcmVzc2VkOwotCi0JLyoqCi0JICogR2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRTZWxlY3RlZFByb2Nlc3MoKSB7Ci0JCXJldHVybiBzZWxlY3RlZFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIHByb2Nlc3MKLQkgKiBAcGFyYW0gc2VsZWN0ZWRQcm9jZXNzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQcm9jZXNzKFByb2Nlc3Mgc2VsZWN0ZWRQcm9jZXNzKSB7Ci0JCXRoaXMuc2VsZWN0ZWRQcm9jZXNzID0gc2VsZWN0ZWRQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIEdldCBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlnKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlbGVjdGVkQ29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZykgewotCQl0aGlzLnNlbGVjdGVkQ29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGNvbnRhaW5lZCBhcnRpZmFjdHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNDb250QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBzeW5jQ29udEFydGlmYWN0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgY29udGFpbmVkIGFydGlmYWN0cwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNDb250QXJ0aWZhY3QoaW50IHN5bmNDb250QXJ0aWZhY3QpIHsKLQkJdGhpcy5zeW5jQ29udEFydGlmYWN0ID0gc3luY0NvbnRBcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNEZWxpdlBhcnQoKSB7Ci0JCXJldHVybiBzeW5jRGVsaXZQYXJ0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jRGVsaXZQYXJ0KGludCBzeW5jRGVsaXZQYXJ0KSB7Ci0JCXRoaXMuc3luY0RlbGl2UGFydCA9IHN5bmNEZWxpdlBhcnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG1hbmRhdG9yeSBpbnB1dAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY01hbklucHV0KCkgewotCQlyZXR1cm4gc3luY01hbklucHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbWFuZGF0b3J5IGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY01hbklucHV0KGludCBzeW5jTWFuSW5wdXQpIHsKLQkJdGhpcy5zeW5jTWFuSW5wdXQgPSBzeW5jTWFuSW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIG9wdGlvbmFsIGlucHV0Ci0JICovCi0JcHVibGljIGludCBnZXRTeW5jT3B0SW5wdXQoKSB7Ci0JCXJldHVybiBzeW5jT3B0SW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBmb3Igc3luY2hyb25pemluZyBvcHRpb25hbCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNPcHRJbnB1dChpbnQgc3luY09wdElucHV0KSB7Ci0JCXRoaXMuc3luY09wdElucHV0ID0gc3luY09wdElucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBvdXRwdXQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN5bmNPdXRwdXQoKSB7Ci0JCXJldHVybiBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgb3V0cHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY091dHB1dChpbnQgc3luY091dHB1dCkgewotCQl0aGlzLnN5bmNPdXRwdXQgPSBzeW5jT3V0cHV0OwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmVzZW50YXRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByZXNOYW1lKCkgewotCQlyZXR1cm4gc3luY1ByZXNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcHJlc2V0bmF0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jUHJlc05hbWUoaW50IHN5bmNQcmVzTmFtZSkgewotCQl0aGlzLnN5bmNQcmVzTmFtZSA9IHN5bmNQcmVzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uIG9mIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1Jlc3BSb2xlKCkgewotCQlyZXR1cm4gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgcmVzcG9uc2libGUgcm9sZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNSZXNwUm9sZShpbnQgc3luY1Jlc3BSb2xlKSB7Ci0JCXRoaXMuc3luY1Jlc3BSb2xlID0gc3luY1Jlc3BSb2xlOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBzdGVwcwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1NlbFN0ZXAoKSB7Ci0JCXJldHVybiBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHN0ZXBzCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1NlbFN0ZXAoaW50IHN5bmNTZWxTdGVwKSB7Ci0JCXRoaXMuc3luY1NlbFN0ZXAgPSBzeW5jU2VsU3RlcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGJvb2xlYW4gdmFsdWUgYmFzZWQgb24gd2l6YXJkIGlzIGNvbXBsZXRlZCBvciBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQoKSB7Ci0JCXJldHVybiBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IG9wdGlvbiBiYXNlZCBvbiB3aXphcmQgaW4gY29tcGxldGVkIG9yIG5vdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaFByZXNzZWQoYm9vbGVhbiBpc0ZpbmlzaFByZXNzZWQpIHsKLQkJdGhpcy5pc0ZpbmlzaFByZXNzZWQgPSBpc0ZpbmlzaFByZXNzZWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGFkZGl0aW9uYWwgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQWRkblBlcmZvcm1lcigpIHsKLQkJcmV0dXJuIHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgYWRkaXRpb25hbCBwZXJmb3JtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5jQWRkblBlcmZvcm1lcihpbnQgc3luY0FkZG5QZXJmb3JtZXIpIHsKLQkJdGhpcy5zeW5jQWRkblBlcmZvcm1lciA9IHN5bmNBZGRuUGVyZm9ybWVyOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3luY1ByaW1QZXJmb3JtZXIoKSB7Ci0JCXJldHVybiBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIHByaW1hcnkgcGVyZm9ybWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY1ByaW1QZXJmb3JtZXIoaW50IHN5bmNQcmltUGVyZm9ybWVyKSB7Ci0JCXRoaXMuc3luY1ByaW1QZXJmb3JtZXIgPSBzeW5jUHJpbVBlcmZvcm1lcjsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhbGwgc3luY2hyb25pemF0aW9uIG9wdGlvbnMvY2hvaWNlcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2J1Zi5hcHBlbmQoIltQcm9jZXNzOiIgKyAoKHNlbGVjdGVkUHJvY2VzcyAhPSBudWxsKT9zZWxlY3RlZFByb2Nlc3MuZ2V0TmFtZSgpOiJudWxsIikgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlzYnVmLmFwcGVuZCgiQ29uZmlndXJhdGlvbjoiICsgKChzZWxlY3RlZENvbmZpZyAhPSBudWxsKT9zZWxlY3RlZENvbmZpZy5nZXROYW1lKCk6Im51bGwiKSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXNidWYuYXBwZW5kKCJOYW1lOiIgKyBzeW5jTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiUHJlc05hbWU6IiArIHN5bmNQcmVzTmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiQnJlaWZEZXNjOiIgKyBzeW5jQnJpZWZEZXNjICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPcHRJbnB1dDoiICsgc3luY09wdElucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJNYW5JbnB1dDoiICsgc3luY01hbklucHV0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJPdXRwdXQ6IiArIHN5bmNPdXRwdXQgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlByaW1QZXJmb3JtZXI6IiArIHN5bmNQcmltUGVyZm9ybWVyICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJBZGRuUGVyZm9ybWVyczoiICsgc3luY0FkZG5QZXJmb3JtZXIgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIlJlc3BSb2xlOiIgKyBzeW5jUmVzcFJvbGUgKyAiOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2J1Zi5hcHBlbmQoIkNvbnRBcnRpZmFjdDoiICsgc3luY0NvbnRBcnRpZmFjdCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzYnVmLmFwcGVuZCgiRGVsaXZQYXJ0OiIgKyBzeW5jRGVsaXZQYXJ0ICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNidWYuYXBwZW5kKCJTZWxTdGVwOiIgKyBzeW5jU2VsU3RlcCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbiBvZiBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jQnJpZWZEZXNjKCkgewotCQlyZXR1cm4gc3luY0JyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgb3B0aW9uIGZvciBzeW5jaHJvbml6aW5nIGJyaWVmIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3luY0JyaWVmRGVzYyhpbnQgc3luY0JyaWVmRGVzYykgewotCQl0aGlzLnN5bmNCcmllZkRlc2MgPSBzeW5jQnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb24gb2Ygc3luY2hyb25pemluZyBuYW1lCi0JICovCi0JcHVibGljIGludCBnZXRTeW5jTmFtZSgpIHsKLQkJcmV0dXJuIHN5bmNOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldCBvcHRpb24gZm9yIHN5bmNocm9uaXppbmcgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bmNOYW1lKGludCBzeW5jTmFtZSkgewotCQl0aGlzLnN5bmNOYW1lID0gc3luY05hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjIwNWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIHdpemFyZCBwYWdlIHdoaWNoIGRlc2NyaWJlcyBjdXN0b20gc3luY2hyb25pemF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmdYdWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25EZXNjcmlwdGlvblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgVGV4dCBjdHJsX2V4cGxhaW5UZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsCi0JCQlTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfZGVzY3JpcHRpb25QYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9kZXNjcmlwdGlvblBhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJU3RyaW5nIGV4cGxhaW5UZXh0ID0gQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX2Rlc2NyaXB0aW9uUGFnZV9leHBsYWluVGV4dDsgCi0JCWN0cmxfZXhwbGFpblRleHQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbXBvc2l0ZSwgIiAiLCA0MDAsIDI0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9leHBsYWluVGV4dC5zZXRUZXh0KGV4cGxhaW5UZXh0KTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWE0MGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFJ1bnMgc3luY2hvbml6YXRpb24gb3BlcmF0aW9uCi0gKiAKLSAqIEBhdXRob3IgQmluZ1h1ZSBYdQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY2hDaG9pY2VzOwotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogCQkJTGlzdCBvZiBlbGVtZW50cyB0byBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcGFyYW0gY2hvaWNlcwotCSAqIAkJCVN5bmNocm9uaXphdGlvbiBvcHRpb25zCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbk9wZXJhdGlvbihDb2xsZWN0aW9uIGVsZW1lbnRzLCBTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJdGhpcy5zeW5jaENob2ljZXMgPSBjaG9pY2VzOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcyNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgd29rZSB1cCBhZnRlciAxIHNlY29uZCBzbGVlcCwgIyIgKyAoaSsxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblByZXZpZXdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MmExNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblByZXZpZXdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXRzIHlvdSBwcmV2aWV3IGVsZW1lbnRzIHRvIGJlIHN5bmNob25pemVkCi0gKiBhbmQgYWxzbyBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uUHJldmlld1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgVGV4dCBjdHJsX3ByZXZpZXdUZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9wcmV2aWV3UGFnZV90aXRsZSk7IAotCQlzZXREZXNjcmlwdGlvbihBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfcHJldmlld1BhZ2VfdGV4dCk7IAotCQl0aGlzLnN5bmNDaG9pY2VzID0gY2hvaWNlczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB3aWRnZXRzLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQkKLQkJU3RyaW5nIGV4cGxhaW5UZXh0ID0gIlByZXZpZXcgdGV4dCBjb21pbmcgaGVyZS5cblxuIiArCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJIlx0VGhpcyBoYXMgdG8gYmUgY29taW5nIGZyb20gc29tZSB1bmRlcmx5aW4gQVBJIGNhbGwuIFRoaXMgbWF5IGJlIGN1dCBvZmYgaWYgdGhlcmUgaXMgbm90IGVub3VnIHRpbWUuIjsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ByZXZpZXdUZXh0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb21wb3NpdGUsICIgIiwgNDAwLCAyNDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfcHJldmlld1RleHQuc2V0VGV4dChleHBsYWluVGV4dCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExMzhhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZHVyaW5nCi0gKiBzeW5jaHJvbml6YXRpb24KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29uZmlnQ29tYm9WaWV3ZXI7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uW10gdmFsaWRDb25maWd1cmF0aW9uczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6YXRpb25TZWxlY3RDb25maWdQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCVN5bmNocm9uaXphdGlvbkNob2ljZXMgY2hvaWNlcykgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3RDb25maWdQYWdlX3RleHQpOyAKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgd2lkZ2V0cy4KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl9Ci0JCQotCQkvLyBhZGQgYW4gZW1wdHkgbGluZQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIgIiwgMik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdENvbmZpZ1BhZ2VfY29uZmlnTGFiZWwpOyAKLQkJCi0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCi0JCS8vIGdldCBhbGwgdmFsaWQgY29uZmlndXJhdGlvbnMsIGFuZCBkZWZhdWx0IG9uZSwgYW5kIHNlbGVjdCBhbmQgc2hvdyB0aGUgZGVmYXVsdCBvbmUKLQkJUHJvY2VzcyBzZWxlY3RlZFByb2Nlc3MgPSBzeW5jQ2hvaWNlcy5nZXRTZWxlY3RlZFByb2Nlc3MoKTsKLQkJdmFsaWRDb25maWd1cmF0aW9ucyA9IChNZXRob2RDb25maWd1cmF0aW9uW10pc2VsZWN0ZWRQcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLnRvQXJyYXkoKTsKLQkJY29uZmlnQ29tYm9WaWV3ZXIuYWRkKHZhbGlkQ29uZmlndXJhdGlvbnMpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBzZWxlY3RlZFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoZGVmYXVsdENvbmZpZyk7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gZGVmYXVsdFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGRlZmF1bHRDb25maWcpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oZGVmYXVsdFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCQotCQlhZGRMaXN0ZW5lcnMoY29tcG9zaXRlKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaW5pdCBjb25maWcgPSIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWcgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc3luY0Nob2ljZXMuc2V0U2VsZWN0ZWRDb25maWcoKE1ldGhvZENvbmZpZ3VyYXRpb24pY29uZmlnWzBdKTsKLQkJfSAKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29uZmlnID0iICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9hdXRob3JpbmcvdWkvd2l6YXJkcy9TeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTc3NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSB3aXphcmQgcGFnZSB3aGljaCBsZXQgdXNlciBzZWxlY3QgcHJvcGVydGllcyBvZiBtZXRob2QgY29udGVudCB0byAKLSAqIGJlIGNvbnNpZGVyZWQgZm9yIHN5bmNob25pemF0aW9uLiAKLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXByaXZhdGUgU3luY2hyb25pemF0aW9uQ2hvaWNlcyBzeW5jQ2hvaWNlcyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYmNfbmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19wcmVzTmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19icmllZkRlc2M7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3B0SW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfbWFuSW5wdXQ7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfb3V0cHV0OwotCXByaXZhdGUgQnV0dG9uIGJjX3ByaW1QZXJmb3JtZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfYWRkblBlcmZvcm1lcjsKLQlwcml2YXRlIEJ1dHRvbiBiY19yZXNwUm9sZTsKLQlwcml2YXRlIEJ1dHRvbiBiY19jb250QXJ0aWZhY3Q7Ci0JcHJpdmF0ZSBCdXR0b24gYmNfZGVsaXZQYXJ0OwotCXByaXZhdGUgQnV0dG9uIGJjX3NlbFN0ZXA7Ci0JCi0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX3ByZXNOYW1lID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfb3B0SW5wdXQgPSBuZXcgQnV0dG9uWzJdOwotLy8JcHJpdmF0ZSBCdXR0b25bXSBicl9tYW5JbnB1dCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX291dHB1dCA9IG5ldyBCdXR0b25bMl07Ci0vLwlwcml2YXRlIEJ1dHRvbltdIGJyX3Jlc3BSb2xlID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfY29udEFydGlmYWN0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfZGVsaXZQYXJ0ID0gbmV3IEJ1dHRvblsyXTsKLS8vCXByaXZhdGUgQnV0dG9uW10gYnJfc2VsU3RlcCA9IG5ldyBCdXR0b25bMl07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemF0aW9uU2VsZWN0RGV0YWlsc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJU3luY2hyb25pemF0aW9uQ2hvaWNlcyBjaG9pY2VzKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3RpdGxlKTsgCi0JCXNldERlc2NyaXB0aW9uKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV90ZXh0KTsgCi0JCXRoaXMuc3luY0Nob2ljZXMgPSBjaG9pY2VzOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQl7Ci0vLwkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCX0KLQkKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfcHJvcGVydGllc19sYWJsZSk7IAotLy8JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIkNvbmV0bnQgVG8gUHJvY2VzcyAgIik7Ci0vLwkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAiICBQcm9jZXNzIFRvIENvbnRlbnQiKTsKLQkJCi0JCWJjX25hbWUgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9uYW1lX2xhYmxlKTsgCi0JCQotCQliY19wcmVzTmFtZSA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3ByZXNlbnRhdGlvbk5hbWVfbGFibGUpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfcHJlc05hbWUpOwotCQkKLQkJYmNfYnJpZWZEZXNjID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfYnJpZWZEZXNjX2xhYmxlKTsgCi0JCQotCQliY19vcHRJbnB1dCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX29wdGlvbmFsSW5vdXRzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX29wdElucHV0KTsKLQkJCi0JCWJjX21hbklucHV0ID0gY3JlYXRlQ2hlY2tib3goY29tcG9zaXRlLCBBdXRob3JpbmdVSVJlc291cmNlcy5zeW5jaHJvbml6YXRpb25XaXphcmRfc2VsZWN0RGV0YWlsc1BhZ2VfbWFuZGF0b3J5SW5wdXRzX2xhYmxlKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX21hbklucHV0KTsKLQkJCi0JCWJjX291dHB1dCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX291dHB1dHNfbGFiZWwpOyAKLS8vCQljcmVhdGVUd29SYWRpb0dyb3VwKGNvbXBvc2l0ZSwgYnJfb3V0cHV0KTsKLQkJCi0JCWJjX3ByaW1QZXJmb3JtZXIgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9wcmltYXJ5UGVyZm9ybWVyX2xhYmVsKTsgCi0JCWJjX2FkZG5QZXJmb3JtZXIgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9hZGRuUGVyZm9ybWVyc19sYWJsZSk7IAotCQkKLQkJYmNfcmVzcFJvbGUgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9yZXNwb25zaWJsZVJvbGVzX2xhYmxlKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX3Jlc3BSb2xlKTsKLQkJCi0JCWJjX2NvbnRBcnRpZmFjdCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX2NvbnRuQXJ0aWZhY3RzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX2NvbnRBcnRpZmFjdCk7Ci0JCQotCQliY19kZWxpdlBhcnQgPSBjcmVhdGVDaGVja2JveChjb21wb3NpdGUsIEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF9zZWxlY3REZXRhaWxzUGFnZV9kaWx2ZWRQYXJ0c19sYWJlbCk7IAotLy8JCWNyZWF0ZVR3b1JhZGlvR3JvdXAoY29tcG9zaXRlLCBicl9kZWxpdlBhcnQpOwotCQkKLQkJYmNfc2VsU3RlcCA9IGNyZWF0ZUNoZWNrYm94KGNvbXBvc2l0ZSwgQXV0aG9yaW5nVUlSZXNvdXJjZXMuc3luY2hyb25pemF0aW9uV2l6YXJkX3NlbGVjdERldGFpbHNQYWdlX3NlbFN0ZXBzX2xhYmVsKTsgCi0vLwkJY3JlYXRlVHdvUmFkaW9Hcm91cChjb21wb3NpdGUsIGJyX3NlbFN0ZXApOwotCQkKLQkJYWRkTGlzdGVuZXJzKGNvbXBvc2l0ZSk7Ci0JCXNldEFsbENoZWNrZWQoKTsKLQkJCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaW5pdCBkZXRhaWwgPSIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEFsbENoZWNrZWQoKSB7Ci0JCWJjX25hbWUuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19wcmVzTmFtZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX2JyaWVmRGVzYy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX29wdElucHV0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfbWFuSW5wdXQuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19vdXRwdXQuc2V0U2VsZWN0aW9uKHRydWUpOwotCQliY19wcmltUGVyZm9ybWVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfYWRkblBlcmZvcm1lci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWJjX3Jlc3BSb2xlLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfY29udEFydGlmYWN0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfZGVsaXZQYXJ0LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJYmNfc2VsU3RlcC5zZXRTZWxlY3Rpb24odHJ1ZSk7CQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lcnMgZm9yIHRoZSBjb250cm9scyBvbiB0aGlzIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycyhmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWJjX25hbWUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfbmFtZS5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQliY19wcmVzTmFtZS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19wcmVzTmFtZS5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX3ByZXNOYW1lWzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfcHJlc05hbWVbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfcHJlc05hbWVbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9wcmVzTmFtZVswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9wcmVzTmFtZVsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1ByZXNOYW1lKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfYnJpZWZEZXNjLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2JyaWVmRGVzYy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0JyaWVmRGVzYyhTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQnJpZWZEZXNjKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJYmNfb3B0SW5wdXQuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfb3B0SW5wdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vcHRJbnB1dFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX29wdElucHV0WzFdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJaWYgKGJyX29wdElucHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY09wdElucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotCQkJCX0gZWxzZSB7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3B0SW5wdXRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgIiArIHN5bmNDaG9pY2VzLnRvU3RyaW5nKCkpOwotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19tYW5JbnB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19tYW5JbnB1dC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX21hbklucHV0WzBdLnNldEVuYWJsZWQodHJ1ZSk7Ci0vLwkJCQkJYnJfbWFuSW5wdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfbWFuSW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJCQkJZWxzZQotLy8JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jTWFuSW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJCQkJCi0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9tYW5JbnB1dFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9tYW5JbnB1dFsxXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX291dHB1dC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19vdXRwdXQuZ2V0U2VsZWN0aW9uKCkpIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9vdXRwdXRbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfb3V0cHV0WzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9vdXRwdXRbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJCQkJYnJfb3V0cHV0WzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3V0cHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWJjX3ByaW1QZXJmb3JtZXIuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoYmNfcHJpbVBlcmZvcm1lci5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJpbVBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfTk9ORSk7Ci0JCQkJfQotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQliY19hZGRuUGVyZm9ybWVyLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChiY19hZGRuUGVyZm9ybWVyLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQWRkblBlcmZvcm1lcihTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNBZGRuUGVyZm9ybWVyKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQkJfQotCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJfQotCQl9KTsKLQkJCi0JCWJjX3Jlc3BSb2xlLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX3Jlc3BSb2xlLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfcmVzcFJvbGVbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlicl9yZXNwUm9sZVsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9yZXNwUm9sZVswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQkJCQllbHNlCi0vLwkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX3Jlc3BSb2xlWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3Jlc3BSb2xlWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfY29udEFydGlmYWN0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2NvbnRBcnRpZmFjdC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9jb250QXJ0aWZhY3RbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jQ29udEFydGlmYWN0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0NvbnRBcnRpZmFjdChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2NvbnRBcnRpZmFjdFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9jb250QXJ0aWZhY3RbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfZGVsaXZQYXJ0LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGJjX2RlbGl2UGFydC5nZXRTZWxlY3Rpb24oKSkgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX2RlbGl2UGFydFsxXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWlmIChicl9kZWxpdlBhcnRbMF0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLQkJCQl9IGVsc2UgewotLy8JCQkJCWJyX2RlbGl2UGFydFswXS5zZXRFbmFibGVkKGZhbHNlKTsKLS8vCQkJCQlicl9kZWxpdlBhcnRbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNEZWxpdlBhcnQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX05PTkUpOwotCQkJCX0KLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYmNfc2VsU3RlcC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCWlmIChiY19zZWxTdGVwLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCQkJYnJfc2VsU3RlcFswXS5zZXRFbmFibGVkKHRydWUpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZCh0cnVlKTsKLS8vCQkJCQlpZiAoYnJfc2VsU3RlcFswXS5nZXRTZWxlY3Rpb24oKSkKLQkJCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCQkJCWVsc2UKLS8vCQkJCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0JCQkJfSBlbHNlIHsKLS8vCQkJCQlicl9zZWxTdGVwWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCWJyX3NlbFN0ZXBbMV0uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19OT05FKTsKLQkJCQl9Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCAiICsgc3luY0Nob2ljZXMudG9TdHJpbmcoKSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQotLy8JCWJyX3ByZXNOYW1lWzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX29wdElucHV0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX21hbklucHV0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX291dHB1dFswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9yZXNwUm9sZVswXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9jb250QXJ0aWZhY3RbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfZGVsaXZQYXJ0WzBdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3NlbFN0ZXBbMF0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJCi0vLwkJYnJfcHJlc05hbWVbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3B0SW5wdXRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfbWFuSW5wdXRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfb3V0cHV0WzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX3Jlc3BSb2xlWzFdLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotLy8JCWJyX2NvbnRBcnRpZmFjdFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLS8vCQlicl9kZWxpdlBhcnRbMV0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0vLwkJYnJfc2VsU3RlcFsxXS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkKLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3ByZXNOYW1lWzBdICYmIGJyX3ByZXNOYW1lWzBdLmdldFNlbGVjdGlvbigpKSB7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUHJlc05hbWUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfb3B0SW5wdXRbMF0gJiYgYnJfb3B0SW5wdXRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPcHRJbnB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9tYW5JbnB1dFswXSAmJiBicl9tYW5JbnB1dFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX0NPTkVUTlQpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX291dHB1dFswXSAmJiBicl9vdXRwdXRbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNPdXRwdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfcmVzcFJvbGVbMF0gJiYgYnJfcmVzcFJvbGVbMF0uZ2V0U2VsZWN0aW9uKCkpIHsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNSZXNwUm9sZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9jb250QXJ0aWZhY3RbMF0gJiYgYnJfY29udEFydGlmYWN0WzBdLmdldFNlbGVjdGlvbigpKSB7Ci0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfZGVsaXZQYXJ0WzBdICYmIGJyX2RlbGl2UGFydFswXS5nZXRTZWxlY3Rpb24oKSkgeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY0RlbGl2UGFydChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9DT05FVE5UKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9zZWxTdGVwWzBdICYmIGJyX3NlbFN0ZXBbMF0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY1NlbFN0ZXAoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fQ09ORVROVCk7Ci0vLwkJfQotLy8KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3ByZXNOYW1lWzFdICYmIGJyX3ByZXNOYW1lWzFdLmdldFNlbGVjdGlvbigpKXsgCi0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNQcmVzTmFtZShTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9vcHRJbnB1dFsxXSAmJiBicl9vcHRJbnB1dFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jT3B0SW5wdXQoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfbWFuSW5wdXRbMV0gJiYgYnJfbWFuSW5wdXRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY01hbklucHV0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX291dHB1dFsxXSAmJiBicl9vdXRwdXRbMV0uZ2V0U2VsZWN0aW9uKCkpeyAKLS8vCQkJc3luY0Nob2ljZXMuc2V0U3luY091dHB1dChTeW5jaHJvbml6YXRpb25DaG9pY2VzLlNZTkNfRlJPTV9QUk9DRVNTKTsKLS8vCQl9Ci0vLwkJaWYgKGV2ZW50LndpZGdldCA9PSBicl9yZXNwUm9sZVsxXSAmJiBicl9yZXNwUm9sZVsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jUmVzcFJvbGUoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfY29udEFydGlmYWN0WzFdICYmIGJyX2NvbnRBcnRpZmFjdFsxXS5nZXRTZWxlY3Rpb24oKSl7Ci0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNDb250QXJ0aWZhY3QoU3luY2hyb25pemF0aW9uQ2hvaWNlcy5TWU5DX0ZST01fUFJPQ0VTUyk7Ci0vLwkJfQotLy8JCWlmIChldmVudC53aWRnZXQgPT0gYnJfZGVsaXZQYXJ0WzFdICYmIGJyX2RlbGl2UGFydFsxXS5nZXRTZWxlY3Rpb24oKSl7IAotLy8JCQlzeW5jQ2hvaWNlcy5zZXRTeW5jRGVsaXZQYXJ0KFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vCQlpZiAoZXZlbnQud2lkZ2V0ID09IGJyX3NlbFN0ZXBbMV0gJiYgYnJfc2VsU3RlcFsxXS5nZXRTZWxlY3Rpb24oKSl7Ci0vLwkJCXN5bmNDaG9pY2VzLnNldFN5bmNTZWxTdGVwKFN5bmNocm9uaXphdGlvbkNob2ljZXMuU1lOQ19GUk9NX1BST0NFU1MpOwotLy8JCX0KLS8vLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6ICIgKyBzeW5jQ2hvaWNlcy50b1N0cmluZygpKTsKLQkJaWYgKHN5bmNDaG9pY2VzLmdldFN5bmNOYW1lKCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jUHJlc05hbWUoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNCcmllZkRlc2MoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNPcHRJbnB1dCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY01hbklucHV0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jT3V0cHV0KCkgPiAwIHx8Ci0JCQlzeW5jQ2hvaWNlcy5nZXRTeW5jUHJpbVBlcmZvcm1lcigpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0FkZG5QZXJmb3JtZXIoKSA+IDAgfHwKLQkJCXN5bmNDaG9pY2VzLmdldFN5bmNSZXNwUm9sZSgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0NvbnRBcnRpZmFjdCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY0RlbGl2UGFydCgpID4gMCB8fAotCQkJc3luY0Nob2ljZXMuZ2V0U3luY1NlbFN0ZXAoKSA+IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBjcmVhdGVUd29SYWRpb0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIEJ1dHRvbltdIHJicykgewotLy8JCUNvbXBvc2l0ZSBhR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotLy8JCQotLy8JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotLy8JCWFHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLS8vCQkKLS8vCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotLy8JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLS8vCQlhR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0vLwkJCi0vLwkJcmJzWzBdID0gY3JlYXRlUmFkaW9CdXR0b24oYUdyb3VwLCAiIiwgMSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQlyYnNbMV0gPSBjcmVhdGVSYWRpb0J1dHRvbihhR3JvdXAsICIiLCAxLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkKLS8vCQlyYnNbMF0uc2V0RW5hYmxlZChmYWxzZSk7Ci0vLwkJcmJzWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvU3luY2hyb25pemF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2MzZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL1N5bmNocm9uaXphdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotCi0vKioKLSAqIFRoZSB3aXphcmQgdGhhdCBndWlkZXMgdXNlciB0byBkbyBjdXN0b20gc3luY2hyb25pemF0aW9uIGZvciBwcm9jZXNzCi0gKiBkZXNjcmlwdG9ycyBmcm9tIG1ldGhvZCBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBCaW5nWHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSBkZXNjUGFnZTsKLQlwcml2YXRlIFN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQlwcml2YXRlIFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlIHNlbGVjdERldGFpbHNQYWdlOwotLy8JcHJpdmF0ZSBTeW5jaHJvbml6YXRpb25QcmV2aWV3UGFnZSBwcmV2aWV3UGFnZTsKLQkKLQlwcml2YXRlIFN5bmNocm9uaXphdGlvbkNob2ljZXMgc3luY0Nob2ljZXMgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXphdGlvbldpemFyZChTeW5jaHJvbml6YXRpb25DaG9pY2VzIGNob2ljZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zeW5jQ2hvaWNlcyA9IGNob2ljZXM7Ci0JCXNldFdpbmRvd1RpdGxlKEF1dGhvcmluZ1VJUmVzb3VyY2VzLnN5bmNocm9uaXphdGlvbldpemFyZF90aXRsZV90ZXh0KTsgCi0JfQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEF1dGhvcmluZ1VJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL3N5bmNocm9uaXphdGlvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRlc2NQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvbkRlc2NyaXB0aW9uUGFnZSgKLQkJCQkiU3luY2hyb25pemF0aW9uRGVzY3JpcHRpb25QYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NQYWdlLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2NyaXB0b3IpOwotCQlhZGRQYWdlKGRlc2NQYWdlKTsKLQotCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UoCi0JCQkJIlN5bmNocm9uaXphdGlvblNlbGVjdENvbmZpZ1BhZ2UiLCBzeW5jQ2hvaWNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJc2VsZWN0Q29uZmlnUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQkJCi0JCXNlbGVjdERldGFpbHNQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvblNlbGVjdERldGFpbHNQYWdlKAotCQkJCSJTeW5jaHJvbml6YXRpb25TZWxlY3REZXRhaWxzUGFnZSIsIHN5bmNDaG9pY2VzKTsgLy8kTk9OLU5MUy0xJAotCQlzZWxlY3REZXRhaWxzUGFnZS5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yKTsKLQkJYWRkUGFnZShzZWxlY3REZXRhaWxzUGFnZSk7Ci0JCQotLy8JCXByZXZpZXdQYWdlID0gbmV3IFN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlKAotLy8JCQkJIlN5bmNocm9uaXphdGlvblByZXZpZXdQYWdlIiwgc3luY0Nob2ljZXMpOyAvLyROT04tTkxTLTEkCi0vLwkJcHJldmlld1BhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0vLwkJYWRkUGFnZShwcmV2aWV3UGFnZSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCXJldHVybiAoc2VsZWN0RGV0YWlsc1BhZ2UuaXNQYWdlQ29tcGxldGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlzeW5jQ2hvaWNlcy5zZXRGaW5pc2hQcmVzc2VkKHRydWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1DYW5jZWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1DYW5jZWwoKSB7Ci0JCXN5bmNDaG9pY2VzLnNldEZpbmlzaFByZXNzZWQoZmFsc2UpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaCwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2F1dGhvcmluZy91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1NjAwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvYXV0aG9yaW5nL3VpL3dpemFyZHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgd2l6YXJkcyBmb3IgYXV0aG9yaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiZTA5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5iYXNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjMWE0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZlYXR1cmVQbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuYmFzZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LmluaSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0ZjRmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lZmVhdHVyZVRleHQKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWFwcGxpY2F0aW9uXzMyLmdpZgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkZmRkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotIyBVc3VhbGx5IGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLgotCi0wPUBidWlsZC1JREAKLTE9MS41LjAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmQ3NTlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwOC4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cblwKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hcHBsaWNhdGlvbl8zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYXBwbGljYXRpb25fMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDc0YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYXBwbGljYXRpb25fMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIG5sLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjlmNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGEvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgLSBiYXNpcwotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CeWdnZWV0aWtldDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGUvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YTgxZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgLSBCYXNpcwotCi1mZWF0dXJlVGV4dD1FUEYgLSBCYXNpc1xuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CdWlsZC1LZW5udW5nOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZXMvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmI2MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZXMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1WZXJzaVx1MDBmM246IHsxfSBcblwKLUV0aXF1ZXRhIGRlIGJ1aWxkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBDb2xhYm9yYWRvcmVzIGRlIEVjbGlwc2UgeSBvdHJvcyAyMDAwLCAyMDA3LiAgUmVzZXJ2YWRvcyB0b2RvcyBsb3MgZGVyZWNob3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvZnIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyNzAyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUJhc2UgRVBGCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVZlcnNpb24gOiB7MX0gXG5cCi1MaWJlbGxcdTAwZTkgZGUgdmVyc2lvbiA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvaXQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkZGJkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVZlcnNpb25lOiB7MX0gXG5cCi1FdGljaGV0dGEgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvamEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwMWQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBCYXNlCi0KLWZlYXR1cmVUZXh0PUVQRiBCYXNlXG5cCi1cblwKLVx1MzBkMFx1MzBmY1x1MzBiOFx1MzBlN1x1MzBmMzogezF9IFxuXAotXHUzMGQzXHUzMGViXHUzMGM5XHUzMGZiXHUzMGU5XHUzMGQ5XHUzMGViOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2Uvbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YzY2ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2Uvbmwva28vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgXHVhZTMwXHViY2Y4Ci0KLWZlYXR1cmVUZXh0PUVQRiBcdWFlMzBcdWJjZjhcblwKLVxuXAotXHViYzg0XHVjODA0OiB7MX0gXG5cCi1cdWJlNGNcdWI0ZGMgXHViODA4XHVjNzc0XHViZTE0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZmM5ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1CYXNlIEVQRgotCi1mZWF0dXJlVGV4dD1CYXNlIEVQRlxuXAotXG5cCi1WZXJzXHUwMGUzbzogezF9IFxuXAotQ29uc3RydVx1MDBlN1x1MDBlM286IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1aWRvcmVzIEVjbGlwc2UgZSBvdXRyb3MgMjAwMCwgMjAwNy4gVG9kb3Mgb3MgRGlyZWl0b3MgUmVzZXJ2YWRvcy5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTdiOTJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3J1L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEYKLQotZmVhdHVyZVRleHQ9XHUwNDExXHUwNDMwXHUwNDM3XHUwNDNlXHUwNDMyXHUwNDRiXHUwNDM5IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzYlx1MDQzNVx1MDQzYVx1MDQ0MiBFUEZcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiB7MX0gXG5cCi1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2FcdTA0MzA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGFiMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgQmFzZQotCi1mZWF0dXJlVGV4dD1FUEYgQmFzZVxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX0gXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdTdiN2VcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIFxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIwMTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIEJhc2UKLQotZmVhdHVyZVRleHQ9RVBGIEJhc2VcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9XG5cCi1cdTVlZmFcdTdmNmVcdTZhMTlcdTdjNjRcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3Mzg5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotZmVhdHVyZVBsdWdpbk5hbWU9RVBGIEJhc2UgRmVhdHVyZQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgQmFzZSBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYmFzZS93ZWxjb21lLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQwZDA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5iYXNlL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzY2U2YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhOGE4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI0ZyaSBKYW4gMDQgMTU6MDk6MDkgUFNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDkwYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkNvbW1vblVJUGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQWJzdHJhY3RQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQWJzdHJhY3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmZTJiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0Fic3RyYWN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucnVudGltZS5JbnRlcm5hbFBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkkxOG5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRVBGIHBsdWctaW5zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIGltcGxlbWVudHMgSUFjdGl2YXRvciB7Ci0KLQotCS8vIFRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBpY29ucy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QQVRIID0gImljb25zLyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQkvLyBUaGUgbG9nZ2VyIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIExvZ2dlcj4gbG9nZ2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9nZ2VyPigpOwotCi0JLy8gVGhlIG1lc3NhZ2UgZGlhbG9nIGhhc2ggbWFwLgotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE1zZ0RpYWxvZz4gbXNnRGlhbG9ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTXNnRGlhbG9nPigpOwotCi0JLy8gVGhlIHNoYXJlZCBpbWFnZSBoYXNoIG1hcC4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBJbWFnZT4gc2hhcmVkSW1hZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbWFnZT4oKTsKLQotCS8vIFRoZSByZXNvdXJjZSBidW5kbGUgZm9yIHRoaXMgcGx1Zy1pbi4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLy8gVGhpcyBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBVUkwuCi0JcHJpdmF0ZSBVUkwgaW5zdGFsbFVSTDsKLQotCS8vIFRoZSBwbHVnLWluIGluc3RhbGwgcGF0aC4KLQlwcml2YXRlIFN0cmluZyBpbnN0YWxsUGF0aDsKLQotCS8vIFRoZSBwbHVnLWluIGljb24gVVJMLgotCXByaXZhdGUgVVJMIGljb25VUkw7Ci0KLQkvLyBUaGUgcHJvZmlsaW5nIGZsYWcuCi0JcHJpdmF0ZSBib29sZWFuIHByb2ZpbGluZzsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEFic3RyYWN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQlpbml0KGNvbnRleHQpOwotCi0JCS8vIHNldCB0aGUgCi0JCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQlnZXRMb2dnZXIoKS5sb2dJbmZvKCJTdGFydGVkICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gRnJlZSB0aGUgc2hhcmVkIGltYWdlcy4KLQkJZm9yIChJdGVyYXRvciBpbWFnZXMgPSBzaGFyZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaW1hZ2VzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZXMubmV4dCgpOwotCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgewotCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0b3BwZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgYnVuZGxlIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBHZXQgdGhlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0KLQkJLy8gR2V0IHRoZSByZXNvdWNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlyZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGJ1bmRsZSk7Ci0KLQkJLy8gR2V0IHRoZSBJRCBmb3IgdGhpcyBwbHVnLWluLgotCQlwbHVnaW5JZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiSW5pdGlhbGl6aW5nICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQotCQl9Ci0KLQkJLy8gR2V0IHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCQlpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJaW5zdGFsbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKGluc3RhbGxVUkwpLmdldFBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW5zdGFsbFBhdGggPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaWNvblVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgSUNPTl9QQVRIKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcga2V5ID0gc3ltYm9saWNOYW1lICsgIi9wcm9maWxpbmciOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBJbnRlcm5hbFBsYXRmb3JtLmdldERlZmF1bHQoKS5nZXRPcHRpb24oa2V5KTsKLQkJCXByb2ZpbGluZyA9IHZhbHVlID09IG51bGwgPyBmYWxzZSA6IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCSJJbml0aWFsaXplZCAiICsgcGx1Z2luSWQgKyAiLCBpbnN0YWxsUGF0aD0iICsgaW5zdGFsbFBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gVGhlCi0JICogICAgICAgICAgICBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gaW5zdGFsbFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsUGF0aCgpIHsKLQkJcmV0dXJuIGluc3RhbGxQYXRoOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGFuZCByZXR1cm5zIHRoZSBsb2NhbGl6ZWQgcHJvcGVydGllcyBvZiBhIEphdmEgcHJvcGVydGllcyBmaWxlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UHJvcGVydGllczwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcHM7Ci0JCX0KLQotCQlTdHJpbmcgZmlsZVBhdGggPSBnZXRMb2NhbGl6ZWRGaWxlKHBhdGgsIHRydWUpOwotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJcHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUgaW4gdGhlCi0JICogcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRGaWxlKFN0cmluZyBwYXRoLCBib29sZWFuIHVzZURlZmF1bHQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZVBhdGggPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShwYXRoKTsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihmaWxlTmFtZSk7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIGVudHJ5ID0gYnVuZGxlc1tpXS5nZXRFbnRyeShwYXRoTmFtZSk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKQotCQkJCQkJCSsgZmlsZU5hbWUsIGxvY2FsZSk7IAotCQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJVVJMIGVudHJ5ID0gYnVuZGxlLmdldEVudHJ5KHBhdGgpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShlbnRyeSk7Ci0JCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKGZpbGVQYXRoID09IG51bGwgJiYgdXNlRGVmYXVsdCkgewotCQkJCQlmaWxlUGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZpbGVQYXRoOwotCX0KLQotCS8qKgotCSAqIGZvciB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUgcGx1Z2luLCBmaW5kIHRoZSBsb2NhbGl6ZWQgZmlsZXMgZm9ybSB0aGUgbmwKLQkgKiBmcmFnZW1lbmV0cyBhbmQgY29weSB0aGUgbG9jYWxpemVkIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgU3RyaW5nIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luIHJvb3QuIFRoZSBmaWxlcyBpbiB0aGlzCi0JICogICAgICAgICAgICBmb2xkZXIgd2lsbCBiZSBpdGVyYXRlZCBhbmQgdGhlaXIgbG9jYWxpemVkIGZpbGVzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGNvcGllZCBvdmVyCi0JICogQHBhcmFtIHRvRGlyCi0JICogICAgICAgICAgICBGSWxlIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiBAcGFyYW0gcmVjdXJzaXZlCi0JICogICAgICAgICAgICBib29sZWFuIHJlY3VyaXZlbHkgbG9va2luZyBmb3IgZmlsZXMgaW50IHRoZSBzcGVjaWZpZWQgZm9sZGVyCi0JICogQHBhcmFtIHVzZUxvY2FsZUZpbGVOYW1lCi0JICogICAgICAgICAgICBib29sZWFuIGlmIHRydWUgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWVzIHdpbGwgYmUgdXNlZCBpbgotCSAqICAgICAgICAgICAgdGhlIGNvcGllZCBkZXN0aW5hdGlvbiwgb3RoZXJ3aXNlLCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZSByZW5hbWVkIHRvIHRoZSBkZWZhdWx0IG9uZSBpbiB0aGUgZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGZvbGRlcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5TG9jYWxpemVkRmlsZXMoU3RyaW5nIHBhdGgsIEZpbGUgdG9EaXIsIGJvb2xlYW4gcmVjdXJzaXZlLAotCQkJYm9vbGVhbiB1c2VMb2NhbGVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBnZXRJbnN0YWxsUGF0aCgpOwotCQlVUkkgcGx1Z2luVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCkudG9VUkkoKTsKLQkJVVJJIHBhdGhVcmkgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBwYXRoKS50b1VSSSgpOwotCi0JCUxpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIHBhdGgpOwotCQlGaWxlVXRpbC5nZXRBbGxGaWxlcyhmLCBmaWxlcywgcmVjdXJzaXZlKTsKLQotCQkvLyBmb3IgZWFjaCBmaWxlIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyLCBnZXQgdGhlIGxvY2FsaXplZCBmaWxlCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlVUkkgc3JjVXJpID0gKChGaWxlKSBpdC5uZXh0KCkpLnRvVVJJKCk7Ci0KLQkJCS8vIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgcGx1Z2luIHJvb3QsIHRoZW4gZmluZAotCQkJLy8gdGhlIGxvY2FsaXplZCBmaWxlCi0JCQlTdHJpbmcgcmVsUGF0aCA9IHBsdWdpblVyaS5yZWxhdGl2aXplKHNyY1VyaSkuZ2V0UGF0aCgpOwotCi0JCQkvLyBvbmx5IGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUsIGRvbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgb25lCi0JCQlTdHJpbmcgbG9jYWxpemVkRmlsZSA9IGdldExvY2FsaXplZEZpbGUocmVsUGF0aCwgZmFsc2UpOwotCQkJaWYgKGxvY2FsaXplZEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBuZWVkIHRvIGNoYW5nZSB0aGUgdGFyZ2V0IGZpbGUgcGF0aCB0byByZWxhdGl2ZSB0byB0aGUgcGF0aAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgcGx1Z2luIHJvb3QKLQkJCXJlbFBhdGggPSBwYXRoVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0JCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShsb2NhbGl6ZWRGaWxlKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRvRGlyLCByZWxQYXRoKTsKLQkJCUZpbGUgdGFyZ2V0UGFyZW50ID0gdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJCS8vIGNvcHkgdGhlIGZpbGUgdG8gdGhlIGRlc2l0aW5hdGlvbgotCQkJLy8gaWYgdXNlTG9jYWxlRmlsZU5hbWUgaXMgdHJ1ZSwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSBzaG91bGQKLQkJCS8vIGFsc28gdXNlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lCi0JCQlpZiAodXNlTG9jYWxlRmlsZU5hbWUpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBzcmNGaWxlLmdldE5hbWUoKTsKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0UGFyZW50LCBmaWxlTmFtZSk7Ci0JCQl9Ci0KLQkJCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGxvY2FsaXplZCBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU291cmNlOiAiICsgc3JjRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhcmdldDogIiArIHRhcmdldEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICghdGFyZ2V0UGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJCXRhcmdldFBhcmVudC5ta2RpcnMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdGFyZ2V0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCi0JCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBsb2NhbGl6ZWQgbWVzc2FnZSBnaXZlbiB0aGUgcmVzb3VyY2Uga2V5IGFuZCB0aGUKLQkgKiBtZXNzYWdlIGFyZ3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGFyZ3VtZW50Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBhcmd1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbXNnID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJT2JqZWN0W10gYXJndW1lbnRzID0geyBhcmd1bWVudCB9OwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIGFyZ3VtZW50cyk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgVVJMIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIFVSTC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0JCQlyZXR1cm4gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoaWNvblVSTCwgcmVsYXRpdmVQYXRoKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2UgbmVlZCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgcmV0dXJuZWQgaW1hZ2Ugd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIHBsdWctaW4KLQkgKiBzaHV0cyBkb3duLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRTaGFyZWRJbWFnZShTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBzaGFyZWRJbWFnZXMuZ2V0KHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW1hZ2U7Ci0JCX0KLQotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VEZXNjcmlwdG9yKHJlbGF0aXZlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlzaGFyZWRJbWFnZXMucHV0KHJlbGF0aXZlUGF0aCwgaW1hZ2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2ZpbGluZyBmbGFnLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgcHJvZmlsaW5nIGlzIGVuYWJsZWQgZm9yIHRoaXMgcGx1LWluCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9maWxpbmcoKSB7Ci0JCXJldHVybiBwcm9maWxpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9nZ2VyIGdpdmVuIHRoZSBwbHVnLWluIElELgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5ldyBvciBjYWNoZWQgbG9nZ2VyLgotCSAqLwotCXB1YmxpYyBMb2dnZXIgZ2V0TG9nZ2VyKCkgewotCQlMb2dnZXIgbG9nZ2VyID0gKExvZ2dlcikgbG9nZ2Vycy5nZXQocGx1Z2luSWQpOwotCQlpZiAobG9nZ2VyID09IG51bGwpIHsKLQkJCWxvZ2dlciA9IG5ldyBMb2dnZXIodGhpcyk7Ci0JCQlsb2dnZXJzLnB1dChwbHVnaW5JZCwgbG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIGRpYWxvZyBnaXZlbiB0aGUgcGx1Zy1pbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgb3IgY2FjaGVkIG1lc3NhZ2UgZGlhbG9nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXNnRGlhbG9nIGdldE1zZ0RpYWxvZyhJQWN0aXZhdG9yIHBsdWdpbikgewotCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gKE1zZ0RpYWxvZykgbXNnRGlhbG9ncy5nZXQocGx1Z2luLmdldElkKCkpOwotCQlpZiAobXNnRGlhbG9nID09IG51bGwpIHsKLQkJCW1zZ0RpYWxvZyA9IG5ldyBNc2dEaWFsb2cocGx1Z2luKTsKLQkJCW1zZ0RpYWxvZ3MucHV0KHBsdWdpbi5nZXRJZCgpLCBtc2dEaWFsb2cpOwotCQl9Ci0JCXJldHVybiBtc2dEaWFsb2c7Ci0JfQotCi0JCi0JcHVibGljIE1zZ0RpYWxvZyBnZXRNc2dEaWFsb2coKSB7CQkKLQkJcmV0dXJuIGdldE1zZ0RpYWxvZyh0aGlzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhbmRhcmQgZGlzcGxheSB0byBiZSB1c2VkLiBUaGUgbWV0aG9kIGZpcnN0IGNoZWNrcywgaWYgdGhlCi0JICogdGhyZWFkIGNhbGxpbmcgdGhpcyBtZXRob2QgaGFzIGFuIGFzc29jaWF0ZWQgZGlzYXBseS4gSWYgc28sIHRoaXMgZGlzcGxheQotCSAqIGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBkZWZhdWx0IGRpc3BsYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5OwotCQlkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCXJldHVybiBkaXNwbGF5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db21tb25VSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9Db21tb25VSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWMzMjQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29tbW9uVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uSU1lc3NhZ2VDYWxsYmFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29tbW9uVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLS8vCQkvLyBzZXQgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoZSBjb21tb24gcGx1Z2luCi0JCVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmVXcmFwcGVyID0gbmV3IFByZWZlcmVuY2VTdG9yZVdyYXBwZXIoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLnNldENvbW1vblByZWZlcmVuY2VTdG9yZShzdG9yZVdyYXBwZXIpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBtZXNzYWdlIGNhbGxiYWNrIGNvbnRleHQgZm9yIHRoZSBub24tdWkgcGx1Z2lucwotCQkvLyB0aGlzIGlzIHRoZSBjb250ZXh0IGZvciBtZXNzYWdlIGNhbGxiYWNrCi0JCS8vIGZvciBlY2xpcHNlIGNsaWVudCwgdGhpcyBpcyB0aGUgU2hlbGwgb2JqZWN0Ci0JCS8vIHNoZWxsIG9iamVjdCBjYW4ndCBiZSBzaGFyZWQgYWNyb29zcyB0aHJlYWQsIHVzZSBhIGNvbnRleHQgcHJvdmlkZXIgaW5zdGVhZAotCQkvL0NvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuc2V0Q29udGV4dChNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQkKLQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5zZXRDb250ZXh0UHJvdmlkZXIobmV3IENvbnRleHRQcm92aWRlcigpKTsKLQkKLQkJLy8gY3JlYXRlIHRoZSBNZXNzYWdlQ2FsbGJhY2sgdG8gYmUgYWNjZXNzaWJsZSB0byB0aGUgbm9uLXVpIHBsdWdpbgotCQlJTWVzc2FnZUNhbGxiYWNrIG1zZ0NhbGxiYWNrID0gbmV3IE1lc3NhZ2VDYWxsYmFjaygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vblVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29udGV4dFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL0NvbnRleHRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2JmM2M4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvQ29udGV4dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLklDb250ZXh0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLQotLyoqCi0gKiBjb250ZW50IHByb3ZpZGVyIGZvciBub24tdWkgcGx1Z2lucwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRleHRQcm92aWRlciBpbXBsZW1lbnRzIElDb250ZXh0UHJvdmlkZXIgewotCi0JcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCQkvL1RPRE86IHJldmlzaXQKLQkJT2JqZWN0IGN0eCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljdHggPSBDb21tb25VSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCS8vCi0JCX0KLQkJcmV0dXJuIGN0eCAhPSBudWxsID8gY3R4IDogTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9NZXNzYWdlQ2FsbGJhY2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvTWVzc2FnZUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODM1MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9NZXNzYWdlQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JTWVzc2FnZUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci0KLS8qKgotICogbWVzc2FnZSBjYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VDYWxsYmFjayBpbXBsZW1lbnRzIElNZXNzYWdlQ2FsbGJhY2sgewotCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJZGlzcGxheVdhcm5pbmcocGx1Z2luLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIG51bGwpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXlXYXJuaW5nKHBsdWdpbiwgbXNnLCByZWFzb24sIG51bGwsIGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCVN0cmluZyB0aXRsZSA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKS5nZXRUZXh0KCk7Ci0JCWRpc3BsYXlXYXJuaW5nKHBsdWdpbiwgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlNc2dEaWFsb2cgZGxnID0gQ29tbW9uVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZyhwbHVnaW4pOwotCQlkbGcuZGlzcGxheVdhcm5pbmcodGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlkaXNwbGF5RXJyb3IocGx1Z2luLCB0aXRsZSwgbXNnLCBudWxsLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheUVycm9yKHBsdWdpbiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgZXgpOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFN0cmluZyBkZXRhaWxzLCBUaHJvd2FibGUgZXgpIHsKLQkJTXNnRGlhbG9nIGRsZyA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2cocGx1Z2luKTsKLQkJZGxnLmRpc3BsYXlFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIGV4KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS9QcmVmZXJlbmNlU3RvcmVXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1ByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlZTQ3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1ByZWZlcmVuY2VTdG9yZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogd3JhcHBlciBjbGFzcyBmb3IgcHJlZmVyZW5jZSBzdG9yZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VTdG9yZVdyYXBwZXIgaW1wbGVtZW50cyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciB7Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCXB1YmxpYyBQcmVmZXJlbmNlU3RvcmVXcmFwcGVyKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJdGhpcy5zdG9yZSA9IHN0b3JlOwotCX0KLQkKLQlNYXA8SVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJNYXAgPSBuZXcgSGFzaE1hcDxJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIsIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPigpOwotCQotCXB1YmxpYyBJUHJlZmVyZW5jZVN0b3JlIGdldFN0b3JlKCkgewotCQlyZXR1cm4gc3RvcmU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmaW5hbCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgbGlzdGVuZXIpIHsKLQkJLy8gY3JlYXRlIGEgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhbmQgYWRkIHRvIHRoZSBzdG9yZQotCQlJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wgPSBuZXcgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKXsKLQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIHdyYXBwZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIoZXZlbnQpOwotCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlKHdyYXBwZXIpOwotCQkJCQotCQkJfX07Ci0JCQotCQlsaXN0ZW5lck1hcC5wdXQobGlzdGVuZXIsIHBjbCk7Ci0JCXN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocGNsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLQkgICAgICAgICAgICBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3RvcmUuZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciBsaXN0ZW5lcikgewotICAgIAlJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwY2wgPSBsaXN0ZW5lck1hcC5yZW1vdmUobGlzdGVuZXIpOwotICAgIAlpZiAoIHBjbCAhPSBudWxsICkgewotICAgIAkJc3RvcmUucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwY2wpOwotICAgIAl9Ci0gICAgfQotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGJvb2xlYW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXRCb29sZWFuKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPmZhbHNlPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHREb3VibGUobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGZsb2F0LgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGZsb2F0IGdldERlZmF1bHRGbG9hdChTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdEZsb2F0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXREZWZhdWx0SW50KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjBMPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBsb25nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0RGVmYXVsdExvbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldERlZmF1bHRMb25nKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzdHJpbmctdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAodGhlIGVtcHR5IHN0cmluZyA8Y29kZT4iIjwvY29kZT4pIAotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZG91YmxlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZShTdHJpbmcgbmFtZSkgewotICAgIAlyZXR1cm4gc3RvcmUuZ2V0RG91YmxlKG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBmbG9hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldEZsb2F0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MDwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ3Rlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgaW50LXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbnQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldEludChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjBMPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmdldExvbmcobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKHRoZSBlbXB0eSBzdHJpbmcgPGNvZGU+IiI8L2NvZGU+KQotICAgICAqIGlmIHRoZXJlIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiBzdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUKLSAgICAgKiBoYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaGFzIGEga25vd24gZGVmYXVsdCB2YWx1ZQotICAgICAqIGFuZCBpdHMgY3VycmVudCB2YWx1ZSBpcyB0aGUgc2FtZSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLSAgICAgKiAoaW5jbHVkaW5nIHRoZSBjYXNlIHdoZXJlIHRoZSBwcmVmZXJlbmNlIGlzIHVua25vd24gdG8gdGhpcyBzdG9yZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuIHN0b3JlLmlzRGVmYXVsdChuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWVzIGluIHRoaXMgcHJvcGVydHkgc3RvcmUKLSAgICAgKiByZXF1aXJlIHNhdmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIG9mIHZhbHVlcyBvZiAKLSAgICAgKiAgdGhlIHByZWZlcmVuY2VzIGtub3duIHRvIHRoaXMgc3RvcmUgaGFzIGNoYW5nZWQgYW5kIAotICAgICAqICByZXF1aXJlcyBzYXZpbmcsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzU2F2aW5nKCkgewotICAgIAlyZXR1cm4gc3RvcmUubmVlZHNTYXZpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUgdG8KLSAgICAgKiB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlIHdpdGhvdXQgc2VuZGluZyBhIHByb3BlcnR5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGFuZCAKLSAgICAgKiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzZXR0aW5nIGludGVybmFsIHByZWZlcmVuY2VzIAotICAgICAqIHRoYXQgYXJlIG5vdCBtZWFudCB0byBiZSBwcm9jZXNzZWQgYnkgbGlzdGVuZXJzLgotICAgICAqIE5vcm1hbCBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGNhbGwgI3NldFZhbHVlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAJc3RvcmUucHV0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gZGVmYXVsdE9iamVjdCB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHRPYmplY3QpIHsKLSAgICAJc3RvcmUuc2V0RGVmYXVsdChuYW1lLCBkZWZhdWx0T2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBiYWNrCi0gICAgICogdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gdGhlCi0gICAgICogYXBwcm9wcmlhdGUgZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByZW1vdmluZyB0aGUgbmFtZWQgdmFsdWUgZnJvbSB0aGUgc3RvcmUsIAotICAgICAqIHRoZXJlYnkgZXhwb3NpbmcgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRUb0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLSAgICAJc3RvcmUuc2V0VG9EZWZhdWx0KG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZG91YmxlIHZhbHVlKSB7Ci0gICAgCXN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgewotICAgIAlzdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICAJc3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2OThlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL1Byb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogd3JhcHBlciBjbGFzcyBmb3IgcHJvcGVydHkgY2hhbmdlIGV2ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgewotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcihQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXZlbnQgPSBldmVudDsKLQl9Ci0JCi0JICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIG5ldyB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGtub3duCi0gICAgICogIG9yIG5vdCByZWxldmFudCAoZm9yIGluc3RhbmNlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgcmVtb3ZlZCkuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROZXdWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgb2xkIHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24KLSAgICAgKiAgb3Igbm90IHJlbGV2YW50IChmb3IgaW5zdGFuY2UgaWYgdGhlIHByb3BlcnR5IHdhcyBqdXN0Ci0gICAgICogIGFkZGVkIGFuZCB0aGVyZSB3YXMgbm8gb2xkIHZhbHVlKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9sZFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXYXJuaW5nOiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgcHJvcGVydHkgbmFtZSByZXR1cm5lZAotICAgICAqIGlzIGEgY29uc3RhbnQgc3RyaW5nLiAgQ2FsbGVycyBtdXN0IGNvbXBhcmUgcHJvcGVydHkgbmFtZXMgdXNpbmcKLSAgICAgKiBlcXVhbHMsIG5vdCA9PS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgewotICAgICAgICByZXR1cm4gdGhpcy5ldmVudC5nZXRQcm9wZXJ0eSgpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvYWN0aW9ucy9DQ29tYm9Db250cmlidXRpb25JdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmJhNDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvYWN0aW9ucy9DQ29tYm9Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFdyYXBzIGEgQ0NvbWJvIGluIGEgQ29udHJpYnV0aW9uSXRlbSBmb3IgdXNlIGluIGEgdG9vbGJhcgotICogCi0gKiBEb2VzIG5vdCB1c2UgYSBDb21ib1ZpZXdlciBiZWNhdXNlIG9mIHRhYmJpbmcgaXNzdWVzIC0gc2VlIGJ1ZyA3ODg4NQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbSBleHRlbmRzIENvbnRyaWJ1dGlvbkl0ZW0gewotCi0JcHJvdGVjdGVkIENDb21ibyBDQ29tYm87Ci0KLQlwcm90ZWN0ZWQgVG9vbEl0ZW0gdG9vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0JCi0JcHJvdGVjdGVkIGludCBzdHlsZTsKLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGlucHV0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ0NvbWJvQ29udHJpYnV0aW9uSXRlbShpbnQgc3R5bGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChUb29sQmFyIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQl0b29sSXRlbS5zZXRDb250cm9sKGJveCk7Ci0JCVBvaW50IHByZWZlcnJlZFNpemUgPSBDQ29tYm8uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJdG9vbEl0ZW0uc2V0V2lkdGgocHJlZmVycmVkU2l6ZS54KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoQ29vbEJhciBjb29sQmFyLCBpbnQgaW5kZXgpIHsKLQkJQ29udHJvbCBib3ggPSBjcmVhdGVDb250cm9sKGNvb2xCYXIpOwotCi0JCWlmIChpbmRleCA+PSAwKSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOLCBpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQljb29sSXRlbSA9IG5ldyBDb29sSXRlbShjb29sQmFyLCBTV1QuRFJPUF9ET1dOKTsKLQkJfQotCi0JCS8vIFNldCB0aGUgYmFjayByZWZlcmVuY2UuCi0JCWNvb2xJdGVtLnNldERhdGEodGhpcyk7Ci0KLQkJLy8gQWRkIHRoZSB0b29sYmFyIHRvIHRoZSBDb29sSXRlbSB3aWRnZXQuCi0JCWNvb2xJdGVtLnNldENvbnRyb2woYm94KTsKLQotCQkvLyBJZiB0aGUgdG9vbGJhciBpdGVtIGV4aXN0cyB0aGVuIGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgY29vbCBpdGVtLgotCQlQb2ludCB0b29sQmFyU2l6ZSA9IGJveC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCS8vIFNldCB0aGUgcHJlZmVycmVkIHNpemUgdG8gdGhlIHNpemUgb2YgdGhlIHRvb2xiYXIgcGx1cyB0cmltLgotCQljb29sSXRlbS5zZXRNaW5pbXVtU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFByZWZlcnJlZFNpemUodG9vbEJhclNpemUpOwotCQljb29sSXRlbS5zZXRTaXplKHRvb2xCYXJTaXplKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9sLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRyb2woZmluYWwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlDQ29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlDQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCUNDb21iby5zZXRFbmFibGVkKHRydWUpOwotCQlDQ29tYm8uc2V0SXRlbXMoaW5wdXQudG9BcnJheShuZXcgU3RyaW5nWzBdKSk7Ci0JCUNDb21iby5hZGREaXNwb3NlTGlzdGVuZXIoCi0JCQkJbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlkaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlDQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCXJldHVybiBDQ29tYm87Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIENDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnB1dChDb2xsZWN0aW9uPFN0cmluZz4gaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgQ0NvbWJvIGdldENDb21ibygpIHsKLQkJcmV0dXJuIENDb21ibzsKLQl9Ci0KLQlwdWJsaWMgVG9vbEl0ZW0gZ2V0VG9vbEl0ZW0oKSB7Ci0JCXJldHVybiB0b29sSXRlbTsKLQl9Ci0KLQlwdWJsaWMgQ29vbEl0ZW0gZ2V0Q29vbEl0ZW0oKSB7Ci0JCXJldHVybiBjb29sSXRlbTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ2xpcGJvYXJkVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NsaXBib2FyZFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiZjAyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ2xpcGJvYXJkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHJldHJpZXZpbmcgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2xpcGJvYXJkVXRpbCB7Ci0JCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgY2xpcGJvYXJkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIENsaXBib2FyZCBjbGlwYm9hcmQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09VUkNFX1VSTCA9ICJTb3VyY2VVUkw6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNmZXIgaHRtbFRyYW5zZmVyID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0KLQkJCQkJCS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlDbGFzcyBjID0gYnVuZGxlCi0JCQkJCQkubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLldpbjMySFRNTFRyYW5zZmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJCWh0bWxUcmFuc2ZlciA9IChUcmFuc2ZlcikgYy5uZXdJbnN0YW5jZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaHRtbFRyYW5zZmVyID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgc291cmNlIFVSTCBmcm9tIHRoZSBjdXJyZW50IGNsaXBib2FyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBIVE1MIHNvdXJjZSBVUkwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIVE1MU291cmNlVVJMKCkgewotCQlpZiAoaHRtbFRyYW5zZmVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlTdHJpbmcgc291cmNlVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBodG1sQ29udGVudCA9IChTdHJpbmcpIGNsaXBib2FyZC5nZXRDb250ZW50cyhodG1sVHJhbnNmZXIpOwotCQkJaWYgKGh0bWxDb250ZW50ICE9IG51bGwgJiYgaHRtbENvbnRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW50IGluZGV4ID0gaHRtbENvbnRlbnQuaW5kZXhPZihTT1VSQ0VfVVJMKTsKLQkJCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJCXNvdXJjZVVSTCA9IGh0bWxDb250ZW50LnN1YnN0cmluZyhpbmRleAotCQkJCQkJCSsgU09VUkNFX1VSTC5sZW5ndGgoKSk7Ci0JCQkJCXNvdXJjZVVSTCA9IHNvdXJjZVVSTC5zdWJzdHJpbmcoMCwgc291cmNlVVJMCi0JCQkJCQkJLmluZGV4T2YoRmlsZVV0aWwuTElORV9TRVApKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc291cmNlVVJMICE9IG51bGwgJiYgc291cmNlVVJMLmluZGV4T2YoIlxcIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIElFIHByb3ZpZGVzIHNvdXJjZVVSTCBpbiBmb3JtICJmaWxlOi8vQzpcZm9vXGJhci5odG0iCi0JCQkJLy8gYnV0IHdoZW4gdGhlIGhyZWZzIGFyZSByZXNvbHZlZCwgZmlsZXMgbG9vayBsaWtlICJmaWxlOi8vL0M6L2Zvby9iYXIuaHRtIgotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHNvdXJjZVVSTCk7Ci0JCQkJc291cmNlVVJMID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJaWYgKHNvdXJjZVVSTC5zdGFydHNXaXRoKCJmaWxlOi8vIikgJiYgIXNvdXJjZVVSTC5zdGFydHNXaXRoKCJmaWxlOi8vLyIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkvLyBuZWVkIHRvIGFkZCBhIHRoaXJkIC8gc28gcnRlLmpzIGNhbiBtYXRjaCB0aGUgc291cmNlVVJMIHRvIGhyZWZzCi0JCQkJCXNvdXJjZVVSTCA9ICJmaWxlOi8vLyIgKyBzb3VyY2VVUkwuc3Vic3RyaW5nKDcpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNvdXJjZVVSTDsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHVybEV4KSB7Ci0JCQlyZXR1cm4gc291cmNlVVJMOwotCQl9IGZpbmFsbHkgewotCQkJY2xpcGJvYXJkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcHkgdGhlIHN0cmluZyB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VGV4dEhUTUxUb0NsaXBib2FyZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChjbGlwYm9hcmQgIT0gbnVsbCkKLQkJCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0JCWNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQobnVsbCk7Ci0JCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10geyBzdHJpbmcsIHN0cmluZyB9LAotCQkJCW5ldyBUcmFuc2ZlcltdIHsgVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEhUTUxUcmFuc2Zlci5nZXRJbnN0YW5jZSgpIH0pOwotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0NvbW1vblByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ29tbW9uUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3YzYzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvQ29tbW9uUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5Db21tb25VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgY29tbW9uIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciBzdG9yaW5nIHRoZSBwcmVmZXJlbmNlIGhpc3Rvcnkgc2l6ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUgPSAicHJlZmVyZW5jZUhpc3RvcnlTaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IENvbW1vblVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFJFRkVSRU5DRV9ISVNUT1JZX1NJWkUsCi0JCQkJZ2V0RGVmYXVsdFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgaGlzdG9yeSBzaXplLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSB7Ci0JCXJldHVybiAxMDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmVmZXJlbmNlIGhpc3Rvcnkgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRQcmVmZXJlbmNlSGlzdG9yeVNpemUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0SW50KFBSRUZFUkVOQ0VfSElTVE9SWV9TSVpFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcHJlZmVyZW5jZSBoaXN0b3J5IHNpemUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByZWZlcmVuY2VIaXN0b3J5U2l6ZShpbnQgdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBSRUZFUkVOQ0VfSElTVE9SWV9TSVpFLCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvRXJyb3JEaWFsb2dOb1JlYXNvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL0Vycm9yRGlhbG9nTm9SZWFzb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyNzFjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvRXJyb3JEaWFsb2dOb1JlYXNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5DbGlwYm9hcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UZXh0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERpc3BsYXlzIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzIGJ1dHRvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvckRpYWxvZ05vUmVhc29uIGV4dGVuZHMgSWNvbkFuZE1lc3NhZ2VEaWFsb2cgewotCi0JLyoqCi0JICogU3RhdGljIHRvIHByZXZlbnQgb3BlbmluZyBvZiBlcnJvciBkaWFsb2dzIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT01BVEVEX01PREUgPSBmYWxzZTsKLQotCS8qKgotCSAqIFJlc2VydmUgcm9vbSBmb3IgdGhpcyBtYW55IGxpc3QgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJU1RfSVRFTV9DT1VOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbmVzdGluZyBpbmRlbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FU1RJTkdfSU5ERU5UID0gIiAgIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIERldGFpbHMgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gZGV0YWlsc0J1dHRvbjsKLQotCS8qKgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLyoqCi0JICogVGhlIFNXVCBsaXN0IGNvbnRyb2wgdGhhdCBkaXNwbGF5cyB0aGUgZXJyb3IgZGV0YWlscy4KLQkgKi8KLQlwcml2YXRlIExpc3QgbGlzdDsKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlcnJvciBkZXRhaWxzIHZpZXdlciBpcyBjdXJyZW50bHkgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEZpbHRlciBtYXNrIGZvciBkZXRlcm1pbmluZyB3aGljaCBzdGF0dXMgaXRlbXMgdG8gZGlzcGxheS4KLQkgKi8KLQlwcml2YXRlIGludCBkaXNwbGF5TWFzayA9IDB4RkZGRjsKLQotCS8qKgotCSAqIFRoZSBtYWluIHN0YXR1cyBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1czsKLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IGNsaXBib2FyZC4gVG8gYmUgZGlzcG9zZWQgd2hlbiBjbG9zaW5nIHRoZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBDbGlwYm9hcmQgY2xpcGJvYXJkOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZEluY2x1ZGVUb3BMZXZlbEVycm9ySW5EZXRhaWxzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVycm9yIGRpYWxvZy4gTm90ZSB0aGF0IHRoZSBkaWFsb2cgd2lsbCBoYXZlIG5vIHZpc3VhbAotCSAqIHJlcHJlc2VudGF0aW9uIChubyB3aWRnZXRzKSB1bnRpbCBpdCBpcyB0b2xkIHRvIG9wZW4uCi0JICogPHA+Ci0JICogTm9ybWFsbHkgb25lIHNob3VsZCB1c2UgPGNvZGU+b3BlbkVycm9yPC9jb2RlPiB0byBjcmVhdGUgYW5kIG9wZW4gb25lCi0JICogb2YgdGhlc2UuIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZnVsIG9ubHkgaWYgdGhlIGVycm9yIG9iamVjdCBiZWluZwotCSAqIGRpc3BsYXllZCBjb250YWlucyBjaGlsZCBpdGVtcyA8aXQ+YW5kIDwvaXQ+IHlvdSBuZWVkIHRvIHNwZWNpZnkgYSBtYXNrCi0JICogd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiB0aGVzZSBjaGlsZHJlbi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICB0aGUgc2hlbGwgdW5kZXIgd2hpY2ggdG8gY3JlYXRlIHRoaXMgZGlhbG9nCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogICAgICAgICAgICB0aGUgdGl0bGUgdG8gdXNlIGZvciB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGRlZmF1bHQgdGl0bGUgc2hvdWxkIGJlIHVzZWQKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGlzIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGluZGljYXRlIHRoYXQgdGhlIGVycm9yJ3MgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24gYXMgdGhlCi0JICogICAgICAgICAgICBwcmltYXJ5IG1lc3NhZ2UKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgdG8gc2hvdyB0byB0aGUgdXNlcgotCSAqIEBwYXJhbSBkaXNwbGF5TWFzawotCSAqICAgICAgICAgICAgdGhlIG1hc2sgdG8gdXNlIHRvIGZpbHRlciB0aGUgZGlzcGxheWluZyBvZiBjaGlsZCBpdGVtcywgYXMKLQkgKiAgICAgICAgICAgIHBlciA8Y29kZT5JU3RhdHVzLm1hdGNoZXM8L2NvZGU+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwdWJsaWMgRXJyb3JEaWFsb2dOb1JlYXNvbihTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzLCBpbnQgZGlzcGxheU1hc2spIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnRpdGxlID0gZGlhbG9nVGl0bGUgPT0gbnVsbCA/IEpGYWNlUmVzb3VyY2VzCi0JCQkJLmdldFN0cmluZygiUHJvYmxlbV9PY2N1cnJlZCIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZ1RpdGxlOwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlID09IG51bGwgPyBzdGF0dXMuZ2V0TWVzc2FnZSgpIDogbWVzc2FnZTsgCi0JCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQl0aGlzLmRpc3BsYXlNYXNrID0gZGlzcGxheU1hc2s7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuIEhhbmRsZXMgdGhlIHByZXNzaW5nIG9mIHRoZSBPawotCSAqIG9yIERldGFpbHMgYnV0dG9uIGluIHRoaXMgZGlhbG9nLiBJZiB0aGUgT2sgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gY2xvc2UKLQkgKiB0aGlzIGRpYWxvZy4gSWYgdGhlIERldGFpbHMgYnV0dG9uIHdhcyBwcmVzc2VkIHRoZW4gdG9nZ2xlIHRoZSBkaXNwbGF5aW5nCi0JICogb2YgdGhlIGVycm9yIGRldGFpbHMgYXJlYS4gTm90ZSB0aGF0IHRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIG9ubHkgYmUKLQkgKiB2aXNpYmxlIGlmIHRoZSBlcnJvciBiZWluZyBkaXNwbGF5ZWQgc3BlY2lmaWVzIGNoaWxkIGRldGFpbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgaWQpIHsKLQkJaWYgKGlkID09IElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCkgewotCQkJLy8gd2FzIHRoZSBkZXRhaWxzIGJ1dHRvbiBwcmVzc2VkPwotCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmJ1dHRvblByZXNzZWQoaWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBpbiBXaW5kb3cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRpdGxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIE9LIGFuZCBEZXRhaWxzIGJ1dHRvbnMKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJaWYgKHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkpIHsKLQkJCWRldGFpbHNCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQsCi0JCQkJCUlEaWFsb2dDb25zdGFudHMuU0hPV19ERVRBSUxTX0xBQkVMLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5EaWFsb2c8L2NvZGU+IGZyYW1ld29yayBtZXRob2QgY3JlYXRlcwotCSAqIGFuZCBsYXlzIG91dCBhIGNvbXBvc2l0ZSBhbmQgY2FsbHMgPGNvZGU+Y3JlYXRlTWVzc2FnZUFyZWE8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNyZWF0ZUN1c3RvbUFyZWE8L2NvZGU+IHRvIHBvcHVsYXRlIGl0LiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIDxjb2RlPmNyZWF0ZUN1c3RvbUFyZWE8L2NvZGU+IHRvIGFkZCBjb250ZW50cyBiZWxvdyB0aGUKLQkgKiBtZXNzYWdlLgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVNZXNzYWdlQXJlYShwYXJlbnQpOwotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgd2l0aCBzdGFuZGFyZCBtYXJnaW5zIGFuZCBzcGFjaW5nCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfTUFSR0lOKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBjaGlsZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY2hpbGREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoY2hpbGREYXRhKTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEljb25BbmRNZXNzYWdlRGlhbG9nI2NyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEoQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURpYWxvZ0FuZEJ1dHRvbkFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVEaWFsb2dBbmRCdXR0b25BcmVhKHBhcmVudCk7Ci0JCWlmICh0aGlzLmRpYWxvZ0FyZWEgaW5zdGFuY2VvZiBDb21wb3NpdGUpIHsKLQkJCS8vIENyZWF0ZSBhIGxhYmVsIGlmIHRoZXJlIGFyZSBubyBjaGlsZHJlbiB0byBmb3JjZSBhIHNtYWxsZXIgbGF5b3V0Ci0JCQlDb21wb3NpdGUgZGlhbG9nQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgZGlhbG9nQXJlYTsKLQkJCWlmIChkaWFsb2dDb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCkKLQkJCQluZXcgTGFiZWwoZGlhbG9nQ29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSWNvbkFuZE1lc3NhZ2VEaWFsb2cjZ2V0SW1hZ2UoKQotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCXJldHVybiBnZXRXYXJuaW5nSW1hZ2UoKTsKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLklORk8pCi0JCQkJcmV0dXJuIGdldEluZm9JbWFnZSgpOwotCQl9Ci0JCS8vIElmIGl0IHdhcyBub3QgYSB3YXJuaW5nIG9yIGFuIGVycm9yIHRoZW4gcmV0dXJuIHRoZSBlcnJvciBpbWFnZQotCQlyZXR1cm4gZ2V0RXJyb3JJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSB0aGlzIGRpYWxvZydzIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGRyb3AtZG93biBsaXN0IGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZURyb3BEb3duTGlzdChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSB0aGUgbGlzdAotCQlsaXN0ID0gbmV3IExpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMCi0JCQkJfCBTV1QuTVVMVEkpOwotCQkvLyBmaWxsIHRoZSBsaXN0Ci0JCXBvcHVsYXRlTGlzdChsaXN0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBsaXN0LmdldEl0ZW1IZWlnaHQoKSAqIExJU1RfSVRFTV9DT1VOVDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGlzdC5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlNZW51IGNvcHlNZW51ID0gbmV3IE1lbnUobGlzdCk7Ci0JCU1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvcHlNZW51LCBTV1QuTk9ORSk7Ci0JCWNvcHlJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCS8qCi0JCQkgKiBAc2VlIFNlbGVjdGlvbkxpc3RlbmVyLndpZGdldFNlbGVjdGVkIChTZWxlY3Rpb25FdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNvcHlUb0NsaXBib2FyZCgpOwotCQkJfQotCi0JCQkvKgotCQkJICogQHNlZSBTZWxlY3Rpb25MaXN0ZW5lci53aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29weVRvQ2xpcGJvYXJkKCk7Ci0JCQl9Ci0JCX0pOwotCQljb3B5SXRlbS5zZXRUZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiY29weSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0LnNldE1lbnUoY29weU1lbnUpOwotCQlsaXN0Q3JlYXRlZCA9IHRydWU7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gV2luZG93LgotCSAqLwotCS8qKgotCSAqIEV4dGVuZHMgPGNvZGU+V2luZG93Lm9wZW4oKTwvY29kZT4uIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5Ci0JICogdGhlIGVycm9yLiBJZiB5b3Ugc3BlY2lmaWVkIGEgbWFzayB0byBmaWx0ZXIgdGhlIGRpc3BsYXlpbmcgb2YgdGhlc2UKLQkgKiBjaGlsZHJlbiwgdGhlIGVycm9yIGRpYWxvZyB3aWxsIG9ubHkgYmUgZGlzcGxheWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0Ci0JICogb25lIGNoaWxkIHN0YXR1cyBtYXRjaGluZyB0aGUgbWFzay4KLQkgKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCWlmICghQVVUT01BVEVEX01PREUgJiYgc2hvdWxkRGlzcGxheShzdGF0dXMsIGRpc3BsYXlNYXNrKSkgewotCQkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKLQkJfQotCQlzZXRSZXR1cm5Db2RlKE9LKTsKLQkJcmV0dXJuIE9LOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGVycm9yIGRpYWxvZyB0byBkaXNwbGF5IHRoZSBnaXZlbiBlcnJvci4gVXNlIHRoaXMgbWV0aG9kIGlmIHRoZQotCSAqIGVycm9yIG9iamVjdCBiZWluZyBkaXNwbGF5ZWQgZG9lcyBub3QgY29udGFpbiBjaGlsZCBpdGVtcywgb3IgaWYgeW91IHdpc2gKLQkgKiB0byBkaXNwbGF5IGFsbCBzdWNoIGl0ZW1zIHdpdGhvdXQgZmlsdGVyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBkaWFsb2dUaXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIHRvIHVzZSBmb3IgdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBkZWZhdWx0IHRpdGxlIHNob3VsZCBiZSB1c2VkCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNob3cgaW4gdGhpcyBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBlcnJvcidzIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIGFzIHRoZQotCSAqICAgICAgICAgICAgcHJpbWFyeSBtZXNzYWdlCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIHRvIHNob3cgdG8gdGhlIHVzZXIKLQkgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLQkgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotCSAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgb3BlbkVycm9yKFNoZWxsIHBhcmVudCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBvcGVuRXJyb3IocGFyZW50LCBkaWFsb2dUaXRsZSwgbWVzc2FnZSwgc3RhdHVzLCBJU3RhdHVzLk9LCi0JCQkJfCBJU3RhdHVzLklORk8gfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBlcnJvciBkaWFsb2cgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZXJyb3IuIFVzZSB0aGlzIG1ldGhvZCBpZiB0aGUKLQkgKiBlcnJvciBvYmplY3QgYmVpbmcgZGlzcGxheWVkIGNvbnRhaW5zIGNoaWxkIGl0ZW1zIDxpdD5hbmQgPC9pdD4geW91IHdpc2gKLQkgKiB0byBzcGVjaWZ5IGEgbWFzayB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIHRoZXNlCi0JICogY2hpbGRyZW4uIFRoZSBlcnJvciBkaWFsb2cgd2lsbCBvbmx5IGJlIGRpc3BsYXllZCBpZiB0aGVyZSBpcyBhdCBsZWFzdAotCSAqIG9uZSBjaGlsZCBzdGF0dXMgbWF0Y2hpbmcgdGhlIG1hc2suCi0JICogCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsIG9mIHRoZSBkaWFsb2csIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB0aXRsZSB0byB1c2UgZm9yIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZGVmYXVsdCB0aXRsZSBzaG91bGQgYmUgdXNlZAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IGluIHRoaXMgZGlhbG9nLCBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgZXJyb3IncyBtZXNzYWdlIHNob3VsZCBiZSBzaG93biBhcyB0aGUKLQkgKiAgICAgICAgICAgIHByaW1hcnkgbWVzc2FnZQotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciB0byBzaG93IHRvIHRoZSB1c2VyCi0JICogQHBhcmFtIGRpc3BsYXlNYXNrCi0JICogICAgICAgICAgICB0aGUgbWFzayB0byB1c2UgdG8gZmlsdGVyIHRoZSBkaXNwbGF5aW5nIG9mIGNoaWxkIGl0ZW1zLCBhcwotCSAqICAgICAgICAgICAgcGVyIDxjb2RlPklTdGF0dXMubWF0Y2hlczwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBjb2RlIG9mIHRoZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCB0aGF0IHJlc3VsdGVkIGluIHRoaXMKLQkgKiAgICAgICAgIGRpYWxvZyBjbG9zaW5nLiBUaGlzIHdpbGwgYmUgPGNvZGU+RGlhbG9nLk9LPC9jb2RlPiBpZiB0aGUgT0sKLQkgKiAgICAgICAgIGJ1dHRvbiB3YXMgcHJlc3NlZCwgb3IgPGNvZGU+RGlhbG9nLkNBTkNFTDwvY29kZT4gaWYgdGhpcwotCSAqICAgICAgICAgZGlhbG9nJ3MgY2xvc2Ugd2luZG93IGRlY29yYXRpb24gb3IgdGhlIEVTQyBrZXkgd2FzIHVzZWQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlLCBJU3RhdHVzIHN0YXR1cywgaW50IGRpc3BsYXlNYXNrKSB7Ci0JCUVycm9yRGlhbG9nTm9SZWFzb24gZGlhbG9nID0gbmV3IEVycm9yRGlhbG9nTm9SZWFzb24ocGFyZW50U2hlbGwsCi0JCQkJdGl0bGUsIG1lc3NhZ2UsIHN0YXR1cywgZGlzcGxheU1hc2spOwotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGxpc3QgdXNpbmcgdGhpcyBlcnJvciBkaWFsb2cncyBzdGF0dXMgb2JqZWN0LiBUaGlzIHdhbGtzCi0JICogdGhlIGNoaWxkIHN0YXRpYyBvZiB0aGUgc3RhdHVzIG9iamVjdCBhbmQgZGlzcGxheXMgdGhlbSBpbiBhIGxpc3QuIFRoZQotCSAqIGZvcm1hdCBmb3IgZWFjaCBlbnRyeSBpcyBzdGF0dXNfcGF0aCA6IHN0YXR1c19tZXNzYWdlIElmIHRoZSBzdGF0dXMncwotCSAqIHBhdGggd2FzIG51bGwgdGhlbiBpdCAoYW5kIHRoZSBjb2xvbikgYXJlIG9taXR0ZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RUb1BvcHVsYXRlCi0JICogICAgICAgICAgICBUaGUgbGlzdCB0byBmaWxsLgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0VG9Qb3B1bGF0ZSkgewotCQlwb3B1bGF0ZUxpc3QobGlzdFRvUG9wdWxhdGUsIHN0YXR1cywgMCwKLQkJCQlzaG91bGRJbmNsdWRlVG9wTGV2ZWxFcnJvckluRGV0YWlscyk7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGUgdGhlIGxpc3Qgd2l0aCB0aGUgbWVzc2FnZXMgZnJvbSB0aGUgZ2l2ZW4gc3RhdHVzLiBUcmF2ZXJzZSB0aGUKLQkgKiBjaGlsZHJlbiBvZiB0aGUgc3RhdHVzIGRlZXBseSBhbmQgYWxzbyB0cmF2ZXJzZSBDb3JlRXhjZXB0aW9ucyB0aGF0Ci0JICogYXBwZWFyIGluIHRoZSBzdGF0dXMuCi0JICogCi0JICogQHBhcmFtIGxpc3RUb1BvcHVsYXRlCi0JICogICAgICAgICAgICB0aGUgbGlzdCB0byBwb3B1bGF0ZQotCSAqIEBwYXJhbSBidWlsZGluZ1N0YXR1cwotCSAqICAgICAgICAgICAgdGhlIHN0YXR1cyBiZWluZyBkaXNwbGF5ZWQKLQkgKiBAcGFyYW0gbmVzdGluZwotCSAqICAgICAgICAgICAgdGhlIG5lc3RpbmcgbGV2ZWwgKGluY3JlYXNlcyBvbmUgbGV2ZWwgZm9yIGVhY2ggbGV2ZWwgb2YKLQkgKiAgICAgICAgICAgIGNoaWxkcmVuKQotCSAqIEBwYXJhbSBpbmNsdWRlU3RhdHVzCi0JICogICAgICAgICAgICB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIGJ1aWxkaW5nU3RhdHVzIGluIHRoZSBkaXNwbGF5IG9yIGp1c3QKLQkgKiAgICAgICAgICAgIGl0cyBjaGlsZHJlbgotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUxpc3QoTGlzdCBsaXN0VG9Qb3B1bGF0ZSwgSVN0YXR1cyBidWlsZGluZ1N0YXR1cywKLQkJCWludCBuZXN0aW5nLCBib29sZWFuIGluY2x1ZGVTdGF0dXMpIHsKLQotCQlpZiAoIWJ1aWxkaW5nU3RhdHVzLm1hdGNoZXMoZGlzcGxheU1hc2spKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUaHJvd2FibGUgdCA9IGJ1aWxkaW5nU3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQlib29sZWFuIGlzQ29yZUV4Y2VwdGlvbiA9IHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uOwotCQlib29sZWFuIGluY3JlbWVudE5lc3RpbmcgPSBmYWxzZTsKLQotCQlpZiAoaW5jbHVkZVN0YXR1cykgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0aW5nOyBpKyspIHsKLQkJCQlzYi5hcHBlbmQoTkVTVElOR19JTkRFTlQpOyAKLQkJCX0KLQkJCVN0cmluZyBtZXNzYWdlID0gYnVpbGRpbmdTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJc2IuYXBwZW5kKG1lc3NhZ2UpOwotCQkJbGlzdFRvUG9wdWxhdGUuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJaW5jcmVtZW50TmVzdGluZyA9IHRydWU7Ci0JCX0KLQotCQlpZiAoIWlzQ29yZUV4Y2VwdGlvbiAmJiB0ICE9IG51bGwpIHsKLQkJCS8vIEluY2x1ZGUgbG93LWxldmVsIGV4Y2VwdGlvbiBtZXNzYWdlCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJCXNiLmFwcGVuZChORVNUSU5HX0lOREVOVCk7IAotCQkJfQotCQkJU3RyaW5nIG1lc3NhZ2UgPSB0LmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IHQudG9TdHJpbmcoKTsKLQotCQkJc2IuYXBwZW5kKG1lc3NhZ2UpOwotCQkJbGlzdFRvUG9wdWxhdGUuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQkJaW5jcmVtZW50TmVzdGluZyA9IHRydWU7Ci0JCX0KLQotCQlpZiAoaW5jcmVtZW50TmVzdGluZykKLQkJCW5lc3RpbmcrKzsKLQotCQkvLyBMb29rIGZvciBhIG5lc3RlZCBjb3JlIGV4Y2VwdGlvbgotCQlpZiAoaXNDb3JlRXhjZXB0aW9uKSB7Ci0JCQlDb3JlRXhjZXB0aW9uIGNlID0gKENvcmVFeGNlcHRpb24pIHQ7Ci0JCQlJU3RhdHVzIGVTdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCS8vIE9ubHkgcHJpbnQgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGlmIGl0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlCi0JCQkvLyBwYXJlbnQgbWVzc2FnZQotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCB8fCBtZXNzYWdlLmluZGV4T2YoZVN0YXR1cy5nZXRNZXNzYWdlKCkpID09IC0xKSB7Ci0JCQkJcG9wdWxhdGVMaXN0KGxpc3RUb1BvcHVsYXRlLCBlU3RhdHVzLCBuZXN0aW5nLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCS8vIExvb2sgZm9yIGNoaWxkIHN0YXR1cwotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBidWlsZGluZ1N0YXR1cy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwb3B1bGF0ZUxpc3QobGlzdFRvUG9wdWxhdGUsIGNoaWxkcmVuW2ldLCBuZXN0aW5nLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgZ2l2ZW4gc3RhdHVzIG9iamVjdCBzaG91bGQgYmUgZGlzcGxheWVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIGEgc3RhdHVzIG9iamVjdAotCSAqIEBwYXJhbSBtYXNrCi0JICogICAgICAgICAgICBhIG1hc2sgYXMgcGVyIDxjb2RlPklTdGF0dXMubWF0Y2hlczwvY29kZT4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBzdGF0dXMgc2hvdWxkIGJlIGRpc3BsYXllZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc2hvdWxkRGlzcGxheShJU3RhdHVzIHN0YXR1cywgaW50IG1hc2spIHsKLQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RhdHVzLm1hdGNoZXMobWFzayk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNoaWxkcmVuW2ldLm1hdGNoZXMobWFzaykpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZm9sZGluZyBvZiB0aGUgZGV0YWlscyBhcmVhLiBUaGlzIGlzIHRyaWdnZXJlZCBieSB0aGUgdXNlcgotCSAqIHByZXNzaW5nIHRoZSBkZXRhaWxzIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdG9nZ2xlRGV0YWlsc0FyZWEoKSB7Ci0JCVBvaW50IHdpbmRvd1NpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJUG9pbnQgb2xkU2l6ZSA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJaWYgKGxpc3RDcmVhdGVkKSB7Ci0JCQlsaXN0LmRpc3Bvc2UoKTsKLQkJCWxpc3RDcmVhdGVkID0gZmFsc2U7Ci0JCQlkZXRhaWxzQnV0dG9uLnNldFRleHQoSURpYWxvZ0NvbnN0YW50cy5TSE9XX0RFVEFJTFNfTEFCRUwpOwotCQl9IGVsc2UgewotCQkJbGlzdCA9IGNyZWF0ZURyb3BEb3duTGlzdCgoQ29tcG9zaXRlKSBnZXRDb250ZW50cygpKTsKLQkJCWRldGFpbHNCdXR0b24uc2V0VGV4dChJRGlhbG9nQ29uc3RhbnRzLkhJREVfREVUQUlMU19MQUJFTCk7Ci0JCX0KLQkJUG9pbnQgbmV3U2l6ZSA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJZ2V0U2hlbGwoKQotCQkJCS5zZXRTaXplKAotCQkJCQkJbmV3IFBvaW50KHdpbmRvd1NpemUueCwgd2luZG93U2l6ZS55Ci0JCQkJCQkJCSsgKG5ld1NpemUueSAtIG9sZFNpemUueSkpKTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGRldGFpbHMgb2YgdGhlIHN0YXR1cyBvZiB0aGUgZXJyb3Igb250byB0aGUgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBidWlsZGluZ1N0YXR1cwotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gbmVzdGluZwotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvcHlCdWZmZXIoSVN0YXR1cyBidWlsZGluZ1N0YXR1cywKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBuZXN0aW5nKSB7Ci0JCWlmICghYnVpbGRpbmdTdGF0dXMubWF0Y2hlcyhkaXNwbGF5TWFzaykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3Rpbmc7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChORVNUSU5HX0lOREVOVCk7IAotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoYnVpbGRpbmdTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIExvb2sgZm9yIGEgbmVzdGVkIGNvcmUgZXhjZXB0aW9uCi0JCVRocm93YWJsZSB0ID0gYnVpbGRpbmdTdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCWlmICh0IGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJQ29yZUV4Y2VwdGlvbiBjZSA9IChDb3JlRXhjZXB0aW9uKSB0OwotCQkJcG9wdWxhdGVDb3B5QnVmZmVyKGNlLmdldFN0YXR1cygpLCBidWZmZXIsIG5lc3RpbmcgKyAxKTsKLQkJfQotCi0JCUlTdGF0dXNbXSBjaGlsZHJlbiA9IGJ1aWxkaW5nU3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXBvcHVsYXRlQ29weUJ1ZmZlcihjaGlsZHJlbltpXSwgYnVmZmVyLCBuZXN0aW5nICsgMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgc3RhdHVzZXMgdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weVRvQ2xpcGJvYXJkKCkgewotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQlTdHJpbmdCdWZmZXIgc3RhdHVzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlwb3B1bGF0ZUNvcHlCdWZmZXIoc3RhdHVzLCBzdGF0dXNCdWZmZXIsIDApOwotCQljbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKGxpc3QuZ2V0RGlzcGxheSgpKTsKLQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKG5ldyBPYmplY3RbXSB7IHN0YXR1c0J1ZmZlci50b1N0cmluZygpIH0sCi0JCQkJbmV3IFRyYW5zZmVyW10geyBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSB9KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY2xvc2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQlpZiAoY2xpcGJvYXJkICE9IG51bGwpCi0JCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHRoZSBkZXRhaWxzIHBvcnRpb24gb2YgdGhlIGRpYWxvZyBpZiBpdCBpcyBub3QgYWxyZWFkeSB2aXNpYmxlLiBUaGlzCi0JICogbWV0aG9kIHdpbGwgb25seSB3b3JrIHdoZW4gaXQgaXMgaW52b2tlZCBhZnRlciB0aGUgY29udHJvbCBvZiB0aGUgZGlhbG9nCi0JICogaGFzIGJlZW4gc2V0LiBJbiBvdGhlciB3b3JkcywgYWZ0ZXIgdGhlIDxjb2RlPmNyZWF0ZUNvbnRlbnRzPC9jb2RlPgotCSAqIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkIGFuZCBoYXMgcmV0dXJuZWQgdGhlIGNvbnRyb2wgZm9yIHRoZSBjb250ZW50IGFyZWEKLQkgKiBvZiB0aGUgZGlhbG9nLiBJbnZva2luZyB0aGUgbWV0aG9kIGJlZm9yZSB0aGUgY29udGVudCBhcmVhIGhhcyBiZWVuIHNldAotCSAqIG9yIGFmdGVyIHRoZSBkaWFsb2cgaGFzIGJlZW4gZGlzcG9zZWQgd2lsbCBoYXZlIG5vIGVmZmVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2hvd0RldGFpbHNBcmVhKCkgewotCQlpZiAoIWxpc3RDcmVhdGVkKSB7Ci0JCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250ZW50cygpOwotCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpCi0JCQkJdG9nZ2xlRGV0YWlsc0FyZWEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBEZXRhaWxzIGJ1dHRvbiBzaG91bGQgYmUgaW5jbHVkZWQuIFRoaXMgbWV0aG9kIGlzCi0JICogaW52b2tlZCBvbmNlIHdoZW4gdGhlIGRpYWxvZyBpcyBidWlsdC4gQnkgZGVmYXVsdCwgdGhlIERldGFpbHMgYnV0dG9uIGlzCi0JICogb25seSBpbmNsdWRlZCBpZiB0aGUgc3RhdHVzIHVzZWQgd2hlbiBjcmVhdGluZyB0aGUgZGlhbG9nIHdhcyBhCi0JICogbXVsdGktc3RhdHVzIG9yIGlmIHRoZSBzdGF0dXMgY29udGFpbnMgYW4gZXhjZXB0aW9uLiBTdWJjbGFzc2VzIG1heQotCSAqIG92ZXJyaWRlLgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgRGV0YWlscyBidXR0b24gc2hvdWxkIGJlIGluY2x1ZGVkCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFNob3dEZXRhaWxzQnV0dG9uKCkgewotCQlyZXR1cm4gc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSB8fCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHN0YXR1cyBkaXNwbGF5ZWQgYnkgdGhpcyBlcnJvciBkaWFsb2cgdG8gdGhlIGdpdmVuIHN0YXR1cy4gVGhpcwotCSAqIG9ubHkgYWZmZWN0cyB0aGUgc3RhdHVzIGRpc3BsYXllZCBieSB0aGUgRGV0YWlscyBsaXN0LiBUaGUgbWVzc2FnZSwgaW1hZ2UKLQkgKiBhbmQgdGl0bGUgc2hvdWxkIGJlIHVwZGF0ZWQgYnkgdGhlIHN1YmNsYXNzLCBpZiBkZXNpcmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBzdGF0dXMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkZXRhaWxzIGxpc3QKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmICh0aGlzLnN0YXR1cyAhPSBzdGF0dXMpIHsKLQkJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQl9Ci0JCXNob3VsZEluY2x1ZGVUb3BMZXZlbEVycm9ySW5EZXRhaWxzID0gdHJ1ZTsKLQkJaWYgKGxpc3RDcmVhdGVkKSB7Ci0JCQlyZXBvcHVsYXRlTGlzdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3B1bGF0ZSB0aGUgc3VwcGxpZWQgbGlzdCB3aWRnZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcG9wdWxhdGVMaXN0KCkgewotCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRGlzcG9zZWQoKSkgewotCQkJbGlzdC5yZW1vdmVBbGwoKTsKLQkJCXBvcHVsYXRlTGlzdChsaXN0KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9NZW51VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01lbnVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OGE2NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01lbnVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcmV0cmlldmluZyBFY2xpcHNlIG1lbnVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lbnVVdGlsIHsKLQotCS8qKgotCSAqIFNlYXJjaGVzIGFuIGFycmF5IG9mIG1lbnUgaXRlbXMgYW5kIHJldHVybnMgdGhlIG1lbnUgaXRlbSB0aGF0IG1hdGNoZXMKLQkgKiB0aGUgZ2l2ZW4gbWVudSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBtZW51SXRlbXMKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IG9mIG1lbnUgaXRlbXMuCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGxvb2sgZm9yLgotCSAqIEByZXR1cm4gVGhlIG1lbnUgaXRlbSBpZiBmb3VuZCwgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVudUl0ZW0gZ2V0TWVudUl0ZW0oTWVudUl0ZW1bXSBtZW51SXRlbXMsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChtZW51SXRlbXMgPT0gbnVsbCB8fCB0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWVudUl0ZW1zW2ldLmdldFRleHQoKS5zdGFydHNXaXRoKHRleHQpKSB7Ci0JCQkJcmV0dXJuIG1lbnVJdGVtc1tpXTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01zZ0JveC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL01zZ0JveC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc5ZWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVzc2FnZUJveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gZGlzcGxheSBhIG1lc3NhZ2UgYm94LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNc2dCb3ggewotCS8qKgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byBzaG93IGVycm9yIG1lc3NhZ2UgaWYgeW91IGRvbid0IHdhbnQgbG9uZyBwYXRoIHRvIGJlCi0JICogY3V0IG9mZi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG5hdGl2ZVNob3dFcnJvcihTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZykgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJc2hlbGwgPSBnZXREZWZhdWx0U2hlbGwoKTsKLQkJCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCU1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIFNXVC5PSyB8IFNXVC5JQ09OX0VSUk9SKTsKLQkJbXNnQm94LnNldE1lc3NhZ2UobXNnKTsKLQkJbXNnQm94LnNldFRleHQoc2hlbGwuZ2V0VGV4dCgpKTsKLQkJbXNnQm94Lm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJc2hvd0Vycm9yKGdldERlZmF1bHRTaGVsbCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzaG93RXJyb3IoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBzaGVsbCA9PSBudWxsID8gbnVsbCA6IHNoZWxsCi0JCQkJLmdldFRleHQoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIG1zZykgewotCQlzaG93V2FybmluZyhnZXREZWZhdWx0U2hlbGwoKSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2hvd1dhcm5pbmcoU2hlbGwgc2hlbGwsIFN0cmluZyBtc2cpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIHNoZWxsID09IG51bGwgPyBudWxsIDogc2hlbGwKLQkJCQkuZ2V0VGV4dCgpLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2hlbGwgZ2V0RGVmYXVsdFNoZWxsKCkgewotCQl0cnkgewotCQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCi0JCQlTaGVsbCBzID0gbnVsbDsKLQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQlzID0gZC5nZXRBY3RpdmVTaGVsbCgpOwotCQkJfQotCi0JCQlyZXR1cm4gczsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQl0cnkgewotCQkJRGlzcGxheSBkID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQkJZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCi0JCQlyZXR1cm4gZDsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBwcm9tcHQoZ2V0RGVmYXVsdFNoZWxsKCksIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJvbXB0KFNoZWxsIHNoZWxsLCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBwcm9tcHQoc2hlbGwsIG51bGwsIG1zZywgU1dULllFUyB8IFNXVC5OTyB8IFNXVC5DQU5DRUwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgbXNnLCBpbnQgYnV0dG9ucykgewotCQlyZXR1cm4gcHJvbXB0KGdldERlZmF1bHRTaGVsbCgpLCBudWxsLCBtc2csIGJ1dHRvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIGludCBidXR0b25zKSB7Ci0JCXJldHVybiBwcm9tcHQoZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBtc2csIGJ1dHRvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByb21wdChTaGVsbCBzaGVsbCwgU3RyaW5nIG1zZywgaW50IGJ1dHRvbnMpIHsKLQkJcmV0dXJuIHByb21wdChzaGVsbCwgbnVsbCwgbXNnLCBidXR0b25zKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwcm9tcHQoU2hlbGwgc2hlbGwsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywKLQkJCWludCBidXR0b25zKSB7Ci0JCU1lc3NhZ2VCb3ggbXNnQm94ID0gbmV3IE1lc3NhZ2VCb3goc2hlbGwsIGJ1dHRvbnMgfCBTV1QuSUNPTl9RVUVTVElPTik7Ci0JCW1zZ0JveC5zZXRUZXh0KHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoKCkgPiAwID8gdGl0bGUgOiBzaGVsbAotCQkJCS5nZXRUZXh0KCkpOwotCQltc2dCb3guc2V0TWVzc2FnZShtc2cpOwotCQlyZXR1cm4gbXNnQm94Lm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9Nc2dEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmZTBhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvTXNnRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5JQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgbWVzc2FnZSBkaWFsb2cgdXNlZCBmb3IgZGlzcGxheWluZyBlcnJvciwgd2FybmluZywgY29uZmlybWF0aW9uIG9yCi0gKiBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXNnRGlhbG9nIHsKLQotCS8vIFRoZSBwbHVnLWluIElELgotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHBsdWctaW4gaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgVGhlIHBsdWdpbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTXNnRGlhbG9nKElBY3RpdmF0b3IgcGx1Z2luKSB7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW4uZ2V0SWQoKTsKLQkJdGhpcy5sb2dnZXIgPSBwbHVnaW4uZ2V0TG9nZ2VyKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBlcnJvcgotCSAqIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgaW4gYW4gZXJyb3IgZGlhbG9nIHdpdGhvdXQgdGhlIGVycm9yCi0JICogcmVhc29uIGFuZCBEZXRhaWxzIGJ1dHRvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgbnVsbCwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzCi0JICogYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZyB3aXRob3V0IHRoZSBEZXRhaWxzCi0JICogYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVRocm93YWJsZSBleCkgewotCQlkaXNwbGF5KElTdGF0dXMuRVJST1IsIHRpdGxlLCBtc2csIHJlYXNvbiwgbnVsbCwgZXgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uCi0JICogd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QgbnVsbCBvcgotCSAqIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIGVycm9yLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgZGV0YWlscy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJU3RyaW5nIGRldGFpbHMpIHsKLQkJZGlzcGxheShJU3RhdHVzLkVSUk9SLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGluIGFuIGVycm9yIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uCi0JICogd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QgbnVsbCBvcgotCSAqIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgZXhjZXB0aW9uIHN0YWNrIHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0bwotCSAqIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBkZXRhaWxzLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5FUlJPUiwgdGl0bGUsIG1zZywgcmVhc29uLCBkZXRhaWxzLCBleCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGVycm9yIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuIHRvCi0JICogdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIGludCBkaXNwbGF5RXJyb3IoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igc3RhdHVzIGluIGFuIGVycm9yIGRpYWxvZy4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4gdG8KLQkgKiB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgaW50IGRpc3BsYXlFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBkaXNwbGF5KHRpdGxlLCBtc2csIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBpbiBhIHdhcm5pbmcgZGlhbG9nIHdpdGhvdXQgdGhlCi0JICogd2FybmluZyByZWFzb24gYW5kIERldGFpbHMgYnV0dG9uLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YW5pbmcgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgd2FybmluZyBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cgd2l0aG91dCB0aGUKLQkgKiB3YXJuaW5nIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3YXJuaW5nIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhcm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJZGlzcGxheShJU3RhdHVzLldBUk5JTkcsIHRpdGxlLCBtc2csIG51bGwsIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cgd2l0aG91dCB0aGUKLQkgKiB3YXJuaW5nIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhbmluZyBtZXNzYWdlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3YXJuaW5nIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbikgewotCQlkaXNwbGF5KElTdGF0dXMuV0FSTklORywgdGl0bGUsIG1zZywgcmVhc29uLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cgd2l0aG91dCB0aGUKLQkgKiB3YXJuaW5nIHJlYXNvbiBhbmQgRGV0YWlscyBidXR0b24uCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSB3YXJuaW5nIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdhcm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLAotCQkJVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCByZWFzb24sIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGluIGEgd2FybmluZyBkaWFsb2cuIFRoZSBEZXRhaWxzCi0JICogYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPiBwYXJhbWV0ZXIgaXQgbm90Ci0JICogbnVsbCBvciBlbXB0eS4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGUgd2FuaW5nIG1lc3NhZ2Ugd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlLgotCSAqIEBwYXJhbSByZWFzb24KLQkgKiAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoZSB3YXJuaW5nLgotCSAqIEBwYXJhbSBkZXRhaWxzCi0JICogICAgICAgICAgICBUaGUgd2FybmluZyBkZXRhaWxzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCVN0cmluZyBkZXRhaWxzKSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIG1lc3NhZ2UgaW4gYSB3YXJuaW5nIGRpYWxvZy4gVGhlIERldGFpbHMKLQkgKiBidXR0b24gd2lsbCBiZSBkaXNwbGF5ZWQgaWYgdGhlIDxjb2RlPmRldGFpbHM8L2NvZGU+IHBhcmFtZXRlciBpdCBub3QKLQkgKiBudWxsIG9yIGVtcHR5LgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICogQHBhcmFtIHJlYXNvbgotCSAqICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgdGhlIHdhcm5pbmcuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIGRldGFpbHMuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FybmluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQlTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KSB7Ci0JCWRpc3BsYXkoSVN0YXR1cy5XQVJOSU5HLCB0aXRsZSwgbXNnLCByZWFzb24sIGRldGFpbHMsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gd2FybmluZyBzdGF0dXMgaW4gYW4gZXJyb3IgZGlhbG9nLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoZSB3YXJuaW5nIG1lc3NhZ2UgYW5kIHRoZSBleGNlcHRpb24gc3RhY2sgdHJhY2Ugd2lsbCBiZSB3cml0dGVuCi0JICogdG8gdGhlIGxvZyBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgVGhlIHRpdGxlIGZvciB0aGUgZXJyb3IgZGlhbG9nLgotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBzdGF0dXMuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlkaXNwbGF5KHRpdGxlLCBudWxsLCBzdGF0dXMpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiB3YXJuaW5nIHN0YXR1cyBpbiBhbiBlcnJvciBkaWFsb2cuCi0JICogPHA+Ci0JICogTm90ZTogVGhlIHdhcm5pbmcgbWVzc2FnZSBhbmQgdGhlIGV4Y2VwdGlvbiBzdGFjayB0cmFjZSB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgbG9nIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWRpc3BsYXkodGl0bGUsIG1zZywgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlIGluIGFuIGVycm9yIG9yIHdhcm5pbmcKLQkgKiBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4KLQkgKiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogICAgICAgICAgICBUaGUgc2V2ZXJpdHksIGVpdGhlciBJU3RhdHVzLkVSUk9SIG9yIElTdGF0dXMuV0FSTklORy4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZS4KLQkgKiBAcGFyYW0gcmVhc29uCi0JICogICAgICAgICAgICBUaGUgcmVhc29uIGZvciB0aGUgZXJyb3IuCi0JICogQHBhcmFtIGRldGFpbHMKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBkZXRhaWxzLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwbGF5KGludCBzZXZlcml0eSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLAotCQkJU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCkgewotCQlpZiAobXNnID09IG51bGwgJiYgZXggIT0gbnVsbCkgewotCQkJbXNnID0gZXguZ2V0TWVzc2FnZSgpOwotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKHNldmVyaXR5ID09IElTdGF0dXMuRVJST1IgfHwgc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQlsb2dnZXIubG9nTXNnKHNldmVyaXR5LCBtc2csIGV4KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJzZXZlcml0eSBhcmd1bWVudCBtdXN0IGJlIElTdGF0dXMuRVJST1Igb3IgSVN0YXR1cy5XQVJOSU5HIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZwotCQkJCS5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCi0JCWlmIChkZXRhaWxzICE9IG51bGwgJiYgZGV0YWlscy5sZW5ndGgoKSA+IDApIHsKLQkJCU11bHRpU3RhdHVzIG1TdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMocGx1Z2luSWQsIElTdGF0dXMuT0ssIHJlYXNvbiwKLQkJCQkJZXgpOwotCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklkLCBJU3RhdHVzLk9LLCBkZXRhaWxzLAotCQkJCQlleCk7Ci0JCQltU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIHRpdGxlLCBtc2csCi0JCQkJCW1TdGF0dXMpOwotCQl9IGVsc2UgaWYgKHJlYXNvbiAhPSBudWxsICYmIHJlYXNvbi5sZW5ndGgoKSA+IDApIHsKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBwbHVnaW5JZCwgSVN0YXR1cy5PSywgcmVhc29uLAotCQkJCQlleCk7Ci0JCQlvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG1zZywKLQkJCQkJc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQkJCX0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7Ci0JCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIHRpdGxlLCBtc2cpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBnaXZlbiBlcnJvciBvciB3YXJuaW5nIG1lc3NhZ2UgaW4gYW4gZXJyb3Igb3Igd2FybmluZwotCSAqIGRpYWxvZy4gVGhlIERldGFpbHMgYnV0dG9uIHdpbGwgYmUgZGlzcGxheWVkIGlmIHRoZSA8Y29kZT5kZXRhaWxzPC9jb2RlPgotCSAqIHBhcmFtZXRlciBpdCBub3QgbnVsbCBvciBlbXB0eS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogICAgICAgICAgICBUaGUgZXJyb3Igc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGRpc3BsYXkoU3RyaW5nIHRpdGxlLCBJU3RhdHVzIHN0YXR1cykgewotCQlyZXR1cm4gZGlzcGxheSh0aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZXJyb3Igb3Igd2FybmluZyBtZXNzYWdlIGluIGFuIGVycm9yIG9yIHdhcm5pbmcKLQkgKiBkaWFsb2cuIFRoZSBEZXRhaWxzIGJ1dHRvbiB3aWxsIGJlIGRpc3BsYXllZCBpZiB0aGUgPGNvZGU+ZGV0YWlsczwvY29kZT4KLQkgKiBwYXJhbWV0ZXIgaXQgbm90IG51bGwgb3IgZW1wdHkuCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIHN0YXR1cwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBkaXNwbGF5KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgYXJndW1lbnQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IHN0YXR1cy5nZXRTZXZlcml0eSgpOwotCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUiB8fCBzZXZlcml0eSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCWxvZ2dlci5sb2dNc2coc2V2ZXJpdHksIG1zZywgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZwotCQkJCS5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCi0JCWludCByYyA9IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwKLQkJCQltc2csIHN0YXR1cyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByYzsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIGluZm9ybWF0aW9uYWwgZGlhbG9nIHdpdGggYW4gIk9LIiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSW1hZ2Ugb2xkSW1hZ2UgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5nZXREZWZhdWx0SW1hZ2UoKTsKLQkJSW1hZ2Ugc2hlbGxJbWFnZSA9IGdldFNoZWxsSW1hZ2UoKTsKLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oc2hlbGwsIHRpdGxlLCBtc2cpOwotCi0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShvbGRJbWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIHF1ZXN0aW9uIGRpYWxvZyB3aXRoIGEgIlllcyIgYW5kICJObyIKLQkgKiBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgdGl0bGUgZm9yIHRoZSBpbmZvcm1hdGlvbiBkaWFsb2cuCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNwbGF5UHJvbXB0KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZykgewotCQlpZiAobXNnID09IG51bGwpIHsKLQkJCW1zZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJbWFnZSBvbGRJbWFnZSA9IFdyYXBwZWRNZXNzYWdlRGlhbG9nLmdldERlZmF1bHRJbWFnZSgpOwotCQlJbWFnZSBzaGVsbEltYWdlID0gZ2V0U2hlbGxJbWFnZSgpOwotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uoc2hlbGxJbWFnZSk7Ci0JCX0KLQotCQlTaGVsbCBzaGVsbCA9IGdldFNoZWxsKCk7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKHNoZWxsLCB0aXRsZSwgbXNnKTsKLQotCQlpZiAoc2hlbGxJbWFnZSAhPSBudWxsKSB7Ci0JCQlXcmFwcGVkTWVzc2FnZURpYWxvZy5zZXREZWZhdWx0SW1hZ2Uob2xkSW1hZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbiBhIGNvbmZpcm1hdGlvbiBkaWFsb2cgd2l0aCBhICJZZXMiIGFuZAotCSAqICJDYW5jZWwiIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIGluZm9ybWF0aW9uIGRpYWxvZy4KLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc3BsYXlDb25maXJtYXRpb24oU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIG9sZEltYWdlID0gV3JhcHBlZE1lc3NhZ2VEaWFsb2cuZ2V0RGVmYXVsdEltYWdlKCk7Ci0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCVdyYXBwZWRNZXNzYWdlRGlhbG9nLnNldERlZmF1bHRJbWFnZShzaGVsbEltYWdlKTsKLQkJfQotCi0JCVNoZWxsIHNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBXcmFwcGVkTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybShzaGVsbCwgdGl0bGUsIG1zZyk7Ci0KLQkJaWYgKHNoZWxsSW1hZ2UgIT0gbnVsbCkgewotCQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cuc2V0RGVmYXVsdEltYWdlKG9sZEltYWdlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBkaXNwbGF5Q29uZmlybWF0aW9uKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgYXJndW1lbnQgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCkgewotCQkJbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUltYWdlIHNoZWxsSW1hZ2UgPSBnZXRTaGVsbEltYWdlKCk7Ci0JCWlmIChzaGVsbEltYWdlICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nTm9SZWFzb24uc2V0RGVmYXVsdEltYWdlKHNoZWxsSW1hZ2UpOwotCQl9Ci0KLQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCi0JCWludCByYyA9IEVycm9yRGlhbG9nTm9SZWFzb24ub3BlbkVycm9yKHNoZWxsLCB0aXRsZSwgbXNnLCBzdGF0dXMpOwotCi0JCXJldHVybiByYzsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgY3VycmVudCBzaGVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNoZWxsIGltYWdlLgotCSAqLwotCXByaXZhdGUgSW1hZ2UgZ2V0U2hlbGxJbWFnZSgpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJCVNoZWxsIHNoZWxsID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHNoZWxsLmdldEltYWdlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QZXJzcGVjdGl2ZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QZXJzcGVjdGl2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxNzM2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUGVyc3BlY3RpdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLldvcmtiZW5jaEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBhY2Nlc3NpbmcgcGVyc3BlY3RpdmVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNwZWN0aXZlVXRpbCB7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBQZXJzcGVjdGl2ZVV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGFjdGl2ZSBwZXJzcGVjdGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBhY3RpdmUgcGVyc3BlY3RpdmUgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWN0aXZlUGVyc3BlY3RpdmVJZCgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIGFjdGl2ZVBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZQotCQkJCQkuZ2V0UGVyc3BlY3RpdmUoKTsKLQkJCXJldHVybiBhY3RpdmVQZXJzcGVjdGl2ZS5nZXRJZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgcGVyc3BlY3RpdmUuCi0JICogCi0JICogQHBhcmFtIHBlcnNwZWN0aXZlSWQKLQkgKiAgICAgICAgICAgIFRoZSBwZXJzcGVjdGl2ZSBJRC4KLQkgKiBAcmV0dXJuIFRoZSBwcmV2aW91c2x5IGFjdGl2ZSBwZXJzcGVjdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQZXJzcGVjdGl2ZURlc2NyaXB0b3Igb3BlblBlcnNwZWN0aXZlKFN0cmluZyBwZXJzcGVjdGl2ZUlkKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJSVBlcnNwZWN0aXZlUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRQZXJzcGVjdGl2ZVJlZ2lzdHJ5KCk7Ci0JCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIG9sZFBlcnNwZWN0aXZlID0gYWN0aXZlUGFnZS5nZXRQZXJzcGVjdGl2ZSgpOwotCQkJaWYgKCFvbGRQZXJzcGVjdGl2ZS5nZXRJZCgpLmVxdWFscyhwZXJzcGVjdGl2ZUlkKSkgewotCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgcGVyc3BlY3RpdmUgPSByZWdpc3RyeQotCQkJCQkJLmZpbmRQZXJzcGVjdGl2ZVdpdGhJZChwZXJzcGVjdGl2ZUlkKTsKLQkJCQlhY3RpdmVQYWdlLnNldFBlcnNwZWN0aXZlKHBlcnNwZWN0aXZlKTsKLQkJCX0KLQkJCXJldHVybiBvbGRQZXJzcGVjdGl2ZTsKLQkJfSBlbHNlIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQl0cnkgewotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuc2hvd1BlcnNwZWN0aXZlKAotCQkJCQkJcGVyc3BlY3RpdmVJZCwgYWN0aXZlV2luZG93KTsKLQkJCX0gY2F0Y2ggKFdvcmtiZW5jaEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwZXJzcGVjdGl2ZSBpcyBhbHJlYWR5IGFjdGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGVyc3BlY3RpdmVJZAotCSAqICAgICAgICAgICAgVGhlIHBlcnNwZWN0aXZlIElELgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY3RpdmVQZXJzcGVjdGl2ZShTdHJpbmcgcGVyc3BlY3RpdmVJZCkgewotCQlTdHJpbmcgYWN0aXZlUGVyc3BlY3RpdmVJZCA9IFBlcnNwZWN0aXZlVXRpbC5nZXRBY3RpdmVQZXJzcGVjdGl2ZUlkKCk7Ci0JCWlmIChwZXJzcGVjdGl2ZUlkID09IG51bGwgfHwgYWN0aXZlUGVyc3BlY3RpdmVJZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2ZVBlcnNwZWN0aXZlSWQuZXF1YWxzSWdub3JlQ2FzZShwZXJzcGVjdGl2ZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2aWV3IHBhcnQgd2l0aCB0aGUgZ2l2ZW4gdmlldyBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld0lkCi0JICogICAgICAgICAgICBUaGUgdmlldyBJRC4KLQkgKiBAcmV0dXJuIFRoZSB2aWV3IHBhcnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVmlld1BhcnQgZ2V0VmlldyhTdHJpbmcgdmlld0lkKSB7Ci0JCXRyeSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZS5maW5kVmlldyh2aWV3SWQpOwotCQkJCWlmICh2aWV3ID09IG51bGwpIHsKLQkJCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcodmlld0lkKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHZpZXc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvUHJlZmVyZW5jZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QcmVmZXJlbmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTgwYmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdWkvdXRpbC9QcmVmZXJlbmNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYWNjZXNzaW5nIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VVdGlsIHsKLQotCS8vIFRoZSBtdWx0aS1zdHJpbmcgcHJlZmVyZW5jZSBkZWxpbWl0ZXIuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZFUkVOQ0VfREVMSU1JVEVSID0gIjsiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXRzIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHN0cmluZyB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRMaXN0KElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlLCBTdHJpbmcgbmFtZSkgewotCQlMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCAmJiBuYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHByZWZTdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih2YWx1ZSwKLQkJCQkJUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJaW50IHRva2VuQ291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5Db3VudDsgaSsrKSB7Ci0JCQkJdmFsdWVzLmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RyaW5nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5nIHByZWZlcmVuY2UgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRTdHJpbmdWYWx1ZXMoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldExpc3QocHJlZlN0b3JlLCBuYW1lKTsKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheSh2YWx1ZXMpOwotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgbmFtZWQgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZlN0b3JlCi0JICogICAgICAgICAgICBhIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBzdHJpbmcgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExpc3QoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJTGlzdCB2YWx1ZXMpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJCQlidWZmZXIuYXBwZW5kKFBSRUZFUkVOQ0VfREVMSU1JVEVSKTsKLQkJCX0KLQkJCXByZWZTdG9yZS5zZXRWYWx1ZShuYW1lLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc3RyaW5nIHZhbHVlIHRvIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEKLQkgKiBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhIHN0cmluZyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIGEgZGVmYXVsdCBzdHJpbmcgdmFsdWUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlCi0JICogICAgICAgICAgICBsaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvTGlzdChJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgdmFsdWUsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IGdldExpc3QocHJlZlN0b3JlLCBuYW1lKTsKLQkJCWxpc3QucmVtb3ZlKHZhbHVlKTsKLQkJCWxpc3QuYWRkKDAsIHZhbHVlKTsKLQkJCWludCBwcmVmZXJlbmNlSGlzdG9yeVNpemUgPSBDb21tb25QcmVmZXJlbmNlcwotCQkJCQkuZ2V0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0JCQlpZiAobGlzdC5zaXplKCkgPiBwcmVmZXJlbmNlSGlzdG9yeVNpemUpIHsKLQkJCQlsaXN0ID0gbGlzdC5zdWJMaXN0KDAsIDEwKTsKLQkJCX0KLQkJCWlmIChsaXN0LnNpemUoKSA9PSBwcmVmZXJlbmNlSGlzdG9yeVNpemUgJiYgZGVmYXVsdFZhbHVlICE9IG51bGwKLQkJCQkJJiYgZGVmYXVsdFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWxpc3Quc2V0KDksIGRlZmF1bHRWYWx1ZSk7Ci0JCQl9Ci0JCQlzZXRMaXN0KHByZWZTdG9yZSwgbmFtZSwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgc3RyaW5nIHZhbHVlIHRvIGEgbGlzdCBjb250YWluaW5nIHN0cmluZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEKLQkgKiBuYW1lZCBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcmVmU3RvcmUKLQkgKiAgICAgICAgICAgIGEgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBhIHN0cmluZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0xpc3QoSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIHZhbHVlKSB7Ci0JCWFkZFRvTGlzdChwcmVmU3RvcmUsIG5hbWUsIHZhbHVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIG5hbWVkIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHByZWZTdG9yZQotCSAqICAgICAgICAgICAgYSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBzdHJpbmcgdmFsdWVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0cmluZ1ZhbHVlcyhJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJaWYgKHByZWZTdG9yZSAhPSBudWxsICYmIG5hbWUgIT0gbnVsbCAmJiB2YWx1ZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZXNbaV0pOwotCQkJCWJ1ZmZlci5hcHBlbmQoUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJfQotCQkJcHJlZlN0b3JlLnNldFZhbHVlKG5hbWUsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91aS91dGlsL1dyYXBwZWRNZXNzYWdlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvV3JhcHBlZE1lc3NhZ2VEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1Y2YwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3VpL3V0aWwvV3JhcHBlZE1lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIERpc3BsYXlzIGEgbWVzc2FnZSBkaWFsb2cgdGhhdCBkaXNwbGF5cyB3cmFwcGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQotCXB1YmxpYyBXcmFwcGVkTWVzc2FnZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJSW1hZ2UgZGlhbG9nVGl0bGVJbWFnZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIGludCBkaWFsb2dJbWFnZVR5cGUsCi0JCQlTdHJpbmdbXSBkaWFsb2dCdXR0b25MYWJlbHMsIGludCBkZWZhdWx0SW5kZXgpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBkaWFsb2dUaXRsZUltYWdlLCBkaWFsb2dNZXNzYWdlLAotCQkJCWRpYWxvZ0ltYWdlVHlwZSwgZGlhbG9nQnV0dG9uTGFiZWxzLCBkZWZhdWx0SW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCQlDb250cm9sIHJDb21wb3NpdGUgPSBzdXBlci5jcmVhdGVNZXNzYWdlQXJlYShjb21wb3NpdGUpOwotCi0JCWludCBtaW5XaWR0aCA9IElEaWFsb2dDb25zdGFudHMuTUlOSU1VTV9NRVNTQUdFX0FSRUFfV0lEVEg7Ly8gKyAzMDA7Ci0JCS8vIFRPLURPOiBuZWVkIHRvIHJldmlzdCB0aGUgIyBvZiBkaWFsb2cgZGlzcGxheSB1bml0cyBhbmQgbWFyZ2luCi0JCS8vIHdoZW4gaW4gb3RoZXIgbGFuZ3VhZ2VzCi0JCWludCBjaGFyc1BlckxpbmUgPSBtaW5XaWR0aCAvIDQgLSAxNTsKLQkJR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIG1lc3NhZ2VMYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdkLm1pbmltdW1XaWR0aCA9IG1pbldpZHRoOwotCQltZXNzYWdlTGFiZWwuc2V0VGV4dChhZGRMaW5lQnJlYWtzKG1lc3NhZ2UsIGNoYXJzUGVyTGluZSkpOwotCi0JCXJldHVybiByQ29tcG9zaXRlOwotCX0KLQotCVN0cmluZyBhZGRMaW5lQnJlYWtzKFN0cmluZyBtc2csIGludCBtYXhDaGFycykgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBERUJVRzogb3JpZ2luYWwgbWVzc2FnZSA9ICIgKyBtc2cpOwotCi0JCWlmIChtc2cgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbXNnLmxlbmd0aCgpOyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQobXNnLmNoYXJBdChpKSk7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShtc2cuY2hhckF0KGkpKSkKLQkJCQljb3VudCA9IDA7Ci0JCQllbHNlCi0JCQkJY291bnQrKzsKLQotCQkJaWYgKGNvdW50ID49IG1heENoYXJzKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1zZy5jaGFyQXQoaSkpKSB7Ci0JCQkJCXN0ckJ1Zi5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY291bnQgPSAwOwotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgREVCVUc6IGJyb2tlbiBtZXNzYWdlID0gIiArCi0JCS8vIHN0ckJ1Zi50b1N0cmluZygpKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuQ29uZmlybShTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBRVUVTVElPTiwgbmV3IFN0cmluZ1tdIHsgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMIH0sIDApOyAvLyBPSyBpcyB0aGUKLQkJLy8gZGVmYXVsdAotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSAwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRXJyb3IoU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgRVJST1IsIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7IC8vIG9rCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkluZm9ybWF0aW9uKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJV3JhcHBlZE1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IFdyYXBwZWRNZXNzYWdlRGlhbG9nKHBhcmVudCwgdGl0bGUsCi0JCQkJbnVsbCwgLy8gYWNjZXB0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZGVmYXVsdAotCQkJCS8vIHdpbmRvdwotCQkJCS8vIGljb24KLQkJCQltZXNzYWdlLCBJTkZPUk1BVElPTiwKLQkJCQluZXcgU3RyaW5nW10geyBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMIH0sIDApOwotCQkvLyBvayBpcyB0aGUgZGVmYXVsdAotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5RdWVzdGlvbihTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSwKLQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCVdyYXBwZWRNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBXcmFwcGVkTWVzc2FnZURpYWxvZyhwYXJlbnQsIHRpdGxlLAotCQkJCW51bGwsIC8vIGFjY2VwdAotCQkJCS8vIHRoZQotCQkJCS8vIGRlZmF1bHQKLQkJCQkvLyB3aW5kb3cKLQkJCQkvLyBpY29uCi0JCQkJbWVzc2FnZSwgUVVFU1RJT04sIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLAotCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCB9LCAwKTsgLy8geWVzIGlzIHRoZQotCQkvLyBkZWZhdWx0Ci0JCXJldHVybiBkaWFsb2cub3BlbigpID09IDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG9wZW5XYXJuaW5nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlXcmFwcGVkTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgV3JhcHBlZE1lc3NhZ2VEaWFsb2cocGFyZW50LCB0aXRsZSwKLQkJCQludWxsLCAvLyBhY2NlcHQKLQkJCQkvLyB0aGUKLQkJCQkvLyBkZWZhdWx0Ci0JCQkJLy8gd2luZG93Ci0JCQkJLy8gaWNvbgotCQkJCW1lc3NhZ2UsIFdBUk5JTkcsIG5ldyBTdHJpbmdbXSB7IElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwgfSwgMCk7IC8vIG9rCi0JCS8vIGlzCi0JCS8vIHRoZQotCQkvLyBkZWZhdWx0Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5YTQzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2M2M5ZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnN3dAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRWNsaXBzZS1QbGF0Zm9ybUZpbHRlcjogKCYgKG9zZ2kud3M9d2luMzIpIChvc2dpLm9zPXdpbjMyKSAob3NnaS5hcmNoPXg4NikpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFhMDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3ZjY2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgV2luMzIgQ29tbW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL1dpbjMySFRNTFRyYW5zZmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLndpbjMyLndpbjMyLng4Ni9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi93aW4zMi9XaW4zMkhUTUxUcmFuc2Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjUzOGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL1dpbjMySFRNTFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQnl0ZUFycmF5VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlckRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5DT007Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5GT1JNQVRFVEM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLm9sZS53aW4zMi5JRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwub2xlLndpbjMyLlNUR01FRElVTTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwud2luMzIuT1M7Ci0KLS8qKgotICogVGhlIGNsYXNzIDxjb2RlPkhUTUxUcmFuc2ZlcjwvY29kZT4gcHJvdmlkZXMgYSBwbGF0Zm9ybSBzcGVjaWZpYyBtZWNoYW5pc20KLSAqIGZvciBjb252ZXJ0aW5nIHRleHQgaW4gSFRNTCBmb3JtYXQgcmVwcmVzZW50ZWQgYXMgYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4KLSAqIHRvIGEgcGxhdGZvcm0gc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgYW5kIHZpY2UgdmVyc2EuIFNlZQotICogPGNvZGU+VHJhbnNmZXI8L2NvZGU+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgotICogCi0gKiA8cD4KLSAqIEFuIGV4YW1wbGUgb2YgYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBIVE1MIHRleHQgaXMgc2hvd24KLSAqIGJlbG93OgotICogPC9wPgotICogCi0gKiA8Y29kZT48cHJlPgotICogICAgICAgU3RyaW5nIGh0bWxEYXRhID0gJnF1b3Q7Ci0gKiA8cD4KLSAqICBUaGlzIGlzIGEgcGFyYWdyYXBoIG9mIHRleHQuCi0gKiA8L3A+Ci0gKiAgJnF1b3Q7OwotICogPC9jb2RlPjwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgV2luMzJIVE1MVHJhbnNmZXIgZXh0ZW5kcyBCeXRlQXJyYXlUcmFuc2ZlciB7Ci0KLQlzdGF0aWMgV2luMzJIVE1MVHJhbnNmZXIgX2luc3RhbmNlID0gbmV3IFdpbjMySFRNTFRyYW5zZmVyKCk7Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfRk9STUFUID0gIkhUTUwgRm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIGludCBIVE1MX0ZPUk1BVElEID0gcmVnaXN0ZXJUeXBlKEhUTUxfRk9STUFUKTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gIjAwMDAwMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVIgPSAiVmVyc2lvbjowLjlcclxuU3RhcnRIVE1MOiIgKyBOVU1CRVIgLy8kTk9OLU5MUy0xJAotCQkJKyAiXHJcbkVuZEhUTUw6IiArIE5VTUJFUiArICJcclxuU3RhcnRGcmFnbWVudDoiICsgTlVNQkVSIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJKyAiXHJcbkVuZEZyYWdtZW50OiIgKyBOVU1CRVIgKyAiXHJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiPGh0bWw+PGJvZHk+PCEtLVN0YXJ0RnJhZ21lbnQtLT4iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICI8IS0tRW5kRnJhZ21lbnQtLT48L2JvZHk+PC9odG1sPiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU3RhcnRGcmFnbWVudCA9ICJTdGFydEZyYWdtZW50OiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRW5kRnJhZ21lbnQgPSAiRW5kRnJhZ21lbnQ6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdpbjMySFRNTFRyYW5zZmVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgSFRNTFRyYW5zZmVyIGNsYXNzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgSFRNTFRyYW5zZmVyIGNsYXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBXaW4zMkhUTUxUcmFuc2ZlciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmphdmFUb05hdGl2ZTwvY29kZT4gY29udmVydHMKLQkgKiBIVE1MLWZvcm1hdHRlZCB0ZXh0IHJlcHJlc2VudGVkIGJ5IGEgamF2YSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIGEKLQkgKiBwbGF0Zm9ybSBzcGVjaWZpYyByZXByZXNlbnRhdGlvbi4gRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc2VlCi0JICogPGNvZGU+VHJhbnNmZXIjamF2YVRvTmF0aXZlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIGphdmEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIEhUTUwgdGV4dAotCSAqIEBwYXJhbSB0cmFuc2ZlckRhdGEKLQkgKiAgICAgICAgICAgIGFuIGVtcHR5IDxjb2RlPlRyYW5zZmVyRGF0YTwvY29kZT4gb2JqZWN0OyB0aGlzIG9iamVjdCB3aWxsCi0JICogICAgICAgICAgICBiZSBmaWxsZWQgaW4gb24gcmV0dXJuIHdpdGggdGhlIHBsYXRmb3JtIHNwZWNpZmljIGZvcm1hdCBvZgotCSAqICAgICAgICAgICAgdGhlIGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBqYXZhVG9OYXRpdmUoT2JqZWN0IG9iamVjdCwgVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCQlpZiAoIWNoZWNrSFRNTChvYmplY3QpIHx8ICFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSkgewotCQkJRE5ELmVycm9yKERORC5FUlJPUl9JTlZBTElEX0RBVEEpOwotCQl9Ci0JCVN0cmluZyBzdHJpbmcgPSAoU3RyaW5nKSBvYmplY3Q7Ci0JCWludCBjb3VudCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQkJc3RyaW5nLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JCWludCBjb2RlUGFnZSA9IE9TLkdldEFDUCgpOwotCQlpbnQgY2NoTXVsdGlCeXRlID0gT1MuV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBudWxsLAotCQkJCTAsIG51bGwsIG51bGwpOwotCQlpZiAoY2NoTXVsdGlCeXRlID09IDApIHsKLQkJCXRyYW5zZmVyRGF0YS5zdGdtZWRpdW0gPSBuZXcgU1RHTUVESVVNKCk7Ci0JCQl0cmFuc2ZlckRhdGEucmVzdWx0ID0gQ09NLkRWX0VfU1RHTUVESVVNOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBzdGFydEhUTUwgPSBIRUFERVIubGVuZ3RoKCk7Ci0JCWludCBzdGFydEZyYWdtZW50ID0gc3RhcnRIVE1MICsgUFJFRklYLmxlbmd0aCgpOwotCQlpbnQgZW5kRnJhZ21lbnQgPSBzdGFydEZyYWdtZW50ICsgY2NoTXVsdGlCeXRlIC0gMTsKLQkJaW50IGVuZEhUTUwgPSBlbmRGcmFnbWVudCArIFNVRkZJWC5sZW5ndGgoKTsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihIRUFERVIpOwotCQlpbnQgbWF4TGVuZ3RoID0gTlVNQkVSLmxlbmd0aCgpOwotCQkvLyBzdGFydEhUTUwKLQkJaW50IHN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIpOwotCQlTdHJpbmcgdGVtcCA9IEludGVnZXIudG9TdHJpbmcoc3RhcnRIVE1MKTsKLQkJYnVmZmVyLnJlcGxhY2Uoc3RhcnQgKyBtYXhMZW5ndGggLSB0ZW1wLmxlbmd0aCgpLCBzdGFydCArIG1heExlbmd0aCwKLQkJCQl0ZW1wKTsKLQkJLy8gZW5kSFRNTAotCQlzdGFydCA9IGJ1ZmZlci50b1N0cmluZygpLmluZGV4T2YoTlVNQkVSLCBzdGFydCk7Ci0JCXRlbXAgPSBJbnRlZ2VyLnRvU3RyaW5nKGVuZEhUTUwpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCQkvLyBzdGFydEZyYWdtZW50Ci0JCXN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIsIHN0YXJ0KTsKLQkJdGVtcCA9IEludGVnZXIudG9TdHJpbmcoc3RhcnRGcmFnbWVudCk7Ci0JCWJ1ZmZlci5yZXBsYWNlKHN0YXJ0ICsgbWF4TGVuZ3RoIC0gdGVtcC5sZW5ndGgoKSwgc3RhcnQgKyBtYXhMZW5ndGgsCi0JCQkJdGVtcCk7Ci0JCS8vIGVuZEZyYWdtZW50Ci0JCXN0YXJ0ID0gYnVmZmVyLnRvU3RyaW5nKCkuaW5kZXhPZihOVU1CRVIsIHN0YXJ0KTsKLQkJdGVtcCA9IEludGVnZXIudG9TdHJpbmcoZW5kRnJhZ21lbnQpOwotCQlidWZmZXIucmVwbGFjZShzdGFydCArIG1heExlbmd0aCAtIHRlbXAubGVuZ3RoKCksIHN0YXJ0ICsgbWF4TGVuZ3RoLAotCQkJCXRlbXApOwotCi0JCWJ1ZmZlci5hcHBlbmQoUFJFRklYKTsKLQkJYnVmZmVyLmFwcGVuZChzdHJpbmcpOwotCQlidWZmZXIuYXBwZW5kKFNVRkZJWCk7Ci0KLQkJY291bnQgPSBidWZmZXIubGVuZ3RoKCk7Ci0JCWNoYXJzID0gbmV3IGNoYXJbY291bnQgKyAxXTsKLQkJYnVmZmVyLmdldENoYXJzKDAsIGNvdW50LCBjaGFycywgMCk7Ci0JCWNjaE11bHRpQnl0ZSA9IE9TLldpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZVBhZ2UsIDAsIGNoYXJzLCAtMSwgbnVsbCwgMCwKLQkJCQludWxsLCBudWxsKTsKLQkJaW50IGxwTXVsdGlCeXRlU3RyID0gT1MuR2xvYmFsQWxsb2MoT1MuR01FTV9GSVhFRCB8IE9TLkdNRU1fWkVST0lOSVQsCi0JCQkJY2NoTXVsdGlCeXRlKTsKLQkJT1MuV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlUGFnZSwgMCwgY2hhcnMsIC0xLCBscE11bHRpQnl0ZVN0ciwKLQkJCQljY2hNdWx0aUJ5dGUsIG51bGwsIG51bGwpOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtID0gbmV3IFNUR01FRElVTSgpOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnR5bWVkID0gQ09NLlRZTUVEX0hHTE9CQUw7Ci0JCXRyYW5zZmVyRGF0YS5zdGdtZWRpdW0udW5pb25GaWVsZCA9IGxwTXVsdGlCeXRlU3RyOwotCQl0cmFuc2ZlckRhdGEuc3RnbWVkaXVtLnBVbmtGb3JSZWxlYXNlID0gMDsKLQkJdHJhbnNmZXJEYXRhLnJlc3VsdCA9IENPTS5TX09LOwotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5uYXRpdmVUb0phdmE8L2NvZGU+IGNvbnZlcnRzIGEgcGxhdGZvcm0KLQkgKiBzcGVjaWZpYyByZXByZXNlbnRhdGlvbiBvZiBIVE1MIHRleHQgdG8gYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc2VlIDxjb2RlPlRyYW5zZmVyI25hdGl2ZVRvSmF2YTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRyYW5zZmVyRGF0YQotCSAqICAgICAgICAgICAgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIHRvIGJlIGJlZW4KLQkgKiAgICAgICAgICAgIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gYSBqYXZhIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyBIVE1MIHRleHQgaWYgdGhlCi0JICogICAgICAgICBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsOyBvdGhlcndpc2UgbnVsbAotCSAqLwotCXB1YmxpYyBPYmplY3QgbmF0aXZlVG9KYXZhKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkJaWYgKCFpc1N1cHBvcnRlZFR5cGUodHJhbnNmZXJEYXRhKSB8fCB0cmFuc2ZlckRhdGEucElEYXRhT2JqZWN0ID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSURhdGFPYmplY3QgZGF0YSA9IG5ldyBJRGF0YU9iamVjdCh0cmFuc2ZlckRhdGEucElEYXRhT2JqZWN0KTsKLQkJZGF0YS5BZGRSZWYoKTsKLQkJU1RHTUVESVVNIHN0Z21lZGl1bSA9IG5ldyBTVEdNRURJVU0oKTsKLQkJRk9STUFURVRDIGZvcm1hdGV0YyA9IHRyYW5zZmVyRGF0YS5mb3JtYXRldGM7Ci0JCXN0Z21lZGl1bS50eW1lZCA9IENPTS5UWU1FRF9IR0xPQkFMOwotCQl0cmFuc2ZlckRhdGEucmVzdWx0ID0gZGF0YS5HZXREYXRhKGZvcm1hdGV0Yywgc3RnbWVkaXVtKTsKLQkJZGF0YS5SZWxlYXNlKCk7Ci0JCWlmICh0cmFuc2ZlckRhdGEucmVzdWx0ICE9IENPTS5TX09LKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBoTWVtID0gc3RnbWVkaXVtLnVuaW9uRmllbGQ7Ci0KLQkJdHJ5IHsKLQkJCWludCBscE11bHRpQnl0ZVN0ciA9IE9TLkdsb2JhbExvY2soaE1lbSk7Ci0JCQlpZiAobHBNdWx0aUJ5dGVTdHIgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaW50IGNvZGVQYWdlID0gT1MuR2V0QUNQKCk7Ci0JCQkJaW50IGNjaFdpZGVDaGFyID0gT1MuTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlUGFnZSwKLQkJCQkJCU9TLk1CX1BSRUNPTVBPU0VELCBscE11bHRpQnl0ZVN0ciwgLTEsIG51bGwsIDApOwotCQkJCWlmIChjY2hXaWRlQ2hhciA9PSAwKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQljaGFyW10gbHBXaWRlQ2hhclN0ciA9IG5ldyBjaGFyW2NjaFdpZGVDaGFyIC0gMV07Ci0JCQkJT1MKLQkJCQkJCS5NdWx0aUJ5dGVUb1dpZGVDaGFyKGNvZGVQYWdlLCBPUy5NQl9QUkVDT01QT1NFRCwKLQkJCQkJCQkJbHBNdWx0aUJ5dGVTdHIsIC0xLCBscFdpZGVDaGFyU3RyLAotCQkJCQkJCQlscFdpZGVDaGFyU3RyLmxlbmd0aCk7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmcobHBXaWRlQ2hhclN0cik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCU9TLkdsb2JhbFVubG9jayhoTWVtKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCU9TLkdsb2JhbEZyZWUoaE1lbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50W10gZ2V0VHlwZUlkcygpIHsKLQkJcmV0dXJuIG5ldyBpbnRbXSB7IEhUTUxfRk9STUFUSUQgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgSFRNTF9GT1JNQVQgfTsKLQl9Ci0KLQlib29sZWFuIGNoZWNrSFRNTChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nICYmICgoU3RyaW5nKSBvYmplY3QpCi0JCQkJLmxlbmd0aCgpID4gMCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gY2hlY2tIVE1MKG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vd2luMzIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vd2luMzIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU0ZTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24ud2luMzIud2luMzIueDg2L3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3dpbjMyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpbmRvd3Mtc3BlY2lmaWMgY2xpcGJvYXJkIHRyYW5zZmVyIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNkdHByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jZHRwcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWRjZTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNkdHByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UtY2R0IHZlcnNpb249IjIuMCI/PgotCi08Y2R0cHJvamVjdD4KLTxkYXRhLz4KLTwvY2R0cHJvamVjdD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyNzc4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9ImxpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWYxNWYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIENvbW1vbiBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVkZDU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuY29tbW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZhNzA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IGNvbW1vbi5qYXIsIGxpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5hcGFjaGUuYW50O3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9hYm91dC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQxYmY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9IklCTSBXZWJTcGhlcmUgU3R1ZGlvIj4KLTx0aXRsZT5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxoMz5QbHVnLWluIExpY2Vuc2UgQWdyZWVtZW50PC9oMz4KLQotPHA+VXNlIG9mIHRoaXMgUGx1Zy1pbiBpcyBzdWJqZWN0IHRvIHRoZSBzYW1lIHRlcm1zIGFuZCBjb25kaXRpb25zIHdoaWNoIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBQcm9kdWN0IHdoaWNoIGluY2x1ZGVkIHRoaXMgUGx1Zy1pbi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkODI3NTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuY29tbW9uLmphciA9IHNyYy8KLW91dHB1dC5jb21tb24uamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gY29tbW9uLmphcixcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vbGliL2p0aWR5LTguMC0yMDA2MDgwMS4xMzEwNTktMy5qYXIgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL2xpYi9qdGlkeS04LjAtMjAwNjA4MDEuMTMxMDU5LTMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2ZjOTcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vbGliL2p0aWR5LTguMC0yMDA2MDgwMS4xMzEwNTktMy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwZmU5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBDb21tb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjMxZTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciIgbmFtZT0iTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiIHNjaGVtYT0ic2NoZW1hL21hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9iamVjdEZhY3RvcnkiIG5hbWU9Ik9iamVjdEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL29iamVjdEZhY3RvcnkuZXhzZCIvPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL21hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9tYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNhOGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc2NoZW1hL21hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmNvbW1vbiIgaWQ9Im1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIiBuYW1lPSJNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBBbGxvdyBhZGRpbmcgYWRkdGlvbmFsIGF0dHJpYnV0ZXMgdG8gbWFya2VycyBnZW5lcmF0ZWQgZnJvbSBFUEYKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS41Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLklNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9vYmplY3RGYWN0b3J5LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NjaGVtYS9vYmplY3RGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzNkNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zY2hlbWEvb2JqZWN0RmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5jb21tb24iIGlkPSJvYmplY3RGYWN0b3J5IiBuYW1lPSJPYmplY3RGYWN0b3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEFsbG93IHRvIGNyZWF0ZSBvYmplY3QgdGhyb3VnaCB0aGUgZXh0ZW5zaW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9iamVjdEZhY3RvcnkiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib2JqZWN0RmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIHBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JT2JqZWN0RmFjdG9yeQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9BYnN0cmFjdEFjdGl2YXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9BYnN0cmFjdEFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmIxNzNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vQWJzdHJhY3RBY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJ1bnRpbWUuSW50ZXJuYWxQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiBwbHVnLWlucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIGltcGxlbWVudHMgSUFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgaWNvbnMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUEFUSCA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkOwotCi0JLy8gVGhlIGxvZ2dlciBoYXNoIG1hcC4KLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBMb2dnZXI+IGxvZ2dlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvZ2dlcj4oKTsKLQotCS8vIFRoZSBtZXNzYWdlIGRpYWxvZyBoYXNoIG1hcC4KLQkvL3ByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE1zZ0RpYWxvZz4gbXNnRGlhbG9ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTXNnRGlhbG9nPigpOwotCi0JLy8gVGhlIHNoYXJlZCBpbWFnZSBoYXNoIG1hcC4KLQkvL3ByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEltYWdlPiBzaGFyZWRJbWFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltYWdlPigpOwotCi0JLy8gVGhlIHJlc291cmNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvLyBUaGlzIHBsdWctaW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBpbnN0YWxsIFVSTC4KLQlwcml2YXRlIFVSTCBpbnN0YWxsVVJMOwotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFsbCBwYXRoLgotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxQYXRoOwotCi0JLy8gVGhlIHBsdWctaW4gaWNvbiBVUkwuCi0JcHJvdGVjdGVkIFVSTCBpY29uVVJMOwotCi0JLy8gVGhlIHByb2ZpbGluZyBmbGFnLgotCXByaXZhdGUgYm9vbGVhbiBwcm9maWxpbmc7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEFjdGl2YXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJaW5pdChjb250ZXh0KTsKLQotCQkvLyBzZXQgdGhlIAotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiU3RhcnRlZCAiICsgcGx1Z2luSWQpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIEZyZWUgdGhlIHNoYXJlZCBpbWFnZXMuCi0vLwkJZm9yIChJdGVyYXRvciBpbWFnZXMgPSBzaGFyZWRJbWFnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaW1hZ2VzCi0vLwkJCQkuaGFzTmV4dCgpOykgewotLy8JCQlJbWFnZSBpbWFnZSA9IChJbWFnZSkgaW1hZ2VzLm5leHQoKTsKLS8vCQkJaWYgKGltYWdlICE9IG51bGwgJiYgIWltYWdlLmlzRGlzcG9zZWQoKSkgewotLy8JCQkJaW1hZ2UuZGlzcG9zZSgpOwotLy8JCQl9Ci0vLwkJfQotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oIlN0b3BwZWQgIiArIHBsdWdpbklkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgYnVuZGxlIGNvbnRleHQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBHZXQgdGhlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0KLQkJLy8gR2V0IHRoZSByZXNvdWNlIGJ1bmRsZSBmb3IgdGhpcyBwbHVnLWluLgotCQlyZXNvdXJjZUJ1bmRsZSA9IFBsYXRmb3JtLmdldFJlc291cmNlQnVuZGxlKGJ1bmRsZSk7Ci0KLQkJLy8gR2V0IHRoZSBJRCBmb3IgdGhpcyBwbHVnLWluLgotCQlwbHVnaW5JZCA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQlpZiAoaXNEZWJ1Z2dpbmcoKSkgewotCQkJZ2V0TG9nZ2VyKCkubG9nSW5mbygiSW5pdGlhbGl6aW5nICIgKyBwbHVnaW5JZCk7IC8vJE5PTi1OTFMtMSQJCQotCQl9Ci0KLQkJLy8gR2V0IHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCQlpbnN0YWxsVVJMID0gYnVuZGxlLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQotCQl0cnkgewotCQkJaW5zdGFsbFBhdGggPSBGaWxlTG9jYXRvci5yZXNvbHZlKGluc3RhbGxVUkwpLmdldFBhdGgoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW5zdGFsbFBhdGggPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKS5nZXRQYXRoKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJaWNvblVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgSUNPTl9QQVRIKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcga2V5ID0gc3ltYm9saWNOYW1lICsgIi9wcm9maWxpbmciOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmFsdWUgPSBJbnRlcm5hbFBsYXRmb3JtLmdldERlZmF1bHQoKS5nZXRPcHRpb24oa2V5KTsKLQkJCXByb2ZpbGluZyA9IHZhbHVlID09IG51bGwgPyBmYWxzZSA6IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGlzRGVidWdnaW5nKCkpIHsKLQkJCWdldExvZ2dlcigpLmxvZ0luZm8oCi0JCQkJCSJJbml0aWFsaXplZCAiICsgcGx1Z2luSWQgKyAiLCBpbnN0YWxsUGF0aD0iICsgaW5zdGFsbFBhdGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBJRCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgVVJMIG9mIHRoaXMgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gVGhlCi0JICogICAgICAgICAgICBpbnN0YWxsIFVSTCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gaW5zdGFsbFVSTDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIHBhdGggb2YgdGhpcyBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBUaGUKLQkgKiAgICAgICAgICAgIGluc3RhbGwgcGF0aCBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsUGF0aCgpIHsKLQkJcmV0dXJuIGluc3RhbGxQYXRoOwotCX0KLQotCS8qKgotCSAqIExvYWRzIGFuZCByZXR1cm5zIHRoZSBsb2NhbGl6ZWQgcHJvcGVydGllcyBvZiBhIEphdmEgcHJvcGVydGllcyBmaWxlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+UHJvcGVydGllczwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcHM7Ci0JCX0KLQotCQlTdHJpbmcgZmlsZVBhdGggPSBnZXRMb2NhbGl6ZWRGaWxlKHBhdGgsIHRydWUpOwotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJcHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVQYXRoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsb2NhbGUgc3BlY2lmaWMgYWJzb2x1dGUgZmlsZSBwYXRoIG5hbWUgb2YgdGhlIGdpdmVuIGZpbGUgaW4gdGhlCi0JICogcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgcHJvcGVydGllcyBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4gcm9vdC4KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgbG9jYWxlIHNwZWNpZmljIGFic29sdXRlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSBnaXZlbgotCSAqICAgICAgICAgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRGaWxlKFN0cmluZyBwYXRoLCBib29sZWFuIHVzZURlZmF1bHQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZVBhdGggPSBudWxsOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShwYXRoKTsKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihmaWxlTmFtZSk7Ci0JCVN0cmluZyBwYXRoTmFtZSA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQotCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKCk7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBQbGF0Zm9ybS5nZXRGcmFnbWVudHMoYnVuZGxlKTsKLQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVVJMIGVudHJ5ID0gYnVuZGxlc1tpXS5nZXRFbnRyeShwYXRoTmFtZSk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoZW50cnkpOwotCQkJCQlmaWxlUGF0aCA9IEkxOG5VdGlsLmdldExvY2FsaXplZEZpbGUodXJsLmdldFBhdGgoKQotCQkJCQkJCSsgZmlsZU5hbWUsIGxvY2FsZSk7IAotCQkJCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJVVJMIGVudHJ5ID0gYnVuZGxlLmdldEVudHJ5KHBhdGgpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZShlbnRyeSk7Ci0JCQkJZmlsZVBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKHVybC5nZXRQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKGZpbGVQYXRoID09IG51bGwgJiYgdXNlRGVmYXVsdCkgewotCQkJCQlmaWxlUGF0aCA9IHVybC5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZpbGVQYXRoOwotCX0KLQotCS8qKgotCSAqIGZvciB0aGUgZ2l2ZW4gcGF0aCBpbiB0aGUgcGx1Z2luLCBmaW5kIHRoZSBsb2NhbGl6ZWQgZmlsZXMgZm9ybSB0aGUgbmwKLQkgKiBmcmFnZW1lbmV0cyBhbmQgY29weSB0aGUgbG9jYWxpemVkIGZpbGVzIHRvIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgU3RyaW5nIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgcGx1Z2luIHJvb3QuIFRoZSBmaWxlcyBpbiB0aGlzCi0JICogICAgICAgICAgICBmb2xkZXIgd2lsbCBiZSBpdGVyYXRlZCBhbmQgdGhlaXIgbG9jYWxpemVkIGZpbGVzIHdpbGwgYmUKLQkgKiAgICAgICAgICAgIGNvcGllZCBvdmVyCi0JICogQHBhcmFtIHRvRGlyCi0JICogICAgICAgICAgICBGSWxlIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIKLQkgKiBAcGFyYW0gcmVjdXJzaXZlCi0JICogICAgICAgICAgICBib29sZWFuIHJlY3VyaXZlbHkgbG9va2luZyBmb3IgZmlsZXMgaW50IHRoZSBzcGVjaWZpZWQgZm9sZGVyCi0JICogQHBhcmFtIHVzZUxvY2FsZUZpbGVOYW1lCi0JICogICAgICAgICAgICBib29sZWFuIGlmIHRydWUgdGhlIGxvY2FsZSBzcGVjaWZpYyBmaWxlIG5hbWVzIHdpbGwgYmUgdXNlZCBpbgotCSAqICAgICAgICAgICAgdGhlIGNvcGllZCBkZXN0aW5hdGlvbiwgb3RoZXJ3aXNlLCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUKLQkgKiAgICAgICAgICAgIG5hbWUgd2lsbCBiZSByZW5hbWVkIHRvIHRoZSBkZWZhdWx0IG9uZSBpbiB0aGUgZGVzdGluYXRpb24KLQkgKiAgICAgICAgICAgIGZvbGRlcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5TG9jYWxpemVkRmlsZXMoU3RyaW5nIHBhdGgsIEZpbGUgdG9EaXIsIGJvb2xlYW4gcmVjdXJzaXZlLAotCQkJYm9vbGVhbiB1c2VMb2NhbGVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBnZXRJbnN0YWxsUGF0aCgpOwotCQlVUkkgcGx1Z2luVXJpID0gbmV3IEZpbGUocGx1Z2luUGF0aCkudG9VUkkoKTsKLQkJVVJJIHBhdGhVcmkgPSBuZXcgRmlsZShwbHVnaW5QYXRoLCBwYXRoKS50b1VSSSgpOwotCi0JCUxpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKHBsdWdpblBhdGgsIHBhdGgpOwotCQlGaWxlVXRpbC5nZXRBbGxGaWxlcyhmLCBmaWxlcywgcmVjdXJzaXZlKTsKLQotCQkvLyBmb3IgZWFjaCBmaWxlIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyLCBnZXQgdGhlIGxvY2FsaXplZCBmaWxlCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlVUkkgc3JjVXJpID0gKChGaWxlKSBpdC5uZXh0KCkpLnRvVVJJKCk7Ci0KLQkJCS8vIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZmlsZSB0byB0aGUgcGx1Z2luIHJvb3QsIHRoZW4gZmluZAotCQkJLy8gdGhlIGxvY2FsaXplZCBmaWxlCi0JCQlTdHJpbmcgcmVsUGF0aCA9IHBsdWdpblVyaS5yZWxhdGl2aXplKHNyY1VyaSkuZ2V0UGF0aCgpOwotCi0JCQkvLyBvbmx5IGdldCB0aGUgbG9jYWxlIHNwZWNpZmljIGZpbGUsIGRvbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgb25lCi0JCQlTdHJpbmcgbG9jYWxpemVkRmlsZSA9IGdldExvY2FsaXplZEZpbGUocmVsUGF0aCwgZmFsc2UpOwotCQkJaWYgKGxvY2FsaXplZEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBuZWVkIHRvIGNoYW5nZSB0aGUgdGFyZ2V0IGZpbGUgcGF0aCB0byByZWxhdGl2ZSB0byB0aGUgcGF0aAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgcGx1Z2luIHJvb3QKLQkJCXJlbFBhdGggPSBwYXRoVXJpLnJlbGF0aXZpemUoc3JjVXJpKS5nZXRQYXRoKCk7Ci0JCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShsb2NhbGl6ZWRGaWxlKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRvRGlyLCByZWxQYXRoKTsKLQkJCUZpbGUgdGFyZ2V0UGFyZW50ID0gdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJCS8vIGNvcHkgdGhlIGZpbGUgdG8gdGhlIGRlc2l0aW5hdGlvbgotCQkJLy8gaWYgdXNlTG9jYWxlRmlsZU5hbWUgaXMgdHJ1ZSwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSBzaG91bGQKLQkJCS8vIGFsc28gdXNlIHRoZSBsb2NhbGUgc3BlY2lmaWMgZmlsZSBuYW1lCi0JCQlpZiAodXNlTG9jYWxlRmlsZU5hbWUpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBzcmNGaWxlLmdldE5hbWUoKTsKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0UGFyZW50LCBmaWxlTmFtZSk7Ci0JCQl9Ci0KLQkJCWlmIChpc0RlYnVnZ2luZygpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb3B5aW5nIGxvY2FsaXplZCBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU291cmNlOiAiICsgc3JjRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRhcmdldDogIiArIHRhcmdldEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICghdGFyZ2V0UGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJCXRhcmdldFBhcmVudC5ta2RpcnMoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJdGFyZ2V0RmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJfQotCi0JCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBsb2NhbGl6ZWQgbWVzc2FnZSBnaXZlbiB0aGUgcmVzb3VyY2Uga2V5IGFuZCB0aGUKLQkgKiBtZXNzYWdlIGFyZ3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGFyZ3VtZW50Ci0JICogICAgICAgICAgICBUaGUgbWVzc2FnZSBhcmd1bWVudC4KLQkgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgbG9jYWxpemVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRNZXNzYWdlKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgbXNnID0gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0JCQkJT2JqZWN0W10gYXJndW1lbnRzID0geyBhcmd1bWVudCB9OwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIGFyZ3VtZW50cyk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiAnWycgKyBrZXkgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgVVJMIGdpdmVuIHRoZSByZWxhdGl2ZSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVBhdGgKLQkgKiAgICAgICAgICAgIFRoZSBpbWFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIHBsdWctaW4ncyByb290LgotCSAqIEByZXR1cm4gVGhlIGltYWdlIFVSTC4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldEltYWdlVVJMKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKGljb25VUkwsIHJlbGF0aXZlUGF0aCk7Ci0JCQlyZXR1cm4gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLS8vCS8qKgotLy8JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLS8vCSAqIAotLy8JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotLy8JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLS8vCSAqIEByZXR1cm4gVGhlIGltYWdlIGRlc2NyaXB0b3IuCi0vLwkgKi8KLS8vCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLS8vCQl0cnkgewotLy8JCQlVUkwgdXJsID0gbmV3IFVSTChpY29uVVJMLCByZWxhdGl2ZVBhdGgpOwotLy8JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLS8vCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotLy8JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBpbWFnZSBnaXZlbiB0aGUgcmVsYXRpdmUgcGF0aC4KLS8vCSAqIDxwPgotLy8JICogTm90ZTogVGhlIHJldHVybmVkIGltYWdlIG5lZWQgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLS8vCSAqIAotLy8JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotLy8JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLS8vCSAqIEByZXR1cm4gVGhlIGltYWdlLgotLy8JICovCi0vLwlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotLy8JCUltYWdlIGltYWdlID0gbnVsbDsKLS8vCi0vLwkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotLy8JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotLy8JCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZShmYWxzZSk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gaW1hZ2U7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0vLwkgKiA8cD4KLS8vCSAqIE5vdGU6IFRoZSByZXR1cm5lZCBpbWFnZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgcGx1Zy1pbgotLy8JICogc2h1dHMgZG93bi4KLS8vCSAqIAotLy8JICogQHBhcmFtIHJlbGF0aXZlUGF0aAotLy8JICogICAgICAgICAgICBUaGUgaW1hZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwbHVnLWluJ3Mgcm9vdC4KLS8vCSAqIEByZXR1cm4gVGhlIGltYWdlLgotLy8JICovCi0vLwlwdWJsaWMgSW1hZ2UgZ2V0U2hhcmVkSW1hZ2UoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotLy8JCUltYWdlIGltYWdlID0gKEltYWdlKSBzaGFyZWRJbWFnZXMuZ2V0KHJlbGF0aXZlUGF0aCk7Ci0vLwkJaWYgKGltYWdlICE9IG51bGwpIHsKLS8vCQkJcmV0dXJuIGltYWdlOwotLy8JCX0KLS8vCi0vLwkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihyZWxhdGl2ZVBhdGgpOwotLy8JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotLy8JCQlpbWFnZSA9IGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZShmYWxzZSk7Ci0vLwkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0vLwkJCQlzaGFyZWRJbWFnZXMucHV0KHJlbGF0aXZlUGF0aCwgaW1hZ2UpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gaW1hZ2U7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9maWxpbmcgZmxhZy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHByb2ZpbGluZyBpcyBlbmFibGVkIGZvciB0aGlzIHBsdS1pbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvZmlsaW5nKCkgewotCQlyZXR1cm4gcHJvZmlsaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvZ2dlciBnaXZlbiB0aGUgcGx1Zy1pbiBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXcgb3IgY2FjaGVkIGxvZ2dlci4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IChMb2dnZXIpIGxvZ2dlcnMuZ2V0KHBsdWdpbklkKTsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBuZXcgTG9nZ2VyKHRoaXMpOwotCQkJbG9nZ2Vycy5wdXQocGx1Z2luSWQsIGxvZ2dlcik7Ci0JCX0KLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0JCQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG9iamVjdCBvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhPYmplY3QgbG9nRW50cnkpIHsKLQkJaWYgKGxvZ0VudHJ5IGluc3RhbmNlb2YgVGhyb3dhYmxlKSB7Ci0JCQkoKFRocm93YWJsZSkgbG9nRW50cnkpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihsb2dFbnRyeSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29tbW9uUHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpIHsKLQkJaWYgKCBDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmNvbnRleHRQcm92aWRlciAhPSBudWxsICkgewotCQkJcmV0dXJuIENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuY29udGV4dFByb3ZpZGVyLmdldENvbnRleHQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJTWVzc2FnZUNhbGxiYWNrIGdldE1zZ0NhbGxiYWNrKCkgewotCQlyZXR1cm4gQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5tc2dDYWxsYmFjazsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9Db21tb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4MTE2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0NvbW1vblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIENvbW1vbiBwbHVnLWluIGFjdGl2YXRvci4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vblBsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb21tb25QbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tbW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLS8vCS8qKgotLy8JICogc2V0IHRoZSBzdG9yZSB3cmFwcGVyIGJlZm9yZSBpdCdzIGJlaW5nIHVzZWQuCi0vLwkgKiBAcGFyYW0gc3RvcmVXcmFwcGVyCi0vLwkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlV3JhcHBlciA9IG51bGw7Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29tbW9uUHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlV3JhcHBlcikgewotCQl0aGlzLnN0b3JlV3JhcHBlciA9IHN0b3JlV3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIGdldENvbW1vblByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIHN0b3JlV3JhcHBlcjsKLQl9Ci0JCi0JLy8gdGhpcyBpcyB0aGUgY29udGV4dCBmb3IgbWVzc2FnZSBjYWxsYmFjawotCS8vIGZvciBlY2xpcHNlIGNsaWVudCwgdGhpcyBpcyB0aGUgU2hlbGwgb2JqZWN0Ci0JSUNvbnRleHRQcm92aWRlciBjb250ZXh0UHJvdmlkZXIgPSBudWxsOwotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFByb3ZpZGVyKElDb250ZXh0UHJvdmlkZXIgY29udGV4dFByb3ZpZGVyKSB7Ci0JCXRoaXMuY29udGV4dFByb3ZpZGVyID0gY29udGV4dFByb3ZpZGVyOwotCX0KLQotCUlNZXNzYWdlQ2FsbGJhY2sgbXNnQ2FsbGJhY2sgPSBudWxsOwotCXB1YmxpYyB2b2lkIHNldE1zZ0NhbGxiYWNrKElNZXNzYWdlQ2FsbGJhY2sgbXNnQ2FsbGJhY2spIHsKLQkJdGhpcy5tc2dDYWxsYmFjayA9IG1zZ0NhbGxiYWNrOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL0lBY3RpdmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDg0NGY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3RpdmF0b3IgewotCVN0cmluZyBnZXRJZCgpOwotCUxvZ2dlciBnZXRMb2dnZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSUNvbnRleHRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JQ29udGV4dFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTdhMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JQ29udGV4dFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbjsKLQotcHVibGljIGludGVyZmFjZSBJQ29udGV4dFByb3ZpZGVyIHsKLQlwdWJsaWMgT2JqZWN0IGdldENvbnRleHQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vSU1lc3NhZ2VDYWxsYmFjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JTWVzc2FnZUNhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDdkZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9JTWVzc2FnZUNhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb247Ci0KLQotcHVibGljIGludGVyZmFjZSBJTWVzc2FnZUNhbGxiYWNrIHsKLQotCXB1YmxpYyB2b2lkIGRpc3BsYXlXYXJuaW5nKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uKTsKLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sIFRocm93YWJsZSBleCk7Ci0JcHVibGljIHZvaWQgZGlzcGxheVdhcm5pbmcoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KTsKLQlwdWJsaWMgdm9pZCBkaXNwbGF5V2FybmluZyhBYnN0cmFjdEFjdGl2YXRvciBwbHVnaW4sIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIGRldGFpbHMsIFRocm93YWJsZSBleCk7Ci0JCi0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQlwdWJsaWMgdm9pZCBkaXNwbGF5RXJyb3IoQWJzdHJhY3RBY3RpdmF0b3IgcGx1Z2luLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFRocm93YWJsZSBleCk7Ci0JcHVibGljIHZvaWQgZGlzcGxheUVycm9yKEFic3RyYWN0QWN0aXZhdG9yIHBsdWdpbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgVGhyb3dhYmxlIGV4KTsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxGb3JtYXR0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4OTAyZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy53M2MudGlkeS5UaWR5OwotCi0vKioKLSAqIFByZXR0eS1mb3JtYXRzIEhUTUwgc291cmNlIGFuZCBtYWtlcyBpdCBYSFRNTCBjb21wbGlhbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9CT0RZX1NUQVJUX1RBRyA9ICI8Ym9keSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX0JPRFlfRU5EX1RBRyA9ICI8L2JvZHk+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEhUTUxfQk9EWV9TVEFSVF9UQUdfTEVOR1RIID0gSFRNTF9CT0RZX1NUQVJUX1RBRwotCQkJLmxlbmd0aCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR05PU1RJQ19TT1VSQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5IVE1MRm9ybWF0dGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBpbnQgbGluZVdpZHRoOwotCi0JcHJpdmF0ZSBib29sZWFuIGluZGVudDsKLQotCXByaXZhdGUgaW50IGluZGVudFNpemU7Ci0KLQlwcml2YXRlIFN0cmluZyBsYXN0RXJyb3JTdHI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3doaXRlc3BhY2UgPSBQYXR0ZXJuLmNvbXBpbGUoIl5cXHMrIiwgUGF0dGVybi5NVUxUSUxJTkUpOwotCi0JLyoKLQkgKiBTdHJpbmcgbG9jYXRpb24gPSBtLmdyb3VwKDEpOwotCSAqIFN0cmluZyBsaW5lU3RyID0gbS5ncm91cCgyKTsKLQkgKiBTdHJpbmcgY29sdW1uU3RyID0gbS5ncm91cCgzKTsKLQkgKiBTdHJpbmcgZXJyb3JNc2cgPSBtLmdyb3VwKDQpOwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBqVGlkeUVycm9yUGFyc2VyID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSIobGluZVxccysoXFxkKylcXHMrY29sdW1uXFxzKyhcXGQrKSlcXHMrLVxccysoLispIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSFRNTEZvcm1hdHRlcigpIHsKLQkJdGhpcygxMzIsIHRydWUsIDQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxGb3JtYXR0ZXIoaW50IGxpbmVXaWR0aCwgYm9vbGVhbiBpbmRlbnQsIGludCBpbmRlbnRTaXplKSB7Ci0JCXRoaXMubGluZVdpZHRoID0gbGluZVdpZHRoOwotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQkJdGhpcy5pbmRlbnRTaXplID0gaW5kZW50U2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYXhpbXVtIGNoYXJhY3RlciB3aWR0aCBvZiBhIGxpbmUuCi0JICogCi0JICogQHBhcmFtIGxpbmVXaWR0aAotCSAqICAgICAgICAgICAgVGhlIGxpbmUgd2lkdGggKGluIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCkgewotCQl0aGlzLmxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRhZ3MgaW5kZW50LgotCSAqIAotCSAqIEBwYXJhbSBpbmRlbnQKLQkgKiAgICAgICAgICAgIElmIHRydWUsIGlkZW50IHRoZSB0YWdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGVudChib29sZWFuIGluZGVudCkgewotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmRlbnQgc2l6ZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZW50U2l6ZQotCSAqICAgICAgICAgICAgVGhlIGluZGVudCBzaXplIChpbiBudW1iZXIgb2YgY2hhcmFjdGVycykuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZW50U2l6ZShpbnQgaW5kZW50U2l6ZSkgewotCQl0aGlzLmluZGVudFNpemUgPSBpbmRlbnRTaXplOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogICAgICAgICAgICBUaGUgSFRNTCBzb3VyY2UuCi0JICogQHJldHVybiBUaGUgcHJldHR5LWZvcm1hdHRlZCBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdEhUTUwoU3RyaW5nIGh0bWwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZvcm1hdEhUTUwoaHRtbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIGdpdmVuIEhUTUwgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBodG1sIFRoZSBIVE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gcmV0dXJuQm9keU9ubHkgaWYgZmFsc2UsIHJldHVybiBmdWxsIEhUTUwgZG9jdW1lbnQgb3IgYm9keSBjb250ZW50IGJhc2VkIG9uIHdoYXQgaXMgcGFzc2VkIGluLiAgaWYgdHJ1ZSwgYWx3YXlzIHJldHVybiBib2R5IGNvbnRlbnQgb25seQotCSAqIEBwYXJhbSBmb3JjZU91dHB1dCBpZiB0cnVlLCByZXR1cm4gY2xlYW5lZCBIVE1MIGV2ZW4gaWYgZXJyb3JzLiBpZiBmYWxzZSwgd2lsbCBjbGVhbiBtaW5vciBwcm9ibGVtcyBhbmQgcmV0dXJuIGNsZWFuIEhUTUwsIGJ1dCBvbiBhIG1ham9yIGVycm9yLCB3aWxsIHNldCBnZXRMYXN0RXJyb3JTdHIoKSBhbmQgcmV0dXJuIHBhc3NlZC1pbiBodG1sCi0JICogQHBhcmFtIG1ha2VCYXJlIHNldCB0byB0cnVlIGZvciBjbGVhbmluZyBNUyBIVE1MCi0JICogQHBhcmFtIHdvcmQyMDAwIHNldCB0byB0cnVlIGZvciBjbGVhbmluZyBNUyBXb3JkIDIwMDAgSFRNTCAKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyBodG1sLCBib29sZWFuIHJldHVybkJvZHlPbmx5LCBib29sZWFuIGZvcmNlT3V0cHV0LCBib29sZWFuIG1ha2VCYXJlLCBib29sZWFuIHdvcmQyMDAwKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWxhc3RFcnJvclN0ciA9IG51bGw7Ci0JCWlmIChodG1sID09IG51bGwgfHwgaHRtbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gaHRtbDsKLQkJfQotCQkKLQkJaHRtbCA9IHJlbW92ZUxlYWRpbmdXaGl0ZXNwYWNlKGh0bWwpOwotCi0JCVRpZHkgdGlkeSA9IG5ldyBUaWR5KCk7Ci0JCXRpZHkuc2V0WEhUTUwodHJ1ZSk7Ci0JCXRpZHkuc2V0RHJvcEVtcHR5UGFyYXMoZmFsc2UpOwotCQl0aWR5LnNldERyb3BGb250VGFncyhmYWxzZSk7Ci0JCXRpZHkuc2V0UXVpZXQodHJ1ZSk7Ci0JCXRpZHkuc2V0U2hvd1dhcm5pbmdzKGZhbHNlKTsKLQkJdGlkeS5zZXRTbWFydEluZGVudChmYWxzZSk7Ci0JCXRpZHkuc2V0VGlkeU1hcmsoZmFsc2UpOwotCQl0aWR5LnNldFdyYXBsZW4obGluZVdpZHRoKTsKLQkJdGlkeS5zZXRJbmRlbnRBdHRyaWJ1dGVzKGZhbHNlKTsKLQkJdGlkeS5zZXRJbmRlbnRDb250ZW50KGluZGVudCk7Ci0JCXRpZHkuc2V0U3BhY2VzKGluZGVudFNpemUpOwotCQl0aWR5LnNldElucHV0RW5jb2RpbmcoIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCXRpZHkuc2V0T3V0cHV0RW5jb2RpbmcoIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCXRpZHkuc2V0Rml4QmFja3NsYXNoKGZhbHNlKTsKLQkJLy8gdGhpcyB3aWxsIGFkZCA8cD4gYXJvdW5kIGVhY2ggdGV4dCBibG9jayAoP3RoYXQgaXNuJ3QgaW4gYSBibG9jayBhbHJlYWR5PykKLS8vCQl0aWR5LnNldEVuY2xvc2VCbG9ja1RleHQodHJ1ZSk7Ci0JCS8vIHNldHRpbmcgdGhpcyBzZWVtZWQgdG8gcHJldmVudCBKVGlkeSBmcm9tIGluZGVudGluZyB0aGUgc291cmNlCi0vLwkJdGlkeS5zZXRQcmludEJvZHlPbmx5KHRydWUpOwotCQkKLQkJaWYgKGZvcmNlT3V0cHV0KSB7Ci0JCQkvLyBvdXRwdXQgZG9jdW1lbnQgZXZlbiBpZiBlcnJvcnMgYXJlIHByZXNlbnQKLQkJCXRpZHkuc2V0Rm9yY2VPdXRwdXQodHJ1ZSk7Ci0JCX0KLQkJaWYgKG1ha2VCYXJlKSB7Ci0JCQkvLyByZW1vdmUgTVMgY2x1dHRlcgotCQkJdGlkeS5zZXRNYWtlQmFyZSh0cnVlKTsKLQkJfQotCQlpZiAod29yZDIwMDApIHsKLQkJCS8vIGRyYWNvbmlhbiBXb3JkMjAwMCBjbGVhbmluZwotCQkJdGlkeS5zZXRXb3JkMjAwMCh0cnVlKTsKLQkJfQotCi0JCVJlYWRlciBpbnB1dCA9IG5ldyBTdHJpbmdSZWFkZXIoaHRtbCk7Ci0JCVdyaXRlciBvdXRwdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRpZHkuc2V0RXJyb3V0KHB3KTsKLQkJdGlkeS5wYXJzZShpbnB1dCwgb3V0cHV0KTsKLQkJU3RyaW5nIGVycm9yID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQkJaWYgKGVycm9yICE9IG51bGwgJiYgZXJyb3IubGVuZ3RoKCkgPiAwCi0JCQkJJiYgZXJyb3Iuc3RhcnRzV2l0aCgibGluZSIpICYmIGVycm9yLmluZGV4T2YoImNvbHVtbiIpID4gMCkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWxhc3RFcnJvclN0ciA9IGVycm9yOwotCQkJaWYgKCFmb3JjZU91dHB1dCkgewotCQkJCS8vIGlmIGZvcmNlT3V0cHV0IGlzIHRydWUsIEpUaWR5IHdpbGwgcmV0dXJuIGNsZWFuIEhUTUwgc28gZG9uJ3QgcmV0dXJuIGhlcmUKLQkJCQlyZXR1cm4gaHRtbDsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBmb3JtYXR0ZWRIVE1MID0gb3V0cHV0LnRvU3RyaW5nKCk7Ci0JCWZvcm1hdHRlZEhUTUwgPSBTdHJVdGlsLmdldEVzY2FwZWRIVE1MKGZvcm1hdHRlZEhUTUwpOwotCQkKLQkJU3RyaW5nIGh0bWxTdGFydFVwcGVyID0gaHRtbC5zdWJzdHJpbmcoMCwgTWF0aC5taW4oMTAsIGh0bWwubGVuZ3RoKCkpKS50b1VwcGVyQ2FzZSgpOwotCi0JCWlmIChyZXR1cm5Cb2R5T25seSB8fCAoIWh0bWxTdGFydFVwcGVyLnN0YXJ0c1dpdGgoIjwhRE9DVFlQRSIpICYmICFodG1sU3RhcnRVcHBlci5zdGFydHNXaXRoKCI8SFRNTCIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWludCBzdGFydEJvZHlUYWcgPSBmb3JtYXR0ZWRIVE1MLmluZGV4T2YoSFRNTF9CT0RZX1NUQVJUX1RBRyk7Ci0JCQlpbnQgc3RhcnQgPSAtMTsKLQkJCWlmIChzdGFydEJvZHlUYWcgIT0gLTEpIHsKLQkJCQlzdGFydCA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZigiPiIsc3RhcnRCb2R5VGFnKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IGVuZCA9IGZvcm1hdHRlZEhUTUwuaW5kZXhPZihIVE1MX0JPRFlfRU5EX1RBRyk7Ci0JCQlpZiAoc3RhcnQgPT0gLTEgfHwgZW5kID09IC0xKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGFydCArPSAxOwotCQkJaWYgKHN0YXJ0ID49IGVuZCkgewotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhcnQgKz0gRmlsZVV0aWwuTElORV9TRVBfTEVOR1RIOwotCQkJZW5kIC09IEZpbGVVdGlsLkxJTkVfU0VQX0xFTkdUSDsKLQkJCWlmIChpbmRlbnQgJiYgaW5kZW50U2l6ZSA+IDApIHsKLQkJCQllbmQgLT0gaW5kZW50U2l6ZTsKLQkJCX0KLQkJCWlmIChzdGFydCA+PSBlbmQpIHsKLQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyByZXN1bHQgPSBmb3JtYXR0ZWRIVE1MLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCWlmIChpbmRlbnQgJiYgaW5kZW50U2l6ZSA+IDApIHsKLQkJCQlTdHJpbmcgaW5kZW50U3RyID0gZ2V0SW5kZW50U3RyKGluZGVudFNpemUgKiAyKTsKLQkJCQlyZXN1bHQgPSBmaXhJbmRlbnRhdGlvbihyZXN1bHQsIGluZGVudFN0cik7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9ybWF0dGVkSFRNTDsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZGVudCBzdHJpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEluZGVudFN0cihpbnQgaW5kZW50TGVuZ3RoKSB7Ci0JCWlmIChpbmRlbnRMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGluZGVudFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRMZW5ndGg7IGkrKykgewotCQkJaW5kZW50U3RyLmFwcGVuZCgnICcpOwotCQl9Ci0JCXJldHVybiBpbmRlbnRTdHIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVfVEFHX1NUQVJUID0gIjxwcmU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFX1RBR19FTkQgPSAiPC9wcmU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1RBR19FTkRfTEVOR1RIID0gUFJFX1RBR19FTkQubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBKVGlkeSBpbmRlbnQsIGJ1dCBpZ25vcmUgJmx0O3ByZSZndDsgdGFncwotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogQHBhcmFtIGluZGVudFN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZml4SW5kZW50YXRpb24oU3RyaW5nIGh0bWwsIFN0cmluZyBpbmRlbnRTdHIpIHsKLQkJaWYgKGh0bWwuc3RhcnRzV2l0aChpbmRlbnRTdHIpKSB7Ci0JCQlodG1sID0gaHRtbC5zdWJzdHJpbmcoaW5kZW50U3RyLmxlbmd0aCgpKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgcHJlX2luZGV4ID0gLTE7Ci0JCWludCBsYXN0X3ByZV9lbmRfaW5kZXggPSAtMTsKLQkJd2hpbGUgKChwcmVfaW5kZXggPSBodG1sLmluZGV4T2YoUFJFX1RBR19TVEFSVCwgbGFzdF9wcmVfZW5kX2luZGV4KSkgIT0gLTEpIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcoCi0JCQkJCWxhc3RfcHJlX2VuZF9pbmRleCA8IDAgPyAwIDogbGFzdF9wcmVfZW5kX2luZGV4Ci0JCQkJCQkJKyBQUkVfVEFHX0VORF9MRU5HVEgsIHByZV9pbmRleCkucmVwbGFjZUFsbCgKLQkJCQkJIlxyXG4iICsgaW5kZW50U3RyLCAiXHJcbiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlsYXN0X3ByZV9lbmRfaW5kZXggPSBodG1sLmluZGV4T2YoUFJFX1RBR19FTkQsIHByZV9pbmRleCk7Ci0JCQlpZiAobGFzdF9wcmVfZW5kX2luZGV4ICE9IC0xKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChodG1sLnN1YnN0cmluZyhwcmVfaW5kZXgsIGxhc3RfcHJlX2VuZF9pbmRleAotCQkJCQkJKyBQUkVfVEFHX0VORF9MRU5HVEgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZm91bmQgPHByZT4sIGJ1dCBubyBlbmRpbmcgPC9wcmU+IC0gc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUKLQkJCQkvLyBhcHBlbmQgcmVzdCBvZiBzdHJpbmcgYW5kIHJldHVybiBpdAotCQkJCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcocHJlX2luZGV4KSk7Ci0JCQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXN0ckJ1Zi5hcHBlbmQoaHRtbC5zdWJzdHJpbmcoCi0JCQkJbGFzdF9wcmVfZW5kX2luZGV4IDwgMCA/IDAgOiBsYXN0X3ByZV9lbmRfaW5kZXgKLQkJCQkJCSsgUFJFX1RBR19FTkRfTEVOR1RIKS5yZXBsYWNlQWxsKCJcclxuIiArIGluZGVudFN0ciwgLy8kTk9OLU5MUy0xJAotCQkJCSJcclxuIikpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhc3RFcnJvclN0cigpIHsKLQkJcmV0dXJuIGxhc3RFcnJvclN0cjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1doaXRlc3BhY2UoU3RyaW5nIGlucHV0KSB7Ci0JCXJldHVybiBwX3doaXRlc3BhY2UubWF0Y2hlcihpbnB1dCkucmVwbGFjZUFsbCgiIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vaHRtbC9IVE1MUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNzI0ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL0hUTUxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy50aWR5LlRpZHk7Ci0KLS8qKgotICogRXh0cmFjdHMgdGhlIHRpdGxlLCBtZXRhIHRhZ3MgYW5kIHRleHQgZnJvbSBhIEhUTUwgZmlsZSBvciBzb3VyY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFBhcnNlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU0NSSVBUX1RBRyA9ICJzY3JpcHQiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfVElUTEVfVEFHID0gInRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTUVUQV9UQUcgPSAibWV0YSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGlkeSB0aWR5OwotCi0JcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQlwcml2YXRlIFN0cmluZyBzdW1tYXJ5OwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgUHJvcGVydGllcyBtZXRhVGFnczsKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGh0bWxUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSFRNTFBhcnNlcigpIHsKLQkJdHJ5IHsKLQkJCXRpZHkgPSBuZXcgVGlkeSgpOwotCQkJdGlkeS5zZXRYSFRNTCh0cnVlKTsKLQkJCXRpZHkuc2V0RHJvcEVtcHR5UGFyYXModHJ1ZSk7Ci0JCQl0aWR5LnNldERyb3BGb250VGFncyh0cnVlKTsKLQkJCXRpZHkuc2V0UXVpZXQodHJ1ZSk7Ci0JCQl0aWR5LnNldFNob3dXYXJuaW5ncyhmYWxzZSk7Ci0JCQl0aWR5LnNldFNtYXJ0SW5kZW50KGZhbHNlKTsKLQkJCXRpZHkuc2V0VGlkeU1hcmsoZmFsc2UpOwotCQkJdGlkeS5zZXRXcmFwbGVuKDEzMik7Ci0JCQl0aWR5LnNldEluZGVudEF0dHJpYnV0ZXMoZmFsc2UpOwotCQkJdGlkeS5zZXRJbmRlbnRDb250ZW50KGZhbHNlKTsKLQkJCXRpZHkuc2V0U3BhY2VzKDIpOwotCQkJdGlkeS5zZXRJbnB1dEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQl0aWR5LnNldE91dHB1dEVuY29kaW5nKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aWR5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gSFRNTCBmaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aWR5ID09IG51bGwgfHwgIWZpbGUuZXhpc3RzKCkgfHwgIWZpbGUuY2FuUmVhZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaXNyKTsKLQotCQlTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoQlVGRkVSX1NJWkUpOwotCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbQlVGRkVSX1NJWkVdOwotCQlpbnQgY2hhcnNSZWFkOwotCQl3aGlsZSAoKGNoYXJzUmVhZCA9IGJyLnJlYWQoYnVmZmVyLCAwLCBCVUZGRVJfU0laRSkpID4gMCkgewotCQkJdGV4dEJ1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBjaGFyc1JlYWQpOwotCQl9Ci0KLQkJcGFyc2UodGV4dEJ1ZmZlci50b1N0cmluZygpKTsKLQotCQlpZiAoYnIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlici5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShTdHJpbmcgaHRtbFNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRpdGxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJc3VtbWFyeSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQltZXRhVGFncyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLQkJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoaHRtbFNvdXJjZSk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJaHRtbFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMjQpOwotCQkJZXh0cmFjdChkb2MuZ2V0Q2hpbGROb2RlcygpKTsKLQkJCXRleHQgPSBodG1sVGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFRNTCBtZXRhIHRhZ3MuCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0TWV0YVRhZ3MoKSB7Ci0JCXJldHVybiBtZXRhVGFnczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdW1tYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9keSB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRE9NIGRvY3VtZW50IGZvciB0aGUgZ2l2ZW4gSFRNTCBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBodG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGh0bWwgPT0gbnVsbCB8fCBodG1sLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaHRtbAotCQkJCS5nZXRCeXRlcygiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQJCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0KLQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7Ci0JCXRpZHkuc2V0RXJyb3V0KHB3KTsKLQotCQlyZXR1cm4gdGlkeS5wYXJzZURPTShpbnB1dCwgb3V0cHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgdGl0bGUsIG1ldGEgdGFncyBhbmQgYm9keSB0ZXh0IGZyb20gdGhlIGdpdmVuIG5vZGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGV4dHJhY3QoTm9kZUxpc3Qgbm9kZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREU6Ci0JCQkJaWYgKCFub2RlTmFtZS5lcXVhbHMoSFRNTF9TQ1JJUFRfVEFHKSkgewotCQkJCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQlOb2RlIGF0dHJOb2RlID0gYXR0cnMuaXRlbShqKTsKLQkJCQkJCVN0cmluZyBhdHRyTm9kZU5hbWUgPSBhdHRyTm9kZS5nZXROb2RlTmFtZSgpOwotCQkJCQkJU3RyaW5nIGF0dHJOb2RlVmFsdWUgPSBhdHRyTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCWlmIChhdHRyTm9kZU5hbWUuZXF1YWxzKEhUTUxfVElUTEVfVEFHKSkgewotCQkJCQkJCXRpdGxlID0gYXR0ck5vZGVWYWx1ZTsKLQkJCQkJCX0gZWxzZSBpZiAoYXR0ck5vZGVOYW1lLmVxdWFscyhIVE1MX01FVEFfVEFHKSkgewotCQkJCQkJCW1ldGFUYWdzLnB1dChhdHRyTm9kZU5hbWUsIGF0dHJOb2RlVmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCAmJiBjaGlsZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJZXh0cmFjdChjaGlsZE5vZGVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCQkJaHRtbFRleHQuYXBwZW5kKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpLmFwcGVuZCgnICcpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9odG1sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MmJiYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL2h0bWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbW9uIEhUTUwgcGFyc2luZyBhbmQgcHJldHR5LWZvcm1hdGluZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWY4OTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIENvbW1vbiBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcmVmZXJlbmNlU3RvcmVXcmFwcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcmVmZXJlbmNlU3RvcmVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZjE4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJlZmVyZW5jZVN0b3JlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlczsKLQotCi0vKioKLSAqIHdyYXBwZXIgaW50ZXJmYWNlIGZvciBwcmVmZXJlbmNlIHN0b3JlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHsKLQotCS8vcHVibGljIE9iamVjdCBnZXRTdG9yZSgpOwotCQotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIGxpc3RlbmVyKTsKLQlwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9sZFZhbHVlLAotCSAgICAgICAgICAgIE9iamVjdCBuZXdWYWx1ZSk7Ci0gICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT5mYWxzZTwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgY3VycmVudCB2YWx1ZSAKLSAgICAgKiBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGJvb2xlYW4uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGJvb2xlYW4tdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPmZhbHNlPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBib29sZWFuLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2xlYW4oU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhIGRvdWJsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgbmFtZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKiB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQtZGVmYXVsdCB2YWx1ZSAoPGNvZGU+MC4wZjwvY29kZT4pIGlmIHRoZXJlCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgZmxvYXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIG5hbWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBpbnRlZ2VyLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIGRlZmF1bHQgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciBpZiB0aGUgZGVmYXVsdCAKLSAgICAgKiB2YWx1ZSBjYW5ub3QgYmUgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZWZhdWx0SW50KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlCi0gICAgICogd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjBMPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBkZWZhdWx0IHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGRlZmF1bHQgCi0gICAgICogdmFsdWUgY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBsb25nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0RGVmYXVsdExvbmcoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICh0aGUgZW1wdHkgc3RyaW5nIDxjb2RlPiIiPC9jb2RlPikgCi0gICAgICogaXMgbm8gZGVmYXVsdCBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBkZWZhdWx0IAotICAgICAqIHZhbHVlIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgc3RyaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBuYW1lZCBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wLjA8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBkb3VibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIGRvdWJsZS12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGZsb2F0LXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjAuMGY8L2NvZGU+KSBpZiB0aGVyZQotICAgICAqIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBmbG9hdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogUmV0dXJucyB0aGUgZGVmYXVsdC1kZWZhdWx0IHZhbHVlICg8Y29kZT4wPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGludGVndGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIHRoZSBpbnQtdmFsdWVkIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKDxjb2RlPjBMPC9jb2RlPikgaWYgdGhlcmUKLSAgICAgKiBpcyBubyBwcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIGlmIHRoZSBjdXJyZW50IHZhbHVlIAotICAgICAqIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGEgbG9uZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHJldHVybiB0aGUgbG9uZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0LWRlZmF1bHQgdmFsdWUgKHRoZSBlbXB0eSBzdHJpbmcgPGNvZGU+IiI8L2NvZGU+KQotICAgICAqIGlmIHRoZXJlIGlzIG5vIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgaWYgdGhlIGN1cnJlbnQgdmFsdWUgCi0gICAgICogY2Fubm90IGJlIHRyZWF0ZWQgYXMgYSBzdHJpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEByZXR1cm4gdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0gICAgICogaGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGhhcyBhIGtub3duIGRlZmF1bHQgdmFsdWUKLSAgICAgKiBhbmQgaXRzIGN1cnJlbnQgdmFsdWUgaXMgdGhlIHNhbWUsIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0gICAgICogKGluY2x1ZGluZyB0aGUgY2FzZSB3aGVyZSB0aGUgcHJlZmVyZW5jZSBpcyB1bmtub3duIHRvIHRoaXMgc3RvcmUpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KFN0cmluZyBuYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZXMgaW4gdGhpcyBwcm9wZXJ0eSBzdG9yZQotICAgICAqIHJlcXVpcmUgc2F2aW5nLgotICAgICAqCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhdCBsZWFzdCBvbmUgb2YgdmFsdWVzIG9mIAotICAgICAqICB0aGUgcHJlZmVyZW5jZXMga25vd24gdG8gdGhpcyBzdG9yZSBoYXMgY2hhbmdlZCBhbmQgCi0gICAgICogIHJlcXVpcmVzIHNhdmluZywgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbmVlZHNTYXZpbmcoKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSB0bwotICAgICAqIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWUgd2l0aG91dCBzZW5kaW5nIGEgcHJvcGVydHkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgYW5kIAotICAgICAqIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHNldHRpbmcgaW50ZXJuYWwgcHJlZmVyZW5jZXMgCi0gICAgICogdGhhdCBhcmUgbm90IG1lYW50IHRvIGJlIHByb2Nlc3NlZCBieSBsaXN0ZW5lcnMuCi0gICAgICogTm9ybWFsIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgY2FsbCAjc2V0VmFsdWUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHV0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZG91YmxlLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmxvYXQtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGludGVnZXItdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLiAKLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgaWYKLSAgICAgKiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQgdmFsdWUgd2FzIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaW4gd2hpY2gKLSAgICAgKiBjYXNlIGl0IGNoYW5nZXMgdG8gdGhlIG5ldyBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgcHJlZmVyZW5jZSdzIGN1cnJlbnQKLSAgICAgKiBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGl0cyBjdXJyZW50IHZhbHVlIGlzCi0gICAgICogdW5hZmZlY3RlZC4gTm8gcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBhcmUgcmVwb3J0ZWQgYnkgY2hhbmdpbmcgZGVmYXVsdAotICAgICAqIHZhbHVlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBsb25nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN0cmluZy12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuIAotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSBpcyBhZmZlY3RlZCBpZgotICAgICAqIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudCB2YWx1ZSB3YXMgaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpbiB3aGljaAotICAgICAqIGNhc2UgaXQgY2hhbmdlcyB0byB0aGUgbmV3IGRlZmF1bHQgdmFsdWUuIElmIHRoZSBwcmVmZXJlbmNlJ3MgY3VycmVudAotICAgICAqIGlzIGRpZmZlcmVudCBmcm9tIGl0cyBvbGQgZGVmYXVsdCB2YWx1ZSwgaXRzIGN1cnJlbnQgdmFsdWUgaXMKLSAgICAgKiB1bmFmZmVjdGVkLiBObyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGFyZSByZXBvcnRlZCBieSBjaGFuZ2luZyBkZWZhdWx0Ci0gICAgICogdmFsdWVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIGRlZmF1bHRPYmplY3QgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0T2JqZWN0KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBib29sZWFuLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4gCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIGlzIGFmZmVjdGVkIGlmCi0gICAgICogdGhlIHByZWZlcmVuY2UncyBjdXJyZW50IHZhbHVlIHdhcyBpdHMgb2xkIGRlZmF1bHQgdmFsdWUsIGluIHdoaWNoCi0gICAgICogY2FzZSBpdCBjaGFuZ2VzIHRvIHRoZSBuZXcgZGVmYXVsdCB2YWx1ZS4gSWYgdGhlIHByZWZlcmVuY2UncyBjdXJyZW50Ci0gICAgICogaXMgZGlmZmVyZW50IGZyb20gaXRzIG9sZCBkZWZhdWx0IHZhbHVlLCBpdHMgY3VycmVudCB2YWx1ZSBpcwotICAgICAqIHVuYWZmZWN0ZWQuIE5vIHByb3BlcnR5IGNoYW5nZSBldmVudHMgYXJlIHJlcG9ydGVkIGJ5IGNoYW5naW5nIGRlZmF1bHQKLSAgICAgKiB2YWx1ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGJhY2sKLSAgICAgKiB0byBpdHMgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byB0aGUKLSAgICAgKiBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiBUaGlzIGlzIGltcGxlbWVudGVkIGJ5IHJlbW92aW5nIHRoZSBuYW1lZCB2YWx1ZSBmcm9tIHRoZSBzdG9yZSwgCi0gICAgICogdGhlcmVieSBleHBvc2luZyB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvRGVmYXVsdChTdHJpbmcgbmFtZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkb3VibGUtdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGRvdWJsZSB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdC12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgaW50ZWdlci12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgaW50IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvbmctdmFsdWVkIHByZWZlcmVuY2Ugd2l0aCB0aGUKLSAgICAgKiBnaXZlbiBuYW1lLgotICAgICAqIDxwPgotICAgICAqIEEgcHJvcGVydHkgY2hhbmdlIGV2ZW50IGlzIHJlcG9ydGVkIGlmIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSAKLSAgICAgKiBwcmVmZXJlbmNlIGFjdHVhbGx5IGNoYW5nZXMgZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUuIEluIHRoZSBldmVudAotICAgICAqIG9iamVjdCwgdGhlIHByb3BlcnR5IG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UsIGFuZCB0aGUKLSAgICAgKiBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHdyYXBwZWQgYXMgb2JqZWN0cy4KLSAgICAgKiA8L3A+Ci0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBwcmVmZXJyZWQgd2F5IG9mIHJlLWluaXRpYWxpemluZyBhIHByZWZlcmVuY2UgdG8gaXRzCi0gICAgICogZGVmYXVsdCB2YWx1ZSBpcyB0byBjYWxsIDxjb2RlPnNldFRvRGVmYXVsdDwvY29kZT4uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgc3RyaW5nLXZhbHVlZCBwcmVmZXJlbmNlIHdpdGggdGhlCi0gICAgICogZ2l2ZW4gbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHByb3BlcnR5IGNoYW5nZSBldmVudCBpcyByZXBvcnRlZCBpZiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgCi0gICAgICogcHJlZmVyZW5jZSBhY3R1YWxseSBjaGFuZ2VzIGZyb20gaXRzIHByZXZpb3VzIHZhbHVlLiBJbiB0aGUgZXZlbnQKLSAgICAgKiBvYmplY3QsIHRoZSBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlLCBhbmQgdGhlCi0gICAgICogb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIE5vdGUgdGhhdCB0aGUgcHJlZmVycmVkIHdheSBvZiByZS1pbml0aWFsaXppbmcgYSBwcmVmZXJlbmNlIHRvIGl0cwotICAgICAqIGRlZmF1bHQgdmFsdWUgaXMgdG8gY2FsbCA8Y29kZT5zZXRUb0RlZmF1bHQ8L2NvZGU+LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwcmVmZXJlbmNlCi0gICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYm9vbGVhbi12YWx1ZWQgcHJlZmVyZW5jZSB3aXRoIHRoZQotICAgICAqIGdpdmVuIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogQSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgaXMgcmVwb3J0ZWQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIAotICAgICAqIHByZWZlcmVuY2UgYWN0dWFsbHkgY2hhbmdlcyBmcm9tIGl0cyBwcmV2aW91cyB2YWx1ZS4gSW4gdGhlIGV2ZW50Ci0gICAgICogb2JqZWN0LCB0aGUgcHJvcGVydHkgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZSwgYW5kIHRoZQotICAgICAqIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgd3JhcHBlZCBhcyBvYmplY3RzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3RlIHRoYXQgdGhlIHByZWZlcnJlZCB3YXkgb2YgcmUtaW5pdGlhbGl6aW5nIGEgcHJlZmVyZW5jZSB0byBpdHMKLSAgICAgKiBkZWZhdWx0IHZhbHVlIGlzIHRvIGNhbGwgPGNvZGU+c2V0VG9EZWZhdWx0PC9jb2RlPi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJlZmVyZW5jZQotICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2MjRmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIHdyYXBwZXIgaW50ZXJmYWNlIGZvciBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIHsKLQotCSAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXcgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotICAgICAqICBvciBub3QgcmVsZXZhbnQgKGZvciBpbnN0YW5jZSBpZiB0aGUgcHJvcGVydHkgd2FzIHJlbW92ZWQpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBvbGQgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bgotICAgICAqICBvciBub3QgcmVsZXZhbnQgKGZvciBpbnN0YW5jZSBpZiB0aGUgcHJvcGVydHkgd2FzIGp1c3QKLSAgICAgKiAgYWRkZWQgYW5kIHRoZXJlIHdhcyBubyBvbGQgdmFsdWUpLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0T2xkVmFsdWUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXYXJuaW5nOiB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgcHJvcGVydHkgbmFtZSByZXR1cm5lZAotICAgICAqIGlzIGEgY29uc3RhbnQgc3RyaW5nLiAgQ2FsbGVycyBtdXN0IGNvbXBhcmUgcHJvcGVydHkgbmFtZXMgdXNpbmcKLSAgICAgKiBlcXVhbHMsIG5vdCA9PS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9wcmVmZXJlbmNlcy9JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3YmY2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3ByZWZlcmVuY2VzL0lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIHdyYXBwZXIgaW50ZXJmYWNlIGZvciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIHsKLQotCSBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9EZWJ1Z1RyYWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0RlYnVnVHJhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI2ZmY0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0RlYnVnVHJhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5OwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXR5IGZvciBwcmludGluZyBkZWJ1ZyB0cmFjZXMgdG8gdGhlIGNvbnNvbGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVidWdUcmFjZSB7Ci0KLQkvKioKLQkgKiBQcmludHMgYSBkZWJ1ZyB0cmFjZSB0byB0aGUgY29uc29sZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5zdGFuY2UKLQkgKiAgICAgICAgICAgIGEgY2xhc3MgaW5zdGFuY2UKLQkgKiBAcGFyYW0gbWV0aG9kCi0JICogICAgICAgICAgICBhIG1ldGhvZCBuYW1lCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgYSBkZWJ1ZyBtZXNzYWdlCi0JICogQHBhcmFtIHRoCi0JICogICAgICAgICAgICBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZywKLQkJCVRocm93YWJsZSB0aCkgewotCQlTdHJpbmdCdWZmZXIgZGVidWdNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlkZWJ1Z01zZy5hcHBlbmQoaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJaWYgKG1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJZGVidWdNc2cuYXBwZW5kKCcuJykuYXBwZW5kKG1ldGhvZCk7Ci0JCQl9Ci0JCQlkZWJ1Z01zZy5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkgewotCQkJZGVidWdNc2cuYXBwZW5kKG1zZyk7IAotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihkZWJ1Z01zZyk7Ci0JCWlmICh0aCAhPSBudWxsKSB7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqICAgICAgICAgICAgYSBjbGFzcyBpbnN0YW5jZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+VGhyb3dhYmxlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kLCBUaHJvd2FibGUgdGgpIHsKLQkJcHJpbnQoaW5zdGFuY2UsIG1ldGhvZCwgbnVsbCwgdGgpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBhIGRlYnVnIHRyYWNlIHRvIHRoZSBjb25zb2xlLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0YW5jZQotCSAqICAgICAgICAgICAgYSBjbGFzcyBpbnN0YW5jZQotCSAqIEBwYXJhbSBtZXRob2QKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIG5hbWUKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBhIGRlYnVnIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnKSB7Ci0JCXByaW50KGluc3RhbmNlLCBtZXRob2QsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIGluc3RhbmNlCi0JICogICAgICAgICAgICBhIGNsYXNzIGluc3RhbmNlCi0JICogQHBhcmFtIG1ldGhvZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBtZXRob2QpIHsKLQkJcHJpbnQoaW5zdGFuY2UsIG1ldGhvZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgdHJhY2UgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIHRoCi0JICogICAgICAgICAgICBhIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KFRocm93YWJsZSB0aCkgewotCQlpZiAodGggIT0gbnVsbCkgewotCQkJdGgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3NlcnZpY2VhYmlsaXR5L0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAzN2M1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBHZW5lcmljIGxvZ2dlciB1c2VkIGZvciBsb2dnaW5nIHN0YXR1cyBtZXNzYWdlcywgd2FybmluZyBtZXNzYWdlcywgZXJyb3IKLSAqIG1lc3NhZ2VzLCBhbmQgZXhjZXB0aW9uIHN0YWNrIHRyYWNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCi0JLy8gVGhlIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBQbHVnaW4gcGx1Z2luOwotCi0JLy8gVGhlIHBsdWctaW4gSUQuCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgPGNvZGU+TG9nZ2VyPC9jb2RlPiBnaXZlbiB0aGUgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBUaGUgcGx1Z2luIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMb2dnZXIoUGx1Z2luIHBsdWdpbikgewotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsgLy9wbHVnaW4uZ2V0SWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2cpIHsKLQkJbG9nTXNnKElTdGF0dXMuRVJST1IsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgZXgpIHsKLQkJbG9nTXNnKElTdGF0dXMuRVJST1IsIG51bGwsIGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UuCi0JICogQHBhcmFtIGV4Ci0JICogICAgICAgICAgICBUaGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgewotCQlsb2dNc2coSVN0YXR1cy5FUlJPUiwgbXNnLCBleCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnKSB7Ci0JCWxvZ01zZyhJU3RhdHVzLldBUk5JTkcsIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGFuZCBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgVGhlIHdhcm5pbmcgbWVzc2FnZS4KLQkgKiBAcGFyYW0gZXgKLQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKLQkJbG9nTXNnKElTdGF0dXMuV0FSTklORywgbXNnLCBleCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gc3RhdHVzIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICBUaGUgc3RhdHVzIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbXNnKSB7Ci0JCWxvZ01zZyhJU3RhdHVzLklORk8sIG1zZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5LgotCSAqIEBwYXJhbSBtc2cKLQkgKiAgICAgICAgICAgIFRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBleAotCSAqICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbG9nTXNnKGludCBzZXZlcml0eSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7Ci0JCWlmIChtc2cgPT0gbnVsbCAmJiBleCAhPSBudWxsKSB7Ci0JCQltc2cgPSBleC5nZXRNZXNzYWdlKCk7IAotCQl9Ci0KLQkJaWYgKG1zZyA9PSBudWxsKSB7Ci0JCQltc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklkLCBJU3RhdHVzLk9LLCBtc2csIGV4KTsKLQotCQkvLyBDYWxsIHRoZSBFY2xpcHNlIExvZ2dlci4KLQkJcGx1Z2luLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vc2VydmljZWFiaWxpdHkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzM0N2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi9zZXJ2aWNlYWJpbGl0eS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gZXJyb3IgaGFuZGxpbmcsIGxvZ2dpbmcgYW5kIHZlcnNpb25pbmcgc2VydmljZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9FeHRlbnNpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRXh0ZW5zaW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NWIxNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9FeHRlbnNpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotKiBIZWxwZXIgY2xhc3Mgd2l0aCBtZXRob2RzIHRvIHJldHJpZXZlIGV4dGVuc2lvbnMKLSogTW92ZWQgcGFydCBvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlciwgdG8gYWxsb3cKLSogYWNjZXNzIGJ5IGNsYXNzZXMgdGhhdCBoYXZlIG5vIGRlcGVuZGVuY3kgb24gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdAotKiAKLSogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgCi0qIEBhdXRob3IgV2VpcGluZyBMdQotKiBAc2luY2UgIDEuNQotKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25IZWxwZXIgewotCXByaXZhdGUgc3RhdGljIE1hcCBJRFRvRXh0ZW5zaW9uTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSkgewotCQkvLyBQcm9jZXNzIHRoZSBjb250cmlidXRvcnMuCi0JCS8vCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJT2JqZWN0IGV4dCA9IG51bGw7Ci0JCQlleHRfd2FsazoKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZihjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCWV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCWJyZWFrIGV4dF93YWxrOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBleHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCVN0cmluZyBJRCA9IG5hbWVzcGFjZSArICcuJyArIGV4dGVuc2lvblBvaW50TmFtZTsKLQkJT2JqZWN0IGV4dCA9IElEVG9FeHRlbnNpb25NYXAuZ2V0KElEKTsKLQkJaWYoZXh0ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoSURUb0V4dGVuc2lvbk1hcCkgewotCQkJCWV4dCA9IElEVG9FeHRlbnNpb25NYXAuZ2V0KElEKTsKLQkJCQlpZihleHQgPT0gbnVsbCkgewotCQkJCQlleHQgPSBjcmVhdGVFeHRlbnNpb24obmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQkJCQlpZihleHQgIT0gbnVsbCkgewotCQkJCQkJSURUb0V4dGVuc2lvbk1hcC5wdXQoSUQsIGV4dCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGV4dDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciBnZXRNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlcigpIHsKLQkJSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyIHJldCA9IChJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIpIGdldEV4dGVuc2lvbigKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJtYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlciIpOy8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIG9iamVjdCBiYXNlZCBvbiB0eXBlIGFuZCBjb250ZXh0IHRocm91Z2ggZXh0ZW5zaW9uCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqIEByZXR1cm4gY3JlYXRlZCBvYmplY3Qgb3IgbnVsbCBpZiBubyBleHRlbnNpb24gaXMgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGUoQ2xhc3MgdHlwZSwgT2JqZWN0IGNvbnRleHQpIHsKLQkJSU9iamVjdEZhY3RvcnkgcmV0ID0gKElPYmplY3RGYWN0b3J5KSBnZXRFeHRlbnNpb24oCi0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAib2JqZWN0RmFjdG9yeSIpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmV0LmNyZWF0ZSh0eXBlLCBjb250ZXh0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRmlsZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmNzRiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLk1hcHBlZEJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2s7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuT3ZlcmxhcHBpbmdGaWxlTG9ja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGluZ0Vycm9yQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIG1hbmFnaW5nIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwgewotCi0JLyoqCi0JICogUGxhdGZvcm0tc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGZpbGUgc2VwYXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfU0VQID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQbGF0Zm9ybS1zcGVjaWZpYyBsaW5lIHNlcGFyYXRvciBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElORV9TRVBfTEVOR1RIID0gTElORV9TRVAubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBVTkMgcGF0aCBwcmVmaXguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DX1BBVEhfUFJFRklYID0gIlxcXFwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBVTkMgcGF0aCBwcmVmaXggbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQ19QQVRIX1BSRUZJWF9MRU5HVEggPSBVTkNfUEFUSF9QUkVGSVgubGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBJU08tODg1OS0xIGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX0lTT184ODU5XzEgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVURi04IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1VURl84ID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBGaWxlVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGZpbGUgb3IgZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldEFic29sdXRlUGF0aChuZXcgRmlsZShwYXRoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgYSBVUkwuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgYSBVUkwKLQkgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoVVJMIHVybCkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSB1cmwuZ2V0RmlsZSgpLnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIHJlc3VsdCA9IE5ldFV0aWwuZGVjb2RlVXJsKHBhdGhOYW1lLCBudWxsKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFyZW50RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSBhbmQgZXh0ZW5zaW9uIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBpbmNsdWRpbmcgdGhlIGZpbGUgZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKHBhdGgsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgbmFtZSBmcm9tIGEgcGF0aCwgd2l0aCBvciB3aXRob3V0IHRoZSBmaWxlIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gd2l0aEV4dGVuc2lvbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGluY2x1ZGUgdGhlIGZpbGUgZXh0ZW5zaW9uIGluIHRoZQotCSAqICAgICAgICAgICAgcmVzdWx0Ci0JICogQHJldHVybiB0aGUgZmlsZSBuYW1lIHdpdGggb3Igd2l0aG91dCB0aGUgZmlsZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgcGF0aCwgYm9vbGVhbiB3aXRoRXh0ZW5zaW9uKSB7Ci0JCVN0cmluZyBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwotCi0JCWludCBwcmVmaXhMZW5ndGggPSAwOwotCQlpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChOZXRVdGlsLkZJTEVfVVJJX1BSRUZJWCkpIHsKLQkJCXByZWZpeExlbmd0aCA9IE5ldFV0aWwuRklMRV9VUklfUFJFRklYX0xFTkdUSDsKLQkJfSBlbHNlIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKE5ldFV0aWwuSFRUUF9VUklfUFJFRklYKSkgewotCQkJcHJlZml4TGVuZ3RoID0gTmV0VXRpbC5IVFRQX1VSSV9QUkVGSVhfTEVOR1RIOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lOwotCQlpbnQgaW5kZXggPSBub3JtYWxpemVkUGF0aC5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA8IHByZWZpeExlbmd0aCkgewotCQkJZmlsZU5hbWUgPSBub3JtYWxpemVkUGF0aC5zdWJzdHJpbmcocHJlZml4TGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVOYW1lID0gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJfQotCi0JCWlmICh3aXRoRXh0ZW5zaW9uKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQotCQlpbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gKGluZGV4ID4gMCkgPyBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpIDogZmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVsYXRpdmUgcGF0aCBvZiBhIHBhdGggZnJvbSBhIGJhc2UgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgYmFzZSBwYXRoCi0JICogQHJldHVybiBhIHJlbGF0aXZlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGhUb0Jhc2UoRmlsZSBwYXRoLCBGaWxlIGJhc2VQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGlyID0gcGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlTdHJpbmcgYmFzZURpciA9IGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gMCkgewotCQkJCVN0cmluZyBkZWx0YSA9IGRpci5zdWJzdHJpbmcoYmFzZURpci5sZW5ndGgoKSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWlmIChkZWx0YS5jaGFyQXQoaSkgPT0gJy8nKSB7Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoRmlsZSBwYXRoLCBGaWxlIGJhc2VQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGlyID0gcGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlTdHJpbmcgYmFzZURpciA9IGFwcGVuZFNlcGFyYXRvcihiYXNlUGF0aC50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCksCi0JCQkJCSIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl3aGlsZSAoZGlyLmluZGV4T2YoYmFzZURpcikgPT0gLTEpIHsKLQkJCQliYXNlUGF0aCA9IGJhc2VQYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJCQliYXNlRGlyID0gYXBwZW5kU2VwYXJhdG9yKGJhc2VQYXRoLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSwKLQkJCQkJCSIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKCIuLi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGRpci5pbmRleE9mKGJhc2VEaXIpID09IDApIHsKLQkJCQlTdHJpbmcgZGVsdGEgPSBkaXIuc3Vic3RyaW5nKGJhc2VEaXIubGVuZ3RoKCkpOwotCQkJCXJlc3VsdC5hcHBlbmQoZGVsdGEpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmRzIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvciB0byB0aGUgZW5kIG9mIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgYXBwZW5kZWQgd2l0aCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGFwcGVuZFNlcGFyYXRvcihwYXRoLCBGaWxlLnNlcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kcyB0aGUgZ2l2ZW4gcGF0aCBzZXBhcmF0b3IgdG8gdGhlIGVuZCBvZiBhIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gc2VwYXJhdG9yCi0JICogICAgICAgICAgICBhIHBhdGggc2VwYXJhdG9yCi0JICogQHJldHVybiB0aGUgcGF0aCBuYW1lIGFwcGVuZGVkIHdpdGggdGhlIGdpdmVuIHNlcGFyYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFNlcGFyYXRvcihTdHJpbmcgcGF0aCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aChzZXBhcmF0b3IpID8gcGF0aCA6IHBhdGggKyBzZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZW5kaW5nIHBhdGggc2VwYXJhdG9yIGZyb20gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEByZXR1cm4gdGhlIHBhdGggbmFtZSBtaW51cyB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTZXBhcmF0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gcGF0aC5zdWJzdHJpbmcoMCwKLQkJCQlwYXRoLmxlbmd0aCgpIC0gMSkgOiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGVuZGluZyBwYXRoIHNlcGFyYXRvciBmcm9tIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIG5hbWUgbWludXMgdGhlIHBhdGggc2VwYXJhdG9yICJcXCIgb3IgIi8iCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsU2VwYXJhdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBwYXRoLmVuZHNXaXRoKCIvIikgfHwgcGF0aC5lbmRzV2l0aCgiXFwiKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKSA6IHBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGVuZGluZyBwYXRoIHNlcGFyYXRvciBmcm9tIGEgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gc2VwYXJhdG9yCi0JICogICAgICAgICAgICBhIHBhdGggc2VwYXJhdG9yCi0JICogQHJldHVybiB0aGUgcGF0aCBuYW1lIG1pbnVzIHRoZSBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTZXBhcmF0b3IoU3RyaW5nIHBhdGgsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoc2VwYXJhdG9yKSA/IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKQotCQkJCTogcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZmlsZSBuYW1lIHdpdGggYW5vdGhlciBpbiBhIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCBuYW1lCi0JICogQHBhcmFtIG9sZEZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgb2xkIGZpbGUgbmFtZQotCSAqIEBwYXJhbSBuZXdGaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIG5ldyBmaWxlIG5hbWUKLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGF0aCBuYW1lIHdpdGggdGhlIG5ldyBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlRmlsZU5hbWUoU3RyaW5nIHBhdGgsIFN0cmluZyBvbGRGaWxlTmFtZSwKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKG9sZEZpbGVOYW1lKTsKLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KSArIG5ld0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBmaWxlIGV4dGVuc2lvbiB3aXRoIGFub3RoZXIgaW4gYSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHBhdGggbmFtZQotCSAqIEBwYXJhbSBvbGRGaWxlRXh0Ci0JICogICAgICAgICAgICByaGUgb2xkIGZpbGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIG5ld0ZpbGVFeHQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIHRoZSBuZXcgcGF0aCB3aXRoIHRoZSBuZXcgZmlsZSBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlRXh0ZW5zaW9uKFN0cmluZyBwYXRoLCBTdHJpbmcgb2xkRXh0LAotCQkJU3RyaW5nIG5ld0V4dCkgewotCQlpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKG9sZEV4dCk7Ci0JCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdFeHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIHBhdGggb2YgYSBiYXNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgYmFzZSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gbG9jYWxlU3RyCi0JICogICAgICAgICAgICBhIGxvY2FsZSBzdHJpbmcKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsZVBhdGgoU3RyaW5nIHBhdGgsIFN0cmluZyBsb2NhbGVTdHIpIHsKLQkJaWYgKFN0clV0aWwuaXNCbGFuayhsb2NhbGVTdHIpKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZShwYXRoKTsKLQkJcmV0dXJuIHJlcGxhY2VGaWxlTmFtZShwYXRoLCBmaWxlTmFtZSwgbG9jYWxlU3RyICsgIi8iICsgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxlLXNwZWNpZmljIHBhdGggb2YgYSBiYXNlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgYmFzZSBwYXRoIG5hbWUKLQkgKiBAcGFyYW0gbG9jYWxlCi0JICogICAgICAgICAgICBhIGxvY2FsZSBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUtc3BlY2lmaWMgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsZVBhdGgoU3RyaW5nIHBhdGgsIExvY2FsZSBsb2NhbGUpIHsKLQkJcmV0dXJuIGxvY2FsZSA9PSBudWxsID8gcGF0aCA6IGdldExvY2FsZVBhdGgocGF0aCwgbG9jYWxlLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZ2l2ZW4gdGV4dCB0byBhIHRleHQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHdyaXRlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gdGV4dCBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSB0bwotCSAqICAgICAgICAgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3cml0ZUZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dCkgewotCQlGaWxlV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIgPSBuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSk7Ci0JCQl3cml0ZXIud3JpdGUodGV4dCk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byBhIGZpbGUgd2l0aCBVVEYtOCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRvIHdyaXRlCi0JICogQHBhcmFtIGFwcGVuZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGFwcGVuZCB0aGUgdGV4dCB0byB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgICAgZmlsZSwgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCBvdmVycmlkZSB0aGUgZmlsZQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHRleHQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsbHkgdG8KLQkgKiAgICAgICAgIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gd3JpdGVVVEY4RmlsZShTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB3cml0ZVVURjhGaWxlKGZpbGVuYW1lLCB0ZXh0LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgdGhlIGdpdmVuIHRleHQgdG8gYSBmaWxlIHdpdGggVVRGLTggZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IGZpbGUgbmFtZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byB3cml0ZQotCSAqIEBwYXJhbSBhcHBlbmQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBhcHBlbmQgdGhlIHRleHQgdG8gdGhlIGVuZCBvZiB0aGUKLQkgKiAgICAgICAgICAgIGZpbGUsIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3ZlcnJpZGUgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB0ZXh0IGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IHRvCi0JICogICAgICAgICBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlVVRGOEZpbGUoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dCwKLQkJCWJvb2xlYW4gYXBwZW5kKSB7Ci0JCU91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBudWxsOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZpbGVPdXQgPSBudWxsOwotCQl0cnkgewotCQkJZmlsZU91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lLCBhcHBlbmQpOwotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmaWxlT3V0LCBFTkNPRElOR19VVEZfOCk7Ci0JCQl3cml0ZXIud3JpdGUodGV4dCk7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJCWZpbGVPdXQuZmx1c2goKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCWlmIChmaWxlT3V0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmaWxlT3V0LmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gVVJJIHRvIGFuIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBVUkkKLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHVyaSwgT3V0cHV0U3RyZWFtIG91dHB1dCkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBOZXRVdGlsLmdldElucHV0U3RyZWFtKHVyaSk7Ci0JCQlpbnQgYnl0ZXNSZWFkOwotCQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOwotCQkJd2hpbGUgKChieXRlc1JlYWQgPSBpbnB1dC5yZWFkKGJ1ZiwgMCwgNDA5NikpID4gMCkgewotCQkJCW91dHB1dC53cml0ZShidWYsIDAsIGJ5dGVzUmVhZCk7Ci0JCQl9Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkkgdG8gYSA8Y29kZT5QcmludFdyaXRlcjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBVUkkKLQkgKiBAcGFyYW0gd3JpdGVyCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+UHJpbnRXcml0ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHVyaSwgUHJpbnRXcml0ZXIgcHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW1SZWFkZXIgaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoTmV0VXRpbC5nZXRJbnB1dFN0cmVhbSh1cmkpKTsKLQkJCWludCBjaGFyc1JlYWQ7Ci0JCQljaGFyW10gYnVmID0gbmV3IGNoYXJbNDA5Nl07Ci0JCQl3aGlsZSAoKGNoYXJzUmVhZCA9IGlucHV0LnJlYWQoYnVmLCAwLCA0MDk2KSkgPiAwKSB7Ci0JCQkJcHcud3JpdGUoYnVmLCAwLCBjaGFyc1JlYWQpOwotCQkJfQotCQkJcHcuZmx1c2goKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBleGNlcHQKLQkgKiBmb3IgdGhlIGRpcmVjdG9yeSBpdHNlbGYuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzdWItZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGVsZXRlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUFsbEZpbGVzKFN0cmluZyBkaXIpIHsKLQkJYm9vbGVhbiByZXQgPSB0cnVlOwotCQlGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKGRpcik7Ci0JCUZpbGVbXSBmaWxlcyA9IHRhcmdldERpci5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXQgPSByZXQgJiYgZGVsZXRlQWxsRmlsZXMoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCX0KLQkJCQlyZXQgPSByZXQgJiYgZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGRlbGV0ZSBhbGwgc3ViLWRpcmVjdG9yaWVzIGFuZCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBleGNlcHQKLQkgKiBmb3IgdGhlIGRpcmVjdG9yeSBpdHNlbGYgYW5kIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHN1Yi1kaXJlY3RvcmllcyBhbmQgZmlsZXMKLQkgKiBAcGFyYW0gZmlsZXNOb3RUb0RlbGV0ZQotCSAqICAgICAgICAgICAgYSBsaXN0IG9mIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBub3QgYmUgZGVsZXRlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGVsZXRlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlbGV0ZUFsbEZpbGVzKFN0cmluZyBkaXIsIExpc3Q8RmlsZT4gZmlsZXNOb3RUb0RlbGV0ZSkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCUZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUoZGlyKTsKLQkJRmlsZVtdIGZpbGVzID0gdGFyZ2V0RGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghZmlsZXNOb3RUb0RlbGV0ZS5jb250YWlucyhmaWxlc1tpXSkpIHsKLQkJCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCXJldCA9IHJldAotCQkJCQkJCQkmJiBkZWxldGVBbGxGaWxlcyhmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCQkJCQlmaWxlc05vdFRvRGVsZXRlKTsKLQkJCQkJfQotCQkJCQlyZXQgPSByZXQgJiYgZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSB0YXJnZXQgZmlsZS4gV2lsbCBvdmVyd3JpdGUKLQkgKiBhbiBleGlzdGluZyBmaWxlIGlmIGl0IGhhcyB3cml0ZSBwZXJtaXNzaW9uCi0JICogCi0JICogQHBhcmFtIHNyY0ZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZSBvciBwYXRoCi0JICogQHBhcmFtIHRndEZpbGUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBvciBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHlGaWxlKEZpbGUgc3JjRmlsZSwgRmlsZSB0Z3RGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gY29weWZpbGUoc3JjRmlsZSwgdGd0RmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIHRhcmdldCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBzcmNGaWxlTmFtZQotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSBmaWxlIG5hbWUKLQkgKiBAcGFyYW0gdGd0RmlsZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZmlsZSBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHlGaWxlKFN0cmluZyBzcmNGaWxlTmFtZSwgU3RyaW5nIHRndEZpbGVOYW1lKSB7Ci0JCXJldHVybiBjb3B5RmlsZShuZXcgRmlsZShzcmNGaWxlTmFtZSksIG5ldyBGaWxlKHRndEZpbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIG9uZSBmaWxlIHRvIGFub3RoZXIuCi0JICogPHA+Ci0JICogSWYgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBkaXJlY3RvcmllcywgZGVsZWdhdGVzIHRvCi0JICogY29weWRpcmVjdG9yeSgpLgotCSAqIDxwPgotCSAqIHNvdXJjZSBtdXN0IGV4aXN0IGFuZCBiZSByZWFkYWJsZQotCSAqIDxwPgotCSAqIGNhbm5vdCBjb3B5IGEgZGlyZWN0b3J5IHRvIGEgZmlsZQotCSAqIDxwPgotCSAqIHdpbGwgbm90IGNvcHkgaWYgdGltZXN0YW1wcyBhbmQgZmlsZXNpemUgbWF0Y2gsIHdpbGwgb3ZlcndyaXRlIG90aGVyd2lzZQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZQotCSAqIEBwYXJhbSBkZXN0Ci0JICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBjb3B5IG9wZXJhdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29weWZpbGUoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZS5lcXVhbHMoZGVzdCkpCi0JCQkvLyBkbyBub3QgY29weSBlcXVhbCBmaWxlcwotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghc291cmNlLmV4aXN0cygpIHx8ICFzb3VyY2UuY2FuUmVhZCgpKSB7Ci0JCQkvLyBzb3VyY2UgZG9lcyBub3QgZXhpc3Qgb3IgY2FuJ3QgcmVhZAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGRlc3QuZXhpc3RzKCkgJiYgIWRlc3QuY2FuV3JpdGUoKSkgewotCQkJLy8gZGVzdCBleGlzdHMgYW5kIGNhbm5vdCBiZSB3cml0dGVuCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmIChkZXN0LmlzRmlsZSgpKSB7Ci0JCQkJLy8gY2FuJ3QgY29weSBhIGRpcmVjdG9yeSB0byBhIGZpbGUKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRlbGVnYXRlIHRvIGNvcHlkaXJlY3RvcnkKLQkJCQlyZXR1cm4gY29weWRpcmVjdG9yeShzb3VyY2UsIGRlc3QpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gc291cmNlIGlzIGEgZmlsZQotCQkJaWYgKGRlc3QuaXNEaXJlY3RvcnkoKSkgewotCQkJCVN0cmluZyBzb3VyY2VGaWxlTmFtZSA9IHNvdXJjZS5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIGNvcHlmaWxlKHNvdXJjZSwgbmV3IEZpbGUoZGVzdCwgc291cmNlRmlsZU5hbWUpKTsKLQkJCX0KLQkJCS8vIGJvdGggc291cmNlIGFuZCBkZXN0IGFyZSBmaWxlcwotCQkJYm9vbGVhbiBuZWVkQ29weSA9IHRydWU7Ci0JCQlpZiAoZGVzdC5leGlzdHMoKSkgewotCQkJCW5lZWRDb3B5ID0gKGRlc3QubGFzdE1vZGlmaWVkKCkgIT0gc291cmNlLmxhc3RNb2RpZmllZCgpKQotCQkJCQkJfHwgKGRlc3QubGVuZ3RoKCkgIT0gc291cmNlLmxlbmd0aCgpKTsKLQkJCX0KLQotCQkJaWYgKG5lZWRDb3B5KSB7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0KLQkJCQl0cnkgewotCQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlKTsKLQkJCQkJRmlsZUNoYW5uZWwgaW4gPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQkJCWlmICghZGVzdC5leGlzdHMoKSkgewotCQkJCQkJZGVzdC5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0JCQkJCUZpbGVDaGFubmVsIG91dCA9IG91dHB1dC5nZXRDaGFubmVsKCk7Ci0JCQkJCW91dC50cmFuc2ZlckZyb20oaW4sIDAsIHNvdXJjZS5sZW5ndGgoKSk7Ci0JCQkJCWRlc3Quc2V0TGFzdE1vZGlmaWVkKHNvdXJjZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBkaWQgbm90IGNvcHkKLQkJCQkvLyByZXR1cm4gdHJ1ZSBiZWNhdXNlIGRlc3QgZmlsZSBpcyBzYW1lIGFzIHNvdXJjZQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIGEgZGlyZWN0b3J5IHRvIGFub3RoZXIgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBzcmNEaXJOYW1lCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGRpcmVjdG9yeSBuYW1lCi0JICogQHBhcmFtIHRndERpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weURpcihGaWxlIHNyY0RpciwgRmlsZSB0Z3REaXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb3B5ZGlyZWN0b3J5KHNyY0RpciwgdGd0RGlyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIGEgZGlyZWN0b3J5IHRvIGFub3RoZXIgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBzcmNEaXJOYW1lCi0JICogICAgICAgICAgICB0aGUgc291cmNlIGRpcmVjdG9yeSBuYW1lCi0JICogQHBhcmFtIHRndERpck5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29weURpcihTdHJpbmcgc3JjRGlyTmFtZSwgU3RyaW5nIHRndERpck5hbWUpIHsKLQkJcmV0dXJuIGNvcHlEaXIobmV3IEZpbGUoc3JjRGlyTmFtZSksIG5ldyBGaWxlKHRndERpck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgb25lIGRpcmVjdG9yeSB0byBhbm90aGVyIC0gb3BlcmF0ZXMgT05MWSBvbiBkaXJlY3Rvcmllcy4KLQkgKiA8cD4KLQkgKiBCb3RoIHNvdXJjZSBhbmQgZGVzdCBtdXN0IGV4aXN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29weWRpcmVjdG9yeShGaWxlIHNvdXJjZURpciwgRmlsZSBkZXN0RGlyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFzb3VyY2VEaXIuZXhpc3RzKCkgfHwgIWRlc3REaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghc291cmNlRGlyLmlzRGlyZWN0b3J5KCkgfHwgIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJRmlsZVtdIGZpbGVzID0gc291cmNlRGlyLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIGNhbGMgZGVzdGluYXRpb24gbmFtZQotCQkJCVN0cmluZyBkZXN0TmFtZSA9IGRlc3REaXIKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCSsgZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKAotCQkJCQkJCQlzb3VyY2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxKTsKLQkJCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQkJLy8gY29weSB0aGUgZmlsZQotCQkJCQljb3B5ZmlsZShmaWxlc1tpXSwgbmV3IEZpbGUoZGVzdE5hbWUpKTsKLQkJCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJLy8gY29weSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkKLQkJCQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKGRlc3ROYW1lKTsKLQkJCQkJZGVzdEZpbGUubWtkaXJzKCk7Ci0JCQkJCWNvcHlkaXJlY3RvcnkoZmlsZXNbaV0sIGRlc3RGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gZm9yIHNvbWUgcmVhc29uLCB0aGlzIGd1eSBsb2NrcyB0aGUgZmlsZSwgaWYgeW91IHRyeSB0byB1cGRhdGUgdGhlIGZpbGUsCi0JLy8gZ290IHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uCi0JLy8gamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb246Ci0JLy8gKFRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQgb24gYSBmaWxlIHdpdGggYSB1c2VyLW1hcHBlZAotCS8vIHNlY3Rpb24gb3BlbikKLQkvLyBuZWVkIHRvIGhhbmRsZSBsYXRlcgotCXB1YmxpYyBzdGF0aWMgQ2hhckJ1ZmZlciByZWFkRmlsZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUNoYXJCdWZmZXIgY2hhckJ1ZmZlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlGaWxlQ2hhbm5lbCBpbkNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0JCQlpbnQgbGVuZ3RoID0gKGludCkgaW5DaGFubmVsLnNpemUoKTsKLQkJCU1hcHBlZEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IGluQ2hhbm5lbC5tYXAoCi0JCQkJCUZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBsZW5ndGgpOwotCQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKEVOQ09ESU5HX0lTT184ODU5XzEpOwotCQkJQ2hhcnNldERlY29kZXIgZGVjb2RlciA9IGNoYXJzZXQubmV3RGVjb2RlcigpOwotCQkJY2hhckJ1ZmZlciA9IGRlY29kZXIuZGVjb2RlKGJ5dGVCdWZmZXIpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoYXJCdWZmZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdCdWZmZXIgcmVhZEZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgZW5jb2RpbmcpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBudWxsOwotCQlpbnQgc2l6ZTsKLQkJdHJ5IHsKLQkJCUNoYXJzZXQgY3MgPSBDaGFyc2V0LmZvck5hbWUoZW5jb2RpbmcpOwotCQkJQ2hhcnNldERlY29kZXIgY3NkID0gY3MubmV3RGVjb2RlcigpOwotCQkJY3NkLm9uTWFsZm9ybWVkSW5wdXQoQ29kaW5nRXJyb3JBY3Rpb24uUkVQTEFDRSk7Ci0JCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbMTAyNF07Ci0JCQlmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcywgY3NkKTsKLQkJCXdoaWxlICgoc2l6ZSA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgMTAyNCkpID4gMCkgewotCQkJCXJlc3VsdC5hcHBlbmQoYnVmZmVyLCAwLCBzaXplKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlbmNvZGluZyk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGZpcyAhPSBudWxsKSB7Ci0JCQkJZmlzLmNsb3NlKCk7Ci0JCQl9Ci0KLQkJCWlmIChyZWFkZXIgIT0gbnVsbCkgewotCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBsb25nIGdldFNpemUoRmlsZSBmaWxlKSB7Ci0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotCQl0cnkgewotCQkJZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCXJldHVybiBmaXMuZ2V0Q2hhbm5lbCgpLnNpemUoKTsJCQkKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZmlzLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXMgSmF2YSAxLjQncyBGaWxlTG9jayBjbGFzcyB0byB0ZXN0IGZvciBhIGZpbGUgbG9jawotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ZpbGVMb2NrZWQoRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gaXNMb2NrZWQgPSBmYWxzZTsKLQkJRmlsZU91dHB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUZpbGVMb2NrIGxvY2sgPSBudWxsOwotCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBpbnB1dC5nZXRDaGFubmVsKCk7Ci0KLQkJCWxvY2sgPSBmaWxlQ2hhbm5lbC50cnlMb2NrKCk7Ci0KLQkJCWlmIChsb2NrID09IG51bGwpCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQkJZWxzZQotCQkJCWxvY2sucmVsZWFzZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBTZWN1cml0eUV4Y2VwdGlvbikKLQkJCQkvLyBDYW4ndCB3cml0ZSB0byBmaWxlLgotCQkJCWlzTG9ja2VkID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pCi0JCQkJaXNMb2NrZWQgPSBmYWxzZTsKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKLQkJCQlpc0xvY2tlZCA9IHRydWU7Ci0JCQkvLyBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uIG1lYW5zIHRoYXQgdGhpcyBKVk0gaGFzIGl0IGxvY2tlZAotCQkJLy8gdGhlcmVmb3JlIGl0IGlzIG5vdCBsb2NrZWQgdG8gdXMKLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBPdmVybGFwcGluZ0ZpbGVMb2NrRXhjZXB0aW9uKQotCQkJCWlzTG9ja2VkID0gZmFsc2U7Ci0JCQkvLyBDb3VsZCBub3QgZ2V0IGEgbG9jayBmb3Igc29tZSBvdGhlciByZWFzb24uCi0JCQllbHNlCi0JCQkJaXNMb2NrZWQgPSB0cnVlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNMb2NrZWQ7Ci0JfQotCi0JLyoqCi0JICogTG9ja3MgYSBmaWxlIGZvciB0aGUgY3VycmVudCBKVk0uIFdpbGwgY3JlYXRlIHRoZSBmaWxlIGlmIGl0IGRvZXMgbm90Ci0JICogZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gYSBGaWxlTG9jayBvYmplY3QsIG9yIG51bGwgaWYgZmlsZSBjb3VsZCBub3QgYmUgbG9ja2VkCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlTG9jayBsb2NrRmlsZShGaWxlIGZpbGUpIHsKLQkJRmlsZU91dHB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCUZpbGVMb2NrIGxvY2sgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCUZpbGVDaGFubmVsIGZpbGVDaGFubmVsID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOwotCQkJbG9jayA9IGZpbGVDaGFubmVsLnRyeUxvY2soKTsKLQotCQkJaWYgKGxvY2suaXNWYWxpZCgpKQotCQkJCXJldHVybiBsb2NrOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gQ291bGQgbm90IGdldCBhIGxvY2sgZm9yIHNvbWUgcmVhc29uLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbnB1dCAhPSBudWxsICYmIChsb2NrID09IG51bGwgfHwgIWxvY2suaXNWYWxpZCgpKSkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGZpbGVzIGluIGEgc3BlY2lmaWVkIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFic29sdXRlIHBhdGggb2YgYSBmb2xkZXIKLQkgKiBAcGFyYW0gZmlsZUxpc3QKLQkgKiAgICAgICAgICAgIGEgbGlzdCB0byBjb2xsZWN0IHRoZSBmaWxlcwotCSAqIEBwYXJhbSByZWN1cnNpdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaW5kIHRoZSBmaWxlcyBpbiBzdWIgZm9sZGVycyBhcyB3ZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbEZpbGVzKEZpbGUgcGF0aCwgTGlzdDxGaWxlPiBmaWxlTGlzdCwKLQkJCWJvb2xlYW4gcmVjdXJzaXZlKSB7Ci0JCWlmIChwYXRoLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IHBhdGgubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGZpbGVzW2ldLmlzRmlsZSgpKSB7Ci0JCQkJCQlmaWxlTGlzdC5hZGQoZmlsZXNbaV0pOwotCQkJCQl9IGVsc2UgaWYgKHJlY3Vyc2l2ZSkgewotCQkJCQkJZ2V0QWxsRmlsZXMoZmlsZXNbaV0sIGZpbGVMaXN0LCByZWN1cnNpdmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBkaXJlY3RvcnkgYW5kIGV4dGVuc2lvbiwgcmV0dXJucyBhbGwgZmlsZXMgKHJlY3Vyc2l2ZWx5KSB3aG9zZQotCSAqIGV4dGVuc2lvbiBzdGFydHMgd2l0aCBhIGdpdmVuIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uCi0JICogICAgICAgICAgICBhIGZpbGUgZXh0ZW5zaW9uCi0JICogQHJldHVybiBhIGNvbGxlY2l0b24gb2YgPGNvZGU+RmlsZTwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PEZpbGU+IGZpbGVMaXN0KEZpbGUgZiwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlleHRlbnNpb24gPSBleHRlbnNpb24udG9VcHBlckNhc2UoKTsKLQkJTGlzdDxGaWxlPiByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQl0cnkgewotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQkJCVN0cmluZ1tdIGZsaXN0ID0gZi5saXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGlzdC5sZW5ndGg7ICsraSkgewotCQkJCQlGaWxlIGZjID0gbmV3IEZpbGUoZi5nZXRQYXRoKCksIGZsaXN0W2ldKTsKLQkJCQkJcmV0dXJuTGlzdC5hZGRBbGwoZmlsZUxpc3QoZmMsIGV4dGVuc2lvbikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCkudG9VcHBlckNhc2UoKTsKLQkJCQkJaWYgKG5hbWUubGFzdEluZGV4T2YoIi4iKSAhPSAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKG5hbWUKLQkJCQkJCQkJLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKS5zdGFydHNXaXRoKGV4dGVuc2lvbikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXJldHVybkxpc3QuYWRkKGYpOwotCQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBkaXJlY3RvcnkgYW5kIGV4dGVuc2lvbiwgcmV0dXJucyBhbGwgZmlsZXMgKHJlY3Vyc2l2ZWx5KSB3aG9zZQotCSAqIGV4dGVuc2lvbiBkb2VzIG5vdCBzdGFydHMgd2l0aCBhIGdpdmVuIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uCi0JICogICAgICAgICAgICBhIGZpbGUgZXh0ZW5zaW9uCi0JICogQHJldHVybiBhIGNvbGxlY2l0b24gb2YgPGNvZGU+RmlsZTwvY29kZT4gd2l0aG91dCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PEZpbGU+IGZpbGVMaXN0RXhjbHVkZUV4dChGaWxlIGYsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJTGlzdDxGaWxlPiByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQl0cnkgewotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotCQkJCVN0cmluZ1tdIGZsaXN0ID0gZi5saXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGlzdC5sZW5ndGg7ICsraSkgewotCQkJCQlGaWxlIGZjID0gbmV3IEZpbGUoZi5nZXRQYXRoKCksIGZsaXN0W2ldKTsKLQkJCQkJcmV0dXJuTGlzdC5hZGRBbGwoZmlsZUxpc3RFeGNsdWRlRXh0KGZjLCBleHRlbnNpb24pKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOwotCQkJCQlpZiAobmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoIShuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKS5zdGFydHNXaXRoKGV4dGVuc2lvbikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm5MaXN0LmFkZChmKTsKLQkJCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuTGlzdC5hZGQoZik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXR1cm5MaXN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGZpbGUgcGF0aHMgaW4gdGhlIHNwZWNpZmllZCBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoLAotCSAqICAgICAgICAgICAgYWJzb2x1dGUgcGF0aCBvZiBhIGZvbGRlcgotCSAqIEBwYXJhbSByZWN1cnNpdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBmaW5kIHRoZSBmaWxlcyBpbiBzdWIgZm9sZGVycyBhcyB3ZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8U3RyaW5nPiBnZXRBbGxGaWxlQWJzb2x1dGVQYXRocyhGaWxlIHBhdGgsCi0JCQlib29sZWFuIHJlY3Vyc2l2ZSkgewotCQlBcnJheUxpc3Q8RmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCWdldEFsbEZpbGVzKHBhdGgsIGZpbGVzLCByZWN1cnNpdmUpOwotCQlBcnJheUxpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgYWJzUGF0aCA9ICgoRmlsZSkgZmlsZXMuZ2V0KGkpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCXBhdGhzLmFkZChhYnNQYXRoKTsKLQkJfQotCQlyZXR1cm4gcGF0aHM7Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgYSBmaWxlIGZyb20gYSBkaXJlY3RvcnkgdG8gYW5vdGhlci4KLQkgKiA8cD4KLQkgKiBBdHRlbXB0cyB0byByZW5hbWUgdGhlIGZpbGUgZmlyc3QuIElmIHRoYXQgZmFpbHMsIHdpbGwgY29weSB0aGUKLQkgKiBzb3VyY2VGaWxlIHRvIGRlc3RGaWxlIGFuZCBkZWxldGUgdGhlIHNvdXJjZUZpbGUuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgZmlsZQotCSAqIEBwYXJhbSBkZXN0RmlsZQotCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1vdmVGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSkgewotCQl0cnkgewotCQkJZG9Nb3ZlRmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZG9Nb3ZlRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFRyeSB0byByZW5hbWUgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotCQlpZiAoIXNvdXJjZUZpbGUucmVuYW1lVG8oZGVzdEZpbGUpKSB7Ci0JCQkvLyBUcnkgdG8gY29weSB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUgYW5kCi0JCQkvLyBkZWxldGUKLQkJCS8vIHRoZSBzb3VyY2UgZmlsZS4KLQkJCWNvcHlmaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlKTsKLQkJCXNvdXJjZUZpbGUuZGVsZXRlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JMThuVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JMThuVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY2NmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSTE4blV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogSGVscGVyIHV0aWx0aWllcyBmb3IgaGFuZGxpbmcgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSTE4blV0aWwgewotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgSTE4blV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYWxpemVkIHN0cmluZyBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBrZXkuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlQnVuZGxlCi0JICogICAgICAgICAgICBBIHJlc291cmNlIGJ1bmRsZS4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcmV0dXJuIEEgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUsIFN0cmluZyBrZXkpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIG9iamVjdC4KLQkgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvY2FsaXplZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0U3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLAotCQkJU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkuZm9ybWF0KGxvY2FsaXplZFN0ciwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICdbJyArIGtleSArICddJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCB0d28gZ2l2ZW4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGExCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHBhcmFtIGRhdGEyCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwKLQkJCVN0cmluZyBrZXksIE9iamVjdCBkYXRhMSwgT2JqZWN0IGRhdGEyKSB7Ci0JCWlmIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBsb2NhbGl6ZWRTdHIgPSByZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQobG9jYWxpemVkU3RyLCBuZXcgT2JqZWN0W10geyBkYXRhMSwKLQkJCQkJCWRhdGEyIH0pOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgQSByZXNvdXJjZSBrZXkuCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIEFuIGFycmF5IG9mIG9iamVjdHMuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdFN0cmluZyhSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwKLQkJCVN0cmluZyBrZXksIE9iamVjdFtdIGRhdGEpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZFN0ciA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChsb2NhbGl6ZWRTdHIsIGRhdGEpOwotCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gJ1snICsga2V5ICsgJ10nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBpbnRlZ2VyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgcmVzb3VyY2Uga2V5IGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgbG9jYXRlZC4KLQkgKiBAcmV0dXJuIEEgbG9jYWxpemVkIGludGVyZ2VyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludChTdHJpbmcgaW50U3RyaW5nLAotCQkJaW50IGRlZmF1bHRWYWx1ZSkgewotCQl0cnkgewotCQkJaWYgKGludFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQoaW50U3RyaW5nKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCB2ZXJzaW9uIG9mIGEgVVMgRW5nbGlzaCByZXNvdXJjZSBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgYWJzb2x1dGUgcGF0aCB0byBhIHJlc291cmNlIGZpbGUuCi0JICogQHBhcmFtIGxvY2FsZQotCSAqICAgICAgICAgICAgQSBsb2NhbGUuCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHJlc291cmNlIGZpbGUuIElmIG5vbmUgZXhpc3RzLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbGl6ZWRGaWxlKFN0cmluZyBwYXRoLCBMb2NhbGUgbG9jYWxlKSB7Ci0JCWlmIChsb2NhbGUuZXF1YWxzKExvY2FsZS5VUykgfHwgcGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIEJ1aWxkIHRoZSBsb2NhbGUgc3RyaW5nIGFycmF5LiBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZQotCQkvLyBsb2NhbGl6ZWQgZmlsZSBuYW1lcy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCVN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKTsKLQkJU3RyaW5nIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpOwotCi0JCVN0cmluZ1tdIGxvY2FsZVN0cnMgPSBuZXcgU3RyaW5nWzNdOwotCQlpZiAodmFyaWFudCAhPSBudWxsICYmIHZhcmlhbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlsb2NhbGVTdHJzWzBdID0gbG9jYWxlLnRvU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGNvdW50cnkgIT0gbnVsbCAmJiBjb3VudHJ5Lmxlbmd0aCgpID4gMCkgewotCQkJbG9jYWxlU3Ryc1sxXSA9IGxhbmd1YWdlICsgIl8iICsgY291bnRyeTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsYW5ndWFnZSAhPSBudWxsKSB7Ci0JCQlsb2NhbGVTdHJzWzJdID0gbGFuZ3VhZ2U7Ci0JCX0KLQotCQlTdHJpbmcgZGlyID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCVN0cmluZyBmaWxlTmFtZTsKLQotCQlpbnQgcGF0aEluZGV4ID0gZGlyLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBhdGhJbmRleCA+IDApIHsKLQkJCWRpciA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGhJbmRleCArIDEpOwotCQkJZmlsZU5hbWUgPSBwYXRoLnN1YnN0cmluZyhwYXRoSW5kZXggKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVOYW1lID0gZGlyOwotCQkJZGlyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBmaWxlRXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQJCQotCQlpbnQgZXh0SW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZigiLiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChleHRJbmRleCA+IDApIHsKLQkJCWZpbGVFeHQgPSBmaWxlTmFtZS5zdWJzdHJpbmcoZXh0SW5kZXgpOwotCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZXh0SW5kZXgpOwotCQl9Ci0KLQkJZmlsZU5hbWUgPSBkaXIgKyBmaWxlTmFtZSArICJfIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIExvb2sgZm9yIHRoZSBsb2NhbGl6ZWQgZmlsZS4KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChsb2NhbGVTdHJzW2ldICE9IG51bGwpIHsKLQkJCQkvLyBHZXRzIHRoZSBsb2NhbGl6ZWQgcGF0aCBuYW1lLgotCQkJCVN0cmluZyBmbmFtZSA9IGZpbGVOYW1lICsgbG9jYWxlU3Ryc1tpXSArIGZpbGVFeHQ7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZm5hbWUpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBmbmFtZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQzMTM1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lNYXJrZXJBdHRyaWJ1dGVDb250cmlidXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLQotLyoqCi0qIEludGVyZmFjZSBmb3IgYWRkaW5nIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBtYXJrZXJzIAotKiAKLSogQGF1dGhvciBXZWlwaW5nIEx1Ci0qIEBzaW5jZSAgMS41Ci0qLwotcHVibGljIGludGVyZmFjZSBJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgewotCi0Jdm9pZCBhZGRBZGR0aW9uYWxBdHRyaWJ1dGVzKElNYXJrZXIgbWFya2VyLCBPYmplY3QgY29udGV4dCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lPYmplY3RGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0lPYmplY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODIxMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9JT2JqZWN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi0vKioKLSogSW50ZXJmYWNlIHRvIGNyZWF0ZSBvYmplY3QgYmFzZWQgb24gdHlwZSBhbmQgY29udGV4dCAKLSogCi0qIEBhdXRob3IgV2VpcGluZyBMdQotKiBAc2luY2UgIDEuNQotKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9iamVjdEZhY3RvcnkgewotCi0JT2JqZWN0IGNyZWF0ZShDbGFzcyB0eXBlLCBPYmplY3QgY29udGV4dCk7Ci0JCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSW1hZ2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL0ltYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjcwYmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvSW1hZ2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5Gb250OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7Ci1pbXBvcnQgamF2YS5hd3QuSW1hZ2U7Ci1pbXBvcnQgamF2YS5hd3QuTWVkaWFUcmFja2VyOwotaW1wb3J0IGphdmEuYXd0LmZvbnQuRm9udFJlbmRlckNvbnRleHQ7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5MaW5lQnJlYWtNZWFzdXJlcjsKLWltcG9ydCBqYXZhLmF3dC5mb250LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgamF2YS5hd3QuZm9udC5UZXh0TGF5b3V0OwotaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKLWltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOwotaW1wb3J0IGphdmEudGV4dC5BdHRyaWJ1dGVkQ2hhcmFjdGVySXRlcmF0b3I7Ci1pbXBvcnQgamF2YS50ZXh0LkF0dHJpYnV0ZWRTdHJpbmc7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBjcmVhdGluZyBpbWFnZSBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZVV0aWwgewotCi0JLy8gVGhlIEJ1ZmZlcmVkSW1hZ2UgY2FjaGUuCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEJ1ZmZlcmVkSW1hZ2U+IGltYWdlQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJ1ZmZlcmVkSW1hZ2U+KCk7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBJbWFnZVV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIDxjb2RlPkJ1ZmZlcmVkSW1hZ2U8L2NvZGU+IGZyb20gdGhlIGdpdmVuIGltYWdlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZmlsZQotCSAqIEBwYXJhbSBjCi0JICogICAgICAgICAgICBhbiBBV1QgY29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdWZmZXJlZEltYWdlIGdldEJ1ZmZlcmVkSW1hZ2UoU3RyaW5nIGltYWdlRmlsZSwgQ29tcG9uZW50IGMpIHsKLQkJaWYgKGltYWdlRmlsZSA9PSBudWxsIHx8IGMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlCdWZmZXJlZEltYWdlIGJ1ZmZlcmVkSW1hZ2UgPSAoQnVmZmVyZWRJbWFnZSkgaW1hZ2VDYWNoZS5nZXQoaW1hZ2VGaWxlKTsKLQkJaWYgKGJ1ZmZlcmVkSW1hZ2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JCX0KLQotCQlJbWFnZSBpbWFnZSA9IGMuZ2V0VG9vbGtpdCgpLmdldEltYWdlKGltYWdlRmlsZSk7Ci0JCU1lZGlhVHJhY2tlciB0cmFja2VyID0gbmV3IE1lZGlhVHJhY2tlcihjKTsKLQkJdHJhY2tlci5hZGRJbWFnZShpbWFnZSwgMCk7Ci0JCXRyeSB7Ci0JCQl0cmFja2VyLndhaXRGb3JBbGwoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJYnVmZmVyZWRJbWFnZSA9IG5ldyBCdWZmZXJlZEltYWdlKGltYWdlLmdldFdpZHRoKGMpLAotCQkJCWltYWdlLmdldEhlaWdodChjKSwgQnVmZmVyZWRJbWFnZS5UWVBFX0lOVF9BUkdCKTsKLQotCQlHcmFwaGljczJEIGcyZCA9IGJ1ZmZlcmVkSW1hZ2UuY3JlYXRlR3JhcGhpY3MoKTsKLQkJZzJkLmRyYXdJbWFnZShpbWFnZSwgMCwgMCwgYyk7Ci0JCWltYWdlQ2FjaGUucHV0KGltYWdlRmlsZSwgYnVmZmVyZWRJbWFnZSk7Ci0KLQkJcmV0dXJuIGJ1ZmZlcmVkSW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gaW1hZ2UgaXMgbG9hZGVkIHN1Y2Nlc3NmdWxseS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIGFuIEFXVCBpbWFnZQotCSAqIEBwYXJhbSBjCi0JICogICAgICAgICAgICBhbiBBV1QgY29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHdhaXRGb3JJbWFnZShJbWFnZSBpbWFnZSwgQ29tcG9uZW50IGMpIHsKLQkJTWVkaWFUcmFja2VyIHRyYWNrZXIgPSBuZXcgTWVkaWFUcmFja2VyKGMpOwotCQl0cmFja2VyLmFkZEltYWdlKGltYWdlLCAwKTsKLQkJdHJ5IHsKLQkJCXRyYWNrZXIud2FpdEZvckFsbCgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQl9Ci0JCXJldHVybiAoIXRyYWNrZXIuaXNFcnJvckFueSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEcmF3cyB0aGUgZ2l2ZW4gdGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gZzJkCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+R3JhcGhpY3MyRDwvY29kZT4gY29udGV4dAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCB0byBiZSByZW5kZXJlZAotCSAqIEBwYXJhbSBmb250Ci0JICogICAgICAgICAgICB0aGUgZm9udCB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0gY29sb3IKLQkgKiAgICAgICAgICAgIHRoZSBjb2xvciB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0geAotCSAqICAgICAgICAgICAgdGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKiBAcGFyYW0geQotCSAqICAgICAgICAgICAgdGhlIHZlcnRpY2FsY29vcmRpbmF0ZSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHJhd1RleHQoR3JhcGhpY3MyRCBnMmQsIFN0cmluZyB0ZXh0LCBGb250IGZvbnQsCi0JCQlDb2xvciBjb2xvciwgaW50IHgsIGludCB5KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZzJkLnNldENvbG9yKGNvbG9yKTsKLQkJRm9udFJlbmRlckNvbnRleHQgZnJjID0gZzJkLmdldEZvbnRSZW5kZXJDb250ZXh0KCk7Ci0JCVRleHRMYXlvdXQgdGV4dGxheW91dCA9IG5ldyBUZXh0TGF5b3V0KHRleHQsIGZvbnQsIGZyYyk7Ci0JCXRleHRsYXlvdXQuZHJhdyhnMmQsIHgsIHkpOwotCX0KLQotCS8qKgotCSAqIERyYXdzIHRoZSBnaXZlbiB0ZXh0IGFuZCB3cmFwcyBpdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gd2lkdGguCi0JICogCi0JICogQHBhcmFtIGcyZAotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPkdyYXBoaWNzMkQ8L2NvZGU+IGNvbnRleHQKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gYmUgcmVuZGVyZWQKLQkgKiBAcGFyYW0gZm9udAotCSAqICAgICAgICAgICAgdGhlIGZvbnQgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIGNvbG9yCi0JICogICAgICAgICAgICB0aGUgY29sb3IgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIHgKLQkgKiAgICAgICAgICAgIHRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIHkKLQkgKiAgICAgICAgICAgIHRoZSB2ZXJ0aWNhbGNvb3JkaW5hdGUgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSB0ZXh0Ci0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICB0aGUgbWF4aW11bSB3aWR0aCB1c2VkIGZvciB3cmFwcGluZyB0aGUgdGV4dAotCSAqIEBwYXJhbSBtYXhMaW5lCi0JICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZSBvZiB3cmFwcGVkIHRleHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHJhd1RleHQoR3JhcGhpY3MyRCBnMmQsIFN0cmluZyB0ZXh0LCBGb250IGZvbnQsCi0JCQlDb2xvciBjb2xvciwgaW50IHgsIGludCB5LCBmbG9hdCB3aWR0aCwgaW50IG1heExpbmUpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlmbG9hdCBtYXhXcmFwV2lkdGggPSB3aWR0aCAtIDEwOwotCQlnMmQuc2V0Q29sb3IoY29sb3IpOwotCQlQb2ludDJELkZsb2F0IHBlbiA9IG5ldyBQb2ludDJELkZsb2F0KHgsIHkpOwotCQlNYXA8VGV4dEF0dHJpYnV0ZSwgRm9udD4gYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFRleHRBdHRyaWJ1dGUsIEZvbnQ+KCk7Ci0JCWF0dHJpYnV0ZXMucHV0KFRleHRBdHRyaWJ1dGUuRk9OVCwgZm9udCk7Ci0JCUF0dHJpYnV0ZWRDaGFyYWN0ZXJJdGVyYXRvciB0ZXh0SXRlcmF0b3IgPSBuZXcgQXR0cmlidXRlZFN0cmluZyh0ZXh0LAotCQkJCWF0dHJpYnV0ZXMpLmdldEl0ZXJhdG9yKCk7Ci0JCUZvbnRSZW5kZXJDb250ZXh0IGZyYyA9IGcyZC5nZXRGb250UmVuZGVyQ29udGV4dCgpOwotCQlMaW5lQnJlYWtNZWFzdXJlciBtZWFzdXJlciA9IG5ldyBMaW5lQnJlYWtNZWFzdXJlcih0ZXh0SXRlcmF0b3IsIGZyYyk7Ci0JCWludCBsaW5lID0gMTsKLQkJd2hpbGUgKGxpbmUgPD0gbWF4TGluZSkgewotCQkJVGV4dExheW91dCBsYXlvdXQgPSBtZWFzdXJlci5uZXh0TGF5b3V0KG1heFdyYXBXaWR0aCk7Ci0JCQlpZiAobGF5b3V0ID09IG51bGwpCi0JCQkJYnJlYWs7Ci0JCQlwZW4ueSArPSBsYXlvdXQuZ2V0QXNjZW50KCk7Ci0JCQlmbG9hdCBkeCA9IDA7Ci0JCQlpZiAobGF5b3V0LmlzTGVmdFRvUmlnaHQoKSkgewotCQkJCWR4ID0gKHdpZHRoIC0gbGF5b3V0LmdldEFkdmFuY2UoKSk7Ci0JCQl9Ci0JCQlsYXlvdXQuZHJhdyhnMmQsIHBlbi54ICsgZHggLyAyLCBwZW4ueSk7Ci0JCQlwZW4ueSArPSBsYXlvdXQuZ2V0RGVzY2VudCgpICsgbGF5b3V0LmdldExlYWRpbmcoKSAtIDE7Ci0JCQlsaW5lKys7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWF0aFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTWF0aFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwNzRmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL01hdGhVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHBlcmZvcm1pbmcgbWF0aCBvcGVyYXRpb25zLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWF0aFV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIGNlaWwxMDAwKGxvbmcgbCkgewotCQlyZXR1cm4gKGwgLSAobCAmIDcpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvTmV0VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9OZXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMmQxNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9OZXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIGEgdXRpbGl0eSBjbGFzcyBmb3IgbWFuYWdpbmcgVVJMcyBhbmQgVVJJcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXRVdGlsIHsKLQotCS8qKgotCSAqIEZJTEUgc2NoZW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTEVfU0NIRU1FID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGaWxlIFVSSSBwcmVmaXguCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9VUklfUFJFRklYID0gRklMRV9TQ0hFTUUgKyAiOi8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBGaWxlIFVSSSBwcmVmaXggc2l6ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBGSUxFX1VSSV9QUkVGSVhfTEVOR1RIID0gRklMRV9VUklfUFJFRklYLmxlbmd0aCgpOwotCi0JLyoqCi0JICogSFRUUCBzY2hlbWUuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFRUUF9TQ0hFTUUgPSAiaHR0cCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEhUVFAgVVJJIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBIVFRQX1VSSV9QUkVGSVggPSBIVFRQX1NDSEVNRSArICI6Ly8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBIVFRQIFVSSSBwcmVmaXggc2l6ZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIVFRQX1VSSV9QUkVGSVhfTEVOR1RIID0gSFRUUF9VUklfUFJFRklYLmxlbmd0aCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVhfMiA9ICJmaWxlOi8vIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUkVGSVhfMyA9ICJmaWxlOi8vLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgdGFibGUgb2YgaGV4IHZhbHVlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBIRVhfVkFMVUVTID0gewotCQkJIiUwMCIsICIlMDEiLCAiJTAyIiwgIiUwMyIsICIlMDQiLCAiJTA1IiwgIiUwNiIsICIlMDciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMDgiLCAiJTA5IiwgIiUwQSIsICIlMEIiLCAiJTBDIiwgIiUwRCIsICIlMEUiLCAiJTBGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTEwIiwgIiUxMSIsICIlMTIiLCAiJTEzIiwgIiUxNCIsICIlMTUiLCAiJTE2IiwgIiUxNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUxOCIsICIlMTkiLCAiJTFBIiwgIiUxQiIsICIlMUMiLCAiJTFEIiwgIiUxRSIsICIlMUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMjAiLCAiJTIxIiwgIiUyMiIsICIlMjMiLCAiJTI0IiwgIiUyNSIsICIlMjYiLCAiJTI3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTI4IiwgIiUyOSIsICIlMkEiLCAiJTJCIiwgIiUyQyIsICIlMkQiLCAiJTJFIiwgIiUyRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiUzMCIsICIlMzEiLCAiJTMyIiwgIiUzMyIsICIlMzQiLCAiJTM1IiwgIiUzNiIsICIlMzciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlMzgiLCAiJTM5IiwgIiUzQSIsICIlM0IiLCAiJTNDIiwgIiUzRCIsICIlM0UiLCAiJTNGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTQwIiwgIiU0MSIsICIlNDIiLCAiJTQzIiwgIiU0NCIsICIlNDUiLCAiJTQ2IiwgIiU0NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU0OCIsICIlNDkiLCAiJTRBIiwgIiU0QiIsICIlNEMiLCAiJTREIiwgIiU0RSIsICIlNEYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNTAiLCAiJTUxIiwgIiU1MiIsICIlNTMiLCAiJTU0IiwgIiU1NSIsICIlNTYiLCAiJTU3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTU4IiwgIiU1OSIsICIlNUEiLCAiJTVCIiwgIiU1QyIsICIlNUQiLCAiJTVFIiwgIiU1RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU2MCIsICIlNjEiLCAiJTYyIiwgIiU2MyIsICIlNjQiLCAiJTY1IiwgIiU2NiIsICIlNjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlNjgiLCAiJTY5IiwgIiU2QSIsICIlNkIiLCAiJTZDIiwgIiU2RCIsICIlNkUiLCAiJTZGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTcwIiwgIiU3MSIsICIlNzIiLCAiJTczIiwgIiU3NCIsICIlNzUiLCAiJTc2IiwgIiU3NyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU3OCIsICIlNzkiLCAiJTdBIiwgIiU3QiIsICIlN0MiLCAiJTdEIiwgIiU3RSIsICIlN0YiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlODAiLCAiJTgxIiwgIiU4MiIsICIlODMiLCAiJTg0IiwgIiU4NSIsICIlODYiLCAiJTg3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJTg4IiwgIiU4OSIsICIlOEEiLCAiJThCIiwgIiU4QyIsICIlOEQiLCAiJThFIiwgIiU4RiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiU5MCIsICIlOTEiLCAiJTkyIiwgIiU5MyIsICIlOTQiLCAiJTk1IiwgIiU5NiIsICIlOTciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlOTgiLCAiJTk5IiwgIiU5QSIsICIlOUIiLCAiJTlDIiwgIiU5RCIsICIlOUUiLCAiJTlGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUEwIiwgIiVBMSIsICIlQTIiLCAiJUEzIiwgIiVBNCIsICIlQTUiLCAiJUE2IiwgIiVBNyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVBOCIsICIlQTkiLCAiJUFBIiwgIiVBQiIsICIlQUMiLCAiJUFEIiwgIiVBRSIsICIlQUYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQjAiLCAiJUIxIiwgIiVCMiIsICIlQjMiLCAiJUI0IiwgIiVCNSIsICIlQjYiLCAiJUI3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUI4IiwgIiVCOSIsICIlQkEiLCAiJUJCIiwgIiVCQyIsICIlQkQiLCAiJUJFIiwgIiVCRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVDMCIsICIlQzEiLCAiJUMyIiwgIiVDMyIsICIlQzQiLCAiJUM1IiwgIiVDNiIsICIlQzciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlQzgiLCAiJUM5IiwgIiVDQSIsICIlQ0IiLCAiJUNDIiwgIiVDRCIsICIlQ0UiLCAiJUNGIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUQwIiwgIiVEMSIsICIlRDIiLCAiJUQzIiwgIiVENCIsICIlRDUiLCAiJUQ2IiwgIiVENyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVEOCIsICIlRDkiLCAiJURBIiwgIiVEQiIsICIlREMiLCAiJUREIiwgIiVERSIsICIlREYiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRTAiLCAiJUUxIiwgIiVFMiIsICIlRTMiLCAiJUU0IiwgIiVFNSIsICIlRTYiLCAiJUU3IiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQgLy8kTk9OLU5MUy03JCAvLyROT04tTkxTLTgkCi0JCQkiJUU4IiwgIiVFOSIsICIlRUEiLCAiJUVCIiwgIiVFQyIsICIlRUQiLCAiJUVFIiwgIiVFRiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JAotCQkJIiVGMCIsICIlRjEiLCAiJUYyIiwgIiVGMyIsICIlRjQiLCAiJUY1IiwgIiVGNiIsICIlRjciLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkJCSIlRjgiLCAiJUY5IiwgIiVGQSIsICIlRkIiLCAiJUZDIiwgIiVGRCIsICIlRkUiLCAiJUZGIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQl9OwotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgTmV0VXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgZm9yIHRoZSBnaXZlbiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgaW5wdXQgZmlsZS4KLQkgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoZSBnaXZlbiBmaWxlLgotCSAqIEB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXIgd2hpbGUgY29uc3RydWN0aW5nIHRoZSBVUkkgZm9yIHRoZSBnaXZlbgotCSAqICAgICAgICAgICAgIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXJpKEZpbGUgZmlsZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB1cmwgPSBmaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHVybExlbmd0aCA9IHVybC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxMZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcgJzoKLQkJCQlzdHJCdWYuYXBwZW5kKCIlMjAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIFVSSSB1c2luZyB0aGUgZ2l2ZW4gdGhlIGJhc2UgVVJJLgotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSBVUkkgdG8gcmVzb2x2ZS4KLQkgKiBAcGFyYW0gYmFzZVVyaQotCSAqICAgICAgICAgICAgVGhlIGJhc2UgVVJJLgotCSAqIEByZXR1cm4gQSBmdWxseSBmb3JtZWQgVVJJLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVVcmkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VVcmkpIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLi4vIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGJhc2VVcmkuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYmFzZVVyaSA9IGJhc2VVcmkuc3Vic3RyaW5nKDAsIGJhc2VVcmkubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXdoaWxlICh1cmkuc3RhcnRzV2l0aCgiLi4vIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMyk7Ci0JCQkJaW50IGluZGV4ID0gYmFzZVVyaS5sYXN0SW5kZXhPZignLycpOwotCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJYmFzZVVyaSA9IGJhc2VVcmkuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCQl1cmkgPSAiLyIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBiYXNlVXJpLmVuZHNXaXRoKCIvIikgLy8kTk9OLU5MUy0xJAotCQkJCQk/IGJhc2VVcmkgKyB1cmkuc3Vic3RyaW5nKDEpIDogYmFzZVVyaSArIHVyaTsKLQkJfQotCi0JCWlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1VSSV9QUkVGSVgpIHx8IHVyaS5zdGFydHNXaXRoKEhUVFBfVVJJX1BSRUZJWCkpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQlyZXR1cm4gYmFzZVVyaS5lbmRzV2l0aCgiLyIpID8gYmFzZVVyaSArIHVyaSA6IGJhc2VVcmkgKyAnLycgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBVUkkuCi0JICogQHJldHVybiBUaGUgaW5wdXQgc3RyZWFtIGZvciB0aGUgZ2l2ZW4gVVJJLgotCSAqIEB0aHJvdyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gaWYgYSBnaXZlbiBYTUwgZG9jdW1lbnQgVVJJIGlzIGludmFsaWQuCi0JICogQHRocm93IElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKFN0cmluZyB1cmkpCi0JCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodXJpLnN0YXJ0c1dpdGgoSFRUUF9VUklfUFJFRklYKSkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLQkJCXJldHVybiB1cmwub3BlblN0cmVhbSgpOwotCQl9IGVsc2UgaWYgKHVyaS5zdGFydHNXaXRoKEZJTEVfVVJJX1BSRUZJWCkpIHsKLQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoRklMRV9VUklfUFJFRklYX0xFTkdUSCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShOZXRVdGlsLmRlY29kZVVybCh1cmksIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHN0cmluZyByZXByZXNlbnRpb24gKGVuY29kZWQgaW4gVVRGLTE2KSBvZiB0aGUgZ2l2ZW4gVVJMCi0JICogKGVuY29kZWQgaW4gdGhlIGdpdmVuIGVuY29kaW5nIGFuZCBBU0NJSS1lc2NhcGVkKS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBUaGUgVVJMIHRvIGRlY29kZS4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSBlbmNvZGluZyBvZiB0aGUgVVJMLgotCSAqIEByZXR1cm4gVGhlIEphdmEgVVRGLTE2IHN0cmluZyByZXNwcmVzZW50YXRpb24uCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gVVJMIGNvbnRhaW4gaW1wcm9wZXJseSBlc2NhcGVkIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXJsKFN0cmluZyB1cmwsIFN0cmluZyBlbmNvZGluZykgewotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQkJCi0JCWludCBsZW4gPSB1cmwubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCi0JCS8vIFVuZXNjYXBlIHRoZSB1cmwuCi0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnKyc6Ci0JCQkJc3RyQnVmLmFwcGVuZCgnICcpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJSc6Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludCh1cmwuc3Vic3RyaW5nKGkgKyAxLAotCQkJCQkJCWkgKyAzKSwgMTYpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWkgKz0gMjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDb252ZXJ0IHRoZSB1bi1lc2NhcGVkIGJ5dGUgdmFsdWVzIHRvIEphdmEgVVRGLTE2IHN0cmluZy4KLQkJU3RyaW5nIHJlc3VsdCA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQlpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlieXRlW10gYnl0ZXMgPSByZXN1bHQuZ2V0Qnl0ZXMoIjg4NTlfMSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gbmV3IFN0cmluZyhieXRlcywgZW5jb2RpbmcpOwotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEFTQ0lJLWVzY2FwZWQgcmVwcmVzZW50YXRpb24gKGVuY29kZWQgaW4gdGhlIHNwZWNpZmllZAotCSAqIGVuY29kaW5nKSBvZiB0aGUgZ2l2ZW4gVVJMIChlbmNvZGVkIGluIFVURi0xNikuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgVGhlIFVSTCB0byBlbmNvZGUuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgZW5jb2Rpbmcgb2YgdGhlIFVSTC4KLQkgKiBAcmV0dXJuIHRoZSBBU0NJSS1lc2NhcGVkIHJlc3ByZXNlbnRhdGlvbi4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBVUkwgY29udGFpbiBpbXByb3Blcmx5IGVzY2FwZWQgY2hhcmFjdGVycy4KLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiB0aGUgZ2l2ZW4gY29kaW5nIGlzIHVuc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVVcmwoU3RyaW5nIHVybCwgU3RyaW5nIGVuY29kaW5nKQotCQkJdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0JCQotCQlpbnQgbGVuID0gdXJsLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ5dGVbXSBieXRlcyA9IHVybC5nZXRCeXRlcyhlbmNvZGluZyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSAoY2hhcikgYnl0ZXNbaV07Ci0KLQkJCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgaWYgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpIHsKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0gZWxzZSBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlzd2l0Y2ggKGNoKSB7Ci0JCQkJY2FzZSAnLSc6Ci0JCQkJY2FzZSAnXyc6Ci0JCQkJY2FzZSAnLic6Ci0JCQkJY2FzZSAnISc6Ci0JCQkJY2FzZSAnfic6Ci0JCQkJY2FzZSAnKic6Ci0JCQkJY2FzZSAnXCcnOgotCQkJCWNhc2UgJygnOgotCQkJCWNhc2UgJyknOgotCQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmVzdWx0LmFwcGVuZChIRVhfVkFMVUVTW2NoICYgMHhGRl0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQVNDSUktZXNjYXBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZmlsZSBVUkwuCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkwKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIFVSTCB0byBlbmNvZGUuCi0JICogQHJldHVybiB0aGUgQVNDSUktZXNjYXBlZCByZXNwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlRmlsZVVSTChTdHJpbmcgZmlsZVVSTCkgewotCQlTdHJpbmcgdXJsID0gZmlsZVVSTDsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHVybExlbmd0aCA9IHVybC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxMZW5ndGg7IGkrKykgewotCQkJY2hhciBjaCA9IHVybC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcgJzoKLQkJCQlzdHJCdWYuYXBwZW5kKCIlMjAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzdHJCdWYuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQVNDSUktZXNjYXBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZmlsZSBVUkwuCi0JICogCi0JICogQHBhcmFtIGZpbGVVUkwKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIFVSTCB0byBlbmNvZGUuCi0JICogQHJldHVybiB0aGUgQVNDSUktZXNjYXBlZCByZXNwcmVzZW50YXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlZEZpbGVVcmwoU3RyaW5nIGZpbGVVUkwpIHsKLQkJU3RyaW5nIHVybCA9IGZpbGVVUkw7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCB1cmxMZW5ndGggPSB1cmwubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXJsTGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB1cmwuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnJSc6Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludCh1cmwuc3Vic3RyaW5nKGkgKyAxLAotCQkJCQkJCWkgKyAzKSwgMTYpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWkgKz0gMjsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc3RyQnVmLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVVUkwgKFN0cmluZyB1cmwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLS8vCQl1cmwgPSB1cmwucmVwbGFjZUFsbCgiXFwrIiwgIiUyQiIpOyAvLyROT04tTkxTLTEkCi0JCXVybCA9IFVSTERlY29kZXIuZGVjb2RlKHVybCwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1Byb2ZpbGluZ1V0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUHJvZmlsaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI5YWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvUHJvZmlsaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBwcm9maWxpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIFByb2ZpbGluZ1V0aWwgewotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRyYWNlRm9vdHByaW50ID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gb3V0cHV0ID0gU3lzdGVtLm91dDsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0KFByaW50U3RyZWFtIHBzKSB7Ci0JCW91dHB1dCA9IHBzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZnVsbEdDKCkgewotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0JCWxvbmcgaXNGcmVlID0gcnQuZnJlZU1lbW9yeSgpOwotCQlsb25nIHdhc0ZyZWU7Ci0JCWRvIHsKLQkJCXdhc0ZyZWUgPSBpc0ZyZWU7Ci0JCQlydC5ydW5GaW5hbGl6YXRpb24oKTsKLQkJCXJ0LmdjKCk7Ci0JCQlpc0ZyZWUgPSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0gd2hpbGUgKGlzRnJlZSA+IHdhc0ZyZWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGxvbmcgdHJhY2VVc2VkTWVtb3J5KFN0cmluZyBsb2NhdGlvbikgewotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0JCWxvbmcgdXNlZE1lbSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCW91dHB1dC5wcmludGxuKCJGb290cHJpbnQ+ICIgKyBsb2NhdGlvbiArICI6ICIgKyB1c2VkTWVtLzEwMDAgKyAiIEsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQJCi0JCQkJCQkJCQkJCi0JCXJldHVybiB1c2VkTWVtOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgbG9uZyB0cmFjZVVzZWRNZW1vcnlEaWZmKFN0cmluZyBsb2NhdGlvbkluZm8sIGxvbmcgY3VyclVzZWQsIGxvbmcgUHJldlVzZWQpIHsKLQkJbG9uZyBkaWZmID0gY3VyclVzZWQgLSBQcmV2VXNlZDsKLQkJb3V0cHV0LnByaW50bG4oIkZvb3RwcmludD4gRGlmZiwgIiArIGxvY2F0aW9uSW5mbyArICI6ICIgKyBkaWZmLzEwMDAgKyAiIEtcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQkJCQotCQlyZXR1cm4gZGlmZjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1N0clV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDUyMmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotCi1pbXBvcnQgY29tLmlibS5pY3UubGFuZy5VQ2hhcmFjdGVyOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW51aXB1bGF0aW5nIHN0cmluZ3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0clV0aWwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTID0gIihgfH58IXxAfCN8XFwkfCV8XFxefCZ8XFwqfFxcKHxcXCl8XFwrfD18XFxbfFxcXXxcXHx8XFw6fFwifDx8PnxcXD98L3wnfFxcc3xcXFxcKSsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlMgPSAiKFxcW3wjfFxcKnxcXD98XCJ8PHw+fFxcfHwhfCV8L3xcXF0pKyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9QVUJMSVNIRURfUEFUSF9DSEFSU19MSU5VWCA9ICIoXFxbfCN8XFwqfFxcP3xcInw8fD58XFx8fCF8JXxcXF0pKyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWFBfSU5WQUxJRF9GSUxFTkFNRV9DSEFSUyA9ICIoXFxbfCN8L3xcXFxcfFxcOnxcXCp8XFw/fFwifDx8PnxcXHx8XFxdfFxccykrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEhFWF9ESUdJVFMgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsCi0JCQknNicsICc3JywgJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNDQVBFRF9MRiA9ICImI3hBOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVTQ0FQRURfQ1IgPSAiJiN4RDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX0xJTkVfRkVFRCA9IExJTkVfRkVFRC5yZXBsYWNlKAotCQkJIlxuIiwgRVNDQVBFRF9MRikucmVwbGFjZSgiXHIiLCBFU0NBUEVEX0NSKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfUkVHRVggPSBMSU5FX0ZFRUQucmVwbGFjZUFsbCgKLQkJCSJcXFxcIiwgIlxcXFwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU0NBUEVEX0xJTkVfRkVFRF9SRUdFWCA9IEVTQ0FQRURfTElORV9GRUVEOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9CUkVBSyA9ICI8YnIvPiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9DT1BZID0gIiZjb3B5OyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9FVVJPID0gIiZldXJvOyI7Ly8kTk9OLU5MUy0xJCAJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1JFRyA9ICImcmVnOyI7Ly8kTk9OLU5MUy0xJCAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfVFJBREVNQVJLID0gIiZ0cmFkZTsiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCB0aGlzIGNsYXNzIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiBBbGwKLQkgKiBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHN0YXRpYy4KLQkgKi8KLQlwcml2YXRlIFN0clV0aWwoKSB7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgZm9yIG51bGwgc3RyaW5nLgotCSAqIDxwPgotCSAqIEEgbnVsbCBzdHJpbmcgaXMgZGVmaW5lZCBhcyBvbmUgdGhhdCBoYXMgYW4gZW1wdHkgcmVmZXJlbmNlIG9yIGhhcyB6ZXJvCi0JICogbGVuZ3RoLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgbnVsbCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNOdWxsKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGZvciBibGFuayBzdHJpbmcuCi0JICogPHA+Ci0JICogQSBibGFuayBzdHJpbmcgaXMgZGVmaW5lZCBhcyBvbmUgdGhhdCBoYXMgYW4gZW1wdHkgcmVmZXJlbmNlIG9yIGhhcyB6ZXJvCi0JICogbGVuZ3RoIGFmdGVyIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSBjaGFyYWN0ZXJzIGFyZSB0cmltbWVkLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgYmxhbmsgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmxhbmsoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gc3RyID09IG51bGwgfHwgc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGNoYXJhY3RlcnMgZnJvbSBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZSBjaGFyYWN0ZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJpbShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBzdHIgPT0gbnVsbCA/IG51bGwgOiBzdHIudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChUQUIsIENSLCBMRiBhbmQgU1BBQ0UpIGZyb20gYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHdpdGggd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVXaGl0ZVNwYWNlQ2hhcnMoU3RyaW5nIHN0cikgewotCQlpbnQgbGVuID0gKHN0ciA9PSBudWxsKSA/IDAgOiBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXN3aXRjaCAoc3RyLmNoYXJBdChpKSkgewotCQkJY2FzZSAnXHQnOgotCQkJY2FzZSAnXHInOgotCQkJY2FzZSAnXG4nOgotCQkJY2FzZSAnICc6Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBzdHI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU3BsaXRzIGEgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5nIHRva2Vucy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEBwYXJhbSBzZXAKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBzZXBhcmF0b3JzCi0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICB0aGUgZGVzaXJlZCBudW1iZXIgb2Ygc3RyaW5nIHRva2VucwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5nIHRva2VucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gc3BsaXQoU3RyaW5nIHN0ciwgU3RyaW5nIHNlcCwgaW50IGNvdW50KSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBjb3VudCA9PSAwIHx8IGNvdW50IDwgLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCBzZXAsCi0JCQkJY291bnQgPT0gLTEgPyBmYWxzZSA6IHRydWUpOwotCi0JCWlmIChjb3VudCA9PSAtMSkgewotCQkJY291bnQgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJfQotCi0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY291bnRdOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmIChpIDwgY291bnQpIHsKLQkJCQlpZiAoKHQubGVuZ3RoKCkgPT0gMSkgJiYgKHNlcC5pbmRleE9mKHQpICE9IC0xKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcmVzdWx0W2krK10gPSB0OwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHRbY291bnQgLSAxXSArPSB0OwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU3BsaXRzIGEgc3RyaW5nIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5nIHRva2Vucy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEBwYXJhbSBzZXAKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBzZXBhcmF0b3JzCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzdHJpbmcgdG9rZW5zCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBzcGxpdChTdHJpbmcgc3RyLCBTdHJpbmcgc2VwKSB7Ci0JCXJldHVybiBzcGxpdChzdHIsIHNlcCwgLTEpOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIGEgc3Vic3RyaW5nIHdpdGhpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3Vic3RyaW5nLgotCSAqIDxwPgotCSAqIE5vdGU6IE9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHN1YnN0cmluZyB3aWxsIGJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHBhcmFtIHNyYwotCSAqICAgICAgICAgICAgdGhlIHN1YnN0cmluZyB0byByZXBsYWNlCi0JICogQHBhcmFtIHRndAotCSAqICAgICAgICAgICAgdGhlIHN1YnN0cmluZyB0byB1c2UgZm9yIHRoZSByZXBsYWNlbWVudAotCSAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCB0aGUgZmlyc3Qgc3Vic3RyaW5nIHJlcGxhY2VkCi0JICogCi0JICogVE9ETzogUmV2aWV3IGltcGxlbWVudGF0aW9uLiBDYWxsIFN0cmluZy5yZXBsYWNlRmlyc3QoKSBpbnN0ZWFkPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHN0ciwgU3RyaW5nIHNyYywgU3RyaW5nIHRndCkgewotCQlpZiAoKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJCXx8IChzcmMgPT0gbnVsbCB8fCBzcmMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQotCQlTdHJpbmcgdG1wU3RyID0gc3RyOwotCQlpbnQgaW5kZXg7Ci0JCXdoaWxlICgoaW5kZXggPSB0bXBTdHIuaW5kZXhPZihzcmMpKSAhPSAtMSkgewotCQkJdG1wU3RyID0gdG1wU3RyLnN1YnN0cmluZygwLCBpbmRleCkgKyB0Z3QKLQkJCQkJKyB0bXBTdHIuc3Vic3RyaW5nKGluZGV4ICsgc3JjLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gdG1wU3RyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludGVnZXIgdmFsdWUgb2YgYSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCi0JICogICAgICAgICAgICBhIGRlZmF1bHQgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIHN0cmluZwotCSAqIEByZXR1cm4gdGhlIGludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludFZhbHVlKFN0cmluZyBzdHIsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKFN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHN0cik7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBieXRlcyByZXByZXNlbnRpbmcgdGhlIFVURi04IGVuY29kaW5nIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIGEgc3RyaW5nCi0JICogQHJldHVybiBhIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGdldFVURjhCeXRlcyhTdHJpbmcgc3RyKSB7Ci0JCWNoYXJbXSBjID0gc3RyLnRvQ2hhckFycmF5KCk7Ci0JCWludCBsZW4gPSBjLmxlbmd0aDsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaW50IGNoID0gY1tpXTsKLQkJCWlmIChjaCA8PSAweDdmKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0gZWxzZSBpZiAoY2ggPD0gMHg3ZmYpIHsKLQkJCQljb3VudCArPSAyOwotCQkJfSBlbHNlIHsKLQkJCQljb3VudCArPSAzOwotCQkJfQotCQl9Ci0KLQkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtjb3VudF07Ci0JCWludCBvZmYgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpbnQgY2ggPSBjW2ldOwotCQkJaWYgKGNoIDw9IDB4N2YpIHsKLQkJCQliW29mZisrXSA9IChieXRlKSBjaDsKLQkJCX0gZWxzZSBpZiAoY2ggPD0gMHg3ZmYpIHsKLQkJCQliW29mZisrXSA9IChieXRlKSAoKGNoID4+IDYpIHwgMHhjMCk7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKChjaCAmIDB4M2YpIHwgMHg4MCk7Ci0JCQl9IGVsc2UgewotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggPj4gMTIpIHwgMHhlMCk7Ci0JCQkJYltvZmYrK10gPSAoYnl0ZSkgKCgoY2ggPj4gNikgJiAweDNmKSB8IDB4ODApOwotCQkJCWJbb2ZmKytdID0gKGJ5dGUpICgoY2ggJiAweDNmKSB8IDB4ODApOwotCQkJfQotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhleGlkZWNpbWFsIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBmb3IgYW4gaW50ZWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGFuIGludGVnZXIKLQkgKiBAcmV0dXJuIHRoZSBoZXhpZGVjaW1hbCByZXByZXNlbnRhdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXIgdG9IZXgoaW50IHZhbHVlKSB7Ci0JCXJldHVybiBIRVhfRElHSVRTWyh2YWx1ZSAmIDB4RildOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVzY2FwZWQgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiBhIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBhIHN0cmluZwotCSAqIEBwYXJhbSBza2lwQVNDSUkKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBhdm9pZCBlc2NhcGluZyB0aGUgQVNDSUkgY2hhcmFjdGVycwotCSAqIEByZXR1cm4gdGhlIGVzY2FwZWQgVW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Fc2NhcGVkVW5pY29kZShTdHJpbmcgc3RyLCBib29sZWFuIHNraXBBU0NJSSkgewotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKiAyKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGNoID0gc3RyLmNoYXJBdChpKTsKLQotCQkJaWYgKHNraXBBU0NJSSAmJiBjaCA8IDB4MDA3RSkgewotCQkJCXJlc3VsdC5hcHBlbmQoY2gpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYXBwZW5kKCJcXHUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQodG9IZXgoKGNoID4+IDEyKSAmIDB4RikpOwotCQkJCXJlc3VsdC5hcHBlbmQodG9IZXgoKGNoID4+IDgpICYgMHhGKSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCh0b0hleCgoY2ggPj4gNCkgJiAweEYpKTsKLQkJCQlyZXN1bHQuYXBwZW5kKHRvSGV4KGNoICYgMHhGKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXNjYXBlZCBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogICAgICAgICAgICBhIEhUTUwgc3RyaW5nCi0JICogQHJldHVybiB0aGUgZXNjYXBlZCBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBIVE1MIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVzY2FwZWRIVE1MKFN0cmluZyBodG1sKSB7Ci0JCWlmIChodG1sID09IG51bGwgfHwgaHRtbC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW5ndGggPSBodG1sLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gaHRtbC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICclJzoKLQkJCQlpZiAoaSArIDQgPCBsZW5ndGgpIHsKLQkJCQkJU3RyaW5nIGhleFN0ciA9IGh0bWwuc3Vic3RyaW5nKGkgKyAxLCBpICsgNSk7Ci0JCQkJCWJvb2xlYW4gdmFsaWRIZXh0U3RyID0gdHJ1ZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBoZXhTdHIubGVuZ3RoKCk7IGorKykgewotCQkJCQkJY2hhciBjID0gaGV4U3RyLmNoYXJBdChqKTsKLQkJCQkJCWlmICghKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAnZicpKSB7Ci0JCQkJCQkJdmFsaWRIZXh0U3RyID0gZmFsc2U7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHZhbGlkSGV4dFN0cikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbnQgY29kZVBvaW50ID0gSW50ZWdlci5wYXJzZUludChoZXhTdHIsIDE2KTsKLQkJCQkJCQljaGFyW10gYyA9IFVDaGFyYWN0ZXIudG9DaGFycyhjb2RlUG9pbnQpOwotCQkJCQkJCXJlc3VsdC5hcHBlbmQoYyk7Ci0JCQkJCQkJaSArPSA0OwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x1MDBhOSc6Ci0JCQkJcmVzdWx0LmFwcGVuZChIVE1MX0NPUFkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUwMGFlJzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfUkVHKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x1MjBhYyc6Ci0JCQkJcmVzdWx0LmFwcGVuZChIVE1MX0VVUk8pOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHUyMTIyJzoKLQkJCQlyZXN1bHQuYXBwZW5kKEhUTUxfVFJBREVNQVJLKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmVzdWx0LmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsYWluIHRleHQgZnJvbSBIVE1MIHRleHQuCi0JICogPHA+Ci0JICogTm90ZTogQWxsIEhUTUwgdGFncyB3aWxsIGJlIHN0cmlwcGVkLgotCSAqIAotCSAqIEBwYXJhbSBodG1sCi0JICogICAgICAgICAgICB0aGUgSFRNTCB0ZXh0LgotCSAqIEByZXR1cm4gdGhlIHBsYWluIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIEhUTUwgdGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsYWluVGV4dChTdHJpbmcgaHRtbCkgewotCQlpZiAoaHRtbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWZpbmFsIFBhdHRlcm4gcF9wbGFpbnRleHRfZmlsdGVyID0gUGF0dGVybi5jb21waWxlKAotCQkJCSI8W14+XSo/PiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBQYXR0ZXJuIHBfcGxhaW50ZXh0X2ZpbHRlcjIgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJIiYuezEsNX1bXjtdOyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBQYXR0ZXJuIHBfcGxhaW50ZXh0X2ZpbHRlcjMgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJIlxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgcmVzdWx0ID0gaHRtbC5yZXBsYWNlQWxsKHBfcGxhaW50ZXh0X2ZpbHRlci5wYXR0ZXJuKCksICIgIikgLy8kTk9OLU5MUy0xJAotCQkJCS5yZXBsYWNlQWxsKHBfcGxhaW50ZXh0X2ZpbHRlcjIucGF0dGVybigpLCAiICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkucmVwbGFjZUFsbChwX3BsYWludGV4dF9maWx0ZXIzLnBhdHRlcm4oKSwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSB2YWxpZCBmaWxlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgYSBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgdmFsaWQgZmlsZSBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVZhbGlkRmlsZU5hbWUoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQbGFpblRleHQoc3RyKQotCQkJCS5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX0ZJTEVOQU1FX0NIQVJTLCAiICIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBsYWluVGV4dChzdHIpCi0JCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0FOWV9TUEVDSUFMX0NIQVJTLCAiICIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggZG9lcyBub3QgY29udGFpbiBhbnkgaW52YWxpZCBmaWxlbmFtZQotCSAqIGNoYXJhY3RlcnMuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXRoIGNvbnRhaW5zIG9ubHkgdmFsaWQKLQkgKiAgICAgICAgIGZpbGVuYW1lIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFB1Ymxpc2hQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCS8vIHJldHVybiBwYXRoLnJlcGxhY2VBbGwoaW52YWxpZFB1Ymxpc2hQYXRoQ2hhcnNSZWdFeHAsCi0JCS8vICIiKS5lcXVhbHMocGF0aCk7Ci0KLQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJcmV0dXJuIHBhdGgKLQkJCQkJLnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlMsICIiKS5lcXVhbHMocGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGVsc2UgZGVmYXVsdCB0byBMaW51eAotCQlyZXR1cm4gcGF0aAotCQkJCS5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTX0xJTlVYLCAiIikuZXF1YWxzKHBhdGgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG93ZXItY2FzZSBvZiBzdHIgdW5sZXNzIHRoZSBjdXJyZW50IGxvY2FsZSBpcyBHZXJtYW4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTG93ZXIoU3RyaW5nIHN0cikgewotCQlpZiAoUGxhdGZvcm0uZ2V0TkwoKS5zdGFydHNXaXRoKCJkZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJcmV0dXJuIHN0ci50b0xvd2VyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIGVzY2FwZSB0aGUgIiBhbmQgJwotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHN0ci5yZXBsYWNlQWxsKCInIiwgIlxcXFxcJyIpLnJlcGxhY2VBbGwoIlwiIiwgIlxcXFxcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JfQotCi0JLyoqCi0JICogQ29udmVydHMgYSA8Y29kZT5MaXN0PC9jb2RlPiB0byBhbiBTdHJpbmcgYXJyYXkuCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+TGlzdDwvY29kZT4KLQkgKiBAcmV0dXJuIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0TGlzdFRvU3RyQXJyYXkoTGlzdCBsaXN0KSB7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCWludCBjbnQgPSBsaXN0LnNpemUoKTsKLQkJCVN0cmluZ1tdIHN0ckFycmF5ID0gbmV3IFN0cmluZ1tjbnRdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIGxpc3QuZ2V0KGkpOwotCQkJCXN0ckFycmF5W2ldID0gbmV3IFN0cmluZyhzdHIpOwotCQkJfQotCQkJcmV0dXJuIHN0ckFycmF5OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUucmVwbGFjZUFsbChSRUdFWFBfQU5ZX1NQRUNJQUxfQ0hBUlMsICIiKS5lcXVhbHMobmFtZSk7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCS8qKgotCSAqIGFkZGVkIHNvbWUgdGVzdCBjb2RlCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJU3RyaW5nIHRleHQgPSAiQSYlICAgICAgYCYjICAgICAgICAgICAkfiFAIyQlXiYqKClfLSs9e31bXCJdOnxcXDo7XCInPCw+Lj8vIFx0XHJcbloiOyAvLyROT04tTkxTLTEkCi0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiArIHRleHQgKyAiXSA8PT0gdGV4dCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiArIHRleHQucmVwbGFjZUFsbChSRUdFWFBfQU5ZX1NQRUNJQUxfQ0hBUlMsICIgIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJKyAiXSA8PT0gQWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiAvLyROT04tTkxTLTEkCi0JCQkJKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfRklMRU5BTUVfQ0hBUlMsICIgIikgLy8kTk9OLU5MUy0xJAotCQkJCSsgIl0gPD09IEZpbGUgTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiWyIgLy8kTk9OLU5MUy0xJAotCQkJCSsgdGV4dC5yZXBsYWNlQWxsKFJFR0VYUF9JTlZBTElEX1BVQkxJU0hFRF9QQVRIX0NIQVJTLCAiICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkrICJdIDw9PSBwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJbIiAvLyROT04tTkxTLTEkCi0JCQkJKyB0ZXh0LnJlcGxhY2VBbGwoUkVHRVhQX0lOVkFMSURfUFVCTElTSEVEX1BBVEhfQ0hBUlNfTElOVVgsCi0JCQkJCQkiICIpICsgIl0gPD09IHBhdGgsIExpbnV4Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyB0aGUgcGxhdGZvcm0gbGluZS1zZXBhcmF0b3IgKFxuIG9yIFxuXHIgb3IgXHIpIHRvICZsdDtici8mZ3Q7Ci0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydE5ld2xpbmVzVG9IVE1MKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCXRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoTElORV9GRUVEX1JFR0VYLCBIVE1MX0JSRUFLICsgTElORV9GRUVEKTsKLQkJCXRleHQgPSB0ZXh0LnJlcGxhY2VBbGwoRVNDQVBFRF9MSU5FX0ZFRURfUkVHRVgsIEhUTUxfQlJFQUsKLQkJCQkJKyBFU0NBUEVEX0xJTkVfRkVFRCk7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgdG9VUkkoU3RyaW5nIHBhdGhTdHIpIHsKLQkJaWYgKHBhdGhTdHIgIT0gbnVsbCAmJiBwYXRoU3RyLmxlbmd0aCgpID4gMCkgewotCQkJSVBhdGggcGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHBhdGhTdHIpOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gcGF0aC50b0ZpbGUoKS50b1VSSSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZUNoYXIoU3RyaW5nIHRleHQsIGNoYXIgYykgewotCQlpbnQgaT10ZXh0LmluZGV4T2YoYyk7IAotCQlpZiAoIGkgPCAwICkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJCi0JCWludCBzdGFydCA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlICggaSA+IHN0YXJ0ICkgewotCQkJYnVmZmVyLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhzdGFydCwgaSkpLmFwcGVuZCgiXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnQgPSBpOwotCQkJaT10ZXh0LmluZGV4T2YoYywgc3RhcnQrMSk7IAotCQl9Ci0JCQotCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvU3RyaW5nTWF0Y2hlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJpbmdNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYjk2NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9TdHJpbmdNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBBIHN0cmluZyBwYXR0ZXJuIG1hdGNoZXIuIFN1cHBvcnRzICcqJyBhbmQgJz8nIHdpbGRjYXJkcy4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ01hdGNoZXIgewotCXByb3RlY3RlZCBTdHJpbmcgZlBhdHRlcm47Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoOyAvLyBwYXR0ZXJuIGxlbmd0aAotCXByb3RlY3RlZCBib29sZWFuIGZJZ25vcmVXaWxkQ2FyZHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZklnbm9yZUNhc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkhhc0xlYWRpbmdTdGFyOwotCXByb3RlY3RlZCBib29sZWFuIGZIYXNUcmFpbGluZ1N0YXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU2VnbWVudHNbXTsgLy90aGUgZ2l2ZW4gcGF0dGVybiBpcyBzcGxpdCBpbnRvICogc2VwYXJhdGVkIHNlZ21lbnRzCi0KLQkvKiBib3VuZGFyeSB2YWx1ZSBiZXlvbmQgd2hpY2ggd2UgZG9uJ3QgbmVlZCB0byBzZWFyY2ggaW4gdGhlIHRleHQgKi8KLQlwcm90ZWN0ZWQgaW50IGZCb3VuZD0gMDsKLQkKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBmU2luZ2xlV2lsZENhcmQ9ICdcdTAwMDAnOwotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zaXRpb24gewotCQlpbnQgc3RhcnQ7IC8vaW5jbHVzaXZlCi0JCWludCBlbmQ7IC8vZXhjbHVzaXZlCi0JCXB1YmxpYyBQb3NpdGlvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCXRoaXMuc3RhcnQ9IHN0YXJ0OwotCQkJdGhpcy5lbmQ9IGVuZDsKLQkJfQotCQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQkJcmV0dXJuIHN0YXJ0OwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQkJcmV0dXJuIGVuZDsKLQkJfQotCX0KLQkvKioKLQkgKiBTdHJpbmdNYXRjaGVyIGNvbnN0cnVjdG9yIHRha2VzIGluIGEgU3RyaW5nIG9iamVjdCB0aGF0IGlzIGEgc2ltcGxlIAotCSAqIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIG1heSBjb250YWluICcqJyBmb3IgMCBhbmQgbWFueSBjaGFyYWN0ZXJzIGFuZAotCSAqICc/JyBmb3IgZXhhY3RseSBvbmUgY2hhcmFjdGVyLiAgCi0JICoKLQkgKiBMaXRlcmFsICcqJyBhbmQgJz8nIGNoYXJhY3RlcnMgbXVzdCBiZSBlc2NhcGVkIGluIHRoZSBwYXR0ZXJuIAotCSAqIGUuZy4sICJcKiIgbWVhbnMgbGl0ZXJhbCAiKiIsIGV0Yy4KLQkgKgotCSAqIEVzY2FwaW5nIGFueSBvdGhlciBjaGFyYWN0ZXIgKGluY2x1ZGluZyB0aGUgZXNjYXBlIGNoYXJhY3RlciBpdHNlbGYpLCAKLQkgKiBqdXN0IHJlc3VsdHMgaW4gdGhhdCBjaGFyYWN0ZXIgaW4gdGhlIHBhdHRlcm4uCi0JICogZS5nLiwgIlxhIiBtZWFucyAiYSIgYW5kICJcXCIgbWVhbnMgIlwiCi0JICoKLQkgKiBJZiBpbnZva2luZyB0aGUgU3RyaW5nTWF0Y2hlciB3aXRoIHN0cmluZyBsaXRlcmFscyBpbiBKYXZhLCBkb24ndCBmb3JnZXQKLQkgKiBlc2NhcGUgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgIlxcIi4KLQkgKgotCSAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIG1hdGNoIHRleHQgYWdhaW5zdAotCSAqIEBwYXJhbSBpZ25vcmVDYXNlIGlmIHRydWUsIGNhc2UgaXMgaWdub3JlZAotCSAqIEBwYXJhbSBpZ25vcmVXaWxkQ2FyZHMgaWYgdHJ1ZSwgd2lsZCBjYXJkcyBhbmQgdGhlaXIgZXNjYXBlIHNlcXVlbmNlcyBhcmUgaWdub3JlZAotCSAqIAkJICAoZXZlcnl0aGluZyBpcyB0YWtlbiBsaXRlcmFsbHkpLgotCSAqLwotCXB1YmxpYyBTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuLCBib29sZWFuIGlnbm9yZUNhc2UsIGJvb2xlYW4gaWdub3JlV2lsZENhcmRzKSB7Ci0JCWlmIChwYXR0ZXJuID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCWZJZ25vcmVDYXNlPSBpZ25vcmVDYXNlOwotCQlmSWdub3JlV2lsZENhcmRzPSBpZ25vcmVXaWxkQ2FyZHM7Ci0JCWZQYXR0ZXJuPSBwYXR0ZXJuOwotCQlmTGVuZ3RoPSBwYXR0ZXJuLmxlbmd0aCgpOwotCQkKLQkJaWYgKGZJZ25vcmVXaWxkQ2FyZHMpIHsKLQkJCXBhcnNlTm9XaWxkQ2FyZHMoKTsKLQkJfSBlbHNlIHsKLQkJCXBhcnNlV2lsZENhcmRzKCk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogRmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgcGF0dGVybiBiZXR3ZWVuIDxjb2RlPnN0YXJ0PC9jb2RlKShpbmNsdXNpdmUpIAotCSAqIGFuZCA8Y29kZT5lbmQ8L2NvZGU+KGV4Y2x1c2l2ZSkuICAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgU3RyaW5nIG9iamVjdCB0byBzZWFyY2ggaW4gCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgc2VhcmNoIHJhbmdlLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBlbmRpbmcgaW5kZXggb2YgdGhlIHNlYXJjaCByYW5nZSwgZXhjbHVzaXZlCi0JICogQHJldHVybiBhbiA8Y29kZT5TdHJpbmdNYXRjaGVyLlBvc2l0aW9uPC9jb2RlPiBvYmplY3QgdGhhdCBrZWVwcyB0aGUgc3RhcnRpbmcgCi0JICogKGluY2x1c2l2ZSkgYW5kIGVuZGluZyBwb3NpdGlvbnMgKGV4Y2x1c2l2ZSkgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIAotCSAqIHBhdHRlcm4gaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0aGUgdGV4dDsgcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kIG9yIHN1YnRleHQKLQkgKiBpcyBlbXB0eSAoc3RhcnQ9PWVuZCkuIEEgcGFpciBvZiB6ZXJvcyBpcyByZXR1cm5lZCBpZiBwYXR0ZXJuIGlzIGVtcHR5IHN0cmluZwotCSAqIE5vdGUgdGhhdCBmb3IgcGF0dGVybiBsaWtlICIqYWJjKiIgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzdGFycywgcG9zaXRpb24gb2YgImFiYyIKLQkgKiBpcyByZXR1cm5lZC4gRm9yIGEgcGF0dGVybiBsaWtlIio/PyoiIGluIHRleHQgImFiY2RmIiwgKDEsMykgaXMgcmV0dXJuZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nTWF0Y2hlci5Qb3NpdGlvbiBmaW5kKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQotCQlpbnQgdGxlbj0gdGV4dC5sZW5ndGgoKTsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0PSAwOwotCQlpZiAoZW5kID4gdGxlbikKLQkJCWVuZD0gdGxlbjsKLQkJaWYgKGVuZCA8IDAgfHxzdGFydCA+PSBlbmQgKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmTGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHN0YXJ0LCBzdGFydCk7Ci0JCWlmIChmSWdub3JlV2lsZENhcmRzKSB7Ci0JCQlpbnQgeD0gcG9zSW4odGV4dCwgc3RhcnQsIGVuZCk7Ci0JCQlpZiAoeCA8IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gbmV3IFBvc2l0aW9uKHgsIHgrZkxlbmd0aCk7Ci0JCX0KLQotCQlpbnQgc2VnQ291bnQ9IGZTZWdtZW50cy5sZW5ndGg7Ci0JCWlmIChzZWdDb3VudCA9PSAwKS8vcGF0dGVybiBjb250YWlucyBvbmx5ICcqJyhzKQotCQkJcmV0dXJuIG5ldyBQb3NpdGlvbiAoc3RhcnQsIGVuZCk7Ci0JCQkJCQotCQlpbnQgY3VyUG9zPSBzdGFydDsKLQkJaW50IG1hdGNoU3RhcnQ9IC0xOwotCQlpbnQgaTsKLQkJZm9yIChpPSAwOyBpIDwgc2VnQ291bnQgJiYgY3VyUG9zIDwgZW5kOyArK2kpIHsKLQkJCVN0cmluZyBjdXJyZW50PSBmU2VnbWVudHNbaV07Ci0JCQlpbnQgbmV4dE1hdGNoPSByZWdFeHBQb3NJbih0ZXh0LCBjdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0JCQlpZiAobmV4dE1hdGNoIDwgMCApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZihpID09IDApCi0JCQkJbWF0Y2hTdGFydD0gbmV4dE1hdGNoOwotCQkJY3VyUG9zPSBuZXh0TWF0Y2ggKyBjdXJyZW50Lmxlbmd0aCgpOwotCQl9Ci0JCWlmIChpIDwgc2VnQ291bnQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBQb3NpdGlvbihtYXRjaFN0YXJ0LCBjdXJQb3MpOwotCX0KLQkvKioKLQkgKiBtYXRjaCB0aGUgZ2l2ZW4gPGNvZGU+dGV4dDwvY29kZT4gd2l0aCB0aGUgcGF0dGVybiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hlZCBlaXRoZXJ3aXNlIGZhbHNlCi0JICogQHBhcmFtIHRleHQgYSBTdHJpbmcgb2JqZWN0IAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBtYXRjaCh0ZXh0LCAwLCB0ZXh0Lmxlbmd0aCgpKTsKLQl9Ci0JLyoqCi0JICogR2l2ZW4gdGhlIHN0YXJ0aW5nIChpbmNsdXNpdmUpIGFuZCB0aGUgZW5kaW5nIChleGNsdXNpdmUpIHBvc2l0aW9ucyBpbiB0aGUgICAKLQkgKiA8Y29kZT50ZXh0PC9jb2RlPiwgZGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBzdWJzdHJpbmcgbWF0Y2hlcyB3aXRoIGFQYXR0ZXJuICAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwb3J0aW9uIG9mIHRoZSB0ZXh0IG1hdGNoZXMgdGhlIHBhdHRlcm4KLQkgKiBAcGFyYW0gdGV4dCBhIFN0cmluZyBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgc3Vic3RyaW5nIHRvIG1hdGNoIAotCSAqIEBwYXJhbSBzdGFydCBtYXJrcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gKGluY2x1c2l2ZSkgb2YgdGhlIHN1YnN0cmluZwotCSAqIEBwYXJhbSBlbmQgbWFya3MgdGhlIGVuZGluZyBpbmRleCAoZXhjbHVzaXZlKSBvZiB0aGUgc3Vic3RyaW5nIAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKG51bGwgPT0gdGV4dCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQotCQlpZiAoc3RhcnQgPiBlbmQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZklnbm9yZVdpbGRDYXJkcykKLQkJCXJldHVybiAoZW5kIC0gc3RhcnQgPT0gZkxlbmd0aCkgJiYgZlBhdHRlcm4ucmVnaW9uTWF0Y2hlcyhmSWdub3JlQ2FzZSwgMCwgdGV4dCwgc3RhcnQsIGZMZW5ndGgpOwotCQlpbnQgc2VnQ291bnQ9IGZTZWdtZW50cy5sZW5ndGg7Ci0JCWlmIChzZWdDb3VudCA9PSAwICYmIChmSGFzTGVhZGluZ1N0YXIgfHwgZkhhc1RyYWlsaW5nU3RhcikpICAvLyBwYXR0ZXJuIGNvbnRhaW5zIG9ubHkgJyonKHMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHN0YXJ0ID09IGVuZCkKLQkJCXJldHVybiBmTGVuZ3RoID09IDA7Ci0JCWlmIChmTGVuZ3RoID09IDApCi0JCQlyZXR1cm4gc3RhcnQgPT0gZW5kOwkKLQkJIAotCQlpbnQgdGxlbj0gdGV4dC5sZW5ndGgoKTsKLQkJaWYgKHN0YXJ0IDwgMCkKLQkJCXN0YXJ0PSAwOwotCQlpZiAoZW5kID4gdGxlbikKLQkJCWVuZD0gdGxlbjsgCi0JCQkJCQotCQlpbnQgdEN1clBvcz0gc3RhcnQ7Ci0JCWludCBib3VuZD0gZW5kIC0gZkJvdW5kOwotCQlpZiAoIGJvdW5kIDwgMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaW50IGk9MDsKLQkJU3RyaW5nIGN1cnJlbnQ9IGZTZWdtZW50c1tpXTsKLQkJaW50IHNlZ0xlbmd0aD0gY3VycmVudC5sZW5ndGgoKTsKLQotCQkvKiBwcm9jZXNzIGZpcnN0IHNlZ21lbnQgKi8KLQkJaWYgKCFmSGFzTGVhZGluZ1N0YXIpeyAKLQkJCWlmKCFyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIHN0YXJ0LCBjdXJyZW50LCAwLCBzZWdMZW5ndGgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQkrK2k7Ci0JCQkJdEN1clBvcz0gdEN1clBvcyArIHNlZ0xlbmd0aDsKLQkJCX0KLQkJfQotCQlpZiAoKGZTZWdtZW50cy5sZW5ndGggPT0gMSkgJiYgKCFmSGFzTGVhZGluZ1N0YXIpICYmICghZkhhc1RyYWlsaW5nU3RhcikpIHsKLQkJCS8vIG9ubHkgb25lIHNlZ21lbnQgdG8gbWF0Y2gsIG5vIHdpbGRjYXJkcyBzcGVjaWZpZWQKLQkJCXJldHVybiB0Q3VyUG9zID09IGVuZDsKLQkJfQotCQkvKiBwcm9jZXNzIG1pZGRsZSBzZWdtZW50cyAqLwkKLQkJd2hpbGUgKGkgPCBzZWdDb3VudCkgewotCQkJY3VycmVudD0gZlNlZ21lbnRzW2ldOwotCQkJaW50IGN1cnJlbnRNYXRjaDsKLQkJCWludCBrPSBjdXJyZW50LmluZGV4T2YoZlNpbmdsZVdpbGRDYXJkKTsKLQkJCWlmIChrIDwgMCkgewotCQkJCWN1cnJlbnRNYXRjaD0gdGV4dFBvc0luKHRleHQsIHRDdXJQb3MsIGVuZCwgY3VycmVudCk7Ci0JCQkJaWYgKGN1cnJlbnRNYXRjaCA8IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSB7IAotCQkJCWN1cnJlbnRNYXRjaD0gcmVnRXhwUG9zSW4odGV4dCwgdEN1clBvcywgZW5kLCBjdXJyZW50KTsKLQkJCQlpZiAoY3VycmVudE1hdGNoIDwgMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdEN1clBvcz0gY3VycmVudE1hdGNoICsgY3VycmVudC5sZW5ndGgoKTsKLQkJCWkrKzsKLQkJfQotCi0JCS8qIHByb2Nlc3MgZmluYWwgc2VnbWVudCAqLwotCQlpZiAoIWZIYXNUcmFpbGluZ1N0YXIgJiYgdEN1clBvcyAhPSBlbmQpIHsKLQkJCWludCBjbGVuPSBjdXJyZW50Lmxlbmd0aCgpOwotCQkJcmV0dXJuIHJlZ0V4cFJlZ2lvbk1hdGNoZXModGV4dCwgZW5kIC0gY2xlbiwgY3VycmVudCwgMCwgY2xlbik7Ci0JCX0KLQkJcmV0dXJuIGkgPT0gc2VnQ291bnQgOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgZ2l2ZW4gcGF0dGVybiBpbnRvIHNlZ21lbnRzIHNlcGVyYXRlZCBieSB3aWxkY2FyZCAnKicgY2hhcmFjdGVycy4KLQkgKiBTaW5jZSB3aWxkY2FyZHMgYXJlIG5vdCBiZWluZyB1c2VkIGluIHRoaXMgY2FzZSwgdGhlIHBhdHRlcm4gY29uc2lzdHMgb2YgYSBzaW5nbGUgc2VnbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VOb1dpbGRDYXJkcygpIHsKLQkJZlNlZ21lbnRzPSBuZXcgU3RyaW5nWzFdOwotCQlmU2VnbWVudHNbMF09IGZQYXR0ZXJuOwotCQlmQm91bmQ9IGZMZW5ndGg7Ci0JfQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gcGF0dGVybiBpbnRvIHNlZ21lbnRzIHNlcGVyYXRlZCBieSB3aWxkY2FyZCAnKicgY2hhcmFjdGVycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VXaWxkQ2FyZHMoKSB7Ci0JCWlmKGZQYXR0ZXJuLnN0YXJ0c1dpdGgoIioiKSkvLyROT04tTkxTLTEkCi0JCQlmSGFzTGVhZGluZ1N0YXI9IHRydWU7Ci0JCWlmKGZQYXR0ZXJuLmVuZHNXaXRoKCIqIikpIHsvLyROT04tTkxTLTEkCi0JCQkvKiBtYWtlIHN1cmUgaXQncyBub3QgYW4gZXNjYXBlZCB3aWxkY2FyZCAqLwotCQkJaWYgKGZMZW5ndGggPiAxICYmIGZQYXR0ZXJuLmNoYXJBdChmTGVuZ3RoIC0gMikgIT0gJ1xcJykgewotCQkJCWZIYXNUcmFpbGluZ1N0YXI9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlWZWN0b3I8U3RyaW5nPiB0ZW1wPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCQlpbnQgcG9zPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXdoaWxlIChwb3MgPCBmTGVuZ3RoKSB7Ci0JCQljaGFyIGM9IGZQYXR0ZXJuLmNoYXJBdChwb3MrKyk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdcXCc6Ci0JCQkJCWlmIChwb3MgPj0gZkxlbmd0aCkgewotCQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNoYXIgbmV4dD0gZlBhdHRlcm4uY2hhckF0KHBvcysrKTsKLQkJCQkJCS8qIGlmIGl0J3MgYW4gZXNjYXBlIHNlcXVlbmNlICovCi0JCQkJCQlpZiAobmV4dCA9PSAnKicgfHwgbmV4dCA9PSAnPycgfHwgbmV4dCA9PSAnXFwnKSB7Ci0JCQkJCQkJYnVmLmFwcGVuZChuZXh0KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLyogbm90IGFuIGVzY2FwZSBzZXF1ZW5jZSwganVzdCBpbnNlcnQgbGl0ZXJhbGx5ICovCi0JCQkJCQkJYnVmLmFwcGVuZChjKTsKLQkJCQkJCQlidWYuYXBwZW5kKG5leHQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKic6Ci0JCQkJCWlmIChidWYubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvKiBuZXcgc2VnbWVudCAqLwotCQkJCQkJdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKLQkJCQkJCWZCb3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JCQkJCQlidWYuc2V0TGVuZ3RoKDApOwotCQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPyc6Ci0JCQkJCS8qIGFwcGVuZCBzcGVjaWFsIGNoYXJhY3RlciByZXByZXNlbnRpbmcgc2luZ2xlIG1hdGNoIHdpbGRjYXJkICovCi0JCQkJCWJ1Zi5hcHBlbmQoZlNpbmdsZVdpbGRDYXJkKTsKLQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0KLQkJLyogYWRkIGxhc3QgYnVmZmVyIHRvIHNlZ21lbnQgbGlzdCAqLwotCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJdGVtcC5hZGRFbGVtZW50KGJ1Zi50b1N0cmluZygpKTsKLQkJCWZCb3VuZCArPSBidWYubGVuZ3RoKCk7Ci0JCX0KLQkJCQotCQlmU2VnbWVudHM9IG5ldyBTdHJpbmdbdGVtcC5zaXplKCldOwotCQl0ZW1wLmNvcHlJbnRvKGZTZWdtZW50cyk7Ci0JfQotCS8qKiAKLQkgKiBAcGFyYW0gdGV4dCBhIHN0cmluZyB3aGljaCBjb250YWlucyBubyB3aWxkY2FyZAotCSAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgZm9yIHNlYXJjaCwgaW5jbHVzaXZlCi0JICogQHBhcmFtIGVuZCB0aGUgc3RvcHBpbmcgcG9pbnQgb2Ygc2VhcmNoLCBleGNsdXNpdmUKLQkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQpIHsvL25vIHdpbGQgY2FyZCBpbiBwYXR0ZXJuCi0JCWludCBtYXg9IGVuZCAtIGZMZW5ndGg7Ci0JCQotCQlpZiAoIWZJZ25vcmVDYXNlKSB7Ci0JCQlpbnQgaT0gdGV4dC5pbmRleE9mKGZQYXR0ZXJuLCBzdGFydCk7Ci0JCQlpZiAoaSA9PSAtMSB8fCBpID4gbWF4KQotCQkJCXJldHVybiAtMTsKLQkJCXJldHVybiBpOwotCQl9Ci0JCQotCQlmb3IgKGludCBpPSBzdGFydDsgaSA8PSBtYXg7ICsraSkgewotCQkJaWYgKHRleHQucmVnaW9uTWF0Y2hlcyh0cnVlLCBpLCBmUGF0dGVybiwgMCwgZkxlbmd0aCkpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCXJldHVybiAtMTsKLQl9Ci0JLyoqIAotCSAqIEBwYXJhbSB0ZXh0IGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBvbmx5IGNvbnRhaW4gJz8nKHMpCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBzdG9wcGluZyBwb2ludCBvZiBzZWFyY2gsIGV4Y2x1c2l2ZQotCSAqIEBwYXJhbSBwIGEgc2ltcGxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1heSBjb250YWlucyAnPycKLQkgKiBAcmV0dXJuIHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBvZiB0aGUgcGF0dGVybiAsIG9yIC0xIGlmIG5vdCBmb3VuZCAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJlZ0V4cFBvc0luKFN0cmluZyB0ZXh0LCBpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBwKSB7Ci0JCWludCBwbGVuPSBwLmxlbmd0aCgpOwotCQkKLQkJaW50IG1heD0gZW5kIC0gcGxlbjsKLQkJZm9yIChpbnQgaT0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKLQkJCWlmIChyZWdFeHBSZWdpb25NYXRjaGVzKHRleHQsIGksIHAsIDAsIHBsZW4pKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWdFeHBSZWdpb25NYXRjaGVzKFN0cmluZyB0ZXh0LCBpbnQgdFN0YXJ0LCBTdHJpbmcgcCwgaW50IHBTdGFydCwgaW50IHBsZW4pIHsKLQkJd2hpbGUgKHBsZW4tLSA+IDApIHsKLQkJCWNoYXIgdGNoYXI9IHRleHQuY2hhckF0KHRTdGFydCsrKTsKLQkJCWNoYXIgcGNoYXI9IHAuY2hhckF0KHBTdGFydCsrKTsKLQotCQkJLyogcHJvY2VzcyB3aWxkIGNhcmRzICovCi0JCQlpZiAoIWZJZ25vcmVXaWxkQ2FyZHMpIHsKLQkJCQkvKiBza2lwIHNpbmdsZSB3aWxkIGNhcmRzICovCi0JCQkJaWYgKHBjaGFyID09IGZTaW5nbGVXaWxkQ2FyZCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGNoYXIgPT0gdGNoYXIpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZklnbm9yZUNhc2UpIHsKLQkJCQlpZiAoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHRjaGFyKSA9PSBDaGFyYWN0ZXIudG9VcHBlckNhc2UocGNoYXIpKQotCQkJCQljb250aW51ZTsKLQkJCQkvLyBjb21wYXJpbmcgYWZ0ZXIgY29udmVydGluZyB0byB1cHBlciBjYXNlIGRvZXNuJ3QgaGFuZGxlIGFsbCBjYXNlczsKLQkJCQkvLyBhbHNvIGNvbXBhcmUgYWZ0ZXIgY29udmVydGluZyB0byBsb3dlciBjYXNlCi0JCQkJaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh0Y2hhcikgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHBjaGFyKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKiAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgc3RyaW5nIHRvIG1hdGNoCi0JICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydGluZyBpbmRleCBpbiB0aGUgdGV4dCBmb3Igc2VhcmNoLCBpbmNsdXNpdmUKLQkgKiBAcGFyYW0gZW5kIHRoZSBzdG9wcGluZyBwb2ludCBvZiBzZWFyY2gsIGV4Y2x1c2l2ZQotCSAqIEBwYXJhbSBwIGEgc3RyaW5nIHRoYXQgaGFzIG5vIHdpbGRjYXJkCi0JICogQHJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggaW4gdGhlIHRleHQgb2YgdGhlIHBhdHRlcm4gLCBvciAtMSBpZiBub3QgZm91bmQgCi0JICovCi0JcHJvdGVjdGVkIGludCB0ZXh0UG9zSW4oU3RyaW5nIHRleHQsIGludCBzdGFydCwgaW50IGVuZCwgU3RyaW5nIHApIHsgCi0JCQotCQlpbnQgcGxlbj0gcC5sZW5ndGgoKTsKLQkJaW50IG1heD0gZW5kIC0gcGxlbjsKLQkJCi0JCWlmICghZklnbm9yZUNhc2UpIHsKLQkJCWludCBpPSB0ZXh0LmluZGV4T2YocCwgc3RhcnQpOwotCQkJaWYgKGkgPT0gLTEgfHwgaSA+IG1heCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaT0gc3RhcnQ7IGkgPD0gbWF4OyArK2kpIHsKLQkJCWlmICh0ZXh0LnJlZ2lvbk1hdGNoZXModHJ1ZSwgaSwgcCwgMCwgcGxlbikpCi0JCQkJcmV0dXJuIGk7Ci0JCX0KLQkJCi0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBjb252ZXJ0RnJvbVN0cmluZyhTdHJpbmcgcGF0dGVybnMsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplcj0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXR0ZXJucywgc2VwYXJhdG9yLCB0cnVlKTsKLQkJaW50IHRva2VuQ291bnQ9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlMaXN0PFN0cmluZz4gcmVzdWx0PSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odG9rZW5Db3VudCk7Ci0JCWJvb2xlYW4gZXNjYXBlPSBmYWxzZTsKLQkJYm9vbGVhbiBhcHBlbmQ9IGZhbHNlOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKHNlcGFyYXRvci5lcXVhbHModG9rZW4pKSB7Ci0JCQkJaWYgKCFlc2NhcGUpCi0JCQkJCWVzY2FwZT0gdHJ1ZTsKLQkJCQllbHNlIHsKLQkJCQkJYWRkUGF0dGVybihyZXN1bHQsIHNlcGFyYXRvcik7Ci0JCQkJCWFwcGVuZD0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgIHsKLQkJCQlpZiAoIWFwcGVuZCkKLSAJCQkJCXJlc3VsdC5hZGQodG9rZW4pOwotCQkJCWVsc2UKLQkJCQkJYWRkUGF0dGVybihyZXN1bHQsIHRva2VuKTsKLQkJCQlhcHBlbmQ9IGZhbHNlOwotCQkJCWVzY2FwZT0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSlyZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQYXR0ZXJuKExpc3Q8U3RyaW5nPiBsaXN0LCBTdHJpbmcgcGF0dGVybikgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpCi0JCQlsaXN0LmFkZChwYXR0ZXJuKTsKLQkJZWxzZSB7Ci0JCQlpbnQgaW5kZXg9IGxpc3Quc2l6ZSgpIC0gMTsKLQkJCWxpc3Quc2V0KGluZGV4LCAoKFN0cmluZylsaXN0LmdldChpbmRleCkpICsgcGF0dGVybik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nW10gcGF0dGVybnMsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJaW50IGxlbmd0aD0gcGF0dGVybnMubGVuZ3RoOwotCQlTdHJpbmdCdWZmZXIgc3RyQnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChsZW5ndGggPiAwKQotCQkJc3RyQnVmLmFwcGVuZChlc2NhcGVTZXBhcmF0b3IocGF0dGVybnNbMF0sIHNlcGFyYXRvcikpOwotCQllbHNlCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGk9IDE7Ci0JCXdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCQlzdHJCdWYuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN0ckJ1Zi5hcHBlbmQoZXNjYXBlU2VwYXJhdG9yKHBhdHRlcm5zW2krK10sIHNlcGFyYXRvcikpOwotCQl9Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZVNlcGFyYXRvcihTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpbnQgbGVuZ3RoPSBwYXR0ZXJuLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY2hhciBjaD0gcGF0dGVybi5jaGFyQXQoaSk7IAotCQkJaWYgKHNlcGFyYXRvci5lcXVhbHMoU3RyaW5nLnZhbHVlT2YoY2gpKSkKLQkJCQlidWYuYXBwZW5kKGNoKTsKLQkJCWJ1Zi5hcHBlbmQoY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gY29udmVydEZyb21TdHJpbmcoU3RyaW5nIHBhdHRlcm5zKSB7Ci0JCXJldHVybiBjb252ZXJ0RnJvbVN0cmluZyhwYXR0ZXJucywgU0VQQVJBVE9SKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SPSAiLCI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1RocmVhZFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGhyZWFkVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWI0MjNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGhyZWFkVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBoYW5kbGluZyB0aHJlYWRzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRocmVhZFV0aWwgewotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgVGhyZWFkVXRpbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBQdXRzIHRoZSBjdXJyZW50IHRocmVhZCB0byBzbGVlcCBmb3IgYSBnaXZlbiBkdXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdGltZQotCSAqICAgICAgICAgICAgVGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGF1c2UobG9uZyB0aW1lKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAodGltZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaW1lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9UaW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWYyOThhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvVGltZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHM7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotLyoqCi0gKiBBIHNpbXBsZSB0aW1lciBmb3IgdHJhY2tpbmcgdGltZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRpbWVyIHsKLQotCXByaXZhdGUgbG9uZyBpbml0VGltZTsKLQotCXByaXZhdGUgbG9uZyBzdGFydFRpbWU7Ci0KLQlwcml2YXRlIGxvbmcgZW5kVGltZTsKLQotCXB1YmxpYyBUaW1lcigpIHsKLQkJc3RhcnQoKTsKLQkJaW5pdFRpbWUgPSBzdGFydFRpbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXN0YXJ0VGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJZW5kVGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUaW1lKCkgewotCQlyZXR1cm4gKGludCkgKGVuZFRpbWUgLSBzdGFydFRpbWUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VG90YWxUaW1lKCkgewotCQlyZXR1cm4gKGludCkgKGVuZFRpbWUgLSBpbml0VGltZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1dhclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvV2FyVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmRjZWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvV2FyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLldhcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotCi0KLXB1YmxpYyBjbGFzcyBXYXJVdGlsIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3YXIgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3V0cHV0V2FyRmlsZQotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgdGFyZ2V0IHdhciBmaWxlCi0JICogQHBhcmFtIHdlYkFwcERpcmVjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlcyBhbmQgc3ViCi0JICogICAgICAgICAgICBkaXJlY3RvcmllcyB0byBiZSB3YXJlZAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSB6aXAgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFdhckZpbGUoU3RyaW5nIG91dHB1dFdhckZpbGUsIFN0cmluZyB3ZWJBcHBEaXJlY3RvcnksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCVByb2plY3QgYW50UHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7Ci0JCQlhbnRQcm9qZWN0LmluaXQoKTsKLQkJCVdhciB3YXJUYXNrID0gbmV3IFdhcigpOwotCQkJd2FyVGFzay5zZXRQcm9qZWN0KGFudFByb2plY3QpOwotCQkJd2FyVGFzay5zZXREZXN0RmlsZShuZXcgRmlsZShvdXRwdXRXYXJGaWxlKSk7Ci0JCQl3YXJUYXNrLnNldFdlYnhtbChuZXcgRmlsZSh3ZWJBcHBEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArICJXRUItSU5GIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAid2ViLnhtbCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZVNldCB3ZWJGaWxlcyA9IG5ldyBGaWxlU2V0KCk7Ci0JCQl3ZWJGaWxlcy5zZXREaXIobmV3IEZpbGUod2ViQXBwRGlyZWN0b3J5KSk7Ci0JCQl3YXJUYXNrLmFkZEZpbGVzZXQod2ViRmlsZXMpOwotCQkJd2FyVGFzay5leGVjdXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvWE1MVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9YTUxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjODJhMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9YTUxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHByb2Nlc3NpbmcgWE1MIGRvY3VtZW50cy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWwgewotCi0JLyoqCi0JICogWE1MIGRlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9ERUNMQVJBVElPTiA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBYTUwgRXNjYXBlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0FNUCA9ICImYW1wOyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9CQUNLU0xBU0ggPSAiJiM5MjsiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0FQT1MgPSAiJmFwb3M7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0NSID0gIiYjMTM7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MX0dUID0gIiZndDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfTFQgPSAiJmx0OyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFhNTF9MRiA9ICImIzEwOyI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfUVVPVCA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfVEFCID0gIiYjOTsiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIENSTEZfQllURVMgPSBDUkxGLmdldEJ5dGVzKCk7Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4gQWxsCi0JICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBiZSBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBYTUxVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIENsb25lcyB0aGUgZ2l2ZW4gRE9NIG5vZGUgaW50byB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBUaGUgRE9NIG5vZGUgdG8gY2xvbmUuCi0JICogQHBhcmFtIGRvYwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBET00gZG9jdW1lbnQuCi0JICogQHJldHVybiBUaGUgY2xvbmVkIG5vZGUgaW4gdGhlIHRhcmdldCBET00gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlIGNsb25lTm9kZShOb2RlIG5vZGUsIERvY3VtZW50IGRvYykgewotCQlOb2RlIGNsb25lID0gbnVsbDsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLQkJCWNsb25lID0gZG9jLmNyZWF0ZUVsZW1lbnQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBhdHRyTm9kZSA9IGF0dHJzLml0ZW0oaSk7Ci0JCQkJQXR0ciBhdHRyQ2xvbmUgPSBkb2MuY3JlYXRlQXR0cmlidXRlKGF0dHJOb2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCWF0dHJDbG9uZS5zZXROb2RlVmFsdWUoYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJCSgoRWxlbWVudCkgY2xvbmUpLnNldEF0dHJpYnV0ZU5vZGUoYXR0ckNsb25lKTsKLQkJCX0KLQotCQkJLy8gSXRlcmF0ZSB0aHJvdWdoIGVhY2ggY2hpbGQgbm9kZXMuCi0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpZiAoY2hpbGROb2RlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJTm9kZSBjaGlsZE5vZGUgPSBjaGlsZE5vZGVzLml0ZW0oaSk7Ci0JCQkJCU5vZGUgY2hpbGRDbG9uZSA9IGNsb25lTm9kZShjaGlsZE5vZGUsIGRvYyk7Ci0JCQkJCWNsb25lLmFwcGVuZENoaWxkKGNoaWxkQ2xvbmUpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5URVhUX05PREU6Ci0JCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6Ci0JCQljbG9uZSA9IGRvYy5jcmVhdGVUZXh0Tm9kZShub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJY2xvbmUuc2V0Tm9kZVZhbHVlKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgYSBYTUwgYXR0cmlidXRlIHRvIG1ha2UgaXQgWE1MIHBhcnNlciBmcmllbmRseS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIGF0dHJpYnV0ZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlQXR0cihTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICcmJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FNUCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYi5hcHBlbmQoWE1MX1FVT1QpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEVzY2FwZXMgdGhlIGdpdmVuIHN0cmluZyB0byBtYWtlIGl0IFhNTCBwYXJzZXIgZnJpZW5kbHkuCi0JICogCi0JICogQHBhcmFtIHN0cgotCSAqICAgICAgICAgICAgVGhlIHNvdXJjZSBzdHJpbmcuCi0JICogQHJldHVybiBUaGUgZXNjYXBlZCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0xUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz4nOgotCQkJCXNiLmFwcGVuZChYTUxfR1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnJic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9BTVApOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnIic6Ci0JCQkJc2IuYXBwZW5kKFhNTF9RVU9UKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1wnJzoKLQkJCQlzYi5hcHBlbmQoWE1MX0FQT1MpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXHInOgotCQkJCXNiLmFwcGVuZChYTUxfQ1IpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXG4nOgotCQkJCXNiLmFwcGVuZChYTUxfTEYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCXNiLmFwcGVuZChYTUxfQkFDS1NMQVNIKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcgdG8gbWFrZSBpdCBYTUwgcGFyc2VyIGZyaWVuZGx5LgotCSAqIAotCSAqIEBwYXJhbSBzdHIKLQkgKiAgICAgICAgICAgIFRoZSBzb3VyY2Ugc3RyaW5nLgotCSAqIEBwYXJhbSBpZ25vcmVDUkxGCi0JICogICAgICAgICAgICBJZiB0cnVlLCBkbyBub3QgZXNjYXBlIHRoZSBDUiBhbmQgTEYgY2hhcmFjdGVycy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0ciwgYm9vbGVhbiBpZ25vcmVDUkxGKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnPCc6Ci0JCQkJc2IuYXBwZW5kKFhNTF9MVCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICc+JzoKLQkJCQlzYi5hcHBlbmQoWE1MX0dUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCS8vIFRoaXMgaXMgdG8gYXZvaWQgdGhlIGRvdWJsZSBlc2NhcGluZyAoc2VlIEJ1Z3ppbGxhIDE3OTkyMSkKLQkJCQlpZiAoIXN0ci5zdGFydHNXaXRoKFhNTF9MVCsicC8iLCBpKSAmJiAhc3RyLnN0YXJ0c1dpdGgoWE1MX0FQT1MsIGkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkmJiAhc3RyLnN0YXJ0c1dpdGgoWE1MX0FNUCwgaSkpCi0JCQkJCXNiLmFwcGVuZChYTUxfQU1QKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICciJzoKLQkJCQlzYi5hcHBlbmQoWE1MX1FVT1QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXNiLmFwcGVuZChYTUxfQVBPUyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdccic6Ci0JCQkJaWYgKGlnbm9yZUNSTEYpCi0JCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJZWxzZQotCQkJCQlzYi5hcHBlbmQoWE1MX0NSKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQlpZiAoaWdub3JlQ1JMRikKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQllbHNlCi0JCQkJCXNiLmFwcGVuZChYTUxfTEYpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFVuZXNjYXBlcyB0aGUgZ2l2ZW4gWE1MIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyCi0JICogICAgICAgICAgICBUaGUgc291cmNlIHN0cmluZy4KLQkgKiBAcmV0dXJuIFRoZSBlc2NhcGVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzdHIuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjaCkgewotCQkJY2FzZSAnJic6Ci0JCQkJaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9MVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCc8Jyk7Ci0JCQkJCWkgKz0gMzsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9HVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCc+Jyk7Ci0JCQkJCWkgKz0gMzsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9BTVAsIGkpKSB7Ci0JCQkJCXNiLmFwcGVuZCgnJicpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfSBlbHNlIGlmIChzdHIuc3RhcnRzV2l0aChYTUxfUVVPVCwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCciJyk7Ci0JCQkJCWkgKz0gNTsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9BUE9TLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoIlwnIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaSArPSA1OwotCQkJCX0gZWxzZSBpZiAoc3RyLnN0YXJ0c1dpdGgoWE1MX0NSLCBpKSkgewotCQkJCQlzYi5hcHBlbmQoJ1xyJyk7Ci0JCQkJCWkgKz0gNDsKLQkJCQl9IGVsc2UgaWYgKHN0ci5zdGFydHNXaXRoKFhNTF9MRiwgaSkpIHsKLQkJCQkJc2IuYXBwZW5kKCdcbicpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2IuYXBwZW5kKGNoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXNiLmFwcGVuZChjaCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBET00gZG9jdW1lbnQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHhtbERvYwotCSAqICAgICAgICAgICAgVGhlIERPTSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCB4bWxEb2MsIE91dHB1dFN0cmVhbSBvdXRwdXQpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG91dHB1dCk7Ci0JCXdyaXRlTm9kZSh4bWxEb2MsICIiLCBvdXQpOyAvLyROT04tTkxTLTEkCi0JCW91dC5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IHRvIHRoZSBQcmludFdyaXRlci4KLQkgKiAKLQkgKiBAcGFyYW0geG1sRG9jCi0JICogICAgICAgICAgICBUaGUgRE9NIGRvY3VtZW50LgotCSAqIEBwYXJhbSBwdwotCSAqICAgICAgICAgICAgVGhlIFByaW50V3JpdGVyIG9iamVjdC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVEb2N1bWVudChEb2N1bWVudCB4bWxEb2MsIFByaW50V3JpdGVyIHB3KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG9zKTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JCS8vIEZJWE1FISBOZWVkIHRvIHNwZWNpZnkgZW5jb2Rpbmc/Ci0JCVN0cmluZyBzID0gb3MudG9TdHJpbmcoKTsKLQkJcHcud3JpdGUocyk7Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIERPTSBkb2N1bWVudCB0byBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxEb2MKLQkgKiAgICAgICAgICAgIFRoZSBET00gZG9jdW1lbnQuCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZmlsZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZURvY3VtZW50KERvY3VtZW50IHhtbERvYywgU3RyaW5nIHhtbEZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCXhtbEZpbGUpKTsKLQkJd3JpdGVOb2RlKHhtbERvYywgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJb3V0LmZsdXNoKCk7Ci0JCW91dC5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiBYTUwgc3RyaW5nIHRvIHRoZSBnaXZlbiBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBUaGUgWE1MIGZpbGUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1ciB3aGlsZSBhY2Nlc3NpbmcgdGhlIG91dHB1dCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVEb2N1bWVudChTdHJpbmcgeG1sU3RyLCBTdHJpbmcgeG1sRmlsZSkKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJeG1sRmlsZSkpOwotCQlvdXQud3JpdGUoeG1sU3RyLmdldEJ5dGVzKCkpOwotCQlvdXQuZmx1c2goKTsKLQkJb3V0LmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBnaXZlbiBET00gdHJlZSBub2RlIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBUaGUgRE9NIG5vZGUuCi0JICogQHBhcmFtIGluZGVudAotCSAqICAgICAgICAgICAgVGhlIHN0cmluZyBpbmRlbnRhdGlvbiAoY29udGFpbmluZyBzcGFjZSBjaGFyYWN0ZXJzKS4KLQkgKiBAcGFyYW0gb3V0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHN0cmVhbS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VyIHdoaWxlIGFjY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTm9kZShOb2RlIG5vZGUsIFN0cmluZyBpbmRlbnQsIERhdGFPdXRwdXRTdHJlYW0gb3V0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRleHQ7Ci0KLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0JCQkvLyBXcml0ZSB0aGUgWE1MIGZpbGUgc2lnbmF0dXJlLgotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKFhNTF9ERUNMQVJBVElPTikpOwotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IG5vZGVzID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQl3cml0ZU5vZGUobm9kZXMuaXRlbShpKSwgIiIsIG91dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFOgotCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoaW5kZW50ICsgIjwiICsgbmFtZSkpOyAvLyROT04tTkxTLTEkCi0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgYXR0ck5vZGUgPSBhdHRycy5pdGVtKGkpOwotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiICIgKyBhdHRyTm9kZS5nZXROb2RlTmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgIj1cIiIgKyBlc2NhcGUoYXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCkpICsgIlwiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQkvLyBJdGVyYXRlIHRocm91Z2ggZWFjaCBjaGlsZCBub2Rlcy4KLQkJCU5vZGVMaXN0IGNoaWxkTm9kZXMgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCWlmIChjaGlsZE5vZGVzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQl3cml0ZU5vZGUoY2hpbGROb2Rlcy5pdGVtKGkpLCBpbmRlbnQsIG91dCk7Ci0JCQkJfQotCQkJfQotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGluZGVudCArICI8LyIgKyBuYW1lICsgIj4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlKENSTEZfQllURVMpOwotCi0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuVEVYVF9OT0RFOgotCQkJdGV4dCA9IFN0clV0aWwucmVtb3ZlV2hpdGVTcGFjZUNoYXJzKG5vZGUuZ2V0Tm9kZVZhbHVlKCkpOwotCQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKGVzY2FwZSh0ZXh0KSkpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKLQkJCXRleHQgPSBTdHJVdGlsLnJlbW92ZVdoaXRlU3BhY2VDaGFycyhub2RlLmdldE5vZGVWYWx1ZSgpKTsKLQkJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCW91dC53cml0ZShTdHJVdGlsLmdldFVURjhCeXRlcygiPCFbQ0RBVEFbIikpOyAvLyROT04tTkxTLTEkCi0JCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKHRleHQpKTsKLQkJCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIl1dPiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW91dC53cml0ZShDUkxGX0JZVEVTKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0JCQlvdXQud3JpdGUoU3RyVXRpbC5nZXRVVEY4Qnl0ZXMoIjw/IiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiAiICsgbm9kZS5nZXROb2RlVmFsdWUoKSArICI/PiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlvdXQud3JpdGUoQ1JMRl9CWVRFUyk7Ci0JCQlicmVhazsKLQotCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgotCQkJb3V0LndyaXRlKFN0clV0aWwuZ2V0VVRGOEJ5dGVzKCImIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBsb2NhdGlvbiB3aGVyZSB0aGUgZ2l2ZW4gU0FYIGV4Y2VwdGlvbiBvY2N1cnJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgVGhlIFNBWCBwYXJzZSBleGNlcHRpb24uCi0JICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIGxvY2F0aW9uIHdoZXJlIHRoZSBleGNlcHRpb24KLQkgKiAgICAgICAgIG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2F0aW9uT2ZFeGNlcHRpb24oU0FYUGFyc2VFeGNlcHRpb24gZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgicm93ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChlLmdldExpbmVOdW1iZXIoKSk7Ci0JCXNiLmFwcGVuZCgiLCBjb2wgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGUuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCVN0cmluZyBzeXN0ZW1JZCA9IGUuZ2V0U3lzdGVtSWQoKTsKLQkJaWYgKHN5c3RlbUlkICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IHN5c3RlbUlkLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlzeXN0ZW1JZCA9IHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJfQotCQkJc2IuYXBwZW5kKCIgb2YgWE1MIGRvY3VtZW50ICIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoc3lzdGVtSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBsb2FkWG1sKEZpbGUgZmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Ci0JCQkJLm5ld0luc3RhbmNlKCk7Ci0JCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gYnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0KLQkJcmV0dXJuIGJ1aWxkZXIucGFyc2UoZmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQotCQkJCS5uZXdJbnN0YW5jZSgpOwotCQlEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IGJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQlyZXR1cm4gYnVpbGRlci5uZXdEb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIHRleHQgb2YgYSBsZWFmIG5vZGUsIHdpdGhvdXQgY2hpbGQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0KEVsZW1lbnQgdGFnKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdGFnLnRvU3RyaW5nKCk7Ci0JCWludCBpID0gdGV4dC5pbmRleE9mKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGogPSB0ZXh0Lmxhc3RJbmRleE9mKCI8LyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpIDwgMCB8fCBqIDwgMCB8fCBqIDwgaSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoaSArIDEsIGopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENoaWxkVGV4dChFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlFbGVtZW50IGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCh0YWcsIGNoaWxkVGFnTmFtZSk7Ci0JCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0Tm9kZVRleHQoY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBFbGVtZW50IGdldEZpcnN0Q2hpbGQoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWdOYW1lKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JfQotCi0JLyoqCi0JICogaXRlcmF0b3Igb2YgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcmV0dXJuIEl0ZXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvciBjaGlsZEl0ZXJhdG9yKEVsZW1lbnQgdGFnKSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gdGFnLmdldENoaWxkTm9kZXMoKTsKLQotCQkvLyBOb2RlTGlzdCBjb250YWlucyBubyBFbGVtZW50IG5vZGVzIHN1Y2ggYXMgdGV4dCBub2RlcywgaWdub3JlIHRob3NlCi0JCUxpc3Q8Tm9kZT4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PE5vZGU+KCk7Ci0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgc2l6ZSA9IG5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlpbnQgY3VycmVudEluZGV4ID0gLTE7Ci0KLQkJaW50IHNpemUgPSAwOwotCi0JCU5vZGVMaXN0IG5vZGVzID0gbnVsbDsKLQotCQlwdWJsaWMgTm9kZUl0ZXJhdG9yKE5vZGVMaXN0IG5vZGVzKSB7Ci0JCQl0aGlzLm5vZGVzID0gbm9kZXM7Ci0JCQlpZiAobm9kZXMgIT0gbnVsbCkKLQkJCQlzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkvLyBEbyBub3RoaW5nLCB0aGlzIGlzIGEgcmVhZG9ubHkgaXRlcmF0b3IuCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGN1cnJlbnRJbmRleCArIDEgPCBzaXplOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKGhhc05leHQoKSkgewotCQkJCXJldHVybiBub2Rlcy5pdGVtKCsrY3VycmVudEluZGV4KTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIHRhZwotCSAqIEByZXR1cm4gSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGNoaWxkSXRlcmF0b3IoRWxlbWVudCB0YWcsIFN0cmluZyBjaGlsZFRhZ05hbWUpIHsKLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoY2hpbGRUYWdOYW1lKTsKLQkJcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3Iobm9kZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgaW1tZWRpYXRlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIGdpdmVuIHRhZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiBAcmV0dXJuIGxpc3Qgb2Yge0BsaW5rIEVsZW1lbnR9IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8RWxlbWVudD4gZ2V0Q2hpbGRFbGVtZW50c0J5VGFnTmFtZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0YWdOYW1lKSB7CQotCQlMaXN0PEVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxFbGVtZW50PigpOwotCQlOb2RlTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbGlzdC5nZXRMZW5ndGgoKTsgCi0JCWlmKHNpemUgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCQlpZihub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQlFbGVtZW50IGUgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJaWYoZS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ05hbWUpKSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBlbGVtZW50IHdpdGggdGhlIGdpdmVuIHRhZyBuYW1lIGluIHRoZSBpbW1lZGlhdGUgY2hpbGQgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Rmlyc3RDaGlsZEVsZW1lbnRCeVRhZ05hbWUoTm9kZSBlbGVtZW50LCBTdHJpbmcgdGFnTmFtZSkgewotCQlOb2RlTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gbGlzdC5nZXRMZW5ndGgoKTsgCi0JCWlmKHNpemUgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCU5vZGUgbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCQlpZihub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQlFbGVtZW50IGUgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJaWYoZS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ05hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9aaXBVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1ppcFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNzMwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3V0aWxzL1ppcFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHppcCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBaaXBVdGlsIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB6aXAgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gemlwRmlsZVBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIHRhcmdldCB6aXAgZmlsZQotCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlcyBhbmQgc3ViCi0JICogICAgICAgICAgICBkaXJlY3RvcmllcyB0byBiZSB6aXBwZWQKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjcmVhdGluZyB0aGUgemlwIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlWmlwRmlsZShTdHJpbmcgemlwRmlsZVBhdGgsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJWmlwT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlvdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKAotCQkJCQl6aXBGaWxlUGF0aCkpOwotCQkJRmlsZSBjb250ZW50RGlyID0gbmV3IEZpbGUoY29udGVudFBhdGgpOwotCQkJcG9wdWxhdGVaaXBGaWxlKG91dCwgY29udGVudERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgY29udGVudERpciwKLQkJCQkJbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG91dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0LmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyBhIHppcCBmaWxlIHdpdGggZGlyZWN0b3JpZXMgYW5kIGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBvdXQKLQkgKiAgICAgICAgICAgIGEgemlwIGZpbGUgb3V0cHV0IHN0cmVhbQotCSAqIEBwYXJhbSByb290UGF0aAotCSAqICAgICAgICAgICAgYSByb290IHBhdGggdGhhdCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHJlbGF0aXZlIHBhdGhzIG9mIHRoZQotCSAqICAgICAgICAgICAgemlwIGNvbnRlbnQKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBmaWxlIG9yIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcG9wdWxhdGVaaXBGaWxlKFppcE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyByb290UGF0aCwKLQkJCUZpbGUgZmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXBvcHVsYXRlWmlwRmlsZShvdXQsIHJvb3RQYXRoLCBmaWxlc1tpXSwgbW9uaXRvcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIGZpbGVQYXRoID0gZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCUZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZVBhdGgpOwotCQkJCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gZmlsZVBhdGgKLQkJCQkJCQkuc3Vic3RyaW5nKHJvb3RQYXRoLmxlbmd0aCgpICsgMSk7Ci0JCQkJCW91dC5wdXROZXh0RW50cnkobmV3IFppcEVudHJ5KHJlbGF0aXZlUGF0aCkpOwotCQkJCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0JCQkJCWludCBsZW47Ci0JCQkJCXdoaWxlICgobGVuID0gaW4ucmVhZChidWZmZXIpKSA+IDApIHsKLQkJCQkJCW91dC53cml0ZShidWZmZXIsIDAsIGxlbik7Ci0JCQkJCX0KLQkJCQkJb3V0LmNsb3NlRW50cnkoKTsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdXRpbHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMTZiYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi91dGlscy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBjb21tb24gY2xpcGJvYXJkLCBmaWxlLCBJMThOLCBpbWFnZSwgbmV0d29ya2luZywgc3RyaW5nIG1hbmlwdWxhdGlvbiBhbmQgdGhyZWFkaW5nIHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL0Fic3RyYWN0U0FYUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9BYnN0cmFjdFNBWFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzkxYTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL0Fic3RyYWN0U0FYUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBTQVggcGFyc2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgYSBzaW5nbGUgWE1MIGZpbGUgb3IgYQotICogZGlyZWN0b3J5IG9mIFhNTCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNBWFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCS8qKgotCSAqIFRoZSBsb2dnZXIgdXNlZCBmb3IgbG9nZ2luZyB3YXJuaW5ncywgZXJyb3JzIGFuZCBleGNlcHRpb25zLgotCSAqLwotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgWE1MIGZpbGUgYmVpbmcgcGFyc2VkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgeG1sRmlsZTsKLQotCS8qKgotCSAqIFRoZSBTdHJpbmcgYnVmZmVyIGZvciBhY2N1bXVsYXRpbmcgdGV4dC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHN0ckJ1ZjsKLQotCS8qKgotCSAqIFRoZSBYTUwgdmFsaWRhdGluZyBmbGFnLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW5nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdFNheFBhcnNlcjwvY29kZT4gZ2l2ZW4gdGhlIHZhbGlkYXRpbmcgZmxhZy4KLQkgKiAKLQkgKiBAcGFyYW0gbG9nZ2VyCi0JICogICAgICAgICAgICBUaGUgbG9nZ2VyIGZvciBsb2dnaW5nIHdhcm5pbmdzIGFuZCBlcnJvcnMuCi0JICogQHBhcmFtIHZhbGlkYXRpbmcKLQkgKiAgICAgICAgICAgIElmIHRydWUsIHZhbGlkYXRlIHRoZSBYTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0U0FYUGFyc2VyKExvZ2dlciBsb2dnZXIsIGJvb2xlYW4gdmFsaWRhdGluZykgewotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQkJdGhpcy52YWxpZGF0aW5nID0gdmFsaWRhdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIFhNTCBkaXJlY3Rvcnkgb3IgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0geG1sUGF0aAotCSAqICAgICAgICAgICAgVGhlIFhNTCBkaXJlY3Rvcnkgb3IgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgeG1sUGF0aCkgewotCQlTdHJpbmcgcGF0aE5hbWUgPSBTdHJVdGlsLnJlcGxhY2UoeG1sUGF0aCwgIiUyMCIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlGaWxlIHBhdGggPSBuZXcgRmlsZShwYXRoTmFtZSk7Ci0JCUZpbGVbXSBmaWxlcyA9IHBhdGguaXNGaWxlKCkgPyBuZXcgRmlsZVtdIHsgcGF0aCB9IDogcGF0aC5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIWZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcnNlRmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZUZpbGUoKSk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKLQkJCQkJCQlsb2dnZXIKLQkJCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCQkJIkZhaWxlZCB0byBwYXJzZSBcIiIgKyBmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSArICciJywgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUZpbGUoRmlsZSB4bWxGaWxlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQkvLyBDcmVhdGUgdGhlIFNBWCBwYXJzZXIgZmFjdG9yeS4KLQkJU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQkJLy8gU2V0IHRoZSBYTUwgdmFsaWRhdGluZyBmbGFnLgotCQlzcGYuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKLQotCQkvLyBDcmVhdGUgdGhlIFNBWCBwYXJzZXIuCi0JCVNBWFBhcnNlciBzYXhQYXJzZXIgPSBzcGYubmV3U0FYUGFyc2VyKCk7Ci0KLQkJLy8gR2V0IHRoZSBTQVggWE1MIHJlYWRlci4KLQkJWE1MUmVhZGVyIHhtbFJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQotCQkvLyBTZXQgdGhlIFNBWCBwYXJzZXIgaGFuZGxlcnMgdG8gdGhpcyBjbGFzcy4KLQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOwotCQl4bWxSZWFkZXIuc2V0RXJyb3JIYW5kbGVyKHRoaXMpOwotCi0JCS8vIEluc3RydWN0IHRoZSBTQVggcGFyc2VyIHRvIHBhcnNlIHRoZSBnaXZlbiBYTUwgZmlsZS4KLQkJdGhpcy54bWxGaWxlID0geG1sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJeG1sUmVhZGVyLnBhcnNlKE5ldFV0aWwuZ2V0VXJpKHhtbEZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgWE1MIHBhcnNlciBzdGFydHMgdG8gcGFyc2UgdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB7Ci0JCXN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgdGhlIFhNTCBwYXJzZXIgZW5jb3VudGVycyB0aGUgY2hhcmFyYWN0ZXIgZGF0YSB3aXRoaW4gYQotCSAqIHRleHQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWZmZXIsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdHJCdWYuYXBwZW5kKGJ1ZmZlciwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNlciBzdGFydHMgdG8gcGFyc2UgZWFjaCBuZXcgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCVN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKTsKLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIHRoZSBYTUwgcGFyc2VyIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUgYW4gZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbmRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlTdHJpbmcgcW5hbWUpOwotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBTQVggcGFyc2luZyB3YXJuaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGxvZ2dlciAhPSBudWxsKSB7Ci0JCQlsb2dnZXIKLQkJCQkJLmxvZ1dhcm5pbmcoIlNBWCBwYXJzaW5nIHdhcm5pbmcgZW5jb3VudGVyZWQgYXQgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBYTUxVdGlsLmdldExvY2F0aW9uT2ZFeGNlcHRpb24oZSkKLQkJCQkJCQkrICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIFNBWCBwYXJzaW5nIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCWlmIChsb2dnZXIgIT0gbnVsbCkgewotCQkJbG9nZ2VyCi0JCQkJCS5sb2dFcnJvcigiU0FYIHBhcnNpbmcgZXJyb3IgZW5jb3VudGVyZWQgYXQgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBYTUxVdGlsLmdldExvY2F0aW9uT2ZFeGNlcHRpb24oZSkKLQkJCQkJCQkrICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIFNBWCBub24tcmVjb3ZlcmFibGUgZXJyb3IgYW5kIGV4aXRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBUaGUgU0FYIHBhcnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAobG9nZ2VyICE9IG51bGwpIHsKLQkJCWxvZ2dlcgotCQkJCQkubG9nRXJyb3IoIlNBWCBwYXJzaW5nIGZhdGFsIGVycm9yIGVuY291bnRlcmVkIGF0ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgWE1MVXRpbC5nZXRMb2NhdGlvbk9mRXhjZXB0aW9uKGUpCi0JCQkJCQkJKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IFhNTCBmaWxlIHRoYXQgaXMgYmVpbmcgcGFyc2VkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIFhNTCBmaWxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MRmlsZSgpIHsKLQkJcmV0dXJuIHhtbEZpbGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvWFNMVFByb2Nlc3Nvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi94bWwvWFNMVFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODlmNmE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL1hTTFRQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci0KLS8qKgotICogQSB3cmFwcGVyIG92ZXIgdGhlIFhTTFQgcHJvY2Vzc29yIGJ1bmRsZWQgd2l0aCB0aGUgSlJFLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhTTFRQcm9jZXNzb3IgewotCi0JLy8gSWYgdHJ1ZSwgY2FjaGUgdGhlIGNvbXBpbGVkIHRoZSBYU0wgdHJhbnNmb3JtZXIgd2l0aCB0aGUgY29tcGlsZWQgWFNMCi0JLy8gdGVtcGxhdGVzLgotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FjaGVYU0w7Ci0KLQkvLyBDYWNoZXMgdGhlIFhTTCB0cmFuc2Zvcm1lcnMuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ2FjaGVkVHJhbnNmb3JtZXI+IHRyYW5zZm9ybWVyQ2FjaGU7Ci0KLQlzdGF0aWMgewotCQlTdHJpbmcgY2FjaGVYU0xQcm9wZXJ0eSA9IENvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKAotCQkJCSJjYWNoZVhTTCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjYWNoZVhTTFByb3BlcnR5ICE9IG51bGwgJiYgIWNhY2hlWFNMUHJvcGVydHkuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWNhY2hlWFNMID0gQm9vbGVhbi5nZXRCb29sZWFuKGNhY2hlWFNMUHJvcGVydHkpOwotCQl9IGVsc2UgewotCQkJY2FjaGVYU0wgPSB0cnVlOwotCQl9Ci0JCWlmIChjYWNoZVhTTCkgewotCQkJdHJhbnNmb3JtZXJDYWNoZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2FjaGVkVHJhbnNmb3JtZXI+KCk7Ci0JCX0KLQotCQkvLyBJbmNyZWFzZSB0aGUgZW50aXR5IGV4cGFuc2lvbiBsaW5lIGxpbWl0IHRvIGhhbmRsZSBhIGxhcmdlciBudW1iZXIgb2YKLQkJLy8gWE1MIGVudGl0aWVzLgotCQlTeXN0ZW0uc2V0UHJvcGVydHkoImVudGl0eUV4cGFuc2lvbkxpbWl0IiwgIjEwMDAwMDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBwcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nCi0JICogaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgWFNMVFByb2Nlc3NvcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc291cmNlLCBYTUwgc291cmNlLCB0YXJnZXQKLQkgKiBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xTb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc291cmNlLgotCSAqIEBwYXJhbSB4bWxTb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc291cmNlLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBlbmNvZGluZwotCSAqICAgICAgICAgICAgVGhlIHRhcmdldCBlbmNvZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFNvdXJjZSB4c2xTb3VyY2UsIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlXcml0ZXIgb3V0cHV0LCBQcm9wZXJ0aWVzIHBhcmFtcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHhzbFNvdXJjZSAhPSBudWxsICYmIHhtbFNvdXJjZSAhPSBudWxsKSB7Ci0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG51bGw7Ci0JCQlTdHJpbmcgeHNsRmlsZSA9IHhzbFNvdXJjZS5nZXRTeXN0ZW1JZCgpOwotCQkJaWYgKGNhY2hlWFNMICYmIHhzbEZpbGUgIT0gbnVsbCkgewotCQkJCUNhY2hlZFRyYW5zZm9ybWVyIGNhY2hlZFRyYW5zZm9ybWVyID0gbnVsbDsKLQkJCQlzeW5jaHJvbml6ZWQgKHRyYW5zZm9ybWVyQ2FjaGUpIHsKLQkJCQkJY2FjaGVkVHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckNhY2hlLmdldCh4c2xGaWxlKTsKLQkJCQkJaWYgKGNhY2hlZFRyYW5zZm9ybWVyID09IG51bGwpIHsKLQkJCQkJCVRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Ci0JCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJdHJhbnNmb3JtZXIgPSBmYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHhzbFNvdXJjZSk7Ci0JCQkJCQl0cmFuc2Zvcm1lckNhY2hlLnB1dCh4c2xGaWxlLCBuZXcgQ2FjaGVkVHJhbnNmb3JtZXIoCi0JCQkJCQkJCXRyYW5zZm9ybWVyLCBwYXJhbXMpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNhY2hlZFRyYW5zZm9ybWVyLnNldFBhcmFtcyhwYXJhbXMpOwotCQkJCQkJdHJhbnNmb3JtZXIgPSBjYWNoZWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlUcmFuc2Zvcm1lckZhY3RvcnkgZmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJCXRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih4c2xTb3VyY2UpOwotCi0JCQkJaWYgKHBhcmFtcyAhPSBudWxsICYmIHBhcmFtcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpID0gcGFyYW1zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJCQkJU3RyaW5nIHBhcmFtVmFsdWUgPSBwYXJhbXMuZ2V0UHJvcGVydHkocGFyYW1OYW1lKTsKLQkJCQkJCXRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcihwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZW5jb2RpbmcgIT0gbnVsbCAmJiBlbmNvZGluZy5sZW5ndGgoKSA+IDApIHsKLQkJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eSgiZW5jb2RpbmciLCBlbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoImVuY29kaW5nIiwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKHhtbFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChvdXRwdXQpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzb3VyY2UsIFhNTCBzb3VyY2UsIHRhcmdldAotCSAqIG91dHB1dCBhbmQgZW5jb2RpbmcuCi0JICogCi0JICogQHBhcmFtIHhzbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzb3VyY2UuCi0JICogQHBhcmFtIHhtbFNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU291cmNlIHhzbFNvdXJjZSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xTb3VyY2UsIHhtbFNvdXJjZSwgb3V0cHV0LCBudWxsLCBlbmNvZGluZyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc291cmNlLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSB4c2xJbnB1dCA9IGdldFhzbElucHV0U3RyZWFtKHhzbFVyaSk7Ci0JCWlmICh4c2xJbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJlYW1Tb3VyY2UgeHNsU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4c2xJbnB1dCk7Ci0JCQl4c2xTb3VyY2Uuc2V0U3lzdGVtSWQobmV3IEZpbGUoeHNsVXJpKSk7Ci0JCQl0cmFuc2Zvcm0oeHNsU291cmNlLCB4bWxTb3VyY2UsIG91dHB1dCwgcGFyYW1zLCBlbmNvZGluZyk7Ci0JCQl0cnkgewotCQkJCXhzbElucHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc291cmNlLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU291cmNlIHhtbFNvdXJjZSwKLQkJCVdyaXRlciBvdXRwdXQsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFNvdXJjZSwgb3V0cHV0LCBudWxsLCBlbmNvZGluZyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24uCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgV3JpdGVyIG91dHB1dCwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSB4c2xJbnB1dCA9IGdldFhzbElucHV0U3RyZWFtKHhzbFVyaSk7Ci0JCWlmICh4c2xJbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJlYW1Tb3VyY2UgeHNsU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4c2xJbnB1dCk7Ci0JCQl4c2xTb3VyY2Uuc2V0U3lzdGVtSWQobmV3IEZpbGUoeHNsVXJpKSk7Ci0KLQkJCWJ5dGVbXSB4bWwgPSB4bWxTdHIuZ2V0Qnl0ZXMoInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHhtbElucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbCk7Ci0JCQlTdHJlYW1Tb3VyY2UgeG1sU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSh4bWxJbnB1dCk7Ci0KLQkJCXRyYW5zZm9ybSh4c2xTb3VyY2UsIHhtbFNvdXJjZSwgb3V0cHV0LCBwYXJhbXMsIGVuY29kaW5nKTsKLQotCQkJdHJ5IHsKLQkJCQl4c2xJbnB1dC5jbG9zZSgpOwotCQkJCXhtbElucHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgV3JpdGVyIG91dHB1dCwKLQkJCVN0cmluZyBlbmNvZGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFN0ciwgb3V0cHV0LCBudWxsLCBlbmNvZGluZyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nLAotCSAqIHRhcmdldCBvdXRwdXQgYW5kIGVuY29kaW5nLgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzdHJpbmcuCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgZmlsZS4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIFRoZSB0YXJnZXQgZW5jb2RpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTdHJpbmcgeG1sU3RyLCBGaWxlIGZpbGUsCi0JCQlQcm9wZXJ0aWVzIHBhcmFtcywgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZVdyaXRlciBvdXRwdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlKTsKLQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIG91dHB1dCwgcGFyYW1zLCBlbmNvZGluZyk7Ci0JCQl0cnkgewotCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZywKLQkgKiB0YXJnZXQgb3V0cHV0IGFuZCBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgb3V0cHV0IGZpbGUuCi0JICogQHBhcmFtIGVuY29kaW5nCi0JICogICAgICAgICAgICBUaGUgdGFyZ2V0IGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwgRmlsZSBmaWxlLAotCQkJU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBmaWxlLCBudWxsLCBlbmNvZGluZyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc291cmNlCi0JICogYW5kIHRhcmdldCBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHNvdXJjZS4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFNvdXJjZSB4bWxTb3VyY2UsCi0JCQlQcm9wZXJ0aWVzIHBhcmFtcywgV3JpdGVyIG91dHB1dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFNvdXJjZSwgb3V0cHV0LCBwYXJhbXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHNvdXJjZQotCSAqIGFuZCB0YXJnZXQgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldCBVUkkuCi0JICogQHBhcmFtIHhtbFN0cgotCSAqICAgICAgICAgICAgVGhlIFhNTCBzb3VyY2UuCi0JICogQHBhcmFtIG91dHB1dAotCSAqICAgICAgICAgICAgVGhlIG91dHB1dCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYW5zZm9ybShTdHJpbmcgeHNsVXJpLCBTb3VyY2UgeG1sU291cmNlLCBXcml0ZXIgb3V0cHV0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYW5zZm9ybSh4c2xVcmksIHhtbFNvdXJjZSwgb3V0cHV0LCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uIGdpdmVuIHRoZSBYU0wgc3R5bGVzaGVldCBVUkksIFhNTCBzdHJpbmcKLQkgKiBhbmQgdGFyZ2V0IG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqIEBwYXJhbSB4bWxTdHIKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgc3RyaW5nLgotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLgotCSAqIEBwYXJhbSBvdXRwdXQKLQkgKiAgICAgICAgICAgIFRoZSBvdXRwdXQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oU3RyaW5nIHhzbFVyaSwgU3RyaW5nIHhtbFN0ciwKLQkJCVByb3BlcnRpZXMgcGFyYW1zLCBXcml0ZXIgb3V0cHV0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBvdXRwdXQsIHBhcmFtcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbiBnaXZlbiB0aGUgWFNMIHN0eWxlc2hlZXQgVVJJLCBYTUwgc3RyaW5nCi0JICogYW5kIHRhcmdldCBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIFdyaXRlciBvdXRwdXQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBvdXRwdXQsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZwotCSAqIGFuZCB0YXJnZXQgb3V0cHV0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsCi0JCQlQcm9wZXJ0aWVzIHBhcmFtcywgRmlsZSBmaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJhbnNmb3JtKHhzbFVyaSwgeG1sU3RyLCBmaWxlLCBwYXJhbXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBYU0wgdHJhbnNmb3JtYXRpb24gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSSwgWE1MIHN0cmluZwotCSAqIGFuZCB0YXJnZXQgb3V0cHV0IGZpbGUuCi0JICogCi0JICogQHBhcmFtIHhzbFVSSQotCSAqICAgICAgICAgICAgVGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiBAcGFyYW0geG1sU3RyCi0JICogICAgICAgICAgICBUaGUgWE1MIHN0cmluZy4KLQkgKiBAcGFyYW0gb3V0cHV0Ci0JICogICAgICAgICAgICBUaGUgb3V0cHV0IHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmb3JtKFN0cmluZyB4c2xVcmksIFN0cmluZyB4bWxTdHIsIEZpbGUgZmlsZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQl0cmFuc2Zvcm0oeHNsVXJpLCB4bWxTdHIsIGZpbGUsIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFhTTCBpbnB1dCBzdHJlYW0gZ2l2ZW4gdGhlIFhTTCBzdHlsZXNoZWV0IFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0geHNsVVJJCi0JICogICAgICAgICAgICBUaGUgWFNMIHN0eWxlc2hlZXQgVVJJLgotCSAqLwotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFhzbElucHV0U3RyZWFtKFN0cmluZyB4c2xVcmkpIHsKLQkJSW5wdXRTdHJlYW0geHNsSW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJeHNsSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHhzbFVyaSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoeHNsSW5wdXQgPT0gbnVsbCkgewotCQkJCXhzbElucHV0ID0gWFNMVFByb2Nlc3Nvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpCi0JCQkJCQkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh4c2xVcmkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB4c2xJbnB1dDsKLQl9Ci0KLX0KLQotLyoqCi0gKiBBIGNhY2hlZCBYU0wgVHJhbnNmb3JtZXIgb2JqZWN0LgotICovCi1jbGFzcyBDYWNoZWRUcmFuc2Zvcm1lciB7Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotCXByaXZhdGUgUHJvcGVydGllcyBwYXJhbXM7Ci0KLQlwdWJsaWMgQ2FjaGVkVHJhbnNmb3JtZXIoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsIFByb3BlcnRpZXMgcGFyYW1zKSB7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJc2V0UGFyYW1zKHBhcmFtcyk7Ci0JfQotCi0JcHVibGljIFRyYW5zZm9ybWVyIGdldFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gdHJhbnNmb3JtZXI7Ci0JfQotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UGFyYW1zKCkgewotCQlyZXR1cm4gcGFyYW1zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmFtcyhQcm9wZXJ0aWVzIHBhcmFtcykgewotCQlpZiAocGFyYW1zICE9IHRoaXMucGFyYW1zKSB7Ci0JCQl0cmFuc2Zvcm1lci5jbGVhclBhcmFtZXRlcnMoKTsKLQkJCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpID0gcGFyYW1zLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBwYXJhbU5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCQlTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtcy5nZXRQcm9wZXJ0eShwYXJhbU5hbWUpOwotCQkJCXRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcihwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOwotCQkJfQotCQkJdGhpcy5wYXJhbXMgPSBwYXJhbXM7CQkJCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24vc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24veG1sL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjYTc0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3htbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBYTUwgYW5kIFhTTFQgcHJvY2Vzc2luZyBzZXJ2aWNlcy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjllODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMjlhMTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW50ZXJuYWwuaW1wb3J0aW5nLAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDk4NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzliOTFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi1wbHVnaW5OYW1lPUVQRiBEYXRhIEV4Y2hhbmdlIFBsdWctaW4KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL2ltcG9ydGluZy9MaWJyYXJ5U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTQzYWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmludGVybmFsLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogTGlicmFyeSBzZXJ2aWNlIGZvciBpbXBvcnRpbmcgZXh0ZXJuYWwgbGlicmFyeS9wbHVnaW5zIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeVNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5U2VydmljZSBJTlNUQU5DRSA9IG5ldyBMaWJyYXJ5U2VydmljZUltcGwoKTsKLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgTWV0aG9kUGx1Z2luIGFuZCBhZGQgdG8gdGhlIGxpYnJhcnksIHBlcmZvcm0gaW5pdGlhbGl6YXRpb24gYXMgbmVlZGVkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbiAKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGNyZWF0ZVBsdWdpbihTdHJpbmcgbmFtZSwgU3RyaW5nIGd1aWQpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgTWV0aG9kUGx1Z2luIGFuZCBhZGQgdG8gdGhlIGxpYnJhcnksIHBlcmZvcm0gaW5pdGlhbGl6YXRpb24gYXMgbmVlZGVkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEBwYXJhbSBvcHRpb25zCi0JICogQHJldHVybiBNZXRob2RQbHVnaW4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luIGNyZWF0ZVBsdWdpbihTdHJpbmcgbmFtZSwgU3RyaW5nIGd1aWQsIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JCi0JLyoqCi0JICogY3JlYXRlIGEgTWV0aG9kQ29uZmlndXJhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBwbHVnaW4gc2VydmljZSBmb3IgdGhlIHNwZWNpZmllZCBwbHVnaW4KLQkgKiBAcGFyYW0gcGx1Z2luIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gUGx1Z2luU2VydmljZQotCSAqLwotCXB1YmxpYyBQbHVnaW5TZXJ2aWNlIGNyZWF0ZVBsdWdpblNlcnZpY2UoTWV0aG9kUGx1Z2luIHBsdWdpbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvUGx1Z2luU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvUGx1Z2luU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU1NjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBQbHVnaW4gc2VydmljZSBmb3IgaW1wb3J0aW5nIGV4dGVybmFsIHBsdWdpbiBkYXRhIGludG8gdGhlIGN1cnJlbnQgbGlicmFyeQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBQbHVnaW5TZXJ2aWNlIHsKLQotCXB1YmxpYyBDb250ZW50UGFja2FnZSBnZXRDb250ZW50UGFja2FnZVJvb3QoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIERpc2NpcGxpbmUgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IERpc2NpcGxpbmVzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gRGlzY2lwbGluZQotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIERpc2NpcGxpbmVHcm91cGluZyBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgRGlzY2lwbGluZXMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBEaXNjaXBsaW5lR3JvdXBpbmcKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgVG9vbCBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgVG9vbHMgcGFja2FnZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBUb29sCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgRG9tYWluIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBEb21haW5zIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gRG9tYWluCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIFdvcmtQcm9kdWN0VHlwZSBvYmplY3QgYWRkIGFkZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgV29ya1Byb2R1Y3RUeXBlcyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFdvcmtQcm9kdWN0VHlwZQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBSb2xlU2V0IG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBSb2xlU2V0cyBwYWNrYWdlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFJvbGVTZXQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBSb2xlU2V0R3JvdXBpbmcgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IFJvbGVTZXRzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUm9sZVNldEdyb3VwaW5nCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIEN1c3RvbUNhdGVnb3J5IG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBDdXN0b21DYXRlZ29yaWVzIHBhY2thZ2UKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50KTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCBhZGQgYWRkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBDYXBhYmlsaXR5UGF0dGVybnMgcGFja2FnZQotCSAqIHBlcmZvcm0gb3RoZXIgaW5pdGlhbGl6YXRpb25zIGFzIG5lZWRlZCwgc3VjaCBhcyBjcmVhdGUgdGhlIGNvbnRhaW5pbmcgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gUHJvY2Vzc1NlcnZpY2UgYSBQcm9jZXNzU2VydmljZSB0aGF0IGNvbnRhaW5zIHRoZSBjcmVhdGVkIENhcGFiaWxpdHlQYXR0ZXJuCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKE1ldGhvZENvbmZpZ3VyYXRpb24gZGVmYXVsdENvbmZpZyk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0IGFkZCBhZGQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IERlbGl2ZXJ5UHJvY2Vzc2VzIHBhY2thZ2UuCi0JICogcGVyZm9ybSBvdGhlciBpbml0aWFsaXphdGlvbnMgYXMgbmVlZGVkLCBzdWNoIGFzIGNyZWF0ZSB0aGUgY29udGFpbmluZyBQcm9jZXNzQ29tcG9uZW50LgotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBQcm9jZXNzU2VydmljZSBhIFByb2Nlc3NTZXJ2aWNlIHRoYXQgY29udGFpbnMgdGhlIGNyZWF0ZWQgRGVsaXZlcnlQcm9jZXNzCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKTsKLQotCS8qKgotCSAqIGNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZSBhcyB0aGUgY2hpbGQgb2YgdGhlIGludGVybmFsIHJvb3QgY29udGVudCBwYWNrYWdlLAotCSAqIEByZXR1cm4gQ29udGVudFBhY2thZ2VTZXJ2aWNlIGEgQ29udGVudFBhY2thZ2VTZXJ2aWNlIHRoYXQgY29udGFpbnMgdGhlIGNyZWF0ZWQgQ29udGVudFBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IGNoaWxkIHBhY2thZ2UKLQkgKiBAcmV0dXJuIENvbnRlbnRQYWNrYWdlU2VydmljZSBhIENvbnRlbnRQYWNrYWdlU2VydmljZSBmb3IgdGhlIGNyZWF0ZWQgcGFja2FnZQotCSAqLwotCS8vcHVibGljIENvbnRlbnRQYWNrYWdlIGNyZWF0ZUNoaWxkUGFja2FnZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBPdXRjb21lIGNyZWF0ZU91dGNvbWUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydChDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgUm9hZG1hcCBjcmVhdGVSb2FkbWFwKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFJvbGUgY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0JcHVibGljIFRhc2sgY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZShDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbihDb250ZW50UGFja2FnZSBjb250YWluZXIpOwotCXB1YmxpYyBUb29sTWVudG9yIGNyZWF0ZVRvb2xNZW50b3IoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKTsKLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcik7Ci0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBBY3Rpdml0eSBhcyBhIGJyZWFrZG93biBlbGVtZW50IG9mIHRoZSBzZXJ2aWNpbmcgZWxlbWVudC4KLQkgKiBAcmV0dXJuIEFjdGl2aXR5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpOwotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IFBoYXNlIGFzIGEgYnJlYWtkb3duIGVsZW1lbnQgb2YgdGhlIHNlcnZpY2luZyBlbGVtZW50LgotCSAqIEByZXR1cm4gUGhhc2UKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgSXRlcmF0aW9uIGFzIGEgYnJlYWtkb3duIGVsZW1lbnQgb2YgdGhlIHNlcnZpY2luZyBlbGVtZW50LgotCSAqIEByZXR1cm4gSXRlcmF0aW9uCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSk7Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgTWlsZXN0b25lIGFzIGEgYnJlYWtkb3duIGVsZW1lbnQgb2YgdGhlIHNlcnZpY2luZyBlbGVtZW50LgotCSAqIEByZXR1cm4gTWlsZXN0b25lCi0JICovCi0JcHVibGljIE1pbGVzdG9uZSBjcmVhdGVNaWxlc3RvbmUoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSk7Ci0KLQotCS8qKgotCSAqIGFkZCB0aGUgdGFzayBhbmQgY3JlYXRlIHRoZSBicmVha2Rvd24gZWxlbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrCi0JICogY2FsbCB0aGlzIG1ldGhvZCBvbmx5IHdoZW4gdGhlIGNyb3NzIHJlZmVyZW5jZXMgKFJvbGVzLCB3b3JrcHJvZHVjdHMpIG9mIHRoZSBUYXNrIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrVG9BY3Rpdml0eShBY3Rpdml0eSBhY3QsIFRhc2sgZWxlbWVudCk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRUYXNrc1RvQWN0aXZpdHkoQWN0aXZpdHkgYWN0LCBMaXN0IHRhc2tzKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbXBvcnRpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRiYjg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgZGF0YSBleGNoYW5nZSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL0xpYnJhcnlTZXJ2aWNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTU4M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvTGlicmFyeVNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbnRlcm5hbC5pbXBvcnRpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogTGlicmFyeSBzZXJ2aWNlIGZvciBpbXBvcnRpbmcgZXh0ZXJuYWwgbGlicmFyeS9wbHVnaW5zIGludG8gdGhlIGN1cnJlbnQKLSAqIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIFRPRE86IE1lcmdlIHdpdGggb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIExpYnJhcnlTZXJ2aWNlIHsKLQotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUltcGwoKSB7Ci0JfQotCi0JcHVibGljIE1ldGhvZFBsdWdpbiBjcmVhdGVQbHVnaW4oU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVBsdWdpbihuYW1lLCBndWlkLCBudWxsKTsKLQl9Ci0JCQotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlUGx1Z2luKFN0cmluZyBuYW1lLCBTdHJpbmcgZ3VpZCwgTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQlwbHVnaW4uc2V0TmFtZShuYW1lKTsKLQkJcGx1Z2luLnNldEd1aWQoZ3VpZCk7Ci0KLQkJLy8gaW5pdGlhbGl6ZSB0aGUgcGx1Z2luCi0JCXBsdWdpbiA9IE1vZGVsU3RvcmFnZS5pbml0aWFsaXplKHBsdWdpbik7Ci0KLQkJLy8gTVVTVCBzYXZlIHRoZSBwbHVnaW4gYmVmb3JlIHByb2Nlc3MgYW55dGhpbmcgZWxzZQotCQkvLyB0aGlzIG1ldGhvZCBjYWxsIHdpbGwgY2F1c2UgcmVzb3VyY2UgcmVmcmVzaCB3aGljaCBpcyBub3QgZGVzaXJlZCBpbgotCQkvLyB0aGUgaW1wb3J0aW5nIHByb2Nlc3MKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQotCQlsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5hZGQocGx1Z2luKTsKLQkJCi0JCWlmIChvcHRpb25zICE9IG51bGwpIHsKLQkJCU1hcCByZW5hbWVFbGVtZW50TWFwID0gKE1hcCkgb3B0aW9ucy5nZXQoInJlbmFtZUVsZW1lbnRNYXAiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAocmVuYW1lRWxlbWVudE1hcCAhPSBudWxsKSB7Ci0JCQkJZW5zdXJlVW5pcXVlTmFtZShsaWJyYXJ5LCBwbHVnaW4sIHJlbmFtZUVsZW1lbnRNYXApOwkKLQkJCX0KLQkJfQotCQkKLQkJLy8gMTUwMDYzIC0gWE1MIGltcG9ydDogQ1AvRFBzIGFyZSB1bnJlc292bGVkIGFmdGVyIFhNTCBwbHVnaW4gaW1wb3J0IAotCQkvLyBuZWVkIHRvIHNhdmUgdGh0IGxpYnJhcnkgYW5kIHBsdWdpbiByZXNvdXJjZXMgc3BlY2lmaWNhbGx5LCBjYW4ndCB1c2Ugc2F2ZUxpYnJhcnkKLS8vCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWJyYXJ5LCBmYWxzZSwgZmFsc2UpOwotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUobGlicmFyeS5lUmVzb3VyY2UoKSk7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShwbHVnaW4uZVJlc291cmNlKCkpOwotCi0JCS8vIHN0aWxsIG1hcmsgdGhlIHJlc291cmNlIGFzIGRpcnR5Ci0JCWxpYnJhcnkuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCXBsdWdpbi5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlI2NyZWF0ZUNvbmZpZ3VyYXRpb24oU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGd1aWQpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5zZXROYW1lKG5hbWUpOwotCQljb25maWcuc2V0R3VpZChndWlkKTsKLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gbGlicmFyeS5lRGVsaXZlcigpOwotCQl0cnkgewotCQkJbGlicmFyeS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQlsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZChjb25maWcpOwotCQl9IGZpbmFsbHkgewotCQkJbGlicmFyeS5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBwbHVnaW4gc2VydmljZSBmb3IgdGhlIHNwZWNpZmllZCBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBNZXRob2RQbHVnaW4KLQkgKiBAcmV0dXJuIFBsdWdpblNlcnZpY2UKLQkgKi8KLQlwdWJsaWMgUGx1Z2luU2VydmljZSBjcmVhdGVQbHVnaW5TZXJ2aWNlKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIG5ldyBQbHVnaW5TZXJ2aWNlSW1wbChwbHVnaW4pOwotCX0KLQkKLQkvL1RoaXMgaXMgaWRlbnRpY2FsIHRvIExpYnJhcnlJbXBvcnRNYW5hZ2VyLmVuc3VyZVVuaXF1ZU5hbWUKLQkvL1Nob3VsZCBtb3ZlIHRvIHRoaXMgY29kZSB0byBhIGNvbW1vbSBwbGFjZSBzbyB0aGF0IGJvdGggcGFja2FnZXMgY2FuIGFjY2VzcyBpdC4KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZVVuaXF1ZU5hbWUoRU9iamVjdCBvd25lciwgTWV0aG9kRWxlbWVudCBuZXdPYmosIE1hcCByZW5hbWVFbGVtZW50TWFwKSB7Ci0JCWlmIChvd25lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ2xhc3MgY2xzID0gbmV3T2JqLmdldENsYXNzKCk7Ci0JCU1hcCBuYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgb3duZXIuZUNvbnRlbnRzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvbGRPYmogPSBvd25lci5lQ29udGVudHMoKS5nZXQoaSk7Ci0JCQlpZiAob2xkT2JqLmdldENsYXNzKCkgPT0gY2xzICYmIG9sZE9iaiAhPSBuZXdPYmopIHsKLQkJCQlNZXRob2RFbGVtZW50IG9sZEVsZW0gPSAoTWV0aG9kRWxlbWVudCkgb2xkT2JqOwotCQkJCW5hbWVNYXAucHV0KG9sZEVsZW0uZ2V0TmFtZSgpLCBvbGRFbGVtKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgbmFtZSA9IG5ld09iai5nZXROYW1lKCk7Ci0JCVN0cmluZyByZW5hbWVkID0gbmFtZTsKLQkJd2hpbGUgKG5hbWVNYXAuY29udGFpbnNLZXkocmVuYW1lZCkpIHsKLQkJCXJlbmFtZWQgKz0gIl9yZW5hbWVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZW5hbWVkICE9IG5hbWUpIHsKLQkJCW5ld09iai5zZXROYW1lKHJlbmFtZWQpOwotCQkJCi0JCQlPYmplY3RbXSBlbnRyeVZhbCA9IG5ldyBPYmplY3RbNF07Ci0JCQllbnRyeVZhbFswXSA9IG5ld09iajsKLQkJCWVudHJ5VmFsWzFdID0gbmFtZTsKLQkJCWVudHJ5VmFsWzJdID0gbmFtZU1hcC5nZXQobmFtZSk7Ci0JCQllbnRyeVZhbFszXSA9IHJlbmFtZWQ7Ci0JCQlyZW5hbWVFbGVtZW50TWFwLnB1dChuZXdPYmouZ2V0R3VpZCgpLCBlbnRyeVZhbCk7CQkJCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvUGx1Z2luU2VydmljZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL1BsdWdpblNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTk0YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvUGx1Z2luU2VydmljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmludGVybmFsLmltcG9ydGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5XQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFBsdWdpbiBzZXJ2aWNlIGZvciBpbXBvcnRpbmcgZXh0ZXJuYWwgcGx1Z2luIGRhdGEgaW50byB0aGUgY3VycmVudCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luU2VydmljZUltcGwgaW1wbGVtZW50cyBQbHVnaW5TZXJ2aWNlIHsKLQotCU1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwdWJsaWMgUGx1Z2luU2VydmljZUltcGwoTWV0aG9kUGx1Z2luIGVsZW1lbnQpCi0JewotCQlwbHVnaW4gPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbWV0aG9kIHBsdWdoaW4KLQkgKiBAcmV0dXJuIHtAbGluayBNZXRob2RQbHVnaW59Ci0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oKQotCXsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNnZXRDb250ZW50UGFja2FnZVJvb3QoKQotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBnZXRDb250ZW50UGFja2FnZVJvb3QoKQotCXsKLQkJcmV0dXJuIFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVEaXNjaXBsaW5lKCkKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lIGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZCk7Ci0KLQkJcmV0dXJuIGQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCURpc2NpcGxpbmVHcm91cGluZyBkID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCXBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZCk7Ci0KLQkJcmV0dXJuIGQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRvb2woKQotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCVRvb2wgdG9vbCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2woKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHRvb2wpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbigpIHsKLQkJRG9tYWluIGQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb21haW4oKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCSgoQ29udGVudFBhY2thZ2UpcGtnKS5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZCk7Ci0JCXJldHVybiBkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVXb3JrUHJvZHVjdFR5cGUoKQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkgewotCQlXb3JrUHJvZHVjdFR5cGUgdyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJKChDb250ZW50UGFja2FnZSlwa2cpLmdldENvbnRlbnRFbGVtZW50cygpLmFkZCh3KTsKLQkJcmV0dXJuIHc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJvbGVTZXQoKQotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXQgciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXQoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpIHsKLQkJUm9sZVNldEdyb3VwaW5nIHIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0R3JvdXBpbmcoKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoZ2V0UGx1Z2luKCksIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQkoKENvbnRlbnRQYWNrYWdlKXBrZykuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkpCi0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IHBhcmVudCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlDdXN0b21DYXRlZ29yeSBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQotCQkvLyBhbHNvIG5lZWQgdG8gYWRkIHRoZSBjYXRlZ29yeSBvYmplY3QgaW50byB0aGUgcGFyZW50IHBhY2thZ2UKLQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjKTsKLQkJaWYgKCBwYXJlbnQgIT0gbnVsbCApCi0JCXsKLQkJCSgoQ3VzdG9tQ2F0ZWdvcnkpcGFyZW50KS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuYWRkKGMpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gYWRkIHRvIHRoZSByb290IGNhdGVnb3J5Ci0JCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShnZXRQbHVnaW4oKSkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZChjKTsKLQkJfQotCi0JCXJldHVybiBjOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDYXBhYmlsaXR5UGF0dGVybihNZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybihNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpIHsKLQotCQlDYXBhYmlsaXR5UGF0dGVybiBjcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0JCWNwLnNldERlZmF1bHRDb250ZXh0KGRlZmF1bHRDb25maWcpOwotCi0JCVByb2Nlc3NQYWNrYWdlIGNhcGFiaWxpdHlQYXR0ZXJuUGtncyA9IChQcm9jZXNzUGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKGdldFBsdWdpbigpLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCUxpc3QgaXRlbXMgPSBjYXBhYmlsaXR5UGF0dGVyblBrZ3MuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCi0JCS8vIG5lZWQgdG8gY3JlYXRlIGEgcGFja2FnZSBmb3IgdGhpcyBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZSBwa2csIFRPRElPIik7Ci0JCS8vIHRvIGFkZCBhIGNhcGFiaWxpdHkgcHJvY2VzcywgeW91IG5lZWQgdG8gY3JlYXRlIGEgUHJvY2Vzc0NvbXBvbmVudCBwYWNrYWdlIHRvIGhvbGQgdGhlIHByb2Nlc3MKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50IHBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQlwYy5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0JCWl0ZW1zLmFkZChwYyk7Ci0JCXBjLnNldFByb2Nlc3MoY3ApOwotCi0JCXJldHVybiBjcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlRGVsaXZlcnlQcm9jZXNzKE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29uZmlnKSB7Ci0JCURlbGl2ZXJ5UHJvY2VzcyBkcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQlkcC5zZXREZWZhdWx0Q29udGV4dChkZWZhdWx0Q29uZmlnKTsKLQotCQkvLyB0aGlzIGlzIHRoZSBwYWNrYWdlIHRoYXQgc3RvcmVzIGFsbCBjYXBhYmlsaXR5IHBhdHRlcm5zCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4oKTsKLQkJUHJvY2Vzc1BhY2thZ2UgZGVsaXZlcnlQcm9jZXNzUGtncyA9IChQcm9jZXNzUGFja2FnZSlVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJTGlzdCBpdGVtcyA9IGRlbGl2ZXJ5UHJvY2Vzc1BrZ3MuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCi0JCS8vIHlvdSBuZWVkIHRvIGNyZWF0ZSBhIFByb2Nlc3NDb21wb25lbnQgcGFja2FnZSB0byBob2xkIHRoZSBwcm9jZXNzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCBwYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKTsKLQkJcGMuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQlpdGVtcy5hZGQocGMpOwotCQlwYy5zZXRQcm9jZXNzKGRwKTsKLQotCQlyZXR1cm4gZHA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQlpZiAoIGNvbnRhaW5lciA9PSBudWxsKQotCQl7Ci0JCQljb250YWluZXIgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShnZXRQbHVnaW4oKSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQl9Ci0JCWNvbnRhaW5lci5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCXJldHVybiBwa2c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdChDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJQXJ0aWZhY3QgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDaGVja2xpc3QoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUNoZWNrbGlzdCBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVDb25jZXB0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUNvbmNlcHQgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmNlcHQoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZURlbGl2ZXJhYmxlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJRGVsaXZlcmFibGUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVFeGFtcGxlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCUV4YW1wbGUgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUd1aWRhbmNlKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJR3VpZGFuY2UgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlT3V0Y29tZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlPdXRjb21lIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPdXRjb21lKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVQcmFjdGljZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVByYWN0aWNlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUmVwb3J0KENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBSZXBvcnQgY3JlYXRlUmVwb3J0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlSZXBvcnQgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlcG9ydCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlUmV1c2FibGVBc3NldChDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgUmV1c2FibGVBc3NldCBjcmVhdGVSZXVzYWJsZUFzc2V0KENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlSZXVzYWJsZUFzc2V0IGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXVzYWJsZUFzc2V0KCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVSb2FkbWFwKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBSb2FkbWFwIGNyZWF0ZVJvYWRtYXAoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVJvYWRtYXAgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvYWRtYXAoKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVJvbGUoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFJvbGUgY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJUm9sZSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKENvbnRlbnRQYWNrYWdlKQotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlUYXNrIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVUZW1wbGF0ZShDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoQ29udGVudFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCVRlbXBsYXRlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlVGVybURlZmluaXRpb24oQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlUZXJtRGVmaW5pdGlvbiBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJY29udGFpbmVyLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChlKTsKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVRvb2xNZW50b3IoQ29udGVudFBhY2thZ2UpCi0JICovCi0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcihDb250ZW50UGFja2FnZSBjb250YWluZXIpIHsKLQkJVG9vbE1lbnRvciBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpOwotCQljb250YWluZXIuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlV2hpdGVwYXBlcihDb250ZW50UGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKENvbnRlbnRQYWNrYWdlIGNvbnRhaW5lcikgewotCQlXaGl0ZXBhcGVyIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCk7Ci0JCWNvbnRhaW5lci5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQoZSk7Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNjcmVhdGVBY3Rpdml0eShBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoQWN0aXZpdHkgc3VwZXJBY3Rpdml0eSkgewotCQlBY3Rpdml0eSBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQkJc3VwZXJBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChlKTsKLQotCQlhZGRBY3Rpdml0eVRvQ29udGFpbmVyKGUpOwotCQkKLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZVBoYXNlKEFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBQaGFzZSBjcmVhdGVQaGFzZShBY3Rpdml0eSBzdXBlckFjdGl2aXR5KSB7Ci0JCVBoYXNlIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpOwotCQlzdXBlckFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGUpOwotCi0JCWFkZEFjdGl2aXR5VG9Db250YWluZXIoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlI2NyZWF0ZUl0ZXJhdGlvbihBY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbihBY3Rpdml0eSBzdXBlckFjdGl2aXR5KSB7Ci0JCUl0ZXJhdGlvbiBlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCk7Ci0JCXN1cGVyQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoZSk7Ci0KLQkJYWRkQWN0aXZpdHlUb0NvbnRhaW5lcihlKTsKLQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjY3JlYXRlTWlsZXN0b25lKEFjdGl2aXR5KQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKEFjdGl2aXR5IHN1cGVyQWN0aXZpdHkpIHsKLQkJTWlsZXN0b25lIGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKTsKLQkJc3VwZXJBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChlKTsKLQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLlBsdWdpblNlcnZpY2UjYWRkVGFza1RvQWN0aXZpdHkoQWN0aXZpdHksIFRhc2spCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFza1RvQWN0aXZpdHkoQWN0aXZpdHkgYWN0LCBUYXNrIHRhc2spIHsKLQkJYWRkVGFza3NUb0FjdGl2aXR5KGFjdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0YXNrKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS5pbXBvcnRpbmcuUGx1Z2luU2VydmljZSNhZGRUYXNrc1RvQWN0aXZpdHkoQWN0aXZpdHksIExpc3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGFza3NUb0FjdGl2aXR5KGZpbmFsIEFjdGl2aXR5IGFjdCwgZmluYWwgTGlzdCB0YXNrcykgewotCQkvLyB0aGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGFueSBtb3JlZHVlIHRvIGxhdGVyIGNoYW5nZXMKLQkJLy8gdXNlIG91ciBvd24gY29kZSBpbnN0ZWFkCi0JCS8vUHJvY2Vzc1V0aWwuYWRkVGFza1RvQWN0aXZpdHkodGFzaywgYWN0KTsKLQkJCi0JCS8vIGJlZm9yZSBkb2luZyB0aGUgY29tbWFuZCwgbWFrZSBzdXJlIHRoZSBvYmplY3QgaXMgCi0JCS8vIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGhlIG93aW5nIHByb2Nlc3MKLQkJLy8gb3RoZXJ3aXNlIHlvdSB3aWxsIGdldCBtc2cgYm94IGFza2luZyBmb3IgdGhhdCwgd2hpY2ggbWF5IGNhdXNlIGVycm9yIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3MKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmICggY29uZmlnICE9IG51bGwgKSB7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCVRhc2sgdGFzayA9IChUYXNrKWl0Lm5leHQoKTsJCQkKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKXRhc2suZUNvbnRhaW5lcigpOwotCQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQkJaWYgKCAhcGtncy5jb250YWlucyhwa2cpICkgewotCQkJCQlwa2dzLmFkZChwa2cpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHtwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlXQlNEcm9wQ29tbWFuZCBjbWQgPSBuZXcgV0JTRHJvcENvbW1hbmQoYWN0LCB0YXNrcyk7Ci0JCQl0cnkgewotCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9CQotCQkJZmluYWxseSB7Ci0JCQkJY21kLmRpc3Bvc2UoKTsKLQkJCX0JCi0JICAgIH19KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgcHJvY2VzcyBjb21wb25lbnQgZm9yIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGUgQnJlYWtkb3duRWxlbWVudAotCSAqIEByZXR1cm4gUHJvY2Vzc0NvbXBvbmVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRQcm9jZXNzQ29tcG9uZW50KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQkKLQkJaWYgKCBlLmVDb250YWluZXIoKSA9PSBudWxsICkgewotCQkJQWN0aXZpdHkgcGFyZW50ID0gZS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCWlmICggcGFyZW50ID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBnZXRQcm9jZXNzQ29tcG9uZW50KHBhcmVudCk7Ci0JCX0KLQkKLQkJRU9iamVjdCBjb250YWluZXI7Ci0JCWZvciAoY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7IGNvbnRhaW5lciAhPSBudWxsCi0JCQkJJiYgIShjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KTsgY29udGFpbmVyID0gY29udGFpbmVyCi0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQotCQlpZiAoIGNvbnRhaW5lciAhPSBudWxsICkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBY3Rpdml0eVRvQ29udGFpbmVyKEFjdGl2aXR5IGFjdCkgewotCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gZ2V0UHJvY2Vzc0NvbXBvbmVudChhY3QpOwotCQlpZiAoIHBjICE9IG51bGwgKSB7Ci0JCQkvLyBjcmVhdGUgYSBwcm9jZXNzIHBhY2thZ2UgZm9yIHRoZSBhY3Rpdml0eQotCQkJIFByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkgcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkgcGtnLnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQkJCSBwYy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0JCQkgCi0JCQkgcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChhY3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS9pbnRlcm5hbC9pbXBvcnRpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjAxZGEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvaW50ZXJuYWwvaW1wb3J0aW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGRhdGEgZXhjaGFuZ2Ugc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQmFzZVJlc291cmNlSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0Jhc2VSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3NGI0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQmFzZVJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotLyoqCi0gKiBjb250ZW50IHJlc291cmNlIGhhbmRsZXIgdG8gcHJvY2VzcyB0aGUgcmVzcG91cmNlcyBpbiB0aGUgY29udGVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZXNvdXJjZUhhbmRsZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByb3RlY3RlZCBGaWxlIHNvdXJjZUxpYlJvb3Q7Ci0JcHJvdGVjdGVkIEZpbGUgdGFyZ2V0TGliUm9vdDsKLQotCXB1YmxpYyBCYXNlUmVzb3VyY2VIYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXRoaXMuc291cmNlTGliUm9vdCA9IHNvdXJjZUxpYlJvb3Q7Ci0JCXRoaXMudGFyZ2V0TGliUm9vdCA9IHRhcmdldExpYlJvb3Q7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBVcmxJbmZvIHJlc29sdmVGaWxlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQkKLQkvKioKLQkgKiBjb3B5aW5nIHRoZSByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdAotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSkgewotCQlGaWxlIHNyYyA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNvdXJjZUZpbGUpOwotCQlpZiAoIHNyYy5leGlzdHMoKSApIHsKLQkJCUZpbGUgdGd0ID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc291cmNlRmlsZSk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmMsIHRndCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQ29udGVudFByb2Nlc3Nvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0NvbnRlbnRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3OTAzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvQ29udGVudFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotCi0KLS8qKgotICogY29udGVudCBwcm9jZXNzZXIgdG8gZml4IHJlZmVyZW5jZXMgYW5kIGNvcHkgcmVzb3VyY2VzIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBsb2NhdGlvbgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfc3JjX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgic3JjXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0vLwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9IFBhdHRlcm4uY29tcGlsZSgiPGFcXHMrPyhbXj5dKik+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaHJlZl9yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoImhyZWZcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCUlSZXNvdXJjZUhhbmRsZXIgaGFuZGxlcjsKLQlJTG9nZ2VyIGxvZ2dlcjsKLQkKLQlwdWJsaWMgQ29udGVudFByb2Nlc3NvcihJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIsIElMb2dnZXIgbG9nZ2VyKSB7Ci0JCXRoaXMuaGFuZGxlciA9IGhhbmRsZXI7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiByZXNvdmxlIHRoZSByZXNvdXJjZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBvd25lci4gCi0JICogVGhlIG93bmVyIGlzIGEgbWV0aG9kIGVsZW1lbnQsIGJ1dCBjYW4gYmUgZWl0aGVyIGZyb20gdW1hIG1vZGVsIG9yIHhtbCBtb2RlbC4gCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVSZXNvdXJjZUZpbGVzKE9iamVjdCBvd25lciwgU3RyaW5nIHNvdXJjZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJdHJ5Ci0JCXsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzIGFuZCBvdGhlciBzcmMgcmVzb3VyY2VzCi0JCQlNYXRjaGVyIG0gPSBwX3NyY19yZWYubWF0Y2hlcihzb3VyY2UpOwotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJU3RyaW5nIG5ld191cmwgID0gcHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCB1cmwpOwotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9ICJzcmM9XCIiICsgbmV3X3VybCArICJcIiI7IAkJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIGZpeFJlcGxhY2VtZW50U3RyKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCi0JCQkvLyBwcm9jZXNzIGhyZWZzCi0JCQltID0gcF9ocmVmX3JlZi5tYXRjaGVyKHNiLnRvU3RyaW5nKCkpOwotCQkJc2Iuc2V0TGVuZ3RoKDApOwotCQkJCi0JCQl3aGlsZSAoIG0uZmluZCgpICkKLQkJCXsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbWFyayA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCBpbmRleCA+PSAwICkKLQkJCQl7Ci0JCQkJCW1hcmsgPSB1cmwuc3Vic3RyaW5nKGluZGV4KTsKLQkJCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJfQotCi0JCQkJaWYgKCB1cmwubGVuZ3RoKCkgPiAwICkKLQkJCQl7Ci0JCQkJCXVybCA9IHByb2Nlc3NSZXNvdXJjZVVybChvd25lciwgdXJsKTsKLQkJCQl9Ci0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgZml4UmVwbGFjZW1lbnRTdHIoImhyZWY9XCIiICsgdXJsICsgbWFyayArICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCQkJCi0JCQkvLyBhbnl0aGluZyBlbHNlID8/PwotCQkJCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkJewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKHNiKTsKLQkJCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBmaXhSZXBsYWNlbWVudFN0cihTdHJpbmcgc3RyKSB7Ci0JCS8vIGVzY2FwZSB0aGUgJCBzaW5jZSBpdCdzIHRyZWF0ZWQgYXMgYSBncm91cCBzZXF1ZW5jZQotCQl0cnkgewotCQkJaW50IGluZGV4ID0gc3RyLmluZGV4T2YoIiQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCBpbmRleCA8IDAgKSB7Ci0JCQkJcmV0dXJuIHN0cjsKLQkJCX0KLQkJCQotCQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgc3RhcnQgPSAwOwotCQkJd2hpbGUgKCBpbmRleCA+PSAwICkgewotCQkJCWIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KSkuYXBwZW5kKCJcXCQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0YXJ0ID0gaW5kZXgrMTsKLQkJCQlpbmRleCA9IHN0ci5pbmRleE9mKCIkIiwgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWIuYXBwZW5kKHN0ci5zdWJzdHJpbmcoc3RhcnQpKTsKLQkJCQotCQkJcmV0dXJuIGIudG9TdHJpbmcoKTsKLQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGaWxlVXJsKFN0cmluZyB1cmwpCi0JewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyBpbWFnZSB1cmwgWyIgKyB1cmwgKyAiXSIpOwotCQlpZiAoIAl1cmwgPT0gbnVsbCB8fCB1cmwubGVuZ3RoKCkgPT0gMAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJodHRwIikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJ3d3cuIikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJtYWlsdG86IikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImphdmFzY3JpcHQ6IikgPj0wICkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEZpbGVQYXRoKEZpbGUgZikgewotCQlyZXR1cm4gKGYgIT0gbnVsbCkgJiYgZi5leGlzdHMoKTsKLQl9Ci0JCi0KLQlwdWJsaWMgU3RyaW5nIHByb2Nlc3NSZXNvdXJjZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyB1cmwpCi0JewotCQlpZiAoICFpc0ZpbGVVcmwodXJsKSApCi0JCXsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlVcmxJbmZvIGluZm8gPSBudWxsOwotCQl0cnkgewotCQkJaW5mbyA9IGhhbmRsZXIucmVzb2x2ZUZpbGVVcmwob3duZXIsIHVybCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoImVycm9yIHByb2Nlc3NpbmcgdXJsICciICsgdXJsICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCQotCQlpZiAoIGluZm8uc291cmNlRmlsZSA9PSBudWxsIHx8IGluZm8udGFyZ2V0RmlsZSA9PSBudWxsICkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQkKLQkJaWYgKCBpbmZvLnNvdXJjZUZpbGUuaXNGaWxlKCkgJiYgaW5mby5zb3VyY2VGaWxlLmV4aXN0cygpICkKLQkJewotCQkJRmlsZVV0aWwuY29weUZpbGUoaW5mby5zb3VyY2VGaWxlLCBpbmZvLnRhcmdldEZpbGUpOwotCQkJCi0JCQkvLyByZXR1cm4gdGhlIGZpeGVkIHRhcmdldCB1cmwgaWYgdGhlIGZpbGUgZXhpc3RzIAotCQkJLy8gYW5kIGlzIGNvcGllZCBvdmVyIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24KLQkJCXJldHVybiBpbmZvLnRhcmdldFVybDsKLQkJfQotCi0JCXJldHVybiB1cmw7Ci0JfQotCi0KLQkvKioKLQkgKiBwcm9jZXNzIHRoZSB1cmwsIHVwZGF0ZSB0aGUgcmVzdWx0IGJ1ZmZlciwgYW5kIHJldHVybiB0aGUgYXNzb2NpYXRlZCBlbGVtZW50IGlmIGFueQotCSAqIEBwYXJhbSBzb3VyY2UgdGVoIHVybCB0ZXh0IHN0cmluZwotCSAqIEBwYXJhbSByZXN1bHQgU3RyaW5nQnVmZmVyCi0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHRoZSBsaW5rZWQgZWxlbWVudCBvciBudWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1VybFRleHQoT2JqZWN0IG93bmVyLCBTdHJpbmcgc291cmNlKQotCXsKLQkJTWF0Y2hlciBtID0gcF9ocmVmX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCWlmICggbS5maW5kKCkgKQotCQl7Ci0JCQlTdHJpbmcgdXJsID0gbS5ncm91cCgxKTsKLQkJCWlmICggdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiamF2YVNjcmlwdDoiKSA8IDAgKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJaW50IGluZGV4ID0gdXJsLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICggaW5kZXggPj0gMCApCi0JCQkJewotCQkJCQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCQl9Ci0KLQkJCQlpZiAoIHVybC5sZW5ndGgoKSA+IDAgKQotCQkJCXsKLQkJCQkJcHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCB1cmwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUpIHsKLQkJaGFuZGxlci5jb3B5UmVzb3VyY2Uoc291cmNlRmlsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShTdHJpbmcgc291cmNlRmlsZSwgRU9iamVjdCBvYmosIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIHVtYVBsdWdpbikgewotCQloYW5kbGVyLmNvcHlSZXNvdXJjZShzb3VyY2VGaWxlLCBvYmosIHVtYVBsdWdpbik7Ci0JfQotCQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGlzIGZvciByZXNvbHZlaW5nIHRoZSB0ZW1wbGF0ZSBhdHRhY2htZW50IHJlc291cmNlcwotCSAqIFRoZSByZXNvdXJjZSBpcyBhIHNldCBvZiB1cmxzIHNlcGVyYXRlZCBieSB8Ci0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIHVybHMKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZUF0dGFjaG1lbnRSZXNvdXJjZXMoT2JqZWN0IG93bmVyLCBTdHJpbmcgdXJscykgewotCQlpZiAoICh1cmxzICE9IG51bGwpICYmIHVybHMubGVuZ3RoKCkgIT0gMCApIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHVybHMsICJ8Iik7IC8vIHRoaXMgaXMgaGFyZGNvZGVkIHNvbWVob3cgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKLQkJCQlTdHJpbmcgdXJsID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJdXJsID0gcHJvY2Vzc1Jlc291cmNlVXJsKG93bmVyLCB1cmwpOwotCQkJCWlmICggYnVmZmVyLmxlbmd0aCgpID4gMCApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgifCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQodXJsKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRGVmYXVsdExvZ2dlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0RlZmF1bHRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxNDc3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRGVmYXVsdExvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyIHsKLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBpbmZvID0gU3lzdGVtLm91dDsKLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gd2FybmluZyA9IFN5c3RlbS5vdXQ7Ci0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGVycm9yID0gU3lzdGVtLmVycjsKLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKSB7Ci0JCWVycm9yLnByaW50bG4obWVzc2FnZSk7Ci0JCWlmICggdGggIT0gbnVsbCApIHsKLQkJCXRoLnByaW50U3RhY2tUcmFjZShlcnJvcik7Ci0JCX0JCi0JfQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJd2FybmluZy5wcmludGxuKG1lc3NhZ2UpOwotCX0KLQlwdWJsaWMgdm9pZCBsb2dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWluZm8ucHJpbnRsbihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRmlsZUxvZ2dlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0ZpbGVMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MDBiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvRmlsZUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi0vKioKLSAqIGZpbGUgTG9nZ2VyIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZUxvZ2dlciBleHRlbmRzIERlZmF1bHRMb2dnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTE9HX0ZJTEVOQU1FID0gImVycm9yLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfTE9HX0ZJTEVOQU1FID0gIndhcm5pbmcubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT19MT0dfRklMRU5BTUUgPSAiaW5mby5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRmlsZSBsb2dQYXRoOwotCi0JcHVibGljIEZpbGVMb2dnZXIoRmlsZSBsb2dQYXRoKSB7Ci0JCXRoaXMubG9nUGF0aCA9IGxvZ1BhdGg7Ci0KLQkJaWYgKCF0aGlzLmxvZ1BhdGguZXhpc3RzKCkpIHsKLQkJCXRoaXMubG9nUGF0aC5ta2RpcnMoKTsKLQkJfQotCi0JCXN1cGVyLmluZm8gPSBnZXRTdHJlYW0obmV3IEZpbGUobG9nUGF0aCwgSU5GT19MT0dfRklMRU5BTUUpKTsKLQkJc3VwZXIud2FybmluZyA9IGdldFN0cmVhbShuZXcgRmlsZShsb2dQYXRoLCBXQVJOSU5HX0xPR19GSUxFTkFNRSkpOwotCQlzdXBlci5lcnJvciA9IGdldFN0cmVhbShuZXcgRmlsZShsb2dQYXRoLCBFUlJPUl9MT0dfRklMRU5BTUUpKTsKLQotCX0KLQotCXByaXZhdGUgUHJpbnRTdHJlYW0gZ2V0U3RyZWFtKEZpbGUgZikgewotCQl0cnkgewotCQkJRmlsZSBkaXIgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCWRpci5ta2RpcnMoKTsKLQotCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZiksIHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpbmZvLmNsb3NlKCk7Ci0JCXdhcm5pbmcuY2xvc2UoKTsKLQkJZXJyb3IuY2xvc2UoKTsKLQotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nUGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSUxvZ2dlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmMTViYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvSUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsOwotCi0vKioKLSAqIExvZ2dlciBpbnRlcmZhY2UgZm9yIGV4cG9ydCBhbmQgaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2dnZXIgewotCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCk7Ci0JCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JcHVibGljIHZvaWQgbG9nTWVzc2FnZShTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lSZXNvdXJjZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9JUmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZTFlZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL0lSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0vKioKLSAqIFJlc291cmNlIGhhbmRsZXIgaW50ZXJmYWNlIGZvciB4bWwgZXhwb3J0IGFuZCBpbXBvcnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlSGFuZGxlciB7Ci0KLQlwdWJsaWMgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBjb3B5aW5nIHRoZSByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHNvdXJjZSBsaWJyYXJ5IHRvIHRoZSB0YXJnZXQKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlRmlsZSB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2Ugcm9vdAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlKTsKLQkKLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUsIEVPYmplY3Qgb2JqLCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiB1bWFQbHVnaW4pOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL1VybEluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9kYXRhZXhjaGFuZ2UvdXRpbC9VcmxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmU4YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL1VybEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSB1cmwgaW5mbyBpbiBjb250ZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVXJsSW5mbyB7Ci0KLQlwdWJsaWMgRmlsZSBzb3VyY2VGaWxlOwotCXB1YmxpYyBGaWxlIHRhcmdldEZpbGU7Ci0JcHVibGljIFN0cmluZyBzb3VyY2VVcmw7Ci0JcHVibGljIFN0cmluZyB0YXJnZXRVcmw7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RhdGFleGNoYW5nZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YzYwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGF0YWV4Y2hhbmdlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGRhdGEgZXhjaGFuZ2Ugc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgzMzA4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIHBsdWctaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvZGVidWc9ZmFsc2UKLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBvZiB2aXN1YWxJRCBwcm9jZXNzaW5nCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9kZWJ1Zy92aXN1YWxJRD10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJjNjU4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDRkZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuamZhY2UsCi0gb3JnLmVjbGlwc2UudWkuaWRlLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aSwKLSBvcmcuZWNsaXBzZS5nZWY7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnByb3BlcnRpZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVyczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24ucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLnVtbDIudW1sO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVtbDIudW1sLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5kcmF3MmQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhNTNmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vYWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9hY3Rpdml0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MzkzZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9hY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL2l0ZXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL2l0ZXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzhhMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9pdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9taWxlc3RvbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9taWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZmZjk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vbWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vcGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9waGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2IzY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS9waGFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9kaWFncmFtL3Rhc2tkZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVkNjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvcjEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZGlhZ3JhbS90YXNrZGVzY3JpcHRvcjEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVkNjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2RpYWdyYW0vdGFza2Rlc2NyaXB0b3IxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvZHRvb2wxNi9BREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2R0b29sMTYvQURFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBmYWZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvZHRvb2wxNi9BREVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2V0b29sMTYvQURFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9ldG9vbDE2L0FERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1NmYxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL2V0b29sMTYvQURFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlGaW5hbE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDk3MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTY4ZGMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlQYXJ0aXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Db250cm9sRmxvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwYzIyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvRGVjaXNpb25Ob2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhNjAxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MyMGIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1Y2Y3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0luaXRpYWxOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L0pvaW5Ob2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGMzYTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9NZXJnZU5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRjYjk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGViOWRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MGZiMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L2RlbGV0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9pY29ucy9mdWxsL29iajE2L2RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvZnVsbC9vYmoxNi9kZWxldGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FhMmRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL29iajE2L1VNTERpYWdyYW1GaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL2ljb25zL3dpemJhbi9OZXdVTUxXaXphcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvd2l6YmFuL05ld1VNTFdpemFyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZTAzYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvaWNvbnMvd2l6YmFuL05ld1VNTFdpemFyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE4ZTA5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVE9ETzogbWFudWFsbHkgcHV0IGtleXMgYW5kIHZhbHVlcwotVU1MRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1VTUxEaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1GYWlsZWQgdG8gbG9hZCBtb2RlbCBmaWxlIHswfQotVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzaz1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbCBmaWxlcwotVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbUNvbW1hbmRMYWJlbD1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbAotVU1MRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU9VXBkYXRpbmcgY2FjaGUgZmFpbGVkCi1VTUxEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZD1GYWlsZWQgdG8gcmVmcmVzaCBoaWVyYXJjaHkgZm9yIGNoYW5nZWQgcmVzb3VyY2UKLVVNTERvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcj17MX0KLVVNTERvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcj1VbmFibGUgdG8gbG9hZCBkaWFncmFtIHJlc291cmNlCi1VTUxEb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcj1EaWFncmFtIGlzIG5vdCBwcmVzZW50IGluIHJlc291cmNlCi1VTUxEb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I9RXJyb3IgbG9hZGluZyBkaWFncmFtCi1VTUxEb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcj1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotVU1MRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s9U2F2aW5nIGRpYWdyYW0KLVVNTERvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s9U2F2aW5nIHswfQotVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlPU1vZGVsIGZpbGUgbG9hZGluZyBmYWlsZWQKLVVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZT1Jbml0aWFsaXplIG5ldyB7MH0gZGlhZ3JhbSBmaWxlCi1VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlPVNlbGVjdCBkb21haW4gbW9kZWwKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU9SW5pdGlhbGl6ZSBuZXcgZGlhZ3JhbSBmaWxlCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZT1EaWFncmFtIGZpbGUKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgZGlhZ3JhbSBiYXNlZCBvbiB7MH0gbW9kZWwgY29udGVudAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZT1EaWFncmFtIHJvb3QgZWxlbWVudAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbj1TZWxlY3Qgc2VtYW50aWMgbW9kZWwgZWxlbWVudCB0byBiZSBkZXBpY3RlZCBvbiBkaWFncmFtCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudDoKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTm9TZWxlY3Rpb25NZXNzYWdlPURpYWdyYW0gcm9vdCBlbGVtZW50IGlzIG5vdCBzZWxlY3RlZAotVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZT1JbnZhbGlkIGRpYWdyYW0gcm9vdCBlbGVtZW50IGlzIHNlbGVjdGVkCi1VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQ9SW5pdGlhbGl6aW5nIGRpYWdyYW0gY29udGVudHMKLVVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcj1JbmNvcnJlY3QgbW9kZWwgb2JqZWN0IHN0b3JlZCBhcyBhIHJvb3QgcmVzb3VyY2Ugb2JqZWN0Ci1GbG93czFHcm91cF90aXRsZT1GbG93cwotRmxvd3MxR3JvdXBfZGVzYz1DcmVhdGlvbiB0b29sIGZvciBmbG93cwotTm9kZXMyR3JvdXBfdGl0bGU9Tm9kZXMKLU5vZGVzMkdyb3VwX2Rlc2M9Q3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMKLUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF90aXRsZT1Db250cm9sIEZsb3cKLUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQ29udHJvbCBGbG93Ci1BY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2xfdGl0bGU9QWN0aXZpdHkgUGFydGl0aW9uCi1BY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbgotU3RhcnROb2RlMkNyZWF0aW9uVG9vbF90aXRsZT1TdGFydCBOb2RlCi1TdGFydE5vZGUyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBTdGFydCBOb2RlCi1Gb3JrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGU9Rm9yayBOb2RlCi1Gb3JrTm9kZTNDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IEZvcmsgTm9kZQotTWVyZ2VOb2RlNENyZWF0aW9uVG9vbF90aXRsZT1NZXJnZSBOb2RlCi1NZXJnZU5vZGU0Q3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBNZXJnZSBOb2RlCi1EZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sX3RpdGxlPURlY2lzaW9uIE5vZGUKLURlY2lzaW9uTm9kZTVDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IERlY2lzaW9uIE5vZGUKLUVuZE5vZGU2Q3JlYXRpb25Ub29sX3RpdGxlPUVuZCBOb2RlCi1FbmROb2RlNkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgRW5kIE5vZGUKLUpvaW5Ob2RlN0NyZWF0aW9uVG9vbF90aXRsZT1Kb2luIE5vZGUKLUpvaW5Ob2RlN0NyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgSm9pbiBOb2RlCi1BY3Rpdml0eTlDcmVhdGlvblRvb2xfdGl0bGU9QWN0aXZpdHkKLUFjdGl2aXR5OUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQWN0aXZpdHkKLVBoYXNlMTBDcmVhdGlvblRvb2xfdGl0bGU9UGhhc2UKLVBoYXNlMTBDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFBoYXNlCi1JdGVyYXRpb24xMUNyZWF0aW9uVG9vbF90aXRsZT1JdGVyYXRpb24KLUl0ZXJhdGlvbjExQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBJdGVyYXRpb24KLVRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2xfdGl0bGU9VGFzayBEZXNjcmlwdG9yCi1UYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBUYXNrIERlc2NyaXB0b3IKLU1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sX3RpdGxlPU1pbGVzdG9uZQotTWlsZXN0b25lMTNDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IE1pbGVzdG9uZQotQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0X3RpdGxlPVBhcnRpdGlvbkNhbXBhcnRtZW50Ci1BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlPVBhcnRpdGlvbkNhbXBhcnRtZW50Ci1Db21tYW5kTmFtZV9PcGVuRGlhZ3JhbT1PcGVuIERpYWdyYW0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZmdlbiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWU5NmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsOTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNi9HZW5Nb2RlbCIgcGFja2FnZU5hbWVQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIgotICAgIG1vZGVsSUQ9IkFEIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ4bWkiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiIKLSAgICBjb3B5cmlnaHRUZXh0PSIgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiYjeEQ7JiN4QTsgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyYjeEQ7JiN4QTsgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wJiN4RDsmI3hBOyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCYjeEQ7JiN4QTsgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmI3hEOyYjeEE7JiN4RDsmI3hBOyBDb250cmlidXRvcnM6JiN4RDsmI3hBOyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uJiN4RDsmI3hBOyI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlFZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5Vmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY3JlYXRpb25XaXphcmRJY29uUGF0aD0iaWNvbnMvZGlhZ3JhbS9hY3Rpdml0eS5naWYiCi0gICAgICB2YWxpZGF0aW9uUHJvdmlkZXJDbGFzc05hbWU9IlZhbGlkYXRpb25Qcm92aWRlciIKLSAgICAgIG1ldHJpY1Byb3ZpZGVyQ2xhc3NOYW1lPSJNZXRyaWNQcm92aWRlciIKLSAgICAgIHZhbGlkYXRpb25EZWNvcmF0b3JQcm92aWRlckNsYXNzTmFtZT0iVmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyIj4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlFZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4xIC8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJYWV9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Qm9yZGVyKCYjeEQ7JiN4QTtuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXIoKSYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZQYXJ0aXRpb25MYWJlbEZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyNTUpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA2IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkVuZE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkVuZE5vZGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEVuZE5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihFTkROT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBFTkROT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTWVyZ2VOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik1lcmdlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTWVyZ2VOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRGlhbW9uZExhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZEaWFtb25kTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMTg1LCAyMDUsIDIzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL01lcmdlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJNZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkZvcmtOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRm9ya05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJGb3JrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UmVzaXplQ29uc3RyYWludHMiCi0gICAgICAgICAgICByZXNpemVIYW5kbGVzPSIyNCIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0ZvcmtOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDQiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkluaXRpYWxOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iSW5pdGlhbE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJJbml0aWFsTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBJbml0aWFsTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKElOSVRJQUxOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoMjApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIElOSVRJQUxOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDQ1LCA4NSwgMTMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSW5pdGlhbE5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRXh0ZXJuYWxOb2RlTGFiZWwiCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA1IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIERlY2lzaW9uRGlhbW9uZEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5maWd1cmVzLkRlY2lzaW9uTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNTApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZURpYW1vbmRMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkRpYW1vbmRMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZURpYW1vbmRMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmRGlhbW9uZExhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZEaWFtb25kTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMTg1LCAyMDUsIDIzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0RlY2lzaW9uTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICAgIGNsYXNzTmFtZT0iTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBOb2RlTmFtZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkpvaW5Ob2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkpvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSm9pbk5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJKb2luTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkZvcmtOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEZvcmtOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRm9ya05vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDEwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgRk9SS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UmVzaXplQ29uc3RyYWludHMiCi0gICAgICAgICAgICByZXNpemVIYW5kbGVzPSIyNCIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0pvaW5Ob2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDciCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9BY3Rpdml0eSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0FjdGl2aXR5JiN4RDsmI3hBOyIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA4IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlhZX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ncm91cCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA3IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwOSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA4IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEwIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuRmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwOSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDExIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX0l0ZXJhdGlvbiIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDEyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3BlY2lhbGl6YXRpb25UeXBlIgotICAgICAgICAgIG1ldGFtb2RlbFR5cGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AZWxlbWVudFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckFkdmljZUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUvRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgICAgPC9tb2RlbEVsZW1lbnRJbml0aWFsaXplcj4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb250cm9sRmxvd0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb250cm9sRmxvd0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbnRyb2xGbG93Vmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQ29udHJvbEZsb3dFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBDb250cm9sRmxvd0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBDb250cm9sRmxvd0ZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkgeyYjeEQ7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hEOyYjeEE7Ly8gZGlzcGF0Y2hOZXh0PyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QgcGwgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIDEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoMCwgMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgLTEpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0VGVtcGxhdGUocGwpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGRmOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Db250cm9sRmxvdyIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUvZWRnZSIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUVkZ2Uvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RWRnZS90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAxMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJDb250cm9sRmxvd0xhYmVsRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjciCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHRpdGxlPSJQYXJ0aXRpb25DYW1wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBsaXN0TGF5b3V0PSJmYWxzZSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJGbG93cyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBmb3IgZmxvd3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbiIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy43IC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iU3RhcnQgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFN0YXJ0IE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSW5pdGlhbE5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMyIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRm9yayBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRm9yayBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0ZvcmtOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ik1lcmdlIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNZXJnZSBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01lcmdlTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJEZWNpc2lvbiBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9EZWNpc2lvbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iRW5kIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBFbmQgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eUZpbmFsTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJKb2luIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBKb2luIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSm9pbk5vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTZXBhcmF0b3IiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHkuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUGhhc2UiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBQaGFzZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9QaGFzZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJJdGVyYXRpb24iCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBJdGVyYXRpb24iCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEwIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrIERlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTWlsZXN0b25lIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgTWlsZXN0b25lIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZCIKLSAgICAgIG5hbWU9IkVQRiBBY3Rpdml0eSBEaWFncmFtIgotICAgICAgcHJvdmlkZXI9IkVjbGlwc2Uub3JnIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eURpYWdyYW1FZGl0b3IiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLyIvPgotICA8ZXhwcmVzc2lvblByb3ZpZGVycz4KLSAgICA8cHJvdmlkZXJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuSmF2YUV4cHJlc3Npb25Qcm92aWRlciIKLSAgICAgICAgZXhwcmVzc2lvbnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNi9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExL0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAiLz4KLSAgPC9leHByZXNzaW9uUHJvdmlkZXJzPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mZ3JhcGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MmY4ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbS5nbWZncmFwaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdyYXBoOkNhbnZhcyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdyYXBoPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA2L0dyYXBoaWNhbERlZmluaXRpb24iIG5hbWU9InVtbCI+Ci0gIDxmaWd1cmVzCi0gICAgICBuYW1lPSJEZWZhdWx0Ij4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgICBuYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIHRleHQ9IiIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgICA8YWNjZXNzb3JzCi0gICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICAgIG5hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIj4KLSAgICAgICAgPGxheW91dERhdGEKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpYWUxheW91dERhdGEiPgotICAgICAgICAgIDxzaXplCi0gICAgICAgICAgICAgIGR4PSIxMDAiCi0gICAgICAgICAgICAgIGR5PSIyMDAiLz4KLSAgICAgICAgPC9sYXlvdXREYXRhPgotICAgICAgICA8bGF5b3V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6WFlMYXlvdXQiLz4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iYmxhY2siLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgICAgYmx1ZT0iMjU1Ii8+Ci0gICAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgICBkeD0iMzAwIgotICAgICAgICAgICAgZHk9IjYwMCIvPgotICAgICAgICA8Ym9yZGVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGluZUJvcmRlciIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iMzAwIgotICAgICAgICAgICAgeT0iNjAwIi8+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgICAgbmFtZT0iUGFydGl0aW9uTGFiZWxGaWd1cmUiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgICAgPGFjY2Vzc29ycwotICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4xL0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSI+Ci0gICAgICA8YWN0dWFsRmlndXJlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lQ29ubmVjdGlvbiIKLSAgICAgICAgICBuYW1lPSJDb250cm9sRmxvd0ZpZ3VyZSIKLSAgICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjIvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMCI+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lRGVjb3JhdGlvbiIKLSAgICAgICAgICAgIG5hbWU9Ik9wZW5BcnJvdyI+Ci0gICAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgICB5PSIxIi8+Ci0gICAgICAgICAgPHRlbXBsYXRlLz4KLSAgICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgICAgeD0iLTEiCi0gICAgICAgICAgICAgIHk9Ii0xIi8+Ci0gICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgIDxjaGlsZHJlbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgICAgbmFtZT0iQ29udHJvbEZsb3dMYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIHRleHQ9IiIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgICA8YWNjZXNzb3JzCi0gICAgICAgICAgZmlndXJlPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjIvQGFjdHVhbEZpZ3VyZS9AY2hpbGRyZW4uMSIvPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkZvcmtOb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICAgIG5hbWU9IkZvcmtOb2RlRmlndXJlIj4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSI0NSIKLSAgICAgICAgICAgIGdyZWVuPSI4NSIKLSAgICAgICAgICAgIGJsdWU9IjEzMCIvPgotICAgICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgICAgZHg9IjEwMCIKLSAgICAgICAgICAgIGR5PSI1Ii8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSIxMDAiCi0gICAgICAgICAgICB5PSI1Ii8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJFbmROb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICAgIG5hbWU9IkVuZE5vZGVGaWd1cmUiCi0gICAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5FbmROb2RlRmlndXJlIj4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSI0NSIKLSAgICAgICAgICAgIGdyZWVuPSI4NSIKLSAgICAgICAgICAgIGJsdWU9IjEzMCIvPgotICAgICAgICA8cHJlZmVycmVkU2l6ZQotICAgICAgICAgICAgZHg9IjI0IgotICAgICAgICAgICAgZHk9IjI0Ii8+Ci0gICAgICAgIDxzaXplCi0gICAgICAgICAgICB4PSIyNCIKLSAgICAgICAgICAgIHk9IjI0Ii8+Ci0gICAgICA8L2FjdHVhbEZpZ3VyZT4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgICAgbmFtZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIgotICAgICAgICAgIHF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIj4KLSAgICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkNvbnN0YW50Q29sb3IiCi0gICAgICAgICAgICB2YWx1ZT0iZGFya0JsdWUiLz4KLSAgICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgICAgcmVkPSIxODUiCi0gICAgICAgICAgICBncmVlbj0iMjA1IgotICAgICAgICAgICAgYmx1ZT0iMjMwIi8+Ci0gICAgICAgIDxwcmVmZXJyZWRTaXplCi0gICAgICAgICAgICBkeD0iNTAiCi0gICAgICAgICAgICBkeT0iNTAiLz4KLSAgICAgICAgPHNpemUKLSAgICAgICAgICAgIHg9IjUwIgotICAgICAgICAgICAgeT0iNTAiLz4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJEaWFtb25kTGFiZWwiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgPGRlc2NyaXB0b3JzCi0gICAgICAgIG5hbWU9IkluaXRpYWxOb2RlRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6RWxsaXBzZSIKLSAgICAgICAgICBuYW1lPSJJbml0aWFsTm9kZUZpZ3VyZSI+Ci0gICAgICAgIDxmb3JlZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgICAgdmFsdWU9ImRhcmtCbHVlIi8+Ci0gICAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICAgIHJlZD0iNDUiCi0gICAgICAgICAgICBncmVlbj0iODUiCi0gICAgICAgICAgICBibHVlPSIxMzAiLz4KLSAgICAgICAgPHByZWZlcnJlZFNpemUKLSAgICAgICAgICAgIGR4PSIyMCIKLSAgICAgICAgICAgIGR5PSIyMCIvPgotICAgICAgICA8c2l6ZQotICAgICAgICAgICAgeD0iMjAiCi0gICAgICAgICAgICB5PSIyMCIvPgotICAgICAgPC9hY3R1YWxGaWd1cmU+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsRmlndXJlIj4KLSAgICAgIDxhY3R1YWxGaWd1cmUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsRmlndXJlIi8+Ci0gICAgPC9kZXNjcmlwdG9ycz4KLSAgICA8ZGVzY3JpcHRvcnMKLSAgICAgICAgbmFtZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDdXN0b21GaWd1cmUiCi0gICAgICAgICAgbmFtZT0iUmVzaXplYWJsZUNvbXBhcnRtZW50RmlndXJlRXgiCi0gICAgICAgICAgcXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICAgIDxkZXNjcmlwdG9ycwotICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiPgotICAgICAgPGFjdHVhbEZpZ3VyZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgICAgbmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIG91dGxpbmU9ImZhbHNlIj4KLSAgICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwiLz4KLSAgICAgIDwvYWN0dWFsRmlndXJlPgotICAgICAgPGFjY2Vzc29ycwotICAgICAgICAgIGZpZ3VyZT0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy45L0BhY3R1YWxGaWd1cmUvQGNoaWxkcmVuLjAiLz4KLSAgICA8L2Rlc2NyaXB0b3JzPgotICA8L2ZpZ3VyZXM+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkFjdGl2aXR5UGFydGl0aW9uIgotICAgICAgZmlndXJlPSJBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkluaXRpYWxOb2RlIgotICAgICAgZmlndXJlPSJJbml0aWFsTm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkZvcmtOb2RlIgotICAgICAgZmlndXJlPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgIHJlc2l6ZUNvbnN0cmFpbnQ9IkVBU1RfV0VTVCIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9Ik1lcmdlTm9kZSIKLSAgICAgIGZpZ3VyZT0iRGVjaXNpb25EaWFtb25kRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iRGVjaXNpb25Ob2RlIgotICAgICAgZmlndXJlPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJBY3Rpdml0eUZpbmFsTm9kZSIKLSAgICAgIGZpZ3VyZT0iRW5kTm9kZUZpZ3VyZSIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkpvaW5Ob2RlIgotICAgICAgZmlndXJlPSJGb3JrTm9kZUZpZ3VyZSIKLSAgICAgIHJlc2l6ZUNvbnN0cmFpbnQ9IkVBU1RfV0VTVCIvPgotICA8bm9kZXMKLSAgICAgIG5hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIKLSAgICAgIGZpZ3VyZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIi8+Ci0gIDxjb25uZWN0aW9ucwotICAgICAgbmFtZT0iQ29udHJvbEZsb3ciCi0gICAgICBmaWd1cmU9IkNvbnRyb2xGbG93RmlndXJlIi8+Ci0gIDxjb21wYXJ0bWVudHMKLSAgICAgIG5hbWU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgZmlndXJlPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IlBhcnRpdGlvbk5hbWUiCi0gICAgICBmaWd1cmU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgYWNjZXNzb3I9Ii8vQGZpZ3VyZXMuMC9AZGVzY3JpcHRvcnMuMS9AYWNjZXNzb3JzLjAiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iQ29udHJvbEZsb3dMYWJlbCIKLSAgICAgIGZpZ3VyZT0iQ29udHJvbEZsb3dGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4yL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJNZXJnZU5vZGVQb2x5Z29uTGFiZWwiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iR2VuZXJpY0xhYmVsIgotICAgICAgZmlndXJlPSJHZW5lcmljTGFiZWxGaWd1cmUiCi0gICAgICByZXNpemVDb25zdHJhaW50PSJFQVNUX1dFU1QiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iQWN0aXZpdHlOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkluaXRpYWxOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkZvcmtOb2RlTmFtZSIKLSAgICAgIGZpZ3VyZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIKLSAgICAgIGFjY2Vzc29yPSIvL0BmaWd1cmVzLjAvQGRlc2NyaXB0b3JzLjAvQGFjY2Vzc29ycy4wIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkRlY2lzaW9uTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy4wL0BhY2Nlc3NvcnMuMCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIgotICAgICAgZmlndXJlPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICBlbGVtZW50SWNvbj0iZmFsc2UiCi0gICAgICBhY2Nlc3Nvcj0iLy9AZmlndXJlcy4wL0BkZXNjcmlwdG9ycy45L0BhY2Nlc3NvcnMuMCIvPgotPC9nbWZncmFwaDpDYW52YXM+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQ2OTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDYvbWFwcGluZ3MiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RmluYWxOb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjUiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL01lcmdlTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMyIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNNZXJnZU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0ZvcmtOb2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNGb3JrTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSW5pdGlhbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0dlbmVyaWNMYWJlbCIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNJbml0aWFsTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vRGVjaXNpb25Ob2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNEZWNpc2lvbk5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSm9pbk5vZGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy42Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0pvaW5Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjgiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvZ3JvdXAiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25OYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4wIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICBjb21wYXJ0bWVudD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY29tcGFydG1lbnRzLjAiCi0gICAgICAgICAgcmVmZXJlbmNlZENoaWxkPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkIj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cwotICAgICAgICAgIGNoaWxkcmVuPSIvL0Bub2Rlcy43L0Bvd25lZENoaWxkL0BjaGlsZHJlbi4wIj4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1BhcnRpdGlvbkNhbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjExIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjkiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9JdGVyYXRpb24iCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTAiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICA8ZG9tYWluU3BlY2lhbGl6YXRpb24KLSAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICBsYW5ndWFnZT0iamF2YSIvPgotICAgICAgPGRvbWFpbkluaXRpYWxpemVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICA8aW5pdGlhbGl6ZXJzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX01pbGVzdG9uZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQ29udHJvbEZsb3ciLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3dMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlL2VkZ2UiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgPGRpYWdyYW1MaW5rCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQ29udHJvbEZsb3ciLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2UvdGFyZ2V0Ii8+Ci0gIDwvbGlua3M+Ci0gIDxkaWFncmFtPgotICAgIDxkaWFncmFtQ2FudmFzCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjdW1sIi8+Ci0gICAgPGRvbWFpbk1vZGVsCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5Ii8+Ci0gICAgPHBhbGV0dGUKLSAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUiLz4KLSAgPC9kaWFncmFtPgotPC9nbWZtYXA6TWFwcGluZz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mdG9vbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0uZ21mdG9vbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllNDY5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtLmdtZnRvb2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8cGFsZXR0ZT4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iRmxvd3MiCi0gICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93Ij4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0NvbnRyb2xGbG93LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0aW9uIHRvb2wgZ3JvdXAgZm9yIG5vZGVzIgotICAgICAgICBjb2xsYXBzaWJsZT0idHJ1ZSIKLSAgICAgICAgYWN0aXZlPSIvL0BwYWxldHRlL0B0b29scy4xIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5IFBhcnRpdGlvbiI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eVBhcnRpdGlvbi5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlN0YXJ0IE5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU3RhcnQgTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkZvcmsgTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBGb3JrIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJNZXJnZSBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1lcmdlIE5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iRGVjaXNpb24gTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkVuZCBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEVuZCBOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iSm9pbiBOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEpvaW4gTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpQYWxldHRlU2VwYXJhdG9yIi8+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkFjdGl2aXR5IgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEFjdGl2aXR5Ij4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iUGhhc2UiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUGhhc2UiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIgotICAgICAgICAgICAgYnVuZGxlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmciLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJJdGVyYXRpb24iCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgSXRlcmF0aW9uIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iVGFzayBEZXNjcmlwdG9yIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvciI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkJ1bmRsZUltYWdlIgotICAgICAgICAgICAgcGF0aD0iaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZyIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9Ik1pbGVzdG9uZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNaWxlc3RvbmUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIKLSAgICAgICAgICAgIGJ1bmRsZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICA8L3BhbGV0dGU+Ci08L2dtZnRvb2w6VG9vbFJlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA3MmNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL21vZGVsL2VwZmRpYWdyYW0yLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDkyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiCi0gICAgbW9kZWxJRD0iQUQiCi0gICAgc2FtZUZpbGVGb3JEaWFncmFtQW5kTW9kZWw9InRydWUiCi0gICAgZGlhZ3JhbUZpbGVFeHRlbnNpb249InhtaSIKLSAgICB0ZW1wbGF0ZURpcmVjdG9yeT0iIgotICAgIGNvcHlyaWdodFRleHQ9IiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJiN4RDsmI3hBOyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzJiN4RDsmI3hBOyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAmI3hEOyYjeEE7IHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0JiN4RDsmI3hBOyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCYjeEQ7JiN4QTsmI3hEOyYjeEE7IENvbnRyaWJ1dG9yczomI3hEOyYjeEE7IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24mI3hEOyYjeEE7Ij4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlWaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICBjcmVhdGlvbldpemFyZEljb25QYXRoPSJpY29ucy9kaWFncmFtL2FjdGl2aXR5LmdpZiIKLSAgICAgIHZhbGlkYXRpb25Qcm92aWRlckNsYXNzTmFtZT0iVmFsaWRhdGlvblByb3ZpZGVyIgotICAgICAgbWV0cmljUHJvdmlkZXJDbGFzc05hbWU9Ik1ldHJpY1Byb3ZpZGVyIgotICAgICAgdmFsaWRhdGlvbkRlY29yYXRvclByb3ZpZGVyQ2xhc3NOYW1lPSJWYWxpZGF0aW9uRGVjb3JhdG9yUHJvdmlkZXIiPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJBY3Rpdml0eUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5Ii8+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb24yVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEgLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjcvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlhZX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgzMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDYwMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4RDsmI3hBO25ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpJiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDI1NSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5UGFydGl0aW9uIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24vc3VicGFydGl0aW9uIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDYiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRW5kTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBFbmROb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRW5kTm9kZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgRW5kTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKEVORE5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIEVORE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCIKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlGaW5hbE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTWVyZ2VOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJNZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJNZXJnZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTWVyZ2VOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9Ik1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRm9ya05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJGb3JrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJGb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkZvcmtOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpSZXNpemVDb25zdHJhaW50cyIKLSAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXM9IjI0Ii8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvRm9ya05vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNCIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkluaXRpYWxOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJJbml0aWFsTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkluaXRpYWxOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEluaXRpYWxOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2UgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEluaXRpYWxOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoSU5JVElBTE5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgSU5JVElBTE5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9Jbml0aWFsTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5FeHRlcm5hbE5vZGVMYWJlbCIKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSW5pdGlhbE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJJbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSJ7MH0iCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDUiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iRGVjaXNpb25Ob2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJEZWNpc2lvbk5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJEZWNpc2lvbkRpYW1vbmRGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRGVjaXNpb25EaWFtb25kRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUmI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihERUNJU0lPTkRJQU1PTkRGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlRGlhbW9uZExhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmRGlhbW9uZExhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZEaWFtb25kTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlRGlhbW9uZExhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkRpYW1vbmRMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAxODUsIDIwNSwgMjMwKTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvRGVjaXNpb25Ob2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkRlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIE5vZGVOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBOb2RlTmFtZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA2IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iSm9pbk5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJKb2luTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJKb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkpvaW5Ob2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iRm9ya05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihGT1JLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMTAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBGT1JLTk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCA0NSwgODUsIDEzMCk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpSZXNpemVDb25zdHJhaW50cyIKLSAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXM9IjI0Ii8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvSm9pbk5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwNyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX0FjdGl2aXR5IgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkmI3hEOyYjeEE7IgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA1IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDgiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iWFlfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0TGF5b3V0TWFuYWdlcihteUdlbkxheW91dE1hbmFnZXIpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNjAwKSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJvcmRlcigmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyKCkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUGFydGl0aW9uTGFiZWxGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjU1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRGb3JlZ3JvdW5kPSJ0cnVlIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ncm91cCIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L2dyb3VwIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDciCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIi8+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDA5IgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudFNlbGVjdG9yCi0gICAgICAgICAgICBib2R5PSJnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5nZW5tb2RlbCMvL2Vjb3JlL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICAgIDwvbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXI+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDgiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTAiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5L25vZGUiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRTZWxlY3RvcgotICAgICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICAgIDxtb2RlbEVsZW1lbnRJbml0aWFsaXplcgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlU2VxSW5pdGlhbGl6ZXIiPgotICAgICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5GZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgICBib2R5PSJjcmVhdGVVbWFUeXBlX1BoYXNlIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDA5IgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNwZWNpYWxpemF0aW9uVHlwZSIKLSAgICAgICAgICBtZXRhbW9kZWxUeXBlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQGVsZW1lbnRUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJBZHZpY2VDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDEwIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L3RvcExldmVsTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMTIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTcGVjaWFsaXphdGlvblR5cGUiCi0gICAgICAgICAgbWV0YW1vZGVsVHlwZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44L0BlbGVtZW50VHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQWR2aWNlQ2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWw7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvL3VtbC9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHkvbm9kZSIvPgotICAgICAgICA8bW9kZWxFbGVtZW50U2VsZWN0b3IKLSAgICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgICAgPG1vZGVsRWxlbWVudEluaXRpYWxpemVyCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkZlYXR1cmVWYWx1ZVNwZWMiCi0gICAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfTWlsZXN0b25lIgotICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZ2VubW9kZWwjLy9lY29yZS9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgICA8L21vZGVsRWxlbWVudEluaXRpYWxpemVyPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDExIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUySXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkNvbnRyb2xGbG93RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkNvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQ29udHJvbEZsb3dWaWV3RmFjdG9yeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJDb250cm9sRmxvd0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkNvbnRyb2xGbG93RmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIENvbnRyb2xGbG93RmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIENvbnRyb2xGbG93RmlndXJlKCkgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldFRhcmdldERlY29yYXRpb24oY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7JiN4RDsmI3hBO29yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbigpOyYjeEQ7JiN4QTsvLyBkaXNwYXRjaE5leHQ/JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdCBwbCA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0KCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgtMSwgMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtwbC5hZGRQb2ludCgwLCAwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAtMSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRUZW1wbGF0ZShwbCk7JiN4RDsmI3hBOyYjeDk7JiN4OTtkZi5zZXRTY2FsZShnZXRNYXBNb2RlKCkuRFB0b0xQKDcpLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDMpKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0NvbnRyb2xGbG93Ii8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmdlbm1vZGVsIy8vdW1sL0FjdGl2aXR5RWRnZS9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvQWN0aXZpdHlFZGdlL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDEyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJDb250cm9sRmxvd05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkNvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9IkNvbnRyb2xGbG93TGFiZWxGaWd1cmUiCi0gICAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBDb250cm9sRmxvd0xhYmVsRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZ2VubW9kZWwjLy91bWwvTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICB0aXRsZT0iUGFydGl0aW9uQ2FtcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuNyIKLSAgICAgICAgbGlzdExheW91dD0iZmFsc2UiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MlZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIKLSAgICAgICAgdGl0bGU9IlBhcnRpdGlvbkNhbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIGxpc3RMYXlvdXQ9ImZhbHNlIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkZsb3dzIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGlvbiB0b29sIGZvciBmbG93cyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvQ29udHJvbEZsb3cuZ2lmIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRpb24gdG9vbCBncm91cCBmb3Igbm9kZXMiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQWN0aXZpdHkgUGFydGl0aW9uIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5UGFydGl0aW9uLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjcgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJTdGFydCBOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgU3RhcnQgTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Jbml0aWFsTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4zIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJGb3JrIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBGb3JrIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvRm9ya05vZGUuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTWVyZ2UgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IE1lcmdlIE5vZGUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWVyZ2VOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkRlY2lzaW9uIE5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBEZWNpc2lvbiBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0RlY2lzaW9uTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy40Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJFbmQgTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEVuZCBOb2RlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RmluYWxOb2RlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkpvaW4gTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEpvaW4gTm9kZSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9Kb2luTm9kZS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy41Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlNlcGFyYXRvciIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQWN0aXZpdHkiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBBY3Rpdml0eSIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJQaGFzZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFBoYXNlIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtbWluZy9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjkiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9Ikl0ZXJhdGlvbiIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IEl0ZXJhdGlvbiIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2sgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbW1pbmcvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy44Ii8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJNaWxlc3RvbmUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBNaWxlc3RvbmUiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW1taW5nL2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjExIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIgotICAgICAgbmFtZT0iRVBGIEFjdGl2aXR5IERpYWdyYW0iCi0gICAgICBwcm92aWRlcj0iRWNsaXBzZS5vcmciCi0gICAgICB2ZXJzaW9uPSIxLjIuMC5xdWFsaWZpZXIiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IkFjdGl2aXR5RGlhZ3JhbUVkaXRvciIvPgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5nZW5tb2RlbCMvIi8+Ci0gIDxleHByZXNzaW9uUHJvdmlkZXJzPgotICAgIDxwcm92aWRlcnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5KYXZhRXhwcmVzc2lvblByb3ZpZGVyIgotICAgICAgICBleHByZXNzaW9ucz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy42L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRTZWxlY3RvciAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjYvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCAvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjgvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuOS9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy45L0Btb2RlbEZhY2V0L0Btb2RlbEVsZW1lbnRJbml0aWFsaXplci9AaW5pdGlhbGl6ZXJzLjAgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50U2VsZWN0b3IgLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xMC9AbW9kZWxGYWNldC9AbW9kZWxFbGVtZW50SW5pdGlhbGl6ZXIvQGluaXRpYWxpemVycy4wIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudFNlbGVjdG9yIC8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMTEvQG1vZGVsRmFjZXQvQG1vZGVsRWxlbWVudEluaXRpYWxpemVyL0Bpbml0aWFsaXplcnMuMCIvPgotICA8L2V4cHJlc3Npb25Qcm92aWRlcnM+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZtYXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9tb2RlbC9lcGZkaWFncmFtMi5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjEwZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvbW9kZWwvZXBmZGlhZ3JhbTIuZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MvMi4wIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUZpbmFsTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiIKLSAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNHZW5lcmljTGFiZWwiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjUiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlGaW5hbE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL01lcmdlTm9kZSIvPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciCi0gICAgICAgICAgdmlld1BhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMyIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNNZXJnZU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0ZvcmtOb2RlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMiIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNGb3JrTm9kZSIvPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHkvbm9kZSIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vSW5pdGlhbE5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjR2VuZXJpY0xhYmVsIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0luaXRpYWxOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9EZWNpc2lvbk5vZGUiLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0RlY2lzaW9uTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjQiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjRGVjaXNpb25Ob2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9Kb2luTm9kZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjYiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjSm9pbk5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfQWN0aXZpdHkiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9BY3Rpdml0eSYjeEQ7JiN4QTsiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuOCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ncm91cCIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlQYXJ0aXRpb24iLz4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiCi0gICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjUGFydGl0aW9uTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcnRpdGlvbiIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgY29tcGFydG1lbnQ9Ii8vQG5vZGVzLjcvQG93bmVkQ2hpbGQvQGNvbXBhcnRtZW50cy4wIgotICAgICAgICAgIHJlZmVyZW5jZWRDaGlsZD0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZCI+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFydGl0aW9uL3N1YnBhcnRpdGlvbiIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgICBjaGlsZHJlbj0iLy9Abm9kZXMuNy9Ab3duZWRDaGlsZC9AY2hpbGRyZW4uMCI+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNQYXJ0aXRpb25DYW1wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eS9ub2RlIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3IiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9UYXNrRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy4xMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eVBhcmFtZXRlck5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfUGhhc2UiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9QaGFzZSIKLSAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj4KLSAgICAgICAgICA8ZmVhdHVyZQotICAgICAgICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VNb2RlbEVsZW1lbnQvZUFubm90YXRpb25zIi8+Ci0gICAgICAgIDwvaW5pdGlhbGl6ZXJzPgotICAgICAgPC9kb21haW5Jbml0aWFsaXplcj4KLSAgICAgIDxsYWJlbE1hcHBpbmdzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZncmFwaCNBY3Rpdml0eU5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4xL0B0b29scy45Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICAgIDxkb21haW5TcGVjaWFsaXphdGlvbgotICAgICAgICAgIGJvZHk9ImdldFVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIi8+Ci0gICAgICA8ZG9tYWluSW5pdGlhbGl6ZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVTZXFJbml0aWFsaXplciI+Ci0gICAgICAgIDxpbml0aWFsaXplcnMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVZhbHVlU3BlYyIKLSAgICAgICAgICAgIGJvZHk9ImNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uIgotICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPgotICAgICAgICAgIDxmZWF0dXJlCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmVjb3JlIy8vRU1vZGVsRWxlbWVudC9lQW5ub3RhdGlvbnMiLz4KLSAgICAgICAgPC9pbml0aWFsaXplcnM+Ci0gICAgICA8L2RvbWFpbkluaXRpYWxpemVyPgotICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mbWFwOkZlYXR1cmVMYWJlbE1hcHBpbmciPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0FjdGl2aXR5Tm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9OYW1lZEVsZW1lbnQvbmFtZSIvPgotICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iZXBmZGlhZ3JhbS5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjEwIi8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5L25vZGUiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0FjdGl2aXR5UGFyYW1ldGVyTm9kZSIvPgotICAgICAgPGRvbWFpblNwZWNpYWxpemF0aW9uCi0gICAgICAgICAgYm9keT0iZ2V0VW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiLz4KLSAgICAgIDxkb21haW5Jbml0aWFsaXplcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZVNlcUluaXRpYWxpemVyIj4KLSAgICAgICAgPGluaXRpYWxpemVycwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlVmFsdWVTcGVjIgotICAgICAgICAgICAgYm9keT0iY3JlYXRlVW1hVHlwZV9NaWxlc3RvbmUiCi0gICAgICAgICAgICBsYW5ndWFnZT0iamF2YSI+Ci0gICAgICAgICAgPGZlYXR1cmUKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FTW9kZWxFbGVtZW50L2VBbm5vdGF0aW9ucyIvPgotICAgICAgICA8L2luaXRpYWxpemVycz4KLSAgICAgIDwvZG9tYWluSW5pdGlhbGl6ZXI+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyI+Ci0gICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZSIvPgotICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMS9AdG9vbHMuMTIiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mZ3JhcGgjQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL0NvbnRyb2xGbG93Ii8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0NvbnRyb2xGbG93TGFiZWwiLz4KLSAgICAgIDxmZWF0dXJlcwotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLnVtbDIudW1sL21vZGVsL1VNTC5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9sYWJlbE1hcHBpbmdzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vU3RydWN0dXJlZEFjdGl2aXR5Tm9kZS9lZGdlIi8+Ci0gICAgPHRvb2wKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMCIvPgotICAgIDxkaWFncmFtTGluawotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI0NvbnRyb2xGbG93Ii8+Ci0gICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eUVkZ2Uvc291cmNlIi8+Ci0gICAgPGxpbmtNZXRhRmVhdHVyZQotICAgICAgICB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UudW1sMi51bWwvbW9kZWwvVU1MLmVjb3JlIy8vQWN0aXZpdHlFZGdlL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJlcGZkaWFncmFtLmdtZmdyYXBoI3VtbCIvPgotICAgIDxkb21haW5Nb2RlbAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLyIvPgotICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS51bWwyLnVtbC9tb2RlbC9VTUwuZWNvcmUjLy9BY3Rpdml0eSIvPgotICAgIDxwYWxldHRlCi0gICAgICAgIGhyZWY9ImVwZmRpYWdyYW0uZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmIyOTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU1RBUlQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcmVmZXJlbmNlcy5nZW5lcmFsPUFEIERpYWdyYW0KLXByZWZlcmVuY2VzLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQotcHJlZmVyZW5jZXMuY29ubmVjdGlvbnM9Q29ubmVjdGlvbnMKLXByZWZlcmVuY2VzLnByaW50aW5nPVByaW50aW5nCi1wcmVmZXJlbmNlcy5ydWxlcnNBbmRHcmlkPVJ1bGVycyAmIEdyaWQKLXByZWZlcmVuY2VzLnBhdGhtYXBzPVBhdGggTWFwcwotCi1lZGl0b3JOYW1lPUFEIERpYWdyYW0gRWRpdG9yCi1uZXdXaXphcmROYW1lPUFEIERpYWdyYW0KLW5ld1dpemFyZERlc2M9Q3JlYXRlcyBBRCBkaWFncmFtLgotCi1pbml0RGlhZ3JhbUFjdGlvbkxhYmVsPUluaXRpYWxpemUgeG1pIGRpYWdyYW0gZmlsZQotbG9hZFJlc291cmNlQWN0aW9uTGFiZWw9TG9hZCBSZXNvdXJjZS4uLgotCi1uYXZpZ2F0b3JDb250ZW50TmFtZT0qLnhtaSBkaWFncmFtIGNvbnRlbnRzCi0KLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlfNzk9VW5kZWZpbmVkCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5RmluYWxOb2RlXzEwMDE9QWN0aXZpdHlGaW5hbE5vZGUKLW1ldGF0eXBlLm5hbWUuTWVyZ2VOb2RlXzEwMDI9TWVyZ2VOb2RlCi1tZXRhdHlwZS5uYW1lLkZvcmtOb2RlXzEwMDM9Rm9ya05vZGUKLW1ldGF0eXBlLm5hbWUuSW5pdGlhbE5vZGVfMTAwND1Jbml0aWFsTm9kZQotbWV0YXR5cGUubmFtZS5EZWNpc2lvbk5vZGVfMTAwNT1EZWNpc2lvbk5vZGUKLW1ldGF0eXBlLm5hbWUuSm9pbk5vZGVfMTAwNj1Kb2luTm9kZQotbWV0YXR5cGUubmFtZS5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDc9U3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotbWV0YXR5cGUubmFtZS5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4PUFjdGl2aXR5UGFydGl0aW9uCi1tZXRhdHlwZS5uYW1lLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5PUFjdGl2aXR5UGFyYW1ldGVyTm9kZQotbWV0YXR5cGUubmFtZS5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTA9U3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotbWV0YXR5cGUubmFtZS5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTE9U3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotbWV0YXR5cGUubmFtZS5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMj1BY3Rpdml0eVBhcmFtZXRlck5vZGUKLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMT1BY3Rpdml0eVBhcnRpdGlvbgotbWV0YXR5cGUubmFtZS5Db250cm9sRmxvd18zMDAxPUNvbnRyb2xGbG93Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotcGx1Z2luTmFtZT1FUEYgQWN0aXZpdHkgRGlhZ3JhbQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSNOZWVkcyBUcmFuc2xhdGlvbgotb3Blbl9hZGRfdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1lbGVtZW50X3R5cGVfYWN0aXZpdHlfcGFydGl0aW9uPUFjdGl2aXR5IFBhcnRpdGlvbgotZWxlbWVudF90eXBlX2VuZF9ub2RlPUVuZCBOb2RlCi1lbGVtZW50X3R5cGVfbWVyZ2Vfbm9kZT1NZXJnZSBOb2RlCi1lbGVtZW50X3R5cGVfZm9ya19ub2RlPUZvcmsgTm9kZQotZWxlbWVudF90eXBlX3N0YXJ0X25vZGU9U3RhcnQgTm9kZQotZWxlbWVudF90eXBlX2RlY2lzaW9uX25vZGU9RGVjaXNpb24gTm9kZQotZWxlbWVudF90eXBlX2pvaW5fbm9kZT1Kb2luIE5vZGUKLWVsZW1lbnRfdHlwZV9hY3Rpdml0eT1BY3Rpdml0eQotZWxlbWVudF90eXBlX3BoYXNlPVBoYXNlCi1lbGVtZW50X3R5cGVfaXRlcmF0aW9uPUl0ZXJhdGlvbgotZWxlbWVudF90eXBlX3Rhc2tfZGVzY3JpcHRvcj1UYXNrIERlc2NyaXB0b3IKLWVsZW1lbnRfdHlwZV9taWxlc3RvbmU9TWlsZXN0b25lCi1lbGVtZW50X3R5cGVfY29udHJvbF9mbG93PUNvbnRyb2wgRmxvdwotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmZWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotCi0gQ29udHJpYnV0b3JzOgotIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLQotLS0+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS5maWxlVHlwZXMiPgotICAgICAgPGZpbGVUeXBlcwotICAgICAgICAgdHlwZT0idGV4dCIKLSAgICAgICAgIGV4dGVuc2lvbj0ieG1pIj4KLSAgICAgIDwvZmlsZVR5cGVzPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgICAgPHBhcnNlcgotICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3RvcnkiPgotICAgICAgPC9wYXJzZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgIDxlZGl0b3IKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5IERpYWdyYW0gRWRpdG9yIgotICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvQURFZGl0b3IuZ2lmIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3IiCi0gICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gIDwhLS0gPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0gIAkgIDx3aXphcmQKLSAgCSAgICAgbmFtZT0iQWN0aXZpdHkgRGlhZ3JhbSIKLSAgCSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvVU1MRGlhZ3JhbUZpbGUuZ2lmIgotICAJICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuRXhhbXBsZXMiCi0gIAkgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTENyZWF0aW9uV2l6YXJkIgotICAJICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxDcmVhdGlvbldpemFyZElEIj4KLSAgCSAgCSA8ZGVzY3JpcHRpb24+Ci0gIAkgIAkJQ3JlYXRlcyBBY3Rpdml0eSBkaWFncmFtLgotICAJICAJIDwvZGVzY3JpcHRpb24+ICAKLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+IC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgCTwhLS0gPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5JRmlsZTEiCi0gICAgICAgICAgICBuYW1lRmlsdGVyPSIqLnVtbCIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iSW5pdGlhbGl6ZSB4bWkgZGlhZ3JhbSBmaWxlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25JRCI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5BY3Rpdml0eUVkaXRQYXJ0MiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MTG9hZFJlc291cmNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTExvYWRSZXNvdXJjZUFjdGlvbklEIgotICAgICAgICAgICAgICAgbGFiZWw9IkxvYWQgUmVzb3VyY2UuLi4iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+IAotIC0tPgotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25JdGVtUHJvdmlkZXJzIj4KLSAgCSA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ij4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8cGFydENvbnRyaWJ1dGlvbiBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8cGFydEFjdGlvbiBtZW51YmFyUGF0aD0iL2ZpbGUvcHJpbnQiIGlkPSJwcmludFByZXZpZXdBY3Rpb24iPgotICAgICAgICAgICAgPC9wYXJ0QWN0aW9uPgotICAgICAgICAgPC9wYXJ0Q29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICAgICA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciIKLSAgICAgICAgICAgIGNoZWNrUGx1Z2luTG9hZGVkPSJmYWxzZSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21Nb2RlbEFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tTW9kZWxBY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydCIvPgotCQkJPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4gCi0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbU1vZGVsQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4gCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5nbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXJzIj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFEUHJlc2VudGF0aW9uIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJkZWxldGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InNhdmUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVdpdGhQcmludEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJBRFByZXNlbnRhdGlvblByaW50Ij4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwcmludCIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLnByb3ZpZGVycy5EaWFncmFtSURFR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFEUHJlc2VudGF0aW9uSURFIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxWaWV3SWQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJib29rbWFyayIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8IS0tCi0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1VSVJlbmRlckdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgICAgIGlkPSJBRFJlbmRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY3V0Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImNvcHkiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icGFzdGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgLS0+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXdQcm92aWRlcnMiPgotICAgICAgPHZpZXdQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTFZpZXdQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0iIHNlbWFudGljSGludHM9IkFEIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgIDwvdmlld1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRQcm92aWRlcnMiPgotICAgICAgPGVkaXRwYXJ0UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFZGl0UGFydFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvZWRpdHBhcnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhbGV0dGVQcm92aWRlcnMiPgotICAgICAgPHBhbGV0dGVQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTFBhbGV0dGVQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EZWZhdWx0UGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgPFByaW9yaXR5IG5hbWU9Ik1lZGl1bSIvPgotICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICAgIDxjb250cmlidXRpb24+Ci0gICAgICAgICAgICA8cHJlZGVmaW5lZEVudHJ5ICAgIAotICAgICAgICAgICAgCWlkPSJnZW9zaGFwZURyYXdlciIgcGF0aD0iLyI+Ci0gICAgICAgICAgICAgPC9wcmVkZWZpbmVkRW50cnk+IAotICAgICAgICA8L2NvbnRyaWJ1dGlvbj4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVycyI+Ci0gICAgICA8bW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXNQcm92aWRlcnMiPgotICAgICAgPFByb3BlcnRpZXNQcm92aWRlcgotICAgICAgICAgICAgdmVyaWZ5UGx1Z2luTG9hZGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MUHJvcGVydHlQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1Byb3BlcnRpZXNQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvblByb3ZpZGVycyI+Ci0gICAgICA8SWNvblByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MSWNvblByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgICAgPEljb25Qcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLnByb3ZpZGVycy5HZW9TaGFwZUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkKLSAgICAgICAgICAgICAgIG5hbWU9Ik1lZGl1bSI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPG9iamVjdCBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbikiIGlkPSJHZW9TaGFwZSI+Ci0gICAgICAgIAkgPG1ldGhvZCBuYW1lPSJnZXRUeXBlKCkiIHZhbHVlPSJvdmFsLHRyaWFuZ2xlLHJlY3RhbmdsZSxzaGFkb3dSZWN0YW5nbGUscmVjdGFuZ2xlM0Qscm91bmRSZWN0YW5nbGUsaGV4YWdvbixvY3RhZ29uLHBlbnRhZ29uLGRpYW1vbmQsY3lsaW5kZXIsbGluZSIvPgotCSAgICAgPC9vYmplY3Q+Ci0gICAgICAgICA8Y29udGV4dCBlbGVtZW50cz0iR2VvU2hhcGUiPgotICAgICAgICAgPC9jb250ZXh0PgotICAgICAgPC9JY29uUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlclByb3ZpZGVycyI+Ci0gICAgICA8UGFyc2VyUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxQYXJzZXJQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1BhcnNlclByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVzIj4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5Xzc5IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHkiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSI3OSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2FjdGl2aXR5X3BhcnRpdGlvbiIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyYWR2aWNlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjIwMDEiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9lbmRfbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5RmluYWxOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5NZXJnZU5vZGVfMTAwMiIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfbWVyZ2Vfbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9Ik1lcmdlTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5NZXJnZU5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAyIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkZvcmtOb2RlXzEwMDMiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2Zvcmtfbm9kZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkZvcmtOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkZvcmtOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwMyIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Jbml0aWFsTm9kZV8xMDA0IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9zdGFydF9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iSW5pdGlhbE5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuSW5pdGlhbE5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA0Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkRlY2lzaW9uTm9kZV8xMDA1IgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9kZWNpc2lvbl9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iRGVjaXNpb25Ob2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkRlY2lzaW9uTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDUiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSm9pbk5vZGVfMTAwNiIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfam9pbl9ub2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iSm9pbk5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuSm9pbk5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA2Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfYWN0aXZpdHkiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDA3Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMS4wL1VNTCI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX2FjdGl2aXR5X3BhcnRpdGlvbiIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5UGFydGl0aW9uIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFydGl0aW9uRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMTAwOCIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfdGFza19kZXNjcmlwdG9yIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAiCi0gICAgICAgICAgICAgICBuYW1lPSIlZWxlbWVudF90eXBlX3BoYXNlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSI+Ci0gICAgICAgICAgICA8c3BlY2lhbGl6ZXMgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMTAiLz4KLSAgICAgICAgIDwvc3BlY2lhbGl6YXRpb25UeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjEuMC9VTUwiPgotICAgICAgICAgPHNwZWNpYWxpemF0aW9uVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfaXRlcmF0aW9uIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRIZWxwZXJBZHZpY2UiPgotICAgICAgICAgICAgPHNwZWNpYWxpemVzIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDciLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDExIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxzcGVjaWFsaXphdGlvblR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfbWlsZXN0b25lIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXJhZHZpY2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlIj4KLSAgICAgICAgICAgIDxzcGVjaWFsaXplcyBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiLz4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDEyIi8+Ci0gICAgICAgICA8L3NwZWNpYWxpemF0aW9uVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4xLjAvVU1MIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQ29udHJvbEZsb3dfMzAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfY29udHJvbF9mbG93IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iQ29udHJvbEZsb3ciCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuQ29udHJvbEZsb3dFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlQmluZGluZ3MiPgotICAgICAgPGNsaWVudENvbnRleHQgaWQ9IkFEQ2xpZW50Q29udGV4dCI+Ci0gICAgICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgICAgIDx0ZXN0Ci0gICAgICAgICAgICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuZWRpdGluZ0RvbWFpbiIKLSAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5FZGl0aW5nRG9tYWluIi8+Ci0gICAgICAgICA8L2VuYWJsZW1lbnQ+Ci0gICAgICA8L2NsaWVudENvbnRleHQ+IAotICAgICAgPGJpbmRpbmcgY29udGV4dD0iQURDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5Xzc5Ii8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5NZXJnZU5vZGVfMTAwMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRm9ya05vZGVfMTAwMyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuSW5pdGlhbE5vZGVfMTAwNCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRGVjaXNpb25Ob2RlXzEwMDUiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkpvaW5Ob2RlXzEwMDYiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQ29udHJvbEZsb3dfMzAwMSIvPgotICAgICAgICAgPGFkdmljZSByZWY9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5hZHZpY2Uubm90YXRpb25EZXBkZW5kZW50cyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHBhdHRlcm49Ii4qIi8+Ci0gICAgICA8L2JpbmRpbmc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5lc3RlZENvbW1hbmRQcm92aWRlcnMiPgotICAgICAgPG5lc3RlZENvbW1hbmRQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmNvbW1hbmRzLk5lc3RlZENvbW1hbmRQcm92aWRlciI+Ci0gICAgICA8L25lc3RlZENvbW1hbmRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BREltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FESW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjhhNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FESW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQURJbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMQ0wxNiA9ICJmdWxsL2VsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExDTDE2ID0gImZ1bGwvZGxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0VESVRPUiA9IEVUT09MMTYgKyAiQURFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0VESVRPUiA9IERUT09MMTYgKyAiQURFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19FRElUT1IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0VESVRPUik7CQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19FRElUT1IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0VESVRPUik7CQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FjdGl2aXR5RGlhZ3JhbVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL0FjdGl2aXR5RGlhZ3JhbVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODVhMTAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9BY3Rpdml0eURpYWdyYW1QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDM4NWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jb21tYW5kcy9OZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5UeXBlQ29udmVydGVyLlR5cGVDb252ZXJzaW9uQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRDb21tYW5kUHJvdmlkZXIgaW1wbGVtZW50cyBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIjY3JlYXRlTmVzdGVkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCkKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kKENvbW1hbmQgY29tbWFuZCkgewotCQlpZihjb21tYW5kIGluc3RhbmNlb2YgVHlwZUNvbnZlcnNpb25Db21tYW5kKSB7Ci0JCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvclR5cGVDb252ZXJzaW9uKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yVHlwZUNvbnZlcnNpb24oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIGNoYW5nZSB0eXBlIG9mIGFjdGl2aXR5IG5vZGUgaW4gZGlhZ3JhbQotCQkvLwotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBlID0gcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpIGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIG5ld1R5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0VHlwZShhY3Rpdml0eSk7CQkJCQkKLQkJCQkJTGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKSwgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJCQlTZXRUeXBlQ29tbWFuZCBjbWQgPSBuZXcgU2V0VHlwZUNvbW1hbmQoKTsKLQkJCQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBkaWFncmFtcykgewotCQkJCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgdW1sQWN0ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiB1bWxBY3QuZ2V0Tm9kZXMoKSkgewotCQkJCQkJCVN0cmluZyB1cmlTdHIgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25EZXRhaWwobm9kZSwgQnJpZGdlSGVscGVyLlVNQV9VUkkpOwotCQkJCQkJCWlmKHVyaVN0ciAhPSBudWxsKSB7Ci0JCQkJCQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cik7Ci0JCQkJCQkJCVN0cmluZyBndWlkID0gdXJpLmZyYWdtZW50KCk7Ci0JCQkJCQkJCWlmKGFjdGl2aXR5LmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkpIHsKLQkJCQkJCQkJCVZpZXcgdmlldyA9IEJyaWRnZUhlbHBlci5nZXRWaWV3KGRpYWdyYW0sIG5vZGUpOwotCQkJCQkJCQkJY21kLnByZXBhcmUodmlldywgbm9kZSwgbmV3VHlwZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYoY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJcmV0dXJuIGNtZDsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gY3JlYXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBjcmVhdGVDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBkZWxldGVDb21tYW5kKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2NvbW1hbmRzL1NldFR5cGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0Y2U0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY29tbWFuZHMvU2V0VHlwZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNldFR5cGVDb21tYW5kIGV4dGVuZHMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBNYXA8RU1vZGVsRWxlbWVudCwgU3RyaW5nPiBlbGVtZW50VG9OZXdUeXBlTWFwID0gbmV3IEhhc2hNYXA8RU1vZGVsRWxlbWVudCwgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwPEVNb2RlbEVsZW1lbnQsIFN0cmluZz4gZWxlbWVudFRvT2xkVHlwZU1hcDsKLQlwcml2YXRlIE1hcDxWaWV3LCBTdHJpbmc+IHZpZXdUb05ld1R5cGVNYXAgPSBuZXcgSGFzaE1hcDxWaWV3LCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBNYXA8VmlldywgU3RyaW5nPiB2aWV3VG9PbGRUeXBlTWFwOwotCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlmb3IgKEVNb2RlbEVsZW1lbnQgZSA6IGVsZW1lbnRUb05ld1R5cGVNYXAua2V5U2V0KCkpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZS5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZihlbGVtZW50VG9PbGRUeXBlTWFwID09IG51bGwpIHsKLQkJCWVsZW1lbnRUb09sZFR5cGVNYXAgPSBuZXcgSGFzaE1hcDxFTW9kZWxFbGVtZW50LCBTdHJpbmc+KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllbGVtZW50VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJZm9yIChNYXAuRW50cnk8RU1vZGVsRWxlbWVudCwgU3RyaW5nPiBlbnRyeSA6IGVsZW1lbnRUb05ld1R5cGVNYXAuZW50cnlTZXQoKSkgewotCQkJZmluYWwgRU1vZGVsRWxlbWVudCBlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlmaW5hbCBTdHJpbmcgdHlwZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBvbGRUeXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uRGV0YWlsKGUsIEJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUoZSwgdHlwZSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJZWxlbWVudFRvT2xkVHlwZU1hcC5wdXQoZSwgb2xkVHlwZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCQlpZighdmlld1RvTmV3VHlwZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWlmKHZpZXdUb09sZFR5cGVNYXAgPT0gbnVsbCkgewotCQkJCXZpZXdUb09sZFR5cGVNYXAgPSBuZXcgSGFzaE1hcDxWaWV3LCBTdHJpbmc+KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2aWV3VG9PbGRUeXBlTWFwLmNsZWFyKCk7Ci0JCQl9Ci0JCQlmb3IgKE1hcC5FbnRyeTxWaWV3LCBTdHJpbmc+IGVudHJ5IDogdmlld1RvTmV3VHlwZU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJZmluYWwgVmlldyB2aWV3ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJZmluYWwgU3RyaW5nIG5ld1R5cGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZpbmFsIFN0cmluZyBvbGRUeXBlID0gdmlldy5nZXRUeXBlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24odmlldywgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld05hbWVUeXBlID0gU3RyaW5nLnZhbHVlT2YoZ2V0Vmlld05hbWVUeXBlKEludGVnZXIucGFyc2VJbnQobmV3VHlwZSkpKTsKLQkJCQkJCQlTdHJpbmcgb2xkTmFtZVR5cGUgPSBTdHJpbmcudmFsdWVPZihnZXRWaWV3TmFtZVR5cGUoSW50ZWdlci5wYXJzZUludChvbGRUeXBlKSkpOwotCQkJCQkJCXZpZXcuc2V0VHlwZShuZXdUeXBlKTsKLQkJCQkJCQkvLyBzZXQgbmV3IHR5cGUgZm9yIG5vZGUgbmFtZXMKLQkJCQkJCQkvLwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCVZpZXcgY2hpbGQgPSAoVmlldykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZihjaGlsZC5nZXRUeXBlKCkuZXF1YWxzKG9sZE5hbWVUeXBlKSkgewotCQkJCQkJCQkJY2hpbGQuc2V0VHlwZShuZXdOYW1lVHlwZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfSk7Ci0JCQkJCXZpZXdUb09sZFR5cGVNYXAucHV0KHZpZXcsIG9sZFR5cGUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChlbGVtZW50VG9PbGRUeXBlTWFwICE9IG51bGwgJiYgIWVsZW1lbnRUb09sZFR5cGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxFTW9kZWxFbGVtZW50LCBTdHJpbmc+IGVudHJ5IDogZWxlbWVudFRvT2xkVHlwZU1hcAotCQkJCQkuZW50cnlTZXQoKSkgewotCQkJCWZpbmFsIEVNb2RlbEVsZW1lbnQgZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCWZpbmFsIFN0cmluZyB0eXBlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQl0cnkgewotCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihlLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKGUsIHR5cGUpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJfQotCQkJZWxlbWVudFRvT2xkVHlwZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKHZpZXdUb09sZFR5cGVNYXAgIT0gbnVsbCAmJiAhdmlld1RvT2xkVHlwZU1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PFZpZXcsIFN0cmluZz4gZW50cnkgOiB2aWV3VG9PbGRUeXBlTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQlmaW5hbCBWaWV3IHZpZXcgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlmaW5hbCBTdHJpbmcgb2xkVHlwZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24odmlldywgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld05hbWVUeXBlID0gU3RyaW5nLnZhbHVlT2YoZ2V0Vmlld05hbWVUeXBlKEludGVnZXIucGFyc2VJbnQodmlldy5nZXRUeXBlKCkpKSk7Ci0JCQkJCQkJU3RyaW5nIG9sZE5hbWVUeXBlID0gU3RyaW5nLnZhbHVlT2YoZ2V0Vmlld05hbWVUeXBlKEludGVnZXIucGFyc2VJbnQob2xkVHlwZSkpKTsKLQkJCQkJCQl2aWV3LnNldFR5cGUob2xkVHlwZSk7Ci0JCQkJCQkJLy8gcmVzdG9yZSBvbGQgdHlwZSBmb3Igbm9kZSBuYW1lcwotCQkJCQkJCS8vCi0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJVmlldyBjaGlsZCA9IChWaWV3KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGNoaWxkLmdldFR5cGUoKS5lcXVhbHMobmV3TmFtZVR5cGUpKSB7Ci0JCQkJCQkJCQljaGlsZC5zZXRUeXBlKG9sZE5hbWVUeXBlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJCXZpZXdUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuICFlbGVtZW50VG9OZXdUeXBlTWFwLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVwYXJlKFZpZXcgdmlldywgRU1vZGVsRWxlbWVudCBlLCBTdHJpbmcgdHlwZSkgewotCQllbGVtZW50VG9OZXdUeXBlTWFwLnB1dChlLCB0eXBlKTsKLQkJaW50IHZpZXdUeXBlID0gZ2V0Vmlld1R5cGUodHlwZSk7Ci0JCWlmKHZpZXdUeXBlICE9IC0xKSB7Ci0JCQl2aWV3VG9OZXdUeXBlTWFwIC5wdXQodmlldywgU3RyaW5nLnZhbHVlT2Yodmlld1R5cGUpKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihlbGVtZW50VG9OZXdUeXBlTWFwICE9IG51bGwpIHsKLQkJCWVsZW1lbnRUb05ld1R5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZihlbGVtZW50VG9PbGRUeXBlTWFwICE9IG51bGwpIHsKLQkJCWVsZW1lbnRUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZih2aWV3VG9OZXdUeXBlTWFwICE9IG51bGwpIHsKLQkJCXZpZXdUb05ld1R5cGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZih2aWV3VG9PbGRUeXBlTWFwICE9IG51bGwpIHsKLQkJCXZpZXdUb09sZFR5cGVNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaWV3VHlwZShTdHJpbmcgZWxlbWVudFR5cGUpIHsKLQkJaWYoQnJpZGdlSGVscGVyLlVNQV9BQ1RJVklUWS5lcXVhbHMoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQllbHNlIGlmKEJyaWRnZUhlbHBlci5VTUFfUEhBU0UuZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCWVsc2UgaWYoQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04uZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCWVsc2UgaWYoQnJpZGdlSGVscGVyLlVNQV9NSUxFU1RPTkUuZXF1YWxzKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ7CQkJCi0JCX0KLQkJZWxzZSBpZihCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUi5lcXVhbHMoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpZXdOYW1lVHlwZShpbnQgdmlld1R5cGUpIHsKLQkJc3dpdGNoKHZpZXdUeXBlKSB7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwkJCQotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTRiOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUuU2V0dGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuQ3Jvc3NSZWZlcmVuY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLQotLyoqCi0gKiBEZXN0cm95Q29tbWFuZCB0byBkZXN0cm95IEFjdGl2aXR5UGFydGl0aW9uIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluc2lkZSB0aGUgcGFydGl0aW9ucy4KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQgZXh0ZW5kcyBEZXN0cm95RWxlbWVudENvbW1hbmQgewotCi0JCi0JcHJpdmF0ZSBFZGl0UGFydCBob3N0OwotCi0JLyoqCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25EZXN0cm95Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCwgRWRpdFBhcnQgaG9zdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJdGhpcy5ob3N0ID0gaG9zdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRGVzdHJveSgpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGhvc3QuZ2V0TW9kZWwoKTsKLQkJRUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIHZpZXc7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRUb0Rlc3Ryb3koKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25JbmNvbWluZ1JlZmVyZW5jZXMoRU9iamVjdCBkZXN0cnVjdGVlKSB7Ci0JCQotLy8JCW1vdmVDaGlsZHJlbnNUb1BhcmVudChkZXN0cnVjdGVlKTsKLQkJCi0JCUNyb3NzUmVmZXJlbmNlQWRhcHRlciBjcm9zc1JlZmVyZW5jZXIgPSBDcm9zc1JlZmVyZW5jZUFkYXB0ZXIKLQkJCQkuZ2V0RXhpc3RpbmdDcm9zc1JlZmVyZW5jZUFkYXB0ZXIoZGVzdHJ1Y3RlZSk7Ci0JCWlmIChjcm9zc1JlZmVyZW5jZXIgIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBpbnZlcnNlUmVmZXJlbmNlcyA9IGNyb3NzUmVmZXJlbmNlcgotCQkJCQkuZ2V0SW52ZXJzZVJlZmVyZW5jZXMoZGVzdHJ1Y3RlZSk7Ci0JCQlpZiAoaW52ZXJzZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWludCBzaXplID0gaW52ZXJzZVJlZmVyZW5jZXMuc2l6ZSgpOwotCQkJCWlmIChzaXplID4gMCkgewotCQkJCQlTZXR0aW5nIHNldHRpbmc7Ci0JCQkJCUVSZWZlcmVuY2UgZVJlZjsKLQkJCQkJU2V0dGluZ1tdIHNldHRpbmdzID0gKFNldHRpbmdbXSkgaW52ZXJzZVJlZmVyZW5jZXMKLQkJCQkJCQkudG9BcnJheShuZXcgU2V0dGluZ1tzaXplXSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJCQlzZXR0aW5nID0gc2V0dGluZ3NbaV07Ci0JCQkJCQllUmVmID0gKEVSZWZlcmVuY2UpIHNldHRpbmcKLQkJCQkJCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJCQkJaWYgKGVSZWYuaXNDaGFuZ2VhYmxlKCkKLQkJCQkJCQkJJiYgKGVSZWYuaXNEZXJpdmVkKCkgPT0gZmFsc2UpCi0JCQkJCQkJCSYmIChlUmVmLmlzQ29udGFpbm1lbnQoKSA9PSBmYWxzZSkKLQkJCQkJCQkJJiYgKGVSZWYuaXNDb250YWluZXIoKSA9PSBmYWxzZSkpIHsKLS8vCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoc2V0dGluZy5nZXRFT2JqZWN0KCkpOwotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoc2V0dGluZy5nZXRFT2JqZWN0KCksIGVSZWYsCi0JCQkJCQkJCQlkZXN0cnVjdGVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtb3ZlQ2hpbGRyZW5zVG9QYXJlbnQoRU9iamVjdCBkZXN0cnVjdGVlKSB7Ci0JCWlmKGRlc3RydWN0ZWUgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0JCQlBY3Rpdml0eVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoQWN0aXZpdHlQYXJ0aXRpb24pZGVzdHJ1Y3RlZTsKLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gcGFydGl0aW9uLmdldEluQWN0aXZpdHkoKTsKLQkJCUxpc3Qgbm9kZXMgPSBwYXJ0aXRpb24uZ2V0Tm9kZXMoKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlhY3Rpdml0eS5nZXROb2RlcygpLmFkZChub2RlKTsKLQkJCQlub2RlLmdldEluUGFydGl0aW9ucygpLnJlbW92ZShwYXJ0aXRpb24pOwotCQkJCS8vaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcnRpdGlvbi5nZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBlZGdlID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJYWN0aXZpdHkuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7Ci0JCQkJZWRnZS5nZXRJblBhcnRpdGlvbnMoKS5yZW1vdmUocGFydGl0aW9uKTsKLQkJCQkvL2l0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YzBiNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVBY3Rpdml0eU5vZGVJbkFjdGl2aXR5UGFydGl0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLlBhY2thZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24gZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkKLQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIENyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb24oQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX07Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCWlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKXsKLQkJCWNvbnRhaW5lciA9IGNvbnRhaW5lci5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmNhbkV4ZWN1dGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kI2RvRXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlzdGF0dXMgPSBzdXBlci5kb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JCUVPYmplY3QgbmV3RWxlbWVudCA9IGdldE5ld0VsZW1lbnQoKTsKLQkJCi0JCWlmIChuZXdFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSAKLQkJewotCQkJRU9iamVjdCBvYmogPSBnZXRPcmlnaW5hbENvbnRhaW5lcigpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKSB7Ci0JCQkJLy8gc2V0IGlucGFydGl0aW9uIAotCQkJCSgoQWN0aXZpdHlOb2RlKSBuZXdFbGVtZW50KS5nZXRJblBhcnRpdGlvbnMoKS5hZGQoKEFjdGl2aXR5UGFydGl0aW9uKSBvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCQotCi0JLyoqCi0JICogQGN1c3RvbQotCSAqLwotCXByaXZhdGUgRU9iamVjdCBnZXRPcmlnaW5hbENvbnRhaW5lcigpCi0JewotCQlyZXR1cm4gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRDb250YWluZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGFpbm1lbnQgZmVhdHVyZSBmb3IgdGhlIG5ldyBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRVJlZmVyZW5jZSBnZXRDb250YWlubWVudEZlYXR1cmUoKSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBjb250YWlubWVudCBmZWF0dXJlIGluIHdoaWNoIHRoZSBuZXcgZWxlbWVudCB3aWxsIGJlIGNyZWF0ZWQuCi0JCSAqLwotCQlFUmVmZXJlbmNlIGNvbnRhaW5tZW50RmVhdHVyZT1udWxsOwotCQlpZiAoY29udGFpbm1lbnRGZWF0dXJlID09IG51bGwpIHsKLQkJCUVDbGFzcyBjbGFzc1RvRWRpdCA9IGdldEVDbGFzc1RvRWRpdCgpOwotCi0JCQlpZiAoY2xhc3NUb0VkaXQgIT0gbnVsbCkgewotCQkJCUlFbGVtZW50VHlwZSB0eXBlID0gZ2V0RWxlbWVudFR5cGUoKTsKLQotCQkJCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5nZXRFQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQkJCWNvbnRhaW5tZW50RmVhdHVyZSA9IFBhY2thZ2VVdGlsLmZpbmRGZWF0dXJlKGNsYXNzVG9FZGl0LAotCQkJCQkJCXR5cGUuZ2V0RUNsYXNzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb250YWlubWVudEZlYXR1cmU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlFT2JqZWN0IG5ld0VsZW1lbnQgPSBzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYobmV3RWxlbWVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLQkJCQl8fCBuZXdFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlCcmlkZ2VIZWxwZXIuc2V0RGVmYXVsdE5hbWUoKEFjdGl2aXR5Tm9kZSluZXdFbGVtZW50KTsKLQkJCX0KLQkJfQotCQlDcmVhdGVFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gZ2V0Q3JlYXRlUmVxdWVzdCgpOwotCQkKLQkJaWYoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9PSByZXF1ZXN0LmdldEVsZW1lbnRUeXBlKCkpewotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ci0JCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJCX0KLQkJfWVsc2UgaWYoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXF1ZXN0Ci0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAKLQkJCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQkJfQotCQl9ZWxzZSBpZihVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09IHJlcXVlc3QKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKXsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMQotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX1lbHNlIGlmKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXF1ZXN0Ci0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOQotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX1lbHNlIGlmKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9PSByZXF1ZXN0Ci0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSl7Ci0JCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMgotCQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxYjVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2NvbW1hbmRzL0NyZWF0ZUluY29taW5nQ29udHJvbEZsb3dDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlSW5jb21pbmdDb250cm9sRmxvd0NvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXF1ZXN0LAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCXN1cGVyKHJlcXVlc3QpOwotCQlzZXRFbGVtZW50VG9FZGl0KGVsZW1lbnQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqLwotCXB1YmxpYyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0vLwkJaWYoZ2V0U291cmNlKCkgPT0gbnVsbCkKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCQotLy8JCWlmIChnZXRFQ2xhc3NUb0VkaXQoKSA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwotLy8JCWlmIChnZXRDb250YWlubWVudEZlYXR1cmUoKSAhPSBudWxsKSB7Ci0vLwkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLS8vCQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotLy8KLS8vCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0vLwkJCQlyZXN1bHQgPSAoKEVDbGFzcykgZUNsYXNzaWZpZXIpLmlzU3VwZXJUeXBlT2YoZ2V0RWxlbWVudFR5cGUoKQotLy8JCQkJCQkuZ2V0RUNsYXNzKCkpOwotLy8JCQl9Ci0vLwotLy8JCQlyZXN1bHQgPSByZXN1bHQKLS8vCQkJCQkmJiBQYWNrYWdlVXRpbC5jYW5SZWZlcmVuY2UoZ2V0RUNsYXNzVG9FZGl0KCksCi0vLwkJCQkJCQlnZXRDb250YWlubWVudEZlYXR1cmUoKSwgZ2V0RWxlbWVudFR5cGUoKQotLy8JCQkJCQkJCQkuZ2V0RUNsYXNzKCkpOwotLy8KLS8vCQkJcmV0dXJuIHJlc3VsdDsKLS8vCQl9Ci0vLwkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCX0KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9jb21tYW5kcy9DcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjg0NzYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vY29tbWFuZHMvQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuUGFja2FnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZCBleHRlbmRzIENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3QKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBDcmVhdGVPdXRnb2luZ0NvbnRyb2xGbG93Q29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QsCi0JCQlFT2JqZWN0IGVsZW1lbnQpIHsKLQkJc3VwZXIocmVxdWVzdCk7Ci0JCXNldEVsZW1lbnRUb0VkaXQoZWxlbWVudCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICovCi0JcHVibGljIENyZWF0ZU91dGdvaW5nQ29udHJvbEZsb3dDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlOb2RlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmKGdldFNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAoZ2V0RUNsYXNzVG9FZGl0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldENvbnRhaW5tZW50RmVhdHVyZSgpICE9IG51bGwpIHsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJcmVzdWx0ID0gKChFQ2xhc3MpIGVDbGFzc2lmaWVyKS5pc1N1cGVyVHlwZU9mKGdldEVsZW1lbnRUeXBlKCkKLQkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0JCQl9Ci0KLQkJCXJlc3VsdCA9IHJlc3VsdAotCQkJCQkmJiBQYWNrYWdlVXRpbC5jYW5SZWZlcmVuY2UoZ2V0RUNsYXNzVG9FZGl0KCksCi0JCQkJCQkJZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCksIGdldEVsZW1lbnRUeXBlKCkKLQkJCQkJCQkJCS5nZXRFQ2xhc3MoKSk7Ci0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCQkvL3JldHVybiBzdXBlci5jYW5FeGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJLy8gVE9ETzogUmVzb2x2ZSB0aGUgc291cmNlIGFuZCB0YXJnZXQgcHJvcGVybHkuCi0JCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldCgoQWN0aXZpdHlOb2RlKSBnZXRUYXJnZXQoKSk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZSgoQWN0aXZpdHlOb2RlKSBnZXRTb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0JyZWFrZG93bkVsZW1lbnROb2RlRmlndXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjZmM4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci0KLS8qKgotICogQ3VzdG9taXplZCBmaWd1cmUgZm9yIHRoZSBCcmVha2Rvd25FbGVtZW50IGZpZ3VyZXMgdG8gc2hvdyBvdmVybGFwcGVkIHBvcnRpb24uIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50Tm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudE5vZGVGaWd1cmUoKSB7Ci0JCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJY3JlYXRlQ29udGVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsKLQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X0l0ZXJhdGlvbik7Ci0KLQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0KLQkJc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoZmlnXzApOwotCi0JCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCXJldHVybiBmTm9kZU5hbWVGaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpIHsKLQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQlpZihpc09wYXF1ZSgpKQotCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQlyZXR1cm47Ci0JfQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9EZWNpc2lvbk5vZGVGaWd1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9EZWNpc2lvbk5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc2NjU4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRGVjaXNpb25Ob2RlRmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLklQb2x5Z29uQW5jaG9yYWJsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBBZG9wdGVkIGZyb20gR01GJ3MgR2VvU2hhcGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVGaWd1cmUgZXh0ZW5kcyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgaW1wbGVtZW50cwotCQlJUG9seWdvbkFuY2hvcmFibGVGaWd1cmUgewotCi0JcHJpdmF0ZSBpbnQgc3BhY2luZzsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGNyZWF0ZSBhIGRlY2lzaW9uIGZpZ3VyZQotCSAqIAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVGaWd1cmUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3BhY2luZykgewotCQlzdXBlcih3aWR0aCwgaGVpZ2h0KTsKLQkJdGhpcy5zcGFjaW5nID0gc3BhY2luZzsKLQkJY3JlYXRlRmlndXJlKHdpZHRoLCBoZWlnaHQpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZGVmU2l6ZQotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVGaWd1cmUoRGltZW5zaW9uIGRlZlNpemUpIHsKLQkJc3VwZXIoZGVmU2l6ZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlRmlndXJlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlzdXBlcih3aWR0aCwgaGVpZ2h0KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuSVBvbHlnb25BbmNob3JhYmxlRmlndXJlI2dldFBvbHlnb25Qb2ludHMoKQotCSAqLwotCXB1YmxpYyBQb2ludExpc3QgZ2V0UG9seWdvblBvaW50cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZ2V0UG9pbnRzKCk7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGcpIHsKLQkJUG9pbnRMaXN0IHBvaW50cyA9IGdldFBvaW50TGlzdChnZXRCb3VuZHMoKS5nZXRDb3B5KCkpOwotCQlnLmZpbGxQb2x5Z29uKHBvaW50cyk7Ci0JCWcuZHJhd1BvbHlnb24ocG9pbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBzaGFwZXMgcG9seWdvbiBwb2ludHMuCi0JICogVGhpcyBpcyBjdXJyZW50bHkgYmFzZWQgb24gdGhlIHNoYXBlcyBib3VuZGluZyBib3guCi0JICogCi0JICogQHBhcmFtIHJlY3QgdGhlIHJlY3RhbmdsZSB0aGF0IHRoZSBzaGFwZSB3aWxsIGZpdCBpbgotCSAqLwotCXByb3RlY3RlZCBQb2ludExpc3QgZ2V0UG9pbnRMaXN0KFJlY3RhbmdsZSByZWN0KSB7Ci0JCVBvaW50TGlzdCBwb2ludHMgPSBuZXcgUG9pbnRMaXN0KCk7Ci0JCQotCQlpbnQgaGFsZlggPSByZWN0LnggKyAocmVjdC53aWR0aCAvIDIpOwotCQlpbnQgaGFsZlkgPSByZWN0LnkgKyAocmVjdC5oZWlnaHQgLyAyKTsKLQkJCi0JCVBvaW50IHAxID0gbmV3IFBvaW50KCBoYWxmWCwgcmVjdC55ICk7Ci0JCVBvaW50IHAyID0gbmV3IFBvaW50KCByZWN0LnggKyByZWN0LndpZHRoIC0gMSwgaGFsZlkgKTsKLQkJUG9pbnQgcDMgPSBuZXcgUG9pbnQoIGhhbGZYLCByZWN0LnkgKyByZWN0LmhlaWdodCAtIDEgKTsKLQkJUG9pbnQgcDQgPSBuZXcgUG9pbnQoIHJlY3QueCwgaGFsZlkgKTsKLQkJCi0JCXBvaW50cy5hZGRQb2ludCggcDEgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwMiApOwotCQlwb2ludHMuYWRkUG9pbnQoIHAzICk7Ci0JCXBvaW50cy5hZGRQb2ludCggcDQgKTsKLQkJcG9pbnRzLmFkZFBvaW50KCBwMSApOwkKLQkJCi0JCXJldHVybiBwb2ludHM7Ci0JfQotCQotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlyZXR1cm4gKElGaWd1cmUpIGdldENoaWxkcmVuKCkuZ2V0KDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWd1cmUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKLQkJc2V0T3BhcXVlKHRydWUpOwotCQlzZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpIHsKLQkJCXB1YmxpYyB2b2lkIGxheW91dChJRmlndXJlIGZpZ3VyZSkgewotCQkJCVJlY3RhbmdsZSByID0gZmlndXJlLmdldENsaWVudEFyZWEoKTsKLQkJCQlMaXN0IGNoaWxkcmVuID0gZmlndXJlLmdldENoaWxkcmVuKCk7Ci0JCQkJSUZpZ3VyZSBjaGlsZDsKLQkJCQlEaW1lbnNpb24gZDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJCWNoaWxkID0gKElGaWd1cmUpY2hpbGRyZW4uZ2V0KGkpOwotCQkJCQlkID0gY2hpbGQuZ2V0UHJlZmVycmVkU2l6ZShyLndpZHRoLCByLmhlaWdodCk7Ci0JCQkJCWQud2lkdGggPSBNYXRoLm1pbihkLndpZHRoLCByLndpZHRoKTsKLQkJCQkJZC5oZWlnaHQgPSBNYXRoLm1pbihkLmhlaWdodCwgci5oZWlnaHQpOwotCQkJCQlSZWN0YW5nbGUgY2hpbGRSZWN0ID0gbmV3IFJlY3RhbmdsZSgKLQkJCQkJCXIueCArIChyLndpZHRoIC0gZC53aWR0aCkvMiwKLQkJCQkJCXIueSArIChyLmhlaWdodCAtIGQuaGVpZ2h0KS8yLAotCQkJCQkJZC53aWR0aCwKLQkJCQkJCWQuaGVpZ2h0KTsKLQkJCQkJY2hpbGQuc2V0Qm91bmRzKGNoaWxkUmVjdCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0JCUlGaWd1cmUgZiA9IG5ldyBGaWd1cmUoKTsKLQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJbGF5b3V0LnNldFNwYWNpbmcoc3BhY2luZyk7Ci0JCWYuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQlhZGQoZik7Ci0JfQotCQotCXB1YmxpYyBQb2ludExpc3QgZ2V0UG9pbnRzKCl7Ci0JCXJldHVybiBnZXRQb2ludExpc3QoZ2V0Qm91bmRzKCkuZ2V0Q29weSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL0VuZE5vZGVGaWd1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFjMDdhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL2ZpZ3VyZXMvRW5kTm9kZUZpZ3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5FbGxpcHNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmROb2RlRmlndXJlIGV4dGVuZHMgRWxsaXBzZSB7Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgZWxsaXBzZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5TaGFwZSNmaWxsU2hhcGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxTaGFwZShHcmFwaGljcyBncmFwaGljcykgewotCQlSZWN0YW5nbGUgciA9IGdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJci5zaHJpbmsoci53aWR0aCAvIDgsIHIuaGVpZ2h0IC8gOCk7Ci0JCWdyYXBoaWNzLmZpbGxPdmFsKHIpOwotCX0KLQotCS8qKgotCSAqIE91dGxpbmVzIHRoZSBlbGxpcHNlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlNoYXBlI291dGxpbmVTaGFwZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3V0bGluZVNoYXBlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCXN1cGVyLm91dGxpbmVTaGFwZShncmFwaGljcyk7Ci0KLQkJUmVjdGFuZ2xlIHIgPSBSZWN0YW5nbGUuU0lOR0xFVE9OOwotCQlyLnNldEJvdW5kcyhnZXRCb3VuZHMoKSk7Ci0JCXIuc2hyaW5rKGdldEJvdW5kcygpLndpZHRoIC8gOCwgZ2V0Qm91bmRzKCkuaGVpZ2h0IC8gOCk7Ci0JCXIud2lkdGgtLTsKLQkJci5oZWlnaHQtLTsKLQkJci5zaHJpbmsoKGxpbmVXaWR0aCAtIDEpIC8gMiwgKGxpbmVXaWR0aCAtIDEpIC8gMik7Ci0JCWdyYXBoaWNzLmRyYXdPdmFsKHIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vZmlndXJlcy9SZWxhdGl2ZVhZQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDI4NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9maWd1cmVzL1JlbGF0aXZlWFlBbmNob3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJlbGF0aXZlIGFuY2hvciBmb3IgYSBmaWd1cmUncyBsb2NhdGlvbi4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWxhdGl2ZVhZQW5jaG9yIGV4dGVuZHMgQWJzdHJhY3RDb25uZWN0aW9uQW5jaG9yIHsKLQotCXByaXZhdGUgUG9pbnQgcmVsYXRpdmVMb2NhdGlvbjsKLQotCXB1YmxpYyBSZWxhdGl2ZVhZQW5jaG9yKElGaWd1cmUgZmlndXJlLCBQb2ludCBsb2NhdGlvbiwgYm9vbGVhbiBpc1JlbGF0aXZlKSB7Ci0JCXN1cGVyKGZpZ3VyZSk7Ci0JCXJlbGF0aXZlTG9jYXRpb24gPSBsb2NhdGlvbi5nZXRDb3B5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkFuY2hvciNnZXRMb2NhdGlvbihQb2ludCkKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oUG9pbnQgcmVmZXJlbmNlKSB7Ci0JCVBvaW50IHAgPSByZWxhdGl2ZUxvY2F0aW9uLmdldENvcHkoKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRPd25lcigpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJcC5wZXJmb3JtVHJhbnNsYXRlKHIueCwgci55KTsKLQkJZ2V0T3duZXIoKS50cmFuc2xhdGVUb0Fic29sdXRlKHApOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnN0cmFjdENvbm5lY3Rpb25BbmNob3IjZ2V0UmVmZXJlbmNlUG9pbnQoKQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uKG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWFlNjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeSBleHRlbmRzIENyZWF0aW9uRWRpdFBvbGljeSB7Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVwYXJlbnRDb21tYW5kKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQlJdGVyYXRvciBlZGl0UGFydHMgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7Ci0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpZ2V0SG9zdCgpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCUVPYmplY3QgY29udGV4dCA9IGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoY29udGFpbmVyKTsKLSAgICAgICAgQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1VSU1lc3NhZ2VzLkFkZENvbW1hbmRfTGFiZWwpOwotCQl3aGlsZSAoIGVkaXRQYXJ0cy5oYXNOZXh0KCkgKSB7Ci0JCQlFZGl0UGFydCBlcCA9IChFZGl0UGFydCllZGl0UGFydHMubmV4dCgpOwotCQkJaWYgKCBlcCBpbnN0YW5jZW9mIExhYmVsRWRpdFBhcnQgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCVZpZXcgdmlldyA9IChWaWV3KWVwLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCQlpZiAoIHZpZXcgPT0gbnVsbCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUVPYmplY3Qgc2VtYW50aWMgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJaWYgKCBzZW1hbnRpYyA9PSBudWxsICkgewotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBnZXAgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwOwotCQkJCWlmKHNob3VsZFJlcGFyZW50KGdlcCwgcmVxdWVzdCkpIHsKLQkJCQkJY2MuY29tcG9zZShnZXRSZXBhcmVudFZpZXdDb21tYW5kKGdlcCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCBjb250ZXh0ICE9IG51bGwgJiYgc2hvdWxkUmVwYXJlbnQoc2VtYW50aWMsIGNvbnRleHQpKSB7Ci0JCQkJY2MuY29tcG9zZShnZXRSZXBhcmVudENvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFJlcGFyZW50KElHcmFwaGljYWxFZGl0UGFydCBlcCwgQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCS8vIHJlcGxhY2UgcGFyZW50IG9ubHkgaWYgdGhlIHZpZXcgZG9lcyBub3QgaGF2ZSBhbnkgcGFyZW50IHlldCBvciB0aGUKLQkJLy8gYm91bmRzIGFyZSBub3QgaW5zaWRlIHRoZSBjdXJyZW50IHBhcmVudCBmaWd1cmUKLQkJLy8KLQkJVmlldyB2aWV3ID0gKFZpZXcpIGVwLmdldE1vZGVsKCk7Ci0JCWlmKHZpZXcuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKS5nZXRUcmFuc2xhdGVkKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJSUZpZ3VyZSBwYXJlbnRGaWcgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KWVwLmdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBwYXJlbnRGaWcuZ2V0Qm91bmRzKCk7CQotCQkJcmV0dXJuICFwYXJlbnRCb3VuZHMuY29udGFpbnMobG9jYXRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZDE1NDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5TZXRCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZVZpZXdSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQ3JlYXRpb25FZGl0UG9saWN5IGZvciBBY3Rpdml0eVBhcnRpdGlvbi4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBDcmVhdGlvbkVkaXRQb2xpY3kgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5I2dldENyZWF0ZUNvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVWaWV3UmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVZpZXdSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7Ci0KLQkJSXRlcmF0b3IgZGVzY3JpcHRvcnMgPSByZXF1ZXN0LmdldFZpZXdEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGRlc2NyaXB0b3JzLmhhc05leHQoKSkgewotCQkJQ3JlYXRlVmlld1JlcXVlc3QuVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChDcmVhdGVWaWV3UmVxdWVzdC5WaWV3RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMKLQkJCQkJLm5leHQoKTsKLQkJCVZpZXcgY29udGFpbmVyVmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLS8vCQkJd2hpbGUoY29udGFpbmVyVmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbil7Ci0vLwkJCQljb250YWluZXJWaWV3ID0gKFZpZXcpY29udGFpbmVyVmlldy5lQ29udGFpbmVyKCk7Ci0vLwkJCX0KLQkJCUNyZWF0ZUNvbW1hbmQgY3JlYXRlQ29tbWFuZCA9IG5ldyBDcmVhdGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCWRlc2NyaXB0b3IsIGNvbnRhaW5lclZpZXcpOwotCi0JCQljYy5jb21wb3NlKGNyZWF0ZUNvbW1hbmQpOwotCQl9Ci0JcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0JCi0JLyoqIFJldHVybiBhIGNvbW1hbmQgdG8gcmVwYXJlbnQgYm90aCB0aGUgc2VtYW50aWMgYW5kIHZpZXcgZWxlbWVudHMuICovCi0JLyoqCi0JICogcmV0dXJuIGEgY29tbWFuZCB0byByZXBhcmVudCBib3RoIHRoZSBzZW1hbnRpYyBhbmQgdmlldyBlbGVtZW50cy4gCi0JICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QKLQkgKiBAcmV0dXJuIGNvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZXBhcmVudENvbW1hbmQoQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUl0ZXJhdG9yIGVkaXRQYXJ0cyA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsKLQkJVmlldyBjb250YWluZXIgPSAoVmlldylnZXRIb3N0KCkuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJRU9iamVjdCBjb250ZXh0ID0gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudChjb250YWluZXIpOwotICAgICAgICBDb21wb3NpdGVDb21tYW5kIGNjID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQoRGlhZ3JhbVVJTWVzc2FnZXMuQWRkQ29tbWFuZF9MYWJlbCk7Ci0JCXdoaWxlICggZWRpdFBhcnRzLmhhc05leHQoKSApIHsKLQkJCUVkaXRQYXJ0IGVwID0gKEVkaXRQYXJ0KWVkaXRQYXJ0cy5uZXh0KCk7Ci0JCQlpZiAoIGVwIGluc3RhbmNlb2YgTGFiZWxFZGl0UGFydCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJVmlldyB2aWV3ID0gKFZpZXcpZXAuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJCWlmICggdmlldyA9PSBudWxsICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlFT2JqZWN0IHNlbWFudGljID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCWlmICggc2VtYW50aWMgPT0gbnVsbCApIHsKLQkJCQljYy5jb21wb3NlKGdldFJlcGFyZW50Vmlld0NvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCkpOwotCQkJCWNjLmNvbXBvc2UoYWRqdXN0TG9jYXRpb25Db21tYW5kKChJR3JhcGhpY2FsRWRpdFBhcnQpZXAsIHJlcXVlc3QpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBjb250ZXh0ICE9IG51bGwgJiYgc2hvdWxkUmVwYXJlbnQoc2VtYW50aWMsIGNvbnRleHQpKSB7Ci0JCQkJY2MuY29tcG9zZShnZXRSZXBhcmVudENvbW1hbmQoKElHcmFwaGljYWxFZGl0UGFydCllcCkpOwotCQkJCWNjLmNvbXBvc2UoYWRqdXN0TG9jYXRpb25Db21tYW5kKChJR3JhcGhpY2FsRWRpdFBhcnQpZXAsIHJlcXVlc3QpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2MuaXNFbXB0eSgpID8gbnVsbCA6IG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldFJlcGFyZW50Q29tbWFuZChJR3JhcGhpY2FsRWRpdFBhcnQgZ2VwKSB7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtVUlNZXNzYWdlcy5BZGRDb21tYW5kX0xhYmVsKTsgCi0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgY29udGV4dCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoY29udGFpbmVyKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpZ2VwLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgZWxlbWVudCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0KLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0gICAgICAgICAgICAuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAKLSAgICAgICAgLy8KLQkJLy8gc2VtYW50aWMKLQkJaWYgKCBlbGVtZW50ICE9IG51bGwgKSB7Ci0JCQlDb21tYW5kIG1vdmVTZW1hbnRpY0NtZCA9Ci0JCQkJZ2V0SG9zdCgpLmdldENvbW1hbmQoCi0JCQkJCW5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKAotCQkJCQkJbmV3IE1vdmVSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGNvbnRleHQsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uX05vZGUoKSwgZWxlbWVudCkpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAobW92ZVNlbWFudGljQ21kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0gICAgICAgICAgICAgIH0KLQkJCQotCQkJY2MuY29tcG9zZSAoIG5ldyBDb21tYW5kUHJveHkobW92ZVNlbWFudGljQ21kKSApOwotCQl9Ci0JCS8vCi0JCS8vIG5vdGF0aW9uCi0JCWNjLmNvbXBvc2UoZ2V0UmVwYXJlbnRWaWV3Q29tbWFuZChnZXApKTsKLQkJLy8gaW4gY2FzZSBvZiBtb3ZpbmcgaW50byBwYXJ0aXRpb24gd2UgaGF2ZSB0byBjaGFuZ2UgdGhlIGNvb3JkaW5hdGVzIG9mIGVsZW1lbnQKLQkJcmV0dXJuIGNjOwotCX0KLQotCXByaXZhdGUgSUNvbW1hbmQgYWRqdXN0TG9jYXRpb25Db21tYW5kKElHcmFwaGljYWxFZGl0UGFydCBjaGlsZCwKLQkJCUNoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTaGFwZUVkaXRQYXJ0KSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IHJlcXVlc3QuZ2V0TW92ZURlbHRhKCk7Ci0JCQlQb2ludCBjaGlsZExvY2F0aW9uID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKTsKLQkJCWludCB4ID0gY2hpbGRMb2NhdGlvbi54ICsgbG9jYXRpb24ueAotCQkJCQktICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydClnZXRIb3N0KCkpLmdldExvY2F0aW9uKCkueDsKLQkJCWludCB5ID0gY2hpbGRMb2NhdGlvbi55ICsgbG9jYXRpb24ueQotCQkJCQktICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydClnZXRIb3N0KCkpLmdldExvY2F0aW9uKCkueTsKLQotCQkJSUNvbW1hbmQgYm91bmRzQ29tbWFuZCA9IG5ldyBTZXRCb3VuZHNDb21tYW5kKAotCQkJCQkoKFNoYXBlRWRpdFBhcnQpIGNoaWxkKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCURpYWdyYW1VSU1lc3NhZ2VzLlNldExvY2F0aW9uQ29tbWFuZF9MYWJlbF9SZXNpemUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpKSwKLQkJCQkJbmV3IFBvaW50KHgsIHkpKTsKLQotCQkJcmV0dXJuIGJvdW5kc0NvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXN0YXRpYyBJQ29tbWFuZCBjcmVhdGVBZGp1c3RMb2NhdGlvbkNvbW1hbmQoSUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkLAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCByZXF1ZXN0LCBJR3JhcGhpY2FsRWRpdFBhcnQgbmV3UGFyZW50KSB7Ci0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIFNoYXBlRWRpdFBhcnQpIHsKLQkJCVBvaW50IGxvY2F0aW9uID0gcmVxdWVzdC5nZXRNb3ZlRGVsdGEoKTsKLQkJCVBvaW50IG5ld0xvY2F0aW9uID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKS5nZXRDb3B5KCkudHJhbnNsYXRlKGxvY2F0aW9uKTsKLS8vCQkJRGltZW5zaW9uIGRpZmYgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZC5nZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLS8vCQkJCQkuZ2V0TG9jYXRpb24oKS5nZXREaWZmZXJlbmNlKAotLy8JCQkJCQkJbmV3UGFyZW50LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldExvY2F0aW9uKCkpOwotLy8JCQluZXdMb2NhdGlvbi50cmFuc2xhdGUoZGlmZik7Ci0vLwkJCW5ld1BhcmVudC5nZXRGaWd1cmUoKS50cmFuc2xhdGVGcm9tUGFyZW50KG5ld0xvY2F0aW9uKTsKLQkJCUlDb21tYW5kIGJvdW5kc0NvbW1hbmQgPSBuZXcgU2V0Qm91bmRzQ29tbWFuZCgKLQkJCQkJKChTaGFwZUVkaXRQYXJ0KSBjaGlsZCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcigoVmlldykgY2hpbGQuZ2V0TW9kZWwoKSksCi0JCQkJCW5ld0xvY2F0aW9uKTsKLQotCQkJcmV0dXJuIGJvdW5kc0NvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7CQkJCQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZjE4M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQWJzdHJhY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DaGFuZ2VCb3VuZHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5Db250YWluZXJFZGl0UG9saWN5OwotCi0vKioKLSAqIEFjdGl2aXR5UGFydGl0aW9uIGRlbGVnYXRlcyB0byBpdHMgY29tcGFydG1lbnQgZWRpdCBwb2xpY3kKLSAqICAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5IGV4dGVuZHMKLSAgICAgICAgQWJzdHJhY3RFZGl0UG9saWN5IHsKLQotICAgIHByaXZhdGUgRWRpdFBhcnQgY2hpbGRFZGl0UGFydDsKLSAgICBwcml2YXRlIEVkaXRQb2xpY3kgY2hpbGRFZGl0UG9saWN5OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNoaWxkVmlld0lEOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVkaXRQb2xpY3lJRDsKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25EZWxlZ2F0aW9uRWRpdFBvbGljeShTdHJpbmcgY2hpbGRJZCwgU3RyaW5nIGVkaXRQb2xpY3lJZCkgewotICAgICAgICBjaGlsZFZpZXdJRCA9IGNoaWxkSWQ7Ci0gICAgICAgIGVkaXRQb2xpY3lJRCA9IGVkaXRQb2xpY3lJZDsKLSAgICB9Ci0gICAgCi0KLSAgIC8qKgotICAgICogKG5vbi1KYXZhZG9jKQotICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNhY3RpdmF0ZSgpCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLSAgICAgICAgY2hpbGRFZGl0UGFydCA9Ci0gICAgICAgICAgICAoKElHcmFwaGljYWxFZGl0UGFydClnZXRIb3N0KCkpLmdldENoaWxkQnlTZW1hbnRpY0hpbnQoY2hpbGRWaWV3SUQpOwotICAgICAgICBpZiAoY2hpbGRFZGl0UGFydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5ID0gY2hpbGRFZGl0UGFydC5nZXRFZGl0UG9saWN5KGVkaXRQb2xpY3lJRCk7Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeS5zZXRIb3N0KGNoaWxkRWRpdFBhcnQpOwotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLSAgICB9Ci0KLSAgLyoqCi0gICAqIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNkZWFjdGl2YXRlKCkKLSAgICovCi0gICAgcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLSAgICAgICAgY2hpbGRFZGl0UGFydCA9IG51bGw7Ci0gICAgICAgIGNoaWxkRWRpdFBvbGljeSA9IG51bGw7Ci0gICAgfQotCi0KLSAgIC8qKgotICAgICogCi0gICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjZXJhc2VUYXJnZXRGZWVkYmFjayhvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcmFzZVRhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjaGlsZEVkaXRQb2xpY3kuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjZ2V0Q29tbWFuZChvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UG9saWN5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmKGNoaWxkRWRpdFBvbGljeSBpbnN0YW5jZW9mIENvbnRhaW5lckVkaXRQb2xpY3kgJiYgCi0gICAgICAgIAkJcmVxdWVzdCBpbnN0YW5jZW9mIENoYW5nZUJvdW5kc1JlcXVlc3QpewotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkFic3RyYWN0RWRpdFBvbGljeSNnZXRUYXJnZXRFZGl0UGFydChvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLSAgICAgKiBAbW9kaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoaWxkRWRpdFBvbGljeS5nZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjc2hvd1NvdXJjZUZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjc2hvd1RhcmdldEZlZWRiYWNrKG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3dUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgaWYgKGNoaWxkRWRpdFBvbGljeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGRFZGl0UG9saWN5LnNob3dUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5BYnN0cmFjdEVkaXRQb2xpY3kjdW5kZXJzdGFuZHNSZXF1ZXN0KG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0KQotICAgICAqIEBtb2RpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotICAgICAgICBpZiAoY2hpbGRFZGl0UGFydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBhY3RpdmF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGlsZEVkaXRQb2xpY3kgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjaGlsZEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI1OTBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLQotLyoqCi0gKiBYWUxheW91dFBvbGljeSBmb3IgQWN0aXZpdHlQYXJ0aXRpb24gdG8gaGFuZGxlIHRoZSBtb3ZlIG9mIGNoaWxkcmVuLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAd3JpdHRlbgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5IGV4dGVuZHMgWFlMYXlvdXRFZGl0UG9saWN5IHsKLQotCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL0FjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMzg1NDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2N1c3RvbS9wb2xpY2llcy9BY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNoYW5nZUJvdW5kc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLlNldEJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5FZGl0RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQm91bmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxheW91dENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVhZTGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0UGFydCBjaGlsZCwgT2JqZWN0IGNvbnN0cmFpbnQpIHsKLQkJT2JqZWN0IHBhcmVudCAgPSBjaGlsZC5nZXRQYXJlbnQoKTsJCQotCQlpZiAoKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpICYmCi0JCQkoIGNoaWxkIGluc3RhbmNlb2YgU2hhcGVFZGl0UGFydCAmJiBjb25zdHJhaW50IGluc3RhbmNlb2YgUmVjdGFuZ2xlKSkgewotCQkJUmVjdGFuZ2xlIHJlY3QgPSAoUmVjdGFuZ2xlKSBjb25zdHJhaW50OwotCQkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSAoKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpcGFyZW50KS5nZXRGaWd1cmUoKTsJCQkKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpOwotCQkJYm9vbGVhbiBhZGp1c3RMb2NhdGlvbk5lZWRlZCA9IFZpZXdVdGlsCi0JCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpICE9IG51bGwKLQkJCQkJfHwgcGFyZW50RmlndXJlLmdldEJvdW5kcygpLmNvbnRhaW5zKHJlY3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQlpZihhZGp1c3RMb2NhdGlvbk5lZWRlZCkgewotCQkJCWludCB4ID0gcmVjdC54IC0gKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBwYXJlbnQpLmdldExvY2F0aW9uKCkueDsKLQkJCQlpbnQgeSA9IHJlY3QueSAtICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCkgcGFyZW50KS5nZXRMb2NhdGlvbigpLnk7Ci0KLQkJCQlJQ29tbWFuZCBib3VuZHNDb21tYW5kID0gCi0JCQkJCW5ldyBTZXRCb3VuZHNDb21tYW5kKCgoU2hhcGVFZGl0UGFydCkgY2hpbGQpLmdldEVkaXRpbmdEb21haW4oKSwKLQkJCQkJCQlEaWFncmFtVUlNZXNzYWdlcy5TZXRMb2NhdGlvbkNvbW1hbmRfTGFiZWxfUmVzaXplLCAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcih2aWV3KSwKLQkJCQkJCQkJCW5ldyBQb2ludCh4LCB5KSk7IAotCi0JCQkJCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShib3VuZHNDb21tYW5kKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoY2hpbGQsIGNvbnN0cmFpbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoRWRpdFBhcnQgY2hpbGQsCi0JCQlPYmplY3QgY29uc3RyYWludCkgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoY2hpbGQsIGNvbnN0cmFpbnQpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQ2hhbmdlQ29uc3RyYWludENvbW1hbmQoCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsIEVkaXRQYXJ0IGNoaWxkLCBPYmplY3QgY29uc3RyYWludCkgewotCQlDb21tYW5kIGNtZCA9IHN1cGVyLmNyZWF0ZUNoYW5nZUNvbnN0cmFpbnRDb21tYW5kKHJlcXVlc3QsIGNoaWxkLAotCQkJCWNvbnN0cmFpbnQpOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSB7Ci0JCQlMaXN0IGxpc3QgPSBnZXROb2Rlc0luUGFydGl0aW9uKChBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KSBjaGlsZCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmICFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcSA9IG5ldyBDaGFuZ2VCb3VuZHNSZXF1ZXN0KAotCQkJCQkJCQlSRVFfUkVTSVpFX0NISUxEUkVOKTsKLQkJCQkJCXJlcS5zZXRFZGl0UGFydHMoZWxlbWVudCk7Ci0JCQkJCQlyZXEuc2V0TW92ZURlbHRhKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQkJCQkJcmVxLnNldFNpemVEZWx0YShyZXF1ZXN0LmdldFNpemVEZWx0YSgpKTsKLQkJCQkJCXJlcS5zZXRMb2NhdGlvbihyZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJcmVxLnNldEV4dGVuZGVkRGF0YShyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpKTsKLQkJCQkJCXJlcS5zZXRSZXNpemVEaXJlY3Rpb24ocmVxdWVzdC5nZXRSZXNpemVEaXJlY3Rpb24oKSk7Ci0JCQkJCQljbWQgPSBjbWQuY2hhaW4oZWxlbWVudC5nZXRQYXJlbnQoKS5nZXRDb21tYW5kKHJlcSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9ZWxzZXsKLQkJCUVkaXRQYXJ0IHBhcmVudCA9IGNoaWxkLmdldFBhcmVudCgpOwotCQkJaWYocGFyZW50IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCQlMaXN0IGNoaWxkcmVuID0gKChEaWFncmFtRWRpdFBhcnQpcGFyZW50KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFZGl0UGFydCBwYXJ0ID0gKEVkaXRQYXJ0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYocGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpewotCQkJCQkJTm9kZSB2aWV3ID0gKE5vZGUpcGFydC5nZXRNb2RlbCgpOwotCQkJCQkJTGF5b3V0Q29uc3RyYWludCBsQ29uc3RhaW50ID0gdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJCQlpZihsQ29uc3RhaW50IGluc3RhbmNlb2YgQm91bmRzKXsKLQkJCQkJCQlSZWN0YW5nbGUgcGFydGl0aW9uQ29uc3RyYWludCA9ICgoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydClwYXJ0KS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJCQlpZihjb25zdHJhaW50IGluc3RhbmNlb2YgUmVjdGFuZ2xlKXsKLQkJCQkJCQkJaWYocGFydGl0aW9uQ29uc3RyYWludC5jb250YWlucygoUmVjdGFuZ2xlKWNvbnN0cmFpbnQpKXsKLQkJCQkJCQkJCXJlcXVlc3Quc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DUkVBVEUpOwotCQkJCQkJCQkJY21kID0gY21kLmNoYWluKHBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlpZiAoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxheW91dENvbnN0cmFpbnQ6ICIrIGxDb25zdGFpbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldE5vZGVzSW5QYXJ0aXRpb24oQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCBjaGlsZCkgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBY3Rpdml0eVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoQWN0aXZpdHlQYXJ0aXRpb24pKChOb2RlKWNoaWxkLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJTGlzdCBsaXN0ID0gcGFydGl0aW9uLmdldE5vZGVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJbm9kZXMuYWRkKGZpbmRFZGl0UGFydHlCeUVsZW1lbnQoY2hpbGQuZ2V0UGFyZW50KCksIGVsZW1lbnQpKTsKLQkJfQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEVkaXRQYXJ0IGZpbmRFZGl0UGFydHlCeUVsZW1lbnQoRWRpdFBhcnQgcGFyZW50LAotCQkJT2JqZWN0IGVsZW1lbnQpIHsKLQkJTGlzdCBsaXN0ID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoKChOb2RlKSBlZGl0UGFydC5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkgPT0gZWxlbWVudCkgewotCQkJCXJldHVybiBlZGl0UGFydDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRBZGRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlDb21wb3VuZENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJY29tbWFuZC5zZXREZWJ1Z0xhYmVsKCJBZGQgaW4gQ29uc3RyYWluZWRMYXlvdXRFZGl0UG9saWN5IHdpdGggUmVwYXJlbnQgaWYgbmVjZXNzYXJ5Iik7Ly8kTk9OLU5MUy0xJAotCQljb21tYW5kLmFkZChzdXBlci5nZXRBZGRDb21tYW5kKHJlcXVlc3QpKTsKLQkJCi0JCUlHcmFwaGljYWxFZGl0UGFydCBjaGlsZFBhcnQ7Ci0JCWlmKHJlcXVlc3QgaW5zdGFuY2VvZiBDaGFuZ2VCb3VuZHNSZXF1ZXN0ICYmIHJlcXVlc3QuZ2V0VHlwZSgpID09IFJFUV9BREQpewotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjaGFuZ2VSZXF1ZXN0ID0oQ2hhbmdlQm91bmRzUmVxdWVzdClyZXF1ZXN0OyAKLQkJCUxpc3QgZWRpdFBhcnRzID0gY2hhbmdlUmVxdWVzdC5nZXRFZGl0UGFydHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdFBhcnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJY2hpbGRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCllZGl0UGFydHMuZ2V0KGkpOwotCQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJlbnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWNoaWxkUGFydC5nZXRQYXJlbnQoKTsKLQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KXsKLQkJCQkJUG9pbnQgcG9pbnQgPSBjaGlsZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKS5nZXRDb3B5KCk7Ci0JCQkJCXBvaW50LnRyYW5zbGF0ZShjaGFuZ2VSZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJCQkJaWYoIXBhcmVudC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5jb250YWlucyhwb2ludCkpewotCQkJCQkJY29tbWFuZC5hZGQoZ2V0UmVwYXJlbnRDb21tYW5kKGNoaWxkUGFydCwgcGFyZW50LCBjaGFuZ2VSZXF1ZXN0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQudW53cmFwKCk7Ci0vLwkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlcGFyZW50Q29tbWFuZChJR3JhcGhpY2FsRWRpdFBhcnQgZ2VwLCBJR3JhcGhpY2FsRWRpdFBhcnQgb2xkUGFyZW50LAotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjaGFuZ2VSZXF1ZXN0KSB7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSBuZXcgQ29tcG9zaXRlQ29tbWFuZChEaWFncmFtVUlNZXNzYWdlcy5BZGRDb21tYW5kX0xhYmVsKTsgCi0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgY29udGV4dCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoY29udGFpbmVyKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpZ2VwLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgZWxlbWVudCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0KLSAgICAgICAgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0gICAgICAgICAgICAuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAKLQkJaWYgKCBlbGVtZW50ICE9IG51bGwgKSB7Ci0JCQljYy5jb21wb3NlKG5ldyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChuZXcgTW92ZVJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgY29udGV4dCwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfTm9kZSgpLCBlbGVtZW50KSwKLQkJCQkJZWxlbWVudCx2aWV3LCBvbGRQYXJlbnQpKTsKLQkJCWNjLmNvbXBvc2UobmV3IEFkZENvbW1hbmQoZ2VwLmdldEVkaXRpbmdEb21haW4oKSwgbmV3IEVPYmplY3RBZGFwdGVyKGNvbnRhaW5lciksCi0JCQkJCSAgbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpKSk7Ci0JCQljYy5jb21wb3NlKGFkanVzdExvY2F0aW9uQ29tbWFuZChnZXAsIGNoYW5nZVJlcXVlc3QpKTsKLQkJfQotCQlyZXR1cm4gY2MuaXNFbXB0eSgpID8gbnVsbCA6IG5ldyBJQ29tbWFuZFByb3h5KGNjLnJlZHVjZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIGNsYXNzIFJlcGFyZW50aW5nRWxlbWVudHNDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kewotCi0JCXByaXZhdGUgZmluYWwgRU9iamVjdCBtb3ZlRWxlbWVudDsKLQkJcHJpdmF0ZSBJR3JhcGhpY2FsRWRpdFBhcnQgb2xkUGFyZW50OwotCQlwcml2YXRlIFZpZXcgdmlldzsKLQkJCi0JCXB1YmxpYyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChNb3ZlUmVxdWVzdCByZXEsIEVPYmplY3QgZWxlbWVudCwgVmlldyB2aWV3LCAKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQgb2xkUGFyZW50KSB7Ci0JCQl0aGlzKCJyZXBhcmVudCBvbiBtb3ZlIiwgZWxlbWVudCwgcmVxKTsKLQkJCXRoaXMub2xkUGFyZW50ID0gb2xkUGFyZW50OwotCQkJdGhpcy52aWV3ID0gdmlldzsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFJlcGFyZW50aW5nRWxlbWVudHNDb21tYW5kKFN0cmluZyBsYWJlbCwgRU9iamVjdCBlbGVtZW50VG9FZGl0LCAKLQkJCQlJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCXN1cGVyKGxhYmVsLCBlbGVtZW50VG9FZGl0LCByZXF1ZXN0KTsKLQkJCXRoaXMubW92ZUVsZW1lbnQgPSBlbGVtZW50VG9FZGl0OyAKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCVZpZXcgcGFyZW50VmlldyA9IChWaWV3KWdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQkJaWYocGFyZW50Vmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJaWYobW92ZUVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpewotCQkJCQlWaWV3IG9sZFBhcmVudFZpZXcgPSAoVmlldylvbGRQYXJlbnQuZ2V0TW9kZWwoKTsKLQkJCQkJKChBY3Rpdml0eU5vZGUpbW92ZUVsZW1lbnQpLmdldEluUGFydGl0aW9ucygpLnJlbW92ZShvbGRQYXJlbnRWaWV3LmdldEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCQlpZihtb3ZlRWxlbWVudCAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21tYW5kIGFkanVzdExvY2F0aW9uQ29tbWFuZChJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQsCi0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgU2hhcGVFZGl0UGFydCkgewotCQkJUG9pbnQgbG9jYXRpb24gPSByZXF1ZXN0LmdldE1vdmVEZWx0YSgpLmdldENvcHkoKTsKLQkJCVBvaW50IGNoaWxkTG9jYXRpb24gPSBjaGlsZC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRMb2NhdGlvbigpOwotCQkJbG9jYXRpb24ueCs9Y2hpbGRMb2NhdGlvbi54OwotCQkJbG9jYXRpb24ueSs9Y2hpbGRMb2NhdGlvbi55OwotCQkJSUNvbW1hbmQgYm91bmRzQ29tbWFuZCA9IG5ldyBTZXRCb3VuZHNDb21tYW5kKAotCQkJCQkoKFNoYXBlRWRpdFBhcnQpIGNoaWxkKS5nZXRFZGl0aW5nRG9tYWluKCksCi0JCQkJCURpYWdyYW1VSU1lc3NhZ2VzLlNldExvY2F0aW9uQ29tbWFuZF9MYWJlbF9SZXNpemUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKChWaWV3KSBjaGlsZC5nZXRNb2RlbCgpKSwKLQkJCQkJbG9jYXRpb24pOwotCi0JCQlyZXR1cm4gYm91bmRzQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvY3VzdG9tL3BvbGljaWVzL09wZW5BREVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvT3BlbkFERWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQyODgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9jdXN0b20vcG9saWNpZXMvT3BlbkFERWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk9wZW5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIE1vdXNlIGRvdWJsZSBjbGljayBvbiBTdHJ1Y3R1cmVkQWN0aXZpdHlFZGl0UGFydCBzaG91bGQgb3BlbiBkaWFncmFtLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIE9wZW5BREVkaXRQb2xpY3kgZXh0ZW5kcyBPcGVuRWRpdFBvbGljeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5PcGVuRWRpdFBvbGljeSNnZXRPcGVuQ29tbWFuZChvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRPcGVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSBnZXRUYXJnZXRFZGl0UGFydChyZXF1ZXN0KTsKLQkJaWYgKHRhcmdldEVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQlOb2RlIHZpZXcgPSAoTm9kZSkgdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQotCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IERpYWdyYW1Db3JlVXRpbC5nZXREaWFncmFtRWRpdFBhcnQodGFyZ2V0RWRpdFBhcnQpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1FZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlcgotCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIoZWxlbWVudCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJCQlzZWxlY3RlZE9iamVjdCA9IGFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCQkJCX0KLQkJCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKEdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbUVkaXRQYXJ0Ci0JCQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IChEaWFncmFtRWRpdERvbWFpbikgdmlld2VyCi0JCQkJCQkJLmdldEVkaXREb21haW4oKTsKLQkJCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IGRvbWFpbi5nZXREaWFncmFtRWRpdG9yUGFydCgpOwotCQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQkJCWRpYWdyYW1BZGFwdGVyLmdldFN1cHByZXNzaW9uKCksCi0JCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLQkJCQkJCXRyeXsKLQkJCQkJCURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCS5vcGVuRGlhZ3JhbUVkaXRvcigKLQkJCQkJCQkJCQlwYXJ0LmdldFNpdGUoKS5nZXRQYWdlKCksCi0JCQkJCQkJCQkJaW5wdXQsCi0JCQkJCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTAyYzExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM2YjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIG5ld0VsZW1lbnQgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBzdXBlcgotCQkJCS5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbAotCQkJCSYmIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOQotCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJfQotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID09ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyCi0JCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzMDk3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0NvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWY3YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBteUNvbnRhaW5lcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEFjdGl2aXR5Tm9kZSBteVNvdXJjZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEFjdGl2aXR5Tm9kZSBteVRhcmdldDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxLAotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIsIEFjdGl2aXR5Tm9kZSBzb3VyY2UsCi0JCQlBY3Rpdml0eU5vZGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHJlcSk7Ci0JCXN1cGVyLnNldEVsZW1lbnRUb0VkaXQoY29udGFpbmVyKTsKLQkJbXlDb250YWluZXIgPSBjb250YWluZXI7Ci0JCW15U291cmNlID0gc291cmNlOwotCQlteVRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gbXlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG15U291cmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBteVRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnRUb0VkaXQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCUNvbnRyb2xGbG93IG5ld0VsZW1lbnQgPSAoQ29udHJvbEZsb3cpIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldChteVRhcmdldCk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZShteVNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3NmMwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Kb2luTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5NZXJnZU5vZGU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgcmVvcmllbnREaXJlY3Rpb247Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG9sZEVuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbmV3RW5kOwotCi0JcHJpdmF0ZSBFZGl0UGFydCBob3N0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0LmdldExhYmVsKCksIHJlcXVlc3QuZ2V0UmVsYXRpb25zaGlwKCksIHJlcXVlc3QpOwotCQlyZW9yaWVudERpcmVjdGlvbiA9IHJlcXVlc3QuZ2V0RGlyZWN0aW9uKCk7Ci0JCW9sZEVuZCA9IHJlcXVlc3QuZ2V0T2xkUmVsYXRpb25zaGlwRW5kKCk7Ci0JCW5ld0VuZCA9IHJlcXVlc3QuZ2V0TmV3UmVsYXRpb25zaGlwRW5kKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmICghKGdldEVsZW1lbnRUb0VkaXQoKSBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7Ci0JCQlyZXR1cm4gY2FuUmVvcmllbnRTb3VyY2UoKTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50U291cmNlKCkgewotCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUgJiYgbmV3RW5kIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBnZXRMaW5rKCkuZ2V0VGFyZ2V0KCk7Ci0vLwkJaWYgKCEoZ2V0TGluaygpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0TGluaygpCi0vLwkJCQkuZUNvbnRhaW5lcigpOwotLy8JCXJldHVybiBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLS8vCQkJCS5jYW5FeGlzdENvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBnZXROZXdTb3VyY2UoKSwgdGFyZ2V0KTsKLQkJaWYoIWNhbkNvbm5lY3QoKEFjdGl2aXR5Tm9kZSluZXdFbmQsIHRhcmdldCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlpZiAobmV3RW5kIGluc3RhbmNlb2YgTWVyZ2VOb2RlIHx8IG5ld0VuZCBpbnN0YW5jZW9mIEpvaW5Ob2RlKSB7Ci0JCQlBY3Rpdml0eU5vZGUgam9pbiA9IChBY3Rpdml0eU5vZGUpIG5ld0VuZDsKLQkJCUxpc3Q8QWN0aXZpdHlFZGdlPiBsaXN0ID0gam9pbi5nZXRPdXRnb2luZ3MoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPj0gMSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JCQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFRhcmdldCgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlICYmIG5ld0VuZCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gZ2V0TGluaygpLmdldFNvdXJjZSgpOwotLy8JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSkgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotLy8JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldExpbmsoKQotLy8JCQkJLmVDb250YWluZXIoKTsKLS8vCQlyZXR1cm4gVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0vLwkJCQkuY2FuRXhpc3RDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBnZXROZXdUYXJnZXQoKSk7Ci0JCQotCQlpZighY2FuQ29ubmVjdChzb3VyY2UsIChBY3Rpdml0eU5vZGUpbmV3RW5kKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChuZXdFbmQgaW5zdGFuY2VvZiBEZWNpc2lvbk5vZGUgfHwgbmV3RW5kIGluc3RhbmNlb2YgRm9ya05vZGUpIHsKLQkJCUFjdGl2aXR5Tm9kZSBqb2luID0gKEFjdGl2aXR5Tm9kZSkgbmV3RW5kOwotCQkJTGlzdDxBY3Rpdml0eUVkZ2U+IGxpc3QgPSBqb2luLmdldEluY29taW5ncygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+PSAxKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghY2FuRXhlY3V0ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkiSW52YWxpZCBhcmd1bWVudHMgaW4gcmVvcmllbnQgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIHJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiByZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRTb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFNvdXJjZShnZXROZXdTb3VyY2UoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFRhcmdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlnZXRMaW5rKCkuc2V0VGFyZ2V0KGdldE5ld1RhcmdldCgpKTsKLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sRmxvdyBnZXRMaW5rKCkgewotCQlyZXR1cm4gKENvbnRyb2xGbG93KSBnZXRFbGVtZW50VG9FZGl0KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgZ2V0T2xkU291cmNlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5Tm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE5ld1NvdXJjZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIG5ld0VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBnZXRPbGRUYXJnZXQoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlOb2RlKSBvbGRFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgZ2V0TmV3VGFyZ2V0KCkgewotCQlyZXR1cm4gKEFjdGl2aXR5Tm9kZSkgbmV3RW5kOwotCX0KLQkKLQkvKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvc3QoRWRpdFBhcnQgaG9zdCl7Ci0JCXRoaXMuaG9zdCA9IGhvc3Q7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldEhvc3QoKXsKLQkJcmV0dXJuIHRoaXMuaG9zdDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNhbkNvbm5lY3QoQWN0aXZpdHlOb2RlIHNvdXJjZSwgQWN0aXZpdHlOb2RlIHRhcmdldCl7Ci0JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZihEaWFncmFtQ29yZVZhbGlkYXRpb24uaXNEdXBsaWNhdGVSZWxhdGlvbnNoaXAoc291cmNlLCB0YXJnZXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZihnZXRIb3N0KCkgIT0gbnVsbCl7Ci0JCQlpZiAoRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmNhbkNvbm5lY3QoKEVkaXRQYXJ0KSBnZXRIb3N0KCksIHNvdXJjZSwgCi0JCQkJCXRhcmdldCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvRGVjaXNpb25Ob2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDcyMDZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0RlY2lzaW9uTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0ZvcmtOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvRm9ya05vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODYxYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvRm9ya05vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGb3JrTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Jbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzNDJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Jbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9Kb2luTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0pvaW5Ob2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFiNjk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL0pvaW5Ob2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSm9pbk5vZGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL01lcmdlTm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL01lcmdlTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ODhkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9NZXJnZU5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxZjIwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9jb21tYW5kcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIG5ld0VsZW1lbnQgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgc3VwZXIKLQkJCQkuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwKLQkJCQkmJiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlVTUxFbGVtZW50VHlwZXMuSW5pdGlhbGl6ZXJzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMQotCQkJCQkuaW5pdChuZXdFbGVtZW50KTsKLQkJfQotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsCi0JCQkJJiYgVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxpemVycy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAKLQkJCQkJLmluaXQobmV3RWxlbWVudCk7Ci0JCX0KLQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbAotCQkJCSYmIFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPT0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCVVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsaXplcnMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Ci0JCQkJCS5pbml0KG5ld0VsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBuZXdFbGVtZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2NvbW1hbmRzL1VNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2NjY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvY29tbWFuZHMvVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCBleHRlbmRzCi0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUFkYXB0YWJsZSBlZGdlQWRhcHRvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQoCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgbGFiZWwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZmZlY3RlZEZpbGVzKCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgZWRnZUFkYXB0b3IuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFdvcmtzcGFjZUZpbGVzKHZpZXcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZEZpbGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGdldEVkZ2VBZGFwdG9yKCkgewotCQlyZXR1cm4gZWRnZUFkYXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkZ2VBZGFwdG9yKElBZGFwdGFibGUgZWRnZUFkYXB0b3IpIHsKLQkJdGhpcy5lZGdlQWRhcHRvciA9IGVkZ2VBZGFwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIElBZGFwdGFibGUgaW5mbykgewotCQlhc3NlcnQgbnVsbCAhPSBlZGdlQWRhcHRvciA6ICJOdWxsIGNoaWxkIGluIFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQlFZGdlIGVkZ2UgPSAoRWRnZSkgZ2V0RWRnZUFkYXB0b3IoKS5nZXRBZGFwdGVyKEVkZ2UuY2xhc3MpOwotCQlhc3NlcnQgbnVsbCAhPSBlZGdlIDogIk51bGwgZWRnZSBpbiBVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCQlWaWV3IHRlbXBWaWV3ID0gZWRnZS5nZXRTb3VyY2UoKTsKLQkJZWRnZS5zZXRTb3VyY2UoZWRnZS5nZXRUYXJnZXQoKSk7Ci0JCWVkZ2Uuc2V0VGFyZ2V0KHRlbXBWaWV3KTsKLQotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmMTU1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eUZpbmFsTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IyZDcyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJiYWNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZTMzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRIZWxwZXJBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdEhlbHBlckFkdmljZSBleHRlbmRzCi0JCUFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxN2RhYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuUGFja2FnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5Nb3ZlRWxlbWVudHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRNb3ZlQ29tbWFuZChNb3ZlUmVxdWVzdCByZXEpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkvLwkJcmV0dXJuIHN1cGVyLmdldE1vdmVDb21tYW5kKHJlcSk7Ci0JCU1vdmVFbGVtZW50c0NvbW1hbmQgY21kID0gbmV3IE1vdmVFbGVtZW50c0NvbW1hbmQocmVxKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJLy9yZXR1cm4gc3VwZXIuY2FuRXhlY3V0ZSgpOwotCQkJCUVPYmplY3QgY29udGFpbmVyID0gZ2V0VGFyZ2V0Q29udGFpbmVyKCk7Ci0KLQkJCQlpZiAoY29udGFpbmVyID09IG51bGwgfHwgZ2V0RWxlbWVudHNUb01vdmUoKSA9PSBudWxsCi0JCQkJCQl8fCBnZXRFbGVtZW50c1RvTW92ZSgpLmlzRW1wdHkoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJZm9yIChJdGVyYXRvciBpID0gZ2V0RWxlbWVudHNUb01vdmUoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaS5uZXh0KCk7Ci0JCQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IGdldFRhcmdldEZlYXR1cmUoZWxlbWVudCk7Ci0KLQkJCQkJaWYgKGZlYXR1cmUgPT0gbnVsbAotCQkJCQkJCXx8ICFjb250YWluZXIuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKQotCQkJCQkJCQkJLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJCQkvLyBJZiB0aGUgdGFyZ2V0IGZlYXR1cmUgZG9lc24ndCBleGlzdCBpbiB0aGUgdGFyZ2V0IGNvbnRhaW5lciwKLQkJCQkJCS8vIGRvbid0IGFsbG93IHRoZSBtb3ZlLgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gSUYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiB0aGUgdGFyZ2V0IGNvbnRhaW5lci4uLgotCQkJCQlpZiAoY29udGFpbmVyLmVxdWFscyhlbGVtZW50LmVDb250YWluZXIoKSkKLQkJCQkJCQkmJiBmZWF0dXJlID09IGVsZW1lbnQuZUNvbnRhaW5tZW50RmVhdHVyZSgpKSB7Ci0JCQkJCQkvLyBEb24ndCBhbGxvdyB0aGUgcmVwYXJlbnRpbmcKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCS8vIElGIHRoZSBlbGVtZW50IGlzIHRoZSBwYXJlbnQgb2YgdGhlIHRhcmdldCBjb250YWluZXIuLi4KLQkJCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKGVsZW1lbnQsIGdldFRhcmdldENvbnRhaW5lcigpKSkgewotCQkJCQkJLy8gRG9uJ3QgYWxsb3cgdGhlIHJlcGFyZW50aW5nCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQkvLyBJRiB0aGUgY29udGFpbmVyIGNhbiBub3QgY29udGFpbiB0aGUgZWxlbWVudC4uLgotCQkJCQkvLwkJCQkJaWYgKCFQYWNrYWdlVXRpbC5jYW5Db250YWluKGdldFRhcmdldENvbnRhaW5lcigpLmVDbGFzcygpLAotCQkJCQkvLwkJCQkJCQlmZWF0dXJlLCBlbGVtZW50LmVDbGFzcygpLCBmYWxzZSkpIHsKLQkJCQkJLy8JCQkJCQkvLyBEb24ndCBhbGxvdyB0aGUgcmVwYXJlbnRpbmcKLQkJCQkJLy8JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCS8vCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWViMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRIZWxwZXJBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXJBZHZpY2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25FZGl0SGVscGVyQWR2aWNlIGV4dGVuZHMgQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0NvbnRyb2xGbG93RWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Db250cm9sRmxvd0VkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3M2RjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0NvbnRyb2xGbG93RWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93RWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL0RlY2lzaW9uTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRGVjaXNpb25Ob2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGNjMzNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRGVjaXNpb25Ob2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Gb3JrTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvRm9ya05vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTI3MDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Gb3JrTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JrTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Jbml0aWFsTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSW5pdGlhbE5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZGM5MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Jbml0aWFsTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Kb2luTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvSm9pbk5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTc1YmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9Kb2luTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBVTUxCYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9NZXJnZU5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL01lcmdlTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyOGEyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL01lcmdlTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVFZGl0SGVscGVyIGV4dGVuZHMgVU1MQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDU4Y2FlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0SGVscGVyQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyQWR2aWNlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdEhlbHBlckFkdmljZSBleHRlbmRzCi0JCUFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY1MTIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlciBleHRlbmRzIFVNTEJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9oZWxwZXJzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0SGVscGVyQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MmEwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlckFkdmljZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdEhlbHBlckFkdmljZSBleHRlbmRzCi0JCUFic3RyYWN0RWRpdEhlbHBlckFkdmljZSB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9VTUxCYXNlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvaGVscGVycy9VTUxCYXNlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDk2MDgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L2hlbHBlcnMvVU1MQmFzZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuaGVscGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWRpdGhlbHBlci5BYnN0cmFjdEVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MQmFzZUVkaXRIZWxwZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRIZWxwZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfUE9MSUNZX0NPTU1BTkQgPSAiZWRpdCBwb2xpY3kgY29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0SW5zdGVhZENvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJSUNvbW1hbmQgZXBDb21tYW5kID0gKElDb21tYW5kKSByZXEuZ2V0UGFyYW1ldGVyKEVESVRfUE9MSUNZX0NPTU1BTkQpOwotCQlyZXEuc2V0UGFyYW1ldGVyKEVESVRfUE9MSUNZX0NPTU1BTkQsIG51bGwpOwotCQlJQ29tbWFuZCBlaENvbW1hbmQgPSBzdXBlci5nZXRJbnN0ZWFkQ29tbWFuZChyZXEpOwotCQlpZiAoZXBDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJaWYgKGVoQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZXBDb21tYW5kOwotCQl9Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVDb21tYW5kKG51bGwpOwotCQljb21tYW5kLmFkZChlcENvbW1hbmQpOwotCQljb21tYW5kLmFkZChlaENvbW1hbmQpOwotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4MjM4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5BY3Rpdml0eUNyZWF0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuQWN0aXZpdHlYWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkNvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUVkaXRQYXJ0IGV4dGVuZHMgRGlhZ3JhbUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFTF9JRCA9ICJBRCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3OTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQotCQkvLwkJIG1vZGlmaWVkIFNUQVJUCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5WFlMYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0JCS8vIG1vZGlmaWVkIEVORAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlpZiAoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLlZJRVdfX1ZJU0lCTEUuZXF1YWxzKGV2ZW50LmdldEZlYXR1cmUoKSkpIHsKLQkJCU9iamVjdCBub3RpZmllciA9IGV2ZW50LmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAobm90aWZpZXIgPT0gZ2V0TW9kZWwoKSkKLQkJCQlyZWZyZXNoVmlzaWJpbGl0eSgpOwotCQkJZWxzZSBpZiAoZXZlbnQuZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlyZWZyZXNoQ2hpbGRyZW4oKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoQ29ubmVjdGlvbkVkaXRQYXJ0cyh0aGlzKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogR01GIGFuZCBHRUYgaXMgbm90IGhhbmRsaW5nIGNvbm5lY3Rpb25zIHZpc2liaWxpdHkgcHJvcGVybHkuIAotCSAqIFRoaXMgaXMgd29yay1hcm91bmQgc29sdXRpb24gdG8gaGFuZGxlIGNvbm5lY3Rpb25zIHZpc2liaWxpdHkuICAKLQkgKiBWaXNpYmlsaXR5IG9mIGVkZ2VzIG5lZWQgdG8gc2V0IGZpcnN0IGFuZCB0aGVuIG5vZGVzLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCURpYWdyYW0gYWN0ID0gKERpYWdyYW0pIGdldE1vZGVsKCk7Ci0JCUxpc3QgZWRnZXMgPSBhY3QuZ2V0RWRnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWRnZS5pc1Zpc2libGUoKSkgewotCQkJCUNvbm5lY3Rpb25FZGl0UGFydCBwYXJ0ID0gY3JlYXRlT3JGaW5kQ29ubmVjdGlvbihlZGdlKTsKLQkJCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJCWlmIChwYXJ0LmdldFNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIxCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCU9iamVjdCBtb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCQkJCQlpZiAoZWRnZS5nZXRTb3VyY2UoKSA9PSBtb2RlbCkgewotCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJCQkJCQlpZiAoKChHcmFwaGljYWxFZGl0UGFydCkgZWxlbWVudCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQkJCQkJcGFydC5zZXRTb3VyY2UoZWxlbWVudCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXBhcnQuc2V0U291cmNlKG51bGwpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChwYXJ0LmdldFRhcmdldCgpID09IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIxCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRWRpdFBhcnQgZWxlbWVudCA9IChFZGl0UGFydCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCU9iamVjdCBtb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJCQkJCQlpZiAoZWRnZS5nZXRUYXJnZXQoKSA9PSBtb2RlbCkgewotCQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJCQkJCQlpZiAoKChHcmFwaGljYWxFZGl0UGFydCkgZWxlbWVudCkKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQkJCQkJcGFydC5zZXRUYXJnZXQoZWxlbWVudCk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCXBhcnQuc2V0VGFyZ2V0KG51bGwpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uRWRpdFBhcnQgcGFydCA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uRWRpdFBhcnQpIGNyZWF0ZU9yRmluZENvbm5lY3Rpb24oZWRnZSk7Ci0JCQkJaWYgKChwYXJ0LmdldFNvdXJjZSgpID09IG51bGwgfHwgcGFydC5nZXRUYXJnZXQoKSA9PSBudWxsKQotCQkJCQkJJiYgcGFydC5nZXRGaWd1cmUoKSAhPSBudWxsKSB7Ci0JCQkJCXBhcnQuZ2V0RmlndXJlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCXBhcnQuZ2V0RmlndXJlKCkucmV2YWxpZGF0ZSgpOwotCQkJCQlwYXJ0LmRlYWN0aXZhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuaXNEZWJ1Z2dpbmcoKSkgewotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJIkVycm9yIG9jY3VyZWQgd2hpbGUgcmVmcmVzaCB0aGUgY29ubmVjdGlvbjogIiArIGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE1vdmVzIGNvbXBsZXRlIGRpYWdyYW0gY2hpbGRyZW4gdG8gZ2l2ZW4gZGVsdGEuIAotCSAqIEBwYXJhbSBpbnQgIChYLWF4aXMgZGVsdGEpCi0JICogQHBhcmFtIGludCAgKFktYXhpcyBkZWx0YSkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlRmlndXJlKGludCBtb3ZlWCwgaW50IG1vdmVZKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZDsKLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlSZWN0YW5nbGUgciA9IG5ldyBSZWN0YW5nbGUobmV3IFBvaW50KGJvdW5kcy54ICsgbW92ZVgsCi0JCQkJCQlib3VuZHMueSArIG1vdmVZKSwgYm91bmRzLmdldFNpemUoKSk7Ci0KLQkJCQkvLyBhbHNvIG5lZWQgdG8gbW92ZSB0aGUgYmVuZCBwb2ludHMKLS8vCQkJCUxpc3QgbGlzdCA9IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJQ29udHJvbEZsb3dFZGl0UGFydCBsaW5rcGFydCA9IChDb250cm9sRmxvd0VkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLS8vCQkJCQlMaW5rIGxpbmsgPSAoTGluaykgbGlua3BhcnQuZ2V0TW9kZWwoKTsKLS8vCQkJCQlpZiAobGluay5nZXRCZW5kcG9pbnRzKCkuc2l6ZSgpID4gMCkgewotLy8JCQkJCQlQb2ludExpc3QgcGxpc3QgPSAoKFBvbHlsaW5lQ29ubmVjdGlvbikgbGlua3BhcnQKLS8vCQkJCQkJCQkuZ2V0RmlndXJlKCkpLmdldFBvaW50cygpOwotLy8JCQkJCQlMaXN0IHBvaW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwbGlzdC5zaXplKCkgLSAxOyBpKyspIHsKLS8vCQkJCQkJCVBvaW50IHAgPSBwbGlzdC5nZXRQb2ludChpKTsKLS8vCQkJCQkJCXAgPSBwLnRyYW5zbGF0ZShuZXcgUG9pbnQobW92ZVgsIG1vdmVZKSk7Ci0vLwotLy8JCQkJCQkJb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IGJwID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCgKLS8vCQkJCQkJCQkJcCk7Ci0vLwkJCQkJCQlwb2ludHMuYWRkKGJwKTsKLS8vCQkJCQkJfQotLy8KLS8vCQkJCQkJbGlua3BhcnQuZ2V0Q29ubmVjdGlvbkZpZ3VyZSgpLnNldFJvdXRpbmdDb25zdHJhaW50KAotLy8JCQkJCQkJCXBvaW50cyk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCi0JCQkJdGhpcy5zZXRMYXlvdXRDb25zdHJhaW50KHBhcnQsIHBhcnQuZ2V0RmlndXJlKCksIHIpOwotCi0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUGFydCBub3QgbW92ZWQ6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTgxMGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cGFydHMuTGF5ZXJNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuQm9yZGVySXRlbUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0IGV4dGVuZHMgQWJzdHJhY3RCb3JkZXJlZFNoYXBlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElCb3JkZXJJdGVtRWRpdFBhcnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBCb3JkZXJJdGVtU2VsZWN0aW9uRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlFbmROb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBFbmROb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbmROb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChFbmROb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLAotCQkJSUJvcmRlckl0ZW1FZGl0UGFydCBib3JkZXJJdGVtRWRpdFBhcnQpIHsKLQkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwKLQkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsKLQkJCWJvcmRlckl0ZW1Db250YWluZXIuYWRkKGJvcmRlckl0ZW1FZGl0UGFydC5nZXRGaWd1cmUoKSwgbG9jYXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMjQpLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDI0KSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRW5kTm9kZUZpZ3VyZSBleHRlbmRzCi0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uZmlndXJlcy5FbmROb2RlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgRW5kTm9kZUZpZ3VyZSgpIHsKLQotCQkJTGluZVN0eWxlIGxpbmVzdHlsZSA9IChMaW5lU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5MSU5FX1NUWUxFKTsKLQkJCWlmIChsaW5lc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5MSU5FX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcwotCQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuZGFya0JsdWUpOwotCQkJfQotCi0JCQlGaWxsU3R5bGUgc3R5bGUgPSAoRmlsbFN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRklMTF9TVFlMRSk7Ci0JCQlpZiAoc3R5bGUgIT0gbnVsbAotCQkJCQkmJiBzdHlsZS5nZXRGaWxsQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkZJTExfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIoc3R5bGUuZ2V0RmlsbENvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEVORE5PREVGSUdVUkVfQkFDSwotCi0JCQkJKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJMjQpKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDI0KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyNCkpOwotCi0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBFTkROT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUzNjc3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsCi0JCQkJMCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUJvcmRlckl0ZW1Mb2NhdG9yIGdldEJvcmRlckl0ZW1Mb2NhdG9yKCkgewotCQlJRmlndXJlIHBhcmVudEZpZ3VyZSA9IGdldEZpZ3VyZSgpLmdldFBhcmVudCgpOwotCQlpZiAocGFyZW50RmlndXJlICE9IG51bGwgJiYgcGFyZW50RmlndXJlLmdldExheW91dE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQlPYmplY3QgY29uc3RyYWludCA9IHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0Q29uc3RyYWludCgKLQkJCQkJZ2V0RmlndXJlKCkpOwotCQkJcmV0dXJuIChJQm9yZGVySXRlbUxvY2F0b3IpIGNvbnN0cmFpbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCWdldEJvcmRlckl0ZW1Mb2NhdG9yKCkKLQkJCQkuc2V0Q29uc3RyYWludChuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJSUZpZ3VyZSBsYWJlbCA9IGNyZWF0ZUZpZ3VyZVByaW0oKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZVByaW0oKSB7Ci0JCXJldHVybiBuZXcgV3JhcExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogVE9ETzogRGlzYWJsZXMgZGlyZWN0IGVkaXQgZm9yIG5vdyB1bnRpbCB0aGUgaXNzdWUgd2l0aCBkdXBsaWNhdGUgbGFiZWxzIGlzIGZpeGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcGVyZm9ybVJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RfRURJVCAhPSByZXF1ZXN0LmdldFR5cGUoKSkgewotICAgICAgICAJc3VwZXIucGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgIH0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MmNjZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDEyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCQkJLmdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRPcGFxdWUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCQkJc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCgpIHsKLQkJCXJldHVybiBmQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoV3JhcExhYmVsIGZpZykgewotCQkJZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbCA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQlpZiAoaXNPcGFxdWUoKSkKLQkJCQlzdXBlci5wYWludEZpZ3VyZShncmFwaGljcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBlNmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJCQkuZ2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbChmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFdyYXBMYWJlbCBnZXRGaWd1cmVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwoKSB7Ci0JCQlyZXR1cm4gZkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUxhYmVsKFdyYXBMYWJlbCBmaWcpIHsKLQkJCWZBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lTGFiZWwgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTk3MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAxMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImRpYWdyYW0vbWlsZXN0b25lLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzUmVhZE9ubHkodGhpcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsCi0JCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLAotCQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJKChBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0KSBnZXRFZGl0UGFydCgpKQotCQkJCQkJCS5wZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCQkJCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLnZhbGlkU3RyaW5nRm9yQnJlYWtkb3duRWxlbWVudHMoCi0JCQkJCQkJZ2V0RWRpdFBhcnQoKSwgdHh0KTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCU9iamVjdCBmZWF0dXJlID0gZXZlbnQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzE1ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQKLQkJaW1wbGVtZW50cyBJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImRpYWdyYW0vdGFza2Rlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksCi0JCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5OWFhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuUmVzaXphYmxlU2hhcGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDIwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJWFlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgewotCQkJKChBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkKLQkJCQkJLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpLmdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobmV3IEZyZWVmb3JtTGF5b3V0KCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRDb25zdHJhaW50KElGaWd1cmUgZmlndXJlKSB7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjb25zdHJhaW50cy5nZXQoZmlndXJlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIC0xLCAtMSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKSB7Ci0KLQkJCVhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBYWUxheW91dCgpOwotCi0JCQl0aGlzLnNldExheW91dE1hbmFnZXIobXlHZW5MYXlvdXRNYW5hZ2VyKTsKLQotCQkJdGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYmxhY2sKLQotCQkJKTsKLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKEFDVElWSVRZUEFSVElUSU9ORklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDYwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlXcmFwTGFiZWwgZmlnXzAgPSBuZXcgV3JhcExhYmVsKCk7Ci0KLQkJCXNldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmUGFydGl0aW9uTGFiZWxGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmUGFydGl0aW9uTGFiZWxGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLAotCQkJMjU1LCAyNTUsIDI1NSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmY2M5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MaW5lQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5YWUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uRGVsZWdhdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlJlc2l6YWJsZVNoYXBlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5YWUxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGluZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDg7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQkvLwkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQkvLwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCS8vCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCS8vCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCS8vCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQkvLwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkvLwkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5KCkpOwotCQkvLwkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNSRUFUSU9OX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCXJlbW92ZUVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25MYXlvdXRFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5LkNPTlRBSU5FUl9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvbkRlbGVnYXRpb25FZGl0UG9saWN5KAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCUVkaXRQb2xpY3kuQ09OVEFJTkVSX1JPTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJWFlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBYWUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gc3VwZXIuY3JlYXRlQ2hpbGRFZGl0UG9saWN5KGNoaWxkKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZXNpemFibGVTaGFwZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSBmaWd1cmUgPSBuZXcgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQpIHsKLQkJCSgoQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihuZXcgRnJlZWZvcm1MYXlvdXQoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnQoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNvbnN0cmFpbnRzLmdldChmaWd1cmUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25GaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBBY3Rpdml0eVBhcnRpdGlvbkZpZ3VyZSgpIHsKLQotCQkJb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuWFlMYXlvdXQoKTsKLQotCQkJdGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7Ci0KLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIobGluZXN0eWxlLmdldExpbmVDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzCi0JCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5ibGFjayk7Ci0JCQl9Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihBQ1RJVklUWVBBUlRJVElPTkZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDMwMCksIGdldE1hcE1vZGUoKQotCQkJCQkuRFB0b0xQKDYwMCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoMzAwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg2MDApKTsKLQkJCXRoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcigpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJV3JhcExhYmVsIGZpZ18wID0gbmV3IFdyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVQYXJ0aXRpb25MYWJlbEZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZlBhcnRpdGlvbkxhYmVsRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVBhcnRpdGlvbkxhYmVsRmlndXJlKCkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb25MYWJlbEZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlUGFydGl0aW9uTGFiZWxGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZlBhcnRpdGlvbkxhYmVsRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgQUNUSVZJVFlQQVJUSVRJT05GSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLAotCQkJMjU1LCAyNTUsIDI1NSk7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmlsbFN0eWxlX0ZpbGxDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0QmFja2dyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmVTdHlsZV9MaW5lQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEZvcmVncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKS5pc0luc3RhbmNlKAotCQkJCW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSkKLQkJCXJlZnJlc2hGb250KCk7Ci0JCWVsc2UgaWYgKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCkgPT0gTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRWaWV3X0VsZW1lbnQoKQotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpID09IGdldE5vdGF0aW9uVmlldygpKQotCQkJaGFuZGxlTWFqb3JTZW1hbnRpY0NoYW5nZSgpOwotCQllbHNlCi0JCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTUyNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA3OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCUVPYmplY3QgcGFyc2VyRWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJaWYgKHBhcnNlckVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZShwYXJzZXJFbGVtZW50LmVDbGFzcygpKTsKLQkKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwODsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB3aWR0aCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfV2lkdGgoKSkpLmludFZhbHVlKCk7Ci0JCWludCBoZWlnaHQgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX0hlaWdodCgpKSkuaW50VmFsdWUoKTsKLQkJRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgbG9jID0gbmV3IFBvaW50KHgsIHkpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKGxvYywgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0KLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3YTYzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJRU9iamVjdCBwYXJzZXJFbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQlpZiAocGFyc2VyRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLmdldEltYWdlKHBhcnNlckVsZW1lbnQuZUNsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgVU1MRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCXJlZnJlc2hCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5hZGROb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCWFkZExpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIsIHRoaXMsIGdldFByaW1hcnlWaWV3KCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZU5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlEaW1lbnNpb24gc2l6ZSA9IG5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCk7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlQb2ludCBsb2MgPSBuZXcgUG9pbnQoeCwgeSk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUobG9jLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfQotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udENvbG9yKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEZvbnRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9VbmRlcmxpbmUoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9TdHJpa2VUaHJvdWdoKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRIZWlnaHQoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250TmFtZSgpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfQm9sZCgpCi0JCQkJCQkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfSXRhbGljKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hGb250KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbAotCQkJCQkmJiBnZXRQYXJzZXIoKS5pc0FmZmVjdGluZ0V2ZW50KGV2ZW50LAotCQkJCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKSkgewotCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJfQotCQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQkJSVNlbWFudGljUGFyc2VyIG1vZGVsUGFyc2VyID0gKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKG1vZGVsUGFyc2VyLmFyZVNlbWFudGljRWxlbWVudHNBZmZlY3RlZChudWxsLCBldmVudCkpIHsKLQkJCQkJcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQl9Ci0JCQkJCXJlZnJlc2hMYWJlbCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJLy8gUGFyZW50IHNob3VsZCBhc3NpZ24gb25lIHVzaW5nIHNldExhYmVsKCkgbWV0aG9kCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmOGZkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQgZXh0ZW5kcwotCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFydG1lbnROYW1lKCkgewotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSByZXN1bHQgPSAoUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUpIHN1cGVyCi0JCQkJLmNyZWF0ZUZpZ3VyZSgpOwotCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeSgKLQkJCQlFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCi0JCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCS8vcHVibGljIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCS8vCUlGaWd1cmUgcmVzdWx0ID0gc3VwZXIuY3JlYXRlRmlndXJlKCk7Ci0JLy8JcmVzdWx0LnNldEJvcmRlcihuZXcgTGluZUJvcmRlcigpKTsKLQkvLwlyZXR1cm4gcmVzdWx0OwotCS8vfQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaEJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBuZXcgUmVjdGFuZ2xlKHgsIHksIHdpZHRoLCBoZWlnaHQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmF0aW8oRG91YmxlIHJhdGlvKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gLS0gcGFyZW50IGxheW91dCBkb2VzIG5vdCBhY2NlcHQgRG91YmxlIGNvbnN0cmFpbnRzIGFzIHJhdGlvCi0JCS8vIHN1cGVyLnNldFJhdGlvKHJhdGlvKTsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4ZGU5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ29udGFpbmVyTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuWFlMYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQgZXh0ZW5kcwotCQlTaGFwZUNvbXBhcnRtZW50RWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCVJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIHJlc3VsdCA9IChSZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSkgc3VwZXIKLQkJCQkuY3JlYXRlRmlndXJlKCk7Ci0JCXJlc3VsdC5zZXRUaXRsZVZpc2liaWxpdHkoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koCi0JCQkJRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ1JFQVRJT05fUk9MRSwKLQkJCQluZXcgQ3JlYXRpb25FZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCi0JCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBDb250YWluZXJOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgbmV3IFhZTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JLy9wdWJsaWMgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JLy8JSUZpZ3VyZSByZXN1bHQgPSBzdXBlci5jcmVhdGVGaWd1cmUoKTsKLQkvLwlyZXN1bHQuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKCkpOwotCS8vCXJldHVybiByZXN1bHQ7Ci0JLy99Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoQm91bmRzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQkJT2JqZWN0IGZlYXR1cmUgPSBub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCQlpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaEJvdW5kcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCb3VuZHMoKSB7Ci0JCWludCB4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHkgPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgd2lkdGggPSAoKEludGVnZXIpIGdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQlpbnQgaGVpZ2h0ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9IZWlnaHQoKSkpLmludFZhbHVlKCk7Ci0JCSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5zZXRMYXlvdXRDb25zdHJhaW50KHRoaXMsCi0JCQkJZ2V0RmlndXJlKCksIG5ldyBSZWN0YW5nbGUoeCwgeSwgd2lkdGgsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd0VkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzFlYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93RWRpdFBhcnQgZXh0ZW5kcyBDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAzMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250cm9sRmxvd0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0ZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dGaWd1cmUgZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb25FeCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBDb250cm9sRmxvd0ZpZ3VyZSgpIHsKLQotCQkJc2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUG9seWxpbmVEZWNvcmF0aW9uIGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSB7Ci0JCQlQb2x5bGluZURlY29yYXRpb24gZGYgPSBuZXcgUG9seWxpbmVEZWNvcmF0aW9uKCk7Ci0JCQkvLyBkaXNwYXRjaE5leHQ/Ci0KLQkJCVBvaW50TGlzdCBwbCA9IG5ldyBQb2ludExpc3QoKTsKLQkJCXBsLmFkZFBvaW50KC0xLCAxKTsKLQkJCXBsLmFkZFBvaW50KDAsIDApOwotCQkJcGwuYWRkUG9pbnQoLTEsIC0xKTsKLQkJCWRmLnNldFRlbXBsYXRlKHBsKTsKLQkJCWRmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOwotCi0JCQlyZXR1cm4gZGY7Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb3JlZ3JvdW5kQ29sb3IoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIucmVmcmVzaEZvcmVncm91bmRDb2xvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlpZiAoRGlhZ3JhbUNvcmVWYWxpZGF0aW9uLmNoZWNrRGVsZXRlKChFZGdlKSBnZXRNb2RlbCgpKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2FibGVFZGl0TW9kZSgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIG92ZXJyaWRlQ29sb3IgPSBEaWFncmFtQ29yZVV0aWwuZ2V0TGlua092ZXJyaWRlQ29sb3IoKEVkZ2UpIGdldE1vZGVsKCkpOwotCQlzdXBlci5zZXRGb3JlZ3JvdW5kQ29sb3Iob3ZlcnJpZGVDb2xvciAhPSBudWxsID8gb3ZlcnJpZGVDb2xvciA6IGNvbG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd05hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjN2NiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Db250cm9sRmxvd05hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbkxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDEyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLCA0MCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEtleVBvaW50KCkgewotCQlyZXR1cm4gQ29ubmVjdGlvbkxvY2F0b3IuTUlERExFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQkvLwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkvLwkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQkvLwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkvLwkJCWRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkvLwkJfQotCQkvLwkJcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGdldFBhcnNlcigpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBVTUxFZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sRmxvd0xhYmVsRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd0xhYmVsRmlndXJlIGV4dGVuZHMgV3JhcExhYmVsIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIENvbnRyb2xGbG93TGFiZWxGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiIik7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI5OWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0RlY2lzaW9uTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkRlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlY2lzaW9uTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBEZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZmlndXJlID0gbmV3IERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChEZWNpc2lvbkRpYW1vbmRGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBEZWNpc2lvbk5vZGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7Ci0KLQkJCXN1cGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwKLQkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyAvL21vZGlmaWVkCi0JCQlMaW5lU3R5bGUgbGluZXN0eWxlID0gKExpbmVTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQkJaWYgKGxpbmVzdHlsZSAhPSBudWxsCi0JCQkJCSYmIGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkxJTkVfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIobGluZXN0eWxlLmdldExpbmVDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzCi0JCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7Ci0JCQl9Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKAotCQkJCQk1MCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7Ci0KLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJV3JhcExhYmVsIGZpZ18wID0gbmV3IFdyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgewotCQkJcmV0dXJuIGZEaWFtb25kTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmRGlhbW9uZExhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDE4NSwKLQkJCTIwNSwgMjMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmMzg3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5EZWNpc2lvbk5vZGVfMTAwNTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTmFtZUZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcyBXcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiIik7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0ZvcmtOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiYzc2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Gb3JrTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb3NpdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRm9ya05vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlGb3JrTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRm9ya05vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChGb3JrTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQb2xpY3kgZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkgewotCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzaXphYmxlRWRpdFBvbGljeSkgewotCQkJUmVzaXphYmxlRWRpdFBvbGljeSBlcCA9IChSZXNpemFibGVFZGl0UG9saWN5KSByZXN1bHQ7Ci0JCQllcC5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLldFU1QKLQkJCQkJfCBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsKLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoCi0JCQkJCQluZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkJLkRQdG9MUCg4KSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MDJiYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5BYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JQm9yZGVySXRlbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQm9yZGVySXRlbVNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5Cb3JkZXJJdGVtTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaXRpYWxOb2RlRWRpdFBhcnQgZXh0ZW5kcyBBYnN0cmFjdEJvcmRlcmVkU2hhcGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwNDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IEluaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUJvcmRlckl0ZW1FZGl0UGFydCkgewotCQkJCQlyZXR1cm4gbmV3IEJvcmRlckl0ZW1TZWxlY3Rpb25FZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCUluaXRpYWxOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBJbml0aWFsTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKEluaXRpYWxOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvcmRlckl0ZW0oSUZpZ3VyZSBib3JkZXJJdGVtQ29udGFpbmVyLAotCQkJSUJvcmRlckl0ZW1FZGl0UGFydCBib3JkZXJJdGVtRWRpdFBhcnQpIHsKLQkJaWYgKGJvcmRlckl0ZW1FZGl0UGFydCBpbnN0YW5jZW9mIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQlCb3JkZXJJdGVtTG9jYXRvciBsb2NhdG9yID0gbmV3IEJvcmRlckl0ZW1Mb2NhdG9yKGdldE1haW5GaWd1cmUoKSwKLQkJCQkJUG9zaXRpb25Db25zdGFudHMuU09VVEgpOwotCQkJbG9jYXRvci5zZXRCb3JkZXJJdGVtT2Zmc2V0KG5ldyBEaW1lbnNpb24oLTIwLCAtMjApKTsKLQkJCWJvcmRlckl0ZW1Db250YWluZXIuYWRkKGJvcmRlckl0ZW1FZGl0UGFydC5nZXRGaWd1cmUoKSwgbG9jYXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRCb3JkZXJJdGVtKGJvcmRlckl0ZW1Db250YWluZXIsIGJvcmRlckl0ZW1FZGl0UGFydCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKS5EUHRvTFAoMjApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDIwKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTWFpbkZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVGaWd1cmUgZXh0ZW5kcyBFbGxpcHNlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgSW5pdGlhbE5vZGVGaWd1cmUoKSB7Ci0KLQkJCUxpbmVTdHlsZSBsaW5lc3R5bGUgPSAoTGluZVN0eWxlKSBnZXRQcmltYXJ5VmlldygpLmdldFN0eWxlKAotCQkJCQlOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuTElORV9TVFlMRSk7Ci0JCQlpZiAobGluZXN0eWxlICE9IG51bGwKLQkJCQkJJiYgbGluZXN0eWxlLmdldExpbmVDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuTElORV9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihsaW5lc3R5bGUuZ2V0TGluZUNvbG9yKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMKLQkJCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmRhcmtCbHVlKTsKLQkJCX0KLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldENvbG9yKG5ldyBJbnRlZ2VyKHN0eWxlLmdldEZpbGxDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihJTklUSUFMTk9ERUZJR1VSRV9CQUNLKTsKLQkJCX0KLQkJCXRoaXMuc2V0UHJlZmVycmVkU2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgKLQkJCQkJMjApKTsKLQkJCXRoaXMuc2V0U2l6ZShnZXRNYXBNb2RlKCkuRFB0b0xQKDIwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgyMCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgSU5JVElBTE5PREVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCA0NSwgODUsCi0JCQkxMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZU5hbWVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ0NDY3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9Jbml0aWFsTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUJvcmRlckl0ZW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5JQm9yZGVySXRlbUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQsIElCb3JkZXJJdGVtRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXN0YXRpYyB7Ci0JCXJlZ2lzdGVyU25hcEJhY2tQb3NpdGlvbihVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwgbmV3IFBvaW50KDAsIDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElCb3JkZXJJdGVtTG9jYXRvciBnZXRCb3JkZXJJdGVtTG9jYXRvcigpIHsKLQkJSUZpZ3VyZSBwYXJlbnRGaWd1cmUgPSBnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudEZpZ3VyZSAhPSBudWxsICYmIHBhcmVudEZpZ3VyZS5nZXRMYXlvdXRNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJT2JqZWN0IGNvbnN0cmFpbnQgPSBwYXJlbnRGaWd1cmUuZ2V0TGF5b3V0TWFuYWdlcigpLmdldENvbnN0cmFpbnQoCi0JCQkJCWdldEZpZ3VyZSgpKTsKLQkJCXJldHVybiAoSUJvcmRlckl0ZW1Mb2NhdG9yKSBjb25zdHJhaW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlpbnQgeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCB5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJaW50IHdpZHRoID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0U2l6ZV9XaWR0aCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGhlaWdodCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCQlnZXRCb3JkZXJJdGVtTG9jYXRvcigpCi0JCQkJLnNldENvbnN0cmFpbnQobmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IFdyYXBMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIFRPRE86IERpc2FibGVzIGRpcmVjdCBlZGl0IGZvciBub3cgdW50aWwgdGhlIGlzc3VlIHdpdGggZHVwbGljYXRlIGxhYmVscyBpcyBmaXhlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBlcmZvcm1SZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNUX0VESVQgIT0gcmVxdWVzdC5nZXRUeXBlKCkpIHsKLSAgICAgICAgCXN1cGVyLnBlcmZvcm1SZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvSm9pbk5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmJmZmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL0pvaW5Ob2RlRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkpvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLkpvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5Kb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZpbGxTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDA2OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSm9pbk5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlGb3JrTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgRm9ya05vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZvcmtOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChGb3JrTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQb2xpY3kgZ2V0UHJpbWFyeURyYWdFZGl0UG9saWN5KCkgewotCQlFZGl0UG9saWN5IHJlc3VsdCA9IHN1cGVyLmdldFByaW1hcnlEcmFnRWRpdFBvbGljeSgpOwotCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzaXphYmxlRWRpdFBvbGljeSkgewotCQkJUmVzaXphYmxlRWRpdFBvbGljeSBlcCA9IChSZXNpemFibGVFZGl0UG9saWN5KSByZXN1bHQ7Ci0JCQllcC5zZXRSZXNpemVEaXJlY3Rpb25zKFBvc2l0aW9uQ29uc3RhbnRzLldFU1QKLQkJCQkJfCBQb3NpdGlvbkNvbnN0YW50cy5FQVNUKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRm9ya05vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBGb3JrTm9kZUZpZ3VyZSgpIHsKLQotCQkJRmlsbFN0eWxlIHN0eWxlID0gKEZpbGxTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZJTExfU1RZTEUpOwotCQkJaWYgKHN0eWxlICE9IG51bGwKLQkJCQkJJiYgc3R5bGUuZ2V0RmlsbENvbG9yKCkgIT0gRGlhZ3JhbUNvbnN0YW50cy5GSUxMX0NPTE9SX0VERUZBVUxUKSB7Ci0JCQkJc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoCi0JCQkJCQluZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoRk9SS05PREVGSUdVUkVfQkFDSyk7Ci0JCQl9Ci0JCQl0aGlzLnNldFByZWZlcnJlZFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkKLQkJCQkJLkRQdG9MUCg4KSk7Ci0JCQl0aGlzLnNldFNpemUoZ2V0TWFwTW9kZSgpLkRQdG9MUCgxMDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDgpKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIEZPUktOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgNDUsIDg1LCAxMzApOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCU9iamVjdCBmZWF0dXJlID0gbm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9IZWlnaHQoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hCb3VuZHMoKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKS5lcXVhbHMoCi0JCQkJZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCXNldEJhY2tncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJCWdldFByaW1hcnlTaGFwZSgpLnNldEJhY2tncm91bmRDb2xvcigKLQkJCQkJRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5lU3R5bGVfTGluZUNvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb3JlZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkuaXNJbnN0YW5jZSgKLQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpCi0JCQlyZWZyZXNoRm9udCgpOwotCQllbHNlIGlmIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpID09IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Vmlld19FbGVtZW50KCkKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSA9PSBnZXROb3RhdGlvblZpZXcoKSkKLQkJCWhhbmRsZU1ham9yU2VtYW50aWNDaGFuZ2UoKTsKLQkJZWxzZQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL01lcmdlTm9kZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjI5YTBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL01lcmdlTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmZpZ3VyZXMuRGVjaXNpb25Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLk1lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRmlsbFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1lcmdlTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBNZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZmlndXJlID0gbmV3IERlY2lzaW9uRGlhbW9uZEZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25EaWFtb25kRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChEZWNpc2lvbkRpYW1vbmRGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUgZXh0ZW5kcyBEZWNpc2lvbk5vZGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBEZWNpc2lvbkRpYW1vbmRGaWd1cmUoKSB7Ci0KLQkJCXN1cGVyKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSwKLQkJCQkJZ2V0TWFwTW9kZSgpLkRQdG9MUCg1MCkpOyAvL21vZGlmaWVkCi0JCQlMaW5lU3R5bGUgbGluZXN0eWxlID0gKExpbmVTdHlsZSkgZ2V0UHJpbWFyeVZpZXcoKS5nZXRTdHlsZSgKLQkJCQkJTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQkJaWYgKGxpbmVzdHlsZSAhPSBudWxsCi0JCQkJCSYmIGxpbmVzdHlsZS5nZXRMaW5lQ29sb3IoKSAhPSBEaWFncmFtQ29uc3RhbnRzLkxJTkVfQ09MT1JfRURFRkFVTFQpIHsKLQkJCQl0aGlzLnNldEZvcmVncm91bmRDb2xvcihEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q29sb3IobmV3IEludGVnZXIobGluZXN0eWxlLmdldExpbmVDb2xvcigpKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzCi0JCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50cy5kYXJrQmx1ZSk7Ci0JCQl9Ci0KLQkJCUZpbGxTdHlsZSBzdHlsZSA9IChGaWxsU3R5bGUpIGdldFByaW1hcnlWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJCWlmIChzdHlsZSAhPSBudWxsCi0JCQkJCSYmIHN0eWxlLmdldEZpbGxDb2xvcigpICE9IERpYWdyYW1Db25zdGFudHMuRklMTF9DT0xPUl9FREVGQVVMVCkgewotCQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb2xvcihuZXcgSW50ZWdlcihzdHlsZS5nZXRGaWxsQ29sb3IoKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoREVDSVNJT05ESUFNT05ERklHVVJFX0JBQ0spOwotCQkJfQotCQkJdGhpcy5zZXRQcmVmZXJyZWRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKAotCQkJCQk1MCkpOwotCQkJdGhpcy5zZXRTaXplKGdldE1hcE1vZGUoKS5EUHRvTFAoNTApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDUwKSk7Ci0KLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJV3JhcExhYmVsIGZpZ18wID0gbmV3IFdyYXBMYWJlbCgpOwotCi0JCQlzZXRGaWd1cmVEaWFtb25kTGFiZWwoZmlnXzApOwotCi0JCQlPYmplY3QgbGF5RGF0YTAgPSBudWxsOwotCi0JCQl0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZEaWFtb25kTGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlRGlhbW9uZExhYmVsKCkgewotCQkJcmV0dXJuIGZEaWFtb25kTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZURpYW1vbmRMYWJlbChXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmRGlhbW9uZExhYmVsID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIERFQ0lTSU9ORElBTU9OREZJR1VSRV9CQUNLID0gbmV3IENvbG9yKG51bGwsIDE4NSwKLQkJCTIwNSwgMjMwKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkuZXF1YWxzKGZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkuZXF1YWxzKGZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoQm91bmRzKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlJbnRlZ2VyIGMgPSAoSW50ZWdlcikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRCYWNrZ3JvdW5kQ29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCQlnZXRQcmltYXJ5U2hhcGUoKS5zZXRCYWNrZ3JvdW5kQ29sb3IoCi0JCQkJCURpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluZVN0eWxlX0xpbmVDb2xvcigpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9yZWdyb3VuZENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQkJZ2V0UHJpbWFyeVNoYXBlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKAotCQkJCQlEaWFncmFtQ29sb3JSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldENvbG9yKGMpKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpLmlzSW5zdGFuY2UoCi0JCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpKQotCQkJcmVmcmVzaEZvbnQoKTsKLQkJZWxzZSBpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmUoKSA9PSBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFZpZXdfRWxlbWVudCgpCi0JCQkJJiYgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkgPT0gZ2V0Tm90YXRpb25WaWV3KCkpCi0JCQloYW5kbGVNYWpvclNlbWFudGljQ2hhbmdlKCk7Ci0JCWVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMyMWYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9NZXJnZU5vZGVOYW1lRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXJnZU5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKElGaWd1cmUgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIFVNTEVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBOb2RlTmFtZUZpZ3VyZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTm9kZU5hbWVGaWd1cmUgZXh0ZW5kcyBXcmFwTGFiZWwgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9kZU5hbWVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0VGV4dCgiIik7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjZDQyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuU2hhcGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuRGVmYXVsdFNpemVOb2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLk5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMTA7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuR1JBUEhJQ0FMX05PREVfUk9MRSwKLQkJCQluZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSB7Ci0JCQkoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlIGV4dGVuZHMgUmVjdGFuZ2xlRmlndXJlIHsKLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0T3BhcXVlKGZhbHNlKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgV2lkZW5lZFdyYXBMYWJlbCgpOwotCQkJZmlnXzAuc2V0VGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTmV3X1BoYXNlKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0JCQlzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZU5vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZOb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZk5vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCWlmIChpc09wYXF1ZSgpKQotCQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTYzNTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuV2lkZW5lZFdyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMTAxMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5HUkFQSElDQUxfTk9ERV9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQpIHsKLQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRPcGFxdWUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9OZXdfSXRlcmF0aW9uKTsKLQotCQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhmaWdfMCk7Ci0KLQkJCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2EzMzBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5Db25zdHJhaW5lZFRvb2xiYXJMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkdSQVBISUNBTF9OT0RFX1JPTEUsCi0JCQkJbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0JCUxheW91dEVkaXRQb2xpY3kgbGVwID0gbmV3IExheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJCXByb3RlY3RlZCBFZGl0UG9saWN5IGNyZWF0ZUNoaWxkRWRpdFBvbGljeShFZGl0UGFydCBjaGlsZCkgewotCQkJCUVkaXRQb2xpY3kgcmVzdWx0ID0gY2hpbGQKLQkJCQkJCS5nZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBuZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZVJlcXVlc3QgcmVxdWVzdCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGVwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVOb2RlU2hhcGUoKSB7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZ2V0UHJpbWFyeVNoYXBlKCkgewotCQlyZXR1cm4gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KSBjaGlsZEVkaXRQYXJ0KQotCQkJCQkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkuZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0LCBpbnQgaW5kZXgpIHsKLQkJaWYgKGFkZEZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5hZGRDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0LCAtMSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKHJlbW92ZUZpeGVkQ2hpbGQoY2hpbGRFZGl0UGFydCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5yZW1vdmVDaGlsZFZpc3VhbChjaGlsZEVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0Q29udGVudFBhbmVGb3IoSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lRm9yKGVkaXRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRPcGFxdWUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9OZXdfQWN0aXZpdHkpOwotCi0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsKLQkJCXNldEZpZ3VyZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlTm9kZU5hbWVGaWd1cmUoKSB7Ci0JCQlyZXR1cm4gZk5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVOb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTm9kZU5hbWVGaWd1cmUgPSBmaWc7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJaWYgKGlzT3BhcXVlKCkpCi0JCQkJc3VwZXIucGFpbnRGaWd1cmUoZ3JhcGhpY3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjYTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLnBvbGljaWVzLk9wZW5BREVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTGFiZWxEaXJlY3RFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU9iamVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Gb250U3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQgZXh0ZW5kcyBDb21wYXJ0bWVudEVkaXRQYXJ0Ci0JCWltcGxlbWVudHMgSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL3BoYXNlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzUmVhZE9ubHkodGhpcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMDsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQpIGdldEVkaXRQYXJ0KCkpCi0JCQkJCQkJLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KSB7Ci0JCQkJCXJldHVybiBEaWFncmFtQ29yZVV0aWwudmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cygKLQkJCQkJCQlnZXRFZGl0UGFydCgpLCB0eHQpOwotCQkJCX0KLQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKFVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BhcnRzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NDE5YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5wb2xpY2llcy5PcGVuQURFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5BY2Nlc3NpYmxlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Ob25SZXNpemFibGVIYW5kbGVLaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5EaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAxMDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5PUEVOX1JPTEUsIG5ldyBPcGVuQURFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9pdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChVTUxUZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmIChEaWFncmFtQ29yZVV0aWwuaXNSZWFkT25seSh0aGlzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldEVkaXRUZXh0KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsCi0JCQkJCVRleHREaXJlY3RFZGl0TWFuYWdlci5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLAotCQkJCQlVTUxFZGl0UGFydEZhY3RvcnkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJCQkJKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIGMgPSBEaWFncmFtQ29yZVV0aWwuZ2V0Rm9udENvbG9yKHRoaXMpOwotCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQljb2xvciA9IGM7Ci0JCX0KLQkJZ2V0RmlndXJlKCkuc2V0Rm9yZWdyb3VuZENvbG9yKGNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQkJcGFyc2VyRWxlbWVudHMgPSAoKElTZW1hbnRpY1BhcnNlcikgZ2V0UGFyc2VyKCkpCi0JCQkJCS5nZXRTZW1hbnRpY0VsZW1lbnRzQmVpbmdQYXJzZWQoZWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJYWRkTGlzdGVuZXJGaWx0ZXIoCi0JCQkJCQkiU2VtYW50aWNNb2RlbCIgKyBpLCB0aGlzLCAoRU9iamVjdCkgcGFyc2VyRWxlbWVudHMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKHBhcnNlckVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiU2VtYW50aWNNb2RlbCIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIucmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUVkaXRQYXJ0IGdldEFjY2Vzc2libGVFZGl0UGFydCgpIHsKLQkJaWYgKGFjY2Vzc2libGVFUCA9PSBudWxsKSB7Ci0JCQlhY2Nlc3NpYmxlRVAgPSBuZXcgQWNjZXNzaWJsZUdyYXBoaWNhbEVkaXRQYXJ0KCkgewotCi0JCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCQllLnJlc3VsdCA9IGdldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gYWNjZXNzaWJsZUVQOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFZpZXcgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkgewotCQlyZXR1cm4gZ2V0UHJpbWFyeVZpZXcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NzNiZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJ1bm5hYmxlV2l0aFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20ucG9saWNpZXMuT3BlbkFERWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwNTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLk9QRU5fUk9MRSwgbmV3IE9wZW5BREVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL2FjdGl2aXR5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzUmVhZE9ubHkodGhpcykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNzsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLAotCQkJCQlUZXh0RGlyZWN0RWRpdE1hbmFnZXIuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwKLQkJCQkJVU1MRWRpdFBhcnRGYWN0b3J5LmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCQkJCSgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyB0eHQpIHsKLQkJCQkJcmV0dXJuIERpYWdyYW1Db3JlVXRpbC52YWxpZFN0cmluZ0ZvckJyZWFrZG93bkVsZW1lbnRzKAotCQkJCQkJCWdldEVkaXRQYXJ0KCksIHR4dCk7Ci0JCQkJfQotCi0JCQl9KTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQkKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1OTk2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi50b29scy5DZWxsRWRpdG9yTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JVGV4dEF3YXJlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBtb2RlbDsKLQkJCXN3aXRjaCAoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSkgewotCi0JCQljYXNlIEFjdGl2aXR5RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgTWVyZ2VOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IE1lcmdlTm9kZU5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEZvcmtOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBJbml0aWFsTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IERlY2lzaW9uTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBEZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBKb2luTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IENvbnRyb2xGbG93RWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gSGFuZGxlIGNyZWF0aW9uIG9mIHVucmVjb2duaXplZCBjaGlsZCBub2RlIEVkaXRQYXJ0cyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENlbGxFZGl0b3JMb2NhdG9yIGdldFRleHRDZWxsRWRpdG9yTG9jYXRvcigKLQkJCUlUZXh0QXdhcmVFZGl0UGFydCBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZS5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkKLQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3JMb2NhdG9yKChXcmFwTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKChMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIHdyYXBMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRleHRDZWxsRWRpdG9yTG9jYXRvcihXcmFwTGFiZWwgd3JhcExhYmVsKSB7Ci0JCQl0aGlzLndyYXBMYWJlbCA9IHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldFdyYXBMYWJlbCgpIHsKLQkJCXJldHVybiB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldFdyYXBMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRXcmFwTGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaWYgKGdldFdyYXBMYWJlbCgpLmlzVGV4dFdyYXBwZWQoKQotCQkJCQkmJiBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShyZWN0LndpZHRoLAotCQkJCQkJU1dULkRFRkFVTFQpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQl9Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcGFydHMvVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyYzU5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wYXJ0cy9VTUxFeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5MYWJlbExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRXh0Tm9kZUxhYmVsRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlJRmlndXJlIHJlZkZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgb2Zmc2V0ID0gbmV3IFBvaW50KGR4LCBkeSk7Ci0JCWdldEZpZ3VyZSgpLmdldFBhcmVudCgpLnNldENvbnN0cmFpbnQoZ2V0RmlndXJlKCksCi0JCQkJbmV3IExhYmVsTG9jYXRvcihyZWZGaWd1cmUsIG9mZnNldCwgZ2V0S2V5UG9pbnQoKSkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKElGaWd1cmUgdGFyZ2V0KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGdldFJlZmVyZW5jZVBvaW50KCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkJZ2V0T2Zmc2V0KCkpOwotCQkJCQkJbG9jYXRpb24udHJhbnNsYXRlKC10YXJnZXQuZ2V0Qm91bmRzKCkud2lkdGggLyAyLCAwKTsKLQkJCQkJCXRhcmdldC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQl0YXJnZXQuc2V0U2l6ZShuZXcgRGltZW5zaW9uKAotCQkJCQkJCQl0YXJnZXQuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoLCB0YXJnZXQKLQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQkJCQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24ocGFyZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRMYWJlbExvY2F0aW9uKElGaWd1cmUgcGFyZW50KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiNDNjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkRlZmVycmVkTGF5b3V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0U2VtYW50aWNIb3N0KCkgewotCQlyZXR1cm4gaG9zdCgpLmdldE1vZGVsKCkgIT0gbnVsbCA/IHN1cGVyLmdldFNlbWFudGljSG9zdCgpIDogbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9uQWN0aXZhdGUoKSB7CQkKLQkJc3VwZXIucmVmcmVzaE9uQWN0aXZhdGUoKTsKLQkJCi0JCUVkaXRQYXJ0IGVwID0gZ2V0SG9zdCgpOwotCQlpZihlcCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwuaW5pdGlhbGl6ZU9uQWN0aXZhdGUoKERpYWdyYW1FZGl0UGFydCkgZXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eSkgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgdmFsdWVzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJLy8gbW9kaWZpZWQgU1RBUlQKLQkJCS8vIFRvIGF2b2lkIHRoZSBBY3Rpdml0eU5vZGUgc2hvdyBpbiBkdXBsaWNhdGUgcGxhY2VzCi0JCQlpZiAobmV4dFZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJaWYgKCEoKEFjdGl2aXR5Tm9kZSkgbmV4dFZhbHVlKS5nZXRJblBhcnRpdGlvbnMoKS5pc0VtcHR5KCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gbW9kaWZpZWQgRU5ECi0JCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsIG5leHRWYWx1ZSk7Ci0JCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoQWN0aXZpdHkpIG1vZGVsT2JqZWN0KS5nZXRHcm91cHMoKS5pdGVyYXRvcigpOyB2YWx1ZXMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsIG5leHRWYWx1ZSk7Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZJRCkgewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3IGluc3RhbmNlb2YgRWRnZSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRnZSkgewotCQkJCWlmICgoKEFjdGl2aXR5RWRnZSkgZWxlbWVudCkuZ2V0U291cmNlKCkgPT0gbnVsbAotCQkJCQkJfHwgKChBY3Rpdml0eUVkZ2UpIGVsZW1lbnQpLmdldFRhcmdldCgpID09IG51bGwpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8ICh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQgJiYgQnJpZGdlSGVscGVyCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudCgoRU1vZGVsRWxlbWVudCkgdmlldy5nZXRFbGVtZW50KCkpICE9IG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ29ubmVjdGlvbnNMaXN0KCkgewotCQkvLwkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0KGFjdC5nZXRFZGdlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2VFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBBY3Rpdml0eUVkZ2UpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5RWRnZSkgcmVsYXRpb25zaGlwKS5nZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRUYXJnZXRFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBBY3Rpdml0eUVkZ2UpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5RWRnZSkgcmVsYXRpb25zaGlwKS5nZXRUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJbmNsdWRlQ29ubmVjdGlvbihFZGdlIGNvbm5lY3RvciwKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJcmV0dXJuIHN1cGVyLnNob3VsZEluY2x1ZGVDb25uZWN0aW9uKGNvbm5lY3RvciwgY2hpbGRyZW4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VtYW50aWMoKSB7Ci0JCUxpc3QgY3JlYXRlZFZpZXdzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJY3JlYXRlZFZpZXdzLmFkZEFsbChyZWZyZXNoU2VtYW50aWNDaGlsZHJlbigpKTsKLQkJTGlzdCBjcmVhdGVkQ29ubmVjdGlvblZpZXdzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJY3JlYXRlZENvbm5lY3Rpb25WaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ29ubmVjdGlvbnMoKSk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hDb25uZWN0aW9ucygpKTsKLQotCQlpZiAoY3JlYXRlZFZpZXdzLnNpemUoKSA+IDEpIHsKLQkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcgotCQkJRGVmZXJyZWRMYXlvdXRDb21tYW5kIGxheW91dENtZCA9IG5ldyBEZWZlcnJlZExheW91dENvbW1hbmQoaG9zdCgpCi0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIGNyZWF0ZWRWaWV3cywgaG9zdCgpKTsKLQkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOwotCQl9Ci0KLQkJY3JlYXRlZFZpZXdzLmFkZEFsbChjcmVhdGVkQ29ubmVjdGlvblZpZXdzKTsKLQkJbWFrZVZpZXdzSW1tdXRhYmxlKGNyZWF0ZWRWaWV3cyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBteUxpbmtEZXNjcmlwdG9ycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNYXAgbXlFT2JqZWN0MlZpZXdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiByZWZyZXNoQ29ubmVjdGlvbnMoKSB7Ci0JCXRyeSB7Ci0JCQljb2xsZWN0QWxsTGlua3MoZ2V0RGlhZ3JhbSgpKTsKLQkJCUNvbGxlY3Rpb24gZXhpc3RpbmdMaW5rcyA9IG5ldyBMaW5rZWRMaXN0KGdldERpYWdyYW0oKS5nZXRFZGdlcygpKTsKLQkJCWZvciAoSXRlcmF0b3IgZGlhZ3JhbUxpbmtzID0gZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpOyBkaWFncmFtTGlua3MKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIG5leHREaWFncmFtTGluayA9IChFZGdlKSBkaWFncmFtTGlua3MubmV4dCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtPYmplY3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtTcmMgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0U291cmNlKCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua0RzdCA9IG5leHREaWFncmFtTGluay5nZXRUYXJnZXQoKQotCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQlpbnQgZGlhZ3JhbUxpbmtWaXN1YWxJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRChuZXh0RGlhZ3JhbUxpbmspOwotCQkJCWZvciAoSXRlcmF0b3IgbW9kZWxMaW5rRGVzY3JpcHRvcnMgPSBteUxpbmtEZXNjcmlwdG9ycwotCQkJCQkJLml0ZXJhdG9yKCk7IG1vZGVsTGlua0Rlc2NyaXB0b3JzLmhhc05leHQoKTspIHsKLQkJCQkJTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBtb2RlbExpbmtEZXNjcmlwdG9ycwotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmIChkaWFncmFtTGlua09iamVjdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkuZ2V0TGlua0VsZW1lbnQoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rU3JjID09IG5leHRMaW5rRGVzY3JpcHRvci5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rRHN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldERlc3RpbmF0aW9uKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1Zpc3VhbElEID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldFZpc3VhbElEKCkpIHsKLQkJCQkJCWRpYWdyYW1MaW5rcy5yZW1vdmUoKTsKLQkJCQkJCW1vZGVsTGlua0Rlc2NyaXB0b3JzLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGVsZXRlVmlld3MoZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjcmVhdGVDb25uZWN0aW9ucyhteUxpbmtEZXNjcmlwdG9ycyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlteUxpbmtEZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJbXlFT2JqZWN0MlZpZXdNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdEFsbExpbmtzKFZpZXcgdmlldykgewotCQlFT2JqZWN0IG1vZGVsRWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQlpbnQgZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAoZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCkgewotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBJbml0aWFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCW15RU9iamVjdDJWaWV3TWFwLnB1dChtb2RlbEVsZW1lbnQsIHZpZXcpOwotCQkJc3RvcmVMaW5rcyhtb2RlbEVsZW1lbnQsIGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJZGVmYXVsdDogewotCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGNoaWxkcmVuID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNoaWxkcmVuCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJVmlldyBjaGlsZFZpZXcgPSAoVmlldykgY2hpbGRyZW4ubmV4dCgpOwotCQkJCWNvbGxlY3RBbGxMaW5rcyhjaGlsZFZpZXcpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBjcmVhdGVDb25uZWN0aW9ucyhDb2xsZWN0aW9uIGxpbmtEZXNjcmlwdG9ycykgewotCQlpZiAobGlua0Rlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJTGlzdCBhZGFwdGVycyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IgPSBsaW5rRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJZmluYWwgTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcgotCQkJCQkubmV4dCgpOwotCQkJRWRpdFBhcnQgc291cmNlRWRpdFBhcnQgPSBnZXRFZGl0UGFydEZvcihuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJLmdldFNvdXJjZSgpKTsKLQkJCUVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXREZXN0aW5hdGlvbigpKTsKLQkJCWlmIChzb3VyY2VFZGl0UGFydCA9PSBudWxsIHx8IHRhcmdldEVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yKAotCQkJCQluZXh0TGlua0Rlc2NyaXB0b3IuZ2V0U2VtYW50aWNBZGFwdGVyKCksIG51bGwsCi0JCQkJCVZpZXdVdGlsLkFQUEVORCwgZmFsc2UsICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKSk7Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QgY2NyID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCgKLQkJCQkJZGVzY3JpcHRvcik7Ci0JCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX1NUQVJUKTsKLQkJCWNjci5zZXRTb3VyY2VFZGl0UGFydChzb3VyY2VFZGl0UGFydCk7Ci0JCQlzb3VyY2VFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7Ci0JCQljY3Iuc2V0VGFyZ2V0RWRpdFBhcnQodGFyZ2V0RWRpdFBhcnQpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9FTkQpOwotCQkJQ29tbWFuZCBjbWQgPSB0YXJnZXRFZGl0UGFydC5nZXRDb21tYW5kKGNjcik7Ci0JCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCWV4ZWN1dGVDb21tYW5kKGNtZCk7Ci0JCQkJSUFkYXB0YWJsZSB2aWV3QWRhcHRlciA9IChJQWRhcHRhYmxlKSBjY3IuZ2V0TmV3T2JqZWN0KCk7Ci0JCQkJaWYgKHZpZXdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJYWRhcHRlcnMuYWRkKHZpZXdBZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0IGdldEVkaXRQYXJ0Rm9yKEVPYmplY3QgbW9kZWxFbGVtZW50KSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBteUVPYmplY3QyVmlld01hcC5nZXQobW9kZWxFbGVtZW50KTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIChFZGl0UGFydCkgZ2V0SG9zdCgpLmdldFZpZXdlcigpLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoCi0JCQkJCXZpZXcpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUxpbmtzKEVPYmplY3QgY29udGFpbmVyLCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcyA9IGNvbnRhaW5lci5lQ2xhc3MoKTsKLQkJc3RvcmVGZWF0dXJlTW9kZWxGYWNldExpbmtzKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzLCBkaWFncmFtKTsKLQkJc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MpIHsKLQkJc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0NvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0NvbnRyb2xGbG93XzMwMDEoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCWlmIChVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQljb250YWluZXJNZXRhY2xhc3MpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGFpbmVyKQotCQkJCQkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbmV4dFZhbHVlID0gKChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpKTsKLQkJCQlpbnQgbGlua1ZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQobmV4dFZhbHVlKTsKLQkJCQlpZiAoQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQgPT0gbGlua1ZJRCkgewotCQkJCQlPYmplY3Qgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKEFjdGl2aXR5RWRnZSkgbmV4dFZhbHVlKQotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJRU9iamVjdCBkc3QgPSAoRU9iamVjdCkgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQ7Ci0JCQkJCQlzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCA9ICgoQWN0aXZpdHlFZGdlKSBuZXh0VmFsdWUpCi0JCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHNyYyA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCQlteUxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LAotCQkJCQkJCQkJbmV4dFZhbHVlLAotCQkJCQkJCQkJVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEsIGxpbmtWSUQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzLCBEaWFncmFtIGRpYWdyYW0pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5rRGVzY3JpcHRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteVNvdXJjZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15RGVzdGluYXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteUxpbmtFbGVtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGludCBteVZpc3VhbElEOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElBZGFwdGFibGUgbXlTZW1hbnRpY0FkYXB0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlFT2JqZWN0IGxpbmtFbGVtZW50LCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IGxpbmtFbGVtZW50OwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgRU9iamVjdEFkYXB0ZXIobGlua0VsZW1lbnQpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IG51bGw7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwgaW50IGxpbmtWSUQpIHsKLQkJCW15U291cmNlID0gc291cmNlOwotCQkJbXlEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCQkJbXlWaXN1YWxJRCA9IGxpbmtWSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG15U291cmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQkJcmV0dXJuIG15RGVzdGluYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TGlua0VsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbXlMaW5rRWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKCkgewotCQkJcmV0dXJuIG15VmlzdWFsSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0U2VtYW50aWNBZGFwdGVyKCkgewotCQkJcmV0dXJuIG15U2VtYW50aWNBZGFwdGVyOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzIxYjVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDQwY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlGaW5hbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUZpbmFsTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM5YjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RmluYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQotCQkvLyBWYWxpZGF0aW9uIEFjdGl2aXR5RmluYWxOb2RlIG5vZGUgc2hvdWxkIGFsbG93IG9ubHkgb25lIG91dGdvaW5nIGNvbm5lY3Rpb24uCi0JCWlmIChyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBBY3Rpdml0eUZpbmFsTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZU91dGdvaW5nKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ODA5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmRzLkR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkFjdGl2aXR5RmluYWxOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5EZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuRm9ya05vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuSW5pdGlhbE5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuSm9pbk5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eUZpbmFsTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTWVyZ2VOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkZvcmtOb2RlXzEwMDMgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEZvcmtOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEluaXRpYWxOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZWNpc2lvbk5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNiA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgSm9pbk5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfTm9kZSgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDggPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Hcm91cCgpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5X05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVDcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCWlmIChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eV9Ob2RlKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJLy8JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkvLwkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkvLwkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZChlZGl0aW5nRG9tYWluLCByZXEpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCBleHRlbmRzCi0JCQlEdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKAotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQkJRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgcmVxLmdldExhYmVsKCksIHJlcQotCQkJCQkuZ2V0RWxlbWVudHNUb0JlRHVwbGljYXRlZCgpLCByZXEKLQkJCQkJLmdldEFsbER1cGxpY2F0ZWRFbGVtZW50c01hcCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTEyN2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0Zjk1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlNTY1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWUyYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcwotCQlDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWQ5ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxODAwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24yQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjhkYTgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWUwYzVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb24yR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbjJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWVlMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb24ySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uMkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNjLCByZXEuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKENvbXBvdW5kQ29tbWFuZCBjbWQsCi0JCQlib29sZWFuIGNvbmZpcm0pIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdC5uZXh0KCk7Ci0JCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJZm9yIChJdGVyYXRvciBjaXQgPSBub2RlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2l0Ci0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIGNub2RlID0gKE5vZGUpIGNpdC5uZXh0KCk7Ci0JCQkJCXN3aXRjaCAoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsKLQkJCQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChjbm9kZSwgY29uZmlybSkpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWQ5OThkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25DYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQkvLyBEZWxldGUgdGhlIHZpZXcgaWYgYWN0aXZpdHkgcGFydGl0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBhY3Rpdml0eW5vZGUuCi0JCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCWlmKCEoKEFjdGl2aXR5Tm9kZSl2aWV3LmdldEVsZW1lbnQoKSkuZ2V0SW5QYXJ0aXRpb25zKCkuY29udGFpbnMoKChWaWV3KWdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gYXZvaWQgdGhlIGR1cGxpY2F0ZSBsaW5rcyBnZW5lcmF0aW9uLgotCSAqIFNldCBwYXJlbnQgY2Fub25pY2FsRWRpdFBvbGljeSB0byBmYWxzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVSZWZyZXNoKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCUVkaXRQYXJ0IHBhcnQgID0gZ2V0SG9zdCgpLmdldFBhcmVudCgpOwotCQlpZihwYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCl7Ci0JCQlPYmplY3QgdmlldyA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJCUVPYmplY3Qgc2VtYW50aWNIb3N0ID0gKChWaWV3KXZpZXcpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChzZW1hbnRpY0hvc3QgIT0gbnVsbCkgewotCQkJCUxpc3QgY2VwcyA9IENhbm9uaWNhbEVkaXRQb2xpY3kuZ2V0UmVnaXN0ZXJlZEVkaXRQb2xpY2llcyhzZW1hbnRpY0hvc3QpOwotCQkJCWZvciAoIGludCBpID0gMDsgaSA8IGNlcHMuc2l6ZSgpOyBpKysgKSB7Ci0JCQkJCUNhbm9uaWNhbEVkaXRQb2xpY3kgY2VwID0gKENhbm9uaWNhbEVkaXRQb2xpY3kpY2Vwcy5nZXQoaSk7Ci0JCQkJCWNlcC5lbmFibGVSZWZyZXNoKGVuYWJsZSk7IAotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5lbmFibGVSZWZyZXNoKGVuYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjdjZjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25JdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2NDI4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvbkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY2MsIHJlcS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKENvbXBvdW5kQ29tbWFuZCBjbWQsCi0JCQlib29sZWFuIGNvbmZpcm0pIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdC5uZXh0KCk7Ci0JCQlzd2l0Y2ggKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsKLQkJCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlmb3IgKEl0ZXJhdG9yIGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgY25vZGUgPSAoTm9kZSkgY2l0Lm5leHQoKTsKLQkJCQkJc3dpdGNoIChVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgewotCQkJCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKGNub2RlLCBjb25maXJtKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTA2NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJRU9iamVjdCBtb2RlbE9iamVjdCA9ICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJVmlldyB2aWV3T2JqZWN0ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG5leHRWYWx1ZTsKLQkJaW50IG5vZGVWSUQ7Ci0JCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChBY3Rpdml0eVBhcnRpdGlvbikgbW9kZWxPYmplY3QpCi0JCQkJLmdldFN1YnBhcnRpdGlvbnMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJbmV4dFZhbHVlID0gKEVPYmplY3QpIHZhbHVlcy5uZXh0KCk7Ci0JCQlub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0Tm9kZVZpc3VhbElEKHZpZXdPYmplY3QsIG5leHRWYWx1ZSk7Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbCB8fCB2aWV3LmdldEVsZW1lbnQoKQotCQkJCQkJCS5lSXNQcm94eSgpKTsKLQkJfQotCQlpbnQgbm9kZVZJRCA9IFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjNzZkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Mkl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkFjdGl2aXR5UGFydGl0aW9uQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQySXRlbVNlbWFudGljRWRpdFBvbGljeQotCQlleHRlbmRzIFVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9TdWJwYXJ0aXRpb24oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQWN0aXZpdHlQYXJ0aXRpb25DcmVhdGVDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2Yjc1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJLy8gbW9kaWZpZWQgdG8gY2hlY2sgQWN0aXZpdHlQYXJ0aXRpb24gb3Igbm90LiB0byBhdm9pZCBjbGFzc2Nhc3QgZXhjZXB0aW9uLgotCQlpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKEFjdGl2aXR5UGFydGl0aW9uKSBtb2RlbE9iamVjdCkKLQkJCQkJLmdldFN1YnBhcnRpdGlvbnMoKS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJCW5vZGVWSUQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQkJbmV4dFZhbHVlKTsKLQkJCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWSUQpIHsKLQkJCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKSA9PSBudWxsIHx8IHZpZXcuZ2V0RWxlbWVudCgpCi0JCQkJCQkJLmVJc1Byb3h5KCkpOwotCQl9Ci0JCWludCBub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KTsKLQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1ZjFiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzLkFjdGl2aXR5UGFydGl0aW9uRGVzdHJveUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuY3VzdG9tLmNvbW1hbmRzLkNyZWF0ZUFjdGl2aXR5Tm9kZUluQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5BY3Rpdml0eVBhcnRpdGlvbkNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuTW92ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcyBVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsJCQotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbl9TdWJwYXJ0aXRpb24oKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJCi0JCS8vIG1vZGlmaWVkIFNUQVJUCi0JCUNvbW1hbmQgY29tbWFuZCA9IGdldENyZWF0ZUFjdGl2aXR5Tm9kZUNvbW1hbmQocmVxKTsKLQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0JCX0KLQkJLy8gbW9kaWZpZWQgRU5ECi0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQgZXh0ZW5kcwotCQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgQ3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihyZXEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQkJcmV0dXJuIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCk7Ci0JCX07Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkJLmdldENvbnRhaW5lcigpOwotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgZ2V0Q3JlYXRlQWN0aXZpdHlOb2RlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMyA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKQotCQkJCXx8IFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1ID09IHJlcS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSA9PSByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpCi0JCQkJfHwgVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID09IHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkKLQkJCQl8fCBVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPT0gcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uX05vZGUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlQWN0aXZpdHlOb2RlSW5BY3Rpdml0eVBhcnRpdGlvbihyZXEpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZU91dGdvaW5nKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVPdXRnb2luZyhDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldERlc3Ryb3lFbGVtZW50Q29tbWFuZChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQkvKiBtb2RpZnkgU1RBUlQgKi8KLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1Db3JlUmVzb3VyY2VzLmRlbGV0ZUNvbW1hbmRfbGFiZWwpOwotCQlnZXRSZXBhcmVudGluZ0NvbW1hbmQocmVxLCBjYyk7Ci0JCWNjLmNvbXBvc2UobmV3IENvbW1hbmRQcm94eShnZXRNU0xXcmFwcGVyKG5ldyBBY3Rpdml0eVBhcnRpdGlvbkRlc3Ryb3lDb21tYW5kKHJlcSwgZ2V0SG9zdCgpKSkpKTsKLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JCS8qIG1vZGlmeSBFTkQgKi8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIHN1cGVyLmdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKHJlcSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQ29tbWFuZCB0byByZXBhcmVudGluZyB0aGUgZWxlbWVudHMgdG8gQWN0aXZpdHkgYmVmb3JlIGRlbGV0aW5nIHRoZSBBY3Rpdml0eVBhcnRpdGlvbi4KLSAJICoKLQkgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdAotCSAqIEByZXR1cm4gY29tbWFuZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlcGFyZW50aW5nQ29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCwgQ29tcG9zaXRlQ29tbWFuZCBjYykgewotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBnZXRIb3N0KCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQlPYmplY3QgcGFyZW50ICA9ICAoKEVkaXRQYXJ0KWdldEhvc3QoKSkuZ2V0UGFyZW50KCk7Ci0JCUVSZWZlcmVuY2UgZmVhdHVyZSA9IFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X05vZGUoKTsKLQkJCi0JCWlmKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHlFZGl0UGFydCkpewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJCi0JCVZpZXcgY29udGFpbmVyID0gKFZpZXcpKChFZGl0UGFydClwYXJlbnQpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCQotCQlFT2JqZWN0IGNvbnRhaW5lckNvbnRleHQgPSBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KGNvbnRhaW5lcik7Ci0JCXdoaWxlICggZWRpdFBhcnRzLmhhc05leHQoKSApIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBlcCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnRzLm5leHQoKTsKLQkJCWlmICggZXAgaW5zdGFuY2VvZiBMYWJlbEVkaXRQYXJ0ICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlWaWV3IHZpZXcgPSAoVmlldyllcC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQkJaWYgKCB2aWV3ID09IG51bGwgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUVPYmplY3Qgc2VtYW50aWNDb250ZXh0ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCWlmKHNlbWFudGljQ29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQkKLQkJCSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkgICAgICAgICAgICAuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJIAotCQkJaWYgKCBzZW1hbnRpY0NvbnRleHQgPT0gbnVsbCApIHsKLQkJCQlBZGRDb21tYW5kIGFkZENvbW1hbmQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBuZXcgRU9iamVjdEFkYXB0ZXIoY29udGFpbmVyKSwKLQkJCQkJCSAgbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpKTsKLQkJCQljYy5jb21wb3NlKGFkZENvbW1hbmQpOwotCQkJfQotCQkJZWxzZSBpZiAoIGNvbnRhaW5lckNvbnRleHQgIT0gbnVsbCApIHsKLQkJCQlpZiAoY29udGFpbmVyQ29udGV4dC5lcXVhbHMoc2VtYW50aWNDb250ZXh0LmVDb250YWluZXIoKSkKLQkJCQkJCSYmIGZlYXR1cmUgPT0gc2VtYW50aWNDb250ZXh0LmVDb250YWlubWVudEZlYXR1cmUoKSkgewotCQkJCQljYy5jb21wb3NlKG5ldyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChyZXF1ZXN0LCBzZW1hbnRpY0NvbnRleHQpKTsKLQkJCQkJQWRkQ29tbWFuZCBhZGRDb21tYW5kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgbmV3IEVPYmplY3RBZGFwdGVyKGNvbnRhaW5lciksCi0JCQkJCQkJICBuZXcgRU9iamVjdEFkYXB0ZXIodmlldykpOwotCQkJCQljYy5jb21wb3NlKGFkZENvbW1hbmQpOwotCQkJCX0KLQkJCQllbHNlewotCQkJCQlDb21tYW5kIG1vdmVTZW1hbnRpY0NtZCA9Ci0JCQkJCSgoQWN0aXZpdHlFZGl0UGFydClwYXJlbnQpLmdldENvbW1hbmQoCi0JCQkJCQluZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcigKLQkJCQkJCQluZXcgTW92ZVJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgY29udGFpbmVyQ29udGV4dCwgCi0JCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Ob2RlKCksCi0JCQkJCQkJCQlzZW1hbnRpY0NvbnRleHQpKSk7Ci0JCQkJCWlmKG1vdmVTZW1hbnRpY0NtZCAgIT0gbnVsbCl7Ci0JCQkJCQljYy5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkobW92ZVNlbWFudGljQ21kKSk7Ci0JCQkJCX0KLS8vCQkJCQljYy5jb21wb3NlKG5ldyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChyZXF1ZXN0LCBzZW1hbnRpY0NvbnRleHQpKTsKLQkJCQkJLy9tb3ZlIG5vdGF0aW9uCi0JCQkJCUFkZENvbW1hbmQgYWRkQ29tbWFuZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG5ldyBFT2JqZWN0QWRhcHRlcihjb250YWluZXIpLAotCQkJCQkJCSAgbmV3IEVPYmplY3RBZGFwdGVyKHZpZXcpKTsKLQkJCQkJY2MuY29tcG9zZShhZGRDb21tYW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNjLmlzRW1wdHkoKSA/IG51bGwgOiBuZXcgSUNvbW1hbmRQcm94eShjYy5yZWR1Y2UoKSk7Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZCBleHRlbmRzIEVkaXRFbGVtZW50Q29tbWFuZHsKLQotCQlwcml2YXRlIGZpbmFsIEVPYmplY3QgbW92ZUVsZW1lbnQ7Ci0JCQotCQlwdWJsaWMgUmVwYXJlbnRpbmdFbGVtZW50c0NvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSwgRU9iamVjdCBlbGVtZW50KSB7Ci0JCQl0aGlzKERpYWdyYW1Db3JlUmVzb3VyY2VzLmRlbGV0ZUNvbW1hbmRfbGFiZWwsIGVsZW1lbnQsIHJlcSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBSZXBhcmVudGluZ0VsZW1lbnRzQ29tbWFuZChTdHJpbmcgbGFiZWwsIEVPYmplY3QgZWxlbWVudFRvRWRpdCwgCi0JCQkJSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQlzdXBlcihsYWJlbCwgZWxlbWVudFRvRWRpdCwgcmVxdWVzdCk7Ci0JCQl0aGlzLm1vdmVFbGVtZW50ID0gZWxlbWVudFRvRWRpdDsgCi0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldylnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWlmKG1vdmVFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCQkJKChBY3Rpdml0eU5vZGUpbW92ZUVsZW1lbnQpLmdldEluUGFydGl0aW9ucygpLnJlbW92ZSh2aWV3LmdldEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCQlpZihtb3ZlRWxlbWVudCAhPSBudWxsKSByZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0NvbnRyb2xGbG93SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODdlM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbEZsb3dJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTVmMDZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWUxNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0RlY2lzaW9uTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVjaXNpb25Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9EZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzM1MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRGVjaXNpb25Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRGVjaXNpb25Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vIGFsbG93IG1heGltdW0gb25seSBvbmUgaW5jb21pbmcgY29ubmVjdGlvbiB0byBkZWNpc2lvbiBub2RlIGZyb20gb3RoZXIgYWN0aXZpdHkgbm9kZQotCQkvLwotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgRGVjaXNpb25Ob2RlKSB7Ci0JCQlEZWNpc2lvbk5vZGUgZGVjaXNpb24gPSAoRGVjaXNpb25Ob2RlKSByZXEuZ2V0VGFyZ2V0KCk7CQkJCi0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogZGVjaXNpb24uZ2V0SW5jb21pbmdzKCkpIHsKLQkJCQlpZihsaW5rLmVDb250YWluZXIoKSAhPSBudWxsICYmIGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUluY29taW5nQ29tcGxldGUocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNWUxZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvRm9ya05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZvcmtOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcyBVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Gb3JrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRlYjZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0ZvcmtOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Gb3JrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxLmdldFRhcmdldCgpIGluc3RhbmNlb2YgRm9ya05vZGUpIHsKLQkJCUZvcmtOb2RlIGZvcmsgPSAoRm9ya05vZGUpIHJlcS5nZXRUYXJnZXQoKTsKLQkJCUxpc3QgbGlzdCA9IGZvcmsuZ2V0SW5jb21pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NTZkYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyNTM5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Jbml0aWFsTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0luaXRpYWxOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzAwZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Jbml0aWFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5nbWYuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLlVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5I2dldENyZWF0ZUluY29taW5nQ29tcGxldGUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUluY29taW5nQ29tcGxldGUoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKHJlcS5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIEluaXRpYWxOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlSW5jb21pbmdDb21wbGV0ZShyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjQ2NjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5YzY1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9Kb2luTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSm9pbk5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIFVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL0pvaW5Ob2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWQyZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvSm9pbk5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmdtZi5kaWFncmFtLmVkaXQucG9saWNpZXMuVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kjZ2V0Q3JlYXRlT3V0Z29pbmcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCS8vIFZhbGlkYXRpb24gSm9pbiBOb2RlIHNob3VsZCBhbGxvdyBvbmx5IG9uZSBvdXRnb2luZyBjb25uZWN0aW9uLgotCQlpZiAocmVxLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgSm9pbk5vZGUpIHsKLQkJCUpvaW5Ob2RlIGpvaW4gPSAoSm9pbk5vZGUpIHJlcS5nZXRTb3VyY2UoKTsKLQkJCUxpc3QgbGlzdCA9IGpvaW4uZ2V0T3V0Z29pbmdzKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID49IDEpIHsKLQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlT3V0Z29pbmcocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NjdlYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTlmODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvTWVyZ2VOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL01lcmdlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE4OTlhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9NZXJnZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmNvbW1hbmRzLkNvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVyZ2VOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZ21mLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSNnZXRDcmVhdGVPdXRnb2luZyhvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlT3V0Z29pbmcoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQotCQkvLyBWYWxpZGF0aW9uIG1lcmdlIG5vZGUgc2hvdWxkIGFsbG93IG9ubHkgb25lIG91dGdvaW5nIGNvbm5lY3Rpb24uCi0JCWlmIChyZXEuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBNZXJnZU5vZGUpIHsKLQkJCU1lcmdlTm9kZSBqb2luID0gKE1lcmdlTm9kZSkgcmVxLmdldFNvdXJjZSgpOwotCQkJTGlzdCBsaXN0ID0gam9pbi5nZXRPdXRnb2luZ3MoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdC5zaXplKCkgPj0gMSkgewotCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVPdXRnb2luZyhyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjNmMzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ1OTlkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUySXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzc4MTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJaWYgKHZpZXcuZ2V0RUFubm90YXRpb24oIlNob3J0Y3V0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXEuc2V0RWxlbWVudFRvRGVzdHJveSh2aWV3KTsKLQkJfQotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLS8vCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSkKLS8vCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IChBY3Rpdml0eU5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSAoQWN0aXZpdHlOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZV9FZGdlKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsCi0JCQkJc291cmNlLCB0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotLy8JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0vLwkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBDb250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0Nhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjgwZDNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0dyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjc4OGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzcwZTkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQuY29tbWFuZHMuQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbEZsb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJaWYgKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0vLwkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZChyZXEpCi0vLwkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKTsKLS8vCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoCi0JCQkJc291cmNlLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCksIHJlcQotCQkJCQkJLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghVU1MQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUNvbnRyb2xGbG93XzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdDb250cm9sRmxvd18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSAoQWN0aXZpdHlOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0ID0gKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfRWRnZSgpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLAotCQkJCXNvdXJjZSwgdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLS8vCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLS8vCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotLy8JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDE3NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTNjYjA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCVVNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2ZiOTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVycy5VTUxFbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotLy8JCWlmIChVTUxFbGVtZW50VHlwZXMuQ29udHJvbEZsb3dfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotLy8JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQocmVxKQotLy8JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0NvbnRyb2xGbG93XzMwMDFDb21tYW5kKHJlcSk7Ci0vLwkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKAotCQkJCXNvdXJjZSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpLCByZXEKLQkJCQkJCS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIVVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nQ29udHJvbEZsb3dfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlBY3Rpdml0eU5vZGUgc291cmNlID0gKEFjdGl2aXR5Tm9kZSkgc291cmNlRU9iamVjdDsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldCA9IChBY3Rpdml0eU5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgY29udGFpbmVyID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcigKLQkJCQlzb3VyY2UsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSwgcmVxCi0JCQkJCQkuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFVTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlX0VkZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93Q3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwKLQkJCQlzb3VyY2UsIHRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0vLwkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0vLwkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLS8vCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSkpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxCYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWRjZjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmN1c3RvbS5jb21tYW5kcy5DcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5jdXN0b20uY29tbWFuZHMuQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5Db250cm9sRmxvd1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LmhlbHBlcnMuVU1MQmFzZUVkaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWRpdEhlbHBlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkdldEVkaXRDb250ZXh0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMgU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEV4dGVuZGVkIHJlcXVlc3QgZGF0YSBrZXkgdG8gaG9sZCBlZGl0cGFydCB2aXN1YWwgaWQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU1VBTF9JRF9LRVkgPSAidmlzdWFsX2lkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkIHZpc3VhbCBpZCBvZiBlZGl0ZWQgZWRpdHBhcnQgdG8gZXh0ZW5kZWQgZGF0YSBvZiB0aGUgcmVxdWVzdCBzbwotCSAqIGNvbW1hbmQgc3dpdGNoIGNhbiBkZWNpZGUgd2hhdCBraW5kIG9mIGRpYWdyYW0gZWxlbWVudCBpcyBiZWluZyBlZGl0ZWQuCi0JICogSXQgaXMgZG9uZSBpbiB0aG9zZSBjYXNlcyB3aGVuIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRlZHVjZSBkaWFncmFtCi0JICogZWxlbWVudCBraW5kIGZyb20gZG9tYWluIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVjb25uZWN0UmVxdWVzdCkgewotCQkJT2JqZWN0IHZpZXcgPSAoKFJlY29ubmVjdFJlcXVlc3QpIHJlcXVlc3QpLmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCS5nZXRNb2RlbCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRCgoVmlldykgdmlldykpOwotCQkJCXJlcXVlc3QuZ2V0RXh0ZW5kZWREYXRhKCkucHV0KFZJU1VBTF9JRF9LRVksIGlkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZpc3VhbCBpZCBmcm9tIHJlcXVlc3QgcGFyYW1ldGVycy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRWaXN1YWxJRChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJT2JqZWN0IGlkID0gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoVklTVUFMX0lEX0tFWSk7Ci0JCXJldHVybiBpZCBpbnN0YW5jZW9mIEludGVnZXIgPyAoKEludGVnZXIpIGlkKS5pbnRWYWx1ZSgpIDogLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUVkaXRDb21tYW5kUmVxdWVzdCBjb21wbGV0ZWRSZXF1ZXN0ID0gY29tcGxldGVSZXF1ZXN0KHJlcXVlc3QpOwotCQlPYmplY3QgZWRpdEhlbHBlckNvbnRleHQgPSBjb21wbGV0ZWRSZXF1ZXN0LmdldEVkaXRIZWxwZXJDb250ZXh0KCk7Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIFZpZXcKLQkJCQl8fCAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBJRWRpdEhlbHBlckNvbnRleHQgJiYgKChJRWRpdEhlbHBlckNvbnRleHQpIGVkaXRIZWxwZXJDb250ZXh0KQotCQkJCQkJLmdldEVPYmplY3QoKSBpbnN0YW5jZW9mIFZpZXcpKSB7Ci0JCQkvLyBubyBzZW1hbnRpYyBjb21tYW5kcyBhcmUgcHJvdmlkZWQgZm9yIHB1cmUgZGVzaWduIGVsZW1lbnRzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgPT0gbnVsbCkgewotCQkJZWRpdEhlbHBlckNvbnRleHQgPSBWaWV3VXRpbAotCQkJCQkucmVzb2x2ZVNlbWFudGljRWxlbWVudCgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpOwotCQl9Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRFbGVtZW50VHlwZShlZGl0SGVscGVyQ29udGV4dCk7Ci0JCWlmIChlbGVtZW50VHlwZSA9PSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZSgKLQkJCQkib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5kZWZhdWx0IikpIHsgLy8kTk9OLU5MUy0xJCAKLQkJCWVsZW1lbnRUeXBlID0gbnVsbDsKLQkJfQotCQlDb21tYW5kIGVwQ29tbWFuZCA9IGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJaWYgKGVwQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZXBDb21tYW5kIGluc3RhbmNlb2YgSUNvbW1hbmRQcm94eSA/ICgoSUNvbW1hbmRQcm94eSkgZXBDb21tYW5kKQotCQkJCQkuZ2V0SUNvbW1hbmQoKQotCQkJCQk6IG5ldyBDb21tYW5kUHJveHkoZXBDb21tYW5kKTsKLQkJCWNvbXBsZXRlZFJlcXVlc3Quc2V0UGFyYW1ldGVyKAotCQkJCQlVTUxCYXNlRWRpdEhlbHBlci5FRElUX1BPTElDWV9DT01NQU5ELCBjb21tYW5kKTsKLQkJfQotCQlDb21tYW5kIGVoQ29tbWFuZCA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZWxlbWVudFR5cGUuZ2V0RWRpdENvbW1hbmQoY29tcGxldGVkUmVxdWVzdCk7Ci0JCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKSkgewotCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCQljb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkJbnVsbCkuY29tcG9zZShjb21tYW5kKTsKLQkJCQl9Ci0JCQkJZWhDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzaG91bGRQcm9jZWVkID0gdHJ1ZTsKLQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJc2hvdWxkUHJvY2VlZCA9IHNob3VsZFByb2NlZWQoKERlc3Ryb3lSZXF1ZXN0KSBjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJfQotCQlpZiAoc2hvdWxkUHJvY2VlZCkgewotCQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQlDb21tYW5kIGRlbGV0ZVZpZXdDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoCi0JCQkJCQluZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLCAoVmlldykgZ2V0SG9zdCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSk7Ci0JCQkJZWhDb21tYW5kID0gZWhDb21tYW5kID09IG51bGwgPyBkZWxldGVWaWV3Q29tbWFuZCA6IGVoQ29tbWFuZAotCQkJCQkJLmNoYWluKGRlbGV0ZVZpZXdDb21tYW5kKTsKLQkJCX0KLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVDb21tYW5kKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDb25maWd1cmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q29uZmlndXJlQ29tbWFuZCgoQ29uZmlndXJlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95RWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREdXBsaWNhdGVDb21tYW5kKChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgR2V0RWRpdENvbnRleHRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdENvbnRleHRDb21tYW5kKChHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgTW92ZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRNb3ZlQ29tbWFuZCgoTW92ZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgU2V0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFNldENvbW1hbmQoKFNldFJlcXVlc3QpIHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbmZpZ3VyZUNvbW1hbmQoQ29uZmlndXJlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZU91dGdvaW5nKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVJbmNvbWluZ0NvbXBsZXRlKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZXRDb21tYW5kKFNldFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRFZGl0Q29udGV4dENvbW1hbmQoR2V0RWRpdENvbnRleHRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ29tbWFuZChNb3ZlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJQ29udHJvbEZsb3dSZW9yaWVudENvbW1hbmQgY21kID0gbmV3IENvbnRyb2xGbG93UmVvcmllbnRDb21tYW5kKHJlcSk7Ci0JCQljbWQuc2V0SG9zdChnZXRIb3N0KCkpOwotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIoY21kKTsKLQkJfQotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TVNMV3JhcHBlcihJQ29tbWFuZCBjbWQpIHsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNtZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudCgpIHsKLQkJcmV0dXJuIFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG5ldyByZWxhdGlvbnNoaXAgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZ29lcyB1cCBieSBjb250YWlubWVudCBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbSB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBjb250YWluZXIgY2xhc3MuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihPYmplY3QgdWVsZW1lbnQsCi0JCQlFQ2xhc3MgY29udGFpbmVyQ2xhc3MsIElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCWlmICh1ZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSB1ZWxlbWVudDsKLQkJCWZvciAoOyBlbGVtZW50ICE9IG51bGw7IGVsZW1lbnQgPSBlbGVtZW50LmVDb250YWluZXIoKSkgewotCQkJCWlmIChjb250YWluZXJDbGFzcy5pc1N1cGVyVHlwZU9mKGVsZW1lbnQuZUNsYXNzKCkpKSB7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVkaXRpbmcgZG9tYWluIGZyb20gdGhlIGhvc3QgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmQgdG8gZGVzdHJveSB0aGUgbGluay4KLQkgKiAKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoVmlldyB2aWV3LCBib29sZWFuIGNvbmZpcm0pIHsKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKQotCQkJCS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KHZpZXcpOwotCi0JCS8vIHNvbWUgdmlld3MgYXJlIHN1cHByZXNzZWQgYW5kIG1pZ2h0IG5vdCBoYXZlIGEgZWRpdCBwYXJ0Ci0JCS8vCi0JCWlmKGVkaXRQYXJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoCi0JCQkJZ2V0RWRpdGluZ0RvbWFpbigpLCBjb25maXJtKTsKLQkJcmV0dXJuIGVkaXRQYXJ0LmdldENvbW1hbmQobmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIocmVxdWVzdCwKLQkJCQlDb2xsZWN0aW9ucy5FTVBUWV9NQVApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmRzIHRvIGRlc3Ryb3kgYWxsIGhvc3QgaW5jb21pbmcgYW5kIG91dGdvaW5nIGxpbmtzLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZENvbW1hbmQgZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChib29sZWFuIGNvbmZpcm0pIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbW1hbmQgZGVzdHJveUNtZCA9IGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRWRnZSkgaXQubmV4dCgpLCBjb25maXJtKTsKLQkJCWlmKGRlc3Ryb3lDbWQgIT0gbnVsbCkgewotCQkJCWNtZC5hZGQoZGVzdHJveUNtZCk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0VGFyZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kIGRlc3Ryb3lDbWQgPSBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSk7Ci0JCQlpZihkZXN0cm95Q21kICE9IG51bGwpIHsKLQkJCQljbWQuYWRkKGRlc3Ryb3lDbWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlua0NvbnN0cmFpbnRzIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUFBPU0lURV9FTkRfVkFSID0gIm9wcG9zaXRlRW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuQ3JlYXRlQ29udHJvbEZsb3dfMzAwMSgKLQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGNvbnRhaW5lciwgQWN0aXZpdHlOb2RlIHNvdXJjZSwKLQkJCQlBY3Rpdml0eU5vZGUgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gY2FuRXhpc3RDb250cm9sRmxvd18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeGlzdENvbnRyb2xGbG93XzMwMDEoCi0JCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBjb250YWluZXIsIEFjdGl2aXR5Tm9kZSBzb3VyY2UsCi0JCQkJQWN0aXZpdHlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoaWxkcmVuIHNob3VsZCBvdmVycmlkZSB0aGlzLCBmb3IgYW55IGV4dHJhIHZhbGlkYXRpb25zLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUluY29taW5nQ29tcGxldGUoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJQ29tbWFuZCBjb21tYW5kOwotCQlpZiAocmVxLmdldFNvdXJjZSgpID09IHJlcS5nZXRUYXJnZXQoKSkgewotCQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJfTsKLQkJfQotCi0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbikgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChpc0R1cGxpY2F0ZVJlbGF0aW9uc2hpcChyZXEuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJaWYgKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jYW5Db25uZWN0KChFZGl0UGFydCkgZ2V0SG9zdCgpLCByZXEKLQkJCQkuZ2V0U291cmNlKCksIHJlcS5nZXRUYXJnZXQoKSkgIT0gbnVsbCkKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfRWRnZSgpKTsKLQkJCX0KLQkJCWNvbW1hbmQgPSBnZXRNU0xXcmFwcGVyKG5ldyBDcmVhdGVJbmNvbWluZ0NvbnRyb2xGbG93Q29tbWFuZChyZXEsCi0JCQkJCWVsZW1lbnQuZUNvbnRhaW5lcigpKSk7Ci0KLQkJCS8vIGlmIChyZXEuZ2V0VGFyZ2V0KCkgIT0gcmVxLmdldFNvdXJjZSgpKSB7Ci0JCQkvLyBjb21tYW5kID0gY29tbWFuZC5jaGFpbihuZXcgQ3JlYXRlUHJlZGVjZXNzb3JDb21tYW5kKHJlcSkpOwotCQkJLy8gfQotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgbGluayBiZXR3ZWVuIHR3byBlbmRzIGFscmVhZHkgZXhpc3RzLgotCSAqIAotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0R1cGxpY2F0ZVJlbGF0aW9uc2hpcChFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCB0YXJnZXQpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSBzb3VyY2UuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KSBjb250YWluZXI7Ci0JCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRFZGdlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgZWxlbWVudCA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmICgoZWxlbWVudC5nZXRTb3VyY2UoKSA9PSBzb3VyY2UpCi0JCQkJCQkmJiBlbGVtZW50LmdldFRhcmdldCgpID09IHRhcmdldCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZU91dGdvaW5nKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmICghKHJlcS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgIShlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSkgewotCQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJfTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJLy8gVE9ETzogY2hlY2sgdGhlIHNhbWUgdHlwZSwgZG9uJ3QgY3JlYXRlIGNvbm5lY3Rpb24uCi0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfRWRnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgQ3JlYXRlT3V0Z29pbmdDb250cm9sRmxvd0NvbW1hbmQocmVxKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1MGQyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeSBleHRlbmRzIFhZTGF5b3V0RWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMYXlvdXRFZGl0UG9saWN5IGdldFJlYWxMYXlvdXRFZGl0UG9saWN5KCkgewotCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWxMYXlvdXRFZGl0UG9saWN5KExheW91dEVkaXRQb2xpY3kgcmVhbExheW91dEVkaXRQb2xpY3kpIHsKLQkJdGhpcy5yZWFsTGF5b3V0RWRpdFBvbGljeSA9IHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V4dGVybmFsTGFiZWwoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBnZXRFeHRlcm5hbExhYmVscyhHcm91cFJlcXVlc3QgcmVxdWVzdCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcXVlc3QuZ2V0RWRpdFBhcnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGlzRXh0ZXJuYWxMYWJlbChlZGl0UGFydCkpIHsKLQkJCQkJZWRpdFBhcnRzLmFkZChlZGl0UGFydCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChSRVFfTU9WRV9DSElMRFJFTi5lcXVhbHMocmVxdWVzdC5nZXRUeXBlKCkpKSB7Ci0JCQlDaGFuZ2VCb3VuZHNSZXF1ZXN0IGNiUmVxdWVzdCA9IChDaGFuZ2VCb3VuZHNSZXF1ZXN0KSByZXF1ZXN0OwotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscyhjYlJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJTGlzdCBlZGl0UGFydHMgPSBjYlJlcXVlc3QuZ2V0RWRpdFBhcnRzKCk7Ci0JCQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQkJCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJCQkmJiBlZGl0UGFydHMuc2l6ZSgpID4gZXh0TGFiZWxzLnNpemUoKSkgewotCQkJCQlMaXN0IG90aGVyID0gbmV3IEFycmF5TGlzdChlZGl0UGFydHMpOwotCQkJCQlvdGhlci5yZW1vdmVBbGwoZXh0TGFiZWxzKTsKLQkJCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhvdGhlcik7Ci0JCQkJCWNtZCA9IHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfQotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZXh0TGFiZWxzKTsKLQkJCQlDb21tYW5kIGV4dExhYmVsc0NtZCA9IGdldE1vdmVDaGlsZHJlbkNvbW1hbmQocmVxdWVzdCk7Ci0JCQkJY2JSZXF1ZXN0LnNldEVkaXRQYXJ0cyhlZGl0UGFydHMpOwotCQkJCXJldHVybiBjbWQgPT0gbnVsbCA/IGV4dExhYmVsc0NtZCA6IGNtZC5jaGFpbihleHRMYWJlbHNDbWQpOwotCQkJfQotCQl9Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0KSB7Ci0JCQlMaXN0IGV4dExhYmVscyA9IGdldEV4dGVybmFsTGFiZWxzKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQkJaWYgKCFleHRMYWJlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5ID09IG51bGwgPyBudWxsIDogcmVhbExheW91dEVkaXRQb2xpY3kKLQkJCQkuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRDb25zdHJhaW50Rm9yKENoYW5nZUJvdW5kc1JlcXVlc3QgcmVxdWVzdCwKLQkJCUdyYXBoaWNhbEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldykgY2hpbGQKLQkJCQkuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpKQotCQkJCS5pbnRWYWx1ZSgpOwotCQlpbnQgZHkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJUmVjdGFuZ2xlIHIgPSBuZXcgUmVjdGFuZ2xlKGR4LCBkeSwgMCwgMCk7Ci0JCWNoaWxkLmdldEZpZ3VyZSgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocik7Ci0JCXIudHJhbnNsYXRlKHJlcXVlc3QuZ2V0TW92ZURlbHRhKCkpOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb1JlbGF0aXZlKHIpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsCi0JCQkJJiYgcmVhbExheW91dEVkaXRQb2xpY3kudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci51bmRlcnN0YW5kc1JlcXVlc3QocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVDaGlsZChFZGl0UGFydCBjaGlsZCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KEVkaXRQYXJ0IGhvc3QpIHsKLQkJc3VwZXIuc2V0SG9zdChob3N0KTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNldEhvc3QoaG9zdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5hY3RpdmF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmRlYWN0aXZhdGUoKTsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmRlYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0VGFyZ2V0RWRpdFBhcnQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVhbExheW91dEVkaXRQb2xpY3kuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGFyZ2V0RWRpdFBhcnQocmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1NvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1NvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlU291cmNlRmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVNvdXJjZUZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93VGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zaG93VGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZXJhc2VUYXJnZXRGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LmVyYXNlVGFyZ2V0RmVlZGJhY2socmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYmQ0OTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5lZGl0aGVscGVycy5DcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5jb21tYW5kcy5VTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIgcmVxdWVzdEFkYXB0ZXIgPSAoKENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHJlcXVlc3QpCi0JCQkJCS5nZXRDb25uZWN0aW9uVmlld0FuZEVsZW1lbnREZXNjcmlwdG9yKCkKLQkJCQkJLmdldENyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcigpOwotCQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHJlcXVlc3RBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbldpdGhSZW9yaWVudGVkVmlld0NvbXBsZXRlQ29tbWFuZCgKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUNvbW1hbmRQcm94eSBjID0gKElDb21tYW5kUHJveHkpIHN1cGVyCi0JCQkJLmdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQocmVxdWVzdCk7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSAoQ29tcG9zaXRlQ29tbWFuZCkgYy5nZXRJQ29tbWFuZCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlVTUxSZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCByY3ZDb21tYW5kID0gbmV3IFVNTFJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sIG51bGwpOwotCQlyY3ZDb21tYW5kLnNldEVkZ2VBZGFwdG9yKGdldFZpZXdBZGFwdGVyKCkpOwotCQljYy5jb21wb3NlKHJjdkNvbW1hbmQpOwotCQlyZXR1cm4gYzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxNjk0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxSZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuQ29ubmVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBDb25uZWN0aW9uRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFID0gRGlhZ3JhbVVJTWVzc2FnZXMuUHJvbXB0aW5nRGVsZXRlQWN0aW9uX0RlbGV0ZUZyb21EaWFncmFtRGlhbG9nX1RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19NRVNTQUdFID0gRGlhZ3JhbVVJTWVzc2FnZXMuUHJvbXB0aW5nRGVsZXRlQWN0aW9uX0RlbGV0ZUZyb21EaWFncmFtRGlhbG9nX01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwgPSBEaWFncmFtVUlNZXNzYWdlcy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZV9Eb05vdFByb21wdEFnYWluVG9nZ2xlX2xhYmVsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGdldERlbGV0ZUNvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJYm9vbGVhbiBpc0RlbGV0ZUZyb21LZXlCb2FyZCA9IGRlbGV0ZVJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLQkJaWYgKHNob3VsZERlbGV0ZVNlbWFudGljKCkpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxldGVTZW1hbnRpY0NvbW1hbmQoZGVsZXRlUmVxdWVzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlib29sZWFuIHByb2NlZWRUb0RlbGV0ZVZpZXcgPSB0cnVlOwotCQkJaWYgKGlzRGVsZXRlRnJvbUtleUJvYXJkKSB7Ci0JCQkJR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQgZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQgPSAoR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQpIGRlbGV0ZVJlcXVlc3Q7Ci0JCQkJaWYgKGdyb3VwUmVxdWVzdFZpYUtleWJvYXJkLmlzU2hvd0luZm9ybWF0aW9uRGlhbG9nKCkpIHsKLQkJCQkJcHJvY2VlZFRvRGVsZXRlVmlldyA9IHNob3dQcm9tcHQoKTsKLQkJCQkJZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuc2V0U2hvd0luZm9ybWF0aW9uRGlhbG9nKGZhbHNlKTsKLQkJCQkJaWYgKCEocHJvY2VlZFRvRGVsZXRlVmlldykpCi0JCQkJCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoZGVsZXRlUmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlU2VtYW50aWMoKSB7Ci0JCUFzc2VydC5pc1RydWUoZ2V0SG9zdCgpIGluc3RhbmNlb2YgQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQpOwotCQlBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCBjZXAgPSAoQWJzdHJhY3RDb25uZWN0aW9uRWRpdFBhcnQpIGdldEhvc3QoKTsKLQkJYm9vbGVhbiBpc0Nhbm9uaWNhbCA9IGZhbHNlOwotCQlpZiAoY2VwLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQlpc0Nhbm9uaWNhbCA9IElzQ2Fub25pY2FsKGNlcC5nZXRTb3VyY2UoKSk7Ci0JCWlmIChjZXAuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkKLQkJCXJldHVybiBpc0Nhbm9uaWNhbCA/IGlzQ2Fub25pY2FsIDogSXNDYW5vbmljYWwoY2VwLmdldFRhcmdldCgpKTsKLQkJcmV0dXJuIGlzQ2Fub25pY2FsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gSXNDYW5vbmljYWwoRWRpdFBhcnQgZXApIHsKLQkJRWRpdFBhcnQgcGFyZW50ID0gZXAuZ2V0UGFyZW50KCk7Ci0JCXJldHVybiBwYXJlbnQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCA/ICgoR3JhcGhpY2FsRWRpdFBhcnQpIHBhcmVudCkKLQkJCQkuaXNDYW5vbmljYWwoKQotCQkJCTogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVZpZXdDb21tYW5kKEdyb3VwUmVxdWVzdCBkZWxldGVSZXF1ZXN0KSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShuZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLAotCQkJCShWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEZWxldGVTZW1hbnRpY0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlciBzZW1SZXEgPSBuZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcigKLQkJCQluZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KGVkaXRpbmdEb21haW4sIGZhbHNlKSwgZGVsZXRlUmVxdWVzdAotCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpKTsKLQkJQ29tbWFuZCBzZW1hbnRpY0NtZCA9IGdldEhvc3QoKS5nZXRDb21tYW5kKHNlbVJlcSk7Ci0JCWlmIChzZW1hbnRpY0NtZCAhPSBudWxsICYmIHNlbWFudGljQ21kLmNhbkV4ZWN1dGUoKSkgewotCQkJQ29tcG91bmRDb21tYW5kIGNjID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQkJY2MuYWRkKHNlbWFudGljQ21kKTsKLQkJCXJldHVybiBjYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcm9tcHQoKSB7Ci0JCWJvb2xlYW4gcHJvbXB0ID0gKChJUHJlZmVyZW5jZVN0b3JlKSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpCi0JCQkJLmdldEJvb2xlYW4oSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChwcm9tcHQpCi0JCQlpZiAoc2hvd01lc3NhZ2VEaWFsb2coKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd01lc3NhZ2VEaWFsb2coKSB7Ci0JCU1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIGRpYWxvZyA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlCi0JCQkJLm9wZW5ZZXNOb1F1ZXN0aW9uKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksCi0JCQkJCQlERUxFVEVfRlJPTV9ESUFHUkFNX0RMR19USVRMRSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UsCi0JCQkJCQlERUxFVEVfRlJPTV9NT0RFTF9ETEdfVE9HR0xFX0xBQkVMLCBmYWxzZSwKLQkJCQkJCShJUHJlZmVyZW5jZVN0b3JlKSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpCi0JCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSwKLQkJCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX09OX0RFTF9GUk9NX0RJQUdSQU0pOwotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgR3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQpIHsKLQkJCXJldHVybiBnZXREZWxldGVDb21tYW5kKChHcm91cFJlcXVlc3QpIHJlcXVlc3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb21tYW5kKHJlcXVlc3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZWRpdC9wb2xpY2llcy9VTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmY2OGU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLkRyYWdFZGl0UGFydHNUcmFja2VyRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0JLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxUZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeCB7Ci0KLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwgNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlNb3ZlSGFuZGxlIG1vdmVIYW5kbGUgPQotCQkJbmV3IE1vdmVIYW5kbGUoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpOwotCQltb3ZlSGFuZGxlLnNldEJvcmRlcihudWxsKTsKLQkJbW92ZUhhbmRsZS5zZXREcmFnVHJhY2tlcihuZXcgRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeChnZXRIb3N0KCkpKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobW92ZUhhbmRsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9lZGl0L3BvbGljaWVzL1VNTFRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGJlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL2VkaXQvcG9saWNpZXMvVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotCS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25FZGl0UG9saWN5IHsKLQotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LCA1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9leHByZXNzaW9ucy9VTUxBYnN0cmFjdEV4cHJlc3Npb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9leHByZXNzaW9ucy9VTUxBYnN0cmFjdEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiMzljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvZXhwcmVzc2lvbnMvVU1MQWJzdHJhY3RFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5leHByZXNzaW9uczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FVHlwZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVTUxBYnN0cmFjdEV4cHJlc3Npb24gewotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERJU0FCTEVEX05PX0lNUExfRVhDRVBUSU9OX0xPRyA9IEJvb2xlYW4KLQkJCS52YWx1ZU9mKAotCQkJCQlQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKQotCQkJCQkJCSsgIi9kZWJ1Zy9kaXNhYmxlTm9FeHBySW1wbEV4Y2VwdGlvbkxvZyIpKQotCQkJLmJvb2xlYW5WYWx1ZSgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJvZHk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3NpZmllciBjb250ZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIGVudjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVU1MQWJzdHJhY3RFeHByZXNzaW9uKEVDbGFzc2lmaWVyIGNvbnRleHQpIHsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNTEFic3RyYWN0RXhwcmVzc2lvbihTdHJpbmcgYm9keSwgRUNsYXNzaWZpZXIgY29udGV4dCwgTWFwIGVudikgewotCQl0aGlzLmJvZHkgPSBib2R5OwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmVudiA9IGVudjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJU3RyaW5nIHBsdWdpbklEID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklEOwotCQl0aGlzLnN0YXR1cyA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIHBsdWdpbklELCAtMSwKLQkJCQkobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAiIiwgdGhyb3dhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXRoaXMuc3RhdHVzLmlzT0soKSkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkiRXhwcmVzc2lvbiBwcm9ibGVtOiIgKyBtZXNzYWdlICsgImJvZHk6IiArIGJvZHksIHRocm93YWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjb250ZXh0KSB7Ci0JCXJldHVybiBldmFsdWF0ZShjb250ZXh0LCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCWlmIChjb250ZXh0KCkuaXNJbnN0YW5jZShjb250ZXh0KSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZG9FdmFsdWF0ZShjb250ZXh0LCBlbnYpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoRElTQUJMRURfTk9fSU1QTF9FWENFUFRJT05fTE9HCi0JCQkJCQkmJiBlIGluc3RhbmNlb2YgTm9JbXBsRXhjZXB0aW9uKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFeHByZXNzaW9uIGV2YWx1YXRpb24gZmFpbHVyZTogIiArIGJvZHksIGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgYm9keSgpIHsKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3NpZmllciBjb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hcCBlbnZpcm9ubWVudCgpIHsKLQkJcmV0dXJuIGVudjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NpZ25UbyhFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRU9iamVjdCB0YXJnZXQpIHsKLQkJLy8JCW1vZGlmaWVkIHRvIGNvbW1lbnQgdGhpcyBvdXQKLQkJZXZhbHVhdGUodGFyZ2V0KTsKLQkJLy8JCXZhbHVlID0gKHZhbHVlICE9IG51bGwpID8gcGVyZm9ybUNhc3QodmFsdWUsIGZlYXR1cmUpIDogbnVsbDsKLQkJLy8JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCS8vCQkJQ29sbGVjdGlvbiBkZXN0Q29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB0YXJnZXQuZUdldChmZWF0dXJlKTsKLQkJLy8JCQlkZXN0Q29sbGVjdGlvbi5jbGVhcigpOwotCQkvLwkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJLy8JCQkJQ29sbGVjdGlvbiB2YWx1ZUNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdmFsdWU7Ci0JCS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2YWx1ZUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkvLwkJCQkJZGVzdENvbGxlY3Rpb24uYWRkKHBlcmZvcm1DYXN0KGl0Lm5leHQoKSwgZmVhdHVyZSkpOwotCQkvLwkJCQl9Ci0JCS8vCQkJfSBlbHNlIHsKLQkJLy8JCQkJZGVzdENvbGxlY3Rpb24uYWRkKHZhbHVlKTsKLQkJLy8JCQl9Ci0JCS8vCQkJcmV0dXJuOwotCQkvLwkJfQotCQkvLwkJdGFyZ2V0LmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHBlcmZvcm1DYXN0KE9iamVjdCB2YWx1ZSwgRVR5cGVkRWxlbWVudCB0YXJnZXRUeXBlKSB7Ci0JCWlmICh0YXJnZXRUeXBlLmdldEVUeXBlKCkgPT0gbnVsbAotCQkJCXx8IHRhcmdldFR5cGUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCUNsYXNzIHRhcmdldENsYXNzID0gdGFyZ2V0VHlwZS5nZXRFVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCU51bWJlciBudW0gPSAoTnVtYmVyKSB2YWx1ZTsKLQkJCUNsYXNzIHZhbENsYXNzID0gdmFsdWUuZ2V0Q2xhc3MoKTsKLQkJCUNsYXNzIHRhcmdldFdyYXBwZXJDbGFzcyA9IHRhcmdldENsYXNzOwotCQkJaWYgKHRhcmdldENsYXNzLmlzUHJpbWl0aXZlKCkpIHsKLQkJCQl0YXJnZXRXcmFwcGVyQ2xhc3MgPSBFY29yZVV0aWwud3JhcHBlckNsYXNzRm9yKHRhcmdldENsYXNzKTsKLQkJCX0KLQkJCWlmICh2YWxDbGFzcy5lcXVhbHModGFyZ2V0V3JhcHBlckNsYXNzKSkgewotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJCWlmIChOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0YXJnZXRXcmFwcGVyQ2xhc3MpKSB7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoQnl0ZS5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgQnl0ZShudW0uYnl0ZVZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEludGVnZXIuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIobnVtLmludFZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKFNob3J0LmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBTaG9ydChudW0uc2hvcnRWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhMb25nLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBMb25nKG51bS5sb25nVmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoQmlnSW50ZWdlci5jbGFzcykpCi0JCQkJCXJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YobnVtLmxvbmdWYWx1ZSgpKTsKLQkJCQlpZiAodGFyZ2V0V3JhcHBlckNsYXNzLmVxdWFscyhGbG9hdC5jbGFzcykpCi0JCQkJCXJldHVybiBuZXcgRmxvYXQobnVtLmZsb2F0VmFsdWUoKSk7Ci0JCQkJaWYgKHRhcmdldFdyYXBwZXJDbGFzcy5lcXVhbHMoRG91YmxlLmNsYXNzKSkKLQkJCQkJcmV0dXJuIG5ldyBEb3VibGUobnVtLmRvdWJsZVZhbHVlKCkpOwotCQkJCWlmICh0YXJnZXRXcmFwcGVyQ2xhc3MuZXF1YWxzKEJpZ0RlY2ltYWwuY2xhc3MpKQotCQkJCQlyZXR1cm4gbmV3IEJpZ0RlY2ltYWwobnVtLmRvdWJsZVZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVTUxBYnN0cmFjdEV4cHJlc3Npb24gY3JlYXRlTnVsbEV4cHJlc3Npb24oCi0JCQlFQ2xhc3NpZmllciBjb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKGNvbnRleHQpIHsKLQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCS8vIFRPRE8gLSBsb2cgZW50cnkgYWJvdXQgbm90IHByb3ZpZGVyIGF2YWlsYWJsZSBmb3IgdGhpcyBleHByZXNzaW9uCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9JbXBsRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTm9JbXBsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlzdXBlcihtZXNzYWdlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTJjZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvQWN0aXZpdHlEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzLlVNTEVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuQURESW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBtb2RpZmllZAotICogQGF1dGhvciBza2Fubm9vcgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlVTUxFZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCX0KLQkKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0vLwlwcm90ZWN0ZWQgUGFsZXR0ZVJvb3QgY3JlYXRlUGFsZXR0ZVJvb3QoUGFsZXR0ZVJvb3QgZXhpc3RpbmdQYWxldHRlUm9vdCkgewotLy8JCVBhbGV0dGVSb290IHJvb3QgPSBzdXBlci5jcmVhdGVQYWxldHRlUm9vdChleGlzdGluZ1BhbGV0dGVSb290KTsKLS8vCQluZXcgVU1MUGFsZXR0ZUZhY3RvcnkoKS5maWxsUGFsZXR0ZShyb290KTsKLS8vCQlyZXR1cm4gcm9vdDsKLS8vCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VzSGludChBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyB0eXBlKSB7Ci0vLwkJaWYgKHR5cGUgPT0gSVByb3BlcnR5U2hlZXRQYWdlLmNsYXNzKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudFByb3ZpZGVyIGdldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0vLwkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotLy8JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotLy8JCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLS8vCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotLy8JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotLy8JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCA/IGdldERvY3VtZW50UHJvdmlkZXIoKQotLy8JCQkJLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpIDogbnVsbDsKLS8vCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0vLwkJCXJldHVybiAoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0vLwkJfQotLy8JCXJldHVybiBzdXBlci5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCXJldHVybiBnZXREaWFncmFtTWFuYWdlcigpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotLy8JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLS8vCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLS8vCQkJc2V0RG9jdW1lbnRQcm92aWRlcihBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCkpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXN1cGVyLnNldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotLy8JCX0KLQkJc3VwZXIuc2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotLy8JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotLy8JCU1hcmtlck5hdmlnYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuZ290b01hcmtlcih0aGlzLCBtYXJrZXIpOwotLy8JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2F2ZUFzQWxsb3dlZCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotLy8JCXN1cGVyLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKQotCQlwZXJmb3JtU2F2ZUFzKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2F2ZUFzKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldEVkaXRvcklucHV0KCk7Ci0JCVNhdmVBc0RpYWxvZyBkaWFsb2cgPSBuZXcgU2F2ZUFzRGlhbG9nKHNoZWxsKTsKLQkJSUZpbGUgb3JpZ2luYWwgPSBpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQgPyAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KQotCQkJCS5nZXRGaWxlKCkKLQkJCQk6IG51bGw7Ci0JCWlmIChvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlkaWFsb2cuc2V0T3JpZ2luYWxGaWxlKG9yaWdpbmFsKTsKLQkJfQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJLy8gZWRpdG9yIGhhcyBiZWVuIHByb2dyYW1tYXRpY2FsbHkgY2xvc2VkIHdoaWxlIHRoZSBkaWFsb2cgd2FzIG9wZW4KLQkJCXJldHVybjsKLQkJfQotCQlpZiAocHJvdmlkZXIuaXNEZWxldGVkKGlucHV0KSAmJiBvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkiVGhlIG9yaWdpbmFsIGZpbGUgJyd7MH0nJyBoYXMgYmVlbiBkZWxldGVkLiIsIG9yaWdpbmFsCi0JCQkJCQkJLmdldE5hbWUoKSk7Ci0JCQlkaWFsb2cuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJfQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCWlmIChmaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoZmlsZVBhdGgpOwotCQlmaW5hbCBJRWRpdG9ySW5wdXQgbmV3SW5wdXQgPSBuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpOwotCQkvLyBDaGVjayBpZiB0aGUgZWRpdG9yIGlzIGFscmVhZHkgb3BlbgotCQlJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBtYXRjaGluZ1N0cmF0ZWd5ID0gZ2V0RWRpdG9yRGVzY3JpcHRvcigpCi0JCQkJLmdldEVkaXRvck1hdGNoaW5nU3RyYXRlZ3koKTsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG1hdGNoaW5nU3RyYXRlZ3kubWF0Y2hlcyhlZGl0b3JSZWZzW2ldLCBuZXdJbnB1dCkpIHsKLQkJCQlNZXNzYWdlRGlhbG9nCi0JCQkJCQkub3Blbldhcm5pbmcoc2hlbGwsICJQcm9ibGVtIER1cmluZyBTYXZlIEFzLi4uIiwKLQkJCQkJCQkJIlNhdmUgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gVGFyZ2V0IGZpbGUgaXMgYWxyZWFkeSBvcGVuIGluIGFub3RoZXIgZWRpdG9yLiIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXByb3ZpZGVyLmFib3V0VG9DaGFuZ2UobmV3SW5wdXQpOwotCQkJZ2V0RG9jdW1lbnRQcm92aWRlcihuZXdJbnB1dCkuc2F2ZURvY3VtZW50KHByb2dyZXNzTW9uaXRvciwKLQkJCQkJbmV3SW5wdXQsCi0JCQkJCWdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSwgdHJ1ZSk7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHguZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5DQU5DRUwpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsICJTYXZlIFByb2JsZW1zIiwKLQkJCQkJCSJDb3VsZCBub3Qgc2F2ZSBmaWxlLiIsIHguZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJcHJvdmlkZXIuY2hhbmdlZChuZXdJbnB1dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXNldElucHV0KG5ld0lucHV0KTsKLQkJCX0KLQkJfQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCghc3VjY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhFdmVudCBldmVudCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0KLQkJLy8gZG8gbm90aGluZyBpZiAwIG9yIG1vcmUgdGhhbiAxIGVkaXQgcGFydHMgYXJlIHNlbGVjdGVkCi0JCS8vCi0JCWlmIChlZGl0UGFydHMuc2l6ZSgpICE9IDEpCi0JCQlyZXR1cm47Ci0KLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMCk7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQlFT2JqZWN0IG1vZGVsID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBlZGl0b3JJbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGdldEVkaXRvcklucHV0KCk7Ci0JCURpYWdyYW1FZGl0b3JJbnB1dCBkSW5wdXQgPSBlZGl0b3JJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobW9kZWwpOwotCQkJT2JqZWN0IGUgPSBudWxsOwotCQkJLy8gVE9ETzogaGFuZGxlIFdyYXBwZXIgY2hhbmdlIGJlbG93IGxpbmUgYWZ0ZXIgd3JhcHBlciBpbXBsZW1lbnQKLQkJCWUgPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSBtb2RlbCk7Ci0JCQl9Ci0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJLy8JCQkJSUVkaXRvclBhcnQgcGFyZW50ID0gZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJCWUsIGRJbnB1dC5nZXRTdXBwcmVzc2lvbigpLAotCQkJCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtRWRpdG9yKGdldFNpdGUoKS5nZXRQYWdlKCksIGlucHV0LAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQl9Ci0JCX0KLQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJSUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5PUEVOX0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRWRpdFBhcnQgc2VsZWN0ZWRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRHcmFwaGljYWxWaWV3ZXIoKQotCQkJCQkJCS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLmdldCgwKTsKLQkJCQkJLy8JCQkJCUlFZGl0b3JQYXJ0IHBhcmVudCA9IGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCWlmIChzZWxlY3RlZFBhcnQgIT0gbnVsbCkgewotCQkJCQkJTm9kZSB2aWV3ID0gKE5vZGUpIHNlbGVjdGVkUGFydC5nZXRNb2RlbCgpOwotCQkJCQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1FZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkJLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQotCQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih2aWV3Ci0JCQkJCQkJCS5nZXRFbGVtZW50KCkpOwotCQkJCQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCXNlbGVjdGVkT2JqZWN0ID0gYWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBJRWRpdG9yUGFydCBwYXJlbnQgPQotCQkJCQkJLy8gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLQkJCQkJCQkJc2VsZWN0ZWRPYmplY3QsCi0JCQkJCQkJCWRpYWdyYW1BZGFwdGVyLmdldFN1cHByZXNzaW9uKCksCi0JCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0JCQkJCQlEaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkub3BlbkRpYWdyYW1FZGl0b3IoCi0JCQkJCQkJCQkJZ2V0U2l0ZSgpLmdldFBhZ2UoKSwKLQkJCQkJCQkJCQlpbnB1dCwKLQkJCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5ULAotCQkJCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgIT0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCVZpZXcgbm9kZSA9IChWaWV3KSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCWlmIChub2RlICE9IG51bGwKLQkJCQkJCSYmIG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkJCSYmIG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgewotCQkJCQlpZiAoZW5hYmxlQURETWVudShub2RlLmdldEVsZW1lbnQoKSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBRERJbWFnZXMuSU1HX0RFU0NfRURJVE9SKTsKLQkJYWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEFEREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19FRElUT1IpOwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuY2xlYXIoKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9QQVJUSVRJT04sCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEFjdGl2aXR5UGFydGl0aW9uKCksCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSkpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1NUQVJUX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCAvLyROT04tTkxTLTEkCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEluaXRpYWxOb2RlKCksIFVNTEVsZW1lbnRUeXBlcy5Jbml0aWFsTm9kZV8xMDA0KSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX0ZPUktfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEZvcmtOb2RlKCksIFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSk9JTl9OT0RFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Sm9pbk5vZGUoKSwgVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfREVDSVNJT05fTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlY2lzaW9uTm9kZSgpLCBVTUxFbGVtZW50VHlwZXMuRGVjaXNpb25Ob2RlXzEwMDUpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX01FUkdFX05PREUsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVjaXNpb25Ob2RlKCksIFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMikpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9FTkRfTk9ERSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfQUNUSVZJVFksCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNykpOyAvLyROT04tTkxTLTEkCi0KLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCi0JCWVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsCi0JCQkJZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSVRFUkFUSU9OLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9JdGVyYXRpb25fdG9vbHRpcCwKLQkJCQlVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJCQlVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCk7Ci0JCWFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BIQVNFLAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IobnVsbCwKLQkJCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQotCQllbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50VHlwZT4oKTsKLQkJZWxlbWVudFR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkpOwotCQlhY3Rpb24gPSBjcmVhdGVBbkFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwKLQkJCQllbGVtZW50VHlwZXMsIC8vJE5PTi1OTFMtMSQKLQkJCQlEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9UQVNLX0RFU0NSSVBUT1IsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQkJZWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWVsZW1lbnRUeXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJYWN0aW9uID0gY3JlYXRlQW5BY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90ZXh0LAotCQkJCWVsZW1lbnRUeXBlcywgLy8kTk9OLU5MUy0xJAotCQkJCURpYWdyYW1Db25zdGFudHMuQ1JFQVRFX01JTEVTVE9ORSwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3Rvb2x0aXAsCi0JCQkJVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVBRERNZW51KEVPYmplY3QgZWxlbWVudCkgewotCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJLmdldE5vZGVBZGFwdGVyKChBY3Rpdml0eU5vZGUpIGVsZW1lbnQpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCWlmIChzZWxlY3RlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQkJc2VsZWN0ZWRPYmplY3QgPSBhZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCX0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsKLQkJCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQl9IGVsc2UgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJYWN0aXZpdHkgPSAoQWN0aXZpdHkpICgoQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZE9iamVjdCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJd2hpbGUgKCFhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKS5lcXVhbHMoCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5OQSkpIHsKLQotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlsaXN0LmFkZEFsbChhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQotCQkJCWlmICgodmUgIT0gbnVsbCkgJiYgKHZlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSB2ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvL0NvbGxlY3QgdGhlIGJyZWFrZG93biBlbGVtZW50cyB0byB2ZXJpZnkgdGFza2Rlc2NyaXB0b3JzIGFyZQotCQkJLy8gbm90LgotCQkJbGlzdC5hZGRBbGwoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKGFjdGl2aXR5LAotCQkJCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0pOwotCi0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsCi0JCQkJCSYmIHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBJdGVyYXRlIHRocm91Z2ggdGhlIExpc3QsIHRvIGZpbmQgdGFza2Rlc2NyaXB0b3IgYW5kIGhhcwotCQkJCS8vIHByaW1hcnkgcm9sZSB3aXRoaW4gY3VycmVudCBjb25maWd1cmF0aW9uLgotCQkJCS8vIHRoZW4gZW5hYmxlIHRoZSBhY3Rpb24uCi0JCQkJRGlhZ3JhbUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCS5nZXREaWFncmFtQWRhcHRlcihnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpKTsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IGRpYWdyYW1BZGFwdGVyLmdldFN1cHByZXNzaW9uKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChvYmopKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQlPYmplY3QgZSA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJCQlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbAotCQkJCQkJCQkmJiBkaWFncmFtQWRhcHRlci5nZXRTdXBwcmVzc2lvbigpCi0JCQkJCQkJCQkJLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQkJYWRkVG9NZW51KG1lbnUsIERpYWdyYW1Db25zdGFudHMuT1BFTl9BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwKLQkJCQlHRUZBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TLCB0cnVlLCB0cnVlKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG1lbnUuZmluZChBY3Rpb25JZHMuTUVOVV9ESUFHUkFNX0FERCk7Ci0JCWlmIChpdGVtICE9IG51bGwgJiYgaXRlbSBpbnN0YW5jZW9mIElNZW51TWFuYWdlcikgewotCQkJSU1lbnVNYW5hZ2VyIGFkZE1lbnUgPSAoSU1lbnVNYW5hZ2VyKSBpdGVtOwotCQkJU3RyaW5nIGdyb3VwTmFtZSA9IERpYWdyYW1Db25zdGFudHMuRElBR1JBTV9BRERfTUVOVV9HRU5FUkFMX0dST1VQOwotCQkJaWYgKGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCkuc2l6ZSgpID09IDApIHsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgbnVsbCwgZ3JvdXBOYW1lLCB0cnVlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfUEFSVElUSU9OLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1NUQVJUX05PREUsCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfRU5EX05PREUsIGdyb3VwTmFtZSwKLQkJCQkJCWZhbHNlLCB0cnVlKTsJCQotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9GT1JLX05PREUsCi0JCQkJCQlncm91cE5hbWUsIGZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSk9JTl9OT0RFLCAKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9ERUNJU0lPTl9OT0RFLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX01FUkdFX05PREUsCi0JCQkJCQlncm91cE5hbWUsIHRydWUsIHRydWUpOwkKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfQUNUSVZJVFksIGdyb3VwTmFtZSwKLQkJCQkJCWZhbHNlLCB0cnVlKTsKLQkJCQlhZGRUb01lbnUoYWRkTWVudSwgRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfSVRFUkFUSU9OLAotCQkJCQkJZ3JvdXBOYW1lLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX1BIQVNFLCBncm91cE5hbWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIERpYWdyYW1Db25zdGFudHMuQ1JFQVRFX01JTEVTVE9ORSwKLQkJCQkJCWdyb3VwTmFtZSwgZmFsc2UsIHRydWUpOwotCQkJCWFkZFRvTWVudShhZGRNZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9UQVNLX0RFU0NSSVBUT1IsCi0JCQkJCQlncm91cE5hbWUsIHRydWUsIHRydWUpOwotCQkJCQotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU5hbWUoKEFjdGl2aXR5KSBlKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldFBhcnRJbWFnZSgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJmdWxsL2V0b29sMTYvQURFZGl0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoQWN0aXZpdHkgYWN0KSB7Ci0JCWlmIChhY3QgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChhY3QgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4OyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoYWN0IGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0OyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVkZ2UgZm9yIEFEIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVkZ2UgY3JlYXRlRWRnZShOb2RlIHNvdXJjZU5vZGUsIE5vZGUgdGFyZ2V0Tm9kZSwKLQkJCUFjdGl2aXR5RWRnZSBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgQ29udHJvbEZsb3cpIHsKLQkJCUVkZ2UgZWRnZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZUVkZ2Uoc291cmNlTm9kZSwgdGFyZ2V0Tm9kZSwgYWN0RWRnZSwKLQkJCQkJbmV3IEludGVnZXIoQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBhY3RFZGdlLCBuZXcgSW50ZWdlcigKLQkJCQkJQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCXJldHVybiBlZGdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCBnZXRDcmVhdGVDb250cm9sRmxvd1JlcXVlc3QoKSB7Ci0JCUxpc3Q8SUVsZW1lbnRUeXBlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJRWxlbWVudFR5cGU+KCk7Ci0JCWxpc3QuYWRkKFVNTEVsZW1lbnRUeXBlcy5Db250cm9sRmxvd18zMDAxKTsKLQkJQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgY29ubmVjdGlvblJlcXVlc3QgPSBuZXcgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QoCi0JCQkJbGlzdCwgZmFsc2UsCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCXJldHVybiBjb25uZWN0aW9uUmVxdWVzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDc5OTc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L0FjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnByb3ZpZGVyLkVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlEaWFncmFtUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5lZGl0LnByb3ZpZGVycy5VTUxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbiBleHRlbmRzIEFjdGl2aXR5RGlhZ3JhbVBsdWdpbiB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQcmVmZXJlbmNlc0hpbnQgRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UID0gbmV3IFByZWZlcmVuY2VzSGludCgKLQkJCUlEKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4gaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVU1MRG9jdW1lbnRQcm92aWRlciBteURvY3VtZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJUHJlZmVyZW5jZXNIaW50LnJlZ2lzdGVyUHJlZmVyZW5jZVN0b3JlKERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoZmFjdG9yaWVzKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoTGlzdCBmYWN0b3JpZXMpIHsKLQkJZmFjdG9yaWVzLmFkZChuZXcgVU1MSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IEVjb3JlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEl0ZW1JbWFnZURlc2NyaXB0b3IoT2JqZWN0IGl0ZW0pIHsKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChpdGVtLCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQlsYWJlbFByb3ZpZGVyLmdldEltYWdlKGl0ZW0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSUQsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJlc3BlY3RzIGltYWdlcyByZXNpZGluZyBpbiBhbnkgcGx1Zy1pbi4gSWYgcGF0aCBpcyByZWxhdGl2ZSwKLQkgKiB0aGVuIHRoaXMgYnVuZGxlIGlzIGxvb2tlZCB1cCBmb3IgdGhlIGltYWdlLCBvdGhlcndpc2UsIGZvciBhYnNvbHV0ZSAKLQkgKiBwYXRoLCBmaXJzdCBzZWdtZW50IGlzIHRha2VuIGFzIGlkIG9mIHBsdWctaW4gd2l0aCBpbWFnZQotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGltYWdlLCBlaXRoZXIgYWJzb2x1dGUgKHdpdGggcGx1Zy1pbiBpZCBhcyBmaXJzdCBzZWdtZW50KSwgb3IgcmVsYXRpdmUgZm9yIGJ1bmRsZWQgaW1hZ2VzCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGZpbmRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJZmluYWwgSVBhdGggcCA9IG5ldyBQYXRoKHBhdGgpOwotCQlpZiAocC5pc0Fic29sdXRlKCkgJiYgcC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4ocC5zZWdtZW50KDApLCBwCi0JCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3RyaW5nIGZyb20gcGx1Zy1pbidzIHJlc291cmNlIGJ1bmRsZQotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCksICIlIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqIENsaWVudCBkbyBub3QgbmVlZCB0byBkaXNwb3NlIHRoaXMgaW1hZ2UuIEltYWdlcyB3aWxsIGJlIGRpc3Bvc2VkIGF1dG9tYXRpY2FsbHkuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGgKLQkgKiBAcmV0dXJuIGltYWdlIGluc3RhbmNlCi0JICovCi0JcHVibGljIEltYWdlIGdldEJ1bmRsZWRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHBhdGgsIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocGF0aCkpOwotCQkJaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNTERvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcigpIHsKLQkJaWYgKG15RG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteURvY3VtZW50UHJvdmlkZXIgPSBuZXcgVU1MRG9jdW1lbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBteURvY3VtZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvcikgewotCQlsb2dFcnJvcihlcnJvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChlcnJvciA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQllcnJvciA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVN0YXR1cy5PSywgZXJyb3IsIHRocm93YWJsZSkpOwotCQlkZWJ1ZyhlcnJvciwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dJbmZvKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJbWVzc2FnZSA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsKLQkJZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvTWVzc2FnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmRjMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJtZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxEb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTERvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlTmFtZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlU2VsZWN0aW9uVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsb3dzMUdyb3VwX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsb3dzMUdyb3VwX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9kZXMyR3JvdXBfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9kZXMyR3JvdXBfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sRmxvdzFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlQYXJ0aXRpb24xQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5UGFydGl0aW9uMUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0YXJ0Tm9kZTJDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhcnROb2RlMkNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcmtOb2RlM0NyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JrTm9kZTNDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXJnZU5vZGU0Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lcmdlTm9kZTRDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWNpc2lvbk5vZGU1Q3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlY2lzaW9uTm9kZTVDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmROb2RlNkNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmROb2RlNkNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Ob2RlN0NyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luTm9kZTdDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eTlDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHk5Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGhhc2UxMENyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQaGFzZTEwQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSXRlcmF0aW9uMTFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSXRlcmF0aW9uMTFDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tEZXNjcmlwdG9yMTJDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaWxlc3RvbmUxM0NyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaWxlc3RvbmUxM0NyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0X3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1hbmROYW1lX09wZW5EaWFncmFtOwotCi0JLy9UT0RPOiBwdXQgYWNjZXNzb3IgZmllbGRzIG1hbnVhbGx5CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjAyOWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIFdpemFyZCBwYWdlIHRoYXQgYWxsb3dzIHRvIHNlbGVjdCBlbGVtZW50IGZyb20gbW9kZWwuCi0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgbW9kZWxWZXdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RlbEVsZW1lbnQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxFbGVtZW50KEVPYmplY3QgbW9kZWxFbGVtZW50KSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbW9kZWxFbGVtZW50OwotCQlpZiAobW9kZWxWZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBwbGF0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBsYXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBsYXRlLnNldExheW91dChsYXlvdXQpOwotCQlzZXRDb250cm9sKHBsYXRlKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwbGF0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFNlbGVjdGlvblRpdGxlKCkpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCW1vZGVsVmV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwbGF0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJbW9kZWxWZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJbW9kZWxWZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJbW9kZWxWZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgewotCQkJbW9kZWxWZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQltb2RlbFZld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsKLQkJfQotCQltb2RlbFZld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLnRoaXMKLQkJCQkJCS51cGRhdGVTZWxlY3Rpb24oKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9KTsKLQotCQlzZXRQYWdlQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRvIHByb3ZpZGUgY3VzdG9tIG1vZGVsIGVsZW1lbnQgZGVzY3JpcHRpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAiU2VsZWN0IG1vZGVsIGVsZW1lbnQ6IjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQlpZiAoc2VsZWN0ZWRFbGVtZW50IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBGZWF0dXJlTWFwLkVudHJ5KSB7Ci0JCQkJc2VsZWN0ZWRFbGVtZW50ID0gKChGZWF0dXJlTWFwLkVudHJ5KSBzZWxlY3RlZEVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSAoRU9iamVjdCkgc2VsZWN0ZWRFbGVtZW50OwotCQkJfQotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBzcGVjaWZpYyB2YWxpZGF0aW9uIG9mIHRoZSBzZWxlY3RlZCBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM1MmJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvckNyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTENyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNTENyZWF0aW9uV2l6YXJkUGFnZSBkaWFncmFtTW9kZWxGaWxlUGFnZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRpYWdyYW07Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IHRydWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gd29ya2JlbmNoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgUmVzb3VyY2UgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSB7Ci0JCXJldHVybiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoCi0JCQlib29sZWFuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKSB7Ci0JCXRoaXMub3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlID0gbmV3IFVNTENyZWF0aW9uV2l6YXJkUGFnZSgKLQkJCQkiRGlhZ3JhbU1vZGVsRmlsZSIsIGdldFNlbGVjdGlvbigpLCAieG1pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5zZXRUaXRsZSgiQ3JlYXRlIEFEIERpYWdyYW0iKTsKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2UKLQkJCQkuc2V0RGVzY3JpcHRpb24oIlNlbGVjdCBmaWxlIHRoYXQgd2lsbCBjb250YWluIGRpYWdyYW0gYW5kIGRvbWFpbiBtb2RlbHMuIik7Ci0JCWFkZFBhZ2UoZGlhZ3JhbU1vZGVsRmlsZVBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKG51bGwpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJZGlhZ3JhbSA9IFVNTERpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5nZXRVUkkoKSwgbW9uaXRvcik7Ci0JCQkJaWYgKGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSAmJiBkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVNTERpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW0pOwotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJIkVycm9yIG9wZW5pbmcgZGlhZ3JhbSBlZGl0b3IiLCBudWxsLCBlCi0JCQkJCQkJCQkJLmdldFN0YXR1cygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkiQ3JlYXRpb24gUHJvYmxlbXMiLCBudWxsLCAoKENvcmVFeGNlcHRpb24pIGUKLQkJCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpKS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIkVycm9yIGNyZWF0aW5nIGRpYWdyYW0iLCBlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKCJOZXcgQUQgRGlhZ3JhbSIpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcigiaWNvbnMvd2l6YmFuL05ld1VNTFdpemFyZC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MQ3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNjNDk1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxDcmVhdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvcldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRXh0ZW5zaW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxDcmVhdGlvbldpemFyZFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLAotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgZmlsZUV4dGVuc2lvbikgewotCQlzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLQkJdGhpcy5maWxlRXh0ZW5zaW9uID0gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBjcmVhdGUgZmlsZXMgd2l0aCB0aGlzIGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBmaWxlRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGdldEZpbGVQYXRoKCkudG9TdHJpbmcoKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0RmlsZVBhdGgoKSB7Ci0JCUlQYXRoIHBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCXBhdGggPSBwYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCXNldEZpbGVOYW1lKFVNTERpYWdyYW1FZGl0b3JVdGlsLmdldFVuaXF1ZUZpbGVOYW1lKAotCQkJCWdldENvbnRhaW5lckZ1bGxQYXRoKCksIGdldEZpbGVOYW1lKCksIGdldEV4dGVuc2lvbigpKSk7Ci0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oKTsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsCi0JCQkJJiYgIWdldEZpbGVQYXRoKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiLiIgKyBleHRlbnNpb24pKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoCi0JCQkJCSJGaWxlIG5hbWUgc2hvdWxkIGhhdmUgJyd7MH0nJyBleHRlbnNpb24uIiwgZXh0ZW5zaW9uKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU5ODMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3IuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdG9ySWQoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3IuSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUVkaXRvclV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MzhjM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnV0aWwuRWRpdFVJVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVByaW1hcnlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FTUZDb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtRWRpdG9yVXRpbCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIG91clNhdmVPcHRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRTYXZlT3B0aW9ucygpIHsKLQkJaWYgKG91clNhdmVPcHRpb25zID09IG51bGwpIHsKLQkJCW91clNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCW91clNhdmVPcHRpb25zLnB1dChYTUlSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VELAotCQkJCQlSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRURfTUVNT1JZX0JVRkZFUik7Ci0JCX0KLQkJcmV0dXJuIG91clNhdmVPcHRpb25zOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3BlbkRpYWdyYW0oUmVzb3VyY2UgZGlhZ3JhbSkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBFZGl0VUlVdGlsLm9wZW5FZGl0b3IoKEVPYmplY3QpIGRpYWdyYW0uZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2hhcnNldChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJZmlsZS5zZXRDaGFyc2V0KCJVVEYtOCIsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGZpbGUgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVGaWxlTmFtZShJUGF0aCBjb250YWluZXJGdWxsUGF0aCwKLQkJCVN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlpZiAoY29udGFpbmVyRnVsbFBhdGggPT0gbnVsbCkgewotCQkJY29udGFpbmVyRnVsbFBhdGggPSBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZmlsZU5hbWUgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAhZXh0ZW5zaW9uLmVxdWFscyhmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJfQotCQlleHRlbnNpb24gPSBmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWZpbGVOYW1lID0gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWludCBpID0gMTsKLQkJd2hpbGUgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKGZpbGVQYXRoKSkgewotCQkJaSsrOwotCQkJZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUgKyBpKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlUGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHdpemFyZCBpbiBhIGRpYWxvZy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bldpemFyZChTaGVsbCBzaGVsbCwgV2l6YXJkIHdpemFyZCwgU3RyaW5nIHNldHRpbmdzS2V5KSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBwbHVnaW5EaWFsb2dTZXR0aW5ncyA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3aXphcmREaWFsb2dTZXR0aW5ncyA9IHBsdWdpbkRpYWxvZ1NldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQlpZiAod2l6YXJkRGlhbG9nU2V0dGluZ3MgPT0gbnVsbCkgewotCQkJd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbihzZXR0aW5nc0tleSk7Ci0JCX0KLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZERpYWxvZ1NldHRpbmdzKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZShNYXRoLm1heCg1MDAsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQk1MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2l0aGluIGEgd29ya3NwYWNlIG1vZGlmeSBvcGVyYXRpb24gc2luY2UgaXQgY3JlYXRlcyByZXNvdXJjZXMuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlRGlhZ3JhbShVUkkgZGlhZ3JhbVVSSSwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soCi0JCQkJTWVzc2FnZXMuVU1MRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzaywgMyk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5jcmVhdGVSZXNvdXJjZShkaWFncmFtVVJJKTsKLQkJZmluYWwgU3RyaW5nIGRpYWdyYW1OYW1lID0gZGlhZ3JhbVVSSS5sYXN0U2VnbWVudCgpOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLAotCQkJCU1lc3NhZ2VzLlVNTERpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCUFjdGl2aXR5IG1vZGVsID0gY3JlYXRlSW5pdGlhbE1vZGVsKCk7Ci0JCQkJYXR0YWNoTW9kZWxUb1Jlc291cmNlKG1vZGVsLCBkaWFncmFtUmVzb3VyY2UpOwotCi0JCQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwKLQkJCQkJCUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQkJZGlhZ3JhbS5zZXROYW1lKGRpYWdyYW1OYW1lKTsKLQkJCQkJZGlhZ3JhbS5zZXRFbGVtZW50KG1vZGVsKTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCi0JCQkJCWRpYWdyYW1SZXNvdXJjZQotCQkJCQkJCS5zYXZlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0KLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsKLQkJcmV0dXJuIGRpYWdyYW1SZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgZG9tYWluIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGNhbnZhcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBjcmVhdGVJbml0aWFsTW9kZWwoKSB7Ci0JCXJldHVybiBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIG1vZGVsIGVsZW1lbnQgaW4gdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXR0YWNoTW9kZWxUb1Jlc291cmNlKEFjdGl2aXR5IG1vZGVsLCBSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RFbGVtZW50c0luRGlhZ3JhbSgKLQkJCUlEaWFncmFtV29ya2JlbmNoUGFydCBkaWFncmFtUGFydCwgTGlzdC8qRWRpdFBhcnQqL2VkaXRQYXJ0cykgewotCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkuZGVzZWxlY3RBbGwoKTsKLQotCQlFZGl0UGFydCBmaXJzdFByaW1hcnkgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWRpdFBhcnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IG5leHRQYXJ0ID0gKEVkaXRQYXJ0KSBpdC5uZXh0KCk7Ci0JCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkuYXBwZW5kU2VsZWN0aW9uKG5leHRQYXJ0KTsKLQkJCWlmIChmaXJzdFByaW1hcnkgPT0gbnVsbCAmJiBuZXh0UGFydCBpbnN0YW5jZW9mIElQcmltYXJ5RWRpdFBhcnQpIHsKLQkJCQlmaXJzdFByaW1hcnkgPSBuZXh0UGFydDsKLQkJCX0KLQkJfQotCi0JCWlmICghZWRpdFBhcnRzLmlzRW1wdHkoKSkgewotCQkJZGlhZ3JhbVBhcnQuZ2V0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcigpLnJldmVhbCgKLQkJCQkJZmlyc3RQcmltYXJ5ICE9IG51bGwgPyBmaXJzdFByaW1hcnkgOiAoRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJCS5nZXQoMCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBmaW5kRWxlbWVudHNJbkRpYWdyYW1CeUlEKERpYWdyYW1FZGl0UGFydCBkaWFncmFtUGFydCwKLQkJCUVPYmplY3QgZWxlbWVudCwgTGlzdCBlZGl0UGFydENvbGxlY3RvcikgewotCQlJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGRpYWdyYW1QYXJ0Ci0JCQkJLmdldFZpZXdlcigpOwotCQlmaW5hbCBpbnQgaW50aWFsTnVtT2ZFZGl0UGFydHMgPSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCk7Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7IC8vIHN1cHBvcnQgbm90YXRpb24gZWxlbWVudCBsb29rdXAKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSB2aWV3ZXIuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQkJZWxlbWVudCk7Ci0JCQlpZiAoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChlZGl0UGFydCk7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudElEID0gRU1GQ29yZVV0aWwuZ2V0UHJveHlJRChlbGVtZW50KTsKLQkJTGlzdCBhc3NvY2lhdGVkUGFydHMgPSB2aWV3ZXIuZmluZEVkaXRQYXJ0c0ZvckVsZW1lbnQoZWxlbWVudElELAotCQkJCUlHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCS8vIHBlcmZvcm0gdGhlIHBvc3NpYmxlIGhpZXJhcmNoeSBkaXNqb2ludCAtPiB0YWtlIHRoZSB0b3AtbW9zdCBwYXJ0cyBvbmx5Ci0JCWZvciAoSXRlcmF0b3IgZWRpdFBhcnRJdCA9IGFzc29jaWF0ZWRQYXJ0cy5pdGVyYXRvcigpOyBlZGl0UGFydEl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IG5leHRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydEl0Lm5leHQoKTsKLQkJCUVkaXRQYXJ0IHBhcmVudFBhcnQgPSBuZXh0UGFydC5nZXRQYXJlbnQoKTsKLQkJCXdoaWxlIChwYXJlbnRQYXJ0ICE9IG51bGwgJiYgIWFzc29jaWF0ZWRQYXJ0cy5jb250YWlucyhwYXJlbnRQYXJ0KSkgewotCQkJCXBhcmVudFBhcnQgPSBwYXJlbnRQYXJ0LmdldFBhcmVudCgpOwotCQkJfQotCQkJaWYgKHBhcmVudFBhcnQgPT0gbnVsbCkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChuZXh0UGFydCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW50aWFsTnVtT2ZFZGl0UGFydHMgPT0gZWRpdFBhcnRDb2xsZWN0b3Iuc2l6ZSgpKSB7Ci0JCQlpZiAoIWFzc29jaWF0ZWRQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCQllZGl0UGFydENvbGxlY3Rvci5hZGQoYXNzb2NpYXRlZFBhcnRzLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGVsZW1lbnQuZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoZGlhZ3JhbVBhcnQsIGVsZW1lbnQKLQkJCQkJCQkuZUNvbnRhaW5lcigpLCBlZGl0UGFydENvbGxlY3Rvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkgLSBpbnRpYWxOdW1PZkVkaXRQYXJ0czsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWaWV3IGZpbmRWaWV3KERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQsCi0JCQlFT2JqZWN0IHRhcmdldEVsZW1lbnQsIExhenlFbGVtZW50MlZpZXdNYXAgbGF6eUVsZW1lbnQyVmlld01hcCkgewotCQlib29sZWFuIGhhc1N0cnVjdHVyYWxVUkkgPSBmYWxzZTsKLQkJaWYgKHRhcmdldEVsZW1lbnQuZVJlc291cmNlKCkgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJaGFzU3RydWN0dXJhbFVSSSA9ICgoWE1MUmVzb3VyY2UpIHRhcmdldEVsZW1lbnQuZVJlc291cmNlKCkpCi0JCQkJCS5nZXRJRCh0YXJnZXRFbGVtZW50KSA9PSBudWxsOwotCQl9Ci0KLQkJVmlldyB2aWV3ID0gbnVsbDsKLQkJaWYgKGhhc1N0cnVjdHVyYWxVUkkKLQkJCQkmJiAhbGF6eUVsZW1lbnQyVmlld01hcC5nZXRFbGVtZW50MlZpZXdNYXAoKS5pc0VtcHR5KCkpIHsKLQkJCXZpZXcgPSAoVmlldykgbGF6eUVsZW1lbnQyVmlld01hcC5nZXRFbGVtZW50MlZpZXdNYXAoKS5nZXQoCi0JCQkJCXRhcmdldEVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoZGlhZ3JhbUVkaXRQYXJ0LCB0YXJnZXRFbGVtZW50LAotCQkJCWxhenlFbGVtZW50MlZpZXdNYXAuZWRpdFBhcnRUbXBIb2xkZXIpID4gMCkgewotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIGxhenlFbGVtZW50MlZpZXdNYXAuZWRpdFBhcnRUbXBIb2xkZXIKLQkJCQkJLmdldCgwKTsKLQkJCWxhenlFbGVtZW50MlZpZXdNYXAuZWRpdFBhcnRUbXBIb2xkZXIuY2xlYXIoKTsKLQkJCXZpZXcgPSBlZGl0UGFydC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgVmlldyA/IChWaWV3KSBlZGl0UGFydAotCQkJCQkuZ2V0TW9kZWwoKSA6IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gKHZpZXcgPT0gbnVsbCkgPyBkaWFncmFtRWRpdFBhcnQuZ2V0RGlhZ3JhbVZpZXcoKSA6IHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGF6eUVsZW1lbnQyVmlld01hcCB7Ci0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE1hcCBlbGVtZW50MlZpZXdNYXA7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgVmlldyBzY29wZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBTZXQgZWxlbWVudFNldDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIExpc3QgZWRpdFBhcnRUbXBIb2xkZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYXp5RWxlbWVudDJWaWV3TWFwKFZpZXcgc2NvcGUsIFNldCBlbGVtZW50cykgewotCQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQkJdGhpcy5lbGVtZW50U2V0ID0gZWxlbWVudHM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIE1hcCBnZXRFbGVtZW50MlZpZXdNYXAoKSB7Ci0JCQlpZiAoZWxlbWVudDJWaWV3TWFwID09IG51bGwpIHsKLQkJCQllbGVtZW50MlZpZXdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCS8vIG1hcCBwb3NzaWJsZSBub3RhdGlvbiBlbGVtZW50cyB0byBpdHNlbGYgYXMgdGhlc2UgY2FuJ3QgYmUgZm91bmQgYnkgdmlldy5nZXRFbGVtZW50KCkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudFNldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmlldykgewotCQkJCQkJVmlldyB2aWV3ID0gKFZpZXcpIGVsZW1lbnQ7Ci0JCQkJCQlpZiAodmlldy5nZXREaWFncmFtKCkgPT0gc2NvcGUuZ2V0RGlhZ3JhbSgpKSB7Ci0JCQkJCQkJZWxlbWVudDJWaWV3TWFwLnB1dChlbGVtZW50LCBlbGVtZW50KTsgLy8gdGFrZSBvbmx5IHRob3NlIHRoYXQgcGFydCBvZiBvdXIgZGlhZ3JhbQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoc2NvcGUsIGVsZW1lbnQyVmlld01hcCwgZWxlbWVudFNldCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXN0YXRpYyBNYXAgYnVpbGRFbGVtZW50MlZpZXdNYXAoVmlldyBwYXJlbnRWaWV3LCBNYXAgZWxlbWVudDJWaWV3TWFwLAotCQkJCVNldCBlbGVtZW50cykgewotCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0KLQkJCWlmIChwYXJlbnRWaWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJCSYmICFlbGVtZW50MlZpZXdNYXAuY29udGFpbnNLZXkocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpCi0JCQkJCSYmIGVsZW1lbnRzLmNvbnRhaW5zKHBhcmVudFZpZXcuZ2V0RWxlbWVudCgpKSkgewotCQkJCWVsZW1lbnQyVmlld01hcC5wdXQocGFyZW50Vmlldy5nZXRFbGVtZW50KCksIHBhcmVudFZpZXcpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJfQotCX0gLy9MYXp5RWxlbWVudDJWaWV3TWFwCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxEaWFncmFtRmlsZUNyZWF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI0YTgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvckZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtRmlsZUNyZWF0b3IgZXh0ZW5kcyBJREVFZGl0b3JGaWxlQ3JlYXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVU1MRGlhZ3JhbUZpbGVDcmVhdG9yIElOU1RBTkNFID0gbmV3IFVNTERpYWdyYW1GaWxlQ3JlYXRvcigpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUZpbGVDcmVhdG9yIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gIi54bWkiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDJkYzliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMKLQkJRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCQkKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRGb250UHJlZmVyZW5jZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0TGluZVN0eWxlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJCi0JCS8vIHR1cm4gb2ZmIGNvbm5lY3Rpb24gaGFuZGxlcyB0byBzaG93IGJ5IGRlZmF1bHQKLQkJRGlhZ3JhbUNvcmVVdGlsLmhpZGVDb25uZWN0aW9uSGFuZGxlcyhnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQxZDdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTERvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5EZW11bHRpcGxleGluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwudXRpbC5EaWFncmFtSU9VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEaWFncmFtRG9jdW1lbnRQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCSYmIGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBjcmVhdGVEb2N1bWVudChlZGl0b3JJbnB1dCk7Ci0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBuZXcgUmVzb3VyY2VTZXRJbmZvKGRvY3VtZW50LCBlZGl0b3JJbnB1dCk7Ci0JCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJaW5mby5mU3RhdHVzID0gbnVsbDsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yLAotCQkJCQkJCQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0IiwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dCIgfSksCi0JCQkJCQkJbnVsbCkpOwotCQl9Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKTsKLQkJc2V0RG9jdW1lbnRDb250ZW50KGRvY3VtZW50LCAoSUVkaXRvcklucHV0KSBlbGVtZW50KTsKLQkJc2V0dXBEb2N1bWVudChlbGVtZW50LCBkb2N1bWVudCk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHVwIHRoZSBnaXZlbiBkb2N1bWVudCBhcyBpdCB3b3VsZCBiZSBwcm92aWRlZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoZQotCSAqIGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50IGlzIG5vdCBjaGFuZ2VkLiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCi0JICogU3ViY2xhc3NlcyBtYXkgcmVpbXBsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgdGhlIGJsdWUtcHJpbnQgZWxlbWVudAotCSAqIEBwYXJhbSBkb2N1bWVudCB0aGUgZG9jdW1lbnQgdG8gc2V0IHVwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyBmb3Igc3ViY2xhc3NlcwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZpbGUuZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCArPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ICs9IGZpbGUuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElEb2N1bWVudCBjcmVhdGVFbXB0eURvY3VtZW50KCkgewotCQlEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRGlhZ3JhbURvY3VtZW50KCk7Ci0JCWRvY3VtZW50LnNldEVkaXRpbmdEb21haW4oY3JlYXRlRWRpdGluZ0RvbWFpbigpKTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGNyZWF0ZUVkaXRpbmdEb21haW4oKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBEaWFncmFtRWRpdGluZ0RvbWFpbkZhY3RvcnkKLQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCWVkaXRpbmdEb21haW4uc2V0SUQoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkVkaXRpbmdEb21haW4iKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBOb3RpZmljYXRpb25GaWx0ZXIgZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIgPSBOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkuY3JlYXRlTm90aWZpZXJGaWx0ZXIoZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpKS5hbmQoCi0JCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkJLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcihOb3RpZmljYXRpb24uQUREKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoCi0JCQkJCQkJCVJlc291cmNlU2V0LmNsYXNzLAotCQkJCQkJCQlSZXNvdXJjZVNldC5SRVNPVVJDRV9TRVRfX1JFU09VUkNFUykpOwotCQllZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG5ldyBBZGFwdGVyKCkgewotCi0JCQlwcml2YXRlIE5vdGlmaWVyIG15VGFyZ2VyOwotCi0JCQlwdWJsaWMgTm90aWZpZXIgZ2V0VGFyZ2V0KCkgewotCQkJCXJldHVybiBteVRhcmdlcjsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQkJaWYgKGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCQlPYmplY3QgdmFsdWUgPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJCSgoUmVzb3VyY2UpIHZhbHVlKS5zZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQkJCW15VGFyZ2VyID0gbmV3VGFyZ2V0OwotCQkJfQotCi0JCX0pOwotCi0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJRWRpdG9ySW5wdXQgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkaWFncmFtRG9jdW1lbnQgPSAoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGRpYWdyYW1Eb2N1bWVudC5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJU3RvcmFnZSBzdG9yYWdlID0gKChGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKTsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IERpYWdyYW1JT1V0aWwubG9hZChkb21haW4sIHN0b3JhZ2UsIHRydWUsCi0JCQkJCWdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWRvY3VtZW50LnNldENvbnRlbnQoZGlhZ3JhbSk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlVUkkgdXJpID0gKChVUklFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0VVJJKCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UoCi0JCQkJCQl1cmkudHJpbUZyYWdtZW50KCksIGZhbHNlKTsKLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKAotCQkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSk7Ci0JCQkJfQotCQkJCWlmICghcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJTWFwIG9wdGlvbnMgPSBuZXcgSGFzaE1hcChHTUZSZXNvdXJjZUZhY3RvcnkKLQkJCQkJCQkJLmdldERlZmF1bHRMb2FkT3B0aW9ucygpKTsKLQkJCQkJCS8vIEBzZWUgMTcxMDYwIAotCQkJCQkJLy8gb3B0aW9ucy5wdXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3IpOwotCQkJCX0KLQkJCQlpZiAodXJpLmZyYWdtZW50KCkgIT0gbnVsbCkgewotCQkJCQlFT2JqZWN0IHJvb3RFbGVtZW50ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmkuZnJhZ21lbnQoKSk7Ci0JCQkJCWlmIChyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoKERpYWdyYW0pIHJvb3RFbGVtZW50KTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCByb290RWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmIChyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb3JlRXhjZXB0aW9uIHRocm93bkV4Y3AgPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQl0aHJvd25FeGNwID0gKENvcmVFeGNlcHRpb24pIGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJCQl0aHJvd25FeGNwID0gbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJbXNnICE9IG51bGwgPyBtc2cKLQkJCQkJCQkJCQkJOiBNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3IsCi0JCQkJCQkJCQllKSk7Ci0JCQkJfQotCQkJCXRocm93IHRocm93bkV4Y3A7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGlhZ3JhbURvY3VtZW50KGVsZW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpOwotCQkJaWYgKGRpYWdyYW1SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSk7Ci0JCQkJcmV0dXJuIGZpbGUgPT0gbnVsbCB8fCBmaWxlLmdldExvY2F0aW9uKCkgPT0gbnVsbAotCQkJCQkJfHwgIWZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5leGlzdHMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEZWxldGVkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvIGdldFJlc291cmNlU2V0SW5mbyhPYmplY3QgZWRpdG9ySW5wdXQpIHsKLQkJcmV0dXJuIChSZXNvdXJjZVNldEluZm8pIHN1cGVyLmdldEVsZW1lbnRJbmZvKGVkaXRvcklucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvIGluc3RhbmNlb2YgUmVzb3VyY2VTZXRJbmZvKSB7Ci0JCQlSZXNvdXJjZVNldEluZm8gcmVzb3VyY2VTZXRJbmZvID0gKFJlc291cmNlU2V0SW5mbykgaW5mbzsKLQkJCXJlc291cmNlU2V0SW5mby5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlU3RhdGUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb21wdXRhdGlvbkNvbnRleHQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzMlZhbGlkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJZmlsZXMyVmFsaWRhdGUuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoCi0JCQkJCShJRmlsZVtdKSBmaWxlczJWYWxpZGF0ZS50b0FycmF5KG5ldyBJRmlsZVtmaWxlczJWYWxpZGF0ZQotCQkJCQkJCS5zaXplKCldKSwgY29tcHV0YXRpb25Db250ZXh0KTsKLQkJfQotCi0JCXN1cGVyLmRvVmFsaWRhdGVTdGF0ZShlbGVtZW50LCBjb21wdXRhdGlvbkNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCU1lc3NhZ2VzLlVNTERvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNSZWFkT25seSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1JlYWRPbmx5KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCFpc1N0YXRlVmFsaWRhdGVkKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZSwgZXgpOwotCQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBpbmZvLmlzTW9kaWZpYWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc01vZGlmaWFibGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhY2hlKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzUmVhZE9ubHkoKSkgewotCQkJCQlpbmZvLnNldFJlYWRPbmx5KHRydWUpOwotCQkJCQlpbmZvLnNldE1vZGlmaWFibGUoZmFsc2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaW5mby5zZXRSZWFkT25seShmYWxzZSk7Ci0JCQlpbmZvLnNldE1vZGlmaWFibGUodHJ1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VcGRhdGVTdGF0ZUNhY2hlKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpbmZvLnNldFVwZGF0ZUNhY2hlKHRydWUpOwotCQl9Ci0JCXN1cGVyLmRvVXBkYXRlU3RhdGVDYWNoZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBpbmZvLmlzU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzU3luY2hyb25pemVkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFJlc2V0UnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkJCS5tb2RpZnlSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFNhdmVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKGNvbXB1dGVTY2hlZHVsaW5nUnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTeW5jaHJvbml6ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJCQkucmVmcmVzaFJ1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0VmFsaWRhdGVTdGF0ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlmaWxlcy5hZGQoZmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCS52YWxpZGF0ZUVkaXRSdWxlKAotCQkJCQkJCShJRmlsZVtdKSBmaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmaWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVNjaGVkdWxpbmdSdWxlIGNvbXB1dGVTY2hlZHVsaW5nUnVsZShJUmVzb3VyY2UgdG9DcmVhdGVPck1vZGlmeSkgewotCQlpZiAodG9DcmVhdGVPck1vZGlmeS5leGlzdHMoKSkKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKAotCQkJCQl0b0NyZWF0ZU9yTW9kaWZ5KTsKLQotCQlJUmVzb3VyY2UgcGFyZW50ID0gdG9DcmVhdGVPck1vZGlmeTsKLQkJZG8gewotCQkJLyoKLQkJCSAqIFhYWCBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02NzYwMQotCQkJICogSVJlc291cmNlUnVsZUZhY3RvcnkuY3JlYXRlUnVsZSBzaG91bGQgaXRlcmF0ZSB0aGUgaGllcmFyY2h5Ci0JCQkgKiBpdHNlbGYuCi0JCQkgKi8KLQkJCXRvQ3JlYXRlT3JNb2RpZnkgPSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5LmdldFBhcmVudCgpOwotCQl9IHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpKTsKLQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkuY3JlYXRlUnVsZSgKLQkJCQl0b0NyZWF0ZU9yTW9kaWZ5KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TeW5jaHJvbml6ZShPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKGluZm8sIG5leHRSZXNvdXJjZSwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZG9TeW5jaHJvbml6ZShlbGVtZW50LCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwKLQkJCUlEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmICghb3ZlcndyaXRlICYmICFpbmZvLmlzU3luY2hyb25pemVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3IsCi0JCQkJCQkJCW51bGwpKTsKLQkJCX0KLQkJCWluZm8uc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQlMaXN0IHJlc291cmNlcyA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2ssCi0JCQkJCQlyZXNvdXJjZXMuc2l6ZSgpICsgMSk7IC8vIlNhdmluZyBkaWFncmFtIgotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJbW9uaXRvci5zZXRUYXNrTmFtZShOTFMuYmluZCgKLQkJCQkJCQlNZXNzYWdlcy5VTUxEb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrLAotCQkJCQkJCW5leHRSZXNvdXJjZS5nZXRVUkkoKSkpOwotCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbmV4dFJlc291cmNlLnNhdmUoVU1MRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJCUVkaXRvclN0YXR1c0NvZGVzLlJFU09VUkNFX0ZBSUxVUkUsIGUKLQkJCQkJCQkJCQkJLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24geCkgewotCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJdGhyb3cgeDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5mby5zdGFydFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRWxlbWVudENoYW5nZWQoUmVzb3VyY2VTZXRJbmZvIGluZm8sCi0JCQlSZXNvdXJjZSBjaGFuZ2VkUmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoY2hhbmdlZFJlc291cmNlKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTWVzc2FnZXMuVU1MRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQsCi0JCQkJCQkJCWV4KTsKLQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLkZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZAotCQkJfQotCQl9Ci0JCWNoYW5nZWRSZXNvdXJjZS51bmxvYWQoKTsKLQotCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWluZm8uZlN0YXR1cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoaW5mby5mRG9jdW1lbnQsIGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJaW5mby5mU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlpZiAoIWluZm8uZkNhbkJlU2F2ZWQpIHsKLQkJCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJfQotCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSwgaW5mbyk7Ci0JCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGluZm8uZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUVsZW1lbnRNb3ZlZChJRWRpdG9ySW5wdXQgaW5wdXQsIFVSSSB1cmkpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZSBuZXdGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKAotCQkJCQluZXcgUGF0aChVUkkuZGVjb2RlKHVyaS5wYXRoKCkpKS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ld0ZpbGUgPT0gbnVsbCA/IG51bGwKLQkJCQkJOiBuZXcgRmlsZUVkaXRvcklucHV0KG5ld0ZpbGUpKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBUT0RPOiBhcHBlbmQgc3VmZml4IHRvIHRoZSBVUkkhICh1c2UgZGlhZ3JhbSBhcyBhIHBhcmFtZXRlcikKLQkJZmlyZUVsZW1lbnRNb3ZlZChpbnB1dCwgbmV3IFVSSUVkaXRvcklucHV0KHVyaSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUVkaXRvcklucHV0IGNyZWF0ZUlucHV0V2l0aEVkaXRpbmdEb21haW4oSUVkaXRvcklucHV0IGVkaXRvcklucHV0LAotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXJldHVybiBlZGl0b3JJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElEaWFncmFtRG9jdW1lbnQgZ2V0RGlhZ3JhbURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoSURpYWdyYW1Eb2N1bWVudCkgZG9jOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBnZXRPcGVyYXRpb25SdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VTZXRJbmZvIGV4dGVuZHMgRWxlbWVudEluZm8gewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGxvbmcgbXlNb2RpZmljYXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdvcmtzcGFjZVN5bmNocm9uaXplciBteVN5bmNocm9uaXplcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSURpYWdyYW1Eb2N1bWVudCBteURvY3VtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElFZGl0b3JJbnB1dCBteUVkaXRvcklucHV0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVcGRhdGVDYWNoZSA9IHRydWU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteU1vZGlmaWFibGUgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15UmVhZE9ubHkgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgbXlSZXNvdXJjZVNldExpc3RlbmVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvKElEaWFncmFtRG9jdW1lbnQgZG9jdW1lbnQsCi0JCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7Ci0JCQlzdXBlcihkb2N1bWVudCk7Ci0JCQlteURvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCQlteUVkaXRvcklucHV0ID0gZWRpdG9ySW5wdXQ7Ci0JCQlzdGFydFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlteVJlc291cmNlU2V0TGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkuYWRkKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25TdGFtcChsb25nIG1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQlteU1vZGlmaWNhdGlvblN0YW1wID0gbW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQkJcmV0dXJuIG15RG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIElFZGl0b3JJbnB1dCBnZXRFZGl0b3JJbnB1dCgpIHsKLQkJCXJldHVybiBteUVkaXRvcklucHV0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCWdldFJlc291cmNlU2V0KCkuZUFkYXB0ZXJzKCkucmVtb3ZlKG15UmVzb3VyY2VTZXRMaXN0ZW5lcik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5zaXplKCkgPT0gMDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVblN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJbXlVblN5bmNocm9uaXplZFJlc291cmNlcy5yZW1vdmUocmVzb3VyY2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBmaW5hbCB2b2lkIHN0b3BSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyLmRpc3Bvc2UoKTsKLQkJCW15U3luY2hyb25pemVyID0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdGFydFJlc291cmNlTGlzdGVuaW5nKCkgewotCQkJbXlTeW5jaHJvbml6ZXIgPSBuZXcgV29ya3NwYWNlU3luY2hyb25pemVyKG15RG9jdW1lbnQKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgbmV3IFN5bmNocm9uaXplckRlbGVnYXRlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlQ2FjaGUoKSB7Ci0JCQlyZXR1cm4gbXlVcGRhdGVDYWNoZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVDYWNoZShib29sZWFuIHVwZGF0ZSkgewotCQkJbXlVcGRhdGVDYWNoZSA9IHVwZGF0ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCQlyZXR1cm4gbXlNb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWFibGUoYm9vbGVhbiBtb2RpZmlhYmxlKSB7Ci0JCQlteU1vZGlmaWFibGUgPSBtb2RpZmlhYmxlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gbXlSZWFkT25seTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIHJlYWRPbmx5KSB7Ci0JCQlteVJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSBpbXBsZW1lbnRzCi0JCQkJV29ya3NwYWNlU3luY2hyb25pemVyLkRlbGVnYXRlIHsKLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZUNoYW5nZWQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMsIHJlc291cmNlLAotCQkJCQkJCQludWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VEZWxldGVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWZpcmVFbGVtZW50RGVsZXRlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlTW92ZWQoUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQkJCWZpbmFsIFVSSSBuZXdVUkkpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKFJlc291cmNlU2V0SW5mby50aGlzKSB7Ci0JCQkJCWlmIChSZXNvdXJjZVNldEluZm8udGhpcy5mQ2FuQmVTYXZlZCkgewotCQkJCQkJUmVzb3VyY2VTZXRJbmZvLnRoaXMuc2V0VW5TeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG15RG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpID09IHJlc291cmNlKSB7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaGFuZGxlRWxlbWVudE1vdmVkKFJlc291cmNlU2V0SW5mby50aGlzCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbmV3VVJJKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaGFuZGxlUmVzb3VyY2VEZWxldGVkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VTZXRNb2RpZmljYXRpb25MaXN0ZW5lciBleHRlbmRzIEVDb250ZW50QWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm90aWZpY2F0aW9uRmlsdGVyIG15TW9kaWZpZWRGaWx0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgUmVzb3VyY2VTZXRJbmZvIG15SW5mbzsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJCW15SW5mbyA9IGluZm87Ci0JCQlteU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUV2ZW50VHlwZUZpbHRlcigKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCkub3IoCi0JCQkJCU5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLlVOU0VUKSkuYW5kKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcihSZXNvdXJjZS5jbGFzcywKLQkJCQkJCQlSZXNvdXJjZS5SRVNPVVJDRV9fSVNfTU9ESUZJRUQpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlU2V0KSB7Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQkJfQotCQkJaWYgKCFub3RpZmljYXRpb24uaXNUb3VjaCgpCi0JCQkJCSYmIG15TW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7Ci0JCQkJaWYgKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IG15SW5mby5nZXRSZXNvdXJjZVNldCgpCi0JCQkJCQkJCS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCkKLQkJCQkJCQkJJiYgIW1vZGlmaWVkOykgewotCQkJCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCQltb2RpZmllZCA9IG5leHRSZXNvdXJjZS5pc01vZGlmaWVkKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYm9vbGVhbiBkaXJ0eVN0YXRlQ2hhbmdlZCA9IGZhbHNlOwotCQkJCQkJc3luY2hyb25pemVkIChteUluZm8pIHsKLQkJCQkJCQlpZiAobW9kaWZpZWQgIT0gbXlJbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQkJCW15SW5mby5mQ2FuQmVTYXZlZCA9IG1vZGlmaWVkOwotCQkJCQkJCQlkaXJ0eVN0YXRlQ2hhbmdlZCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCQkJCW15SW5mby5zZXRTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkaXJ0eVN0YXRlQ2hhbmdlZCkgewotCQkJCQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQobXlJbmZvCi0JCQkJCQkJCQkuZ2V0RWRpdG9ySW5wdXQoKSwgbW9kaWZpZWQpOwotCi0JCQkJCQkJaWYgKCFtb2RpZmllZCkgewotCQkJCQkJCQlteUluZm8KLQkJCQkJCQkJCQkuc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKG15SW5mbykpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTEluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk2MmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTEluaXREaWFncmFtRmlsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxJbml0RGlhZ3JhbUZpbGVBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVSSSBkb21haW5Nb2RlbFVSSTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRvbWFpbk1vZGVsVVJJID0gbnVsbDsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPT0gZmFsc2UKLQkJCQl8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZG9tYWluTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkKLQkJCQkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlFT2JqZWN0IGRpYWdyYW1Sb290ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZG9tYWluTW9kZWxVUkksIHRydWUpOwotCQkJZGlhZ3JhbVJvb3QgPSAoRU9iamVjdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBkb21haW5Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRpYWdyYW1Sb290ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJLm9wZW5FcnJvcigKLQkJCQkJCQlnZXRTaGVsbCgpLAotCQkJCQkJCU1lc3NhZ2VzLlVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGUsCi0JCQkJCQkJTWVzc2FnZXMuVU1MSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlXaXphcmQgd2l6YXJkID0gbmV3IFVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkKGRvbWFpbk1vZGVsVVJJLAotCQkJCWRpYWdyYW1Sb290LCBlZGl0aW5nRG9tYWluKTsKLQkJd2l6YXJkLnNldFdpbmRvd1RpdGxlKE5MUy5iaW5kKAotCQkJCU1lc3NhZ2VzLlVNTEluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZSwKLQkJCQlBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCVVNTERpYWdyYW1FZGl0b3JVdGlsLnJ1bldpemFyZChnZXRTaGVsbCgpLCB3aXphcmQsICJJbml0RGlhZ3JhbUZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTExvYWRSZXNvdXJjZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTG9hZFJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MjE5NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTG9hZFJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5hY3Rpb24uTG9hZFJlc291cmNlQWN0aW9uLkxvYWRSZXNvdXJjZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTExvYWRSZXNvdXJjZUFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBBY3Rpdml0eUVkaXRQYXJ0IG15U2VsZWN0ZWRFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgbXlTaGVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCW15U2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTG9hZFJlc291cmNlRGlhbG9nIGxvYWRSZXNvdXJjZURpYWxvZyA9IG5ldyBMb2FkUmVzb3VyY2VEaWFsb2cobXlTaGVsbCwKLQkJCQlteVNlbGVjdGVkRWxlbWVudC5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQlsb2FkUmVzb3VyY2VEaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpIHsKLQkJCQlteVNlbGVjdGVkRWxlbWVudCA9IChBY3Rpdml0eUVkaXRQYXJ0KSBzdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JCQkJCQkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQl9Ci0JCX0KLQkJYWN0aW9uLnNldEVuYWJsZWQoaXNFbmFibGVkKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gbXlTZWxlY3RlZEVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTE1hdGNoaW5nU3RyYXRlZ3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTE1hdGNoaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiODZjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTE1hdGNoaW5nU3RyYXRlZ3kgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dDsKLQkJdHJ5IHsKLQkJCWVkaXRvcklucHV0ID0gZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCk7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChlZGl0b3JJbnB1dC5lcXVhbHMoaW5wdXQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZWRpdG9ySW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dAotCQkJCSYmIGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiAoKFVSSUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0VVJJKCkuZXF1YWxzKAotCQkJCQkoKFVSSUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxOZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYyNTFiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxOZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gbXlFZGl0aW5nRG9tYWluOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxOZXdEaWFncmFtRmlsZVdpemFyZChVUkkgZG9tYWluTW9kZWxVUkksIEVPYmplY3QgZGlhZ3JhbVJvb3QsCi0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCWFzc2VydCBkb21haW5Nb2RlbFVSSSAhPSBudWxsIDogIkRvbWFpbiBtb2RlbCB1cmkgbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydCBkaWFncmFtUm9vdCAhPSBudWxsIDogIkRvYWdyYW0gcm9vdCBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnQgZWRpdGluZ0RvbWFpbiAhPSBudWxsIDogIkVkaXRpbmcgZG9tYWluIG11c3QgYmUgc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCi0JCW15RmlsZUNyZWF0aW9uUGFnZSA9IG5ldyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlKAotCQkJCU1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWUsCi0JCQkJU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VUaXRsZSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXREZXNjcmlwdGlvbihOTFMuYmluZCgKLQkJCQlNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbiwKLQkJCQlBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCUlQYXRoIGZpbGVQYXRoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkb21haW5Nb2RlbFVSSS50cmltRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWlmIChkb21haW5Nb2RlbFVSSS5pc1BsYXRmb3JtUmVzb3VyY2UoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkKLQkJCQkJLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSkpOwotCQl9IGVsc2UgaWYgKGRvbWFpbk1vZGVsVVJJLmlzRmlsZSgpKSB7Ci0JCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIDogdXNlIHNvbWUgZGVmYXVsdCBwYXRoCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVW5zdXBwb3J0ZWQgVVJJOiAiICsgZG9tYWluTW9kZWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKGZpbGVQYXRoKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKFVNTERpYWdyYW1FZGl0b3JVdGlsLmdldFVuaXF1ZUZpbGVOYW1lKAotCQkJCWZpbGVQYXRoLCBmaWxlTmFtZSwgInhtaSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgPSBuZXcgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5hbWUpOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJLnNldFRpdGxlKE1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGUpOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb24pOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLnNldE1vZGVsRWxlbWVudChkaWFncmFtUm9vdCk7Ci0KLQkJbXlFZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG15RmlsZUNyZWF0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShteUZpbGVDcmVhdGlvblBhZ2UpOwotCQlhZGRQYWdlKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlMaXN0IGFmZmVjdGVkRmlsZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJRmlsZSBkaWFncmFtRmlsZSA9IG15RmlsZUNyZWF0aW9uUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCVVNTERpYWdyYW1FZGl0b3JVdGlsLnNldENoYXJzZXQoZGlhZ3JhbUZpbGUpOwotCQlhZmZlY3RlZEZpbGVzLmFkZChkaWFncmFtRmlsZSk7Ci0JCVVSSSBkaWFncmFtTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHRydWUpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG15RWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSByZXNvdXJjZVNldAotCQkJCS5jcmVhdGVSZXNvdXJjZShkaWFncmFtTW9kZWxVUkkpOwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQlteUVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kLAotCQkJCWFmZmVjdGVkRmlsZXMpIHsKLQotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCWludCBkaWFncmFtVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldERpYWdyYW1WaXN1YWxJRChkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJCQkJCS5nZXRNb2RlbEVsZW1lbnQoKSk7Ci0JCQkJaWYgKGRpYWdyYW1WSUQgIT0gQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQpIHsKLQkJCQkJcmV0dXJuIENvbW1hbmRSZXN1bHQKLQkJCQkJCQkubmV3RXJyb3JDb21tYW5kUmVzdWx0KE1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcik7Ci0JCQkJfQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLmdldE1vZGVsRWxlbWVudCgpLAotCQkJCQkJQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShVTUxEaWFncmFtRWRpdG9yVXRpbC5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCVVNTERpYWdyYW1FZGl0b3JVdGlsLm9wZW5EaWFncmFtKGRpYWdyYW1SZXNvdXJjZSk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJTYXZlIG9wZXJhdGlvbiBmYWlsZWQgZm9yOiAiICsgZGlhZ3JhbU1vZGVsVVJJLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZXgpIHsKLQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIG9wZW4gZWRpdG9yIiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcwotCQkJTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBEaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQkJc3VwZXIocGFnZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2VsZWN0aW9uVGl0bGUoKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuVU1MTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5VTUxOZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJYm9vbGVhbiByZXN1bHQgPSBWaWV3U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKQotCQkJCQkucHJvdmlkZXMoCi0JCQkJCQkJbmV3IENyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uKAotCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKHNlbGVjdGVkTW9kZWxFbGVtZW50KSwKLQkJCQkJCQkJCUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0ID8gbnVsbAotCQkJCQk6IE1lc3NhZ2VzLlVNTE5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2UpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxQYWxldHRlRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3BhcnQvVU1MUGFsZXR0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjZWZkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxQYWxldHRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnMuVU1MRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZURyYXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFBhbGV0dGVGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsUGFsZXR0ZShQYWxldHRlUm9vdCBwYWxldHRlUm9vdCkgewotCQlwYWxldHRlUm9vdC5hZGQoY3JlYXRlRmxvd3MxR3JvdXAoKSk7Ci0JCXBhbGV0dGVSb290LmFkZChjcmVhdGVOb2RlczJHcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlRmxvd3MxR3JvdXAoKSB7Ci0JCVBhbGV0dGVDb250YWluZXIgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlRHJhd2VyKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2Zsb3dzX3RpdGxlKTsKLQkJcGFsZXR0ZUNvbnRhaW5lcgotCQkJCS5zZXREZXNjcmlwdGlvbihEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c19jcmVhdGVfdGV4dCk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbCgpKTsKLQkJcmV0dXJuIHBhbGV0dGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZU5vZGVzMkdyb3VwKCkgewotCQlQYWxldHRlQ29udGFpbmVyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9ub2Rlc190aXRsZXMpOwotCQlwYWxldHRlQ29udGFpbmVyCi0JCQkJLnNldERlc2NyaXB0aW9uKERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX2dyb3VwX3RleHQpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbjFDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVN0YXJ0Tm9kZTJDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUVuZE5vZGU2Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVGb3JrTm9kZTNDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUpvaW5Ob2RlN0NyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlRGVjaXNpb25Ob2RlNUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTWVyZ2VOb2RlNENyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQobmV3IFBhbGV0dGVTZXBhcmF0b3IoKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZUFjdGl2aXR5OUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlSXRlcmF0aW9uMTFDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVBoYXNlMTBDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZU1pbGVzdG9uZTEzQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVUYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sKCkpOwotCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVDb250cm9sRmxvdzFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEpOwotCQlMaW5rVG9vbEVudHJ5IGVudHJ5ID0gbmV3IExpbmtUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X2NyZWF0ZV90ZXh0LCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRyb2xGbG93KCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLkNvbnRyb2xGbG93XzMwMDEpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb24xQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygyKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4KTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QYXJ0aXRpb25fTm9kZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlU3RhcnROb2RlMkNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxOb2RlKCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLkluaXRpYWxOb2RlXzEwMDQpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlRm9ya05vZGUzQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ya05vZGUoKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuRm9ya05vZGVfMTAwMykpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVNZXJnZU5vZGU0Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5NZXJnZU5vZGVfMTAwMik7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVyZ2VOb2RlKCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLk1lcmdlTm9kZV8xMDAyKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZURlY2lzaW9uTm9kZTVDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1KTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fRGVjaXNpb25Ob2RlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVjaXNpb25Ob2RlKCksCi0JCQkJVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1KSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUVuZE5vZGU2Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eUZpbmFsTm9kZV8xMDAxKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3RleHQsIAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXAsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKFVNTEVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlGaW5hbE5vZGUoKSwKLQkJCQlVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVKb2luTm9kZTdDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkpvaW5Ob2RlXzEwMDYpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0pvaW5fTm9kZV90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5Kb2luTm9kZV8xMDA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZUFjdGl2aXR5OUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3KTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0LCAKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlUGhhc2UxMENyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKTsKLQkJTm9kZVRvb2xFbnRyeSBlbnRyeSA9IG5ldyBOb2RlVG9vbEVudHJ5KAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0LCAKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGhhc2VfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlSXRlcmF0aW9uMTFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qIDxJRWxlbWVudFR5cGU+ICovKDEpOwotCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQsCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihVTUxFbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwsCi0JCQkJVU1MRWxlbWVudFR5cGVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVUYXNrRGVzY3JpcHRvcjEyQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0LyogPElFbGVtZW50VHlwZT4gKi90eXBlcyA9IG5ldyBBcnJheUxpc3QvKiA8SUVsZW1lbnRUeXBlPiAqLygxKTsKLQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSkpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVNaWxlc3RvbmUxM0NyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qIDxJRWxlbWVudFR5cGU+ICovdHlwZXMgPSBuZXcgQXJyYXlMaXN0LyogPElFbGVtZW50VHlwZT4gKi8oMSk7Ci0JCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90ZXh0LAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9NaWxlc3RvbmVfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oVU1MRWxlbWVudFR5cGVzLmdldEltYWdlRGVzY3JpcHRvcihudWxsLAotCQkJCVVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMikpOyAvLyROT04tTkxTLTEkCi0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZVRvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCBlbGVtZW50VHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTm9kZVRvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlMaXN0IGVsZW1lbnRUeXBlcykgewotCQkJc3VwZXIodGl0bGUsIGRlc2NyaXB0aW9uLCBudWxsLCBudWxsKTsKLQkJCXRoaXMuZWxlbWVudFR5cGVzID0gZWxlbWVudFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2woZWxlbWVudFR5cGVzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGFyZ2V0UmVxdWVzdCgpIHsKLQkJCQkJQ3JlYXRlUmVxdWVzdCByZXEgPSBnZXRDcmVhdGVSZXF1ZXN0KCk7Ci0JCQkJCWlmIChpc0luU3RhdGUoU1RBVEVfRFJBR19JTl9QUk9HUkVTUykpIHsKLQkJCQkJCXJlcS5zZXRTaXplKG51bGwpOwotCQkJCQkJcmVxLnNldExvY2F0aW9uKGdldExvY2F0aW9uKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVxLnNldFNpemUobnVsbCk7Ci0JCQkJCQlyZXEuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJQnJpZGdlSGVscGVyLmVsZW1lbnRUeXBlcy5hZGQoKElFbGVtZW50VHlwZSkgZWxlbWVudFR5cGVzCi0JCQkJCS5nZXQoZWxlbWVudFR5cGVzLnNpemUoKSAtIDEpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlua1Rvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCByZWxhdGlvbnNoaXBUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgcmVsYXRpb25zaGlwVHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcFR5cGVzID0gcmVsYXRpb25zaGlwVHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbChyZWxhdGlvbnNoaXBUeXBlcyk7Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTFZpc3VhbElEUmVnaXN0cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wYXJ0L1VNTFZpc3VhbElEUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4NmNlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcGFydC9VTUxWaXN1YWxJRFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmV4cHJlc3Npb25zLlVNTEFic3RyYWN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RmluYWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5EZWNpc2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIHJlZ2lzdHJ5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUgb2YgdmlzdWFsIG9iamVjdCBzaG91bGQgYmUKLSAqIGNyZWF0ZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIERpYWdyYW0sIE5vZGUsIENoaWxkTm9kZSBvciBMaW5rIHJlcHJlc2VudGVkIAotICogYnkgYSBkb21haW4gbW9kZWwgb2JqZWN0LgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFZpc3VhbElEUmVnaXN0cnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19LRVkgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpCi0JCQkrICIvZGVidWcvdmlzdWFsSUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJaWYgKEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKHZpZXcuZ2V0VHlwZSgpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRWaXN1YWxJRCh2aWV3LmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZGVsSUQoVmlldyB2aWV3KSB7Ci0JCVZpZXcgZGlhZ3JhbSA9IHZpZXcuZ2V0RGlhZ3JhbSgpOwotCQl3aGlsZSAodmlldyAhPSBkaWFncmFtKSB7Ci0JCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiAoU3RyaW5nKSBhbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoIm1vZGVsSUQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdmlldyA9IChWaWV3KSB2aWV3LmVDb250YWluZXIoKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsID8gZGlhZ3JhbS5nZXRUeXBlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRWaXN1YWxJRChTdHJpbmcgdHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodHlwZSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgKLQkJCQkJUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oREVCVUdfS0VZKSkpIHsKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJVbmFibGUgdG8gcGFyc2UgdmlldyB0eXBlIGFzIGEgdmlzdWFsSUQgbnVtYmVyOiAiCi0JCQkJCQkJCSsgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKGludCB2aXN1YWxJRCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodmlzdWFsSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXREaWFncmFtVmlzdWFsSUQoZG9tYWluRWxlbWVudCwgZG9tYWluRWxlbWVudE1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkuaXNTdXBlclR5cGVPZigKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCSYmIGlzRGlhZ3JhbUFjdGl2aXR5Xzc5KChBY3Rpdml0eSkgZG9tYWluRWxlbWVudCkpIHsKLQkJCXJldHVybiBBY3Rpdml0eUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkRGlhZ3JhbUlEKGRvbWFpbkVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXROb2RlVmlzdWFsSUQoVmlldyBjb250YWluZXJWaWV3LCBFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LCBkb21haW5FbGVtZW50LAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5vZGVWaXN1YWxJRChWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIEVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzLAotCQkJU3RyaW5nIHNlbWFudGljSGludCkgewotCQlTdHJpbmcgY29udGFpbmVyTW9kZWxJRCA9IGdldE1vZGVsSUQoY29udGFpbmVyVmlldyk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpbnQgY29udGFpbmVyVmlzdWFsSUQ7Ci0JCWlmIChBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJY29udGFpbmVyVmlzdWFsSUQgPSBnZXRWaXN1YWxJRChjb250YWluZXJWaWV3KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjb250YWluZXJWaWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCWNvbnRhaW5lclZpc3VhbElEID0gQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpbnQgbm9kZVZpc3VhbElEID0gc2VtYW50aWNIaW50ICE9IG51bGwgPyBnZXRWaXN1YWxJRChzZW1hbnRpY0hpbnQpCi0JCQkJOiAtMTsKLQkJc3dpdGNoIChjb250YWluZXJWaXN1YWxJRCkgewotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5RmluYWxOb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRNZXJnZU5vZGVfMTAwMkNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkRm9ya05vZGVfMTAwM0NoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkSW5pdGlhbE5vZGVfMTAwNENoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkRGVjaXNpb25Ob2RlXzEwMDVDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEpvaW5Ob2RlXzEwMDZDaGlsZE5vZGVJRChkb21haW5FbGVtZW50LAotCQkJCQlzZW1hbnRpY0hpbnQpOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwN0NoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmIChKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMTAwOENoaWxkTm9kZUlEKAotCQkJCQlkb21haW5FbGVtZW50LCBzZW1hbnRpY0hpbnQpOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTJDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uXzIwMDFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcnRpdGlvbigpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eVBhcnRpdGlvbl8yMDAxKChBY3Rpdml0eVBhcnRpdGlvbikgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50XzUwMDFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlQYXJ0aXRpb24yRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSgoQWN0aXZpdHlQYXJ0aXRpb24pIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlGaW5hbE5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSgoQWN0aXZpdHlGaW5hbE5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBBY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVyZ2VOb2RlKCkuaXNTdXBlclR5cGVPZigKLQkJCQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZU1lcmdlTm9kZV8xMDAyKChNZXJnZU5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ya05vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlRm9ya05vZGVfMTAwMygoRm9ya05vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBGb3JrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVJbml0aWFsTm9kZV8xMDA0KChJbml0aWFsTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWNpc2lvbk5vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlRGVjaXNpb25Ob2RlXzEwMDUoKERlY2lzaW9uTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVKb2luTm9kZV8xMDA2KChKb2luTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFydGl0aW9uKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZUFjdGl2aXR5UGFydGl0aW9uXzEwMDgoKEFjdGl2aXR5UGFydGl0aW9uKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMigoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eV83OUNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQ29udHJvbEZsb3dfMzAwMUxpbmtMYWJlbElEKHNlbWFudGljSGludCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoZG9tYWluRWxlbWVudCwgZG9tYWluRWxlbWVudE1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQsCi0JCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcykgewotCQlpZiAoVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udHJvbEZsb3coKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc0xpbmtXaXRoQ2xhc3NDb250cm9sRmxvd18zMDAxKChDb250cm9sRmxvdykgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQlyZXR1cm4gQ29udHJvbEZsb3dFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTGlua1dpdGhDbGFzc0lEKGRvbWFpbkVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpYWdyYW1BY3Rpdml0eV83OShBY3Rpdml0eSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkRGlhZ3JhbUlEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eUZpbmFsTm9kZV8xMDAxKAotCQkJQWN0aXZpdHlGaW5hbE5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZU1lcmdlTm9kZV8xMDAyKE1lcmdlTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlRm9ya05vZGVfMTAwMyhGb3JrTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlSW5pdGlhbE5vZGVfMTAwNChJbml0aWFsTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlRGVjaXNpb25Ob2RlXzEwMDUoRGVjaXNpb25Ob2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVKb2luTm9kZV8xMDA2KEpvaW5Ob2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcoCi0JCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNy5tYXRjaGVzKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCgKLQkJCUFjdGl2aXR5UGFydGl0aW9uIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSgKLQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOS5tYXRjaGVzKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwKAotCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAubWF0Y2hlcyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSgKLQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExLm1hdGNoZXMoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMigKLQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMi5tYXRjaGVzKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlQWN0aXZpdHlQYXJ0aXRpb25fMjAwMSgKLQkJCUFjdGl2aXR5UGFydGl0aW9uIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eUZpbmFsTm9kZV8xMDAxQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTWVyZ2VOb2RlXzEwMDJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRGb3JrTm9kZV8xMDAzQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkSW5pdGlhbE5vZGVfMTAwNENoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZERlY2lzaW9uTm9kZV8xMDA1Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkSm9pbk5vZGVfMTAwNkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwN0NoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uXzEwMDhDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMENoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlQYXJ0aXRpb25fMjAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRfNTAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRfNTAwMkNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZEFjdGl2aXR5Xzc5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQ29udHJvbEZsb3dfMzAwMUxpbmtMYWJlbElEKAotCQkJU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlua1dpdGhDbGFzc0NvbnRyb2xGbG93XzMwMDEoQ29udHJvbEZsb3cgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0Y2hlciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPSBuZXcgTWF0Y2hlcigKLQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSkgewotCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgY29udGV4dDsKLQkJCQkJcmV0dXJuIEphdmFNYXRjaGVycy5nZXRVbWFUeXBlX0FjdGl2aXR5KHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGNoZXIgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPSBuZXcgTWF0Y2hlcigKLQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKSB7Ci0JCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgY29udGV4dDsKLQkJCQkJcmV0dXJuIEphdmFNYXRjaGVycy5nZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGNoZXIgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwID0gbmV3IE1hdGNoZXIoCi0JCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCXJldHVybiBKYXZhTWF0Y2hlcnMuZ2V0VW1hVHlwZV9QaGFzZShzZWxmKTsKLQkJCQl9Ci0JCQl9KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXRjaGVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9IG5ldyBNYXRjaGVyKAotCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQlyZXR1cm4gSmF2YU1hdGNoZXJzLmdldFVtYVR5cGVfSXRlcmF0aW9uKHNlbGYpOwotCQkJCX0KLQkJCX0pOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hdGNoZXIgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIgPSBuZXcgTWF0Y2hlcigKLQkJCW5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24oVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKSB7Ci0JCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgY29udGV4dDsKLQkJCQkJcmV0dXJuIEphdmFNYXRjaGVycy5nZXRVbWFUeXBlX01pbGVzdG9uZShzZWxmKTsKLQkJCQl9Ci0JCQl9KTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQJCi0JICovCi0Jc3RhdGljIGNsYXNzIE1hdGNoZXIgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCQotCQkgKi8KLQkJcHJpdmF0ZSBVTUxBYnN0cmFjdEV4cHJlc3Npb24gY29uZGl0aW9uOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCQotCQkgKi8KLQkJTWF0Y2hlcihVTUxBYnN0cmFjdEV4cHJlc3Npb24gY29uZGl0aW9uRXhwcmVzc2lvbikgewotCQkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb25FeHByZXNzaW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQJCi0JCSAqLwotCQlib29sZWFuIG1hdGNoZXMoT2JqZWN0IG9iamVjdCkgewotCQkJT2JqZWN0IHJlc3VsdCA9IGNvbmRpdGlvbi5ldmFsdWF0ZShvYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdCBpbnN0YW5jZW9mIEJvb2xlYW4KLQkJCQkJJiYgKChCb29sZWFuKSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JfS8vIE1hdGNoZXIKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBKYXZhTWF0Y2hlcnMgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9BY3Rpdml0eShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfQUNUSVZJVFkuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX0FjdGl2aXR5JyBvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBnZXRVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yKAotCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7Ci0JCQkJcmV0dXJuIGJsLlRSVUU7Ci0JCQl9Ci0JCQlyZXR1cm4gYmw7Ci0JCQkvLwkJCXRocm93IG5ldyBVTUxBYnN0cmFjdEV4cHJlc3Npb24uTm9JbXBsRXhjZXB0aW9uKAotCQkJLy8JCQkJCSJObyB1c2VyIGphdmEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgaW4gJ2dldFVtYVR5cGVfVGFza0Rlc2NyaXB0b3InIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKioKLQkJICogQG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGdldFVtYVR5cGVfUGhhc2UoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0KLQkJCUJvb2xlYW4gYmwgPSBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUoc2VsZiwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9QaGFzZScgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9JdGVyYXRpb24oU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmKSB7Ci0JCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCQlCb29sZWFuIGJsID0gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHNlbGYsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAoQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04uZXF1YWxzSWdub3JlQ2FzZSh0eXBlKSkgewotCQkJCXJldHVybiBibC5UUlVFOwotCQkJfQotCQkJcmV0dXJuIGJsOwotCQkJLy8JCQl0aHJvdyBuZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uLk5vSW1wbEV4Y2VwdGlvbigKLQkJCS8vCQkJCQkiTm8gdXNlciBqYXZhIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGluICdnZXRVbWFUeXBlX0l0ZXJhdGlvbicgb3BlcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIEJvb2xlYW4gZ2V0VW1hVHlwZV9NaWxlc3RvbmUoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYpIHsKLQkJCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQotCQkJQm9vbGVhbiBibCA9IG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldEVBbm5vdGF0aW9uVHlwZShzZWxmLAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX1RZUEUpOwotCQkJaWYgKEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKLQkJCQlyZXR1cm4gYmwuVFJVRTsKLQkJCX0KLQkJCXJldHVybiBibDsKLQkJCS8vCQkJdGhyb3cgbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbi5Ob0ltcGxFeGNlcHRpb24oCi0JCQkvLwkJCQkJIk5vIHVzZXIgamF2YSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBpbiAnZ2V0VW1hVHlwZV9NaWxlc3RvbmUnIG9wZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ly8gSmF2YU1hdGNoZXJzCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyNGJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjA5MzdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBDb25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2OWYyZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtc1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBEaWFncmFtc1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyOGNhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDNkMjlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlByaW50aW5nUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmludGluZ1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYzQzYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5SdWxlckdyaWRQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUnVsZXJHcmlkUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWE2MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uaXRlbS5BYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5hY3Rpb25zLlByaW50UHJldmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5hY3Rpb25zLkVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5SZW5kZXJlZFByaW50UHJldmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlBYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwKLQkJCUlXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvciBwYXJ0RGVzY3JpcHRvcikgewotCi0JCWlmIChhY3Rpb25JZC5lcXVhbHMoUHJpbnRQcmV2aWV3QWN0aW9uLklEKSkgewotCQkJcmV0dXJuIG5ldyBSZW5kZXJlZFByaW50UHJldmlld0FjdGlvbigKLQkJCQkJbmV3IEVuaGFuY2VkUHJpbnRBY3Rpb25IZWxwZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUFjdGlvbihhY3Rpb25JZCwgcGFydERlc2NyaXB0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGU2MTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5leHByZXNzaW9ucy5VTUxBYnN0cmFjdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbml0aWFsaXplcnMgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5pdGlhbGl6ZXJzIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSU9iamVjdEluaXRpYWxpemVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNyA9IG5ldyBPYmplY3RJbml0aWFsaXplcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCQkJYWRkKGNyZWF0ZUV4cHJlc3Npb25GZWF0dXJlSW5pdGlhbGl6ZXIoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCksCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfQWN0aXZpdHkoc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSkpOwotCQkJfQotCQl9OyAvLyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgT2JqZWN0SW5pdGlhbGl6ZXIJCQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJT2JqZWN0SW5pdGlhbGl6ZXIgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMDkgPSBuZXcgT2JqZWN0SW5pdGlhbGl6ZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCQkJYWRkKGNyZWF0ZUV4cHJlc3Npb25GZWF0dXJlSW5pdGlhbGl6ZXIoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCksCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSkgewotCQkJCQkJCXByb3RlY3RlZCBPYmplY3QgZG9FdmFsdWF0ZShPYmplY3QgY29udGV4dCwgTWFwIGVudikgewotCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZiA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfVGFza0Rlc2NyaXB0b3Ioc2VsZik7Ci0JCQkJCQkJfQotCQkJCQkJfSkpOwotCQkJfQotCQl9OyAvLyBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSBPYmplY3RJbml0aWFsaXplcgkJCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIElPYmplY3RJbml0aWFsaXplciBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPSBuZXcgT2JqZWN0SW5pdGlhbGl6ZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkJCWFkZChjcmVhdGVFeHByZXNzaW9uRmVhdHVyZUluaXRpYWxpemVyKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpLAotCQkJCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIE9iamVjdCBkb0V2YWx1YXRlKE9iamVjdCBjb250ZXh0LCBNYXAgZW52KSB7Ci0JCQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGUgc2VsZiA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBjb250ZXh0OwotCQkJCQkJCQlyZXR1cm4gSmF2YS5jcmVhdGVVbWFUeXBlX1BoYXNlKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQkJCX0KLQkJfTsgLy8gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwIE9iamVjdEluaXRpYWxpemVyCQkKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSU9iamVjdEluaXRpYWxpemVyIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMSA9IG5ldyBPYmplY3RJbml0aWFsaXplcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCQkJYWRkKGNyZWF0ZUV4cHJlc3Npb25GZWF0dXJlSW5pdGlhbGl6ZXIoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldEVNb2RlbEVsZW1lbnRfRUFubm90YXRpb25zKCksCi0JCQkJCQluZXcgVU1MQWJzdHJhY3RFeHByZXNzaW9uKFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSBzZWxmID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIGNvbnRleHQ7Ci0JCQkJCQkJCXJldHVybiBKYXZhLmNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uKHNlbGYpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQkJCX0KLQkJfTsgLy8gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExIE9iamVjdEluaXRpYWxpemVyCQkKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSU9iamVjdEluaXRpYWxpemVyIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyID0gbmV3IE9iamVjdEluaXRpYWxpemVyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkJCWFkZChjcmVhdGVFeHByZXNzaW9uRmVhdHVyZUluaXRpYWxpemVyKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRFTW9kZWxFbGVtZW50X0VBbm5vdGF0aW9ucygpLAotCQkJCQkJbmV3IFVNTEFic3RyYWN0RXhwcmVzc2lvbihVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgT2JqZWN0IGRvRXZhbHVhdGUoT2JqZWN0IGNvbnRleHQsIE1hcCBlbnYpIHsKLQkJCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIHNlbGYgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBjb250ZXh0OwotCQkJCQkJCQlyZXR1cm4gSmF2YS5jcmVhdGVVbWFUeXBlX01pbGVzdG9uZShzZWxmKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSk7Ci0JCQl9Ci0JCX07IC8vIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyIE9iamVjdEluaXRpYWxpemVyCi0KLQkJLyoqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEluaXRpYWxpemVycygpIHsKLQkJfQotCi0JCS8qKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSU9iamVjdEluaXRpYWxpemVyIHsKLQkJCS8qKiAKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgaW5pdChFT2JqZWN0IGluc3RhbmNlKTsKLQkJfQotCi0JCS8qKiAKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBPYmplY3RJbml0aWFsaXplciBpbXBsZW1lbnRzCi0JCQkJSU9iamVjdEluaXRpYWxpemVyIHsKLQkJCS8qKiAKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJZmluYWwgRUNsYXNzIGVsZW1lbnQ7Ci0JCQkvKiogCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXByaXZhdGUgTGlzdCBmZWF0dXJlSW5pdGlhbGl6ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkvKiogCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCU9iamVjdEluaXRpYWxpemVyKEVDbGFzcyBlbGVtZW50KSB7Ci0JCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCQlpbml0KCk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0KCk7Ci0KLQkJCS8qKiAKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHJvdGVjdGVkIGZpbmFsIElGZWF0dXJlSW5pdGlhbGl6ZXIgYWRkKAotCQkJCQlJRmVhdHVyZUluaXRpYWxpemVyIGluaXRpYWxpemVyKSB7Ci0JCQkJZmVhdHVyZUluaXRpYWxpemVycy5hZGQoaW5pdGlhbGl6ZXIpOwotCQkJCXJldHVybiBpbml0aWFsaXplcjsKLQkJCX0KLQotCQkJLyoqIAotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBpbml0KEVPYmplY3QgaW5zdGFuY2UpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZUluaXRpYWxpemVycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlGZWF0dXJlSW5pdGlhbGl6ZXIgbmV4dEV4cHIgPSAoSUZlYXR1cmVJbml0aWFsaXplcikgaXQKLQkJCQkJCQkubmV4dCgpOwotCQkJCQl0cnkgewotCQkJCQkJbmV4dEV4cHIuaW5pdChpbnN0YW5jZSk7Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJCSJGZWF0dXJlIGluaXRpYWxpemF0aW9uIGZhaWxlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gLy8gZW5kIG9mIE9iamVjdEluaXRpYWxpemVyCi0KLQkJLyoqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlpbnRlcmZhY2UgSUZlYXR1cmVJbml0aWFsaXplciB7Ci0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJdm9pZCBpbml0KEVPYmplY3QgY29udGV4dEluc3RhbmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgSUZlYXR1cmVJbml0aWFsaXplciBjcmVhdGVOZXdFbGVtZW50RmVhdHVyZUluaXRpYWxpemVyKAotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBpbml0RmVhdHVyZSwKLQkJCQlPYmplY3RJbml0aWFsaXplcltdIG5ld09iamVjdEluaXRpYWxpemVycykgewotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBpbml0RmVhdHVyZTsKLQkJCWZpbmFsIE9iamVjdEluaXRpYWxpemVyW10gaW5pdGlhbGl6ZXJzID0gbmV3T2JqZWN0SW5pdGlhbGl6ZXJzOwotCQkJcmV0dXJuIG5ldyBJRmVhdHVyZUluaXRpYWxpemVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGluaXQoRU9iamVjdCBjb250ZXh0SW5zdGFuY2UpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUVPYmplY3QgbmV3SW5zdGFuY2UgPSBpbml0aWFsaXplcnNbaV0uZWxlbWVudAotCQkJCQkJCQkuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKAotCQkJCQkJCQkJCWluaXRpYWxpemVyc1tpXS5lbGVtZW50KTsKLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChDb2xsZWN0aW9uKSBjb250ZXh0SW5zdGFuY2UuZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJCS5hZGQobmV3SW5zdGFuY2UpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb250ZXh0SW5zdGFuY2UuZVNldChmZWF0dXJlLCBuZXdJbnN0YW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpbml0aWFsaXplcnNbaV0uaW5pdChuZXdJbnN0YW5jZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXN0YXRpYyBJRmVhdHVyZUluaXRpYWxpemVyIGNyZWF0ZUV4cHJlc3Npb25GZWF0dXJlSW5pdGlhbGl6ZXIoCi0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGluaXRGZWF0dXJlLAotCQkJCVVNTEFic3RyYWN0RXhwcmVzc2lvbiB2YWx1ZUV4cHJlc3Npb24pIHsKLQkJCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaW5pdEZlYXR1cmU7Ci0JCQlmaW5hbCBVTUxBYnN0cmFjdEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhbHVlRXhwcmVzc2lvbjsKLQkJCXJldHVybiBuZXcgSUZlYXR1cmVJbml0aWFsaXplcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBpbml0KEVPYmplY3QgY29udGV4dEluc3RhbmNlKSB7Ci0JCQkJCWV4cHJlc3Npb24uYXNzaWduVG8oZmVhdHVyZSwgY29udGV4dEluc3RhbmNlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqIAotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlzdGF0aWMgY2xhc3MgSmF2YSB7Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0PEVBbm5vdGF0aW9uPiBjcmVhdGVVbWFUeXBlX0FjdGl2aXR5KAotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gZ2VuZXJpY0NyZWF0ZVR5cGUoc2VsZiwgQnJpZGdlSGVscGVyLlVNQV9BQ1RJVklUWSk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0PEVBbm5vdGF0aW9uPiBjcmVhdGVVbWFUeXBlX1Rhc2tEZXNjcmlwdG9yKAotCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgc2VsZikgewotCQkJCXJldHVybiBnZW5lcmljQ3JlYXRlVHlwZShzZWxmLCBCcmlkZ2VIZWxwZXIuVU1BX1RBU0tfREVTQ1JJUFRPUik7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQG1vZGlmaWVkCi0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIEVMaXN0PEVBbm5vdGF0aW9uPiBjcmVhdGVVbWFUeXBlX1BoYXNlKAotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQotCQkJCXJldHVybiBnZW5lcmljQ3JlYXRlVHlwZShzZWxmLCBCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAbW9kaWZpZWQKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgRUxpc3Q8RUFubm90YXRpb24+IGNyZWF0ZVVtYVR5cGVfSXRlcmF0aW9uKAotCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlIHNlbGYpIHsKLQkJCQlyZXR1cm4gZ2VuZXJpY0NyZWF0ZVR5cGUoc2VsZiwgQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04pOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBtb2RpZmllZAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBFTGlzdDxFQW5ub3RhdGlvbj4gY3JlYXRlVW1hVHlwZV9NaWxlc3RvbmUoCi0JCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZSBzZWxmKSB7Ci0JCQkJcmV0dXJuIGdlbmVyaWNDcmVhdGVUeXBlKHNlbGYsIEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FKTsKLQkJCX0KLQkJfSAvL0phdmEKLQl9IC8vIGVuZCBvZiBJbml0aWFsaXplcnMKLQkKLQkKLQkvKioKLQkgKiBAcGFyYW0gc2VsZgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVMaXN0PEVBbm5vdGF0aW9uPiBnZW5lcmljQ3JlYXRlVHlwZShBY3Rpdml0eU5vZGUgc2VsZiwgU3RyaW5nIHR5cGUpewotCQlFTGlzdDxFQW5ub3RhdGlvbj4gbGlzdCA9IEJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUoc2VsZiwJdHlwZSk7Ci0JCUJyaWRnZUhlbHBlci5zZXREZWZhdWx0TmFtZShzZWxmKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxBYnN0cmFjdFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxBYnN0cmFjdFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTA2NzNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MQWJzdHJhY3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5TZXRWYWx1ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5TZXRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVTUxBYnN0cmFjdFBhcnNlciBpbXBsZW1lbnRzIElQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIHZpZXdQYXR0ZXJuOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZUZvcm1hdCB2aWV3UHJvY2Vzc29yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGVkaXRQYXR0ZXJuOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZUZvcm1hdCBlZGl0UHJvY2Vzc29yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Vmlld1BhdHRlcm4oKSB7Ci0JCXJldHVybiB2aWV3UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsKLQkJcmV0dXJuIHZpZXdQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdQYXR0ZXJuKFN0cmluZyB2aWV3UGF0dGVybikgewotCQl0aGlzLnZpZXdQYXR0ZXJuID0gdmlld1BhdHRlcm47Ci0JCXZpZXdQcm9jZXNzb3IgPSBjcmVhdGVWaWV3UHJvY2Vzc29yKHZpZXdQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgY3JlYXRlVmlld1Byb2Nlc3NvcihTdHJpbmcgdmlld1BhdHRlcm4pIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KHZpZXdQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0UGF0dGVybigpIHsKLQkJcmV0dXJuIGVkaXRQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gZWRpdFByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdFBhdHRlcm4oU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXRoaXMuZWRpdFBhdHRlcm4gPSBlZGl0UGF0dGVybjsKLQkJZWRpdFByb2Nlc3NvciA9IGNyZWF0ZUVkaXRQcm9jZXNzb3IoZWRpdFBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVFZGl0UHJvY2Vzc29yKFN0cmluZyBlZGl0UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQoZWRpdFBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByaW50U3RyaW5nKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oYWRhcHRlciwgZmxhZ3MsIGdldFZpZXdQYXR0ZXJuKCksCi0JCQkJZ2V0Vmlld1Byb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0U3RyaW5nKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oYWRhcHRlciwgZmxhZ3MsIGdldEVkaXRQYXR0ZXJuKCksCi0JCQkJZ2V0RWRpdFByb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyRWRpdFN0YXR1cyBpc1ZhbGlkRWRpdFN0cmluZyhJQWRhcHRhYmxlIGVsZW1lbnQsCi0JCQlTdHJpbmcgZWRpdFN0cmluZykgewotCQlQYXJzZVBvc2l0aW9uIHBvcyA9IG5ldyBQYXJzZVBvc2l0aW9uKDApOwotCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UoZWRpdFN0cmluZywgcG9zKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCAiSW52YWxpZCBpbnB1dCBhdCAiCi0JCQkJCQkJKyBwb3MuZ2V0RXJyb3JJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlTmV3VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBTdHJpbmcgbmV3U3RyaW5nLAotCQkJaW50IGZsYWdzKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShuZXdTdHJpbmcsCi0JCQkJbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCQlpZiAodmFsdWVzID09IG51bGwKLQkJCQl8fCB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpLmdldENvZGUoKSAhPSBJUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlQ29tbWFuZChhZGFwdGVyLCB2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwKLQkJCU9iamVjdFtdIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJU2V0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFNldFJlcXVlc3QoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IFNldFZhbHVlQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkTmV3VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoQm9vbGVhbi5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBCb29sZWFuIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBDaGFyYWN0ZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJ5dGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEJ5dGUoKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gQnl0ZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBCeXRlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgQnl0ZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoU2hvcnQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBTaG9ydCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gU2hvcnQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gU2hvcnQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTaG9ydCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSW50ZWdlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcigoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gSW50ZWdlciB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEludGVnZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKExvbmcuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IExvbmcoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gTG9uZy52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBMb25nIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgTG9uZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmxvYXQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdCgoKE51bWJlcikgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRmxvYXQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRmxvYXQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBGbG9hdCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRG91YmxlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IERvdWJsZSgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBEb3VibGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBEb3VibGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBFRW51bSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9ICgoRUVudW0pIHR5cGUpCi0JCQkJCQkJLmdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVW5rbm93biBsaXRlcmFsOiAiICsgdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU3RyaW5nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEludmFsaWRWYWx1ZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIEludmFsaWRWYWx1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxDb250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlYWJiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbml0ZW0uQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLmFjdGlvbnMuUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5FbmhhbmNlZFByaW50QWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxDb250cmlidXRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlBYnN0cmFjdENvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElBY3Rpb24gY3JlYXRlQWN0aW9uKFN0cmluZyBhY3Rpb25JZCwKLQkJCUlXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvciBwYXJ0RGVzY3JpcHRvcikgewotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKFByaW50UHJldmlld0FjdGlvbi5JRCkpIHsKLQkJCXJldHVybiBuZXcgUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb24oCi0JCQkJCW5ldyBFbmhhbmNlZFByaW50QWN0aW9uSGVscGVyKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVBY3Rpb24oYWN0aW9uSWQsIHBhcnREZXNjcmlwdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MRWRpdFBhcnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxFZGl0UGFydFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMGQwYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxFZGl0UGFydFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuSUVkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5VTUxFZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEVkaXRQYXJ0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2FjaGluZzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkUGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkVmlldzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1MRWRpdFBhcnRQcm92aWRlcigpIHsKLQkJc2V0RmFjdG9yeShuZXcgVU1MRWRpdFBhcnRGYWN0b3J5KCkpOwotCQlzZXRBbGxvd0NhY2hpbmcodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0UGFydEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGxvd0NhY2hpbmcoKSB7Ci0JCXJldHVybiBhbGxvd0NhY2hpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbGxvd0NhY2hpbmcoYm9vbGVhbiBhbGxvd0NhY2hpbmcpIHsKLQkJdGhpcy5hbGxvd0NhY2hpbmcgPSBhbGxvd0NhY2hpbmc7Ci0JCWlmICghYWxsb3dDYWNoaW5nKSB7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KG51bGwsIHZpZXcpOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2FjaGVkUGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGNhY2hlZFZpZXcgIT0gbnVsbCAmJiBjYWNoZWRWaWV3LmdldCgpID09IHZpZXcpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBjYWNoZWRQYXJ0LmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVHcmFwaGljRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGdldENhY2hlZFBhcnQodmlldyk7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb24pIHsKLQkJCVZpZXcgdmlldyA9ICgoSUVkaXRQYXJ0T3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZpZXcoKTsKLQkJCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSAmJiBnZXRDYWNoZWRQYXJ0KHZpZXcpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gY3JlYXRlRWRpdFBhcnQodmlldyk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCQkJY2FjaGVkUGFydCA9IG5ldyBXZWFrUmVmZXJlbmNlKHBhcnQpOwotCQkJCQljYWNoZWRWaWV3ID0gbmV3IFdlYWtSZWZlcmVuY2Uodmlldyk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxFbGVtZW50VHlwZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MRWxlbWVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGJhMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxFbGVtZW50VHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5leHByZXNzaW9ucy5VTUxBYnN0cmFjdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLkljb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZ2Vvc2hhcGVzLmludGVybmFsLnByb3ZpZGVycy5HZW9TaGFwZUljb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2Vvc2hhcGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLklOb3RhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxFbGVtZW50VHlwZXMgZXh0ZW5kcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVNTEVsZW1lbnRUeXBlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBHZW9TaGFwZUljb25Qcm92aWRlciBnZW9TaGFwZUljb25Qcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEltYWdlUmVnaXN0cnlLZXkoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbGVtZW50KTsKLQkJCUVDbGFzcyBlQ29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChlQ29udGFpbmluZ0NsYXNzICE9IG51bGwgJiYgIWVDb250YWluaW5nQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVDb250YWluaW5nQ2xhc3M7Ci0JCQl9IGVsc2UgaWYgKGVUeXBlIGluc3RhbmNlb2YgRUNsYXNzCi0JCQkJCSYmICEoKEVDbGFzcykgZVR5cGUpLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlVHlwZTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVsZW1lbnQ7Ci0JCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJCQllQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkKLQkJCQkJCQkJCQkuY3JlYXRlKGVDbGFzcykpOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gOiBzdXBwb3J0IHN0cnVjdHVyYWwgZmVhdHVyZXMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCWlmKGlzR2VvU2hhcGUoaGludCkpewotCQkJcmV0dXJuIGdldEdlb1NoYXBlSWNvblByb3ZpZGVyKCkuZ2V0SWNvbigoKElOb3RhdGlvblR5cGUpaGludCkuZ2V0U2VtYW50aWNIaW50KCkpOwotCQl9Ci0JCUVOYW1lZEVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoaGludCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIG1vZGlmaWVkIFNUQVJUCi0JCU9iamVjdCB0eXBlID0gaGludC5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCUltYWdlIGltYWdlID0gZ2V0SW1hZ2UoZWxlbWVudCwgKElFbGVtZW50VHlwZSkgdHlwZSk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiBpbWFnZTsKLQkJCX0KLQkJfQotCQkvLyBtb2RpZmllZCBFTkQKLQkJcmV0dXJuIGdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgJ3R5cGUnIG9mIHRoZSBlY29yZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVOYW1lZEVsZW1lbnQgZ2V0RWxlbWVudChJQWRhcHRhYmxlIGhpbnQpIHsKLQkJT2JqZWN0IHR5cGUgPSBoaW50LmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotCi0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlfNzksIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCi0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5RmluYWxOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoTWVyZ2VOb2RlXzEwMDIsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE1lcmdlTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KEZvcmtOb2RlXzEwMDMsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEZvcmtOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoSW5pdGlhbE5vZGVfMTAwNCwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEluaXRpYWxOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoRGVjaXNpb25Ob2RlXzEwMDUsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZWNpc2lvbk5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChKb2luTm9kZV8xMDA2LCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNywgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eVBhcnRpdGlvbl8xMDA4LCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMCwgVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIsIFVNTFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eVBhcnRpdGlvbl8yMDAxLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QWN0aXZpdHlQYXJ0aXRpb24oKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChDb250cm9sRmxvd18zMDAxLCBVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udHJvbEZsb3coKSk7Ci0JCX0KLQkJcmV0dXJuIChFTmFtZWRFbGVtZW50KSBlbGVtZW50cy5nZXQodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5Xzc5ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5Xzc5Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eVBhcnRpdGlvbl8yMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzIwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5RmluYWxOb2RlXzEwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTWVyZ2VOb2RlXzEwMDIgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuTWVyZ2VOb2RlXzEwMDIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEZvcmtOb2RlXzEwMDMgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuRm9ya05vZGVfMTAwMyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgSW5pdGlhbE5vZGVfMTAwNCA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Jbml0aWFsTm9kZV8xMDA0Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBEZWNpc2lvbk5vZGVfMTAwNSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5EZWNpc2lvbk5vZGVfMTAwNSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgSm9pbk5vZGVfMTAwNiA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Kb2luTm9kZV8xMDA2Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDA3Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eVBhcnRpdGlvbl8xMDA4ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFydGl0aW9uXzEwMDgiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTAgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgQ29udHJvbEZsb3dfMzAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5Db250cm9sRmxvd18zMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZShpZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFNldCBLTk9XTl9FTEVNRU5UX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tub3duRWxlbWVudFR5cGUoSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0JCWlmIChLTk9XTl9FTEVNRU5UX1RZUEVTID09IG51bGwpIHsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMgPSBuZXcgSGFzaFNldCgpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlfNzkpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlGaW5hbE5vZGVfMTAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChNZXJnZU5vZGVfMTAwMik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChGb3JrTm9kZV8xMDAzKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEluaXRpYWxOb2RlXzEwMDQpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoRGVjaXNpb25Ob2RlXzEwMDUpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoSm9pbk5vZGVfMTAwNik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlQYXJ0aXRpb25fMTAwOCk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDEyKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKEFjdGl2aXR5UGFydGl0aW9uXzIwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQ29udHJvbEZsb3dfMzAwMSk7Ci0JCX0KLQkJcmV0dXJuIEtOT1dOX0VMRU1FTlRfVFlQRVMuY29udGFpbnMoZWxlbWVudFR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50LCBJRWxlbWVudFR5cGUgdHlwZSkgewotCQlTdHJpbmcga2V5ID0gdHlwZS5nZXRJZCgpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCQlpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAxMC5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L1BoYXNlLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDExLmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvSXRlcmF0aW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlXzEwMTIuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9NaWxlc3RvbmUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAwOS5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKEVOYW1lZEVsZW1lbnQgZWxlbWVudCwKLQkJCUlFbGVtZW50VHlwZSB0eXBlKSB7Ci0JCVN0cmluZyBrZXkgPSB0eXBlLmdldElkKCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCi0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJCWlmIChrZXkuZXF1YWxzKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVfMTAwNy5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L0FjdGl2aXR5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZV8xMDEwLmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvUGhhc2UuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEuZ2V0SWQoKSkpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhBY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMi5nZXRJZCgpKSkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L01pbGVzdG9uZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKEFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5LmdldElkKCkpKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQkJCWltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXREZXNjcmlwdG9yKGtleSk7Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNHZW9TaGFwZShJQWRhcHRhYmxlIGhpbnQpIHsKLQkJaWYoaGludCBpbnN0YW5jZW9mIElOb3RhdGlvblR5cGUpewotCQkJU3RyaW5nIHggPSAoKElOb3RhdGlvblR5cGUpaGludCkuZ2V0U2VtYW50aWNIaW50KCk7Ci0JCQlpZihHZW9zaGFwZUNvbnN0YW50cy5nZXRTdXBwb3J0ZWRTaGFwZXMoKS5jb250YWlucyh4KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEdlb1NoYXBlSWNvblByb3ZpZGVyIGdldEdlb1NoYXBlSWNvblByb3ZpZGVyKCl7Ci0JCWlmKGdlb1NoYXBlSWNvblByb3ZpZGVyID09IG51bGwpewotCQkJZ2VvU2hhcGVJY29uUHJvdmlkZXIgPSBuZXcgR2VvU2hhcGVJY29uUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZ2VvU2hhcGVJY29uUHJvdmlkZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxJY29uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MSWNvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYmUxYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxJY29uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5HZXRJY29uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLklJY29uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTEljb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cyBJSWNvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbihJQWRhcHRhYmxlIGhpbnQsIGludCBmbGFncykgewotCQlyZXR1cm4gVU1MRWxlbWVudFR5cGVzLmdldEltYWdlKGhpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0SWNvbk9wZXJhdGlvbikgewotCQkJcmV0dXJuICgoR2V0SWNvbk9wZXJhdGlvbikgb3BlcmF0aW9uKS5leGVjdXRlKHRoaXMpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDMwOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5FbGVtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5tb2RlbGluZ2Fzc2lzdGFudC5Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgZXh0ZW5kcyBNb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIE1vZGlmaWVkIHRvIHN5bmMgb3JkZXIgd2l0aCB0aGUgcGFsZXR0ZS4KLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclBvcHVwQmFyKElBZGFwdGFibGUgaG9zdCkgewotCQlJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBob3N0Ci0JCQkJLmdldEFkYXB0ZXIoSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8yMDAxKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBBY3Rpdml0eUVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcnRpdGlvbl8xMDA4KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSW5pdGlhbE5vZGVfMTAwNCk7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5RmluYWxOb2RlXzEwMDEpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5Gb3JrTm9kZV8xMDAzKTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuSm9pbk5vZGVfMTAwNik7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkRlY2lzaW9uTm9kZV8xMDA1KTsKLQkJCXR5cGVzLmFkZChVTUxFbGVtZW50VHlwZXMuTWVyZ2VOb2RlXzEwMDIpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMDcpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTEpOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlXzEwMTApOwotCQkJdHlwZXMuYWRkKFVNTEVsZW1lbnRUeXBlcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVfMTAxMik7Ci0JCQl0eXBlcy5hZGQoVU1MRWxlbWVudFR5cGVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZV8xMDA5KTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZShJQWRhcHRhYmxlIHNvdXJjZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblRhcmdldChJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHRhcmdldCwgZ2V0VHlwZXNGb3JTb3VyY2UodGFyZ2V0LAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudChzb3VyY2UsIGdldFR5cGVzRm9yVGFyZ2V0KHNvdXJjZSwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudChJQWRhcHRhYmxlIGhvc3QsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJaWYgKHR5cGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0Um9vdCgpLmdldENvbnRlbnRzKCkuZ2V0TW9kZWwoKTsKLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkaWFncmFtLmdldEVsZW1lbnQoKS5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChpc0FwcGxpY2FibGVFbGVtZW50KGVsZW1lbnQsIHR5cGVzKSkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0RWxlbWVudCgoRU9iamVjdFtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBFT2JqZWN0W2VsZW1lbnRzCi0JCQkJLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhYmxlRWxlbWVudChFT2JqZWN0IGVsZW1lbnQsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJSUVsZW1lbnRUeXBlIHR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudFR5cGUoCi0JCQkJZWxlbWVudCk7Ci0JCXJldHVybiB0eXBlcy5jb250YWlucyh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RWxlbWVudChFT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCXNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIkF2YWlsYWJsZSBkb21haW4gbW9kZWwgZWxlbWVudHM6Iik7Ci0JCWRpYWxvZy5zZXRUaXRsZSgiU2VsZWN0IGRvbWFpbiBtb2RlbCBlbGVtZW50Iik7Ci0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCUVPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXNlbGVjdGVkID0gKEVPYmplY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFBhbGV0dGVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQYWxldHRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkMmU1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFBhbGV0dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLnBhbGV0dGUuSVBhbGV0dGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFBhbGV0dGVGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFBhbGV0dGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFsZXR0ZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9QYWxldHRlKElFZGl0b3JQYXJ0IGVkaXRvciwgT2JqZWN0IGNvbnRlbnQsCi0JCQlQYWxldHRlUm9vdCByb290LCBNYXAgcHJlZGVmaW5lZEVudHJpZXMpIHsKLQkJVU1MUGFsZXR0ZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBVTUxQYWxldHRlRmFjdG9yeSgpOwotCQlmYWN0b3J5LmZpbGxQYWxldHRlKHJvb3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250cmlidXRpb25zKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCS8vIG5vIGNvbmZpZ3VyYXRpb24KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIGZhbHNlOyAvLyBhbGwgbG9naWMgaXMgZG9uZSBpbiB0aGUgc2VydmljZQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUGFyc2VyUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MUGFyc2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxZTM4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFBhcnNlclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuR2V0UGFyc2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVNTFBhcnNlclByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQYXJzZXJQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIoKSB7Ci0JCWlmIChhY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIgPSBjcmVhdGVBY3Rpdml0eVBhcnRpdGlvbkFjdGl2aXR5UGFydGl0aW9uTmFtZV80MDA2UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDZQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldEFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIoKSB7Ci0JCWlmIChhY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIgPSBjcmVhdGVBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUFjdGl2aXR5RmluYWxOb2RlQWN0aXZpdHlGaW5hbE5vZGVOYW1lXzQwMDFQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIG1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0TWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyKCkgewotCQlpZiAobWVyZ2VOb2RlTWVyZ2VOb2RlTmFtZV80MDAyUGFyc2VyID09IG51bGwpIHsKLQkJCW1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlciA9IGNyZWF0ZU1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBtZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZU1lcmdlTm9kZU1lcmdlTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgaW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0SW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcigpIHsKLQkJaWYgKGluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXIgPT0gbnVsbCkgewotCQkJaW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlciA9IGNyZWF0ZUluaXRpYWxOb2RlSW5pdGlhbE5vZGVOYW1lXzQwMDNQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlSW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXREZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIoKSB7Ci0JCWlmIChkZWNpc2lvbk5vZGVEZWNpc2lvbk5vZGVOYW1lXzQwMDRQYXJzZXIgPT0gbnVsbCkgewotCQkJZGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyID0gY3JlYXRlRGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGRlY2lzaW9uTm9kZURlY2lzaW9uTm9kZU5hbWVfNDAwNFBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlRGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA1UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwNVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpIHsKLQkJaWYgKGFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwN1BhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRBY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXIoKSB7Ci0JCWlmIChhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMDhQYXJzZXIgPT0gbnVsbCkgewotCQkJYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyID0gY3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDA4UGFyc2VyKCkgewotCQlVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCXBhcnNlci5zZXRWaWV3UGF0dGVybigiezB9Iik7Ci0JCXBhcnNlci5zZXRFZGl0UGF0dGVybigiezB9Iik7Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDlQYXJzZXIoKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlciA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlciA9IGNyZWF0ZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDA5UGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZV80MDEwUGFyc2VyKCkgewotCQlpZiAoc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIgPT0gbnVsbCkgewotCQkJc3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIgPSBjcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMTBQYXJzZXIoKSB7Ci0JCVVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyKCkgewotCQlpZiAoYWN0aXZpdHlQYXJhbWV0ZXJOb2RlQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZV80MDExUGFyc2VyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlciA9IGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVBhcmFtZXRlck5vZGVBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lXzQwMTFQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0Q29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpIHsKLQkJaWYgKGNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIgPT0gbnVsbCkgewotCQkJY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlciA9IGNyZWF0ZUNvbnRyb2xGbG93Q29udHJvbEZsb3dOYW1lXzQwMTJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gY29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlQ29udHJvbEZsb3dDb250cm9sRmxvd05hbWVfNDAxMlBhcnNlcigpIHsKLQkJVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IFVNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBnZXRQYXJzZXIoaW50IHZpc3VhbElEKSB7Ci0JCXN3aXRjaCAodmlzdWFsSUQpIHsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0QWN0aXZpdHlQYXJ0aXRpb25BY3Rpdml0eVBhcnRpdGlvbk5hbWVfNDAwNlBhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRBY3Rpdml0eUZpbmFsTm9kZUFjdGl2aXR5RmluYWxOb2RlTmFtZV80MDAxUGFyc2VyKCk7Ci0JCWNhc2UgTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNZXJnZU5vZGVNZXJnZU5vZGVOYW1lXzQwMDJQYXJzZXIoKTsKLQkJY2FzZSBJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0SW5pdGlhbE5vZGVJbml0aWFsTm9kZU5hbWVfNDAwM1BhcnNlcigpOwotCQljYXNlIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0RGVjaXNpb25Ob2RlRGVjaXNpb25Ob2RlTmFtZV80MDA0UGFyc2VyKCk7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lXzQwMDVQYXJzZXIoKTsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5UGFydGl0aW9uQWN0aXZpdHlQYXJ0aXRpb25OYW1lXzQwMDdQYXJzZXIoKTsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAwOFBhcnNlcigpOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAwOVBhcnNlcigpOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVfNDAxMFBhcnNlcigpOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVfNDAxMVBhcnNlcigpOwotCQljYXNlIENvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRDb250cm9sRmxvd0NvbnRyb2xGbG93TmFtZV80MDEyUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJU3RyaW5nIHZpZCA9IChTdHJpbmcpIGhpbnQuZ2V0QWRhcHRlcihTdHJpbmcuY2xhc3MpOwotCQlpZiAodmlkICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWQpKTsKLQkJfQotCQlWaWV3IHZpZXcgPSAoVmlldykgaGludC5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKFVNTFZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UGFyc2VyT3BlcmF0aW9uKSB7Ci0JCQlJQWRhcHRhYmxlIGhpbnQgPSAoKEdldFBhcnNlck9wZXJhdGlvbikgb3BlcmF0aW9uKS5nZXRIaW50KCk7Ci0JCQlpZiAoVU1MRWxlbWVudFR5cGVzLmdldEVsZW1lbnQoaGludCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBnZXRQYXJzZXIoaGludCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxQcm9wZXJ0eVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFByb3BlcnR5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ZDM3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFByb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5HZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JQ29tcG9zaXRlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSVByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllcy5wcm92aWRlcnMuR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxQcm9wZXJ0eVByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9wZXJ0aWVzUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgewotCQkJT2JqZWN0IG9iamVjdCA9ICgoR2V0UHJvcGVydHlTb3VyY2VPcGVyYXRpb24pIG9wZXJhdGlvbikKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJcmV0dXJuIGdldFNlbWFudGljRWxlbWVudChvYmplY3QpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbXBvc2l0ZVByb3BlcnR5U291cmNlIGdldFByb3BlcnR5U291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eVNvdXJjZShlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U2VtYW50aWNFbGVtZW50KE9iamVjdCBvYmplY3QpIHsKLQkJVmlldyB2aWV3ID0gbnVsbDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXZpZXcgPSAoVmlldykgb2JqZWN0OwotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgb2JqZWN0OwotCQkJaWYgKGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJdmlldyA9IChWaWV3KSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWlmICh2aWV3ICE9IG51bGwKLQkJCQkmJiBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TW9kZWxJRCh2aWV3KSkpIHsKLQkJCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiMDcxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5BY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgZXh0ZW5kcyBVTUxBYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRm9ybWF0IERFRkFVTFRfUFJPQ0VTU09SID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkiezB9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlNZXNzYWdlRm9ybWF0IHByb2Nlc3NvciA9IHN1cGVyLmdldFZpZXdQcm9jZXNzb3IoKTsKLQkJcmV0dXJuIHByb2Nlc3NvciA9PSBudWxsID8gREVGQVVMVF9QUk9DRVNTT1IgOiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0RWRpdFByb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RG9tYWluRWxlbWVudChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWVsZW1lbnQgPSBnZXREb21haW5FbGVtZW50KGVsZW1lbnQpOwotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGVsZW1lbnQsIGZlYXR1cmUsIHByb2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKEVPYmplY3QgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50ID09IG51bGwgPyBudWxsIDogZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gcHJvY2Vzc29yLmZvcm1hdChuZXcgT2JqZWN0W10geyB2YWx1ZSB9LCBuZXcgU3RyaW5nQnVmZmVyKCksCi0JCQkJbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZVZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7Ci0JCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsKLQkJfQotCQlPYmplY3QgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF0gOiBudWxsOwotCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbAotCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOwotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlPYmplY3QgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF0gOiBudWxsOwotCQlJQ29tbWFuZCBjb21tYW5kID0gZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgY29tbWFuZAotCQkJCS5nZXRMYWJlbCgpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbW1hbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCXJldHVybiBpc0FmZmVjdGluZ0ZlYXR1cmUoKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBZmZlY3RpbmdGZWF0dXJlKE9iamVjdCBldmVudEZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gZXZlbnRGZWF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvcHJvdmlkZXJzL1VNTFN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM2ODhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIgZXh0ZW5kcyBVTUxBYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVTUxTdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIoTGlzdCBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQodmFsdWVzLnRvQXJyYXkobmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXSksCi0JCQkJbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCAhPSBmZWF0dXJlcy5zaXplKCkpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCS5nZXQoaSksIHZhbHVlc1tpXSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCAiU2V0IFZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCWNvbW1hbmQKLQkJCQkJLmNvbXBvc2UoZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXNbaV0pKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCU9iamVjdCBmZWF0dXJlID0gKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCk7Ci0JCQlpZiAoZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxWaWV3UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC9wcm92aWRlcnMvVU1MVmlld1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTkxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3Byb3ZpZGVycy9VTUxWaWV3UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycy5BYnN0cmFjdFZpZXdQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd05hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRm9ya05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5BY3Rpdml0eVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkNvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkNvbnRyb2xGbG93Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkRlY2lzaW9uTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLkZvcmtOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuSW5pdGlhbE5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5Kb2luTm9kZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLk1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5NZXJnZU5vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUyVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3Rvcmllcy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1MVmlld1Byb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWaWV3UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhkaWFncmFtS2luZCkKLQkJCQkmJiBVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldERpYWdyYW1WaXN1YWxJRChzZW1hbnRpY0VsZW1lbnQpICE9IC0xKSB7Ci0JCQlyZXR1cm4gQWN0aXZpdHlWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldE5vZGVWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJaWYgKGNvbnRhaW5lclZpZXcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbAotCQkJCSYmICFVTUxFbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWludCBub2RlVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0VsZW1lbnQsIHNlbWFudGljVHlwZSwgc2VtYW50aWNIaW50KTsKLQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCWNhc2UgQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eUZpbmFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlGaW5hbE5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIE1lcmdlTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gTWVyZ2VOb2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEZvcmtOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gSW5pdGlhbE5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gSW5pdGlhbE5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIERlY2lzaW9uTm9kZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gRGVjaXNpb25Ob2RlTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEpvaW5Ob2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM1ZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGdlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhVU1MRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoc2VtYW50aWNUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWludCBsaW5rVklEID0gVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUpOwotCQlzd2l0Y2ggKGxpbmtWSUQpIHsKLQkJY2FzZSBDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBDb250cm9sRmxvd1ZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3Moc2VtYW50aWNBZGFwdGVyLAotCQkJCWNvbnRhaW5lclZpZXcsIHNlbWFudGljSGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUVsZW1lbnRUeXBlIGdldFNlbWFudGljRWxlbWVudFR5cGUoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIpIHsKLQkJaWYgKHNlbWFudGljQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgc2VtYW50aWNBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDbGFzcyBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJLy8gSGFuZGxlIHVucmVjb2duaXplZCBjaGlsZCBub2RlIGNsYXNzZXMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZjA2ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RmluYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUZpbmFsTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg1KSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJkNzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eUZpbmFsTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlGaW5hbE5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMlZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZWViOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZTJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGUyVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKAotCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQl2aWV3LAotCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDhlMjc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMlZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWY5MDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDQ1MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFyYW1ldGVyTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFyYW1ldGVyTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTkyYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbjJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcnRpdGlvbjJWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEFjdGl2aXR5UGFydGl0aW9uMkVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbk5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50MkVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWUyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyMTQyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlQYXJ0aXRpb25OYW1lMlZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3RvcnkjY3JlYXRlVmlldyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldywgamF2YS5sYW5nLlN0cmluZywgaW50LCBib29sZWFuLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50KQotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNSkpOwotCQlyZXR1cm4gdmlldzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25OYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ2MzhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvbk5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxNTU2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRHJhd2VyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGF5b3V0Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlRpdGxlU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnQyVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudDJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlzZXR1cENvbXBhcnRtZW50VGl0bGUodmlldyk7Ci0JCXNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQodmlldyk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRDb25zdHJhaW50IGNyZWF0ZUxheW91dENvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJvdW5kcygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKFZpZXcgdmlldykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVByZWZlcmVuY2VzKHZpZXcpOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSAoSVByZWZlcmVuY2VTdG9yZSkgZ2V0UHJlZmVyZW5jZXNIaW50KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJLy8gZmlsbCBjb2xvcgotCQlSR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsCi0JCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9GSUxMX0NPTE9SKTsKLQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEZpbGxTdHlsZV9GaWxsQ29sb3IoKSwgRmlndXJlVXRpbGl0aWVzCi0JCQkJLlJHQlRvSW50ZWdlcihmaWxsUkdCKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRUaXRsZShWaWV3IHZpZXcpIHsKLQkJVGl0bGVTdHlsZSB0aXRsZVN0eWxlID0gKFRpdGxlU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRUaXRsZVN0eWxlKCkpOwotCQlpZiAodGl0bGVTdHlsZSAhPSBudWxsKSB7Ci0JCQl0aXRsZVN0eWxlLnNldFNob3dUaXRsZSh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKFZpZXcgdmlldykgewotCQlEcmF3ZXJTdHlsZSBkcmF3ZXJTdHlsZSA9IChEcmF3ZXJTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldERyYXdlclN0eWxlKCkpOwotCQlpZiAoZHJhd2VyU3R5bGUgIT0gbnVsbCkgewotCQkJZHJhd2VyU3R5bGUuc2V0Q29sbGFwc2VkKGZhbHNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGIyMzI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRHJhd2VyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTGF5b3V0Q29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlRpdGxlU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uUGFydGl0aW9uQ2FtcGFydG1lbnRWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNvcnRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbHRlcmluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvblBhcnRpdGlvbkNhbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJc2V0dXBDb21wYXJ0bWVudFRpdGxlKHZpZXcpOwotCQlzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKHZpZXcpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0Q29uc3RyYWludCBjcmVhdGVMYXlvdXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyhWaWV3IHZpZXcpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21QcmVmZXJlbmNlcyh2aWV3KTsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gKElQcmVmZXJlbmNlU3RvcmUpIGdldFByZWZlcmVuY2VzSGludCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIGZpbGwgY29sb3IKLQkJUkdCIGZpbGxSR0IgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLAotCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7Ci0JCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRGaWxsU3R5bGVfRmlsbENvbG9yKCksIEZpZ3VyZVV0aWxpdGllcwotCQkJCS5SR0JUb0ludGVnZXIoZmlsbFJHQikpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50VGl0bGUoVmlldyB2aWV3KSB7Ci0JCVRpdGxlU3R5bGUgdGl0bGVTdHlsZSA9IChUaXRsZVN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGl0bGVTdHlsZSgpKTsKLQkJaWYgKHRpdGxlU3R5bGUgIT0gbnVsbCkgewotCQkJdGl0bGVTdHlsZS5zZXRTaG93VGl0bGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZChWaWV3IHZpZXcpIHsKLQkJRHJhd2VyU3R5bGUgZHJhd2VyU3R5bGUgPSAoRHJhd2VyU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREcmF3ZXJTdHlsZSgpKTsKLQkJaWYgKGRyYXdlclN0eWxlICE9IG51bGwpIHsKLQkJCWRyYXdlclN0eWxlLnNldENvbGxhcHNlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlQYXJ0aXRpb25WaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGM5MzkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVBhcnRpdGlvblZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25OYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5UGFydGl0aW9uVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShBY3Rpdml0eVBhcnRpdGlvbk5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCVVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoQWN0aXZpdHlQYXJ0aXRpb25QYXJ0aXRpb25DYW1wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQWN0aXZpdHlWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTI0MTljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5EaWFncmFtVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5NZWFzdXJlbWVudFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWaWV3RmFjdG9yeSBleHRlbmRzIERpYWdyYW1WaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWdlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgdmlldywgSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KHZpZXcsIHNlbWFudGljQWRhcHRlciwgZGlhZ3JhbUtpbmQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVhc3VyZW1lbnRVbml0IGdldE1lYXN1cmVtZW50VW5pdCgpIHsKLQkJcmV0dXJuIE1lYXN1cmVtZW50VW5pdC5QSVhFTF9MSVRFUkFMOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0NvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhZjBjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdExhYmVsVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xGbG93TmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmlldyBjcmVhdGVWaWV3KElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBWaWV3IGNvbnRhaW5lclZpZXcsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsIGJvb2xlYW4gcGVyc2lzdGVkLAotCQkJUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCkgewotCQlOb2RlIHZpZXcgPSAoTm9kZSkgc3VwZXIuY3JlYXRlVmlldyhzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNIaW50LCBpbmRleCwgcGVyc2lzdGVkLCBwcmVmZXJlbmNlc0hpbnQpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdmlldy5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCUlNYXBNb2RlIG1hcE1vZGUgPSBNZWFzdXJlbWVudFVuaXRIZWxwZXIuZ2V0TWFwTW9kZShjb250YWluZXJWaWV3Ci0JCQkJLmdldERpYWdyYW0oKS5nZXRNZWFzdXJlbWVudFVuaXQoKSk7Ci0JCWxvY2F0aW9uLnNldFgobWFwTW9kZS5EUHRvTFAoMCkpOwotCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd1ZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvQ29udHJvbEZsb3dWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzRkYjc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Db250cm9sRmxvd1ZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UuQWJzdHJhY3RFTUZPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLkxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlN0cmluZ1N0YXRpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUudXRpbC5UcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlEZWJ1Z09wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJlbmRwb2ludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250cm9sRmxvd1ZpZXdGYWN0b3J5IGV4dGVuZHMgQ29ubmVjdGlvblZpZXdGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19OT1RJRklDQVRJT05TLCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fVFJJR0dFUlMsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm91dGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3LmZhY3Rvcmllcy5WaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogT3ZlcnJpZGUgY3JlYXRlVmlldyBzaW5jZSB0aGVyZSBpcyBhIGJ1ZyBpbiAKLQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeS5qYXZhCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhmaW5hbCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCWZpbmFsIFZpZXcgY29udGFpbmVyVmlldywgZmluYWwgU3RyaW5nIHNlbWFudGljSGludCwKLQkJCWZpbmFsIGludCBpbmRleCwgZmluYWwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlmaW5hbCBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0KLQkJc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0KLQkJZmluYWwgRWRnZSBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlKCk7Ci0JCUxpc3Qgc3R5bGVzID0gY3JlYXRlU3R5bGVzKGVkZ2UpOwotCQlpZiAoc3R5bGVzLnNpemUoKSA+IDApIHsKLQkJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkQWxsKHN0eWxlcyk7Ci0JCX0KLQotCQlCZW5kcG9pbnRzIGJlbmRQb2ludHMgPSBjcmVhdGVCZW5kcG9pbnRzKCk7Ci0JCWlmIChiZW5kUG9pbnRzICE9IG51bGwpIHsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kUG9pbnRzKTsKLQkJfQotCi0JCUVPYmplY3Qgc2VtYW50aWNFbCA9IHNlbWFudGljQWRhcHRlciA9PSBudWxsID8gbnVsbAotCQkJCTogKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoc2VtYW50aWNFbCA9PSBudWxsKQotCQkJLy8gZW5mb3JjZSBhIHNldCB0byBOVUxMCi0JCQllZGdlLnNldEVsZW1lbnQobnVsbCk7Ci0JCWVsc2UgaWYgKHJlcXVpcmVzRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcpKSB7Ci0JCQllZGdlLnNldEVsZW1lbnQoc2VtYW50aWNFbCk7Ci0JCX0KLQotCQllZGdlLnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQotCQkvLyBkZWNvcmF0ZSB2aWV3IGFzc3VtZXMgdGhlIHZpZXcgaGFkIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgc28gCi0JCS8vIHdlIGhhZCB0byBjYWxsIGluc2VydCBjaGlsZCBiZWZvcmUgY2FsbGluZyBkZWNvcmF0ZSB2aWV3Ci0JCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBpbmRleCwgcGVyc2lzdGVkKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXRFZGl0aW5nRG9tYWluKHNlbWFudGljRWwsCi0JCQkJY29udGFpbmVyVmlldyk7Ci0KLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNVblByb3RlY3RlZFNpbGVudFRyYW5zYWN0aW9uSW5Qcm9ncmVzcyhkb21haW4pKSB7Ci0JCQkJLy8gZGVjb3JhdGUgdmlldyBoYWQgdG8gcnVuIGFzIGEgc2lsZW50IG9wZXJhdGlvbiBvdGhlciB3aXNlCi0JCQkJLy8gaXQgd2lsbCBnZW5lcmF0ZSB0b28gbWFueSBldmVudHMKLQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKAotCQkJCQkJZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLCBvcHRpb25zKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS5jYXRjaGluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlEZWJ1Z09wdGlvbnMuRVhDRVBUSU9OU19DQVRDSElORywKLQkJCQkJCQlnZXRDbGFzcygpLCAiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxvZy53YXJuaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSVN0YXR1c0NvZGVzLklHTk9SRURfRVhDRVBUSU9OX1dBUk5JTkcsCi0JCQkJCQkJImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGI0ZDNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlY2lzaW9uTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9EZWNpc2lvbk5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzc3YWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0RlY2lzaW9uTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKERlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRm9ya05vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0ZvcmtOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlMGUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvRm9ya05vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0luaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0N2Y3YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL0luaXRpYWxOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RMYWJlbFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Mb2NhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg1KSk7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSW5pdGlhbE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTA3NmJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Jbml0aWFsTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbE5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKEluaXRpYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyhVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5LmdldFR5cGUoSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Kb2luTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvSm9pbk5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWZlM2Q0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9Kb2luTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkpvaW5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzRmMTc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkJhc2ljTm9kZVZpZXdGYWN0b3J5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lcmdlTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9NZXJnZU5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDBjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL01lcmdlTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZShzZW1hbnRpY0FkYXB0ZXIsIHZpZXcsCi0JCQkJVU1MVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKE1lcmdlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZjZhZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUyVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuVU1MVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMlZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmMzJmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQucGFydC5VTUxWaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzVmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkKLQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCXNlbWFudGljQWRhcHRlciwKLQkJCQkJCXZpZXcsCi0JCQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTM0YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMlZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MjllZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM1ZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWQvdmlldy9mYWN0b3JpZXMvU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2JiN2U4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkL3ZpZXcvZmFjdG9yaWVzL1N0cnVjdHVyZWRBY3Rpdml0eU5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzYxNmRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZC92aWV3L2ZhY3Rvcmllcy9TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LlVNTFZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IFVNTFZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlFZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoVU1MVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCWdldFZpZXdTZXJ2aWNlKCkuY3JlYXRlTm9kZSgKLQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJdmlldywKLQkJCQlVTUxWaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VHlwZShTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjVkZjZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBEZWJ1Z2dpbmcgb3B0aW9ucyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCBwbHVnLWluCi0KLSMgVHVybiBvbiBnZW5lcmFsIGRlYnVnZ2luZyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvZGVidWc9ZmFsc2UKLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBvZiB2aXN1YWxJRCBwcm9jZXNzaW5nCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvZGVidWcvdmlzdWFsSUQ9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNzZmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTZmYzFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuc2VydmljZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLAotIG9yZy5lY2xpcHNlLmdlZjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZSwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllcywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWE7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5kcmF3MmQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTJkYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9UYXNrRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZGlhZ3JhbS9UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9kaWFncmFtL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2RpYWdyYW0vV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2RsY2wxNi9yZXNldF9kaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2RsY2wxNi9yZXNldF9kaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczZTY3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kbGNsMTYvcmVzZXRfZGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kdG9vbDE2L0FEREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9kdG9vbDE2L0FEREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDRjMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZWxjbDE2L3Jlc2V0X2RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL2Z1bGwvZWxjbDE2L3Jlc2V0X2RpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTljOGM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2VsY2wxNi9yZXNldF9kaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2V0b29sMTYvQURERWRpdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9pY29ucy9mdWxsL2V0b29sMTYvQURERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2NzkwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjc2YTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL2ljb25zL3dpemJhbi9OZXdNb2RlbFdpemFyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmODVmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzg5MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTk8gTkVFRCBUTyBUUkFOU0xBVEUgRk9MTE9XSU5HIFBST1BFUlRJRVMsIFNJTkNFIFdFIERPTidUIFVTRSBJVCBGT1IgVEhJUyBSRUxFQVNFCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVE9ETzogbWFudWFsbHkgcHV0IGtleXMgYW5kIHZhbHVlcwotc0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU9RXJyb3IKLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1GYWlsZWQgdG8gbG9hZCBtb2RlbCBmaWxlIHswfQotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwgZmlsZXMKLURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtQ29tbWFuZExhYmVsPUNyZWF0aW5nIGRpYWdyYW0gYW5kIG1vZGVsCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9pc01vZGlmaWFibGU9VXBkYXRpbmcgY2FjaGUgZmFpbGVkCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ9RmFpbGVkIHRvIHJlZnJlc2ggaGllcmFyY2h5IGZvciBjaGFuZ2VkIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yPXsxfQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcj1VbmFibGUgdG8gbG9hZCBkaWFncmFtIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3I9RGlhZ3JhbSBpcyBub3QgcHJlc2VudCBpbiByZXNvdXJjZQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvcj1FcnJvciBsb2FkaW5nIGRpYWdyYW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcj1UaGUgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrPVNhdmluZyBkaWFncmFtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaz1TYXZpbmcgezB9Ci1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZT1Nb2RlbCBmaWxlIGxvYWRpbmcgZmFpbGVkCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlPUluaXRpYWxpemUgbmV3IHswfSBkaWFncmFtIGZpbGUKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlPVNlbGVjdCBkb21haW4gbW9kZWwKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lPUluaXRpYWxpemUgbmV3IGRpYWdyYW0gZmlsZQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlPURpYWdyYW0gZmlsZQotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgZGlhZ3JhbSBiYXNlZCBvbiB7MH0gbW9kZWwgY29udGVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlPURpYWdyYW0gcm9vdCBlbGVtZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VEZXNjcmlwdGlvbj1TZWxlY3Qgc2VtYW50aWMgbW9kZWwgZWxlbWVudCB0byBiZSBkZXBpY3RlZCBvbiBkaWFncmFtCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZT1TZWxlY3QgZGlhZ3JhbSByb290IGVsZW1lbnQ6Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2U9RGlhZ3JhbSByb290IGVsZW1lbnQgaXMgbm90IHNlbGVjdGVkCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZT1JbnZhbGlkIGRpYWdyYW0gcm9vdCBlbGVtZW50IGlzIHNlbGVjdGVkCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kPUluaXRpYWxpemluZyBkaWFncmFtIGNvbnRlbnRzCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5jb3JyZWN0Um9vdEVycm9yPUluY29ycmVjdCBtb2RlbCBvYmplY3Qgc3RvcmVkIGFzIGEgcm9vdCByZXNvdXJjZSBvYmplY3QKLU5vZGVzMUdyb3VwX3RpdGxlPU5vZGVzCi1MaW5rczJHcm91cF90aXRsZT1MaW5rcwotUm9sZU5vZGUxQ3JlYXRpb25Ub29sX3RpdGxlPVJvbGVOb2RlCi1Sb2xlTm9kZTFDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFJvbGVOb2RlCi1Sb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfdGl0bGU9Um9sZVRhc2tDb21wb3NpdGUKLVJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgUm9sZVRhc2tDb21wb3NpdGUKLVRhc2tOb2RlM0NyZWF0aW9uVG9vbF90aXRsZT1UYXNrTm9kZQotVGFza05vZGUzQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBUYXNrTm9kZQotV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfdGl0bGU9V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZQotV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfZGVzYz1DcmVhdGUgbmV3IFdvcmtQcm9kdWNOb2RlCi1Xb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfdGl0bGU9V29ya1Byb2R1Y3RDb21wb3NpdGUKLVdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUKLUxpbmsxQ3JlYXRpb25Ub29sX3RpdGxlPUxpbmsKLUxpbmsxQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyBsaW5rCi1Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1Sb2xlVGFza0NvbXBhcnRtZW50Ci1Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydF90aXRsZT1Xb3JrUHJvZHVjdENvbXBhcnRtZW50Ci0KLUNvbW1hbmROYW1lX09wZW5EaWFncmFtPU9wZW4gRGlhZ3JhbQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4M2IzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgbW9kZWxJRD0iQUREIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJhZGQiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Uk9MRU5PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUm9sZU5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZSb2xlTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlJvbGVOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iVGFza05vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJUYXNrTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBUYXNrTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFRhc2tOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldExpbmVXaWR0aCgwKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFRBU0tOT0RFRklHVVJFX0JBQ0smI3hEOyYjeEE7JiN4RDsmI3hBOyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDsmbHQ7Li4uPiZxdW90Oyk7JiN4RDsmI3hBOyYjeDk7JiN4OTtmaWdfMC5zZXRGb250KCYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTtUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZUYXNrTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZlRhc2tOb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmVGFza05vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgVEFTS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1Rhc2tOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPGNoaWxkTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjIwMDMiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVGaWd1cmUoKSB7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyYjeEQ7JiN4QTsmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEQ7JiN4QTtmaWdfMC5zZXRUZXh0KCZxdW90OyZsdDsuLi4+JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZpZ18wLnNldEZvbnQoJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5O1dPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsgJiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hEOyYjeEE7JiN4OTsmI3g5O2ZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4RDsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBO30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udCBXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAzIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5Ij4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46UGFyZW50QXNzaWduZWRWaWV3bWFwIgotICAgICAgICAgICAgZ2V0dGVyTmFtZT0iZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCAvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDUpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFZlcnRpY2FsKGZhbHNlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbCh0cnVlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDIiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZU5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJUYXNrTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2tOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWNOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJMaW5rcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgbGluayIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbgotICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCIKLSAgICAgIG5hbWU9IkFjdGl2aXR5IERldGFpbCBEaWFncmFtIFBsdWdpbiIKLSAgICAgIHByb3ZpZGVyPSJFUEYiCi0gICAgICBwcmludGluZ0VuYWJsZWQ9InRydWUiCi0gICAgICBhY3RpdmF0b3JDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvciIKLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIvPgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLyIvPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZncmFwaCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mZ3JhcGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTI1YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZncmFwaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdyYXBoOkNhbnZhcyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdyYXBoPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dyYXBoaWNhbERlZmluaXRpb24iIG5hbWU9Im1vZGVsIj4KLSAgPGZpZ3VyZXMKLSAgICAgIG5hbWU9IkRlZmF1bHQiPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlJvbGVOb2RlIgotICAgICAgICBuYW1lPSJSb2xlTm9kZUZpZ3VyZSIKLSAgICAgICAgb3V0bGluZT0iZmFsc2UiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlJvbGVOb2RlTmFtZSIKLSAgICAgICAgICBuYW1lPSJSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgdGV4dD0iJmx0Oy4uLj4iPgotICAgICAgICA8Zm9udAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkJhc2ljRm9udCIKLSAgICAgICAgICAgIGZhY2VOYW1lPSJBcmlhbCIKLSAgICAgICAgICAgIGhlaWdodD0iOCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIxNTYiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJlY3RhbmdsZSIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgIG5hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIj4KLSAgICAgIDxsYXlvdXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Rmxvd0xheW91dCIKLSAgICAgICAgICBmb3JjZVNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgbWFqb3JBbGlnbm1lbnQ9IkNFTlRFUiIKLSAgICAgICAgICBtaW5vckFsaWdubWVudD0iQ0VOVEVSIgotICAgICAgICAgIG1pbm9yU3BhY2luZz0iMjAiLz4KLSAgICAgIDxiYWNrZ3JvdW5kQ29sb3IKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UkdCQ29sb3IiCi0gICAgICAgICAgcmVkPSIyNTUiCi0gICAgICAgICAgZ3JlZW49IjI1NSIKLSAgICAgICAgICBibHVlPSIxNTYiLz4KLSAgICAgIDxib3JkZXIKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TWFyZ2luQm9yZGVyIi8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IlRhc2tOb2RlIgotICAgICAgICBuYW1lPSJUYXNrTm9kZUZpZ3VyZSIKLSAgICAgICAgb3V0bGluZT0iZmFsc2UiCi0gICAgICAgIGxpbmVXaWR0aD0iMCI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iVGFza05vZGVOYW1lIgotICAgICAgICAgIG5hbWU9IlRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICB0ZXh0PSImbHQ7Li4uPiI+Ci0gICAgICAgIDxmb250Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6QmFzaWNGb250IgotICAgICAgICAgICAgZmFjZU5hbWU9IkFyaWFsIgotICAgICAgICAgICAgaGVpZ2h0PSI4Ii8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGJhY2tncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSR0JDb2xvciIKLSAgICAgICAgICByZWQ9IjI1NSIKLSAgICAgICAgICBncmVlbj0iMjU1IgotICAgICAgICAgIGJsdWU9IjE1NiIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIgotICAgICAgICBvdXRsaW5lPSJmYWxzZSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iV29ya1Byb2R1Y3ROb2RlTmFtZSIKLSAgICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9IiZsdDsuLi4+Ij4KLSAgICAgICAgPGZvbnQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpCYXNpY0ZvbnQiCi0gICAgICAgICAgICBmYWNlTmFtZT0iQXJpYWwiCi0gICAgICAgICAgICBoZWlnaHQ9IjgiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMjA1Ii8+Ci0gICAgPC9maWd1cmVzPgotICAgIDxmaWd1cmVzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpSZWN0YW5nbGUiCi0gICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSI+Ci0gICAgICA8bGF5b3V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkZsb3dMYXlvdXQiCi0gICAgICAgICAgdmVydGljYWw9InRydWUiCi0gICAgICAgICAgZm9yY2VTaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgIG1ham9yQWxpZ25tZW50PSJDRU5URVIiCi0gICAgICAgICAgbWlub3JBbGlnbm1lbnQ9IkNFTlRFUiIKLSAgICAgICAgICBtaW5vclNwYWNpbmc9IjIwIi8+Ci0gICAgICA8YmFja2dyb3VuZENvbG9yCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlJHQkNvbG9yIgotICAgICAgICAgIHJlZD0iMjU1IgotICAgICAgICAgIGdyZWVuPSIyNTUiCi0gICAgICAgICAgYmx1ZT0iMjA1Ii8+Ci0gICAgICA8Ym9yZGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOk1hcmdpbkJvcmRlciIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UG9seWxpbmVDb25uZWN0aW9uIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJMaW5rIgotICAgICAgICBuYW1lPSJMaW5rRmlndXJlIgotICAgICAgICB0YXJnZXREZWNvcmF0aW9uPSJPcGVuQXJyb3ciPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lRGVjb3JhdGlvbiIKLSAgICAgICAgICBuYW1lPSJPcGVuQXJyb3ciPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iMSIvPgotICAgICAgICA8dGVtcGxhdGUvPgotICAgICAgICA8dGVtcGxhdGUKLSAgICAgICAgICAgIHg9Ii0xIgotICAgICAgICAgICAgeT0iLTEiLz4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6TGFiZWwiCi0gICAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTGlua05hbWVMYWJlbCIKLSAgICAgICAgICBuYW1lPSJMaW5rTmFtZUZpZ3VyZSIvPgotICAgICAgPGZvcmVncm91bmRDb2xvcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpDb25zdGFudENvbG9yIgotICAgICAgICAgIHZhbHVlPSJibGFjayIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6Q3VzdG9tRmlndXJlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJSb2xlVGFza0NvbXBhcnRtZW50IFdvcmtQcm9kdWN0Q29tcGFydG1lbnQiCi0gICAgICAgIG5hbWU9IlJlc2l6ZWFibGVDb21wYXJ0bWVudEZpZ3VyZUV4IgotICAgICAgICBxdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSIKLSAgICAgICAgYnVuZGxlTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzIi8+Ci0gIDwvZmlndXJlcz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJSb2xlTm9kZSIKLSAgICAgIGZpZ3VyZT0iUm9sZU5vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJUYXNrTm9kZSIKLSAgICAgIGZpZ3VyZT0iVGFza05vZGVGaWd1cmUiLz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgZmlndXJlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICBmaWd1cmU9IlJvbGVUYXNrQ29tcG9zaXRlRmlndXJlIi8+Ci0gIDxub2RlcwotICAgICAgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICBmaWd1cmU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIi8+Ci0gIDxjb25uZWN0aW9ucwotICAgICAgbmFtZT0iTGluayIKLSAgICAgIGZpZ3VyZT0iTGlua0ZpZ3VyZSIvPgotICA8Y29tcGFydG1lbnRzCi0gICAgICBuYW1lPSJSb2xlVGFza0NvbXBhcnRtZW50IgotICAgICAgZmlndXJlPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIvPgotICA8Y29tcGFydG1lbnRzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdENvbXBhcnRtZW50IgotICAgICAgZmlndXJlPSJSZXNpemVhYmxlQ29tcGFydG1lbnRGaWd1cmVFeCIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJSb2xlTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlJvbGVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJUYXNrTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9IlRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgIGVsZW1lbnRJY29uPSJmYWxzZSIvPgotICA8bGFiZWxzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lIgotICAgICAgZmlndXJlPSJXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9IkxpbmtOYW1lTGFiZWwiCi0gICAgICBmaWd1cmU9IkxpbmtOYW1lRmlndXJlIgotICAgICAgZWxlbWVudEljb249ImZhbHNlIi8+Ci08L2dtZmdyYXBoOkNhbnZhcz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQuZ21mbWFwIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZjM2YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncyIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVUYXNrQ29tcG9zaXRlIi8+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vUm9sZU5vZGUiLz4KLSAgICAgICAgICA8bGFiZWxNYXBwaW5ncz4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZU5vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1Rhc2tOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1Rhc2tOb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMiIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjVGFza05vZGUiLz4KLSAgICAgICAgPC9vd25lZENoaWxkPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxjb21wYXJ0bWVudHM+Ci0gICAgICAgIDxjb21wYXJ0bWVudAotICAgICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1JvbGVUYXNrQ29tcGFydG1lbnQiLz4KLSAgICAgIDwvY29tcGFydG1lbnRzPgotICAgIDwvb3duZWRDaGlsZD4KLSAgPC9ub2Rlcz4KLSAgPG5vZGVzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICA8b3duZWRDaGlsZD4KLSAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuNCIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICA8Y2hpbGRyZW4+Ci0gICAgICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxvd25lZENoaWxkPgotICAgICAgICAgIDxkb21haW5NZXRhRWxlbWVudAotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICAgIDxsYWJlbE1hcHBpbmdzPgotICAgICAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdE5vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4zIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgIDwvb3duZWRDaGlsZD4KLSAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICA8Y29tcGFydG1lbnRzPgotICAgICAgICA8Y29tcGFydG1lbnQKLSAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNXb3JrUHJvZHVjdENvbXBhcnRtZW50Ii8+Ci0gICAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsiLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjTGlua05hbWVMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjbW9kZWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURldGFpbERpYWdyYW0iLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZnRvb2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkLmdtZnRvb2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNjFlNDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZC5nbWZ0b29sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZ0b29sOlRvb2xSZWdpc3RyeSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZnRvb2w9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvVG9vbERlZmluaXRpb24iPgotICA8cGFsZXR0ZT4KLSAgICA8dG9vbHMKLSAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6VG9vbEdyb3VwIgotICAgICAgICB0aXRsZT0iTm9kZXMiCi0gICAgICAgIGNvbGxhcHNpYmxlPSJ0cnVlIj4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iUm9sZU5vZGUiCi0gICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZU5vZGUiPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgICAgPGxhcmdlSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICA8L3Rvb2xzPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlVGFza0NvbXBvc2l0ZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IlRhc2tOb2RlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFRhc2tOb2RlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICAgIDx0b29scwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjTm9kZSI+Ci0gICAgICAgIDxzbWFsbEljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgICA8bGFyZ2VJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpEZWZhdWx0SW1hZ2UiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6RGVmYXVsdEltYWdlIi8+Ci0gICAgICAgIDxsYXJnZUljb24KLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkRlZmF1bHRJbWFnZSIvPgotICAgICAgPC90b29scz4KLSAgICA8L3Rvb2xzPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJMaW5rcyIKLSAgICAgICAgY29sbGFwc2libGU9InRydWUiPgotICAgICAgPHRvb2xzCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIHRpdGxlPSJMaW5rIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGxpbmsiLz4KLSAgICA8L3Rvb2xzPgotICA8L3BhbGV0dGU+Ci08L2dtZnRvb2w6VG9vbFJlZ2lzdHJ5PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDIuZ21mZ2VuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTc3MTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDU5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCIKLSAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgdmFsaWRhdGlvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJSb2xlTm9kZUNyZWF0ZUNvbW1hbmQiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJSb2xlTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlJvbGVOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFJvbGVOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgUm9sZU5vZGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLJiN4QTspOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBOyYjeEE7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHJvbGVOb2RlTmFtZUZpZ3VyZTAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4QTtyb2xlTm9kZU5hbWVGaWd1cmUwLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEE7JiN4QTtyb2xlTm9kZU5hbWVGaWd1cmUwLnNldEZvbnQoUm9sZU5vZGVOYW1lRmlndXJlX0ZPTlQpOyYjeEE7JiN4QTsmI3hBOyYjeEE7dGhpcy5hZGQocm9sZU5vZGVOYW1lRmlndXJlMCk7JiN4QTtzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUocm9sZU5vZGVOYW1lRmlndXJlMCk7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlJvbGVOb2RlTmFtZUZpZ3VyZTsgJiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmUm9sZU5vZGVOYW1lRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5OyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hBOyYjeDk7JiN4OTtmUm9sZU5vZGVOYW1lRmlndXJlID0gZmlnOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgUk9MRU5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgUm9sZU5vZGVOYW1lRmlndXJlX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1JvbGVOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJUYXNrTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJUYXNrTm9kZUNyZWF0ZUNvbW1hbmQiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJUYXNrTm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IlRhc2tOb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFRhc2tOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgVGFza05vZGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDApOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihUQVNLTk9ERUZJR1VSRV9CQUNLJiN4QTspOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBOyYjeEE7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHRhc2tOb2RlTmFtZUZpZ3VyZTAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4QTt0YXNrTm9kZU5hbWVGaWd1cmUwLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEE7JiN4QTt0YXNrTm9kZU5hbWVGaWd1cmUwLnNldEZvbnQoVGFza05vZGVOYW1lRmlndXJlX0ZPTlQpOyYjeEE7JiN4QTsmI3hBOyYjeEE7dGhpcy5hZGQodGFza05vZGVOYW1lRmlndXJlMCk7JiN4QTtzZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUodGFza05vZGVOYW1lRmlndXJlMCk7JiN4QTsmI3hBOyYjeDk7fSYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZlRhc2tOb2RlTmFtZUZpZ3VyZTsgJiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBmVGFza05vZGVOYW1lRmlndXJlOyYjeEE7JiN4OTt9JiN4QTsmI3g5OyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hBOyYjeDk7JiN4OTtmVGFza05vZGVOYW1lRmlndXJlID0gZmlnOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hBOyYjeDk7JiN4OTtteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBO30mI3hBOyYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3N0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgVEFTS05PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDE1Nik7JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgVGFza05vZGVOYW1lRmlndXJlX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkQmFja2dyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1Rhc2tOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iVGFza05vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIj4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgZml4ZWRGb250PSJ0cnVlIi8+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9jaGlsZE5vZGVzPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAzIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmVYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRMaW5lV2lkdGgoMSk7JiN4QTt0aGlzLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTsmI3g5O3RoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hBOyYjeEE7JiN4QTsmI3hBO29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCB3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hBO3dvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUwLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEE7JiN4QTt3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMC5zZXRGb250KFdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmVfRk9OVCk7JiN4QTsmI3hBOyYjeEE7JiN4QTt0aGlzLmFkZCh3b3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlMCk7JiN4QTtzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKHdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUwKTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsgJiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hBOyYjeDk7JiN4OTtmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IobnVsbCwgMjU1LCAyNTUsIDIwNSk7JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMyIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAgLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIgotICAgICAgICBjb21wYXJ0bWVudHM9Ii8vQGRpYWdyYW0vQGNvbXBhcnRtZW50cy4wIgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtwdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3hBOyYjeEE7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBsYXlvdXRUaGlzID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuJiN4QTtBTElHTl9DRU5URVImI3hBOyYjeEE7JiN4QTspOyYjeEE7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0U3BhY2luZyg1KTsmI3hBOyYjeDk7bGF5b3V0VGhpcy5zZXRWZXJ0aWNhbChmYWxzZSk7JiN4QTsmI3hBOyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dFRoaXMpOyYjeEE7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZSh0cnVlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKCkmI3hBOyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGNoaWxkTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNyZWF0ZUNvbW1hbmRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBsYXlvdXRUeXBlPSJUT09MQkFSX0xBWU9VVCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4QTsmI3hBOyYjeDk7b3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbGF5b3V0VGhpcyA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LiYjeEE7QUxJR05fQ0VOVEVSJiN4QTsmI3hBOyYjeEE7KTsmI3hBOyYjeEE7JiN4OTtsYXlvdXRUaGlzLnNldFNwYWNpbmcoNSk7JiN4QTsmI3g5O2xheW91dFRoaXMuc2V0VmVydGljYWwodHJ1ZSk7JiN4QTsmI3hBOyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dFRoaXMpOyYjeEE7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGaWxsKHRydWUpOyYjeEE7dGhpcy5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0T3V0bGluZSh0cnVlKTsmI3hBO3RoaXMuc2V0T3V0bGluZVhPUihmYWxzZSk7JiN4QTt0aGlzLnNldExpbmVXaWR0aCgxKTsmI3hBO3RoaXMuc2V0TGluZVN0eWxlKG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljcy5MSU5FX1NPTElEKTsmI3hBOyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyYjeEE7KTsmI3hBO3RoaXMuc2V0Qm9yZGVyKG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyKCkmI3hBOyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOy8qKiYjeEE7ICogQGdlbmVyYXRlZCYjeEE7ICovJiN4QTtzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAyMDUpOyYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtWaWV3RmFjdG9yeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTGlua0NyZWF0ZUNvbW1hbmQiCi0gICAgICAgIHJlb3JpZW50Q29tbWFuZENsYXNzTmFtZT0iTGlua1Jlb3JpZW50Q29tbWFuZCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJMaW5rRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKHRydWUpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTt0aGlzLnNldEZvcmVncm91bmRDb2xvcihvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHMuYmxhY2spOyYjeEE7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdGF0YWJsZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hBO2RmLnNldEZpbGwodHJ1ZSk7JiN4QTtkZi5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO2RmLnNldE91dGxpbmUodHJ1ZSk7JiN4QTtkZi5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO2RmLnNldExpbmVXaWR0aCgxKTsmI3hBO2RmLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMSkmI3hBOyk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMCkmI3hBOyk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7KTsmI3hBO2RmLnNldFRlbXBsYXRlKHBsKTsmI3hBO2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNykmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSYjeEE7KTsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEZvcmVncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlR5cGVMaW5rTW9kZWxGYWNldCI+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgICAgIDxzb3VyY2VNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvc291cmNlIi8+Ci0gICAgICAgIDx0YXJnZXRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvdGFyZ2V0Ii8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDQiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua05hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPGNvbXBhcnRtZW50cwotICAgICAgICB2aXN1YWxJRD0iNTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcGFydG1lbnQiCi0gICAgICAgIGNhbkNvbGxhcHNlPSJmYWxzZSIKLSAgICAgICAgbmVlZHNUaXRsZT0iZmFsc2UiCi0gICAgICAgIG5vZGU9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlIj4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgIDwvY29tcGFydG1lbnRzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJOb2RlcyIKLSAgICAgICAgICBjb2xsYXBzZT0idHJ1ZSI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlTm9kZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVOb2RlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlRhc2tOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgVGFza05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y05vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9IkxpbmtzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkxpbmsiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBsaW5rIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgICA8cHJlZmVyZW5jZVBhZ2VzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uZ2VuZXJhbCIKLSAgICAgICAgbmFtZT0iRGlhZ3JhbSBEaWFncmFtIj4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5hcHBlYXJhbmNlIgotICAgICAgICAgIG5hbWU9IkFwcGVhcmFuY2UiCi0gICAgICAgICAga2luZD0iQXBwZWFyYW5jZSIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmNvbm5lY3Rpb25zIgotICAgICAgICAgIG5hbWU9IkNvbm5lY3Rpb25zIgotICAgICAgICAgIGtpbmQ9IkNvbm5lY3Rpb25zIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucHJpbnRpbmciCi0gICAgICAgICAgbmFtZT0iUHJpbnRpbmciCi0gICAgICAgICAga2luZD0iUHJpbnRpbmciLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5ydWxlcnNBbmRHcmlkIgotICAgICAgICAgIG5hbWU9IlJ1bGVycyBBbmQgR3JpZCIKLSAgICAgICAgICBraW5kPSJSdWxlcnNBbmRHcmlkIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucGF0aG1hcHMiCi0gICAgICAgICAgbmFtZT0iUGF0aG1hcHMiCi0gICAgICAgICAga2luZD0iUGF0aG1hcHMiLz4KLSAgICA8L3ByZWZlcmVuY2VQYWdlcz4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luLz4KLSAgPGVkaXRvci8+Ci0gIDxuYXZpZ2F0b3I+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbSIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4xIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0iCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjEiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGdyb3VwTmFtZT0ibGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0idGFyZ2V0IgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtUYXJnZXROYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9ImluY29taW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL2luY29taW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJ0YXJnZXQiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1RhcmdldE5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0iaW5jb21pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvaW5jb21pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4yIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJpbl9zb3VyY2UiCi0gICAgICAgIGdyb3VwTmFtZT0ic291cmNlIgotICAgICAgICBncm91cEljb249Imljb25zL2xpbmtTb3VyY2VOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0ib3V0X3RhcmdldCIKLSAgICAgICAgZ3JvdXBOYW1lPSJvdXRnb2luZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9vdXRnb2luZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgcmVmZXJlbmNlVHlwZT0iaW5fc291cmNlIgotICAgICAgICBncm91cE5hbWU9InNvdXJjZSIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rU291cmNlTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMiIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9Im91dF90YXJnZXQiCi0gICAgICAgIGdyb3VwTmFtZT0ib3V0Z29pbmcgbGlua3MiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvb3V0Z29pbmdMaW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICA8L25hdmlnYXRvcj4KLSAgPHByb3BlcnR5U2hlZXQ+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iYXBwZWFyYW5jZSIvPgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImRpYWdyYW0iLz4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlbkN1c3RvbVByb3BlcnR5VGFiIgotICAgICAgICBpRD0iZG9tYWluIgotICAgICAgICBsYWJlbD0iQ29yZSI+Ci0gICAgICA8ZmlsdGVyCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlVGFiRmlsdGVyIj4KLSAgICAgICAgPHR5cGVzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc8L3R5cGVzPgotICAgICAgICA8dHlwZXM+b3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0PC90eXBlcz4KLSAgICAgICAgPGdlbmVyYXRlZFR5cGVzPmFic3RyYWN0TmF2aWdhdG9ySXRlbTwvZ2VuZXJhdGVkVHlwZXM+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICA8L3RhYnM+Ci0gIDwvcHJvcGVydHlTaGVldD4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9hZGQyLmdtZm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRjZjc2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMi5nbWZtYXAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncy8yLjAiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgIDx0b29sCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlVGFza0NvbXBvc2l0ZSIvPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1JvbGVOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZU5vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4wIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNSb2xlTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuPgotICAgICAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8b3duZWRDaGlsZD4KLSAgICAgICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1Rhc2tOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjVGFza05vZGVOYW1lIi8+Ci0gICAgICAgICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICAgICAgPHRvb2wKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6Q3JlYXRpb25Ub29sIgotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy4yIi8+Ci0gICAgICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgICAgIGhyZWY9ImFkZC5nbWZncmFwaCNUYXNrTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cz4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjUm9sZVRhc2tDb21wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bm9kZXM+Ci0gICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDxvd25lZENoaWxkPgotICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0Q29tcG9zaXRlIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlL0B0b29scy4wL0B0b29scy40Ii8+Ci0gICAgICA8ZGlhZ3JhbU5vZGUKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgIDxjaGlsZHJlbj4KLSAgICAgICAgPGNvbnRhaW5tZW50RmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPG93bmVkQ2hpbGQ+Ci0gICAgICAgICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIi8+Ci0gICAgICAgICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIj4KLSAgICAgICAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3ROb2RlTmFtZSIvPgotICAgICAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgICAgPC9sYWJlbE1hcHBpbmdzPgotICAgICAgICAgIDx0b29sCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICAgICAgaHJlZj0iYWRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMyIvPgotICAgICAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICA8L293bmVkQ2hpbGQ+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNvbXBhcnRtZW50cz4KLSAgICAgICAgPGNvbXBhcnRtZW50Ci0gICAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIvPgotICAgICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rIi8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjTGlua05hbWVMYWJlbCIvPgotICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICA8dG9vbAotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgIGhyZWY9ImFkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjEvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0iYWRkLmdtZmdyYXBoI0xpbmsiLz4KLSAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3NvdXJjZSIvPgotICAgIDxsaW5rTWV0YUZlYXR1cmUKLSAgICAgICAgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rL3RhcmdldCIvPgotICA8L2xpbmtzPgotICA8ZGlhZ3JhbT4KLSAgICA8ZGlhZ3JhbUNhbnZhcwotICAgICAgICBocmVmPSJhZGQuZ21mZ3JhcGgjbW9kZWwiLz4KLSAgICA8ZG9tYWluTW9kZWwKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvIi8+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURldGFpbERpYWdyYW0iLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJhZGQuZ21mdG9vbCMvL0BwYWxldHRlIi8+Ci0gIDwvZGlhZ3JhbT4KLTwvZ21mbWFwOk1hcHBpbmc+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMy5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvbW9kZWwvYWRkMy5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MWUzNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2FkZDMuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbC8yLjAiIHBhY2thZ2VOYW1lUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgbW9kZWxJRD0iQUREIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ4bWkiCi0gICAgdGVtcGxhdGVEaXJlY3Rvcnk9IiI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIvPgotICAgIDxjaGlsZE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIyMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iUm9sZU5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJSb2xlTm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjb250YWluZXJzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZU5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlTm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVOb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7Uk9MRU5PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmUm9sZU5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZSb2xlTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlJvbGVOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFJPTEVOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkuZ2V0Q3VycmVudCgpLCAmcXVvdDtBcmlhbCZxdW90OywgOCwgb3JnLmVjbGlwc2Uuc3d0LlNXVC5OT1JNQUwpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Sb2xlTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSIKLSAgICAgICAgY29udGFpbmVycz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IlRhc2tOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iVGFza05vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgVGFza05vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBUYXNrTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMaW5lV2lkdGgoMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihUQVNLTk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7VEFTS05PREVOQU1FRklHVVJFX0ZPTlQpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKGZpZ18wKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7T2JqZWN0IGxheURhdGEwID0gbnVsbDsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLmFkZChmaWdfMCwgbGF5RGF0YTApOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmVGFza05vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZUYXNrTm9kZU5hbWVGaWd1cmU7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZlRhc2tOb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQgVEFTS05PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheS5nZXRDdXJyZW50KCksICZxdW90O0FyaWFsJnF1b3Q7LCA4LCBvcmcuZWNsaXBzZS5zd3QuU1dULk5PUk1BTCk7JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBzdGF0aWMgZmluYWwgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIFRBU0tOT0RFRklHVVJFX0JBQ0sgPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yKG51bGwsIDI1NSwgMjU1LCAxNTYpOyYjeEQ7JiN4QTsiPgotICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICBmaXhlZEJhY2tncm91bmQ9InRydWUiLz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgPC92aWV3bWFwPgotICAgICAgPG1vZGVsRmFjZXQ+Ci0gICAgICAgIDxtZXRhQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9UYXNrTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDIiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IlRhc2tOb2RlTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iVGFza05vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVUYXNrTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpTdHlsZUF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIGZpeGVkRm9udD0idHJ1ZSIvPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvY2hpbGROb2Rlcz4KLSAgICA8Y2hpbGROb2RlcwotICAgICAgICB2aXN1YWxJRD0iMjAwMyIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5lcnM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7Jmx0Oy4uLj4mcXVvdDspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZmlnXzAuc2V0Rm9udCgmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7V09SS1BST0RVQ1ROT0RFTkFNRUZJR1VSRV9GT05UKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZVdvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7ZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250IFdPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCA9IG5ldyBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5LmdldEN1cnJlbnQoKSwgJnF1b3Q7QXJpYWwmcXVvdDssIDgsIG9yZy5lY2xpcHNlLnN3dC5TV1QuTk9STUFMKTsmI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIHN0YXRpYyBmaW5hbCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IgV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDMiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQiCi0gICAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3RvcnkiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICBmaXhlZEZvbnQ9InRydWUiLz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0Ij4KLSAgICAgICAgICA8bWV0YUZlYXR1cmVzCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9OYW1lZE5vZGUvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2NoaWxkTm9kZXM+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgY2hpbGROb2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIC8vQGRpYWdyYW0vQGNoaWxkTm9kZXMuMSIKLSAgICAgICAgY29tcGFydG1lbnRzPSIvL0BkaWFncmFtL0Bjb21wYXJ0bWVudHMuMCIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgbGF5b3V0VHlwZT0iVE9PTEJBUl9MQVlPVVQiCi0gICAgICAgICAgY2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTdHJldGNoTWlub3JBeGlzKGZhbHNlKTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRTcGFjaW5nKDUpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlHZW5MYXlvdXRNYW5hZ2VyLnNldFZlcnRpY2FsKGZhbHNlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBST0xFVEFTS0NPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMTU2KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMiIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBjaGlsZE5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiCi0gICAgICAgIGNvbXBhcnRtZW50cz0iLy9AZGlhZ3JhbS9AY29tcGFydG1lbnRzLjEiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Ij4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGxheW91dFR5cGU9IlRPT0xCQVJfTEFZT1VUIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCBteUdlbkxheW91dE1hbmFnZXIgPSBuZXcgb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQoKTsmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0TWlub3JBbGlnbm1lbnQob3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQuQUxJR05fQ0VOVEVSKTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsmI3hEOyYjeEE7JiN4OTsmI3g5O215R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbCh0cnVlKTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEJhY2tncm91bmRDb2xvcihXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRCb3JkZXIoJiN4OTsmI3hEOyYjeEE7bmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSkmI3hEOyYjeEE7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgc3RhdGljIGZpbmFsIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvciBXT1JLUFJPRFVDVENPTVBPU0lURUZJR1VSRV9CQUNLID0gbmV3IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcihudWxsLCAyNTUsIDI1NSwgMjA1KTsmI3hEOyYjeEE7Ij4KLSAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46U3R5bGVBdHRyaWJ1dGVzIgotICAgICAgICAgICAgZml4ZWRCYWNrZ3JvdW5kPSJ0cnVlIi8+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3RDb21wb3NpdGUiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICAgIDxjaGlsZE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgIDwvdG9wTGV2ZWxOb2Rlcz4KLSAgICA8bGlua3MKLSAgICAgICAgdmlzdWFsSUQ9IjMwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rVmlld0ZhY3RvcnkiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9FZGdlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iTGlua0VkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IkxpbmtGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua0ZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4IHsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBMaW5rRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5zZXRGb3JlZ3JvdW5kQ29sb3Iob3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzLmJsYWNrJiN4RDsmI3hBOyYjeEQ7JiN4QTspOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlN0eWxlQXR0cmlidXRlcyIKLSAgICAgICAgICAgIGZpeGVkRm9yZWdyb3VuZD0idHJ1ZSIvPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwNCIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpMYWJlbE9mZnNldEF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgIHk9IjQwIi8+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmRyYXcyZDwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICAgIDwvdmlld21hcD4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxjb21wYXJ0bWVudHMKLSAgICAgICAgdmlzdWFsSUQ9IjUwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBhcnRtZW50IgotICAgICAgICBjYW5Db2xsYXBzZT0iZmFsc2UiCi0gICAgICAgIG5lZWRzVGl0bGU9ImZhbHNlIgotICAgICAgICBub2RlPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZSI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICA8L2NvbXBhcnRtZW50cz4KLSAgICA8Y29tcGFydG1lbnRzCi0gICAgICAgIHZpc3VhbElEPSI1MDAyIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3RDb21wYXJ0bWVudCIKLSAgICAgICAgY2FuQ29sbGFwc2U9ImZhbHNlIgotICAgICAgICBuZWVkc1RpdGxlPSJmYWxzZSIKLSAgICAgICAgbm9kZT0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgPC9jb21wYXJ0bWVudHM+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Ik5vZGVzIgotICAgICAgICAgIGNvbGxhcHNlPSJ0cnVlIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IlJvbGVOb2RlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgUm9sZU5vZGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AY2hpbGROb2Rlcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IFJvbGVUYXNrQ29tcG9zaXRlIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iVGFza05vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBUYXNrTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjEiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBXb3JrUHJvZHVjTm9kZSIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0BjaGlsZE5vZGVzLjIiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4xIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0iTGlua3MiCi0gICAgICAgICAgY29sbGFwc2U9InRydWUiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iTGluayIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IGxpbmsiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiCi0gICAgICBuYW1lPSJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBQbHVnaW4iCi0gICAgICBwcm92aWRlcj0iRVBGIgotICAgICAgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4iLz4KLSAgPGVkaXRvcgotICAgICAgY2xhc3NOYW1lPSJBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IiCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiLz4KLSAgPGRvbWFpbkdlbk1vZGVsCi0gICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8iLz4KLTwvZ21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvcj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9tb2RlbC9kaWFncmFtLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2RpYWdyYW0uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZTc4YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL21vZGVsL2RpYWdyYW0uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2RlbCIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGluayIgZVN1cGVyVHlwZXM9IiMvL0xpbmtlZE9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNvdXJjZSIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9vdXRnb2luZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgZVR5cGU9IiMvL05vZGUiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vTm9kZS9pbmNvbWluZ0Nvbm5lY3Rpb25zIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJlbmRwb2ludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQWJzb2x1dGVCZW5kcG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlRW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXRFbmRQb2ludCIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxpbmtlZE9iamVjdCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VKYXZhT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTGlua2VkT2JqZWN0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9jYXRpb24iIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNvbWluZ0Nvbm5lY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0xpbmsiIGVPcHBvc2l0ZT0iIy8vTGluay90YXJnZXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0Z29pbmdDb25uZWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiBlT3Bwb3NpdGU9IiMvL0xpbmsvc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRPbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZWROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdE5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOb2RlQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJub2RlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Ob2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza05vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBYnNvbHV0ZUJlbmRwb2ludCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBvaW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThjMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByZWZlcmVuY2VzLmdlbmVyYWw9QUREIERpYWdyYW0KLXByZWZlcmVuY2VzLmFwcGVhcmFuY2U9QXBwZWFyYW5jZQotcHJlZmVyZW5jZXMuY29ubmVjdGlvbnM9Q29ubmVjdGlvbnMKLXByZWZlcmVuY2VzLnByaW50aW5nPVByaW50aW5nCi1wcmVmZXJlbmNlcy5ydWxlcnNBbmRHcmlkPVJ1bGVycyAmIEdyaWQKLXByZWZlcmVuY2VzLnBhdGhtYXBzPVBhdGggTWFwcwotCi1lZGl0b3JOYW1lPUFERCBEaWFncmFtIEVkaXRvcgotbmV3V2l6YXJkTmFtZT1BREQgRGlhZ3JhbQotbmV3V2l6YXJkRGVzYz1DcmVhdGVzIEFERCBkaWFncmFtLgotCi1pbml0RGlhZ3JhbUFjdGlvbkxhYmVsPUluaXRpYWxpemUgYWRkIGRpYWdyYW0gZmlsZQotbG9hZFJlc291cmNlQWN0aW9uTGFiZWw9TG9hZCBSZXNvdXJjZS4uLgotCi1uYXZpZ2F0b3JDb250ZW50TmFtZT0qLmFkZCBkaWFncmFtIGNvbnRlbnRzCi0KLW1ldGF0eXBlLm5hbWUuQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5PVVuZGVmaW5lZAotbWV0YXR5cGUubmFtZS5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxPVJvbGVUYXNrQ29tcG9zaXRlCi1tZXRhdHlwZS5uYW1lLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDI9V29ya1Byb2R1Y3RDb21wb3NpdGUKLW1ldGF0eXBlLm5hbWUuUm9sZU5vZGVfMjAwMT1Sb2xlTm9kZQotbWV0YXR5cGUubmFtZS5UYXNrTm9kZV8yMDAyPVRhc2tOb2RlCi1tZXRhdHlwZS5uYW1lLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMz1Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi1tZXRhdHlwZS5uYW1lLkxpbmtfMzAwMT1MaW5rCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9RVBGIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBOZWVkIHRyYW5zbGF0aW9uCi1lbGVtZW50X3R5cGVfY29udHJvbF9mbG93PUNvbnRyb2wgRmxvdwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU2OWRiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotCi08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotICAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0gICAgICA8ZmlsZVR5cGVzCi0gICAgICAgICB0eXBlPSJ0ZXh0IgotICAgICAgICAgZXh0ZW5zaW9uPSJhZGQiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgICA8cGFyc2VyCi0gICAgICAgICB0eXBlPSJhZGQiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUucmVzb3VyY2VzLkdNRlJlc291cmNlRmFjdG9yeSI+Ci0gICAgICA8L3BhcnNlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgIDwhLS0KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IkdNRiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSBFZGl0b3IiCi0gICAgICAgIGljb249Imljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIgotICAgICAgICBleHRlbnNpb25zPSJhZGQiCi0gICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IiCi0gICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIj4KLSAgICAgPC9lZGl0b3I+Ci0gICAtLT4KLSAgICAgPGVkaXRvcgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IkFjdGl2aXR5IERldGFpbCBEaWFncmFtIEVkaXRvciIKLSAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L0FEREVkaXRvci5naWYiCi0gICAgICAgIGV4dGVuc2lvbnM9ImFkZCIKLSAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFERGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4gICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPCEtLSA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgCSAgPHdpemFyZAotICAJICAgICBuYW1lPSJBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbSIKLSAgCSAgICAgaWNvbj0iaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYiCi0gIAkgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aS5FeGFtcGxlcyIKLSAgCSAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1DcmVhdGlvbldpemFyZCIKLSAgCSAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1DcmVhdGlvbldpemFyZElEIj4KLSAgCSAgCSA8ZGVzY3JpcHRpb24+Ci0gIAkgIAkJQ3JlYXRlcyBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4KLSAgCSAgCSA8L2Rlc2NyaXB0aW9uPiAgCi0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPiAtLT4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0gICAgICA8IS0tIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudWkub2JqZWN0Q29udHJpYnV0aW9uLklGaWxlMSIKLSAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioubW9kZWwiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IkluaXRpYWxpemUgYWRkIGRpYWdyYW0gZmlsZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbklEIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDIiCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb25JRCIKLSAgICAgICAgICAgICAgIGxhYmVsPSJMb2FkIFJlc291cmNlLi4uIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyI+Ci0gICAgICAgICA8L2FjdGlvbj4KLSAgICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPiAgICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuRGVsZXRlRGlhZ3JhbSIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVEZWxldGVEaWFncmFtX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRGVsZXRlRGlhZ3JhbV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaF90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgICAgICAgLS0+ICAgICAgICAgICAKLSAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5hY3Rpb24uY29udHJpYnV0aW9uSXRlbVByb3ZpZGVycyI+Ci0gICAgICA8Y29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPHBhcnRDb250cmlidXRpb24gaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxwYXJ0QWN0aW9uIG1lbnViYXJQYXRoPSIvZmlsZS9wcmludCIgaWQ9InByaW50UHJldmlld0FjdGlvbiI+Ci0gICAgICAgICAgICA8L3BhcnRBY3Rpb24+Ci0gICAgICAgICA8L3BhcnRDb250cmlidXRpb24+Ci0gICAgICA8L2NvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlcj4KLSAgICAgIDxjb250cmlidXRpb25JdGVtUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIgotICAgICAgICAgICAgY2hlY2tQbHVnaW5Mb2FkZWQ9ImZhbHNlIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21EaWFncmFtQWN0aW9uIiByZW1vdmU9InRydWUiLz4KLSAgICAgICAgIDwvcG9wdXBDb250cmlidXRpb24+Ci0gICAgICAgICA8cG9wdXBDb250cmlidXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyIj4KLSAgICAgICAgICAgIDxwb3B1cFN0cnVjdHVyZWRDb250cmlidXRpb25Dcml0ZXJpYSBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgPC9wb3B1cENvbnRyaWJ1dGlvbj4KLSAgICAgICAgICAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21Nb2RlbEFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5nbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXJzIj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFERFByZXNlbnRhdGlvbiI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImRlbGV0ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0ic2F2ZSIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIucHJvdmlkZXJzLkRpYWdyYW1XaXRoUHJpbnRHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iQUREUHJlc2VudGF0aW9uUHJpbnQiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJwcmludCIvPgotICAgICAgICAgICAgPC9FbGVtZW50VHlwZT4KLSAgICAgICAgIDwvVmlld0lkPgotICAgICAgPC9HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXI+Ci0gICAgICA8R2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLnByb3ZpZGVycy5EaWFncmFtSURFR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgaWQ9IkFERFByZXNlbnRhdGlvbklERSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImJvb2ttYXJrIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDwhLS0KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVVJUmVuZGVyR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyIgotICAgICAgICAgICAgaWQ9IkFERFJlbmRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImN1dCIvPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJjb3B5Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InBhc3RlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIC0tPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3UHJvdmlkZXJzIj4KLSAgICAgIDx2aWV3UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbVZpZXdQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0iIHNlbWFudGljSGludHM9IkFERCIvPgotICAgICAgICAgPGNvbnRleHQgdmlld0NsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIiBzZW1hbnRpY0hpbnRzPSIiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICA8L3ZpZXdQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0UHJvdmlkZXJzIj4KLSAgICAgIDxlZGl0cGFydFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FZGl0UGFydFByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvZWRpdHBhcnRQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhbGV0dGVQcm92aWRlcnMiPgotICAgICAgPHBhbGV0dGVQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtUGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIi8+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgICAgIDxwYWxldHRlUHJvdmlkZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EZWZhdWx0UGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgPFByaW9yaXR5IG5hbWU9Ik1lZGl1bSIvPgotICAgICAgICA8ZWRpdG9yIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JJRCIvPgotICAgICAgICA8Y29udHJpYnV0aW9uPgotICAgICAgICAgICAgPHByZWRlZmluZWRFbnRyeSAgICAKLSAgICAgICAgICAgIAlpZD0iZ2Vvc2hhcGVEcmF3ZXIiICAgcGF0aD0iLyI+Ci0gICAgICAgICAgICAJPGV4cGFuZCBmb3JjZT0idHJ1ZSIvPgotICAgICAgICAgICAgIDwvcHJlZGVmaW5lZEVudHJ5PiAKLSAgICAgICAgPC9jb250cmlidXRpb24+Ci0gICAgICA8L3BhbGV0dGVQcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkubW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcnMiPgotICAgICAgPG1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9tb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wcm9wZXJ0aWVzLnByb3BlcnRpZXNQcm92aWRlcnMiPgotICAgICAgPFByb3BlcnRpZXNQcm92aWRlcgotICAgICAgICAgICAgdmVyaWZ5UGx1Z2luTG9hZGVkPSJmYWxzZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUHJvcGVydGllc1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uUHJvdmlkZXJzIj4KLSAgICAgIDxJY29uUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUljb25Qcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93Ii8+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgICAgIDxJY29uUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmdlb3NoYXBlcy5pbnRlcm5hbC5wcm92aWRlcnMuR2VvU2hhcGVJY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5Ci0gICAgICAgICAgICAgICBuYW1lPSJNZWRpdW0iPgotICAgICAgICAgPC9Qcmlvcml0eT4KLSAgICAgICAgIDxvYmplY3QgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXcob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24pIiBpZD0iR2VvU2hhcGUiPgotICAgICAgICAJIDxtZXRob2QgbmFtZT0iZ2V0VHlwZSgpIiB2YWx1ZT0ib3ZhbCx0cmlhbmdsZSxyZWN0YW5nbGUsc2hhZG93UmVjdGFuZ2xlLHJlY3RhbmdsZTNELHJvdW5kUmVjdGFuZ2xlLGhleGFnb24sb2N0YWdvbixwZW50YWdvbixkaWFtb25kLGN5bGluZGVyLGxpbmUiLz4KLQkgICAgIDwvb2JqZWN0PgotICAgICAgICAgPGNvbnRleHQgZWxlbWVudHM9Ikdlb1NoYXBlIj4KLSAgICAgICAgIDwvY29udGV4dD4KLSAgICAgIDwvSWNvblByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXJQcm92aWRlcnMiPgotICAgICAgPFBhcnNlclByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1QYXJzZXJQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L1BhcnNlclByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZWxlbWVudFR5cGVzIj4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iNzkiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZU5vZGVfMjAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IlJvbGVOb2RlIgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iUm9sZU5vZGUiCi0gICAgICAgICAgICAgICBlZGl0aGVscGVyPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzLlJvbGVOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5UYXNrTm9kZV8yMDAyIgotICAgICAgICAgICAgICAgbmFtZT0iVGFza05vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJUYXNrTm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuVGFza05vZGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIyMDAyIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyIKLSAgICAgICAgICAgICAgIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMjAwMyIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0KLSAgICAgIDxtZXRhbW9kZWwgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL2RpYWdyYW0vMS4wLjAvZGlhZ3JhbS5lY29yZSI+Ci0gICAgICAgICA8bWV0YW1vZGVsVHlwZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlVGFza0NvbXBvc2l0ZV8xMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iUm9sZVRhc2tDb21wb3NpdGUiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJSb2xlVGFza0NvbXBvc2l0ZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIxMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIiCi0gICAgICAgICAgICAgICBuYW1lPSJXb3JrUHJvZHVjdENvbXBvc2l0ZSIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IldvcmtQcm9kdWN0Q29tcG9zaXRlIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDIiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuTGlua18zMDAxIgotICAgICAgICAgICAgICAgbmFtZT0iJWVsZW1lbnRfdHlwZV9jb250cm9sX2Zsb3ciCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJMaW5rIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVycy5MaW5rRWRpdEhlbHBlciI+Ci0gICAgICAgICAgICA8cGFyYW0gbmFtZT0ic2VtYW50aWNIaW50IiB2YWx1ZT0iMzAwMSIvPgotICAgICAgICAgPC9tZXRhbW9kZWxUeXBlPgotICAgICAgPC9tZXRhbW9kZWw+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZUJpbmRpbmdzIj4KLSAgICAgIDxjbGllbnRDb250ZXh0IGlkPSJBRERDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5lZGl0aW5nRG9tYWluIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLkVkaXRpbmdEb21haW4iLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvY2xpZW50Q29udGV4dD4gCi0gICAgICA8YmluZGluZyBjb250ZXh0PSJBRERDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BY3Rpdml0eURldGFpbERpYWdyYW1fNzkiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Sb2xlTm9kZV8yMDAxIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuVGFza05vZGVfMjAwMiIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMyIvPgotICAgICAgICAgPGVsZW1lbnRUeXBlIHJlZj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuTGlua18zMDAxIi8+Ci0gICAgICAgICA8YWR2aWNlIHJlZj0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmFkdmljZS5ub3RhdGlvbkRlcGRlbmRlbnRzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcGF0dGVybj0iLioiLz4KLSAgICAgIDwvYmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FEREltYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQURESW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Mzg1ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvQURESW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBRERJbWFnZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMQ0wxNiA9ICJmdWxsL2VsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRExDTDE2ID0gImZ1bGwvZGxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX1JFU0VUX0RJQUdSQU1fTEFZT1VUID0gRUxDTDE2ICsgInJlc2V0X2RpYWdyYW0uZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9FRElUT1IgPSBFVE9PTDE2ICsgIkFEREVkaXRvci5naWYiOyAvLyROT04tTkxTLTEkCQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfUkVTRVRfRElBR1JBTV9MQVlPVVQgPSBETENMMTYgKyAicmVzZXRfZGlhZ3JhbS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRURJVE9SID0gRFRPT0wxNiArICJBRERFZGl0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19SRVNFVF9ESUFHUkFNX0xBWU9VVCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCURJU0FCTEVEX0lNR19QQVRIX1JFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19FRElUT1IgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0VESVRPUik7CQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19SRVNFVF9ESUFHUkFNX0xBWU9VVCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0VESVRPUiA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRURJVE9SKTsJCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9BY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjVjN2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQiOwkvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHlEZXRhaWxEaWFncmFtUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1ZGQ5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0RpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElBZGFwdGFibGUgZWRnZUFkYXB0b3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihlZGl0aW5nRG9tYWluLCBsYWJlbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBlZGdlQWRhcHRvci5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0V29ya3NwYWNlRmlsZXModmlldyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkRmlsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElBZGFwdGFibGUgZ2V0RWRnZUFkYXB0b3IoKSB7Ci0JCXJldHVybiBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRnZUFkYXB0b3IoSUFkYXB0YWJsZSBlZGdlQWRhcHRvcikgewotCQl0aGlzLmVkZ2VBZGFwdG9yID0gZWRnZUFkYXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2VBZGFwdG9yIDogIk51bGwgY2hpbGQgaW4gRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQlFZGdlIGVkZ2UgPSAoRWRnZSkgZ2V0RWRnZUFkYXB0b3IoKS5nZXRBZGFwdGVyKEVkZ2UuY2xhc3MpOwotCQlhc3NlcnQgbnVsbCAhPSBlZGdlIDogIk51bGwgZWRnZSBpbiBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkJVmlldyB0ZW1wVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWVkZ2Uuc2V0U291cmNlKGVkZ2UuZ2V0VGFyZ2V0KCkpOwotCQllZGdlLnNldFRhcmdldCh0ZW1wVmlldyk7Ci0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9MaW5rQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGMwOTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0NyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlDb250YWluZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15U291cmNlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteVRhcmdldDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua0NyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEsIE5vZGUgY29udGFpbmVyLAotCQkJTm9kZSBzb3VyY2UsIE5vZGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHJlcSk7Ci0JCXN1cGVyLnNldEVsZW1lbnRUb0VkaXQoY29udGFpbmVyKTsKLQkJbXlDb250YWluZXIgPSBjb250YWluZXI7Ci0JCW15U291cmNlID0gc291cmNlOwotCQlteVRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gbXlDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFNvdXJjZSgpIHsKLQkJcmV0dXJuIG15U291cmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBteVRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RWxlbWVudFRvRWRpdChFT2JqZWN0IGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpIHsKLQkJTGluayBuZXdFbGVtZW50ID0gKExpbmspIHN1cGVyLmRvRGVmYXVsdEVsZW1lbnRDcmVhdGlvbigpOwotCQlpZiAobmV3RWxlbWVudCAhPSBudWxsKSB7Ci0JCQluZXdFbGVtZW50LnNldFRhcmdldChteVRhcmdldCk7Ci0JCQluZXdFbGVtZW50LnNldFNvdXJjZShteVNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0VsZW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL0xpbmtSZW9yaWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGFhMzEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkVkaXRFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rUmVvcmllbnRDb21tYW5kIGV4dGVuZHMgRWRpdEVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCByZW9yaWVudERpcmVjdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEVPYmplY3Qgb2xkRW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBuZXdFbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtSZW9yaWVudENvbW1hbmQoUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJc3VwZXIocmVxdWVzdC5nZXRMYWJlbCgpLCByZXF1ZXN0LmdldFJlbGF0aW9uc2hpcCgpLCByZXF1ZXN0KTsKLQkJcmVvcmllbnREaXJlY3Rpb24gPSByZXF1ZXN0LmdldERpcmVjdGlvbigpOwotCQlvbGRFbmQgPSByZXF1ZXN0LmdldE9sZFJlbGF0aW9uc2hpcEVuZCgpOwotCQluZXdFbmQgPSByZXF1ZXN0LmdldE5ld1JlbGF0aW9uc2hpcEVuZCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoIShnZXRFbGVtZW50VG9FZGl0KCkgaW5zdGFuY2VvZiBMaW5rKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7Ci0JCQlyZXR1cm4gY2FuUmVvcmllbnRTb3VyY2UoKTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewotCQkJcmV0dXJuIGNhblJlb3JpZW50VGFyZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFNvdXJjZSgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgTm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgdGFyZ2V0ID0gZ2V0TGluaygpLmdldFRhcmdldCgpOwotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRMaW5rKCkuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIGdldE5ld1NvdXJjZSgpLCB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5SZW9yaWVudFRhcmdldCgpIHsKLQkJaWYgKCEob2xkRW5kIGluc3RhbmNlb2YgTm9kZSAmJiBuZXdFbmQgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgc291cmNlID0gZ2V0TGluaygpLmdldFNvdXJjZSgpOwotCQlpZiAoIShnZXRMaW5rKCkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRMaW5rKCkuZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgZ2V0TmV3VGFyZ2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCUlBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghY2FuRXhlY3V0ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKAotCQkJCQkiSW52YWxpZCBhcmd1bWVudHMgaW4gcmVvcmllbnQgbGluayBjb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1NPVVJDRSkgewotCQkJcmV0dXJuIHJlb3JpZW50U291cmNlKCk7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9UQVJHRVQpIHsKLQkJCXJldHVybiByZW9yaWVudFRhcmdldCgpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgcmVvcmllbnRTb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZ2V0TGluaygpLnNldFNvdXJjZShnZXROZXdTb3VyY2UoKSk7Ci0JCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdChnZXRMaW5rKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFRhcmdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlnZXRMaW5rKCkuc2V0VGFyZ2V0KGdldE5ld1RhcmdldCgpKTsKLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaW5rIGdldExpbmsoKSB7Ci0JCXJldHVybiAoTGluaykgZ2V0RWxlbWVudFRvRWRpdCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXRPbGRTb3VyY2UoKSB7Ci0JCXJldHVybiAoTm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXROZXdTb3VyY2UoKSB7Ci0JCXJldHVybiAoTm9kZSkgbmV3RW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXRPbGRUYXJnZXQoKSB7Ci0JCXJldHVybiAoTm9kZSkgb2xkRW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZSBnZXROZXdUYXJnZXQoKSB7Ci0JCXJldHVybiAoTm9kZSkgbmV3RW5kOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZU5vZGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1JvbGVOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzcyZTZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZU5vZGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTA5YTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Sb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZUVsZW1lbnRDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlzdXBlcihyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFbGVtZW50VG9FZGl0KCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoQ3JlYXRlRWxlbWVudFJlcXVlc3QpIGdldFJlcXVlc3QoKSkKLQkJCQkuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQljb250YWluZXIgPSAoKFZpZXcpIGNvbnRhaW5lcikuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1Rhc2tOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9UYXNrTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyYzk1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1Rhc2tOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMgQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzY3ZTZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTUzNWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvY29tbWFuZHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDcmVhdGVDb21tYW5kIGV4dGVuZHMKLQkJQ3JlYXRlRWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJc3VwZXIocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBnZXRFQ2xhc3NUb0VkaXQoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0RWxlbWVudFRvRWRpdCgpIHsKLQkJRU9iamVjdCBjb250YWluZXIgPSAoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSBnZXRSZXF1ZXN0KCkpCi0JCQkJLmdldENvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVmlldykgewotCQkJY29udGFpbmVyID0gKChWaWV3KSBjb250YWluZXIpLmdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZTFmYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0RpYWdyYW1CYXNlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjkxZGJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbXBvc2l0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVkaXRoZWxwZXIuQWJzdHJhY3RFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5JRWRpdENvbW1hbmRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1CYXNlRWRpdEhlbHBlciBleHRlbmRzIEFic3RyYWN0RWRpdEhlbHBlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9QT0xJQ1lfQ09NTUFORCA9ICJlZGl0IHBvbGljeSBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRJbnN0ZWFkQ29tbWFuZChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlJQ29tbWFuZCBlcENvbW1hbmQgPSAoSUNvbW1hbmQpIHJlcS5nZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCk7Ci0JCXJlcS5zZXRQYXJhbWV0ZXIoRURJVF9QT0xJQ1lfQ09NTUFORCwgbnVsbCk7Ci0JCUlDb21tYW5kIGVoQ29tbWFuZCA9IHN1cGVyLmdldEluc3RlYWRDb21tYW5kKHJlcSk7Ci0JCWlmIChlcENvbW1hbmQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlpZiAoZWhDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlcENvbW1hbmQ7Ci0JCX0KLQkJQ29tcG9zaXRlQ29tbWFuZCBjb21tYW5kID0gbmV3IENvbXBvc2l0ZUNvbW1hbmQobnVsbCk7Ci0JCWNvbW1hbmQuYWRkKGVwQ29tbWFuZCk7Ci0JCWNvbW1hbmQuYWRkKGVoQ29tbWFuZCk7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxNzdjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvTGlua0VkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlTm9kZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdlZTYyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvUm9sZU5vZGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjYyM2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Sb2xlVGFza0NvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVFZGl0SGVscGVyIGV4dGVuZHMgRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvVGFza05vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvVGFza05vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3N2I0NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1Rhc2tOb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlkMzU1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0NjczOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRIZWxwZXIgZXh0ZW5kcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxYjk2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5BY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnV0aWwuTWVhc3VyZW1lbnRVbml0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBtb2RpZmllZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQgZXh0ZW5kcyBEaWFncmFtRWRpdFBhcnQgewotCi0JUG9pbnQgY2FjaGVkUG9pbnQgPSBuZXcgUG9pbnQoLTEsIC0xKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZFdpZHRoID0gMTA7Ci0KLQlzdGF0aWMgaW50IGNhY2hlZEhlaWdodCA9IDEwOwotCi0JaW50IHkgPSA2MDsKLQotCWJvb2xlYW4geGF4aXNiZWdpbiA9IGZhbHNlOwotCi0JYm9vbGVhbiBsb2FkaW5nID0gdHJ1ZTsKLQotCWZpbmFsIHN0YXRpYyBpbnQgc3BhY2luZyA9IDQwOwotCi0JZmluYWwgc3RhdGljIGludCB5c3BhY2luZyA9IDIwOwotCi0JYm9vbGVhbiBtaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0KLQlpbnQgeCA9IDEwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUUyA9ICJvdXRwdXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRTID0gImlucHV0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdDxFZGl0UGFydD4gcmVjZW50bHlBZGRlZFBhcnRzID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQotCXByaXZhdGUgSU1hcE1vZGUgbWFwTW9kZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfSUQgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDc5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JCQotCQltYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUodmlldy5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCX0KLQkKLQlwcml2YXRlIFZpZXcgZ2V0VmlldygpIHsKLQkJcmV0dXJuIChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9MYXlvdXQoKSB7Ci0JCUVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IGdldFZpZXdlcigpOwotCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpIHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKXZpZXdlcikuZ2V0RWRpdG9yKCk7Ci0JCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcillZGl0b3IpLnJlc2V0TGF5b3V0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0I2NyZWF0ZUZpZ3VyZSgpCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlGaWd1cmUgZiA9IG5ldyBGcmVlZm9ybUxheWVyKCkgewotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KCkgewotCQkJCWlmIChoYXNNaXNwbGFjZWRDaGlsZHJlbigpKSB7Ci0JCQkJCXJlc2V0Q2hpbGRyZW5Mb2NhdGlvbnMoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN1cGVyLmxheW91dCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQlmLnNldEJvcmRlcihuZXcgTWFyZ2luQm9yZGVyKDIwKSk7Ci0JCWYuc2V0TGF5b3V0TWFuYWdlcihuZXcgRnJlZWZvcm1MYXlvdXQoKSk7Ci0KLQkJcmV0dXJuIGY7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBtaXNwbGFjZWQgY2hpbGRyZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWlzcGxhY2VkQ2hpbGRyZW4oKSB7Ci0JCUxpc3QgbG9jYXRpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbW9kZWw7Ci0JCQkJCUxvY2F0aW9uIHAgPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQkJCQlsb2NhdGlvbkxpc3QuYWRkKHApOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm9kZS0iICsgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9jLSIgKyBwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChsb2NhdGlvbkxpc3Quc2l6ZSgpID09IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChsb2NhdGlvbkxpc3Quc2l6ZSgpID4gMCkgewotCQkJYm9vbGVhbiBuZWVkVG9SZXNldCA9IHRydWU7Ci0KLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbG9jYXRpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTG9jYXRpb24gY3VycmVudExvYyA9IChMb2NhdGlvbikgbG9jYXRpb25MaXN0LmdldChpKTsKLQkJCQlMb2NhdGlvbiBwcmV2aW91c0xvYyA9IChMb2NhdGlvbikgbG9jYXRpb25MaXN0LmdldChpIC0gMSk7Ci0JCQkJaWYgKCEoKGN1cnJlbnRMb2MuZ2V0WCgpID09IHByZXZpb3VzTG9jLmdldFgoKSArIDEwKSAmJiAoY3VycmVudExvYwotCQkJCQkJLmdldFkoKSA9PSBwcmV2aW91c0xvYy5nZXRZKCkgKyAxMCkpKSB7Ci0JCQkJCW5lZWRUb1Jlc2V0ID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZWVkVG9SZXNldDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVzZXQgYWxsIGNoaWxkcmVuIGxvY2F0aW9ucwotCSAqIEluIHRoaXMsIEFsbCB0aGUgVGFzaydzIE1hbmRhdG9yeUlucHV0IHdvcmtwcm9kdWN0cyBwbGFjZWQgb24gdG9wIGFuZCBSb2xlVGFzayAKLQkgKiBjb21wb3NpdGUgaW4gdGhlIG1pZGRsZS4gYW5kIFRhc2sncyBvdXRwdXQgd29ya3Byb2R1Y3RzIGJvdHRvbS4KLQkgKiAKLQkgKiBUT0RPIC0gSGF2ZSB0byByZXZpc2l0IHRoaXMgbWV0aG9kIGFuZCBkbyBzb21lIGNsZWFudXAKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXNldENoaWxkcmVuTG9jYXRpb25zKCkgewotCi0JCWZpbmFsIGludCB5c3BhY2luZyA9IDQwOwotCQlMaXN0IHJvbGVjb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG91dHB1dFdvcmtQcm9kdWN0Q29tcG9zaXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtaXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0YXNrTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGhpcy5yZWNlbnRseUFkZGVkUGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8JCUhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlOb2RlIG4gPSAoTm9kZSkgKChFZGl0UGFydCkgY2hpbGQpLmdldE1vZGVsKCk7Ci0JCQkvLwkJCWlmIChuLmdldExvY2F0aW9uKCkgPT0gbnVsbCB8fCBuLmdldExvY2F0aW9uKCkueCA9PSAtMSkgewotCQkJdGhpcy5yZWNlbnRseUFkZGVkUGFydHMuYWRkKChFZGl0UGFydCkgY2hpbGQpOwotCQkJLy8JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJcm9sZWNvbXBvc2l0ZUxpc3QuYWRkKGNoaWxkKTsKLQotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza05vZGVFZGl0UGFydCkgewotCQkJCQkJVmlldyB2aWV3T2JqID0gKFZpZXcpICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJCQlPYmplY3QgbyA9IHZpZXdPYmouZ2V0RWxlbWVudCgpOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJCXRhc2tMaXN0LmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IHBhcnQgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgY2hpbGQ7Ci0JCQkJVmlldyB2aWV3T2JqID0gKFZpZXcpICgoTm9kZUVkaXRQYXJ0KSBwYXJ0KS5nZXRNb2RlbCgpOwotCQkJCU9iamVjdCBvID0gdmlld09iai5nZXRFbGVtZW50KCk7Ci0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIG5vZGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIG87Ci0JCQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQkJCWlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJCX0gZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0LmFkZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJLy8JCQkJCWNhbGNTaXplKGNoaWxkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCW1pc2NMaXN0LmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBTZXQgc2l6ZSBmb3IgdGhlIHJvbGVjb21wb3NpdGUuCi0JCWlmICghcm9sZWNvbXBvc2l0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByb2xlY29tcG9zaXRlTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0JCQkJTGlzdCBsaXN0ID0gKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBvYmplY3QpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcjEuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXRvcjEubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlWaWV3IHZpZXdPYmogPSAoVmlldykgKChOb2RlRWRpdFBhcnQpIG9iaikuZ2V0TW9kZWwoKTsKLQkJCQkJCU9iamVjdCBvYmpOb2RlID0gdmlld09iai5nZXRFbGVtZW50KCk7Ci0JCQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCQkJVGFza05vZGUgdGFza05vZGUgPSAoVGFza05vZGUpIG9iak5vZGU7Ci0KLQkJCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrID0gKFRhc2tEZXNjcmlwdG9yKSB0YXNrTm9kZQotCQkJCQkJCQkJLmdldE9iamVjdCgpOwotCQkJCQkJCWZvciAoSXRlcmF0b3Igd3BpdG9yID0gaW5wdXR3b3JrcHJvZHVjdENvbXBvc2l0ZUxpc3QKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyB3cGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IHdwRWRpdFBhcnQgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgd3BpdG9yCi0JCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3BDb21wb3NpdGVOb2RlID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFZpZXcpIHdwRWRpdFBhcnQKLQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQlPYmplY3Qgd3BPYmplY3QgPSB3cENvbXBvc2l0ZU5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmICh3cE9iamVjdCAhPSBudWxsICYmIHdwT2JqZWN0LmVxdWFscyh0YXNrKSkgewotCQkJCQkJCQkJaW50IHdpZHRoID0gd3BFZGl0UGFydC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJCQkJaW50IGhlaWdodCA9ICgoTm9kZUVkaXRQYXJ0KSBvYmopCi0JCQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQkJCQkJKChOb2RlRWRpdFBhcnQpIG9iaikKLQkJCQkJCQkJCQkJLmdldEZpZ3VyZSgpCi0JCQkJCQkJCQkJCS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCQkJCQkJCQkJCW5ldyBEaW1lbnNpb24od2lkdGgsIGhlaWdodCkpOwotCQkJCQkJCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpICgoVmlldykgd3BFZGl0UGFydAotCQkJCQkJCQkJCQkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpKQotCQkJCQkJCQkJCQkuZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCUxpc3QgaW5wdXRMaXN0ID0gKExpc3QpICgoSGFzaE1hcCkgbWFwCi0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJCQkuZ2V0KHRhc2tOb2RlKSkuZ2V0KElOUFVUUyk7Ci0JCQkJCQkJCQkJLy8JCQkJCQkJCQkJaW5wdXRMaXN0LmFkZCh3cEVkaXRQYXJ0KTsKLQkJCQkJCQkJCX0gZWxzZSBpZiAoKChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChWaWV3KSB3cEVkaXRQYXJ0Ci0JCQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkpCi0JCQkJCQkJCQkJCS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCUxpc3Qgb3V0cHV0TGlzdCA9IChMaXN0KSAoKEhhc2hNYXApIG1hcAotCQkJCQkJCQkJCS8vCQkJCQkJCQkJCQkJLmdldCh0YXNrTm9kZSkpLmdldChPVVRQVVRTKTsKLQkJCQkJCQkJCQkvLwkJCQkJCQkJCQlvdXRwdXRMaXN0LmFkZCh3cEVkaXRQYXJ0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcm9sZWNvbXBvc2l0ZUxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVjb21wb3NpdGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTGlzdCBjb25maXJtZWRTZXFJbnB1dExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJTGlzdCBjb25maXJtZWRTZXFPdXRwdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUxpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkgcm9sZWNvbXBvc2l0ZUxpc3QKLQkJCQkJCS5nZXQoaSkpLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCU9iamVjdCBvID0gbGlzdC5nZXQoaik7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlOb2RlRWRpdFBhcnQgdGFzayA9IChOb2RlRWRpdFBhcnQpIGxpc3QuZ2V0KGopOwotCQkJCQkJaWYgKCgoVmlldykgdGFzay5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBUYXNrTm9kZSkgewotCQkJCQkJCVRhc2tOb2RlIHRhc2tub2RlID0gKFRhc2tOb2RlKSAoKFZpZXcpIHRhc2sKLQkJCQkJCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBpbnB1dHdvcmtwcm9kdWN0Q29tcG9zaXRlTGlzdAotCQkJCQkJCQkJLnNpemUoKTsgaysrKSB7Ci0JCQkJCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdwY29tcCA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgKChWaWV3KSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCi0JCQkJCQkJCWlmICh3cGNvbXAgIT0gbnVsbCAmJiB3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKAotCQkJCQkJCQkJCXRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQkJaWYgKHdwY29tcC5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQkJCQkJY29uZmlybWVkU2VxSW5wdXRMaXN0Ci0JCQkJCQkJCQkJCQkuYWRkKGlucHV0d29ya3Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJCS5nZXQoaykpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkuc2l6ZSgpOyBrKyspIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd3Bjb21wID0gKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSAoKFZpZXcpICgoV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkgb3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJLmdldChrKSkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCi0JCQkJCQkJCWlmICh3cGNvbXAuZ2V0T2JqZWN0KCkuZXF1YWxzKAotCQkJCQkJCQkJCXRhc2tub2RlLmdldE9iamVjdCgpKSkgewotCQkJCQkJCQkJaWYgKHdwY29tcC5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJCQkJCWNvbmZpcm1lZFNlcU91dHB1dExpc3QKLQkJCQkJCQkJCQkJCS5hZGQob3V0cHV0V29ya1Byb2R1Y3RDb21wb3NpdGVMaXN0Ci0JCQkJCQkJCQkJCQkJCS5nZXQoaykpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghY29uZmlybWVkU2VxSW5wdXRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlzZXRPYmplY3RzTG9jYXRpb25zKGNvbmZpcm1lZFNlcUlucHV0TGlzdCk7Ci0JCQkJCXkgPSBjYWNoZWRQb2ludC55ICsgY2FjaGVkSGVpZ2h0ICsgeXNwYWNpbmc7Ci0JCQkJfQotCQkJCUxpc3Qgcm9sZUMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcm9sZUMuYWRkKHJvbGVjb21wb3NpdGVMaXN0LmdldChpKSk7Ci0JCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhyb2xlQyk7Ci0KLQkJCQl5ID0gY2FjaGVkUG9pbnQueSArIGNhY2hlZEhlaWdodCArIHlzcGFjaW5nOwotCQkJCWlmICghY29uZmlybWVkU2VxT3V0cHV0TGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJc2V0T2JqZWN0c0xvY2F0aW9ucyhjb25maXJtZWRTZXFPdXRwdXRMaXN0KTsKLQkJCQkJeSA9IGNhY2hlZFBvaW50LnkgKyBjYWNoZWRIZWlnaHQgKyB5c3BhY2luZzsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCS8vCQlpZiAoIW1pc2NMaXN0LmlzRW1wdHkoKSkgewotCQkvLwkJCWlmIChkZWJ1ZykgewotCQkvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByaW50IFNpemUgb2YgbWlzYzogIiArIG1pc2NMaXN0LnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQl9Ci0JCS8vCQkJaWYgKCFsb2FkaW5nKSB7Ci0JCS8vCQkJCW1pc2NlbGxhbmVvdXMgPSB0cnVlOwotCQkvLwkJCX0KLQkJLy8JCQlzZXRPYmplY3RzTG9jYXRpb25zKG1pc2NMaXN0KTsKLQkJLy8JCQltaXNjZWxsYW5lb3VzID0gZmFsc2U7Ci0JCS8vCQl9Ci0KLQkJZmluYWwgVmlldyB2aWV3ID0gZ2V0VmlldygpOwotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24odmlldy5nZXREaWFncmFtKCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdmlldy5wZXJzaXN0KCk7Ci0JCQkJCXZpZXcucGVyc2lzdENoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWxvYWRpbmcgPSBmYWxzZTsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsCi0JCQkJbmV3IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogSXQgc2V0cyBvYmplY3QgbG9jYXRpb24gb24gY2F2YXMKLQkgKiBAcGFyYW0gbGlzdAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRPYmplY3RzTG9jYXRpb25zKExpc3QgbGlzdCkgewotCQl4YXhpc2JlZ2luID0gdHJ1ZTsKLQkJeCA9IDUwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCWZpbmFsIEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSAoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkOwotCQkJCWZpbmFsIE5vZGUgbm9kZSA9IChOb2RlKSBwYXJ0LmdldE1vZGVsKCk7Ci0KLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJZmluYWwgTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCi0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIC0gIiArIHBhcnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2F0aW9uIC0gIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKCF4YXhpc2JlZ2luKSB7Ci0JCQkJCQl4ID0gY2FjaGVkUG9pbnQueCArIGNhY2hlZFdpZHRoICsgc3BhY2luZzsKLQkJCQkJfQotCi0JCQkJCWlmICghbG9hZGluZyAmJiBtaXNjZWxsYW5lb3VzKSB7Ci0JCQkJCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKHgpKTsKLQkJCQkJCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoMTApKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXRWaWV3KCkuZ2V0RGlhZ3JhbSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCh4KSk7Ci0JCQkJCQkJCQlsb2NhdGlvbi5zZXRZKG1hcE1vZGUuRFB0b0xQKHkpKTsKLQotCQkJCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJCQkJKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkJCQkJLnVwZGF0ZWJvdW5kcygpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQkJCQkJCQkJKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBwYXJ0KQotCQkJCQkJCQkJCQkJLnVwZGF0ZWJvdW5kcygpOwotCQkJCQkJCQkJfQotCi0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJfSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChkZWJ1ZykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5ld0xvY2F0aW9uIC0gIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlpZiAoIW1pc2NlbGxhbmVvdXMpCi0JCQkJCQkJY2FjaGVkUG9pbnQgPSBuZXcgUG9pbnQobG9jYXRpb24uZ2V0WCgpLCBsb2NhdGlvbgotCQkJCQkJCQkJLmdldFkoKSk7Ci0JCQkJCQljYWNoZWRXaWR0aCA9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoOwotCQkJCQkJaWYgKHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCA+IGNhY2hlZEhlaWdodCkKLQkJCQkJCQljYWNoZWRIZWlnaHQgPSBwYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQl4YXhpc2JlZ2luID0gZmFsc2U7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkvLwkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLy8JCQkJCQkJCQkucHJpbnRsbigiUG9pbnQgOiAiICsgbmV3IFBvaW50KHgsIHkpLnRvU3RyaW5nKCkgKyAiQW5kIHdpZHRoPSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJLy8JCQkJCQkJCQkJCSsgY2FjaGVkV2lkdGgKLQkJCQkJCQkvLwkJCQkJCQkJCQkJKyAiLCBIZWlnaHQ9IiArIGNhY2hlZEhlaWdodCArICIsIFdpZHRoIG9mIFZpZXdlcjogIiArIHZpZXdlcldpZHRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIGFuZCBzZXRzIHNpemUgb2YgdGhlIGdpdmVuIG5vZGUKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAKLQkgKiBUT0RPIC0gTm90IHVzZWQgY3VycmVudGx5LCB3ZSBuZWVkIHRvIHNlZSB3aGV0aGVyIHdlIG5lZWQgdGhpcyBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2FsY1NpemUoT2JqZWN0IGNoaWxkKSB7Ci0JCUxpc3QgbGlzdCA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGNoaWxkKS5nZXRDaGlsZHJlbigpOwotCQlpbnQgbGFyZ2VzdFdpZHRoID0gMDsKLQkJaW50IGxhcmdlc3RIZWlnaHQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJVmlldyB2aWV3T2JqID0gKFZpZXcpICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IG9iak5vZGUgPSB2aWV3T2JqLmdldEVsZW1lbnQoKTsKLQkJCQlpZiAob2JqTm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpIHsKLQkJCQkJaW50IG5vZGVXaWR0aCA9ICgoTm9kZUVkaXRQYXJ0KSBvYmopLmdldEZpZ3VyZSgpCi0JCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS53aWR0aDsKLQkJCQkJaW50IG5vZGVIZWlnaHQgPSAoKE5vZGVFZGl0UGFydCkgb2JqKS5nZXRGaWd1cmUoKQotCQkJCQkJCS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0OwotCQkJCQlpZiAobm9kZVdpZHRoID4gbGFyZ2VzdFdpZHRoKQotCQkJCQkJbGFyZ2VzdFdpZHRoID0gbm9kZVdpZHRoOwotCQkJCQlpZiAobm9kZUhlaWdodCA+IGxhcmdlc3RIZWlnaHQpCi0JCQkJCQlsYXJnZXN0SGVpZ2h0ID0gbm9kZUhlaWdodDsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQkoKFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQpIGNoaWxkKS5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotCQkJCW5ldyBEaW1lbnNpb24obGFyZ2VzdFdpZHRoICogMiArIDEwLCAyMCArIGxhcmdlc3RIZWlnaHQKLQkJCQkJCSogKGxpc3Quc2l6ZSgpIC8gMiArIDEpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyByZWNlbnRseSBhZGRkZWQgZWRpdHBhcnRzLiBVc3VhbGx5IGNhbGxlZCAKLQkgKiBieSBkaWFncmFtIHNlcnZpY2VzIHRvIGRvIGF1dG9sYXlvdXQgYWRqdXN0bWVudC4KLQkgKi8KLQlwdWJsaWMgTGlzdDxFZGl0UGFydD4gZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkgewotCQlyZXR1cm4gcmVjZW50bHlBZGRlZFBhcnRzOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSByZWNlbnRseSBhZGRlZCBlZGl0cGFydHMgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlY2VudGx5QWRkZWRQYXJ0cygpIHsKLQkJcmVjZW50bHlBZGRlZFBhcnRzLmNsZWFyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVklFV19fVklTSUJMRS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gZXZlbnQuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciA9PSBnZXRNb2RlbCgpKQotCQkJCXJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0JCQllbHNlIGlmIChldmVudC5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2hDb25uZWN0aW9uRWRpdFBhcnRzKHRoaXMpOwotCQkJfQotCQl9IGVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNTY3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmVVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeSBpbXBsZW1lbnRzIEVkaXRQYXJ0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGNyZWF0ZUVkaXRQYXJ0KEVkaXRQYXJ0IGNvbnRleHQsIE9iamVjdCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgbW9kZWw7Ci0JCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpKSB7Ci0KLQkJCWNhc2UgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFJvbGVOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgUm9sZU5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBUYXNrTm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFRhc2tOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0KAotCQkJCQkJdmlldyk7Ci0KLQkJCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IExpbmtFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IExpbmtOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gSGFuZGxlIGNyZWF0aW9uIG9mIHVucmVjb2duaXplZCBjaGlsZCBub2RlIEVkaXRQYXJ0cyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENlbGxFZGl0b3JMb2NhdG9yIGdldFRleHRDZWxsRWRpdG9yTG9jYXRvcigKLQkJCUlUZXh0QXdhcmVFZGl0UGFydCBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZS5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkKLQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3JMb2NhdG9yKChXcmFwTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKChMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIHdyYXBMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRleHRDZWxsRWRpdG9yTG9jYXRvcihXcmFwTGFiZWwgd3JhcExhYmVsKSB7Ci0JCQl0aGlzLndyYXBMYWJlbCA9IHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldFdyYXBMYWJlbCgpIHsKLQkJCXJldHVybiB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldFdyYXBMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRXcmFwTGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaWYgKGdldFdyYXBMYWJlbCgpLmlzVGV4dFdyYXBwZWQoKQotCQkJCQkmJiBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShyZWN0LndpZHRoLAotCQkJCQkJU1dULkRFRkFVTFQpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQl9Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9EaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY3MjNhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGFiZWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmZpZ3VyZXMuTGFiZWxMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydCBleHRlbmRzIExhYmVsRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQm91bmRzKCkgewotCQlJRmlndXJlIHJlZkZpZ3VyZSA9ICgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKTsKLQkJaW50IGR4ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBnZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TG9jYXRpb25fWSgpKSkuaW50VmFsdWUoKTsKLQkJUG9pbnQgb2Zmc2V0ID0gbmV3IFBvaW50KGR4LCBkeSk7Ci0JCWdldEZpZ3VyZSgpLmdldFBhcmVudCgpLnNldENvbnN0cmFpbnQoZ2V0RmlndXJlKCksCi0JCQkJbmV3IExhYmVsTG9jYXRvcihyZWZGaWd1cmUsIG9mZnNldCwgZ2V0S2V5UG9pbnQoKSkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJlbG9jYXRlKElGaWd1cmUgdGFyZ2V0KSB7Ci0JCQkJCQlQb2ludCBsb2NhdGlvbiA9IGdldFJlZmVyZW5jZVBvaW50KCkuZ2V0VHJhbnNsYXRlZCgKLQkJCQkJCQkJZ2V0T2Zmc2V0KCkpOwotCQkJCQkJbG9jYXRpb24udHJhbnNsYXRlKC10YXJnZXQuZ2V0Qm91bmRzKCkud2lkdGggLyAyLCAwKTsKLQkJCQkJCXRhcmdldC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCQl0YXJnZXQuc2V0U2l6ZShuZXcgRGltZW5zaW9uKAotCQkJCQkJCQl0YXJnZXQuZ2V0UHJlZmVycmVkU2l6ZSgpLndpZHRoLCB0YXJnZXQKLQkJCQkJCQkJCQkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQl9Ci0KLQkJCQkJcHJvdGVjdGVkIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQkJCQkJcmV0dXJuIGdldExhYmVsTG9jYXRpb24ocGFyZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0UmVmZXJlbmNlUG9pbnQoKSB7Ci0JCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKCgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldFBhcmVudCgpKS5nZXRGaWd1cmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBnZXRMYWJlbExvY2F0aW9uKElGaWd1cmUgcGFyZW50KSB7Ci0JCXJldHVybiBwYXJlbnQuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua0VkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYmEyYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtFZGl0UGFydCBleHRlbmRzIENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDMwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IExpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25GaWd1cmUoKSB7Ci0KLQkJcmV0dXJuIG5ldyBMaW5rRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgUG9seWxpbmVDb25uZWN0aW9uRXggewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgTGlua0ZpZ3VyZSgpIHsKLQkJCXRoaXMuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLmJsYWNrCi0KLQkJCSk7Ci0JCQlzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBQb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsKLQkJCVBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBQb2x5bGluZURlY29yYXRpb24oKTsKLQkJCS8vIGRpc3BhdGNoTmV4dD8KLQotCQkJUG9pbnRMaXN0IHBsID0gbmV3IFBvaW50TGlzdCgpOwotCQkJcGwuYWRkUG9pbnQoLTEsIDEpOwotCQkJcGwuYWRkUG9pbnQoMCwgMCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgLTEpOwotCQkJZGYuc2V0VGVtcGxhdGUocGwpOwotCQkJZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7Ci0KLQkJCXJldHVybiBkZjsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIG92ZXJyaWRlQ29sb3IgPSBEaWFncmFtQ29yZVV0aWwuZ2V0TGlua092ZXJyaWRlQ29sb3IoKEVkZ2UpIGdldE1vZGVsKCkpOwotCQlzdXBlci5zZXRGb3JlZ3JvdW5kQ29sb3Iob3ZlcnJpZGVDb2xvciAhPSBudWxsID8gb3ZlcnJpZGVDb2xvciA6IGNvbG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmlzaWJpbGl0eShib29sZWFuIHZpcykgewotCQlzdXBlci5zZXRWaXNpYmlsaXR5KHZpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL0xpbmtOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWYwMTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDA0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLCA0MCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua05hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2V5UG9pbnQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uTG9jYXRvci5NSURETEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCB0ZXh0KTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFRleHQoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0RWRpdFN0cmluZygKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBnZXRQYXJzZXIoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxOwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCQlwYXJzZXIgPSBQYXJzZXJTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0UGFyc2VyKGhpbnRBZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlyZWN0RWRpdE1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJc2V0TWFuYWdlcihuZXcgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKHRoaXMsIFRleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JDbGFzcyh0aGlzKSwgRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeQotCQkJCQkuZ2V0VGV4dENlbGxFZGl0b3JMb2NhdG9yKHRoaXMpKSk7Ci0JCX0KLQkJcmV0dXJuIG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hbmFnZXIoRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcikgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpIHsKLQkJZ2V0TWFuYWdlcigpLnNob3coKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpLmdldENsYXNzKCkgPT0gVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJU3RyaW5nIGZvbnROYW1lID0gRGlhZ3JhbUNvbnN0YW50cy5nZXRGb250TmFtZShzdHlsZSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JCWVsc2UKLQkJCXNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5nZXREZWZhdWx0Rm9udERhdGEoKSk7Ci0JfQotCQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5VmlldygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQlJRmlndXJlIGxhYmVsID0gY3JlYXRlRmlndXJlUHJpbSgpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlUHJpbSgpIHsKLQkJcmV0dXJuIG5ldyBXcmFwTGFiZWwoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZU5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MTkyZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Sb2xlTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlRWRpdFBhcnQgZXh0ZW5kcyBTaGFwZU5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMjAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjb250ZW50UGFuZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBwcmltYXJ5U2hhcGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVOb2RlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCi0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLlNFTUFOVElDX1JPTEUsCi0JCQkJbmV3IFJvbGVOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJUm9sZU5vZGVGaWd1cmUgZmlndXJlID0gbmV3IFJvbGVOb2RlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoUm9sZU5vZGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChjaGlsZEVkaXRQYXJ0IGluc3RhbmNlb2YgUm9sZU5vZGVOYW1lRWRpdFBhcnQpIHsKLQkJCSgoUm9sZU5vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpLnNldExhYmVsKGdldFByaW1hcnlTaGFwZSgpCi0JCQkJCS5nZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgZ2V0UHJpbWFyeUNoaWxkRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJLmdldFR5cGUoUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgUm9sZU5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgUm9sZU5vZGVGaWd1cmUoKSB7Ci0KLQkJCXRoaXMuc2V0T3V0bGluZShmYWxzZSk7Ci0JCQl0aGlzLnNldEJhY2tncm91bmRDb2xvcihST0xFTk9ERUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWdfMC5zZXRGb250KFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UKTsKLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOyAvLyBtb2RpZmllZAotCQkJc2V0RmlndXJlUm9sZU5vZGVOYW1lRmlndXJlKGZpZ18wKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFdyYXBMYWJlbCBmUm9sZU5vZGVOYW1lRmlndXJlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldEZpZ3VyZVJvbGVOb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmUm9sZU5vZGVOYW1lRmlndXJlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBzZXRGaWd1cmVSb2xlTm9kZU5hbWVGaWd1cmUoV3JhcExhYmVsIGZpZykgewotCQkJZlJvbGVOb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUk9MRU5PREVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLCAyNTUsIDI1NSwKLQkJCTE1Nik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGb250IFJPTEVOT0RFTkFNRUZJR1VSRV9GT05UID0gbmV3IEZvbnQoRGlzcGxheQotCQkJLmdldEN1cnJlbnQoKSwgIkFyaWFsIiwgOCwgU1dULk5PUk1BTCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZU5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZU5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3ZDIxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZU5hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUsCi0JCQkJbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIExpc3QgY3JlYXRlU2VsZWN0aW9uSGFuZGxlcygpIHsKLQkJCQkJCUxpc3QgaGFuZGxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCU5vblJlc2l6YWJsZUhhbmRsZUtpdC5hZGRNb3ZlSGFuZGxlKAotCQkJCQkJCQkoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSwgaGFuZGxlcyk7Ci0JCQkJCQlyZXR1cm4gaGFuZGxlczsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsVGV4dEhlbHBlcihJRmlndXJlIGZpZ3VyZSwgU3RyaW5nIHRleHQpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRJY29uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxJY29uSGVscGVyKElGaWd1cmUgZmlndXJlLCBJbWFnZSBpY29uKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldEljb24oaWNvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoV3JhcExhYmVsIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZGlhZ3JhbS9Sb2xlRGVzY3JpcHRvci5naWYiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZU5vZGVfMjAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKCk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlGb250RGF0YSBmb250RGF0YSA9IG5ldyBGb250RGF0YShmb250TmFtZSwgc3R5bGUKLQkJCQkJLmdldEZvbnRIZWlnaHQoKSwgKHN0eWxlLmlzQm9sZCgpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKQotCQkJCQl8IChzdHlsZS5pc0l0YWxpYygpID8gU1dULklUQUxJQyA6IFNXVC5OT1JNQUwpKTsKLQkJCXNldEZvbnQoZm9udERhdGEpOwotCQl9Ci0JCWVsc2UKLQkJCXNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5nZXREZWZhdWx0Rm9udERhdGEoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQyOGIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5Sb2xlVGFza0NvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXMuUmFpc2VkTWFyZ2luQm9yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BY3Rpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5BcnJhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAxOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCi0JCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBSb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJaWYgKGNoaWxkLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSkgPT0gbnVsbCkgewotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJVGV4dEF3YXJlRWRpdFBhcnQpIHsKLQkJCQkJCXJldHVybiBuZXcgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZmlndXJlID0gbmV3IFJvbGVUYXNrQ29tcG9zaXRlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAQG1vZGlmaWVkCi0JCSAqLwotCQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGVGaWd1cmUoKSB7Ci0KLQkJCW9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0IG15R2VuTGF5b3V0TWFuYWdlciA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dCgpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyLnNldFN0cmV0Y2hNaW5vckF4aXMoZmFsc2UpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyCi0JCQkJCS5zZXRNaW5vckFsaWdubWVudChvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dC5BTElHTl9DRU5URVIpOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyLnNldFNwYWNpbmcoMjApOwotCQkJbXlHZW5MYXlvdXRNYW5hZ2VyLnNldFZlcnRpY2FsKGZhbHNlKTsKLQotCQkJdGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7Ci0KLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFJPTEVUQVNLQ09NUE9TSVRFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCS8vCQkJdGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpCi0JCQkvLwkJCQkJLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwKLQkJCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDApKSk7Ci0JCQl0aGlzLnNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgUk9MRVRBU0tDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLAotCQkJMjU1LCAyNTUsIDE1Nik7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVib3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBjb25zdHJhaW50ID0gbmV3IFJlY3RhbmdsZSgwLCAwLCAtMSwgLTEpOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdGhpcy5nZXRNb2RlbCgpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgbm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQljb25zdHJhaW50LnNldExvY2F0aW9uKG5ldyBQb2ludChsb2NhdGlvbi5nZXRYKCksIGxvY2F0aW9uLmdldFkoKSkpOwotCQl9Ci0KLQkJKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0UGFyZW50KCkpLnNldExheW91dENvbnN0cmFpbnQodGhpcywKLQkJCQlnZXRGaWd1cmUoKSwgY29uc3RyYWludCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkvLwkJaWYobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQpewotCQkvLwkJCUFycmFuZ2VSZXF1ZXN0IGFycmFuZ2VSZXF1ZXN0ID0gbmV3IEFycmFuZ2VSZXF1ZXN0KEFjdGlvbklkcy5BQ1RJT05fQVJSQU5HRV9BTEwpOyBMaXN0IGwgPSBnZXRDaGlsZHJlbigpOwotCQkvLwkJCWFycmFuZ2VSZXF1ZXN0LnNldFBhcnRzVG9BcnJhbmdlKGwpOyAKLQkJLy8JCQlDb21tYW5kIGFycmFuZ2VDbWQgPSBnZXRDb21tYW5kKGFycmFuZ2VSZXF1ZXN0KTsgCi0JCS8vCQkJYXJyYW5nZUNtZC5leGVjdXRlKCk7Ci0JCS8vCQkJCi0JCS8vCQkJUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QoUmVxdWVzdENvbnN0YW50cy5SRVFfQVVUT1NJWkUpOwotCQkvLwkJCUNvbW1hbmQgYXV0b1NpemVDbWQgPSBnZXRDb21tYW5kKHJlcXVlc3QpOwotCQkvLwkJCWlmKGF1dG9TaXplQ21kICE9IG51bGwpewotCQkvLwkJCQlhdXRvU2l6ZUNtZC5leGVjdXRlKCk7Ci0JCS8vCQkJfQotCQkvLwkJfQotCQlzdXBlci5oYW5kbGVOb3RpZmljYXRpb25FdmVudChub3RpZmljYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJTGlzdDxWaWV3PiBsaXN0ID0gc3VwZXIuZ2V0TW9kZWxDaGlsZHJlbigpOwotCi0JCUNvbXBhcmF0b3I8Vmlldz4gYyA9IG5ldyBDb21wYXJhdG9yPFZpZXc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXcgbzEsIFZpZXcgbzIpIHsKLQkJCQlPYmplY3QgbW9kZWwxID0gKChWaWV3KSBvMSkuZ2V0RWxlbWVudCgpOwotCQkJCU9iamVjdCBtb2RlbDIgPSAoKFZpZXcpIG8yKS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKG1vZGVsMSBpbnN0YW5jZW9mIFRhc2tOb2RlICYmIG1vZGVsMiBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJCWlmICgoKFRhc2tOb2RlKSBtb2RlbDEpLmdldEluZGV4KCkgPj0gKChUYXNrTm9kZSkgbW9kZWwyKQotCQkJCQkJCS5nZXRJbmRleCgpKQotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX07Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgYyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZTNkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTGlzdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZmlndXJlcy5SZXNpemFibGVDb21wYXJ0bWVudEZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50RWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTW9kZWxDaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIGV2dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgotCQkJCS5jcmVhdGVGaWd1cmUoKTsKLQotCQkvLyByZW1vdmUgdGhlIHNwYWNpbmcKLQkJcmVzdWx0LmdldFNjcm9sbFBhbmUoKS5nZXRDb250ZW50cygpLnNldEJvcmRlcigKLQkJCQluZXcgTWFyZ2luQm9yZGVyKDAsIDAsIDAsIDApKTsKLQotCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsKLQkJcmVzdWx0LnNldEJvcmRlcihudWxsKTsKLQotCQkvLyBkaXNhYmxlIHNjcm9sbHBhbmUKLQkJcmVzdWx0LmdldFNjcm9sbFBhbmUoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9UYXNrTm9kZUVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1M2VjZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9UYXNrTm9kZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLlRhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5zZXJ2aWNlLkRpYWdyYW1SZXNldFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5nbG9iYWwuR2V0R2xvYmFsQWN0aW9uSGFuZGxlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTm90ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza05vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgVGFza05vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkxBWU9VVF9ST0xFLCBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGF5b3V0RWRpdFBvbGljeSBjcmVhdGVMYXlvdXRFZGl0UG9saWN5KCkgewotCQlMYXlvdXRFZGl0UG9saWN5IGxlcCA9IG5ldyBMYXlvdXRFZGl0UG9saWN5KCkgewotCi0JCQlwcm90ZWN0ZWQgRWRpdFBvbGljeSBjcmVhdGVDaGlsZEVkaXRQb2xpY3koRWRpdFBhcnQgY2hpbGQpIHsKLQkJCQlFZGl0UG9saWN5IHJlc3VsdCA9IGNoaWxkCi0JCQkJCQkuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IE5vblJlc2l6YWJsZUVkaXRQb2xpY3koKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0TW92ZUNoaWxkcmVuQ29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxlcDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlTm9kZVNoYXBlKCkgewotCQlUYXNrTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgVGFza05vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlRmlndXJlIGdldFByaW1hcnlTaGFwZSgpIHsKLQkJcmV0dXJuIChUYXNrTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBUYXNrTm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChUYXNrTm9kZU5hbWVFZGl0UGFydCkgY2hpbGRFZGl0UGFydCkuc2V0TGFiZWwoZ2V0UHJpbWFyeVNoYXBlKCkKLQkJCQkJLmdldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRml4ZWRDaGlsZChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlUGxhdGUoKSB7Ci0JCURlZmF1bHRTaXplTm9kZUZpZ3VyZSByZXN1bHQgPSBuZXcgRGVmYXVsdFNpemVOb2RlRmlndXJlKGdldE1hcE1vZGUoKQotCQkJCS5EUHRvTFAoNDApLCBnZXRNYXBNb2RlKCkuRFB0b0xQKDQwKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZUZpZ3VyZSgpIHsKLQkJTm9kZUZpZ3VyZSBmaWd1cmUgPSBjcmVhdGVOb2RlUGxhdGUoKTsKLQkJZmlndXJlLnNldExheW91dE1hbmFnZXIobmV3IFN0YWNrTGF5b3V0KCkpOwotCQlJRmlndXJlIHNoYXBlID0gY3JlYXRlTm9kZVNoYXBlKCk7Ci0JCWZpZ3VyZS5hZGQoc2hhcGUpOwotCQljb250ZW50UGFuZSA9IHNldHVwQ29udGVudFBhbmUoc2hhcGUpOwotCQlyZXR1cm4gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gdHJlYXRzIHBhc3NlZCBmaWd1cmUgYXMgY29udGVudCBwYW5lLgotCSAqIFJlc3BlY3RzIGxheW91dCBvbmUgbWF5IGhhdmUgc2V0IGZvciBnZW5lcmF0ZWQgZmlndXJlLgotCSAqIEBwYXJhbSBub2RlU2hhcGUgaW5zdGFuY2Ugb2YgZ2VuZXJhdGVkIGZpZ3VyZSBjbGFzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBzZXR1cENvbnRlbnRQYW5lKElGaWd1cmUgbm9kZVNoYXBlKSB7Ci0JCWlmIChub2RlU2hhcGUuZ2V0TGF5b3V0TWFuYWdlcigpID09IG51bGwpIHsKLQkJCUNvbnN0cmFpbmVkVG9vbGJhckxheW91dCBsYXlvdXQgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0KCk7Ci0JCQlsYXlvdXQuc2V0U3BhY2luZyhnZXRNYXBNb2RlKCkuRFB0b0xQKDUpKTsKLQkJCW5vZGVTaGFwZS5zZXRMYXlvdXRNYW5hZ2VyKGxheW91dCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVTaGFwZTsgLy8gdXNlIG5vZGVTaGFwZSBpdHNlbGYgYXMgY29udGVudFBhbmUKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElGaWd1cmUgZ2V0Q29udGVudFBhbmUoKSB7Ci0JCWlmIChjb250ZW50UGFuZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29udGVudFBhbmU7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQYW5lKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBnZXRQcmltYXJ5Q2hpbGRFZGl0UGFydCgpIHsKLQkJcmV0dXJuIGdldENoaWxkQnlTZW1hbnRpY0hpbnQoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBUYXNrTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUYXNrTm9kZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRPdXRsaW5lKGZhbHNlKTsKLQkJCXRoaXMuc2V0TGluZVdpZHRoKDApOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoVEFTS05PREVGSUdVUkVfQkFDSwotCi0JCQkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBXaWRlbmVkV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlnXzAuc2V0Rm9udChUQVNLTk9ERU5BTUVGSUdVUkVfRk9OVCk7Ci0JCQlEaWFncmFtQ29yZVV0aWwuc2V0TGFiZWxQcm9wZXJ0aWVzKGZpZ18wKTsgLy8gbW9kaWZpZWQKLQkJCXNldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0JCQlmaWdfMC5zZXRUZXh0V3JhcEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJCWZpZ18wLnNldFRleHRXcmFwV2lkdGgoMTAwKTsKLQotCQkJT2JqZWN0IGxheURhdGEwID0gbnVsbDsKLQotCQkJdGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIGZUYXNrTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlVGFza05vZGVOYW1lRmlndXJlKCkgewotCQkJcmV0dXJuIGZUYXNrTm9kZU5hbWVGaWd1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHNldEZpZ3VyZVRhc2tOb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmVGFza05vZGVOYW1lRmlndXJlID0gZmlnOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnQgVEFTS05PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgRm9udChEaXNwbGF5Ci0JCQkuZ2V0Q3VycmVudCgpLCAiQXJpYWwiLCA4LCBTV1QuTk9STUFMKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFRBU0tOT0RFRklHVVJFX0JBQ0sgPSBuZXcgQ29sb3IobnVsbCwgMjU1LCAyNTUsCi0JCQkxNTYpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCWlmKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza05vZGVfSW5kZXgoKS5lcXVhbHMoZmVhdHVyZSkpewotCQkJRWRpdFBhcnQgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoKTsKLQkJCWlmKHBhcmVudCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQgKXsKLQkJCQkoKFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpcGFyZW50KS5yZWZyZXNoKCk7Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVSZXNldExheW91dChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0IHBhcmVudCl7Ci0JCUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoR3JhcGhpY2FsVmlld2VyKSgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydClwYXJlbnQpLmdldFZpZXdlcigpOwotCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCBkZXAgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpdmlld2VyLmdldENvbnRlbnRzKCk7Ci0JCUxpc3Q8RWRpdFBhcnQ+IGxvY2FsID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQkJaWYoZGVwLmdldENoaWxkcmVuKCkgIT0gbnVsbCAmJiAhZGVwLmdldENoaWxkcmVuKCkuaXNFbXB0eSgpKXsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGRlcC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKCEobmV4dCBpbnN0YW5jZW9mIE5vdGVFZGl0UGFydCkpewotCQkJCQlsb2NhbC5hZGQoKEVkaXRQYXJ0KW5leHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGxvY2FsKTsKLS8vCQlEaWFncmFtUmVzZXRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgRGlhZ3JhbVJlc2V0U2VydmljZSgoKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpdmlld2VyKS5nZXRFCi0vLwkJCQl2aWV3ZXIsIGdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0vLwkJc2VydmljZS5jbGVhblVwRGlhZ3JhbSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvVGFza05vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NhNGI4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1Rhc2tOb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmhhbmRsZXMuTm9uUmVzaXphYmxlSGFuZGxlS2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkRpcmVjdEVkaXRSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkubDEwbi5EaWFncmFtQ29sb3JSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5JU2VtYW50aWNQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJIaW50QWRhcHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydCBpbXBsZW1lbnRzCi0JCUlUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlTmFtZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LkRJUkVDVF9FRElUX1JPTEUsCi0JCQkJbmV3IExhYmVsRGlyZWN0RWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSwKLQkJCQluZXcgTm9uUmVzaXphYmxlRWRpdFBvbGljeSgpIHsKLQotCQkJCQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQkJCQkJTGlzdCBoYW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJTm9uUmVzaXphYmxlSGFuZGxlS2l0LmFkZE1vdmVIYW5kbGUoCi0JCQkJCQkJCShHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpLCBoYW5kbGVzKTsKLQkJCQkJCXJldHVybiBoYW5kbGVzOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIGJvb2xlYW4gdW5kZXJzdGFuZHNSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChXcmFwTGFiZWwgZmlndXJlKSB7Ci0JCXVucmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXNldEZpZ3VyZShmaWd1cmUpOwotCQlkZWZhdWx0VGV4dCA9IGdldExhYmVsVGV4dEhlbHBlcihmaWd1cmUpOwotCQlyZWdpc3RlclZpc3VhbHMoKTsKLQkJcmVmcmVzaFZpc3VhbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0TW9kZWxDaGlsZHJlbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2hpbGRCeVNlbWFudGljSGludChTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRQYXJzZXJFbGVtZW50KCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCXJldHVybiBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50IDogKFZpZXcpIGdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbigpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFNoYXJlZEltYWdlKAotCQkJCSJkaWFncmFtL1Rhc2tEZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwpIHsKLQkJCXRleHQgPSBnZXRQYXJzZXIoKS5nZXRQcmludFN0cmluZygKLQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJdGV4dCA9IGRlZmF1bHRUZXh0OwotCQl9Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpIDwgMTYpIHsKLQkJCWludCBnYXAgPSAxNiAtIHRleHQubGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdhcCAvIDI7IGkrKykgewotCQkJCXRleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdhcCAvIDI7IGkrKykgewotCQkJCXRleHQgPSAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJdGV4dCA9IERpYWdyYW1Db3JlVXRpbC53cmFwKHRleHQsIDEyKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIHRleHQpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFZGl0VGV4dCgpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRFZGl0U3RyaW5nKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCWdldFBhcnNlck9wdGlvbnMoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JCS8vCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMjsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQkJZWxzZQotCQkJc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLmdldERlZmF1bHRGb250RGF0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQ3N2U1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLk1hcmdpbkJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5TdGFja0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Q29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5SYWlzZWRNYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSVRleHRBd2FyZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNvbnN0cmFpbmVkVG9vbGJhckxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ3JlYXRpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkRyYWdEcm9wRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAxMDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DUkVBVElPTl9ST0xFLAotCQkJCW5ldyBDcmVhdGlvbkVkaXRQb2xpY3koKSk7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuRFJBR19EUk9QX1JPTEUsCi0JCQkJbmV3IERyYWdEcm9wRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuTEFZT1VUX1JPTEUsIGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMYXlvdXRFZGl0UG9saWN5IGNyZWF0ZUxheW91dEVkaXRQb2xpY3koKSB7Ci0KLQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJaWYgKGNoaWxkLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSkgPT0gbnVsbCkgewotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJVGV4dEF3YXJlRWRpdFBhcnQpIHsKLQkJCQkJCXJldHVybiBuZXcgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNoaWxkRWRpdFBvbGljeShjaGlsZCk7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZmlndXJlID0gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlRmlndXJlKCk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUgPSBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUpIHByaW1hcnlTaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5vZGVGaWd1cmUgY3JlYXRlTm9kZVBsYXRlKCkgewotCQlEZWZhdWx0U2l6ZU5vZGVGaWd1cmUgcmVzdWx0ID0gbmV3IERlZmF1bHRTaXplTm9kZUZpZ3VyZShnZXRNYXBNb2RlKCkKLQkJCQkuRFB0b0xQKDQwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZmlndXJlIGZvciB0aGlzIGVkaXQgcGFydC4KLQkgKiAKLQkgKiBCb2R5IG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGRlcGVuZCBvbiBzZXR0aW5ncyBpbiBnZW5lcmF0aW9uIG1vZGVsCi0JICogc28geW91IG1heSBzYWZlbHkgcmVtb3ZlIDxpPmdlbmVyYXRlZDwvaT4gdGFnIGFuZCBtb2RpZnkgaXQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVGaWd1cmUoKSB7Ci0JCU5vZGVGaWd1cmUgZmlndXJlID0gY3JlYXRlTm9kZVBsYXRlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBTdGFja0xheW91dCgpKTsKLQkJSUZpZ3VyZSBzaGFwZSA9IGNyZWF0ZU5vZGVTaGFwZSgpOwotCQlmaWd1cmUuYWRkKHNoYXBlKTsKLQkJY29udGVudFBhbmUgPSBzZXR1cENvbnRlbnRQYW5lKHNoYXBlKTsKLQkJcmV0dXJuIGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHRyZWF0cyBwYXNzZWQgZmlndXJlIGFzIGNvbnRlbnQgcGFuZS4KLQkgKiBSZXNwZWN0cyBsYXlvdXQgb25lIG1heSBoYXZlIHNldCBmb3IgZ2VuZXJhdGVkIGZpZ3VyZS4KLQkgKiBAcGFyYW0gbm9kZVNoYXBlIGluc3RhbmNlIG9mIGdlbmVyYXRlZCBmaWd1cmUgY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgc2V0dXBDb250ZW50UGFuZShJRmlndXJlIG5vZGVTaGFwZSkgewotCQlpZiAobm9kZVNoYXBlLmdldExheW91dE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQlDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQgbGF5b3V0ID0gbmV3IENvbnN0cmFpbmVkVG9vbGJhckxheW91dCgpOwotCQkJbGF5b3V0LnNldFNwYWNpbmcoZ2V0TWFwTW9kZSgpLkRQdG9MUCg1KSk7Ci0JCQlub2RlU2hhcGUuc2V0TGF5b3V0TWFuYWdlcihsYXlvdXQpOwotCQl9Ci0JCXJldHVybiBub2RlU2hhcGU7IC8vIHVzZSBub2RlU2hhcGUgaXRzZWxmIGFzIGNvbnRlbnRQYW5lCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGdldENvbnRlbnRQYW5lKCkgewotCQlpZiAoY29udGVudFBhbmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRlbnRQYW5lOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICovCi0JCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUZpZ3VyZSgpIHsKLQotCQkJb3JnLmVjbGlwc2UuZHJhdzJkLlRvb2xiYXJMYXlvdXQgbXlHZW5MYXlvdXRNYW5hZ2VyID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0KCk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0U3RyZXRjaE1pbm9yQXhpcyhmYWxzZSk7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIKLQkJCQkJLnNldE1pbm9yQWxpZ25tZW50KG9yZy5lY2xpcHNlLmRyYXcyZC5Ub29sYmFyTGF5b3V0LkFMSUdOX0NFTlRFUik7Ci0JCQlteUdlbkxheW91dE1hbmFnZXIuc2V0U3BhY2luZyg1KTsKLQkJCW15R2VuTGF5b3V0TWFuYWdlci5zZXRWZXJ0aWNhbCh0cnVlKTsKLQotCQkJdGhpcy5zZXRMYXlvdXRNYW5hZ2VyKG15R2VuTGF5b3V0TWFuYWdlcik7Ci0KLQkJCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKFdPUktQUk9EVUNUQ09NUE9TSVRFRklHVVJFX0JBQ0sKLQotCQkJKTsKLQkJCS8vCQkJdGhpcy5zZXRCb3JkZXIobmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXIoZ2V0TWFwTW9kZSgpCi0JCQkvLwkJCQkJLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgwKSwKLQkJCS8vCQkJCQlnZXRNYXBNb2RlKCkuRFB0b0xQKDApKSk7Ci0JCQl0aGlzLnNldEJvcmRlcihuZXcgUmFpc2VkTWFyZ2luQm9yZGVyKCkpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgewotCQkJcmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgewotCQkJbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgV09SS1BST0RVQ1RDT01QT1NJVEVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcihudWxsLAotCQkJMjU1LCAyNTUsIDIwNSk7Ci0KLQkvKioKLQkgKiBAY3VzdG9tCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlYm91bmRzKCkgewotCQlSZWN0YW5nbGUgY29uc3RyYWludCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgLTEsIC0xKTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIHRoaXMuZ2V0TW9kZWwoKTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIG5vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJY29uc3RyYWludC5zZXRMb2NhdGlvbihuZXcgUG9pbnQobG9jYXRpb24uZ2V0WCgpLCBsb2NhdGlvbi5nZXRZKCkpKTsKLQkJfQotCQkvLwkJY29uc3RyYWludC53aWR0aCA9IGdldE5vZGUoKS5nZXRXaWR0aCgpOwotCQkoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuc2V0TGF5b3V0Q29uc3RyYWludCh0aGlzLAotCQkJCWdldEZpZ3VyZSgpLCBjb25zdHJhaW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTFhMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTWFyZ2luQm9yZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0Lk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxpc3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLlJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50RWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDUwMDI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTW9kZWxDaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIGV2dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21wYXJ0bWVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBJRmlndXJlIGNyZWF0ZUZpZ3VyZSgpIHsKLQkJUmVzaXphYmxlQ29tcGFydG1lbnRGaWd1cmUgcmVzdWx0ID0gKFJlc2l6YWJsZUNvbXBhcnRtZW50RmlndXJlKSBzdXBlcgotCQkJCS5jcmVhdGVGaWd1cmUoKTsKLQotCQkvLyByZW1vdmUgdGhlIHNwYWNpbmcKLQkJcmVzdWx0LmdldFNjcm9sbFBhbmUoKS5nZXRDb250ZW50cygpLnNldEJvcmRlcigKLQkJCQluZXcgTWFyZ2luQm9yZGVyKDAsIDAsIDAsIDApKTsKLQotCQlyZXN1bHQuc2V0VGl0bGVWaXNpYmlsaXR5KGZhbHNlKTsKLQkJcmVzdWx0LnNldEJvcmRlcihudWxsKTsKLQotCQkvLyBkaXNhYmxlIHNjcm9sbHBhbmUgJiBjb21wYXJ0bWVudCB0aXRsZQotCQlyZXN1bHQuZ2V0U2Nyb2xsUGFuZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KAotCQkJCUVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYXRpbyhEb3VibGUgcmF0aW8pIHsKLQkJLy8gbm90aGluZyB0byBkbyAtLSBwYXJlbnQgbGF5b3V0IGRvZXMgbm90IGFjY2VwdCBEb3VibGUgY29uc3RyYWludHMgYXMgcmF0aW8KLQkJLy8gc3VwZXIuc2V0UmF0aW8ocmF0aW8pOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlODVmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLldpZGVuZWRXcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5MYXlvdXRFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmdlZi51aS5maWd1cmVzLkRlZmF1bHRTaXplTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5Ob2RlRmlndXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydCBleHRlbmRzIFNoYXBlTm9kZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSAyMDAzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNvbnRlbnRQYW5lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHByaW1hcnlTaGFwZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5TRU1BTlRJQ19ST0xFLAotCQkJCW5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBmaWd1cmUgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSgpOwotCQlyZXR1cm4gcHJpbWFyeVNoYXBlID0gZmlndXJlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSkgcHJpbWFyeVNoYXBlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQkJaWYgKGNoaWxkRWRpdFBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0KSB7Ci0JCQkoKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKQotCQkJCQkJCS5nZXRGaWd1cmVXb3JrUHJvZHVjdE5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoaWxkVmlzdWFsKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQsIGludCBpbmRleCkgewotCQlpZiAoYWRkRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmFkZENoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQsIC0xKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAocmVtb3ZlRml4ZWRDaGlsZChjaGlsZEVkaXRQYXJ0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnJlbW92ZUNoaWxkVmlzdWFsKGNoaWxkRWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBnZXRDb250ZW50UGFuZUZvcihJR3JhcGhpY2FsRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmVGb3IoZWRpdFBhcnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUZpZ3VyZSBleHRlbmRzIFJlY3RhbmdsZUZpZ3VyZSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoV09SS1BST0RVQ1RERVNDUklQVE9STk9ERUZJR1VSRV9CQUNLCi0KLQkJCSk7Ci0JCQljcmVhdGVDb250ZW50cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZ18wID0gbmV3IFdpZGVuZWRXcmFwTGFiZWwoKTsKLQkJCWZpZ18wLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWdfMC5zZXRGb250KFdPUktQUk9EVUNUTk9ERU5BTUVGSUdVUkVfRk9OVCk7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOyAvLyBtb2RpZmllZAotCQkJc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0JCQlmaWdfMC5zZXRUZXh0V3JhcEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5MRUZUKTsKLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZldvcmtQcm9kdWN0Tm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmV29ya1Byb2R1Y3ROb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBXT1JLUFJPRFVDVE5PREVOQU1FRklHVVJFX0ZPTlQgPSBuZXcgRm9udChEaXNwbGF5Ci0JCQkuZ2V0Q3VycmVudCgpLCAiQXJpYWwiLCA4LCBTV1QuTk9STUFMKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFdPUktQUk9EVUNUREVTQ1JJUFRPUk5PREVGSUdVUkVfQkFDSyA9IG5ldyBDb2xvcigKLQkJCW51bGwsIDI1NSwgMjU1LCAyMDUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDg0ZTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbEVkaXRvclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0IGV4dGVuZHMgQ29tcGFydG1lbnRFZGl0UGFydAotCQlpbXBsZW1lbnRzIElUZXh0QXdhcmVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gNDAwMzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgcGFyc2VyRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFRleHQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImRpYWdyYW0vV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJdGV4dCA9IGdldFBhcnNlcigpLmdldFByaW50U3RyaW5nKAotCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSwKLQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0ZXh0ID0gZGVmYXVsdFRleHQ7Ci0JCX0KLQkJdGV4dCA9IERpYWdyYW1Db3JlVXRpbC53cmFwKHRleHQsIDMpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQkJLy8JCXJldHVybiBnZXRFZGl0VGV4dCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ2VsbEVkaXRvclZhbGlkYXRvciBnZXRFZGl0VGV4dFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2VsbEVkaXRvclZhbGlkYXRvcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlmaW5hbCBFT2JqZWN0IGVsZW1lbnQgPSBnZXRQYXJzZXJFbGVtZW50KCk7Ci0JCQkJCWZpbmFsIElQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZCA9IChJUGFyc2VyRWRpdFN0YXR1cykgZ2V0RWRpdGluZ0RvbWFpbigpCi0JCQkJCQkJCS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlV2l0aFJlc3VsdC5JbXBsKCkgewotCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJc2V0UmVzdWx0KHBhcnNlci5pc1ZhbGlkRWRpdFN0cmluZygKLQkJCQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihlbGVtZW50KSwKLQkJCQkJCQkJCQkJCShTdHJpbmcpIHZhbHVlKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIHZhbGlkLmdldENvZGUoKSA9PSBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFID8gbnVsbAotCQkJCQkJCQk6IHZhbGlkLmdldE1lc3NhZ2UoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQkJCWllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gc2hvdWxkbid0IGdldCBoZXJlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldENvbXBsZXRpb25Qcm9jZXNzb3IoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFyc2VyT3B0aW9ucyBnZXRQYXJzZXJPcHRpb25zKCkgewotCQlyZXR1cm4gUGFyc2VyT3B0aW9ucy5OT05FOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhcnNlckhpbnQgPSAoKFZpZXcpIGdldE1vZGVsKCkpLmdldFR5cGUoKTsKLQkJCVBhcnNlckhpbnRBZGFwdGVyIGhpbnRBZGFwdGVyID0gbmV3IFBhcnNlckhpbnRBZGFwdGVyKAotCQkJCQlnZXRQYXJzZXJFbGVtZW50KCksIHBhcnNlckhpbnQpIHsKLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDM7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXJlY3RFZGl0TWFuYWdlciBnZXRNYW5hZ2VyKCkgewotCQlpZiAobWFuYWdlciA9PSBudWxsKSB7Ci0JCQlzZXRNYW5hZ2VyKG5ldyBUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywgVGV4dERpcmVjdEVkaXRNYW5hZ2VyCi0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckxvY2F0b3IodGhpcykpKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFuYWdlcihEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQlnZXRNYW5hZ2VyKCkuc2hvdygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChQb2ludCBldmVudExvY2F0aW9uKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkuZ2V0Q2xhc3MoKSA9PSBUZXh0RGlyZWN0RWRpdE1hbmFnZXIuY2xhc3MpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coZXZlbnRMb2NhdGlvbgotCQkJCQkuZ2V0U1dUUG9pbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KGNoYXIgaW5pdGlhbENoYXJhY3RlcikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGluaXRpYWxDaGFyYWN0ZXIpOwotCQl9IGVsc2UgewotCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWZpbmFsIFJlcXVlc3QgdGhlUmVxdWVzdCA9IHJlcXVlc3Q7Ci0JCXRyeSB7Ci0JCQlnZXRFZGl0aW5nRG9tYWluKCkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzQWN0aXZlKCkgJiYgaXNFZGl0YWJsZSgpKSB7Ci0JCQkJCQlpZiAodGhlUmVxdWVzdAotCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7Ci0JCQkJCQkJQ2hhcmFjdGVyIGluaXRpYWxDaGFyID0gKENoYXJhY3RlcikgdGhlUmVxdWVzdAotCQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ESVJFQ1RFRElUX0VYVEVOREVEREFUQV9JTklUSUFMX0NIQVIpOwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGluaXRpYWxDaGFyLmNoYXJWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoKHRoZVJlcXVlc3QgaW5zdGFuY2VvZiBEaXJlY3RFZGl0UmVxdWVzdCkKLQkJCQkJCQkJJiYgKGdldEVkaXRUZXh0KCkuZXF1YWxzKGdldExhYmVsVGV4dCgpKSkpIHsKLQkJCQkJCQlEaXJlY3RFZGl0UmVxdWVzdCBlZGl0UmVxdWVzdCA9IChEaXJlY3RFZGl0UmVxdWVzdCkgdGhlUmVxdWVzdDsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChlZGl0UmVxdWVzdC5nZXRMb2NhdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hWaXN1YWxzKCkgewotCQlzdXBlci5yZWZyZXNoVmlzdWFscygpOwotCQlyZWZyZXNoTGFiZWwoKTsKLQkJcmVmcmVzaEZvbnQoKTsKLQkJcmVmcmVzaEZvbnRDb2xvcigpOwotCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hMYWJlbCgpIHsKLQkJc2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbFRleHQoKSk7Ci0JCXNldExhYmVsSWNvbkhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxJY29uKCkpOwotCQlPYmplY3QgcGRFZGl0UG9saWN5ID0gZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFKTsKLQkJaWYgKHBkRWRpdFBvbGljeSBpbnN0YW5jZW9mIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgewotCQkJKChEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHBkRWRpdFBvbGljeSkucmVmcmVzaEZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybGluZSgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRVbmRlcmxpbmUoc3R5bGUuaXNVbmRlcmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFN0cmlrZVRocm91Z2goKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0U3RyaWtlVGhyb3VnaChzdHlsZQotCQkJCQkuaXNTdHJpa2VUaHJvdWdoKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvbnQoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQkJZWxzZQotCQkJc2V0Rm9udChEaWFncmFtQ29uc3RhbnRzLmdldERlZmF1bHRGb250RGF0YSgpKTsKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGb250Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQ29sb3IgYyA9IERpYWdyYW1Db3JlVXRpbC5nZXRGb250Q29sb3IodGhpcyk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWNvbG9yID0gYzsKLQkJfQotCQlnZXRGaWd1cmUoKS5zZXRGb3JlZ3JvdW5kQ29sb3IoY29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZW1hbnRpY0xpc3RlbmVycygpIHsKLQkJaWYgKGdldFBhcnNlcigpIGluc3RhbmNlb2YgSVNlbWFudGljUGFyc2VyKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSByZXNvbHZlU2VtYW50aWNFbGVtZW50KCk7Ci0JCQlwYXJzZXJFbGVtZW50cyA9ICgoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKSkKLQkJCQkJLmdldFNlbWFudGljRWxlbWVudHNCZWluZ1BhcnNlZChlbGVtZW50KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VyRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhZGRMaXN0ZW5lckZpbHRlcigKLQkJCQkJCSJTZW1hbnRpY01vZGVsIiArIGksIHRoaXMsIChFT2JqZWN0KSBwYXJzZXJFbGVtZW50cy5nZXQoaSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5hZGRTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAocGFyc2VyRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJTZW1hbnRpY01vZGVsIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5yZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlRWRpdFBhcnQgZ2V0QWNjZXNzaWJsZUVkaXRQYXJ0KCkgewotCQlpZiAoYWNjZXNzaWJsZUVQID09IG51bGwpIHsKLQkJCWFjY2Vzc2libGVFUCA9IG5ldyBBY2Nlc3NpYmxlR3JhcGhpY2FsRWRpdFBhcnQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7Ci0JCQkJCWUucmVzdWx0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGdldEZpZ3VyZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBhY2Nlc3NpYmxlRVA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmlldyBnZXRGb250U3R5bGVPd25lclZpZXcoKSB7Ci0JCXJldHVybiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTm90YXRpb25hbExpc3RlbmVycygpOwotCQlhZGRMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciLCB0aGlzLCBnZXRQcmltYXJ5VmlldygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVOb3RhdGlvbmFsTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUxpc3RlbmVyRmlsdGVyKCJQcmltYXJ5VmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCS8vIFBhcmVudCBzaG91bGQgYXNzaWduIG9uZSB1c2luZyBzZXRMYWJlbCgpIG1ldGhvZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI2ODlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxDb25uZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZ2V0U2VtYW50aWNIb3N0KCkgewotCQlyZXR1cm4gaG9zdCgpLmdldE1vZGVsKCkgIT0gbnVsbCA/IHN1cGVyLmdldFNlbWFudGljSG9zdCgpIDogbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaE9uQWN0aXZhdGUoKSB7CQkKLQkJc3VwZXIucmVmcmVzaE9uQWN0aXZhdGUoKTsKLQkJCi0JCUVkaXRQYXJ0IGVwID0gZ2V0SG9zdCgpOwotCQlpZihlcCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwuaW5pdGlhbGl6ZU9uQWN0aXZhdGUoKERpYWdyYW1FZGl0UGFydCkgZXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZUNvbnRhaW5lcikgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQluZXh0VmFsdWUpOwotCQkJc3dpdGNoIChub2RlVklEKSB7Ci0JCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQkJcmVzdWx0LmFkZChuZXh0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldENvbm5lY3Rpb25zKENvbGxlY3Rpb24gY29ubmVjdGlvbnMsCi0JCQlOb2RlQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWNvbm5lY3Rpb25zLmFkZEFsbChub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQlnZXRDb25uZWN0aW9ucyhjb25uZWN0aW9ucywgKE5vZGVDb250YWluZXIpIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDb25uZWN0aW9uc0xpc3QoKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBhZGQgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSAoKFZpZXcpIGdldEhvc3QoKQotCQkJCS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldENvbm5lY3Rpb25zKGNvbm5lY3Rpb25zLCBhZGQpOwotCQlyZXR1cm4gY29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlRWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuICgoTGluaykgcmVsYXRpb25zaGlwKS5nZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRUYXJnZXRFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gKChMaW5rKSByZWxhdGlvbnNoaXApLmdldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGVDb25uZWN0aW9uKEVkZ2UgY29ubmVjdG9yLAotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oY29ubmVjdG9yLCBjaGlsZHJlbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbWFudGljKCkgewotCQlMaXN0IGNyZWF0ZWRWaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwocmVmcmVzaFNlbWFudGljQ2hpbGRyZW4oKSk7Ci0JCUxpc3QgY3JlYXRlZENvbm5lY3Rpb25WaWV3cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWNyZWF0ZWRDb25uZWN0aW9uVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0Nvbm5lY3Rpb25zKCkpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoQ29ubmVjdGlvbnMoKSk7Ci0KLQkJLy8JCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgewotCQkvLwkJCS8vIHBlcmZvcm0gYSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lcgotCQkvLwkJCURlZmVycmVkTGF5b3V0Q29tbWFuZCBsYXlvdXRDbWQgPSBuZXcgRGVmZXJyZWRMYXlvdXRDb21tYW5kKGhvc3QoKQotCQkvLwkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOwotCQkvLwkJCWV4ZWN1dGVDb21tYW5kKG5ldyBJQ29tbWFuZFByb3h5KGxheW91dENtZCkpOwotCQkvLwkJfQotCi0JCWNyZWF0ZWRWaWV3cy5hZGRBbGwoY3JlYXRlZENvbm5lY3Rpb25WaWV3cyk7Ci0JCW1ha2VWaWV3c0ltbXV0YWJsZShjcmVhdGVkVmlld3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gbXlMaW5rRGVzY3JpcHRvcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWFwIG15RU9iamVjdDJWaWV3TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVmcmVzaENvbm5lY3Rpb25zKCkgewotCQl0cnkgewotCQkJY29sbGVjdEFsbExpbmtzKGdldERpYWdyYW0oKSk7Ci0JCQlDb2xsZWN0aW9uIGV4aXN0aW5nTGlua3MgPSBuZXcgTGlua2VkTGlzdChnZXREaWFncmFtKCkuZ2V0RWRnZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGRpYWdyYW1MaW5rcyA9IGV4aXN0aW5nTGlua3MuaXRlcmF0b3IoKTsgZGlhZ3JhbUxpbmtzCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRWRnZSBuZXh0RGlhZ3JhbUxpbmsgPSAoRWRnZSkgZGlhZ3JhbUxpbmtzLm5leHQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rT2JqZWN0ID0gbmV4dERpYWdyYW1MaW5rLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rU3JjID0gbmV4dERpYWdyYW1MaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCUVPYmplY3QgZGlhZ3JhbUxpbmtEc3QgPSBuZXh0RGlhZ3JhbUxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJaW50IGRpYWdyYW1MaW5rVmlzdWFsSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFZpc3VhbElEKG5leHREaWFncmFtTGluayk7Ci0JCQkJZm9yIChJdGVyYXRvciBtb2RlbExpbmtEZXNjcmlwdG9ycyA9IG15TGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkuaXRlcmF0b3IoKTsgbW9kZWxMaW5rRGVzY3JpcHRvcnMuaGFzTmV4dCgpOykgewotCQkJCQlMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIG1vZGVsTGlua0Rlc2NyaXB0b3JzCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJaWYgKGRpYWdyYW1MaW5rT2JqZWN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCS5nZXRMaW5rRWxlbWVudCgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtTcmMgPT0gbmV4dExpbmtEZXNjcmlwdG9yLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgZGlhZ3JhbUxpbmtEc3QgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0RGVzdGluYXRpb24oKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rVmlzdWFsSUQgPT0gbmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCQkJCQkuZ2V0VmlzdWFsSUQoKSkgewotCQkJCQkJZGlhZ3JhbUxpbmtzLnJlbW92ZSgpOwotCQkJCQkJbW9kZWxMaW5rRGVzY3JpcHRvcnMucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlkZWxldGVWaWV3cyhleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCkpOwotCQkJcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25zKG15TGlua0Rlc2NyaXB0b3JzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW15TGlua0Rlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCQlteUVPYmplY3QyVmlld01hcC5jbGVhcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0QWxsTGlua3MoVmlldyB2aWV3KSB7Ci0JCUVPYmplY3QgbW9kZWxFbGVtZW50ID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCWludCBkaWFncmFtRWxlbWVudFZpc3VhbElEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldyk7Ci0JCXN3aXRjaCAoZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCkgewotCQljYXNlIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQljYXNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOiB7Ci0JCQlteUVPYmplY3QyVmlld01hcC5wdXQobW9kZWxFbGVtZW50LCB2aWV3KTsKLQkJCXN0b3JlTGlua3MobW9kZWxFbGVtZW50LCBnZXREaWFncmFtKCkpOwotCQl9Ci0JCWRlZmF1bHQ6IHsKLQkJfQotCQkJZm9yIChJdGVyYXRvciBjaGlsZHJlbiA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaGlsZHJlbgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVZpZXcgY2hpbGRWaWV3ID0gKFZpZXcpIGNoaWxkcmVuLm5leHQoKTsKLQkJCQljb2xsZWN0QWxsTGlua3MoY2hpbGRWaWV3KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gY3JlYXRlQ29ubmVjdGlvbnMoQ29sbGVjdGlvbiBsaW5rRGVzY3JpcHRvcnMpIHsKLQkJaWYgKGxpbmtEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUxpc3QgYWRhcHRlcnMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yID0gbGlua0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWZpbmFsIExpbmtEZXNjcmlwdG9yIG5leHRMaW5rRGVzY3JpcHRvciA9IChMaW5rRGVzY3JpcHRvcikgbGlua0Rlc2NyaXB0b3JzSXRlcmF0b3IKLQkJCQkJLm5leHQoKTsKLQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gZ2V0RWRpdFBhcnRGb3IobmV4dExpbmtEZXNjcmlwdG9yCi0JCQkJCS5nZXRTb3VyY2UoKSk7Ci0JCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQlpZiAoc291cmNlRWRpdFBhcnQgPT0gbnVsbCB8fCB0YXJnZXRFZGl0UGFydCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QuQ29ubmVjdGlvblZpZXdEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvcigKLQkJCQkJbmV4dExpbmtEZXNjcmlwdG9yLmdldFNlbWFudGljQWRhcHRlcigpLCBudWxsLAotCQkJCQlWaWV3VXRpbC5BUFBFTkQsIGZhbHNlLCAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkpOwotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0IGNjciA9IG5ldyBDcmVhdGVDb25uZWN0aW9uVmlld1JlcXVlc3QoCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJY2NyLnNldFR5cGUoUmVxdWVzdENvbnN0YW50cy5SRVFfQ09OTkVDVElPTl9TVEFSVCk7Ci0JCQljY3Iuc2V0U291cmNlRWRpdFBhcnQoc291cmNlRWRpdFBhcnQpOwotCQkJc291cmNlRWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJY2NyLnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fRU5EKTsKLQkJCUNvbW1hbmQgY21kID0gdGFyZ2V0RWRpdFBhcnQuZ2V0Q29tbWFuZChjY3IpOwotCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQlleGVjdXRlQ29tbWFuZChjbWQpOwotCQkJCUlBZGFwdGFibGUgdmlld0FkYXB0ZXIgPSAoSUFkYXB0YWJsZSkgY2NyLmdldE5ld09iamVjdCgpOwotCQkJCWlmICh2aWV3QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXJzLmFkZCh2aWV3QWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBnZXRFZGl0UGFydEZvcihFT2JqZWN0IG1vZGVsRWxlbWVudCkgewotCQlWaWV3IHZpZXcgPSAoVmlldykgbXlFT2JqZWN0MlZpZXdNYXAuZ2V0KG1vZGVsRWxlbWVudCk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiAoRWRpdFBhcnQpIGdldEhvc3QoKS5nZXRWaWV3ZXIoKS5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQl2aWV3KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKkBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MgPSBjb250YWluZXIuZUNsYXNzKCk7Ci0JCXN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcywgZGlhZ3JhbSk7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rcyhjb250YWluZXIsIGNvbnRhaW5lck1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCXN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19MaW5rXzMwMDEoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzX0xpbmtfMzAwMShFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLmlzU3VwZXJUeXBlT2YoY29udGFpbmVyTWV0YWNsYXNzKSkgewotCQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGUpIGNvbnRhaW5lcikuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JCQkJCS5pdGVyYXRvcigpOyB2YWx1ZXMuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbmV4dFZhbHVlID0gKChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpKTsKLQkJCQlpbnQgbGlua1ZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKG5leHRWYWx1ZSk7Ci0JCQkJaWYgKExpbmtFZGl0UGFydC5WSVNVQUxfSUQgPT0gbGlua1ZJRCkgewotCQkJCQlPYmplY3Qgc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCUVPYmplY3QgZHN0ID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgPSAoKExpbmspIG5leHRWYWx1ZSkKLQkJCQkJCQkJLmdldFNvdXJjZSgpOwotCQkJCQkJaWYgKHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCUVPYmplY3Qgc3JjID0gKEVPYmplY3QpIHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0OwotCQkJCQkJCW15TGlua0Rlc2NyaXB0b3JzLmFkZChuZXcgTGlua0Rlc2NyaXB0b3Ioc3JjLCBkc3QsCi0JCQkJCQkJCQluZXh0VmFsdWUsIERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxLAotCQkJCQkJCQkJbGlua1ZJRCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZU1vZGVsRmFjZXRMaW5rcyhFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVDbGFzcyBjb250YWluZXJNZXRhY2xhc3MsIERpYWdyYW0gZGlhZ3JhbSkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIExpbmtEZXNjcmlwdG9yIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15U291cmNlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIEVPYmplY3QgbXlEZXN0aW5hdGlvbjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15TGlua0VsZW1lbnQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgaW50IG15VmlzdWFsSUQ7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgSUFkYXB0YWJsZSBteVNlbWFudGljQWRhcHRlcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUVPYmplY3QgbGlua0VsZW1lbnQsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbGlua0VsZW1lbnQ7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBFT2JqZWN0QWRhcHRlcihsaW5rRWxlbWVudCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLAotCQkJCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSwgaW50IGxpbmtWSUQpIHsKLQkJCXRoaXMoc291cmNlLCBkZXN0aW5hdGlvbiwgbGlua1ZJRCk7Ci0JCQlteUxpbmtFbGVtZW50ID0gbnVsbDsKLQkJCWZpbmFsIElFbGVtZW50VHlwZSBlbGVtZW50VHlwZUNvcHkgPSBlbGVtZW50VHlwZTsKLQkJCW15U2VtYW50aWNBZGFwdGVyID0gbmV3IElBZGFwdGFibGUoKSB7Ci0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBlbGVtZW50VHlwZUNvcHk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIExpbmtEZXNjcmlwdG9yKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IGRlc3RpbmF0aW9uLCBpbnQgbGlua1ZJRCkgewotCQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCQlteURlc3RpbmF0aW9uID0gZGVzdGluYXRpb247Ci0JCQlteVZpc3VhbElEID0gbGlua1ZJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gbXlTb3VyY2U7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0RGVzdGluYXRpb24oKSB7Ci0JCQlyZXR1cm4gbXlEZXN0aW5hdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRMaW5rRWxlbWVudCgpIHsKLQkJCXJldHVybiBteUxpbmtFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoKSB7Ci0JCQlyZXR1cm4gbXlWaXN1YWxJRDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgSUFkYXB0YWJsZSBnZXRTZW1hbnRpY0FkYXB0ZXIoKSB7Ci0JCQlyZXR1cm4gbXlTZW1hbnRpY0FkYXB0ZXI7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q0NTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmRzLkR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5Sb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuV29ya1Byb2R1Y3RDb21wb3NpdGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBSb2xlVGFza0NvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiA9PSByZXEKLQkJCQkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpKTsKLQkJCX0KLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBXb3JrUHJvZHVjdENvbXBvc2l0ZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJLy8JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJLy8JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoZWRpdGluZ0RvbWFpbiwgcmVxKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIER1cGxpY2F0ZUFueXRoaW5nQ29tbWFuZCBleHRlbmRzCi0JCQlEdXBsaWNhdGVFT2JqZWN0c0NvbW1hbmQgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKAotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sCi0JCQkJRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQkJc3VwZXIoZWRpdGluZ0RvbWFpbiwgcmVxLmdldExhYmVsKCksIHJlcQotCQkJCQkuZ2V0RWxlbWVudHNUb0JlRHVwbGljYXRlZCgpLCByZXEKLQkJCQkJLmdldEFsbER1cGxpY2F0ZWRFbGVtZW50c01hcCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU4ZDY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLlJlY29ubmVjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuY29tbWFuZHMuRGVsZXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlNlbWFudGljRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWRpdEhlbHBlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Db25maWd1cmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveVJlZmVyZW5jZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkR1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkdldEVkaXRDb250ZXh0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLklFZGl0Q29tbWFuZFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5Nb3ZlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmhlbHBlcnMuRGlhZ3JhbUJhc2VFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzIFNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBFeHRlbmRlZCByZXF1ZXN0IGRhdGEga2V5IHRvIGhvbGQgZWRpdHBhcnQgdmlzdWFsIGlkLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNVQUxfSURfS0VZID0gInZpc3VhbF9pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZCB2aXN1YWwgaWQgb2YgZWRpdGVkIGVkaXRwYXJ0IHRvIGV4dGVuZGVkIGRhdGEgb2YgdGhlIHJlcXVlc3QKLQkgKiBzbyBjb21tYW5kIHN3aXRjaCBjYW4gZGVjaWRlIHdoYXQga2luZCBvZiBkaWFncmFtIGVsZW1lbnQgaXMgYmVpbmcgZWRpdGVkLgotCSAqIEl0IGlzIGRvbmUgaW4gdGhvc2UgY2FzZXMgd2hlbiBpdCdzIG5vdCBwb3NzaWJsZSB0byBkZWR1Y2UgZGlhZ3JhbQotCSAqIGVsZW1lbnQga2luZCBmcm9tIGRvbWFpbiBlbGVtZW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIFJlY29ubmVjdFJlcXVlc3QpIHsKLQkJCU9iamVjdCB2aWV3ID0gKChSZWNvbm5lY3RSZXF1ZXN0KSByZXF1ZXN0KS5nZXRDb25uZWN0aW9uRWRpdFBhcnQoKQotCQkJCQkuZ2V0TW9kZWwoKTsKLQkJCWlmICh2aWV3IGluc3RhbmNlb2YgVmlldykgewotCQkJCUludGVnZXIgaWQgPSBuZXcgSW50ZWdlcihEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldFZpc3VhbElEKChWaWV3KSB2aWV3KSk7Ci0JCQkJcmVxdWVzdC5nZXRFeHRlbmRlZERhdGEoKS5wdXQoVklTVUFMX0lEX0tFWSwgaWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDb21tYW5kKHJlcXVlc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdmlzdWFsIGlkIGZyb20gcmVxdWVzdCBwYXJhbWV0ZXJzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgewotCQlPYmplY3QgaWQgPSByZXF1ZXN0LmdldFBhcmFtZXRlcihWSVNVQUxfSURfS0VZKTsKLQkJcmV0dXJuIGlkIGluc3RhbmNlb2YgSW50ZWdlciA/ICgoSW50ZWdlcikgaWQpLmludFZhbHVlKCkgOiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxdWVzdCkgewotCQlJRWRpdENvbW1hbmRSZXF1ZXN0IGNvbXBsZXRlZFJlcXVlc3QgPSBjb21wbGV0ZVJlcXVlc3QocmVxdWVzdCk7Ci0JCU9iamVjdCBlZGl0SGVscGVyQ29udGV4dCA9IGNvbXBsZXRlZFJlcXVlc3QuZ2V0RWRpdEhlbHBlckNvbnRleHQoKTsKLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgVmlldwotCQkJCXx8IChlZGl0SGVscGVyQ29udGV4dCBpbnN0YW5jZW9mIElFZGl0SGVscGVyQ29udGV4dCAmJiAoKElFZGl0SGVscGVyQ29udGV4dCkgZWRpdEhlbHBlckNvbnRleHQpCi0JCQkJCQkuZ2V0RU9iamVjdCgpIGluc3RhbmNlb2YgVmlldykpIHsKLQkJCS8vIG5vIHNlbWFudGljIGNvbW1hbmRzIGFyZSBwcm92aWRlZCBmb3IgcHVyZSBkZXNpZ24gZWxlbWVudHMKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChlZGl0SGVscGVyQ29udGV4dCA9PSBudWxsKSB7Ci0JCQllZGl0SGVscGVyQ29udGV4dCA9IFZpZXdVdGlsCi0JCQkJCS5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JCX0KLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEVsZW1lbnRUeXBlKGVkaXRIZWxwZXJDb250ZXh0KTsKLQkJaWYgKGVsZW1lbnRUeXBlID09IEVsZW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRUeXBlKAotCQkJCSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJZWxlbWVudFR5cGUgPSBudWxsOwotCQl9Ci0JCUNvbW1hbmQgZXBDb21tYW5kID0gZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKGNvbXBsZXRlZFJlcXVlc3QpOwotCQlpZiAoZXBDb21tYW5kICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBlcENvbW1hbmQgaW5zdGFuY2VvZiBJQ29tbWFuZFByb3h5ID8gKChJQ29tbWFuZFByb3h5KSBlcENvbW1hbmQpCi0JCQkJCS5nZXRJQ29tbWFuZCgpCi0JCQkJCTogbmV3IENvbW1hbmRQcm94eShlcENvbW1hbmQpOwotCQkJY29tcGxldGVkUmVxdWVzdC5zZXRQYXJhbWV0ZXIoCi0JCQkJCURpYWdyYW1CYXNlRWRpdEhlbHBlci5FRElUX1BPTElDWV9DT01NQU5ELCBjb21tYW5kKTsKLQkJfQotCQlDb21tYW5kIGVoQ29tbWFuZCA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29tbWFuZCBjb21tYW5kID0gZWxlbWVudFR5cGUuZ2V0RWRpdENvbW1hbmQoY29tcGxldGVkUmVxdWVzdCk7Ci0JCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKSkgewotCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCQljb21tYW5kID0gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJCQkJbnVsbCkuY29tcG9zZShjb21tYW5kKTsKLQkJCQl9Ci0JCQkJZWhDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzaG91bGRQcm9jZWVkID0gdHJ1ZTsKLQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJc2hvdWxkUHJvY2VlZCA9IHNob3VsZFByb2NlZWQoKERlc3Ryb3lSZXF1ZXN0KSBjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJfQotCQlpZiAoc2hvdWxkUHJvY2VlZCkgewotCQkJaWYgKGNvbXBsZXRlZFJlcXVlc3QgaW5zdGFuY2VvZiBEZXN0cm95UmVxdWVzdCkgewotCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJCQlDb21tYW5kIGRlbGV0ZVZpZXdDb21tYW5kID0gbmV3IElDb21tYW5kUHJveHkoCi0JCQkJCQluZXcgRGVsZXRlQ29tbWFuZChlZGl0aW5nRG9tYWluLCAoVmlldykgZ2V0SG9zdCgpCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSk7Ci0JCQkJZWhDb21tYW5kID0gZWhDb21tYW5kID09IG51bGwgPyBkZWxldGVWaWV3Q29tbWFuZCA6IGVoQ29tbWFuZAotCQkJCQkJLmNoYWluKGRlbGV0ZVZpZXdDb21tYW5kKTsKLQkJCX0KLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNlbWFudGljQ29tbWFuZFN3aXRjaChJRWRpdENvbW1hbmRSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgQ3JlYXRlRWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDcmVhdGVDb21tYW5kKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDb25maWd1cmVSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q29uZmlndXJlQ29tbWFuZCgoQ29uZmlndXJlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95RWxlbWVudFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHsKLQkJCXJldHVybiBnZXREdXBsaWNhdGVDb21tYW5kKChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgR2V0RWRpdENvbnRleHRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdENvbnRleHRDb21tYW5kKChHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgTW92ZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRNb3ZlQ29tbWFuZCgoTW92ZVJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHJlcSk7Ci0JCX0gZWxzZSBpZiAocmVxIGluc3RhbmNlb2YgU2V0UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldFNldENvbW1hbmQoKFNldFJlcXVlc3QpIHJlcSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbmZpZ3VyZUNvbW1hbmQoQ29uZmlndXJlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZXRDb21tYW5kKFNldFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRFZGl0Q29udGV4dENvbW1hbmQoR2V0RWRpdENvbnRleHRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lSZWZlcmVuY2VDb21tYW5kKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RHVwbGljYXRlQ29tbWFuZChEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRNb3ZlQ29tbWFuZChNb3ZlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1TTFdyYXBwZXIoSUNvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjbWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoKSB7Ci0JCXJldHVybiBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgY29udGFpbmVyIGVsZW1lbnQgZm9yIHRoZSBuZXcgcmVsYXRpb25zaGlwIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGdvZXMgdXAgYnkgY29udGFpbm1lbnQgaGllcmFyY2h5IHN0YXJ0aW5nIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyBpbnN0YW5jZSBvZgotCSAqIHRoZSBzcGVjaWZpZWQgY29udGFpbmVyIGNsYXNzLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoT2JqZWN0IHVlbGVtZW50LAotCQkJRUNsYXNzIGNvbnRhaW5lckNsYXNzLCBJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlpZiAodWVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgdWVsZW1lbnQ7Ci0JCQlmb3IgKDsgZWxlbWVudCAhPSBudWxsOyBlbGVtZW50ID0gZWxlbWVudC5lQ29udGFpbmVyKCkpIHsKLQkJCQlpZiAoY29udGFpbmVyQ2xhc3MuaXNTdXBlclR5cGVPZihlbGVtZW50LmVDbGFzcygpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBlZGl0aW5nIGRvbWFpbiBmcm9tIHRoZSBob3N0IGVkaXQgcGFydC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kIHRvIGRlc3Ryb3kgdGhlIGxpbmsuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChWaWV3IHZpZXcsIGJvb2xlYW4gY29uZmlybSkgewotCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZ2V0SG9zdCgpLmdldFZpZXdlcigpCi0JCQkJLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQodmlldyk7Ci0JCURlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXF1ZXN0ID0gbmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdCgKLQkJCQlnZXRFZGl0aW5nRG9tYWluKCksIGNvbmZpcm0pOwotCQlyZXR1cm4gZWRpdFBhcnQuZ2V0Q29tbWFuZChuZXcgRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LAotCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tbWFuZHMgdG8gZGVzdHJveSBhbGwgaG9zdCBpbmNvbWluZyBhbmQgb3V0Z29pbmcgbGlua3MuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZENvbW1hbmQgZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChib29sZWFuIGNvbmZpcm0pIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRTb3VyY2VFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChFZGdlKSBpdC5uZXh0KCksIGNvbmZpcm0pKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRUYXJnZXRFZGdlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKChFZGdlKSBpdC5uZXh0KCksIGNvbmZpcm0pKTsKLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpbmtDb25zdHJhaW50cyB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5DcmVhdGVMaW5rXzMwMDEoTm9kZSBjb250YWluZXIsIE5vZGUgc291cmNlLAotCQkJCU5vZGUgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gY2FuRXhpc3RMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkV4aXN0TGlua18zMDAxKE5vZGUgY29udGFpbmVyLCBOb2RlIHNvdXJjZSwKLQkJCQlOb2RlIHRhcmdldCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzgxMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RWRpdFBvbGljeSBnZXRSZWFsTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFsTGF5b3V0RWRpdFBvbGljeShMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5KSB7Ci0JCXRoaXMucmVhbExheW91dEVkaXRQb2xpY3kgPSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0RXh0ZXJuYWxMYWJlbHMoR3JvdXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyZXF1ZXN0LmdldEVkaXRQYXJ0cygpICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJCWlmIChpc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpKSB7Ci0JCQkJCWVkaXRQYXJ0cy5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUkVRX01PVkVfQ0hJTERSRU4uZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjYlJlcXVlc3QgPSAoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdDsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoY2JSZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gY2JSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCQkJCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCQkJJiYgZWRpdFBhcnRzLnNpemUoKSA+IGV4dExhYmVscy5zaXplKCkpIHsKLQkJCQkJTGlzdCBvdGhlciA9IG5ldyBBcnJheUxpc3QoZWRpdFBhcnRzKTsKLQkJCQkJb3RoZXIucmVtb3ZlQWxsKGV4dExhYmVscyk7Ci0JCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMob3RoZXIpOwotCQkJCQljbWQgPSByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0KLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGV4dExhYmVscyk7Ci0JCQkJQ29tbWFuZCBleHRMYWJlbHNDbWQgPSBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZWRpdFBhcnRzKTsKLQkJCQlyZXR1cm4gY21kID09IG51bGwgPyBleHRMYWJlbHNDbWQgOiBjbWQuY2hhaW4oZXh0TGFiZWxzQ21kKTsKLQkJCX0KLQkJfQotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdCkgewotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscygoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeSA9PSBudWxsID8gbnVsbCA6IHJlYWxMYXlvdXRFZGl0UG9saWN5Ci0JCQkJLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29uc3RyYWludEZvcihDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsCi0JCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZCkgewotCQlpbnQgZHggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShkeCwgZHksIDAsIDApOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlyLnRyYW5zbGF0ZShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCSYmIHJlYWxMYXlvdXRFZGl0UG9saWN5LnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9zdChFZGl0UGFydCBob3N0KSB7Ci0JCXN1cGVyLnNldEhvc3QoaG9zdCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zZXRIb3N0KGhvc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U3YmY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5lZGl0aGVscGVycy5DcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5HcmFwaGljYWxOb2RlRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzIEdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUVsZW1lbnRUeXBlIGdldEVsZW1lbnRUeXBlKENyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBDcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0KSB7Ci0JCQlDcmVhdGVFbGVtZW50UmVxdWVzdEFkYXB0ZXIgcmVxdWVzdEFkYXB0ZXIgPSAoKENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHJlcXVlc3QpCi0JCQkJCS5nZXRDb25uZWN0aW9uVmlld0FuZEVsZW1lbnREZXNjcmlwdG9yKCkKLQkJCQkJLmdldENyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlcigpOwotCQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHJlcXVlc3RBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29ubmVjdGlvbldpdGhSZW9yaWVudGVkVmlld0NvbXBsZXRlQ29tbWFuZCgKLQkJCUNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSUNvbW1hbmRQcm94eSBjID0gKElDb21tYW5kUHJveHkpIHN1cGVyCi0JCQkJLmdldENvbm5lY3Rpb25Db21wbGV0ZUNvbW1hbmQocmVxdWVzdCk7Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY2MgPSAoQ29tcG9zaXRlQ29tbWFuZCkgYy5nZXRJQ29tbWFuZCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgcmN2Q29tbWFuZCA9IG5ldyBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgbnVsbCk7Ci0JCXJjdkNvbW1hbmQuc2V0RWRnZUFkYXB0b3IoZ2V0Vmlld0FkYXB0ZXIoKSk7Ci0JCWNjLmNvbXBvc2UocmN2Q29tbWFuZCk7Ci0JCXJldHVybiBjOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk2ZmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVJlZmVyZW5jZUNvbm5lY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Hcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIENvbm5lY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCA9IERpYWdyYW1VSU1lc3NhZ2VzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlX0RvTm90UHJvbXB0QWdhaW5Ub2dnbGVfbGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlib29sZWFuIGlzRGVsZXRlRnJvbUtleUJvYXJkID0gZGVsZXRlUmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotCQlpZiAoc2hvdWxkRGVsZXRlU2VtYW50aWMoKSkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gcHJvY2VlZFRvRGVsZXRlVmlldyA9IHRydWU7Ci0JCQlpZiAoaXNEZWxldGVGcm9tS2V5Qm9hcmQpIHsKLQkJCQlHcm91cFJlcXVlc3RWaWFLZXlib2FyZCBncm91cFJlcXVlc3RWaWFLZXlib2FyZCA9IChHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgZGVsZXRlUmVxdWVzdDsKLQkJCQlpZiAoZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuaXNTaG93SW5mb3JtYXRpb25EaWFsb2coKSkgewotCQkJCQlwcm9jZWVkVG9EZWxldGVWaWV3ID0gc2hvd1Byb21wdCgpOwotCQkJCQlncm91cFJlcXVlc3RWaWFLZXlib2FyZC5zZXRTaG93SW5mb3JtYXRpb25EaWFsb2coZmFsc2UpOwotCQkJCQlpZiAoIShwcm9jZWVkVG9EZWxldGVWaWV3KSkKLQkJCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVTZW1hbnRpYygpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShnZXRIb3N0KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCk7Ci0JCUFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0IGNlcCA9IChBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlib29sZWFuIGlzQ2Fub25pY2FsID0gZmFsc2U7Ci0JCWlmIChjZXAuZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCWlzQ2Fub25pY2FsID0gSXNDYW5vbmljYWwoY2VwLmdldFNvdXJjZSgpKTsKLQkJaWYgKGNlcC5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGlzQ2Fub25pY2FsID8gaXNDYW5vbmljYWwgOiBJc0Nhbm9uaWNhbChjZXAuZ2V0VGFyZ2V0KCkpOwotCQlyZXR1cm4gaXNDYW5vbmljYWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBJc0Nhbm9uaWNhbChFZGl0UGFydCBlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBlcC5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIHBhcmVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0ID8gKChHcmFwaGljYWxFZGl0UGFydCkgcGFyZW50KQotCQkJCS5pc0Nhbm9uaWNhbCgpCi0JCQkJOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KG5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyIHNlbVJlcSA9IG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKAotCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgZmFsc2UpLCBkZWxldGVSZXF1ZXN0Ci0JCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkpOwotCQlDb21tYW5kIHNlbWFudGljQ21kID0gZ2V0SG9zdCgpLmdldENvbW1hbmQoc2VtUmVxKTsKLQkJaWYgKHNlbWFudGljQ21kICE9IG51bGwgJiYgc2VtYW50aWNDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY2MgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQljYy5hZGQoc2VtYW50aWNDbWQpOwotCQkJcmV0dXJuIGNjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1Byb21wdCgpIHsKLQkJYm9vbGVhbiBwcm9tcHQgPSAoKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSkKLQkJCQkuZ2V0Qm9vbGVhbihJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKHByb21wdCkKLQkJCWlmIChzaG93TWVzc2FnZURpYWxvZygpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93TWVzc2FnZURpYWxvZygpIHsKLQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkub3Blblllc05vUXVlc3Rpb24oRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSwKLQkJCQkJCURFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwsIGZhbHNlLAotCQkJCQkJKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkKLQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLAotCQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuWUVTX0lEKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgewotCQkJcmV0dXJuIGdldERlbGV0ZUNvbW1hbmQoKEdyb3VwUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDJmYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk1vdmVIYW5kbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuRHJhZ0VkaXRQYXJ0c1RyYWNrZXJFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRleHROb25SZXNpemFibGVFZGl0UG9saWN5IGV4dGVuZHMgTm9uUmVzaXphYmxlRWRpdFBvbGljeUV4IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCU1vdmVIYW5kbGUgbW92ZUhhbmRsZSA9IG5ldyBNb3ZlSGFuZGxlKChHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKTsKLQkJbW92ZUhhbmRsZS5zZXRCb3JkZXIobnVsbCk7Ci0JCW1vdmVIYW5kbGUuc2V0RHJhZ1RyYWNrZXIobmV3IERyYWdFZGl0UGFydHNUcmFja2VyRXgoZ2V0SG9zdCgpKSk7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1vdmVIYW5kbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTYzMDA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5TZWxlY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kgZXh0ZW5kcyBTZWxlY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIGZvY3VzRmVlZGJhY2tGaWd1cmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzaG93U2VsZWN0aW9uKCk7Ci0JCQlzaG93Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVTZWxlY3Rpb24oKTsKLQkJCWFkZEZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJCWhpZGVGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXModHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlRm9jdXMoKTsKLQkJCWFkZEZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlRm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlKTsKLQkJCQlmb2N1c0ZlZWRiYWNrRmlndXJlID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVjdGFuZ2xlIGdldEZlZWRiYWNrQm91bmRzKCkgewotCQlSZWN0YW5nbGUgYm91bmRzOwotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCWJvdW5kcyA9ICgoTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuZ2V0VGV4dEJvdW5kcygpOwotCQkJYm91bmRzLmludGVyc2VjdChnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkpOwotCQl9IGVsc2UgewotCQkJYm91bmRzID0gZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldENvcHkoKTsKLQkJfQotCQlnZXRIb3N0RmlndXJlKCkuZ2V0UGFyZW50KCkudHJhbnNsYXRlVG9BYnNvbHV0ZShib3VuZHMpOwotCQlnZXRGZWVkYmFja0xheWVyKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShib3VuZHMpOwotCQlyZXR1cm4gYm91bmRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlMYWJlbCBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBMYWJlbCgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0T3BhcXVlKHRydWUpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEJhY2tncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51QmFja2dyb3VuZFNlbGVjdGVkKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUZvcmVncm91bmRTZWxlY3RlZCk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlSZWN0YW5nbGVGaWd1cmUgZmVlZGJhY2tGaWd1cmUgPSBuZXcgUmVjdGFuZ2xlRmlndXJlKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRGaWxsKGZhbHNlKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGb2N1c0ZlZWRiYWNrRmlndXJlKCkgewotCQlyZXR1cm4gbmV3IEZpZ3VyZSgpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRGaWd1cmUoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJCQlncmFwaGljcy5kcmF3Rm9jdXMoZ2V0Qm91bmRzKCkuZ2V0UmVzaXplZCgtMSwgLTEpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGFiZWwoTGFiZWwgdGFyZ2V0KSB7Ci0JCUxhYmVsIHNvdXJjZSA9IChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpOwotCQl0YXJnZXQuc2V0VGV4dChzb3VyY2UuZ2V0VGV4dCgpKTsKLQkJdGFyZ2V0LnNldFRleHRBbGlnbm1lbnQoc291cmNlLmdldFRleHRBbGlnbm1lbnQoKSk7Ci0JCXRhcmdldC5zZXRGb250KHNvdXJjZS5nZXRGb250KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKSB7Ci0JCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJCXVwZGF0ZUxhYmVsKChMYWJlbCkgc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUpOwotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkuZXhwYW5kKDUsCi0JCQkJCQk1KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvY3VzRmVlZGJhY2soKSB7Ci0JCWlmIChmb2N1c0ZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hGZWVkYmFjaygpIHsKLQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2NiNmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTdlNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKSAmJiB2aWV3LmdldEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmFjdG9yeUhpbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjMjhlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGRiOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNGYzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUNhbm9uaWNhbEVkaXRQb2xpY3kgZXh0ZW5kcyBDYW5vbmljYWxFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGVDb250YWluZXIpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpCi0JCQkJLml0ZXJhdG9yKCk7IHZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCW5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJbmV4dFZhbHVlKTsKLQkJCXN3aXRjaCAobm9kZVZJRCkgewotCQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6IHsKLQkJCQlyZXN1bHQuYWRkKG5leHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVWaWV3KFZpZXcgdmlldykgewotCQlyZXR1cm4gdmlldy5pc1NldEVsZW1lbnQoKQotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiAodmlldy5nZXRFbGVtZW50KCkuZUlzUHJveHkoKSB8fCB2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA3MjU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhNGVmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5EZXN0cm95RWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLkxpbmtSZW9yaWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuUm9sZU5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LmNvbW1hbmRzLlRhc2tOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Sb2xlTm9kZV8yMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFJvbGVOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5UYXNrTm9kZV8yMDAyID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROb2RlQ29udGFpbmVyX05vZGVzKCkpOwotCQkJfQotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IFRhc2tOb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlhZGREZXN0cm95Q2hpbGROb2Rlc0NvbW1hbmQoY2MsIHJlcS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKENvbXBvdW5kQ29tbWFuZCBjbWQsCi0JCQlib29sZWFuIGNvbmZpcm0pIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBpdAotCQkJCQkubmV4dCgpOwotCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChub2RlKSkgewotCQkJY2FzZSBSb2xlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChub2RlLCBjb25maXJtKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFRhc2tOb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWNtZC5hZGQoZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKG5vZGUsIGNvbmZpcm0pKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCWZvciAoSXRlcmF0b3IgY2l0ID0gbm9kZS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGNpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBjbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBjaXQKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlzd2l0Y2ggKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKGNub2RlKSkgewotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZChyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQocmVxKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rQ3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwgc291cmNlLAotCQkJCXRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjgzMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTY0ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOTY2NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQyNmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza05vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1HcmFwaGljYWxOb2RlRWRpdFBvbGljeSB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9UYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdjYTJjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1Rhc2tOb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChEZXN0cm95RWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjYyA9IGdldERlc3Ryb3lFZGdlc0NvbW1hbmQocmVxCi0JCQkJLmlzQ29uZmlybWF0aW9uUmVxdWlyZWQoKSk7Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuTGlua18zMDAxID09IHJlcS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQlyZXR1cm4gcmVxLmdldFRhcmdldCgpID09IG51bGwgPyBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZChyZXEpCi0JCQkJCTogZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQocmVxKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVTdGFydE91dGdvaW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgbnVsbCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tcGxldGVJbmNvbWluZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCUVPYmplY3QgdGFyZ2V0RU9iamVjdCA9IHJlcS5nZXRUYXJnZXQoKTsKLQkJaWYgKGZhbHNlID09IHNvdXJjZUVPYmplY3QgaW5zdGFuY2VvZiBOb2RlCi0JCQkJfHwgZmFsc2UgPT0gdGFyZ2V0RU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgdGFyZ2V0ID0gKE5vZGUpIHRhcmdldEVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCB0YXJnZXQpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAocmVxLmdldENvbnRhaW5tZW50RmVhdHVyZSgpID09IG51bGwpIHsKLQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQl9Ci0JCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rQ3JlYXRlQ29tbWFuZChyZXEsIGNvbnRhaW5lciwgc291cmNlLAotCQkJCXRhcmdldCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29tbWFuZCB0byByZW9yaWVudCBFQ2xhc3MgYmFzZWQgbGluay4gTmV3IGxpbmsgdGFyZ2V0IG9yIHNvdXJjZQotCSAqIHNob3VsZCBiZSB0aGUgZG9tYWluIG1vZGVsIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlzd2l0Y2ggKGdldFZpc3VhbElEKHJlcSkpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtSZW9yaWVudENvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZChyZXEpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ1OTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSAoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCVZpZXcgdmlld09iamVjdCA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJRU9iamVjdCBuZXh0VmFsdWU7Ci0JCWludCBub2RlVklEOwotCQlmb3IgKEl0ZXJhdG9yIHZhbHVlcyA9ICgoTm9kZUNvbnRhaW5lcikgbW9kZWxPYmplY3QpLmdldE5vZGVzKCkKLQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCW5leHRWYWx1ZSA9IChFT2JqZWN0KSB2YWx1ZXMubmV4dCgpOwotCQkJbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRCh2aWV3T2JqZWN0LAotCQkJCQluZXh0VmFsdWUpOwotCQkJaWYgKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZJRCkgewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjZhMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODMwNTQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5SZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua0NyZWF0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21tYW5kKENyZWF0ZUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMgPT0gcmVxCi0JCQkJLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNyZWF0ZUNvbW1hbmQocmVxKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJQ29tcG91bmRDb21tYW5kIGNjID0gZ2V0RGVzdHJveUVkZ2VzQ29tbWFuZChyZXEKLQkJCQkuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJYWRkRGVzdHJveUNoaWxkTm9kZXNDb21tYW5kKGNjLCByZXEuaXNDb25maXJtYXRpb25SZXF1aXJlZCgpKTsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpOwotCQlpZiAodmlldy5nZXRFQW5ub3RhdGlvbigiU2hvcnRjdXQiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcS5zZXRFbGVtZW50VG9EZXN0cm95KHZpZXcpOwotCQl9Ci0JCWNjLmFkZChnZXRNU0xXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudENvbW1hbmQocmVxKSkpOwotCQlyZXR1cm4gY2MudW53cmFwKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlc3Ryb3lDaGlsZE5vZGVzQ29tbWFuZChDb21wb3VuZENvbW1hbmQgY21kLAotCQkJYm9vbGVhbiBjb25maXJtKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgaXQKLQkJCQkJLm5leHQoKTsKLQkJCXN3aXRjaCAoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQobm9kZSkpIHsKLQkJCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQljbWQuYWRkKGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZChub2RlLCBjb25maXJtKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlmb3IgKEl0ZXJhdG9yIGNpdCA9IG5vZGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBjaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgY25vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgY2l0Ci0JCQkJCQkJLm5leHQoKTsKLQkJCQkJc3dpdGNoIChEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRChjbm9kZSkpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudENhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzE4OGI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Q2Fub25pY2FsRWRpdFBvbGljeQotCQlleHRlbmRzIENhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQ4YTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50SXRlbVNlbWFudGljRWRpdFBvbGljeQotCQlleHRlbmRzIERpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2ZmNlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlQ2Fub25pY2FsRWRpdFBvbGljeSBleHRlbmRzCi0JCUNhbm9uaWNhbEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFNlbWFudGljQ2hpbGRyZW5MaXN0KCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpICYmIHZpZXcuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiB2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRGYWN0b3J5SGludCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0M2U0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhNzVlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5jb21tYW5kcy5MaW5rUmVvcmllbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5VbmV4ZWN1dGFibGVDb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5jb21tYW5kcy5DcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQljYy5hZGQoZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpKTsKLQkJcmV0dXJuIGNjLnVud3JhcCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKENyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSA9PSByZXEuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJcmV0dXJuIHJlcS5nZXRUYXJnZXQoKSA9PSBudWxsID8gZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQocmVxKQotCQkJCQk6IGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlU3RhcnRPdXRnb2luZ0xpbmtfMzAwMUNvbW1hbmQoCi0JCQlDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlFT2JqZWN0IHNvdXJjZUVPYmplY3QgPSByZXEuZ2V0U291cmNlKCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIG51bGwpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbXBsZXRlSW5jb21pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlFT2JqZWN0IHRhcmdldEVPYmplY3QgPSByZXEuZ2V0VGFyZ2V0KCk7Ci0JCWlmIChmYWxzZSA9PSBzb3VyY2VFT2JqZWN0IGluc3RhbmNlb2YgTm9kZQotCQkJCXx8IGZhbHNlID09IHRhcmdldEVPYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlOb2RlIHNvdXJjZSA9IChOb2RlKSBzb3VyY2VFT2JqZWN0OwotCQlOb2RlIHRhcmdldCA9IChOb2RlKSB0YXJnZXRFT2JqZWN0OwotCQlOb2RlIGNvbnRhaW5lciA9IChOb2RlKSBnZXRSZWxhdGlvbnNoaXBDb250YWluZXIoc291cmNlLAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpLCByZXEuZ2V0RWxlbWVudFR5cGUoKSk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKCFEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkNyZWF0ZUxpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJaWYgKHJlcS5nZXRDb250YWlubWVudEZlYXR1cmUoKSA9PSBudWxsKSB7Ci0JCQlyZXEuc2V0Q29udGFpbm1lbnRGZWF0dXJlKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE5vZGVfT3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua0NyZWF0ZUNvbW1hbmQocmVxLCBjb250YWluZXIsIHNvdXJjZSwKLQkJCQl0YXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbW1hbmQgdG8gcmVvcmllbnQgRUNsYXNzIGJhc2VkIGxpbmsuIE5ldyBsaW5rIHRhcmdldCBvciBzb3VyY2UKLQkgKiBzaG91bGQgYmUgdGhlIGRvbWFpbiBtb2RlbCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFJlb3JpZW50UmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCVJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJc3dpdGNoIChnZXRWaXN1YWxJRChyZXEpKSB7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRNU0xXcmFwcGVyKG5ldyBMaW5rUmVvcmllbnRDb21tYW5kKHJlcSkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQocmVxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FERGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BRERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5MWUxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FERGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5BRERJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnNlcnZpY2UuRGlhZ3JhbVJlc2V0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EaWFncmFtQWN0aW9uc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuTm90ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQUREaWFncmFtRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCURpYWdyYW1BY3Rpb25zU2VydmljZSBhY3Rpb25TZXJ2aWNlID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlzdXBlci5jb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKQotCQkJCS5nZXRSb290RWRpdFBhcnQoKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCURpYWdyYW1FZGl0UGFydEZhY3RvcnkuRVhURVJOQUxfTk9ERV9MQUJFTFNfTEFZRVIsCi0vLwkJCQlMYXllckNvbnN0YW50cy5QUklNQVJZX0xBWUVSKTsKLQkJTGF5ZXJlZFBhbmUgc2NhbGFibGVMYXllcnMgPSAoTGF5ZXJlZFBhbmUpIHJvb3QKLQkJCQkuZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuU0NBTEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBzY2FsZWRGZWVkYmFja0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJc2NhbGVkRmVlZGJhY2tMYXllci5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2NhbGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihzY2FsZWRGZWVkYmFja0xheWVyLAotCQkJCUxheWVyQ29uc3RhbnRzLlNDQUxFRF9GRUVEQkFDS19MQVlFUiwKLQkJCQlEaWFncmFtUm9vdEVkaXRQYXJ0LkRFQ09SQVRJT05fVU5QUklOVEFCTEVfTEFZRVIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnNldEdyYXBoaWNhbFZpZXdlcih2aWV3ZXIpOwotCQlpZihhY3Rpb25TZXJ2aWNlICE9IG51bGwpewotCQkJYWN0aW9uU2VydmljZS5zZXRHcmFwaGljYWxWaWV3ZXIodmlld2VyKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAYXV0aG9yIHNrYW5ub29yCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCURpYWdyYW1SZXNldFNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtUmVzZXRTZXJ2aWNlKGdldERpYWdyYW1NYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLCBnZXRFZGl0RG9tYWluKCksIGdldEFjdGlvblJlZ2lzdHJ5KCkpOwotCQlzZXJ2aWNlLmNsZWFuVXBEaWFncmFtKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjb250cmlidXRlVG9Db250ZXh0TWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KG1lbnUpOwotCi0JCQotCQlib29sZWFuIGNhbk1vZGlmeSA9IGlzRWRpdGFibGUoKTsKLQotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKERpYWdyYW1Db25zdGFudHMuUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQlpZiAoYWN0aW9uLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJbWVudS5pbnNlcnRCZWZvcmUoQWN0aW9uSWRzLkFDVElPTl9TSE9XX1BST1BFUlRJRVNfVklFVywgYWN0aW9uKTsKLQkJfQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbWVudS5maW5kKEFjdGlvbklkcy5BQ1RJT05fVE9PTEJBUl9BUlJBTkdFX0FMTCk7Ci0JCWlmKGl0ZW0gIT0gbnVsbCl7Ci0JCQlpdGVtLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0xID0gbWVudS5maW5kKEFjdGlvbklkcy5NRU5VX0ZPUk1BVCk7Ci0JCWlmKGl0ZW0xICE9IG51bGwpewotCQkJaWYoaXRlbTEgaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpewotCQkJCSgoSU1lbnVNYW5hZ2VyKWl0ZW0xKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5lZGl0b3JzLkFic3RyYWN0RGlhZ3JhbUVkaXRvciNjcmVhdGVBY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCUFjdGlvbiByZXNldExheW91dEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yX1Jlc2V0RGlhZ3JhbUxheW91dF90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRGlhZ3JhbUNvbnN0YW50cy5SRUZSRVNIKS5ydW4oKTsKLQkJCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoKGdldERpYWdyYW1FZGl0UGFydCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZiAoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udGVudHMoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJCQkJTGlzdDxFZGl0UGFydD4gbG9jYWwgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCQkJCQlpZihkZXAuZ2V0Q2hpbGRyZW4oKSAhPSBudWxsICYmICFkZXAuZ2V0Q2hpbGRyZW4oKS5pc0VtcHR5KCkpewotCQkJCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYoIShuZXh0IGluc3RhbmNlb2YgTm90ZUVkaXRQYXJ0KSl7Ci0JCQkJCQkJCWxvY2FsLmFkZCgoRWRpdFBhcnQpbmV4dCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWRlcC5nZXRSZWNlbnRseUFkZGVkUGFydHMoKS5hZGRBbGwobG9jYWwpOwotCQkJCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJCXJldHVybiBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpLnNpemUoKSA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFU0VUX0RJQUdSQU1fTEFZT1VUOwotCQkJfQotCi0JCX07Ci0JCXJlc2V0TGF5b3V0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEFEREltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCXJlc2V0TGF5b3V0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihBRERJbWFnZXMuSU1HX0RFU0NfUkVTRVRfRElBR1JBTV9MQVlPVVQpOwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHJlc2V0TGF5b3V0QWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXRMYXlvdXQoKSB7Ci0JCWlmKCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKS5nZXRFbGVtZW50KCkpLmlzQXV0b0xheW91dCgpKXsKLQkJCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oRGlhZ3JhbUNvbnN0YW50cy5SRVNFVF9ESUFHUkFNX0xBWU9VVCk7Ci0JCQlhY3Rpb24ucnVuKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsYXlvdXRSZWNlbnRseUFkZGVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxheW91dFJlY2VudGx5QWRkZWQoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRlbnRzKCkucmVmcmVzaCgpOwotCQlnZXREaWFncmFtRWRpdFBhcnQoKS5nZXRWaWV3cG9ydCgpLnZhbGlkYXRlKCk7Ci0JCWNsZWFuVXBEaWFncmFtKCk7Ci0JCUVPYmplY3QgZGlhZ3JhbUVsZW1lbnQgPSBnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpOwotCQlpZihkaWFncmFtRWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pewotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpKChEaWFncmFtKWRpYWdyYW1FbGVtZW50KS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQlpZihUbmdVdGlsLmlzTG9ja2VkKGFjdGl2aXR5KSl7Ci0JCQkJLy8gRmx1c2ggYWxsIGNvbW1hbmRzLCBtZWFucyB3aWxsIG5vdCBzYXZlLgotCQkJCWdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCQkJLy8gRmlyZSBkaXJ0eSBmbGFnIHByb3BlcnR5IGNoYW5nZSwgbm8gZGlydHkgZmxhZyBvbiBlZGl0b3IuCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydE5hbWVQcmVmaXgoKSB7Ci0JCXJldHVybiBEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4OyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0UGFydEltYWdlKCkgewotCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImZ1bGwvZXRvb2wxNi9BRERFZGl0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCQotCS8qKgotCSAqIENsaWVudHMgY2FsbCB0aGlzIG1lZXRob2QgaWYgbmVlZGVkIHRvIHJlZnJlc2ggYW5kIGRvIHJlc2V0IGxheW91dCBmb3IgCi0JICogYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gd2hvc2UgYXR0cmlidXRlIGlzIGF1dG9sYXlvdXQgPSB0cnVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1blJlc2V0TGF5b3V0QWN0aW9uKCl7Ci0JCWxheW91dFJlY2VudGx5QWRkZWQoKTsKLQkJaWYoKChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSkuaXNBdXRvTGF5b3V0KCkpewotCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihEaWFncmFtQ29uc3RhbnRzLlJFU0VUX0RJQUdSQU1fTEFZT1VUKTsKLQkJCWFjdGlvbi5ydW4oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTI4N2MyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMubWFya2VyLk1hcmtlck5hdmlnYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yIGV4dGVuZHMgRGlhZ3JhbURvY3VtZW50RWRpdG9yCi0JCWltcGxlbWVudHMgSUdvdG9NYXJrZXIsIElNZXRob2RFZGl0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3IoKSB7Ci0JCXN1cGVyKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFsZXR0ZVJvb3QgY3JlYXRlUGFsZXR0ZVJvb3QoUGFsZXR0ZVJvb3QgZXhpc3RpbmdQYWxldHRlUm9vdCkgewotCQlQYWxldHRlUm9vdCByb290ID0gc3VwZXIuY3JlYXRlUGFsZXR0ZVJvb3QoZXhpc3RpbmdQYWxldHRlUm9vdCk7Ci0JCW5ldyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkoKS5maWxsUGFsZXR0ZShyb290KTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50UHJvdmlkZXIoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQKLQkJCQl8fCBpbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCkpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0RG9jdW1lbnRQcm92aWRlcihpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlNYXJrZXJOYXZpZ2F0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpLmdvdG9NYXJrZXIodGhpcywgbWFya2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JCXBlcmZvcm1TYXZlQXMobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1TYXZlQXMoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJU2F2ZUFzRGlhbG9nIGRpYWxvZyA9IG5ldyBTYXZlQXNEaWFsb2coc2hlbGwpOwotCQlJRmlsZSBvcmlnaW5hbCA9IGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCA/ICgoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQpCi0JCQkJLmdldEZpbGUoKQotCQkJCTogbnVsbDsKLQkJaWYgKG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRPcmlnaW5hbEZpbGUob3JpZ2luYWwpOwotCQl9Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQkvLyBlZGl0b3IgaGFzIGJlZW4gcHJvZ3JhbW1hdGljYWxseSBjbG9zZWQgd2hpbGUgdGhlIGRpYWxvZyB3YXMgb3BlbgotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwcm92aWRlci5pc0RlbGV0ZWQoaW5wdXQpICYmIG9yaWdpbmFsICE9IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCSJUaGUgb3JpZ2luYWwgZmlsZSAnJ3swfScnIGhhcyBiZWVuIGRlbGV0ZWQuIiwgb3JpZ2luYWwKLQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCWRpYWxvZy5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlkaWFsb2cuc2V0TWVzc2FnZShtZXNzYWdlLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKLQkJaWYgKGZpbGVQYXRoID09IG51bGwpIHsKLQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJCXByb2dyZXNzTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCWZpbmFsIElFZGl0b3JJbnB1dCBuZXdJbnB1dCA9IG5ldyBGaWxlRWRpdG9ySW5wdXQoZmlsZSk7Ci0JCS8vIENoZWNrIGlmIHRoZSBlZGl0b3IgaXMgYWxyZWFkeSBvcGVuCi0JCUlFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IG1hdGNoaW5nU3RyYXRlZ3kgPSBnZXRFZGl0b3JEZXNjcmlwdG9yKCkKLQkJCQkuZ2V0RWRpdG9yTWF0Y2hpbmdTdHJhdGVneSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobWF0Y2hpbmdTdHJhdGVneS5tYXRjaGVzKGVkaXRvclJlZnNbaV0sIG5ld0lucHV0KSkgewotCQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJCS5vcGVuV2FybmluZyhzaGVsbCwgIlByb2JsZW0gRHVyaW5nIFNhdmUgQXMuLi4iLAotCQkJCQkJCQkiU2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiBUYXJnZXQgZmlsZSBpcyBhbHJlYWR5IG9wZW4gaW4gYW5vdGhlciBlZGl0b3IuIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQl0cnkgewotCQkJcHJvdmlkZXIuYWJvdXRUb0NoYW5nZShuZXdJbnB1dCk7Ci0JCQlnZXREb2N1bWVudFByb3ZpZGVyKG5ld0lucHV0KS5zYXZlRG9jdW1lbnQocHJvZ3Jlc3NNb25pdG9yLAotCQkJCQluZXdJbnB1dCwKLQkJCQkJZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpLCB0cnVlKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0geC5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIlNhdmUgUHJvYmxlbXMiLAotCQkJCQkJIkNvdWxkIG5vdCBzYXZlIGZpbGUuIiwgeC5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwcm92aWRlci5jaGFuZ2VkKG5ld0lucHV0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJc2V0SW5wdXQobmV3SW5wdXQpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgewotCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKCFzdWNjZXNzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VzSGludChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkgewotCQlpZiAodHlwZSA9PSBJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dAotCQkJCXx8IGlucHV0IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGdldEVkaXRvcklucHV0KCkgIT0gbnVsbCA/IGdldERvY3VtZW50UHJvdmlkZXIoKQotCQkJCS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKSA6IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCXJldHVybiAoKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjOTZlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5FeHRlbmRlZEltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQG1vZGlmaWVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4gZXh0ZW5kcwotCQlBY3Rpdml0eURldGFpbERpYWdyYW1QbHVnaW4gewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWZlcmVuY2VzSGludCBESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQgPSBuZXcgUHJlZmVyZW5jZXNIaW50KAotCQkJSUQpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBteURvY3VtZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJUHJlZmVyZW5jZXNIaW50LnJlZ2lzdGVyUHJlZmVyZW5jZVN0b3JlKERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCwKLQkJCQlnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlhZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCWFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeSgpIHsKLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoZmFjdG9yaWVzKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KGZhY3Rvcmllcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxJdGVtUHJvdmlkZXJGYWN0b3JpZXMoTGlzdCBmYWN0b3JpZXMpIHsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEl0ZW1JbWFnZURlc2NyaXB0b3IoT2JqZWN0IGl0ZW0pIHsKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChpdGVtLCBJSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAobGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQlsYWJlbFByb3ZpZGVyLmdldEltYWdlKGl0ZW0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oSUQsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJlc3BlY3RzIGltYWdlcyByZXNpZGluZyBpbiBhbnkgcGx1Zy1pbi4gSWYgcGF0aCBpcyByZWxhdGl2ZSwKLQkgKiB0aGVuIHRoaXMgYnVuZGxlIGlzIGxvb2tlZCB1cCBmb3IgdGhlIGltYWdlLCBvdGhlcndpc2UsIGZvciBhYnNvbHV0ZSAKLQkgKiBwYXRoLCBmaXJzdCBzZWdtZW50IGlzIHRha2VuIGFzIGlkIG9mIHBsdWctaW4gd2l0aCBpbWFnZQotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHRvIGltYWdlLCBlaXRoZXIgYWJzb2x1dGUgKHdpdGggcGx1Zy1pbiBpZCBhcyBmaXJzdCBzZWdtZW50KSwgb3IgcmVsYXRpdmUgZm9yIGJ1bmRsZWQgaW1hZ2VzCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGZpbmRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJZmluYWwgSVBhdGggcCA9IG5ldyBQYXRoKHBhdGgpOwotCQlpZiAocC5pc0Fic29sdXRlKCkgJiYgcC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCXJldHVybiBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4ocC5zZWdtZW50KDApLCBwCi0JCQkJCS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IocC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc3RyaW5nIGZyb20gcGx1Zy1pbidzIHJlc291cmNlIGJ1bmRsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRSZXNvdXJjZVN0cmluZyhnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLCAiJSIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKiBDbGllbnQgZG8gbm90IG5lZWQgdG8gZGlzcG9zZSB0aGlzIGltYWdlLiBJbWFnZXMgd2lsbCBiZSBkaXNwb3NlZCBhdXRvbWF0aWNhbGx5LgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiBpbWFnZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRCdW5kbGVkSW1hZ2UoU3RyaW5nIHBhdGgpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHBhdGgpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChwYXRoLCBnZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKHBhdGgpKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKCkgewotCQlpZiAobXlEb2N1bWVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCW15RG9jdW1lbnRQcm92aWRlciA9IG5ldyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBteURvY3VtZW50UHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvcikgewotCQlsb2dFcnJvcihlcnJvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoU3RyaW5nIGVycm9yLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmIChlcnJvciA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQllcnJvciA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVN0YXR1cy5PSywgZXJyb3IsIHRocm93YWJsZSkpOwotCQlkZWJ1ZyhlcnJvciwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dJbmZvKG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJbWVzc2FnZSA9IHRocm93YWJsZS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQkJZ2V0TG9nKCkubG9nKAotCQkJCW5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsKLQkJZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNGNiYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JDcmVhdGlvbldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ3JlYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZSBkaWFncmFtTW9kZWxGaWxlUGFnZTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlIGRpYWdyYW07Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvciA9IHRydWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gd29ya2JlbmNoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgUmVzb3VyY2UgZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSB7Ci0JCXJldHVybiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoCi0JCQlib29sZWFuIG9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKSB7Ci0JCXRoaXMub3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWRpYWdyYW1Nb2RlbEZpbGVQYWdlID0gbmV3IERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UoCi0JCQkJIkRpYWdyYW1Nb2RlbEZpbGUiLCBnZXRTZWxlY3Rpb24oKSwgInhtaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZGlhZ3JhbU1vZGVsRmlsZVBhZ2Uuc2V0VGl0bGUoIkNyZWF0ZSBBREQgRGlhZ3JhbSIpOwotCQlkaWFncmFtTW9kZWxGaWxlUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbigiU2VsZWN0IGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gZGlhZ3JhbSBhbmQgZG9tYWluIG1vZGVscy4iKTsKLQkJYWRkUGFnZShkaWFncmFtTW9kZWxGaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24obnVsbCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlkaWFncmFtID0gRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5nZXRVUkkoKSwgbW9uaXRvcik7Ci0JCQkJaWYgKGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSAmJiBkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkJCSJFcnJvciBvcGVuaW5nIGRpYWdyYW0gZWRpdG9yIiwgbnVsbCwgZQotCQkJCQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJIkNyZWF0aW9uIFByb2JsZW1zIiwgbnVsbCwgKChDb3JlRXhjZXB0aW9uKSBlCi0JCQkJCQkJCS5nZXRUYXJnZXRFeGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJFcnJvciBjcmVhdGluZyBkaWFncmFtIiwgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy53b3JrYmVuY2ggPSB3b3JrYmVuY2g7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlzZXRXaW5kb3dUaXRsZSgiTmV3IEFERCBEaWFncmFtIik7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjVlMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS53aXphcmRzLkVkaXRvcldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRXh0ZW5zaW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY3JlYXRlIGZpbGVzIHdpdGggdGhpcyBleHRlbnNpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldEZpbGVQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlzZXRGaWxlTmFtZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0VW5pcXVlRmlsZU5hbWUoCi0JCQkJZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwgZ2V0RmlsZU5hbWUoKSwgZ2V0RXh0ZW5zaW9uKCkpKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwKLQkJCQkmJiAhZ2V0RmlsZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCIuIiArIGV4dGVuc2lvbikpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgKLQkJCQkJIkZpbGUgbmFtZSBzaG91bGQgaGF2ZSAnJ3swfScnIGV4dGVuc2lvbi4iLCBleHRlbnNpb24pKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmJmZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcwotCQlEaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGl0b3JDbGFzcygpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFZGl0b3JJZCgpIHsKLQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvci5JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxN2U3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS51dGlsLkVkaXRVSVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLkdNRkVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnV0aWwuRU1GQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBvdXJTYXZlT3B0aW9ucyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCWlmIChvdXJTYXZlT3B0aW9ucyA9PSBudWxsKSB7Ci0JCQlvdXJTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlvdXJTYXZlT3B0aW9ucy5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRCwKLQkJCQkJUmVzb3VyY2UuT1BUSU9OX1NBVkVfT05MWV9JRl9DSEFOR0VEX01FTU9SWV9CVUZGRVIpOwotCQl9Ci0JCXJldHVybiBvdXJTYXZlT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5EaWFncmFtKFJlc291cmNlIGRpYWdyYW0pCi0JCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlyZXR1cm4gRWRpdFVJVXRpbC5vcGVuRWRpdG9yKChFT2JqZWN0KSBkaWFncmFtLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWZpbGUuc2V0Q2hhcnNldCgiVVRGLTgiLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIHNldCBjaGFyc2V0IGZvciBmaWxlICIgKyBmaWxlLmdldEZ1bGxQYXRoKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRmlsZU5hbWUoSVBhdGggY29udGFpbmVyRnVsbFBhdGgsCi0JCQlTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJaWYgKGNvbnRhaW5lckZ1bGxQYXRoID09IG51bGwpIHsKLQkJCWNvbnRhaW5lckZ1bGxQYXRoID0gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWZpbGVOYW1lID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgIWV4dGVuc2lvbi5lcXVhbHMoZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5hZGRGaWxlRXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0JCX0KLQkJZXh0ZW5zaW9uID0gZmlsZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlmaWxlTmFtZSA9IGZpbGVQYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpbnQgaSA9IDE7Ci0JCXdoaWxlIChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmV4aXN0cyhmaWxlUGF0aCkpIHsKLQkJCWkrKzsKLQkJCWZpbGVQYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lICsgaSk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZVBhdGgubGFzdFNlZ21lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSB3aXphcmQgaW4gYSBkaWFsb2cuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5XaXphcmQoU2hlbGwgc2hlbGwsIFdpemFyZCB3aXphcmQsIFN0cmluZyBzZXR0aW5nc0tleSkgewotCQlJRGlhbG9nU2V0dGluZ3MgcGx1Z2luRGlhbG9nU2V0dGluZ3MgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJaWYgKHdpemFyZERpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQl9Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmREaWFsb2dTZXR0aW5ncyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoTWF0aC5tYXgoNTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZURpYWdyYW0oVVJJIGRpYWdyYW1VUkksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrLCAzKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbU5hbWUgPSBkaWFncmFtVVJJLmxhc3RTZWdtZW50KCk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBtb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOwotCQkJCWF0dGFjaE1vZGVsVG9SZXNvdXJjZShtb2RlbCwgZGlhZ3JhbVJlc291cmNlKTsKLQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlCi0JCQkJCQkuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCQkJbW9kZWwsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQkJZGlhZ3JhbS5zZXROYW1lKGRpYWdyYW1OYW1lKTsKLQkJCQkJZGlhZ3JhbS5zZXRFbGVtZW50KG1vZGVsKTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCi0JCQkJCWRpYWdyYW1SZXNvdXJjZQotCQkJCQkJCS5zYXZlKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCQkiVW5hYmxlIHRvIHN0b3JlIG1vZGVsIGFuZCBkaWFncmFtIHJlc291cmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihwcm9ncmVzc01vbml0b3IsIDEpLCBudWxsKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlzZXRDaGFyc2V0KFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSkpOwotCQlyZXR1cm4gZGlhZ3JhbVJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBkb21haW4gZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggY2FudmFzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBjcmVhdGVJbml0aWFsTW9kZWwoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCX0KLQotCS8qKgotCSAqIFN0b3JlIG1vZGVsIGVsZW1lbnQgaW4gdGhlIHJlc291cmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYXR0YWNoTW9kZWxUb1Jlc291cmNlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBtb2RlbCwKLQkJCVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdEVsZW1lbnRzSW5EaWFncmFtKAotCQkJSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGRpYWdyYW1QYXJ0LCBMaXN0LypFZGl0UGFydCovZWRpdFBhcnRzKSB7Ci0JCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5kZXNlbGVjdEFsbCgpOwotCi0JCUVkaXRQYXJ0IGZpcnN0UHJpbWFyeSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5hcHBlbmRTZWxlY3Rpb24obmV4dFBhcnQpOwotCQkJaWYgKGZpcnN0UHJpbWFyeSA9PSBudWxsICYmIG5leHRQYXJ0IGluc3RhbmNlb2YgSVByaW1hcnlFZGl0UGFydCkgewotCQkJCWZpcnN0UHJpbWFyeSA9IG5leHRQYXJ0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFlZGl0UGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkucmV2ZWFsKAotCQkJCQlmaXJzdFByaW1hcnkgIT0gbnVsbCA/IGZpcnN0UHJpbWFyeSA6IChFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkJLmdldCgwKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1QYXJ0LAotCQkJRU9iamVjdCBlbGVtZW50LCBMaXN0IGVkaXRQYXJ0Q29sbGVjdG9yKSB7Ci0JCUlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbVBhcnQKLQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCWZpbmFsIGludCBpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsgLy8gc3VwcG9ydCBub3RhdGlvbiBlbGVtZW50IGxvb2t1cAotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQllbGVtZW50KTsKLQkJCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGVkaXRQYXJ0KTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBlbGVtZW50SUQgPSBFTUZDb3JlVXRpbC5nZXRQcm94eUlEKGVsZW1lbnQpOwotCQlMaXN0IGFzc29jaWF0ZWRQYXJ0cyA9IHZpZXdlci5maW5kRWRpdFBhcnRzRm9yRWxlbWVudChlbGVtZW50SUQsCi0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJLy8gcGVyZm9ybSB0aGUgcG9zc2libGUgaGllcmFyY2h5IGRpc2pvaW50IC0+IHRha2UgdGhlIHRvcC1tb3N0IHBhcnRzIG9ubHkKLQkJZm9yIChJdGVyYXRvciBlZGl0UGFydEl0ID0gYXNzb2NpYXRlZFBhcnRzLml0ZXJhdG9yKCk7IGVkaXRQYXJ0SXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0SXQubmV4dCgpOwotCQkJRWRpdFBhcnQgcGFyZW50UGFydCA9IG5leHRQYXJ0LmdldFBhcmVudCgpOwotCQkJd2hpbGUgKHBhcmVudFBhcnQgIT0gbnVsbCAmJiAhYXNzb2NpYXRlZFBhcnRzLmNvbnRhaW5zKHBhcmVudFBhcnQpKSB7Ci0JCQkJcGFyZW50UGFydCA9IHBhcmVudFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50UGFydCA9PSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKG5leHRQYXJ0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9PSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkpIHsKLQkJCWlmICghYXNzb2NpYXRlZFBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtUGFydCwgZWxlbWVudAotCQkJCQkJCS5lQ29udGFpbmVyKCksIGVkaXRQYXJ0Q29sbGVjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSAtIGludGlhbE51bU9mRWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZpZXcgZmluZFZpZXcoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCwKLQkJCUVPYmplY3QgdGFyZ2V0RWxlbWVudCwgTGF6eUVsZW1lbnQyVmlld01hcCBsYXp5RWxlbWVudDJWaWV3TWFwKSB7Ci0JCWJvb2xlYW4gaGFzU3RydWN0dXJhbFVSSSA9IGZhbHNlOwotCQlpZiAodGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQloYXNTdHJ1Y3R1cmFsVVJJID0gKChYTUxSZXNvdXJjZSkgdGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSkKLQkJCQkJLmdldElEKHRhcmdldEVsZW1lbnQpID09IG51bGw7Ci0JCX0KLQotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAoaGFzU3RydWN0dXJhbFVSSQotCQkJCSYmICFsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmlzRW1wdHkoKSkgewotCQkJdmlldyA9IChWaWV3KSBsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmdldCgKLQkJCQkJdGFyZ2V0RWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtRWRpdFBhcnQsIHRhcmdldEVsZW1lbnQsCi0JCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcikgPiAwKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcgotCQkJCQkuZ2V0KDApOwotCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlci5jbGVhcigpOwotCQkJdmlldyA9IGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3ID8gKFZpZXcpIGVkaXRQYXJ0Ci0JCQkJCS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJfQotCi0JCXJldHVybiAodmlldyA9PSBudWxsKSA/IGRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpIDogdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMYXp5RWxlbWVudDJWaWV3TWFwIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTWFwIGVsZW1lbnQyVmlld01hcDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBWaWV3IHNjb3BlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFNldCBlbGVtZW50U2V0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTGlzdCBlZGl0UGFydFRtcEhvbGRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhenlFbGVtZW50MlZpZXdNYXAoVmlldyBzY29wZSwgU2V0IGVsZW1lbnRzKSB7Ci0JCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCQl0aGlzLmVsZW1lbnRTZXQgPSBlbGVtZW50czsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTWFwIGdldEVsZW1lbnQyVmlld01hcCgpIHsKLQkJCWlmIChlbGVtZW50MlZpZXdNYXAgPT0gbnVsbCkgewotCQkJCWVsZW1lbnQyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJLy8gbWFwIHBvc3NpYmxlIG5vdGF0aW9uIGVsZW1lbnRzIHRvIGl0c2VsZiBhcyB0aGVzZSBjYW4ndCBiZSBmb3VuZCBieSB2aWV3LmdldEVsZW1lbnQoKQotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZWxlbWVudDsKLQkJCQkJCWlmICh2aWV3LmdldERpYWdyYW0oKSA9PSBzY29wZS5nZXREaWFncmFtKCkpIHsKLQkJCQkJCQllbGVtZW50MlZpZXdNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQpOyAvLyB0YWtlIG9ubHkgdGhvc2UgdGhhdCBwYXJ0IG9mIG91ciBkaWFncmFtCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcChzY29wZSwgZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50U2V0KTsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIE1hcCBidWlsZEVsZW1lbnQyVmlld01hcChWaWV3IHBhcmVudFZpZXcsIE1hcCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJU2V0IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQotCQkJaWYgKHBhcmVudFZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkJJiYgIWVsZW1lbnQyVmlld01hcC5jb250YWluc0tleShwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkKLQkJCQkJJiYgZWxlbWVudHMuY29udGFpbnMocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwLnB1dChwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSwgcGFyZW50Vmlldyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQl9Ci0JfSAvL0xhenlFbGVtZW50MlZpZXdNYXAJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MWMxOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUudXRpbC5JREVFZGl0b3JGaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IudXRpbC5EaWFncmFtRmlsZUNyZWF0b3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvciBleHRlbmRzIElERUVkaXRvckZpbGVDcmVhdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yIElOU1RBTkNFID0gbmV3IERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1GaWxlQ3JlYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICIuYWRkIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2ZDE4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlzdXBlci5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuaGlkZUNvbm5lY3Rpb25IYW5kbGVzKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNTRkY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uRGVtdWx0aXBsZXhpbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uTm90aWZpY2F0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5EaWFncmFtRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkFic3RyYWN0RG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuRGlhZ3JhbURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwuRWRpdG9yU3RhdHVzQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLnV0aWwuRGlhZ3JhbUlPVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEluZm8gY3JlYXRlRWxlbWVudEluZm8oT2JqZWN0IGVsZW1lbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgRmlsZUVkaXRvcklucHV0Ci0JCQkJJiYgZmFsc2UgPT0gZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbigKLQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBjcmVhdGVEb2N1bWVudChlZGl0b3JJbnB1dCk7Ci0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBuZXcgUmVzb3VyY2VTZXRJbmZvKGRvY3VtZW50LCBlZGl0b3JJbnB1dCk7Ci0JCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJaW5mby5mU3RhdHVzID0gbnVsbDsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCXNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCXNldHVwRG9jdW1lbnQoZWxlbWVudCwgZG9jdW1lbnQpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZ2l2ZW4gZG9jdW1lbnQgYXMgaXQgd291bGQgYmUgcHJvdmlkZWQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGUKLQkgKiBjb250ZW50IG9mIHRoZSBkb2N1bWVudCBpcyBub3QgY2hhbmdlZC4gVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgotCSAqIFN1YmNsYXNzZXMgbWF5IHJlaW1wbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBibHVlLXByaW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50IHRvIHNldCB1cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cERvY3VtZW50KE9iamVjdCBlbGVtZW50LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gZm9yIHN1YmNsYXNzZXMKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZVNldEluZm8gaW5mbykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCArPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRW1wdHlEb2N1bWVudCgpIHsKLQkJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERpYWdyYW1Eb2N1bWVudCgpOwotCQlkb2N1bWVudC5zZXRFZGl0aW5nRG9tYWluKGNyZWF0ZUVkaXRpbmdEb21haW4oKSk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBjcmVhdGVFZGl0aW5nRG9tYWluKCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQllZGl0aW5nRG9tYWluLnNldElEKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuRWRpdGluZ0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIE5vdGlmaWNhdGlvbkZpbHRlciBkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCS5jcmVhdGVOb3RpZmllckZpbHRlcihlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkpLmFuZCgKLQkJCQkJCU5vdGlmaWNhdGlvbkZpbHRlcgotCQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5BREQpKS5hbmQoCi0JCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIuY3JlYXRlRmVhdHVyZUZpbHRlcigKLQkJCQkJCQkJUmVzb3VyY2VTZXQuY2xhc3MsCi0JCQkJCQkJCVJlc291cmNlU2V0LlJFU09VUkNFX1NFVF9fUkVTT1VSQ0VTKSk7Ci0JCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXIoKSB7Ci0KLQkJCXByaXZhdGUgTm90aWZpZXIgbXlUYXJnZXI7Ci0KLQkJCXB1YmxpYyBOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCQkJcmV0dXJuIG15VGFyZ2VyOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQlpZiAoZGlhZ3JhbVJlc291cmNlTW9kaWZpZWRGaWx0ZXIubWF0Y2hlcyhub3RpZmljYXRpb24pKSB7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBSZXNvdXJjZSkgewotCQkJCQkJKChSZXNvdXJjZSkgdmFsdWUpLnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm90aWZpZXIgbmV3VGFyZ2V0KSB7Ci0JCQkJbXlUYXJnZXIgPSBuZXdUYXJnZXQ7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBlbGVtZW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRGlhZ3JhbURvY3VtZW50IGRpYWdyYW1Eb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBkb2N1bWVudDsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gZGlhZ3JhbURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlTdG9yYWdlIHN0b3JhZ2UgPSAoKEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpOwotCQkJRGlhZ3JhbSBkaWFncmFtID0gRGlhZ3JhbUlPVXRpbC5sb2FkKGRvbWFpbiwgc3RvcmFnZSwgdHJ1ZSwKLQkJCQkJZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJZG9jdW1lbnQuc2V0Q29udGVudChkaWFncmFtKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCVVSSSB1cmkgPSAoKFVSSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRVUkkoKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZSgKLQkJCQkJCXVyaS50cmltRnJhZ21lbnQoKSwgZmFsc2UpOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoCi0JCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpKTsKLQkJCQl9Ci0JCQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKEdNRlJlc291cmNlRmFjdG9yeQotCQkJCQkJCQkuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkpOwotCQkJCQkJLy8gQHNlZSAxNzEwNjAgCi0JCQkJCQkvLyBvcHRpb25zLnB1dChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLk9QVElPTl9SRUNPUkRfVU5LTk9XTl9GRUFUVVJFLCBCb29sZWFuLlRSVUUpOwotCQkJCQkJcmVzb3VyY2UubG9hZChvcHRpb25zKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3IpOwotCQkJCX0KLQkJCQlpZiAodXJpLmZyYWdtZW50KCkgIT0gbnVsbCkgewotCQkJCQlFT2JqZWN0IHJvb3RFbGVtZW50ID0gcmVzb3VyY2UuZ2V0RU9iamVjdCh1cmkuZnJhZ21lbnQoKSk7Ci0JCQkJCWlmIChyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoKERpYWdyYW0pIHJvb3RFbGVtZW50KTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCByb290RWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmIChyb290RWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQkJCQlkb2N1bWVudC5zZXRDb250ZW50KChEaWFncmFtKSByb290RWxlbWVudCk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29yZUV4Y2VwdGlvbiB0aHJvd25FeGNwID0gbnVsbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCQkJdGhyb3duRXhjcCA9IChDb3JlRXhjZXB0aW9uKSBlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQkJdGhyb3duRXhjcCA9IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJCW5ldyBTdGF0dXMoCi0JCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCW1zZyAhPSBudWxsID8gbXNnCi0JCQkJCQkJCQkJCTogTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvciwKLQkJCQkJCQkJCWUpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgdGhyb3duRXhjcDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCTAsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvciwKLQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dCIsCi0JCQkJCQkJCQkJCQkJIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkuVVJJRWRpdG9ySW5wdXQiIH0pLAotCQkJCQkJCW51bGwpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQlJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RGlhZ3JhbURvY3VtZW50KGVsZW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZG9jdW1lbnQuZ2V0RGlhZ3JhbSgpLmVSZXNvdXJjZSgpOwotCQkJaWYgKGRpYWdyYW1SZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKGRpYWdyYW1SZXNvdXJjZSk7Ci0JCQkJcmV0dXJuIGZpbGUgPT0gbnVsbCB8fCBmaWxlLmdldExvY2F0aW9uKCkgPT0gbnVsbAotCQkJCQkJfHwgIWZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5leGlzdHMoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNEZWxldGVkKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VTZXRJbmZvIGdldFJlc291cmNlU2V0SW5mbyhPYmplY3QgZWRpdG9ySW5wdXQpIHsKLQkJcmV0dXJuIChSZXNvdXJjZVNldEluZm8pIHN1cGVyLmdldEVsZW1lbnRJbmZvKGVkaXRvcklucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChpbmZvIGluc3RhbmNlb2YgUmVzb3VyY2VTZXRJbmZvKSB7Ci0JCQlSZXNvdXJjZVNldEluZm8gcmVzb3VyY2VTZXRJbmZvID0gKFJlc291cmNlU2V0SW5mbykgaW5mbzsKLQkJCXJlc291cmNlU2V0SW5mby5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhbGlkYXRlU3RhdGUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb21wdXRhdGlvbkNvbnRleHQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGZpbGVzMlZhbGlkYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJZmlsZXMyVmFsaWRhdGUuYWRkKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZUVkaXQoCi0JCQkJCShJRmlsZVtdKSBmaWxlczJWYWxpZGF0ZS50b0FycmF5KG5ldyBJRmlsZVtmaWxlczJWYWxpZGF0ZQotCQkJCQkJCS5zaXplKCldKSwgY29tcHV0YXRpb25Db250ZXh0KTsKLQkJfQotCi0JCXN1cGVyLmRvVmFsaWRhdGVTdGF0ZShlbGVtZW50LCBjb21wdXRhdGlvbkNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mby5pc1VwZGF0ZUNhY2hlKCkpIHsKLQkJCQl0cnkgewotCQkJCQl1cGRhdGVDYWNoZShlbGVtZW50KTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZSwgZXgpOwotCQkJCQkvLyBFcnJvciBtZXNzYWdlIHRvIGxvZyB3YXMgaW5pdGlhbGx5IHRha2VuIGZyb20gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5pbnRlcm5hbC5sMTBuLkVkaXRvck1lc3NhZ2VzLlN0b3JhZ2VEb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBpbmZvLmlzUmVhZE9ubHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNSZWFkT25seShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghaXNTdGF0ZVZhbGlkYXRlZChlbGVtZW50KSkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmIChpbmZvLmlzVXBkYXRlQ2FjaGUoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXVwZGF0ZUNhY2hlKGVsZW1lbnQpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNNb2RpZmlhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzTW9kaWZpYWJsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWluZm8uc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCWluZm8uc2V0TW9kaWZpYWJsZShmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmZvLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCWluZm8uc2V0TW9kaWZpYWJsZSh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZVN0YXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWluZm8uc2V0VXBkYXRlQ2FjaGUodHJ1ZSk7Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVTdGF0ZUNhY2hlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uaXNTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNTeW5jaHJvbml6ZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0UmVzZXRSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLm1vZGlmeVJ1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoY29tcHV0ZVNjaGVkdWxpbmdSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFN5bmNocm9uaXplUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkJCS5yZWZyZXNoUnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRWYWxpZGF0ZVN0YXRlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJLnZhbGlkYXRlRWRpdFJ1bGUoCi0JCQkJCQkJKElGaWxlW10pIGZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY29tcHV0ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCWlmICh0b0NyZWF0ZU9yTW9kaWZ5LmV4aXN0cygpKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUoCi0JCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCi0JCUlSZXNvdXJjZSBwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5OwotCQlkbyB7Ci0JCQkvKgotCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAxCi0JCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkKLQkJCSAqIGl0c2VsZi4KLQkJCSAqLwotCQkJdG9DcmVhdGVPck1vZGlmeSA9IHBhcmVudDsKLQkJCXBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpOwotCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKAotCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1N5bmNocm9uaXplKE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoaW5mbywgbmV4dFJlc291cmNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LAotCQkJSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKCFvdmVyd3JpdGUgJiYgIWluZm8uaXNTeW5jaHJvbml6ZWQoKSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbnN5bmNocm9uaXplZEZpbGVTYXZlRXJyb3IsCi0JCQkJCQkJCW51bGwpKTsKLQkJCX0KLQkJCWluZm8uc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQlMaXN0IHJlc291cmNlcyA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKTsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2ssCi0JCQkJCQlyZXNvdXJjZXMuc2l6ZSgpICsgMSk7IC8vIlNhdmluZyBkaWFncmFtIgotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJbW9uaXRvcgotCQkJCQkJCS5zZXRUYXNrTmFtZShOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzaywKLQkJCQkJCQkJCQkJbmV4dFJlc291cmNlLmdldFVSSSgpKSk7Ci0JCQkJCWlmIChuZXh0UmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQluZXh0UmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkJCQkJCS5nZXRTYXZlT3B0aW9ucygpKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdlRmFpbGVkKGVsZW1lbnQpOwotCQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJCUVkaXRvclN0YXR1c0NvZGVzLlJFU09VUkNFX0ZBSUxVUkUsIGUKLQkJCQkJCQkJCQkJLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24geCkgewotCQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQkJdGhyb3cgeDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5mby5zdGFydFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRWxlbWVudENoYW5nZWQoUmVzb3VyY2VTZXRJbmZvIGluZm8sCi0JCQlSZXNvdXJjZSBjaGFuZ2VkUmVzb3VyY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoY2hhbmdlZFJlc291cmNlKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLAotCQkJCQkJCQlleCk7Ci0JCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQKLQkJCX0KLQkJfQotCQljaGFuZ2VkUmVzb3VyY2UudW5sb2FkKCk7Ci0KLQkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQl0cnkgewotCQkJc2V0RG9jdW1lbnRDb250ZW50KGluZm8uZkRvY3VtZW50LCBpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWluZm8uZlN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJaWYgKCFpbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7Ci0JCX0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUVkaXRvcklucHV0IGlucHV0LCBVUkkgdXJpKSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGUgbmV3RmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSgKLQkJCQkJbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXdGaWxlID09IG51bGwgPyBudWxsCi0JCQkJCTogbmV3IEZpbGVFZGl0b3JJbnB1dChuZXdGaWxlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gVE9ETzogYXBwZW5kIHN1ZmZpeCB0byB0aGUgVVJJISAodXNlIGRpYWdyYW0gYXMgYSBwYXJhbWV0ZXIpCi0JCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ldyBVUklFZGl0b3JJbnB1dCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dFdpdGhFZGl0aW5nRG9tYWluKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlyZXR1cm4gZWRpdG9ySW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbURvY3VtZW50IGdldERpYWdyYW1Eb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKElEaWFncmFtRG9jdW1lbnQpIGRvYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0SW5mbyBleHRlbmRzIEVsZW1lbnRJbmZvIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBsb25nIG15TW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBteVVuU3luY2hyb25pemVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElEaWFncmFtRG9jdW1lbnQgbXlEb2N1bWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJRWRpdG9ySW5wdXQgbXlFZGl0b3JJbnB1dDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXBkYXRlQ2FjaGUgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlNb2RpZmlhYmxlID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVJlYWRPbmx5ID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyIG15UmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0SW5mbyhJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50LAotCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJbXlEb2N1bWVudCA9IGRvY3VtZW50OwotCQkJbXlFZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0OwotCQkJc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJbXlSZXNvdXJjZVNldExpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIG15TW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkJbXlNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJCXJldHVybiBteURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoKSB7Ci0JCQlyZXR1cm4gbXlFZGl0b3JJbnB1dDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLnJlbW92ZShteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotCQkJcmV0dXJuIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuc2l6ZSgpID09IDA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VW5TeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKSB7Ci0JCQlteVN5bmNocm9uaXplci5kaXNwb3NlKCk7Ci0JCQlteVN5bmNocm9uaXplciA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyID0gbmV3IFdvcmtzcGFjZVN5bmNocm9uaXplcihteURvY3VtZW50Ci0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIG5ldyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNhY2hlKCkgewotCQkJcmV0dXJuIG15VXBkYXRlQ2FjaGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VXBkYXRlQ2FjaGUoYm9vbGVhbiB1cGRhdGUpIHsKLQkJCW15VXBkYXRlQ2FjaGUgPSB1cGRhdGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgewotCQkJcmV0dXJuIG15TW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmlhYmxlKGJvb2xlYW4gbW9kaWZpYWJsZSkgewotCQkJbXlNb2RpZmlhYmxlID0gbW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIG15UmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQkJbXlSZWFkT25seSA9IHJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgU3luY2hyb25pemVyRGVsZWdhdGUgaW1wbGVtZW50cwotCQkJCVdvcmtzcGFjZVN5bmNocm9uaXplci5EZWxlZ2F0ZSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VDaGFuZ2VkKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mby50aGlzLCByZXNvdXJjZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsZXRlZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlRWxlbWVudERlbGV0ZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMKLQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZU1vdmVkKFJlc291cmNlIHJlc291cmNlLAotCQkJCQlmaW5hbCBVUkkgbmV3VVJJKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChteURvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKSA9PSByZXNvdXJjZSkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhhbmRsZUVsZW1lbnRNb3ZlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG5ld1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhhbmRsZVJlc291cmNlRGVsZXRlZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFQ29udGVudEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vdGlmaWNhdGlvbkZpbHRlciBteU1vZGlmaWVkRmlsdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0SW5mbyBteUluZm87Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7Ci0JCQlteUluZm8gPSBpbmZvOwotCQkJbXlNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQpLm9yKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5VTlNFVCkpLmFuZCgKLQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoUmVzb3VyY2UuY2xhc3MsCi0JCQkJCQkJUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVEKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZVNldCkgewotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJCWlmICghbm90aWZpY2F0aW9uLmlzVG91Y2goKQotCQkJCQkmJiBteU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBteUluZm8uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpCi0JCQkJCQkJCSYmICFtb2RpZmllZDspIHsKLQkJCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQkJbW9kaWZpZWQgPSBuZXh0UmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gZGlydHlTdGF0ZUNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCXN5bmNocm9uaXplZCAobXlJbmZvKSB7Ci0JCQkJCQkJaWYgKG1vZGlmaWVkICE9IG15SW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCQlteUluZm8uZkNhbkJlU2F2ZWQgPSBtb2RpZmllZDsKLQkJCQkJCQkJZGlydHlTdGF0ZUNoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIXJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQkJCQlteUluZm8uc2V0U3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlydHlTdGF0ZUNoYW5nZWQpIHsKLQkJCQkJCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKG15SW5mbwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG1vZGlmaWVkKTsKLQotCQkJCQkJCWlmICghbW9kaWZpZWQpIHsKLQkJCQkJCQkJbXlJbmZvCi0JCQkJCQkJCQkJLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChteUluZm8pKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M2MTQ1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVSSSBkb21haW5Nb2RlbFVSSTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRvbWFpbk1vZGVsVVJJID0gbnVsbDsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPT0gZmFsc2UKLQkJCQl8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZG9tYWluTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkKLQkJCQkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlFT2JqZWN0IGRpYWdyYW1Sb290ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZG9tYWluTW9kZWxVUkksIHRydWUpOwotCQkJZGlhZ3JhbVJvb3QgPSAoRU9iamVjdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBkb21haW5Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRpYWdyYW1Sb290ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cKLQkJCQkJLm9wZW5FcnJvcigKLQkJCQkJCQlnZXRTaGVsbCgpLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlLAotCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVdpemFyZCB3aXphcmQgPSBuZXcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKGRvbWFpbk1vZGVsVVJJLAotCQkJCWRpYWdyYW1Sb290LCBlZGl0aW5nRG9tYWluKTsKLQkJd2l6YXJkCi0JCQkJLnNldFdpbmRvd1RpdGxlKE5MUwotCQkJCQkJLmJpbmQoCi0JCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGUsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5ydW5XaXphcmQoZ2V0U2hlbGwoKSwgd2l6YXJkLAotCQkJCSJJbml0RGlhZ3JhbUZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzMyZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb24uTG9hZFJlc291cmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTG9hZFJlc291cmNlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IG15U2VsZWN0ZWRFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgbXlTaGVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCW15U2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTG9hZFJlc291cmNlRGlhbG9nIGxvYWRSZXNvdXJjZURpYWxvZyA9IG5ldyBMb2FkUmVzb3VyY2VEaWFsb2cobXlTaGVsbCwKLQkJCQlteVNlbGVjdGVkRWxlbWVudC5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQlsb2FkUmVzb3VyY2VEaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQkJbXlTZWxlY3RlZEVsZW1lbnQgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCX0KLQkJfQotCQlhY3Rpb24uc2V0RW5hYmxlZChpc0VuYWJsZWQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBteVNlbGVjdGVkRWxlbWVudCAhPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFkMWY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWF0Y2hpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0OwotCQl0cnkgewotCQkJZWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGVkaXRvcklucHV0LmVxdWFscyhpbnB1dCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0Ci0JCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoVVJJRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRVUkkoKS5lcXVhbHMoCi0JCQkJCSgoVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQyYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKFVSSSBkb21haW5Nb2RlbFVSSSwgRU9iamVjdCBkaWFncmFtUm9vdCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJYXNzZXJ0IGRvbWFpbk1vZGVsVVJJICE9IG51bGwgOiAiRG9tYWluIG1vZGVsIHVyaSBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGRpYWdyYW1Sb290ICE9IG51bGwgOiAiRG9hZ3JhbSByb290IGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydCBlZGl0aW5nRG9tYWluICE9IG51bGwgOiAiRWRpdGluZyBkb21haW4gbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWUsCi0JCQkJU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGUpOwotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oTkxTLmJpbmQoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uLAotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKSk7Ci0JCUlQYXRoIGZpbGVQYXRoOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBkb21haW5Nb2RlbFVSSS50cmltRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWlmIChkb21haW5Nb2RlbFVSSS5pc1BsYXRmb3JtUmVzb3VyY2UoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkKLQkJCQkJLnRvUGxhdGZvcm1TdHJpbmcodHJ1ZSkpOwotCQl9IGVsc2UgaWYgKGRvbWFpbk1vZGVsVVJJLmlzRmlsZSgpKSB7Ci0JCQlmaWxlUGF0aCA9IG5ldyBQYXRoKGRvbWFpbk1vZGVsVVJJLnRyaW1TZWdtZW50cygxKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIDogdXNlIHNvbWUgZGVmYXVsdCBwYXRoCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVW5zdXBwb3J0ZWQgVVJJOiAiICsgZG9tYWluTW9kZWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldENvbnRhaW5lckZ1bGxQYXRoKGZpbGVQYXRoKTsKLQkJbXlGaWxlQ3JlYXRpb25QYWdlLnNldEZpbGVOYW1lKERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCS5nZXRVbmlxdWVGaWxlTmFtZShmaWxlUGF0aCwgZmlsZU5hbWUsICJ4bWkiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlID0gbmV3IERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZSk7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkuc2V0VGl0bGUoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGUpOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJLnNldERlc2NyaXB0aW9uKE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZS5zZXRNb2RlbEVsZW1lbnQoZGlhZ3JhbVJvb3QpOwotCi0JCW15RWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBteUZpbGVDcmVhdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWFkZFBhZ2UobXlGaWxlQ3JlYXRpb25QYWdlKTsKLQkJYWRkUGFnZShkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJTGlzdCBhZmZlY3RlZEZpbGVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBteUZpbGVDcmVhdGlvblBhZ2UuY3JlYXRlTmV3RmlsZSgpOwotCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuc2V0Q2hhcnNldChkaWFncmFtRmlsZSk7Ci0JCWFmZmVjdGVkRmlsZXMuYWRkKGRpYWdyYW1GaWxlKTsKLQkJVVJJIGRpYWdyYW1Nb2RlbFVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGRpYWdyYW1GaWxlCi0JCQkJLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbXlFZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7Ci0JCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0Ci0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1Nb2RlbFVSSSk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCW15RWRpdGluZ0RvbWFpbiwKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kLAotCQkJCWFmZmVjdGVkRmlsZXMpIHsKLQotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCWludCBkaWFncmFtVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXREaWFncmFtVmlzdWFsSUQoZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCQkJCQkuZ2V0TW9kZWxFbGVtZW50KCkpOwotCQkJCWlmIChkaWFncmFtVklEICE9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdAotCQkJCQkJCS5uZXdFcnJvckNvbW1hbmRSZXN1bHQoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcik7Ci0JCQkJfQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlCi0JCQkJCQkuY3JlYXRlRGlhZ3JhbSgKLQkJCQkJCQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCQkJCQkJCS5nZXRNb2RlbEVsZW1lbnQoKSwKLQkJCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQsCi0JCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbVJlc291cmNlKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSBtb2RlbCBhbmQgZGlhZ3JhbSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlNhdmUgb3BlcmF0aW9uIGZhaWxlZCBmb3I6ICIgKyBkaWFncmFtTW9kZWxVUkksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gb3BlbiBlZGl0b3IiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzCi0JCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJCXJldHVybiBNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gcmVzdWx0ID0gVmlld1NlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJLnByb3ZpZGVzKAotCQkJCQkJCW5ldyBDcmVhdGVEaWFncmFtVmlld09wZXJhdGlvbigKLQkJCQkJCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihzZWxlY3RlZE1vZGVsRWxlbWVudCksCi0JCQkJCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCwKLQkJCQkJCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpKTsKLQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQgPyBudWxsCi0JCQkJCTogTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlSW52YWxpZFNlbGVjdGlvbk1lc3NhZ2UpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9EaWFncmFtUGFsZXR0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwZTNjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5Ub29sRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlRHJhd2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5VbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFBhbGV0dGUoUGFsZXR0ZVJvb3QgcGFsZXR0ZVJvb3QpIHsKLQkJLy8JCXBhbGV0dGVSb290LmFkZChjcmVhdGVOb2RlczFHcm91cCgpKTsKLQkJLy8JCXBhbGV0dGVSb290LmFkZChjcmVhdGVMaW5rczJHcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYWxldHRlQ29udGFpbmVyIGNyZWF0ZU5vZGVzMUdyb3VwKCkgewotCQlQYWxldHRlRHJhd2VyIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZURyYXdlcigKLQkJCQlNZXNzYWdlcy5Ob2RlczFHcm91cF90aXRsZSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVJvbGVOb2RlMUNyZWF0aW9uVG9vbCgpKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVUYXNrTm9kZTNDcmVhdGlvblRvb2woKSk7Ci0JCXBhbGV0dGVDb250YWluZXIuYWRkKGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFBhbGV0dGVDb250YWluZXIgY3JlYXRlTGlua3MyR3JvdXAoKSB7Ci0JCVBhbGV0dGVEcmF3ZXIgcGFsZXR0ZUNvbnRhaW5lciA9IG5ldyBQYWxldHRlRHJhd2VyKAotCQkJCU1lc3NhZ2VzLkxpbmtzMkdyb3VwX3RpdGxlKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlTGluazFDcmVhdGlvblRvb2woKSk7Ci0JCXJldHVybiBwYWxldHRlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVSb2xlTm9kZTFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuUm9sZU5vZGUxQ3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLlJvbGVOb2RlMUNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDEpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuUm9sZVRhc2tDb21wb3NpdGUyQ3JlYXRpb25Ub29sX3RpdGxlLAotCQkJCU1lc3NhZ2VzLlJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5Ci0JCQkJLnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVRhc2tOb2RlM0NyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMik7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5UYXNrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuVGFza05vZGUzQ3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1FbGVtZW50VHlwZXMuVGFza05vZGVfMjAwMikpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU0Q3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMpOwotCQlOb2RlVG9vbEVudHJ5IGVudHJ5ID0gbmV3IE5vZGVUb29sRW50cnkoCi0JCQkJTWVzc2FnZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfZGVzYywgdHlwZXMpOwotCQllbnRyeQotCQkJCS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcwotCQkJCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMykpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVG9vbEVudHJ5IGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlNUNyZWF0aW9uVG9vbCgpIHsKLQkJTGlzdC8qPElFbGVtZW50VHlwZT4qL3R5cGVzID0gbmV3IEFycmF5TGlzdC8qPElFbGVtZW50VHlwZT4qLygxKTsKLQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMik7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfdGl0bGUsCi0JCQkJTWVzc2FnZXMuV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX2Rlc2MsIHR5cGVzKTsKLQkJZW50cnkKLQkJCQkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBUb29sRW50cnkgY3JlYXRlTGluazFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSk7Ci0JCUxpbmtUb29sRW50cnkgZW50cnkgPSBuZXcgTGlua1Rvb2xFbnRyeSgKLQkJCQlNZXNzYWdlcy5MaW5rMUNyZWF0aW9uVG9vbF90aXRsZSwKLQkJCQlNZXNzYWdlcy5MaW5rMUNyZWF0aW9uVG9vbF9kZXNjLCB0eXBlcyk7Ci0JCWVudHJ5LnNldFNtYWxsSWNvbihEaWFncmFtRWxlbWVudFR5cGVzCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcihEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSkpOwotCQllbnRyeS5zZXRMYXJnZUljb24oZW50cnkuZ2V0U21hbGxJY29uKCkpOwotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vZGVUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgZWxlbWVudFR5cGVzOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vZGVUb29sRW50cnkoU3RyaW5nIHRpdGxlLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQkJTGlzdCBlbGVtZW50VHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlcyA9IGVsZW1lbnRUeXBlczsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgVG9vbCBjcmVhdGVUb29sKCkgewotCQkJVG9vbCB0b29sID0gbmV3IFVuc3BlY2lmaWVkVHlwZUNyZWF0aW9uVG9vbChlbGVtZW50VHlwZXMpOwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlua1Rvb2xFbnRyeSBleHRlbmRzIFRvb2xFbnRyeSB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgZmluYWwgTGlzdCByZWxhdGlvbnNoaXBUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgcmVsYXRpb25zaGlwVHlwZXMpIHsKLQkJCXN1cGVyKHRpdGxlLCBkZXNjcmlwdGlvbiwgbnVsbCwgbnVsbCk7Ci0JCQl0aGlzLnJlbGF0aW9uc2hpcFR5cGVzID0gcmVsYXRpb25zaGlwVHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uVG9vbChyZWxhdGlvbnNoaXBUeXBlcyk7Ci0JCQl0b29sLnNldFByb3BlcnRpZXMoZ2V0VG9vbFByb3BlcnRpZXMoKSk7Ci0JCQlyZXR1cm4gdG9vbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1YTViYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wYXJ0L0RpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIFRoaXMgcmVnaXN0cnkgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdHlwZSBvZiB2aXN1YWwgb2JqZWN0IHNob3VsZCBiZQotICogY3JlYXRlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgRGlhZ3JhbSwgTm9kZSwgQ2hpbGROb2RlIG9yIExpbmsgcmVwcmVzZW50ZWQgCi0gKiBieSBhIGRvbWFpbiBtb2RlbCBvYmplY3QuCi0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19LRVkgPSBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpCi0JCQkrICIvZGVidWcvdmlzdWFsSUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJaWYgKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELmVxdWFscyh2aWV3LmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFZpc3VhbElEKHZpZXcuZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kZWxJRChWaWV3IHZpZXcpIHsKLQkJVmlldyBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCXdoaWxlICh2aWV3ICE9IGRpYWdyYW0pIHsKLQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgibW9kZWxJRCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl2aWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBkaWFncmFtLmdldFR5cGUoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFN0cmluZyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh0eXBlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihERUJVR19LRVkpKSkgewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkJIlVuYWJsZSB0byBwYXJzZSB2aWV3IHR5cGUgYXMgYSB2aXN1YWxJRCBudW1iZXI6ICIJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShpbnQgdmlzdWFsSUQpIHsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKHZpc3VhbElEKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0RGlhZ3JhbVZpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVZpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiBpc0RpYWdyYW1BY3Rpdml0eURldGFpbERpYWdyYW1fNzkoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZG9tYWluRWxlbWVudCkpIHsKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZERpYWdyYW1JRChkb21haW5FbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywgRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywgZG9tYWluRWxlbWVudCwKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCVN0cmluZyBjb250YWluZXJNb2RlbElEID0gZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlpbnQgY29udGFpbmVyVmlzdWFsSUQ7Ci0JCWlmIChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoY29udGFpbmVyTW9kZWxJRCkpIHsKLQkJCWNvbnRhaW5lclZpc3VhbElEID0gZ2V0VmlzdWFsSUQoY29udGFpbmVyVmlldyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY29udGFpbmVyVmlldyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQljb250YWluZXJWaXN1YWxJRCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWludCBub2RlVmlzdWFsSUQgPSBzZW1hbnRpY0hpbnQgIT0gbnVsbCA/IGdldFZpc3VhbElEKHNlbWFudGljSGludCkKLQkJCQk6IC0xOwotCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7Ci0JCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkKLQkJCQkJJiYgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlTm9kZSgpLmlzU3VwZXJUeXBlT2YoCi0JCQkJCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVSb2xlTm9kZV8yMDAxKChSb2xlTm9kZSkgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQkJcmV0dXJuIFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza05vZGUoKS5pc1N1cGVyVHlwZU9mKAotCQkJCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlVGFza05vZGVfMjAwMigoVGFza05vZGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBUYXNrTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRSb2xlVGFza0NvbXBvc2l0ZV8xMDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlpZiAoKHNlbWFudGljSGludCA9PSBudWxsIHx8IFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoUm9sZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkUm9sZU5vZGVfMjAwMUNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlpZiAoVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkVGFza05vZGVfMjAwMkNoaWxkTm9kZUlEKGRvbWFpbkVsZW1lbnQsCi0JCQkJCXNlbWFudGljSGludCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudF81MDAxQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpCi0JCQkJCSYmIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCQkJCQkJCS5pc1N1cGVyVHlwZU9mKGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJCSYmIChkb21haW5FbGVtZW50ID09IG51bGwgfHwgaXNOb2RlUm9sZVRhc2tDb21wb3NpdGVfMTAwMSgoUm9sZVRhc2tDb21wb3NpdGUpIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJCXJldHVybiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCWlmICgoc2VtYW50aWNIaW50ID09IG51bGwgfHwgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkJCQkJCQkuaXNTdXBlclR5cGVPZihkb21haW5FbGVtZW50TWV0YWNsYXNzKQotCQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTm9kZVdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5Q2hpbGROb2RlSUQoCi0JCQkJCWRvbWFpbkVsZW1lbnQsIHNlbWFudGljSGludCk7Ci0JCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCWlmIChMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCA9PSBub2RlVmlzdWFsSUQpIHsKLQkJCQlyZXR1cm4gTGlua05hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTGlua18zMDAxTGlua0xhYmVsSUQoc2VtYW50aWNIaW50KTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJaWYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzID0gZG9tYWluRWxlbWVudC5lQ2xhc3MoKTsKLQkJcmV0dXJuIGdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChkb21haW5FbGVtZW50LCBkb21haW5FbGVtZW50TWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCwKLQkJCUVDbGFzcyBkb21haW5FbGVtZW50TWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldExpbmsoKS5pc1N1cGVyVHlwZU9mKAotCQkJCWRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpCi0JCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc0xpbmtXaXRoQ2xhc3NMaW5rXzMwMDEoKExpbmspIGRvbWFpbkVsZW1lbnQpKSkgewotCQkJcmV0dXJuIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkTGlua1dpdGhDbGFzc0lEKGRvbWFpbkVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpYWdyYW1BY3Rpdml0eURldGFpbERpYWdyYW1fNzkoCi0JCQlBY3Rpdml0eURldGFpbERpYWdyYW0gZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZERpYWdyYW1JRChFT2JqZWN0IGRvbWFpbkVsZW1lbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBjaGVjayBzb21lIGFkZGl0aW9uYWwgCi0JICogY29uZGl0aW9ucyBoZXJlLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOb2RlUm9sZVRhc2tDb21wb3NpdGVfMTAwMSgKLQkJCVJvbGVUYXNrQ29tcG9zaXRlIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGNoZWNrIHNvbWUgYWRkaXRpb25hbCAKLQkgKiBjb25kaXRpb25zIGhlcmUuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vZGVXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKAotCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVJvbGVOb2RlXzIwMDEoUm9sZU5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVRhc2tOb2RlXzIwMDIoVGFza05vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMygKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgZWxlbWVudCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFJvbGVUYXNrQ29tcG9zaXRlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkUm9sZU5vZGVfMjAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFRhc2tOb2RlXzIwMDJDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDNDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRfNTAwMUNoaWxkTm9kZUlEKAotCQkJRU9iamVjdCBkb21haW5FbGVtZW50LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNvbWUgc3BlY2lmaWMKLQkgKiBzaXR1YXRpb25zIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgbG9naWMuCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudF81MDAyQ2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTGlua18zMDAxTGlua0xhYmVsSUQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlua1dpdGhDbGFzc0xpbmtfMzAwMShMaW5rIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9NZXNzYWdlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODFhNzE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygibWVzc2FnZXMiLCBNZXNzYWdlcy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfT3Blbk1vZGVsUmVzb3VyY2VFcnJvckRpYWxvZ01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Qcm9ncmVzc1Rhc2s7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9JbmNvcnJlY3RJbnB1dEVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1VuYWJsZVRvTG9hZFJlc291cmNlRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfTm9EaWFncmFtSW5SZXNvdXJjZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0RpYWdyYW1Mb2FkaW5nRXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVEaWFncmFtVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlTmV4dFJlc291cmNlVGFzazsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VEZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VJbnZhbGlkU2VsZWN0aW9uTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfSW5pdERpYWdyYW1Db21tYW5kOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9kZXMxR3JvdXBfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGlua3MyR3JvdXBfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUm9sZU5vZGUxQ3JlYXRpb25Ub29sX3RpdGxlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVOb2RlMUNyZWF0aW9uVG9vbF9kZXNjOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJvbGVUYXNrQ29tcG9zaXRlMkNyZWF0aW9uVG9vbF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlVGFza0NvbXBvc2l0ZTJDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTm9kZTNDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza05vZGUzQ3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTRDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdENvbXBvc2l0ZTVDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RDb21wb3NpdGU1Q3JlYXRpb25Ub29sX2Rlc2M7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluazFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluazFDcmVhdGlvblRvb2xfZGVzYzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydF90aXRsZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tYW5kTmFtZV9PcGVuRGlhZ3JhbTsKLQotCS8vVE9ETzogcHV0IGFjY2Vzc29yIGZpZWxkcyBtYW51YWxseQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3BhcnQvTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWVlZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLS8qKgotICogV2l6YXJkIHBhZ2UgdGhhdCBhbGxvd3MgdG8gc2VsZWN0IGVsZW1lbnQgZnJvbSBtb2RlbC4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJlZVZpZXdlciBtb2RlbFZld2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldE1vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkTW9kZWxFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbEVsZW1lbnQoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPSBtb2RlbEVsZW1lbnQ7Ci0JCWlmIChtb2RlbFZld2VyICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChzZWxlY3RlZE1vZGVsRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQkJbW9kZWxWZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbFZld2VyLnNldElucHV0KG51bGwpOwotCQkJfQotCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIHBsYXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGxhdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcGxhdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldENvbnRyb2wocGxhdGUpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBsYXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoZ2V0U2VsZWN0aW9uVGl0bGUoKSk7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJbW9kZWxWZXdlciA9IG5ldyBUcmVlVmlld2VyKHBsYXRlLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlsYXlvdXREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCWxheW91dERhdGEud2lkdGhIaW50ID0gMzAwOwotCQltb2RlbFZld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQltb2RlbFZld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtUHJvdmlkZXJzQWRhcHRlckZhY3RvcnkoKSkpOwotCQltb2RlbFZld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQl9Ci0JCW1vZGVsVmV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UudGhpcwotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gbW9kZWwgZWxlbWVudCBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJcmV0dXJuICJTZWxlY3QgbW9kZWwgZWxlbWVudDoiOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZlYXR1cmVNYXAuRW50cnkpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKEZlYXR1cmVNYXAuRW50cnkpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IChFT2JqZWN0KSBzZWxlY3RlZEVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIHNwZWNpZmljIHZhbGlkYXRpb24gb2YgdGhlIHNlbGVjdGVkIG1vZGVsIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQzMDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmUyNmYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLkNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBDb25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTEzMzk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzA5ZTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbVJ1bGVyc0FuZEdyaWRQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldERlZmF1bHRMaW5lU3R5bGUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByaW50aW5nUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE3MDYxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5QcmludGluZ1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmY2ZiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBSdWxlckdyaWRQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTkyY2E1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQWJzdHJhY3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLlNldFZhbHVlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlNldFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgaW1wbGVtZW50cyBJUGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyB2aWV3UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgdmlld1Byb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBlZGl0UGF0dGVybjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VGb3JtYXQgZWRpdFByb2Nlc3NvcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZpZXdQYXR0ZXJuKCkgewotCQlyZXR1cm4gdmlld1BhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiB2aWV3UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3UGF0dGVybihTdHJpbmcgdmlld1BhdHRlcm4pIHsKLQkJdGhpcy52aWV3UGF0dGVybiA9IHZpZXdQYXR0ZXJuOwotCQl2aWV3UHJvY2Vzc29yID0gY3JlYXRlVmlld1Byb2Nlc3Nvcih2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZVZpZXdQcm9jZXNzb3IoU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdCh2aWV3UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFBhdHRlcm4oKSB7Ci0JCXJldHVybiBlZGl0UGF0dGVybjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIGVkaXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRQYXR0ZXJuKFN0cmluZyBlZGl0UGF0dGVybikgewotCQl0aGlzLmVkaXRQYXR0ZXJuID0gZWRpdFBhdHRlcm47Ci0JCWVkaXRQcm9jZXNzb3IgPSBjcmVhdGVFZGl0UHJvY2Vzc29yKGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgY3JlYXRlRWRpdFByb2Nlc3NvcihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KGVkaXRQYXR0ZXJuKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmludFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRWaWV3UGF0dGVybigpLAotCQkJCWdldFZpZXdQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWRpdFN0cmluZyhJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncykgewotCQlyZXR1cm4gZ2V0U3RyaW5nQnlQYXR0ZXJuKGFkYXB0ZXIsIGZsYWdzLCBnZXRFZGl0UGF0dGVybigpLAotCQkJCWdldEVkaXRQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlckVkaXRTdGF0dXMgaXNWYWxpZEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBlbGVtZW50LAotCQkJU3RyaW5nIGVkaXRTdHJpbmcpIHsKLQkJUGFyc2VQb3NpdGlvbiBwb3MgPSBuZXcgUGFyc2VQb3NpdGlvbigwKTsKLQkJT2JqZWN0W10gdmFsdWVzID0gZ2V0RWRpdFByb2Nlc3NvcigpLnBhcnNlKGVkaXRTdHJpbmcsIHBvcyk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgIkludmFsaWQgaW5wdXQgYXQgIgotCQkJCQkJCSsgcG9zLmdldEVycm9ySW5kZXgoKSk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkYXRlTmV3VmFsdWVzKHZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZU5ld1ZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgU3RyaW5nIG5ld1N0cmluZywKLQkJCWludCBmbGFncykgewotCQlPYmplY3RbXSB2YWx1ZXMgPSBnZXRFZGl0UHJvY2Vzc29yKCkucGFyc2UobmV3U3RyaW5nLAotCQkJCW5ldyBQYXJzZVBvc2l0aW9uKDApKTsKLQkJaWYgKHZhbHVlcyA9PSBudWxsCi0JCQkJfHwgdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKS5nZXRDb2RlKCkgIT0gSVBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZUNvbW1hbmQoYWRhcHRlciwgdmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsCi0JCQlPYmplY3RbXSB2YWx1ZXMpOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBnZXRDb21wbGV0aW9uUHJvY2Vzc29yKElBZGFwdGFibGUgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQl2YWx1ZSA9IGdldFZhbGlkTmV3VmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVNldFJlcXVlc3QgcmVxdWVzdCA9IG5ldyBTZXRSZXF1ZXN0KGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIG5ldyBTZXRWYWx1ZUNvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsaWRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCUVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCWlmICh0eXBlIGluc3RhbmNlb2YgRURhdGFUeXBlKSB7Ci0JCQlDbGFzcyBpQ2xhc3MgPSB0eXBlLmdldEluc3RhbmNlQ2xhc3MoKTsKLQkJCWlmIChTdHJpbmcuY2xhc3MuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZE5ld1ZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKEJvb2xlYW4uVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQm9vbGVhbiBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoQ2hhcmFjdGVyLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbmV3IENoYXJhY3RlcihzLmNoYXJBdCgwKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJIlZhbHVlIG9mIHR5cGUgQ2hhcmFjdGVyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChCeXRlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBCeXRlKCgoTnVtYmVyKSB2YWx1ZSkuYnl0ZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEJ5dGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gQnl0ZSB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIEJ5dGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFNob3J0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTaG9ydCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgU2hvcnQoKChOdW1iZXIpIHZhbHVlKS5zaG9ydFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IFNob3J0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIFNob3J0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU2hvcnQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEludGVnZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludGVnZXIoKChOdW1iZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEludGVnZXIgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBJbnRlZ2VyIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChMb25nLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBMb25nKCgoTnVtYmVyKSB2YWx1ZSkubG9uZ1ZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IExvbmcudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gTG9uZyB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIExvbmcgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEZsb2F0LlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgRmxvYXQoKChOdW1iZXIpIHZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEZsb2F0LnZhbHVlT2Yocyk7Ci0JCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCQkJIlN0cmluZyB2YWx1ZSBkb2VzIG5vdCBjb252ZXJ0IHRvIEZsb2F0IHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRmxvYXQgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKERvdWJsZS5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBEb3VibGUoKChOdW1iZXIpIHZhbHVlKS5kb3VibGVWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCVN0cmluZyBzID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdmFsdWUgPSBEb3VibGUudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRG91YmxlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgRG91YmxlIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgRUVudW0pIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJRUVudW1MaXRlcmFsIGxpdGVyYWwgPSAoKEVFbnVtKSB0eXBlKQotCQkJCQkJCS5nZXRFRW51bUxpdGVyYWxCeUxpdGVyYWwoKFN0cmluZykgdmFsdWUpOwotCQkJCQlpZiAobGl0ZXJhbCA9PSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlVua25vd24gbGl0ZXJhbDogIiArIHZhbHVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXZhbHVlID0gbGl0ZXJhbC5nZXRJbnN0YW5jZSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKCJWYWx1ZSBvZiB0eXBlIFN0cmluZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBJbnZhbGlkVmFsdWUgewotCi0JCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JCXB1YmxpYyBJbnZhbGlkVmFsdWUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMmIwMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbml0ZW0uQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLmFjdGlvbnMuUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5FbmhhbmNlZFByaW50QWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsCi0JCQlJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscyhQcmludFByZXZpZXdBY3Rpb24uSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uKAotCQkJCQluZXcgRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODU5OWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuQ3JlYXRlR3JhcGhpY0VkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuSUVkaXRQYXJ0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuRGlhZ3JhbUVkaXRQYXJ0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0UGFydFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RFZGl0UGFydFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVkaXRQYXJ0RmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbGxvd0NhY2hpbmc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFBhcnQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXZWFrUmVmZXJlbmNlIGNhY2hlZFZpZXc7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FZGl0UGFydFByb3ZpZGVyKCkgewotCQlzZXRGYWN0b3J5KG5ldyBEaWFncmFtRWRpdFBhcnRGYWN0b3J5KCkpOwotCQlzZXRBbGxvd0NhY2hpbmcodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBFZGl0UGFydEZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZhY3RvcnkoRWRpdFBhcnRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNBbGxvd0NhY2hpbmcoKSB7Ci0JCXJldHVybiBhbGxvd0NhY2hpbmc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBbGxvd0NhY2hpbmcoYm9vbGVhbiBhbGxvd0NhY2hpbmcpIHsKLQkJdGhpcy5hbGxvd0NhY2hpbmcgPSBhbGxvd0NhY2hpbmc7Ci0JCWlmICghYWxsb3dDYWNoaW5nKSB7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCUVkaXRQYXJ0IHBhcnQgPSBmYWN0b3J5LmNyZWF0ZUVkaXRQYXJ0KG51bGwsIHZpZXcpOwotCQlpZiAocGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIHBhcnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJR3JhcGhpY2FsRWRpdFBhcnQgZ2V0Q2FjaGVkUGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGNhY2hlZFZpZXcgIT0gbnVsbCAmJiBjYWNoZWRWaWV3LmdldCgpID09IHZpZXcpIHsKLQkJCXJldHVybiAoSUdyYXBoaWNhbEVkaXRQYXJ0KSBjYWNoZWRQYXJ0LmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVHcmFwaGljRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCWlmIChpc0FsbG93Q2FjaGluZygpKSB7Ci0JCQlJR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IGdldENhY2hlZFBhcnQodmlldyk7Ci0JCQljYWNoZWRQYXJ0ID0gbnVsbDsKLQkJCWNhY2hlZFZpZXcgPSBudWxsOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBwYXJ0OwotCQkJfQotCQl9Ci0JCXJldHVybiBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBDcmVhdGVHcmFwaGljRWRpdFBhcnRPcGVyYXRpb24pIHsKLQkJCVZpZXcgdmlldyA9ICgoSUVkaXRQYXJ0T3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldFZpZXcoKTsKLQkJCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc0FsbG93Q2FjaGluZygpICYmIGdldENhY2hlZFBhcnQodmlldykgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJCQljYWNoZWRQYXJ0ID0gbmV3IFdlYWtSZWZlcmVuY2UocGFydCk7Ci0JCQkJCWNhY2hlZFZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZSh2aWV3KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1FbGVtZW50VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNTMxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50VHlwZXMgZXh0ZW5kcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW1FbGVtZW50VHlwZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEltYWdlUmVnaXN0cnlLZXkoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbGVtZW50KTsKLQkJCUVDbGFzcyBlQ29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChlQ29udGFpbmluZ0NsYXNzICE9IG51bGwgJiYgIWVDb250YWluaW5nQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVDb250YWluaW5nQ2xhc3M7Ci0JCQl9IGVsc2UgaWYgKGVUeXBlIGluc3RhbmNlb2YgRUNsYXNzCi0JCQkJCSYmICEoKEVDbGFzcykgZVR5cGUpLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlVHlwZTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVsZW1lbnQ7Ci0JCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQlyZXR1cm4gQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRJdGVtSW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJCQllQ2xhc3MuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkKLQkJCQkJCQkJCQkuY3JlYXRlKGVDbGFzcykpOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gOiBzdXBwb3J0IHN0cnVjdHVyYWwgZmVhdHVyZXMKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihFTmFtZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGtleSA9IGdldEltYWdlUmVnaXN0cnlLZXkoZWxlbWVudCk7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQoa2V5LCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCWltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2VEZXNjcmlwdG9yKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKElBZGFwdGFibGUgaGludCkgewotCQlFTmFtZWRFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KGhpbnQpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyAndHlwZScgb2YgdGhlIGVjb3JlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGhpbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRU5hbWVkRWxlbWVudCBnZXRFbGVtZW50KElBZGFwdGFibGUgaGludCkgewotCQlPYmplY3QgdHlwZSA9IGhpbnQuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwKCk7Ci0KLQkJCWVsZW1lbnRzLnB1dChBY3Rpdml0eURldGFpbERpYWdyYW1fNzksIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFJvbGVUYXNrQ29tcG9zaXRlXzEwMDEsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVUYXNrQ29tcG9zaXRlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMiwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKSk7Ci0KLQkJCWVsZW1lbnRzLnB1dChSb2xlTm9kZV8yMDAxLCBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVOb2RlKCkpOwotCi0JCQllbGVtZW50cy5wdXQoVGFza05vZGVfMjAwMiwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfMjAwMywgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KExpbmtfMzAwMSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBBY3Rpdml0eURldGFpbERpYWdyYW1fNzkgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbV83OSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgUm9sZU5vZGVfMjAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuUm9sZU5vZGVfMjAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgVGFza05vZGVfMjAwMiA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuVGFza05vZGVfMjAwMiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFJvbGVUYXNrQ29tcG9zaXRlXzEwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLlJvbGVUYXNrQ29tcG9zaXRlXzEwMDEiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIFdvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLldvcmtQcm9kdWN0Q29tcG9zaXRlXzEwMDIiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUVsZW1lbnRUeXBlIExpbmtfMzAwMSA9IGdldEVsZW1lbnRUeXBlKCJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuTGlua18zMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZShpZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFNldCBLTk9XTl9FTEVNRU5UX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tub3duRWxlbWVudFR5cGUoSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0JCWlmIChLTk9XTl9FTEVNRU5UX1RZUEVTID09IG51bGwpIHsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMgPSBuZXcgSGFzaFNldCgpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoQWN0aXZpdHlEZXRhaWxEaWFncmFtXzc5KTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFJvbGVUYXNrQ29tcG9zaXRlXzEwMDEpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoV29ya1Byb2R1Y3RDb21wb3NpdGVfMTAwMik7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChSb2xlTm9kZV8yMDAxKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKFRhc2tOb2RlXzIwMDIpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV8yMDAzKTsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMuYWRkKExpbmtfMzAwMSk7Ci0JCX0KLQkJcmV0dXJuIEtOT1dOX0VMRU1FTlRfVFlQRVMuY29udGFpbnMoZWxlbWVudFR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk1NWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5BYnN0cmFjdFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuaWNvbi5HZXRJY29uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLklJY29uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JY29uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUljb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlIGdldEljb24oSUFkYXB0YWJsZSBoaW50LCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuZ2V0SW1hZ2UoaGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRJY29uT3BlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChHZXRJY29uT3BlcmF0aW9uKSBvcGVyYXRpb24pLmV4ZWN1dGUodGhpcykgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Nb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3YmY3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMubW9kZWxpbmdhc3Npc3RhbnQuTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBleHRlbmRzIE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JQb3B1cEJhcihJQWRhcHRhYmxlIGhvc3QpIHsKLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLwkJCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLlJvbGVOb2RlXzIwMDEpOwotCQkJLy8JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5UYXNrTm9kZV8yMDAyKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlXzIwMDMpOwotCQkJcmV0dXJuIHR5cGVzOwotCQl9Ci0JCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0KSB7Ci0JCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuUm9sZVRhc2tDb21wb3NpdGVfMTAwMSk7Ci0JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdENvbXBvc2l0ZV8xMDAyKTsKLQkJCXJldHVybiB0eXBlczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZShJQWRhcHRhYmxlIHNvdXJjZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblRhcmdldChJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVsVHlwZXNPblNvdXJjZUFuZFRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlBZGFwdGFibGUgdGFyZ2V0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclNvdXJjZShJQWRhcHRhYmxlIHRhcmdldCwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRUeXBlc0ZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnRGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gc2VsZWN0RXhpc3RpbmdFbGVtZW50KHRhcmdldCwgZ2V0VHlwZXNGb3JTb3VyY2UodGFyZ2V0LAotCQkJCXJlbGF0aW9uc2hpcFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yVGFyZ2V0KElBZGFwdGFibGUgc291cmNlLAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudChzb3VyY2UsIGdldFR5cGVzRm9yVGFyZ2V0KHNvdXJjZSwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudChJQWRhcHRhYmxlIGhvc3QsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJaWYgKHR5cGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGVkaXRQYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaG9zdAotCQkJCS5nZXRBZGFwdGVyKElHcmFwaGljYWxFZGl0UGFydC5jbGFzcyk7Ci0JCWlmIChlZGl0UGFydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZWRpdFBhcnQuZ2V0Um9vdCgpLmdldENvbnRlbnRzKCkuZ2V0TW9kZWwoKTsKLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkaWFncmFtLmdldEVsZW1lbnQoKS5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChpc0FwcGxpY2FibGVFbGVtZW50KGVsZW1lbnQsIHR5cGVzKSkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc2VsZWN0RWxlbWVudCgoRU9iamVjdFtdKSBlbGVtZW50cy50b0FycmF5KG5ldyBFT2JqZWN0W2VsZW1lbnRzCi0JCQkJLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhYmxlRWxlbWVudChFT2JqZWN0IGVsZW1lbnQsIENvbGxlY3Rpb24gdHlwZXMpIHsKLQkJSUVsZW1lbnRUeXBlIHR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RWxlbWVudFR5cGUoCi0JCQkJZWxlbWVudCk7Ci0JCXJldHVybiB0eXBlcy5jb250YWlucyh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3Qgc2VsZWN0RWxlbWVudChFT2JqZWN0W10gZWxlbWVudHMpIHsKLQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKTsKLQkJRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCXNoZWxsLCBsYWJlbFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoIkF2YWlsYWJsZSBkb21haW4gbW9kZWwgZWxlbWVudHM6Iik7Ci0JCWRpYWxvZy5zZXRUaXRsZSgiU2VsZWN0IGRvbWFpbiBtb2RlbCBlbGVtZW50Iik7Ci0JCWRpYWxvZy5zZXRNdWx0aXBsZVNlbGVjdGlvbihmYWxzZSk7Ci0JCWRpYWxvZy5zZXRFbGVtZW50cyhlbGVtZW50cyk7Ci0JCUVPYmplY3Qgc2VsZWN0ZWQgPSBudWxsOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXNlbGVjdGVkID0gKEVPYmplY3QpIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViYWU0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhbGV0dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMucGFsZXR0ZS5JUGFsZXR0ZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1QYWxldHRlRmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFsZXR0ZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQYWxldHRlUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BhbGV0dGUoSUVkaXRvclBhcnQgZWRpdG9yLCBPYmplY3QgY29udGVudCwKLQkJCVBhbGV0dGVSb290IHJvb3QsIE1hcCBwcmVkZWZpbmVkRW50cmllcykgewotCQlEaWFncmFtUGFsZXR0ZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkoKTsKLQkJZmFjdG9yeS5maWxsUGFsZXR0ZShyb290KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0aW9ucyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCkgewotCQkvLyBubyBjb25maWd1cmF0aW9uCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsgLy8gYWxsIGxvZ2ljIGlzIGRvbmUgaW4gdGhlIHNlcnZpY2UKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Mjk1MDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1QYXJzZXJQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuR2V0UGFyc2VyT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QYXJzZXJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFyc2VyUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciByb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRSb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlpZiAocm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlciA9PSBudWxsKSB7Ci0JCQlyb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyID0gY3JlYXRlUm9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQl9Ci0JCXJldHVybiByb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBjcmVhdGVSb2xlTm9kZVJvbGVOb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgdGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgZ2V0VGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJaWYgKHRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIgPT0gbnVsbCkgewotCQkJdGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlciA9IGNyZWF0ZVRhc2tOb2RlVGFza05vZGVOYW1lXzQwMDJQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gdGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlVGFza05vZGVUYXNrTm9kZU5hbWVfNDAwMlBhcnNlcigpIHsKLQkJRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpKTsKLQkJcGFyc2VyLnNldFZpZXdQYXR0ZXJuKCJ7MH0iKTsKLQkJcGFyc2VyLnNldEVkaXRQYXR0ZXJuKCJ7MH0iKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVfNDAwM1BhcnNlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyID0gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZV80MDAzUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgbGlua0xpbmtOYW1lXzQwMDRQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldExpbmtMaW5rTmFtZV80MDA0UGFyc2VyKCkgewotCQlpZiAobGlua0xpbmtOYW1lXzQwMDRQYXJzZXIgPT0gbnVsbCkgewotCQkJbGlua0xpbmtOYW1lXzQwMDRQYXJzZXIgPSBjcmVhdGVMaW5rTGlua05hbWVfNDAwNFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBsaW5rTGlua05hbWVfNDAwNFBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlTGlua0xpbmtOYW1lXzQwMDRQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlua19OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBnZXRQYXJzZXIoaW50IHZpc3VhbElEKSB7Ci0JCXN3aXRjaCAodmlzdWFsSUQpIHsKLQkJY2FzZSBSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0Um9sZU5vZGVSb2xlTm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQljYXNlIFRhc2tOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRUYXNrTm9kZVRhc2tOb2RlTmFtZV80MDAyUGFyc2VyKCk7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lXzQwMDNQYXJzZXIoKTsKLQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBnZXRMaW5rTGlua05hbWVfNDAwNFBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSVBhcnNlciBnZXRQYXJzZXIoSUFkYXB0YWJsZSBoaW50KSB7Ci0JCVN0cmluZyB2aWQgPSAoU3RyaW5nKSBoaW50LmdldEFkYXB0ZXIoU3RyaW5nLmNsYXNzKTsKLQkJaWYgKHZpZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZCkpOwotCQl9Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBoaW50LmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgR2V0UGFyc2VyT3BlcmF0aW9uKSB7Ci0JCQlJQWRhcHRhYmxlIGhpbnQgPSAoKEdldFBhcnNlck9wZXJhdGlvbikgb3BlcmF0aW9uKS5nZXRIaW50KCk7Ci0JCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRFbGVtZW50KGhpbnQpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0UGFyc2VyKGhpbnQpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtUHJvcGVydHlQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMmNjMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5HZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JQ29tcG9zaXRlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSVByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllcy5wcm92aWRlcnMuR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBHZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyCi0JCWltcGxlbWVudHMgSVByb3BlcnRpZXNQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gKChHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgb3BlcmF0aW9uKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tcG9zaXRlUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5U291cmNlKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmlldykgewotCQkJdmlldyA9IChWaWV3KSBvYmplY3Q7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBvYmplY3Q7Ci0JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQl2aWV3ID0gKFZpZXcpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZpZXcgIT0gbnVsbAotCQkJCSYmIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQodmlldykpKSB7Ci0JCQlyZXR1cm4gdmlldy5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTI0Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBleHRlbmRzIERpYWdyYW1BYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNZXNzYWdlRm9ybWF0IERFRkFVTFRfUFJPQ0VTU09SID0gbmV3IE1lc3NhZ2VGb3JtYXQoCi0JCQkiezB9Iik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0Vmlld1Byb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRWaWV3UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRFZGl0UHJvY2Vzc29yKCkgewotCQlNZXNzYWdlRm9ybWF0IHByb2Nlc3NvciA9IHN1cGVyLmdldEVkaXRQcm9jZXNzb3IoKTsKLQkJcmV0dXJuIHByb2Nlc3NvciA9PSBudWxsID8gREVGQVVMVF9QUk9DRVNTT1IgOiBwcm9jZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldERvbWFpbkVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihlbGVtZW50LCBmZWF0dXJlLCBwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudCA9PSBudWxsID8gbnVsbCA6IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQobmV3IE9iamVjdFtdIHsgdmFsdWUgfSwgbmV3IFN0cmluZ0J1ZmZlcigpLAotCQkJCW5ldyBGaWVsZFBvc2l0aW9uKDApKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlckVkaXRTdGF0dXMgdmFsaWRhdGVWYWx1ZXMoT2JqZWN0W10gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoID4gMSkgewotCQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRV9TVEFUVVM7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBPYmplY3RbXSB2YWx1ZXMpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJT2JqZWN0IHZhbHVlID0gdmFsdWVzLmxlbmd0aCA9PSAxID8gdmFsdWVzWzBdIDogbnVsbDsKLQkJSUNvbW1hbmQgY29tbWFuZCA9IGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kKGVkaXRpbmdEb21haW4sIGNvbW1hbmQKLQkJCQkuZ2V0TGFiZWwoKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb21tYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlyZXR1cm4gaXNBZmZlY3RpbmdGZWF0dXJlKCgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWZmZWN0aW5nRmVhdHVyZShPYmplY3QgZXZlbnRGZWF0dXJlKSB7Ci0JCXJldHVybiBmZWF0dXJlID09IGV2ZW50RmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4NWM0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlc1BhcnNlciBleHRlbmRzIERpYWdyYW1BYnN0cmFjdFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZlYXR1cmVzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyKExpc3QgZmVhdHVyZXMpIHsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3NvcikgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoZmVhdHVyZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJdmFsdWUgPSBnZXRWYWxpZFZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQkJCXZhbHVlcy5hZGQodmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KHZhbHVlcy50b0FycmF5KG5ldyBPYmplY3RbdmFsdWVzLnNpemUoKV0pLAotCQkJCW5ldyBTdHJpbmdCdWZmZXIoKSwgbmV3IEZpZWxkUG9zaXRpb24oMCkpLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUGFyc2VyRWRpdFN0YXR1cyB2YWxpZGF0ZVZhbHVlcyhPYmplY3RbXSB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcy5sZW5ndGggIT0gZmVhdHVyZXMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFX1NUQVRVUzsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkuZ2V0KGkpLCB2YWx1ZXNbaV0pOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW52YWxpZFZhbHVlKSB7Ci0JCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKAotCQkJCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMuVU5FRElUQUJMRSwgdmFsdWUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEVfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihlbGVtZW50KTsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCAiU2V0IFZhbHVlcyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCWNvbW1hbmQKLQkJCQkJLmNvbXBvc2UoZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXNbaV0pKTsKLQkJfQotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCU9iamVjdCBmZWF0dXJlID0gKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCk7Ci0JCQlpZiAoZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODJiMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkFic3RyYWN0Vmlld1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlRhc2tOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuQWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLkxpbmtOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLkxpbmtWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuUm9sZU5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlJvbGVOb2RlVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLlJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5Sb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3Rvcmllcy5UYXNrTm9kZU5hbWVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuVGFza05vZGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXMuV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVmlld1Byb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWaWV3UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHMoZGlhZ3JhbUtpbmQpCi0JCQkJJiYgRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0RGlhZ3JhbVZpc3VhbElEKHNlbWFudGljRWxlbWVudCkgIT0gLTEpIHsKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldE5vZGVWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJaWYgKGNvbnRhaW5lclZpZXcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlID0gZ2V0U2VtYW50aWNFbGVtZW50VHlwZShzZW1hbnRpY0FkYXB0ZXIpOwotCQlpZiAoZWxlbWVudFR5cGUgIT0gbnVsbAotCQkJCSYmICFEaWFncmFtRWxlbWVudFR5cGVzLmlzS25vd25FbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVDbGFzcyBzZW1hbnRpY1R5cGUgPSBnZXRTZW1hbnRpY0VDbGFzcyhzZW1hbnRpY0FkYXB0ZXIpOwotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbm9kZVZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE5vZGVWaXN1YWxJRChjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljRWxlbWVudCwgc2VtYW50aWNUeXBlLCBzZW1hbnRpY0hpbnQpOwotCQlzd2l0Y2ggKG5vZGVWSUQpIHsKLQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBSb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgUm9sZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gUm9sZU5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBSb2xlTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gVGFza05vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBUYXNrTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gVGFza05vZGVOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBSb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkuY2xhc3M7Ci0JCWNhc2UgV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmNsYXNzOwotCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIExpbmtOYW1lVmlld0ZhY3RvcnkuY2xhc3M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXRFZGdlVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCUlFbGVtZW50VHlwZSBlbGVtZW50VHlwZSA9IGdldFNlbWFudGljRWxlbWVudFR5cGUoc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwKLQkJCQkmJiAhRGlhZ3JhbUVsZW1lbnRUeXBlcy5pc0tub3duRWxlbWVudFR5cGUoZWxlbWVudFR5cGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFQ2xhc3Mgc2VtYW50aWNUeXBlID0gZ2V0U2VtYW50aWNFQ2xhc3Moc2VtYW50aWNBZGFwdGVyKTsKLQkJaWYgKHNlbWFudGljVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFT2JqZWN0IHNlbWFudGljRWxlbWVudCA9IGdldFNlbWFudGljRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIpOwotCQlpbnQgbGlua1ZJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRCgKLQkJCQlzZW1hbnRpY0VsZW1lbnQsIHNlbWFudGljVHlwZSk7Ci0JCXN3aXRjaCAobGlua1ZJRCkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gTGlua1ZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3Moc2VtYW50aWNBZGFwdGVyLAotCQkJCWNvbnRhaW5lclZpZXcsIHNlbWFudGljSGludCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUVsZW1lbnRUeXBlIGdldFNlbWFudGljRWxlbWVudFR5cGUoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIpIHsKLQkJaWYgKHNlbWFudGljQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgc2VtYW50aWNBZGFwdGVyLmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDbGFzcyBnZXRVbnJlY29nbml6ZWRDb25uZWN0b3JWaWV3Q2xhc3MoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlWaWV3IGNvbnRhaW5lclZpZXcsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJLy8gSGFuZGxlIHVucmVjb2duaXplZCBjaGlsZCBub2RlIGNsYXNzZXMgaGVyZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTVmNzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluaXRpYWxpemVycyB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC9zZXJ2aWNlL0RpYWdyYW1SZXNldFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3NlcnZpY2UvRGlhZ3JhbVJlc2V0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNiYjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3NlcnZpY2UvRGlhZ3JhbVJlc2V0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5DaGFuZ2VCb3VuZHNDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLQotLyoqCi0gKiBTZXJ2aWNlIGNsYXNzIGZvciByZXNldCB0aGUgQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0uCi0gKiBDb2RlIG1pZ3JhdGVkIGZyb20gb2xkIGRpYWdyYW0gY29kZS4gICAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICoqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZXNldFNlcnZpY2UgewotCi0JcHJpdmF0ZSBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeTsKLQotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0cmFuc2FjdGlvbkRvbWFpbjsKLQkKLQlpbnQgZGVsdGEgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUdfSEVJR0hUID0gMzI7Ci0KLQlwdWJsaWMgRGlhZ3JhbVJlc2V0U2VydmljZShJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRyYW5zYWN0aW9uRG9tYWluLCAKLQkJCUdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIsIERlZmF1bHRFZGl0RG9tYWluIGVkaXREb21haW4sCi0JCQlBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSkgewotCQl0aGlzLnRyYW5zYWN0aW9uRG9tYWluID0gdHJhbnNhY3Rpb25Eb21haW47Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCS8qKgotCSAqIExhemlseSBjcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBhY3Rpb24gcmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgYWN0aW9uIHJlZ2lzdHJ5Ci0JICovCi0JcHJvdGVjdGVkIEFjdGlvblJlZ2lzdHJ5IGdldEFjdGlvblJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHVzZWQgb25seSBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gb3IgYW55IGRpYWdyYW0gbmVlZCBhdXRvLWxheW91dC4KLQkgKiBNZXRob2Qgd2lsbCB2ZXJpZnkgcmVjZW50bHkgYWRkZWQgZWRpdHBhcnRzIGluIHRoZSBBY3Rpdml0eWRldGFpbGRpYWdyYW0gZWRpdHBhcnQKLQkgKiBpbmRpcmVjdGx5IGZyb20gV29ya0JyZWFrZG93blN0cnVjdHVyZSAobWVhbnMgYW55IGRlc2NyaXB0b3JzIGNyZWF0ZWQgaW4gd2JzLCBjb3JyZXNwb25kaW5nCi0JICogRWRpdFBhcnQgd2lsbCBnZXQgY3JlYXRlZCBpbiBBY3Rpdml0eURldGFpbERpYWdyYW0gVmlld2VyKSBhbmQgZG9lcyBhdXRvLWxheW91dAotCSAqIGFsbCB0aGUgbmV3IGFkZGVkIGVkaXRwYXJ0cyBhbmQgZXhpc3Rpbmcgb25lcy4gCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCWlmIChnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250ZW50cygpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkJLmdldENvbnRlbnRzKCk7Ci0JCQlMaXN0IGNoaWxkcmVuID0gZGVwLmdldFJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJCi0JCQkvLyBJZiBhbnkgb2JsaXF1ZSBsaW5rcyByZWN0aWZ5IHRoZW0gdG8gc3RyYWlnaHQuIAotLy8JCQlhbnlPYmxpcXVlTGlua3MoZGVwLCBjaGlsZHJlbik7Ci0JCQkKLQkJCWlmICghY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJQ29tcGFyYXRvcjxPYmplY3Q+IGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCi0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCQkJCWludCByYyA9IDA7Ci0JCQkJCQlpZiAoYXJnMCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQkJCQlpZiAoIShhcmcxIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCkpCi0JCQkJCQkJCXJjID0gLTE7Ci0JCQkJCQl9IGVsc2UgaWYgKGFyZzEgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KQotCQkJCQkJCXJjID0gMTsKLQkJCQkJCXJldHVybiByYzsKLQkJCQkJfQotCQkJCQkKLQkJCQl9OwotCi0JCQkJT2JqZWN0W10gYXJyYXkgPSBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQkJCWZvciAoaW50IGEgPSAwOyBhIDwgYXJyYXkubGVuZ3RoOyBhKyspIHsKLQkJCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBhcnJheVthXTsKLQkJCQkJYWRqdXN0U2l6ZShlcCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGZvcmNlIHJlbGF5b3V0IGFmdGVyIHNpemUgYWRqdXN0bWVudAotCQkJCS8vCi0JCQkJZGVwLmdldFZpZXdwb3J0KCkudmFsaWRhdGUoKTsKLQkJCQkKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IGFycmF5Lmxlbmd0aDsgYisrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbYl07Ci0JCQkJCWNsZWFuVXAoZXApOwotCQkJCX0KLQkJCQlmb3IgKGludCBjID0gMDsgYyA8IGFycmF5Lmxlbmd0aDsgYysrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgYXJyYXlbY107Ci0JCQkJCXJlZHVjZUxpbmtMZW5ndGgoZXApOwotCQkJCX0KLS8vCQkJCWZvciAoaW50IGMgPSAwOyBjIDwgYXJyYXkubGVuZ3RoOyBjKyspIHsKLS8vCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGFycmF5W2NdOwotLy8JCQkJCWlmKGVwIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydCl7Ci0vLwkJCQkJCXJlc2V0U2l6ZXMoZXAsIGVwKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJcGFja0RpYWdyYW0oKTsKLQkJCQlkZXAucmVmcmVzaCgpOwotCQkJCWRlcC5jbGVhclJlY2VudGx5QWRkZWRQYXJ0cygpOwotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXMgYSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgYWxsIG5vZGVzIHdpdGggbGlua3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW5VcChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwKSB7Ci0JCWlmICghKGVwIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydCkpIHsKLQkJCUxpc3Qgc291cmNlTGlua3MgPSBlcC5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJaWYgKHNvdXJjZUxpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHNvdXJjZUxpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbGluayA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBzb3VyY2VMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgdGFyZ2V0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCWludCB3ID0gdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoKE5vZGUpIGVwCi0JCQkJCQkJCS5nZXRNb2RlbCgpKSwgdGFyZ2V0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCS5nZXRMb2NhdGlvbigpLCB3LCB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCk7Ci0JCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQkJaW50IGggPSB0YXJnZXQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKQotCQkJCQkJCQkuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJCXRhcmdldC5nZXRGaWd1cmUoKS5zZXRTaXplKG5ldyBEaW1lbnNpb24odywgaCkpOwotCQkJCQl9Ci0JCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbGlzdC5hZGQoZXApOwotCQkJCQlsaXN0LmFkZCh0YXJnZXQpOwotCQkJCQl2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCUxpc3QgdGFyZ2V0TGlua3MgPSBlcC5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJaWYgKHRhcmdldExpbmtzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKGludCBiID0gMDsgYiA8IHRhcmdldExpbmtzLnNpemUoKTsgYisrKSB7Ci0JCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbGluayA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSB0YXJnZXRMaW5rcy5nZXQoYik7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgc291cmNlID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCWludCB3ID0gc291cmNlLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoOwotCQkJCQlpbnQgZXcgPSBlcC5nZXRGaWd1cmUoKS5nZXRQcmVmZXJyZWRTaXplKCkud2lkdGg7Ci0JCQkJCWlmICh3IDwgZXcpIHsKLQkJCQkJCUNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCgoTm9kZSkgZXAKLQkJCQkJCQkJLmdldE1vZGVsKCkpLCBzb3VyY2UuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkJLmdldExvY2F0aW9uKCksIHcsLTEpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWludCBoID0gc291cmNlLmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkKLQkJCQkJCQkJLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3LCBoKSk7Ci0JCQkJCQlzb3VyY2UuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHcsIGgpKTsKLQkJCQkJfQotCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWxpc3QuYWRkKGVwKTsKLQkJCQkJbGlzdC5hZGQoc291cmNlKTsKLQkJCQkJdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0IHx8IAotCQkJCQllcCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpIHsKLQkJCQlMaXN0IGNoaWxkcmVuID0gZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlmb3IgKGludCBkID0gMDsgZCA8IGNoaWxkcmVuLnNpemUoKTsgZCsrKSB7Ci0JCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJCS5nZXQoZCk7Ci0JCQkJCWNsZWFuVXAocCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIEZvciBhdXRvLWxheW91dCwgbmVlZCB0byBhZGp1c3QgY29ubmVjdGlvbihvciBsaW5rKSBsZW5ndGgsIGJhc2VkIG9uCi0JICogIGNvbm5lY3RpbmcgZWRpdHBhcnRzKGZpZ3VyZXMpLgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWR1Y2VMaW5rTGVuZ3RoKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcGFydCkgewotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCS8vIG9ubHkgbW92ZSBuZXcgV29ya1Byb2R1Y3RDb21wb3NpdGUgZWxlbWVudHMKLQkJaWYgKHBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSBudWxsOwotCQkJaW50IHBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSOwotCQkJLy8gaXMgdGhpcyBlbGVtZW50IGxpbmtlZCB0byBhbm90aGVyIGl0ZW0/Ci0JCQlpZiAocGFydC5nZXRUYXJnZXRDb25uZWN0aW9ucygpLnNpemUoKSA+IDApIHsKLQkJCQlsaW5rZWRQYXJ0ID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpICgoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgcGFydAotCQkJCQkJLmdldFRhcmdldENvbm5lY3Rpb25zKCkuZ2V0KDApKS5nZXRTb3VyY2UoKTsKLQkJCQlwb3NpdGlvbiA9IFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOwotCQkJfSBlbHNlIGlmIChwYXJ0LmdldFNvdXJjZUNvbm5lY3Rpb25zKCkuc2l6ZSgpID4gMCkgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoMCkpLmdldFRhcmdldCgpOwotCQkJCXBvc2l0aW9uID0gUG9zaXRpb25Db25zdGFudHMuU09VVEg7Ci0JCQl9Ci0JCQlpZiAobGlua2VkUGFydCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEobGlua2VkUGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJbGlua2VkUGFydCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBsaW5rZWRQYXJ0Ci0JCQkJCQkJLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCQkvLyBnZXQgdGhlIHBhcnQncyBwb3NpdGlvbgotCQkJCVJlY3RhbmdsZSBwYXJ0Qm91bmRzID0gcGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkvLyBnZXQgdGhlIGxpbmtlZCBwYXJ0J3MgcG9zaXRpb24KLQkJCQlSZWN0YW5nbGUgbGlua2VkUGFydEJvdW5kcyA9IGxpbmtlZFBhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJLy8gZGV0ZXJtaW5lIGluIHdoaWNoIGRpcmVjdGlvbiBpcyB0aGUgbGlua2VkIHBhcnQKLQkJCQkvLyBpbnQgcG9zaXRpb24gPSBwYXJ0Qm91bmRzLmdldFBvc2l0aW9uKGxpbmtlZFBhcnRCb3VuZHMKLQkJCQkvLyAuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJLy8gYXNzdW1lIGl0IGlzIGJlbG93IHVzLCBzbyB0aGlzIHBhcnQgbW92ZXMgdXAKLQkJCQlpbnQgZGlyZWN0aW9uID0gLTE7Ci0JCQkJaWYgKChwb3NpdGlvbiAmIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5OT1JUSAotCQkJCQkJfHwgKHBvc2l0aW9uICYgUG9zaXRpb25Db25zdGFudHMuQ0VOVEVSKSA9PSBQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpIHsKLQkJCQkJLy8gYWJvdmUgdXMsIG1vdmUgZG93bgotCQkJCQlkaXJlY3Rpb24gPSAxOwotCQkJCX0KLQkJCQkvLyBzZXQgbmV3IGJvdW5kcyBmb3IgdGhlIHBhcnQgc28gdGhhdCBpdCBzaXRlcyBqdXN0IG91dHNpZGUgb2YKLQkJCQkvLyB0aGUgbGlua2VkIHBhcnQKLQkJCQlSZWN0YW5nbGUgdGVzdEJvdW5kcyA9IHBhcnRCb3VuZHMuZ2V0Q29weSgpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gMSkgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgKyBsaW5rZWRQYXJ0Qm91bmRzLmhlaWdodAotCQkJCQkJCSsgVkVSVF9QSVhfUEFERElORzsKLQkJCQl9IGVsc2UgewotCQkJCQl0ZXN0Qm91bmRzLnkgPSBsaW5rZWRQYXJ0Qm91bmRzLnkgLSBWRVJUX1BJWF9QQURESU5HCi0JCQkJCQkJLSBwYXJ0Qm91bmRzLmhlaWdodDsKLQkJCQl9Ci0JCQkJLy8gc2V0IHRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBwYXJ0IGluIHRoZSBtb2RlbAotCQkJCVBvaW50IG5wID0gbmV3IFBvaW50KHRlc3RCb3VuZHMueCwgdGVzdEJvdW5kcy55KTsKLQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5wKTsKLQkJCQlDb21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwoTm9kZSkgcGFydC5nZXRNb2RlbCgpLCBucCwKLQkJCQkJCXBhcnRCb3VuZHMud2lkdGgsIC0xKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb3ZlZDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdG8gYWRqdXN0IHRoZSBzaXplIG9mIGVkaXRwYXJ0LiAgCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCkgewotCQlpZiAoZXAgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlhZGp1c3RTaXplKChXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0KSBlcCwgMSk7Ci0JCX0KLQkJZWxzZSBpZiAoZXAgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSB7Ci0JCQlhZGp1c3RTaXplKChSb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0KSBlcCwgNTApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSE9SSVpfUElYX1BBRERJTkcgPSAzMDsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IFZFUlRfUElYX1BBRERJTkcgPSAyMDsKLQotCS8qKgotCSAqIEFkanVzdHMgdGhlIHNpemUgb2YgQ29udGFpbmVyRWRpdFBhcnQgdG8gYWNjb21vZGF0ZSBudW1iZXIgb2YgZWRpdHBhcnRzIGluIGEgcm93LAotCSAqIHB1c2ggdGhlIHJlbWFpbmluZyB0aGUgZWRpdHBhcnRzIGluIHR3byBzZWNvbmQgcm93LiAKLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3Ige0BsaW5rIFRvb2xiYXJMYXlvdXR9Ci0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFNpemUoU2hhcGVOb2RlRWRpdFBhcnQgZXAsIGludCBob3JpekNvdW50KSB7Ci0JCWludCByZXF1aXJlZFdpZHRoID0gMDsKLQkJaW50IHJvd01heEhlaWdodCA9IDA7Ci0JCWludCByb3dzID0gMDsKLQkJaW50IHdpZHRoU3VtID0gMDsKLQkJaW50IGhlaWdodFN1bSA9IDA7Ci0JCWludCBjb2x1bW4gPSAwOwotCi0JCWRlbHRhID0gMDsKLQkJTGlzdCBjaGlsZHJlbiA9IGVwLmdldENoaWxkcmVuKCk7Ci0JCUlGaWd1cmUgcGFyZW50RmlndXJlICA9IGVwLmdldEZpZ3VyZSgpOwotCQkvL1RPRE86IG5lZWQgcmV2aXNpdCB0cmFuc2FjdGlvbiB1c2FnZQotCQl0cnl7Ci0JCVRyYW5zYWN0aW9uIHR4ID0gKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKXRyYW5zYWN0aW9uRG9tYWluKS5zdGFydFRyYW5zYWN0aW9uKGZhbHNlLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQlmb3IgKGludCBwID0gMDsgcCA8IGNoaWxkcmVuLnNpemUoKTspIHsKLQkJCWlmIChjb2x1bW4gPT0gMCkgewotCQkJCXJvd3MrKzsKLQkJCX0KLQkJCWlmIChjb2x1bW4gPCBob3JpekNvdW50KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBjaGlsZCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJLmdldChwKTsKLQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIFJvbGVOb2RlRWRpdFBhcnQgfHwgY2hpbGQgaW5zdGFuY2VvZiBUYXNrTm9kZUVkaXRQYXJ0KXsKLQkJCQkJcmVzZXRTaXplKChTaGFwZU5vZGVFZGl0UGFydCljaGlsZCwgcGFyZW50RmlndXJlKTsKLS8vCQkJCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCQkJbGlzdC5hZGQoY2hpbGQuZ2V0TW9kZWwoKSk7Ci0vLwkJCQkJUGVyc2lzdFZpZXdzQ29tbWFuZCBjbWQgPSBuZXcgUGVyc2lzdFZpZXdzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgbGlzdCk7Ci0vLwkJCQkJY21kLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQkJfQotCQkJCURpbWVuc2lvbiBkID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCQkJCXdpZHRoU3VtICs9IGQud2lkdGg7Ci0JCQkJaWYgKGQuaGVpZ2h0ID4gcm93TWF4SGVpZ2h0KSB7Ci0JCQkJCXJvd01heEhlaWdodCA9IGQuaGVpZ2h0OwotCQkJCX0KLQkJCQlwKys7Ci0JCQkJY29sdW1uKys7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh3aWR0aFN1bSA+IHJlcXVpcmVkV2lkdGgpIHsKLQkJCQkJcmVxdWlyZWRXaWR0aCA9IHdpZHRoU3VtOwotCQkJCX0KLQkJCQloZWlnaHRTdW0gKz0gcm93TWF4SGVpZ2h0OwotCQkJCXJvd01heEhlaWdodCA9IDA7Ci0JCQkJd2lkdGhTdW0gPSAwOwotCQkJCWNvbHVtbiA9IDA7Ci0JCQl9Ci0JCX0KLQkJdHguY29tbWl0KCk7Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkKLQkJfQotCQlpZiAod2lkdGhTdW0gPiByZXF1aXJlZFdpZHRoKSB7Ci0JCQlyZXF1aXJlZFdpZHRoID0gd2lkdGhTdW07Ci0JCX0KLQkJaGVpZ2h0U3VtICs9IHJvd01heEhlaWdodDsKLQkJcmVxdWlyZWRXaWR0aCArPSBIT1JJWl9QSVhfUEFERElORwotCQkJCSogTWF0aC5taW4oaG9yaXpDb3VudCwgY2hpbGRyZW4uc2l6ZSgpKTsKLQkJaW50IHJlcXVpcmVkSGVpZ2h0ID0gaGVpZ2h0U3VtICsgKFZFUlRfUElYX1BBRERJTkcgKiByb3dzKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgcmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQpOwotCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNtZCk7Ci0JCWVwLmdldEZpZ3VyZSgpLnNldFByZWZlcnJlZFNpemUoCi0JCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCByZXF1aXJlZEhlaWdodCkpOwotCQkvLygoTm9kZSkgZXAuZ2V0TW9kZWwoKSkuc2V0SGVpZ2h0KHJlcXVpcmVkSGVpZ2h0KTsKLQkJZXAuZ2V0RmlndXJlKCkuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIHJlcXVpcmVkSGVpZ2h0KSk7Ci0JCWVwLmdldEZpZ3VyZSgpLmdldExheW91dE1hbmFnZXIoKS5sYXlvdXQoZXAuZ2V0RmlndXJlKCkpOwotCQkvLyBhZnRlciBsYXlvdXQsIGNoZWNrIHRoZSBib3R0b20tbW9zdCBjaGlsZCBmaWd1cmUgYWdhaW5zdCB0aGUgYm90dG9tCi0JCS8vIG9mIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgYm90dG9tIG9mIHRoZSBjb250YWluZXIgaXMgbmVjZXNzYXJ5Ci0JCWlmIChlcCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJaW50IHRvdGFsQ2FsY3VsYXRlZEhlaWdodCA9IDA7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykJCXsKLQkJCQlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQkJTm9kZSBub2RlT2JqID0gKE5vZGUpIHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IG8gPSBub2RlT2JqLmdldEVsZW1lbnQoKTsJCQkJCi0JCQkJdG90YWxDYWxjdWxhdGVkSGVpZ2h0ICs9IHBhcnQuZ2V0RmlndXJlKCkuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodDsKLQkJCX0KLQkJCWludCBoZWlnaHQgPSB0b3RhbENhbGN1bGF0ZWRIZWlnaHQgKyAyMCArIDUgKiAoY2hpbGRyZW4uc2l6ZSgpIC0gMSk7Ci0JCQlHcmFwaGljYWxFZGl0UGFydCBsYXN0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbi5nZXQoY2hpbGRyZW4KLQkJCQkJLnNpemUoKSAtIDEpOwotCQkJUG9pbnQgY2hpbGRCb3R0b20gPSBsYXN0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCQkJUG9pbnQgcGFyZW50Qm90dG9tID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Qm90dG9tKCk7Ci0JCQlpbnQgZGVsdGEgPSBwYXJlbnRCb3R0b20ueSAtIGNoaWxkQm90dG9tLnkgLSAoVkVSVF9QSVhfUEFERElORyAvIDIpOwotLy8JCQllcC5nZXRGaWd1cmUoKS5zZXRQcmVmZXJyZWRTaXplKAotLy8JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQgLSBkZWx0YSkpOwotLy8JCQljbWQgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwgKChOb2RlKSBlcC5nZXRNb2RlbCgpKSwgZXAKLS8vCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgLTEsIHJlcXVpcmVkSGVpZ2h0LWRlbHRhKTsKLS8vCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjbWQpOwotLy8JCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKAotLy8JCQkJCW5ldyBEaW1lbnNpb24ocmVxdWlyZWRXaWR0aCwgcmVxdWlyZWRIZWlnaHQgLSBkZWx0YSkpOwotCQkJZXAuZ2V0RmlndXJlKCkuc2V0UHJlZmVycmVkU2l6ZSgKLQkJCQkJbmV3IERpbWVuc2lvbihyZXF1aXJlZFdpZHRoLCBoZWlnaHQpKTsKLQkJCWNtZCA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLCAoKE5vZGUpIGVwLmdldE1vZGVsKCkpLCBlcAotCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0TG9jYXRpb24oKSwgLTEsIGhlaWdodCk7Ci0JCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNtZCk7CQkJCi0JCQllcC5nZXRGaWd1cmUoKS5zZXRTaXplKAotCQkJCQluZXcgRGltZW5zaW9uKHJlcXVpcmVkV2lkdGgsIGhlaWdodCkpOwotCQl9Ci0JfQotCQotCQotCQotCQotCXByaXZhdGUgdm9pZCByZXNldFNpemUoU2hhcGVOb2RlRWRpdFBhcnQgZXAsIElGaWd1cmUgcGFyZW50RmlndXJlKXsKLQkJCi0JCU5vZGUgbW9kZWwgPSAoTm9kZSllcC5nZXRNb2RlbCgpOwotCQlJR3JhcGhpY2FsRWRpdFBhcnQgY2hpbGQgPSAoSUdyYXBoaWNhbEVkaXRQYXJ0KWVwLmdldENoaWxkcmVuKCkuZ2V0KDApOwotCQlOb2RlRmlndXJlIG5vZGVGaWd1cmUgPSAoTm9kZUZpZ3VyZSllcC5nZXRGaWd1cmUoKTsKLQkJTGlzdCBub2RlRmlndXJlQ2hpbGRyZW4gPSAgbm9kZUZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQlJRmlndXJlIGNoaWxkRmlndXJlID0gKElGaWd1cmUpbm9kZUZpZ3VyZUNoaWxkcmVuLmdldCgwKTsKLQkJaWYoY2hpbGRGaWd1cmUgaW5zdGFuY2VvZiBSZWN0YW5nbGVGaWd1cmUpewotCQkJSUZpZ3VyZSBsYWJlbEZpZ3VyZSA9IChJRmlndXJlKSgoUmVjdGFuZ2xlRmlndXJlKWNoaWxkRmlndXJlKS5nZXRDaGlsZHJlbigpLmdldCgwKTsKLQkJCWlmKGxhYmVsRmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKXsKLQkJCQlEaW1lbnNpb24gZmlnRGltZW5zaW9uID0gbGFiZWxGaWd1cmUuZ2V0U2l6ZSgpOwotCQkJCURpbWVuc2lvbiBkID0gbGFiZWxGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpOwotCQkJCVBvaW50IHAgPSBub2RlRmlndXJlLmdldExvY2F0aW9uKCkuZ2V0Q29weSgpOwotCQkJCXAueCA9IHAueCArIGRlbHRhOwotCQkJCW5vZGVGaWd1cmUuc2V0TG9jYXRpb24ocCk7Ci0JCQkJaWYgKGQud2lkdGggPiBub2RlRmlndXJlLmdldFNpemUoKS53aWR0aCkgewotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgZmlndXJlIHdpZHRoOiAiK25vZGVGaWd1cmUuZ2V0U2l6ZSgpLndpZHRoKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJUZXh0IHdpZHRoOiAiKyBkLndpZHRoKTsKLQkJCQkJZGVsdGEgKz0gZC53aWR0aCAtIG5vZGVGaWd1cmUuZ2V0U2l6ZSgpLndpZHRoOwotCQkJCX0KLQkJCQlpZihkLndpZHRoID4gZmlnRGltZW5zaW9uLndpZHRoKXsKLQkJCQkJaW50IHdpZHRoID0gZC53aWR0aDsKLQkJCQkJVmlldyB2aWV3ID0gKChWaWV3KWNoaWxkLmdldE1vZGVsKCkpOwotCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCksIG5ldyBJbnRlZ2VyKAotCQkJCQkJCQkJd2lkdGgpKTsKLQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShtb2RlbCwKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQl3aWR0aCkpOwotCQkJCQlub2RlRmlndXJlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgbm9kZUZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0JCQkJCWNoaWxkRmlndXJlLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbih3aWR0aCwgY2hpbGRGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQlsYWJlbEZpZ3VyZS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIGxhYmVsRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJbm9kZUZpZ3VyZS5zZXRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIG5vZGVGaWd1cmUuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCkpOwotCQkJCQljaGlsZEZpZ3VyZS5zZXRTaXplKG5ldyBEaW1lbnNpb24od2lkdGgsIGNoaWxkRmlndXJlLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJbGFiZWxGaWd1cmUuc2V0U2l6ZShuZXcgRGltZW5zaW9uKHdpZHRoLCBsYWJlbEZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCkuaGVpZ2h0KSk7Ci0KLS8vCQkJCQlub2RlRmlndXJlLnNldENvbnN0cmFpbnQoY2hpbGRGaWd1cmUsIG5ldyBSZWN0YW5nbGUobm9kZUZpZ3VyZS5nZXRMb2NhdGlvbigpLngsCi0vLwkJCQkJCQlub2RlRmlndXJlLmdldExvY2F0aW9uKCkueSwgd2lkdGgsIGNoaWxkRmlndXJlLmdldEJvdW5kcygpLmhlaWdodCkpOwotCQkJCQkvLyBDaGFuZ2UgdGhlIGxvY2F0aW9uIAotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGQgYm91bmRzIGJlZm9yZTogIiArIG5vZGVGaWd1cmUuZ2V0Qm91bmRzKCkgKyJkZWx0YTogIiArIGRlbHRhKTsJCQkJCQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQsCi0JCQlMaXN0PEVkaXRQYXJ0PiBjb25uZWN0ZWQpIHsKLQkJLy8gb25seSBhZGQgcGFydHMgZGlyZWN0bHkgb24gdGhlIGRpYWdyYW0gc3VyZmFjZQotCQlpZiAoIWNvbm5lY3RlZC5jb250YWlucyhwYXJ0KSkgewotCQkJaWYgKCEocGFydC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQlpZiAoIWNvbm5lY3RlZC5jb250YWlucyhwYXJ0LmdldFBhcmVudCgpKSkgewotCQkJCQljb25uZWN0ZWQuYWRkKHBhcnQuZ2V0UGFyZW50KCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJY29ubmVjdGVkLmFkZChwYXJ0KTsKLQkJCX0KLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgbGlua2VkUGFydCA9IG51bGw7Ci0JCQlMaXN0IGNoaWxkcmVuID0gcGFydC5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgeCA9IDA7IHggPCBjaGlsZHJlbi5zaXplKCk7IHgrKykgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBjaGlsZHJlbgotCQkJCQkJLmdldCh4KTsKLQkJCQllbnVtZXJhdGVDb25uZWN0ZWRQYXJ0cyhwLCBjb25uZWN0ZWQpOwotCQkJfQotCQkJLy8gaXMgdGhpcyBlbGVtZW50IGxpbmtlZCB0byBhbm90aGVyIGl0ZW0/Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnQuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5zaXplKCk7IHgrKykgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFNvdXJjZSgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnQuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5zaXplKCk7IHgrKykgewotCQkJCWxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBwYXJ0Ci0JCQkJCQkuZ2V0U291cmNlQ29ubmVjdGlvbnMoKS5nZXQoeCkpLmdldFRhcmdldCgpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKGxpbmtlZFBhcnQsIGNvbm5lY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBmaW5kcyBzaW5nbGUgZWxlbWVudHMgYW5kIGdyb3VwcyBvZiBlbGVtZW50cywgYW5kIHBvc2l0aW9ucwotCSAqIHRoZW0gc3RhcnRpbmcgZnJvbSB0aGUgdG9wIG9mIHRoZSBkaWFncmFtIGFuZCBjb250aW51b3VzbHkgZG93biB0aGUgcGFnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFja0RpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQpIGdldEdyYXBoaWNhbFZpZXdlcigpCi0JCQkJLmdldENvbnRlbnRzKCk7Ci0JCS8vIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIGRpYWdyYW0KLQkJLy8gRGltZW5zaW9uIGRpYWdyYW1TaXplID0gZGlhZ3JhbS5nZXRGaWd1cmUoKS5nZXRTaXplKCk7Ci0JCS8vIG5vIG5ldyBzaGFwZXMgY2FuIGJlIG1vdmVkIGFib3ZlIHRoaXMgeS1heGlzIHZhbHVlCi0JCWludCByZXNlcnZlZCA9IDA7Ci0JCS8vIHRoZXNlIGFyZSBlbGVtZW50cyB3aXRob3V0IGNvbm5lY3Rpb25zCi0JCUxpc3Q8RWRpdFBhcnQ+IHN0cmFnZ2xlcnMgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCQkvLyB0aGVzZSBhcmUgZ3JvdXBzIG9mIGVsZW1lbnRzIGNvbm5lY3RlZCB3aXRoIGxpbmtzCi0JCUxpc3Q8TGlzdD4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxMaXN0PigpOwotCQkvLyB0aGVzZSBhcmUgdG9wIGxldmVsIHBhcnRzIG9uIHRoZSBkaWFncmFtIHRoYXQgaGF2ZSBiZWVuIGFkZGVkCi0JCUxpc3QgZGlhZ3JhbVBhcnRzID0gZGlhZ3JhbS5nZXRSZWNlbnRseUFkZGVkUGFydHMoKTsKLQkJZm9yIChpbnQgeCA9IDA7IHggPCBkaWFncmFtUGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBkaWFncmFtUGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGcgPSAwOyBnIDwgZ3JvdXBzLnNpemUoKSAmJiBmb3VuZCA9PSBmYWxzZTsgZysrKSB7Ci0JCQkJTGlzdCBncm91cCA9IChMaXN0KSBncm91cHMuZ2V0KGcpOwotCQkJCWlmIChncm91cC5jb250YWlucyhwKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQlMaXN0PEVkaXRQYXJ0PiBjb25uZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PEVkaXRQYXJ0PigpOwotCQkJCWVudW1lcmF0ZUNvbm5lY3RlZFBhcnRzKHAsIGNvbm5lY3RlZCk7Ci0JCQkJaWYgKGNvbm5lY3RlZC5zaXplKCkgPT0gMSkgewotCQkJCQlzdHJhZ2dsZXJzLmFkZChwKTsKLQkJCQl9IGVsc2UgewotCQkJCQlncm91cHMuYWRkKGNvbm5lY3RlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHByb2Nlc3MgZWFjaCBncm91cCBjbG9zZXN0IHRvIHRoZSB0b3AgKG1pbiB5IHZhbHVlKQotCQl3aGlsZSAoZ3JvdXBzLnNpemUoKSA+IDApIHsKLQkJCUxpc3QgdG9wID0gKExpc3QpIGdyb3Vwcy5nZXQoMCk7Ci0JCQlpbnQgdG9wWSA9IGdldFZlcnRpY2FsTWluUGFydCh0b3ApLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IGdyb3Vwcy5zaXplKCk7IHgrKykgewotCQkJCUxpc3QgZyA9IChMaXN0KSBncm91cHMuZ2V0KHgpOwotCQkJCWludCB5ID0gZ2V0VmVydGljYWxNaW5QYXJ0KGcpLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnk7Ci0JCQkJaWYgKHkgPCB0b3BZKSB7Ci0JCQkJCXRvcCA9IGc7Ci0JCQkJCXRvcFkgPSB5OwotCQkJCX0KLQkJCX0KLQkJCWludCBsaW1pdCA9IHJlc2VydmVkICsgMTsKLQkJCWludCB2ZXJ0aWNhbERlbHRhID0gbGltaXQgLSB0b3BZOwotCQkJaW50IGxlZnRYID0gZ2V0SG9yaXpvbnRhbE1pblBhcnQodG9wKS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54OwotCQkJaW50IGhvcml6b250YWxEZWx0YSA9IEhPUklaX1BJWF9QQURESU5HIC0gbGVmdFg7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IHRvcC5zaXplKCk7IHgrKykgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSB0b3AKLQkJCQkJCS5nZXQoeCk7Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJQ2hhbmdlQm91bmRzQ29tbWFuZCBjYmMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwoTm9kZSkgcAotCQkJCQkJLmdldE1vZGVsKCksIG5ldyBQb2ludChib3VuZHMueCArIGhvcml6b250YWxEZWx0YSwKLQkJCQkJCWJvdW5kcy55ICsgdmVydGljYWxEZWx0YSksIGJvdW5kcy53aWR0aCwgLTEpOwotCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY2JjKTsKLQkJCQlwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54ICsgaG9yaXpvbnRhbERlbHRhLCBib3VuZHMueQotCQkJCQkJCQkrIHZlcnRpY2FsRGVsdGEpKTsKLQkJCQlwLnJlZnJlc2goKTsKLQkJCX0KLQkJCWludCBib3R0b21ZID0gZ2V0VmVydGljYWxNYXhQYXJ0KHRvcCkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJLmJvdHRvbSgpOwotCQkJcmVzZXJ2ZWQgPSBib3R0b21ZICsgKFZFUlRfUElYX1BBRERJTkcgKiAyKTsKLQkJCWdyb3Vwcy5yZW1vdmUodG9wKTsKLQkJfQotCQlpbnQgbmV4dCA9IEhPUklaX1BJWF9QQURESU5HOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHN0cmFnZ2xlcnMuc2l6ZSgpOyB4KyspIHsKLQkJCWludCBsaW1pdCA9IHJlc2VydmVkICsgMTsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBzdHJhZ2dsZXJzCi0JCQkJCS5nZXQoeCk7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCUNoYW5nZUJvdW5kc0NvbW1hbmQgY2JjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sIChOb2RlKSBwCi0JCQkJCS5nZXRNb2RlbCgpLCBuZXcgUG9pbnQobmV4dCwgbGltaXQpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY2JjKTsKLQkJCXAuZ2V0RmlndXJlKCkuc2V0TG9jYXRpb24obmV3IFBvaW50KG5leHQsIGxpbWl0KSk7Ci0JCQlwLnJlZnJlc2goKTsKLQkJCW5leHQgKz0gYm91bmRzLndpZHRoICsgSE9SSVpfUElYX1BBRERJTkc7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0VmVydGljYWxNaW5QYXJ0KExpc3QgcGFydHMpIHsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCByYyA9IHBhcnRzLnNpemUoKSA+IDAgPyAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkuZ2V0KDApCi0JCQkJOiBudWxsOwotCQlmb3IgKGludCB4ID0gMDsgeCA8IHBhcnRzLnNpemUoKTsgeCsrKSB7Ci0JCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgcGFydHMKLQkJCQkJLmdldCh4KTsKLQkJCWlmIChwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLnkgPCByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55KSB7Ci0JCQkJcmMgPSBwOwotCQkJfQotCQl9Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZ2V0SG9yaXpvbnRhbE1pblBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueCA8IHJjLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBnZXRWZXJ0aWNhbE1heFBhcnQoTGlzdCBwYXJ0cykgewotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IHJjID0gcGFydHMuc2l6ZSgpID4gMCA/IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCS5nZXQoMCkKLQkJCQk6IG51bGw7Ci0JCWZvciAoaW50IHggPSAwOyB4IDwgcGFydHMuc2l6ZSgpOyB4KyspIHsKLQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBwYXJ0cwotCQkJCQkuZ2V0KHgpOwotCQkJaWYgKHAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuYm90dG9tKCkgPiByYy5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkuYm90dG9tKCkpIHsKLQkJCQlyYyA9IHA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXB1YmxpYyB2b2lkIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWQoTGlzdCBlZGl0UGFydHMpIHsKLQkJLy8gZ2V0IHRoZSBzZWxlY3RlZCBpdGVtcwotCQkvLwkJTGlzdCBlZGl0UGFydHMgPSBnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRTZWxlY3RlZEVkaXRQYXJ0cygpOwotCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGFsaWduVG9QYXJ0ID0gbnVsbDsKLQkJLy8gZmluZCB0aGUgZmlyc3QgZGlhZ3JhbSBwYXJ0IHdlIGNhbiBhbGlnbiB0bwotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCWlmIChhbGlnblRvUGFydCA9PSBudWxsKSB7Ci0JCQkJCS8vIHJlbWVtYmVyIGl0IGFuZCBzdG9wCi0JCQkJCWFsaWduVG9QYXJ0ID0gZXA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBsb29wIHRocm91Z2ggdGhlIGVsZW1lbnRzIGFuZCBzZXQgdGhlaXIgbmV3IHBvc2l0aW9uCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gd2UgY2FuIHNraXAgdGhlIGZpcnN0IG9uZSBzaW5jZSB0aGlzIGlzIGFuIGFsaWduLXRvCi0JCQkJaWYgKGVwICE9IGFsaWduVG9QYXJ0KSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCVJlY3RhbmdsZSBhbGlnblRvUGFydEJvdW5kcyA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwkJCQkJCi0JCQkJCURpbWVuc2lvbiBwcyA9IGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldFByZWZlcnJlZFNpemUoKTsJCQkJCQotCQkJCQlpbnQgb2Zmc2V0ID0gIGJvdW5kcy5nZXRDZW50ZXIoKS54IC0gYWxpZ25Ub1BhcnRCb3VuZHMuZ2V0Q2VudGVyKCkueDsKLQkJCQkJLy8gaXMgdGhpcyBpbnNpZGUgYSBjb250YWluZXI/Ci0JCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgYXJlIG1vdmluZyB0aGUKLQkJCQkJCS8vIGNvbnRhaW5lcgotCQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCQlvZmZzZXQgKz0gYm91bmRzLnggLSBwYXJlbnRCb3VuZHMueDsKLQkJCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQkJfQotCQkJCQkvLyBzZW5kIHRoZSBjb21tYW5kIHRvIG1vdmUgdGhlIGVsZW1lbnQKLQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKAotCQkJCQkJCXRyYW5zYWN0aW9uRG9tYWluLCAoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KAotCQkJCQkJCQkJYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgsCi0JCQkJCQkJLTEpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCQluZXcgUG9pbnQoYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkueAotCQkJCQkJCQkJLSBvZmZzZXQsIGJvdW5kcy55KSk7Ci0JCQkJCVBvaW50IHNwID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCWJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0JCQkJCS8vIGNoZWNrIGlmIHRoZSBwYXJ0IGlzIGNvbm5lY3RlZCB2aWEgc291cmNlIGNvbm5lY3Rpb25zCi0JCQkJCUxpc3QgbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAobHAuZ2V0VGFyZ2V0KCkuZXF1YWxzKGVwKSkgewotCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gaWYgbm90IGZvdW5kIGFib3ZlLCBjaGVjayBpZiBpdCBpcyBjb25uZWN0ZWQgdmlhIHRhcmdldCBjb25uZWN0aW9ucwotCQkJCQlpZiAoIWNvbm5lY3RlZCkgewotCQkJCQkJbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCQkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yCi0JCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlQb2ludCBwID0gbmV3IFBvaW50KCk7Ci0JCQkJCXAueCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVmlldykgZXAuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCQkJCXAueSA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVmlldykgZXAuZ2V0TW9kZWwoKSwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCQkJCVBvaW50IHRwID0gcC5nZXRDb3B5KCk7Ci0JCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCWludCBkZWx0YSA9IHNwLnggLSBjZW50ZXJQb2ludC54OwotCQkJCQl0cC54ID0gdHAueCArIGRlbHRhOwotCQkJCQljID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sIChOb2RlKSBlcAotCQkJCQkJCS5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkud2lkdGgsCi0JCQkJCQkJLTEpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8qKgotCSAqIFJldHVybiBoZWlnaHQgb2YgdGV4dCBvZiB0aCBlbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGltZW5zaW9uIGdldFRleHREaW1lbnNpb24oU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgIT0gbnVsbCl7Ci0JCQlGb250IGYgPSBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlpZiAoZCAhPSBudWxsKQotCQkJCXJldHVybiBkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYW55T2JsaXF1ZUxpbmtzKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCwKLQkJCUxpc3QgcmVjZW50bHlBZGRlZENoaWxkcmVuKSB7Ci0JCUxpc3QgY2hpbGRyZW4gPSBkZXAuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gKElHcmFwaGljYWxFZGl0UGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYocGFydCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQpewotCQkJCUxpc3QgZ3JhbmRDaGlsZHJlbiA9ICgoUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydClwYXJ0KS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IyID0gZ3JhbmRDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvcjIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVNoYXBlTm9kZUVkaXRQYXJ0IGNoaWxkID0gKFNoYXBlTm9kZUVkaXRQYXJ0KSBpdGVyYXRvcjIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBUYXNrTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJCQlQb2ludCBwID0gY2hpbGQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlMaXN0IGNvbm5lY3RlZCA9IGNoaWxkLmdldFRhcmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJCQlpZiAoIWNvbm5lY3RlZC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBjb25uZWN0ZWQKLQkJCQkJCQkJCS5nZXQoMCkpLmdldFNvdXJjZSgpOwotCQkJCQkJCVBvaW50IHB0ID0gbGlua2VkUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkJLmdldENlbnRlcigpOwotCQkJCQkJCWlmIChwLnggIT0gcHQueCkgewotCQkJCQkJCQlpZiAoIXJlY2VudGx5QWRkZWRDaGlsZHJlbi5jb250YWlucyhwYXJ0KSkgewotCQkJCQkJCQkJcmVjZW50bHlBZGRlZENoaWxkcmVuLmFkZChwYXJ0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNvbm5lY3RlZCA9IGNoaWxkLmdldFNvdXJjZUNvbm5lY3Rpb25zKCk7Ci0JCQkJCQlpZiAoIWNvbm5lY3RlZC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGxpbmtlZFBhcnQgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgKChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KWNvbm5lY3RlZAotCQkJCQkJCQkJLmdldCgwKSkuZ2V0U291cmNlKCk7Ci0JCQkJCQkJUG9pbnQgcHMgPSBsaW5rZWRQYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpCi0JCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQkJaWYgKHAueCAhPSBwcy54KSB7Ci0JCQkJCQkJCWlmICghcmVjZW50bHlBZGRlZENoaWxkcmVuLmNvbnRhaW5zKHBhcnQpKSB7Ci0JCQkJCQkJCQlyZWNlbnRseUFkZGVkQ2hpbGRyZW4uYWRkKHBhcnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9BY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVhOTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkRpYWdyYW1WaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk1lYXN1cmVtZW50VW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3RmFjdG9yeSBleHRlbmRzIERpYWdyYW1WaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYWdlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZVN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgdmlldywgSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsCi0JCQlTdHJpbmcgZGlhZ3JhbUtpbmQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KHZpZXcsIHNlbWFudGljQWRhcHRlciwgZGlhZ3JhbUtpbmQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVhc3VyZW1lbnRVbml0IGdldE1lYXN1cmVtZW50VW5pdCgpIHsKLQkJcmV0dXJuIE1lYXN1cmVtZW50VW5pdC5QSVhFTF9MSVRFUkFMOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvTGlua05hbWVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk2MDllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS51dGlsLk1lYXN1cmVtZW50VW5pdEhlbHBlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5tYXBtb2RlLklNYXBNb2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua05hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEFic3RyYWN0TGFiZWxWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgVmlldyBjb250YWluZXJWaWV3LAotCQkJU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LCBib29sZWFuIHBlcnNpc3RlZCwKLQkJCVByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlc0hpbnQpIHsKLQkJTm9kZSB2aWV3ID0gKE5vZGUpIHN1cGVyLmNyZWF0ZVZpZXcoc2VtYW50aWNBZGFwdGVyLCBjb250YWluZXJWaWV3LAotCQkJCXNlbWFudGljSGludCwgaW5kZXgsIHBlcnNpc3RlZCwgcHJlZmVyZW5jZXNIaW50KTsKLQkJTG9jYXRpb24gbG9jYXRpb24gPSAoTG9jYXRpb24pIHZpZXcuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwotCQlJTWFwTW9kZSBtYXBNb2RlID0gTWVhc3VyZW1lbnRVbml0SGVscGVyLmdldE1hcE1vZGUoY29udGFpbmVyVmlldwotCQkJCS5nZXREaWFncmFtKCkuZ2V0TWVhc3VyZW1lbnRVbml0KCkpOwotCQlsb2NhdGlvbi5zZXRYKG1hcE1vZGUuRFB0b0xQKDApKTsKLQkJbG9jYXRpb24uc2V0WShtYXBNb2RlLkRQdG9MUCg0MCkpOwotCQlyZXR1cm4gdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDBkNzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlEZWJ1Z09wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbnRlcm5hbC5EaWFncmFtVUlTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5CZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua1ZpZXdGYWN0b3J5IGV4dGVuZHMgQ29ubmVjdGlvblZpZXdGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlzdGF0aWMgewotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fVU5QUk9URUNURUQsIEJvb2xlYW4uVFJVRSk7Ci0JCW9wdGlvbnMucHV0KFRyYW5zYWN0aW9uLk9QVElPTl9OT19OT1RJRklDQVRJT05TLCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fVFJJR0dFUlMsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm91dGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShMaW5rRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3LmZhY3Rvcmllcy5WaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogT3ZlcnJpZGUgY3JlYXRlVmlldyBzaW5jZSB0aGVyZSBpcyBhIGJ1ZyBpbiAKLQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeS5qYXZhCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhmaW5hbCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCWZpbmFsIFZpZXcgY29udGFpbmVyVmlldywgZmluYWwgU3RyaW5nIHNlbWFudGljSGludCwKLQkJCWZpbmFsIGludCBpbmRleCwgZmluYWwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlmaW5hbCBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0KLQkJc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0KLQkJZmluYWwgRWRnZSBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlKCk7Ci0JCUxpc3Qgc3R5bGVzID0gY3JlYXRlU3R5bGVzKGVkZ2UpOwotCQlpZiAoc3R5bGVzLnNpemUoKSA+IDApIHsKLQkJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkQWxsKHN0eWxlcyk7Ci0JCX0KLQotCQlCZW5kcG9pbnRzIGJlbmRQb2ludHMgPSBjcmVhdGVCZW5kcG9pbnRzKCk7Ci0JCWlmIChiZW5kUG9pbnRzICE9IG51bGwpIHsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kUG9pbnRzKTsKLQkJfQotCi0JCUVPYmplY3Qgc2VtYW50aWNFbCA9IHNlbWFudGljQWRhcHRlciA9PSBudWxsID8gbnVsbAotCQkJCTogKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoc2VtYW50aWNFbCA9PSBudWxsKQotCQkJLy8gZW5mb3JjZSBhIHNldCB0byBOVUxMCi0JCQllZGdlLnNldEVsZW1lbnQobnVsbCk7Ci0JCWVsc2UgaWYgKHJlcXVpcmVzRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcpKSB7Ci0JCQllZGdlLnNldEVsZW1lbnQoc2VtYW50aWNFbCk7Ci0JCX0KLQotCQllZGdlLnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQotCQkvLyBkZWNvcmF0ZSB2aWV3IGFzc3VtZXMgdGhlIHZpZXcgaGFkIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgc28gCi0JCS8vIHdlIGhhZCB0byBjYWxsIGluc2VydCBjaGlsZCBiZWZvcmUgY2FsbGluZyBkZWNvcmF0ZSB2aWV3Ci0JCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBpbmRleCwgcGVyc2lzdGVkKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXRFZGl0aW5nRG9tYWluKHNlbWFudGljRWwsCi0JCQkJY29udGFpbmVyVmlldyk7Ci0KLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNVblByb3RlY3RlZFNpbGVudFRyYW5zYWN0aW9uSW5Qcm9ncmVzcyhkb21haW4pKSB7Ci0JCQkJLy8gZGVjb3JhdGUgdmlldyBoYWQgdG8gcnVuIGFzIGEgc2lsZW50IG9wZXJhdGlvbiBvdGhlciB3aXNlCi0JCQkJLy8gaXQgd2lsbCBnZW5lcmF0ZSB0b28gbWFueSBldmVudHMKLQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKAotCQkJCQkJZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLCBvcHRpb25zKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS5jYXRjaGluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlEZWJ1Z09wdGlvbnMuRVhDRVBUSU9OU19DQVRDSElORywKLQkJCQkJCQlnZXRDbGFzcygpLCAiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxvZy53YXJuaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSVN0YXR1c0NvZGVzLklHTk9SRURfRVhDRVBUSU9OX1dBUk5JTkcsCi0JCQkJCQkJImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjUzOWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBCYXNpY05vZGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlTm9kZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjcyODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvUm9sZU5vZGVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZU5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlTm9kZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFJvbGVOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKFJvbGVOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVJvbGVUYXNrQ29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzhkYTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudFZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkxpc3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRHJhd2VyU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5UaXRsZVN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50Vmlld0ZhY3RvcnkgZXh0ZW5kcwotCQlMaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTb3J0aW5nU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXJpbmdTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJc2V0dXBDb21wYXJ0bWVudFRpdGxlKHZpZXcpOwotCQlzZXR1cENvbXBhcnRtZW50Q29sbGFwc2VkKHZpZXcpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cENvbXBhcnRtZW50VGl0bGUoVmlldyB2aWV3KSB7Ci0JCVRpdGxlU3R5bGUgdGl0bGVTdHlsZSA9IChUaXRsZVN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGl0bGVTdHlsZSgpKTsKLQkJaWYgKHRpdGxlU3R5bGUgIT0gbnVsbCkgewotCQkJdGl0bGVTdHlsZS5zZXRTaG93VGl0bGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZChWaWV3IHZpZXcpIHsKLQkJRHJhd2VyU3R5bGUgZHJhd2VyU3R5bGUgPSAoRHJhd2VyU3R5bGUpIHZpZXcKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXREcmF3ZXJTdHlsZSgpKTsKLQkJaWYgKGRyYXdlclN0eWxlICE9IG51bGwpIHsKLQkJCWRyYXdlclN0eWxlLnNldENvbGxhcHNlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1JvbGVUYXNrQ29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZTUwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Sb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLlJvbGVUYXNrQ29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVSb2xlVGFza0NvbXBhcnRtZW50RWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdFNoYXBlVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZVZpZXdGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWxsU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5lU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQkvLyAJCW1vZGlmaWVkIG5vdCB0byBjcmVhdGUgY29tcGFydG1lbnQKLQkJLy8JCWdldFZpZXdTZXJ2aWNlKCkKLQkJLy8JCQkJLmNyZWF0ZU5vZGUoCi0JCS8vCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkvLwkJCQkJCXZpZXcsCi0JCS8vCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJLy8JCQkJCQkJCS5nZXRUeXBlKFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCS8vCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvVGFza05vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0ZDYxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZU5hbWVWaWV3RmFjdG9yeSBleHRlbmRzIEJhc2ljTm9kZVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1Rhc2tOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjZmM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9UYXNrTm9kZVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuVGFza05vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5UYXNrTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tOb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoVGFza05vZGVFZGl0UGFydC5WSVNVQUxfSUQpOwotCQkJdmlldy5zZXRUeXBlKHNlbWFudGljSGludCk7Ci0JCX0KLQkJc3VwZXIuZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIHZpZXcsIHNlbWFudGljQWRhcHRlciwgc2VtYW50aWNIaW50LAotCQkJCWluZGV4LCBwZXJzaXN0ZWQpOwotCQlpZiAoIUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpCi0JCQkJLmNyZWF0ZU5vZGUoCi0JCQkJCQlzZW1hbnRpY0FkYXB0ZXIsCi0JCQkJCQl2aWV3LAotCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCQkJLmdldFR5cGUoVGFza05vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGM3YzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vYWRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3RDb21wb3NpdGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpOyAvLyROT04tTkxTLTEkCi0JCQl2aWV3LmdldEVBbm5vdGF0aW9ucygpLmFkZChzaG9ydGN1dEFubm90YXRpb24pOwotCQl9Ci0JCS8vCQltb2RpZmllZCAtIG5vdCB0byBjcmVhdGUgY29tcGFydG1lbnQKLQkJLy8JCWdldFZpZXdTZXJ2aWNlKCkKLQkJLy8JCQkJLmNyZWF0ZU5vZGUoCi0JCS8vCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkvLwkJCQkJCXZpZXcsCi0JCS8vCQkJCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJLy8JCQkJCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCksCi0JCS8vCQkJCQkJVmlld1V0aWwuQVBQRU5ELCB0cnVlLCBnZXRQcmVmZXJlbmNlc0hpbnQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjYTgwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdENvbXBvc2l0ZVdvcmtQcm9kdWN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5MaXN0Q29tcGFydG1lbnRWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRyYXdlclN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVGl0bGVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudFZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJTGlzdENvbXBhcnRtZW50Vmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU29ydGluZ1N0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsdGVyaW5nU3R5bGUoKSk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlpZiAoc2VtYW50aWNIaW50ID09IG51bGwpIHsKLQkJCXNlbWFudGljSGludCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Q29tcG9zaXRlV29ya1Byb2R1Y3RDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCXNldHVwQ29tcGFydG1lbnRUaXRsZSh2aWV3KTsKLQkJc2V0dXBDb21wYXJ0bWVudENvbGxhcHNlZCh2aWV3KTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBDb21wYXJ0bWVudFRpdGxlKFZpZXcgdmlldykgewotCQlUaXRsZVN0eWxlIHRpdGxlU3R5bGUgPSAoVGl0bGVTdHlsZSkgdmlldwotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlU3R5bGUoKSk7Ci0JCWlmICh0aXRsZVN0eWxlICE9IG51bGwpIHsKLQkJCXRpdGxlU3R5bGUuc2V0U2hvd1RpdGxlKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQ29tcGFydG1lbnRDb2xsYXBzZWQoVmlldyB2aWV3KSB7Ci0JCURyYXdlclN0eWxlIGRyYXdlclN0eWxlID0gKERyYXdlclN0eWxlKSB2aWV3Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHJhd2VyU3R5bGUoKSk7Ci0JCWlmIChkcmF3ZXJTdHlsZSAhPSBudWxsKSB7Ci0JCQlkcmF3ZXJTdHlsZS5zZXRDb2xsYXBzZWQoZmFsc2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YjY4M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5CYXNpY05vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMKLQkJQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9hZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMTNjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2FkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVWaWV3RmFjdG9yeSBleHRlbmRzCi0JCUFic3RyYWN0U2hhcGVWaWV3RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGb250U3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRmlsbFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluZVN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyBjb250YWluZXJWaWV3LCBWaWV3IHZpZXcsCi0JCQlJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwgU3RyaW5nIHNlbWFudGljSGludCwgaW50IGluZGV4LAotCQkJYm9vbGVhbiBwZXJzaXN0ZWQpIHsKLQkJaWYgKHNlbWFudGljSGludCA9PSBudWxsKSB7Ci0JCQlzZW1hbnRpY0hpbnQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkuZ2V0VHlwZShXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCS5lcXVhbHMoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KSkpIHsKLQkJCUVBbm5vdGF0aW9uIHNob3J0Y3V0QW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQlzaG9ydGN1dEFubm90YXRpb24uc2V0U291cmNlKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlzaG9ydGN1dEFubm90YXRpb24uZ2V0RGV0YWlscygpLnB1dCgKLQkJCQkJIm1vZGVsSUQiLCBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKQotCQkJCS5jcmVhdGVOb2RlKAotCQkJCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJdmlldywKLQkJCQkJCURpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWFjNWUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIERpYWdyYW0gQ29yZSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjdjMTM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmIyM2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVtbDIudW1sLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5maWd1cmVzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDA4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L2RlbGV0ZV9kaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViMGE1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2RsY2wxNi9yZWZyZXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmE4OTliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaF9iYXNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZGxjbDE2L3JlZnJlc2hfYmFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NmU4YWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9kbGNsMTYvcmVmcmVzaF9iYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjkyMmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9kZWxldGVfZGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OTIyYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9lbGNsMTYvcmVmcmVzaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjNzE0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2hfYmFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2VsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjkwOTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvaWNvbnMvZWxjbDE2L3JlZnJlc2hfYmFzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2xpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9pY29ucy9saW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThmNDA4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL2ljb25zL2xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjQyMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBDb3JlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotRGVsZXRlRGlhZ3JhbV90ZXh0PURlbGV0ZSBEaWFncmFtCi1yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0PVJlZnJlc2ggZnJvbSBCYXNlIEFjdGl2aXR5Ci1yZWZyZXNoX3RleHQ9UmVmcmVzaAotb3Blbl9hZGRfdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1kZWxldGVfdGV4dD1EZWxldGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzdlN2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uZXN0ZWRDb21tYW5kUHJvdmlkZXJzIj4KLSAgICAgIDxuZXN0ZWRDb21tYW5kUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuTmVzdGVkQ29tbWFuZFByb3ZpZGVyIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRlbGV0ZURpYWdyYW0iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9lbGNsMTYvZGVsZXRlX2RpYWdyYW0uZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVEZWxldGVEaWFncmFtX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRGVsZXRlRGlhZ3JhbV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gCi0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEZyb21CYXNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL2VsY2wxNi9yZWZyZXNoX2Jhc2UuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJXJlZnJlc2hGcm9tQmFzZUFjdGl2aXR5X3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gICAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hBY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L3JlZnJlc2guZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVyZWZyZXNoX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlcmVmcmVzaF90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRlbGV0ZURpYWdyYW1FbGVtZW50QWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklQcmltYXJ5RWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVFbGVtZW50QWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIqIgotICAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZWxjbDE2L2RlbGV0ZS5naWYiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1FbGVtZW50QWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVkZWxldGVfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbklkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWRlbGV0ZV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4YzdkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL0RpYWdyYW1Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29yZVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbUNvcmVQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBEaWFncmFtQ29yZVBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1Db3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCl7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9EaWFncmFtQ29yZVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9EaWFncmFtQ29yZVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlmM2ZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvRGlhZ3JhbUNvcmVSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29yZVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvcmVSZXNvdXJjZXMoKSB7Ci0JfQotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRGlhZ3JhbUNvcmVSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGtleSBhbmQgZm9ybWF0dGVkCi0JICogd2l0aCBhIGdpdmVuIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBBIHJlc291cmNlIGtleS4KLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgQW4gb2JqZWN0LgotCSAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9jYWxpemVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiBOTFMuYmluZChrZXksIG5ldyBPYmplY3RbXSB7IGRhdGEgfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2Zsb3dzX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2Zsb3dzX2NyZWF0ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX2NvbnRyb2xfZmxvd19jcmVhdGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9ub2Rlc19ncm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QYWxldHRlX25vZGVzX3RpdGxlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aW91c19uYW1lX251bGwxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9uYW1lX2VtcHR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vdmVBY3Rpb25fbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1NlbGVjdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9TZWxlY3RfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fQWRkTm9kZV9lcnJfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX0xpbmtfc2VsZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9MaW5rX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1N0YXJ0Tm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9TeW5jQmFyX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0VuZE5vZGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9UYXNrRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2dyZXNzX1NhdmluZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdhcm5pbmdfU2F2aW5nX0RpYWdyYW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1JvbGVEZXNjcmlwdG9yX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0RlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9QaGFzZV90ZXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0dml0aXZpdHlEaWFncmFtX0l0ZXJhdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdHZpdGl2aXR5RGlhZ3JhbV9BY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9yZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9mb3JtYXRUZXh0Qm94QWN0aXZpdHlfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfaEFsaWduQXZlcmFnZUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWJzdHJhY3REaWFncmFtRWRpdG9ycmVmcmVzaGZyb21iYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9vcGVuQWN0aXZpdHlEZXRhaWxEaWFncmFtX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaEFjdGlvbl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNoRnJvbUJhc2VDbWRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9zYXZlRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlRGlhZ3JhbV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZURpYWdyYW1fcHJvbXB0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsaWduX2JlbmRfcG9pbnRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRWRpdG9ySW5wdXRfY29uZmlnZWRpdG9yMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaWFncmFtX25vZGVfcHJvcGVydHlfdmFsdWVfcHJvYmxlbV9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tbWFuZF9jYW5ub3RFZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBYnN0cmFjdERpYWdyYW1FZGl0b3JfUGFyZW50RWRpdG9yQ2xvc2VfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGV0ZUNvbW1hbmRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlTGlua0NvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX01pbGVzdG9uZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9Kb2luX05vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX01lcmdlX05vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9Gb3JrX05vZGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fRm9ya19Ob2RlX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3Rvb2x0aXA7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX05ld19UYXNrX0Rlc2NyaXB0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX05ld19NaWxlc3RvbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV1BERF9OZXdfV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9OZXdfQWN0aXZpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEaWFncmFtX05ld19QaGFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURpYWdyYW1fTmV3X0l0ZXJhdGlvbjsKLQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGlhZ3JhbV9raW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjdGl2aXR5RGV0YWlsX0RpYWdyYW1fa2luZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlcGVuZGVuY3lfRGlhZ3JhbV9raW5kOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI3Y2RjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgQ29tcGxldGUgbmV3IHN0cmluZ3MgbmVlZCB0cmFuc2xhdGlvbi4KLXByZXZpb3VzX25hbWVfbnVsbDE9VW5kbyBvZiBhIG5hbWUgY2hhbmdlIGlzIG5vdCBhbGxvd2VkIGlmIHRoZSBwcmV2aW91cyBuYW1lIGlzIG51bGwuCi1lcnJfbmFtZV9lbXB0eT1UaGUgbmFtZSBjYW5ub3QgYmUgZW1wdHkuIFBsZWFzZSBzcGVjaWZ5IGEgdmFsaWQgbmFtZS4KLW1vdmVBY3Rpb25fbGFiZWw9TW92ZQotCi1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3RleHQ9U2VsZWN0Ci1BYnN0cmFjdERpYWdyYW1fU2VsZWN0X3Rvb2x0aXA9U2VsZWN0IG5vZGUgb3IgbGluawotQWJzdHJhY3REaWFncmFtX0FkZE5vZGVfdGl0bGU9QWRkIE5vZGUKLUFic3RyYWN0RGlhZ3JhbV9BZGROb2RlX2Vycl9tc2c9SVhSRDAwMDJXOiBBZGRpbmcgYSBub2RlIHRvIGRpYWdyYW0gZmFpbGVkCi1BYnN0cmFjdERpYWdyYW1fTGlua190ZXh0PUxpbmsKLUFic3RyYWN0RGlhZ3JhbV9MaW5rX3NlbGVjdD1TZWxlY3QgTGluawotQWJzdHJhY3REaWFncmFtX0xpbmtfdG9vbHRpcD1DcmVhdGUgbmV3IGxpbmsKLUFjdGl2aXR5RGlhZ3JhbV9TdGFydE5vZGVfdGV4dD1TdGFydCBOb2RlCi1BY3Rpdml0eURpYWdyYW1fU3RhcnROb2RlX3Rvb2x0aXA9Q3JlYXRlIGEgU3RhcnQgTm9kZQotQWJzdHJhY3REaWFncmFtX0ZyZWVUZXh0X3RleHQ9RnJlZSBUZXh0Ci1BYnN0cmFjdERpYWdyYW1fRnJlZVRleHRfdG9vbHRpcD1DcmVhdGUgbmV3IGZyZWUgdGV4dAotQWN0aXZpdHlEaWFncmFtX1N5bmNCYXJfdGV4dD1TeW5jaHJvbml6YXRpb24gQmFyCi1BY3Rpdml0eURpYWdyYW1fU3luY0Jhcl90b29sdGlwPUNyZWF0ZSBuZXcgc3luY2hyb25pemF0aW9uIGJhcgotQWN0aXZpdHlEaWFncmFtX0RlY2lzaW9uTm9kZV90ZXh0PURlY2lzaW9uIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9EZWNpc2lvbk5vZGVfdG9vbHRpcD1DcmVhdGUgYSBEZWNpc2lvbiBOb2RlCi1BY3Rpdml0eURpYWdyYW1fRW5kTm9kZV90ZXh0PUVuZCBOb2RlCi1BY3Rpdml0eURldGFpbERpYWdyYW1fcHJlZml4PUFjdGl2aXR5IERldGFpbDoKLUFjdGl2aXR5RGlhZ3JhbV9FbmROb2RlX3Rvb2x0aXA9Q3JlYXRlIGFuIEVuZCBOb2RlCi1BY3Rpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotQWN0aXZpdHlEaWFncmFtX0FjdGl2aXR5X3Rvb2x0aXA9Q3JlYXRlIGFuIEFjdGl2aXR5Ci1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uCi1BY3Rpdml0eURpYWdyYW1fSXRlcmF0aW9uX3Rvb2x0aXA9Q3JlYXRlIGFuIEl0ZXJhdGlvbgotQWN0aXZpdHlEaWFncmFtX1BoYXNlX3RleHQ9UGhhc2UKLUFjdGl2aXR5RGlhZ3JhbV9QaGFzZV90b29sdGlwPUNyZWF0ZSBhIFBoYXNlCi1BYnN0cmFjdERpYWdyYW1fVGFza0Rlc2NyaXB0b3JfdGV4dD1UYXNrIERlc2NyaXB0b3IKLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90ZXh0PVJvbGUgRGVzY3JpcHRvcgotV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbToKLUFic3RyYWN0RGlhZ3JhbV9Sb2xlRGVzY3JpcHRvcl90b29sdGlwPUNyZWF0ZSBhIFJvbGUgRGVzY3JpcHRvcgotQWJzdHJhY3REaWFncmFtX1Rhc2tEZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIGEgVGFzayBEZXNjcmlwdG9yCi1BY3R2aXRpdml0eURpYWdyYW1fRGVsaXZlcnlQcm9jZXNzX3RleHQ9RGVsaXZlcnkgUHJvY2VzcwotQWN0dml0aXZpdHlEaWFncmFtX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1BY3R2aXRpdml0eURpYWdyYW1fUGhhc2VfdGV4PVBoYXNlCi1BY3R2aXRpdml0eURpYWdyYW1fSXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uCi1BY3R2aXRpdml0eURpYWdyYW1fQWN0aXZpdHlfdGV4dD1BY3Rpdml0eQotQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0PVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3Rvb2x0aXA9Q3JlYXRlIGEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IKLQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0PUFsaWduCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dD1SZWZyZXNoIGZyb20gQmFzZSBBY3Rpdml0eQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2Zvcm1hdFRleHRCb3hBY3Rpdml0eV90ZXh0PUZvcm1hdCBUZXh0IEJveC4uLgotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkF2ZXJhZ2VBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gQXZlcmFnZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX2hBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dD1Ib3Jpem9udGFsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl92QWxpZ25BdmVyYWdlQWN0aW9uX3RleHQ9VmVydGljYWxseSB0byBBdmVyYWdlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbl90ZXh0PVZlcnRpY2FsbHkgdG8gRmlyc3QgU2VsZWN0ZWQKLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9TYXZlX3RleHQ9U2F2ZQotQWJzdHJhY3REaWFncmFtRWRpdG9yX1NhdmVfbWVzc2FnZT1TYXZpbmcgezB9Ci1BYnN0cmFjdERpYWdyYW1FZGl0b3JfTW92ZU5vZGVfbGFiZWw9TW92ZSBOb2RlCi1BYnN0cmFjdERpYWdyYW1FZGl0b3JyZWZyZXNoZnJvbWJhc2U9UmVmcmVzaCBGcm9tIEJhc2UKLUFic3RyYWN0RGlhZ3JhbV9CZW5kUG9pbnRfY3JlYXRlPUNyZWF0ZSBCZW5kcG9pbnQKLQotQWN0aXZpdHlEaWFncmFtX29wZW5BY3Rpdml0eURldGFpbERpYWdyYW1fdGV4dD1PcGVuIEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1yZWZyZXNoQWN0aW9uX2xhYmVsPVJlZnJlc2gKLXJlZnJlc2hGcm9tQmFzZUNtZF9sYWJlbD1SZWZyZXNoIEZyb20gQmFzZQotZGlhZ3JhbV9zYXZlRXJyb3I9SVVQRDAwMDFXOiBTYXZpbmcgZGlhZ3JhbSBmYWlsZWQKLQotRGVsZXRlRGlhZ3JhbV90ZXh0PURlbGV0ZSBEaWFncmFtCi1EZWxldGVEaWFncmFtX3Byb21wdD1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xvc2UgYW5kIGRlbGV0ZSB0aGlzIGRpYWdyYW0/XG5UaGlzIGNoYW5nZSBpcyBwZXJtYW5lbnQgYW5kIGNhbm5vdCBiZSB1bmRvbmUuCi1hbGlnbl9iZW5kX3BvaW50X3RleHQ9QWxpZ24gQmVuZCBQb2ludAotQ29uZmlndXJhdGlvbkVkaXRvcklucHV0X2NvbmZpZ2VkaXRvcjA9Q29uZmlndXJhdGlvbiBFZGl0b3IKLWRpYWdyYW1fbm9kZV9wcm9wZXJ0eV92YWx1ZV9wcm9ibGVtX21zZz1FcnJvciBpbiB0aGUgbm9kZSdzIHByb3BlcnR5IHZhbHVlLgotZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotCi1BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JfUmVzZXREaWFncmFtTGF5b3V0X3RleHQ9UmVzZXQgRGlhZ3JhbSBMYXlvdXQKLWVycm9yRGlhbG9nX3RpdGxlPUVycm9yCi1jb21tYW5kX2Nhbm5vdEVkaXQ9SVVQRDAwMDNFOiBDYW5ub3QgZWRpdCBkaWFncmFtCi0KLUFic3RyYWN0RGlhZ3JhbUVkaXRvcl9QYXJlbnRFZGl0b3JDbG9zZV90aXRsZT1QYXJlbnQgRWRpdG9yIENsb3NlZAotQWJzdHJhY3REaWFncmFtRWRpdG9yX1BhcmVudEVkaXRvckNsb3NlX3RleHQ9ezB9IGhhcyBjbG9zZWQuIFdvdWxkIHlvdSBhbHNvIGxpa2UgdG8gY2xvc2UgezF9PwotCi0jQmVsb3cgdGhyZWUgc3RyaW5ncyBtb3ZlZCBmcm9tIEF1dGhvcmluZ1VJIHJlc291cmNlcy5wcm9wZXJ0aWVzLgotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX2Nhbm5vdF9jb25uZWN0X3RleHQ9SVVQQTAwMzJXOiBDYW5ub3QgY29ubmVjdAotRGlhZ3JhbVZhbGlkYXRpb25fZXJyX3NhbWVwcmVkYW5kc3VjX3RleHQ9SVVQQTAwMzNXOiBDYW5ub3QgaGF2ZSB0aGUgc2FtZSBicmVha2Rvd24gZWxlbWVudCBhcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yCi1EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0PUNhbm5vdCBkZWxldGUKLWRlbGV0ZUNvbW1hbmRfbGFiZWw9RGVsZXRlCi1kZWxldGVMaW5rQ29tbWFuZF9sYWJlbD1EZWxldGUgQ29ubmVjdGlvbgotCi1BY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3RleHQ9TWlsZXN0b25lCi1BY3Rpdml0eURpYWdyYW1fTWlsZXN0b25lX3Rvb2x0aXA9Q3JlYXRlIGEgTWlsZXN0b25lCi1BY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3RleHQ9Sm9pbiBOb2RlCi1BY3Rpdml0eURpYWdyYW1fSm9pbl9Ob2RlX3Rvb2x0aXA9Q3JlYXRlIGEgSm9pbiBOb2RlCi1BY3Rpdml0eURpYWdyYW1fTWVyZ2VfTm9kZV90ZXh0PU1lcmdlIE5vZGUKLUFjdGl2aXR5RGlhZ3JhbV9NZXJnZV9Ob2RlX3Rvb2x0aXA9Q3JlYXRlIGEgTWVyZ2UgTm9kZQotQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90ZXh0PUZvcmsgTm9kZQotQWN0aXZpdHlEaWFncmFtX0ZvcmtfTm9kZV90b29sdGlwPUNyZWF0ZSBhIEZvcmsgTm9kZQotQWN0aXZpdHlEaWFncmFtX1BhcnRpdGlvbl9Ob2RlX3RleHQ9QWN0aXZpdHkgUGFydGl0aW9uCi1BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c190aXRsZT1GbG93cwotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfbm9kZXNfdGl0bGVzPU5vZGVzCi1BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9mbG93c19jcmVhdGVfdGV4dD1DcmVhdGlvbiB0b29sIGZvciBmbG93cwotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfbm9kZXNfZ3JvdXBfdGV4dD1DcmVhdGlvbiB0b29sIGdyb3VwIGZvciBub2RlcwotQWN0aXZpdHlEaWFncmFtX1BhbGV0dGVfY29udHJvbF9mbG93X3RleHQ9Q29udHJvbCBGbG93Ci1BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQ9Q3JlYXRlIGEgQ29udHJvbCBGbG93Ci1BY3Rpdml0eURpYWdyYW1fUGFydGl0aW9uX05vZGVfdG9vbHRpcD1DcmVhdGUgYW4gQWN0aXZpdHkgUGFydGl0aW9uCi0KLUFjdGl2aXR5RGlhZ3JhbV9OZXdfVGFza19EZXNjcmlwdG9yPU5ldyBUYXNrIERlc2NyaXB0b3IKLUFjdGl2aXR5RGlhZ3JhbV9OZXdfTWlsZXN0b25lPU5ldyBNaWxlc3RvbmUKLVdQRERfTmV3X1dvcmtQcm9kdWN0RGVzY3JpcHRvcj1OZXcgV29yayBQcm9kdWN0IERlc2NyaXB0b3IKLUFjdGl2aXR5RGlhZ3JhbV9OZXdfQWN0aXZpdHk9TmV3IEFjdGl2aXR5Ci1BY3Rpdml0eURpYWdyYW1fTmV3X1BoYXNlPU5ldyBQaGFzZQotQWN0aXZpdHlEaWFncmFtX05ld19JdGVyYXRpb249TmV3IEl0ZXJhdGlvbgotUHJvZ3Jlc3NfU2F2aW5nX21lc3NhZ2U9U2F2aW5nIHswfQotV2FybmluZ19TYXZpbmdfRGlhZ3JhbT1JVVBEMDAwMVc6IFNhdmluZyBkaWFncmFtIGZhaWxlZAotCi1BY3Rpdml0eURpYWdyYW1fa2luZD1BY3Rpdml0eSBEaWFncmFtCi1BY3Rpdml0eURldGFpbF9EaWFncmFtX2tpbmQ9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLVdvcmtQcm9kdWN0RGVwZW5kZW5jeV9EaWFncmFtX2tpbmQ9V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0FjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ0ZTQ4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkNoYW5nZUJvdW5kc0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuRGlhZ3JhbUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5SZWxhdGl2ZUJlbmRwb2ludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotLyoqCi0gKiBBY3Rpb24gY2xhc3MgdG8gbW92ZSBkaWFncmFtIGVsZW1lbnRzIGluIGRpYWdyYW0gYXJlYSB1c2luZyBrZXlib2FyZCB1cCwgZG93biwgbGVmdCwgcmlnaHQga2V5cy4KLSAqIFVzZWZ1bCBmb3IgQWNjZXNzaWJpbGl0eSwgYW5kIGFsc28gZG9lcyBtb3ZlIGJlbmRwb2ludHMgb2YgY29udHJvbCBmbG93LgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uIGV4dGVuZHMgRGlhZ3JhbUFjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX0xFRlRfQUNUSU9OID0gIm1vdmVfbGVmdF9hY3Rpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfUklHSFRfQUNUSU9OID0gIm1vdmVfcmlnaHRfYWN0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX0RPV05fQUNUSU9OID0gIm1vdmVfZG93bl9hY3Rpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkVfVVBfQUNUSU9OID0gIm1vdmVfdXBfYWN0aW9uIjsKLQkKLQlwcml2YXRlIGludCBkaXJlY3Rpb247Ci0JCi0KLQkvKioKLQkgKiBAcGFyYW0gd29ya2JlbmNoUGFnZQotCSAqLwotCXB1YmxpYyBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbihJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlKSB7Ci0JCXN1cGVyKHdvcmtiZW5jaFBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3b3JrYmVuY2hwYXJ0Ci0JICovCi0JcHVibGljIEFjY2Vzc2liaWxpdHlNb3ZlQWN0aW9uKElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaHBhcnQsIGludCBkaXJlY3Rpb24pIHsKLQkJc3VwZXIod29ya2JlbmNocGFydCk7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5EaWFncmFtQWN0aW9uI2NyZWF0ZVRhcmdldFJlcXVlc3QoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5EaWFncmFtQWN0aW9uI2lzU2VsZWN0aW9uTGlzdGVuZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJc2V0SWQoRGlhZ3JhbUNvbnN0YW50cy5NT1ZFX0FDVElPTik7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREaXJlY3Rpb24oaW50IGRpcmVjdGlvbil7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQlMaXN0IGxpc3QgPSBnZXRTZWxlY3RlZE9iamVjdHMoKTsKLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IG5ldyBDb21wb3NpdGVDb21tYW5kKERpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9Nb3ZlTm9kZV9sYWJlbCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwYXJ0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYocGFydCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQlDb21tYW5kIGMgPSBtb3ZlKGRpcmVjdGlvbiwgKEdyYXBoaWNhbEVkaXRQYXJ0KXBhcnQpOwotCQkJCWlmKGMgIT0gbnVsbCl7Ci0JCQkJCWNjLmNvbXBvc2UobmV3IENvbW1hbmRQcm94eShjKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjYy5pc0VtcHR5KCkgPyBudWxsIDogbmV3IElDb21tYW5kUHJveHkoY2MucmVkdWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgQ29tbWFuZCBtb3ZlKGludCBkaXJlY3Rpb24sIEdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQlPYmplY3QgeCA9IFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpOwotCQkJT2JqZWN0IHkgPSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpKTsKLQkJCVBvaW50IHBvaW50ID0gbmV3IFBvaW50KCgoSW50ZWdlcikgeCkuaW50VmFsdWUoKSwgKChJbnRlZ2VyKSB5KS5pbnRWYWx1ZSgpKTsKLQkJCWludCBuZXd4ID0gcG9pbnQueDsKLQkJCWludCBuZXd5ID0gcG9pbnQueTsKLQkJCWludCBwcmVzc2xlbmd0aCA9IDE7Ci0JCQlzd2l0Y2ggKGRpcmVjdGlvbikgewotCQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUOgotCQkJCW5ld3ggPSBwb2ludC54ICsgcHJlc3NsZW5ndGg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIOgotCQkJCW5ld3kgKz0gcHJlc3NsZW5ndGg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLk5PUlRIOgotCQkJCW5ld3kgLT0gcHJlc3NsZW5ndGg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLldFU1Q6Ci0JCQkJbmV3eCAtPSBwcmVzc2xlbmd0aDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQoCi0JCQkJCWdldEVkaXRpbmdEb21haW4oKSwKLQkJCQkJdmlldywgbmV3IFBvaW50KG5ld3gsIG5ld3kpLCAtMSwgLTEpOwotCi0JCQlyZXR1cm4gYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZCBtb3ZlQmVuZFBvaW50KGludCBkaXJlY3Rpb24sIENvbm5lY3Rpb25FZGl0UGFydCBwYXJ0KXsKLQkJLy8gVE9ETy0gY2hlY2sgYWRkaW5nIG1vcmUgYmVuZHBvaW50LCBjYXB0dXJlIGJlbmRwb2ludAotCQkvLyBpbmRleCBvbiBmbHkKLQkJaWYgKHBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIEVkZ2UpIHsKLQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQlSZWxhdGl2ZUJlbmRwb2ludHMgYlBvaW50cyA9IChSZWxhdGl2ZUJlbmRwb2ludHMpZWRnZS5nZXRCZW5kcG9pbnRzKCk7Ci0JCQlMaXN0IGJsaXN0ID0gYlBvaW50cy5nZXRQb2ludHMoKTsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlpZiAoYmxpc3QgIT0gbnVsbCAmJiBibGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJQWJzb2x1dGVCZW5kcG9pbnQgcG9pbnQgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGJsaXN0Ci0JCQkJCQkuZ2V0KGluZGV4KTsKLQkJCQlpbnQgbmV3eCA9IHBvaW50Lng7Ci0JCQkJaW50IG5ld3kgPSBwb2ludC55OwotCQkJCWludCBwcmVzc2xlbmd0aCA9IDU7Ci0JCQkJc3dpdGNoIChkaXJlY3Rpb24pIHsKLQkJCQljYXNlIDE6Ci0JCQkJCW5ld3ggPSBwb2ludC54ICsgcHJlc3NsZW5ndGg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJbmV3eSArPSBwcmVzc2xlbmd0aDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzOgotCQkJCQluZXd5IC09IHByZXNzbGVuZ3RoOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCW5ld3ggLT0gcHJlc3NsZW5ndGg7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkvL1RPRE86IGltcGxlbWVudCB0aGUgbW92ZWJlbmRwb2ludCBjb21tYW5kLgotLy8JCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBNb3ZlQmVuZHBvaW50Q29tbWFuZCgKLS8vCQkJCQkJbGluaywgbmV3IFBvaW50KG5ld3gsIG5ld3kpLCBpbmRleCk7Ci0vLwkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpewotCQlyZXR1cm4gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZ2V0RGlhZ3JhbVdvcmtiZW5jaFBhcnQoKSkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlzd2l0Y2goZGlyZWN0aW9uKXsKLQkJY2FzZSBQb3NpdGlvbkNvbnN0YW50cy5FQVNUOgotCQkJcmV0dXJuIE1PVkVfUklHSFRfQUNUSU9OOwotCQljYXNlIFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIOgotCQkJcmV0dXJuIE1PVkVfRE9XTl9BQ1RJT047Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuTk9SVEg6Ci0JCQlyZXR1cm4gTU9WRV9VUF9BQ1RJT047Ci0JCWNhc2UgUG9zaXRpb25Db25zdGFudHMuV0VTVDoKLQkJCXJldHVybiBNT1ZFX0xFRlRfQUNUSU9OOwotCQl9Ci0JCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLk1PVkVfQUNUSU9OOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCWlmKFRuZ1V0aWwuaXNMb2NrZWQoZ2V0T3duaW5nUHJvY2VzcygpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KCgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWdldERpYWdyYW1Xb3JrYmVuY2hQYXJ0KCkpLmdldERpYWdyYW0oKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlpZihnZXRTZWxlY3RlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN1cGVyLmlzRW5hYmxlZCgpOwotCX0KLQkKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKCl7Ci0JCUlXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQgPSBnZXREaWFncmFtV29ya2JlbmNoUGFydCgpOwotCQlpZih0YXJnZXRQYXJ0ICE9IG51bGwpewotCQkJRGlhZ3JhbSBkID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0UGFydCkuZ2V0RGlhZ3JhbSgpOwotCQkJRGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkLmdldEVsZW1lbnQoKSk7Ci0JCQlpZihhZGFwdGVyICE9IG51bGwpewotCQkJCXJldHVybiBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWRhcHRlci5nZXRBY3Rpdml0eSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQWN0aW9uRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9BY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDY5OTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9BY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5JRWRpdGluZ0RvbWFpblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQlwcm90ZWN0ZWQgTGlzdDxFZGl0UGFydD4gc2VsZWN0ZWRQYXJ0cyA9IG5ldyBBcnJheUxpc3Q8RWRpdFBhcnQ+KCk7Ci0JcHJvdGVjdGVkIFJlcXVlc3QgdGFyZ2V0UmVxdWVzdDsKLQotCXB1YmxpYyBBY3Rpb25EZWxlZ2F0ZSgpewotCQkKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFjdGlvbkRlbGVnYXRlKElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQl0aGlzLnRhcmdldFBhcnQgPSB0YXJnZXRQYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZXhlY3V0ZShnZXRDb21tYW5kKCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJZHJvcE1lbnVJdGVtcygpOwotCQlzZWxlY3RlZFBhcnRzLmNsZWFyKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID4wCi0JCQkJCSYmIHN0cnVjdHVyZWRTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBFZGl0UGFydCkgewotCQkJCXNlbGVjdGVkUGFydHMuYWRkQWxsKHN0cnVjdHVyZWRTZWxlY3Rpb24udG9MaXN0KCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIGdpdmVzIGFjY2VzcyB0byB0aGUgZGlhZ3JhbSBjb21tYW5kIHN0YWNrCi0JICogCi0JICogQHJldHVybiB0aGUgZGlhZ3JhbSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1Db21tYW5kU3RhY2sgZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpIHsKLQkJT2JqZWN0IHN0YWNrID0gdGFyZ2V0UGFydC5nZXRBZGFwdGVyKENvbW1hbmRTdGFjay5jbGFzcyk7Ci0JCXJldHVybiAoc3RhY2sgaW5zdGFuY2VvZiBEaWFncmFtQ29tbWFuZFN0YWNrKSA/IChEaWFncmFtQ29tbWFuZFN0YWNrKSBzdGFjawotCQkJOiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaFBhcnQgZ2V0V29ya2JlbmNoUGFydCgpIHsKLQkJcmV0dXJuIHRhcmdldFBhcnQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRleHRtZW51cHJvdmlkZXIuCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciBnZXREaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcigpIHsKLQkJaWYodGFyZ2V0UGFydCAhPSBudWxsKXsKLQkJCURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIHRhcmdldFBhcnQKLQkJCQkuZ2V0QWRhcHRlcihHcmFwaGljYWxWaWV3ZXIuY2xhc3MpOwotCQkJRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIgcHJvdmlkZXIgPSAoRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIpIHZpZXdlcgotCQkJCS5nZXRDb250ZXh0TWVudSgpOwotCQkJcmV0dXJuIHByb3ZpZGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4ge0BsaW5rIENvbW1hbmR9LgotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICB0aGUgY29tbWFuZCB0byBleGVjdXRlCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIGR1cmluZyBleGVjdXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCwKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCWlmIChjb21tYW5kID09IG51bGwgfHwgIWNvbW1hbmQuY2FuRXhlY3V0ZSgpKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0RGlhZ3JhbUNvbW1hbmRTdGFjaygpICE9IG51bGwpCi0JCQlnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjb21tYW5kLCBwcm9ncmVzc01vbml0b3IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tbWFuZCBnZXRDb21tYW5kKCk7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZHJvcE1lbnVJdGVtcygpewotCX0KLQkKLQkgLyoqCi0gICAgICogR2V0cyBlZGl0aW5nIGRvbWFpbgotICAgICAqIAotICAgICAqIEByZXR1cm4gbXkgZWRpdGluZyBkb21haW4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLSAgICAgICAgCi0gICAgICAgIC8vIHRyeSBhZGFwdGluZyB0aGUgd29ya2JlbmNoIHBhcnQKLSAgICAgICAgSVdvcmtiZW5jaFBhcnQgcGFydCA9IGdldFdvcmtiZW5jaFBhcnQoKTsKLQotICAgICAgICBpZiAocGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBJRWRpdGluZ0RvbWFpblByb3ZpZGVyIGVkUHJvdmlkZXIgPSAoSUVkaXRpbmdEb21haW5Qcm92aWRlcikgcGFydAotICAgICAgICAgICAgICAgIC5nZXRBZGFwdGVyKElFZGl0aW5nRG9tYWluUHJvdmlkZXIuY2xhc3MpOwotCi0gICAgICAgICAgICBpZiAoZWRQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAJRWRpdGluZ0RvbWFpbiBkb21haW4gPSBlZFByb3ZpZGVyLmdldEVkaXRpbmdEb21haW4oKTsKLSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAlpZiAoZG9tYWluIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIHsKLSAgICAgICAgICAgIAkJcmV0dXJuIChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgZG9tYWluOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogR2V0cyBhIHJlcXVlc3QgdG8gYmUgYWRkcmVzc2VkIHRvIHRoZSBvcGVyYXRpb24gc2V0Ci0JICogCi0JICogQHJldHVybiBhIHRhcmdldCByZXF1ZXN0Ci0JICovCi0JcHJvdGVjdGVkIFJlcXVlc3QgZ2V0VGFyZ2V0UmVxdWVzdCgpIHsKLQkJaWYgKHRhcmdldFJlcXVlc3QgPT0gbnVsbCkKLQkJCXRhcmdldFJlcXVlc3QgPSBjcmVhdGVUYXJnZXRSZXF1ZXN0KCk7Ci0JCXJldHVybiB0YXJnZXRSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFyZ2V0IHJlcXVlc3QKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgdGFyZ2V0IHJlcXVlc3QKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUmVxdWVzdCBjcmVhdGVUYXJnZXRSZXF1ZXN0KCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0NyZWF0ZUVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2ZWM5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvQ3JlYXRlRWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnByZWZlcmVuY2VzLlByZWZlcmVuY2VzSGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVW5zcGVjaWZpZWRUeXBlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCXByaXZhdGUgTGlzdCBlbGVtZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnRUeXBlPigpOwotCXByaXZhdGUgUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VIaW50ID0gbnVsbDsKLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ3JlYXRlRWxlbWVudEFjdGlvbihJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0LCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVJlcXVlc3QgcmVxPSBuZXcgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlUmVxdWVzdChnZXRFbGVtZW50VHlwZXMoKSwgZ2V0UHJlZmVyZW5jZUhpbnQoKSk7Ci0JCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBnZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJaWYoZGlhZ3JhbUVkaXRQYXJ0LmlzRWRpdE1vZGVFbmFibGVkKCkpewotCQkJQ29tbWFuZCBjbWQgPSBnZXREaWFncmFtRWRpdFBhcnQoKS5nZXRDb21tYW5kKHJlcSk7Ci0JCQlpZihjbWQuY2FuRXhlY3V0ZSgpKXsKLQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCWlmKGNtZCBpbnN0YW5jZW9mIElDb21tYW5kUHJveHkpewotCQkJCQlDb21tYW5kUmVzdWx0IHJlc3VsdHMgPSAoKElDb21tYW5kUHJveHkpY21kKS5nZXRJQ29tbWFuZCgpLmdldENvbW1hbmRSZXN1bHQoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJlc3VsdHMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtRWRpdFBhcnQgZ2V0RGlhZ3JhbUVkaXRQYXJ0KCl7Ci0JCWlmKHRhcmdldFBhcnQgIT0gbnVsbCAmJiB0YXJnZXRQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCXJldHVybiAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFbGVtZW50VHlwZXMoKSB7Ci0JCXJldHVybiBlbGVtZW50VHlwZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudFR5cGVzKExpc3QgZWxlbWVudFR5cGVzKSB7Ci0JCXRoaXMuZWxlbWVudFR5cGVzID0gZWxlbWVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZUhpbnQoKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlSGludDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlSGludChQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZUhpbnQpIHsKLQkJdGhpcy5wcmVmZXJlbmNlSGludCA9IHByZWZlcmVuY2VIaW50OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxlZ2F0ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGVnYXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YmNjY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGVnYXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5hY3Rpb24uQWJzdHJhY3RBY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBJQWN0aW9uIHRvIGRlbGVnYXRlIHRvIElPYmplY3RBY3Rpb25EZWxlZ2F0ZS4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRlQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RBY3Rpb25IYW5kbGVyIHsKLQotCXByaXZhdGUgSUFjdGlvbkRlbGVnYXRlIGRlbGVnYXRlOwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgcGFydDsKLQkKLQlwdWJsaWMgRGVsZWdhdGVBY3Rpb24oSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlzdXBlcihwYWdlLmdldEFjdGl2ZVBhcnQoKSk7Ci0JCXRoaXMucGFydCA9IHBhZ2UuZ2V0QWN0aXZlUGFydCgpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZWdhdGVBY3Rpb24oSVdvcmtiZW5jaFBhcnQgcGFydCwgU3RyaW5nIGlkKSB7Ci0JCS8vc3VwZXIodGV4dCk7Ci0JCXN1cGVyKHBhcnQpOwotCQl0aGlzLnBhcnQgPSBwYXJ0OwotCQljcmVhdGVEZWxlZ2F0ZShpZCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJcnVuV2l0aEV2ZW50KG51bGwpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYoZGVsZWdhdGUgIT0gbnVsbCl7Ci0JCQlyZWZyZXNoKCk7Ci0JCQlkZWxlZ2F0ZS5ydW4odGhpcyk7Ci0JCX0KLQkJLy8gUmVzZXQgYWN0aW9uIGFuZCBkZWxlZ2F0ZSBhY3Rpb25zLCBiZWNhdXNlIHNlbGVjdGlvbkNoYW5nZWQgbGlzdGVuZXJzIGRvbid0IG5vdGlmeSBoZXJlLgotCQlpZihkZWxlZ2F0ZSBpbnN0YW5jZW9mIEFjdGlvbkRlbGVnYXRlKXsKLQkJCSgoQWN0aW9uRGVsZWdhdGUpZGVsZWdhdGUpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1J1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcGFydC5nZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYoc2VsZWN0aW9uID09IG51bGwpewotCQkJc2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCQlkZWxlZ2F0ZS5zZWxlY3Rpb25DaGFuZ2VkKHRoaXMsIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlbGVnYXRlKFN0cmluZyBpZCl7Ci0JCWlmKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKSl7Ci0JCQlkZWxlZ2F0ZSA9IG5ldyBEZWxldGVFbGVtZW50QWN0aW9uRGVsZWdhdGUodGhpcyxwYXJ0KTsKLQkJfQotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJlZnJlc2goKTsKLQkJcmV0dXJuICgoQWN0aW9uRGVsZWdhdGUpZGVsZWdhdGUpLmlzRW5hYmxlZCgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVEaWFncmFtQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRGlhZ3JhbUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdmNTY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVEaWFncmFtQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5Ob2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BY3Rpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotCi0vKioKLSAqIERlbGV0ZXMgdGhlIGRpYWdyYW0uCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZURpYWdyYW1BY3Rpb24gZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbUFjdGlvbigpewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbUFjdGlvbihJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlzdXBlcihhY3Rpb24sIHRhcmdldFBhcnQpOwotCX0KLQotCXByaXZhdGUgRWRpdFBhcnQgbXlTZWxlY3RlZEVsZW1lbnQ7Ci0JLy9wcml2YXRlIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQ7Ci0JLyoqCi0JICogCi0JICovCi0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGUjc2V0QWN0aXZlUGFydChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0vLwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotLy8JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0vLwl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoRGlhZ3JhbUNvcmVQbHVnaW4KLQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5EZWxldGVEaWFncmFtX3RleHQsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkRlbGV0ZURpYWdyYW1fcHJvbXB0KSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZihteVNlbGVjdGVkRWxlbWVudCAhPSBudWxsKXsKLQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSlteVNlbGVjdGVkRWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCWlmKGRpYWdyYW0gIT0gbnVsbCl7Ci0JCQkJCXRyeXsKLQkJCQkJCURpYWdyYW1IZWxwZXIuZGVsZXRlRGlhZ3JhbShkaWFncmFtLCB0cnVlKTsKLQkJCQkJCXRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5jbG9zZUVkaXRvcigKLQkJCQkJCQkJdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpLCBmYWxzZSk7Ci0JCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlkcm9wTWVudUl0ZW1zKCk7Ci0JCW15U2VsZWN0ZWRFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlteVNlbGVjdGVkRWxlbWVudCA9IChFZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWlmKG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGwpewotCQkJYWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQkJaWYobXlTZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpewotCQkJCWlmKCEoKERpYWdyYW1FZGl0UGFydClteVNlbGVjdGVkRWxlbWVudCkuaXNFZGl0TW9kZUVuYWJsZWQoKSl7Ci0JCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IGdldERpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyKCkuZmluZChBY3Rpb25JZHMuTUVOVV9FRElUKTsKLQkJCQkJaWYoaXRlbSAhPSBudWxsKSBpdGVtLnNldFZpc2libGUoZmFsc2UpOyAKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKW15U2VsZWN0ZWRFbGVtZW50LmdldE1vZGVsKCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwpewotCQkJCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQlpZihtb2RlbCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlcj0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG1vZGVsKTsKLQkJCQkJaWYoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKXsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBnZXREaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcigpLmZpbmQoQWN0aW9uSWRzLk1FTlVfRURJVCk7Ci0JCQkJCQlpZihpdGVtICE9IG51bGwpIGl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7IAotCQkJCQl9Ci0JCQkJfWVsc2UgaWYobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKXsKLS8vCQkJCQlpZigoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pZGlhZ3JhbSkuaXNSZWFkT25seSgpKXsKLS8vCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX1lbHNlewotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcXVlc3QgY3JlYXRlVGFyZ2V0UmVxdWVzdCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVFbGVtZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDExYTEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EZWxldGVFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuUHJvY2Vzc0RlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5BYnN0cmFjdERlbGV0ZUZyb21BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5Db21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5DYW5vbmljYWxFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogUmVwbGFjZXMgdGhlIGRlZmF1bHQgdGhlIERlbGV0ZSBmcm9tIE1vZGVsIGFuZCBEZWxldGUgZnJvbSBEaWFncmFtIGFjdGlvbnMgb2YgR01GLgotICogRGVsZXRlIHRoZSBkaWFncmFtIGVsZW1lbnQgYW5kIGl0cyBhc3NvY2lhdGVkIGRpYWdyYW0gYW5kIHJlZmVyZW5jZXMuIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpLgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRWxlbWVudEFjdGlvbiBleHRlbmRzIEFic3RyYWN0RGVsZXRlRnJvbUFjdGlvbiB7Ci0KLQlib29sZWFuIHJlbW92ZU1vZGVsID0gdHJ1ZTsKLQkvKiogdGhlIHRhcmdldCByZXF1ZXN0ICovCi0JcHJpdmF0ZSBSZXF1ZXN0IHNlY29uZGFyeVRhcmdldFJlcXVlc3Q7Ci0JLyoqCi0JICogQHBhcmFtIHBhcnQKLQkgKi8KLQlwdWJsaWMgRGVsZXRlRWxlbWVudEFjdGlvbihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXN1cGVyKHBhcnQpOwotCQkKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FsY3VsYXRlRW5hYmxlZCgpIHsKLQkJCi0JCUxpc3Qgb3BlcmF0aW9uU2V0ID0gZ2V0T3BlcmF0aW9uU2V0KCk7Ci0JCWlmIChvcGVyYXRpb25TZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmICgoZWxlbWVudC5lSXNQcm94eSgpKQotCQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCXx8IEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJaWYgKGN1ckNvbW1hbmQgPT0gbnVsbCB8fCAoY3VyQ29tbWFuZC5jYW5FeGVjdXRlKCkgPT0gZmFsc2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy9yZXR1cm4gc3VwZXIuY2FsY3VsYXRlRW5hYmxlZCgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlzZXRFbmFibGVkKHRydWUpOwotCQlMaXN0IGxpc3QgPSBnZXRTZWxlY3RlZE9iamVjdHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJVmlldyB2aWV3ID0gKFZpZXcpZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJaWYoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodmlldykpewotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNFbmFibGVkKCk7Ci0JfQotCQotCQotCQotCXByb3RlY3RlZCBSZXF1ZXN0IGNyZWF0ZVRhcmdldFJlcXVlc3QoKSB7Ci0JCXJldHVybiAJbmV3IEVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50UmVxdWVzdChnZXRFZGl0aW5nRG9tYWluKCksIGZhbHNlKSk7Ci0JfQotCQotCSAvKioKLSAgICAgKiBHZXRzIGVkaXRpbmcgZG9tYWluCi0gICAgICogCi0gICAgICogQHJldHVybiBteSBlZGl0aW5nIGRvbWFpbgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotICAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFkYXB0aW5nIHRoZSB3b3JrYmVuY2ggcGFydAotICAgICAgICBJV29ya2JlbmNoUGFydCBwYXJ0ID0gZ2V0V29ya2JlbmNoUGFydCgpOwotCi0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgZWRQcm92aWRlciA9IChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBwYXJ0Ci0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSUVkaXRpbmdEb21haW5Qcm92aWRlci5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChlZFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGVkUHJvdmlkZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgewotICAgICAgICAgICAgCQlyZXR1cm4gKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBkb21haW47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVxdWVzdCBnZXRUYXJnZXRSZXF1ZXN0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5nZXRUYXJnZXRSZXF1ZXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHNob3dJbkNvbnRleHRNZW51KCl7Ci0JCUxpc3Qgb3BlcmF0aW9uU2V0ID0gZ2V0T3BlcmF0aW9uU2V0KCk7Ci0JCWlmIChvcGVyYXRpb25TZXQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCQlJdGVyYXRvciBlZGl0UGFydHMgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmICgoZWxlbWVudC5lSXNQcm94eSgpKQotCQkJCQl8fCAoZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJaWYgKGN1ckNvbW1hbmQgPT0gbnVsbCB8fCAoY3VyQ29tbWFuZC5jYW5FeGVjdXRlKCkgPT0gZmFsc2UpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCS8vcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCUxpc3Qgb3BlcmF0aW9uU2V0ID0gZ2V0T3BlcmF0aW9uU2V0KCk7Ci0JCUl0ZXJhdG9yIGVkaXRQYXJ0cyA9IG9wZXJhdGlvblNldC5pdGVyYXRvcigpOwotCQlDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0KLQkJCW5ldyBDb21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZChnZXRFZGl0aW5nRG9tYWluKCksIGdldENvbW1hbmRMYWJlbCgpKTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KXsKLQkJCQlJR3JhcGhpY2FsRWRpdFBhcnQgZ0VkaXRQYXJ0ID0gCi0JCQkJCShJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KWdFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCUVPYmplY3QgZWxlbWVudCA9IFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQodmlldyk7Ci0JCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIERpYWdyYW0pCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJQ29tbWFuZCBjdXJDb21tYW5kID0gbnVsbDsKLQkJCWlmKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0ICYmIGlzQ2Fub25pY2FsKChJR3JhcGhpY2FsRWRpdFBhcnQpZWRpdFBhcnQpKXsKLQkJCQljdXJDb21tYW5kID0gZWRpdFBhcnQuZ2V0Q29tbWFuZChyZXF1ZXN0KTsKLQkJCX1lbHNlewotCQkJCWN1ckNvbW1hbmQgPSBlZGl0UGFydC5nZXRDb21tYW5kKGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKSk7Ci0JCQl9Ci0JCQlpZiAoY3VyQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJY29tbWFuZC5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoY3VyQ29tbWFuZCkpOwkJCQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKChjb21tYW5kLmlzRW1wdHkoKSkKLQkJCXx8IChjb21tYW5kLnNpemUoKSAhPSBvcGVyYXRpb25TZXQuc2l6ZSgpKSl7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IElDb21tYW5kUHJveHkoY29tbWFuZCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlMaXN0IG9wZXJhdGlvblNldCA9IGdldE9wZXJhdGlvblNldCgpOwotCQlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxCcmVha2Rvd25FbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcGVyYXRpb25TZXQuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWRpdFBhcnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJT2JqZWN0IG9iaiA9ICgoRWRpdFBhcnQpIGVkaXRQYXJ0KS5nZXRNb2RlbCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChOb2RlKW9iaik7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWVsZW1lbnRzLmFkZCgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJUHJvY2Vzc0RlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgUHJvY2Vzc0RlbGV0ZUFjdGlvbigpIHsKLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuYWN0aW9ucy5NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZUNvbW1hbmQoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JCQkJICovCi0JCQkJcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNyZWF0ZUNvbW1hbmQoCi0JCQkJCQlDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCQlkb21haW4gPSBudWxsOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGRvbWFpbiA9PSBudWxsKSB7Ci0JCQkJCQlkb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoc2VsZWN0aW9uKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlkZWxldGVBY3Rpb24udXBkYXRlU2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQllbGVtZW50cykpOwotCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJaWYgKGRlbGV0ZUFjdGlvbi5pc0RlbGV0aW9uQ29uZmlybWVkKCkpIHsKLQkJCQlzdXBlci5kb1J1bihwcm9ncmVzc01vbml0b3IpOwotCi0JCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJLy8gCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0V29ya2JlbmNoUGFydCgpLmdldFNpdGUoKS5nZXRTaGVsbCgpCi0JCQkJCQkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpZ2V0V29ya2JlbmNoUGFydCgpKS5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJc3VwZXIuZG9SdW4ocHJvZ3Jlc3NNb25pdG9yKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JCXNldElkKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQlzZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLmRlbGV0ZUNvbW1hbmRfbGFiZWwpOwotCQlzZXRUb29sVGlwVGV4dChEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKTsKLQkJSVNoYXJlZEltYWdlcyB3b3JrYmVuY2hJbWFnZXMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpOwotCQlzZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCXdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEUpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJd29ya2JlbmNoSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCXdvcmtiZW5jaEltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlT3BlcmF0aW9uU2V0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5jcmVhdGVPcGVyYXRpb25TZXQoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGdlcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDYW5vbmljYWwoSUdyYXBoaWNhbEVkaXRQYXJ0IGdlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBnZXAuZ2V0UGFyZW50KCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCUNhbm9uaWNhbEVkaXRQb2xpY3kgY2VwID0gKENhbm9uaWNhbEVkaXRQb2xpY3kpcGFyZW50LmdldEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFKTsKLQkJCWlmICggY2VwICE9IG51bGwgKSB7Ci0JCQkJaWYgKGNlcC5pc0VuYWJsZWQoKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgUmVxdWVzdCBnZXRTZWNvbmRhcnlUYXJnZXRSZXF1ZXN0KCl7Ci0JCWlmKHNlY29uZGFyeVRhcmdldFJlcXVlc3QgPT0gbnVsbCl7Ci0JCQlzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0ID0gbmV3IEdyb3VwUmVxdWVzdCgKLQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfREVMRVRFKTsKLQkJfQotCQlyZXR1cm4gc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZTg0NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9hY3Rpb25zL0RlbGV0ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVEaWFncmFtQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5Qcm9jZXNzRGVsZXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkdyb3VwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLkNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmNvbW1hbmRzLklDb21tYW5kUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLQotLyoqCi0gKiBSZXBsYWNlcyB0aGUgZGVmYXVsdCB0aGUgRGVsZXRlIGZyb20gTW9kZWwgYW5kIERlbGV0ZSBmcm9tIERpYWdyYW0gYWN0aW9ucyBvZiBHTUYuCi0gKiBEZWxldGUgdGhlIGRpYWdyYW0gZWxlbWVudCBhbmQgaXRzIGFzc29jaWF0ZWQgZGlhZ3JhbSBhbmQgcmVmZXJlbmNlcy4gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVFbGVtZW50QWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwdWJsaWMgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgRGVsZXRlRWxlbWVudEFjdGlvbkRlbGVnYXRlKElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXN1cGVyKGFjdGlvbiwgdGFyZ2V0UGFydCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb21tYW5kKCkgewotCQl0YXJnZXRSZXF1ZXN0ID0gbnVsbDsKLQkJUmVxdWVzdCByZXF1ZXN0ID0gZ2V0VGFyZ2V0UmVxdWVzdCgpOwotCQlJdGVyYXRvcjxFZGl0UGFydD4gZWRpdFBhcnRzID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOwotCQkKLQkJTGlzdDxBY3Rpdml0eT4gYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KCk7Ci0JCQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHRhcmdldFByb2Nlc3MgPSBnZXRPd25pbmdQcm9jZXNzKCk7Ci0JCQotCQkvLyBEZWxldGUgdGhlIGRpYWdyYW0gZWxlbWVudCBhbmQgZGlhZ3JhbSBtb2RlbC4KLQkJQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9Ci0JCQluZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZ2V0RWRpdGluZ0RvbWFpbigpLCBEaWFncmFtQ29yZVJlc291cmNlcy5kZWxldGVDb21tYW5kX2xhYmVsKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJCQlJdGVyYXRvcjxFZGl0UGFydD4gZWRpdFBhcnRzID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChlZGl0UGFydHMuaGFzTmV4dCgpKSB7Ci0JCQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJCQkvLyBkaXNhYmxlIG9uIGRpYWdyYW0gbGlua3MgCi0JCQkJCWlmIChlZGl0UGFydCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCQkJVmlldyB2aWV3ID0gKFZpZXcpIGdFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQkJRU9iamVjdCBlbGVtZW50ID0gVmlld1V0aWwucmVzb2x2ZVNlbWFudGljRWxlbWVudCh2aWV3KTsKLQkJCQkJCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSB8fCBlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkKLQkJCQkJCQljb250aW51ZTsKLQotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQodmlldyk7Ci0JCQkJCQlpZiAoZSAhPSBudWxsICYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJd2hpbGUgKGVkaXRQYXJ0cy5oYXNOZXh0KCkpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMubmV4dCgpOwotCQkJLy8gZGlzYWJsZSBvbiBkaWFncmFtIGxpbmtzIAotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IGdFZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0OwotCQkJCVZpZXcgdmlldyA9IChWaWV3KSBnRWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSBWaWV3VXRpbC5yZXNvbHZlU2VtYW50aWNFbGVtZW50KHZpZXcpOwotCQkJCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSB8fCBlbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2aWV3KTsKLQkJCQlpZiAoZSAhPSBudWxsICYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlhY3Rpdml0aWVzLmFkZCgoQWN0aXZpdHkpIGUpOwotCQkJCX0KLQotCQkJCUNvbW1hbmQgY3VyQ29tbWFuZCA9IG51bGw7Ci0JCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0Ci0JCQkJCQkmJiBpc0Nhbm9uaWNhbCgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydCkpIHsKLQkJCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0LmdldENvbW1hbmQocmVxdWVzdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0Ci0JCQkJCQkJLmdldENvbW1hbmQoZ2V0U2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCgpKTsKLQkJCQl9Ci0JCQkJaWYoY3VyQ29tbWFuZCA9PSBudWxsICYmIGlzRGlhZ3JhbVVJT2JqZWN0KHZpZXcpKXsKLQkJCQkJY3VyQ29tbWFuZCA9IGVkaXRQYXJ0Ci0JCQkJCS5nZXRDb21tYW5kKGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKSk7Ci0JCQkJfQotCQkJCWlmIChjdXJDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJY29tbWFuZC5jb21wb3NlKG5ldyBDb21tYW5kUHJveHkoY3VyQ29tbWFuZCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoKGNvbW1hbmQuaXNFbXB0eSgpKQotCQkJfHwgKGNvbW1hbmQuc2l6ZSgpICE9IHNlbGVjdGVkUGFydHMuc2l6ZSgpKSl7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQkvLyBEZWxldGUgdGhlIHJlbGF0ZWQgZGlhZ3JhbSBvZiBkZWxldGVkIEFjdGl2aXR5Ci0JCWlmKCFhY3Rpdml0aWVzLmlzRW1wdHkoKSl7Ci0JCQluZXcgRGVsZXRlRGlhZ3JhbUNvbW1hbmQoYWN0aXZpdGllcywgdGFyZ2V0UHJvY2VzcykuZXhlY3V0ZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgSUNvbW1hbmRQcm94eShjb21tYW5kKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaWFncmFtVUlPYmplY3QoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKSA9PSBudWxsOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVxdWVzdCBjcmVhdGVUYXJnZXRSZXF1ZXN0KCkgewotCQlyZXR1cm4gCW5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKG5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZ2V0RWRpdGluZ0RvbWFpbigpLCBmYWxzZSkpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRFbmFibGVkKHRydWUpOwotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkaXRQYXJ0IGVsZW1lbnQgPSAoRWRpdFBhcnQpIGl0ZXIubmV4dCgpOwotCQkJVmlldyB2aWV3ID0gKFZpZXcpZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJaWYodmlldy5nZXRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgdmlldyBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBtb2RlbAotCQkJCS8vIGl0IGNhbiBiZSBkZWxldGVkCi0JCQkJLy8KLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmKHZpZXcgaW5zdGFuY2VvZiBEaWFncmFtIAotCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh2aWV3KQotCQkJCQl8fCBUbmdVdGlsLmlzTG9ja2VkKGdldE93bmluZ1Byb2Nlc3MoKSkKLQkJCQkJfHwgKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0ICYmIAotCQkJCQkJCXZpZXcuZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQkJfHwgKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHZpZXcpICE9IG51bGwgJiYKLQkJCQkJCQlCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQodmlldykpCi0JCQkJCQkJKSB7Ci0JCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYodmlldyBpbnN0YW5jZW9mIEVkZ2UpewotCQkJCWlmKERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jaGVja0RlbGV0ZSgoRWRnZSl2aWV3KSAhPSBudWxsKXsKLQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZighaXNFbmFibGVkKCkpIHJldHVybjsKLQkJTGlzdDxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRQYXJ0cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlZGl0UGFydCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVkaXRQYXJ0IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlPYmplY3Qgb2JqID0gKChFZGl0UGFydCkgZWRpdFBhcnQpLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKE5vZGUpb2JqKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJZWxlbWVudHMuYWRkKChCcmVha2Rvd25FbGVtZW50KWVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9jZXNzRGVsZXRlQWN0aW9uIGRlbGV0ZUFjdGlvbiA9IG5ldyBQcm9jZXNzRGVsZXRlQWN0aW9uKCkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJCQkgKi8KLQkJCQlwdWJsaWMgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY3JlYXRlQ29tbWFuZCgKLQkJCQkJCUNvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCWRvbWFpbiA9IG51bGw7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZG9tYWluID09IG51bGwpIHsKLQkJCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pOwotCQkJCX0KLQotCQkJfTsKLQkJCWRlbGV0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCWVsZW1lbnRzKSk7Ci0JCQlkZWxldGVBY3Rpb24ucnVuKCk7Ci0JCQlpZiAoZGVsZXRlQWN0aW9uLmlzRGVsZXRpb25Db25maXJtZWQoKSkgewotCQkJCXN1cGVyLnJ1bihhY3Rpb24pOwotCi0JCQkJLy8gc2F2ZSB0aGUgZWRpdG9yCi0JCQkJLy8gCi0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUodGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKQotCQkJCQkJLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldFBhcnQpLmRvU2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJCWlmKGdldERpYWdyYW1Db21tYW5kU3RhY2soKSAhPSBudWxsKXsKLQkJCQkJCQlnZXREaWFncmFtQ29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQlzdXBlci5ydW4oYWN0aW9uKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZ2VwCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0Nhbm9uaWNhbChJR3JhcGhpY2FsRWRpdFBhcnQgZ2VwKSB7Ci0JCUVkaXRQYXJ0IHBhcmVudCA9IGdlcC5nZXRQYXJlbnQoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElHcmFwaGljYWxFZGl0UGFydCkgewotCQkJQ2Fub25pY2FsRWRpdFBvbGljeSBjZXAgPSAoQ2Fub25pY2FsRWRpdFBvbGljeSlwYXJlbnQuZ2V0RWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUpOwotCQkJaWYgKCBjZXAgIT0gbnVsbCApIHsKLQkJCQlpZiAoY2VwLmlzRW5hYmxlZCgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBSZXF1ZXN0IGdldFNlY29uZGFyeVRhcmdldFJlcXVlc3QoKXsKLQkJaWYoc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdCA9PSBudWxsKXsKLQkJCXNlY29uZGFyeVRhcmdldFJlcXVlc3QgPSBuZXcgR3JvdXBSZXF1ZXN0KAotCQkJCQlSZXF1ZXN0Q29uc3RhbnRzLlJFUV9ERUxFVEUpOwotCQl9Ci0JCXJldHVybiBzZWNvbmRhcnlUYXJnZXRSZXF1ZXN0OwotCX0KLQlwcml2YXRlIFJlcXVlc3Qgc2Vjb25kYXJ5VGFyZ2V0UmVxdWVzdDsKLQkKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKCl7Ci0JCWlmKHRhcmdldFBhcnQgIT0gbnVsbCl7Ci0JCQlEaWFncmFtIGQgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0KS5nZXREaWFncmFtKCk7Ci0JCQlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGQuZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCl7Ci0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhZGFwdGVyLmdldEFjdGl2aXR5KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EaWFncmFtQWN0aW9uc1NlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9EaWFncmFtQWN0aW9uc1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiZjcwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHMuQ2hhbmdlQm91bmRzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLlJlY29ubmVjdExpbmtDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkRlZmF1bHRFZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLlNoYXBlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotCi0vKioKLSAqIFNlcnZpY2UgY2xhc3MgdG8gYWxsb3cgY3JlYXRlIGFuZCByZWdpc3RlciBjb21tb24gYWN0aW9ucyB0byB0aGUgYWN0aW9uCi0gKiByZWdpc3Rlci4gQ29kZSBpcyBtaWdyYXRlIGZyb20gb2xkIG1ldGhvZCBvZiBkaWFncmFtbWluZy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQWN0aW9uc1NlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxJR05fSE9SWl9BVkVSQUdFID0gImFsaWduX2hvcml6b250YWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX0hPUlpfRklSU1RfU0VMRUNURUQgPSAiYWxpZ25faG9yaXpvbnRhbF90b19maXJzdF9zZWxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTElHTl9WRVJUX0FWRVJBR0UgPSAiYWxpZ25fdmVydGljYWxfdG9fYXZlcmFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQgPSAiYWxpZ25fdmVydGljYWxfdG9fZmlyc3Rfc2VsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluOwotCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyOwotCi0JcHJpdmF0ZSBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeTsKLQkKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdHJhbnNhY3Rpb25Eb21haW47Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKiBAcGFyYW0gZ3JhcGhpY2FsVmlld2VyIHtAbGluayBHcmFwaGljYWxWaWV3ZXJ9Ci0JICogQHBhcmFtIGVkaXREb21haW4gCXtAbGluayBEZWZhdWx0RWRpdERvbWFpbn0KLQkgKiBAcGFyYW0gYWN0aW9uUmVnaXN0cnkgCXtAbGluayBBY3Rpb25SZWdpc3RyeX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdHJhbnNhY3Rpb25Eb21haW4sIEdyYXBoaWNhbFZpZXdlciBncmFwaGljYWxWaWV3ZXIsCi0JCQlEZWZhdWx0RWRpdERvbWFpbiBlZGl0RG9tYWluLCBBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSkgewotCQl0aGlzLnRyYW5zYWN0aW9uRG9tYWluID0gdHJhbnNhY3Rpb25Eb21haW47Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCQl0aGlzLmVkaXREb21haW4gPSBlZGl0RG9tYWluOwotCQl0aGlzLmFjdGlvblJlZ2lzdHJ5ID0gYWN0aW9uUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgR3JhcGhpY2FsVmlld2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbFZpZXdlcihHcmFwaGljYWxWaWV3ZXIgZ3JhcGhpY2FsVmlld2VyKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgR3JhcGhpY2FsVmlld2VyCi0JICovCi0JcHJpdmF0ZSBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHJldHVybiB0aGUgY29tbWFuZCBzdGFjawotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZ2V0RWRpdERvbWFpbigpLmdldENvbW1hbmRTdGFjaygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXQgZG9tYWluLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXQgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFZGl0RG9tYWluIGdldEVkaXREb21haW4oKSB7Ci0JCXJldHVybiBlZGl0RG9tYWluOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpb25SZWdpc3RyeSBnZXRBY3Rpb25SZWdpc3RyeSgpIHsKLQkJcmV0dXJuIGFjdGlvblJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkF2ZXJhZ2VBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWlnbkF2ZXJhZ2UgQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdG8gaG9yaXpvbnRhbCBhdmVyYWdlLiAgCi0JICovCi0JcHVibGljIElBY3Rpb24gcmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiBob3Jpem9udGFsbHkgdG8gYXZlcmFnZSB5LXZhbHVlIG9mIGFsbCBub2RlcwotCQlJQWN0aW9uIGhBbGlnbkF2ZXJhZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25BdmVyYWdlQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcml6QWxpZ25Ub0F2ZXJhZ2VTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0FWRVJBR0U7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oaEFsaWduQXZlcmFnZUFjdGlvbik7Ci0KLQkJcmV0dXJuIGhBbGlnbkF2ZXJhZ2VBY3Rpb247Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVyIEhvcml6b250YWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiBIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgd2l0aCAKLQkgKiByZXNwZWN0IHRvIGZpcnN0IHNlbGVjdGVkIGVkaXRwYXJ0LiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVySG9yaXpvbnRhbEFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbigpIHsKLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5IHRvIHktdmFsdWUgb2YgZmlyc3Qgc2VsZWN0ZWQgbm9kZQotCQlJQWN0aW9uIGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gPSBuZXcgQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcl9oQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWhvcnpBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGhBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiBoQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciB2ZXJ0aWFsQWxpZ25BdmVyYWdlQWN0aW9uIGFjdGlvbi4gCi0JICogdmVydGlhbEFsaWduQXZlcmFnZUFjdGlvbiBhbGlnbnMgc2VsZWN0ZWQgZWRpdHBhcnRzIHZlcnRpY2FsbHkgdy5yLnQgYXZlcmFnZS4KLQkgKiAKLQkgKi8KLQkKLQlwdWJsaWMgSUFjdGlvbiByZWdpc3RlclZlcnRpY2FsQWxpZ25BdmVyYWdlQWN0aW9uKCkgewotCQkvLyBhbGlnbiB2ZXJ0aWNhbGx5IHRvIGF2ZXJhZ2UgeC12YWx1ZSBvZiBhbGwgc2VsZWN0ZWQgbm9kZXMKLQkJSUFjdGlvbiB2QWxpZ25BdmVyYWdlQWN0aW9uID0gbmV3IEFjdGlvbigKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1FZGl0b3JfdkFsaWduQXZlcmFnZUFjdGlvbl90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gQUxJR05fVkVSVF9BVkVSQUdFOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkF2ZXJhZ2VBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25BdmVyYWdlQWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVyIHZlcnRpYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24gYWN0aW9uLiAKLQkgKiB2ZXJ0aWFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uIGFsaWducyBzZWxlY3RlZCBlZGl0cGFydHMgdmVydGljYWxseSB3LnIudCBmaXJzdCBzZWxlY3RlZC4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBJQWN0aW9uIHJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKSB7Ci0JCS8vIGFsaWduIHZlcnRpY2FsbHkgdG8geC12YWx1ZSBvZiBmaXJzdCBzZWxlY3RlZCBub2RlCi0JCUlBY3Rpb24gdkFsaWduRmlyc3RTZWxlY3RlZEFjdGlvbiA9IG5ldyBBY3Rpb24oCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX3ZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb25fdGV4dCkgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdmVydGljYWxBbGlnblRvRmlyc3RTZWxlY3RlZCgpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCXJldHVybiBBTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEOwotCQkJfQotCQl9OwotCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKHZBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24pOwotCi0JCXJldHVybiB2QWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uOwotCX0KLQotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkvLyBhY3Rpb24gbWV0aG9kcwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduRmlyc3RlU0VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaG9yekFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCBzZWxlY3RlZCBpdGVtcywgcmVtZW1iZXIgdGhlIHktdmFsdWUgb2YgdGhlCi0JCS8vIGZpcnN0IG5vZGUsCi0JCS8vIHNldCB0aGUgZm9sbG93aW5nIG5vZGVzIHRvIHRoZSBzYW1lIHktdmFsdWUKLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyByZW1lbWJlciB0aGUgZmlyc3QgcGFydCB3ZSBtb3ZlCi0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGZvciBjZW50ZXJsaW5lIGFsaWdubWVudAotCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy5oZWlnaHQgLSBmaXJzdFBhcnQKLQkJCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJCS8vIGlzIHRoaXMgbm9kZSBpbiBhIGNvbnRhaW5lcj8KLQkJCQkJaWYgKCEoZXAuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKSB7Ci0JCQkJCQkvLyBuZWVkIHRvIG1vdmUgdGhlIGNvbnRhaW5lciwgYWRqdXN0IHRoZSBvZmZzZXQKLQkJCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy55IC0gcGFyZW50Qm91bmRzLnk7Ci0JCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJCX0KLQkJCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBub2RlCi0JCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGJvdW5kcy54LCBmaXJzdFBhcnQKLQkJCQkJCQkJCS5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55Ci0JCQkJCQkJCQktIG9mZnNldCksIGJvdW5kcy53aWR0aCwgLTEpOwotCQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKiogCi0JICogQWN0aW9uIGltcGxlbWVudGF0aW9uIG1ldGhvZCBmb3IgaG9yaXpvbnRhbEFsaWduQXZlcmFnZUFjdGlvbi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBob3JpekFsaWduVG9BdmVyYWdlU2VsZWN0ZWQoKSB7Ci0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBmaXJzdFBhcnQgPSBudWxsOwotCQlpbnQgdG90YWwgPSAwOwotCQlpbnQgeXN1bSA9IDA7Ci0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gcmVtZW1iZXIgdGhlIGZpcnN0IHBhcnQgd2UgbW92ZQotCQkJCWlmIChmaXJzdFBhcnQgPT0gbnVsbCkgewotCQkJCQlmaXJzdFBhcnQgPSBlcDsKLQkJCQl9Ci0JCQkJeXN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS55OwotCQkJCXRvdGFsKys7Ci0JCQl9Ci0JCX0KLQkJLy8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHktdmFsdWUgZm9yIGFsbCBub2RlcwotCQlpbnQgeWF2ZSA9IChpbnQpICgoZG91YmxlKSB5c3VtIC8gKGRvdWJsZSkgdG90YWwpOwotCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBub2RlcyBhZ2FpbiBhbmQgc2V0IHRoZW0KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQkvLyBjYWxjdWxhdGUgdGhlIGhlaWdodCBkaWZmZXJlbmNlLCBzbyB0aGF0IGVsZW1lbnRzIGFyZSBhbGlnbmVkCi0JCQkJLy8gdGhyb3VnaCB0aGUgY2VudGVybGluZQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQlpbnQgb2Zmc2V0ID0gKGludCkgKChkb3VibGUpIChib3VuZHMuaGVpZ2h0IC0gZmlyc3RQYXJ0Ci0JCQkJCQkuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuaGVpZ2h0KSAvIDIuMCk7Ci0JCQkJLy8gaXMgdGhpcyBub2RlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gd2UgbmVlZCB0byBtb3ZlIHRoZSBjb250YWluZXIsIGFkanVzdCB0aGUgb2Zmc2V0Ci0JCQkJCWVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVwLmdldFBhcmVudCgpOwotCQkJCQlSZWN0YW5nbGUgcGFyZW50Qm91bmRzID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCk7Ci0JCQkJCW9mZnNldCArPSBib3VuZHMueSAtIHBhcmVudEJvdW5kcy55OwotCQkJCQlib3VuZHMgPSBwYXJlbnRCb3VuZHM7Ci0JCQkJfQotCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLAotCQkJCQkJbmV3IFBvaW50KGJvdW5kcy54LCB5YXZlIC0gb2Zmc2V0KSwgYm91bmRzLndpZHRoLCAtMSk7Ci0JCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCX0KLQkJfQotCi0JfQotCS8qKiAKLQkgKiBBY3Rpb24gaW1wbGVtZW50YXRpb24gbWV0aG9kIGZvciB2ZXJ0aWNhbEFsaWduVG9BdmVyYWdlQWN0aW9uLgotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgdmVydGljYWxBbGlnblRvQXZlcmFnZVNlbGVjdGVkKCkgewotCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZmlyc3RQYXJ0ID0gbnVsbDsKLQkJaW50IHRvdGFsID0gMDsKLQkJaW50IHhzdW0gPSAwOwotCQkvLyBsb29wIHRocm91Z2ggdGhlIHNlbGVjdGVkIHBhcnRzCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQkvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG5vZGVzIGFuZCBjb250YWluZXJzCi0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJaWYgKGZpcnN0UGFydCA9PSBudWxsKSB7Ci0JCQkJCWZpcnN0UGFydCA9IGVwOwotCQkJCX0KLQkJCQkvLyBzdW0gdGhlIHggY29vcmRpbmF0ZXMgb2YgZWFjaCBlbGVtZW50Ci0JCQkJeHN1bSArPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS54OwotCQkJCS8vIHJlbWVtYmVyIGhvdyBtYW55IHNlbGVjdGVkIGVsZW1lbnRzIGFwcGxpZWQgdG8gdGhpcyBvcGVyYXRpb24KLQkJCQl0b3RhbCsrOwotCQkJfQotCQl9Ci0JCS8vIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSB4LXZhbHVlIGZvciBhbGwgbm9kZXMKLQkJaW50IHhhdmUgPSAoaW50KSAoKGRvdWJsZSkgeHN1bSAvIChkb3VibGUpIHRvdGFsKTsKLQkJLy8gbG9vcCB0aHJvdWdoIGFsbCB0aGUgbm9kZXMgYWdhaW4gYW5kIHNldCB0aGVtCi0JCWZvciAoaW50IGEgPSAwOyBhIDwgZWRpdFBhcnRzLnNpemUoKTsgYSsrKSB7Ci0JCQlpZiAoZWRpdFBhcnRzLmdldChhKSBpbnN0YW5jZW9mIFNoYXBlTm9kZUVkaXRQYXJ0KSB7Ci0JCQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBlcCA9IChBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0KSBlZGl0UGFydHMKLQkJCQkJCS5nZXQoYSk7Ci0JCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCWludCBvZmZzZXQgPSAoaW50KSAoKGRvdWJsZSkgKGJvdW5kcy53aWR0aCAtIGZpcnN0UGFydAotCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoKSAvIDIuMCk7Ci0JCQkJLy8gYXJlIHdlIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQlpZiAoIShlcC5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCkpIHsKLQkJCQkJLy8gYWRqdXN0IHRoZSBvZmZzZXQgc2luY2Ugd2UgaGF2ZSB0byBtb3ZlIHRoZSBjb250YWluZXIKLQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCVJlY3RhbmdsZSBwYXJlbnRCb3VuZHMgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKTsKLQkJCQkJb2Zmc2V0ICs9IGJvdW5kcy54IC0gcGFyZW50Qm91bmRzLng7Ci0JCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQl9Ci0JCQkJLy8gc2VuZCB0aGUgY29tbWFuZCB0byBtb3ZlIHRoZSBlbGVtZW50Ci0JCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQluZXcgUG9pbnQoeGF2ZSAtIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCQlnZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGMpOwotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqIAotCSAqIEFjdGlvbiBpbXBsZW1lbnRhdGlvbiBtZXRob2QgZm9yIHZlcnRpY2FsQWxpZ25Ub0ZpcnN0U2VsZWN0ZWRBY3Rpb24uCi0JICogCi0JICovCi0KLQlwdWJsaWMgdm9pZCB2ZXJ0aWNhbEFsaWduVG9GaXJzdFNlbGVjdGVkKCkgewotCQkvLyBnZXQgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCBhbGlnblRvUGFydCA9IG51bGw7Ci0JCS8vIGZpbmQgdGhlIGZpcnN0IGRpYWdyYW0gcGFydCB3ZSBjYW4gYWxpZ24gdG8KLQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCWlmIChlZGl0UGFydHMuZ2V0KGEpIGluc3RhbmNlb2YgU2hhcGVOb2RlRWRpdFBhcnQpIHsKLQkJCQlBYnN0cmFjdEdyYXBoaWNhbEVkaXRQYXJ0IGVwID0gKEFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQpIGVkaXRQYXJ0cwotCQkJCQkJLmdldChhKTsKLQkJCQlpZiAoYWxpZ25Ub1BhcnQgPT0gbnVsbCkgewotCQkJCQkvLyByZW1lbWJlciBpdCBhbmQgc3RvcAotCQkJCQlhbGlnblRvUGFydCA9IGVwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbG9vcCB0aHJvdWdoIHRoZSBlbGVtZW50cyBhbmQgc2V0IHRoZWlyIG5ldyBwb3NpdGlvbgotCQlmb3IgKGludCBhID0gMDsgYSA8IGVkaXRQYXJ0cy5zaXplKCk7IGErKykgewotCQkJaWYgKGVkaXRQYXJ0cy5nZXQoYSkgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCUFic3RyYWN0R3JhcGhpY2FsRWRpdFBhcnQgZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkuZ2V0KGEpOwotCQkJCS8vIHdlIGNhbiBza2lwIHRoZSBmaXJzdCBvbmUgc2luY2UgdGhpcyBpcyBhbiBhbGlnbi10bwotCQkJCWlmIChlcCAhPSBhbGlnblRvUGFydAotCQkJCQkJJiYgIShEaWFncmFtQ29yZVV0aWwuaXNTeW5jQmFyKGFsaWduVG9QYXJ0KSkpIHsKLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZm9yIGNlbnRlcmxpbmUgYWxpZ25tZW50Ci0JCQkJCWlmICghKERpYWdyYW1Db3JlVXRpbC5pc1N5bmNCYXIoZXApKSkgewotCQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJaW50IG9mZnNldCA9IChpbnQpICgoZG91YmxlKSAoYm91bmRzLndpZHRoIC0gYWxpZ25Ub1BhcnQKLQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLndpZHRoKSAvIDIuMCk7Ci0JCQkJCQkvLyBpcyB0aGlzIGluc2lkZSBhIGNvbnRhaW5lcj8KLQkJCQkJCWlmICghKGVwLmdldFBhcmVudCgpIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KSkgewotCQkJCQkJCS8vIGFkanVzdCB0aGUgb2Zmc2V0IHNpbmNlIHdlIGFyZSBtb3ZpbmcgdGhlCi0JCQkJCQkJLy8gY29udGFpbmVyCi0JCQkJCQkJZXAgPSAoQWJzdHJhY3RHcmFwaGljYWxFZGl0UGFydCkgZXAuZ2V0UGFyZW50KCk7Ci0JCQkJCQkJUmVjdGFuZ2xlIHBhcmVudEJvdW5kcyA9IGVwLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpOwotCQkJCQkJCW9mZnNldCArPSBib3VuZHMueCAtIHBhcmVudEJvdW5kcy54OwotCQkJCQkJCWJvdW5kcyA9IHBhcmVudEJvdW5kczsKLQkJCQkJCX0KLQkJCQkJCS8vIHNlbmQgdGhlIGNvbW1hbmQgdG8gbW92ZSB0aGUgZWxlbWVudAotCQkJCQkJb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQgYyA9IG5ldyBDaGFuZ2VCb3VuZHNDb21tYW5kKHRyYW5zYWN0aW9uRG9tYWluLAotCQkJCQkJCQkoTm9kZSkgZXAuZ2V0TW9kZWwoKSwgbmV3IFBvaW50KGFsaWduVG9QYXJ0Ci0JCQkJCQkJCQkJLmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpLCBib3VuZHMud2lkdGgsIC0xKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbigKLQkJCQkJCQkJbmV3IFBvaW50KGFsaWduVG9QYXJ0LmdldEZpZ3VyZSgpLmdldEJvdW5kcygpLngKLQkJCQkJCQkJCQktIG9mZnNldCwgYm91bmRzLnkpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVBvaW50IHRwID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlib29sZWFuIGNvbm5lY3RlZCA9IGZhbHNlOwotCQkJCQkJYm9vbGVhbiBzb3VyY2UgPSBmYWxzZTsKLQkJCQkJCVBvaW50IGVuZFBvaW50ID0gbnVsbDsKLQkJCQkJCUNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQgbHAgPSBudWxsOwotCQkJCQkJLy8gY2hlY2sgdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCQlMaXN0IGxpc3QgPSAoKFNoYXBlTm9kZUVkaXRQYXJ0KSBlcCkuZ2V0VGFyZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGxwLmdldFNvdXJjZSgpLmVxdWFscyhhbGlnblRvUGFydCkpIHsKLQkJCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gY2hlY2sgc291cmNlIGNvbm5lY3Rpb25zIGlmIG5vdCBmb3VuZCBpbiB0YXJnZXQgY29ubmVjdGlvbnMKLQkJCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQkJbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGVwKS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJbHAgPSAoQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgaXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoYWxpZ25Ub1BhcnQpKSB7Ci0JCQkJCQkJCQljb25uZWN0ZWQgPSB0cnVlOwotCQkJCQkJCQkJc291cmNlID0gdHJ1ZTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGNvbm5lY3RlZCAmJiAoYWxpZ25Ub1BhcnQgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkpIHsKLQkJCQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkJLmdldEJvdW5kcygpLmdldENlbnRlcigpOwotCQkJCQkJCQkJaW50IGRlbHRhID0gY2VudGVyUG9pbnQueCAtIHRwLng7Ci0JCQkJCQkJZW5kUG9pbnQueCArPSBkZWx0YTsKLQkJCQkJCQkJCVJlY29ubmVjdExpbmtDb21tYW5kIGMgPSBuZXcgUmVjb25uZWN0TGlua0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJCQkoRWRnZSkgbHAuZ2V0TW9kZWwoKSwgKE5vZGUpIGVwLmdldE1vZGVsKCksCi0JCQkJCQkJCQlzb3VyY2UpOwotCQkJCQkJCWMuc2V0RW5kUG9pbnQoZW5kUG9pbnQpOwotCQkJCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIElmIGZpcnN0IHNlbGVjdGVkIGVkaXQgcGFydCBpcyBzeW5jYmFybm9kZWVkaXRwYXJ0LCBuZWVkIHRvCi0JCQkJLy8gaGFuZGxlIGRpZmZlcmVudGx5Ci0JCQkJaWYgKGVwICE9IGFsaWduVG9QYXJ0Ci0JCQkJCQkmJiAhKERpYWdyYW1Db3JlVXRpbC5pc1N5bmNCYXIoYWxpZ25Ub1BhcnQpKSkgewotCi0JCQkJCVBvaW50IHNwID0gYWxpZ25Ub1BhcnQuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkKLQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCWJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7Ci0JCQkJCS8vIGNoZWNrIGlmIHRoZSBwYXJ0IGlzIGNvbm5lY3RlZCB2aWEgc291cmNlIGNvbm5lY3Rpb25zCi0JCQkJCUxpc3QgbGlzdCA9ICgoU2hhcGVOb2RlRWRpdFBhcnQpIGFsaWduVG9QYXJ0KQotCQkJCQkJCS5nZXRTb3VyY2VDb25uZWN0aW9ucygpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJQ29ubmVjdGlvbk5vZGVFZGl0UGFydCBscCA9IChDb25uZWN0aW9uTm9kZUVkaXRQYXJ0KSBpdG9yLm5leHQoKTsKLQkJCQkJCWlmIChscC5nZXRUYXJnZXQoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJY29ubmVjdGVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBpZiBub3QgZm91bmQgYWJvdmUsIGNoZWNrIGlmIGl0IGlzIGNvbm5lY3RlZCB2aWEgdGFyZ2V0IGNvbm5lY3Rpb25zCi0JCQkJCWlmICghY29ubmVjdGVkKSB7Ci0JCQkJCQlsaXN0ID0gKChTaGFwZU5vZGVFZGl0UGFydCkgYWxpZ25Ub1BhcnQpCi0JCQkJCQkJCS5nZXRUYXJnZXRDb25uZWN0aW9ucygpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQlDb25uZWN0aW9uTm9kZUVkaXRQYXJ0IGxwID0gKENvbm5lY3Rpb25Ob2RlRWRpdFBhcnQpIGl0b3IubmV4dCgpOwotCQkJCQkJCWlmIChscC5nZXRTb3VyY2UoKS5lcXVhbHMoZXApKSB7Ci0JCQkJCQkJCWNvbm5lY3RlZCA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoRGlhZ3JhbUNvcmVVdGlsLmlzU3luY0JhcihlcCkpIHsKLQkJCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoKTsKLQkJCQkJCXAueCA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldyllcC5nZXRNb2RlbCgpLAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCQkJCQlwLnkgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpZXAuZ2V0TW9kZWwoKSwKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9ZKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQkJUG9pbnQgdHAgPSBwLmdldENvcHkoKTsKLQkJCQkJCVBvaW50IGFsaWduVG9DZW50ZXIgPSBhbGlnblRvUGFydC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDZW50ZXIoKTsKLQkJCQkJCVBvaW50IGNlbnRlclBvaW50ID0gZXAuZ2V0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBhbGlnblRvQ2VudGVyLnggLSBjZW50ZXJQb2ludC54OwotCQkJCQkJdHAueCA9IHRwLnggKyBkZWx0YTsKLQkJCQkJCW9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kIGMgPSBuZXcgQ2hhbmdlQm91bmRzQ29tbWFuZCh0cmFuc2FjdGlvbkRvbWFpbiwKLQkJCQkJCQkJKE5vZGUpIGVwLmdldE1vZGVsKCksIHRwLCBlcC5nZXRGaWd1cmUoKQotCQkJCQkJCQkJCS5nZXRCb3VuZHMoKS53aWR0aCwgLTEpOwotCQkJCQkJZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShjKTsKLQkJCQkJCWVwLmdldEZpZ3VyZSgpLnNldExvY2F0aW9uKG5ldyBQb2ludCh0cC54LCB0cC55KSk7Ci0JCQkJCX0gZWxzZSBpZiAoZXAgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCQkJUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotCQkJCQkJcC54ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KWVwLmdldE1vZGVsKCksCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkuaW50VmFsdWUoKTsKLQkJCQkJCXAueSA9ICgoSW50ZWdlcikgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSgoVmlldyllcC5nZXRNb2RlbCgpLAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCQkJCQlQb2ludCB0cCA9IHAuZ2V0Q29weSgpOwotCQkJCQkJUG9pbnQgY2VudGVyUG9pbnQgPSBlcC5nZXRGaWd1cmUoKS5nZXRCb3VuZHMoKQotCQkJCQkJCQkuZ2V0Q2VudGVyKCk7Ci0JCQkJCQlpbnQgZGVsdGEgPSBzcC54IC0gY2VudGVyUG9pbnQueDsKLQkJCQkJCXRwLnggPSB0cC54ICsgZGVsdGE7Ci0JCQkJCQlvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZCBjID0gbmV3IENoYW5nZUJvdW5kc0NvbW1hbmQodHJhbnNhY3Rpb25Eb21haW4sCi0JCQkJCQkJCShOb2RlKSBlcC5nZXRNb2RlbCgpLCB0cCwgZXAuZ2V0RmlndXJlKCkKLQkJCQkJCQkJCQkuZ2V0Qm91bmRzKCkud2lkdGgsIC0xKTsKLQkJCQkJCWdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoYyk7Ci0JCQkJCQllcC5nZXRGaWd1cmUoKS5zZXRMb2NhdGlvbihuZXcgUG9pbnQodHAueCwgdHAueSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUFsaWduTWVudShJTWVudU1hbmFnZXIgbWVudSwgYm9vbGVhbiBjYW5Nb2RpZnkpIHsKLQkJLy8gY3JlYXRlIGEgbmV3IG1lbnUgbWFuYWdlciBmb3IgdGhlIGNhc2NhZGluZyBtZW51Ci0JCQotCQlJQ29udHJpYnV0aW9uSXRlbSBmb3JtYXRNZW51ID0gbWVudS5maW5kKEFjdGlvbklkcy5NRU5VX0ZPUk1BVCk7Ci0JCQotCQlNZW51TWFuYWdlciBhbGlnbk1lbnVNYW5hZ2VyID0gbnVsbDsKLQkJaWYgKGFsaWduTWVudU1hbmFnZXIgPT0gbnVsbCkgewotCQkJYWxpZ25NZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtRWRpdG9yX2FsaWduTWVudV90ZXh0KSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQkJaW50IHRvdGFsID0gMDsKLQkJCQkJLy8gZW5hYmxlIHRoZSBtZW51IG9ubHkgaWYgMiBvciBtb3JlIG5vZGVzIG9yIG5vZGUKLQkJCQkJLy8gY29udGFpbmVycwotCQkJCQkvLyBhcmUgc2VsZWN0ZWQKLQkJCQkJTGlzdCBlZGl0UGFydHMgPSBncmFwaGljYWxWaWV3ZXIuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQkJLy8gbmVlZCBhdCBsZWFzdCB0d28gdGhpbmdzIHNlbGVjdGVkIHRvIGFsaWduCi0JCQkJCWlmIChlZGl0UGFydHMuc2l6ZSgpID4gMSkgewotCQkJCQkJZm9yIChpbnQgYSA9IDA7IGEgPCBlZGl0UGFydHMuc2l6ZSgpOyBhKyspIHsKLQkJCQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldChhKTsKLQkJCQkJCQkvLyB3ZSBjYW4gYWxpZ24gbm9kZXMgYW5kIGNvbnRhaW5lcnMKLQkJCQkJCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBTaGFwZU5vZGVFZGl0UGFydCkgewotCQkJCQkJCQkvLyBhZGQgdXAgdGhlIGVsZW1lbnRzIHdlIG5lZWQsIHRoZXJlIG1heSBiZQotCQkJCQkJCQkvLyBtb3JlCi0JCQkJCQkJCS8vIGVsZW1lbnRzIHNlbGVjdGVkIChsaW5rcywgZXRjLikKLQkJCQkJCQkJdG90YWwrKzsKLQkJCQkJCQkJaWYgKHRvdGFsID4gMSkgewotCQkJCQkJCQkJLy8gd2Ugb25seSBuZWVkIHRvIGtub3cgdGhlcmUgaXMgbW9yZSB0aGFuCi0JCQkJCQkJCQkvLyAxLCBzbwotCQkJCQkJCQkJLy8gd2UgY2FuIHN0b3AgaGVyZQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRvdGFsID4gMTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWlmIChmb3JtYXRNZW51ICE9IG51bGwgJiYgZm9ybWF0TWVudSBpbnN0YW5jZW9mIElNZW51TWFuYWdlciAKLQkJCQkmJiBhbGlnbk1lbnVNYW5hZ2VyLmlzRW5hYmxlZCgpICYmIGNhbk1vZGlmeSkgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9ICAoKElNZW51TWFuYWdlcilmb3JtYXRNZW51KS5maW5kKEFjdGlvbklkcy5NRU5VX0FMSUdOKTsKLQkJCWlmKGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKXsKLQkJCQlJTWVudU1hbmFnZXIgYWxpZ25NZW51ID0gKElNZW51TWFuYWdlcilpdGVtOwotCQkJCWFsaWduTWVudS5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UuQUxJR05fSE9SWl9BVkVSQUdFKSk7Ci0JCQkJYWxpZ25NZW51LmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQkJYWxpZ25NZW51LmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0FWRVJBR0UpKTsKLQkJCQlhbGlnbk1lbnUuYWRkKGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKAotCQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX1ZFUlRfRklSU1RfU0VMRUNURUQpKTsKLQkJCX0KLQkJfWVsc2V7Ci0JCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX0hPUlpfQVZFUkFHRSkpOwotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9IT1JaX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQlhbGlnbk1lbnVNYW5hZ2VyLmFkZChnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLQkJCQkJRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlLkFMSUdOX1ZFUlRfQVZFUkFHRSkpOwotCQkJYWxpZ25NZW51TWFuYWdlci5hZGQoZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oCi0JCQkJCURpYWdyYW1BY3Rpb25zU2VydmljZS5BTElHTl9WRVJUX0ZJUlNUX1NFTEVDVEVEKSk7Ci0JCQlpZiAoYWxpZ25NZW51TWFuYWdlci5pc0VuYWJsZWQoKSAmJiBjYW5Nb2RpZnkpIHsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywKLQkJCQkJCQkJbmV3IFNlcGFyYXRvcigpKTsKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoR0VGQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUywgYWxpZ25NZW51TWFuYWdlcik7Ci0JCQkJbWVudS5hcHBlbmRUb0dyb3VwKEdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsCi0JCQkJCQkJCW5ldyBTZXBhcmF0b3IoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvRWRpdG9yQWN0aW9uRGVsZWdhdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9FZGl0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWY5OTc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9FZGl0b3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLklFZGl0aW5nRG9tYWluUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5EaWFncmFtQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0b3JBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yOwotCXByb3RlY3RlZCBMaXN0PEVkaXRQYXJ0PiBzZWxlY3RlZFBhcnRzID0gbmV3IEFycmF5TGlzdDxFZGl0UGFydD4oKTsKLQotCQotCXB1YmxpYyBFZGl0b3JBY3Rpb25EZWxlZ2F0ZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQl0aGlzLnRhcmdldEVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0ZWRQYXJ0cy5jbGVhcigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCWlmIChzdHJ1Y3R1cmVkU2VsZWN0aW9uLnNpemUoKSA+MAotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJc2VsZWN0ZWRQYXJ0cy5hZGRBbGwoc3RydWN0dXJlZFNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpewotCQlpZih0YXJnZXRFZGl0b3IgIT0gbnVsbCAmJiB0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpdGFyZ2V0RWRpdG9yKS5nZXREaWFncmFtKCk7Ci0JCQlpZihkaWFncmFtICE9IG51bGwpewotCQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCl7Ci0JCQkJCXJldHVybiAoQWN0aW9uTWFuYWdlcilhZGFwdGVyLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCSAvKioKLSAgICAgKiBHZXRzIGVkaXRpbmcgZG9tYWluCi0gICAgICogCi0gICAgICogQHJldHVybiBteSBlZGl0aW5nIGRvbWFpbgotICAgICAqLwotICAgIHByb3RlY3RlZCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotICAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFkYXB0aW5nIHRoZSB3b3JrYmVuY2ggcGFydAotICAgICAgICBJRWRpdG9yUGFydCBwYXJ0ID0gdGFyZ2V0RWRpdG9yOwotCi0gICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgZWRQcm92aWRlciA9IChJRWRpdGluZ0RvbWFpblByb3ZpZGVyKSBwYXJ0Ci0gICAgICAgICAgICAgICAgLmdldEFkYXB0ZXIoSUVkaXRpbmdEb21haW5Qcm92aWRlci5jbGFzcyk7Ci0KLSAgICAgICAgICAgIGlmIChlZFByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIAlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGVkUHJvdmlkZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgCWlmIChkb21haW4gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgewotICAgICAgICAgICAgCQlyZXR1cm4gKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBkb21haW47Ci0gICAgICAgICAgICAJfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDFiYjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1Xb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogUmVmcmVzaCBhY3Rpb24gcmVmcmVzaGVzIHRoZSBEaWFncmFtRWRpdFBhcnQsIHBlcmZvcm1zIGRlYWN0aXZhdGUgYW5kIGFjdGl2YXRlLiAKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEFjdGlvbiBpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydDsKLQotCXB1YmxpYyBSZWZyZXNoQWN0aW9uKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCWlmKHRhcmdldFBhcnQgaW5zdGFuY2VvZiBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpIHsKLQkJCWFjdGl2ZVBhcnQgPSAoKElEaWFncmFtV29ya2JlbmNoUGFydCl0YXJnZXRQYXJ0KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4ob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmKGFjdGl2ZVBhcnQgIT0gbnVsbCkgewotCQkJaWYoYWN0aXZlUGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCUFic3RyYWN0RGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilhY3RpdmVQYXJ0KTsgCi0JCQkJZWRpdG9yLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoRnJvbUJhc2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYWN0aW9ucy9SZWZyZXNoRnJvbUJhc2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI1YjZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2FjdGlvbnMvUmVmcmVzaEZyb21CYXNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuT2JqZWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEFjdGlvbiB0byByZWZyZXNoIHRoZSBsYXRlc3QgY2hhbmdlcyBmcm9tIGJhc2UgYWN0aXZpdHkgZGlhZ3JhbSBpbnRvIAotICogZXh0ZW5kJ3MgQWN0aXZpdHkgZGlhZ3JhbS4gQWN0aW9uIHdpbGwga2VlcCB0aGUgZXhpc3RpbmcgaW1tZWRpYXRlIGNoaWxkcmVuJ3MgCi0gKiBpbmZvcm1hdGlvbiBvZiBleHRlbmQgZGlhZ3JhbSwgb25seSByZWZyZXNoIHRoZSBiYXNlIGRpYWdyYW0ncyByZWxhdGVkIGluZm9ybWF0aW9uLiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgUmVmcmVzaEZyb21CYXNlQWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgRWRpdFBhcnQgZWRpdFBhcnQ7Ci0JcHJpdmF0ZSBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0OwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWZyZXNoRnJvbUJhc2VBY3Rpb24oKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlI3NldEFjdGl2ZVBhcnQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJdGhpcy50YXJnZXRQYXJ0ID0gdGFyZ2V0UGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjcnVuKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlyZWZyZXNoRnJvbUJhc2VDb21tYW5kLmV4ZWN1dGUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiwgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWVkaXRQYXJ0ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPT0gMQotCQkJCQkmJiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQllZGl0UGFydCA9IChFZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWlmKGVkaXRQYXJ0ICE9IG51bGwpewotCQkJYWN0aW9uLnNldENoZWNrZWQoZmFsc2UpOwotCQkJLy8gQ2hlY2sgaWYgZGlhZ3JhbSByZWFkb25seS4KLQkJCWlmKGVkaXRQYXJ0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KXsKLQkJCQlpZighKChEaWFncmFtRWRpdFBhcnQpZWRpdFBhcnQpLmlzRWRpdE1vZGVFbmFibGVkKCkpewotCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENoZWNrZWQgdmFyaWFiaWxpdHkgCi0JCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSllZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJQWN0aXZpdHkgZSA9IG51bGw7Ci0JCQlpZihtb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KXsKLQkJCQllID0gKEFjdGl2aXR5KUJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KW1vZGVsKTsKLQkJCX1lbHNlIGlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSl7Ci0JCQkJZSA9IChBY3Rpdml0eSkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pbW9kZWwpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCX0KLQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoKChBY3Rpdml0eSllKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbAotCQkJCQkJCXx8ICgoKEFjdGl2aXR5KWUpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCQkJJiYgKChBY3Rpdml0eSllKS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykpewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX1lbHNlewotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZnJlc2ggYmFzZSBmcm9tIHByZXZpb3VzIGdyYXBoaWNhbCBlZGl0b3IgY29kZS4KLQkgKiBUT0RPOiBoYW5kbGUgY29uc3VtZXIgKHNldCkKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENvbW1hbmQgcmVmcmVzaEZyb21CYXNlQ29tbWFuZCA9IG5ldyBDb21tYW5kKERpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbUVkaXRvcnJlZnJlc2hmcm9tYmFzZSkgeyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgQXJyYXlMaXN0IG9sZENvbnRlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCi0JCQlFZGl0UGFydCBwYXJlbnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKTsKLQkJCS8vIGJhY2sgdXAgb2xkIGRpYWdyYW0gY29udGVudAotCQkJLy8KLQkJCW9sZENvbnRlbnQuY2xlYXIoKTsKLQkJCW9sZENvbnRlbnQuYWRkQWxsKGRpYWdyYW0uZ2V0UGVyc2lzdGVkQ2hpbGRyZW4oKSk7Ci0KLQkJCWJvb2xlYW4gcmVmcmVzaGVkID0gLy9EaWFncmFtSGVscGVyLnJlZnJlc2hGcm9tQmFzZShkaWFncmFtKTsKLQkJCQlyZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSk7Ci0JCQlpZighcmVmcmVzaGVkKSByZXR1cm47Ci0JCQkKLQkJCWlmIChlZGl0UGFydC5pc0FjdGl2ZSgpKSB7Ci0JCQkJZWRpdFBhcnQuZGVhY3RpdmF0ZSgpOwotCQkJfQotCQkJLy9kaWFncmFtLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJLy9jcmVhdGVFZGl0UGFydCgpOwotCQkJZWRpdFBhcnQgPSAoRWRpdFBhcnQpRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJZWRpdFBhcnQuc2V0UGFyZW50KHBhcmVudCk7Ci0JCQlwYXJlbnQuZ2V0Vmlld2VyKCkuc2V0Q29udGVudHMoZWRpdFBhcnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBlZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJZGlhZ3JhbS5nZXRDaGlsZHJlbigpLmNsZWFyKCk7Ci0JCQlkaWFncmFtLmdldENoaWxkcmVuKCkuYWRkQWxsKG9sZENvbnRlbnQpOwotCQkJaWYgKGVkaXRQYXJ0LmlzQWN0aXZlKCkpIHsKLQkJCQllZGl0UGFydC5kZWFjdGl2YXRlKCk7Ci0JCQl9Ci0JCQkvL2RpYWdyYW0ucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQllZGl0UGFydCA9IChFZGl0UGFydClFZGl0UGFydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVHcmFwaGljRWRpdFBhcnQoZGlhZ3JhbSk7Ci0JCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5zZXRDb250ZW50cyhlZGl0UGFydCk7Ci0JCQllZGl0UGFydC5hY3RpdmF0ZSgpOwotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciBnZXRHcmFwaGljYWxWaWV3ZXIoKXsKLQkJcmV0dXJuIChHcmFwaGljYWxWaWV3ZXIpZWRpdFBhcnQuZ2V0Um9vdCgpLmdldFZpZXdlcigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoRnJvbUJhc2UoZmluYWwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRIb2xkZXIgPSBuZXcgYm9vbGVhblsxXTsKLQkJdHJ5IHsKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcmVzdWx0SG9sZGVyWzBdID0gZG9SZWZyZXNoRnJvbUJhc2UoZGlhZ3JhbSk7Ci0JCQkJfQotCQkJCQotCQkJfSk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaEZyb21CYXNlKGZpbmFsIERpYWdyYW0gZGlhZ3JhbSwgZmluYWwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJZmluYWwgYm9vbGVhbltdIHJlc3VsdEhvbGRlciA9IG5ldyBib29sZWFuWzFdOwotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlyZXN1bHRIb2xkZXJbMF0gPSBkb1JlZnJlc2hGcm9tQmFzZShkaWFncmFtLCBhY3Rpdml0eSk7Ci0JCQkJfQotCQkJCQotCQkJfSk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgSURpYWdyYW1Bc3NvY2lhdGlvbkhlbHBlciB7Ci0JCS8qKgotCQkgKiBHZXRzIHRoZSB7QGxpbmsgTWV0aG9kRWxlbWVudH0gdGhhdCB0aGUgZ2l2ZW4ge0BsaW5rIE5vZGV9IHJlcHJlc2VudHMuCi0JCSAqIAotCQkgKiBAcGFyYW0gbm9kZQotCQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQgdGhlIHJlc291cmNlIHNldCBvZiB0aGUgbGlicmFyeQotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoTm9kZSBub2RlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCk7Ci0JCQotCQkvKioKLQkJICogRmluZHMgaW4gdGhlIGdpdmVuIGRpYWdyYW0gdGhlIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiB7QGxpbmsgTWV0aG9kRWxlbWVudH0uCi0JCSAqICAKLQkJICogQHBhcmFtIGRpYWdyYW0KLQkJICogQHBhcmFtIGUKLQkJICogQHJldHVybgotCQkgKi8KLQkJTm9kZSBmaW5kTm9kZShEaWFncmFtIGRpYWdyYW0sIE1ldGhvZEVsZW1lbnQgZSk7Ci0JCQkJCi0JCS8qKgotCQkgKiBSZS1hc3NvY2lhdGVzIGFjdGl2aXR5IG5vZGVzIGluIHRoZSBiYXNlIGRpYWdyYW0gY29weSB3aXRoIGNvcnJlc3BvbmRpbmcKLQkJICogbG9jYWxseSBjb250cmlidXRvcnMgb3IgcmVwbGFjZXJzIGlmIHRoZXJlIGlzIGFueS4KLQkJICogCi0JCSAqIEBwYXJhbSBhY3Rpdml0eQotCQkgKiBAcGFyYW0gY29weU9mQmFzZURpYWdyYW0KLQkJICovCi0JCXZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pOwotCQkKLQkJdm9pZCBhZGROb2RlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IG5vZGVNb2RlbHMpOwotCQkKLQkJdm9pZCBhZGRFZGdlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IGVkZ2VNb2RlbHMpOwotCQkKLQkJdm9pZCByZW1vdmVOb2RlTW9kZWwoRU9iamVjdCBkaWFncmFtTW9kZWwsIEVPYmplY3Qgbm9kZU1vZGVsKTsKLQkJCi0JCXZvaWQgcmVtb3ZlRWRnZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IGVkZ2VNb2RlbCk7Ci0KLQkJQ29sbGVjdGlvbjw/PiBnZXROb2RlTW9kZWxzKEVPYmplY3QgZWxlbWVudCk7Ci0KLQkJQ29sbGVjdGlvbjw/PiBnZXRFZGdlTW9kZWxzKEVPYmplY3QgZWxlbWVudCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIgQURBc3NvY2lhdGlvbkhlbHBlciA9IG5ldyBJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyKCkgewotCi0JCXB1YmxpYyBOb2RlIGZpbmROb2RlKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBlKTsKLQkJfQotCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoTm9kZSBub2RlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQkJRU9iamVjdCB1bWxPYmplY3QgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCWlmICh1bWxPYmplY3QgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlCi0JCQkJCXx8IHVtbE9iamVjdCBpbnN0YW5jZW9mIE9iamVjdE5vZGUpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KChBY3Rpdml0eU5vZGUpIHVtbE9iamVjdCk7Ci0JCQkJaWYgKGUgPT0gbnVsbCAmJiByZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJCS8vIGJhc2UgZGlhZ3JhbSBpcyBub3Qgb3BlbiwgdHJ5IHRvIGdldCBmcm9tCi0JCQkJCS8vIGFubm90YXRpb24KLQkJCQkJLy8KLQkJCQkJZSA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24oCi0JCQkJCQkJCQkoRU1vZGVsRWxlbWVudCkgdW1sT2JqZWN0LCByZXNvdXJjZVNldCk7Ci0JCQkJfQotCQkJCXJldHVybiBlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWFzc29jaWF0ZShBY3Rpdml0eSBhY3Rpdml0eSwgRGlhZ3JhbSBjb3B5T2ZCYXNlRGlhZ3JhbSkgewotCQkJRGlhZ3JhbUhlbHBlci5yZWFzc29jaWF0ZShhY3Rpdml0eSwgY29weU9mQmFzZURpYWdyYW0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRWRnZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBlZGdlTW9kZWxzKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW1Nb2RlbCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGZhbHNlOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9sZE5vdGlmeSA9IGRpYWdyYW1BZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtTW9kZWwpLmdldEVkZ2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY3Rpdml0eUVkZ2U+KSBlZGdlTW9kZWxzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbUFkYXB0ZXIuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE5vZGVNb2RlbHMoRU9iamVjdCBkaWFncmFtTW9kZWwsIENvbGxlY3Rpb248Pz4gbm9kZU1vZGVscykgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXREaWFncmFtQWRhcHRlcihkaWFncmFtTW9kZWwpOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBmYWxzZTsKLQkJCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCQlvbGROb3RpZnkgPSBkaWFncmFtQWRhcHRlci5pc05vdGlmaWNhdGlvbkVuYWJsZWQoKTsKLQkJCQlkaWFncmFtQWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZGlhZ3JhbU1vZGVsKS5nZXROb2RlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHlOb2RlPikgbm9kZU1vZGVscyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVFZGdlTW9kZWwoRU9iamVjdCBkaWFncmFtTW9kZWwsIEVPYmplY3QgZWRnZU1vZGVsKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW1Nb2RlbCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGZhbHNlOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9sZE5vdGlmeSA9IGRpYWdyYW1BZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtTW9kZWwpLmdldEVkZ2VzKCkucmVtb3ZlKGVkZ2VNb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVOb2RlTW9kZWwoRU9iamVjdCBkaWFncmFtTW9kZWwsIEVPYmplY3Qgbm9kZU1vZGVsKSB7Ci0JCQlpZighKGRpYWdyYW1Nb2RlbCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldERpYWdyYW1BZGFwdGVyKGRpYWdyYW1Nb2RlbCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IGZhbHNlOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW9sZE5vdGlmeSA9IGRpYWdyYW1BZGFwdGVyLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBkaWFncmFtTW9kZWwpLmdldE5vZGVzKCkucmVtb3ZlKG5vZGVNb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihkaWFncmFtQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW1BZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRFZGdlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuICgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGVsZW1lbnQpLmdldEVkZ2VzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldE5vZGVNb2RlbHMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgZWxlbWVudCkuZ2V0Tm9kZXMoKTsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQl9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIgZGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyID0gbmV3IElEaWFncmFtQXNzb2NpYXRpb25IZWxwZXIoKSB7Ci0KLQkJcHVibGljIE5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJCXJldHVybiBEaWFncmFtSGVscGVyLmZpbmROb2RlSW5Nb2RlbERpYWdyYW0oZGlhZ3JhbSwgZSk7Ci0JCX0KLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KE5vZGUgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlPyAKLQkJCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlbGVtZW50KS5nZXRMaW5rZWRFbGVtZW50KCkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGROb2RlTW9kZWxzKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBDb2xsZWN0aW9uPD8+IG5vZGVNb2RlbHMpIHsKLQkJCWlmKCEoZGlhZ3JhbU1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbU1vZGVsOwotCQkJYm9vbGVhbiBvbGROb3RpZnkgPSAoKE5vZGVJbXBsKWRpYWdyYW0pLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQkJdHJ5IHsKLQkJCQkoKE5vZGVJbXBsKWRpYWdyYW0pLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU+KSBub2RlTW9kZWxzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCSgoTm9kZUltcGwpZGlhZ3JhbSkuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChvbGROb3RpZnkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRWRnZU1vZGVscyhFT2JqZWN0IGRpYWdyYW1Nb2RlbCwgQ29sbGVjdGlvbjw/PiBlZGdlTW9kZWxzKSB7Ci0JCQkvLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRWRnZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IGVkZ2VNb2RlbCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTm9kZU1vZGVsKEVPYmplY3QgZGlhZ3JhbU1vZGVsLCBFT2JqZWN0IG5vZGVNb2RlbCkgewotCQkJaWYoIShkaWFncmFtTW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZGlhZ3JhbSA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBkaWFncmFtTW9kZWw7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9ICgoTm9kZUltcGwpZGlhZ3JhbSkuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQl0cnkgewotCQkJCSgoTm9kZUltcGwpZGlhZ3JhbSkuc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJZGlhZ3JhbS5nZXROb2RlcygpLnJlbW92ZShub2RlTW9kZWwpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJKChOb2RlSW1wbClkaWFncmFtKS5zZXROb3RpZmljYXRpb25FbmFibGVkKG9sZE5vdGlmeSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRFZGdlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXROb2RlTW9kZWxzKEVPYmplY3QgZWxlbWVudCkgewotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCQlyZXR1cm4gKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSBlbGVtZW50KS5nZXROb2RlcygpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJCi0JfTsKLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIG5vZGUgaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgbm9kZXMgb3IgdGhlaXIgY2hpbGRyZW4uCi0JICogCi0JICogQHBhcmFtIG5vZGVzCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKENvbGxlY3Rpb248Pz4gbm9kZXMsIFZpZXcgbm9kZSkgewotCQlpZihub2Rlcy5jb250YWlucyhub2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChPYmplY3QgY2hpbGQgOiBub2RlcykgewotCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBOb2RlICYmIGNvbnRhaW5zKCgoTm9kZSkgY2hpbGQpLmdldENoaWxkcmVuKCksIG5vZGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9SZWZyZXNoRnJvbUJhc2UoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUFjdGl2aXR5IGFjdCA9IG51bGw7Ci0JCUVPYmplY3QgbW9kZWwgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCWFjdCA9IChBY3Rpdml0eSkgQnJpZGdlSGVscGVyCi0JCQkJCS5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSBtb2RlbCk7Ci0JCX0gZWxzZSBpZiAobW9kZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtKSB7Ci0JCQlhY3QgPSAoQWN0aXZpdHkpICgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbW9kZWwpCi0JCQkJCS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCX0KLQkJaWYgKGFjdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJcmV0dXJuIGRvUmVmcmVzaEZyb21CYXNlKGRpYWdyYW0sIGFjdCk7Ci0JCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9SZWZyZXNoRnJvbUJhc2UoRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QpIHsKLQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSA9PSBudWxsCi0JCQkJfHwgYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCB0eXBlID0gRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKTsKLQkJRGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVN2YyA9IG5ldyBEaWFncmFtU2VydmljZSgpOwotCQl0cnkgewotCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IGRpYWdyYW1TdmMuZ2V0QmFzZURpYWdyYW0oYWN0LCB0eXBlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJQ29sbGVjdGlvbjxOb2RlPiBvbGROb2RlcyA9IG5ldyBIYXNoU2V0PE5vZGU+KCk7Ci0JCQlDb2xsZWN0aW9uPEVkZ2U+IG9sZEVkZ2VzID0gbmV3IEhhc2hTZXQ8RWRnZT4oKTsKLQkJCURpYWdyYW0gYmFzZUNvcHkgPSBEaWFncmFtSGVscGVyLmNvcHlEaWFncmFtKFRyYW5zYWN0aW9uVXRpbAotCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKSwgYmFzZURpYWdyYW0pOwotCQkJCi0JCQlJRGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyIGhlbHBlciA9IHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0gPyBBREFzc29jaWF0aW9uSGVscGVyCi0JCQkJCTogZGlhZ3JhbUFzc29jaWF0aW9uSGVscGVyOyAKLQkJCQotCQkJYm9vbGVhbiBub3RpZmljYXRpb24gPSBtb2RlbC5lRGVsaXZlcigpOwotCQkJdHJ5IHsKLS8vCQkJCW1vZGVsLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGJhc2UuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkvLyBDb2xsZWN0IHRoZSBiYXNlIG5vZGVzIHRoYXQgZXhpc3QgaW4gZXh0ZW5kIGRpYWdyYW0KLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgYmFzZU5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGhlbHBlci5nZXRNZXRob2RFbGVtZW50KGJhc2VOb2RlLCByZXNvdXJjZVNldCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCU5vZGUgbm9kZSA9IGhlbHBlci5maW5kTm9kZShkaWFncmFtLCBlKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBDb2xsZWN0IG9sZCBpbmhlcml0ZWQgVUkgbm9kZXMgJiYgbm9kZXMgb2YKLQkJCQkvLyBjb250cmlidXRvci9yZXBsYWNlcgotCQkJCUxpc3Q8Pz4gY2hpbGRyZW4gPSBkaWFncmFtLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKEJyaWRnZUhlbHBlci5pc0luaGVyaXRlZChub2RlKSkgewotCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSwgcmVzb3VyY2VTZXQpOwotCQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJCQkmJiAoKEFjdGl2aXR5KSBlKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJCS8vIG5vZGUgaXMgb2YgY29udHJpYnV0b3Igb3IgcmVwbGFjZXIKLQkJCQkJCQkvLwotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIENvbGxlY3QgdGhlIGVkZ2VzIHRoYXRzIGV4aXN0cyBpbiBleHRlbmQgZGlhZ3JhbQotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjb250YWlucyhvbGROb2RlcywgZWRnZS5nZXRTb3VyY2UoKSkKLQkJCQkJCQkmJiBjb250YWlucyhvbGROb2RlcywgZWRnZS5nZXRUYXJnZXQoKSkpIHsKLQkJCQkJCW9sZEVkZ2VzLmFkZChlZGdlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHJlbW92ZSB0aGUgb2xkIGJhc2Ugbm9kZXMgYW5kIGVkZ2VzIHRoYXQgZXhpc3RzIGluIHRoZQotCQkJCS8vIGV4dGVuZCBkaWFncmFtLgotCQkJCWZvciAoTm9kZSBub2RlIDogb2xkTm9kZXMpIHsKLQkJCQkJZGlhZ3JhbS5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQkJaGVscGVyLnJlbW92ZU5vZGVNb2RlbChtb2RlbCwgbm9kZS5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQkJCQlmb3IgKEVkZ2UgZWRnZSA6IG9sZEVkZ2VzKSB7Ci0JCQkJCWRpYWdyYW0ucmVtb3ZlRWRnZShlZGdlKTsKLQkJCQkJaGVscGVyLnJlbW92ZUVkZ2VNb2RlbChtb2RlbCwgZWRnZS5nZXRFbGVtZW50KCkpOwotCQkJCX0KLQotCQkJCS8vIHJlcGxhY2UgYXNzb2NpYXRlZCBiYXNlIGVsZW1lbnQgd2l0aAotCQkJCS8vIGNvbnRyaWJ1dGluZy9yZXBsYWNpbmcKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQloZWxwZXIucmVhc3NvY2lhdGUoYWN0LCBiYXNlQ29weSk7Ci0KLQkJCQkvLyBNYXJrIGluaGVyaXRlZAotCQkJCWZvciAoT2JqZWN0IG9iaiA6IGJhc2VDb3B5LmdldENoaWxkcmVuKCkpIHsKLQkJCQkJQnJpZGdlSGVscGVyLm1hcmtJbmhlcml0ZWQoKFZpZXcpIG9iaik7Ci0JCQkJfQotCQkJCWZvciAoT2JqZWN0IG9iaiA6IGJhc2VDb3B5LmdldEVkZ2VzKCkpIHsKLQkJCQkJQnJpZGdlSGVscGVyLm1hcmtJbmhlcml0ZWQoKFZpZXcpIG9iaik7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEFkZCBhbGwgbmV3IG5vZGVzIGFuZCBlZGdlcyBmcm9tIGJhc2UgY29weSB0byBleHRlbmQgZGlhZ3JhbS4KLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0UGVyc2lzdGVkQ2hpbGRyZW4oKS5hZGRBbGwoCi0JCQkJCQliYXNlQ29weS5nZXRDaGlsZHJlbigpKTsKLQkJCQlkaWFncmFtLmdldFBlcnNpc3RlZEVkZ2VzKCkuYWRkQWxsKAotCQkJCQkJYmFzZUNvcHkuZ2V0RWRnZXMoKSk7Ci0JCQkJQ29sbGVjdGlvbjw/PiBiYXNlTm9kZU1vZGVscyA9IGhlbHBlci5nZXROb2RlTW9kZWxzKGJhc2VDb3B5LmdldEVsZW1lbnQoKSk7Ci0JCQkJaWYoYmFzZU5vZGVNb2RlbHMgIT0gbnVsbCAmJiAhYmFzZU5vZGVNb2RlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWhlbHBlci5hZGROb2RlTW9kZWxzKG1vZGVsLCBiYXNlTm9kZU1vZGVscyk7Ci0JCQkJfQkJCQkJCi0JCQkJQ29sbGVjdGlvbjw/PiBiYXNlRWRnZU1vZGVscyA9IGhlbHBlci5nZXRFZGdlTW9kZWxzKGJhc2VDb3B5Ci0JCQkJCQkuZ2V0RWxlbWVudCgpKTsKLQkJCQlpZiAoYmFzZUVkZ2VNb2RlbHMgIT0gbnVsbCAmJiAhYmFzZUVkZ2VNb2RlbHMuaXNFbXB0eSgpKSB7Ci0JCQkJCWhlbHBlci5hZGRFZGdlTW9kZWxzKG1vZGVsLCBiYXNlRWRnZU1vZGVscyk7Ci0JCQkJfQotCi0JCQkJLy8gVE9ETzogaGFuZGxlIHRoZSBtaXNzZWQgbGlua3MuCi0KLQkJCQkvLyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPQotCQkJCS8vIChBY3Rpdml0eURpYWdyYW1BZGFwdGVyKUJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih1bWxBY3Rpdml0eSk7Ci0JCQkJLy8gYWRhcHRlci5wb3B1bGF0ZURpYWdyYW0oKTsKLQkJCQkvLyBpZih0YXJnZXRQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCQkvLyBEaWFncmFtRWRpdG9yVXRpbC5yZXNldEVkaXRvcigoQWJzdHJhY3REaWFncmFtRWRpdG9yKXRhcmdldFBhcnQpOwotCQkJCS8vIH0KLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gcmVzZXQgdGhlIG5vdGlmaWNhdGlvbi4KLQkJCQltb2RlbC5lU2V0RGVsaXZlcihub3RpZmljYXRpb24pOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmICh0YXJnZXRQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKSB7Ci0JCQkJCURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJLnJlc2V0RWRpdG9yKChBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHRhcmdldFBhcnQpOwotCQkJCX0KLQkJCQkvLyBkaWFncmFtLmVSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjb3B5RGlhZ3JhbShFZGl0aW5nRG9tYWluIGRvbWFpbiwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCWxpc3QuYWRkKGRpYWdyYW0pOwotCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCBjbWQgPSBDb3B5Q29tbWFuZC5jcmVhdGUoZG9tYWluLCBsaXN0KTsKLQkJY21kLmV4ZWN1dGUoKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbWQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0vLwkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0vLwkJCQlyZXR1cm4gKERpYWdyYW0pIGVsZW1lbnQ7Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBjbWQ7Ci0JCS8vcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKXsKLQkJaWYodGFyZ2V0UGFydCBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcil7Ci0JCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcil0YXJnZXRQYXJ0OwotCQkJRGlhZ3JhbUVkaXRQYXJ0IHBhcnQgPSBlZGl0b3IuZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9BY3Rpdml0eURpYWdyYW1BZGFwdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9BY3Rpdml0eURpYWdyYW1BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMmYyODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQWN0aXZpdHlEaWFncmFtQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgZXh0ZW5kcyBEaWFncmFtQWRhcHRlciB7Ci0JCi0JcHVibGljIEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlzdXBlcih3cmFwcGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKEFjdGl2aXR5IGUpIHsKLQkJc3VwZXIoZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQkJCUFjdGl2aXR5Tm9kZSBiYXNlTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCQlpZiAoYmFzZU5vZGUgPT0gbnVsbCkgewotCQkJCQliYXNlTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBhY3QpOwotCQkJCX0KLQkJCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgYmFzZQotCQkJCQkvLwotCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihiYXNlTm9kZSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gYXNzb2NpYXRlIGJhc2Ugbm9kZSB3aXRoIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlub2RlQWRhcHRlciA9IGNyZWF0ZU5vZGVBZGFwdGVyKGFjdCk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCQliYXNlTm9kZS5lQWRhcHRlcnMoKS5hZGQobm9kZUFkYXB0ZXIpOwotCQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotLy8JCQkJCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3QpKSB7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZShiYXNlTm9kZSwgYWN0KTsKLQkJCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKSl7Ci0JCQkJCQkJCUJyaWRnZUhlbHBlci51bm1hcmtJbkhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbm9kZUFkYXB0ZXIuc2V0VGFyZ2V0UmVhZE9ubHkoZmFsc2UpOwotLy8JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuYWRkTm9kZShub2Rlcywgb2JqKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyIGNyZWF0ZU5vZGVBZGFwdGVyKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZihlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIEFjdGl2aXR5Tm9kZSBhZGRlZE5vZGUpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoYWRkZWROb2RlKTsKLQkJaWYoZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRFbGVtZW50KCk7Ci0KLQkJLy8gdHJhbnNsYXRlIEFjdGl2aXR5Tm9kZSBpbmRleCB0byBBY3Rpdml0eSBpbmRleAotCQkvLwotCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0KLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoYWRkZWROb2RlKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgYWN0LCBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsIGUsIGkpOwotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKGFkZGVkTm9kZSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgdG9BY3Rpdml0eUluZGV4KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gaW5kZXg7Ci0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWludCBpID0gaW5kZXggKyAxOwotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoOyAhKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgJiYgaSA8IHNpemU7IGkrKykgewotCQkJbm9kZSA9IChBY3Rpdml0eU5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQl9Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0RWxlbWVudCgpOwotCQlyZXR1cm4gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXIjbmV3Tm9kZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBuZXdOb2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSApIHsKLQkJCW5vZGUgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCk7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJbm9kZSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlub2RlID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpOwotCQl9Ci0JCWlmKG5vZGUgIT0gbnVsbCkgewotCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZShub2RlLCBlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBsaW5rLmdldFRhcmdldCgpID09IG51bGwKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFNvdXJjZSgpKQotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFdvcmtPcmRlcihXb3JrT3JkZXIgd28sIE9iamVjdCBwcmVkKSB7Ci0JCWlmICh3by5nZXRQcmVkKCkgPT0gcHJlZCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAocHJlZCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIHByZWQ7Ci0JCQkvLyBjaGVjayBpZiBwcmVkZWNlc3NvciByZWZlcmVuY2UgaW4gdGhlIGdpdmVuIHdvcmsgb3JkZXIgaXMgYmFzZSBvZgotCQkJLy8gcHJlZAotCQkJLy8KLQkJCWZvciAoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgdmUgIT0gbnVsbDsgdmUgPSB2ZQotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJaWYgKHZlID09IHdvLmdldFByZWQoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiBOb2RlIHNyYyBjYW4gcmVhY2ggTm9kZSB0YXJnZXQgYXMgdGhlIGZpcnN0IEFjdGl2aXR5Tm9kZSBpbiB0aGUKLQkgKiBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHByZWROb2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUoQWN0aXZpdHlOb2RlIHByZWROb2RlLCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkTm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSA9PSBub2RlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlCi0JCQkJCSYmIGNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShsaW5rLmdldFRhcmdldCgpLCBub2RlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElBZGFwdGVyRmFjdG9yeUZpbHRlcikgewotCQkJYWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgKChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKExpc3Q8QWN0aXZpdHlOb2RlPiBzZWxlY3RlZE5vZGVzKSB7Ci0JCWlmKHNlbGVjdGVkTm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLnBvcHVsYXRlTGlua3Moc2VsZWN0ZWROb2Rlcyk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBpbnZhbGlkIGxpbmtzCi0JCS8vCi0JCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSBudWxsOwotCQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJCWlmICgobWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbWU7Ci0JCQl9Ci0JCQlBcnJheUxpc3Q8QWN0aXZpdHlFZGdlPiBsaW5rc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eUVkZ2U+KCk7Ci0JCQlsaW5rTGlzdFdhbGs6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlCi0JCQkJCS5nZXRJbmNvbWluZ3MoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQotCQkJCWlmICh3YmUgIT0gbnVsbCkgewotCQkJCQkvLyBUT0RPOiBuZWVkIHJldmlzaXQgdG8gY2hlY2sgdGhlIHZhbGlkIGNvbm5lY3Rpb24gZnJvbSBhCi0JCQkJCS8vIEZvcmtOb2RlIG9yIEpvaW5Ob2RlCi0JCQkJCS8vCi0JCQkJCQotCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsICYmIGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkKLQkJCQkJCWNvbnRpbnVlIGxpbmtMaXN0V2FsazsKLQotCQkJCQlPYmplY3QgcHJlZCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCQlib29sZWFuIHdvcmtPcmRlckZvdW5kID0gZmFsc2U7Ci0JCQkJCWZpbmRfV29ya09yZGVyOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHdiZQotCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJaWYgKGlzVmFsaWRXb3JrT3JkZXIod28sIHByZWQpKSB7Ci0JCQkJCQkJd29ya09yZGVyRm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfV29ya09yZGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghd29ya09yZGVyRm91bmQpIHsKLQkJCQkJCS8vIGludmFsaWQgbGluaywgcmVtb3ZlIGl0Ci0JCQkJCQkvLwotCQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBsaW5rc1RvUmVtb3ZlKSB7Ci0JCQkJQnJpZGdlSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldE91dGdvaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlCcmlkZ2VIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQkJCWxpbmtzVG9SZW1vdmUgPSBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGxpbmtzIG9mIGVhY2ggQWN0aXZpdHlOb2RlCi0JCS8vIHNldCB0aGUgV29ya09yZGVyIHRvIHRoZSBsaW5rIGlmIG5lZWRlZAotCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRob3NlIFdvcmtPcmRlcnMgdGhhdCBzdGlsbCBkb24ndCBoYXZlIHRoZQotCQkvLyBjb3JyZXNwb25kaW5nIGxpbmsKLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkKLQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IHNlbGVjdGVkTm9kZXMpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZTsKLQkJCWlmICgoZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCQkvLyBHZXQgdGhlIHJhdyBkYXRhIG9mIHdvcmtvcmRlcnMgZm9yIG9iamVjdC4KLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBsb2NhbCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQlsaXN0LmFkZEFsbChsb2NhbC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpKTsKLQkJCQkKLQkJCQkvLyBHZXQgdGhlIFByZWRlY2Vzc29yIExpc3Qgb24gdG9wIG9mIHJhdyBkYXRhLCB0aGlzIGlzIG5lZWQgZm9yIGluIGNhc2Ugb2YgZXh0ZW5kLgotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkJLmFkYXB0KGxvY2FsLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpewotCQkJCQlsaXN0LmFkZEFsbCgoKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXRQcmVkZWNlc3NvcnMoKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIEl0ZXJhdGUgd29yayBvcmRlcnMgYW5kIGNyZWF0ZSBsaW5rcy4KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBudWxsOwotCQkJCQlCcmVha2Rvd25FbGVtZW50IHByZWQgPSBudWxsOwotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV29ya09yZGVyKXsKLQkJCQkJCXdvcmtPcmRlciA9IChXb3JrT3JkZXIpbmV4dDsKLQkJCQkJCXByZWQgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCQl9Ci0JCQkJCWlmKG5leHQgaW5zdGFuY2VvZiBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJCQlwcmVkID0gKEJyZWFrZG93bkVsZW1lbnQpKChXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciluZXh0KS5nZXRUYXJnZXQoKTsgCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChwcmVkICE9IG51bGwgJiYgcHJlZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlBY3Rpdml0eU5vZGUgcHJlZE5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLAotCQkJCQkJCQlwcmVkLCB0cnVlKTsKLQkJCQkJCWlmIChwcmVkTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBsaW5rIGZvciB0aGlzIHdvcmsgb3JkZXIKLQkJCQkJCQkvLyBhbHJlYWR5Ci0JCQkJCQkJLy8KLQkJCQkJCQlib29sZWFuIGxpbmtGb3VuZCA9IGZhbHNlOwotCQkJCQkJCWZpbmRfbGluazogZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBub2RlCi0JCQkJCQkJCQkuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpID09IHByZWROb2RlKSB7Ci0JCQkJCQkJCQkvLyBsaW5rIGFscmVhZHkgZXhpc3RzCi0JCQkJCQkJCQkvLyBjaGVjayBpZiB3b3JrIG9yZGVyIGlzIHNldCB0byB0aGlzIGxpbmsKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlsaW5rRm91bmQgPSB0cnVlOwotLy8JCQkJCQkJCQlNZXRob2RFbGVtZW50IG1lID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobGluayk7Ci0JCQkJCQkJCQlpZiAobGluayA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJQnJpZGdlSGVscGVyLnNldFNlbWFudGljTW9kZWwoCi0JCQkJCQkJCQkJCQlsaW5rLCB3b3JrT3JkZXIpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWsgZmluZF9saW5rOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghbGlua0ZvdW5kKSB7Ci0JCQkJCQkJCS8vIGNoZWNrIGlmIHRoaXMgV29ya09yZGVyIGNhbiBiZSByZXByZXNlbnRlZAotCQkJCQkJCQkvLyB2aWEgbGlua3Mgb2YgVHlwZWROb2RlcwotCQkJCQkJCQkvLwotCQkJCQkJCQlpZiAoIWNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShwcmVkTm9kZSwgbm9kZSkpIHsKLQkJCQkJCQkJCS8vIGFkZCBuZXcgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJCQkJCQlOb2RlQWRhcHRlciBwcmVkTm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIocHJlZE5vZGUpOwotCQkJCQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCAmJiBwcmVkTm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQkJCQkJCQlib29sZWFuIHByZWROb2RlTm90aWZ5ID0gcHJlZE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCQkJCQlwcmVkTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCQkJCQlub2RlQWRhcHRlci5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24ocHJlZCk7IAotCQkJCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJCQkJCQkJCXByZWROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZE5vZGVOb3RpZnk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNsZWFuRHVwbGljYXRlTGlua3Moc2VsZWN0ZWROb2Rlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFuRHVwbGljYXRlTGlua3MoTGlzdDxBY3Rpdml0eU5vZGU+IHNlbGVjdGVkTm9kZXMpIHsKLQkJTGlzdDxBY3Rpdml0eUVkZ2U+IGR1cGxpY2F0ZUxpbmtzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eUVkZ2U+KCk7Ci0JCWZvciAoQWN0aXZpdHlOb2RlIHdiTm9kZSA6IHNlbGVjdGVkTm9kZXMpIHsKLQkJCWlmKHdiTm9kZS5nZXRJbmNvbWluZ3MoKSAhPSBudWxsKXsKLQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRJbmNvbWluZ3MoKSk7Ci0JCQl9Ci0JCQlpZih3Yk5vZGUuZ2V0T3V0Z29pbmdzKCkgIT1udWxsKXsKLQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRPdXRnb2luZ3MoKSk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IGR1cGxpY2F0ZUxpbmtzKSB7Ci0JCQlCcmlkZ2VIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJfQotCQlkdXBsaWNhdGVMaW5rcy5jbGVhcigpOwotCQlkdXBsaWNhdGVMaW5rcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmREdXBsaWNhdGVMaW5rcyhMaXN0IGR1cGxpY2F0ZUxpbmtzLCBMaXN0IGxpbmtzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3Muc2l6ZSgpOyBpKyspIHsKLQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgbGlua3MuZ2V0KGkpOwotCQkJaWYoIWR1cGxpY2F0ZUxpbmtzLmNvbnRhaW5zKGxpbmspKXsKLQkJCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBsaW5rcy5zaXplKCk7IGorKykgewotCQkJCQlBY3Rpdml0eUVkZ2UgbGluazEgPSAoQWN0aXZpdHlFZGdlKSBsaW5rcy5nZXQoaik7Ci0JCQkJCWlmIChsaW5rMS5nZXRTb3VyY2UoKSA9PSBsaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgbGluazEuZ2V0VGFyZ2V0KCkgPT0gbGluay5nZXRUYXJnZXQoKSkgewotCQkJCQkJZHVwbGljYXRlTGlua3MuYWRkKGxpbmsxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCUhhc2hTZXQgc2VsZWN0ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCi0JCS8vIGFzc29jaWF0ZSBjb250cm9sIG5vZGVzCi0JCS8vCi0JCXNlbGVjdGVkTm9kZXMuYWRkQWxsKGFzc29jaWF0ZUNvbnRyb2xOb2RlcyhjaGlsZHJlbikpOwotCQkKLQkJLy8gYWRkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMKLQkJLy8KLQkJc2VsZWN0ZWROb2Rlcy5hZGRBbGwoYWRkRWxlbWVudE5vZGVzKGNoaWxkcmVuKSk7Ci0JCQotCQlyZXR1cm4gc2VsZWN0ZWROb2RlczsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGFzc29jaWF0ZUNvbnRyb2xOb2RlcyhDb2xsZWN0aW9uIG1ldGhvZEVsZW1lbnRzKSB7Ci0JCUxpc3QgY3RybE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihub2RlIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLS8vCQkJCS8vIHNlbGVjdCB0aGlzIGNvbnRyb2wgbm9kZSBmb3IgdGhlIGRpYWdyYW0gb25seSBpZiBpdCBoYXMgYSB0YXJnZXQgbm9kZSBvciBzb3VyY2Ugbm9kZSwKLS8vCQkJCS8vIGRpcmVjdCBvciBpbmRpcmVjdCwgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBtZXRob2QgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkCi0vLwkJCQkvLyBtZXRob2QgZWxlbWVudCBjb2xsZWN0aW9uCi0vLwkJCQkvLwotLy8JCQkJQ29sbGVjdGlvbiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCUJyaWRnZUhlbHBlci5nZXRUYXJnZXROb2RlcyhhY3ROb2Rlcywgbm9kZSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotLy8JCQkJQnJpZGdlSGVscGVyLmdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCBub2RlLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0vLwkJCQlpZighYWN0Tm9kZXMuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlBY3Rpdml0eU5vZGUgZWxlbWVudE5vZGUgPSAoQWN0aXZpdHlOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0vLwkJCQkJCWlmKG1ldGhvZEVsZW1lbnRzLmNvbnRhaW5zKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVsZW1lbnROb2RlKSkpIHsKLS8vCQkJCQkJCWlmKGFkZE5vZGVBZGFwdGVyVG8obm9kZSkgIT0gbnVsbCkgewotLy8JCQkJCQkJCWN0cmxOb2Rlcy5hZGQobm9kZSk7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJaWYoYWRkTm9kZUFkYXB0ZXJUbyhub2RlKSAhPSBudWxsKSB7Ci0JCQkJCWN0cmxOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjdHJsTm9kZXM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBlbGVtZW50IG5vZGVzIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZCBlbGVtZW50cyBpZiB0aGV5IGRvbid0IGV4aXN0IHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIExpc3QgYWRkRWxlbWVudE5vZGVzKENvbGxlY3Rpb24gbWV0aG9kRWxlbWVudHMpIHsJCi0JCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQXJyYXlMaXN0IG5ld05vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChlKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLCBjaGlsZCk7Ci0JCQkJaWYobm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5vZGUgPSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIGNoaWxkKTsKLQkJCQkJbmV3Tm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gc3luY2hyb25pemUgbmFtZSB3aXRoIGxpbmtlZCBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCVN0cmluZyBuYW1lID0gQnJpZGdlSGVscGVyLmdldE5vZGVOYW1lKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJCWlmKCFuYW1lLmVxdWFscyhub2RlLmdldE5hbWUoKSkpIHsKLQkJCQkJCW5vZGUuc2V0TmFtZShuYW1lKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYWRkTm9kZUFkYXB0ZXJUbyhub2RlKTsKLQkJCQl9Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgIWlzVGFyZ2V0UmVhZE9ubHkoKSkgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZSk7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJCQlub2RlQWRhcHRlci53cmFwcGVyID0gd3JhcHBlcjsKLQkJCQkJCS8vIHJlYWRPbmx5IGF0dHJpYnV0ZSBpcyBzdGlsbCBuZWVkZWQKLQkJCQkJCS8vIGFmdGVyIGludHJvZHVjdGlvbiBvZiB3cmFwcGVyLiAKLQkJCQkJCS8vIEZvciBleGFtcGxlLCB3ZSBjYW4gaGF2ZSBhIG5vZGUgYWRhcHRlciBmb3IgYSByZWFkLW9ubHkgYmFzZSBhY3Rpdml0eQotCQkJCQkJLy8gd2l0aG91dCBzdXBwbHlpbmcgd3JhcHBlciBmb3IgdGhpcyBiYXNlIGFjdGl2aXR5LgotCQkJCQkJLy8KLQkJCQkJCW5vZGVBZGFwdGVyLmJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobmV3Tm9kZXMpOwkJCi0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlZCBjb2RlIGZyb20gZ2V0Q2hpbGRyZW4uIGdldEFkYXB0ZXIoKSB3aWxsIHJldHVybiBBZGFwdGVyLAotCSAqIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gZmluZCBpdGVtcHJvdmlkZXIgZm9yIHRoZSBjaGlsZHJlbi4gCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGdldEFkYXB0ZXIoKXsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gd3JhcHBlcjsKLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQlnZXRFbGVtZW50KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkKLQkJCS8vVHVybiBvZmYgdGhlIFZhcmlhYmlsaXR5SW5mbyBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0uCi0JCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJCWJvb2xlYW4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gZmFsc2U7Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKXsKLQkJCQlvYmogPSAoKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXREZWxlZ2F0aW5nSXRlbVByb3ZpZGVyKCk7Ci0JCQl9Ci0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gYWRhcHRlcjsKLQkJCX0KLQkJCQotCQkJaWYob2JqIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcil7Ci0JCQkJZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuaXNFbmFibGVWYXJpYWJpbGl0eUluZm8oKTsKLQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpb2JqKS5zZXRFbmFibGVWYXJpYWJpbGl0eUluZm8oZmFsc2UpOwotCQkJfQotCQkJLy8gZW5kIG9mIHZhcmlhYmlsaXR5IGluZm8gCi0JCQkKLQkJCQotCQkJLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZ2V0T2JqZWN0KCkpOwotCQkJLy8gY29tbWVudGVkIGFib3ZlIGxpbmUsIEZvciBkaWFncmFtcyAtIHJvbGx1cCBzaG91bGQgYmUgZmFsc2UsIGZvcgotCQkJLy8gaGFuZGxpbmcgcm9sbHVwIHN0YXRlIGJlbG93IGNvZGUuCi0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZXh0cmFjdENoaWxkcmVuKGFkYXB0ZXIsIGdldEVsZW1lbnQoKSwgY2hpbGRyZW4pOwotCQkJCi0JCQkvLyByZXNldCB2YXJpYWJpbGl0eWluZm8gc3RhdHVzIGJhY2sKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLnNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhlbmFibGVWYXJpYWJpbGl0eUluZm8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCQkJCi0JCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciB0aGUgb2xkIGFjdGl2aXR5IGFuZCByZWxpbmsgaXQgdG8gaXRzCi0JCQkJLy8gYmFzZQotCQkJCS8vCi0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkJCQlpZihub2RlID09IG51bGwpIHsKLQkJCQkJbm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCQl9Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgb2xkIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIGFzc29jaWF0ZSBub2RlIHdpdGggdGhlIGJhc2UgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihiYXNlKTsKLQkJCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKG5vZGVBZGFwdGVyKTsKLQkJCQkJCW5vZGVBZGFwdGVyLmJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQlub2RlLmVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCQkJCQlub2RlQWRhcHRlci51cGRhdGVWaWV3KCk7Ci0JCQkJCQlpZighQnJpZGdlSGVscGVyLmlzSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSkpewotCQkJCQkJCUJyaWRnZUhlbHBlci5tYXJrSW5oZXJpdGVkKG5vZGVBZGFwdGVyLmdldFZpZXcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5yZW1vdmVOb2RlKG9iaik7Ci0JfQotCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyIGFkZE5vZGVBZGFwdGVyVG8oQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJaWYoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCQlpZihub2RlIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLQkJCWFkYXB0ZXIgPSBuZXcgQ29udHJvbE5vZGVBZGFwdGVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJCWlmKGUgPT0gbnVsbCkgewotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUoKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpbm9kZSk7Ci0JCQkJCWlmIChCcmlkZ2VIZWxwZXIuVU1BX1BIQVNFLmVxdWFscyh0eXBlKSkgewotCQkJCQkJZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoQnJpZGdlSGVscGVyLlVNQV9JVEVSQVRJT04uZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQllID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmKG5vZGUgaW5zdGFuY2VvZiBBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0VHlwZSgoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKW5vZGUpOwotCQkJCQlpZihCcmlkZ2VIZWxwZXIuVU1BX01JTEVTVE9ORS5lcXVhbHModHlwZSkpIHsKLQkJCQkJCWUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlciA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKGUpOwotCQkJfQotCQl9Ci0JCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJbm9kZS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCQlyZXR1cm4gYWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBBY3Rpdml0eU5vZGUgcmVhc3NvY2lhdGVCYXNlTm9kZShBY3Rpdml0eSBhY3QpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIGJhc2UgYW5kIGxpbmsgaXQgdG8gdGhlIGFjdGl2aXR5Ci0JCQkvLwotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCUFjdGl2aXR5Tm9kZSBiYXNlTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCWlmIChiYXNlTm9kZSA9PSBudWxsKSB7Ci0JCQkJYmFzZU5vZGUgPSBCcmlkZ2VIZWxwZXIuZmluZE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkJCX0KLQkJCWlmIChiYXNlTm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIGJhc2UKLQkJCQkvLwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGJhc2VOb2RlKTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYXNzb2NpYXRlIGJhc2Ugbm9kZSB3aXRoIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihhY3QpOwotCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKG5vZGVBZGFwdGVyKTsKLQkJCQkJYmFzZU5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotLy8JCQkJCWlmKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUoYmFzZU5vZGUsIGFjdCk7Ci0JCQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNJbmhlcml0ZWQobm9kZUFkYXB0ZXIuZ2V0VmlldygpKSl7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLnVubWFya0luSGVyaXRlZChub2RlQWRhcHRlci5nZXRWaWV3KCkpOwotCQkJCQkJfQotCQkJCQkJbm9kZUFkYXB0ZXIuc2V0VGFyZ2V0UmVhZE9ubHkoZmFsc2UpOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIGJhc2VOb2RlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlTm9kZShPYmplY3Qgb2xkRWxlbWVudCwgT2JqZWN0IG5ld0VsZW1lbnQpIHsKLQkJaWYobmV3RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3Igb2xkIGVsZW1lbnQgYW5kIGxpbmsgaXQgdG8gdGhlIG5ldyBlbGVtZW50Ci0JCQkvLwotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJCUFjdGl2aXR5Tm9kZSBvbGROb2RlID0gQnJpZGdlSGVscGVyLmZpbmROb2RlKGRpYWdyYW0sIG9sZEVsZW1lbnQpOwotCQkJaWYgKG9sZE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGRpc2Fzc29jaWF0ZSB3aXRoIHRoZSBvbGQgZWxlbWVudAotCQkJCS8vCi0JCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIob2xkTm9kZSk7Ci0JCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJfQotCi0JCQkJLy8gYXNzb2NpYXRlIGJhc2Ugbm9kZSB3aXRoIHRoZSBuZXcgZWxlbWVudAotCQkJCS8vCi0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG5ld0VsZW1lbnQ7Ci0JCQkJbm9kZUFkYXB0ZXIgPSBjcmVhdGVOb2RlQWRhcHRlcihlKTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWluaXRpYWxpemVOb2RlQWRhcHRlcihub2RlQWRhcHRlcik7Ci0JCQkJCW9sZE5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJCQkJbm9kZUFkYXB0ZXIudXBkYXRlVmlldygpOwotCQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKG9sZE5vZGUsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0JyaWRnZUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQnJpZGdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzIwMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvQnJpZGdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ29udHJvbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJyaWRnZUhlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRUxFTUVOVCA9ICJ1bWFfZWxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX1BIQVNFID0gIlBoYXNlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9JVEVSQVRJT04gPSAiSXRlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9BQ1RJVklUWSA9ICJBY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfVEFTS19ERVNDUklQVE9SID0gIlRhc2siOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU1BX01JTEVTVE9ORSA9ICJNaWxlc3RvbmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9JTkhFUklSRUQgPSAiaW5oZXJpdGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgRUNsYXNzPiB0eXBlU3RyaW5nVG9FQ2xhc3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEVDbGFzcz4oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0Jc3RhdGljIHsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfUEhBU0UsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEhBU0UpOwotCQl0eXBlU3RyaW5nVG9FQ2xhc3MucHV0KFVNQV9JVEVSQVRJT04sIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfQUNUSVZJVFksIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFkpOwotCQl0eXBlU3RyaW5nVG9FQ2xhc3MucHV0KFVNQV9UQVNLX0RFU0NSSVBUT1IsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SKTsKLQkJdHlwZVN0cmluZ1RvRUNsYXNzLnB1dChVTUFfTUlMRVNUT05FLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1JTEVTVE9ORSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTZW1hbnRpY01vZGVsKEFjdGl2aXR5RWRnZSBsaW5rLCBXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWFkT25seShWaWV3IHZpZXcpIHsKLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIKLQkJCQkuZ2V0Tm9kZUFkYXB0ZXIodmlldy5nZXRFbGVtZW50KCkpOwotCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZUFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpOwotCQl9Ci0JCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuICgoTm9kZSl2aWV3LmdldEVsZW1lbnQoKSkuaXNSZWFkT25seSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIGdpdmVuIHZpZXcgcmVwcmVzZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbWV0aG9kIGVsZW1lbnQgdGhhdCB0aGUgdmlldyBpcyByZXByZXNlbnRpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIHRoZSB2aWV3IGRvZXMgbm90IHJlcHJlc2VudCBhbnkgbWV0aG9kIGVsZW1lbnQgb3IgdGhlIGRpYWdyYW0KLQkgKiAgICAgICAgIG9mIHRoZSB2aWV3IGN1cnJlbnRseSBpcyBub3Qgb3BlbmVkIGluIGEgZGlhZ3JhbSBlZGl0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoVmlldyB2aWV3KSB7Ci0JCXJldHVybiBnZXRNZXRob2RFbGVtZW50KHZpZXcuZ2V0RWxlbWVudCgpKTsKLQl9CQotCQotCS8qKgotCSAqIEdldHMgdGhlIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIGdpdmVuIGRpYWdyYW0gbW9kZWwgb2JqZWN0IHJlcHJlc2VudHMuCi0JICogCi0JICogQHBhcmFtIG1vZGVsT2JqZWN0Ci0JICogQHJldHVybiBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBtb2RlbCBvYmplY3QgaXMgcmVwcmVzZW50aW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGUgbW9kZWwgb2JqZWN0IGRvZXMgbm90IHJlcHJlc2VudCBhbnkgbWV0aG9kIGVsZW1lbnQgb3IgdGhlIGRpYWdyYW0KLQkgKiAgICAgICAgIG9mIHRoZSBtb2RlbCBvYmplY3QgY3VycmVudGx5IGlzIG5vdCBvcGVuZWQgaW4gYSBkaWFncmFtIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChFT2JqZWN0IG1vZGVsT2JqZWN0KSB7Ci0JCWlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChMaW5rZWRPYmplY3QpbW9kZWxPYmplY3QpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIGlmKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIG1vZGVsT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldE1ldGhvZEVsZW1lbnQoVmlldyB2aWV3LCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IG93bmVyKSB7Ci0JCUVPYmplY3QgbW9kZWxPYmplY3QgPSB2aWV3LmdldEVsZW1lbnQoKTsKLQkJaWYobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBMaW5rZWRPYmplY3QpIHsKLQkJCXJldHVybiAoKExpbmtlZE9iamVjdCltb2RlbE9iamVjdCkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQl9Ci0JCWVsc2UgaWYobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG93bmVyLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKChFTW9kZWxFbGVtZW50KSBtb2RlbE9iamVjdCwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoVmlldyB2aWV3KSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTmFtZWROb2RlKSB7Ci0JCQlyZXR1cm4gKChOYW1lZE5vZGUpZWxlbWVudCkuaXNTdXBwcmVzc2VkKCk7Ci0JCX0KLQkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBnZXROb2RlQWRhcHRlcihlbGVtZW50KTsKLQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlPYmplY3QgbyA9IG5vZGVBZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQlpZihvID09IG51bGwpIHsKLQkJCQkJbyA9IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKTsKLQkJCQl9Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBhY3Rpdml0eSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50KHZpZXcuZ2V0RGlhZ3JhbSgpKTsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpOwotCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQkJcmV0dXJuIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotLy8JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VtYW50aWNNb2RlbChWaWV3IHZpZXcpIHsKLS8vCQlFT2JqZWN0IGVsZW1lbnQgPSB2aWV3LmdldEVsZW1lbnQoKTsKLS8vCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotLy8JCQlyZXR1cm4gZ2V0U2VtYW50aWNNb2RlbEZyb21Bbm5vdGF0aW9uKGVsZW1lbnQsIHByb2Nlc3MsIGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQl9Ci0vLwkJZWxzZSBpZihlbGVtZW50IGluc3RhbmNlb2YgKQotLy8JCQkKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUxpbmsoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJLy8gVE9ETzogc3RpbGwgbmVlZCB0byBkaXNhYmxlIG5vdGlmaWNhdGlvbiBiZWZvcmUgcmVtb3ZpbmcgbGluaz8/PwotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IGxpbmsuZ2V0QWN0aXZpdHkoKTsKLQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSBsaW5rLmdldFNvdXJjZSgpOwotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0Tm9kZSA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCWJvb2xlYW4gc3JjTm90aWZ5ID0gc291cmNlTm9kZSAhPSBudWxsID8gc291cmNlTm9kZS5lRGVsaXZlcigpIDogZmFsc2U7Ci0JCWJvb2xlYW4gdGFyZ2V0Tm90aWZ5ID0gdGFyZ2V0Tm9kZSAhPSBudWxsID8gdGFyZ2V0Tm9kZS5lRGVsaXZlcigpCi0JCQkJOiBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWlmICh0YXJnZXROb2RlICE9IG51bGwpIHsKLQkJCQl0YXJnZXROb2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQlpZihhY3Rpdml0eSAhPSBudWxsKXsKLQkJCQlhY3Rpdml0eS5nZXRFZGdlcygpLnJlbW92ZShsaW5rKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKHNyY05vdGlmeSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcih0YXJnZXROb3RpZnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZHMgbm9kZSB3aG9zZSBsaW5rZWQgb2JqZWN0IG9yIG9uZSBvZiBpdHMgYmFzZSBpcyB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eU5vZGUgZmluZE5vZGUoQWN0aXZpdHkgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0LAotCQkJYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQlpZiAob2JqZWN0ID09IGUpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0gZWxzZSBpZiAoY2hlY2tCYXNlICYmIGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgdmUgIT0gbnVsbDsgdmUgPSB2ZQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlpZiAodmUgPT0gb2JqZWN0KSB7Ci0JCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaEJhcihBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZSBpbnN0YW5jZW9mIEZvcmtOb2RlIHx8IG5vZGUgaW5zdGFuY2VvZiBKb2luTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBub2RlIHdob3NlIGxpbmtlZCBvYmplY3QgaXMgdGhlIGdpdmVuIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5Tm9kZSBmaW5kTm9kZShBY3Rpdml0eSBjb250YWluZXIsIE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29udGFpbmVyLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iamVjdCA9PSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGdldFByb3h5VVJJKE1ldGhvZEVsZW1lbnQgZSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGUuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2UpIHsKLQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2UpIHJlc291cmNlKS5nZXRQcm94eVVSSShlKTsKLQkJfSBlbHNlIGlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2UuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQoZS5nZXRHdWlkKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBBc3NvY2lhdGVzIGEge0BsaW5rIEVNb2RlbEVsZW1lbnR9IHdpdGggYSB7QGxpbmsgTWV0aG9kRWxlbWVudH0gYnkKLQkgKiBjcmVhdGluZyBvciB1cGRhdGluZyB0aGUgVU1BX0VMRU1FTlQgYW5ub3RhdGlvbiBvZiB0aGUgZ2l2ZW4KLQkgKiB7QGxpbmsgRU1vZGVsRWxlbWVudH0uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogQHNlZSAjYWRkRUFubm90YXRpb24oRU1vZGVsRWxlbWVudCwgTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXNzb2NpYXRlKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBtZSkgewotCQlFQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWRkRUFubm90YXRpb24oZWxlbWVudCwgbWUpOwotCQlpZihhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gZ2V0VHlwZShtZSk7Ci0JCQlpZih0eXBlICE9IG51bGwpIHsKLQkJCQlhbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoVU1BX1RZUEUsIHR5cGUpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVDbGFzcyBnZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiB0eXBlU3RyaW5nVG9FQ2xhc3MuZ2V0KHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYobWUgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJcmV0dXJuIFVNQV9QSEFTRTsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gVU1BX0lURVJBVElPTjsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gVU1BX01JTEVTVE9ORTsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgewotCQkJcmV0dXJuIFVNQV9BQ1RJVklUWTsKLQkJfQotCQllbHNlIGlmKG1lIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBVTUFfVEFTS19ERVNDUklQVE9SOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCS8qKgotLy8JICogQ3JlYXRlcyBvciB1cGRhdGVzIHRoZSBVTUFfRUxFTUVOVCBhbm5vdGF0aW9uIGZvciB0aGUgZ2l2ZW4KLS8vCSAqIHtAbGluayBFTW9kZWxFbGVtZW50fSB3aXRoIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBvciBpdHMgd3JhcHBlcgotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHBhcmFtIG1lCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgRUFubm90YXRpb24gYWRkRUFubm90YXRpb24oRU1vZGVsRWxlbWVudCBlbGVtZW50LCBPYmplY3QgYnJlYWtkb3duRWxlbWVudE9yV3JhcHBlcikgewotLy8JCVN0cmluZyB1cmlTdHIgPSBudWxsOwotLy8JCWlmKGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0vLwkJCVVSSSB1cmkgPSBnZXRQcm94eVVSSSgoTWV0aG9kRWxlbWVudCkgYnJlYWtkb3duRWxlbWVudE9yV3JhcHBlcik7Ci0vLwkJCWlmKHVyaSAhPSBudWxsKSB7Ci0vLwkJCQl1cmlTdHIgPSB1cmkudG9TdHJpbmcoKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIGlmKGJyZWFrZG93bkVsZW1lbnRPcldyYXBwZXIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0vLwkJCXVyaVN0ciA9IFN1cHByZXNzaW9uLmdldFBhdGgoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBicmVha2Rvd25FbGVtZW50T3JXcmFwcGVyKTsKLS8vCQl9Ci0vLwkJaWYodXJpU3RyICE9IG51bGwpIHsKLS8vCQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLS8vCQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLS8vCQkJCWVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotLy8JCQkJZUFubm90YXRpb24uc2V0U291cmNlKFVNQV9FTEVNRU5UKTsKLS8vCQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkuYWRkKGVBbm5vdGF0aW9uKTsKLS8vCQkJfQotLy8JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9VUkksIHVyaVN0cik7Ci0vLwkJCXJldHVybiBlQW5ub3RhdGlvbjsKLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBvciB1cGRhdGVzIHRoZSBVTUFfRUxFTUVOVCBhbm5vdGF0aW9uIGZvciB0aGUgZ2l2ZW4KLQkgKiB7QGxpbmsgRU1vZGVsRWxlbWVudH0gd2l0aCB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVBbm5vdGF0aW9uIGFkZEVBbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJVVJJIHVyaSA9IGdldFByb3h5VVJJKG1lKTsKLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotCQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQllQW5ub3RhdGlvbiA9IEVjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCQllQW5ub3RhdGlvbi5zZXRTb3VyY2UoVU1BX0VMRU1FTlQpOwotCQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkuYWRkKGVBbm5vdGF0aW9uKTsKLQkJCX0KLQkJCWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoVU1BX1VSSSwgdXJpLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIGVBbm5vdGF0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KEVNb2RlbEVsZW1lbnQgZSkgewotCQlFT2JqZWN0IG8gPSBlOwotCQlmb3IoOyBvICE9IG51bGwgJiYgIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpOyBvID0gby5lQ29udGFpbmVyKCkpOwotCQlyZXR1cm4gKEFjdGl2aXR5KSBvOwotCX0KLQkKLS8vCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbWFudGljTW9kZWxGcm9tQW5ub3RhdGlvbihFTW9kZWxFbGVtZW50IG1vZGVsLCBQcm9jZXNzIHByb2Nlc3MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0vLwkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBtb2RlbC5nZXRFQW5ub3RhdGlvbihVTUFfRUxFTUVOVCk7Ci0vLwkJaWYgKGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIHVyaVN0ciA9IChTdHJpbmcpIGVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoVU1BX1VSSSk7Ci0vLwkJCWlmICh1cmlTdHIgIT0gbnVsbCkgewotLy8JCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkodXJpU3RyKTsKLS8vCQkJCWlmKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSkpIHsKLS8vCQkJCQlFT2JqZWN0IG8gPSBwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkuZ2V0RU9iamVjdCh1cmksIGZhbHNlKTsKLS8vCQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLS8vCQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KSBvOwotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCS8vIFRPRE86IGxvZyBlcnJvcgotLy8JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vdCBhIG1ldGhvZCBlbGVtZW50OiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQkvLyBtdXN0IGJlIGEgd3JhcHBlciBwYXRoCi0vLwkJCQkJLy8KLS8vCQkJCQlTdHJpbmdbXSBndWlkUGF0aCA9IHVyaS5zZWdtZW50cygpOwotLy8JCQkJCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jZXNzKS5nZXRPYmplY3RCeVBhdGgoZ3VpZFBhdGgsIGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgbm9kZSwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBub2RlLmdldEVBbm5vdGF0aW9uKFVNQV9FTEVNRU5UKTsKLQkJaWYgKGVBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB1cmkgPSAoU3RyaW5nKSBlQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkuZ2V0KFVNQV9VUkkpOwotCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJRU9iamVjdCBvID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdCgKLQkJCQkJCVVSSS5jcmVhdGVVUkkodXJpKSwgZmFsc2UpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIG87Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTm90IGEgbWV0aG9kIGVsZW1lbnQ6ICIgKyBvKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgZWxlbWVudCB0aGF0IHRoZSBnaXZlbiBkaWFncmFtIG1vZGVsIG9iamVjdCByZXByZXNlbnRzCi0JICogYW5kIHN0b3JlcyB0aGUgbGlua2FnZSBpbmZvIGluIGl0cyBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB0aGUgZGlhZ3JhbSBtb2RlbCBvYmplY3QKLQkgKiBAcmV0dXJuIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhlIG1vZGVsIG9iamVjdCBpcyByZXByZXNlbnRpbmcgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtb2RlbCBvYmplY3QgZG9lcyBub3QgcmVwcmVzZW50IGFueQotCSAqICAgICAgICAgbWV0aG9kIGVsZW1lbnQgb3IgdGhlIGRpYWdyYW0gb2YgdGhlIG1vZGVsIG9iamVjdCBjdXJyZW50bHkgaXMKLQkgKiAgICAgICAgIG5vdCBvcGVuZWQgaW4gYSBkaWFncmFtIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKEVNb2RlbEVsZW1lbnQgbm9kZSkgewkJCi0JCUFjdGl2aXR5IGRpYWdyYW0gPSBnZXRBY3Rpdml0eShub2RlKTsKLQkJaWYoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IGdldE5vZGVBZGFwdGVyKGRpYWdyYW0pOwotCQlpZihub2RlQWRhcHRlciA9PSBudWxsIHx8IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5vZGVBZGFwdGVyLmdldEVsZW1lbnQoKS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG5vZGUsIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChFTW9kZWxFbGVtZW50IG5vZGUpIHsKLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCXJldHVybiBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIuZ2V0RWxlbWVudCgpCi0JCQkJOiBnZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24obm9kZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBOb2RlQWRhcHRlciBnZXROb2RlQWRhcHRlcihFT2JqZWN0IG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgTm9kZUFkYXB0ZXIpIHsKLQkJCQkJcmV0dXJuIChOb2RlQWRhcHRlcikgYWRhcHRlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbUFkYXB0ZXIgZ2V0RGlhZ3JhbUFkYXB0ZXIoRU9iamVjdCBub2RlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBEaWFncmFtQWRhcHRlcikgewotCQkJCXJldHVybiAoRGlhZ3JhbUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIGdldCB0aGUgc291cmNlcyBvZiBTeW5jQmFyIChGb3JrTm9kZSBvciBKb2luTm9kZSkgaW5Db21taW5nCi0JICogY29ubmVjdGlvbnMgYW5kIGlmIHN5bmNiYXIgaGF2ZSBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gZGVjaXNpb24gcG9pbnQsCi0JICogYW5kIGRlY2lzaW9uIHBvaW50IGhhdmUgaW5jb21taW5nIGNvbm5lY3Rpb25zICh3b3JrYnJlYWRkb3duIGVsZW10bnMpCi0JICogY29sbGVjdGlvbnMgd2lsbCBpZ25vcmUgYWxsIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIGZyb20gZGVjaXNpb24gcG9pbnQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTeW5jQmFyU291cmNlTm9kZXMoQWN0aXZpdHlOb2RlIG5vZGUsCi0JCQlDb2xsZWN0aW9uIGFjdE5vZGVzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQlpZiAoZ2V0TWV0aG9kRWxlbWVudChzb3VyY2UpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoaXNTeW5jaEJhcihzb3VyY2UpKSB7Ci0JCQkJZ2V0U3luY0JhclNvdXJjZU5vZGVzKHNvdXJjZSwgYWN0Tm9kZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSB0aGF0IGFyZSBkaXJlY3Qgb3IgaW5kaXJlY3QgdGFyZ2V0cyBvZgotCSAqIHRoZSBnaXZlbiBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBhY3ROb2RlcwotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRUYXJnZXROb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmICh0eXBlLmlzSW5zdGFuY2UoZ2V0TWV0aG9kRWxlbWVudCh0YXJnZXQpKSkgewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQkJCWdldFRhcmdldE5vZGVzKGFjdE5vZGVzLCB0YXJnZXQsIHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3VjY2Vzc29yTm9kZXMoQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzLCBBY3Rpdml0eU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEFjdGl2aXR5RWRnZSBsaW5rIDogbm9kZS5nZXRPdXRnb2luZ3MoKSkgewotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmIChnZXRNZXRob2RFbGVtZW50KHRhcmdldCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCQl9IGVsc2UgaWYgKGlzU3luY2hCYXIodGFyZ2V0KSkgewotCQkJCQlnZXRTdWNjZXNzb3JOb2RlcyhhY3ROb2RlcywgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UHJlZGVjZXNzb3JOb2RlcyhDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMsIEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWZvciAoQWN0aXZpdHlFZGdlIGxpbmsgOiBub2RlLmdldEluY29taW5ncygpKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKGdldE1ldGhvZEVsZW1lbnQoc291cmNlKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWFjdE5vZGVzLmFkZChzb3VyY2UpOwotCQkJCX0gZWxzZSBpZiAoaXNTeW5jaEJhcihzb3VyY2UpKSB7Ci0JCQkJCWdldFByZWRlY2Vzc29yTm9kZXMoYWN0Tm9kZXMsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhbGwgbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSB0aGF0IGFyZSBkaXJlY3Qgb3IgaW5kaXJlY3Qgc291cmNlcyBvZgotCSAqIHRoZSBnaXZlbiBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBhY3ROb2RlcwotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmlldwotCSAqLwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFNvdXJjZU5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIEFjdGl2aXR5Tm9kZSBub2RlLAotCQkJQ2xhc3MgdHlwZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShnZXRNZXRob2RFbGVtZW50KHNvdXJjZSkpKSB7Ci0JCQkJCWFjdE5vZGVzLmFkZChzb3VyY2UpOwotCQkJCX0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgQ29udHJvbE5vZGUpIHsKLQkJCQkJZ2V0U291cmNlTm9kZXMoYWN0Tm9kZXMsIHNvdXJjZSwgdHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogTWV0aG9kIHRvIGNvbGxlY3Qgc3luY2hyb25pemF0aW9uIGJhciBvdXRnb2luZyBjb25uZWN0aW9uCi0JICogZXhjZXB0IGFueSBjb25uZWN0aW9uIGdvaW5nIHRvIGRlY2lzaW9uIHBvaW50cy4gIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoQWN0aXZpdHlOb2RlIHR5cGVkTm9kZSwgQ29sbGVjdGlvbiBhY3ROb2Rlcyl7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmKEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHRhcmdldCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCl7Ci0JCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJCX0gZWxzZSBpZiAoaXNTeW5jaEJhcih0YXJnZXQpKSB7Ci0JCQkJCWdldFN5bmNCYXJUYXJnZXROb2Rlcyh0YXJnZXQsIGFjdE5vZGVzKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHRvIGNoZWNrIGJlZm9yZSBkZWxldGluZyBhIGxpbmsuIElmIGR1cGxpY2F0ZSBwcmVkZWNlc3NvciBleGlzdHMKLQkgKiBpbiB0aGUgbGVnYWN5IGRhdGEsIGNoZWNrIGlmIGRlbGV0aW5nIGxpbmsgc2hvdWxkIHJlbW92ZSBhbGwgdGhlCi0JICogcHJlZGVjZXNzb3JzIG9yIG5vdCBieSB2ZXJpZnlpbmcgaWYgdGFyZ2V0IG9yIGluZGlyZWN0IHRhcmdldCBoYXZlIGRpcmVjdAotCSAqIG9yIGluZGlyZWN0IGxpbmtzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5SZW1vdmVBbGxQcmVkcyhBY3Rpdml0eUVkZ2UgbGluaywgQWN0aXZpdHlOb2RlIG9sZFNvdXJjZSwKLQkJCUFjdGl2aXR5Tm9kZSBvbGRUYXJnZXQpIHsKLQkJTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gZ2V0TWV0aG9kRWxlbWVudChvbGRUYXJnZXQpOwotCQlpZiAodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlMaXN0IGlubGlzdCA9IG9sZFRhcmdldC5nZXRJbmNvbWluZ3MoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGlubGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgaW5jb21pbmdsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRvci5uZXh0KCk7Ci0JCQkJLy8gUkFUTEMwMDM4NDI0NSA6IFByZWRlY2Vzc29yIGNoYW5nZXMgc2hvdWxkIGJlIGRvbmUgb25seSBpbgotCQkJCS8vIGNhc2Ugb2YgU3luY2hyb25pemF0aW9uIEJhci4KLQkJCQlpZiAoaXNTeW5jaEJhcihpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkpKSB7Ci0JCQkJCUNvbGxlY3Rpb24gY29sID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJCQkJZ2V0U291cmNlTm9kZXMoY29sLCBpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCksCi0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCQkJCQlpZiAoY29sLmNvbnRhaW5zKG9sZFNvdXJjZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpICE9IG51bGwgJiYKLQkJCQkJCWdldE1ldGhvZEVsZW1lbnQoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkuZXF1YWxzKG9sZFNvdXJjZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFya0luaGVyaXRlZChFTW9kZWxFbGVtZW50IGVsZW1lbnQpIHsKLQkJRUFubm90YXRpb24gZUFubm90YXRpb24gPSBlbGVtZW50LmdldEVBbm5vdGF0aW9uKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJaWYgKGVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWVBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJZUFubm90YXRpb24uc2V0U291cmNlKEFOTk9UQVRJT05fSU5IRVJJUkVEKTsKLQkJCWVsZW1lbnQuZ2V0RUFubm90YXRpb25zKCkuYWRkKGVBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5tYXJrSW5IZXJpdGVkKEVNb2RlbEVsZW1lbnQgZWxlbWVudCkgewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oQU5OT1RBVElPTl9JTkhFUklSRUQpOwotCQlpZiAoZUFubm90YXRpb24gIT0gbnVsbCkgewotCQkJZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKS5yZW1vdmUoZUFubm90YXRpb24pOwotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNvcHlEaWFncmFtKERpYWdyYW0gYmFzZURpYWdyYW0pIHsKLQkJRGlhZ3JhbSBjb3B5ID0gKERpYWdyYW0pIEVjb3JlVXRpbC5jb3B5KGJhc2VEaWFncmFtKTsKLQotCQkvLyBIQUNLOgotCQkvLyBnbyB0aHJ1IHRoZSBub2RlcyBvZiB0aGUgZGlhZ3JhbSBjb3B5LCBpZiBhbnkgbm9kZSBpcyBhIFVJLW9ubHkgbm9kZQotCQkvLyAoc2VlIFR5cGVkTm9kZSkKLQkJLy8gc2F2ZSB0aGUgR1VJRCBvZiB0aGUgb3JpZ2luYWwgb25lIGluIGl0cyBicmllZkRlc2NyaXB0aW9uIHRvIHJlbWVtYmVyCi0JCS8vIHdobyBpcyBiYXNlLgotCQkvLwotLy8JCWludCBzaXplID0gY29weS5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLS8vCQkJR3JhcGhOb2RlIGdOb2RlID0gKEdyYXBoTm9kZSkgY29weS5nZXRDb250YWluZWQoKS5nZXQoaSk7Ci0vLwkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmlzVUlHcmFwaE5vZGUoZ05vZGUpKSB7Ci0vLwkJCQlnTm9kZS5zZXRCcmllZkRlc2NyaXB0aW9uKCgoRGlhZ3JhbUVsZW1lbnQpIGJhc2VEaWFncmFtCi0vLwkJCQkJCS5nZXRDb250YWluZWQoKS5nZXQoaSkpLmdldEd1aWQoKSk7Ci0vLwkJCX0KLS8vCQl9Ci0JCUxpc3QgY2hpbGRyZW4gPSBjb3B5LmdldENoaWxkcmVuKCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uc2l6ZSgpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgY2hpbGRyZW4uZ2V0KGkpOwotCQkJbWFya0luaGVyaXRlZCh2aWV3KTsKLQkJfQotCi0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUxpc3QgYWRkRUFubm90YXRpb25EZXRhaWwoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGV0YWlsTmFtZSwgU3RyaW5nIGRldGFpbFZhbHVlICkgewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotCQlpZiAoZUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJZUFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVBbm5vdGF0aW9uKCk7Ci0JCQllQW5ub3RhdGlvbi5zZXRTb3VyY2UoVU1BX0VMRU1FTlQpOwotCQkJLy8gZGV0YWlsIG11c3QgYmUgcHV0IGJlZm9yZSB0aGUgbmV3IGFubm90YXRpb24gY2FuIGJlIGFkZGVkIHRvIHRoZSBhbm5vdGF0aW9uIGxpc3QKLQkJCS8vIHNvIGFueSBhZGFwdGVyIHRoYXQgbGlzdGVuIHRvIGNoYW5nZSBpbiB0aGUgYW5ub3RhdGlvbiBsaXN0IGNhbiBnZXQgdGhlIGRldGFpbHMKLQkJCS8vIHdoZW4gaXQgZ2V0cyBub3RpZmllZC4KLQkJCS8vCi0JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9UWVBFLCBkZXRhaWxWYWx1ZSk7Ci0JCQllbGVtZW50LmdldEVBbm5vdGF0aW9ucygpLmFkZChlQW5ub3RhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllQW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KFVNQV9UWVBFLCBkZXRhaWxWYWx1ZSk7Ci0JCX0JCQotCQlyZXR1cm4gZWxlbWVudC5nZXRFQW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQvb3IgYWRkcyB0aGUgZUFubm90YXRpb24gZGV0YWlsIGZvciB0eXBlLiB7QGxpbmsgQnJpZGdlSGVscGVyLlVNQV9UWVBFfQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMaXN0IGFkZEVBbm5vdGF0aW9uVHlwZShFTW9kZWxFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0eXBlKSB7Ci0JCUVMaXN0IHJlc3VsdCA9IGFkZEVBbm5vdGF0aW9uRGV0YWlsKGVsZW1lbnQsIFVNQV9UWVBFLCB0eXBlKTsKLQkJCi0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKEFjdGl2aXR5Tm9kZSkgZWxlbWVudDsKLS8vCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlIG5vZGUgPSAoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSBlbGVtZW50OwotCQkJTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7CQkJCQotCQkJaWYoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgJiYgCi0JCQkJCXR5cGUgIT0gbnVsbCAmJiAhdHlwZS5lcXVhbHMoQnJpZGdlSGVscGVyLmdldFR5cGUoZSkpKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGUgY3VycmVudGx5IGxpbmtlZCBtZXRob2QgZWxlbWVudCB3aXRoIHRoZSByaWdodCBvbmUKLQkJCQkvLwotCQkJCUVDbGFzcyByaWdodFR5cGUgPSBnZXRUeXBlKHR5cGUpOwotCQkJCWlmKHJpZ2h0VHlwZSAhPSBudWxsKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnQgcmlnaHRFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShyaWdodFR5cGUpOwotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5IGFjdGl2aXR5ID0gKChCcmVha2Rvd25FbGVtZW50KWUpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlpZihhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCQkJbGlzdC5zZXQobGlzdC5pbmRleE9mKGUpLCByaWdodEVsZW1lbnQpOwotCQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCQkJCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKHJpZ2h0RWxlbWVudCk7Ci0JCQkJCQkJLy8gQWxzbyBzZXQgdGhlIHJpZ2h0RWxlbWVudCB0byBpdHMgb3duIHByb2Nlc3MgcGFja2FnZS4KLQkJCQkJCQlMaXN0IGNoaWxkUGtncyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQkJCQkJaWYgKCFjaGlsZFBrZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkKLQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlQcm9jZXNzUGFja2FnZSBjaGlsZCA9IChQcm9jZXNzUGFja2FnZSkgaXRlcgotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQkJCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IHBMaXN0ID0gY2hpbGQKLQkJCQkJCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCQkJCQkJCWlmICghcExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJaWYgKHBMaXN0LmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCQkJCXBMaXN0LnNldChwTGlzdC5pbmRleE9mKGUpLAotCQkJCQkJCQkJCQkJCXJpZ2h0RWxlbWVudCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBhc3NvY2lhdGUgdGhlIG5ldyBtZXRob2QgZWxlbWVudCB3aXRoIHRoZSBub2RlCi0JCQkJCQkvLwotCQkJCQkJYXNzb2NpYXRlKG5vZGUsIHJpZ2h0RWxlbWVudCk7Ci0JCQkJCQkvLyByZW1vdmUgb2xkIG5vZGUgYWRhcHRlciBhbmQgYWRkIG5ldyBvbmUKLQkJCQkJCS8vCi0JCQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlub2RlQWRhcHRlci5kaXNwb3NlKCk7Ci0JCQkJCQl9CQkJCQkKLQkJCQkJCURpYWdyYW1BZGFwdGVyIGRpYWdyYW1BZGFwdGVyID0gKERpYWdyYW1BZGFwdGVyKSBnZXROb2RlQWRhcHRlcihub2RlLmdldEFjdGl2aXR5KCkpOwotCQkJCQkJZGlhZ3JhbUFkYXB0ZXIuYWRkTm9kZUFkYXB0ZXJUbyhub2RlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogVG8gZ2V0IHRoZSBlQW5ub3RhdGlvbiBkZXRhaWwgYmFzZWQgb24gbmFtZS4gKGVnOiB0eXBlKQotCSAqIEBkZXByZWNhdGVkIHJlcGxhY2VkIHdpdGgge0BsaW5rICNnZXRFQW5ub3RhdGlvbkRldGFpbChFTW9kZWxFbGVtZW50LCBTdHJpbmcpfQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVBbm5vdGF0aW9uVHlwZShFTW9kZWxFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBkZXRhaWxOYW1lKSB7Ci0JCXJldHVybiBnZXRFQW5ub3RhdGlvbkRldGFpbChlbGVtZW50LCBkZXRhaWxOYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RUFubm90YXRpb25EZXRhaWwoRU1vZGVsRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgZGV0YWlsTmFtZSkgewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGVsZW1lbnQuZ2V0RUFubm90YXRpb24oVU1BX0VMRU1FTlQpOwotCQlpZihlQW5ub3RhdGlvbiAhPSBudWxsKXsKLQkJCXJldHVybiAoU3RyaW5nKWVBbm5vdGF0aW9uLmdldERldGFpbHMoKS5nZXQoZGV0YWlsTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGUoQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIGdldEVBbm5vdGF0aW9uRGV0YWlsKG5vZGUsIFVNQV9UWVBFKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgdHlwZSBjb25zdGFudHM6IHtAbGluayAjVU1BX0FDVElWSVRZfSwKLQkgKiAgICAgICAgIHtAbGluayAjVU1BX0lURVJBVElPTn0sIHtAbGluayAjVU1BX01JTEVTVE9ORX0sCi0JICogICAgICAgICB7QGxpbmsgI1VNQV9QSEFTRX0sIHtAbGluayAjVU1BX1RBU0tfREVTQ1JJUFRPUn0sCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIEl0ZXJhdGlvbikgewotCQkJcmV0dXJuIFVNQV9JVEVSQVRJT047Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCXJldHVybiBVTUFfUEhBU0U7Ci0JCX0KLQkJZWxzZSBpZihlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgewotCQkJcmV0dXJuIFVNQV9BQ1RJVklUWTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBVTUFfTUlMRVNUT05FOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVU1BX1RBU0tfREVTQ1JJUFRPUjsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChFTW9kZWxFbGVtZW50IGUpewotCQlFQW5ub3RhdGlvbiBlQW5ub3RhdGlvbiA9IGUuZ2V0RUFubm90YXRpb24oQU5OT1RBVElPTl9JTkhFUklSRUQpOwotCQlpZiAoZUFubm90YXRpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHNvdXJjZSA9IGVBbm5vdGF0aW9uLmdldFNvdXJjZSgpOwotCQkJaWYoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBFQ2xhc3MgZ2V0RUNsYXNzRnJvbVR5cGUoU3RyaW5nIGFubm90YXRpb25UeXBlKSB7Ci0JCWlmKFVNQV9BQ1RJVklUWS5lcXVhbHMoYW5ub3RhdGlvblR5cGUpKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQkJfQotCQllbHNlIGlmKFVNQV9JVEVSQVRJT04uZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCQl9IGVsc2UgaWYoVU1BX01JTEVTVE9ORS5lcXVhbHMoYW5ub3RhdGlvblR5cGUpKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCk7Ci0JCX0gZWxzZSBpZihVTUFfUEhBU0UuZXF1YWxzKGFubm90YXRpb25UeXBlKSkgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCk7Ci0JCX0gZWxzZSBpZihVTUFfVEFTS19ERVNDUklQVE9SLmVxdWFscyhhbm5vdGF0aW9uVHlwZSkpIHsKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gbm9kZS5nZXRBY3Rpdml0eSgpOwotCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChwYXJlbnRBY3QpOwotCQlNZXRob2RFbGVtZW50IG9iaiA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwotCQlpbnQgY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSBhY3QgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkgZWxlbWVudDsKLQkJQXJyYXlMaXN0IHNpYmxpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IGNsYXNzSUQpIHsKLQkJCQlzaWJsaW5ncy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGJhc2VOYW1lID0gTWVzc2FnZUZvcm1hdAotCQkJCS5mb3JtYXQoCi0JCQkJCQlEaWFncmFtUmVzb3VyY2VzLmRlZmF1bHRCYXNlTmFtZSwgbmV3IE9iamVjdFtdIHsgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmouZUNsYXNzKCkuZ2V0TmFtZSgpKSB9KTsgCi0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoc2libGluZ3MsIG9iaiwgYmFzZU5hbWUpOwotCQlub2RlLnNldE5hbWUob2JqLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmlldyBnZXRWaWV3KFZpZXcgZGlhZ3JhbSwgT2JqZWN0IG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyBjaGlsZCA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkLmdldEVsZW1lbnQoKSA9PSBub2RlKSB7Ci0JCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCQkJaWYoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjaGlsZC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlWaWV3IGVsZW1lbnQgPSAoVmlldykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZihlbGVtZW50LmdldEVsZW1lbnQoKSA9PSBub2RlKSB7Ci0JCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBub2RlIG5hbWUgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlTmFtZShNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJfQotCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKERlc2NyaWJhYmxlRWxlbWVudCllKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9Db250cm9sTm9kZUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0NvbnRyb2xOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWVkMzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL0NvbnRyb2xOb2RlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29udHJvbE5vZGVBZGFwdGVyIGV4dGVuZHMgTm9kZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNZXRob2RFbGVtZW50IHNyY0VsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKTsKLQkJaWYgKHNyY0VsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJaWYgKEJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlCcmlkZ2VIZWxwZXIuZ2V0U3luY0JhclRhcmdldE5vZGVzKGxpbmsKLQkJCQkJCS5nZXRUYXJnZXQoKSwgdGFyZ2V0QWN0Tm9kZXMpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcih0YXJnZXRFbGVtZW50LCBzcmNFbGVtZW50KSA9PSBudWxsKSB7Ci0JCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKG5vZGUsIChXb3JrQnJlYWtkb3duRWxlbWVudCkgc3JjRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoQnJpZGdlSGVscGVyLmlzU3luY2hCYXIobGluay5nZXRTb3VyY2UoKSkpIHsKLQkJCS8vIFByZWRlY2Vzc29yIHNob3VsZCBiZSBjcmVhdGVkIG9ubHkgaW4gY2FzZSBvZgotCQkJLy8gU3luY3Jvbml6YXRpb24gQmFyLCBub3QgZm9yIERlY2lzaW9uUG9pbnQuCi0JCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQnJpZGdlSGVscGVyLmdldFN5bmNCYXJTb3VyY2VOb2RlcyhsaW5rLmdldFNvdXJjZSgpLCBzcmNBY3ROb2Rlcyk7Ci0JCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQnJpZGdlSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcyhsaW5rLmdldFRhcmdldCgpLCB0YXJnZXRBY3ROb2Rlcyk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldEFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5Tm9kZSBub2RlID0gKChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc3JjQWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIKLQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KChBY3Rpdml0eU5vZGUpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChub2RlKSwgcHJlZCkgPT0gbnVsbCkgewotCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCBwcmVkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKEFjdGl2aXR5RWRnZSBsaW5rLCBBY3Rpdml0eU5vZGUgb2xkU291cmNlLCBBY3Rpdml0eU5vZGUgb2xkVGFyZ2V0KSB7Ci0JCUNvbGxlY3Rpb24gc3JjQWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7CQkJCi0JCUJyaWRnZUhlbHBlci5nZXRTb3VyY2VOb2RlcyhzcmNBY3ROb2Rlcywgb2xkU291cmNlLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JCU1ldGhvZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFRhcmdldCk7Ci0JCWlmICh0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHRhcmdldFdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0RWxlbWVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gT2JqZWN0IHByZWQgPSAoKE5vZGUpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0T2JqZWN0KCk7Ci0JCQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVXb3JrT3JkZXIoKE5hbWVkTm9kZUltcGwpCi0JCQkJLy8gb2xkVGFyZ2V0LCBwcmVkKTsKLQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoQnJpZGdlSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG5vZGUsIG9sZFRhcmdldCkpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBzcmNFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7CQkJCQkKLQkJCQkJV29ya09yZGVyIHdvOwotCQkJCQl3aGlsZSAoKHdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKHRhcmdldFdiZSwgc3JjRWxlbWVudCkpICE9IG51bGwpIHsKLQkJCQkJCWdldEFjdGlvbk1hbmFnZXIoKS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5SRU1PVkUsIHRhcmdldFdiZSwgCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd28sIC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChvbGRUYXJnZXQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkgewotCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUJyaWRnZUhlbHBlci5nZXRUYXJnZXROb2Rlcyh0YXJnZXRBY3ROb2RlcywKLQkJCQkJb2xkVGFyZ2V0LCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0KLQkJCS8vIHJlbW92ZSB0aGUgd29yayBvcmRlcnMgb2YgdGFyZ2V0IGFjdGl2aXRpZXMgdGhhdCBoYXZlIHRoZQotCQkJLy8gcHJlZGVjZXNzb3IgaW4gc3JjQWN0Tm9kZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9ICgoQWN0aXZpdHlOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkvLyBPYmplY3QgcHJlZCA9ICgoTm9kZSkgaXRlcmF0b3IubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVXb3JrT3JkZXIobm9kZSwgcHJlZCk7Ci0JCQkJCUFjdGl2aXR5Tm9kZSBwcmVkbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKEJyaWRnZUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBwcmVkbm9kZSwKLQkJCQkJCQlub2RlKSkgewotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgdGFyZ2V0RSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IHNyY0VsZW1lbnQgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChwcmVkbm9kZSk7Ci0JCQkJCQlXb3JrT3JkZXIgd287Ci0JCQkJCQl3aGlsZSAoKHdvID0gVW1hVXRpbC5maW5kV29ya09yZGVyKHRhcmdldEUsIHNyY0VsZW1lbnQpKSAhPSBudWxsKSB7Ci0JCQkJCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgdGFyZ2V0RSwgCi0JCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IsIHdvLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9EaWFncmFtQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvRGlhZ3JhbUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhY2Y1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2JyaWRnZS9EaWFncmFtQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUm9sbGJhY2tFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFydGl0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFkYXB0ZXIgZXh0ZW5kcyBOb2RlQWRhcHRlciB7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGJhc2VBY3Q7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJvdGVjdGVkIGxvbmcgdW1hTGFzdE1vZGlmaWVkOwotCi0KLQlwdWJsaWMgRGlhZ3JhbUFkYXB0ZXIoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQl0aGlzKChBY3Rpdml0eSkgVG5nVXRpbC51bndyYXAod3JhcHBlcikpOwotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQliYXNpY1NldFRhcmdldFJlYWRPbmx5KHdyYXBwZXIuaXNSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgRGlhZ3JhbUFkYXB0ZXIoQWN0aXZpdHkgZSkgewotCQlzdXBlcihlKTsKLQotCQkvLyBsaXN0ZW5zIHRvIGNoYW5nZSBpbiB0aGUgYmFzZSBhY3Rpdml0eSBpZiB0aGVyZSBpcyBhbnkKLQkJLy8KLQkJaWYgKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQliYXNlQWN0ID0gKEFjdGl2aXR5KSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkuYWRkKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRpc3Bvc2UgYWxsIG5vZGUgYWRhcHRlcnMgb2YgdGhlIGNoaWxkIG5vZGVzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQlpZiAobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCW5vZGVBZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEFjdGl2aXR5QWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCUNvbGxlY3Rpb24gbmV3Tm9kZXNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQWN0aXZpdHkuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSAoQWN0aXZpdHlOb2RlKSBhZGROb2RlKG1zZwotCQkJCQkJCS5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IGJhc2VBY3QpIHsKLQkJCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSkKLQkJCQkJCQkJCS5iYXNpY1NldFRhcmdldFJlYWRPbmx5KHRydWUpOwotCQkJCQkJCW5ld05vZGVzVG9SZWZyZXNoLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCXJlbW92ZU5vZGUobXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJQ29sbGVjdGlvbiBub2RlcyA9IGFkZE5vZGVzKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChtc2cuZ2V0Tm90aWZpZXIoKSA9PSBiYXNlQWN0KSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlub2RlID0gKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpCi0JCQkJCQkJCQkuYmFzaWNTZXRUYXJnZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJCQluZXdOb2Rlc1RvUmVmcmVzaC5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlbW92ZU5vZGVzKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCW1vdmVOb2RlKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQlyZXBsYWNlTm9kZShtc2cuZ2V0T2xkVmFsdWUoKSwgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBzdXBlci5oYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCX0KLQkJCXJldHVybiBuZXdOb2Rlc1RvUmVmcmVzaDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQlzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX19OT0RFOgotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uOwotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIChBY3Rpdml0eU5vZGUpIG1zZwotCQkJCQkJLmdldE5ld1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQlub2RlUmVtb3ZlZCgoQWN0aXZpdHlOb2RlKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIG5vZGUpOwotCQkJCX0KLQotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJbm9kZVJlbW92ZWQoKEFjdGl2aXR5Tm9kZSkgaXRlci5uZXh0KCkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VOb2RlKE9iamVjdCBvbGRFbGVtZW50LCBPYmplY3QgbmV3RWxlbWVudCkgewotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJcG9wdWxhdGVMaW5rcyhnZXROb2RlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhMaXN0PEFjdGl2aXR5Tm9kZT4gc2VsZWN0ZWROb2RlcykgewotCQkvLyBmaWxsIG91dGdvaW5nL2luY29taW5nIGNvbm5lY3Rpb24gbGlzdHMgb2YgYWxsIG5vZGVzCi0JCS8vCi0JCWludCBzaXplID0gc2VsZWN0ZWROb2Rlcy5zaXplKCk7Ci0JCWJvb2xlYW5bXSBub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQl0cnkgewotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gZm9yIGFsbCBub2RlcyBpbiB0aGlzIGRpYWdyYW0gdG8gYXZvaWQKLQkJCS8vIHVud2FudGVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBzZWxlY3RlZE5vZGVzLmdldChpKTsKLQkJCQlub3RpZmllc1tpXSA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBzZWxlY3RlZE5vZGVzKSB7Ci0JCQkJcG9wdWxhdGVMaW5rcyhub2RlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlzZWxlY3RlZE5vZGVzLmdldChpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXROb2RlcygpIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbCA/IGdldERpYWdyYW0oKS5nZXROb2RlcygpIDogQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSBnZXRUYXJnZXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVOb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKCFUbmdVdGlsLmlzSW5zdGFuY2VPZihnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSwgb2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIG9iaik7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRPdXRnb2luZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eUVkZ2UgbGluayA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCX0KLQkJbm9kZS5nZXRPdXRnb2luZ3MoKS5jbGVhcigpOwotCQlub2RlLmdldEluY29taW5ncygpLmNsZWFyKCk7Ci0KLQkJZ2V0Tm9kZXMoKS5yZW1vdmUobm9kZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU5vZGVzKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJcmVtb3ZlTm9kZShpdGVyLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGFkZE5vZGUoT2JqZWN0IG9iaikgewotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IGFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlwb3B1bGF0ZUxpbmtzKG5vZGUsIHRydWUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGROb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWFkZE5vZGUobm9kZXMsIGl0ZXIubmV4dCgpKTsKLQkJfQotCi0JCS8vIHVzZSBhZGRBbGwoKSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBub3RpZmljYXRpb25zCi0JCS8vCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotCS8qKgotCSAqIEluIFByb2Nlc3MgV0JTLCBpZiBicmVha2Rvd25lbGVtZW50IGlzIG1vdmVkIHVwIG9yIGRvd24sIGRpYWdyYW0gc2hvdWxkCi0JICogYmUgdXBkYXRlZCBhY2NvcmRpbmdseS4gU3ViLWNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBkaWFncmFtCi0JICogbmVlZHMgdXBkYXRlIG9uIG1vdmUuCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IG9sZFZhbHVlKSB7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBpbmNvbWluZy9vdXRnb2luZyBsaW5rcyBvZiB0aGUgZ2l2ZW4gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhBY3Rpdml0eU5vZGUgbm9kZSwgYm9vbGVhbiBkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCS8vIGludCBzaXplID0gMDsKLQkJLy8gYm9vbGVhbltdIG5vdGlmaWVzID0gbnVsbDsKLQkJLy8gdHJ5IHsKLQkJLy8gaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJLy8gc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQkvLyBub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQkvLyAvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkvLyAvLyB1bndhbnRlZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGVpciBjb25uZWN0aW9uIGxpc3QKLQkJLy8gLy8KLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJLy8gTm9kZSBjaGlsZCA9ICgoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSkpOwotCQkvLyBub3RpZmllc1tpXSA9IGNoaWxkLmVEZWxpdmVyKCk7Ci0JCS8vIGNoaWxkLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIEdyYXBoTm9kZSBncmFwaE5vZGUgPSBub2RlLmdldEdyYXBoTm9kZSgpOwotCQkvLyBpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5maWxsQ29ubmVjdGlvbnMobm9kZSwgZ3JhcGhOb2RlKTsKLQkJLy8gfQotCQkvLyB9IGZpbmFsbHkgewotCQkvLyBpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkvLyAvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCS8vIC8vCi0JCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCS8vICgoRU9iamVjdCkgZ2V0Tm9kZXMoKS5nZXQoaSkpLmVTZXREZWxpdmVyKG5vdGlmaWVzW2ldKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5ldyBub2RlIGZvciB0aGlzIGRpYWdyYW0gZm9yIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlBY3Rpdml0eU5vZGUgbm9kZSA9IG5ld05vZGUoZSk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW5pdGlhbGl6ZU5vZGUobm9kZSwgZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTm9kZUFkYXB0ZXIoTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIpIHsKLQkJbm9kZUFkYXB0ZXIuc2V0RWRpdGluZ0RvbWFpbihkb21haW4pOwotCQlub2RlQWRhcHRlci5hY3Rpb25NYW5hZ2VyID0gYWN0aW9uTWFuYWdlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVOb2RlKEFjdGl2aXR5Tm9kZSBub2RlLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZU5hbWUoZSk7Ci0JCW5vZGUuc2V0TmFtZShuYW1lKTsJCQotCi0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlpZiAobm9kZUFkYXB0ZXIgIT0gbnVsbCAmJiBub2RlQWRhcHRlci5nZXRFbGVtZW50KCkgIT0gZSkgewotCQkJbm9kZUFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJbm9kZUFkYXB0ZXIgPSBudWxsOwotCQl9Ci0JCWlmIChub2RlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlub2RlQWRhcHRlciA9IGNyZWF0ZU5vZGVBZGFwdGVyKGUpOwotCQkJaW5pdGlhbGl6ZU5vZGVBZGFwdGVyKG5vZGVBZGFwdGVyKTsKLQkJCW5vZGUuZUFkYXB0ZXJzKCkuYWRkKG5vZGVBZGFwdGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBOb2RlQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcihNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5Tm9kZSBuZXdOb2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vZGUgZm9yIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCA8Y29kZT5vYmo8L2NvZGU+IGFuZAotCSAqIGFkZCBpdCB0byB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiBub2RlcwotCSAqIAotCSAqIEBwYXJhbSBub2RlcwotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChUbmdVdGlsLmlzSW5zdGFuY2VPZihnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSwgb2JqKSkgewotCQkJQWN0aXZpdHlOb2RlIG5vZGUgPSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQnJlYWtkb3duRWxlbWVudC5jbGFzcyk7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotCQlyZXR1cm4gKEFjdGl2aXR5KSBlbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VbWFNb2RlbChBY3Rpdml0eU5vZGUgcmVtb3ZlZE5vZGUpIHsKLQkJT2JqZWN0IGU7Ci0JCWlmICgoZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KHJlbW92ZWROb2RlKSkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBnZXRBY3Rpdml0eSgpLCAKLQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCBlLCAtMSk7Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVW1hTW9kZWwocmVtb3ZlZE5vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4dHJhY3RDaGlsZHJlbihJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgT2JqZWN0IG9iamVjdCwgQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQkvLyBkaXNhYmxlIHJvbGx1cCBiZWZvcmUgZ2V0dGluZyB0aGUgY2hpbGRyZW4KLQkJLy8KLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcil7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIGZpbHRlciBvdXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZG9uJ3QgZmlsdGVyIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQkvL2NoaWxkcmVuLmFkZEFsbChhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkLXVwIGZsYWcKLQkJCS8vCi0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHN1cHByZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQl9CQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVWaWV3KENvbGxlY3Rpb248Pz4gc2VsZWN0ZWROb2RlcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBSb2xsYmFja0V4Y2VwdGlvbiB7Ci0JCXVwZGF0ZVZpZXcoZ2V0VmlldygpLCBzZWxlY3RlZE5vZGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVWaWV3KFZpZXcgdmlldywgQ29sbGVjdGlvbjw/PiBzZWxlY3RlZE5vZGVzKSB7Ci0JCS8vIHNob3cgdGhlIHNlbGVjdGVkIG5vZGVzIGFuZCBoaWRlIGFsbCB0aGUgb3RoZXIKLQkJLy8JCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgbm9kZSA9IChWaWV3KSBpdGVyLm5leHQoKTsKLQkJCWlmKHNlbGVjdGVkTm9kZXMuY29udGFpbnMobm9kZS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlLmdldEVsZW1lbnQoKSk7Ci0JCQkJaWYoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCWFkYXB0ZXIudXBkYXRlVmlldygpOwotCQkJCX0KLS8vCQkJCWlmKCFub2RlLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLS8vCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCW5vZGUuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFydGl0aW9uKSB7Ci0JCQkJCXVwZGF0ZVZpZXcobm9kZSwgc2VsZWN0ZWROb2Rlcyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZighbm9kZS5pc1Zpc2libGUoKSkgewotCQkJCQkJbm9kZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRWRnZXMoQ29sbGVjdGlvbiBzZWxlY3RlZE5vZGVzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFJvbGxiYWNrRXhjZXB0aW9uIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0VmlldygpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IG5vZGUgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihzZWxlY3RlZE5vZGVzLmNvbnRhaW5zKG5vZGUuZ2V0RWxlbWVudCgpKSkgewotCQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRFbGVtZW50KCkpOwotCQkJCWFkYXB0ZXIudXBkYXRlVmlldygpOwotLy8JCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJbm9kZS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShub2RlLCB0cnVlKTsKLS8vCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmKG5vZGUuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCXNldEVkZ2VWaXNpYmlsaXR5KG5vZGUsIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYoIW5vZGUuaXNWaXNpYmxlKCkpIHsKLQkJCQkJCW5vZGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCXNldEVkZ2VWaXNpYmlsaXR5KG5vZGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0RWRnZVZpc2liaWxpdHkoVmlldyB2aWV3LCBib29sZWFuIHZpc2liaWxpdHkpewotCQlEaWFncmFtIGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoZWRnZS5nZXRTb3VyY2UoKSA9PSB2aWV3IHx8IGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gdmlldyl7Ci0JCQkJaWYodmlzaWJpbGl0eSl7Ci0JCQkJCXZpZXcuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQkJZWRnZS5zZXRWaXNpYmxlKHZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgZGlhZ3JhbSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIFVNQSBtb2RlbC4gU3ViY2xhc3Mgc2hvdWxkCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVEaWFncmFtKCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlmaW5hbCBMaXN0PEFjdGl2aXR5Tm9kZT4gc2VsZWN0ZWROb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsJCQkKLQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRpYWdyYW0sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJc2VsZWN0ZWROb2Rlcy5hZGRBbGwocG9wdWxhdGVOb2RlcygpKTsKLQkJCQkJcG9wdWxhdGVMaW5rcyhzZWxlY3RlZE5vZGVzKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJCQotCQkJLy8gYWRkIHRoaXMgZGlhZ3JhbSB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiBhbGwgbm9kZXMgc28gdGhleSB3aWxsIG5vdAotCQkJLy8gYmUgZGlzcG9zZWQKLQkJCS8vIGJlZm9yZSB0aGlzIGRpYWdyYW0uCi0JCQkvLwotCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IHNlbGVjdGVkTm9kZXMpIHsKLQkJCQlOb2RlQWRhcHRlciBub2RlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKTsKLQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCW5vZGVBZGFwdGVyLmFkZENvbnN1bWVyKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJdXBkYXRlRWRnZXMoc2VsZWN0ZWROb2Rlcyk7Ci0JCQkJCQl1cGRhdGVWaWV3KHNlbGVjdGVkTm9kZXMpOwotCQkJCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBwb3B1bGF0ZU5vZGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCQotCXB1YmxpYyBJQWN0aW9uTWFuYWdlciBnZXRBY3Rpb25NYW5hZ2VyKCkgewotCQlpZihhY3Rpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCWFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCQlib29sZWFuIHJldCA9IHN1cGVyLmRvQWN0aW9uKGFjdGlvblR5cGUsIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsIGluZGV4KTsKLQkJCQkJaWYocmV0KSB7Ci0JCQkJCQl1bWFMYXN0TW9kaWZpZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmV0OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbk1hbmFnZXI7Ci0JfQotCQotCXB1YmxpYyBsb25nIGdldFVtYUxhc3RNb2RpZmllZCgpIHsKLQkJcmV0dXJuIHVtYUxhc3RNb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvTm9kZUFkYXB0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL05vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZjg4ZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5vZGVBZGFwdGVyIGV4dGVuZHMgQWRhcHRlckltcGwgewotCQotCXByb3RlY3RlZCBjbGFzcyBNZXRob2RFbGVtZW50QWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIC8vaW1wbGVtZW50cyBJTm9kZUNoYW5nZUxpc3RlbmVyIAotCXsKLQkJLyoqCi0JCSAqIAotCQkgKiBAcGFyYW0gbXNnCi0JCSAqIEByZXR1cm4gTmV3IG5vZGVzIHdob3NlIHZpZXdzIG5lZWQgcmVmcmVzaCBhZnRlciB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCQlzZXROYW1lKG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKGZpbmFsIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmKGRvbWFpbiA9PSBudWxsIHx8IGRvbWFpbi5nZXRDaGFuZ2VSZWNvcmRlcigpID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZpbmFsIENvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBuZXdOb2Rlc1RvUmVmcmVzaCA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGRvbWFpbiwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCW5ld05vZGVzVG9SZWZyZXNoLmFkZEFsbChoYW5kbGVOb3RpZmljYXRpb24obXNnKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJaWYoIW5ld05vZGVzVG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWZvciAoQWN0aXZpdHlOb2RlIG5vZGUgOiBuZXdOb2Rlc1RvUmVmcmVzaCkgewotCQkJCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSkudXBkYXRlVmlldygpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE5vZGVBZGFwdGVyIGdldE5vZGVBZGFwdGVyKCkgewotCQkJcmV0dXJuIE5vZGVBZGFwdGVyLnRoaXM7Ci0JCX0KLQotCX0KLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCXByaXZhdGUgQ29sbGVjdGlvbiBjb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRBZGFwdGVyIG1ldGhvZEVsZW1lbnRBZGFwdGVyOwotCXByaXZhdGUgYm9vbGVhbiB0YXJnZXRSZWFkT25seTsKLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcjsKLQlwcm90ZWN0ZWQgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0JcHJpdmF0ZSBWaWV3IHZpZXc7Ci0JcHJvdGVjdGVkIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1hbmFnZXI7Ci0JCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIElBY3Rpb25NYW5hZ2VyIGdldEFjdGlvbk1hbmFnZXIoKSB7Ci0JCWlmKGFjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjdGlvbk1hbmFnZXI7Ci0JCX0KLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZ2V0Tm9kZSgpLmdldEFjdGl2aXR5KCkpOwotCQlyZXR1cm4gbm9kZUFkYXB0ZXIuZ2V0QWN0aW9uTWFuYWdlcigpOwotCX0KLQkKLQlwdWJsaWMgTm9kZUFkYXB0ZXIoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQl0aGlzKChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKSk7Ci0JCXRoaXMud3JhcHBlciA9IHdyYXBwZXI7Ci0JCXRhcmdldFJlYWRPbmx5ID0gd3JhcHBlci5pc1JlYWRPbmx5KCk7Ci0JfQotCi0JcHVibGljIE5vZGVBZGFwdGVyKE1ldGhvZEVsZW1lbnQgZSkgewotCQllbGVtZW50ID0gZTsKLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQllLmVBZGFwdGVycygpLmFkZChtZXRob2RFbGVtZW50QWRhcHRlcik7CQkKLQl9CQkJCi0JCi0JcHVibGljIFZpZXcgZ2V0VmlldygpIHsKLQkJaWYodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmlldzsKLQkJfQotCQlWaWV3IGRpYWdyYW1WaWV3ID0gZ2V0RGlhZ3JhbVZpZXcoKTsKLQkJaWYoZGlhZ3JhbVZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5nZXRWaWV3KGRpYWdyYW1WaWV3LCBnZXROb2RlKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFZpZXcgZ2V0RGlhZ3JhbVZpZXcoKSB7Ci0JCUFjdGl2aXR5IGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCWlmKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihkaWFncmFtKTsKLQkJCWlmKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBhZGFwdGVyLmdldFZpZXcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3KFZpZXcgdmlldykgewotCQl0aGlzLnZpZXcgPSB2aWV3OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRpbmdEb21haW4oSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4pIHsKLQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JfQotCQkJCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRSZWFkT25seSgpIHsKLQkJaWYodGFyZ2V0UmVhZE9ubHkpICB7Ci0JCQlyZXR1cm4gdGFyZ2V0UmVhZE9ubHk7Ci0JCX0KLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBnZXREaWFncmFtKCk7Ci0JCWlmKGFjdGl2aXR5ICE9IHRhcmdldCkgewotCQkJTm9kZUFkYXB0ZXIgZGlhZ3JhbUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoYWN0aXZpdHkpOwotCQkJaWYoZGlhZ3JhbUFkYXB0ZXIgIT0gbnVsbCAmJiBkaWFncmFtQWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0VGFyZ2V0UmVhZE9ubHkoYm9vbGVhbiBiKSB7Ci0JCXRhcmdldFJlYWRPbmx5ID0gYjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXRSZWFkT25seShib29sZWFuIHRhcmdldFJlYWRPbmx5KSB7Ci0JCWJvb2xlYW4gdXBkYXRlVmlldyA9IHRoaXMudGFyZ2V0UmVhZE9ubHkgIT0gdGFyZ2V0UmVhZE9ubHk7Ci0JCXRoaXMudGFyZ2V0UmVhZE9ubHkgPSB0YXJnZXRSZWFkT25seTsKLQkJaWYodXBkYXRlVmlldykgewotCQkJdXBkYXRlVmlldygpOwotCQl9Ci0JfQkJCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaWV3KCkgewotCQlWaWV3IG5vZGUgPSBnZXRWaWV3KCk7Ci0JCWlmKG5vZGUgIT0gbnVsbCkgewotLy8JCQlub2RlLnNldE11dGFibGUoIWlzVGFyZ2V0UmVhZE9ubHkoKSk7Ci0JCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBub2RlLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLS8vCQkJaWYoc3R5bGUgIT0gbnVsbCkgewotLy8JCQkJQ29sb3IgY29sb3IgPSBpc1RhcmdldFJlYWRPbmx5KCkgPyBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SIDogRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfQ09MT1I7Ci0vLwkJCQlzdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihjb2xvci5nZXRSR0IoKSkuaW50VmFsdWUoKSk7Ci0vLwkJCX0KLQkJCWlmKHN0eWxlID09IG51bGwpIHsKLQkJCQlub2RlLmNyZWF0ZVN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50QWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWN0aXZpdHlOb2RlIGdldE5vZGUoKSB7Ci0JCWlmKHRhcmdldCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCQkJcmV0dXJuIChBY3Rpdml0eU5vZGUpIHRhcmdldDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGdldERpYWdyYW0oKSB7Ci0JCWlmKHRhcmdldCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gKEFjdGl2aXR5KSB0YXJnZXQ7Ci0JCX0KLQkJQWN0aXZpdHlOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCXJldHVybiBub2RlICE9IG51bGwgPyBub2RlLmdldEFjdGl2aXR5KCkgOiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlBY3Rpdml0eU5vZGUgc3JjTm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIHNvdXJjZSwgdHJ1ZSk7Ci0JCWlmIChzcmNOb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiBzcmNOb2RlIGJlZm9yZSBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbGluawotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIFVNQSBkYXRhCi0JCS8vCi0JCU5vZGVBZGFwdGVyIHNyY05vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHNyY05vZGUpOwotCQlib29sZWFuIG5vdGlmeSA9IHNyY05vZGVBZGFwdGVyICE9IG51bGwgPyBzcmNOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZihzcmNOb2RlQWRhcHRlciAhPSBudWxsKSBzcmNOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eUVkZ2UgZWRnZSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRyb2xGbG93KCk7Ci0JCQllZGdlLnNldFNvdXJjZShzcmNOb2RlKTsKLQkJCWVkZ2Uuc2V0VGFyZ2V0KGdldE5vZGUoKSk7Ci0JCQlnZXREaWFncmFtKCkuZ2V0RWRnZXMoKS5hZGQoZWRnZSk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKHNyY05vZGVBZGFwdGVyICE9IG51bGwpIHNyY05vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQWN0aXZpdHlFZGdlIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlBY3Rpdml0eU5vZGUgdGFyZ2V0Tm9kZSA9IEJyaWRnZUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIHRhcmdldCk7Ci0JCWlmICh0YXJnZXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvZiB0YXJnZXROb2RlIGJlZm9yZSBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgbGluawotCQkvLyBzbyBpdCB3aWxsIG5vdCBjcmVhdGUgZHVwbGljYXRlIFVNQSBkYXRhCi0JCS8vCi0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKHRhcmdldE5vZGUpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVBZGFwdGVyICE9IG51bGwgPyBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eUVkZ2UgZWRnZSA9IGdldERpYWdyYW0oKS5jcmVhdGVFZGdlKCIiLCBVTUxQYWNrYWdlLkxpdGVyYWxzLkNPTlRST0xfRkxPVyk7IC8vJE5PTi1OTFMtMSQKLQkJCWVkZ2Uuc2V0U291cmNlKGdldE5vZGUoKSk7Ci0JCQllZGdlLnNldFRhcmdldCh0YXJnZXROb2RlKTsKLQkJCXJldHVybiBlZGdlOwotCQl9IGZpbmFsbHkgewotCQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb25zdW1lciB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGNvbnN1bWVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWlmICghY29uc3VtZXJzLmNvbnRhaW5zKGNvbnN1bWVyKSkgewotCQkJY29uc3VtZXJzLmFkZChjb25zdW1lcik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29uc3VtZXIgZnJvbSB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuIERpc3Bvc2VzCi0JICogdGhlIG5vZGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjb25zdW1lciBhZnRlciB0aGlzIGNhbGwuIERpc3Bvc2luZwotCSAqIGEgbm9kZSB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZyB0aGlzIG5vZGUncyBsaXN0ZW5lciBmcm9tIHRoZSBVTUEKLQkgKiBvYmplY3QgYW5kIGFsbCB0aGUgYWRhcHRlcnMgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgYWRhcHRlciBsaXN0IG9mCi0JICogdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQljb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYgKGNvbnN1bWVycy5pc0VtcHR5KCkpIHsKLQkJCS8vIG5vIG1vcmUgY29uc3VtZXIgb2YgdGhpcyBub2RlLCBpdCBzaG91bGQgYmUgZGlzcG9zZWQKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBzZXQgZG9tYWluIHRvIG51bGwgYmVmb3JlIHJlbW92aW5nIG1ldGhvZEVsZW1lbnRBZGFwdGVyIGZyb20gdGhlCi0JCS8vIG1ldGhvZCBlbGVtZW50IHNvIG1ldGhvZEVsZW1lbnQgY2FuIHNraXAgaGFuZGxpbmcgUkVNT1ZFX0FEQVBURVIgZXZlbnQKLQkJLy8gdGhhdCBzb21ldGltZXMgcmVxdWlyZXMgbmV3IHRyYW5zYWN0aW9uIHRvIGJlIGNyZWF0ZWQgYW5kIGNhdXNlcyBkZWFkLWxvY2sKLQkJLy8KLQkJZG9tYWluID0gbnVsbDsKLQkJRU9iamVjdCBvYmogPSBlbGVtZW50OwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJaWYodGFyZ2V0ICE9IG51bGwpIHsKLQkJCXRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCX0KLQkJCi0JCWVsZW1lbnQgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdTdHJpbmdWYWx1ZSkgewotCQlBY3Rpdml0eU5vZGUgZSA9IGdldE5vZGUoKTsKLQkJaWYoZSAhPSBudWxsKSB7Ci0JCQllLnNldE5hbWUobmV3U3RyaW5nVmFsdWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5Tm9kZS5jbGFzcykpIHsKLQkJY2FzZSBVTUxQYWNrYWdlLkFDVElWSVRZX05PREVfX05BTUU6Ci0JCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5TRVQKLQkJCQkJJiYgZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCVN0cmluZyBuZXdOYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKChCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KCkpOwotCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuZXdOYW1lKTsKLQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGUuZ2V0TmFtZSgpKSkgewotCQkJCQllLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVNTFBhY2thZ2UuQUNUSVZJVFlfTk9ERV9fSU5DT01JTkc6IC8vIGluY29taW5nIGNvbm5lY3Rpb25zCi0JCQlBY3Rpdml0eUVkZ2UgbGluazsKLQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJbGluayA9IChBY3Rpdml0eUVkZ2UpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCWFkZFRvVU1BKGxpbmspOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWFkZFRvVU1BKChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJbGluayA9IChBY3Rpdml0eUVkZ2UpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRTb3VyY2UoKSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLnJlbW92ZUZyb21VTUEobGluaywgbGluawotCQkJCQkJCQkuZ2V0U291cmNlKCksIChBY3Rpdml0eU5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRTb3VyY2UoKSk7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJbm9kZUFkYXB0ZXIucmVtb3ZlRnJvbVVNQShsaW5rLAotCQkJCQkJCQkJbGluay5nZXRTb3VyY2UoKSwgKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuOwotCQljYXNlIFVNTFBhY2thZ2UuQUNUSVZJVFlfTk9ERV9fT1VUR09JTkc6Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlub2RlQWRhcHRlci5hZGRUb1VNQShsaW5rKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRUYXJnZXQoKSk7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLmFkZFRvVU1BKGxpbmspOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCXJlbW92ZUZyb21VTUEobGluaywgKEFjdGl2aXR5Tm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCWxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJcmVtb3ZlRnJvbVVNQShsaW5rLCAoQWN0aXZpdHlOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSwgbGluawotCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQlyZXR1cm47Ci0JCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQl9IGZpbmFsbHkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZGF0YSBmb3IgdGhlIG5ld2x5IGFkZGVkIG5vZGUgdG8gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgQWN0aXZpdHlOb2RlIG5vZGUpIHsJCQotLy9UT0RPOiByZXZpZXcKLS8vCQlpZiAoYWRkZWROb2RlLmdldEdyYXBoTm9kZSgpID09IG51bGwpIHsKLS8vCQkJLy8gdGhpcyBub2RlIGlzIHJlYWRkZWQgYWZ0ZXIgdW5kbwotLy8JCQkvLwotLy8JCQkoKE5vZGVJbXBsKSBhZGRlZE5vZGUpLmJhc2ljU2V0T2JqZWN0KGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0vLwkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChpbnQgaW5kZXgsIEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlpZihub2RlQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlub2RlQWRhcHRlciA9IGFkZE5vZGVBZGFwdGVyVG8obm9kZSk7Ci0JCX0KLQkJYWRkVG9VbWFNb2RlbChpbmRleCwgbm9kZSk7CQkKLQkJaWYobm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJbm9kZUFkYXB0ZXIuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIE5vZGVBZGFwdGVyIGFkZE5vZGVBZGFwdGVyVG8oQWN0aXZpdHlOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGRhdGEgZm9yIHRoZSByZW1vdmVkIG5vZGUgZnJvbSB0aGUgVU1BIG1vZGVsIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVtYU1vZGVsKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vZGVSZW1vdmVkKEFjdGl2aXR5Tm9kZSBub2RlKSB7Ci0JCXJlbW92ZUZyb21VbWFNb2RlbChub2RlKTsKLQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCW5vZGVBZGFwdGVyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoQWN0aXZpdHlFZGdlIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbCB8fCBsaW5rLmdldFNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7CQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoQWN0aXZpdHlFZGdlIGxpbmssIEFjdGl2aXR5Tm9kZSBvbGRTb3VyY2UsIEFjdGl2aXR5Tm9kZSBvbGRUYXJnZXQpIHsKLQkJTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQob2xkVGFyZ2V0KTsKLQkJaWYgKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gdGhpcyBpcyBhIGRpcmVjdCBsaW5rCi0JCQkvLyByZW1vdmUgV29ya09yZGVyCi0JCQkvLwotCQkJTm9kZUFkYXB0ZXIgdGFyZ2V0Tm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIob2xkVGFyZ2V0KTsKLQkJCWJvb2xlYW4gbm90aWZ5ID0gdGFyZ2V0Tm9kZUFkYXB0ZXIgIT0gbnVsbCA/IHRhcmdldE5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgOiBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJaWYodGFyZ2V0Tm9kZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0YXJnZXROb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChCcmlkZ2VIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgb2xkU291cmNlLAotCQkJCQkJb2xkVGFyZ2V0KSkgewotCQkJCQlPYmplY3QgcHJlZCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG9sZFNvdXJjZSk7Ci0JCQkJCWlmKHByZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQob2xkVGFyZ2V0KTsKLQkJCQkJCUNvbGxlY3Rpb248V29ya09yZGVyPiB3b3JrT3JkZXJzID0gVW1hVXRpbC5maW5kV29ya09yZGVyKGUsIChXb3JrQnJlYWtkb3duRWxlbWVudCkgcHJlZCwgdHJ1ZSk7Ci0JCQkJCQlpZighd29ya09yZGVycy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIGUsIAotCQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SLCB3b3JrT3JkZXJzLCAtMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmKHRhcmdldE5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdGFyZ2V0Tm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZihvbGRUYXJnZXQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSAmJiBCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcihvbGRUYXJnZXQpKSB7Ci0JCQkvLyBnZXQgYWxsIHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzIHRoYXQgdGhpcyBzeW5jaCBiYXIgaXMKLQkJCS8vIGNvbWluZyB0byBhbmQKLQkJCS8vIHJlbW92ZSB0aGUgV29ya09yZGVycyB3aXRoIHRoaXMgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlJ3MKLQkJCS8vIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yIGZyb20gdGhlbQotCQkJLy8KLQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJQnJpZGdlSGVscGVyLmdldFN1Y2Nlc3Nvck5vZGVzKGFjdE5vZGVzLCBvbGRUYXJnZXQpOwotCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IGFjdE5vZGVzKSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQobm9kZSk7Ci0JCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobm9kZSk7Ci0JCQkJYm9vbGVhbiBub3RpZnkgPSBub2RlQWRhcHRlciAhPSBudWxsID8gbm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA6IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoQnJpZGdlSGVscGVyLmNhblJlbW92ZUFsbFByZWRzKGxpbmssIG9sZFNvdXJjZSwgbm9kZSkpIHsKLQkJCQkJCVdvcmtPcmRlciB3bzsKLQkJCQkJCXdoaWxlICgod28gPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoZSwgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQob2xkU291cmNlKSkpICE9IG51bGwpIHsKLQkJCQkJCQlnZXRBY3Rpb25NYW5hZ2VyKCkuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBlLCAKLQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd28sIC0xKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCW5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogYWRkRGVmYXVsdFdvcmtPcmRlciBpcyBtb3ZlZCBmcm9tCi0JICogR3JhcGhpY2FsRGF0YUhlbHBlci5hZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwsCi0JICogV29ya2JyZWFrZG93bkVsZW1lbnQpIE1ldGhvZCB3aWxsIHNldCBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgdG8gZmFsc2UKLQkgKiBvZiBhbGwgYWRhcHRlcnMgb2YgdHlwZSBNZXRob2RFbGVtZW50QWRhcHRlciBvZiBTdWNjZXNzb3Igb2JqZWN0IGJlZm9yZQotCSAqIGNyZWF0aW5nIGEgV29ya09yZGVyIG9iamVjdC4gQWZ0ZXIgY3JlYXRpb24gb2YgV29ya09yZGVyIChQcmVkZWNlc3NvcgotCSAqIGxpbmspIHJlc3RvcmVzIHRoZSBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgb2YgU3VjY2Vzc29yJ3MgYWRhcHRlcnMgb2YKLQkgKiB0eXBlIE1ldGhvZEVsZW1lbnRBZGFwdGVyLgotCSAqIAotCSAqIGVnOiBJZiBhbiBBY3Rpdml0eSAiYWN0QSIgaXMgZXh0ZW5kZWQgaW4gYW5vdGhlciBDUC4gQmFzZSAiYWN0QSIgQUQKLQkgKiBkaWFncmFtIGlzIG9wZW5lZCwgYW5kIEV4dGVuZGVkICJhY3RBIiBBRCBEaWFncmFtIGlzIG9wZW5lZC4gT24gY3JlYXRpbmcKLQkgKiBwcmVkZWNlc3NvciBsaW5rIGJldHdlZW4gYW55IHR3byBjaGlsZCBhY3Rpdml0aWVzLCBjcmVhdGVzIGEgZXh0cmEgbGluawotCSAqIGluIEV4dGVuZGVkICJhY3RBIiBBRCBkaWFncmFtLCBiZWNhdXNlIGNyZWF0aW5nIHdvcmtvcmRlciB3aWxsIG5vdGlmeSB0aGUKLQkgKiBleHRlbmRlZCAiYWN0QSIgZGlhZ3JhbSB0byBkcmF3IGEgbGluay4gVG8gYXZvaWQgZHVwbGljYXRlIGxpbmtzIGluIHRoZQotCSAqIGV4dGVuZGVkIGFjdGl2aXR5IGRpYWdyYW0sIHdlIGhhdmUgdG8gc2V0IG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyB0bwotCSAqIGZhbHNlLCBiZWZvcmUgY3JlYXRpbmcgYSBXb3JrT3JkZXIgb2JqZWN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgYWRkRGVmYXVsdFdvcmtPcmRlcihBY3Rpdml0eU5vZGUgbm9kZSwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRCcmVha2Rvd25FbGVtZW50KSB7Ci0JCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlNZXRob2RFbGVtZW50IGUgPSBub2RlQWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCUxpc3QgbGlzdCA9IGUuZUFkYXB0ZXJzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkYXB0ZXIpIHsKLQkJCQlOb2RlQWRhcHRlciBvdGhlck5vZGVBZGFwdGVyID0gKE5vZGVBZGFwdGVyKSAoKE1ldGhvZEVsZW1lbnRBZGFwdGVyKSBvYmopCi0JCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIoKTsKLQkJCQlib29sZWFuIHByZWROb3RpZmljYXRpb24gPSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCW90aGVyTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCW1hcC5wdXQob3RoZXJOb2RlQWRhcHRlciwgbmV3IEJvb2xlYW4ocHJlZE5vdGlmaWNhdGlvbikpOwotCQkJfQotCQl9Ci0JCXRyeSB7Ci0JCQlub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlXb3JrT3JkZXIgd28gPSBVbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlLCBwcmVkQnJlYWtkb3duRWxlbWVudCwgZmFsc2UpOwotCQkJZ2V0QWN0aW9uTWFuYWdlcigpLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLkFERCwgZSwgCi0JCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUiwgd28sIC0xKTsKLQkJCXJldHVybiB3bzsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vZGVBZGFwdGVyLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJCVNldCBzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBvYmogPSBtYXAuZ2V0KG9iamVjdCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLQkJCQkJYm9vbGVhbiBwcmVkbm90ID0gKChCb29sZWFuKSBvYmopLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkoKE5vZGVBZGFwdGVyKSBvYmplY3QpLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBwcmVkbm90OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBub3RpZnkpIHsKLQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0KE5vdGlmaWVyIG5ld1RhcmdldCkgewotCQlpZihuZXdUYXJnZXQgPT0gbnVsbCkgewotCQkJZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLnNldFRhcmdldChuZXdUYXJnZXQpOwotCX0KLQkKLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9icmlkZ2UvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU5MTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvYnJpZGdlL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyIGV4dGVuZHMgTm9kZUFkYXB0ZXIgewotCXByaXZhdGUgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkYXB0ZXIgewotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJV29ya09yZGVyIG9iajsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlvYmogPSAoV29ya09yZGVyKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCW9iaiA9IChXb3JrT3JkZXIpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQlyZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlvYmogPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotLy8JCQkJCUJvb2xlYW4gYiA9IChCb29sZWFuKW1zZy5nZXROZXdWYWx1ZSgpOwotLy8JCQkJCWhhbmRsZVN1cHByZXNzZWQoYi5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKE1ldGhvZEVsZW1lbnQgZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVTdXBwcmVzc2VkKGJvb2xlYW4gYikgewotCQlpZihiKXsKLQkJCUxpc3QgaW5jb21pbmdzID0gZ2V0Tm9kZSgpLmdldEluY29taW5ncygpOwotCQkJZm9yIChpbnQgaSA9MDsgaTxpbmNvbWluZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gaW5jb21pbmdzLmdldChpKTsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IG51bGw7Ci0JCQkJaWYob2JqICE9IG51bGwgKXsKLQkJCQkJbGluayA9IChBY3Rpdml0eUVkZ2Upb2JqOwotCQkJCX0KLQkJCQlpZihsaW5rICE9IG51bGwgJiYgbGluay5nZXRTb3VyY2UoKSAhPSBudWxsKXsKLQkJCQkJTm9kZUFkYXB0ZXIgc291cmNlTm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRTb3VyY2UoKSk7Ci0JCQkJCWJvb2xlYW4gb2xkTm90aWZ5MSA9IHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwgPyBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsKSBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJCQkJCWdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKS5yZW1vdmUobGluayk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZihzb3VyY2VOb2RlQWRhcHRlciAhPSBudWxsKSBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5MTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUxpc3Qgb3V0R29pbmdzID0gZ2V0Tm9kZSgpLmdldE91dGdvaW5ncygpOwotCQkJZm9yIChpbnQgaSA9MDsgaTxvdXRHb2luZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gb3V0R29pbmdzLmdldChpKTsKLQkJCQlBY3Rpdml0eUVkZ2UgbGluayA9IG51bGw7Ci0JCQkJaWYob2JqICE9IG51bGwgKXsKLQkJCQkJbGluayA9IChBY3Rpdml0eUVkZ2Upb2JqOwotCQkJCX0KLQkJCQlpZihsaW5rICE9IG51bGwgJiYgbGluay5nZXRUYXJnZXQoKSAhPSBudWxsKXsKLQkJCQkJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIobGluay5nZXRUYXJnZXQoKSk7Ci0JCQkJCWJvb2xlYW4gb2xkTm90aWZ5MSA9IG5vZGVBZGFwdGVyICE9IG51bGwgPyBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQkJCWdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKS5yZW1vdmUobGluayk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5MTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfWVsc2V7Ci0JCQlMaXN0IG5vZGVzID0gZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eU5vZGUgZWxlbWVudCA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmKGVsZW1lbnQgIT0gZ2V0Tm9kZSgpICYmIHRhcmdldCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCWlmKG1lICE9IG51bGwpewotCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG1lKTsKLQkJCQkJCWFkZE91dGdvaW5nQ29ubmVjdGlvbihtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKEFjdGl2aXR5RWRnZSBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJLy8gdGhpcyBpcyBhIGRpcmVjdCBsaW5rCi0JCQkvLyBhZGQgbmV3IFdvcmtPcmRlciBvYmplY3QgdG8gVU1BCi0JCQkvLwotCQkJV29ya09yZGVyIG9yZGVyID0gbnVsbDsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoc3VjYywgcHJlZCkgPT0gbnVsbCkgewotCQkJCU5vZGVBZGFwdGVyIHNvdXJjZU5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwkKLQkJCQkvLyBub2RlIGFkYXB0ZXIgY2FuIGJlIE5VTEwgaWYgdGhlIG5vZGUgaXMgbm90IGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSBkaWFncmFtCi0JCQkJLy8KLQkJCQlib29sZWFuIHNvdXJjZU5vdGlmeSA9IHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwgPyBzb3VyY2VOb2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkIDogZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoc291cmNlTm9kZUFkYXB0ZXIgIT0gbnVsbCkgc291cmNlTm9kZUFkYXB0ZXIubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkvL0NyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJb3JkZXIgPSBhZGREZWZhdWx0V29ya09yZGVyKGxpbmsuZ2V0VGFyZ2V0KCksIHByZWQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKHNvdXJjZU5vZGVBZGFwdGVyICE9IG51bGwpIHNvdXJjZU5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBzb3VyY2VOb3RpZnk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZXQgdGhlIFdvcmtPcmRlciBhcyB0aGUgZWxlbWVudCBvZiB0aGUgU2VtYW50aWNNb2RlbCBvZiB0aGUKLQkJCS8vIGxpbmsncyBHcmFwaEVkZ2UKLQkJCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIG9yZGVyKTsKLQkJfSAKLQkJZWxzZSBpZiAoQnJpZGdlSGVscGVyLmlzU3luY2hCYXIobGluay5nZXRTb3VyY2UoKSkpIHsKLQkJCS8vIGdldCBhbGwgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlcyB0aGF0IGFyZSBjb21taW5nIHRvIHRoaXMKLQkJCS8vIFR5cGVkTm9kZSwgYm90aCBkaXJlY3RseSBhbmQgaW5kaXJlY3RseQotCQkJLy8gYW5kIGNyZWF0ZSB3b3JrIG9yZGVycyB3aXRoIHRoZWlyIGFjdGl2aXR5IGFzIHByZWRlY2Vzc29yCi0JCQkvLwotCi0JCQkvLyBQcmVkZWNlc3NvciBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IGluIGNhc2Ugb2YKLQkJCS8vIFN5bmNyb25pemF0aW9uIEJhciwgbm90IGZvciBEZWNpc2lvblBvaW50LgotCQkJLy8gVE9ETzogcmV2aWV3Ci0JCQkKLQkJCQkKLQkJCQlDb2xsZWN0aW9uIGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIEdldCB0aGUgY29sbGVjdGlvbiBpbmNvbWluZyBjb25uZWN0aW9uIG9mIHN5bmNiYXIgCi0JCQkJLy8gZXhjbHVkaW5nIGRlY2lzaW9ucG9pbnQgaW5jb21pbmcgY29ubmVjdGlvbgotCQkJCUJyaWRnZUhlbHBlci5nZXRTeW5jQmFyU291cmNlTm9kZXMobGluay5nZXRTb3VyY2UoKSwgYWN0Tm9kZXMpOwotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eU5vZGUgbm9kZSA9IChBY3Rpdml0eU5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChub2RlKTsKLQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihzdWNjLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJCQlOb2RlQWRhcHRlciBzb3VyY2VOb2RlID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCS8vIENyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKGxpbmsuZ2V0VGFyZ2V0KCksIHByZWQpOwotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBzb3VyY2VOb3RpZnk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByb3RlY3RlZCBBY3Rpdml0eUVkZ2UgYWRkSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCUFjdGl2aXR5RWRnZSBsaW5rID0gc3VwZXIuYWRkSW5jb21pbmdDb25uZWN0aW9uKHNvdXJjZSk7Ci0JCWlmIChsaW5rID09IG51bGwpCi0JCQlyZXR1cm4gbGluazsKLQotCQlXb3JrT3JkZXIgd29ya09yZGVyID0gVW1hVXRpbC5maW5kV29ya09yZGVyKAotCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgZ2V0RWxlbWVudCgpLCBzb3VyY2UpOwotCQlCcmlkZ2VIZWxwZXIuc2V0U2VtYW50aWNNb2RlbChsaW5rLCB3b3JrT3JkZXIpOwotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eUVkZ2UgYWRkT3V0Z29pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUFjdGl2aXR5RWRnZSBsaW5rID0gc3VwZXIuYWRkT3V0Z29pbmdDb25uZWN0aW9uKHRhcmdldCk7Ci0KLQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHRhcmdldCwgZ2V0RWxlbWVudCgpKTsKLQkJQnJpZGdlSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgd29ya09yZGVyKTsKLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJLy8gbG9vayBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgYXMgbGlua2VkIG9iamVjdCBvZiB0aGUKLQkJLy8gc291cmNlIG5vZGUKLQkJLy8KLQkJZm9yIChBY3Rpdml0eUVkZ2UgbGluayA6IGdldE5vZGUoKS5nZXRJbmNvbWluZ3MoKSkgewotCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbAotCQkJCQkmJiBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChsaW5rLmdldFNvdXJjZSgpKSA9PSBzb3VyY2UpIHsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGxpbmsuZ2V0U291cmNlKCkpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gbm9kZUFkYXB0ZXIgIT0gbnVsbCA/IG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgOiBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSBub2RlQWRhcHRlci5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0U291cmNlKG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmKG5vZGVBZGFwdGVyICE9IG51bGwpIG5vZGVBZGFwdGVyLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCUJyaWRnZUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIG51bGwpOwotCQkJCWdldERpYWdyYW0oKS5nZXRFZGdlcygpLnJlbW92ZShsaW5rKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotLy8JCXN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5UGFyYW1ldGVyTm9kZS5jbGFzcykpIHsKLS8vCQljYXNlIFVNTFBhY2thZ2UuQUNUSVZJVFlfUEFSQU1FVEVSX05PREVfX0VBTk5PVEFUSU9OUzoKLS8vCQkJc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotLy8JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0vLwkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGUgbm9kZSA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIG1zZy5nZXROb3RpZmllcigpOwotLy8JCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0VHlwZShub2RlKTsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KG5vZGUpOwkJCQkKLS8vCQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIAotLy8JCQkJCQl0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzKEJyaWRnZUhlbHBlci5nZXRUeXBlKGUpKSkgewotLy8JCQkJCS8vIHJlcGxhY2UgdGhlIGN1cnJlbnRseSBsaW5rZWQgbWV0aG9kIGVsZW1lbnQgd2l0aCB0aGUgcmlnaHQgb25lCi0vLwkJCQkJLy8KLS8vCQkJCQlFQ2xhc3MgcmlnaHRUeXBlID0gQnJpZGdlSGVscGVyLmdldFR5cGUodHlwZSk7Ci0vLwkJCQkJaWYocmlnaHRUeXBlICE9IG51bGwpIHsKLS8vCQkJCQkJT2JqZWN0IHJpZ2h0RWxlbWVudCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShyaWdodFR5cGUpOwotLy8JCQkJCQlMaXN0IGxpc3QgPSAoKEJyZWFrZG93bkVsZW1lbnQpZSkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQkJbGlzdC5zZXQobGlzdC5pbmRleE9mKGUpLCByaWdodEVsZW1lbnQpOwotLy8JCQkJCQlyZXR1cm47Ci0vLwkJCQkJfQotLy8JCQkJCQotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JCQotLy8JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9DaGFuZ2VCb3VuZHNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NoYW5nZUJvdW5kc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhYWY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NoYW5nZUJvdW5kc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQ29tbWFuZCBmb3IgY2hhbmdlIHZpZXcgZGltZW5zaW9ucy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VCb3VuZHNDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGFiZWwgPSAiY2hhbmdlIGJvdW5kcyBjb21tYW5kIGxhYmVsIjsKLQotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCi0JcHJpdmF0ZSBWaWV3IHZpZXc7Ci0KLQlwcml2YXRlIGludCB3aWR0aDsKLQotCXByaXZhdGUgaW50IGhlaWdodDsKLQotCXByaXZhdGUgUG9pbnQgbG9jYXRpb247Ci0KLQlwcml2YXRlIFBvaW50IG9sZExvY2F0aW9uOwotCi0JcHJpdmF0ZSBpbnQgb2xkV2lkdGg7Ci0KLQlwcml2YXRlIGludCBvbGRIZWlnaHQ7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlQm91bmRzQ29tbWFuZChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFZpZXcgdmlldywKLQkJCVBvaW50IGxvY2F0aW9uLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJdGhpcy52aWV3ID0gdmlldzsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiAodGhpcy53aWR0aCAhPSAwIHx8IHRoaXMuaGVpZ2h0ICE9IDApOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJb2xkTG9jYXRpb24gPSBuZXcgUG9pbnQoKTsKLQkJCQkJT2JqZWN0IHggPSAgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKTsKLQkJCQkJaWYoeCAhPSBudWxsKXsKLQkJCQkJCW9sZExvY2F0aW9uLnggPSAoKEludGVnZXIpeCkuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCQlPYmplY3QgeSA9IFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSk7Ci0JCQkJCWlmKHkgIT0gbnVsbCl7Ci0JCQkJCQlvbGRMb2NhdGlvbi55ID0gKChJbnRlZ2VyKSB5KS5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJCW9sZFdpZHRoID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX1dpZHRoKCkpKS5pbnRWYWx1ZSgpOwotCQkJCQlvbGRIZWlnaHQgPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCkpKS5pbnRWYWx1ZSgpOwotCi0JCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi54KSk7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi55KSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpZHRoID4gMCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfV2lkdGgoKSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCQkJd2lkdGgpKTsKLQkJCQkJfQotCQkJCQlpZiAoaGVpZ2h0ID4gMCkgewotCQkJCQkJVmlld1V0aWwuc2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFNpemVfSGVpZ2h0KCksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKGhlaWdodCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoIkVycm9yIGluIGNoYW5nZWJvdW5kcyBjb21tYW5kIDoiLCAgZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQl1bmRvKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChvbGRMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi54KSk7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWSgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlsb2NhdGlvbi55KSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG9sZFdpZHRoICE9IHdpZHRoKSB7Ci0JCQkJCQlWaWV3VXRpbC5zZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKHZpZXcsCi0JCQkJCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2l6ZV9XaWR0aCgpLCBuZXcgSW50ZWdlcigKLQkJCQkJCQkJCQl3aWR0aCkpOwotCQkJCQl9Ci0JCQkJCWlmIChvbGRIZWlnaHQgPiBoZWlnaHQpIHsKLQkJCQkJCVZpZXdVdGlsLnNldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUodmlldywKLQkJCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRTaXplX0hlaWdodCgpLAotCQkJCQkJCQluZXcgSW50ZWdlcihoZWlnaHQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJU2V0PFJlc291cmNlPiBzZXQgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJc2V0LmFkZCh2aWV3LmVSZXNvdXJjZSgpKTsKLQkJaWYgKCFzZXQuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHNldDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kIGNoYWluKAotCQkJb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQgY29tbWFuZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9Db3B5RGlhZ3JhbUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmODBkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcnRpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIAotICogSXQgZG9lcyBjb3B5IHRoZSBkaWFncmFtIGZvciB0aGUgYWN0aXZpdHkKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5RGlhZ3JhbUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPD8+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBNYXA8RU9iamVjdCwgRU9iamVjdD4gY29weVRvT3JpZ2luYWxNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248RGlhZ3JhbT4gY29waWVkRWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBtZ3I7Ci0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByaXZhdGUgTWFwPEVPYmplY3QsIEVPYmplY3Q+IG9yaWdpbmFsVG9Db3B5TWFwOwotCQotCXByaXZhdGUgQ29weURpYWdyYW1Db21tYW5kKENvbGxlY3Rpb248Pz4gZWxlbWVudHMsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0KLQkJLy8gZ2V0IGRpYWdyYW0gbWFuYWdlciBhbmQgZG9tYWluCi0JCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHRhcmdldFByb2Nlc3MsIHRoaXMpOwotCQlkb21haW4gPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpOwkJCQkKLQl9Ci0JCi0JcHVibGljIENvcHlEaWFncmFtQ29tbWFuZChDb2xsZWN0aW9uPD8+IGVsZW1lbnRzLCBIZWxwZXIgY29weUhlbHBlciwKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzKGVsZW1lbnRzLCB0YXJnZXRQcm9jZXNzKTsKLQkJdGhpcy5vcmlnaW5hbFRvQ29weU1hcCA9IGNvcHlIZWxwZXI7Ci0JfQotCQotCXB1YmxpYyBDb3B5RGlhZ3JhbUNvbW1hbmQoQ29sbGVjdGlvbjw/PiBlbGVtZW50cywgTWFwPEVPYmplY3QsIEVPYmplY3Q+IGNvcHlUb09yaWdpbmFsTWFwLAotCQkJUHJvY2VzcyB0YXJnZXRQcm9jZXNzKSB7Ci0JCXRoaXMoZWxlbWVudHMsIHRhcmdldFByb2Nlc3MpOwotCQl0aGlzLmNvcHlUb09yaWdpbmFsTWFwID0gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWRvRXhlY3V0ZSgpOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXA8PywgPz4gZ2V0Q29weVRvT3JpZ2luYWxNYXAoKSB7Ci0JCWlmKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwgJiYgb3JpZ2luYWxUb0NvcHlNYXAgIT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBFT2JqZWN0PigpOwotCQkJZm9yIChNYXAuRW50cnk8RU9iamVjdCwgRU9iamVjdD4gZW50cnkgOiBvcmlnaW5hbFRvQ29weU1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkb0V4ZWN1dGUoKSB7CQkKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwpIHsKLQkJCWNvcGllZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQl9IGVsc2UgewotCQkJY29waWVkRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCi0JCURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmMgPSBuZXcgRGlhZ3JhbVNlcnZpY2UoKTsKLQkJdHJ5IHsKLQkJCWZvciAoT2JqZWN0IGUgOiBlbGVtZW50cykgewotCQkJCU9iamVjdCBvcmlnID0gZ2V0Q29weVRvT3JpZ2luYWxNYXAoKS5nZXQoZSk7Ci0JCQkJaWYgKG9yaWcgIT0gbnVsbCAmJiBvcmlnIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgZSAhPSBudWxsCi0JCQkJCQkmJiBlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgY29weUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlOwotCQkJCQlBY3Rpdml0eSBvcmlnQWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9yaWc7Ci0KLQkJCQkJQ29sbGVjdGlvbjxEaWFncmFtPiBkaWFncmFtcyA9IGRpYWdyYW1TdmMuZ2V0RGlhZ3JhbXMob3JpZ0FjdGl2aXR5KTsKLQkJCQkJaWYgKGRpYWdyYW1zICE9IG51bGwgJiYgIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBkaWFncmFtcykgewotCQkJCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJLy8gY29weSB0aGUgZGlhZ3JhbQotCQkJCQkJCQlEaWFncmFtIGRpYWdyYW1Db3B5ID0gKERpYWdyYW0pIERpYWdyYW1IZWxwZXIKLQkJCQkJCQkJCQkuY29weURpYWdyYW0oZG9tYWluLCBkaWFncmFtKTsKLQotCQkJCQkJCQkvLyB1cGRhdGUgY2hpbGRyZW4gcmVmZXJlbmNlcwotCQkJCQkJCQl1cGRhdGVSZWZlcmVuY2VzKGRpYWdyYW1Db3B5KTsKLQotCQkJCQkJCQkvLyBhc3NvY2lhdGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5nZXREaWFncmFtVHlwZShkaWFncmFtQ29weSk7Ci0JCQkJCQkJCW1nci5hc3NvY2lhdGUoZGlhZ3JhbUNvcHksIGRpYWdyYW1UeXBlLAotCQkJCQkJCQkJCShBY3Rpdml0eSkgY29weUFjdGl2aXR5KTsKLQotCQkJCQkJCQljb3BpZWRFbGVtZW50cy5hZGQoZGlhZ3JhbUNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgZUFubm90YXRpb25zIHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29weQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlZmVyZW5jZXMoRGlhZ3JhbSBjb3B5KSB7Ci0JCWludCBkaWFncmFtVHlwZSA9IERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoY29weSk7Ci0JCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkvLyBjb2xsZWN0IGFsbCBjaGlsZHJlbiBmaXJzdCBlLmcuIGZvciBBY3Rpdml0eVBhcnRpdGlvbgotCQkvLyB3ZSBkb24ndCBoYXZlIHBhcnRpdGlvbiBpbnRvIHBhcnRpdGlvbiBzbyBqdXN0IGdldHRpbmcgb25lIGxldmVsIHN1Yi1jaGlsZHJlbgotCQkvLyBhcmUgZW5vdWdoIGZvciBub3cuCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNvcHkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdG9yLm5leHQoKTsKLQkJCUVPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQljaGlsZHJlbi5hZGQobm9kZSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWNoaWxkcmVuLmFkZEFsbChub2RlLmdldENoaWxkcmVuKCkpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCi0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRvci5uZXh0KCk7Ci0JCQlFT2JqZWN0IG9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCi0JCQlpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RydWN0dXJlZEFjdGl2aXR5Tm9kZQotCQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJhbWV0ZXJOb2RlKSB7Ci0JCQkJCUVNb2RlbEVsZW1lbnQgbW9kZWxFbGVtZW50ID0gKEVNb2RlbEVsZW1lbnQpIG9iajsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24obW9kZWxFbGVtZW50LAotCQkJCQkJCQkJdGFyZ2V0UHJvY2Vzcy5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKLQotCQkJCQlPYmplY3QgbWFwcGVkTWV0aG9kRWxlbWVudCA9IGdldENvcGllZEVsZW1lbnQobWUpOwotCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24obW9kZWxFbGVtZW50LAotCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQkJTm9kZUNvbnRhaW5lciBub2RlQ29udGFpbmVyID0gKE5vZGVDb250YWluZXIpIG9iajsKLQkJCQkJLy8gZG8gbWFwcGluZyBmb3Igbm9kZWNvbnRhaW5lcgotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gbm9kZUNvbnRhaW5lci5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCBtYXBwZWRNZXRob2RFbGVtZW50ID0gZ2V0Q29waWVkRWxlbWVudChtZSk7Ci0JCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCW5vZGVDb250YWluZXIKLQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQl9Ci0KLQkJCQkJLy8gZG8gbWFwcGluZyBmb3IgaXRzIGNoaWxkcmVuCi0JCQkJCUxpc3Q8Pz4gbm9kZXMgPSBub2RlQ29udGFpbmVyLmdldE5vZGVzKCk7Ci0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCQkJCW1lID0gbmFtZWROb2RlLmdldExpbmtlZEVsZW1lbnQoKTsKLQotCQkJCQkJbWFwcGVkTWV0aG9kRWxlbWVudCA9IGdldENvcGllZEVsZW1lbnQobWUpOwotCQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCW5hbWVkTm9kZQotCQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChkaWFncmFtVHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJTmFtZWROb2RlIG5hbWVkTm9kZSA9IChOYW1lZE5vZGUpIG9iajsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0KLQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBnZXRDb3BpZWRFbGVtZW50KG1lKTsKLQkJCQkJaWYgKG1hcHBlZE1ldGhvZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJbmFtZWROb2RlCi0JCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBjb3BpZWQgZWxlbWVudCBmcm9tIHRoZSBtYXAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRDb3BpZWRFbGVtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKG9yaWdpbmFsVG9Db3B5TWFwID09IG51bGwgJiYgY29weVRvT3JpZ2luYWxNYXAgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBFT2JqZWN0PigpOwotCQkJZm9yIChNYXAuRW50cnk8RU9iamVjdCwgRU9iamVjdD4gZW50cnkgOiBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpKSB7Ci0JCQkJb3JpZ2luYWxUb0NvcHlNYXAucHV0KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3JpZ2luYWxUb0NvcHlNYXAgIT0gbnVsbCA/IG9yaWdpbmFsVG9Db3B5TWFwLmdldChlbGVtZW50KSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIShjb3BpZWRFbGVtZW50cyA9PSBudWxsIHx8IGNvcGllZEVsZW1lbnRzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGNvcGllZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCW1nci5nZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkKLQkJCQkJCQkJCQkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCQkJbWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJY29waWVkRWxlbWVudHMuY2xlYXIoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29waWVkRWxlbWVudHMgPT0gbnVsbCB8fCBjb3BpZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGNvbW1hbmQgaXMgbm90IGV4ZWN1dGVkIHlldAotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCUhhc2hTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJZm9yIChEaWFncmFtIGRpYWdyYW0gOiBjb3BpZWRFbGVtZW50cykgewotCQkJaWYoZGlhZ3JhbSAhPSBudWxsICYmIGRpYWdyYW0uZVJlc291cmNlKCkgIT0gbnVsbCkKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGlhZ3JhbS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobWdyICE9IG51bGwpCi0JCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvQ29weURpYWdyYW1Gb3JEZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmNDJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0NvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmF0aW9uU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eVBhcmFtZXRlck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIAotICogVXBkYXRlcyBkaWFncmFtcyBvZiB0aGUgYWN0aXZpdHkncyBkZWVwIGNvcGllcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBlbGVtZW50czsKLQotCXByaXZhdGUgTWFwPD8sPz4gY29weVRvT3JpZ2luYWxNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248RGlhZ3JhbT4gY29waWVkRWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBtZ3I7Ci0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbjsKLQotCXByaXZhdGUgQ29weUhlbHBlciBjb3B5SGVscGVyOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgUHJvY2VzcyBzcmNQcm9jZXNzOwotCi0JcHJpdmF0ZSBIYXNoTWFwPEJyZWFrZG93bkVsZW1lbnQsIFN0cmluZz4gY29weVRvV3JhcHBlclBhdGhNYXA7Ci0JCi0JcHVibGljIENvcHlEaWFncmFtRm9yRGVlcENvcHlDb21tYW5kKENvbGxlY3Rpb248Pz4gZWxlbWVudHMsIE1hcDw/LCA/PiBjb3B5VG9PcmlnaW5hbE1hcCwKLQkJCVByb2Nlc3Mgc3JjUHJvY2VzcywgUHJvY2VzcyB0YXJnZXRQcm9jZXNzLCBDb3B5SGVscGVyIGNvcHlIZWxwZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvcHlIZWxwZXIgPSBjb3B5SGVscGVyOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5zcmNQcm9jZXNzID0gc3JjUHJvY2VzczsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmNvcHlUb09yaWdpbmFsTWFwID0gY29weVRvT3JpZ2luYWxNYXA7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0KLQkJLy8gZ2V0IGRpYWdyYW0gbWFuYWdlciBhbmQgZG9tYWluCi0JCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHRhcmdldFByb2Nlc3MsIHRoaXMpOwotCQlkb21haW4gPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9FeGVjdXRlKCk7Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvRXhlY3V0ZSgpIHsJCQotCQlpZiAoY29waWVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJY29waWVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW0+KCk7Ci0JCX0gZWxzZSB7Ci0JCQljb3BpZWRFbGVtZW50cy5jbGVhcigpOwotCQl9Ci0JCWNvcHlUb1dyYXBwZXJQYXRoTWFwID0gbmV3IEhhc2hNYXA8QnJlYWtkb3duRWxlbWVudCwgU3RyaW5nPigpOwotCQlpZiAoY29weUhlbHBlciAhPSBudWxsKSB7Ci0JCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEJyZWFrZG93bkVsZW1lbnQ+IGVudHJ5IDogY29weUhlbHBlcgotCQkJCQkuZ2V0V3JhcHBlclBhdGhUb0NvcHlNYXAoKS5lbnRyeVNldCgpKSB7Ci0JCQkJY29weVRvV3JhcHBlclBhdGhNYXAucHV0KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCQlEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCXRyeSB7CQkJCi0JCQlmb3IgKE9iamVjdCBlIDogZWxlbWVudHMpIHsKLQkJCQlPYmplY3Qgb3JpZyA9IGNvcHlUb09yaWdpbmFsTWFwLmdldChlKTsKLQkJCQlpZiAob3JpZyAhPSBudWxsICYmIG9yaWcgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBlICE9IG51bGwKLQkJCQkJCSYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBjb3B5QWN0aXZpdHkgPSAoQWN0aXZpdHkpIGU7Ci0JCQkJCUFjdGl2aXR5IG9yaWdBY3Rpdml0eSA9IChBY3Rpdml0eSkgb3JpZzsKLQotCQkJCQlDb2xsZWN0aW9uPERpYWdyYW0+IGRpYWdyYW1zID0gZGlhZ3JhbVN2Yy5nZXREaWFncmFtcyhvcmlnQWN0aXZpdHkpOwotCQkJCQlpZiAoZGlhZ3JhbXMgIT0gbnVsbCAmJiAhZGlhZ3JhbXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGRpYWdyYW1zKSB7Ci0JCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCQkvLyBjb3B5IHRoZSBkaWFncmFtCi0JCQkJCQkJCURpYWdyYW0gZGlhZ3JhbUNvcHkgPSAoRGlhZ3JhbSkgRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5jb3B5RGlhZ3JhbShkb21haW4sIGRpYWdyYW0pOwotCi0JCQkJCQkJCS8vIHVwZGF0ZSBjaGlsZHJlbiByZWZlcmVuY2VzCi0JCQkJCQkJCXVwZGF0ZVJlZmVyZW5jZXMoZGlhZ3JhbUNvcHksIGNvcHlBY3Rpdml0eSwgb3JpZ0FjdGl2aXR5KTsKLQotCQkJCQkJCQkvLyBhc3NvY2lhdGUgd2l0aCB0aGUgYWN0aXZpdHkKLQkJCQkJCQkJaW50IGRpYWdyYW1UeXBlID0gRGlhZ3JhbUhlbHBlcgotCQkJCQkJCQkJCS5nZXREaWFncmFtVHlwZShkaWFncmFtQ29weSk7Ci0JCQkJCQkJCW1nci5hc3NvY2lhdGUoZGlhZ3JhbUNvcHksIGRpYWdyYW1UeXBlLAotCQkJCQkJCQkJCShBY3Rpdml0eSkgY29weUFjdGl2aXR5KTsKLQotCQkJCQkJCQljb3BpZWRFbGVtZW50cy5hZGQoZGlhZ3JhbUNvcHkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJSZWFkT25seShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUpIHsKLQkJbm9kZS5zZXRSZWFkT25seShmYWxzZSk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChOb2RlQ29udGFpbmVyKW5vZGUpLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSBjaGlsZCA9IChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBpdGVyLm5leHQoKTsKLQkJCQljaGlsZC5zZXRSZWFkT25seShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZ2V0T3JpZ2luYWxXcmFwcGVyKEFjdGl2aXR5IGNvcHkpIHsKLQkJU3RyaW5nIHdyYXBwZXJQYXRoID0gY29weVRvV3JhcHBlclBhdGhNYXAuZ2V0KGNvcHkpOwotCQlpZih3cmFwcGVyUGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZihzcmNQcm9jZXNzICE9IG51bGwpIHsKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24oc3JjUHJvY2Vzcyk7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXRyeSB7Ci0JCQkJY29uZmlnU2V0dGVyLnNldChjb25maWcpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHdyYXBwZXJQYXRoLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJQXJyYXlMaXN0PFN0cmluZz4gZ3VpZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCWd1aWRMaXN0LmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQlTdHJpbmdbXSBndWlkUGF0aCA9IG5ldyBTdHJpbmdbZ3VpZExpc3Quc2l6ZSgpXTsKLQkJCQlndWlkTGlzdC50b0FycmF5KGd1aWRQYXRoKTsKLQkJCQlPYmplY3QgbyA9IHN1cHByZXNzaW9uLmdldE9iamVjdEJ5UGF0aChndWlkUGF0aCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCWlmKG8gaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlyZXR1cm4gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJDb3B5RGlhZ3JhbUNvbW1hbmQuZ2V0T3JpZ2luYWxXcmFwcGVyKCk6IGludmFsaWQgd3JhcHBlciBmb3IgY29weSBhY3Rpdml0eTogIiArIG8pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnRzKEFjdGl2aXR5IG9yaWdBY3Rpdml0eSwgQWN0aXZpdHkgY29weUFjdGl2aXR5KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBnZXRPcmlnaW5hbFdyYXBwZXIoY29weUFjdGl2aXR5KTsKLQkJT2JqZWN0IG9iamVjdCA9IHdyYXBwZXIgIT0gbnVsbCA/IHdyYXBwZXIgOiBvcmlnQWN0aXZpdHk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRyeSB7Ci0JCQljb25maWdTZXR0ZXIuc2V0KGNvbmZpZyk7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7CQkJCQkKLQkJCUNvbGxlY3Rpb248Pz4gb3JpZ0NoaWxkcmVuID0gaXAuZ2V0Q2hpbGRyZW4ob3JpZ0FjdGl2aXR5KTsKLQkJCUNvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQlmb3IoT2JqZWN0IG9yaWdDaGlsZCA6IG9yaWdDaGlsZHJlbikgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob3JpZ0NoaWxkKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQllbGVtZW50cy5hZGQoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlbGVtZW50czsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRCcmVha2Rvd25FbGVtZW50KENvbGxlY3Rpb248QnJlYWtkb3duRWxlbWVudD4gZWxlbWVudHMsIEFjdGl2aXR5IGJhc2UpIHsKLQkJZm9yIChCcmVha2Rvd25FbGVtZW50IGUgOiBlbGVtZW50cykgewotCQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlmaW5kX2Jhc2U6Ci0JCQkJZm9yKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOyB2ZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlpZih2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZSkgewotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJYnJlYWsgZmluZF9iYXNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGZvdW5kKSB7Ci0JCQkJCXJldHVybiAoQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgQ29weUZpbmRlciB7Ci0JCXByaXZhdGUgQWN0aXZpdHkgb3JpZ0FjdGl2aXR5OwotCQlwcml2YXRlIEFjdGl2aXR5IGNvcHlBY3Rpdml0eTsKLQkJcHJpdmF0ZSBNYXA8QnJlYWtkb3duRWxlbWVudCwgQnJlYWtkb3duRWxlbWVudD4gb3JpZ2luYWxUb0NvcHlNYXA7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxCcmVha2Rvd25FbGVtZW50PiBlbGVtZW50czsKLQkJCi0JCXByaXZhdGUgQ29weUZpbmRlcihBY3Rpdml0eSBvcmlnQWN0aXZpdHksIEFjdGl2aXR5IGNvcHlBY3Rpdml0eSkgewotCQkJdGhpcy5vcmlnQWN0aXZpdHkgPSBvcmlnQWN0aXZpdHk7Ci0JCQl0aGlzLmNvcHlBY3Rpdml0eSA9IGNvcHlBY3Rpdml0eTsKLQkJfQotCQkKLQkJcHVibGljIE1hcDxCcmVha2Rvd25FbGVtZW50LCBCcmVha2Rvd25FbGVtZW50PiBnZXRPcmlnaW5hbFRvQ29weU1hcCgpIHsKLQkJCWlmKG9yaWdpbmFsVG9Db3B5TWFwID09IG51bGwpIHsKLQkJCQlvcmlnaW5hbFRvQ29weU1hcCA9IG5ldyBIYXNoTWFwPEJyZWFrZG93bkVsZW1lbnQsIEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvcHlBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBvcmlnID0gKEJyZWFrZG93bkVsZW1lbnQpIGNvcHlIZWxwZXIuZ2V0T3JpZ2luYWwoZSk7Ci0JCQkJCW9yaWdpbmFsVG9Db3B5TWFwLnB1dChvcmlnLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gb3JpZ2luYWxUb0NvcHlNYXA7Ci0JCX0KLQkJCi0JCUJyZWFrZG93bkVsZW1lbnQgZmluZENvcHkoQnJlYWtkb3duRWxlbWVudCBvcmlnaW5hbCkgewotCQkJT2JqZWN0IGNvcHkgPSBnZXRPcmlnaW5hbFRvQ29weU1hcCgpLmdldChvcmlnaW5hbCk7Ci0JCQlpZihjb3B5ID09IG51bGwpIHsKLQkJCQlpZihvcmlnaW5hbCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCS8vIG1lIG11c3QgYmUgYSBiYXNlIGVsZW1lbnQgb2YgYSBsb2NhbCBjb250cmlidXRvciBvciByZXBsYWNlcgotCQkJCQkvLyAKLQkJCQkJaWYoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJCQkJZWxlbWVudHMgPSBnZXRCcmVha2Rvd25FbGVtZW50cyhvcmlnQWN0aXZpdHksIGNvcHlBY3Rpdml0eSk7Ci0JCQkJCX0KLQkJCQkJY29weSA9IGdldEJyZWFrZG93bkVsZW1lbnQoZWxlbWVudHMsIChBY3Rpdml0eSkgb3JpZ2luYWwpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAoQnJlYWtkb3duRWxlbWVudCkgY29weTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBlQW5ub3RhdGlvbnMgcmVmZXJlbmNlcwotCSAqIAotCSAqIEBwYXJhbSBjb3B5Ci0JICogQHBhcmFtIG9yaWdBY3Rpdml0eSAKLQkgKiBAcGFyYW0gY29weUFjdGl2aXR5IAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVJlZmVyZW5jZXMoRGlhZ3JhbSBjb3B5LCBBY3Rpdml0eSBjb3B5QWN0aXZpdHksIEFjdGl2aXR5IG9yaWdBY3Rpdml0eSkgewotCQlpbnQgZGlhZ3JhbVR5cGUgPSBEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGNvcHkpOwotCQlDb3B5RmluZGVyIGNvcHlGaW5kZXIgPSBuZXcgQ29weUZpbmRlcihvcmlnQWN0aXZpdHksIGNvcHlBY3Rpdml0eSk7Ci0JCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkvLyBjb2xsZWN0IGFsbCBjaGlsZHJlbiBmaXJzdCBlLmcuIGZvciBBY3Rpdml0eVBhcnRpdGlvbgotCQkvLyB3ZSBkb24ndCBoYXZlIHBhcnRpdGlvbiBpbnRvIHBhcnRpdGlvbiBzbyBqdXN0IGdldHRpbmcgb25lIGxldmVsIHN1Yi1jaGlsZHJlbgotCQkvLyBhcmUgZW5vdWdoIGZvciBub3cuCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNvcHkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdG9yLm5leHQoKTsKLQkJCUVPYmplY3Qgb2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQljaGlsZHJlbi5hZGQobm9kZSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlQYXJ0aXRpb24pewotCQkJCWNoaWxkcmVuLmFkZEFsbChub2RlLmdldENoaWxkcmVuKCkpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0b3IubmV4dCgpOwotCQkJRU9iamVjdCBvYmogPSBub2RlLmdldEVsZW1lbnQoKTsKLQotCQkJaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgewotCQkJCQlFTW9kZWxFbGVtZW50IG1vZGVsRWxlbWVudCA9IChFTW9kZWxFbGVtZW50KSBvYmo7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwKLQkJCQkJCQkJCXRhcmdldFByb2Nlc3MuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCWlmKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewkJCQkJCQotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBtYXBwZWRNZXRob2RFbGVtZW50ID0gY29weUZpbmRlci5maW5kQ29weSgoQnJlYWtkb3duRWxlbWVudCkgbWUpOwotCi0JCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGRpYWdyYW1UeXBlID09IElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSkgewotCQkJCWlmKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkJY2xlYXJSZWFkT25seSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSlvYmopOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCQlOb2RlQ29udGFpbmVyIG5vZGVDb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcikgb2JqOwotCQkJCQkvLyBkbyBtYXBwaW5nIGZvciBub2RlY29udGFpbmVyCi0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBub2RlQ29udGFpbmVyLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBudWxsOwotCQkJCQlpZihtZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCW1hcHBlZE1ldGhvZEVsZW1lbnQgPSBjb3B5RmluZGVyLmZpbmRDb3B5KChCcmVha2Rvd25FbGVtZW50KSBtZSk7Ci0JCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJbm9kZUNvbnRhaW5lcgotCQkJCQkJCS5zZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSBtYXBwZWRNZXRob2RFbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIGRvIG1hcHBpbmcgZm9yIGl0cyBjaGlsZHJlbgotCQkJCQlMaXN0PD8+IG5vZGVzID0gbm9kZUNvbnRhaW5lci5nZXROb2RlcygpOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCU5hbWVkTm9kZSBuYW1lZE5vZGUgPSAoTmFtZWROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJCQltZSA9IG5hbWVkTm9kZS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCQlpZiAobWUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJbWFwcGVkTWV0aG9kRWxlbWVudCA9IGNvcHlGaW5kZXIKLQkJCQkJCQkJCS5maW5kQ29weSgoQnJlYWtkb3duRWxlbWVudCkgbWUpOwotCQkJCQkJCWlmIChtYXBwZWRNZXRob2RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQkJbmFtZWROb2RlCi0JCQkJCQkJCQkJLnNldExpbmtlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIG1hcHBlZE1ldGhvZEVsZW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZGlhZ3JhbVR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pIHsKLQkJCQlpZihvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJCWNsZWFyUmVhZE9ubHkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpb2JqKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQlOYW1lZE5vZGUgbmFtZWROb2RlID0gKE5hbWVkTm9kZSkgb2JqOwotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gbmFtZWROb2RlLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYgKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJT2JqZWN0IG1hcHBlZE1ldGhvZEVsZW1lbnQgPSBjb3B5RmluZGVyLmZpbmRDb3B5KChCcmVha2Rvd25FbGVtZW50KSBtZSk7Ci0JCQkJCQlpZiAobWFwcGVkTWV0aG9kRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQkJbmFtZWROb2RlCi0JCQkJCQkJCQkuc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbWFwcGVkTWV0aG9kRWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvcGllZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0KLQkJCQkJCQkJbWdyLmdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKQotCQkJCQkJCQkJCS5yZW1vdmUoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJCQltZ3IuZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9KTsKLQkJCQljb3BpZWRFbGVtZW50cy5jbGVhcigpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGNvcGllZEVsZW1lbnRzID09IG51bGwgfHwgY29waWVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyBjb21tYW5kIGlzIG5vdCBleGVjdXRlZCB5ZXQKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUhhc2hTZXQ8T2JqZWN0PiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3BpZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyLm5leHQoKTsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmVSZXNvdXJjZSgpICE9IG51bGwpCi0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRpYWdyYW0uZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKG1nciAhPSBudWxsKQotCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMTgxMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9EZWxldGVEaWFncmFtQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuZWRpdG9yLkVkaXRvclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGRlbGV0ZSB0aGUgZGlhZ3JhbS9kaWFncmFtIGVsZW1lbnQgb2YgZ2l2ZW4gQWN0aXZpdHkvQ1AsIHRoaXMgY29tbWFuZCBpcyBwZXJmb3JtZWQKLSAqIHRocm91Z2ggbmVzdGVkIGNvbW1hbmRzIGluIHtAbGluayBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZH0uICAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRGlhZ3JhbUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzVG9SZW1vdmU7Ci0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBkTWdyID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVEaWFncmFtQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzVG9SZW1vdmUsIFByb2Nlc3MgdGFyZ2V0UHJvY2VzcykgewotCQl0aGlzLmVsZW1lbnRzVG9SZW1vdmUgPSBlbGVtZW50c1RvUmVtb3ZlOwotCQl0aGlzLnRhcmdldFByb2Nlc3MgPSB0YXJnZXRQcm9jZXNzOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjCi0JCQkJCQkJLmdldERpYWdyYW1zKChBY3Rpdml0eSkgZWxlbWVudCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkaWFncmFtcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCS8vIEJlZm9yZSBkZWxldGluZyBjbG9zZSBvcGVuZWQgZGlhZ3JhbSBlZGl0b3JzLgotCQkJCQkJCWNsb3NlRGlhZ3JhbUVkaXRvcihkaWFncmFtKTsKLQkJCQkJCQkvLyBEZWxldGUgRGlhZ3JhbS4KLQkJCQkJCQlEaWFncmFtSGVscGVyLmRlbGV0ZURpYWdyYW0oZGlhZ3JhbSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcigpIHsKLQkJaWYoZE1nciA9PSBudWxsKSB7Ci0JCQlkTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UodGFyZ2V0UHJvY2VzcywgdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGRNZ3I7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBnZXREaWFncmFtTWFuYWdlcigpOwotCQlIYXNoU2V0PE9iamVjdD4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCWJvb2xlYW4gZmlsZUV4aXN0ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCWlmIChkTWdyICE9IG51bGwgJiYgZE1nci5nZXRSZXNvdXJjZSgpICE9IG51bGwKLQkJCQkJJiYgIWRNZ3IuZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhkTWdyCi0JCQkJCQkuZ2V0UmVzb3VyY2UoKS5nZXRVUkkoKSkpOwotCQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQkJZmlsZUV4aXN0ID0gZmFsc2U7Ci0JCQkJaWYgKGZpbGVFeGlzdCkKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGRNZ3IuZ2V0UmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlyZXR1cm4gdGFyZ2V0UHJvY2VzcyAhPSBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihkTWdyICE9IG51bGwpewotCQkJZE1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3IoRGlhZ3JhbSBkaWFncmFtKXsKLQkJTGlzdCBlZGl0b3JzID0gRWRpdG9yU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFJlZ2lzdGVyZWRFZGl0b3JQYXJ0cygpOwotCQlJdGVyYXRvciBpdCA9IGVkaXRvcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3IpIHsKLQkJCQlEaWFncmFtRWRpdG9yIGRpYWdyYW1FZGl0b3IgPSAoKERpYWdyYW1FZGl0b3IpIG9iaik7Ci0JCQkJaWYgKGRpYWdyYW1FZGl0b3IuZ2V0RGlhZ3JhbSgpLmVxdWFscyhkaWFncmFtKSkgewotCQkJCQkvL2l0J3MgYWxyZWFkeSBvcGVuLCBqdXN0IGNsb3NlIGl0LgotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmFjdGl2YXRlKGRpYWdyYW1FZGl0b3IpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VFZGl0b3IoZGlhZ3JhbUVkaXRvciwgZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL0RlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjE4Mzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIENvbW1hbmQgdG8gZGVsZXRlIGRpYWdyYW0gbm9kZXMgb2YgdGhlIGRlbGV0ZWQgYnJlYWtkb3duIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBicmVha2Rvd25FbGVtZW50czsKLQlwcml2YXRlIERpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TdmM7Ci0KLQlwdWJsaWMgRGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBDb2xsZWN0aW9uPD8+IGJyZWFrZG93bkVsZW1lbnRzKSB7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5icmVha2Rvd25FbGVtZW50cyA9IGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYoZGlhZ3JhbVN2YyAhPSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyIG1nciA9IGRpYWdyYW1TdmMuZ2V0RGlhZ3JhbU1hbmFnZXIoYWN0aXZpdHkpOwotCQkJaWYobWdyICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjLmdldERpYWdyYW1zKGFjdGl2aXR5KTsKLQkJQ29sbGVjdGlvbjxWaWV3PiB2aWV3c1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxWaWV3PigpOwotCQlmb3IgKERpYWdyYW0gZGlhZ3JhbSA6IGRpYWdyYW1zKSB7Ci0JCQlBYnN0cmFjdFRyZWVJdGVyYXRvcjxWaWV3PiBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxWaWV3PihkaWFncmFtLCBmYWxzZSkgewotCi0JCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIFZpZXc+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgVmlldykgewotCQkJCQkJcmV0dXJuICgoVmlldylvYmplY3QpLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZpZXcgdmlldyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihicmVha2Rvd25FbGVtZW50cy5jb250YWlucyhCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2aWV3LCBhY3Rpdml0eSkpKSB7Ci0JCQkJCXZpZXdzVG9EZWxldGUuYWRkKHZpZXcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighdmlld3NUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCWZvciAoVmlldyB2aWV3IDogdmlld3NUb0RlbGV0ZSkgewotCQkJCVZpZXdVdGlsLmRlc3Ryb3kodmlldyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsJCQotCQlkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCUNvbGxlY3Rpb248RGlhZ3JhbT4gZGlhZ3JhbXMgPSBkaWFncmFtU3ZjLmdldERpYWdyYW1zKGFjdGl2aXR5KTsKLQkJcmV0dXJuICFkaWFncmFtcy5pc0VtcHR5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJYWN0aXZpdHkgPSBudWxsOwotCQlicmVha2Rvd25FbGVtZW50cyA9IG51bGw7Ci0JCWRpYWdyYW1TdmMuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL05lc3RlZENvbW1hbmRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ1OTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvY29tbWFuZHMvTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Db3B5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5JQWN0aW9uVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5BY3Rpdml0eUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4uVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRDb21tYW5kUHJvdmlkZXIgaW1wbGVtZW50cyBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNjcmVhdGVOZXN0ZWRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgQWN0aXZpdHlEcm9wQ29tbWFuZCkgewotCQkJQWN0aXZpdHlEcm9wQ29tbWFuZCBjbWQgPSAoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZDsKLQkJCWlmIChJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFkgPT0gY21kLmdldFR5cGUoKSkKLQkJCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvckNvcHkoY21kKTsKLQkJCWVsc2UgaWYgKElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZID09IGNtZC5nZXRUeXBlKCkpCi0JCQkJcmV0dXJuIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JEZWVwQ29weShjbWQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBQcm9jZXNzRGVlcENvcHlDb21tYW5kKSB7Ci0JCQlQcm9jZXNzRGVlcENvcHlDb21tYW5kIGNtZCA9IChQcm9jZXNzRGVlcENvcHlDb21tYW5kKSBjb21tYW5kOwotCQkJUHJvY2VzcyBkZWVwQ29weSA9IG51bGw7Ci0JCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGNtZC5nZXRSZXN1bHQoKTsKLQkJCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJZGVlcENvcHkgPSAoUHJvY2VzcykgcmVzdWx0Lml0ZXJhdG9yKCkubmV4dCgpOwotCQkJfQotCQkJaWYoZGVlcENvcHkgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb248QWN0aXZpdHk+IGRlZXBDb3BpZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotCQkJCWRlZXBDb3BpZXMuYWRkKGRlZXBDb3B5KTsKLQkJCQlyZXR1cm4gY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KGRlZXBDb3BpZXMsIGNtZC5nZXRUYXJnZXRQcm9jZXNzKCksIAotCQkJCQkJY21kLmdldENvcHlIZWxwZXIoKSwgY21kLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIG5lc3RlZCBjb21tYW5kIGZvciBEcmFnICYgRHJvcCBDb3B5Ci0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kIGNyZWF0ZU5lc3RlZENvbW1hbmRGb3JDb3B5KEFjdGl2aXR5RHJvcENvbW1hbmQgY29tbWFuZCkgewotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9ICgoQWN0aXZpdHlEcm9wQ29tbWFuZCkgY29tbWFuZCkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsgCi0JCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsICYmICFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKTsKLQotCQkJSGVscGVyIGNvcGllZEhlbHBlciA9IGNvbW1hbmQuZ2V0QWN0aXZpdHlIYW5kbGVyKCkuZ2V0Q29weUhlbHBlcigpOwotCQkJQWN0aXZpdHkgdGFyZ2V0QWN0aXZpdHkgPSBjb21tYW5kLmdldEFjdGl2aXR5KCk7Ci0JCQlQcm9jZXNzIHRhcmdldFByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGFyZ2V0QWN0aXZpdHkpOwotCQkJaWYgKHRhcmdldFByb2MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWNtZC5hcHBlbmQobmV3IENvcHlEaWFncmFtQ29tbWFuZChjb3BpZWRIZWxwZXIudmFsdWVzKCksCi0JCQkJCQkJY29waWVkSGVscGVyLCB0YXJnZXRQcm9jKSk7Ci0JCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfSBmaW5hbGx5IHsKLQkKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWNtZC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gY21kOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVkIG5lc3RlZCBjb21tYW5kIGZvciBEcmFnIGFuZCBEcm9wIERlZXAgY29weQotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoQWN0aXZpdHlEcm9wQ29tbWFuZCBjb21tYW5kKSB7Ci0JCUFjdGl2aXR5SGFuZGxlciBhY3Rpdml0eUhhbmRsZXIgPSAoKEFjdGl2aXR5RHJvcENvbW1hbmQpIGNvbW1hbmQpCi0JCQkJLmdldEFjdGl2aXR5SGFuZGxlcigpOwotCQlpZiAoYWN0aXZpdHlIYW5kbGVyICE9IG51bGwKLQkJCQkmJiAhYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBjcmVhdGVOZXN0ZWRDb21tYW5kRm9yRGVlcENvcHkoYWN0aXZpdHlIYW5kbGVyCi0JCQkJCS5nZXREZWVwQ29waWVzKCksIGFjdGl2aXR5SGFuZGxlci5nZXRUYXJnZXRQcm9jZXNzKCksCi0JCQkJCWFjdGl2aXR5SGFuZGxlci5nZXREZWVwQ29weUhlbHBlcigpLCBhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcHlDb25maWcoKSwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIENvbW1hbmQgY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KAotCQkJQ29sbGVjdGlvbjxBY3Rpdml0eT4gZGVlcENvcGllcywgZmluYWwgUHJvY2VzcyB0YXJnZXRQcm9jLAotCQkJQ29weUhlbHBlciBjb3B5SGVscGVyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCWJvb2xlYW4gc2F2ZURpYWdyYW0pIHsKLQkJQ29tcG91bmRDb21tYW5kIGNtZDsKLQkJaWYgKHNhdmVEaWFncmFtKSB7Ci0JCQljbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQkJQ29tcG91bmRDb21tYW5kLk1FUkdFX0NPTU1BTkRfQUxMKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJc3VwZXIuZXhlY3V0ZSgpOwotCi0JCQkJCS8vIHNhdmUgZGlhZ3JhbSBmaWxlCi0JCQkJCS8vCi0JCQkJCWlmIChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyCi0JCQkJCQkJLmhhc0RpYWdyYW1NYW5hZ2VyKHRhcmdldFByb2MpKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyIG1nciA9IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXIKLQkJCQkJCQkJLmdldEluc3RhbmNlKHRhcmdldFByb2MsIHRoaXMpOwotCQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkJCQkuZ2V0UGVyc2lzdGVyRm9yKHRhcmdldFByb2MuZVJlc291cmNlKCkpCi0JCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkubG9nRXJyb3IoZXgpOwotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfSBlbHNlIHsKLQkJCWNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQl9Ci0JCWZvciAoQWN0aXZpdHkgY29weUFjdCA6IGRlZXBDb3BpZXMpIHsKLQkJCUFjdGl2aXR5IG9yaWdBY3QgPSAoQWN0aXZpdHkpIGNvcHlIZWxwZXIuZ2V0T3JpZ2luYWwoY29weUFjdCk7Ci0JCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mob3JpZ0FjdCk7Ci0JCQlNYXA8QWN0aXZpdHksIEFjdGl2aXR5PiBjb3B5VG9PcmlnaW5hbE1hcCA9IG5ldyBIYXNoTWFwPEFjdGl2aXR5LCBBY3Rpdml0eT4oKTsKLQkJCUl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGNvcHlUcmVlID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+KAotCQkJCQljb3B5QWN0KSB7Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQ+IGdldENoaWxkcmVuKAotCQkJCQkJT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KSBvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQl3aGlsZSAoY29weVRyZWUuaGFzTmV4dCgpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gY29weVRyZWUubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJT2JqZWN0IG9yaWcgPSBjb3B5SGVscGVyLmdldE9yaWdpbmFsKGUpOwotCQkJCQlpZiAob3JpZyA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY3JlYXRlTmVzdGVkQ29tbWFuZEZvckRlZXBDb3B5KCk6IEZBVEFMIEVSUk9SOiBjb3VsZCBub3QgZmluZCBzb3VyY2UgYWN0aXZpdHkgb2YgZGVlcCBjb3B5OiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNvcHlUb09yaWdpbmFsTWFwLnB1dCgoQWN0aXZpdHkpIGUsIChBY3Rpdml0eSkgb3JpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljbWQuYXBwZW5kKG5ldyBDb3B5RGlhZ3JhbUZvckRlZXBDb3B5Q29tbWFuZChjb3B5VG9PcmlnaW5hbE1hcC5rZXlTZXQoKSwKLQkJCQkJY29weVRvT3JpZ2luYWxNYXAsIHNyY1Byb2MsIHRhcmdldFByb2MsIGNvcHlIZWxwZXIsIGNvbmZpZykpOwotCQl9Ci0JCXJldHVybiAhY21kLmlzRW1wdHkoKSA/IGNtZCA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNjcmVhdGVSZWxhdGVkT2JqZWN0cyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gY3JlYXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBjcmVhdGVDb21tYW5kKSB7Ci0KLQkJQ29tcG91bmRDb21tYW5kIGNtZCA9IG5ldyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKAotCQkJCUNvbXBvdW5kQ29tbWFuZC5NRVJHRV9DT01NQU5EX0FMTCk7Ci0JCWlmIChjcmVhdGVDb21tYW5kIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQpIHsKLQotCQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgbWVDb21tYW5kID0gKChNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgY3JlYXRlQ29tbWFuZCk7Ci0JCQlDb21tYW5kIGFkZENvbW1hbmQgPSBtZUNvbW1hbmQuZ2V0Q29tbWFuZCgpOwotCQkJaWYgKGFkZENvbW1hbmQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQkJRWRpdGluZ0RvbWFpbiBlZCA9ICgoQWRkQ29tbWFuZCkgYWRkQ29tbWFuZCkuZ2V0RG9tYWluKCk7Ci0JCQkJCi0JCQkJaWYgKCgoQWRkQ29tbWFuZClhZGRDb21tYW5kKS5nZXRPd25lcigpIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQkJCQkJaWYgKCFjb3B5VG9PcmlnaW5hbE1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlDb2xsZWN0aW9uIGFmZmVjdHMgPSBtZUNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWZmZWN0cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlcgotCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKAotCQkJCQkJCQkJCQljb3B5VG9PcmlnaW5hbE1hcC5rZXlTZXQoKSwKLQkJCQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAsCi0JCQkJCQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkKLQkJCQkJCQkJCQkJCQkuZ2V0UHJvY2VzcygpKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDb3B5L3Bhc3RlIHdpdGhpbiB0aGUgcHJvY2VzcyBlZGl0b3IKLQkJCQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJCQlNYXAgb3JpZ2luYWxUb0NvcHlNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCQkJCS5nZXRPcmlnaW5hbFRvQ2xpcGJvYXJkTWFwKCk7Ci0JCQkJCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQkJT2JqZWN0IG93bmVyID0gKChBZGRDb21tYW5kKSBhZGRDb21tYW5kKS5nZXRPd25lcigpOwotCQkJCQkJUHJvY2VzcyB0YXJnZXRQcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG93bmVyKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9jICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmlnaW5hbFRvQ29weU1hcC5rZXlTZXQoKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdCB2YWwgPSBvcmlnaW5hbFRvQ29weU1hcC5nZXQoa2V5KTsKLQkKLQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KHZhbCwga2V5KTsKLQkJCQkJCQl9Ci0JCi0JCQkJCQkJY21kLmFwcGVuZChuZXcgQ29weURpYWdyYW1Db21tYW5kKGNvcHlUb09yaWdpbmFsTWFwLmtleVNldCgpLAotCQkJCQkJCQkJY29weVRvT3JpZ2luYWxNYXAsIHRhcmdldFByb2MpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWNtZC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBjbWQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSU5lc3RlZENvbW1hbmRQcm92aWRlciNyZW1vdmVSZWxhdGVkT2JqZWN0cyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIHJlbW92ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb24gZGVsZXRlZEVsZW1lbnRzLAotCQkJQ29tbWFuZCBkZWxldGVDb21tYW5kKSB7Ci0JCUNvbXBvdW5kQ29tbWFuZCBjbWQgPSBuZXcgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZCgKLQkJCQlDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQlpZihkZWxldGVDb21tYW5kIGluc3RhbmNlb2YgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpewotCQkJQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKChEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZClkZWxldGVDb21tYW5kKS5nZXRDb21tYW5kKCk7Ci0JCQlMaXN0PFJlbW92ZUNvbW1hbmQ+IHJlbW92ZUNvbW1hbmRzID0gbnVsbDsKLQkJCWlmKHJlbW92ZUNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKXsKLQkJCQlyZW1vdmVDb21tYW5kcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoKFJlbW92ZUNvbW1hbmQpcmVtb3ZlQ29tbWFuZCk7Ci0JCQl9Ci0JCQllbHNlIGlmKHJlbW92ZUNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQpIHsKLQkJCQlyZW1vdmVDb21tYW5kcyA9IG5ldyBBcnJheUxpc3Q8UmVtb3ZlQ29tbWFuZD4oKTsKLQkJCQlmb3IgKENvbW1hbmQgY29tbWFuZCA6ICgoQ29tcG91bmRDb21tYW5kKXJlbW92ZUNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCkpIHsKLQkJCQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCQkJCXJlbW92ZUNvbW1hbmRzLmFkZCgoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihyZW1vdmVDb21tYW5kcyAhPSBudWxsICYmICFyZW1vdmVDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCQlPYmplY3Qgb3duZXIgPSByZW1vdmVDb21tYW5kcy5nZXQoMCkuZ2V0T3duZXIoKTsKLQkJCQlpZihvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQWN0aXZpdHkpb3duZXIpOwotCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5PiBhbGxFbGVtZW50cyA9IG5ldyBIYXNoU2V0PEFjdGl2aXR5PigpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxPYmplY3Q+KGVsZW1lbnQpIHsKLQotCQkJCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBPYmplY3Q+IGdldENoaWxkcmVuKAotCQkJCQkJCQkJCU9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJfTsKLQkJCQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQkJYWxsRWxlbWVudHMuYWRkKChBY3Rpdml0eSkgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IAotCQkJCQl9CQkJCQkKLQkJCQkJaWYoIWFsbEVsZW1lbnRzLmlzRW1wdHkoKSl7Ci0JCQkJCQljbWQuYXBwZW5kKG5ldyBEZWxldGVEaWFncmFtQ29tbWFuZChhbGxFbGVtZW50cywgcHJvY2VzcykpOwotCQkJCQl9Ci0KLQkJCQkJZm9yIChSZW1vdmVDb21tYW5kIGNvbW1hbmQgOiByZW1vdmVDb21tYW5kcykgewotCQkJCQkJaWYoY29tbWFuZC5nZXRPd25lcigpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCQlEZWxldGVEaWFncmFtTm9kZUNvbW1hbmQgZGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kID0gbmV3IERlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZCgKLQkJCQkJCQkJCShBY3Rpdml0eSkgY29tbWFuZC5nZXRPd25lcigpLCBjb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCQkJCQkJaWYoZGVsZXRlRGlhZ3JhbU5vZGVDb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCQljbWQuYXBwZW5kKGRlbGV0ZURpYWdyYW1Ob2RlQ29tbWFuZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKCFkZWxldGVkRWxlbWVudHMuaXNFbXB0eSgpKXsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGV0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KXsKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KWVsZW1lbnQ7Ci0JCQkJCVByb2Nlc3MgcHJvY2VzcyA9IHBjLmdldFByb2Nlc3MoKTsKLQkJCQkJY2xvc2VEaWFncmFtRWRpdG9ycyhwcm9jZXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYoIWNtZC5pc0VtcHR5KCkpewotCQkJcmV0dXJuIGNtZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQ2xvc2VzIERpYWdyYW0gRWRpdG9ycyBpZiB0aGUgb3duaW5nIHByb2Nlc3MgaXMgZGVsZXRlZC4KLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzKFByb2Nlc3MgcHJvY2VzcykgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZQotCQkJCS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCUFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBlZGl0b3JzVG9DbG9zZSA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IGVkaXRvclJlZmVyZW5jZXNbaV07Ci0JCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQ7Ci0JCQl0cnkgewotCQkJCWVkaXRvcklucHV0ID0gZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgZWRpdG9ySW5wdXQpCi0JCQkJCQkJLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlPYmplY3Qgd3JhcHBlciA9IGlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJT2JqZWN0IG93bmluZ1Byb2Nlc3MgPSBudWxsOwotCQkJCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJb3duaW5nUHJvY2VzcyA9IFRuZ1V0aWwKLQkJCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHdyYXBwZXIpKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXdyYXBwZXIgPSBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQlvd25pbmdQcm9jZXNzID0gVG5nVXRpbAotCQkJCQkJCQkJLmdldE93bmluZ1Byb2Nlc3MoKChCcmVha2Rvd25FbGVtZW50KSB3cmFwcGVyKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKG93bmluZ1Byb2Nlc3MgPT0gb3duaW5nUHJvY2VzcykgewotCQkJCQkJZWRpdG9yc1RvQ2xvc2UuYWRkKGVkaXRvclJlZik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JCWlmKCFlZGl0b3JzVG9DbG9zZS5pc0VtcHR5KCkpIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZzID0gbmV3IElFZGl0b3JSZWZlcmVuY2VbZWRpdG9yc1RvQ2xvc2Uuc2l6ZSgpXTsKLQkJCWVkaXRvcnNUb0Nsb3NlLnRvQXJyYXkocmVmcyk7Ci0JCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9ycyhyZWZzLCBmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2NvbW1hbmRzL1JlY29ubmVjdExpbmtDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MjVhMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9jb21tYW5kcy9SZWNvbm5lY3RMaW5rQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVWYWxpZGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlY29ubmVjdExpbmtDb21tYW5kIGV4dGVuZHMgQ29tbWFuZCB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTb3VyY2U7Ci0KLQlwcml2YXRlIEVkZ2UgbGluazsKLQotCXByaXZhdGUgTm9kZSBuZXdOb2RlLCBvbGROb2RlOwotCi0JcHJpdmF0ZSBpbnQgdmlld0luZGV4OwotCi0JcHJpdmF0ZSBQb2ludCBlbmRQb2ludDsKLQotCXByaXZhdGUgSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW47Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUwgPSAiUmVjb25uZWN0IExpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUmVjb25uZWN0TGlua0NvbW1hbmQoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIEVkZ2UgbGluaywgTm9kZSBuZXdOb2RlLCBib29sZWFuIGlzU291cmNlKSB7Ci0JCXN1cGVyKExBQkVMKTsKLQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JCXRoaXMubGluayA9IGxpbms7Ci0JCXRoaXMubmV3Tm9kZSA9IG5ld05vZGU7Ci0JCXRoaXMuaXNTb3VyY2UgPSBpc1NvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRQb2ludChQb2ludCBwKSB7Ci0JCWVuZFBvaW50ID0gcC5nZXRDb3B5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBsaW5rICE9IG51bGwgJiYgbmV3Tm9kZSAhPSBudWxsOwotCQlpZiAoIXJlc3VsdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpc1NvdXJjZSkgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdChuZXdOb2RlLCAoTm9kZSlsaW5rLmdldFRhcmdldCgpLCBsaW5rKSA9PSBudWxsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIERpYWdyYW1Db3JlVmFsaWRhdGlvbi5jaGVja1JlY29ubmVjdCgoTm9kZSlsaW5rLmdldFNvdXJjZSgpLCBuZXdOb2RlLCBsaW5rKSA9PSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBMaW5rCi0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGlzU291cmNlKSB7Ci0JCQkJCQlvbGROb2RlID0gKE5vZGUpIGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5pbmRleE9mKGxpbmspOwotCQkJCQkJfQotCQkJCQkJbGluay5zZXRTb3VyY2UobmV3Tm9kZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlvbGROb2RlID0gKE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQlpZiAob2xkTm9kZSAhPSBudWxsKSB7IC8vIHNhZmV0eSBjaGVjayB0byBoYW5kbGUgZGFuZ2xpbmcgbGluawotCQkJCQkJCXZpZXdJbmRleCA9IG9sZE5vZGUuZ2V0U291cmNlRWRnZXMoKS5pbmRleE9mKGxpbmspOwotCQkJCQkJfQotCQkJCQkJbGluay5zZXRUYXJnZXQobmV3Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3Igd2hpbGUgcmUtY29ubmVjdCB0aGUgbGluayA6IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChpc1NvdXJjZSkgewotCQkJbmV3Tm9kZS5nZXRUYXJnZXRFZGdlcygpLnJlbW92ZShsaW5rKTsKLQkJCW9sZE5vZGUuZ2V0VGFyZ2V0RWRnZXMoKS5hZGQodmlld0luZGV4LCBsaW5rKTsKLQkJfSBlbHNlIHsKLQkJCW5ld05vZGUuZ2V0U291cmNlRWRnZXMoKS5yZW1vdmUobGluayk7Ci0JCQlvbGROb2RlLmdldFNvdXJjZUVkZ2VzKCkuYWRkKHZpZXdJbmRleCwgbGluayk7Ci0JCX0KLQkJb2xkTm9kZSA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvUmFpc2VkTWFyZ2luQm9yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNThjNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9maWd1cmVzL1JhaXNlZE1hcmdpbkJvcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlICBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5NYXJnaW5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5Lkluc2V0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotCi0vKioKLSAqICBBIGJvcmRlciB3aXRoIGEgcmFpc2VkIG1hcmdpbi4KLSAqICAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmFpc2VkTWFyZ2luQm9yZGVyIGV4dGVuZHMgTWFyZ2luQm9yZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEluc2V0cyBERUZBVUxUX0lOU0VUUyA9IG5ldyBJbnNldHMoMTAsIDEwLCAxMCwgMTApOwotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcigpIHsKLQkJdGhpcyhERUZBVUxUX0lOU0VUUyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihJbnNldHMgaW5zZXRzKSB7Ci0JCXN1cGVyKGluc2V0cyk7Ci0JfQotCi0JcHVibGljIFJhaXNlZE1hcmdpbkJvcmRlcihpbnQgdCwgaW50IGwsIGludCBiLCBpbnQgcikgewotCQlzdXBlcih0LCBsLCBiLCByKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5Cb3JkZXIjZ2V0SW5zZXRzKElGaWd1cmUpCi0JICovCi0JcHVibGljIEluc2V0cyBnZXRJbnNldHMoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJcmV0dXJuIGluc2V0czsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQm9yZGVyI2lzT3BhcXVlKCkKLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gaXNPcGFxdWUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLkJvcmRlciNwYWludChJRmlndXJlLCBHcmFwaGljcywgSW5zZXRzKQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50KElGaWd1cmUgZmlndXJlLCBHcmFwaGljcyBnLCBJbnNldHMgaW5zZXRzKSB7Ci0JCWcuc2V0TGluZVN0eWxlKEdyYXBoaWNzLkxJTkVfU09MSUQpOwotCQlnLnNldExpbmVXaWR0aCgxKTsKLQkJZy5zZXRGb3JlZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMuYnV0dG9uTGlnaHRlc3QpOwotCQlSZWN0YW5nbGUgciA9IGdldFBhaW50UmVjdGFuZ2xlKGZpZ3VyZSwgaW5zZXRzKTsKLQkJci5yZXNpemUoLTEsIC0xKTsKLQkJZy5kcmF3TGluZShyLngsIHIueSwgci5yaWdodCgpLCByLnkpOwotCQlnLmRyYXdMaW5lKHIueCwgci55LCByLngsIHIuYm90dG9tKCkpOwotCQlnLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5idXR0b25EYXJrZXIpOwotCQlnLmRyYXdMaW5lKHIueCwgci5ib3R0b20oKSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQkJZy5kcmF3TGluZShyLnJpZ2h0KCksIHIueSwgci5yaWdodCgpLCByLmJvdHRvbSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9XaWRlbmVkV3JhcExhYmVsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL2ZpZ3VyZXMvV2lkZW5lZFdyYXBMYWJlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE2NTc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvZmlndXJlcy9XaWRlbmVkV3JhcExhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmZpZ3VyZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLQotLyoqCi0gKiBUZW1wb3JhcnkgcmVwbGFjZW1lbnQgZm9yIHtAbGluayBXcmFwTGFiZWx9IHVudGlsIHRoZSB0ZXh0IGN1dC1vZmYgaXNzdWUgaXMgZml4ZWQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBXaWRlbmVkV3JhcExhYmVsIGV4dGVuZHMgV3JhcExhYmVsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IERFTFRBX0ZBQ1RPUiA9IDAuMDVmOwotCQotCXByaXZhdGUgRGltZW5zaW9uIHRleHRTaXplOwotCXByaXZhdGUgRGltZW5zaW9uIGFkanVzdGVkVGV4dFNpemU7Ci0JCi0JcHVibGljIFdpZGVuZWRXcmFwTGFiZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEaW1lbnNpb24gZ2V0VGV4dFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsKLQkJRGltZW5zaW9uIG5ld1RleHRTaXplID0gc3VwZXIuZ2V0VGV4dFNpemUod0hpbnQsIGhIaW50KTsKLQkJaWYobmV3VGV4dFNpemUgIT0gbnVsbCAmJiBuZXdUZXh0U2l6ZSAhPSB0ZXh0U2l6ZSkgewotCQkJdGV4dFNpemUgPSBuZXdUZXh0U2l6ZTsKLQkJCQotCQkJLy8gd29yay1hcm91bmQ6IGluY3JlYXNlIHRoZSB0ZXh0IHNpemUgdG8gYXZvaWQgdGV4dCBjdXQtb2ZmCi0JCQkvLwotCQkJYWRqdXN0ZWRUZXh0U2l6ZSA9IHRleHRTaXplLmdldEV4cGFuZGVkKChpbnQpIE1hdGguY2VpbCh0ZXh0U2l6ZS53aWR0aCAqIERFTFRBX0ZBQ1RPUiksIDQpOwotCQl9Ci0JCXJldHVybiBhZGp1c3RlZFRleHRTaXplOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0VGV4dExvY2F0aW9uKCkgewotCQlQb2ludCBwID0gc3VwZXIuZ2V0VGV4dExvY2F0aW9uKCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCk7Ci0JCURpbWVuc2lvbiB0cyA9IGdldFRleHRTaXplKHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJaWYoci53aWR0aCA8PSB0cy53aWR0aCkgewotCQkJcC54ID0gMDsKLQkJCWlmKCFnZXRUZXh0KCkuZXF1YWxzSWdub3JlQ2FzZShnZXRTdWJTdHJpbmdUZXh0KCkpKSB7Ci0JCQkJaW52YWxpZGF0ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9BYnN0cmFjdERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAyZmE4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvQWJzdHJhY3REaWFncmFtRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5BY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuQ3JlYXRlRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZWdhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRpYWdyYW1BY3Rpb25zU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cy5JTGlicmFyeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLklNZXRob2RFbGVtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5lZGl0b3JzLklNZXRob2RFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkFjdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5hY3Rpb25zLkdFRkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkucGFydHMuU2Nyb2xsaW5nR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmFjdGlvbnMuQWN0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5pbnRlcm5hbC5TZWxlY3RBbGxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmVkaXRvci5GaWxlRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcy5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlhZ3JhbUVkaXRvciBleHRlbmRzIEZpbGVEaWFncmFtRWRpdG9yIGltcGxlbWVudHMgSUdvdG9NYXJrZXIsIElNZXRob2RFZGl0b3IgewotCi0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBkaWFncmFtTWdyOwotCXByaXZhdGUgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlIGFjdGlvblNlcnZpY2UgPSBudWxsOwotCQotCXByaXZhdGUgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXA7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQlwcml2YXRlIEFkYXB0ZXJJbXBsIHRpdGxlQWRhcHRlcjsKLQotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmKGV2ZW50LmdldFNvdXJjZSgpID09IGRpYWdyYW1NZ3IpIHsKLQkJCQlJRG9jdW1lbnRQcm92aWRlciBkb2NQcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCQlpZihkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJaWYoIWlzRGlydHkoKSkgewotCQkJCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKWRvY1Byb3ZpZGVyKS5oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCQotCX07Ci0JCi0JLy8gTGlzdGVuZXJzIHRvIHJlZnJlc2ggZGlhZ3JhbSBpZiBjb25maWd1cmF0aW9uIGdvdCBjaGFuZ2VkCi0JLy8KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlicmFyeUxpc3RlbmVyID0gbmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkJc3dpdGNoIChvcHRpb24pIHsKLQkJCWNhc2UgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRDogewotCQkJCWlmIChjb2xsZWN0aW9uICE9IG51bGwgJiYgY29sbGVjdGlvbi5jb250YWlucyhjdXJyZW50Q29uZmlnKSkgewotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQl0cnkgewotCQkJCQkJUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRS5zZXRNZXRob2RDb25maWd1cmF0aW9uKGN1cnJlbnRDb25maWcpOwkJCQkJCi0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yLklOU1RBTkNFLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCQkJfQotCQkJCX0JCQotCQkJCWJyZWFrOwotCQkJfQotCQkJLy8gaGFuZGxlZCBieSBsaWJTdmNMaXN0ZW5lcgotCQkJLy8KLS8vCQkJY2FzZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DT05GSUdVUkFUSU9OX1NFTEVDVEVEOiB7Ci0vLwkJCQljb25maWdDaGFuZ2VkKCk7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotCQkJfQotCQl9Ci0JfTsKLQkKLQlwcml2YXRlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyID0gbmV3IExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJY29uZmlnQ2hhbmdlZCgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWc7Ci0KLQkvL1RPRE86IGlmIHRoaXMgZmxhZyBpcyBzZXQsIHJlZnJlc2ggZGlhZ3JhbSBpZiBuZWVkZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGFjdGl2YXRlZCAKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFJlZnJlc2g7Ci0JcHJpdmF0ZSBEaWFncmFtU2VydmljZSBkaWFncmFtU3ZjOwotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUVkaXRvcigpIHsKLQkJc3VwZXIodHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1FZGl0b3IoYm9vbGVhbiBoYXNGbHlvdXRQYWxldHRlKSB7Ci0JCXN1cGVyKGhhc0ZseW91dFBhbGV0dGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWRpdGluZ0RvbWFpbklEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLkVkaXRpbmdEb21haW4iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKCkgewotCQlpZiAoZGlhZ3JhbU1nciA9PSBudWxsKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSk7Ci0JCQlkaWFncmFtTWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYywgdGhpcyk7Ci0JCQlkaWFncmFtTWdyLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1NZ3I7Ci0JfQotCQotCXByb3RlY3RlZCBEaWFncmFtU2VydmljZSBnZXREaWFncmFtU2VydmljZSgpIHsKLQkJaWYoZGlhZ3JhbVN2YyA9PSBudWxsKSB7Ci0JCQlkaWFncmFtU3ZjID0gbmV3IERpYWdyYW1TZXJ2aWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1TdmM7Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGNyZWF0ZUVkaXRpbmdEb21haW4oKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IGdldERpYWdyYW1NYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlkb21haW4uc2V0SUQoZ2V0RWRpdGluZ0RvbWFpbklEKCkpOwotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvciNzZXREb2N1bWVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlzZXREb2N1bWVudFByb3ZpZGVyKG5ldyBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKGdldERpYWdyYW1NYW5hZ2VyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9TeW5jaHJvbml6ZShPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJLy8gcmVsb2FkIGRpYWdyYW0ncyByZXNvdXJjZQotCQkJCS8vCi0JCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQltZ3IucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJCQkJbWdyLnJlbG9hZCgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaWFncmFtQ29yZVBsdWdpbi5nZXRQbHVnaW5JZCgpLAotCQkJCQkJCTAsICJFcnJvciByZWxvYWRpbmcgZGlhZ3JhbSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbWdyLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCQkJfQotCQkJCXN1cGVyLmRvU3luY2hyb25pemUoZWxlbWVudCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yI2RvU2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0LCBib29sZWFuKQotCSAqIEBjdXN0b20KLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCwgYm9vbGVhbiByZWxlYXNlRWRpdG9yQ29udGVudHMpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWFjdGl2aXR5ID0gKEFjdGl2aXR5KSBnZXRNZXRob2RFbGVtZW50KGlucHV0KTsKLQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9IG51bGw7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQlpbnB1dFByb3h5ID0gKERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSBpbnB1dDsKLQkJCWlucHV0UHJveHkuc2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oY3JlYXRlRWRpdGluZ0RvbWFpbigpKTsKLQkJfQotCQlzdXBlci5kb1NldElucHV0KGlucHV0LCByZWxlYXNlRWRpdG9yQ29udGVudHMpOwotCQlpZihpc0VkaXRhYmxlKCkgJiYgaW5wdXRQcm94eSAhPSBudWxsICYmICFpbnB1dFByb3h5LmlzTmV3RGlhZ3JhbSgpKSB7Ci0JCQlnZXREaWFncmFtTWFuYWdlcigpLmJhY2t1cERpYWdyYW0oYWN0aXZpdHksIGdldERpYWdyYW0oKSk7Ci0JCX0KLQkJaW5pdGlhbGl6ZVRpdGxlKGlucHV0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZWRpdG9yJ3MgdGl0bGUgYmFzZWQgb24gdGhlIGdpdmVuIGVkaXRvciBpbnB1dC4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgZWRpdG9yIGlucHV0IHRvIGJlIHVzZWQKLQkgKiBAY3VzdG9tCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUaXRsZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQotCQlTdHJpbmcgdGl0bGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGZpbGVJbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGlucHV0OwotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9IGZpbGVJbnB1dC5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCU1ldGhvZEVsZW1lbnQgaW5wdXRFbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCWlmIChpbnB1dEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCS8vdGl0bGUgPSBpbnB1dEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCXRpdGxlID0gZ2V0UGFydE5hbWVQcmVmaXgoKSArIAotCQkJCQkJCWlucHV0RWxlbWVudC5nZXROYW1lKCkrCi0JCQkJCQkJU3RyaW5nU3RhdGljcy5DT01NQSArIFN0cmluZ1N0YXRpY3MuU1BBQ0UgKyAKLQkJCQkJCQlkaWFncmFtSW5wdXQuZ2V0U3VwcHJlc3Npb24oKS5nZXRQcm9jZXNzKCkuZ2V0TmFtZSgpOyAKLS8vCQkJCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotLy8JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJSW1hZ2UgdGl0bGVJbWFnZSA9IGdldFBhcnRJbWFnZSgpOwkJCQkKLQkJCQlzZXRUaXRsZUltYWdlKHRpdGxlSW1hZ2UpOwotCQkJfQotCQl9Ci0JCXNldFBhcnROYW1lKHRpdGxlKTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKFBST1BfRElSVFkpOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3Ijc2FuaXR5Q2hlY2tTdGF0ZShvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICogQGN1c3RvbQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhbml0eUNoZWNrU3RhdGUoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlEb2N1bWVudFByb3ZpZGVyIHAgPSBnZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCWlmIChwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJbG9uZyBzdGFtcCA9IHAuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoaW5wdXQpOwotCQlpZiAoc3RhbXAgIT0gZk1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCQlmTW9kaWZpY2F0aW9uU3RhbXAgPSBzdGFtcDsKLQkJCWlmICghcC5pc1N5bmNocm9uaXplZChpbnB1dCkpIHsKLQkJCQloYW5kbGVFZGl0b3JJbnB1dENoYW5nZWQoKTsKLQkJCQlpZighcC5pc1N5bmNocm9uaXplZChpbnB1dCkgJiYgcCBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXApLmFsbG93RWRpdGluZyhpbnB1dCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXVwZGF0ZVN0YXRlKGdldEVkaXRvcklucHV0KCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5wYXJ0cy5EaWFncmFtRG9jdW1lbnRFZGl0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQkKLQkJLy8gaWYgY2hhbmdlcyBkaXNjYXJkZWQsIHJldmVyc2UgdG8gc2F2ZWQKLQkJLy8JCQotCQlpZihpc0RpcnR5KCkpIHsKLQkJCXJldmVyc2VUb1NhdmVkKCk7Ci0JCX0JCQotCQkKLQkJaWYodGl0bGVBZGFwdGVyICE9IG51bGwpewotCQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0TWV0aG9kRWxlbWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmKGUgIT0gbnVsbCl7Ci0JCQkJZS5lQWRhcHRlcnMoKS5yZW1vdmUodGl0bGVBZGFwdGVyKTsKLQkJCX0KLQkJCXRpdGxlQWRhcHRlciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKGRpYWdyYW1NZ3IgIT0gbnVsbCkgewotCQkJaWYoYWN0aXZpdHkgIT0gbnVsbCAmJiBkaWFncmFtICE9IG51bGwpIHsKLQkJCQlkaWFncmFtTWdyLnJlbW92ZURpYWdyYW1CYWNrdXAoYWN0aXZpdHksIGRpYWdyYW0uZ2V0VHlwZSgpKTsKLQkJCX0KLQkJCWRpYWdyYW1NZ3IucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihyZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJCWRpYWdyYW1NZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCX0JCQotCQkKLQkJaWYoZGlhZ3JhbVN2YyAhPSBudWxsKSB7Ci0JCQlkaWFncmFtU3ZjLmRpc3Bvc2UoKTsKLQkJfQotCQkJCQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQkJCi0JCS8vIFJlbW92ZSB0aGUgYWRhcHRlciBmcm9tIHRoZSB1bWwgYWN0aXZpdHkgaWYgZWRpdG9yIGlzIGNsb3NlZC4KLQkJaWYoZ2V0RGlhZ3JhbSgpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KXsKLQkJCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IGFjdCA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSlnZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpOwotCQkJaWYoYWN0ICE9IG51bGwgJiYgZ2V0RGlhZ3JhbUFkYXB0ZXIoKSAhPSBudWxsKXsKLQkJCQlhY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKGdldERpYWdyYW1BZGFwdGVyKCkpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBkaXNwb3NlIHRoZSBpbnB1dAotCQkvLwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZihpbnB1dCBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkoKElEaXNwb3NhYmxlKWlucHV0KS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCURpYWdyYW1FZGl0UGFydCBlZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQlpZihlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQllZGl0UGFydC5zZXRNb2RlbChudWxsKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW1BZGFwdGVyIGdldERpYWdyYW1BZGFwdGVyKCkgewotCQlWaWV3IHZpZXcgPSAoKFZpZXcpIGdldERpYWdyYW1FZGl0UGFydCgpLmdldE1vZGVsKCkpOwotCQlyZXR1cm4gdmlldyAhPSBudWxsID8gKERpYWdyYW1BZGFwdGVyKSBCcmlkZ2VIZWxwZXIKLQkJCQkuZ2V0Tm9kZUFkYXB0ZXIodmlldy5nZXRFbGVtZW50KCkpIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmV2ZXJzZVRvU2F2ZWQoKSB7Ci0JCXRyeSB7Ci0JCQlJRG9jdW1lbnRQcm92aWRlciBwID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJaWYocCBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpcCkucmV2ZXJzZVRvU2F2ZWQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQl9Ci0JCQkKLQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBnZXREaWFncmFtQWRhcHRlcigpOwotCQkJaWYoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJLy9UT0RPOiByZXZlcnNlIHRvIHNhdmVkIGZvciBBREQgYW5kIFdQREQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IgPSBhZGFwdGVyLmdldEFjdGlvbk1hbmFnZXIoKTsKLQkJCWJvb2xlYW4gZGlydHkgPSBhY3Rpb25NZ3IuaXNTYXZlTmVlZGVkKCk7Ci0JCQlpZiAoZGlydHkpIHsKLQkJCQlhY3Rpb25NZ3IudW5kb0FsbCgpOwotLy8JCQkJZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLnVuZG8oZ2V0VW5kb0NvbnRleHQoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0vLwkJCQlnZXRPcGVyYXRpb25IaXN0b3J5KCkuZGlzcG9zZShnZXRVbmRvQ29udGV4dCgpLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJCWdldEFjdGlvbk1hbmFnZXIoKS5jbGVhcigpOwotCi0JCQkvLyBzYXZlIHRoZSB1bmRvbmUgY2hhbmdlcyBvbmx5IGlmIHRoZSByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkIG91dHNpZGUgdGhpcyBlZGl0b3IKLQkJCS8vCi0JCQlib29sZWFuIHNhdmVOZWVkZWQgPSBkaXJ0eQotCQkJJiYgZ2V0TGFzdE1vZGlmaWVkKCkgPiBhZGFwdGVyLmdldFVtYUxhc3RNb2RpZmllZCgpOwotCQkJTWV0aG9kRWxlbWVudCBtZTsKLQkJCWlmIChzYXZlTmVlZGVkICYmIChtZSA9IGdldE1ldGhvZEVsZW1lbnRGcm9tSW5wdXQoKSkgIT0gbnVsbCkgewotCQkJCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUobWUuZVJlc291cmNlKCkpOwotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vVE9ETzogcmVsb2FkIGxpYnJhcnkgbmVlZGVkCi0JCQkJCQkvLwkJCQkJVmlld0hlbHBlci5yZWxvYWRDdXJyZW50TGlicmFyeShnZXRTaXRlKCkuZ2V0U2hlbGwoKSwgbnVsbCk7Ci0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0RWRpdG9ySW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJcmV0dXJuICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgaW5wdXQpCi0JCQkJCS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKS5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQlyZXR1cm4gKChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpIGlucHV0KQotCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TWV0aG9kRWxlbWVudEZyb21JbnB1dCgpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJcmV0dXJuIGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlEaWFncmFtQWRhcHRlciBkaWFncmFtQWRhcHRlciA9IGdldERpYWdyYW1BZGFwdGVyKCk7Ci0JCWlmKGRpYWdyYW1BZGFwdGVyICE9IG51bGwpIHsKLQkJCUlBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciA9IGdldERpYWdyYW1BZGFwdGVyKCkuZ2V0QWN0aW9uTWFuYWdlcigpOwotCQkJaWYgKGFjdGlvbk1nciAhPSBudWxsICYmIGFjdGlvbk1nci5pc1NhdmVOZWVkZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soIlNhdmluZyIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXByb2dyZXNzTW9uaXRvci5zZXRUYXNrTmFtZShOTFMuYmluZChEaWFncmFtQ29yZVJlc291cmNlcy5Qcm9ncmVzc19TYXZpbmdfbWVzc2FnZSwKLQkJCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UuZ2V0VVJJKCkKLQkJCQkJCQkJCQkJLnRvRmlsZVN0cmluZygpIDogIiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCWFjdGlvbk1nci5zYXZlSXNEb25lKCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJCQkJCS8vCQkJCQkJVmlld0hlbHBlcgotCQkJCQkJCS8vCQkJCQkJLnJlbG9hZEN1cnJlbnRMaWJhcnlPblJvbGxiYWNrRXJyb3IoZ2V0U2l0ZSgpCi0JCQkJCQkJLy8JCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQkvKgotCQkJCQkJICogTk8gVUkgbW9kdWxlIHNob3VsZCBub3QgaW52b2x2ZSB3aXRoIFVJIGNsYXNzZXMKLQkJCQkJCSAqIHVzZSBjYWxsYmFjayB0byBoYW5kbGUgc3VjaCBraW5kIG9mIHNpdHVhdGlvbgotCQkJCQkJICogSmluaHVhIFhpLCAwMS8xMy8wOAotCQkJCQkJKi8KLS8vCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5V2FybmluZygKLS8vCQkJCQkJCQlnZXRTaXRlKCkuZ2V0U2hlbGwoKS5nZXRUZXh0KCksCi0vLwkJCQkJCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV2FybmluZ19TYXZpbmdfRGlhZ3JhbSwgZS5nZXRNZXNzYWdlKCksCi0vLwkJCQkJCQkJZSk7Ci0JCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheVdhcm5pbmcoCi0JCQkJCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCksIAotCQkJCQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5XYXJuaW5nX1NhdmluZ19EaWFncmFtLCBlLmdldE1lc3NhZ2UoKSwKLQkJCQkJCQkJZSk7Ci0JCQkJCQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IGV4dGVuZHMgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciBpbXBsZW1lbnRzIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlciB7Ci0KLQkJcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKSB7Ci0JCQlyZXR1cm4gKChJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KWdldEVkaXRvcklucHV0KCkpLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvcigpIHsKLQkJCXJldHVybiBBYnN0cmFjdERpYWdyYW1FZGl0b3IudGhpczsKLQkJfQkJCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlciBjcmVhdGVTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCQotCQljdXJyZW50Q29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkKLQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBmb3IgY3VycmVudCBzZWxlY3Rpb24gb2YgTWV0aG9kQ29uZmlndXJhdGlvbiBvciBjaGFuZ2VzIGluIAotCQkvLyBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JCS8vCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkTGlzdGVuZXIobGlicmFyeUxpc3RlbmVyKTsKLQkJfQotCQlnZXRHcmFwaGljYWxDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRG91YmxlQ2xpY2soZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKTsKLSAgICAgICAgQ29udGV4dE1lbnVQcm92aWRlciBwcm92aWRlciA9IG5ldyBEaWFncmFtQ29udGV4dE1lbnVQcm92aWRlcih0aGlzLAotICAgICAgICAgICAgICAgIGdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKSk7Ci0gICAgICAgICAgICB2aWV3ZXIuc2V0Q29udGV4dE1lbnUocHJvdmlkZXIpOwotICAgICAgICAgICAgZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoQWN0aW9uSWRzLkRJQUdSQU1fRURJVE9SX0NPTlRFWFRfTUVOVSwKLSAgICAgICAgICAgICAgICBwcm92aWRlciwgdmlld2VyKTsKLQkJaWYoYWN0aW9uU2VydmljZSAhPSBudWxsKXsKLQkJCWFjdGlvblNlcnZpY2Uuc2V0R3JhcGhpY2FsVmlld2VyKHZpZXdlcik7Ci0JCX0KLQkJCi0JCXRpdGxlQWRhcHRlciA9IG5ldyBBZGFwdGVySW1wbCgpewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudC5jbGFzcykpIHsKLQkJCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0vLwkJCQkJc2V0TmFtZShtc2cuZ2V0TmV3U3RyaW5nVmFsdWUoKSk7Ci0JCQkJCWluaXRpYWxpemVUaXRsZShnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlNZXRob2RFbGVtZW50IGUgPSBnZXRNZXRob2RFbGVtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQlpZihlICE9IG51bGwgJiYgdGl0bGVBZGFwdGVyICE9IG51bGwpewotCQkJZS5lQWRhcHRlcnMoKS5hZGQodGl0bGVBZGFwdGVyKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ0NoYW5nZWQoKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlpZihjdXJyZW50Q29uZmlnICE9IGNvbmZpZykgewotCQkJLy8gcmVmcmVzaCBvbmx5IGlmIHRoZSBhY3RpdmUgcGFydCBpcyB0aGlzIGRpYWdyYW0gZWRpdG9yIG9yIHByb2Nlc3MgZWRpdG9yIG9mIHRoZSBwcm9jZXNzCi0JCQkvLyB0aGF0IG93bnMgdGhpcyBkaWFncmFtCi0JCQkvLwotCQkJSVdvcmtiZW5jaFBhcnQgYWN0aXZlUGFydCA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9IGFjdGl2ZVBhcnQgPT0gdGhpczsKLQkJCWlmKCFyZWZyZXNoKSB7Ci0JCQkJaWYoYWN0aXZlUGFydCBpbnN0YW5jZW9mIElFZGl0b3JQYXJ0KSB7Ci0JCQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9ICgoSUVkaXRvclBhcnQpYWN0aXZlUGFydCkuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYoaW5wdXQgaW5zdGFuY2VvZiBJTWV0aG9kRWxlbWVudFByb3ZpZGVyKSB7Ci0JCQkJCQlPYmplY3QgZSA9ICgoSU1ldGhvZEVsZW1lbnRQcm92aWRlcilpbnB1dCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlyZWZyZXNoID0gZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgJiYgCi0JCQkJCQkJZ2V0UHJvY2VzcygpID09ICgoUHJvY2Vzc0NvbXBvbmVudCllKS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihyZWZyZXNoKSB7Ci0JCQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJCQlyZWZyZXNoKCk7Ci0JCQkJbmVlZFJlZnJlc2ggPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5lZWRSZWZyZXNoID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlpZihnZXREb2N1bWVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKXsKLQkJCVNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSAoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpZ2V0RG9jdW1lbnRQcm92aWRlcigpKTsKLQkJCURpYWdyYW1FZGl0UGFydCBlZGl0UGFydCA9IGdldERpYWdyYW1FZGl0UGFydCgpOwotCQkJYm9vbGVhbiB3YXNEaXJ0eSA9IGlzRGlydHkoKTsKLQkJCWJvb2xlYW4gd2FzQmFzZURpcnR5ID0gZmFsc2U7Ci0JCQlJRWRpdG9yUGFydCBiYXNlRWRpdG9yID0gbnVsbDsKLQkJCWZpbmFsIGJvb2xlYW4gaXNJbmhlcml0ZWQgPSBEaWFncmFtRWRpdG9yVXRpbC5pc0luaGVyaXRlZChlZGl0UGFydCk7Ci0JCQlpZihpc0luaGVyaXRlZCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkpOwotCQkJCVN0cmluZyB0eXBlID0gZWRpdFBhcnQuZ2V0RGlhZ3JhbVZpZXcoKS5nZXRUeXBlKCk7Ci0JCQkJCi0JCQkJLy8gdHJ5IHRvIGZpbmQgdGhlIGRpcnR5IGZsYWcgb2YgYmFzZSBkaWFncmFtIGVkaXRvcgotCQkJCS8vCi0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBnZXRTaXRlKCkuZ2V0UGFnZSgpLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUVkaXRvclJlZmVyZW5jZSByZWYgPSBlZGl0b3JSZWZzW2ldOwotCQkJCQl0cnkgewotCQkJCQkJaWYocmVmLmdldEVkaXRvcklucHV0KCkgaW5zdGFuY2VvZiBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5KXJlZi5nZXRFZGl0b3JJbnB1dCgpKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJCQlpZihpbnB1dC5nZXRXcmFwcGVyKCkgPT0gbnVsbCAmJiBpbnB1dC5nZXRNZXRob2RFbGVtZW50KCkgPT0gZWxlbWVudCAmJgotCQkJCQkJCQkJRGlhZ3JhbU1hbmFnZXIuZ2V0RGlhZ3JhbVR5cGUodHlwZSkgPT0gaW5wdXQuZ2V0RGlhZ3JhbVR5cGUoKSkgewotCQkJCQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQkJCQkJaWYoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQkJCXdhc0Jhc2VEaXJ0eSA9IGVkaXRvci5pc0RpcnR5KCk7Ci0JCQkJCQkJCQliYXNlRWRpdG9yID0gZWRpdG9yOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJZG9jUHJvdmlkZXIuc2V0Q29udGVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmKHdhc0RpcnR5KSB7Ci0JCQkJZG9jUHJvdmlkZXIuc2V0Q2FuU2F2ZURvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJLy8gZWRpdG9ycyBjYW4gYmVjb21lIGRpcnR5IGFmdGVyIHJlZnJlc2gKLQkJCS8vIGNsZWFyIGRpcnR5IGZsYWcKLQkJCS8vCi0JCQllbHNlIGlmKGlzRGlydHkoKSkgewotCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikgZ2V0RG9jdW1lbnRQcm92aWRlcigpKQotCQkJCQkJLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQl9Ci0JCQlpZihiYXNlRWRpdG9yICE9IG51bGwgJiYgIXdhc0Jhc2VEaXJ0eSkgewotCQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKERpYWdyYW1Eb2N1bWVudEVkaXRvciliYXNlRWRpdG9yKS5nZXREb2N1bWVudFByb3ZpZGVyKCkpCi0JCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKChJRmlsZUVkaXRvcklucHV0KSBiYXNlRWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJfQotCQkJdXBkYXRlU3RhdGUoZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQl9Ci0JCi0JLy8gRG9lcyBub3RoaW5nIGJ1dCBmb3Igb3ZlcnJpZGUuIAotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURvdWJsZUNsaWNrKEV2ZW50IGV2ZW50KSB7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCWlmKCFEaWFncmFtRWRpdG9yVXRpbC5pc01vZGlmaWFibGUoZ2V0RWRpdG9ySW5wdXQoKSkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0RpcnR5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCWlmKGdldERvY3VtZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpewotCQkJcmV0dXJuICEoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpZ2V0RG9jdW1lbnRQcm92aWRlcigpKS5nZXRMb2NrZWRTdGF0ZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgS2V5SGFuZGxlciBnZXRLZXlIYW5kbGVyKCkgewotCQlLZXlIYW5kbGVyIGtleUhhbmRsZXIgPSAgc3VwZXIuZ2V0S2V5SGFuZGxlcigpOwotCQlpZihrZXlIYW5kbGVyICE9IG51bGwpewotCQkJQWN0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRBY3Rpb25SZWdpc3RyeSgpOwotCQkJSUFjdGlvbiBhY3Rpb24gPSByZWdpc3RyeS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCQkKLQkJCWlmKGFjdGlvbiAhPSBudWxsICYmICEoYWN0aW9uIGluc3RhbmNlb2YgRGVsZWdhdGVBY3Rpb24pKXsKLQkJCQlnZXRBY3Rpb25SZWdpc3RyeSgpLnJlbW92ZUFjdGlvbihhY3Rpb24pOwotCQkJCWdldFNlbGVjdGlvbkFjdGlvbnMoKS5yZW1vdmUoYWN0aW9uKTsKLQkJCQlhY3Rpb24gPSBuZXcgRGVsZWdhdGVBY3Rpb24oKElXb3JrYmVuY2hQYXJ0KXRoaXMsQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7Ci0JCQkJYWN0aW9uLnNldElkKEFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCkpOwotCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24oYWN0aW9uKTsKLQkJCQlnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJCX0KLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5ERUwsIDEyNywgMCksCi0gICAgICAgICAgICAJZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkJTLCA4LCAwKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoLyogQ1RSTCArIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIEtleVN0cm9rZS5nZXRQcmVzc2VkKChjaGFyKSAweDA0LCAxMDAsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25GYWN0b3J5LkRFTEVURS5nZXRJZCgpKSk7Ci0gICAgICAgICAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKG5ldyBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbih0aGlzLFBvc2l0aW9uQ29uc3RhbnRzLlNPVVRIKSk7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbiBtb3ZlQWN0aW9uID0gKChBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbilnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5NT1ZFX0RPV05fQUNUSU9OKSk7Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuQVJST1dfRE9XTiwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5OT1JUSCkpOwotICAgICAgICAgICAgbW92ZUFjdGlvbiA9ICgoQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24pZ2V0QWN0aW9uUmVnaXN0cnkoKS5nZXRBY3Rpb24oQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24uTU9WRV9VUF9BQ1RJT04pKTsKLSAgICAgICAgICAgIGtleUhhbmRsZXIucHV0KEtleVN0cm9rZS5nZXRQcmVzc2VkKFNXVC5BUlJPV19VUCwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5XRVNUKSk7Ci0gICAgICAgICAgICBtb3ZlQWN0aW9uID0gKChBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbilnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5NT1ZFX0xFRlRfQUNUSU9OKSk7Ci0gICAgICAgICAgICBrZXlIYW5kbGVyLnB1dChLZXlTdHJva2UuZ2V0UHJlc3NlZChTV1QuQVJST1dfTEVGVCwgU1dULkNUUkwpLAotICAgICAgICAgICAgCQltb3ZlQWN0aW9uKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihuZXcgQWNjZXNzaWJpbGl0eU1vdmVBY3Rpb24odGhpcyxQb3NpdGlvbkNvbnN0YW50cy5FQVNUKSk7Ci0gICAgICAgICAgICBtb3ZlQWN0aW9uID0gKChBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbilnZXRBY3Rpb25SZWdpc3RyeSgpLmdldEFjdGlvbihBY2Nlc3NpYmlsaXR5TW92ZUFjdGlvbi5NT1ZFX1JJR0hUX0FDVElPTikpOwotICAgICAgICAgICAga2V5SGFuZGxlci5wdXQoS2V5U3Ryb2tlLmdldFByZXNzZWQoU1dULkFSUk9XX1JJR0hULCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAJCW1vdmVBY3Rpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiBDVFJMICsgQSAqLwotICAgICAgICAgICAgYWN0aW9uID0gU2VsZWN0QWxsQWN0aW9uLmNyZWF0ZVNlbGVjdEFsbEFjdGlvbihnZXRFZGl0b3JTaXRlKCkKLQkJCQkJLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSk7Ci0gICAgICAgICAgICBnZXRBY3Rpb25SZWdpc3RyeSgpLnJlZ2lzdGVyQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICBnZXRTZWxlY3Rpb25BY3Rpb25zKCkuYWRkKGFjdGlvbi5nZXRJZCgpKTsKLQkJCWtleUhhbmRsZXIucHV0KAotICAgICAgICAgICAgCQlLZXlTdHJva2UuZ2V0UmVsZWFzZWQoKGNoYXIpIDB4MSwgOTcsIFNXVC5DVFJMKSwKLSAgICAgICAgICAgIAkJYWN0aW9uKTsKLQkJCS8vIEtleSBwcmVzc2VkIGV2ZW50IGZvciBDVFJMICsgQSBpcyBub3QgdHJpZ2dlcmVkLCB1c2Uga2V5IHJlbGVhc2VkIGV2ZW50IGZvciBub3cKLQkJCS8vCi0JCQlrZXlIYW5kbGVyLnB1dCgKLSAgICAgICAgICAgIAkJS2V5U3Ryb2tlLmdldFJlbGVhc2VkKChjaGFyKSAweDEsIDk3LCBTV1QuQ1RSTCksCi0gICAgICAgICAgICAJCWFjdGlvbik7Ci0gCQl9Ci0JCQotCQlyZXR1cm4ga2V5SGFuZGxlcjsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWN0aW9ucygpIHsKLQkJc3VwZXIuY3JlYXRlQWN0aW9ucygpOwotCQljcmVhdGVDb250cm9sRmxvd0FjdGlvbigpOwotCQkKLQkJLy8gUmVnaXN0ZXIgYWxpZ25tZW50IGFjdGlvbnM6Ci0JCWFjdGlvblNlcnZpY2UgPSBuZXcgRGlhZ3JhbUFjdGlvbnNTZXJ2aWNlKAotCQkJCWdldERpYWdyYW1NYW5hZ2VyKCkuZ2V0RWRpdGluZ0RvbWFpbigpLAotCQkJCWdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkJCWdldEVkaXREb21haW4oKSwgZ2V0QWN0aW9uUmVnaXN0cnkoKSk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25BdmVyYWdlQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJIb3Jpem9udGFsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0JCWFjdGlvblNlcnZpY2UucmVnaXN0ZXJWZXJ0aWNhbEFsaWduQXZlcmFnZUFjdGlvbigpOwotCQlhY3Rpb25TZXJ2aWNlLnJlZ2lzdGVyVmVydGljYWxBbGlnbkZpcnN0U2VsZWN0ZWRBY3Rpb24oKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFuQWN0aW9uKFN0cmluZyBhY3Rpb25OYW1lLAotCQkJTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlLCBTdHJpbmcgYWN0aW9uSWQsCi0JCQlTdHJpbmcgdG9vbHRpcFN0cmluZywgSW1hZ2VEZXNjcmlwdG9yIGltYWdlZGVzYykgewotCQlDcmVhdGVFbGVtZW50QWN0aW9uIGFjdGlvbiA9IG5ldyBDcmVhdGVFbGVtZW50QWN0aW9uKHRoaXMsIGFjdGlvbk5hbWUpOwotCQlhY3Rpb24uc2V0RWxlbWVudFR5cGVzKGVsZW1lbnRUeXBlKTsKLQkJYWN0aW9uLnNldFByZWZlcmVuY2VIaW50KGdldFByZWZlcmVuY2VzSGludCgpKTsKLQkJYWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihpbWFnZWRlc2MpOwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQodG9vbHRpcFN0cmluZyk7Ci0JCWFjdGlvbi5zZXRJZChhY3Rpb25JZCk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb0NvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmKGFjdGlvblNlcnZpY2UgIT0gbnVsbCl7Ci0JCQlhY3Rpb25TZXJ2aWNlLmNyZWF0ZUFsaWduTWVudShtZW51LCBpc0VkaXRhYmxlKCkpOwotCQl9Ci0JCWFkZFRvTWVudShtZW51LCBEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9MSU5LLAotCQkJCUdFRkFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIHRydWUsIHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUsIFN0cmluZyBpZCwgU3RyaW5nIGdyb3VwTmFtZSwgCi0JCQlib29sZWFuIHNlcGFyYXRvciwgYm9vbGVhbiBhcHBlbmQpIHsKLQkJYm9vbGVhbiBjYW5Nb2RpZnkgPSBpc0VkaXRhYmxlKCk7Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvblJlZ2lzdHJ5KCkuZ2V0QWN0aW9uKGlkKTsKLQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24uaXNFbmFibGVkKCkgJiYgY2FuTW9kaWZ5KSB7Ci0JCQkJaWYgKGFwcGVuZCkgewotCQkJCQltZW51LmFwcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBhY3Rpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1lbnUucHJlcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBhY3Rpb24pOwotCQkJCX0KLQkJCQlpZiAoc2VwYXJhdG9yKSB7Ci0JCQkJCW1lbnUuaW5zZXJ0QWZ0ZXIoaWQsIG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJfQotCQkJfQotCQl9ZWxzZXsKLQkJCWlmKHNlcGFyYXRvciAmJiBjYW5Nb2RpZnkpewotCQkJCWlmKGFwcGVuZCl7Ci0JCQkJCW1lbnUuYXBwZW5kVG9Hcm91cChncm91cE5hbWUsIG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJfWVsc2V7Ci0JCQkJCW1lbnUucHJlcGVuZFRvR3JvdXAoZ3JvdXBOYW1lLCBuZXcgU2VwYXJhdG9yKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUbyByZXNldCB0aGUgbGF5b3V0IG9mIHRoZSBkaWFncmFtLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0TGF5b3V0KCl7Ci0JCS8vIGRvZXMgbm90aGluZy4gY2xpZW50IHNob3VsZCBpbXBsZW1lbnQuCi0JfQotCQotCQotCS8qKgotCSAqIFJlZnJlc2ggZGlhZ3JhbQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2hEaWFncmFtKCl7Ci0JCXJlZnJlc2goKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQYXJ0TmFtZVByZWZpeCgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZSBnZXRQYXJ0SW1hZ2UoKTsKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udHJvbEZsb3dBY3Rpb24oKXsKLQkJSUFjdGlvbiBsaW5rQWN0aW9uID0gbmV3IEFjdGlvbihEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKTsKLQkJCQlpZiAoZWRpdFBhcnRzLnNpemUoKSA9PSAyKSB7Ci0JCQkJCUVkaXRQYXJ0IHNvdXJjZUVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBlZGl0UGFydHMuZ2V0KDApOwotCQkJCQlFZGl0UGFydCB0YXJnZXRFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgxKTsKLQkJCQkJCi0JCQkJCVZpZXcgc291cmNlTW9kZWwgPSAoVmlldylzb3VyY2VFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlWaWV3IHRhcmdldE1vZGVsID0gKFZpZXcpdGFyZ2V0RWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQkJCi0JCQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHNvdXJjZU1vZGVsKSAKLQkJCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh0YXJnZXRNb2RlbCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCQotCQkJCQlDcmVhdGVVbnNwZWNpZmllZFR5cGVDb25uZWN0aW9uUmVxdWVzdCBjb25uZWN0aW9uUmVxdWVzdCA9IAotCQkJCQkJZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCk7Ci0JCQkJCWlmIChjb25uZWN0aW9uUmVxdWVzdCAhPSBudWxsKSB7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRTb3VyY2VFZGl0UGFydChudWxsKTsKLQkJCQkJCWNvbm5lY3Rpb25SZXF1ZXN0LnNldFRhcmdldEVkaXRQYXJ0KHRhcmdldEVkaXRQYXJ0KTsKLQkJCQkJCWNvbm5lY3Rpb25SZXF1ZXN0Ci0JCQkJCQkJCS5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fU1RBUlQpOwotCQkJCQkJY29ubmVjdGlvblJlcXVlc3Quc2V0TG9jYXRpb24obmV3IFBvaW50KDAsIDApKTsKLQkJCQkJCXNvdXJjZUVkaXRQYXJ0LmdldENvbW1hbmQoY29ubmVjdGlvblJlcXVlc3QpOwotCi0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRTb3VyY2VFZGl0UGFydChzb3VyY2VFZGl0UGFydCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdAotCQkJCQkJCQkuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORCk7Ci0JCQkJCQljb25uZWN0aW9uUmVxdWVzdC5zZXRMb2NhdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCi0JCQkJCQlEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVkaXRQYXJ0ID0gZ2V0RGlhZ3JhbUVkaXRQYXJ0KCk7Ci0JCQkJCQlpZiAoZGlhZ3JhbUVkaXRQYXJ0LmlzRWRpdE1vZGVFbmFibGVkKCkpIHsKLQkJCQkJCQlDb21tYW5kIGNtZCA9IHRhcmdldEVkaXRQYXJ0Ci0JCQkJCQkJCQkuZ2V0Q29tbWFuZChjb25uZWN0aW9uUmVxdWVzdCk7Ci0JCQkJCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCQlpZihnZXRDcmVhdGVDb250cm9sRmxvd1JlcXVlc3QoKT09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCQlMaXN0IGVkaXRQYXJ0cyA9IGdldEdyYXBoaWNhbFZpZXdlcigpLmdldFNlbGVjdGVkRWRpdFBhcnRzKCk7Ci0JCQkJaWYgKGVkaXRQYXJ0cy5zaXplKCkgPT0gMikgewotCQkJCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IChFZGl0UGFydCkgZWRpdFBhcnRzLmdldCgwKTsKLQkJCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0cy5nZXQoMSk7Ci0KLQkJCQkJVmlldyBzb3VyY2VNb2RlbCA9IChWaWV3KSBzb3VyY2VFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCQlWaWV3IHRhcmdldE1vZGVsID0gKFZpZXcpIHRhcmdldEVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQkJCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHNvdXJjZU1vZGVsKSAKLQkJCQkJCQl8fCBCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh0YXJnZXRNb2RlbCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXREaWFncmFtKCkuZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKGVkZ2UuZ2V0U291cmNlKCk9PSBzb3VyY2VNb2RlbCAmJiBlZGdlLmdldFRhcmdldCgpID09IHRhcmdldE1vZGVsKXsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmIChzb3VyY2VNb2RlbC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUKLQkJCQkJCQl8IHNvdXJjZU1vZGVsLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkTm9kZQotCQkJCQkJCXx8IHRhcmdldE1vZGVsLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCQkJCXx8IHRhcmdldE1vZGVsLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfTElOSzsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuQ09OVFJPTF9GTE9XX0lNQUdFX0RFU0NSSVBUT1I7Ci0JCQl9Ci0JCX07Ci0JCWdldEFjdGlvblJlZ2lzdHJ5KCkucmVnaXN0ZXJBY3Rpb24obGlua0FjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogRG9lcyBub3RoaW5nIGNsaWVudCBzaG91bGQgaW1wbGVtZW50LgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QgZ2V0Q3JlYXRlQ29udHJvbEZsb3dSZXF1ZXN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgaW50IHR5cGUpIHsKLQkJcmV0dXJuIGdldERpYWdyYW1TZXJ2aWNlKCkuZ2V0RGlhZ3JhbShhY3Rpdml0eSwgdHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTc0ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLQotLyoqCi0gKiBEaWFncmFtRWRpdG9yIElucHV0IGZvciB7QGxpbmsgQnJlYWtkb3duRWxlbWVudH0gCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQgewotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQ7Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQotCXByaXZhdGUgU3VwcHJlc3Npb24gc3VwcHJlc3Npb247Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQlwcml2YXRlIGludCBkaWFncmFtVHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGlhZ3JhbUVkaXRvcklucHV0IGZvciBhY3Rpdml0eSBkaWFncmFtCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI0RpYWdyYW1FZGl0b3JJbnB1dChPYmplY3QsIFN1cHByZXNzaW9uLCBpbnQpfQotCSAqLwotCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQoT2JqZWN0IG9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJdGhpcyhvYmplY3QsIHN1cHByZXNzaW9uLCBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gc3VwcHJlc3Npb24KLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiAgICAgICAgICAgIGNhbiBiZSBvbmUgb2YgdGhlIGNvbnN0YW50czoKLQkgKiAgICAgICAgICAgIHtAbGluayBJRGlhZ3JhbU1hbmFnZXIjQUNUSVZJVFlfRElBR1JBTX0sCi0JICogICAgICAgICAgICB7QGxpbmsgSURpYWdyYW1NYW5hZ2VyI0FDVElWSVRZX0RFVEFJTF9ESUFHUkFNfSwKLQkgKiAgICAgICAgICAgIHtAbGluayBJRGlhZ3JhbU1hbmFnZXIjV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTX0KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0KE9iamVjdCBvYmplY3QsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdDsKLQkJfQotCQl0aGlzLnN1cHByZXNzaW9uID0gc3VwcHJlc3Npb247Ci0JCXRoaXMuZGlhZ3JhbVR5cGUgPSBkaWFncmFtVHlwZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIGRpYWdyYW1UeXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3VwcHJlc3Npb24uCi0JICovCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB3cmFwcGVyLgotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBnZXRXcmFwcGVyKCkgewotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5NZXRob2RFbGVtZW50RWRpdG9ySW5wdXQjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChnZXRDbGFzcygpLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IG90aGVyID0gKERpYWdyYW1FZGl0b3JJbnB1dCkgb2JqOwotCQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnQoKSA9PSBvdGhlci5nZXRNZXRob2RFbGVtZW50KCkKLQkJCQkJJiYgKChzdXBwcmVzc2lvbiA9PSBudWxsICYmIG90aGVyLmdldFN1cHByZXNzaW9uKCkgPT0gbnVsbCkgfHwgCi0JCQkJCQkJKHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKSA9PSBvdGhlci5nZXRTdXBwcmVzc2lvbigpLmdldFByb2Nlc3MoKSkpCi0JCQkJCSYmIGdldERpYWdyYW1UeXBlKCkgPT0gb3RoZXIuZ2V0RGlhZ3JhbVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBnZXRNZXRob2RFbGVtZW50KCkuaGFzaENvZGUoKTsKLQkJcmVzdWx0IF49IHN1cHByZXNzaW9uLmdldFByb2Nlc3MoKS5oYXNoQ29kZSgpOwotCQlyZXN1bHQgXj0gZ2V0RGlhZ3JhbVR5cGUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dChNZXRob2RFbGVtZW50IGUpIHsKLQkJbWV0aG9kRWxlbWVudCA9IGU7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnQ7Ci0JfQotCQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudC5nZXROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1FZGl0b3JJbnB1dFByb3h5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0UHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4Zjg0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUVkaXRvcklucHV0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS51dGlsLldvcmtzcGFjZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklEaXNwb3NhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5IGV4dGVuZHMgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGltcGxlbWVudHMgSURpc3Bvc2FibGUKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VzSGludCBwcmVmZXJlbmNlSGludDsKLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0RpYWdyYW07Ci0JCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCwgUHJlZmVyZW5jZXNIaW50IGhpbnQpIHsKLQkJc3VwZXIoaW5wdXQpOwotCQl0aGlzLnByZWZlcmVuY2VIaW50ID0gaGludDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlhZ3JhbSA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCWlmKGRpYWdyYW0gPT0gbnVsbCB8fCBkaWFncmFtLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCWlmKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2Nlc3MsIHRoaXMpOwotCQkJCXRyeSB7Ci0JCQkJCWludCBkaWFncmFtVHlwZSA9IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpLmdldERpYWdyYW1UeXBlKCk7Ci0JCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IG1nci5nZXREaWFncmFtcyhhY3QsIGRpYWdyYW1UeXBlKTsKLQkJCQkJaWYobGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCWRpYWdyYW0gPSBtZ3IuY3JlYXRlRGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlLCBwcmVmZXJlbmNlSGludCk7Ci0JCQkJCQlpc05ld0RpYWdyYW0gPSBkaWFncmFtICE9IG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBkaWFncmFtLmVSZXNvdXJjZSgpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnJlc291cmNlcy5JRGlhZ3JhbVN0b3JhZ2UoKSB7Ci0JCQkJcHJpdmF0ZSBJRmlsZSBmaWxlOwotCQkJCQotCQkJCXByaXZhdGUgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCQkJaWYoZmlsZSA9PSBudWxsKSB7Ci0JCQkJCQlmaWxlID0gRGlhZ3JhbUVkaXRvcklucHV0UHJveHkudGhpcy5nZXRGaWxlKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZpbGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCQkJCXJldHVybiBnZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQkJCXJldHVybiByZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCQkJCXJldHVybiBnZXRGaWxlKCkuaXNSZWFkT25seSgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCXJldHVybiBnZXRGaWxlKCkuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQkJCQlyZXR1cm4gZGlhZ3JhbTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpLmdldE5hbWUoKTsKLQkJfQotCQljYXRjaChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQkvLyBkb24ndCBzaG93IHRoaXMgaW5wdXQgaW4gdGhlIGxpc3Qgb2YgcmVjZW50bHkgb3BlbiBmaWxlcwotCQkvLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSNnZXRQYXRoKCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIGdldEZpbGUoKS5nZXRMb2NhdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCWlmKGFkYXB0ZXIgPT0gSUZpbGUuY2xhc3MpIHsKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmaWxlLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZihvYmogPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYob2JqIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCXJldHVybiBnZXREaWFncmFtRWRpdG9ySW5wdXQoKS5lcXVhbHMoKChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSlvYmopLmdldERpYWdyYW1FZGl0b3JJbnB1dCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXREaWFncmFtRWRpdG9ySW5wdXQoKS5oYXNoQ29kZSgpOwotCX0KLQkKLQlwdWJsaWMgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VIaW50KCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZUhpbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTmV3RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGlzTmV3RGlhZ3JhbTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTcxZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0RpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dEZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGltcGxlbWVudHMKLQkJSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSB7Ci0KLQlwcml2YXRlIERpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtRWRpdG9ySW5wdXQ7Ci0gICAgcHJpdmF0ZSBJRmlsZSBmaWxlOwotICAgIHByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluOwotCi0JcHJvdGVjdGVkIERpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eShEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJdGhpcy5kaWFncmFtRWRpdG9ySW5wdXQgPSBpbnB1dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5I2dldERpYWdyYW1FZGl0b3JJbnB1dCgpCi0JICovCi0JcHVibGljIERpYWdyYW1FZGl0b3JJbnB1dCBnZXREaWFncmFtRWRpdG9ySW5wdXQoKSB7Ci0JCXJldHVybiBkaWFncmFtRWRpdG9ySW5wdXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50Lk1FZGl0aW5nRG9tYWluRWxlbWVudCNnZXRFZGl0aW5nRG9tYWluKCkKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLSAgICAgICAgcmV0dXJuIGZpbGUuZXhpc3RzKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJQWRhcHRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0gICAgICAgIGlmIChhZGFwdGVyID09IElGaWxlLmNsYXNzKSB7Ci0JCQlyZXR1cm4gZmlsZTsKLQkJfQotICAgICAgICByZXR1cm4gZmlsZS5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBNZXRob2QgZGVjbGFyZWQgb24gSVBlcnNpc3RhYmxlRWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKLSAgICAgICAgcmV0dXJuIEZpbGVFZGl0b3JJbnB1dEZhY3RvcnkuZ2V0RmFjdG9yeUlkKCk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJRWRpdG9ySW5wdXQuCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIElDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKQotICAgICAgICAgICAgICAgIC5nZXRJbWFnZURlc2NyaXB0b3IoZmlsZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJU3RvcmFnZUVkaXRvcklucHV0LgotICAgICAqLwotICAgIHB1YmxpYyBJU3RvcmFnZSBnZXRTdG9yYWdlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogTWV0aG9kIGRlY2xhcmVkIG9uIElFZGl0b3JJbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotICAgICAgICByZXR1cm4gZGlhZ3JhbUVkaXRvcklucHV0LmdldE1ldGhvZEVsZW1lbnQoKS5nZXROYW1lKCk7Ci0gICAgfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlI3NhdmVTdGF0ZShvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluKXsKLQkJdGhpcy5kb21haW4gPSBkb21haW47Ci0JfQotCi0JICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUGF0aEVkaXRvcklucHV0Ci0gICAgICogQHNpbmNlIDMuMAotICAgICAqIEBpc3N1ZSBjb25zaWRlciB1c2luZyBhbiBpbnRlcm5hbCBhZGFwdGVyIGZvciBJUGF0aEVkaXRvcklucHV0IHJhdGhlciB0aGFuIGFkZGluZyB0aGlzIGFzIEFQSQotICAgICAqLwotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gZmlsZS5nZXRMb2NhdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKCIgKyBnZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTU3ZTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlciB7Ci0JRGlhZ3JhbUVkaXRvcklucHV0IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCUlFZGl0b3JQYXJ0IGdldEVkaXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcGFydC9JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYjU1N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L0lEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuTUVkaXRpbmdEb21haW5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5IGV4dGVuZHMgTUVkaXRpbmdEb21haW5FbGVtZW50LAotCQlJRmlsZUVkaXRvcklucHV0LCBJUGF0aEVkaXRvcklucHV0LCBJUGVyc2lzdGFibGVFbGVtZW50IHsKLQkKLQlwdWJsaWMgRGlhZ3JhbUVkaXRvcklucHV0IGdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQotCXB1YmxpYyB2b2lkIHNldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbik7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wYXJ0L3V0aWwvRGlhZ3JhbUVkaXRvclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyZjY0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3BhcnQvdXRpbC9EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLmltcGwuSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkRpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLk5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5JRGlhZ3JhbUZpbGVFZGl0b3JJbnB1dFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLlNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXMuSURpYWdyYW1TdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbm5lY3Rpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0b3JVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9FRElUT1JfSUQgPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRERfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFZGl0b3JJZChpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJc3dpdGNoKGRpYWdyYW1UeXBlKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQURfRURJVE9SX0lEOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBBRERfRURJVE9SX0lEOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFdQRERfRURJVE9SX0lEOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUVkaXRvclBhcnQgb3BlbkRpYWdyYW1FZGl0b3IoSVdvcmtiZW5jaFBhZ2UgcGFnZSwgRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0LCBQcmVmZXJlbmNlc0hpbnQgaGludCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9IG5ldyBEaWFncmFtRWRpdG9ySW5wdXRQcm94eShpbnB1dCwgaGludCk7Ci0KLQkJSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0b3JQYXJ0ID0gcGFnZS5vcGVuRWRpdG9yKGlucHV0UHJveHksIGdldEVkaXRvcklkKGlucHV0LmdldERpYWdyYW1UeXBlKCkpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQotCQlpZihlZGl0b3JQYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCWlmKGlucHV0LmdldERpYWdyYW1UeXBlKCkgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJQWJzdHJhY3REaWFncmFtRWRpdG9yIGVkaXRvciA9ICgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWVkaXRvclBhcnQpOwotCQkJCWVkaXRvci5yZXNldExheW91dCgpOwotCQkJCS8vIFRPRE86IGhhcyB0byBjYWxsIHJlc2V0TGF5b3V0IHR3aWNlIGhlcmUgc28gaXQgY2FuIGxheW91dCBwcm9wZXJseQotCQkJCS8vIG5lZWQgdG8gaW1wcm92ZSB0aGlzIG1ldGhvZAotCQkJCS8vCi0JCQkJZWRpdG9yLnJlc2V0TGF5b3V0KCk7Ci0JCQl9Ci0JCQkKLQkJCUlEb2N1bWVudFByb3ZpZGVyIGRvY1Byb3ZpZGVyID0gKChEaWFncmFtRG9jdW1lbnRFZGl0b3IpZWRpdG9yUGFydCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCi0JCQkvLyBzZXQgdGhlIGRvY3VtZW50IGFzIHNhdmFibGUgaWYgdGhlIGRpYWdyYW0gaXMgbmV3Ci0JCQkvLwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IG51bGw7Ci0JCQkJT2JqZWN0IGNvbnN1bWVyID0gbmV3IE9iamVjdCgpOwotCQkJCXRyeSB7Ci0JCQkJCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIGNvbnN1bWVyKTsKLQkJCQkJaWYobWdyICE9IG51bGwgJiYgaW5wdXRQcm94eS5pc05ld0RpYWdyYW0oKSkgewotCQkJCQkJZG9jUHJvdmlkZXIuc2V0Q2FuU2F2ZURvY3VtZW50KGlucHV0UHJveHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJbWdyLnJlbW92ZUNvbnN1bWVyKGNvbnN1bWVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gaW5pdGlhbGl6YXRpb24gbWlnaHQgaGF2ZSBtYWRlIHRoZSBkb2N1bWVudCBkaXJ0eQotCQkJLy8gdGhpcyB3aWxsIGNsZWFyIGRpcnR5IGZsYWcgb2YgdGhlIGVkaXRvcgotCQkJLy8KLQkJCWlmIChkb2NQcm92aWRlciBpbnN0YW5jZW9mIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIKLQkJCQkJJiYgZWRpdG9yUGFydC5pc0RpcnR5KCkKLQkJCQkJJiYgIWlucHV0UHJveHkuaXNOZXdEaWFncmFtKCkpIHsKLQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIGRvY1Byb3ZpZGVyKQotCQkJCS5tYXJrRG9jdW1lbnRBc1NhdmVkKGlucHV0UHJveHkpOwotCQkJfQkJCQotCi0JCQkvLyBDaGVjayB3aGV0aGVyIGRpYWdyYW0gaXMgcmVhZC1vbmx5IGFuZCBwbHVnLWluIGlzIGxvY2tlZC4gCi0JCQkvLwotCQkJaWYoIWlzTW9kaWZpYWJsZShpbnB1dFByb3h5KSl7Ci0JCQkJKChTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKWVkaXRvclBhcnQpLmdldERvY3VtZW50UHJvdmlkZXIoKSkubG9jayh0cnVlKTsKLQkJCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPSAoKElEaWFncmFtV29ya2JlbmNoUGFydCllZGl0b3JQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJCQllZGl0UGFydC5kaXNhYmxlRWRpdE1vZGUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdG9yUGFydDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hWaXN1YWwoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCS8vIHJlZnJlc2ggbGFiZWxzCi0JCS8vCi0JCUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcjxPYmplY3Q+KGVkaXRQYXJ0LCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8Pz4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKEVkaXRQYXJ0KW9iamVjdCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0IHx8IGNoaWxkIGluc3RhbmNlb2YgQ29ubmVjdGlvbk5vZGVFZGl0UGFydCkgewotCQkJCSgoRWRpdFBhcnQpY2hpbGQpLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlZnJlc2ggY29ubmVjdGlvbnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVkaXRQYXJ0LmdldENvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJQ29ubmVjdGlvbkVkaXRQYXJ0IGNvbm4gPSAoQ29ubmVjdGlvbkVkaXRQYXJ0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQljb25uLnJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaExhYmVscyhEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQpIHsKLS8vCQkvLyBtYWtlIHN1cmUgdGhhdCB0aGUgZWRpdCBwYXJ0IGZpZ3VyZSBpcyBsYXJnZSBlbm91Z2ggdG8gc2hvdyB0aGUgaWNvbiBhbmQgYWxsIHRoZSB0ZXh0Ci0vLwkJLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLS8vCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCkgewotLy8JCQkJSUZpZ3VyZSBmID0gKChHcmFwaGljYWxFZGl0UGFydCljaGlsZCkuZ2V0RmlndXJlKCk7Ci0vLwkJCQlpZihmIGluc3RhbmNlb2YgRGVmYXVsdFNpemVOb2RlRmlndXJlKSB7Ci0vLwkJCQkJT2JqZWN0IGYyID0gKChEZWZhdWx0U2l6ZU5vZGVGaWd1cmUpZikuZ2V0Q2hpbGRyZW4oKS5nZXQoMCk7Ci0vLwkJCQlpZihmMiBpbnN0YW5jZW9mIFJlY3RhbmdsZUZpZ3VyZSkgewotLy8JCQkJCVJlY3RhbmdsZUZpZ3VyZSBmaWd1cmUgPSAoUmVjdGFuZ2xlRmlndXJlKSBmMjsKLS8vCQkJCQlMaXN0IGNoaWxkcmVuID0gKChSZWN0YW5nbGVGaWd1cmUpZmlndXJlKS5nZXRDaGlsZHJlbigpOwotLy8JCQkJCWlmKCFjaGlsZHJlbi5pc0VtcHR5KCkpIHsKLS8vCQkJCQkJT2JqZWN0IGwgPSBjaGlsZHJlbi5nZXQoMCk7Ci0vLwkJCQkJCWlmKGwgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLS8vCQkJCQkJCVdyYXBMYWJlbCBsYWJlbCA9ICgoV3JhcExhYmVsKWwpOwotLy8JCQkJCQkJUmVjdGFuZ2xlIHIgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0vLwkJCQkJCQlEaW1lbnNpb24gZCA9IGZpZ3VyZS5nZXRQcmVmZXJyZWRTaXplKCk7Ci0vLwkJCQkJCQlSZWN0YW5nbGUgdGV4dFIgPSBsYWJlbC5nZXRUZXh0Qm91bmRzKCk7CQkJCQkJCQotLy8vLy8vCQkJCQkJCXRleHRSLndpZHRoICs9ICh0ZXh0Ui53aWR0aCAqIFdpZGVuZWRXcmFwTGFiZWwuREVMVEFfRkFDVE9SKTsKLS8vLy8JCQkJCQkJdGV4dFIud2lkdGggKz0gMjA7Ci0vLy8vCQkJCQkJCWlmKHIud2lkdGggPCBkLndpZHRoIHx8IHIuaGVpZ2h0IDwgZC5oZWlnaHQpIHsKLS8vLy8JCQkJCQkJCVdyYXBMYWJlbCBsYWJlbCA9ICgoV3JhcExhYmVsKWwpOwotLy8vLwkJCQkJCQkJbGFiZWwuaW52YWxpZGF0ZSgpOwotLy8vLwkJCQkJCQkJZmlndXJlLnNldEJvdW5kcyhyLnVuaW9uKHRleHRSKSk7CQotLy8vLy8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGFiZWwuZ2V0U3ViU3RyaW5nVGV4dCgpKTsKLS8vLy8JCQkJCQkJfQotLy8vLwkJCQkJCQlpZigiRGVzaWduIHRoZSBTb2x1dGlvbiIuZXF1YWxzKGxhYmVsLmdldFRleHQoKSkpIHsJCQotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGV4dDogJyIgKyBsYWJlbC5nZXRUZXh0KCkgKyAiJyIpOwotLy8JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGFiZWwgZm9udDogIiArIGxhYmVsLmdldEZvbnQoKSk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IGZvbnQ6ICIgKyBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCk7Ci0vLwkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYWxjdWxhdGVkIHRleHQgc2l6ZTogIiArIERpYWdyYW1Db3JlVXRpbC5nZXRUZXh0U2l6ZUluV3JhcExhYmVsKGxhYmVsLmdldFRleHQoKSwgbnVsbCwgci53aWR0aCwgci5oZWlnaHQsIG51bGwpKTsKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkN1cnJlbnQgdGV4dCB3aWR0aDogIiArIHRleHRSLndpZHRoKTsKLS8vCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vZGUgd2lkdGg6ICIgKyByLndpZHRoKTsKLS8vLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJfQotLy8JCQl9CQkJCi0vLwkJfQotCQkKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlZGl0UGFydCwgZmFsc2UpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQkJCXJldHVybiAoKEVkaXRQYXJ0KW9iamVjdCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCX07Ci0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgSVRleHRBd2FyZUVkaXRQYXJ0KSB7Ci0JCQkJKChJVGV4dEF3YXJlRWRpdFBhcnQpY2hpbGQpLnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtIGdldERpYWdyYW0oRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJU3RvcmFnZSBzdG9yYWdlID0gaW5wdXRQcm94eS5nZXRTdG9yYWdlKCk7Ci0JCXJldHVybiBzdG9yYWdlIGluc3RhbmNlb2YgSURpYWdyYW1TdG9yYWdlID8gKChJRGlhZ3JhbVN0b3JhZ2Upc3RvcmFnZSkuZ2V0RGlhZ3JhbSgpIDogbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb0luaXRpYWxpemUoCi0JCQlmaW5hbCBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSBpbnB1dFByb3h5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZpbmFsIERpYWdyYW0gbW9kZWwgPSBnZXREaWFncmFtKGlucHV0UHJveHkpOwotCQlpZihtb2RlbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYoRGlhZ3JhbU1hbmFnZXIuQURfa2luZC5lcXVhbHMobW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gKEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIpIEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihtb2RlbC5nZXRFbGVtZW50KCkpOwotCQkJaWYoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJYWRhcHRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1BZGFwdGVyKAotCQkJCQkJCQkoQWN0aXZpdHkpIGlucHV0UHJveHkKLQkJCQkJCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJCQlhZGFwdGVyCi0JCQkJCQkuc2V0RWRpdGluZ0RvbWFpbigoSW50ZXJuYWxUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbikgVHJhbnNhY3Rpb25VdGlsCi0JCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKG1vZGVsKSk7Ci0JCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihpbnB1dFByb3h5Ci0JCQkJCQkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJYWRhcHRlci5zZXRWaWV3KG1vZGVsKTsKLQkJCQltb2RlbC5nZXRFbGVtZW50KCkuZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkJfQotCQkJYWRhcHRlci5wb3B1bGF0ZURpYWdyYW0oKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKG1vZGVsLmdldFR5cGUoKSkKLQkJCQl8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHMobW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4obW9kZWwpOwotCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3AgPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LKSB7Ci0JCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCQl0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbW9kZWwuZ2V0RWxlbWVudCgpOwotCQkJCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBpbnB1dFByb3h5LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlkLnNldFN1cHByZXNzaW9uKGlucHV0LmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQlkLnNldExpbmtlZEVsZW1lbnQoaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJCQkJZC5zZXRPYmplY3QoZC5nZXRMaW5rZWRFbGVtZW50KCkpOwotCi0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJb3AuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfSAKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZU9uQWN0aXZhdGUoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCWlmKGVkaXRQYXJ0LmdldFZpZXdlcigpIGluc3RhbmNlb2YgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKSB7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSAoKElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcillZGl0UGFydC5nZXRWaWV3ZXIoKSkuZ2V0RWRpdG9yKCk7Ci0JCQlpZihlZGl0b3IgIT0gbnVsbCAmJiBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSBpbnN0YW5jZW9mIERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KSB7Ci0JCQkJRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSA9IChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQl0cnkgewotCQkJCQlpZihkb0luaXRpYWxpemUoaW5wdXRQcm94eSwgbW9uaXRvcikpIHsKLQkJCQkJCWRvUmVmcmVzaChlZGl0UGFydCwgbW9uaXRvciwgZmFsc2UpOwotCQkJCQkJcmVmcmVzaFZpc3VhbChlZGl0UGFydCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgZmluYWwgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkgaW5wdXRQcm94eSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CQkKLQkJdHJ5IHsKLQkJCWlmKGRvSW5pdGlhbGl6ZShpbnB1dFByb3h5LCBtb25pdG9yKSkgewotCQkJCXJlZnJlc2goZWRpdFBhcnQsIG1vbml0b3IpOwotCQkJCXJlZnJlc2hMYWJlbHMoZWRpdFBhcnQpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUVkZ2VzKFZpZXcgdmlldyl7Ci0JCWJvb2xlYW4gYWxsVmlzaWJsZSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IGNoaWxkID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYoY2hpbGQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUltcGwpIHsKLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKWNoaWxkLmdldEVsZW1lbnQoKTsKLQkJCQlpZighbm9kZS5pc1Zpc2libGUoKSl7Ci0JCQkJCXNldEVkZ2VWaXNpYmlsaXR5KHZpZXcsIG5vZGUuaXNWaXNpYmxlKCkpOwotCQkJCX1lbHNlewotCQkJCQljaGlsZC5zZXRWaXNpYmxlKG5vZGUuaXNWaXNpYmxlKCkpOwotCQkJCQlzZXRFZGdlVmlzaWJpbGl0eShjaGlsZCwgdHJ1ZSk7Ci0JCQkJfQotCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgY2hpbGQuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCQkJCQlpZihzdHlsZSA9PSBudWxsKSB7Ci0JCQkJCQlzdHlsZSA9IChGb250U3R5bGUpIGNoaWxkLmNyZWF0ZVN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GT05UX1NUWUxFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihjaGlsZC5pc1Zpc2libGUoKSAmJiBjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyKSB7Ci0JCQkJCXVwZGF0ZUVkZ2VzKGNoaWxkKTsKLQkJCQl9Ci0JCQkJaWYobm9kZS5pc1Zpc2libGUoKSl7Ci0JCQkJCWFsbFZpc2libGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZih2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIgCi0JCQkJJiYgISh2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkKLQkJCQkmJiAhKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkpewotCQkJc2V0RWRnZVZpc2liaWxpdHkodmlldywgYWxsVmlzaWJsZSk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0RWRnZVZpc2liaWxpdHkoVmlldyB2aWV3LCBib29sZWFuIHZpc2liaWxpdHkpewotCQlEaWFncmFtIGRpYWdyYW0gPSB2aWV3LmdldERpYWdyYW0oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoZWRnZS5nZXRTb3VyY2UoKSA9PSB2aWV3IHx8IGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gdmlldyl7Ci0JCQkJaWYodmlzaWJpbGl0eSl7Ci0JCQkJCXZpZXcuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQl9Ci0JCQkJZWRnZS5zZXRWaXNpYmxlKHZpc2liaWxpdHkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJYm9vbGVhbiBhbGxWaXNpYmxlID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHZpZXcuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVZpZXcgY2hpbGQgPSAoVmlldykgaXRlci5uZXh0KCk7Ci0JCQlpZihjaGlsZC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBOb2RlSW1wbCkgewotCQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpY2hpbGQuZ2V0RWxlbWVudCgpOwotCQkJCWNoaWxkLnNldFZpc2libGUobm9kZS5pc1Zpc2libGUoKSk7Ci0JCQkJaWYobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBjaGlsZC5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCQkJCWlmKHN0eWxlID09IG51bGwpIHsKLQkJCQkJCXN0eWxlID0gKEZvbnRTdHlsZSkgY2hpbGQuY3JlYXRlU3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGNoaWxkLmlzVmlzaWJsZSgpICYmIGNoaWxkLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5vZGVDb250YWluZXIpIHsKLQkJCQkJdXBkYXRlVmlldyhjaGlsZCk7Ci0JCQkJfQotCQkJCWlmKG5vZGUuaXNWaXNpYmxlKCkpewotCQkJCQlhbGxWaXNpYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lciAKLQkJCQkmJiAhKHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKQotCQkJCSYmICEodmlldy5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSkgewotLy8JCQlpZighYWxsVmlzaWJsZSkgewotLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0vLwkJCX0KLQkJCXZpZXcuc2V0VmlzaWJsZShhbGxWaXNpYmxlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbmhlcml0ZWQoRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJRWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gZWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0JCWlmKHZpZXdlciBpbnN0YW5jZW9mIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcikgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpdmlld2VyKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCXJldHVybiBpc0luaGVyaXRlZChpbnB1dCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5oZXJpdGVkKERpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCkgewotCQlyZXR1cm4gaW5wdXQgIT0gbnVsbCAmJiBpbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbAotCQkJCSYmIGlucHV0LmdldFdyYXBwZXIoKS5pc0luaGVyaXRlZCgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldFNlbWFudGljQ2hpbGRyZW4oRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCUVkaXRQYXJ0Vmlld2VyIHZpZXdlciA9IGVkaXRQYXJ0LmdldFZpZXdlcigpOwotCQlpZih2aWV3ZXIgaW5zdGFuY2VvZiBJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpIHsKLQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyKXZpZXdlcikuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQlpZihpbnB1dCAhPSBudWxsICYmIGlucHV0LmdldFdyYXBwZXIoKSAhPSBudWxsICYmCi0JCQkJCWlucHV0LmdldFdyYXBwZXIoKS5pc0luaGVyaXRlZCgpKSB7Ci0JCQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlpZihtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG51bGw7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCk7Ci0JCQkJCVN0cmluZyB0eXBlID0gZGlhZ3JhbS5nZXRUeXBlKCk7Ci0JCQkJCWlmKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCQlEaWFncmFtQWRhcHRlciBkYSA9ICgoRGlhZ3JhbUFkYXB0ZXIpQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKSk7Ci0JCQkJCQlpZihkYSAhPSBudWxsKSB7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IGlucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCQlpZihUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeSh3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpICE9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCQkJCQkJTGlzdCB3cmFwcGVycyA9IFByb2Nlc3NVdGlsLmdldFdyYXBwZXJzKHdyYXBwZXIsIG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpfSk7Ci0JCQkJCQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHdyYXBwZXJzLmdldCgwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlhZGFwdGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIod3JhcHBlcik7Ci0JCQkJCQkJCWFkYXB0ZXIuc2V0RmlsdGVyKGRhLmdldEZpbHRlcigpKTsKLQkJCQkJCQkJYWRhcHRlci5zZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mod3JhcHBlcikpKTsKLQkJCQkJCQkJY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCQlpZihhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQkJCWFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKHR5cGUpIHx8IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kLmVxdWFscyh0eXBlKSkgewotCQkJCQkJRGlhZ3JhbUltcGwgZDsKLQkJCQkJCWlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyh0eXBlKSkgewotCQkJCQkJCWQgPSAoRGlhZ3JhbUltcGwpIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJCQkJCX0JCQkJCQkKLQkJCQkJCURpYWdyYW1JbXBsIGRpYWdyYW1JblVzZSA9ICgoRGlhZ3JhbUltcGwpZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBkaWFncmFtSW5Vc2UuZ2V0U3VwcHJlc3Npb24oKTsKLQkJCQkJCWlmKHN1cHByZXNzaW9uICE9IG51bGwpIHsKLQkJCQkJCQlkLnNldFdyYXBwZXIoaW5wdXQuZ2V0V3JhcHBlcigpKTsKLQkJCQkJCQlkLnNldEZpbHRlcihkaWFncmFtSW5Vc2UuZ2V0RmlsdGVyKCkpOwotCQkJCQkJCWQuc2V0U3VwcHJlc3Npb24oZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCQkJCWNoaWxkcmVuID0gZC5nZXRDaGlsZHJlbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoQ29ubmVjdGlvbnMoRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0RWRnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gdmlzaWJsZSA9IGVkZ2UuZ2V0U291cmNlKCkgIT0gbnVsbCAmJiBlZGdlLmdldFNvdXJjZSgpLmlzVmlzaWJsZSgpCi0JCQkJJiYgZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsICYmIGVkZ2UuZ2V0VGFyZ2V0KCkuaXNWaXNpYmxlKCk7Ci0JCQlpZihlZGdlLmlzVmlzaWJsZSgpICE9IHZpc2libGUpIHsKLQkJCQllZGdlLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQl9Ci0JCX07Ci0JCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbihEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJQ29sbGVjdGlvbiBzZW1hbnRpY0NoaWxkcmVuID0gZ2V0U2VtYW50aWNDaGlsZHJlbihlZGl0UGFydCk7Ci0JCWlmKHNlbWFudGljQ2hpbGRyZW4gIT0gbnVsbCkgewotCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0LCBzZW1hbnRpY0NoaWxkcmVuKTsKLQkJCXJlZnJlc2hDb25uZWN0aW9ucyhlZGl0UGFydCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbHRlckNoaWxkcmVuKEVkaXRQYXJ0IGVkaXRQYXJ0LCBDb2xsZWN0aW9uIGNoaWxkcmVuKSB7Ci0JCURpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSBEaWFncmFtQ29yZVV0aWwuZ2V0RGlhZ3JhbUVkaXRQYXJ0KGVkaXRQYXJ0KTsKLQkJQ29sbGVjdGlvbiBzZW1hbnRpY0NoaWxkcmVuID0gZ2V0U2VtYW50aWNDaGlsZHJlbihkaWFncmFtRWRpdFBhcnQpOwotCQlpZihzZW1hbnRpY0NoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkgRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkgTWV0aG9kRWxlbWVudCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoY2hpbGQpOwotCQkJCSBpZihnZXRXcmFwcGVyKGUsIHNlbWFudGljQ2hpbGRyZW4pID09IG51bGwpIHsKLQkJCQkJIGl0ZXIucmVtb3ZlKCk7Ci0JCQkJIH0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0V3JhcHBlcihNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gc2VtYW50aWNDaGlsZHJlbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2VtYW50aWNDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYyA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKFRuZ1V0aWwudW53cmFwKGMpID09IGUpIHsKLQkJCQlyZXR1cm4gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmVmcmVzaGVzIGVkaXQgcGFydCBvZiBhbiBpbmhlcml0ZWQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdFBhcnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlZnJlc2hDaGlsZHJlbihFZGl0UGFydCBlZGl0UGFydCwgQ29sbGVjdGlvbiBzZW1hbnRpY0NoaWxkcmVuKSB7CQkKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgZWRpdCBwYXJ0IG9mIFJvbGVUYXNrQ29tcG9zaXRlIHRoYXQgc2hvdWxkIG5vdCBiZSBzaG93biBpZgotCQkvLyBub25lIG9mIGl0cyB0YXNrcyBhcmUgdmlzaWJsZQotCQkvLwotCQlib29sZWFuIGlzUm9sZVRhc2tDb21wb3NpdGUgPSBmYWxzZTsKLQkJYm9vbGVhbiBoYXNUYXNrID0gZmFsc2U7Ci0JCU9iamVjdCBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKG1vZGVsIGluc3RhbmNlb2YgVmlldyAmJiAoKFZpZXcpbW9kZWwpLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlKSB7Ci0JCQlpc1JvbGVUYXNrQ29tcG9zaXRlID0gdHJ1ZTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gZWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyCi0JCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCQlib29sZWFuIHJlZnJlc2hDaGlsZHJlbiA9IHRydWU7Ci0JCQkJRWRpdFBhcnQgY2hpbGRFZGl0UGFydCA9ICgoRWRpdFBhcnQpY2hpbGQpOwotCQkJCU9iamVjdCBtID0gY2hpbGRFZGl0UGFydC5nZXRNb2RlbCgpOwotCQkJCWlmKG0gaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCVZpZXcgdiA9IChWaWV3KSBtOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCh2KTsKLQkJCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gZ2V0V3JhcHBlcihlLCBzZW1hbnRpY0NoaWxkcmVuKTsKLQkJCQkJCWJvb2xlYW4gdmlzaWJsZSA9IG9iamVjdCAhPSBudWxsOwotCQkJCQkJaWYodi5pc1Zpc2libGUoKSAhPSB2aXNpYmxlKSB7Ci0JCQkJCQkJdi5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCQkJfQotCQkJCQkJaWYoIXZpc2libGUpIHsKLQkJCQkJCQlyZWZyZXNoQ2hpbGRyZW4gPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYoaXNSb2xlVGFza0NvbXBvc2l0ZSAmJiAhaGFzVGFzayAmJiBlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQloYXNUYXNrID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBub24tVU1BIG5vZGUgbGlrZSBjb250cm9sIG5vZGUsIHRleHQgbm9kZSwgZmlndXJlLi4uCi0JCQkJCQkvLyAKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihyZWZyZXNoQ2hpbGRyZW4pIHsKLQkJCQkJcmVmcmVzaENoaWxkcmVuKGNoaWxkRWRpdFBhcnQsIHNlbWFudGljQ2hpbGRyZW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYoaXNSb2xlVGFza0NvbXBvc2l0ZSAmJiAhaGFzVGFzaykgewotCQkJKChWaWV3KWVkaXRQYXJ0LmdldE1vZGVsKCkpLnNldFZpc2libGUoZmFsc2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb1JlZnJlc2goZmluYWwgRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIGJvb2xlYW4gcmVmcmVzaERhdGEpIHsKLQkJZmluYWwgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkKGVkaXRQYXJ0KTsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKGRpYWdyYW0uZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgewotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCQlBYnN0cmFjdEVNRk9wZXJhdGlvbiBvcCA9IG5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihkb21haW4sIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCWlmKHJlZnJlc2hEYXRhKSB7Ci0JCQkJCQkvLyByZWZyZXNoIHRoZSBkYXRhCi0JCQkJCQkvLwotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkJZC5zZXRPYmplY3QoZC5nZXRMaW5rZWRFbGVtZW50KCkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBzaG93L2hpZGUgbm9kZXMgYWNjb3JkaW5nIHVwZGF0ZWQgZGF0YQotCQkJCQkvLwotCQkJCQlpZihpc0luaGVyaXRlZCkgewotCQkJCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZUVkZ2VzKGRpYWdyYW0pOwotCQkJCQkJdXBkYXRlVmlldyhkaWFncmFtKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQkKLQotCQkJfTsKLQkJCXRyeSB7Ci0JCQkJb3AuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsJCQkJCi0JCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9CQkKLQkJfQotCQllbHNlIHsKLQkJCU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIERpYWdyYW1BZGFwdGVyKSB7Ci0JCQkJaWYocmVmcmVzaERhdGEpIHsKLQkJCQkJKChEaWFncmFtQWRhcHRlcilhZGFwdGVyKS5wb3B1bGF0ZURpYWdyYW0oKTsKLQkJCQl9Ci0JCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0KTsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKGZpbmFsIERpYWdyYW1FZGl0UGFydCBlZGl0UGFydCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlciBwID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpZWRpdFBhcnQuZ2V0Vmlld2VyKCkpOyAKLQkJYm9vbGVhbiB3YXNEaXJ0eSA9IHAuZ2V0RWRpdG9yKCkgIT0gbnVsbCA/IHAuZ2V0RWRpdG9yKCkuaXNEaXJ0eSgpIDogZmFsc2U7Ci0JCWJvb2xlYW4gd2FzQmFzZURpcnR5ID0gZmFsc2U7Ci0JCUlFZGl0b3JQYXJ0IGJhc2VFZGl0b3IgPSBudWxsOwotCQlmaW5hbCBib29sZWFuIGlzSW5oZXJpdGVkID0gaXNJbmhlcml0ZWQoZWRpdFBhcnQpOwotCQlpZihpc0luaGVyaXRlZCkgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoZWRpdFBhcnQuZ2V0RGlhZ3JhbVZpZXcoKSk7Ci0JCQlTdHJpbmcgdHlwZSA9IGVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkuZ2V0VHlwZSgpOwotCQkJCi0JCQlpZihwLmdldEVkaXRvcigpICE9IG51bGwpIHsKLQkJCQkvLyB0cnkgdG8gZmluZCB0aGUgZGlydHkgZmxhZyBvZiBiYXNlIGRpYWdyYW0gZWRpdG9yCi0JCQkJLy8KLQkJCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IHAuZ2V0RWRpdG9yKCkuZ2V0U2l0ZSgpLmdldFBhZ2UoKS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZGl0b3JSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmID0gZWRpdG9yUmVmc1tpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKHJlZi5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCQkJCURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9ICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlyZWYuZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCk7Ci0JCQkJCQkJaWYoaW5wdXQuZ2V0V3JhcHBlcigpID09IG51bGwgJiYgaW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpID09IGVsZW1lbnQgJiYKLQkJCQkJCQkJCURpYWdyYW1NYW5hZ2VyLmdldERpYWdyYW1UeXBlKHR5cGUpID09IGlucHV0LmdldERpYWdyYW1UeXBlKCkpIHsKLQkJCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCQkJCWlmKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCQkJCQl3YXNCYXNlRGlydHkgPSBlZGl0b3IuaXNEaXJ0eSgpOwotCQkJCQkJCQkJYmFzZUVkaXRvciA9IGVkaXRvcjsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWRvUmVmcmVzaChlZGl0UGFydCwgbW9uaXRvciwgdHJ1ZSk7Ci0JCQotCQkvLyBlZGl0b3JzIGNhbiBiZWNvbWUgZGlydHkgYWZ0ZXIgcmVmcmVzaAotCQkvLyBjbGVhciBkaXJ0eSBmbGFnCi0JCS8vCi0JCWlmKCF3YXNEaXJ0eSAmJiBwLmdldEVkaXRvcigpICE9IG51bGwgJiYgcC5nZXRFZGl0b3IoKS5pc0RpcnR5KCkpIHsKLQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKERpYWdyYW1Eb2N1bWVudEVkaXRvcilwLmdldEVkaXRvcigpKS5nZXREb2N1bWVudFByb3ZpZGVyKCkpCi0JCQkJLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpIHAuZ2V0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQkJaWYoYmFzZUVkaXRvciAhPSBudWxsICYmICF3YXNCYXNlRGlydHkpIHsKLQkJCSgoU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcikoKERpYWdyYW1Eb2N1bWVudEVkaXRvciliYXNlRWRpdG9yKS5nZXREb2N1bWVudFByb3ZpZGVyKCkpCi0JCQkJLm1hcmtEb2N1bWVudEFzU2F2ZWQoKElGaWxlRWRpdG9ySW5wdXQpIGJhc2VFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goZmluYWwgRGlhZ3JhbUVkaXRQYXJ0IGVkaXRQYXJ0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGJvb2xlYW4gaXNpbmhlcml0ZWQpewotCQkKLQkJZmluYWwgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGlzSW5oZXJpdGVkKGVkaXRQYXJ0KTsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKGRpYWdyYW0uZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgewotCQkJdHJ5IHsKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLmdldEVsZW1lbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIHJlZnJlc2ggdGhlIGRhdGEKLQkJCQkJCS8vCi0JCQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGQgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlkLnNldE9iamVjdChkLmdldExpbmtlZEVsZW1lbnQoKSk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSk7Ci0JCQkJCi0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZG9tYWluLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gc2hvdy9oaWRlIG5vZGVzIGFjY29yZGluZyB1cGRhdGVkIGRhdGEKLQkJCQkJCS8vCi0JCQkJCQlpZihpc0luaGVyaXRlZCkgewotCQkJCQkJCXJlZnJlc2hDaGlsZHJlbihlZGl0UGFydCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl1cGRhdGVFZGdlcyhkaWFncmFtKTsKLQkJCQkJCQl1cGRhdGVWaWV3KGRpYWdyYW0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyLmdldE5vZGVBZGFwdGVyKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBEaWFncmFtQWRhcHRlcikgewotCQkJCSgoRGlhZ3JhbUFkYXB0ZXIpYWRhcHRlcikucG9wdWxhdGVEaWFncmFtKCk7Ci0JCQkJaWYoaXNJbmhlcml0ZWQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJCQkJcmVmcmVzaENoaWxkcmVuKGVkaXRQYXJ0KTsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJfS5leGVjdXRlKG1vbml0b3IsIG51bGwpOwotCQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEVkaXRvcihBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yKXsKLQkJaWYoZWRpdG9yLmlzRWRpdGFibGUoKSl7Ci0JCQlEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQgPWVkaXRvci5nZXREaWFncmFtRWRpdFBhcnQoKTsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYoaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSApewotCQkJCWluaXRpYWxpemUoZWRpdFBhcnQsIChEaWFncmFtRWRpdG9ySW5wdXRQcm94eSlpbnB1dCwgCi0JCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpewotCQkJCURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSBpbnB1dCA9IChEaWFncmFtRmlsZUVkaXRvcklucHV0UHJveHkpZWxlbWVudDsKLQkJCQlpZihpbnB1dCAhPSBudWxsKXsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRJbnB1dCA9IGlucHV0LmdldERpYWdyYW1FZGl0b3JJbnB1dCgpOwotCQkJCQlpZihkSW5wdXQgIT0gbnVsbCl7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBkSW5wdXQuZ2V0TWV0aG9kRWxlbWVudCgpOwotCQkJCQkJLy8gQ2hlY2sgZm9yIHBsdWdpbiBsb2NrLgotCQkJCQkJaWYoZSAhPSBudWxsKXsKLQkJCQkJCQlpZihUbmdVdGlsLmlzTG9ja2VkKGUpKSAKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQkJLy8gQ2hlY2sgd3JhcHBlciBpcyByZWFkb25seS4KLQkJCQkJCU9iamVjdCB3cmFwcGVyID0gZElucHV0LmdldFdyYXBwZXIoKTsKLQkJCQkJCWlmKHdyYXBwZXIgIT0gbnVsbCAmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKXdyYXBwZXIpLmlzUmVhZE9ubHkoKSl7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogR01GIGFuZCBHRUYgaXMgbm90IGhhbmRsaW5nIGNvbm5lY3Rpb25zIHZpc2liaWxpdHkgcHJvcGVybHkuIAotCSAqIFRoaXMgaXMgd29yay1hcm91bmQgc29sdXRpb24gdG8gaGFuZGxlIGNvbm5lY3Rpb25zIHZpc2liaWxpdHkuICAKLQkgKiBWaXNpYmlsaXR5IG9mIGVkZ2VzIG5lZWQgdG8gc2V0IGZpcnN0IGFuZCB0aGVuIG5vZGVzLiAKLQkgKiBkZWZlY3Qgb3BlbmVkIGZvciB0aGlzOiAKLQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTg0MDgxCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hDb25uZWN0aW9uRWRpdFBhcnRzKERpYWdyYW1FZGl0UGFydCBkaWFncmFtRWRpdFBhcnQpIHsKLQotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKEdyYXBoaWNhbFZpZXdlcilkaWFncmFtRWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0JCURpYWdyYW0gYWN0ID0gKERpYWdyYW0pZGlhZ3JhbUVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCUxpc3QgZWRnZXMgPSBhY3QuZ2V0RWRnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihlZGdlLmlzVmlzaWJsZSgpKXsKLQkJCQlDb25uZWN0aW9uRWRpdFBhcnQgcGFydCA9IChDb25uZWN0aW9uRWRpdFBhcnQpdmlld2VyLmdldEVkaXRQYXJ0UmVnaXN0cnkoKS5nZXQoZWRnZSk7IAotCQkJCQkKLQkJCQlpZihwYXJ0ICE9IG51bGwpewotCQkJCQlpZihwYXJ0LmdldFNvdXJjZSgpID09IG51bGwpewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IG1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCQkJCWlmKGVkZ2UuZ2V0U291cmNlKCkgPT0gbW9kZWwpewotCQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJCQkJCQkJaWYoKChHcmFwaGljYWxFZGl0UGFydCllbGVtZW50KS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSl7Ci0JCQkJCQkJCQkJcGFydC5zZXRTb3VyY2UoZWxlbWVudCk7Ci0JCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCQlwYXJ0LnNldFNvdXJjZShudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihwYXJ0LmdldFRhcmdldCgpID09IG51bGwpewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlFZGl0UGFydCBlbGVtZW50ID0gKEVkaXRQYXJ0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQkJT2JqZWN0IG1vZGVsID0gZWxlbWVudC5nZXRNb2RlbCgpOwotCQkJCQkJCWlmKGVkZ2UuZ2V0VGFyZ2V0KCkgPT0gbW9kZWwpewotCQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJCQkJCQkJaWYoKChHcmFwaGljYWxFZGl0UGFydCllbGVtZW50KS5nZXRGaWd1cmUoKS5pc1Zpc2libGUoKSl7Ci0JCQkJCQkJCQkJcGFydC5zZXRUYXJnZXQoZWxlbWVudCk7Ci0JCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCQlwYXJ0LnNldFRhcmdldChudWxsKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJdHJ5ewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlZGdlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVkZ2UgZWRnZSA9IChFZGdlKSBpdGVyLm5leHQoKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5Db25uZWN0aW9uRWRpdFBhcnQgcGFydCA9IAotCQkJCQkob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0KXZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KGVkZ2UpOyAKLQkJCQlpZihwYXJ0ICE9IG51bGwgJiYgKHBhcnQuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBwYXJ0LmdldFRhcmdldCgpID09IG51bGwpCi0JCQkJCQkmJiBwYXJ0LmdldEZpZ3VyZSgpICE9IG51bGwpewotCQkJCQlwYXJ0LmdldEZpZ3VyZSgpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCSAgICBwYXJ0LmdldEZpZ3VyZSgpLnJldmFsaWRhdGUoKTsKLQkJCQkJcGFydC5kZWFjdGl2YXRlKCk7Ci0JCQkJfQotCQl9Ci0JCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0JCQlpZihEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSl7Ci0JCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJFcnJvciBvY2N1cmVkIHdoaWxlIHJlZnJlc2ggdGhlIGNvbm5lY3Rpb246ICIrIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0FjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0FjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlMjYwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9BY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGV4dGVuZHMKLQkJRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIHsKLQotCXB1YmxpYyBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKAotCQkJQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyIGRvY3VtZW50UHJvdmlkZXIsIERpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCkgewotCQlzdXBlcihkb2N1bWVudFByb3ZpZGVyLCBkb2N1bWVudCk7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJRGlhZ3JhbURvY3VtZW50IGRvYyA9IGdldERpYWdyYW1Eb2N1bWVudCgpOwotCQlyZXR1cm4gZG9jICE9IG51bGwgPyBkb2MuZ2V0RGlhZ3JhbSgpIDogbnVsbDsKLQl9CQkKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpICE9IE5vdGlmaWNhdGlvbi5SRU1PVklOR19BREFQVEVSKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9IG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlKCk7Ci0JCQlpZihmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlICYmICgoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmUpLmlzVHJhbnNpZW50KCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJJiYgKFVtYVV0aWwuaXNDb250YWluZWRCeSgoRU9iamVjdCkgbm90aWZpZXIsIGdldERpYWdyYW0oKSkgfHwgVW1hVXRpbAotCQkJCQkJCS5pc0NvbnRhaW5lZEJ5KChFT2JqZWN0KSBub3RpZmllciwgZ2V0RGlhZ3JhbSgpCi0JCQkJCQkJCQkuZ2V0RWxlbWVudCgpKSkpIHsKLQkJCQlnZXREaWFncmFtRG9jdW1lbnQoKS5zZXRDb250ZW50KAotCQkJCQkJZ2V0RGlhZ3JhbURvY3VtZW50KCkuZ2V0Q29udGVudCgpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTIxYzk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250ZXh0TWVudVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkFic3RyYWN0RGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLQotLyoqCi0gKiBDbGFzcyB0byBoYW5kbGUgdGhlIHBvcHVwbWVudSBpdGVtcyAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIoSVdvcmtiZW5jaFBhcnQgcGFydCwgRWRpdFBhcnRWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyKHBhcnQsIHZpZXdlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5tZW51QWJvdXRUb1Nob3cobWVudSk7Ci0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSAgZmluZChBY3Rpb25JZHMuQUNUSU9OX0RFTEVURV9GUk9NX0RJQUdSQU0pOwotCQlpZihpdGVtICE9IG51bGwpCi0JCWl0ZW0uc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbTE9ICBmaW5kKEFjdGlvbklkcy5BQ1RJT05fREVMRVRFX0ZST01fTU9ERUwpOwotCQlpZihpdGVtMSAhPSBudWxsKQotCQlpdGVtMS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCUlDb250cmlidXRpb25JdGVtIGl0ZW0yID0gZmluZChBY3Rpb25JZHMuTUVOVV9OQVZJR0FURSk7Ci0JCWlmKGl0ZW0yICE9IG51bGwpCi0JCWl0ZW0yLnNldFZpc2libGUoZmFsc2UpOwotCQkKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbTMgPSBmaW5kKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpKTsKLQkJaWYoaXRlbTMgIT0gbnVsbCkKLQkJaXRlbTMuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQotCQlFZGl0RG9tYWluIGRvbWFpbiA9IGdldFZpZXdlcigpLmdldEVkaXREb21haW4oKTsKLQkJaWYoZG9tYWluIGluc3RhbmNlb2YgRGlhZ3JhbUVkaXREb21haW4pewotCQkJSUVkaXRvclBhcnQgcGFydD0gICgoRGlhZ3JhbUVkaXREb21haW4pZG9tYWluKS5nZXRFZGl0b3JQYXJ0KCk7Ci0JCQlpZihwYXJ0IGluc3RhbmNlb2YgQWJzdHJhY3REaWFncmFtRWRpdG9yKXsKLQkJCQkoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcilwYXJ0KS5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL0RpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhOGNhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGVnYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS51dGlsLklXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogQ29yZSBkaWFncmFtIGNvbnRyaWJ1dGlvbiBpdGVtIHByb3ZpZGVyLiAKLSAqIEl0IHByb3ZpZGVzIGNvbnRyaWJ1dGlvbnMgZ2VuZXJpYyB0byBFUEYgZGlhZ3JhbSBlZGl0b3JzCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyCi0JCWV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsIElXb3JrYmVuY2hQYXJ0RGVzY3JpcHRvciBwYXJ0RGVzY3JpcHRvcikgewotCQlpZihhY3Rpb25JZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpewotCQkJcmV0dXJuIG5ldyBEZWxlZ2F0ZUFjdGlvbihwYXJ0RGVzY3JpcHRvci5nZXRQYXJ0UGFnZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9wcm92aWRlcnMvU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4MmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvcHJvdmlkZXJzL1NoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRmlsZVN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLlR4VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuU3RvcmFnZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuZG9jdW1lbnQuV29ya3NwYWNlT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwuRWRpdG9ySURFUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwuRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBTdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyRXggZXh0ZW5kcyBGaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRTYXZlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dD0gKElGaWxlRWRpdG9ySW5wdXQpIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGNvbXB1dGVTYXZlU2NoZWR1bGluZ1J1bGUoaW5wdXQuZ2V0RmlsZSgpKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ29tcHV0ZXMgdGhlIHNjaGVkdWxpbmcgcnVsZSBuZWVkZWQgdG8gY3JlYXRlIG9yIG1vZGlmeSBhIHJlc291cmNlLiBJZgotCQkgKiB0aGUgcmVzb3VyY2UgZXhpc3RzLCBpdHMgbW9kaWZ5IHJ1bGUgaXMgcmV0dXJuZWQuIElmIGl0IGRvZXMgbm90LCB0aGUKLQkJICogcmVzb3VyY2UgaGllcmFyY2h5IGlzIGl0ZXJhdGVkIHRvd2FyZHMgdGhlIHdvcmtzcGFjZSByb290IHRvIGZpbmQgdGhlCi0JCSAqIGZpcnN0IHBhcmVudCBvZiA8Y29kZT50b0NyZWF0ZU9yTW9kaWZ5PC9jb2RlPiB0aGF0IGV4aXN0cy4gVGhlbiB0aGUKLQkJICogJ2NyZWF0ZScgcnVsZSBmb3IgdGhlIGxhc3Qgbm9uLWV4aXN0aW5nIHJlc291cmNlIGlzIHJldHVybmVkLgotCQkgKgotCQkgKiBAcGFyYW0gdG9DcmVhdGVPck1vZGlmeSB0aGUgcmVzb3VyY2UgdG8gY3JlYXRlIG9yIG1vZGlmeQotCQkgKiBAcmV0dXJuIHRoZSBtaW5pbWFsIHNjaGVkdWxpbmcgcnVsZSBuZWVkZWQgdG8gbW9kaWZ5IG9yIGNyZWF0ZSBhIHJlc291cmNlCi0JCSAqLwotCQlwcml2YXRlIElTY2hlZHVsaW5nUnVsZSBjb21wdXRlU2F2ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCQlpZiAodG9DcmVhdGVPck1vZGlmeS5leGlzdHMoKSAmJiB0b0NyZWF0ZU9yTW9kaWZ5LmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkKLQkJCQlyZXR1cm4gZlJlc291cmNlUnVsZUZhY3RvcnkucmVmcmVzaFJ1bGUodG9DcmVhdGVPck1vZGlmeSk7Ci0KLQkJCUlSZXNvdXJjZSBwYXJlbnQ9IHRvQ3JlYXRlT3JNb2RpZnk7Ci0JCQlkbyB7Ci0JCQkJIC8qCi0JCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Njc2MDEKLQkJCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkgaXRzZWxmLgotCQkJCSAqLwotCQkJCXRvQ3JlYXRlT3JNb2RpZnk9IHBhcmVudDsKLQkJCQlwYXJlbnQ9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCQl9IHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpICYmICFwYXJlbnQuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKTsKLQotCQkJcmV0dXJuIGZSZXNvdXJjZVJ1bGVGYWN0b3J5LmNyZWF0ZVJ1bGUodG9DcmVhdGVPck1vZGlmeSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVJ1bm5hYmxlQ29udGV4dCBnZXRPcGVyYXRpb25SdW5uZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0T3BlcmF0aW9uUnVubmVyKG1vbml0b3IpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlckV4IGZpbGVEaWFncmFtRG9jdW1lbnRQcm92aWRlciA9IG5ldyBGaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJFeCgpOwotCQotCS8vYSBTdG9yYWdlSW5mbyB3aXRoIGEgRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIAotCXByaXZhdGUgY2xhc3MgRGlhZ3JhbVN0b3JhZ2VJbmZvIGV4dGVuZHMgU3RvcmFnZUluZm8gewotCi0JCURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBmTGlzdGVuZXI7Ci0JCXB1YmxpYyBEaWFncmFtU3RvcmFnZUluZm8oSURvY3VtZW50IGRvY3VtZW50LCBEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCWZMaXN0ZW5lciA9IGxpc3RlbmVyOwotCQl9Ci0JCQotCX0KLQotCXByaXZhdGUgV29ya3NwYWNlT3BlcmF0aW9uUnVubmVyIGZPcGVyYXRpb25SdW5uZXI7Ci0JcHJpdmF0ZSBEaWFncmFtTWFuYWdlciBmRGlhZ3JhbU1ncjsKLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkID0gZmFsc2U7Ci0KLQlwdWJsaWMgU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcihEaWFncmFtTWFuYWdlciBkaWFncmFtTWdyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEaWFncmFtTWdyID0gZGlhZ3JhbU1ncjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKGRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJKChJRGlhZ3JhbURvY3VtZW50KWRvY3VtZW50KS5zZXRFZGl0aW5nRG9tYWluKGZEaWFncmFtTWdyLmdldEVkaXRpbmdEb21haW4oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNldERvY3VtZW50Q29udGVudChkb2N1bWVudCwgZWRpdG9ySW5wdXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5TdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIjc2V0RG9jdW1lbnRDb250ZW50RnJvbVN0b3JhZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudCwgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2UpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50RnJvbVN0b3JhZ2UoSURvY3VtZW50IGRvY3VtZW50LCBJU3RvcmFnZSBzdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKWRvY3VtZW50LmdldENvbnRlbnQoKTsKLQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCQlJRmlsZSByZXNvdXJjZUZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCQkvLyB1bmxvYWQgaWYgdGhlIHJlc291cmNlRmlsZSBhbmQgc3RvcmFnZSBpcyBzYW1lLgotCQkJLy8gaWYgbm90IHNhbWUgdGhyb3cgZXhjZXB0aW9uLgotCQkJaWYocmVzb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQlpZihyZXNvdXJjZUZpbGUuZXF1YWxzKHN0b3JhZ2UpKSB7Ci0JCQkJCWRvY3VtZW50LnNldENvbnRlbnQobnVsbCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFZGl0b3JJREVQbHVnaW4uZ2V0UGx1Z2luSWQoKSwgRWRpdG9yU3RhdHVzQ29kZXMuRVJST1IsIEVkaXRvck1lc3NhZ2VzLkZpbGVEb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZCwgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlkb2N1bWVudC5zZXRDb250ZW50KCgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5yZXNvdXJjZXMuSURpYWdyYW1TdG9yYWdlKXN0b3JhZ2UpLmdldERpYWdyYW0oKSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5TdG9yYWdlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIjZGlzcG9zZUVsZW1lbnRJbmZvKGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXIuRWxlbWVudEluZm8pCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCSgoRGlhZ3JhbVN0b3JhZ2VJbmZvKWluZm8pLmZMaXN0ZW5lci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBEaWFncmFtIGRpYWdyYW0gPSAoRGlhZ3JhbSkgZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCQkvL1RPRE86IGhhbmRsZSBjYXNlIHdoZXJlIHVzZXIgZGlkIG5vdCByZWZyZXNoIGRpYWdyYW0gYWZ0ZXIgZGlhZ3JhbSdzIHJlc291cmNlIGhhcyBiZWVuIHJlbG9hZGVkCi0JCS8vIGRpYWdyYW0gZG9lcyBub3QgaGF2ZSBhIHJlc291cmNlIGluIHRoaXMgY2FzZQotCQkvLyBpZiBvdmVyd3JpdGUgYWxsb3dlZCwgdGhpcyBkaWFncmFtIHNob3VsZCByZXBsYWNlIHRoZSBkaWFncmFtIGluIHRoZSByZWxvYWRlZCByZXNvdXJjZS4KLQkJLy8KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQlpZiAoIW92ZXJ3cml0ZSkgewotCQkJRGlhZ3JhbU1hbmFnZXIuY2hlY2tTeW5jaHJvbml6YXRpb25TdGF0ZShyZXNvdXJjZSk7Ci0JCX0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IFNlcnZpY2VzLmdldEFjY2Vzc0NvbnRyb2xsZXIoKS5jaGVja01vZGlmeShuZXcgUmVzb3VyY2VbXSB7cmVzb3VyY2V9LCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCQkKLQkJLy8gaW5mb3JtIGFib3V0IHRoZSB1cGNvbWluZyBjb250ZW50IGNoYW5nZQotCQlmaXJlRWxlbWVudFN0YXRlQ2hhbmdpbmcoZWxlbWVudCk7Ci0JCQotCQlpZihkaWFncmFtLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIHsKLQkJCXRyeSB7Ci0JCQkJVHhVdGlsLnJ1bkluVHJhbnNhY3Rpb24oZGlhZ3JhbSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWRpYWdyYW0ucGVyc2lzdENoaWxkcmVuKCk7Ci0JCQkJCQlmb3IgKE9iamVjdCBjaGlsZCA6IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKSkgewotCQkJCQkJCSgoVmlldykgY2hpbGQpLnBlcnNpc3RDaGlsZHJlbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotLy8JCQlyZXNvdXJjZS5zYXZlKENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCi0JCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQotCQkJLy8gaW5mb3JtIGFib3V0IGZhaWx1cmUKLQkJCWZpcmVFbGVtZW50U3RhdGVDaGFuZ2VGYWlsZWQoZWxlbWVudCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpYWdyYW1Db3JlUGx1Z2luLlBMVUdJTl9JRAotCQkJCQksIEVkaXRvclN0YXR1c0NvZGVzLlJFU09VUkNFX0ZBSUxVUkUsIGUKLQkJCQkJLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbnVsbCkpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJZkRpYWdyYW1NZ3IucmVtb3ZlRGlhZ3JhbUJhY2t1cChnZXRBY3Rpdml0eSgoSUVkaXRvcklucHV0KSBlbGVtZW50KSwgZGlhZ3JhbS5nZXRUeXBlKCkpOwotCQkJaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKQotCQkJCQl8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHMoZGlhZ3JhbS5nZXRUeXBlKCkpKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCWQuc2V0TmV3KGZhbHNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkvLyBpbmZvcm0gYWJvdXQgZmFpbHVyZQotCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCXRocm93IHg7Ci0JCX0KLQkJCi0JCWlmKG1vbml0b3IgIT0gbnVsbCkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJCi0JCWxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3MocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1Jlc291cmNlRXJyb3JzQW5kV2FybmluZ3MoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZS5EaWFnbm9zdGljIGRpYWdub3N0aWMgPSAoUmVzb3VyY2UuRGlhZ25vc3RpYykgaXRlci5uZXh0KCk7Ci0JCQlMb2cuZXJyb3IoRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCksIEVkaXRvclN0YXR1c0NvZGVzLkVSUk9SLCBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7CQkJCQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0V2FybmluZ3MoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlLkRpYWdub3N0aWMgZGlhZ25vc3RpYyA9IChSZXNvdXJjZS5EaWFnbm9zdGljKSBpdGVyLm5leHQoKTsKLQkJCUxvZy53YXJuaW5nKEVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLCBFZGl0b3JTdGF0dXNDb2Rlcy5XQVJOSU5HLCBkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7CQkJCQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlJRmlsZUVkaXRvcklucHV0IGlucHV0PSAoSUZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBGaWxlU3luY2hyb25pemVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbnB1dC5nZXRGaWxlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldE1vZGlmaWNhdGlvblN0YW1wKGVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIGlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlzdGF0dXMgPSB4LmdldFN0YXR1cygpOwotCQl9Ci0JCQotCQlPYmplY3QgbmV3Q29udGVudD0gZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCQkKLQkJLy8gc2V0IHRoZSBuZXcgY29udGVudCBhbmQgZmlyZSBjb250ZW50IHJlbGF0ZWQgZXZlbnRzCi0JCWZpcmVFbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKGlucHV0KTsKLQotCQlyZW1vdmVVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQlpbmZvLmZEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGluZm8pOwotCQlpbmZvLmZEb2N1bWVudC5zZXRDb250ZW50KG5ld0NvbnRlbnQpOwotCQlpbmZvLmZDYW5CZVNhdmVkID0gZmFsc2U7Ci0JCWluZm8uZlN0YXR1cyA9IHN0YXR1czsKLQotCQlhZGRVbmNoYW5nZWRFbGVtZW50TGlzdGVuZXJzKGlucHV0LCBpbmZvKTsKLQotCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbnB1dCk7Ci0JfQotCQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlbGVtZW50IGluZm8gdG8gYSBjaGFuZ2Ugb2YgdGhlIGZpbGUgY29udGVudCBhbmQgc2VuZHMgb3V0Ci0JICogYXBwcm9wcmlhdGUgbm90aWZpY2F0aW9ucy4KLQkgKgotCSAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgb2YgYSBkb2N1bWVudCBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50PSBjcmVhdGVFbXB0eURvY3VtZW50KCk7Ci0JCUlTdGF0dXMgc3RhdHVzPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIGlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQlzdGF0dXM9IHguZ2V0U3RhdHVzKCk7Ci0JCX0KLQotCQlPYmplY3QgbmV3Q29udGVudD0gZG9jdW1lbnQuZ2V0Q29udGVudCgpOwotCi0JCWlmICggIW5ld0NvbnRlbnQuZXF1YWxzKGluZm8uZkRvY3VtZW50LmdldENvbnRlbnQoKSkpIHsKLQotCQkJLy8gc2V0IHRoZSBuZXcgY29udGVudCBhbmQgZmlyZSBjb250ZW50IHJlbGF0ZWQgZXZlbnRzCi0JCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChpbnB1dCk7Ci0KLQkJCXJlbW92ZVVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCQlpbmZvLmZEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGluZm8pOwotCQkJaW5mby5mRG9jdW1lbnQuc2V0Q29udGVudChuZXdDb250ZW50KTsKLQkJCWluZm8uZkNhbkJlU2F2ZWQ9IGZhbHNlOwotCQkJaW5mby5mU3RhdHVzPSBzdGF0dXM7Ci0KLQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoaW5wdXQsIGluZm8pOwotCi0JCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbnB1dCk7Ci0KLQkJfSBlbHNlIHsKLQkJCQotCQkJaGFuZGxlRXhpc3RpbmdEb2N1bWVudFNhdmVkKGlucHV0LCBpbmZvLCBzdGF0dXMpOwotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhpc3RpbmdEb2N1bWVudFNhdmVkKElFZGl0b3JJbnB1dCBpbnB1dCwgRWxlbWVudEluZm8gaW5mbywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJLy8gZmlyZXMgb25seSB0aGUgZGlydHkgc3RhdGUgcmVsYXRlZCBldmVudAotCQlpbmZvLmZDYW5CZVNhdmVkPSBmYWxzZTsKLQkJaW5mby5mU3RhdHVzPSBzdGF0dXM7Ci0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbnB1dCwgaW5mbyk7Ci0KLQkJZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChpbnB1dCwgZmFsc2UpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbWFya0RvY3VtZW50QXNTYXZlZChJRmlsZUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUVsZW1lbnRJbmZvIGluZm8gPSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmIChpbmZvID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWhhbmRsZUV4aXN0aW5nRG9jdW1lbnRTYXZlZChpbnB1dCwgaW5mbywgbnVsbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvU3luY2hyb25pemUoT2JqZWN0IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvcklucHV0KSB7Ci0JCQloYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQoKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZG9TeW5jaHJvbml6ZShlbGVtZW50LCBtb25pdG9yKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQlpZihpbmZvLmZEb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9ICgoSURpYWdyYW1Eb2N1bWVudClpbmZvLmZEb2N1bWVudCkuZ2V0RGlhZ3JhbSgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQkJCS8vIGEgZGlhZ3JhbSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZXNvdXJjZSBpcyBjb25zaWRlcmVkIGFzIG91dC1vZi1zeW5jaAotCQkJCS8vIGJlY2F1c2UgaXRzIHJlc291cmNlIG11c3QgaGF2ZSBiZWVuIHJlbG9hZGVkLgotCQkJCS8vCi0JCQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgRGlhZ3JhbU1hbmFnZXIuaXNTeW5jaHJvbml6ZWQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pc1N5bmNocm9uaXplZChlbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWxlbWVudEluZm8gY3JlYXRlTmV3RWxlbWVudEluZm8oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKHRoaXMsIChEaWFncmFtRG9jdW1lbnQpZG9jdW1lbnQpOwotCQlEaWFncmFtU3RvcmFnZUluZm8gaW5mbyA9IG5ldyBEaWFncmFtU3RvcmFnZUluZm8oZG9jdW1lbnQsIGxpc3RlbmVyKTsKLQkJbGlzdGVuZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdG9yLkFic3RyYWN0RG9jdW1lbnRQcm92aWRlciNnZXRPcGVyYXRpb25SdW5uZXIob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gZmlsZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmdldE9wZXJhdGlvblJ1bm5lcihtb25pdG9yKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRvci5BYnN0cmFjdERvY3VtZW50UHJvdmlkZXIjZ2V0U2F2ZVJ1bGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFNhdmVSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuZ2V0U2F2ZVJ1bGUoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dzIGVkaXRpbmcgZXZlbiB0aGUgZG9jdW1lbnQgaXMgb3V0IG9mIHN5bmNoLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIGFsbG93RWRpdGluZyhJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJRWxlbWVudEluZm8gaW5mbyA9IGdldEVsZW1lbnRJbmZvKGlucHV0KTsKLQkJaWYoaW5mby5mRG9jdW1lbnQgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSAoKElEaWFncmFtRG9jdW1lbnQpaW5mby5mRG9jdW1lbnQpLmdldERpYWdyYW0oKTsKLQkJCWlmKGRpYWdyYW0gIT0gbnVsbCAmJiBkaWFncmFtLmVSZXNvdXJjZSgpID09IG51bGwgCi0JCQkJCSYmIGlucHV0IGluc3RhbmNlb2YgSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KGlucHV0KTsKLQkJCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCQlmRGlhZ3JhbU1nci5yZXBsYWNlVGVtcG9yYXJpbHkoYWN0LCBkaWFncmFtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiAoQWN0aXZpdHkpICgoSURpYWdyYW1GaWxlRWRpdG9ySW5wdXRQcm94eSlpbnB1dCkuZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkuZ2V0TWV0aG9kRWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVyc2VUb1NhdmVkKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlFbGVtZW50SW5mbyBpbmZvID0gZ2V0RWxlbWVudEluZm8oaW5wdXQpOwotCQlpZihpbmZvLmZEb2N1bWVudCBpbnN0YW5jZW9mIElEaWFncmFtRG9jdW1lbnQpIHsKLQkJCURpYWdyYW0gZGlhZ3JhbSA9ICgoSURpYWdyYW1Eb2N1bWVudClpbmZvLmZEb2N1bWVudCkuZ2V0RGlhZ3JhbSgpOwotCQkJaWYoZGlhZ3JhbSAhPSBudWxsICYmIGRpYWdyYW0uZVJlc291cmNlKCkgIT0gbnVsbCAKLQkJCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9ySW5wdXRQcm94eSkgewotCQkJCUFjdGl2aXR5IGFjdCA9IGdldEFjdGl2aXR5KGlucHV0KTsKLQkJCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCQlmRGlhZ3JhbU1nci5yZXZlcnNlVG9TYXZlZChhY3QsIGRpYWdyYW0sICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpaW5wdXQpLmdldFByZWZlcmVuY2VIaW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBJZiBhIHBsdWdpbiBpcyBsb2NrZWQsIGRpYWdyYW0gZWRpdG9yIGFuZCBkb2N1bWVudCBwcm92aWRlcgotCSAqIHNob3VsZCBiZSBsb2NrZWQsIHRoaXMgaXMgZG9uZSBhZnRlciBsb2FkaW5nIHRoZSBkaWFncmFtIGVkaXRvcgotCSAqIHVzaW5nIHRoaXMgbWV0aG9kLgotCSAqIEBwYXJhbSBsb2NrCi0JICovCi0JcHVibGljIHZvaWQgbG9jayhib29sZWFuIGxvY2spewotCQlsb2NrZWQgPWxvY2s7IAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWNoZShJU3RvcmFnZUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnVwZGF0ZUNhY2hlKGlucHV0KTsKLQkJU3RvcmFnZUluZm8gaW5mbz0gKFN0b3JhZ2VJbmZvKSBnZXRFbGVtZW50SW5mbyhpbnB1dCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWlmKGxvY2tlZCAmJiBpbmZvLmZJc01vZGlmaWFibGUpCi0JCQkJaW5mby5mSXNNb2RpZmlhYmxlPSAhbG9ja2VkOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIHJldHVybnMgdGhlIGxvY2tlZCBzdGF0ZSBvZiBwbHVnaW4uIAotCSAqIGxvY2tlZCBzdGF0ZSBpcyAgc2V0IHVzaW5nIGxvY2soYm9vbGVhbiBsb2NrKSBtZXRob2QuIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRMb2NrZWRTdGF0ZSgpewotCQlyZXR1cm4gbG9ja2VkOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoIURpYWdyYW1FZGl0b3JVdGlsLmlzTW9kaWZpYWJsZShlbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc01vZGlmaWFibGUoZWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9yZXNvdXJjZXMvSURpYWdyYW1TdG9yYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Jlc291cmNlcy9JRGlhZ3JhbVN0b3JhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2MDVjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3Jlc291cmNlcy9JRGlhZ3JhbVN0b3JhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnJlc291cmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURpYWdyYW1TdG9yYWdlIGV4dGVuZHMgSVN0b3JhZ2UgewotCURpYWdyYW0gZ2V0RGlhZ3JhbSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNTE2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0RpYWdyYW1IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uaW1wbC5JbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuRGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5EaWFncmFtRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBESUFHUkFNX1RZUEVTID0geyBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSwKLQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNLCBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSB9OwotCi0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoRGlhZ3JhbSBkaWFncmFtKXsKLQkJU3RyaW5nIHR5cGVTdHIgPSBkaWFncmFtLmdldFR5cGUoKTsKLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuQURfa2luZCkpewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kKSl7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLldQRF9raW5kKSl7Ci0JCQlyZXR1cm4gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU07Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWaWV3IHZpZXcgPSAoVmlldykgaXRlci5uZXh0KCk7CQkJCi0JCQlpZiAodmlldyBpbnN0YW5jZW9mIE5vZGUgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCU9iamVjdCBlID0gbnVsbDsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiB2aWV3LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEVNb2RlbEVsZW1lbnQpIHsKLQkJCQkJRU1vZGVsRWxlbWVudCBtb2RlbEVsZW1lbnQgPSAoRU1vZGVsRWxlbWVudCkgdmlldy5nZXRFbGVtZW50KCk7Ci0JCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChtb2RlbEVsZW1lbnQpOwotCQkJCQlpZihlID09IG51bGwpIHsKLQkJCQkJCS8vIGRpYWdyYW0gaXMgbm90IG9wZW4geWV0LCB0cnkgdG8gcmVzb2x2ZSB0aGUgZWxlbWVudCBmcm9tIFVSSSBzdG9yZWQgaW4gdGhlIG5vZGUncyBhbm5vdGF0aW9uCi0JCQkJCQkvLwotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KS5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCWUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKG1vZGVsRWxlbWVudCwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQllID0gdmlldy5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWlmIChvYmplY3QuZXF1YWxzKGUpKSB7Ci0JCQkJCXJldHVybiAoTm9kZSkgdmlldzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZUluTW9kZWxEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgTWV0aG9kRWxlbWVudCBlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVmlldyB2aWV3ID0gKFZpZXcpIGl0ZXIubmV4dCgpOwotCQkJaWYodmlldyBpbnN0YW5jZW9mIE5vZGUpewotCQkJCU9iamVjdCBleCA9IG51bGw7Ci0JCQkJRU9iamVjdCBtb2RlbCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQkJCWlmKG1vZGVsIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSl7Ci0JCQkJCWV4ID0gKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKW1vZGVsKS5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmKGV4ICE9IG51bGwgJiYgZXggPT0gZSl7Ci0JCQkJCQlyZXR1cm4gKE5vZGUpdmlldzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgZGlhZ3JhbSBhbmQgc2F2ZXMgaW1tZWRpYXRlbHkuCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaWFncmFtKGZpbmFsIERpYWdyYW0gZGlhZ3JhbSwgYm9vbGVhbiBzYXZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkaWFncmFtID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYm9vbGVhbiBmaWxlRXhpc3QgPSB0cnVlOwotCQlGaWxlIGZpbGUgPSBudWxsOwotCQlPYmplY3QgbGlua2VkT2JqZWN0ID0gbnVsbDsKLQkJUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKLQkJaWYgKGRpYWdyYW0uZ2V0RWxlbWVudCgpIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0RGlhZ3JhbUFkYXB0ZXIoZGlhZ3JhbQotCQkJCQkuZ2V0RWxlbWVudCgpKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlsaW5rZWRPYmplY3QgPSBhZGFwdGVyLmdldFdyYXBwZXIoKTsKLQkJCQlpZiAobGlua2VkT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJbGlua2VkT2JqZWN0ID0gYWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtTW9kZWwgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgZGlhZ3JhbQotCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJbGlua2VkT2JqZWN0ID0gZGlhZ3JhbU1vZGVsLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJfQotCi0JCWlmIChsaW5rZWRPYmplY3QgIT0gbnVsbCkgewotCQkJcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhsaW5rZWRPYmplY3QpOwotCQkJU3RyaW5nIGZpbGVQYXRoID0gRGlhZ3JhbU1hbmFnZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoKHByb2Nlc3MpOwotCQkJZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlRXhpc3QgPSBmYWxzZTsKLQkJfQotCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCWlmIChmaWxlID09IG51bGwgJiYgcmVzb3VyY2UgIT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBGaWxlKEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZQotCQkJCQkuZ2V0VVJJKCkpKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCQlmaWxlRXhpc3QgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihkaWFncmFtLCBuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZGlhZ3JhbSk7Ci0JCQkJCVVtYVV0aWwucmVtb3ZlQWxsQWRhcHRlcnMoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCQlVbWFVdGlsLnJlbW92ZUFsbEFkYXB0ZXJzKGRpYWdyYW0pOwotCQkJCX0KLQkJCQkKLQkJCX0pOwotCQkJCi0JCQlpZiAoIWZpbGVFeGlzdCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChzYXZlKSB7Ci0vLwkJCQlpZiAocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLS8vCQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0vLwkJCQkJCWlmIChwcm9jZXNzICE9IG51bGwKLS8vCQkJCQkJCQkmJiBEaWFncmFtTWFuYWdlci5oYXNEaWFncmFtTWFuYWdlcihwcm9jZXNzKSkgewotLy8JCQkJCQkJT2JqZWN0IGNvbnN1bWVyID0gbmV3IE9iamVjdCgpOwotLy8JCQkJCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoCi0vLwkJCQkJCQkJCXByb2Nlc3MsIGNvbnN1bWVyKTsKLS8vCQkJCQkJCW1nci5kaXNwb3NlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKQotLy8JCQkJCQkJCS5kZWxldGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0JCQkJCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcwotCQkJCQkJCS5nZXRMaWJyYXJ5UGVyc2lzdGVyKFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKQotCQkJCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJCQl0cnkgewotCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5QTFVHSU5fSUQsIDEsIGUKLQkJCQkJCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCQkJCX0KLS8vCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBnZXQgZWRpdGluZyBkb21haW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKXsKLQkJcmV0dXJuIChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBEaWFncmFtRWRpdGluZ0RvbWFpbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbihEaWFncmFtIGRpYWdyYW0pewotCQlpZihkaWFncmFtID09IG51bGwpIHJldHVybiBnZXRFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIGdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKURpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldEVkaXRpbmdEb21haW4ocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYWxsIGF2YWlsYWJsZSBkaWFncmFtcyBvZiB0aGUgc3BlY2lmaWVkIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPERpYWdyYW0+IGdldERpYWdyYW1zKEFjdGl2aXR5IGFjdCwgRGlhZ3JhbU1hbmFnZXIgbWdyKSB7Ci0JCXRyeSB7Ci0JCQlBcnJheUxpc3Q8RGlhZ3JhbT4gZGlhZ3JhbXMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW0+KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IERJQUdSQU1fVFlQRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBESUFHUkFNX1RZUEVTW2ldKTsKLQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCWRpYWdyYW1zLmFkZEFsbChsaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGlhZ3JhbXM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoRGlhZ3JhbSBkaWFncmFtKXsKLQkJU3RyaW5nIHR5cGVTdHIgPSBkaWFncmFtLmdldFR5cGUoKTsKLQkJaWYodHlwZVN0ci5lcXVhbHMoRGlhZ3JhbU1hbmFnZXIuQURfa2luZCkpewotCQkJcmV0dXJuIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFjdGl2aXR5RGlhZ3JhbV9raW5kOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kKSl7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWN0aXZpdHlEZXRhaWxfRGlhZ3JhbV9raW5kOwotCQl9Ci0JCWlmKHR5cGVTdHIuZXF1YWxzKERpYWdyYW1NYW5hZ2VyLldQRF9raW5kKSl7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5X0RpYWdyYW1fa2luZDsKLQkJfQotCQlyZXR1cm4gIiI7ICAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjb3B5RGlhZ3JhbShFZGl0aW5nRG9tYWluIGRvbWFpbiwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJbGlzdC5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQlsaXN0LmFkZChkaWFncmFtKTsKLQkJQ29tbWFuZCBjbWQgPSBDb3B5Q29tbWFuZC5jcmVhdGUoZG9tYWluLCBsaXN0KTsKLQkJY21kLmV4ZWN1dGUoKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY21kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gKERpYWdyYW0pIGVsZW1lbnQ7Ci0JCQkJcmV0dXJuIGNvcHk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJlYXNzb2NpYXRlcyBhY3Rpdml0eSBub2RlcyBpbiB0aGUgYmFzZSBkaWFncmFtIGNvcHkgd2l0aCBjb3JyZXNwb25kaW5nCi0JICogbG9jYWxseSBjb250cmlidXRvcnMgb3IgcmVwbGFjZXJzIGlmIHRoZXJlIGlzIGFueS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gY29weU9mQmFzZURpYWdyYW0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVhc3NvY2lhdGUoQWN0aXZpdHkgYWN0aXZpdHksIERpYWdyYW0gY29weU9mQmFzZURpYWdyYW0pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VFbGVtZW50ID0gKChBY3Rpdml0eSkgZWxlbWVudCkKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2VFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJTm9kZSBub2RlID0gRGlhZ3JhbUhlbHBlci5maW5kTm9kZShjb3B5T2ZCYXNlRGlhZ3JhbSwKLQkJCQkJCQliYXNlRWxlbWVudCk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCUVPYmplY3QgdW1sT2JqID0gbm9kZS5nZXRFbGVtZW50KCk7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb24oKEVNb2RlbEVsZW1lbnQpIHVtbE9iaiwKLQkJCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzM0MjRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ldmVudHMuUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucHJvdmlkZXJzLkFjY2Vzc2libGVEaWFncmFtTW9kaWZpY2F0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWwuRXh0ZW5kZWRSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsLkZpbGVTeW5jaHJvbml6ZXIuRmlsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuRGlhZ3JhbUVkaXRpbmdEb21haW5GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwudXRpbC5EaWFncmFtSU9VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLmludGVybmFsLnV0aWwuRU1GQ29yZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5yZXNvdXJjZXMuR01GUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1hbmFnZXIgewkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fRklMRU5BTUVfV0lUSE9VVF9FWFRFTlNJT04gPSAiZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9GSUxFTkFNRSA9IERJQUdSQU1fRklMRU5BTUVfV0lUSE9VVF9FWFRFTlNJT04gKyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPiBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCA9IG5ldyBIYXNoTWFwPFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPigpOwotCQotCXByaXZhdGUgc3RhdGljIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpYlN2Y0xpc3RlbmVyOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVTeW5jaHJvbml6ZXIgZmlsZVN5bmNocm9uaXplciA9IG5ldyBGaWxlU3luY2hyb25pemVyKCkgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248SUZpbGU+IGhhbmRsZUNoYW5nZWRGaWxlcyhDb2xsZWN0aW9uPElGaWxlPiBjaGFuZ2VkRmlsZXMpIHsKLQkJCXRyeSB7Ci0JCQkJQ29sbGVjdGlvbjxEaWFncmFtTWFuYWdlcj4gbWdycyA9IGdldERpYWdyYW1NYW5hZ2VycygpOwotCQkJCWlmKCFtZ3JzLmlzRW1wdHkoKSkgewotCQkJCQlDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQkJCQlmb3IgKERpYWdyYW1NYW5hZ2VyIG1nciA6IG1ncnMpIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gbWdyLmdldFJlc291cmNlKGZhbHNlKTsKLQkJCQkJCWlmKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShtZ3IuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQkJaWYoY2hhbmdlZEZpbGVzLmNvbnRhaW5zKGZpbGUpKSB7Ci0JCQkJCQkJCXRyeSB7CQkJCQkJCQkJCi0JCQkJCQkJCQltZ3IucmVsb2FkKCk7Ci0JCQkJCQkJCQloYW5kbGVkRmlsZXMuYWRkKGZpbGUpOwotCQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBoYW5kbGVkRmlsZXM7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlQ29yZUV4Y2VwdGlvbihlLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJRmlsZT4gaGFuZGxlTW92ZWRGaWxlcyhNYXA8SUZpbGUsIElQYXRoPiBtb3ZlZEZpbGVUb05ld1BhdGhNYXApIHsKLQkJCWZvciAoTWFwLkVudHJ5PElGaWxlLCBJUGF0aD4gZW50cnkgOiBtb3ZlZEZpbGVUb05ld1BhdGhNYXAuZW50cnlTZXQoKSkgewotCQkJCUlGaWxlIGlGaWxlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYoRElBR1JBTV9GSUxFTkFNRS5lcXVhbHMoaUZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCQlzeW5jaHJvbml6ZWQgKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBnZXREaWFncmFtTWFuYWdlcihpRmlsZSk7Ci0JCQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQkJCW1nci51cGRhdGVSZXNvdXJjZVVSSSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vdmVkRmlsZVRvTmV3UGF0aE1hcC5rZXlTZXQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVEZWxldGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gZGVsZXRlZEZpbGVzKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaGFuZGxlRGVsZXRlZEZpbGVzKGRlbGV0ZWRGaWxlcyk7Ci0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX2tpbmQgPSAiQUREIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURfa2luZCA9ICJBRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRF9raW5kID0gIldQREQiOyAvLyROT04tTkxTLTEkCQotCQotCXByaXZhdGUgc3RhdGljIERpYWdyYW1NYW5hZ2VyIGdldERpYWdyYW1NYW5hZ2VyKElGaWxlIGlGaWxlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkuaGFzTmV4dCgpOykgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gKERpYWdyYW1NYW5hZ2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihtZ3IucmVzb3VyY2UgIT0gbnVsbCAmJiBpRmlsZS5lcXVhbHMoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobWdyLnJlc291cmNlKSkpIHsKLQkJCQlyZXR1cm4gbWdyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxQcm9jZXNzLCBEaWFncmFtTWFuYWdlcj4+IGl0ZXJhdG9yID0gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5PFByb2Nlc3MsIERpYWdyYW1NYW5hZ2VyPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZW50cnkuZ2V0S2V5KCkpID09IGxpYnJhcnkpIHsKLQkJCQkJZW50cnkuZ2V0VmFsdWUoKS5kb0Rpc3Bvc2UoKTsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldHVwTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJaWYobGliU3ZjTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJbGliU3ZjTGlzdGVuZXIgPSBuZXcgTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2xvc2VkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCQlkaXNwb3NlRGlhZ3JhbU1hbmFnZXJzKGxpYnJhcnkpOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJCWRpc3Bvc2VEaWFncmFtTWFuYWdlcnMobGlicmFyeSk7Ci0JCQkJfQotCQkJfTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBpbnN0YW5jZSBvZiBEaWFncmFtTWFuYWdlciBmb3IgdGhlIHNwZWNpZmllZCBwcm9jZXNzLiBDYWxsZXIgbXVzdAotCSAqIHJlbGVhc2UgdGhlIHJldHVybmVkIERpYWdyYW1NYW5hZ2VyIGluc3RhbmNlIHdoZW4gaXQncyBubyBsb25nZXIgbmVlZGVkCi0JICogdXNpbmcge0BsaW5rICNyZW1vdmVDb25zdW1lcihPYmplY3QpfS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpYWdyYW1NYW5hZ2VyIGdldEluc3RhbmNlKFByb2Nlc3MgcHJvY2VzcywgT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCWlmKERFQlVHKSB7Ci0JCQlpZihwcm9jZXNzLmVJc1Byb3h5KCkpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlByb2Nlc3MgaXMgYSBwcm94eTogIiArIHByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJYXNzZXJ0IHByb2Nlc3MgIT0gbnVsbCAmJiBjb25zdW1lciAhPSBudWxsICYmICFwcm9jZXNzLmVJc1Byb3h5KCk7Ci0JCXNldHVwTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpOwotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSAoRGlhZ3JhbU1hbmFnZXIpIHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jZXNzKTsKLQkJaWYobWdyICE9IG51bGwgJiYgbWdyLmlzRGlzcG9zZWQoKSkgewotCQkJcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAucmVtb3ZlKHByb2Nlc3MpOwotCQkJbWdyID0gbnVsbDsKLQkJfQotCQlpZihtZ3IgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJbWdyID0gKERpYWdyYW1NYW5hZ2VyKSBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5nZXQocHJvY2Vzcyk7Ci0JCQkJaWYobWdyID09IG51bGwpIHsKLQkJCQkJbWdyID0gbmV3IERpYWdyYW1NYW5hZ2VyKHByb2Nlc3MpOwotCQkJCQlwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5wdXQocHJvY2VzcywgbWdyKTsKLQkJCQkJaWYoIWZpbGVTeW5jaHJvbml6ZXIuaXNJbnN0YWxsZWQoKSkgewotCQkJCQkJZmlsZVN5bmNocm9uaXplci5pbnN0YWxsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJbWdyLmFkZENvbnN1bWVyKGNvbnN1bWVyKTsKLQkJcmV0dXJuIG1ncjsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIGFuIGRpYWdyYW0gbWFuYWdlciBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgYWxyZWFkeSBleGlzdHMuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGhhc0RpYWdyYW1NYW5hZ2VyKFByb2Nlc3MgcHJvY2VzcykgewotCQlyZXR1cm4gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuY29udGFpbnNLZXkocHJvY2Vzcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNwb3NlRGlhZ3JhbU1hbmFnZXIoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXN5bmNocm9uaXplZCAocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCURpYWdyYW1NYW5hZ2VyIG1nciA9IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLmdldChwcm9jZXNzKTsKLQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLmRvRGlzcG9zZSgpOwotCQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jZXNzKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RGlhZ3JhbU1hbmFnZXI+IGdldERpYWdyYW1NYW5hZ2VycygpIHsKLQkJQXJyYXlMaXN0PERpYWdyYW1NYW5hZ2VyPiBtZ3JzOwotCQlzeW5jaHJvbml6ZWQocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCW1ncnMgPSBuZXcgQXJyYXlMaXN0PERpYWdyYW1NYW5hZ2VyPihwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC52YWx1ZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIG1ncnMuaXNFbXB0eSgpID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IG1ncnM7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgR01GUmVzb3VyY2VFeCBleHRlbmRzIEdNRlJlc291cmNlIGltcGxlbWVudHMgSUZhaWxTYWZlU2F2YWJsZSB7Ci0KLQkJcHJpdmF0ZSBGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyIGZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXI7Ci0KLQkJcHVibGljIEdNRlJlc291cmNlRXgoVVJJIHVyaSkgewotCQkJc3VwZXIodXJpKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewkJCQkJCi0JCQlyZXR1cm4gbmV3IEdNRkhlbHBlcih0aGlzKSB7Ci0JCQkJCi0JCQkJcHJvdGVjdGVkIFVSSSBnZXRIUkVGKFJlc291cmNlIG90aGVyUmVzb3VyY2UsIEVPYmplY3Qgb2JqKSB7Ci0JCQkJCWlmKG90aGVyUmVzb3VyY2UgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlKSB7Ci0JCQkJCQlyZXR1cm4gKChJTGlicmFyeVJlc291cmNlKW90aGVyUmVzb3VyY2UpLmdldFByb3h5VVJJKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEhSRUYob3RoZXJSZXNvdXJjZSwgb2JqKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCB1cGRhdGVJbmZvKCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHRoaXMpOwotCQkJaWYoRGlhZ3JhbU1hbmFnZXIudGhpcy5yZXNvdXJjZUlzTmV3KSB7Ci0JCQkJRGlhZ3JhbU1hbmFnZXIudGhpcy5yZXNvdXJjZUlzTmV3ID0gZmFsc2U7Ci0JCQkJZmlsZVN5bmNocm9uaXplci5tb25pdG9yKGZpbGUpOwotCQkJfQotCQkJZmlsZVN5bmNocm9uaXplci51cGRhdGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlci5zYXZlKG9wdGlvbnMpOwotCQkJaWYoIWhhc1RlbXBVUkkoKSkgewotCQkJCXVwZGF0ZUluZm8oKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBBZGFwdGVyIHN1cGVyQ3JlYXRlTW9kaWZpY2F0aW9uQWRhcHRlcigpIHsKLQkJCXJldHVybiBzdXBlci5jcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZU1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkJcHJpdmF0ZSBBZGFwdGVyIGRlbGVnYXRlID0gc3VwZXJDcmVhdGVNb2RpZmljYXRpb25BZGFwdGVyKCk7Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJCWRlbGVnYXRlLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCQkJbm90aWZ5RGlhZ3JhbUNoYW5nZUxpc3RlbmVycyhtc2cpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBEb24ndCBub3RpZnkgRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyIGFib3V0IHJlc291cmNlIG1vZGlmaWNhdGlvbiBldmVudCBidXQgcmF0aGVyCi0JCSAqIGxldCB7QGxpbmsgI25vdGlmeURpYWdyYW1DaGFuZ2VMaXN0ZW5lcnMoTm90aWZpY2F0aW9uKSBoYW5kbGUgaXQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZihpc0xvYWRlZCgpICYmIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgUmVzb3VyY2UgCi0JCQkJCSYmIG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpID09IFJlc291cmNlLlJFU09VUkNFX19JU19NT0RJRklFRAotCQkJCQkmJiBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkgewotCQkJCWlmIChlQWRhcHRlcnMgIT0gbnVsbCAmJiBlRGVsaXZlcigpKQotCQkJCXsKLQkJCQkJaW50IHNpemUgPSBlQWRhcHRlcnMuc2l6ZSgpOwotCQkJCQlpZiAoc2l6ZSA+IDApCi0JCQkJCXsKLQkJCQkJCUFkYXB0ZXIgW10gYWRhcHRlcnMgPSAoQWRhcHRlciBbXSllQWRhcHRlcnMuZGF0YSgpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCi0JCQkJCQl7Ci0JCQkJCQkJQWRhcHRlciBhZGFwdGVyID0gYWRhcHRlcnNbaV07Ci0JCQkJCQkJaWYoIShhZGFwdGVyIGluc3RhbmNlb2YgQWNjZXNzaWJsZURpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcikpIHsKLQkJCQkJCQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgbm90aWZ5RGlhZ3JhbUNoYW5nZUxpc3RlbmVycyhOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlCYXNpY0VMaXN0PEFkYXB0ZXI+IGVBZGFwdGVycyA9IGVCYXNpY0FkYXB0ZXJzKCk7Ci0JCQlpZiAoZUFkYXB0ZXJzICE9IG51bGwgJiYgZURlbGl2ZXIoKSkKLQkJCXsKLQkJCQlpbnQgc2l6ZSA9IGVBZGFwdGVycy5zaXplKCk7Ci0JCQkJaWYgKHNpemUgPiAwKQotCQkJCXsKLQkJCQkJQWRhcHRlciBbXSBhZGFwdGVycyA9IChBZGFwdGVyIFtdKWVBZGFwdGVycy5kYXRhKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotCQkJCQl7Ci0JCQkJCQlBZGFwdGVyIGFkYXB0ZXIgPSBhZGFwdGVyc1tpXTsKLQkJCQkJCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY2Nlc3NpYmxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyKSB7Ci0JCQkJCQkJYWRhcHRlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgRmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlciBnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkgewotCQkJaWYoZmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlciA9PSBudWxsKSB7Ci0JCQkJLy8gaWQgZm9ybWF0OiA8cHJvY2Vzc19ndWlkPmRpYWdyYW0KLQkJCQlTdHJpbmcgaWQgPSBEaWFncmFtTWFuYWdlci50aGlzLnByb2Nlc3MuZ2V0R3VpZCgpICsgRElBR1JBTV9GSUxFTkFNRV9XSVRIT1VUX0VYVEVOU0lPTjsKLQkJCQlmYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyID0gbmV3IEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIodGhpcywgaWQpOwotCQkJCWZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuc2V0Q29tbWl0RW1wdHlSZXNvdXJjZSh0cnVlKTsKLQkJCX0KLQkJCXJldHVybiBmYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29tbWl0KCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLmNvbW1pdCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLmRlbGV0ZUJhY2t1cCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzVGVtcFVSSSgpIHsKLQkJCXJldHVybiBnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkuaGFzVGVtcFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gcmVzdG9yZSgpIHsKLQkJCXJldHVybiBnZXRGYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyKCkucmVzdG9yZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VHhJRChTdHJpbmcgdHhJRCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLnNldFRlbXBVUkkodHhJRCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotCQkJZ2V0RmFpbFNhZmVQZXJzaXN0ZW5jZUhlbHBlcigpLnR4RmluaXNoZWQoc3VjY2Vzc2Z1bCk7Ci0JCQlpZihzdWNjZXNzZnVsKSB7Ci0JCQkJdXBkYXRlSW5mbygpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoKSB7Ci0JCQlzdXBlci5kb1VubG9hZCgpOwotCQkJCi0JCSAgICBJdGVyYXRvcjxFT2JqZWN0PiBhbGxDb250ZW50cyA9IGdldEFsbFByb3BlckNvbnRlbnRzKHVubG9hZGluZ0NvbnRlbnRzKTsKLQkJICAgIExpc3Q8RU9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKLQkJCXdoaWxlIChhbGxDb250ZW50cy5oYXNOZXh0KCkpIHsKLQkJCQlsaXN0LmFkZChhbGxDb250ZW50cy5uZXh0KCkpOwotCQkJfQotCQkJZm9yIChFT2JqZWN0IG9iamVjdCA6IGxpc3QpIHsKLQkJCQlFY29yZVV0aWwucmVtb3ZlKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgY2xhc3MgR01GRXh0ZW5kZWRSZXNvdXJjZVNldCBleHRlbmRzIEV4dGVuZGVkUmVzb3VyY2VTZXQgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBnZXRVUklUeXBlKFVSSSB1cmkpIHsKLQkJCWlmKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUuZXF1YWxzKHVyaS5zY2hlbWUoKSkpIHsKLQkJCQlyZXR1cm4gVVJJX1RZUEVfRVhURVJOQUw7Ci0JCQl9Ci0JCQlpZihESUFHUkFNX0ZJTEVOQU1FLmVxdWFscyh1cmkubGFzdFNlZ21lbnQoKSkpIHsKLQkJCQlyZXR1cm4gVVJJX1RZUEVfTE9DQUw7Ci0JCQl9Ci0JCQlyZXR1cm4gVVJJX1RZUEVfRVhURVJOQUw7Ci0gCQl9Ci0JCQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCQlYTUlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBHTUZSZXNvdXJjZUV4KHVyaSk7Ci0KLQkJCXJlc291cmNlLmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dEFsbChHTUZSZXNvdXJjZUZhY3RvcnkuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkpOwotCQkJcmVzb3VyY2UuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0QWxsKEdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKSk7Ci0KLQkJCWlmICghcmVzb3VyY2UuZ2V0RW5jb2RpbmcoKS5lcXVhbHMoRU1GQ29yZUNvbnN0YW50cy5YTUlfRU5DT0RJTkcpKQotCQkJCXJlc291cmNlLnNldEVuY29kaW5nKEVNRkNvcmVDb25zdGFudHMuWE1JX0VOQ09ESU5HKTsKLQotCQkJZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJCQotCQkJcmV0dXJuIHJlc291cmNlOwotCQl9Ci0JCQotCX0KLQotCS8qKgotCSAqIFJlZmVyZW5jZSBjb3VudCB0byB0aGlzIGRpYWdyYW0gbWFuYWdlcgotCSAqLwotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCQotCXByaXZhdGUgUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCi0JcHJpdmF0ZSBJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvdXJjZUlzTmV3OwotCQotCXByaXZhdGUgTGlzdDxJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcj4gcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgVW5pcXVlRUxpc3Q8SVJlc291cmNlQ2hhbmdlTGlzdGVuZXI+KCk7Ci0KLQlwcml2YXRlIEV4dGVuZGVkUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0KLQlwcml2YXRlIEhhc2hNYXA8QWN0aXZpdHksIE1hcDxTdHJpbmcsIERpYWdyYW0+PiBhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwOyAKLQkKLQlwcm90ZWN0ZWQgVW5pcXVlRUxpc3Q8T2JqZWN0PiBjb25zdW1lcnMgPSBuZXcgVW5pcXVlRUxpc3Q8T2JqZWN0PigpOwotCQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzIGdldFByb2Nlc3MoKSB7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmKCFyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXJlc291cmNlQ2hhbmdlTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKSB7Ci0JCXJldHVybiBjb25zdW1lcnMuYWRkKGNvbnN1bWVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29uc3VtZXIgZnJvbSB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIGRpYWdyYW0gbWFuYWdlci4gVW5sb2FkCi0JICogdGhpcyBkaWFncmFtIG1hbmFnZXIgaWYgaXQgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjb25zdW1lciBhZnRlciB0aGlzIGNhbGwuIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJYm9vbGVhbiByZXQgPSBjb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYocmV0ICYmIGNvbnN1bWVycy5pc0VtcHR5KCkpIHsKLQkJCXN5bmNocm9uaXplZChwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcCkgewotCQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jZXNzKTsKLQkJCQlpZihwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJZmlsZVN5bmNocm9uaXplci51bmluc3RhbGwoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlkb0Rpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Jlc291cmNlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VJc05ldzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VJc05ldyhib29sZWFuIHJlc291cmNlSXNOZXcpIHsKLQkJdGhpcy5yZXNvdXJjZUlzTmV3ID0gcmVzb3VyY2VJc05ldzsKLQl9Ci0JCi0JcHVibGljIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJaWYgKGVkaXRpbmdEb21haW4gPT0gbnVsbCAmJiAhaXNEaXNwb3NlZCgpKSB7Ci0JCQllZGl0aW5nRG9tYWluID0gY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQkJcmVzb3VyY2VTZXQgPSAoRXh0ZW5kZWRSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQkKLQlwcml2YXRlIEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsKLQkJR01GRXh0ZW5kZWRSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBHTUZFeHRlbmRlZFJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LmFkZChwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQlyZXR1cm4gKEludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4pIERpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZUVkaXRpbmdEb21haW4ocmVzb3VyY2VTZXQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZG9EaXNwb3NlKCkgewotCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQkJZmlsZVN5bmNocm9uaXplci51bm1vbml0b3IoZmlsZSk7CQkJCQotCQkJfQotCQkJcmVzb3VyY2UgPSBudWxsOwotCQl9Ci0KLQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJCi0JCWlmKGVkaXRpbmdEb21haW4gIT0gbnVsbCkgewotCQkJcmVzb3VyY2VTZXQuZGlzcG9zZSgpOwotCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCi0JCQllZGl0aW5nRG9tYWluLmRpc3Bvc2UoKTsKLQkJCWVkaXRpbmdEb21haW4gPSBudWxsOwkJCQotCQl9CQotCQkKLQkJY29uc3VtZXJzLmNsZWFyKCk7Ci0JCQotCQlpZihhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwICE9IG51bGwpIHsKLQkJCWFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJcHJvY2VzcyA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN5bmNocm9uaXplZCAocHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXApIHsKLQkJCXByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwLnJlbW92ZShwcm9jZXNzKTsKLQkJfQotCQlkb0Rpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIHByb2Nlc3MgPT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBkaWFncmFtcyBvZiB0aGUgZ2l2ZW4gdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBhY3Rpdml0eQotCSAqIDxjb2RlPmFjdDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNBQ1RJVklUWV9ESUFHUkFNfSwKLQkgKiAgICAgICAgICAgIHtAbGluayBJRGlhZ3JhbU1hbmFnZXIjQUNUSVZJVFlfREVUQUlMX0RJQUdSQU19LAotCSAqICAgICAgICAgICAge0BsaW5rIElEaWFncmFtTWFuYWdlciNXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNfQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtPiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QsIGludCB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWNoZWNrQWN0aXZpdHkoYWN0KTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShmYWxzZSk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUFycmF5TGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG5ldyBBcnJheUxpc3Q8RGlhZ3JhbT4oKTsKLQkJCWZvciAoRU9iamVjdCBvIDogcmVzb3VyY2UuZ2V0Q29udGVudHMoKSkgewotCQkJCWlmKG8gaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBvOwotCQkJCQlTdHJpbmcgdHlwZVN0ciA9IGdldERpYWdyYW1UeXBlU3RyaW5nKHR5cGUpOwotCQkJCQlpZih0eXBlU3RyLmVxdWFscyhkaWFncmFtLmdldFR5cGUoKSkgJiYgaXNEaWFncmFtT2YoZGlhZ3JhbSwgYWN0KSkgewotCQkJCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJCQkJaWYobW9kZWwgaW5zdGFuY2VvZiBEaWFncmFtSW1wbCkgewotCQkJCQkJCS8vIGRpc2FibGUgY3JlYXRpb24gb2YgVU1BIGdyYXBoaWNhbCBkYXRhCi0JCQkJCQkJLy8KLQkJCQkJCQkoKERpYWdyYW1JbXBsKW1vZGVsKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQkJCQkJfQotCQkJCQkJZGlhZ3JhbXMuYWRkKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBkaWFncmFtczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWFya0luaGVyaXRlZChEaWFncmFtIGRpYWdyYW0pIHsKLQkJTGlzdDw/PiBjaGlsZHJlbiA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7CQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZCh2aWV3KTsKLQkJfQotCQlmb3IgKE9iamVjdCBlZGdlIDogZGlhZ3JhbS5nZXRFZGdlcygpKSB7Ci0JCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZCgoVmlldykgZWRnZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1UeXBlU3RyaW5nKGludCBkaWFncmFtVHlwZSkgewotCQlzd2l0Y2goZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gQUREX2tpbmQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gQURfa2luZDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBXUERfa2luZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoU3RyaW5nIHR5cGVTdHIpIHsKLQkJaWYoQURfa2luZC5lcXVhbHModHlwZVN0cikpIHsKLQkJCXJldHVybiBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTTsJCQkKLQkJfQotCQllbHNlIGlmKEFERF9raW5kLmVxdWFscyh0eXBlU3RyKSkgewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsJCQkKLQkJfQotCQllbHNlIGlmKFdQRF9raW5kLmVxdWFscyh0eXBlU3RyKSkgewotCQkJcmV0dXJuIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIG5ldyBkaWFncmFtIHdpdGggdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhc3NvY2lhdGUoRGlhZ3JhbSBuZXdEaWFncmFtLCBpbnQgdHlwZSwgQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3dpdGNoKHR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCWFzc29jaWF0ZUFEKG5ld0RpYWdyYW0sIGFjdGl2aXR5KTsKLQkJCXJldHVybjsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlhc3NvY2lhdGVBREQobmV3RGlhZ3JhbSwgYWN0aXZpdHkpOwotCQkJcmV0dXJuOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJYXNzb2NpYXRlV1BEKG5ld0RpYWdyYW0sIGFjdGl2aXR5KTsJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFzc29jaWF0ZVdQRChEaWFncmFtIGNvcHksIEFjdGl2aXR5IGFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gLSBjb25zb2xpZGF0ZSBvbmUgbWV0aG9kIHdpdGggQURELgotCQlpZihjb3B5LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pIHsKLQkJCSgoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSljb3B5LmdldEVsZW1lbnQoKSkuc2V0TGlua2VkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkoKERpYWdyYW1JbXBsKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weS5nZXRFbGVtZW50KCkpOwotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkpOwkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzb2NpYXRlQUQoRGlhZ3JhbSBjb3B5LCBBY3Rpdml0eSBhY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYoY29weS5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBjb3B5LmdldEVsZW1lbnQoKSwgYWN0KTsKLQkJfQotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkuZ2V0RWxlbWVudCgpKTsKLQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChjb3B5KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFzc29jaWF0ZUFERChEaWFncmFtIGNvcHksIEFjdGl2aXR5IGFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKGNvcHkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQkoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSljb3B5LmdldEVsZW1lbnQoKSkuc2V0TGlua2VkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkoKERpYWdyYW1JbXBsKWNvcHkuZ2V0RWxlbWVudCgpKS5zZXRHcmFwaGljYWxEYXRhUmVxdWlyZWQoZmFsc2UpOwotCQl9Ci0JCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoY29weS5nZXRFbGVtZW50KCkpOwotCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGNvcHkpOwkJCi0JfQotCQotCXByaXZhdGUgRGlhZ3JhbSBjb3B5RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IHRhcmdldEFjdGl2aXR5KSB7Ci0JCURpYWdyYW0gY29weSA9IERpYWdyYW1IZWxwZXIuY29weURpYWdyYW0oZ2V0RWRpdGluZ0RvbWFpbigpLCBkaWFncmFtKTsKLQkJRGlhZ3JhbUhlbHBlci5yZWFzc29jaWF0ZSh0YXJnZXRBY3Rpdml0eSwgY29weSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oZmluYWwgQWN0aXZpdHkgYWN0LCBmaW5hbCBpbnQgdHlwZSwgZmluYWwgUHJlZmVyZW5jZXNIaW50IGhpbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2hlY2tBY3Rpdml0eShhY3QpOwotCQkvLyBjaGVjayBpZiB0aGlzIGFjdGl2aXR5IGNvbnRyaWJ1dGVzL2V4dGVuZHMgb3RoZXIgYWN0aXZpdHkgYW5kIHRyeQotCQkvLyBjb3B5Ci0JCS8vIHRoZSBleGlzdGluZyBkaWFncmFtIGZyb20gdGhlIGJhc2UKLQkJLy8KLQkJaWYgKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCUFjdGl2aXR5IGJhc2VBY3QgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZUFjdCksIHRoaXMpOwotCQkJdHJ5IHsKLQkJCQlMaXN0IGJhc2VEaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhiYXNlQWN0LCB0eXBlKTsKLQkJCQlpZighYmFzZURpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQlEaWFncmFtIGJhc2VEaWFncmFtID0gKERpYWdyYW0pIGJhc2VEaWFncmFtcy5nZXQoMCk7Ci0JCQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQlmaW5hbCBEaWFncmFtIGNvcHkgPSBjb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSwgYWN0KTsKLQkJCQkJCVR4VXRpbC5ydW5JblRyYW5zYWN0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQltYXJrSW5oZXJpdGVkKGNvcHkpOwotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJYXNzb2NpYXRlKGNvcHksIHR5cGUsIGFjdCk7Ci0JCQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9KTsKLQkJCQkJCXJldHVybiBjb3B5OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaChFeGNlcHRpb24gZSl7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXJyb3IgaW4gcmV0cmlldmluZyBiYXNlIGRpYWdyYW06ICIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihtZ3IgIT0gbnVsbCkgewotCQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCQotCQlmaW5hbCBEaWFncmFtW10gcmVzdWx0SG9sZGVyID0gbmV3IERpYWdyYW1bMV07Ci0JCXRyeSB7Ci0JCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXRFZGl0aW5nRG9tYWluKCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdEhvbGRlclswXSA9IGRvQ3JlYXRlRGlhZ3JhbShhY3QsIHR5cGUsIGhpbnQpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQlpZihERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdEhvbGRlclswXTsKLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGRvQ3JlYXRlRGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlLCBQcmVmZXJlbmNlc0hpbnQgaGludCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzd2l0Y2godHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIGNyZWF0ZUFEKGFjdCwgaGludCk7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIGNyZWF0ZUFERChhY3QsIGhpbnQpOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIGNyZWF0ZVdQREQoYWN0LCBoaW50KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERpYWdyYW0gY3JlYXRlV1BERChBY3Rpdml0eSBhY3QsIFByZWZlcmVuY2VzSGludCBoaW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBQcm9jZXNzUGFja2FnZSBtb2RlbCA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBtb2RlbCA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBEaWFncmFtSW1wbCkgewotCQkJLy8gZGlzYWJsZSBjcmVhdGlvbiBvZiBVTUEgZ3JhcGhpY2FsIGRhdGEKLQkJCS8vCi0JCQkoKERpYWdyYW1JbXBsKSBtb2RlbCkuc2V0R3JhcGhpY2FsRGF0YVJlcXVpcmVkKGZhbHNlKTsKLQkJfQotCQltb2RlbC5zZXROZXcodHJ1ZSk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlCi0JCQkJLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQltb2RlbCwKLQkJCQkJCWdldERpYWdyYW1UeXBlU3RyaW5nKElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKSwKLQkJCQkJCWhpbnQpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlkaWFncmFtLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQltb2RlbC5zZXRMaW5rZWRFbGVtZW50KGFjdCk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0KLQkJCS8vIGFkZCBSZXNvdXJjZURvbWFpbkxpbmsgdG8gdGhlIG1ldGhvZCBsaWJyYXJ5IHJlc291cmNlIHNldAotCQkJLy8KLQkJCS8vIEVjb3JlVXRpbC5nZXRBZGFwdGVyKGdldFJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5lQWRhcHRlcnMoKSwKLQkJCS8vIFJlc291cmNlRG8pCi0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHJpdmF0ZSBEaWFncmFtIGNyZWF0ZUFERChBY3Rpdml0eSBhY3QsIFByZWZlcmVuY2VzSGludCBoaW50KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBY3Rpdml0eURldGFpbERpYWdyYW0gbW9kZWwgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBEaWFncmFtSW1wbCkgewotCQkJLy8gZGlzYWJsZSBjcmVhdGlvbiBvZiBVTUEgZ3JhcGhpY2FsIGRhdGEKLQkJCS8vCi0JCQkoKERpYWdyYW1JbXBsKSBtb2RlbCkuc2V0R3JhcGhpY2FsRGF0YVJlcXVpcmVkKGZhbHNlKTsKLQkJfQotCQltb2RlbC5zZXROZXcodHJ1ZSk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsCi0JCQkJZ2V0RGlhZ3JhbVR5cGVTdHJpbmcoSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSwKLQkJCQloaW50KTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJbW9kZWwuc2V0TGlua2VkRWxlbWVudChhY3QpOwotCQkJZGlhZ3JhbS5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7Ci0JCQlnZXRSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXByaXZhdGUgRGlhZ3JhbSBjcmVhdGVBRChBY3Rpdml0eSBhY3QsIFByZWZlcmVuY2VzSGludCBoaW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IG1vZGVsID0gVU1MRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQWN0aXZpdHkoKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbShtb2RlbCwKLQkJCQlnZXREaWFncmFtVHlwZVN0cmluZyhJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSksIGhpbnQpOwotCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKG1vZGVsLCBhY3QpOwotCQkJZGlhZ3JhbS5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJbW9kZWwuc2V0TmFtZShhY3QuZ2V0TmFtZSgpKTsKLQkJCWdldFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5hZGQobW9kZWwpOwotCQkJZ2V0UmVzb3VyY2UoKS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZ2V0TW9uaXRvcigpIHsKLQkJaWYobW9uaXRvciA9PSBudWxsKSB7Ci0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGlhZ3JhbUZpbGVQYXRoKFByb2Nlc3MgcHJvY2VzcykgewotCQl0cnkgewotCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBwcm9jZXNzLmVDb250YWluZXIoKTsKLQkJCWlmKHByb2NDb21wID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UocHJvY0NvbXApKSB7Ci0JCQkJLy8gZXhpc3RpbmcgcHJvY2VzcwotCQkJCS8vCi0JCQkJcmV0dXJuIG5ldyBGaWxlKG5ldyBGaWxlKEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFVSSSgpKSkuZ2V0UGFyZW50RmlsZSgpLCBESUFHUkFNX0ZJTEVOQU1FKS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBuZXcgcHJvY2VzcyB0aGF0IGhhcyBub3QgYmVlbiBzYXZlZCB5ZXQKLQkJCQkvLwotCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkocHJvY0NvbXAsIHByb2NDb21wLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCkpOwotCQkJCXJldHVybiBuZXcgRmlsZShuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKSwKLQkJCQkJCQkJRElBR1JBTV9GSUxFTkFNRSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCXJlc291cmNlLmxvYWQoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJZmlsZVN5bmNocm9uaXplci51cGRhdGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJbm90aWZ5UmVsb2FkZWQoKTsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IGdldFJlc291cmNlKHRydWUpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9CQotCQotCXByaXZhdGUgc3RhdGljIFVSSSBjcmVhdGVEaWFncmFtUmVzb3VyY2VVUkkoU3RyaW5nIHBhdGgpIHsKLQkJSUZpbGUgZGlhZ3JhbUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShkaWFncmFtRmlsZQotCQkJCS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZSBsb2FkRGlhZ3JhbVJlc291cmNlKElGaWxlIGZGaWxlLAotCQkJRWRpdGluZ0RvbWFpbiBkb21haW4sIE1hcCBsb2FkT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJZkZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBtb25pdG9yKTsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGZGaWxlLmdldEZ1bGxQYXRoKCkKLSAgICAgICAgICAgIC50b1N0cmluZygpLCB0cnVlKTsKLQkJCi0JCVJlc291cmNlIHJlc291cmNlID0gZG9tYWluLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2UodXJpLCBmYWxzZSk7Ci0JCQotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQl9Ci0JCQotCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCU1hcCBsb2FkaW5nT3B0aW9ucyA9IG5ldyBIYXNoTWFwKEdNRlJlc291cmNlRmFjdG9yeS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQkKLSAgICAgICAgICAgIC8vIHByb3BvZ2F0ZSBwYXNzZWQgaW4gb3B0aW9ucyB0byB0aGUgZGVmYXVsdHMKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBsb2FkT3B0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGtleSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGxvYWRpbmdPcHRpb25zLnB1dChrZXksIGxvYWRPcHRpb25zLmdldChrZXkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIAlyZXNvdXJjZS5sb2FkKGxvYWRpbmdPcHRpb25zKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlyZXNvdXJjZS51bmxvYWQoKTsKLSAgICAgICAgICAgIAl0aHJvdyBlOwotICAgICAgICAgICAgfQotCQl9Ci0JCQkJCQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSBnZXRSZXNvdXJjZShib29sZWFuIGNyZWF0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldERpYWdyYW1GaWxlUGF0aChwcm9jZXNzKTsJCi0JCQlpZihwYXRoICE9IG51bGwpIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJCWlmKHdzUmVzIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgd3NSZXM7Ci0JCQkJCXRyeSB7CQkJCQkJCi0JCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBEaWFncmFtSU9VdGlsLmxvYWQoZ2V0RWRpdGluZ0RvbWFpbigpLCBmaWxlLCB0cnVlLCBnZXRNb25pdG9yKCkpOwkJCQkJCi0JCQkJCQlyZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBoYW5kbGVkIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biBpZiByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGFueSBkaWFncmFtCi0JCQkJCQkvLwotCQkJCQkJaWYob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuRGlhZ3JhbV9OT19ESUFHUkFNX0lOX1JFU09VUkNFCi0JCQkJCQkJCS5lcXVhbHMoZS5nZXRNZXNzYWdlKCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmVzb3VyY2UgPSBsb2FkRGlhZ3JhbVJlc291cmNlKGZpbGUsIGdldEVkaXRpbmdEb21haW4oKSwgQ29sbGVjdGlvbnMuRU1QVFlfTUFQLCBnZXRNb25pdG9yKCkpOwotCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaWFncmFtQ29yZVBsdWdpbi5QTFVHSU5fSUQsIGUxLmdldE1lc3NhZ2UoKSwgZTEpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbGVTeW5jaHJvbml6ZXIubW9uaXRvcihmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihjcmVhdGUpIHsKLQkJCQkJcmVzb3VyY2UgPSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSgKLQkJCQkJCQljcmVhdGVEaWFncmFtUmVzb3VyY2VVUkkocGF0aCkpOwotCQkJCQlyZXNvdXJjZUlzTmV3ID0gdHJ1ZTsKLQkJCQkJCi0JCQkJCXRyeSB7Ci0JCQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXRFZGl0aW5nRG9tYWluKCksIG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJRGlhZ3JhbUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb3VyY2UubG9hZChDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCW5vdGlmeVJlbG9hZGVkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQlpZihERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVJlbG9hZGVkKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUNoYW5nZUxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJbGlzdGVuZXIucmVzb3VyY2VDaGFuZ2VkKG5ldyBSZXNvdXJjZUNoYW5nZUV2ZW50KHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFLCAwLCBudWxsKSk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJaWYoREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBY3Rpdml0eShBY3Rpdml0eSBhY3QpIHsJCQotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJaWYocHJvYyAhPSBwcm9jZXNzKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGFjdGl2aXR5IGRvZXMgbm90IGJlbG9uZyB0byB0aGUgcHJvY2VzcyBvZiB0aGlzIGRpYWdyYW0gbWFuYWdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbU9mKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0KSB7Ci0JCWlmKEFEX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSkgewotCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50RnJvbUFubm90YXRpb24oKEVNb2RlbEVsZW1lbnQpIGRpYWdyYW0uZ2V0RWxlbWVudCgpLCBhY3QuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkgPT0gYWN0OwotCQl9Ci0JCWVsc2UgaWYoQUREX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSkgewotCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIG1vZGVsIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtICYmICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKW1vZGVsKS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gYWN0OwotCQl9Ci0JCWVsc2UgaWYoV1BEX2tpbmQuZXF1YWxzKGRpYWdyYW0uZ2V0VHlwZSgpKSkgewotCQkJRU9iamVjdCBtb2RlbCA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIG1vZGVsIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSAmJiAoKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pbW9kZWwpLmdldExpbmtlZEVsZW1lbnQoKSA9PSBhY3Q7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUKLQkgKiBsb2NhbCBmaWxlIHN5c3RlbSBieSBjb21wYXJpbmcgdGhlIGFjdHVhbCB0aW1lIHN0YW1wIHdpdGggdGhlCi0JICogY2FjaGVkIG9uZS4gSWYgdGhlIHJlc291cmNlIGhhcyBiZWVuIGNoYW5nZWQsIGEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4KLQkgKiBpcyB0aHJvd24uCi0JICoKLQkgKiBAcGFyYW0gY2FjaGVkTW9kaWZpY2F0aW9uU3RhbXAgdGhlIGNhY2hlZCBtb2RpZmljYXRpb24gc3RhbXAKLQkgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGNoZWNrCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbiBpZiByZXNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBmaWxlIHN5c3RlbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1N5bmNocm9uaXphdGlvblN0YXRlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmKCFpc1N5bmNocm9uaXplZChyZXNvdXJjZSkpIHsKLQkJCVN0YXR1cyBzdGF0dXM9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUGxhdGZvcm1VSS5QTFVHSU5fSUQsIElSZXNvdXJjZVN0YXR1cy5PVVRfT0ZfU1lOQ19MT0NBTCwgRWRpdG9yTWVzc2FnZXMuRmlsZURvY3VtZW50UHJvdmlkZXJfZXJyb3Jfb3V0X29mX3N5bmMsIG51bGwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBkb24ndCByZWZyZXNoIHRvIHByZXZlbnQgcmVzb3VyY2UgZnJvbSBhdXRvbWF0aWNhbGx5IHJlbG9hZGVkCi0JCQkvLwotLy8JCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbW9uaXRvcik7Ci0JCQlGaWxlSW5mbyBpbmZvID0gZmlsZVN5bmNocm9uaXplci5nZXRGaWxlSW5mbyhmaWxlKTsKLQkJCWlmKGluZm8gIT0gbnVsbCkgewotCQkJCXJldHVybiBpbmZvLmZNb2RpZmljYXRpb25TdGFtcCA9PSBGaWxlU3luY2hyb25pemVyLmNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8QWN0aXZpdHksIE1hcDxTdHJpbmcsIERpYWdyYW0+PiBnZXRBY3Rpdml0eVRvU2F2ZWREaWFncmFtc01hcCgpIHsKLQkJaWYoYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcCA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwID0gbmV3IEhhc2hNYXA8QWN0aXZpdHksIE1hcDxTdHJpbmcsIERpYWdyYW0+PigpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwOwotCX0KLQkKLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbUJhY2t1cChBY3Rpdml0eSBhY3QsIFN0cmluZyB0eXBlKSB7Ci0JCWlmKGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAgIT0gbnVsbCkgewotCQkJTWFwPFN0cmluZywgRGlhZ3JhbT4gdHlwZVRvRGlhZ2FtTWFwID0gYWN0aXZpdHlUb1NhdmVkRGlhZ3JhbU1hcC5nZXQoYWN0KTsKLQkJCWlmKHR5cGVUb0RpYWdhbU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChEaWFncmFtKSB0eXBlVG9EaWFnYW1NYXAuZ2V0KHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXBsYWNlVGVtcG9yYXJpbHkoZmluYWwgQWN0aXZpdHkgYWN0LCBmaW5hbCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJdHJ5IHsKLQkJCW5ldyBBYnN0cmFjdEVNRk9wZXJhdGlvbihnZXRFZGl0aW5nRG9tYWluKCksIFN0cmluZ1N0YXRpY3MuQkxBTkspIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJU3RhdHVzIGRvRXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlMaXN0IGRpYWdyYW1zID0gZ2V0RGlhZ3JhbXMoYWN0LCBnZXREaWFncmFtVHlwZShkaWFncmFtLmdldFR5cGUoKSkpOwotCQkJCQkJaWYoIWRpYWdyYW1zLmlzRW1wdHkoKSkgewotCQkJCQkJCURpYWdyYW0gc2F2ZWREaWFncmFtID0gKERpYWdyYW0pIGRpYWdyYW1zLmdldCgwKTsKLQkJCQkJCQlNYXA8U3RyaW5nLCBEaWFncmFtPiB0eXBlVG9EaWFnYW1NYXAgPSBnZXRBY3Rpdml0eVRvU2F2ZWREaWFncmFtc01hcCgpLmdldChhY3QpOwkKLQkJCQkJCQlpZih0eXBlVG9EaWFnYW1NYXAgPT0gbnVsbCkgewotCQkJCQkJCQl0eXBlVG9EaWFnYW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERpYWdyYW0+KCk7Ci0JCQkJCQkJCWdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkucHV0KGFjdCwgdHlwZVRvRGlhZ2FtTWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYodHlwZVRvRGlhZ2FtTWFwLmdldChkaWFncmFtLmdldFR5cGUoKSkgPT0gbnVsbCkgewotCQkJCQkJCQl0eXBlVG9EaWFnYW1NYXAucHV0KGRpYWdyYW0uZ2V0VHlwZSgpLCBzYXZlZERpYWdyYW0pOwotCQkJCQkJCX0KLQkJCQkJCQkoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbSkuZVNldFByb3h5VVJJKG51bGwpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZUFsbENvbnRlbnRzKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOyAoKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCkpLmVTZXRQcm94eVVSSShudWxsKSk7Ci0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIGRpYWdyYW0uZ2V0RWxlbWVudCgpKS5lU2V0UHJveHlVUkkobnVsbCk7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFsbENvbnRlbnRzKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOyAoKEludGVybmFsRU9iamVjdCkgaXRlci5uZXh0KCkpLmVTZXRQcm94eVVSSShudWxsKSk7CQkJCQkJCQotCQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuc2V0KHJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZihzYXZlZERpYWdyYW0pLCBkaWFncmFtKTsKLQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnNldChyZXNvdXJjZS5nZXRDb250ZW50cygpLmluZGV4T2Yoc2F2ZWREaWFncmFtLmdldEVsZW1lbnQoKSksIGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsJCQkJCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQkKLQkJCQkJfQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQkJCi0JCQl9LmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBEaWFncmFtIGdldFNhdmVkRGlhZ3JhbShBY3Rpdml0eSBhY3QsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlEaWFncmFtIHNhdmVkRGlhZ3JhbSA9IGdldERpYWdyYW1CYWNrdXAoYWN0LCBkaWFncmFtLmdldFR5cGUoKSk7Ci0vLwkJaWYoc2F2ZWREaWFncmFtID09IG51bGwpIHsKLS8vCQkJLy8gdHJ5IHRvIGxvYWQgZGlhZ3JhbSBmcm9tIGZpbGUKLS8vCQkJLy8KLS8vCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLS8vCQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0vLwkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBjcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0vLwkJCQl0cnkgewotLy8JCQkJCURpYWdyYW0gZCA9IERpYWdyYW1JT1V0aWwubG9hZChkb21haW4sIGZpbGUsIHRydWUsIGdldE1vbml0b3IoKSk7Ci0vLwkJCQkJaWYoZCAhPSBudWxsKSB7Ci0vLwkJCQkJCWludCBpbmRleCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZihkaWFncmFtKTsKLS8vCQkJCQkJc2F2ZWREaWFncmFtID0gKERpYWdyYW0pIGQuZVJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoaW5kZXgpOwotLy8JCQkJCX0KLS8vCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vCQkJCX0gZmluYWxseSB7Ci0vLwkJCQkJaWYoZG9tYWluICE9IG51bGwpIHsKLS8vCQkJCQkJZG9tYWluLmRpc3Bvc2UoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0JCXJldHVybiBzYXZlZERpYWdyYW07Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJldmVyc2VUb1NhdmVkKGZpbmFsIEFjdGl2aXR5IGFjdCwgZmluYWwgRGlhZ3JhbSBkaWFncmFtLCBQcmVmZXJlbmNlc0hpbnQgaGludCkgewotCQlmaW5hbCBEaWFncmFtIHNhdmVkRGlhZ3JhbSA9IGdldFNhdmVkRGlhZ3JhbShhY3QsIGRpYWdyYW0pOwotCQl0cnkgewotCQkJbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGdldEVkaXRpbmdEb21haW4oKSwgU3RyaW5nU3RhdGljcy5CTEFOSykgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQkJaWYoc2F2ZWREaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCS8vIHJlc3RvcmUgZGlhZ3JhbSB0byBpdHMgYmFja3VwCi0JCQkJCQkvLwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zZXQocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0pLCBzYXZlZERpYWdyYW0pOwotCQkJCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zZXQocmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pbmRleE9mKGRpYWdyYW0uZ2V0RWxlbWVudCgpKSwgc2F2ZWREaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQlyZW1vdmVEaWFncmFtQmFja3VwKGFjdCwgZGlhZ3JhbS5nZXRUeXBlKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gZGlhZ3JhbSBpcyBuZXdseSBjcmVhdGVkLCByZW1vdmUgaXQgZnJvbSByZXNvdXJjZQotCQkJCQkJLy8KLQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKGRpYWdyYW0pOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldFBlcnNpc3RlckZvcihhY3QuZVJlc291cmNlKCkpCi0JCQkJCQkJLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2goRXhjZXB0aW9uIGV4KSB7fQotCQkJCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJCQotCQkJfS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlMSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkJCi0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBVUkkgb2YgZGlhZ3JhbSByZXNvdXJjZSBhZnRlciB0aGUgVVJJIG9mIHByb2Nlc3MgcmVzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZVVSSSgpIHsKLQkJaWYocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIHByb2NGb2xkZXIgPSBuZXcgRmlsZShwcm9jZXNzLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmKCFmb2xkZXIuZXF1YWxzKHByb2NGb2xkZXIpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldERpYWdyYW1GaWxlUGF0aChwcm9jZXNzKTsKLQkJCWlmKHBhdGggIT0gbnVsbCAmJiBuZXcgRmlsZShwYXRoKS5leGlzdHMoKSkgewotCQkJCXJlc291cmNlLnNldFVSSShjcmVhdGVEaWFncmFtUmVzb3VyY2VVUkkocGF0aCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmFja3VwRGlhZ3JhbShBY3Rpdml0eSBhY3Rpdml0eSwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU1hcDxTdHJpbmcsIERpYWdyYW0+IHR5cGVUb0RpYWdhbU1hcCA9IGdldEFjdGl2aXR5VG9TYXZlZERpYWdyYW1zTWFwKCkuZ2V0KGFjdGl2aXR5KTsJCi0JCWlmKHR5cGVUb0RpYWdhbU1hcCA9PSBudWxsKSB7Ci0JCQl0eXBlVG9EaWFnYW1NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERpYWdyYW0+KCk7Ci0JCQlnZXRBY3Rpdml0eVRvU2F2ZWREaWFncmFtc01hcCgpLnB1dChhY3Rpdml0eSwgdHlwZVRvRGlhZ2FtTWFwKTsKLQkJfQotCQl0eXBlVG9EaWFnYW1NYXAucHV0KGRpYWdyYW0uZ2V0VHlwZSgpLCBEaWFncmFtSGVscGVyLmNvcHlEaWFncmFtKGdldEVkaXRpbmdEb21haW4oKSwgZGlhZ3JhbSkpOwotCX0KLQotCXB1YmxpYyBEaWFncmFtIHJlbW92ZURpYWdyYW1CYWNrdXAoQWN0aXZpdHkgYWN0LCBTdHJpbmcgdHlwZSkgewotCQlpZihhY3Rpdml0eVRvU2F2ZWREaWFncmFtTWFwICE9IG51bGwpIHsKLQkJCU1hcDxTdHJpbmcsIERpYWdyYW0+IHR5cGVUb0RpYWdhbU1hcCA9IGFjdGl2aXR5VG9TYXZlZERpYWdyYW1NYXAuZ2V0KGFjdCk7Ci0JCQlpZih0eXBlVG9EaWFnYW1NYXAgIT0gbnVsbCkgewotCQkJCXJldHVybiAoRGlhZ3JhbSkgdHlwZVRvRGlhZ2FtTWFwLnJlbW92ZSh0eXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS9zZXJ2aWNlcy9EaWFncmFtU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjFhOGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRGlhZ3JhbVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1TZXJ2aWNlIHsKLQotCXByaXZhdGUgU2V0PERpYWdyYW1NYW5hZ2VyPiBkaWFncmFtTWFuYWdlcnMgPSBuZXcgSGFzaFNldDxEaWFncmFtTWFuYWdlcj4oKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEaWFncmFtU2VydmljZSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChEaWFncmFtTWFuYWdlciBtZ3IgOiBkaWFncmFtTWFuYWdlcnMpIHsKLQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcihBY3Rpdml0eSBhY3QpIHsKLQkJUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCk7Ci0JCWlmKHByb2MgIT0gbnVsbCkgewotCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdCksIHRoaXMpOwotCQkJZGlhZ3JhbU1hbmFnZXJzLmFkZChtZ3IpOwotCQkJcmV0dXJuIG1ncjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248RGlhZ3JhbT4gZ2V0RGlhZ3JhbXMoQWN0aXZpdHkgYWN0KSB7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKGFjdCk7Ci0JCXJldHVybiBtZ3IgIT0gbnVsbCA/IERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbXMoYWN0LCBtZ3IpIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBiYXNlIGRpYWdyYW0uCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCQotCXB1YmxpYyBEaWFncmFtIGdldEJhc2VEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHsJCQotCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJdHJ5IHsKLQkJCQlBY3Rpdml0eSBiYXNlQWN0ID0gKEFjdGl2aXR5KSBhY3QKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoYmFzZUFjdCk7Ci0JCQkJTGlzdDxEaWFncmFtPiBiYXNlRGlhZ3JhbXMgPSBtZ3IuZ2V0RGlhZ3JhbXMoYmFzZUFjdCwgdHlwZSk7Ci0JCQkJaWYoIWJhc2VEaWFncmFtcy5pc0VtcHR5KCkpIHsKLQkJCQkJcmV0dXJuIGJhc2VEaWFncmFtcy5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgaW4gZ2V0dGluZyBiYXNlIGRpYWdyYW06ICIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBnZXREaWFncmFtTWFuYWdlcihhY3QpOwotCQkJTGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IG1nci5nZXREaWFncmFtcyhhY3QsIHR5cGUpOwotCQkJcmV0dXJuIGRpYWdyYW1zLmlzRW1wdHkoKSA/IG51bGwgOiBkaWFncmFtcy5nZXQoMCk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCURpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3NlcnZpY2VzL0ZpbGVTeW5jaHJvbml6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRmlsZVN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODhkMzM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvc2VydmljZXMvRmlsZVN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFN5bmNocm9uaXplcyB0aGUgZG9jdW1lbnQgd2l0aCBleHRlcm5hbCByZXNvdXJjZSBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZpbGVTeW5jaHJvbml6ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsLkZpbGVTeW5jaHJvbml6ZXIgewotCS8qKgotCSAqIFBvc3RzIHRoZSB1cGRhdGUgY29kZSAiYmVoaW5kIiB0aGUgcnVubmluZyBvcGVyYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcnVubmFibGUgdGhlIHVwZGF0ZSBjb2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93W10gd2luZG93cz0gd29ya2JlbmNoLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJaWYgKHdpbmRvd3MgIT0gbnVsbCAmJiB3aW5kb3dzLmxlbmd0aCA+IDApIHsKLQkJCURpc3BsYXkgZGlzcGxheT0gd2luZG93c1swXS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKTsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJfSBlbHNlIHsKLQkJCXJ1bm5hYmxlLnJ1bigpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlY2E5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGlhZ3JhbURlbGV0ZUFjdGlvbklEID0gImRlbGV0ZURpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRGVsZXRlX0RpYWdyYW1fRWxlbWVudD0iZGVsZXRlRGlhZ3JhbUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0RJQUdSQU1fSUQ9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuRGVsZXRlRGlhZ3JhbUFjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNFVF9ESUFHUkFNX0xBWU9VVCA9ICJyZXNldF9kaWFncmFtX2xheW91dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fQUREX01FTlVfR0VORVJBTF9HUk9VUCA9ICJhZGREaWFncmFtR2VuZXJhbEdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUEFSRU5UX0NPTU1BTkQgPSAicmVwYXJlbnQgY29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbG9yIFJFQURfT05MWV9GT05UX0NPTE9SID0gQ29sb3JDb25zdGFudHMuZGFya0dyZWVuOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sb3IgREVGQVVMVF9GT05UX0NPTE9SID0gQ29sb3JDb25zdGFudHMuYmxhY2s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xvciBTVVBQUkVTU0VEX0ZPTlRfQ09MT1IgPSBDb2xvckNvbnN0YW50cy5ncmF5OwotCQotCQotCS8vIEZvciBkZWZhdWx0IGZvbnRzLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRk9OVF9OQU1FID0gZ2V0Rm9udE5hbWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRk9OVF9TSVpFID0gODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBERUZBVUxUX0ZPTlQgPSBuZXcgRm9udChudWxsLCBERUZBVUxUX0ZPTlRfTkFNRSwKLQkJCURFRkFVTFRfRk9OVF9TSVpFLCBqYXZhLmF3dC5Gb250LlBMQUlOKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRm9udCBERUZBVUxUX0ZPTlRfSVRBTElDID0gbmV3IEZvbnQobnVsbCwKLQkJCURFRkFVTFRfRk9OVF9OQU1FLCBERUZBVUxUX0ZPTlRfU0laRSwgamF2YS5hd3QuRm9udC5JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOXzJLID0gIldpbmRvd3MgMjAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICJBcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDb3JydXB0ZWQgSmFwYW5lc2UgY2hhcmFjdGVycyBpbiBBY3Rpdml0eSBEaWFncmFtcwotCQlTdHJpbmcgY3VycmVudExvY2FsZSA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCWlmIChjdXJyZW50TG9jYWxlICE9IG51bGwKLQkJCQkmJiBjdXJyZW50TG9jYWxlLnN0YXJ0c1dpdGgoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpKSB7Ci0JCQlpZiAoV0lOXzJLLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Rm9udE5hbWUoRm9udFN0eWxlIHN0eWxlKSB7Ci0JCVN0cmluZyBuYW1lID0gIkFyaWFsIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3R5bGUgIT0gbnVsbCkgewkKLQkJCW5hbWUgPSBzdHlsZS5nZXRGb250TmFtZSgpOwotCQl9Ci0KLQkJLy8gQ29ycnVwdGVkIEphcGFuZXNlIGNoYXJhY3RlcnMgaW4gQWN0aXZpdHkgRGlhZ3JhbXMKLQkJU3RyaW5nIGN1cnJlbnRMb2NhbGUgPSBQbGF0Zm9ybS5nZXROTCgpOwotCQlpZiAoY3VycmVudExvY2FsZSAhPSBudWxsCi0JCQkJJiYgY3VycmVudExvY2FsZS5zdGFydHNXaXRoKExvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpKSkgewotCQkJaWYgKFdJTl8ySy5lcXVhbHNJZ25vcmVDYXNlKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCBkZWZhdWx0IGZvbnQgZGF0YQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZvbnREYXRhIGdldERlZmF1bHRGb250RGF0YSgpIHsKLQkKLQkJU3RyaW5nIGZvbnROYW1lID0gREVGQVVMVF9GT05UX05BTUU7Ci0JCQotCQkvLyBDb3JydXB0ZWQgSmFwYW5lc2UgY2hhcmFjdGVycyBpbiBBY3Rpdml0eSBEaWFncmFtcwotCQlTdHJpbmcgY3VycmVudExvY2FsZSA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCWlmIChjdXJyZW50TG9jYWxlICE9IG51bGwKLQkJCQkmJiBjdXJyZW50TG9jYWxlLnN0YXJ0c1dpdGgoTG9jYWxlLkpBUEFORVNFLmdldExhbmd1YWdlKCkpKSB7Ci0JCQlpZiAoV0lOXzJLLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfamE7Ci0JCQl9Ci0JCX0KLQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIERFRkFVTFRfRk9OVF9TSVpFLCBTV1QuTk9STUFMKTsKLQkJcmV0dXJuIGZvbnREYXRhOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfU1RBUlRfTk9ERSA9ICJjcmVhdGVfc3RhcnRfbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9FTkRfTk9ERSA9ICJjcmVhdGVfZW5kX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfSk9JTl9OT0RFID0gImNyZWF0ZV9qb2luX25vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfREVDSVNJT05fTk9ERSA9ICJjcmVhdGVfZGVjaXNpb25fbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9BQ1RJVklUWSA9ICJjcmVhdGVfYWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfUEhBU0UgPSAiY3JlYXRlX3BoYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0lURVJBVElPTiA9ICJjcmVhdGVfaXRlcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1RBU0tfREVTQ1JJUFRPUiA9ICJjcmVhdGVfdGFza19kZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX01JTEVTVE9ORSA9ICJjcmVhdGVfbWlsZXN0b25lIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GT1JLX05PREU9ImNyZWF0ZV9mb3JrX25vZGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX01FUkdFX05PREU9ImNyZWF0ZV9tZXJnZV9ub2RlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9QQVJUSVRJT04gPSJjcmVhdGVfcGFydGl0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0gPSAib3Blbl9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERT0iY3JlYXRlX3dvcmtfcHJvZHVjdF9kZXNjcmlwdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9MSU5LID0gImNyZWF0ZV9kaWFncmFtX2xpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFX0FDVElPTiA9ICJtb3ZlX2FjdGlvbl9pZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJlbG93IGRlZmF1bHRzIHZhcmlhYmxlcyBhcmUgdG8gZXhjbHVkZSBmcm9tIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTF9DT0xPUl9FREVGQVVMVCA9IDE2Nzc3MjE1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVfQ09MT1JfRURFRkFVTFQgPSAxMTU3OTU2ODsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBDT05UUk9MX0ZMT1dfSU1BR0VfREVTQ1JJUFRPUiA9IERpYWdyYW1Db3JlUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImxpbmsuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Njg0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvRGlhZ3JhbUNvcmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUG9zaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuVHJhbnNsYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuZmlndXJlcy5XaWRlbmVkV3JhcExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LklEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBhcnRzLkFic3RyYWN0RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLkZpZ3VyZVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuSU1hcE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLm1hcG1vZGUuTWFwTW9kZVR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBiZSB1c2VkIGZvciBFUEYgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtQ29yZVV0aWwgewotCQotCi0JLyoqCi0JICogU2V0IGxhYmVsIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiBsYWJlbCBmaWd1cmUKLQkgKiBAcGFyYW0gZmlnXzAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TGFiZWxQcm9wZXJ0aWVzKFdyYXBMYWJlbCBsYWJlbEZpZ3VyZSl7Ci0JCWxhYmVsRmlndXJlLnNldEZvbnQoRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlQpOwotCQlsYWJlbEZpZ3VyZS5zZXRJY29uQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCWxhYmVsRmlndXJlLnNldExhYmVsQWxpZ25tZW50KFBvc2l0aW9uQ29uc3RhbnRzLlRPUCk7Ci0JCWxhYmVsRmlndXJlLnNldFRleHRBbGlnbm1lbnQoUG9zaXRpb25Db25zdGFudHMuVE9QKTsKLQkJbGFiZWxGaWd1cmUuc2V0VGV4dFBsYWNlbWVudChQb3NpdGlvbkNvbnN0YW50cy5TT1VUSCk7Ci0JCWxhYmVsRmlndXJlLnNldFRleHRXcmFwKHRydWUpOwotCQlsYWJlbEZpZ3VyZS5zZXRUZXh0V3JhcEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IGZvbnQgZm9yIHRoaXMgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKiBAcGFyYW0gc3RvcmUgSVByZWZlcmVuY2VTdG9yZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSl7Ci0JCUZvbnREYXRhIGZvbnREYXRhQXJyYXlbXSA9Ci0gICAgICAgICAgICBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpLmdldEZvbnREYXRhKCk7Ci0gICAgICAgIEZvbnREYXRhIGZvbnREYXRhID0gZm9udERhdGFBcnJheVswXTsKLSAgICAgICAgZm9udERhdGEuc2V0SGVpZ2h0KERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX1NJWkUpOwotICAgICAgICBmb250RGF0YS5zZXROYW1lKERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX05BTUUpOwotICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQoCi0gICAgICAgICAgICBzdG9yZSwKLSAgICAgICAgICAgIElQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfREVGQVVMVF9GT05ULAotICAgICAgICAgICAgZm9udERhdGEpOwkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRTdHJpbmdGb3JCcmVha2Rvd25FbGVtZW50cyhFZGl0UGFydCBwYXJ0LCBTdHJpbmcgdHh0KXsKLQkJT2JqZWN0IG9iaiA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmo7Ci0JCQlFT2JqZWN0IHVtbEUgPSBub2RlLmdldEVsZW1lbnQoKTsKLQkJCU9iamVjdCBlID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpdW1sRSk7Ci0JCQlFT2JqZWN0IHVtbEEgPSBub2RlLmdldERpYWdyYW0oKS5nZXRFbGVtZW50KCk7Ci0JCQlBY3Rpdml0eURpYWdyYW1BZGFwdGVyIGFkYXB0ZXIgPSAoQWN0aXZpdHlEaWFncmFtQWRhcHRlcilCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodW1sQSk7Ci0JCQlpZihhZGFwdGVyICE9IG51bGwpewotCQkJCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tXQlNBY3Rpdml0eVByZXNlbnRhdGlvbk5hbWUoZSwgdHh0LCBhZGFwdGVyLmdldFN1cHByZXNzaW9uKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIFRuZ1V0aWwKLQkJCQkJCS5jaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShlLAotCQkJCQkJCQl0eHQsIGFkYXB0ZXIuZ2V0U3VwcHJlc3Npb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGZvbnQgY29sb3IgZm9yIHRoZSBnaXZlbiBlZGl0IHBhcnQuIFRoZSBjb2xvciBpcyBkZXBlbmRpbmcgb24gdGhlIHN0YXRlIChzdXBwcmVzc2lvbiwgcmVhZC1vbmx5Li4uKQotCSAqIG9mIHRoZSBzZW1hbnRpYyBtb2RlbCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sb3IgZ2V0Rm9udENvbG9yKEFic3RyYWN0RWRpdFBhcnQgZWRpdFBhcnQpIHsKLQkJT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQotCQkvLyBCeSBkZWZhdWx0IHB1Ymxpc2hpbmcgbW9kZSBpcyBmYWxzZS4gSWYgcHVibGlzaCBtb2RlIGlzIHNldCByZXR1cm4gYmxhY2sgY29sb3IuCi0JCWlmKExpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRWRpdFBhcnRWaWV3ZXIgdmlld2VyID0gZWRpdFBhcnQuZ2V0Vmlld2VyKCk7Ci0JCWlmKHZpZXdlciBpbnN0YW5jZW9mIElEaWFncmFtRWRpdG9ySW5wdXRQcm92aWRlcikgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gKChJRGlhZ3JhbUVkaXRvcklucHV0UHJvdmlkZXIpdmlld2VyKS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCS8vIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1lbnRlZCBvdXQgY29kZSBvbmx5IGlmIHN1cHByZXNzZWQgZWxlbWVudHMgc2hvdWxkIGJlIHNob3duIGluIGdyYXkKLQkJCS8vCi0vLwkJCWlmKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwgJiYKLS8vCQkJCQlpbnB1dC5nZXRXcmFwcGVyKCkuaXNJbmhlcml0ZWQoKSkgewotLy8JCQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLS8vCQkJCWlmKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotLy8JCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBudWxsOwotLy8JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW1FZGl0UGFydChlZGl0UGFydCkuZ2V0RGlhZ3JhbVZpZXcoKTsKLS8vCQkJCQlTdHJpbmcgdHlwZSA9IGRpYWdyYW0uZ2V0VHlwZSgpOwotLy8JCQkJCWlmKERpYWdyYW1NYW5hZ2VyLkFEX2tpbmQuZXF1YWxzKHR5cGUpKSB7Ci0vLwkJCQkJCURpYWdyYW1BZGFwdGVyIGRhID0gKChEaWFncmFtQWRhcHRlcilCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIoZGlhZ3JhbS5nZXRFbGVtZW50KCkpKTsKLS8vCQkJCQkJaWYoZGEgIT0gbnVsbCkgewotLy8JCQkJCQkJQWN0aXZpdHlEaWFncmFtQWRhcHRlciBhZGFwdGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoaW5wdXQuZ2V0V3JhcHBlcigpKTsKLS8vCQkJCQkJCWFkYXB0ZXIuc2V0RmlsdGVyKGRhLmdldEZpbHRlcigpKTsKLS8vCQkJCQkJCWFkYXB0ZXIuc2V0U3VwcHJlc3Npb24oZGEuZ2V0U3VwcHJlc3Npb24oKSk7Ci0vLwkJCQkJCQljaGlsZHJlbiA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQllbHNlIGlmKERpYWdyYW1NYW5hZ2VyLkFERF9raW5kLmVxdWFscyh0eXBlKSB8fCBEaWFncmFtTWFuYWdlci5XUERfa2luZC5lcXVhbHModHlwZSkpIHsKLS8vCQkJCQkJRGlhZ3JhbUltcGwgZDsKLS8vCQkJCQkJaWYoRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQuZXF1YWxzKHR5cGUpKSB7Ci0vLwkJCQkJCQlkID0gKERpYWdyYW1JbXBsKSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotLy8JCQkJCQl9Ci0vLwkJCQkJCWVsc2UgewotLy8JCQkJCQkJZCA9IChEaWFncmFtSW1wbCkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0vLwkJCQkJCX0JCQkJCQkKLS8vCQkJCQkJRGlhZ3JhbUltcGwgZGlhZ3JhbUluVXNlID0gKChEaWFncmFtSW1wbClkaWFncmFtLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCk7Ci0vLwkJCQkJCWlmKHN1cHByZXNzaW9uICE9IG51bGwpIHsKLS8vCQkJCQkJCWQuc2V0V3JhcHBlcihpbnB1dC5nZXRXcmFwcGVyKCkpOwotLy8JCQkJCQkJZC5zZXRGaWx0ZXIoZGlhZ3JhbUluVXNlLmdldEZpbHRlcigpKTsKLS8vCQkJCQkJCWQuc2V0U3VwcHJlc3Npb24oZGlhZ3JhbUluVXNlLmdldFN1cHByZXNzaW9uKCkpOwotLy8JCQkJCQkJY2hpbGRyZW4gPSBkLmdldENoaWxkcmVuKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQkJaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotLy8JCQkJCQlNZXRob2RFbGVtZW50IGUgPSBCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudCgoVmlldykgbW9kZWwpOwotLy8JCQkJCQlmaW5kX3dyYXBwZXI6Ci0vLwkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJCQlpZihUbmdVdGlsLnVud3JhcChjaGlsZCkgPT0gZSkgewotLy8JCQkJCQkJCQlvYmplY3QgPSBjaGlsZDsKLS8vCQkJCQkJCQkJYnJlYWsgZmluZF93cmFwcGVyOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJaWYob2JqZWN0ICE9IG51bGwpIHsKLS8vCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGlucHV0LmdldFdyYXBwZXIoKSk7Ci0vLwkJCQkJCQlpZihTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKS5pc1N1cHByZXNzZWQob2JqZWN0KSkgewotLy8JCQkJCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlNVUFBSRVNTRURfRk9OVF9DT0xPUjsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJCWVsc2UgewotLy8JCQkJCQkJCXJldHVybiBEaWFncmFtQ29uc3RhbnRzLlJFQURfT05MWV9GT05UX0NPTE9SOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfQotLy8JCQl9Ci0JCQkKLQkJCWlmKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZ2V0V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUjsKLQkJCX0KLQkJfQotCQkKLQkJT2JqZWN0IG1vZGVsID0gZWRpdFBhcnQuZ2V0TW9kZWwoKTsKLQkJaWYobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcigoVmlldykgbW9kZWwpOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGZvbnQgY29sb3IgZm9yIHRoZSBnaXZlbiB2aWV3LiBUaGUgY29sb3IgaXMgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSAoc3VwcHJlc3Npb24sIHJlYWQtb25seS4uLikKLQkgKiBvZiB0aGUgc2VtYW50aWMgbW9kZWwgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlldwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xvciBnZXRGb250Q29sb3IoVmlldyB2aWV3KSB7Ci0vLwkJaWYgKEJyaWRnZUhlbHBlci5pc1N1cHByZXNzZWQodmlldykpIHsKLS8vCQkJcmV0dXJuIERpYWdyYW1Db25zdGFudHMuU1VQUFJFU1NFRF9GT05UX0NPTE9SOwotLy8JCX0KLQkJaWYgKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSB7Ci0JCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUjsKLQkJfQotLy8JCWVsc2UgewotLy8JCQlyZXR1cm4gRGlhZ3JhbUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfQ09MT1I7Ci0vLwkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRWRpdFBhcnQgZ2V0RGlhZ3JhbUVkaXRQYXJ0KEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCWZvcig7ZWRpdFBhcnQgIT0gbnVsbCAmJiAhKGVkaXRQYXJ0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRQYXJ0KTsgZWRpdFBhcnQgPSBlZGl0UGFydC5nZXRQYXJlbnQoKSk7Ci0JCXJldHVybiAoRGlhZ3JhbUVkaXRQYXJ0KSBlZGl0UGFydDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVhZE9ubHkoQWJzdHJhY3RFZGl0UGFydCBlZGl0UGFydCl7Ci0JCU9iamVjdCBtb2RlbCA9IGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJcmV0dXJuIEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KChWaWV3KW1vZGVsKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N5bmNCYXIoRWRpdFBhcnQgcGFydCl7Ci0JCWlmKHBhcnQgaW5zdGFuY2VvZiBJR3JhcGhpY2FsRWRpdFBhcnQpewotCQkJVmlldyBub2RlID0gKFZpZXcpcGFydC5nZXRNb2RlbCgpOwotCQkJT2JqZWN0IG9iaiA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKXsKLQkJCQlyZXR1cm4gQnJpZGdlSGVscGVyLmlzU3luY2hCYXIoKEFjdGl2aXR5Tm9kZSlvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd3JhcChTdHJpbmcgcywgaW50IHdyYXBXaWR0aCkgewotCQlTdHJpbmcgd3JhcHBlZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUJyZWFrSXRlcmF0b3IgYmkgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCQlTdHJpbmcgcmVtYWluaW5nID0gczsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChyZW1haW5pbmcubGVuZ3RoKCkgPD0gd3JhcFdpZHRoKSB7Ci0JCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCWJpLnNldFRleHQocmVtYWluaW5nKTsKLQkJCQlpbnQgcG9zID0gYmkuZm9sbG93aW5nKHdyYXBXaWR0aCk7Ci0JCQkJaWYgKHBvcyA9PSBCcmVha0l0ZXJhdG9yLkRPTkUpIHsKLQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmc7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChwb3MgPj0gcmVtYWluaW5nLmxlbmd0aCgpKSB7Ci0JCQkJCQl3cmFwcGVkICs9IHJlbWFpbmluZzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJd3JhcHBlZCArPSByZW1haW5pbmcuc3Vic3RyaW5nKDAsIHBvcykgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlyZW1haW5pbmcgPSByZW1haW5pbmcuc3Vic3RyaW5nKHBvcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdyYXBwZWQ7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCBmb250IGZvciB0aGlzIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogQHBhcmFtIHN0b3JlIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdExpbmVTdHlsZShJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKXsKLSAgICAgICAgUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KAotICAgICAgICAgICAgc3RvcmUsCi0gICAgICAgICAgICBJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0xJTkVfQ09MT1IsCi0gICAgICAgICAgICBQcmVmZXJlbmNlQ29udmVydGVyLkNPTE9SX0RFRkFVTFRfREVGQVVMVCk7CQotCX0KLQkKLQkvKioKLQkgKiBIaWRlIGRlZmF1bHQgY29ubmVjdGlvbiBoYW5kbGVzIGluIEFELCBBREQsIFdQREQuCi0JICogCi0JICogQHBhcmFtIHN0b3JlCi0JICogICAgICAgICAgICBJUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhpZGVDb25uZWN0aW9uSGFuZGxlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0NPTk5FQ1RJT05fSEFORExFUywKLQkJCQlmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0ZXh0IGhlaWdodCBiYXNlZCBvbiB0ZXh0LCBmb250IGFuZCB3aWR0aCBvZiBib3VuZHJpZXMgdGV4dCBpcyBpbgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGZvbnRTdHlsZQotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUZXh0SGVpZ2h0KFN0cmluZyB0ZXh0LCBGb250U3R5bGUgZm9udFN0eWxlLCBpbnQgd2lkdGgpIHsKLQkJRm9udCBmb250ID0gbnVsbDsKLQkJU3RyaW5nIGZvbnROYW1lID0gbnVsbDsKLQkJaW50IGZvbnRIZWlnaHQgPSAwOwotCQkKLQkJaWYgKGZvbnRTdHlsZSAhPSBudWxsKSB7Ci0JCQlmb250TmFtZSA9IGZvbnRTdHlsZS5nZXRGb250TmFtZSgpOwotCQkJZm9udEhlaWdodCA9IGZvbnRTdHlsZS5nZXRGb250SGVpZ2h0KCk7Ci0JCQlpZiAoZm9udE5hbWUgPT0gbnVsbCkKLQkJCQlmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoKTsKLQkJCWlmIChmb250SGVpZ2h0ID09IDApCi0JCQkJZm9udEhlaWdodCA9IERpYWdyYW1Db25zdGFudHMuREVGQVVMVF9GT05UX1NJWkU7Ci0JCQkKLQkJCWZvbnQgPSBuZXcgRm9udChudWxsLCBmb250TmFtZSwgZm9udEhlaWdodCwgamF2YS5hd3QuRm9udC5QTEFJTik7Ci0JCX0KLQkJZWxzZSAKLQkJCWZvbnQgPSBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQotCQlEaW1lbnNpb24gZDsKLQkJdHJ5IHsKLQkJCWQgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0VGV4dEV4dGVudHModGV4dCwgZm9udCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihmb250ICE9IG51bGwgJiYgZm9udCAhPSBEaWFncmFtQ29uc3RhbnRzLkRFRkFVTFRfRk9OVCkgewotCQkJCWZvbnQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJaW50IG5vT2ZMaW5lcyA9IDA7Ci0JCWlmIChkICE9IG51bGwgJiYgZC53aWR0aCA+IDApIHsKLQkJCWludCBkaXYgPSBkLndpZHRoIC8gd2lkdGg7Ci0JCQlpbnQgbW9kID0gZC53aWR0aCAlIHdpZHRoOwotCQkJaWYgKG1vZCAhPSAwKQotCQkJCWRpdisrOwotCQkJbm9PZkxpbmVzID0gZGl2OwotCQkJcmV0dXJuIG5vT2ZMaW5lcyAqIGZvbnRIZWlnaHQ7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaW1lbnNpb24gZ2V0VGV4dFNpemVJbldyYXBMYWJlbChTdHJpbmcgdGV4dCwgRm9udCBmLCBpbnQgd0hpbnQsIGludCBoSGludCwgSU1hcE1vZGUgbWFwTW9kZSkgewotCQljbGFzcyBNeVdyYXBMYWJlbCBleHRlbmRzIFdpZGVuZWRXcmFwTGFiZWwgaW1wbGVtZW50cyBJTWFwTW9kZSB7Ci0JCQlwcml2YXRlIElNYXBNb2RlIG1hcE1vZGU7Ci0KLQkJCXB1YmxpYyBNeVdyYXBMYWJlbChJTWFwTW9kZSBtYXBNb2RlKSB7Ci0JCQkJdGhpcy5tYXBNb2RlID0gbWFwTW9kZSAhPSBudWxsID8gbWFwTW9kZSA6IE1hcE1vZGVUeXBlcy5JREVOVElUWV9NTTsKLQkJCX0KLQotCQkJcHVibGljIGludCBEUHRvTFAoaW50IGRldmljZVVuaXQpIHsKLQkJCQlyZXR1cm4gbWFwTW9kZS5EUHRvTFAoZGV2aWNlVW5pdCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBUcmFuc2xhdGFibGUgRFB0b0xQKFRyYW5zbGF0YWJsZSB0KSB7Ci0JCQkJcmV0dXJuIG1hcE1vZGUuRFB0b0xQKHQpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IExQdG9EUChpbnQgbG9naWNhbFVuaXQpIHsKLQkJCQlyZXR1cm4gbWFwTW9kZS5MUHRvRFAobG9naWNhbFVuaXQpOwotCQkJfQotCi0JCQlwdWJsaWMgVHJhbnNsYXRhYmxlIExQdG9EUChUcmFuc2xhdGFibGUgdCkgewotCQkJCXJldHVybiBtYXBNb2RlLkxQdG9EUCh0KTsKLQkJCX0KLQkJCQotCQl9OwotCQlNeVdyYXBMYWJlbCBsYWJlbCA9IG5ldyBNeVdyYXBMYWJlbChtYXBNb2RlKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLnNldExhYmVsUHJvcGVydGllcyhsYWJlbCk7CQkKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJaWYoZiAhPSBudWxsKSB7Ci0JCQlsYWJlbC5zZXRGb250KGYpOwotCQl9Ci0JCXJldHVybiBsYWJlbC5nZXRUZXh0U2l6ZSh3SGludCwgaEhpbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbG9yIGdldExpbmtPdmVycmlkZUNvbG9yKEVkZ2UgZWRnZSkgewotCQlyZXR1cm4gIUxpYnJhcnlVdGlsLlBVQkxJU0hfTU9ERSAmJiBEaWFncmFtQ29yZVZhbGlkYXRpb24uaXNSZWFkT25seShlZGdlKT8gCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5SRUFEX09OTFlfRk9OVF9DT0xPUiA6IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVmFsaWRhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vY29yZS91dGlsL0RpYWdyYW1Db3JlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdhZThlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9EaWFncmFtQ29yZVZhbGlkYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5sb2NhbHN0b3JlLklzU3luY2hyb25pemVkVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5GaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci0KLS8qKgotICogVmFsaWRhdGluZyByb3V0aW5lcyBmb3IgZGlhZ3JhbSBlZGl0aW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db3JlVmFsaWRhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZXJyTXNnX0Nhbk5vdENvbm5lY3QgPSBEaWFncmFtQ29yZVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2Nvbm5lY3RfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2MgPSBEaWFncmFtQ29yZVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfc2FtZXByZWRhbmRzdWNfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVyck1zZ19DYW5Ob3REZWxldGUgPSBEaWFncmFtQ29yZVJlc291cmNlcy5EaWFncmFtVmFsaWRhdGlvbl9lcnJfY2Fubm90X2RlbGV0ZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpc1RhcmdldFJlYWRvbmx5KEVkaXRQYXJ0IHBhcnQpewotCQlWaWV3IHZpZXcgPSAoVmlldylwYXJ0LmdldE1vZGVsKCk7Ci0JCWlmKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5Db25uZWN0KEVkaXRQYXJ0IHRhcmdldEVkaXRQYXJ0LCBFT2JqZWN0IHNvdXJjZUVsZW1lbnQsIEVPYmplY3QgdGFyZ2V0RWxlbWVudCl7Ci0JCQotCQlpZih0YXJnZXRFZGl0UGFydCA9PSBudWxsKSByZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQotCQlFZGl0UGFydCBwYXJ0ID0gdGFyZ2V0RWRpdFBhcnQuZ2V0UGFyZW50KCk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCXdoaWxlKHBhcnQgIT0gbnVsbCAmJiAhKHBhcnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpKXsKLQkJCQlwYXJ0ICA9IHBhcnQuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJaWYocGFydCBpbnN0YW5jZW9mIERpYWdyYW1FZGl0UGFydCl7Ci0JCQlkaWFncmFtID0gKERpYWdyYW0pKChEaWFncmFtRWRpdFBhcnQpcGFydCkuZ2V0TW9kZWwoKTsKLQkJfQotCi0JCWlmKGRpYWdyYW0gPT0gbnVsbCkgcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQlyZXR1cm4gY2hlY2tDb25uZWN0KGRpYWdyYW0sICBzb3VyY2VFbGVtZW50LCB0YXJnZXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25uZWN0KERpYWdyYW0gZGlhZ3JhbSwgRU9iamVjdCBzb3VyY2VFbGVtZW50LCBFT2JqZWN0IHRhcmdldEVsZW1lbnQpewotCQlzd2l0Y2goRGlhZ3JhbUhlbHBlci5nZXREaWFncmFtVHlwZShkaWFncmFtKSl7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlpZihhbHdheXNBbGxvd2VkKHNvdXJjZUVsZW1lbnQsIHRhcmdldEVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIElmIHRhcmdldCBEaWFncmFtIGlzIHJlYWQtb25seSAtIGRvIG5vdCBjb25uZWN0Ci0JCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShkaWFncmFtKSkgcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQotCQkJTm9kZUFkYXB0ZXIgc291cmNlQWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihzb3VyY2VFbGVtZW50KTsKLQkJCU5vZGVBZGFwdGVyIHRhcmdldEFkYXB0ZXIgPSBCcmlkZ2VIZWxwZXIuZ2V0Tm9kZUFkYXB0ZXIodGFyZ2V0RWxlbWVudCk7Ci0JCQkKLQkJCS8vIGlmIGFkYXB0ZXJzIG9mIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIG51bGwgLSBubyBjb25uZWN0LgotCQkJaWYoc291cmNlQWRhcHRlciA9PSBudWxsIHx8IHRhcmdldEFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCi0JCQlEaWFncmFtIHNvdXJjZURpYWdyYW0gPSBzb3VyY2VBZGFwdGVyLmdldFZpZXcoKS5nZXREaWFncmFtKCk7Ci0JCQkKLQkJCS8vIElmIHNvdXJjZSBhbmQgdGFyZ2V0IGRpYWdyYW1zIG5vdCBlcXVhbCAtIGRvIG5vdCBjb25uZWN0LgotCQkJaWYgKCFkaWFncmFtLmVxdWFscyhzb3VyY2VEaWFncmFtKSkKLQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChCcmlkZ2VIZWxwZXIuZ2V0TWV0aG9kRWxlbWVudChzb3VyY2VEaWFncmFtKQotCQkJCQksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcHJvYyA9IG51bGw7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXByb2MgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0VG9wSXRlbSgpOwotCQkJfQotCQkJLy8gZ2V0IGFsbCBicmVha2Rvd24gZWxlbWVudHMgaW4gdGhpcyBwcm9jZXNzCi0JCQkvLwotCQkJTGlzdDxPYmplY3Q+IGFsbEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksCi0JCQkJCXByb2MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJYWxsRWxlbWVudHMuYWRkKFRuZ1V0aWwudW53cmFwKG9iaikpOwotCQkJfQotCQkJaWYocHJvYyAhPSBudWxsKXsKLQkJCQlFT2JqZWN0IHNvdXJjZSA9IHNvdXJjZUFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCi0JCQkJRU9iamVjdCB0YXJnZXQgPSBudWxsOwotCQkJCWlmICh0YXJnZXRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJdGFyZ2V0ID0gdGFyZ2V0QWRhcHRlci5nZXRFbGVtZW50KCk7Ci0JCQkJfQotCQkJCWlmIChzb3VyY2UgaW5zdGFuY2VvZiAKLQkJCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0LAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHNvdXJjZSwgYWxsRWxlbWVudHMpKQotCQkJCQkJCXJldHVybiBlcnJNc2dfU2FtZVByZWRBbmRTdWNjOwotCi0JCQkJCQlpZiAodGFyZ2V0QWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpCi0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7Ci0JCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0U3VjY2Vzc29yTm9kZXMoYWN0Tm9kZXMsCi0JCQkJCQkJCShBY3Rpdml0eU5vZGUpIHRhcmdldEVsZW1lbnQpOwotCQkJCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IGFjdE5vZGVzKSB7Ci0JCQkJCQkJaWYgKEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihub2RlKS5pc1RhcmdldFJlYWRPbmx5KCkpCi0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcigKLQkJCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgQnJpZGdlSGVscGVyCi0JCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KG5vZGUpLAotCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBzb3VyY2UsIGFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQlyZXR1cm4gZXJyTXNnX1NhbWVQcmVkQW5kU3VjYzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiBzcmNOb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJCQkJQnJpZGdlSGVscGVyLmdldFByZWRlY2Vzc29yTm9kZXMoc3JjTm9kZXMsCi0JCQkJCQkJCShBY3Rpdml0eU5vZGUpIHNvdXJjZUVsZW1lbnQpOwotCQkJCQkJaWYgKCFzcmNOb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlpZiAodGFyZ2V0QWRhcHRlci5pc1RhcmdldFJlYWRPbmx5KCkpCi0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSBwcmVkTm9kZSA6IHNyY05vZGVzKSB7Ci0JCQkJCQkJCU1ldGhvZEVsZW1lbnQgcHJlZCA9IEJyaWRnZUhlbHBlcgotCQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHByZWROb2RlKTsKLQkJCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoCi0JCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQsCi0JCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkLAotCQkJCQkJCQkJCWFsbEVsZW1lbnRzKSkgewotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcCgoQWN0aXZpdHlOb2RlKXNvdXJjZUVsZW1lbnQsCi0JCQkJCQkJCShBY3Rpdml0eU5vZGUpIHRhcmdldEVsZW1lbnQpICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdENvbm5lY3Q7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHNob3VsZCBub3QgYWxsb3cgaW5jb21pbmcgY29ubmVjdGlvbiB0byBzdGFydCBub2RlCi0JCQkJCQkvLyBhbmQgRnJlZVRleHQuCi0JCQkJCQlpZiAodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIEluaXRpYWxOb2RlKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJfQotCi0JCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gc3JjTm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsgCi0JCQkJCQlCcmlkZ2VIZWxwZXIuZ2V0UHJlZGVjZXNzb3JOb2RlcyhzcmNOb2RlcywgKEFjdGl2aXR5Tm9kZSkgc291cmNlRWxlbWVudCk7Ci0JCQkJCQlpZiAoIXNyY05vZGVzLmlzRW1wdHkoKSkgewotCQkJCQkJCUNvbGxlY3Rpb248QWN0aXZpdHlOb2RlPiB0YXJnZXROb2RlcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHlOb2RlPigpOwotCQkJCQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2Rlcyh0YXJnZXROb2RlcywKLQkJCQkJCQkJCShBY3Rpdml0eU5vZGUpIHRhcmdldCk7Ci0JCQkJCQkJZm9yIChBY3Rpdml0eU5vZGUgbm9kZSA6IHRhcmdldE5vZGVzKSB7Ci0JCQkJCQkJCU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJCQkJLmdldE5vZGVBZGFwdGVyKG5vZGUpOwotCQkJCQkJCQlpZiAobm9kZUFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKQotCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBzdWNjID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlQWRhcHRlcgotCQkJCQkJCQkJCS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCWZvciAoQWN0aXZpdHlOb2RlIHByZWRub2RlIDogc3JjTm9kZXMpIHsKLQkJCQkJCQkJCU5vZGVBZGFwdGVyIHByZWRBZGFwdGVyID0gQnJpZGdlSGVscGVyCi0JCQkJCQkJCQkJCS5nZXROb2RlQWRhcHRlcihwcmVkbm9kZSk7Ci0JCQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBwcmVkQWRhcHRlcgotCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQ2lyY3VsYXIoc3VjYywgcHJlZCwKLQkJCQkJCQkJCQkJYWxsRWxlbWVudHMpKSB7Ci0JCQkJCQkJCQkJcmV0dXJuIGVyck1zZ19TYW1lUHJlZEFuZFN1Y2M7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBUbyBhdm9pZCBjaXJjdWxhciBsb29waW5nIGJldHdlZW4gc3luY2hyb25pemF0aW9uIGJhcnMuIElmIFN5Y25CYXIxIC0+Ci0JICogU3luY0JhcjIgKGNvbm5lY3RlZCkgdGhlbiBTeW5jQmFyMiAtPiBTeW5jQmFyMSBjYW5ub3QgY29ubmVjdC4gaWYKLQkgKiBzeW5jYmFyMSAtPiBzeW5jYmFyMi0+c3luY2JhcjMgdGhlbiBzeW5jYmFyMyAtPiBzeW5jYmFyMSBkaXNhbGxvd2VkLgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3luY0JhckNpcmN1bGFyTG9vb3AoQWN0aXZpdHlOb2RlIHNOb2RlLAotCQkJQWN0aXZpdHlOb2RlIHROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IHROb2RlLmdldE91dGdvaW5ncygpOwotCQlpZiAoIWxpc3QuaXNFbXB0eSgpICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUFjdGl2aXR5RWRnZSBsaW5rID0gKEFjdGl2aXR5RWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUFjdGl2aXR5Tm9kZSB0eXBlZG5vZGUgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmIChzTm9kZS5lcXVhbHModHlwZWRub2RlKSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQkJCWlmICh0eXBlZG5vZGUgaW5zdGFuY2VvZiBDb250cm9sTm9kZSkgewotCQkJCQlyZXR1cm4gY2hlY2tTeW5jQmFyQ2lyY3VsYXJMb29vcChzTm9kZSwKLQkJCQkJCQkoQ29udHJvbE5vZGUpdHlwZWRub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qCi0JICogTWV0aG9kIHRvIENoZWNrIGlmIFN5bmNCYXIgaW5Db21taW5nIGNvbm5lY3Rpb25zIGhhdmUgCi0JICogYW55IHNvdXJjZSBpcyBhIHJlYWRvbmx5LiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFySW5jb21pbmdMaW5rcyhBY3Rpdml0eU5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCUFjdGl2aXR5Tm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcihzb3VyY2UpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWlmKGFkYXB0ZXIuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpewotCQkJCQlpZihhZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX1lbHNlIGlmKHNvdXJjZSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKXsKLQkJCQkJaWYoc291cmNlIGluc3RhbmNlb2YgRm9ya05vZGUgfHwgc291cmNlIGluc3RhbmNlb2YgSm9pbk5vZGUpCi0JCQkJCQlpZihjaGVja1N5bmNCYXJJbmNvbWluZ0xpbmtzKHNvdXJjZSkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoKLQkgKk1ldGhvZCB0byBjaGVjayBpZiBzeW5jaHJvbml6YXRpb24gYmFyIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKmhhcyBhbnkgdGFyZ2V0IGlzIHJlYWRvbmx5LiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tTeW5jQmFyT3V0Z29pbmdMaW5rcyhBY3Rpdml0eU5vZGUgdHlwZWROb2RlKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5ncygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQWN0aXZpdHlFZGdlIGxpbmsgPSAoQWN0aXZpdHlFZGdlKSBpdGVyLm5leHQoKTsKLQkJCUFjdGl2aXR5Tm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih0YXJnZXQpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWlmKGFkYXB0ZXIuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpewotCQkJCQlpZihhZGFwdGVyLmlzVGFyZ2V0UmVhZE9ubHkoKSkKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX1lbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKXsKLQkJCQkJaWYodGFyZ2V0IGluc3RhbmNlb2YgRm9ya05vZGUgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSm9pbk5vZGUpCi0JCQkJCQlpZihjaGVja1N5bmNCYXJPdXRnb2luZ0xpbmtzKHRhcmdldCkhPSBudWxsKQotCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tEZWxldGUoTm9kZSBub2RlKSB7Ci0JCWlmIChCcmlkZ2VIZWxwZXIuaXNSZWFkT25seShub2RlKSkKLQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQlEaWFncmFtIGRpYWdyYW0gPSBub2RlLmdldERpYWdyYW0oKTsKLQkJaWYgKGRpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURpYWdyYW0pIHsKLQkJCWlmIChub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIENvbnRyb2xOb2RlKSB7Ci0JCQkJCi0JCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IHRhcmdldE5vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7IAotCQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2Rlcyh0YXJnZXROb2RlcywgKEFjdGl2aXR5Tm9kZSlub2RlLmdldEVsZW1lbnQoKSk7Ci0JCQkJCQkKLQkJCQlmb3IgKEFjdGl2aXR5Tm9kZSB0YXJnZXROb2RlIDogdGFyZ2V0Tm9kZXMpIHsKLQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlci5nZXROb2RlQWRhcHRlcih0YXJnZXROb2RlKTsKLQkJCQkJaWYoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIuaXNUYXJnZXRSZWFkT25seSgpKXsKLQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90RGVsZXRlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGRpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWlmIChub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUmVjb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgRWRnZSBsaW5rKSB7Ci0JCWlmIChzb3VyY2UuZ2V0RGlhZ3JhbSgpIGluc3RhbmNlb2YgQWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJCQkJQ29sbGVjdGlvbiB0YXJnZXROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJLmdldFRhcmdldE5vZGVzKChUeXBlZE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCksCi0JCQkJCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmNsYXNzKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhcmdldE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYgKEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KG5vZGUpKSB7Ci0JCQkJCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tDb25uZWN0KHNvdXJjZSwgdGFyZ2V0LCBsaW5rKTsKLQl9Ci0JCi0JLyoKLQkgKiBNZXRob2Qgd2lsbCBub3QgYWxsb3cgbXVsdGlwbGUgbGluayBiZXR3ZWVuIHR3byBub2Rlcy4gTmVlZHMgdG8gY2FsbAotCSAqIENyZWFrTGlua0NvbW1hbmQgYW5kIFJlY29ubmVjdExpbmtDb21tYW5kLiBBbnkgYWN0aW9uIG9uIGEgTGluayBzaG91bGQKLQkgKiBjYWxsIHRoaXMgY2hlY2tDb25uZWN0KE5vZGUgc291cmNlLCBOb2RlIHRhcmdldCwgTGluayBsaW5rKSBiZWZvcmUgYWxsb3cKLQkgKiB0byBjb25uZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQ29ubmVjdChOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQsIEVkZ2UgbGluaykgewotCi0JCWlmIChzb3VyY2UgPT0gdGFyZ2V0ICYmICEoQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoc291cmNlKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3RDb25uZWN0OwotCQl9Ci0KLQkJTGlzdCBsaW5rcyA9IHNvdXJjZS5nZXRUYXJnZXRFZGdlcygpOwotCQlpZiAobGlua3MgIT0gbnVsbCkgewotCQkJLy8gVGhpcyBpcyBuZWVkIGZvciByZWNvbm5lY3QgdG8gc2FtZSB0YXJnZXQgbm9kZS4KLQkJCWlmIChsaW5rcy5jb250YWlucyhsaW5rKSkgewotCQkJCWlmIChsaW5rLmdldFRhcmdldCgpLmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJLy8gVGhpcyBpcyBuZWVkIGZvciBuZXcgY29ubmVjdCBhbmQgcmVjb25uZWN0IHRvIGRpZmZlcmVudCB0YXJnZXQgbm9kZS4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlua3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmt4ID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGxpbmt4dGFyZ2V0ID0gbGlua3guZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAobGlua3h0YXJnZXQgIT0gbnVsbCAmJiBsaW5reHRhcmdldC5lcXVhbHModGFyZ2V0KSkgewotCQkJCXJldHVybiBlcnJNc2dfQ2FuTm90Q29ubmVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ29ubmVjdChzb3VyY2UuZ2V0RGlhZ3JhbSgpLCBzb3VyY2UuZ2V0RWxlbWVudCgpLCB0YXJnZXQuZ2V0RWxlbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbHdheXNBbGxvd2VkKE9iamVjdCBzb3VyY2VFbGVtZW50LCBPYmplY3QgdGFyZ2V0RWxlbWVudCkgewotCQlyZXR1cm4gc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEluaXRpYWxOb2RlIAotCQl8fCB0YXJnZXRFbGVtZW50IGluc3RhbmNlb2YgRmluYWxOb2RlCi0JCXx8IChzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgQ29udHJvbE5vZGUgJiYgIUJyaWRnZUhlbHBlci5pc1N5bmNoQmFyKChDb250cm9sTm9kZSlzb3VyY2VFbGVtZW50KSkKLQkJfHwgKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBDb250cm9sTm9kZSAmJiAhQnJpZGdlSGVscGVyLmlzU3luY2hCYXIoKENvbnRyb2xOb2RlKXRhcmdldEVsZW1lbnQpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tEZWxldGUoRWRnZSBlZGdlKSB7Ci0KLQkJVmlldyBzb3VyY2UgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldCA9IGVkZ2UuZ2V0VGFyZ2V0KCk7Ci0KLQkJaWYodGFyZ2V0ICE9IG51bGwpewotCQkJRGlhZ3JhbSBkaWFncmFtID0gdGFyZ2V0LmdldERpYWdyYW0oKTsKLQkJCXN3aXRjaChEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKXsKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06CQkJCQotCQkJCUVPYmplY3Qgc291cmNlRWxlbWVudCA9IHNvdXJjZS5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0LmdldEVsZW1lbnQoKTsKLQkJCQlpZihhbHdheXNBbGxvd2VkKHNvdXJjZUVsZW1lbnQsIHRhcmdldEVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkvLyBjaGVjayBpZiB0aGlzIGVkZ2UgaXMgcmVwcmVzZW50aW5nIGFueSB3b3JrIG9yZGVyCi0JCQkJLy8KLQkJCQlpZiAoc291cmNlRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZQotCQkJCQkJJiYgQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoc291cmNlRWxlbWVudCkgPT0gbnVsbCkgewotCQkJCQlDb2xsZWN0aW9uPEFjdGl2aXR5Tm9kZT4gYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5Tm9kZT4oKTsKLQkJCQkJQnJpZGdlSGVscGVyLmdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLAotCQkJCQkJCShBY3Rpdml0eU5vZGUpIHNvdXJjZUVsZW1lbnQsCi0JCQkJCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCQkJCQlpZiAoYWN0Tm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyB0aGUgZWRnZSBkb2VzIHJlcHJlc2VudCBhIHdvcmsgb3JkZXIKLQkJCQkKLQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNSZWFkT25seSh0YXJnZXQpKXsKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHRhcmdldEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpewotCQkJCQkvLyB0YXJnZXQgZG9lcyBub3QgcmVwcmVzZW50IGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCQkJCQkvLyBkaXNhbGxvdyBkZWxldGlvbiBvZiB0aGUgZWRnZSBpZiBvbmUgb2YgdGhlIHRhcmdldCBub2RlcyBvZiB0aGUgdGFyZ2V0IGlzIHJlYWQtb25seSBvciBpbmhlcml0ZWQKLQkJCQkJLy8KLQkJCQkJQ29sbGVjdGlvbjxBY3Rpdml0eU5vZGU+IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdDxBY3Rpdml0eU5vZGU+KCk7Ci0JCQkJCUJyaWRnZUhlbHBlci5nZXRTdWNjZXNzb3JOb2RlcyhhY3ROb2RlcywgKEFjdGl2aXR5Tm9kZSkgdGFyZ2V0RWxlbWVudCk7Ci0JCQkJCWZvciAoQWN0aXZpdHlOb2RlIGFjdGl2aXR5Tm9kZSA6IGFjdE5vZGVzKSB7Ci0JCQkJCQlWaWV3IHZpZXcgPSBCcmlkZ2VIZWxwZXIuZ2V0VmlldyhkaWFncmFtLCBhY3Rpdml0eU5vZGUpOwotCQkJCQkJaWYodmlldyAhPSBudWxsICYmIEJyaWRnZUhlbHBlci5pc1JlYWRPbmx5KHZpZXcpKSB7Ci0JCQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSAmJiBCcmlkZ2VIZWxwZXIuaXNTeW5jaEJhcigoQWN0aXZpdHlOb2RlKXRhcmdldEVsZW1lbnQpKXsKLQkJCQkJcmV0dXJuIGNoZWNrU3luY0Jhck91dGdvaW5nTGlua3MoKEFjdGl2aXR5Tm9kZSl0YXJnZXRFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCQlyZXR1cm4gZXJyTXNnX0Nhbk5vdERlbGV0ZTsKLQkJCQkKLQkJCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQkJaWYoQnJpZGdlSGVscGVyLmlzUmVhZE9ubHkodGFyZ2V0KSkKLQkJCQkJcmV0dXJuIGVyck1zZ19DYW5Ob3REZWxldGU7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBsaW5rIGlzIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVkZ2UgZWRnZSkgewotCQkKLQkJVmlldyB0YXJnZXQgPSBlZGdlLmdldFRhcmdldCgpOwotCQlWaWV3IHNvdXJjZSA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbAotCQkJCSYmIHRhcmdldC5nZXREaWFncmFtKCkuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlpZihzb3VyY2UgIT0gbnVsbCl7Ci0JCQkJT2JqZWN0IHNvdXJjZUVsZW1lbnQgPSBzb3VyY2UuZ2V0RWxlbWVudCgpOwotCQkJCWlmKHNvdXJjZUVsZW1lbnQgIT0gbnVsbCAmJiBzb3VyY2VFbGVtZW50IGluc3RhbmNlb2YgVGFza05vZGUKLQkJCQkJCSYmICgoVGFza05vZGUpc291cmNlRWxlbWVudCkuaXNSZWFkT25seSgpKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYodGFyZ2V0ICE9IG51bGwpewotCQkJCU9iamVjdCB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0LmdldEVsZW1lbnQoKTsKLQkJCQlpZih0YXJnZXRFbGVtZW50ICE9IG51bGwgJiYgdGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIFRhc2tOb2RlCi0JCQkJCQkmJiAoKFRhc2tOb2RlKXRhcmdldEVsZW1lbnQpLmlzUmVhZE9ubHkoKSl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfWVsc2V7Ci0JCQlyZXR1cm4gY2hlY2tEZWxldGUoZWRnZSkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrIGlmIGFueSBkdXBsaWNhdGUgbGlua3MgYmV0d2VlbiB0d28gZW5kcyBhbHJlYWR5IGV4aXN0cy4KLQkgKiAJIAotCSAqICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRHVwbGljYXRlUmVsYXRpb25zaGlwKEVPYmplY3Qgc291cmNlLCBFT2JqZWN0IHRhcmdldCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHNvdXJjZS5lQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgYWN0aXZpdHkgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIGNvbnRhaW5lcjsKLQkJCUxpc3Q8QWN0aXZpdHlFZGdlPiBsaXN0ID0gYWN0aXZpdHkuZ2V0RWRnZXMoKTsKLQkJCWZvciAoSXRlcmF0b3I8QWN0aXZpdHlFZGdlPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlBY3Rpdml0eUVkZ2UgZWxlbWVudCA9IChBY3Rpdml0eUVkZ2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmICgoZWxlbWVudC5nZXRTb3VyY2UoKSA9PSBzb3VyY2UpCi0JCQkJCQkmJiBlbGVtZW50LmdldFRhcmdldCgpID09IHRhcmdldCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9jb3JlL3V0aWwvVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2NhYzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL2NvcmUvdXRpbC9WYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLkRpYWdyYW1Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuQ2VsbEVkaXRvckxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS50b29scy5UZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5Tm9kZTsKLQotLyoqCi0gKiBNYW5hZ2VzIGFuZCB2YWxpZGF0ZXMgdGhlIGRpcmVjdCBlZGl0aW5nIG9mIGVkaXRwYXJ0LiBQcm9tcHRzIGFjY29yZGluZ2x5LiAgCi0gKiBTaG91bGQgaW1wbGVtZW50IGFic3RyYWN0IG1ldGhvZHMgd2hlbiBleHRlbmRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlciBleHRlbmRzIFRleHREaXJlY3RFZGl0TWFuYWdlciB7Ci0KLQlwdWJsaWMgVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcihHcmFwaGljYWxFZGl0UGFydCBzb3VyY2UsIENsYXNzIGVkaXRvclR5cGUsIENlbGxFZGl0b3JMb2NhdG9yIGxvY2F0b3IpIHsKLQkJc3VwZXIoc291cmNlLCBlZGl0b3JUeXBlLCBsb2NhdG9yKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjY29tbWl0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21taXQoKSB7Ci0JCVN0cmluZyBtc2cgPSB2YWxpZGF0ZSgoU3RyaW5nKSBnZXRDZWxsRWRpdG9yKCkuZ2V0VmFsdWUoKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJYnJpbmdEb3duKGZhbHNlKTsKLQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJbmV3IFByb21wdEVkaXQodGhpcywgbXNnKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuY29tbWl0KCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyI2JyaW5nRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJpbmdEb3duKCkgewotCQlicmluZ0Rvd24odHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXIjYnJpbmdEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBicmluZ0Rvd24oYm9vbGVhbiBjaGVjaykgewotCQlzdXBlci5icmluZ0Rvd24oKTsKLQkJaWYgKGNoZWNrKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0RWRpdFBhcnQoKS5nZXRNb2RlbCgpOwotCQkJRU9iamVjdCBhTm9kZSA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQkJaWYgKGFOb2RlIGluc3RhbmNlb2YgQWN0aXZpdHlOb2RlKSB7Ci0JCQkJbmFtZSA9ICgoQWN0aXZpdHlOb2RlKWFOb2RlKS5nZXROYW1lKCk7Ci0JCQkJT2JqZWN0IHdiZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KWFOb2RlKTsKLQkJCQlpZiAod2JlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmIFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQluYW1lID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX1lbHNlIGlmKGFOb2RlIGluc3RhbmNlb2YgTmFtZWROb2RlKXsKLQkJCQlOYW1lZE5vZGUgbmFtZU5vZGUgPSAoTmFtZWROb2RlKSBhTm9kZTsKLQkJCQluYW1lID0gbmFtZU5vZGUuZ2V0TmFtZSgpOwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCU9iamVjdCB3YmVsZW1lbnQgPSBuYW1lTm9kZS5nZXRPYmplY3QoKTsKLQkJCQkJaWYgKHdiZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgd2JlbGVtZW50KSkgewotCQkJCQkJbmFtZSA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSB3YmVsZW1lbnQpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYygKLQkJCQkJCW5ldyBQcm9tcHRFZGl0KHRoaXMsRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZXJyX25hbWVfZW1wdHkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgUHJvbXB0RWRpdCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotCQlwcml2YXRlIFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCQlwcml2YXRlIFN0cmluZyBtc2c7Ci0KLQkJUHJvbXB0RWRpdChWYWxpZGF0aW5nVGV4dERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBtc2cpIHsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCQl0aGlzLm1zZyA9IG1zZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5SdW5uYWJsZSNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU3RyaW5nIHRpdGxlID0gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuZGlhZ3JhbV9lcnJvckRpYWxvZ190aXRsZTsKLQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBEaWFncmFtQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQlkaWFsb2cuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQltYW5hZ2VyLnBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSB0eHQKLQkgKiBAcmV0dXJuIG51bGwgaWYgdGhlIGdpdmVuIHRleHQgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyB2YWxpZGF0ZShTdHJpbmcgdHh0KTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdCgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTA5ZmRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjUzMTM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlci5EaWFncmFtRWRpdFBsdWdpbiRJbXBsZW1lbnRhdGlvbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwsCi0gb3JnLmVjbGlwc2UuZHJhdzJkCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYmQ0ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBidWlsZC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MTgganRoYW0gRXhwICQKLQotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ5Mzc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfQWN0aXZpdHlEZXRhaWxEaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfQWN0aXZpdHlEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfQWN0aXZpdHlEaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJiMGExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0FjdGl2aXR5RGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiMjYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX0RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19OYW1lZE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19OYW1lZE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDVlOWY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfTmFtZWROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfUm9sZU5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Sb2xlTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmYyMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Sb2xlTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1JvbGVUYXNrQ29tcG9zaXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfUm9sZVRhc2tDb21wb3NpdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGM2N2ZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfUm9sZVRhc2tDb21wb3NpdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19UYXNrTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1Rhc2tOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNjdmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1Rhc2tOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfVHlwZWROb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfVHlwZWROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4NzMwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1R5cGVkTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzBkNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdENvbXBvc2l0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzYjNkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWNlMTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzMGZhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlQ29udGFpbmVyX25vZGVzX1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTm9kZUNvbnRhaW5lcl9ub2Rlc19Xb3JrUHJvZHVjdE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU2ZWM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVDb250YWluZXJfbm9kZXNfV29ya1Byb2R1Y3ROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVfb3V0Z29pbmdDb25uZWN0aW9uc19MaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU5vZGVfb3V0Z29pbmdDb25uZWN0aW9uc19MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5ZjNhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVOb2RlX291dGdvaW5nQ29ubmVjdGlvbnNfTGluay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRjNzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURldGFpbERpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTU5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWN0aXZpdHlEaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOGFmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZjQwOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L0xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVkTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZU5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE3NTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVRhc2tDb21wb3NpdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVUYXNrQ29tcG9zaXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiNTMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVRhc2tDb21wb3NpdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tOb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YjUzMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tOb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UeXBlZE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGVkTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjgyZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGVkTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBhZWRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdENvbXBvc2l0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDEwZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0Q29tcG9zaXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjOTUzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0Tm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3ROb2RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFkYWFiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3ROb2RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTk1YjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MTgganRoYW0gRXhwICQKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBFZGl0IFN1cHBvcnQKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9Ci1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGUgc2VsZWN0ZWQgezJ9LgotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgc2libGluZyBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsyfSwgdW5kZXIgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZWlyIHBhcmVudC4KLQotX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiA9IFRoZSB7MH0gb2YgdGhlIHsxfQotCi1fVUlfRGlhZ3JhbV90eXBlID0gRGlhZ3JhbQotX1VJX0xpbmtfdHlwZSA9IExpbmsKLV9VSV9MaW5rZWRPYmplY3RfdHlwZSA9IExpbmtlZCBPYmplY3QKLV9VSV9OYW1lZE5vZGVfdHlwZSA9IE5hbWVkIE5vZGUKLV9VSV9Ob2RlX3R5cGUgPSBOb2RlCi1fVUlfQWN0aXZpdHlEaWFncmFtX3R5cGUgPSBBY3Rpdml0eSBEaWFncmFtCi1fVUlfVHlwZWROb2RlX3R5cGUgPSBUeXBlZCBOb2RlCi1fVUlfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV90eXBlID0gV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotX1VJX1dvcmtQcm9kdWN0Tm9kZV90eXBlID0gV29yayBQcm9kdWN0IE5vZGUKLV9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fdHlwZSA9IEFjdGl2aXR5IERldGFpbCBEaWFncmFtCi1fVUlfTm9kZUNvbnRhaW5lcl90eXBlID0gTm9kZSBDb250YWluZXIKLV9VSV9Sb2xlTm9kZV90eXBlID0gUm9sZSBOb2RlCi1fVUlfUm9sZVRhc2tDb21wb3NpdGVfdHlwZSA9IFJvbGUgVGFzayBDb21wb3NpdGUKLV9VSV9UYXNrTm9kZV90eXBlID0gVGFzayBOb2RlCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV90eXBlID0gV29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZV90eXBlID0gV29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlCi1fVUlfV29ya1Byb2R1Y3RDb21wb3NpdGVfdHlwZSA9IFdvcmsgUHJvZHVjdCBDb21wb3NpdGUKLV9VSV9Vbmtub3duX3R5cGUgPSBPYmplY3QKLQotX1VJX1Vua25vd25fZGF0YXR5cGU9IFZhbHVlCi0KLV9VSV9MaW5rX3NvdXJjZV9mZWF0dXJlID0gU291cmNlCi1fVUlfTGlua190YXJnZXRfZmVhdHVyZSA9IFRhcmdldAotX1VJX0xpbmtfYmVuZHBvaW50c19mZWF0dXJlID0gQmVuZHBvaW50cwotX1VJX0xpbmtfc291cmNlRW5kUG9pbnRfZmVhdHVyZSA9IFNvdXJjZSBFbmQgUG9pbnQKLV9VSV9MaW5rX3RhcmdldEVuZFBvaW50X2ZlYXR1cmUgPSBUYXJnZXQgRW5kIFBvaW50Ci1fVUlfTGlua2VkT2JqZWN0X2xpbmtlZEVsZW1lbnRfZmVhdHVyZSA9IExpbmtlZCBFbGVtZW50Ci1fVUlfTGlua2VkT2JqZWN0X29iamVjdF9mZWF0dXJlID0gT2JqZWN0Ci1fVUlfTmFtZWROb2RlX25hbWVfZmVhdHVyZSA9IE5hbWUKLV9VSV9Ob2RlX2xvY2F0aW9uX2ZlYXR1cmUgPSBMb2NhdGlvbgotX1VJX05vZGVfd2lkdGhfZmVhdHVyZSA9IFdpZHRoCi1fVUlfTm9kZV9oZWlnaHRfZmVhdHVyZSA9IEhlaWdodAotX1VJX05vZGVfaW5jb21pbmdDb25uZWN0aW9uc19mZWF0dXJlID0gSW5jb21pbmcgQ29ubmVjdGlvbnMKLV9VSV9Ob2RlX291dGdvaW5nQ29ubmVjdGlvbnNfZmVhdHVyZSA9IE91dGdvaW5nIENvbm5lY3Rpb25zCi1fVUlfTm9kZV9yZWFkT25seV9mZWF0dXJlID0gUmVhZCBPbmx5Ci1fVUlfVHlwZWROb2RlX3R5cGVfZmVhdHVyZSA9IFR5cGUKLV9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZV9mZWF0dXJlID0gVHlwZQotX1VJX05vZGVDb250YWluZXJfbm9kZXNfZmVhdHVyZSA9IE5vZGVzCi1fVUlfV29ya1Byb2R1Y3RDb21wb3NpdGVfdHlwZV9mZWF0dXJlID0gVHlwZQotX1VJX1Vua25vd25fZmVhdHVyZSA9IFVuc3BlY2lmaWVkCi0KLV9VSV9MaW5rX25hbWVfZmVhdHVyZSA9IE5hbWUKLV9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fYXV0b0xheW91dF9mZWF0dXJlID0gQXV0byBMYXlvdXQKLV9VSV9UYXNrTm9kZV9pbmRleF9mZWF0dXJlID0gSW5kZXgKLV9VSV9Sb2xlVGFza0NvbXBvc2l0ZV9yb3dJbmRleF9mZWF0dXJlID0gUm93IEluZGV4CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzUwZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzoxOCBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0gICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgotICAgIDxmYWN0b3J5IAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyLk1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkiIAotICAgICAgIHN1cHBvcnRlZFR5cGVzID0gCi0gICAgICAgICAib3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIKLSAgICAgICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjNjNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW19IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXV0b0xheW91dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0byBMYXlvdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRvTGF5b3V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX2F1dG9MYXlvdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX2F1dG9MYXlvdXRfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkJPT0xFQU5fVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHlEZXRhaWxEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURldGFpbERpYWdyYW1fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEZXRhaWxEaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eURldGFpbERpYWdyYW0uY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvQWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9BY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyM2ViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9BY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIKLQlleHRlbmRzIERpYWdyYW1JdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFjdGl2aXR5RGlhZ3JhbS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9BY3Rpdml0eURpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKEFjdGl2aXR5RGlhZ3JhbSlvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlEaWFncmFtX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5RGlhZ3JhbV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0RpYWdyYW1FZGl0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9EaWFncmFtRWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ4MGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0RpYWdyYW1FZGl0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlhZ3JhbUVkaXRQbHVnaW4uamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkVNRlBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBEaWFncmFtIGVkaXQgcGx1Z2luLgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlhZ3JhbUVkaXRQbHVnaW4gZXh0ZW5kcyBFTUZQbHVnaW4gewotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERpYWdyYW1FZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IERpYWdyYW1FZGl0UGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1wbGVtZW50YXRpb24gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBpbnN0YW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRQbHVnaW4oKSB7Ci0JCXN1cGVyCi0JCSAgKG5ldyBSZXNvdXJjZUxvY2F0b3IgW10gewotCQkgICAgIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UsCi0JCSAgIH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotCQkJc3VwZXIoKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkJCS8vCi0JCQlwbHVnaW4gPSB0aGlzOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjYxMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvRGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW19IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVDb250YWluZXJJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L0RpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKERpYWdyYW0pb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0xpbmtJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL0xpbmtJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZWMyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9MaW5rSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTGlua0l0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBMaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYXJnZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJlbmRwb2ludHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFNvdXJjZUVuZFBvaW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUYXJnZXRFbmRQb2ludFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9MaW5rX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua19uYW1lX2ZlYXR1cmUiLCAiX1VJX0xpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS19fTkFNRSwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFyZ2V0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFyZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTGlua190YXJnZXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua190YXJnZXRfZmVhdHVyZSIsICJfVUlfTGlua190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LX19UQVJHRVQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSB0cnVlLAotCQkJCSBudWxsLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJlbmRwb2ludHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCZW5kcG9pbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTGlua19iZW5kcG9pbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0xpbmtfYmVuZHBvaW50c19mZWF0dXJlIiwgIl9VSV9MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktfX0JFTkRQT0lOVFMsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNvdXJjZSBFbmQgUG9pbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTb3VyY2VFbmRQb2ludFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX0xpbmtfc291cmNlRW5kUG9pbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua19zb3VyY2VFbmRQb2ludF9mZWF0dXJlIiwgIl9VSV9MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRhcmdldCBFbmQgUG9pbnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXJnZXRFbmRQb2ludFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX0xpbmtfdGFyZ2V0RW5kUG9pbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTGlua190YXJnZXRFbmRQb2ludF9mZWF0dXJlIiwgIl9VSV9MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIExpbmsuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTGluayIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChMaW5rKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX0xpbmtfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfTGlua190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTGluay5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTGlua2VkT2JqZWN0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9MaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRlYzgyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9MaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBMaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua2VkT2JqZWN0SXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpbmtlZE9iamVjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRMaW5rZWRFbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMaW5rZWQgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpbmtlZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9MaW5rZWRPYmplY3RfbGlua2VkRWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9MaW5rZWRPYmplY3RfbGlua2VkRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9MaW5rZWRPYmplY3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSB0cnVlLAotCQkJCSBudWxsLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfTGlua2VkT2JqZWN0X3R5cGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODNjNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1vZGVsSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5DaGFuZ2VOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuTW9kZWxBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCi0gKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KLSAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgTW9kZWxBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnksIElDaGFuZ2VOb3RpZmllciwgSURpc3Bvc2FibGUgewotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5OwotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNoYW5nZU5vdGlmaWVyIGNoYW5nZU5vdGlmaWVyID0gbmV3IENoYW5nZU5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGNoZWNrZWQgYnkge0BsaW5rICNpc0ZhY3RvcnlGb3JUeXBlIGlzRmFjdG9yeUZvclR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPE9iamVjdD4gc3VwcG9ydGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtSXRlbVByb3ZpZGVyIGRpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmIChkaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpYWdyYW1JdGVtUHJvdmlkZXIgPSBuZXcgRGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaW5rSXRlbVByb3ZpZGVyIGxpbmtJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChsaW5rSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWxpbmtJdGVtUHJvdmlkZXIgPSBuZXcgTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBsaW5rSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVkTm9kZUl0ZW1Qcm92aWRlciBuYW1lZE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZE5vZGVBZGFwdGVyKCkgewotCQlpZiAobmFtZWROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW5hbWVkTm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBOYW1lZE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbmFtZWROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlciBhY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURpYWdyYW1BZGFwdGVyKCkgewotCQlpZiAoYWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdHlEaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFR5cGVkTm9kZUl0ZW1Qcm92aWRlciB0eXBlZE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlZE5vZGVBZGFwdGVyKCkgewotCQlpZiAodHlwZWROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXR5cGVkTm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBUeXBlZE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZWROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdE5vZGVBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlciBhY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW1BZGFwdGVyKCkgewotCQlpZiAoYWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZU5vZGVJdGVtUHJvdmlkZXIgcm9sZU5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOb2RlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVOb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVOb2RlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVOb2RlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVOb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIgcm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza05vZGVJdGVtUHJvdmlkZXIgdGFza05vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tOb2RlQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tOb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tOb2RlSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tOb2RlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tOb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlciB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKCkgewotCQlpZiAod29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gcGFyZW50QWRhcHRlckZhY3RvcnkgPT0gbnVsbCA/IHRoaXMgOiBwYXJlbnRBZGFwdGVyRmFjdG9yeS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSB0aGF0IGNvbnRhaW5zIHRoaXMgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRBZGFwdGVyRmFjdG9yeShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgfHwgKCgoQ2xhc3M8Pz4pdHlwZSkuaXNJbnN0YW5jZShhZGFwdGVyKSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIGxpc3RlbmVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZW1vdmVzIGEgbGlzdGVuZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJY2hhbmdlTm90aWZpZXIucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGRlbGVnYXRlcyB0byB7QGxpbmsgI2NoYW5nZU5vdGlmaWVyfSBhbmQgdG8ge0BsaW5rICNwYXJlbnRBZGFwdGVyRmFjdG9yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQljaGFuZ2VOb3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCi0JCWlmIChwYXJlbnRBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYXJlbnRBZGFwdGVyRmFjdG9yeS5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkaXNwb3NlcyBhbGwgb2YgdGhlIGl0ZW0gcHJvdmlkZXJzIGNyZWF0ZWQgYnkgdGhpcyBmYWN0b3J5LiAKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBkaWFncmFtSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGxpbmtJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbGlua0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChuYW1lZE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgbmFtZWROb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFjdGl2aXR5RGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKSBhY3Rpdml0eURpYWdyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodHlwZWROb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHR5cGVkTm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyICE9IG51bGwpIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHdvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eURldGFpbERpYWdyYW1JdGVtUHJvdmlkZXIgIT0gbnVsbCkgYWN0aXZpdHlEZXRhaWxEaWFncmFtSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVOb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHJvbGVOb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHJvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRhc2tOb2RlSXRlbVByb3ZpZGVyICE9IG51bGwpIHRhc2tOb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgd29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHdvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL05hbWVkTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTmFtZWROb2RlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZjc2NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTmFtZWROb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZWROb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lZE5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROYW1lUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTmFtZWROb2RlX25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTmFtZWROb2RlX25hbWVfZmVhdHVyZSIsICJfVUlfTmFtZWROb2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX05PREVfX05BTUUsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE5hbWVkTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9OYW1lZE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTmFtZWROb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX05hbWVkTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9OYW1lZE5vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE5hbWVkTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQ5YjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL05vZGVDb250YWluZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOb2RlQ29udGFpbmVySXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXJ9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5vZGVDb250YWluZXJJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoTm9kZUNvbnRhaW5lcilvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfTm9kZUNvbnRhaW5lcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Ob2RlQ29udGFpbmVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChOb2RlQ29udGFpbmVyLmNsYXNzKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpYWdyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVOYW1lZE5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZU5vZGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfQ09OVEFJTkVSX19OT0RFUywKLQkJCQkgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCQkJKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX0NPTlRBSU5FUl9fTk9ERVMsCi0JCQkJIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkJCShNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVJfX05PREVTLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWEzY2U3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL05vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlSXRlbVByb3ZpZGVyCi0JZXh0ZW5kcyBMaW5rZWRPYmplY3RJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRMb2NhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkV2lkdGhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEhlaWdodFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVhZE9ubHlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExvY2F0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTG9jYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Ob2RlX2xvY2F0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX05vZGVfbG9jYXRpb25fZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19MT0NBVElPTiwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV2lkdGggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXaWR0aFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX05vZGVfd2lkdGhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV93aWR0aF9mZWF0dXJlIiwgIl9VSV9Ob2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfX1dJRFRILAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVpZ2h0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTm9kZV9oZWlnaHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV9oZWlnaHRfZmVhdHVyZSIsICJfVUlfTm9kZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19IRUlHSFQsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNvbWluZyBDb25uZWN0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluY29taW5nQ29ubmVjdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Ob2RlX2luY29taW5nQ29ubmVjdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTm9kZV9pbmNvbWluZ0Nvbm5lY3Rpb25zX2ZlYXR1cmUiLCAiX1VJX05vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSB0cnVlLAotCQkJCSBudWxsLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlYWQgT25seSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYWRPbmx5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfTm9kZV9yZWFkT25seV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Ob2RlX3JlYWRPbmx5X2ZlYXR1cmUiLCAiX1VJX05vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9fUkVBRF9PTkxZLAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuQk9PTEVBTl9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKE1vZGVsUGFja2FnZS5MaXRlcmFscy5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChOb2RlKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Ob2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX05vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJCQkoTW9kZWxQYWNrYWdlLkxpdGVyYWxzLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TLAotCQkJCSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Sb2xlTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvUm9sZU5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlNzRkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Sb2xlTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5hbWVkTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlTm9kZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlTm9kZSlvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Sb2xlTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Sb2xlTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Sb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTY4MjRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1JvbGVUYXNrQ29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVRhc2tDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb3dJbmRleFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm93IEluZGV4IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm93SW5kZXhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Sb2xlVGFza0NvbXBvc2l0ZV9yb3dJbmRleF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlVGFza0NvbXBvc2l0ZV9yb3dJbmRleF9mZWF0dXJlIiwgIl9VSV9Sb2xlVGFza0NvbXBvc2l0ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVgsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlVGFza0NvbXBvc2l0ZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlVGFza0NvbXBvc2l0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoUm9sZVRhc2tDb21wb3NpdGUpb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1JvbGVUYXNrQ29tcG9zaXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlVGFza0NvbXBvc2l0ZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UYXNrTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvVGFza05vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyNzljZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UYXNrTm9kZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTmFtZWROb2RlSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEluZGV4UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmRleCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluZGV4UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfVGFza05vZGVfaW5kZXhfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza05vZGVfaW5kZXhfZmVhdHVyZSIsICJfVUlfVGFza05vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuVEFTS19OT0RFX19JTkRFWCwKLQkJCQkgdHJ1ZSwKLQkJCQkgZmFsc2UsCi0JCQkJIGZhbHNlLAotCQkJCSBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLklOVEVHUkFMX1ZBTFVFX0lNQUdFLAotCQkJCSBudWxsLAotCQkJCSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRhc2tOb2RlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tOb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2tOb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1Rhc2tOb2RlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCWdldFN0cmluZygiX1VJX1Rhc2tOb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvVHlwZWROb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UeXBlZE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhMjI2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9UeXBlZE5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUeXBlZE5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlZE5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5vZGVJdGVtUHJvdmlkZXIKLQlpbXBsZW1lbnRzCQotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwJCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwJCi0JCUlJdGVtTGFiZWxQcm92aWRlciwJCi0JCUlJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHlwZWROb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFR5cGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMuYWRkCi0JCQkoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcgotCQkJCSgoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpYWRhcHRlckZhY3RvcnkpLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCSBnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfVHlwZWROb2RlX3R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVHlwZWROb2RlX3R5cGVfZmVhdHVyZSIsICJfVUlfVHlwZWROb2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkgTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlRZUEVEX05PREVfX1RZUEUsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUeXBlZE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVHlwZWROb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlQb2ludCBsYWJlbFZhbHVlID0gKChUeXBlZE5vZGUpb2JqZWN0KS5nZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgbGFiZWwgPSBsYWJlbFZhbHVlID09IG51bGwgPyBudWxsIDogbGFiZWxWYWx1ZS50b1N0cmluZygpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1R5cGVkTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9UeXBlZE5vZGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFR5cGVkTm9kZS5jbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1NDg3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJdGVtUHJvdmlkZXIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUzOjAzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwucHJvdmlkZXI7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTmFtZWROb2RlSXRlbVByb3ZpZGVyCi0JaW1wbGVtZW50cwkKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCQotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCQotCQlJSXRlbUxhYmVsUHJvdmlkZXIsCQotCQlJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSlvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnROb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0Q29tcG9zaXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZmQ3N2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3RDb21wb3NpdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgTm9kZUNvbnRhaW5lckl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzLmFkZAotCQkJKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IKLQkJCQkoKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkgZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJIGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0Q29tcG9zaXRlX3R5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJIGdldFN0cmluZygiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RDb21wb3NpdGVfdHlwZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFLAotCQkJCSB0cnVlLAotCQkJCSBmYWxzZSwKLQkJCQkgZmFsc2UsCi0JCQkJIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuSU5URUdSQUxfVkFMVUVfSU1BR0UsCi0JCQkJIG51bGwsCi0JCQkJIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3RDb21wb3NpdGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RDb21wb3NpdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVBvaW50IGxhYmVsVmFsdWUgPSAoKFdvcmtQcm9kdWN0Q29tcG9zaXRlKW9iamVjdCkuZ2V0TG9jYXRpb24oKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdENvbXBvc2l0ZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3RDb21wb3NpdGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFOgotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5NDViOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9wcm92aWRlci9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlcjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWV4dGVuZHMgRGlhZ3JhbUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJUG9pbnQgbGFiZWxWYWx1ZSA9ICgoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSlvYmplY3QpLmdldExvY2F0aW9uKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPwotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIERpYWdyYW1FZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNhNDQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5hbWVkTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKW9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8KLQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBEaWFncmFtRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3Byb3ZpZGVyL1dvcmtQcm9kdWN0Tm9kZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzY2OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcHJvdmlkZXIvV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3ROb2RlSXRlbVByb3ZpZGVyLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowMyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnByb3ZpZGVyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIKLQlleHRlbmRzIE5hbWVkTm9kZUl0ZW1Qcm92aWRlcgotCWltcGxlbWVudHMJCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAkKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAkKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLAkKLQkJSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVHlwZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycy5hZGQKLQkJCShjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yCi0JCQkJKCgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSlhZGFwdGVyRmFjdG9yeSkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJIGdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCSBnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkgZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCSBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX05PREVfX1RZUEUsCi0JCQkJIHRydWUsCi0JCQkJIGZhbHNlLAotCQkJCSBmYWxzZSwKLQkJCQkgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkgbnVsbCwKLQkJCQkgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrUHJvZHVjdE5vZGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3ROb2RlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0Tm9kZSlvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/Ci0JCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdE5vZGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3ROb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdE5vZGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERV9fVFlQRToKLQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gRGlhZ3JhbUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkZjE0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiY2FlMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5kcmF3MmQsCi0gb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLAotIG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJlM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWZhNGQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtb2RlbCIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGluayIgZVN1cGVyVHlwZXM9IiMvL0xpbmtlZE9iamVjdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGVUeXBlPSIjLy9Ob2RlIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL05vZGUvaW5jb21pbmdDb25uZWN0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiZW5kcG9pbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Fic29sdXRlQmVuZHBvaW50IiB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic291cmNlRW5kUG9pbnQiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldEVuZFBvaW50IiBlVHlwZT0iIy8vUG9pbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJMaW5rZWRPYmplY3QiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua2VkRWxlbWVudCIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTm9kZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MaW5rZWRPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsb2NhdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2lkdGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iLTEiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9Ii0xIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nQ29ubmVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTGluayIgZU9wcG9zaXRlPSIjLy9MaW5rL3RhcmdldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRnb2luZ0Nvbm5lY3Rpb25zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0xpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIGVPcHBvc2l0ZT0iIy8vTGluay9zb3VyY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9ubHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGlhZ3JhbSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW0iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlZE5vZGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0Tm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VJbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHlEZXRhaWxEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9MYXlvdXQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5vZGVDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im5vZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL05vZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZU5vZGUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZE5vZGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlVGFza0NvbXBvc2l0ZSIgZVN1cGVyVHlwZXM9IiMvL05vZGVDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb3dJbmRleCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrTm9kZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkTm9kZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluZGV4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FSW50IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSItMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWROb2RlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RDb21wb3NpdGUiIGVTdXBlclR5cGVzPSIjLy9Ob2RlQ29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUludCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBYnNvbHV0ZUJlbmRwb2ludCIgaW5zdGFuY2VDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBvaW50IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sZURlc2NyaXB0b3IiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIi8+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1OTdkMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC9zcmMiIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsIgotICAgIG1vZGVsTmFtZT0iRGlhZ3JhbSIgbm9uTkxTTWFya2Vycz0idHJ1ZSIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmphdmEiCi0gICAgY29tcGxpYW5jZUxldmVsPSI1LjAiIGNvcHlyaWdodEZpZWxkcz0iZmFsc2UiIHVzZWRHZW5QYWNrYWdlcz0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwjLy91bWEiPgotICA8Zm9yZWlnbk1vZGVsPkBtb2RlbDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNb2RlbCIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJkaWFncmFtLmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0iZGlhZ3JhbS5lY29yZSMvL0Fic29sdXRlQmVuZHBvaW50Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJkaWFncmFtLmVjb3JlIy8vUG9pbnQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9ImRpYWdyYW0uZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9EaWFncmFtIiBsYWJlbEZlYXR1cmU9IiMvL21vZGVsL05vZGUvbG9jYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay9iZW5kcG9pbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0xpbmsvc291cmNlRW5kUG9pbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXRFbmRQb2ludCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9MaW5rZWRPYmplY3QvbGlua2VkRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vTm9kZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL05vZGUvbG9jYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vTm9kZS93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL2hlaWdodCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL2luY29taW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Ob2RlL3JlYWRPbmx5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9BY3Rpdml0eURpYWdyYW0iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vVHlwZWROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vVHlwZWROb2RlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlL3R5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZGlhZ3JhbS5lY29yZSMvL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS9hdXRvTGF5b3V0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZGlhZ3JhbS5lY29yZSMvL05vZGVDb250YWluZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBkaWFncmFtLmVjb3JlIy8vTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vUm9sZU5vZGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vUm9sZVRhc2tDb21wb3NpdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Sb2xlVGFza0NvbXBvc2l0ZS9yb3dJbmRleCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vVGFza05vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9UYXNrTm9kZS9pbmRleCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImRpYWdyYW0uZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJkaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3RDb21wb3NpdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGRpYWdyYW0uZWNvcmUjLy9Xb3JrUHJvZHVjdENvbXBvc2l0ZS90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjMzMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERpYWdyYW0gTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNhMWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIAotICAgICAgIGNsYXNzID0gIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZGlhZ3JhbU1hbmFnZXIiPgotICAgICA8ZGlhZ3JhbU1hbmFnZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbU1hbmFnZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEZXRhaWxEaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMjQ3NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGV0YWlsRGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSBtb2RlbCBvYmplY3QKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBBY3Rpdml0eURldGFpbERpYWdyYW0gZXh0ZW5kcyBEaWFncmFtIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dG8gTGF5b3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXV0b0xheW91dChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9MYXlvdXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSNpc0F1dG9MYXlvdXQgPGVtPkF1dG8gTGF5b3V0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIExheW91dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvTGF5b3V0KGJvb2xlYW4gdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvQWN0aXZpdHlEaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMmIwMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0FjdGl2aXR5RGlhZ3JhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEaWFncmFtIGV4dGVuZHMgRGlhZ3JhbSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvRGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWNlY2ZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci0KLS8qKgotICogQmFzZSBkaWFncmFtIGludGVyZmFjZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGlhZ3JhbSBleHRlbmRzIE5vZGVDb250YWluZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgVU1BIG1vZGVsIG9iamVjdCBmb3IgdGhpcyBkaWFncmFtCi0JICogCi0JICogQHJldHVybgotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBnZXRVTUFEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGRlZmF1bHQgbmFtZSBmb3IgbmV3IG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqLwotCXZvaWQgc2V0RGVmYXVsdE5hbWUoTmFtZWROb2RlIG5ld05vZGUpOwotCi0JLyoqCi0JICogU2V0cyBhIHN1cHByZXNzaW9uIGluc3RhbmNlIGZvciB0aGlzIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc3VwcHJlc3Npb24KLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzaW9uKFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzaW9uIGluc3RhbmNlIHVzZWQgaW4gdGhpcyBkaWFncmFtCi0JICogCi0JICogQHJldHVybgotCSAqLwotCVN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIGZpbHRlciB1c2VkIHRvIHRvIGZpbHRlciBkaWFncmFtIGVsZW1lbnRzIGluIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKi8KLQl2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyBkaWFncmFtIGlzIG5ld2x5IGNyZWF0ZWQgYW5kIG5vdCBzYXZlZCB5ZXQpCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHRoZSBpc05ldyBmbGFnIG9mIHRoaXMgZGlhZ3JhbQotCSAqIAotCSAqIEBwYXJhbSBuCi0JICogQHNlZSAjaXNOZXcoKQotCSAqLwotCXZvaWQgc2V0TmV3KGJvb2xlYW4gbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW1SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9EaWFncmFtUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDUwNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL0RpYWdyYW1SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIHJlc291cmNlIGNsYXNzIG9mIGRpYWdyYW0gcGx1Z2luCi0gKiAKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEaWFncmFtUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRGlhZ3JhbVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9hY3Rpdml0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWZhdWx0QmFzZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9XUEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZV9hY3Rpdml0eURldGFpbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRGcmVlVHh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVfdW5rbm93bjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERpYWdyYW1SZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWJmNjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIG1vZGVsIG9iamVjdCBmb3IgYSBsaW5rIGJldHdlZW4gZGlhZ3JhbSBub2RlcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGluayBleHRlbmRzIExpbmtlZE9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UjZ2V0TGlua19OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2Ugbm9kZSBvZiB0aGlzIGxpbmsuCi0JICogCi0JICogQG1vZGVsCi0JICovCi0JTm9kZSBnZXRTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoTm9kZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBvZiB0aGlzIGxpbmsKLQkgKiAKLQkgKiBAbW9kZWwKLQkgKi8KLQlOb2RlIGdldFRhcmdldCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXQgPGVtPlRhcmdldDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFyZ2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXJnZXQoTm9kZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGJlbmQgcG9pbnRzIGluIHRoaXMgbGluawotCSAqIAotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQiIGxvd2VyPSIwIiB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JRUxpc3Q8QWJzb2x1dGVCZW5kcG9pbnQ+IGdldEJlbmRwb2ludHMoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGVuZCBwb2ludCBvZiB0aGlzIGxpbmsgaW4gdGhlIHNvdXJjZSBub2RlCi0JICogCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiBAcmV0dXJuCi0JICovCi0JUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZW5kIHBvaW50IG9mIHRoaXMgbGluayBpbiB0YXJnZXQgbm9kZQotCSAqIAotCSAqIEBtb2RlbCB0cmFuc2llbnQ9InRydWUiCi0JICogQHJldHVybgotCSAqLwotCVBvaW50IGdldFRhcmdldEVuZFBvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldEVuZFBvaW50IDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldEVuZFBvaW50KFBvaW50IHZhbHVlKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rZWRPYmplY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9MaW5rZWRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTkzOTI2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTGlua2VkT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIG9iamVjdHMgdGhhdCBpcyBsaW5rZWQgd2l0aCBvdGhlciBvYmplY3QgaW4gYQotICogZGlmZmVyZW5jZSBtb2RlbAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpbmtlZE9iamVjdCBleHRlbmRzIEVPYmplY3QgewotCi0JT2JqZWN0IGdldE9iamVjdCgpOwotCi0Jdm9pZCBzZXRPYmplY3QoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIEBtb2RlbAotCSAqLwotCU1ldGhvZEVsZW1lbnQgZ2V0TGlua2VkRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0I2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TGlua2VkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua2VkRWxlbWVudChNZXRob2RFbGVtZW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzhmOWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBNb2RlbEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbEZhY3RvcnlJbXBsLmluaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkxpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIExpbmsgY3JlYXRlTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBOYW1lZE5vZGUgY3JlYXRlTmFtZWROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEFjdGl2aXR5RGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgVHlwZWROb2RlIGNyZWF0ZVR5cGVkTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdE5vZGUgY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXRhaWxEaWFncmFtIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZU5vZGUgY3JlYXRlUm9sZU5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tOb2RlIGNyZWF0ZVRhc2tOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCk7Ci0KLX0gLy9Nb2RlbEZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMGFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTW9kZWxQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTkFNRSA9ICJtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXROb2RlQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbCA8ZW0+TGlua2VkIE9iamVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua2VkT2JqZWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmtlZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBMSU5LRURfT0JKRUNUID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IERJQUdSQU0gPSAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsIDxlbT5MaW5rPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgTElOSyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwgPGVtPk5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBOT0RFID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsIDxlbT5OYW1lZCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TmFtZWROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREUgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbCA8ZW0+VHlwZWQgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuVHlwZWROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFR5cGVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIDxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsIDxlbT5Sb2xlIE5vZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFJvbGVOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfTk9ERSA9IDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVUYXNrQ29tcG9zaXRlSW1wbCA8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURSA9IDEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCA8ZW0+VGFzayBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRUYXNrTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX05PREUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX19MSU5LRURfRUxFTUVOVCA9IExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fTE9DQVRJT04gPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fV0lEVEggPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfX0hFSUdIVCA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfX1JFQURfT05MWSA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Tm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOT0RFX0ZFQVRVUkVfQ09VTlQgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTk9ERV9DT05UQUlORVJfX0xJTktFRF9FTEVNRU5UID0gTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTE9DQVRJT04gPSBOT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19XSURUSCA9IE5PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19IRUlHSFQgPSBOT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZID0gTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOT0RFX0NPTlRBSU5FUl9fTk9ERVMgPSBOT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSBOT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fTElOS0VEX0VMRU1FTlQgPSBOT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19MT0NBVElPTiA9IE5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1dJRFRIID0gTk9ERV9DT05UQUlORVJfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0hFSUdIVCA9IE5PREVfQ09OVEFJTkVSX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19SRUFEX09OTFkgPSBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBESUFHUkFNX19OT0RFUyA9IE5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IERJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fTElOS0VEX0VMRU1FTlQgPSBMSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fTkFNRSA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IExJTktfX1NPVVJDRSA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19fVEFSR0VUID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CZW5kcG9pbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBMSU5LX19CRU5EUE9JTlRTID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTElOS19fU09VUkNFX0VORF9QT0lOVCA9IExJTktFRF9PQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVuZCBQb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExJTktfX1RBUkdFVF9FTkRfUE9JTlQgPSBMSU5LRURfT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTElOS19GRUFUVVJFX0NPVU5UID0gTElOS0VEX09CSkVDVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UID0gTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19MT0NBVElPTiA9IE5PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgTkFNRURfTk9ERV9fV0lEVEggPSBOT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19IRUlHSFQgPSBOT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfTk9ERV9fUkVBRF9PTkxZID0gTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBOQU1FRF9OT0RFX19OQU1FID0gTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lZCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCA9IE5PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IERJQUdSQU1fX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fTE9DQVRJT04gPSBESUFHUkFNX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX1dJRFRIID0gRElBR1JBTV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfRElBR1JBTV9fSEVJR0hUID0gRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IERJQUdSQU1fX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IERJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RJQUdSQU1fX1JFQURfT05MWSA9IERJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgQUNUSVZJVFlfRElBR1JBTV9fTk9ERVMgPSBESUFHUkFNX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBEaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IEFDVElWSVRZX0RJQUdSQU1fRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUWVBFRF9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fTE9DQVRJT04gPSBOT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFRZUEVEX05PREVfX1dJRFRIID0gTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fSEVJR0hUID0gTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVEX05PREVfX1JFQURfT05MWSA9IE5PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgVFlQRURfTk9ERV9fVFlQRSA9IE5PREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VHlwZWQgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBUWVBFRF9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOT0RFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fTElOS0VEX0VMRU1FTlQgPSBESUFHUkFNX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX0xPQ0FUSU9OID0gRElBR1JBTV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19XSURUSCA9IERJQUdSQU1fX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX0hFSUdIVCA9IERJQUdSQU1fX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBESUFHUkFNX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX19SRUFEX09OTFkgPSBESUFHUkFNX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU1fX05PREVTID0gRElBR1JBTV9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX05PREVfX0xJTktFRF9FTEVNRU5UID0gTkFNRURfTk9ERV9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fTE9DQVRJT04gPSBOQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19XSURUSCA9IE5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19IRUlHSFQgPSBOQU1FRF9OT0RFX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fUkVBRF9PTkxZID0gTkFNRURfTk9ERV9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9fTkFNRSA9IE5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9OT0RFX19UWVBFID0gTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfTk9ERV9GRUFUVVJFX0NPVU5UID0gTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19MSU5LRURfRUxFTUVOVCA9IERJQUdSQU1fX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0xPQ0FUSU9OID0gRElBR1JBTV9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fV0lEVEggPSBESUFHUkFNX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fSEVJR0hUID0gRElBR1JBTV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fSU5DT01JTkdfQ09OTkVDVElPTlMgPSBESUFHUkFNX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gRElBR1JBTV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX1JFQURfT05MWSA9IERJQUdSQU1fX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX05PREVTID0gRElBR1JBTV9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0byBMYXlvdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQgPSBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19MT0NBVElPTiA9IE5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19XSURUSCA9IE5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fSEVJR0hUID0gTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX05PREVfX1JFQURfT05MWSA9IE5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX19OQU1FID0gTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9UQVNLX0NPTVBPU0lURV9fTElOS0VEX0VMRU1FTlQgPSBOT0RFX0NPTlRBSU5FUl9fTElOS0VEX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19MT0NBVElPTiA9IE5PREVfQ09OVEFJTkVSX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX1dJRFRIID0gTk9ERV9DT05UQUlORVJfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0hFSUdIVCA9IE5PREVfQ09OVEFJTkVSX19IRUlHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTk9ERV9DT05UQUlORVJfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5PREVfQ09OVEFJTkVSX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19SRUFEX09OTFkgPSBOT0RFX0NPTlRBSU5FUl9fUkVBRF9PTkxZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19OT0RFUyA9IE5PREVfQ09OVEFJTkVSX19OT0RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3cgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1RBU0tfQ09NUE9TSVRFX19ST1dfSU5ERVggPSBOT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfVEFTS19DT01QT1NJVEVfRkVBVFVSRV9DT1VOVCA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmtlZCBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19MT0NBVElPTiA9IE5BTUVEX05PREVfX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19XSURUSCA9IE5BTUVEX05PREVfX1dJRFRIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhlaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fSEVJR0hUID0gTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0Z29pbmcgQ29ubmVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOQU1FRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfX1JFQURfT05MWSA9IE5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19OT0RFX19OQU1FID0gTkFNRURfTk9ERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfTk9ERV9fSU5ERVggPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2sgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX05PREVfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX05PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19MSU5LRURfRUxFTUVOVCA9IE5BTUVEX05PREVfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fTE9DQVRJT04gPSBOQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX1dJRFRIID0gTkFNRURfTk9ERV9fV0lEVEg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fSEVJR0hUID0gTkFNRURfTk9ERV9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREVfX1JFQURfT05MWSA9IE5BTUVEX05PREVfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERV9fTkFNRSA9IE5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREUgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fTElOS0VEX0VMRU1FTlQgPSBOQU1FRF9OT0RFX19MSU5LRURfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fTE9DQVRJT04gPSBOQU1FRF9OT0RFX19MT0NBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fV0lEVEggPSBOQU1FRF9OT0RFX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX0hFSUdIVCA9IE5BTUVEX05PREVfX0hFSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNvbWluZyBDb25uZWN0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5BTUVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TID0gTkFNRURfTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFX19SRUFEX09OTFkgPSBOQU1FRF9OT0RFX19SRUFEX09OTFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9fTkFNRSA9IE5BTUVEX05PREVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfTk9ERV9GRUFUVVJFX0NPVU5UID0gTkFNRURfTk9ERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEUgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX0xJTktFRF9FTEVNRU5UID0gTk9ERV9DT05UQUlORVJfX0xJTktFRF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fTE9DQVRJT04gPSBOT0RFX0NPTlRBSU5FUl9fTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19XSURUSCA9IE5PREVfQ09OVEFJTkVSX19XSURUSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19IRUlHSFQgPSBOT0RFX0NPTlRBSU5FUl9fSEVJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IE5PREVfQ09OVEFJTkVSX19JTkNPTUlOR19DT05ORUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRnb2luZyBDb25uZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fT1VUR09JTkdfQ09OTkVDVElPTlMgPSBOT0RFX0NPTlRBSU5FUl9fT1VUR09JTkdfQ09OTkVDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fUkVBRF9PTkxZID0gTk9ERV9DT05UQUlORVJfX1JFQURfT05MWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fTk9ERVMgPSBOT0RFX0NPTlRBSU5FUl9fTk9ERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEUgPSBOT0RFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9DT01QT1NJVEVfRkVBVFVSRV9DT1VOVCA9IE5PREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRBYnNvbHV0ZUJlbmRwb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBBQlNPTFVURV9CRU5EUE9JTlQgPSAxNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIGludCBQT0lOVCA9IDE4OwotCi0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1IgPSAxOTsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5MaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaW5rX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+U291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRTb3VyY2UoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFUmVmZXJlbmNlIGdldExpbmtfU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5UYXJnZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldCgpCi0JICogQHNlZSAjZ2V0TGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0TGlua19UYXJnZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldEJlbmRwb2ludHMgPGVtPkJlbmRwb2ludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJlbmRwb2ludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldEJlbmRwb2ludHMoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldExpbmtfQmVuZHBvaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFNvdXJjZUVuZFBvaW50IDxlbT5Tb3VyY2UgRW5kIFBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U291cmNlIEVuZCBQb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsjZ2V0U291cmNlRW5kUG9pbnQoKQotCSAqIEBzZWUgI2dldExpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldExpbmtfU291cmNlRW5kUG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluayNnZXRUYXJnZXRFbmRQb2ludCA8ZW0+VGFyZ2V0IEVuZCBQb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rI2dldFRhcmdldEVuZFBvaW50KCkKLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRMaW5rX1RhcmdldEVuZFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TGlua2VkIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0TGlua2VkT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdCNnZXRMaW5rZWRFbGVtZW50IDxlbT5MaW5rZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkxpbmtlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0I2dldExpbmtlZEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldExpbmtlZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TGlua2VkT2JqZWN0X0xpbmtlZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSA8ZW0+TmFtZWQgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXROYW1lZE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkTm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0TmFtZWROb2RlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgPGVtPk5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUNsYXNzIGdldE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0TG9jYXRpb24oKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XaWR0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0V2lkdGgoKQotCSAqIEBzZWUgI2dldE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldE5vZGVfV2lkdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRIZWlnaHQgPGVtPkhlaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkhlaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SGVpZ2h0KCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXROb2RlX0hlaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SW5jb21pbmdDb25uZWN0aW9ucyA8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkluY29taW5nIENvbm5lY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldE91dGdvaW5nQ29ubmVjdGlvbnMgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRnb2luZyBDb25uZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVSZWZlcmVuY2UgZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjaXNSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhZCBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNpc1JlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXROb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXROb2RlX1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0gPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUgPGVtPlR5cGVkIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQ2xhc3MgZ2V0VHlwZWROb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRUeXBlZE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFQXR0cmlidXRlIGdldFR5cGVkTm9kZV9UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIDxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0Tm9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3ROb2RlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW0jaXNBdXRvTGF5b3V0IDxlbT5BdXRvIExheW91dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF1dG8gTGF5b3V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtI2lzQXV0b0xheW91dCgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROb2RlQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciNnZXROb2RlcyA8ZW0+Tm9kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5vZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciNnZXROb2RlcygpCi0JICogQHNlZSAjZ2V0Tm9kZUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Tm9kZUNvbnRhaW5lcl9Ob2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGUgPGVtPlJvbGUgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIE5vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZU5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgVGFzayBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVRhc2tDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJvdyBJbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlI2dldFJvd0luZGV4KCkKLQkgKiBAc2VlICNnZXRSb2xlVGFza0NvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZVRhc2tDb21wb3NpdGVfUm93SW5kZXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlIDxlbT5UYXNrIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tOb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluZGV4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFRhc2tOb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrTm9kZV9JbmRleCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50IE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlIDxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RDb21wb3NpdGVfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludCA8ZW0+QWJzb2x1dGUgQmVuZHBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBFRGF0YVR5cGUgZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQgPGVtPlBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVEYXRhVHlwZSBnZXRQb2ludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIE1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCWludGVyZmFjZSBMaXRlcmFscyAgewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwgPGVtPkRpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldERpYWdyYW0oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsIDxlbT5MaW5rPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRMaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJTksgPSBlSU5TVEFOQ0UuZ2V0TGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJTktfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TGlua19OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTElOS19fU09VUkNFID0gZUlOU1RBTkNFLmdldExpbmtfU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBMSU5LX19UQVJHRVQgPSBlSU5TVEFOQ0UuZ2V0TGlua19UYXJnZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJlbmRwb2ludHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIExJTktfX0JFTkRQT0lOVFMgPSBlSU5TVEFOQ0UuZ2V0TGlua19CZW5kcG9pbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2UgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fU09VUkNFX0VORF9QT0lOVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1NvdXJjZUVuZFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW5kIFBvaW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTElOS19fVEFSR0VUX0VORF9QT0lOVCA9IGVJTlNUQU5DRS5nZXRMaW5rX1RhcmdldEVuZFBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtlZE9iamVjdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TGlua2VkT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExJTktFRF9PQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0TGlua2VkT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rZWQgRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIExJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldExpbmtlZE9iamVjdF9MaW5rZWRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwgPGVtPk5hbWVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0TmFtZWROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVEX05PREUgPSBlSU5TVEFOQ0UuZ2V0TmFtZWROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTkFNRURfTk9ERV9fTkFNRSA9IGVJTlNUQU5DRS5nZXROYW1lZE5vZGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCA8ZW0+Tm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOT0RFID0gZUlOU1RBTkNFLmdldE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTk9ERV9fTE9DQVRJT04gPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9Mb2NhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19XSURUSCA9IGVJTlNUQU5DRS5nZXROb2RlX1dpZHRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOT0RFX19IRUlHSFQgPSBlSU5TVEFOQ0UuZ2V0Tm9kZV9IZWlnaHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluY29taW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUyA9IGVJTlNUQU5DRS5nZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dGdvaW5nIENvbm5lY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyA9IGVJTlNUQU5DRS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE5PREVfX1JFQURfT05MWSA9IGVJTlNUQU5DRS5nZXROb2RlX1JlYWRPbmx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwgPGVtPlR5cGVkIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VHlwZWROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRZUEVEX05PREUgPSBlSU5TVEFOQ0UuZ2V0VHlwZWROb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVFlQRURfTk9ERV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRUeXBlZE5vZGVfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3ROb2RlSW1wbCA8ZW0+V29yayBQcm9kdWN0IE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Tm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3ROb2RlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9OT0RFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9OT0RFX19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgPGVtPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dG8gTGF5b3V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVDb250YWluZXJJbXBsIDxlbT5Ob2RlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Tm9kZUNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBOT0RFX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTk9ERV9DT05UQUlORVJfX05PREVTID0gZUlOU1RBTkNFLmdldE5vZGVDb250YWluZXJfTm9kZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZU5vZGVJbXBsIDxlbT5Sb2xlIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlJvbGVOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlTm9kZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX05PREUgPSBlSU5TVEFOQ0UuZ2V0Um9sZU5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsIDxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Sb2xlVGFza0NvbXBvc2l0ZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0Um9sZVRhc2tDb21wb3NpdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9UQVNLX0NPTVBPU0lURSA9IGVJTlNUQU5DRS5nZXRSb2xlVGFza0NvbXBvc2l0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um93IEluZGV4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYID0gZUlOU1RBTkNFLmdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCA8ZW0+VGFzayBOb2RlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5UYXNrTm9kZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0VGFza05vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19OT0RFID0gZUlOU1RBTkNFLmdldFRhc2tOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfTk9ERV9fSU5ERVggPSBlSU5TVEFOQ0UuZ2V0VGFza05vZGVfSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwgPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdENvbXBvc2l0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdENvbXBvc2l0ZV9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5BYnNvbHV0ZSBCZW5kcG9pbnQ8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuQWJzb2x1dGVCZW5kcG9pbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgQUJTT0xVVEVfQkVORFBPSU5UID0gZUlOU1RBTkNFLmdldEFic29sdXRlQmVuZHBvaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Qb2ludDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBQT0lOVCA9IGVJTlNUQU5DRS5nZXRQb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBST0xFX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKTsKLQotCX0KLQotfSAvL01vZGVsUGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05hbWVkTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL05hbWVkTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGMzY2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9OYW1lZE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIEEgZGlhZ3JhbSBub2RlIHdpdGggbmFtZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWROb2RlIGV4dGVuZHMgTm9kZSB7Ci0JLyoqCi0JICogR2V0cyBub2RlIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgbm9kZQotCSAqIEBtb2RlbAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzaW9uIHN0YXR1cyBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIHN1cHByZXNzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHdyYXBwZXIgb2YgdGhlIG1ldGhvZCBlbGVtZW50IHRoYXQgdGhpcyBub2RlIHJlcHJlc2VudHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3cmFwcGVyCi0JICovCi0JT2JqZWN0IGdldFdyYXBwZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRhMmFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci0KLS8qKgotICogVGhlIGRpYWdyYW0gbm9kZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBMaW5rZWRPYmplY3QgewotCi0JLyoqCi0JICogR2V0cyBsb2NhdGlvbiBvZiB0aGlzIG5vZGUKLQkgKiAKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCVBvaW50IGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHdpZHRoCi0JICogCi0JICogQG1vZGVsIGRlZmF1bHQ9Ii0xIiB0cmFuc2llbnQ9InRydWUiCi0JICovCi0JaW50IGdldFdpZHRoKCk7Ci0KLQkvKioKLQkgKiBHZXRzIGhlaWdodAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGhlaWdodAotCSAqIEBtb2RlbCBkZWZhdWx0PSItMSIgdHJhbnNpZW50PSJ0cnVlIgotCSAqLwotCWludCBnZXRIZWlnaHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGVpZ2h0KGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldpZHRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V2lkdGgoaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMb2NhdGlvbihQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIGluY29taW5nIGxpbmtzCi0JICogCi0JICogQG1vZGVsIHR5cGU9IkxpbmsiIG9wcG9zaXRlPSJ0YXJnZXQiIGxvd2VyPSIwIgotCSAqLwotCUVMaXN0PExpbms+IGdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIEdldHMgb3V0Z29pbmcgbGlua3MKLQkgKiAKLQkgKiBAbW9kZWwgdHlwZT0iTGluayIgY29udGFpbm1lbnQ9InRydWUiIG9wcG9zaXRlPSJzb3VyY2UiIGxvd2VyPSIwIgotCSAqLwotCUVMaXN0PExpbms+IGdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIG5vZGUgaXMgcmVhZC1vbmx5Ci0JICogCi0JICogQG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1JlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlI2lzUmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaWFncmFtIG9mIHRoaXMgbm9kZQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgZGlhZ3JhbSBmb3IgdGhpcyBub2RlCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKi8KLQl2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIEdyYXBoTm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIG1ldGhvZCBlbGVtZW50IGFkYXB0ZXIuIE1ldGhvZCBlbGVtZW50IGFkYXB0ZXIgaXMgYSBub2RlCi0JICogaW50ZXJuYWwge0BsaW5rIEFkYXB0ZXIgYWRhcHRlcn0gdGhhdCBpcyBsaXN0ZW5pbmcgb24gY2hhbmdlcyBvZiBsaW5rZWQKLQkgKiBtZXRob2QgZWxlbWVudCBvciBpdHMgd3JhcHBlciB0byB1cGRhdGUgdGhlIG5vZGUgYWNjb3JkaW5nbHkuCi0JICogCi0JICogQHJldHVybiB0aGUgY2xhc3Mgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFkYXB0ZXIgb2YgdGhpcyBub2RlCi0JICovCi0JQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgVU1BIGRpYWdyYW0gZm9yIHRoZSBuZXcgbm9kZSBzbyBpdCBjYW4KLQkgKiBmaW5kIHRoZSBHcmFwaE5vZGUgZm9yIHRoZSBsaW5rZWQgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIHVtYURpYWdyYW0KLQkgKi8KLQl2b2lkIHNldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHVtYURpYWdyYW0pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZ3JhcGggbm9kZSB0aGF0IGlzIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICoge0BsaW5rICNnZXRHcmFwaE5vZGUoKSBsaW5rZWQgZ3JhcGggbm9kZX0KLQkgKiAKLQkgKiBAcGFyYW0gdW1hQ29udGFpbmVyCi0JICovCi0Jdm9pZCBzZXRVTUFDb250YWluZXIoR3JhcGhOb2RlIHVtYUNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb25zdW1lciB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGNvbnN1bWVyCi0JICovCi0Jdm9pZCBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29uc3VtZXIgZnJvbSB0aGUgY29uc3VtZXIgbGlzdCBvZiB0aGlzIG5vZGUuIERpc3Bvc2VzCi0JICogdGhlIG5vZGUgaWYgaXQgZG9lcyBub3QgaGF2ZSBhbnkgbW9yZSBjb25zdW1lciBhZnRlciB0aGlzIGNhbGwuIERpc3Bvc2luZwotCSAqIGEgbm9kZSB3aWxsIHRha2UgY2FyZSBvZiByZW1vdmluZyB0aGlzIG5vZGUncyBsaXN0ZW5lciBmcm9tIHRoZSBVTUEKLQkgKiBvYmplY3QgYW5kIGFsbCB0aGUgYWRhcHRlcnMgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgYWRhcHRlciBsaXN0IG9mCi0JICogdGhpcyBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqLwotCXZvaWQgcmVtb3ZlQ29uc3VtZXIoT2JqZWN0IGNvbnN1bWVyKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvTm9kZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWRkZjU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Ob2RlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSBub2RlIHRoYXQgY2FuIGNvbnRhaW4gY2hpbGQgbm9kZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqLwotcHVibGljIGludGVyZmFjZSBOb2RlQ29udGFpbmVyIGV4dGVuZHMgTm9kZSB7Ci0JLyoqCi0JICogR2V0cyBjaGlsZCBub2RlcwotCSAqIAotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHlwZT0iTm9kZSIKLQkgKi8KLQlFTGlzdDxOb2RlPiBnZXROb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGVhZTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXR5cGVfYWN0aXZpdHk9QWN0aXZpdHkgRGlhZ3JhbQotZGVmYXVsdEJhc2VOYW1lPU5ldyB7MH0KLXR5cGVfV1BEPVdvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0KLXR5cGVfYWN0aXZpdHlEZXRhaWw9QWN0aXZpdHkgRGV0YWlsIERpYWdyYW0KLWFkZEZyZWVUeHQ9QWRkIEZyZWUgVGV4dAotdHlwZV91bmtub3duPVVua25vd24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTQ2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1JvbGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIHJvbGUgaW4gZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZU5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvUm9sZVRhc2tDb21wb3NpdGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTYzNmVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Sb2xlVGFza0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogQSBjb250YWluZXIgdGhhdCBncm91cHMgYSBSb2xlTm9kZSBhbmQgVGFza05vZGVzIHdob3NlIHRhc2tzIHRoZSBSb2xlIHBlcmZvcm1zLgotICogVGhlIGxpbmtlZCBvYmplY3QgZm9yIFJvbGVUYXNrQ29tcG9zaXRlIGlzIFJvbGVEZXNjcmlwdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVRhc2tDb21wb3NpdGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3cgSW5kZXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdyBJbmRleDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3cgSW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvd0luZGV4KGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBnZXRSb3dJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGUjZ2V0Um93SW5kZXggPGVtPlJvdyBJbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um93IEluZGV4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um93SW5kZXgoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1Rhc2tOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0MTNlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVGFza05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi0vKioKLSAqIE5vZGUgdGhhdCByZXByZXNlbnRzIGEgdGFzayBpbiBkaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrTm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiItMSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluZGV4KGludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRUYXNrTm9kZV9JbmRleCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Ii0xIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmRleChpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVHlwZWROb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvVHlwZWROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMGY0Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1R5cGVkTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSB0aGF0IGlzIG5vdCBsaW5rZWQgdG8gYW55IG1ldGhvZCBlbGVtZW50IChub3QgYSB7QGxpbmsgTGlua2VkT2JqZWN0fSkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlZE5vZGUgZXh0ZW5kcyBOb2RlIHsKLQlzdGF0aWMgZmluYWwgaW50IFNZTkNIX0JBUiA9IDE7Ci0KLQlzdGF0aWMgZmluYWwgaW50IERFQ0lTSU9OID0gMjsKLQotCXN0YXRpYyBmaW5hbCBpbnQgU1RBUlQgPSAzOwotCi0Jc3RhdGljIGZpbmFsIGludCBFTkQgPSA0OwotCi0Jc3RhdGljIGZpbmFsIGludCBTVElDS1lfTk9URSA9IDU7Ci0KLQlzdGF0aWMgZmluYWwgaW50IEZSRUVfVEVYVCA9IDY7Ci0KLQkvKioKLQkgKiBHZXRzIHR5cGUuIFRoZSB0eXBlIG11c3QgYmUgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBtb2RlbAotCSAqLwotCWludCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoaW50IHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjcxNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotLyoqCi0gKiBOb2RlIHRoYXQgcmVwcmVzZW50cyBhIHtAbGluayBXb3JrQnJlYWtkb3duRWxlbWVudH0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSBleHRlbmRzIE5hbWVkTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdENvbXBvc2l0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTI2MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogTm9kZSB0aGF0IHJlcHJlc2VudHMgYSBncm91cCBvZiB7QGxpbmsgV29ya1Byb2R1Y3R9Ci0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RDb21wb3NpdGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOUFVUUyA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRQVVRTID0gMjsKLQotCS8qKgotCSAqIEdldHMgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHtAbGluayAjSU5QVVRTfSBvciB7QGxpbmsgI09VVFBVVFN9Ci0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKGludCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RiODFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSByZXByZXNlbnRzIHRoZSBtb2RlbCBvZiB0aGUgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICogQG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBleHRlbmRzIERpYWdyYW0gewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0ODEyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogTm9kZSBmb3IgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGluIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvV29ya1Byb2R1Y3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDRmYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL1dvcmtQcm9kdWN0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm9kZSBpbiBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdE5vZGUgZXh0ZW5kcyBOYW1lZE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJUSUZBQ1QgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVMSVZFUkFCTEUgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUQ09NRSA9IDM7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3b3JrIHByb2R1Y3QgdHlwZSBvZiB0aGlzIG5vZGUuIFRoaXMgbXVzdCBiZSBvbmUgb2YgdGhlCi0JICogZm9sbG93aW5nIGNvbnN0YW50czoge0BsaW5rICNBUlRJRkFDVH0sIHtAbGluayAjREVMSVZFUkFCTEV9LCB7QGxpbmsgI09VVENPTUV9Ci0JICogCi0JICogQG1vZGVsCi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShpbnQgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURldGFpbERpYWdyYW1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzA2YzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERldGFpbCBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwjaXNBdXRvTGF5b3V0IDxlbT5BdXRvIExheW91dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZXh0ZW5kcyBEaWFncmFtSW1wbCBpbXBsZW1lbnRzCi0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b0xheW91dCgpIDxlbT5BdXRvIExheW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19MQVlPVVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXV0b0xheW91dCgpIDxlbT5BdXRvIExheW91dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvTGF5b3V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvTGF5b3V0ID0gQVVUT19MQVlPVVRfRURFRkFVTFQ7Ci0KLQlwcml2YXRlIGNsYXNzIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyCi0JCQlpbXBsZW1lbnRzIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0JCS8vIC8qIChub24tSmF2YWRvYykKLQkJLy8gKiBAc2VlCi0JCS8vIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwuQWN0aXZpdHlBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkvLyAqLwotCQkvLyBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gaWYoIW5vdGlmaWNhdGlvbkVuYWJsZWQpIHJldHVybjsKLQkJLy8gbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkvLyB0cnkgewotCQkvLyBPYmplY3Qgb2JqOwotCQkvLyBzd2l0Y2gobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCS8vIHJlcG9wdWxhdGVEaWFncmFtKCk7Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gZmluYWxseSB7Ci0JCS8vIG5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0cnVlOwotCQkvLyB9Ci0JCS8vCi0JCS8vIH0KLQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCi0JCWRpYWdyYW1DaGFuZ2VMaXN0ZW5lciA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVDoKLQkJCQlyZXR1cm4gaXNBdXRvTGF5b3V0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQ6Ci0JCQkJc2V0QXV0b0xheW91dCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXNldEF1dG9MYXlvdXQoQVVUT19MQVlPVVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fX0FVVE9fTEFZT1VUOgotCQkJCXJldHVybiBhdXRvTGF5b3V0ICE9IEFVVE9fTEFZT1VUX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0b0xheW91dDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhdXRvTGF5b3V0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3B1bGF0ZURpYWdyYW0oKSB7Ci0JCS8vIGNsZWFyIGRpYWdyYW0KLQkJLy8KLQotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCi0JCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkIHVud2FudGVkCi0JCS8vIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkvLwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZUltcGwgbm9kZSA9ICgoTm9kZUltcGwpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCW5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0aW9uID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRpb24uaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXJhdGlvbi5uZXh0KCk7Ci0KLQkJCS8vIGNsZWFyIGFsbCBsaW5rcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRUYXJnZXQobnVsbCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQl9Ci0JCQlub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJfQotCi0JCWdldE5vZGVzKCkuY2xlYXIoKTsKLQotCQlwb3B1bGF0ZURpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9MYXlvdXQoKSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfVFJVRS5lcXVhbHMoCi0JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcodGhpcykpOwotCQl9Ci0JCXJldHVybiBhdXRvTGF5b3V0OwotCX0KLQotCi0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRvTGF5b3V0KGJvb2xlYW4gbmV3QXV0b0xheW91dCkgewotCQlib29sZWFuIG9sZEF1dG9MYXlvdXQgPSBhdXRvTGF5b3V0OwotCQlhdXRvTGF5b3V0ID0gbmV3QXV0b0xheW91dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNX19BVVRPX0xBWU9VVCwgb2xkQXV0b0xheW91dCwgYXV0b0xheW91dCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb1NldEF1dG9MYXlvdXQoYm9vbGVhbiBuZXdBdXRvTGF5b3V0KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkodGhpcy5ncmFwaE5vZGUsIAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQsIAotCQkJCQlTdHJpbmcudmFsdWVPZihuZXdBdXRvTGF5b3V0KSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRBdXRvTGF5b3V0KG5ld0F1dG9MYXlvdXQpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gZ2V0QWxsQnJlYWtkb3duRWxlbWVudHModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgYnJlYWtkb3duIGVsZW1lbnRzIG9yIHRoZWlyIHdyYXBwZXJzIGZvciB0aGUgYWN0aXZpdHkgb2YgdGhpcwotCSAqIGRpYWdyYW0KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQ29sbGVjdGlvbiBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhib29sZWFuIGZpbHRlclN1cHByZXNzZWQpIHsKLQkJQXJyYXlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXM7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCUlBZGFwdGVyRmFjdG9yeUZpbHRlciBhZGFwdGVyRmFjdG9yeUZpbHRlciA9IChJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcjsKLQkJCWFkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5RmlsdGVyLmdldFdCU0FkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWFkYXB0ZXJGYWN0b3J5RmlsdGVyLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWFkYXB0ZXJGYWN0b3J5RmlsdGVyLmdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0gZWxzZSB7Ci0JCQlhZGFwdGVyRmFjdG9yaWVzID0gREVGQVVMVF9BREFQVEVSX0ZBQ1RPUklFUzsKLQkJfQotCQlpZiAod3JhcHBlciAhPSBudWxsKSB7Ci0JCQlMaXN0IHdyYXBwZXJzID0gUHJvY2Vzc1V0aWwuZ2V0V3JhcHBlcnMod3JhcHBlciwgYWRhcHRlckZhY3Rvcmllcyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3ID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCWV4dHJhY3RDaGlsZHJlbih3LCB3LCBicmVha2Rvd25FbGVtZW50cywgZmlsdGVyU3VwcHJlc3NlZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXNbaV07Ci0JCQkJaWYgKGdldE9iamVjdCgpICE9IG51bGwpIHsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJLmFkYXB0KGdldE9iamVjdCgpLAotCQkJCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlleHRyYWN0Q2hpbGRyZW4oYWRhcHRlciwgZ2V0T2JqZWN0KCksCi0JCQkJCQkJCWJyZWFrZG93bkVsZW1lbnRzLCBmaWx0ZXJTdXBwcmVzc2VkKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gYWRkIGRlc2NyaXB0b3JzIG9mIHN1YmFydGlmYWN0cwotCQkvLwotCQlBZGFwdGVyRmFjdG9yeSB3cGJzQWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzWzJdOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdChicmVha2Rvd25FbGVtZW50cykuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcmF0b3IubmV4dCgpOwotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQlpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QKLQkJCQkJCS8vIEZJWE1FOiBuZWVkIHRvIHVzZWQgcmVhbGl6ZWQgbGlzdCBvZiBzdWJhcnRpZmFjdHMgYWZ0ZXIgc2ltaWxhciBmaXggaXMgbWFkZSBpbgotCQkJCQkJLy8gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCi0JCQkJCQkvLwotCQkJCQkJJiYgISgoQXJ0aWZhY3Qpd3ApLmdldENvbnRhaW5lZEFydGlmYWN0cygpLmlzRW1wdHkoKSAKLQkJCQkpIHsKLQkJCQkJY29sbGVjdFN1YmFydGlmYWN0RGVzY3JpcHRvcnMoY2hpbGQsIGZpbHRlclN1cHByZXNzZWQsIGJyZWFrZG93bkVsZW1lbnRzLCB3cGJzQWRhcHRlckZhY3RvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb2xsZWN0U3ViYXJ0aWZhY3REZXNjcmlwdG9ycyhPYmplY3QgY2hpbGQsCi0JCQlib29sZWFuIGZpbHRlclN1cHByZXNzZWQsIEFycmF5TGlzdDxPYmplY3Q+IGJyZWFrZG93bkVsZW1lbnRzLAotCQkJQWRhcHRlckZhY3Rvcnkgd3Bic0FkYXB0ZXJGYWN0b3J5KSB7Ci0JCS8vIGRpc2FibGUgcm9sbHVwIGJlZm9yZSBnZXR0aW5nIHRoZSBjaGlsZHJlbgotCQkvLwotCQlib29sZWFuIG9sZFJvbGxlZFVwID0gZmFsc2U7Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCWFkYXB0ZXIgPSBpdGVtUHJvdmlkZXI7Ci0JCX0KLQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQlhZGFwdGVyID0gaXRlbVByb3ZpZGVyOwotCQl9Ci0JCQotCQl0cnkgewotCi0JCQlBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PigKLQkJCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LCBjaGlsZCwgZmFsc2UpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQlpZihmaWx0ZXJTdXBwcmVzc2VkKSB7Ci0JCQkJCWlmKCFnZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvKSkgewotCQkJCQkJYnJlYWtkb3duRWxlbWVudHMuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVha2Rvd25FbGVtZW50cy5hZGQobyk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSByb2xsZWQtdXAgZmxhZwotCQkJLy8KLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldFJvbGxlZFVwKG9sZFJvbGxlZFVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNwb3B1bGF0ZU5vZGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZU5vZGVzKCkgewotCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQkJaWYgKGFjdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJaWYgKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkvLyB0byBwb3B1bGF0ZSB0aGUgdHlwZWRub2RlLgotCQkJCXN1cGVyLnBvcHVsYXRlTm9kZXMoKTsKLQkJCX0KLQotCQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQkJZmlsdGVyID0gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTWzBdKQotCQkJCQkJLmdldEZpbHRlcigpOwotCQkJfQotCi0JCQkvLyBOb2RlIG5ld05vZGUgPSBudWxsOwotCQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cyA9IGdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHRydWUpOwotCQkJQ29sbGVjdGlvbiByb2xlRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCQlMaXN0IGRlc2MgPSBkZXNjcmlwdG9yCi0JCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGRlc2MuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KQl7Ci0JCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQkJCQotCQkJCQkJaWYgKHJvbGVEZXNjcmlwdG9yICE9IG51bGwKLQkJCQkJCQkJJiYgZmlsdGVyLmFjY2VwdChyb2xlRGVzY3JpcHRvcikKLQkJCQkJCQkJLy8gVE9ETzogbmVlZCB0byBjaGVjayBpZiB0aGUgcm9sZSBkZXNjcmlwdG9yIGlzCi0JCQkJCQkJCS8vIGluaGVyaXRlZCBhbmQgbG9jYWxseSBzdXBwcmVzc2VkCi0JCQkJCQkJCS8vIGlmIGxvY2FsbHkgc3VwcHJlc3NlZCwgY2hlY2sgdGhlIHdyYXBwZXIgb2YgdGhlCi0JCQkJCQkJCS8vIHJvbGUgZGVzY3JpcHRvcgotCQkJCQkJCQkvLwotCQkJCQkJCQkmJiAhcm9sZURlc2NyaXB0b3IuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpCi0JCQkJCQkJCSYmICFyb2xlRGVzY3JpcHRvcnMuY29udGFpbnMocm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJCQkJLy8gbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJCQkJCQkvLyBpZihuZXdOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkvLyBpZihQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0JCQkJCQkJLy8gLy8gdGFzayBkZXNjcmlwdG9yIGlzIGluaGVyaXRlZCwgaXRzIHByaW1hcnkKLQkJCQkJCQkvLyBwZXJmb3JtZXIgaXMgbm90IGxvY2FsCi0JCQkJCQkJLy8gLy8gc2V0IHJvbGUgbm9kZSBvZiB0aGUgUm9sZVRhc2tDb21wb3NpdGUgdG8KLQkJCQkJCQkvLyByZWFkLW9ubHkKLQkJCQkJCQkvLyAvLwotCQkJCQkJCS8vIE5vZGUgcm9sZU5vZGUgPSAoTm9kZSkKLQkJCQkJCQkvLyAoKE5vZGVDb250YWluZXIpbmV3Tm9kZSkuZ2V0Tm9kZXMoKS5nZXQoMCk7Ci0JCQkJCQkJLy8gcm9sZU5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQkJLy8gfQotCQkJCQkJCS8vIG5vZGVzLmFkZChuZXdOb2RlKTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVSb3dzKHJvbGVEZXNjcmlwdG9yLCBvYmplY3QsCi0JCQkJCQkJCQlub2Rlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocm9sZURlc2NyaXB0b3JzLmNvbnRhaW5zKHJvbGVEZXNjcmlwdG9yKSkgewotCQkJCQkJCWNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKGRlc2NyaXB0b3IsIG5vZGVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldE51bWJlck9mUm93cyhpbnQgdG90YWxUYXNrcywgaW50IHRhc2tzUGVyUm93KSB7Ci0JCWludCBuID0gdG90YWxUYXNrcyAvIHRhc2tzUGVyUm93OwotCQlyZXR1cm4gKHRhc2tzUGVyUm93ICogbikgPT0gdG90YWxUYXNrcyA/IG4gOiBuICsgMTsKLQl9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVSb3dzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLCAKLSAgICAJCU9iamVjdCBvYmplY3QsIExpc3Qgbm9kZXMpIHsKLSAgICAJCi0gICAgCWludCB0YXNrc1BlclJvdyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0VGFza3NQZXJSb3coKTsKLSAgICAJTGlzdDw/PiBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzID0gLy9Bc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLSAgICAJCWdldFJlYWxpemVkUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzY3JpcHRvcik7Ci0gICAgCWludCB0b3RhbFRhc2tzID0gcHJpbWFyeVRhc2tEZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgCQotICAgIAlpZiAodGFza3NQZXJSb3cgPiAwICYmIHRvdGFsVGFza3MgPiAwICYmIHRvdGFsVGFza3MgPiB0YXNrc1BlclJvdwotCQkJCSYmIGlzQXV0b0xheW91dCgpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdldE51bWJlck9mUm93cyh0b3RhbFRhc2tzLCB0YXNrc1BlclJvdyk7IGkrKykgewotCQkJCU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yLCBpKTsKLQkJCQlpZiAobmV3Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChQcm9jZXNzVXRpbC5pc0luaGVyaXRlZChvYmplY3QpKSB7Ci0JCQkJCQkvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIKLQkJCQkJCS8vIGlzIG5vdCBsb2NhbAotCQkJCQkJLy8gc2V0IHJvbGUgbm9kZSBvZiB0aGUgUm9sZVRhc2tDb21wb3NpdGUgdG8gcmVhZC1vbmx5Ci0JCQkJCQkvLwotCQkJCQkJTGlzdDxOb2RlPiBub2RzID0gKChOb2RlQ29udGFpbmVyKSBuZXdOb2RlKS5nZXROb2RlcygpOwotCQkJCQkJaWYgKCFub2RzLmlzRW1wdHkoKSkgewotCQkJCQkJCU5vZGUgcm9sZU5vZGUgPSAoTm9kZSkgbm9kcy5nZXQoMCk7Ci0JCQkJCQkJcm9sZU5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChuZXdOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQob2JqZWN0KSkgewotCQkJCQkvLyB0YXNrIGRlc2NyaXB0b3IgaXMgaW5oZXJpdGVkLCBpdHMgcHJpbWFyeSBwZXJmb3JtZXIgaXMKLQkJCQkJLy8gbm90IGxvY2FsCi0JCQkJCS8vIHNldCByb2xlIG5vZGUgb2YgdGhlIFJvbGVUYXNrQ29tcG9zaXRlIHRvIHJlYWQtb25seQotCQkJCQkvLwotCQkJCQlMaXN0PE5vZGU+IG5vZHMgPSAoKE5vZGVDb250YWluZXIpIG5ld05vZGUpLmdldE5vZGVzKCk7Ci0JCQkJCWlmICghbm9kcy5pc0VtcHR5KCkpIHsKLQkJCQkJCU5vZGUgcm9sZU5vZGUgPSAoTm9kZSkgbm9kcy5nZXQoMCk7Ci0JCQkJCQlyb2xlTm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCQl9Ci0JCX0KLSAgICAJCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgY3JlYXRlTm9kZShUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQlOb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0JCW5vZGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJbm9kZS5zZXREaWFncmFtKHRoaXMpOwotCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHJldHVybgotCSAqLwotCU5vZGUgY3JlYXRlTm9kZShXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlOb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQkJbm9kZS5zZXRVTUFDb250YWluZXIoZ2V0R3JhcGhOb2RlKCkpOwotCQlub2RlLnNldERpYWdyYW0odGhpcyk7Ci0JCW5vZGUuc2V0T2JqZWN0KGRlc2NyaXB0b3IpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjcG9wdWxhdGVMaW5rcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJcG9wdWxhdGVMaW5rcyhnZXROb2RlcygpLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3Tm9kZXMKLQkgKiBAcGFyYW0gZGlzYWJsZU5vdGlmaWNhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoQ29sbGVjdGlvbiBuZXdOb2RlcywgYm9vbGVhbiBkaXNhYmxlTm90aWZpY2F0aW9uKSB7Ci0JCS8vIGZpbGwgb3V0Z29pbmcvaW5jb21pbmcgY29ubmVjdGlvbiBsaXN0cyBvZiBhbGwgbm9kZXMKLQkJLy8KLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJYm9vbGVhbltdIG5vdGlmaWVzID0gbmV3IGJvb2xlYW5bc2l6ZV07Ci0JCXRyeSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikKLQkJCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkJCS8vIHVud2FudGVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIHRoZWlyIGNvbm5lY3Rpb24gbGlzdAotCQkJCS8vCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJTm9kZSBub2RlID0gKChOb2RlKSBnZXROb2RlcygpLmdldChpKSk7Ci0JCQkJCW5vdGlmaWVzW2ldID0gbm9kZS5lRGVsaXZlcigpOwotCQkJCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld05vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgY2hpbGQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQkJLy8gV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya3Byb2R1Y3RDb21wb3NpdGUgPQotCQkJCQkvLyAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGNoaWxkLmdldE9iamVjdCgpOwotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IChXb3JrUHJvZHVjdENvbXBvc2l0ZSkgY2hpbGQ7Ci0JCQkJCWlmICh3b3JrcHJvZHVjdENvbXBvc2l0ZS5nZXRUeXBlKCkgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gd29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJCQlvYmplY3QsIFRhc2tOb2RlLmNsYXNzKTsKLQkJCQkJCQlpZihub2RlICE9IG51bGwgJiYgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTGluayhjaGlsZCwgb2JqZWN0KSA9PSBudWxsKSB7Ci0JCQkJCQkJCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCQkJCQkJCQlsaW5rLnNldFNvdXJjZShjaGlsZCk7Ci0JCQkJCQkJCWxpbmsuc2V0VGFyZ2V0KG5vZGUpOwotCQkJCQkJCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHdvcmtwcm9kdWN0Q29tcG9zaXRlLmdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQkJCQlPYmplY3Qgb2JqZWN0ID0gd29ya3Byb2R1Y3RDb21wb3NpdGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJCQlvYmplY3QsIFRhc2tOb2RlLmNsYXNzKTsKLQkJCQkJCQlpZihub2RlICE9IG51bGwgJiYgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTGluayhub2RlLCBvYmplY3QpID09IG51bGwpIHsKLQkJCQkJCQkJTGluayBsaW5rID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaW5rKCk7Ci0JCQkJCQkJCWxpbmsuc2V0U291cmNlKG5vZGUpOwotCQkJCQkJCQlsaW5rLnNldFRhcmdldChjaGlsZCk7Ci0JCQkJCQkJCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLSAJCX0gZmluYWxseSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikKLQkJCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQkJfQotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBSb2xlVGFza0NvbXBvc2l0ZSBkb0NyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLCBpbnQgaW5kZXgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGUgcm9sZVRhc2tDb21wb3NpdGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBlbGVtZW50ID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJCVJvbGVUYXNrQ29tcG9zaXRlIHJ0YyA9IChSb2xlVGFza0NvbXBvc2l0ZSkgZWxlbWVudDsKLQkJCQlpZihydGMuZ2V0TGlua2VkRWxlbWVudCgpID09IHJvbGVEZXNjcmlwdG9yICYmIHJ0Yy5nZXRSb3dJbmRleCgpID09IGluZGV4KSB7Ci0JCQkJCXJvbGVUYXNrQ29tcG9zaXRlID0gcnRjOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocm9sZVRhc2tDb21wb3NpdGUgPT0gbnVsbCkgewotCQkJcm9sZVRhc2tDb21wb3NpdGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpOwotCQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJCXJvbGVUYXNrQ29tcG9zaXRlLnNldERpYWdyYW0odGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yKSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gZG9DcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvciwwKTsKLQkJcm9sZVRhc2tDb21wb3NpdGUuc2V0T2JqZWN0KHJvbGVEZXNjcmlwdG9yKTsKLQkJcmV0dXJuIHJvbGVUYXNrQ29tcG9zaXRlOwotCX0KLQkKLQlwdWJsaWMgUm9sZVRhc2tDb21wb3NpdGUgY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciwgaW50IHJvd0luZGV4KSB7Ci0JCVJvbGVUYXNrQ29tcG9zaXRlIHJvbGVUYXNrQ29tcG9zaXRlID0gZG9DcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvciwgcm93SW5kZXgpOwotCQkoKFJvbGVUYXNrQ29tcG9zaXRlSW1wbClyb2xlVGFza0NvbXBvc2l0ZSkuc2V0Um93SW5kZXgocm93SW5kZXgpOwotCQlyb2xlVGFza0NvbXBvc2l0ZS5zZXRPYmplY3Qocm9sZURlc2NyaXB0b3IpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFdvcmtQcm9kdWN0Q29tcG9zaXRlIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IsIGludCB0eXBlKSB7Ci0JCVdvcmtQcm9kdWN0Q29tcG9zaXRlIHdvcmtwcm9kdWN0Q29tcG9zaXRlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3cGMgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGVsZW1lbnQ7Ci0JCQkJaWYod3BjLmdldExpbmtlZEVsZW1lbnQoKSA9PSB0YXNrRGVzY3JpcHRvciAmJiB3cGMuZ2V0VHlwZSgpID09IHR5cGUpIHsJCQkJCQotCQkJCQl3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IHdwYzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmKHdvcmtwcm9kdWN0Q29tcG9zaXRlID09IG51bGwpIHsKLQkJCXdvcmtwcm9kdWN0Q29tcG9zaXRlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJLmNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKCk7Ci0JCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRUeXBlKHR5cGUpOwotCQl9Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldFVNQUNvbnRhaW5lcihnZXRHcmFwaE5vZGUoKSk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldERpYWdyYW0odGhpcyk7Ci0JCXdvcmtwcm9kdWN0Q29tcG9zaXRlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0JCXJldHVybiB3b3JrcHJvZHVjdENvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjZ2V0VHlwZSgpCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyVHlwZSgpCi0JICovCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2dldEJyZWFrZG93bkVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGUoKSB7Ci0JCXJldHVybiBEZXNjcmlwdG9yLmNsYXNzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCN0b05vZGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBOb2RlIHRvTm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJTGlzdCBsaXN0ID0gLy9Bc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcikgZSk7Ci0JCQkJZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcillKTsKLQkJCWlmKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQljcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcygoVGFza0Rlc2NyaXB0b3IpIG9iaiwgZ2V0Tm9kZXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVUYXNrQ29tcG9zaXRlKChSb2xlRGVzY3JpcHRvcikgZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQljcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcygoVGFza0Rlc2NyaXB0b3IpIGUsIGdldE5vZGVzKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNhZGROb2RlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkgewotCQkJZmlsdGVyID0gKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTWzBdKQotCQkJCQkuZ2V0RmlsdGVyKCk7Ci0JCX0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yCi0JCQkJJiYgIWZpbHRlci5hY2NlcHQoKChUYXNrRGVzY3JpcHRvcikgb2JqKQotCQkJCQkJLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJTGlzdCBkZXNjID0gKChUYXNrRGVzY3JpcHRvcikgb2JqKS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVzYy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspCXsKLQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCk7Ci0JCQkJbm9kZSA9IGZpbmROb2RlKHRoaXMsIHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZShyb2xlRGVzY3JpcHRvcik7Ci0JCQkJCWdldE5vZGVzKCkuYWRkKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5vZGUgPSBzdXBlci5hZGROb2RlKGdldE5vZGVzKCksIG9iaik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJbm9kZSA9IHN1cGVyLmFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJfQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlwb3B1bGF0ZUxpbmtzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qobm9kZSksIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjYWRkTm9kZXMoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gYWRkTm9kZXMoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBzdXBlci5hZGROb2Rlcyhjb2xsZWN0aW9uKTsKLQkJaWYgKCFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCXBvcHVsYXRlTGlua3Mobm9kZXMsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3JlbW92ZUZyb21VbWFNb2RlbChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VbWFNb2RlbChOb2RlIHJlbW92ZWROb2RlKSB7Ci0JCS8vIGlmIHRoZSByZW1vdmVkIG5vZGUgaXMgYSBUYXNrTm9kZSB0aGF0IGhhZCBiZWVuIG1vdmVkIHRvIGEKLQkJLy8gUm9sZVRhc2tDb21wb3NpdGUKLQkJLy8gdGhlbiBpdHMgVGFza0Rlc2NyaXB0b3Igd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIG1vZGVsCi0JCS8vCi0JCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsIHJlbW92ZWROb2RlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlbW92ZWROb2RlIGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUKLQkJCQl8fCByZW1vdmVkTm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKQotCQkJcmV0dXJuOwotCi0JCXN1cGVyLnJlbW92ZUZyb21VbWFNb2RlbChyZW1vdmVkTm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIE5vZGUgYWRkZWROb2RlKSB7Ci0JCXN1cGVyLmFkZFRvVW1hTW9kZWwocG9zaXRpb24sIGFkZGVkTm9kZSk7Ci0KLQkJaWYgKGFkZGVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQkvLyB0cmFuc2xhdGUgTm9kZSBpbmRleCB0byBBY3Rpdml0eSBpbmRleAotCQkJaW50IGkgPSB0b0FjdGl2aXR5SW5kZXgocG9zaXRpb24pOwotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiQWN0aXZpdHlEZXRhaWxEaWFncmFtLmFkZFRvVW1hTW9kZWwoKTogV29ya0JyZWFrZG93bkVsZW1lbnQgaW5kZXg6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGkgPT0gLTEpIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoKEJyZWFrZG93bkVsZW1lbnQpIGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChpLCAoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBpbnQgdG9BY3Rpdml0eUluZGV4KGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gaW5kZXg7Ci0JCWludCBzaXplID0gZ2V0Tm9kZXMoKS5zaXplKCk7Ci0JCWludCBpID0gaW5kZXggKyAxOwotCQlpZiAoaSA9PSBzaXplKQotCQkJcmV0dXJuIC0xOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJZm9yICg7ICEobm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpICYmIGkgPCBzaXplOyBpKyspIHsKLQkJCW5vZGUgPSAoTm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCX0KLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJcmV0dXJuIGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2Yobm9kZS5nZXRPYmplY3QoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgTm9kZSBmaW5kTm9kZShBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlckZhY3RvcnlbXSBERUZBVUxUX0FEQVBURVJfRkFDVE9SSUVTID0gewkJCQotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIAotCX07IAotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZVRhc2tJbnB1dE91dHB1dE5vZGVzKFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbGxlY3Rpb24gbm9kZXMpIHsKLQkJTm9kZSBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKCFkZXNjcmlwdG9yLmdldE1hbmRhdG9yeUlucHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKTsKLQkJCW5vZGVzLmFkZChuZXdOb2RlKTsKLQkJfQotCQlpZiAoIWRlc2NyaXB0b3IuZ2V0T3V0cHV0KCkuaXNFbXB0eSgpKSB7Ci0JCQluZXdOb2RlID0gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoZGVzY3JpcHRvciwKLQkJCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUyk7Ci0JCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5EaWFncmFtSW1wbCNzZXROZXcoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXcoYm9vbGVhbiBuKSB7Ci0JCXN1cGVyLnNldE5ldyhuKTsKLQkJaWYobil7Ci0JCQlkb1NldEF1dG9MYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JLyoqCi0JICogRW5hYmxlIHRoaXMgY29kZSwgb25jZSB0aGUgdGFzayBpbmRleCBpcyBmaXhlZCBpbiB0aGUgcm9sZXRhc2tjb21wb3NpdGUuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IG1vdmVkT2JqZWN0LCBpbnQgcG9zaXRpb24sIE9iamVjdCBvbGRQb3NpdGlvbikgewotCQlpZighKG1vdmVkT2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpKQotCQkJcmV0dXJuOwotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvciltb3ZlZE9iamVjdDsKLQkJCi0JCWlmICghZmlsdGVyLmFjY2VwdCh0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKSkKLQkJCXJldHVybjsKLQkJCi0JCUxpc3QgZGVzYyA9ICgoVGFza0Rlc2NyaXB0b3IpIG1vdmVkT2JqZWN0KS5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBkZXNjLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykJewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpOwotCQkJTm9kZSByb2xlTm9kZSA9IGZpbmROb2RlKHRoaXMsIHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmKHJvbGVOb2RlID09IG51bGwpIHJldHVybjsKLQkJCQotCQkJaW50IG9sZFBvcyA9IDA7Ci0JCQlpZihvbGRQb3NpdGlvbiBpbnN0YW5jZW9mIEludGVnZXIpewotCQkJCW9sZFBvcyA9ICgoSW50ZWdlcilvbGRQb3NpdGlvbikuaW50VmFsdWUoKTsKLQkJCX0KLQkJCVRhc2tOb2RlIHRhc2tOb2RlID0gKFRhc2tOb2RlKUdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkoTm9kZUNvbnRhaW5lcilyb2xlTm9kZSwgdGFza0Rlc2NyaXB0b3IsCi0JCQlUYXNrTm9kZS5jbGFzcyk7Ci0JCQkKLQkJCS8vbW92ZSB1cAotCQkJaWYob2xkUG9zID4gcG9zaXRpb24pewotCQkJCWludCBpID0gdGFza05vZGUuZ2V0SW5kZXgoKTsKLQkJCQlOb2RlIHByZXZOb2RlID0gZmluZFRhc2tOb2RlKChSb2xlVGFza0NvbXBvc2l0ZSlyb2xlTm9kZSwgaS0xKTsKLQkJCQlpZihwcmV2Tm9kZSAhPSBudWxsKXsKLQkJCQkJdGFza05vZGUuc2V0SW5kZXgoaS0xKTsKLQkJCQkJKChUYXNrTm9kZSlwcmV2Tm9kZSkuc2V0SW5kZXgoaSk7Ci0JCQl9Ci0JCQkKLQkJCX1lbHNlewotCQkJLy8gbW92ZSBkb3duCi0JCQkJaW50IGkgPSB0YXNrTm9kZS5nZXRJbmRleCgpOwotCQkJCU5vZGUgbmV4dE5vZGUgPSBmaW5kVGFza05vZGUoKFJvbGVUYXNrQ29tcG9zaXRlKXJvbGVOb2RlLCBpKzEpOwotCQkJCWlmKG5leHROb2RlICE9IG51bGwpewotCQkJCQl0YXNrTm9kZS5zZXRJbmRleChpKzEpOwotCQkJCQkoKFRhc2tOb2RlKW5leHROb2RlKS5zZXRJbmRleChpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBOb2RlIGZpbmRUYXNrTm9kZShSb2xlVGFza0NvbXBvc2l0ZSBjb250YWluZXIsIGludCBpbmRleCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrTm9kZSl7Ci0JCQkJaWYoKChUYXNrTm9kZSllbGVtZW50KS5nZXRJbmRleCgpID09IGluZGV4KXsKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRSZWFsaXplZFByaW1hcnlUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcil7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYociAhPSBudWxsKXsKLQkJCUxpc3QgYWN0dWFsTGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocik7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyh0cnVlKTsKLQkJCWZvcihJdGVyYXRvciBpdGVyYXRvciA9IGFjdHVhbExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyl7Ci0JCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYoVG5nVXRpbC5jb250YWlucyhjb2xsZWN0aW9uLCBlKSl7Ci0JCQkJCWxpc3QuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi19IC8vIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGlhZ3JhbUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0FjdGl2aXR5RGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3NjE1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9BY3Rpdml0eURpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEaWFncmFtSW1wbCBleHRlbmRzIERpYWdyYW1JbXBsIGltcGxlbWVudHMgQWN0aXZpdHlEaWFncmFtIHsKLQlwcml2YXRlIGNsYXNzIEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWN0aXZpdHlBZGFwdGVyCi0JCQlpbXBsZW1lbnRzIElBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciB7Ci0KLQl9OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzIGdldERpYWdyYW1DaGFuZ2VMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiBJQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RJQUdSQU07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsKLQkJLy8gQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGRpYWdyYW0gPSBnZXRVTUFEaWFncmFtKCk7Ci0KLQkJLy8gYWRkIFR5cGVkTm9kZXMKLQkJLy8KLQkJTGlzdCB0eXBlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWludCB0eXBlID0gZ2V0VHlwZShlbGVtZW50KTsKLQkJCWlmICh0eXBlID4gMCkgewotCQkJCVR5cGVkTm9kZSBub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUeXBlZE5vZGUoKTsKLQkJCQlub2RlLnNldFR5cGUodHlwZSk7Ci0JCQkJbm9kZS5zZXRPYmplY3QoZWxlbWVudCk7Ci0JCQkJdHlwZWROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwodHlwZWROb2Rlcyk7Ci0KLQkJLy8gYWRkIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZXMKLQkJLy8KLQkJYWRkRWxlbWVudE5vZGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkV29ya09yZGVyKFdvcmtPcmRlciB3bywgT2JqZWN0IHByZWQpIHsKLQkJaWYgKHdvLmdldFByZWQoKSA9PSBwcmVkKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChwcmVkIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcHJlZDsKLQkJCS8vIGNoZWNrIGlmIHByZWRlY2Vzc29yIHJlZmVyZW5jZSBpbiB0aGUgZ2l2ZW4gd29yayBvcmRlciBpcyBiYXNlIG9mCi0JCQkvLyBwcmVkCi0JCQkvLwotCQkJZm9yIChWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOyB2ZSAhPSBudWxsOyB2ZSA9IHZlCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpIHsKLQkJCQlpZiAodmUgPT0gd28uZ2V0UHJlZCgpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChMaW5rIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBsaW5rLmdldFRhcmdldCgpID09IG51bGwKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFNvdXJjZSgpKQotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcygpIHsKLQkJc3VwZXIucG9wdWxhdGVMaW5rcygpOwotCi0JCS8vIHJlbW92ZSB0aGUgaW52YWxpZCBsaW5rcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUgPSBudWxsOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKTsKLQkJCX0KLQkJCUFycmF5TGlzdCBsaW5rc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlua0xpc3RXYWxrOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZQotCQkJCQkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0KLQkJCQlpZiAod2JlICE9IG51bGwpIHsKLQkJCQkJLy8gVE9ETzogbmVlZCByZXZpc2l0IHRvIGNoZWNrIHRoZSB2YWxpZCBjb25uZWN0aW9uIGZyb20gYQotCQkJCQkvLyBUeXBlZE5vZGUKLQkJCQkJLy8KLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUpCi0JCQkJCQljb250aW51ZSBsaW5rTGlzdFdhbGs7Ci0KLQkJCQkJT2JqZWN0IHByZWQgPSBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCQkJCQlib29sZWFuIHdvcmtPcmRlckZvdW5kID0gZmFsc2U7Ci0JCQkJCWZpbmRfV29ya09yZGVyOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9IHdiZQotCQkJCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJaWYgKGlzVmFsaWRXb3JrT3JkZXIod28sIHByZWQpKSB7Ci0JCQkJCQkJd29ya09yZGVyRm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfV29ya09yZGVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghd29ya09yZGVyRm91bmQpIHsKLQkJCQkJCS8vIGludmFsaWQgbGluaywgcmVtb3ZlIGl0Ci0JCQkJCQkvLwotCQkJCQkJbGlua3NUb1JlbW92ZS5hZGQobGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5rc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUxpbmsobGluayk7Ci0JCQl9Ci0JCQlsaW5rc1RvUmVtb3ZlLmNsZWFyKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKCFpc1ZhbGlkKGxpbmspKSB7Ci0JCQkJCWxpbmtzVG9SZW1vdmUuYWRkKGxpbmspOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpbmtzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlTGluayhsaW5rKTsKLQkJCX0KLQkJCWxpbmtzVG9SZW1vdmUuY2xlYXIoKTsKLQkJCWxpbmtzVG9SZW1vdmUgPSBudWxsOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIGxpbmtzIG9mIGVhY2ggQWN0aXZpdHlOb2RlCi0JCS8vIHNldCB0aGUgV29ya09yZGVyIHRvIHRoZSBsaW5rIGlmIG5lZWRlZAotCQkvLyBhZGQgbmV3IGxpbmsgZm9yIHRob3NlIFdvcmtPcmRlcnMgdGhhdCBzdGlsbCBkb24ndCBoYXZlIHRoZQotCQkvLyBjb3JyZXNwb25kaW5nIGxpbmsKLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJaWYgKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQkJLy8gR2V0IHRoZSByYXcgZGF0YSBvZiB3b3Jrb3JkZXJzIGZvciBvYmplY3QuCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgbG9jYWwgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJbGlzdC5hZGRBbGwobG9jYWwuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKSk7Ci0JCQkJCi0JCQkJLy8gR2V0IHRoZSBQcmVkZWNlc3NvciBMaXN0IG9uIHRvcCBvZiByYXcgZGF0YSwgdGhpcyBpcyBuZWVkIGZvciBpbiBjYXNlIG9mIGV4dGVuZC4KLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCS5hZGFwdChsb2NhbCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCQkJbGlzdC5hZGRBbGwoKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0UHJlZGVjZXNzb3JzKCkpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBJdGVyYXRlIHdvcmsgb3JkZXJzIGFuZCBjcmVhdGUgbGlua3MuCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gbnVsbDsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBwcmVkID0gbnVsbDsKLQkJCQkJaWYobmV4dCBpbnN0YW5jZW9mIFdvcmtPcmRlcil7Ci0JCQkJCQl3b3JrT3JkZXIgPSAoV29ya09yZGVyKW5leHQ7Ci0JCQkJCQlwcmVkID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkJCQkJfQotCQkJCQlpZihuZXh0IGluc3RhbmNlb2YgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCQkJcHJlZCA9IChCcmVha2Rvd25FbGVtZW50KSgoV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIpbmV4dCkuZ2V0VGFyZ2V0KCk7IAotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAocHJlZCAhPSBudWxsICYmIHByZWQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQkJTm9kZSBwcmVkTm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJcHJlZCwgdHJ1ZSk7Ci0JCQkJCQlpZiAocHJlZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgbGluayBmb3IgdGhpcyB3b3JrIG9yZGVyCi0JCQkJCQkJLy8gYWxyZWFkeQotCQkJCQkJCS8vCi0JCQkJCQkJYm9vbGVhbiBsaW5rRm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmaW5kX2xpbms6IGZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gbm9kZQotCQkJCQkJCQkJLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQkJCQlpZiAobGluay5nZXRTb3VyY2UoKSA9PSBwcmVkTm9kZSkgewotCQkJCQkJCQkJLy8gbGluayBhbHJlYWR5IGV4aXN0cwotCQkJCQkJCQkJLy8gY2hlY2sgaWYgd29yayBvcmRlciBpcyBzZXQgdG8gdGhpcyBsaW5rCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJbGlua0ZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluawotCQkJCQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCQlpZiAoZWRnZS5nZXRTZW1hbnRpY01vZGVsKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuc2V0U2VtYW50aWNNb2RlbCgKLQkJCQkJCQkJCQkJCWxpbmssIHdvcmtPcmRlcik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhayBmaW5kX2xpbms7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFsaW5rRm91bmQpIHsKLQkJCQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBXb3JrT3JkZXIgY2FuIGJlIHJlcHJlc2VudGVkCi0JCQkJCQkJCS8vIHZpYSBsaW5rcyBvZiBUeXBlZE5vZGVzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmICghY2FuUmVhY2hBc0ZpcnN0QWN0aXZpdHlOb2RlKHByZWROb2RlLCBub2RlKSkgewotCQkJCQkJCQkJLy8gYWRkIG5ldyBsaW5rIGZvciB0aGlzIHdvcmsgb3JkZXIKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGVJbXBsID0gKChOYW1lZE5vZGVJbXBsKSBub2RlKTsKLQkJCQkJCQkJCU5hbWVkTm9kZUltcGwgcHJlZE5vZGVJbXBsID0gKE5hbWVkTm9kZUltcGwpIHByZWROb2RlOwotCQkJCQkJCQkJYm9vbGVhbiBvbGROb3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJYm9vbGVhbiBwcmVkTm9kZU5vdGlmeSA9IHByZWROb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCQkJCQkJcHJlZE5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJCQkJCQlub2RlSW1wbC5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24ocHJlZCk7IAotCQkJCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCQkJCQkJCXByZWROb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZE5vZGVOb3RpZnk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2xlYW5EdXBsaWNhdGVMaW5rcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhbkR1cGxpY2F0ZUxpbmtzKCkgewotCQlMaXN0IGR1cGxpY2F0ZUxpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCU5vZGUgd2JOb2RlID0gKE5vZGUpIG5vZGU7Ci0JCQkJaWYod2JOb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKSAhPSBudWxsKXsKLQkJCQkJZmluZER1cGxpY2F0ZUxpbmtzKGR1cGxpY2F0ZUxpbmtzLCB3Yk5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKTsKLQkJCQl9Ci0JCQkJaWYod2JOb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSAhPW51bGwpewotCQkJCQlmaW5kRHVwbGljYXRlTGlua3MoZHVwbGljYXRlTGlua3MsIHdiTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBkdXBsaWNhdGVMaW5rcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQl9Ci0JCWR1cGxpY2F0ZUxpbmtzLmNsZWFyKCk7Ci0JCWR1cGxpY2F0ZUxpbmtzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZER1cGxpY2F0ZUxpbmtzKExpc3QgZHVwbGljYXRlTGlua3MsIExpc3QgbGlua3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5zaXplKCk7IGkrKykgewotCQkJTGluayBsaW5rID0gKExpbmspIGxpbmtzLmdldChpKTsKLQkJCWlmKCFkdXBsaWNhdGVMaW5rcy5jb250YWlucyhsaW5rKSl7Ci0JCQkJZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgbGlua3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJTGluayBsaW5rMSA9IChMaW5rKSBsaW5rcy5nZXQoaik7Ci0JCQkJCWlmIChsaW5rMS5nZXRTb3VyY2UoKSA9PSBsaW5rLmdldFNvdXJjZSgpCi0JCQkJCQkJJiYgbGluazEuZ2V0VGFyZ2V0KCkgPT0gbGluay5nZXRUYXJnZXQoKSkgewotCQkJCQkJZHVwbGljYXRlTGlua3MuYWRkKGxpbmsxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBOb2RlIHNyYyBjYW4gcmVhY2ggTm9kZSB0YXJnZXQgYXMgdGhlIGZpcnN0IEFjdGl2aXR5Tm9kZSBpbiB0aGUKLQkgKiBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHNyYwotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5SZWFjaEFzRmlyc3RBY3Rpdml0eU5vZGUoTm9kZSBzcmMsIE5vZGUgdGFyZ2V0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNyYy5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRUYXJnZXQoKSA9PSB0YXJnZXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChsaW5rLmdldFRhcmdldCgpIGluc3RhbmNlb2YgVHlwZWROb2RlCi0JCQkJCSYmIGNhblJlYWNoQXNGaXJzdEFjdGl2aXR5Tm9kZShsaW5rLmdldFRhcmdldCgpLCB0YXJnZXQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIHByaXZhdGUgTGlzdCB0b05vZGVzKExpc3QgYWN0aXZpdGllcykgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIGxpc3QuYWRkKHRvTm9kZSgoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCkpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGxpc3Q7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI25ld05vZGUoKQotCSAqLwotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCi0JCQkvL1R1cm4gb2ZmIHRoZSBWYXJpYWJpbGl0eUluZm8gZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtLgotCQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCQlib29sZWFuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9IGZhbHNlOwotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJb2JqID0gKChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpYWRhcHRlcikuZ2V0RGVsZWdhdGluZ0l0ZW1Qcm92aWRlcigpOwotCQkJfQotCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCW9iaiA9IGFkYXB0ZXI7Ci0JCQl9Ci0JCQkKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCWVuYWJsZVZhcmlhYmlsaXR5SW5mbyA9ICgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLmlzRW5hYmxlVmFyaWFiaWxpdHlJbmZvKCk7Ci0JCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKW9iaikuc2V0RW5hYmxlVmFyaWFiaWxpdHlJbmZvKGZhbHNlKTsKLQkJCX0KLQkJCS8vIGVuZCBvZiB2YXJpYWJpbGl0eSBpbmZvIAotCQkJCi0JCQkKLQkJCS8vIHJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKGdldE9iamVjdCgpKTsKLQkJCS8vIGNvbW1lbnRlZCBhYm92ZSBsaW5lLCBGb3IgZGlhZ3JhbXMgLSByb2xsdXAgc2hvdWxkIGJlIGZhbHNlLCBmb3IKLQkJCS8vIGhhbmRsaW5nIHJvbGx1cCBzdGF0ZSBiZWxvdyBjb2RlLgotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWV4dHJhY3RDaGlsZHJlbihhZGFwdGVyLCBnZXRPYmplY3QoKSwgY2hpbGRyZW4sIHRydWUpOwotCQkJCi0JCQkvLyByZXNldCB2YXJpYWJpbGl0eWluZm8gc3RhdHVzIGJhY2sKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpewotCQkJCSgoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilvYmopLnNldEVuYWJsZVZhcmlhYmlsaXR5SW5mbyhlbmFibGVWYXJpYWJpbGl0eUluZm8pOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbGVtZW50Tm9kZXMoKSB7Ci0KLQkJQXJyYXlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBjaGlsZCA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlOYW1lZE5vZGVJbXBsIG5vZGUgPSAoTmFtZWROb2RlSW1wbCkgdG9Ob2RlKChNZXRob2RFbGVtZW50KSBjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZSk7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJbm9kZS5pdGVtUHJvdmlkZXIgPSB3cmFwcGVyOwotCQkJCQkJLy8gVE9ETzogY2hlY2sgaWYgcmVhZE9ubHkgYXR0cmlidXRlIGlzIHN0aWxsIG5lZWRlZAotCQkJCQkJLy8gYWZ0ZXIgaW50cm9kdWN0aW9uIG9mIGl0ZW1Qcm92aWRlcgotCQkJCQkJLy8KLQkJCQkJCW5vZGUucmVhZE9ubHkgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VHlwZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBHcmFwaE5vZGUpIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgb2JqOwotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IG5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgdHlwZSA9ICgoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIG1vZGVsQnJpZGdlKQotCQkJCQkJLmdldFR5cGVJbmZvKCk7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9TWU5DSF9CQVIuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1lOQ0hfQkFSOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0RFQ0lTSU9OLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkRFQ0lTSU9OOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0VORC5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5FTkQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1RBUlQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuU1RBUlQ7Ci0JCQkJfSBlbHNlIGlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfRlJFRV9URVhUCi0JCQkJCQkuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRlJFRV9URVhUOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgaW50IHRvQWN0aXZpdHlJbmRleChpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIGluZGV4OwotCQlpbnQgc2l6ZSA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQlpbnQgaSA9IGluZGV4ICsgMTsKLQkJaWYgKGkgPT0gc2l6ZSkKLQkJCXJldHVybiAtMTsKLQkJTm9kZSBub2RlID0gKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWZvciAoOyAhKG5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSAmJiBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlub2RlID0gKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpOwotCQl9Ci0JCWlmIChpID09IHNpemUpCi0JCQlyZXR1cm4gLTE7Ci0JCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCXJldHVybiBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKG5vZGUuZ2V0T2JqZWN0KCkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI2FkZFRvVW1hTW9kZWwoaW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1VtYU1vZGVsKGludCBwb3NpdGlvbiwgTm9kZSBhZGRlZE5vZGUpIHsKLQkJaWYgKGFkZGVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0KLQkJCS8vIHRyYW5zbGF0ZSBBY3Rpdml0eU5vZGUgaW5kZXggdG8gQWN0aXZpdHkgaW5kZXgKLQkJCS8vCi0JCQlpbnQgaSA9IHRvQWN0aXZpdHlJbmRleChwb3NpdGlvbik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRpYWdyYW1JbXBsLmFkZFRvVW1hTW9kZWwoKToKLQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50IGluZGV4OiAiICsgaSk7Ci0JCQlpZiAoaSA9PSAtMSkgewotCQkJCWFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZCgoQnJlYWtkb3duRWxlbWVudCkgYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGksIChCcmVha2Rvd25FbGVtZW50KSBhZGRlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuRGlhZ3JhbUltcGwjYWRkTm9kZShqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmo7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJTm9kZUltcGwgYmFzZU5vZGUgPSAoTm9kZUltcGwpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJCQl0aGlzLCBiYXNlKTsKLQkJCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gYmFzZU5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGFjdCkgewotCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWJhc2VOb2RlID0gKE5vZGVJbXBsKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQkJYWN0KTsKLQkJCQl9Ci0JCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzYXNzb2NpYXRlIHdpdGggdGhlIGJhc2UKLQkJCQkJLy8KLQkJCQkJaWYgKGJhc2VOb2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VOb2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJCQkJfQotCi0JCQkJCWJhc2VOb2RlLmJhc2ljU2V0T2JqZWN0KGFjdCk7Ci0JCQkJCWJhc2VOb2RlLnNldFJlYWRPbmx5KGZhbHNlKTsKLQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFkZE5vZGUobm9kZXMsIG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkRpYWdyYW1JbXBsI3JlbW92ZU5vZGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVOb2RlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkvLyBmaW5kIGV4aXN0aW5nIG5vZGUgZm9yIHRoZSBvbGQgYWN0aXZpdHkgYW5kIHJlbGluayBpdCB0byBpdHMKLQkJCQkvLyBiYXNlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMsCi0JCQkJCQlhY3QpOwotCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChicmlkZ2UuZ2V0RWxlbWVudCgpICE9IGJhc2UpIHsKLQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KGJhc2UpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbm9kZSA9IChOb2RlSW1wbCkgR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSh0aGlzLCBiYXNlKTsKLQkJCQl9Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBkaXNhc3NvY2lhdGUgd2l0aCB0aGUgb2xkIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCWlmIChub2RlLm1ldGhvZEVsZW1lbnRBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCWFjdC5lQWRhcHRlcnMoKS5yZW1vdmUobm9kZS5tZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQkJCX0KLQotCQkJCQlub2RlLmJhc2ljU2V0T2JqZWN0KGJhc2UpOwotCQkJCQlub2RlLnNldFJlYWRPbmx5KHRydWUpOwotCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlbW92ZU5vZGUob2JqKTsKLQl9Ci0JLyoqCi0JICogTW92ZWQgY29kZSBmcm9tIGdldENoaWxkcmVuLiBnZXRBZGFwdGVyKCkgd2lsbCByZXR1cm4gQWRhcHRlciwKLQkgKiB3aGljaCB3aWxsIGFsbG93IHVzIHRvIGZpbmQgaXRlbXByb3ZpZGVyIGZvciB0aGUgY2hpbGRyZW4uIAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBnZXRBZGFwdGVyKCl7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IHdyYXBwZXI7Ci0JCX0gZWxzZSB7Ci0JCQkKLQkJCWFkYXB0ZXIgPShJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpZ2V0QWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJZ2V0T2JqZWN0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeTsKLQl9Ci19IC8vIEFjdGl2aXR5RGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0RpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9EaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJhZTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0RpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lckltcGwgaW1wbGVtZW50cyBEaWFncmFtIHsKLQotCXByaXZhdGUgYm9vbGVhbiBuZXdEaWFncmFtOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAvLwotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0vLwotCi0JcHJvdGVjdGVkIGNsYXNzIEFjdGl2aXR5QWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayBpbXBsZW1lbnRzCi0JCQlJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklEaWFncmFtQ2hhbmdlTGlzdGVuZXIjZ2V0RGlhZ3JhbSgpCi0JCSAqLwotCQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQkJcmV0dXJuIERpYWdyYW1JbXBsLnRoaXM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgYWRkTm9kZShtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IGJhc2VBY3QpIHsKLQkJCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVOb2RlKG1zZy5nZXRPbGRWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gbm9kZXMgPSBhZGROb2RlcygoQ29sbGVjdGlvbikgbXNnCi0JCQkJCQkJLmdldE5ld1ZhbHVlKCkpOwotCQkJCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gYmFzZUFjdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGUgPSAoTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCQkJCW5vZGUuc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCXJlbW92ZU5vZGVzKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLk1PVkU6Ci0JCQkJCW1vdmVOb2RlKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0UG9zaXRpb24oKSwgbXNnLmdldE9sZFZhbHVlKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgQWN0aXZpdHkgYmFzZUFjdDsKLQotCXByaXZhdGUgT2JqZWN0IGRpYWdyYW1BZGFwdGVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCWlmICghbm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJCQlyZXR1cm47Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCS8vQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGlhZ3JhbS5jbGFzcykpIHsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNX19OT0RFUzoKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBpbmRleD0iICsKLQkJCQkJLy8gbXNnLmdldFBvc2l0aW9uKCkpOwotCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb247Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW5vZGVBZGRlZChtc2cuZ2V0UG9zaXRpb24oKSwgKE5vZGUpIG1zZwotCQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCW5vZGVSZW1vdmVkKChOb2RlKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlub2RlQWRkZWQobXNnLmdldFBvc2l0aW9uKCksIG5vZGUpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW5vZGVSZW1vdmVkKChOb2RlKSBpdGVyLm5leHQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIE5vZGUgYWRkTm9kZShPYmplY3Qgb2JqKSB7Ci0JCU5vZGUgbm9kZSA9IGFkZE5vZGUoZ2V0Tm9kZXMoKSwgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBub2RlOwotCQlwb3B1bGF0ZUxpbmtzKG5vZGUsIHRydWUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBvYmopIHsKLQkJaWYgKFRuZ1V0aWwuaXNJbnN0YW5jZU9mKGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpLCBvYmopKSB7Ci0JCQlOb2RlIG5vZGUgPSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZE5vZGVzKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYWRkTm9kZShub2RlcywgaXRlci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gdXNlIGFkZEFsbCgpIHRvIGF2b2lkIHVubmVjZXNzYXJ5IG5vdGlmaWNhdGlvbnMKLQkJLy8KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZU5vZGUoT2JqZWN0IG9iaikgewotCQlpZiAoIVRuZ1V0aWwuaXNJbnN0YW5jZU9mKGdldEJyZWFrZG93bkVsZW1lbnRUeXBlcygpLCBvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgb2JqKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJfQotCQlub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQlub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCi0JCWdldE5vZGVzKCkucmVtb3ZlKG5vZGUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXJlbW92ZU5vZGUoaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtI2dldFVNQURpYWdyYW0oKQotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZ2V0VU1BRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIChvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0pIGdldEdyYXBoTm9kZSgpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRCcmVha2Rvd25FbGVtZW50VHlwZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChpbnQgaW5kZXgsIE5vZGUgbm9kZSkgewotCQlhZGRUb1VtYU1vZGVsKGluZGV4LCBub2RlKTsKLQkJbm9kZS5hZGRDb25zdW1lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJcmVtb3ZlRnJvbVVtYU1vZGVsKG5vZGUpOwotCQlub2RlLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmV3KCkgewotCQlyZXR1cm4gdGhpcy5uZXdEaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5ldyhib29sZWFuIG4pIHsKLQkJdGhpcy5uZXdEaWFncmFtID0gbjsKLQl9Ci0KLQkvKioKLQkgKiBOT1RFOiB0aGlzIG1ldGhvZCBpcyByZS1lbnRyYW50LCBtYWtlIHN1cmUgdG8gaGFuZGxlIHRoZSBkYXRhIGNvcnJlY3RseSB0byBhdm9pZCBtZW1vcnkgbGVhayBhbmQgZGF0YSBjb3JydXB0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld09iamVjdAotCSAqICAgICAgICAgICAgbXVzdCBiZSBhbiBBY3Rpdml0eQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG5ld09iamVjdCkKLQkJCQkJCS5pc1JlYWRPbmx5KCkpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG5ld09iamVjdDsKLQkJCXNldFJlYWRPbmx5KHRydWUpOwotCQl9Ci0JCW5ld09iamVjdCA9IFRuZ1V0aWwudW53cmFwKG5ld09iamVjdCk7Ci0KLQkJb2JqZWN0ID0gbmV3T2JqZWN0OwotCi0JCS8vIGFkZCBkaWFncmFtIGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgbGlua2VkIG9iamVjdC4gUmVtb3ZlIHRoZSBvbGQKLQkJLy8gbGlzdGVuZXIgaWYgdGhlcmUgaXMgYW55LgotCQkvLyBCdXQgZmlyc3Qga2VlcCB0aGUgb2xkIGxpc3RlbmVyIHRvIGhlbHAgZmluZCB0aGUgVU1BIGRpYWdyYW0gb2YgdGhlCi0JCS8vIGFjdGl2aXR5IHF1aWNrbHkuCi0JCS8vCi0JCUFjdGl2aXR5IGUgPSAoQWN0aXZpdHkpIG5ld09iamVjdDsJCQotCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhlKSkgewotCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCX0KLQkJYmFzZUFjdCA9IG51bGw7Ci0JCQotCQlpZihuZXdPYmplY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gc2V0IHRoZSBVTUEgZGlhZ3JhbSBmb3IgdGhpcyBkaWFncmFtCi0JCS8vCi0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCWdyYXBoTm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShlLAotCQkJCQlnZXRUeXBlKCksIGZhbHNlKTsKLQkJCS8vIHNldCB0aGUgZmxhZyB0byBpbmRpY2F0ZSB0aGlzIGlzIGEgbmV3IGRpYWdyYW0gb3Igbm90Ci0JCQlpZiAoZ3JhcGhOb2RlID09IG51bGwpIHsKLQkJCQlncmFwaE5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oZSwKLQkJCQkJCWdldFR5cGUoKSwgdHJ1ZSk7Ci0JCQkJc2V0TmV3KHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYoIWUuZUFkYXB0ZXJzKCkuY29udGFpbnMoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKSkgewotCQkJZS5lQWRhcHRlcnMoKS5hZGQoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCQlpZiAoYmFzZUFjdCAhPSBudWxsICYmICFiYXNlQWN0LmVBZGFwdGVycygpLmNvbnRhaW5zKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcikpIHsKLQkJCWJhc2VBY3QuZUFkYXB0ZXJzKCkuYWRkKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlwb3B1bGF0ZURpYWdyYW0oKTsKLQotCQlpZighZUFkYXB0ZXJzKCkuY29udGFpbnMoZGlhZ3JhbUFkYXB0ZXIpKSB7Ci0JCQl0aGlzLmVBZGFwdGVycygpLmFkZCgoQWRhcHRlcikgZGlhZ3JhbUFkYXB0ZXIpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBQb3B1bGF0ZXMgdGhlIGRpYWdyYW0gd2l0aCB0aGUgZGF0YSBmcm9tIHRoZSBVTUEgbW9kZWwuIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRGlhZ3JhbSgpIHsKLQkJcG9wdWxhdGVOb2RlcygpOwotCQlwb3B1bGF0ZUxpbmtzKCk7Ci0KLQkJLy8gYWRkIHRoaXMgZGlhZ3JhbSB0byB0aGUgY29uc3VtZXIgbGlzdCBvZiBhbGwgbm9kZXMgc28gdGhleSB3aWxsIG5vdAotCQkvLyBiZSBkaXNwb3NlZAotCQkvLyBiZWZvcmUgdGhpcyBkaWFncmFtLgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQlub2RlLmFkZENvbnN1bWVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSBpbmNvbWluZy9vdXRnb2luZyBsaW5rcyBvZiB0aGUgZ2l2ZW4gbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVMaW5rcyhOb2RlIG5vZGUsIGJvb2xlYW4gZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCWJvb2xlYW5bXSBub3RpZmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZGlzYWJsZU5vdGlmaWNhdGlvbikgewotCQkJCXNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJCQlub3RpZmllcyA9IG5ldyBib29sZWFuW3NpemVdOwotCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIGZvciBhbGwgbm9kZXMgaW4gdGhpcyBkaWFncmFtIHRvIGF2b2lkCi0JCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlOb2RlIGNoaWxkID0gKChOb2RlKSBnZXROb2RlcygpLmdldChpKSk7Ci0JCQkJCW5vdGlmaWVzW2ldID0gY2hpbGQuZURlbGl2ZXIoKTsKLQkJCQkJY2hpbGQuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQotCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IG5vZGUuZ2V0R3JhcGhOb2RlKCk7Ci0JCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmZpbGxDb25uZWN0aW9ucyhub2RlLCBncmFwaE5vZGUpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGRpc2FibGVOb3RpZmljYXRpb24pIHsKLQkJCQkvLyByZXN0b3JlIG5vdGlmaWNhdGlvbiBmbGFnCi0JCQkJLy8KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkoKEVPYmplY3QpIGdldE5vZGVzKCkuZ2V0KGkpKS5lU2V0RGVsaXZlcihub3RpZmllc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVOb2RlcygpIHsJCQotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKTsKLQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlMaXN0IHR5cGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaW50IHR5cGUgPSBnZXRUeXBlKGVsZW1lbnQpOwotCQkJCWlmICh0eXBlID4gMCkgewotCQkJCQlUeXBlZE5vZGUgbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHlwZWROb2RlKCk7Ci0JCQkJCW5vZGUuc2V0VHlwZSh0eXBlKTsKLQkJCQkJbm9kZS5zZXRPYmplY3QoZWxlbWVudCk7Ci0JCQkJCXR5cGVkTm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWdldE5vZGVzKCkuYWRkQWxsKHR5cGVkTm9kZXMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFR5cGUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIG9iajsKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBub2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KSBtb2RlbEJyaWRnZSkKLQkJCQkJCS5nZXRUeXBlSW5mbygpOwotCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLkdSQVBIX05PREVfU1lOQ0hfQkFSLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNZTkNIX0JBUjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9ERUNJU0lPTi5lcXVhbHModHlwZSkpIHsKLQkJCQkJcmV0dXJuIFR5cGVkTm9kZS5ERUNJU0lPTjsKLQkJCQl9IGVsc2UgaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuR1JBUEhfTk9ERV9FTkQuZXF1YWxzKHR5cGUpKSB7Ci0JCQkJCXJldHVybiBUeXBlZE5vZGUuRU5EOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX1NUQVJULmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLlNUQVJUOwotCQkJCX0gZWxzZSBpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVAotCQkJCQkJLmVxdWFscyh0eXBlKSkgewotCQkJCQlyZXR1cm4gVHlwZWROb2RlLkZSRUVfVEVYVDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTGlua3MoKSB7Ci0JCS8vIGZpbGwgb3V0Z29pbmcvaW5jb21pbmcgY29ubmVjdGlvbiBsaXN0cyBvZiBhbGwgbm9kZXMKLQkJLy8KLQkJaW50IHNpemUgPSBnZXROb2RlcygpLnNpemUoKTsKLQkJYm9vbGVhbltdIG5vdGlmaWVzID0gbmV3IGJvb2xlYW5bc2l6ZV07Ci0JCXRyeSB7Ci0JCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBmb3IgYWxsIG5vZGVzIGluIHRoaXMgZGlhZ3JhbSB0byBhdm9pZAotCQkJLy8gdW53YW50ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgdGhlaXIgY29ubmVjdGlvbiBsaXN0Ci0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQlOb2RlIG5vZGUgPSAoKE5vZGUpIGdldE5vZGVzKCkuZ2V0KGkpKTsKLQkJCQlub3RpZmllc1tpXSA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJCQlub2RlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCXBvcHVsYXRlTGlua3Mobm9kZSwgZmFsc2UpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSBub3RpZmljYXRpb24gZmxhZwotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChFT2JqZWN0KSBnZXROb2RlcygpLmdldChpKSkuZVNldERlbGl2ZXIobm90aWZpZXNbaV0pOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkYXRhIGZvciB0aGUgcmVtb3ZlZCBub2RlIGZyb20gdGhlIFVNQSBtb2RlbCBTdWJjbGFzcyBzaG91bGQKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVtb3ZlZE5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVW1hTW9kZWwoTm9kZSByZW1vdmVkTm9kZSkgewotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGdldE9iamVjdCgpOwotCQlpZiAocmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUocmVtb3ZlZE5vZGUuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCQotCQlpZihnZXRVTUFEaWFncmFtKCkgIT0gbnVsbCkgewotCQkJZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLnJlbW92ZShyZW1vdmVkTm9kZS5nZXRHcmFwaE5vZGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBkYXRhIGZvciB0aGUgbmV3bHkgYWRkZWQgbm9kZSB0byB0aGUgVU1BIG1vZGVsIFN1YmNsYXNzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRvVW1hTW9kZWwoaW50IHBvc2l0aW9uLCBOb2RlIGFkZGVkTm9kZSkgewotCi0JCWlmIChhZGRlZE5vZGUuZ2V0R3JhcGhOb2RlKCkgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBub2RlIGlzIHJlYWRkZWQgYWZ0ZXIgdW5kbwotCQkJLy8KLQkJCSgoTm9kZUltcGwpIGFkZGVkTm9kZSkuYmFzaWNTZXRPYmplY3QoYWRkZWROb2RlLmdldE9iamVjdCgpKTsKLQkJfQotCQkKLQkJaWYoZ2V0VU1BRGlhZ3JhbSgpICE9IG51bGwpIHsKLQkJCWdldFVNQURpYWdyYW0oKS5nZXRDb250YWluZWQoKS5hZGQoYWRkZWROb2RlLmdldEdyYXBoTm9kZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgbmV3IG5vZGUgZm9yIHRoaXMgZGlhZ3JhbSBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgdG9Ob2RlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlOb2RlIG5vZGUgPSBuZXdOb2RlKCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbm9kZS5zZXRVTUFEaWFncmFtKGdldFVNQURpYWdyYW0oKSk7Ci0JCW5vZGUuc2V0RGlhZ3JhbSh0aGlzKTsKLQkJbm9kZS5zZXRPYmplY3QoZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2Rpc3Bvc2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkaWFncmFtQ2hhbmdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0JCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQkJYmFzZUFjdC5lQWRhcHRlcnMoKS5yZW1vdmUoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCWUuZUFkYXB0ZXJzKCkucmVtb3ZlKGRpYWdyYW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtI3NldERlZmF1bHROYW1lKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOYW1lZE5vZGUgbmV3Tm9kZSkgewotCQlNZXRob2RFbGVtZW50IG9iaiA9IChNZXRob2RFbGVtZW50KSBuZXdOb2RlLmdldE9iamVjdCgpOwotCQlpbnQgY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRPYmplY3QoKTsKLQkJQXJyYXlMaXN0IHNpYmxpbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpID09IGNsYXNzSUQpIHsKLQkJCQlzaWJsaW5ncy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGJhc2VOYW1lID0gTWVzc2FnZUZvcm1hdAotCQkJCS5mb3JtYXQoCi0JCQkJCQlEaWFncmFtUmVzb3VyY2VzLmRlZmF1bHRCYXNlTmFtZSwgbmV3IE9iamVjdFtdIHsgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmouZUNsYXNzKCkuZ2V0TmFtZSgpKSB9KTsgCi0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoc2libGluZ3MsIG9iaiwgYmFzZU5hbWUpOwotCQluZXdOb2RlLnNldE5hbWUob2JqLmdldE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4dHJhY3RDaGlsZHJlbihJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgT2JqZWN0IG9iamVjdCwgQ29sbGVjdGlvbiBjaGlsZHJlbiwKLQkJCWJvb2xlYW4gZmlsdGVyU3VwcHJlc3NlZCkgewotCQkvLyBkaXNhYmxlIHJvbGx1cCBiZWZvcmUgZ2V0dGluZyB0aGUgY2hpbGRyZW4KLQkJLy8KLQkJYm9vbGVhbiBvbGRSb2xsZWRVcCA9IGZhbHNlOwotCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCWVsc2UgaWYoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcil7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJb2xkUm9sbGVkVXAgPSBpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpOwotCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCS8vIGZpbHRlciBvdXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCS8vCi0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJaWYoZmlsdGVyU3VwcHJlc3NlZCl7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYoIWdldFN1cHByZXNzaW9uKCkuaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9ZWxzZXsKLQkJCQkJLy8gZG9uJ3QgZmlsdGVyIHN1cHByZXNzZWQgZWxlbWVudHMKLQkJCQkJLy8KLQkJCQkJY2hpbGRyZW4uYWRkQWxsKGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkLXVwIGZsYWcKLQkJCS8vCi0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKCkgewotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogSW4gUHJvY2VzcyBXQlMsIGlmIGJyZWFrZG93bmVsZW1lbnQgaXMgbW92ZWQKLQkgKiB1cCBvciBkb3duLCBkaWFncmFtIHNob3VsZCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LiAKLQkgKiBTdWItY2xhc3Mgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGRpYWdyYW0gbmVlZHMgdXBkYXRlIG9uIG1vdmUuIAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqIEBwYXJhbSBuZXdwb3NpdGlvbiBpbnQKLQkgKiBAcGFyYW0gb2xkUG9zaXRpb24gT2JqZWN0KEludGVnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZU5vZGUoT2JqZWN0IG1vdmVkT2JqZWN0LCBpbnQgcG9zaXRpb24sIE9iamVjdCBvbGRQb3NpdGlvbikgewotCX0KLQkJCi0JcHVibGljIGJvb2xlYW4gaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBncmFwaGljYWxEYXRhUmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhpY2FsRGF0YVJlcXVpcmVkKGJvb2xlYW4gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsRGF0YVJlcXVpcmVkID0gZ3JhcGhpY2FsRGF0YVJlcXVpcmVkOwotCX0KLQkJCi0JcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRXcmFwcGVyKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdyYXBoaWNhbERhdGFSZXF1aXJlZCA9IHRydWU7Ci0KLX0gLy8gRGlhZ3JhbUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY5MWY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldFRhcmdldCA8ZW0+VGFyZ2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLkxpbmtJbXBsI2dldEJlbmRwb2ludHMgPGVtPkJlbmRwb2ludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0U291cmNlRW5kUG9pbnQgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTGlua0ltcGwjZ2V0VGFyZ2V0RW5kUG9pbnQgPGVtPlRhcmdldCBFbmQgUG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rSW1wbCBleHRlbmRzIExpbmtlZE9iamVjdEltcGwgaW1wbGVtZW50cyBMaW5rIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldCgpIDxlbT5UYXJnZXQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIHRhcmdldDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJlbmRwb2ludHMoKSA8ZW0+QmVuZHBvaW50czwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmVuZHBvaW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFic29sdXRlQmVuZHBvaW50PiBiZW5kcG9pbnRzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZUVuZFBvaW50KCkgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQb2ludCBTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZUVuZFBvaW50KCkgPGVtPlNvdXJjZSBFbmQgUG9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTb3VyY2VFbmRQb2ludCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHNvdXJjZUVuZFBvaW50ID0gU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbmRQb2ludCgpIDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUG9pbnQgVEFSR0VUX0VORF9QT0lOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRFbmRQb2ludCgpIDxlbT5UYXJnZXQgRW5kIFBvaW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0RW5kUG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB0YXJnZXRFbmRQb2ludCA9IFRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmtJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRTb3VyY2UoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UpIHJldHVybiBudWxsOwotCQlyZXR1cm4gKE5vZGUpZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNvdXJjZShOb2RlIG5ld1NvdXJjZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpbmV3U291cmNlLCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFLCBtc2dzKTsKLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNvdXJjZShOb2RlIG5ld1NvdXJjZSkgewotCQlpZiAobmV3U291cmNlICE9IGVJbnRlcm5hbENvbnRhaW5lcigpIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0UgJiYgbmV3U291cmNlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3U291cmNlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdTb3VyY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U291cmNlKS5lSW52ZXJzZUFkZCh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U291cmNlKG5ld1NvdXJjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFLCBuZXdTb3VyY2UsIG5ld1NvdXJjZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRUYXJnZXQoKSB7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFRhcmdldCA9IChJbnRlcm5hbEVPYmplY3QpdGFyZ2V0OwotCQkJdGFyZ2V0ID0gKE5vZGUpZVJlc29sdmVQcm94eShvbGRUYXJnZXQpOwotCQkJaWYgKHRhcmdldCAhPSBvbGRUYXJnZXQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VULCBvbGRUYXJnZXQsIHRhcmdldCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb2RlIGJhc2ljR2V0VGFyZ2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYXJnZXQoTm9kZSBuZXdUYXJnZXQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTm9kZSBvbGRUYXJnZXQgPSB0YXJnZXQ7Ci0JCXRhcmdldCA9IG5ld1RhcmdldDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCwgb2xkVGFyZ2V0LCBuZXdUYXJnZXQpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXQoTm9kZSBuZXdUYXJnZXQpIHsKLQkJaWYgKG5ld1RhcmdldCAhPSB0YXJnZXQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhcmdldCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXJnZXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3VGFyZ2V0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhcmdldCkuZUludmVyc2VBZGQodGhpcywgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TLCBOb2RlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhcmdldChuZXdUYXJnZXQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVCwgbmV3VGFyZ2V0LCBuZXdUYXJnZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEFic29sdXRlQmVuZHBvaW50PiBnZXRCZW5kcG9pbnRzKCkgewotCQlpZiAoYmVuZHBvaW50cyA9PSBudWxsKSB7Ci0JCQliZW5kcG9pbnRzID0gbmV3IEVEYXRhVHlwZVVuaXF1ZUVMaXN0PEFic29sdXRlQmVuZHBvaW50PihBYnNvbHV0ZUJlbmRwb2ludC5jbGFzcywgdGhpcywgTW9kZWxQYWNrYWdlLkxJTktfX0JFTkRQT0lOVFMpOwotCQl9Ci0JCXJldHVybiBiZW5kcG9pbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0U291cmNlRW5kUG9pbnQoKSB7Ci0JCXJldHVybiBzb3VyY2VFbmRQb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlRW5kUG9pbnQoUG9pbnQgbmV3U291cmNlRW5kUG9pbnQpIHsKLQkJUG9pbnQgb2xkU291cmNlRW5kUG9pbnQgPSBzb3VyY2VFbmRQb2ludDsKLQkJc291cmNlRW5kUG9pbnQgPSBuZXdTb3VyY2VFbmRQb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQsIG9sZFNvdXJjZUVuZFBvaW50LCBzb3VyY2VFbmRQb2ludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0VGFyZ2V0RW5kUG9pbnQoKSB7Ci0JCXJldHVybiB0YXJnZXRFbmRQb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW5kUG9pbnQoUG9pbnQgbmV3VGFyZ2V0RW5kUG9pbnQpIHsKLQkJUG9pbnQgb2xkVGFyZ2V0RW5kUG9pbnQgPSB0YXJnZXRFbmRQb2ludDsKLQkJdGFyZ2V0RW5kUG9pbnQgPSBuZXdUYXJnZXRFbmRQb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQsIG9sZFRhcmdldEVuZFBvaW50LCB0YXJnZXRFbmRQb2ludCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U291cmNlKChOb2RlKW90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXJnZXQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUywgTm9kZS5jbGFzcywgbXNncyk7Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGFyZ2V0KChOb2RlKW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXJldHVybiBiYXNpY1NldFNvdXJjZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYXJnZXQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFOgotCQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fT1VUR09JTkdfQ09OTkVDVElPTlMsIE5vZGUuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0VGFyZ2V0KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0VGFyZ2V0KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCXJldHVybiBnZXRCZW5kcG9pbnRzKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0VfRU5EX1BPSU5UOgotCQkJCXJldHVybiBnZXRTb3VyY2VFbmRQb2ludCgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJc2V0U291cmNlKChOb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQ6Ci0JCQkJc2V0VGFyZ2V0KChOb2RlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCWdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQkJCWdldEJlbmRwb2ludHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEFic29sdXRlQmVuZHBvaW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQlzZXRTb3VyY2VFbmRQb2ludCgoUG9pbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVF9FTkRfUE9JTlQ6Ci0JCQkJc2V0VGFyZ2V0RW5kUG9pbnQoKFBvaW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlzZXRTb3VyY2UoKE5vZGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUOgotCQkJCXNldFRhcmdldCgoTm9kZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCWdldEJlbmRwb2ludHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJc2V0U291cmNlRW5kUG9pbnQoU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fVEFSR0VUX0VORF9QT0lOVDoKLQkJCQlzZXRUYXJnZXRFbmRQb2ludChUQVJHRVRfRU5EX1BPSU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0U291cmNlKCkgIT0gbnVsbDsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQlyZXR1cm4gdGFyZ2V0ICE9IG51bGw7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19CRU5EUE9JTlRTOgotCQkJCXJldHVybiBiZW5kcG9pbnRzICE9IG51bGwgJiYgIWJlbmRwb2ludHMuaXNFbXB0eSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fU09VUkNFX0VORF9QT0lOVDoKLQkJCQlyZXR1cm4gU09VUkNFX0VORF9QT0lOVF9FREVGQVVMVCA9PSBudWxsID8gc291cmNlRW5kUG9pbnQgIT0gbnVsbCA6ICFTT1VSQ0VfRU5EX1BPSU5UX0VERUZBVUxULmVxdWFscyhzb3VyY2VFbmRQb2ludCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCXJldHVybiBUQVJHRVRfRU5EX1BPSU5UX0VERUZBVUxUID09IG51bGwgPyB0YXJnZXRFbmRQb2ludCAhPSBudWxsIDogIVRBUkdFVF9FTkRfUE9JTlRfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVuZFBvaW50KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJlbmRwb2ludHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYmVuZHBvaW50cyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc291cmNlRW5kUG9pbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc291cmNlRW5kUG9pbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhcmdldEVuZFBvaW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRhcmdldEVuZFBvaW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0KLQkJaWYgKG5ld09iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbmV3T2JqZWN0OwotCi0JCS8vIGNvcHkgYmVuZHBvaW50cyBmcm9tIGVkZ2UKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWRnZS5nZXRXYXlwb2ludHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWdldEJlbmRwb2ludHMoKS5hZGQoCi0JCQkJCW5ldyBBYnNvbHV0ZUJlbmRwb2ludChHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJLnRvUG9pbnQoKG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQpIGl0ZXIubmV4dCgpKSkpOwotCQl9Ci0KLQkJLy8gY29weSBlbmQgcG9pbnRzIGZyb20gR3JhcGhDb25uZWN0b3JzCi0JCS8vCi0JCWlmIChnZXRTb3VyY2VHcmFwaENvbm5lY3RvcigpLmdldFBvc2l0aW9uKCkgIT0gbnVsbCkgewotCQkJc291cmNlRW5kUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCS50b1BvaW50KGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSk7Ci0JCX0KLQkJaWYgKGdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkuZ2V0UG9zaXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0YXJnZXRFbmRQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLnRvUG9pbnQoZ2V0VGFyZ2V0R3JhcGhDb25uZWN0b3IoKS5nZXRQb3NpdGlvbigpKTsKLQkJfQotCQkJCQotCQllQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlQb2ludCBwOwotCQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCk7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKExpbmsuY2xhc3MpKSB7Ci0JCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS19fQkVORFBPSU5UUzoKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpbnQgaW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgdW1hUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5uZXdNb2RlbFBvaW50KHAueCwgcC55KTsKLQkJCQkJCWlmIChpbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZCh1bWFQb2ludCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkuYWRkKGluZGV4LCB1bWFQb2ludCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCS8vIHAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJLy8gZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KHAueCwKLQkJCQkJCS8vIHAueSkpOwotCi0JCQkJCQlpbmRleCA9IG1zZy5nZXRQb3NpdGlvbigpOwotCQkJCQkJaWYgKGluZGV4ID09IE5vdGlmaWNhdGlvbi5OT19JTkRFWCkgewotCQkJCQkJCWVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKG1zZy5nZXRQb3NpdGlvbigpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5yZW1vdmUoaW5kZXgpOwotCQkJCQkJfQotCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJQXJyYXlMaXN0IHVtYVBvaW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCXAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXVtYVBvaW50cy5hZGQoR3JhcGhpY2FsRGF0YUhlbHBlci5uZXdNb2RlbFBvaW50KAotCQkJCQkJCQkJcC54LCBwLnkpKTsKLQkJCQkJCX0KLQkJCQkJCWluZGV4ID0gbXNnLmdldFBvc2l0aW9uKCk7Ci0JCQkJCQlpZiAoaW5kZXggPT0gTm90aWZpY2F0aW9uLk5PX0lOREVYKSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGRBbGwodW1hUG9pbnRzKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRnZS5nZXRXYXlwb2ludHMoKS5hZGRBbGwoaW5kZXgsIHVtYVBvaW50cyk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkvLyBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkJLy8gcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCS8vIGVkZ2UuZ2V0V2F5cG9pbnRzKCkucmVtb3ZlKEdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsCi0JCQkJCS8vIHAueSkpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIHJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJcCA9IChBYnNvbHV0ZUJlbmRwb2ludCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJCVBvaW50IG9sZHAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaW50IHBvaW50SW5kZXggPSBtc2cuZ2V0UG9zaXRpb24oKTsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgbmV3VW1hUG9pbnQgPSBHcmFwaGljYWxEYXRhSGVscGVyCi0JCQkJCQkJCS5uZXdNb2RlbFBvaW50KHAueCwgcC55KTsKLS8vCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBvbGRVbWFQb2ludCA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLS8vCQkJCQkJCQkubmV3TW9kZWxQb2ludChvbGRwLngsIG9sZHAueSk7Ci0JCQkJCQlpZiAocG9pbnRJbmRleCA9PSBOb3RpZmljYXRpb24uTk9fSU5ERVgpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiSW5kZXggZm9yIGJlbmRwb2ludCBpcyAtMSwgQ2Fubm90IHNldCB0aGUgYmVuZCBwb2ludCBsb2NhdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLnJlbW92ZShwb2ludEluZGV4KTsKLQkJCQkJCQllZGdlLmdldFdheXBvaW50cygpLmFkZChwb2ludEluZGV4LCBuZXdVbWFQb2ludCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRV9FTkRfUE9JTlQ6Ci0JCQkJCXAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi5ub3RpZnlDaGFuZ2VkKCk6IG5ldyBzb3VyY2UgZW5kCi0JCQkJCS8vIHBvaW50OiAiICsgcCArICIuICIgKyBnZXRTb3VyY2UoKSk7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCS8vIHRyYW5zbGF0ZSB0byByZWxhdGl2ZSBwb3NpdGlvbgotCQkJCQkJLy8KLQkJCQkJCS8vIHAudHJhbnNsYXRlKGdldFNvdXJjZSgpLmdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLQkJCQkJCWdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkuc2V0UG9zaXRpb24oCi0JCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsIHAueSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVRfRU5EX1BPSU5UOgotCQkJCQlwID0gKFBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIubm90aWZ5Q2hhbmdlZCgpOiBuZXcgdGFyZ2V0IGVuZAotCQkJCQkvLyBwb2ludDogIiArIHAgKyAiLiAiICsgZ2V0VGFyZ2V0KCkpOwotCQkJCQlpZiAocCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cmFuc2xhdGUgdG8gcmVsYXRpdmUgcG9zaXRpb24KLQkJCQkJCS8vCi0JCQkJCQkvLyBwLnRyYW5zbGF0ZShMaW5rSW1wbC50aGlzLmdldFRhcmdldCgpLmdldExvY2F0aW9uKCkuZ2V0TmVnYXRlZCgpKTsKLQkJCQkJCWdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkuc2V0UG9zaXRpb24oCi0JCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIubmV3TW9kZWxQb2ludChwLngsIHAueSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LX19TT1VSQ0U6Ci0JCQkJCS8vIFRPRE8KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktfX1RBUkdFVDoKLQkJCQkJLy8gVE9ETwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoQ29ubmVjdG9yIGdldFNvdXJjZUdyYXBoQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gKEdyYXBoQ29ubmVjdG9yKSAoKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCkpLmdldEFuY2hvcigpLmdldCgwKTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoQ29ubmVjdG9yIGdldFRhcmdldEdyYXBoQ29ubmVjdG9yKCkgewotCQlyZXR1cm4gKEdyYXBoQ29ubmVjdG9yKSAoKEdyYXBoRWRnZSkgZ2V0T2JqZWN0KCkpLmdldEFuY2hvcigpLmdldCgxKTsKLQl9Ci0KLX0gLy8gTGlua0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtlZE9iamVjdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL0xpbmtlZE9iamVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlOTJjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9MaW5rZWRPYmplY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmtlZE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGlua2VkIE9iamVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rZWRPYmplY3RJbXBsI2dldExpbmtlZEVsZW1lbnQgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlua2VkT2JqZWN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJTGlua2VkT2JqZWN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rZWRFbGVtZW50KCkgPGVtPkxpbmtlZCBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rZWRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50OwotCXByb3RlY3RlZCBPYmplY3Qgb2JqZWN0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaW5rZWRPYmplY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5MSU5LRURfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldExpbmtlZEVsZW1lbnQoKSB7Ci0JCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwgJiYgKChFT2JqZWN0KWxpbmtlZEVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRMaW5rZWRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdClsaW5rZWRFbGVtZW50OwotCQkJbGlua2VkRWxlbWVudCA9IChNZXRob2RFbGVtZW50KWVSZXNvbHZlUHJveHkob2xkTGlua2VkRWxlbWVudCk7Ci0JCQlpZiAobGlua2VkRWxlbWVudCAhPSBvbGRMaW5rZWRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5ULCBvbGRMaW5rZWRFbGVtZW50LCBsaW5rZWRFbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpbmtlZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgYmFzaWNHZXRMaW5rZWRFbGVtZW50KCkgewotCQlyZXR1cm4gbGlua2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgbmV3TGlua2VkRWxlbWVudCkgewotCQlNZXRob2RFbGVtZW50IG9sZExpbmtlZEVsZW1lbnQgPSBsaW5rZWRFbGVtZW50OwotCQlsaW5rZWRFbGVtZW50ID0gbmV3TGlua2VkRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5ULCBvbGRMaW5rZWRFbGVtZW50LCBsaW5rZWRFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0TGlua2VkRWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5MSU5LRURfT0JKRUNUX19MSU5LRURfRUxFTUVOVDoKLQkJCQlzZXRMaW5rZWRFbGVtZW50KChNZXRob2RFbGVtZW50KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQ6Ci0JCQkJc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1RfX0xJTktFRF9FTEVNRU5UOgotCQkJCXJldHVybiBsaW5rZWRFbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJdGhpcy5vYmplY3QgPSBuZXdPYmplY3Q7Ci0JfQotCi19IC8vIExpbmtlZE9iamVjdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNDRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Nb2RlbEZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgTW9kZWxGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNb2RlbEZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCU1vZGVsRmFjdG9yeSB0aGVNb2RlbEZhY3RvcnkgPSAoTW9kZWxGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWlmICh0aGVNb2RlbEZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGVNb2RlbEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgTW9kZWxGYWN0b3J5SW1wbCgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ESUFHUkFNOiByZXR1cm4gY3JlYXRlRGlhZ3JhbSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTElOSzogcmV0dXJuIGNyZWF0ZUxpbmsoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREU6IHJldHVybiBjcmVhdGVOYW1lZE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFDVElWSVRZX0RJQUdSQU06IHJldHVybiBjcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREU6IHJldHVybiBjcmVhdGVUeXBlZE5vZGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06IHJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfTk9ERTogcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06IHJldHVybiBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW0oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfTk9ERTogcmV0dXJuIGNyZWF0ZVJvbGVOb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX1RBU0tfQ09NUE9TSVRFOiByZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGUoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERTogcmV0dXJuIGNyZWF0ZVRhc2tOb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9OT0RFOiByZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFOiByZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkFCU09MVVRFX0JFTkRQT0lOVDoKLQkJCQlyZXR1cm4gY3JlYXRlQWJzb2x1dGVCZW5kcG9pbnRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlBPSU5UOgotCQkJCXJldHVybiBjcmVhdGVQb2ludEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOgotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRvckZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuQUJTT0xVVEVfQkVORFBPSU5UOgotCQkJCXJldHVybiBjb252ZXJ0QWJzb2x1dGVCZW5kcG9pbnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUE9JTlQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQb2ludFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5ST0xFX0RFU0NSSVBUT1I6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSb2xlRGVzY3JpcHRvclRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oKSB7Ci0JCURpYWdyYW1JbXBsIGRpYWdyYW0gPSBuZXcgRGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rIGNyZWF0ZUxpbmsoKSB7Ci0JCUxpbmtJbXBsIGxpbmsgPSBuZXcgTGlua0ltcGwoKTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGUgY3JlYXRlTmFtZWROb2RlKCkgewotCQlOYW1lZE5vZGVJbXBsIG5hbWVkTm9kZSA9IG5ldyBOYW1lZE5vZGVJbXBsKCk7Ci0JCXJldHVybiBuYW1lZE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW0gY3JlYXRlQWN0aXZpdHlEaWFncmFtKCkgewotCQlBY3Rpdml0eURpYWdyYW1JbXBsIGFjdGl2aXR5RGlhZ3JhbSA9IG5ldyBBY3Rpdml0eURpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlZE5vZGUgY3JlYXRlVHlwZWROb2RlKCkgewotCQlUeXBlZE5vZGVJbXBsIHR5cGVkTm9kZSA9IG5ldyBUeXBlZE5vZGVJbXBsKCk7Ci0JCXJldHVybiB0eXBlZE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKSB7Ci0JCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPSBuZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGUgY3JlYXRlV29ya1Byb2R1Y3ROb2RlKCkgewotCQlXb3JrUHJvZHVjdE5vZGVJbXBsIHdvcmtQcm9kdWN0Tm9kZSA9IG5ldyBXb3JrUHJvZHVjdE5vZGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURldGFpbERpYWdyYW0gY3JlYXRlQWN0aXZpdHlEZXRhaWxEaWFncmFtKCkgewotCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IG5ldyBBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURldGFpbERpYWdyYW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlTm9kZSBjcmVhdGVSb2xlTm9kZSgpIHsKLQkJUm9sZU5vZGVJbXBsIHJvbGVOb2RlID0gbmV3IFJvbGVOb2RlSW1wbCgpOwotCQlyZXR1cm4gcm9sZU5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlVGFza0NvbXBvc2l0ZSBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZSgpIHsKLQkJUm9sZVRhc2tDb21wb3NpdGVJbXBsIHJvbGVUYXNrQ29tcG9zaXRlID0gbmV3IFJvbGVUYXNrQ29tcG9zaXRlSW1wbCgpOwotCQlyZXR1cm4gcm9sZVRhc2tDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrTm9kZSBjcmVhdGVUYXNrTm9kZSgpIHsKLQkJVGFza05vZGVJbXBsIHRhc2tOb2RlID0gbmV3IFRhc2tOb2RlSW1wbCgpOwotCQlyZXR1cm4gdGFza05vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsIHdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSA9IG5ldyBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgpIHsKLQkJV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsIHdvcmtQcm9kdWN0Q29tcG9zaXRlID0gbmV3IFdvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3RDb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBYnNvbHV0ZUJlbmRwb2ludCBjcmVhdGVBYnNvbHV0ZUJlbmRwb2ludEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEFic29sdXRlQmVuZHBvaW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBYnNvbHV0ZUJlbmRwb2ludFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBjcmVhdGVQb2ludEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFBvaW50KXN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQb2ludFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoUm9sZURlc2NyaXB0b3Ipc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGVEZXNjcmlwdG9yVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsUGFja2FnZSBnZXRNb2RlbFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoTW9kZWxQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy8gTW9kZWxGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODZmYWVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LiA8IS0tCi0gKiBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kZWxQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGlua0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbGlua2VkT2JqZWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdHlwZWROb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgbm9kZUNvbnRhaW5lckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZU5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHBvaW50RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByb2xlRGVzY3JpcHRvckVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlCi0JICogcGFja2FnZSBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBOb3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljIGZhY3RvcnkKLQkgKiBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0JICogcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLCBpZiBvbmUgYWxyZWFkeSBleGlzdHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChNb2RlbFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBNb2RlbFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTW9kZWxQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZU1vZGVsUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZU1vZGVsUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNb2RlbFBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZU1vZGVsUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMaW5rKCkgewotCQlyZXR1cm4gbGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlsaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldExpbmtfU291cmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMaW5rX1RhcmdldCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TGlua19CZW5kcG9pbnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX1NvdXJjZUVuZFBvaW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRMaW5rX1RhcmdldEVuZFBvaW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbGlua0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldExpbmtlZE9iamVjdCgpIHsKLQkJcmV0dXJuIGxpbmtlZE9iamVjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRMaW5rZWRPYmplY3RfTGlua2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWxpbmtlZE9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkTm9kZSgpIHsKLQkJcmV0dXJuIG5hbWVkTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TmFtZWROb2RlX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSluYW1lZE5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXROb2RlKCkgewotCQlyZXR1cm4gbm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9XaWR0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Tm9kZV9IZWlnaHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlub2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE5vZGVfSW5jb21pbmdDb25uZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW5vZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROb2RlX1JlYWRPbmx5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUeXBlZE5vZGUoKSB7Ci0JCXJldHVybiB0eXBlZE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFR5cGVkTm9kZV9UeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdHlwZWROb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3ROb2RlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3ROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdE5vZGVfVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0Tm9kZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURldGFpbERpYWdyYW1fQXV0b0xheW91dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5vZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiBub2RlQ29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXROb2RlQ29udGFpbmVyX05vZGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2Upbm9kZUNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVOb2RlKCkgewotCQlyZXR1cm4gcm9sZU5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZVRhc2tDb21wb3NpdGUoKSB7Ci0JCXJldHVybiByb2xlVGFza0NvbXBvc2l0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlVGFza0NvbXBvc2l0ZV9Sb3dJbmRleCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza05vZGUoKSB7Ci0JCXJldHVybiB0YXNrTm9kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrTm9kZV9JbmRleCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tOb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnROb2RlKCkgewotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlX1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdENvbXBvc2l0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFic29sdXRlQmVuZHBvaW50KCkgewotCQlyZXR1cm4gYWJzb2x1dGVCZW5kcG9pbnRFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0UG9pbnQoKSB7Ci0JCXJldHVybiBwb2ludEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxGYWN0b3J5IGdldE1vZGVsRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNb2RlbEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWRpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRElBR1JBTSk7Ci0KLQkJbGlua0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMSU5LKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShsaW5rRUNsYXNzLCBMSU5LX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShsaW5rRUNsYXNzLCBMSU5LX19TT1VSQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtFQ2xhc3MsIExJTktfX1RBUkdFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fQkVORFBPSU5UUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fU09VUkNFX0VORF9QT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobGlua0VDbGFzcywgTElOS19fVEFSR0VUX0VORF9QT0lOVCk7Ci0KLQkJbGlua2VkT2JqZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKExJTktFRF9PQkpFQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGxpbmtlZE9iamVjdEVDbGFzcywgTElOS0VEX09CSkVDVF9fTElOS0VEX0VMRU1FTlQpOwotCi0JCW5hbWVkTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhOQU1FRF9OT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShuYW1lZE5vZGVFQ2xhc3MsIE5BTUVEX05PREVfX05BTUUpOwotCi0JCW5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fTE9DQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG5vZGVFQ2xhc3MsIE5PREVfX1dJRFRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShub2RlRUNsYXNzLCBOT0RFX19IRUlHSFQpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5vZGVFQ2xhc3MsIE5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShub2RlRUNsYXNzLCBOT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobm9kZUVDbGFzcywgTk9ERV9fUkVBRF9PTkxZKTsKLQotCQlhY3Rpdml0eURpYWdyYW1FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfRElBR1JBTSk7Ci0KLQkJdHlwZWROb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEVEX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHR5cGVkTm9kZUVDbGFzcywgVFlQRURfTk9ERV9fVFlQRSk7Ci0KLQkJd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNKTsKLQotCQl3b3JrUHJvZHVjdE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0Tm9kZUVDbGFzcywgV09SS19QUk9EVUNUX05PREVfX1RZUEUpOwotCi0JCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXRhaWxEaWFncmFtRUNsYXNzLCBBQ1RJVklUWV9ERVRBSUxfRElBR1JBTV9fQVVUT19MQVlPVVQpOwotCi0JCW5vZGVDb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTk9ERV9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKG5vZGVDb250YWluZXJFQ2xhc3MsIE5PREVfQ09OVEFJTkVSX19OT0RFUyk7Ci0KLQkJcm9sZU5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9OT0RFKTsKLQotCQlyb2xlVGFza0NvbXBvc2l0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1RBU0tfQ09NUE9TSVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlVGFza0NvbXBvc2l0ZUVDbGFzcywgUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYKTsKLQotCQl0YXNrTm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX05PREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tOb2RlRUNsYXNzLCBUQVNLX05PREVfX0lOREVYKTsKLQotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX05PREUpOwotCi0JCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREUpOwotCi0JCXdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9DT01QT1NJVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLCBXT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQlhYnNvbHV0ZUJlbmRwb2ludEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShBQlNPTFVURV9CRU5EUE9JTlQpOwotCQlwb2ludEVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShQT0lOVCk7Ci0JCXJvbGVEZXNjcmlwdG9yRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFJPTEVfREVTQ1JJUFRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlVbWFQYWNrYWdlIHRoZVVtYVBhY2thZ2UgPSAoVW1hUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShVbWFQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCWRpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlQ29udGFpbmVyKCkpOwotCQlsaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGlua2VkT2JqZWN0KCkpOwotCQluYW1lZE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlKCkpOwotCQlub2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TGlua2VkT2JqZWN0KCkpOwotCQlhY3Rpdml0eURpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtKCkpOwotCQl0eXBlZE5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlKCkpOwotCQl3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbSgpKTsKLQkJd29ya1Byb2R1Y3ROb2RlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWROb2RlKCkpOwotCQlhY3Rpdml0eURldGFpbERpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtKCkpOwotCQlub2RlQ29udGFpbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Tm9kZSgpKTsKLQkJcm9sZU5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZE5vZGUoKSk7Ci0JCXJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Tm9kZUNvbnRhaW5lcigpKTsKLQkJdGFza05vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZE5vZGUoKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROYW1lZE5vZGUoKSk7Ci0JCXdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkTm9kZSgpKTsKLQkJd29ya1Byb2R1Y3RDb21wb3NpdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXROb2RlQ29udGFpbmVyKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZGlhZ3JhbUVDbGFzcywgRGlhZ3JhbS5jbGFzcywgIkRpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGxpbmtFQ2xhc3MsIExpbmsuY2xhc3MsICJMaW5rIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpbmtfTmFtZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibmFtZSIsICIiLCAwLCAxLCBMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TGlua19Tb3VyY2UoKSwgdGhpcy5nZXROb2RlKCksIHRoaXMuZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCksICJzb3VyY2UiLCBudWxsLCAwLCAxLCBMaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rX1RhcmdldCgpLCB0aGlzLmdldE5vZGUoKSwgdGhpcy5nZXROb2RlX0luY29taW5nQ29ubmVjdGlvbnMoKSwgInRhcmdldCIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19CZW5kcG9pbnRzKCksIHRoaXMuZ2V0QWJzb2x1dGVCZW5kcG9pbnQoKSwgImJlbmRwb2ludHMiLCBudWxsLCAwLCAtMSwgTGluay5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldExpbmtfU291cmNlRW5kUG9pbnQoKSwgdGhpcy5nZXRQb2ludCgpLCAic291cmNlRW5kUG9pbnQiLCBudWxsLCAwLCAxLCBMaW5rLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TGlua19UYXJnZXRFbmRQb2ludCgpLCB0aGlzLmdldFBvaW50KCksICJ0YXJnZXRFbmRQb2ludCIsIG51bGwsIDAsIDEsIExpbmsuY2xhc3MsIElTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MobGlua2VkT2JqZWN0RUNsYXNzLCBMaW5rZWRPYmplY3QuY2xhc3MsICJMaW5rZWRPYmplY3QiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRMaW5rZWRPYmplY3RfTGlua2VkRWxlbWVudCgpLCB0aGVVbWFQYWNrYWdlLmdldE1ldGhvZEVsZW1lbnQoKSwgbnVsbCwgImxpbmtlZEVsZW1lbnQiLCBudWxsLCAwLCAxLCBMaW5rZWRPYmplY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKG5hbWVkTm9kZUVDbGFzcywgTmFtZWROb2RlLmNsYXNzLCAiTmFtZWROb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE5hbWVkTm9kZV9OYW1lKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTmFtZWROb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhub2RlRUNsYXNzLCBOb2RlLmNsYXNzLCAiTm9kZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldE5vZGVfTG9jYXRpb24oKSwgdGhpcy5nZXRQb2ludCgpLCAibG9jYXRpb24iLCBudWxsLCAwLCAxLCBOb2RlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9XaWR0aCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAid2lkdGgiLCAiLTEiLCAwLCAxLCBOb2RlLmNsYXNzLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZShnZXROb2RlX0hlaWdodCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiaGVpZ2h0IiwgIi0xIiwgMCwgMSwgTm9kZS5jbGFzcywgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Tm9kZV9JbmNvbWluZ0Nvbm5lY3Rpb25zKCksIHRoaXMuZ2V0TGluaygpLCB0aGlzLmdldExpbmtfVGFyZ2V0KCksICJpbmNvbWluZ0Nvbm5lY3Rpb25zIiwgbnVsbCwgMCwgLTEsIE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Tm9kZV9PdXRnb2luZ0Nvbm5lY3Rpb25zKCksIHRoaXMuZ2V0TGluaygpLCB0aGlzLmdldExpbmtfU291cmNlKCksICJvdXRnb2luZ0Nvbm5lY3Rpb25zIiwgbnVsbCwgMCwgLTEsIE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Tm9kZV9SZWFkT25seSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInJlYWRPbmx5IiwgbnVsbCwgMCwgMSwgTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlEaWFncmFtRUNsYXNzLCBBY3Rpdml0eURpYWdyYW0uY2xhc3MsICJBY3Rpdml0eURpYWdyYW0iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHR5cGVkTm9kZUVDbGFzcywgVHlwZWROb2RlLmNsYXNzLCAiVHlwZWROb2RlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFR5cGVkTm9kZV9UeXBlKCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJ0eXBlIiwgbnVsbCwgMCwgMSwgVHlwZWROb2RlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRUNsYXNzLCBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtLmNsYXNzLCAiV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3ROb2RlRUNsYXNzLCBXb3JrUHJvZHVjdE5vZGUuY2xhc3MsICJXb3JrUHJvZHVjdE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3ROb2RlX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVDbGFzcywgQWN0aXZpdHlEZXRhaWxEaWFncmFtLmNsYXNzLCAiQWN0aXZpdHlEZXRhaWxEaWFncmFtIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbV9BdXRvTGF5b3V0KCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiYXV0b0xheW91dCIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mobm9kZUNvbnRhaW5lckVDbGFzcywgTm9kZUNvbnRhaW5lci5jbGFzcywgIk5vZGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXROb2RlQ29udGFpbmVyX05vZGVzKCksIHRoaXMuZ2V0Tm9kZSgpLCBudWxsLCAibm9kZXMiLCBudWxsLCAwLCAtMSwgTm9kZUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mocm9sZU5vZGVFQ2xhc3MsIFJvbGVOb2RlLmNsYXNzLCAiUm9sZU5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHJvbGVUYXNrQ29tcG9zaXRlRUNsYXNzLCBSb2xlVGFza0NvbXBvc2l0ZS5jbGFzcywgIlJvbGVUYXNrQ29tcG9zaXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVUYXNrQ29tcG9zaXRlX1Jvd0luZGV4KCksIGVjb3JlUGFja2FnZS5nZXRFSW50KCksICJyb3dJbmRleCIsIG51bGwsIDAsIDEsIFJvbGVUYXNrQ29tcG9zaXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyh0YXNrTm9kZUVDbGFzcywgVGFza05vZGUuY2xhc3MsICJUYXNrTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrTm9kZV9JbmRleCgpLCBlY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiaW5kZXgiLCAiLTEiLCAwLCAxLCBUYXNrTm9kZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlRUNsYXNzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlLmNsYXNzLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3Mod29ya0JyZWFrZG93bkVsZW1lbnROb2RlRUNsYXNzLCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MsICJXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0Q29tcG9zaXRlRUNsYXNzLCBXb3JrUHJvZHVjdENvbXBvc2l0ZS5jbGFzcywgIldvcmtQcm9kdWN0Q29tcG9zaXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0Q29tcG9zaXRlX1R5cGUoKSwgZWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdENvbXBvc2l0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIEluaXRpYWxpemUgZGF0YSB0eXBlcwotCQlpbml0RURhdGFUeXBlKGFic29sdXRlQmVuZHBvaW50RURhdGFUeXBlLCBBYnNvbHV0ZUJlbmRwb2ludC5jbGFzcywgIkFic29sdXRlQmVuZHBvaW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHBvaW50RURhdGFUeXBlLCBQb2ludC5jbGFzcywgIlBvaW50IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHJvbGVEZXNjcmlwdG9yRURhdGFUeXBlLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIlJvbGVEZXNjcmlwdG9yIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLX0gLy8gTW9kZWxQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTmFtZWROb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTmFtZWROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg0YTc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05hbWVkTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuVHhVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVkIE5vZGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWROb2RlSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTmFtZWROb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5OQU1FRF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OQU1FRF9OT0RFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAgLy8KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQotCXByb3RlY3RlZCBjbGFzcyBNZXRob2RFbGVtZW50QWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayB7Ci0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXNldE5hbWUobXNnLmdldE5ld1N0cmluZ1ZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXROb2RlKCksIAotCQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQloYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gTmFtZWROb2RlSW1wbC50aGlzOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGluayBhZGRJbmNvbWluZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCBzb3VyY2UpIHsKLQkJTm9kZSBzcmNOb2RlID0gZmluZE5vZGUoc291cmNlKTsKLQkJaWYgKHNyY05vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaW5rIGxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJbGluay5zZXRUYXJnZXQodGhpcyk7Ci0KLQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24gb2Ygc3JjTm9kZSBiZWZvcmUgYXNzb2NpYXRlIGl0IHdpdGggdGhlIGxpbmsKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBVTUEgZGF0YQotCQkvLwotCQlOb2RlSW1wbCBzcmNOb2RlSW1wbCA9IChOb2RlSW1wbCkgc3JjTm9kZTsKLQkJYm9vbGVhbiBub3RpZnkgPSBzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJc3JjTm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJbGluay5zZXRTb3VyY2Uoc3JjTm9kZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzcmNOb2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQl9Ci0KLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5hZGRHcmFwaGljYWxEYXRhKGxpbmspOwotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGZpbmROb2RlKE1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCkgewotCQlyZXR1cm4gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZShnZXREaWFncmFtKCksIGxpbmtlZEVsZW1lbnQpOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZE91dGdvaW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQlOb2RlIHRhcmdldE5vZGUgPSBmaW5kTm9kZSh0YXJnZXQpOwotCQlpZiAodGFyZ2V0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpbmsgbGluayA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGluaygpOwotCi0JCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIG9mIHRhcmdldE5vZGUgYmVmb3JlIGFzc29jaWF0ZSBpdCB3aXRoIHRoZSBsaW5rCi0JCS8vIHNvIGl0IHdpbGwgbm90IGNyZWF0ZSBkdXBsaWNhdGUgVU1BIGRhdGEKLQkJLy8KLQkJTm9kZUltcGwgbm9kZUltcGwgPSAoTm9kZUltcGwpIHRhcmdldE5vZGU7Ci0JCWJvb2xlYW4gbm90aWZ5ID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCWxpbmsuc2V0VGFyZ2V0KHRhcmdldE5vZGUpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCi0JCWxpbmsuc2V0U291cmNlKHRoaXMpOwotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlHcmFwaGljYWxEYXRhSGVscGVyLmFkZEdyYXBoaWNhbERhdGEobGluayk7Ci0JCX0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgc291cmNlKSB7Ci0JCS8vIGxvb2sgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIHdpdGggc291cmNlIGFzIGxpbmtlZCBvYmplY3Qgb2YgdGhlCi0JCS8vIHNvdXJjZSBub2RlCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaW5rLmdldFNvdXJjZSgpICE9IG51bGwKLQkJCQkJJiYgbGluay5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSA9PSBzb3VyY2UpIHsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JCQkJLy8gZGlzYWJsZSBpbnRlcm5hbCBub3RpZmljYXRpb24gb2YgdGhlIHNvdXJjZSBub2RlCi0JCQkJLy8KLQkJCQlOb2RlSW1wbCBzb3VyY2VOb2RlID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCXRyeSB7Ci0JCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQlsaW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBvbGROb3RpZnk7Ci0JCQkJfQotCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCWxpbmsuc2V0T2JqZWN0KG51bGwpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVPdXRnb2luZ0Nvbm5lY3Rpb24oTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJLy8gbG9vayBmb3IgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gd2l0aCBzb3VyY2UgYXMgbGlua2VkIG9iamVjdCBvZiB0aGUKLQkJLy8gc291cmNlIG5vZGUKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbAotCQkJCQkmJiBsaW5rLmdldFRhcmdldCgpLmdldE9iamVjdCgpID09IHRhcmdldCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHRhcmdldE5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSB0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJbGluay5zZXRPYmplY3QobnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCi0JCWlmIChuZXdPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCS8vIHVzZSBwcmVzZW50YXRpb24gbmFtZQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZWxlbWVudCA9IChEZXNjcmliYWJsZUVsZW1lbnQpIG5ld09iamVjdDsKLQkJCW5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJfQotCi0JCS8vIGlmIGl0J3MgYmxhbmsgdGhlbiB1c2UgbmFtZQotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbmV3T2JqZWN0OwotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNiYXNpY1NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkJc3VwZXIuYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50Ci0JCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCS5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgbmV3T2JqZWN0KSkgewotCQkJLy8gbGlzdGVuIHRvIGNoYW5nZSBpbiB0aGUgYmFzZQotCQkJLy8KLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld09iamVjdCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlpZiAoYmFzZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCQkJYmFzZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXJJbXBsKCkgewotCQkJCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQkJCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJCQkJCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJCQkJCURlc2NyaWJhYmxlRWxlbWVudCBlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJCWlmIChTdHJVdGlsLmlzQmxhbmsoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQkJCQkJCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCQkJCQkJCQluYW1lID0gbXNnLmdldE5ld1N0cmluZ1ZhbHVlKCk7Ci0JCQkJCQkJCQlpZiAoIW5hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQkJCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQkJCQkJTmFtZWROb2RlSW1wbC50aGlzLCAtMSwKLQkJCQkJCQkJCQkJTW9kZWxQYWNrYWdlLk5BTUVEX05PREVfX05BTUUsCi0JCQkJCQkJCQkJCW9sZE5hbWUsIG5hbWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJCWJhc2UuZUFkYXB0ZXJzKCkuYWRkKGJhc2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZGlzcG9zZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0T2JqZWN0KCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJaWYgKGJhc2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNjcmVhdGVOb2RlQWRhcHRlcigpCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJCXJldHVybjsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5hbWVkTm9kZS5jbGFzcykpIHsKLQkJCQkJY2FzZSBNb2RlbFBhY2thZ2UuTkFNRURfTk9ERV9fTkFNRToKLQkJCQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVAotCQkJCQkJCQkmJiBnZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQlTdHJpbmcgbmV3TmFtZSA9IG1zZy5nZXROZXdTdHJpbmdWYWx1ZSgpOwotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9ICgoQnJlYWtkb3duRWxlbWVudCkgZ2V0T2JqZWN0KCkpOwotCQkJCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuZXdOYW1lKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKGUuZ2V0TmFtZSgpKSkgewotCQkJCQkJCQllLnNldE5hbWUobmV3TmFtZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0KLQkJfTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90aWZpY2F0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIG5vdGlmaWNhdGlvbkVuYWJsZWQpIHsKLQkJdGhpcy5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoKSB7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0JCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsKSB7Ci0JCQlPYmplY3QgbyA9IGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyIDogZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJcmV0dXJuIGdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpLmlzU3VwcHJlc3NlZChvKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlcigpIHsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpdGVtIHByb3ZpZGVyIGZvciB0aGUgdGhpcyBub2RlIGlmIHRoZXJlIGlzIGEgcmVhZC1vbmx5IHdyYXBwZXIKLQkgKiBmb3IgdGhlIG5vZGUgaW4gdGhlIGdpdmVuIGVsZW1lbnQgY29sbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGFsbEVsZW1lbnRzCi0JICovCi0Jdm9pZCBzZXRJdGVtUHJvdmlkZXIoQ29sbGVjdGlvbiBhbGxFbGVtZW50cykgewotCQlPYmplY3Qgb2JqZWN0ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kRWxlbWVudChhbGxFbGVtZW50cywKLQkJCQlnZXRPYmplY3QoKSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqZWN0OwotCQkJaWYgKHdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkJaXRlbVByb3ZpZGVyID0gd3JhcHBlcjsKLQkJCQlyZWFkT25seSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJJbXBsIGJhc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEl0ZW0gcHJvdmlkZXIgb2YgdGhlIGxpbmtlZCBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyOwotCi19IC8vIE5hbWVkTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVDb250YWluZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Ob2RlQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGRmMjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVDb250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm9kZSBDb250YWluZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUNvbnRhaW5lckltcGwjZ2V0Tm9kZXMgPGVtPk5vZGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUNvbnRhaW5lckltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzCi0JCU5vZGVDb250YWluZXIgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVzKCkgPGVtPk5vZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE5vZGU+IG5vZGVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlQ29udGFpbmVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERV9DT05UQUlORVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxOb2RlPiBnZXROb2RlcygpIHsKLQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCW5vZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE5vZGU+KE5vZGUuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVMpOwotCQl9Ci0JCXJldHVybiBub2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX0NPTlRBSU5FUl9fTk9ERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROb2RlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm9kZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlnZXROb2RlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Tm9kZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIE5vZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVJfX05PREVTOgotCQkJCWdldE5vZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfQ09OVEFJTkVSX19OT0RFUzoKLQkJCQlyZXR1cm4gbm9kZXMgIT0gbnVsbCAmJiAhbm9kZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjc2V0UmVhZE9ubHkoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShib29sZWFuIG5ld1JlYWRPbmx5KSB7Ci0JCXN1cGVyLnNldFJlYWRPbmx5KG5ld1JlYWRPbmx5KTsKLQkJaWYgKG5ld1JlYWRPbmx5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU5vZGUgY2hpbGQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJY2hpbGQuc2V0UmVhZE9ubHkobmV3UmVhZE9ubHkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlbW92ZWROb2RlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1c2hCYWNrVG9EaWFncmFtKENvbGxlY3Rpb24gcmVtb3ZlZE5vZGVzKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCUNvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMgPSBkaWFncmFtLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHRydWUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWJyZWFrZG93bkVsZW1lbnRzLmNvbnRhaW5zKG5vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkvLyB7Ci0JCS8vIE9iamVjdCBub2RlID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKG5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSl7Ci0JCS8vIExpc3QgbGlzdCA9ICgoUm9sZVRhc2tDb21wb3NpdGUpbm9kZSkuZ2V0Tm9kZXMoKTsKLQkJLy8gYm9vbGVhbiBkZXN0cm95ID0gdHJ1ZTsKLQkJLy8gZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJLy8gT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJLy8gaWYob2JqIGluc3RhbmNlb2YgVGFza05vZGUpIGRlc3Ryb3kgPSBmYWxzZTsKLQkJLy8gfQotCQkvLyBpZihkZXN0cm95KSBpdGVyLnJlbW92ZSgpOwotCQkvLyB9Ci0JCS8vIH0KLQkJaWYgKCFyZW1vdmVkTm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkQWxsKHJlbW92ZWROb2Rlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0Tm9kZXMoQ29sbGVjdGlvbiBub2RlcykgewotCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJbm9kZS52aXNpYmxlID0gdHJ1ZTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYoIW5vZGVzLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQkJCW5vZGUudmlzaWJsZSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgaXRlci5uZXh0KCk7Ci0JCQkJbm9kZS52aXNpYmxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gZGlzcG9zZSBhbGwgbm9kZXMKLQkJLy8KLQkJZm9yIChPYmplY3Qgbm9kZSA6IG5ldyBBcnJheUxpc3Q8Tm9kZT4obm9kZXMpKSB7CQkKLQkJCSgoTm9kZUltcGwpbm9kZSkuZGlzcG9zZSgpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotfSAvLyBOb2RlQ29udGFpbmVySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWY1NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbC5NZXRob2RFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklOb2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5UeFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Tm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldEluY29taW5nQ29ubmVjdGlvbnMgPGVtPkluY29taW5nIENvbm5lY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE91dGdvaW5nQ29ubmVjdGlvbnMgPGVtPk91dGdvaW5nIENvbm5lY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2lzUmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVJbXBsIGV4dGVuZHMgTGlua2VkT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE5vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMb2NhdGlvbigpIDxlbT5Mb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBvaW50IExPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2F0aW9uKCkgPGVtPkxvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFdJRFRIX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHdpZHRoID0gV0lEVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGVpZ2h0KCkgPGVtPkhlaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgSEVJR0hUX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIZWlnaHQoKSA8ZW0+SGVpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGhlaWdodCA9IEhFSUdIVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY29taW5nQ29ubmVjdGlvbnMoKSA8ZW0+SW5jb21pbmcgQ29ubmVjdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY29taW5nQ29ubmVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxMaW5rPiBpbmNvbWluZ0Nvbm5lY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpIDxlbT5PdXRnb2luZyBDb25uZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PExpbms+IG91dGdvaW5nQ29ubmVjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWFkT25seSgpIDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVBRF9PTkxZX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1JlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gUkVBRF9PTkxZX0VERUZBVUxUOwotCi0JcHJpdmF0ZSBBZGFwdGVyIG5vZGVBZGFwdGVyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFBvaW50IG5ld0xvY2F0aW9uKSB7Ci0JCVBvaW50IG9sZExvY2F0aW9uID0gbG9jYXRpb247Ci0JCWxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTiwgb2xkTG9jYXRpb24sIGxvY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IG5ld1dpZHRoKSB7Ci0JCWludCBvbGRXaWR0aCA9IHdpZHRoOwotCQl3aWR0aCA9IG5ld1dpZHRoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEgsIG9sZFdpZHRoLCB3aWR0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KGludCBuZXdIZWlnaHQpIHsKLQkJaW50IG9sZEhlaWdodCA9IGhlaWdodDsKLQkJaGVpZ2h0ID0gbmV3SGVpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hULCBvbGRIZWlnaHQsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TGluaz4gZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpIHsKLQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMgPT0gbnVsbCkgewotCQkJaW5jb21pbmdDb25uZWN0aW9ucyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDxMaW5rPihMaW5rLmNsYXNzLCB0aGlzLCBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlMsIE1vZGVsUGFja2FnZS5MSU5LX19UQVJHRVQpOwotCQl9Ci0JCXJldHVybiBpbmNvbWluZ0Nvbm5lY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TGluaz4gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpIHsKLQkJaWYgKG91dGdvaW5nQ29ubmVjdGlvbnMgPT0gbnVsbCkgewotCQkJb3V0Z29pbmdDb25uZWN0aW9ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0PExpbms+KExpbmsuY2xhc3MsIHRoaXMsIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUywgTW9kZWxQYWNrYWdlLkxJTktfX1NPVVJDRSk7Ci0JCX0KLQkJcmV0dXJuIG91dGdvaW5nQ29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvY2F0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvY2F0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3aWR0aDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh3aWR0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGVpZ2h0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGhlaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhZE9ubHk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVhZE9ubHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGluY29taW5nIGNvbm5lY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgPT0gbnVsbCB8fCBsaW5rLmdldFNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuYWRkR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG91dGdvaW5nIGNvbm5lY3Rpb24KLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEBwYXJhbSBvbGRTb3VyY2UKLQkgKiBAcGFyYW0gb2xkVGFyZ2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihvbGRTb3VyY2UuZ2V0R3JhcGhOb2RlKCksCi0JCS8vIG9sZFRhcmdldC5nZXRHcmFwaE5vZGUoKSk7Ci0JCQotCQlHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZUdyYXBoaWNhbERhdGEobGluayk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSBnZXRVTUFEaWFncmFtKCkgewotCQlpZiAoZ2V0RGlhZ3JhbSgpID09IG51bGwpCi0JCQlyZXR1cm4gdW1hRGlhZ3JhbTsKLQkJcmV0dXJuIGdldERpYWdyYW0oKS5nZXRVTUFEaWFncmFtKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEdyYXBoTm9kZSBnZXRVTUFDb250YWluZXIoKSB7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKQotCQkJcmV0dXJuIHVtYUNvbnRhaW5lcjsKLQkJcmV0dXJuIGNvbnRhaW5lci5nZXRHcmFwaE5vZGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjc2V0VU1BQ29udGFpbmVyKG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVNQUNvbnRhaW5lcihHcmFwaE5vZGUgdW1hQ29udGFpbmVyKSB7Ci0JCXRoaXMudW1hQ29udGFpbmVyID0gdW1hQ29udGFpbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlOb2RlI3NldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVNQURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIHVtYURpYWdyYW0pIHsKLQkJdGhpcy51bWFEaWFncmFtID0gdW1hRGlhZ3JhbTsKLQkJdW1hQ29udGFpbmVyID0gdW1hRGlhZ3JhbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTm9kZUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE5vZGUuY2xhc3MpKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19XSURUSDoKLQkJCQlnZXRHcmFwaE5vZGUoKS5nZXRTaXplKCkuc2V0V2lkdGgoCi0JCQkJCQluZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCQkJcmV0dXJuOwotCi0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19IRUlHSFQ6Ci0JCQkJaWYgKGdldEdyYXBoTm9kZSgpICE9IG51bGwpIHsKLQkJCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0U2l6ZSgpLnNldEhlaWdodCgKLQkJCQkJCQluZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fTE9DQVRJT046Ci0JCQkJaWYgKGdldEdyYXBoTm9kZSgpICE9IG51bGwgJiYgbXNnLmdldE5ld1ZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQlQb2ludCBwID0gKFBvaW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZ2V0R3JhcGhOb2RlKCkuZ2V0UG9zaXRpb24oKS5zZXRYKG5ldyBEb3VibGUocC54KSk7Ci0JCQkJCWdldEdyYXBoTm9kZSgpLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKHAueSkpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCUxpbmsgbGluazsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJYWRkVG9VTUEobGluayk7Ci0JCQkJCXJldHVybjsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlhZGRUb1VNQSgoTGluaykgaXRlci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJKChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKSkucmVtb3ZlRnJvbVVNQShsaW5rLCBsaW5rCi0JCQkJCQkJCS5nZXRTb3VyY2UoKSwgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywKLQkJCQkJCQkJCWxpbmsuZ2V0U291cmNlKCksIChOb2RlKSBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlsaW5rID0gKExpbmspIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCQkJCQkoKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpKS5hZGRUb1VNQShsaW5rKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCSgoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCkpLmFkZFRvVU1BKGxpbmspOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJcmVtb3ZlRnJvbVVNQShsaW5rLCAoTm9kZSkgbXNnLmdldE5vdGlmaWVyKCksIGxpbmsKLQkJCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCQkJCXJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpIG1zZy5nZXROb3RpZmllcigpLCBsaW5rCi0JCQkJCQkJCQkuZ2V0VGFyZ2V0KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0KLQkJCX0KLQkJfQotCi0JfQotCQotCS8qKgotCSAqIExvYWRzIGdyYXBobm9kZSBkYXRhIGFuZCBhc3NvY2lhdGVzIHRoZSBhZGFwdGVycy4KLQkgKiBAcGFyYW0gbmV3T2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQlpZiAobmV3T2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5vYmplY3QgPSBuZXdPYmplY3Q7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBuZXdPYmplY3Q7Ci0JCQotCQlncmFwaE5vZGUgPSBnZXRHcmFwaE5vZGUoZWxlbWVudCk7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb2RlSW1wbC5zZXRPYmplY3QoKTogZWxlbWVudDogJyIgKwotCQkvLyBlbGVtZW50LmdldE5hbWUoKSArICInLCBncmFwaE5vZGU6ICIgKyBncmFwaE5vZGUpOwotCi0JCWlmKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBwb3B1bGF0ZS9zeW5jaCBkYXRhCi0JCQkvLwotCQkJaWYgKGhlaWdodCA9PSBIRUlHSFRfRURFRkFVTFQpIHsKLQkJCQlzZXRIZWlnaHQoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ3JhcGhOb2RlLmdldFNpemUoKS5zZXRIZWlnaHQobmV3IERvdWJsZShoZWlnaHQpKTsKLQkJCX0KLQotCQkJaWYgKHdpZHRoID09IFdJRFRIX0VERUZBVUxUKSB7Ci0JCQkJc2V0V2lkdGgoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRXaWR0aCgpLmludFZhbHVlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlncmFwaE5vZGUuZ2V0U2l6ZSgpLnNldFdpZHRoKG5ldyBEb3VibGUod2lkdGgpKTsKLQkJCX0KLQotCQkJaWYgKGxvY2F0aW9uID09IExPQ0FUSU9OX0VERUZBVUxUKSB7Ci0JCQkJc2V0TG9jYXRpb24oR3JhcGhpY2FsRGF0YUhlbHBlci50b1BvaW50KGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFgobmV3IERvdWJsZShsb2NhdGlvbi54KSk7Ci0JCQkJZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkuc2V0WShuZXcgRG91YmxlKGxvY2F0aW9uLnkpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBtZXRob2RFbGVtZW50QWRhcHRlcgotCQkvLwotCQlnZXRNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQlpZiAobWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCAmJiAhZWxlbWVudC5lQWRhcHRlcnMoKS5jb250YWlucyhtZXRob2RFbGVtZW50QWRhcHRlcikpIHsKLQkJCWVsZW1lbnQuZUFkYXB0ZXJzKCkuYWRkKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkJfQotCi0JCWlmKG5vZGVBZGFwdGVyID09IG51bGwpIHsKLQkJCW5vZGVBZGFwdGVyID0gY3JlYXRlTm9kZUFkYXB0ZXIoKTsKLQkJfQotCQlpZihub2RlQWRhcHRlciAhPSBudWxsICYmICFlQWRhcHRlcnMoKS5jb250YWlucyhub2RlQWRhcHRlcikpIHsKLQkJCWVBZGFwdGVycygpLmFkZChub2RlQWRhcHRlcik7Ci0JCX0KLQkJCQkKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZihlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJc2V0TGlua2VkRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uYWxOb2RlTGluayBleHRlbmRzIEFkYXB0ZXJJbXBsIAotCWltcGxlbWVudHMgSU5vZGVDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlpZihtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVIpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoIW5vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCQkJcmV0dXJuOwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlUeFV0aWwucnVuSW5UcmFuc2FjdGlvbihnZXROb2RlKCksIAotCQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQloYW5kbGVOb3RpZmljYXRpb24obXNnKTsKLQkJCQkJCQl9Ci0JCQkJCQotCQkJCX0pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKTsKLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIE5vZGVJbXBsLnRoaXM7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBNZXRob2RFbGVtZW50QWRhcHRlciB0aGF0IHdpbGwgc3luY2hyb25pemUKLQkgKiB0aGUgY2hhbmdlIGZyb20gbWV0aG9kIGVsZW1lbnQgdG8gdGhlIG5vZGUuCi0JICogCi0JICogQHJldHVybiB0aGUgbWV0aG9kIGVsZW1lbnQgYWRhcHRlciBvZiB0aGlzIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50KXsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJcmV0dXJuIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0R3JhcGhOb2RlKAotCQkJCQlnZXRVTUFEaWFncmFtKCksIG1ldGhvZEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5MaW5rZWRPYmplY3RJbXBsI3NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCQkKLQkJYmFzaWNTZXRPYmplY3QobmV3T2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0ZXIgY3JlYXRlTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZSgpIHsKLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQkvLyBUT0RPOiBmb3JjZSBzdWJjbGFzcyB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gSU5vZGVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjZ2V0RGlhZ3JhbSgpCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBlQ29udGFpbmVyOwotCQlmb3IgKDsgcGFyZW50ICE9IG51bGwgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBEaWFncmFtKTsgcGFyZW50ID0gcGFyZW50Ci0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiAoRGlhZ3JhbSkgcGFyZW50OwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNzZXREaWFncmFtKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJdGhpcy5kaWFncmFtID0gZGlhZ3JhbTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUjYWRkQ29uc3VtZXIoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25zdW1lcihPYmplY3QgY29uc3VtZXIpIHsKLQkJaWYgKCFjb25zdW1lcnMuY29udGFpbnMoY29uc3VtZXIpKSB7Ci0JCQljb25zdW1lcnMuYWRkKGNvbnN1bWVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSNyZW1vdmVDb25zdW1lcihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnN1bWVyKE9iamVjdCBjb25zdW1lcikgewotCQljb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYgKGNvbnN1bWVycy5pc0VtcHR5KCkpIHsKLQkJCS8vIG5vIG1vcmUgY29uc3VtZXIgb2YgdGhpcyBub2RlLCBpdCBzaG91bGQgYmUgZGlzcG9zZWQKLQkJCWRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGdldE9iamVjdCgpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChtZXRob2RFbGVtZW50QWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJb2JqLmVBZGFwdGVycygpLnJlbW92ZShtZXRob2RFbGVtZW50QWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQotCQlpZihub2RlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQllQWRhcHRlcnMoKS5yZW1vdmUobm9kZUFkYXB0ZXIpOwotCQl9Ci0KLQkJdW1hQ29udGFpbmVyID0gbnVsbDsKLQkJdW1hRGlhZ3JhbSA9IG51bGw7Ci0JCWdyYXBoTm9kZSA9IG51bGw7Ci0JCQotCQlpZihvdXRnb2luZ0Nvbm5lY3Rpb25zICE9IG51bGwpIHsKLQkJCWZvciAoT2JqZWN0IGxpbmsgOiBvdXRnb2luZ0Nvbm5lY3Rpb25zKSB7Ci0JCQkJKChMaW5rKWxpbmspLmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiBuZXdSZWFkT25seSkgewotCQlib29sZWFuIG9sZFJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCXJlYWRPbmx5ID0gbmV3UmVhZE9ubHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFksIG9sZFJlYWRPbmx5LCByZWFkT25seSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pKEludGVybmFsRUxpc3Q8Pz4pZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlyZXR1cm4gZ2V0TG9jYXRpb24oKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRXaWR0aCgpKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0SGVpZ2h0KCkpOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX09VVEdPSU5HX0NPTk5FQ1RJT05TOgotCQkJCXJldHVybiBnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGlzUmVhZE9ubHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbigoUG9pbnQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1dJRFRIOgotCQkJCXNldFdpZHRoKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXNldEhlaWdodCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkJCWdldEluY29taW5nQ29ubmVjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEluY29taW5nQ29ubmVjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIExpbms+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBMaW5rPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fUkVBRF9PTkxZOgotCQkJCXNldFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19MT0NBVElPTjoKLQkJCQlzZXRMb2NhdGlvbihMT0NBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJc2V0V2lkdGgoV0lEVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0hFSUdIVDoKLQkJCQlzZXRIZWlnaHQoSEVJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19JTkNPTUlOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlnZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX0xPQ0FUSU9OOgotCQkJCXJldHVybiBMT0NBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbG9jYXRpb24gIT0gbnVsbCA6ICFMT0NBVElPTl9FREVGQVVMVC5lcXVhbHMobG9jYXRpb24pOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fV0lEVEg6Ci0JCQkJcmV0dXJuIHdpZHRoICE9IFdJRFRIX0VERUZBVUxUOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSEVJR0hUOgotCQkJCXJldHVybiBoZWlnaHQgIT0gSEVJR0hUX0VERUZBVUxUOwotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9fSU5DT01JTkdfQ09OTkVDVElPTlM6Ci0JCQkJcmV0dXJuIGluY29taW5nQ29ubmVjdGlvbnMgIT0gbnVsbCAmJiAhaW5jb21pbmdDb25uZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJCQlyZXR1cm4gb3V0Z29pbmdDb25uZWN0aW9ucyAhPSBudWxsICYmICFvdXRnb2luZ0Nvbm5lY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5PREVfX1JFQURfT05MWToKLQkJCQlyZXR1cm4gcmVhZE9ubHkgIT0gUkVBRF9PTkxZX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY29uc3VtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgdW1hQ29udGFpbmVyOwotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbTsKLQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JcHJvdGVjdGVkIEdyYXBoTm9kZSBncmFwaE5vZGU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQotCXByb3RlY3RlZCBJTm9kZUNoYW5nZUxpc3RlbmVyIG1ldGhvZEVsZW1lbnRBZGFwdGVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlzaWJsZSA9IHRydWU7Ci0JCi0JLyoqCi0JICogYWRkRGVmYXVsdFdvcmtPcmRlciBpcyBtb3ZlZCBmcm9tCi0JICogR3JhcGhpY2FsRGF0YUhlbHBlci5hZGREZWZhdWx0V29ya09yZGVyKE5hbWVkTm9kZUltcGwsCi0JICogV29ya2JyZWFrZG93bkVsZW1lbnQpIE1ldGhvZCB3aWxsIHNldCBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgdG8gZmFsc2UKLQkgKiBvZiBhbGwgYWRhcHRlcnMgb2YgdHlwZSBNZXRob2RFbGVtZW50QWRhcHRlciBvZiBTdWNjZXNzb3Igb2JqZWN0IGJlZm9yZQotCSAqIGNyZWF0aW5nIGEgV29ya09yZGVyIG9iamVjdC4gQWZ0ZXIgY3JlYXRpb24gb2YgV29ya09yZGVyIChQcmVkZWNlc3NvcgotCSAqIGxpbmspIHJlc3RvcmVzIHRoZSBub3RpZmljYXRpb25FbmFibGVkIGZsYWcgb2YgU3VjY2Vzc29yJ3MgYWRhcHRlcnMgb2YKLQkgKiB0eXBlIE1ldGhvZEVsZW1lbnRBZGFwdGVyLgotCSAqIAotCSAqIGVnOiBJZiBhbiBBY3Rpdml0eSAiYWN0QSIgaXMgZXh0ZW5kZWQgaW4gYW5vdGhlciBDUC4gQmFzZSAiYWN0QSIgQUQKLQkgKiBkaWFncmFtIGlzIG9wZW5lZCwgYW5kIEV4dGVuZGVkICJhY3RBIiBBRCBEaWFncmFtIGlzIG9wZW5lZC4gT24gY3JlYXRpbmcKLQkgKiBwcmVkZWNlc3NvciBsaW5rIGJldHdlZW4gYW55IHR3byBjaGlsZCBhY3Rpdml0aWVzLCBjcmVhdGVzIGEgZXh0cmEgbGluawotCSAqIGluIEV4dGVuZGVkICJhY3RBIiBBRCBkaWFncmFtLCBiZWNhdXNlIGNyZWF0aW5nIHdvcmtvcmRlciB3aWxsIG5vdGlmeSB0aGUKLQkgKiBleHRlbmRlZCAiYWN0QSIgZGlhZ3JhbSB0byBkcmF3IGEgbGluay4gVG8gYXZvaWQgZHVwbGljYXRlIGxpbmtzIGluIHRoZQotCSAqIGV4dGVuZGVkIGFjdGl2aXR5IGRpYWdyYW0sIHdlIGhhdmUgdG8gc2V0IG5vdGlmaWNhdGlvbkVuYWJsZWQgZmxhZyB0bwotCSAqIGZhbHNlLCBiZWZvcmUgY3JlYXRpbmcgYSBXb3JrT3JkZXIgb2JqZWN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXIgYWRkRGVmYXVsdFdvcmtPcmRlcihOYW1lZE5vZGVJbXBsIG5vZGUsCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkQnJlYWtkb3duRWxlbWVudCkgewotCQlib29sZWFuIG5vdGlmeSA9IG5vZGUuaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGxpc3QgPSAoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpKS5lQWRhcHRlcnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRhcHRlcikgewotCQkJCU5vZGVJbXBsIG5vZGVvYmogPSAoTm9kZUltcGwpICgoTWV0aG9kRWxlbWVudEFkYXB0ZXIpIG9iaikKLQkJCQkJCS5nZXROb2RlKCk7Ci0JCQkJYm9vbGVhbiBwcmVkTm90aWZpY2F0aW9uID0gbm9kZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQkJCSgoTm9kZUltcGwpICgoKE1ldGhvZEVsZW1lbnRBZGFwdGVyKSBvYmopLmdldE5vZGUoKSkpLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQltYXAucHV0KG5vZGVvYmosIG5ldyBCb29sZWFuKHByZWROb3RpZmljYXRpb24pKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybiBVbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCS5nZXRPYmplY3QoKSwgcHJlZEJyZWFrZG93bkVsZW1lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmeSk7Ci0JCQlTZXQgc2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qgb2JqID0gbWFwLmdldChvYmplY3QpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0JCQkJCWJvb2xlYW4gcHJlZG5vdCA9ICgoQm9vbGVhbikgb2JqKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJKChOb2RlSW1wbCkgb2JqZWN0KS5ub3RpZmljYXRpb25FbmFibGVkID0gcHJlZG5vdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSB7Ci0JCURpYWdyYW1JbXBsIGRpYWdyYW0gPSAoRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJcmV0dXJuIGRpYWdyYW0uaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQlyZXR1cm4gdmlzaWJsZSA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gbm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gbm90aWZpY2F0aW9uRW5hYmxlZCkgewotCQl0aGlzLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZmljYXRpb25FbmFibGVkOwotCX0KLQkKLX0gLy8gTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVOb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDIwMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvUm9sZU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZU5vZGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZU5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzIFJvbGVOb2RlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZU5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFJvbGVEZXNjcmlwdG9yQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5ST0xFX05PREU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBSb2xlRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gUm9sZURlc2NyaXB0b3JBZGFwdGVyLmNsYXNzOwotCX0KLX0gLy8gUm9sZU5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Sb2xlVGFza0NvbXBvc2l0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQ2ZTgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1JvbGVUYXNrQ29tcG9zaXRlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgVGFzayBDb21wb3NpdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuUm9sZVRhc2tDb21wb3NpdGVJbXBsI2dldFJvd0luZGV4IDxlbT5Sb3cgSW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlVGFza0NvbXBvc2l0ZUltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVySW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVUYXNrQ29tcG9zaXRlIHsKLQkKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um93SW5kZXgoKSA8ZW0+Um93IEluZGV4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3dJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUk9XX0lOREVYX0VERUZBVUxUID0gMDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvd0luZGV4KCkgPGVtPlJvdyBJbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um93SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgcm93SW5kZXggPSBST1dfSU5ERVhfRURFRkFVTFQ7Ci0KLS8vCXByaXZhdGUgaW50IHJvd0luZGV4OwotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBSb2xlVGFza0NvbXBvc2l0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlJPTEVfVEFTS19DT01QT1NJVEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRSb3dJbmRleCgpIHsKLQkJcmV0dXJuIHJvd0luZGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvd0luZGV4KGludCBuZXdSb3dJbmRleCkgewotCQlpbnQgb2xkUm93SW5kZXggPSByb3dJbmRleDsKLQkJcm93SW5kZXggPSBuZXdSb3dJbmRleDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWCwgb2xkUm93SW5kZXgsIHJvd0luZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRSb3dJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXNldFJvd0luZGV4KCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEVfX1JPV19JTkRFWDoKLQkJCQlzZXRSb3dJbmRleChST1dfSU5ERVhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9UQVNLX0NPTVBPU0lURV9fUk9XX0lOREVYOgotCQkJCXJldHVybiByb3dJbmRleCAhPSBST1dfSU5ERVhfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyb3dJbmRleDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyb3dJbmRleCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoQ29sbGVjdGlvbiBtaXhlZENvbGxlY3Rpb24sIE9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1peGVkQ29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmKCBlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKSApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI3NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbmV3T2JqZWN0KSB7Ci0JCXN1cGVyLnNldE9iamVjdChuZXdPYmplY3QpOwotCQlwb3B1bGF0ZU5vZGVzKG5ld09iamVjdCk7Ci0vLwkJaWYgKG5ld09iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0vLwkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKSBuZXdPYmplY3Q7Ci0vLwkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0vLwkJCUNvbGxlY3Rpb24gYWxsRWxlbWVudHMgPSBkaWFncmFtLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCUxpc3QgcHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2NyaXB0b3IpOwotLy8JCQlpZiAoIXByaW1hcnlUYXNrRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7IC8vIG92ZXJyaWRpbmcKLS8vCQkJCQkJCQkJCQkJCQkJCQkKLS8vCQkJCS8vIHVzZSBsaXN0IHRvIG1haW50YWluIG9yZGVyIG9mCi0vLwkJCQkvLyB0YXNrZGVzY3JpcHRvcnMuCi0vLwkJCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJCXRhc2tEZXNjcmlwdG9ycy5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0vLwkJCQkvLyB0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHJvbGVEZXNjcmlwdG9yLmdldFBlcmZvcm1zQWRkaXRpb25hbGx5KCkpOwotLy8JCQkJLy8gdGFza0Rlc2NyaXB0b3JzLmFkZEFsbChyb2xlRGVzY3JpcHRvci5nZXRBc3Npc3RzSW4oKSk7Ci0vLwotLy8JCQkJSGFzaFNldCBzZWxlY3RlZERlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQoKTsKLS8vCQkJCUxpc3QgdGFza05vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQkJCi0vLwkJCQlTdHJpbmcgYXV0b2xheW91dCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0QXV0b0xheW91dEZsYWcoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSlnZXREaWFncmFtKCkpOyAKLS8vCQkJCWlmKGF1dG9sYXlvdXQgIT0gbnVsbCl7Ci0vLwkJCQkJaW50IGluZGV4ID0gMDsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotLy8JCQkJCQlvYmogPSBUbmdVdGlsLnVud3JhcChvYmopOwotLy8JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLS8vCQkJCQkJCQkmJiBUbmdVdGlsLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9ycywgb2JqKSkgewotLy8JCQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIG9iajsKLS8vCi0vLwkJCQkJCQkvLyBlbGltaW5hdGUgZGVzY3JpcHRvciB0aGF0IGlzIGR1cGxpY2F0ZSwKLS8vCQkJCQkJCS8vIHN1cHByZXNzZWQgb3IgZmlsdGVyZWQgb3V0Ci0vLwkJCQkJCQkvLwotLy8JCQkJCQkJaWYgKCFzZWxlY3RlZERlc2NyaXB0b3JzLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKQotLy8JCQkJCQkJLy8gJiYgY29udGFpbnMoYWxsRWxlbWVudHMsIHRhc2tEZXNjcmlwdG9yKSAvLyBtYWtlCi0vLwkJCQkJCQkvLyBzdXJlIHRoYXQgdGFzayBkZXNjcmlwdG9yIGlzIG9mIHRoZSBvd25pbmcKLS8vCQkJCQkJCS8vIGFjdGl2aXR5Ci0vLwkJCQkJCQkpIHsKLS8vCQkJCQkJCQlzZWxlY3RlZERlc2NyaXB0b3JzLmFkZCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLS8vCQkJCQkJCQkJCXRoaXMsIHRhc2tEZXNjcmlwdG9yLAotLy8JCQkJCQkJCQkJVGFza05vZGUuY2xhc3MpOwotLy8JCQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLS8vCQkJCQkJCQkJbm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLS8vCQkJCQkJCQkJCQkuY3JlYXRlVGFza05vZGUoKTsKLS8vCQkJCQkJCQkJbm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0vLwkJCQkJCQkJCW5vZGUuc2V0T2JqZWN0KHRhc2tEZXNjcmlwdG9yKTsKLS8vCQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKQotLy8JCQkJCQkJCQkJCS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCQkJCQkJCQlpZihHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLCAKLS8vCQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpID09IG51bGwKLS8vCQkJCQkJCQkJCQl8fCBHcmFwaGljYWxEYXRhSGVscGVyLmlzQXV0b0xheW91dCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKWdldERpYWdyYW0oKSkpewotLy8JCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShub2RlCi0vLwkJCQkJCQkJCQkJLmdldEdyYXBoTm9kZSgpLAotLy8JCQkJCQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwKLS8vCQkJCQkJCQkJCQluZXcgSW50ZWdlcihpbmRleCkudG9TdHJpbmcoKSk7Ci0vLwkJCQkJCQkJCQlpbmRleCsrOwotLy8JCQkJCQkJCQl9Ci0vLwkJCQkJCQkJCQotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJCS8vIFNvcnQgdGhlIHRhc2tOb2RlIGJhc2VkIG9uIHRoZWlyIGluZGV4IGlmIGF1dG9sYXlvdXQgaXMKLS8vCQkJCQkvLyBmYWxzZQotLy8JCQkJCWlmIChHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVRfVkFMVUVfRkFMU0UKLS8vCQkJCQkJCS5lcXVhbHMoYXV0b2xheW91dCkpIHsKLS8vCQkJCQkJQ29sbGVjdGlvbnMuc29ydCh0YXNrTm9kZXMsIGNvbXBhcmF0b3IpOwotLy8JCQkJCX0KLS8vCQkJICB9ZWxzZXsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJCi0vLwkJCQkJCS8vIGVsaW1pbmF0ZSBkZXNjcmlwdG9yIHRoYXQgaXMgZHVwbGljYXRlLCBzdXBwcmVzc2VkIG9yIGZpbHRlcmVkIG91dAotLy8JCQkJCQkvLwotLy8JCQkJCQlpZighc2VsZWN0ZWREZXNjcmlwdG9ycy5jb250YWlucyh0YXNrRGVzY3JpcHRvcikKLS8vCQkJCQkJCQkmJiBjb250YWlucyhhbGxFbGVtZW50cywgdGFza0Rlc2NyaXB0b3IpIC8vIG1ha2Ugc3VyZSB0aGF0IHRhc2sgZGVzY3JpcHRvciBpcyBvZiB0aGUgb3duaW5nIGFjdGl2aXR5Ci0vLwkJCQkJCSkgewotLy8JCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwkJCQkJCi0vLwkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLAotLy8JCQkJCQkJCQl0YXNrRGVzY3JpcHRvciwgVGFza05vZGUuY2xhc3MpOwotLy8JCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0vLwkJCQkJCQlub2RlID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrTm9kZSgpOwotLy8JCQkJCQkJbm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0vLwkJCQkJCQlub2RlLnNldE9iamVjdCh0YXNrRGVzY3JpcHRvcik7Ci0vLwkJCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJdGFza05vZGVzLmFkZChub2RlKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWlmKCF0YXNrTm9kZXMuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJLy8gYWRkIHJvbGUgbm9kZQotLy8JCQkJCS8vCi0vLwkJCQkJTm9kZSBub2RlID0gKE5hbWVkTm9kZUltcGwpIE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZU5vZGUoKTsKLS8vCQkJCQlub2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLS8vCQkJCQlub2RlLnNldE9iamVjdChyb2xlRGVzY3JpcHRvcik7Ci0vLwkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotLy8JCQkJCWdldE5vZGVzKCkuYWRkKG5vZGUpOwotLy8JCQkJCS8vIGFkZCB0YXNrIG5vZGVzCi0vLwkJCQkJLy8KLS8vCQkJCQlnZXROb2RlcygpLmFkZEFsbCh0YXNrTm9kZXMpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCi0JCQotCX0KLQkKLQlwdWJsaWMgR3JhcGhOb2RlIGdldEdyYXBoTm9kZShNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJaWYgKGdldFVNQURpYWdyYW0oKSA9PSBudWxsKSB7Ci0JCQkJLy8gbmV3IE1ldGhvZEVsZW1lbnQKLQkJCQkvLwotCQkJCXJldHVybiBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCX0KLQkJCUdyYXBoTm9kZSBub2RlID0gZmluZEdyYXBoTm9kZShnZXRVTUFEaWFncmFtKCksIG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCQkvLyBjcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZ2V0VU1BRGlhZ3JhbSgpKTsKLQkJCQlnZXRVTUFEaWFncmFtKCkuZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQkJfQotCQkJU3RyaW5nIGF1dG9sYXlvdXQgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldEF1dG9MYXlvdXRGbGFnKChBY3Rpdml0eURldGFpbERpYWdyYW0pZ2V0RGlhZ3JhbSgpKTsKLQkJCWlmKGF1dG9sYXlvdXQgIT0gbnVsbCl7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShub2RlLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIG5ldyBJbnRlZ2VyKHJvd0luZGV4KS50b1N0cmluZygpKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZmluZEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBtZXRob2RFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkmJiBtZXRob2RFbGVtZW50ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZWxlbWVudAotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKSkgewotCi0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eShlbGVtZW50LCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgpOwotCQkJCQotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpbmRleCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWlmIChpbmRleCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZ2V0Um93SW5kZXgoKSA9PSBuZXcgSW50ZWdlcihpbmRleCkuaW50VmFsdWUoKSkKLQkJCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQkJfQotCQkJCX1lbHNlewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotLy8JcHVibGljIEdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoTm9kZShlbGVtZW50KTsKLS8vCQlHcmFwaGljYWxEYXRhSGVscGVyLmNyZWF0ZVByb3BlcnR5KG5vZGUsCi0vLwkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIG5ldyBJbnRlZ2VyKHJvd0luZGV4KQotLy8JCQkJCQkudG9TdHJpbmcoKSk7Ci0vLwkJcmV0dXJuIG5vZGU7Ci0vLwl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSb2xlRGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbmFsTm9kZUxpbmsgewotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYobXNnIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKSB7Ci0JCQkJT2JqZWN0IGZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbiltc2cpLmdldE9wcHNpdGVGZWF0dXJlKCk7Ci0JCQkJaWYoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzKSB7Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCWFkZE5vZGUoKFRhc2tEZXNjcmlwdG9yKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJcmVtb3ZlTm9kZShtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlhZGROb2RlKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQlyZW1vdmVOb2RlKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCQlicmVhazsJCQkJCQkKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTU9WRUVFRUVFRUQiKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShPYmplY3Qgb2xkVmFsdWUpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQlpZihkaWFncmFtID09IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUm9sZVRhc2tDb21wb3NpdGVJbXBsLnJlbW92ZU5vZGUoKTogW0VSUk9SXSBubyBkaWFncmFtIik7Ci0JCX0KLQkJQ29sbGVjdGlvbiByZW1vdmVkTm9kZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSb2xlTm9kZSkgewotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsIGQgPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbClnZXREaWFncmFtKCk7Ci0JCQkJCUxpc3QgbGlzdCA9IGQuZ2V0UmVhbGl6ZWRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcikgbm9kZS5nZXRPYmplY3QoKSk7Ci0JCQkJCWlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5zaXplKCkgPCAxKSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJcmVtb3ZlZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChub2RlLmdldE9iamVjdCgpID09IG9sZFZhbHVlKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQlyZW1vdmVkTm9kZXMuYWRkKG5vZGUpOwotCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCU5vZGUgd3Bub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCQkoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksIG9sZFZhbHVlKTsKLQkJCQkJZ2V0RGlhZ3JhbSgpLmdldE5vZGVzKCkucmVtb3ZlKHdwbm9kZSk7Ci0JCQkJCXdwbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoCi0JCQkJCQkJKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgZ2V0RGlhZ3JhbSgpLCBvbGRWYWx1ZSk7Ci0JCQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZSh3cG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQlnZXREaWFncmFtKCkuZ2V0Tm9kZXMoKS5yZW1vdmUodGhpcyk7Ci0JCX0KLQkJLy8gcHVzaEJhY2tUb0RpYWdyYW0ocmVtb3ZlZE5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROb2RlKFRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJYWRkTm9kZShnZXROb2RlcygpLCBkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShDb2xsZWN0aW9uIG5vZGVzLCBUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmKGRlc2NyaXB0b3IuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQlkZXNjcmlwdG9yLCBUYXNrTm9kZS5jbGFzcyk7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCW5vZGUgPSBkaWFncmFtLmNyZWF0ZU5vZGUoZGVzY3JpcHRvcik7Ci0JCQlpZihub2RlICE9IG51bGwpIHsKLQkJCQlpbnQgaSA9IGdldE5leHRJbmRleChnZXROb2RlcygpKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlSW1wbCkgewotCQkJCQkoKFRhc2tOb2RlSW1wbCkgbm9kZSkuZG9TZXRJbmRleChpICsgMSk7Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQlDb2xsZWN0aW9uIGlucHV0T3V0cHV0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZGlhZ3JhbS5jcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcyhkZXNjcmlwdG9yLCBpbnB1dE91dHB1dE5vZGVzKTsJCQkJCi0JCQkJaWYgKCFpbnB1dE91dHB1dE5vZGVzLmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtLmdldE5vZGVzKCkuYWRkQWxsKGlucHV0T3V0cHV0Tm9kZXMpOwotCQkJCQlkaWFncmFtLnBvcHVsYXRlTGlua3MoaW5wdXRPdXRwdXROb2RlcywgZmFsc2UpOwotCQkJCX0KLQkJCX0KLSAJCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkVmFsdWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKG5vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0JCQkJbm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWdldE5vZGVzKCkucmVtb3ZlQWxsKG5vZGVzKTsKLQkJLy8gcHVzaEJhY2tUb0RpYWdyYW0obm9kZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJQ29sbGVjdGlvbiBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCWFkZE5vZGUobm9kZXMsIGRlc2NyaXB0b3IpOwotCQl9Ci0KLQkJZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBSb2xlRGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXROZXh0SW5kZXgoTGlzdCBub2RlcykgewotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7CQkJCi0vLwkJCWlmKG9iaiBpbnN0YW5jZW9mIE5vZGUpewotLy8JCQkJTm9kZSBub2RlID0gKE5vZGUpb2JqOwotLy8JCQkJLy9TdHJpbmcgdGVtcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KG5vZGUuZ2V0R3JhcGhOb2RlKCksIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCkuZ2V0VmFsdWUoKTsKLS8vCQkJCUxpc3QgbGlzdCA9IG5vZGUuZ2V0R3JhcGhOb2RlKCkuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLS8vCQkJCWlmKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpewotLy8JCQkJCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0vLwkJCQkJCVByb3BlcnR5IHByb3AgPSAoUHJvcGVydHkpIGxpc3QuZ2V0KGkpOwotLy8JCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYLmVxdWFscyhwcm9wLmdldEtleSgpKSl7Ci0vLwkJCQkJCQlpbnQgdGVtcCAgPSBJbnRlZ2VyLnBhcnNlSW50KHByb3AuZ2V0VmFsdWUoKSk7Ci0vLwkJCQkJCQlpZih0ZW1wID4gaW5kZXggKSBpbmRleCA9IHRlbXA7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFRhc2tOb2RlSW1wbCkgewotCQkJCWludCBpZCA9ICgoVGFza05vZGVJbXBsKW9iaikuZG9HZXRJbmRleCgpOwotCQkJCWlmKGlkID4gaW5kZXgpIHsKLQkJCQkJaW5kZXggPSBpZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKSB7Ci0JCQlpZiAob2JqMSA9PSBvYmoyKQotCQkJCXJldHVybiAwOwotCQkJaWYob2JqMSBpbnN0YW5jZW9mIFRhc2tOb2RlSW1wbCAmJiBvYmoyIGluc3RhbmNlb2YgVGFza05vZGVJbXBsKXsKLQkJCQlUYXNrTm9kZUltcGwgbm9kZTEgPSAoVGFza05vZGVJbXBsKW9iajE7Ci0JCQkJVGFza05vZGVJbXBsIG5vZGUyID0gKFRhc2tOb2RlSW1wbClvYmoyOwotCQkJCWlmKG5vZGUxLmRvR2V0SW5kZXgoKSA+ICBub2RlMi5kb0dldEluZGV4KCkpCi0JCQkJCXJldHVybiAxOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCX07Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVUYXNrSW5wdXRPdXRwdXROb2RlcyhUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDb2xsZWN0aW9uIG5vZGVzKSB7Ci0JCU5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0JCWlmICghZGVzY3JpcHRvci5nZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKSkgewotCQkJbmV3Tm9kZSA9IGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKGRlc2NyaXB0b3IsCi0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUyk7Ci0JCQlub2Rlcy5hZGQobmV3Tm9kZSk7Ci0JCX0KLQkJaWYgKCFkZXNjcmlwdG9yLmdldE91dHB1dCgpLmlzRW1wdHkoKSkgewotCQkJbmV3Tm9kZSA9IGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlKGRlc2NyaXB0b3IsCi0JCQkJCVdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpOwotCQkJbm9kZXMuYWRkKG5ld05vZGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBXb3JrUHJvZHVjdENvbXBvc2l0ZSBjcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yLCBpbnQgdHlwZSkgewotCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB3b3JrcHJvZHVjdENvbXBvc2l0ZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGUoKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0VU1BQ29udGFpbmVyKGdldEdyYXBoTm9kZSgpKTsKLQkJd29ya3Byb2R1Y3RDb21wb3NpdGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRUeXBlKHR5cGUpOwotCQl3b3JrcHJvZHVjdENvbXBvc2l0ZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotCQlyZXR1cm4gd29ya3Byb2R1Y3RDb21wb3NpdGU7Ci0JfQotCQotCXByaXZhdGUgVGFza05vZGUgY3JlYXRlVGFza05vZGUoVGFza0Rlc2NyaXB0b3IgdGQpIHsKLQkJVGFza05vZGUgdGFza05vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFRhc2tOb2RlKSB7Ci0JCQkJVGFza05vZGUgdG4gPSAoVGFza05vZGUpIG5vZGU7Ci0JCQkJaWYodG4uZ2V0TGlua2VkRWxlbWVudCgpID09IHRkKSB7Ci0JCQkJCXRhc2tOb2RlID0gdG47Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZih0YXNrTm9kZSA9PSBudWxsKSB7Ci0JCQl0YXNrTm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza05vZGUoKTsKLQkJCXRhc2tOb2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQl0YXNrTm9kZS5zZXRPYmplY3QodGQpOwotCQlyZXR1cm4gdGFza05vZGU7Ci0JfQotCQotCXByaXZhdGUgUm9sZU5vZGUgY3JlYXRlUm9sZU5vZGUoUm9sZURlc2NyaXB0b3IgcmQpIHsKLQkJUm9sZU5vZGUgcm9sZU5vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFJvbGVOb2RlKSB7Ci0JCQkJUm9sZU5vZGUgcm4gPSAoUm9sZU5vZGUpIG5vZGU7Ci0JCQkJaWYocm4uZ2V0TGlua2VkRWxlbWVudCgpID09IHJkKSB7Ci0JCQkJCXJvbGVOb2RlID0gcm47Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihyb2xlTm9kZSA9PSBudWxsKSB7Ci0JCQlyb2xlTm9kZSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZU5vZGUoKTsKLQkJCXJvbGVOb2RlLnNldERpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQkJCXJvbGVOb2RlLnNldE9iamVjdChyZCk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVOb2RlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZU5vZGVzKE9iamVjdCBuZXdPYmplY3QpewotCQkKLQkJaWYgKG5ld09iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgbmV3T2JqZWN0OwotCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJCUNvbGxlY3Rpb24gYWxsRWxlbWVudHMgPSBkaWFncmFtLmdldEFsbEJyZWFrZG93bkVsZW1lbnRzKHRydWUpOwotCQkJTGlzdCB0YXNrTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlMaXN0IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmICghcHJpbWFyeVRhc2tEZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsgLy8gb3ZlcnJpZGluZwotCQkJCQkJCQkJCQkJCQkJCQkKLQkJCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkQWxsKHByaW1hcnlUYXNrRGVzY3JpcHRvcnMpOwotCQkJCUhhc2hTZXQgc2VsZWN0ZWREZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJYm9vbGVhbiBhdXRvTGF5b3V0ID0gKChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKWdldERpYWdyYW0oKSkuaXNBdXRvTGF5b3V0KCk7Ci0JCQkJaWYoYXV0b0xheW91dCkgewotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlpbnQgcm93VGFza3NDb3VudCA9IDA7Ci0JCQkJCWludCBzdGFydENvdW50ID0gMDsKLQkJCQkJCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCQkJCQkmJiBUbmdVdGlsLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9ycywgb2JqKSkgewotCQkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQkJCi0JCQkJCQkJaWYoc3RhcnRDb3VudCA8IHJvd0luZGV4ICogR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXNrc1BlclJvdygpKXsKLQkJCQkJCQkJc3RhcnRDb3VudCsrOwotCQkJCQkJCX0gZWxzZSB7Ci0KLQkJCQkJCQkJaWYgKCFzZWxlY3RlZERlc2NyaXB0b3JzCi0JCQkJCQkJCQkJLmNvbnRhaW5zKHRhc2tEZXNjcmlwdG9yKSkgewotCQkJCQkJCQkJc2VsZWN0ZWREZXNjcmlwdG9ycy5hZGQodGFza0Rlc2NyaXB0b3IpOwotCQkJCQkJCQkJTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kTm9kZSgKLQkJCQkJCQkJCQkJdGhpcywgdGFza0Rlc2NyaXB0b3IsCi0JCQkJCQkJCQkJCVRhc2tOb2RlLmNsYXNzKTsKLQkJCQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLS8vCQkJCQkJCQkJCW5vZGUgPSBjcmVhdGVUYXNrTm9kZSh0YXNrRGVzY3JpcHRvciwKLS8vCQkJCQkJCQkJCQkJaW5kZXgsIGFsbEVsZW1lbnRzKTsKLQkJCQkJCQkJCQlub2RlID0gY3JlYXRlVGFza05vZGUodGFza0Rlc2NyaXB0b3IpOwotCQkJCQkJCQkJCVRhc2tOb2RlSW1wbCB0biA9IChUYXNrTm9kZUltcGwpIG5vZGU7Ci0JCQkJCQkJCQkJaWYgKGF1dG9MYXlvdXQgfHwgdG4uZG9HZXRJbmRleCgpID09IC0xKSB7Ci0JCQkJCQkJCQkJCXRuLmRvU2V0SW5kZXgoaW5kZXgpOwotLy8JCQkJCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCS8vcmV0dXJuIG5vZGU7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkvLyB0aGlzIHdpbGwgbWFrZSBzdXJlIHRoYXQgbGluayBiZXR3ZWVuIHRoZSBub2RlIGFuZCBsaW5rZWQgZWxlbWVudCBpcyBlc3RhYmxpc2hlZAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJbm9kZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCi0JCQkJCQkJCQlpZiAocm93VGFza3NDb3VudCA8IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCQkJCQkJLmdldFRhc2tzUGVyUm93KCkpIHsKLQkJCQkJCQkJCQl0YXNrTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJCQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBUYXNrTm9kZSl7Ci0JCQkJCQkJCQkJCSgoVGFza05vZGUpbm9kZSkuc2V0SW5kZXgoaW5kZXgpOwotCQkJCQkJCQkJCQlpbmRleCsrOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlyb3dUYXNrc0NvdW50Kys7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIFNvcnQgdGhlIHRhc2tOb2RlIGJhc2VkIG9uIHRoZWlyIGluZGV4IGlmIGF1dG9sYXlvdXQgaXMKLQkJCQkJLy8gZmFsc2UKLQkJCQkJaWYgKCFhdXRvTGF5b3V0KSB7Ci0JCQkJCQlDb2xsZWN0aW9ucy5zb3J0KHRhc2tOb2RlcywgY29tcGFyYXRvcik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlMaXN0IG9sZFRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJRGlhZ3JhbSB1bWFEaWFncmFtID0gZ2V0VU1BRGlhZ3JhbSgpOwotCQkJCQlpZih1bWFEaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCS8vIExhbWUgd2F5IG9mIGRvaW5nIHRoaXMsIHRvIGZpeCBhIGRlZmVjdCBvZiAxLjAgdG8gMS4wLjEgbWlncmF0aW9uCQkJCSAgCi0JCQkJCQlMaXN0IGdyYXBoTm9kZXMgPSB1bWFEaWFncmFtLmdldENvbnRhaW5lZCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JhcGhOb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCU9iamVjdCBicmlkZ2UgPSBlbGVtZW50LmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJCQlpZihicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKXsKLQkJCQkJCQkJT2JqZWN0IHRhc2tPYmplY3QgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpYnJpZGdlKS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCUxpc3QgbGlzdCA9IGVsZW1lbnQuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFByb3BlcnR5QnlLZXkobGlzdCwKLQkJCQkJCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQkJCQkJaWYgKHRhc2tEZXNjcmlwdG9ycy5jb250YWlucyh0YXNrT2JqZWN0KSAmJiBwcm9wZXJ0eSA9PSBudWxsKSB7Ci0JCQkJCQkJCQlvbGRUYXNrRGVzY3JpcHRvcnMuYWRkKHRhc2tPYmplY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmKG5vZGUuZ2V0TGlua2VkRWxlbWVudCgpIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJb2xkVGFza0Rlc2NyaXB0b3JzLmFkZChub2RlLmdldExpbmtlZEVsZW1lbnQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFRhc2tEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQotCQkJCQkJLy8gZWxpbWluYXRlIGRlc2NyaXB0b3IgdGhhdCBpcyBkdXBsaWNhdGUsIHN1cHByZXNzZWQgb3IgZmlsdGVyZWQgb3V0Ci0JCQkJCQkvLwotCQkJCQkJaWYoIXNlbGVjdGVkRGVzY3JpcHRvcnMuY29udGFpbnModGFza0Rlc2NyaXB0b3IpCi0JCQkJCQkJCSYmIGNvbnRhaW5zKGFsbEVsZW1lbnRzLCB0YXNrRGVzY3JpcHRvcikgLy8gbWFrZSBzdXJlIHRoYXQgdGFzayBkZXNjcmlwdG9yIGlzIG9mIHRoZSBvd25pbmcgYWN0aXZpdHkKLQkJCQkJCSkgewotCQkJCQkJCXNlbGVjdGVkRGVzY3JpcHRvcnMuYWRkKHRhc2tEZXNjcmlwdG9yKTsJCQkJCQotCQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUoZ2V0RGlhZ3JhbSgpLAotCQkJCQkJCQkJdGFza0Rlc2NyaXB0b3IsIFRhc2tOb2RlLmNsYXNzKTsKLQkJCQkJCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJCQkJCW5vZGUgPSBjcmVhdGVUYXNrTm9kZSh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJCQkJCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGFza05vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmKCF0YXNrTm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gYWRkIHJvbGUgbm9kZQotCQkJCS8vCi0JCQkJTmFtZWROb2RlSW1wbCBuYW1lZE5vZGUgPSAoKE5hbWVkTm9kZUltcGwpIGNyZWF0ZVJvbGVOb2RlKHJvbGVEZXNjcmlwdG9yKSk7Ci0JCQkJbmFtZWROb2RlLnZpc2libGUgPSB0cnVlOwotCQkJCW5hbWVkTm9kZS5zZXRJdGVtUHJvdmlkZXIoYWxsRWxlbWVudHMpOwotCQkJCWdldE5vZGVzKCkuYWRkKG5hbWVkTm9kZSk7CQkKLQkJCQl0YXNrTm9kZXMuYWRkKG5hbWVkTm9kZSk7Ci0JCQl9Ci0JCQlzZWxlY3ROb2Rlcyh0YXNrTm9kZXMpOwotCQl9Ci0JCQotCX0KLQkKLS8vCXB1YmxpYyBOb2RlIGNyZWF0ZVRhc2tOb2RlKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yLCBpbnQgaW5kZXgsIENvbGxlY3Rpb24gYWxsRWxlbWVudHMpIHsKLS8vCQlOb2RlIG5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tOb2RlKCk7Ci0vLwkJbm9kZS5zZXREaWFncmFtKGdldERpYWdyYW0oKSk7Ci0vLwkJbm9kZS5zZXRPYmplY3QodGFza0Rlc2NyaXB0b3IpOwotLy8JCSgoTmFtZWROb2RlSW1wbCkgbm9kZSkuc2V0SXRlbVByb3ZpZGVyKGFsbEVsZW1lbnRzKTsKLS8vCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5maW5kUHJvcGVydHkobm9kZS5nZXRHcmFwaE5vZGUoKSwKLS8vCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCkgPT0gbnVsbAotLy8JCQkJfHwgR3JhcGhpY2FsRGF0YUhlbHBlcgotLy8JCQkJCQkuaXNBdXRvTGF5b3V0KChBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSkpIHsKLS8vCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5jcmVhdGVQcm9wZXJ0eShub2RlLmdldEdyYXBoTm9kZSgpLAotLy8JCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9JTkRFWCwgbmV3IEludGVnZXIoaW5kZXgpCi0vLwkJCQkJCQkudG9TdHJpbmcoKSk7Ci0vLwkJCWluZGV4Kys7Ci0vLwkJfQotLy8JCXJldHVybiBub2RlOwotLy8JfQotCQotfSAvLyBSb2xlVGFza0NvbXBvc2l0ZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1Rhc2tOb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVGFza05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTIxZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvVGFza05vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlRhc2tOb2RlSW1wbCNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMgVGFza05vZGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleCgpIDxlbT5JbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IElOREVYX0VERUZBVUxUID0gLTE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleCgpIDxlbT5JbmRleDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgaW5kZXggPSBJTkRFWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBUYXNrTm9kZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJbWV0aG9kRWxlbWVudEFkYXB0ZXIgPSBuZXcgVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLkxpdGVyYWxzLlRBU0tfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCQotCXB1YmxpYyBpbnQgZG9HZXRJbmRleCgpIHsKLQkJaWYoaXNHcmFwaGljYWxEYXRhUmVxdWlyZWQoKSkgewotCQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHkodGhpcywgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0lOREVYKTsKLQkJCWlmKHByb3AgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBpID0gSW50ZWdlci5wYXJzZUludChwcm9wLmdldFZhbHVlKCkpOwotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEluZGV4KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5kZXgoaW50IG5ld0luZGV4KSB7Ci0JCWludCBvbGRJbmRleCA9IGluZGV4OwotCQlpbmRleCA9IG5ld0luZGV4OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWCwgb2xkSW5kZXgsIGluZGV4KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvU2V0SW5kZXgoaW50IG5ld0luZGV4KSB7Ci0JCWlmKGlzR3JhcGhpY2FsRGF0YVJlcXVpcmVkKCkpIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuY3JlYXRlUHJvcGVydHkoZ2V0R3JhcGhOb2RlKCksIAotCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfSU5ERVgsIFN0cmluZy52YWx1ZU9mKG5ld0luZGV4KSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRJbmRleChuZXdJbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXJldHVybiBuZXcgSW50ZWdlcihnZXRJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuVEFTS19OT0RFX19JTkRFWDoKLQkJCQlzZXRJbmRleCgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UQVNLX05PREVfX0lOREVYOgotCQkJCXNldEluZGV4KElOREVYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERV9fSU5ERVg6Ci0JCQkJcmV0dXJuIGluZGV4ICE9IElOREVYX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW5kZXg6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaW5kZXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhc2tEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJaGFuZGxlZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJaGFuZGxlZCA9IHRydWU7Ci0JCQkJYnJlYWs7CQkJCQotCQkJfQotCQkJaWYoaGFuZGxlZCAmJiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BREQgfHwgbXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkpIHsgCi0JCQkJQWN0aXZpdHlEZXRhaWxEaWFncmFtSW1wbCBkaWFncmFtID0gKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKTsKLQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLS8vCQkJCQlkaWFncmFtLnNldE9iamVjdChkaWFncmFtLmdldE9iamVjdCgpKTsKLQkJCQkJQ29sbGVjdGlvbiBpbnB1dE91cHV0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWRpYWdyYW0uY3JlYXRlVGFza0lucHV0T3V0cHV0Tm9kZXMoKFRhc2tEZXNjcmlwdG9yKSBtc2cuZ2V0Tm90aWZpZXIoKSwgaW5wdXRPdXB1dE5vZGVzKTsKLQkJCQkJaWYoIWlucHV0T3VwdXROb2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5hZGRBbGwoaW5wdXRPdXB1dE5vZGVzKTsKLQkJCQkJCWRpYWdyYW0ucG9wdWxhdGVMaW5rcyhpbnB1dE91cHV0Tm9kZXMsIGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLS8vCQkJTWV0aG9kRWxlbWVudCBvYmo7Ci0vLwkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotLy8JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0vLwkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotLy8JCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0vLwkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotLy8JCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotLy8JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJfQotLy8JCQkJCXJldHVybjsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotLy8JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotLy8JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLS8vCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJYWRkT3V0Z29pbmdDb25uZWN0aW9uKG9iaik7Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotLy8JCQkJCW9iaiA9IChNZXRob2RFbGVtZW50KSBtc2cuZ2V0T2xkVmFsdWUoKTsKLS8vCQkJCQlyZW1vdmVPdXRnb2luZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLS8vCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQkJCWFkZE91dGdvaW5nQ29ubmVjdGlvbihvYmopOwotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm47Ci0vLwkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLS8vCQkJCQljb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpOwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotLy8JCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotLy8JCQkJCQlyZW1vdmVPdXRnb2luZ0Nvbm5lY3Rpb24ob2JqKTsKLS8vCQkJCQl9Ci0vLwkJCQkJcmV0dXJuOwotLy8JCQkJfQotLy8JCQkJYnJlYWs7Ci0vLwkJCX0KLQotCQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uKG1zZyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSU5vZGVDaGFuZ2VMaXN0ZW5lciNnZXROb2RlKCkKLQkJICovCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gVGFza05vZGVJbXBsLnRoaXM7Ci0JCX0KLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5OYW1lZE5vZGVJbXBsI3NldE9iamVjdChqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBuZXdPYmplY3QpIHsKLQkvLyBPYmplY3Qgb2xkT2JqZWN0ID0gb2JqZWN0OwotCS8vIG9iamVjdCA9IG5ld09iamVjdDsKLQkvLyBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JLy8gZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkvLyBNb2RlbFBhY2thZ2UuTElOS0VEX09CSkVDVF9fT0JKRUNULCBvbGRPYmplY3QsIG9iamVjdCkpOwotCS8vCi0JLy8gaWYobmV3T2JqZWN0ID09IG51bGwpIHJldHVybjsKLQkvLwkJCi0JLy8gTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG5ld09iamVjdDsKLQkvLyBpZihlbGVtZW50ICE9IG51bGwgJiYgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgIT0gbnVsbCkgewotCS8vIC8vIHJlbW92ZSBvbGQgbWV0aG9kRWxlbWVudEFkYXB0ZXIKLQkvLyAvLwotCS8vIE9iamVjdCBvbGRBZGFwdGVyID0gVW1hVXRpbC5nZXRBZGFwdGVyKGVsZW1lbnQsCi0JLy8gZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkpOwotCS8vIGlmKG9sZEFkYXB0ZXIgIT0gbnVsbCkgewotCS8vIGVsZW1lbnQuZUFkYXB0ZXJzKCkucmVtb3ZlKG9sZEFkYXB0ZXIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZ3JhcGhOb2RlID0KLQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEdyYXBoTm9kZShnZXRVTUFEaWFncmFtKCksCi0JLy8gZWxlbWVudCk7Ci0JLy8gICAgICAgIAotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiTm9kZUltcGwuc2V0T2JqZWN0KCk6IGVsZW1lbnQ6ICciICsKLQkvLyBlbGVtZW50LmdldE5hbWUoKSArICInLCBncmFwaE5vZGU6ICIgKyBncmFwaE5vZGUpOwotCS8vICAgICAgICAKLQkvLyAvLyBwb3B1bGF0ZSBkYXRhCi0JLy8gLy8KLQkvLyBzZXRIZWlnaHQoZ3JhcGhOb2RlLmdldFNpemUoKS5nZXRIZWlnaHQoKS5pbnRWYWx1ZSgpKTsKLQkvLyBzZXRMb2NhdGlvbihHcmFwaGljYWxEYXRhSGVscGVyLnRvUG9pbnQoZ3JhcGhOb2RlLmdldFBvc2l0aW9uKCkpKTsKLQkvLyBzZXRXaWR0aChncmFwaE5vZGUuZ2V0U2l6ZSgpLmdldFdpZHRoKCkuaW50VmFsdWUoKSk7Ci0JLy8gICAgICAgIAotCS8vIC8vIGFkZCBtZXRob2RFbGVtZW50QWRhcHRlcgotCS8vIC8vCi0JLy8gaWYobWV0aG9kRWxlbWVudEFkYXB0ZXIgIT0gbnVsbCkgewotCS8vIGVsZW1lbnQuZUFkYXB0ZXJzKCkuYWRkKG1ldGhvZEVsZW1lbnRBZGFwdGVyKTsKLQkvLyB9Ci0JLy8gICAgICAgIAotCS8vIHRoaXMuZUFkYXB0ZXJzKCkuYWRkKGNyZWF0ZU5vZGVBZGFwdGVyKCkpOwotCS8vCi0JLy8gc2V0TmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2FkZFRvVU1BKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmspCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy9UYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZ2V0T2JqZWN0KCk7Ci0JCU5vZGVJbXBsIG5vZGVJbXBsID0gKE5vZGVJbXBsKSBsaW5rLmdldFNvdXJjZSgpOwotCQlib29sZWFuIG5vdGlmeSA9IG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCWJvb2xlYW4gbm90aWZ5U291cmNlID0gbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJdHJ5IHsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCS8vIHRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkpOwotCQl9IGZpbmFsbHkgewotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJCW5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnlTb3VyY2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTm9kZUltcGwjcmVtb3ZlRnJvbVVNQShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSwgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVGcm9tVU1BKExpbmsgbGluaywgTm9kZSBvbGRTb3VyY2UsIE5vZGUgb2xkVGFyZ2V0KSB7Ci0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBnZXRPYmplY3QoKTsKLQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkucmVtb3ZlKGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCkpOwotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQotfSAvLyBUYXNrTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1R5cGVkTm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1R5cGVkTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmOWZhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9UeXBlZE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlZCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLlR5cGVkTm9kZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFR5cGVkTm9kZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIFR5cGVkTm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEVfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHlwZWROb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuVFlQRURfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgbmV3VHlwZSkgewotCQlpbnQgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoKEludGVnZXIpbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQkvL3BvcHVsYXRlIGRhdGEgZnJvbSBsaW5rZWQgR3JhcGhOb2RlCi0JCS8vIAotCQlncmFwaE5vZGUgPSAoR3JhcGhOb2RlKSBuZXdPYmplY3Q7Ci0JCXNldFdpZHRoKGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0V2lkdGgoKS5pbnRWYWx1ZSgpKTsKLQkJc2V0SGVpZ2h0KGdyYXBoTm9kZS5nZXRTaXplKCkuZ2V0SGVpZ2h0KCkuaW50VmFsdWUoKSk7Ci0JCXNldExvY2F0aW9uKEdyYXBoaWNhbERhdGFIZWxwZXIudG9Qb2ludChncmFwaE5vZGUuZ2V0UG9zaXRpb24oKSkpOwotLy8JCSB0aGlzLmVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlckltcGwoKSB7Ci0JCS8vIC8qIChub24tSmF2YWRvYykKLQkJLy8gKiBAc2VlCi0JCS8vIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGwjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JCS8vICovCi0JCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgZ2V0T2JqZWN0KCk7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKFR5cGVkTm9kZS5jbGFzcykpIHsKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fV0lEVEg6Ci0JCS8vIGdyYXBoTm9kZS5nZXRTaXplKCkuc2V0V2lkdGgobmV3IERvdWJsZShtc2cuZ2V0TmV3SW50VmFsdWUoKSkpOwotCQkvLyByZXR1cm47Ci0JCS8vICAgICAgICAgICAgICAgICAgICAKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fSEVJR0hUOgotCQkvLyBncmFwaE5vZGUuZ2V0U2l6ZSgpLnNldEhlaWdodChuZXcgRG91YmxlKG1zZy5nZXROZXdJbnRWYWx1ZSgpKSk7Ci0JCS8vIHJldHVybjsKLQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAKLQkJLy8gY2FzZSBNb2RlbFBhY2thZ2UuVFlQRURfTk9ERV9fTE9DQVRJT046Ci0JCS8vIFBvaW50IHAgPSAoUG9pbnQpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlR5cGVkTm9kZUltcGwkLm5vdGlmeUNoYW5nZWQoKTogbmV3IGxvY2F0aW9uOiAiICsKLQkJLy8gcCArICIuICIgKyBUeXBlZE5vZGVJbXBsLnRoaXMpOwotCQkvLyBncmFwaE5vZGUuZ2V0UG9zaXRpb24oKS5zZXRYKG5ldyBEb3VibGUocC54KSk7Ci0JCS8vIGdyYXBoTm9kZS5nZXRQb3NpdGlvbigpLnNldFkobmV3IERvdWJsZShwLnkpKTsKLQkJLy8gcmV0dXJuOwotCQkvLyAgICAgICAgICAgICAgICAgICAgCi0JCS8vIGNhc2UgTW9kZWxQYWNrYWdlLlRZUEVEX05PREVfX0lOQ09NSU5HX0NPTk5FQ1RJT05TOgotCQkvLyBMaW5rIGxpbms7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkvLyBhZGRUb1VNQSgoTGluaykgbXNnLmdldE5ld1ZhbHVlKCkpOwotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkvLyAuaGFzTmV4dCgpOykgewotCQkvLyBhZGRUb1VNQSgoTGluaykgaXRlci5uZXh0KCkpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCS8vIGxpbmsgPSAoTGluaykgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCS8vIGlmKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkvLyAoKE5vZGVJbXBsKWxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywgbGluay5nZXRTb3VyY2UoKSwKLQkJLy8gKE5vZGUpbXNnLmdldE5vdGlmaWVyKCkpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXRPbGRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGxpbmsuZ2V0U291cmNlKCkgIT0gbnVsbCkgewotCQkvLyAoKE5vZGVJbXBsKWxpbmsuZ2V0U291cmNlKCkpLnJlbW92ZUZyb21VTUEobGluaywgbGluay5nZXRTb3VyY2UoKSwKLQkJLy8gKE5vZGUpbXNnLmdldE5vdGlmaWVyKCkpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuOwotCQkvLwotCQkvLyBjYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFX19PVVRHT0lOR19DT05ORUNUSU9OUzoKLQkJLy8gc3dpdGNoKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBtc2cuZ2V0TmV3VmFsdWUoKSk7Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXROZXdWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGFkZFRvVU1BKChMaW5rKSBpdGVyLm5leHQoKSk7Ci0JCS8vIH0KLQkJLy8gYnJlYWs7Ci0JCS8vCi0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJLy8gbGluayA9IChMaW5rKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJLy8gaWYobGluay5nZXRUYXJnZXQoKSAhPSBudWxsKSB7Ci0JCS8vIHJlbW92ZUZyb21VTUEobGluaywgKE5vZGUpbXNnLmdldE5vdGlmaWVyKCksIGxpbmsuZ2V0VGFyZ2V0KCkpOwotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXRPbGRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkvLyByZW1vdmVGcm9tVU1BKGxpbmssIChOb2RlKW1zZy5nZXROb3RpZmllcigpLCBsaW5rLmdldFRhcmdldCgpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIH0pOwotCQllQWRhcHRlcnMoKS5hZGQobmV3IE5vZGVBZGFwdGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudEFkYXB0ZXJUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhZGRUb1VNQShMaW5rIGxpbmspIHsKLQkJaWYgKCFzdXBlci5hZGRUb1VNQShsaW5rKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgaW5zdGFuY2VvZiBUeXBlZE5vZGUKLQkJCQkJJiYgKChUeXBlZE5vZGUpIGxpbmsuZ2V0VGFyZ2V0KCkpLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuU1lOQ0hfQkFSKSB7Ci0JCQkJQ29sbGVjdGlvbiB0YXJnZXRBY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLmdldFN5bmNCYXJUYXJnZXROb2RlcygoVHlwZWROb2RlKSBsaW5rCi0JCQkJCQkuZ2V0VGFyZ2V0KCksIHRhcmdldEFjdE5vZGVzKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKChOYW1lZE5vZGVJbXBsKSBpdGVyLm5leHQoKSk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJLmdldE9iamVjdCgpLCAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsKLQkJCQkJCQkuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkpID09IG51bGwpIHsKLQkJCQkJCWFkZERlZmF1bHRXb3JrT3JkZXIobm9kZSwgKFdvcmtCcmVha2Rvd25FbGVtZW50KSBsaW5rCi0JCQkJCQkJCS5nZXRTb3VyY2UoKS5nZXRPYmplY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJLy8gUHJlZGVjZXNzb3Igc2hvdWxkIGJlIGNyZWF0ZWQgb25seSBpbiBjYXNlIG9mCi0JCQkvLyBTeW5jcm9uaXphdGlvbiBCYXIsIG5vdCBmb3IgRGVjaXNpb25Qb2ludC4KLQkJCWlmICgoKFR5cGVkTm9kZSkgbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQlDb2xsZWN0aW9uIHNyY0FjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclNvdXJjZU5vZGVzKChUeXBlZE5vZGUpIGxpbmsKLQkJCQkJCS5nZXRTb3VyY2UoKSwgc3JjQWN0Tm9kZXMpOwotCQkJCUNvbGxlY3Rpb24gdGFyZ2V0QWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSkgbGluawotCQkJCQkJLmdldFRhcmdldCgpLCB0YXJnZXRBY3ROb2Rlcyk7Ci0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKChOYW1lZE5vZGVJbXBsKSBpdGVyLm5leHQoKSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzcmNBY3ROb2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE5vZGUpIGl0ZXJhdG9yCi0JCQkJCQkJCS5uZXh0KCkpLmdldE9iamVjdCgpOwotCQkJCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkJLmdldE9iamVjdCgpLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcihub2RlLCBwcmVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIG9sZFNvdXJjZTsKLQkJQ29sbGVjdGlvbiBzcmNBY3ROb2RlcyA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U291cmNlTm9kZXModHlwZWROb2RlLAotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZS5jbGFzcyk7Ci0KLQkJaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkvLyBPYmplY3QgcHJlZCA9ICgoTm9kZSkgaXRlcmF0b3IubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkvLyBHcmFwaGljYWxEYXRhSGVscGVyLnJlbW92ZVdvcmtPcmRlcigoTmFtZWROb2RlSW1wbCkKLQkJCQkvLyBvbGRUYXJnZXQsIHByZWQpOwotCQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJCS5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBub2RlLCBvbGRUYXJnZXQpKSB7Ci0JCQkJCXdoaWxlIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvbGRUYXJnZXQuZ2V0T2JqZWN0KCksCi0JCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQlVbWFVdGlsLnJlbW92ZVdvcmtPcmRlcigKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvbGRUYXJnZXQuZ2V0T2JqZWN0KCksCi0JCQkJCQkJCShXb3JrQnJlYWtkb3duRWxlbWVudCkgbm9kZS5nZXRPYmplY3QoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQlDb2xsZWN0aW9uIHRhcmdldEFjdE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXJnZXROb2RlcygKLQkJCQkJKFR5cGVkTm9kZSkgb2xkVGFyZ2V0LCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCi0JCQkvLyByZW1vdmUgdGhlIHdvcmsgb3JkZXJzIG9mIHRhcmdldCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSB0aGUKLQkJCS8vIHByZWRlY2Vzc29yIGluIHNyY0FjdE5vZGVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFyZ2V0QWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKChOYW1lZE5vZGVJbXBsKSBpdGVyLm5leHQoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNyY0FjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkvLyBPYmplY3QgcHJlZCA9ICgoTm9kZSkgaXRlcmF0b3IubmV4dCgpKS5nZXRPYmplY3QoKTsKLQkJCQkJLy8gR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVXb3JrT3JkZXIobm9kZSwgcHJlZCk7Ci0JCQkJCU5vZGUgcHJlZG5vZGUgPSAoTm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoR3JhcGhpY2FsRGF0YUhlbHBlci5jYW5SZW1vdmVBbGxQcmVkcyhsaW5rLCBwcmVkbm9kZSwKLQkJCQkJCQlub2RlKSkgewotCQkJCQkJd2hpbGUgKFVtYVV0aWwuZmluZFdvcmtPcmRlcigKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlLmdldE9iamVjdCgpLAotCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRub2RlLmdldE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQkJCQkJVW1hVXRpbAotCQkJCQkJCQkJLnJlbW92ZVdvcmtPcmRlcigKLQkJCQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCQkJCQkJCQkJLmdldE9iamVjdCgpLAotCQkJCQkJCQkJCQkoV29ya0JyZWFrZG93bkVsZW1lbnQpIHByZWRub2RlCi0JCQkJCQkJCQkJCQkJLmdldE9iamVjdCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLX0gLy8gVHlwZWROb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjk4MDgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UeXBlZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya0JyZWFrZG93bkVsZW1lbnROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlSW1wbCBleHRlbmRzIE5hbWVkTm9kZUltcGwgaW1wbGVtZW50cwotCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJV29ya09yZGVyIG9iajsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJYWRkSW5jb21pbmdDb25uZWN0aW9uKG9iai5nZXRQcmVkKCkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQkJCQlvYmogPSAoV29ya09yZGVyKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqLmdldFByZWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCW9iaiA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJCQkJCXJlbW92ZUluY29taW5nQ29ubmVjdGlvbihvYmouZ2V0UHJlZCgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IHRydWU7Ci0JCQl9Ci0KLQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRnJvbVVNQShMaW5rIGxpbmssIE5vZGUgb2xkU291cmNlLCBOb2RlIG9sZFRhcmdldCkgewotCQlpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgZGlyZWN0IGxpbmsKLQkJCS8vIHJlbW92ZSBXb3JrT3JkZXIKLQkJCS8vCi0JCQkvLyBHcmFwaEVkZ2UgZWRnZSA9IChHcmFwaEVkZ2UpIGxpbmsuZ2V0T2JqZWN0KCk7Ci0JCQkvLyBXb3JrT3JkZXIgb3JkZXIgPSAoV29ya09yZGVyKQotCQkJLy8gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKWVkZ2UuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudCBiZSA9IFVtYVV0aWwuZ2V0T3duZXIob3JkZXIpOwotCQkJLy8gaWYoYmUgIT0gbnVsbCkgewotCQkJTmFtZWROb2RlSW1wbCB0YXJnZXQgPSAoTmFtZWROb2RlSW1wbCkgb2xkVGFyZ2V0OwotCQkJYm9vbGVhbiBub3RpZnkgPSB0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkvLyBiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnJlbW92ZShvcmRlcik7Ci0JCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgb2xkU291cmNlLAotCQkJCQkJb2xkVGFyZ2V0KSkgewotCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0Ci0JCQkJCQkJLmdldE9iamVjdCgpLCBvbGRTb3VyY2UuZ2V0T2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCQkJCVVtYVV0aWwucmVtb3ZlV29ya09yZGVyKChXb3JrQnJlYWtkb3duRWxlbWVudCkgdGFyZ2V0Ci0JCQkJCQkJCS5nZXRPYmplY3QoKSwgb2xkU291cmNlLmdldE9iamVjdCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdGFyZ2V0Lm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQl9Ci0JCQkvLyB9Ci0JCX0gZWxzZSBpZiAob2xkVGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkvLyBnZXQgYWxsIHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzIHRoYXQgdGhpcyBUeXBlZE5vZGUgYXJlCi0JCQkvLyBjb21pbmcgdG8gYW5kCi0JCQkvLyByZW1vdmUgdGhlIFdvcmtPcmRlcnMgd2l0aCB0aGlzIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSdzCi0JCQkvLyBhY3Rpdml0eSBhcyBwcmVkZWNlc3NvciBmcm9tIHRoZW0KLQkJCS8vCi0JCQlDb2xsZWN0aW9uIGFjdE5vZGVzID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRUYXJnZXROb2RlcygKLQkJCQkJKFR5cGVkTm9kZSkgb2xkVGFyZ2V0LCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWN0Tm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZWROb2RlSW1wbCBub2RlID0gKE5hbWVkTm9kZUltcGwpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCS5nZXRPYmplY3QoKTsKLQkJCQlib29sZWFuIG5vdGlmeSA9IG5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQlub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuY2FuUmVtb3ZlQWxsUHJlZHMobGluaywgb2xkU291cmNlLAotCQkJCQkJCW5vZGUpKSB7Ci0JCQkJCQl3aGlsZSAoVW1hVXRpbC5maW5kV29ya09yZGVyKGUsIG9sZFNvdXJjZS5nZXRPYmplY3QoKSkgIT0gbnVsbCkgewotCQkJCQkJCVVtYVV0aWwucmVtb3ZlV29ya09yZGVyKGUsIG9sZFNvdXJjZS5nZXRPYmplY3QoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlub2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHJlbW92ZSBncmFwaGljYWwgZGF0YSBmcm9tIFVNQSBtb2RlbAotCQkvLwotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGluawotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZFRvVU1BKExpbmsgbGluaykgewotCQlpZiAoIXN1cGVyLmFkZFRvVU1BKGxpbmspKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCU5vZGUgc3JjID0gbGluay5nZXRTb3VyY2UoKTsKLQkJaWYgKHNyYyBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJLy8gdGhpcyBpcyBhIGRpcmVjdCBsaW5rCi0JCQkvLyBhZGQgbmV3IFdvcmtPcmRlciBvYmplY3QgdG8gVU1BCi0JCQkvLwotCQkJV29ya09yZGVyIG9yZGVyID0gbnVsbDsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2MgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIGxpbmsuZ2V0VGFyZ2V0KCkKLQkJCQkJLmdldE9iamVjdCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgc3JjLmdldE9iamVjdCgpOwotCQkJaWYgKFVtYVV0aWwuZmluZFdvcmtPcmRlcihzdWNjLCBwcmVkKSA9PSBudWxsKSB7Ci0JCQkJTm9kZUltcGwgc291cmNlTm9kZSA9ICgoTm9kZUltcGwpIHNyYyk7Ci0JCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCS8vVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKHN1Y2MsIHByZWQpOwotCQkJCQkvL0NyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJYWRkRGVmYXVsdFdvcmtPcmRlcigoTmFtZWROb2RlSW1wbClsaW5rLmdldFRhcmdldCgpLCBwcmVkKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBzb3VyY2VOb3RpZnk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZXQgdGhlIFdvcmtPcmRlciBhcyB0aGUgZWxlbWVudCBvZiB0aGUgU2VtYW50aWNNb2RlbCBvZiB0aGUKLQkJCS8vIGxpbmsncyBHcmFwaEVkZ2UKLQkJCS8vCi0JCQlHcmFwaGljYWxEYXRhSGVscGVyLnNldFNlbWFudGljTW9kZWwobGluaywgb3JkZXIpOwotCQl9IGVsc2UgaWYgKHNyYyBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCQkJLy8gZ2V0IGFsbCBXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVzIHRoYXQgYXJlIGNvbW1pbmcgdG8gdGhpcwotCQkJLy8gVHlwZWROb2RlLCBib3RoIGRpcmVjdGx5IGFuZCBpbmRpcmVjdGx5Ci0JCQkvLyBhbmQgY3JlYXRlIHdvcmsgb3JkZXJzIHdpdGggdGhlaXIgYWN0aXZpdHkgYXMgcHJlZGVjZXNzb3IKLQkJCS8vCi0KLQkJCS8vIFByZWRlY2Vzc29yIHNob3VsZCBiZSBjcmVhdGVkIG9ubHkgaW4gY2FzZSBvZgotCQkJLy8gU3luY3Jvbml6YXRpb24gQmFyLCBub3QgZm9yIERlY2lzaW9uUG9pbnQuCi0JCQlpZiAoKChUeXBlZE5vZGUpIHNyYykuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQkKLQkJCQlDb2xsZWN0aW9uIGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIEdldCB0aGUgY29sbGVjdGlvbiBpbmNvbWluZyBjb25uZWN0aW9uIG9mIHN5bmNiYXIgCi0JCQkJLy8gZXhjbHVkaW5nIGRlY2lzaW9ucG9pbnQgaW5jb21pbmcgY29ubmVjdGlvbgotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0U3luY0JhclNvdXJjZU5vZGVzKChUeXBlZE5vZGUpc3JjLCBhY3ROb2Rlcyk7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYyA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbGluawotCQkJCQkJLmdldFRhcmdldCgpLmdldE9iamVjdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQkJCWlmIChVbWFVdGlsLmZpbmRXb3JrT3JkZXIoc3VjYywgcHJlZCkgPT0gbnVsbCkgewotCQkJCQkJTm9kZUltcGwgc291cmNlTm9kZSA9ICgoTm9kZUltcGwpIG5vZGUpOwotCQkJCQkJYm9vbGVhbiBzb3VyY2VOb3RpZnkgPSBzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCS8vVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKHN1Y2MsIHByZWQpOwotCQkJCQkJCS8vIENyZWF0ZSBhIHdvcmtvcmRlciBhbmQgZGlzYWJsZSBub3RpZmljYXRpb24gZmxhZy4KLQkJCQkJCQlhZGREZWZhdWx0V29ya09yZGVyKChOYW1lZE5vZGVJbXBsKWxpbmsuZ2V0VGFyZ2V0KCkscHJlZCk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCXNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IHNvdXJjZU5vdGlmeTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBMaW5rIGFkZEluY29taW5nQ29ubmVjdGlvbihNZXRob2RFbGVtZW50IHNvdXJjZSkgewotCQlMaW5rIGxpbmsgPSBzdXBlci5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24oc291cmNlKTsKLQkJaWYgKGxpbmsgPT0gbnVsbCkKLQkJCXJldHVybiBsaW5rOwotCi0JCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRPYmplY3QoKSwgc291cmNlKTsKLQkJR3JhcGhpY2FsRGF0YUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIHdvcmtPcmRlcik7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JcHJvdGVjdGVkIExpbmsgYWRkT3V0Z29pbmdDb25uZWN0aW9uKE1ldGhvZEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUxpbmsgbGluayA9IHN1cGVyLmFkZE91dGdvaW5nQ29ubmVjdGlvbih0YXJnZXQpOwotCi0JCVdvcmtPcmRlciB3b3JrT3JkZXIgPSBVbWFVdGlsLmZpbmRXb3JrT3JkZXIoCi0JCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0YXJnZXQsIGdldE9iamVjdCgpKTsKLQkJR3JhcGhpY2FsRGF0YUhlbHBlci5zZXRTZW1hbnRpY01vZGVsKGxpbmssIHdvcmtPcmRlcik7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi19IC8vIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDA5NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLldvcmtQcm9kdWN0Q29tcG9zaXRlSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lckltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdENvbXBvc2l0ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEVfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCBuZXdUeXBlKSB7Ci0JCWludCBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0VHlwZSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0NPTVBPU0lURV9fVFlQRToKLQkJCQlzZXRUeXBlKCgoSW50ZWdlciluZXdWYWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9DT01QT1NJVEVfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhc2tEZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIFRyYW5zYWN0aW9uYWxOb2RlTGluayB7Ci0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24gbXNnKSB7Ci0JCQlkb0hhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQkJaWYoV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLnRoaXMuZ2V0Tm9kZXMoKS5pc0VtcHR5KCkpIHsJCQkJCi0JCQkJLy8gcmVmcmVzaCBkaWFncmFtCi0JCQkJLy8KLQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKCk7Ci0JCQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCWRpYWdyYW0uZ2V0Tm9kZXMoKS5yZW1vdmUoV29ya1Byb2R1Y3RDb21wb3NpdGVJbXBsLnRoaXMpOwotCQkJCQlkaWFncmFtLnNldE9iamVjdChkaWFncmFtLmdldE9iamVjdCgpKTsKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgZG9IYW5kbGVOb3RpZmljYXRpb24oTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLk9VVFBVVFMpIHsKLQkJCQkJCWFkZE5vZGUob2JqKTsKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlvYmogPSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuT1VUUFVUUykgewotCQkJCQkJcmVtb3ZlTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCU9iamVjdCBvYmogPSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJaWYgKG9iaiAhPSBudWxsICYmIHR5cGUgPT0gV29ya1Byb2R1Y3RDb21wb3NpdGUuSU5QVVRTKSB7Ci0JCQkJCQlhZGROb2RlKG9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWlmIChvYmogIT0gbnVsbCAmJiB0eXBlID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJCQkJcmVtb3ZlTm9kZShvYmopOwotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCi0JcHJpdmF0ZSBJRmlsdGVyIGdldEZpbHRlcigpIHsKLQkJRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChEaWFncmFtSW1wbCkgZ2V0RGlhZ3JhbSgpOwotCQlpZiAoZGlhZ3JhbS5maWx0ZXIgPT0gbnVsbCkgewotCQkJQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJCXJldHVybiBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBkaWFncmFtLmZpbHRlcjsKLQkJfQotCX0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCQkKLQkJc3VwZXIuc2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCXBvcHVsYXRlTm9kZXMobmV3T2JqZWN0KTsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYmFzaWNTZXRPYmplY3QoT2JqZWN0IG5ld09iamVjdCkgewotCi0JCXN1cGVyLmJhc2ljU2V0T2JqZWN0KG5ld09iamVjdCk7Ci0JCQotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQkvLyBTZXQgdGhlIFR5cGUgaW5mb3JtYXRpb24gZm9yIHdvcmtwcm9kdWN0IGNvbXBvc2l0ZS4KLQkJCWlmICh0eXBlID09IFRZUEVfRURFRkFVTFQpIHsKLQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJcHJvcGVydHkuc2V0VmFsdWUocHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCQkJCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0eS5zZXRWYWx1ZShuZXcgSW50ZWdlcihnZXRUeXBlKCkpLnRvU3RyaW5nKCkpOwotCQkJCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSB3cGROb2RlID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmKG5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlICYmIG5vZGUuZ2V0TGlua2VkRWxlbWVudCgpID09IHdwZCkgewotCQkJCXdwZE5vZGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSkgbm9kZTsKLQkJCX0KLQkJfQotCQlpZih3cGROb2RlID09IG51bGwpIHsKLQkJCXdwZE5vZGUgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUoKTsKLQkJCXdwZE5vZGUuc2V0RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQl9Ci0JCXdwZE5vZGUuc2V0T2JqZWN0KHdwZCk7Ci0JCXJldHVybiB3cGROb2RlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZU5vZGVzKE9iamVjdCBuZXdPYmplY3QpewotCQlpZiAobmV3T2JqZWN0IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCUxpc3Qgd3BsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5JTlBVVFMpIHsKLQkJCQlpZiAoISgoVGFza0Rlc2NyaXB0b3IpIG5ld09iamVjdCkuZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCkpCi0JCQkJCXdwbGlzdC5hZGRBbGwoKChUYXNrRGVzY3JpcHRvcikgbmV3T2JqZWN0KQotCQkJCQkJCS5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpLmdldE91dHB1dCgpLmlzRW1wdHkoKSkKLQkJCQkJd3BsaXN0LmFkZEFsbCgoKFRhc2tEZXNjcmlwdG9yKSBuZXdPYmplY3QpLmdldE91dHB1dCgpKTsKLQkJCX0KLQotCQkJSUZpbHRlciBmaWx0ZXIgPSBnZXRGaWx0ZXIoKTsKLQkJCUNvbGxlY3Rpb24gYWxsRWxlbWVudHMgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpZ2V0RGlhZ3JhbSgpKQotCQkJCQkJCQkJCS5nZXRBbGxCcmVha2Rvd25FbGVtZW50cyhmYWxzZSk7Ci0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkKLQkJCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0RGlhZ3JhbSgpLmdldFN1cHByZXNzaW9uKCk7Ci0vLwkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gIG5ldyBTdXBwcmVzc2lvbihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZ2V0T2JqZWN0KCkpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJLm5leHQoKTsJCQkKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdCh3cERlc2NyaXB0b3IpKSB7Ci0JCQkJCQotCQkJCQlPYmplY3Qgd3JhcHBlciA9IG51bGw7Ci0vLwkJCQkJaWYoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCl7Ci0vLwkJCQkJCXdyYXBwZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdCh3cERlc2NyaXB0b3IsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0vLwkJCQkJfQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZihUbmdVdGlsLnVud3JhcChlbGVtZW50KSA9PSB3cERlc2NyaXB0b3IpewotCQkJCQkJCXdyYXBwZXIgPSBlbGVtZW50OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKHdyYXBwZXIgPT0gbnVsbCAmJiBhZGFwdGVyRmFjdG9yeSAhPSBudWxsKXsKLQkJCQkJCXdyYXBwZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdCh3cERlc2NyaXB0b3IsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCX0KLQkJCQkJaWYod3JhcHBlciA9PSBudWxsKXsKLQkJCQkJCXdyYXBwZXIgPSB3cERlc2NyaXB0b3I7Ci0JCQkJCX0KLQkJCQkJaWYgKCFzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQod3JhcHBlcikpIHsKLQkJCQkJCU5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywKLQkJCQkJCQkJd3BEZXNjcmlwdG9yKTsKLQkJCQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQkJCQlub2RlID0gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSh3cERlc2NyaXB0b3IpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gdGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IGxpbmsgYmV0d2VlbiB0aGUgbm9kZSBhbmQgbGlua2VkIGVsZW1lbnQgaXMgZXN0YWJsaXNoZWQKLQkJCQkJCQkvLwotCQkJCQkJCW5vZGUuc2V0T2JqZWN0KHdwRGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCQkoKE5hbWVkTm9kZUltcGwpIG5vZGUpLnNldEl0ZW1Qcm92aWRlcihhbGxFbGVtZW50cyk7Ci0JCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXNlbGVjdE5vZGVzKG5vZGVzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlDb2xsZWN0aW9uIG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlhZGROb2RlKG5vZGVzLCBkZXNjcmlwdG9yKTsKLQkJfQotCi0JCWdldE5vZGVzKCkuYWRkQWxsKG5vZGVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVOb2RlKE9iamVjdCBvbGRWYWx1ZSkgewotCQlDb2xsZWN0aW9uIHJlbW92ZWROb2RlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlOb2RlIG5vZGUgPSBmaW5kTm9kZSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksCi0JCQkJCWdldE9iamVjdCgpKTsKLQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLnJlbW92ZShub2RlKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE9iamVjdCgpID09IG9sZFZhbHVlKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCQlyZW1vdmVkTm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCS8vIHB1c2hCYWNrVG9EaWFncmFtKHJlbW92ZWROb2Rlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTm9kZShPYmplY3QgZGVzY3JpcHRvcikgewotCQlhZGROb2RlKGdldE5vZGVzKCksIGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGROb2RlKENvbGxlY3Rpb24gbm9kZXMsIE9iamVjdCBkZXNjcmlwdG9yKSB7Ci0JCQotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlOb2RlIG5vZGUgPSBmaW5kTm9kZSgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBnZXREaWFncmFtKCksCi0JCQkJCWRlc2NyaXB0b3IpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSAoKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwpIGdldERpYWdyYW0oKSkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdENvbXBvc2l0ZSgKLQkJCQkJCQkJKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yLCB0aGlzLnR5cGUpOwotCQkJCWdldERpYWdyYW0oKS5nZXROb2RlcygpLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKXsKLQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUltcGwgZGlhZ3JhbSA9IChBY3Rpdml0eURldGFpbERpYWdyYW1JbXBsKSBnZXREaWFncmFtKCk7Ci0JCQlOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKHRoaXMgLAotCQkJCQlkZXNjcmlwdG9yKTsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQkJCW5vZGUgPSBkaWFncmFtLmNyZWF0ZU5vZGUoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRWYWx1ZQotCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoQ29sbGVjdGlvbiBlbGVtZW50cykgewotLy8JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChJdGVyYXRvciBpdGVyID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLS8vCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKG5vZGUuZ2V0T2JqZWN0KCkpKSB7Ci0vLwkJCQlub2Rlcy5hZGQobm9kZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZ2V0Tm9kZXMoKS5yZW1vdmVBbGwobm9kZXMpOwotLy8JCXB1c2hCYWNrVG9EaWFncmFtKG5vZGVzKTsKLS8vCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRNZXRob2RFbGVtZW50QWRhcHRlclR5cGUoKSB7Ci0JCXJldHVybiBUYXNrRGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotCi0JcHVibGljIFBvaW50IGdldExvY2F0aW9uKCkgewotCQlpZiAoZ2V0VHlwZSgpID09IFdvcmtQcm9kdWN0Q29tcG9zaXRlLklOUFVUUykgewotCQkJcmV0dXJuIHN1cGVyLmdldExvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKGdldFR5cGUoKSA9PSBXb3JrUHJvZHVjdENvbXBvc2l0ZS5PVVRQVVRTKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TG9jYXRpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBuZXcgUG9pbnQoLTEsIC0xKTsKLQkJfQotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZ2V0R3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlpZihpc0dyYXBoaWNhbERhdGFSZXF1aXJlZCgpKSB7Ci0JCQlpZiAoZ2V0VU1BRGlhZ3JhbSgpID09IG51bGwpIHsKLQkJCQkvLyBuZXcgTWV0aG9kRWxlbWVudAotCQkJCS8vCi0JCQkJcmV0dXJuIGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCX0KLQkJCUdyYXBoTm9kZSBub2RlID0gZmluZEdyYXBoTm9kZShnZXRVTUFEaWFncmFtKCksIG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCW5vZGUgPSBjcmVhdGVHcmFwaE5vZGUobWV0aG9kRWxlbWVudCk7Ci0JCQkJLy8gY3JlYXRlR3JhcGhDb25uZWN0b3JzKG5vZGUsIGdldFVNQURpYWdyYW0oKSk7Ci0JCQkJZ2V0VU1BRGlhZ3JhbSgpLmdldENvbnRhaW5lZCgpLmFkZChub2RlKTsKLQkJCX0KLQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgZmluZEdyYXBoTm9kZShEaWFncmFtIGRpYWdyYW0sIE9iamVjdCBtZXRob2RFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgZWxlbWVudCA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQuZ2V0U2VtYW50aWNNb2RlbCgpIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCQkJCQkmJiBtZXRob2RFbGVtZW50ID09ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgZWxlbWVudAotCQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKSkgewotCi0JCQkJTGlzdCBsaXN0ID0gZWxlbWVudC5nZXRMaXN0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFkpOwotCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5nZXRQcm9wZXJ0eUJ5S2V5KGxpc3QsCi0JCQkJCQlHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdHlwZVN0cmluZyA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWlmICh0eXBlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkJCWlmIChnZXRUeXBlKCkgPT0gbmV3IEludGVnZXIodHlwZVN0cmluZykuaW50VmFsdWUoKSkKLQkJCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaE5vZGUoKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZ3JhcGhOb2RlLnNldFNlbWFudGljTW9kZWwobW9kZWxCcmlkZ2UpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHBvaW50ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcG9pbnQuc2V0WChuZXcgRG91YmxlKC0xKSk7Ci0JCXBvaW50LnNldFkobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0UG9zaXRpb24ocG9pbnQpOwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiBkaW0gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaW1lbnNpb24oKTsKLQkJZGltLnNldFdpZHRoKG5ldyBEb3VibGUoLTEpKTsKLQkJZGltLnNldEhlaWdodChuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRTaXplKGRpbSk7Ci0KLQkJLy8gRm9yIHNldHRpbmcgdHlwZSBvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZQotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCXByb3BlcnR5LnNldEtleShHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfV09SS19QUk9EVUNUX0NPTVBPU0lURV9UWVBFKTsKLQkJcHJvcGVydHkuc2V0VmFsdWUobmV3IEludGVnZXIoZ2V0VHlwZSgpKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkKHByb3BlcnR5KTsKLQkJZ3JhcGhOb2RlLnNldChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZLCBsaXN0KTsKLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBmaW5kTm9kZShBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkKLQkJCQkJJiYgZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3RDb21wb3NpdGUpIGVsZW1lbnQpLmdldFR5cGUoKSA9PSB0aGlzLnR5cGUpCi0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlpZihtZXRob2RFbGVtZW50QWRhcHRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50QWRhcHRlciA9IG5ldyBUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEFkYXB0ZXI7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKXsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlJRmlsdGVyIGZpbHRlciA9IGdldEZpbHRlcigpOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotfSAvLyBXb3JrUHJvZHVjdENvbXBvc2l0ZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2ZkN2IwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklBZGFwdGVyRmFjdG9yeUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLklXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JbXBsIGV4dGVuZHMgRGlhZ3JhbUltcGwgaW1wbGVtZW50cwotCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIHsKLQlwcml2YXRlIGNsYXNzIFdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEFjdGl2aXR5QWRhcHRlciBpbXBsZW1lbnRzCi0JCQlJV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQotCX07Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZGlhZ3JhbUNoYW5nZUxpc3RlbmVyID0gbmV3IFdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gSVdQRERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVMgPSB7CQkJCi0JCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgCi0JfTsgCi0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbigpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSBudWxsOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWlmICh3cmFwcGVyICE9IG51bGwpIHsKLQkJCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0NzU1MgotCQkJTGlzdCB3cmFwcGVycyA9IFByb2Nlc3NVdGlsLmdldFdyYXBwZXJzKHdyYXBwZXIsIERFRkFVTFRfQURBUFRFUl9GQUNUT1JJRVMpOwotCQkJaWYod3JhcHBlcnMgIT0gbnVsbCAmJiB3cmFwcGVycy5zaXplKCkgPiAwKXsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcil3cmFwcGVycy5nZXQoMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGdldE9iamVjdCgpLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJfSBlbHNlIGlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQkJZ2V0T2JqZWN0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJLy8gcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oZ2V0T2JqZWN0KCkpOwotCQkJLy8gY29tbWVudGVkIGFib3ZlIGxpbmUsIEZvciBkaWFncmFtcyAtIHJvbGx1cCBzaG91bGQgYmUgZmFsc2UsIGZvcgotCQkJLy8gaGFuZGxpbmcgcm9sbHVwIHN0YXRlIGJlbG93IGNvZGUuCi0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZXh0cmFjdENoaWxkcmVuKGFkYXB0ZXIsIGdldE9iamVjdCgpLCBjaGlsZHJlbiwgdHJ1ZSk7Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlTm9kZXMoKSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZ2V0T2JqZWN0KCk7Ci0KLQkJLy8gZ2V0IGFsbCBXb3JrUHJvZHVjdERlc2NyaXB0b3JzIHVuZGVyIHRoZSBhY3Rpdml0eQotCQkvLwotCQlzdXBlci5wb3B1bGF0ZU5vZGVzKCk7Ci0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChhY3QsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0KLQkJLy8gQXJyYXlMaXN0IHdwRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdE5vZGUgbm9kZSA9IChXb3JrUHJvZHVjdE5vZGUpIEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZE5vZGUodGhpcywgZWxlbWVudCk7Ci0JCQkJaWYobm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5vZGUgPSAoV29ya1Byb2R1Y3ROb2RlKSB0b05vZGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCX0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGU7Ci0JCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQkJKChOYW1lZE5vZGVJbXBsKSBub2RlKS5pdGVtUHJvdmlkZXIgPSB3cmFwcGVyOwotCQkJCQkJbm9kZS5zZXRSZWFkT25seSh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlub2RlLnNldFR5cGUoMSk7Ci0JCQkJfQotCQkJCWlmICgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCW5vZGUuc2V0VHlwZSgyKTsKLQkJCQl9Ci0JCQkJaWYgKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJCQlub2RlLnNldFR5cGUoMyk7Ci0JCQkJfQotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCQlzZWxlY3ROb2Rlcyhub2Rlcyk7Ci0JfQotCXByb3RlY3RlZCBOb2RlIHRvTm9kZShNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcil7Ci0JCQlyZXR1cm4gc3VwZXIudG9Ob2RlKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIG5ld05vZGUoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0Tm9kZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFIZWxwZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudFR5cGUoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9VbWFNb2RlbChpbnQgcG9zaXRpb24sIE5vZGUgYWRkZWROb2RlKSB7CQkKLQkJaWYgKGFkZGVkTm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCSgoQWN0aXZpdHkpIGdldE9iamVjdCgpKS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZCgKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGFkZGVkTm9kZS5nZXRPYmplY3QoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkVG9VbWFNb2RlbChwb3NpdGlvbiwgYWRkZWROb2RlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbm9kZUFkZGVkKGludCBpbmRleCwgTm9kZSBub2RlKSB7Ci0JCWlmKG5vZGUuZ2V0T2JqZWN0KCkgPT0gbnVsbCkgewotCQkJaWYobm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZSkgewotCQkJCW5vZGUuc2V0T2JqZWN0KFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJCX0KLQkJfQotCQlzdXBlci5ub2RlQWRkZWQoaW5kZXgsIG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUxpbmtzKCkgewotCQlzdXBlci5wb3B1bGF0ZUxpbmtzKCk7Ci0JCQotCQkvLyBDbGVhbiB1cCB1bi11c2VkIHRoZSBsaW5rcy4KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9ICgoTm9kZSkgaXRlci5uZXh0KCkpOwotCQkJQXJyYXlMaXN0PExpbms+IGxpbmtzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0PExpbms+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZQotCQkJCQkuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghaXNWYWxpZChsaW5rKSkgewotCQkJCQlsaW5rc1RvUmVtb3ZlLmFkZChsaW5rKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlua3NUb1JlbW92ZS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVMaW5rKGxpbmspOwotCQkJfQotCQkJbGlua3NUb1JlbW92ZS5jbGVhcigpOwotCQkJbGlua3NUb1JlbW92ZSA9IG51bGw7Ci0JCX0KLQkJLy8gUmVmcmVzaCBsaW5rcyBiYXNlZCBvbiBtb2RlbCBpbmZvLgotCQlmb3IoSXRlcmF0b3IgaXRlciA9IGdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KXsKLQkJCU5vZGUgbm9kZSA9ICgoTm9kZSlpdGVyLm5leHQoKSk7Ci0JCQlPYmplY3Qgd2JlID0gbnVsbDsKLQkJCS8vd2JlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbm9kZS5nZXRPYmplY3QoKTsKLQkJCS8vaWYod2JlICE9IG51bGwpewotCQkJd2JlID0gIG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQlpZih3YmUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpewotCQkJCUxpc3QgaW1wYWN0ZWRCeSA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXdiZSkuZ2V0SW1wYWN0ZWRCeSgpOwotCQkJCWlmKCFpbXBhY3RlZEJ5LmlzRW1wdHkoKSl7Ci0JCQkJCWZvcihJdGVyYXRvciBpdGVyMSA9IGltcGFjdGVkQnkuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOyl7Ci0JCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igc291cmNlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilpdGVyMS5uZXh0KCk7Ci0JCQkJCQlMaW5rIGxpbmsgPSBmaW5kTGluayhub2RlLCBzb3VyY2UpOwotCQkJCQkJaWYobGluayA9PSBudWxsKXsKLQkJCQkJCQlOYW1lZE5vZGVJbXBsIG5vZGVJbXBsID0gKChOYW1lZE5vZGVJbXBsKSBub2RlKTsKLQkJCQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJCQkJCQlub2RlSW1wbC5hZGRJbmNvbWluZ0Nvbm5lY3Rpb24oc291cmNlKTsgCi0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZChMaW5rIGxpbmspIHsKLQkJaWYgKGxpbmsuZ2V0U291cmNlKCkgPT0gbnVsbCB8fCBsaW5rLmdldFRhcmdldCgpID09IG51bGwKLQkJCQl8fCAhZ2V0Tm9kZXMoKS5jb250YWlucyhsaW5rLmdldFNvdXJjZSgpKQotCQkJCXx8ICFnZXROb2RlcygpLmNvbnRhaW5zKGxpbmsuZ2V0VGFyZ2V0KCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBMaW5rIGZpbmRMaW5rKE5vZGUgdGFyZ2V0LCBPYmplY3Qgc291cmNlTGlua2VkRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYoc291cmNlLmdldExpbmtlZEVsZW1lbnQoKSA9PSBzb3VyY2VMaW5rZWRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGxpbms7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfSAvLyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzZjMGQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5HcmFwaGljYWxEYXRhSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwgZXh0ZW5kcyBOYW1lZE5vZGVJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIgZXh0ZW5kcyBNZXRob2RFbGVtZW50QWRhcHRlciB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOgotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbiltc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJLy8gVE9ETzogaW1wbGVtZW50IGhhbmRsaW5nIHN1cHByZXNzLgotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbihtc2cpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGwuTWV0aG9kRWxlbWVudEFkYXB0ZXIjZ2V0Tm9kZSgpCi0JCSAqLwotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVJbXBsLnRoaXM7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLmltcGwuTmFtZWROb2RlSW1wbCNmaW5kTm9kZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgZmluZE5vZGUoTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50KSB7Ci0JCXJldHVybiBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmROb2RlKAotCQkJCShBY3Rpdml0eURldGFpbERpYWdyYW0pIGdldERpYWdyYW0oKSwgbGlua2VkRWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2dldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpCi0JICovCi0JcHVibGljIENsYXNzIGdldE1ldGhvZEVsZW1lbnRBZGFwdGVyVHlwZSgpIHsKLQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5vZGVJbXBsI2FkZFRvVU1BKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmspCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldE9iamVjdCgpOwotCi0JCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIG9mIHNvdXJjZSBub2RlIGJlZm9yZSBjaGFuZ2luZyB0aGUgVU1BIG9iamVjdAotCQkvLyBhc3NvY2lhdGVkIHdpdGggaXQKLQkJLy8gc28gaXQgd2lsbCBub3QgY3JlYXRlIGR1cGxpY2F0ZSBsaW5rcwotCQkvLwotCQlOb2RlSW1wbCBub2RlSW1wbCA9IChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKTsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkOwotCQlib29sZWFuIG5vdGlmeVRhcmdldCA9IG5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0vLwkJCXdwZC5nZXRPdXRwdXRGcm9tKCkuYWRkKGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCkpOwotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGxpbmsuZ2V0U291cmNlKCkuZ2V0T2JqZWN0KCk7Ci0JCQlpZih0YXNrRGVzYyAhPSBudWxsKSB7Ci0JCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkuYWRkKHdwZCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gbm90aWZ5OwotCQkJbm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVRhcmdldDsKLQkJfQotCi0JCS8vIFRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBsaW5rLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCQkvLyB0ZC5nZXRPdXRwdXQoKS5hZGQoZ2V0T2JqZWN0KCkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Ob2RlSW1wbCNyZW1vdmVGcm9tVU1BKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmssCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldE9iamVjdCgpOwotLy8JCXdwZC5nZXRNYW5kYXRvcnlJbnB1dFRvKCkucmVtb3ZlKG9sZFRhcmdldC5nZXRPYmplY3QoKSk7Ci0JCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBvbGRUYXJnZXQuZ2V0T2JqZWN0KCk7Ci0JCWlmKHRhc2tEZXNjICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkucmVtb3ZlKHdwZCk7Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVGcm9tVU1BKGxpbmssIG9sZFNvdXJjZSwgb2xkVGFyZ2V0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Tm9kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL1dvcmtQcm9kdWN0Tm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4Y2M0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvaW1wbC9Xb3JrUHJvZHVjdE5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgTm9kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuaW1wbC5Xb3JrUHJvZHVjdE5vZGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVJbXBsIGV4dGVuZHMgTmFtZWROb2RlSW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0Tm9kZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRZUEVfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCXByaXZhdGUgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRBZGFwdGVyIHsKLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZUltcGwudGhpczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKCFub3RpZmljYXRpb25FbmFibGVkKQotCQkJCXJldHVybjsKLQkJCW5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQotCQkJdHJ5IHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb2JqOwotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlhZGRJbmNvbWluZ0Nvbm5lY3Rpb24ob2JqKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb2JqID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWFkZEluY29taW5nQ29ubmVjdGlvbihvYmopOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlvYmogPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJcmVtb3ZlSW5jb21pbmdDb25uZWN0aW9uKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOgotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJCQlCb29sZWFuIGIgPSAoQm9vbGVhbiltc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmKGIuYm9vbGVhblZhbHVlKCk9PXRydWUpewotCQkJCQkJCXJlbW92ZUxpbmtzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlub3RpZmljYXRpb25FbmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCi0JCW1ldGhvZEVsZW1lbnRBZGFwdGVyID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX05PREU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IG5ld1R5cGUpIHsKLQkJaW50IG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFR5cGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFOgotCQkJCXNldFR5cGUoKChJbnRlZ2VyKW5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLldPUktfUFJPRFVDVF9OT0RFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9VTUEoTGluayBsaW5rKSB7Ci0JCWlmICghc3VwZXIuYWRkVG9VTUEobGluaykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBsaW5rCi0JCQkJLmdldFNvdXJjZSgpLmdldE9iamVjdCgpOwotCi0JCU5vZGVJbXBsIHNvdXJjZSA9IChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKTsKLQkJTm9kZUltcGwgdGFyZ2V0ID0gKE5vZGVJbXBsKSBsaW5rLmdldFRhcmdldCgpOwotCQlib29sZWFuIG5vdGlmeVNvdXJjZSA9IHNvdXJjZS5ub3RpZmljYXRpb25FbmFibGVkOwotCQlib29sZWFuIG5vdGlmeVRhcmdldCA9IHRhcmdldC5ub3RpZmljYXRpb25FbmFibGVkOwotCQl0cnkgewotCQkJc291cmNlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSB0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IGZhbHNlOwotCQkJZGVzY3JpcHRvci5nZXRJbXBhY3RzKCkuYWRkKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGxpbmsuZ2V0VGFyZ2V0KCkuZ2V0T2JqZWN0KCkpOwotCQl9IGZpbmFsbHkgewotCQkJc291cmNlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBub3RpZnlTb3VyY2U7Ci0JCQl0YXJnZXQubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeVRhcmdldDsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21VTUEoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwgTm9kZSBvbGRUYXJnZXQpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvbGRUYXJnZXQKLQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSB0YXJnZXQgbm9kZSBiZWZvcmUgcmVtb3ZpbmcgaXRzCi0JCS8vIGRlc2NyaXB0b3IgZnJvbSB0aGUgZGVwZW5kZW5jeSBsaXN0Ci0JCS8vCi0JCU5hbWVkTm9kZUltcGwgbm9kZUltcGwgPSAoTmFtZWROb2RlSW1wbCkgb2xkU291cmNlOwotCQlib29sZWFuIG5vdGlmeSA9IG5vZGVJbXBsLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQlub2RlSW1wbC5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQlkZXNjcmlwdG9yLmdldEltcGFjdGVkQnkoKS5yZW1vdmUobm9kZUltcGwuZ2V0T2JqZWN0KCkpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZUltcGwubm90aWZpY2F0aW9uRW5hYmxlZCA9IG5vdGlmeTsKLQkJfQotCi0JCXN1cGVyLnJlbW92ZUZyb21VTUEobGluaywgb2xkU291cmNlLCBvbGRUYXJnZXQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUxpbmtzKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlpZiAobGluay5nZXRTb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5yZW1vdmVHcmFwaGljYWxEYXRhKGxpbmspOwotCQkJCS8vIGRpc2FibGUgaW50ZXJuYWwgbm90aWZpY2F0aW9uIG9mIHRoZSBzb3VyY2Ugbm9kZQotCQkJCS8vCi0JCQkJTm9kZUltcGwgc291cmNlTm9kZSA9IChOb2RlSW1wbCkgbGluay5nZXRTb3VyY2UoKTsKLQkJCQlib29sZWFuIG9sZE5vdGlmeSA9IHNvdXJjZU5vZGUubm90aWZpY2F0aW9uRW5hYmxlZDsKLQkJCQl0cnkgewotCQkJCQlzb3VyY2VOb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQgPSBmYWxzZTsKLQkJCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc291cmNlTm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gb2xkTm90aWZ5OwotCQkJCX0KLQkJCQkvL2xpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCWxpbmsuc2V0T2JqZWN0KG51bGwpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJaWYgKGxpbmsuZ2V0VGFyZ2V0KCkgIT0gbnVsbCkgewotCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIucmVtb3ZlR3JhcGhpY2FsRGF0YShsaW5rKTsKLQkJCQkvLyBkaXNhYmxlIGludGVybmFsIG5vdGlmaWNhdGlvbiBvZiB0aGUgc291cmNlIG5vZGUKLQkJCQkvLwotCQkJCU5vZGVJbXBsIHRhcmdldE5vZGUgPSAoTm9kZUltcGwpIGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZnkgPSB0YXJnZXROb2RlLm5vdGlmaWNhdGlvbkVuYWJsZWQ7Ci0JCQkJdHJ5IHsKLQkJCQkJdGFyZ2V0Tm9kZS5ub3RpZmljYXRpb25FbmFibGVkID0gZmFsc2U7Ci0JCQkJCWxpbmsuc2V0VGFyZ2V0KG51bGwpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXRhcmdldE5vZGUubm90aWZpY2F0aW9uRW5hYmxlZCA9IG9sZE5vdGlmeTsKLQkJCQl9Ci0JCQkJLy9saW5rLnNldFNvdXJjZShudWxsKTsKLQkJCQlsaW5rLnNldE9iamVjdChudWxsKTsKLQkJCX0KLQkJfQotCX0KLX0gLy8gV29ya1Byb2R1Y3ROb2RlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjFkZjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC9pbXBsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5ZDk1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBhY3Rpdml0eSBkaWFncmFtIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbUluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTJhNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvRGlhZ3JhbUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbnN0cmFpbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdG9yZXMgZGlhZ3JhbSBwdWJsaXNoIG9wdGlvbnMgYW5kIHJlZmVyZW5jZXMgdG8gdXNlci1zcGVjaWZpZWQKLSAqIGRpYWdyYW1zIHRvIHJlcGxhY2UgdGhlIGFjdGl2aXR5IGRpYWdyYW0sIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLCBvciB3b3JrCi0gKiBwcm9kdWN0IGRlcGVuZGVuY3kgZGlhZ3JhbSBmb3IgYW4gYWN0aXZpdHkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW5mbyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFEX0lNQUdFX1VSSSA9ICJhZF9pbWFnZV91cmkiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0lNQUdFX1VSSSA9ICJhZGRfaW1hZ2VfdXJpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdQRF9JTUFHRV9VUkkgPSAid3BkX2ltYWdlX3VyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FEX0lNQUdFID0gInB1Ymxpc2hfYWRfaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9BRERfSU1BR0UgPSAicHVibGlzaF9hZGRfaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9XUERfSU1BR0UgPSAicHVibGlzaF93cGRfaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSID0gInwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBTdHJpbmcgQURfSW1hZ2VVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBBRERfSW1hZ2VVUkk7Ci0KLQlwcml2YXRlIFN0cmluZyBXUERfSW1hZ2VVUkk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFESW1hZ2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFEREltYWdlOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hXUERJbWFnZTsKLQotCXByaXZhdGUgQ29uc3RyYWludCBjb25zdHJhaW50OwotCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEaWFncmFtOwotCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgYWN0aXZpdHlEZXRhaWxEaWFncmFtOwotCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgd3BkRGlhZ3JhbTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYW5kIGxvYWRzIGEgRGlhZ3JhbUluZm8gaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8oQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlyZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBEaWFncmFtSW5mbygpIHsKLQkJQURfSW1hZ2VVUkkgPSBBRERfSW1hZ2VVUkkgPSBXUERfSW1hZ2VVUkkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgRGlhZ3JhbUluZm8gbG9hZCgpIHsKLQkJRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBEaWFncmFtSW5mbygpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbnN0cmFpbnQuZ2V0Qm9keSgpLAotCQkJCURFTElNSVRFUik7IHRva2Vucy5oYXNNb3JlVG9rZW5zKCk7KSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQlpbnQgaWQgPSB0b2tlbi5pbmRleE9mKCc9Jyk7Ci0JCQlpbnQgbWF4ID0gdG9rZW4ubGVuZ3RoKCkgLSAxOwotCQkJaWYgKGlkICE9IC0xICYmIGlkIDwgbWF4KSB7Ci0JCQkJU3RyaW5nIGtleSA9IHRva2VuLnN1YnN0cmluZygwLCBpZCk7Ci0JCQkJaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKEFEX0lNQUdFX1VSSSkpIHsKLQkJCQkJaW5mby5BRF9JbWFnZVVSSSA9IHRva2VuLnN1YnN0cmluZyhpZCArIDEpOwotCQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoQUREX0lNQUdFX1VSSSkpIHsKLQkJCQkJaW5mby5BRERfSW1hZ2VVUkkgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFdQRF9JTUFHRV9VUkkpKSB7Ci0JCQkJCWluZm8uV1BEX0ltYWdlVVJJID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShQVUJMSVNIX0FEX0lNQUdFKSkgewotCQkJCQlpbmZvLnB1Ymxpc2hBREltYWdlID0gQm9vbGVhbi52YWx1ZU9mKAotCQkJCQkJCXRva2VuLnN1YnN0cmluZyhpZCArIDEpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKFBVQkxJU0hfQUREX0lNQUdFKSkgewotCQkJCQlpbmZvLnB1Ymxpc2hBRERJbWFnZSA9IEJvb2xlYW4udmFsdWVPZigKLQkJCQkJCQl0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZShQVUJMSVNIX1dQRF9JTUFHRSkpIHsKLQkJCQkJaW5mby5wdWJsaXNoV1BESW1hZ2UgPSBCb29sZWFuLnZhbHVlT2YoCi0JCQkJCQkJdG9rZW4uc3Vic3RyaW5nKGlkICsgMSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZSgpIHsKLQkJaWYgKGNvbnN0cmFpbnQgPT0gbnVsbCkgewotCQkJY29uc3RyYWludCA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQoYWN0aXZpdHksCi0JCQkJCUNvbnN0cmFpbnRNYW5hZ2VyLkFDSVRJVllfRElBR1JBTSwgdHJ1ZSk7Ci0JCX0KLQkJaWYgKGFjdGl2aXR5RGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlBRF9JbWFnZVVSSSA9IGFjdGl2aXR5RGlhZ3JhbS5nZXRHdWlkKCk7Ci0JCX0KLQkJaWYgKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlBRERfSW1hZ2VVUkkgPSBhY3Rpdml0eURldGFpbERpYWdyYW0uZ2V0R3VpZCgpOwotCQl9Ci0JCWlmICh3cGREaWFncmFtICE9IG51bGwpIHsKLQkJCVdQRF9JbWFnZVVSSSA9IHdwZERpYWdyYW0uZ2V0R3VpZCgpOwotCQl9Ci0KLQkJRGlhZ3JhbUluZm8gaW5mbyA9IGxvYWQoKTsKLQotCQlpZiAoQURfSW1hZ2VVUkkgIT0gbnVsbCkgewotCQkJaW5mby5BRF9JbWFnZVVSSSA9IEFEX0ltYWdlVVJJOwotCQl9Ci0JCWlmIChBRERfSW1hZ2VVUkkgIT0gbnVsbCkgewotCQkJaW5mby5BRERfSW1hZ2VVUkkgPSBBRERfSW1hZ2VVUkk7Ci0JCX0KLQkJaWYgKFdQRF9JbWFnZVVSSSAhPSBudWxsKSB7Ci0JCQlpbmZvLldQRF9JbWFnZVVSSSA9IFdQRF9JbWFnZVVSSTsKLQkJfQotCQlpbmZvLnB1Ymxpc2hBREltYWdlID0gcHVibGlzaEFESW1hZ2U7Ci0JCWluZm8ucHVibGlzaEFEREltYWdlID0gcHVibGlzaEFEREltYWdlOwotCQlpbmZvLnB1Ymxpc2hXUERJbWFnZSA9IHB1Ymxpc2hXUERJbWFnZTsKLQotCQlTdHJpbmcgc3RyID0gbmV3IFN0cmluZ0J1ZmZlcihBRF9JTUFHRV9VUkkpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQlpbmZvLkFEX0ltYWdlVVJJKS5hcHBlbmQoREVMSU1JVEVSKS5hcHBlbmQoUFVCTElTSF9BRF9JTUFHRSkKLQkJCQkuYXBwZW5kKCc9JykuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGluZm8ucHVibGlzaEFESW1hZ2UpKQotCQkJCS5hcHBlbmQoREVMSU1JVEVSKS5hcHBlbmQoQUREX0lNQUdFX1VSSSkuYXBwZW5kKCc9JykuYXBwZW5kKAotCQkJCQkJU3RyaW5nLnZhbHVlT2YoaW5mby5BRERfSW1hZ2VVUkkpKS5hcHBlbmQoREVMSU1JVEVSKQotCQkJCS5hcHBlbmQoUFVCTElTSF9BRERfSU1BR0UpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8ucHVibGlzaEFEREltYWdlKSkuYXBwZW5kKERFTElNSVRFUikKLQkJCQkuYXBwZW5kKFdQRF9JTUFHRV9VUkkpLmFwcGVuZCgnPScpLmFwcGVuZCgKLQkJCQkJCVN0cmluZy52YWx1ZU9mKGluZm8uV1BEX0ltYWdlVVJJKSkuYXBwZW5kKERFTElNSVRFUikKLQkJCQkuYXBwZW5kKFBVQkxJU0hfV1BEX0lNQUdFKS5hcHBlbmQoJz0nKS5hcHBlbmQoCi0JCQkJCQlTdHJpbmcudmFsdWVPZihpbmZvLnB1Ymxpc2hXUERJbWFnZSkpLnRvU3RyaW5nKCk7Ci0KLQkJY29uc3RyYWludC5zZXRCb2R5KHN0cik7Ci0JfQotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoaXMgRGlhZ3JhbUluZm8gb2JqZWN0IGZyb20gdGhlIG1vZGVsCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJY29uc3RyYWludCA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQoYWN0aXZpdHksCi0JCQkJQ29uc3RyYWludE1hbmFnZXIuQUNJVElWWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCWlmIChjb25zdHJhaW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCURpYWdyYW1JbmZvIGluZm8gPSBsb2FkKCk7Ci0KLQkJQURfSW1hZ2VVUkkgPSBpbmZvLkFEX0ltYWdlVVJJOwotCQlBRERfSW1hZ2VVUkkgPSBpbmZvLkFERF9JbWFnZVVSSTsKLQkJV1BEX0ltYWdlVVJJID0gaW5mby5XUERfSW1hZ2VVUkk7Ci0JCXB1Ymxpc2hBREltYWdlID0gaW5mby5wdWJsaXNoQURJbWFnZTsKLQkJcHVibGlzaEFEREltYWdlID0gaW5mby5wdWJsaXNoQURESW1hZ2U7Ci0JCXB1Ymxpc2hXUERJbWFnZSA9IGluZm8ucHVibGlzaFdQREltYWdlOwotCi0JCWFjdGl2aXR5RGlhZ3JhbSA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbChBRF9JbWFnZVVSSSk7Ci0JCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IGdldFN1cHBvcnRpbmdNYXRlcmlhbChBRERfSW1hZ2VVUkkpOwotCQl3cGREaWFncmFtID0gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKFdQRF9JbWFnZVVSSSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBRF9JbWFnZVVSSSgpIHsKLQkJcmV0dXJuIEFEX0ltYWdlVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QUREX0ltYWdlVVJJKCkgewotCQlyZXR1cm4gQUREX0ltYWdlVVJJOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V1BEX0ltYWdlVVJJKCkgewotCQlyZXR1cm4gV1BEX0ltYWdlVVJJOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JICogaW5zdGVhZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5QdWJsaXNoQURESW1hZ2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoQURESW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0KLQkgKiBpbnN0ZWFkLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoQURESW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURESW1hZ2UoYm9vbGVhbiBwdWJsaXNoQURESW1hZ2UpIHsKLQkJdGhpcy5wdWJsaXNoQURESW1hZ2UgPSBwdWJsaXNoQURESW1hZ2U7Ci0JCXNhdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBhY3Rpdml0eSBkaWFncmFtIGluc3RlYWQuCi0JICogCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGlhZ3JhbSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaEFESW1hZ2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoQURJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcHRpb24gdG8gcHVibGlzaCB1c2VyLXNwZWNpZmllZCBpbWFnZSBmb3IgYWN0aXZpdHkgZGlhZ3JhbQotCSAqIGluc3RlYWQgb2YgdGhlIGFjdGl2aXR5IGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEFESW1hZ2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoQURJbWFnZShib29sZWFuIHB1Ymxpc2hBREltYWdlKSB7Ci0JCXRoaXMucHVibGlzaEFESW1hZ2UgPSBwdWJsaXNoQURJbWFnZTsKLQkJc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbiB0byBwdWJsaXNoIHVzZXItc3BlY2lmaWVkIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0KLQkgKiBpbnN0ZWFkLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRXUEREaWFncmFtKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5QdWJsaXNoV1BESW1hZ2UoKSB7Ci0JCXJldHVybiBwdWJsaXNoV1BESW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uIHRvIHB1Ymxpc2ggdXNlci1zcGVjaWZpZWQgaW1hZ2UgZm9yIHdvcmsgcHJvZHVjdAotCSAqIGRlcGVuZGVuY3kgZGlhZ3JhbSBpbnN0ZWFkIG9mIHRoZSB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hXUERJbWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hXUERJbWFnZShib29sZWFuIHB1Ymxpc2hXUERJbWFnZSkgewotCQl0aGlzLnB1Ymxpc2hXUERJbWFnZSA9IHB1Ymxpc2hXUERJbWFnZTsKLQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0QWN0aXZpdHlEaWFncmFtKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEdldHMgdXNlci1zcGVjaWZpZWQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0uCi0JICogCi0JICogQHJldHVybiBhIHtAbGluayBTdXBwb3J0aW5nTWF0ZXJpYWx9IHdpdGggdGhlIGRpZ3JhbSBpbiBpdHMgbWFpbgotCSAqICAgICAgICAgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHVzZXItc3BlY2lmaWVkIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW0uCi0JICogCi0JICogQHJldHVybiBhIHtAbGluayBTdXBwb3J0aW5nTWF0ZXJpYWx9IHdpdGggdGhlIGRpZ3JhbSBpbiBpdHMgbWFpbgotCSAqICAgICAgICAgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldFdQRERpYWdyYW0oKSB7Ci0JCXJldHVybiB3cGREaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdQRERpYWdyYW0oU3VwcG9ydGluZ01hdGVyaWFsIHdwZERpYWdyYW0pIHsKLQkJaWYgKHRoaXMud3BkRGlhZ3JhbSAhPSB3cGREaWFncmFtKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkID0gdGhpcy53cGREaWFncmFtOwotCQkJdGhpcy53cGREaWFncmFtID0gd3BkRGlhZ3JhbTsKLQkJCXVwZGF0ZShvbGQsIHdwZERpYWdyYW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQlpZiAodGhpcy5hY3Rpdml0eURldGFpbERpYWdyYW0gIT0gYWN0aXZpdHlEZXRhaWxEaWFncmFtKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkID0gdGhpcy5hY3Rpdml0eURldGFpbERpYWdyYW07Ci0JCQl0aGlzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA9IGFjdGl2aXR5RGV0YWlsRGlhZ3JhbTsKLQkJCXVwZGF0ZShvbGQsIGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURpYWdyYW0oU3VwcG9ydGluZ01hdGVyaWFsIGFjdGl2aXR5RGlhZ3JhbSkgewotCQlpZiAodGhpcy5hY3Rpdml0eURpYWdyYW0gIT0gYWN0aXZpdHlEaWFncmFtKSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgb2xkID0gdGhpcy5hY3Rpdml0eURpYWdyYW07Ci0JCQl0aGlzLmFjdGl2aXR5RGlhZ3JhbSA9IGFjdGl2aXR5RGlhZ3JhbTsKLQkJCXVwZGF0ZShvbGQsIGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0IGZvciB0aGUgZGlhZ3JhbSB3aXRoIHRoZSBnaXZlbiBVUkkKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbVVSSQotCSAqIEByZXR1cm4gbnVsbCBvZiB0aGUgU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCBjb3VsZCBub3QgYmUgZm91bmQgaW4gdGhlCi0JICogICAgICAgICBsaWJyYXJ5Ci0JICovCi0JcHJpdmF0ZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKFN0cmluZyBkaWFncmFtVVJJKSB7Ci0JCS8vIGRpYWdyYW1VUkkgaXMgdGhlIEdVSUQgb2YgdGhlIHN1cHBvcnRpbmcgbWF0ZXJpYWwgdGhhdCBtdXN0IGJlIGluIHRoZQotCQkvLyBsaXN0Ci0JCS8vIG9mIHN1cHBvcnRpbmcgbWF0ZXJpYWxzIG9mIHRoZSBhY3Rpdml0eQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwgZSA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGUuZ2V0R3VpZCgpLmVxdWFscyhkaWFncmFtVVJJKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGUoU3VwcG9ydGluZ01hdGVyaWFsIG9sZCwgU3VwcG9ydGluZ01hdGVyaWFsIG5ldSkgewotCQlpZiAob2xkICE9IG51bGwpIHsKLQkJCWFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5yZW1vdmUob2xkKTsKLQkJfQotCQlpZiAobmV1ICE9IG51bGwpIHsKLQkJCWFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5hZGQobmV1KTsKLQkJfQotCQlzYXZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGEgdXNlci1kZWZpbmVkIGRpYWdyYW0gb2YgdGhpcwotCSAqIERpYWdyYW1JbmZvJ3MgYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gc20KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaWFncmFtKFN1cHBvcnRpbmdNYXRlcmlhbCBzbSkgewotCQlyZXR1cm4gc20gIT0gbnVsbAotCQkJCSYmIChzbSA9PSBhY3Rpdml0eURpYWdyYW0gfHwgc20gPT0gYWN0aXZpdHlEZXRhaWxEaWFncmFtIHx8IHNtID09IHdwZERpYWdyYW0pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9EaWFncmFtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODMzYjY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0RpYWdyYW1NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLQotLyoqCi0gKiBFeHRlbnNpb24gdG8gY29udHJpYnV0ZSB0byBleHRlbnNpb24gcG9pbnQKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmRpYWdyYW1NYW5hZ2VyIgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1hbmFnZXIgaW1wbGVtZW50cyBJRGlhZ3JhbU1hbmFnZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyI2dldERpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IHR5cGUpIHsKLQkJcmV0dXJuIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShhY3QsIHR5cGUsCi0JCQkJZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvR3JhcGhpY2FsRGF0YUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmMwNjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuUm9sZVRhc2tDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5pbXBsLk5hbWVkTm9kZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxEYXRhSGVscGVyIHsKLQkvKiogRGlhZ3JhbSB0eXBlIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RJQUdSQU0gPSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0gPSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOwotCi0Jc3RhdGljIGZpbmFsIGludFtdIERJQUdSQU1fVFlQRVMgPSB7IEFDVElWSVRZX0RJQUdSQU0sCi0JCQlBQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSB9OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZ1tdIERJQUdSQU1fVFlQRV9URVhUUyA9IHsKLQkJCURpYWdyYW1SZXNvdXJjZXMudHlwZV9hY3Rpdml0eSwgRGlhZ3JhbVJlc291cmNlcy50eXBlX1dQRCwgRGlhZ3JhbVJlc291cmNlcy50eXBlX2FjdGl2aXR5RGV0YWlsIH07IAotCi0JLyoqIFByb3BlcnR5IG5hbWVzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSA9ICJ3cENvbXBvc2l0ZVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHByb3BlcnR5IG5hbWVzIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbSAqKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fTEFZT1VUID0gImF1dG9sYXlvdXQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JTkRFWCA9ICJpbmRleCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogcHJvcGVydHkgdmFsdWVzIGNvbnN0YW50cyBmb3IgYXV0b2xheW91dCAqKi8KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBUeXBlIGluZm8gZm9yIFVJIG5vZGUgKEBzZWUgVHlwZWROb2RlKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfU1lOQ0hfQkFSID0gInN5bmNobm9uaXphdGlvbiBiYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX1NUQVJUID0gInN0YXJ0IG5vZGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0VORCA9ICJlbmQgbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfREVDSVNJT04gPSAiZGVjaXNpb24gbm9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfRlJFRV9URVhUID0gImZyZWUgdGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBEaWFncmFtIHR5cGUgc3RyaW5nIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fV09SS0ZMT1cgPSAiV29ya2Zsb3ciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZID0gIldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9BQ1RJVklUWV9ERVRBSUwgPSAiQWN0aXZpdHkgRGV0YWlsIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9ESUFHUkFNX1RBU0tTX1BFUl9ST1cgPSAiQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fVEFTS1NfUEVSX1JPVyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgdG9Qb2ludChvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IHApIHsKLQkJcmV0dXJuIG5ldyBQb2ludChwLmdldFgoKS5kb3VibGVWYWx1ZSgpLCBwLmdldFkoKS5kb3VibGVWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgbmV3TW9kZWxQb2ludChpbnQgeCwgaW50IHkpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUG9pbnQoKTsKLQkJcC5zZXRYKG5ldyBEb3VibGUoeCkpOwotCQlwLnNldFkobmV3IERvdWJsZSh5KSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgZmluZFByb3BlcnR5KEdyYXBoTm9kZSBub2RlLCBTdHJpbmcgcHJvcEtleSkgewotCQlmb3IgKGludCBpID0gbm9kZS5nZXRQcm9wZXJ0eSgpLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBub2RlLmdldFByb3BlcnR5KCkuZ2V0KGkpOwotCQkJaWYgKHByb3BLZXkuZXF1YWxzKHByb3AuZ2V0S2V5KCkpKQotCQkJCXJldHVybiBwcm9wOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaW1lbnNpb24gbmV3TW9kZWxEaW1lbnNpb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCURpbWVuc2lvbiBzaXplID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCXNpemUuc2V0V2lkdGgobmV3IERvdWJsZSh3aWR0aCkpOwotCQlzaXplLnNldEhlaWdodChuZXcgRG91YmxlKGhlaWdodCkpOwotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbENvbm5lY3Rpb25zKE5vZGUgbm9kZSwgR3JhcGhOb2RlIGdyYXBoTm9kZSkgewotCQlib29sZWFuIG9sZCA9IG5vZGUuZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCW5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtID0gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0pIG5vZGUKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyYXBoTm9kZS5nZXRBbmNob3JhZ2UoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJR3JhcGhDb25uZWN0b3IgY29ubiA9ICgoR3JhcGhDb25uZWN0b3IpIGl0ZXIubmV4dCgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubi5nZXRHcmFwaEVkZ2UoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmKGVkZ2UuZ2V0QW5jaG9yKCkuc2l6ZSgpID4gMSkgeyAKLQkJCQkJCUdyYXBoQ29ubmVjdG9yIHRhcmdldENvbm5lY3RvcjsKLQkJCQkJCUxpbmsgbGluayA9IG51bGw7Ci0JCQkJCQlpZiAoZWRnZS5lQ29udGFpbmVyKCkgPT0gZ3JhcGhOb2RlKSB7Ci0JCQkJCQkJdGFyZ2V0Q29ubmVjdG9yID0gKEdyYXBoQ29ubmVjdG9yKSBlZGdlLmdldEFuY2hvcigpCi0JCQkJCQkJLmdldCgxKTsKLQkJCQkJCQlHcmFwaE5vZGUgdGFyZ2V0R3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgdGFyZ2V0Q29ubmVjdG9yCi0JCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQkJCQlpZiAoZ3JhcGhOb2RlLmVDb250YWluZXIoKSA9PSB0YXJnZXRHcmFwaE5vZGUKLQkJCQkJCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCQkJCQkJT2JqZWN0IGxpbmtlZE9iamVjdCA9IHRhcmdldEdyYXBoTm9kZTsKLQkJCQkJCQkJaWYgKHRhcmdldEdyYXBoTm9kZS5nZXRTZW1hbnRpY01vZGVsKCkgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJCQkJCQlsaW5rZWRPYmplY3QgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHRhcmdldEdyYXBoTm9kZQotCQkJCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYobGlua2VkT2JqZWN0ICE9IG51bGwpewotCQkJCQkJCQkJTm9kZSB0YXJnZXROb2RlID0gZmluZE5vZGUoZGlhZ3JhbSwgbGlua2VkT2JqZWN0KTsKLQkJCQkJCQkJCWxpbmsgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmsoKTsKLQkJCQkJCQkJCWxpbmsuc2V0U291cmNlKG5vZGUpOwotCQkJCQkJCQkJbGluay5zZXRUYXJnZXQodGFyZ2V0Tm9kZSk7Ci0JCQkJCQkJCQlsaW5rLnNldE9iamVjdChlZGdlKTsKLQkJCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCQlpZihMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSl7Ci0JCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rZWQgb2JqZWN0IGlzIG51bGw6IGZvcjogIisgbm9kZS5nZXRHcmFwaE5vZGUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCSI6IGZvciBncmFwaENvbm5lY3RvcjogIisJdGFyZ2V0Q29ubmVjdG9yKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlLmVTZXREZWxpdmVyKG9sZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBkaWFncmFtLAotCQkJR3JhcGhOb2RlIGdOb2RlLCBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IGdOb2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCUlOb2RlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSU5vZGVDaGFuZ2VMaXN0ZW5lcikgVW1hVXRpbAotCQkJCQkuZ2V0QWRhcHRlcigoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGJyaWRnZSkuZ2V0RWxlbWVudCgpLAotCQkJCQkJCWFkYXB0ZXJUeXBlKTsKLQkJCXJldHVybiBsaXN0ZW5lci5nZXROb2RlKCk7Ci0JCX0KLQotCQkvLyBnTm9kZSBpcyBub3QgYSBhY3Rpdml0eSdzIEdyYXBoTm9kZS4gVHJ5IHRvIGZpbmQgYSBOb2RlIHdpdGggZ05vZGUgYXMKLQkJLy8gYSBsaW5rZWQgb2JqZWN0IGluIHRoZSBkaWFncmFtLgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZ05vZGUgPT0gZWxlbWVudC5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIG5vZGUgd2hvc2UgbGlua2VkIG9iamVjdCBpcyB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShOb2RlQ29udGFpbmVyIGNvbnRhaW5lciwgT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSB8fCBvYmplY3QgPT0gZWxlbWVudC5nZXRMaW5rZWRFbGVtZW50KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBub2RlIHdob3NlIGxpbmtlZCBvYmplY3Qgb3Igb25lIG9mIGl0cyBiYXNlIGlzIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgZmluZE5vZGUoTm9kZUNvbnRhaW5lciBjb250YWluZXIsIE9iamVjdCBvYmplY3QsCi0JCQlib29sZWFuIGNoZWNrQmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gbm9kZS5nZXRPYmplY3QoKSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfSBlbHNlIGlmIChjaGVja0Jhc2UKLQkJCQkJJiYgbm9kZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWZvciAoVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG5vZGUKLQkJCQkJCS5nZXRPYmplY3QoKSkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOyB2ZSAhPSBudWxsOyB2ZSA9IHZlCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJCWlmICh2ZSA9PSBvYmplY3QpIHsKLQkJCQkJCXJldHVybiBub2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZSBmaW5kTm9kZShBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSwgT2JqZWN0IG9iamVjdCkgewotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldE5vZGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIGVsZW1lbnQgPSAoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVUYXNrQ29tcG9zaXRlIAotCQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RDb21wb3NpdGUpIHsKLQkJCQlub2RlID0gZmluZE5vZGUoKE5vZGVDb250YWluZXIpIGVsZW1lbnQsIG9iamVjdCk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0ID09IGVsZW1lbnQuZ2V0T2JqZWN0KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqZWN0LCBDbGFzcyB0eXBlKSB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVRhc2tDb21wb3NpdGUgCi0JCQkJCXx8IGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdENvbXBvc2l0ZSkgewotCQkJCW5vZGUgPSBmaW5kTm9kZSgoTm9kZUNvbnRhaW5lcikgZWxlbWVudCwgb2JqZWN0KTsKLQkJCQlpZiAobm9kZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSAmJiB0eXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaW5rIGZpbmRMaW5rKE5vZGUgc291cmNlLCBPYmplY3QgdGFyZ2V0TGlua2VkRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2UuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJaWYodGFyZ2V0ICE9IG51bGwgJiYgdGFyZ2V0LmdldExpbmtlZEVsZW1lbnQoKSA9PSB0YXJnZXRMaW5rZWRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGxpbms7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVTdHJpbmcoaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVHlwZWROb2RlLkRFQ0lTSU9OOgotCQkJcmV0dXJuIEdSQVBIX05PREVfREVDSVNJT047Ci0JCWNhc2UgVHlwZWROb2RlLkVORDoKLQkJCXJldHVybiBHUkFQSF9OT0RFX0VORDsKLQkJY2FzZSBUeXBlZE5vZGUuU1RBUlQ6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9TVEFSVDsKLQkJY2FzZSBUeXBlZE5vZGUuU1lOQ0hfQkFSOgotCQkJcmV0dXJuIEdSQVBIX05PREVfU1lOQ0hfQkFSOwotCQljYXNlIFR5cGVkTm9kZS5GUkVFX1RFWFQ6Ci0JCQlyZXR1cm4gR1JBUEhfTk9ERV9GUkVFX1RFWFQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHcmFwaE5vZGUgbmV3VHlwZWRHcmFwaE5vZGUoaW50IHR5cGUpIHsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoTm9kZSgpOwotCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBicmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpOwotCQlicmlkZ2Uuc2V0VHlwZUluZm8oZ2V0VHlwZVN0cmluZyh0eXBlKSk7Ci0JCWdyYXBoTm9kZS5zZXRTZW1hbnRpY01vZGVsKGJyaWRnZSk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcG9pbnQgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQb2ludCgpOwotCQlwb2ludC5zZXRYKG5ldyBEb3VibGUoLTEpKTsKLQkJcG9pbnQuc2V0WShuZXcgRG91YmxlKC0xKSk7Ci0JCWdyYXBoTm9kZS5zZXRQb3NpdGlvbihwb2ludCk7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIGRpbSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpbWVuc2lvbigpOwotCQlkaW0uc2V0V2lkdGgobmV3IERvdWJsZSgtMSkpOwotCQlkaW0uc2V0SGVpZ2h0KG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFNpemUoZGltKTsKLQotCQlpZiAodHlwZSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQlncmFwaE5vZGUuc2V0TmFtZShEaWFncmFtUmVzb3VyY2VzLmFkZEZyZWVUeHQpOyAKLQkJfQotCQlpZiAodHlwZSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSB7Ci0JCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCk7Ci0JCQlwcm9wZXJ0eS5zZXRLZXkoR1JBUEhfTk9ERV9GUkVFX1RFWFQpOwotCQkJcHJvcGVydHkuc2V0VmFsdWUoRGlhZ3JhbVJlc291cmNlcy5hZGRGcmVlVHh0KTsgCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZChwcm9wZXJ0eSk7Ci0JCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQl9Ci0KLQkJcmV0dXJuIGdyYXBoTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGluawotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVHcmFwaGljYWxEYXRhKExpbmsgbGluaykgewotCQkvLyBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoQ29ubmVjdG9yUGFpcihsaW5rLmdldFNvdXJjZSgpLmdldEdyYXBoTm9kZSgpLAotCQkvLyBsaW5rLmdldFRhcmdldCgpLmdldEdyYXBoTm9kZSgpKTsKLQkJCi0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJaWYoZWRnZSAhPSBudWxsKSB7Ci0JCQlHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUdyYXBoRWRnZShlZGdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsaW5rCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEdyYXBoaWNhbERhdGEoTGluayBsaW5rKSB7Ci0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJaWYgKGVkZ2UgPT0gbnVsbCkgewotCQkJLy8gbmV3IGxpbmsKLQkJCS8vCi0JCQllZGdlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5hZGRHcmFwaENvbm5lY3RvclBhaXIoCi0JCQkJCWxpbmsuZ2V0U291cmNlKCkuZ2V0R3JhcGhOb2RlKCksCi0JCQkJCWxpbmsuZ2V0VGFyZ2V0KCkuZ2V0R3JhcGhOb2RlKCkpOwotCQkJbGluay5zZXRPYmplY3QoZWRnZSk7Ci0KLQkJCS8vIHNhdmUgdGhlIHNvdXJjZSBlbmQgcG9pbnQgYW5kIHRhcmdldCBlbmQgcG9pbnQgZnJvbSB0aGUgZ2l2ZW4KLQkJCS8vIGxpbmsKLQkJCS8vCi0JCQlsaW5rLnNldFNvdXJjZUVuZFBvaW50KGxpbmsuZ2V0U291cmNlRW5kUG9pbnQoKSk7Ci0JCQlsaW5rLnNldFRhcmdldEVuZFBvaW50KGxpbmsuZ2V0VGFyZ2V0RW5kUG9pbnQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB1bmRvIGRlbGV0ZWQgbGluawotCQkJLy8KLQkJCUdyYXBoTm9kZSBzcmNOb2RlID0gbGluay5nZXRTb3VyY2UoKS5nZXRHcmFwaE5vZGUoKTsKLQkJCUdyYXBoTm9kZSB0YXJnZXROb2RlID0gbGluay5nZXRUYXJnZXQoKS5nZXRHcmFwaE5vZGUoKTsKLQkJCU9iamVjdCBzcmNDb25uZWN0b3IgPSBlZGdlLmdldEFuY2hvcigpLmdldCgwKTsKLQkJCXNyY05vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKChHcmFwaENvbm5lY3Rvcikgc3JjQ29ubmVjdG9yKTsKLQkJCXNyY05vZGUuZ2V0Q29udGFpbmVkKCkuYWRkKGVkZ2UpOwotCQkJT2JqZWN0IHRhcmdldENvbm5lY3RvciA9IGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCQkJdGFyZ2V0Tm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQoKEdyYXBoQ29ubmVjdG9yKSB0YXJnZXRDb25uZWN0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlbWFudGljTW9kZWwoTGluayBsaW5rLCBXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCS8vIHNldCB0aGUgV29ya09yZGVyIGFzIHRoZSBlbGVtZW50IG9mIHRoZSBTZW1hbnRpY01vZGVsIG9mIHRoZSBsaW5rJ3MKLQkJLy8gR3JhcGhFZGdlCi0JCS8vCi0JCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgbGluay5nZXRPYmplY3QoKTsKLQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCWJyaWRnZS5zZXRFbGVtZW50KHdvcmtPcmRlcik7Ci0JCWVkZ2Uuc2V0U2VtYW50aWNNb2RlbChicmlkZ2UpOwotCX0KLQotCS8vIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRTb3VyY2VBY3Rpdml0eU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUpIHsKLQkvLyBMaXN0IGFjdE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoYWN0Tm9kZXMsIHR5cGVkTm9kZSk7Ci0JLy8gcmV0dXJuIGFjdE5vZGVzOwotCS8vIH0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRTb3VyY2VOb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDbGFzcyB0eXBlKSB7Ci0JCUxpc3QgYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldFNvdXJjZU5vZGVzKGFjdE5vZGVzLCB0eXBlZE5vZGUsIHR5cGUpOwotCQlyZXR1cm4gYWN0Tm9kZXM7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyB2b2lkIGdldFNvdXJjZUFjdGl2aXR5Tm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgVHlwZWROb2RlCi0JLy8gdHlwZWROb2RlKSB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOwotCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIExpbmsgbGluayA9IChMaW5rKWl0ZXIubmV4dCgpOwotCS8vIE5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkvLyBpZihzb3VyY2UgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkvLyBhY3ROb2Rlcy5hZGQoc291cmNlKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZihzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkvLyBnZXRTb3VyY2VBY3Rpdml0eU5vZGVzKGFjdE5vZGVzLCAoVHlwZWROb2RlKSBzb3VyY2UpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLy8gcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFRhcmdldEFjdGl2aXR5Tm9kZXMoVHlwZWROb2RlIHR5cGVkTm9kZSkgewotCS8vIExpc3QgYWN0Tm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhhY3ROb2RlcywgdHlwZWROb2RlKTsKLQkvLyByZXR1cm4gYWN0Tm9kZXM7Ci0JLy8gfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFRhcmdldE5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENsYXNzIHR5cGUpIHsKLQkJTGlzdCBhY3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0VGFyZ2V0Tm9kZXMoYWN0Tm9kZXMsIHR5cGVkTm9kZSwgdHlwZSk7Ci0JCXJldHVybiBhY3ROb2RlczsKLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VGFyZ2V0QWN0aXZpdHlOb2RlcyhDb2xsZWN0aW9uIGFjdE5vZGVzLCBUeXBlZE5vZGUKLQkvLyB0eXBlZE5vZGUpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gTGluayBsaW5rID0gKExpbmspaXRlci5uZXh0KCk7Ci0JLy8gTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCS8vIGlmKHRhcmdldCBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkgewotCS8vIGFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCS8vIH0KLQkvLyBlbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgewotCS8vIGdldFRhcmdldEFjdGl2aXR5Tm9kZXMoYWN0Tm9kZXMsIChUeXBlZE5vZGUpIHRhcmdldCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBub2RlcyB3aXRoIHRoZSBnaXZlbiB0eXBlIHRoYXQgYXJlIGRpcmVjdCBvciBpbmRpcmVjdCB0YXJnZXRzIG9mCi0JICogdGhlIGdpdmVuIHNvdXJjZSB0eXBlZE5vZGUuCi0JICogCi0JICogQHBhcmFtIGFjdE5vZGVzCi0JICogQHBhcmFtIHR5cGVkTm9kZQotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFRhcmdldE5vZGVzKENvbGxlY3Rpb24gYWN0Tm9kZXMsIFR5cGVkTm9kZSB0eXBlZE5vZGUsCi0JCQlDbGFzcyB0eXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkTm9kZS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQlOb2RlIHRhcmdldCA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0JCQlpZiAodHlwZS5pc0luc3RhbmNlKHRhcmdldCkpIHsKLQkJCQlhY3ROb2Rlcy5hZGQodGFyZ2V0KTsKLQkJCX0gZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJZ2V0VGFyZ2V0Tm9kZXMoYWN0Tm9kZXMsIChUeXBlZE5vZGUpIHRhcmdldCwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U291cmNlTm9kZXMoQ29sbGVjdGlvbiBhY3ROb2RlcywgVHlwZWROb2RlIHR5cGVkTm9kZSwKLQkJCUNsYXNzIHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCU5vZGUgc291cmNlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJCWlmICh0eXBlLmlzSW5zdGFuY2Uoc291cmNlKSkgewotCQkJCWFjdE5vZGVzLmFkZChzb3VyY2UpOwotCQkJfSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBUeXBlZE5vZGUpIHsKLQkJCQlnZXRTb3VyY2VOb2RlcyhhY3ROb2RlcywgKFR5cGVkTm9kZSkgc291cmNlLCB0eXBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTm9kZSBnZXRGaXJzdFNvdXJjZU5vZGUoVHlwZWROb2RlIHR5cGVkTm9kZSwgQ2xhc3MgdHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXIubmV4dCgpOwotCQkJTm9kZSBzb3VyY2UgPSBsaW5rLmdldFNvdXJjZSgpOwotCQkJaWYgKHR5cGUuaXNJbnN0YW5jZShzb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIHNvdXJjZTsKLQkJCX0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKSB7Ci0JCQkJc291cmNlID0gZ2V0Rmlyc3RTb3VyY2VOb2RlKChUeXBlZE5vZGUpIHNvdXJjZSwgdHlwZSk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gc291cmNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIHJlbW92ZVdvcmtPcmRlcihOYW1lZE5vZGVJbXBsIG5vZGUsCi0JCQlPYmplY3QgcHJlZEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybiBVbWFVdGlsLnJlbW92ZVdvcmtPcmRlcigoV29ya0JyZWFrZG93bkVsZW1lbnQpIG5vZGUKLQkJCQkJLmdldE9iamVjdCgpLCBwcmVkQnJlYWtkb3duRWxlbWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlub2RlLnNldE5vdGlmaWNhdGlvbkVuYWJsZWQobm90aWZ5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGFkZERlZmF1bHRXb3JrT3JkZXIoTmFtZWROb2RlSW1wbCBub2RlLAotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJYm9vbGVhbiBub3RpZnkgPSBub2RlLmlzTm90aWZpY2F0aW9uRW5hYmxlZCgpOwotCQl0cnkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybiBVbWFVdGlsLmNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBub2RlCi0JCQkJCS5nZXRPYmplY3QoKSwgcHJlZEJyZWFrZG93bkVsZW1lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJbm9kZS5zZXROb3RpZmljYXRpb25FbmFibGVkKG5vdGlmeSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YXNrRGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzTm9Sb2xlRGVzY3JpcHRvckFzc29jaWF0ZWQoCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvcikgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3IuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSA9PSBudWxsOwotCQkvLyBjb21tZW50ZWQgLSByZXF1aXJlbWVudHMgbm90IHRvIGFsbG93IGFkZGl0aW9uYWwgcGVyZm9ybWVyIGFuZAotCQkvLyBhc3Npc3RlZCBieSBpbiBkaWFncmFtcy4KLQkJLy8gJiYgdGFza0Rlc2NyaXB0b3IuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5pc0VtcHR5KCk7Ci0JCS8vICYmIHRhc2tEZXNjcmlwdG9yLmdldEFzc2lzdGVkQnkoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoTm9kZUNvbnRhaW5lciBjb250YWluZXIsIE5vZGUgbm9kZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkID09IG5vZGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBOb2RlQ29udGFpbmVyCi0JCQkJCSYmIGNvbnRhaW5zKChOb2RlQ29udGFpbmVyKSBjaGlsZCwgbm9kZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlZnJlc2hGcm9tQmFzZShEaWFncmFtIGRpYWdyYW0pIHsKLQkJLy8gZmluZCB0aGUgYmFzZSBkaWFncmFtCi0JCS8vCi0JCVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJVU1BU2VtYW50aWNNb2RlbEJyaWRnZSB1bWFNb2RlbEJyaWRnZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgbW9kZWxCcmlkZ2UpOwotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSB1bWFNb2RlbEJyaWRnZS5nZXRFbGVtZW50KCk7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSBhY3QuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgPT0gbnVsbAotCQkJCQl8fCBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaW50IGRpYWdyYW1UeXBlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0JCQljYXNlIEFDVElWSVRZX0RJQUdSQU06IHsKLQkJCQlEaWFncmFtIGJhc2VEaWFncmFtID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldFVNQURpYWdyYW0oYmFzZSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCQlpZiAoYmFzZURpYWdyYW0gPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUxpc3Qgb2xkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gY29weURpYWdyYW0oYmFzZURpYWdyYW0pOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGJhc2VEaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUdyYXBoTm9kZSBiYXNlTm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCQltb2RlbEJyaWRnZSA9IGJhc2VOb2RlLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJaWYgKG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJLy8gdGhpcyBpcyBhIGVsZW1lbnQncyBub2RlCi0JCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG1vZGVsQnJpZGdlKQotCQkJCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCQkJR3JhcGhOb2RlIG5vZGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5maW5kR3JhcGhOb2RlKAotCQkJCQkJCQlkaWFncmFtLCBlKTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlvbGROb2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaXNVSUdyYXBoTm9kZShiYXNlTm9kZSkpIHsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gZmluZFVJR3JhcGhOb2RlKGRpYWdyYW0sIGJhc2VOb2RlCi0JCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQkJCW9sZE5vZGVzLmFkZChub2RlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIC8vIHJlbW92ZSBhbGwgdGhlIEdyYXBoRWRnZXMgb2YgdGhlIG9sZCBub2RlcwotCQkJCS8vIC8vCi0JCQkJLy8gTGlzdCByZW1vdmVFZGdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGROb2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkvLyBHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2RlLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7Ci0JCQkJLy8gaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCS8vIE9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBHcmFwaEVkZ2UpIHsKLQkJCQkvLyByZW1vdmVFZGdlcy5hZGQoZWxlbWVudCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gaWYoIXJlbW92ZUVkZ2VzLmlzRW1wdHkoKSkgewotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHJlbW92ZUVkZ2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkvLyAuaGFzTmV4dCgpOykgewotCQkJCS8vIEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlR3JhcGhFZGdlKChHcmFwaEVkZ2UpCi0JCQkJLy8gaXRlci5uZXh0KCkpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0KLQkJCQkvLyByZW1vdmUgb2xkIG5vZGVzCi0JCQkJLy8KLQkJCQlkaWFncmFtLmdldENvbnRhaW5lZCgpLnJlbW92ZUFsbChvbGROb2Rlcyk7Ci0KLQkJCQkvLyByZW1vdmUgdW51c2VkIG9sZCBVSSBub2RlcyAmJiBub2RlcyBvZiBjb250cmlidXRvci9yZXBsYWNlcgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJR3JhcGhOb2RlIG5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGlzVUlHcmFwaE5vZGUobm9kZSkKLQkJCQkJCQkmJiBub2RlLmdldEJyaWVmRGVzY3JpcHRpb24oKSAhPSBudWxsCi0JCQkJCQkJJiYgbm9kZS5nZXRCcmllZkRlc2NyaXB0aW9uKCkubGVuZ3RoKCkgPiAwCi0JCQkJCS8vICYmIG5vZGUuZ2V0Q29udGFpbmVkKCkuaXNFbXB0eSgpCi0JCQkJCSkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gbm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKQotCQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCQkmJiAoKEFjdGl2aXR5KSBlKQotCQkJCQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyByZXBsYWNlIGFzc29jaWF0ZWQgYmFzZSBlbGVtZW50IHdpdGggY29udHJpYnV0aW5nL3JlcGxhY2luZwotCQkJCS8vIGVsZW1lbnQKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlRWxlbWVudCA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpCi0JCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQlHcmFwaE5vZGUgbm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJCWNvcHksIGJhc2VFbGVtZW50KTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBub2RlCi0JCQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGFkZCBuZXcgbm9kZXMKLQkJCQkvLwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkQWxsKGNvcHkuZ2V0Q29udGFpbmVkKCkpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7Ci0JCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRVTUFEaWFncmFtKGJhc2UsIGRpYWdyYW1UeXBlLCBmYWxzZSk7Ci0JCQkJaWYgKGJhc2VEaWFncmFtID09IG51bGwpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlMaXN0IG9sZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCURpYWdyYW0gY29weSA9IGNvcHlEaWFncmFtKGJhc2VEaWFncmFtKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlRGlhZ3JhbS5nZXRDb250YWluZWQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlHcmFwaE5vZGUgYmFzZU5vZGUgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCQkJbW9kZWxCcmlkZ2UgPSBiYXNlTm9kZS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJCWlmIChtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIHsKLQkJCQkJCS8vIHRoaXMgaXMgYSBlbGVtZW50J3Mgbm9kZQotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQkJCUdyYXBoTm9kZSBub2RlID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZmluZEdyYXBoTm9kZSgKLQkJCQkJCQkJZGlhZ3JhbSwgZSk7Ci0JCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkTm9kZXMuYWRkKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gcmVtb3ZlIG9sZCBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5yZW1vdmVBbGwob2xkTm9kZXMpOwotCi0JCQkJLy8gYWRkIG5ldyBub2RlcwotCQkJCS8vCi0JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGRBbGwoY29weS5nZXRDb250YWluZWQoKSk7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gYmFzZUd1aWQKLQkgKiAgICAgICAgICAgIHRoZSBHVUlEIG9mIHRoZSBiYXNlIFVJIEdyYXBoTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBHcmFwaE5vZGUgZmluZFVJR3JhcGhOb2RlKERpYWdyYW0gZGlhZ3JhbSwgU3RyaW5nIGJhc2VHdWlkKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVUlHcmFwaE5vZGUobm9kZSkKLQkJCQkJJiYgYmFzZUd1aWQuZXF1YWxzKG5vZGUuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VJR3JhcGhOb2RlKEdyYXBoTm9kZSBnTm9kZSkgewotCQlTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gZ05vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQlpZiAobW9kZWxCcmlkZ2UgaW5zdGFuY2VvZiBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgewotCQkJU3RyaW5nIHR5cGVJbmZvID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgbW9kZWxCcmlkZ2UpCi0JCQkJCS5nZXRUeXBlSW5mbygpOwotCQkJaWYgKHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX0RFQ0lTSU9OKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9FTkQpCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX1NUQVJUKQotCQkJCQl8fCB0eXBlSW5mby5lcXVhbHMoR1JBUEhfTk9ERV9TWU5DSF9CQVIpCi0JCQkJCXx8IHR5cGVJbmZvLmVxdWFscyhHUkFQSF9OT0RFX0ZSRUVfVEVYVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNvcHlEaWFncmFtKERpYWdyYW0gYmFzZURpYWdyYW0pIHsKLQkJRGlhZ3JhbSBjb3B5ID0gKERpYWdyYW0pIFRuZ1V0aWwuY29weShiYXNlRGlhZ3JhbSk7Ci0KLQkJLy8gSEFDSzoKLQkJLy8gZ28gdGhydSB0aGUgbm9kZXMgb2YgdGhlIGRpYWdyYW0gY29weSwgaWYgYW55IG5vZGUgaXMgYSBVSS1vbmx5IG5vZGUKLQkJLy8gKHNlZSBUeXBlZE5vZGUpCi0JCS8vIHNhdmUgdGhlIEdVSUQgb2YgdGhlIG9yaWdpbmFsIG9uZSBpbiBpdHMgYnJpZWZEZXNjcmlwdGlvbiB0byByZW1lbWJlcgotCQkvLyB3aG8gaXMgYmFzZS4KLQkJLy8KLQkJaW50IHNpemUgPSBjb3B5LmdldENvbnRhaW5lZCgpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUdyYXBoTm9kZSBnTm9kZSA9IChHcmFwaE5vZGUpIGNvcHkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpOwotCQkJaWYgKEdyYXBoaWNhbERhdGFIZWxwZXIuaXNVSUdyYXBoTm9kZShnTm9kZSkpIHsKLQkJCQlnTm9kZS5zZXRCcmllZkRlc2NyaXB0aW9uKCgoRGlhZ3JhbUVsZW1lbnQpIGJhc2VEaWFncmFtCi0JCQkJCQkuZ2V0Q29udGFpbmVkKCkuZ2V0KGkpKS5nZXRHdWlkKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgZGlhZ3JhbXMgb2YgdGhpcyBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RlZEFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QpIHsKLQkJcmV0dXJuIGdldERpYWdyYW1zKGFjdCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXREaWFncmFtcyhBY3Rpdml0eSBhY3QsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCUFycmF5TGlzdCBkaWFncmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBESUFHUkFNX1RZUEVTLmxlbmd0aDsgaSsrKSB7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFVNQURpYWdyYW0oCi0JCQkJCWFjdCwgRElBR1JBTV9UWVBFU1tpXSwgY3JlYXRlKTsKLQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQlkaWFncmFtcy5hZGQoZGlhZ3JhbSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW1zOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1UeXBlVGV4dChEaWFncmFtIGRpYWdyYW0pIHsKLQkJaW50IHR5cGUgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pOwotCQlpZiAodHlwZSAhPSAtMSkgewotCQkJcmV0dXJuIERJQUdSQU1fVFlQRV9URVhUU1t0eXBlXTsKLQkJfQotCQlyZXR1cm4gRGlhZ3JhbVJlc291cmNlcy50eXBlX3Vua25vd247IAotCX0KLQotCS8qKgotCSAqIFNldHMgb3IgdW5zZXRzIHN1cHByZXNzZWQgZmxhZyBvZiBhbGwgZGlhZ3JhbXMgaW4gdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxEaWFncmFtU3VwcHJlc3NlZChQcm9jZXNzIHByb2MsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHByb2MpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjE4OTQ5MDE0NDc2MzcxMTE0TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlDb2xsZWN0aW9uIGRpYWdyYW1zID0gZ2V0RGlhZ3JhbXMoKEFjdGl2aXR5KSBpdGVyLm5leHQoKSwKLQkJCQkJc3VwcHJlc3NlZCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZGlhZ3JhbS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZihzdXBwcmVzc2VkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlVU1BUG9pbnQoQ29sbGVjdGlvbiB1bWFQb2ludHMsIGludCB4LCBpbnQgeSkKLQkvLyB7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gdW1hUG9pbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50KSBpdGVyLm5leHQoKTsKLQkvLyBpZihwLmdldFgoKS5pbnRWYWx1ZSgpID09IHggJiYgcC5nZXRZKCkuaW50VmFsdWUoKSA9PSB5KSB7Ci0JLy8gaXRlci5yZW1vdmUoKTsKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGluayhMaW5rIGxpbmspIHsKLQkJTm9kZSBzb3VyY2VOb2RlID0gbGluay5nZXRTb3VyY2UoKTsKLQkJTm9kZSB0YXJnZXROb2RlID0gbGluay5nZXRUYXJnZXQoKTsKLQkJYm9vbGVhbiBzcmNOb3RpZnkgPSBzb3VyY2VOb2RlICE9IG51bGwgPyBzb3VyY2VOb2RlLmVEZWxpdmVyKCkgOiBmYWxzZTsKLQkJYm9vbGVhbiB0YXJnZXROb3RpZnkgPSB0YXJnZXROb2RlICE9IG51bGwgPyB0YXJnZXROb2RlLmVEZWxpdmVyKCkKLQkJCQk6IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKHNvdXJjZU5vZGUgIT0gbnVsbCkgewotCQkJCXNvdXJjZU5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCXRhcmdldE5vZGUuZVNldERlbGl2ZXIoZmFsc2UpOwotCQkJfQotCQkJbGluay5zZXRTb3VyY2UobnVsbCk7Ci0JCQlsaW5rLnNldFRhcmdldChudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzb3VyY2VOb2RlICE9IG51bGwpIHsKLQkJCQlzb3VyY2VOb2RlLmVTZXREZWxpdmVyKHNyY05vdGlmeSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJdGFyZ2V0Tm9kZS5lU2V0RGVsaXZlcih0YXJnZXROb3RpZnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIG9iamVjdCBvciBpdHMgd3JhcHBlciBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBhbGxFbGVtZW50cwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRFbGVtZW50KENvbGxlY3Rpb24gYWxsRWxlbWVudHMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlID09IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCQkvLyBJZiBvYmplY3QgKGUpIGlzIGEgd29ya3Byb2R1Y3QgZGVzY3JpcHRvciggc3ViLWFydGlmYWN0KQotCQkJLy8gcGFzc2VkIGNvbGxlY3Rpb24gZG9ub3QgaGF2ZSB3cmFwcGVyIGZvciBzdWItYXJ0aWZhY3QsIGNoZWNrIHRoZQotCQkJLy8gY29udGFpbmVyIGFydGlmYWN0J3Mgd3JhcHBlci4KLQkJCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NTkxNAotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCU9iamVjdCBjaGlsZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpZWxlbWVudCkuZ2V0Q2hpbGRyZW4oZWxlbWVudCksIGUpOwotCQkJCWlmKGNoaWxkRWxlbWVudCAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIGNoaWxkRWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBNZXRob2QgdG8gY2hlY2sgaWYgYW55IGR1cGxpY2F0ZSBwcmVkZWNlc3NvciBpbiB0aGUgcHJlZGVjZXNzb3JzIGxpc3Qgb2YKLQkgKiBXb3JrQnJlYWtkb3duRWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RHVwbGljYXRlUHJlZGVjZXNzb3JzKFdvcmtCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHByZWRsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRQcmVkcyhlLCBwcmVkbGlzdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKCFsaXN0LmNvbnRhaW5zKG9iaikpIHsKLQkJCQlsaXN0LmFkZChvYmopOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgYWxsIHRoZSBwcmVkZWNlc3NvcnMgYWN0aXZpdGllcyBpbnN0ZWFkIG9mCi0JICogd29ya29yZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UHJlZHMoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcHJlZGxpc3QgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHByZWRsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJV29ya09yZGVyIHdvcmtvcmRlciA9IChXb3JrT3JkZXIpIGl0b3IubmV4dCgpOwotCQkJbGlzdC5hZGQod29ya29yZGVyLmdldFByZWQoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCB0byBjaGVjayBiZWZvcmUgZGVsZXRpbmcgYSBsaW5rLiBJZiBkdXBsaWNhdGUgcHJlZGVjZXNzb3IgZXhpc3RzCi0JICogaW4gdGhlIGxlZ2FjeSBkYXRhLCBjaGVjayBpZiBkZWxldGluZyBsaW5rIHNob3VsZCByZW1vdmUgYWxsIHRoZQotCSAqIHByZWRlY2Vzc29ycyBvciBub3QgYnkgdmVyaWZ5aW5nIGlmIHRhcmdldCBvciBpbmRpcmVjdCB0YXJnZXQgaGF2ZSBkaXJlY3QKLQkgKiBvciBpbmRpcmVjdCBsaW5rcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVtb3ZlQWxsUHJlZHMoTGluayBsaW5rLCBOb2RlIG9sZFNvdXJjZSwKLQkJCU5vZGUgb2xkVGFyZ2V0KSB7Ci0KLQkJaWYgKG9sZFRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSkgewotCQkJTGlzdCBpbmxpc3QgPSBvbGRUYXJnZXQuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gaW5saXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgaW5jb21pbmdsaW5rID0gKExpbmspIGl0b3IubmV4dCgpOwotCQkJCS8vIFJBVExDMDAzODQyNDUgOiBQcmVkZWNlc3NvciBjaGFuZ2VzIHNob3VsZCBiZSBkb25lIG9ubHkgaW4KLQkJCQkvLyBjYXNlIG9mIFN5bmNocm9uaXphdGlvbiBCYXIuCi0JCQkJaWYgKGluY29taW5nbGluay5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIFR5cGVkTm9kZQotCQkJCQkJJiYgKChUeXBlZE5vZGUpIGluY29taW5nbGluay5nZXRTb3VyY2UoKSkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpIHsKLQkJCQkJQ29sbGVjdGlvbiBjb2wgPSBHcmFwaGljYWxEYXRhSGVscGVyLmdldFNvdXJjZU5vZGVzKAotCQkJCQkJCShUeXBlZE5vZGUpIGluY29taW5nbGluay5nZXRTb3VyY2UoKSwKLQkJCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUuY2xhc3MpOwotCQkJCQlpZiAoY29sLmNvbnRhaW5zKG9sZFNvdXJjZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoaW5jb21pbmdsaW5rLmdldFNvdXJjZSgpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKSB7Ci0JCQkJCWlmIChpbmNvbWluZ2xpbmsuZ2V0U291cmNlKCkuZXF1YWxzKG9sZFNvdXJjZSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogTWV0aG9kIHRvIGdldCB0aGUgc291cmNlcyBvZiBTeW5jQmFyIGluQ29tbWluZyBjb25uZWN0aW9ucwotCSAqIGFuZCBpZiBzeW5jYmFyIGhhdmUgaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tIGRlY2lzaW9uIHBvaW50LCAKLQkgKiBhbmQgZGVjaXNpb24gcG9pbnQgaGF2ZSBpbmNvbW1pbmcgY29ubmVjdGlvbnMgKHdvcmticmVhZGRvd24gZWxlbXRucykKLQkgKiBjb2xsZWN0aW9ucyB3aWxsIGlnbm9yZSBhbGwgdGhlIGluY29taW5nIGNvbm5lY3Rpb24gZnJvbSBkZWNpc2lvbiBwb2ludC4gIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3luY0JhclNvdXJjZU5vZGVzKFR5cGVkTm9kZSB0eXBlZE5vZGUsIENvbGxlY3Rpb24gYWN0Tm9kZXMpewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyLm5leHQoKTsKLQkJCQlOb2RlIHNvdXJjZSA9IGxpbmsuZ2V0U291cmNlKCk7Ci0JCQkJaWYoc291cmNlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnROb2RlKXsKLQkJCQkJYWN0Tm9kZXMuYWRkKHNvdXJjZSk7Ci0JCQkJfWVsc2UgaWYoc291cmNlIGluc3RhbmNlb2YgVHlwZWROb2RlKXsKLQkJCQkJaWYoKChUeXBlZE5vZGUpc291cmNlKS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikKLQkJCQkJCWdldFN5bmNCYXJTb3VyY2VOb2RlcygoVHlwZWROb2RlKXNvdXJjZSxhY3ROb2Rlcyk7Ci0JCQkJfQotCQl9Ci0JfQotCS8qCi0JICogTWV0aG9kIHRvIGNvbGxlY3Qgc3luY2hyb25pemF0aW9uIGJhciBvdXRnb2luZyBjb25uZWN0aW9uCi0JICogZXhjZXB0IGFueSBjb25uZWN0aW9uIGdvaW5nIGZyb20gZGVjaXNpb24gcG9pbnRzLiAgCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFN5bmNCYXJUYXJnZXROb2RlcyhUeXBlZE5vZGUgdHlwZWROb2RlLCBDb2xsZWN0aW9uIGFjdE5vZGVzKXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluaykgaXRlci5uZXh0KCk7Ci0JCQkJTm9kZSB0YXJnZXQgPSBsaW5rLmdldFRhcmdldCgpOwotCQkJCWlmKHRhcmdldCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl7Ci0JCQkJCWFjdE5vZGVzLmFkZCh0YXJnZXQpOwotCQkJCX1lbHNlIGlmKHRhcmdldCBpbnN0YW5jZW9mIFR5cGVkTm9kZSl7Ci0JCQkJCWlmKCgoVHlwZWROb2RlKXRhcmdldCkuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TWU5DSF9CQVIpCi0JCQkJCQlnZXRTeW5jQmFyVGFyZ2V0Tm9kZXMoKFR5cGVkTm9kZSl0YXJnZXQsIGFjdE5vZGVzKTsKLQkJCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBOb2RlIGZpbmROb2RlKE5vZGVDb250YWluZXIgY29udGFpbmVyLCBPYmplY3Qgb2JqZWN0LCBDbGFzcyBub2RlVHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250YWluZXIuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU5vZGUgZWxlbWVudCA9IChOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgPT0gZWxlbWVudC5nZXRPYmplY3QoKSAmJiBub2RlVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gYWRkIGEgcHJvcGVydHkgdG8gR3JhcGhOb2RlIHByb3BlcnR5IGxpc3QKLQkgKiAoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSkgVmVyaWZpZXMgcHJvcGVydHkgZXhpc3RzIG9yIG5vdCwgaWYgbm90Ci0JICogY3JlYXRlcyBhIHByb3BlcnR5IHdpdGggZ2l2ZW4ga2V5IGFuZCB2YWx1ZS4gYW5kIHNldCBpbnRvIGdyYXBoIG5vZGUKLQkgKiBwcm9wZXJ0eSBsaXN0LCBpZiBleGlzdHMganVzdCBzZXRzIHZhbHVlIGZvciBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZ3JhcGhOb2RlCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gUHJvcGVydHkKLQkgKiBAYXV0aG9yIHNrYW5ub29yCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eShHcmFwaE5vZGUgZ3JhcGhOb2RlLCBTdHJpbmcga2V5LAotCQkJU3RyaW5nIHZhbHVlKSB7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gbnVsbDsKLQkJaWYgKGdyYXBoTm9kZSAhPSBudWxsKSB7Ci0JCQlwcm9wZXJ0eSA9IGZpbmRQcm9wZXJ0eShncmFwaE5vZGUsIGtleSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCXByb3BlcnR5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvcGVydHkoKTsKLQkJCXByb3BlcnR5LnNldEtleShrZXkpOwotCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCQkJTGlzdCBsaXN0ID0gZ3JhcGhOb2RlLmdldExpc3QoVW1hUGFja2FnZS5HUkFQSF9OT0RFX19QUk9QRVJUWSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlncmFwaE5vZGUuc2V0KFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fUFJPUEVSVFksIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQocHJvcGVydHkpOwotCQl9IGVsc2UgewotCQkJcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0JCi0JLyoqCi0JICogQWNjZXNpYmxlIG1ldGhvZCBmb3IgQWN0aXZpdHlEZXRhaWxEaWFncmFtLCB0byBnZXQgYSBhdXRvbGF5b3V0IGZsYWcgZnJvbQotCSAqIEdyYXBoaE5vZGUgcHJvcGVydHkgbGlzdC4gcmV0dXJuIHN0cmluZyBjYW4gYmUKLQkgKiBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT0xBWU9VVF9WQUxVRV9UUlVFLAotCSAqIEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPTEFZT1VUX1ZBTFVFX0ZBTFNFLCBvciBudWxsLgotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdXRvTGF5b3V0RmxhZyhBY3Rpdml0eURldGFpbERpYWdyYW0gZGlhZ3JhbSkgewotCQlTdHJpbmcgZmxhZyA9IG51bGw7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBkaWFncmFtLmdldEdyYXBoTm9kZSgpOwotCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCUxpc3QgcHJvcExpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCWlmIChwcm9wTGlzdCAhPSBudWxsICYmIHByb3BMaXN0LnNpemUoKSA+IDApIHsKLQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZmluZFByb3BlcnR5KGdyYXBoTm9kZSwKLQkJCQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVCk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJZmxhZyA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmbGFnOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvTGF5b3V0KEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBkaWFncmFtKXsKLQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGRpYWdyYW0uZ2V0R3JhcGhOb2RlKCk7Ci0JCWlmKGdyYXBoTm9kZSAhPSBudWxsKXsKLQkJCUxpc3QgcHJvcExpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCWlmKHByb3BMaXN0ICE9IG51bGwgJiYgcHJvcExpc3Quc2l6ZSgpID4gMCl7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGljYWxEYXRhSGVscGVyLmZpbmRQcm9wZXJ0eSgKLQkJCQkJZ3JhcGhOb2RlLCBHcmFwaGljYWxEYXRhSGVscGVyLlBST1BfQVVUT19MQVlPVVQpOwotCQkJCWlmKHByb3BlcnR5ICE9IG51bGwpewotCQkJCQlTdHJpbmcgdGVtcCA9IHByb3BlcnR5LmdldFZhbHVlKCk7Ci0JCQkJCWlmKHRlbXAgIT0gbnVsbCAmJiB0ZW1wICE9ICIiICYmICAvLyROT04tTkxTLTEkCi0JCQkJCQkJKEdyYXBoaWNhbERhdGFIZWxwZXIuUFJPUF9BVVRPX0xBWU9VVF9WQUxVRV9UUlVFLmVxdWFscyh0ZW1wKQotCQkJCQkJCQkJfHwgR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX0FVVE9fTEFZT1VUX1ZBTFVFX0ZBTFNFLmVxdWFscyh0ZW1wKSkpewotCQkJCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRlbXApLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFza3NQZXJSb3coKXsKLQkJU3RyaW5nIGNvdW50ID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpCi0JCQkJLmdldFN0cmluZyhHcmFwaGljYWxEYXRhSGVscGVyLkFERF9ESUFHUkFNX1RBU0tTX1BFUl9ST1cpOwotCQlpZiAoY291bnQgIT0gbnVsbCAmJiBjb3VudC5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KGNvdW50KTsKLQkJCQlyZXR1cm4gaTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZSkgewotCQkJCXJldHVybiAxMDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMTA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3QgdGhlIGxpc3Qgb2Yge0BsaW5rIFByb3BlcnR5fSBvYmplY3RzCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5IGdldFByb3BlcnR5QnlLZXkoTGlzdCBsaXN0LCBTdHJpbmcga2V5KSB7Ci0JCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXJvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXJvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvcGVydHkgcHJvcGVydHkgPSAoUHJvcGVydHkpIGlyb3IubmV4dCgpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcm9wZXJ0eS5nZXRLZXkoKS5lcXVhbHMoa2V5KSkgewotCQkJCQkJcmV0dXJuIHByb3BlcnR5OwotCQkJCQl9Ci0vLwkJCQkJCWVsc2UgewotLy8JCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHkgZ2V0UHJvcGVydHkoTm9kZSBub2RlLCBTdHJpbmcga2V5KSB7Ci0JCUdyYXBoTm9kZSBncmFwaE5vZGUgPSBub2RlLmdldEdyYXBoTm9kZSgpOwotCQlpZiAoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCUxpc3QgbGlzdCA9IGdyYXBoTm9kZS5nZXRQcm9wZXJ0eSgpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKGludCBpID0gbGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQlQcm9wZXJ0eSBwcm9wID0gKFByb3BlcnR5KSBsaXN0LmdldChpKTsKLQkJCQkJaWYgKGtleS5lcXVhbHMocHJvcC5nZXRLZXkoKSkpIHsKLQkJCQkJCXJldHVybiBwcm9wOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9HcmFwaGljYWxEYXRhTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmZiYmFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0dyYXBoaWNhbERhdGFNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIERpYWdyYW0gZGF0YSBzdG9yZWQgaW4gVU1BOiBTZW1hbnRpY01vZGVsQnJpZGdlIC5QcmVzZW50YXRpb24gZGlhZ3JhbSB0eXBlLAotICogaXRzIHZhbHVlIGNhbiBiZSBvbmUgb2YgZm9sbG93aW5nIGNvbnN0YW50cyBkZWZpbmVkIGluIEdyYXBoaWNhbERhdGFIZWxwZXIKLSAqIERJQUdSQU1fV09SS0ZMT1csIERJQUdSQU1fV09SS19QUk9EVUNUX0RFUEVOREVOQ1ksIERJQUdSQU1fQUNUSVZJVFlfREVUQUlMCi0gKiAKLSAqIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgLkVsZW1lbnQgQnJlYWtkb3duRWxlbWVudCB0aGF0IHRoZSBEaWFncmFtRWxlbWVudCBvZgotICogdGhpcyBTZW1hbnRpY01vZGVsQnJpZGdlIHJlcHJlc2VudHMKLSAqIAotICogU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgLlR5cGVJbmZvIHR5cGUgaW5mb3JtYXRpb24gZm9yIFR5cGVkTm9kZSwgaXRzCi0gKiB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiBHcmFwaGljYWxEYXRhSGVscGVyCi0gKiB3cENvbXBvc2l0ZVR5cGUgV29ya1Byb2R1Y3RDb21wb3NpdGUgdHlwZQotICogCi0gKiBEaWFncmFtRWxlbWVudCAuUHJvcGVydHkgKGxpc3Qgb2YgcHJvcGVydGllcykKLSAqIAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR3JhcGhpY2FsRGF0YU1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGRpYWdyYW1QcmVzZW50YXRpb25zID0gbmV3IFN0cmluZ1tdIHsKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9XT1JLRkxPVywKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9XT1JLX1BST0RVQ1RfREVQRU5ERU5DWSwKLQkJCUdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9BQ1RJVklUWV9ERVRBSUwgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gY2hpbGRUeXBlcyA9IG5ldyBDbGFzc1tdIHsgQWN0aXZpdHkuY2xhc3MsCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIERlc2NyaXB0b3IuY2xhc3MgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzW10gZGlhZ3JhbUNoYW5nZUxpc3RlbmVyQ2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsKLQkJCUlBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5jbGFzcywKLQkJCUlXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3MsCi0JCQlJQWN0aXZpdHlEZXRhaWxEaWFncmFtQ2hhbmdlTGlzdGVuZXIuY2xhc3MgfTsKLQotCXByaXZhdGUgc3RhdGljIEdyYXBoaWNhbERhdGFNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCS8vcHJpdmF0ZSBNYXAgZ3JhcGhpY2FsRGF0YU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIExpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4gY29tbWFuZExpc3RlbmVyczsKLQotCXByaXZhdGUgR3JhcGhpY2FsRGF0YU1hbmFnZXIoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHcmFwaGljYWxEYXRhTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoR3JhcGhpY2FsRGF0YU1hbmFnZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBHcmFwaGljYWxEYXRhTWFuYWdlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8gcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoQWN0aXZpdHkgYWN0LCBpbnQgZGlhZ3JhbVR5cGUsIEFjdGl2aXR5Ci0JLy8gcGFyZW50KSB7Ci0JLy8gLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChhY3QsCi0JLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkvLyAvLyBPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYWN0KTsKLQkvLyAvLyBpZihwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCS8vIGlmKHBhcmVudCA9PSBudWxsKSB7Ci0JLy8gLy8gbmV3IEFjdGl2aXR5Ci0JLy8gLy8KLQkvLyByZXR1cm4gY3JlYXRlR3JhcGhOb2RlKGFjdCk7Ci0JLy8gfQotCS8vIGlmKCFhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCkuY29udGFpbnMocGFyZW50KSkgewotCS8vIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3VwZXIgYWN0aXZpdHkgZm9yICIgKyBhY3QgKwotCS8vICI6ICIgKyBwYXJlbnQpOwotCS8vIH0KLQkvLyBBY3Rpdml0eSBwYXJlbnRBY3QgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkvLyBEaWFncmFtIGRpYWdyYW0gPSBnZXREaWFncmFtKHBhcmVudEFjdCwgZGlhZ3JhbVR5cGUpLmdldFVNQURpYWdyYW0oKTsKLQkvLyByZXR1cm4gZ2V0R3JhcGhOb2RlKGRpYWdyYW0sIGFjdCk7Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyB0aGUgR3JhcGhOb2RlIG9mIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBmb3IgdGhlIGdpdmVuIGRpYWdyYW0uCi0JICogQ3JlYXRlIHRoZSBHcmFwaE5vZGUgaWYgaXQgZG9lcyBub3QgZXhpc3QgeWV0LgotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQpIHsKLQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJLy8gbmV3IE1ldGhvZEVsZW1lbnQKLQkJCS8vCi0JCQlyZXR1cm4gY3JlYXRlR3JhcGhOb2RlKG1ldGhvZEVsZW1lbnQpOwotCQl9Ci0JCUdyYXBoTm9kZSBub2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCBtZXRob2RFbGVtZW50KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJbm9kZSA9IGNyZWF0ZUdyYXBoTm9kZShtZXRob2RFbGVtZW50KTsKLQkJCWNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhub2RlLCBkaWFncmFtKTsKLQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgR3JhcGhOb2RlIGZpbmRHcmFwaE5vZGUoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3QgbWV0aG9kRWxlbWVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkaWFncmFtLmdldENvbnRhaW5lZCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJR3JhcGhOb2RlIGVsZW1lbnQgPSAoR3JhcGhOb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFNlbWFudGljTW9kZWwoKSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJJiYgbWV0aG9kRWxlbWVudCA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGVsZW1lbnQKLQkJCQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBwdWJsaWMgRGlhZ3JhbUVsZW1lbnQgZ2V0RGlhZ3JhbUVsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gcmV0dXJuIGdldEdyYXBoTm9kZSgoQWN0aXZpdHkpIG9iamVjdCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JLy8gV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIG9iamVjdDsKLQkvLyBCcmVha2Rvd25FbGVtZW50IGJlID0gd29ya09yZGVyLmdldFByZWQoKTsKLQkvLyBpZihiZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JLy8gR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGdldEdyYXBoTm9kZSgoQWN0aXZpdHkpIGJlKTsKLQkvLyBMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0Q29udGFpbmVkKCk7Ci0JLy8gUG9seWxpbmUgcG9seWxpbmUgPSBudWxsOwotCS8vIGZvcihpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JLy8gT2JqZWN0IG9iaiA9IGxpc3QuZ2V0KGkpOwotCS8vIGlmKG9iaiBpbnN0YW5jZW9mIFBvbHlsaW5lKSB7Ci0JLy8gcG9seWxpbmUgPSAoUG9seWxpbmUpIG9iajsKLQkvLyBicmVhazsKLQkvLyB9Ci0JLy8gfQotCS8vIGlmKHBvbHlsaW5lID09IG51bGwpIHsKLQkvLyBwb2x5bGluZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvbHlsaW5lKCk7Ci0JLy8gbGlzdC5hZGQoMCwgcG9seWxpbmUpOwotCS8vIH0KLQkvLyByZXR1cm4gcG9seWxpbmU7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCS8vIGNoZWNrIGlmIHRoaXMgYWN0aXZpdHkgY29udHJpYnV0ZXMvZXh0ZW5kcyBvdGhlciBhY3Rpdml0eSBhbmQgdHJ5Ci0JCS8vIGNvcHkKLQkJLy8gdGhlIGV4aXN0aW5nIGRpYWdyYW0gZnJvbSB0aGUgYmFzZQotCQkvLwotCQlpZiAoUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IGdldFVNQURpYWdyYW0oKEFjdGl2aXR5KSBhY3QKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgZGlhZ3JhbVR5cGUsIGZhbHNlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJRGlhZ3JhbSBjb3B5ID0gR3JhcGhpY2FsRGF0YUhlbHBlci5jb3B5RGlhZ3JhbShiYXNlRGlhZ3JhbSk7Ci0KLQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGNvcHkKLQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJbW9kZWxCcmlkZ2Uuc2V0RWxlbWVudChhY3QpOwotCQkJCXJldHVybiBjb3B5OwotCQkJfQotCQl9Ci0KLQkJRGlhZ3JhbSBkaWFncmFtID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG1vZGVsQnJpZGdlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQltb2RlbEJyaWRnZS5zZXRFbGVtZW50KGFjdCk7Ci0JCW1vZGVsQnJpZGdlLnNldFByZXNlbnRhdGlvbihkaWFncmFtUHJlc2VudGF0aW9uc1tkaWFncmFtVHlwZV0pOwotCQlkaWFncmFtLnNldFNlbWFudGljTW9kZWwobW9kZWxCcmlkZ2UpOwotCi0JCS8vIGdldERpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSkuc2V0VU1BRGlhZ3JhbShkaWFncmFtKTsKLQotCQlwb3B1bGF0ZURpYWdyYW0oZGlhZ3JhbSwgYWN0LCBkaWFncmFtVHlwZSk7Ci0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGlhZ3JhbShEaWFncmFtIGRpYWdyYW0sIEFjdGl2aXR5IGFjdCwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JCS8vIGNyZWF0ZSBHcmFwaE5vZGUgZm9yIGVhY2ggQnJlYWtkb3duRWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZSBkaWFncmFtCi0JCS8vCi0JCUxpc3Qgbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZFR5cGVzW2RpYWdyYW1UeXBlXS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJR3JhcGhOb2RlIG5vZGUgPSBjcmVhdGVHcmFwaE5vZGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJCWRpYWdyYW0uZ2V0Q29udGFpbmVkKCkuYWRkKG5vZGUpOwotCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSBHcmFwaENvbm5lY3RvcnMgZm9yIGVhY2ggQnJlYWtkb3duRWxlbWVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUdyYXBoTm9kZSBub2RlID0gKEdyYXBoTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQljcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZGlhZ3JhbSwgZGlhZ3JhbVR5cGUpOwotCQl9Ci0JfQotCi0vLwlwcml2YXRlIHZvaWQgcG9wdWxhdGVBY3Rpdml0eURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3QpIHsKLS8vCQkvLyBjcmVhdGUgR3JhcGhOb2RlIGZvciBlYWNoIGNoaWxkIGFjdGl2aXR5IGFuZCBhZGQgaXQgdG8gdGhlIGRpYWdyYW0KLS8vCQkvLyAKLS8vCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLS8vCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0vLwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJCUFjdGl2aXR5IGNoaWxkQWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotLy8JCQkJR3JhcGhOb2RlIG5vZGUgPSBjcmVhdGVHcmFwaE5vZGUoY2hpbGRBY3QpOwotLy8JCQkJZGlhZ3JhbS5nZXRDb250YWluZWQoKS5hZGQobm9kZSk7Ci0vLwkJCQlub2Rlcy5hZGQobm9kZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIGNyZWF0ZSBHcmFwaENvbm5lY3RvcnMgZm9yIGVhY2ggY2hpbGQgYWN0aXZpdHkKLS8vCQkvLwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vZGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpIGl0ZXIubmV4dCgpOwotLy8JCQljcmVhdGVHcmFwaENvbm5lY3RvcnMobm9kZSwgZGlhZ3JhbSk7Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXIoQWN0aXZpdHkgYWN0LAotCQkJaW50IGRpYWdyYW1UeXBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGlhZ3JhbUNoYW5nZUxpc3RlbmVyQ2xhc3Nlc1tkaWFncmFtVHlwZV0uaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCXJldHVybiAoSURpYWdyYW1DaGFuZ2VMaXN0ZW5lcikgZWxlbWVudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCk7Ci0JCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0JCW1vZGVsQnJpZGdlLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCWdyYXBoTm9kZS5zZXRTZW1hbnRpY01vZGVsKG1vZGVsQnJpZGdlKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCBwb2ludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvaW50KCk7Ci0JCXBvaW50LnNldFgobmV3IERvdWJsZSgtMSkpOwotCQlwb2ludC5zZXRZKG5ldyBEb3VibGUoLTEpKTsKLQkJZ3JhcGhOb2RlLnNldFBvc2l0aW9uKHBvaW50KTsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24gZGltID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGltZW5zaW9uKCk7Ci0JCWRpbS5zZXRXaWR0aChuZXcgRG91YmxlKC0xKSk7Ci0JCWRpbS5zZXRIZWlnaHQobmV3IERvdWJsZSgtMSkpOwotCQlncmFwaE5vZGUuc2V0U2l6ZShkaW0pOwotCi0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JcHVibGljIEdyYXBoRWRnZSBhZGRHcmFwaENvbm5lY3RvclBhaXIoRGlhZ3JhbSBkaWFncmFtLAotCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSwgV29ya09yZGVyIGVsZW1lbnQpIHsKLQkJR3JhcGhDb25uZWN0b3Igc3JjQ29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJZ3JhcGhOb2RlLmdldEFuY2hvcmFnZSgpLmFkZChzcmNDb25uZWN0b3IpOwotCQlHcmFwaEVkZ2UgZWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpOwotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGJyaWRnZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJYnJpZGdlLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCWVkZ2Uuc2V0U2VtYW50aWNNb2RlbChicmlkZ2UpOwotCQlncmFwaE5vZGUuZ2V0Q29udGFpbmVkKCkuYWRkKGVkZ2UpOwotCQllZGdlLmdldEFuY2hvcigpLmFkZChzcmNDb25uZWN0b3IpOwotCi0JCUdyYXBoTm9kZSBzdWNjTm9kZSA9IGdldEdyYXBoTm9kZShkaWFncmFtLCBVbWFVdGlsCi0JCQkJLmdldE93bmluZ0FjdGl2aXR5KGVsZW1lbnQpKTsKLQkJR3JhcGhDb25uZWN0b3IgdGFyZ2V0Q29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJc3VjY05vZGUuZ2V0QW5jaG9yYWdlKCkuYWRkKHRhcmdldENvbm5lY3Rvcik7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHRhcmdldENvbm5lY3Rvcik7Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCXB1YmxpYyBHcmFwaEVkZ2UgYWRkR3JhcGhDb25uZWN0b3JQYWlyKEdyYXBoTm9kZSBzcmNOb2RlLAotCQkJR3JhcGhOb2RlIHRhcmdldE5vZGUpIHsKLQkJR3JhcGhDb25uZWN0b3Igc3JjQ29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJc3JjTm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQoc3JjQ29ubmVjdG9yKTsKLQkJR3JhcGhFZGdlIGVkZ2UgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHcmFwaEVkZ2UoKTsKLQkJc3JjTm9kZS5nZXRDb250YWluZWQoKS5hZGQoZWRnZSk7Ci0JCWVkZ2UuZ2V0QW5jaG9yKCkuYWRkKHNyY0Nvbm5lY3Rvcik7Ci0KLQkJR3JhcGhDb25uZWN0b3IgdGFyZ2V0Q29ubmVjdG9yID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3JhcGhDb25uZWN0b3IoKTsKLQkJdGFyZ2V0Tm9kZS5nZXRBbmNob3JhZ2UoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJZWRnZS5nZXRBbmNob3IoKS5hZGQodGFyZ2V0Q29ubmVjdG9yKTsKLQkJcmV0dXJuIGVkZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlR3JhcGhFZGdlKEdyYXBoRWRnZSBlZGdlKSB7Ci0JCUVjb3JlVXRpbC5yZW1vdmUoZWRnZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkZ2UuZ2V0QW5jaG9yKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaENvbm5lY3RvciBjb25uID0gKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUoY29ubik7Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCByZW1vdmVHcmFwaENvbm5lY3RvclBhaXIoR3JhcGhOb2RlIHNyY05vZGUsIEdyYXBoTm9kZQotCS8vIHRhcmdldE5vZGUpIHsKLQkvLyAvLyBmaW5kIHRoZSBzb3VyY2UgR3JhcGhDb25uZWN0b3IgYW5kIHJlbW92ZSBpdCwgaXRzIEdyYXBoRWRnZSwgYW5kIGl0cwotCS8vIHRhcmdldCBHcmFwaENvbm5lY3RvcgotCS8vIC8vCi0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc3JjTm9kZS5nZXRBbmNob3JhZ2UoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0JLy8gewotCS8vIEdyYXBoQ29ubmVjdG9yIGNvbm5lY3RvciA9IChHcmFwaENvbm5lY3RvcikgaXRlci5uZXh0KCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbm5lY3Rvci5nZXRHcmFwaEVkZ2UoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCS8vIC5oYXNOZXh0KCk7KSB7Ci0JLy8gR3JhcGhFZGdlIGVkZ2UgPSAoR3JhcGhFZGdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JLy8gT2JqZWN0IHRhcmdldENvbm5lY3RvciA9IGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCS8vIGlmKHRhcmdldE5vZGUuZ2V0QW5jaG9yYWdlKCkucmVtb3ZlKHRhcmdldENvbm5lY3RvcikpIHsKLQkvLyBzcmNOb2RlLmdldENvbnRhaW5lZCgpLnJlbW92ZShlZGdlKTsKLQkvLyAvLyBkb24ndCByZW1vdmUgdGhlIGVkZ2UgZnJvbSBjb25uZWN0b3IgdG8gc3VwcG9ydCB1bmRvCi0JLy8gLy8KLQkvLyAvLyBpdGVyYXRvci5yZW1vdmUoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGlmKGNvbm5lY3Rvci5nZXRHcmFwaEVkZ2UoKS5pc0VtcHR5KCkpIHsKLQkvLyBpdGVyLnJlbW92ZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlR3JhcGhDb25uZWN0aW9uUGFpcihHcmFwaE5vZGUgZ3JhcGhOb2RlLAotCQkJV29ya09yZGVyIHdvcmtPcmRlcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncmFwaE5vZGUuZ2V0QW5jaG9yYWdlKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlHcmFwaENvbm5lY3RvciBjb25uID0gKEdyYXBoQ29ubmVjdG9yKSBpdGVyLm5leHQoKTsKLQkJCUdyYXBoRWRnZSBlZGdlID0gKEdyYXBoRWRnZSkgY29ubi5nZXRHcmFwaEVkZ2UoKS5nZXQoMCk7Ci0JCQlpZiAoZWRnZS5lQ29udGFpbmVyKCkgPT0gZ3JhcGhOb2RlKSB7Ci0JCQkJR3JhcGhDb25uZWN0b3IgY29ubjIgPSAoR3JhcGhDb25uZWN0b3IpIGVkZ2UuZ2V0QW5jaG9yKCkuZ2V0KDEpOwotCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gY29ubjIuZ2V0R3JhcGhFbGVtZW50KCkKLQkJCQkJCS5nZXRTZW1hbnRpY01vZGVsKCk7Ci0JCQkJaWYgKGJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJCSYmICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCkgPT0gVW1hVXRpbAotCQkJCQkJCQkuZ2V0T3duaW5nQWN0aXZpdHkod29ya09yZGVyKSkgewotCQkJCQljb25uMi5nZXRHcmFwaEVsZW1lbnQoKS5nZXRBbmNob3JhZ2UoKS5yZW1vdmUoY29ubjIpOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQlncmFwaE5vZGUuZ2V0Q29udGFpbmVkKCkucmVtb3ZlKGVkZ2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhHcmFwaE5vZGUgZ3JhcGhOb2RlLCBEaWFncmFtIGRpYWdyYW0pIHsKLQkJY3JlYXRlR3JhcGhDb25uZWN0b3JzKGdyYXBoTm9kZSwgZGlhZ3JhbSwgZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSkpOwotCX0KLQotCWludCBnZXREaWFncmFtVHlwZShEaWFncmFtIGRpYWdyYW0pIHsKLQkJU3RyaW5nIHR5cGVTdHIgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaWFncmFtUHJlc2VudGF0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRpYWdyYW1QcmVzZW50YXRpb25zW2ldLmVxdWFscyh0eXBlU3RyKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdyYXBoQ29ubmVjdG9ycyhHcmFwaE5vZGUgZ3JhcGhOb2RlLCBEaWFncmFtIGRpYWdyYW0sCi0JCQlpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBncmFwaE5vZGUKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbCgpKS5nZXRFbGVtZW50KCk7Ci0JCXN3aXRjaCAoZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBHcmFwaGljYWxEYXRhSGVscGVyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJCS8vIGNyZWF0ZSBjb25uZWN0b3JzCi0JCQkJLy8KLQkJCQkvLyBMaXN0IGxpc3QgPSBhY3QuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCQkvLyBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJCS8vCQkJCQotCQkJCS8vIEFjdGl2aXR5IHBhcmVudCA9IChBY3Rpdml0eSkKLQkJCQkvLyAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpZGlhZ3JhbS5nZXRTZW1hbnRpY01vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJCQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gcGFyZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQkJLy8gZm9yKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCS8vIFdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBsaXN0LmdldChpKTsKLQkJCQkvLyBpZihicmVha2Rvd25FbGVtZW50cy5jb250YWlucyh3b3JrT3JkZXIuZ2V0UHJlZCgpKSkgewotCQkJCS8vIGFkZEdyYXBoQ29ubmVjdG9yUGFpcihkaWFncmFtLCBncmFwaE5vZGUsIHdvcmtPcmRlcik7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJR3JhcGhOb2RlIHNyY05vZGUgPSBmaW5kR3JhcGhOb2RlKGRpYWdyYW0sIHdvcmtPcmRlcgotCQkJCQkJCS5nZXRQcmVkKCkpOwotCQkJCQlpZiAoc3JjTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlhZGRHcmFwaENvbm5lY3RvclBhaXIoc3JjTm9kZSwgZ3JhcGhOb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWs7Ci0JCWNhc2UgR3JhcGhpY2FsRGF0YUhlbHBlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVzY3JpcHRvci5nZXRJbXBhY3RzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGltcGFjdGVkRGVzY3JpcHRvciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlHcmFwaE5vZGUgdGFyZ2V0Tm9kZSA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmZpbmRHcmFwaE5vZGUoCi0JCQkJCQkJZGlhZ3JhbSwgaW1wYWN0ZWREZXNjcmlwdG9yKTsKLQkJCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCQkJYWRkR3JhcGhDb25uZWN0b3JQYWlyKGdyYXBoTm9kZSwgdGFyZ2V0Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVTUEgZGlhZ3JhbSBmcm9tIHRoZSBVTUEgbW9kZWwgZm9yIHRoZSBnaXZlbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBkaWFncmFtIHR5cGUgY29uc3RhbnRzIGRlZmluZWQgaW4KLQkgKiAgICAgICAgICAgIHtAbGluayBHcmFwaGljYWxEYXRhSGVscGVyIEdyYXBoaWNhbERhdGFIZWxwZXIgfQotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIG5ldyBVTUEgZGlhZ3JhbSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhlIGFjdGl2aXR5IGRvZXMKLQkgKiAgICAgICAgICAgIG5vdCBoYXZlIG9uZSBhbHJlYWR5LgotCSAqIEByZXR1cm4KLQkgKiBAc2VlIEdyYXBoaWNhbERhdGFIZWxwZXIjQUNUSVZJVFlfRElBR1JBTQotCSAqIEBzZWUgR3JhcGhpY2FsRGF0YUhlbHBlciNBQ1RJVklUWV9ERVRBSUxfRElBR1JBTQotCSAqIEBzZWUgR3JhcGhpY2FsRGF0YUhlbHBlciNXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0VU1BRGlhZ3JhbShBY3Rpdml0eSBlLCBpbnQgZGlhZ3JhbVR5cGUsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0KLQkJLy8gLy8gbG9vayBmb3IgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBpbiBhY3Rpdml0eSdzIGFkYXB0ZXIgbGlzdCBmaXJzdAotCQkvLyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gKElEaWFncmFtQ2hhbmdlTGlzdGVuZXIpCi0JCS8vIFVtYVV0aWwuZ2V0QWRhcHRlcihlLCBkaWFncmFtTGlzdGVuZXJUeXBlKTsKLQkJLy8gaWYobGlzdGVuZXIgIT0gbnVsbCkgewotCQkvLyBkaWFncmFtID0gbGlzdGVuZXIuZ2V0RGlhZ3JhbSgpLmdldFVNQURpYWdyYW0oKTsKLQkJLy8gaWYoZGlhZ3JhbSAhPSBudWxsKSByZXR1cm4gZGlhZ3JhbTsKLQkJLy8gfQotCi0JCU9iamVjdCBjb250YWluZXIgPSBlLmVDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcjsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgaXRlci5uZXh0KCk7Ci0JCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBtb2RlbEJyaWRnZSA9IGRpYWdyYW0uZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCWlmIChtb2RlbEJyaWRnZSAhPSBudWxsCi0JCQkJCQkmJiBtb2RlbEJyaWRnZSBpbnN0YW5jZW9mIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkJCQkJCSYmIGUgPT0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJLmdldEVsZW1lbnQoKQotCQkJCQkJJiYgZGlhZ3JhbVByZXNlbnRhdGlvbnNbZGlhZ3JhbVR5cGVdCi0JCQkJCQkJCS5lcXVhbHMoKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBtb2RlbEJyaWRnZSkKLQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpKSB7Ci0JCQkJCXJldHVybiBkaWFncmFtOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjcmVhdGUpIHsKLQkJCS8vIGNvdWxkIG5vdCBmaW5kIGl0LCBjcmVhdGUgbmV3IG9uZQotCQkJLy8KLQkJCWRpYWdyYW0gPSBjcmVhdGVEaWFncmFtKGUsIGRpYWdyYW1UeXBlKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0RGlhZ3JhbXMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGlhZ3JhbTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBwdWJsaWMgRGlhZ3JhbSBnZXRVTUFEaWFncmFtKEFjdGl2aXR5IGFjdCwgaW50IGRpYWdyYW1UeXBlKSB7Ci0JLy8gRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkvLyAgICAgICAgCi0JLy8gLy8gbG9vayBmb3IgSURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBpbiBhY3Rpdml0eSdzIGFkYXB0ZXIgbGlzdCBmaXJzdAotCS8vIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBnZXREaWFncmFtQ2hhbmdlTGlzdGVuZXIoYWN0LAotCS8vIGRpYWdyYW1UeXBlKTsKLQkvLyBpZihsaXN0ZW5lciAhPSBudWxsKSB7Ci0JLy8gZGlhZ3JhbSA9IGxpc3RlbmVyLmdldERpYWdyYW0oKS5nZXRVTUFEaWFncmFtKCk7Ci0JLy8gaWYoZGlhZ3JhbSAhPSBudWxsKSByZXR1cm4gZGlhZ3JhbTsKLQkvLyB9Ci0JLy8gT2JqZWN0IGNvbnRhaW5lciA9IGFjdC5lQ29udGFpbmVyKCk7Ci0JLy8gaWYoY29udGFpbmVyICE9IG51bGwpIHsKLQkvLyBQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcjsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0RGlhZ3JhbXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCS8vIFNlbWFudGljTW9kZWxCcmlkZ2UgbW9kZWxCcmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkvLyBpZihtb2RlbEJyaWRnZSAhPSBudWxsICYmIG1vZGVsQnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCS8vICYmIGFjdCA9PSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpbW9kZWxCcmlkZ2UpLmdldEVsZW1lbnQoKQotCS8vICYmCi0JLy8gZGlhZ3JhbVByZXNlbnRhdGlvbnNbZGlhZ3JhbVR5cGVdLmVxdWFscygoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpbW9kZWxCcmlkZ2UpLmdldFByZXNlbnRhdGlvbigpKSkKLQkvLyB7Ci0JLy8gcmV0dXJuIGRpYWdyYW07Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gICAgICAgIAotCS8vIC8vIGNvdWxkIG5vdCBmaW5kIGl0LCBjcmVhdGUgbmV3IG9uZQotCS8vIC8vCi0JLy8gcmV0dXJuIGNyZWF0ZURpYWdyYW0oYWN0LCBkaWFncmFtVHlwZSk7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdCwKLQkJCWludCBkaWFncmFtVHlwZSkgewotCQlJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gZ2V0RGlhZ3JhbUNoYW5nZUxpc3RlbmVyKGFjdCwKLQkJCQlkaWFncmFtVHlwZSk7Ci0JCXJldHVybiBsaXN0ZW5lciA9PSBudWxsID8gbnVsbCA6IGxpc3RlbmVyLmdldERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGxpc3Qgb2YgY29tbWFuZCBsaXN0ZW5lcnMgdGhhdCB3aWxsIGhhbmRsZSB0aGUgZGlhZ3JhbSByZWxhdGVkIGNoYW5nZXMgb2YgdGhlIGNvbW1hbmRzIG9mIGludGVyZXNzZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSBJQ29tbWFuZExpc3RlbmVyCi0JICovCi0JcHVibGljIExpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4gZ2V0Q29tbWFuZExpc3RlbmVycygpIHsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJY29tbWFuZExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4oKTsKLQkJfQotCi0JCWNvbW1hbmRMaXN0ZW5lcnMuYWRkKG5ldyBJQ29tbWFuZExpc3RlbmVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkvLyBnZXQgY29udHJpYnV0b3IvcmVwbGFjZXIgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJLy8KLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGNvbW1hbmQuZ2V0UmVzdWx0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IHBhcmVudEFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0VU1BRGlhZ3JhbShwYXJlbnRBY3QsCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgYmFzZSBhbmQgbGluayBpdCB0byB0aGUKLQkJCQkJCS8vIGNvbnRyaWJ1dG9yZS9yZXBsYWNlciBvZiB0aGUgYWN0aXZpdHkKLQkJCQkJCS8vCi0JCQkJCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gZmluZEdyYXBoTm9kZShkaWFncmFtLCBiYXNlKTsKLQkJCQkJCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJCQlpZiAoYnJpZGdlLmdldEVsZW1lbnQoKSAhPSBhY3QpIHsKLQkJCQkJCQkJYnJpZGdlLnNldEVsZW1lbnQoYWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmKGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJCQkvLyBjb3B5IGRpYWdyYW1zIGFuZCB0aGVpciBwdWJsaXNoaW5nIG9wdGlvbnMKLQkJCQkJCS8vCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IEdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9UWVBFUy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWludCBkaWFncmFtVHlwZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuRElBR1JBTV9UWVBFU1tpXTsKLQkJCQkJCQlkaWFncmFtID0gZ2V0VU1BRGlhZ3JhbShiYXNlLCBkaWFncmFtVHlwZSwgZmFsc2UpOwotCQkJCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJRGlhZ3JhbSBjb3B5ID0gZ2V0VU1BRGlhZ3JhbShhY3QsIGRpYWdyYW1UeXBlLCB0cnVlKTsKLQkJCQkJCQkJY29weS5zZXRTdXBwcmVzc2VkKGRpYWdyYW0uZ2V0U3VwcHJlc3NlZCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDbGFzcyBnZXRDb21tYW5kVHlwZSgpIHsKLQkJCQlyZXR1cm4gVmFyeUFjdGl2aXR5Q29tbWFuZC5jbGFzczsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHJlVW5kbyhDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkvLyBnZXQgb2xkIGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBjb21tYW5kLmdldFJlc3VsdCgpLml0ZXJhdG9yKCkubmV4dCgpOwotLy8JCQkJVmFyeUFjdGl2aXR5Q29tbWFuZCBjbWQgPSAoVmFyeUFjdGl2aXR5Q29tbWFuZCkgY29tbWFuZDsKLS8vCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBjbWQuZ2V0V3JhcHBlcigpOwotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlQWN0ID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZUFjdCAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IHBhcmVudEFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0VU1BRGlhZ3JhbShwYXJlbnRBY3QsCi0JCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNLCBmYWxzZSk7Ci0JCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgdGhlIG9sZCBjb250cmlidXRvcmUvcmVwbGFjZXIKLQkJCQkJCS8vIG9sZCBhbmQgcmVsaW5rIGl0IHRvIHRoZSBiYXNlIGFjdGl2aXR5Ci0JCQkJCQkvLwotCQkJCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IGZpbmRHcmFwaE5vZGUoZGlhZ3JhbSwgYWN0KTsKLQkJCQkJCWlmIChncmFwaE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgYnJpZGdlID0gKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIGdyYXBoTm9kZQotCQkJCQkJCQkJLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCQkJCQlpZiAoYnJpZGdlLmdldEVsZW1lbnQoKSAhPSBiYXNlQWN0KSB7Ci0JCQkJCQkJCWJyaWRnZS5zZXRFbGVtZW50KGJhc2VBY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCQkKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcG9zdFVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCQotCQkJfQotCi0JCX0pOwotCi0JCXJldHVybiBjb21tYW5kTGlzdGVuZXJzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGVhNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIERpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIGZvciBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eURldGFpbERpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzCi0JCUlEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlEaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJhZGMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotLyoqCi0gKiBEaWFncmFtIGNoYW5nZSBsaXN0ZW5lciBmb3IgYWN0aXZpdHkgZGlhZ3JhbQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eURpYWdyYW1DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElEaWFncmFtQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWN0aXZpdHlOb2RlQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWNjZTMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotLyoqCi0gKiBOb2RlIGNoYW5nZSBsaXN0ZW5lciBmb3IgYWN0aXZpdHkgbm9kZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpdml0eU5vZGVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIElOb2RlQ2hhbmdlTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWIwOTRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lBZGFwdGVyRmFjdG9yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIEZpbHRlciB0aGF0IHByb3ZpZGVzIGFkYXB0ZXIgZmFjdG9yaWVzIGZvciBkaWZmZXJlbnQgdmlld3Mgb2YgcHJvY2VzcwotICogYnJlYWtkb3duIHN0cnVjdHVyZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWRhcHRlckZhY3RvcnlGaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyLCBJQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JRGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTg5YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSURpYWdyYW1DaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLQotLyoqCi0gKiBBZGFwdGVyIHRvIGxpc3RlbiB0byBkaWFncmFtIGNoYW5nZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgQWRhcHRlciB7Ci0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JTm9kZUNoYW5nZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JTm9kZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ODBkMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvSU5vZGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotLyoqCi0gKiBBZGFwdGVyIHRvIGxpc3RlbiB0byBjaGFuZ2VzIGluIGRpYWdyYW0gbm9kZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOb2RlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVyIHsKLQlOb2RlIGdldE5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL0lXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2MDJlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9JV1BERGlhZ3JhbUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi0vKioKLSAqIERpYWdyYW0gY2hhbmdlIGxpc3RlbmVyIGZvciB3b3JrIHByb2R1Y3QgZGVwZW5kZW5jeSBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXUEREaWFncmFtQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBJRGlhZ3JhbUNoYW5nZUxpc3RlbmVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg0ZDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBNb2RlbFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBNb2RlbEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgQE92ZXJyaWRlCi0JCQkJcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdClvYmplY3QpLmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gbW9kZWxQYWNrYWdlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3dpdGNoIHRoZSBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgTW9kZWxTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQotCQluZXcgTW9kZWxTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaWFncmFtKERpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMaW5rKExpbmsgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUxpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMaW5rZWRPYmplY3QoTGlua2VkT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVMaW5rZWRPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lZE5vZGUoTmFtZWROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOYW1lZE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOb2RlKE5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eURpYWdyYW0oQWN0aXZpdHlEaWFncmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eURpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUeXBlZE5vZGUoVHlwZWROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUeXBlZE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdE5vZGUoV29ya1Byb2R1Y3ROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eURldGFpbERpYWdyYW0oQWN0aXZpdHlEZXRhaWxEaWFncmFtIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBY3Rpdml0eURldGFpbERpYWdyYW1BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOb2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU5vZGVDb250YWluZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlTm9kZShSb2xlTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZU5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlVGFza0NvbXBvc2l0ZShSb2xlVGFza0NvbXBvc2l0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZVRhc2tDb21wb3NpdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrTm9kZShUYXNrTm9kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza05vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUoV29ya0JyZWFrZG93bkVsZW1lbnROb2RlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdENvbXBvc2l0ZShXb3JrUHJvZHVjdENvbXBvc2l0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RDb21wb3NpdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0gICAgICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rZWRPYmplY3QgPGVtPkxpbmtlZCBPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxpbmtlZE9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlIDxlbT5OYW1lZCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUgPGVtPk5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURpYWdyYW0gPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVHlwZWROb2RlIDxlbT5UeXBlZCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgQWRhcHRlciBjcmVhdGVUeXBlZE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGUgPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSA8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lciA8ZW0+Tm9kZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOb2RlQ29udGFpbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlTm9kZSA8ZW0+Um9sZSBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVOb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZSA8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Sb2xlVGFza0NvbXBvc2l0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlVGFza0NvbXBvc2l0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuVGFza05vZGUgPGVtPlRhc2sgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5UYXNrTm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtCcmVha2Rvd25FbGVtZW50Tm9kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudE5vZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlIDxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0Q29tcG9zaXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL01vZGVsQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmU4OGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEZXRhaWxEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkFjdGl2aXR5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5OYW1lZE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlRhc2tOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrQnJlYWtkb3duRWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3RDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTd2l0Y2g8VD4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgTW9kZWxQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgTW9kZWxTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKGVTdXBlclR5cGVzLmdldCgwKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgewotCQkJY2FzZSBNb2RlbFBhY2thZ2UuRElBR1JBTTogewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IChEaWFncmFtKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGlhZ3JhbShkaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKGRpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUoZGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KGRpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTks6IHsKLQkJCQlMaW5rIGxpbmsgPSAoTGluayl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUxpbmsobGluayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KGxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLkxJTktFRF9PQkpFQ1Q6IHsKLQkJCQlMaW5rZWRPYmplY3QgbGlua2VkT2JqZWN0ID0gKExpbmtlZE9iamVjdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChsaW5rZWRPYmplY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk5BTUVEX05PREU6IHsKLQkJCQlOYW1lZE5vZGUgbmFtZWROb2RlID0gKE5hbWVkTm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU5hbWVkTm9kZShuYW1lZE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUobmFtZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QobmFtZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5OT0RFOiB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VOb2RlKG5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdChub2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ESUFHUkFNOiB7Ci0JCQkJQWN0aXZpdHlEaWFncmFtIGFjdGl2aXR5RGlhZ3JhbSA9IChBY3Rpdml0eURpYWdyYW0pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURpYWdyYW0oYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaWFncmFtKGFjdGl2aXR5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcihhY3Rpdml0eURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3QoYWN0aXZpdHlEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFOiB7Ci0JCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUeXBlZE5vZGUodHlwZWROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHR5cGVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHR5cGVkTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTTogewotCQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gd29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSA9IChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEaWFncmFtKHdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIod29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh3b3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qod29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuV09SS19QUk9EVUNUX05PREU6IHsKLQkJCQlXb3JrUHJvZHVjdE5vZGUgd29ya1Byb2R1Y3ROb2RlID0gKFdvcmtQcm9kdWN0Tm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0Tm9kZSh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkTm9kZSh3b3JrUHJvZHVjdE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUod29ya1Byb2R1Y3ROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qod29ya1Byb2R1Y3ROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTTogewotCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSBhY3Rpdml0eURldGFpbERpYWdyYW0gPSAoQWN0aXZpdHlEZXRhaWxEaWFncmFtKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXRhaWxEaWFncmFtKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGlhZ3JhbShhY3Rpdml0eURldGFpbERpYWdyYW0pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIoYWN0aXZpdHlEZXRhaWxEaWFncmFtKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KGFjdGl2aXR5RGV0YWlsRGlhZ3JhbSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuTk9ERV9DT05UQUlORVI6IHsKLQkJCQlOb2RlQ29udGFpbmVyIG5vZGVDb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU5vZGVDb250YWluZXIobm9kZUNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZShub2RlQ29udGFpbmVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qobm9kZUNvbnRhaW5lcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNb2RlbFBhY2thZ2UuUk9MRV9OT0RFOiB7Ci0JCQkJUm9sZU5vZGUgcm9sZU5vZGUgPSAoUm9sZU5vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlTm9kZShyb2xlTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWROb2RlKHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHJvbGVOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qocm9sZU5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlJPTEVfVEFTS19DT01QT1NJVEU6IHsKLQkJCQlSb2xlVGFza0NvbXBvc2l0ZSByb2xlVGFza0NvbXBvc2l0ZSA9IChSb2xlVGFza0NvbXBvc2l0ZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVUYXNrQ29tcG9zaXRlKHJvbGVUYXNrQ29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlQ29udGFpbmVyKHJvbGVUYXNrQ29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHJvbGVUYXNrQ29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qocm9sZVRhc2tDb21wb3NpdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTW9kZWxQYWNrYWdlLlRBU0tfTk9ERTogewotCQkJCVRhc2tOb2RlIHRhc2tOb2RlID0gKFRhc2tOb2RlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVGFza05vZGUodGFza05vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkTm9kZSh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh0YXNrTm9kZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHRhc2tOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFOiB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSB3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkTm9kZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOb2RlKHdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUxpbmtlZE9iamVjdCh3b3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU6IHsKLQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgd29ya0JyZWFrZG93bkVsZW1lbnROb2RlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZSh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkTm9kZSh3b3JrQnJlYWtkb3duRWxlbWVudE5vZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5vZGUod29ya0JyZWFrZG93bkVsZW1lbnROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMaW5rZWRPYmplY3Qod29ya0JyZWFrZG93bkVsZW1lbnROb2RlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX1BST0RVQ1RfQ09NUE9TSVRFOiB7Ci0JCQkJV29ya1Byb2R1Y3RDb21wb3NpdGUgd29ya1Byb2R1Y3RDb21wb3NpdGUgPSAoV29ya1Byb2R1Y3RDb21wb3NpdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdENvbXBvc2l0ZSh3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZUNvbnRhaW5lcih3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTm9kZSh3b3JrUHJvZHVjdENvbXBvc2l0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTGlua2VkT2JqZWN0KHdvcmtQcm9kdWN0Q29tcG9zaXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlkZWZhdWx0OiByZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TGluazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VMaW5rKExpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxpbmtlZCBPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MaW5rZWQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgVCBjYXNlTGlua2VkT2JqZWN0KExpbmtlZE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TmFtZWQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VOYW1lZE5vZGUoTmFtZWROb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ob2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZU5vZGUoTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotICAgICAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERpYWdyYW08L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBUIGNhc2VBY3Rpdml0eURpYWdyYW0oQWN0aXZpdHlEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlZCBOb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZWQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgY2FzZVR5cGVkTm9kZShUeXBlZE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbShXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBOb2RlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3ROb2RlKFdvcmtQcm9kdWN0Tm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGV0YWlsIERpYWdyYW08L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbShBY3Rpdml0eURldGFpbERpYWdyYW0gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5vZGUgQ29udGFpbmVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Tm9kZSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VOb2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVOb2RlKFJvbGVOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFRhc2sgQ29tcG9zaXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBUYXNrIENvbXBvc2l0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVUYXNrQ29tcG9zaXRlKFJvbGVUYXNrQ29tcG9zaXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrTm9kZShUYXNrTm9kZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3IgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKFdvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQgTm9kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50Tm9kZShXb3JrQnJlYWtkb3duRWxlbWVudE5vZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBDb21wb3NpdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgQ29tcG9zaXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3RDb21wb3NpdGUoV29ya1Byb2R1Y3RDb21wb3NpdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLSAgICAgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTW9kZWxTd2l0Y2gKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL1R4VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvVHhVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjlhOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL21vZGVsL3V0aWwvVHhVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkNvbW1vblBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHhVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwIERFRkFVTFRfVFhfT1BUSU9OUyA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0Jc3RhdGljIHsKLQkJVHhVdGlsLkRFRkFVTFRfVFhfT1BUSU9OUy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX1VOUFJPVEVDVEVELCBCb29sZWFuLlRSVUUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBydW5JblRyYW5zYWN0aW9uKEVPYmplY3Qgb2JqZWN0VG9Nb2RpZnksCi0JCQlSdW5uYWJsZSBtb2RpZnlPcGVyYXRpb24pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBudWxsOwotCQl0cnkgewotCQkJZG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4ob2JqZWN0VG9Nb2RpZnkpOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQkJCi0JCWlmIChkb21haW4gPT0gbnVsbCkgewotCQkJbW9kaWZ5T3BlcmF0aW9uLnJ1bigpOwotCQl9IGVsc2UgewotCQkJcnVuSW5UcmFuc2FjdGlvbihkb21haW4sIG1vZGlmeU9wZXJhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJ1bkluVHJhbnNhY3Rpb24oVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJZmluYWwgUnVubmFibGUgbW9kaWZ5T3BlcmF0aW9uKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKGRvbWFpbiwgIiIsIERFRkFVTFRfVFhfT1BUSU9OUykgeyAvLyROT04tTkxTLTEkCi0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQltb2RpZnlPcGVyYXRpb24ucnVuKCk7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0KLQkJfS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS9tb2RlbC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3YzhhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIGFjdGl2aXR5IGRpYWdyYW0gbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkMWUzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDgwNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYjJmYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYTA1NGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERpYWdyYW0gVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NhOTNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9EaWFncmFtVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9EaWFncmFtVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyZmFiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvRGlhZ3JhbVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aSI7ICAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbVVJUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVVJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvYWN0aW9ucy9DdXN0b21BcnJhbmdlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvYWN0aW9ucy9DdXN0b21BcnJhbmdlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZWZkY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL2FjdGlvbnMvQ3VzdG9tQXJyYW5nZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuYWN0aW9ucy5pbnRlcm5hbC5BcnJhbmdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbUVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUFycmFuZ2VBY3Rpb24gZXh0ZW5kcyBBcnJhbmdlQWN0aW9uIHsKLQotCQotCXByaXZhdGUgRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydDsKLQlwcml2YXRlIEdyYXBoaWNhbFZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd29ya2JlbmNoUGFnZQotCSAqIEBwYXJhbSBzZWxlY3Rpb25Pbmx5Ci0JICovCi0JcHVibGljIEN1c3RvbUFycmFuZ2VBY3Rpb24oSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSwKLQkJCWJvb2xlYW4gc2VsZWN0aW9uT25seSwgRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCwgR3JhcGhpY2FsVmlld2VyIHZpZXdlcikgewotCQlzdXBlcih3b3JrYmVuY2hQYWdlLCBzZWxlY3Rpb25Pbmx5KTsKLQkJdGhpcy5kaWFncmFtRWRpdFBhcnQgPSBkaWFncmFtRWRpdFBhcnQ7Ci0JCXRoaXMudmlld2VyID0gdmlld2VyOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZWxlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBkaWFncmFtRWRpdFBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWdyYW1FZGl0UGFydCBnZXREaWFncmFtRWRpdFBhcnQoKSB7Ci0JCXJldHVybiBkaWFncmFtRWRpdFBhcnQ7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFncmFtQ29tbWFuZFN0YWNrIGdldERpYWdyYW1Db21tYW5kU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgRGlhZ3JhbUNvbW1hbmRTdGFjaygoSURpYWdyYW1FZGl0RG9tYWluKXZpZXdlci5nZXRFZGl0RG9tYWluKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MjRmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtRWRpdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BRERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRpYWdyYW1PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBkaWFncmFtIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRvckhlbHBlciB7Ci0JcHJpdmF0ZSBNYXA8UHJvY2VzcywgRGlhZ3JhbU1hbmFnZXI+IHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwID0gbmV3IEhhc2hNYXA8UHJvY2VzcywgRGlhZ3JhbU1hbmFnZXI+KCk7Ci0JCi0JcHVibGljIERpYWdyYW1FZGl0b3JIZWxwZXIoKSB7Ci0JfQotCQotCXB1YmxpYyBEaWFncmFtTWFuYWdlciBnZXREaWFncmFtTWFuYWdlcihQcm9jZXNzIHByb2MpIHsKLQkJRGlhZ3JhbU1hbmFnZXIgbWdyID0gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZ2V0KHByb2MpOwotCQlpZihtZ3IgIT0gbnVsbCAmJiBtZ3IuaXNEaXNwb3NlZCgpKSB7Ci0JCQlwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5yZW1vdmUocHJvYyk7Ci0JCQltZ3IgPSBudWxsOwotCQl9Ci0JCWlmKG1nciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHByb2Nlc3NUb0RpYWdyYW1NYW5hZ2VyTWFwKSB7Ci0JCQkJbWdyID0gcHJvY2Vzc1RvRGlhZ3JhbU1hbmFnZXJNYXAuZ2V0KHByb2MpOwotCQkJCWlmKG1nciA9PSBudWxsKSB7Ci0JCQkJCW1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKHByb2MsIHRoaXMpOwotCQkJCQlwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC5wdXQocHJvYywgbWdyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ncjsKLQl9CQotCQotCXB1YmxpYyB2b2lkIG9wZW5EaWFncmFtKElFZGl0b3JQYXJ0IHBhcnQsIGludCBkaWFncmFtVHlwZSwgT2JqZWN0IHNlbGVjdGVkT2JqZWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQl0cnkgewotCQkJRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5EaWFncmFtRWRpdG9ySW5wdXQoCi0JCQkJCXNlbGVjdGVkT2JqZWN0LCBzdXBwcmVzc2lvbiwgZGlhZ3JhbVR5cGUpOwotCQkJRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW1FZGl0b3IocGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLCBpbnB1dCwgZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludChkaWFncmFtVHlwZSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkJCQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgdHlwZSkgewotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCQlEaWFncmFtTWFuYWdlciBkTWdyID0gZ2V0RGlhZ3JhbU1hbmFnZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KSk7Ci0JCWlmIChkTWdyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJTGlzdDxEaWFncmFtPiBsaXN0ID0gZE1nci5nZXREaWFncmFtcyhhY3Rpdml0eSwgdHlwZSk7Ci0JCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQlkaWFncmFtID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCSJDb3JlIGVycm9yIHJldHJpZXZpbmcgYSBkaWFncmFtIGluIHByb2Nlc3MgZWRpdG9yOiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9IAotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldERpYWdyYW1zKEFjdGl2aXR5IGFjdCkgewotCi0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IGdldERpYWdyYW1NYW5hZ2VyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpKTsKLQkJdHJ5ewotCQkJQXJyYXlMaXN0PERpYWdyYW0+IGRpYWdyYW1zID0gbmV3IEFycmF5TGlzdDxEaWFncmFtPigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBEaWFncmFtSGVscGVyLkRJQUdSQU1fVFlQRVMubGVuZ3RoOyBpKyspIHsKLQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBEaWFncmFtSGVscGVyLkRJQUdSQU1fVFlQRVNbaV0pOwotCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJZGlhZ3JhbXMuYWRkQWxsKGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBkaWFncmFtczsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXsKLQkJZm9yIChEaWFncmFtTWFuYWdlciBtZ3IgOiBwcm9jZXNzVG9EaWFncmFtTWFuYWdlck1hcC52YWx1ZXMoKSkgewotCQkJdHJ5IHsKLQkJCQltZ3IucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCS8vCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGlhZ3JhbVR5cGUoRGlhZ3JhbSBkaWFncmFtKXsKLQkJcmV0dXJuIERpYWdyYW1IZWxwZXIuZ2V0RGlhZ3JhbVR5cGUoZGlhZ3JhbSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1UeXBlU3RyaW5nKERpYWdyYW0gZGlhZ3JhbSl7Ci0JCXJldHVybiBEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlU3RyaW5nKGRpYWdyYW0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzSGludCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGludCBkaWFncmFtVHlwZSkgewotCQlzd2l0Y2goZGlhZ3JhbVR5cGUpIHsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLQkJCXJldHVybiBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDbG9zZSBkaWFncmFtIGVkaXRvcnMKLQkgKiAKLQkgKiBAcGFyYW0gY2xvc2VFbGVtZW50Ci0JICogQHBhcmFtIGNsb3NlRWRpdG9yUmVmcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZURpYWdyYW1FZGl0b3JzKE9iamVjdCBjbG9zZUVsZW1lbnQsIAotCQkJamF2YS51dGlsLkxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gY2xvc2VkRWRpdG9yUmVmcykgewotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCS5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmKHdvcmtiZW5jaFBhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZlcmVuY2VzID0gd29ya2JlbmNoUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWlmKGNsb3NlZEVkaXRvclJlZnMgPT0gbnVsbCkgewotCQkJY2xvc2VkRWRpdG9yUmVmcyA9IG5ldyBBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4oKTsKLQkJfQotCQlBcnJheUxpc3Q8SUVkaXRvclJlZmVyZW5jZT4gY2xvc2VFZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpewotCQkJCQkJCS8vIGNsb3NlIHRoZSBwYXJlbnQgZWRpdG9yIHRvbywgaWYgb3BlbmVkLgotCQkJCQkJCU9iamVjdCBwYXJlbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWVsZW1lbnQpLmdldFBhcmVudChlbGVtZW50KTsKLQkJCQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQkJCQkJCWlmKGVsZW1lbnQuZXF1YWxzKGNsb3NlRWxlbWVudCkpCi0JCQkJCQkJCQljbG9zZURpYWdyYW1FZGl0b3JzKHBhcmVudCwgY2xvc2VkRWRpdG9yUmVmcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRNZXRob2RFbGVtZW50KCk7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJaWYgKGVsZW1lbnQuZXF1YWxzKGNsb3NlRWxlbWVudCkpIHsKLQkJCQkJCWNsb3NlRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNoZWNrIHdoZXRoZXIgZWxlbWVudCBpcyBjaGlsZCBvZiBjbG9zZUVsZW1lbnQKLQkJCQkJCS8vIGRpcmVjdGx5L2luZGlyZWN0bHkKLQkJCQkJCWlmIChjbG9zZUVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlQcm9jZXNzVXRpbC5nZXRDaGlsZEVsZW1lbnRzKAotCQkJCQkJCQkJKEFjdGl2aXR5KSBjbG9zZUVsZW1lbnQsIEFjdGl2aXR5LmNsYXNzLAotCQkJCQkJCQkJY29sbGVjdGlvbik7Ci0JCQkJCQkJaWYgKGNvbGxlY3Rpb24uY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJCQkJY2xvc2VFZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgc2l6ZSA9IGNsb3NlRWRpdG9yUmVmcy5zaXplKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IElFZGl0b3JSZWZlcmVuY2Vbc2l6ZV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VzW2ldID0gKElFZGl0b3JSZWZlcmVuY2UpIGNsb3NlRWRpdG9yUmVmcy5nZXQoaSk7Ci0JCX0KLQkJd29ya2JlbmNoUGFnZS5jbG9zZUVkaXRvcnMocmVmZXJlbmNlcywgZmFsc2UpOwotCQlyZWZlcmVuY2VzID0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogRGlhZ3JhbSBlZGl0b3JzIG9mIG9iamVjdCBpdHNlbGYgd2lsbCBiZSBjbG9zZWQuIEFuZCBQYXJlbnQgZGlhZ3JhbQotCSAqIGVkaXRvcnMgd2lsbCBiZSByZWZyZXNoZWQuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hQYXJlbnREaWFncmFtRWRpdG9ycyhPYmplY3QgcmVmcmVzaEVsZW1lbnQsCi0JCQlqYXZhLnV0aWwuTGlzdDxJRWRpdG9yUmVmZXJlbmNlPiBvcGVuRWRpdG9yUmVmcywgYm9vbGVhbiBwYXJlbnRSZWZyZXNoKSB7Ci0JCW9wZW5FZGl0b3JSZWZzID0gbmV3IEFycmF5TGlzdDxJRWRpdG9yUmVmZXJlbmNlPigpOwotCQkvLyBOb3cgcmVmcmVzaCBvYmplY3QncyBwYXJlbnQncyBkaWFncmFtcy4KLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IERpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmZXJlbmNlcyA9IHdvcmtiZW5jaFBhZ2UKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gZWRpdG9yUmVmZXJlbmNlc1tpXTsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHJlZmVyZW5jZS5nZXRFZGl0b3IodHJ1ZSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIHsKLQkJCQkJRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9ICgoRGlhZ3JhbUVkaXRvcklucHV0UHJveHkpIGlucHV0KQotCQkJCQkJCS5nZXREaWFncmFtRWRpdG9ySW5wdXQoKTsKLQkJCQkJaWYgKGRpYWdyYW1JbnB1dC5nZXRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCQkJZWxlbWVudCA9IGRpYWdyYW1JbnB1dC5nZXRXcmFwcGVyKCk7Ci0JCQkJCQlpZihwYXJlbnRSZWZyZXNoKXsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJT2JqZWN0IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0UGFyZW50KG51bGwpOwotCQkJCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCQlpZiAoZWxlbWVudC5lcXVhbHMocmVmcmVzaEVsZW1lbnQpKQotCQkJCQkJCQkJcmVmcmVzaFBhcmVudERpYWdyYW1FZGl0b3JzKHBhcmVudCwKLQkJCQkJCQkJCQkJb3BlbkVkaXRvclJlZnMsIHBhcmVudFJlZnJlc2gpOwotCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllbGVtZW50ID0gZGlhZ3JhbUlucHV0LmdldE1ldGhvZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWlmKCFwYXJlbnRSZWZyZXNoKXsKLQkJCQkJCQlpZihlbGVtZW50ID09IHJlZnJlc2hFbGVtZW50KXsKLQkJCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKCgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJCQkJLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSkKLQkJCQkJCQlvcGVuRWRpdG9yUmVmcy5hZGQocmVmZXJlbmNlKTsKLQkJCQkJCWVsc2UgaWYgKHJlZnJlc2hFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlPYmplY3QgbG9jYWxSZWZyZXNoRWxlbWVudCA9IHJlZnJlc2hFbGVtZW50OwotCQkJCQkJCXdoaWxlICgobG9jYWxSZWZyZXNoRWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCQkJCQkJCQkJJiYgKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgbG9jYWxSZWZyZXNoRWxlbWVudCkKLQkJCQkJCQkJCQkJLmdldE93bmVyKCkgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgbG9jYWxSZWZyZXNoRWxlbWVudCkKLQkJCQkJCQkJCQkuZ2V0T3duZXIoKS5lcXVhbHMoZWxlbWVudCkpIHsKLQkJCQkJCQkJCW9wZW5FZGl0b3JSZWZzLmFkZChyZWZlcmVuY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWxvY2FsUmVmcmVzaEVsZW1lbnQgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBsb2NhbFJlZnJlc2hFbGVtZW50KQotCQkJCQkJCQkJCS5nZXRPd25lcigpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmKCgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKXsKLQkJCQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQkJCQlpZiAoKChBY3Rpdml0eSkgYmFzZSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkJLmNvbnRhaW5zKHJlZnJlc2hFbGVtZW50KSkKLQkJCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGMgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KQotCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQkJCQlpZiAoYyAhPSBudWxsICYmIGMuY29udGFpbnMocmVmcmVzaEVsZW1lbnQpKSB7Ci0JCQkJCQkJb3BlbkVkaXRvclJlZnMuYWRkKHJlZmVyZW5jZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgc2l6ZSA9IG9wZW5FZGl0b3JSZWZzLnNpemUoKTsKLQkJLy8gSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgSUVkaXRvclJlZmVyZW5jZVtzaXplXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlFZGl0b3JSZWZlcmVuY2UgcmVmZXJlbmNlID0gKElFZGl0b3JSZWZlcmVuY2UpIG9wZW5FZGl0b3JSZWZzCi0JCQkJCS5nZXQoaSk7Ci0JCQlJRWRpdG9yUGFydCBlZGl0b3IgPSByZWZlcmVuY2UuZ2V0RWRpdG9yKHRydWUpOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgewotCQkJCSgoQWJzdHJhY3REaWFncmFtRWRpdG9yKSBlZGl0b3IpLnJlZnJlc2hEaWFncmFtKCk7Ci0JCQkJaWYoZWRpdG9yIGluc3RhbmNlb2YgQUREaWFncmFtRWRpdG9yKXsKLQkJCQkJKChBRERpYWdyYW1FZGl0b3IpZWRpdG9yKS5ydW5SZXNldExheW91dEFjdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGxpc3Qgb2YgY29tbWFuZCBsaXN0ZW5lcnMgdGhhdCB3aWxsIGhhbmRsZSB0aGUgZGlhZ3JhbSByZWxhdGVkIGNoYW5nZXMgb2YgdGhlIGNvbW1hbmRzIG9mIGludGVyZXNzZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQHNlZSBJQ29tbWFuZExpc3RlbmVyCi0JICovCi0vLwlwdWJsaWMgc3RhdGljIExpc3Q8SUNvbW1hbmRMaXN0ZW5lcj4gZ2V0Q29tbWFuZExpc3RlbmVycygpIHsKLS8vCQlpZiAoY29tbWFuZExpc3RlbmVycyA9PSBudWxsKSB7Ci0vLwkJCWNvbW1hbmRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElDb21tYW5kTGlzdGVuZXI+KCk7Ci0vLwkJfQotLy8KLS8vCQljb21tYW5kTGlzdGVuZXJzLmFkZChuZXcgSUNvbW1hbmRMaXN0ZW5lcigpIHsKLS8vCQkJCi0vLwkJCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCkgewotLy8JCQkJLy8gZ2V0IGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotLy8JCQkJLy8KLS8vCQkJCWlmKHRydWUpIHJldHVybjsKLS8vCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLS8vCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpIGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwkJCQlEaWFncmFtTWFuYWdlciBkTWdyID0gbnVsbDsKLS8vCQkJCURpYWdyYW1NYW5hZ2VyIGJhc2VNZ3IgPSBudWxsOwotLy8JCQkJdHJ5IHsKLS8vCQkJCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0vLwkJCQkJCUFjdGl2aXR5IHBhcmVudEFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLS8vCQkJCQkJZE1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwKLS8vCQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhwYXJlbnRBY3QpKTsKLS8vCQkJCQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLS8vCQkJCQkJTGlzdDxEaWFncmFtPiBkaWFncmFtcyA9IGRNZ3IuZ2V0RGlhZ3JhbXMocGFyZW50QWN0LAotLy8JCQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNKTsKLS8vCQkJCQkJaWYgKCFkaWFncmFtcy5pc0VtcHR5KCkpIHsKLS8vCQkJCQkJCWRpYWdyYW0gPSBkaWFncmFtcy5nZXQoMCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotLy8JCQkJCQkJLy8gZmluZCBleGlzdGluZyBub2RlIGZvciBiYXNlIGFuZCBsaW5rIGl0IHRvIHRoZQotLy8JCQkJCQkJLy8gY29udHJpYnV0b3JlL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotLy8JCQkJCQkJTm9kZSBub2RlID0gZmluZE5vZGUoZGlhZ3JhbSwgYmFzZSk7Ci0vLwkJCQkJCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IEJyaWRnZUhlbHBlcgotLy8JCQkJCQkJCQkJLmdldE5vZGVBZGFwdGVyKG5vZGUuZ2V0RWxlbWVudCgpKTsKLS8vCQkJCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsCi0vLwkJCQkJCQkJCQkmJiBhZGFwdGVyLmdldEVsZW1lbnQoKSAhPSBhY3QpIHsKLS8vCQkJCQkJCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSgoRU1vZGVsRWxlbWVudCkgbm9kZQotLy8JCQkJCQkJCQkJCS5nZXRFbGVtZW50KCksIGFjdCk7Ci0vLwkJCQkJCQkJCUJyaWRnZUhlbHBlcgotLy8JCQkJCQkJCQkJCS51bm1hcmtJbkhlcml0ZWQoKEVNb2RlbEVsZW1lbnQpIG5vZGUKLS8vCQkJCQkJCQkJCQkJCS5nZXRFbGVtZW50KCkpOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCQlpZiAoYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT05fTElURVJBTCkgewotLy8JCQkJCQkJLy8gY29weSBkaWFncmFtcyBhbmQgdGhlaXIgcHVibGlzaGluZyBvcHRpb25zCi0vLwkJCQkJCQliYXNlTWdyID0gRGlhZ3JhbU1hbmFnZXIKLS8vCQkJCQkJCQkJLmdldEluc3RhbmNlKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKSk7Ci0vLwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IERpYWdyYW1IZWxwZXIuRElBR1JBTV9UWVBFUy5sZW5ndGg7IGkrKykgewotLy8JCQkJCQkJCWludCBkaWFncmFtVHlwZSA9IERpYWdyYW1IZWxwZXIuRElBR1JBTV9UWVBFU1tpXTsKLS8vCQkJCQkJCQlMaXN0IGJhc2VEaWFncmFtcyA9IGJhc2VNZ3IuZ2V0RGlhZ3JhbXMoYmFzZSwKLS8vCQkJCQkJCQkJCWRpYWdyYW1UeXBlKTsKLS8vCQkJCQkJCQlpZiAoIWJhc2VEaWFncmFtcy5pc0VtcHR5KCkgJiYgYmFzZURpYWdyYW1zLmdldCgwKSAhPSBudWxsKSB7Ci0vLwkJCQkJCQkJCURpYWdyYW0gY29weSA9IGJhc2VNZ3IuY3JlYXRlRGlhZ3JhbShhY3QsCi0vLwkJCQkJCQkJCQkJZGlhZ3JhbVR5cGUsIG51bGwpOwotLy8JCQkJCQkJCQlpZiAoaXNQdWJsaXNoRGlhZ3JhbShiYXNlLCBkaWFncmFtVHlwZSkpIHsKLS8vCQkJCQkJCQkJCXNldERpYWdyYW1PcHRpb25zKGFjdCwgZGlhZ3JhbVR5cGUpOwotLy8JCQkJCQkJCQl9Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLS8vCQkJCQkKLS8vCQkJCX0KLS8vCQkJCWZpbmFsbHl7Ci0vLwkJCQkJaWYoZE1nciAhPSBudWxsKXsKLS8vCQkJCQkJZE1nci5yZWxlYXNlKCk7Ci0vLwkJCQkJfQotLy8JCQkJCWlmKGJhc2VNZ3IgIT0gbnVsbCl7Ci0vLwkJCQkJCWRNZ3IucmVsZWFzZSgpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJcHVibGljIENsYXNzIGdldENvbW1hbmRUeXBlKCkgewotLy8JCQkJcmV0dXJuIFZhcnlBY3Rpdml0eUNvbW1hbmQuY2xhc3M7Ci0vLwkJCX0KLS8vCi0vLwkJCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0vLwkJCQkvLyBnZXQgb2xkIGNvbnRyaWJ1dG9yL3JlcGxhY2VyIG9mIHRoZSBhY3Rpdml0eQotLy8JCQkJLy8KLS8vCQkJCWlmKHRydWUpIHJldHVybjsKLS8vCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgY29tbWFuZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLS8vCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlQWN0ID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLS8vCQkJCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLS8vCQkJCQlBY3Rpdml0eSBwYXJlbnRBY3QgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0vLwkJCQkJRGlhZ3JhbU1hbmFnZXIgZE1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhwYXJlbnRBY3QpKTsKLS8vCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOyAKLS8vCQkJCQl0cnkgewotLy8JCQkJCQlMaXN0IGRpYWdyYW1zID0gZE1nci5nZXREaWFncmFtcyhwYXJlbnRBY3QsCi0vLwkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5BQ1RJVklUWV9ESUFHUkFNKTsKLS8vCQkJCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBkaWFncmFtcy5nZXQoMCk7Ci0vLwkJCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLS8vCQkJCQkJCS8vIGZpbmQgZXhpc3Rpbmcgbm9kZSBmb3IgdGhlIG9sZAotLy8JCQkJCQkJLy8gY29udHJpYnV0b3JlL3JlcGxhY2VyCi0vLwkJCQkJCQkvLyBvbGQgYW5kIHJlbGluayBpdCB0byB0aGUgYmFzZSBhY3Rpdml0eQotLy8JCQkJCQkJTm9kZSBub2RlID0gZmluZE5vZGUoZGlhZ3JhbSwgYWN0KTsKLS8vCQkJCQkJCWlmIChub2RlICE9IG51bGwpIHsKLS8vCQkJCQkJCQlOb2RlQWRhcHRlciBhZGFwdGVyID0gQnJpZGdlSGVscGVyCi0vLwkJCQkJCQkJCQkuZ2V0Tm9kZUFkYXB0ZXIobm9kZS5nZXRFbGVtZW50KCkpOwotLy8JCQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwKLS8vCQkJCQkJCQkJCSYmIGFkYXB0ZXIuZ2V0RWxlbWVudCgpICE9IGJhc2VBY3QpIHsKLS8vCQkJCQkJCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSgoRU1vZGVsRWxlbWVudCkgbm9kZQotLy8JCQkJCQkJCQkJCS5nZXRFbGVtZW50KCksIGJhc2VBY3QpOwotLy8JCQkJCQkJCQlCcmlkZ2VIZWxwZXIKLS8vCQkJCQkJCQkJCQkubWFya0luaGVyaXRlZCgoRU1vZGVsRWxlbWVudCkgbm9kZQotLy8JCQkJCQkJCQkJCQkJLmdldEVsZW1lbnQoKSk7Ci0vLwkJCQkJCQkJfQotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJCS8vIHJlbW92ZSBkaWFncmFtcyAKLS8vCQkJCQkJCi0vLwkJCQkJCQotLy8JCQkJCX1jYXRjaChFeGNlcHRpb24gZSl7Ci0vLwkJCQkJCQotLy8JCQkJCX0KLS8vCQkJCQlmaW5hbGx5IHsKLS8vCQkJCQkJCQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLS8vCQkJCQotLy8JCQl9Ci0vLwotLy8JCX0pOwotLy8KLS8vCQlyZXR1cm4gY29tbWFuZExpc3RlbmVyczsKLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGlhZ3JhbU9wdGlvbnMoQWN0aXZpdHkgYWN0aXZpdHkgLCBpbnQgZGlhZ3JhbVR5cGUpewotCQlzd2l0Y2goZGlhZ3JhbVR5cGUpewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKGFjdGl2aXR5LCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlEaWFncmFtT3B0aW9ucy5zZXRQdWJsaXNoQUREKGFjdGl2aXR5LCBmYWxzZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKGFjdGl2aXR5LCBmYWxzZSk7Ci0JCQlicmVhazsJCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHVibGlzaERpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHksIGludCBkaWFncmFtVHlwZSl7Ci0JCXN3aXRjaChkaWFncmFtVHlwZSl7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlyZXR1cm4gRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoQUQoYWN0aXZpdHkpOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBEaWFncmFtT3B0aW9ucy5pc1B1Ymxpc2hBREQoYWN0aXZpdHkpOwotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIERpYWdyYW1PcHRpb25zLmlzUHVibGlzaFdQREQoYWN0aXZpdHkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtRWRpdG9yU3RhdGVQcmVzZXJ2ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JTdGF0ZVByZXNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWRmY2IwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1FZGl0b3JTdGF0ZVByZXNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy9hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vL0NvbnRyaWJ1dG9yczoKLS8vSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC5BYnN0cmFjdERpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuRGlhZ3JhbUVkaXRvcklucHV0UHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LnV0aWwuRGlhZ3JhbUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuU2hhcmVkUmVzb3VyY2VEaWFncmFtRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FZGl0b3JTdGF0ZVByZXNlcnZlciB7Ci0JcHJpdmF0ZSBJRWRpdG9yUmVmZXJlbmNlIGRpYWdyYW1FZGl0b3JSZWY7Ci0JcHJpdmF0ZSBib29sZWFuIGRpcnR5OwotCi0JcHVibGljIERpYWdyYW1FZGl0b3JTdGF0ZVByZXNlcnZlcihPYmplY3QgYWN0aXZpdHlPcldyYXBwZXIsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBpbnQgZGlhZ3JhbVR5cGUpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IERpYWdyYW1FZGl0b3JJbnB1dFByb3h5KAotCQkJCW5ldyBEaWFncmFtRWRpdG9ySW5wdXQoYWN0aXZpdHlPcldyYXBwZXIsIHN1cHByZXNzaW9uLCBkaWFncmFtVHlwZSksIAotCQkJCURpYWdyYW1FZGl0b3JIZWxwZXIuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludChkaWFncmFtVHlwZSkpOwotCQl0cnkgewotCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpCi0JCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCVN0cmluZyBlZGl0b3JJZCA9IERpYWdyYW1FZGl0b3JVdGlsLmdldEVkaXRvcklkKGRpYWdyYW1UeXBlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9yUmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmID0gZWRpdG9yUmVmc1tpXTsKLQkJCQlpZihpbnB1dC5lcXVhbHMoZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCkpICYmIGVkaXRvclJlZi5lcXVhbHMoZWRpdG9ySWQpKSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IGVkaXRvclJlZi5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQlpZihlZGl0b3IgaW5zdGFuY2VvZiBBYnN0cmFjdERpYWdyYW1FZGl0b3IpIHsKLQkJCQkJCWRpYWdyYW1FZGl0b3JSZWYgPSBlZGl0b3JSZWY7CQkKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYoZGlhZ3JhbUVkaXRvclJlZiAhPSBudWxsKSB7Ci0JCQkJZGlydHkgPSBkaWFncmFtRWRpdG9yUmVmLmdldEVkaXRvcihmYWxzZSkuaXNEaXJ0eSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXN0b3JlKCkgewotCQl0cnkgewotCQkJaWYgKGRpYWdyYW1FZGl0b3JSZWYgIT0gbnVsbCAmJiAhZGlydHkpIHsKLQkJCQlBYnN0cmFjdERpYWdyYW1FZGl0b3IgZWRpdG9yID0gKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgZGlhZ3JhbUVkaXRvclJlZgotCQkJCQkJLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsICYmIGVkaXRvci5pc0RpcnR5KCkpIHsKLQkJCQkJSURvY3VtZW50UHJvdmlkZXIgZG9jUHJvdmlkZXIgPSAoKEFic3RyYWN0RGlhZ3JhbUVkaXRvcikgZWRpdG9yKQotCQkJCQkJCS5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0KLQkJCQkJLy8gdGhpcyB3aWxsIGNsZWFyIGRpcnR5IGZsYWcgb2YgdGhlIGVkaXRvcgotCQkJCQkvLwotCQkJCQlpZiAoZG9jUHJvdmlkZXIgaW5zdGFuY2VvZiBTaGFyZWRSZXNvdXJjZURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyKSB7Ci0JCQkJCQkoKFNoYXJlZFJlc291cmNlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIpIGRvY1Byb3ZpZGVyKQotCQkJCQkJCQkubWFya0RvY3VtZW50QXNTYXZlZCgoSUZpbGVFZGl0b3JJbnB1dCkgZGlhZ3JhbUVkaXRvclJlZgotCQkJCQkJCQkJCS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1JbWFnZVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1JbWFnZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkODgwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9EaWFncmFtSW1hZ2VTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQucGFydC5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlci5OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyLk5ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXIuTmV3V1BEZXBlbmRlbmN5RGlhZ3JhbVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5EaWFncmFtT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBzZXJ2aWNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGRpYWdyYW0gaW1hZ2VzIGZvciBhY3Rpdml0eSBlbGVtZW50cwotICogICAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1JbWFnZVNlcnZpY2UgaW1wbGVtZW50cyBJRGlhZ3JhbUltYWdlU2VydmljZSB7Ci0KLQlzdGF0aWMgYm9vbGVhbiBkZWJ1ZyAgPSBEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50ID0gbnVsbDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGhvbGRlciA9IG51bGw7Ci0KLQlwcml2YXRlIEZpbGUgcHViRGlyOwotCQotCXByaXZhdGUgYm9vbGVhbiBmb3JYTUxFeHBvcnQgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IHR5cGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0KLQlwcml2YXRlIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVW5jcmVhdGVkQUREID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBleGlzdCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQotCXN0YXRpYyB7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVywgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU0pKTsKLQkJdHlwZU1hcC5wdXQoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCwgbmV3IEludGVnZXIoCi0JCQkJSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSk7Ci0JCXR5cGVNYXAucHV0KFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZLCBuZXcgSW50ZWdlcigKLQkJCQlJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGdldEludFR5cGUoU3RyaW5nIGRpYWdyYW1UeXBlKSB7Ci0JCUludGVnZXIgdHlwZSA9IChJbnRlZ2VyKSB0eXBlTWFwLmdldChkaWFncmFtVHlwZSk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXJldHVybiB0eXBlLmludFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gLTE7Ci0JfQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VIaW50KFN0cmluZyBkaWFncmFtVHlwZSl7Ci0JCWludCB0eXBlID0gZ2V0SW50VHlwZShkaWFncmFtVHlwZSk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNOgotCQkJcmV0dXJuIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nVHlwZShpbnQgdHlwZSkgewotCQlzd2l0Y2godHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTDsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTToKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0KLQlwcml2YXRlIFNldDxEaWFncmFtTWFuYWdlcj4gZGlhZ3JhbU1hbmFnZXJzID0gbmV3IEhhc2hTZXQ8RGlhZ3JhbU1hbmFnZXI+KCk7Ci0KLS8vCXB1YmxpYyBEaWFncmFtSW1hZ2VTZXJ2aWNlKCkgewotLy8JCXRoaXMobnVsbCwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSkpOwotLy8JfQotCi0JcHVibGljIERpYWdyYW1JbWFnZVNlcnZpY2UoRmlsZSBwdWJEaXIpIHsKLQkJdGhpcyhudWxsLCBwdWJEaXIpOwotCX0KLQotCXB1YmxpYyBEaWFncmFtSW1hZ2VTZXJ2aWNlKENvbXBvc2l0ZSBwYXJlbnQsIEZpbGUgcHViRGlyKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciBnZXREaWFncmFtVmlld2VyKGludCBkaWFncmFtVHlwZSwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJLy8gaWYgdGhlIHNoZWxsIHdpbmRvdyBpcyBkaXN0cm95ZWQsIHJlY3JlYXRlIGl0Ci0JCWlmICgodGhpcy5zaGVsbCAhPSBudWxsKSAmJiB0aGlzLnNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5wYXJlbnQgPSBudWxsOwotCQkJdGhpcy5zaGVsbCA9IG51bGw7Ci0JCX0KLQkJZ2V0Vmlld2VySG9sZGVyKHBhcmVudCk7Ci0KLQkJc3dpdGNoIChkaWFncmFtVHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBOZXdBY3Rpdml0eURpYWdyYW1WaWV3ZXIoaG9sZGVyLCB3cmFwcGVyKTsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTToKLQkJCXJldHVybiBuZXcgTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyKGhvbGRlcix3cmFwcGVyKTsKLQotCQljYXNlIElEaWFncmFtTWFuYWdlci5XT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNOgotCQkJcmV0dXJuIG5ldyBOZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyKGhvbGRlcix3cmFwcGVyKTsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0Vmlld2VySG9sZGVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlpZiAoc2hlbGwgPT0gbnVsbCB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlzaGVsbCA9IGNyZWF0ZVNoZWxsKCk7Ci0JCQl9Ci0JCQlzaGVsbC5vcGVuKCk7Ci0JCQlwYXJlbnQgPSBzaGVsbDsKLQkJfQotCi0JCWlmIChob2xkZXIgIT0gbnVsbCkgewotCQkJaG9sZGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWhvbGRlciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxLCAxKSk7IC8vIHNpemUgY2FuJ3QgYmUgMCwwCi0JCS8vIG90aGVyd2lzZSB0aGUgZGlhZ3JhbQotCQkvLyB3aWxsIG5vdCBiZSBwYWludGVkCi0JCWhvbGRlci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWhvbGRlci5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIFNoZWxsIGNyZWF0ZVNoZWxsKCkgewotCQlTaGVsbCBzaGVsbCA9IG51bGw7Ci0JCURpc3BsYXkgZCA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlzaGVsbCA9IG5ldyBTaGVsbChkKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNoZWxsLnNldEJvdW5kcygwLCAwLCAwLCAwKTsKLQkJc2hlbGwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoKHNoZWxsICE9IG51bGwpICYmICghc2hlbGwuaXNEaXNwb3NlZCgpKSkgewotCQkJc2hlbGwuY2xvc2UoKTsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJZm9yIChEaWFncmFtTWFuYWdlciBtZ3IgOiBkaWFncmFtTWFuYWdlcnMpIHsKLQkJCW1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNhdmUgdGhlIGVsZW1lbnQgZGlhZ3JhbSBpbWFnZSBhbmQgcmV0dXJucyB0aGUgaW1hZ2UgZmlsZSB1cmwuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gaW1nUGF0aAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiAgICAgICAgICAgIElGaWx0ZXIKLQkgKiBAcGFyYW0gc3VwCi0JICogICAgICAgICAgICBTdXBwcmVzc2lvbgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBpbWFnZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpcgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2Ujc2F2ZURpYWdyYW0oamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyLCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb24pCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIHNhdmVEaWFncmFtKGZpbmFsIE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwgCi0JCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbVR5cGUsIGZpbmFsIElGaWx0ZXIgZmlsdGVyLAotCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIGluaXRpYWxpemUgdGhlIGRpYWdyYW1JbmZvCi0JCWRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQkvLyBncmFiIHRoZSBVSSB0aHJlYWQgdG8gYXZvaWQgdGhyZWFkIGFjY2VzcyBlcnJvcgotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJX19pbnRlcm5hbF9zYXZlRGlhZ3JhbSh3cmFwcGVyLCBpbWdQYXRoLCBkaWFncmFtVHlwZSwgZmlsdGVyLCBzdXApOwotCQkJfQotCQl9KTsKLQotCQlyZXR1cm4gZGlhZ3JhbUluZm87Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1VzZXJEZWZpbmVkRGlhZ3JhbShBY3Rpdml0eSBlLCBTdHJpbmcgaW1nUGF0aCwgaW50IHR5cGUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gaWYgdGhlcmUgaXMgYSB1c2VyIGRlZmluZWQgZGlhZ3JhbSwgdXNlIGl0Ci0JCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gaW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKAotCQkJCShBY3Rpdml0eSkgZSk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNOgotCQkJaWYgKGluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSkgewotCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKSAhPSBudWxsKQotCQkJCQkJJiYgaW5mby5jYW5QdWJsaXNoQURJbWFnZSgpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlpZiAoaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSkgewotCQkJCXJldHVybiAoaW5mby5nZXRBY3Rpdml0eURldGFpbERpYWdyYW0oKSAhPSBudWxsKQotCQkJCQkJJiYgaW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlpZiAoaW5mby5jYW5QdWJsaXNoV1BESW1hZ2UoKSkgewotCQkJCXJldHVybiAoaW5mby5nZXRXUEREaWFncmFtKCkgIT0gbnVsbCkKLQkJCQkJCSYmIGluZm8uY2FuUHVibGlzaFdQREltYWdlKCk7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBfX2ludGVybmFsX3NhdmVEaWFncmFtKE9iamVjdCB3cmFwcGVyLCBmaW5hbCBTdHJpbmcgaW1nUGF0aCwKLQkJCVN0cmluZyBkaWFncmFtVHlwZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlpZiAoc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIERpYWdyYW1JbmZvIGRpYWdyYW1JbmZvID0gbnVsbDsKLQotCQlpbnQgdHlwZSA9IGdldEludFR5cGUoZGlhZ3JhbVR5cGUpOwotCQlpZiAodHlwZSA8IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlfaW50ZXJuYWxfZ2VuZXJhdGVJbWFnZSh3cmFwcGVyLCBpbWdQYXRoLCB0eXBlLCBmaWx0ZXIsIHN1cCwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBkaWFncmFtIEpQRUcgZm9yIGdpdmVuIEFjdGl2aXR5IGFuZCAgCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gaW1nUGF0aAotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBmaWx0ZXIKLQkgKiBAcGFyYW0gc3VwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVEaWFncmFtSW1hZ2UoZmluYWwgT2JqZWN0IHdyYXBwZXIsIGZpbmFsIFN0cmluZyBpbWdQYXRoLCAKLQkJCWZpbmFsIGludCBkaWFncmFtVHlwZSwgZmluYWwgSUZpbHRlciBmaWx0ZXIsCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXAsIGZpbmFsIGJvb2xlYW4gcmVhbGl6ZWREaWFncmFtKXsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCV9pbnRlcm5hbF9nZW5lcmF0ZUltYWdlKHdyYXBwZXIsIGltZ1BhdGgsIGRpYWdyYW1UeXBlLCBmaWx0ZXIsIHN1cCwgZmFsc2UsIHJlYWxpemVkRGlhZ3JhbSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gaW1nUGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogTWV0aG9kIHRvIGNyZWF0ZSBhIGRpYWdyYW0gdmlld2VyIGFuZCBnZW5lcmF0ZSBpbWFnZSBhbmQgc2F2ZXMgdGhlIGltYWdlLgotCSAqIAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqIEBwYXJhbSBjYWxjdWxhdGVEaWFncmFtSW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBfaW50ZXJuYWxfZ2VuZXJhdGVJbWFnZShPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsCi0JCQlpbnQgdHlwZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCwgYm9vbGVhbiBjYWxjdWxhdGVEaWFncmFtSW5mbywKLQkJCWJvb2xlYW4gcmVhbGl6ZWREaWFncmFtKXsKLQkJCi0JCWV4aXN0ID0gdHJ1ZTsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQWN0aXZpdHkgZSA9IChBY3Rpdml0eSkgbzsKLQkJCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSBudWxsOwotCi0JCS8vIGtlZXAgdGhlIGRpcnR5IGZsYWcgYW5kIHJlc2V0IGJhY2sgdG8gYXZvaWQgbWFrZSB0aGUgbGlicmFyeSBkaXJ0eQotCQlib29sZWFuIGRpcnR5RmxhZyA9IGUuZVJlc291cmNlKCkuaXNNb2RpZmllZCgpOwotCi0JCXRyeSB7Ci0JCQkKLQkJCU9iamVjdCBvYmplY3QgPSBjYW5DcmVhdGVJbWFnZSh3cmFwcGVyLCBpbWdQYXRoLCB0eXBlLCBmaWx0ZXIsIHN1cCk7Ci0JCQlpZihyZWFsaXplZERpYWdyYW0gJiYgb2JqZWN0ID09IG51bGwpewotCQkJCXJldHVybjsKLQkJCX1lbHNlewotCQkJCXdyYXBwZXIgPSBvYmplY3Q7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXZpZXdlciA9IGdldERpYWdyYW1WaWV3ZXIodHlwZSwgd3JhcHBlcik7Ci0JCQkJaWYoY29uZmlnICE9IG51bGwpewotCQkJCQl2aWV3ZXIuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCX0KLQkJCQlFZGl0UGFydCBkaWFncmFtRWRpdFBhcnQgPSB2aWV3ZXIubG9hZERpYWdyYW0od3JhcHBlciwgIWV4aXN0LCBmaWx0ZXIsIHN1cCk7Ci0JCQkJaWYoZGlhZ3JhbUVkaXRQYXJ0ID09IG51bGwpewotCQkJCQlpZihkZWJ1Zyl7Ci0JCQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLgotCQkJCQkJbG9nRXJyb3IoIlB1Ymxpc2hpbmc6IERpYWdyYW1JbWFnZVNlcnZpY2Ugdmlld2VyIEVkaXRQYXJ0IGlzIG51bGw6ICIrd3JhcHBlcik7CS8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfWVsc2V7Ci0JCQkJCWlmKGRpYWdyYW1FZGl0UGFydC5nZXRDaGlsZHJlbigpLmlzRW1wdHkoKSkKLQkJCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYoY2FsY3VsYXRlRGlhZ3JhbUluZm8pewotCQkJCQlkaWFncmFtSW5mbyA9IHZpZXdlci5nZXREaWFncmFtSW5mbygpOwotCQkJCX0KLQkJCQlpbWFnZSA9IHZpZXdlci5jcmVhdGVEaWFncmFtSW1hZ2UoKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCQkvLyBzYXZlIHRoZSBpbWFnZQotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwdWJEaXIsIGltZ1BhdGgpOwotCi0JCQkJCS8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBjcmVhdGVkIG90aGVyd2lzZSBleGNlcHRpb24KLQkJCQkJRmlsZSBwYXJlbnQgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJaWYgKCFwYXJlbnQuZXhpc3RzKCkpIHsKLQkJCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQkJfQotCi0JCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQkJCX0KLQkJCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCQkJCUltYWdlTG9hZGVyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlcigpOwotCQkJCQlsb2FkZXIuZGF0YSA9IG5ldyBJbWFnZURhdGFbXSB7IGltYWdlLmdldEltYWdlRGF0YSgpIH07Ci0JCQkJCWxvYWRlci5zYXZlKG9zLCBTV1QuSU1BR0VfSlBFRyk7CQkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCSJGYWlsZWQgdG8gY3JlYXRlIGRpYWdyYW0gaW1hZ2UgZm9yIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChjYWxjdWxhdGVEaWFncmFtSW5mbyAmJiBkaWFncmFtSW5mbyAhPSBudWxsICYmICFkaWFncmFtSW5mby5pc0VtcHR5KCkpIHsKLQkJCQkJZGlhZ3JhbUluZm8uc2V0SW1hZ2VGaWxlUGF0aChpbWdQYXRoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCS8vIGRlbGV0ZSB0aGUgbmV3bHkgY3JlYXRlZCBkaWFncmFtIGZyb20gdGhlIGxpYnJhcnkKLQkJCWlmICghZXhpc3QpIHsKLQkJCQlEaWFncmFtIGQgPSBnZXREaWFncmFtKGUsIHR5cGUpOwotCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJRGlhZ3JhbUhlbHBlci5kZWxldGVEaWFncmFtKGQsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiRXhjZXB0aW9uIitlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQkvLyByZXN0b3JlIHRoZSBkaXJ0eSBmbGFnCi0JCQkJZS5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZChkaXJ0eUZsYWcpOwotCi0JCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCXZpZXdlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJCWltYWdlLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLQlwcml2YXRlIE9iamVjdCBjYW5DcmVhdGVJbWFnZShPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsCi0JCQlpbnQgdHlwZSwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKXsKLQotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnl7Ci0JCQkvL01ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KW87Ci0JCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvOwotCQkJaWYgKGhhc1VzZXJEZWZpbmVkRGlhZ3JhbSgoQWN0aXZpdHkpIGUsIGltZ1BhdGgsIHR5cGUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkvLyBDaGVjayBkaWFncmFtIGV4aXN0cywgZG9uJ3QgZ2VuZXJhdGUgZm9yIHN1cHByZXNzZWQuCi0JCQlEaWFncmFtIGQgPSBnZXREaWFncmFtKGUsIHR5cGUpOwotCi0JCQkvLyBDaGVjayBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JCQlleGlzdCA9IChkICE9IG51bGwpOwotCQkJCi0JCQlpZiAoaXNGb3JYTUxFeHBvcnQoKSkgewotCQkJCWlmIChleGlzdCAmJiBjYW5QdWJsaXNoRGlhZ3JhbShkLGUpKSB7Ci0JCQkJCXJldHVybiBlOwotCQkJCX0JCQkJCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCWlmIChleGlzdCkgewotCQkJCQotCQkJCWlmKCFjYW5QdWJsaXNoRGlhZ3JhbShkLGUpKSByZXR1cm4gbnVsbDsKLQkJCQkKLQkJCQlpZiAodHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSApIHsKLQkJCQkJCi0JCQkJCS8vIElmIGFuIGV4dGVuc2lvbiBoYXMgaXRzIG93biBkaWFncmFtLiBCYXNlIGlzIHJlcGxhY2VkIG9yCi0JCQkJCS8vIGNvbnRyaWJ1dGVkLmV4dGVuc2lvbiBkaWFncmFtIHNob3dzIHJlYWxpemVkIGVsZW1lbnQgaW4gdW5kZWZpbmVkCi0JCQkJCS8vIGxvY2F0aW9uLiBJbiBwdWJsaXNoaW5nIGRvbid0IGRpc3BsYXkgZXh0ZW5zaW9uIGRpYWdyYW0gZXZlbiBpZiBpdCBoYXMKLQkJCQkJLy8gaXRzIG93biBkaWFncmFtIGlmIHJlYWxpemVkIGVsZW1lbnRzIGFyZSBjb21pbmcgaW4gdGhyb3VnaAotCQkJCQkvLyB2YXJpYWJpbGl0eS4KLQkJCQkJaWYgKCBpc0JyZWFrZG93bkVsZW1lbnRzUmVwbGFjZWQoZSwgZmlsdGVyKSApIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCi0JCQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgYSB3cmFwcGVyLCB0aGUgZGlhZ3JhbSBpcyBmcm9tIGl0J3MgYmFzZSwKLQkJCQkJLy8gZG9uJ3Qgc2hvdyB0aGUgQUQgaWQgdGhlIHByZWZlcmVuY2UgaXMgbm90IHNldAotCQkJCQlpZiAoIChlICE9IHdyYXBwZXIpICYmICFwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiApIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJLy8gQ2hlY2sgdmFyaWFiaWxpdHkgYW5kIGJhc2UncyB2YXJpYWJpbGl0eS4KLS8vCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgY2FsY3VsYXRlZEJhc2UgPSBjaGVja1ZhcmlhYmlsaXR5KGUsCi0vLwkJCQkJCQlmaWx0ZXIsIHR5cGUpOwotLy8JCQkJCWlmIChjYWxjdWxhdGVkQmFzZSAhPSBudWxsKSB7Ci0vLwkJCQkJCXdyYXBwZXIgPSBjYWxjdWxhdGVkQmFzZTsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCX0gZWxzZSBpZiAoIHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJCWlmICggKGUgIT0gd3JhcHBlcikgJiYgIXB1Ymxpc2hVbmNyZWF0ZWRBREQgKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCX0gZWxzZSB7Ci0KLQkJCQlpZiAoKHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU0pKQotCQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJCS8vIEZvciBBY3Rpdml0eSBEaWFncmFtIHVuIG9wZW5lZCBleHRlbnNpb24gcHVibGlzaC4KLQkJCQlpZiAodHlwZSA9PSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTSkgewotCQkJCQkvLyBJZiBvcHRpb24gaXMgbm90IGNoZWNrZWQsIGRvbid0IGdlbmVyYXRlIGEgZGlhZ3JhbQotCQkJCQlpZiAoIXB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQkJLy8gSWYgZXh0ZW5zaW9uIGlzIG1vZGlmaWVkIGRvbid0IGdlbmVyYXRlIGl0LgotCQkJCQlpZiAoIWUuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCi0JCQkJCS8vIENoZWNrIGFueSBjaGlsZCBpcyBzdXBwcmVzc2VkLiAKLQkJCQkJLy8gaWYgYW55IGNoaWxkIGlzIHN1cHByZXNlZCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtCi0JCQkJCWlmKGFueUNoaWxkcmVuU3VwcHJlc3NlZCh3cmFwcGVyLCBmaWx0ZXIsIHN1cHByZXNzaW9uKSkgCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCi0JCQkJCS8vIENoZWNrIHZhcmlhYmlsaXR5IGFuZCBiYXNlJ3MgdmFyaWFiaWxpdHkuCi0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkQmFzZSA9IGNoZWNrVmFyaWFiaWxpdHkoZSwKLQkJCQkJCQlmaWx0ZXIsIHR5cGUpOwotCQkJCQlpZiAoY2FsY3VsYXRlZEJhc2UgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQl3cmFwcGVyID0gY2FsY3VsYXRlZEJhc2U7Ci0JCQkJCWUgPSAoQWN0aXZpdHkpIGNhbGN1bGF0ZWRCYXNlOwotCQkJCQlleGlzdCA9IHRydWU7Ci0JCQkJfQotCi0JCQkJaWYgKHB1Ymxpc2hVbmNyZWF0ZWRBREQgPT0gZmFsc2UKLQkJCQkJCSYmIHR5cGUgPT0gSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RFVEFJTF9ESUFHUkFNKSB7Ci0JCQkJCWJvb2xlYW4gY29udHJpYnV0b3JleGlzdCA9IGZhbHNlOwotCQkJCQkvLyBUaGlzIGlzIG5lZWQsIGlmIGNvbnRyaWJ1dG9yIGhhcyBhIEFERCBkaWFncmFtLCBiYXNlIGRvbid0Ci0JCQkJCS8vIGJhc2Ugc2hvdWxkIGdlbmVyYXRlIEFERCBpbiBicm93c2luZy4KLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBudWxsOwotCQkJCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQkJCQljb25maWcgPSAoKFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCQl9Ci0JCQkJCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCi0JCQkJCS8vIEdldCBpbW1lZGlhdGUgY29udHJpYnV0b3JzIGZpcnN0LCBhbmQgY2hlY2sgaW1tZWRpYXRlCi0JCQkJCS8vIGNvbnRyaWJ1dG9ycwotCQkJCQkvLyBoYXZlIGFueXRoaW5nIGV4dHJhIGJyZWFrZG93biBlbGVtZW50cy4KLQkJCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb250cmlidXRvcnMoZSwgY29uZmlnKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJCQlpZiAoaXRlcmF0b3IgIT0gbnVsbCkgewotCQkJCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQkJT2JqZWN0IGFjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYgKGFjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlEaWFncmFtIGR4ID0gZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpYWN0LCB0eXBlKTsKLQkJCQkJCQkJCWlmIChkeCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJY29udHJpYnV0b3JleGlzdCA9IHRydWU7Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb250cmlidXRvcmV4aXN0KQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhblB1Ymxpc2hEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJc3dpdGNoIChEaWFncmFtSGVscGVyLmdldERpYWdyYW1UeXBlKGRpYWdyYW0pKSB7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLkFDVElWSVRZX0RJQUdSQU06Ci0JCQlpZiAoRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoQUQoYWN0aXZpdHkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0JCQlpZiAoRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoQUREKGFjdGl2aXR5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0JCQlpZiAoRGlhZ3JhbU9wdGlvbnMuaXNQdWJsaXNoV1BERChhY3Rpdml0eSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFueUNoaWxkcmVuU3VwcHJlc3NlZChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcih3cmFwcGVyLCBmaWx0ZXIpOwotCQlib29sZWFuIG9sZFJvbGxlZFVwID0gZmFsc2U7Ci0JCWlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWFkYXB0ZXI7Ci0JCQlvbGRSb2xsZWRVcCA9IGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQlpdGVtUHJvdmlkZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCX0KLQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKXsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKWFkYXB0ZXI7Ci0JCQlvbGRSb2xsZWRVcCA9IGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQl9Ci0JCQotCQl0cnkgewotCQkJLy8gZmlsdGVyIG91dCB0aGUgc3VwcHJlc3NlZCBlbGVtZW50cwotCQkJLy8KLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKGVsZW1lbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChjaGlsZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkLXVwIGZsYWcKLQkJCS8vCi0JCQlpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJQlNJdGVtUHJvdmlkZXIpYWRhcHRlcikuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIE1vdmVkIGNvZGUgZnJvbSBnZXRDaGlsZHJlbi4gZ2V0QWRhcHRlcigpIHdpbGwgcmV0dXJuIEFkYXB0ZXIsCi0JICogd2hpY2ggd2lsbCBhbGxvdyB1cyB0byBmaW5kIGl0ZW1wcm92aWRlciBmb3IgdGhlIGNoaWxkcmVuLiAKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgZ2V0QWRhcHRlcihPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIpewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWFkYXB0ZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpd3JhcHBlcjsKLQkJfSBlbHNlIHsKLQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBnZXRBZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KAotCQkJCQl3cmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkKLQlBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcil7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUFkYXB0ZXJGYWN0b3J5RmlsdGVyKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSAoKElBZGFwdGVyRmFjdG9yeUZpbHRlcikgZmlsdGVyKQotCQkJCQkuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IGNoZWNrVmFyaWFiaWxpdHkoVmFyaWFiaWxpdHlFbGVtZW50IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJaW50IHR5cGUpIHsKLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEdldCBhbGwgQ29udHJpYnV0b3JzIGZyb20gcGFyZW50IGNoYWluIGFuZCBjb250cmlidXRvciBjaGFpbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnQgZS4KLQkJVmFyaWFiaWxpdHlJbmZvIGVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IGVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUFjdGl2aXR5IHJlcGxhY2VyID0gKEFjdGl2aXR5KSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKHZlLAotCQkJCWNvbmZpZyk7Ci0JCWlmIChyZXBsYWNlciAhPSBudWxsKSB7Ci0JCQl2ZSA9IHJlcGxhY2VyOwotCQkJRGlhZ3JhbSByZXBsYWNlckRpYWdyYW0gPSBnZXREaWFncmFtKHJlcGxhY2VyLCB0eXBlKTsKLQkJCWlmIChyZXBsYWNlckRpYWdyYW0gIT0gbnVsbCkgewotCQkJCXJldHVybiByZXBsYWNlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlEaWFncmFtIGJhc2VEaWFncmFtID0gZ2V0RGlhZ3JhbSgoQWN0aXZpdHkpIHZlLCB0eXBlKTsKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgZmlyc3QgaWYgYmFzZURpYWdyYW0gaXMgc3VwcHJlc3NlZC4KLQkJCQlpZihCcmlkZ2VIZWxwZXIuaXNTdXBwcmVzc2VkKGJhc2VEaWFncmFtKSkgcmV0dXJuIG51bGw7Ci0JCQkJCi0JCQkJLy8gRmluZCB0aGUgY29udHJpYnV0b3JzIG9mIEJhc2UKLQkJCQlWYXJpYWJpbGl0eUluZm8gdmVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkJCS5nZXRWYXJpYWJpbGl0eUluZm8oKFZhcmlhYmlsaXR5RWxlbWVudCkgdmUpOwotCQkJCUxpc3QgdmVDb250cmlidXRvcnMgPSB2ZUluZm8uZ2V0Q29udHJpYnV0b3JzKCk7Ci0JCQkJaWYgKGNvbnRyaWJ1dG9ycy5zaXplKCkgIT0gdmVDb250cmlidXRvcnMuc2l6ZSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoIXZlQ29udHJpYnV0b3JzLmNvbnRhaW5zKG5leHQpKSB7Ci0JCQkJCQkJaWYgKCEoKEFjdGl2aXR5KSBuZXh0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdmU7Ci0JCQkJCi0JCQl9ZWxzZXsKLQkJCQkvLyBJZiBubyBiYXNlIGRpYWdyYW0sIGNoZWNrIGJhc2Ugb2YgYmFzZSBoYWQgYW55IGRpYWdyYW0uCi0JCQkJcmV0dXJuIGNoZWNrVmFyaWFiaWxpdHkodmUsIGZpbHRlciwgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgY2hlY2tWYXJpYWJpbGl0eShWYXJpYWJpbGl0eUVsZW1lbnQgZSwgSUZpbHRlciBmaWx0ZXIsCi0JCQlpbnQgdHlwZSwgYm9vbGVhbiBjaGVja1VERCkgewotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyB1ZGRJbmZvID0gbnVsbDsKLQkJCi0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIHsKLQkJCWNvbmZpZyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gR2V0IGltbWVkaWF0ZSBjb250cmlidXRvcnMgZmlyc3QsIGFuZCBjaGVjayBpbW1lZGlhdGUgY29udHJpYnV0b3JzCi0JCS8vIGhhdmUgYW55dGhpbmcgZXh0cmEgYnJlYWtkb3duIGVsZW1lbnRzLgotCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlLCBjb25maWcpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAoISgoQWN0aXZpdHkpIG5leHQpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEdldCBhbGwgQ29udHJpYnV0b3JzIGZyb20gcGFyZW50IGNoYWluIGFuZCBjb250cmlidXRvciBjaGFpbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnQgZS4KLQkJVmFyaWFiaWxpdHlJbmZvIGVJbmZvID0gKChQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIpIGZpbHRlcikKLQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IGVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUFjdGl2aXR5IHJlcGxhY2VyID0gKEFjdGl2aXR5KSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKHZlLAotCQkJCWNvbmZpZyk7Ci0JCWlmIChyZXBsYWNlciAhPSBudWxsKSB7Ci0JCQl2ZSA9IHJlcGxhY2VyOwotCQkJRGlhZ3JhbSByZXBsYWNlckRpYWdyYW0gPSBnZXREaWFncmFtKHJlcGxhY2VyLCB0eXBlKTsKLQkJCWlmKGNoZWNrVUREKXsKLQkJCQl1ZGRJbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8ocmVwbGFjZXIpOwotCQkJCWlmKHVkZEluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSAmJiB1ZGRJbmZvLmdldEFjdGl2aXR5RGlhZ3JhbSgpICE9IG51bGwpewotCQkJCQlyZXR1cm4gcmVwbGFjZXI7Ci0JCQkJfQotCQkJfWVsc2V7Ci0JCQkJaWYgKHJlcGxhY2VyRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiByZXBsYWNlcjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCQotCQkJRGlhZ3JhbSBiYXNlRGlhZ3JhbSA9IG51bGw7Ci0JCQlpZihjaGVja1VERCl7Ci0JCQkJdWRkSW5mbyA9IG5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKChBY3Rpdml0eSl2ZSk7Ci0JCQl9ZWxzZXsKLQkJCQliYXNlRGlhZ3JhbSA9IGdldERpYWdyYW0oKEFjdGl2aXR5KSB2ZSwgdHlwZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChiYXNlRGlhZ3JhbSAhPSBudWxsIHx8ICh1ZGRJbmZvICE9IG51bGwgJiYgdWRkSW5mby5jYW5QdWJsaXNoQURJbWFnZSgpICYmIHVkZEluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCkgIT0gbnVsbCkpIHsKLQkJCQkKLQkJCQkvLyBDaGVjayBmaXJzdCBpZiBiYXNlRGlhZ3JhbSBpcyBzdXBwcmVzc2VkLgotLy8JCQkJaWYoQnJpZGdlSGVscGVyLmlzU3VwcHJlc3NlZChiYXNlRGlhZ3JhbSkpIHJldHVybiBudWxsOwotCQkJCQotCQkJCS8vIEZpbmQgdGhlIGNvbnRyaWJ1dG9ycyBvZiBCYXNlCi0JCQkJVmFyaWFiaWxpdHlJbmZvIHZlSW5mbyA9ICgoUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyKSBmaWx0ZXIpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlJbmZvKChWYXJpYWJpbGl0eUVsZW1lbnQpIHZlKTsKLQkJCQlMaXN0IHZlQ29udHJpYnV0b3JzID0gdmVJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCWlmIChjb250cmlidXRvcnMuc2l6ZSgpICE9IHZlQ29udHJpYnV0b3JzLnNpemUoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29udHJpYnV0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCF2ZUNvbnRyaWJ1dG9ycy5jb250YWlucyhuZXh0KSkgewotCQkJCQkJCWlmICghKChBY3Rpdml0eSkgbmV4dCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJCQkJLmlzRW1wdHkoKSkgewotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHZlOwotCQkJCQotCQkJfWVsc2V7Ci0JCQkJLy8gSWYgbm8gYmFzZSBkaWFncmFtLCBjaGVjayBiYXNlIG9mIGJhc2UgaGFkIGFueSBkaWFncmFtLgotCQkJCXJldHVybiBjaGVja1ZhcmlhYmlsaXR5KHZlLCBmaWx0ZXIsIHR5cGUpOwotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQotCS8qKgotCSAqIFNldCB0aGUgd2luZG93J3MgcHJlZmVyZW5jZSBhdHRyaWJ1dGUgZm9yIEFjdGl2aXR5IERldGFpbCBEaWFncmFtLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hlZFVuQ3JlYXRlZEFERChib29sZWFuIGZsYWcpIHsKLQkJdGhpcy5wdWJsaXNoVW5jcmVhdGVkQUREID0gZmxhZzsKLQl9Ci0JLyoqCi0JICogU2V0IHRoZSB3aW5kb3cncyBwcmVmZXJlbmNlIGF0dHJpYnV0ZSBmb3IgQWNpdGl2eXQgRGlhZ3JhbQotCSAqIAotCSAqLwotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGJvb2xlYW4gZmxhZyl7Ci0JCXRoaXMucHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24gPSBmbGFnOwotCX0KLQotLy8JcHJpdmF0ZSBEaWFncmFtR2VuZXJhdG9yIGNyZWF0ZURpYWdyYW1JbWFnZShEaWFncmFtRWRpdFBhcnQgZGlhZ3JhbUVQLCBJbWFnZUZpbGVGb3JtYXQgZmlsZUZvcm1hdCkKLS8vCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlDb3B5VG9JbWFnZVV0aWwgdXRpbCA9IG5ldyBDb3B5VG9JbWFnZVV0aWwoKTsKLS8vCQlEaWFncmFtR2VuZXJhdG9yIGRHZW4gPSB1dGlsLmNvcHlUb0ltYWdlKGRpYWdyYW1FUCwgbmV3IFBhdGgocHViRGlyLmdldFBhdGgoKSksIGZpbGVGb3JtYXQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotLy8JCWRHZW4uY3JlYXRlQVdUSW1hZ2VGb3JEaWFncmFtKCk7Ci0vLwkJcmV0dXJuIGRHZW47Ci0vLwl9Ci0JCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBlLCBpbnQgdHlwZSl7Ci0JCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBnZXREaWFncmFtTWFuYWdlcihlKTsKLQkJRGlhZ3JhbSBkaWFncmFtID0gbnVsbDsKLQkJaWYgKGRNZ3IgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlMaXN0PERpYWdyYW0+IGxpc3QgPSBkTWdyLmdldERpYWdyYW1zKGUsIHR5cGUpOwotCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJZGlhZ3JhbSA9IChEaWFncmFtKSBsaXN0LmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJIkVycm9yIGluIGdldERpYWdyYW0oKSIgKyBleC5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCQotCXByaXZhdGUgRGlhZ3JhbU1hbmFnZXIgZ2V0RGlhZ3JhbU1hbmFnZXIoQWN0aXZpdHkgZSkgewotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSksIHRoaXMpOwotCQlkaWFncmFtTWFuYWdlcnMgLmFkZChtZ3IpOwotCQlyZXR1cm4gbWdyOwotCX0KLQkKLQkvKioKLQkgKiBnZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiAgCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZygpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JLyoqCi0JICogc2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDaGVja3MgYW55IGJyZWFrZG93bmVsZW1lbnRzIG9mIGFuIEFjdGl2aXR5IGhhcyBhIHJlcGxhY2VyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICAgIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcgCi0JICogCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgcmVwbGFjZXIgaWYgdGhlcmUgaXMgb25lIGFuZCBPTkxZIG9uZSwKLQkgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtkb3duRWxlbWVudHNSZXBsYWNlZChBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJTWV0aG9kQ29uZmlndXJhdGlvblByb3ZpZGVyKSB7Ci0JCQljb25maWcgPSAoKElNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJfQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYoQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcigoQWN0aXZpdHkpZWxlbWVudCwgY29uZmlnKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIE1ldGhvZCB0byBnZXQgYSBEaWFncmFtVmlld2VyIGZvciBnaXZlbiBhY3Rpdml0eS4gIAotCSAqIFdpdGhvdXQgZG9pbmcgcmVhbGl6YXRpb24gYW5kIGRvZXNuJ3QgY2hlY2sgZm9yIGRpYWdyYW0gZXhpc3RzIG9yIG5vdC4gCi0JICovCi0JCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciBnZXREaWFncmFtVmlld2VyKGZpbmFsIE9iamVjdCB3cmFwcGVyLAotCQkJZmluYWwgaW50IHR5cGUsIGZpbmFsIElGaWx0ZXIgZmlsdGVyLAotCQkJZmluYWwgU3VwcHJlc3Npb24gc3VwKXsKLQkJT2JqZWN0IG8gPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvOwotCQkKLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCWlmICh0eXBlIDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdmlld2VyID0gZ2V0RGlhZ3JhbVZpZXdlcih0eXBlLCB3cmFwcGVyKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0JCi0JcHVibGljIEFjdGl2aXR5IGdldFJlYWxpemVkRm9yVW5tb2RpZmllZChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pewotCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSlUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKCBhY3Rpdml0eSA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmICghcHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gSWYgZXh0ZW5zaW9uIGlzIG1vZGlmaWVkIGRvbid0IGdlbmVyYXRlIGl0LgotCQlpZiAoIWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBDaGVjayBhbnkgY2hpbGQgaXMgc3VwcHJlc3NlZC4gCi0JCS8vIGlmIGFueSBjaGlsZCBpcyBzdXBwcmVzZWQgZG9uJ3QgZ2VuZXJhdGUgZGlhZ3JhbQotCQlpZihhbnlDaGlsZHJlblN1cHByZXNzZWQoYWN0aXZpdHksIGZpbHRlciwgc3VwcHJlc3Npb24pKSAKLQkJCXJldHVybiBudWxsOwotCQkKLQkJLy8gQ2hlY2sgdmFyaWFiaWxpdHkgYW5kIGJhc2UncyB2YXJpYWJpbGl0eS4KLQkJVmFyaWFiaWxpdHlFbGVtZW50IGNhbGN1bGF0ZWRCYXNlID0gY2hlY2tWYXJpYWJpbGl0eShhY3Rpdml0eSwKLQkJCQlmaWx0ZXIsIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNLCB0cnVlKTsKLQkJaWYgKGNhbGN1bGF0ZWRCYXNlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJd3JhcHBlciA9IGNhbGN1bGF0ZWRCYXNlOwotCQlyZXR1cm4gKEFjdGl2aXR5KXdyYXBwZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwdWJEaXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJEaXIoRmlsZSBwdWJEaXIpIHsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0ZvclhNTEV4cG9ydCgpIHsKLQkJcmV0dXJuIGZvclhNTEV4cG9ydDsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZvclhNTEV4cG9ydAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvclhNTEV4cG9ydChib29sZWFuIGZvclhNTEV4cG9ydCkgewotCQl0aGlzLmZvclhNTEV4cG9ydCA9IGZvclhNTEV4cG9ydDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbVVJU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvRGlhZ3JhbVVJU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTRhM2M1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0RpYWdyYW1VSVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Db250cm9sRmxvd0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkRlY2lzaW9uTm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkZvcmtOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Jbml0aWFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Kb2luTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5NZXJnZU5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTNFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5GaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEEgVUkgc2VydmljZSBmb3IgZXh0ZXJuYWwgZWNvcmUgbWFwIHRvIGFjZXNzIEVQRiBEaWFncmFtcyBhbmQgY3JlYXRpbmcKLSAqIGRpYWdyYW0gZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgQ2hpbmggVm8KLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1VSVNlcnZpY2UgaW1wbGVtZW50cyBJRGlhZ3JhbVVJU2VydmljZSB7Ci0KLQlzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IERpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIENsYXNzPiBub2RlVHlwZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPigpOwotCi0JcHVibGljIERpYWdyYW1VSVNlcnZpY2UoKSB7Ci0KLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5BQ1RJVklUWV9OT0RFLCBBY3Rpdml0eS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuUEhBU0VfTk9ERSwgUGhhc2UuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLklURVJBVElPTl9OT0RFLCBJdGVyYXRpb24uY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLlRBU0tfREVTQ1JJUFRPUl9OT0RFLAotCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5NSUxFU1RPTkVfTk9ERSwgTWlsZXN0b25lLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5JTklUSUFMX05PREUsIEluaXRpYWxOb2RlLmNsYXNzKTsKLQkJbm9kZVR5cGVzTWFwLnB1dChJRGlhZ3JhbVVJU2VydmljZS5GSU5BTF9OT0RFLCBGaW5hbE5vZGUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLkZPUktfTk9ERSwgRm9ya05vZGUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLkpPSU5fTk9ERSwgSm9pbk5vZGUuY2xhc3MpOwotCQlub2RlVHlwZXNNYXAucHV0KElEaWFncmFtVUlTZXJ2aWNlLk1FUkdFX05PREUsIE1lcmdlTm9kZS5jbGFzcyk7Ci0JCW5vZGVUeXBlc01hcC5wdXQoSURpYWdyYW1VSVNlcnZpY2UuREVDSVNJT05fTk9ERSwgRGVjaXNpb25Ob2RlLmNsYXNzKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZSNjcmVhdGVBY3Rpdml0eURpYWdyYW0ob3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSkKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHkpIHsJCi0JCUVPYmplY3QgdW1sQWN0aXZpdHkgPSBVTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHkoKSk7Ci0JCWlmICh1bWxBY3Rpdml0eSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQkoKG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KXVtbEFjdGl2aXR5KS5zZXROYW1lKGFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCX0KLQkJaWYgKHVtbEFjdGl2aXR5IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCkgewotCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSgoRU1vZGVsRWxlbWVudCkgdW1sQWN0aXZpdHksIGFjdGl2aXR5KTsKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIGRpYWdyYW0KLQkJRGlhZ3JhbSBkaWFncmFtID0gVmlld1NlcnZpY2UuY3JlYXRlRGlhZ3JhbSh1bWxBY3Rpdml0eSwgRGlhZ3JhbU1hbmFnZXIuQURfa2luZCwKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJZGlhZ3JhbS5zZXRFbGVtZW50KHVtbEFjdGl2aXR5KTsKLQkJaWYgKHVtbEFjdGl2aXR5IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCWRpYWdyYW0uc2V0TmFtZShhY3Rpdml0eS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZSNjcmVhdGVFZGdlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldykKLQkgKi8KLQlwdWJsaWMgRWRnZSBjcmVhdGVFZGdlKERpYWdyYW0gZGlhZ3JhbSwgVmlldyBzb3VyY2UsIFZpZXcgdGFyZ2V0LAotCQkJU3RyaW5nIGxpbmtOYW1lKSB7Ci0JCW9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5IHBhcmVudEFjdGl2aXR5ID0gbnVsbDsKLQkJRU9iamVjdCBvYmogPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlwYXJlbnRBY3Rpdml0eSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgb2JqOwotCQl9Ci0JCWlmIChwYXJlbnRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlDb250cm9sRmxvdyBmbG93ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93KSBwYXJlbnRBY3Rpdml0eQotCQkJCQkuY3JlYXRlRWRnZShsaW5rTmFtZSA9IChsaW5rTmFtZSAhPSBudWxsKSA/IGxpbmtOYW1lIDogIiIsCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCWlmIChzb3VyY2UuZ2V0RWxlbWVudCgpICE9IG51bGwgJiYgc291cmNlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSkKLQkJCQkJZmxvdy5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgc291cmNlLmdldEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQlpZiAodGFyZ2V0LmdldEVsZW1lbnQoKSAhPSBudWxsICYmIHRhcmdldC5nZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpCi0JCQkJCWZsb3cuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIHRhcmdldC5nZXRFbGVtZW50KCkpOwotCQkJfQotCQkJaWYgKGZsb3cgaW5zdGFuY2VvZiBDb250cm9sRmxvdykgewotCQkJCUVkZ2UgZWRnZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZUVkZ2Uoc291cmNlLCB0YXJnZXQsIGZsb3csCi0JCQkJCQluZXcgSW50ZWdlcihDb250cm9sRmxvd0VkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgZmxvdywgbmV3IEludGVnZXIoCi0JCQkJCQlDb250cm9sRmxvd05hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQkKLQkJCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCQkJZWRnZS5zZXRTb3VyY2Uoc291cmNlKTsJCQkJCi0JCQkJfQotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCQllZGdlLnNldFRhcmdldCh0YXJnZXQpOwkJCQkJCi0JCQkJfQotCQkJCXJldHVybiBlZGdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZSNjcmVhdGVOb2RlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0sCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBOb2RlIGNyZWF0ZU5vZGUoRGlhZ3JhbSBkaWFncmFtLCBTdHJpbmcgbm9kZVR5cGUsIFN0cmluZyBub2RlTmFtZSkgewotCQlvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSBwYXJlbnRBY3Rpdml0eSA9IG51bGw7Ci0JCU5vZGUgbm90YXRpb25Ob2RlID0gbnVsbDsKLQkJRU9iamVjdCBvYmogPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5KSB7Ci0JCQlwYXJlbnRBY3Rpdml0eSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgb2JqOwotCQl9Ci0KLQkJaWYgKHBhcmVudEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCWlmIChub2RlVHlwZSA9PSBJTklUSUFMX05PREUpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChJbml0aWFsTm9kZSkgcGFyZW50QWN0aXZpdHkuY3JlYXRlTm9kZSgKLQkJCQkJCW5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUgOiAiIiwJLy8kTk9OLU5MUy0xJAotCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5pdGlhbE5vZGUoKSk7Ci0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gRklOQUxfTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEFjdGl2aXR5RmluYWxOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobm9kZU5hbWUgPSAobm9kZU5hbWUgIT0gbnVsbCkgPyBub2RlTmFtZQotCQkJCQkJCQk6ICIiLCBVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpKTsJLy8kTk9OLU5MUy0xJAotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCUFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBGT1JLX05PREUpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChGb3JrTm9kZSkgcGFyZW50QWN0aXZpdHkuY3JlYXRlTm9kZSgKLQkJCQkJCW5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUgOiAiIiwJLy8kTk9OLU5MUy0xJAotCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9ya05vZGUoKSk7Ci0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gSk9JTl9OT0RFKSB7Ci0JCQkJQWN0aXZpdHlOb2RlIHVtbE5vZGUgPSAoSm9pbk5vZGUpIHBhcmVudEFjdGl2aXR5LmNyZWF0ZU5vZGUoCi0JCQkJCQlub2RlTmFtZSA9IChub2RlTmFtZSAhPSBudWxsKSA/IG5vZGVOYW1lIDogIiIsCS8vJE5PTi1OTFMtMSQKLQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEpvaW5Ob2RlKCkpOwotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQl9IGVsc2UgaWYgKG5vZGVUeXBlID09IERFQ0lTSU9OX05PREUpIHsKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChEZWNpc2lvbk5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShub2RlTmFtZSA9IChub2RlTmFtZSAhPSBudWxsKSA/IG5vZGVOYW1lCi0JCQkJCQkJCTogIiIsIFVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldERlY2lzaW9uTm9kZSgpKTsJLy8kTk9OLU5MUy0xJAotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCURlY2lzaW9uTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gTUVSR0VfTk9ERSkgewotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKE1lcmdlTm9kZSkgcGFyZW50QWN0aXZpdHkuY3JlYXRlTm9kZSgKLQkJCQkJCW5vZGVOYW1lID0gKG5vZGVOYW1lICE9IG51bGwpID8gbm9kZU5hbWUgOiAiIiwJCQkvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKSk7Ci0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoTWVyZ2VOb2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkvKgkKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2NyZWF0ZU5vZGUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQpCi0JICovCi0JcHVibGljIE5vZGUgY3JlYXRlTm9kZShEaWFncmFtIGRpYWdyYW0sIFdvcmtCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBudWxsOwotCQlOb2RlIG5vdGF0aW9uTm9kZSA9IG51bGw7Ci0JCUVPYmplY3Qgb2JqID0gZGlhZ3JhbS5nZXRFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJcGFyZW50QWN0aXZpdHkgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIG9iajsKLQkJfQotCQlTdHJpbmcgbmFtZSA9ICIiOwotCQlpZihlLmdldFByZXNlbnRhdGlvbk5hbWUoKSAhPSBudWxsKXsKLQkJCW5hbWUgPSBlLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfWVsc2V7Ci0JCQluYW1lID0gZS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCWlmIChwYXJlbnRBY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFBoYXNlKSB7Ci0JCQkJLy8gUGhhc2UKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCi0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCQkvLyBJdGVyYXRpb24KLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSBwYXJlbnRBY3Rpdml0eQotCQkJCQkJLmNyZWF0ZU5vZGUobmFtZSwKLQkJCQkJCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkvLyBBY3Rpdml0eQotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShuYW1lLAotCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKCkpOwotCi0JCQkJQnJpZGdlSGVscGVyLmFzc29jaWF0ZSh1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIGUpKTsKLQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkvLyBUYXNrIGRlc2NyaXB0b3IKLQkJCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IChBY3Rpdml0eVBhcmFtZXRlck5vZGUpIHBhcmVudEFjdGl2aXR5Ci0JCQkJCQkuY3JlYXRlTm9kZShuYW1lLAotCQkJCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eVBhcmFtZXRlck5vZGUoKSk7Ci0KLQkJCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgZSkpOwotCi0JCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQkJbmV3IEludGVnZXIoQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlCi0JCQkJCQkuY3JlYXRlTm9kZSgKLQkJCQkJCQkJbm90YXRpb25Ob2RlLAotCQkJCQkJCQl1bWxOb2RlLAotCQkJCQkJCQluZXcgSW50ZWdlcigKLQkJCQkJCQkJCQlBY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCS8vIE1pbGVzdG9uZQotCQkJCUFjdGl2aXR5Tm9kZSB1bWxOb2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgcGFyZW50QWN0aXZpdHkKLQkJCQkJCS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJCQkJCVVNTFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5UGFyYW1ldGVyTm9kZSgpKTsKLQotCQkJCUJyaWRnZUhlbHBlci5hc3NvY2lhdGUodW1sTm9kZSwgKChNZXRob2RFbGVtZW50KSBlKSk7Ci0KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihBY3Rpdml0eVBhcmFtZXRlck5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RhdGlvbk5vZGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2dldEVkZ2VzKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0pCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVkZ2VzKERpYWdyYW0gZGlhZ3JhbSkgewotCQlyZXR1cm4gZGlhZ3JhbS5nZXRQZXJzaXN0ZWRFZGdlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGRpYWdyYW0gbm9kZXMgaW4gdGhlIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSBub2RlVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsTm9kZXMoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCXJldHVybiBkaWFncmFtLmdldFBlcnNpc3RlZENoaWxkcmVuKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLklEaWFncmFtVUlTZXJ2aWNlI2dldE5vZGVzKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0sCi0JICogICAgICBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBMaXN0PE5vZGU+IGdldE5vZGVzKERpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlTdHJpbmcgbm9kZVR5cGUpIHsKLQkJTGlzdDxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJTGlzdCBhbGxOb2RlcyA9IGRpYWdyYW0uZ2V0UGVyc2lzdGVkQ2hpbGRyZW4oKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWxsTm9kZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCUVPYmplY3QgZWxlbWVudCA9IG5vZGUuZ2V0RWxlbWVudCgpOwotCQkJCUNsYXNzIGNsYXNzVHlwZSA9IChDbGFzcykgbm9kZVR5cGVzTWFwLmdldChub2RlVHlwZSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZXggPSBCcmlkZ2VIZWxwZXIKLQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudEZyb21Bbm5vdGF0aW9uKAotCQkJCQkJCQkJKEVNb2RlbEVsZW1lbnQpIGVsZW1lbnQsIGFjdGl2aXR5Ci0JCQkJCQkJCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKGV4ICE9IG51bGwgJiYgY2xhc3NUeXBlLmlzSW5zdGFuY2UoZXgpKSB7Ci0JCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAoY2xhc3NUeXBlICE9IG51bGwgJiYgY2xhc3NUeXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGVzOwotCX0KLQotLy8JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgdHlwZSwKLS8vCQkJYm9vbGVhbiBjcmVhdGUpIHsKLS8vCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotLy8JCURpYWdyYW1NYW5hZ2VyIGRNZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShUbmdVdGlsCi0vLwkJCQkuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSkpOwotLy8KLS8vCQlpZiAoZE1nciAhPSBudWxsKSB7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlMaXN0IGxpc3QgPSBkTWdyLmdldERpYWdyYW1zKGFjdGl2aXR5LCB0eXBlKTsKLS8vCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLS8vCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotLy8JCQkJfQotLy8JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbCAmJiBjcmVhdGUpIHsKLS8vCQkJCQlkaWFncmFtID0gZE1nci5jcmVhdGVEaWFncmFtKGFjdGl2aXR5LCB0eXBlLAotLy8JCQkJCQkJZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCh0eXBlKSk7Ci0vLwkJCQl9Ci0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlpZiAoZGVidWcpIHsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvcmUgZXJyb3IgY3JlYXRpbmcgYSBkaWFncmFtOiIgLy8kTk9OLU5MUy0xJAotLy8JCQkJCQkJKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0vLwkJCQl9Ci0vLwkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotLy8JCQkJCQkiQ29yZSBlcnJvciBjcmVhdGluZyBhIGRpYWdyYW06IiwgZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfSBmaW5hbGx5IHsKLS8vCQkJCWlmIChkTWdyICE9IG51bGwpIHsKLS8vCQkJCQlkTWdyLnJlbGVhc2UoKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZGlhZ3JhbTsKLS8vCX0KLQotLy8JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlc0hpbnQgZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludChpbnQgZGlhZ3JhbVR5cGUpIHsKLS8vCQlzd2l0Y2ggKGRpYWdyYW1UeXBlKSB7Ci0vLwkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfRElBR1JBTToKLS8vCQkJcmV0dXJuIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0vLwkJY2FzZSBJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU06Ci0vLwkJCXJldHVybiBBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UOwotLy8JCWNhc2UgSURpYWdyYW1NYW5hZ2VyLldPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU06Ci0vLwkJCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuRGlhZ3JhbShJRWRpdG9yUGFydCBwYXJ0LCBpbnQgZGlhZ3JhbVR5cGUsCi0vLwkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLS8vCQl0cnkgewotLy8JCQlEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dCgKLS8vCQkJCQlzZWxlY3RlZE9iamVjdCwgc3VwcHJlc3Npb24sIGRpYWdyYW1UeXBlKTsKLS8vCQkJRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW1FZGl0b3IocGFydC5nZXRTaXRlKCkuZ2V0UGFnZSgpLAotLy8JCQkJCWlucHV0LCBnZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KGRpYWdyYW1UeXBlKSwKLS8vCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLS8vCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLS8vCQl9Ci0vLwl9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBnZXREaWFncmFtKEFjdGl2aXR5IGFjdGl2aXR5LCBpbnQgdHlwZSkgewotLy8JCXJldHVybiBnZXREaWFncmFtKGFjdGl2aXR5LCB0eXBlLCBmYWxzZSk7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1JbWFnZVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0MzNiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvc2VydmljZS9JRGlhZ3JhbUltYWdlU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciB0aGUgZ2VuZXJhdGluZyBkaWFncmFtIGltYWdlLiAgCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbUltYWdlU2VydmljZSBleHRlbmRzIElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIHsKLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgZGlhZ3JhbSBpbWFnZSBmb3IgZ2l2ZW4gYWN0aXZpdHkgYW5kIHJldHVybnMgZGlhZ3JhbSBpbWFnZSBwYXRoIHN0cmluZy4KLQkgKiBUaGlzIG1ldGhvZCBkb24ndCBjYWxjdWxhdGUgdGhlIGltYWdlIG1hcCBmb3IgZ2VuZXJhdGVkIGRpYWdyYW0gaW1hZ2UuICBJbiBvcmRlciB0byBjYWxjdWxhdGUKLQkgKiBJbWFnZSBmb3IgZ2VuZXJhdGVkIGRpYWdyYW0gdXNlIHtAbGluayBJQWN0aXZpdHlEaWFncmFtU2VydmljZX0ncyBzYXZlRGlhZ3JhbShPYmplY3Qgd3JhcGVyLCBTdHJpbmcgaW1nUGF0aCwgU3RyaW5nIGRpYWdyYW1UeXBlLAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCk7IAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHBhcmFtIGltZ1BhdGgKLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqIEBwYXJhbSByZWFsaXplZERpYWdyYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURpYWdyYW1JbWFnZShmaW5hbCBPYmplY3Qgd3JhcHBlciwgZmluYWwgU3RyaW5nIGltZ1BhdGgsIAotCQkJZmluYWwgaW50IGRpYWdyYW1UeXBlLCBmaW5hbCBJRmlsdGVyIGZpbHRlciwKLQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cCwgZmluYWwgYm9vbGVhbiByZWFsaXplZERpYWdyYW0pOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1VSVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS9zZXJ2aWNlL0lEaWFncmFtVUlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDZhNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3NlcnZpY2UvSURpYWdyYW1VSVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQ2xhc3MgZm9yIG1hcHBpbmcgYmV0d2VlbiBBY3Rpdml0eSBEaWFncmFtCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgQ2hpbmggVm8KLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbVVJU2VydmljZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9OT0RFID0gIkFjdGl2aXR5IjsJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfTk9ERSA9ICJQaGFzZSI7CQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVEVSQVRJT05fTk9ERSA9ICJJdGVyYXRpb24iOwkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0RFU0NSSVBUT1JfTk9ERSA9ICJUYXNrRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTEVTVE9ORV9OT0RFID0gIk1pbGVzdG9uZSI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfTk9ERSA9ICJJbml0aWFsTm9kZSI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkFMX05PREUgPSAiRmluYWxOb2RlIjsJCS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUktfTk9ERSA9ICJGb3JrTm9kZSI7CQkJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9OT0RFID0gIkpvaW5Ob2RlIjsJCQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9OT0RFID0gIk1lcmdlTm9kZSI7CQkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNJU0lPTl9OT0RFID0gIkRlY2lzaW9uTm9kZSI7CS8vJE5PTi1OTFMtMSQKLQotCQotCS8qKgotCSAqIFJldHVybnMgYWxsIGRpYWdyYW0gbm9kZXMgaW4gdGhlIGRpYWdyYW0KLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QWxsTm9kZXMoRGlhZ3JhbSBkaWFncmFtKTsKLQotCS8qKgotCSAqIFJldHVybiBkaWFncmFtIG5vZGUgZm9yIGdpdmVuIG5vZGUgdHlwZSB1bmRlciBnaXZlbiBhY3Rpdml0eSBhbmQgZGlhZ3JhbQotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIG5vZGVUeXBlCi0JICogCQkJZS5nLiBJRGlhZ3JhbVVJU2VydmljZS5BQ1RJVklUWV9OT0RFLCBldGMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3Q8Tm9kZT4gZ2V0Tm9kZXMoRGlhZ3JhbSBkaWFncmFtLCBBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCVN0cmluZyBub2RlVHlwZSk7Ci0KLQkvKioKLQkgKiBUbyBjcmVhdGUgYSBsaW5rCi0JICogCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEBwYXJhbSBsaW5rTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRWRnZSBjcmVhdGVFZGdlKERpYWdyYW0gZGlhZ3JhbSwgVmlldyBzb3VyY2UsIFZpZXcgdGFyZ2V0LCBTdHJpbmcgbGlua05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBkaWFnYW0gbm9kZSBmb3IgdGhlIGdpdmVuIG5vZGUgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG5vZGVUeXBlCi0JICogQHBhcmFtIG5vZGVOYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBOb2RlIGNyZWF0ZU5vZGUoRGlhZ3JhbSBkaWFncmFtLCBTdHJpbmcgbm9kZVR5cGUsIFN0cmluZyBub2RlTmFtZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgZGlhZ3JhbSBub2RlIGZvciB0aGUgZ2l2ZW4gd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIHdiZUVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE5vZGUgY3JlYXRlTm9kZShEaWFncmFtIGRpYWdyYW0sIFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZUVsZW1lbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgZWRnZXMgaW4gdGhlIGRpYWdyYW0KLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RWRnZXMoRGlhZ3JhbSBkaWFncmFtKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWN0aXZpdHkgZGlhZ3JhbSBmb3IgdGhlIGdpdmVuIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVBY3Rpdml0eURpYWdyYW0oQWN0aXZpdHkgYWN0aXZpdHkpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RmZjFhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnZpZXdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuU1dUR3JhcGhpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0uRGlhZ3JhbUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5MYXllck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5TY2FsYWJsZUZyZWVmb3JtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi51aS5wYXJ0cy5TY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgZ3JhcGhpY2FsIHZpZXdlciBvZiB0aGUgZWxlbWVudCBkaWFncmFtLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsVmlld2VyIGdyYXBoaWNhbFZpZXdlcjsKLQotCXByb3RlY3RlZCBPYmplY3Qgd3JhcHBlcjsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKLQkJY3JlYXRlR3JhcGhpY2FsVmlld2VyKCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEdyYXBoaWNhbFZpZXdlciBvbiB0aGUgc3BlY2lmaWVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcigpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdyYXBoaWNhbCB2aWV3ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgZ3JhcGhpY2FsIHZpZXdlcgotCSAqLwotCXB1YmxpYyBHcmFwaGljYWxWaWV3ZXIgZ2V0R3JhcGhpY2FsVmlld2VyKCkgewotCQlyZXR1cm4gZ3JhcGhpY2FsVmlld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0Q29udHJvbCgpLnNldEJhY2tncm91bmQoCi0JCQkJQ29sb3JDb25zdGFudHMubGlzdEJhY2tncm91bmQpOwotCQlTY3JvbGxpbmdHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKFNjcm9sbGluZ0dyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJU2NhbGFibGVGcmVlZm9ybVJvb3RFZGl0UGFydCByb290ID0gbmV3IFNjYWxhYmxlRnJlZWZvcm1Sb290RWRpdFBhcnQoKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGaWd1cmUgZ2V0RmlndXJlKCkgewotCQlHcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJLy8gZmluZCB0aGUgZmlndXJlIHRvIGJlIHNhdmVkCi0JCUxheWVyTWFuYWdlciBsbSA9IChMYXllck1hbmFnZXIpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCUxheWVyTWFuYWdlci5JRCk7Ci0JCUlGaWd1cmUgZmlndXJlID0gbG0uZ2V0TGF5ZXIoTGF5ZXJDb25zdGFudHMuUFJJTlRBQkxFX0xBWUVSUyk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwcHJlc3Npb25Ub0RpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCU9iamVjdCBlID0gZGlhZ3JhbS5nZXRPYmplY3QoKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGUpOwotCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCWRpYWdyYW0uc2V0U3VwcHJlc3Npb24oU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBpbWFnZSBmcm9tIGZpZ3VyZSBjcmVhdGVkIGluIGxvYWREaWFncmFtIG1ldGhvZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlRGlhZ3JhbUltYWdlKCkgewotCQlJRmlndXJlIGZpZ3VyZSA9IGdldEZpZ3VyZSgpOwotCi0JCVNXVEdyYXBoaWNzIGdyYXBoaWNzID0gbnVsbDsKLQkJR0MgZ2MgPSBudWxsOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQlpbnQgaGVpZ2h0ID0gYm91bmRzLmhlaWdodDsKLQkJCWludCB3aWR0aCA9IGJvdW5kcy53aWR0aDsKLQotCQkJLy8gY3JlYXRlIGEgbmV3IGltYWdlIGFuZCByZXBhaW50IHRoZSBncmFwaAotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQlpbWFnZSA9IG5ldyBJbWFnZShkaXNwbGF5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJCWdjID0gbmV3IEdDKGltYWdlKTsKLQkJCWdyYXBoaWNzID0gbmV3IFNXVEdyYXBoaWNzKGdjKTsKLQkJCWZpZ3VyZS5wYWludChncmFwaGljcyk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCi0JCQlpZiAoZ3JhcGhpY3MgIT0gbnVsbCkKLQkJCQlncmFwaGljcy5kaXNwb3NlKCk7Ci0JCQlpZiAoZ2MgIT0gbnVsbCkKLQkJCQlnYy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChncmFwaGljYWxWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUNvbnRyb2wgY3RybCA9IGdyYXBoaWNhbFZpZXdlci5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGN0cmwgIT0gbnVsbCkgewotCQkJCQljdHJsLmRpc3Bvc2UoKTsKLQkJCQl9Ci0KLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IGdyYXBoaWNhbFZpZXdlci5nZXRDb250ZW50cygpOwotCQkJCWlmKGVkaXRQYXJ0ICE9IG51bGwpIHsKLQkJCQkJZWRpdFBhcnQuc2V0TW9kZWwobnVsbCk7Ci0JCQkJfQotCi0JCQkJZ3JhcGhpY2FsVmlld2VyID0gbnVsbDsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBFZGl0UGFydEZhY3RvcnkgY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IGUsIElGaWx0ZXIgZmlsdGVyLAotCQkJU3VwcHJlc3Npb24gc3VwKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGNsZWFuVXBEaWFncmFtKCkgewotCQkvLyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgRGlhZ3JhbUluZm8gZ2V0RGlhZ3JhbUluZm8oKTsKLQlwdWJsaWMgYWJzdHJhY3QgRWRpdFBhcnQgbG9hZERpYWdyYW0oT2JqZWN0IHdyYXBwZXIsIGJvb2xlYW4gbmVlZFJlc2V0LAotCQkJSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXguamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlNzg2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL0Fic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29sb3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkRlbGVnYXRpbmdMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxheWVyZWRQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLkFic3RyYWN0RU1GT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5wYXJ0LkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuc2VydmljZXMuRGlhZ3JhbU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGlua2VkT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5hbWVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLnNlcnZpY2UuRGlhZ3JhbUltYWdlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5EaWFncmFtSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkRpYWdyYW1Sb290RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5pbWFnZS5JbWFnZUZpbGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXggZXh0ZW5kcwotCQlBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIgewotCQotCXByb3RlY3RlZCBjbGFzcyBEaWFncmFtR3JhcGhpY2FsVmlld2VyRXggZXh0ZW5kcyBEaWFncmFtR3JhcGhpY2FsVmlld2VyIGltcGxlbWVudHMgSURpYWdyYW1FZGl0b3JJbnB1dFByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBEaWFncmFtRWRpdG9ySW5wdXQgaW5wdXQ7Ci0JCXB1YmxpYyBEaWFncmFtRWRpdG9ySW5wdXQgZ2V0RGlhZ3JhbUVkaXRvcklucHV0KCkgewotCQkJaWYoaW5wdXQgPT0gbnVsbCkgewotCQkJCWlucHV0ID0gbmV3IERpYWdyYW1FZGl0b3JJbnB1dCh3cmFwcGVyLCBudWxsLCBEaWFncmFtSW1hZ2VTZXJ2aWNlLmdldEludFR5cGUoZ2V0RGlhZ3JhbVR5cGUoKSkpOwotCQkJfQotCQkJcmV0dXJuIGlucHV0OwotCQl9Ci0KLQkJcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX07Ci0KLQlwcm90ZWN0ZWQgR3JhcGhpY2FsRWRpdFBhcnQgcGFydCA9IG51bGw7Ci0JcHJvdGVjdGVkIERpYWdyYW0gZGlhZ3JhbTsKLQlwcm90ZWN0ZWQgRGlhZ3JhbU1hbmFnZXIgZG1ncjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZyA9IERpYWdyYW1VSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsgCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeChDb21wb3NpdGUgcGFyZW50LCBPYmplY3Qgd3JhcHBlcikgewotCQlzdXBlcihwYXJlbnQsIHdyYXBwZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgZGlhZ3JhbSBmb3IgZ2l2ZW4gb2JqZWN0IChvbmx5IGZvciB7QGxpbmsgQWN0aXZpdHl9IGFuZCBwYWNrcyB0aGUgYm91bmRzLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyIAl7QGxpbmsgT2JqZWN0fSAJCi0JICogQHBhcmFtIG5lZWRSZXNldCBib29sZWFuCi0JICogQHBhcmFtIGZpbHRlciAJe0BsaW5rIElGaWx0ZXJ9Ci0JICogQHBhcmFtIHN1cAkJe0BsaW5rIFN1cHByZXNzaW9ufQotCSAqLwotCXB1YmxpYyBFZGl0UGFydCBsb2FkRGlhZ3JhbShPYmplY3Qgd3JhcHBlciwgYm9vbGVhbiBuZWVkUmVzZXQsCi0JCQlJRmlsdGVyIGZpbHRlciwgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHZpZXdlciB3aXRoIHRoZSBlZGl0IHBhcnQKLQkJRWRpdFBhcnQgZWRpdFBhcnQgPSBjcmVhdGVFZGl0UGFydCh3cmFwcGVyLCBmaWx0ZXIsIHN1cCk7Ci0JCWlmKGVkaXRQYXJ0ID09IG51bGwpewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJFZGl0cGFydCBpcyBudWxsOiAiKyB3cmFwcGVyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGVkaXRQYXJ0OwotCQl9Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyLnNldENvbnRlbnRzKGVkaXRQYXJ0KTsKLQkJRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCA9IChEaWFncmFtRWRpdFBhcnQpZWRpdFBhcnQ7CQkKLQkJb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbUVkaXRQYXJ0LmdldERpYWdyYW1WaWV3KCkuZVJlc291cmNlKCk7Ci0JCWJvb2xlYW4gb2xkRGVsaXZlciA9IHJlc291cmNlLmVEZWxpdmVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBkaXNhYmxlIG5vdGlmaWNhdGlvbiBvbiB0aGUgcmVzb3VyY2UgY2hhbmdlIGR1cmluZyByZWZyZXNoIHRvCi0JCQkvLyBhdm9pZCBtYWtpbmcgdGhlIGRpYWdyYW0gZWRpdG9yIGRpcnR5Ci0JCQkvLwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCX0KLQkJCXJlZnJlc2goZGlhZ3JhbUVkaXRQYXJ0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZS5lU2V0RGVsaXZlcihvbGREZWxpdmVyKTsKLQkJCX0KLQkJfQotCQkKLQkJLy8gYXNrIGZvciBpbW1lZGlhdGUgdXBkYXRlIG9mIHRoZSBjb250cm9sIHNvIHRoYXQgdGhlIGRpYWdyYW0gZmlndXJlCi0JCS8vIHdpbGwgYmUgY29tcHV0ZWQKLQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0JCWlmKGVkaXRQYXJ0ICE9IG51bGwpewotCQkJaWYoZGVidWcpewotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlcmF0b3IgPSBlZGl0UGFydC5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJRWRpdFBhcnQgbmFtZSA9IChFZGl0UGFydCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlWaWV3IHZpZXcgPSAoVmlldyluYW1lLmdldE1vZGVsKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbih2aWV3LmdldFR5cGUoKSArIjoiICsgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRMb2NhdGlvbl9YKCkpICsgIiwiICsgVmlld1V0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZSh2aWV3LAotCQkJCQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFRoaXMgY2hlY2sgaXMgbmVlZGVkIGZvciBicm93c2luZywgaW4gb3JkZXIgdG8gcmVuZGVyIGFjdGl2aXR5IGNvbnRyaWJ1dGluZydzCi0JCS8vIGNoaWxkcmVuLiAgSW4gcHJvY2Vzc0F1dGhvcmluZyB3ZSBkb24ndCBkbyByZWFsaXphdGlvbiwgaW4gb3JkZXIgdG8gZGlzcGxheWVkIAotCQkvLyByZWFsaXplZCBlbGVtZW50cywgd2UgaGF2ZSB0byBjbGVhbnVwIEFERCBkaWFncmFtIGFuZCByZWNyZWF0ZS4gbmVlZHRvUmVzZXQgb3IgY2xlYW51cGRpYWdyYW0uCi0JCS8vIE9ubHkgZm9yIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtLgotCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZihvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmIGdldERpYWdyYW1UeXBlKCkgIT0gbnVsbCAmJiAKLQkJCQlnZXREaWFncmFtVHlwZSgpLmVxdWFsc0lnbm9yZUNhc2UoUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCkpewotCQkJaWYoVG5nVXRpbC5oYXNDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KW8pKXsKLQkJCQluZWVkUmVzZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmVlZFJlc2V0KSB7Ci0JCQljbGVhblVwRGlhZ3JhbSgpOwotCQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0JCX0KLQkJSUZpZ3VyZSBmaWd1cmUgPSBnZXRGaWd1cmUoKTsKLQkJaWYgKGZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwotCQkJaWYgKGJvdW5kcy54IDwgMCB8fCBib3VuZHMueSA8IDApIHsKLQkJCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIEFjdGl2aXR5RWRpdFBhcnQpewotCQkJCQkoKEFjdGl2aXR5RWRpdFBhcnQpIGVkaXRQYXJ0KS5tb3ZlRmlndXJlKC1ib3VuZHMueCwgLWJvdW5kcy55KTsKLQkJCQl9Ci0JCQkJcGFyZW50LnBhY2sodHJ1ZSk7Ci0KLQkJCQlib3VuZHMgPSBmaWd1cmUuZ2V0Qm91bmRzKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZWRpdFBhcnQ7Ci0JfQotCi0JCi0JLyoqCi0JICogcmV0dXJucyB7QGxpbmsgRGlhZ3JhbUluZm99Ci0JICogCi0JICovCi0JcHVibGljIERpYWdyYW1JbmZvIGdldERpYWdyYW1JbmZvKCkgewotCQlEaWFncmFtSW5mbyBkaWFncmFtSW5mbyA9IG51bGw7Ci0KLQkJT2JqZWN0IGVsZW1lbnQgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlua2VkT2JqZWN0KSB7Ci0JCQllbGVtZW50ID0gKChMaW5rZWRPYmplY3QpIGVsZW1lbnQpLmdldE9iamVjdCgpOwotCQl9Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KXsKLQkJCSBlbGVtZW50ID0gKChWaWV3KWVsZW1lbnQpLmdldEVsZW1lbnQoKTsKLQkJCWlmKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgRU1vZGVsRWxlbWVudCl7Ci0JCQkJZWxlbWVudCA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KWVsZW1lbnQpOwotCQkJfQotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUpewotCQkJCWVsZW1lbnQgPSAoKE5vZGUpZWxlbWVudCkuZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlkaWFncmFtSW5mbyA9IG5ldyBEaWFncmFtSW5mbyhnZXREaWFncmFtVHlwZSgpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQlsb2FkRGlhZ3JhbUluZm8ocGFydCwgZGlhZ3JhbUluZm8pOwotCQl9Ci0KLQkJcmV0dXJuIGRpYWdyYW1JbmZvOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVEaWFncmFtSW1hZ2UoSW1hZ2VGaWxlRm9ybWF0IGltYWdlRmlsZUZvcm1hdCl7Ci0vLwkJQ29weVRvSW1hZ2VVdGlsIGltID0gbmV3IENvcHlUb0ltYWdlVXRpbCgpOwotCQkvL2ltLmNvcHlUb0ltYWdlKHBhcnQsIGRlc3RpbmF0aW9uLCBmb3JtYXQsIG1vbml0b3IpCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnRGYWN0b3J5IGNyZWF0ZUVkaXRQYXJ0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCWdldEdyYXBoaWNhbFZpZXdlcigpLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKAotCQkJCUNvbG9yQ29uc3RhbnRzLmxpc3RCYWNrZ3JvdW5kKTsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0KLQkJRGlhZ3JhbVJvb3RFZGl0UGFydCByb290ID0gKERpYWdyYW1Sb290RWRpdFBhcnQpIEVkaXRQYXJ0U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJvb3RFZGl0UGFydChnZXREaWFncmFtKCkpOwotLy8JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotLy8JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCQkKLQkJLy8gU2V0IGVkaXRpbmcgZG9tYWluCi0vLwkJRGlhZ3JhbUVkaXREb21haW4gZWRpdERvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLS8vICAgICAgICBlZGl0RG9tYWluLnNldENvbW1hbmRTdGFjaygKLS8vICAgICAgICAgICAgbmV3IERpYWdyYW1Db21tYW5kU3RhY2soZWRpdERvbWFpbikpOwotLy8KLS8vICAgICAgICB2aWV3ZXIuc2V0RWRpdERvbWFpbihlZGl0RG9tYWluKTsKLSAgICAgICAgCi0vLyAgICAgICAgUHJlZmVyZW5jZXNIaW50IHByZWZlcmVuY2VzSGludCA9IERpYWdyYW1JbWFnZVNlcnZpY2UuZ2V0UHJlZmVyZW5jZUhpbnQoCi0vLyAgICAgICAgCQlnZXREaWFncmFtVHlwZSgpKTsKLS8vICAgICAgICBpZiAocm9vdCBpbnN0YW5jZW9mIElEaWFncmFtUHJlZmVyZW5jZVN1cHBvcnQpIHsKLS8vICAgICAgICAgICAgaWYgKHByZWZlcmVuY2VzSGludCA9PSBudWxsKSB7Ci0vLyAgICAgICAgICAgICAgICBwcmVmZXJlbmNlc0hpbnQgPSAoKElEaWFncmFtUHJlZmVyZW5jZVN1cHBvcnQpIHJvb3QpCi0vLyAgICAgICAgICAgICAgICAgICAgLmdldFByZWZlcmVuY2VzSGludCgpOwotLy8gICAgICAgICAgICB9IGVsc2UgewotLy8gICAgICAgICAgICAgICAgKChJRGlhZ3JhbVByZWZlcmVuY2VTdXBwb3J0KSByb290KQotLy8gICAgICAgICAgICAgICAgICAgIC5zZXRQcmVmZXJlbmNlc0hpbnQocHJlZmVyZW5jZXNIaW50KTsKLS8vICAgICAgICAgICAgfQotLy8gICAgICAgICAgICB2aWV3ZXIKLS8vICAgICAgICAgICAgICAgIC5ob29rV29ya3NwYWNlUHJlZmVyZW5jZVN0b3JlKChJUHJlZmVyZW5jZVN0b3JlKSBwcmVmZXJlbmNlc0hpbnQKLS8vICAgICAgICAgICAgICAgICAgICAuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotLy8gICAgICAgIH0KLS8vICAgICAgICAKLS8vICAgICAgICBEaWFncmFtRXZlbnRCcm9rZXIuc3RhcnRMaXN0ZW5pbmcoVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSkpOwotLy8gICAgICAgIHZpZXdlci5zZXRDb250ZW50cyhkaWFncmFtKTsKLQl9Ci0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbSBnZXREaWFncmFtKCl7Ci0JCWlmIChkaWFncmFtID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRpYWdyYW0gPT0gbnVsbCkgewotCQkJCQlPYmplY3QgbyA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJCQlkbWdyID0gRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UoVG5nVXRpbAotCQkJCQkJCQkuZ2V0T3duaW5nUHJvY2VzcyhhY3QpLCB0aGlzKTsKLQkJCQkJCUxpc3Q8RGlhZ3JhbT4gbGlzdCA9IGRtZ3IuZ2V0RGlhZ3JhbXMoYWN0LCBEaWFncmFtSW1hZ2VTZXJ2aWNlCi0JCQkJCQkJCS5nZXRJbnRUeXBlKGdldERpYWdyYW1UeXBlKCkpKTsKLQkJCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlkaWFncmFtID0gKERpYWdyYW0pIGxpc3QuZ2V0KDApOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJEaWFncmFtIGlzIGVtcHR5IGZvciAiICsgYWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ3JlYXRpbmcgZGlhZ3JhbSBvZiAgIiArIGdldERpYWdyYW1UeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRyeSB7Ci0JCQkJCWRpYWdyYW0gPSBkbWdyLmNyZWF0ZURpYWdyYW0oKEFjdGl2aXR5KSBUbmdVdGlsCi0JCQkJCQkJLnVud3JhcCh3cmFwcGVyKSwgRGlhZ3JhbUltYWdlU2VydmljZQotCQkJCQkJCS5nZXRJbnRUeXBlKGdldERpYWdyYW1UeXBlKCkpLCBEaWFncmFtSW1hZ2VTZXJ2aWNlCi0JCQkJCQkJLmdldFByZWZlcmVuY2VIaW50KGdldERpYWdyYW1UeXBlKCkpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IGUgPSBkaWFncmFtLmdldEVsZW1lbnQoKTsKLQkJCQlpZihlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkoKE5vZGUpZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXJFeCgpOwotCQl0aGlzLmdyYXBoaWNhbFZpZXdlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdDw/PiBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCi0JCQlpZiAobyBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQkJcGFydCA9IChHcmFwaGljYWxFZGl0UGFydCkgbzsKLQkJCQlPYmplY3QgbW9kZWwgPSBwYXJ0LmdldE1vZGVsKCk7Ci0JCQkJT2JqZWN0IGUgPSBtb2RlbDsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIExpbmtlZE9iamVjdCkgewotCQkJCQllID0gKChMaW5rZWRPYmplY3QpIGUpLmdldE9iamVjdCgpOwotCQkJCX0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQkJZSA9ICgoVmlldykgZSkuZ2V0RWxlbWVudCgpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikgewotCQkJCQkJCWxvYWREaWFncmFtSW5mbygoR3JhcGhpY2FsRWRpdFBhcnQpIG8sIGRpYWdyYW1JbmZvKTsKLQkJCQkJCX0KLQkJCQkJCWUgPSAoKE5vZGUpIGUpLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJfQotCQkJCQlpZiAoZSAhPSBudWxsICYmIGUgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkJCQllID0gQnJpZGdlSGVscGVyLmdldE1ldGhvZEVsZW1lbnQoKEVNb2RlbEVsZW1lbnQpIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJYm9vbGVhbiBzdXBwcmVzc2VkOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOYW1lZE5vZGUpIHsKLQkJCQkJCXN1cHByZXNzZWQgPSAoKE5hbWVkTm9kZSkgbW9kZWwpLmlzU3VwcHJlc3NlZCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmLmdldEJvdW5kcygpOwotCi0JCQkJCVN0cmluZyBhbHRUYWcgPSBudWxsOwotCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJCQkJYWx0VGFnID0gKChXcmFwTGFiZWwpIGYpLmdldFRleHQoKTsKLQkJCQkJfQotCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwgYm91bmRzLnksCi0JCQkJCQkJYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBhbHRUYWcsIHN1cHByZXNzZWQpOwotCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzdXBlci5kaXNwb3NlKCk7Ci0JCQotCQlpZihkbWdyICE9IG51bGwpewotCQkJZG1nci5yZW1vdmVDb25zdW1lcih0aGlzKTsKLQkJfQotCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCUVPYmplY3QgZSA9IGRpYWdyYW0uZ2V0RWxlbWVudCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkoKE5vZGUpZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaChEaWFncmFtRWRpdFBhcnQgZWRpdFBhcnQpewotCQl0cnkgewotCQkJRGlhZ3JhbUVkaXRvclV0aWwucmVmcmVzaChlZGl0UGFydCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgdHJ1ZSk7Ci0JCQlEaWFncmFtRWRpdG9yVXRpbC5yZWZyZXNoTGFiZWxzKGVkaXRQYXJ0KTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJaWYoZGVidWcpewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgZGlhZ3JhbSByZWZyZXNoIHdoaWxlIHB1Ymxpc2hpbmcgOiAiICsgZSk7CSAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlRGlhZ3JhbUVsZW1lbnQoZmluYWwgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbSBtb2RlbCwgZmluYWwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCAgCi0JCQlmaW5hbCBTdXBwcmVzc2lvbiBzdXAsIGZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgZmluYWwgSUZpbHRlciBmaWx0ZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKG1vZGVsKTsKLQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3AgPSBuZXcgQWJzdHJhY3RFTUZPcGVyYXRpb24oZG9tYWluLCAiIikgewkvLyROT04tTkxTLTEkCi0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkRpYWdyYW0gZCA9IAotCQkJCQkob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbSkgbW9kZWwuZ2V0RWxlbWVudCgpOwotCQkJCWQuc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJCQlpZihmaWx0ZXIgPT0gbnVsbCAmJiBjb25maWd1cmF0aW9uICE9IG51bGwpewotCQkJCQlQcm9jZXNzQ29uZmlndXJhdG9yIHAgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihjb25maWcpOwotCQkJCQlkLnNldEZpbHRlcihwKTsKLQkJCQl9ZWxzZXsKLQkJCQkJZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQl9Ci0JCQkJZC5zZXRMaW5rZWRFbGVtZW50KGVsZW1lbnQpOwotCQkJCQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQkKLQkJfTsKLQkJdHJ5IHsKLQkJCW9wLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCl7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEZXRhaWxEaWFncmFtVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTE3NWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5BY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuc2VydmljZS5EaWFncmFtUmVzZXRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EaWFncmFtQWN0aW9uc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnVpLmFjdGlvbnMuQWN0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5EaWFncmFtRWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZ3JhcGhpY2FsIHZpZXdlciBmb3IgdGhlIEFjdGl2aXR5RGV0YWlsIGRpYWdyYW0uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqLwotcHVibGljIGNsYXNzIE5ld0FjdGl2aXR5RGV0YWlsRGlhZ3JhbVZpZXdlciBleHRlbmRzCi0JCUFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlckV4IHsKLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBOZXdBY3Rpdml0eURldGFpbERpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJc3VwZXIocGFyZW50LCB3cmFwcGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eSBlID0gbnVsbDsKLQkJaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWUgPSAoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQl9IGVsc2UgaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJZSA9IChBY3Rpdml0eSkgd3JhcHBlcjsKLQkJfQotCQlpZihlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJdXBkYXRlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbSwgKE1ldGhvZEVsZW1lbnQpZSwgc3VwLCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJCWZpbHRlciwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlEaWFncmFtRWRpdERvbWFpbiBkb21haW4gPSBuZXcgRGlhZ3JhbUVkaXREb21haW4obnVsbCk7Ci0JCQkoKElEaWFncmFtR3JhcGhpY2FsVmlld2VyKWdyYXBoaWNhbFZpZXdlcikuc2V0RWRpdERvbWFpbihkb21haW4pOwotCQkJcGFydCA9IEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoaWNFZGl0UGFydChkaWFncmFtKTsKLQkJCWlmKHBhcnQgPT0gbnVsbCl7Ci0JCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS4KLQkJCQlsb2dFcnJvcigiUHVibGlzaGluZzogQWN0aXZpdHkgRGV0YWlsIERpYWdyYW0gRWRpdFBhcnQgY3JlYXRpb24gZmFpbGVkIGZvciA6ICIrZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBwYXJ0OwotCQl9Ci0JCXJldHVybiBwYXJ0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BYnN0cmFjdERpYWdyYW1HcmFwaGljYWxWaWV3ZXIjZ2V0RGlhZ3JhbVR5cGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlhZ3JhbVR5cGUoKSB7Ci0JCXJldHVybiBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCX0KLQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjbGVhblVwRGlhZ3JhbSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW5VcERpYWdyYW0oKSB7Ci0JCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRQYXJ0IGRlcCA9IChBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0UGFydCkgZ2V0R3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Q29udGVudHMoKTsKLQkJaWYgKGRlcCAhPSBudWxsKSB7Ci0JCQlkZXAuZ2V0UmVjZW50bHlBZGRlZFBhcnRzKCkuYWRkQWxsKGRlcC5nZXRDaGlsZHJlbigpKTsKLQotCQkJLy8gY2xlYW4gdXAgdGhlIGRpYWdyYW0KLQkJCURlZmF1bHRFZGl0RG9tYWluIGVkaXRpbmdEb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4obnVsbCk7Ci0JCQlBY3Rpb25SZWdpc3RyeSBhY3Rpb25SZWdpc3RyeSA9IG5ldyBBY3Rpb25SZWdpc3RyeSgpOwotCi0JCQlEaWFncmFtQWN0aW9uc1NlcnZpY2UgYWN0aW9uU2VydmljZSA9IG5ldyBEaWFncmFtQWN0aW9uc1NlcnZpY2UoCi0JCQkJCWRtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLCBnZXRHcmFwaGljYWxWaWV3ZXIoKSwKLQkJCQkJZWRpdGluZ0RvbWFpbiwgYWN0aW9uUmVnaXN0cnkpOwotCQkJYWN0aW9uU2VydmljZS5yZWdpc3RlclZlcnRpY2FsQWxpZ25GaXJzdFNlbGVjdGVkQWN0aW9uKCk7Ci0KLQkJCURpYWdyYW1SZXNldFNlcnZpY2Ugc2VydmljZSA9IG5ldyBEaWFncmFtUmVzZXRTZXJ2aWNlKGRtZ3IKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgZ2V0R3JhcGhpY2FsVmlld2VyKCksIGVkaXRpbmdEb21haW4sCi0JCQkJCWFjdGlvblJlZ2lzdHJ5KTsKLQkJCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsKLQkJCS8vIFRPRE86IG5lZWQgdG8gaW1wcm92ZSB0aGlzIGZ1bmN0aW9uLiBIYXZlIHRvIGNhbGwgaXQgdHdpY2UgcmlnaHQgbm93Ci0JCQkvLyBzbyBpdCBjYW4gbGF5b3V0IHRoZSBkaWFncmFtIGNvcnJlY3RseS4KLQkJCXNlcnZpY2UuY2xlYW5VcERpYWdyYW0oKTsJCQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld0FjdGl2aXR5RGlhZ3JhbVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWRjYjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS91aS92aWV3ZXIvTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkudmlld2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5EZWxlZ2F0aW5nTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYXllcmVkUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5pbXBsLkludGVybmFsVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJ0aXRpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5BY3Rpdml0eURpYWdyYW1BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5HcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBncmFwaGljYWwgdmlld2VyIGZvciB0aGUgQWN0aXZpdHkgZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXggewotCi0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgTmV3QWN0aXZpdHlEaWFncmFtVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCBhY3QpIHsKLQkJc3VwZXIocGFyZW50LGFjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNjcmVhdGVFZGl0UGFydChqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJQWN0aXZpdHkgZSA9IG51bGw7Ci0JCUFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmICh3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQllID0gKEFjdGl2aXR5KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCWFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlEaWFncmFtQWRhcHRlcigKLQkJCQkJKEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgd3JhcHBlcik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZSA9IChBY3Rpdml0eSkgd3JhcHBlcjsKLQkJCQlhZGFwdGVyID0gbmV3IEFjdGl2aXR5RGlhZ3JhbUFkYXB0ZXIoZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlhZGFwdGVyLnNldFZpZXcoZGlhZ3JhbSk7Ci0JCQkJYWRhcHRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlhZGFwdGVyLnNldFN1cHByZXNzaW9uKHN1cCk7Ci0JCQkJYWRhcHRlci5zZXRFZGl0aW5nRG9tYWluKChJbnRlcm5hbFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKSBUcmFuc2FjdGlvblV0aWwKLQkJCQkJCQkJLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbS5nZXRFbGVtZW50KCkpKTsKLQkJCQlkaWFncmFtLmdldEVsZW1lbnQoKS5lQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCQkJRGlhZ3JhbUVkaXREb21haW4gZG9tYWluID0gbmV3IERpYWdyYW1FZGl0RG9tYWluKG51bGwpOwotCQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGdyYXBoaWNhbFZpZXdlcikKLQkJCQkJCS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQkJcGFydCA9IEVkaXRQYXJ0U2VydmljZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUdyYXBoaWNFZGl0UGFydCgKLQkJCQkJCWRpYWdyYW0pOwotCQkJCWlmIChwYXJ0ID09IG51bGwpIHsKLQkJCQkJRGlhZ3JhbVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkiUHVibGlzaGluZzogQWN0aXZpdHkgRGlhZ3JhbSBFZGl0UGFydCBjcmVhdGlvbiBmYWlsZWQgZm9yIDogIgkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrIGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gcGFydDsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy5nZWYudmlld2VyLkFic3RyYWN0RGlhZ3JhbUdyYXBoaWNhbFZpZXdlciNnZXREaWFncmFtVHlwZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaWFncmFtVHlwZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRGlhZ3JhbUluZm8oR3JhcGhpY2FsRWRpdFBhcnQgcGFydCwgRGlhZ3JhbUluZm8gZGlhZ3JhbUluZm8pIHsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcnQuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBBY3Rpdml0eVBhcnRpdGlvbkVkaXRQYXJ0KQotCQkJewotCQkJCUFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQgcGFydGl0aW9uID0gKEFjdGl2aXR5UGFydGl0aW9uRWRpdFBhcnQpIG87Ci0JCQkJTGlzdCBwYXJ0aXRpb25DaGlsZHJlbiA9IHBhcnRpdGlvbi5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHBhcnRpdGlvbkNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCU9iamVjdCBvMSA9IGkubmV4dCgpOwotCQkJCQlpZiAobzEgaW5zdGFuY2VvZiBHcmFwaGljYWxFZGl0UGFydCl7Ci0JCQkJCQlsb2FkRGlhZ3JhbUluZm8oKEdyYXBoaWNhbEVkaXRQYXJ0KSBvMSwgZGlhZ3JhbUluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgR3JhcGhpY2FsRWRpdFBhcnQpIHsKLQkJCQlwYXJ0ID0gKEdyYXBoaWNhbEVkaXRQYXJ0KSBvOwotCQkJCU9iamVjdCBtb2RlbCA9IHBhcnQuZ2V0TW9kZWwoKTsKLQkJCQlPYmplY3QgZSA9IG1vZGVsOwotCQkJCQotCQkJCWlmKGUgaW5zdGFuY2VvZiBWaWV3KXsKLQkJCQkJRU1vZGVsRWxlbWVudCBleCA9IChFTW9kZWxFbGVtZW50KSgoVmlldyllKS5nZXRFbGVtZW50KCk7Ci0JCQkJCWlmKGV4ICE9IG51bGwpewotCQkJCQkJZSA9IEJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJYm9vbGVhbiBzdXBwcmVzc2VkOwotCQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlzdXBwcmVzc2VkID0gKChNZXRob2RFbGVtZW50KUJyaWRnZUhlbHBlci5nZXRNZXRob2RFbGVtZW50KChFTW9kZWxFbGVtZW50KSgoTm9kZSltb2RlbCkuZ2V0RWxlbWVudCgpKSkuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJc3VwcHJlc3NlZCA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0U3VwcHJlc3NlZCgpCi0JCQkJCQkJCS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCUlGaWd1cmUgZiA9IHBhcnQuZ2V0RmlndXJlKCk7Ci0JCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBmLmdldEJvdW5kcygpOwotCi0JCQkJCVN0cmluZyBhbHRUYWcgPSBudWxsOwotCQkJCQlpZiAoZiBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJCQkJYWx0VGFnID0gKChXcmFwTGFiZWwpIGYpLmdldFRleHQoKTsKLQkJCQkJfQotCQkJCQlkaWFncmFtSW5mby5hZGRBcmVhKChNZXRob2RFbGVtZW50KSBlLCBib3VuZHMueCwKLQkJCQkJCWJvdW5kcy55LCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQsIGFsdFRhZywgc3VwcHJlc3NlZCk7Ci0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlkaWFncmFtSW5mby5hZGRHcmFwaGljYWxOb2RlcygpOwotCQkJfSAKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVHcmFwaGljYWxWaWV3ZXIoKSB7Ci0JCXRoaXMuZ3JhcGhpY2FsVmlld2VyID0gbmV3IERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKTsKLQkJdGhpcy5ncmFwaGljYWxWaWV3ZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQljb25maWd1cmVHcmFwaGljYWxWaWV3ZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCkgewotCQlnZXRHcmFwaGljYWxWaWV3ZXIoKS5nZXRDb250cm9sKCkuc2V0QmFja2dyb3VuZCgKLQkJCQlDb2xvckNvbnN0YW50cy5saXN0QmFja2dyb3VuZCk7Ci0JCURpYWdyYW1HcmFwaGljYWxWaWV3ZXIgdmlld2VyID0gKERpYWdyYW1HcmFwaGljYWxWaWV3ZXIpIGdldEdyYXBoaWNhbFZpZXdlcigpOwotCi0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBFZGl0UGFydFNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSb290RWRpdFBhcnQoZ2V0RGlhZ3JhbSgpKTsKLQkJTGF5ZXJlZFBhbmUgcHJpbnRhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlBSSU5UQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIGV4dExhYmVsc0xheWVyID0gbmV3IEZyZWVmb3JtTGF5ZXIoKTsKLQkJZXh0TGFiZWxzTGF5ZXIuc2V0TGF5b3V0TWFuYWdlcihuZXcgRGVsZWdhdGluZ0xheW91dCgpKTsKLS8vCQlwcmludGFibGVMYXllcnMuYWRkTGF5ZXJBZnRlcihleHRMYWJlbHNMYXllciwKLS8vCQkJCVVNTEVkaXRQYXJ0RmFjdG9yeS5FWFRFUk5BTF9OT0RFX0xBQkVMU19MQVlFUiwKLS8vCQkJCUxheWVyQ29uc3RhbnRzLlBSSU1BUllfTEFZRVIpOwotCQlMYXllcmVkUGFuZSBzY2FsYWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5TQ0FMQUJMRV9MQVlFUlMpOwotCQlGcmVlZm9ybUxheWVyIHNjYWxlZEZlZWRiYWNrTGF5ZXIgPSBuZXcgRnJlZWZvcm1MYXllcigpOwotCQlzY2FsZWRGZWVkYmFja0xheWVyLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzY2FsYWJsZUxheWVycy5hZGRMYXllckFmdGVyKHNjYWxlZEZlZWRiYWNrTGF5ZXIsCi0JCQkJTGF5ZXJDb25zdGFudHMuU0NBTEVEX0ZFRURCQUNLX0xBWUVSLAotCQkJCURpYWdyYW1Sb290RWRpdFBhcnQuREVDT1JBVElPTl9VTlBSSU5UQUJMRV9MQVlFUik7Ci0JCXZpZXdlci5zZXRSb290RWRpdFBhcnQocm9vdCk7Ci0JCXZpZXdlci5zZXRFZGl0UGFydEZhY3RvcnkoY3JlYXRlRWRpdFBhcnRGYWN0b3J5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3VpL3ZpZXdlci9OZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiYmRkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdWkvdmlld2VyL05ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS52aWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuRGlhZ3JhbVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5EaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuTGF5ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbVJvb3RFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1FZGl0RG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtR3JhcGhpY2FsVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMuZWRpdHBhcnQuRWRpdFBhcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVGhlIGdyYXBoaWNhbCB2aWV3ZXIgZm9yIHRoZSBXb3JrUHJvZHVjdCBEZXBlbmRlbmN5IGRpYWdyYW0uCi0gKiAgCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdXUERlcGVuZGVuY3lEaWFncmFtVmlld2VyIGV4dGVuZHMKLQkJQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyRXggewotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICovCi0JcHVibGljIE5ld1dQRGVwZW5kZW5jeURpYWdyYW1WaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgT2JqZWN0IHdyYXBwZXIpIHsKLQkJc3VwZXIocGFyZW50LCB3cmFwcGVyKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2NyZWF0ZUVkaXRQYXJ0KGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciwgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFZGl0UGFydCBjcmVhdGVFZGl0UGFydChPYmplY3Qgd3JhcHBlciwgSUZpbHRlciBmaWx0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQlBY3Rpdml0eSBlID0gbnVsbDsKLQkJaWYod3JhcHBlciBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcil7Ci0JCQllID0gKEFjdGl2aXR5KVRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQl9ZWxzZSBpZih3cmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJZSA9IChBY3Rpdml0eSl3cmFwcGVyOwotCQl9Ci0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQl1cGRhdGVEaWFncmFtRWxlbWVudChkaWFncmFtLCAoTWV0aG9kRWxlbWVudCllLCBzdXAsIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJZmlsdGVyLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCURpYWdyYW1FZGl0RG9tYWluIGRvbWFpbiA9IG5ldyBEaWFncmFtRWRpdERvbWFpbihudWxsKTsKLQkJCSgoSURpYWdyYW1HcmFwaGljYWxWaWV3ZXIpZ3JhcGhpY2FsVmlld2VyKS5zZXRFZGl0RG9tYWluKGRvbWFpbik7Ci0JCQlwYXJ0ID0gRWRpdFBhcnRTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlR3JhcGhpY0VkaXRQYXJ0KGRpYWdyYW0pOwotCQkJaWYocGFydCA9PSBudWxsKXsKLQkJCQlEaWFncmFtVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLgotCQkJCWxvZ0Vycm9yKCJQdWJsaXNoaW5nOiBXb3JrUHJvZHVjdCBEaWFncmFtIEVkaXRQYXJ0IGNyZWF0aW9uIGZhaWxlZCBmb3IgOiAiK2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gcGFydDsKLQkJfQotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi52aWV3ZXIuQWJzdHJhY3REaWFncmFtR3JhcGhpY2FsVmlld2VyI2dldERpYWdyYW1UeXBlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWdyYW1UeXBlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlciB2aWV3ZXIgPSAoRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZ2V0R3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBFZGl0UGFydFNlcnZpY2UKLQkJLmdldEluc3RhbmNlKCkuY3JlYXRlUm9vdEVkaXRQYXJ0KGdldERpYWdyYW0oKSk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQkJdmlld2VyLnNldFJvb3RFZGl0UGFydChyb290KTsKLQkJdmlld2VyLnNldEVkaXRQYXJ0RmFjdG9yeShjcmVhdGVFZGl0UGFydEZhY3RvcnkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGI2MTUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIHBsdWctaW4KLQotIyBUdXJuIG9uIGdlbmVyYWwgZGVidWdnaW5nIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2RlYnVnPWZhbHNlCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgb2YgdmlzdWFsSUQgcHJvY2Vzc2luZwotb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9kZWJ1Zy92aXN1YWxJRD10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1N2FlNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZTc4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMsIAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS51aS5pZGUsCi0gb3JnLmVjbGlwc2UudWkudmlld3MsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWksCi0gb3JnLmVjbGlwc2UuZ2VmO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5wcm9wZXJ0aWVzLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWksCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZywKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3BlcnRpZXMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMsCi0gb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuaWRlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvciwKLSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi51bWE7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5kcmF3MmQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOTJkYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2RpYWdyYW0vd29ya3Byb2R1Y3RkZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZGlhZ3JhbS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZGlhZ3JhbS93b3JrcHJvZHVjdGRlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2R0b29sMTYvV1BEREVkaXRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZHRvb2wxNi9XUERERWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVmNWM3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvZHRvb2wxNi9XUERERWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9ldG9vbDE2L1dQRERFZGl0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2V0b29sMTYvV1BEREVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NjEyZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL2V0b29sMTYvV1BEREVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY3NmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvTW9kZWxEaWFncmFtRmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL29iajE2L1VtYURpYWdyYW1GaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvVW1hRGlhZ3JhbUZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTIyOWNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvb2JqMTYvVW1hRGlhZ3JhbUZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGY4NWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld01vZGVsV2l6YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld1VtYVdpemFyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL3dpemJhbi9OZXdVbWFXaXphcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzA1YjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvd2l6YmFuL05ld1VtYVdpemFyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21lc3NhZ2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDIyNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVE9ETzogbWFudWFsbHkgcHV0IGtleXMgYW5kIHZhbHVlcwotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZT1FcnJvcgotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlPUZhaWxlZCB0byBsb2FkIG1vZGVsIGZpbGUgezB9Ci1EaWFncmFtRGlhZ3JhbUVkaXRvclV0aWxfQ3JlYXRlRGlhZ3JhbVByb2dyZXNzVGFzaz1DcmVhdGluZyBkaWFncmFtIGFuZCBtb2RlbCBmaWxlcwotRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw9Q3JlYXRpbmcgZGlhZ3JhbSBhbmQgbW9kZWwKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZT1VcGRhdGluZyBjYWNoZSBmYWlsZWQKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2hhbmRsZUVsZW1lbnRDb250ZW50Q2hhbmdlZD1GYWlsZWQgdG8gcmVmcmVzaCBoaWVyYXJjaHkgZm9yIGNoYW5nZWQgcmVzb3VyY2UKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3I9ezF9Ci1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yPVVuYWJsZSB0byBsb2FkIGRpYWdyYW0gcmVzb3VyY2UKLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcj1EaWFncmFtIGlzIG5vdCBwcmVzZW50IGluIHJlc291cmNlCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yPUVycm9yIGxvYWRpbmcgZGlhZ3JhbQotRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yPVRoZSBmaWxlIGhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIGZpbGUgc3lzdGVtCi1EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s9U2F2aW5nIGRpYWdyYW0KLURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1NhdmVOZXh0UmVzb3VyY2VUYXNrPVNhdmluZyB7MH0KLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlUmVzb3VyY2VFcnJvckRpYWxvZ1RpdGxlPUVycm9yCi1EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlPU1vZGVsIGZpbGUgbG9hZGluZyBmYWlsZWQKLURpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fSW5pdERpYWdyYW1GaWxlV2l6YXJkVGl0bGU9SW5pdGlhbGl6ZSBuZXcgezB9IGRpYWdyYW0gZmlsZQotRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9PcGVuTW9kZWxGaWxlRGlhbG9nVGl0bGU9U2VsZWN0IGRvbWFpbiBtb2RlbAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWU9SW5pdGlhbGl6ZSBuZXcgZGlhZ3JhbSBmaWxlCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGU9RGlhZ3JhbSBmaWxlCi1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBkaWFncmFtIGJhc2VkIG9uIHswfSBtb2RlbCBjb250ZW50Ci1EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudAotRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlVGl0bGU9RGlhZ3JhbSByb290IGVsZW1lbnQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZURlc2NyaXB0aW9uPVNlbGVjdCBzZW1hbnRpYyBtb2RlbCBlbGVtZW50IHRvIGJlIGRlcGljdGVkIG9uIGRpYWdyYW0KLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVNlbGVjdGlvblRpdGxlPVNlbGVjdCBkaWFncmFtIHJvb3QgZWxlbWVudDoKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZT1EaWFncmFtIHJvb3QgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlPUludmFsaWQgZGlhZ3JhbSByb290IGVsZW1lbnQgaXMgc2VsZWN0ZWQKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQ9SW5pdGlhbGl6aW5nIGRpYWdyYW0gY29udGVudHMKLURpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I9SW5jb3JyZWN0IG1vZGVsIG9iamVjdCBzdG9yZWQgYXMgYSByb290IHJlc291cmNlIG9iamVjdAotTW9kZWwxR3JvdXBfdGl0bGU9bW9kZWwKLUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF90aXRsZT1Db250cm9sIEZsb3cKLUNvbnRyb2xGbG93MUNyZWF0aW9uVG9vbF9kZXNjPUNyZWF0ZSBuZXcgQ29udHJvbCBGbG93Ci1Xb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sX3RpdGxlPVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi1Xb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sX2Rlc2M9Q3JlYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCi1Db21tYW5kTmFtZV9PcGVuRGlhZ3JhbT1PcGVuIERpYWdyYW0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEVORCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkZmQxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mZ2VuCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ2VuOkdlbkVkaXRvckdlbmVyYXRvciB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmdtZmdlbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9HZW5Nb2RlbCIgcGFja2FnZU5hbWVQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiCi0gICAgbW9kZWxJRD0iV1BERCIKLSAgICBzYW1lRmlsZUZvckRpYWdyYW1BbmRNb2RlbD0idHJ1ZSIKLSAgICBkaWFncmFtRmlsZUV4dGVuc2lvbj0id3BkZCI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBpY29uUHJvdmlkZXJQcmlvcml0eT0iTG93IgotICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3kiPgotICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0RpYWdyYW0iLz4KLSAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdEhlbHBlciIvPgotICAgIDx2aWV3bWFwCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmlndXJlVmlld21hcCIKLSAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllciIvPgotICAgIDxkb21haW5EaWFncmFtRWxlbWVudAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSIvPgotICAgIDx0b3BMZXZlbE5vZGVzCi0gICAgICAgIHZpc3VhbElEPSIxMDAxIgotICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQiCi0gICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZVZpZXdGYWN0b3J5IgotICAgICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgICBncmFwaGljYWxOb2RlRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kiPgotICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICA8ZWxlbWVudFR5cGUKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlRmlndXJlIgotICAgICAgICAgIGNsYXNzQm9keT0iJiN4RDsmI3hBOyYjeEQ7JiN4QTsvKiomI3hEOyYjeEE7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsgKi8mI3hEOyYjeEE7cHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBleHRlbmRzIG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmUgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSgpIHsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEQ7JiN4QTsmI3g5OyYjeDk7Y3JlYXRlQ29udGVudHMoKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCl7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7JiN4RDsmI3hBO2ZpZ18wLnNldFRleHQoJnF1b3Q7TmV3IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yJnF1b3Q7KTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3NldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUoZmlnXzApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTtPYmplY3QgbGF5RGF0YTAgPSBudWxsOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZOYW1lZE5vZGVOYW1lRmlndXJlOyAmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSgpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBmTmFtZWROb2RlTmFtZUZpZ3VyZTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWcpeyYjeEQ7JiN4QTsmI3g5OyYjeDk7Zk5hbWVkTm9kZU5hbWVGaWd1cmUgPSBmaWc7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldD4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0Tm9kZSIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8bGFiZWxzCi0gICAgICAgICAgdmlzdWFsSUQ9IjQwMDEiCi0gICAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkiCi0gICAgICAgICAgZWxlbWVudEljb249InRydWUiPgotICAgICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgICA8dmlld21hcAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpQYXJlbnRBc3NpZ25lZFZpZXdtYXAiCi0gICAgICAgICAgICBnZXR0ZXJOYW1lPSJnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlIgotICAgICAgICAgICAgZmlndXJlUXVhbGlmaWVkQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwiLz4KLSAgICAgICAgPG1vZGVsRmFjZXQKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46RmVhdHVyZUxhYmVsTW9kZWxGYWNldCIKLSAgICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZQotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtWaWV3RmFjdG9yeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJMaW5rRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIExpbmtGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluayIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9IkxpbmtOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua05hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIExpbmtOYW1lRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlCi0gICAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC9saW5rcz4KLSAgICA8cGFsZXR0ZT4KLSAgICAgIDxncm91cHMKLSAgICAgICAgICB0aXRsZT0ibW9kZWwiPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iQ29udHJvbCBGbG93IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgQ29udHJvbCBGbG93IgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3BhbDE2LmdpZiIKLSAgICAgICAgICAgIGdlbkxpbmtzPSIvL0BkaWFncmFtL0BsaW5rcy4wIi8+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIgotICAgICAgICAgICAgc21hbGxJY29uUGF0aD0iL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIgotICAgICAgICAgICAgZ2VuTm9kZXM9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgICAgPC9ncm91cHM+Ci0gICAgPC9wYWxldHRlPgotICA8L2RpYWdyYW0+Ci0gIDxwbHVnaW4KLSAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIgotICAgICAgbmFtZT0iV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbSBQbHVnaW4iCi0gICAgICBwcm92aWRlcj0iRVBGIgotICAgICAgcHJpbnRpbmdFbmFibGVkPSJ0cnVlIgotICAgICAgYWN0aXZhdG9yQ2xhc3NOYW1lPSJXUEREaWFncmFtRWRpdG9yUGx1Z2luIi8+Ci0gIDxlZGl0b3IKLSAgICAgIGNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvciIvPgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLyIvPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZmdyYXBoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZmdyYXBoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjVkMjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZncmFwaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mZ3JhcGg6Q2FudmFzIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ3JhcGg9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR3JhcGhpY2FsRGVmaW5pdGlvbiIgbmFtZT0ibW9kZWwiPgotICA8ZmlndXJlcwotICAgICAgbmFtZT0iRGVmYXVsdCI+Ci0gICAgPGZpZ3VyZXMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOlBvbHlsaW5lQ29ubmVjdGlvbiIKLSAgICAgICAgcmVmZXJlbmNpbmdFbGVtZW50cz0iTGluayIKLSAgICAgICAgbmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgdGFyZ2V0RGVjb3JhdGlvbj0iT3BlbkFycm93Ij4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZncmFwaDpQb2x5bGluZURlY29yYXRpb24iCi0gICAgICAgICAgbmFtZT0iT3BlbkFycm93Ij4KLSAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICB4PSItMSIKLSAgICAgICAgICAgIHk9IjEiLz4KLSAgICAgICAgPHRlbXBsYXRlLz4KLSAgICAgICAgPHRlbXBsYXRlCi0gICAgICAgICAgICB4PSItMSIKLSAgICAgICAgICAgIHk9Ii0xIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9IkxpbmtOYW1lIgotICAgICAgICAgIG5hbWU9IkxpbmtOYW1lRmlndXJlIgotICAgICAgICAgIHRleHQ9IiIvPgotICAgIDwvZmlndXJlcz4KLSAgICA8ZmlndXJlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ3JhcGg6UmVjdGFuZ2xlIgotICAgICAgICByZWZlcmVuY2luZ0VsZW1lbnRzPSJXb3JrUHJvZHVjdE5vZGUiCi0gICAgICAgIG5hbWU9IldvcmtQcm9kdWN0Tm9kZUZpZ3VyZSIKLSAgICAgICAgb3V0bGluZT0iZmFsc2UiPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdyYXBoOkxhYmVsIgotICAgICAgICAgIHJlZmVyZW5jaW5nRWxlbWVudHM9Ik5hbWVkTm9kZU5hbWUiCi0gICAgICAgICAgbmFtZT0iTmFtZWROb2RlTmFtZUZpZ3VyZSIKLSAgICAgICAgICB0ZXh0PSJOZXcgV29yayBQcm9kdWN0IERlc2NyaXB0b3IiLz4KLSAgICA8L2ZpZ3VyZXM+Ci0gIDwvZmlndXJlcz4KLSAgPG5vZGVzCi0gICAgICBuYW1lPSJXb3JrUHJvZHVjdE5vZGUiCi0gICAgICBmaWd1cmU9IldvcmtQcm9kdWN0Tm9kZUZpZ3VyZSIvPgotICA8Y29ubmVjdGlvbnMKLSAgICAgIG5hbWU9IkxpbmsiCi0gICAgICBmaWd1cmU9IkxpbmtGaWd1cmUiLz4KLSAgPGxhYmVscwotICAgICAgbmFtZT0iTGlua05hbWUiCi0gICAgICBmaWd1cmU9IkxpbmtOYW1lRmlndXJlIi8+Ci0gIDxsYWJlbHMKLSAgICAgIG5hbWU9Ik5hbWVkTm9kZU5hbWUiCi0gICAgICBmaWd1cmU9Ik5hbWVkTm9kZU5hbWVGaWd1cmUiLz4KLTwvZ21mZ3JhcGg6Q2FudmFzPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZC5nbWZtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZDlmNGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mbWFwOk1hcHBpbmcgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnbWZtYXA9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvbWFwcGluZ3MiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHZpZXdQYXR0ZXJuPSIiPgotICAgICAgICA8ZGlhZ3JhbUxhYmVsCi0gICAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI05hbWVkTm9kZU5hbWUiLz4KLSAgICAgICAgPGZlYXR1cmVzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTmFtZWROb2RlL25hbWUiLz4KLSAgICAgIDwvbGFiZWxNYXBwaW5ncz4KLSAgICAgIDxjb250ZXh0TWVudQotICAgICAgICAgIGhyZWY9IndwZGQuZ21mdG9vbCMvL0BhbGxNZW51cy4wIi8+Ci0gICAgICA8dG9vbAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZS9AdG9vbHMuMC9AdG9vbHMuMSIvPgotICAgICAgPGRpYWdyYW1Ob2RlCi0gICAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNXb3JrUHJvZHVjdE5vZGUiLz4KLSAgICA8L293bmVkQ2hpbGQ+Ci0gIDwvbm9kZXM+Ci0gIDxsaW5rcz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL0xpbmsiLz4KLSAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI0xpbmtOYW1lIi8+Ci0gICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9uYW1lIi8+Ci0gICAgPC9sYWJlbE1hcHBpbmdzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDx0b29sCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNMaW5rIi8+Ci0gICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgPC9saW5rcz4KLSAgPGRpYWdyYW0+Ci0gICAgPGRpYWdyYW1DYW52YXMKLSAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNtb2RlbCIvPgotICAgIDxkb21haW5Nb2RlbAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8iLz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZSIvPgotICA8L2RpYWdyYW0+Ci08L2dtZm1hcDpNYXBwaW5nPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkLmdtZnRvb2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mdG9vbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI5NzkyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQuZ21mdG9vbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z21mdG9vbDpUb29sUmVnaXN0cnkgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZ0b29sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L1Rvb2xEZWZpbml0aW9uIj4KLSAgPGFsbE1lbnVzCi0gICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDb250ZXh0TWVudSIKLSAgICAgIGRlZmF1bHQ9Ii8vQGFsbE1lbnVzLjAvQGl0ZW1zLjAiPgotICAgIDxpdGVtcwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpNZW51QWN0aW9uIgotICAgICAgICB0aXRsZT0iV29ya1Byb2R1Y3QgTm9kZSIKLSAgICAgICAga2luZD0iQ1VTVE9NIgotICAgICAgICBob3RLZXk9IkFMVCtXIi8+Ci0gIDwvYWxsTWVudXM+Ci0gIDxwYWxldHRlPgotICAgIDx0b29scwotICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpUb29sR3JvdXAiCi0gICAgICAgIHRpdGxlPSJtb2RlbCI+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciPgotICAgICAgICA8c21hbGxJY29uCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpCdW5kbGVJbWFnZSIKLSAgICAgICAgICAgIHBhdGg9Imljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgICA8dG9vbHMKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgdGl0bGU9IldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIgotICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIj4KLSAgICAgICAgPHNtYWxsSWNvbgotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZnRvb2w6QnVuZGxlSW1hZ2UiCi0gICAgICAgICAgICBwYXRoPSJpY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBidW5kbGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQiLz4KLSAgICAgIDwvdG9vbHM+Ci0gICAgPC90b29scz4KLSAgPC9wYWxldHRlPgotPC9nbWZ0b29sOlRvb2xSZWdpc3RyeT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDIuZ21mZ2VuIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZnZW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1N2UwY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMi5nbWZnZW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6Z21mZ2VuPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi8yMDA1L0dlbk1vZGVsLzIuMCI+Ci0gIDxkaWFncmFtCi0gICAgICB2aXN1YWxJRD0iNzkiCi0gICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0IgotICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3RvcnkiCi0gICAgICBjYW5vbmljYWxFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgIGljb25Qcm92aWRlclByaW9yaXR5PSJMb3ciCi0gICAgICB2YWxpZGF0aW9uUHJvdmlkZXJQcmlvcml0eT0iTG93Ij4KLSAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9EaWFncmFtIi8+Ci0gICAgPGVsZW1lbnRUeXBlCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgZWRpdEhlbHBlckNsYXNzTmFtZT0iV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIiLz4KLSAgICA8dmlld21hcAotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZpZ3VyZVZpZXdtYXAiCi0gICAgICAgIGZpZ3VyZVF1YWxpZmllZENsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZHJhdzJkLkZyZWVmb3JtTGF5ZXIiLz4KLSAgICA8ZG9tYWluRGlhZ3JhbUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8dG9wTGV2ZWxOb2RlcwotICAgICAgICB2aXN1YWxJRD0iMTAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0IgotICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeSIKLSAgICAgICAgY2Fub25pY2FsRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeSIKLSAgICAgICAgZ3JhcGhpY2FsTm9kZUVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IgotICAgICAgICBjcmVhdGVDb21tYW5kQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kIj4KLSAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vTm9kZSIvPgotICAgICAgPGVsZW1lbnRUeXBlCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpNZXRhbW9kZWxUeXBlIgotICAgICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIiLz4KLSAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpJbm5lckNsYXNzVmlld21hcCIKLSAgICAgICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUoKSB7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5O3RoaXMuc2V0RmlsbCh0cnVlKTsmI3hBO3RoaXMuc2V0RmlsbFhPUihmYWxzZSk7JiN4QTt0aGlzLnNldE91dGxpbmUoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4QTsmI3g5O30mI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEE7JiN4QTsmI3hBOyYjeEE7b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIG5hbWVkTm9kZU5hbWVGaWd1cmUwID0gbmV3IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCgpOyYjeEE7bmFtZWROb2RlTmFtZUZpZ3VyZTAuc2V0VGV4dCgmcXVvdDtOZXcgV29yayBQcm9kdWN0IERlc2NyaXB0b3ImcXVvdDspOyYjeEE7JiN4QTt0aGlzLmFkZChuYW1lZE5vZGVOYW1lRmlndXJlMCk7JiN4QTtzZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKG5hbWVkTm9kZU5hbWVGaWd1cmUwKTsmI3hBOyYjeEE7JiN4OTt9JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmTmFtZWROb2RlTmFtZUZpZ3VyZTsgJiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZk5hbWVkTm9kZU5hbWVGaWd1cmU7JiN4QTsmI3g5O30mI3hBOyYjeDk7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnKXsmI3hBOyYjeDk7JiN4OTtmTmFtZWROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hBOyYjeDk7fSYjeEE7JiN4QTsmI3hBOyYjeEE7JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsmI3hBOyYjeEE7JiN4OTsvKiomI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEE7JiN4OTsgKi8mI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3Byb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hBOyYjeDk7fSYjeEE7JiN4QTt9JiN4QTsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtWaWV3RmFjdG9yeSIKLSAgICAgICAgY3JlYXRlQ29tbWFuZENsYXNzTmFtZT0iTGlua0NyZWF0ZUNvbW1hbmQiCi0gICAgICAgIHJlb3JpZW50Q29tbWFuZENsYXNzTmFtZT0iTGlua1Jlb3JpZW50Q29tbWFuZCI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJMaW5rRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEE7LyoqJiN4QTsgKiBAZ2VuZXJhdGVkJiN4QTsgKi8mI3hBO3B1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEE7JiN4QTsmI3g5Oy8qKiYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4QTsmI3g5OyAqLyYjeEE7JiN4OTtwdWJsaWMgTGlua0ZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldEZpbGwodHJ1ZSk7JiN4QTt0aGlzLnNldEZpbGxYT1IoZmFsc2UpOyYjeEE7dGhpcy5zZXRPdXRsaW5lKHRydWUpOyYjeEE7dGhpcy5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO3RoaXMuc2V0TGluZVdpZHRoKDEpOyYjeEE7dGhpcy5zZXRMaW5lU3R5bGUob3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzLkxJTkVfU09MSUQpOyYjeEE7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEE7JiN4OTt9JiN4QTsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3ByaXZhdGUgb3JnLmVjbGlwc2UuZHJhdzJkLlJvdGF0YWJsZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uIGRmID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24oKTsmI3hBO2RmLnNldEZpbGwodHJ1ZSk7JiN4QTtkZi5zZXRGaWxsWE9SKGZhbHNlKTsmI3hBO2RmLnNldE91dGxpbmUodHJ1ZSk7JiN4QTtkZi5zZXRPdXRsaW5lWE9SKGZhbHNlKTsmI3hBO2RmLnNldExpbmVXaWR0aCgxKTsmI3hBO2RmLnNldExpbmVTdHlsZShvcmcuZWNsaXBzZS5kcmF3MmQuR3JhcGhpY3MuTElORV9TT0xJRCk7JiN4QTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hBO3BsLmFkZFBvaW50KGdldE1hcE1vZGUoKS5EUHRvTFAoLTEpJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMSkmI3hBOyk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKDApJiN4QTssIGdldE1hcE1vZGUoKS5EUHRvTFAoMCkmI3hBOyk7JiN4QTtwbC5hZGRQb2ludChnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7LCBnZXRNYXBNb2RlKCkuRFB0b0xQKC0xKSYjeEE7KTsmI3hBO2RmLnNldFRlbXBsYXRlKHBsKTsmI3hBO2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNykmI3hBOywgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSYjeEE7KTsmI3hBOyYjeDk7JiN4OTtyZXR1cm4gZGY7JiN4QTsmI3g5O30mI3hBOyYjeEE7fSYjeEE7JiN4QTsiPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPHJlcXVpcmVkUGx1Z2luSURzPm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aTwvcmVxdWlyZWRQbHVnaW5JRHM+Ci0gICAgICA8L3ZpZXdtYXA+Ci0gICAgICA8bW9kZWxGYWNldAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZUxpbmtNb2RlbEZhY2V0Ij4KLSAgICAgICAgPG1ldGFDbGFzcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsiLz4KLSAgICAgICAgPGNvbnRhaW5tZW50TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPGNoaWxkTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Ob2RlL291dGdvaW5nQ29ubmVjdGlvbnMiLz4KLSAgICAgICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9zb3VyY2UiLz4KLSAgICAgICAgPHRhcmdldE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay90YXJnZXQiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMiIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iTGlua05hbWVFZGl0UGFydCIKLSAgICAgICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJMaW5rTmFtZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iTGlua05hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgICAgY2xhc3NOYW1lPSJMaW5rTmFtZUZpZ3VyZSIKLSAgICAgICAgICAgIGNsYXNzQm9keT0iJiN4QTsvKiomI3hBOyAqIEBnZW5lcmF0ZWQmI3hBOyAqLyYjeEE7cHVibGljIGNsYXNzIExpbmtOYW1lRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIHsmI3hBOyYjeDk7LyoqJiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hBOyYjeDk7ICovJiN4QTsmI3g5O3B1YmxpYyBMaW5rTmFtZUZpZ3VyZSgpIHsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7dGhpcy5zZXRUZXh0KCZxdW90OyZxdW90Oyk7JiN4QTsmI3g5O30mI3hBOyYjeEE7JiN4QTsmI3hBO30mI3hBOyYjeEE7Ij4KLSAgICAgICAgICA8YXR0cmlidXRlcwotICAgICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkxhYmVsT2Zmc2V0QXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgeT0iNDAiLz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZHJhdzJkPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgICAgPC92aWV3bWFwPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSIKLSAgICAgICAgICAgIGVkaXRQYXR0ZXJuPSIiPgotICAgICAgICAgIDxtZXRhRmVhdHVyZXMKLSAgICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL0xpbmsvbmFtZSIvPgotICAgICAgICA8L21vZGVsRmFjZXQ+Ci0gICAgICA8L2xhYmVscz4KLSAgICA8L2xpbmtzPgotICAgIDxwYWxldHRlPgotICAgICAgPGdyb3VwcwotICAgICAgICAgIHRpdGxlPSJtb2RlbCI+Ci0gICAgICAgIDxlbnRyaWVzCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlRvb2xFbnRyeSIKLSAgICAgICAgICAgIHRpdGxlPSJDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyBDb250cm9sIEZsb3ciCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L2xpbmtfcGFsMTYuZ2lmIgotICAgICAgICAgICAgZ2VuTGlua3M9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiLz4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkNyZWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IiCi0gICAgICAgICAgICBzbWFsbEljb25QYXRoPSIvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiCi0gICAgICAgICAgICBnZW5Ob2Rlcz0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIi8+Ci0gICAgICA8L2dyb3Vwcz4KLSAgICA8L3BhbGV0dGU+Ci0gICAgPHByZWZlcmVuY2VQYWdlcwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLmdlbmVyYWwiCi0gICAgICAgIG5hbWU9IkRpYWdyYW0gRGlhZ3JhbSI+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0uYXBwZWFyYW5jZSIKLSAgICAgICAgICBuYW1lPSJBcHBlYXJhbmNlIgotICAgICAgICAgIGtpbmQ9IkFwcGVhcmFuY2UiLz4KLSAgICAgIDxjaGlsZHJlbgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZGlhZ3JhbS5jb25uZWN0aW9ucyIKLSAgICAgICAgICBuYW1lPSJDb25uZWN0aW9ucyIKLSAgICAgICAgICBraW5kPSJDb25uZWN0aW9ucyIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLnByaW50aW5nIgotICAgICAgICAgIG5hbWU9IlByaW50aW5nIgotICAgICAgICAgIGtpbmQ9IlByaW50aW5nIi8+Ci0gICAgICA8Y2hpbGRyZW4KLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgaUQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmRpYWdyYW0ucnVsZXJzQW5kR3JpZCIKLSAgICAgICAgICBuYW1lPSJSdWxlcnMgQW5kIEdyaWQiCi0gICAgICAgICAga2luZD0iUnVsZXJzQW5kR3JpZCIvPgotICAgICAgPGNoaWxkcmVuCi0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByZWZlcmVuY2VQYWdlIgotICAgICAgICAgIGlEPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5kaWFncmFtLnBhdGhtYXBzIgotICAgICAgICAgIG5hbWU9IlBhdGhtYXBzIgotICAgICAgICAgIGtpbmQ9IlBhdGhtYXBzIi8+Ci0gICAgPC9wcmVmZXJlbmNlUGFnZXM+Ci0gIDwvZGlhZ3JhbT4KLSAgPHBsdWdpbi8+Ci0gIDxlZGl0b3IvPgotICA8bmF2aWdhdG9yPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0iLz4KLSAgICA8Y2hpbGRSZWZlcmVuY2VzCi0gICAgICAgIHBhcmVudD0iLy9AZGlhZ3JhbSIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AbGlua3MuMCIKLSAgICAgICAgZ3JvdXBOYW1lPSJsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rc05hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICBjaGlsZD0iLy9AZGlhZ3JhbS9AdG9wTGV2ZWxOb2Rlcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9InRhcmdldCIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9saW5rVGFyZ2V0TmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQHRvcExldmVsTm9kZXMuMCIKLSAgICAgICAgY2hpbGQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJpbmNvbWluZyBsaW5rcyIKLSAgICAgICAgZ3JvdXBJY29uPSJpY29ucy9pbmNvbWluZ0xpbmtzTmF2aWdhdG9yR3JvdXAuZ2lmIi8+Ci0gICAgPGNoaWxkUmVmZXJlbmNlcwotICAgICAgICBwYXJlbnQ9Ii8vQGRpYWdyYW0vQGxpbmtzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIHJlZmVyZW5jZVR5cGU9ImluX3NvdXJjZSIKLSAgICAgICAgZ3JvdXBOYW1lPSJzb3VyY2UiCi0gICAgICAgIGdyb3VwSWNvbj0iaWNvbnMvbGlua1NvdXJjZU5hdmlnYXRvckdyb3VwLmdpZiIvPgotICAgIDxjaGlsZFJlZmVyZW5jZXMKLSAgICAgICAgcGFyZW50PSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiCi0gICAgICAgIGNoaWxkPSIvL0BkaWFncmFtL0BsaW5rcy4wIgotICAgICAgICByZWZlcmVuY2VUeXBlPSJvdXRfdGFyZ2V0IgotICAgICAgICBncm91cE5hbWU9Im91dGdvaW5nIGxpbmtzIgotICAgICAgICBncm91cEljb249Imljb25zL291dGdvaW5nTGlua3NOYXZpZ2F0b3JHcm91cC5naWYiLz4KLSAgPC9uYXZpZ2F0b3I+Ci0gIDxwcm9wZXJ0eVNoZWV0PgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImFwcGVhcmFuY2UiLz4KLSAgICA8dGFicwotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkdlblN0YW5kYXJkUHJvcGVydHlUYWIiCi0gICAgICAgIGlEPSJkaWFncmFtIi8+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5DdXN0b21Qcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9ImRvbWFpbiIKLSAgICAgICAgbGFiZWw9IkNvcmUiPgotICAgICAgPGZpbHRlcgotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VHlwZVRhYkZpbHRlciI+Ci0gICAgICAgIDx0eXBlcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3PC90eXBlcz4KLSAgICAgICAgPHR5cGVzPm9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDwvdHlwZXM+Ci0gICAgICAgIDxnZW5lcmF0ZWRUeXBlcz5hYnN0cmFjdE5hdmlnYXRvckl0ZW08L2dlbmVyYXRlZFR5cGVzPgotICAgICAgPC9maWx0ZXI+Ci0gICAgPC90YWJzPgotICA8L3Byb3BlcnR5U2hlZXQ+Ci0gIDxkb21haW5HZW5Nb2RlbAotICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvIi8+Ci08L2dtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3I+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQyLmdtZm1hcCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDIuZ21mbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmYxY2M1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvbW9kZWwvd3BkZDIuZ21mbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnbWZtYXA6TWFwcGluZyB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdtZm1hcD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9tYXBwaW5ncy8yLjAiCi0gICAgeG1sbnM6Z21mdG9vbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvMjAwNS9Ub29sRGVmaW5pdGlvbiI+Ci0gIDxub2Rlcz4KLSAgICA8Y29udGFpbm1lbnRGZWF0dXJlCi0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9Ob2RlQ29udGFpbmVyL25vZGVzIi8+Ci0gICAgPG93bmVkQ2hpbGQ+Ci0gICAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgICA8bGFiZWxNYXBwaW5ncwotICAgICAgICAgIHhzaTp0eXBlPSJnbWZtYXA6RmVhdHVyZUxhYmVsTWFwcGluZyIKLSAgICAgICAgICB2aWV3UGF0dGVybj0iIj4KLSAgICAgICAgPGRpYWdyYW1MYWJlbAotICAgICAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNOYW1lZE5vZGVOYW1lIi8+Ci0gICAgICAgIDxmZWF0dXJlcwotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05hbWVkTm9kZS9uYW1lIi8+Ci0gICAgICA8L2xhYmVsTWFwcGluZ3M+Ci0gICAgICA8Y29udGV4dE1lbnUKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AYWxsTWVudXMuMCIvPgotICAgICAgPHRvb2wKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mdG9vbDpDcmVhdGlvblRvb2wiCi0gICAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjEiLz4KLSAgICAgIDxkaWFncmFtTm9kZQotICAgICAgICAgIGhyZWY9IndwZGQuZ21mZ3JhcGgjV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgPC9vd25lZENoaWxkPgotICA8L25vZGVzPgotICA8bGlua3M+Ci0gICAgPGRvbWFpbk1ldGFFbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZWNvcmUjLy9MaW5rIi8+Ci0gICAgPGxhYmVsTWFwcGluZ3MKLSAgICAgICAgeHNpOnR5cGU9ImdtZm1hcDpGZWF0dXJlTGFiZWxNYXBwaW5nIgotICAgICAgICB2aWV3UGF0dGVybj0iIgotICAgICAgICBlZGl0UGF0dGVybj0iIj4KLSAgICAgIDxkaWFncmFtTGFiZWwKLSAgICAgICAgICBocmVmPSJ3cGRkLmdtZmdyYXBoI0xpbmtOYW1lIi8+Ci0gICAgICA8ZmVhdHVyZXMKLSAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9uYW1lIi8+Ci0gICAgPC9sYWJlbE1hcHBpbmdzPgotICAgIDxjb250YWlubWVudEZlYXR1cmUKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgIDx0b29sCi0gICAgICAgIHhzaTp0eXBlPSJnbWZ0b29sOkNyZWF0aW9uVG9vbCIKLSAgICAgICAgaHJlZj0id3BkZC5nbWZ0b29sIy8vQHBhbGV0dGUvQHRvb2xzLjAvQHRvb2xzLjAiLz4KLSAgICA8ZGlhZ3JhbUxpbmsKLSAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNMaW5rIi8+Ci0gICAgPHNvdXJjZU1ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay9zb3VyY2UiLz4KLSAgICA8bGlua01ldGFGZWF0dXJlCi0gICAgICAgIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIgotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8vTGluay90YXJnZXQiLz4KLSAgPC9saW5rcz4KLSAgPGRpYWdyYW0+Ci0gICAgPGRpYWdyYW1DYW52YXMKLSAgICAgICAgaHJlZj0id3BkZC5nbWZncmFwaCNtb2RlbCIvPgotICAgIDxkb21haW5Nb2RlbAotICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmVjb3JlIy8iLz4KLSAgICA8ZG9tYWluTWV0YUVsZW1lbnQKLSAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5lY29yZSMvL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0iLz4KLSAgICA8cGFsZXR0ZQotICAgICAgICBocmVmPSJ3cGRkLmdtZnRvb2wjLy9AcGFsZXR0ZSIvPgotICA8L2RpYWdyYW0+Ci08L2dtZm1hcDpNYXBwaW5nPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9tb2RlbC93cGRkMy5nbWZnZW4gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQzLmdtZmdlbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5OTM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL21vZGVsL3dwZGQzLmdtZmdlbgorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdtZmdlbjpHZW5FZGl0b3JHZW5lcmF0b3IgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczpnbWZnZW49Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mLzIwMDUvR2VuTW9kZWwvMi4wIiBwYWNrYWdlTmFtZVByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICBtb2RlbElEPSJXUEREIgotICAgIHNhbWVGaWxlRm9yRGlhZ3JhbUFuZE1vZGVsPSJ0cnVlIgotICAgIGRpYWdyYW1GaWxlRXh0ZW5zaW9uPSJ3cGRkIj4KLSAgPGRpYWdyYW0KLSAgICAgIHZpc3VhbElEPSI3OSIKLSAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiCi0gICAgICBpdGVtU2VtYW50aWNFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeSIKLSAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IgotICAgICAgaWNvblByb3ZpZGVyUHJpb3JpdHk9IkxvdyI+Ci0gICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgaHJlZj0iLi4vLi4vLi4vcGx1Z2luL29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uL21vZGVsL25vdGF0aW9uLmdlbm1vZGVsIy8vbm90YXRpb24vRGlhZ3JhbSIvPgotICAgIDxlbGVtZW50VHlwZQotICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOk1ldGFtb2RlbFR5cGUiCi0gICAgICAgIGVkaXRIZWxwZXJDbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyIi8+Ci0gICAgPHZpZXdtYXAKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGaWd1cmVWaWV3bWFwIgotICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmRyYXcyZC5GcmVlZm9ybUxheWVyIi8+Ci0gICAgPGRvbWFpbkRpYWdyYW1FbGVtZW50Ci0gICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIi8+Ci0gICAgPHRvcExldmVsTm9kZXMKLSAgICAgICAgdmlzdWFsSUQ9IjEwMDEiCi0gICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgbm90YXRpb25WaWV3RmFjdG9yeUNsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkiCi0gICAgICAgIGNhbm9uaWNhbEVkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kiCi0gICAgICAgIGdyYXBoaWNhbE5vZGVFZGl0UG9saWN5Q2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyIi8+Ci0gICAgICA8dmlld21hcAotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgY2xhc3NOYW1lPSJXb3JrUHJvZHVjdE5vZGVGaWd1cmUiCi0gICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O3RoaXMuc2V0T3V0bGluZShmYWxzZSk7JiN4RDsmI3hBOyYjeDk7JiN4OTtjcmVhdGVDb250ZW50cygpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKXsmI3hEOyYjeEE7JiN4OTsmI3g5O29yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBmaWdfMCA9IG5ldyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwoKTsmI3hEOyYjeEE7ZmlnXzAuc2V0VGV4dCgmcXVvdDtOZXcgV29yayBQcm9kdWN0IERlc2NyaXB0b3ImcXVvdDspOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShmaWdfMCk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsmI3g5O09iamVjdCBsYXlEYXRhMCA9IG51bGw7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7dGhpcy5hZGQoZmlnXzAsIGxheURhdGEwKTsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZk5hbWVkTm9kZU5hbWVGaWd1cmU7ICYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCBnZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIGZOYW1lZE5vZGVOYW1lRmlndXJlOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSB2b2lkIHNldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsIGZpZyl7JiN4RDsmI3hBOyYjeDk7JiN4OTtmTmFtZWROb2RlTmFtZUZpZ3VyZSA9IGZpZzsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKCkgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7cmV0dXJuIG15VXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcm90ZWN0ZWQgdm9pZCBzZXRVc2VMb2NhbENvb3JkaW5hdGVzKGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcykgeyYjeEQ7JiN4QTsmI3g5OyYjeDk7bXlVc2VMb2NhbENvb3JkaW5hdGVzID0gdXNlTG9jYWxDb29yZGluYXRlczsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0PgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvV29ya1Byb2R1Y3ROb2RlIi8+Ci0gICAgICAgIDxjb250YWlubWVudE1ldGFGZWF0dXJlCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTm9kZUNvbnRhaW5lci9ub2RlcyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGVDb250YWluZXIvbm9kZXMiLz4KLSAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDxsYWJlbHMKLSAgICAgICAgICB2aXN1YWxJRD0iNDAwMSIKLSAgICAgICAgICBlZGl0UGFydENsYXNzTmFtZT0iV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVJdGVtU2VtYW50aWNFZGl0UG9saWN5IgotICAgICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IldvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeSIKLSAgICAgICAgICBlbGVtZW50SWNvbj0idHJ1ZSI+Ci0gICAgICAgIDxkaWFncmFtUnVuVGltZUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi8uLi9wbHVnaW4vb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24vbW9kZWwvbm90YXRpb24uZ2VubW9kZWwjLy9ub3RhdGlvbi9Ob2RlIi8+Ci0gICAgICAgIDx2aWV3bWFwCi0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOlBhcmVudEFzc2lnbmVkVmlld21hcCIKLSAgICAgICAgICAgIGdldHRlck5hbWU9ImdldEZpZ3VyZU5hbWVkTm9kZU5hbWVGaWd1cmUiCi0gICAgICAgICAgICBmaWd1cmVRdWFsaWZpZWRDbGFzc05hbWU9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbCIvPgotICAgICAgICA8bW9kZWxGYWNldAotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpGZWF0dXJlTGFiZWxNb2RlbEZhY2V0IgotICAgICAgICAgICAgdmlld1BhdHRlcm49InswfSI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTmFtZWROb2RlL25hbWUiLz4KLSAgICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPC9sYWJlbHM+Ci0gICAgPC90b3BMZXZlbE5vZGVzPgotICAgIDxsaW5rcwotICAgICAgICB2aXN1YWxJRD0iMzAwMSIKLSAgICAgICAgZWRpdFBhcnRDbGFzc05hbWU9IkxpbmtFZGl0UGFydCIKLSAgICAgICAgaXRlbVNlbWFudGljRWRpdFBvbGljeUNsYXNzTmFtZT0iTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kiCi0gICAgICAgIG5vdGF0aW9uVmlld0ZhY3RvcnlDbGFzc05hbWU9IkxpbmtWaWV3RmFjdG9yeSI+Ci0gICAgICA8ZGlhZ3JhbVJ1blRpbWVDbGFzcwotICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL0VkZ2UiLz4KLSAgICAgIDxlbGVtZW50VHlwZQotICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TWV0YW1vZGVsVHlwZSIKLSAgICAgICAgICBlZGl0SGVscGVyQ2xhc3NOYW1lPSJMaW5rRWRpdEhlbHBlciIvPgotICAgICAgPHZpZXdtYXAKLSAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOklubmVyQ2xhc3NWaWV3bWFwIgotICAgICAgICAgIGNsYXNzTmFtZT0iTGlua0ZpZ3VyZSIKLSAgICAgICAgICBjbGFzc0JvZHk9IiYjeEQ7JiN4QTsmI3hEOyYjeEE7LyoqJiN4RDsmI3hBOyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7ICovJiN4RDsmI3hBO3B1YmxpYyBjbGFzcyBMaW5rRmlndXJlIGV4dGVuZHMgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuUG9seWxpbmVDb25uZWN0aW9uRXggeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIExpbmtGaWd1cmUoKSB7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5OyYjeDk7c2V0VGFyZ2V0RGVjb3JhdGlvbihjcmVhdGVUYXJnZXREZWNvcmF0aW9uKCkpOyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3g5Oy8qKiYjeEQ7JiN4QTsmI3g5OyAqIEBnZW5lcmF0ZWQmI3hEOyYjeEE7JiN4OTsgKi8mI3hEOyYjeEE7JiN4OTtwcml2YXRlIG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsmI3hEOyYjeEE7b3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBvcmcuZWNsaXBzZS5kcmF3MmQuUG9seWxpbmVEZWNvcmF0aW9uKCk7JiN4RDsmI3hBOy8vIGRpc3BhdGNoTmV4dD8mI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTtvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnRMaXN0IHBsID0gbmV3IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludExpc3QoKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KC0xLCAxKTsmI3hEOyYjeEE7JiN4OTsmI3g5O3BsLmFkZFBvaW50KDAsIDApOyYjeEQ7JiN4QTsmI3g5OyYjeDk7cGwuYWRkUG9pbnQoLTEsIC0xKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFRlbXBsYXRlKHBsKTsmI3hEOyYjeEE7JiN4OTsmI3g5O2RmLnNldFNjYWxlKGdldE1hcE1vZGUoKS5EUHRvTFAoNyksIGdldE1hcE1vZGUoKS5EUHRvTFAoMykpOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBkZjsmI3hEOyYjeEE7JiN4OTt9JiN4RDsmI3hBOyYjeEQ7JiN4QTt9JiN4RDsmI3hBOyYjeDk7JiN4RDsmI3hBOyI+Ci0gICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8cmVxdWlyZWRQbHVnaW5JRHM+b3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpPC9yZXF1aXJlZFBsdWdpbklEcz4KLSAgICAgIDwvdmlld21hcD4KLSAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUeXBlTGlua01vZGVsRmFjZXQiPgotICAgICAgICA8bWV0YUNsYXNzCi0gICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluayIvPgotICAgICAgICA8Y29udGFpbm1lbnRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8Y2hpbGRNZXRhRmVhdHVyZQotICAgICAgICAgICAgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwvbW9kZWwvZGlhZ3JhbS5nZW5tb2RlbCMvL21vZGVsL05vZGUvb3V0Z29pbmdDb25uZWN0aW9ucyIvPgotICAgICAgICA8c291cmNlTWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3NvdXJjZSIvPgotICAgICAgICA8dGFyZ2V0TWV0YUZlYXR1cmUKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLy9tb2RlbC9MaW5rL3RhcmdldCIvPgotICAgICAgPC9tb2RlbEZhY2V0PgotICAgICAgPGxhYmVscwotICAgICAgICAgIHZpc3VhbElEPSI0MDAyIgotICAgICAgICAgIGVkaXRQYXJ0Q2xhc3NOYW1lPSJMaW5rTmFtZUVkaXRQYXJ0IgotICAgICAgICAgIGl0ZW1TZW1hbnRpY0VkaXRQb2xpY3lDbGFzc05hbWU9IkxpbmtOYW1lSXRlbVNlbWFudGljRWRpdFBvbGljeSIKLSAgICAgICAgICBub3RhdGlvblZpZXdGYWN0b3J5Q2xhc3NOYW1lPSJMaW5rTmFtZVZpZXdGYWN0b3J5IgotICAgICAgICAgIGVsZW1lbnRJY29uPSJ0cnVlIj4KLSAgICAgICAgPGRpYWdyYW1SdW5UaW1lQ2xhc3MKLSAgICAgICAgICAgIGhyZWY9Ii4uLy4uLy4uL3BsdWdpbi9vcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi9tb2RlbC9ub3RhdGlvbi5nZW5tb2RlbCMvL25vdGF0aW9uL05vZGUiLz4KLSAgICAgICAgPHZpZXdtYXAKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46SW5uZXJDbGFzc1ZpZXdtYXAiCi0gICAgICAgICAgICBjbGFzc05hbWU9IkxpbmtOYW1lRmlndXJlIgotICAgICAgICAgICAgY2xhc3NCb2R5PSImI3hEOyYjeEE7JiN4RDsmI3hBOy8qKiYjeEQ7JiN4QTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyAqLyYjeEQ7JiN4QTtwdWJsaWMgY2xhc3MgTGlua05hbWVGaWd1cmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgeyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHVibGljIExpbmtOYW1lRmlndXJlKCkgeyYjeDk7JiN4RDsmI3hBOyYjeDk7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7JiN4OTt0aGlzLnNldFRleHQoJnF1b3Q7JnF1b3Q7KTsmI3hEOyYjeEE7JiN4OTsmI3g5O2NyZWF0ZUNvbnRlbnRzKCk7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeDk7LyoqJiN4RDsmI3hBOyYjeDk7ICogQGdlbmVyYXRlZCYjeEQ7JiN4QTsmI3g5OyAqLyYjeEQ7JiN4QTsmI3g5O3ByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50cygpeyYjeEQ7JiN4QTsmI3g5O30mI3hEOyYjeEE7JiN4OTsmI3hEOyYjeEE7JiN4RDsmI3hBOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJpdmF0ZSBib29sZWFuIG15VXNlTG9jYWxDb29yZGluYXRlcyA9IGZhbHNlOyYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O3JldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3hEOyYjeEE7JiN4OTsvKiomI3hEOyYjeEE7JiN4OTsgKiBAZ2VuZXJhdGVkJiN4RDsmI3hBOyYjeDk7ICovJiN4RDsmI3hBOyYjeDk7cHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsmI3hEOyYjeEE7JiN4OTsmI3g5O215VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7JiN4RDsmI3hBOyYjeDk7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsmI3hEOyYjeEE7fSYjeEQ7JiN4QTsmI3g5OyYjeEQ7JiN4QTsiPgotICAgICAgICAgIDxhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46TGFiZWxPZmZzZXRBdHRyaWJ1dGVzIgotICAgICAgICAgICAgICB5PSI0MCIvPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5kcmF3MmQ8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICAgIDxyZXF1aXJlZFBsdWdpbklEcz5vcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWk8L3JlcXVpcmVkUGx1Z2luSURzPgotICAgICAgICA8L3ZpZXdtYXA+Ci0gICAgICAgIDxtb2RlbEZhY2V0Ci0gICAgICAgICAgICB4c2k6dHlwZT0iZ21mZ2VuOkZlYXR1cmVMYWJlbE1vZGVsRmFjZXQiCi0gICAgICAgICAgICB2aWV3UGF0dGVybj0iezB9IgotICAgICAgICAgICAgZWRpdFBhdHRlcm49IiI+Ci0gICAgICAgICAgPG1ldGFGZWF0dXJlcwotICAgICAgICAgICAgICBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC9tb2RlbC9kaWFncmFtLmdlbm1vZGVsIy8vbW9kZWwvTGluay9uYW1lIi8+Ci0gICAgICAgIDwvbW9kZWxGYWNldD4KLSAgICAgIDwvbGFiZWxzPgotICAgIDwvbGlua3M+Ci0gICAgPHBhbGV0dGU+Ci0gICAgICA8Z3JvdXBzCi0gICAgICAgICAgdGl0bGU9Im1vZGVsIj4KLSAgICAgICAgPGVudHJpZXMKLSAgICAgICAgICAgIHhzaTp0eXBlPSJnbWZnZW46VG9vbEVudHJ5IgotICAgICAgICAgICAgdGl0bGU9IkNvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDcmVhdGUgbmV3IENvbnRyb2wgRmxvdyIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvbGlua19wYWwxNi5naWYiCi0gICAgICAgICAgICBnZW5MaW5rcz0iLy9AZGlhZ3JhbS9AbGlua3MuMCIvPgotICAgICAgICA8ZW50cmllcwotICAgICAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpUb29sRW50cnkiCi0gICAgICAgICAgICB0aXRsZT0iV29yayBQcm9kdWN0IERlc2NyaXB0b3IiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ3JlYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciIKLSAgICAgICAgICAgIHNtYWxsSWNvblBhdGg9Ii9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIKLSAgICAgICAgICAgIGdlbk5vZGVzPSIvL0BkaWFncmFtL0B0b3BMZXZlbE5vZGVzLjAiLz4KLSAgICAgIDwvZ3JvdXBzPgotICAgIDwvcGFsZXR0ZT4KLSAgPC9kaWFncmFtPgotICA8cGx1Z2luCi0gICAgICBpRD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZCIKLSAgICAgIG5hbWU9IldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gUGx1Z2luIgotICAgICAgcHJvdmlkZXI9IkVQRiIKLSAgICAgIHByaW50aW5nRW5hYmxlZD0idHJ1ZSIKLSAgICAgIGFjdGl2YXRvckNsYXNzTmFtZT0iV1BERGlhZ3JhbUVkaXRvclBsdWdpbiIvPgotICA8ZWRpdG9yCi0gICAgICBjbGFzc05hbWU9IldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IiLz4KLSAgPHByb3BlcnR5U2hlZXQ+Ci0gICAgPHRhYnMKLSAgICAgICAgeHNpOnR5cGU9ImdtZmdlbjpHZW5TdGFuZGFyZFByb3BlcnR5VGFiIgotICAgICAgICBpRD0iVGVzdGluZyAxMjMiCi0gICAgICAgIGxhYmVsPSJUZXN0aW5nIDEyMyIvPgotICAgIDx0YWJzCi0gICAgICAgIHhzaTp0eXBlPSJnbWZnZW46R2VuU3RhbmRhcmRQcm9wZXJ0eVRhYiIKLSAgICAgICAgaUQ9IkFkdmFuY2VkIgotICAgICAgICBsYWJlbD0iQWR2YW5jZWQiLz4KLSAgPC9wcm9wZXJ0eVNoZWV0PgotICA8ZG9tYWluR2VuTW9kZWwKLSAgICAgIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsL21vZGVsL2RpYWdyYW0uZ2VubW9kZWwjLyIvPgotPC9nbWZnZW46R2VuRWRpdG9yR2VuZXJhdG9yPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGYwOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTVEFSVCBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByZWZlcmVuY2VzLmdlbmVyYWw9V1BERCBEaWFncmFtCi1wcmVmZXJlbmNlcy5hcHBlYXJhbmNlPUFwcGVhcmFuY2UKLXByZWZlcmVuY2VzLmNvbm5lY3Rpb25zPUNvbm5lY3Rpb25zCi1wcmVmZXJlbmNlcy5wcmludGluZz1QcmludGluZwotcHJlZmVyZW5jZXMucnVsZXJzQW5kR3JpZD1SdWxlcnMgJiBHcmlkCi1wcmVmZXJlbmNlcy5wYXRobWFwcz1QYXRoIE1hcHMKLQotZWRpdG9yTmFtZT1XUEREIERpYWdyYW0gRWRpdG9yCi1uZXdXaXphcmROYW1lPVdQREQgRGlhZ3JhbQotbmV3V2l6YXJkRGVzYz1DcmVhdGVzIFdQREQgZGlhZ3JhbS4KLQotaW5pdERpYWdyYW1BY3Rpb25MYWJlbD1Jbml0aWFsaXplIHdwZGQgZGlhZ3JhbSBmaWxlCi1sb2FkUmVzb3VyY2VBY3Rpb25MYWJlbD1Mb2FkIFJlc291cmNlLi4uCi0KLW5hdmlnYXRvckNvbnRlbnROYW1lPSoud3BkZCBkaWFncmFtIGNvbnRlbnRzCi0KLW1ldGF0eXBlLm5hbWUuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OT1VbmRlZmluZWQKLW1ldGF0eXBlLm5hbWUuV29ya1Byb2R1Y3ROb2RlXzEwMDE9V29ya1Byb2R1Y3ROb2RlCi1tZXRhdHlwZS5uYW1lLkxpbmtfMzAwMT1MaW5rCi0KLXRhYi5UZXN0aW5nLjEyMz1UZXN0aW5nIDEyMwotdGFiLkFkdmFuY2VkPUFkdmFuY2VkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLQotcGx1Z2luTmFtZT1FUEYgV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLQotIyBOZWVkIHRyYW5zbGF0aW9uCi1lbGVtZW50X3R5cGVfY29udHJvbF9mbG93PUNvbnRyb2wgRmxvdwotZWxlbWVudF90eXBlX3dvcmtwcm9kdWN0X2Rlc2NyaXB0b3I9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmYWI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLSAgICAgIDxmaWxlVHlwZXMKLSAgICAgICAgIHR5cGU9InRleHQiCi0gICAgICAgICBleHRlbnNpb249IndwZGQiPgotICAgICAgPC9maWxlVHlwZXM+Ci0gIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgICA8cGFyc2VyCi0gICAgICAgICB0eXBlPSJ3cGRkIgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3RvcnkiPgotICAgICAgPC9wYXJzZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICA8IS0tCi0gICAgIDxlZGl0b3IKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IldQREQgRGlhZ3JhbSBFZGl0b3IiCi0gICAgICAgIGljb249Imljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIgotICAgICAgICBleHRlbnNpb25zPSJ3cGRkIgotICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IiCi0gICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtTWF0Y2hpbmdTdHJhdGVneSIKLSAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1EaWFncmFtQWN0aW9uQmFyQ29udHJpYnV0b3IiPgotICAgICA8L2VkaXRvcj4KLSAgICAgLS0+Ci0gICAgIDxlZGl0b3IKLSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiCi0gICAgICAgIG5hbWU9IldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5IERpYWdyYW0gRWRpdG9yIgotICAgICAgICBpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvV1BEREVkaXRvci5naWYiCi0gICAgICAgIGV4dGVuc2lvbnM9IndwZGQiCi0gICAgICAgIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvciIKLSAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1NYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvciI+Ci0gICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci0KLQk8IS0tCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgCSAgPHdpemFyZAotICAJICAgICBuYW1lPSJXUEREIERpYWdyYW0iCi0gIAkgICAgIGljb249Imljb25zL29iajE2L01vZGVsRGlhZ3JhbUZpbGUuZ2lmIgotICAJICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkuRXhhbXBsZXMiCi0gIAkgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbUNyZWF0aW9uV2l6YXJkIgotICAJICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1DcmVhdGlvbldpemFyZElEIj4KLSAgCSAgCSA8ZGVzY3JpcHRpb24+Ci0gIAkgIAkJQ3JlYXRlcyBXUEREIGRpYWdyYW0uCi0gIAkgIAkgPC9kZXNjcmlwdGlvbj4gIAotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIC0tPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICAgPCEtLSA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC51aS5vYmplY3RDb250cmlidXRpb24uSUZpbGUxIgotICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5tb2RlbCIKLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iSW5pdGlhbGl6ZSB3cGRkIGRpYWdyYW0gZmlsZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uSUQiPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4gIAotICAgICAgPG9iamVjdENvbnRyaWJ1dGlvbgotICAgICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnVpLm9iamVjdENvbnRyaWJ1dGlvbi5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQyIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbUxvYWRSZXNvdXJjZUFjdGlvbklEIgotICAgICAgICAgICAgICAgbGFiZWw9IkxvYWQgUmVzb3VyY2UuLi4iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAKLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLkRlbGV0ZURpYWdyYW0iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLkRlbGV0ZURpYWdyYW1BY3Rpb24iCi0gICAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5EZWxldGVEaWFncmFtQWN0aW9uIgotICAgICAgICAgICAgICAgbGFiZWw9IiVEZWxldGVEaWFncmFtX3RleHQiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iYWRkaXRpb25zIgotICAgICAgICAgICAgICAgc3RhdGU9ImZhbHNlIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlRGVsZXRlRGlhZ3JhbV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5SZWZyZXNoRnJvbUJhc2VBY3Rpb24iCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCI+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5hY3Rpb25zLlJlZnJlc2hGcm9tQmFzZUFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaEZyb21CYXNlQWN0aXZpdHlfdGV4dCIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0gICAgICAgICAgICAgICBzdGF0ZT0iZmFsc2UiCi0gICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKLSAgICAgICAgICAgICAgIHRvb2x0aXA9IiVyZWZyZXNoRnJvbUJhc2VBY3Rpdml0eV90ZXh0Ii8+Ci0gICAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICAgIGFkYXB0YWJsZT0iZmFsc2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYWN0aW9ucy5SZWZyZXNoQWN0aW9uIgotICAgICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmFjdGlvbnMuUmVmcmVzaEFjdGlvbiIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlcmVmcmVzaF90ZXh0IgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0YXRlPSJmYWxzZSIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJXJlZnJlc2hfdGV4dCIvPgotICAgICAgPC9vYmplY3RDb250cmlidXRpb24+ICAgLS0+ICAgICAgICAgICAgICAgICAgIAotICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmFjdGlvbi5jb250cmlidXRpb25JdGVtUHJvdmlkZXJzIj4KLSAgICAgIDxjb250cmlidXRpb25JdGVtUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1Db250cmlidXRpb25JdGVtUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyI+Ci0gICAgICAgICA8L1ByaW9yaXR5PgotICAgICAgICAgPHBhcnRDb250cmlidXRpb24gaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiPgotICAgICAgICAgICAgPHBhcnRBY3Rpb24gbWVudWJhclBhdGg9Ii9maWxlL3ByaW50IiBpZD0icHJpbnRQcmV2aWV3QWN0aW9uIj4KLSAgICAgICAgICAgIDwvcGFydEFjdGlvbj4KLSAgICAgICAgIDwvcGFydENvbnRyaWJ1dGlvbj4KLSAgICAgIDwvY29udHJpYnV0aW9uSXRlbVByb3ZpZGVyPgotICAgICA8IS0tIDxjb250cmlidXRpb25JdGVtUHJvdmlkZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIgotICAgICAgICAgICAgY2hlY2tQbHVnaW5Mb2FkZWQ9ImZhbHNlIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3ciLz4KLSAgICAgICAgIDxwb3B1cENvbnRyaWJ1dGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcm92aWRlcnMuRGlhZ3JhbUNvbnRleHRNZW51UHJvdmlkZXIiPgotICAgICAgICAgICAgPHBvcHVwU3RydWN0dXJlZENvbnRyaWJ1dGlvbkNyaXRlcmlhIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQiLz4KLSAgICAgICAgICAgIDxwb3B1cFByZWRlZmluZWRJdGVtIGlkPSJkZWxldGVGcm9tRGlhZ3JhbUFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgICAgPHBvcHVwQ29udHJpYnV0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5EaWFncmFtQ29udGV4dE1lbnVQcm92aWRlciI+Ci0gICAgICAgICAgICA8cG9wdXBTdHJ1Y3R1cmVkQ29udHJpYnV0aW9uQ3JpdGVyaWEgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0Ii8+Ci0gICAgICAgICAgICA8cG9wdXBQcmVkZWZpbmVkSXRlbSBpZD0iZGVsZXRlRnJvbURpYWdyYW1BY3Rpb24iIHJlbW92ZT0idHJ1ZSIvPgotICAgICAgICAgICAgPHBvcHVwUHJlZGVmaW5lZEl0ZW0gaWQ9ImRlbGV0ZUZyb21Nb2RlbEFjdGlvbiIgcmVtb3ZlPSJ0cnVlIi8+Ci0gICAgICAgICA8L3BvcHVwQ29udHJpYnV0aW9uPgotICAgICAgPC9jb250cmlidXRpb25JdGVtUHJvdmlkZXI+Ci0gICAgICAtLT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcnMiPgotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRpYWdyYW1HbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iV1BERFByZXNlbnRhdGlvbiI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iZGVsZXRlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgICAgPEVsZW1lbnRUeXBlIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQiPgotICAgICAgICAgICAgICAgPEdsb2JhbEFjdGlvbklkIGFjdGlvbklkPSJzYXZlIi8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLnJlbmRlci5wcm92aWRlcnMuRGlhZ3JhbVdpdGhQcmludEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlciIKLSAgICAgICAgIGlkPSJXUEREUHJlc2VudGF0aW9uUHJpbnQiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgICAgPFZpZXdJZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3JJRCI+Ci0gICAgICAgICAgICA8RWxlbWVudFR5cGUgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydCI+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9InByaW50Ii8+Ci0gICAgICAgICAgICA8L0VsZW1lbnRUeXBlPgotICAgICAgICAgPC9WaWV3SWQ+Ci0gICAgICA8L0dsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcj4KLSAgICAgIDxHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByb3ZpZGVycy5pZGUucHJvdmlkZXJzLkRpYWdyYW1JREVHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICBpZD0iV1BERFByZXNlbnRhdGlvbklERSI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iYm9va21hcmsiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgPCEtLQotICAgICAgPEdsb2JhbEFjdGlvbkhhbmRsZXJQcm92aWRlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVuZGVyLnByb3ZpZGVycy5EaWFncmFtVUlSZW5kZXJHbG9iYWxBY3Rpb25IYW5kbGVyUHJvdmlkZXIiCi0gICAgICAgICAgICBpZD0iV1BERFJlbmRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Vmlld0lkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIj4KLSAgICAgICAgICAgIDxFbGVtZW50VHlwZSBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0Ij4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0iY3V0Ii8+Ci0gICAgICAgICAgICAgICA8R2xvYmFsQWN0aW9uSWQgYWN0aW9uSWQ9ImNvcHkiLz4KLSAgICAgICAgICAgICAgIDxHbG9iYWxBY3Rpb25JZCBhY3Rpb25JZD0icGFzdGUiLz4KLSAgICAgICAgICAgIDwvRWxlbWVudFR5cGU+Ci0gICAgICAgICA8L1ZpZXdJZD4KLSAgICAgIDwvR2xvYmFsQWN0aW9uSGFuZGxlclByb3ZpZGVyPgotICAgICAgLS0+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnZpZXdQcm92aWRlcnMiPgotICAgICAgPHZpZXdQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbVZpZXdQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW0iIHNlbWFudGljSGludHM9IldQREQiLz4KLSAgICAgICAgIDxjb250ZXh0IHZpZXdDbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSIgc2VtYW50aWNIaW50cz0iIi8+Ci0gICAgICAgICA8Y29udGV4dCB2aWV3Q2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2UiIHNlbWFudGljSGludHM9IiIvPgotICAgICAgPC92aWV3UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydFByb3ZpZGVycyI+Ci0gICAgICA8ZWRpdHBhcnRQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9Ikxvd2VzdCIvPgotICAgICAgPC9lZGl0cGFydFByb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFsZXR0ZVByb3ZpZGVycyI+Ci0gICAgICA8cGFsZXR0ZVByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtUGFsZXR0ZVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiLz4KLSAgICAgIDwvcGFsZXR0ZVByb3ZpZGVyPgotICAgICAgPHBhbGV0dGVQcm92aWRlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJvdmlkZXJzLkRlZmF1bHRQYWxldHRlUHJvdmlkZXIiPgotICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTWVkaXVtIi8+Ci0gICAgICAgIDxlZGl0b3IgaWQ9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9ySUQiLz4KLSAgICAgICAgPGNvbnRyaWJ1dGlvbj4KLSAgICAgICAgICAgIDxwcmVkZWZpbmVkRW50cnkgICAgCi0gICAgICAgICAgICAJaWQ9Imdlb3NoYXBlRHJhd2VyIiAgIHBhdGg9Ii8iPgotICAgICAgICAgICAgCTxleHBhbmQgZm9yY2U9InRydWUiLz4KLSAgICAgICAgICAgICA8L3ByZWRlZmluZWRFbnRyeT4gCi0gICAgICAgIDwvY29udHJpYnV0aW9uPgotICAgICAgPC9wYWxldHRlUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnVpLm1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXJzIj4KLSAgICAgIDxtb2RlbGluZ0Fzc2lzdGFudFByb3ZpZGVyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciI+Ci0gICAgICAgICA8UHJpb3JpdHkgbmFtZT0iTG93ZXN0Ii8+Ci0gICAgICA8L21vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMucHJvcGVydGllc1Byb3ZpZGVycyI+Ci0gICAgICA8UHJvcGVydGllc1Byb3ZpZGVyCi0gICAgICAgICAgICB2ZXJpZnlQbHVnaW5Mb2FkZWQ9ImZhbHNlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUHJvcGVydGllc1Byb3ZpZGVyPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uUHJvdmlkZXJzIj4KLSAgICAgIDxJY29uUHJvdmlkZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1JY29uUHJvdmlkZXIiPgotICAgICAgICAgPFByaW9yaXR5IG5hbWU9IkxvdyIvPgotICAgICAgPC9JY29uUHJvdmlkZXI+Ci0gICAgICA8SWNvblByb3ZpZGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5nZW9zaGFwZXMuaW50ZXJuYWwucHJvdmlkZXJzLkdlb1NoYXBlSWNvblByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eQotICAgICAgICAgICAgICAgbmFtZT0iTWVkaXVtIj4KLSAgICAgICAgIDwvUHJpb3JpdHk+Ci0gICAgICAgICA8b2JqZWN0IGNsYXNzPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3KG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uKSIgaWQ9Ikdlb1NoYXBlIj4KLSAgICAgICAgCSA8bWV0aG9kIG5hbWU9ImdldFR5cGUoKSIgdmFsdWU9Im92YWwsdHJpYW5nbGUscmVjdGFuZ2xlLHNoYWRvd1JlY3RhbmdsZSxyZWN0YW5nbGUzRCxyb3VuZFJlY3RhbmdsZSxoZXhhZ29uLG9jdGFnb24scGVudGFnb24sZGlhbW9uZCxjeWxpbmRlcixsaW5lIi8+Ci0JICAgICA8L29iamVjdD4KLSAgICAgICAgIDxjb250ZXh0IGVsZW1lbnRzPSJHZW9TaGFwZSI+Ci0gICAgICAgICA8L2NvbnRleHQ+Ci0gICAgICA8L0ljb25Qcm92aWRlcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyUHJvdmlkZXJzIj4KLSAgICAgIDxQYXJzZXJQcm92aWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbVBhcnNlclByb3ZpZGVyIj4KLSAgICAgICAgIDxQcmlvcml0eSBuYW1lPSJMb3dlc3QiLz4KLSAgICAgIDwvUGFyc2VyUHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lbGVtZW50VHlwZXMiPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkiCi0gICAgICAgICAgICAgICBraW5kPSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklIaW50ZWRUeXBlIgotICAgICAgICAgICAgICAgZWNsYXNzPSJXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIgotICAgICAgICAgICAgICAgZWRpdGhlbHBlcj0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9Ijc5Ii8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLQotICAgICAgPG1ldGFtb2RlbCBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIj4KLSAgICAgICAgIDxtZXRhbW9kZWxUeXBlCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdE5vZGVfMTAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfd29ya3Byb2R1Y3RfZGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgIGtpbmQ9Im9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUhpbnRlZFR5cGUiCi0gICAgICAgICAgICAgICBlY2xhc3M9IldvcmtQcm9kdWN0Tm9kZSIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzLldvcmtQcm9kdWN0Tm9kZUVkaXRIZWxwZXIiPgotICAgICAgICAgICAgPHBhcmFtIG5hbWU9InNlbWFudGljSGludCIgdmFsdWU9IjEwMDEiLz4KLSAgICAgICAgIDwvbWV0YW1vZGVsVHlwZT4KLSAgICAgIDwvbWV0YW1vZGVsPgotCi0gICAgICA8bWV0YW1vZGVsIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiPgotICAgICAgICAgPG1ldGFtb2RlbFR5cGUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLkxpbmtfMzAwMSIKLSAgICAgICAgICAgICAgIG5hbWU9IiVlbGVtZW50X3R5cGVfY29udHJvbF9mbG93IgotICAgICAgICAgICAgICAga2luZD0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JSGludGVkVHlwZSIKLSAgICAgICAgICAgICAgIGVjbGFzcz0iTGluayIKLSAgICAgICAgICAgICAgIGVkaXRoZWxwZXI9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzLkxpbmtFZGl0SGVscGVyIj4KLSAgICAgICAgICAgIDxwYXJhbSBuYW1lPSJzZW1hbnRpY0hpbnQiIHZhbHVlPSIzMDAxIi8+Ci0gICAgICAgICA8L21ldGFtb2RlbFR5cGU+Ci0gICAgICA8L21ldGFtb2RlbD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmVsZW1lbnRUeXBlQmluZGluZ3MiPgotICAgICAgPGNsaWVudENvbnRleHQgaWQ9IldQRERDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPHRlc3QKLSAgICAgICAgICAgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5lZGl0aW5nRG9tYWluIgotICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLkVkaXRpbmdEb21haW4iLz4KLSAgICAgICAgIDwvZW5hYmxlbWVudD4KLSAgICAgIDwvY2xpZW50Q29udGV4dD4gCi0gICAgICA8YmluZGluZyBjb250ZXh0PSJXUEREQ2xpZW50Q29udGV4dCI+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcmVmPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3ROb2RlXzEwMDEiLz4KLSAgICAgICAgIDxlbGVtZW50VHlwZSByZWY9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuTGlua18zMDAxIi8+Ci0gICAgICAgICA8YWR2aWNlIHJlZj0ib3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmFkdmljZS5ub3RhdGlvbkRlcGRlbmRlbnRzIi8+Ci0gICAgICAgICA8ZWxlbWVudFR5cGUgcGF0dGVybj0iLioiLz4KLSAgICAgIDwvYmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwNjJmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLkNvbW1hbmRSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQgZXh0ZW5kcwotCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElBZGFwdGFibGUgZWRnZUFkYXB0b3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihlZGl0aW5nRG9tYWluLCBsYWJlbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFmZmVjdGVkRmlsZXMoKSB7Ci0JCVZpZXcgdmlldyA9IChWaWV3KSBlZGdlQWRhcHRvci5nZXRBZGFwdGVyKFZpZXcuY2xhc3MpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0V29ya3NwYWNlRmlsZXModmlldyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkRmlsZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElBZGFwdGFibGUgZ2V0RWRnZUFkYXB0b3IoKSB7Ci0JCXJldHVybiBlZGdlQWRhcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRnZUFkYXB0b3IoSUFkYXB0YWJsZSBlZGdlQWRhcHRvcikgewotCQl0aGlzLmVkZ2VBZGFwdG9yID0gZWRnZUFkYXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB7Ci0JCWFzc2VydCBudWxsICE9IGVkZ2VBZGFwdG9yIDogIk51bGwgY2hpbGQgaW4gRGlhZ3JhbVJlb3JpZW50Q29ubmVjdGlvblZpZXdDb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQlFZGdlIGVkZ2UgPSAoRWRnZSkgZ2V0RWRnZUFkYXB0b3IoKS5nZXRBZGFwdGVyKEVkZ2UuY2xhc3MpOwotCQlhc3NlcnQgbnVsbCAhPSBlZGdlIDogIk51bGwgZWRnZSBpbiBEaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0KLQkJVmlldyB0ZW1wVmlldyA9IGVkZ2UuZ2V0U291cmNlKCk7Ci0JCWVkZ2Uuc2V0U291cmNlKGVkZ2UuZ2V0VGFyZ2V0KCkpOwotCQllZGdlLnNldFRhcmdldCh0ZW1wVmlldyk7Ci0KLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL0xpbmtDcmVhdGVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkZjgyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvTGlua0NyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rQ3JlYXRlQ29tbWFuZCBleHRlbmRzIENyZWF0ZVJlbGF0aW9uc2hpcENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTm9kZSBteUNvbnRhaW5lcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE5vZGUgbXlTb3VyY2U7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBOb2RlIG15VGFyZ2V0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaW5rQ3JlYXRlQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSwgTm9kZSBjb250YWluZXIsCi0JCQlOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJc3VwZXIocmVxKTsKLQkJc3VwZXIuc2V0RWxlbWVudFRvRWRpdChjb250YWluZXIpOwotCQlteUNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJbXlTb3VyY2UgPSBzb3VyY2U7Ci0JCW15VGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBteUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gbXlTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIG15VGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGdldEVDbGFzc1RvRWRpdCgpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Tm9kZSgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbGVtZW50VG9FZGl0KEVPYmplY3QgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCkgewotCQlMaW5rIG5ld0VsZW1lbnQgPSAoTGluaykgc3VwZXIuZG9EZWZhdWx0RWxlbWVudENyZWF0aW9uKCk7Ci0JCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCW5ld0VsZW1lbnQuc2V0VGFyZ2V0KG15VGFyZ2V0KTsKLQkJCW5ld0VsZW1lbnQuc2V0U291cmNlKG15U291cmNlKTsKLQkJfQotCQlyZXR1cm4gbmV3RWxlbWVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rUmVvcmllbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvY29tbWFuZHMvTGlua1Jlb3JpZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjhmN2ZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9MaW5rUmVvcmllbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRWRpdEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtSZW9yaWVudENvbW1hbmQgZXh0ZW5kcyBFZGl0RWxlbWVudENvbW1hbmQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHJlb3JpZW50RGlyZWN0aW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgRU9iamVjdCBvbGRFbmQ7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFT2JqZWN0IG5ld0VuZDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua1Jlb3JpZW50Q29tbWFuZChSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxdWVzdCkgewotCQlzdXBlcihyZXF1ZXN0LmdldExhYmVsKCksIHJlcXVlc3QuZ2V0UmVsYXRpb25zaGlwKCksIHJlcXVlc3QpOwotCQlyZW9yaWVudERpcmVjdGlvbiA9IHJlcXVlc3QuZ2V0RGlyZWN0aW9uKCk7Ci0JCW9sZEVuZCA9IHJlcXVlc3QuZ2V0T2xkUmVsYXRpb25zaGlwRW5kKCk7Ci0JCW5ld0VuZCA9IHJlcXVlc3QuZ2V0TmV3UmVsYXRpb25zaGlwRW5kKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCWlmICghKGdldEVsZW1lbnRUb0VkaXQoKSBpbnN0YW5jZW9mIExpbmspKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHJlb3JpZW50RGlyZWN0aW9uID09IFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdC5SRU9SSUVOVF9TT1VSQ0UpIHsKLQkJCXJldHVybiBjYW5SZW9yaWVudFNvdXJjZSgpOwotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfVEFSR0VUKSB7Ci0JCQlyZXR1cm4gY2FuUmVvcmllbnRUYXJnZXQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50U291cmNlKCkgewotCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBOb2RlICYmIG5ld0VuZCBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSB0YXJnZXQgPSBnZXRMaW5rKCkuZ2V0VGFyZ2V0KCk7Ci0JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldExpbmsoKS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkV4aXN0TGlua18zMDAxKGNvbnRhaW5lciwgZ2V0TmV3U291cmNlKCksIHRhcmdldCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhblJlb3JpZW50VGFyZ2V0KCkgewotCQlpZiAoIShvbGRFbmQgaW5zdGFuY2VvZiBOb2RlICYmIG5ld0VuZCBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSBnZXRMaW5rKCkuZ2V0U291cmNlKCk7Ci0JCWlmICghKGdldExpbmsoKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBOb2RlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldExpbmsoKS5lQ29udGFpbmVyKCk7Ci0JCXJldHVybiBEaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuTGlua0NvbnN0cmFpbnRzCi0JCQkJLmNhbkV4aXN0TGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBnZXROZXdUYXJnZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IGRvRXhlY3V0ZVdpdGhSZXN1bHQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFjYW5FeGVjdXRlKCkpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oCi0JCQkJCSJJbnZhbGlkIGFyZ3VtZW50cyBpbiByZW9yaWVudCBsaW5rIGNvbW1hbmQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChyZW9yaWVudERpcmVjdGlvbiA9PSBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QuUkVPUklFTlRfU09VUkNFKSB7Ci0JCQlyZXR1cm4gcmVvcmllbnRTb3VyY2UoKTsKLQkJfQotCQlpZiAocmVvcmllbnREaXJlY3Rpb24gPT0gUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0LlJFT1JJRU5UX1RBUkdFVCkgewotCQkJcmV0dXJuIHJlb3JpZW50VGFyZ2V0KCk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCByZW9yaWVudFNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlnZXRMaW5rKCkuc2V0U291cmNlKGdldE5ld1NvdXJjZSgpKTsKLQkJcmV0dXJuIENvbW1hbmRSZXN1bHQubmV3T0tDb21tYW5kUmVzdWx0KGdldExpbmsoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kUmVzdWx0IHJlb3JpZW50VGFyZ2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWdldExpbmsoKS5zZXRUYXJnZXQoZ2V0TmV3VGFyZ2V0KCkpOwotCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoZ2V0TGluaygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpbmsgZ2V0TGluaygpIHsKLQkJcmV0dXJuIChMaW5rKSBnZXRFbGVtZW50VG9FZGl0KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE9sZFNvdXJjZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBvbGRFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE5ld1NvdXJjZSgpIHsKLQkJcmV0dXJuIChOb2RlKSBuZXdFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE9sZFRhcmdldCgpIHsKLQkJcmV0dXJuIChOb2RlKSBvbGRFbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlIGdldE5ld1RhcmdldCgpIHsKLQkJcmV0dXJuIChOb2RlKSBuZXdFbmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9jb21tYW5kcy9Xb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmN2M1ZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2NvbW1hbmRzL1dvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBDcmVhdGVFbGVtZW50Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZUNyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXN1cGVyKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZ2V0RUNsYXNzVG9FZGl0KCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldEVsZW1lbnRUb0VkaXQoKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gKChDcmVhdGVFbGVtZW50UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKQotCQkJCS5nZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCWNvbnRhaW5lciA9ICgoVmlldykgY29udGFpbmVyKS5nZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRU9iamVjdCBkb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKSB7Ci0JCU5hbWVkTm9kZSBuZXdOb2RlID0gKE5hbWVkTm9kZSlzdXBlci5kb0RlZmF1bHRFbGVtZW50Q3JlYXRpb24oKTsKLQkJRGlhZ3JhbSBkaWFncmFtID1uZXdOb2RlLmdldERpYWdyYW0oKTsKLQkJZGlhZ3JhbS5zZXREZWZhdWx0TmFtZShuZXdOb2RlKTsKLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvRGlhZ3JhbUJhc2VFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ZDQ1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9EaWFncmFtQmFzZUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21wb3NpdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuSUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5lZGl0aGVscGVyLkFic3RyYWN0RWRpdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZUVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQmFzZUVkaXRIZWxwZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRIZWxwZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfUE9MSUNZX0NPTU1BTkQgPSAiZWRpdCBwb2xpY3kgY29tbWFuZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0SW5zdGVhZENvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXEpIHsKLQkJSUNvbW1hbmQgZXBDb21tYW5kID0gKElDb21tYW5kKSByZXEuZ2V0UGFyYW1ldGVyKEVESVRfUE9MSUNZX0NPTU1BTkQpOwotCQlyZXEuc2V0UGFyYW1ldGVyKEVESVRfUE9MSUNZX0NPTU1BTkQsIG51bGwpOwotCQlJQ29tbWFuZCBlaENvbW1hbmQgPSBzdXBlci5nZXRJbnN0ZWFkQ29tbWFuZChyZXEpOwotCQlpZiAoZXBDb21tYW5kID09IG51bGwpIHsKLQkJCXJldHVybiBlaENvbW1hbmQ7Ci0JCX0KLQkJaWYgKGVoQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZXBDb21tYW5kOwotCQl9Ci0JCUNvbXBvc2l0ZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBDb21wb3NpdGVDb21tYW5kKG51bGwpOwotCQljb21tYW5kLmFkZChlcENvbW1hbmQpOwotCQljb21tYW5kLmFkZChlaENvbW1hbmQpOwotCQlyZXR1cm4gY29tbWFuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlRWxlbWVudFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKERlc3Ryb3lFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29tbWFuZCBnZXREZXN0cm95UmVmZXJlbmNlQ29tbWFuZChEZXN0cm95UmVmZXJlbmNlUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9MaW5rRWRpdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njc5ZDM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL0xpbmtFZGl0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuaGVscGVyczsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5rRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9oZWxwZXJzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODE4NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5oZWxwZXJzOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0SGVscGVyIGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VFZGl0SGVscGVyIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvaGVscGVycy9Xb3JrUHJvZHVjdE5vZGVFZGl0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjAyNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L2hlbHBlcnMvV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlRWRpdEhlbHBlciBleHRlbmRzIERpYWdyYW1CYXNlRWRpdEhlbHBlciB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9EaWFncmFtRWRpdFBhcnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDRlMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0RpYWdyYW1FZGl0UGFydEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkNlbGxFZGl0b3JMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRWRpdFBhcnRGYWN0b3J5IGltcGxlbWVudHMgRWRpdFBhcnRGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWRpdFBhcnQgY3JlYXRlRWRpdFBhcnQoRWRpdFBhcnQgY29udGV4dCwgT2JqZWN0IG1vZGVsKSB7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSBtb2RlbDsKLQkJCXN3aXRjaCAoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlldykpIHsKLQotCQkJY2FzZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJCXJldHVybiBuZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0KHZpZXcpOwotCi0JCQljYXNlIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQodmlldyk7Ci0KLQkJCWNhc2UgTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IExpbmtFZGl0UGFydCh2aWV3KTsKLQotCQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCQlyZXR1cm4gbmV3IExpbmtOYW1lRWRpdFBhcnQodmlldyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZVVucmVjb2duaXplZEVkaXRQYXJ0KGNvbnRleHQsIG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFZGl0UGFydCBjcmVhdGVVbnJlY29nbml6ZWRFZGl0UGFydChFZGl0UGFydCBjb250ZXh0LCBPYmplY3QgbW9kZWwpIHsKLQkJLy8gSGFuZGxlIGNyZWF0aW9uIG9mIHVucmVjb2duaXplZCBjaGlsZCBub2RlIEVkaXRQYXJ0cyBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENlbGxFZGl0b3JMb2NhdG9yIGdldFRleHRDZWxsRWRpdG9yTG9jYXRvcigKLQkJCUlUZXh0QXdhcmVFZGl0UGFydCBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZS5nZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkKLQkJCXJldHVybiBuZXcgVGV4dENlbGxFZGl0b3JMb2NhdG9yKChXcmFwTGFiZWwpIHNvdXJjZS5nZXRGaWd1cmUoKSk7Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKChMYWJlbCkgc291cmNlLmdldEZpZ3VyZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgcHJpdmF0ZSBjbGFzcyBUZXh0Q2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgV3JhcExhYmVsIHdyYXBMYWJlbDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRleHRDZWxsRWRpdG9yTG9jYXRvcihXcmFwTGFiZWwgd3JhcExhYmVsKSB7Ci0JCQl0aGlzLndyYXBMYWJlbCA9IHdyYXBMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV3JhcExhYmVsIGdldFdyYXBMYWJlbCgpIHsKLQkJCXJldHVybiB3cmFwTGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVsb2NhdGUoQ2VsbEVkaXRvciBjZWxsZWRpdG9yKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgY2VsbGVkaXRvci5nZXRDb250cm9sKCk7Ci0JCQlSZWN0YW5nbGUgcmVjdCA9IGdldFdyYXBMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRXcmFwTGFiZWwoKS50cmFuc2xhdGVUb0Fic29sdXRlKHJlY3QpOwotCQkJaWYgKGdldFdyYXBMYWJlbCgpLmlzVGV4dFdyYXBwZWQoKQotCQkJCQkmJiBnZXRXcmFwTGFiZWwoKS5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShyZWN0LndpZHRoLAotCQkJCQkJU1dULkRFRkFVTFQpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWludCBhdnIgPSBGaWd1cmVVdGlsaXRpZXMuZ2V0Rm9udE1ldHJpY3ModGV4dC5nZXRGb250KCkpCi0JCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJCXJlY3Quc2V0U2l6ZShuZXcgRGltZW5zaW9uKHRleHQuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsCi0JCQkJCQlTV1QuREVGQVVMVCkpLmV4cGFuZChhdnIgKiAyLCAwKSk7Ci0JCQl9Ci0JCQlpZiAoIXJlY3QuZXF1YWxzKG5ldyBSZWN0YW5nbGUodGV4dC5nZXRCb3VuZHMoKSkpKSB7Ci0JCQkJdGV4dC5zZXRCb3VuZHMocmVjdC54LCByZWN0LnksIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExhYmVsQ2VsbEVkaXRvckxvY2F0b3IgaW1wbGVtZW50cyBDZWxsRWRpdG9yTG9jYXRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMYWJlbENlbGxFZGl0b3JMb2NhdG9yKExhYmVsIGxhYmVsKSB7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhYmVsIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbG9jYXRlKENlbGxFZGl0b3IgY2VsbGVkaXRvcikgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNlbGxlZGl0b3IuZ2V0Q29udHJvbCgpOwotCQkJUmVjdGFuZ2xlIHJlY3QgPSBnZXRMYWJlbCgpLmdldFRleHRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCQlnZXRMYWJlbCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUocmVjdCk7Ci0JCQlpbnQgYXZyID0gRmlndXJlVXRpbGl0aWVzLmdldEZvbnRNZXRyaWNzKHRleHQuZ2V0Rm9udCgpKQotCQkJCQkuZ2V0QXZlcmFnZUNoYXJXaWR0aCgpOwotCQkJcmVjdC5zZXRTaXplKG5ldyBEaW1lbnNpb24odGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwKLQkJCQkJU1dULkRFRkFVTFQpKS5leHBhbmQoYXZyICogMiwgMCkpOwotCQkJaWYgKCFyZWN0LmVxdWFscyhuZXcgUmVjdGFuZ2xlKHRleHQuZ2V0Qm91bmRzKCkpKSkgewotCQkJCXRleHQuc2V0Qm91bmRzKHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NmU5ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL0RpYWdyYW1FeHROb2RlTGFiZWxFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLklGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkxhYmVsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5maWd1cmVzLkxhYmVsTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRXh0Tm9kZUxhYmVsRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUV4dE5vZGVMYWJlbEVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEJvdW5kcygpIHsKLQkJSUZpZ3VyZSByZWZGaWd1cmUgPSAoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCk7Ci0JCWludCBkeCA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1goKSkpLmludFZhbHVlKCk7Ci0JCWludCBkeSA9ICgoSW50ZWdlcikgZ2V0U3RydWN0dXJhbEZlYXR1cmVWYWx1ZShOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldExvY2F0aW9uX1koKSkpLmludFZhbHVlKCk7Ci0JCVBvaW50IG9mZnNldCA9IG5ldyBQb2ludChkeCwgZHkpOwotCQlnZXRGaWd1cmUoKS5nZXRQYXJlbnQoKS5zZXRDb25zdHJhaW50KGdldEZpZ3VyZSgpLAotCQkJCW5ldyBMYWJlbExvY2F0b3IocmVmRmlndXJlLCBvZmZzZXQsIGdldEtleVBvaW50KCkpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCByZWxvY2F0ZShJRmlndXJlIHRhcmdldCkgewotCQkJCQkJUG9pbnQgbG9jYXRpb24gPSBnZXRSZWZlcmVuY2VQb2ludCgpLmdldFRyYW5zbGF0ZWQoCi0JCQkJCQkJCWdldE9mZnNldCgpKTsKLQkJCQkJCWxvY2F0aW9uLnRyYW5zbGF0ZSgtdGFyZ2V0LmdldEJvdW5kcygpLndpZHRoIC8gMiwgMCk7Ci0JCQkJCQl0YXJnZXQuc2V0TG9jYXRpb24obG9jYXRpb24pOwotCQkJCQkJdGFyZ2V0LnNldFNpemUobmV3IERpbWVuc2lvbigKLQkJCQkJCQkJdGFyZ2V0LmdldFByZWZlcnJlZFNpemUoKS53aWR0aCwgdGFyZ2V0Ci0JCQkJCQkJCQkJLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQpKTsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBQb2ludCBnZXRSZWZlcmVuY2VQb2ludCgpIHsKLQkJCQkJCXJldHVybiBnZXRMYWJlbExvY2F0aW9uKHBhcmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFJlZmVyZW5jZVBvaW50KCkgewotCQlyZXR1cm4gZ2V0TGFiZWxMb2NhdGlvbigoKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRQYXJlbnQoKSkuZ2V0RmlndXJlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0TGFiZWxMb2NhdGlvbihJRmlndXJlIHBhcmVudCkgewotCQlyZXR1cm4gcGFyZW50LmdldEJvdW5kcygpLmdldEJvdHRvbSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZiOWY1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvTGlua0VkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLlBvbHlsaW5lQ29ubmVjdGlvbkV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZURlY29yYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVZhbGlkYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLkxpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuQ29ubmVjdGlvbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlua0VkaXRQYXJ0IGV4dGVuZHMgQ29ubmVjdGlvbk5vZGVFZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklTVUFMX0lEID0gMzAwMTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua0VkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBmaWd1cmUgZm9yIHRoaXMgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEJvZHkgb2YgdGhpcyBtZXRob2QgZG9lcyBub3QgZGVwZW5kIG9uIHNldHRpbmdzIGluIGdlbmVyYXRpb24gbW9kZWwKLQkgKiBzbyB5b3UgbWF5IHNhZmVseSByZW1vdmUgPGk+Z2VuZXJhdGVkPC9pPiB0YWcgYW5kIG1vZGlmeSBpdC4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbkZpZ3VyZSgpIHsKLQotCQlyZXR1cm4gbmV3IExpbmtGaWd1cmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIExpbmtGaWd1cmUgZXh0ZW5kcyBQb2x5bGluZUNvbm5lY3Rpb25FeCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMaW5rRmlndXJlKCkgewotCi0JCQlzZXRUYXJnZXREZWNvcmF0aW9uKGNyZWF0ZVRhcmdldERlY29yYXRpb24oKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBQb2x5bGluZURlY29yYXRpb24gY3JlYXRlVGFyZ2V0RGVjb3JhdGlvbigpIHsKLQkJCVBvbHlsaW5lRGVjb3JhdGlvbiBkZiA9IG5ldyBQb2x5bGluZURlY29yYXRpb24oKTsKLQkJCS8vIGRpc3BhdGNoTmV4dD8KLQotCQkJUG9pbnRMaXN0IHBsID0gbmV3IFBvaW50TGlzdCgpOwotCQkJcGwuYWRkUG9pbnQoLTEsIDEpOwotCQkJcGwuYWRkUG9pbnQoMCwgMCk7Ci0JCQlwbC5hZGRQb2ludCgtMSwgLTEpOwotCQkJZGYuc2V0VGVtcGxhdGUocGwpOwotCQkJZGYuc2V0U2NhbGUoZ2V0TWFwTW9kZSgpLkRQdG9MUCg3KSwgZ2V0TWFwTW9kZSgpLkRQdG9MUCgzKSk7Ci0KLQkJCXJldHVybiBkZjsKLQkJfQotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCUNvbG9yIG92ZXJyaWRlQ29sb3IgPSBEaWFncmFtQ29yZVV0aWwuZ2V0TGlua092ZXJyaWRlQ29sb3IoKEVkZ2UpIGdldE1vZGVsKCkpOwotCQlzdXBlci5zZXRGb3JlZ3JvdW5kQ29sb3Iob3ZlcnJpZGVDb2xvciAhPSBudWxsID8gb3ZlcnJpZGVDb2xvciA6IGNvbG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rTmFtZUVkaXRQYXJ0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvTGlua05hbWVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2QwNDIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9MaW5rTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbm5lY3Rpb25Mb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SdW5uYWJsZVdpdGhSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLkRpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQWNjZXNzaWJsZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5EaXJlY3RFZGl0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudG9vbHMuRGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5MYWJlbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkxhYmVsRGlyZWN0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbUNvbG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5SZXF1ZXN0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVGV4dERpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuSVNlbWFudGljUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VySGludEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtOYW1lRWRpdFBhcnQgZXh0ZW5kcyBMYWJlbEVkaXRQYXJ0IGltcGxlbWVudHMKLQkJSVRleHRBd2FyZUVkaXRQYXJ0IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA0MDAyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlyZWN0RWRpdE1hbmFnZXIgbWFuYWdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgcGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdCBwYXJzZXJFbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VGV4dDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlzdGF0aWMgewotCQlyZWdpc3RlclNuYXBCYWNrUG9zaXRpb24oRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkuZ2V0VHlwZShMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCksIG5ldyBQb2ludCgwLCA0MCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlua05hbWVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0JCXN1cGVyLmNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5ESVJFQ1RfRURJVF9ST0xFLAotCQkJCW5ldyBMYWJlbERpcmVjdEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0S2V5UG9pbnQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uTG9jYXRvci5NSURETEU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlKSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCXJldHVybiAoKFdyYXBMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKChMYWJlbCkgZmlndXJlKS5nZXRUZXh0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGFiZWxUZXh0SGVscGVyKElGaWd1cmUgZmlndXJlLCBTdHJpbmcgdGV4dCkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRUZXh0KHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldEljb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbEljb25IZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIEltYWdlIGljb24pIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfSBlbHNlIHsKLQkJCSgoTGFiZWwpIGZpZ3VyZSkuc2V0SWNvbihpY29uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChJRmlndXJlIGZpZ3VyZSkgewotCQl1bnJlZ2lzdGVyVmlzdWFscygpOwotCQlzZXRGaWd1cmUoZmlndXJlKTsKLQkJZGVmYXVsdFRleHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZmlndXJlKTsKLQkJcmVnaXN0ZXJWaXN1YWxzKCk7Ci0JCXJlZnJlc2hWaXN1YWxzKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldE1vZGVsQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUdyYXBoaWNhbEVkaXRQYXJ0IGdldENoaWxkQnlTZW1hbnRpY0hpbnQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0UGFyc2VyRWxlbWVudCgpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gcmVzb2x2ZVNlbWFudGljRWxlbWVudCgpOwotCQlyZXR1cm4gZWxlbWVudCAhPSBudWxsID8gZWxlbWVudCA6IChWaWV3KSBnZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXRMYWJlbEljb24oKSB7Ci0JCS8vCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkvLwkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihnZXRQYXJzZXJFbGVtZW50KCkpOwotCQkvLwkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkvLwkJCWRlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkvLwkJfQotCQkvLwkJcmV0dXJuIGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0UGFyc2VyKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDZWxsRWRpdG9yVmFsaWRhdG9yIGdldEVkaXRUZXh0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElDZWxsRWRpdG9yVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCWZpbmFsIEVPYmplY3QgZWxlbWVudCA9IGdldFBhcnNlckVsZW1lbnQoKTsKLQkJCQkJZmluYWwgSVBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzIHZhbGlkID0gKElQYXJzZXJFZGl0U3RhdHVzKSBnZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJCQkJLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGVXaXRoUmVzdWx0LkltcGwoKSB7Ci0KLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlzZXRSZXN1bHQocGFyc2VyLmlzVmFsaWRFZGl0U3RyaW5nKAotCQkJCQkJCQkJCQkJbmV3IEVPYmplY3RBZGFwdGVyKGVsZW1lbnQpLAotCQkJCQkJCQkJCQkJKFN0cmluZykgdmFsdWUpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQlyZXR1cm4gdmFsaWQuZ2V0Q29kZSgpID09IFBhcnNlckVkaXRTdGF0dXMuRURJVEFCTEUgPyBudWxsCi0JCQkJCQkJCTogdmFsaWQuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQkJCQkJaWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29tcGxldGlvblByb2Nlc3NvcigKLQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZ2V0UGFyc2VyRWxlbWVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJzZXJPcHRpb25zIGdldFBhcnNlck9wdGlvbnMoKSB7Ci0JCXJldHVybiBQYXJzZXJPcHRpb25zLk5PTkU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKHBhcnNlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFyc2VySGludCA9ICgoVmlldykgZ2V0TW9kZWwoKSkuZ2V0VHlwZSgpOwotCQkJUGFyc2VySGludEFkYXB0ZXIgaGludEFkYXB0ZXIgPSBuZXcgUGFyc2VySGludEFkYXB0ZXIoCi0JCQkJCWdldFBhcnNlckVsZW1lbnQoKSwgcGFyc2VySGludCkgewotCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCQkJaWYgKElFbGVtZW50VHlwZS5jbGFzcy5lcXVhbHMoYWRhcHRlcikpIHsKLQkJCQkJCXJldHVybiBEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFyc2VyID0gUGFyc2VyU2VydmljZS5nZXRJbnN0YW5jZSgpLmdldFBhcnNlcihoaW50QWRhcHRlcik7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFRleHREaXJlY3RFZGl0TWFuYWdlcih0aGlzLCBUZXh0RGlyZWN0RWRpdE1hbmFnZXIKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yQ2xhc3ModGhpcyksIERpYWdyYW1FZGl0UGFydEZhY3RvcnkKLQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KFBvaW50IGV2ZW50TG9jYXRpb24pIHsKLQkJaWYgKGdldE1hbmFnZXIoKS5nZXRDbGFzcygpID09IFRleHREaXJlY3RFZGl0TWFuYWdlci5jbGFzcykgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhldmVudExvY2F0aW9uCi0JCQkJCS5nZXRTV1RQb2ludCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoY2hhciBpbml0aWFsQ2hhcmFjdGVyKSB7Ci0JCWlmIChnZXRNYW5hZ2VyKCkgaW5zdGFuY2VvZiBUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIHsKLQkJCSgoVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSBnZXRNYW5hZ2VyKCkpLnNob3coaW5pdGlhbENoYXJhY3Rlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJZmluYWwgUmVxdWVzdCB0aGVSZXF1ZXN0ID0gcmVxdWVzdDsKLQkJdHJ5IHsKLQkJCWdldEVkaXRpbmdEb21haW4oKS5ydW5FeGNsdXNpdmUobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoaXNBY3RpdmUoKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCQkJCWlmICh0aGVSZXF1ZXN0Ci0JCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkuZ2V0KAotCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUikgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKLQkJCQkJCQlDaGFyYWN0ZXIgaW5pdGlhbENoYXIgPSAoQ2hhcmFjdGVyKSB0aGVSZXF1ZXN0Ci0JCQkJCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkKLQkJCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJCVJlcXVlc3RDb25zdGFudHMuUkVRX0RJUkVDVEVESVRfRVhURU5ERUREQVRBX0lOSVRJQUxfQ0hBUik7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoaW5pdGlhbENoYXIuY2hhclZhbHVlKCkpOwotCQkJCQkJfSBlbHNlIGlmICgodGhlUmVxdWVzdCBpbnN0YW5jZW9mIERpcmVjdEVkaXRSZXF1ZXN0KQotCQkJCQkJCQkmJiAoZ2V0RWRpdFRleHQoKS5lcXVhbHMoZ2V0TGFiZWxUZXh0KCkpKSkgewotCQkJCQkJCURpcmVjdEVkaXRSZXF1ZXN0IGVkaXRSZXF1ZXN0ID0gKERpcmVjdEVkaXRSZXF1ZXN0KSB0aGVSZXF1ZXN0OwotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KGVkaXRSZXF1ZXN0LmdldExvY2F0aW9uKCkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFZpc3VhbHMoKSB7Ci0JCXN1cGVyLnJlZnJlc2hWaXN1YWxzKCk7Ci0JCXJlZnJlc2hMYWJlbCgpOwotCQlyZWZyZXNoRm9udCgpOwotCQlyZWZyZXNoRm9udENvbG9yKCk7Ci0JCXJlZnJlc2hVbmRlcmxpbmUoKTsKLQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaExhYmVsKCkgewotCQlzZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsVGV4dCgpKTsKLQkJc2V0TGFiZWxJY29uSGVscGVyKGdldEZpZ3VyZSgpLCBnZXRMYWJlbEljb24oKSk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVW5kZXJsaW5lKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFVuZGVybGluZShzdHlsZS5pc1VuZGVybGluZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoU3RyaWtlVGhyb3VnaCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsICYmIGdldEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0RmlndXJlKCkpLnNldFRleHRTdHJpa2VUaHJvdWdoKHN0eWxlCi0JCQkJCS5pc1N0cmlrZVRocm91Z2goKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9udCgpIHsKLQkJRm9udFN0eWxlIHN0eWxlID0gKEZvbnRTdHlsZSkgZ2V0Rm9udFN0eWxlT3duZXJWaWV3KCkuZ2V0U3R5bGUoCi0JCQkJTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGUoKSk7Ci0JCWlmIChzdHlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBEaWFncmFtQ29uc3RhbnRzLmdldEZvbnROYW1lKHN0eWxlKTsKLQkJCUZvbnREYXRhIGZvbnREYXRhID0gbmV3IEZvbnREYXRhKGZvbnROYW1lLCBzdHlsZQotCQkJCQkuZ2V0Rm9udEhlaWdodCgpLCAoc3R5bGUuaXNCb2xkKCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUwpCi0JCQkJCXwgKHN0eWxlLmlzSXRhbGljKCkgPyBTV1QuSVRBTElDIDogU1dULk5PUk1BTCkpOwotCQkJc2V0Rm9udChmb250RGF0YSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rm9udENvbG9yKENvbG9yIGNvbG9yKSB7Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KE5vdGlmaWNhdGlvbiBldmVudCkgewotCQlPYmplY3QgZmVhdHVyZSA9IGV2ZW50LmdldEZlYXR1cmUoKTsKLQkJaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnRDb2xvcigpLmVxdWFscyhmZWF0dXJlKSkgewotCQkJSW50ZWdlciBjID0gKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlzZXRGb250Q29sb3IoRGlhZ3JhbUNvbG9yUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRDb2xvcihjKSk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfVW5kZXJsaW5lKCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoVW5kZXJsaW5lKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfU3RyaWtlVGhyb3VnaCgpCi0JCQkJLmVxdWFscyhmZWF0dXJlKSkgewotCQkJcmVmcmVzaFN0cmlrZVRocm91Z2goKTsKLQkJfSBlbHNlIGlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250SGVpZ2h0KCkuZXF1YWxzKAotCQkJCWZlYXR1cmUpCi0JCQkJfHwgTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udE5hbWUoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0JvbGQoKQotCQkJCQkJLmVxdWFscyhmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0l0YWxpYygpLmVxdWFscygKLQkJCQkJCWZlYXR1cmUpKSB7Ci0JCQlyZWZyZXNoRm9udCgpOwotCQl9IGVsc2UgewotCQkJaWYgKGdldFBhcnNlcigpICE9IG51bGwKLQkJCQkJJiYgZ2V0UGFyc2VyKCkuaXNBZmZlY3RpbmdFdmVudChldmVudCwKLQkJCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSkpIHsKLQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCX0KLQkJCWlmIChnZXRQYXJzZXIoKSBpbnN0YW5jZW9mIElTZW1hbnRpY1BhcnNlcikgewotCQkJCUlTZW1hbnRpY1BhcnNlciBtb2RlbFBhcnNlciA9IChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpOwotCQkJCWlmIChtb2RlbFBhcnNlci5hcmVTZW1hbnRpY0VsZW1lbnRzQWZmZWN0ZWQobnVsbCwgZXZlbnQpKSB7Ci0JCQkJCXJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCWlmIChyZXNvbHZlU2VtYW50aWNFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCQkJYWRkU2VtYW50aWNMaXN0ZW5lcnMoKTsKLQkJCQkJfQotCQkJCQlyZWZyZXNoTGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmUoKSB7Ci0JCUlGaWd1cmUgbGFiZWwgPSBjcmVhdGVGaWd1cmVQcmltKCk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUZpZ3VyZSBjcmVhdGVGaWd1cmVQcmltKCkgewotCQlyZXR1cm4gbmV3IExpbmtOYW1lRmlndXJlKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBMaW5rTmFtZUZpZ3VyZSBleHRlbmRzIFdyYXBMYWJlbCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBMaW5rTmFtZUZpZ3VyZSgpIHsKLQotCQkJdGhpcy5zZXRUZXh0KCIiKTsKLQkJCWNyZWF0ZUNvbnRlbnRzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbnRlbnRzKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSBmYWxzZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlTG9jYWxDb29yZGluYXRlcygpIHsKLQkJCXJldHVybiBteVVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlTG9jYWxDb29yZGluYXRlcyhib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMpIHsKLQkJCW15VXNlTG9jYWxDb29yZGluYXRlcyA9IHVzZUxvY2FsQ29vcmRpbmF0ZXM7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BhcnRzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWRmMDQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkVkaXRQb2xpY3lSb2xlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQudXRpbC5EaWFncmFtRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1JdGVtU2VtYW50aWNFZGl0UG9saWN5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCBleHRlbmRzIERpYWdyYW1FZGl0UGFydCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfSUQgPSAiV1BERCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSVNVQUxfSUQgPSA3OTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0KFZpZXcgdmlldykgewotCQlzdXBlcih2aWV3KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpIHsKLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3koKSk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUNhbm9uaWNhbEVkaXRQb2xpY3koKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uRXZlbnQoTm90aWZpY2F0aW9uIGV2ZW50KSB7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuVklFV19fVklTSUJMRS5lcXVhbHMoZXZlbnQuZ2V0RmVhdHVyZSgpKSkgewotCQkJT2JqZWN0IG5vdGlmaWVyID0gZXZlbnQuZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChub3RpZmllciA9PSBnZXRNb2RlbCgpKQotCQkJCXJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0JCQllbHNlIGlmIChldmVudC5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCXJlZnJlc2hDaGlsZHJlbigpOwotCQkJCURpYWdyYW1FZGl0b3JVdGlsLnJlZnJlc2hDb25uZWN0aW9uRWRpdFBhcnRzKHRoaXMpOwotCQkJfQotCQl9IGVsc2UKLQkJCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWN0aXZhdGUoKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkuYWRkQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuZGVhY3RpdmF0ZSgpOwotCQlPYmplY3QgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQlFT2JqZWN0IGUgPSAoKFZpZXcpIG1vZGVsKS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIHsKLQkJCQkoKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIGUpLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWM4MDljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5SZWN0YW5nbGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuRGlhZ3JhbUNvcmVSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLkRpYWdyYW1Db3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3ROb2RlQ2Fub25pY2FsRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXMuV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzLldvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkxheW91dEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5DcmVhdGVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5TaGFwZU5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5FZGl0UG9saWN5Um9sZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRyYXcyZC51aS5maWd1cmVzLldyYXBMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5nZWYudWkuZmlndXJlcy5EZWZhdWx0U2l6ZU5vZGVGaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZ2VmLnVpLmZpZ3VyZXMuTm9kZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0IGV4dGVuZHMgU2hhcGVOb2RlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDEwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY29udGVudFBhbmU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgcHJpbWFyeVNoYXBlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJc3VwZXIodmlldyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURlZmF1bHRFZGl0UG9saWNpZXMoKSB7Ci0KLQkJc3VwZXIuY3JlYXRlRGVmYXVsdEVkaXRQb2xpY2llcygpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuU0VNQU5USUNfUk9MRSwKLQkJCQluZXcgV29ya1Byb2R1Y3ROb2RlSXRlbVNlbWFudGljRWRpdFBvbGljeSgpKTsKLQkJaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeS5MQVlPVVRfUk9MRSwgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExheW91dEVkaXRQb2xpY3kgY3JlYXRlTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJTGF5b3V0RWRpdFBvbGljeSBsZXAgPSBuZXcgTGF5b3V0RWRpdFBvbGljeSgpIHsKLQotCQkJcHJvdGVjdGVkIEVkaXRQb2xpY3kgY3JlYXRlQ2hpbGRFZGl0UG9saWN5KEVkaXRQYXJ0IGNoaWxkKSB7Ci0JCQkJRWRpdFBvbGljeSByZXN1bHQgPSBjaGlsZAotCQkJCQkJLmdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDaGlsZHJlbkNvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZUNvbW1hbmQoQ3JlYXRlUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsZXA7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZU5vZGVTaGFwZSgpIHsKLQkJV29ya1Byb2R1Y3ROb2RlRmlndXJlIGZpZ3VyZSA9IG5ldyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUoKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZSA9IGZpZ3VyZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0Tm9kZUZpZ3VyZSBnZXRQcmltYXJ5U2hhcGUoKSB7Ci0JCXJldHVybiAoV29ya1Byb2R1Y3ROb2RlRmlndXJlKSBwcmltYXJ5U2hhcGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkZEZpeGVkQ2hpbGQoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCkgewotCQlpZiAoY2hpbGRFZGl0UGFydCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCkgewotCQkJKChXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQpIGNoaWxkRWRpdFBhcnQpCi0JCQkJCS5zZXRMYWJlbChnZXRQcmltYXJ5U2hhcGUoKS5nZXRGaWd1cmVOYW1lZE5vZGVOYW1lRmlndXJlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaXhlZENoaWxkKEVkaXRQYXJ0IGNoaWxkRWRpdFBhcnQpIHsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOb2RlRmlndXJlIGNyZWF0ZU5vZGVQbGF0ZSgpIHsKLQkJRGVmYXVsdFNpemVOb2RlRmlndXJlIHJlc3VsdCA9IG5ldyBEZWZhdWx0U2l6ZU5vZGVGaWd1cmUoZ2V0TWFwTW9kZSgpCi0JCQkJLkRQdG9MUCg0MCksIGdldE1hcE1vZGUoKS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGZpZ3VyZSBmb3IgdGhpcyBlZGl0IHBhcnQuCi0JICogCi0JICogQm9keSBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdCBkZXBlbmQgb24gc2V0dGluZ3MgaW4gZ2VuZXJhdGlvbiBtb2RlbAotCSAqIHNvIHlvdSBtYXkgc2FmZWx5IHJlbW92ZSA8aT5nZW5lcmF0ZWQ8L2k+IHRhZyBhbmQgbW9kaWZ5IGl0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTm9kZUZpZ3VyZSBjcmVhdGVOb2RlRmlndXJlKCkgewotCQlOb2RlRmlndXJlIGZpZ3VyZSA9IGNyZWF0ZU5vZGVQbGF0ZSgpOwotCQlmaWd1cmUuc2V0TGF5b3V0TWFuYWdlcihuZXcgU3RhY2tMYXlvdXQoKSk7Ci0JCUlGaWd1cmUgc2hhcGUgPSBjcmVhdGVOb2RlU2hhcGUoKTsKLQkJZmlndXJlLmFkZChzaGFwZSk7Ci0JCWNvbnRlbnRQYW5lID0gc2V0dXBDb250ZW50UGFuZShzaGFwZSk7Ci0JCXJldHVybiBmaWd1cmU7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0cmVhdHMgcGFzc2VkIGZpZ3VyZSBhcyBjb250ZW50IHBhbmUuCi0JICogUmVzcGVjdHMgbGF5b3V0IG9uZSBtYXkgaGF2ZSBzZXQgZm9yIGdlbmVyYXRlZCBmaWd1cmUuCi0JICogQHBhcmFtIG5vZGVTaGFwZSBpbnN0YW5jZSBvZiBnZW5lcmF0ZWQgZmlndXJlIGNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIHNldHVwQ29udGVudFBhbmUoSUZpZ3VyZSBub2RlU2hhcGUpIHsKLQkJaWYgKG5vZGVTaGFwZS5nZXRMYXlvdXRNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJQ29uc3RyYWluZWRUb29sYmFyTGF5b3V0IGxheW91dCA9IG5ldyBDb25zdHJhaW5lZFRvb2xiYXJMYXlvdXQoKTsKLQkJCWxheW91dC5zZXRTcGFjaW5nKGdldE1hcE1vZGUoKS5EUHRvTFAoNSkpOwotCQkJbm9kZVNoYXBlLnNldExheW91dE1hbmFnZXIobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gbm9kZVNoYXBlOyAvLyB1c2Ugbm9kZVNoYXBlIGl0c2VsZiBhcyBjb250ZW50UGFuZQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUZpZ3VyZSBnZXRDb250ZW50UGFuZSgpIHsKLQkJaWYgKGNvbnRlbnRQYW5lICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250ZW50UGFuZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudFBhbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFByaW1hcnlDaGlsZEVkaXRQYXJ0KCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRCeVNlbWFudGljSGludChEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRWaXN1YWwoRWRpdFBhcnQgY2hpbGRFZGl0UGFydCwgaW50IGluZGV4KSB7Ci0JCWlmIChhZGRGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuYWRkQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCwgLTEpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDaGlsZFZpc3VhbChFZGl0UGFydCBjaGlsZEVkaXRQYXJ0KSB7Ci0JCWlmIChyZW1vdmVGaXhlZENoaWxkKGNoaWxkRWRpdFBhcnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIucmVtb3ZlQ2hpbGRWaXN1YWwoY2hpbGRFZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGdldENvbnRlbnRQYW5lRm9yKElHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCkgewotCi0JCXJldHVybiBzdXBlci5nZXRDb250ZW50UGFuZUZvcihlZGl0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVGaWd1cmUgZXh0ZW5kcyBSZWN0YW5nbGVGaWd1cmUgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgV29ya1Byb2R1Y3ROb2RlRmlndXJlKCkgewotCi0JCQl0aGlzLnNldE91dGxpbmUoZmFsc2UpOwotCQkJY3JlYXRlQ29udGVudHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAbW9kaWZpZWQKLQkJICogCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHMoKSB7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWwgZmlnXzAgPSBuZXcgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsKCk7Ci0JCQlmaWdfMC5zZXRUZXh0KERpYWdyYW1Db3JlUmVzb3VyY2VzLldQRERfTmV3X1dvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0KLQkJCURpYWdyYW1Db3JlVXRpbC5zZXRMYWJlbFByb3BlcnRpZXMoZmlnXzApOwotCQkJc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShmaWdfMCk7Ci0KLQkJCU9iamVjdCBsYXlEYXRhMCA9IG51bGw7Ci0KLQkJCXRoaXMuYWRkKGZpZ18wLCBsYXlEYXRhMCk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXcmFwTGFiZWwgZk5hbWVkTm9kZU5hbWVGaWd1cmU7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBXcmFwTGFiZWwgZ2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZSgpIHsKLQkJCXJldHVybiBmTmFtZWROb2RlTmFtZUZpZ3VyZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2V0RmlndXJlTmFtZWROb2RlTmFtZUZpZ3VyZShXcmFwTGFiZWwgZmlnKSB7Ci0JCQlmTmFtZWROb2RlTmFtZUZpZ3VyZSA9IGZpZzsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlVc2VMb2NhbENvb3JkaW5hdGVzID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBib29sZWFuIHVzZUxvY2FsQ29vcmRpbmF0ZXMoKSB7Ci0JCQlyZXR1cm4gbXlVc2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHNldFVzZUxvY2FsQ29vcmRpbmF0ZXMoYm9vbGVhbiB1c2VMb2NhbENvb3JkaW5hdGVzKSB7Ci0JCQlteVVzZUxvY2FsQ29vcmRpbmF0ZXMgPSB1c2VMb2NhbENvb3JkaW5hdGVzOwotCQl9Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJc3VwZXIuYWN0aXZhdGUoKTsKLQkJT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgVmlldykgewotCQkJRU9iamVjdCBlID0gKChWaWV3KSBtb2RlbCkuZ2V0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSB7Ci0JCQkJKChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlKSBlKS5hZGRDb25zdW1lcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCU9iamVjdCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCUVPYmplY3QgZSA9ICgoVmlldykgbW9kZWwpLmdldEVsZW1lbnQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgewotCQkJCSgob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgZSkucmVtb3ZlQ29uc3VtZXIodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wYXJ0cy9Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIzZDNjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcGFydHMvV29ya1Byb2R1Y3ROb2RlTmFtZUVkaXRQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUnVubmFibGVXaXRoUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS51dGlsLlZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llcy5EaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnMuRGlhZ3JhbUVsZW1lbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkFjY2Vzc2libGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwb2xpY2llcy5Ob25SZXNpemFibGVFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5oYW5kbGVzLk5vblJlc2l6YWJsZUhhbmRsZUtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuRGlyZWN0RWRpdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnRvb2xzLkRpcmVjdEVkaXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLklQYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkNvbXBhcnRtZW50RWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklUZXh0QXdhcmVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwb2xpY2llcy5MYWJlbERpcmVjdEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5sMTBuLkRpYWdyYW1Db2xvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlRleHREaXJlY3RFZGl0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkuZmlndXJlcy5XcmFwTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUudXRpbC5FT2JqZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLklTZW1hbnRpY1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMucGFyc2VyLlBhcnNlckhpbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkZvbnRTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsRWRpdG9yVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCBleHRlbmRzIENvbXBhcnRtZW50RWRpdFBhcnQgaW1wbGVtZW50cwotCQlJVGV4dEF3YXJlRWRpdFBhcnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJU1VBTF9JRCA9IDQwMDE7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXJlY3RFZGl0TWFuYWdlciBtYW5hZ2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBwYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IHBhcnNlckVsZW1lbnRzOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRUZXh0OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQoVmlldyB2aWV3KSB7Ci0JCXN1cGVyKHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCkgewotCQlzdXBlci5jcmVhdGVEZWZhdWx0RWRpdFBvbGljaWVzKCk7Ci0JCWluc3RhbGxFZGl0UG9saWN5KEVkaXRQb2xpY3kuRElSRUNUX0VESVRfUk9MRSwKLQkJCQluZXcgTGFiZWxEaXJlY3RFZGl0UG9saWN5KCkpOwotCQlpbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5LlBSSU1BUllfRFJBR19ST0xFLAotCQkJCW5ldyBOb25SZXNpemFibGVFZGl0UG9saWN5KCkgewotCi0JCQkJCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVNlbGVjdGlvbkhhbmRsZXMoKSB7Ci0JCQkJCQlMaXN0IGhhbmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlOb25SZXNpemFibGVIYW5kbGVLaXQuYWRkTW92ZUhhbmRsZSgKLQkJCQkJCQkJKEdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCksIGhhbmRsZXMpOwotCQkJCQkJcmV0dXJuIGhhbmRsZXM7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiB1bmRlcnN0YW5kc1JlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUpIHsKLQkJaWYgKGZpZ3VyZSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJcmV0dXJuICgoV3JhcExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKExhYmVsKSBmaWd1cmUpLmdldFRleHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYWJlbFRleHRIZWxwZXIoSUZpZ3VyZSBmaWd1cmUsIFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChmaWd1cmUgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0gZWxzZSB7Ci0JCQkoKExhYmVsKSBmaWd1cmUpLnNldFRleHQodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSkgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQlyZXR1cm4gKChXcmFwTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICgoTGFiZWwpIGZpZ3VyZSkuZ2V0SWNvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldExhYmVsSWNvbkhlbHBlcihJRmlndXJlIGZpZ3VyZSwgSW1hZ2UgaWNvbikgewotCQlpZiAoZmlndXJlIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9IGVsc2UgewotCQkJKChMYWJlbCkgZmlndXJlKS5zZXRJY29uKGljb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFdyYXBMYWJlbCBmaWd1cmUpIHsKLQkJdW5yZWdpc3RlclZpc3VhbHMoKTsKLQkJc2V0RmlndXJlKGZpZ3VyZSk7Ci0JCWRlZmF1bHRUZXh0ID0gZ2V0TGFiZWxUZXh0SGVscGVyKGZpZ3VyZSk7Ci0JCXJlZ2lzdGVyVmlzdWFscygpOwotCQlyZWZyZXNoVmlzdWFscygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRNb2RlbENoaWxkcmVuKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElHcmFwaGljYWxFZGl0UGFydCBnZXRDaGlsZEJ5U2VtYW50aWNIaW50KFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFBhcnNlckVsZW1lbnQoKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQgOiAoVmlldykgZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0TGFiZWxJY29uKCkgewotCQkvLwkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJLy8JCQkJLmdldEl0ZW1JbWFnZURlc2NyaXB0b3IoZ2V0UGFyc2VyRWxlbWVudCgpKTsKLQkJLy8JCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJLy8JCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJLy8JCX0KLQkJLy8JCXJldHVybiBkZXNjcmlwdG9yLmNyZWF0ZUltYWdlKCk7Ci0JCXJldHVybiBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiIpOwkvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0ID0gZ2V0UGFyc2VyKCkuZ2V0UHJpbnRTdHJpbmcoCi0JCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpLAotCQkJCQlnZXRQYXJzZXJPcHRpb25zKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCXRleHQgPSBkZWZhdWx0VGV4dDsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgdGV4dCk7Ci0JCU9iamVjdCBwZEVkaXRQb2xpY3kgPSBnZXRFZGl0UG9saWN5KEVkaXRQb2xpY3kuUFJJTUFSWV9EUkFHX1JPTEUpOwotCQlpZiAocGRFZGl0UG9saWN5IGluc3RhbmNlb2YgRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSB7Ci0JCQkoKERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSkgcGRFZGl0UG9saWN5KS5yZWZyZXNoRmVlZGJhY2soKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRUZXh0KCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGdldFBhcnNlcigpLmdldEVkaXRTdHJpbmcoCi0JCQkJbmV3IEVPYmplY3RBZGFwdGVyKGdldFBhcnNlckVsZW1lbnQoKSksCi0JCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXRhYmxlKCkgewotCQlyZXR1cm4gZ2V0RWRpdFRleHQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNlbGxFZGl0b3JWYWxpZGF0b3IgZ2V0RWRpdFRleHRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUNlbGxFZGl0b3JWYWxpZGF0b3IoKSB7Ci0KLQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChmaW5hbCBPYmplY3QgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJZmluYWwgRU9iamVjdCBlbGVtZW50ID0gZ2V0UGFyc2VyRWxlbWVudCgpOwotCQkJCQlmaW5hbCBJUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQkJCQl0cnkgewotCQkJCQkJSVBhcnNlckVkaXRTdGF0dXMgdmFsaWQgPSAoSVBhcnNlckVkaXRTdGF0dXMpIGdldEVkaXRpbmdEb21haW4oKQotCQkJCQkJCQkucnVuRXhjbHVzaXZlKG5ldyBSdW5uYWJsZVdpdGhSZXN1bHQuSW1wbCgpIHsKLQotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXNldFJlc3VsdChwYXJzZXIuaXNWYWxpZEVkaXRTdHJpbmcoCi0JCQkJCQkJCQkJCQluZXcgRU9iamVjdEFkYXB0ZXIoZWxlbWVudCksCi0JCQkJCQkJCQkJCQkoU3RyaW5nKSB2YWx1ZSkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJCXJldHVybiB2YWxpZC5nZXRDb2RlKCkgPT0gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSA/IG51bGwKLQkJCQkJCQkJOiB2YWxpZC5nZXRNZXNzYWdlKCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7Ci0JCQkJCQlpZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNob3VsZG4ndCBnZXQgaGVyZQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBnZXRQYXJzZXIoKS5nZXRDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJCW5ldyBFT2JqZWN0QWRhcHRlcihnZXRQYXJzZXJFbGVtZW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcnNlck9wdGlvbnMgZ2V0UGFyc2VyT3B0aW9ucygpIHsKLQkJcmV0dXJuIFBhcnNlck9wdGlvbnMuTk9ORTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAocGFyc2VyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXJzZXJIaW50ID0gKChWaWV3KSBnZXRNb2RlbCgpKS5nZXRUeXBlKCk7Ci0JCQlQYXJzZXJIaW50QWRhcHRlciBoaW50QWRhcHRlciA9IG5ldyBQYXJzZXJIaW50QWRhcHRlcigKLQkJCQkJZ2V0UGFyc2VyRWxlbWVudCgpLCBwYXJzZXJIaW50KSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDE7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfTsKLQkJCXBhcnNlciA9IFBhcnNlclNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRQYXJzZXIoaGludEFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIERpcmVjdEVkaXRNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCXNldE1hbmFnZXIobmV3IFZhbGlkYXRpbmdUZXh0RGlyZWN0RWRpdE1hbmFnZXIodGhpcywKLQkJCQkJVmFsaWRhdGluZ1RleHREaXJlY3RFZGl0TWFuYWdlcgotCQkJCQkJCS5nZXRUZXh0Q2VsbEVkaXRvckNsYXNzKHRoaXMpLCBEaWFncmFtRWRpdFBhcnRGYWN0b3J5Ci0JCQkJCQkJLmdldFRleHRDZWxsRWRpdG9yTG9jYXRvcih0aGlzKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHR4dCkgewotCi0JCQkJCU9iamVjdCBvYmogPSBnZXRFZGl0UGFydCgpLmdldE1vZGVsKCk7Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG1vZGVsID0gKE5vZGUpIG9iajsKLQkJCQkJCUVPYmplY3QgdW1hTm9kZSA9IG1vZGVsLmdldEVsZW1lbnQoKTsKLQkJCQkJCQotCQkJCQkJaWYgKHVtYU5vZGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdE5vZGUpIHsKLQkJCQkJCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUgPSAob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSkgdW1hTm9kZTsKLQkJCQkJCQlPYmplY3QgZSA9IG5vZGUuZ2V0T2JqZWN0KCk7Ci0JCQkJCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBub2RlLmdldERpYWdyYW0oKS5nZXRTdXBwcmVzc2lvbigpOwotCQkJCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrV29ya1Byb2R1Y3REZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZSgKLQkJCQkJCQkJCWUsIHR4dCwgc3VwcHJlc3Npb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EaXJlY3RFZGl0KCkgewotCQkJCQkoKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydCkgZ2V0RWRpdFBhcnQoKSkKLQkJCQkJCQkucGVyZm9ybURpcmVjdEVkaXQoKTsKLQkJCQl9Ci0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYW5hZ2VyKERpcmVjdEVkaXRNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoKSB7Ci0JCWdldE1hbmFnZXIoKS5zaG93KCk7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXQoUG9pbnQgZXZlbnRMb2NhdGlvbikgewotCQlpZiAoZ2V0TWFuYWdlcigpIGluc3RhbmNlb2YgVGV4dERpcmVjdEVkaXRNYW5hZ2VyKSB7Ci0JCQkoKFRleHREaXJlY3RFZGl0TWFuYWdlcikgZ2V0TWFuYWdlcigpKS5zaG93KGV2ZW50TG9jYXRpb24KLQkJCQkJLmdldFNXVFBvaW50KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGlyZWN0RWRpdChjaGFyIGluaXRpYWxDaGFyYWN0ZXIpIHsKLQkJaWYgKGdldE1hbmFnZXIoKSBpbnN0YW5jZW9mIFRleHREaXJlY3RFZGl0TWFuYWdlcikgewotCQkJKChUZXh0RGlyZWN0RWRpdE1hbmFnZXIpIGdldE1hbmFnZXIoKSkuc2hvdyhpbml0aWFsQ2hhcmFjdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURpcmVjdEVkaXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlmaW5hbCBSZXF1ZXN0IHRoZVJlcXVlc3QgPSByZXF1ZXN0OwotCQl0cnkgewotCQkJZ2V0RWRpdGluZ0RvbWFpbigpLnJ1bkV4Y2x1c2l2ZShuZXcgUnVubmFibGUoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChpc0FjdGl2ZSgpICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkJaWYgKHRoZVJlcXVlc3QKLQkJCQkJCQkJLmdldEV4dGVuZGVkRGF0YSgpCi0JCQkJCQkJCS5nZXQoCi0JCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkJCUNoYXJhY3RlciBpbml0aWFsQ2hhciA9IChDaGFyYWN0ZXIpIHRoZVJlcXVlc3QKLQkJCQkJCQkJCS5nZXRFeHRlbmRlZERhdGEoKQotCQkJCQkJCQkJLmdldCgKLQkJCQkJCQkJCQkJUmVxdWVzdENvbnN0YW50cy5SRVFfRElSRUNURURJVF9FWFRFTkRFRERBVEFfSU5JVElBTF9DSEFSKTsKLQkJCQkJCQlwZXJmb3JtRGlyZWN0RWRpdChpbml0aWFsQ2hhci5jaGFyVmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgaWYgKCh0aGVSZXF1ZXN0IGluc3RhbmNlb2YgRGlyZWN0RWRpdFJlcXVlc3QpCi0JCQkJCQkJCSYmIChnZXRFZGl0VGV4dCgpLmVxdWFscyhnZXRMYWJlbFRleHQoKSkpKSB7Ci0JCQkJCQkJRGlyZWN0RWRpdFJlcXVlc3QgZWRpdFJlcXVlc3QgPSAoRGlyZWN0RWRpdFJlcXVlc3QpIHRoZVJlcXVlc3Q7Ci0JCQkJCQkJcGVyZm9ybURpcmVjdEVkaXQoZWRpdFJlcXVlc3QuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBlcmZvcm1EaXJlY3RFZGl0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoVmlzdWFscygpIHsKLQkJc3VwZXIucmVmcmVzaFZpc3VhbHMoKTsKLQkJcmVmcmVzaExhYmVsKCk7Ci0JCXJlZnJlc2hGb250KCk7Ci0JCXJlZnJlc2hGb250Q29sb3IoKTsKLQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQlyZWZyZXNoU3RyaWtlVGhyb3VnaCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoTGFiZWwoKSB7Ci0JCXNldExhYmVsVGV4dEhlbHBlcihnZXRGaWd1cmUoKSwgZ2V0TGFiZWxUZXh0KCkpOwotCQlzZXRMYWJlbEljb25IZWxwZXIoZ2V0RmlndXJlKCksIGdldExhYmVsSWNvbigpKTsKLQkJT2JqZWN0IHBkRWRpdFBvbGljeSA9IGdldEVkaXRQb2xpY3koRWRpdFBvbGljeS5QUklNQVJZX0RSQUdfUk9MRSk7Ci0JCWlmIChwZEVkaXRQb2xpY3kgaW5zdGFuY2VvZiBEaWFncmFtVGV4dFNlbGVjdGlvbkVkaXRQb2xpY3kpIHsKLQkJCSgoRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5KSBwZEVkaXRQb2xpY3kpLnJlZnJlc2hGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmxpbmUoKSB7Ci0JCUZvbnRTdHlsZSBzdHlsZSA9IChGb250U3R5bGUpIGdldEZvbnRTdHlsZU93bmVyVmlldygpLmdldFN0eWxlKAotCQkJCU5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlKCkpOwotCQlpZiAoc3R5bGUgIT0gbnVsbCAmJiBnZXRGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEZpZ3VyZSgpKS5zZXRUZXh0VW5kZXJsaW5lKHN0eWxlLmlzVW5kZXJsaW5lKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTdHJpa2VUaHJvdWdoKCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgZ2V0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRGaWd1cmUoKSkuc2V0VGV4dFN0cmlrZVRocm91Z2goc3R5bGUKLQkJCQkJLmlzU3RyaWtlVGhyb3VnaCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb250KCkgewotCQlGb250U3R5bGUgc3R5bGUgPSAoRm9udFN0eWxlKSBnZXRGb250U3R5bGVPd25lclZpZXcoKS5nZXRTdHlsZSgKLQkJCQlOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZSgpKTsKLQkJaWYgKHN0eWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmb250TmFtZSA9IERpYWdyYW1Db25zdGFudHMuZ2V0Rm9udE5hbWUoc3R5bGUpOwotCQkJRm9udERhdGEgZm9udERhdGEgPSBuZXcgRm9udERhdGEoZm9udE5hbWUsIHN0eWxlCi0JCQkJCS5nZXRGb250SGVpZ2h0KCksIChzdHlsZS5pc0JvbGQoKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTCkKLQkJCQkJfCAoc3R5bGUuaXNJdGFsaWMoKSA/IFNXVC5JVEFMSUMgOiBTV1QuTk9STUFMKSk7Ci0JCQlzZXRGb250KGZvbnREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZvbnRDb2xvcihDb2xvciBjb2xvcikgewotCQlDb2xvciBjID0gRGlhZ3JhbUNvcmVVdGlsLmdldEZvbnRDb2xvcih0aGlzKTsKLQkJaWYgKGMgIT0gbnVsbCkgewotCQkJY29sb3IgPSBjOwotCQl9Ci0JCWdldEZpZ3VyZSgpLnNldEZvcmVncm91bmRDb2xvcihjb2xvcik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbWFudGljTGlzdGVuZXJzKCkgewotCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IHJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKTsKLQkJCXBhcnNlckVsZW1lbnRzID0gKChJU2VtYW50aWNQYXJzZXIpIGdldFBhcnNlcigpKQotCQkJCQkuZ2V0U2VtYW50aWNFbGVtZW50c0JlaW5nUGFyc2VkKGVsZW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZXJFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCWFkZExpc3RlbmVyRmlsdGVyKAotCQkJCQkJIlNlbWFudGljTW9kZWwiICsgaSwgdGhpcywgKEVPYmplY3QpIHBhcnNlckVsZW1lbnRzLmdldChpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2VtYW50aWNMaXN0ZW5lcnMoKSB7Ci0JCWlmIChwYXJzZXJFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlckVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVtb3ZlTGlzdGVuZXJGaWx0ZXIoIlNlbWFudGljTW9kZWwiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnJlbW92ZVNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc2libGVFZGl0UGFydCBnZXRBY2Nlc3NpYmxlRWRpdFBhcnQoKSB7Ci0JCWlmIChhY2Nlc3NpYmxlRVAgPT0gbnVsbCkgewotCQkJYWNjZXNzaWJsZUVQID0gbmV3IEFjY2Vzc2libGVHcmFwaGljYWxFZGl0UGFydCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsKLQkJCQkJZS5yZXN1bHQgPSBnZXRMYWJlbFRleHRIZWxwZXIoZ2V0RmlndXJlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGFjY2Vzc2libGVFUDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBWaWV3IGdldEZvbnRTdHlsZU93bmVyVmlldygpIHsKLQkJcmV0dXJuIGdldFByaW1hcnlWaWV3KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmFkZE5vdGF0aW9uYWxMaXN0ZW5lcnMoKTsKLQkJYWRkTGlzdGVuZXJGaWx0ZXIoIlByaW1hcnlWaWV3IiwgdGhpcywgZ2V0UHJpbWFyeVZpZXcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpIHsKLQkJc3VwZXIucmVtb3ZlTm90YXRpb25hbExpc3RlbmVycygpOwotCQlyZW1vdmVMaXN0ZW5lckZpbHRlcigiUHJpbWFyeVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25FdmVudChOb3RpZmljYXRpb24gZXZlbnQpIHsKLQkJT2JqZWN0IGZlYXR1cmUgPSBldmVudC5nZXRGZWF0dXJlKCk7Ci0JCWlmIChOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Gb250Q29sb3IoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCUludGVnZXIgYyA9IChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJc2V0Rm9udENvbG9yKERpYWdyYW1Db2xvclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29sb3IoYykpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1VuZGVybGluZSgpLmVxdWFscygKLQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaFVuZGVybGluZSgpOwotCQl9IGVsc2UgaWYgKE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX1N0cmlrZVRocm91Z2goKQotCQkJCS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCXJlZnJlc2hTdHJpa2VUaHJvdWdoKCk7Ci0JCX0gZWxzZSBpZiAoTm90YXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRGb250U3R5bGVfRm9udEhlaWdodCgpLmVxdWFscygKLQkJCQlmZWF0dXJlKQotCQkJCXx8IE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Rm9udFN0eWxlX0ZvbnROYW1lKCkuZXF1YWxzKAotCQkJCQkJZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9Cb2xkKCkKLQkJCQkJCS5lcXVhbHMoZmVhdHVyZSkKLQkJCQl8fCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEZvbnRTdHlsZV9JdGFsaWMoKS5lcXVhbHMoCi0JCQkJCQlmZWF0dXJlKSkgewotCQkJcmVmcmVzaEZvbnQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsCi0JCQkJCSYmIGdldFBhcnNlcigpLmlzQWZmZWN0aW5nRXZlbnQoZXZlbnQsCi0JCQkJCQkJZ2V0UGFyc2VyT3B0aW9ucygpLmludFZhbHVlKCkpKSB7Ci0JCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQl9Ci0JCQlpZiAoZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBJU2VtYW50aWNQYXJzZXIpIHsKLQkJCQlJU2VtYW50aWNQYXJzZXIgbW9kZWxQYXJzZXIgPSAoSVNlbWFudGljUGFyc2VyKSBnZXRQYXJzZXIoKTsKLQkJCQlpZiAobW9kZWxQYXJzZXIuYXJlU2VtYW50aWNFbGVtZW50c0FmZmVjdGVkKG51bGwsIGV2ZW50KSkgewotCQkJCQlyZW1vdmVTZW1hbnRpY0xpc3RlbmVycygpOwotCQkJCQlpZiAocmVzb2x2ZVNlbWFudGljRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJCWFkZFNlbWFudGljTGlzdGVuZXJzKCk7Ci0JCQkJCX0KLQkJCQkJcmVmcmVzaExhYmVsKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLmhhbmRsZU5vdGlmaWNhdGlvbkV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRmlndXJlKCkgewotCQkvLyBQYXJlbnQgc2hvdWxkIGFzc2lnbiBvbmUgdXNpbmcgc2V0TGFiZWwoKSBtZXRob2QKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmI2ZDliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtQmFzZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuUmVjb25uZWN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5jb21tYW5kcy5EZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuU2VtYW50aWNFZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuRWRpdENvbW1hbmRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFZGl0SGVscGVyQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNvbmZpZ3VyZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5DcmVhdGVFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95RWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EZXN0cm95UmVmZXJlbmNlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuR2V0RWRpdENvbnRleHRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuSUVkaXRDb21tYW5kUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLk1vdmVSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LmhlbHBlcnMuRGlhZ3JhbUJhc2VFZGl0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLlJlcXVlc3Q7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMgU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEV4dGVuZGVkIHJlcXVlc3QgZGF0YSBrZXkgdG8gaG9sZCBlZGl0cGFydCB2aXN1YWwgaWQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJU1VBTF9JRF9LRVkgPSAidmlzdWFsX2lkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkIHZpc3VhbCBpZCBvZiBlZGl0ZWQgZWRpdHBhcnQgdG8gZXh0ZW5kZWQgZGF0YSBvZiB0aGUgcmVxdWVzdAotCSAqIHNvIGNvbW1hbmQgc3dpdGNoIGNhbiBkZWNpZGUgd2hhdCBraW5kIG9mIGRpYWdyYW0gZWxlbWVudCBpcyBiZWluZyBlZGl0ZWQuCi0JICogSXQgaXMgZG9uZSBpbiB0aG9zZSBjYXNlcyB3aGVuIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGRlZHVjZSBkaWFncmFtCi0JICogZWxlbWVudCBraW5kIGZyb20gZG9tYWluIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tYW5kIGdldENvbW1hbmQoUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZXF1ZXN0IGluc3RhbmNlb2YgUmVjb25uZWN0UmVxdWVzdCkgewotCQkJT2JqZWN0IHZpZXcgPSAoKFJlY29ubmVjdFJlcXVlc3QpIHJlcXVlc3QpLmdldENvbm5lY3Rpb25FZGl0UGFydCgpCi0JCQkJCS5nZXRNb2RlbCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5Ci0JCQkJCQkuZ2V0VmlzdWFsSUQoKFZpZXcpIHZpZXcpKTsKLQkJCQlyZXF1ZXN0LmdldEV4dGVuZGVkRGF0YSgpLnB1dChWSVNVQUxfSURfS0VZLCBpZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB2aXN1YWwgaWQgZnJvbSByZXF1ZXN0IHBhcmFtZXRlcnMuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmlzdWFsSUQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCU9iamVjdCBpZCA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKFZJU1VBTF9JRF9LRVkpOwotCQlyZXR1cm4gaWQgaW5zdGFuY2VvZiBJbnRlZ2VyID8gKChJbnRlZ2VyKSBpZCkuaW50VmFsdWUoKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRTZW1hbnRpY0NvbW1hbmQoSUVkaXRDb21tYW5kUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCUlFZGl0Q29tbWFuZFJlcXVlc3QgY29tcGxldGVkUmVxdWVzdCA9IGNvbXBsZXRlUmVxdWVzdChyZXF1ZXN0KTsKLQkJT2JqZWN0IGVkaXRIZWxwZXJDb250ZXh0ID0gY29tcGxldGVkUmVxdWVzdC5nZXRFZGl0SGVscGVyQ29udGV4dCgpOwotCQlpZiAoZWRpdEhlbHBlckNvbnRleHQgaW5zdGFuY2VvZiBWaWV3Ci0JCQkJfHwgKGVkaXRIZWxwZXJDb250ZXh0IGluc3RhbmNlb2YgSUVkaXRIZWxwZXJDb250ZXh0ICYmICgoSUVkaXRIZWxwZXJDb250ZXh0KSBlZGl0SGVscGVyQ29udGV4dCkKLQkJCQkJCS5nZXRFT2JqZWN0KCkgaW5zdGFuY2VvZiBWaWV3KSkgewotCQkJLy8gbm8gc2VtYW50aWMgY29tbWFuZHMgYXJlIHByb3ZpZGVkIGZvciBwdXJlIGRlc2lnbiBlbGVtZW50cwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKGVkaXRIZWxwZXJDb250ZXh0ID09IG51bGwpIHsKLQkJCWVkaXRIZWxwZXJDb250ZXh0ID0gVmlld1V0aWwKLQkJCQkJLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0RWxlbWVudFR5cGUoZWRpdEhlbHBlckNvbnRleHQpOwotCQlpZiAoZWxlbWVudFR5cGUgPT0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldFR5cGUoCi0JCQkJIm9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQllbGVtZW50VHlwZSA9IG51bGw7Ci0JCX0KLQkJQ29tbWFuZCBlcENvbW1hbmQgPSBnZXRTZW1hbnRpY0NvbW1hbmRTd2l0Y2goY29tcGxldGVkUmVxdWVzdCk7Ci0JCWlmIChlcENvbW1hbmQgIT0gbnVsbCkgewotCQkJSUNvbW1hbmQgY29tbWFuZCA9IGVwQ29tbWFuZCBpbnN0YW5jZW9mIElDb21tYW5kUHJveHkgPyAoKElDb21tYW5kUHJveHkpIGVwQ29tbWFuZCkKLQkJCQkJLmdldElDb21tYW5kKCkKLQkJCQkJOiBuZXcgQ29tbWFuZFByb3h5KGVwQ29tbWFuZCk7Ci0JCQljb21wbGV0ZWRSZXF1ZXN0LnNldFBhcmFtZXRlcigKLQkJCQkJRGlhZ3JhbUJhc2VFZGl0SGVscGVyLkVESVRfUE9MSUNZX0NPTU1BTkQsIGNvbW1hbmQpOwotCQl9Ci0JCUNvbW1hbmQgZWhDb21tYW5kID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlICE9IG51bGwpIHsKLQkJCUlDb21tYW5kIGNvbW1hbmQgPSBlbGVtZW50VHlwZS5nZXRFZGl0Q29tbWFuZChjb21wbGV0ZWRSZXF1ZXN0KTsKLQkJCWlmIChjb21tYW5kICE9IG51bGwpIHsKLQkJCQlpZiAoIShjb21tYW5kIGluc3RhbmNlb2YgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQpKSB7Ci0JCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCQkJCWNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwKLQkJCQkJCQludWxsKS5jb21wb3NlKGNvbW1hbmQpOwotCQkJCX0KLQkJCQllaENvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eShjb21tYW5kKTsKLQkJCX0KLQkJfQotCQlib29sZWFuIHNob3VsZFByb2NlZWQgPSB0cnVlOwotCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQlzaG91bGRQcm9jZWVkID0gc2hvdWxkUHJvY2VlZCgoRGVzdHJveVJlcXVlc3QpIGNvbXBsZXRlZFJlcXVlc3QpOwotCQl9Ci0JCWlmIChzaG91bGRQcm9jZWVkKSB7Ci0JCQlpZiAoY29tcGxldGVkUmVxdWVzdCBpbnN0YW5jZW9mIERlc3Ryb3lSZXF1ZXN0KSB7Ci0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQkJCUNvbW1hbmQgZGVsZXRlVmlld0NvbW1hbmQgPSBuZXcgSUNvbW1hbmRQcm94eSgKLQkJCQkJCW5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sIChWaWV3KSBnZXRIb3N0KCkKLQkJCQkJCQkJLmdldE1vZGVsKCkpKTsKLQkJCQllaENvbW1hbmQgPSBlaENvbW1hbmQgPT0gbnVsbCA/IGRlbGV0ZVZpZXdDb21tYW5kIDogZWhDb21tYW5kCi0JCQkJCQkuY2hhaW4oZGVsZXRlVmlld0NvbW1hbmQpOwotCQkJfQotCQkJcmV0dXJuIGVoQ29tbWFuZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0U2VtYW50aWNDb21tYW5kU3dpdGNoKElFZGl0Q29tbWFuZFJlcXVlc3QgcmVxKSB7Ci0JCWlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZCgoQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBDcmVhdGVFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldENyZWF0ZUNvbW1hbmQoKENyZWF0ZUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIENvbmZpZ3VyZVJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRDb25maWd1cmVDb21tYW5kKChDb25maWd1cmVSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lFbGVtZW50UmVxdWVzdCkgewotCQkJcmV0dXJuIGdldERlc3Ryb3lFbGVtZW50Q29tbWFuZCgoRGVzdHJveUVsZW1lbnRSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoKERlc3Ryb3lSZWZlcmVuY2VSZXF1ZXN0KSByZXEpOwotCQl9IGVsc2UgaWYgKHJlcSBpbnN0YW5jZW9mIER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldER1cGxpY2F0ZUNvbW1hbmQoKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBHZXRFZGl0Q29udGV4dFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRFZGl0Q29udGV4dENvbW1hbmQoKEdldEVkaXRDb250ZXh0UmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBNb3ZlUmVxdWVzdCkgewotCQkJcmV0dXJuIGdldE1vdmVDb21tYW5kKChNb3ZlUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlZmVyZW5jZVJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVmZXJlbmNlUmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QpIHsKLQkJCXJldHVybiBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoKFJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdCkgcmVxKTsKLQkJfSBlbHNlIGlmIChyZXEgaW5zdGFuY2VvZiBTZXRSZXF1ZXN0KSB7Ci0JCQlyZXR1cm4gZ2V0U2V0Q29tbWFuZCgoU2V0UmVxdWVzdCkgcmVxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q29uZmlndXJlQ29tbWFuZChDb25maWd1cmVSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldFNldENvbW1hbmQoU2V0UmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldEVkaXRDb250ZXh0Q29tbWFuZChHZXRFZGl0Q29udGV4dFJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveVJlZmVyZW5jZUNvbW1hbmQoRGVzdHJveVJlZmVyZW5jZVJlcXVlc3QgcmVxKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREdXBsaWNhdGVDb21tYW5kKER1cGxpY2F0ZUVsZW1lbnRzUmVxdWVzdCByZXEpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldE1vdmVDb21tYW5kKE1vdmVSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWZlcmVuY2VSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKAotCQkJUmVvcmllbnRSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0TVNMV3JhcHBlcihJQ29tbWFuZCBjbWQpIHsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KGNtZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFNlbWFudGljRWxlbWVudCgpIHsKLQkJcmV0dXJuIFZpZXdVdGlsLnJlc29sdmVTZW1hbnRpY0VsZW1lbnQoKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG5ldyByZWxhdGlvbnNoaXAgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZ29lcyB1cCBieSBjb250YWlubWVudCBoaWVyYXJjaHkgc3RhcnRpbmcgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGluc3RhbmNlIG9mCi0JICogdGhlIHNwZWNpZmllZCBjb250YWluZXIgY2xhc3MuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihPYmplY3QgdWVsZW1lbnQsCi0JCQlFQ2xhc3MgY29udGFpbmVyQ2xhc3MsIElFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCWlmICh1ZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSB1ZWxlbWVudDsKLQkJCWZvciAoOyBlbGVtZW50ICE9IG51bGw7IGVsZW1lbnQgPSBlbGVtZW50LmVDb250YWluZXIoKSkgewotCQkJCWlmIChjb250YWluZXJDbGFzcy5pc1N1cGVyVHlwZU9mKGVsZW1lbnQuZUNsYXNzKCkpKSB7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVkaXRpbmcgZG9tYWluIGZyb20gdGhlIGhvc3QgZWRpdCBwYXJ0LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJcmV0dXJuICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpLmdldEVkaXRpbmdEb21haW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbW1hbmQgdG8gZGVzdHJveSB0aGUgbGluay4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0RGVzdHJveUVsZW1lbnRDb21tYW5kKFZpZXcgdmlldywgYm9vbGVhbiBjb25maXJtKSB7Ci0JCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkKLQkJCQkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCh2aWV3KTsKLQkJRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgRGVzdHJveUVsZW1lbnRSZXF1ZXN0KAotCQkJCWdldEVkaXRpbmdEb21haW4oKSwgY29uZmlybSk7Ci0JCXJldHVybiBlZGl0UGFydC5nZXRDb21tYW5kKG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKHJlcXVlc3QsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBjb21tYW5kcyB0byBkZXN0cm95IGFsbCBob3N0IGluY29taW5nIGFuZCBvdXRnb2luZyBsaW5rcy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kQ29tbWFuZCBnZXREZXN0cm95RWRnZXNDb21tYW5kKGJvb2xlYW4gY29uZmlybSkgewotCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB2aWV3LmdldFRhcmdldEVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY21kLmFkZChnZXREZXN0cm95RWxlbWVudENvbW1hbmQoKEVkZ2UpIGl0Lm5leHQoKSwgY29uZmlybSkpOwotCQl9Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTGlua0NvbnN0cmFpbnRzIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkNyZWF0ZUxpbmtfMzAwMShOb2RlIGNvbnRhaW5lciwgTm9kZSBzb3VyY2UsCi0JCQkJTm9kZSB0YXJnZXQpIHsKLQkJCXJldHVybiBjYW5FeGlzdExpbmtfMzAwMShjb250YWluZXIsIHNvdXJjZSwgdGFyZ2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRXhpc3RMaW5rXzMwMDEoTm9kZSBjb250YWluZXIsIE5vZGUgc291cmNlLAotCQkJCU5vZGUgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUV4dE5vZGVMYWJlbEhvc3RMYXlvdXRFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNzNhYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1FeHROb2RlTGFiZWxIb3N0TGF5b3V0RWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5lZGl0cG9saWNpZXMuTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuQ2hhbmdlQm91bmRzUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucmVxdWVzdHMuR3JvdXBSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLlhZTGF5b3V0RWRpdFBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRXh0Tm9kZUxhYmVsSG9zdExheW91dEVkaXRQb2xpY3kgZXh0ZW5kcyBYWUxheW91dEVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGF5b3V0RWRpdFBvbGljeSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGF5b3V0RWRpdFBvbGljeSBnZXRSZWFsTGF5b3V0RWRpdFBvbGljeSgpIHsKLQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFsTGF5b3V0RWRpdFBvbGljeShMYXlvdXRFZGl0UG9saWN5IHJlYWxMYXlvdXRFZGl0UG9saWN5KSB7Ci0JCXRoaXMucmVhbExheW91dEVkaXRQb2xpY3kgPSByZWFsTGF5b3V0RWRpdFBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFeHRlcm5hbExhYmVsKEVkaXRQYXJ0IGVkaXRQYXJ0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgZ2V0RXh0ZXJuYWxMYWJlbHMoR3JvdXBSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJTGlzdCBlZGl0UGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyZXF1ZXN0LmdldEVkaXRQYXJ0cygpICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXF1ZXN0LmdldEVkaXRQYXJ0cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgaXQubmV4dCgpOwotCQkJCWlmIChpc0V4dGVybmFsTGFiZWwoZWRpdFBhcnQpKSB7Ci0JCQkJCWVkaXRQYXJ0cy5hZGQoZWRpdFBhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBnZXRDb21tYW5kKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAoUkVRX01PVkVfQ0hJTERSRU4uZXF1YWxzKHJlcXVlc3QuZ2V0VHlwZSgpKSkgewotCQkJQ2hhbmdlQm91bmRzUmVxdWVzdCBjYlJlcXVlc3QgPSAoQ2hhbmdlQm91bmRzUmVxdWVzdCkgcmVxdWVzdDsKLQkJCUxpc3QgZXh0TGFiZWxzID0gZ2V0RXh0ZXJuYWxMYWJlbHMoY2JSZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCUxpc3QgZWRpdFBhcnRzID0gY2JSZXF1ZXN0LmdldEVkaXRQYXJ0cygpOwotCQkJCUNvbW1hbmQgY21kID0gbnVsbDsKLQkJCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCQkJJiYgZWRpdFBhcnRzLnNpemUoKSA+IGV4dExhYmVscy5zaXplKCkpIHsKLQkJCQkJTGlzdCBvdGhlciA9IG5ldyBBcnJheUxpc3QoZWRpdFBhcnRzKTsKLQkJCQkJb3RoZXIucmVtb3ZlQWxsKGV4dExhYmVscyk7Ci0JCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMob3RoZXIpOwotCQkJCQljbWQgPSByZWFsTGF5b3V0RWRpdFBvbGljeS5nZXRDb21tYW5kKHJlcXVlc3QpOwotCQkJCX0KLQkJCQljYlJlcXVlc3Quc2V0RWRpdFBhcnRzKGV4dExhYmVscyk7Ci0JCQkJQ29tbWFuZCBleHRMYWJlbHNDbWQgPSBnZXRNb3ZlQ2hpbGRyZW5Db21tYW5kKHJlcXVlc3QpOwotCQkJCWNiUmVxdWVzdC5zZXRFZGl0UGFydHMoZWRpdFBhcnRzKTsKLQkJCQlyZXR1cm4gY21kID09IG51bGwgPyBleHRMYWJlbHNDbWQgOiBjbWQuY2hhaW4oZXh0TGFiZWxzQ21kKTsKLQkJCX0KLQkJfQotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdCkgewotCQkJTGlzdCBleHRMYWJlbHMgPSBnZXRFeHRlcm5hbExhYmVscygoR3JvdXBSZXF1ZXN0KSByZXF1ZXN0KTsKLQkJCWlmICghZXh0TGFiZWxzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWFsTGF5b3V0RWRpdFBvbGljeSA9PSBudWxsID8gbnVsbCA6IHJlYWxMYXlvdXRFZGl0UG9saWN5Ci0JCQkJLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0Q29uc3RyYWludEZvcihDaGFuZ2VCb3VuZHNSZXF1ZXN0IHJlcXVlc3QsCi0JCQlHcmFwaGljYWxFZGl0UGFydCBjaGlsZCkgewotCQlpbnQgZHggPSAoKEludGVnZXIpIFZpZXdVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlVmFsdWUoKFZpZXcpIGNoaWxkCi0JCQkJLmdldE1vZGVsKCksIE5vdGF0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TG9jYXRpb25fWCgpKSkKLQkJCQkuaW50VmFsdWUoKTsKLQkJaW50IGR5ID0gKChJbnRlZ2VyKSBWaWV3VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZVZhbHVlKChWaWV3KSBjaGlsZAotCQkJCS5nZXRNb2RlbCgpLCBOb3RhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldExvY2F0aW9uX1koKSkpCi0JCQkJLmludFZhbHVlKCk7Ci0JCVJlY3RhbmdsZSByID0gbmV3IFJlY3RhbmdsZShkeCwgZHksIDAsIDApOwotCQljaGlsZC5nZXRGaWd1cmUoKS50cmFuc2xhdGVUb0Fic29sdXRlKHIpOwotCQlyLnRyYW5zbGF0ZShyZXF1ZXN0LmdldE1vdmVEZWx0YSgpKTsKLQkJY2hpbGQuZ2V0RmlndXJlKCkudHJhbnNsYXRlVG9SZWxhdGl2ZShyKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHVuZGVyc3RhbmRzUmVxdWVzdChSZXF1ZXN0IHJlcSkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbAotCQkJCSYmIHJlYWxMYXlvdXRFZGl0UG9saWN5LnVuZGVyc3RhbmRzUmVxdWVzdChyZXEpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIudW5kZXJzdGFuZHNSZXF1ZXN0KHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlQ2hpbGQoRWRpdFBhcnQgY2hpbGQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9zdChFZGl0UGFydCBob3N0KSB7Ci0JCXN1cGVyLnNldEhvc3QoaG9zdCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5zZXRIb3N0KGhvc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgewotCQlzdXBlci5hY3RpdmF0ZSgpOwotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuYWN0aXZhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlKCkgewotCQlzdXBlci5kZWFjdGl2YXRlKCk7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5kZWFjdGl2YXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVkaXRQYXJ0IGdldFRhcmdldEVkaXRQYXJ0KFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlYWxMYXlvdXRFZGl0UG9saWN5LmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEVkaXRQYXJ0KHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dTb3VyY2VGZWVkYmFjayhSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlYWxMYXlvdXRFZGl0UG9saWN5ICE9IG51bGwpIHsKLQkJCXJlYWxMYXlvdXRFZGl0UG9saWN5LnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLnNob3dTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlcmFzZVNvdXJjZUZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuZXJhc2VTb3VyY2VGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCXN1cGVyLmVyYXNlU291cmNlRmVlZGJhY2socmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1RhcmdldEZlZWRiYWNrKFJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVhbExheW91dEVkaXRQb2xpY3kgIT0gbnVsbCkgewotCQkJcmVhbExheW91dEVkaXRQb2xpY3kuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2hvd1RhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVyYXNlVGFyZ2V0RmVlZGJhY2soUmVxdWVzdCByZXF1ZXN0KSB7Ci0JCWlmIChyZWFsTGF5b3V0RWRpdFBvbGljeSAhPSBudWxsKSB7Ci0JCQlyZWFsTGF5b3V0RWRpdFBvbGljeS5lcmFzZVRhcmdldEZlZWRiYWNrKHJlcXVlc3QpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuZXJhc2VUYXJnZXRGZWVkYmFjayhyZXF1ZXN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxZDVjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnJlcXVlc3RzLkNyZWF0ZUNvbm5lY3Rpb25SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tcG9zaXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuZWRpdGhlbHBlcnMuQ3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JR3JhcGhpY2FsRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5DcmVhdGVDb25uZWN0aW9uVmlld0FuZEVsZW1lbnRSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5EaWFncmFtUmVvcmllbnRDb25uZWN0aW9uVmlld0NvbW1hbmQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5IGV4dGVuZHMgR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlpZiAocmVxdWVzdCBpbnN0YW5jZW9mIENyZWF0ZUNvbm5lY3Rpb25WaWV3QW5kRWxlbWVudFJlcXVlc3QpIHsKLQkJCUNyZWF0ZUVsZW1lbnRSZXF1ZXN0QWRhcHRlciByZXF1ZXN0QWRhcHRlciA9ICgoQ3JlYXRlQ29ubmVjdGlvblZpZXdBbmRFbGVtZW50UmVxdWVzdCkgcmVxdWVzdCkKLQkJCQkJLmdldENvbm5lY3Rpb25WaWV3QW5kRWxlbWVudERlc2NyaXB0b3IoKQotCQkJCQkuZ2V0Q3JlYXRlRWxlbWVudFJlcXVlc3RBZGFwdGVyKCk7Ci0JCQlyZXR1cm4gKElFbGVtZW50VHlwZSkgcmVxdWVzdEFkYXB0ZXIuZ2V0QWRhcHRlcihJRWxlbWVudFR5cGUuY2xhc3MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDb25uZWN0aW9uV2l0aFJlb3JpZW50ZWRWaWV3Q29tcGxldGVDb21tYW5kKAotCQkJQ3JlYXRlQ29ubmVjdGlvblJlcXVlc3QgcmVxdWVzdCkgewotCQlJQ29tbWFuZFByb3h5IGMgPSAoSUNvbW1hbmRQcm94eSkgc3VwZXIKLQkJCQkuZ2V0Q29ubmVjdGlvbkNvbXBsZXRlQ29tbWFuZChyZXF1ZXN0KTsKLQkJQ29tcG9zaXRlQ29tbWFuZCBjYyA9IChDb21wb3NpdGVDb21tYW5kKSBjLmdldElDb21tYW5kKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKElHcmFwaGljYWxFZGl0UGFydCkgZ2V0SG9zdCgpKQotCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCURpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCByY3ZDb21tYW5kID0gbmV3IERpYWdyYW1SZW9yaWVudENvbm5lY3Rpb25WaWV3Q29tbWFuZCgKLQkJCQllZGl0aW5nRG9tYWluLCBudWxsKTsKLQkJcmN2Q29tbWFuZC5zZXRFZGdlQWRhcHRvcihnZXRWaWV3QWRhcHRlcigpKTsKLQkJY2MuY29tcG9zZShyY3ZDb21tYW5kKTsKLQkJcmV0dXJuIGM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU3NDM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtUmVmZXJlbmNlQ29ubmVjdGlvbkVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5SZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmVkaXRwYXJ0cy5BYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLkNvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5yZXF1ZXN0cy5Hcm91cFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLmNvbW1hbmRzLkRlbGV0ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5jb21tYW5kcy5JQ29tbWFuZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmwxMG4uRGlhZ3JhbVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlcXVlc3RzLkVkaXRDb21tYW5kUmVxdWVzdFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXF1ZXN0cy5Hcm91cFJlcXVlc3RWaWFLZXlib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SZWZlcmVuY2VDb25uZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIENvbm5lY3Rpb25FZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fRElBR1JBTV9ETEdfVElUTEUgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfVGl0bGU7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9GUk9NX0RJQUdSQU1fRExHX01FU1NBR0UgPSBEaWFncmFtVUlNZXNzYWdlcy5Qcm9tcHRpbmdEZWxldGVBY3Rpb25fRGVsZXRlRnJvbURpYWdyYW1EaWFsb2dfTWVzc2FnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFX0ZST01fTU9ERUxfRExHX1RPR0dMRV9MQUJFTCA9IERpYWdyYW1VSU1lc3NhZ2VzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlX0RvTm90UHJvbXB0QWdhaW5Ub2dnbGVfbGFiZWw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgZ2V0RGVsZXRlQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlib29sZWFuIGlzRGVsZXRlRnJvbUtleUJvYXJkID0gZGVsZXRlUmVxdWVzdCBpbnN0YW5jZW9mIEdyb3VwUmVxdWVzdFZpYUtleWJvYXJkOwotCQlpZiAoc2hvdWxkRGVsZXRlU2VtYW50aWMoKSkgewotCQkJcmV0dXJuIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJvb2xlYW4gcHJvY2VlZFRvRGVsZXRlVmlldyA9IHRydWU7Ci0JCQlpZiAoaXNEZWxldGVGcm9tS2V5Qm9hcmQpIHsKLQkJCQlHcm91cFJlcXVlc3RWaWFLZXlib2FyZCBncm91cFJlcXVlc3RWaWFLZXlib2FyZCA9IChHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgZGVsZXRlUmVxdWVzdDsKLQkJCQlpZiAoZ3JvdXBSZXF1ZXN0VmlhS2V5Ym9hcmQuaXNTaG93SW5mb3JtYXRpb25EaWFsb2coKSkgewotCQkJCQlwcm9jZWVkVG9EZWxldGVWaWV3ID0gc2hvd1Byb21wdCgpOwotCQkJCQlncm91cFJlcXVlc3RWaWFLZXlib2FyZC5zZXRTaG93SW5mb3JtYXRpb25EaWFsb2coZmFsc2UpOwotCQkJCQlpZiAoIShwcm9jZWVkVG9EZWxldGVWaWV3KSkKLQkJCQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjcmVhdGVEZWxldGVWaWV3Q29tbWFuZChkZWxldGVSZXF1ZXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGREZWxldGVTZW1hbnRpYygpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShnZXRIb3N0KCkgaW5zdGFuY2VvZiBBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCk7Ci0JCUFic3RyYWN0Q29ubmVjdGlvbkVkaXRQYXJ0IGNlcCA9IChBYnN0cmFjdENvbm5lY3Rpb25FZGl0UGFydCkgZ2V0SG9zdCgpOwotCQlib29sZWFuIGlzQ2Fub25pY2FsID0gZmFsc2U7Ci0JCWlmIChjZXAuZ2V0U291cmNlKCkgIT0gbnVsbCkKLQkJCWlzQ2Fub25pY2FsID0gSXNDYW5vbmljYWwoY2VwLmdldFNvdXJjZSgpKTsKLQkJaWYgKGNlcC5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJcmV0dXJuIGlzQ2Fub25pY2FsID8gaXNDYW5vbmljYWwgOiBJc0Nhbm9uaWNhbChjZXAuZ2V0VGFyZ2V0KCkpOwotCQlyZXR1cm4gaXNDYW5vbmljYWw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBJc0Nhbm9uaWNhbChFZGl0UGFydCBlcCkgewotCQlFZGl0UGFydCBwYXJlbnQgPSBlcC5nZXRQYXJlbnQoKTsKLQkJcmV0dXJuIHBhcmVudCBpbnN0YW5jZW9mIEdyYXBoaWNhbEVkaXRQYXJ0ID8gKChHcmFwaGljYWxFZGl0UGFydCkgcGFyZW50KQotCQkJCS5pc0Nhbm9uaWNhbCgpCi0JCQkJOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRGVsZXRlVmlld0NvbW1hbmQoR3JvdXBSZXF1ZXN0IGRlbGV0ZVJlcXVlc3QpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldEVkaXRpbmdEb21haW4oKTsKLQkJcmV0dXJuIG5ldyBJQ29tbWFuZFByb3h5KG5ldyBEZWxldGVDb21tYW5kKGVkaXRpbmdEb21haW4sCi0JCQkJKFZpZXcpIGdldEhvc3QoKS5nZXRNb2RlbCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVNlbWFudGljQ29tbWFuZChHcm91cFJlcXVlc3QgZGVsZXRlUmVxdWVzdCkgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyIHNlbVJlcSA9IG5ldyBFZGl0Q29tbWFuZFJlcXVlc3RXcmFwcGVyKAotCQkJCW5ldyBEZXN0cm95RWxlbWVudFJlcXVlc3QoZWRpdGluZ0RvbWFpbiwgZmFsc2UpLCBkZWxldGVSZXF1ZXN0Ci0JCQkJCQkuZ2V0RXh0ZW5kZWREYXRhKCkpOwotCQlDb21tYW5kIHNlbWFudGljQ21kID0gZ2V0SG9zdCgpLmdldENvbW1hbmQoc2VtUmVxKTsKLQkJaWYgKHNlbWFudGljQ21kICE9IG51bGwgJiYgc2VtYW50aWNDbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY2MgPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7Ci0JCQljYy5hZGQoc2VtYW50aWNDbWQpOwotCQkJcmV0dXJuIGNjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1Byb21wdCgpIHsKLQkJYm9vbGVhbiBwcm9tcHQgPSAoKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJLmdldERpYWdyYW1QcmVmZXJlbmNlc0hpbnQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKSkKLQkJCQkuZ2V0Qm9vbGVhbihJUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9PTl9ERUxfRlJPTV9ESUFHUkFNKTsKLQkJaWYgKHByb21wdCkKLQkJCWlmIChzaG93TWVzc2FnZURpYWxvZygpKQotCQkJCXJldHVybiB0cnVlOwotCQkJZWxzZQotCQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG93TWVzc2FnZURpYWxvZygpIHsKLQkJTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgZGlhbG9nID0gTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUKLQkJCQkub3Blblllc05vUXVlc3Rpb24oRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwKLQkJCQkJCURFTEVURV9GUk9NX0RJQUdSQU1fRExHX1RJVExFLAotCQkJCQkJREVMRVRFX0ZST01fRElBR1JBTV9ETEdfTUVTU0FHRSwKLQkJCQkJCURFTEVURV9GUk9NX01PREVMX0RMR19UT0dHTEVfTEFCRUwsIGZhbHNlLAotCQkJCQkJKElQcmVmZXJlbmNlU3RvcmUpICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCQkJCQkJCS5nZXREaWFncmFtUHJlZmVyZW5jZXNIaW50KCkKLQkJCQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpLAotCQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9QUk9NUFRfT05fREVMX0ZST01fRElBR1JBTSk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuWUVTX0lEKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1hbmQgZ2V0Q29tbWFuZChSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBHcm91cFJlcXVlc3RWaWFLZXlib2FyZCkgewotCQkJcmV0dXJuIGdldERlbGV0ZUNvbW1hbmQoKEdyb3VwUmVxdWVzdCkgcmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENvbW1hbmQocmVxdWVzdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzg0ZTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9EaWFncmFtVGV4dE5vblJlc2l6YWJsZUVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkdyYXBoaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5JRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuUmVjdGFuZ2xlRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuaGFuZGxlcy5Nb3ZlSGFuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLk5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLkRyYWdFZGl0UGFydHNUcmFja2VyRXg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXh0Tm9uUmVzaXphYmxlRWRpdFBvbGljeSBleHRlbmRzIE5vblJlc2l6YWJsZUVkaXRQb2xpY3lFeCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJRmlndXJlIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBmb2N1c0ZlZWRiYWNrRmlndXJlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dQcmltYXJ5U2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJc2hvd1NlbGVjdGlvbigpOwotCQkJc2hvd0ZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQloaWRlU2VsZWN0aW9uKCk7Ci0JCQlhZGRGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkpOwotCQkJcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCk7Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoaWRlU2VsZWN0aW9uKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRTZWxlY3RlZChmYWxzZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCQloaWRlRm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93Rm9jdXMoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldEZvY3VzKHRydWUpOwotCQl9IGVsc2UgewotCQkJaGlkZUZvY3VzKCk7Ci0JCQlhZGRGZWVkYmFjayhmb2N1c0ZlZWRiYWNrRmlndXJlID0gY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hGb2N1c0ZlZWRiYWNrKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZUZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlY3RhbmdsZSBnZXRGZWVkYmFja0JvdW5kcygpIHsKLQkJUmVjdGFuZ2xlIGJvdW5kczsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQlib3VuZHMgPSAoKExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLmdldFRleHRCb3VuZHMoKTsKLQkJCWJvdW5kcy5pbnRlcnNlY3QoZ2V0SG9zdEZpZ3VyZSgpLmdldEJvdW5kcygpKTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcyA9IGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKS5nZXRDb3B5KCk7Ci0JCX0KLQkJZ2V0SG9zdEZpZ3VyZSgpLmdldFBhcmVudCgpLnRyYW5zbGF0ZVRvQWJzb2x1dGUoYm91bmRzKTsKLQkJZ2V0RmVlZGJhY2tMYXllcigpLnRyYW5zbGF0ZVRvUmVsYXRpdmUoYm91bmRzKTsKLQkJcmV0dXJuIGJvdW5kczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlU2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJTGFiZWwgZmVlZGJhY2tGaWd1cmUgPSBuZXcgTGFiZWwoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldE9wYXF1ZSh0cnVlKTsKLQkJCWZlZWRiYWNrRmlndXJlCi0JCQkJCS5zZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3JDb25zdGFudHMubWVudUJhY2tncm91bmRTZWxlY3RlZCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0Rm9yZWdyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVGb3JlZ3JvdW5kU2VsZWN0ZWQpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlRmlndXJlIGZlZWRiYWNrRmlndXJlID0gbmV3IFJlY3RhbmdsZUZpZ3VyZSgpOwotCQkJZmVlZGJhY2tGaWd1cmUuc2V0RmlsbChmYWxzZSk7Ci0JCQlyZXR1cm4gZmVlZGJhY2tGaWd1cmU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElGaWd1cmUgY3JlYXRlRm9jdXNGZWVkYmFja0ZpZ3VyZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWd1cmUoKSB7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHBhaW50RmlndXJlKEdyYXBoaWNzIGdyYXBoaWNzKSB7Ci0JCQkJZ3JhcGhpY3MuZHJhd0ZvY3VzKGdldEJvdW5kcygpLmdldFJlc2l6ZWQoLTEsIC0xKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxhYmVsKExhYmVsIHRhcmdldCkgewotCQlMYWJlbCBzb3VyY2UgPSAoTGFiZWwpIGdldEhvc3RGaWd1cmUoKTsKLQkJdGFyZ2V0LnNldFRleHQoc291cmNlLmdldFRleHQoKSk7Ci0JCXRhcmdldC5zZXRUZXh0QWxpZ25tZW50KHNvdXJjZS5nZXRUZXh0QWxpZ25tZW50KCkpOwotCQl0YXJnZXQuc2V0Rm9udChzb3VyY2UuZ2V0Rm9udCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNlbGVjdGlvbkZlZWRiYWNrKCkgewotCQlpZiAoc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCQl1cGRhdGVMYWJlbCgoTGFiZWwpIHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKTsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGlvbkZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpLmV4cGFuZCg1LAotCQkJCQkJNSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hGb2N1c0ZlZWRiYWNrKCkgewotCQlpZiAoZm9jdXNGZWVkYmFja0ZpZ3VyZSAhPSBudWxsKSB7Ci0JCQlmb2N1c0ZlZWRiYWNrRmlndXJlLnNldEJvdW5kcyhnZXRGZWVkYmFja0JvdW5kcygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRmVlZGJhY2soKSB7Ci0JCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTZWxlY3Rpb25IYW5kbGVzKCkgewotCQlNb3ZlSGFuZGxlIG1vdmVIYW5kbGUgPSBuZXcgTW92ZUhhbmRsZSgoR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSk7Ci0JCW1vdmVIYW5kbGUuc2V0Qm9yZGVyKG51bGwpOwotCQltb3ZlSGFuZGxlLnNldERyYWdUcmFja2VyKG5ldyBEcmFnRWRpdFBhcnRzVHJhY2tlckV4KGdldEhvc3QoKSkpOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChtb3ZlSGFuZGxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvRGlhZ3JhbVRleHRTZWxlY3Rpb25FZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOGQzOTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL0RpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlJlY3RhbmdsZUZpZ3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5MYXllckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuZWRpdHBvbGljaWVzLlNlbGVjdGlvbkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuV3JhcExhYmVsOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXh0U2VsZWN0aW9uRWRpdFBvbGljeSBleHRlbmRzIFNlbGVjdGlvbkVkaXRQb2xpY3kgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSUZpZ3VyZSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElGaWd1cmUgZm9jdXNGZWVkYmFja0ZpZ3VyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93UHJpbWFyeVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXNob3dTZWxlY3Rpb24oKTsKLQkJCXNob3dGb2N1cygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dTZWxlY3Rpb24oKSB7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBXcmFwTGFiZWwpIHsKLQkJCSgoV3JhcExhYmVsKSBnZXRIb3N0RmlndXJlKCkpLnNldFNlbGVjdGVkKHRydWUpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaGlkZVNlbGVjdGlvbigpOwotCQkJYWRkRmVlZGJhY2soc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBjcmVhdGVTZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSgpKTsKLQkJCXJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpOwotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGlkZVNlbGVjdGlvbigpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCQlyZW1vdmVGZWVkYmFjayhzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQkJaGlkZUZvY3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZvY3VzKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgV3JhcExhYmVsKSB7Ci0JCQkoKFdyYXBMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5zZXRGb2N1cyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWhpZGVGb2N1cygpOwotCQkJYWRkRmVlZGJhY2soZm9jdXNGZWVkYmFja0ZpZ3VyZSA9IGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSk7Ci0JCQlyZWZyZXNoRm9jdXNGZWVkYmFjaygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhpZGVGb2N1cygpIHsKLQkJaWYgKGdldEhvc3RGaWd1cmUoKSBpbnN0YW5jZW9mIFdyYXBMYWJlbCkgewotCQkJKChXcmFwTGFiZWwpIGdldEhvc3RGaWd1cmUoKSkuc2V0Rm9jdXMoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJCXJlbW92ZUZlZWRiYWNrKGZvY3VzRmVlZGJhY2tGaWd1cmUpOwotCQkJCWZvY3VzRmVlZGJhY2tGaWd1cmUgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZWN0YW5nbGUgZ2V0RmVlZGJhY2tCb3VuZHMoKSB7Ci0JCVJlY3RhbmdsZSBib3VuZHM7Ci0JCWlmIChnZXRIb3N0RmlndXJlKCkgaW5zdGFuY2VvZiBMYWJlbCkgewotCQkJYm91bmRzID0gKChMYWJlbCkgZ2V0SG9zdEZpZ3VyZSgpKS5nZXRUZXh0Qm91bmRzKCk7Ci0JCQlib3VuZHMuaW50ZXJzZWN0KGdldEhvc3RGaWd1cmUoKS5nZXRCb3VuZHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlib3VuZHMgPSBnZXRIb3N0RmlndXJlKCkuZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQl9Ci0JCWdldEhvc3RGaWd1cmUoKS5nZXRQYXJlbnQoKS50cmFuc2xhdGVUb0Fic29sdXRlKGJvdW5kcyk7Ci0JCWdldEZlZWRiYWNrTGF5ZXIoKS50cmFuc2xhdGVUb1JlbGF0aXZlKGJvdW5kcyk7Ci0JCXJldHVybiBib3VuZHM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZVNlbGVjdGlvbkZlZWRiYWNrRmlndXJlKCkgewotCQlpZiAoZ2V0SG9zdEZpZ3VyZSgpIGluc3RhbmNlb2YgTGFiZWwpIHsKLQkJCUxhYmVsIGZlZWRiYWNrRmlndXJlID0gbmV3IExhYmVsKCk7Ci0JCQlmZWVkYmFja0ZpZ3VyZS5zZXRPcGFxdWUodHJ1ZSk7Ci0JCQlmZWVkYmFja0ZpZ3VyZQotCQkJCQkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLm1lbnVCYWNrZ3JvdW5kU2VsZWN0ZWQpOwotCQkJZmVlZGJhY2tGaWd1cmUKLQkJCQkJLnNldEZvcmVncm91bmRDb2xvcihDb2xvckNvbnN0YW50cy5tZW51Rm9yZWdyb3VuZFNlbGVjdGVkKTsKLQkJCXJldHVybiBmZWVkYmFja0ZpZ3VyZTsKLQkJfSBlbHNlIHsKLQkJCVJlY3RhbmdsZUZpZ3VyZSBmZWVkYmFja0ZpZ3VyZSA9IG5ldyBSZWN0YW5nbGVGaWd1cmUoKTsKLQkJCWZlZWRiYWNrRmlndXJlLnNldEZpbGwoZmFsc2UpOwotCQkJcmV0dXJuIGZlZWRiYWNrRmlndXJlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRmlndXJlIGNyZWF0ZUZvY3VzRmVlZGJhY2tGaWd1cmUoKSB7Ci0JCXJldHVybiBuZXcgRmlndXJlKCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykgewotCQkJCWdyYXBoaWNzLmRyYXdGb2N1cyhnZXRCb3VuZHMoKS5nZXRSZXNpemVkKC0xLCAtMSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYWJlbChMYWJlbCB0YXJnZXQpIHsKLQkJTGFiZWwgc291cmNlID0gKExhYmVsKSBnZXRIb3N0RmlndXJlKCk7Ci0JCXRhcmdldC5zZXRUZXh0KHNvdXJjZS5nZXRUZXh0KCkpOwotCQl0YXJnZXQuc2V0VGV4dEFsaWdubWVudChzb3VyY2UuZ2V0VGV4dEFsaWdubWVudCgpKTsKLQkJdGFyZ2V0LnNldEZvbnQoc291cmNlLmdldEZvbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZWxlY3Rpb25GZWVkYmFjaygpIHsKLQkJaWYgKHNlbGVjdGlvbkZlZWRiYWNrRmlndXJlICE9IG51bGwpIHsKLQkJCWlmIChzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSBpbnN0YW5jZW9mIExhYmVsKSB7Ci0JCQkJdXBkYXRlTGFiZWwoKExhYmVsKSBzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZSk7Ci0JCQkJc2VsZWN0aW9uRmVlZGJhY2tGaWd1cmUuc2V0Qm91bmRzKGdldEZlZWRiYWNrQm91bmRzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3Rpb25GZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKS5leHBhbmQoNSwKLQkJCQkJCTUpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9jdXNGZWVkYmFjaygpIHsKLQkJaWYgKGZvY3VzRmVlZGJhY2tGaWd1cmUgIT0gbnVsbCkgewotCQkJZm9jdXNGZWVkYmFja0ZpZ3VyZS5zZXRCb3VuZHMoZ2V0RmVlZGJhY2tCb3VuZHMoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaEZlZWRiYWNrKCkgewotCQlyZWZyZXNoU2VsZWN0aW9uRmVlZGJhY2soKTsKLQkJcmVmcmVzaEZvY3VzRmVlZGJhY2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvTGlua0l0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY1OGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9MaW5rSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkRlc3Ryb3lFbGVtZW50Q29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuRGVzdHJveUVsZW1lbnRSZXF1ZXN0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRGVzdHJveUVsZW1lbnRDb21tYW5kKHJlcSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtQ2Fub25pY2FsRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzExNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUucGFydC51dGlsLkRpYWdyYW1FZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5jb21tYW5kcy5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuRGVmZXJyZWRMYXlvdXRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuY29tbWFuZHMuSUNvbW1hbmRQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbENvbm5lY3Rpb25FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuUmVxdWVzdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuSUVsZW1lbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1DYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMKLQkJQ2Fub25pY2FsQ29ubmVjdGlvbkVkaXRQb2xpY3kgewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldFNlbWFudGljSG9zdCgpIHsKLQkJcmV0dXJuIGhvc3QoKS5nZXRNb2RlbCgpICE9IG51bGwgPyBzdXBlci5nZXRTZW1hbnRpY0hvc3QoKSA6IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hPbkFjdGl2YXRlKCkgewkJCi0JCXN1cGVyLnJlZnJlc2hPbkFjdGl2YXRlKCk7Ci0JCQotCQlFZGl0UGFydCBlcCA9IGdldEhvc3QoKTsKLQkJaWYoZXAgaW5zdGFuY2VvZiBEaWFncmFtRWRpdFBhcnQpIHsKLQkJCURpYWdyYW1FZGl0b3JVdGlsLmluaXRpYWxpemVPbkFjdGl2YXRlKChEaWFncmFtRWRpdFBhcnQpIGVwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0NoaWxkcmVuTGlzdCgpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlFT2JqZWN0IG1vZGVsT2JqZWN0ID0gKChWaWV3KSBnZXRIb3N0KCkuZ2V0TW9kZWwoKSkuZ2V0RWxlbWVudCgpOwotCQlWaWV3IHZpZXdPYmplY3QgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCUVPYmplY3QgbmV4dFZhbHVlOwotCQlpbnQgbm9kZVZJRDsKLQkJZm9yIChJdGVyYXRvciB2YWx1ZXMgPSAoKE5vZGVDb250YWluZXIpIG1vZGVsT2JqZWN0KS5nZXROb2RlcygpCi0JCQkJLml0ZXJhdG9yKCk7IHZhbHVlcy5oYXNOZXh0KCk7KSB7Ci0JCQluZXh0VmFsdWUgPSAoRU9iamVjdCkgdmFsdWVzLm5leHQoKTsKLQkJCW5vZGVWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXROb2RlVmlzdWFsSUQodmlld09iamVjdCwKLQkJCQkJbmV4dFZhbHVlKTsKLQkJCWlmIChXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZJRCkgewotCQkJCXJlc3VsdC5hZGQobmV4dFZhbHVlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZERlbGV0ZVZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmlzU2V0RWxlbWVudCgpCi0JCQkJJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmICh2aWV3LmdldEVsZW1lbnQoKS5lSXNQcm94eSgpIHx8IHZpZXcuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTm9kZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRTZW1hbnRpY0Nvbm5lY3Rpb25zTGlzdCgpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBkaWFncmFtID0gKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0pICgoVmlldykgZ2V0SG9zdCgpCi0JCQkJLmdldE1vZGVsKCkpLmdldEVsZW1lbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlhZ3JhbS5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJY29ubmVjdGlvbnMuYWRkQWxsKG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gY29ubmVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlRWxlbWVudChFT2JqZWN0IHJlbGF0aW9uc2hpcCkgewotCQlpZiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgTGluaykgewotCQkJcmV0dXJuICgoTGluaykgcmVsYXRpb25zaGlwKS5nZXRTb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRUYXJnZXRFbGVtZW50KEVPYmplY3QgcmVsYXRpb25zaGlwKSB7Ci0JCWlmIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBMaW5rKSB7Ci0JCQlyZXR1cm4gKChMaW5rKSByZWxhdGlvbnNoaXApLmdldFRhcmdldCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZEluY2x1ZGVDb25uZWN0aW9uKEVkZ2UgY29ubmVjdG9yLAotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbikgewotCQlyZXR1cm4gc3VwZXIuc2hvdWxkSW5jbHVkZUNvbm5lY3Rpb24oY29ubmVjdG9yLCBjaGlsZHJlbik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hTZW1hbnRpYygpIHsKLQkJTGlzdCBjcmVhdGVkVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkVmlld3MuYWRkQWxsKHJlZnJlc2hTZW1hbnRpY0NoaWxkcmVuKCkpOwotCQlMaXN0IGNyZWF0ZWRDb25uZWN0aW9uVmlld3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCQljcmVhdGVkQ29ubmVjdGlvblZpZXdzLmFkZEFsbChyZWZyZXNoU2VtYW50aWNDb25uZWN0aW9ucygpKTsKLQkJY3JlYXRlZENvbm5lY3Rpb25WaWV3cy5hZGRBbGwocmVmcmVzaENvbm5lY3Rpb25zKCkpOwotCi0JCWlmIChjcmVhdGVkVmlld3Muc2l6ZSgpID4gMSkgewotCQkJLy8gcGVyZm9ybSBhIGxheW91dCBvZiB0aGUgY29udGFpbmVyCi0JCQlEZWZlcnJlZExheW91dENvbW1hbmQgbGF5b3V0Q21kID0gbmV3IERlZmVycmVkTGF5b3V0Q29tbWFuZChob3N0KCkKLQkJCQkJLmdldEVkaXRpbmdEb21haW4oKSwgY3JlYXRlZFZpZXdzLCBob3N0KCkpOwotCQkJZXhlY3V0ZUNvbW1hbmQobmV3IElDb21tYW5kUHJveHkobGF5b3V0Q21kKSk7Ci0JCX0KLQotCQljcmVhdGVkVmlld3MuYWRkQWxsKGNyZWF0ZWRDb25uZWN0aW9uVmlld3MpOwotCQltYWtlVmlld3NJbW11dGFibGUoY3JlYXRlZFZpZXdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG15TGlua0Rlc2NyaXB0b3JzID0gbmV3IExpbmtlZExpc3QoKTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1hcCBteUVPYmplY3QyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHJlZnJlc2hDb25uZWN0aW9ucygpIHsKLQkJdHJ5IHsKLQkJCWNvbGxlY3RBbGxMaW5rcyhnZXREaWFncmFtKCkpOwotCQkJQ29sbGVjdGlvbiBleGlzdGluZ0xpbmtzID0gbmV3IExpbmtlZExpc3QoZ2V0RGlhZ3JhbSgpLmdldEVkZ2VzKCkpOwotCQkJZm9yIChJdGVyYXRvciBkaWFncmFtTGlua3MgPSBleGlzdGluZ0xpbmtzLml0ZXJhdG9yKCk7IGRpYWdyYW1MaW5rcwotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVkZ2UgbmV4dERpYWdyYW1MaW5rID0gKEVkZ2UpIGRpYWdyYW1MaW5rcy5uZXh0KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua09iamVjdCA9IG5leHREaWFncmFtTGluay5nZXRFbGVtZW50KCk7Ci0JCQkJRU9iamVjdCBkaWFncmFtTGlua1NyYyA9IG5leHREaWFncmFtTGluay5nZXRTb3VyY2UoKQotCQkJCQkJLmdldEVsZW1lbnQoKTsKLQkJCQlFT2JqZWN0IGRpYWdyYW1MaW5rRHN0ID0gbmV4dERpYWdyYW1MaW5rLmdldFRhcmdldCgpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCWludCBkaWFncmFtTGlua1Zpc3VhbElEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRWaXN1YWxJRChuZXh0RGlhZ3JhbUxpbmspOwotCQkJCWZvciAoSXRlcmF0b3IgbW9kZWxMaW5rRGVzY3JpcHRvcnMgPSBteUxpbmtEZXNjcmlwdG9ycwotCQkJCQkJLml0ZXJhdG9yKCk7IG1vZGVsTGlua0Rlc2NyaXB0b3JzLmhhc05leHQoKTspIHsKLQkJCQkJTGlua0Rlc2NyaXB0b3IgbmV4dExpbmtEZXNjcmlwdG9yID0gKExpbmtEZXNjcmlwdG9yKSBtb2RlbExpbmtEZXNjcmlwdG9ycwotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCWlmIChkaWFncmFtTGlua09iamVjdCA9PSBuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJCQkuZ2V0TGlua0VsZW1lbnQoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rU3JjID09IG5leHRMaW5rRGVzY3JpcHRvci5nZXRTb3VyY2UoKQotCQkJCQkJCSYmIGRpYWdyYW1MaW5rRHN0ID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldERlc3RpbmF0aW9uKCkKLQkJCQkJCQkmJiBkaWFncmFtTGlua1Zpc3VhbElEID09IG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkJCQkJLmdldFZpc3VhbElEKCkpIHsKLQkJCQkJCWRpYWdyYW1MaW5rcy5yZW1vdmUoKTsKLQkJCQkJCW1vZGVsTGlua0Rlc2NyaXB0b3JzLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGVsZXRlVmlld3MoZXhpc3RpbmdMaW5rcy5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjcmVhdGVDb25uZWN0aW9ucyhteUxpbmtEZXNjcmlwdG9ycyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlteUxpbmtEZXNjcmlwdG9ycy5jbGVhcigpOwotCQkJbXlFT2JqZWN0MlZpZXdNYXAuY2xlYXIoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29sbGVjdEFsbExpbmtzKFZpZXcgdmlldykgewotCQlFT2JqZWN0IG1vZGVsRWxlbWVudCA9IHZpZXcuZ2V0RWxlbWVudCgpOwotCQlpbnQgZGlhZ3JhbUVsZW1lbnRWaXN1YWxJRCA9IERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldFZpc3VhbElEKHZpZXcpOwotCQlzd2l0Y2ggKGRpYWdyYW1FbGVtZW50VmlzdWFsSUQpIHsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCWNhc2UgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDogewotCQkJbXlFT2JqZWN0MlZpZXdNYXAucHV0KG1vZGVsRWxlbWVudCwgdmlldyk7Ci0JCQlzdG9yZUxpbmtzKG1vZGVsRWxlbWVudCwgZ2V0RGlhZ3JhbSgpKTsKLQkJfQotCQlkZWZhdWx0OiB7Ci0JCX0KLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRyZW4gPSB2aWV3LmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgY2hpbGRyZW4KLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlWaWV3IGNoaWxkVmlldyA9IChWaWV3KSBjaGlsZHJlbi5uZXh0KCk7Ci0JCQkJY29sbGVjdEFsbExpbmtzKGNoaWxkVmlldyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb25zKENvbGxlY3Rpb24gbGlua0Rlc2NyaXB0b3JzKSB7Ci0JCWlmIChsaW5rRGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlMaXN0IGFkYXB0ZXJzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvciA9IGxpbmtEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBsaW5rRGVzY3JpcHRvcnNJdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlmaW5hbCBMaW5rRGVzY3JpcHRvciBuZXh0TGlua0Rlc2NyaXB0b3IgPSAoTGlua0Rlc2NyaXB0b3IpIGxpbmtEZXNjcmlwdG9yc0l0ZXJhdG9yCi0JCQkJCS5uZXh0KCk7Ci0JCQlFZGl0UGFydCBzb3VyY2VFZGl0UGFydCA9IGdldEVkaXRQYXJ0Rm9yKG5leHRMaW5rRGVzY3JpcHRvcgotCQkJCQkuZ2V0U291cmNlKCkpOwotCQkJRWRpdFBhcnQgdGFyZ2V0RWRpdFBhcnQgPSBnZXRFZGl0UGFydEZvcihuZXh0TGlua0Rlc2NyaXB0b3IKLQkJCQkJLmdldERlc3RpbmF0aW9uKCkpOwotCQkJaWYgKHNvdXJjZUVkaXRQYXJ0ID09IG51bGwgfHwgdGFyZ2V0RWRpdFBhcnQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0LkNvbm5lY3Rpb25WaWV3RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdC5Db25uZWN0aW9uVmlld0Rlc2NyaXB0b3IoCi0JCQkJCW5leHRMaW5rRGVzY3JpcHRvci5nZXRTZW1hbnRpY0FkYXB0ZXIoKSwgbnVsbCwKLQkJCQkJVmlld1V0aWwuQVBQRU5ELCBmYWxzZSwgKChJR3JhcGhpY2FsRWRpdFBhcnQpIGdldEhvc3QoKSkKLQkJCQkJCQkuZ2V0RGlhZ3JhbVByZWZlcmVuY2VzSGludCgpKTsKLQkJCUNyZWF0ZUNvbm5lY3Rpb25WaWV3UmVxdWVzdCBjY3IgPSBuZXcgQ3JlYXRlQ29ubmVjdGlvblZpZXdSZXF1ZXN0KAotCQkJCQlkZXNjcmlwdG9yKTsKLQkJCWNjci5zZXRUeXBlKFJlcXVlc3RDb25zdGFudHMuUkVRX0NPTk5FQ1RJT05fU1RBUlQpOwotCQkJY2NyLnNldFNvdXJjZUVkaXRQYXJ0KHNvdXJjZUVkaXRQYXJ0KTsKLQkJCXNvdXJjZUVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWNjci5zZXRUYXJnZXRFZGl0UGFydCh0YXJnZXRFZGl0UGFydCk7Ci0JCQljY3Iuc2V0VHlwZShSZXF1ZXN0Q29uc3RhbnRzLlJFUV9DT05ORUNUSU9OX0VORCk7Ci0JCQlDb21tYW5kIGNtZCA9IHRhcmdldEVkaXRQYXJ0LmdldENvbW1hbmQoY2NyKTsKLQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJZXhlY3V0ZUNvbW1hbmQoY21kKTsKLQkJCQlJQWRhcHRhYmxlIHZpZXdBZGFwdGVyID0gKElBZGFwdGFibGUpIGNjci5nZXROZXdPYmplY3QoKTsKLQkJCQlpZiAodmlld0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVycy5hZGQodmlld0FkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnQgZ2V0RWRpdFBhcnRGb3IoRU9iamVjdCBtb2RlbEVsZW1lbnQpIHsKLQkJVmlldyB2aWV3ID0gKFZpZXcpIG15RU9iamVjdDJWaWV3TWFwLmdldChtb2RlbEVsZW1lbnQpOwotCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKEVkaXRQYXJ0KSBnZXRIb3N0KCkuZ2V0Vmlld2VyKCkuZ2V0RWRpdFBhcnRSZWdpc3RyeSgpLmdldCgKLQkJCQkJdmlldyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICpAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlTGlua3MoRU9iamVjdCBjb250YWluZXIsIERpYWdyYW0gZGlhZ3JhbSkgewotCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzID0gY29udGFpbmVyLmVDbGFzcygpOwotCQlzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MsIGRpYWdyYW0pOwotCQlzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3MoY29udGFpbmVyLCBjb250YWluZXJNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVUeXBlTW9kZWxGYWNldExpbmtzKEVPYmplY3QgY29udGFpbmVyLAotCQkJRUNsYXNzIGNvbnRhaW5lck1ldGFjbGFzcykgewotCQlzdG9yZVR5cGVNb2RlbEZhY2V0TGlua3NfTGlua18zMDAxKGNvbnRhaW5lciwgY29udGFpbmVyTWV0YWNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlVHlwZU1vZGVsRmFjZXRMaW5rc19MaW5rXzMwMDEoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzKSB7Ci0JCWlmIChNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKS5pc1N1cGVyVHlwZU9mKGNvbnRhaW5lck1ldGFjbGFzcykpIHsKLQkJCWZvciAoSXRlcmF0b3IgdmFsdWVzID0gKChOb2RlKSBjb250YWluZXIpLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKQotCQkJCQkuaXRlcmF0b3IoKTsgdmFsdWVzLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IG5leHRWYWx1ZSA9ICgoRU9iamVjdCkgdmFsdWVzLm5leHQoKSk7Ci0JCQkJaW50IGxpbmtWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldExpbmtXaXRoQ2xhc3NWaXN1YWxJRChuZXh0VmFsdWUpOwotCQkJCWlmIChMaW5rRWRpdFBhcnQuVklTVUFMX0lEID09IGxpbmtWSUQpIHsKLQkJCQkJT2JqZWN0IHN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChMaW5rKSBuZXh0VmFsdWUpCi0JCQkJCQkJLmdldFRhcmdldCgpOwotCQkJCQlpZiAoc3RydWN0dXJhbEZlYXR1cmVSZXN1bHQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQlFT2JqZWN0IGRzdCA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCXN0cnVjdHVyYWxGZWF0dXJlUmVzdWx0ID0gKChMaW5rKSBuZXh0VmFsdWUpCi0JCQkJCQkJCS5nZXRTb3VyY2UoKTsKLQkJCQkJCWlmIChzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHNyYyA9IChFT2JqZWN0KSBzdHJ1Y3R1cmFsRmVhdHVyZVJlc3VsdDsKLQkJCQkJCQlteUxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IExpbmtEZXNjcmlwdG9yKHNyYywgZHN0LAotCQkJCQkJCQkJbmV4dFZhbHVlLCBEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSwKLQkJCQkJCQkJCWxpbmtWSUQpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZUZlYXR1cmVNb2RlbEZhY2V0TGlua3MoRU9iamVjdCBjb250YWluZXIsCi0JCQlFQ2xhc3MgY29udGFpbmVyTWV0YWNsYXNzLCBEaWFncmFtIGRpYWdyYW0pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuICgoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCkpLmdldERpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5rRGVzY3JpcHRvciB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteVNvdXJjZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBFT2JqZWN0IG15RGVzdGluYXRpb247Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgRU9iamVjdCBteUxpbmtFbGVtZW50OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGludCBteVZpc3VhbElEOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElBZGFwdGFibGUgbXlTZW1hbnRpY0FkYXB0ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlFT2JqZWN0IGxpbmtFbGVtZW50LCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IGxpbmtFbGVtZW50OwotCQkJZmluYWwgSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlQ29weSA9IGVsZW1lbnRUeXBlOwotCQkJbXlTZW1hbnRpY0FkYXB0ZXIgPSBuZXcgRU9iamVjdEFkYXB0ZXIobGlua0VsZW1lbnQpIHsKLQkJCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJCQlpZiAoSUVsZW1lbnRUeXBlLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnRUeXBlQ29weTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwKLQkJCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUsIGludCBsaW5rVklEKSB7Ci0JCQl0aGlzKHNvdXJjZSwgZGVzdGluYXRpb24sIGxpbmtWSUQpOwotCQkJbXlMaW5rRWxlbWVudCA9IG51bGw7Ci0JCQlmaW5hbCBJRWxlbWVudFR5cGUgZWxlbWVudFR5cGVDb3B5ID0gZWxlbWVudFR5cGU7Ci0JCQlteVNlbWFudGljQWRhcHRlciA9IG5ldyBJQWRhcHRhYmxlKCkgewotCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCWlmIChJRWxlbWVudFR5cGUuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKSB7Ci0JCQkJCQlyZXR1cm4gZWxlbWVudFR5cGVDb3B5OwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBMaW5rRGVzY3JpcHRvcihFT2JqZWN0IHNvdXJjZSwgRU9iamVjdCBkZXN0aW5hdGlvbiwgaW50IGxpbmtWSUQpIHsKLQkJCW15U291cmNlID0gc291cmNlOwotCQkJbXlEZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwotCQkJbXlWaXN1YWxJRCA9IGxpbmtWSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG15U291cmNlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByb3RlY3RlZCBFT2JqZWN0IGdldERlc3RpbmF0aW9uKCkgewotCQkJcmV0dXJuIG15RGVzdGluYXRpb247Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZ2V0TGlua0VsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gbXlMaW5rRWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgaW50IGdldFZpc3VhbElEKCkgewotCQkJcmV0dXJuIG15VmlzdWFsSUQ7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIElBZGFwdGFibGUgZ2V0U2VtYW50aWNBZGFwdGVyKCkgewotCQkJcmV0dXJuIG15U2VtYW50aWNBZGFwdGVyOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL2VkaXQvcG9saWNpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODBkZTVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBvbGljaWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5Xb3JrUHJvZHVjdE5vZGVDcmVhdGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLmNvbW1hbmRzLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmRzLkR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLmNvbW1hbmRzLkNyZWF0ZUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlRWxlbWVudFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5yZXF1ZXN0cy5EdXBsaWNhdGVFbGVtZW50c1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtSXRlbVNlbWFudGljRWRpdFBvbGljeSBleHRlbmRzCi0JCURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlQ29tbWFuZChDcmVhdGVFbGVtZW50UmVxdWVzdCByZXEpIHsKLQkJaWYgKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJCXJlcS5zZXRDb250YWlubWVudEZlYXR1cmUoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldE5vZGVDb250YWluZXJfTm9kZXMoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgV29ya1Byb2R1Y3ROb2RlQ3JlYXRlQ29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ29tbWFuZChyZXEpOwotCX0KLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldER1cGxpY2F0ZUNvbW1hbmQoRHVwbGljYXRlRWxlbWVudHNSZXF1ZXN0IHJlcSkgewotCQkvLwkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9ICgoSUdyYXBoaWNhbEVkaXRQYXJ0KSBnZXRIb3N0KCkpCi0JCS8vCQkJCS5nZXRFZGl0aW5nRG9tYWluKCk7Ci0JCS8vCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kKGVkaXRpbmdEb21haW4sIHJlcSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRHVwbGljYXRlQW55dGhpbmdDb21tYW5kIGV4dGVuZHMKLQkJCUR1cGxpY2F0ZUVPYmplY3RzQ29tbWFuZCB7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBEdXBsaWNhdGVBbnl0aGluZ0NvbW1hbmQoCi0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwKLQkJCQlEdXBsaWNhdGVFbGVtZW50c1JlcXVlc3QgcmVxKSB7Ci0JCQlzdXBlcihlZGl0aW5nRG9tYWluLCByZXEuZ2V0TGFiZWwoKSwgcmVxCi0JCQkJCS5nZXRFbGVtZW50c1RvQmVEdXBsaWNhdGVkKCksIHJlcQotCQkJCQkuZ2V0QWxsRHVwbGljYXRlZEVsZW1lbnRzTWFwKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGEwMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUNhbm9uaWNhbEVkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wb2xpY2llczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVDYW5vbmljYWxFZGl0UG9saWN5IGV4dGVuZHMgQ2Fub25pY2FsRWRpdFBvbGljeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExpc3QgZ2V0U2VtYW50aWNDaGlsZHJlbkxpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkRGVsZXRlVmlldyhWaWV3IHZpZXcpIHsKLQkJcmV0dXJuIHZpZXcuaXNTZXRFbGVtZW50KCkgJiYgdmlldy5nZXRFbGVtZW50KCkgIT0gbnVsbAotCQkJCSYmIHZpZXcuZ2V0RWxlbWVudCgpLmVJc1Byb3h5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZhY3RvcnlIaW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdE5vZGVHcmFwaGljYWxOb2RlRWRpdFBvbGljeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZDE3ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUdyYXBoaWNhbE5vZGVFZGl0UG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgZXh0ZW5kcwotCQlEaWFncmFtR3JhcGhpY2FsTm9kZUVkaXRQb2xpY3kgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvZWRpdC9wb2xpY2llcy9Xb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjc0NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9lZGl0L3BvbGljaWVzL1dvcmtQcm9kdWN0Tm9kZUl0ZW1TZW1hbnRpY0VkaXRQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucG9saWNpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuRGVzdHJveUVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLkRlc3Ryb3lFbGVtZW50UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLnJlcXVlc3RzLlJlb3JpZW50UmVsYXRpb25zaGlwUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5jb21tYW5kcy5MaW5rQ3JlYXRlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQuY29tbWFuZHMuTGlua1Jlb3JpZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuY29tbWFuZHMuVW5leGVjdXRhYmxlQ29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuQ3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdE5vZGVJdGVtU2VtYW50aWNFZGl0UG9saWN5IGV4dGVuZHMKLQkJRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXREZXN0cm95RWxlbWVudENvbW1hbmQoRGVzdHJveUVsZW1lbnRSZXF1ZXN0IHJlcSkgewotCQlDb21wb3VuZENvbW1hbmQgY2MgPSBnZXREZXN0cm95RWRnZXNDb21tYW5kKHJlcQotCQkJCS5pc0NvbmZpcm1hdGlvblJlcXVpcmVkKCkpOwotCQlWaWV3IHZpZXcgPSAoVmlldykgZ2V0SG9zdCgpLmdldE1vZGVsKCk7Ci0JCWlmICh2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpICE9IG51bGwpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVxLnNldEVsZW1lbnRUb0Rlc3Ryb3kodmlldyk7Ci0JCX0KLQkJY2MuYWRkKGdldE1TTFdyYXBwZXIobmV3IERlc3Ryb3lFbGVtZW50Q29tbWFuZChyZXEpKSk7Ci0JCXJldHVybiBjYy51bndyYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgZ2V0Q3JlYXRlUmVsYXRpb25zaGlwQ29tbWFuZChDcmVhdGVSZWxhdGlvbnNoaXBSZXF1ZXN0IHJlcSkgewotCQlpZiAoRGlhZ3JhbUVsZW1lbnRUeXBlcy5MaW5rXzMwMDEgPT0gcmVxLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCXJldHVybiByZXEuZ2V0VGFyZ2V0KCkgPT0gbnVsbCA/IGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKHJlcSkKLQkJCQkJOiBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZChyZXEpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENyZWF0ZVN0YXJ0T3V0Z29pbmdMaW5rXzMwMDFDb21tYW5kKAotCQkJQ3JlYXRlUmVsYXRpb25zaGlwUmVxdWVzdCByZXEpIHsKLQkJRU9iamVjdCBzb3VyY2VFT2JqZWN0ID0gcmVxLmdldFNvdXJjZSgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCU5vZGUgc291cmNlID0gKE5vZGUpIHNvdXJjZUVPYmplY3Q7Ci0JCU5vZGUgY29udGFpbmVyID0gKE5vZGUpIGdldFJlbGF0aW9uc2hpcENvbnRhaW5lcihzb3VyY2UsCi0JCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXROb2RlKCksIHJlcS5nZXRFbGVtZW50VHlwZSgpKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlpZiAoIURpYWdyYW1CYXNlSXRlbVNlbWFudGljRWRpdFBvbGljeS5MaW5rQ29uc3RyYWludHMKLQkJCQkuY2FuQ3JlYXRlTGlua18zMDAxKGNvbnRhaW5lciwgc291cmNlLCBudWxsKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQl9OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRDcmVhdGVDb21wbGV0ZUluY29taW5nTGlua18zMDAxQ29tbWFuZCgKLQkJCUNyZWF0ZVJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCUVPYmplY3Qgc291cmNlRU9iamVjdCA9IHJlcS5nZXRTb3VyY2UoKTsKLQkJRU9iamVjdCB0YXJnZXRFT2JqZWN0ID0gcmVxLmdldFRhcmdldCgpOwotCQlpZiAoZmFsc2UgPT0gc291cmNlRU9iamVjdCBpbnN0YW5jZW9mIE5vZGUKLQkJCQl8fCBmYWxzZSA9PSB0YXJnZXRFT2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJTm9kZSBzb3VyY2UgPSAoTm9kZSkgc291cmNlRU9iamVjdDsKLQkJTm9kZSB0YXJnZXQgPSAoTm9kZSkgdGFyZ2V0RU9iamVjdDsKLQkJTm9kZSBjb250YWluZXIgPSAoTm9kZSkgZ2V0UmVsYXRpb25zaGlwQ29udGFpbmVyKHNvdXJjZSwKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5vZGUoKSwgcmVxLmdldEVsZW1lbnRUeXBlKCkpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmICghRGlhZ3JhbUJhc2VJdGVtU2VtYW50aWNFZGl0UG9saWN5LkxpbmtDb25zdHJhaW50cwotCQkJCS5jYW5DcmVhdGVMaW5rXzMwMDEoY29udGFpbmVyLCBzb3VyY2UsIHRhcmdldCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCWlmIChyZXEuZ2V0Q29udGFpbm1lbnRGZWF0dXJlKCkgPT0gbnVsbCkgewotCQkJcmVxLnNldENvbnRhaW5tZW50RmVhdHVyZShNb2RlbFBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROb2RlX091dGdvaW5nQ29ubmVjdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGdldE1TTFdyYXBwZXIobmV3IExpbmtDcmVhdGVDb21tYW5kKHJlcSwgY29udGFpbmVyLCBzb3VyY2UsCi0JCQkJdGFyZ2V0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb21tYW5kIHRvIHJlb3JpZW50IEVDbGFzcyBiYXNlZCBsaW5rLiBOZXcgbGluayB0YXJnZXQgb3Igc291cmNlCi0JICogc2hvdWxkIGJlIHRoZSBkb21haW4gbW9kZWwgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBub2RlLgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXRSZW9yaWVudFJlbGF0aW9uc2hpcENvbW1hbmQoCi0JCQlSZW9yaWVudFJlbGF0aW9uc2hpcFJlcXVlc3QgcmVxKSB7Ci0JCXN3aXRjaCAoZ2V0VmlzdWFsSUQocmVxKSkgewotCQljYXNlIExpbmtFZGl0UGFydC5WSVNVQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0TVNMV3JhcHBlcihuZXcgTGlua1Jlb3JpZW50Q29tbWFuZChyZXEpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVvcmllbnRSZWxhdGlvbnNoaXBDb21tYW5kKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1DcmVhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDQ2YjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLndpemFyZHMuRWRpdG9yQ3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb247Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUNyZWF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoIHdvcmtiZW5jaDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UgZGlhZ3JhbU1vZGVsRmlsZVBhZ2U7Ci0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZSBkaWFncmFtOwotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IgPSB0cnVlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJV29ya2JlbmNoIGdldFdvcmtiZW5jaCgpIHsKLQkJcmV0dXJuIHdvcmtiZW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIFJlc291cmNlIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc09wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKCkgewotCQlyZXR1cm4gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yKAotCQkJYm9vbGVhbiBvcGVuTmV3bHlDcmVhdGVkRGlhZ3JhbUVkaXRvcikgewotCQl0aGlzLm9wZW5OZXdseUNyZWF0ZWREaWFncmFtRWRpdG9yID0gb3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlkaWFncmFtTW9kZWxGaWxlUGFnZSA9IG5ldyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlKAotCQkJCSJEaWFncmFtTW9kZWxGaWxlIiwgZ2V0U2VsZWN0aW9uKCksICJ3cGRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5zZXRUaXRsZSgiQ3JlYXRlIFdQREQgRGlhZ3JhbSIpOwotCQlkaWFncmFtTW9kZWxGaWxlUGFnZQotCQkJCS5zZXREZXNjcmlwdGlvbigiU2VsZWN0IGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gZGlhZ3JhbSBhbmQgZG9tYWluIG1vZGVscy4iKTsKLQkJYWRkUGFnZShkaWFncmFtTW9kZWxGaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24obnVsbCkgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlkaWFncmFtID0gRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtTW9kZWxGaWxlUGFnZS5nZXRVUkkoKSwgbW9uaXRvcik7Ci0JCQkJaWYgKGlzT3Blbk5ld2x5Q3JlYXRlZERpYWdyYW1FZGl0b3IoKSAmJiBkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5vcGVuRGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksCi0JCQkJCQkJCSJFcnJvciBvcGVuaW5nIGRpYWdyYW0gZWRpdG9yIiwgbnVsbCwgZQotCQkJCQkJCQkJCS5nZXRTdGF0dXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFRhcmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpLAotCQkJCQkJIkNyZWF0aW9uIFByb2JsZW1zIiwgbnVsbCwgKChDb3JlRXhjZXB0aW9uKSBlCi0JCQkJCQkJCS5nZXRUYXJnZXRFeGNlcHRpb24oKSkuZ2V0U3RhdHVzKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkiRXJyb3IgY3JlYXRpbmcgZGlhZ3JhbSIsIGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGRpYWdyYW0gIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMud29ya2JlbmNoID0gd29ya2JlbmNoOwotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoIk5ldyBXUEREIERpYWdyYW0iKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCS5nZXRCdW5kbGVkSW1hZ2VEZXNjcmlwdG9yKCJpY29ucy93aXpiYW4vTmV3TW9kZWxXaXphcmQuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbUNyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjYxZjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUud2l6YXJkcy5FZGl0b3JXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci51dGlsLkRpYWdyYW1GaWxlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1DcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRXh0ZW5zaW9uOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtQ3JlYXRpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgU3RyaW5nIGZpbGVFeHRlbnNpb24pIHsKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXRoaXMuZmlsZUV4dGVuc2lvbiA9IGZpbGVFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY3JlYXRlIGZpbGVzIHdpdGggdGhpcyBleHRlbnNpb24uCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gZmlsZUV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShnZXRGaWxlUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXRoIGdldEZpbGVQYXRoKCkgewotCQlJUGF0aCBwYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkgewotCQkJcGF0aCA9IG5ldyBQYXRoKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlwYXRoID0gcGF0aC5hcHBlbmQoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlzZXRGaWxlTmFtZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0VW5pcXVlRmlsZU5hbWUoCi0JCQkJZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSwgZ2V0RmlsZU5hbWUoKSwgZ2V0RXh0ZW5zaW9uKCkpKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwKLQkJCQkmJiAhZ2V0RmlsZVBhdGgoKS50b1N0cmluZygpLmVuZHNXaXRoKCIuIiArIGV4dGVuc2lvbikpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZCgKLQkJCQkJIkZpbGUgbmFtZSBzaG91bGQgaGF2ZSAnJ3swfScnIGV4dGVuc2lvbi4iLCBleHRlbnNpb24pKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQyMmRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLkRpYWdyYW1BY3Rpb25CYXJDb250cmlidXRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMKLQkJRGlhZ3JhbUFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRpdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVkaXRvcklkKCkgewotCQlyZXR1cm4gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvci5JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZGIwMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkudXRpbC5FZGl0VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5JUHJpbWFyeUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuSURpYWdyYW1HcmFwaGljYWxWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wYXJ0cy5JRGlhZ3JhbVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS51dGlsLklERUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb21tYW5kcy5jb3JlLmNvbW1hbmQuQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS5HTUZFZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVNRkNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNYXAgb3VyU2F2ZU9wdGlvbnMgPSBudWxsOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQlpZiAob3VyU2F2ZU9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3VyU2F2ZU9wdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCQkJb3VyU2F2ZU9wdGlvbnMucHV0KFhNSVJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91clNhdmVPcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCW91clNhdmVPcHRpb25zLnB1dChSZXNvdXJjZS5PUFRJT05fU0FWRV9PTkxZX0lGX0NIQU5HRUQsCi0JCQkJCVJlc291cmNlLk9QVElPTl9TQVZFX09OTFlfSUZfQ0hBTkdFRF9NRU1PUllfQlVGRkVSKTsKLQkJfQotCQlyZXR1cm4gb3VyU2F2ZU9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRGlhZ3JhbShSZXNvdXJjZSBkaWFncmFtKQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJcmV0dXJuIEVkaXRVSVV0aWwub3BlbkVkaXRvcigoRU9iamVjdCkgZGlhZ3JhbS5nZXRDb250ZW50cygpLmdldCgwKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyc2V0KElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlmaWxlLnNldENoYXJzZXQoIlVURi04IiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGZpbGUgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVGaWxlTmFtZShJUGF0aCBjb250YWluZXJGdWxsUGF0aCwKLQkJCVN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGV4dGVuc2lvbikgewotCQlpZiAoY29udGFpbmVyRnVsbFBhdGggPT0gbnVsbCkgewotCQkJY29udGFpbmVyRnVsbFBhdGggPSBuZXcgUGF0aCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZmlsZU5hbWUgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUGF0aCBmaWxlUGF0aCA9IGNvbnRhaW5lckZ1bGxQYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0JCWlmIChleHRlbnNpb24gIT0gbnVsbCAmJiAhZXh0ZW5zaW9uLmVxdWFscyhmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7Ci0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLmFkZEZpbGVFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLQkJfQotCQlleHRlbnNpb24gPSBmaWxlUGF0aC5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCWZpbGVOYW1lID0gZmlsZVBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JCWludCBpID0gMTsKLQkJd2hpbGUgKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZXhpc3RzKGZpbGVQYXRoKSkgewotCQkJaSsrOwotCQkJZmlsZVBhdGggPSBjb250YWluZXJGdWxsUGF0aC5hcHBlbmQoZmlsZU5hbWUgKyBpKTsKLQkJCWlmIChleHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWZpbGVQYXRoID0gZmlsZVBhdGguYWRkRmlsZUV4dGVuc2lvbihleHRlbnNpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlUGF0aC5sYXN0U2VnbWVudCgpOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHdpemFyZCBpbiBhIGRpYWxvZy4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1bldpemFyZChTaGVsbCBzaGVsbCwgV2l6YXJkIHdpemFyZCwgU3RyaW5nIHNldHRpbmdzS2V5KSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBwbHVnaW5EaWFsb2dTZXR0aW5ncyA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkRGlhbG9nU2V0dGluZ3MgPSBwbHVnaW5EaWFsb2dTZXR0aW5ncwotCQkJCS5nZXRTZWN0aW9uKHNldHRpbmdzS2V5KTsKLQkJaWYgKHdpemFyZERpYWxvZ1NldHRpbmdzID09IG51bGwpIHsKLQkJCXdpemFyZERpYWxvZ1NldHRpbmdzID0gcGx1Z2luRGlhbG9nU2V0dGluZ3MKLQkJCQkJLmFkZE5ld1NlY3Rpb24oc2V0dGluZ3NLZXkpOwotCQl9Ci0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmREaWFsb2dTZXR0aW5ncyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoTWF0aC5tYXgoNTAwLCBkaWFsb2cuZ2V0U2hlbGwoKS5nZXRTaXplKCkueCksCi0JCQkJNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiBhIHdvcmtzcGFjZSBtb2RpZnkgb3BlcmF0aW9uIHNpbmNlIGl0IGNyZWF0ZXMgcmVzb3VyY2VzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGNyZWF0ZURpYWdyYW0oVVJJIGRpYWdyYW1VUkksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gR01GRWRpdGluZ0RvbWFpbkZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOwotCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrLCAzKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOwotCQlmaW5hbCBTdHJpbmcgZGlhZ3JhbU5hbWUgPSBkaWFncmFtVVJJLmxhc3RTZWdtZW50KCk7Ci0JCUFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQgY29tbWFuZCA9IG5ldyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kKAotCQkJCWVkaXRpbmdEb21haW4sCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsCi0JCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgewotCQkJcHJvdGVjdGVkIENvbW1hbmRSZXN1bHQgZG9FeGVjdXRlV2l0aFJlc3VsdCgKLQkJCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pCi0JCQkJCXRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gbW9kZWwgPSBjcmVhdGVJbml0aWFsTW9kZWwoKTsKLQkJCQlhdHRhY2hNb2RlbFRvUmVzb3VyY2UobW9kZWwsIGRpYWdyYW1SZXNvdXJjZSk7Ci0KLQkJCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKG1vZGVsLAotCQkJCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCQlkaWFncmFtLnNldE5hbWUoZGlhZ3JhbU5hbWUpOwotCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0KLQkJCQkJZGlhZ3JhbVJlc291cmNlCi0JCQkJCQkJLnNhdmUob3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LkRpYWdyYW1EaWFncmFtRWRpdG9yVXRpbAotCQkJCQkJCQkJLmdldFNhdmVPcHRpb25zKCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJIlVuYWJsZSB0byBzdG9yZSBtb2RlbCBhbmQgZGlhZ3JhbSByZXNvdXJjZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsKLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsCi0JCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXNldENoYXJzZXQoV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUoZGlhZ3JhbVJlc291cmNlKSk7Ci0JCXJldHVybiBkaWFncmFtUmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGRvbWFpbiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBjYW52YXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSBjcmVhdGVJbml0aWFsTW9kZWwoKSB7Ci0JCXJldHVybiBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZSBtb2RlbCBlbGVtZW50IGluIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZSgKLQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gbW9kZWwsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlbGVjdEVsZW1lbnRzSW5EaWFncmFtKAotCQkJSURpYWdyYW1Xb3JrYmVuY2hQYXJ0IGRpYWdyYW1QYXJ0LCBMaXN0LypFZGl0UGFydCovZWRpdFBhcnRzKSB7Ci0JCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5kZXNlbGVjdEFsbCgpOwotCi0JCUVkaXRQYXJ0IGZpcnN0UHJpbWFyeSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlZGl0UGFydHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGl0Lm5leHQoKTsKLQkJCWRpYWdyYW1QYXJ0LmdldERpYWdyYW1HcmFwaGljYWxWaWV3ZXIoKS5hcHBlbmRTZWxlY3Rpb24obmV4dFBhcnQpOwotCQkJaWYgKGZpcnN0UHJpbWFyeSA9PSBudWxsICYmIG5leHRQYXJ0IGluc3RhbmNlb2YgSVByaW1hcnlFZGl0UGFydCkgewotCQkJCWZpcnN0UHJpbWFyeSA9IG5leHRQYXJ0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFlZGl0UGFydHMuaXNFbXB0eSgpKSB7Ci0JCQlkaWFncmFtUGFydC5nZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkucmV2ZWFsKAotCQkJCQlmaXJzdFByaW1hcnkgIT0gbnVsbCA/IGZpcnN0UHJpbWFyeSA6IChFZGl0UGFydCkgZWRpdFBhcnRzCi0JCQkJCQkJLmdldCgwKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGZpbmRFbGVtZW50c0luRGlhZ3JhbUJ5SUQoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1QYXJ0LAotCQkJRU9iamVjdCBlbGVtZW50LCBMaXN0IGVkaXRQYXJ0Q29sbGVjdG9yKSB7Ci0JCUlEaWFncmFtR3JhcGhpY2FsVmlld2VyIHZpZXdlciA9IChJRGlhZ3JhbUdyYXBoaWNhbFZpZXdlcikgZGlhZ3JhbVBhcnQKLQkJCQkuZ2V0Vmlld2VyKCk7Ci0JCWZpbmFsIGludCBpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9IGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZpZXcpIHsgLy8gc3VwcG9ydCBub3RhdGlvbiBlbGVtZW50IGxvb2t1cAotCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIHZpZXdlci5nZXRFZGl0UGFydFJlZ2lzdHJ5KCkuZ2V0KAotCQkJCQllbGVtZW50KTsKLQkJCWlmIChlZGl0UGFydCAhPSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKGVkaXRQYXJ0KTsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBlbGVtZW50SUQgPSBFTUZDb3JlVXRpbC5nZXRQcm94eUlEKGVsZW1lbnQpOwotCQlMaXN0IGFzc29jaWF0ZWRQYXJ0cyA9IHZpZXdlci5maW5kRWRpdFBhcnRzRm9yRWxlbWVudChlbGVtZW50SUQsCi0JCQkJSUdyYXBoaWNhbEVkaXRQYXJ0LmNsYXNzKTsKLQkJLy8gcGVyZm9ybSB0aGUgcG9zc2libGUgaGllcmFyY2h5IGRpc2pvaW50IC0+IHRha2UgdGhlIHRvcC1tb3N0IHBhcnRzIG9ubHkKLQkJZm9yIChJdGVyYXRvciBlZGl0UGFydEl0ID0gYXNzb2NpYXRlZFBhcnRzLml0ZXJhdG9yKCk7IGVkaXRQYXJ0SXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRWRpdFBhcnQgbmV4dFBhcnQgPSAoRWRpdFBhcnQpIGVkaXRQYXJ0SXQubmV4dCgpOwotCQkJRWRpdFBhcnQgcGFyZW50UGFydCA9IG5leHRQYXJ0LmdldFBhcmVudCgpOwotCQkJd2hpbGUgKHBhcmVudFBhcnQgIT0gbnVsbCAmJiAhYXNzb2NpYXRlZFBhcnRzLmNvbnRhaW5zKHBhcmVudFBhcnQpKSB7Ci0JCQkJcGFyZW50UGFydCA9IHBhcmVudFBhcnQuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50UGFydCA9PSBudWxsKSB7Ci0JCQkJZWRpdFBhcnRDb2xsZWN0b3IuYWRkKG5leHRQYXJ0KTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnRpYWxOdW1PZkVkaXRQYXJ0cyA9PSBlZGl0UGFydENvbGxlY3Rvci5zaXplKCkpIHsKLQkJCWlmICghYXNzb2NpYXRlZFBhcnRzLmlzRW1wdHkoKSkgewotCQkJCWVkaXRQYXJ0Q29sbGVjdG9yLmFkZChhc3NvY2lhdGVkUGFydHMuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtUGFydCwgZWxlbWVudAotCQkJCQkJCS5lQ29udGFpbmVyKCksIGVkaXRQYXJ0Q29sbGVjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRQYXJ0Q29sbGVjdG9yLnNpemUoKSAtIGludGlhbE51bU9mRWRpdFBhcnRzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZpZXcgZmluZFZpZXcoRGlhZ3JhbUVkaXRQYXJ0IGRpYWdyYW1FZGl0UGFydCwKLQkJCUVPYmplY3QgdGFyZ2V0RWxlbWVudCwgTGF6eUVsZW1lbnQyVmlld01hcCBsYXp5RWxlbWVudDJWaWV3TWFwKSB7Ci0JCWJvb2xlYW4gaGFzU3RydWN0dXJhbFVSSSA9IGZhbHNlOwotCQlpZiAodGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSBpbnN0YW5jZW9mIFhNTFJlc291cmNlKSB7Ci0JCQloYXNTdHJ1Y3R1cmFsVVJJID0gKChYTUxSZXNvdXJjZSkgdGFyZ2V0RWxlbWVudC5lUmVzb3VyY2UoKSkKLQkJCQkJLmdldElEKHRhcmdldEVsZW1lbnQpID09IG51bGw7Ci0JCX0KLQotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAoaGFzU3RydWN0dXJhbFVSSQotCQkJCSYmICFsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmlzRW1wdHkoKSkgewotCQkJdmlldyA9IChWaWV3KSBsYXp5RWxlbWVudDJWaWV3TWFwLmdldEVsZW1lbnQyVmlld01hcCgpLmdldCgKLQkJCQkJdGFyZ2V0RWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoZmluZEVsZW1lbnRzSW5EaWFncmFtQnlJRChkaWFncmFtRWRpdFBhcnQsIHRhcmdldEVsZW1lbnQsCi0JCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcikgPiAwKSB7Ci0JCQlFZGl0UGFydCBlZGl0UGFydCA9IChFZGl0UGFydCkgbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlcgotCQkJCQkuZ2V0KDApOwotCQkJbGF6eUVsZW1lbnQyVmlld01hcC5lZGl0UGFydFRtcEhvbGRlci5jbGVhcigpOwotCQkJdmlldyA9IGVkaXRQYXJ0LmdldE1vZGVsKCkgaW5zdGFuY2VvZiBWaWV3ID8gKFZpZXcpIGVkaXRQYXJ0Ci0JCQkJCS5nZXRNb2RlbCgpIDogbnVsbDsKLQkJfQotCi0JCXJldHVybiAodmlldyA9PSBudWxsKSA/IGRpYWdyYW1FZGl0UGFydC5nZXREaWFncmFtVmlldygpIDogdmlldzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMYXp5RWxlbWVudDJWaWV3TWFwIHsKLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTWFwIGVsZW1lbnQyVmlld01hcDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBWaWV3IHNjb3BlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFNldCBlbGVtZW50U2V0OwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTGlzdCBlZGl0UGFydFRtcEhvbGRlciA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIExhenlFbGVtZW50MlZpZXdNYXAoVmlldyBzY29wZSwgU2V0IGVsZW1lbnRzKSB7Ci0JCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCQl0aGlzLmVsZW1lbnRTZXQgPSBlbGVtZW50czsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgTWFwIGdldEVsZW1lbnQyVmlld01hcCgpIHsKLQkJCWlmIChlbGVtZW50MlZpZXdNYXAgPT0gbnVsbCkgewotCQkJCWVsZW1lbnQyVmlld01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJLy8gbWFwIHBvc3NpYmxlIG5vdGF0aW9uIGVsZW1lbnRzIHRvIGl0c2VsZiBhcyB0aGVzZSBjYW4ndCBiZSBmb3VuZCBieSB2aWV3LmdldEVsZW1lbnQoKQotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWaWV3KSB7Ci0JCQkJCQlWaWV3IHZpZXcgPSAoVmlldykgZWxlbWVudDsKLQkJCQkJCWlmICh2aWV3LmdldERpYWdyYW0oKSA9PSBzY29wZS5nZXREaWFncmFtKCkpIHsKLQkJCQkJCQllbGVtZW50MlZpZXdNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQpOyAvLyB0YWtlIG9ubHkgdGhvc2UgdGhhdCBwYXJ0IG9mIG91ciBkaWFncmFtCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcChzY29wZSwgZWxlbWVudDJWaWV3TWFwLCBlbGVtZW50U2V0KTsKLQkJCX0KLQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJc3RhdGljIE1hcCBidWlsZEVsZW1lbnQyVmlld01hcChWaWV3IHBhcmVudFZpZXcsIE1hcCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJU2V0IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQotCQkJaWYgKHBhcmVudFZpZXcuaXNTZXRFbGVtZW50KCkKLQkJCQkJJiYgIWVsZW1lbnQyVmlld01hcC5jb250YWluc0tleShwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSkKLQkJCQkJJiYgZWxlbWVudHMuY29udGFpbnMocGFyZW50Vmlldy5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJZWxlbWVudDJWaWV3TWFwLnB1dChwYXJlbnRWaWV3LmdldEVsZW1lbnQoKSwgcGFyZW50Vmlldyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGFyZW50Vmlldy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJYnVpbGRFbGVtZW50MlZpZXdNYXAoKFZpZXcpIGl0Lm5leHQoKSwgZWxlbWVudDJWaWV3TWFwLAotCQkJCQkJZWxlbWVudHMpOwotCQkJCWlmIChlbGVtZW50cy5zaXplKCkgPT0gZWxlbWVudDJWaWV3TWFwLnNpemUoKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQyVmlld01hcDsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRWaWV3LmdldFNvdXJjZUVkZ2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlidWlsZEVsZW1lbnQyVmlld01hcCgoVmlldykgaXQubmV4dCgpLCBlbGVtZW50MlZpZXdNYXAsCi0JCQkJCQllbGVtZW50cyk7Ci0JCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA9PSBlbGVtZW50MlZpZXdNYXAuc2l6ZSgpKQotCQkJCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmVudFZpZXcuZ2V0U291cmNlRWRnZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWJ1aWxkRWxlbWVudDJWaWV3TWFwKChWaWV3KSBpdC5uZXh0KCksIGVsZW1lbnQyVmlld01hcCwKLQkJCQkJCWVsZW1lbnRzKTsKLQkJCQlpZiAoZWxlbWVudHMuc2l6ZSgpID09IGVsZW1lbnQyVmlld01hcC5zaXplKCkpCi0JCQkJCXJldHVybiBlbGVtZW50MlZpZXdNYXA7Ci0JCQl9Ci0JCQlyZXR1cm4gZWxlbWVudDJWaWV3TWFwOwotCQl9Ci0JfSAvL0xhenlFbGVtZW50MlZpZXdNYXAJCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODU4Nzk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLnV0aWwuSURFRWRpdG9yRmlsZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnV0aWwuRGlhZ3JhbUZpbGVDcmVhdG9yOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1EaWFncmFtRmlsZUNyZWF0b3IgZXh0ZW5kcyBJREVFZGl0b3JGaWxlQ3JlYXRvciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRGlhZ3JhbURpYWdyYW1GaWxlQ3JlYXRvciBJTlNUQU5DRSA9IG5ldyBEaWFncmFtRGlhZ3JhbUZpbGVDcmVhdG9yKCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtRmlsZUNyZWF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLndwZGQiOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkZjE1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzCi0JCURpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdEZvbnRQcmVmZXJlbmNlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJRGlhZ3JhbUNvcmVVdGlsLmhpZGVDb25uZWN0aW9uSGFuZGxlcyhnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Eb2N1bWVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3YzFiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5NdWx0aVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5EZW11bHRpcGxleGluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLkRpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5EaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LkRpYWdyYW1Nb2RpZmljYXRpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURpYWdyYW1Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5kb2N1bWVudC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmlkZS5kb2N1bWVudC5GaWxlRGlhZ3JhbU1vZGlmaWNhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pbnRlcm5hbC5FZGl0b3JTdGF0dXNDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaW50ZXJuYWwudXRpbC5EaWFncmFtSU9VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi5jb3JlLnJlc291cmNlcy5HTUZSZXNvdXJjZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gKElFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IChJRGlhZ3JhbURvY3VtZW50KSBjcmVhdGVEb2N1bWVudChlZGl0b3JJbnB1dCk7Ci0KLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBuZXcgUmVzb3VyY2VTZXRJbmZvKGRvY3VtZW50LCBlZGl0b3JJbnB1dCk7Ci0JCWluZm8uc2V0TW9kaWZpY2F0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKGluZm8pKTsKLQkJaW5mby5mU3RhdHVzID0gbnVsbDsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGZhbHNlID09IGVsZW1lbnQgaW5zdGFuY2VvZiBGaWxlRWRpdG9ySW5wdXQKLQkJCQkmJiBmYWxzZSA9PSBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gY3JlYXRlRW1wdHlEb2N1bWVudCgpOwotCQlzZXREb2N1bWVudENvbnRlbnQoZG9jdW1lbnQsIChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpOwotCQlzZXR1cERvY3VtZW50KGVsZW1lbnQsIGRvY3VtZW50KTsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdXAgdGhlIGdpdmVuIGRvY3VtZW50IGFzIGl0IHdvdWxkIGJlIHByb3ZpZGVkIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhlCi0JICogY29udGVudCBvZiB0aGUgZG9jdW1lbnQgaXMgbm90IGNoYW5nZWQuIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KLQkgKiBTdWJjbGFzc2VzIG1heSByZWltcGxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgYmx1ZS1wcmludCBlbGVtZW50Ci0JICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudCB0byBzZXQgdXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEb2N1bWVudChPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGZvciBzdWJjbGFzc2VzCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoUmVzb3VyY2VTZXRJbmZvIGluZm8pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlpZiAoZmlsZS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ICs9IGZpbGUuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgKz0gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZUVtcHR5RG9jdW1lbnQoKSB7Ci0JCURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEaWFncmFtRG9jdW1lbnQoKTsKLQkJZG9jdW1lbnQuc2V0RWRpdGluZ0RvbWFpbihjcmVhdGVFZGl0aW5nRG9tYWluKCkpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gY3JlYXRlRWRpdGluZ0RvbWFpbigpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IERpYWdyYW1FZGl0aW5nRG9tYWluRmFjdG9yeQotCQkJCS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVkaXRpbmdEb21haW4oKTsKLQkJZWRpdGluZ0RvbWFpbi5zZXRJRCgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5FZGl0aW5nRG9tYWluIik7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgTm90aWZpY2F0aW9uRmlsdGVyIGRpYWdyYW1SZXNvdXJjZU1vZGlmaWVkRmlsdGVyID0gTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJLmNyZWF0ZU5vdGlmaWVyRmlsdGVyKGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKSkuYW5kKAotCQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyCi0JCQkJCQkJCS5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoTm90aWZpY2F0aW9uLkFERCkpLmFuZCgKLQkJCQkJCU5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVGZWF0dXJlRmlsdGVyKAotCQkJCQkJCQlSZXNvdXJjZVNldC5jbGFzcywKLQkJCQkJCQkJUmVzb3VyY2VTZXQuUkVTT1VSQ0VfU0VUX19SRVNPVVJDRVMpKTsKLQkJZWRpdGluZ0RvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlcigpIHsKLQotCQkJcHJpdmF0ZSBOb3RpZmllciBteVRhcmdlcjsKLQotCQkJcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJCQlyZXR1cm4gbXlUYXJnZXI7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCWlmIChkaWFncmFtUmVzb3VyY2VNb2RpZmllZEZpbHRlci5tYXRjaGVzKG5vdGlmaWNhdGlvbikpIHsKLQkJCQkJT2JqZWN0IHZhbHVlID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCQkoKFJlc291cmNlKSB2YWx1ZSkuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJCQlteVRhcmdlciA9IG5ld1RhcmdldDsKLQkJCX0KLQotCQl9KTsKLQotCQlyZXR1cm4gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGVsZW1lbnQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlEaWFncmFtRG9jdW1lbnQgZGlhZ3JhbURvY3VtZW50ID0gKElEaWFncmFtRG9jdW1lbnQpIGRvY3VtZW50OwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBkaWFncmFtRG9jdW1lbnQuZ2V0RWRpdGluZ0RvbWFpbigpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9ICgoRmlsZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCk7Ci0JCQlEaWFncmFtIGRpYWdyYW0gPSBEaWFncmFtSU9VdGlsLmxvYWQoZG9tYWluLCBzdG9yYWdlLCB0cnVlLAotCQkJCQlnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQlkb2N1bWVudC5zZXRDb250ZW50KGRpYWdyYW0pOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJVVJJIHVyaSA9ICgoVVJJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFVSSSgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZSA9IGRvbWFpbi5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlKAotCQkJCQkJdXJpLnRyaW1GcmFnbWVudCgpLCBmYWxzZSk7Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJcmVzb3VyY2UgPSBkb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSgKLQkJCQkJCQl1cmkudHJpbUZyYWdtZW50KCkpOwotCQkJCX0KLQkJCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoR01GUmVzb3VyY2VGYWN0b3J5Ci0JCQkJCQkJCS5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKSk7Ci0JCQkJCQkvLyBAc2VlIDE3MTA2MCAKLQkJCQkJCS8vIG9wdGlvbnMucHV0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQlyZXNvdXJjZS5sb2FkKG9wdGlvbnMpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXNvdXJjZS51bmxvYWQoKTsKLQkJCQkJCXRocm93IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5hYmxlVG9Mb2FkUmVzb3VyY2VFcnJvcik7Ci0JCQkJfQotCQkJCWlmICh1cmkuZnJhZ21lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCUVPYmplY3Qgcm9vdEVsZW1lbnQgPSByZXNvdXJjZS5nZXRFT2JqZWN0KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJZG9jdW1lbnQuc2V0Q29udGVudCgoRGlhZ3JhbSkgcm9vdEVsZW1lbnQpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IHJvb3RFbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCQkJaWYgKHJvb3RFbGVtZW50IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCQkJCWRvY3VtZW50LnNldENvbnRlbnQoKERpYWdyYW0pIHJvb3RFbGVtZW50KTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQlNZXNzYWdlcy5EaWFncmFtRG9jdW1lbnRQcm92aWRlcl9Ob0RpYWdyYW1JblJlc291cmNlRXJyb3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb3JlRXhjZXB0aW9uIHRocm93bkV4Y3AgPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQl0aHJvd25FeGNwID0gKENvcmVFeGNlcHRpb24pIGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nIG1zZyA9IGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQkJCQl0aHJvd25FeGNwID0gbmV3IENvcmVFeGNlcHRpb24oCi0JCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJMCwKLQkJCQkJCQkJCW1zZyAhPSBudWxsID8gbXNnCi0JCQkJCQkJCQkJCTogTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfRGlhZ3JhbUxvYWRpbmdFcnJvciwKLQkJCQkJCQkJCWUpKTsKLQkJCQl9Ci0JCQkJdGhyb3cgdGhyb3duRXhjcDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkwLAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCU1lc3NhZ2VzLkRpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX0luY29ycmVjdElucHV0RXJyb3IsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQiLAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpLlVSSUVkaXRvcklucHV0IiB9KSwKLQkJCQkJCQludWxsKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoaW5mbyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE1vZGlmaWNhdGlvblN0YW1wKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSURpYWdyYW1Eb2N1bWVudCBkb2N1bWVudCA9IGdldERpYWdyYW1Eb2N1bWVudChlbGVtZW50KTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCVJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IGRvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChkaWFncmFtUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpOwotCQkJCXJldHVybiBmaWxlID09IG51bGwgfHwgZmlsZS5nZXRMb2NhdGlvbigpID09IG51bGwKLQkJCQkJCXx8ICFmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZXhpc3RzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRGVsZXRlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlU2V0SW5mbyBnZXRSZXNvdXJjZVNldEluZm8oT2JqZWN0IGVkaXRvcklucHV0KSB7Ci0JCXJldHVybiAoUmVzb3VyY2VTZXRJbmZvKSBzdXBlci5nZXRFbGVtZW50SW5mbyhlZGl0b3JJbnB1dCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCwgRWxlbWVudEluZm8gaW5mbykgewotCQlpZiAoaW5mbyBpbnN0YW5jZW9mIFJlc291cmNlU2V0SW5mbykgewotCQkJUmVzb3VyY2VTZXRJbmZvIHJlc291cmNlU2V0SW5mbyA9IChSZXNvdXJjZVNldEluZm8pIGluZm87Ci0JCQlyZXNvdXJjZVNldEluZm8uZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VFbGVtZW50SW5mbyhlbGVtZW50LCBpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYWxpZGF0ZVN0YXRlKE9iamVjdCBlbGVtZW50LCBPYmplY3QgY29tcHV0YXRpb25Db250ZXh0KQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlczJWYWxpZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWZpbGVzMlZhbGlkYXRlLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KAotCQkJCQkoSUZpbGVbXSkgZmlsZXMyVmFsaWRhdGUudG9BcnJheShuZXcgSUZpbGVbZmlsZXMyVmFsaWRhdGUKLQkJCQkJCQkuc2l6ZSgpXSksIGNvbXB1dGF0aW9uQ29udGV4dCk7Ci0JCX0KLQotCQlzdXBlci5kb1ZhbGlkYXRlU3RhdGUoZWxlbWVudCwgY29tcHV0YXRpb25Db250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNSZWFkT25seSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1JlYWRPbmx5KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCFpc1N0YXRlVmFsaWRhdGVkKGVsZW1lbnQpKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dAotCQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgVVJJRWRpdG9ySW5wdXQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uaXNVcGRhdGVDYWNoZSgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdXBkYXRlQ2FjaGUoZWxlbWVudCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlLCBleCk7Ci0JCQkJCS8vIEVycm9yIG1lc3NhZ2UgdG8gbG9nIHdhcyBpbml0aWFsbHkgdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuaWRlLmludGVybmFsLmwxMG4uRWRpdG9yTWVzc2FnZXMuU3RvcmFnZURvY3VtZW50UHJvdmlkZXJfaXNNb2RpZmlhYmxlCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGluZm8uaXNNb2RpZmlhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzTW9kaWZpYWJsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCWluZm8uc2V0UmVhZE9ubHkodHJ1ZSk7Ci0JCQkJCWluZm8uc2V0TW9kaWZpYWJsZShmYWxzZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmZvLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJCWluZm8uc2V0TW9kaWZpYWJsZSh0cnVlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VwZGF0ZVN0YXRlQ2FjaGUoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCWluZm8uc2V0VXBkYXRlQ2FjaGUodHJ1ZSk7Ci0JCX0KLQkJc3VwZXIuZG9VcGRhdGVTdGF0ZUNhY2hlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N5bmNocm9uaXplZChPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uaXNTeW5jaHJvbml6ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNTeW5jaHJvbml6ZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0UmVzZXRSdWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIHJ1bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGluZm8uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIG5leHRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShuZXh0UmVzb3VyY2UpOwotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJcnVsZXMuYWRkKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpCi0JCQkJCQkJLm1vZGlmeVJ1bGUoZmlsZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgTXVsdGlSdWxlKChJU2NoZWR1bGluZ1J1bGVbXSkgcnVsZXMKLQkJCQkJLnRvQXJyYXkobmV3IElTY2hlZHVsaW5nUnVsZVtydWxlcy5zaXplKCldKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJU2NoZWR1bGluZ1J1bGUgZ2V0U2F2ZVJ1bGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJUmVzb3VyY2VTZXRJbmZvIGluZm8gPSBnZXRSZXNvdXJjZVNldEluZm8oZWxlbWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG5leHRSZXNvdXJjZSk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlydWxlcy5hZGQoY29tcHV0ZVNjaGVkdWxpbmdSdWxlKGZpbGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE11bHRpUnVsZSgoSVNjaGVkdWxpbmdSdWxlW10pIHJ1bGVzCi0JCQkJCS50b0FycmF5KG5ldyBJU2NoZWR1bGluZ1J1bGVbcnVsZXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVNjaGVkdWxpbmdSdWxlIGdldFN5bmNocm9uaXplUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBydWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXJ1bGVzLmFkZChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKQotCQkJCQkJCS5yZWZyZXNoUnVsZShmaWxlKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG5ldyBNdWx0aVJ1bGUoKElTY2hlZHVsaW5nUnVsZVtdKSBydWxlcwotCQkJCQkudG9BcnJheShuZXcgSVNjaGVkdWxpbmdSdWxlW3J1bGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElTY2hlZHVsaW5nUnVsZSBnZXRWYWxpZGF0ZVN0YXRlUnVsZShPYmplY3QgZWxlbWVudCkgewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJQ29sbGVjdGlvbiBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUobmV4dFJlc291cmNlKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWZpbGVzLmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkKLQkJCQkJLnZhbGlkYXRlRWRpdFJ1bGUoCi0JCQkJCQkJKElGaWxlW10pIGZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgY29tcHV0ZVNjaGVkdWxpbmdSdWxlKElSZXNvdXJjZSB0b0NyZWF0ZU9yTW9kaWZ5KSB7Ci0JCWlmICh0b0NyZWF0ZU9yTW9kaWZ5LmV4aXN0cygpKQotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLm1vZGlmeVJ1bGUoCi0JCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCi0JCUlSZXNvdXJjZSBwYXJlbnQgPSB0b0NyZWF0ZU9yTW9kaWZ5OwotCQlkbyB7Ci0JCQkvKgotCQkJICogWFhYIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvcgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3NjAxCi0JCQkgKiBJUmVzb3VyY2VSdWxlRmFjdG9yeS5jcmVhdGVSdWxlIHNob3VsZCBpdGVyYXRlIHRoZSBoaWVyYXJjaHkKLQkJCSAqIGl0c2VsZi4KLQkJCSAqLwotCQkJdG9DcmVhdGVPck1vZGlmeSA9IHBhcmVudDsKLQkJCXBhcmVudCA9IHRvQ3JlYXRlT3JNb2RpZnkuZ2V0UGFyZW50KCk7Ci0JCX0gd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuZXhpc3RzKCkpOwotCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5jcmVhdGVSdWxlKAotCQkJCXRvQ3JlYXRlT3JNb2RpZnkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1N5bmNocm9uaXplKE9iamVjdCBlbGVtZW50LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlU2V0SW5mbyBpbmZvID0gZ2V0UmVzb3VyY2VTZXRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW5mby5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaGFuZGxlRWxlbWVudENoYW5nZWQoaW5mbywgbmV4dFJlc291cmNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5kb1N5bmNocm9uaXplKGVsZW1lbnQsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50LAotCQkJSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlSZXNvdXJjZVNldEluZm8gaW5mbyA9IGdldFJlc291cmNlU2V0SW5mbyhlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKCFvdmVyd3JpdGUgJiYgIWluZm8uaXNTeW5jaHJvbml6ZWQoKSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfVW5zeW5jaHJvbml6ZWRGaWxlU2F2ZUVycm9yLAotCQkJCQkJCQludWxsKSk7Ci0JCQl9Ci0JCQlpbmZvLnN0b3BSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5naW5nKGVsZW1lbnQpOwotCQkJTGlzdCByZXNvdXJjZXMgPSBpbmZvLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZURpYWdyYW1UYXNrLAotCQkJCQkJcmVzb3VyY2VzLnNpemUoKSArIDEpOyAvLyJTYXZpbmcgZGlhZ3JhbSIKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgbmV4dFJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJCW1vbml0b3IKLQkJCQkJCQkuc2V0VGFza05hbWUoTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2ssCi0JCQkJCQkJCQkJCW5leHRSZXNvdXJjZS5nZXRVUkkoKSkpOwotCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJbmV4dFJlc291cmNlLnNhdmUoRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsCi0JCQkJCQkJCQkuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQkJCQkJRWRpdG9yU3RhdHVzQ29kZXMuUkVTT1VSQ0VfRkFJTFVSRSwgZQotCQkJCQkJCQkJCQkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBudWxsKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJZmlyZUVsZW1lbnRTdGF0ZUNoYW5nZUZhaWxlZChlbGVtZW50KTsKLQkJCQl0aHJvdyB4OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbmZvLnN0YXJ0UmVzb3VyY2VMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50Q2hhbmdlZChSZXNvdXJjZVNldEluZm8gaW5mbywKLQkJCVJlc291cmNlIGNoYW5nZWRSZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlGaWxlIGZpbGUgPSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShjaGFuZ2VkUmVzb3VyY2UpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbW9uaXRvcik7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJCQkJLmdldEluc3RhbmNlKCkKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTWVzc2FnZXMuRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfaGFuZGxlRWxlbWVudENvbnRlbnRDaGFuZ2VkLAotCQkJCQkJCQlleCk7Ci0JCQkJLy8gRXJyb3IgbWVzc2FnZSB0byBsb2cgd2FzIGluaXRpYWxseSB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVzb3VyY2VzLmVkaXRvci5pZGUuaW50ZXJuYWwubDEwbi5FZGl0b3JNZXNzYWdlcy5GaWxlRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQKLQkJCX0KLQkJfQotCQljaGFuZ2VkUmVzb3VyY2UudW5sb2FkKCk7Ci0KLQkJZmlyZUVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoaW5mby5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJcmVtb3ZlVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlpbmZvLmZTdGF0dXMgPSBudWxsOwotCQl0cnkgewotCQkJc2V0RG9jdW1lbnRDb250ZW50KGluZm8uZkRvY3VtZW50LCBpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWluZm8uZlN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJaWYgKCFpbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQlpbmZvLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChpbmZvKSk7Ci0JCX0KLQkJYWRkVW5jaGFuZ2VkRWxlbWVudExpc3RlbmVycyhpbmZvLmdldEVkaXRvcklucHV0KCksIGluZm8pOwotCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChpbmZvLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFbGVtZW50TW92ZWQoSUVkaXRvcklucHV0IGlucHV0LCBVUkkgdXJpKSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGUgbmV3RmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZSgKLQkJCQkJbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCQlmaXJlRWxlbWVudE1vdmVkKGlucHV0LCBuZXdGaWxlID09IG51bGwgPyBudWxsCi0JCQkJCTogbmV3IEZpbGVFZGl0b3JJbnB1dChuZXdGaWxlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gVE9ETzogYXBwZW5kIHN1ZmZpeCB0byB0aGUgVVJJISAodXNlIGRpYWdyYW0gYXMgYSBwYXJhbWV0ZXIpCi0JCWZpcmVFbGVtZW50TW92ZWQoaW5wdXQsIG5ldyBVUklFZGl0b3JJbnB1dCh1cmkpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElFZGl0b3JJbnB1dCBjcmVhdGVJbnB1dFdpdGhFZGl0aW5nRG9tYWluKElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlyZXR1cm4gZWRpdG9ySW5wdXQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJRGlhZ3JhbURvY3VtZW50IGdldERpYWdyYW1Eb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoZWxlbWVudCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJRGlhZ3JhbURvY3VtZW50KSB7Ci0JCQlyZXR1cm4gKElEaWFncmFtRG9jdW1lbnQpIGRvYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElSdW5uYWJsZUNvbnRleHQgZ2V0T3BlcmF0aW9uUnVubmVyKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlU2V0SW5mbyBleHRlbmRzIEVsZW1lbnRJbmZvIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBsb25nIG15TW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBXb3Jrc3BhY2VTeW5jaHJvbml6ZXIgbXlTeW5jaHJvbml6ZXI7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgQ29sbGVjdGlvbiBteVVuU3luY2hyb25pemVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIElEaWFncmFtRG9jdW1lbnQgbXlEb2N1bWVudDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBJRWRpdG9ySW5wdXQgbXlFZGl0b3JJbnB1dDsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIG15VXBkYXRlQ2FjaGUgPSB0cnVlOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gbXlNb2RpZmlhYmxlID0gZmFsc2U7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBteVJlYWRPbmx5ID0gdHJ1ZTsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyIG15UmVzb3VyY2VTZXRMaXN0ZW5lcjsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFJlc291cmNlU2V0SW5mbyhJRGlhZ3JhbURvY3VtZW50IGRvY3VtZW50LAotCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgewotCQkJc3VwZXIoZG9jdW1lbnQpOwotCQkJbXlEb2N1bWVudCA9IGRvY3VtZW50OwotCQkJbXlFZGl0b3JJbnB1dCA9IGVkaXRvcklucHV0OwotCQkJc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpOwotCQkJbXlSZXNvdXJjZVNldExpc3RlbmVyID0gbmV3IFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLmFkZChteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKCkgewotCQkJcmV0dXJuIG15TW9kaWZpY2F0aW9uU3RhbXA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9uU3RhbXAobG9uZyBtb2RpZmljYXRpb25TdGFtcCkgewotCQkJbXlNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJCXJldHVybiBteURvY3VtZW50LmdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBJRWRpdG9ySW5wdXQgZ2V0RWRpdG9ySW5wdXQoKSB7Ci0JCQlyZXR1cm4gbXlFZGl0b3JJbnB1dDsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3RvcFJlc291cmNlTGlzdGVuaW5nKCk7Ci0JCQlnZXRSZXNvdXJjZVNldCgpLmVBZGFwdGVycygpLnJlbW92ZShteVJlc291cmNlU2V0TGlzdGVuZXIpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKCkgewotCQkJcmV0dXJuIG15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuc2l6ZSgpID09IDA7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VW5TeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCW15VW5TeW5jaHJvbml6ZWRSZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgZmluYWwgdm9pZCBzdG9wUmVzb3VyY2VMaXN0ZW5pbmcoKSB7Ci0JCQlteVN5bmNocm9uaXplci5kaXNwb3NlKCk7Ci0JCQlteVN5bmNocm9uaXplciA9IG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGZpbmFsIHZvaWQgc3RhcnRSZXNvdXJjZUxpc3RlbmluZygpIHsKLQkJCW15U3luY2hyb25pemVyID0gbmV3IFdvcmtzcGFjZVN5bmNocm9uaXplcihteURvY3VtZW50Ci0JCQkJCS5nZXRFZGl0aW5nRG9tYWluKCksIG5ldyBTeW5jaHJvbml6ZXJEZWxlZ2F0ZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZUNhY2hlKCkgewotCQkJcmV0dXJuIG15VXBkYXRlQ2FjaGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VXBkYXRlQ2FjaGUoYm9vbGVhbiB1cGRhdGUpIHsKLQkJCW15VXBkYXRlQ2FjaGUgPSB1cGRhdGU7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCkgewotCQkJcmV0dXJuIG15TW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRNb2RpZmlhYmxlKGJvb2xlYW4gbW9kaWZpYWJsZSkgewotCQkJbXlNb2RpZmlhYmxlID0gbW9kaWZpYWJsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIG15UmVhZE9ubHk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiByZWFkT25seSkgewotCQkJbXlSZWFkT25seSA9IHJlYWRPbmx5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgY2xhc3MgU3luY2hyb25pemVyRGVsZWdhdGUgaW1wbGVtZW50cwotCQkJCVdvcmtzcGFjZVN5bmNocm9uaXplci5EZWxlZ2F0ZSB7Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQkvKioKLQkJCSAqIEBnZW5lcmF0ZWQKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gaGFuZGxlUmVzb3VyY2VDaGFuZ2VkKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWhhbmRsZUVsZW1lbnRDaGFuZ2VkKFJlc291cmNlU2V0SW5mby50aGlzLCByZXNvdXJjZSwKLQkJCQkJCQkJbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAZ2VuZXJhdGVkCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGhhbmRsZVJlc291cmNlRGVsZXRlZChSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJCXN5bmNocm9uaXplZCAoUmVzb3VyY2VTZXRJbmZvLnRoaXMpIHsKLQkJCQkJaWYgKFJlc291cmNlU2V0SW5mby50aGlzLmZDYW5CZVNhdmVkKSB7Ci0JCQkJCQlSZXNvdXJjZVNldEluZm8udGhpcy5zZXRVblN5bmNocm9uaXplZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlmaXJlRWxlbWVudERlbGV0ZWQoUmVzb3VyY2VTZXRJbmZvLnRoaXMKLQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQGdlbmVyYXRlZAotCQkJICovCi0JCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVSZXNvdXJjZU1vdmVkKFJlc291cmNlIHJlc291cmNlLAotCQkJCQlmaW5hbCBVUkkgbmV3VVJJKSB7Ci0JCQkJc3luY2hyb25pemVkIChSZXNvdXJjZVNldEluZm8udGhpcykgewotCQkJCQlpZiAoUmVzb3VyY2VTZXRJbmZvLnRoaXMuZkNhbkJlU2F2ZWQpIHsKLQkJCQkJCVJlc291cmNlU2V0SW5mby50aGlzLnNldFVuU3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChteURvY3VtZW50LmdldERpYWdyYW0oKS5lUmVzb3VyY2UoKSA9PSByZXNvdXJjZSkgewotCQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhhbmRsZUVsZW1lbnRNb3ZlZChSZXNvdXJjZVNldEluZm8udGhpcwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG5ld1VSSSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWhhbmRsZVJlc291cmNlRGVsZXRlZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlU2V0TW9kaWZpY2F0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFQ29udGVudEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIE5vdGlmaWNhdGlvbkZpbHRlciBteU1vZGlmaWVkRmlsdGVyOwotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIFJlc291cmNlU2V0SW5mbyBteUluZm87Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZVNldE1vZGlmaWNhdGlvbkxpc3RlbmVyKFJlc291cmNlU2V0SW5mbyBpbmZvKSB7Ci0JCQlteUluZm8gPSBpbmZvOwotCQkJbXlNb2RpZmllZEZpbHRlciA9IE5vdGlmaWNhdGlvbkZpbHRlci5jcmVhdGVFdmVudFR5cGVGaWx0ZXIoCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQpLm9yKAotCQkJCQlOb3RpZmljYXRpb25GaWx0ZXIKLQkJCQkJCQkuY3JlYXRlRXZlbnRUeXBlRmlsdGVyKE5vdGlmaWNhdGlvbi5VTlNFVCkpLmFuZCgKLQkJCQkJTm90aWZpY2F0aW9uRmlsdGVyLmNyZWF0ZUZlYXR1cmVGaWx0ZXIoUmVzb3VyY2UuY2xhc3MsCi0JCQkJCQkJUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVEKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBSZXNvdXJjZVNldCkgewotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJCWlmICghbm90aWZpY2F0aW9uLmlzVG91Y2goKQotCQkJCQkmJiBteU1vZGlmaWVkRmlsdGVyLm1hdGNoZXMobm90aWZpY2F0aW9uKSkgewotCQkJCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBteUluZm8uZ2V0UmVzb3VyY2VTZXQoKQotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpCi0JCQkJCQkJCSYmICFtb2RpZmllZDspIHsKLQkJCQkJCQlSZXNvdXJjZSBuZXh0UmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCQkJCQlpZiAobmV4dFJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQkJbW9kaWZpZWQgPSBuZXh0UmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWJvb2xlYW4gZGlydHlTdGF0ZUNoYW5nZWQgPSBmYWxzZTsKLQkJCQkJCXN5bmNocm9uaXplZCAobXlJbmZvKSB7Ci0JCQkJCQkJaWYgKG1vZGlmaWVkICE9IG15SW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCQlteUluZm8uZkNhbkJlU2F2ZWQgPSBtb2RpZmllZDsKLQkJCQkJCQkJZGlydHlTdGF0ZUNoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIXJlc291cmNlLmlzTW9kaWZpZWQoKSkgewotCQkJCQkJCQlteUluZm8uc2V0U3luY2hyb25pemVkKHJlc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZGlydHlTdGF0ZUNoYW5nZWQpIHsKLQkJCQkJCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKG15SW5mbwotCQkJCQkJCQkJLmdldEVkaXRvcklucHV0KCksIG1vZGlmaWVkKTsKLQotCQkJCQkJCWlmICghbW9kaWZpZWQpIHsKLQkJCQkJCQkJbXlJbmZvCi0JCQkJCQkJCQkJLnNldE1vZGlmaWNhdGlvblN0YW1wKGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChteUluZm8pKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjQ5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvcmUuR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU9iamVjdEFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVSSSBkb21haW5Nb2RlbFVSSTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCXRoaXMudGFyZ2V0UGFydCA9IHRhcmdldFBhcnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWRvbWFpbk1vZGVsVVJJID0gbnVsbDsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gPT0gZmFsc2UKLQkJCQl8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJZG9tYWluTW9kZWxVUkkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShmaWxlLmdldEZ1bGxQYXRoKCkKLQkJCQkudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gdGFyZ2V0UGFydC5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBHTUZFZGl0aW5nRG9tYWluRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlFT2JqZWN0IGRpYWdyYW1Sb290ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZG9tYWluTW9kZWxVUkksIHRydWUpOwotCQkJZGlhZ3JhbVJvb3QgPSAoRU9iamVjdCkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZXgpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBsb2FkIHJlc291cmNlOiAiICsgZG9tYWluTW9kZWxVUkksIGV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChkaWFncmFtUm9vdCA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nCi0JCQkJCS5vcGVuRXJyb3IoCi0JCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dUaXRsZSwKLQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlXaXphcmQgd2l6YXJkID0gbmV3IERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZChkb21haW5Nb2RlbFVSSSwKLQkJCQlkaWFncmFtUm9vdCwgZWRpdGluZ0RvbWFpbik7Ci0JCXdpemFyZAotCQkJCS5zZXRXaW5kb3dUaXRsZShOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlNZXNzYWdlcy5EaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVdpemFyZFRpdGxlLAotCQkJCQkJCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQpKTsKLQkJRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsLnJ1bldpemFyZChnZXRTaGVsbCgpLCB3aXphcmQsCi0JCQkJIkluaXREaWFncmFtRmlsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTG9hZFJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGNmZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5Mb2FkUmVzb3VyY2VBY3Rpb24uTG9hZFJlc291cmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Mb2FkUmVzb3VyY2VBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0IG15U2VsZWN0ZWRFbGVtZW50OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2hlbGwgbXlTaGVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCW15U2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJTG9hZFJlc291cmNlRGlhbG9nIGxvYWRSZXNvdXJjZURpYWxvZyA9IG5ldyBMb2FkUmVzb3VyY2VEaWFsb2cobXlTaGVsbCwKLQkJCQlteVNlbGVjdGVkRWxlbWVudC5nZXRFZGl0aW5nRG9tYWluKCkpOwotCQlsb2FkUmVzb3VyY2VEaWFsb2cub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlteVNlbGVjdGVkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJaWYgKHN0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpID09IDEKLQkJCQkJJiYgc3RydWN0dXJlZFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCkgewotCQkJCW15U2VsZWN0ZWRFbGVtZW50ID0gKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydCkgc3RydWN0dXJlZFNlbGVjdGlvbgotCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJfQotCQl9Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGlzRW5hYmxlZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIG15U2VsZWN0ZWRFbGVtZW50ICE9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbU1hdGNoaW5nU3RyYXRlZ3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmYwN2FhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTWF0Y2hpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IucGFydHMuRGlhZ3JhbURvY3VtZW50RWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTWF0Y2hpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0OwotCQl0cnkgewotCQkJZWRpdG9ySW5wdXQgPSBlZGl0b3JSZWYuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGVkaXRvcklucHV0LmVxdWFscyhpbnB1dCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIFVSSUVkaXRvcklucHV0Ci0JCQkJJiYgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuICgoVVJJRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KS5nZXRVUkkoKS5lcXVhbHMoCi0JCQkJCSgoVVJJRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRVUkkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NlYTUyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5vcGVyYXRpb25zLk9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5Db21tYW5kUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLnZpZXcuQ3JlYXRlRGlhZ3JhbVZpZXdPcGVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29yZS51dGlsLkVPYmplY3RBZGFwdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIG15RWRpdGluZ0RvbWFpbjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkKFVSSSBkb21haW5Nb2RlbFVSSSwgRU9iamVjdCBkaWFncmFtUm9vdCwKLQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4pIHsKLQkJYXNzZXJ0IGRvbWFpbk1vZGVsVVJJICE9IG51bGwgOiAiRG9tYWluIG1vZGVsIHVyaSBtdXN0IGJlIHNwZWNpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0IGRpYWdyYW1Sb290ICE9IG51bGwgOiAiRG9hZ3JhbSByb290IGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydCBlZGl0aW5nRG9tYWluICE9IG51bGwgOiAiRWRpdGluZyBkb21haW4gbXVzdCBiZSBzcGVjaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLQkJbXlGaWxlQ3JlYXRpb25QYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZU5hbWUsCi0JCQkJU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfQ3JlYXRpb25QYWdlVGl0bGUpOwotCQlteUZpbGVDcmVhdGlvblBhZ2Uuc2V0RGVzY3JpcHRpb24oTkxTLmJpbmQoCi0JCQkJTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uLAotCQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCkpOwotCQlJUGF0aCBmaWxlUGF0aDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZG9tYWluTW9kZWxVUkkudHJpbUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQlpZiAoZG9tYWluTW9kZWxVUkkuaXNQbGF0Zm9ybVJlc291cmNlKCkpIHsKLQkJCWZpbGVQYXRoID0gbmV3IFBhdGgoZG9tYWluTW9kZWxVUkkudHJpbVNlZ21lbnRzKDEpCi0JCQkJCS50b1BsYXRmb3JtU3RyaW5nKHRydWUpKTsKLQkJfSBlbHNlIGlmIChkb21haW5Nb2RlbFVSSS5pc0ZpbGUoKSkgewotCQkJZmlsZVBhdGggPSBuZXcgUGF0aChkb21haW5Nb2RlbFVSSS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJLy8gVE9ETyA6IHVzZSBzb21lIGRlZmF1bHQgcGF0aAotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlVuc3VwcG9ydGVkIFVSSTogIiArIGRvbWFpbk1vZGVsVVJJKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRDb250YWluZXJGdWxsUGF0aChmaWxlUGF0aCk7Ci0JCW15RmlsZUNyZWF0aW9uUGFnZS5zZXRGaWxlTmFtZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwKLQkJCQkuZ2V0VW5pcXVlRmlsZU5hbWUoZmlsZVBhdGgsIGZpbGVOYW1lLCAid3BkZCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UgPSBuZXcgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSgKLQkJCQlNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOYW1lKTsKLQkJZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZQotCQkJCS5zZXRUaXRsZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VUaXRsZSk7Ci0JCWRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UKLQkJCQkuc2V0RGVzY3JpcHRpb24oTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb24pOwotCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLnNldE1vZGVsRWxlbWVudChkaWFncmFtUm9vdCk7Ci0KLQkJbXlFZGl0aW5nRG9tYWluID0gZWRpdGluZ0RvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIG15RmlsZUNyZWF0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShteUZpbGVDcmVhdGlvblBhZ2UpOwotCQlhZGRQYWdlKGRpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlMaXN0IGFmZmVjdGVkRmlsZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJRmlsZSBkaWFncmFtRmlsZSA9IG15RmlsZUNyZWF0aW9uUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCURpYWdyYW1EaWFncmFtRWRpdG9yVXRpbC5zZXRDaGFyc2V0KGRpYWdyYW1GaWxlKTsKLQkJYWZmZWN0ZWRGaWxlcy5hZGQoZGlhZ3JhbUZpbGUpOwotCQlVUkkgZGlhZ3JhbU1vZGVsVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZGlhZ3JhbUZpbGUKLQkJCQkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCB0cnVlKTsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBteUVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZmluYWwgUmVzb3VyY2UgZGlhZ3JhbVJlc291cmNlID0gcmVzb3VyY2VTZXQKLQkJCQkuY3JlYXRlUmVzb3VyY2UoZGlhZ3JhbU1vZGVsVVJJKTsKLQkJQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCBjb21tYW5kID0gbmV3IEFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJbXlFZGl0aW5nRG9tYWluLAotCQkJCU1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Jbml0RGlhZ3JhbUNvbW1hbmQsCi0JCQkJYWZmZWN0ZWRGaWxlcykgewotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KAotCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykKLQkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaW50IGRpYWdyYW1WSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeQotCQkJCQkJLmdldERpYWdyYW1WaXN1YWxJRChkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlCi0JCQkJCQkJCS5nZXRNb2RlbEVsZW1lbnQoKSk7Ci0JCQkJaWYgKGRpYWdyYW1WSUQgIT0gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdAotCQkJCQkJCS5uZXdFcnJvckNvbW1hbmRSZXN1bHQoTWVzc2FnZXMuRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luY29ycmVjdFJvb3RFcnJvcik7Ci0JCQkJfQotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0oCi0JCQkJCQlkaWFncmFtUm9vdEVsZW1lbnRTZWxlY3Rpb25QYWdlLmdldE1vZGVsRWxlbWVudCgpLAotCQkJCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCWRpYWdyYW1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChkaWFncmFtKTsKLQkJCQlkaWFncmFtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbS5nZXRFbGVtZW50KCkpOwotCQkJCXJldHVybiBDb21tYW5kUmVzdWx0Lm5ld09LQ29tbWFuZFJlc3VsdCgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJT3BlcmF0aW9uSGlzdG9yeUZhY3RvcnkuZ2V0T3BlcmF0aW9uSGlzdG9yeSgpLmV4ZWN1dGUoY29tbWFuZCwKLQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwuZ2V0U2F2ZU9wdGlvbnMoKSk7Ci0JCQlEaWFncmFtRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbVJlc291cmNlKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJIlVuYWJsZSB0byBjcmVhdGUgbW9kZWwgYW5kIGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKAotCQkJCQkiU2F2ZSBvcGVyYXRpb24gZmFpbGVkIGZvcjogIiArIGRpYWdyYW1Nb2RlbFVSSSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGV4KSB7Ci0JCQlXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoCi0JCQkJCSJVbmFibGUgdG8gb3BlbiBlZGl0b3IiLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlhZ3JhbVJvb3RFbGVtZW50U2VsZWN0aW9uUGFnZSBleHRlbmRzCi0JCQlNb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlIHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIERpYWdyYW1Sb290RWxlbWVudFNlbGVjdGlvblBhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCQlzdXBlcihwYWdlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJCXJldHVybiBNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXNldEVycm9yTWVzc2FnZShNZXNzYWdlcy5EaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VOb1NlbGVjdGlvbk1lc3NhZ2UpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gcmVzdWx0ID0gVmlld1NlcnZpY2UuZ2V0SW5zdGFuY2UoKS5wcm92aWRlcygKLQkJCQkJbmV3IENyZWF0ZURpYWdyYW1WaWV3T3BlcmF0aW9uKG5ldyBFT2JqZWN0QWRhcHRlcigKLQkJCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCksCi0JCQkJCQkJV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lELAotCQkJCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0ID8gbnVsbAotCQkJCQk6IE1lc3NhZ2VzLkRpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L0RpYWdyYW1QYWxldHRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzEwYzAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtUGFsZXR0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVycy5EaWFncmFtRWxlbWVudFR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLnBhbGV0dGUuUGFsZXR0ZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlBhbGV0dGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5wYWxldHRlLlRvb2xFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnRvb2xzLlVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudG9vbHMuVW5zcGVjaWZpZWRUeXBlQ3JlYXRpb25Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFsZXR0ZUZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxQYWxldHRlKFBhbGV0dGVSb290IHBhbGV0dGVSb290KSB7Ci0JCXBhbGV0dGVSb290LmFkZChjcmVhdGVNb2RlbDFHcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzICJtb2RlbCIgcGFsZXR0ZSB0b29sIGdyb3VwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGFsZXR0ZUNvbnRhaW5lciBjcmVhdGVNb2RlbDFHcm91cCgpIHsKLQkJUGFsZXR0ZUdyb3VwIHBhbGV0dGVDb250YWluZXIgPSBuZXcgUGFsZXR0ZUdyb3VwKAotCQkJCU1lc3NhZ2VzLk1vZGVsMUdyb3VwX3RpdGxlKTsKLQkJcGFsZXR0ZUNvbnRhaW5lci5hZGQoY3JlYXRlQ29udHJvbEZsb3cxQ3JlYXRpb25Ub29sKCkpOwotCQlwYWxldHRlQ29udGFpbmVyLmFkZChjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sKCkpOwotCQlyZXR1cm4gcGFsZXR0ZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVDb250cm9sRmxvdzFDcmVhdGlvblRvb2woKSB7Ci0JCUxpc3QvKjxJRWxlbWVudFR5cGU+Ki90eXBlcyA9IG5ldyBBcnJheUxpc3QvKjxJRWxlbWVudFR5cGU+Ki8oMSk7Ci0JCXR5cGVzLmFkZChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSk7Ci0JCUxpbmtUb29sRW50cnkgZW50cnkgPSBuZXcgTGlua1Rvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfdGV4dCwKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BY3Rpdml0eURpYWdyYW1fUGFsZXR0ZV9jb250cm9sX2Zsb3dfY3JlYXRlX3RleHQsIHR5cGVzKTsKLQkJZW50cnkuc2V0U21hbGxJY29uKERpYWdyYW1FbGVtZW50VHlwZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluaygpKSk7Ci0JCWVudHJ5LnNldExhcmdlSWNvbihlbnRyeS5nZXRTbWFsbEljb24oKSk7Ci0JCXJldHVybiBlbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwcml2YXRlIFRvb2xFbnRyeSBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sKCkgewotCQlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovdHlwZXMgPSBuZXcgQXJyYXlMaXN0Lyo8SUVsZW1lbnRUeXBlPiovKDEpOwotCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMSk7Ci0JCU5vZGVUb29sRW50cnkgZW50cnkgPSBuZXcgTm9kZVRvb2xFbnRyeSgKLQkJCQlEaWFncmFtQ29yZVJlc291cmNlcy5BYnN0cmFjdERpYWdyYW1fV29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQsCi0JCQkJIERpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdG9vbHRpcCwgdHlwZXMpOwotCQllbnRyeS5zZXRTbWFsbEljb24oRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRJbWFnZURlc2NyaXB0b3IoTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlKCkpKTsKLQkJZW50cnkuc2V0TGFyZ2VJY29uKGVudHJ5LmdldFNtYWxsSWNvbigpKTsKLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlVG9vbEVudHJ5IGV4dGVuZHMgVG9vbEVudHJ5IHsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0IGVsZW1lbnRUeXBlczsKLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHJpdmF0ZSBOb2RlVG9vbEVudHJ5KFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJCUxpc3QgZWxlbWVudFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOwotCQkJdGhpcy5lbGVtZW50VHlwZXMgPSBlbGVtZW50VHlwZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJCVRvb2wgdG9vbCA9IG5ldyBVbnNwZWNpZmllZFR5cGVDcmVhdGlvblRvb2woZWxlbWVudFR5cGVzKTsKLQkJCXRvb2wuc2V0UHJvcGVydGllcyhnZXRUb29sUHJvcGVydGllcygpKTsKLQkJCXJldHVybiB0b29sOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExpbmtUb29sRW50cnkgZXh0ZW5kcyBUb29sRW50cnkgewotCi0JCS8qKgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIExpc3QgcmVsYXRpb25zaGlwVHlwZXM7Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXByaXZhdGUgTGlua1Rvb2xFbnRyeShTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCQlMaXN0IHJlbGF0aW9uc2hpcFR5cGVzKSB7Ci0JCQlzdXBlcih0aXRsZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOwotCQkJdGhpcy5yZWxhdGlvbnNoaXBUeXBlcyA9IHJlbGF0aW9uc2hpcFR5cGVzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCQlUb29sIHRvb2wgPSBuZXcgVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblRvb2wocmVsYXRpb25zaGlwVHlwZXMpOwotCQkJdG9vbC5zZXRQcm9wZXJ0aWVzKGdldFRvb2xQcm9wZXJ0aWVzKCkpOwotCQkJcmV0dXJuIHRvb2w7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtVmlzdWFsSURSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdkYjNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9EaWFncmFtVmlzdWFsSURSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdE5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogVGhpcyByZWdpc3RyeSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCB0eXBlIG9mIHZpc3VhbCBvYmplY3Qgc2hvdWxkIGJlCi0gKiBjcmVhdGVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBEaWFncmFtLCBOb2RlLCBDaGlsZE5vZGUgb3IgTGluayByZXByZXNlbnRlZCAKLSAqIGJ5IGEgZG9tYWluIG1vZGVsIG9iamVjdC4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVmlzdWFsSURSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHX0tFWSA9IFdQRERpYWdyYW1FZGl0b3JQbHVnaW4KLQkJCS5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpCi0JCQkrICIvZGVidWcvdmlzdWFsSUQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VmlzdWFsSUQoVmlldyB2aWV3KSB7Ci0JCWlmICh2aWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJaWYgKFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRC5lcXVhbHModmlldwotCQkJCQkuZ2V0VHlwZSgpKSkgewotCQkJCXJldHVybiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldFZpc3VhbElEKHZpZXcuZ2V0VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TW9kZWxJRChWaWV3IHZpZXcpIHsKLQkJVmlldyBkaWFncmFtID0gdmlldy5nZXREaWFncmFtKCk7Ci0JCXdoaWxlICh2aWV3ICE9IGRpYWdyYW0pIHsKLQkJCUVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB2aWV3LmdldEVBbm5vdGF0aW9uKCJTaG9ydGN1dCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGFubm90YXRpb24uZ2V0RGV0YWlscygpLmdldCgibW9kZWxJRCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl2aWV3ID0gKFZpZXcpIHZpZXcuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBkaWFncmFtICE9IG51bGwgPyBkaWFncmFtLmdldFR5cGUoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFZpc3VhbElEKFN0cmluZyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh0eXBlKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWlmIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQlQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihERUJVR19LRVkpKSkgewotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5sb2dFcnJvcigKLQkJCQkJCSJVbmFibGUgdG8gcGFyc2UgdmlldyB0eXBlIGFzIGEgdmlzdWFsSUQgbnVtYmVyOiAiCi0JCQkJCQkJCSsgdHlwZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUeXBlKGludCB2aXN1YWxJRCkgewotCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YodmlzdWFsSUQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXREaWFncmFtVmlzdWFsSUQoZG9tYWluRWxlbWVudCwgZG9tYWluRWxlbWVudE1ldGFjbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXREaWFncmFtVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSgpCi0JCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiBpc0RpYWdyYW1Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5KChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSBkb21haW5FbGVtZW50KSkgewotCQkJcmV0dXJuIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCX0KLQkJcmV0dXJuIGdldFVucmVjb2duaXplZERpYWdyYW1JRChkb21haW5FbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywgRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCWlmIChkb21haW5FbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlFQ2xhc3MgZG9tYWluRWxlbWVudE1ldGFjbGFzcyA9IGRvbWFpbkVsZW1lbnQuZUNsYXNzKCk7Ci0JCXJldHVybiBnZXROb2RlVmlzdWFsSUQoY29udGFpbmVyVmlldywgZG9tYWluRWxlbWVudCwKLQkJCQlkb21haW5FbGVtZW50TWV0YWNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9kZVZpc3VhbElEKFZpZXcgY29udGFpbmVyVmlldywKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MsCi0JCQlTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCVN0cmluZyBjb250YWluZXJNb2RlbElEID0gZ2V0TW9kZWxJRChjb250YWluZXJWaWV3KTsKLQkJaWYgKCFXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKGNvbnRhaW5lck1vZGVsSUQpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaW50IGNvbnRhaW5lclZpc3VhbElEOwotCQlpZiAoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhjb250YWluZXJNb2RlbElEKSkgewotCQkJY29udGFpbmVyVmlzdWFsSUQgPSBnZXRWaXN1YWxJRChjb250YWluZXJWaWV3KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjb250YWluZXJWaWV3IGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCWNvbnRhaW5lclZpc3VhbElEID0gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWludCBub2RlVmlzdWFsSUQgPSBzZW1hbnRpY0hpbnQgIT0gbnVsbCA/IGdldFZpc3VhbElEKHNlbWFudGljSGludCkKLQkJCQk6IC0xOwotCQlzd2l0Y2ggKGNvbnRhaW5lclZpc3VhbElEKSB7Ci0JCWNhc2UgV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKSB7Ci0JCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQ7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3ROb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKChzZW1hbnRpY0hpbnQgPT0gbnVsbCB8fCBXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQgPT0gbm9kZVZpc3VhbElEKQotCQkJCQkmJiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0Tm9kZSgpCi0JCQkJCQkJLmlzU3VwZXJUeXBlT2YoZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkJJiYgKGRvbWFpbkVsZW1lbnQgPT0gbnVsbCB8fCBpc05vZGVXb3JrUHJvZHVjdE5vZGVfMTAwMSgoV29ya1Byb2R1Y3ROb2RlKSBkb21haW5FbGVtZW50KSkpIHsKLQkJCQlyZXR1cm4gV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEOwotCQkJfQotCQkJcmV0dXJuIGdldFVucmVjb2duaXplZFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzlDaGlsZE5vZGVJRCgKLQkJCQkJZG9tYWluRWxlbWVudCwgc2VtYW50aWNIaW50KTsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJaWYgKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEID09IG5vZGVWaXN1YWxJRCkgewotCQkJCXJldHVybiBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJCX0KLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rXzMwMDFMaW5rTGFiZWxJRChzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKEVPYmplY3QgZG9tYWluRWxlbWVudCkgewotCQlpZiAoZG9tYWluRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MgPSBkb21haW5FbGVtZW50LmVDbGFzcygpOwotCQlyZXR1cm4gZ2V0TGlua1dpdGhDbGFzc1Zpc3VhbElEKGRvbWFpbkVsZW1lbnQsIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoRU9iamVjdCBkb21haW5FbGVtZW50LAotCQkJRUNsYXNzIGRvbWFpbkVsZW1lbnRNZXRhY2xhc3MpIHsKLQkJaWYgKE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGluaygpLmlzU3VwZXJUeXBlT2YoCi0JCQkJZG9tYWluRWxlbWVudE1ldGFjbGFzcykKLQkJCQkmJiAoZG9tYWluRWxlbWVudCA9PSBudWxsIHx8IGlzTGlua1dpdGhDbGFzc0xpbmtfMzAwMSgoTGluaykgZG9tYWluRWxlbWVudCkpKSB7Ci0JCQlyZXR1cm4gTGlua0VkaXRQYXJ0LlZJU1VBTF9JRDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoZG9tYWluRWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGlhZ3JhbVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1fNzkoCi0JCQlXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWREaWFncmFtSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9kZVdvcmtQcm9kdWN0Tm9kZV8xMDAxKFdvcmtQcm9kdWN0Tm9kZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkV29ya1Byb2R1Y3ROb2RlXzEwMDFDaGlsZE5vZGVJRCgKLQkJCUVPYmplY3QgZG9tYWluRWxlbWVudCwgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5Q2hpbGROb2RlSUQoCi0JCQlFT2JqZWN0IGRvbWFpbkVsZW1lbnQsIFN0cmluZyBzZW1hbnRpY0hpbnQpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFVzZXIgY2FuIGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc29tZSBzcGVjaWZpYwotCSAqIHNpdHVhdGlvbnMgbm90IGNvdmVyZWQgYnkgZGVmYXVsdCBsb2dpYy4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VW5yZWNvZ25pemVkTGlua18zMDAxTGlua0xhYmVsSUQoU3RyaW5nIHNlbWFudGljSGludCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogVXNlciBjYW4gY2hhbmdlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHRvIGhhbmRsZSBzb21lIHNwZWNpZmljCi0JICogc2l0dWF0aW9ucyBub3QgY292ZXJlZCBieSBkZWZhdWx0IGxvZ2ljLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRVbnJlY29nbml6ZWRMaW5rV2l0aENsYXNzSUQoRU9iamVjdCBkb21haW5FbGVtZW50KSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VyIGNhbiBjaGFuZ2UgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgdG8gY2hlY2sgc29tZSBhZGRpdGlvbmFsIAotCSAqIGNvbmRpdGlvbnMgaGVyZS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGlua1dpdGhDbGFzc0xpbmtfMzAwMShMaW5rIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyOTUxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0JLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKCJtZXNzYWdlcyIsIE1lc3NhZ2VzLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JfQotCi0JCi0gICAgCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX09wZW5Nb2RlbFJlc291cmNlRXJyb3JEaWFsb2dUaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9PcGVuTW9kZWxSZXNvdXJjZUVycm9yRGlhbG9nTWVzc2FnZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1EaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWw7Ci0JCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX2lzTW9kaWZpYWJsZTsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9oYW5kbGVFbGVtZW50Q29udGVudENoYW5nZWQ7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfSW5jb3JyZWN0SW5wdXRFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9VbmFibGVUb0xvYWRSZXNvdXJjZUVycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX05vRGlhZ3JhbUluUmVzb3VyY2VFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9EaWFncmFtTG9hZGluZ0Vycm9yOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Eb2N1bWVudFByb3ZpZGVyX1Vuc3luY2hyb25pemVkRmlsZVNhdmVFcnJvcjsKLQkKLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtRG9jdW1lbnRQcm92aWRlcl9TYXZlRGlhZ3JhbVRhc2s7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXJfU2F2ZU5leHRSZXNvdXJjZVRhc2s7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVSZXNvdXJjZUVycm9yRGlhbG9nVGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtSW5pdERpYWdyYW1GaWxlQWN0aW9uX0luaXREaWFncmFtRmlsZVJlc291cmNlRXJyb3JEaWFsb2dNZXNzYWdlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbUluaXREaWFncmFtRmlsZUFjdGlvbl9Jbml0RGlhZ3JhbUZpbGVXaXphcmRUaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1Jbml0RGlhZ3JhbUZpbGVBY3Rpb25fT3Blbk1vZGVsRmlsZURpYWxvZ1RpdGxlOwotCQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9DcmVhdGlvblBhZ2VOYW1lOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZVRpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0NyZWF0aW9uUGFnZURlc2NyaXB0aW9uOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlTmFtZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZVRpdGxlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX1Jvb3RTZWxlY3Rpb25QYWdlRGVzY3JpcHRpb247Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFncmFtTmV3RGlhZ3JhbUZpbGVXaXphcmRfUm9vdFNlbGVjdGlvblBhZ2VTZWxlY3Rpb25UaXRsZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZU5vU2VsZWN0aW9uTWVzc2FnZTsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9Sb290U2VsZWN0aW9uUGFnZUludmFsaWRTZWxlY3Rpb25NZXNzYWdlOwotCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhZ3JhbU5ld0RpYWdyYW1GaWxlV2l6YXJkX0luaXREaWFncmFtQ29tbWFuZDsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWdyYW1OZXdEaWFncmFtRmlsZVdpemFyZF9JbmNvcnJlY3RSb290RXJyb3I7Ci0JCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgTW9kZWwxR3JvdXBfdGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sRmxvdzFDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBDb250cm9sRmxvdzFDcmVhdGlvblRvb2xfZGVzYzsKLQotCQkvKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdvcmtQcm9kdWN0RGVzY3JpcHRvcjJDcmVhdGlvblRvb2xfdGl0bGU7Ci0KLQkJLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrUHJvZHVjdERlc2NyaXB0b3IyQ3JlYXRpb25Ub29sX2Rlc2M7Ci0JICAgICAgICAKLSAgICAgICAgCi0JCS8qKgotICogQGdlbmVyYXRlZAotICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWFuZE5hbWVfT3BlbkRpYWdyYW07Ci0gICAgCi0gICAgLy9UT0RPOiBwdXQgYWNjZXNzb3IgZmllbGRzIG1hbnVhbGx5CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Nb2RlbEVsZW1lbnRTZWxlY3Rpb25QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3N2NlZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L01vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIFdpemFyZCBwYWdlIHRoYXQgYWxsb3dzIHRvIHNlbGVjdCBlbGVtZW50IGZyb20gbW9kZWwuCi0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFRyZWVWaWV3ZXIgbW9kZWxWZXdlcjsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxFbGVtZW50U2VsZWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRNb2RlbEVsZW1lbnQoKSB7Ci0JCXJldHVybiBzZWxlY3RlZE1vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxFbGVtZW50KEVPYmplY3QgbW9kZWxFbGVtZW50KSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbW9kZWxFbGVtZW50OwotCQlpZiAobW9kZWxWZXdlciAhPSBudWxsKSB7Ci0JCQlpZiAoc2VsZWN0ZWRNb2RlbEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCW1vZGVsVmV3ZXIuc2V0SW5wdXQoc2VsZWN0ZWRNb2RlbEVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQkJc2VsZWN0ZWRNb2RlbEVsZW1lbnQpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kZWxWZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQkJCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCUNvbXBvc2l0ZSBwbGF0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBsYXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXBsYXRlLnNldExheW91dChsYXlvdXQpOwotCQlzZXRDb250cm9sKHBsYXRlKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwbGF0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KGdldFNlbGVjdGlvblRpdGxlKCkpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCW1vZGVsVmV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwbGF0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gMzAwOwotCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJbW9kZWxWZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJbW9kZWxWZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCW1vZGVsVmV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEl0ZW1Qcm92aWRlcnNBZGFwdGVyRmFjdG9yeSgpKSk7Ci0JCWlmIChzZWxlY3RlZE1vZGVsRWxlbWVudCAhPSBudWxsKSB7Ci0JCQltb2RlbFZld2VyLnNldElucHV0KHNlbGVjdGVkTW9kZWxFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCW1vZGVsVmV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCkpOwotCQl9Ci0JCW1vZGVsVmV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU1vZGVsRWxlbWVudFNlbGVjdGlvblBhZ2UudGhpcwotCQkJCQkJLnVwZGF0ZVNlbGVjdGlvbigoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcHJvdmlkZSBjdXN0b20gbW9kZWwgZWxlbWVudCBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWxlY3Rpb25UaXRsZSgpIHsKLQkJcmV0dXJuICJTZWxlY3QgbW9kZWwgZWxlbWVudDoiOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXNlbGVjdGVkTW9kZWxFbGVtZW50ID0gbnVsbDsKLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXNlbGVjdGVkRWxlbWVudCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEZlYXR1cmVNYXAuRW50cnkpIHsKLQkJCQlzZWxlY3RlZEVsZW1lbnQgPSAoKEZlYXR1cmVNYXAuRW50cnkpIHNlbGVjdGVkRWxlbWVudCkKLQkJCQkJCS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkRWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlzZWxlY3RlZE1vZGVsRWxlbWVudCA9IChFT2JqZWN0KSBzZWxlY3RlZEVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZSB0byBwcm92aWRlIHNwZWNpZmljIHZhbGlkYXRpb24gb2YgdGhlIHNlbGVjdGVkIG1vZGVsIGVsZW1lbnQuCi0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUERESW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMjQ5YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgV1BEREltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxDTDE2ID0gImljb25zL2Z1bGwvZWxjbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETENMMTYgPSAiaWNvbnMvZnVsbC9kbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUT09MMTYgPSAiaWNvbnMvZnVsbC9ldG9vbDE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVE9PTDE2ID0gImljb25zL2Z1bGwvZHRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfRURJVE9SID0gRVRPT0wxNiArICJXUERERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IgPSBEVE9PTDE2Ci0JCQkrICJXUERERWRpdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19FRElUT1IgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkuZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9FRElUT1IpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRURJVE9SID0gV1BERGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRURJVE9SKTsJCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dQRERpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlMTY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRGVsZWdhdGluZ0xheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRnJlZWZvcm1MYXllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGF5ZXJlZFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5EaWFncmFtQ29yZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnBhcnQuQWJzdHJhY3REaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5EaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzLkRpYWdyYW1FbGVtZW50VHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkxheWVyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5hY3Rpb25zLkFjdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmVkaXRwYXJ0cy5EaWFncmFtUm9vdEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucmVxdWVzdHMuQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIERpYWdyYW0gRWRpdG9yIGZvciBXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtLgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAY3VzdG9tCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEREaWFncmFtRWRpdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFncmFtRWRpdG9yIHsKLQotCS8qKgotCSAqIEBtb2RpZmllZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUdyYXBoaWNhbFZpZXdlcigpIHsKLQkJc3VwZXIuY29uZmlndXJlR3JhcGhpY2FsVmlld2VyKCk7Ci0JCURpYWdyYW1Sb290RWRpdFBhcnQgcm9vdCA9IChEaWFncmFtUm9vdEVkaXRQYXJ0KSBnZXREaWFncmFtR3JhcGhpY2FsVmlld2VyKCkKLQkJCQkuZ2V0Um9vdEVkaXRQYXJ0KCk7Ci0JCUxheWVyZWRQYW5lIHByaW50YWJsZUxheWVycyA9IChMYXllcmVkUGFuZSkgcm9vdAotCQkJCS5nZXRMYXllcihMYXllckNvbnN0YW50cy5QUklOVEFCTEVfTEFZRVJTKTsKLQkJRnJlZWZvcm1MYXllciBleHRMYWJlbHNMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCWV4dExhYmVsc0xheWVyLnNldExheW91dE1hbmFnZXIobmV3IERlbGVnYXRpbmdMYXlvdXQoKSk7Ci0vLwkJcHJpbnRhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoZXh0TGFiZWxzTGF5ZXIsCi0vLwkJCQlEaWFncmFtRWRpdFBhcnRGYWN0b3J5LkVYVEVSTkFMX05PREVfTEFCRUxTX0xBWUVSLAotLy8JCQkJTGF5ZXJDb25zdGFudHMuUFJJTUFSWV9MQVlFUik7Ci0JCUxheWVyZWRQYW5lIHNjYWxhYmxlTGF5ZXJzID0gKExheWVyZWRQYW5lKSByb290Ci0JCQkJLmdldExheWVyKExheWVyQ29uc3RhbnRzLlNDQUxBQkxFX0xBWUVSUyk7Ci0JCUZyZWVmb3JtTGF5ZXIgc2NhbGVkRmVlZGJhY2tMYXllciA9IG5ldyBGcmVlZm9ybUxheWVyKCk7Ci0JCXNjYWxlZEZlZWRiYWNrTGF5ZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXNjYWxhYmxlTGF5ZXJzLmFkZExheWVyQWZ0ZXIoc2NhbGVkRmVlZGJhY2tMYXllciwKLQkJCQlMYXllckNvbnN0YW50cy5TQ0FMRURfRkVFREJBQ0tfTEFZRVIsCi0JCQkJRGlhZ3JhbVJvb3RFZGl0UGFydC5ERUNPUkFUSU9OX1VOUFJJTlRBQkxFX0xBWUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXNIaW50IGdldFByZWZlcmVuY2VzSGludCgpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlc0hpbnQoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLmNyZWF0ZUFjdGlvbnMoKTsKLQkJTGlzdDxJRWxlbWVudFR5cGU+IGVsZW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQllbGVtZW50VHlwZXMuYWRkKERpYWdyYW1FbGVtZW50VHlwZXMuV29ya1Byb2R1Y3ROb2RlXzEwMDEpOwotCQlJQWN0aW9uIGFjdGlvbiA9IGNyZWF0ZUFuQWN0aW9uKAotCQkJCURpYWdyYW1Db3JlUmVzb3VyY2VzLkFic3RyYWN0RGlhZ3JhbV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dCwgZWxlbWVudFR5cGVzLCAvLyROT04tTkxTLTEkCi0JCQkJRGlhZ3JhbUNvbnN0YW50cy5DUkVBVEVfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfTk9ERSwgCi0JCQkJRGlhZ3JhbUNvcmVSZXNvdXJjZXMuQWJzdHJhY3REaWFncmFtX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90b29sdGlwCi0JCQkJLCBXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2V0QWN0aW9uUmVnaXN0cnkoKS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Db250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQlzdXBlci5jb250cmlidXRlVG9Db250ZXh0TWVudShtZW51KTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG1lbnUuZmluZChBY3Rpb25JZHMuTUVOVV9ESUFHUkFNX0FERCk7Ci0JCWlmKGl0ZW0gIT0gbnVsbCAmJiBpdGVtIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKXsKLQkJCUlNZW51TWFuYWdlciBhZGRNZW51ID0gKElNZW51TWFuYWdlcilpdGVtOwotCQkJaWYoZ2V0R3JhcGhpY2FsVmlld2VyKCkuZ2V0U2VsZWN0ZWRFZGl0UGFydHMoKS5zaXplKCkgPT0gMCl7Ci0JCQkJYWRkVG9NZW51KGFkZE1lbnUsIG51bGwsIERpYWdyYW1Db25zdGFudHMuRElBR1JBTV9BRERfTUVOVV9HRU5FUkFMX0dST1VQLCAKLQkJCQkJCXRydWUsIHRydWUpOwkKLQkJCQlhZGRUb01lbnUoYWRkTWVudSxEaWFncmFtQ29uc3RhbnRzLkNSRUFURV9XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9OT0RFLCAKLQkJCQkJCURpYWdyYW1Db25zdGFudHMuRElBR1JBTV9BRERfTUVOVV9HRU5FUkFMX0dST1VQLCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnROYW1lUHJlZml4KCkgewotCQlyZXR1cm4gRGlhZ3JhbUNvcmVSZXNvdXJjZXMuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV9wcmVmaXg7IAotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldFBhcnRJbWFnZSgpIHsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkiZnVsbC9ldG9vbDE2L1dQRERFZGl0b3IuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIENyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGdldENyZWF0ZUNvbnRyb2xGbG93UmVxdWVzdCgpewotCQlMaXN0PElFbGVtZW50VHlwZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SUVsZW1lbnRUeXBlPigpOwotCQlsaXN0LmFkZChEaWFncmFtRWxlbWVudFR5cGVzLkxpbmtfMzAwMSk7Ci0JCUNyZWF0ZVVuc3BlY2lmaWVkVHlwZUNvbm5lY3Rpb25SZXF1ZXN0IGNvbm5lY3Rpb25SZXF1ZXN0ID0gCi0JCQluZXcgQ3JlYXRlVW5zcGVjaWZpZWRUeXBlQ29ubmVjdGlvblJlcXVlc3QobGlzdCwgZmFsc2UsCi0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb25SZXF1ZXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3BhcnQvV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzkxZmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9XUEREaWFncmFtRWRpdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5yZXNvdXJjZS5SZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5wcm92aWRlci5Nb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAbW9kaWZpZWQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV1BERGlhZ3JhbUVkaXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZmVyZW5jZXNIaW50IERJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCA9IG5ldyBQcmVmZXJlbmNlc0hpbnQoCi0JCQlJRCk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgV1BERGlhZ3JhbUVkaXRvclBsdWdpbiBpbnN0YW5jZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaWFncmFtRG9jdW1lbnRQcm92aWRlciBteURvY3VtZW50UHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4oKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlpbnN0YW5jZSA9IHRoaXM7Ci0JCVByZWZlcmVuY2VzSGludC5yZWdpc3RlclByZWZlcmVuY2VTdG9yZShESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQsCi0JCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlhZGFwdGVyRmFjdG9yeSA9IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCWluc3RhbmNlID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXUEREaWFncmFtRWRpdG9yUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhmYWN0b3JpZXMpOwotCQlyZXR1cm4gbmV3IENvbXBvc2VkQWRhcHRlckZhY3RvcnkoZmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEl0ZW1Qcm92aWRlckZhY3RvcmllcyhMaXN0IGZhY3RvcmllcykgewotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBNb2RlbEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCQlmYWN0b3JpZXMuYWRkKG5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SXRlbUltYWdlRGVzY3JpcHRvcihPYmplY3QgaXRlbSkgewotCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGl0ZW0sIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCWxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoaXRlbSkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoLgotCSAqCi0JICogQGdlbmVyYXRlZAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEJ1bmRsZWRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihJRCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogUmVzcGVjdHMgaW1hZ2VzIHJlc2lkaW5nIGluIGFueSBwbHVnLWluLiBJZiBwYXRoIGlzIHJlbGF0aXZlLAotCSAqIHRoZW4gdGhpcyBidW5kbGUgaXMgbG9va2VkIHVwIGZvciB0aGUgaW1hZ2UsIG90aGVyd2lzZSwgZm9yIGFic29sdXRlIAotCSAqIHBhdGgsIGZpcnN0IHNlZ21lbnQgaXMgdGFrZW4gYXMgaWQgb2YgcGx1Zy1pbiB3aXRoIGltYWdlCi0JICoKLQkgKiBAZ2VuZXJhdGVkCi0JICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gaW1hZ2UsIGVpdGhlciBhYnNvbHV0ZSAod2l0aCBwbHVnLWluIGlkIGFzIGZpcnN0IHNlZ21lbnQpLCBvciByZWxhdGl2ZSBmb3IgYnVuZGxlZCBpbWFnZXMKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZmluZEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBJUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7Ci0JCWlmIChwLmlzQWJzb2x1dGUoKSAmJiBwLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihwLnNlZ21lbnQoMCksIHAKLQkJCQkJLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwLm1ha2VBYnNvbHV0ZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzdHJpbmcgZnJvbSBwbHVnLWluJ3MgcmVzb3VyY2UgYnVuZGxlCi0JICogQG1vZGlmaWVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoZ2V0SW5zdGFuY2UoKS5nZXRCdW5kbGUoKSwgIiUiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluIHJlbGF0aXZlIHBhdGguCi0JICogQ2xpZW50IGRvIG5vdCBuZWVkIHRvIGRpc3Bvc2UgdGhpcyBpbWFnZS4gSW1hZ2VzIHdpbGwgYmUgZGlzcG9zZWQgYXV0b21hdGljYWxseS4KLQkgKgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gaW1hZ2UgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0QnVuZGxlZEltYWdlKFN0cmluZyBwYXRoKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChwYXRoKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocGF0aCwgZ2V0QnVuZGxlZEltYWdlRGVzY3JpcHRvcihwYXRoKSk7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIgZ2V0RG9jdW1lbnRQcm92aWRlcigpIHsKLQkJaWYgKG15RG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteURvY3VtZW50UHJvdmlkZXIgPSBuZXcgRGlhZ3JhbURvY3VtZW50UHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gbXlEb2N1bWVudFByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IpIHsKLQkJbG9nRXJyb3IoZXJyb3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aHJvd2FibGUgYWN0dWFsIGVycm9yIG9yIG51bGwgY291bGQgYmUgcGFzc2VkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAoZXJyb3IgPT0gbnVsbCAmJiB0aHJvd2FibGUgIT0gbnVsbCkgewotCQkJZXJyb3IgPSB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCWdldExvZygpLmxvZygKLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCQlJU3RhdHVzLk9LLCBlcnJvciwgdGhyb3dhYmxlKSk7Ci0JCWRlYnVnKGVycm9yLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ0luZm8obWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRocm93YWJsZSBhY3R1YWwgZXJyb3Igb3IgbnVsbCBjb3VsZCBiZSBwYXNzZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW5mbyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsICYmIHRocm93YWJsZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlID0gdGhyb3dhYmxlLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlnZXRMb2coKS5sb2coCi0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsIElTdGF0dXMuT0ssCi0JCQkJCQltZXNzYWdlLCB0aHJvd2FibGUpKTsKLQkJZGVidWcobWVzc2FnZSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQlpZiAodGhyb3dhYmxlICE9IG51bGwpIHsKLQkJCXRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcGFydC9Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOGM1ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wYXJ0L1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51aS5VUklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMuSU1ldGhvZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMubWFya2VyLk1hcmtlck5hdmlnYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEaWFncmFtRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLmRvY3VtZW50LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnJlc291cmNlcy5lZGl0b3IuZG9jdW1lbnQuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5yZXNvdXJjZXMuZWRpdG9yLnBhcnRzLkRpYWdyYW1Eb2N1bWVudEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNhdmVBc0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSUdvdG9NYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvciBleHRlbmRzIERpYWdyYW1Eb2N1bWVudEVkaXRvcgotCQlpbXBsZW1lbnRzIElHb3RvTWFya2VyLCBJTWV0aG9kRWRpdG9yIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRvcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdG9yKCkgewotCQlzdXBlcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhbGV0dGVSb290IGNyZWF0ZVBhbGV0dGVSb290KFBhbGV0dGVSb290IGV4aXN0aW5nUGFsZXR0ZVJvb3QpIHsKLQkJUGFsZXR0ZVJvb3Qgcm9vdCA9IHN1cGVyLmNyZWF0ZVBhbGV0dGVSb290KGV4aXN0aW5nUGFsZXR0ZVJvb3QpOwotCQluZXcgRGlhZ3JhbVBhbGV0dGVGYWN0b3J5KCkuZmlsbFBhbGV0dGUocm9vdCk7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldERvY3VtZW50UHJvdmlkZXIoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JCU1hcmtlck5hdmlnYXRpb25TZXJ2aWNlLmdldEluc3RhbmNlKCkuZ290b01hcmtlcih0aGlzLCBtYXJrZXIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJcGVyZm9ybVNhdmVBcyhuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVNhdmVBcyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQlTaGVsbCBzaGVsbCA9IGdldFNpdGUoKS5nZXRTaGVsbCgpOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhzaGVsbCk7Ci0JCUlGaWxlIG9yaWdpbmFsID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ID8gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkKLQkJCQkuZ2V0RmlsZSgpCi0JCQkJOiBudWxsOwotCQlpZiAob3JpZ2luYWwgIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbCk7Ci0JCX0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCS8vIGVkaXRvciBoYXMgYmVlbiBwcm9ncmFtbWF0aWNhbGx5IGNsb3NlZCB3aGlsZSB0aGUgZGlhbG9nIHdhcyBvcGVuCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHByb3ZpZGVyLmlzRGVsZXRlZChpbnB1dCkgJiYgb3JpZ2luYWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJIlRoZSBvcmlnaW5hbCBmaWxlICcnezB9JycgaGFzIGJlZW4gZGVsZXRlZC4iLCBvcmlnaW5hbAotCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJZGlhbG9nLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlKG1lc3NhZ2UsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlQYXRoIGZpbGVQYXRoID0gZGlhbG9nLmdldFJlc3VsdCgpOwotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkgewotCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLnNldENhbmNlbGVkKHRydWUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJZmluYWwgSUVkaXRvcklucHV0IG5ld0lucHV0ID0gbmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJLy8gQ2hlY2sgaWYgdGhlIGVkaXRvciBpcyBhbHJlYWR5IG9wZW4KLQkJSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgbWF0Y2hpbmdTdHJhdGVneSA9IGdldEVkaXRvckRlc2NyaXB0b3IoKQotCQkJCS5nZXRFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkaXRvclJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtYXRjaGluZ1N0cmF0ZWd5Lm1hdGNoZXMoZWRpdG9yUmVmc1tpXSwgbmV3SW5wdXQpKSB7Ci0JCQkJTWVzc2FnZURpYWxvZwotCQkJCQkJLm9wZW5XYXJuaW5nKHNoZWxsLCAiUHJvYmxlbSBEdXJpbmcgU2F2ZSBBcy4uLiIsCi0JCQkJCQkJCSJTYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuIFRhcmdldCBmaWxlIGlzIGFscmVhZHkgb3BlbiBpbiBhbm90aGVyIGVkaXRvci4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlwcm92aWRlci5hYm91dFRvQ2hhbmdlKG5ld0lucHV0KTsKLQkJCWdldERvY3VtZW50UHJvdmlkZXIobmV3SW5wdXQpLnNhdmVEb2N1bWVudChwcm9ncmVzc01vbml0b3IsCi0JCQkJCW5ld0lucHV0LAotCQkJCQlnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZ2V0RWRpdG9ySW5wdXQoKSksIHRydWUpOwotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24geCkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSB4LmdldFN0YXR1cygpOwotCQkJaWYgKHN0YXR1cyA9PSBudWxsIHx8IHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuQ0FOQ0VMKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCAiU2F2ZSBQcm9ibGVtcyIsCi0JCQkJCQkiQ291bGQgbm90IHNhdmUgZmlsZS4iLCB4LmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXByb3ZpZGVyLmNoYW5nZWQobmV3SW5wdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlzZXRJbnB1dChuZXdJbnB1dCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQoIXN1Y2Nlc3MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlc0hpbnQgZ2V0UHJlZmVyZW5jZXNIaW50KCkgewotCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udHJpYnV0b3JJZCgpIHsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnRQcm92aWRlciBnZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0Ci0JCQkJfHwgaW5wdXQgaW5zdGFuY2VvZiBVUklFZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERvY3VtZW50UHJvdmlkZXIoaW5wdXQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0RWRpdGluZ0RvbWFpbigpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RWRpdG9ySW5wdXQoKSAhPSBudWxsID8gZ2V0RG9jdW1lbnRQcm92aWRlcigpCi0JCQkJLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpIDogbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURpYWdyYW1Eb2N1bWVudCkgewotCQkJcmV0dXJuICgoSURpYWdyYW1Eb2N1bWVudCkgZG9jdW1lbnQpLmdldEVkaXRpbmdEb21haW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RWRpdGluZ0RvbWFpbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZjYzYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtQXBwZWFyYW5jZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1BcHBlYXJhbmNlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUNvbm5lY3Rpb25zUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxNzlmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmVmZXJlbmNlcy5Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1Db25uZWN0aW9uc1ByZWZlcmVuY2VQYWdlKCkgewotCQlzZXRQcmVmZXJlbmNlU3RvcmUoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDFlY2Y3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbUdlbmVyYWxQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtR2VuZXJhbFByZWZlcmVuY2VQYWdlIGV4dGVuZHMgRGlhZ3JhbXNQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJlZmVyZW5jZXMvRGlhZ3JhbVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYzM2NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUudXRpbC5EaWFncmFtQ29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1QcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBAbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCURpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1HZW5lcmFsUHJlZmVyZW5jZVBhZ2UuaW5pdERlZmF1bHRzKHN0b3JlKTsKLQkJRGlhZ3JhbUFwcGVhcmFuY2VQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtQ29ubmVjdGlvbnNQcmVmZXJlbmNlUGFnZS5pbml0RGVmYXVsdHMoc3RvcmUpOwotCQlEaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmluaXREZWZhdWx0cyhzdG9yZSk7Ci0JCURpYWdyYW1Db3JlVXRpbC5zZXREZWZhdWx0Rm9udFByZWZlcmVuY2UoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlEaWFncmFtQ29yZVV0aWwuc2V0RGVmYXVsdExpbmVTdHlsZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1QcmludGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZGUyMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuUHJpbnRpbmdQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByaW50aW5nUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtUHJpbnRpbmdQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcmVmZXJlbmNlcy9EaWFncmFtUnVsZXJzQW5kR3JpZFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4MTRlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ByZWZlcmVuY2VzL0RpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByZWZlcmVuY2VzLlJ1bGVyR3JpZFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBSdWxlckdyaWRQcmVmZXJlbmNlUGFnZSB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1SdWxlcnNBbmRHcmlkUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXNldFByZWZlcmVuY2VTdG9yZShXUEREaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1BYnN0cmFjdFBhcnNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDJlMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUFic3RyYWN0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VQb3NpdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5QYXJzZXJFZGl0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuY29tbWFuZHMuU2V0VmFsdWVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUucmVxdWVzdHMuU2V0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIGltcGxlbWVudHMgSVBhcnNlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdmlld1BhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IHZpZXdQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZWRpdFBhdHRlcm47Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRm9ybWF0IGVkaXRQcm9jZXNzb3I7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWaWV3UGF0dGVybigpIHsKLQkJcmV0dXJuIHZpZXdQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBnZXRWaWV3UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gdmlld1Byb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld1BhdHRlcm4oU3RyaW5nIHZpZXdQYXR0ZXJuKSB7Ci0JCXRoaXMudmlld1BhdHRlcm4gPSB2aWV3UGF0dGVybjsKLQkJdmlld1Byb2Nlc3NvciA9IGNyZWF0ZVZpZXdQcm9jZXNzb3Iodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZUZvcm1hdCBjcmVhdGVWaWV3UHJvY2Vzc29yKFN0cmluZyB2aWV3UGF0dGVybikgewotCQlyZXR1cm4gbmV3IE1lc3NhZ2VGb3JtYXQodmlld1BhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRQYXR0ZXJuKCkgewotCQlyZXR1cm4gZWRpdFBhdHRlcm47Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldEVkaXRQcm9jZXNzb3IoKSB7Ci0JCXJldHVybiBlZGl0UHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0UGF0dGVybihTdHJpbmcgZWRpdFBhdHRlcm4pIHsKLQkJdGhpcy5lZGl0UGF0dGVybiA9IGVkaXRQYXR0ZXJuOwotCQllZGl0UHJvY2Vzc29yID0gY3JlYXRlRWRpdFByb2Nlc3NvcihlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGNyZWF0ZUVkaXRQcm9jZXNzb3IoU3RyaW5nIGVkaXRQYXR0ZXJuKSB7Ci0JCXJldHVybiBuZXcgTWVzc2FnZUZvcm1hdChlZGl0UGF0dGVybik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbnRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0Vmlld1BhdHRlcm4oKSwKLQkJCQlnZXRWaWV3UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVkaXRTdHJpbmcoSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MpIHsKLQkJcmV0dXJuIGdldFN0cmluZ0J5UGF0dGVybihhZGFwdGVyLCBmbGFncywgZ2V0RWRpdFBhdHRlcm4oKSwKLQkJCQlnZXRFZGl0UHJvY2Vzc29yKCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZ0J5UGF0dGVybihJQWRhcHRhYmxlIGFkYXB0ZXIsIGludCBmbGFncywKLQkJCVN0cmluZyBwYXR0ZXJuLCBNZXNzYWdlRm9ybWF0IHByb2Nlc3Nvcik7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElQYXJzZXJFZGl0U3RhdHVzIGlzVmFsaWRFZGl0U3RyaW5nKElBZGFwdGFibGUgZWxlbWVudCwKLQkJCVN0cmluZyBlZGl0U3RyaW5nKSB7Ci0JCVBhcnNlUG9zaXRpb24gcG9zID0gbmV3IFBhcnNlUG9zaXRpb24oMCk7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShlZGl0U3RyaW5nLCBwb3MpOwotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgUGFyc2VyRWRpdFN0YXR1cyhXUEREaWFncmFtRWRpdG9yUGx1Z2luLklELAotCQkJCQlJUGFyc2VyRWRpdFN0YXR1cy5VTkVESVRBQkxFLCAiSW52YWxpZCBpbnB1dCBhdCAiCi0JCQkJCQkJKyBwb3MuZ2V0RXJyb3JJbmRleCgpKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdGVOZXdWYWx1ZXModmFsdWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlTmV3VmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlyZXR1cm4gUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRV9TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tbWFuZCBnZXRQYXJzZUNvbW1hbmQoSUFkYXB0YWJsZSBhZGFwdGVyLCBTdHJpbmcgbmV3U3RyaW5nLAotCQkJaW50IGZsYWdzKSB7Ci0JCU9iamVjdFtdIHZhbHVlcyA9IGdldEVkaXRQcm9jZXNzb3IoKS5wYXJzZShuZXdTdHJpbmcsCi0JCQkJbmV3IFBhcnNlUG9zaXRpb24oMCkpOwotCQlpZiAodmFsdWVzID09IG51bGwKLQkJCQl8fCB2YWxpZGF0ZU5ld1ZhbHVlcyh2YWx1ZXMpLmdldENvZGUoKSAhPSBJUGFyc2VyRWRpdFN0YXR1cy5FRElUQUJMRSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJcmV0dXJuIGdldFBhcnNlQ29tbWFuZChhZGFwdGVyLCB2YWx1ZXMpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUNvbW1hbmQgZ2V0UGFyc2VDb21tYW5kKElBZGFwdGFibGUgYWRhcHRlciwKLQkJCU9iamVjdFtdIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldENvbXBsZXRpb25Qcm9jZXNzb3IoSUFkYXB0YWJsZSBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbW1hbmQgZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChFT2JqZWN0IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJU2V0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFNldFJlcXVlc3QoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWUpOwotCQlyZXR1cm4gbmV3IFNldFZhbHVlQ29tbWFuZChyZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRWYWxpZFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJRUNsYXNzaWZpZXIgdHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBFRGF0YVR5cGUpIHsKLQkJCUNsYXNzIGlDbGFzcyA9IHR5cGUuZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJaWYgKFN0cmluZy5jbGFzcy5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbGlkTmV3VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQlpZiAodHlwZSBpbnN0YW5jZW9mIEVEYXRhVHlwZSkgewotCQkJQ2xhc3MgaUNsYXNzID0gdHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7Ci0JCQlpZiAoQm9vbGVhbi5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBCb29sZWFuIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChDaGFyYWN0ZXIuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBuZXcgQ2hhcmFjdGVyKHMuY2hhckF0KDApKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkiVmFsdWUgb2YgdHlwZSBDaGFyYWN0ZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJ5dGUuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IEJ5dGUoKChOdW1iZXIpIHZhbHVlKS5ieXRlVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gQnl0ZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBCeXRlIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgQnl0ZSBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoU2hvcnQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBTaG9ydCgoKE51bWJlcikgdmFsdWUpLnNob3J0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gU2hvcnQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gU2hvcnQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBTaG9ydCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSW50ZWdlci5UWVBFLmVxdWFscyhpQ2xhc3MpKSB7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgewotCQkJCQkvLyBvawotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW50ZWdlcigoKE51bWJlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IEludGVnZXIudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gSW50ZWdlciB2YWx1ZSIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdmFsdWUgPSBuZXcgSW52YWxpZFZhbHVlKAotCQkJCQkJCSJWYWx1ZSBvZiB0eXBlIEludGVnZXIgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKExvbmcuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExvbmcpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IExvbmcoKChOdW1iZXIpIHZhbHVlKS5sb25nVmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gTG9uZy52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBMb25nIHZhbHVlIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgTG9uZyBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRmxvYXQuVFlQRS5lcXVhbHMoaUNsYXNzKSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0JCQkJCS8vIG9rCi0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewotCQkJCQl2YWx1ZSA9IG5ldyBGbG9hdCgoKE51bWJlcikgdmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOwotCQkJCQlpZiAocy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXZhbHVlID0gRmxvYXQudmFsdWVPZihzKTsKLQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoCi0JCQkJCQkJCQkiU3RyaW5nIHZhbHVlIGRvZXMgbm90IGNvbnZlcnQgdG8gRmxvYXQgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBGbG9hdCBpcyBleHBlY3RlZCIpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoRG91YmxlLlRZUEUuZXF1YWxzKGlDbGFzcykpIHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBEb3VibGUpIHsKLQkJCQkJLy8gb2sKLQkJCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7Ci0JCQkJCXZhbHVlID0gbmV3IERvdWJsZSgoKE51bWJlcikgdmFsdWUpLmRvdWJsZVZhbHVlKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJU3RyaW5nIHMgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQkJaWYgKHMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZSA9IERvdWJsZS52YWx1ZU9mKHMpOwotCQkJCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotCQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgKLQkJCQkJCQkJCSJTdHJpbmcgdmFsdWUgZG9lcyBub3QgY29udmVydCB0byBEb3VibGUgdmFsdWUiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVmFsdWUgb2YgdHlwZSBEb3VibGUgaXMgZXhwZWN0ZWQiKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBFRW51bSkgewotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlFRW51bUxpdGVyYWwgbGl0ZXJhbCA9ICgoRUVudW0pIHR5cGUpCi0JCQkJCQkJLmdldEVFbnVtTGl0ZXJhbEJ5TGl0ZXJhbCgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gbmV3IEludmFsaWRWYWx1ZSgiVW5rbm93biBsaXRlcmFsOiAiICsgdmFsdWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdmFsdWUgPSBsaXRlcmFsLmdldEluc3RhbmNlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQl2YWx1ZSA9IG5ldyBJbnZhbGlkVmFsdWUoIlZhbHVlIG9mIHR5cGUgU3RyaW5nIGlzIGV4cGVjdGVkIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEludmFsaWRWYWx1ZSB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkJcHVibGljIEludmFsaWRWYWx1ZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDQ0MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUNvbnRyaWJ1dGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMuYWN0aW9uLmNvbnRyaWJ1dGlvbml0ZW0uQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkudXRpbC5JV29ya2JlbmNoUGFydERlc2NyaXB0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnByaW50aW5nLmFjdGlvbnMuUHJpbnRQcmV2aWV3QWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5wcmludGluZy5yZW5kZXIuYWN0aW9ucy5FbmhhbmNlZFByaW50QWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJpbnRpbmcucmVuZGVyLmFjdGlvbnMuUmVuZGVyZWRQcmludFByZXZpZXdBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtQ29udHJpYnV0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQWJzdHJhY3RDb250cmlidXRpb25JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQWN0aW9uIGNyZWF0ZUFjdGlvbihTdHJpbmcgYWN0aW9uSWQsCi0JCQlJV29ya2JlbmNoUGFydERlc2NyaXB0b3IgcGFydERlc2NyaXB0b3IpIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscyhQcmludFByZXZpZXdBY3Rpb24uSUQpKSB7Ci0JCQlyZXR1cm4gbmV3IFJlbmRlcmVkUHJpbnRQcmV2aWV3QWN0aW9uKAotCQkJCQluZXcgRW5oYW5jZWRQcmludEFjdGlvbkhlbHBlcigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlQWN0aW9uKGFjdGlvbklkLCBwYXJ0RGVzY3JpcHRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwMmFmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWRpdFBhcnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBhcnRzLklHcmFwaGljYWxFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkFic3RyYWN0RWRpdFBhcnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LkNyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnNlcnZpY2VzLmVkaXRwYXJ0LklFZGl0UGFydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5EaWFncmFtRWRpdFBhcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEVkaXRQYXJ0UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWRpdFBhcnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFsbG93Q2FjaGluZzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkUGFydDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFdlYWtSZWZlcmVuY2UgY2FjaGVkVmlldzsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVkaXRQYXJ0UHJvdmlkZXIoKSB7Ci0JCXNldEZhY3RvcnkobmV3IERpYWdyYW1FZGl0UGFydEZhY3RvcnkoKSk7Ci0JCXNldEFsbG93Q2FjaGluZyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZpbmFsIEVkaXRQYXJ0RmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmFjdG9yeShFZGl0UGFydEZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0FsbG93Q2FjaGluZygpIHsKLQkJcmV0dXJuIGFsbG93Q2FjaGluZzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHNldEFsbG93Q2FjaGluZyhib29sZWFuIGFsbG93Q2FjaGluZykgewotCQl0aGlzLmFsbG93Q2FjaGluZyA9IGFsbG93Q2FjaGluZzsKLQkJaWYgKCFhbGxvd0NhY2hpbmcpIHsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBjcmVhdGVFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJRWRpdFBhcnQgcGFydCA9IGZhY3RvcnkuY3JlYXRlRWRpdFBhcnQobnVsbCwgdmlldyk7Ci0JCWlmIChwYXJ0IGluc3RhbmNlb2YgSUdyYXBoaWNhbEVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gKElHcmFwaGljYWxFZGl0UGFydCkgcGFydDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElHcmFwaGljYWxFZGl0UGFydCBnZXRDYWNoZWRQYXJ0KFZpZXcgdmlldykgewotCQlpZiAoY2FjaGVkVmlldyAhPSBudWxsICYmIGNhY2hlZFZpZXcuZ2V0KCkgPT0gdmlldykgewotCQkJcmV0dXJuIChJR3JhcGhpY2FsRWRpdFBhcnQpIGNhY2hlZFBhcnQuZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUdyYXBoaWNhbEVkaXRQYXJ0IGNyZWF0ZUdyYXBoaWNFZGl0UGFydChWaWV3IHZpZXcpIHsKLQkJaWYgKGlzQWxsb3dDYWNoaW5nKCkpIHsKLQkJCUlHcmFwaGljYWxFZGl0UGFydCBwYXJ0ID0gZ2V0Q2FjaGVkUGFydCh2aWV3KTsKLQkJCWNhY2hlZFBhcnQgPSBudWxsOwotCQkJY2FjaGVkVmlldyA9IG51bGw7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBhcnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZUVkaXRQYXJ0KHZpZXcpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIENyZWF0ZUdyYXBoaWNFZGl0UGFydE9wZXJhdGlvbikgewotCQkJVmlldyB2aWV3ID0gKChJRWRpdFBhcnRPcGVyYXRpb24pIG9wZXJhdGlvbikuZ2V0VmlldygpOwotCQkJaWYgKCFXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChpc0FsbG93Q2FjaGluZygpICYmIGdldENhY2hlZFBhcnQodmlldykgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJSUdyYXBoaWNhbEVkaXRQYXJ0IHBhcnQgPSBjcmVhdGVFZGl0UGFydCh2aWV3KTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpZiAoaXNBbGxvd0NhY2hpbmcoKSkgewotCQkJCQljYWNoZWRQYXJ0ID0gbmV3IFdlYWtSZWZlcmVuY2UocGFydCk7Ci0JCQkJCWNhY2hlZFZpZXcgPSBuZXcgV2Vha1JlZmVyZW5jZSh2aWV3KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtRWxlbWVudFR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjE5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUVsZW1lbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLkVsZW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLnR5cGUuY29yZS5JRWxlbWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50VHlwZXMgZXh0ZW5kcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpYWdyYW1FbGVtZW50VHlwZXMoKSB7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBlbGVtZW50czsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlpZiAoaW1hZ2VSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5ID0gbmV3IEltYWdlUmVnaXN0cnkoKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEltYWdlUmVnaXN0cnlLZXkoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldFByb3ZpZGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9ICgoRVN0cnVjdHVyYWxGZWF0dXJlKSBlbGVtZW50KTsKLQkJCUVDbGFzcyBlQ29udGFpbmluZ0NsYXNzID0gZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGZlYXR1cmUuZ2V0RVR5cGUoKTsKLQkJCWlmIChlQ29udGFpbmluZ0NsYXNzICE9IG51bGwgJiYgIWVDb250YWluaW5nQ2xhc3MuaXNBYnN0cmFjdCgpKSB7Ci0JCQkJZWxlbWVudCA9IGVDb250YWluaW5nQ2xhc3M7Ci0JCQl9IGVsc2UgaWYgKGVUeXBlIGluc3RhbmNlb2YgRUNsYXNzCi0JCQkJCSYmICEoKEVDbGFzcykgZVR5cGUpLmlzQWJzdHJhY3QoKSkgewotCQkJCWVsZW1lbnQgPSBlVHlwZTsKLQkJCX0KLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVsZW1lbnQ7Ci0JCQlpZiAoIWVDbGFzcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQlyZXR1cm4gV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbUltYWdlRGVzY3JpcHRvcigKLQkJCQkJCQkJZUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmNyZWF0ZShlQ2xhc3MpKTsKLQkJCX0KLQkJfQotCQkvLyBUT0RPIDogc3VwcG9ydCBzdHJ1Y3R1cmFsIGZlYXR1cmVzCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoRU5hbWVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBrZXkgPSBnZXRJbWFnZVJlZ2lzdHJ5S2V5KGVsZW1lbnQpOwotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3Ioa2V5KTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBnZXRQcm92aWRlZEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQl9Ci0JCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKEVOYW1lZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcga2V5ID0gZ2V0SW1hZ2VSZWdpc3RyeUtleShlbGVtZW50KTsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZ2V0UHJvdmlkZWRJbWFnZURlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoaW1hZ2VEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQkJfQotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXksIGltYWdlRGVzY3JpcHRvcik7Ci0JCQlpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlRGVzY3JpcHRvcihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShJQWRhcHRhYmxlIGhpbnQpIHsKLQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChoaW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGdldEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgJ3R5cGUnIG9mIHRoZSBlY29yZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaW50LgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVOYW1lZEVsZW1lbnQgZ2V0RWxlbWVudChJQWRhcHRhYmxlIGhpbnQpIHsKLQkJT2JqZWN0IHR5cGUgPSBoaW50LmdldEFkYXB0ZXIoSUVsZW1lbnRUeXBlLmNsYXNzKTsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOwotCi0JCQllbGVtZW50cy5wdXQoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSwKLQkJCQkJTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKCkpOwotCi0JCQllbGVtZW50cy5wdXQoV29ya1Byb2R1Y3ROb2RlXzEwMDEsIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0Tm9kZSgpKTsKLQotCQkJZWxlbWVudHMucHV0KExpbmtfMzAwMSwgTW9kZWxQYWNrYWdlLmVJTlNUQU5DRS5nZXRMaW5rKCkpOwotCQl9Ci0JCXJldHVybiAoRU5hbWVkRWxlbWVudCkgZWxlbWVudHMuZ2V0KHR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElFbGVtZW50VHlwZSBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtXzc5ID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgV29ya1Byb2R1Y3ROb2RlXzEwMDEgPSBnZXRFbGVtZW50VHlwZSgib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5Xb3JrUHJvZHVjdE5vZGVfMTAwMSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRWxlbWVudFR5cGUgTGlua18zMDAxID0gZ2V0RWxlbWVudFR5cGUoIm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuTGlua18zMDAxIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRWxlbWVudFR5cGUgZ2V0RWxlbWVudFR5cGUoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBFbGVtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0VHlwZShpZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIFNldCBLTk9XTl9FTEVNRU5UX1RZUEVTOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0tub3duRWxlbWVudFR5cGUoSUVsZW1lbnRUeXBlIGVsZW1lbnRUeXBlKSB7Ci0JCWlmIChLTk9XTl9FTEVNRU5UX1RZUEVTID09IG51bGwpIHsKLQkJCUtOT1dOX0VMRU1FTlRfVFlQRVMgPSBuZXcgSGFzaFNldCgpOwotCQkJS05PV05fRUxFTUVOVF9UWVBFUy5hZGQoV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbV83OSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChXb3JrUHJvZHVjdE5vZGVfMTAwMSk7Ci0JCQlLTk9XTl9FTEVNRU5UX1RZUEVTLmFkZChMaW5rXzMwMDEpOwotCQl9Ci0JCXJldHVybiBLTk9XTl9FTEVNRU5UX1RZUEVTLmNvbnRhaW5zKGVsZW1lbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtSWNvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Y2Y0MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbUljb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5pY29uLkdldEljb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLmljb24uSUljb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUljb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJSWNvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SWNvbihJQWRhcHRhYmxlIGhpbnQsIGludCBmbGFncykgewotCQlyZXR1cm4gRGlhZ3JhbUVsZW1lbnRUeXBlcy5nZXRJbWFnZShoaW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldEljb25PcGVyYXRpb24pIHsKLQkJCXJldHVybiAoKEdldEljb25PcGVyYXRpb24pIG9wZXJhdGlvbikuZXhlY3V0ZSh0aGlzKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbU1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlNDc3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuSUdyYXBoaWNhbEVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmVtZi50eXBlLmNvcmUuRWxlbWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkuc2VydmljZXMubW9kZWxpbmdhc3Npc3RhbnQuTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTW9kZWxpbmdBc3Npc3RhbnRQcm92aWRlciBleHRlbmRzIE1vZGVsaW5nQXNzaXN0YW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFR5cGVzRm9yUG9wdXBCYXIoSUFkYXB0YWJsZSBob3N0KSB7Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQpIHsKLQkJCUxpc3QgdHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl0eXBlcy5hZGQoRGlhZ3JhbUVsZW1lbnRUeXBlcy5Xb3JrUHJvZHVjdE5vZGVfMTAwMSk7Ci0JCQlyZXR1cm4gdHlwZXM7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2UoSUFkYXB0YWJsZSBzb3VyY2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25UYXJnZXQoSUFkYXB0YWJsZSB0YXJnZXQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlbFR5cGVzT25Tb3VyY2VBbmRUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJQWRhcHRhYmxlIHRhcmdldCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JTb3VyY2UoSUFkYXB0YWJsZSB0YXJnZXQsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0VHlwZXNGb3JUYXJnZXQoSUFkYXB0YWJsZSBzb3VyY2UsCi0JCQlJRWxlbWVudFR5cGUgcmVsYXRpb25zaGlwVHlwZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVPYmplY3Qgc2VsZWN0RXhpc3RpbmdFbGVtZW50Rm9yU291cmNlKElBZGFwdGFibGUgdGFyZ2V0LAotCQkJSUVsZW1lbnRUeXBlIHJlbGF0aW9uc2hpcFR5cGUpIHsKLQkJcmV0dXJuIHNlbGVjdEV4aXN0aW5nRWxlbWVudCh0YXJnZXQsIGdldFR5cGVzRm9yU291cmNlKHRhcmdldCwKLQkJCQlyZWxhdGlvbnNoaXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHNlbGVjdEV4aXN0aW5nRWxlbWVudEZvclRhcmdldChJQWRhcHRhYmxlIHNvdXJjZSwKLQkJCUlFbGVtZW50VHlwZSByZWxhdGlvbnNoaXBUeXBlKSB7Ci0JCXJldHVybiBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoc291cmNlLCBnZXRUeXBlc0ZvclRhcmdldChzb3VyY2UsCi0JCQkJcmVsYXRpb25zaGlwVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBzZWxlY3RFeGlzdGluZ0VsZW1lbnQoSUFkYXB0YWJsZSBob3N0LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCWlmICh0eXBlcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlHcmFwaGljYWxFZGl0UGFydCBlZGl0UGFydCA9IChJR3JhcGhpY2FsRWRpdFBhcnQpIGhvc3QKLQkJCQkuZ2V0QWRhcHRlcihJR3JhcGhpY2FsRWRpdFBhcnQuY2xhc3MpOwotCQlpZiAoZWRpdFBhcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGVkaXRQYXJ0LmdldFJvb3QoKS5nZXRDb250ZW50cygpLmdldE1vZGVsKCk7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlhZ3JhbS5nZXRFbGVtZW50KCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNBcHBsaWNhYmxlRWxlbWVudChlbGVtZW50LCB0eXBlcykpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdEVsZW1lbnQoKEVPYmplY3RbXSkgZWxlbWVudHMudG9BcnJheShuZXcgRU9iamVjdFtlbGVtZW50cwotCQkJCS5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYWJsZUVsZW1lbnQoRU9iamVjdCBlbGVtZW50LCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCUlFbGVtZW50VHlwZSB0eXBlID0gRWxlbWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVsZW1lbnRUeXBlKAotCQkJCWVsZW1lbnQpOwotCQlyZXR1cm4gdHlwZXMuY29udGFpbnModHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IHNlbGVjdEVsZW1lbnQoRU9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpOwotCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coCi0JCQkJc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0TWVzc2FnZSgiQXZhaWxhYmxlIGRvbWFpbiBtb2RlbCBlbGVtZW50czoiKTsKLQkJZGlhbG9nLnNldFRpdGxlKCJTZWxlY3QgZG9tYWluIG1vZGVsIGVsZW1lbnQiKTsKLQkJZGlhbG9nLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLQkJZGlhbG9nLnNldEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkJRU9iamVjdCBzZWxlY3RlZCA9IG51bGw7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJc2VsZWN0ZWQgPSAoRU9iamVjdCkgZGlhbG9nLmdldEZpcnN0UmVzdWx0KCk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1QYWxldHRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjNDRhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFsZXR0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYucGFsZXR0ZS5QYWxldHRlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLkFic3RyYWN0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuc2VydmljZS5JT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuc2VydmljZXMucGFsZXR0ZS5JUGFsZXR0ZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtUGFsZXR0ZUZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVBhbGV0dGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUGFsZXR0ZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9QYWxldHRlKElFZGl0b3JQYXJ0IGVkaXRvciwgT2JqZWN0IGNvbnRlbnQsCi0JCQlQYWxldHRlUm9vdCByb290LCBNYXAgcHJlZGVmaW5lZEVudHJpZXMpIHsKLQkJRGlhZ3JhbVBhbGV0dGVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGlhZ3JhbVBhbGV0dGVGYWN0b3J5KCk7Ci0JCWZhY3RvcnkuZmlsbFBhbGV0dGUocm9vdCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGlvbnMoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQpIHsKLQkJLy8gbm8gY29uZmlndXJhdGlvbgotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlcyhJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlyZXR1cm4gZmFsc2U7IC8vIGFsbCBsb2dpYyBpcyBkb25lIGluIHRoZSBzZXJ2aWNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVBhcnNlclByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0MzJjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtUGFyc2VyUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuQWJzdHJhY3RQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5zZXJ2aWNlLklPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5HZXRQYXJzZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi51aS5zZXJ2aWNlcy5wYXJzZXIuSVBhcnNlclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTW9kZWxQYWNrYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtUGFyc2VyUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVBhcnNlclByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgd29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSVBhcnNlciBnZXRXb3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdE5vZGVXb3JrUHJvZHVjdE5vZGVOYW1lXzQwMDFQYXJzZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyID0gY3JlYXRlV29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlV29ya1Byb2R1Y3ROb2RlV29ya1Byb2R1Y3ROb2RlTmFtZV80MDAxUGFyc2VyKCkgewotCQlEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgcGFyc2VyID0gbmV3IERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlcigKLQkJCQlNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkTm9kZV9OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElQYXJzZXIgbGlua0xpbmtOYW1lXzQwMDJQYXJzZXI7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJUGFyc2VyIGdldExpbmtMaW5rTmFtZV80MDAyUGFyc2VyKCkgewotCQlpZiAobGlua0xpbmtOYW1lXzQwMDJQYXJzZXIgPT0gbnVsbCkgewotCQkJbGlua0xpbmtOYW1lXzQwMDJQYXJzZXIgPSBjcmVhdGVMaW5rTGlua05hbWVfNDAwMlBhcnNlcigpOwotCQl9Ci0JCXJldHVybiBsaW5rTGlua05hbWVfNDAwMlBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXIgY3JlYXRlTGlua0xpbmtOYW1lXzQwMDJQYXJzZXIoKSB7Ci0JCURpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKAotCQkJCU1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGlua19OYW1lKCkpOwotCQlwYXJzZXIuc2V0Vmlld1BhdHRlcm4oInswfSIpOwotCQlwYXJzZXIuc2V0RWRpdFBhdHRlcm4oInswfSIpOwotCQlyZXR1cm4gcGFyc2VyOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhcnNlciBnZXRQYXJzZXIoaW50IHZpc3VhbElEKSB7Ci0JCXN3aXRjaCAodmlzdWFsSUQpIHsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0Tm9kZVdvcmtQcm9kdWN0Tm9kZU5hbWVfNDAwMVBhcnNlcigpOwotCQljYXNlIExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIGdldExpbmtMaW5rTmFtZV80MDAyUGFyc2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJUGFyc2VyIGdldFBhcnNlcihJQWRhcHRhYmxlIGhpbnQpIHsKLQkJU3RyaW5nIHZpZCA9IChTdHJpbmcpIGhpbnQuZ2V0QWRhcHRlcihTdHJpbmcuY2xhc3MpOwotCQlpZiAodmlkICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRQYXJzZXIoRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0VmlzdWFsSUQodmlkKSk7Ci0JCX0KLQkJVmlldyB2aWV3ID0gKFZpZXcpIGhpbnQuZ2V0QWRhcHRlcihWaWV3LmNsYXNzKTsKLQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFBhcnNlcihEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRWaXN1YWxJRCh2aWV3KSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCWlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBHZXRQYXJzZXJPcGVyYXRpb24pIHsKLQkJCUlBZGFwdGFibGUgaGludCA9ICgoR2V0UGFyc2VyT3BlcmF0aW9uKSBvcGVyYXRpb24pLmdldEhpbnQoKTsKLQkJCWlmIChEaWFncmFtRWxlbWVudFR5cGVzLmdldEVsZW1lbnQoaGludCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiBnZXRQYXJzZXIoaGludCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMWRjNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnNlcnZpY2UuSU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5HZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucHJvcGVydGllcy5JQ29tcG9zaXRlUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnByb3BlcnRpZXMuSVByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudWkucHJvcGVydGllcy5wcm92aWRlcnMuR2VuZXJpY0VNRlByb3BlcnRpZXNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBHZW5lcmljRU1GUHJvcGVydGllc1Byb3ZpZGVyCi0JCWltcGxlbWVudHMgSVByb3BlcnRpZXNQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXMoSU9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEdldFByb3BlcnR5U291cmNlT3BlcmF0aW9uKSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gKChHZXRQcm9wZXJ0eVNvdXJjZU9wZXJhdGlvbikgb3BlcmF0aW9uKQotCQkJCQkuZ2V0T2JqZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0U2VtYW50aWNFbGVtZW50KG9iamVjdCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJQ29tcG9zaXRlUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQob2JqZWN0KTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5U291cmNlKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRTZW1hbnRpY0VsZW1lbnQoT2JqZWN0IG9iamVjdCkgewotCQlWaWV3IHZpZXcgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVmlldykgewotCQkJdmlldyA9IChWaWV3KSBvYmplY3Q7Ci0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRpdFBhcnQpIHsKLQkJCUVkaXRQYXJ0IGVkaXRQYXJ0ID0gKEVkaXRQYXJ0KSBvYmplY3Q7Ci0JCQlpZiAoZWRpdFBhcnQuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCQl2aWV3ID0gKFZpZXcpIGVkaXRQYXJ0LmdldE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHZpZXcgIT0gbnVsbAotCQkJCSYmIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRAotCQkJCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKHZpZXcpKSkgewotCQkJcmV0dXJuIHZpZXcuZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzMjZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnByb3ZpZGVyczsKLQotaW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVQYXJzZXIgZXh0ZW5kcyBEaWFncmFtQWJzdHJhY3RQYXJzZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZUZvcm1hdCBERUZBVUxUX1BST0NFU1NPUiA9IG5ldyBNZXNzYWdlRm9ybWF0KAotCQkJInswfSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVN0cnVjdHVyYWxGZWF0dXJlUGFyc2VyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXNzYWdlRm9ybWF0IGdldFZpZXdQcm9jZXNzb3IoKSB7Ci0JCU1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Vmlld1Byb2Nlc3NvcigpOwotCQlyZXR1cm4gcHJvY2Vzc29yID09IG51bGwgPyBERUZBVUxUX1BST0NFU1NPUiA6IHByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VGb3JtYXQgZ2V0RWRpdFByb2Nlc3NvcigpIHsKLQkJTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IgPSBzdXBlci5nZXRFZGl0UHJvY2Vzc29yKCk7Ci0JCXJldHVybiBwcm9jZXNzb3IgPT0gbnVsbCA/IERFRkFVTFRfUFJPQ0VTU09SIDogcHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXREb21haW5FbGVtZW50KEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oSUFkYXB0YWJsZSBhZGFwdGVyLCBpbnQgZmxhZ3MsCi0JCQlTdHJpbmcgcGF0dGVybiwgTWVzc2FnZUZvcm1hdCBwcm9jZXNzb3IpIHsKLQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGFkYXB0ZXIuZ2V0QWRhcHRlcihFT2JqZWN0LmNsYXNzKTsKLQkJZWxlbWVudCA9IGdldERvbWFpbkVsZW1lbnQoZWxlbWVudCk7Ci0JCXJldHVybiBnZXRTdHJpbmdCeVBhdHRlcm4oZWxlbWVudCwgZmVhdHVyZSwgcHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdCeVBhdHRlcm4oRU9iamVjdCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCXZhbHVlID0gZ2V0VmFsaWRWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBwcm9jZXNzb3IuZm9ybWF0KG5ldyBPYmplY3RbXSB7IHZhbHVlIH0sIG5ldyBTdHJpbmdCdWZmZXIoKSwKLQkJCQluZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCU9iamVjdCB2YWx1ZSA9IHZhbHVlcy5sZW5ndGggPT0gMSA/IHZhbHVlc1swXSA6IG51bGw7Ci0JCXZhbHVlID0gZ2V0VmFsaWROZXdWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludmFsaWRWYWx1ZSkgewotCQkJcmV0dXJuIG5ldyBQYXJzZXJFZGl0U3RhdHVzKFdQRERpYWdyYW1FZGl0b3JQbHVnaW4uSUQsCi0JCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQllbGVtZW50ID0gZ2V0RG9tYWluRWxlbWVudChlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiA9IFRyYW5zYWN0aW9uVXRpbAotCQkJCS5nZXRFZGl0aW5nRG9tYWluKGVsZW1lbnQpOwotCQlpZiAoZWRpdGluZ0RvbWFpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlPYmplY3QgdmFsdWUgPSB2YWx1ZXMubGVuZ3RoID09IDEgPyB2YWx1ZXNbMF0gOiBudWxsOwotCQlJQ29tbWFuZCBjb21tYW5kID0gZ2V0TW9kaWZpY2F0aW9uQ29tbWFuZChlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgY29tbWFuZAotCQkJCS5nZXRMYWJlbCgpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbW1hbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RpbmdFdmVudChPYmplY3QgZXZlbnQsIGludCBmbGFncykgewotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBOb3RpZmljYXRpb24pIHsKLQkJCXJldHVybiBpc0FmZmVjdGluZ0ZlYXR1cmUoKChOb3RpZmljYXRpb24pIGV2ZW50KS5nZXRGZWF0dXJlKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBZmZlY3RpbmdGZWF0dXJlKE9iamVjdCBldmVudEZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gZXZlbnRGZWF0dXJlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3N2Y4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBqYXZhLnRleHQuRmllbGRQb3NpdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLmNvcmUuY29tbWFuZC5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuY29tbW9uLnVpLnNlcnZpY2VzLnBhcnNlci5JUGFyc2VyRWRpdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLlBhcnNlckVkaXRTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZW1mLmNvbW1hbmRzLmNvcmUuY29tbWFuZC5Db21wb3NpdGVUcmFuc2FjdGlvbmFsQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtU3RydWN0dXJhbEZlYXR1cmVzUGFyc2VyIGV4dGVuZHMgRGlhZ3JhbUFic3RyYWN0UGFyc2VyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZmVhdHVyZXM7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1TdHJ1Y3R1cmFsRmVhdHVyZXNQYXJzZXIoTGlzdCBmZWF0dXJlcykgewotCQl0aGlzLmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nQnlQYXR0ZXJuKElBZGFwdGFibGUgYWRhcHRlciwgaW50IGZsYWdzLAotCQkJU3RyaW5nIHBhdHRlcm4sIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc29yKSB7Ci0JCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBhZGFwdGVyLmdldEFkYXB0ZXIoRU9iamVjdC5jbGFzcyk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdChmZWF0dXJlcy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQl2YWx1ZSA9IGdldFZhbGlkVmFsdWUoZmVhdHVyZSwgdmFsdWUpOwotCQkJdmFsdWVzLmFkZCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3Nvci5mb3JtYXQodmFsdWVzLnRvQXJyYXkobmV3IE9iamVjdFt2YWx1ZXMuc2l6ZSgpXSksCi0JCQkJbmV3IFN0cmluZ0J1ZmZlcigpLCBuZXcgRmllbGRQb3NpdGlvbigwKSkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIElQYXJzZXJFZGl0U3RhdHVzIHZhbGlkYXRlVmFsdWVzKE9iamVjdFtdIHZhbHVlcykgewotCQlpZiAodmFsdWVzLmxlbmd0aCAhPSBmZWF0dXJlcy5zaXplKCkpIHsKLQkJCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEVfU1RBVFVTOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBnZXRWYWxpZE5ld1ZhbHVlKChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCS5nZXQoaSksIHZhbHVlc1tpXSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnZhbGlkVmFsdWUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhcnNlckVkaXRTdGF0dXMoV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5JRCwKLQkJCQkJCUlQYXJzZXJFZGl0U3RhdHVzLlVORURJVEFCTEUsIHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQYXJzZXJFZGl0U3RhdHVzLkVESVRBQkxFX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIElDb21tYW5kIGdldFBhcnNlQ29tbWFuZChJQWRhcHRhYmxlIGFkYXB0ZXIsIE9iamVjdFtdIHZhbHVlcykgewotCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgYWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gVHJhbnNhY3Rpb25VdGlsCi0JCQkJLmdldEVkaXRpbmdEb21haW4oZWxlbWVudCk7Ci0JCWlmIChlZGl0aW5nRG9tYWluID09IG51bGwpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCUNvbXBvc2l0ZVRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQ29tcG9zaXRlVHJhbnNhY3Rpb25hbENvbW1hbmQoCi0JCQkJZWRpdGluZ0RvbWFpbiwgIlNldCBWYWx1ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQljb21tYW5kCi0JCQkJCS5jb21wb3NlKGdldE1vZGlmaWNhdGlvbkNvbW1hbmQoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWZmZWN0aW5nRXZlbnQoT2JqZWN0IGV2ZW50LCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTm90aWZpY2F0aW9uKSB7Ci0JCQlPYmplY3QgZmVhdHVyZSA9ICgoTm90aWZpY2F0aW9uKSBldmVudCkuZ2V0RmVhdHVyZSgpOwotCQkJaWYgKGZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvcHJvdmlkZXJzL0RpYWdyYW1WaWV3UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxM2RkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9EaWFncmFtVmlld1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcm92aWRlcnMuQWJzdHJhY3RWaWV3UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYudHlwZS5jb3JlLklFbGVtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzLkxpbmtOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5MaW5rVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3Rvcmllcy5Xb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVmlld1Byb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWaWV3UHJvdmlkZXIgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDbGFzcyBnZXREaWFncmFtVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJU3RyaW5nIGRpYWdyYW1LaW5kKSB7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQuZXF1YWxzKGRpYWdyYW1LaW5kKQotCQkJCSYmIERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldERpYWdyYW1WaXN1YWxJRChzZW1hbnRpY0VsZW1lbnQpICE9IC0xKSB7Ci0JCQlyZXR1cm4gV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0Tm9kZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlpZiAoY29udGFpbmVyVmlldyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIURpYWdyYW1FbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCUVPYmplY3Qgc2VtYW50aWNFbGVtZW50ID0gZ2V0U2VtYW50aWNFbGVtZW50KHNlbWFudGljQWRhcHRlcik7Ci0JCWludCBub2RlVklEID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkuZ2V0Tm9kZVZpc3VhbElEKGNvbnRhaW5lclZpZXcsCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUsIHNlbWFudGljSGludCk7Ci0JCXN3aXRjaCAobm9kZVZJRCkgewotCQljYXNlIFdvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBXb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIFdvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeS5jbGFzczsKLQkJY2FzZSBMaW5rTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRDoKLQkJCXJldHVybiBMaW5rTmFtZVZpZXdGYWN0b3J5LmNsYXNzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3MgZ2V0RWRnZVZpZXdDbGFzcyhJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVZpZXcgY29udGFpbmVyVmlldywgU3RyaW5nIHNlbWFudGljSGludCkgewotCQlJRWxlbWVudFR5cGUgZWxlbWVudFR5cGUgPSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChlbGVtZW50VHlwZSAhPSBudWxsCi0JCQkJJiYgIURpYWdyYW1FbGVtZW50VHlwZXMuaXNLbm93bkVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRUNsYXNzIHNlbWFudGljVHlwZSA9IGdldFNlbWFudGljRUNsYXNzKHNlbWFudGljQWRhcHRlcik7Ci0JCWlmIChzZW1hbnRpY1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRU9iamVjdCBzZW1hbnRpY0VsZW1lbnQgPSBnZXRTZW1hbnRpY0VsZW1lbnQoc2VtYW50aWNBZGFwdGVyKTsKLQkJaW50IGxpbmtWSUQgPSBEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRMaW5rV2l0aENsYXNzVmlzdWFsSUQoCi0JCQkJc2VtYW50aWNFbGVtZW50LCBzZW1hbnRpY1R5cGUpOwotCQlzd2l0Y2ggKGxpbmtWSUQpIHsKLQkJY2FzZSBMaW5rRWRpdFBhcnQuVklTVUFMX0lEOgotCQkJcmV0dXJuIExpbmtWaWV3RmFjdG9yeS5jbGFzczsKLQkJfQotCQlyZXR1cm4gZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKHNlbWFudGljQWRhcHRlciwKLQkJCQljb250YWluZXJWaWV3LCBzZW1hbnRpY0hpbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIElFbGVtZW50VHlwZSBnZXRTZW1hbnRpY0VsZW1lbnRUeXBlKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyKSB7Ci0JCWlmIChzZW1hbnRpY0FkYXB0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRWxlbWVudFR5cGUpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKElFbGVtZW50VHlwZS5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ2xhc3MgZ2V0VW5yZWNvZ25pemVkQ29ubmVjdG9yVmlld0NsYXNzKElBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLAotCQkJVmlldyBjb250YWluZXJWaWV3LCBTdHJpbmcgc2VtYW50aWNIaW50KSB7Ci0JCS8vIEhhbmRsZSB1bnJlY29nbml6ZWQgY2hpbGQgbm9kZSBjbGFzc2VzIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3Byb3ZpZGVycy9FbGVtZW50SW5pdGlhbGl6ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMWRmNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9wcm92aWRlcnMvRWxlbWVudEluaXRpYWxpemVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuV1BERGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW5pdGlhbGl6ZXJzIHsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvc2hlZXQvRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9zaGVldC9EaWFncmFtU2hlZXRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWU0MDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC9zaGVldC9EaWFncmFtU2hlZXRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnNoZWV0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlciBleHRlbmRzIERlY29yYXRpbmdMYWJlbFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVNoZWV0TGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIobmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcihXUEREaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0SXRlbVByb3ZpZGVyc0FkYXB0ZXJGYWN0b3J5KCkpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdCBzZWxlY3RlZCA9IHVud3JhcChlbGVtZW50KTsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoc2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKHVud3JhcChlbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgT2JqZWN0IHVud3JhcChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gdW53cmFwKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGVsZW1lbnQpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVkaXRQYXJ0KSB7Ci0JCQlyZXR1cm4gdW53cmFwRWRpdFBhcnQoKEVkaXRQYXJ0KSBlbGVtZW50KTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpIHsKLQkJCVZpZXcgdmlldyA9IChWaWV3KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoVmlldy5jbGFzcyk7Ci0JCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHVud3JhcFZpZXcodmlldyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgT2JqZWN0IHVud3JhcEVkaXRQYXJ0KEVkaXRQYXJ0IHApIHsKLQkJaWYgKHAuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFZpZXcpIHsKLQkJCXJldHVybiB1bndyYXBWaWV3KChWaWV3KSBwLmdldE1vZGVsKCkpOwotCQl9Ci0JCXJldHVybiBwLmdldE1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgT2JqZWN0IHVud3JhcFZpZXcoVmlldyB2aWV3KSB7Ci0JCXJldHVybiB2aWV3LmdldEVsZW1lbnQoKSA9PSBudWxsID8gdmlldyA6IHZpZXcuZ2V0RWxlbWVudCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rTmFtZVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4ZDZmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL0xpbmtOYW1lVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5BYnN0cmFjdExhYmVsVmlld0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudXRpbC5NZWFzdXJlbWVudFVuaXRIZWxwZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kcmF3MmQudWkubWFwbW9kZS5JTWFwTW9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxvY2F0aW9uOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtOYW1lVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdExhYmVsVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWaWV3IGNyZWF0ZVZpZXcoSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFZpZXcgY29udGFpbmVyVmlldywKLQkJCVN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0JCU5vZGUgdmlldyA9IChOb2RlKSBzdXBlci5jcmVhdGVWaWV3KHNlbWFudGljQWRhcHRlciwgY29udGFpbmVyVmlldywKLQkJCQlzZW1hbnRpY0hpbnQsIGluZGV4LCBwZXJzaXN0ZWQsIHByZWZlcmVuY2VzSGludCk7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSB2aWV3LmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJSU1hcE1vZGUgbWFwTW9kZSA9IE1lYXN1cmVtZW50VW5pdEhlbHBlci5nZXRNYXBNb2RlKGNvbnRhaW5lclZpZXcKLQkJCQkuZ2V0RGlhZ3JhbSgpLmdldE1lYXN1cmVtZW50VW5pdCgpKTsKLQkJbG9jYXRpb24uc2V0WChtYXBNb2RlLkRQdG9MUCgwKSk7Ci0JCWxvY2F0aW9uLnNldFkobWFwTW9kZS5EUHRvTFAoNDApKTsKLQkJcmV0dXJuIHZpZXc7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvTGlua1ZpZXdGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODFhYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9MaW5rVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZS5BYnN0cmFjdEVNRk9wZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5EaWFncmFtVmlzdWFsSURSZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLnV0aWwuU3RyaW5nU3RhdGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24uY29yZS51dGlsLlRyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlc0hpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnV0aWwuVmlld1V0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSURlYnVnT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLmludGVybmFsLkRpYWdyYW1VSVN0YXR1c0NvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQ29ubmVjdGlvblZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5FZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpbmtWaWV3RmFjdG9yeSBleHRlbmRzIENvbm5lY3Rpb25WaWV3RmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0Jc3RhdGljIHsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX1VOUFJPVEVDVEVELCBCb29sZWFuLlRSVUUpOwotCQlvcHRpb25zLnB1dChUcmFuc2FjdGlvbi5PUFRJT05fTk9fTk9USUZJQ0FUSU9OUywgQm9vbGVhbi5UUlVFKTsKLQkJb3B0aW9ucy5wdXQoVHJhbnNhY3Rpb24uT1BUSU9OX05PX1RSSUdHRVJTLCBCb29sZWFuLlRSVUUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvdXRpbmdTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZvbnRTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCk7Ci0JCQl2aWV3LnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQkJfQotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JCWlmICghV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lECi0JCQkJLmVxdWFscyhEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRNb2RlbElEKGNvbnRhaW5lclZpZXcpKSkgewotCQkJRUFubm90YXRpb24gc2hvcnRjdXRBbm5vdGF0aW9uID0gRWNvcmVGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlRUFubm90YXRpb24oKTsKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5zZXRTb3VyY2UoIlNob3J0Y3V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXNob3J0Y3V0QW5ub3RhdGlvbi5nZXREZXRhaWxzKCkucHV0KAotCQkJCQkibW9kZWxJRCIsIFdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1FZGl0UGFydC5NT0RFTF9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJCXZpZXcuZ2V0RUFubm90YXRpb25zKCkuYWRkKHNob3J0Y3V0QW5ub3RhdGlvbik7Ci0JCX0KLQkJZ2V0Vmlld1NlcnZpY2UoKS5jcmVhdGVOb2RlKHNlbWFudGljQWRhcHRlciwgdmlldywKLQkJCQlEaWFncmFtVmlzdWFsSURSZWdpc3RyeS5nZXRUeXBlKExpbmtOYW1lRWRpdFBhcnQuVklTVUFMX0lEKSwKLQkJCQlWaWV3VXRpbC5BUFBFTkQsIHRydWUsIGdldFByZWZlcmVuY2VzSGludCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS52aWV3LmZhY3Rvcmllcy5WaWV3RmFjdG9yeSNjcmVhdGVWaWV3KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlLCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3LCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcpCi0JICogCi0JICogT3ZlcnJpZGUgY3JlYXRlVmlldyBzaW5jZSB0aGVyZSBpcyBhIGJ1ZyBpbiAKLQkgKiBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnZpZXcuZmFjdG9yaWVzLkNvbm5lY3Rpb25WaWV3RmFjdG9yeS5qYXZhCi0JICovCi0JcHVibGljIFZpZXcgY3JlYXRlVmlldyhmaW5hbCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCWZpbmFsIFZpZXcgY29udGFpbmVyVmlldywgZmluYWwgU3RyaW5nIHNlbWFudGljSGludCwKLQkJCWZpbmFsIGludCBpbmRleCwgZmluYWwgYm9vbGVhbiBwZXJzaXN0ZWQsCi0JCQlmaW5hbCBQcmVmZXJlbmNlc0hpbnQgcHJlZmVyZW5jZXNIaW50KSB7Ci0KLQkJc2V0UHJlZmVyZW5jZXNIaW50KHByZWZlcmVuY2VzSGludCk7Ci0KLQkJZmluYWwgRWRnZSBlZGdlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFZGdlKCk7Ci0JCUxpc3Qgc3R5bGVzID0gY3JlYXRlU3R5bGVzKGVkZ2UpOwotCQlpZiAoc3R5bGVzLnNpemUoKSA+IDApIHsKLQkJCWVkZ2UuZ2V0U3R5bGVzKCkuYWRkQWxsKHN0eWxlcyk7Ci0JCX0KLQotCQlCZW5kcG9pbnRzIGJlbmRQb2ludHMgPSBjcmVhdGVCZW5kcG9pbnRzKCk7Ci0JCWlmIChiZW5kUG9pbnRzICE9IG51bGwpIHsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kUG9pbnRzKTsKLQkJfQotCi0JCUVPYmplY3Qgc2VtYW50aWNFbCA9IHNlbWFudGljQWRhcHRlciA9PSBudWxsID8gbnVsbAotCQkJCTogKEVPYmplY3QpIHNlbWFudGljQWRhcHRlci5nZXRBZGFwdGVyKEVPYmplY3QuY2xhc3MpOwotCQlpZiAoc2VtYW50aWNFbCA9PSBudWxsKQotCQkJLy8gZW5mb3JjZSBhIHNldCB0byBOVUxMCi0JCQllZGdlLnNldEVsZW1lbnQobnVsbCk7Ci0JCWVsc2UgaWYgKHJlcXVpcmVzRWxlbWVudChzZW1hbnRpY0FkYXB0ZXIsIGNvbnRhaW5lclZpZXcpKSB7Ci0JCQllZGdlLnNldEVsZW1lbnQoc2VtYW50aWNFbCk7Ci0JCX0KLQotCQllZGdlLnNldFR5cGUoc2VtYW50aWNIaW50KTsKLQotCQkvLyBkZWNvcmF0ZSB2aWV3IGFzc3VtZXMgdGhlIHZpZXcgaGFkIGJlZW4gaW5zZXJ0ZWQgYWxyZWFkeSwgc28gCi0JCS8vIHdlIGhhZCB0byBjYWxsIGluc2VydCBjaGlsZCBiZWZvcmUgY2FsbGluZyBkZWNvcmF0ZSB2aWV3Ci0JCVZpZXdVdGlsLmluc2VydENoaWxkVmlldyhjb250YWluZXJWaWV3LCBlZGdlLCBpbmRleCwgcGVyc2lzdGVkKTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4gPSBnZXRFZGl0aW5nRG9tYWluKHNlbWFudGljRWwsCi0JCQkJY29udGFpbmVyVmlldyk7Ci0KLQkJaWYgKGRvbWFpbiAhPSBudWxsKSB7Ci0JCQlpZiAoaXNVblByb3RlY3RlZFNpbGVudFRyYW5zYWN0aW9uSW5Qcm9ncmVzcyhkb21haW4pKSB7Ci0JCQkJLy8gZGVjb3JhdGUgdmlldyBoYWQgdG8gcnVuIGFzIGEgc2lsZW50IG9wZXJhdGlvbiBvdGhlciB3aXNlCi0JCQkJLy8gaXQgd2lsbCBnZW5lcmF0ZSB0b28gbWFueSBldmVudHMKLQkJCQlkZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgZWRnZSwgc2VtYW50aWNBZGFwdGVyLAotCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJQWJzdHJhY3RFTUZPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEFic3RyYWN0RU1GT3BlcmF0aW9uKAotCQkJCQkJZG9tYWluLCBTdHJpbmdTdGF0aWNzLkJMQU5LLCBvcHRpb25zKSB7Ci0KLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgZG9FeGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJCQkJCQlJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkJCQkJZGVjb3JhdGVWaWV3KGNvbnRhaW5lclZpZXcsIGVkZ2UsIHNlbWFudGljQWRhcHRlciwKLQkJCQkJCQkJc2VtYW50aWNIaW50LCBpbmRleCwgdHJ1ZSk7Ci0KLQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24uZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlUcmFjZS5jYXRjaGluZyhEaWFncmFtVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKSwKLQkJCQkJCQlEaWFncmFtVUlEZWJ1Z09wdGlvbnMuRVhDRVBUSU9OU19DQVRDSElORywKLQkJCQkJCQlnZXRDbGFzcygpLCAiY3JlYXRlVmlldyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUxvZy53YXJuaW5nKERpYWdyYW1VSVBsdWdpbi5nZXRJbnN0YW5jZSgpLAotCQkJCQkJCURpYWdyYW1VSVN0YXR1c0NvZGVzLklHTk9SRURfRVhDRVBUSU9OX1dBUk5JTkcsCi0JCQkJCQkJImNyZWF0ZVZpZXciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlZGdlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW1WaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTI1OGE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnZpZXcuZmFjdG9yaWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS52aWV3LmZhY3Rvcmllcy5EaWFncmFtVmlld0ZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5NZWFzdXJlbWVudFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbVZpZXdGYWN0b3J5IGV4dGVuZHMgRGlhZ3JhbVZpZXdGYWN0b3J5IHsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgCi0JICovCi0JcHJvdGVjdGVkIExpc3QgY3JlYXRlU3R5bGVzKFZpZXcgdmlldykgewotCQlMaXN0IHN0eWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhZ2VTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlU3R5bGUoKSk7Ci0JCXN0eWxlcy5hZGQoTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvblN0eWxlKCkpOwotCQlyZXR1cm4gc3R5bGVzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWNvcmF0ZVZpZXcoVmlldyB2aWV3LCBJQWRhcHRhYmxlIHNlbWFudGljQWRhcHRlciwKLQkJCVN0cmluZyBkaWFncmFtS2luZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcodmlldywgc2VtYW50aWNBZGFwdGVyLCBkaWFncmFtS2luZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZWFzdXJlbWVudFVuaXQgZ2V0TWVhc3VyZW1lbnRVbml0KCkgewotCQlyZXR1cm4gTWVhc3VyZW1lbnRVbml0LlBJWEVMX0xJVEVSQUw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVOYW1lVmlld0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiOWZlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS93cGRkL3ZpZXcvZmFjdG9yaWVzL1dvcmtQcm9kdWN0Tm9kZU5hbWVWaWV3RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC52aWV3LmZhY3RvcmllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQmFzaWNOb2RlVmlld0ZhY3Rvcnk7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlTmFtZVZpZXdGYWN0b3J5IGV4dGVuZHMgQmFzaWNOb2RlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlY29yYXRlVmlldyhWaWV3IGNvbnRhaW5lclZpZXcsIFZpZXcgdmlldywKLQkJCUlBZGFwdGFibGUgc2VtYW50aWNBZGFwdGVyLCBTdHJpbmcgc2VtYW50aWNIaW50LCBpbnQgaW5kZXgsCi0JCQlib29sZWFuIHBlcnNpc3RlZCkgewotCQlzdXBlci5kZWNvcmF0ZVZpZXcoY29udGFpbmVyVmlldywgdmlldywgc2VtYW50aWNBZGFwdGVyLCBzZW1hbnRpY0hpbnQsCi0JCQkJaW5kZXgsIHBlcnNpc3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZVN0eWxlcyhWaWV3IHZpZXcpIHsKLQkJTGlzdCBzdHlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBzdHlsZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vd3BkZC92aWV3L2ZhY3Rvcmllcy9Xb3JrUHJvZHVjdE5vZGVWaWV3RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU3OTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3dwZGQvdmlldy9mYWN0b3JpZXMvV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQudmlldy5mYWN0b3JpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLnBhcnQuRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUudXRpbC5WaWV3VXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkudmlldy5mYWN0b3JpZXMuQWJzdHJhY3RTaGFwZVZpZXdGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3ROb2RlVmlld0ZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNoYXBlVmlld0ZhY3RvcnkgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCAKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVTdHlsZXMoVmlldyB2aWV3KSB7Ci0JCUxpc3Qgc3R5bGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRm9udFN0eWxlKCkpOwotCQlzdHlsZXMuYWRkKE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRpb25TdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZpbGxTdHlsZSgpKTsKLQkJc3R5bGVzLmFkZChOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpbmVTdHlsZSgpKTsKLQkJcmV0dXJuIHN0eWxlczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVjb3JhdGVWaWV3KFZpZXcgY29udGFpbmVyVmlldywgVmlldyB2aWV3LAotCQkJSUFkYXB0YWJsZSBzZW1hbnRpY0FkYXB0ZXIsIFN0cmluZyBzZW1hbnRpY0hpbnQsIGludCBpbmRleCwKLQkJCWJvb2xlYW4gcGVyc2lzdGVkKSB7Ci0JCWlmIChzZW1hbnRpY0hpbnQgPT0gbnVsbCkgewotCQkJc2VtYW50aWNIaW50ID0gRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJLmdldFR5cGUoV29ya1Byb2R1Y3ROb2RlRWRpdFBhcnQuVklTVUFMX0lEKTsKLQkJCXZpZXcuc2V0VHlwZShzZW1hbnRpY0hpbnQpOwotCQl9Ci0JCXN1cGVyLmRlY29yYXRlVmlldyhjb250YWluZXJWaWV3LCB2aWV3LCBzZW1hbnRpY0FkYXB0ZXIsIHNlbWFudGljSGludCwKLQkJCQlpbmRleCwgcGVyc2lzdGVkKTsKLQkJaWYgKCFXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtRWRpdFBhcnQuTU9ERUxfSUQKLQkJCQkuZXF1YWxzKERpYWdyYW1WaXN1YWxJRFJlZ2lzdHJ5LmdldE1vZGVsSUQoY29udGFpbmVyVmlldykpKSB7Ci0JCQlFQW5ub3RhdGlvbiBzaG9ydGN1dEFubm90YXRpb24gPSBFY29yZUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVFQW5ub3RhdGlvbigpOwotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLnNldFNvdXJjZSgiU2hvcnRjdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJc2hvcnRjdXRBbm5vdGF0aW9uLmdldERldGFpbHMoKS5wdXQoCi0JCQkJCSJtb2RlbElEIiwgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbUVkaXRQYXJ0Lk1PREVMX0lEKTsgLy8kTk9OLU5MUy0xJAotCQkJdmlldy5nZXRFQW5ub3RhdGlvbnMoKS5hZGQoc2hvcnRjdXRBbm5vdGF0aW9uKTsKLQkJfQotCQlnZXRWaWV3U2VydmljZSgpLmNyZWF0ZU5vZGUoCi0JCQkJc2VtYW50aWNBZGFwdGVyLAotCQkJCXZpZXcsCi0JCQkJRGlhZ3JhbVZpc3VhbElEUmVnaXN0cnkKLQkJCQkJCS5nZXRUeXBlKFdvcmtQcm9kdWN0Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLAotCQkJCVZpZXdVdGlsLkFQUEVORCwgdHJ1ZSwgZ2V0UHJlZmVyZW5jZXNIaW50KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWMzZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5kb2M8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmZDRkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlZmVhdHVyZVBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5kb2M7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTkwODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LmluaSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRmNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLXdlbGNvbWVQYWdlPSRubCQvd2VsY29tZS54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTJiNjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuMi4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2NlNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBEb2N1bWVudGF0aW9uCi0KLWZlYXR1cmVUZXh0PUVQRiBEb2N1bWVudGF0aW9uXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9hcHBsaWNhdGlvbl8zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2FwcGxpY2F0aW9uXzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMjlmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgbmwvCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzOTQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIC0gZG9rdW1lbnRhdGlvbgotCi1mZWF0dXJlVGV4dD1FUEYtZG9rdW1lbnRhdGlvblxuXAotXG5cCi1WZXJzaW9uOiB7MX0gXG5cCi1CeWdnZWV0aWtldDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFjNGMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgLSBEb2t1bWVudGF0aW9uCi0KLWZlYXR1cmVUZXh0PUVQRiAtIERva3VtZW50YXRpb25cblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotQnVpbGQtS2VubnVuZzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZXMvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZXMvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0ZWExOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RG9jdW1lbnRhY2lcdTAwZjNuIGRlIEVQRgotCi1mZWF0dXJlVGV4dD1Eb2N1bWVudGFjaVx1MDBmM24gZGUgRVBGXG5cCi1cblwKLVZlcnNpXHUwMGYzbjogezF9IFxuXAotRXRpcXVldGEgZGUgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDAsIDIwMDcuICBSZXNlcnZhZG9zIHRvZG9zIGxvcyBkZXJlY2hvcy5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZnIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvZnIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhYzZmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2ZyL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RG9jdW1lbnRhdGlvbiBFUEYKLQotZmVhdHVyZVRleHQ9RG9jdW1lbnRhdGlvbiBFRkZcblwKLVxuXAotVmVyc2lvbjogezF9IFxuXAotTGliZWxsXHUwMGU5IGRlIHZlcnNpb24gOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRhY2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvaXQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1Eb2N1bWVudGF6aW9uZSBFUEYKLQotZmVhdHVyZVRleHQ9RG9jdW1lbnRhemlvbmUgRVBGXG5cCi1cblwKLVZlcnNpb25lOiB7MX0gXG5cCi1FdGljaGV0dGEgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IGNvbnRyaWJ1dG9yIEVjbGlwc2UgZSBhbHRyaSAyMDAwLCAyMDA3LiAgVHV0dGkgaSBkaXJpdHRpIHJpc2VydmF0aS5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvamEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvamEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiM2JmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2phL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIERvY3VtZW50YXRpb24KLQotZmVhdHVyZVRleHQ9RVBGIFx1OGNjN1x1NjU5OVxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IHsxfSBcblwKLVx1MzBkM1x1MzBlYlx1MzBjOVx1MzBmYlx1MzBlOVx1MzBkOVx1MzBlYjogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2Mvbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2Mvbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZlMGFlNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFx1YmIzOFx1YzExYwotCi1mZWF0dXJlVGV4dD1FUEYgXHViYjM4XHVjMTFjXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogezF9IFxuXAotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3N2Y3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBkbyBFUEYKLQotZmVhdHVyZVRleHQ9RG9jdW1lbnRhXHUwMGU3XHUwMGUzbyBkbyBFUEZcblwKLVxuXAotVmVyc1x1MDBlM286IHsxfSBcblwKLUNvbnN0cnVcdTAwZTdcdTAwZTNvOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidWlkb3JlcyBFY2xpcHNlIGUgb3V0cm9zIDIwMDAsIDIwMDcuIFRvZG9zIG9zIERpcmVpdG9zIFJlc2VydmFkb3MuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3J1L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzc4NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPVx1MDQxNFx1MDQzZVx1MDQzYVx1MDQ0M1x1MDQzY1x1MDQzNVx1MDQzZFx1MDQ0Mlx1MDQzMFx1MDQ0Nlx1MDQzOFx1MDQ0ZiBFUEYKLQotZmVhdHVyZVRleHQ9XHUwNDE0XHUwNDNlXHUwNDNhXHUwNDQzXHUwNDNjXHUwNDM1XHUwNDNkXHUwNDQyXHUwNDMwXHUwNDQ2XHUwNDM4XHUwNDRmIEVQRlxuXAotXG5cCi1cdTA0MTJcdTA0MzVcdTA0NDBcdTA0NDFcdTA0MzhcdTA0NGY6IHsxfSBcblwKLVx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzMDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgXHUwNDEyXHUwNDQxXHUwNDM1IFx1MDQzZlx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQzMCBcdTA0MzdcdTA0MzBcdTA0NDlcdTA0MzhcdTA0NDlcdTA0MzVcdTA0M2RcdTA0NGIuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL0NOL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZWQwNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBcdTY1ODdcdTY4NjMKLQotZmVhdHVyZVRleHQ9RVBGIFx1NjU4N1x1Njg2M1xuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX0gXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdTdiN2VcdWZmMWF7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuIFxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kb2MvbmwvemgvVFcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMGQ2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIERvY3VtZW50YXRpb24KLQotZmVhdHVyZVRleHQ9RVBGIFx1NjU4N1x1NGVmNlxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX1cblwKLVx1NWVmYVx1N2Y2ZVx1NmExOVx1N2M2NFx1ZmYxYXswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3YTM2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgRG9jdW1lbnRhdGlvbiBGZWF0dXJlCi0jZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgRG9jdW1lbnRhdGlvbiBGZWF0dXJlIChOTFMpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyNzRlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgUmljaCBUZXh0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNGJmYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE3ZjA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUNsYXNzUGF0aDogZXhwb3J0bXNwdWkuamFyCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWksCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkNDNjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLmV4cG9ydG1zcHVpLmphciA9IHNyYy8KLW91dHB1dC5leHBvcnRtc3B1aS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBleHBvcnRtc3B1aS5qYXIsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZXRvb2wxNi9leHBfbXNfcHJqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2V0b29sMTYvZXhwX21zX3Byai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OThkMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvaWNvbnMvZXRvb2wxNi9leHBfbXNfcHJqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NTg5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9pY29ucy9mdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY0ZWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFdpemFyZHMKLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZE5hbWU9TWljcm9zb2Z0IFByb2plY3QKLWV4cG9ydFByb2plY3RUZW1wbGF0ZVdpemFyZERlc2NyaXB0aW9uPUV4cG9ydCBhIHByb2Nlc3MgdG8gYSBNaWNyb3NvZnQgUHJvamVjdC4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQwOTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuRXhwb3J0TVNQV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZXRvb2wxNi9leHBfbXNfcHJqLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLkV4cG9ydE1TUFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJleHBvcnRNU1BXaXphcmQiCi0gICAgICAgICBuYW1lPSJFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkIiAvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NjaGVtYS9FeHBvcnRNU1BXaXphcmQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NjaGVtYS9FeHBvcnRNU1BXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmOWEzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zY2hlbWEvRXhwb3J0TVNQV2l6YXJkLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpIiBpZD0iZXhwb3J0TVNQV2l6YXJkIiBuYW1lPSJFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLmV4cG9ydE1TUFdpemFyZCZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQKLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHMuTXlFeHBvcnRNU1BXaXphcmQmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5NeVNlbGVjdFByb2Nlc3NQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLlNlbGVjdFByb2Nlc3NQYWdlJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLk15TmV3V2l6YXJkUGFnZSZxdW90OwotICAgICAgICAgICAgICAgdHlwZT0mcXVvdDtuZXcmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzLlNlbGVjdFB1Ymxpc2hPcHRpb25zUHJvY2Vzc1BhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIGluc2VydD0mcXVvdDthZnRlciZxdW90Oy8mZ3Q7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAmbHQ7L3dpemFyZCZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Y2MzNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9FeHBvcnRNU1BVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRXhwb3J0TVNQVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRNU1BVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL0V4cG9ydE1TUFVJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0MWEwYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvRXhwb3J0TVNQVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFVJIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4cG9ydE1TUFVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEV4cG9ydE1TUFVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3J0TVNQVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdGVkUHJvY2Vzc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hXZWJTaXRlQ2hlY2tCb3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hDb25maWdCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hQcm9jZXNzQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzQ2hlY2tCb3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0RGlyV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2plY3ROYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpckxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2VCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydE1TUFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG92ZXJ3cml0ZVRleHRfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdQcm9jZXNzQ29udGVudFdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGxldGVkVGV4dF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRNU1BJbnRlcm5hbEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlsbGVnYWxBcmd1bWVudF9tc2c7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRNU1BVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmU2ZjFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkCi1leHBvcnRNU1BXaXphcmRfdGl0bGU9RXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0Ci0KLSMgU2VsZWN0IEV4cG9ydCBPcHRpb25zIFdpemFyZCBQYWdlCi1zZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgZXhwb3J0IG9wdGlvbnMKLXNlbGVjdEV4cG9ydE9wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWN0IHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBhbmQgZXhwb3J0IG9wdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZXhwb3J0IHRoZSBzZWxlY3RlZCBwcm9jZXNzLgotc2VsZWN0ZWRQcm9jZXNzTGFiZWxfdGV4dD1TZWxlY3RlZCBwcm9jZXNzOgotY29uZmlndXJhdGlvbkxhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb246Ci1wdWJsaXNoV2ViU2l0ZUNoZWNrQm94X3RleHQ9UHVibGlzaCB0aGUgcHJvY2VzcyB3ZWJzaXRlCi1wdWJsaXNoQ29uZmlnQnV0dG9uX3RleHQ9UHVibGlzaCB0aGUgZW50aXJlIG1ldGhvZCBjb25maWd1cmF0aW9uCi1wdWJsaXNoUHJvY2Vzc0J1dHRvbl90ZXh0PVB1Ymxpc2ggY29udGVudCB0aGF0IGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIHNlbGVjdGVkIHByb2Nlc3MKLWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0PUV4cG9ydCBvbmx5IGJyZWFrZG93biBlbGVtZW50cyB0aGF0IGFyZSBwbGFubmVkCi0KLSMgU2VsZWN0IFB1Ymxpc2hpbmcgT3B0aW9ucyBXaXphcmQgUGFnZQotc2VsZWN0UHVibGlzaE9wdGlvbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBwdWJsaXNoaW5nIG9wdGlvbnMKLXNlbGVjdFB1Ymxpc2hPcHRpb25zV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgcHVibGlzaGluZyBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHB1Ymxpc2ggdGhlIHdlYnNpdGUgZm9yIHRoZSBleHBvcnRlZCBwcm9jZXNzLgotCi0jIFNlbGVjdCBFeHBvcnQgRGlyZWN0b3J5IFdpemFyZCBwYWdlCi1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgcHJvamVjdCBuYW1lIGFuZCBleHBvcnQgZGlyZWN0b3J5Ci1zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmeSB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZSBhbmQgZXhwb3J0IGRpcmVjdG9yeS4KLXByb2plY3ROYW1lTGFiZWxfdGV4dD1OYW1lOgotZGlyTGFiZWxfdGV4dD1EaXJlY3Rvcnk6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotZXhwb3J0TVNQVGFza19uYW1lPUV4cG9ydGluZyBzZWxlY3RlZCBwcm9jZXNzIHRvIE1pY3Jvc29mdCBQcm9qZWN0Li4uCi0KLSMgV2FybmluZyBNZXNzYWdlcwotb3ZlcndyaXRlVGV4dF9tc2c9SVVQTTAxMDBXOiBBIE1pY3Jvc29mdCBQcm9qZWN0ICcnezB9JycgYWxyZWFkeSBleGlzdHMgaW4gJyd7MX0nJy5cblxuRG8geW91IHdhbnQgdG8gb3ZlcndyaXRlIGl0PwotbWlzc2luZ1Byb2Nlc3NDb250ZW50V2FybmluZ19tc2c9SVVQTTAxMDJXOiBUaGUgcHVibGlzaGVkIHByb2Nlc3Mgd2Vic2l0ZSB3aWxsIG5vdCBjb250YWluIGFueSBjb250ZW50IHJlbGF0ZWQgdG8gdGhlIGV4cG9ydGVkIHByb2Nlc3MuXG5cbkRvIHlvdSB3YW50IHRvIHByb2NlZWQ/Ci0KLSMgSW5mb3JtYXRpb25hbCBNZXNzYWdlcwotY29tcGxldGVkVGV4dF9tc2c9SVVQTTAxMDNJOiBUaGUgc2VsZWN0ZWQgcHJvY2VzcyAnJ3swfScnIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleHBvcnRlZCB0byBNaWNyb3NvZnQgUHJvamVjdCBYTUwgZmlsZSAnJ3sxfScnLgotCi0jIEVycm9yIE1lc3NhZ2VzCi1leHBvcnRNU1BFcnJvcl9tc2c9SVVQTTAxMDVFOiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgZXhwb3J0aW5nIHRoZSBzZWxlY3RlZCBwcm9jZXNzICcnezB9JycgdG8gTWljcm9zb2Z0IFByb2plY3QgJyd7MX0nJy4KLWV4cG9ydE1TUEVycm9yX3JlYXNvbj1DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotZXhwb3J0TVNQSW50ZXJuYWxFcnJvcl9tc2c9QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotaWxsZWdhbEFyZ3VtZW50X21zZz17MH0gcmV0dXJucyBhIG51bGwgb3IgaW52YWxpZCB2YWx1ZS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY4YWRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyByZXNvdXJjaW5nIHN1cHBvcnQgZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgd2l6YXJkLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9FeHBvcnRNU1BVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc3ODNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9FeHBvcnRNU1BVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNyBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMgewotCi0JLy8gVGhlIHB1Ymxpc2ggd2ViIHNpdGUgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfV0VCU0lURSA9ICJwdWJsaXNoV2ViU2l0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHVVJBVElPTiA9ICJwdWJsaXNoQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBwcmVmZXJlbmNlIGtleS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX09OTFlfUExBTk5FRF9XQlNfRUxFTUVOVFMgPSAiZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfTkFNRSA9ICJwcm9jZXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1yIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OX05BTUUgPSAiY29uZmlndXJhdGlvbk5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TX1BST0pFQ1RfTkFNRVMgPSAibXNwcm9qZWN0TmFtZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZXhwb3J0IGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRElSRUNUT1JJRVMgPSAiZXhwb3J0RGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBNU1AgZGlyZWN0b3J5IG5hbWUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhQT1JUX0RJUl9OQU1FID0gIkV4cG9ydCIgKyBGaWxlVXRpbC5GSUxFX1NFUCArICJNU1AiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBNU1AgZGlyZWN0b3J5LgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RXhwb3J0RGlyID0gbnVsbDsKLQkKLQlzdGF0aWMgewotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1dFQlNJVEUsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX0NPTkZJR1VSQVRJT04sIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfT05MWV9QTEFOTkVEX1dCU19FTEVNRU5UUywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChDT05GSUdVUkFUSU9OX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQUk9DRVNTX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChNU19QUk9KRUNUX05BTUVTLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhQT1JUX0RJUkVDVE9SSUVTLCBnZXREZWZhdWx0RXhwb3J0RGlyKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlzIHRoZSBwcmVmZXJlbmNlIGlzIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFdlYlNpdGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX1dFQlNJVEUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hXZWJTaXRlKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfV0VCU0lURSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaXMgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9DT05GSUdVUkFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hDb25maWd1cmF0aW9uKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfQ09ORklHVVJBVElPTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpcyB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYUE9SVF9PTkxZX1BMQU5ORURfV0JTX0VMRU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShFWFBPUlRfT05MWV9QTEFOTkVEX1dCU19FTEVNRU5UUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByb2Nlc3MgbmFtZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9jZXNzTmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoUFJPQ0VTU19OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb2Nlc3NOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUFJPQ0VTU19OQU1FLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWd1cmF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQ09ORklHVVJBVElPTl9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0aW9uTmFtZShTdHJpbmcgdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKENPTkZJR1VSQVRJT05fTkFNRSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0TVNQcm9qZWN0TmFtZXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBNU19QUk9KRUNUX05BTUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0TVNQcm9qZWN0TmFtZXNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIE1TX1BST0pFQ1RfTkFNRVMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lIHRvIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIHRlbXBsYXRlIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTVNQcm9qZWN0TmFtZShTdHJpbmcgbmFtZSkgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBNU19QUk9KRUNUX05BTUVTLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGV4cG9ydCBNU1AgZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZXhwb3J0IE1TUCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RXhwb3J0RGlyKCkgewotCQlpZiAoZGVmYXVsdEV4cG9ydERpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0RXhwb3J0RGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRFeHBvcnREaXIgPSBkZWZhdWx0RXhwb3J0RGlyICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQICsgREVGQVVMVF9FWFBPUlRfRElSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRFeHBvcnREaXIgPSBkZWZhdWx0RXhwb3J0RGlyICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9FWFBPUlRfRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRFeHBvcnREaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RXhwb3J0RGlyZWN0b3JpZXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBFWFBPUlRfRElSRUNUT1JJRVMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGV4cG9ydCBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEV4cG9ydERpcmVjdG9yaWVzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBFWFBPUlRfRElSRUNUT1JJRVMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBleHBvcnQgZGlyZWN0b3J5IHRvIHRoZSBleHBvcnQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBhbiBleHBvcnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4cG9ydERpcihTdHJpbmcgZGlyKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIEVYUE9SVF9ESVJFQ1RPUklFUywgZGlyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJmODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgd2l6YXJkLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL0V4cG9ydE1TUFdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvRXhwb3J0TVNQV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZTZlYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvRXhwb3J0TVNQV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLkV4cG9ydE1TUE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuRXhwb3J0TVNQU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5FeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLklFeHBvcnRNU1BTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuU2VsZWN0UHJvY2Vzc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3Qgd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIHdpemFyZCBleHBvcnRzIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgdG8gYSBNaWNyb3NvZnQKLSAqIFByb2plY3QuIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGdlbmVyYXRlcyBhIFhNTCBmaWxlIHRoYXQgYWRoZXJlcyB0byB0aGUKLSAqIE1pY3Jvc29mdCBQcm9qZWN0IDIwMDMgWE1MIFNjaGVtYS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BXaXphcmQgZXh0ZW5kcyBCYXNlV2l6YXJkIGltcGxlbWVudHMgSUV4cG9ydFdpemFyZCB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJWkFSRF9JRCA9IEV4cG9ydE1TUFdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgUHVibGlzaCBDb25maWd1cmF0aW9uIHdpemFyZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5leHBvcnRNU1BXaXphcmQiOyAvLyROT04tTkxTLTEkCQotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwcm9jZXNzLgotCXByb3RlY3RlZCBTZWxlY3RQcm9jZXNzUGFnZSBzZWxlY3RQcm9jZXNzUGFnZTsKLQotCS8vIFRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZXhwb3J0IG9wdGlvbnMuCi0JcHJvdGVjdGVkIFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlIHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JcHJvdGVjdGVkIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2U7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGV4cG9ydCBkaXJlY3RvcnkuCi0JcHJvdGVjdGVkIFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2Ugc2VsZWN0RXhwb3J0RGlyUGFnZTsKLQotCS8vIFRoZSBleHBvcnQgb3B0aW9ucy4KLQlwcm90ZWN0ZWQgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zID0gbmV3IEV4cG9ydE1TUE9wdGlvbnMoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFdpemFyZCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyLmluaXQod29ya2JlbmNoLCBzZWxlY3Rpb24pOwotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkgewotCQlyZXR1cm4gV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjYWRkUGFnZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgPT0gbnVsbCkgewotCQkJc2VsZWN0UHJvY2Vzc1BhZ2UgPSBuZXcgU2VsZWN0UHJvY2Vzc1BhZ2UoKTsKLQkJCXNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlID0gbmV3IFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKCk7Ci0JCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgPSBuZXcgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKCk7Ci0JCQlzZWxlY3RFeHBvcnREaXJQYWdlID0gbmV3IFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0UHJvY2Vzc1BhZ2UpOwotCQkJc3VwZXIuYWRkUGFnZShzZWxlY3RFeHBvcnRPcHRpb25zUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdEV4cG9ydERpclBhZ2UpOwotCQl9IGVsc2UgewotCQkJTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgQXJyYXlMaXN0PElXaXphcmRQYWdlPigpOwotCi0JCQlJV2l6YXJkUGFnZSBwYWdlID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkJLmdldFJlcGxhY2VXaXphcmRQYWdlKFNlbGVjdFByb2Nlc3NQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RQcm9jZXNzUGFnZSA9IG5ldyBTZWxlY3RQcm9jZXNzUGFnZSgpOwotCQkJCXdpemFyZFBhZ2VzLmFkZChzZWxlY3RQcm9jZXNzUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlID0gbmV3IFNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RFeHBvcnREaXJQYWdlID0gbmV3IFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0RXhwb3J0RGlyUGFnZSk7Ci0JCQl9Ci0KLQkJCXN1cGVyLmdldE5ld1dpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQotCQkJZm9yIChJdGVyYXRvcjxJV2l6YXJkUGFnZT4gaXQgPSB3aXphcmRQYWdlcy5pdGVyYXRvcigpOyBpdAotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBpdC5uZXh0KCk7Ci0JCQkJc3VwZXIuYWRkUGFnZSh3aXphcmRQYWdlKTsKLQkJCX0KLQotCQkJd2l6YXJkRXh0ZW5kZXIuaW5pdFdpemFyZFBhZ2VzKHdpemFyZFBhZ2VzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NU1Byb2plY3QuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCWlmICghIHdpemFyZEV4dGVuZGVyLmNhbkZpbmlzaCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpID09IHNlbGVjdEV4cG9ydERpclBhZ2UKLQkJCQkmJiBzZWxlY3RFeHBvcnREaXJQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2RvRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkb0ZpbmlzaCgpIHsKLQkJcmV0dXJuIGV4cG9ydE1TUChzZWxlY3RQcm9jZXNzUGFnZS5nZXRQcm9jZXNzKCksIGdldEV4cG9ydE9wdGlvbnMoKSwKLQkJCQlFeHBvcnRNU1BTZXJ2aWNlLmdldEluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEV4cG9ydHMgdGhlIHNlbGVjdGVkIHByb2Nlc3MuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwb3J0TVNQKFByb2Nlc3MgcHJvY2VzcywgRXhwb3J0TVNQT3B0aW9ucyBleHBvcnRPcHRpb25zLAotCQkJSUV4cG9ydE1TUFNlcnZpY2Ugc2VydmljZSkgewotCQlpZiAocHJvY2VzcyA9PSBudWxsIHx8IGV4cG9ydE9wdGlvbnMgPT0gbnVsbCB8fCBzZXJ2aWNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUZpbGUgZXhwb3J0RGlyOwotCQlTdHJpbmcgbXNwcm9qZWN0TmFtZTsKLQotCQl0cnkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBleHBvcnRPcHRpb25zLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiZXhwb3J0T3B0aW9ucy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGV4cG9ydE9wdGlvbnMuZ2V0UHVibGlzaFdlYlNpdGUoKSkgewotCQkJCWlmIChzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgIT0gbnVsbCkgewotCQkJCQlzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2Uuc2F2ZVByZWZlcmVuY2VzKCk7Ci0JCQkJfQotCi0JCQkJaWYgKCFQdWJsaXNoaW5nVXRpbC5oYXNWYWxpZFByb2Nlc3NWaWV3KGNvbmZpZywgcHJvY2VzcykpIHsKLQkJCQkJYm9vbGVhbiBvayA9IEV4cG9ydE1TUFVJUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCS5kaXNwbGF5UHJvbXB0KAotCQkJCQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMubWlzc2luZ1Byb2Nlc3NDb250ZW50V2FybmluZ19tc2cpOwotCQkJCQlpZiAoIW9rKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWV4cG9ydERpciA9IGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCk7Ci0JCQlpZiAoZXhwb3J0RGlyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJImV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQltc3Byb2plY3ROYW1lID0gZXhwb3J0T3B0aW9ucy5nZXRNU1Byb2plY3ROYW1lKCk7Ci0JCQlpZiAobXNwcm9qZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJleHBvcnRPcHRpb25zLmdldE1TUHJvamVjdE5hbWUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlkaXNwbGF5SWxsZWdhbEFyZ3VtZW50RXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlTdHJpbmcgbXNwcm9qZWN0RmlsZU5hbWUgPSBtc3Byb2plY3ROYW1lICsgIi54bWwiOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgbXNwcm9qZWN0RmlsZSA9IG5ldyBGaWxlKGV4cG9ydERpciwgbXNwcm9qZWN0RmlsZU5hbWUpOwotCQlpZiAobXNwcm9qZWN0RmlsZS5leGlzdHMoKSkgewotCQkJYm9vbGVhbiBvayA9IEV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUsCi0JCQkJCQkJTkxTLmJpbmQoRXhwb3J0TVNQVUlSZXNvdXJjZXMub3ZlcndyaXRlVGV4dF9tc2csCi0JCQkJCQkJCQkobmV3IFN0cmluZ1tdIHsgbXNwcm9qZWN0RmlsZU5hbWUsCi0JCQkJCQkJCQkJCWV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKSB9KSkpOwotCQkJaWYgKCFvaykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBzZXJ2aWNlLmV4cG9ydE1TUHJvamVjdChwcm9jZXNzLCBleHBvcnRPcHRpb25zKTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlJbmZvKAotCQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQkJTkxTLmJpbmQoRXhwb3J0TVNQVUlSZXNvdXJjZXMuY29tcGxldGVkVGV4dF9tc2csCi0JCQkJCQkJCShuZXcgU3RyaW5nW10geyBwcm9jZXNzLmdldE5hbWUoKSwKLQkJCQkJCQkJCQltc3Byb2plY3RGaWxlLmdldEFic29sdXRlUGF0aCgpIH0pKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQlOTFMuYmluZChFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BFcnJvcl9tc2csCi0JCQkJCQkJKG5ldyBTdHJpbmdbXSB7IHByb2Nlc3MuZ2V0TmFtZSgpLAotCQkJCQkJCQkJbXNwcm9qZWN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSB9KSksCi0JCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUEVycm9yX3JlYXNvbiwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcHJvY2VzcyB0bwotCSAqIGV4cG9ydC4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHJvY2Vzc1BhZ2UgZ2V0U2VsZWN0UHJvY2Vzc1BhZ2UoKSB7Ci0JCXJldHVybiBzZWxlY3RQcm9jZXNzUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdGhlIGV4cG9ydCBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSBnZXRFeHBvcnRPcHRpb25zUGFnZSgpIHsKLQkJcmV0dXJuIHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBwdWJsaXNoaW5nCi0JICogb3B0aW9ucy4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSgpIHsKLQkJcmV0dXJuIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgZXhwb3J0Ci0JICogZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlIGdldFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UoKSB7Ci0JCXJldHVybiBzZWxlY3RFeHBvcnREaXJQYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydCBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BPcHRpb25zIGdldEV4cG9ydE9wdGlvbnMoKSB7Ci0JCWV4cG9ydE9wdGlvbnMuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihzZWxlY3RFeHBvcnRPcHRpb25zUGFnZQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlleHBvcnRPcHRpb25zLnNldEV4cG9ydERpcihuZXcgRmlsZShzZWxlY3RFeHBvcnREaXJQYWdlCi0JCQkJLmdldEV4cG9ydERpcmVjdG9yeSgpKSk7Ci0JCWV4cG9ydE9wdGlvbnMuc2V0TVNQcm9qZWN0TmFtZShzZWxlY3RFeHBvcnREaXJQYWdlLmdldE1TUHJvamVjdE5hbWUoKSk7Ci0JCWV4cG9ydE9wdGlvbnMuc2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyhzZWxlY3RFeHBvcnRPcHRpb25zUGFnZQotCQkJCS5nZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzU2VsZWN0aW9uKCkpOwotCi0JCWlmIChzZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5nZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpKSB7Ci0JCQlQdWJsaXNoT3B0aW9ucyBwdWJsaXNoaW5nT3B0aW9ucyA9IHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZQotCQkJCQkuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJCWJvb2xlYW4gcHVibGlzaENvbmZpZyA9IHNlbGVjdEV4cG9ydE9wdGlvbnNQYWdlCi0JCQkJCS5nZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCk7Ci0JCQlib29sZWFuIHB1Ymxpc2hQcm9jZXNzID0gc2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UKLQkJCQkJLmdldFB1Ymxpc2hQcm9jZXNzU2VsZWN0aW9uKCk7Ci0JCQlwdWJsaXNoaW5nT3B0aW9ucy5zZXRQdWJsaXNoQ29uZmlndXJhdGlvbihwdWJsaXNoQ29uZmlnKTsKLQkJCXB1Ymxpc2hpbmdPcHRpb25zLnNldFB1Ymxpc2hQcm9jZXNzKHB1Ymxpc2hQcm9jZXNzKTsKLQkJCWV4cG9ydE9wdGlvbnMuc2V0UHVibGlzaFdlYlNpdGUocHVibGlzaGluZ09wdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAocHVibGlzaENvbmZpZyB8fCBwdWJsaXNoUHJvY2VzcykpOwotCQkJZXhwb3J0T3B0aW9ucy5zZXRQdWJsaXNoaW5nT3B0aW9ucyhwdWJsaXNoaW5nT3B0aW9ucyk7Ci0JCX0gZWxzZSB7Ci0JCQlleHBvcnRPcHRpb25zLnNldFB1Ymxpc2hXZWJTaXRlKGZhbHNlKTsKLQkJCWV4cG9ydE9wdGlvbnMuc2V0UHVibGlzaGluZ09wdGlvbnMobnVsbCk7Ci0JCX0KLQotCQlyZXR1cm4gZXhwb3J0T3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgYWJvdXQgYW4gaWxsZWdhbCBhcmd1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgYXJndW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5SWxsZWdhbEFyZ3VtZW50RXJyb3IoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEV4cG9ydE1TUFVJUmVzb3VyY2VzLmlsbGVnYWxBcmd1bWVudF9tc2csCi0JCQkJKG5ldyBTdHJpbmdbXSB7IG5hbWUgfSkpOwotCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE1TUFdpemFyZF90aXRsZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BJbnRlcm5hbEVycm9yX21zZywKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5leHBvcnRNU1BFcnJvcl9yZWFzb24sCi0JCQkJbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlMmViYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLkV4cG9ydE1TUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLnByZWZlcmVuY2VzLkV4cG9ydE1TUFVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZSBhbmQKLSAqIGV4cG9ydCBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdEV4cG9ydERpcmVjdG9yeVBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgdGVtcGxhdGVDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gcHJvamVjdE5hbWVDb21ibzsKLQotCXByb3RlY3RlZCBDb21ibyBleHBvcnREaXJDb21ibzsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnREaXJlY3RvcnlQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKEV4cG9ydE1TUFVJUmVzb3VyY2VzLnNlbGVjdEV4cG9ydERpcldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RFeHBvcnREaXJXaXphcmRQYWdlX3RleHQpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0TVNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX21zX3Byal93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0RGlyZWN0b3J5UGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc2hlbGwgPSBwYXJlbnQuZ2V0U2hlbGwoKTsKLQotCQljb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJdGVtcGxhdGVDb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKGNvbXBvc2l0ZSwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMucHJvamVjdE5hbWVMYWJlbF90ZXh0KTsKLQotCQlwcm9qZWN0TmFtZUNvbWJvID0gY3JlYXRlQ29tYm9ib3godGVtcGxhdGVDb21wb3NpdGUsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKHRlbXBsYXRlQ29tcG9zaXRlLCBFeHBvcnRNU1BVSVJlc291cmNlcy5kaXJMYWJlbF90ZXh0KTsKLQotCQlleHBvcnREaXJDb21ibyA9IGNyZWF0ZUNvbWJvYm94KHRlbXBsYXRlQ29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24odGVtcGxhdGVDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nW10gdGVtcGxhdGVOYW1lcyA9IEV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuZ2V0TVNQcm9qZWN0TmFtZXMoKTsKLQkJaWYgKHRlbXBsYXRlTmFtZXMgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWVzLmxlbmd0aCA+IDApIHsKLQkJCXByb2plY3ROYW1lQ29tYm8uc2V0SXRlbXModGVtcGxhdGVOYW1lcyk7Ci0JCQlwcm9qZWN0TmFtZUNvbWJvLnNldFRleHQodGVtcGxhdGVOYW1lc1swXSk7Ci0JCX0KLQotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5nZXRFeHBvcnREaXJlY3RvcmllcygpOwotCQlpZiAoZXhwb3J0RGlycyAhPSBudWxsICYmIGV4cG9ydERpcnMubGVuZ3RoID4gMCkgewotCQkJZXhwb3J0RGlyQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnREaXJDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0KLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCQlleHBvcnREaXJDb21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQkJZXhwb3J0RGlyQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXByb2plY3ROYW1lQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlleHBvcnREaXJDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRNU1Byb2plY3ROYW1lKCkubGVuZ3RoKCkgPiAwCi0JCQkJJiYgZ2V0RXhwb3J0RGlyZWN0b3J5KCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNU1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWVDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHBvcnREaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBleHBvcnREaXJDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5hZGRNU1Byb2plY3ROYW1lKGdldE1TUHJvamVjdE5hbWUoKSk7Ci0JCUV4cG9ydE1TUFVJUHJlZmVyZW5jZXMuYWRkRXhwb3J0RGlyKGdldEV4cG9ydERpcmVjdG9yeSgpKTsKLQkJbW9kaWZ5TGlzdGVuZXIgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL1NlbGVjdEV4cG9ydE9wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZWFmYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkuRXhwb3J0TVNQVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkucHJlZmVyZW5jZXMuRXhwb3J0TVNQVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCB0aGUgZXhwb3J0IG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb25maWdDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBwcm9jZXNzVGV4dDsKLQotCXByb3RlY3RlZCBDb21ibyBjb25maWdDb21ibzsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgb3B0aW9uc0NvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcHVibGlzaE9wdGlvbnNDb21wb3NpdGU7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaFByb2Nlc3NSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c0NoZWNrQm94OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0T3B0aW9uc1BhZ2UoU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0RXhwb3J0T3B0aW9uc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RFeHBvcnRPcHRpb25zV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydE1TUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tc19wcmpfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RFeHBvcnRPcHRpb25zUGFnZSgpIHsKLQkJdGhpcyhQQUdFX05BTUUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCWNvbmZpZ0NvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLCAyKTsKLQotCQljcmVhdGVMYWJlbChjb25maWdDb21wb3NpdGUsCi0JCQkJRXhwb3J0TVNQVUlSZXNvdXJjZXMuc2VsZWN0ZWRQcm9jZXNzTGFiZWxfdGV4dCk7Ci0KLQkJcHJvY2Vzc1RleHQgPSBjcmVhdGVUZXh0KGNvbmZpZ0NvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29uZmlnQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmNvbmZpZ3VyYXRpb25MYWJlbF90ZXh0KTsKLQotCQljb25maWdDb21ibyA9IG5ldyBDb21ibyhjb25maWdDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJb3B0aW9uc0NvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLCAxKTsKLQotCQlwdWJsaXNoV2ViU2l0ZVJhZGlvQnV0dG9uID0gY3JlYXRlQ2hlY2tib3gob3B0aW9uc0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5wdWJsaXNoV2ViU2l0ZUNoZWNrQm94X3RleHQpOwotCi0JCXB1Ymxpc2hPcHRpb25zQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShvcHRpb25zQ29tcG9zaXRlLCAxKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgcHVibGlzaE9wdGlvbnNDb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAtNTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAxMjsKLQotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihwdWJsaXNoT3B0aW9uc0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnQnV0dG9uX3RleHQpOwotCi0JCXB1Ymxpc2hQcm9jZXNzUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihwdWJsaXNoT3B0aW9uc0NvbXBvc2l0ZSwKLQkJCQlFeHBvcnRNU1BVSVJlc291cmNlcy5wdWJsaXNoUHJvY2Vzc0J1dHRvbl90ZXh0KTsKLQotCQlleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzQ2hlY2tCb3ggPSBjcmVhdGVDaGVja2JveChvcHRpb25zQ29tcG9zaXRlLAotCQkJCUV4cG9ydE1TUFVJUmVzb3VyY2VzLmV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHNDaGVja0JveF90ZXh0KTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCWlmIChFeHBvcnRNU1BVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hXZWJTaXRlKCkpIHsKLQkJCXB1Ymxpc2hXZWJTaXRlUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gRXhwb3J0TVNQVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoQ29uZmlndXJhdGlvbigpOwotCQlwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHB1Ymxpc2hDb25maWcpOwotCQlwdWJsaXNoUHJvY2Vzc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbighcHVibGlzaENvbmZpZyk7Ci0KLQkJdXBkYXRlUHVibGlzaE9wdGlvbnNCdXR0b25zKCk7Ci0KLQkJZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c0NoZWNrQm94Ci0JCQkJLnNldFNlbGVjdGlvbihFeHBvcnRNU1BVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWNvbmZpZ0NvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXVwZGF0ZVB1Ymxpc2hPcHRpb25zQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgQ29uZmlndXJhdGlvbiBDb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb25maWdDb21ibyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJU3RyaW5nW10gY29udGV4dE5hbWVzID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldENvbnRleHRzKHByb2Nlc3MpOwotCQljb25maWdDb21iby5zZXRJdGVtcyhjb250ZXh0TmFtZXMpOwotCQlTdHJpbmcgZGVmYXVsdENvbnRleHQgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZ2V0TmFtZSgpOwotCQljb25maWdDb21iby5zZXRUZXh0KGRlZmF1bHRDb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgcmFkaW8gYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQdWJsaXNoT3B0aW9uc0J1dHRvbnMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCk7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlwdWJsaXNoUHJvY2Vzc1JhZGlvQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2Vzcykgb2JqOwotCQkJcHJvY2Vzc1RleHQuc2V0VGV4dChwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQl1cGRhdGVDb25maWdDb21ibyhwcm9jZXNzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCkKLQkJCQkmJiBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuc2l6ZSgpID09IDApIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMubWlzc2luZ1ZpZXdFcnJvcl9tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2UjZ2V0TmV4dFBhZ2VEYXRhKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5leHRQYWdlRGF0YSgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKLQotCQlpZiAoZ2V0UHVibGlzaFdlYlNpdGVTZWxlY3Rpb24oKSkgewotCQkJbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZSgpOwotCQl9IGVsc2UgewotCQkJbmV4dFBhZ2UgPSBzdXBlci5nZXROZXh0UGFnZSgpLmdldE5leHRQYWdlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV4dFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlTdHJpbmcgY29uZmlnTmFtZSA9IGNvbmZpZ0NvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uKGxpYnJhcnksIGNvbmZpZ05hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggd2ViIHNpdGUgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hXZWJTaXRlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaFdlYlNpdGVSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRQdWJsaXNoUHJvY2Vzc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHB1Ymxpc2hQcm9jZXNzUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHNlbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c0NoZWNrQm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5zZXRQdWJsaXNoV2ViU2l0ZShnZXRQdWJsaXNoV2ViU2l0ZVNlbGVjdGlvbigpKTsKLQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRQdWJsaXNoQ29uZmlndXJhdGlvbihnZXRQdWJsaXNoQ29uZmlnU2VsZWN0aW9uKCkpOwotCQlFeHBvcnRNU1BVSVByZWZlcmVuY2VzCi0JCQkJLnNldEV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHMoZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50c1NlbGVjdGlvbigpKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJRXhwb3J0TVNQVUlQcmVmZXJlbmNlcy5zZXRDb25maWd1cmF0aW9uTmFtZShjb25maWcuZ2V0TmFtZSgpKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjMzA3OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9TZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5FeHBvcnRNU1BVSVJlc291cmNlczsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyBmb3IgdGhlCi0gKiBwcm9jZXNzIHdlYiBzaXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRNU1BVSVJlc291cmNlcy5zZWxlY3RQdWJsaXNoT3B0aW9uc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRNU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbXNfcHJqX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZDUyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBleHBvcnRpbmcgcHJvY2Vzc2VzIHRvIE1pY3Jvc29mdCBQcm9qZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyNzRlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgUmljaCBUZXh0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MDMxYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjOWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLkV4cG9ydE1TUFBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBleHBvcnRtc3AuamFyCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMmU0NmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLmV4cG9ydG1zcC5qYXIgPSBzcmMvCi1vdXRwdXQuZXhwb3J0bXNwLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGV4cG9ydG1zcC5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZS8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjRlZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgV2l6YXJkcwotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkTmFtZT1NaWNyb3NvZnQgUHJvamVjdAotZXhwb3J0UHJvamVjdFRlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0LgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2UyZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi08IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01TUHJvamVjdC5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Aud2l6YXJkcy5FeHBvcnRUb01TUHJvamVjdFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVleHBvcnRQcm9qZWN0VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJleHBvcnRNU1BXaXphcmQiCi0gICAgICAgICBuYW1lPSJFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL0V4cG9ydE1TUFdpemFyZC5leHNkIiAvPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Aud2l6YXJkcy5FeHBvcnRUb01TUHJvamVjdFdpemFyZCIvPgotICAgPC9leHRlbnNpb24+Ci0tLT4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmM3MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGFuIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BFeGNlcHRpb24gZXh0ZW5kcyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MjMxODk3MDA1NjE4MDYyNjJMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEV4cG9ydE1TUEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSwgU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSwgZXJyb3JNc2cpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BPcHRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWM3MjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UHJvY2Vzc09wdGlvbnM7Ci0KLS8qKgotICogVGhlIGV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSA3LjIKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUE9wdGlvbnMgZXh0ZW5kcyBFeHBvcnRQcm9jZXNzT3B0aW9ucyB7Ci0KLQlwcml2YXRlIFN0cmluZyBtc3Byb2plY3ROYW1lOwotCi0JLyoqCi0JICogR2V0cyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleHBvcnRlZCBNaWNyb3NvZnQgUHJvamVjdCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNU1Byb2plY3ROYW1lKCkgewotCQlyZXR1cm4gbXNwcm9qZWN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBleHBvcnRlZCBNaWNyb3NvZnQgUHJvamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1TUHJvamVjdE5hbWUoU3RyaW5nIG1zcHJvamVjdE5hbWUpIHsKLQkJdGhpcy5tc3Byb2plY3ROYW1lID0gbXNwcm9qZWN0TmFtZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNGQyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRNU1BQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvRXhwb3J0TVNQUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzhjOTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgTWljcm9zb2Z0IFByb2plY3QgbWVzc2FnZSByZXNvdXJjZSBidW5kbGUgYWNjZXNzb3IgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0TVNQUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IEV4cG9ydE1TUFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4cG9ydE1TUFJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0TVNQVGFza19uYW1lOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRXhwb3J0TVNQUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjI3MGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBTZXJ2aWNlIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydE1TUFNlcnZpY2UgaW1wbGVtZW50cyBJRXhwb3J0TVNQU2VydmljZSB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydE1TUFNlcnZpY2UgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwb3J0TVNQU2VydmljZSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoRXhwb3J0TVNQU2VydmljZS5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IEV4cG9ydE1TUFNlcnZpY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AuSUV4cG9ydE1TUFNlcnZpY2UjZXhwb3J0TVNQcm9qZWN0KFByb2Nlc3MsCi0JICogICAgICBFeHBvcnRNU1BPcHRpb25zKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydE1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBFeHBvcnRNU1BYTUxTZXJ2aWNlKCkuZXhwb3J0KHByb2Nlc3MsIGV4cG9ydE9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZmExMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFNlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIEV4cG9ydCBQcm9qZWN0IFBsYW4gU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02MTAzNjg5ODY4NTcyNDgwMzU5TDsKLQotCS8qKgotCSAqIFRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZSByb290Q2F1c2U7Ci0KLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJdGhpcyhyb290Q2F1c2UsIHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0JCXRoaXMuZXJyb3JNc2cgPSBlcnJvck1zZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7Ci0JCXJldHVybiByb290Q2F1c2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTE9wZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWVmMDBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBmaWxlIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRNU1BYTUxPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gZXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0TVNQWE1MT3BlcmF0aW9uKEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncikgewotCQlzdXBlcigpOwotCQl0aGlzLnB1Ymxpc2hNZ3IgPSBwdWJsaXNoTWdyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2hlZCBVUkwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRfdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiwgaWYgYW55LCB0aGF0IG9jY3VycmVkIHdoaWxlIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3MjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWV4Y2VwdGlvbiA9IG51bGw7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0TVNQUmVzb3VyY2VzLmV4cG9ydE1TUFRhc2tfbmFtZSk7Ci0JCXRyeSB7Ci0JCQlwdWJsaXNoTWdyLnB1Ymxpc2gobW9uaXRvcik7Ci0JCQlwdWJsaXNoZWRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoZWRVcmwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCXB1Ymxpc2hNZ3IgPSBudWxsOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRNU1BYTUxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNWRmMDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE1TUFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBQbGFuIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEJ1Z3MgZml4ZWQ6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwODkKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwODYKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUwOTUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTcyNjUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTUxNTUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY5NTkKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTczMjEKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTkyMzAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIzMzYKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjg4MDEgZml4IGZvcgotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Njk1MQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzQyOAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0TVNQWE1MU2VydmljZSB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IEV4cG9ydE1TUFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIEFsbCBUYXNrcyByZWZlcmVuY2VkIGJ5IHRoZSBleHBvcnRlZCBQcm9qZWN0IFRlbXBsYXRlLgotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgcm9sZXNUb1VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgdGFza1VpZFRvV2JzV2FwcGVyUGF0aE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd2JzV2FwcGVyUGF0aFRvTG9jYWxQcmVkTGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd2JzR3VpZFRvVGFza1VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgd2JzV3JhcHBlclBhdGhUb1ByZWRMaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIFRoZSBuYW1lIG9mIHRoZSBjb250ZW50IGZvbGRlci4gVGhpcyB3aWxsIGJlIG5hbWVkIGFmdGVyIHRoZSBjb250ZXh0LgotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRGb2xkZXJOYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgYWJUYXJnZXREaXI7Ci0KLQkvLyBJZiB0cnVlLCBvbmx5IGV4cG9ydCBicmVha2Rvd24gZWxlbWVudHMgd2l0aCAnaXNQbGFubmVkJyBhdHRyaWJ1dGVzIHNldAotCS8vIHRvIHRydWUuCi0JcHJpdmF0ZSBib29sZWFuIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHVibGlzaENvbnRlbnRTaXRlID0gZmFsc2U7Ci0KLQlwcml2YXRlIGludCB0YXNrX3VpZCA9IDE7Ci0KLQlwcml2YXRlIGludCByZXNfdWlkID0gMTsKLQotCXByaXZhdGUgaW50IGFzc2lnbl91aWQgPSAxOwotCi0JcHJvdGVjdGVkIE1zcHJvamVjdEZhY3RvcnkgcHJvamVjdEZhY3RvcnkgPSBNc3Byb2plY3RGYWN0b3J5LmVJTlNUQU5DRTsKLQotCS8vIFRoZSBwcm9jZXNzIHRvIGJlIGV4cG9ydGVkLgotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBwcm9jZXNzQ29uZmlnOwotCi0JcHJpdmF0ZSBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdic0FkYXB0ZXJGYWN0b3J5OwotCi0JLy8gVGhlIHByb2Nlc3MgY29uZmlndXJhdG9yIGZvciBmaWx0ZXJpbmcgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEKLQkvLyBjb25maWd1cmF0aW9uLgotCXByaXZhdGUgUHJvY2Vzc0NvbmZpZ3VyYXRvciBicmVha2Rvd25FbGVtZW50RmlsdGVyOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB3YnNDb250ZW50UHJvdmlkZXI7Ci0KLQkvLyBNYXAgcHJvY2Vzc2VzIHRvIHN1cHByZXNzaW9uIG9iamVjdHMuCi0JcHJpdmF0ZSBNYXAgc3VwcHJlc3Npb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gVGhlIHN1cHByZXNzaW9uIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNlbGVjdGVkIHByb2Nlc3MgdG8gYmUKLQkvLyBleHBvcnRlZC4KLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JLy8gVGhlIFdCUyBlbGVtZW50IHBhdGhzLgotCXByaXZhdGUgU3RhY2sgZWxlbWVudFBhdGhzID0gbmV3IFN0YWNrKCk7Ci0KLQlwcml2YXRlIE9iamVjdCBjdXJyZW50RWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRFbGVtZW50UGF0aDsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0IGN1cnJlbnRQcmVkTGlzdDsKLQkKLQlwcml2YXRlIEhhc2hNYXA8VGFzaywgV29ya0JyZWFrZG93bkVsZW1lbnQ+IHRhc2tUb1diZU1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydE1TUFhNTFNlcnZpY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGEgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqIEB0aHJvd3MgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydChQcm9jZXNzIHByb2Nlc3MsIEV4cG9ydE1TUE9wdGlvbnMgZXhwb3J0T3B0aW9ucykKLQkJCXRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG1zcHJvamVjdE5hbWUgPSBleHBvcnRPcHRpb25zLmdldE1TUHJvamVjdE5hbWUoKTsKLQkJRmlsZSBleHBvcnREaXIgPSBleHBvcnRPcHRpb25zLmdldEV4cG9ydERpcigpOwotCQlwdWJsaXNoQ29udGVudFNpdGUgPSBleHBvcnRPcHRpb25zLmdldFB1Ymxpc2hXZWJTaXRlKCk7Ci0JCVB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zID0gZXhwb3J0T3B0aW9ucy5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQlwcm9jZXNzQ29uZmlnID0gZXhwb3J0T3B0aW9ucy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZXhwb3J0aW5nIHRvIE1pY3Jvc29mdCBQcm9qZWN0ISIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBwcm9jZXNzICAgICAgICAgID0gIiArIHByb2Nlc3MpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb25maWd1cmF0aW9uICAgID0gIiArIHByb2Nlc3NDb25maWcpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBtc3Byb2plY3ROYW1lICAgID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgbXNwcm9qZWN0TmFtZSk7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIkJCQgdGFyZ2V0RGlyICAgICAgICAgICAgICAgICA9ICIgKyBleHBvcnREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBwdWJsaXNoQ29uZmlnT3B0aW9ucyAgICAgID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgcHVibGlzaGluZ09wdGlvbnMpOwotCQl9Ci0KLQkJLy8gY29uc3RydWN0IHRoZSBleHBvcnQgdGFyZ2V0IHhtbCBmaWxlIHBhdGgKLQkJaWYgKCFleHBvcnREaXIuZXhpc3RzKCkpIHsKLQkJCWV4cG9ydERpci5ta2RpcnMoKTsKLQkJfQotCQlhYlRhcmdldERpciA9IGV4cG9ydERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJUGF0aCBleHBvcnRQYXRoID0gbmV3IFBhdGgoYWJUYXJnZXREaXIpOwotCQlib29sZWFuIGVuZFdpdGhYbWxFeHQgPSBtc3Byb2plY3ROYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhwb3J0UGF0aFN0ciA9IChleHBvcnRQYXRoLmFwcGVuZChlbmRXaXRoWG1sRXh0ID8gbXNwcm9qZWN0TmFtZQotCQkJCTogKG1zcHJvamVjdE5hbWUgKyAiLnhtbCIpKSkudG9PU1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGV4cG9ydFBhdGhTdHIgICAgICAgICAgICAgICAgID0gIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgZXhwb3J0UGF0aFN0cik7Ci0KLQkJLy8gY29uc3RydWN0IHRoZSBlbXB0eSBNUyBwcm9qZWN0IHhtbCB0ZW1wbGF0ZSBmaWxlIHBhdGgKLQkJU3RyaW5nIGVtcHR5VGVtcGxhdGVGaWxlID0gRXhwb3J0TVNQUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbnN0YWxsUGF0aCgpCi0JCQkJKyAidGVtcGxhdGUiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgIm1zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZW1wdHlUZW1wbGF0ZUZpbGUgICAgICAgICAgICAgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBlbXB0eVRlbXBsYXRlRmlsZSk7Ci0KLQkJLy8gY29weSB0aGUgZW1wdHkgdGVtcGxhdGUgTVMgcHJvamVjdCB4bWwgZmlsZSB0byB0aGUgZXhwb3J0IHRhcmdldAotCQl0cnkgewotCQkJRmlsZSBzcmMgPSBuZXcgRmlsZShlbXB0eVRlbXBsYXRlRmlsZSk7Ci0JCQlGaWxlIGRzdCA9IG5ldyBGaWxlKGV4cG9ydFBhdGhTdHIpOwotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjLCBkc3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoZXhwb3J0UGF0aFN0cik7Ci0KLQkJdHJ5IHsKLQotCQkJWE1MUmVzb3VyY2UgcmVzID0gbmV3IE1zcHJvamVjdFJlc291cmNlSW1wbChmaWxlVVJJKTsKLQkJCXJlcy5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXMuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLAotCQkJCQlCb29sZWFuLlRSVUUpOwotCQkJcmVzLmdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwKLQkJCQkJQm9vbGVhbi5UUlVFKTsKLQkJCXJlcy5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoCi0JCQkJCVhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQkJcmVzLmxvYWQobnVsbCk7Ci0KLQkJCURvY3VtZW50Um9vdCBkb2NSb290ID0gKERvY3VtZW50Um9vdCkgcmVzLmdldEVPYmplY3QoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJcHJvamVjdCA9IChQcm9qZWN0KSBkb2NSb290LmdldFByb2plY3QoKTsKLQotCQkJdGFza1RvV2JlTWFwID0gbmV3IEhhc2hNYXA8VGFzaywgV29ya0JyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQlpZiAoISBnZW5lcmF0ZU1TUHJvamVjdChwcm9jZXNzLCBwcm9qZWN0LCBleHBvcnRPcHRpb25zKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmVzLnNhdmUobnVsbCk7Ci0KLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50TVNQcm9qZWN0KHByb2plY3QpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgbmV3IEV4cG9ydE1TUEV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEV4cG9ydHMgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyB0byBhIE1pY3Jvc29mdCBQcm9qZWN0Ci0JICogWE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgYSBNaWNyb3NvZnQgUHJvamVjdCBvYmplY3QKLQkgKiBAcGFyYW0gZXhwb3J0T3B0aW9ucwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCBvcHRpb25zCi0JICogQHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2VuZXJhdGVNU1Byb2plY3QoUHJvY2VzcyBwcm9jZXNzLCBQcm9qZWN0IHByb2plY3QsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvY2VzcyA9PSBudWxsIHx8IHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZXhwb3J0T3B0aW9ucy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkvLyBHZXQgdGhlIGRlZmF1bHQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZQotCQkJCS8vIHByb2Nlc3MuCi0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJY29uZmlnID0gKChEZWxpdmVyeVByb2Nlc3MpIHByb2Nlc3MpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJfSBlbHNlIGlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQkJY29uZmlnID0gKChDYXBhYmlsaXR5UGF0dGVybikgcHJvY2VzcykuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDcmVhdGUgdGhlIHN1YiBmb2xkZXIgdG8gc3RvcmUgdGhlIHB1Ymxpc2hlZCBIVE1MIGNvbnRlbnQgZmlsZXMuCi0JCQljb250ZW50Rm9sZGVyTmFtZSA9IGNvbmZpZy5nZXROYW1lKCk7Ci0KLQkJCVB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zID0gZXhwb3J0T3B0aW9ucwotCQkJCQkuZ2V0UHVibGlzaGluZ09wdGlvbnMoKTsKLQkJCWlmIChwdWJsaXNoQ29udGVudFNpdGUgJiYgcHVibGlzaGluZ09wdGlvbnMgIT0gbnVsbCkgewotCQkJCUZpbGUgY29udGVudERpciA9IG5ldyBGaWxlKGV4cG9ydE9wdGlvbnMuZ2V0RXhwb3J0RGlyKCksCi0JCQkJCQljb250ZW50Rm9sZGVyTmFtZSk7Ci0JCQkJaWYgKCFjb250ZW50RGlyLmV4aXN0cygpKSB7Ci0JCQkJCWNvbnRlbnREaXIubWtkaXJzKCk7Ci0JCQkJfQotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB2aWVCdWlsZGVyIG1ldGhvZENvbmZpZyA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgY29uZmlnKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgdmllQnVpbGRlciBwdWJsaXNoQ29uZmlnT3B0aW9ucyA9ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgcHVibGlzaGluZ09wdGlvbnMpOwotCQkJCX0KLQotCQkJCS8vIFB1Ymxpc2ggdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbi4KLQkJCQlpZiAoIXB1Ymxpc2hDb25maWd1cmF0aW9uKGNvbnRlbnREaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGNvbmZpZywKLQkJCQkJCXB1Ymxpc2hpbmdPcHRpb25zKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzID0gZXhwb3J0T3B0aW9ucwotCQkJCQkuZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpOwotCi0JCQkvLyBHZW5lcmF0ZSB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIGZpbGUuCi0JCQkvLyBwb3B1bGF0ZSB0aGUgcHJvamVjdCdzIGF0dHJpYnV0ZXMKLQkJCXByb2plY3Quc2V0TmFtZShwcm9jZXNzLmdldE5hbWUoKSk7Ci0JCQlwcm9qZWN0LnNldFN0YXJ0RGF0ZShuZXcgRGF0ZSgpKTsKLQkJCXByb2plY3Quc2V0Q3JlYXRpb25EYXRlKG5ldyBEYXRlKCkpOwotCQkJcHJvamVjdC5zZXRMYXN0U2F2ZWQobmV3IERhdGUoKSk7Ci0JCQlwcm9qZWN0LnNldEZpbmlzaERhdGUobmV3IERhdGUoKSk7Ci0JCQkKLQkJCXNldFByb2plY3RFeHRlbmRlZEF0dHJpYnV0ZXMocHJvamVjdCk7Ci0KLQkJCWdlbmVyYXRlT3BlcmF0b25SdW4ocHJvY2VzcywgcHJvamVjdCwgY29uZmlnKTsKLQkJCQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlT3BlcmF0b25SdW4oUHJvY2VzcyBwcm9jZXNzLCBQcm9qZWN0IHByb2plY3QsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFByb2Nlc3MgZnByb2Nlc3MgPSBwcm9jZXNzOwotCQlmaW5hbCBQcm9qZWN0IGZwcm9qZWN0ID0gcHJvamVjdDsKLQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBmY29uZmlnID0gY29uZmlnOwotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhFeHBvcnRNU1BSZXNvdXJjZXMuZXhwb3J0TVNQV2l6YXJkX3RpdGxlLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0KLQkJCQkJZ2VuZXJhdGUoZnByb2Nlc3MsIGZwcm9qZWN0LCBmY29uZmlnKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCXBtRGlhbG9nLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZShQcm9jZXNzIHByb2Nlc3MsIFByb2plY3QgcHJvamVjdCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2VzKHByb2Nlc3MsIGNvbmZpZywgcHJvamVjdCk7Ci0JCWdlbmVyYXRlUHJvamVjdFRhc2tzKHByb2Nlc3MsIGNvbmZpZywgcHJvamVjdCk7Ci0JCWdlbmVyYXRlTGlua3MocHJvY2VzcywgcHJvamVjdCk7Ci0JCWdlbmVyYXRlV1BEcyhjb25maWcpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4cG9ydCBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnRPcHRpb25zCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgdXNlciBzcGVjaWZpZWQgZXhwb3J0IG9wdGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBvcnRPcHRpb25zKEV4cG9ydE9wdGlvbnMgZXhwb3J0T3B0aW9ucykgewotCQlCb29sZWFuIGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMgPSAoQm9vbGVhbikgZXhwb3J0T3B0aW9ucwotCQkJCS5nZXQoRXhwb3J0T3B0aW9ucy5FWFBPUlRfT05MWV9QTEFOTkVEX0VMRU1FTlRTKTsKLQkJdGhpcy5leHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzID0gZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIHByb2plY3QgcmVzb3VyY2VzIGZvciBhbGwgdGhlIHRhc2sgZGVzY3JpcHRvcnMgaW4gdGhlCi0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBwcm9jZXNzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiB1c2VkIHRvIGZpbHRlciB0aGUgd29yayBicmVha2Rvd24KLQkgKiAgICAgICAgICAgIGVsZW1lbnRzIGluIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIGFuIG9iamVjdCB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGdlbmVyYXRpbmcgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFdCUwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFJlc291cmNlcyhQcm9jZXNzIHByb2Nlc3MsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVUQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCS5zZXRGaWx0ZXIobmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnKSk7Ci0JCQl9Ci0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQotCQkJTGlzdCBlbGVtZW50cyA9IHByb2Nlc3MuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPiAwKSB7Ci0JCQkJZ2VuZXJhdGVQcm9qZWN0UmVzb3VyY2UoY29udGVudFByb3ZpZGVyLAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIHByb2Nlc3MsIHByb2plY3QpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgcHJvamVjdCByZXNvdXJjZXMgZm9yIGFsbCB0aGUgcm9sZSBkZXNjcmlwdG9ycyBpbiB0aGUKLQkgKiBwcm9jZXNzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFJlc291cmNlKAotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBQcm9qZWN0IHByb2plY3QpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQl8fCBicmVha2Rvd25FbGVtZW50LmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKQotCQkJCXx8IChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmICFicmVha2Rvd25FbGVtZW50Ci0JCQkJCQkuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlhZGRSZXNvdXJjZShicmVha2Rvd25FbGVtZW50LCBwcm9qZWN0KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlPYmplY3QgdmFsdWUgPSBwcm92aWRlci5nZXRWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJYWRkUmVzb3VyY2UoKEJyZWFrZG93bkVsZW1lbnQpIHZhbHVlLCBwcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCWFkZFJlc291cmNlKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCBwcm9qZWN0KTsKLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBwcm92aWRlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkJCQkJT2JqZWN0IHZhbHVlID0gcHJvdmlkZXIuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWdlbmVyYXRlUHJvamVjdFJlc291cmNlKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSB2YWx1ZSwgcHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlnZW5lcmF0ZVByb2plY3RSZXNvdXJjZShjb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCBwcm9qZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8vIGZvciBlYWNoIFJvbGVEZXNjcmlwdG9yLCBjcmVhdGUgYSBNUyBQcm9qZWN0IHJlc291cmNlCi0JLy8gZm9yIHRoZSBSb2xlRGVzY3JpcHRvciBhbmQgaXRzIHVuZGVybHlpbmcgcm9sZSwgcmVtZW1iZXIgdGhlIGFzc2lnbmVkCi0JLy8gcmVzX3VpZAotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlKEJyZWFrZG93bkVsZW1lbnQgYnJlYWtkb3duRWxlbWVudCwgUHJvamVjdCBwcm9qKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghKGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHVuZGVybHlpbmcgcm9sZSBvZiB0aGlzIHJvbGVEZXNjcmlwdG9yCi0JCS8vIGFuZCBza2lwIHRoZSBjcmVhdGlvbiBpZiBhIHJlc291cmNlIGZvciB0aGUgcm9sZSBhbHJlYWR5IGV4aXN0cwotCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzY3JpcHRvciA9IChSb2xlRGVzY3JpcHRvcikgYnJlYWtkb3duRWxlbWVudDsKLQkJaWYgKGRlYnVnKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgaGFuZGxlIFJvbGVEZXNjcmlwdG9yID0gIiArIHJvbGVEZXNjcmlwdG9yKTsgLy8kTk9OLU5MUy0xJAotCQlSb2xlIHJlZl9lZFJvbGUgPSByb2xlRGVzY3JpcHRvci5nZXRSb2xlKCk7Ci0JCWlmIChkZWJ1ZykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGhhbmRsZSBSZWYtZWQgUm9sZSA9ICIgKyByZWZfZWRSb2xlKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGNoZWNrIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyByZXNvdXJjZSBiYXNlZCBvbiBSb2xlRGVzY3JpcHRvcidzIGRpc3BseQotCQkvLyBuYW1lCi0JCWJvb2xlYW4gbmV3UkRSZXNvdXJjZSA9IHRydWU7Ci0JCVN0cmluZyByZFJlc291cmNlTmFtZSA9IGdldERpc3BsYXlOYW1lKHJvbGVEZXNjcmlwdG9yKTsKLQkJaWYgKHJvbGVzVG9VaWRNYXAuZ2V0KHJkUmVzb3VyY2VOYW1lKSAhPSBudWxsKSB7Ci0JCQluZXdSRFJlc291cmNlID0gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayB0aGUgbmVlZCB0byBhZGQgYSBuZXcgcmVzb3VyY2UgYmFzZWQgb24gYXNzb2NpYXRlZCByb2xlJ3MKLQkJLy8gZGlzcGx5IG5hbWUKLQkJYm9vbGVhbiBuZXdSb2xlUmVvdXJjZSA9IGZhbHNlOwotCQlTdHJpbmcgcm9sZVJlc291cmNlTmFtZSA9IG51bGw7Ci0JCWlmIChyZWZfZWRSb2xlICE9IG51bGwKLQkJCQkmJiByb2xlc1RvVWlkTWFwCi0JCQkJCQkuZ2V0KChyb2xlUmVzb3VyY2VOYW1lID0gZ2V0RGlzcGxheU5hbWUocmVmX2VkUm9sZSkpKSA9PSBudWxsCi0JCQkJJiYgIXJvbGVSZXNvdXJjZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShyZFJlc291cmNlTmFtZSkpIHsKLQkJCW5ld1JvbGVSZW91cmNlID0gdHJ1ZTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIHJlc291cmNlIGZvciB0aGUgUm9sZURlc2NyaXB0b3IKLQkJaWYgKG5ld1JEUmVzb3VyY2UpIHsKLQkJCVJlc291cmNlIGFSZXMgPSBwcm9qZWN0RmFjdG9yeS5jcmVhdGVSZXNvdXJjZSgpOwotCi0JCQlhUmVzLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJYVJlcy5zZXROYW1lKHJkUmVzb3VyY2VOYW1lKTsKLQkJCXByb2ouZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2UoKS5hZGQoYVJlcyk7Ci0KLQkJCXJvbGVzVG9VaWRNYXAucHV0KHJkUmVzb3VyY2VOYW1lLCBCaWdJbnRlZ2VyLnZhbHVlT2YocmVzX3VpZCkpOwotCQkJcmVzX3VpZCsrOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoZSB1bmRlcmx5aW5nIGFzc29jaWF0ZWQgcm9sZSB0b28KLQkJaWYgKG5ld1JvbGVSZW91cmNlKSB7Ci0JCQlSZXNvdXJjZSBhUmVzID0gcHJvamVjdEZhY3RvcnkuY3JlYXRlUmVzb3VyY2UoKTsKLQotCQkJYVJlcy5zZXRVSUQoQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCWFSZXMuc2V0SUQoQmlnSW50ZWdlci52YWx1ZU9mKHJlc191aWQpKTsKLQkJCWFSZXMuc2V0TmFtZShyb2xlUmVzb3VyY2VOYW1lKTsKLQkJCXByb2ouZ2V0UmVzb3VyY2VzKCkuZ2V0UmVzb3VyY2UoKS5hZGQoYVJlcyk7Ci0KLQkJCXJvbGVzVG9VaWRNYXAucHV0KHJvbGVSZXNvdXJjZU5hbWUsIEJpZ0ludGVnZXIudmFsdWVPZihyZXNfdWlkKSk7Ci0JCQlyZXNfdWlkKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIE1TIFByb2plY3QgV0JTIGZvciBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeQotCSAqIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgcHJvY2VzcwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdXNlZCB0byBmaWx0ZXIgdGhlIHdvcmsgYnJlYWtkb3duCi0JICogICAgICAgICAgICBlbGVtZW50cyBpbiB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhbiBvYmplY3QgdG8gc3RvcmUgdGhlIGdlbmVyYXRlZCBNaWNyb3NvZnQgUHJvamVjdCBXQlMKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBnZW5lcmF0aW5nIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBXQlMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVByb2plY3RUYXNrcyhQcm9jZXNzIHByb2Nlc3MsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gU2F2ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBleHBvcnRlZCBwcm9jZXNzLgotCQl0aGlzLnByb2Nlc3MgPSBwcm9jZXNzOwotCi0JCXdic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIEFkZCB0aGUgc3VwcHJlc3Npb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2VzcyB0byBiZQotCQkJLy8gZXhwb3J0ZWQKLQkJCS8vIHRvIHRoZSBzdXBwcmVzc2lvbiBtYXAuCi0JCQlzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jZXNzKTsKLQkJCXN1cHByZXNzaW9uTWFwLnB1dChwcm9jZXNzLCBzdXBwcmVzc2lvbik7Ci0KLQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlicmVha2Rvd25FbGVtZW50RmlsdGVyID0gbmV3IFByb2Nlc3NDb25maWd1cmF0b3IoY29uZmlnKTsKLQkJCXdic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihicmVha2Rvd25FbGVtZW50RmlsdGVyKTsKLQotCQkJd2JzQ29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCQl3YnNBZGFwdGVyRmFjdG9yeSk7Ci0KLQkJCS8vIHRlc3QKLQkJCS8vIGVudW1lcmF0ZVByb2Nlc3NQcmVkZWNlc3Nvckxpc3RzKCk7Ci0KLQkJCWN1cnJlbnRFbGVtZW50ID0gcHJvY2VzczsKLQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlnZW5lcmF0ZVByb2plY3RUYXNrKHdic0NvbnRlbnRQcm92aWRlciwKLQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBwcm9jZXNzLCAxLCBwcm9qZWN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlzdCBicmVha2Rvd25FbGVtZW50cyA9IHByb2Nlc3MuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCQlpZiAoYnJlYWtkb3duRWxlbWVudHMuc2l6ZSgpID4gMCkgewotCQkJCQlnZW5lcmF0ZVByb2plY3RUYXNrKHdic0NvbnRlbnRQcm92aWRlciwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcHJvY2VzcywgMSwgcHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWlmIChzdXBwcmVzc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQkJc3VwcHJlc3Npb25NYXAuY2xlYXIoKTsKLQkJCQlzdXBwcmVzc2lvbk1hcCA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAod2JzQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQl3YnNDb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVudW1lcmF0ZVByb2Nlc3NQcmVkZWNlc3Nvckxpc3RzKCkgewotCQkvLyBXQlMgdHJlZQotCQlJdGVyYXRvciB3YnNUcmVlSXRlcmF0b3IgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJd2JzQWRhcHRlckZhY3RvcnksIHByb2Nlc3MpOwotCQlPYmplY3Qgb2JqOwotCQl3aGlsZSAod2JzVHJlZUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJb2JqID0gd2JzVHJlZUl0ZXJhdG9yLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHJlZUl0ZXJhdG9yOiAiICsgb2JqKTsgLy8kTk9OLU5MUy0xJAotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSB3YnNBZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJUHJlZGVjZXNzb3JMaXN0IHByZWRMaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlCU0l0ZW1Qcm92aWRlciBlID0gKElCU0l0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgcHJlZExpc3Q6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICB1bndyYXBwZWRQcmVkTGlzdDogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIE1pY3Jvc2Z0IFByb2plY3QgdGFzayBmb3IgYSBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFByb3ZpZGVyCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgcHJvdmlkZXIKLQkgKiBAcGFyYW0gYnJlYWtkb3duRWxlbWVudAotCSAqICAgICAgICAgICAgYSBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBzdHJCdWYKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+U3RyaW5nQnVmZmVyPC9jb2RlPiB0byBzdG9yZSB0aGUgZ2VuZXJhdGVkIFhNTAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlUHJvamVjdFRhc2soCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlPYmplY3QgZWxlbWVudE9yV3JhcHBlciwgaW50IHRhc2tPTGV2ZWwsIFByb2plY3QgcHJvaikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkudW53cmFwKGVsZW1lbnRPcldyYXBwZXIpOwotCi0JCS8vIG5vdCByZWFsbHkgbmVjY2Vzc2FyeSBoZXJlCi0JCWlmIChicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJfHwgYnJlYWtkb3duRWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yCi0JCQkJfHwgYnJlYWtkb3duRWxlbWVudC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkKLQkJCQl8fCAoZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyAmJiAhYnJlYWtkb3duRWxlbWVudAotCQkJCQkJLmdldElzUGxhbm5lZCgpLmJvb2xlYW5WYWx1ZSgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1N1YlRhc2tzUGxhbm5lZCA9IGZhbHNlOwotCQlpZiAoZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cyAmJiBicmVha2Rvd25FbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkmJiBjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCXx8ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCB3cmFwcGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJCXx8ICgoQWN0aXZpdHkpIHdyYXBwZWRFbGVtZW50KS5nZXRJc1BsYW5uZWQoKQotCQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJCXx8IGRlc2NyaXB0b3IuZ2V0SXNQbGFubmVkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCB3cmFwcGVkRWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGVsZW1lbnQpOwotCQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJVGFza0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgd3JhcHBlZEVsZW1lbnQ7Ci0JCQkJCQlpZiAoIWV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCWlzU3ViVGFza3NQbGFubmVkID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSBhIHRhc2sgZm9yIHRoZSBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkvLyBkZWNpZGVkIGp1c3QgdG8gY2hlY2sgdGhlIGlzUGxhbm5lZCBmbGFnIG9uIHRoZSBXQlMKLQkJYm9vbGVhbiBpc1BsYW5uZWRUYXNrID0gYnJlYWtkb3duRWxlbWVudC5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKTsKLQkJVGFzayBuZXdUYXNrID0gbnVsbDsKLQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzIHx8IGV4cG9ydE9ubHlQbGFubmVkRWxlbWVudHMKLQkJCQkmJiBpc1BsYW5uZWRUYXNrKSB7Ci0JCQlib29sZWFuIHN1cHByZXNzZWQgPSBpc1N1cHByZXNzZWQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAoIXN1cHByZXNzZWQpIHsKLQkJCQluZXdUYXNrID0gYWRkVGFzayhlbGVtZW50T3JXcmFwcGVyLCB0YXNrT0xldmVsLCBwcm9qKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIGV4cG9ydCBwbGFubmVkIG9ubHkgd2JzLCB0aGVuIHdlIG5lZWQgdG8gZG8gdGhlIHJvbGUgcm9sbHVwCi0JCS8vIGNhbGN1bGF0aW9uCi0JCWlmIChleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzICYmIG5ld1Rhc2sgIT0gbnVsbAotCQkJCSYmIGJyZWFrZG93bkVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmIGNvbnRlbnRQcm92aWRlciAhPSBudWxsICYmICFpc1N1YlRhc2tzUGxhbm5lZCkgewotCQkJQXJyYXlMaXN0IHJvbGx1cFJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiByYiA9IGNhbGN1bGF0ZVJvbGx1cFJvbGVzKGNvbnRlbnRQcm92aWRlciwKLQkJCQkJYnJlYWtkb3duRWxlbWVudCwgcm9sbHVwUm9sZXMpOwotCQkJLy8gaWYgdGhlIHdob2xlIHN1YnRyZWUgb2YgdGhlIGJyZWFrZG93bkVsZW1udCBpcyBub3QgcGxhbm5lZAotCQkJLy8gdGhlbiByb2xsIHVwIGFsbCB0aGUgcm9sZXMKLQkJCWlmICghcmIpIHsKLQkJCQlIYXNoU2V0IHJvbGVzU2V0ID0gbmV3IEhhc2hTZXQocm9sbHVwUm9sZXMpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJvbGVzU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgcm9sZU5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJYWRkQXNzaWdubWVudChyb2xlTmFtZSwgbmV3VGFzay5nZXRVSUQoKS5pbnRWYWx1ZSgpLCBwcm9qKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBleHBvcnQgdGhlIG5leHQgbGV2ZWwgd2JzCi0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzdXBwcmVzc2VkID0gaXNTdXBwcmVzc2VkKGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKCFzdXBwcmVzc2VkKSB7Ci0JCQkJZWxlbWVudFBhdGhzLnB1c2goYnJlYWtkb3duRWxlbWVudC5nZXRHdWlkKCkpOwotCQkJCU9iamVjdFtdIGVsZW1lbnRzID0gY29udGVudFByb3ZpZGVyCi0JCQkJCQkuZ2V0RWxlbWVudHMoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCi0JCQkJCS8vIGdldCB0aGUgY3VycmVudCBlbGVtZW50T3JXcmFwcGVyIGFuZCB0aGUgaGllcmFyY2FsIGd1aWQKLQkJCQkJLy8gcGF0aCB0byBpdAotCQkJCQljdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tlbGVtZW50UGF0aHMuc2l6ZSgpXTsKLQkJCQkJZWxlbWVudFBhdGhzLnRvQXJyYXkocGF0aHMpOwotCQkJCQlTdHJpbmdCdWZmZXIgcGF0aFN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwYXRocy5sZW5ndGg7IGorKykgewotCQkJCQkJcGF0aFN0ci5hcHBlbmQocGF0aHNbal0gKyAiLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGN1cnJlbnRFbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCU9iamVjdCB3cmFwcGVkID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIHdyYXBwZWQpLmdldEd1aWQoKSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoU3RyLmFwcGVuZCgoKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRFbGVtZW50KQotCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJfQotCQkJCQljdXJyZW50RWxlbWVudFBhdGggPSBwYXRoU3RyLnRvU3RyaW5nKCk7Ci0JCQkJCS8vIGlmIChkZWJ1ZykgU3lzdGVtLm91dC5wcmludGxuKCIgcGF0aDogIiArCi0JCQkJCS8vIGN1cnJlbnRFbGVtZW50UGF0aCk7Ci0KLQkJCQkJZ2VuZXJhdGVQcm9qZWN0VGFzayhjb250ZW50UHJvdmlkZXIsIGVsZW1lbnQsCi0JCQkJCQkJdGFza09MZXZlbCArIDEsIHByb2opOwotCQkJCX0KLQkJCQlnZW5lcmF0ZUxpbmtzKHByb2Nlc3MsIHByb2opOwotCQkJCWVsZW1lbnRQYXRocy5wb3AoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBpcyBhIHN1cHByZXNzZWQgd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhbiBvYmplY3QKLQkgKiBAcmV0dXJuIDxvY2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYSBzdXBwcmVzc2VkIHdvcmsgYnJlYWtkb3duCi0JICogICAgICAgICBlbGVtZW50IGluIGl0cyBvd25pbmcgcHJvY2Vzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGRlYnVnKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlc2NyaXB0b3IgPSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrICgoRGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCkpOwotCQkJfQotCQkJUHJvY2VzcyBvd25pbmdQcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKG9iamVjdCk7Ci0JCQlTdXBwcmVzc2lvbiBvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24gPSAoU3VwcHJlc3Npb24pIHN1cHByZXNzaW9uTWFwCi0JCQkJCS5nZXQob3duaW5nUHJvY2Vzcyk7Ci0JCQlpZiAob3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uID09IG51bGwpIHsKLQkJCQlvd25pbmdQcm9jZXNzU3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ob3duaW5nUHJvY2Vzcyk7Ci0JCQkJc3VwcHJlc3Npb25NYXAucHV0KG93bmluZ1Byb2Nlc3MsIG93bmluZ1Byb2Nlc3NTdXBwcmVzc2lvbik7Ci0JCQl9Ci0JCQlpZiAob3duaW5nUHJvY2Vzc1N1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAob3duaW5nUHJvY2VzcyAhPSBwcm9jZXNzCi0JCQkJCSYmIG9iamVjdCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJZWxlbWVudFBhdGhzLnB1c2goKChXb3JrQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0KS5nZXRHdWlkKCkpOwotCQkJCVN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tlbGVtZW50UGF0aHMuc2l6ZSgpXTsKLQkJCQllbGVtZW50UGF0aHMudG9BcnJheShwYXRocyk7Ci0JCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXBwcmVzc2lvbi5nZXRPYmplY3RCeVBhdGgocGF0aHMsCi0JCQkJCQl3YnNBZGFwdGVyRmFjdG9yeSk7Ci0JCQkJZWxlbWVudFBhdGhzLnBvcCgpOwotCQkJCXJldHVybiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQod3JhcHBlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB0YXNrIHRvIGEgTWljcm9zb2Z0IFByb2plY3QuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSB0YXNrT0xldmVsCi0JICogICAgICAgICAgICB0aGUgb3V0bGluZSBsZXZlbAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICBhIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGFkZGVkIHRhc2sKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFRhc2sgYWRkVGFzayhPYmplY3QgZWxlbWVudE9yV3JhcHBlciwgaW50IHRhc2tPTGV2ZWwsCi0JCQlQcm9qZWN0IHByb2plY3QpIHRocm93cyBFeGNlcHRpb24gewotCQlUYXNrIHRhc2sgPSBhZGRUYXNrXyhlbGVtZW50T3JXcmFwcGVyLCB0YXNrT0xldmVsLCBwcm9qZWN0KTsKLQkJaWYgKHRhc2sgIT0gbnVsbCkgewotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCS51bndyYXAoZWxlbWVudE9yV3JhcHBlcik7Ci0JCQl0YXNrVG9XYmVNYXAucHV0KHRhc2ssIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQkKLQlwcml2YXRlIFRhc2sgYWRkVGFza18oT2JqZWN0IGVsZW1lbnRPcldyYXBwZXIsIGludCB0YXNrT0xldmVsLAotCQkJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoZWxlbWVudE9yV3JhcHBlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVdvcmtCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkudW53cmFwKGVsZW1lbnRPcldyYXBwZXIpOwotCQkKLQkJVGFzayB0YXNrID0gcHJvamVjdEZhY3RvcnkuY3JlYXRlVGFzaygpOwotCQl0YXNrLnNldE5hbWUoZ2V0RGlzcGxheU5hbWUoZWxlbWVudCkpOwotCQl0YXNrLnNldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza09MZXZlbCkpOwotCQl0YXNrLnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza191aWQpKTsKLQkJdGFzay5zZXRJRChCaWdJbnRlZ2VyLnZhbHVlT2YodGFza191aWQpKTsKLQkJdGFzay5zZXRUeXBlKEJpZ0ludGVnZXIudmFsdWVPZigwKSk7Ci0KLQkJR3JlZ29yaWFuQ2FsZW5kYXIgZ2NEYXRlID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7Ci0JCS8vIGdjRGF0ZS5hZGQoR3JlZ29yaWFuQ2FsZW5kYXIuREFURSwgODApOwotCQlEYXRlIHN0YXJ0RGF0ZSA9IGdjRGF0ZS5nZXRUaW1lKCk7Ci0JCXRhc2suc2V0U3RhcnQoc3RhcnREYXRlKTsKLQkJLy8gdGFzay5zZXREdXJhdGlvbigiUFQyMEgwTTBTIik7Ci0KLQkJU3RyaW5nIG5vdGVzID0gZ2V0QnJpZWZEZXNjcmlwdGlvbihlbGVtZW50KTsKLQkJaWYgKG5vdGVzICE9IG51bGwgJiYgbm90ZXMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJdGFzay5zZXROb3Rlcyhub3Rlcyk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJdGFzay5zZXRNaWxlc3RvbmUodHJ1ZSk7Ci0JCQl0YXNrLnNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIudmFsdWVPZig3KSk7Ci0JCX0KLQotCQkvLyBBc3NpZ24gdGhlIHRhc2sgdG8gYWxsIHRoZSBhc3NvY2lhdGVkIHJvbGVzLgotCQlMaXN0IHJvbGVzTGlzdCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJvbGVzTGlzdCA9IGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrKSB7Ci0JCQlyb2xlc0xpc3QgPSBnZXRSb2xlc0ZvclRhc2soKG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzaykgZWxlbWVudCk7Ci0JCX0KLQkJaWYgKHJvbGVzTGlzdCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHJvbGVOYW1lID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJYWRkQXNzaWdubWVudChyb2xlTmFtZSwgdGFza191aWQsIHByb2plY3QpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSBnZW5lcmF0ZWQgVVJMIGxpbmsgdG8gdGhlIHRhc2suCi0JCWlmIChwdWJsaXNoQ29udGVudFNpdGUpIHsKLQkJCVN0cmluZyBsaW5rVVJMID0gZ2V0RWxlbWVudFVSTChlbGVtZW50KTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgcmVmX2VkVGFzayA9IHRhc2tEZXNjcmlwdG9yLmdldFRhc2soKTsKLQkJCQlyZWZlcmVuY2VkVGFza3MuYWRkKHJlZl9lZFRhc2spOwotCQkJfQotCQkJdGFzay5zZXRIeXBlcmxpbmtBZGRyZXNzKGxpbmtVUkwpOwotCQl9Ci0KLQkJLy8gYVRhc2suc2V0VHlwZShuZXcgQmlnSW50ZWdlcigiMSIpKTsKLQkJLy8gYVRhc2suc2V0U3RhcnQobmV3IERhdGUoKSk7Ci0JCS8vIGFUYXNrLnNldFN1bW1hcnkoZmFsc2UpOwotCQkvLyBhVGFzay5zZXRDb25zdHJhaW50VHlwZShuZXcgQmlnSW50ZWdlcigiMiIpKTsKLQotCQkvLyBBZGQgdGhlIHRhc2sgdG8gdGhlIE1pY3Jvc29mdCBQcm9qZWN0IG9iamVjdC4KLQkJcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKS5hZGQodGFzayk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCB0aGVDdXJyZW50IGVsZW1lbnQ6IHRhc2tVaWQ9IiArIHRhc2tfdWlkIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiLCAiICsgY3VycmVudEVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgIHBhdGg6ICIgKyBjdXJyZW50RWxlbWVudFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBTdG9yZSB0aGUgdGFzaydzIGxvY2FsIHByZWRlY2Vzc29ycy4KLQkJc3RvcmVUYXNrUHJlZGVjZXNzb3JzKGVsZW1lbnQpOwotCi0JCXRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAucHV0KEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCksCi0JCQkJY3VycmVudEVsZW1lbnRQYXRoKTsKLQkJd2JzR3VpZFRvVGFza1VpZE1hcAotCQkJCS5wdXQoZWxlbWVudC5nZXRHdWlkKCksIEJpZ0ludGVnZXIudmFsdWVPZih0YXNrX3VpZCkpOwotCi0JCS8vIGdldCBwcmVkZWNlc3NvcnMgb2YgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgd2JzQWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJZWxlbWVudE9yV3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJUHJlZGVjZXNzb3JMaXN0IGN1cnJlbnRQcmVkTGlzdCA9IGFkYXB0ZXIuZ2V0UHJlZGVjZXNzb3JzKCk7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gZ3VpZFByZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlYnVnKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHdyYXBwZXJQcmVkTGlzdE1lbWJlcjogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3QgdW53cmFwcGVkRSA9IFRuZ1V0aWwudW53cmFwKGUpOwotCQkJaWYgKHVud3JhcHBlZEUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCS8vZ3VpZFByZWRMaXN0LmFkZCgoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKS5nZXRHdWlkKCkpOwotCQkJCWd1aWRQcmVkTGlzdC5hZGQoKFdvcmtCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKTsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0TWVtYmVyOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHVud3JhcHBlZEUpOwotCQkJfQotCQkJaWYgKGUgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJdW53cmFwcGVkRSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJLy9ndWlkUHJlZExpc3QuYWRkKCgoQnJlYWtkb3duRWxlbWVudCkgdW53cmFwcGVkRSkuZ2V0R3VpZCgpKTsKLQkJCQlndWlkUHJlZExpc3QuYWRkKChCcmVha2Rvd25FbGVtZW50KSB1bndyYXBwZWRFKTsKLQkJCQlpZiAoZGVidWcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIHVud3JhcHBlZFByZWRMaXN0TWVtYmVyOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHVud3JhcHBlZEUpOwotCQkJfQotCQl9Ci0JCXdic1dyYXBwZXJQYXRoVG9QcmVkTGlzdE1hcC5wdXQoY3VycmVudEVsZW1lbnRQYXRoLCBndWlkUHJlZExpc3QpOwotCQlpZiAoZGVidWcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBfX3dyYXBwZXJQcmVkTGlzdDogIiArIGd1aWRQcmVkTGlzdCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0YXNrX3VpZCsrOwotCi0JCXJldHVybiB0YXNrOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGJyaWVmRGVzYyA9IGVsZW1lbnQuZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQlpZiAoKGJyaWVmRGVzYyA9PSBudWxsIHx8IGJyaWVmRGVzYy50cmltKCkubGVuZ3RoKCkgPD0gMCkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgcmVmX2VkVGFzayA9IHRhc2tEZXNjcmlwdG9yLmdldFRhc2soKTsKLQkJCQlpZiAocmVmX2VkVGFzayAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcmVhbGl6ZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChyZWZfZWRUYXNrLCBwcm9jZXNzQ29uZmlnKTsKLQkJCQkJaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCByZWFsaXplZEVsZW1lbnQgPSAiICsgcmVhbGl6ZWRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAocmVhbGl6ZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQlPYmplY3QgYnJpZWZEZXNjT2JqID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHJlYWxpemVkRWxlbWVudCwgYXR0cmlidXRlLCBwcm9jZXNzQ29uZmlnKTsKLQkJCQkJCWJyaWVmRGVzYyA9IGJyaWVmRGVzY09iai50b1N0cmluZygpOwotCQkJCQkJaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCByZWFsaXplZCBicmllZiBkZXNjID0gIiArIGJyaWVmRGVzYyk7CSAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnJpZWZEZXNjOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBc3NpZ25tZW50KFN0cmluZyByZXNOYW1lLCBpbnQgdGFza1VpZCwgUHJvamVjdCBwcm9qKSB7Ci0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHByb2plY3RGYWN0b3J5LmNyZWF0ZUFzc2lnbm1lbnQoKTsKLQotCQlhc3NpZ25tZW50LnNldFVJRChCaWdJbnRlZ2VyLnZhbHVlT2YoYXNzaWduX3VpZCkpOwotCQlhc3NpZ25tZW50LnNldFRhc2tVSUQoQmlnSW50ZWdlci52YWx1ZU9mKHRhc2tVaWQpKTsKLQkJQmlnSW50ZWdlciByZXNJRCA9IChCaWdJbnRlZ2VyKSByb2xlc1RvVWlkTWFwLmdldChyZXNOYW1lKTsKLQkJYXNzaWdubWVudC5zZXRSZXNvdXJjZVVJRChyZXNJRCk7Ci0KLQkJcHJvai5nZXRBc3NpZ25tZW50cygpLmdldEFzc2lnbm1lbnQoKS5hZGQoYXNzaWdubWVudCk7Ci0KLQkJYXNzaWduX3VpZCsrOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSb2xlc0ZvclRhc2tEKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yKSB7Ci0JCUFycmF5TGlzdCByb2xlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChSb2xlRGVzY3JpcHRvciByZCA6IHRhc2tEZXNjcmlwdG9yLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpIHsKLQotCQkJLy8gUm9sZURlc2NyaXB0b3Igcm9sZURlc2NycCA9Ci0JCQkvLyB0YXNrRGVzY3JpcHRvci5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NycCA9IChSb2xlRGVzY3JpcHRvcikgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQocmQsIGJyZWFrZG93bkVsZW1lbnRGaWx0ZXIKLQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQkJaWYgKHJvbGVEZXNjcnAgIT0gbnVsbCkgewotCQkJCXJvbGVzTGlzdC5hZGQoZ2V0RGlzcGxheU5hbWUocm9sZURlc2NycCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gTGlzdCByb2xlRGVzY3JwTGlzdCA9Ci0JCS8vIHRhc2tEZXNjcmlwdG9yLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCUxpc3Qgcm9sZURlc2NycExpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50cygKLQkJCQl0YXNrRGVzY3JpcHRvci5nZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCWJyZWFrZG93bkVsZW1lbnRGaWx0ZXIuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY3JwTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcnAgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlRGVzY3JwKSk7Ci0JCX0KLQotCQlyZXR1cm4gcm9sZXNMaXN0OwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRSb2xlc0ZvclRhc2sob3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrIHVtYVRhc2spIHsKLQkJQXJyYXlMaXN0IHJvbGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKFJvbGUgcm9sZTogdW1hVGFzay5nZXRQZXJmb3JtZWRCeSgpKSB7Ci0JCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJcm9sZXNMaXN0LmFkZChnZXREaXNwbGF5TmFtZShyb2xlKSk7Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGxpc3QgPSB1bWFUYXNrLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgaXRlci5uZXh0KCk7Ci0JCQlyb2xlc0xpc3QuYWRkKGdldERpc3BsYXlOYW1lKHJvbGUpKTsKLQkJfQotCi0JCXJldHVybiByb2xlc0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQkJQnJlYWtkb3duRWxlbWVudCBicmVha2Rvd25FbGVtZW50LCBMaXN0IHJvbGx1cFJvbGVzKSB7Ci0KLQkJYm9vbGVhbiBpc0FueVN1YlRhc2tQbGFubmVkID0gZmFsc2U7Ci0KLQkJT2JqZWN0W10gZWxlbWVudHMgPSBjb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoYnJlYWtkb3duRWxlbWVudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQl8fCAoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gY2FsY3VsYXRlUm9sbHVwUm9sZXMoY29udGVudFByb3ZpZGVyLAotCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50LCByb2xsdXBSb2xlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IHdyYXBwZWRFbGVtZW50ID0gVG5nVXRpbC51bndyYXAoZWxlbWVudCk7Ci0JCQkJaWYgKHdyYXBwZWRFbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgKChBY3Rpdml0eSkgd3JhcHBlZEVsZW1lbnQpLmdldElzUGxhbm5lZCgpCi0JCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCWlzQW55U3ViVGFza1BsYW5uZWQgPSB0cnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IGNhbGN1bGF0ZVJvbGx1cFJvbGVzKAotCQkJCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSB3cmFwcGVkRWxlbWVudCwgcm9sbHVwUm9sZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCWlmICghZXhwb3J0T25seVBsYW5uZWRFbGVtZW50cwotCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpc0FueVN1YlRhc2tQbGFubmVkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCS5hZGRBbGwoZ2V0Um9sZXNGb3JUYXNrRCgoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlPYmplY3Qgd3JhcHBlZEVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAod3JhcHBlZEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudDsKLQkJCQkJaWYgKCFleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzCi0JCQkJCQkJfHwgZGVzY3JpcHRvci5nZXRJc1BsYW5uZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJaXNBbnlTdWJUYXNrUGxhbm5lZCA9IHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyb2xsdXBSb2xlcwotCQkJCQkJCQkuYWRkQWxsKGdldFJvbGVzRm9yVGFza0QoKFRhc2tEZXNjcmlwdG9yKSB3cmFwcGVkRWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGlzQW55U3ViVGFza1BsYW5uZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIGEgd29yayBicmVha2Rvd24gZWxlbWVudCdzIHByZWRlY2Vzc29ycywgc3RvcmVzIHRoZW0gaW4gYW4KLQkgKiA8b2NkZT5BcnJheUxpc3Q8L2NvZGU+LCBhbmQgcHV0IGl0IGludG8gYSBtYXAuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVRhc2tQcmVkZWNlc3NvcnMoV29ya0JyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHByZWRlY2Vzc29ycyA9IGVsZW1lbnQuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJTGlzdCBwcmVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsICYmIHByZWRlY2Vzc29ycy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwcmVkZWNlc3NvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IChXb3JrT3JkZXIpIGkubmV4dCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgcHJlZGVjZXNzb3IgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBsb2NhbFByZWRMaXN0TWVtYmVyOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHByZWRlY2Vzc29yKTsKLQkJCQl9Ci0JCQkJaWYgKHByZWRlY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHByZWRHdWlkID0gcHJlZGVjZXNzb3IuZ2V0R3VpZCgpOwotCQkJCQlpZiAocHJlZEd1aWQgIT0gbnVsbCkKLQkJCQkJCXByZWRMaXN0LmFkZChwcmVkR3VpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICBsb2NhbCBwcmVkbGlzdCBmb3IgIiArIGVsZW1lbnQuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiID0gIiArIHByZWRMaXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl3YnNXYXBwZXJQYXRoVG9Mb2NhbFByZWRMaXN0TWFwLnB1dChjdXJyZW50RWxlbWVudFBhdGgsIHByZWRMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUxpbmtzKFByb2Nlc3MgcHJvY2VzcywgUHJvamVjdCBwcm9qZWN0KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVMaXN0IHRhc2tzID0gcHJvamVjdC5nZXRUYXNrcygpLmdldFRhc2soKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdGFza3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgaXRlci5uZXh0KCk7Ci0JCQkKLQkJCUJpZ0ludGVnZXIgdGFza1VpZCA9IHRhc2suZ2V0VUlEKCk7Ci0JCQkvLyBza2lwIHRoZSBNUyBwcm9qZWN0IGhpZGRlbiB0YXNrIHdpdGggdWlkID0gMAotCQkJaWYgKHRhc2tVaWQuaW50VmFsdWUoKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlTdHJpbmcgd2JzUGF0aFN0ciA9IChTdHJpbmcpIHRhc2tVaWRUb1dic1dhcHBlclBhdGhNYXAuZ2V0KHRhc2tVaWQpOwotCi0JCQlIYXNoTWFwPFN0cmluZywgV29ya09yZGVyPiBwcmVkR3VpZFRvV09NYXAgPSBnZXRQcmVkR3VpZFRvV09NYXAodGFza1RvV2JlTWFwLmdldCh0YXNrKSk7Ci0JCQkKLQkJCS8vIExpc3QgcHJlZExpc3QgPSAoQXJyYXlMaXN0KQotCQkJLy8gd2JzV2FwcGVyUGF0aFRvTG9jYWxQcmVkTGlzdE1hcC5nZXQod2JzUGF0aFN0cik7Ci0JCQlMaXN0IHByZWRMaXN0ID0gKEFycmF5TGlzdCkgd2JzV3JhcHBlclBhdGhUb1ByZWRMaXN0TWFwCi0JCQkJCS5nZXQod2JzUGF0aFN0cik7Ci0JCQlpZiAocHJlZExpc3QgIT0gbnVsbCkgewotCQkJCUxpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJlZExpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCS8vU3RyaW5nIHByZWRHdWlkID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlNZXRob2RFbGVtZW50IHByZWRFbGVtID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJU3RyaW5nIHByZWRHdWlkID0gcHJlZEVsZW0uZ2V0R3VpZCgpOwotCQkJCQkKLQkJCQkJQmlnSW50ZWdlciBwcmVkVGFza1VpZCA9IChCaWdJbnRlZ2VyKSB3YnNHdWlkVG9UYXNrVWlkTWFwCi0JCQkJCQkJLmdldChwcmVkR3VpZCk7Ci0KLQkJCQkJaWYgKHByZWRUYXNrVWlkID09IG51bGwKLQkJCQkJCQl8fCBwcmVkVGFza1VpZC5pbnRWYWx1ZSgpID09IHRhc2tVaWQuaW50VmFsdWUoKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIHRhc2tVaWQgPSAiICsgdGFza1VpZCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIiwgd2JzUGF0aFN0ciA9ICIgKyB3YnNQYXRoU3RyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgbG9jYWxQcmVkTGlzdDogIiArIHByZWRMaXN0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgZm91bmQgcHJlZCBndWlkOiAiICsgcHJlZEd1aWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQkvL3JlbW92ZUxpc3QuYWRkKHByZWRHdWlkKTsKLQkJCQkJcmVtb3ZlTGlzdC5hZGQocHJlZEVsZW0pOwotCi0JCQkJCVByZWRlY2Vzc29yTGluayBwcmVMaW5rID0gcHJvamVjdEZhY3RvcnkKLQkJCQkJCQkuY3JlYXRlUHJlZGVjZXNzb3JMaW5rKCk7Ci0JCQkJCXRhc2suZ2V0UHJlZGVjZXNzb3JMaW5rKCkuYWRkKHByZUxpbmspOwotCQkJCQlwcmVMaW5rLnNldFByZWRlY2Vzc29yVUlEKHByZWRUYXNrVWlkKTsKLQkJCQkJCi0JCQkJCS8vcHJlTGluay5zZXRUeXBlKG5ldyBCaWdJbnRlZ2VyKCIxIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCUJpZ0ludGVnZXIgYmlnSW50ID0gZ2V0TGlua1R5cGVJbnQocHJlZEd1aWRUb1dPTWFwLmdldChwcmVkR3VpZCkpOwotCQkJCQlpZiAoYmlnSW50ICE9IG51bGwpIHsKLQkJCQkJCXByZUxpbmsuc2V0VHlwZShiaWdJbnQpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlwcmVMaW5rLnNldENyb3NzUHJvamVjdChmYWxzZSk7Ci0JCQkJCXByZUxpbmsuc2V0TGlua0xhZyhuZXcgQmlnSW50ZWdlcigiMCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmVMaW5rLnNldExhZ0Zvcm1hdChuZXcgQmlnSW50ZWdlcigiNyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwcmVkTGlzdC5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEJpZ0ludGVnZXIgZ2V0TGlua1R5cGVJbnQoV29ya09yZGVyIHdvKSB7Ci0JCWlmICh3byA9PSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc+IGdldExpbmtUeXBlSW50LCB3byA9PSBudWxsLiIpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJV29ya09yZGVyVHlwZSB3b1R5cGUgPSB3by5nZXRMaW5rVHlwZSgpOwotCQlpZiAod29UeXBlID09IFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoIjEiKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQlpZiAod29UeXBlID09IFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpIHsKLQkJCXJldHVybiBuZXcgQmlnSW50ZWdlcigiMyIpOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCWlmICh3b1R5cGUgPT0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKSB7Ci0JCQlyZXR1cm4gbmV3IEJpZ0ludGVnZXIoIjAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh3b1R5cGUgPT0gV29ya09yZGVyVHlwZS5TVEFSVF9UT19GSU5JU0gpIHsKLQkJCXJldHVybiBuZXcgQmlnSW50ZWdlcigiMiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgV29ya09yZGVyPiBnZXRQcmVkR3VpZFRvV09NYXAoV29ya0JyZWFrZG93bkVsZW1lbnQgd2JlKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBXb3JrT3JkZXI+IHByZWRHdWlkVG9XT01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgV29ya09yZGVyPigpOwotCQlpZiAod2JlICE9IG51bGwpIHsKLQkJCUxpc3Q8V29ya09yZGVyPiB3b0xpc3QgPSB3YmUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCWludCBzeiA9IHdvTGlzdCA9PSBudWxsID8gMCA6IHdvTGlzdC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN6OyBpKyspIHsKLQkJCQlXb3JrT3JkZXIgd28gPSB3b0xpc3QuZ2V0KGkpOwotCQkJCWlmICh3byA9PSBudWxsIHx8IHdvLmdldFByZWQoKSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlwcmVkR3VpZFRvV09NYXAucHV0KHdvLmdldFByZWQoKS5nZXRHdWlkKCksIHdvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZEd1aWRUb1dPTWFwOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBIVE1MIGNvbnRlbnQgZmlsZSBVUkwgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBVUkwgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGNvbnRlbnQgZmlsZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudFVSTChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBlbGVtZW50UGF0aCA9IG51bGw7Ci0JCVN0cmluZyBlbGVtZW50RmlsZU5hbWUgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCWVsZW1lbnRGaWxlTmFtZSA9IFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGVsZW1lbnQsCi0JCQkJCVJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50UGF0aCAhPSBudWxsICYmIGVsZW1lbnRGaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQllbGVtZW50UGF0aCA9IGVsZW1lbnRQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCWVsZW1lbnRGaWxlTmFtZSA9IGVsZW1lbnRGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQlTdHJpbmcgdXJsID0gY29udGVudEZvbGRlck5hbWUKLQkJCQkJKyAiLyIgKyBlbGVtZW50UGF0aCArIGVsZW1lbnRGaWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGFiVGFyZ2V0RGlyICsgRmlsZS5zZXBhcmF0b3IgKyB1cmw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXkgbmFtZSBvZiBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgZGlzcGxheSBuYW1lIG9mIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5TmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCW5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQluYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJfQotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBYTUxVdGlsLmVzY2FwZUF0dHIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUHVibGlzaGVzIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhwb3J0ZWQKLQkgKiBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIHRoZSBvdXRwdXQgZGlyZWN0b3J5Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gdG8gcHVibGlzaAotCSAqIEBwYXJhbSBwdWJsaXNoQ29uZmlnT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIHB1Ymxpc2hlZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcHVibGlzaGluZyB0aGUgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hDb25maWd1cmF0aW9uKFN0cmluZyBkaXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHVibGlzaE9wdGlvbnMgcHVibGlzaENvbmZpZ09wdGlvbnMpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHVibGlzaE1hbmFnZXIgcHVibGlzaE1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwdWJsaXNoTWdyID0gbmV3IFB1Ymxpc2hNYW5hZ2VyKCk7Ci0JCQlwdWJsaXNoTWdyLmluaXQoZGlyLCBjb25maWcsIG5ldyBQdWJsaXNoSFRNTE9wdGlvbnMoCi0JCQkJCXB1Ymxpc2hDb25maWdPcHRpb25zKSk7Ci0KLQkJCUV4cG9ydE1TUFhNTE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgRXhwb3J0TVNQWE1MT3BlcmF0aW9uKAotCQkJCQlwdWJsaXNoTWdyKTsKLQkJCVB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZGxnID0gbmV3IFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coCi0JCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHB1Ymxpc2hNZ3IKLQkJCQkJCQkuZ2V0Vmlld0J1aWxkZXIoKSk7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBVSUhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLAotCQkJCQlkbGcsIHRydWUsIEV4cG9ydE1TUFJlc291cmNlcy5leHBvcnRNU1BXaXphcmRfdGl0bGUpOwotCQkJaWYgKG9wZXJhdGlvbi5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgb3BlcmF0aW9uLmdldEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3MgJiYgIWRsZy5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHB1Ymxpc2hNZ3IgIT0gbnVsbCkgewotCQkJCXB1Ymxpc2hNZ3IuZGlzcG9zZSgpOwotCQkJCXB1Ymxpc2hNZ3IgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIHRoZSB0cmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRNU1Byb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiXG4kJCQgcmVhZC1pbiBwcm9qZWN0ID0gIiArIHByb2plY3QpOyAvLyROT04tTkxTLTEkCi0KLQkJRUxpc3QgdGFza3MgPSBwcm9qZWN0LmdldFRhc2tzKCkuZ2V0VGFzaygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRhc2sgZWxlbWVudCA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGEgdGFzayA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgcmVzb3VyY2VzID0gcHJvamVjdC5nZXRSZXNvdXJjZXMoKS5nZXRSZXNvdXJjZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlIGVsZW1lbnQgPSAob3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIkJCQgYSByZXNvdXJjZSA9ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRUxpc3QgYXNzaWdubWVudHMgPSBwcm9qZWN0LmdldEFzc2lnbm1lbnRzKCkuZ2V0QXNzaWdubWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhc3NpZ25tZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFzc2lnbm1lbnQgZWxlbWVudCA9IChBc3NpZ25tZW50KSBpdGVyLm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGFuIGFzc2lnbm1lbnQgPSAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiJCQkPT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgSGFzaE1hcDxUYXNrLCBXb3JrQnJlYWtkb3duRWxlbWVudD4gZ2V0VGFza1RvV2JlTWFwKCkgewotCQlyZXR1cm4gdGFza1RvV2JlTWFwOwotCX0KLQkKLQkvL1RvIGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvamVjdEV4dGVuZGVkQXR0cmlidXRlcyhQcm9qZWN0IHByb2plY3QpIHsKLQl9Ci0KLQkvL1RvIGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVXUERzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9FeHBvcnRPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOWE4NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0V4cG9ydE9wdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLS8qKgotICogQSBIYXNoTWFwIGZvciBFeHBvcnQgT3B0aW9ucwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRPcHRpb25zIGV4dGVuZHMgSGFzaE1hcCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTg5NzAxMjE1OTEzMjEyMjczTDsKLQkKLQkvKioKLQkgKiBUaGUgcHVibGlzaCBzZWxlY3RlZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJRyA9ICJwdWJsaXNoQ29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBvbmx5IHBsYW5uZWQgd29ya2JyZWFrZG93biBlbGVtZW50cyBvcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX09OTFlfUExBTk5FRF9FTEVNRU5UUyA9ICJleHBvcnRPbmx5UGxhbm5lZEVsZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4cG9ydCBlZmZvcnQgZXN0aW1hdGVzIGZvciB3b3JrYnJlYWtkb3duIGVsZW1lbnRzIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfRVNUSU1BVEVTID0gImV4cG9ydEVzdGltYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBlc3RpbWF0aW5nIG1vZGVsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBlZmZvcnQgZXN0aW1hdGVzIG9mIHRoZQotCSAqIGV4cG9ydGVkIHdvcmticmVha2Rvd24gZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVElOR19NT0RFTCA9ICJlc3RpbWF0aW5nTW9kZWwiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0T3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L21zcC9JRXhwb3J0TVNQU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0lFeHBvcnRNU1BTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTM0YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL0lFeHBvcnRNU1BTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IFNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHBvcnRNU1BTZXJ2aWNlIHsKLQotCS8qKgotCSAqIEV4cG9ydCBhIHByb2Nlc3MgdG8gYSBNaWNyb3NvZnQgUHJvamVjdCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogICAgICAgICAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzCi0JICogQHBhcmFtIGV4cG9ydE9wdGlvbnMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiB1c2VyIHNwZWNpZmllZCBleHBvcnQgb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQotCSAqIEB0aHJvd3MgRXhwb3J0TVNQU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydE1TUHJvamVjdChQcm9jZXNzIHByb2Nlc3MsCi0JCQlFeHBvcnRNU1BPcHRpb25zIGV4cG9ydE9wdGlvbnMpIHRocm93cyBFeHBvcnRNU1BTZXJ2aWNlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YWM5NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQKLWV4cG9ydE1TUFdpemFyZF90aXRsZT1FeHBvcnQgTWljcm9zb2Z0IFByb2plY3QKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotZXhwb3J0TVNQVGFza19uYW1lPUV4cG9ydGluZyBzZWxlY3RlZCBwcm9jZXNzIHRvIE1pY3Jvc29mdCBQcm9qZWN0Li4uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3Avc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvbXNwL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhNTIyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9tc3AvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgRXhwb3J0IE1pY3Jvc29mdCBQcm9qZWN0IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AvdGVtcGxhdGUvbXNwcm9qZWN0XzIwMDNfdGVtcGxhdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU1MGMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwL3RlbXBsYXRlL21zcHJvamVjdF8yMDAzX3RlbXBsYXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxQcm9qZWN0IHhtbG5zPSJodHRwOi8vZXBmLmVjbGlwc2Uub3JnL21zcHJvamVjdCI+Ci08TmFtZT5tc3Byb2plY3RfMjAwM190ZW1wbGF0ZS54bWw8L05hbWU+Ci08Q29tcGFueT5FY2xpcHNlLm9yZzwvQ29tcGFueT4KLTxBdXRob3I+PC9BdXRob3I+Ci08Q3JlYXRpb25EYXRlPjIwMDYtMDItMTBUMTQ6MzY6MDA8L0NyZWF0aW9uRGF0ZT4KLTxMYXN0U2F2ZWQ+MjAwNi0wMi0xMFQxNToxOTowMDwvTGFzdFNhdmVkPgotPFNjaGVkdWxlRnJvbVN0YXJ0PjE8L1NjaGVkdWxlRnJvbVN0YXJ0PgotPFN0YXJ0RGF0ZT4yMDA2LTAyLTEwVDA4OjAwOjAwPC9TdGFydERhdGU+Ci08RmluaXNoRGF0ZT4yMDA2LTAyLTEwVDA4OjAwOjAwPC9GaW5pc2hEYXRlPgotPEZZU3RhcnREYXRlPjE8L0ZZU3RhcnREYXRlPgotPENyaXRpY2FsU2xhY2tMaW1pdD4wPC9Dcml0aWNhbFNsYWNrTGltaXQ+Ci08Q3VycmVuY3lEaWdpdHM+MjwvQ3VycmVuY3lEaWdpdHM+Ci08Q3VycmVuY3lTeW1ib2w+JDwvQ3VycmVuY3lTeW1ib2w+Ci08Q3VycmVuY3lTeW1ib2xQb3NpdGlvbj4wPC9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uPgotPENhbGVuZGFyVUlEPjE8L0NhbGVuZGFyVUlEPgotPERlZmF1bHRTdGFydFRpbWU+MDg6MDA6MDA8L0RlZmF1bHRTdGFydFRpbWU+Ci08RGVmYXVsdEZpbmlzaFRpbWU+MTc6MDA6MDA8L0RlZmF1bHRGaW5pc2hUaW1lPgotPE1pbnV0ZXNQZXJEYXk+NDgwPC9NaW51dGVzUGVyRGF5PgotPE1pbnV0ZXNQZXJXZWVrPjI0MDA8L01pbnV0ZXNQZXJXZWVrPgotPERheXNQZXJNb250aD4yMDwvRGF5c1Blck1vbnRoPgotPERlZmF1bHRUYXNrVHlwZT4wPC9EZWZhdWx0VGFza1R5cGU+Ci08RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWw+MzwvRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWw+Ci08RGVmYXVsdFN0YW5kYXJkUmF0ZT4wPC9EZWZhdWx0U3RhbmRhcmRSYXRlPgotPERlZmF1bHRPdmVydGltZVJhdGU+MDwvRGVmYXVsdE92ZXJ0aW1lUmF0ZT4KLTxEdXJhdGlvbkZvcm1hdD43PC9EdXJhdGlvbkZvcm1hdD4KLTxXb3JrRm9ybWF0PjI8L1dvcmtGb3JtYXQ+Ci08RWRpdGFibGVBY3R1YWxDb3N0cz4wPC9FZGl0YWJsZUFjdHVhbENvc3RzPgotPEhvbm9yQ29uc3RyYWludHM+MDwvSG9ub3JDb25zdHJhaW50cz4KLTxJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk+MTwvSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5PgotPE11bHRpcGxlQ3JpdGljYWxQYXRocz4wPC9NdWx0aXBsZUNyaXRpY2FsUGF0aHM+Ci08TmV3VGFza3NFZmZvcnREcml2ZW4+MTwvTmV3VGFza3NFZmZvcnREcml2ZW4+Ci08TmV3VGFza3NFc3RpbWF0ZWQ+MTwvTmV3VGFza3NFc3RpbWF0ZWQ+Ci08U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzPjE8L1NwbGl0c0luUHJvZ3Jlc3NUYXNrcz4KLTxTcHJlYWRBY3R1YWxDb3N0PjA8L1NwcmVhZEFjdHVhbENvc3Q+Ci08U3ByZWFkUGVyY2VudENvbXBsZXRlPjA8L1NwcmVhZFBlcmNlbnRDb21wbGV0ZT4KLTxUYXNrVXBkYXRlc1Jlc291cmNlPjE8L1Rhc2tVcGRhdGVzUmVzb3VyY2U+Ci08RmlzY2FsWWVhclN0YXJ0PjA8L0Zpc2NhbFllYXJTdGFydD4KLTxXZWVrU3RhcnREYXk+MDwvV2Vla1N0YXJ0RGF5PgotPE1vdmVDb21wbGV0ZWRFbmRzQmFjaz4wPC9Nb3ZlQ29tcGxldGVkRW5kc0JhY2s+Ci08TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s+MDwvTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s+Ci08TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ+MDwvTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ+Ci08TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkPjA8L01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZD4KLTxCYXNlbGluZUZvckVhcm5lZFZhbHVlPjA8L0Jhc2VsaW5lRm9yRWFybmVkVmFsdWU+Ci08QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzPjE8L0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcz4KLTxDdXJyZW50RGF0ZT4yMDA2LTAyLTEwVDA4OjAwOjAwPC9DdXJyZW50RGF0ZT4KLTxNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMPjE8L01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkw+Ci08QXV0b2xpbms+MTwvQXV0b2xpbms+Ci08TmV3VGFza1N0YXJ0RGF0ZT4wPC9OZXdUYXNrU3RhcnREYXRlPgotPERlZmF1bHRUYXNrRVZNZXRob2Q+MDwvRGVmYXVsdFRhc2tFVk1ldGhvZD4KLTxQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZD4wPC9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZD4KLTxFeHRlbmRlZENyZWF0aW9uRGF0ZT4xOTg0LTAxLTAxVDAwOjAwOjAwPC9FeHRlbmRlZENyZWF0aW9uRGF0ZT4KLTxBY3R1YWxzSW5TeW5jPjE8L0FjdHVhbHNJblN5bmM+Ci08UmVtb3ZlRmlsZVByb3BlcnRpZXM+MDwvUmVtb3ZlRmlsZVByb3BlcnRpZXM+Ci08QWRtaW5Qcm9qZWN0PjA8L0FkbWluUHJvamVjdD4KLTxPdXRsaW5lQ29kZXMvPgotPFdCU01hc2tzLz4KLTxFeHRlbmRlZEF0dHJpYnV0ZXMvPgotPENhbGVuZGFycz4KLTxDYWxlbmRhcj4KLTxVSUQ+MTwvVUlEPgotPE5hbWU+U3RhbmRhcmQ8L05hbWU+Ci08SXNCYXNlQ2FsZW5kYXI+MTwvSXNCYXNlQ2FsZW5kYXI+Ci08QmFzZUNhbGVuZGFyVUlEPi0xPC9CYXNlQ2FsZW5kYXJVSUQ+Ci08V2Vla0RheXM+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjE8L0RheVR5cGU+Ci08RGF5V29ya2luZz4wPC9EYXlXb3JraW5nPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT4yPC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjM8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NDwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjE8L0RheVdvcmtpbmc+Ci08V29ya2luZ1RpbWVzPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjA4OjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTI6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MTM6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xNzowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTwvV29ya2luZ1RpbWVzPgotPC9XZWVrRGF5PgotPFdlZWtEYXk+Ci08RGF5VHlwZT41PC9EYXlUeXBlPgotPERheVdvcmtpbmc+MTwvRGF5V29ya2luZz4KLTxXb3JraW5nVGltZXM+Ci08V29ya2luZ1RpbWU+Ci08RnJvbVRpbWU+MDg6MDA6MDA8L0Zyb21UaW1lPgotPFRvVGltZT4xMjowMDowMDwvVG9UaW1lPgotPC9Xb3JraW5nVGltZT4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4xMzowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjE3OjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPC9Xb3JraW5nVGltZXM+Ci08L1dlZWtEYXk+Ci08V2Vla0RheT4KLTxEYXlUeXBlPjY8L0RheVR5cGU+Ci08RGF5V29ya2luZz4xPC9EYXlXb3JraW5nPgotPFdvcmtpbmdUaW1lcz4KLTxXb3JraW5nVGltZT4KLTxGcm9tVGltZT4wODowMDowMDwvRnJvbVRpbWU+Ci08VG9UaW1lPjEyOjAwOjAwPC9Ub1RpbWU+Ci08L1dvcmtpbmdUaW1lPgotPFdvcmtpbmdUaW1lPgotPEZyb21UaW1lPjEzOjAwOjAwPC9Gcm9tVGltZT4KLTxUb1RpbWU+MTc6MDA6MDA8L1RvVGltZT4KLTwvV29ya2luZ1RpbWU+Ci08L1dvcmtpbmdUaW1lcz4KLTwvV2Vla0RheT4KLTxXZWVrRGF5PgotPERheVR5cGU+NzwvRGF5VHlwZT4KLTxEYXlXb3JraW5nPjA8L0RheVdvcmtpbmc+Ci08L1dlZWtEYXk+Ci08L1dlZWtEYXlzPgotPC9DYWxlbmRhcj4KLTwvQ2FsZW5kYXJzPgotPFRhc2tzPgotPFRhc2s+Ci08VUlEPjA8L1VJRD4KLTxJRD4wPC9JRD4KLTxUeXBlPjE8L1R5cGU+Ci08SXNOdWxsPjA8L0lzTnVsbD4KLTxDcmVhdGVEYXRlPjIwMDYtMDItMTBUMTQ6MzY6MDA8L0NyZWF0ZURhdGU+Ci08V0JTPjA8L1dCUz4KLTxPdXRsaW5lTnVtYmVyPjA8L091dGxpbmVOdW1iZXI+Ci08T3V0bGluZUxldmVsPjA8L091dGxpbmVMZXZlbD4KLTxQcmlvcml0eT41MDA8L1ByaW9yaXR5PgotPFN0YXJ0PjIwMDYtMDItMTBUMDg6MDA6MDA8L1N0YXJ0PgotPEZpbmlzaD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9GaW5pc2g+Ci08RHVyYXRpb24+UFQwSDBNMFM8L0R1cmF0aW9uPgotPER1cmF0aW9uRm9ybWF0PjUzPC9EdXJhdGlvbkZvcm1hdD4KLTxXb3JrPlBUMEgwTTBTPC9Xb3JrPgotPFJlc3VtZVZhbGlkPjA8L1Jlc3VtZVZhbGlkPgotPEVmZm9ydERyaXZlbj4wPC9FZmZvcnREcml2ZW4+Ci08UmVjdXJyaW5nPjA8L1JlY3VycmluZz4KLTxPdmVyQWxsb2NhdGVkPjA8L092ZXJBbGxvY2F0ZWQ+Ci08RXN0aW1hdGVkPjE8L0VzdGltYXRlZD4KLTxNaWxlc3RvbmU+MDwvTWlsZXN0b25lPgotPFN1bW1hcnk+MTwvU3VtbWFyeT4KLTxDcml0aWNhbD4xPC9Dcml0aWNhbD4KLTxJc1N1YnByb2plY3Q+MDwvSXNTdWJwcm9qZWN0PgotPElzU3VicHJvamVjdFJlYWRPbmx5PjA8L0lzU3VicHJvamVjdFJlYWRPbmx5PgotPEV4dGVybmFsVGFzaz4wPC9FeHRlcm5hbFRhc2s+Ci08RWFybHlTdGFydD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9FYXJseVN0YXJ0PgotPEVhcmx5RmluaXNoPjIwMDYtMDItMTBUMDg6MDA6MDA8L0Vhcmx5RmluaXNoPgotPExhdGVTdGFydD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9MYXRlU3RhcnQ+Ci08TGF0ZUZpbmlzaD4yMDA2LTAyLTEwVDA4OjAwOjAwPC9MYXRlRmluaXNoPgotPFN0YXJ0VmFyaWFuY2U+MDwvU3RhcnRWYXJpYW5jZT4KLTxGaW5pc2hWYXJpYW5jZT4wPC9GaW5pc2hWYXJpYW5jZT4KLTxXb3JrVmFyaWFuY2U+MDwvV29ya1ZhcmlhbmNlPgotPEZyZWVTbGFjaz4wPC9GcmVlU2xhY2s+Ci08VG90YWxTbGFjaz4wPC9Ub3RhbFNsYWNrPgotPEZpeGVkQ29zdD4wPC9GaXhlZENvc3Q+Ci08Rml4ZWRDb3N0QWNjcnVhbD4zPC9GaXhlZENvc3RBY2NydWFsPgotPFBlcmNlbnRDb21wbGV0ZT4wPC9QZXJjZW50Q29tcGxldGU+Ci08UGVyY2VudFdvcmtDb21wbGV0ZT4wPC9QZXJjZW50V29ya0NvbXBsZXRlPgotPENvc3Q+MDwvQ29zdD4KLTxPdmVydGltZUNvc3Q+MDwvT3ZlcnRpbWVDb3N0PgotPE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvT3ZlcnRpbWVXb3JrPgotPEFjdHVhbER1cmF0aW9uPlBUMEgwTTBTPC9BY3R1YWxEdXJhdGlvbj4KLTxBY3R1YWxDb3N0PjA8L0FjdHVhbENvc3Q+Ci08QWN0dWFsT3ZlcnRpbWVDb3N0PjA8L0FjdHVhbE92ZXJ0aW1lQ29zdD4KLTxBY3R1YWxXb3JrPlBUMEgwTTBTPC9BY3R1YWxXb3JrPgotPEFjdHVhbE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrPgotPFJlZ3VsYXJXb3JrPlBUMEgwTTBTPC9SZWd1bGFyV29yaz4KLTxSZW1haW5pbmdEdXJhdGlvbj5QVDBIME0wUzwvUmVtYWluaW5nRHVyYXRpb24+Ci08UmVtYWluaW5nQ29zdD4wPC9SZW1haW5pbmdDb3N0PgotPFJlbWFpbmluZ1dvcms+UFQwSDBNMFM8L1JlbWFpbmluZ1dvcms+Ci08UmVtYWluaW5nT3ZlcnRpbWVDb3N0PjA8L1JlbWFpbmluZ092ZXJ0aW1lQ29zdD4KLTxSZW1haW5pbmdPdmVydGltZVdvcms+UFQwSDBNMFM8L1JlbWFpbmluZ092ZXJ0aW1lV29yaz4KLTxBQ1dQPjA8L0FDV1A+Ci08Q1Y+MDwvQ1Y+Ci08Q29uc3RyYWludFR5cGU+MDwvQ29uc3RyYWludFR5cGU+Ci08Q2FsZW5kYXJVSUQ+LTE8L0NhbGVuZGFyVUlEPgotPExldmVsQXNzaWdubWVudHM+MTwvTGV2ZWxBc3NpZ25tZW50cz4KLTxMZXZlbGluZ0NhblNwbGl0PjE8L0xldmVsaW5nQ2FuU3BsaXQ+Ci08TGV2ZWxpbmdEZWxheT4wPC9MZXZlbGluZ0RlbGF5PgotPExldmVsaW5nRGVsYXlGb3JtYXQ+ODwvTGV2ZWxpbmdEZWxheUZvcm1hdD4KLTxJZ25vcmVSZXNvdXJjZUNhbGVuZGFyPjA8L0lnbm9yZVJlc291cmNlQ2FsZW5kYXI+Ci08SGlkZUJhcj4wPC9IaWRlQmFyPgotPFJvbGx1cD4wPC9Sb2xsdXA+Ci08QkNXUz4wPC9CQ1dTPgotPEJDV1A+MDwvQkNXUD4KLTxQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZT4wPC9QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZT4KLTxFYXJuZWRWYWx1ZU1ldGhvZD4wPC9FYXJuZWRWYWx1ZU1ldGhvZD4KLTxBY3R1YWxXb3JrUHJvdGVjdGVkPlBUMEgwTTBTPC9BY3R1YWxXb3JrUHJvdGVjdGVkPgotPEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkPgotPC9UYXNrPgotPC9UYXNrcz4KLTxSZXNvdXJjZXM+Ci08UmVzb3VyY2U+Ci08VUlEPjA8L1VJRD4KLTxJRD4wPC9JRD4KLTxUeXBlPjE8L1R5cGU+Ci08SXNOdWxsPjA8L0lzTnVsbD4KLTxXb3JrR3JvdXA+MDwvV29ya0dyb3VwPgotPE1heFVuaXRzPjE8L01heFVuaXRzPgotPFBlYWtVbml0cz4wPC9QZWFrVW5pdHM+Ci08T3ZlckFsbG9jYXRlZD4wPC9PdmVyQWxsb2NhdGVkPgotPENhbkxldmVsPjE8L0NhbkxldmVsPgotPEFjY3J1ZUF0PjM8L0FjY3J1ZUF0PgotPFdvcms+UFQwSDBNMFM8L1dvcms+Ci08UmVndWxhcldvcms+UFQwSDBNMFM8L1JlZ3VsYXJXb3JrPgotPE92ZXJ0aW1lV29yaz5QVDBIME0wUzwvT3ZlcnRpbWVXb3JrPgotPEFjdHVhbFdvcms+UFQwSDBNMFM8L0FjdHVhbFdvcms+Ci08UmVtYWluaW5nV29yaz5QVDBIME0wUzwvUmVtYWluaW5nV29yaz4KLTxBY3R1YWxPdmVydGltZVdvcms+UFQwSDBNMFM8L0FjdHVhbE92ZXJ0aW1lV29yaz4KLTxSZW1haW5pbmdPdmVydGltZVdvcms+UFQwSDBNMFM8L1JlbWFpbmluZ092ZXJ0aW1lV29yaz4KLTxQZXJjZW50V29ya0NvbXBsZXRlPjA8L1BlcmNlbnRXb3JrQ29tcGxldGU+Ci08U3RhbmRhcmRSYXRlPjA8L1N0YW5kYXJkUmF0ZT4KLTxTdGFuZGFyZFJhdGVGb3JtYXQ+MjwvU3RhbmRhcmRSYXRlRm9ybWF0PgotPENvc3Q+MDwvQ29zdD4KLTxPdmVydGltZVJhdGU+MDwvT3ZlcnRpbWVSYXRlPgotPE92ZXJ0aW1lUmF0ZUZvcm1hdD4yPC9PdmVydGltZVJhdGVGb3JtYXQ+Ci08T3ZlcnRpbWVDb3N0PjA8L092ZXJ0aW1lQ29zdD4KLTxDb3N0UGVyVXNlPjA8L0Nvc3RQZXJVc2U+Ci08QWN0dWFsQ29zdD4wPC9BY3R1YWxDb3N0PgotPEFjdHVhbE92ZXJ0aW1lQ29zdD4wPC9BY3R1YWxPdmVydGltZUNvc3Q+Ci08UmVtYWluaW5nQ29zdD4wPC9SZW1haW5pbmdDb3N0PgotPFJlbWFpbmluZ092ZXJ0aW1lQ29zdD4wPC9SZW1haW5pbmdPdmVydGltZUNvc3Q+Ci08V29ya1ZhcmlhbmNlPjA8L1dvcmtWYXJpYW5jZT4KLTxDb3N0VmFyaWFuY2U+MDwvQ29zdFZhcmlhbmNlPgotPFNWPjA8L1NWPgotPENWPjA8L0NWPgotPEFDV1A+MDwvQUNXUD4KLTxDYWxlbmRhclVJRD4yPC9DYWxlbmRhclVJRD4KLTxCQ1dTPjA8L0JDV1M+Ci08QkNXUD4wPC9CQ1dQPgotPElzR2VuZXJpYz4wPC9Jc0dlbmVyaWM+Ci08SXNJbmFjdGl2ZT4wPC9Jc0luYWN0aXZlPgotPElzRW50ZXJwcmlzZT4wPC9Jc0VudGVycHJpc2U+Ci08Qm9va2luZ1R5cGU+MDwvQm9va2luZ1R5cGU+Ci08QWN0dWFsV29ya1Byb3RlY3RlZD5QVDBIME0wUzwvQWN0dWFsV29ya1Byb3RlY3RlZD4KLTxBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ+UFQwSDBNMFM8L0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZD4KLTxDcmVhdGlvbkRhdGU+MjAwNi0wMi0xMFQxNDozNjowMDwvQ3JlYXRpb25EYXRlPgotPC9SZXNvdXJjZT4KLTwvUmVzb3VyY2VzPgotPEFzc2lnbm1lbnRzLz4KLTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzMxYmQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSB4bWwgZXhwb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNzllMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlhYzc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbCwKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGJjYzJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjQ0YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTMwNGFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydCBYTUwgUGx1Zy1pbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgRXhwb3J0IFhNTCBXaXphcmQKLWV4cG9ydFhNTFdpemFyZE5hbWU9WE1MCi1leHBvcnRYTUxXaXphcmREZXNjcmlwdGlvbj1FeHBvcnQgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBhIFhNTCBmaWxlLgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0NjQ2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzLkV4cG9ydFhNTFdpemFyZCIKLSAgICAgICAgICAgIGljb249Imljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcy5FeHBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBuYW1lPSIlZXhwb3J0WE1MV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAlZXhwb3J0WE1MV2l6YXJkRGVzY3JpcHRpb24KLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZCBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwud2l6YXJkcy5FeHBvcnRYTUxXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4YzFmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvRXhwb3J0WE1MUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEV4cG9ydFhNTFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cG9ydFhNTFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL0V4cG9ydFhNTFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmUxNDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9FeHBvcnRYTUxSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBtZXNzYWdlIHJlc291cmNlIGJ1bmRsZSBhY2Nlc3NvciBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFeHBvcnRYTUxSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gRXhwb3J0WE1MUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRXhwb3J0WE1MUmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RYTUxGaWxlUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlVGV4dF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRpbmdYTUxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRYTUxGaWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MV2l6YXJkX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRYTUxTZXJ2aWNlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhwb3J0WE1MU2VydmljZV9mZWF0dXJlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9sb2FkX3htbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfbm9fcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9ub19mZWF0dXJlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9ub19jbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfaW52YWxpZF9mZWF0dXJlX3ZhbHVlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9lcnJvcl9zZXRfdmFsdWVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgeG1sTGlicmFyeV9uZXdfaWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB4bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRYTUxSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjdlN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZToKLSMKLQotIyBFeHBvcnQgWE1MIFdpemFyZAotZXhwb3J0WE1MV2l6YXJkX3RpdGxlPUV4cG9ydCBYTUwKLQotIyBTZWxlY3QgRXhwb3J0IFR5cGUgV2l6YXJkIFBhZ2UKLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZWN0IHRoZSB0eXBlIG9mIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgdG8gZXhwb3J0LgotZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uX3RleHQ9RXhwb3J0IHRoZSBlbnRpcmUgbWV0aG9kIGxpYnJhcnkKLWV4cG9ydFBsdWdpbnNSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgcGx1Zy1pbnMKLWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0PUV4cG9ydCBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFhNTCBGaWxlIFdpemFyZCBQYWdlCi1zZWxlY3RYTUxGaWxlUGFnZV90aXRsZT1TcGVjaWZ5IGV4cG9ydCBmaWxlCi1zZWxlY3RYTUxGaWxlUGFnZV9kZXNjPVNwZWNpZnkgYSBkZXN0aW5hdGlvbiBYTUwgZmlsZSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudC4KLWZpbGVMYWJlbF90ZXh0PVhNTCBGaWxlOgotYnJvd3NlQnV0dG9uX3RleHQ9QnJvd3NlLi4uCi0KLSMgT3ZlcndyaXRlIENvbmZpcm1hdGlvbiBEaWFsb2cKLW92ZXJ3cml0ZVRleHRfbXNnPScnezB9JycgYWxyZWFkeSBleGlzdHMuXG5EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgaXQ/Ci0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWV4cG9ydGluZ1hNTF90ZXh0PUV4cG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIFhNTCBmaWxlLi4uCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWludmFsaWRYTUxGaWxlX2Vycm9yPVRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgaXMgbm90IHZhbGlkLgotZXhwb3J0WE1MV2l6YXJkX2Vycm9yPUlVUE0wMDAwRTogVGhlIEV4cG9ydCBmYWlsZWQ6IHswfQotZXhwb3J0WE1MV2l6YXJkX3Jldmlld0xvZz1FeHBvcnQgY29tcGxldGVkLiBQbGVhc2UgcmV2aWV3IHRoZSBsb2cgZmlsZXMgdW5kZXIgdGhlIGV4cG9ydCBkaXJlY3RvcnkuCi1leHBvcnRYTUxTZXJ2aWNlX2Vycm9yPUVycm9yIGV4cG9ydGluZyBsaWJyYXJ5OiB7MH0KLWV4cG9ydFhNTFNlcnZpY2VfZmVhdHVyZV9lcnJvcj1FcnJvciBzZXR0aW5nIGZlYXR1cmUgdmFsdWU6OiBFbGVtZW50PXswfSwgZmVhdHVyZT17MX0KLXhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWw9VW5hYmxlIHRvIGxvYWQgWE1MIHNvdXJjZSAnJ3swfScnCi14bWxMaWJyYXJ5X25vX3BsdWdpbj1ObyBtZXRob2QgcGx1Zy1pbiBmb3IgaWQgezB9Ci14bWxMaWJyYXJ5X25vX2ZlYXR1cmU9VW5hYmxlIHRvIGdldCBYTUwgZmVhdHVyZSBmb3IgezB9X3sxfQoteG1sTGlicmFyeV9ub19jbGFzcz1VbmFibGUgdG8gZ2V0IEVDbGFzcyBmb3IgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm9yIGNyZWF0aW5nIGVsZW1lbnQsIGRvIG5vdCBrbm93IGhvdyB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmUgezB9Ci14bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZT1FcnJvciBjcmVhdGluZyBlbGVtZW50LCBjYW5ub3Qgc2V0IHZhbHVlIHswfSB0byBjb250YWluZXIgezF9Ci14bWxMaWJyYXJ5X2ludmFsaWRfZmVhdHVyZV92YWx1ZT1JbnZhbGlkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIGZvciBmZWF0dXJlIHswfSwgd2l0aCB2YWx1ZSB7MX0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzI9RXJyb3Igc2V0dGluZyBhdHRyaWJ1dGUsIFVuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGZlYXR1cmU9ezB9LCBvYmplY3Q9ezF9LCB2YWx1ZT17Mn0KLXhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzM9RG9uJyd0IGtub3cgaG93IHRvIHNldCB2YWx1ZSBmb3IgZmVhdHVyZT17MH0sIG9iamVjdD17MX0sIHZhbHVlPXsyfQoteG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlLCBVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBmZWF0dXJlPXswfSwgb2JqZWN0PXsxfSwgdmFsdWU9ezJ9Ci14bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyPVByb2Nlc3MgJyd7MH0nJyBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgY29udGFpbmVyLiBUaGUgY29udGFpbmVyIGlzIG9mIHR5cGUgJyd7MX0nJywgd2hpY2ggaXMgbm90IGEgcHJvY2VzcyBwYWNrYWdlLgoteG1sTGlicmFyeV9uZXdfaWQ9RWxlbWVudCB7MH0gaXMgYXNzaWduZWQgd2l0aCBhIG5ldyBpZCB7MX0gYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgb25lCi14bWxMaWJyYXJ5X2lkX25vdF91bmlxdWU9RWxlbWVudCBJZCAnJ3swfScnIGlzIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBlbGVtZW50Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDk5ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBFeHBvcnQgWE1MIHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9wcmVmZXJlbmNlcy9FeHBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL0V4cG9ydFhNTFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWZiYzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL0V4cG9ydFhNTFByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRYTUxQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgZXhwb3J0IHR5cGUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQT1JUX1RZUEUgPSAiZXhwb3J0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHBvcnRlZCBYTUwgZmlsZSBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRklMRSA9ICJ4bWxGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoRVhQT1JUX1RZUEUsIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKTsgCi0JCXN0b3JlLnNldERlZmF1bHQoWE1MX0ZJTEUsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydCB0eXBlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZXhwb3J0IHR5cGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEV4cG9ydFR5cGUoKSB7Ci0JCXJldHVybiBFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludCgKLQkJCQlFWFBPUlRfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0ZWQgdHlwZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpZWQgZXhwb3J0IHR5cGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RXhwb3J0VHlwZShpbnQgZXhwb3J0VHlwZSkgewotCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKEVYUE9SVF9UWVBFLAotCQkJCWV4cG9ydFR5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV4cG9ydGVkIFhNTCBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiBFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlYTUxfRklMRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0ZWQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYTUxGaWxlKFN0cmluZyBwYXRoKSB7Ci0JCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MX0ZJTEUsCi0JCQkJcGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjMjBjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgRXhwb3J0IFhNTCBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRSZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0MGY0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5CYXNlUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5VcmxJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgcmVzb3VyY2UgaGFuZGxlciBmb3IgY29udGVudCBpbiB0aGUgZXhwb3J0ZWQgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFJlc291cmNlSGFuZGxlciBleHRlbmRzIEJhc2VSZXNvdXJjZUhhbmRsZXIgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFJlc291cmNlSGFuZGxlcihGaWxlIHNvdXJjZUxpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCkgewotCQlzdXBlcihzb3VyY2VMaWJSb290LCB0YXJnZXRMaWJSb290KTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSB1cmwuIEZvciBYTUwgZXhwb3J0LCB3ZSBzaG91bGQgcmVzZXJ2ZSB0aGUgcmVzb3VyY2UgbG9jYXRpb25zLgotCSAqLwotCXB1YmxpYyBVcmxJbmZvIHJlc29sdmVGaWxlVXJsKE9iamVjdCBvd25lciwgU3RyaW5nIHNyY1VybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBsb2FkVXJsSW5mb1dpdGhGaXhlZFBhdGgob3duZXIsIHNyY1VybCk7Ci0JfQotCi0JCi0JLyoqCi0JICogdGhlIHJlc291cmNlIHBhdGggd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGliYXJ5IHJvb3QuIHVybHMgbmVlZHMgdG8gYmUKLQkgKiBmaXhlZAotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgdGhlIG93bmVyIG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkKLQkgKiBAcGFyYW0gc3JjVXJsCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhGaXhlZFBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsKLQkJU3RyaW5nIHNyY0ZpbGUgPSBnZXRGaWxlUmVsUGF0aChvd25lciwgc3JjVXJsKTsKLQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCBvd25lckVsZW0gPSBudWxsOwotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQlvd25lckVsZW0gPSAob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgb3duZXI7Ci0JCX0KLQkJaWYgKHNyY0ZpbGUgIT0gbnVsbCAmJiBvd25lckVsZW0gIT0gbnVsbCkgewkJCQotCQkJTWV0aG9kUGx1Z2luIHNyY1BsdWdpbiA9IGdldFNvdXJjZVBsdWdpbihvd25lckVsZW0pOwotCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3Ioc3JjUGx1Z2luKTsKLQkJCVN0cmluZyBzcmNQbHVnaW5QYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChzcmNQbHVnaW4pOwotCQkJRmlsZSBzcmNSb290ID0gKG5ldyBGaWxlKHNyY1BsdWdpblBhdGgpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkKLQkJCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNyY1Jvb3QsIHNyY0ZpbGUpOwotCQkJaWYgKCFpbmZvLnNvdXJjZUZpbGUuaXNGaWxlKCkgfHwgIWluZm8uc291cmNlRmlsZS5leGlzdHMoKSkgewotCQkJCVN0cmluZyBuZXdTcmNGaWxlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQluZXdTcmNGaWxlID0gTmV0VXRpbC5kZWNvZGVVUkwoc3JjRmlsZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJaWYgKG5ld1NyY0ZpbGUgIT0gbnVsbCkgewotCQkJCQlzcmNGaWxlID0gbmV3U3JjRmlsZTsKLQkJCQkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc3JjUm9vdCwgc3JjRmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjRmlsZSk7Ci0JCQlpbmZvLnRhcmdldFVybCA9IHNyY0ZpbGUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCX0KLQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRTb3VyY2VQbHVnaW4ob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCBvd25lckVsZW0pIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KG93bmVyRWxlbS5nZXRJZCgpKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZVJlbFBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAob3duZXIgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIGlkID0gKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBvd25lcikKLQkJCQkJCS5nZXRJZCgpOwotCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGlkKTsKLQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJRmlsZSBmID0gbmV3IEZpbGUobmV3IEZpbGUoc291cmNlTGliUm9vdCwKLQkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkpLCBzcmNVcmwpOwotCQkJCQkJU3RyaW5nIHBhdGggPSBmLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCQkJCXJldHVybiBwYXRoLnN1YnN0cmluZyhzb3VyY2VMaWJSb290LmdldENhbm9uaWNhbFBhdGgoKQotCQkJCQkJCQkubGVuZ3RoKCkgKyAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gTG9nIGVycm9yIGhlcmUKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGNvcHlpbmcgdGhlIHJlc291cmNlIGZpbGUgZnJvbSB0aGUgc291cmNlIGxpYnJhcnkgdG8gdGhlIHRhcmdldAotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VGaWxlIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSByb290Ci0JICovCi0JcHVibGljIHZvaWQgY29weVJlc291cmNlKFN0cmluZyBzb3VyY2VGaWxlLCBFT2JqZWN0IG9iaiwgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gdW1hUGx1Z2luKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKHVtYVBsdWdpbik7Ci0JCVN0cmluZyBzcmNQbHVnaW5QYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aCh1bWFQbHVnaW4pOwotCQlGaWxlIHNyY1BsdWdpblJvb3QgPSBuZXcgRmlsZShzcmNQbHVnaW5QYXRoKTsKLQkJCi0JCUZpbGUgc3JjID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdC5nZXRQYXJlbnRGaWxlKCksIHNvdXJjZUZpbGUpOwotCQlpZiAoIHNyYy5leGlzdHMoKSApIHsKLQkJCUZpbGUgdGd0ID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc291cmNlRmlsZSk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmMsIHRndCk7Ci0JCX0KLQl9Ci0JCi0vLwkvKioKLS8vCSAqIHRoZSByZXNvdXJjZSBwYXRoIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQuIHVybHMgd2lsbCBub3QgYmUKLS8vCSAqIGNoYW5nZWQgYnV0IHJlc291cmNlIGZpbGVzIGlzIHJlbGljYXRlZC4KLS8vCSAqIAotLy8JICogQHBhcmFtIG93bmVyCi0vLwkgKiBAcGFyYW0gc3JjVXJsCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhSZWxhdGl2ZVBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCi0vLwkJdHJ5IHsKLS8vCQkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0vLwkJCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOyAvLyBubyB1cmwgY2hhbmdlCi0vLwotLy8JCQkvLyBnZXQgdGhlIHJtYyBvYmplY3QKLS8vCQkJaWYgKG93bmVyIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgewotLy8JCQkJU3RyaW5nIGlkID0gKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBvd25lcikKLS8vCQkJCQkJLmdldElkKCk7Ci0vLwkJCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotLy8JCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotLy8JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChpZCk7Ci0vLwkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotLy8JCQkJCQlGaWxlIGYgPSBuZXcgRmlsZShuZXcgRmlsZShzb3VyY2VMaWJSb290LAotLy8JCQkJCQkJCVJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGVsZW1lbnQpKSwgc3JjVXJsKTsKLS8vCQkJCQkJZiA9IGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQkJCQkJaW5mby5zb3VyY2VGaWxlID0gZjsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIHNyY1VybCkKLS8vCQkJCQkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotLy8KLS8vCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIGxvZyBlcnJvciBUT0RPCi0vLwkJfQotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjNjZhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogU3RvcmVzIHRoZSBzZWxlY3Rpb25zIGFuZCBzZXR0aW5ncyBtYWRlIGJ5IHRoZSB1c2VyIGluIHRoZSBFeHBvcnQgWE1MIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MRGF0YSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFBPUlRfTUVUSE9EX0xJQlJBUlkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQT1JUX01FVEhPRF9QTFVHSU5TID0gMjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUE9SVF9NRVRIT0RfQ09ORklHUyA9IDM7Ci0KLQlwcm90ZWN0ZWQgaW50IGV4cG9ydFR5cGUgPSBFWFBPUlRfTUVUSE9EX0xJQlJBUlk7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHNlbGVjdGVkUGx1Z2luczsKLQkKLQlwcm90ZWN0ZWQgSGFzaFNldCBhc3NvY2lhdGVkQ29uZmlnczsKLQotCXByb3RlY3RlZCBMaXN0IHNlbGVjdGVkQ29uZmlnczsKLQotCXByb3RlY3RlZCBTdHJpbmcgeG1sRmlsZTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGV4cG9ydCB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgZXhwb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhwb3J0VHlwZSgpIHsKLQkJcmV0dXJuIGV4cG9ydFR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZXhwb3J0IHR5cGUuCi0JICogCi0JICogQHBhcmFtIGV4cG9yVHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXhwb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwb3J0VHlwZShpbnQgZXhwb3J0VHlwZSkgewotCQl0aGlzLmV4cG9ydFR5cGUgPSBleHBvcnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRQbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFzc29jaWF0ZWQgY29uZmlncyB3aXRoIHJlc3BlY3RlZCB0byBzZWxlY3RlZCBwbHVnLWlucwotCSAqIAotCSAqIEBwYXJhbSBhc3NvY2lhdGVkQ29uZmlnTWFwCi0JICogICAgICAgICAgIE1hcCBvZiBzZWxlY3RlZCBwbHVnLWlucyB0byBhc3NvY2lhdGVkIGNvbmZpZ3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NvY2lhdGVkQ29uZmlncyhNYXAgYXNzb2NpYXRlZENvbmZpZ01hcCkgewotCQlpZiAoYXNzb2NpYXRlZENvbmZpZ01hcCA9PSBudWxsIHx8IGFzc29jaWF0ZWRDb25maWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzb2NpYXRlZENvbmZpZ3MgPSBuZXcgSGFzaFNldCgpOyAKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFzc29jaWF0ZWRDb25maWdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTGlzdCBjb25maWdMaXN0ID0gKExpc3QpIGl0Lm5leHQoKTsKLQkJCWludCBzeiA9IGNvbmZpZ0xpc3QgPT0gbnVsbCA/IDAgOiBjb25maWdMaXN0LnNpemUoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKCFhc3NvY2lhdGVkQ29uZmlncy5jb250YWlucyhjb25maWcuZ2V0R3VpZCgpKSkgewotCQkJCQlhc3NvY2lhdGVkQ29uZmlncy5hZGQoY29uZmlnLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbnMuCi0JICogCi0JICogQHBhcmFtIHBsdWdpbnMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZFBsdWdpbnMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJc2VsZWN0ZWRQbHVnaW5zID0gcGx1Z2luczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIExpc3QgZ2V0U2VsZWN0ZWRDb25maWdzKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRDb25maWdzKExpc3QgY29uZmlncykgewotCQlzZWxlY3RlZENvbmZpZ3MgPSBjb25maWdzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiB4bWxGaWxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIFhNTCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB4bWxGaWxlCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBYTUwgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTEZpbGUoU3RyaW5nIHhtbEZpbGUpIHsKLQkJdGhpcy54bWxGaWxlID0geG1sRmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxMb2dnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MzM0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRXhwb3J0WE1MTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5GaWxlTG9nZ2VyOwotCi0KLS8qKgotICogTG9nZ2VyIGNsYXNzIGZvciB4bWwgZXhwb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MTG9nZ2VyIGV4dGVuZHMgRmlsZUxvZ2dlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxMb2dnZXIoRmlsZSBsb2dSb290KSB7Ci0JCXN1cGVyKG5ldyBGaWxlKGxvZ1Jvb3QsIExPR1NfRk9MREVSKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9FeHBvcnRYTUxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNDg1N2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL0V4cG9ydFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkNvbnRlbnRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLklSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtSW1hZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5NaWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogWG1sRXhwb3J0IHNlcnZpY2UgY2xhc3MgdG8gcHJvY2VzcyB0aGUgZXhwb3J0aW5nIHRhc2sKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFhNTFNlcnZpY2UgewotCi0JLy8gU3RyaW5nIHhtbFBhdGg7Ci0JcHJpdmF0ZSBFeHBvcnRYTUxEYXRhIGRhdGE7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBYTUxMaWJyYXJ5IHhtbExpYjsKLQotCXByaXZhdGUgTGlzdCBkaXNjYXJkZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUV4cG9ydFhNTExvZ2dlciBsb2dnZXIgPSBudWxsOwotCi0JLy8gaW4gY2FzZSB3ZSBuZWVkIHRvIG1hcHBpbmcgdGhlIHVtYSBvYmplY3RzIHRvIHhtbCBvYmplY3RzCi0JLy8gc3VjaCBhcyB0aGUgY29udGVudCBjYXRlZ29yaWVzCi0JcHJpdmF0ZSBNYXAgdW1hSWRUb1htbElkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIERpYWdyYW1IYW5kbGVyIGRpYWdyYW1IYW5kbGVyOwotCQotCS8vdGRzIHdpdGggc3RlcHMKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiB0ZE1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydFhNTFNlcnZpY2UoRXhwb3J0WE1MRGF0YSBkYXRhKSB7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JCWxvZ2dlciA9IG5ldyBFeHBvcnRYTUxMb2dnZXIobmV3IEZpbGUodGhpcy5kYXRhLnhtbEZpbGUpCi0JCQkJLmdldFBhcmVudEZpbGUoKSk7Ci0JfQotCS8qKgotCSAqIEdldHMgdGhlIGxvZ2dlciBmaWxlLgotCSAqLwotCXB1YmxpYyBGaWxlIGdldExvZ1BhdGgoKSB7Ci0JCXJldHVybiBsb2dnZXIuZ2V0TG9nUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsb2dnZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERvZXMgWE1MIGxpYnJhcnkgZXhwb3J0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRvRXhwb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCi0JCQlJUmVzb3VyY2VIYW5kbGVyIGhhbmRsZXIgPSBuZXcgRXhwb3J0UmVzb3VyY2VIYW5kbGVyKAotCQkJCQluZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSksIG5ldyBGaWxlKGRhdGEKLQkJCQkJCQkuZ2V0WE1MRmlsZSgpKS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG5ldyBDb250ZW50UHJvY2Vzc29yKGhhbmRsZXIsCi0JCQkJCXRoaXMubG9nZ2VyKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIoCi0JCQkJCW5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKSwgbmV3IEZpbGUoZGF0YQotCQkJCQkJCS5nZXRYTUxGaWxlKCkpLmdldFBhcmVudEZpbGUoKSkgewotCQkJCQotCQkJCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudE1hcChpbnQgcGFzc0lkKSB7Ci0JCQkJCWlmIChwYXNzSWQgIT0gMCkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0vKgkJCQkJU3RyaW5nIGxpYkZvbGRlclBhdGggPSBnZXRTb3VyY2VMaWJSb290KCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCWludCBpeCA9IGxpYkZvbGRlclBhdGgubGVuZ3RoKCk7Ki8KLQkJCQkJCi0JCQkJCU1hcDxTdHJpbmcsIE1hcEVudHJ5VmFsdWU+IG1hcCA9IGdldEVsZW1lbnRNYXAoKTsKLQkJCQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCQkJCWlmICh2YWx1ZS50YXJnZXRGaWxlID09IG51bGwpIHsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0gZWxzZSBpZiAodmFsdWUuc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQkJRURhdGFPYmplY3QgeG1sT2JqID0gZ2V0WG1sT2JqZWN0KHZhbHVlLmVsZW1lbnQpOwotCQkJCQkJCWlmICh4bWxPYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSB7Ci0JCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgcHJvYyA9IAotCQkJCQkJCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSB4bWxPYmo7Ci0JCQkJCQkJCVN0cmluZyB1cmkgPSB2YWx1ZS5zb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJCQlTdHJpbmcgc3JjUm9vdEZvbGRlclBhdGggPSBnZXRSb290KHZhbHVlLmVsZW1lbnQpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQkJCQlpbnQgaXggPSBzcmNSb290Rm9sZGVyUGF0aC5sZW5ndGgoKTsKLQkJCQkJCQkJCi0JCQkJCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoaXggKyAxKTsKLQkJCQkJCQkJdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkodXJpKS50b1N0cmluZygpOwotCQkJCQkJCQlwcm9jLnNldERpYWdyYW1VUkkodXJpKTsKLQkJCQkJCQl9CQkKLQkJCQkJCX0gCi0JCQkJCX0JCi0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWV4cG9ydERpYWdyYW1JbWFnZUZpbGVzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJCXByaXZhdGUgdm9pZCBleHBvcnREaWFncmFtSW1hZ2VGaWxlcygpIHsKLQkJCQkJU3RyaW5nIGZvbGRlclBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCQkJCi0JCQkJCURpYWdyYW1JbWFnZVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBuZXcgRGlhZ3JhbUltYWdlU2VydmljZShudWxsKTsKLQkJCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0Rm9yWE1MRXhwb3J0KHRydWUpOwotCQkJCQkKLQkJCQkJdHJ5IHsKLQkJCQkJCU1hcDxTdHJpbmcsIE1hcEVudHJ5VmFsdWU+IG1hcCA9IGdldEVsZW1lbnRNYXAoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCQlNYXBFbnRyeVZhbHVlIHZhbHVlID0gaXQubmV4dCgpOwotCQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgdmFsdWUuZWxlbWVudDsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQkJCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCWRpYWdyYW1TZXJ2aWNlLnNldENvbmZpZyhjb25maWcpOwotCQkJCQkJCUlDb25maWd1cmF0aW9uTWFuYWdlciBtZ3IgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZyk7Ci0JCQkJCQkJaWYgKG1nciA9PSBudWxsKSB7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBtZ3IuZ2V0RWxlbWVudExheW91dE1hbmFnZXIoKTsKLQkJCQkJCQlpZiAobGF5b3V0TWdyID09IG51bGwpIHsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJCUlGaWx0ZXIgZmlsdGVyID0gbGF5b3V0TWdyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpLmdldEZpbHRlcigpOwotCQkJCQkJCQotCQkJCQkJCUZpbGUgZGlhZ3JhbVhtaUZpbGUgPSB2YWx1ZS50YXJnZXRGaWxlOwotCQkJCQkJCWlmIChkaWFncmFtWG1pRmlsZSA9PSBudWxsIHx8ICFkaWFncmFtWG1pRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHViRGlyKGRpYWdyYW1YbWlGaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJCQkJCi0JCQkJCQkJTWFwIGFjdGl2aXRpZXMgPSBNaWdyYXRpb25VdGlsLmdldEFjdGl2aXRpZXMocHJvYywgdHJ1ZSk7CQotCQkJCQkJCWZvciAoQWN0aXZpdHkgYWN0OiAoQ29sbGVjdGlvbjxBY3Rpdml0eT4pIGFjdGl2aXRpZXMudmFsdWVzKCkpIHsKLQkJCQkJCQkJU3RyaW5nW10gdHlwZXMgPSB7CVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVywKLQkJCQkJCQkJCQkJCQlSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLAotCQkJCQkJCQkJCQkJCVJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZfTsKLQkJCQkJCQkJCi0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCVN0cmluZyBpbWFnZVBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRYbWxFeHBvcnRlZERpYWdyYW1JbWFnZUZpbGVOYW1lKGFjdCwgdHlwZXNbaV0sIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0pQRUcpOwotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlkaWFncmFtU2VydmljZS5zYXZlRGlhZ3JhbShhY3QsIGltYWdlUGF0aCwgdHlwZXNbaV0sIGZpbHRlciwgU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYykpOwotCQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxTZXJ2aWNlX2Vycm9yLAotCQkJCQkJCQkJCQkJCWUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFNlcnZpY2VfZXJyb3IsCi0JCQkJCQkJCQllLmdldE1lc3NhZ2UoKSksIGUpOwotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewkJCQkJCQkJCQkKLQkJCQkJCWRpYWdyYW1TZXJ2aWNlLmRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCS8vIEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLnByaW50RmVhdHVyZU5hbWVNYXBwaW5nKCk7Ci0KLQkJCS8vIGV4cG9ydCB0aGUgY3VycmVudCBsaWJyYXJ5IHRvIHRoZSB4bWwgZmlsZQotCQkJLy8gZ2V0IHRoZSBjdXJyZW50IGxpYnJhcnkgaW5zdGFuY2UgYW5kIGV4cG9ydCBhbGwgdG8gdGhlIHhtbAotCQkJTWV0aG9kTGlicmFyeSBzcmMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQl0aGlzLnhtbExpYiA9IG5ldyBYTUxMaWJyYXJ5KGNvbnRlbnRQcm9jLCBsb2dnZXIsIGRhdGEKLQkJCQkJLmdldFhNTEZpbGUoKSk7Ci0KLQkJCXRoaXMueG1sTGliLmNyZWF0ZUxpYnJhcnkoc3JjLmdldEd1aWQoKSwgc3JjLmdldE5hbWUoKSk7Ci0JCQlFRGF0YU9iamVjdCB0YXJnZXQgPSB0aGlzLnhtbExpYi5nZXRSb290KCk7Ci0KLQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHNyYywgdGFyZ2V0KTsKLQkJCWl0ZXJhdEVEYXRhT2JqZWN0KHNyYyk7Ci0KLQkJCXRoaXMueG1sTGliLmZpeExpYnJhcnlGb3JFeHBvcnQoKTsKLQkJCXRoaXMueG1sTGliLmZpeFRhc2tEZXNjcmlwdG9yc0ZvckV4cG9ydCh0ZE1hcCk7Ci0JCQkKLQkJCWRpYWdyYW1IYW5kbGVyLnZpc2l0RWxlbWVudE1hcCgwKTsKLQkJCWlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpIHsKLQkJCQl4bWxMaWIuc3RvcmVFeHRyYUluZm8oc3JjLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQl9Ci0JCQl0aGlzLnhtbExpYi5zYXZlKCk7Ci0JCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MU2VydmljZV9lcnJvciwKLQkJCQkJZS5nZXRNZXNzYWdlKCkpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BsdWdpblNlbGVjdGVkKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJaWYgKGRhdGEuZXhwb3J0VHlwZSA9PSBFeHBvcnRYTUxEYXRhLkVYUE9SVF9NRVRIT0RfTElCUkFSWSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TKSB7Ci0JCQlyZXR1cm4gKGRhdGEuc2VsZWN0ZWRQbHVnaW5zICE9IG51bGwpCi0JCQkJCSYmIGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmNvbnRhaW5zKHBsdWdpbik7Ci0JCX0gZWxzZSBpZiAoZGF0YS5leHBvcnRUeXBlID09IEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9DT05GSUdTKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbmZpZ0V4Y2x1ZGVkKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChkYXRhLmV4cG9ydFR5cGUgPT0gRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpIHsKLQkJCXJldHVybiBkYXRhLmFzc29jaWF0ZWRDb25maWdzID09IG51bGwgfHwgCi0JCQkJCSFkYXRhLmFzc29jaWF0ZWRDb25maWdzLmNvbnRhaW5zKGNvbmZpZy5nZXRHdWlkKCkpOwotCQl9IAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdEVEYXRhT2JqZWN0VHJlZShNZXRob2RFbGVtZW50IHNyY09iaiwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldE9iaikgewotCi0JCS8vIGlmIGl0J3MgYSBwbHVnaW4sIHNraXAgYWxsIHRoZSBzeXN0ZW0gcGFja2FnZXMKLQkJLy8gYW5kIGZpbmQgdGhlIHRvcCBtb3N0IHVzZXIgcGFja2FnZXMKLQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc3JjT2JqOwotCQkJaWYgKCFpc1BsdWdpblNlbGVjdGVkKHBsdWdpbikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIGFsbCBzeXN0ZW0gcGFja2FnZXMgYXJlIGRpc2NhcmRlZAotCQkJZGlzY2FyZGVkRWxlbWVudHMuYWRkQWxsKFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKSk7Ci0KLQkJCUxpc3QgdG9wbW9zdFVzZXJQYWNrYWdlcyA9IGdldFRvcG1vc3RVc2VyUGFja2FnZShwbHVnaW4pOwotCQkJTGlzdCBjYXRlZ29yeVBrZ3MgPSBUbmdVdGlsLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKHBsdWdpbik7Ci0KLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgeG1sUGtnID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHRoaXMueG1sTGliCi0JCQkJCS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VJZCA9IHhtbFBrZy5nZXRJZCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHRvcG1vc3RVc2VyUGFja2FnZXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSBpdHAubmV4dCgpOwotCi0JCQkJLy8gaWYgaXQncyBhIGNhdGVnb3J5IHBhY2thZ2UsCi0JCQkJLy8gY3JlYXRlIGFsbCBjb250YWluZWQgZWxlbWVudHMgaW4gdGhlIHNpbmdsZSBjdXN0b20gY2F0ZWdvcnkKLQkJCQkvLyBwYWNrYWdlCi0JCQkJaWYgKGNhdGVnb3J5UGtncy5jb250YWlucyhwa2cpKSB7Ci0KLQkJCQkJLy8gc2V0IHRoZSBpdCBtYXBwaW5nCi0JCQkJCXNldElkTWFwcGluZyhwa2cuZ2V0R3VpZCgpLCBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlSWQpOwotCQkJCQljcmVhdEVEYXRhT2JqZWN0VHJlZShwa2csIHhtbFBrZyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3JlYXRFRGF0YU9iamVjdFRyZWUocGtnLCB0YXJnZXRPYmopOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzcmNPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBuZXh0T2JqID0gaXQubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgY2hpbGQgPSBuZXh0T2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCA/Ci0JCQkJCQkoTWV0aG9kRWxlbWVudCkgbmV4dE9iaiA6IG51bGw7Ci0JCQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gaW4gdW1hIG1vZGVsLCBXb3JrT3JkZXIgaXMgY29udGFpbmVkIGluIHBhY2thZ2UKLQkJCQkvLyBpbiB4bWwgbW9kZWwsIFdvcmtPcmRlciBpcyBjb250YWluZWQgYnkgdGhlIG93bmluZwotCQkJCS8vIFdvcmtCcmVha2Rvd25FbGVtZW50LAotCQkJCS8vIHNvIGRlbGF5IHRoZSBjcmVhdGlvbiBpZiB0aGUgb3duZXIgaXMgYSBwYWNrYWdlCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya09yZGVyCi0JCQkJCQkmJiBzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICgoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pCi0JCQkJCQkmJiAhaXNQbHVnaW5TZWxlY3RlZCgoTWV0aG9kUGx1Z2luKSBjaGlsZCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gJiYKLQkJCQkJaXNDb25maWdFeGNsdWRlZCgoTWV0aG9kQ29uZmlndXJhdGlvbikgY2hpbGQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICghaXNEaXNjYXJkZWQoY2hpbGQpKSB7Ci0JCQkJCWNyZWF0ZVhtbE9iamVjdChjaGlsZCwgdGFyZ2V0T2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SWRNYXBwaW5nKFN0cmluZyB1bWFJZCwgU3RyaW5nIHhtbElkKSB7Ci0JCWlmICghdW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KHVtYUlkKSkgewotCQkJdW1hSWRUb1htbElkTWFwLnB1dCh1bWFJZCwgeG1sSWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0WG1sSWQoU3RyaW5nIHVtYUlkKSB7Ci0JCWlmICh1bWFJZFRvWG1sSWRNYXAuY29udGFpbnNLZXkodW1hSWQpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgdW1hSWRUb1htbElkTWFwLmdldCh1bWFJZCk7Ci0JCX0KLQkJcmV0dXJuIHVtYUlkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2NhcmRlZChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBkaXNjYXJkZWRFbGVtZW50cy5jb250YWlucyhvKTsKLQl9Ci0KLQlwcml2YXRlIEVEYXRhT2JqZWN0IGdldFhtbE9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlTdHJpbmcgaWQgPSBzcmNPYmouZ2V0R3VpZCgpOwotCQlpZiAodW1hSWRUb1htbElkTWFwLmNvbnRhaW5zS2V5KGlkKSkgewotCQkJaWQgPSAoU3RyaW5nKSB1bWFJZFRvWG1sSWRNYXAuZ2V0KGlkKTsKLQkJfQotCQlyZXR1cm4gdGhpcy54bWxMaWIuZ2V0RWxlbWVudChpZCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lcikgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IHVtYUVsZW1lbnQuZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQljcmVhdGVYbWxPYmplY3QodW1hRWxlbWVudCwgdGFyZ2V0Q29udGFpbmVyLCBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGFuIHhtbCBlbGVtZW50IGZvciB0aGUgY29udGFpbmVyLCBiYXNlZCBvbiB0aGUgdW1hIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdW1hRWxlbWVudAotCSAqIEBwYXJhbSB0YXJnZXRDb250YWluZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sT2JqZWN0KE1ldGhvZEVsZW1lbnQgdW1hRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lciwgU3RyaW5nIGNvbnRhaW5tZW50RmVhdHVyZSkgewotCi0JCXRyeSB7Ci0JCQlpZiAodW1hRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBnZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgc28gd2UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IG9mIHRoZQotCQkJLy8gc2FtZSB0eXBlCi0JCQlTdHJpbmcgZWxlbWVudFR5cGUgPSB1bWFFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCk7Ci0JCQlFRGF0YU9iamVjdCB4bWxFbGVtZW50ID0geG1sTGliLmNyZWF0ZUVsZW1lbnQodGFyZ2V0Q29udGFpbmVyLAotCQkJCQljb250YWlubWVudEZlYXR1cmUsIHVtYUVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpLAotCQkJCQllbGVtZW50VHlwZSwgdW1hRWxlbWVudC5nZXRHdWlkKCkpOwotCQkJCi0JCQlpZiAodW1hRWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7CQkJCQkKLQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgdW1hRWxlbWVudDsKLQkJCQlpZiAodGQuZ2V0VGFzaygpICE9IG51bGwpIHsKLQkJCQkJTGlzdCBzdGVwcyA9IHRkLmdldFNlbGVjdGVkU3RlcHMoKTsKLQkJCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgIXN0ZXBzLmlzRW1wdHkoKSkgewotCQkJCQkJaWYgKHRkTWFwID09IG51bGwpIHsKLQkJCQkJCQl0ZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+KCk7Ci0JCQkJCQl9Ci0JCQkJCQl0ZE1hcC5wdXQodGQuZ2V0R3VpZCgpLCB0ZCk7Ci0JCQkJCX0KLQkJCQl9CQkJCi0JCQl9Ci0JCQkKLQkJCWlmICh4bWxFbGVtZW50ICE9IG51bGwpIHsKLQotCQkJCS8vIHJlY3Vyc2l2ZQotCQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHVtYUVsZW1lbnQsIHhtbEVsZW1lbnQpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZT8/PwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpdGVyYXRFRGF0YU9iamVjdChNZXRob2RFbGVtZW50IHNyY09iaikgewotCQlkaWFncmFtSGFuZGxlci5yZWdpc3RlckVsZW1lbnQoc3JjT2JqLCB0cnVlKTsKLQkJCi0JCWlmIChzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBzcmNPYmo7Ci0JCQlpZiAoIWlzUGx1Z2luU2VsZWN0ZWQocGx1Z2luKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWlmIChpc1Byb2Nlc3NlZChzcmNPYmouZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNldFByb2Nlc3NlZChzcmNPYmouZ2V0R3VpZCgpKTsKLQotCQlFRGF0YU9iamVjdCB0YXJnZXRPYmogPSBnZXRYbWxPYmplY3Qoc3JjT2JqKTsKLQotCQkvLyBpZiBvYmplY3QgaXMgbm90IGNyZWF0ZWQsCi0JCS8vIHdoaWNoIG1lYW5zIGl0J3MgZWl0aGVyIGEgc3lzdGVtIHBhY2thZ2Ugb3Igc29tZXRoaW5nIHdyb25nCi0JCWlmICh0YXJnZXRPYmogPT0gbnVsbCkgewotCQkJaWYgKHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkvLyBpdGVyYXRlIHRoZSBjaGlsZCBwYWNrYWdlcwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSAoKE1ldGhvZFBhY2thZ2UpIHNyY09iaikuZ2V0Q2hpbGRQYWNrYWdlcygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpdGVyYXRFRGF0YU9iamVjdCgoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIC8vIGVsZW1lbnRzIGNhbiBiZSByZWZlcmVuY2UgaW4gb3RoZXIgcGx1Z2lucwotCQkJLy8gLy8gZG9uJ3QgbmVlZCB0byBjYXJlIGFib3V0IHRoaXMKLQkJCS8vIGVsc2UgaWYgKCFpc0Rpc2NhcmRlZChzcmNPYmopICkgewotCQkJLy8gbG9nZ2VyLmxvZ1dhcm5pbmcoIldhcm5pbmc6IHhtbCBvYmplY3Qgbm90IGNyZWF0ZWQgZm9yICIgKwotCQkJLy8gTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoc3JjT2JqKSApOwotCQkJLy8gfQotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlFQ2xhc3MgZUNsYXNzID0gc3JjT2JqLmVDbGFzcygpOwotCi0JCUVMaXN0IGZlYXR1cmVzID0gZUNsYXNzLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCi0JCQlPYmplY3QgdmFsdWUgPSBzcmNPYmouZUdldChmZWF0dXJlKTsKLQotCQkJdHJ5IHsKLQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXN0ICYmICEgZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJtZXRob2RFbGVtZW50UHJvcGVydHkiKSkgey8vJE5PTi1OTFMtMSQJCi0JCQkJCWZvciAoSXRlcmF0b3IgaXR2ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXR2Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgc3JjX3ZhbHVlID0gKE1ldGhvZEVsZW1lbnQpIGl0di5uZXh0KCk7Ci0KLQkJCQkJCS8vIGhhbmRsZSB0aGUKLQkJCQkJCS8vIFVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IKLQkJCQkJCS8vIGZlYXR1cmUgdmFsdWUKLQkJCQkJCS8vIHRoZSBXb3JrT3JkZXIgaW4gdW1hIGlzIGEgcHJvY2VzcyBlbGVtZW50IGluIGEKLQkJCQkJCS8vIHBhY2thZ2UKLQkJCQkJCS8vIGluIHhtbCBtb2RlbCwgaXQncyBhbiBFRGF0YU9iamVjdCBjb250YWluZWQgYnkgdGhlCi0JCQkJCQkvLyBXb3JrQnJlYWtkb3duRWxlbWVudAotCQkJCQkJaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCQkJCS8vIGdldCB0aGUgb3duZXIgb2YgdGhlIFdvcmtPcmRlcgotCQkJCQkJCUVEYXRhT2JqZWN0IHdvcmtPcmRlciA9IGdldFhtbE9iamVjdChzcmNfdmFsdWUpOwotCQkJCQkJCWlmICh3b3JrT3JkZXIgPT0gbnVsbCkgewotCQkJCQkJCQljcmVhdGVYbWxPYmplY3Qoc3JjX3ZhbHVlLCB0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ3b3Jrb3JkZXIgdmFsdWUiKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gc2V0IHRoZSByZWZlcmVuY2UKLQkJCQkJCVN0cmluZyB4bWxJZCA9IGdldFhtbElkKHNyY192YWx1ZS5nZXRHdWlkKCkpOwotCQkJCQkJeG1sTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZS5nZXROYW1lKCksCi0JCQkJCQkJCXhtbElkLCBzcmNfdmFsdWUuZ2V0VHlwZSgpKTsKLQotCQkJCQkJaXRlcmF0RURhdGFPYmplY3Qoc3JjX3ZhbHVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCS8vIGdldCB0aGUgeG1sIG9iamVjdCBhbmQgaXRlcmF0ZSBhZ2FpbgotCQkJCQlNZXRob2RFbGVtZW50IHNyY192YWx1ZSA9IChNZXRob2RFbGVtZW50KSB2YWx1ZTsKLQotCQkJCQkvLyBpZiAoIHNyY192YWx1ZSBpbnN0YW5jZW9mIFdvcmtPcmRlciApIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ3b3Jrb3JkZXIgdmFsdWUiKTsKLQkJCQkJLy8gfQotCi0JCQkJCS8vIGVsZW1lbnRzIGxpa2UgUHJlc2VudGF0aW9uIG1heSBub3QgaGF2ZSBhIENvbnRlbnQKLQkJCQkJLy8gRGVzY3JpcHRpb24KLQkJCQkJLy8gdGhlIG9uZSByZXR1cm5lZCBtYXkgbm90IGhhdmUgYSBjb250YWluZXIKLQkJCQkJaWYgKHNyY192YWx1ZS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHhtbElkID0gZ2V0WG1sSWQoc3JjX3ZhbHVlLmdldEd1aWQoKSk7Ci0JCQkJCQl4bWxMaWIuc2V0UmVmZXJlbmNlVmFsdWUodGFyZ2V0T2JqLCBmZWF0dXJlLmdldE5hbWUoKSwKLQkJCQkJCQkJeG1sSWQsIHNyY192YWx1ZS5nZXRUeXBlKCkpOwotCi0JCQkJCQlpdGVyYXRFRGF0YU9iamVjdChzcmNfdmFsdWUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICghaXNEaXNjYXJkZWQoc3JjT2JqKSkgewotCQkJCQkvLyBpZiAoIHRhcmdldE9iaiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJocnJlIik7Ci0JCQkJCS8vIH0KLQotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXJUeXBlKSB7Ci0JCQkJCQl2YWx1ZSA9ICgoV29ya09yZGVyVHlwZSkgdmFsdWUpLmdldE5hbWUoKTsKLQkJCQkJfQotCi0JCQkJCXhtbExpYi5zZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZSh0YXJnZXRPYmosCi0JCQkJCQkJZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxTZXJ2aWNlX2ZlYXR1cmVfZXJyb3IsCi0JCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShzcmNPYmopLCBmZWF0dXJlLmdldE5hbWUoKSk7Ci0JCQkJbG9nZ2VyLmxvZ0Vycm9yKG1zZywgZSk7Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLy8gZ29pZCBvZiBwcm9jZXNzZWQgZWxlbWVudAotCXByaXZhdGUgTGlzdCBwcm9jZXNzZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1Byb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFByb2Nlc3NlZChTdHJpbmcgZ3VpZCkgewotCQlpZiAoIXByb2Nlc3NlZEVsZW1lbnRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQlwcm9jZXNzZWRFbGVtZW50cy5hZGQoZ3VpZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0VG9wbW9zdFVzZXJQYWNrYWdlKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19jb3JlX2NvbnRlbnQgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfY3VzdG9tX2NhdGVnb3JpZXMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfZGlzY2lwbGluZXMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfZG9tYWlucyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0KLQkJTWV0aG9kUGFja2FnZSBwa2dfcm9sZXNldHMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ190b29scyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX3dwdHlwZXMgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2NwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCi0JCU1ldGhvZFBhY2thZ2UgcGtnX2RwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQotCQlNZXRob2RQYWNrYWdlIHBrZ19wcm9jX2NvbnRyaWJ1dGlvbiA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCi0JCUxpc3QgcGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcGtncy5hZGQocGtnX2NvcmVfY29udGVudCk7Ci0JCXBrZ3MuYWRkKHBrZ19jdXN0b21fY2F0ZWdvcmllcyk7Ci0JCXBrZ3MuYWRkKHBrZ19kaXNjaXBsaW5lcyk7Ci0JCXBrZ3MuYWRkKHBrZ19kb21haW5zKTsKLQkJcGtncy5hZGQocGtnX3JvbGVzZXRzKTsKLQkJcGtncy5hZGQocGtnX3Rvb2xzKTsKLQkJcGtncy5hZGQocGtnX3dwdHlwZXMpOwotCQlwa2dzLmFkZChwa2dfY3ApOwotCQlwa2dzLmFkZChwa2dfZHApOwotCi0JCWlmICggcGtnX3Byb2NfY29udHJpYnV0aW9uICE9IG51bGwgKSB7Ci0JCQlwa2dzLmFkZChwa2dfcHJvY19jb250cmlidXRpb24pOwotCQl9Ci0JCQotCQlyZXR1cm4gcGtnczsKLQotCQkvLyBMaXN0IHN5c3RlbVBrZ3MgPSBUbmdVdGlsLmdldEFsbFN5c3RlbVBhY2thZ2VzKHBsdWdpbik7Ci0JCS8vCQkKLQkJLy8gTGlzdCB1bnByb2Nlc3NlZFBrZ3MgPSBuZXcgQXJyYXlMaXN0KHBsdWdpbi5nZXRNZXRob2RQYWNrYWdlcygpKTsKLQkJLy8gd2hpbGUgKHVucHJvY2Vzc2VkUGtncy5zaXplKCkgPiAwICkgewotCQkvLyBNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKSB1bnByb2Nlc3NlZFBrZ3MucmVtb3ZlKDApOwotCQkvLyBpZiAoICFzeXN0ZW1Qa2dzLmNvbnRhaW5zKHBrZykgKSB7Ci0JCS8vIGlmICggIXBrZ3MuY29udGFpbnMocGtnKSApIHsKLQkJLy8gcGtncy5hZGQocGtnKTsKLQkJLy8gfQotCQkvLyBjb250aW51ZTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyBmb3IgKCBJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOwotCQkvLyApIHsKLQkJLy8gTWV0aG9kUGFja2FnZSBwID0gKE1ldGhvZFBhY2thZ2UpaXQubmV4dCgpOwotCQkvLyBpZiAoIHN5c3RlbVBrZ3MuY29udGFpbnMocCkgKQotCQkvLyB7Ci0JCS8vIGlmICggIXVucHJvY2Vzc2VkUGtncy5jb250YWlucyhwKSApIHsKLQkJLy8gdW5wcm9jZXNzZWRQa2dzLmFkZChwKTsKLQkJLy8gfQotCQkvLyB9IGVsc2UgewotCQkvLyBpZiAoICFwa2dzLmNvbnRhaW5zKHApICkgewotCQkvLyBwa2dzLmFkZChwKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gaWYgKCB1bnByb2Nlc3NlZFBrZ3Muc2l6ZSgpID09IDAgKSB7Ci0JCS8vIGJyZWFrOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyAvLyBuZWVkIHRvIGluY2x1ZGUgdGhlIGNvbnRlbnQgcGFja2FnZXMKLQkJLy8gcGtncy5hZGRBbGwoVG5nVXRpbC5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pKTsKLQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbVBhY2thZ2UoRURhdGFPYmplY3QgZWxlbWVudCkgewotCS8vCQkKLQkvLyBpZiAoICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8JCQotCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JLy8gaWYgKCBwbHVnaW4gPT0gbnVsbCApIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vCQkKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pLmNvbnRhaW5zKGVsZW1lbnQpOwotCS8vCQkKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvRmVhdHVyZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9GZWF0dXJlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTJlNThjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9GZWF0dXJlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkV4dGVuZGVkTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogbWFuYWdlIHRoZSBmZWF0dXJlcyBvZiBFQ2xhc3MuCi0gKiBtYWludGFpbnMgYSBtYXAgb2YgZmVhdHVyZSBuYW1lIHRvIHRoZSBFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0IGZvciBlYXNpZXIgYWNjZXNzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZU1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBGZWF0dXJlTWFuYWdlcigpOwotCQotCS8vcHJpdmF0ZSBNYXAgY2xhc3NNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8vIG1hcCBvZiB1bWEgZmVhdHVyZSBuYW1lIHRvIHRoZSBjb3JyZXNwb25kaW5nIHhtbCBmZWF0dXJlIG5hbWUKLQlwcml2YXRlIE1hcCBmZWF0dXJlTmFtZU1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0JCi0JLy8gdW1hIGZlYXR1cmVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKLQlwcml2YXRlIExpc3QgdW5uZWVkZWRSbWNGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIHhtbCBmZWF0dXJlcyB0aGF0IGNhbiBiZSBpZ25vcmVkCi0JcHJpdmF0ZSBMaXN0IHVubmVlZGVkWG1sRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBtYXAgb2YgRUNsYXNzIG5hbWUgdG8gRUNsYXNzIE9iamVjdCBmb3IgeG1sIG1vZGVsCi0JLy8gbm90ZTogd2UgY2FuJ3QgdXNlIGZlYXR1cmUuZ2V0RVR5cGUoKSB0byBnZXQgdGhlIEVDbGFzcyBmcm9tIGZlYXR1cmUKLQkvLyB0aGUgcHJvYmxlbSBpcyB0aGUgYWJvdmUgcmV0dXJuZWQgRUNsYXNzIG1heSBub3QgYmUgdGhlIGNvbmNyZWF0ZSBFQ2xhc3MsIGluc3RlYWQsIGl0IGlzIHRoZSBiYXNlIGNsYXNzCi0JLy8gZm9yIGV4YW1wbGUsIGl0IHJldHVybnMgTWV0aG9kUGFja2FnZSBpbnN0ZWFkIG9mIFByb2Nlc3NQYWNrYWdlIG9yIENvbnRlbnRQYWNrYWdlCi0JLy8gc28gd2UgaGF2ZSB0byBtYWludGFpbiBhIG1hcCBtYW51YWxseQotCXByaXZhdGUgTWFwIHhtbEVDbGFzc01hcCA9IG5ldyBUcmVlTWFwKCk7Ci0JCi0JLy8gbWFwIG9mIEVjbGFzIG5hbWUgdG8gRUNsYXNzIG9iamVjdCBmb3IgdW1hIG1vZGVsCi0JcHJpdmF0ZSBNYXAgdW1hRUNsYXNzTWFwID0gbmV3IFRyZWVNYXAoKTsKLQkKLQlwcml2YXRlIEZlYXR1cmVNYW5hZ2VyKCkgewotCQkKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJPcHRpb25hbElucHV0VG8iLCAib3B0aW9uYWxJbnB1dFRvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIlJvbGUiLCAicm9sZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJUYXNrIiwgInRhc2siKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYWN0aXZpdHlSZWZlcmVuY2VzIiwgImFjdGl2aXR5UmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImFnZ3JlZ2F0ZWRSb2xlcyIsICJhZ2dyZWdhdGVkUm9sZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhc3NldHMiLCAicmV1c2FibGVBc3NldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJhdHRhY2htZW50cyIsICJhdHRhY2htZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJhc2VDb25maWd1cmF0aW9ucyIsICJiYXNlQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJiYXNlZE9uUHJvY2Vzc2VzIiwgImJhc2VQcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImJhc2VzIiwgInJlZmVyZW5jZWRNZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYm9keSIsICJtYWluRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiYnJlYWtkb3duRWxlbWVudHMiLCAiYnJlYWtkb3duRWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjYXRlZ29yaXplZEVsZW1lbnRzIiwgImNhdGVnb3JpemVkRWxlbWVudCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjaGVja2xpc3RzIiwgImNoZWNrbGlzdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjaGlsZFBhY2thZ2VzIiwgIm1ldGhvZFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLCAiY29tbXVuaWNhdGlvbnNNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb25jZXB0cyIsICJjb25jZXB0LHdoaXRlcGFwZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29uY2VwdHNBbmRQYXBlcnMiLCAiY29uY2VwdCx3aGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImNvbnRhaW5lZEFydGlmYWN0cyIsICJjb250YWluZWRBcnRpZmFjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb250ZW50RWxlbWVudHMiLCAiY29udGVudEVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiY29udGVudFJlZmVyZW5jZXMiLCAiY29udGVudFJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJjb3B5cmlnaHRTdGF0ZW1lbnQiLCAiY29weXJpZ2h0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIsICJkZWxpdmVyZWRXb3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJkaXNjaXBsaW5lcyIsICJkaXNjaXBsaW5lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImVkdWNhdGlvbk1hdGVyaWFscyIsICJlZHVjYXRpb25NYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJlc3RpbWF0aW9uQ29uZGVyYXRpb25zIiwgImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJleGFtcGxlcyIsICJleGFtcGxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImd1aWQiLCAiaWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiZ3VpZGVsaW5lcyIsICJndWlkZWxpbmUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgiaG93dG9TdGFmZiIsICJob3dUb1N0YWZmIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImluY2x1ZGVzUGF0dGVybnMiLCAiaW5jbHVkZXNQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImludGVyZmFjZXMiLCAiaW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImxpbmtUb1ByZWRlY2Vzc29yIiwgInByZWRlY2Vzc29yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIm1ldGhvZFBhY2thZ2VzIiwgIm1ldGhvZFBhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgibWV0aG9kUGx1Z2lucyIsICJtZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgib3duZWRSdWxlcyIsICJvd25lZFJ1bGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIiwgIm1ldGhvZENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicHJvY2Vzc0VsZW1lbnRzIiwgInByb2Nlc3NFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInByb2Nlc3NWaWV3cyIsICJwcm9jZXNzVmlldyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZWZlcmVuY2VXb3JrZmxvd3MiLCAicmVmZXJlbmNlV29ya2Zsb3ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmVwb3J0cyIsICJyZXBvcnQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmV1c2FibGVBc3NldHMiLCAicmV1c2FibGVBc3NldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyZXVzZWRQYWNrYWdlcyIsICJyZXVzZWRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInJvYWRtYXBzIiwgInJvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicm9sZVNldHMiLCAicm9sZVNldCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJyb2xlcyIsICJyb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInNlY3Rpb25EZXNjcmlwdGlvbiIsICJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzZWN0aW9ucyIsICJzZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInNlbGVjdGVkU3RlcHMiLCAic3RlcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJDYXRlZ29yaWVzIiwgInN1YkNhdGVnb3J5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInN1YmRpc2NpcGxpbmUiLCAic3ViRGlzY2lwbGluZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJQcmFjdGljZXMiLCAic3ViUHJhY3RpY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgic3ViU2VjdGlvbnMiLCAic3ViU2VjdGlvbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdWJkb21haW5zIiwgInN1YmRvbWFpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdXBlckFjdGl2aXRpZXMiLCAic3VwZXJBY3Rpdml0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJzdXBwb3J0aW5nTWF0ZXJpYWxzIiwgInN1cHBvcnRpbmdNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJ0YXNrcyIsICJ0YXNrIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRlYW1Sb2xlcyIsICJyb2xlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoInRlbXBsYXRlcyIsICJ0ZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJ0b29sTWVudG9ycyIsICJ0b29sTWVudG9yIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIldvcmtQcm9kdWN0IiwgIndvcmtQcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIndvcmtQcm9kdWN0cyIsICJ3b3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmVhdHVyZU5hbWVNYXAucHV0KCJwcmVkIiwgInZhbHVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsICJtZXRob2RFbGVtZW50UHJvcGVydHkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZlYXR1cmVOYW1lTWFwLnB1dCgicmVxdWlyZWRSZXN1bHRzIiwgInJlcXVpcmVkUmVzdWx0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZWF0dXJlTmFtZU1hcC5wdXQoImZ1bGZpbGxzIiwgImZ1bGZpbGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgiY29udGFpbmVyQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgibW9kaWZpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFJtY0ZlYXR1cmVzLmFkZCgicGFyZW50UGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJkaWFncmFtcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJtb2RpZmllcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJzdGVwcyIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkUm1jRmVhdHVyZXMuYWRkKCJ3b3JrZWRPbkJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRSbWNGZWF0dXJlcy5hZGQoImRpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCXVubmVlZGVkWG1sRmVhdHVyZXMuYWRkKCJncm91cDEiKTsgLy8kTk9OLU5MUy0xJAotCQl1bm5lZWRlZFhtbEZlYXR1cmVzLmFkZCgiZ3JvdXAyIik7IC8vJE5PTi1OTFMtMSQKLQkJdW5uZWVkZWRYbWxGZWF0dXJlcy5hZGQoInByZWRlY2Vzc29yMSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2FkWG1sQ2xhc3NlcygpOwotCQlsb2FkUm1jQ2xhc3NlcygpOwotCQkKLS8vCQkvLyBwcmludCBvdXQgdGhlIEVDbGFzc2VzIGFuZCBmZWF0dXJlIG1hcCwgZm9yIHRlc3RpbmcgcHVycG9zZQotLy8JCS8vIGRvbid0IGRlbGV0ZSB0aGlzIGNvZGUgc2VnbWVudAotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09IExvYWRpbmcgRUNsYXNzZXMgZm9yIFhNTCBVbWEgbW9kZWwgPT09PT09PT09PT09PT09PT0iKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sRUNsYXNzTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgaXQubmV4dCgpKTsJCQkKLS8vCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOwotLy8KLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZU5hbWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0vLwkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotLy8JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWVudHJ5LmdldFZhbHVlKCk7Ci0vLwkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCApIHsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRmZWF0dXJlTmFtZU1hcC5wdXQoXCIiICsga2V5ICsgIlwiLCBcIiIgKyB2YWx1ZSArICJcIik7Iik7CQotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFJtY0NsYXNzZXMoKSB7Ci0JCQotCQkvLyBsb2FkIEVDbGFzcyBtYXAKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmNlcHQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kTGlicmFyeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNaWxlc3RvbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2VzcygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvYWRtYXAoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2VjdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXModW1hRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh1bWFFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHVtYUVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSk7CQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgbG9hZFhtbENsYXNzZXMoKSB7Ci0JCQotCQkvLyBsb2FkIEVDbGFzcyBtYXAKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25jZXB0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uc3RyYWludCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSk7Ci0vLwkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENhdGVnb3J5VHlwZSgpKTsKLS8vCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2F0ZWdvcnlUeXBlT2JqZWN0KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGluZ01ldHJpYygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEV4YW1wbGUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZExpYnJhcnkoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGNvbWUoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3MoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJlcG9ydCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJldXNhYmxlQXNzZXQoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2FkbWFwKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZygpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFNlY3Rpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlbXBsYXRlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVybURlZmluaXRpb24oKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJbG9hZE1vZGVsQ2xhc3Nlcyh4bWxFQ2xhc3NNYXAsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya09yZGVyKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWxvYWRNb2RlbENsYXNzZXMoeG1sRUNsYXNzTWFwLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCkpOwotCQlsb2FkTW9kZWxDbGFzc2VzKHhtbEVDbGFzc01hcCwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpOwkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRNb2RlbENsYXNzZXMoTWFwIGNsYXNzTWFwLCBFQ2xhc3MgY2xhenopIHsKLQotCQlTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKLQkJaWYoIGNsYXNzTWFwLmNvbnRhaW5zS2V5KG5hbWUpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQljbGFzc01hcC5wdXQobmFtZSwgY2xhenopOwotCQkJCi0JCS8vZm9yIChJdGVyYXRvciBpdCA9IGNsYXp6LmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQlmb3IgKEl0ZXJhdG9yIGVsZW1lbnRzID0gRXh0ZW5kZWRNZXRhRGF0YS5JTlNUQU5DRS5nZXRBbGxFbGVtZW50cyhjbGF6eikuaXRlcmF0b3IoKTsgCi0JCQkJZWxlbWVudHMuaGFzTmV4dCgpOyApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKWVsZW1lbnRzLm5leHQoKTsKLQkJCUVDbGFzc2lmaWVyIGVDbGFzc2lmaWVyID0gZVN0cnVjdHVyYWxGZWF0dXJlLmdldEVUeXBlKCk7Ci0JCQlpZiAoZUNsYXNzaWZpZXIgaW5zdGFuY2VvZiBFQ2xhc3MpIHsKLQkJCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcyllQ2xhc3NpZmllcjsJCQkJCi0JCQkJLy8gcmVjdXJzaXZlbHkgZmluZCB0aGUgbmVzdGVkdCBmZWF0dXJlcwotCQkJCWxvYWRNb2RlbENsYXNzZXMoY2xhc3NNYXAsIGVDbGFzcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhenoKLQkgKiBAcGFyYW0gdW1hRmVhdHVyZU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHhtbCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0WG1sRmVhdHVyZShFQ2xhc3MgY2xhenosIFN0cmluZyB1bWFGZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gZ2V0WG1sRmVhdHVyZShjbGF6eiwgdW1hRmVhdHVyZU5hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdW1hQ2xhenoKLQkgKiBAcGFyYW0geG1sRmVhdHVyZU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QuCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRSbWNGZWF0dXJlKEVDbGFzcyB1bWFDbGF6eiwgU3RyaW5nIHhtbEZlYXR1cmVOYW1lKSB7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gdW1hQ2xhenouZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotCQkJU3RyaW5nIHVtYUZlYXR1cmVuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQkKLQkJCS8vIGlmIHRoZSBmZWF0dXJlIG5hbWUgaXMgdGhlIHNhbWUsIGdvdCBpdAotCQkJaWYgKCB1bWFGZWF0dXJlbmFtZS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpICkgewotCQkJCXJldHVybiBmZWF0dXJlOwotCQkJfQotCQkJCi0JCQkvLyBjaGVjayBpZiB0aGUgZmVhdHVyZSBuYW1lIGlzIG1hcHBlZCB0byBhbm90aGVyIHhtbCBmZWF0dXJlIG5hbWUKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSA9IChTdHJpbmcpZmVhdHVyZU5hbWVNYXAuZ2V0KHVtYUZlYXR1cmVuYW1lKTsKLQkJCWlmICggZmVhdHVyZU5hbWUgIT0gbnVsbCApIHsKLQkJCQlpbnQgaSA9IGZlYXR1cmVOYW1lLmluZGV4T2YoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICggaSA+IDAgKSB7Ci0JCQkJCWlmICggZmVhdHVyZU5hbWUuc3Vic3RyaW5nKDAsaSkuZXF1YWxzKHhtbEZlYXR1cmVOYW1lKSB8fCAKLQkJCQkJCSBmZWF0dXJlTmFtZS5zdWJzdHJpbmcoaSsxKS5lcXVhbHMoeG1sRmVhdHVyZU5hbWUpCSkgewotCQkJCQkJcmV0dXJuIGZlYXR1cmU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIGZlYXR1cmVOYW1lLmVxdWFscyh4bWxGZWF0dXJlTmFtZSkgKSB7Ci0JCQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQotCQkvL1N5c3RlbS5vdXQucHJpbnQoIkZlYXR1cmVNYW5hZ2VyOiBVbmFibGUgdG8gZmluZCB1bWEgZmVhdHVyZSBmb3IgeG1sIGZlYXR1cmUiICsgeG1sRmVhdHVyZU5hbWUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjbGF6egotCSAqIEBwYXJhbSB1bWFGZWF0dXJlTmFtZQotCSAqIEBwYXJhbSBvYmplY3RUeXBlCi0JICogQHJldHVybiB0aGUgY29ycnNwb25kaW5nIHhtbCBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0WG1sRmVhdHVyZShFQ2xhc3MgY2xhenosIFN0cmluZyB1bWFGZWF0dXJlTmFtZSwgU3RyaW5nIG9iamVjdFR5cGUpIHsKLQotCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSB1bWFGZWF0dXJlTmFtZTsKLQkJaWYgKCBmZWF0dXJlTmFtZU1hcC5jb250YWluc0tleShmZWF0dXJlTmFtZSkgKSB7Ci0JCQlmZWF0dXJlTmFtZSA9IChTdHJpbmcpZmVhdHVyZU5hbWVNYXAuZ2V0KGZlYXR1cmVOYW1lKTsKLQkJCQotCQkJLy8gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHVuaXF1ZSwgdXNlIHRoZSBmaXJzdCBvbmUKLQkJCWludCBpID0gZmVhdHVyZU5hbWUuaW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIGkgPiAwICkgewotCQkJCVN0cmluZyBuYW1lID0gZmVhdHVyZU5hbWUuc3Vic3RyaW5nKDAsIGkpOwotCQkJCWlmICggb2JqZWN0VHlwZSAhPSBudWxsICkgewkJCQkKLQkJCQkJLy8gcGljayB0aGUgZmVhdHVyZSBiYXNlZCBvbiBvYmplY3QgdHlwZQotCQkJCQlpZiAoICFuYW1lLmVxdWFsc0lnbm9yZUNhc2Uob2JqZWN0VHlwZSkgKSB7Ci0JCQkJCQluYW1lID0gZmVhdHVyZU5hbWUuc3Vic3RyaW5nKGkrMSk7Ci0JCQkJCX0KLQkJCQkJaWYgKCAhbmFtZS5lcXVhbHNJZ25vcmVDYXNlKG9iamVjdFR5cGUpICkgewotCQkJCQkJbmFtZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJZmVhdHVyZU5hbWUgPSBuYW1lOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIGZlYXR1cmVOYW1lID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBjbGF6ei5nZXRFU3RydWN0dXJhbEZlYXR1cmUoZmVhdHVyZU5hbWUpOwotCQlpZiAoIChmZWF0dXJlPT1udWxsKSAmJiAoY2xhenouZ2V0TmFtZSgpLmVxdWFscygiQ29udGVudENhdGVnb3J5UGFja2FnZSIpKSAmJiBmZWF0dXJlTmFtZS5lcXVhbHMoImNvbnRlbnRFbGVtZW50IikgKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZmVhdHVyZSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCk7Ci0JCX0KLQotLy8JCWlmICggZmVhdHVyZSA9PSBudWxsICkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHhtbCBmZWF0dXJlICIgKyBmZWF0dXJlTmFtZSArICIgZm9yIGNsYXNzICIgKyBjbGF6ei5nZXROYW1lKCkpOwotLy8JCX0KLQkJCi0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdW1hRUNsYXNzTmFtZQotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgeG1sIGVjbGFzcwotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRUNsYXNzKFN0cmluZyB1bWFFQ2xhc3NOYW1lKSB7Ci0vLwkJRUNsYXNzIHJvb3RDbGFzcyA9IEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290KG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UuZUlOU1RBTkNFKTsKLS8vCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcylyb290Q2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKHVtYUVDbGFzc05hbWUpOwotLy8JCXJldHVybiBlQ2xhc3M7Ci0JCQotCQlFQ2xhc3MgY2xzID0gKEVDbGFzcyl4bWxFQ2xhc3NNYXAuZ2V0KHVtYUVDbGFzc05hbWUpOwotLy8JCWlmICggY2xzID09IG51bGwgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8geG1sIEVDbGFzcyBmb3IgdW1hIGNsYXNzICIgKyB1bWFFQ2xhc3NOYW1lKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gY2xzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0geG1sRUNsYXNzTmFtZQotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgRUNsYXNzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJtY0VDbGFzcyhTdHJpbmcgeG1sRUNsYXNzTmFtZSkgewotCQlFQ2xhc3MgY2xzID0gKEVDbGFzcyl1bWFFQ2xhc3NNYXAuZ2V0KHhtbEVDbGFzc05hbWUpOwotLy8JCWlmICggY2xzID09IG51bGwgKSB7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gdW1hIEVDbGFzcyBmb3IgeG1sIGNsYXNzICIgKyB4bWxFQ2xhc3NOYW1lKTsKLS8vCQl9Ci0JCQotCQlyZXR1cm4gY2xzOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZmVhdHVyZW5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZlYXR1cmUgaXMgdW5uZWVkZWQgZ2l2ZW4gYnkgZmVhdHVyZW5hbWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbm5lZWRlZFJtY0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmVuYW1lKSB7Ci0JCXJldHVybiB1bm5lZWRlZFJtY0ZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmVuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmVuYW1lCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSB4bWwgZmVhdHVyZSBpcyB1bm5lZWRlZCBnaXZlbiBieSBmZWF0dXJlbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VubmVlZGVkWG1sRmVhdHVyZShTdHJpbmcgZmVhdHVyZW5hbWUpIHsKLQkJcmV0dXJuIHVubmVlZGVkWG1sRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZW5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludHMgdGhlIGZlYXR1cmUtbmFtZSBtYXAuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRGZWF0dXJlTmFtZU1hcHBpbmcoKSB7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNoZWNrbGlzdCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbmNlcHQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uY2VwdCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUN1c3RvbUNhdGVnb3J5KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcmFibGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURvbWFpbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEb21haW4oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGFtcGxlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3VpZGVsaW5lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUl0ZXJhdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZExpYnJhcnkoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWlsZXN0b25lKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1pbGVzdG9uZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU91dGNvbWUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXBvcnQoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXVzYWJsZUFzc2V0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2FkbWFwKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0aW9uKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSb2xlU2V0KCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdGlvbigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2soKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlbXBsYXRlKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlbXBsYXRlKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2woKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUb29sTWVudG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXaGl0ZXBhcGVyKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdoaXRlcGFwZXIoKSk7Ci0JCXByaW50RmVhdHVyZShVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlwcmludEZlYXR1cmUoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCksIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKTsKLQkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSk7Ci0vLwkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSk7Ci0vLwkJcHJpbnRGZWF0dXJlKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZSgpLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoKSk7Ci0KLQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgcHJpbnRGZWF0dXJlKEVPYmplY3Qgb2JqMSwgRU9iamVjdCBvYmoyKSB7Ci0JCUxpc3QgbWF0Y2hlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB1bm1hdGNoZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgdW1hRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCi0JCUVMaXN0IGZlYXR1cmVzID0gb2JqMS5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJaWYgKCBmZWF0dXJlTmFtZU1hcC5jb250YWluc0tleShuYW1lKSApIHsKLQkJCQlTdHJpbmcgeG1sX25hbWUgPSAoU3RyaW5nKSBmZWF0dXJlTmFtZU1hcC5nZXQobmFtZSk7Ci0JCQkJaW50IGluZHggPSB4bWxfbmFtZS5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIGluZHggPiAwICkgewotCQkJCQltYXRjaGVkLmFkZCh4bWxfbmFtZS5zdWJzdHJpbmcoMCwgaW5keCkpOwotCQkJCQltYXRjaGVkLmFkZCh4bWxfbmFtZS5zdWJzdHJpbmcoaW5keCsxKS50cmltKCkpOwkJCQkJCi0JCQkJfQotCQkJCWVsc2UgaWYgKCAhbWF0Y2hlZC5jb250YWlucyh4bWxfbmFtZSkgKSB7Ci0JCQkJCW1hdGNoZWQuYWRkKHhtbF9uYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghdW5uZWVkZWRSbWNGZWF0dXJlcy5jb250YWlucyhuYW1lKSAmJiAhdW1hRmVhdHVyZXMuY29udGFpbnMobmFtZSkgKSB7Ci0JCQkJdW1hRmVhdHVyZXMuYWRkKG5hbWUpOwotCQkJfQotCQl9CQkJCi0JCQotCQlmZWF0dXJlcyA9IG9iajIuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQkJCWlmICggdW1hRmVhdHVyZXMuY29udGFpbnMobmFtZSkgKSB7Ci0JCQkJdW1hRmVhdHVyZXMucmVtb3ZlKG5hbWUpOwotCQkJfSBlbHNlIGlmICghdW5uZWVkZWRYbWxGZWF0dXJlcy5jb250YWlucyhuYW1lKSAmJiAhbWF0Y2hlZC5jb250YWlucyhuYW1lKSAmJiAhdW5tYXRjaGVkLmNvbnRhaW5zKG5hbWUpICkgewotCQkJCXVubWF0Y2hlZC5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0JCi0JCQotCQlpZiAoIHVtYUZlYXR1cmVzLnNpemUoKSArIHVubWF0Y2hlZC5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PSB1bi1tYXRjaGVkIGZlYXR1cmVzIGZvciAiICsgb2JqMS5lQ2xhc3MoKS5nZXROYW1lKCkgKyAiID09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZm9yICggSXRlcmF0b3IgaXQgPSB1bWFGZWF0dXJlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHRmZWF0dXJlTmFtZU1hcC5wdXQoXCIiICsgbmFtZSArICJcIiwgXCJcIik7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4obmFtZSk7Ci0JCX0KLQkJZm9yICggSXRlcmF0b3IgaXQgPSB1bm1hdGNoZWQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHQiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCQotLy8JcHVibGljIGNsYXNzIEZlYXR1cmVNYXAgewotLy8JCXByaXZhdGUgTWFwIGZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQotLy8JCUZlYXR1cmVNYXAoRUNsYXNzIGNsYXp6KSB7Ci0vLwkJCUVMaXN0IGZlYXR1cmVzID0gY2xhenouZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotLy8JCQlmb3IgKCBJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpaXQubmV4dCgpOwotLy8JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotLy8JCQl9CQkJCi0vLwkJfQotLy8JCQotLy8JCXB1YmxpYyBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLS8vCQkJcmV0dXJuIChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmVOYW1lKTsJCQkKLS8vCQl9Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL1hNTExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2OWYxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvc2VydmljZXMvWE1MTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQ29udGVudFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuSUxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbW1vbmouc2RvLlR5cGU7Ci0KLS8qKgotICogWG1sTGlicmFyeSByZXByZXNlbnRzIGEgbWV0aG9kIGxpYnJhcnkgbG9hZGVkIGZyb20gYSBzcGVjaWZpZWQgeG1sIGZpbGUgVGhlCi0gKiB4bWwgZmlsZSBzaG91bGQgYmUgdmFsaWQgdG8gdGhlIHhtbCBzY2hlbWEgZm9yIE1ldGhvZExpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFhNTExpYnJhcnkgewotCi0JcHJpdmF0ZSBTdHJpbmcgZmlsZVBhdGg7Ci0KLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOwotCi0JcHJpdmF0ZSBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSByb290T2JqZWN0OwotCi0JLy8gbWFwIG9mIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZSBmb3IgZWFjaCBwbHVnaW4gaWQKLQlwcml2YXRlIE1hcCBjb250ZW50Q2F0ZWdvcnlQa2dNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gbWFwIG9mIGNyZWF0ZWQgZWxlbWVudHMsIGd1aWQgLSBFRGF0YU9iamVjdAotCXByaXZhdGUgTWFwIGVsZW1lbnRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBYTUxMaWJyYXJ5KENvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MsIElMb2dnZXIgbG9nZ2VyLAotCQkJU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCXRoaXMuY29udGVudFByb2MgPSBjb250ZW50UHJvYzsKLQkJdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0JCXRoaXMuZmlsZVBhdGggPSBmaWxlUGF0aDsKLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gcm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3RPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBmaWxlIHBhdGggc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmZpbGVQYXRoOwotCX0KLQotCS8qKgotCSAqIGdldCBhbiBhcnJheSBvZiBwbHVnaW4gaWRzIGluIHRoZSBsaWJyYXJ5Ci0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQbHVnaW5JZHMoKSB7Ci0JCUxpc3QgcGx1Z2lucyA9IHJvb3RPYmplY3QuZ2V0TWV0aG9kUGx1Z2luKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbcGx1Z2lucy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCWlkc1tpXSA9ICgoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldChpKSkuZ2V0SWQoKTsKLQkJfQotCi0JCXJldHVybiBpZHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIGEgbmV3IFhNTCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVMaWJyYXJ5KFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLQotCQlNZXRob2RMaWJyYXJ5IHJvb3QgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIiI7CQkJCQkJCQkvLyROT04tTkxTLTEkCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBWZXJzaW9uVXRpbC5nZXRBbGxUb29sSURzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB0b29sSUQgPSAoU3RyaW5nKWl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnModG9vbElEKS5nZXRNaW5Ub29sVmVyc2lvbkZvckN1cnJlbnRYTUxTY2hlbWFWZXJzaW9uKCkuZ2V0VG9vbFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJdmVyc2lvbiArPSBWZXJzaW9uVXRpbC5YTUxfVkVSU0lPTlNfU0VQQVJBVE9SOwotCQkJfQotCQkJdmVyc2lvbiArPSB0b29sSUQgKyBWZXJzaW9uVXRpbC5YTUxfVE9PTF9WRVJTSU9OX1NFUEFSQVRPUiArIHRvb2xWZXJzaW9uOwkJCi0JCX0KLQkJaWYgKHZlcnNpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyb290LnNldFRvb2wodmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZShpZCwgbmFtZSwgcm9vdCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHhtbCBmaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8qCQl0cnkgeyovCi0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotCQkJLy8gR2V0IHRoZSBVUkkgb2YgdGhlIG1vZGVsIGZpbGUuCi0JCQkvLwotCQkJVVJJIGZpbGVVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSSgobmV3IEZpbGUodGhpcy5maWxlUGF0aCkpLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJCS8vCi0JCQkvLyBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpCi0JCQkJCS5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0KLQkJCXJlc291cmNlLmxvYWQobmV3IEhhc2hNYXAoKSk7Ci0KLQkJCS8vIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoZmlsZVVSSSwgZmFsc2UpOwotCi0JCQkvLyBFQ2xhc3MgZUNsYXNzID0KLQkJCS8vIEV4dGVuZGVkTWV0YURhdGEuSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290KHVtYVBhY2thZ2UpOwotCi0JCQlEb2N1bWVudFJvb3Qgcm9vdCA9IChEb2N1bWVudFJvb3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByb290LmVDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQl0aGlzLnJvb3RPYmplY3QgPSAoTWV0aG9kTGlicmFyeSkgbzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotLyoKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgbG9hZGVkIik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZCgKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3JfbG9hZF94bWwsIGZpbGVQYXRoKSwgZSk7Ci0JCX0qLwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSB0aGUgbGlicmFyeSBhbmQgcmV0dXJuIHRoZSByb290IG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBmaWxlUGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgY3JlYXRlKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUsIE1ldGhvZEVsZW1lbnQgcm9vdCkgewotCi0JCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldAotCQkvLwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotCQkvLyBHZXQgdGhlIFVSSSBvZiB0aGUgbW9kZWwgZmlsZS4KLQkJLy8KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodGhpcy5maWxlUGF0aCk7Ci0JCVVSSSBmaWxlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJLy8gQ3JlYXRlIGEgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJLy8KLQkJLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShmaWxlVVJJKTsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpCi0JCQkJLmNyZWF0ZVJlc291cmNlKGZpbGVVUkkpOwotCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQocmVzb3VyY2UpOwotCi0JCS8vIEFkZCB0aGUgaW5pdGlhbCBtb2RlbCBvYmplY3QgdG8gdGhlIGNvbnRlbnRzLgotCQkvLyByb290LnNldElkKGlkKTsKLQkJLy8gcm9vdC5zZXROYW1lKG5hbWUpOwotCi0JCXNldEVsZW1lbnQoaWQsIHJvb3QpOwotCi0JCS8vIHRoaXMucm9vdE9iamVjdCA9IHJvb3Q7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHJvb3QpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCW9wdGlvbnMucHV0KFhNTFJlc291cmNlLk9QVElPTl9FTkNPRElORywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc291cmNlLnNhdmUob3B0aW9ucyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlpZiAocm9vdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCXRoaXMucm9vdE9iamVjdCA9IChNZXRob2RMaWJyYXJ5KSByb290OwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMucm9vdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcmV0dXJuIGEgY29udGVudCBjYXRlcmdvcnkgcGFja2FnZSBpbiB0aGUgcGx1Z2luIGdpdmVuIGJ5IHBsdWdpbklkLgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKFN0cmluZyBwbHVnaW5JZCkgewotCi0JCUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgcGtnID0gKENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpIGNvbnRlbnRDYXRlZ29yeVBrZ01hcAotCQkJCS5nZXQocGx1Z2luSWQpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXJldHVybiBwa2c7Ci0JCX0KLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZ2V0RWxlbWVudChwbHVnaW5JZCk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfbm9fcGx1Z2luLAotCQkJCQlwbHVnaW5JZCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCk7Ci0JCXBrZy5zZXROYW1lKCJDb250ZW50Q2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0KLQkJc2V0RWxlbWVudChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHBrZyk7Ci0KLQkJcGx1Z2luLmdldE1ldGhvZFBhY2thZ2UoKS5hZGQocGtnKTsKLQotCQljb250ZW50Q2F0ZWdvcnlQa2dNYXAucHV0KHBsdWdpbklkLCBwa2cpOwotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB4bWwgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZSB0byB0aGUgZmlsZSBzeXN0ZW0uCi0JCS8vCi0JCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3RPYmplY3QuZVJlc291cmNlKCk7Ci0JCXJlc291cmNlLnNhdmUob3B0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IG9wZW4oKSB7Ci0JCXJldHVybiByb290T2JqZWN0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBiYXNlIGxpYnJhcnkgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgZ2V0RWxlbWVudChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gKEVEYXRhT2JqZWN0KSBlbGVtZW50c01hcC5nZXQoZ3VpZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYmFzZSBsaWJyYXJ5IGVsZW1lbnQuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIGdldEVsZW1lbnQoKChNZXRob2RFbGVtZW50KSBvYmopLmdldElkKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4gZWxtZW5lbnQgaWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudElkKEVEYXRhT2JqZWN0IG9iaikgewotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldElkKCk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQlyZXR1cm4gKChXb3JrT3JkZXIpIG9iaikuZ2V0SWQoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbGVtZW50KFN0cmluZyBndWlkLCBFRGF0YU9iamVjdCBvYmopIHsKLQkJLy8gYWRkRWxlbWVudFRvQ29udGFpbmVyKGNvbnRhaW5lciwgb2JqKTsKLQkJaWYgKCFlbGVtZW50c01hcC5jb250YWluc0tleShndWlkKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCSgoTWV0aG9kRWxlbWVudCkgb2JqKS5zZXRJZChndWlkKTsKLQkJCX0KLQotCQkJZWxlbWVudHNNYXAucHV0KGd1aWQsIG9iaik7Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgYWRkRWxlbWVudFRvQ29udGFpbmVyKEVEYXRhT2JqZWN0IGNvbnRhaW5lciwgRURhdGFPYmplY3QKLQkvLyBjaGlsZCkgewotCS8vCQkKLQkvLyB0cnkgewotCS8vIGlmICggY29udGFpbmVyID09IG51bGwgKSB7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLwkJCQotCS8vIGlmICggY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8Ci0JLy8gY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlICkgewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8JCQkKLQkvLyB3aGlsZSAoICEoY29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgJiYgKGNvbnRhaW5lciAhPSBudWxsKSApIHsKLQkvLyBjb250YWluZXIgPSBjb250YWluZXIuZUNvbnRhaW5lcigpOwotCS8vIH0KLQkvLwkJCQotCS8vIGlmICggY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgKSB7Ci0JLy8gKChDb250ZW50UGFja2FnZSljb250YWluZXIpLmdldENvbnRlbnRFbGVtZW50KCkuYWRkKGNoaWxkKTsKLQkvLyB9IGVsc2UgaWYgKCBjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSApIHsKLQkvLyAoKFByb2Nlc3NQYWNrYWdlKWNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGQoY2hpbGQpOwotCS8vIH0gZWxzZSB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb24ndCBrbm93IGhvdyB0byBzZXQgZWxlbWVudCAiICsgY2hpbGQpOwotCS8vIH0KLQkvLyB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogY3JlYXRlIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgZ3VpZAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIGNvbnRhaW5lciBvZiB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkCi0JICogQHBhcmFtIHVtYUZlYXR1cmVOYW1lCi0JICogICAgICAgICAgICB1bWEgZmVhdHVyZSBmb3IgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEBwYXJhbSB1bWFFQ2xhc3NOYW1lCi0JICogICAgICAgICAgICB1bWEgRUNsYXNzIG5hbWUgZm9yIHRoZSBmZWF0dXJlCi0JICogQHBhcmFtIHVtYUVsZW1lbnRUeXBlCi0JICogICAgICAgICAgICB1bWEgZWxlbWVudCB0eXBlIGZvciB0aGUgZWxlbWVudCB0byBiZSBjcmVhdGVkCi0JICogQHBhcmFtIGd1aWQKLQkgKiAgICAgICAgICAgIGd1aWQgb2YgdGhlIGVsZW1lbnQgdG8gYmUgY3JlYXRlZAotCSAqIEByZXR1cm4gRURhdGFPYmplY3QgdGhlIFhtbCB1bWEgZWxlbWVudAotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVFbGVtZW50KEVEYXRhT2JqZWN0IGNvbnRhaW5lciwKLQkJCVN0cmluZyB1bWFGZWF0dXJlTmFtZSwgU3RyaW5nIHVtYUVDbGFzc05hbWUsIFN0cmluZyB1bWFFbGVtZW50VHlwZSwKLQkJCVN0cmluZyBndWlkKSB7Ci0KLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChndWlkKTsKLQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQlpZiAoRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuaXNVbm5lZWRlZFJtY0ZlYXR1cmUodW1hRmVhdHVyZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUoCi0JCQkJCWNvbnRhaW5lci5lQ2xhc3MoKSwgdW1hRmVhdHVyZU5hbWUsIHVtYUVsZW1lbnRUeXBlKTsKLQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZCgKLQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X25vX2ZlYXR1cmUsIGNvbnRhaW5lcgotCQkJCQkJCQkuZUNsYXNzKCkuZ2V0TmFtZSgpLCB1bWFGZWF0dXJlTmFtZSkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpICkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBjcmVhdGluZyBlbGVtZW50OiBjb250YWlubWVudCBmZWF0dXJlCi0JCQkvLyBzaG91bGQgYmUgRVJlZmVyZW5jZSB0eXBlLiAiICsgZmVhdHVyZS5nZXROYW1lKCkpOwotCQkJLy8gLy9yZXR1cm4gbnVsbDsKLQkJCS8vIH0KLQotCQkJLy8gLy8gdGhpcyBpcyBhbiBlYXNpZXIgd2F5LCB0ZXN0IGl0LAotCQkJLy8gLy8gZG9lcyBub3Qgd29yayBzaW5jZSBmZWF0dXJlLmdldEVUeXBlKCkgcmV0dXJucyB0aGUgYmFzZQotCQkJLy8gZWxlbWVudCB0eXBlLCBub3QgdGhlIGV4dGVuZGVkIG9uZQotCQkJLy8gLy8gZm9yIGV4YW1wbGUsIGl0IHJldHVybnMgTWV0aG9kUGFja2FnZSBpbnN0ZWFkIG9mCi0JCQkvLyBQcm9jZXNzUGFja2FnZSBvciBDb250ZW50UGFja2FnZQotCQkJLy8gLy8gc28gd2UgbmVlZCB0byBtYWtlIG91ciBvd24gbWFwCi0JCQkvLyBFQ2xhc3NpZmllciBjID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJLy8gaWYgKCAhYy5nZXROYW1lKCkuZXF1YWxzKHVtYUVDbGFzc05hbWUpICkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFQ2xhc3MgbmFtZSBub3QgbWF0Y2g6ICIgKyBjLmdldE5hbWUoKSArICIKLQkJCS8vIC0tLSAiICsgdW1hRUNsYXNzTmFtZSk7Ci0JCQkvLyB9Ci0KLQkJCUVDbGFzcyBvYmpDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFCi0JCQkJCS5nZXRYbWxFQ2xhc3ModW1hRUNsYXNzTmFtZSk7Ci0JCQlpZiAob2JqQ2xhc3MgPT0gbnVsbCkgewotCQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfbm9fY2xhc3MsIHVtYUVDbGFzc05hbWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJb2JqID0gKEVEYXRhT2JqZWN0KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsKLQkJCXNldEVsZW1lbnQoZ3VpZCwgb2JqKTsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCS8vIFdvcmtPcmRlciBpcyBub3QgY29udGFpbmVkIGluIGEgcHJvY2Vzc1BhY2thZ2UgaW4geG1sIG1vZGVsCi0JCQkJLy8gaXQncyBjb250YWluZWQgYnkgdGhlIGJyZWFrZG93bkVsZW1lbnQKLQkJCQkvLyBzbyB3ZSBzYXZlIHRoZSBlbGVtZW50IGlkLW9iamVjdCB0byB0aGUgbWFwIGFuZCBjb250aW51ZQotCQkJCS8vIGRvbid0IHNldCB0aGUgZmVhdHVyZSB2YWx1ZQotCQkJCQotCQkJCS8vIHRoZSB3b3JrT3JkZXIgaW4gRVBGIFVNQSBtb2RlbCBpcyByZWZlcmVuY2VkIGJ5IGZlYXR1cmUKLQkJCQkvLyBXb3JrQnJlYWtEb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvciwKLQkJCQkvLyB0aGUgY29ycmVzcG9uZGluZyBmZWF0dXJlIGluIHRoZSB4bWwgbW9kZWwgaXMgCi0JCQkJLy8gV29ya0JyZWFrRG93bkVsZW1lbnRfUHJlZGVjZXNzb3IsIAotCQkJCS8vIHRoZSBmZWF0dXJlIHZhbHVlIGlzIGEgbGlzdCBvZiBndWlkIG9mIHRoZSBXb3JrT3JkZXJzCi0JCQkJLy8gd2hlbiB0aGlzIGZlYXR1cmUgdmFsdWUgaXMgc2V0IGluIHRoZSBzZXRSZWZlcmVuY2VWYWx1ZSgpIGNhbGwKLQkJCQkvLyBnZXQgdGhlIFhtbFVtYSBvYmplY3QsIGlmIGl0J3MgV29ya09yZGVyLCAKLQkJCQkvLyBhZGQgdG8gdGhlIGN1cnJlbnQgd29ya29yZGVyIHRvIHRoZSBXb3JrQnJlYWtEb3duRWxlbWVudAotCQkJCS8vIEppbmh1YSBYaSwgMDgvMjQvMjAwNgotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0KLQkJCS8vIG5vdGU6IGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgYXJlIHN0cmluZyB0eXBlIChpZCkKLQkJCS8vIHBhY2thZ2UgcmVmZXJlbmNlcyBhcmUgb2JqZWN0IHJlZmVyZW5jZXMKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJCQl2YWx1ZXMuYWRkKGd1aWQpOwotCi0JCQkJCQkvLyBuZWVkIHRvIHB1dCB0aGUgb2JqZWN0IGluIGEgY29udGFpbmVyCi0JCQkJCQkvLyBmb3IgZXhhbXBsZSwgdGhlIENvbnRhaWVkQXJ0aWZhY3RzCi0JCQkJCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0KLQkJCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl2YWx1ZXMuYWRkKG9iaik7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkubG9nV2FybmluZyhOTFMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50LAotCQkJCQkJCQkJCQkJZmVhdHVyZS5nZXROYW1lKCkpKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoCi0JCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlLCBvYmosCi0JCQkJCQkJY29udGFpbmVyKSwgZSk7Ci0JCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQkJY29udGFpbmVyLmVTZXQoZmVhdHVyZSwgZ3VpZCk7Ci0JCQkJCWFkZFRvQ29udGFpbmVyKGNvbnRhaW5lciwgb2JqKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCWNvbnRhaW5lci5lU2V0KGZlYXR1cmUsIG9iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQsCi0JCQkJCQkJZmVhdHVyZS5nZXROYW1lKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0NvbnRhaW5lcihFT2JqZWN0IGNvbnRhaW5lciwgRU9iamVjdCBvYmopIHsKLQotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCSgoQ29udGVudFBhY2thZ2UpIGNvbnRhaW5lcikuZ2V0Q29udGVudEVsZW1lbnQoKS5hZGQoKENvbnRlbnRFbGVtZW50KW9iaik7Ci0JCX0gZWxzZSBpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGQoKFByb2Nlc3NFbGVtZW50KW9iaik7Ci0JCQkvLyB9IGVsc2UgaWYgKCAob2JqIGluc3RhbmNlb2YgQ29uc3RyYWludCkgJiYgKGNvbnRhaW5lciBpbnN0YW5jZW9mCi0JCQkvLyBNZXRob2RFbGVtZW50KSApIHsKLQkJCS8vIC8vIHRoZSBvd25lciBydWxlIHNob3VsZCBiZSBhIGNvbnRhaW5tZW50IDAuLm4gZmVhdHVyZSwgd2FpdGluZwotCQkJLy8gZm9yIG1vZGVsIGZpeAotCQkJLy8gLy8oKE1ldGhvZEVsZW1lbnQpY29udGFpbmVyKS5zZXRPCi0JCX0gZWxzZSB7Ci0JCQlhZGRUb0NvbnRhaW5lcihjb250YWluZXIuZUNvbnRhaW5lcigpLCBvYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZS4KLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGZlYXR1cmVOYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZShFRGF0YU9iamVjdCBvYmosIFN0cmluZyBmZWF0dXJlTmFtZSwKLQkJCU9iamVjdCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvYmogPT0gbnVsbCB8fCBmZWF0dXJlTmFtZSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBFRGF0YU9iamVjdCkgewotCQkJaWYgKGZlYXR1cmVOYW1lLmVxdWFscygibWV0aG9kRWxlbWVudFByb3BlcnR5IikpIHsJCS8vJE5PTi1OTFMtMSQKLQkJCQlzZXRNZXBGZWF0dXJlVmFsdWUob2JqLCBmZWF0dXJlTmFtZSwgdmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9pbnZhbGlkX2ZlYXR1cmVfdmFsdWUsCi0JCQkJCWZlYXR1cmVOYW1lLCB2YWx1ZSkpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBmZWF0dXJlIGFuZCBzZXQgdGhlIHZhbHVlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0WG1sRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCi0JCQkvLyBpZ25vcmUgbWlzc2luZyBmZWF0dXJlcyBmb3IgV29ya09yZGVyCi0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBXb3JrT3JkZXIpKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBmZWF0dXJlTmFtZSwgb2JqLCB2YWx1ZSB9OwotCQkJCWxvZ2dlcgotCQkJCQkJLmxvZ1dhcm5pbmcoTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8yLAotCQkJCQkJCQkJCXBhcmFzKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyAxNTg2ODggLSBNaXNzaW5nIHRlbXBsYXRlIGZpbGVzIGluIGV4cG9ydGVkIHhtbCBsaWJyYXJ5Ci0JCS8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnQgdXJsCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSApIHsKLQkJCWlmICggdmFsdWUgIT0gbnVsbCApIHsKLQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVBdHRhY2htZW50UmVzb3VyY2VzKG9iaiwgdmFsdWUudG9TdHJpbmcoKS50cmltKCkpOwotCQkJfQotCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygidmFyaWFiaWxpdHlUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFZhcmlhYmlsaXR5VHlwZS5nZXQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoImxpbmtUeXBlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IFdvcmtPcmRlclR5cGUuZ2V0KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBqYXZhLnV0aWwuRGF0ZSkgewotCQkJCQkvLyBjb252ZXJ0IGphdmEudXRpbC5EYXRlIHRvIHhtbCBEYXRlCi0JCQkJCXZhbHVlID0gZ2V0WG1sRGF0ZSgoamF2YS51dGlsLkRhdGUpIHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKChjb250ZW50UHJvYyAhPSBudWxsKQotCQkJCQkJJiYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQkmJiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJCXZhbHVlID0gY29udGVudFByb2MucmVzb2x2ZVJlc291cmNlRmlsZXMoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgKFN0cmluZykgdmFsdWUpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBqYXZhLm5ldC5VUkkpIHsJCQkJCQkJCQkKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gc3JjUGx1Z2luID0gRXhwb3J0UmVzb3VyY2VIYW5kbGVyLmdldFNvdXJjZVBsdWdpbigob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCkgb2JqKTsJCQotCQkJCQl2YWx1ZSA9IHNyY1BsdWdpbi5nZXROYW1lKCkgKyAiLyIgKyAoKGphdmEubmV0LlVSSSkgdmFsdWUpLmdldFBhdGgoKTsgLy8vLyROT04tTkxTLTEkCi0JCQkJCWlmIChjb250ZW50UHJvYyAhPSBudWxsKSB7Ci0JCQkJCQljb250ZW50UHJvYy5jb3B5UmVzb3VyY2UoKFN0cmluZykgdmFsdWUsIG9iaiwgc3JjUGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlvYmouZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGZlYXR1cmVOYW1lLCBvYmosIHZhbHVlIH07Ci0JCQkJbG9nZ2VyCi0JCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLnhtbExpYnJhcnlfZXJyb3Jfc2V0X3ZhbHVlXzIsCi0JCQkJCQkJCQkJCQlwYXJhcyksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3NldF92YWx1ZV8zKTsgCi0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNZXBGZWF0dXJlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlMaXN0IHNyY0xpc3QgPSAoTGlzdCkgdmFsdWU7Ci0JCWlmIChzcmNMaXN0ID09IG51bGwgfHwgc3JjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUob2JqCi0JCQkJLmVDbGFzcygpLCBmZWF0dXJlTmFtZSk7Ci0JCUxpc3QgdGd0TGlzdCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3JjTGlzdC5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IHNyY0l0ZW0gPSBzcmNMaXN0LmdldChpKTsKLQkJCWlmIChzcmNJdGVtIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkpIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXAgPSAKLQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgc3JjSXRlbTsKLQkJCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCS5nZXRYbWxFQ2xhc3MoIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOwkvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUob2JqQ2xhc3MpOwotCQkJCXhtbE1lcC5zZXRWYWx1ZShtZXAuZ2V0VmFsdWUoKSk7Ci0JCQkJeG1sTWVwLnNldE5hbWUobWVwLmdldE5hbWUoKSk7Ci0JCQkJdGd0TGlzdC5hZGQoeG1sTWVwKTsKLQkJCX0KLQkJfQotCQkvL29iai5lU2V0KGZlYXR1cmUsIHRndExpc3QpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgaWQgcmVmZXJlbmNlcyBmb3IgdGhlIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIEVEYXRhT2JqZWN0IHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgZmVhdHVyZSBvZiB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIGlkVmFsdWUKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgaWQgcmVmZXJlbmNlIHZhbHVlIG9mIHRoZSBmZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlVHlwZQotCSAqICAgICAgICAgICAgVHlwZSB0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIHJlZmVyZW5jZS4gTmVlZCB0byBoYXZlIHRoaXMgdG8KLQkgKiAgICAgICAgICAgIGRldGVybWluZSB0aGUgeG1sIGZlYXR1cmUgaW4gY2FzZSB0aGUgZmVhdHVyZSBtYXBwdGluZyBpcyBub3QKLQkgKiAgICAgICAgICAgIHVuaXF1ZQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlTdHJpbmcgaWRWYWx1ZSwgVHlwZSB2YWx1ZVR5cGUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCBpZFZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5pc1VubmVlZGVkUm1jRmVhdHVyZShmZWF0dXJlTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRYbWxGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUsIHZhbHVlVHlwZS5nZXROYW1lKCkpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGZlYXR1cmVOYW1lLCBvYmosIGlkVmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKAotCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlLCBwYXJhcykpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHN0ciA9IGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXROYW1lKCk7Ci0JCWlmIChzdHIuZXF1YWxzKCJTdHJpbmciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgbCA9IChMaXN0KSBvYmouZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoIWwuY29udGFpbnMoaWRWYWx1ZSkpIHsKLQkJCQkJbC5hZGQoaWRWYWx1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlvYmouZVNldChmZWF0dXJlLCBpZFZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSkgewotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgYnJlYWtkb3duIGVsZW1lbnQuIEluIHVtYSwgYnJlYWtkb3duCi0JCQkvLyBlbGVtZW50cyBhcmUgdW5kZXIgcHJvY2VzcyBwYWNrYWdlcwotCQkJLy8gaW4geG1sIG1vZGVsLCB0aGV5IGFyZSBvd25lZCBieSB0aGUgYWN0aXZpdHkKLQkJCUVEYXRhT2JqZWN0IHYgPSBnZXRFbGVtZW50KGlkVmFsdWUpOwotCQkJaWYgKHYgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJRU9iamVjdCBvbGRfY29udGFpbmVyID0gdi5lQ29udGFpbmVyKCk7Ci0JCQkJTGlzdCBsID0gKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpOwotCQkJCWlmICghbC5jb250YWlucyh2KSkgewotCQkJCQlsLmFkZCh2KTsKLQkJCQl9Ci0KLQkJCQkvLyBpZiB0aGUgb2xkIGNvbnRhaW5lciBwYWNrYWdlIGlzIGVtcHR5LCBkZWxldGUgaXQKLQkJCQlpZiAoKG9sZF9jb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkKLQkJCQkJCSYmIChvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJCWlmICgoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyKS5nZXRQcm9jZXNzRWxlbWVudCgpCi0JCQkJCQkJLnNpemUoKSA9PSAwKSB7Ci0JCQkJCQkoKFByb2Nlc3NQYWNrYWdlKSBvbGRfY29udGFpbmVyLmVDb250YWluZXIoKSkKLQkJCQkJCQkJLmdldE1ldGhvZFBhY2thZ2UoKS5yZW1vdmUob2xkX2NvbnRhaW5lcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSApIHsKLQkJCS8vIHRoZSBvcmtlciBvcmRlciBuZWVkcyB0byBiZSBhZGRlZCB0byB0aGUgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCS8vIHNpbmNlIGluIFhtbCBtb2RlbCB0aGUgd29yayBvcmRlciBpcyBjb250YWluZWQgYnkgdGhlIFdvcmtCcmVha2Rvd25FbGVtZW50Ci0JCQkvLyBKaW5odWEgWGksIDA4LzI0LzIwMDYKLQkJCU9iamVjdCB2ID0gZ2V0RWxlbWVudChpZFZhbHVlKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkJKChXb3JrQnJlYWtkb3duRWxlbWVudClvYmopLmdldFByZWRlY2Vzc29yKCkuYWRkKChXb3JrT3JkZXIpdik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3QgaGFuZGxlZCwgYWRkIHdhcm5pbmcgbG9nCi0JCQkvLyB0aGUgaWQgZmVhdHVyZSB2YWx1ZSBpcyBub3Qgc2V0Ci0JCQkvLyBKSW5odWEgWGksIFRPRE8KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkdAotCSAqIEByZXR1cm4gYSBYbWwgZGF0ZS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFhtbERhdGUoamF2YS51dGlsLkRhdGUgZHQpIHsKLQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzcyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkdFN0ciA9IHNkZi5mb3JtYXQoZHQpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnVCcpOwotCQlFRGF0YVR5cGUgdHlwZSA9IFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXREYXRlVGltZSgpOwotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcodHlwZSwgZHRTdHIpOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIHN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCXN0ciA9IG1lLmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiIgKyBtZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmogIT0gbnVsbCkgewotCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIGZpeCB0aGUgbGlicmFyeSBzbyB0aGF0IGl0IG1lZXRzIHRoZSB1bWEgbGlicmFyeSBzdGFuZGFyZHMKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhMaWJyYXJ5Rm9ySW1wb3J0KCkgewotCi0JCWZpeEd1aWQoKE1ldGhvZEVsZW1lbnQpIHJvb3RPYmplY3QpOwotCi0JCWlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kTGlicmFyeSkgcm9vdE9iamVjdCkuZ2V0TWV0aG9kUGx1Z2luKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlmaXhQbHVnaW4oKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChyb290T2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlmaXhQbHVnaW4oKE1ldGhvZFBsdWdpbikgcm9vdE9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBmaXggdGhlIGxpYnJhcnkgc28gdGhhdCBpdCBtZWV0cyB0aGUgeG1sIHNjaGVtYSBzdGFuZGFyZHMKLQkgKiBhbHNvIHJlbW92ZSBwb3NzaWJsZSBzdHJ1Y3R1cmUgZXJyb3JzIHN1Y2ggYXMgUHJvY2Vzc0NvbXBvbmVudCB3aXRob3V0IHByb2Nlc3MgaW4gaXQuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4TGlicmFyeUZvckV4cG9ydCgpIHsKLQotCQlMaXN0IGludmFsaWRJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kTGlicmFyeSkgcm9vdE9iamVjdCkuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQgKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KW9iaikuZ2V0UHJvY2VzcygpOwotCQkJCWlmICggcHJvYyA9PSBudWxsICkgewotCQkJCQlpbnZhbGlkSXRlbXMuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIHRoZSBvYmplY3RzCi0JCXdoaWxlIChpbnZhbGlkSXRlbXMuc2l6ZSgpID4gMCApIHsKLQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpaW52YWxpZEl0ZW1zLnJlbW92ZSgwKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUob2JqKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBmaXggdGFzayBkZXNjcmlwdG9ycyBmb3IgZXhwb3J0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgZml4VGFza0Rlc2NyaXB0b3JzRm9yRXhwb3J0KE1hcDxTdHJpbmcsIFRhc2tEZXNjcmlwdG9yPiB0ZE1hcCkgewotCQlpZiAodGRNYXAgPT0gbnVsbCB8fCB0ZE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+PiBpdCA9IHRkTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IGVudHJ5ID0gaXQubmV4dCgpOwotCQkJU3RyaW5nIGd1aWQgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIHhtbFRkID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yKSBlbGVtZW50c01hcC5nZXQoZ3VpZCk7Ci0JCQlhc3NlcnQoeG1sVGQgIT0gbnVsbCk7Ci0JCQlpZiAoeG1sVGQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCBzdGVwcyA9IHRkLmdldFNlbGVjdGVkU3RlcHMoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzdGVwcy5zaXplKCk7IGkrKykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBzdGVwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgc3RlcHMuZ2V0KGkpOwotCQkJCVNlY3Rpb24geG1sU3RlcCA9ICAoU2VjdGlvbikgZWxlbWVudHNNYXAuZ2V0KHN0ZXAuZ2V0R3VpZCgpKTsKLQkJCQlhc3NlcnQoeG1sU3RlcCAhPSBudWxsKTsKLQkJCQlpZiAoeG1sU3RlcCAhPSBudWxsKSB7Ci0JCQkJCXhtbFN0ZXAgPSAoU2VjdGlvbikgRWNvcmVVdGlsLmNvcHkoeG1sU3RlcCk7Ci0JCQkJCXhtbFRkLmdldFN0ZXAoKS5hZGQoeG1sU3RlcCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9CQkKLQl9Ci0JCQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucyBmb3IgdGhlIGxpYnJhcnkuIFRoZSByZWZlcmVuY2VkIHBsdWdpbnMKLQkgKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvbmVzIGluc2lkZSB0aGlzIGxpYnJhcnkuIFdoZW4gaW1wb3J0aW5nLCB0aGVzZQotCSAqIHBsdWdpbnMgbXVzdCBiZSBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgYWxyZWFkeS4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHJlZmVyZW5jZWQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZWRQbHVnaW5zKCkgewotCi0JCUxpc3QgZXh0ZXJuYWxQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmICghKHJvb3RPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcmV0dXJuIGV4dGVybmFsUGx1Z2luczsKLQkJfQotCi0JCUxpc3Qgc2VsZWN0ZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChNZXRob2RMaWJyYXJ5KSByb290T2JqZWN0KS5nZXRNZXRob2RQbHVnaW4oKQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcGx1Z2luLmdldElkKCk7Ci0JCQlzZWxlY3RlZFBsdWdpbnMuYWRkKGlkKTsKLQkJCWlmIChleHRlcm5hbFBsdWdpbnMuY29udGFpbnMoaWQpKSB7Ci0JCQkJZXh0ZXJuYWxQbHVnaW5zLnJlbW92ZShpZCk7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRyID0gcGx1Z2luLmdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5pdGVyYXRvcigpOyBpdHIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgcmVmID0gKFN0cmluZykgaXRyLm5leHQoKTsKLQkJCQlpZiAoIXNlbGVjdGVkUGx1Z2lucy5jb250YWlucyhyZWYpCi0JCQkJCQkmJiAhZXh0ZXJuYWxQbHVnaW5zLmNvbnRhaW5zKHJlZikpIHsKLQkJCQkJZXh0ZXJuYWxQbHVnaW5zLmFkZChyZWYpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBleHRlcm5hbFBsdWdpbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpeEd1aWQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIHRoZSB4bWwgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGlkIHNwZWNpZmllZCwgY3JlYXRlIGEgbmV3IG9uZQotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldElkKCk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWQgPSBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JCQllbGVtZW50LnNldElkKGlkKTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9uZXdfaWQsCi0JCQkJCWdldFN0cmluZyhlbGVtZW50KSwgaWQpOwotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBlbGVtZW50IGhhcyBhIHVuaXF1ZSBpZCBvciBub3QKLQkJCU9iamVjdCBvbGQgPSBnZXRFbGVtZW50KGlkKTsKLQkJCWlmICgob2xkICE9IG51bGwpICYmIChvbGQgIT0gZWxlbWVudCkpIHsKLQkJCQlpZiAoISAoIChvbGQgaW5zdGFuY2VvZiBTZWN0aW9uKSAmJiAKLQkJCQkJCShlbGVtZW50IGluc3RhbmNlb2YgU2VjdGlvbikgCi0JCQkJCSAgICkpIHsKLQkJCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoCi0JCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMueG1sTGlicmFyeV9pZF9ub3RfdW5pcXVlLCBpZCkpOwotCQkJCX0KLQkJCX0KLQotCQkJc2V0RWxlbWVudChpZCwgZWxlbWVudCk7Ci0JCX0KLQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGRyZW4KLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnQuZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlmaXhHdWlkKChNZXRob2RFbGVtZW50KSBvKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXhQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCS8vIGZpbmQgYWxsIHByb2Nlc3NlcyBhbmQgbWFrZSBzdXJlIHRoZXkgYXJlIHdyYXBwZWQgd2l0aCBhCi0JCS8vIFByb2Nlc3NDb21wb25lbnQsCi0JCS8vIGlmIG5vdCwgY3JlYXRlIG9uZS4KLQkJLy8gY29sbGVjdCB0aGUgcHJvY2Vzc2VzIHRvIGJlIGZpeGVkLAotCQkvLyBkb24ndCBmaXggd2l0aGluIHRoZSBpdGVyYXRpb24sIG1heSBjYXVzZSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkvLyBleGVjZXB0aW9uCi0JCUxpc3QgcHJvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNQcm9jZXNzKG8pKSB7Ci0JCQkJcHJvY3MuYWRkKG8pOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2NzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9jcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJZml4UHJvY2Vzcygob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgaXQubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluIEVQRiwgYSBwcm9jZXNzIChDYXBhYmlsaXR5IHBhdHRlcm4gYW5kIERlbGl2ZXJ5IFByb2Nlc3MpIGNhbiBiZSByZXNpZGUKLQkgKiBpbiBhIFByb2Nlc3NQYWNrYWdlIG9yIGEgUHJvY2Vzc0NvbXBvbmVudC4gSWYgaXQncyBpbiBhIHByb2Nlc3NDb21wb25lbnQsCi0JICogaXQgaXMgdHJlYXRlZCBhcyBhIHJvb3QgbGV2ZWwgcHJvY2Vzcy4gSWYgaXQncyBpbiBhIFByb2Nlc3NQYWNrYWdlLCBpdCBpcwotCSAqIHRyZWF0ZWQgYXMgYSBsb2NhbCBjb3B5IG9mIGFub3RoZXIgcHJvY2Vzcy4gU28gd2UgbmVlZCB0byBjaGVjayB0aGUKLQkgKiBwYXJlbnQgYW5kIHNlZSBpdCB0aGlzIHByb2Nlc3MgaXMgY29udGFpbmVkIGJ5IGEgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gT2JqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2VzcyhFT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJb2JqID0gb2JqLmVDb250YWluZXIoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gaWYgaXQncyBpbW1lZGlhdGUgcGFyZW50IGlzIG5vdCBhIFByb2Nlc3NDb21wb25lbnQgYnV0IGl0J3Mgd2l0aGluIGEKLQkJLy8gUHJvY2Vzc0NvbXBvbmVudAotCQkvLyBpdCdzIGEgbG9jYWwgY29weSBvZiB0aGUgcHJvY2VzcwotCQl3aGlsZSAoKChvYmogPSBvYmouZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCSYmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpeFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jKSB7Ci0JCUVEYXRhT2JqZWN0IGNvbnRhaW5lciA9IChFRGF0YU9iamVjdCkgcHJvYy5lQ29udGFpbmVyKCk7Ci0JCVByb2Nlc3NDb21wb25lbnQgcGMgPSBudWxsOwotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX3Byb2Nlc3Nfd3JvbmdfY29udGFpbmVyLAotCQkJCQkJCXByb2MuZ2V0TmFtZSgpLCBjb250YWluZXIuZ2V0VHlwZSgpLmdldE5hbWUoKSk7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhtc2cpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGMgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCVN0cmluZyBpZCA9IGdldFRhcmdldFBhcmVudElkKHByb2MuZ2V0SWQoKSk7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlpZCA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQkJfQotCi0JCXBjLnNldElkKGlkKTsKLQkJcGMuc2V0TmFtZShwcm9jLmdldE5hbWUoKSk7Ci0JCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0UHJvY2Vzc0VsZW1lbnQoKS5yZW1vdmUocHJvYyk7Ci0JCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcikuZ2V0TWV0aG9kUGFja2FnZSgpLmFkZChwYyk7Ci0JCXBjLnNldFByb2Nlc3MocHJvYyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBpZiB0aGUgcHJvY2VzcyBleGlzdHMgaW4gdGhlIHRhcmdldCBsaWJyYXJ5LCBnZXQgdGhlIHByb2Nlc3MgY29tcG9uZW50IGlkCi0JICogZnJvbSB0aGUgdGFyZ2V0IGxpYnJhcnkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRQYXJlbnRJZChTdHJpbmcgaWQpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IG9iaiA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChpZCk7Ci0JCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQlvYmogPSBvYmouZUNvbnRhaW5lcigpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSBvYmopLmdldEd1aWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGtnCi0JICogQHJldHVybiB0aGUgbGlzdCBvZiBhbGwgcHJvY2Vzc2VzIGluIHBrZy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxQcm9jZXNzZXMoTWV0aG9kUGFja2FnZSBwa2cpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCV9pdGVyYXRlUGFja2FnZUZvclByb2Nlc3Nlcyhwa2csIHByb2Nlc3Nlcyk7Ci0KLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnLCBMaXN0IHByb2Nlc3NlcykgewotCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwID0gKChQcm9jZXNzQ29tcG9uZW50KSBwa2cpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocCAhPSBudWxsICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkpIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRNZXRob2RQYWNrYWdlKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHByb2Nlc3Nlcyk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBTYXZlIGV4dHJhIGluZm8gKGFsbCBwbHVnaW4gZ3VpZHMgYW5kIG5hbWVzKSBpbiBsaWJUYWcncyBNZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZUV4dHJhSW5mbyhMaXN0PG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUocm9vdE9iamVjdAotCQkJCS5lQ2xhc3MoKSwgIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpOwkJLy8kTk9OLU5MUy0xJAotCQkKLQkJTGlzdCBtZXBMaXN0ID0gKExpc3QpIHJvb3RPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJRUNsYXNzIG1lcENsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0WG1sRUNsYXNzKCJNZXRob2RFbGVtZW50UHJvcGVydHkiKTsJLy8kTk9OLU5MUy0xJAotCQkKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHhtbE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIEVjb3JlVXRpbC5jcmVhdGUobWVwQ2xhc3MpOwotCQkKLQkJLy9WZXJzaW9uCi0JCXhtbE1lcC5zZXRWYWx1ZSgiMCIpOwkvLyROT04tTkxTLTEkCi0JCW1lcExpc3QuYWRkKHhtbE1lcCk7Ci0JCQkJCQotCQlmb3IgKEl0ZXJhdG9yPG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gcGx1ZyA9IGl0Lm5leHQoKTsKLQkJCQotCQkJeG1sTWVwID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgRWNvcmVVdGlsLmNyZWF0ZShtZXBDbGFzcyk7Ci0JCQl4bWxNZXAuc2V0VmFsdWUocGx1Zy5nZXRHdWlkKCkpOwotCQkJbWVwTGlzdC5hZGQoeG1sTWVwKTsKLQkJCQotCQkJeG1sTWVwID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgRWNvcmVVdGlsLmNyZWF0ZShtZXBDbGFzcyk7Ci0JCQl4bWxNZXAuc2V0VmFsdWUocGx1Zy5nZXROYW1lKCkpOwotCQkJbWVwTGlzdC5hZGQoeG1sTWVwKTsKLQkJfQotCQkKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGd1aWQgdG8gcGx1Z2luIG1hcAotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEd1aWRUb1BsdWdOYW1lTWFwKCkgewotCQlpZiAoZ3VpZFRvUGx1Z05hbWVNYXAgPT0gbnVsbCkgewotCQkJcmVjYWxsRXh0cmFJbmZvKCk7Ci0JCX0JCQotCQlyZXR1cm4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWNhbGxFeHRyYUluZm8oKSB7Ci0JCXRyeSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFLmdldFhtbEZlYXR1cmUocm9vdE9iamVjdAotCQkJCQkuZUNsYXNzKCksICJtZXRob2RFbGVtZW50UHJvcGVydHkiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQotCQkJTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IG1lcExpc3QgPSAoTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+KSByb290T2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAobWVwTGlzdCA9PSBudWxsIHx8IG1lcExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZ3VpZFRvUGx1Z05hbWVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJCQotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG1lcCA9IG1lcExpc3QuZ2V0KDApOwotCQkJaWYgKG1lcC5nZXRWYWx1ZSgpLmVxdWFscygiMCIpKSB7IC8vJE5PTi1OTFMtMSQgIAotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbWVwTGlzdC5zaXplKCk7KSB7Ci0JCQkJCVN0cmluZyBndWlkID0gbWVwTGlzdC5nZXQoaSkuZ2V0VmFsdWUoKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBtZXBMaXN0LmdldChpKzEpLmdldFZhbHVlKCk7Ci0JCQkJCWd1aWRUb1BsdWdOYW1lTWFwLnB1dChndWlkLCBuYW1lKTsKLQkJCQkJaSArPSAyOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYjc2NzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEV4cG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9FeHBvcnRYTUxXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL0V4cG9ydFhNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA0Mjg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL0V4cG9ydFhNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEV4cG9ydCBYTUwgd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIHdpemFyZCBpcyB1c2VkIHRvIGV4cG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIFhNTCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0WE1MV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcml2YXRlIFNlbGVjdEV4cG9ydFR5cGVQYWdlIHNlbGVjdEV4cG9ydFR5cGVQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFBsdWdpblBhZ2Ugc2VsZWN0UGx1Z2luUGFnZTsKLQotCXByb3RlY3RlZCBWaWV3UGx1Z2luSW5mb1BhZ2Ugdmlld1BsdWdpbkluZm9QYWdlOwotCi0JcHJvdGVjdGVkIFZpZXdFeHBvcnRTdW1tYXJ5UGFnZSB2aWV3RXhwb3J0U3VtbWFyeVBhZ2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnUGFnZSBzZWxlY3RDb25maWdQYWdlOwotCi0JcHJvdGVjdGVkIFNlbGVjdFhNTEZpbGVQYWdlIHNlbGVjdFhNTEZpbGVQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydFhNTERhdGEgeG1sRGF0YSA9IG5ldyBFeHBvcnRYTUxEYXRhKCk7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luRXhwb3J0RGF0YSBwbHVnaW5EYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBjb25maWdEYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRYTUxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2VsZWN0RXhwb3J0VHlwZVBhZ2UgPSBuZXcgU2VsZWN0RXhwb3J0VHlwZVBhZ2UoKTsKLQkJc2VsZWN0UGx1Z2luUGFnZSA9IG5ldyBTZWxlY3RQbHVnaW5QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3UGx1Z2luSW5mb1BhZ2UgPSBuZXcgVmlld1BsdWdpbkluZm9QYWdlKHBsdWdpbkRhdGEpOwotCQl2aWV3RXhwb3J0U3VtbWFyeVBhZ2UgPSBuZXcgVmlld0V4cG9ydFN1bW1hcnlQYWdlKHBsdWdpbkRhdGEpOwotCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoY29uZmlnRGF0YSk7Ci0JCXNlbGVjdFhNTEZpbGVQYWdlID0gbmV3IFNlbGVjdFhNTEZpbGVQYWdlKCk7Ci0KLQkJYWRkUGFnZShzZWxlY3RFeHBvcnRUeXBlUGFnZSk7Ci0JCWFkZFBhZ2Uoc2VsZWN0UGx1Z2luUGFnZSk7Ci0JCWFkZFBhZ2Uodmlld1BsdWdpbkluZm9QYWdlKTsKLQkJYWRkUGFnZSh2aWV3RXhwb3J0U3VtbWFyeVBhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdENvbmZpZ1BhZ2UpOwotCQlhZGRQYWdlKHNlbGVjdFhNTEZpbGVQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTaGFyZWRJbWFnZSgKLQkJCQkJCSJmdWxsL29iajE2L1hNTEZpbGUuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0WE1MRmlsZVBhZ2UKLQkJCQkmJiBzZWxlY3RYTUxGaWxlUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIHhtbEZpbGVQYXRoID0gc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpOwotCQlGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZSh4bWxGaWxlUGF0aCk7Ci0JCWlmICh4bWxGaWxlLmV4aXN0cygpKSB7Ci0JCQlib29sZWFuIG9rID0gRXhwb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQlFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQkJCUV4cG9ydFhNTFJlc291cmNlcy5iaW5kKAotCQkJCQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLm92ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRmlsZVBhdGggfSkpOwotCQkJaWYgKCFvaykgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJRXhwb3J0WE1MU2VydmljZSBzZXJ2aWNlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhFeHBvcnRYTUxSZXNvdXJjZXMuZXhwb3J0aW5nWE1MX3RleHQsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQl4bWxEYXRhLnNldFhNTEZpbGUoc2VsZWN0WE1MRmlsZVBhZ2UuZ2V0UGF0aCgpKTsKLQkJCQkJc2VydmljZSA9IG5ldyBFeHBvcnRYTUxTZXJ2aWNlKHhtbERhdGEpOwotCQkJCQlzZXJ2aWNlLmRvRXhwb3J0KG1vbml0b3IpOwotCQkJCQlFeHBvcnRYTUxQcmVmZXJlbmNlcy5zZXRFeHBvcnRUeXBlKHhtbERhdGEuZ2V0RXhwb3J0VHlwZSgpKTsKLQkJCQkJRXhwb3J0WE1MUHJlZmVyZW5jZXMuc2V0WE1MRmlsZSh4bWxEYXRhLmdldFhNTEZpbGUoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCXNlcnZpY2UuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF90aXRsZSwKLQkJCQkJTkxTLmJpbmQoRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydFhNTFdpemFyZF9lcnJvciwKLQkJCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSksIHJlYWxFeGNlcHRpb24pOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9IEV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRYTUxXaXphcmRfcmV2aWV3TG9nOwotCQlNc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlNmNiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gKiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnUGFnZSBleHRlbmRzIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXN1cGVyLnNhdmVEYXRhVG9Nb2RlbCgpOwotCQlFeHBvcnRYTUxXaXphcmQgd2l6YXJkID0gKEV4cG9ydFhNTFdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXdpemFyZC54bWxEYXRhLnNldFNlbGVjdGVkQ29uZmlncyh3aXphcmQuY29uZmlnRGF0YS5zZWxlY3RlZENvbmZpZ3MpOwkJCi0JCXJldHVybiB3aXphcmQuc2VsZWN0WE1MRmlsZVBhZ2U7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0RXhwb3J0VHlwZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdEV4cG9ydFR5cGVQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGExMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0RXhwb3J0VHlwZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5zZXJ2aWNlcy5FeHBvcnRYTUxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIHR5cGUgb2YgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdEV4cG9ydFR5cGVQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RFeHBvcnRUeXBlUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHBvcnRQbHVnaW5zUmFkaW9CdXR0b247Ci0KLQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgotCS8vcHJpdmF0ZSBCdXR0b24gZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RXhwb3J0VHlwZVBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFhNTFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihjb250YWluZXIsCi0JCQkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydExpYnJhcnlSYWRpb0J1dHRvbl90ZXh0LCAxLCBmYWxzZSk7Ci0KLQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFhNTFJlc291cmNlcy5leHBvcnRQbHVnaW5zUmFkaW9CdXR0b25fdGV4dCwgMSwgZmFsc2UpOwotCi0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCi0JCS8vZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkvLwkJRXhwb3J0WE1MUmVzb3VyY2VzLmV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbl90ZXh0LCAxLCBmYWxzZSk7Ci0JCQotCQlzd2l0Y2ggKEV4cG9ydFhNTFByZWZlcmVuY2VzLmdldEV4cG9ydFR5cGUoKSkgewotCQljYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZOgotCQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQljYXNlIEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9QTFVHSU5TOgotCQkJZXhwb3J0UGx1Z2luc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWJyZWFrOwotCQkvLyBQb3N0cG9uZWQgdG8gbmV4dCByZWxlYXNlLgkJCQotCQkvL2Nhc2UgRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0NPTkZJR1M6Ci0JCS8vCWV4cG9ydENvbmZpZ3NSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCS8vCWJyZWFrOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZXhwb3J0TGlicmFyeVJhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlleHBvcnRQbHVnaW5zUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCQkKLQkJLy9leHBvcnRDb25maWdzUmFkaW9CdXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGdldEVycm9yTWVzc2FnZSgpID09IG51bGw7Ci0JfQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCi0JCWlmIChleHBvcnRMaWJyYXJ5UmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0xJQlJBUlkpOwotCQkJcmV0dXJuIHdpemFyZC5zZWxlY3RYTUxGaWxlUGFnZTsKLQkJfSBlbHNlIGlmIChleHBvcnRQbHVnaW5zUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX1BMVUdJTlMpOwotCQkJcmV0dXJuIHdpemFyZC5zZWxlY3RQbHVnaW5QYWdlOwotCQl9Ci0JCS8vIFBvc3Rwb25lZCB0byBuZXh0IHJlbGVhc2UuCi0JCS8vZWxzZSBpZiAoZXhwb3J0Q29uZmlnc1JhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCS8vCXdpemFyZC54bWxEYXRhLnNldEV4cG9ydFR5cGUoRXhwb3J0WE1MRGF0YS5FWFBPUlRfTUVUSE9EX0NPTkZJR1MpOwotCQkvLwlyZXR1cm4gd2l6YXJkLnNlbGVjdENvbmZpZ1BhZ2U7Ci0JCS8vfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL1NlbGVjdFBsdWdpblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiNmYzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3Qgb25lIG9yIG1vcmUgbWV0aG9kIHBsdWctaW5zIHRvCi0gKiBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UGx1Z2luUGFnZSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5TZWxlY3RQbHVnaW5QYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFBsdWdpblBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc3VwZXIuc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFhNTFdpemFyZCB3aXphcmQgPSAoRXhwb3J0WE1MV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJd2l6YXJkLnhtbERhdGEuc2V0U2VsZWN0ZWRQbHVnaW5zKHdpemFyZC5wbHVnaW5EYXRhLnNlbGVjdGVkUGx1Z2lucyk7Ci0JCVZpZXdQbHVnaW5JbmZvUGFnZSBwYWdlID0gd2l6YXJkLnZpZXdQbHVnaW5JbmZvUGFnZTsKLQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwNzFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLkV4cG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5wcmVmZXJlbmNlcy5FeHBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgWE1MIGZpbGUgdG8gc3RvcmUgdGhlCi0gKiBleHBvcnRlZCBtZXRob2QgbGlicmFyeSBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0WE1MRmlsZVBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHBhdGhUZXh0OwotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdFhNTEZpbGVQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRYTUxSZXNvdXJjZXMuc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoRXhwb3J0WE1MUmVzb3VyY2VzLmZpbGVMYWJlbF90ZXh0KTsKLQotCQlwYXRoVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXBhdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwYXRoVGV4dC5zZXRUZXh0KEV4cG9ydFhNTFByZWZlcmVuY2VzLmdldFhNTEZpbGUoKSk7Ci0JCXBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1ZhbGlkUGF0aChwYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKSkgewotCQkJCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UoRXhwb3J0WE1MUmVzb3VyY2VzLmludmFsaWRYTUxGaWxlX2Vycm9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEV4cG9ydFhNTFJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuU0FWRSk7Ci0JCQkJZmQuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi54bWwiLCAiKi4qIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIHBhdGggPSBmZC5vcGVuKCk7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJcGF0aFRleHQuc2V0VGV4dChwYXRoKTsKLQkJCQkJb2sgPSBpc1ZhbGlkUGF0aChwYXRoKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKG9rKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIHNwZWNpZmljIHBhdGggaXMgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmljIHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUGF0aChTdHJpbmcgcGF0aCkgewotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJaWYgKGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKSAmJiBwYXRoLmVuZHNXaXRoKCIueG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBubyBtb3JlIHBhZ2UKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIFhNTCBmaWxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5wYXRoOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld0V4cG9ydFN1bW1hcnlQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3RXhwb3J0U3VtbWFyeVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRjODYzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3RXhwb3J0U3VtbWFyeVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpblN1bW1hcnlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgYSBzdW1tYXJ5IG9mIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Zy1pbnMgdGhhdAotICogd2lsbCBiZSBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWaWV3RXhwb3J0U3VtbWFyeVBhZ2UgZXh0ZW5kcyBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBWaWV3RXhwb3J0U3VtbWFyeVBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQlyZXR1cm4gd2l6YXJkLnNlbGVjdFhNTEZpbGVQYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQveG1sL3dpemFyZHMvVmlld1BsdWdpbkluZm9QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3UGx1Z2luSW5mb1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3OWRjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9WaWV3UGx1Z2luSW5mb1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLlBsdWdpbkluZm9QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGUgbWV0aG9kCi0gKiBwbHVnLWlucyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCBmb3IgZXhwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZpZXdQbHVnaW5JbmZvUGFnZSBleHRlbmRzIFBsdWdpbkluZm9QYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFZpZXdQbHVnaW5JbmZvUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzdXBlci5zYXZlRGF0YVRvTW9kZWwoKTsKLQkJRXhwb3J0WE1MV2l6YXJkIHdpemFyZCA9IChFeHBvcnRYTUxXaXphcmQpIGdldFdpemFyZCgpOwotCQl3aXphcmQueG1sRGF0YS5zZXRBc3NvY2lhdGVkQ29uZmlncyh3aXphcmQucGx1Z2luRGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwKTsKLQkJVmlld0V4cG9ydFN1bW1hcnlQYWdlIHBhZ2UgPSB3aXphcmQudmlld0V4cG9ydFN1bW1hcnlQYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3htbC93aXphcmRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRjMWNjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC94bWwvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBleHBvcnRpbmcgbWV0aG9kIGxpYnJhcnkgY29udGVudCB0byBYTUwuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3NTk0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBleHBvcnQgcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVhYTQ5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmV4cG9ydDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjOTgyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNzgwY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxYmFmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0F1dGhvcmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL0NvbnRlbnRQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQ29udGVudFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvQ29udGVudFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Gb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9Gb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQxOWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvRm9sZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUGFja2FnaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUGFja2FnaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2Mzk0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1BhY2thZ2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1JvbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUm9sZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvUm9sZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9UYXNrcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1Rhc2tzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YmQ4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL1Rhc2tzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXJyb3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9lcnJvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTdhOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXRvb2wxNi9leHBfbGliX2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdkNGUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZXRvb2wxNi9leHBfbGliX2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX21ldGhfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2ZjhiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2V0b29sMTYvZXhwX21ldGhfcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQ0YjViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy9mdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNTY3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy93YXJuaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvaWNvbnMvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTIwYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9pY29ucy93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWY3ZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIEV4cG9ydAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgUGVyc3BlY3RpdmUKLXBhY2thZ2luZ1BlcnNwZWN0aXZlTmFtZT1QYWNrYWdpbmcKLQotIyBDYXRlZ29yeQotcGFja2FnaW5nQ2F0ZWdvcnlOYW1lPVBhY2thZ2luZwotCi0jIFZpZXdzCi1wYWNrYWdpbmdWaWV3TmFtZT1QYWNrYWdpbmcgTWV0aG9kIExpYnJhcnkKLXBhY2thZ2luZ01lc3NhZ2VWaWV3TmFtZT1MaWJyYXJ5IFBhY2thZ2luZyBNZXNzYWdlCi0KLSMgQWN0aW9uIFNldAotcGFja2FnaW5nQWN0aW9uU2V0PVBhY2thZ2luZwotCi0jIEFjdGlvbnMKLW5ld0NvbmZpZ0FjdGlvbj0mQ29uZmlndXJhdGlvbgotbmV3Q29uZmlnQWN0aW9uVG9vbHRpcD1DcmVhdGUgYSBuZXcgbGlicmFyeSBDb25maWd1cmF0aW9uCi1vcGVuQ29uZmlnQWN0aW9uPSZDb25maWd1cmF0aW9uCi1vcGVuQ29uZmlnQWN0aW9uVG9vbHRpcD1PcGVuIGFuIGV4aXN0aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbgotCi0jIEV4cG9ydCBXaXphcmQgQ2F0ZWdvcnkKLWV4cG9ydENhdGVnb3J5TmFtZT1NZXRob2QKLQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZAotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb25XaXphcmROYW1lPUxpYnJhcnkgQ29uZmlndXJhdGlvbgotZXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb249RXhwb3J0IGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1leHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZT1NZXRob2QgUGx1Zy1pbnMKLWV4cG9ydE1ldGhvZFBsdWdpbnM9RXhwb3J0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucy4KLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTczZjQ4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iL2ljb25zL2V0b29sMTYvZXhwX2xpYl9jb25mLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWV4cG9ydExpYnJhcnlDb25maWd1cmF0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmV4cG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIGljb249Ii9pY29ucy9ldG9vbDE2L2V4cF9tZXRoX3BsdWdpbi5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzLkV4cG9ydFBsdWdpbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRNZXRob2RQbHVnaW5zV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+IAotICAgICAgICAgICAgICAgJWV4cG9ydE1ldGhvZFBsdWdpbnMKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4gCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIi8+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHMuRXhwb3J0UGx1Z2luV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydE9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0T3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjEzYjQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0T3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGUgZXhwb3J0IG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0T3B0aW9ucyB7Ci0KLQlwcm90ZWN0ZWQgRmlsZSBleHBvcnREaXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRPcHRpb25zKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgZXhwb3J0IGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGlyZWN0b3J5IGZvciBzdG9yaW5nIHRoZSBleHBvcnRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIEZpbGUgZ2V0RXhwb3J0RGlyKCkgewotCQlyZXR1cm4gZXhwb3J0RGlyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVzZXIgc2VsZWN0ZWQgZXhwb3J0IGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwb3J0RGlyCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeSBmb3Igc3RvcmluZyB0aGUgZXhwb3J0ZWQgY29udGVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydERpcihGaWxlIGV4cG9ydERpcikgewotCQl0aGlzLmV4cG9ydERpciA9IGV4cG9ydERpcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTJmNWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBFeHBvcnQgcGx1Z2luIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBFeHBvcnRQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHBvcnRQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UHJvY2Vzc09wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvRXhwb3J0UHJvY2Vzc09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4NTk5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFByb2Nlc3NPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBUaGUgZXhwb3J0IHByY29lc3Mgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRQcm9jZXNzT3B0aW9ucyBleHRlbmRzIEV4cG9ydE9wdGlvbnMgewotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBib29sZWFuIHB1Ymxpc2hXZWJTaXRlOwotCi0JcHJpdmF0ZSBQdWJsaXNoT3B0aW9ucyBwdWJsaXNoaW5nT3B0aW9uczsKLQotCXByaXZhdGUgYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UHJvY2Vzc09wdGlvbnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZXhwb3J0IHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgZXhwb3J0IHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcHJvY2VzcyB3ZWIgc2l0ZSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvY2VzcyB3ZWIgc2l0ZSBzaG91bGQgYmUgcHVibGlzaGVkCi0JICogICAgICAgICBhcyBwYXJ0IG9mIHRoZSBleHBvcnQgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHVibGlzaFdlYlNpdGUoKSB7Ci0JCXJldHVybiBwdWJsaXNoV2ViU2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIHByb2Nlc3Mgd2ViIHNpdGUgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoV2ViU2l0ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggdGhlIHByb2Nlc3Mgd2ViIHNpdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoV2ViU2l0ZShib29sZWFuIHB1Ymxpc2hXZWJTaXRlKSB7Ci0JCXRoaXMucHVibGlzaFdlYlNpdGUgPSBwdWJsaXNoV2ViU2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgcHVibGlzaGluZyBvcHRpb25zIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHB1Ymxpc2ggdGhlIHByb2Nlc3MKLQkgKiAgICAgICAgIHdlYiBzaXRlCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zIGdldFB1Ymxpc2hpbmdPcHRpb25zKCkgewotCQlyZXR1cm4gcHVibGlzaGluZ09wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaGluZyBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaXNoaW5nT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwdWJsaXNoIHRoZQotCSAqICAgICAgICAgICAgcHJvY2VzcyB3ZWIgc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hpbmdPcHRpb25zKFB1Ymxpc2hPcHRpb25zIHB1Ymxpc2hpbmdPcHRpb25zKSB7Ci0JCXRoaXMucHVibGlzaGluZ09wdGlvbnMgPSBwdWJsaXNoaW5nT3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgb25seSBwbGFubmVkIFdCUyBlbGVtZW50cyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvbmx5IHBsYW5uZWQgV0JTIGVsZW1lbnRzIHNob3VsZCBiZQotCSAqICAgICAgICAgZXhwb3J0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cygpIHsKLQkJcmV0dXJuIGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZXhwb3J0IG9ubHkgcGxhbm5lZCBXQlMgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKAotCQkJYm9vbGVhbiBleHBvcnRPbmx5UGxhbm5lZFdCU0VsZW1lbnRzKSB7Ci0JCXRoaXMuZXhwb3J0T25seVBsYW5uZWRXQlNFbGVtZW50cyA9IGV4cG9ydE9ubHlQbGFubmVkV0JTRWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9FeHBvcnRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZDU2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L0V4cG9ydFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LlJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeHBvcnRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydENvbmZpZ1dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEV4cG9ydFR5cGVQYWdlX2NvbmZpZ0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1BhZ2VfY29uZmlnc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnU3BlY3NQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0NvbmZpZ1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tDb25maWdQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVzdGluYXRpb25QYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdQbHVnaW5zUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX25vUGx1Z2luX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3BlY2lmeVBhdGhQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNwZWNpZnlQYXRoUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVQbHVnaW5QYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydFBsdWdpbkVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHBvcnRDb25maWdFcnJvckRpYWxvZ19tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW5hbHl6aW5nQ29uZmlnVGFza19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2VfY2hlY2tpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfYnJvd3NlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kZWZhdWx0X2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlX01TRzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX2xhYmVsX2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHBvcnRQbHVnaW5XaXphcmRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUxpYnJhcnlQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUxpYnJhcnlQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFeHBvcnRSZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxZjE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMKLSMgTWVzc2FnZSBJRCBSYW5nZTogSVVQRTAwMDBFIC0gSVVQRTAwOTlFCi0jCi0KLSMgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWV4cG9ydENvbmZpZ1dpemFyZF90aXRsZT1FeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZT1TZWxlY3QgZXhwb3J0IHR5cGUKLXNlbGVjdEV4cG9ydFR5cGVQYWdlX2Rlc2M9U2VsZWN0IHRoZSB0eXBlIG9mIGxpYnJhcnkgY29uZmlndXJhdGlvbiB0byBleHBvcnQuCi1zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0PUV4cG9ydCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGFuZCBhbGwgaXRzIG1ldGhvZCBwbHVnLWlucwotc2VsZWN0RXhwb3J0VHlwZVBhZ2VfY29uZmlnU3BlY3NMYWJlbF90ZXh0PUV4cG9ydCBvbmUgb3IgbW9yZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnUGFnZV90aXRsZT1TZWxlY3QgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ1BhZ2VfZGVzYz1TZWxlY3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBleHBvcnQuIEFsbCByZWZlcmVuY2VkIG1ldGhvZCBwbHVnLWlucyBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBleHBvcnQuCi1zZWxlY3RDb25maWdQYWdlX2NvbmZpZ3NMYWJlbF90ZXh0PU1ldGhvZCBjb25maWd1cmF0aW9uczoKLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV90aXRsZT1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2M9U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIHNwZWNpZmljYXRpb25zIHRvIGV4cG9ydC4KLXNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dD1NZXRob2QgY29uZmlndXJhdGlvbnM6Ci1jaGVja0NvbmZpZ1BhZ2VfdGl0bGU9UmV2aWV3IGNvbmZpZ3VyYXRpb24gZXJyb3JzCi1jaGVja0NvbmZpZ1BhZ2VfZGVzYz1BbiBpbnRlZ3JpdHkgY2hlY2sgaGFzIGJlZW4gcGVyZm9ybWVkIG9uIHRoZSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gUmV2aWV3IHRoZSBlcnJvciByZXBvcnQgYW5kIHBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBjb3JyZWN0aXZlIGFjdGlvbnMuCi1zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGU9U3BlY2lmeSBleHBvcnQgZGlyZWN0b3J5Ci1zZWxlY3REZXN0aW5hdGlvblBhZ2VfZGVzYz1TcGVjaWZ5IGEgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSBleHBvcnRlZCBjb25maWd1cmF0aW9uLgotCi0jIEV4cG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUV4cG9ydCBNZXRob2QgUGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgcGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNQYWdlX2Rlc2M9U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBleHBvcnQuCi1zZWxlY3RQbHVnaW5zUGFnZV9wbHVnaW5zTGFiZWxfdGV4dD1NZXRob2QgcGx1Zy1pbnM6Ci1yZXZpZXdQbHVnaW5zUGFnZV90aXRsZT1SZXZpZXcgZGVwZW5kZW5jaWVzCi1yZXZpZXdQbHVnaW5zUGFnZV9kZXNjPVNlbGVjdCBlYWNoIG1ldGhvZCBwbHVnLWluIHRvIHJldmlldyBpdHMgZGVwZW5kZW5jaWVzLiBDbGljayBCYWNrIHRvIHNlbGVjdCB0aGUgZGVwZW5kZW50IHBsdWctaW5zIGlmIHRoZXkgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgZXhwb3J0LgotcmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQ9TWV0aG9kIFBsdWctaW5zOgotcmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQ9RGVwZW5kZW50IG1ldGhvZCBwbHVnLWluczoKLXJldmlld1BsdWdpbnNQYWdlX2Fzc29jaWF0ZWRDb25maWdzTGFiZWxfdGV4dD1Bc3NvY2lhdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uczoKLWV4cG9ydFBsdWdpblN1bW1hcnlQYWdlX3RpdGxlPUNvbmZpcm0gZXhwb3J0Ci1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjPUNvbmZpcm0gdGhlIG1ldGhvZCBwbHVnLWlucyB0aGF0IHdpbGwgYmUgZXhwb3J0ZWQuCi1leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0PU5vIG1ldGhvZCBwbHVnLWluIGhhcyBiZWVuIHNlbGVjdGVkLgotc3BlY2lmeVBhdGhQYWdlX3RpdGxlPVNwZWNpZnkgZXhwb3J0IGRpcmVjdG9yeQotc3BlY2lmeVBhdGhQYWdlX2Rlc2M9U3BlY2lmeSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSB0byBzdG9yZSB0aGUgZXhwb3J0ZWQgbWV0aG9kIHBsdWctaW5zLgotU2F2ZVBsdWdpblBhZ2VfZGVzYz1FeHBvcnQgdGhlIHNlbGVjdGVkIHBsdWctaW5zIGFuZCBjb25maWd1cmF0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLUV4cG9ydFBsdWdpbldpemFyZF90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW4gV2l6YXJkIEVycm9yCi1FeHBvcnRQbHVnaW5FcnJvcl9tc2c9SVVQRTAwMDBFOiBFcnJvciBlbmNvdW50ZXJlZCBpbiBleHBvcnRpbmcKLQotIyBFeHBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIEVycm9yIERpYWxvZwotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGU9RXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbgotZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfbXNnPUlVUEUwMDAxRTogVGhlIGV4cG9ydCBvcGVyYXRpb24gY2Fubm90IHByb2NlZWQuCi0KLSMgUHJvZ3Jlc3MgTWVzc2FnZXMKLWFuYWx5emluZ0NvbmZpZ1Rhc2tfbmFtZT1BbmFseXppbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLi4uCi0KLSMgVGhlIGZvbGxvd2luZyBtZXNzYWdlcyBoYXZlIG5vdCBiZWVuIHJldmlld2VkLgotQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlX01TRzE9RXhwb3J0IGRvbmUuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8xPUNoZWNraW5nIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uLi5cbgotRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX3N1bW1hcnlfMj1ObyBjb25maWd1cmF0aW9uIHNlbGVjdGVkLlxuCi1FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV8zPVRoZXJlIGlzIG5vIHByb2JsZW0gaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uXG4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzQ9VGhlcmUgYXJlIHswfSBwcm9ibGVtcyBpbiB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gXG5Zb3UgY2FuIG9wZW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGFuZCBmaXggdGhvc2UgcHJvYmxlbXMuIFxuT3IgeW91IGNhbiBjaG9vc2UgdG8gaWdub3JlIHRoZXNlIHByb2JsZW1zIGFuZCBjb250aW51ZS4KLUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9jaGVja2luZz1DaGVja2luZyBjb25maWd1cmF0aW9uLCBwbGVhc2Ugd2FpdC4uLgotRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZV90aXRsZT1DaG9vc2UgTWV0aG9kIENvbmZpZ3VyYXRpb24KLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2U9QnJvd3NlLi4uCi1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGVmYXVsdF9kaXI9VXNlIGRlZmF1bHQgZGlyZWN0b3J5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwPUV4cG9ydGluZyBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyPUlVUEUwMDAyRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbG9hZGluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c0PUlVUEUwMDAzRTogRXhwb3J0IGZhaWxlZDogRXJyb3IgY29weWluZyBsaWJyYXJ5Ci1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cxPUlVUEUwMDA0RTogRXhwb3J0IGZhaWxlZDogRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlCi1Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0c5PUlVUEUwMDA1RTogRXhwb3J0IGZhaWxlZDogRXJyb3Igc2F2aW5nIGxpYnJhcnkKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9uYW1lPU5hbWU6Ci1EZXN0aW5hdGlvbkNvbW1vblBhZ2VfbGFiZWxfZGlyPURpcmVjdG9yeToKLUV4cG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcgotRGVzdGluYXRpb25Db21tb25QYWdlX3RpdGxlPURlZmF1bHQgVGl0bGUKLURlc3RpbmF0aW9uQ29tbW9uUGFnZV9kZXNjPURlZmF1bHQgZGVzY3JpcHRpb246Ci1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzA9RXhwb3J0aW5nIHBsdWctaW5zLi4uCi1QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzE9Q3JlYXRpbmcgZXhwb3J0IGRpcmVjdG9yeS4uLgotUGx1Z2luRXhwb3J0U2VydmljZV9NU0cyPUNvcHlpbmcgZmlsZXMuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHMz1HZW5lcmF0aW5nIGxpYnJhcnkgYW5kIHJlc291cmNlIGZpbGUuLi4KLVBsdWdpbkV4cG9ydFNlcnZpY2VfTVNHND1FeHBvcnQgZG9uZS4KLVNhdmVMaWJyYXJ5UGFnZV90aXRsZT1FeHBvcnQgTWV0aG9kIFBsdWctaW4KLVNhdmVQbHVnaW5QYWdlX2xhYmVsX25hbWU9RXhwb3J0IG5hbWU6Ci1TYXZlTGlicmFyeVBhZ2VfZGVzYz1FeHBvcnQgdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWlucyBhbmQgYXNzb2NpYXRlZCBjb25maWd1cmF0aW9ucwotRXhwb3J0UGx1Z2luV2l6YXJkX01TRzE9QW5hbHl6aW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNmFhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBhY3RpdmF0b3IgZm9yIG1hbmFnaW5nIHRoZSBFeHBvcnQgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9CYXNlRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY1MzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQmFzZUV4cG9ydFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB0aGUgRXhwb3J0IFNlcnZpY2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFeHBvcnRTZXJ2aWNlIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cG9ydEZpbGUgPSAiZXhwb3J0LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlGaWxlID0gImxpYnJhcnkueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWRJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBzZWxlY3RlZFBsdWdpbk5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJZFNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHNlbGVjdGVkSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWlmICh1cmkuaW5kZXhPZihpZCkgPj0gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NlbGVjdGVkUGx1Z2luUmVzb3VyY2UoU3RyaW5nIHVyaSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc2VsZWN0ZWRQbHVnaW5OYW1lcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGx1Z2luX25hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAodXJpLnN0YXJ0c1dpdGgocGx1Z2luX25hbWUgKyAiLyIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNvdXJjZVNlbGVjdGVkKFN0cmluZyB1cmkpIHsKLQkJaWYgKGlzSWRTZWxlY3RlZCh1cmkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNTZWxlY3RlZFBsdWdpblJlc291cmNlKHVyaSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlEb2N1bWVudCBwcm9jZXNzTGlicmFyeUZpbGUoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KSB7Ci0JCXRyeSB7Ci0JCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgTGlicmFyeURvY3VtZW50KHNvdXJjZSk7Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJTm9kZUxpc3Qgbm9kZXMgPSBkb2N1bWVudC5nZXRQbHVnaW5zKCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNJZFNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUGx1Z2luKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCQlub2RlcyA9IGRvY3VtZW50LmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlpID0gMDsKLQkJCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQkKLQkJCQkvLyAxNDIzNzkgLSB1cGRhdGUgcGx1Z2luIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nIHRvIG1hdGNoIHdpdGggdGhlIG5ldyBmaWxlIGZvcm1hdAotCQkJCS8vIGNvbmZpZ3VyYXRpb24gaXMgc2F2ZWQgYXMgc2VwZXJhdGUgcmVzb3VyY2Ugc2luY2UgMS4wbTMKLQkJCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZik7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQodXJpKSkgewotCQkJCQlkb2N1bWVudC5yZW1vdmVDb25maWd1cmF0aW9uKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbG9hZCB0aGUgZWxlbWVudCBtYXBwaW5nLgotCQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlNYXAgcGx1Z2luTWFwID0gTWV0aG9kRWxlbWVudFV0aWwuYnVpbGRNYXAocGx1Z2lucyk7Ci0KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJCVN0cmluZyB1cmkgPSBnZXRQbHVnaW5SZXNNZ3JVcmkoaWQsIG5vZGUsIHBsdWdpbk1hcCk7Ci0JCQkJaWYgKCFpc0lkU2VsZWN0ZWQoaWQpCi0JCQkJCQkmJiAhaXNSZXNvdXJjZVNlbGVjdGVkKFVSTERlY29kZXIuZGVjb2RlKHVyaSwgIlVURi04IikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW5vZGVzID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpOwotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2hyZWYpOwotCQkJCWlmICghaXNSZXNvdXJjZVNlbGVjdGVkKHVyaSkpIHsKLQkJCQkJZG9jdW1lbnQucmVtb3ZlUmVzb3VyY2VEZXNjcmlwdG9yKG5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpc3QgcGx1Z2luTGlzdCA9ICBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQlkb2N1bWVudC5zdG9yZUV4dHJhSW5mbyhwbHVnaW5MaXN0KTsKLQkJCQotCQkJZG9jdW1lbnQuc2F2ZUFzKHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCXJldHVybiBkb2N1bWVudDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGx1Z2luUmVzTWdyVXJpKFN0cmluZyBpZCwgRWxlbWVudCBub2RlLCBNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IHBsdWdpbk1hcCkgewotCQlTdHJpbmcgdXJpID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfdXJpKTsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IHBsdWdpbk1hcC5nZXQoaWQpOwotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdVcmkgPSBwbHVnaW4uZ2V0TmFtZSgpICsgIi9wbHVnaW4ueG1pIjsgIC8vJE5PTi1OTFMtMSQKLQkJCWlmICghIG5ld1VyaS5lcXVhbHModXJpKSkgewotCQkJCW5vZGUuc2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSwgbmV3VXJpKTsKLQkJCQlyZXR1cm4gbmV3VXJpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YmY5ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGV4cG9ydCBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIHsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydE9uZUNvbmZpZzsKLQotCXB1YmxpYyBib29sZWFuIGV4cG9ydENvbmZpZ1NwZWNzOwotCi0JcHVibGljIExpc3Qgc2VsZWN0ZWRDb25maWdzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBicm9rZW4gcmVmZXJlbmNlcyBzaG91bGQgYmUgcmVtb3ZlZCBvciBub3QuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyA9IGZhbHNlOwotCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbnVsbDsKLQotCXB1YmxpYyBTdHJpbmcgZXJyb3JNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5lcyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxZjhmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogRXhwb3J0cyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjbHVkZXMgPSAiLmNvcHlhcmVhLmRhdCwgKiovLmNvcHlhcmVhLmRhdCwgLmNvcHlhcmVhLmRiLCAqKi8uY29weWFyZWEuZGIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwKLQkJCQkJfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cwKTsgCi0JCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQkJRmlsZSBleHBvcnRMaWJGb2xkZXIgPSBuZXcgRmlsZShleHBvcnRMaWJQYXRoKTsKLQkJCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCQl9Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBkYXRhLnNlbGVjdGVkQ29uZmlncwotCQkJCQkuZ2V0KDApOwotCQkJZXhwb3J0Q29uZmlnKGNvbmZpZy5nZXROYW1lKCksIGV4cG9ydExpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIHZvaWQgZXhwb3J0Q29uZmlnKFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUsIFN0cmluZyBmaWxlUGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJLy8gbmVlZCB0byBkaXNhYmxlIHRoZSB3b3Jrc3BhY2UgcmVmcmVzaGluZwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIGRpc2FibGUgcmVzb3VyY2UgcmVmcmVzaGluZyBkdXJpbmcgaW1wb3J0Ci0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQlkb0VleHBvcnRDb25maWcoc2VsZWN0ZWRDb25maWdOYW1lLCBmaWxlUGF0aCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0VleHBvcnRDb25maWcoU3RyaW5nIHNlbGVjdGVkQ29uZmlnTmFtZSwgU3RyaW5nIGZpbGVQYXRoLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlNZXRob2RMaWJyYXJ5IGN1cnJlbnRMaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIExvYWQgdGhlIHdob2xlIE1ldGhvZCBMaWJyYXJ5LgotCQkJTGlicmFyeVV0aWwubG9hZEFsbChjdXJyZW50TGliKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCSJFcnJvciBsb2FkaW5nIGxpYnJhcnkiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZGF0YS5lcnJvck1zZyA9IEV4cG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZV9NU0cyOyAKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENvcHkgdGhlIGN1cnJlbnQgbGlicmFyeSB0byBhIG5ldyBsaWJyYXJ5LAotCQkvLyBzaW5jZSB3ZSBuZWVkIHRvIG1ha2UgY2hhbmdlcyB3aGVuIHBhY2thZ2luZyB0aGUgbmV3IGxpYnJhcnkuCi0JCU1ldGhvZExpYnJhcnkgbmV3TGlicmFyeSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQluZXdMaWJyYXJ5ID0gKE1ldGhvZExpYnJhcnkpIEVjb3JlVXRpbC5jb3B5KGN1cnJlbnRMaWIpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHNDsgCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ29uZmlndXJhdGlvbkNsb3N1cmUgY2xvc3VyZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBEZXRhY2ggdGhlIG5ldyBsaWJyYXJ5IGZyb20gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc28gaXQgY2FuIGJlCi0JCQkvLyBhZGRlZCB0byBhIG5ldyBMaWJyYXJ5IFByb2Nlc3NvciBpbnN0YW5jZS4KLQkJCUxpYnJhcnlVdGlsLmRldGFjaEZyb21SZXNvdXJjZShuZXdMaWJyYXJ5KTsKLQotCQkJLy8gQ3JlYXRlIGEgbmV3IExpYnJhcnkgTWFuYWdlciBhbmQgY3JlYXRlIGEgbmV3IHJlc291cmNlIGZvciB0aGUKLQkJCS8vIG5ldyBsaWJyYXJ5LgotCQkJLy8gVE9ETzogVXBkYXRlIHRoZSBVSSB0byBwcm9tcHQgZm9yIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlLgotCQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBmaWxlUGF0aCk7IAkvLyROT04tTkxTLTEkCi0JCQlwYXJhbXMucHV0KCJsaWJyYXJ5UmVnaXN0ZXJUeXBlIiwgIkNvbmZpZ0V4cG9ydCIpOyAJCS8vJE5PTi1OTFMtMSQJCS8vJE5PTi1OTFMtMiQJCQotCQkJCi0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyTWV0aG9kTGlicmFyeShuZXdMaWJyYXJ5LCAieG1pIiwgcGFyYW1zKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gQmVnaW4gcGFja2FnaW5nIHRoZSBuZXcgbGlicmFyeSBmb3IgZXhwb3J0LgotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obmV3TGlicmFyeSwgc2VsZWN0ZWRDb25maWdOYW1lKTsKLQotCQkJLy8gVmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIG1ha2Ugc3VyZSB0aGUgZ2xvYmFsIHBhY2thZ2VzIGFyZQotCQkJLy8gc2VsZWN0ZWQuIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGxpYnJhcnkKLQkJCS8vIGNhbid0IGJlIGxvYWRlZC4KLQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCi0JCQljbG9zdXJlID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKG51bGwsIGNvbmZpZyk7Ci0JCQljbG9zdXJlLnBhY2thZ2VMaWJyYXJ5KGRhdGEucmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiRXJyb3IgbWFraW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiBjbG9zdXJlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHMTsgCi0KLQkJCWlmIChjbG9zdXJlICE9IG51bGwpCi0JCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQkKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkudW5SZWdpc3Rlck1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0JCQkKLQkJCXJldHVybjsKLQkJfQotCi0JCXRyeSB7Ci0JCQlMaWJyYXJ5VXRpbC5zYXZlQWxsKG5ld0xpYnJhcnkpOwotCi0JCQkvLyB0aGUgZmlyc3Qgcm91bmQgb2Ygc2F2ZSB3aWxsIGNyZWF0ZSB0aGUgcmVzb3VyY2Ugc3RydWN0dXJlLAotCQkJLy8gbmVlZCB0byBzYXZlIGFnYWluIHRvIG1ha2Ugc3VyZSBhbGwgcmVmZXJlbmNlcyBhcmUgc2F2ZWQuCi0JCQkvLyBUaGlzIHN0ZXAgaXMgY3JpdGljYWwgc2luY2UgdGhlIGZpcnN0IHJvdW5kIG9ubHkgY3JlYXRlZCB0aGUgZGF0YQotCQkJLy8gc3RydWN0dXJlCi0JCQkvLyBzb21lIG9mIHRoZSBjcm9zcy1yZWZlcmVuY2VkIGVsZW1lbnRzIG1pZ2h0IGJlIGxvc3Qgb24gdGhlIGZpcnN0Ci0JCQkvLyBzYXZpbmcKLQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggcmVmZXJlbmNlcwotCQkJLy8gdG8gYSBuZXcgcGx1Z2luLAotCQkJLy8gd2hpY2ggYXJlIG5vdCBzYXZlZCB5ZXQsIHRob3NlIHJlZmVyZW5jZXMgd2lsbCBiZSBsb3N0LgotCQkJLy8gMTQ1ODkxIC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IGRlZmF1bHQgY29uZmlnIGlzIGxvc3MgYWZ0ZXIKLQkJCS8vIGltcG9ydAotCQkJTGlicmFyeVV0aWwuc2F2ZUFsbChuZXdMaWJyYXJ5KTsKLQotCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHNhdmluZyBsaWJyYXJ5IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRhdGEuZXJyb3JNc2cgPSBFeHBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2VfTVNHOTsgCi0KLQkJCWlmIChjbG9zdXJlICE9IG51bGwpCi0JCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0KLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkudW5SZWdpc3Rlck1ldGhvZExpYnJhcnkobmV3TGlicmFyeSk7Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIENvcHkgdGhlIHJlc291cmNlIGZpbGVzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgdG8gdGhlIG5ldyBsaWJyYXJ5LgotCQkvLyBGb3Igc2ltcGxpY2l0eSBzYWtlLCBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBpZiB0aGUgZmlsZXMgZG8gbm90Ci0JCS8vIGV4aXN0IGluIHRoZSB0YXJnZXQgbGlicmFyeSBvciBpZiB0aGUgZmlsZXMgYXJlIG5ld2VyCi0JCS8vU3RyaW5nIGluY2x1ZGVzID0gInJlc291cmNlcy8qKiwgKiovcmVzb3VyY2VzLyoqIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgaW5jbHVkZXMgPSAicmVzb3VyY2VzLyoqLCAqKi9yZXNvdXJjZXMvKiosICoqL2RpYWdyYW0ueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgc3JjRGlyID0gTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGN1cnJlbnRMaWIpOwotCQlGaWxlIGRlc3REaXIgPSBMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgobmV3TGlicmFyeSk7Ci0KLQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc3JjRGlyLCBkZXN0RGlyLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotCQloYW5kbGVFeHRyYVJlc291cmNlQ29weShjdXJyZW50TGliLCBuZXdMaWJyYXJ5LCBzcmNEaXIsIGRlc3REaXIsIGluY2x1ZGVzKTsKLQotCQkvLyBDbG9zZSB0aGUgbmV3bHkgY3JlYXRlZCBsaWJyYXJ5LgotCQlpZiAoY2xvc3VyZSAhPSBudWxsKQotCQkJY2xvc3VyZS5kaXNwb3NlKCk7Ci0JCQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KG5ld0xpYnJhcnkpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeHRyYVJlc291cmNlQ29weShNZXRob2RMaWJyYXJ5IGJhc2VMaWIsIE1ldGhvZExpYnJhcnkgZXhwb3J0ZWRMaWIsIEZpbGUgYmFzZUxpYkRpciwgRmlsZSBleHBvcnRlZExpYkRpciwgU3RyaW5nIGluY2x1ZGVzKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGxpYlJlc01nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCU1hcCBleHBvcnRlZFBsdWdpbk1hcCA9IE1ldGhvZEVsZW1lbnRVdGlsLmJ1aWxkTWFwKGJhc2VMaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCi0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlUGx1Z2lucyA9IGJhc2VMaWIuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJhc2VQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gYmFzZVBsdWdpbnMuZ2V0KGkpOwotCQkJRmlsZSBwbHVnaW5Gb2xkZXIgPSBuZXcgRmlsZShsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQYXRoKHBsdWdpbikpOwotCQkJYm9vbGVhbiBwcm9jZXNzZWQgPSBiYXNlTGliRGlyLmVxdWFscyhwbHVnaW5Gb2xkZXIuZ2V0UGFyZW50RmlsZSgpKTsJCQkKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRCBwbHVnaW5Gb2xkZXI6ICIgKyBwbHVnaW5Gb2xkZXIgKyAiLCBwcm9jZXNzZWQ6ICIgKyBwcm9jZXNzZWQpOwotCQkJaWYgKCEgcHJvY2Vzc2VkKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGV4cG9ydGVkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZXhwb3J0ZWRQbHVnaW5NYXAuZ2V0KHBsdWdpbi5nZXRHdWlkKCkpOwotCQkJCWlmIChleHBvcnRlZFBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlGaWxlIGRlc3REaXIgPSBuZXcgRmlsZShleHBvcnRlZExpYkRpciwgZXhwb3J0ZWRQbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihwbHVnaW5Gb2xkZXIsIGRlc3REaXIsIGluY2x1ZGVzLCBleGNsdWRlcyk7Ci0JCQl9Ci0KLQkJfQkJCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlYy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWRkYzk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1vZGVscyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNwZWMgewotCi0JcHVibGljIFN0cmluZyBuYW1lOwotCi0JcHVibGljIFN0cmluZyBndWlkOwotCi0JcHVibGljIFN0cmluZyB2ZXJzaW9uOwotCi0JcHVibGljIFN0cmluZyBicmllZl9kZXNjOwotCi0JcHVibGljIExpc3QgcGx1Z2luSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIExpc3QgcGFja2FnZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBMaXN0IHZpZXdJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYygpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZTUzZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9Db25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEV4cG9ydHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gdG8gZXhwb3J0IGEgY29uZmlndXJhdGlvbiBzcGVjaWZpY2FpdG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGRhdGEuc2VsZWN0ZWRDb25maWdzID09IG51bGwgfHwgZGF0YS5zZWxlY3RlZENvbmZpZ3Muc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMCk7IAotCi0JCS8vIENyZWF0ZSB0aGUgZXhwb3J0IGxpYnJhcnkgZm9sZGVyLgotCQlGaWxlIGxpYkZvbGRlcjsKLQkJRmlsZSBleHBvcnRMaWJGb2xkZXI7Ci0KLQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSAobmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJZXhwb3J0TGliRm9sZGVyID0gbmV3IEZpbGUoZXhwb3J0TGliUGF0aCk7Ci0JCWlmICghZXhwb3J0TGliRm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlleHBvcnRMaWJGb2xkZXIubWtkaXIoKTsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRhdGEuc2VsZWN0ZWRDb25maWdzCi0JCQkJLmdldCgwKTsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgY29uZmlnLmVDb250YWluZXIoKTsKLQkJVVJJIHVyaSA9IGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKTsKLQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCWxpYkZvbGRlciA9IChuZXcgRmlsZShwYXRoKSkuZ2V0UGFyZW50RmlsZSgpOwotCi0JCS8vIFByZXBhcmUgdGhlIGlkIHNlbGVjdGlvbnMsCi0JCWdldFNlbGVjdGVkSWRzKGRhdGEuc2VsZWN0ZWRDb25maWdzKTsKLQotCQkvLyBMb2FkIHRoZSBsaWJyYXJ5LnhtaSBhbmQgcmVtb3ZlIHVubmVlZGVkIGVsZW1lbnRzLgotCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBwcm9jZXNzTGlicmFyeUZpbGUobmV3IEZpbGUobGliRm9sZGVyLCBsaWJyYXJ5RmlsZSksIG5ldyBGaWxlKAotCQkJCWV4cG9ydExpYkZvbGRlciwgZXhwb3J0RmlsZSkpOwotCi0JCWlmICggZG9jdW1lbnQgIT0gbnVsbCApIHsKLQkJCS8vIGNvcHkgdGhlIGNvbmlmdXJhdGlvbiBmaWxlcwotCQkJLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCQljb3B5Q29uZmlndXJhdGlvbkZpbGVzKGRvY3VtZW50LCBsaWJGb2xkZXIsIGV4cG9ydExpYkZvbGRlcik7Ci0JCX0KLQkJCi0JCW1vbml0b3Iuc2V0VGFza05hbWUoRXhwb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25TcGVjc0V4cG9ydFNlcnZpY2VfTVNHMSk7IAotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlDb25maWd1cmF0aW9uRmlsZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50LCBGaWxlIGxpYkZvbGRlciwgRmlsZSBleHBvcnRMaWJGb2xkZXIpIHsKLQkJLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLnNlbGVjdGVkQ29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlTdHJpbmcgdXJpID0gZG9jdW1lbnQuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlTdHJpbmcgc3JjVXJpID0gbnVsbDsKLQkJCWlmICh1cmkgPT0gbnVsbCkgewotCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJc3JjVXJpID0gcmVzVXJpLnRvRmlsZVN0cmluZygpOwotCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQl1cmkgPSBkb2N1bWVudC5kZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJCWlmICggdXJpICE9IG51bGwgKSB7Ci0JCQkJRmlsZSBzcmMgPSBzcmNVcmkgPT0gbnVsbCA/IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKSA6IG5ldyBGaWxlKHNyY1VyaSk7Ci0JCQkJRmlsZSB0YXJnZXQgPSAgbmV3IEZpbGUoZXhwb3J0TGliRm9sZGVyLCB1cmkpOwotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGFyZ2V0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2V0U2VsZWN0ZWRJZHMoTGlzdCBjb25maWdzKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgc2VsZWN0ZWQgY29uZmlnIGlkcy4KLQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlpZiAoc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLy8gQWRkIHRoZSBjb25maWd1cmF0aW9uLgotCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkvLyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB3ZSBuZWVkIHRvIHNhdmUgdGhlIG1ldGhvZCBwbHVnaW4gaWRzIGFuZAotCQkJLy8gbWV0aG9kIHBhY2thZ2UgaWRzIHNvIHRoYXQgdGhlaXIgZW50cmllcyBpbiB0aGUgcmVzb3VyY2UgZmlsZSBjYW4KLQkJCS8vIGJlIGtlcHQuCi0JCQlMaXN0IHJlZnMgPSBjb25maWcuZUNyb3NzUmVmZXJlbmNlcygpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdHIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IG8gaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRXhwb3J0UGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCSJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgIicgaW4gY29uZmlndXJhdGlvbiAnIiArIGNvbmZpZy5nZXROYW1lKCkgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL0RpYWdyYW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGNiOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9EaWFncmFtSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoYW5kbGUgZGlhZ3JhbSBleHBvcnQvaW1wb3J0Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSGFuZGxlciB7Ci0JCi0JLy9UbyBkbzogbmVlZCB0byBjb25zaWRlciBlbGVtZW50IHJlbmFtZSBpc3N1ZS4gCi0JLy8JCSAtPiBSZXNvdmxlIHRoZSBpbnZvbHZlZCBmaWxlIG5hbWVzIGFmdGVyIGFsbCByZXNvdXJjZSBuYW1lcyBhcmUgc2V0dGxlZC4KLQkvLwkJIC0+IExldCBhIHN1YiBjbGFzcyB0byB0YWtlIG9mIGl0PwotCi0JcHJpdmF0ZSBGaWxlIHNvdXJjZUxpYlJvb3Q7Ci0JcHJpdmF0ZSBGaWxlIHRhcmdldExpYlJvb3Q7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPigpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIERpYWdyYW1IYW5kbGVyKEZpbGUgc291cmNlTGliUm9vdCwgRmlsZSB0YXJnZXRMaWJSb290KSB7Ci0JCXRoaXMuc291cmNlTGliUm9vdCA9IHNvdXJjZUxpYlJvb3Q7Ci0JCXRoaXMudGFyZ2V0TGliUm9vdCA9IHRhcmdldExpYlJvb3Q7Ci0JfQotCQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBNYXBFbnRyeVZhbHVlPiBnZXRFbGVtZW50TWFwKCkgewotCQlyZXR1cm4gZWxlbWVudE1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb1Byb2Nlc3MoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWJvb2xlYW4gYiA9IGVsZW0gaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiB8fAotCQkJCQkJCQllbGVtIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzOwotCQlyZXR1cm4gYjsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmVnaXN0ZXJFbGVtZW50KGVsZW0sIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSwgYm9vbGVhbiBwcm9jZXNzRW50cnkpIHsKLQkJaWYgKCEgbmVlZFRvUHJvY2VzcyhlbGVtKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50TWFwLmNvbnRhaW5zS2V5KGVsZW0uZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlNYXBFbnRyeVZhbHVlIG1hcEVudHJ5VmFsdWUgPSBuZXcgTWFwRW50cnlWYWx1ZSgpOwotCQltYXBFbnRyeVZhbHVlLmVsZW1lbnQgPSBlbGVtOwotCQllbGVtZW50TWFwLnB1dChlbGVtLmdldEd1aWQoKSwgbWFwRW50cnlWYWx1ZSk7CQkKLQkJCi0JCWlmIChwcm9jZXNzRW50cnkpIHsKLQkJCXByb2Nlc3NFbnRyeShlbGVtLCBtYXBFbnRyeVZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwb3N0UmVnaXN0ZXJFbGVtZW50cygpIHsKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCXByb2Nlc3NFbnRyeSh2YWx1ZS5lbGVtZW50LCB2YWx1ZSk7Ci0JCX0JCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeShNZXRob2RFbGVtZW50IGVsZW0sIE1hcEVudHJ5VmFsdWUgbWFwRW50cnlWYWx1ZSkgewotCQlGaWxlW10gZmlsZXMgPSBnZXRGaWxlcyhlbGVtKTsKLQkJRmlsZSBzb3VyY2VGaWxlID0gZmlsZXNbMF07Ci0JCUZpbGUgdGFyZ2V0RmlsZSA9IGZpbGVzWzFdOwotCi0JCWlmIChzb3VyY2VGaWxlICE9IG51bGwgJiYgc291cmNlRmlsZS5leGlzdHMoKSkgewotCQkJbWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID0gc291cmNlRmlsZTsKLQkJfQotCi0JCWlmICh0YXJnZXRGaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlID09IG51bGwgfHwgbmVlZENvcHkobWFwRW50cnlWYWx1ZS5zb3VyY2VGaWxlLCB0YXJnZXRGaWxlKSkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCQltYXBFbnRyeVZhbHVlLmV4aXN0aW5nID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtYXBFbnRyeVZhbHVlLnNvdXJjZUZpbGUgIT0gbnVsbCkgewotCQkJCW1hcEVudHJ5VmFsdWUudGFyZ2V0RmlsZSA9IHRhcmdldEZpbGU7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbWFwRW50cnlWYWx1ZTogIik7CQkJCQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obWFwRW50cnlWYWx1ZS50b0RlYnVnU3RyaW5nKCJMRD4gIikpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZWRGaWxlcygpIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJZm9yIChJdGVyYXRvcjxNYXBFbnRyeVZhbHVlPiBpdCA9IGVsZW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwRW50cnlWYWx1ZSB2YWx1ZSA9IGl0Lm5leHQoKTsKLQkJCWlmICh2YWx1ZS5leGlzdGluZyAmJiB2YWx1ZS50YXJnZXRGaWxlICE9IG51bGwpIHsKLQkJCQlyZXQuYWRkKHZhbHVlLnRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGFsbCB0aGUgZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0cnkgewotCQkJZXhlY3V0ZV8oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBleGVjdXRlXygpIHsKLQkJCi0JCWZvciAoSXRlcmF0b3I8TWFwRW50cnlWYWx1ZT4gaXQgPSBlbGVtZW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXBFbnRyeVZhbHVlIHZhbHVlID0gaXQubmV4dCgpOwotCQkJaWYgKHZhbHVlLnRhcmdldEZpbGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmICh2YWx1ZS5zb3VyY2VGaWxlICE9IG51bGwpIHsKLQkJCQlGaWxlIHBhcmVudEZpbGUgPSB2YWx1ZS50YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZSh2YWx1ZS5zb3VyY2VGaWxlLCB2YWx1ZS50YXJnZXRGaWxlKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRDogRmlsZSBjb3BpZWQ6ICIgKyB2YWx1ZS5zb3VyY2VGaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdmFsdWUudGFyZ2V0RmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvcHkgYWN0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZENvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQlyZXQgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXx8IChkZXN0Lmxlbmd0aCgpICE9IHNvdXJjZS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNYXBFbnRyeVZhbHVlIHsKLQotCQlwdWJsaWMgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCQlwdWJsaWMgRmlsZSBzb3VyY2VGaWxlOwotCQlwdWJsaWMgRmlsZSB0YXJnZXRGaWxlOwotCQlwdWJsaWMgYm9vbGVhbiBleGlzdGluZyA9IGZhbHNlOwkJCi0JCQotCQlwdWJsaWMgU3RyaW5nIHRvRGVidWdTdHJpbmcoU3RyaW5nIHByb21wdCkgewotCQkJU3RyaW5nIHN0ciA9IHByb21wdCArICJlbGVtZW50OiAiICsgZWxlbWVudC5nZXROYW1lKCk7CQkvLyROT04tTkxTLTEkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJzb3VyY2VGaWxlOiAiICsgc291cmNlRmlsZTsJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJc3RyICs9ICJcbiIgKyBwcm9tcHQgKyAidGFyZ2V0RmlsZTogIiArIHRhcmdldEZpbGU7CQkvLyROT04tTkxTLTEkIAkvLyROT04tTkxTLTIkCi0JCQlzdHIgKz0gIlxuIiArIHByb21wdCArICJleGlzdGluZzogIiArIGV4aXN0aW5nOwkJCS8vJE5PTi1OTFMtMSQgCS8vJE5PTi1OTFMtMiQJCQkKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJCi0JfQotCi0JcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhNZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJcmV0dXJuIGdldEZpbGVzKGVsZW0sIHRydWUpOwotCX0KLQkKLQkvL1swXTogc291cmNlRmlsZQotCS8vWzFdOiB0YXJnZXRGaWxlCi0JcHJvdGVjdGVkIEZpbGVbXSBnZXRGaWxlcyhNZXRob2RFbGVtZW50IGVsZW0sIGJvb2xlYW4gZXhwb3J0KSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlWzJdOwotCQkKLQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoZWxlbSk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWxlbWVudFBhdGg6ICIgKyBlbGVtZW50UGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudFBhdGggPT0gbnVsbCB8fCBlbGVtZW50UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbGVtZW50UGF0aCBpcyBudWxsIG9yIGVtcHR5ISIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gZmlsZXM7Ci0JCX0KLQotCQlTdHJpbmcgZGlhZ3JhbVBhdGggPSBlbGVtZW50UGF0aCArIGVsZW0uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyAKLQkJCQkJCQkJImRpYWdyYW0ueG1pIjsJCQkJLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWFncmFtUGF0aCAwOiAiICsgZGlhZ3JhbVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlGaWxlIHNyY1Jvb3QgPSBzb3VyY2VMaWJSb290OwotCQlGaWxlIHRndFJvb3QgPSB0YXJnZXRMaWJSb290OwotCQkKLQkJCi0JCWlmIChleHBvcnQpIHsKLQkJCXNyY1Jvb3QgPSAgZ2V0Um9vdChlbGVtKTsKLQkJfSBlbHNlIHsKLQkJCXRndFJvb3QgPSAgZ2V0Um9vdChlbGVtKTsKLQkJfQotCQkKLQkJaWYgKGV4cG9ydCkgewotCQkJUmVzb3VyY2UgcmVzID0gZWxlbS5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCUZpbGUgbW9kZWxGaWxlID0gbmV3IEZpbGUocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlGaWxlIGZvbGRlciA9IG1vZGVsRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJU3RyaW5nIGZvbGRlclBhdGggPSBmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJCQlpbnQgaXggPSBzcmNSb290LmdldEFic29sdXRlUGF0aCgpLmxlbmd0aCgpOwotCQkJCWlmIChmb2xkZXJQYXRoLmxlbmd0aCgpID4gaXgKLQkJCQkJCSYmIGZvbGRlclBhdGguc3Vic3RyaW5nKDAsIGl4KS5lcXVhbHNJZ25vcmVDYXNlKAotCQkJCQkJCQlzcmNSb290LmdldEFic29sdXRlUGF0aCgpKSkgewotCQkJCQlkaWFncmFtUGF0aCA9IGZvbGRlclBhdGguc3Vic3RyaW5nKGl4ICsgMSkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgImRpYWdyYW0ueG1pIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSBVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoZWxlbSk7Ci0JCQlpZiAocGMgIT0gbnVsbCAmJiAhIHBjLmdldE5hbWUoKS5lcXVhbHMoZWxlbS5nZXROYW1lKCkpKSB7Ci0JCQkJZGlhZ3JhbVBhdGggPSBlbGVtZW50UGF0aCArIHBjLmdldE5hbWUoKSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrICJkaWFncmFtLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJZmlsZXNbMF0gPSBuZXcgRmlsZShzcmNSb290LCBkaWFncmFtUGF0aCk7Ci0JCWZpbGVzWzFdID0gbmV3IEZpbGUodGd0Um9vdCwgZGlhZ3JhbVBhdGgpOwkJCi0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnRNYXAoaW50IHBhc3NJZCkgewotCX0KLQotCXB1YmxpYyBGaWxlIGdldFNvdXJjZUxpYlJvb3QoKSB7Ci0JCXJldHVybiBzb3VyY2VMaWJSb290OwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRSb290KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihlbGVtKTsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKGVsZW0pOwotCQlGaWxlIHJvb3QgPSAobmV3IEZpbGUocGx1Z2luUGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0VGFyZ2V0TGliUm9vdCgpIHsKLQkJcmV0dXJuIHRhcmdldExpYlJvb3Q7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvTGlicmFyeURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWZjZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC9zZXJ2aWNlcy9MaWJyYXJ5RG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBtZXRob2QgbGlicmFyeSB1c2luZyBhIERPTSBkb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeURvY3VtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19tZXRob2RQbHVnaW5zID0gIm1ldGhvZFBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zID0gInByZWRlZmluZWRDb25maWd1cmF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19yZXNvdXJjZURlc2NyaXB0b3JzID0gInJlc291cmNlRGVzY3JpcHRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfcmVzb3VyY2VTdWJNYW5hZ2VycyA9ICJzdWJNYW5hZ2VycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfaHJlZiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9pZCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdXJpID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfZ3VpZCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfdmFsdWUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBvcnRGaWxlID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5RmlsZSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBGaWxlIGxpYkZpbGU7Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0KLQlwcm90ZWN0ZWQgRWxlbWVudCBsaWJUYWcgPSBudWxsOwotCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVzVGFnID0gbnVsbDsKLQkKLQlwcml2YXRlIEhhc2hNYXAgZ3VpZFRvVXJpTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RG9jdW1lbnQoRmlsZSBsaWJGaWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saWJGaWxlID0gbGliRmlsZTsKLQkJaW5pdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwobGliRmlsZSk7Ci0KLQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCU5vZGVMaXN0IG5vZGVzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlsaWJUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCi0JCW5vZGVzID0gcm9vdAotCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwgJiYgbm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXNUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJfQotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50IGZpZWxkCi0gICAgICovCi0JcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudDsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJGaWxlIGZpZWxkCi0gICAgICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbGliVGFnIGZpZWxkCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0TGliVGFnKCkgewotCQlyZXR1cm4gbGliVGFnOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZQotICAgICAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBsaWJUYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IGd1aWQKLSAgICAgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlHdWlkKCkgewotCQlyZXR1cm4gbGliVGFnLmdldEF0dHJpYnV0ZSgiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVzb3VyY2UgdGFnCi0gICAgICovCi0JcHVibGljIEVsZW1lbnQgZ2V0UmVzb3VyY2VUYWcoKSB7Ci0JCXJldHVybiByZXNUYWc7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIGNvbmZpZyBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSByZXNvdXJjZSBkZXNjcmlwdG9yIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoRWxlbWVudCBub2RlKSB7Ci0JCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHBsdWdpbiBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kUGx1Z2lucyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb25maWd1cmF0aW9uIG5vZGUgbGlzdAotICAgICAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDb25maWd1cmF0aW9ucygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHJlc291cmNlIGRlc2NyaXB0b3Igbm9kZSBsaXN0Ci0gICAgICovCi0JcHVibGljIE5vZGVMaXN0IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiByZXNUYWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVEFHX3Jlc291cmNlRGVzY3JpcHRvcnMpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgcmVzb3VyY2Ugc3VibWFuYWdlciBub2RlIGxpc3QKLSAgICAgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0UmVzb3VyY2VTdWJNYW5hZ2VycygpIHsKLQkJcmV0dXJuIHJlc1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfcmVzb3VyY2VTdWJNYW5hZ2Vycyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBsdWdpbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luKEVsZW1lbnQgbm9kZSkgewotCQlsaWJUYWcuYXBwZW5kQ2hpbGQoZ2V0VmFsaWROb2RlKG5vZGUpKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgY29uZmlndXJhdGlvbiBub2RlCi0gICAgICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbihFbGVtZW50IG5vZGUpIHsKLQkJbGliVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHJlc291cmNlIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZShFbGVtZW50IG5vZGUpIHsKLQkJcmVzVGFnLmFwcGVuZENoaWxkKGdldFZhbGlkTm9kZShub2RlKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHZhbGlkIG5vZGUKLSAgICAgKi8KLQlwdWJsaWMgTm9kZSBnZXRWYWxpZE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gZG9jdW1lbnQuaW1wb3J0Tm9kZShub2RlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmUgcGx1Z2lucyBieSBndWlkCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUxpc3QKLQkgKiAgICAgICAgICAgIExpc3QgYSBsaXN0IG9mIGd1aWRzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2lucyhMaXN0IHJlbW92ZUxpc3QpIHsKLQkJLy8gSW1wb3J0aW5nIGEgcGFja2FnZSBvZiBwbGdpbnMgdHdpY2UgZ2VuZXJhdGVzIDIKLQkJLy8gaWRlbnRpY2FsIHBsdWdpbnMKLQkJLy8gcmVtb3ZlIHRoZSBub2RlIHdpbGwgY2F1c2UgdGhlIG5vZGUgbGlzdCB0byBzaHJpbmssIHNvIGRvbid0IGluY3JlYXNlCi0JCS8vIHRoZSBpbmRleAotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBub2RlcwotICAgICAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25zKExpc3QgcmVtb3ZlTGlzdCkgewotCQkvLyByZW1vdmUgdGhlIHVubmVlZGVkIGNvbmZpZ3VyYXRpb25zCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IG5vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZChub2RlKTsKLQkJCWlmIChyZW1vdmVMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJbGliVGFnLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmUgdGhlIGxpc3QgZnJvbSB0aGUgcmVzb3VyY2Ugbm9kZXMKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZUVudHJpZXMoTGlzdCByZW1vdmVMaXN0KSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2lkKTsKLQkJCVN0cmluZyB1cmkgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX3VyaSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQotCQkJCS8vIGNoZWNrIHRoZSBwbHVnaW4geG1pIGZpbGUsIGlmIGV4aXN0cywgZGVsZXRlIHRoZSBmb2xkZXIKLQkJCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJCWlmIChwbHVnbl9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCS8vIGRlbGV0ZSB0aGUgZm9sZGVyID8/PwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJLy8gYWxzbyByZW1vdmUgdGhlIHN1YiBtYW5hZ2VycwotCQlub2RlcyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaSA9IDA7Ci0JCXdoaWxlIChpIDwgbm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQlpZiAocmVtb3ZlTGlzdC5jb250YWlucyhndWlkKSkgewotCQkJCXJlc1RhZy5yZW1vdmVDaGlsZChub2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZXNvdXJjZSB1cmkgZm9yIHRoZSByZXNvdXJjZSBndWlkCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZVVyaShTdHJpbmcgZ3VpZCkgewotCQlTdHJpbmcgdXJpID0gZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChndWlkKTsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl1cmkgPSBnZXRSZXNvdXJjZVVyaV8oZ3VpZCk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkvL2FkZFRvR3VpZFRvVXJpTWFwKGd1aWQsIHVyaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVzb3VyY2VVcmlfKFN0cmluZyBndWlkKSB7Ci0JCi0JCU5vZGVMaXN0IG5vZGVzID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKysgKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaWQpOwotCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdXJpKTsKLQkJCWlmICggZ3VpZC5lcXVhbHMoaWQpICkgewotCQkJCXJldHVybiBkZWNvZGVVcmkodXJpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVjb3JlZCBVUkkuCi0JICovCi0JcHVibGljIFN0cmluZyBkZWNvZGVVcmkoU3RyaW5nIHVyaSkgewotCQl0cnkgewotCQkJdXJpID0gVVJMRGVjb2Rlci5kZWNvZGUodXJpLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiB1cmk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbGUgZ2l2ZW4gdGhlIHVyaS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlRnJvbVVyaShTdHJpbmcgdXJpKSB7Ci0JCXVyaSA9IGRlY29kZVVyaSh1cmkpOwotCQkKLQkJaW50IGkgPSB1cmkuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpID4gMCkgewotCQkJdXJpID0gdXJpLnN1YnN0cmluZygwLCBpKTsKLQkJfQotCi0JCXJldHVybiBuZXcgRmlsZShsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwgdXJpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlQXMobGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRvY3VtZW50IGluIHRoZSBmaWxlIGdpdmVuIGJ5IGZpbGVQYXRoTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlQXMoU3RyaW5nIGZpbGVQYXRoTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhNTFV0aWwuc2F2ZURvY3VtZW50KHRoaXMuZG9jdW1lbnQsIGZpbGVQYXRoTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSXMgdGhlIGRvY3VtZW50IGZvciBjb25maWd1dGF0aW9uIHNwZWNpZmljYXRpb24gZXhwb3J0L2ltcG9ydCBvbmx5PwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlnU3BlY3NPbmx5KCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGdldFBsdWdpbnMoKTsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKGhyZWYpOwotCQkJU3RyaW5nIHVyaSA9IGdldFJlc291cmNlVXJpKGd1aWQpOwotCQkJCi0JCQkvLyBjaGVjayBpZiB0aGUgcmVzb3VyY2UgZmlsZXMgYXJlIHRoZXJlCi0JCQlGaWxlIHBsdWduX2ZpbGUgPSBnZXRGaWxlRnJvbVVyaSh1cmkpOwotCQkJaWYgKHBsdWduX2ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBzdGF0aWMgaGxwZXIgbWV0aG9kcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLyoqCi0JICogUmV0dXJucyBzdWJtYW5hZ2VyJ3MgYmFzZSBndWlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN1Yk1hbmFnZXJCYXNlR3VpZChTdHJpbmcgaHJlZikgewotCQlmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkJInVtYTovLyguKj8pIyguKj8pIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0JCU1hdGNoZXIgbSA9IHAubWF0Y2hlcihocmVmKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlyZXR1cm4gbS5ncm91cCgxKTsKLQkJfQotCi0JCXJldHVybiBocmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY2hpbGQgdmFsdWUgb2YgdGhlIGNoaWxkIHRhZyBnaXZlbiBieSBjaGlsZFRhZ05hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRWYWx1ZShFbGVtZW50IHRhZywgU3RyaW5nIGNoaWxkVGFnTmFtZSkgewotCQlOb2RlTGlzdCBub2RlcyA9IHRhZy5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW50IHNpemUgPSBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KQotCQkJCQkmJiAoKEVsZW1lbnQpIG5vZGUpLmdldFRhZ05hbWUoKS5lcXVhbHMoY2hpbGRUYWdOYW1lKSkgewotCQkJCXJldHVybiBnZXROb2RlVGV4dCgoRWxlbWVudCkgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiB0ZXh0IG9mIGEgbGVhZiBub2RlLCB3aXRob3V0IGNoaWxkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0KEVsZW1lbnQgdGFnKSB7Ci0KLQkJTm9kZUxpc3Qgbm9kZXMgPSB0YWcuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAobm9kZXMgPT0gbnVsbCB8fCBub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWludCBzaXplID0gbm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCWJ1ZmZlci5hcHBlbmQobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBndWlkIGZyb20gaHJlZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbUhyZWYoU3RyaW5nIGhyZWYpIHsKLQkJaW50IGkgPSBocmVmLmluZGV4T2YoIiMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaSA+IDApIHsKLQkJCXJldHVybiBocmVmLnN1YnN0cmluZyhpICsgMSk7Ci0JCX0KLQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGd1aWQgb2YgdGhlIG5vZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZChFbGVtZW50IG5vZGUpIHsKLQkJU3RyaW5nIGlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoInhtaTppZCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwICkgewotCQkJU3RyaW5nIGhyZWYgPSBub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJaWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCX0KLQkJCi0JCXJldHVybiBpZDsKLQl9Ci0JCi0JLy8gMTQzMDMzIC0gdXBkYXRlIGNvbmZpZyBzcGVjcycgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgdG8gbWF0Y2ggd2l0aCB0aGUgbmV3IGZpbGUgZm9ybWF0Ci0JcHJvdGVjdGVkIEVsZW1lbnQgZ2V0Q29uZmlnTm9kZShFbGVtZW50IGNvbmZpZ05vZGUpIHsKLQkJdHJ5IHsKLQkJCQotCQkJLy8gbmV3IG1vZGVsIGRlZmluZXMgaHJlZiBmb3IgY29uZmlndXJhdGlvbiAKLQkJCVN0cmluZyBocmVmID0gY29uZmlnTm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKTsKLQkJCWlmIChocmVmID09IG51bGwgfHwgaHJlZi5sZW5ndGgoKSA9PSAwICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfSAKLQotCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYoaHJlZik7Ci0JCQlTdHJpbmcgdXJpID0gZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCQlpZiAoIHVyaSA9PSBudWxsICkgewotCQkJCXJldHVybiBjb25maWdOb2RlOwotCQkJfQotCQkJCi0JCQlGaWxlIHNvdXJjZSA9IGdldEZpbGVGcm9tVXJpKHVyaSk7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgY29uZmlnVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJY29uZmlnVGFnID0gcm9vdDsKLQkJCX0gZWxzZSB7Ci0JCQkJTm9kZUxpc3Qgbm9kZXMgPSByb290Ci0JCQkJCQkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCQljb25maWdUYWcgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBjb25maWdUYWc7Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb25maWdOb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIENvbmZpZ3VyYXRpb25TcGVjIGluc3RhbmNlIGdpdmVuIHRoZSBlbGVtZW50IG5vZGUgY29uZmlnLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU3BlYyBnZXRDb25maWd1cmF0aW9uU3BlYyhFbGVtZW50IGNvbmZpZykgewotCQlDb25maWd1cmF0aW9uU3BlYyBzcGVjID0gbmV3IENvbmZpZ3VyYXRpb25TcGVjKCk7Ci0JCQotCQlFbGVtZW50IGNvbmZpZ05vZGUgPSBnZXRDb25maWdOb2RlKGNvbmZpZyk7Ci0JCXNwZWMuZ3VpZCA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJ4bWk6aWQiKTsgLy8kTk9OLU5MUy0xJAotCQlzcGVjLm5hbWUgPSBjb25maWdOb2RlLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCXNwZWMuYnJpZWZfZGVzYyA9IGNvbmZpZ05vZGUuZ2V0QXR0cmlidXRlKCJicmllZkRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGdldCBwbHVnaW5zCi0JCU5vZGVMaXN0IG5vZGVzID0gY29uZmlnTm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibWV0aG9kUGx1Z2luU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJCVN0cmluZyBndWlkID0gZ2V0R3VpZEZyb21IcmVmKG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfaHJlZikpOwotCQkJCXNwZWMucGx1Z2luSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYWNrYWdlcwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUhyZWYobm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9ocmVmKSk7Ci0JCQkJc3BlYy5wYWNrYWdlSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldCB2aWV3cwotCQlub2RlcyA9IGNvbmZpZ05vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByb2Nlc3NWaWV3cyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChub2RlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tSHJlZihub2RlLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpKTsKLQkJCQlzcGVjLnZpZXdJZHMuYWRkKGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHNwZWM7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZ3VpZC91cmkgcGFpciB0byBndWlkVG9VcmlNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVG9HdWlkVG9VcmlNYXAoU3RyaW5nIGd1aWQsIFN0cmluZyB1cmkpIHsKLQkJaWYgKGd1aWRUb1VyaU1hcCA9PSBudWxsKSB7Ci0JCQlndWlkVG9VcmlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWd1aWRUb1VyaU1hcC5wdXQoZ3VpZCwgdXJpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB1cmkgZnJvbSBndWlkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpRnJvbUd1aWRUb1VyaU1hcChTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gZ3VpZFRvVXJpTWFwID09IG51bGwgPyBudWxsIDogKFN0cmluZykgZ3VpZFRvVXJpTWFwLmdldChndWlkKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGFuIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlnRG9jVmlzaXRvciB7Ci0JCXB1YmxpYyB2b2lkIHZpc2l0KEZpbGUgZmlsZSwgRWxlbWVudCBub2RlKSB7CQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmlzaXQgY29uZmlndXJhdGlvbiBmaWxlcyBnaXZlbiBieSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGZvbGRlciBjb25maWdEaXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZpc2l0Q29uZmlnRmlsZXMoRmlsZSBjb25maWdEaXIsIENvbmZpZ0RvY1Zpc2l0b3IgdmlzaXRvcikgewkKLQkJRmlsZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJcmV0dXJuICFwYXRobmFtZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiY3ZzIikgJiYgCQkvLyROT04tTkxTLTEkCi0JCQkJCQlwYXRobmFtZS5pc0RpcmVjdG9yeSgpIHx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKTsKLQkJCX0JCQkKLQkJfTsJCQotCQlGaWxlW10gZmlsZXMgPSBjb25maWdEaXIubGlzdEZpbGVzKGZpbHRlcik7Ci0JCWlmIChmaWxlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBmaWxlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLQkJCQkJCS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCQlEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKGZpbGUpOwotCQkJCUVsZW1lbnQgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQl2aXNpdG9yLnZpc2l0KGZpbGUsIHJvb3QpOwkJCQkKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGEgbWFwIGZyb20gcGx1aWduIGd1aWRzIHRvIHJlc291cmNlIG1hbmFnZXIgZ3VpZHMuCi0JICovCi0JcHVibGljIE1hcCBidWlsZFBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAoTGlzdCBwbHVnaW5HdWlkcykgewotCQlpZiAocGx1Z2luR3VpZHMgPT0gbnVsbCB8fCBwbHVnaW5HdWlkcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTm9kZUxpc3Qgc3ViTWdycyA9IGdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJaWYgKHN1Yk1ncnMgPT0gbnVsbCB8fCBzdWJNZ3JzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkJCQotCQlIYXNoTWFwIHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luR3VpZHMuc2l6ZSgpOyBpKyspIHsJCQkKLQkJCVN0cmluZyBwbHVnaW5HdWlkID0gKFN0cmluZykgcGx1Z2luR3VpZHMuZ2V0KGkpOwotCQkJcGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5wdXQocGx1Z2luR3VpZCwgbnVsbCk7Ci0JCX0KLQkJYm9vbGVhbiBpc0VtcHR5ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHN1Yk1ncnMuZ2V0TGVuZ3RoKCk7IGkrKykgewkJCQotCQkJRWxlbWVudCBtZ3IgPSAoRWxlbWVudCkgc3ViTWdycy5pdGVtKGkpOwotCQkJU3RyaW5nICBocmVmID0gbWdyLmdldEF0dHJpYnV0ZShBVFRSX2hyZWYpOwotCQkJU3RyaW5nIHBsdWdpbkd1aWQgPSBnZXRTdWJNYW5hZ2VyQmFzZUd1aWQoaHJlZik7Ci0JCQlpZiAocGx1Z2luR3VpZFRvUmVzTWdyR3VpZE1hcC5jb250YWluc0tleShwbHVnaW5HdWlkKSkgewotCQkJCXBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAucHV0KHBsdWdpbkd1aWQsIGdldEd1aWRGcm9tSHJlZihocmVmKSk7Ci0JCQkJaXNFbXB0eSA9IGZhbHNlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGlzRW1wdHkgPyAgbnVsbCA6IHBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXA7Ci0JfQotCQotCS8qKgotCSAqIFNhdmUgZXh0cmEgaW5mbyAoYWxsIHBsdWdpbiBndWlkcyBhbmQgbmFtZXMpIGluIGxpYlRhZydzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3JlRXh0cmFJbmZvKExpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0KLQkJRWxlbWVudCB2ZXJzaW9uTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCXZlcnNpb25Ob2RlLnNldEF0dHJpYnV0ZShBVFRSX3ZhbHVlLCAiMCIpOwkvLyROT04tTkxTLTEkIAotCQlsaWJUYWcuYXBwZW5kQ2hpbGQodmVyc2lvbk5vZGUpOwkJCi0JCQotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnID0gaXQubmV4dCgpOwotCQkJCi0JCQlFbGVtZW50IGd1aWROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsJCi0JCQlndWlkTm9kZS5zZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSwgcGx1Zy5nZXRHdWlkKCkpOwotCQkJRWxlbWVudCBuYW1lTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoVEFHX21ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7CQotCQkJbmFtZU5vZGUuc2V0QXR0cmlidXRlKEFUVFJfdmFsdWUsIHBsdWcuZ2V0TmFtZSgpKTsKLQkJCQotCQkJbGliVGFnLmFwcGVuZENoaWxkKGd1aWROb2RlKTsKLQkJCWxpYlRhZy5hcHBlbmRDaGlsZChuYW1lTm9kZSk7Ci0JCX0KLQkJCi0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVjYWxsRXh0cmFJbmZvKCkgewotCQl0cnkgewotCQkJTm9kZUxpc3Qgbm9kZXMgPSBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpOwotCQkJaWYgKG5vZGVzID09IG51bGwgfHwgbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCUVsZW1lbnQgdmVyc2lvbk5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbSgwKTsKLQkJCVN0cmluZyB2ZXJzaW9uU3RyID0gdmVyc2lvbk5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfdmFsdWUpOwotCQkJCi0JCQlpZiAodmVyc2lvblN0ci5lcXVhbHMoIjAiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJCWd1aWRUb1BsdWdOYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTspIHsKLQkJCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCW5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpICsgMSk7Ci0JCQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl92YWx1ZSk7Ci0JCQkJCWd1aWRUb1BsdWdOYW1lTWFwLnB1dChndWlkLCBuYW1lKTsKLQkJCQkJaWYgKGZhbHNlKSB7CQkJCQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZ3VpZDogIiArIGd1aWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBuYW1lOiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQkJCQkJCi0JCQkJCWkgKz0gMjsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJZ3VpZFRvUGx1Z05hbWVNYXAgPSBudWxsOwotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBHZXQgZ3VpZCB0byBwbHVnaW4gbWFwCi0JICovCi0JcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0R3VpZFRvUGx1Z05hbWVNYXAoKSB7Ci0JCWlmIChndWlkVG9QbHVnTmFtZU1hcCA9PSBudWxsKSB7Ci0JCQlyZWNhbGxFeHRyYUluZm8oKTsKLQkJfQkJCi0JCXJldHVybiBndWlkVG9QbHVnTmFtZU1hcDsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBtZXRob2RFbGVtZW50UHJvcGVydHkgbm9kZSBsaXN0Ci0gICAgICovCi0JcHJpdmF0ZSBOb2RlTGlzdCBnZXRNZXRob2RFbGVtZW50UHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGxpYlRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZShUQUdfbWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTU4MzMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgaW5wdXQgZGF0YSByZXF1aXJlZCB0byBleHBvcnQgYSBtZXRob2QgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0RGF0YSB7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHNlbGVjdGVkUGx1Z2lucyA9IG51bGw7Ci0KLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBudWxsOwotCi0JcHVibGljIEhhc2h0YWJsZSBhc3NvY2lhdGVkQ29uZmlnTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLy8gZG9uJ3QgbmVlZCBpdCBhZnRlciB0aGUgc2VydmljZSBjb2RlIGNoYW5nZXMKLQlwdWJsaWMgTGlzdCBhc3NvY2lhdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkV4cG9ydERhdGEoKSB7Ci0JCWxsRGF0YSA9IG5ldyBMaWJyYXJ5TG9jYXRpb25EYXRhKCk7Ci0JCWxsRGF0YS5sb2FkRnJvbVByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgcGx1Z2lucy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IGdldFNlbGVjdGVkUGx1Z2lucygpIHsKLQkJcmV0dXJuIHNlbGVjdGVkUGx1Z2luczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0IG9mIHNlbGVjdGVkIHBsdWdpbnMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRQbHVnaW5zKENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBzZWxlY3RlZFBsdWdpbnMpIHsKLQkJdGhpcy5zZWxlY3RlZFBsdWdpbnMgPSBzZWxlY3RlZFBsdWdpbnM7Ci0JfTsKLQotCS8qKgotCSAqIHZhbGlkYXRlIGF0dHJpYnV0ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGRzIGFzc29jaWF0ZWRDb25maWdNYXAuCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRBc3NvY2lhdGVkQ29uZmlnTWFwKCkgewotCQlpZiAoZ2V0U2VsZWN0ZWRQbHVnaW5zKCkgIT0gbnVsbCkgewotCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5jbGVhcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJYXNzb2NpYXRlZENvbmZpZ01hcC5wdXQoZWxlbWVudCwgTGlicmFyeVV0aWwKLQkJCQkJCS5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMoZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL1BsdWdpbkV4cG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGI5ZGJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvUGx1Z2luRXhwb3J0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBFeHBvcnRzIG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBhIHRhcmdldCBkaXJlY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNjIxNTMKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydFNlcnZpY2UgZXh0ZW5kcyBCYXNlRXhwb3J0U2VydmljZSB7Ci0KLQlQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5FeHBvcnRTZXJ2aWNlKFBsdWdpbkV4cG9ydERhdGEgZGF0YSkgewotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIFJ1biB0byBleHBvcnQgcGx1Z2lucwotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0cwKTsgCi0KLQkJQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMgPSBkYXRhLnNlbGVjdGVkUGx1Z2luczsKLQkJaWYgKHBsdWdpbnMgPT0gbnVsbCB8fCBwbHVnaW5zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzEpOyAKLQotCQkvLyBDcmVhdGUgdGhlIGxpYnJhcnkgZm9sZGVyIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgotCQlTdHJpbmcgZXhwb3J0TGliUGF0aCA9IChuZXcgRmlsZShkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSkpLmdldEFic29sdXRlUGF0aCgpOwotCQlGaWxlIGV4cG9ydExpYkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYlBhdGgpOwotCQlpZiAoIWV4cG9ydExpYkZvbGRlci5leGlzdHMoKSkgewotCQkJZXhwb3J0TGliRm9sZGVyLm1rZGlyKCk7Ci0JCX0KLQotCQltb25pdG9yLnNldFRhc2tOYW1lKEV4cG9ydFJlc291cmNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlX01TRzIpOyAKLQotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCVN0cmluZyBjdXJyTGliUGF0aCA9IGN1cnJMaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCUZpbGUgY3VyckxpYkZpbGUgPSBuZXcgRmlsZShjdXJyTGliUGF0aCk7Ci0JCQotCQkvLyBJdGVyYXRlIHRoZSBzZWxlY3RlZCBwbHVnLWlucyBhbmQgY29weSB0aGVpciBhc3NvY2lhdGVkIG1vZGVsIGZpbGVzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8vIFN0ZXAgMTogQ3JlYXRlIHRoZSBwbHVnLWluIGZvbGRlci4KLQkJCVVSSSB1cmkgPSBwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQotCQkJRmlsZSBwbHVnaW5Gb2xkZXIgPSAobmV3IEZpbGUocGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQotCQkJU3RyaW5nIHBsdWdpblBhdGggPSBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQlGaWxlIGV4cG9ydFBsdWdpbkZvbGRlciA9IG5ldyBGaWxlKGV4cG9ydExpYkZvbGRlciwgcGx1Z2luUGF0aCk7Ci0KLQkJCS8vIFN0ZXAgMjogQ29weSB0aGUgcGx1Zy1pbiBmaWxlcy4KLQkJCWNvcHlEaXIocGx1Z2luRm9sZGVyLCBleHBvcnRQbHVnaW5Gb2xkZXIpOwkJCQotCQl9Ci0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0czKTsgCi0KLQkJLy8gR2V0IHRoZSBzZWxlY3RlZCBwbHVnLWluIGFuZCBjb25maWd1cmF0aW9uIGlkcyBzbyB3ZSBjYW4gcmVtb3ZlIHRoZQotCQkvLyB1bm5lZWRlZCBzdHVmZi4KLQkJZ2V0U2VsZWN0ZWRJZHMoZGF0YS5zZWxlY3RlZFBsdWdpbnMsIGRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcCk7Ci0KLQkJLy8gU3RlcCAzOiBMb2FkIHRoZSBsaWJyYXJ5LnhtaSBhbmQgdGhlIHJlc21nci54bWksIHJlbW92ZSB0aGUgdW5uZWVkZWQKLQkJLy8gc3R1ZmYuCi0JCUZpbGUgbGliRm9sZGVyID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpOwotCQlMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQgPSBwcm9jZXNzTGlicmFyeUZpbGUoY3VyckxpYkZpbGUsIG5ldyBGaWxlKAotCQkJCWV4cG9ydExpYkZvbGRlciwgZXhwb3J0RmlsZSkpOwotCi0JCWlmICggZG9jdW1lbnQgIT0gbnVsbCApIHsKLQkJCS8vIGNvcHkgdGhlIGNvbmlmdXJhdGlvbiBmaWxlcwotCQkJLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJCWNvcHlDb25maWd1cmF0aW9uRmlsZXMoZG9jdW1lbnQsIGxpYkZvbGRlciwgZXhwb3J0TGliRm9sZGVyKTsKLQkJfQotCQkKLQkJbW9uaXRvci5zZXRUYXNrTmFtZShFeHBvcnRSZXNvdXJjZXMuUGx1Z2luRXhwb3J0U2VydmljZV9NU0c0KTsgCi0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGNvcHlDb25maWd1cmF0aW9uRmlsZXMoTGlicmFyeURvY3VtZW50IGRvY3VtZW50LCBGaWxlIGxpYkZvbGRlciwgRmlsZSBleHBvcnRMaWJGb2xkZXIpIHsKLQkJLy8gLy8gMTQyMzc5IC0gdXBkYXRlIHBsdWdpbiBpbXBvcnRpbmcgYW5kIGV4cG9ydGluZyB0byBtYXRjaCB3aXRoIHRoZSBuZXcgZmlsZSBmb3JtYXQKLQkJLy8gR2V0IHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGlkcy4KLQkJZm9yIChJdGVyYXRvciBpdGMgPSBkYXRhLmFzc29jaWF0ZWRDb25maWdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyB1cmkgPSBkb2N1bWVudC5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCQlGaWxlIHNyYyA9IG51bGw7Ci0JCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJCVVSSSByZXNVcmkgPSBjb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQkJdXJpID0gZG9jdW1lbnQuZGVjb2RlVXJpKHVyaSk7Ci0JCQkJCXNyYyA9IG5ldyBGaWxlKHJlc1VyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJfQkJCQkKLQkJCQlpZiAoIHVyaSAhPSBudWxsICkgewotCQkJCQkvL0ZpbGUgc3JjID0gbmV3IEZpbGUobGliRm9sZGVyLCB1cmkpOwotCQkJCQlpZiAoc3JjID09IG51bGwpIHsKLQkJCQkJCXNyYyA9IG5ldyBGaWxlKGxpYkZvbGRlciwgdXJpKTsKLQkJCQkJfQotCQkJCQlGaWxlIHRhcmdldCA9ICBuZXcgRmlsZShleHBvcnRMaWJGb2xkZXIsIHVyaSk7Ci0JCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgZGlyZWN0b3JpZXMgZnJvbSAiZnJvbURpciIgdG8gInRvRGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIpIHsKLQkJQ29weSBjcCA9IG5ldyBDb3B5KCk7Ci0JCWNwLnNldE92ZXJ3cml0ZSh0cnVlKTsKLQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQlzZXQuc2V0RXhjbHVkZXMoQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuZXhjbHVkZXMpOwotCQlzZXQuc2V0RGlyKGZyb21EaXIpOwotCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCWNwLnNldFRvZGlyKHRvRGlyKTsKLQkJY3Auc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJY3Auc2V0UHJlc2VydmVMYXN0TW9kaWZpZWQodHJ1ZSk7Ci0JCWNwLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U2VsZWN0ZWRJZHMoQ29sbGVjdGlvbjxNZXRob2RQbHVnaW4+IHBsdWdpbnMsIE1hcCBjb25maWdzTWFwKSB7Ci0JCXNlbGVjdGVkSWRzLmNsZWFyKCk7Ci0JCXNlbGVjdGVkUGx1Z2luTmFtZXMuY2xlYXIoKTsKLQotCQkvLyBHZXQgdGhlIHBsdWctaW4gaWRzIGFuZCBuYW1lcy4KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gcGx1Z2luLmdldEd1aWQoKTsKLQkJCXNlbGVjdGVkUGx1Z2luTmFtZXMuYWRkKHBsdWdpbi5nZXROYW1lKCkpOwotCQkJaWYgKCFzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCXNlbGVjdGVkSWRzLmFkZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCS8vIFNhdmUgdGhlIGxpYnJhcnkgZ3VpZCBzbyB0aGF0IHRoZSBlbnRyeSBpbiByZXNnci54bWkgd2lsbCBiZSBrZXB0LgotCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIHBsdWdpbi5lQ29udGFpbmVyKCk7Ci0JCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQlzZWxlY3RlZElkcy5hZGQobGliLmdldEd1aWQoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBHZXQgdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gaWRzLgotCQlmb3IgKEl0ZXJhdG9yIGl0YyA9IGNvbmZpZ3NNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRjLmhhc05leHQoKTspIHsKLQkJCUxpc3QgY29uZmlncyA9IChMaXN0KSBpdGMubmV4dCgpOwotCQkJaWYgKGNvbmZpZ3MgPT0gbnVsbCB8fCBjb25maWdzLnNpemUoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJCWlmIChzZWxlY3RlZElkcy5jb250YWlucyhndWlkKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBBZGQgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJc2VsZWN0ZWRJZHMuYWRkKGd1aWQpOwotCi0JCQkJLy8gRm9yIGVhY2ggY29uZmlndXJhdGlvbiwgc2F2ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIHBhY2thZ2UKLQkJCQkvLyBpZHMgc28gdGhhdCB0aGVpciBlbnRyaWVzIGluIHRoZSByZXNvdXJjZSBmaWxlIGNhbiBiZSBrZXB0LgotCQkJCUxpc3QgcmVmcyA9IGNvbmZpZy5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgbyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCWd1aWQgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKTsKLQkJCQkJCWlmICghc2VsZWN0ZWRJZHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQlzZWxlY3RlZElkcy5hZGQoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJVbmV4cGVjdGVkIGVsZW1lbnQgdHlwZSAnIiArICgoTWV0aG9kRWxlbWVudCkgbykuZ2V0VHlwZSgpLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyAiJyBpbiBjb25maWd1cmF0aW9uICciICsgY29uZmlnLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDRhYWE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gZXhwb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9EZXN0aW5hdGlvbkNvbW1vblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzOTU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRGVzdGluYXRpb25Db21tb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5TG9jYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgYW4KLSAqIGV4cG9ydCBvciBpbXBvcnQgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzdGluYXRpb25Db21tb25QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBDb21ibyBleHBvcnRQYXRoQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBMaWJyYXJ5TG9jYXRpb25EYXRhIGxsRGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlc3RpbmF0aW9uQ29tbW9uUGFnZShTdHJpbmcgcGFnZU5hbWUsIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2VfZGVzYyk7Ci0JCXRoaXMubGxEYXRhID0gbGxEYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9kaXIpOwotCQkKLQkJZXhwb3J0UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlLCAxKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkRlc3RpbmF0aW9uQ29tbW9uUGFnZV9sYWJlbF9icm93c2UpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCQkKLQotCQlpbml0Q29udHJvbHMoKTsKLQkJCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQljcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlleHBvcnRQYXRoQ29tYm8uc2V0RW5hYmxlZCh0cnVlKTsKLQkJYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsJCi0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuRm9jdXNJbiwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQkJZXhwb3J0UGF0aENvbWJvLmFkZExpc3RlbmVyKFNXVC5Gb2N1c091dCwgdGhpcyk7Ci0JCWV4cG9ydFBhdGhDb21iby5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJCi0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JfQotCQotCS8qKgotCSAqIEFkZHMgYWRkaXRpb25hbCBjb250cm9scyB0byB0aGlzIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBZGRpdGlvbmFsQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI3NldFZpc2libGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJRGlzcGxheSBkaXNwbGF5ID0gY29tcG9zaXRlLmdldERpc3BsYXkoKTsKLQkJCWlmICghKGRpc3BsYXkgPT0gbnVsbCB8fCBkaXNwbGF5LmlzRGlzcG9zZWQoKSkpIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWV4cG9ydFBhdGhDb21iby5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCVdpemFyZCB3aXphcmQgPSAoV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl3aXphcmQuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVUb0RhdGFNb2RlbCgpIHsKLQkJU3RyaW5nIGxpYk5hbWUgPSBleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpOwotCQlpZiAobGliTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmICghbGliTmFtZS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQlsaWJOYW1lID0gbGliTmFtZS5zdWJzdHJpbmcoCi0JCQkJCQlsaWJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGxpYk5hbWUKLQkJCQkJCQkJLmxlbmd0aCgpKTsKLQkJCX0gZWxzZQotCQkJCWxpYk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWxsRGF0YS5zZXRMaWJOYW1lKGxpYk5hbWUpOwotCQlsbERhdGEuc2V0UGFyZW50Rm9sZGVyKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCQkJZGQuc2V0RmlsdGVyUGF0aChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpKTsKLQotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChkZXN0aW5hdGlvbik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1c2UgdGhlIG9wZW5lZCBkaXJzIHRvIGluaXQgY29tYm8gbGlzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb21ib0l0ZW1zKCkgewotCQlyZXR1cm47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmZkZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0NoZWNraW5nUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbkNsb3N1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGEgY29uZmlndXJhdGlvbiBpbnRlZ3JpdHkgY2hlY2suCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBzdHlsZTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNsb3N1cmUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLmNoZWNrQ29uZmlnUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5jaGVja0NvbmZpZ1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRleHRWaWV3ZXIgPSBjcmVhdGVUZXh0Vmlld2VyKGNvbnRhaW5lciwgMzYwLCAxNjAsIDEpOwotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0Vmlld2VyLnNldERvY3VtZW50KGRvYyk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlTdW1tYXJ5KCkgewotCQlzdHlsZSA9IG5ldyBUZXh0UHJlc2VudGF0aW9uKCk7Ci0JCURvY3VtZW50IGRvYyA9IGdldFN1bW1hcnlUZXh0KCk7Ci0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQkJdGV4dFZpZXdlci5jaGFuZ2VUZXh0UHJlc2VudGF0aW9uKHN0eWxlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpc3BsYXlTdW1tYXJ5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGRvY3VtZW50IG9mIHN1bW1hcnkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0U3VtbWFyeVRleHQoKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciB0ZXh0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChkYXRhLnNlbGVjdGVkQ29uZmlncy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzIpOwotCQl9IGVsc2UgewotCQkJZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgZGF0YS5zZWxlY3RlZENvbmZpZ3MKLQkJCQkJLmdldCgwKTsKLQkJCWlmICgoY2xvc3VyZSA9PSBudWxsKSB8fCAoY2xvc3VyZS5nZXRDb25maWd1cmF0aW9uKCkgIT0gY29uZmlnKSkgewotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCQkJCQkJY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZShudWxsLCBjb25maWcpOwotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlX2NoZWNraW5nKTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgZXJyb3JzID0gY2xvc3VyZS5nZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMCkgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLkV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZV9zdW1tYXJ5XzMpOwotCQl9IGVsc2UgewotCQkJdGV4dEJ1Zi5hcHBlbmQoRXhwb3J0UmVzb3VyY2VzLmJpbmQoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRDb25maWdDaGVja2luZ1BhZ2Vfc3VtbWFyeV80LAotCQkJCQkobmV3IE9iamVjdFtdIHsgSW50ZWdlci50b1N0cmluZyhlcnJvcnMuc2l6ZSgpKSB9KSkpOwotCQl9Ci0KLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KHRleHRCdWYudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBkb2M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Nob29zZU1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2OGQ5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgdHlwZXMgb2YgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZSBleHBvcnRlZC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ0Nob29zZU1vZGUgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ0Nob29zZU1vZGUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIEJ1dHRvbiBvbmVDb25maWdCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjb25maWdTcGVjQnV0dG9uOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJb25lQ29uZmlnQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdMYWJlbF90ZXh0LCAxLCB0cnVlKTsKLQotCQljb25maWdTcGVjQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5zZWxlY3RFeHBvcnRUeXBlUGFnZV9jb25maWdTcGVjc0xhYmVsX3RleHQsIDEsCi0JCQkJZmFsc2UpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW9uZUNvbmZpZ0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJY29uZmlnU3BlY0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCWRhdGEuZXhwb3J0T25lQ29uZmlnID0gb25lQ29uZmlnQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlkYXRhLmV4cG9ydENvbmZpZ1NwZWNzID0gY29uZmlnU3BlY0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVEYXRhVG9Nb2RlbCgpOwotCQlpZiAoZGF0YS5leHBvcnRPbmVDb25maWcpIHsKLQkJCUV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLnNlbGVjdENvbmZpZ1BhZ2U7Ci0JCQlyZXR1cm4gcGFnZTsKLQkJfSBlbHNlIGlmIChkYXRhLmV4cG9ydENvbmZpZ1NwZWNzKSB7Ci0JCQlFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UgcGFnZSA9ICgoRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLnNlbGVjdFNwZWNzUGFnZTsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmRjYzQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgZm9yIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgb2YgYW4KLSAqIGV4cG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWdEZXN0aW5hdGlvblBhZ2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnRGVzdGluYXRpb25QYWdlKENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3REZXN0aW5hdGlvblBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25QYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBFeHBvcnRVSVByZWZlcmVuY2VzLmdldEV4cG9ydENvbmZpZ0RpcnMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0JCXN1cGVyLmluaXRDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIHdpemFyZCA9IChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKTsKLQkJaWYgKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkubGVuZ3RoKCkgPiAwCi0JCQkJJiYgIWV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJCXdpemFyZC5va1RvQ29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlMGNlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8KLSAqIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjdHJsX3RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1BhZ2VfZGVzYyk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vZXhwX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF90YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCAxMjAsIDEpOwotCQl0YWJsZSA9IGN0cmxfdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotLyoJCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsqLwotCQkKLQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RDb25maWd1cmF0aW9uPigKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCWlmIChjb25maWdMaXN0LnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxNZXRob2RDb25maWd1cmF0aW9uPiBzb3J0KGNvbmZpZ0xpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uW10gYSA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uW2NvbmZpZ0xpc3Quc2l6ZSgpXTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBjb25maWdMaXN0LnRvQXJyYXkoYSk7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCXJldHVybiAoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF90YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX3RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChjb25maWdzICE9IG51bGwpIHsKLQkJCWN0cmxfdGFibGVWaWV3ZXIuc2V0SW5wdXQoY29uZmlncyk7Ci0JCX0KLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsIEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhUKTsKLQotCQljdHJsX2JyaWVmRGVzYyA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMzYwLCA4MCwgMyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoY29uZmlncyAhPSBudWxsICYmIGNvbmZpZ3MubGVuZ3RoID4gMCkgewotCQkJdGFibGUuc2VsZWN0KDApOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF0pOwotCQl9Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF90YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBjb25maWdzID0gc2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCXNldERpc3BsYXlBdHRyaWJ1dGVzKChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdzWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChjb25maWcuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGF0YVRvTW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3RybF90YWJsZVZpZXdlcgotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3NbMF07Ci0JCUxpc3QgYXJyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXJyTGlzdC5hZGQoY29uZmlnKTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBhcnJMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydENvbmZpZ0NoZWNraW5nUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuY29uZmlnQ2hlY2tpbmdQYWdlOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0JCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN0cmxfdGFibGVWaWV3ZXIKLQkJCQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotICAgIAlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotICAgIAkJcmV0dXJuIGZhbHNlOwotICAgIAl9Ci0gICAgICAgIHJldHVybiBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWMwMjQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZAotICogY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB0byBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0Q29uZmlnU2VsZWN0U3BlY3NQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgTGlzdCBjaGVja2VkQ29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEgZGF0YTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZShDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5zZWxlY3RDb25maWdTcGVjc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihFeHBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnU3BlY3NQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9saWJfY29uZl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzUGFnZV9jb25maWdzTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoY29udGFpbmVyLCAxKTsKLQkJdGFibGUgPSBjdHJsX2Noa2JveFRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0KLS8qCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ki8KLQkJCi0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlnTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQlpZiAoY29uZmlnTGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJCS5nZXRDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48TWV0aG9kQ29uZmlndXJhdGlvbj4gc29ydChjb25maWdMaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIGEgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbltjb25maWdMaXN0LnNpemUoKV07Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gY29uZmlnTGlzdC50b0FycmF5KGEpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU47Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlpZiAoY29uZmlncyAhPSBudWxsKSB7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KGNvbmZpZ3MpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChjb25maWdzICE9IG51bGwgJiYgY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRDaGVja1N0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXIjY2hlY2tTdGF0ZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IG9iaiA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAoZXZlbnQuZ2V0Q2hlY2tlZCgpKSB7Ci0JCQljaGVja2VkQ291bnQrKzsKLQkJCWNoZWNrZWRDb25maWdMaXN0LmFkZChvYmopOwotCQl9IGVsc2UgewotCQkJY2hlY2tlZENvdW50LS07Ci0JCQljaGVja2VkQ29uZmlnTGlzdC5yZW1vdmUob2JqKTsKLQkJfQotCi0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICghc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyI2hhbmRsZUV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQljdHJsX2JyaWVmRGVzYy5zZXRUZXh0KGNvbmZpZy5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNoZWNrZWRDb3VudCA+IDA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQlkYXRhLnNlbGVjdGVkQ29uZmlncyA9IGNoZWNrZWRDb25maWdMaXN0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZSBwYWdlID0gKChFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkuZGVzdGluYXRpb25QYWdlOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMyNmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvblNwZWNzRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZSBtb2RlUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdTZWxlY3RTcGVjc1BhZ2Ugc2VsZWN0U3BlY3NQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ1NlbGVjdENvbmZpZ1BhZ2Ugc2VsZWN0Q29uZmlnUGFnZTsKLQotCXByb3RlY3RlZCBFeHBvcnRDb25maWdDaGVja2luZ1BhZ2UgY29uZmlnQ2hlY2tpbmdQYWdlOwotCi0JcHJvdGVjdGVkIEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZSBkZXN0aW5hdGlvblBhZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBva1RvQ29tcGxldGUgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uRXhwb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgZmFsc2UsIG51bGwsIG51bGwsCi0JCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJbW9kZVBhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnQ2hvb3NlTW9kZShkYXRhKTsKLQkJYWRkUGFnZShtb2RlUGFnZSk7Ci0KLQkJc2VsZWN0U3BlY3NQYWdlID0gbmV3IEV4cG9ydENvbmZpZ1NlbGVjdFNwZWNzUGFnZShkYXRhKTsKLQkJYWRkUGFnZShzZWxlY3RTcGVjc1BhZ2UpOwotCi0JCXNlbGVjdENvbmZpZ1BhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnU2VsZWN0Q29uZmlnUGFnZShkYXRhKTsKLQkJYWRkUGFnZShzZWxlY3RDb25maWdQYWdlKTsKLQotCQljb25maWdDaGVja2luZ1BhZ2UgPSBuZXcgRXhwb3J0Q29uZmlnQ2hlY2tpbmdQYWdlKGRhdGEpOwotCQlhZGRQYWdlKGNvbmZpZ0NoZWNraW5nUGFnZSk7Ci0KLQkJZGVzdGluYXRpb25QYWdlID0gbmV3IEV4cG9ydENvbmZpZ0Rlc3RpbmF0aW9uUGFnZShkYXRhKTsKLQkJYWRkUGFnZShkZXN0aW5hdGlvblBhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT04pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCS8vIENhbm5vdCBjb21wbGV0ZSB0aGUgd2l6YXJkIGlmIGl0J3Mgbm90IHRoZSBsYXN0IHBhZ2UuCi0JCWlmICh0aGlzLmdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gZGVzdGluYXRpb25QYWdlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2tUb0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJaWYgKCFjaGVja0FuZENyZWF0ZURpcihleHBvcnRMaWJQYXRoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCQlFeHBvcnRSZXNvdXJjZXMuZXhwb3J0Q29uZmlnRXJyb3JEaWFsb2dfdGl0bGUsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQlpZiAoZGF0YS52YWxpZGF0ZSgpKSB7Ci0JCQkJCQlpZiAoZGF0YS5leHBvcnRDb25maWdTcGVjcykgewotCQkJCQkJCS8vIEV4cG9ydCBjb25maWd1cmF0aW9uIHNwZWNzIG9ubHkuCi0JCQkJCQkJKG5ldyBDb25maWd1cmF0aW9uU3BlY3NFeHBvcnRTZXJ2aWNlKGRhdGEpKQotCQkJCQkJCQkJLnJ1bihtb25pdG9yKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gRXhwb3J0IGEgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCQkJCQkJCShuZXcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZGF0YS5lcnJvck1zZyAhPSBudWxsICYmIGRhdGEuZXJyb3JNc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlFeHBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJRXhwb3J0UmVzb3VyY2VzLmV4cG9ydENvbmZpZ0Vycm9yRGlhbG9nX3RpdGxlLAotCQkJCQlkYXRhLmVycm9yTXNnKTsKLQkJfQotCi0JCS8vIFNhdmUgdGhlIGV4cG9ydCBwYXRoIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCUV4cG9ydFVJUHJlZmVyZW5jZXMuYWRkRXhwb3J0Q29uZmlnRGlyKGV4cG9ydExpYlBhdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyKSB7Ci0JCXJldHVybiBEaXJlY3RvcnlWYWxpZGF0b3IuY2hlY2tBbmRDcmVhdGVEaXIoZGlyLAotCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRDb25maWdFcnJvckRpYWxvZ190aXRsZSwKLQkJCQlFeHBvcnRSZXNvdXJjZXMuRXhwb3J0UGx1Z2luRXJyb3JfbXNnLCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI3YzQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW5zIHRoYXQKLSAqIHdpbGwgYmUgZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQotCXByaXZhdGUgVGV4dFByZXNlbnRhdGlvbiBzdHlsZTsKLQotCXByaXZhdGUgUGx1Z2luRXhwb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQl0ZXh0Vmlld2VyID0gY3JlYXRlVGV4dFZpZXdlcihjb250YWluZXIsIDM2MCwgMTYwLCAxKTsKLQkJRG9jdW1lbnQgZG9jID0gbmV3IERvY3VtZW50KCIiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRleHRWaWV3ZXIuc2V0RG9jdW1lbnQoZG9jKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzcGxheVN1bW1hcnkoKSB7Ci0JCXN0eWxlID0gbmV3IFRleHRQcmVzZW50YXRpb24oKTsKLQkJRG9jdW1lbnQgZG9jID0gZ2V0U3VtbWFyeVRleHQoKTsKLQkJdGV4dFZpZXdlci5zZXREb2N1bWVudChkb2MpOwotCQl0ZXh0Vmlld2VyLmNoYW5nZVRleHRQcmVzZW50YXRpb24oc3R5bGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJZGlzcGxheVN1bW1hcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZG9jdW1lbnQgb2YgdGhlIHN1bW1hcnkgdGV4dC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0U3VtbWFyeVRleHQoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0QnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWlmIChkYXRhLnNlbGVjdGVkUGx1Z2lucyA9PSBudWxsIHx8IGRhdGEuc2VsZWN0ZWRQbHVnaW5zLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgRG9jdW1lbnQoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5TdW1tYXJ5UGFnZV9ub1BsdWdpbl90ZXh0KTsKLQotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luIDogZGF0YS5zZWxlY3RlZFBsdWdpbnMpIHsKLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IHBsdWdpbi5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEKSk7Ci0JCQl0ZXh0QnVmLmFwcGVuZChwbHVnaW4uZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gQXV0aG9yaW5nVUlUZXh0LkFVVEhPUlNfVEVYVC5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikuYXBwZW5kKEF1dGhvcmluZ1VJVGV4dC5BVVRIT1JTX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmLmFwcGVuZCgiXHRcdCIpLmFwcGVuZChwbHVnaW4uZ2V0QXV0aG9ycygpKS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LlZFUlNJT05fVEVYVCkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRleHRCdWYuYXBwZW5kKCJcdFx0IikuYXBwZW5kKHBsdWdpbi5nZXRWZXJzaW9uKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXN0YXJ0ID0gdGV4dEJ1Zi5sZW5ndGgoKTsKLQkJCW9mZnNldCA9IEF1dGhvcmluZ1VJVGV4dC5CUklFRl9ERVNDUklQVElPTl9URVhULmxlbmd0aCgpOwotCQkJc3R5bGUuYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgb2Zmc2V0LCBudWxsLCBudWxsLAotCQkJCQlTV1QuQk9MRCB8IFNXVC5JVEFMSUMpKTsKLQkJCXRleHRCdWYKLQkJCQkJLmFwcGVuZCgiXHQiKS5hcHBlbmQoQXV0aG9yaW5nVUlUZXh0LkJSSUVGX0RFU0NSSVBUSU9OX1RFWFQpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0XHQiKS5hcHBlbmQocGx1Z2luLmdldEJyaWVmRGVzY3JpcHRpb24oKSkuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc3RhcnQgPSB0ZXh0QnVmLmxlbmd0aCgpOwotCQkJb2Zmc2V0ID0gRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2RlcGVuZGVudFBsdWdpbnNMYWJlbF90ZXh0Ci0JCQkJCS5sZW5ndGgoKTsgCi0JCQlzdHlsZS5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCBvZmZzZXQsIG51bGwsIG51bGwsCi0JCQkJCVNXVC5CT0xEIHwgU1dULklUQUxJQykpOwotCQkJdGV4dEJ1ZgotCQkJCQkuYXBwZW5kKCJcdCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgKLQkJCQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfZGVwZW5kZW50UGx1Z2luc0xhYmVsX3RleHQpCi0JCQkJCS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3QgZGVwZW5kZW50UGx1Z2luTGlzdCA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQkJYm9vbGVhbiBhZGRMaW5lZmVlZCA9IHRydWU7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXBlbmRlbnRQbHVnaW5MaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYWRkTGluZWZlZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChhZGRMaW5lZmVlZCkKLQkJCQl0ZXh0QnVmLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlzdGFydCA9IHRleHRCdWYubGVuZ3RoKCk7Ci0JCQlvZmZzZXQgPSBFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfYXNzb2NpYXRlZENvbmZpZ3NMYWJlbF90ZXh0Ci0JCQkJCS5sZW5ndGgoKTsKLQkJCXN0eWxlLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIG9mZnNldCwgbnVsbCwgbnVsbCwKLQkJCQkJU1dULkJPTEQgfCBTV1QuSVRBTElDKSk7Ci0JCQl0ZXh0QnVmCi0JCQkJCS5hcHBlbmQoIlx0IikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKAotCQkJCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQpCi0JCQkJCS5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCUxpc3QgYXNzb2NpYXRlZENvbmZpZ0xpc3QgPSAoTGlzdCkgZGF0YS5hc3NvY2lhdGVkQ29uZmlnTWFwCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFzc29jaWF0ZWRDb25maWdMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGVsZW1lbnQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJdGV4dEJ1Zi5hcHBlbmQoIlx0XHQiKS5hcHBlbmQoZWxlbWVudC5nZXROYW1lKCkpLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXRleHRCdWYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQodGV4dEJ1Zi50b1N0cmluZygpKTsKLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRQbHVnaW5XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5OTBiYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvRXhwb3J0UGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5EaXJlY3RvcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IE1ldGhvZCBQbHVnLWluIHdpemFyZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0UGx1Z2luV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSUltcG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0UGx1Z2luUGFnZSBwYWdlMTsKLQotCXByb3RlY3RlZCBQbHVnaW5JbmZvUGFnZSBwYWdlMjsKLQotCXByb3RlY3RlZCBFeHBvcnRQbHVnaW5TdW1tYXJ5UGFnZSBwYWdlMzsKLQotCXByb3RlY3RlZCBTYXZlUGx1Z2luUGFnZSBwYWdlNDsKLQotCXByb3RlY3RlZCBib29sZWFuIG9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFBsdWdpbkV4cG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5FeHBvcnREYXRhKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFeHBvcnRQbHVnaW5XaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKEV4cG9ydFJlc291cmNlcy5leHBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgZmFsc2UsIG51bGwsIG51bGwsCi0JCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vRXhwb3J0TWV0aG9kUGx1Z2lucy5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwYWdlMSA9IG5ldyBTZWxlY3RQbHVnaW5QYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQotCQlwYWdlMiA9IG5ldyBQbHVnaW5JbmZvUGFnZShkYXRhKTsKLQkJYWRkUGFnZShwYWdlMik7Ci0KLQkJcGFnZTMgPSBuZXcgRXhwb3J0UGx1Z2luU3VtbWFyeVBhZ2UoZGF0YSk7Ci0JCWFkZFBhZ2UocGFnZTMpOwotCi0JCXBhZ2U0ID0gbmV3IFNhdmVQbHVnaW5QYWdlKGRhdGEpOwotCQlhZGRQYWdlKHBhZ2U0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlpZiAodGhpcy5nZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IHBhZ2U0KQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2tUb0NvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU3RyaW5nIGV4cG9ydExpYlBhdGggPSBkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKTsKLQkJaWYgKGNoZWNrQW5kQ3JlYXRlRGlyKGV4cG9ydExpYlBhdGgpID09IGZhbHNlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfTVNHMSwKLQkJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQkJCWlmIChkYXRhLnZhbGlkYXRlKCkpIHsKLQkJCQkJCShuZXcgUGx1Z2luRXhwb3J0U2VydmljZShkYXRhKSkucnVuKG1vbml0b3IpOwotCQkJCQl9Ci0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfZXJyb3IsCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFNhdmUgdGhlIGV4cG9ydCBwYXRoIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCUV4cG9ydFVJUHJlZmVyZW5jZXMuYWRkRXhwb3J0UGx1Z2luRGlyKGV4cG9ydExpYlBhdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyKSB7Ci0JCXJldHVybiBEaXJlY3RvcnlWYWxpZGF0b3IuY2hlY2tBbmRDcmVhdGVEaXIoZGlyLAotCQkJCUV4cG9ydFJlc291cmNlcy5FeHBvcnRQbHVnaW5XaXphcmRfdGl0bGUsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLkV4cG9ydFBsdWdpbkVycm9yX21zZywgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9FeHBvcnRVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OThlZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL0V4cG9ydFVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBFeHBvcnQgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXhwb3J0VUlQcmVmZXJlbmNlcyB7Ci0KLQkvLyBUaGUgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9QTFVHSU5fRElSUyA9ICJleHBvcnRQbHVnaW5EaXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBPUlRfQ09ORklHX0RJUlMgPSAiZXhwb3J0Q29uZmlnRGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yeSBuYW1lLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYUE9SVF9QTFVHSU5fRElSX05BTUUgPSAiRXhwb3J0IiArIEZpbGVVdGlsLkZJTEVfU0VQICsgIlBsdWdpbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IG5hbWUuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhQT1JUX0NPTkZJR19ESVJfTkFNRSA9ICJFeHBvcnQiICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiQ29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJIAotCi0JLy8gVGhlIGRlZmF1bHQgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3J5LgotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0RXhwb3J0UGx1Z2luRGlyID0gbnVsbDsKLQotCS8vIFRoZSBkZWZhdWx0IGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEV4cG9ydENvbmZpZ0RpciA9IG51bGw7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHN0b3JlLgotCXByaXZhdGUgc3RhdGljIElQcmVmZXJlbmNlU3RvcmUgcHJlZlN0b3JlID0gRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0Jc3RhdGljIHsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoRVhQT1JUX1BMVUdJTl9ESVJTLCBnZXREZWZhdWx0RXhwb3J0UGx1Z2luRGlyKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChFWFBPUlRfQ09ORklHX0RJUlMsIGdldERlZmF1bHRFeHBvcnRDb25maWdEaXIoKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RXhwb3J0UGx1Z2luRGlyKCkgewotCQlpZiAoZGVmYXVsdEV4cG9ydFBsdWdpbkRpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0RXhwb3J0UGx1Z2luRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRFeHBvcnRQbHVnaW5EaXIgPSBkZWZhdWx0RXhwb3J0UGx1Z2luRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfRVhQT1JUX1BMVUdJTl9ESVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdEV4cG9ydFBsdWdpbkRpciA9IGRlZmF1bHRFeHBvcnRQbHVnaW5EaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBERUZBVUxUX0VYUE9SVF9QTFVHSU5fRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRFeHBvcnRQbHVnaW5EaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFeHBvcnRQbHVnaW5EaXJzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgRVhQT1JUX1BMVUdJTl9ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGV4cG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0RXhwb3J0UGx1Z2luRGlyc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgRVhQT1JUX1BMVUdJTl9ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgZXhwb3J0IGRpcmVjdG9yeSB0byB0aGUgZXhwb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBhbiBleHBvcnQgZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEV4cG9ydFBsdWdpbkRpcihTdHJpbmcgZGlyKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIEVYUE9SVF9QTFVHSU5fRElSUywgZGlyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRFeHBvcnRDb25maWdEaXIoKSB7Ci0JCWlmIChkZWZhdWx0RXhwb3J0Q29uZmlnRGlyID09IG51bGwpIHsKLQkJCWRlZmF1bHRFeHBvcnRDb25maWdEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwTmFtZSA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldEFwcGxpY2F0aW9uU2hvcnROYW1lKCk7Ci0JCQlpZiAoYXBwTmFtZSAhPSBudWxsICYmIGFwcE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVmYXVsdEV4cG9ydENvbmZpZ0RpciA9IGRlZmF1bHRFeHBvcnRDb25maWdEaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBhcHBOYW1lICsgRmlsZVV0aWwuRklMRV9TRVAKLQkJCQkJCSsgREVGQVVMVF9FWFBPUlRfQ09ORklHX0RJUl9OQU1FOwotCQkJfSBlbHNlIHsKLQkJCQlkZWZhdWx0RXhwb3J0Q29uZmlnRGlyID0gZGVmYXVsdEV4cG9ydENvbmZpZ0RpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIERFRkFVTFRfRVhQT1JUX0NPTkZJR19ESVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdEV4cG9ydENvbmZpZ0RpcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEV4cG9ydENvbmZpZ0RpcnMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBFWFBPUlRfQ09ORklHX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4cG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZXhwb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRFeHBvcnRDb25maWdEaXJzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBFWFBPUlRfQ09ORklHX0RJUlMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBleHBvcnQgZGlyZWN0b3J5IHRvIHRoZSBleHBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcwotCSAqIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgYW4gZXhwb3J0IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHBvcnRDb25maWdEaXIoU3RyaW5nIGRpcikgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBFWFBPUlRfQ09ORklHX0RJUlMsIGRpcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvUGx1Z2luSW5mb1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9QbHVnaW5JbmZvUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGViMzY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9QbHVnaW5JbmZvUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLkNvbmZpZ3VyYXRpb25UYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5FeHBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJldmlldyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBtZXRob2QKLSAqIHBsdWctaW5zIHRoYXQgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBleHBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkluZm9QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgaW1wbGVtZW50cwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBQbHVnaW5JbmZvUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjdHJsX3RhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBjdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXI7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlcjsKLQotCXByaXZhdGUgTGlzdCBkZXBlbmRlbnRQbHVnaW5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBMaXN0IGFzc29jaWF0ZWRDb25maWdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5JbmZvUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnJldmlld1BsdWdpbnNQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlFeHBvcnRSZXNvdXJjZXMucmV2aWV3UGx1Z2luc1BhZ2VfcGx1Z2luc0xhYmVsX3RleHQpOwotCi0JCWN0cmxfdGFibGVWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcihjb250YWluZXIsIDM2MCwgNjAsIDEpOwotCQl0YWJsZSA9IGN0cmxfdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVVJSW1hZ2VzLklNR19NRVRIT0RfUExVR0lOOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJY3RybF90YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX3RhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwpIHsKLQkJCWN0cmxfdGFibGVWaWV3ZXIuc2V0SW5wdXQoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS50b0FycmF5KCkpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9kZXBlbmRlbnRQbHVnaW5zTGFiZWxfdGV4dCk7Ci0KLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIoY29udGFpbmVyLCAzNjAsIDYwLCAxKTsKLQkJY3RybF9kZXBlbmRQbHVnaW5zVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCWN0cmxfZGVwZW5kUGx1Z2luc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0SW5wdXQoZGVwZW5kZW50UGx1Z2luTGlzdCk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUV4cG9ydFJlc291cmNlcy5yZXZpZXdQbHVnaW5zUGFnZV9hc3NvY2lhdGVkQ29uZmlnc0xhYmVsX3RleHQpOwotCi0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKGNvbnRhaW5lciwgMzYwLCA2MCwgMSk7Ci0JCWN0cmxfYXNzb2NpYXRlZENvbmZpZ1ZpZXdlcgotCQkJCS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIKLQkJCQkuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY3RybF9hc3NvY2lhdGVkQ29uZmlnVmlld2VyLnNldElucHV0KGFzc29jaWF0ZWRDb25maWdMaXN0KTsKLQotCQlpZiAoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsCi0JCQkJJiYgIWRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXNFbXB0eSgpKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlkaXNwbGF5UmVsYXRlZEluZm8oZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJY3RybF90YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBwbHVnaW4gPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZGlzcGxheVJlbGF0ZWRJbmZvKChNZXRob2RQbHVnaW4pIHBsdWdpblswXSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAoZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKSAhPSBudWxsCi0JCQkJJiYgIWRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkuaXNFbXB0eSgpKSB7Ci0JCQljdHJsX3RhYmxlVmlld2VyLnNldElucHV0KGRhdGEuZ2V0U2VsZWN0ZWRQbHVnaW5zKCkudG9BcnJheSgpKTsKLQkJCXRhYmxlLnNlbGVjdCgwKTsKLQkJCWRpc3BsYXlSZWxhdGVkSW5mbyhkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5UmVsYXRlZEluZm8oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAocGx1Z2luID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZGVwZW5kZW50UGx1Z2luTGlzdCA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQljdHJsX2RlcGVuZFBsdWdpbnNWaWV3ZXIuc2V0SW5wdXQoZGVwZW5kZW50UGx1Z2luTGlzdC50b0FycmF5KCkpOwotCQlhc3NvY2lhdGVkQ29uZmlnTGlzdCA9IExpYnJhcnlVdGlsLmdldEFzc29jaWF0ZWRDb25maWd1cmF0aW9ucyhwbHVnaW4pOwotCQljdHJsX2Fzc29jaWF0ZWRDb25maWdWaWV3ZXIuc2V0SW5wdXQoYXNzb2NpYXRlZENvbmZpZ0xpc3QudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQkvLyBGSVhNRSEgUmVmYWN0b3IgdG8gdXNlOiBkYXRhLmJ1aWxkQXNzb2NpYXRlZENvbmZpZ01hcCgpCi0JCWlmIChkYXRhLmdldFNlbGVjdGVkUGx1Z2lucygpICE9IG51bGwpIHsKLQkJCWRhdGEuYXNzb2NpYXRlZENvbmZpZ01hcC5jbGVhcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGF0YS5nZXRTZWxlY3RlZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQlkYXRhLmFzc29jaWF0ZWRDb25maWdNYXAucHV0KGVsZW1lbnQsIExpYnJhcnlVdGlsCi0JCQkJCQkuZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKGVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJc2F2ZURhdGFUb01vZGVsKCk7Ci0JCUV4cG9ydFBsdWdpblN1bW1hcnlQYWdlIHBhZ2UgPSAoKEV4cG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCkpLnBhZ2UzOwotCQlwYWdlLm9uRW50ZXJQYWdlKG51bGwpOwotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TYXZlUGx1Z2luUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWI5YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL1NhdmVQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LkV4cG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IGluZm9ybXMgdGhlIHVzZXIgdGhhdCBjaGFuZ2VzIHRvIHRoZSBleGlzdGluZyBtZXRob2QKLSAqIHBsdWctaW5zIHdpbGwgYmUgc2F2ZWQgcHJpb3IgdG8gYW4gZXhwb3J0IG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVBsdWdpblBhZ2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2F2ZVBsdWdpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2F2ZVBsdWdpblBhZ2UoUGx1Z2luRXhwb3J0RGF0YSBkYXRhKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSwgZGF0YS5sbERhdGEpOwotCQlzZXRUaXRsZShFeHBvcnRSZXNvdXJjZXMuc3BlY2lmeVBhdGhQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNwZWNpZnlQYXRoUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEV4cG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9leHBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gRXhwb3J0VUlQcmVmZXJlbmNlcy5nZXRFeHBvcnRQbHVnaW5EaXJzKCk7Ci0JCWlmIChleHBvcnREaXJzICE9IG51bGwgJiYgZXhwb3J0RGlycy5sZW5ndGggPiAwKSB7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChleHBvcnREaXJzWzBdKTsKLQkJfQotCQlzdXBlci5pbml0Q29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJRXhwb3J0UGx1Z2luV2l6YXJkIHdpemFyZCA9IChFeHBvcnRQbHVnaW5XaXphcmQpIGdldFdpemFyZCgpOwotCQlpZiAoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiAhZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJd2l6YXJkLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQl3aXphcmQub2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvZXhwb3J0L3dpemFyZHMvU2VsZWN0UGx1Z2luUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWU4MGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9TZWxlY3RQbHVnaW5QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuRXhwb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuUGx1Z2luRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIG1ldGhvZCBwbHVnLWlucyB0byBiZQotICogZXhwb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFBsdWdpblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIsIElDaGVja1N0YXRlTGlzdGVuZXIsIExpc3RlbmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFBsdWdpblBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfdmVyc2lvbjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzYzsKLQotCXByaXZhdGUgaW50IGNoZWNrZWRDb3VudCA9IDA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBjaGVja2VkUGx1Z2luTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JcHJpdmF0ZSBQbHVnaW5FeHBvcnREYXRhIGRhdGE7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gc2VsZWN0QWxsQnV0dG9uOwotCQotCXByaXZhdGUgQnV0dG9uIGRlc2VsZWN0QWxsQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UGx1Z2luUGFnZShQbHVnaW5FeHBvcnREYXRhIGRhdGEpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoRXhwb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oRXhwb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoRXhwb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2V4cF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyMSA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWNvbnRhaW5lcjEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lcjEsCi0JCQkJRXhwb3J0UmVzb3VyY2VzLnNlbGVjdFBsdWdpbnNQYWdlX3BsdWdpbnNMYWJlbF90ZXh0KTsKLQotCQlzZWxlY3RBbGxCdXR0b24gPSBjcmVhdGVCdXR0b24oCi0JCQkJY29udGFpbmVyMSwKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5BdXRob3JpbmdVSVBsdWdpbl9TYXZlQWxsRWRpdG9yc1BhZ2VfU2VsZWN0QWxsQnV0dG9uTGFiZWwpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbigKLQkJCQljb250YWluZXIxLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLkF1dGhvcmluZ1VJUGx1Z2luX1NhdmVBbGxFZGl0b3JzUGFnZV9EZXNlbGVjdEFsbEJ1dHRvbkxhYmVsKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcihjb250YWluZXIsIDEpOwotCQl0YWJsZSA9IGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbmV3IEFycmF5TGlzdChsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQotCQlpZiAocGx1Z2lucy5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxNZXRob2RQbHVnaW4+c29ydChwbHVnaW5zLCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmIChwbHVnaW5zICE9IG51bGwpIHsKLQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQocGx1Z2lucy50b0FycmF5KCkpOwotCQl9Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQVVUSE9SU19URVhUKTsKLQkJY3RybF9hdXRob3IgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDM2MCwgNDAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuVkVSU0lPTl9URVhUKTsKLQkJY3RybF92ZXJzaW9uID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAzNjAsIDMpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBBdXRob3JpbmdVSVRleHQuQlJJRUZfREVTQ1JJUFRJT05fVEVYVCk7Ci0JCWN0cmxfYnJpZWZEZXNjID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAzNjAsIDgwLCAzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChwbHVnaW5zICE9IG51bGwgJiYgIXBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoTWV0aG9kUGx1Z2luKSBwbHVnaW5zLmdldCgwKSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMocGx1Z2lucyk7Ci0KLQkJc2V0Q29udHJvbChjb250YWluZXIpOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoZmluYWwgTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbnMpIHsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkKLQkJZmluYWwgTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7Ci0JCQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZEFsbChwbHVnaW5zKTsKLQkJCQkJY2hlY2tlZENvdW50ID0gY2hlY2tlZFBsdWdpbkxpc3Quc2l6ZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCi0JCWRlc2VsZWN0QWxsQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQoZmFsc2UpOwotCQkJCWlmIChsaWIgIT0gbnVsbCkgewotCQkJCQljaGVja2VkUGx1Z2luTGlzdC5jbGVhcigpOwotCQkJCQljaGVja2VkQ291bnQgPSAwOwotCQkJCX0KLQkJCQkKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvYmogPSBldmVudC5nZXRFbGVtZW50KCk7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCWNoZWNrZWRDb3VudCsrOwotCQkJCWNoZWNrZWRQbHVnaW5MaXN0LmFkZCgoTWV0aG9kUGx1Z2luKW9iaik7Ci0JCQl9IGVsc2UgewotCQkJCWNoZWNrZWRDb3VudC0tOwotCQkJCWNoZWNrZWRQbHVnaW5MaXN0LnJlbW92ZShvYmopOwotCQkJfQotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudAotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBwbHVnaW4gPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKE1ldGhvZFBsdWdpbikgcGx1Z2luWzBdKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzcGxheUF0dHJpYnV0ZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQljdHJsX2F1dGhvci5zZXRUZXh0KHBsdWdpbi5nZXRBdXRob3JzKCkpOwotCQljdHJsX3ZlcnNpb24uc2V0VGV4dChwbHVnaW4uZ2V0VmVyc2lvbigpKTsKLQkJY3RybF9icmllZkRlc2Muc2V0VGV4dChwbHVnaW4uZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGNoZWNrZWRDb3VudCA+IDA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZURhdGFUb01vZGVsKCkgewotCQlkYXRhLnNldFNlbGVjdGVkUGx1Z2lucyhjaGVja2VkUGx1Z2luTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlRGF0YVRvTW9kZWwoKTsKLQkJUGx1Z2luSW5mb1BhZ2UgcGFnZSA9ICgoRXhwb3J0UGx1Z2luV2l6YXJkKSBnZXRXaXphcmQoKSkucGFnZTI7Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9leHBvcnQvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNzY3OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2V4cG9ydC93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGV4cG9ydGluZyBtZXRob2QgcGx1Zy1pbnMgYW5kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzZkYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4ZGZlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5Eb2NQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aSwKLSBvcmcuZWNsaXBzZS5oZWxwCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUNsYXNzUGF0aDogZG9jLmphcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYWNjZXNzaWJpbGl0eS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYWNjZXNzaWJpbGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZTA2YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2FjY2Vzc2liaWxpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJBY2Nlc3NpYmlsaXR5IiBsaW5rX3RvPSJtYWluLnhtbCNhY2Nlc3NpYmlsaXR5X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSBvdmVydmlldyIgaHJlZj0iaHRtbC90b3BpY3MvY19hY2Nlc3NpYmlsaXR5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU2V0dGluZyBhY2Nlc3NpYmlsaXR5IHByZWZlcmVuY2VzIiBocmVmPSJodG1sL3RvcGljcy90X2FjY2Vzc2liaWxpdHlfcHJlZmVyZW5jZXMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTZWxlY3RpbmcgYW4gYWx0ZXJuYXRlIGJyb3dzZXIiIGhyZWY9Imh0bWwvdG9waWNzL3RfYWNjZXNzaWJpbGl0eV9zZXRfYnJvd3Nlci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IktleWJvYXJkIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3JfYWNjZXNzaWJpbGl0eV9uYXZpZ2F0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRm9udHMgYW5kIGNvbG9ycyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9hY2Nlc3NpYmlsaXR5X2ZvbnRzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwMGZhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLXNvdXJjZS5kb2MuamFyID0gc3JjLwotb3V0cHV0LmRvYy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGRvYy5qYXIsXAotICAgICAgICAgICAgICAgZG9jLnppcCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhY2Nlc3NpYmlsaXR5LnhtbCxcCi0gICAgICAgICAgICAgICBjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIGNvbnRleHRzX2F1dGhvcmluZ191aS54bWwsXAotICAgICAgICAgICAgICAgY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnQueG1sLFwKLSAgICAgICAgICAgICAgIGNyZWF0aW5nX3Byb2Nlc3Nlcy54bWwsXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkLnhtbCxcCi0gICAgICAgICAgICAgICBnbG9zc2FyeS54bWwsXAotICAgICAgICAgICAgICAgbWFpbi54bWwsXAotICAgICAgICAgICAgICAgb3ZlcnZpZXcueG1sLFwKLSAgICAgICAgICAgICAgIHB1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbCxcCi0gICAgICAgICAgICAgICB0dXRvcmlhbHMueG1sLFwKLSAgICAgICAgICAgICAgIHZlcnNpb25fY29udHJvbC54bWwsXAotICAgICAgICAgICAgICAgY2hlYXRzaGVldHMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemVtZXRoY29udC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1MjY5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2F0ZWdvcml6ZW1ldGhjb250LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ2F0ZWdvcml6ZSBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjY2F0ZWdvcml6ZW1ldGhvZGNvbnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjdlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NhdGVnb3JpemluZ19tZXRob2RfY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNhdGVnb3JpemluZyBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50X2lkIj4gIAotICA8dG9waWMgbGFiZWw9IlN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC90b3BpY3MvY19tZXRob2RfY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgdmlldyB3aXRoIGN1c3RvbSBjYXRlZ29yaWVzIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5ODdlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbWV0aG9kcmVmX29yX2h5cGVybGluay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFkZCBhIE1ldGhvZCBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIChVUkwpIj4KLQk8aW50cm8gCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHJlZmVyZW5jZXMgb3IgaHlwZXJsaW5rcyB0byBvdGhlciBjb250ZW50IHdpdGhpbiB5b3VyIGNvbnRlbnQgdGV4dDogcmVmZXJlbmNlcyAgdG8gb3RoZXIgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgdGV4dCBvdXRzaWRlIHRoZSBtZXRob2QgbGlicmFyeSB3aXRoIGEgVVJMLiBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIGNyZWF0aW5nIGJvdGggdHlwZXMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNyZWF0ZSBhIEh5cGVybGluayB0byBhbm90aGVyIGVsZW1lbnQgaW4gdGhlIE1ldGhvZCBMaWJyYXJ5IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHJlY29nbml6ZSBhIHRleHQgZmllbGQgdGhhdCBzdXBwb3J0cyBoeXBlcmxpbmtzIGJ5IHRoZSBsaXR0bGUgdHJpYW5nbGUgbmV4dCB0byB0aGUgdGV4dCBmaWVsZCdzIGxhYmVsLiAgVGhpcyB0cmlhbmdsZSBhbGxvd3MgeW91IHRvIGV4cGFuZCB0aGUgdGV4dCBmaWVsZCBpbnRvIGEgZnVsbCBzaXplIGVkaXRvciB3aXRoIGFuIGVkaXRvciB0b29sYmFyIHByb3ZpZGluZyByaWNoIHRleHQgZWRpdGluZyBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZm9udCBzdHlsZXMsIGJ1bGxldCBwb2ludHMsIGV0Yy48YnIvPjxici8+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFub3RoZXIgZWxlbWVudCBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgaW4gdGhlIHRleHQgZmllbGQgc2ltcGx5IGZpbmQgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgb3IgY29uZmlndXJhdGlvbiB2aWV3IGFuZCBkcmFnIGl0IGludG8gYW4gZXhwYW5kZWQgb3IgY29sbGFwc2VkIGZvcm0gZmllbGQuPGJyLz48YnIvPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gYWxzbyBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRoZSBsaW5rIHRvIGJlIGFkZGVkIGFuZCBjbGljayB0aGUgQWRkIExpbmsgYnV0dG9uIGluIHRoZSB0b29sIGJhci4gSXQgb3BlbnMgdGhlIEFkZCBMaW5rIGRpYWxvZyB0aGF0IHByb3ZpZGVzIHlvdSBhbW9uZ3N0IG90aGVycyB3aXRoIHRocmVlIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGxpbmtzIHRvIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYnkgc2VsZWN0aW5nIHRoZSBlbGVtZW50IHZpYSB0aGUgIkJyb3dzZS4uLiIgYnV0dG9uLiAgRXZlcnkgb3B0aW9uIG9mZmVycyBhIGRpZmZlcmVudCB3YXkgZm9yIGRpc3BsYXlpbmcgdGhlIGxpbmsncyBuYW1lOjxici8+PGJyLz4iTWV0aG9kIEVsZW1lbnQiOiBsaW5rcyB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50IG5hbWUuIjxici8+PGJyLz4iTWV0aG9kIHdpdGggdHlwZSBwcmVmaXgiOiBsaW5rIHRoYXQgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZSBhbmQgdHlwZS48YnIvPjxici8+Ik1ldGhvZCBlbGVtZW50IHdpdGggY3VzdG9tIHRleHQiOiBsaW5rIHRoYXQgZGlzcGxheXMgYSB1c2VyIGRlZmluZWQgdGV4dC4gVG8gZGVmaW5lIHRoaXMgdGV4dCBtYW5pcHVsYXRlIHRoZSB0ZXh0IGluIGJldHdlZW4gdGhlICZsdDthJmd0OyZsdDsvYSZndDsgdGFncyBpbiB0aGUgVVJMIHRleHQgZmllbGQgb25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBhbiBlbGVtZW50IHVzaW5nIHRoZSAiQnJvd3NlLi4uIiBidXR0b24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgSHlwZXJsaW5rIHRvIGFuIEV4dGVybmFsIHBhZ2UgdXNpbmcgYSBVUkwiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhbiBleHRlcm5hbCBVUkwsIGV4cGFuZCB0aGUgZWRpdG9yLCBwb3NpdGlvbiB0aGUgY3Vyc29yIHdoZXJlIHlvdSB3YW50IHRoZSBsaW5rIHRvIGJlIGFkZGVkIGFuZCB0aGVuIGNsaWNrIHRoZSAiQWRkIExpbmsiIGJ1dHRvbiBpbiB0aGUgdG9vbCBiYXIuIEZpbGwgaW4gdGhlIGRpYWxvZyB3aXRoIHRoZSBsaW5rIFVSTCBkZXRhaWxzIGFuZCB0aGVuIGNsaWNrIE9LLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYWRkbmV3bWV0aG9kY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjN2Q1NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2FkZG5ld21ldGhvZGNvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJBZGQgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIGNoZWF0IHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29udGVudC4gWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG1ldGhvZCBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gVGhpcyBzZXBhcmF0ZXMgeW91ciBjb250ZW50IGZyb20gY29udGVudCB0aGF0IHlvdSByZXVzZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFuZCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5IHdpdGggbmV3IHJlbGVhc2VzIG9mIHN1Y2ggdGhpcmQgcGFydHkgcGx1Zy1pbnMgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLjxici8+PGJyLz5BbGwgcGx1Zy1pbnMgc2hpcHBlZCB3aXRoIHlvdXIgbWV0aG9kIGxpYnJhcnkgYXJlIHByb3RlY3RlZCBmcm9tIGRpcmVjdCBtb2RpZmljYXRpb24uIENyZWF0aW5nIG5ldyBlbGVtZW50cyBpbiB5b3VyIG93biBwbHVnLWluIGFuZCB0aGVuIHJlbGF0aW5nIHRob3NlIGVsZW1lbnRzIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgbG9ja2VkIHBsdWctaW4gYWxsb3dzIHlvdSB0byB0YWlsb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2NrZWQgcGx1Zy1pbiBmb3IgeW91ciBvd24gdXNlLiBJZiB5b3UgaGF2ZSBub3QgY3JlYXRlZCB5b3VyIG93biBtZXRob2QgcGx1Zy1pbiwgcGVyZm9ybSB0aGUgIkNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbiIgY2hlYXQgc2hlZXQgZmlyc3QuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiCi0JCXRpdGxlPSJTZWxlY3Qgb3IgQ3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db250ZW50IHBhY2thZ2VzIGFyZSB1c2VkIHRvIGdyb3VwIHJlbGF0ZWQgbWV0aG9kIGNvbnRlbnQgdG9nZXRoZXIuIFNpbmNlIGNvbnRlbnQgcGFja2FnZXMgYXJlIHNlbGVjdGFibGUgYXQgcHVibGljYXRpb24gdGltZSwgaXQgaXMgcmVjb21tZW5kZWQgcHJhY3RpY2UgdG8gZ3JvdXAgY29udGVudCB0aGF0IG5lZWRzIHRvIGJlIHB1Ymxpc2hlZCB0b2dldGhlciBpbnRvIHRoZSBzYW1lIGNvbnRlbnQgcGFja2FnZS48YnIvPjxici8+RmluZCB5b3VyIG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5IHZpZXcuIERyaWxsIGludG8gdGhlIHBsdWctaW4ncyBwYWNrYWdlcyB0byBsb2NhdGUgdGhlIHBhY2thZ2UgY2FsbGVkICJDb250ZW50IFBhY2thZ2VzIi4gVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGFsbCBwYWNrYWdlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gbWV0aG9kIGVsZW1lbnRzLiBTZWxlY3QgYW5kIGV4cGFuZCBhIHBhY2thZ2UgaW4gdGhlICJDb250ZW50IFBhY2thZ2VzIiBoaWVyYXJjaHkgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgZWxlbWVudCwgb3IgdG8gY3JlYXRlIGEgbmV3IGNvbnRlbnQgcGFja2FnZS4gUmlnaHQgY2xpY2sgYSBwYWNrYWdlIGFuZCBzZWxlY3QgTmV3IC0mZ3Q7IENvbnRlbnQgUGFja2FnZS48YnIvPjxici8+QW4gZWRpdG9yIG9wZW5zIHRoYXQgYWxsb3dzIHlvdSB0byBwcm92aWRlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBwYWNrYWdlIGFzIHdlbGwgYXMgdG8gYnJpZWZseSBkZXNjcmliZSBpdHMgcHVycG9zZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwiCi0JCXRpdGxlPSJDcmVhdGUgTWV0aG9kIENvbnRlbnQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+SW4geW91ciBleHBhbmRlZCBjb250ZW50IHBhY2thZ2Ugd2l0aGluIHRoZSBsaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIGFueSBvbmUgb2Ygcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzLCBvciBndWlkYW5jZSB0byBjcmVhdGUgYW55IG9mIHRoZXNlIGNvbnRlbnQgZWxlbWVudHMuIEhpZ2hsaWdodCAiTmV3IiBhbmQgdGhlbiBzZWxlY3QgdGhlIGNvbmNyZXRlIHR5cGUgb2YgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gY3JlYXRlIChlLmcuIGZvciB3b3JrIHByb2R1Y3RzIGNob29zZSBiZXR3ZWVuIGFydGlmYWN0LCBvdXRjb21lLCBvciBkZWxpdmVyYWJsZSkuIFRoZSBuZXcgZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpdHMgcmVzcGVjdGl2ZSBlZGl0b3IgaXMgb3BlbmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkRldGFpbCB0aGUgTmV3bHkgQ3JlYXRlZCBNZXRob2QgQ29udGVudCBFbGVtZW50IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIGZpZWxkcyBpbiB0aGUgY29udGVudCBlbGVtZW50IGVkaXRvciB0byBzcGVjaWZ5IHRoZSBjb250ZW50IGVsZW1lbnQgZGV0YWlscy4gU3RhcnQgYnkgYXNzaWduaW5nIGEgdW5pcXVlICJOYW1lIiB0byB0aGUgZWxlbWVudCBhcyB3ZWxsIGFzIGdpdmluZyBpdCBhICJQcmVzZW50YXRpb24gTmFtZSIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIGV4dGVybmFsIHZpc2libGUgbmFtZSB3aGVuIG90aGVyIGVsZW1lbnRzIHJlZmVyIHRvIHRoaXMgZWxlbWVudCBvciB3aGVuIHRoZSBlbGVtZW50IGlzIHB1Ymxpc2hlZC48YnIvPjxici8+RXZlcnkgZWxlbWVudCBvd25zIHNldmVyYWwgc3BlY2lmaWMgY29udGVudCBmaWVsZHMgZGlzdHJpYnV0ZWQgb24gc2V2ZXJhbCBzdGFja2VkIGVkaXRvciB0YWJzIGFuZCBzZWN0aW9ucyB3aXRoaW4gdGhlc2UgdGFicyB0aGF0IHlvdSBjYW4gdXNlIGZvciB5b3VyIGRlc2NyaXB0aW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgZGVzY3JpcHRpb24gZmllbGRzIGFzIHdlbGwgYXMgaG93IHRvIHVzZSB0aGUgcmljaCB0ZXh0IGVkaXRvciBzZWUgdGhlIG9ubGluZSBoZWxwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9hcHBseWNhcGFiaWxpdHlwYXR0ZXJuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk4NTQzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvYXBwbHljYXBhYmlsaXR5cGF0dGVybi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGNoZWF0c2hlZXQgdGl0bGU9IkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+V2hlbiBkZXZlbG9waW5nIGEgcHJvY2VzcyB5b3UgZG8gbm90IG5lZWQgdG8gd29yayBmcm9tIHNjcmF0Y2ggYnkgY3JlYXRpbmcgYWN0aXZpdGllcyBhbmQgZGVzY3JpcHRvcnMgb25lIGJ5IG9uZS4gIFRoaXMgY2hlYXQgc2hlZXQgd2Fsa3MgeW91IHRocm91Z2ggYXBwbHlpbmcgcHJlLWRlZmluZWQgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHBhcnRzIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPkEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBhY3Rpdml0aWVzIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIHBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBhIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkgcGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiBZb3UgY2FuIGFwcGx5IHRoZSBzYW1lIHBhdHRlcm4gc2V2ZXJhbCB0aW1lcyB0byB0aGUgc2FtZSBwcm9jZXNzIGFuZCBkZWZpbmUgbG9jYWwgbW9kaWZpY2F0aW9ucyB0byBlYWNoIGluZGl2aWR1YWwgcGF0dGVybiBhcHBsaWNhdGlvbi4gVGhpcyBhbGxvd3MgeW91IHRvIGV4cHJlc3Mgc3BlY2lmaWMgY2hhbmdlcyBlYWNoIHRpbWUgdGhlIHBhdHRlcm4gaXMgYmVpbmcgcGVyZm9ybWVkIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUgYSBwcm9jZXNzIHJlcHJlc2VudHMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkZpbmQgYW4gQWN0aXZpdHkgdG8gd2hpY2ggYSBQYXR0ZXJuIHdpbGwgYmUgQXBwbGllZCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R2l2ZW4gdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IG9wZW5lZCB5b3VyIHByb2Nlc3MgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBzd2l0Y2ggdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSB0YWIgYW5kIHJldmlldyB5b3VyIHByb2Nlc3MuIEZpbmQgdGhlIGxvY2F0aW9uIHdoZXJlIHlvdSB3YW50IHRvIGFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuLiBBIGNhcGFiaWxpdHkgcGF0dGVybiBoYXMgdG8gYmUgYXBwbGllZCB0byBvbmUgc3BlY2lmaWMgYWN0aXZpdHkgKGluY2x1ZGluZyBpdGVyYXRpb24gb3IgcGhhc2Ugd2hpY2ggYXJlIHNwZWNpYWwgYWN0aXZpdGllcykgaW4gYSBwcm9jZXNzLiBTdWNoIGFuIGFjdGl2aXR5IGNhbiBlaXRoZXIgYmUgZGVmaW5lZCBsb2NhbGx5IGluIHRoZSBwcm9jZXNzIChwcmVzZW50ZWQgYXMgYSBuYW1lIGluIGEgc3RhbmRhcmQgYmxhY2sgZm9udCkgb3IgYW4gYWN0aXZpdHkgd2hpY2ggaGFkIGJlZW4gYWRkZWQgdG8gdGhlIHByb2Nlc3MgYnkgYXBwbHlpbmcgYW5vdGhlciBjYXBhYmlsaXR5IHBhdHRlcm4gKHByZXNlbnRlZCBhcyBhIG5hbWUgaW4gYSBncmVlbi1pdGFsaWMgZm9udCkuPGJyLz48YnIvPklmIHlvdSB3YW50IHRvIGFwcGx5IGEgcGF0dGVybiB0byBhIGxvY2FsIGFjdGl2aXR5IChibGFjayBmb250KSwgZ28gdG8gc3RlcCAiU2VsZWN0IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXciLiBJZiB5b3Ugd2FudCB0byBhcHBseSBhIHBhdHRlcm4gdG8gYW4gYWN0aXZpdHkgZnJvbSBhbm90aGVyIHBhdHRlcm4gKGdyZWVuIGl0YWxpYyBmb250KSwgcGxlYXNlIGdvIHRvIHN0ZXAgIkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJdGl0bGU9IkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+T25seSBpZiB5b3Ugd2FudCB0byBhcHBseSBhIHBhdHRlcm4gdG8gYW4gYWN0aXZpdHkgZnJvbSBhbm90aGVyIHBhdHRlcm4gKHJlY29nbml6YWJsZSBieSB0aGUgZ3JlZW4gaXRhbGljIGZvbnQpIHRoZW4geW91IG5lZWQgdG8gY3JlYXRlIGFuIGFjdGl2aXR5IGNvbnRyaWJ1dGlvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBtYWtlIGxvY2FsIGNoYW5nZXMgdG8gdGhlIGFjdGl2aXR5Ljxici8+PGJyLz5GaW5kIHRoZSBhY3Rpdml0eSdzIHBhcmVudCBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMgYSBub3QgYSBsb2NhbCBlbGVtZW50IChncmVlbiBpdGFsaWMgZm9udCkgdGhlbiB5b3UgZmlyc3QgbmVlZCBjcmVhdGUgYSBjb250cmlidXRpb24gdG8gdGhpcyBwYXJlbnQgYW5kIHNvIG9uIChpZiB0aGUgcGFyZW50J3MgcGFyZW50IGlzIG5vdCBsb2NhbCB0aGVuIGNyZWF0ZSBhIGNvbnRyaWJ1dGlvbiB0byB0aGUgcGFyZW50J3MgcGFyZW50IGZpcnN0LCBldGMuKSA8YnIvPjxici8+VG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGEgbm9uLWxvY2FsIGFjdGl2aXR5LCByaWdodC1jbGljayB0aGUgbm9uLWxvY2FsIGFjdGl2aXR5IGFuZCB0aGVuIGNsaWNrICJDb250cmlidXRlIi4gRG8gdGhpcyB3aXRoIGFsbCBwYXJlbnRzIHRvcC1kb3duIHVudGlsIHlvdSByZWFjaCB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91IHdhbnQgdG8gYXBwbHkgdGhlIHBhdHRlcm4uIE9uY2UgeW91IGNsaWNrZWQgIkNvbnRyaWJ1dGUiLCB0aGUgYWN0aXZpdHkgYmVjb21lIGxvY2FsIGFuZCBpcyBwcmVzZW50ZWQgd2l0aCBhIHN0YW5kYXJkIGJsYWNrIGZvbnQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgCi0JCXRpdGxlPSJTZWxlY3QgYSBDYXBhYmlsaXR5IFBhdHRlcm4gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RmluZCBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBFeHBhbmQgdGhlIHBhY2thZ2UgIlByb2Nlc3NlcyAtJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zIiBhcyB3ZWxsIGFzIGl0cyBzdWItcGFja2FnZXMuIFNlbGVjdCB0aGUgcGF0dGVybiB5b3Ugd2FudCB0byBhcHBseSB0byB5b3VyIHByb2Nlc3MuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQXBwbHkgdGhlIENhcGFiaWxpdHkgUGF0dGVybiBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIEFjdGl2aXR5IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGFwcGx5IGVpdGhlciB0aGUgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJuIHRvIHlvdXIgcHJvY2VzcyBvciBqdXN0IG9uZSBvciBtb3JlIGFjdGl2aXRpZXMgZnJvbSBpdC4gVG8gYXBwbHkgdGhlIHdob2xlIGNhcGFiaWxpdHkgcGF0dGVybiBkcmFnIHRoZSBwYXR0ZXJuIG92ZXIgdGhlIGFjdGl2aXR5IHNlbGVjdGVkIGVhcmxpZXIgaW4geW91ciBwcm9jZXNzLiBUbyBhcHBseSBvbmUgb3IgbW9yZSBhY3Rpdml0aWVzIG9mIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gc2VsZWN0IHRoZW0gaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gWW91IGNhbiBtdWx0aSBzZWxlY3QgYnkgcHJlc3NpbmcgY3RybCArIHNlbGVjdCwgb3Igc2hpZnQgKyBzZWxlY3QgdG8gY2FwdHVyZSBhbiBhbGwtaW5jbHVzaXZlIHNlY3Rpb24uPGJyLz48YnIvPkRyYWcgdGhlbSB0byB0aGUgYWN0aXZpdHkgc2VsZWN0ZWQgZWFybGllciBpbiB5b3VyIHByb2Nlc3MuIEFmdGVyIGRyYWdnaW5nIHRoZSBwYXR0ZXJuIG9yIGFjdGl2aXRpZXMgeW91IHdpbGwgYmUgcHJvbXB0ZWQgeW91IHRvIGFwcGx5IHRoZSBwYXR0ZXJuL2FjdGl2aXRpZXMgdmlhIEV4dGVuZHMgKGR5bmFtaWMgYmluZGluZykgb3IgQ29weSAoU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGVzZSB0d28gY2hvaWNlcykuIE1ha2UgeW91ciBjaG9pY2UgYnkgY2xpY2tpbmcuPGJyLz48YnIvPkFzIGFuIGFsdGVybmF0aXZlIHRvIGRyYWdnaW5nIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4geW91IGNhbiBhbHNvIHJpZ2h0LWNsaWNrIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgcGF0dGVybiBhbmQgc2VsZWN0IHRoZSBtZW51IG9wdGlvbiAiQXBwbHkgUGF0dGVybiAtJmd0OyBDb3B5Li4uIiBvciAiQXBwbHkgUGF0dGVybiAtJmd0OyBFeHRlbmQuLi4iPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJdGl0bGU9Ik1ha2UgTG9jYWwgQ2hhbmdlcyB0byBhIFBhdHRlcm4gQXBwbGljYXRpb24iCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+SWYgeW91IGFwcGxpZWQgdGhlIHBhdHRlcm4gdmlhIGNvcHksIHlvdSBjYW4gZnJlZWx5IG1ha2UgbW9kaWZpY2F0aW9ucyB0byB0aGUgY29waWVkIGVsZW1lbnRzLiBJZiB5b3UgYXBwbGllZCB0aGUgcGF0dGVybiB2aWEgZXh0ZW5kcyAoZHluYW1pYyBiaW5kaW5nKSB5b3UgY2FuIHN0aWxsIHByb3ZpZGUgbG9jYWwgYWRkaXRpb25zIHRvIHRoZSBwYXR0ZXJuIGJ5IGRlZmluaW5nIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXR0ZXJuJ3MgYWN0aXZpdGllcy4gRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgb2YgdGhlIHN0ZXAgIkNvbnRyaWJ1dGUgdG8gYW4gQWN0aXZpdHkgZnJvbSBBbm90aGVyIFBhdHRlcm4iIGFib3ZlIHRvIGRlZmluZSBzdWNoIGEgY29udHJpYnV0aW9uLiBBZnRlciB5b3UgY3JlYXRlIHRoZSBsb2NhbCBhY3Rpdml0eSBjb250cmlidXRpb24sIHlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgZGVzY3JpcHRvcnMgb3IgcGF0dGVybnMgdG8gdGhpcyBhY3Rpdml0eS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQl0aXRsZT0iU3VwcHJlc3MgUGF0dGVybiBFbGVtZW50cyIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHN1cHByZXNzIGVsZW1lbnRzIHN1Y2ggYXMgZGVzY3JpcHRvcnMgb3IgYWN0aXZpdGllcyBvZiBhIGR5bmFtaWNhbGx5IGJvdW5kcyBwYXR0ZXJuICh2aWEgZXh0ZW5kcykgYnkgcmlnaHQgY2xpY2tpbmcgYW5kIHNlbGVjdGluZyAiU3VwcHJlc3MiIGZyb20gdGhlIGNvbnRleHQgbWVudS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVhcHJvY2Vzcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Yzc5NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZWFwcm9jZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgUHJvY2VzcyAoQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MpIj4KLQotCTxpbnRybyAKLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgY2hlYXQgc2hlZXQgZ3VpZGVzIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyBhIFByb2Nlc3MuIFRoZXJlIGFyZSB0d28gbWFpbiB0eXBlcyBvZiBwcm9jZXNzZXM6IENhcGFiaWxpdHkgUGF0dGVybnMgYW5kIERlbGl2ZXJ5IFByb2Nlc3Nlcy4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIEFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMsIHdoaWxlIGEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdC4gU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJQcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldyIgZm9yIG1vcmUgZGV0YWlscy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCIKLQkJdGl0bGU9IlNlbGVjdCBvciBDcmVhdGUgYSBEZWZhdWx0IE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciB5b3VyIFByb2Nlc3MiCi0JCXNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91ciBwcm9jZXNzIGNhbiBjb250YWluIGNvbnRlbnQgZnJvbSBtYW55IGRpZmZlcmVudCBtZXRob2QgcGx1Zy1pbnMuIFRoZSBjb250ZW50IGVsZW1lbnRzIGZyb20gdGhlc2UgcGx1Zy1pbnMsIHN1Y2ggYXMgdGFza3Mgb3Igd29yayBwcm9kdWN0cywgYXBwbGllZCB0byB5b3VyIHByb2Nlc3MgdmlhIGRyYWcgYW5kIGRyb3AsIGNhbiBoYXZlIG1hbnkgY29udHJpYnV0aW9ucyBvciByZXBsYWNlbWVudHMuIFN1Y2ggY29udHJpYnV0aW9ucyBvciByZXBsYWNlbWVudHMgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIHRoYXQgbmVlZCB0byBiZSBjb25zaWRlcmVkIGZvciBjcmVhdGluZyB0aGUgcHJvY2VzcyBlbGVtZW50cyB3aXRoIHRoZWlyIG1pcnJvcmVkIHNldCBvZiByZWxhdGlvbnNoaXBzLjxici8+PGJyLz5Gb3IgdGhhdCByZWFzb24geW91IG5lZWQgdG8gZGVmaW5lIGEgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHZpc2libGUgc2V0IG9mIGVsZW1lbnRzIGFuZCByZWxhdGlvbnNoaXBzIHdoZW4gdGhlIHByb2Nlc3MgaXMgYXV0aG9yZWQuIFRoaXMgcHJvY2VzcyBhdXRob3JpbmcgY29uZmlndXJhdGlvbiBpcyByZWZlcnJlZCB0byBhcyB0aGUgIkRlZmF1bHQgQ29uZmlndXJhdGlvbiIgZm9yIHRoZSBwcm9jZXNzIGFuZCBzaG91bGQgZGVmaW5lIHRoZSBsYXJnZXN0IHJlYXNvbmFibGUgc2V0IG9mIG1ldGhvZCBwbHVnLWlucywgY29udGVudCBwYWNrYWdlcywgYW5kIG90aGVyIHByb2Nlc3NlcyBmcm9tIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IHdpbGwgYmUgcmVmZXJyZWQgdG8gYnkgdGhlIHByb2Nlc3MgYXQgc29tZSBwb2ludC48YnIvPjxici8+SW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYSBwcm9jZXNzIGNhbiBiZSBsaW5rZWQgdG8gbWFueSBhZGRpdGlvbmFsIG1ldGhvZCBjb25maWd1cmF0aW9ucyB0aGF0IGhhdmUgYmVlbiB2ZXJpZmllZCB0byBhbHNvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4gSG93ZXZlciwgYWxsIG90aGVyIHZhbGlkIGNvbmZpZ3VyYXRpb25zIG5lZWQgdG8gZGVmaW5lIHN1Yi1zZXRzIG9mIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBJbiBvdGhlciB3b3JkcywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGxpbmsgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIHByb2Nlc3MgdGhhdCByZWZlcnMgdG8gZWxlbWVudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgYmVjYXVzZSBzdWNoIGVsZW1lbnRzIHdlcmUgbm90IGNvbnNpZGVyZWQgd2hlbiB0aGUgcHJvY2VzcyB3YXMgY3JlYXRlZC48YnIvPjxici8+UHJvY2VzcyBlbGVtZW50cyB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3aWxsIG5vdCBiZSBzaG93biBpbiB0aGUgcHJvY2VzcyB3aGVuIHB1Ymxpc2hlZCBvciB1c2VkIHVuZGVyIHN1Y2ggYSBjb25maWd1cmF0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IGhpZGUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSBtb3ZpbmcgY29udGVudCBwYWNrYWdlcyBpbiBvciBvdXQgb2YgdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48YnIvPjxici8+VGhlcmVmb3JlLCBiZWZvcmUgeW91IHN0YXJ0IGNyZWF0aW5nIGEgcHJvY2VzcywgcmV2aWV3IHlvdXIgbGlzdCBvZiBjb25maWd1cmF0aW9ucyBpbiB0aGUgbGlicmFyeSB2aWV3IGFuZCBkZWNpZGUgd2hpY2ggY29uZmlndXJhdGlvbiB5b3UgYXJlIGdvaW5nIHRvIHVzZS4gIElmIG5lY2Vzc2FyeSwgb3BlbiBjb25maWd1cmF0aW9ucyBhbmQgZXhhbWluZSB0aGVpciBzcGVjaWZpY2F0aW9uLiBJZiB5b3UgZG8gbm90IGZpbmQgYSBmaXR0aW5nIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIHRoZSByaWdodCBzZXQgb2YgZWxlbWVudHMsIGNyZWF0ZSBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHByb2Nlc3MgYW5kIG1ldGhvZCBjb25maWd1cmF0aW9uIHNlZSB0aGUgc2VjdGlvbiAiUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIGluIHRoZSBvbmxpbmUgaGVscC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwiCi0JCXRpdGxlPSJDaG9vc2UgYSBNZXRob2QgUGx1Zy1pbiB0byBIb2xkIHlvdXIgUHJvY2VzcyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+U2luY2UgeW91IGNhbm5vdCBhZGQgcHJvY2Vzc2VzIHRvIHdyaXRlLWxvY2tlZCB0aGlyZC1wYXJ0eSBtZXRob2QgcGx1Zy1pbnMgeW91ciBwcm9jZXNzIG5lZWRzIHRvIGJlIGNyZWF0ZWQgaW4gb25lIG9mIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucy4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIGNyZWF0ZSB5b3VyIHByb2Nlc3Mgd2l0aGluIHRoZSBwbHVnLWluIGluIHdoaWNoIGl0IGlzIGdvaW5nIHRvIGJlIHVzZWQuIEZvciBpbnN0YW5jZSwgaWYgeW91IHdhbnQgdG8gZGV2ZWxvcCBhIHNldCBvZiBjYXBhYmlsaXR5IHBhdHRlcm5zIHRvIHVzZSB0byBhc3NlbWJsZSBhIGRlbGl2ZXJ5IHByb2Nlc3MsIHRyeSB0byBtYWludGFpbiBhbGwgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4uPGJyLz48YnIvPklmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIGEgbWV0aG9kIHBsdWctaW4sIGdvIHRvIHRoZSAiQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBQbHVnLWluIiBjaGVhdCBzaGVldC48YnIvPjxici8+SW4gdGhlIGxpYnJhcnkgdmlldywgc2VsZWN0IGEgcGx1Zy1pbiBmcm9tIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBtZXRob2QgcGx1Zy1pbnMuIEljb25zIHRoYXQgYXBwZWFyIHRvIGJlIGdyYXllZC1vdXQgaGF2ZSBiZWVuIGxvY2tlZCBmb3IgbW9kaWZpY2F0aW9uIGFuZCBjYW5ub3QgYmUgdXNlZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwiIAotCQl0aXRsZT0iRmluZCBvciBDcmVhdGUgYSBQcm9jZXNzIFBhY2thZ2UiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlByb2Nlc3NlcyBjYW4gYmUgb3JnYW5pemVkIHdpdGggcHJvY2VzcyBwYWNrYWdlcyB0byBpbmNyZWFzZSBtYWludGFpbmFiaWxpdHkgYW5kIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUgcHJvY2VzcyB1c2VyIHRvIGJyb3dzZSBhbmQgZmluZCB0aGVtLiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB5b3UgY2FuIGNyZWF0ZSBjYXBhYmlsaXR5IHBhdHRlcm5zIG9ubHkgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm5zIHBhY2thZ2Ugb3Igc3ViLXBhY2thZ2UgYW5kIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvbmx5IGluIGEgZGVsaXZlcnkgcHJvY2VzcyBwYWNrYWdlIG9yIHN1Yi1wYWNrYWdlLjxici8+PGJyLz5Vc2luZyB0aGUgbGlicmFyeSB2aWV3LCByZXZpZXcgdGhlIHN0cnVjdHVyZSBvZiBwcm9jZXNzIHBhY2thZ2VzIGF2YWlsYWJsZSBpbiB0aGUgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3Ugc2VsZWN0ZWQgb3IgY3JlYXRlZCBpbiB0aGUgbGFzdCBzdGVwIGFuZCB0aGVuIHNlbGVjdCBvbmUgb2YgdGhlIHBhY2thZ2VzIHByZXNlbnQgYXMgYSBjb250YWluZXIgZm9yIHlvdXIgcHJvY2Vzcy4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBuZXcgUHJvY2VzcyBQYWNrYWdlIGJ5IHJpZ2h0LWNsaWNraW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgcGFja2FnZSBvciBzdWItcGFja2FnZSBhbmQgdGhlbiBjbGlja2luZyBOZXcgLSZndDsgUHJvY2VzcyBQYWNrYWdlLiBJbiB0aGUgZGlhbG9nIGJveCB0aGF0IGFwcGVhcnMsIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgYW5kIHRoZW4gY2xpY2sgT0suPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgCi0JCXRpdGxlPSJDcmVhdGUgdGhlIENhcGFiaWxpdHkgUGF0dGVybiBvciBEZWxpdmVyeSBQcm9jZXNzIgotCQlza2lwPSJmYWxzZSI+CQotCQk8ZGVzY3JpcHRpb24+VG8gY3JlYXRlIGEgbmV3IGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzOiBSaWdodCBjbGljayB0aGUgc2VsZWN0ZWQgb3IgbmV3bHkgY3JlYXRlZCBwcm9jZXNzIHBhY2thZ2UgYW5kIHRoZW4gY2xpY2sgTmV3IC0mZ3Q7IENhcGFiaWxpdHkgUGF0dGVybiBvciBOZXcgLSZndDsgRGVsaXZlcnkgUHJvY2Vzcy4gIEluIHRoZSBkaWFsb2cgYm94IHRoYXQgYXBwZWFycywgc3BlY2lmeSB0aGUgcHJvY2VzcyBuYW1lIGFuZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIHRoZW4gY2xpY2sgT0suIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBlZGl0b3IgaXMgb3BlbmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCQotCTxpdGVtCi0JCXRpdGxlPSJEb2N1bWVudCB5b3VyIFByb2Nlc3MiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPldpdGggdGhlIHByb2Nlc3MgZWRpdG9yIG9wZW5lZCBpbiB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyIHByb2Nlc3MgdXNpbmcgdGhlIGF2YWlsYWJsZSB0ZXh0IGZpZWxkcy4gIEF0IGEgbWluaW11bSBwcm92aWRlIGEgcHJlc2VudGF0aW9uIG5hbWUgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHlvdXIgcHJvY2Vzcy4gIFNlZSB0aGUgb25saW5lIGhlbHAgZm9yIGRlZmluaXRpb25zIG9mIGVhY2ggYXZhaWxhYmxlIGRvY3VtZW50YXRpb24gZmllbGQuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi08aXRlbQotCQl0aXRsZT0iRGVjaWRlIG9uIHlvdXIgUHJpbWFyeSBQcm9jZXNzIEF1dGhvcmluZyBWaWV3IgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIGRldmVsb3AgYSBwcm9jZXNzIGZyb20gdGhyZWUgZGlmZmVyZW50IHZpZXdzOjxici8+PGJyLz5CcmVha2Rvd24gU3RydWN0dXJlOiAgQ3JlYXRlIHlvdXIgcHJvY2VzcyBieSBkZWZpbmluZyBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4gIENyZWF0ZSBpdGVyYXRpb25zIGFuZCBhY3Rpdml0aWVzIGZpcnN0IGFuZCB0aGVuIHBvcHVsYXRlIHlvdXIgYWN0aXZpdGllcyBieSBlaXRoZXIgYXBwbHlpbmcgdGFza3MgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IG9yIGFwcGx5aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMuIEdvIHRvIHN0ZXAgIkRldmVsb3AgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIgdG8gd29yayB3aXRoIHRoaXMgdmlldy48YnIvPjxici8+VGVhbSBBbGxvY2F0aW9uOiBDcmVhdGUgeW91ciBwcm9jZXNzIGJ5IGRlZmluaW5nIHdoaWNoIHRlYW1zIGFuZCByb2xlcyBzaGFsbCBwYXJ0aWNpcGF0ZSBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kaW5nIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kIHRhc2tzIGZyb20gdGhlcmUuICBHbyB0byBzdGVwICJEZXZlbG9wIHRoZSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIiB0byB3b3JrIHdpdGggdGhpcyB2aWV3Ljxici8+PGJyLz5Xb3JrIFByb2R1Y3QgVXNhZ2U6IENyZWF0ZSB5b3VyIHByb2Nlc3MgYnkgZGVmaW5pbmcgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZCBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kaW5nIHRhc2tzIGFuZCByb2xlcyBmcm9tIHRoZXJlLiBHbyB0byBzdGVwICJEZXZlbG9wIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmUiIHRvIHdvcmsgd2l0aCB0aGlzIHZpZXcuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwiIAotCQl0aXRsZT0iRGV2ZWxvcCB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPlRvIGFjY2VzcyB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgc2VsZWN0IHRoZSAiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIiB0YWIgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLjxici8+PGJyLz5SaWdodC1jbGljayB0aGUgZWxlbWVudCBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGNsaWNrIE5ldyBDaGlsZCAtJmd0OyBBY3Rpdml0eSB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgcGhhc2Ugb3IgaXRlcmF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHlvdXIgcHJvY2Vzcy4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzIHRvIHNldC11cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci48YnIvPjxici8+UmV2aWV3IHRoZSBsaXN0IG9mIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIEluIHRoaXMgdmlldyB0YXNrcyBhcmUgc29ydGVkIGJ5IGRpc2NpcGxpbmUuIERyaWxsIGludG8gdGhlIGRpc2NpcGxpbmVzIGhpZXJhcmNoeSB0byBzZWUgd2hpY2ggdGFza3MgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uIFNlbGVjdCBhIHRhc2sgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8geW91ciBicmVha2Rvd24gc3RydWN0dXJlIGFuZCBkcmFnIGl0IG9uIHRvcCBvZiBvbmUgb2YgdGhlIGFjdGl2aXRpZXMgeW91IGp1c3QgY3JlYXRlZC4gVGhlIHRhc2sgaXMgYWRkZWQgYXMgYSBzby1jYWxsZWQgdGFzayBkZXNjcmlwdG9yIChhbiBvY2N1cnJlbmNlIG9mIGEgdGFzayBpbiBvbmUgc3BlY2lmaWMgYWN0aXZpdHkpLjxici8+PGJyLz5SZXZpZXcgdGhlIHRhc2sgZGVzY3JpcHRvcidzIGRldGFpbHMgaW4gaXRzIHByb3BlcnRpZXMgdmlldy4gSWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkIHRoZW4gc2VsZWN0IHRoZSB0YXNrIGluIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCAiUHJvcGVydGllcyIuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yLjxici8+PGJyLz5QZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgdGFzayBkZXNjcmlwdG9yIGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsIGNoYW5nZSBwZXJmb3JtaW5nIHJvbGVzLCBjaGFuZ2UgdGhlIGlucHV0cyBhbmQgb3V0cHV0cywgZXRjLiBXaGVuIGNoYW5naW5nIHRoZSB0YXNrIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIGluIHRoZSBwcm9wZXJ0eSB3aW5kb3cgdGFicyByb2xlcyBvciB3b3JrIHByb2R1Y3RzLCB5b3UgY2FuIGVpdGhlciBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgJ0FkZC4uJyBidXR0b24gb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5Ljxici8+PGJyLz5JbnN0ZWFkIG9mIGRyYWdnaW5nIHRhc2sgb25lIGJ5IG9uZSB5b3UgY2FuIGFsc28gYXBwbHkgd2hvbGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBhY3Rpdml0aWVzIGZyb20gb3RoZXIgcHJvY2Vzc2VzIGF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uICBTZWxlY3QgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgYW55IGFjdGl2aXR5IG9mIHN1Y2ggYSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgYXZhaWxhYmxlIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIGRyYWcgaXQgb24gdG9wIG9mIGFuIGFjdGl2aXR5IHdpdGhpbiB5b3VyIHByb2Nlc3MgYnJlYWtkb3duIGluIHRoZSBwcm9jZXNzIGVkaXRvci4gKEZpbmQgYSBkZXRhaWxlZCB3YWxrdGhyb3VnaCB0byBhcHBseWluZyBjYXBhYmlsaXR5IHBhdHRlcm4gaW4gdGhlIGNoZWF0IHNoZWV0ICJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiIuKTxici8+PGJyLz5Db250aW51ZSBhZGRpbmcgbW9yZSB0YXNrcywgYWN0aXZpdGllcyBvciBwYXR0ZXJucyB0byB5b3VyIGFjdGl2aXRpZXMgb3Igc3dpdGNoIHRvIHRoZSB0ZWFtIGFsbG9jYXRpb24gdGFiIHRvIGFkZCByb2xlcyBvciB0byB0aGUgd29yayBwcm9kdWN0IHVzYWdlIHRhYiB0byBhZGQgd29yayBwcm9kdWN0cy48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCIgCi0JCXRpdGxlPSJEZXZlbG9wIHRoZSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlZm9yZSB5b3Ugc3RhcnQsIGVuc3VyZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgIlRlYW0gQWxsb2NhdGlvbiIgdGFiIHRvIG9wZW4gdGhlIHRlYW0gYWxsb2NhdGlvbiBlZGl0b3IuPGJyLz48YnIvPlJpZ2h0LWNsaWNrIHRoZSBlbGVtZW50IGluIHRoZSBmaXJzdCByb3cgb2YgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRoZW4gY2xpY2sgTmV3IENoaWxkIC0mZ3Q7IEFjdGl2aXR5IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBwaGFzZSBvciBpdGVyYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgeW91ciBwcm9jZXNzLiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMgdG8gc2V0LXVwIHlvdXIgYnJlYWtkb3duIHN0cnVjdHVyZS4gQWN0aXZpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyLjxici8+PGJyLz5Zb3UgY2FuIGFkZCByb2xlcyBkaXJlY3RseSB0byB5b3VyIGFjdGl2aXRpZXMgbm93LiBJbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LCByZXZpZXcgdGhlIGxpc3Qgb2Ygcm9sZXMuIEluIHRoaXMgdmlldyByb2xlcyBhcmUgb3JnYW5pemVkIGludG8gcm9sZSBzZXRzLiBEcmlsbCBpbnRvIHRoZSByb2xlIHNldHMgaGllcmFyY2h5IHRvIHNlZSB3aGljaCByb2xlcyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgUm9sZSB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB5b3VyIGFjdGl2aXR5IGFuZCBkcmFnIGl0IG9uIHRvcCBvZiB0aGUgYWN0aXZpdHkgeW91IGNyZWF0ZWQgZWFybGllci4gVGhlIHJvbGUgaXMgYWRkZWQgYXMgYSByb2xlIGRlc2NyaXB0b3IgKGFuIG9jY3VycmVuY2Ugb2YgYSByb2xlIGluIG9uZSBzcGVjaWZpYyBhY3Rpdml0eSkuPGJyLz48YnIvPklmIHRoZSByb2xlIHRoYXQgeW91IGp1c3QgZHJhZ2dlZCBoYXMgcmVzcG9uc2liaWxpdHkgcmVsYXRpb25zaGlwcyB0byB3b3JrIHByb2R1Y3RzIGRlZmluZWQsIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdSB0byBhZGQgYW55IG9mIHRoZSB3b3JrIHByb2R1Y3RzIHRvIHRoZSBwcm9jZXNzLiBTZWxlY3QgemVybyB0byBtYW55IHdvcmsgcHJvZHVjdHMgYW5kIHRoZW4gY2xpY2sgT0suPGJyLz48YnIvPkZvciBlYWNoIHNlbGVjdGVkIHdvcmsgcHJvZHVjdCB0aGUgbmV4dCB3aXphcmQgd2luZG93IHByb21wdHMgeW91IHRvIHNlbGVjdCB0YXNrcyB0aGF0IHByb2R1Y2UgdGhlc2Ugd29yayBwcm9kdWN0cy4gQWdhaW4sIHNlbGVjdCB6ZXJvIHRvIG1hbnkgdGFza3MgYW5kIHRoZW4gY2xpY2sgT0sgdG8gYWRkIHRoZXNlIGVsZW1lbnRzIHRvIHlvdXIgcHJvY2Vzcy48YnIvPjxici8+UmV2aWV3IHRoZSByb2xlIGRlc2NyaXB0b3IncyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCB0aGVuIHNlbGVjdCB0aGUgcm9sZSBpbiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3IsIHJpZ2h0LWNsaWNrLCBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIi4gVXNlIHRoZSB0YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSByb2xlIGRlc2NyaXB0b3IuIFlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIGFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgY2hhbmdlIHdvcmsgcHJvZHVjdHMgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yLCBldGMuPGJyLz48YnIvPldoZW4gY2hhbmdpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcuKAmXMgcmVsYXRpb25zaGlwcyBpbiB0aGUgcHJvcGVydHkgd2luZG93IHRhYuKAmXMgcm9sZXMgb3Igd29yayBwcm9kdWN0cywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgIkFkZOKApiIgYnV0dG9uLCBvciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggd29yayBwcm9kdWN0cyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS48YnIvPjxici8+Q29udGludWUgYWRkaW5nIG1vcmUgcm9sZXMgdG8geW91ciBhY3Rpdml0aWVzLCBvciBzd2l0Y2ggdG8gdGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSB0YWIgdG8gYWRkIHRhc2tzIG9yIHRvIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgdGFiIHRvIGFkZCB3b3JrIHByb2R1Y3RzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwiIAotCQl0aXRsZT0iRGV2ZWxvcCB0aGUgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZSIKLQkJc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5CZWZvcmUgeW91IHN0YXJ0LCBlbnN1cmUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0ZWQgaW4gdGhlIHRvb2wgYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHlvdSBzZWxlY3RlZCBhcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPGJyLz48YnIvPkluIHRoZSBwcm9jZXNzIGVkaXRvciwgY2xpY2sgdGhlICJXb3JrIFByb2R1Y3QgVXNhZ2UiIHRhYiB0byBvcGVuIHRoZSB3b3JrIHByb2R1Y3QgdXNhZ2UgZWRpdG9yLjxici8+PGJyLz5SaWdodC1jbGljayB0aGUgZWxlbWVudCBpbiB0aGUgZmlyc3Qgcm93IG9mIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0aGVuIGNsaWNrIE5ldyBDaGlsZCAtJmd0OyBBY3Rpdml0eSB0byBjcmVhdGUgYSBuZXcgYWN0aXZpdHkuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY3JlYXRlIGEgcGhhc2Ugb3IgaXRlcmF0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHNjb3BlIG9mIHlvdXIgcHJvY2Vzcy4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzIHRvIHNldC11cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlci48YnIvPjxici8+UmV2aWV3IHRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gSW4gdGhpcyB2aWV3IHdvcmsgcHJvZHVjdHMgYXJlIHNvcnRlZCBieSBkb21haW4gYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3QgdHlwZXMuICBEcmlsbCBpbnRvIGVpdGhlciBvZiB0aGVzZSBoaWVyYXJjaGllcyB0byBzZWUgd2hpY2ggd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi4gU2VsZWN0IGEgd29yayBwcm9kdWN0IHlvdSB3YW50IHRvIGFkZCB0byBhbiBhY3Rpdml0eSBhbmQgdGhlbiBkcmFnIGl0IG9uIHRvcCBvZiBhbiBBY3Rpdml0eSB0aGF0IHlvdSBjcmVhdGVkIGVhcmxpZXIuIFRoZSB3b3JrIHByb2R1Y3QgaXMgYWRkZWQgYXMgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciAoYW4gb2NjdXJyZW5jZSBvZiBhIHdvcmsgcHJvZHVjdCBpbiBvbmUgc3BlY2lmaWMgYWN0aXZpdHkpLjxici8+PGJyLz5BZnRlciB5b3UgaGF2ZSBhZGRlZCB0aGUgd29yayBwcm9kdWN0IHRvIHRoZSBhY3Rpdml0eSwgYSB3aXphcmQgcHJvbXB0cyB5b3UgdG8gYWRkIHRhc2tzIHRoYXQgcHJvZHVjZSB0aGlzIHdvcmsgcHJvZHVjdCB0byB0aGlzIGFjdGl2aXR5LiBTZWxlY3QgemVybyB0byBtYW55IHRhc2tzIGFuZCB0aGVuIGNsaWNrIE9LLiBUaGUgd2l6YXJkIGFkZHMgdGFzayBkZXNjcmlwdG9ycyBmb3IgZWFjaCBzZWxlY3RlZCB0YXNrIHRvIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUuPGJyLz48YnIvPlJldmlldyB0aGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9y4oCZcyBkZXRhaWxzIGluIGl0cyBwcm9wZXJ0aWVzIHZpZXcuIElmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgaXMgbm90IGRpc3BsYXllZCB0aGVuIHNlbGVjdCB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCByaWdodC1jbGljaywgYW5kIHNlbGVjdCAiUHJvcGVydGllcyIuIFVzZSB0aGUgdGFicyBvbiB0aGUgc2lkZSBvZiB0aGUgcHJvcGVydGllcyB2aWV3IHRvIHJldmlldyBkaWZmZXJlbnQgYXNwZWN0cyBvZiB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuIFlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUgcm9sZSBkZXNjcmlwdG9yLCBzdWNoIGFzIGNoYW5nZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUgYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBhZGQgZW50cnkgYW5kIGV4aXQgc3RhdGVzLCBldGMuPGJyLz48YnIvPldoZW4gY2hhbmdpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcuKAmXMgcmVsYXRpb25zaGlwcyBpbiB0aGUgcHJvcGVydHkgd2luZG93IHRhYuKAmXMgcm9sZXMgb3Igd29yayBwcm9kdWN0cywgeW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSB1c2luZyB0aGUgIkFkZOKApiIgYnV0dG9uLCBvciBjb25uZWN0IHlvdXIgcm9sZSBkZXNjcmlwdG9yIHdpdGggd29yayBwcm9kdWN0cyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBBY3Rpdml0eS48YnIvPjxici8+Q29udGludWUgYnkgYWRkaW5nIG1vcmUgd29yayBwcm9kdWN0cyB0byB5b3VyIGFjdGl2aXRpZXMsIG9yIHN3aXRjaCB0byB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIHRhYiB0byBhZGQgdGFza3Mgb3IgdGhlIHRlYW0gYWxsb2NhdGlvbiB0YWIgdG8gYWRkIHJvbGVzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi08aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgCi0JCXRpdGxlPSJBcHBseSBhIENhcGFiaWxpdHkgUGF0dGVyIG9yIENhcGFiaWxpdHkgUGF0dGVybidzIEFjdGl2aXR5IgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPllvdSBkbyBub3QgbmVlZCB0byBkZXZlbG9wIHlvdXIgcHJvY2VzcyBmcm9tIHNjcmF0Y2ggYnkgYWRkaW5nIGRlc2NyaXB0b3JzIG9uZSBieSBvbmUgYXMgZGVzY3JpYmVkIGluIHRoZSBsYXN0IHN0ZXBzLiAgWW91IGNhbiBhbHNvIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgb3IgZXZlbiBjYXBhYmlsaXR5IHBhdHRlcm4gcGFydHMuIEdvIHRvIHRoZSBjaGVhdCBzaGVldCAiQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iIHRvIHNlZSBob3cuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRvbmUiPjxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLTwvY2hlYXRzaGVldD4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJkMzA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2Rjb25maWd1cmF0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uIj4KLQk8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwiPgotCQk8ZGVzY3JpcHRpb24+VGhpcyBjaGVhdCBzaGVldCBndWlkZXMgeW91IHRob3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24uIEJlY2F1c2UgdGhlIG1ldGhvZCBsaWJyYXJ5IGNhbiBjb250YWluIGxhcmdlIG51bWJlcnMgb2YgZWxlbWVudHMsIHlvdSBtYXkgd2FudCB0byBsaW1pdCB5b3VyIHdvcmsgdG8gYSB1c2VyLWRlZmluZWQgc3Vic2V0IG9mIHRoZSBsaWJyYXJ5IGNhbGxlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gQSBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbmVzIGEgd29ya2luZyBzZXQgb2YgcGFja2FnZXMgd2l0aGluIHRoZSBtZXRob2QgbGlicmFyeSB0aGF0IGhlbHBzIHlvdSBsaW1pdCB5b3VyIHZpZXcgdG8gYSBzdWJzZXQgb2YgYWxsIGVsZW1lbnRzLiBNZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIG5vdCBvbmx5IHVzZWQgZm9yIGNyZWF0aW5nIHByb2Nlc3NlcyAoeW91IGRyYWcgYW5kIGRyb3AgZWxlbWVudHMgaW50byBhIHByb2Nlc3MgZnJvbSBoZXJlKSwgYnV0IGFsc28gZm9yIHB1YmxpY2F0aW9uLCBiZWNhdXNlIGEgY29uZmlndXJhdGlvbiBkZWZpbmVzIHdoaWNoIGVsZW1lbnRzIHdpbGwgYmUgcHVibGlzaGVkIGluIEhUTUwgYW5kIHdoaWNoIHdpbGwgbm90Ljxici8+PGJyLz5UaGUgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiBhIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXJlIGRpc3BsYXllZCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3LiBUaGUgY29uZmlndXJhdGlvbiB2aWV3IGFsbG93cyB5b3UgdG8gYnJvd3NlIHRoZSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLCBhbmQgdG8gcG9wdWxhdGUgcHJvY2Vzc2VzIGJ5IGRyYWdnaW5nIGVsZW1lbnRzIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpbnRvIHRoZSBwcm9jZXNzIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIKLQkJdGl0bGU9IlByZXBhcmUgQ3JlYXRpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24geW91IHNob3VsZCBkZXRlcm1pbmUgeW91ciBuZWVkcyBhbmQgZ29hbHMgZm9yIHRoZSBjb25maWd1cmF0aW9uLiBPbmUgc2NlbmFyaW8gZm9yIGNyZWF0aW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBuZXcgbWV0aG9kIHBsdWctaW4gaW4gd2hpY2ggeW91IHdhbnQgdG8gZGVmaW5lIG1ldGhvZCBlbGVtZW50cyB0aGF0IGV4dGVuZCBhbiBhbHJlYWR5IGV4aXN0aW5nIHBsdWctaW4uIEluIHRoaXMgY2FzZSwgeW91IG5lZWQgdG8gY3JlYXRlIGEgY29uZmlndXJhdGlvbiB0aGF0IGluY2x1ZGVzIHlvdXIgbmV3IHBsdWctaW4gYXMgd2VsbCBhcyB0aGUgZXhpc3RpbmcgcGx1Zy1pbi4gSWYgeW91IHdhbnQgdG8gY3JlYXRlIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluIGZpcnN0IHRoZW4gZ28gdGhlIGNoZWF0ICJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iLjxici8+PGJyLz5Bbm90aGVyIHNjZW5hcmlvIGZvciBjcmVhdGluZyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGlzIHRoYXQgeW91IHdhbnQgdG8gZGVmaW5lIGEgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIHB1YmxpY2F0aW9uIHB1cnBvc2VzIG9uIGV4aXN0aW5nIHBsdWctaW5zLCBkZWZpbmluZyB3aGljaCBlbGVtZW50cyB0byBwdWJsaXNoLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgc2V0IG9mIGNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBkb2VzIG5vdCBtZWV0IHlvdXIgbmVlZHMsIHlvdSBjb3VsZCBub3cgZWl0aGVyIGN1c3RvbWl6ZSBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uIG9yIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IGNvbmZpZ3VyYXRpb24gZnJvbSBzY3JhdGNoLjxici8+PGJyLz5JZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBtZXRob2QgY29uZmlndXJhdGlvbiBieSBjb3B5aW5nIGFuIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gZ28gdG8gdGhlIG5leHQgc3RlcCAiQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gYnkgY29weWluZyBhbiBleGlzdGluZyBjb25maWd1cmF0aW9uIi48YnIvPjxici8+SWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIHNraXAgdG8gc3RlcCAiQ3JlYXRlIGEgbmV3IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaCIuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iQ3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gYnkgQ29weWluZyBhbiBFeGlzdGluZyBDb25maWd1cmF0aW9uIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkV4cGFuZCB0aGUgIkNvbmZpZ3VyYXRpb25zIiBwYWNrYWdlIGF0IHRoZSBlbmQgb2YgdGhlIExpYnJhcnkgdmlldy4gUmlnaHQgY2xpY2sgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHlvdSB3YW50IHRvIGNvcHksIGFuZCB0aGVuIHNlbGVjdCAiQ29weSIgZnJvbSB0aGUgbWVudS4gUmlnaHQgY2xpY2sgdGhlIGNvbmZpZ3VyYXRpb25zIHBhY2thZ2UgYW5kIHRoZW4gc2VsZWN0ICJQYXN0ZSIgZnJvbSB0aGUgbWVudS48YnIvPjxici8+QSBkaWFsb2cgcHJvbXB0cyB5b3VyIGZvciBhIG5ldyBjb25maWd1cmF0aW9uIG5hbWUuIFByb3ZpZGUgYSBuYW1lIHRoYXQgcmVmbGVjdHMgdGhlIGNoYXJhY3RlciBvciBwdXJwb3NlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4gVG8gY29udGludWUgc3BlY2lmeWluZyB5b3VyIG1ldGhvZCBjb25maWd1cmF0aW9uLCBza2lwIHRvIHN0ZXAgIlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJDcmVhdGUgYSBuZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbSBTY3JhdGNoIgotCQlza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPlJpZ2h0IGNsaWNrIHRoZSBjb25maWd1cmF0aW9ucyBwYWNrYWdlIGFuZCBzZWxlY3QgTmV3IC0mZ3Q7IE1ldGhvZCBDb25maWd1cmF0aW9uIGZyb20gdGhlIG1lbnUuIFRoZSBuZXcgY29uZmlndXJhdGlvbiBpcyBhZGRlZCB0byB0aGUgbGlzdCBhbmQgaXRzIGVkaXRvciBpcyBvcGVuZWQuIENoYW5nZSB0aGUgbmFtZSBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gdG8gcmVmbGVjdCBpdHMgY2hhcmFjdGVyIG9yIHB1cnBvc2UgYW5kIHRoZW4gY29udGludWUgdG8gdGhlIG5leHQgc3RlcCwgIlNwZWNpZnkgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCXRpdGxlPSJTcGVjaWZ5IHRoZSBNZXRob2QgQ29uZmlndXJhdGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+Q2xpY2sgdGhlICJQbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiIgdGFiIGluIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBlZGl0b3IgdG8gZ28gdG8gdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBmb3JtLiBUaGlzIGZvcm0gZGlzcGxheXMgYSBsaXN0IG9mIGFsbCBtZXRob2QgcGx1Zy1pbnMgYW5kIGZvciBldmVyeSBwbHVnLWluIGFsbCBvZiBpdHMgY29udGVudCBwYWNrYWdlcyBhcyB3ZWxsIGFzIGFsbCBwcm9jZXNzZXMuIFVzZSB0aGUgY2hlY2sgYm94ZXMgdG8gYWRkIG9yIHJlbW92ZSBwbHVnLWlucywgcGFja2FnZXMsIGFuZCBwcm9jZXNzZXMgdG8gb3IgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIAotCQl0aXRsZT0iUHJldmlldyB5b3VyIENvbmZpZ3VyYXRpb24gaW4gdGhlIENvbmZpZ3VyYXRpb24gVmlldyIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiBpbW1lZGlhdGVseSBwcmV2aWV3IHlvdXIgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gUmVmcmVzaCB5b3VyIGNvbmZpZ3VyYXRpb24gdmlldyBieSBjbGlja2luZyB0aGUgdmlldydzICJSZWZyZXNoIEFsbCIgaWNvbi4gRHJpbGwgaW50byB0aGUgdHJlZSBzdHJ1Y3R1cmVzIGRpc3BsYXllZCBieSB0aGUgY29uZmlndXJhdGlvbiB2aWV3IHRvIHNlZSBlbGVtZW50cyBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQkKLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCIgCi0JCXRpdGxlPSJEZWZpbmUgTmF2aWdhdGlvbiBWaWV3cyBmb3IgdGhlIE1ldGhvZCBDb25maWd1cmF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5BIG5hdmlnYXRpb24gdmlldyBpcyBhIG5hdmlnYXRpb24gdHJlZSBicm93c2VyIGZvciBhIGNvbmZpZ3VyYXRpb24gcHVibGlzaGVkIGFzIEhUTUwuIEV2ZXJ5IHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGNhbiBoYXZlIHNldmVyYWwgdmlld3MgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHN0YWNrZWQgdHJlZSBicm93c2VyIHRhYnMuIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG5hdmlnYXRpb24gdmlldyBpcyBkZWZpbmVkIGFzIGN1c3RvbSBjYXRlZ29yaWVzLiBBIGN1c3RvbSBjYXRlZ29yeSBpcyBhIHVzZXItZGVmaW5lZCBjb2xsZWN0aW9uIG9mIGNhdGVnb3JpemluZyBlbGVtZW50cywgd2hpY2ggbWF5IGl0c2VsZiBjb250YWluIHN1YmNhdGVnb3JpZXMuIFRoaXMgc3RydWN0dXJlIGlzIHdoYXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIGZvciB0aGUgdHJlZSBicm93c2VyLiAoRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQ3VzdG9tIENhdGVnb3JpZXMsIHNlZSB0aGUgb25saW5lIGhlbHAuKSBUaGVyZWZvcmUsIHRvIGRlZmluZSBhIG5hdmlnYXRpb24gdmlldyB5b3Ugc2VsZWN0IGEgY3VzdG9tIGNhdGVnb3J5IGFuZCBhbGwgb2YgdGhpcyBjYXRlZ29yaWVzIHN1Yi1lbGVtZW50cyBtYWtlIHVwIHRoZSB0cmVlIGJyb3dzZXIgc3RydWN0dXJlIGRpc3BsYXllZCBieSB0aGUgdmlldy48YnIvPjxici8+VG8gYWRkIG5hdmlnYXRpb24gdmlld3MgdG8geW91ciBjb25maWd1cmF0aW9uIGNsaWNrIHRoZSAiVmlld3MiIHRhYiBpbiB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IuIFVzZSB0aGUgIkFkZCBWaWV3Li4uIiBhbmQgIlJlbW92ZSBWaWV3IiBidXR0b25zIHRvIHNlbGVjdCB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgeW91IHdhbnQgdG8gYWRkIGFuZCByZW1vdmUgYXMgYSB2aWV3LCByZXNwZWN0aXZlbHkuIENsaWNrIHRoZSB0YWIgb2YgdGhlIHZpZXdzIHlvdSBqdXN0IGFkZGVkIHRvIHByZXZpZXcuPGJyLz48YnIvPlRvIHNlbGVjdCBhIHZpZXcgdG8gZGlzcGxheSBhcyB0aGUgc3RhcnQtdXAgdmlldywgY2xpY2sgdGhlICJNYWtlIERlZmF1bHQiIGJ1dHRvbi4gVGhlIHN0YXJ0LXVwIHZpZXcgaXMgdGhlIGZpcnN0IHZpZXcgc2hvd24gd2hlbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCB3aGVuIHN0YXJ0aW5nIHVwLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2RwbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0M2FiMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZHBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4gCi08IS0tIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLiAtLT4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIj4KLQkJPGRlc2NyaXB0aW9uPkJlY2F1c2UgdGhlIHBsdWctaW5zIHNoaXBwZWQgd2l0aCB0aGUgbWV0aG9kIGxpYnJhcnkgYXJlIGxvY2tlZCBhbmQgcmVhZC1vbmx5LCBhbGwgeW91ciBjaGFuZ2VzLCBhZGRpdGlvbnMsIGFuZCBleHRlbnNpb25zIHRvIGV4aXN0aW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaGF2ZSB0byBiZSBwbGFjZWQgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW5zLiBIb3dldmVyLCB5b3UgY2FuIHVzZSB2YXJpb3VzIGNhcGFiaWxpdGllcyB0byBsb2dpY2FsbHkgbWVyZ2UgeW91ciBwbHVnLWluIGNvbnRlbnRzIGludG8gb3RoZXIgcGx1Zy1pbnMgYWxsb3dpbmcgeW91LCBhcyBhIHJlc3VsdCwgdG8gcHVibGlzaCBleHRlbmRlZCBtZXRob2RzIGFuZCBwcm9jZXNzZXMgdGhhdCBzZWFtbGVzc2x5IGluY29ycG9yYXRlIHlvdXIgbWV0aG9kIGVsZW1lbnRzLiBUbyBjcmVhdGUgeW91ciBvd24gbWV0aG9kIHBsdWctaW5zIGZvbGxvdyB0aGVzZSBzdGVwcy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iVXNlIHRoZSBNZXRob2QgUGx1Zy1pbiBXaXphcmQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIG5ldyBtZXRob2QgcGx1Zy1pbiB1c2luZyB0aGUgIk5ldyBNZXRob2QgUGx1Zy1pbiIgd2l6YXJkLiBUbyBvcGVuIHRoZSB3aXphcmQgc2VsZWN0IEZpbGUgLSZndDsgTmV3IC0mZ3Q7IE1ldGhvZCBQbHVnLWluLiBTcGVjaWZ5IGF0IGxlYXN0IHRoZSBuYW1lIGZvciB5b3VyIG5ldyBtZXRob2QgcGx1Zy1pbiBhbmQgc2VsZWN0IHRoZSBjaGVjayBib3ggZm9yIGFueSBvdGhlciBtZXRob2QgcGx1Zy1pbnMgd2hpY2ggY29udGVudCB5b3Ugd2lzaCB0byBleHRlbmQgb3IgcmV1c2UuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iT3BlbiB0aGUgTWV0aG9kIFBsdWdpbiBFZGl0b3IiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgdGhlIHBsdWctaW4sIHlvdSBjYW4gbWFrZSBjaGFuZ2VzIHRvIGl0cyBzcGVjaWZpY2F0aW9ucyBpbiB0aGUgbWV0aG9kIHBsdWctaW4gZWRpdG9yLiBJbiB0aGUgbGlicmFyeSB2aWV3LCBkb3VibGUgY2xpY2sgdGhlIG1ldGhvZCBwbHVnLWluIHRoYXQgeW91IGp1c3QgY3JlYXRlZCB0byBvcGVuIHRoZSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iU3BlY2lmeSBWZXJzaW9uIEluZm9ybWF0aW9uIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5JbiBhZGRpdGlvbiB0byB0aGUgaW5mb3JtYXRpb24gYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIG1ldGhvZCBwbHVnLWluIHdpemFyZCwgeW91IGNhbiBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBsdWctaW4uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQl0aXRsZT0iU2VsZWN0IHRoZSBEZWZhdWx0IENvcHlyaWdodCBEZWZpbml0aW9uIEZpbGUiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgIlNlbGVjdCIgYnV0dG9uIHRvIHNwZWNpZnkgd2hpY2ggcGFnZSBvZiB0aGUgdHlwZSAiU3VwcG9ydGluZyBNYXRlcmlhbCIgY29udGFpbnMgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBmb3IgZWxlbWVudHMgb2YgdGhpcyBwbHVnLWluLiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aWxsIGJlIGFwcGVuZGVkIHRvIGV2ZXJ5IHBhZ2UgdGhhdCBnZXRzIHB1Ymxpc2hlZCBiYXNlZCBvbiBhbiBlbGVtZW50IGZyb20gdGhpcyBwbHVnLWluLiAgTm90ZSwgdGhhdCBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cyBjYW4gb3ZlcnJpZGUgdGhpcyBzdGFuZGFyZCBzZWxlY3Rpb24gd2l0aCB0aGUgY29weXJpZ2h0IGZpZWxkIGluIHRoZWlyIG93biBlZGl0b3JzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jaGVhdHNoZWV0cy9uYXZpZ2F0ZW1ldGhvZGNvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTY1MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJOYXZpZ2F0ZSBNZXRob2QgQ29udGVudCI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5UaGVyZSBhcmUgdHdvIHdheXMgdG8gbmF2aWdhdGUgbWV0aG9kIGNvbnRlbnQ6IGJ5IHVzaW5nIHRoZSBwaHlzaWNhbCBsaWJyYXJ5IHN0cnVjdHVyZSBpbiB0aGUgbGlicmFyeSB2aWV3IG9yIGJ5IHVzaW5nIHRoZSBsb2dpY2FsIGNhdGVnb3JpemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuICBUaGlzIGNoZWF0IHNoZWV0IHdhbGtzIHlvdSB0aHJvdWdoIGJvdGggc2NlbmFyaW9zLjwvZGVzY3JpcHRpb24+Ci0JPC9pbnRybz4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgdGl0bGU9IlN3aXRjaCB0byBBdXRob3JpbmcgUGVyc3BlY3RpdmUiIHNraXA9InRydWUiPgotCQk8ZGVzY3JpcHRpb24+WW91IGNhbiB3b3JrIHdpdGggdHdvIHBlcnNwZWN0aXZlczogdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZSBhbmQgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlLiBBIHBlcnNwZWN0aXZlIGRlZmluZXMgYSBzZXQgb2Ygdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBiZSBhdmFpbGFibGUgZm9yIHNwZWNpZmljIHRhc2tzLiBUaGUgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIHByb3ZpZGVzIHZpZXdzIGFuZCBmdW5jdGlvbnMgdG8gbmF2aWdhdGUgYW5kIGF1dGhvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLCB3aGlsZSB0aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgYWxsb3dzIHlvdSB0byBwcmV2aWV3IGFuZCBicm93c2UgYSBtZXRob2QgY29uZmlndXJhdGlvbi4gVGhpcyBjaGVhdCBzaGVldCByZWZlcnMgdG8gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS48YnIvPjxici8+Q2xpY2sgdGhlICJPcGVuIFBlcnNwZWN0aXZlIiBidXR0b24gb3IgdGhlIFdpbmRvdy0mZ3Q7T3BlbiBQZXJzcGVjdGl2ZSBtZW51IGFuZCB0aGVuIHNlbGVjdCAiQXV0aG9yaW5nIiB0byBzd2l0Y2ggdG8gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbCIgdGl0bGU9Ik9wZW4gdGhlIExpYnJhcnkgVmlldyIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5JZiB5b3UgZG8gbm90IHNlZSBhIHRyZWUtYnJvd3NlciB2aWV3IGxhYmVsZWQgIkxpYnJhcnkiIGluIHlvdXIgYXV0aG9yaW5nIHBlcnNwZWN0aXZlIGNsaWNrIHRoZSBXaW5kb3ctJmd0O1Jlc2V0IFBlcnNwZWN0aXZlIG1lbnUuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiIHRpdGxlPSJEcmlsbCBpbnRvIE1ldGhvZCBDb250ZW50IFBhY2thZ2VzIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5XaXRoaW4gdGhlIGxpYnJhcnkgdmlldyB0cmVlLWJyb3dzZXIsIGV4cGFuZCBhIHBsdWctaW4gYW5kIGRyaWxsIGludG8gdGhlIHBhY2thZ2VzICJNZXRob2QgQ29udGVudCItJmd0OyJDb250ZW50IFBhY2thZ2VzIiBhbmQgaXRzIHN1Yi1wYWNrYWdlcy4gRXhhbWluZSB0aGUgY29udGVudHMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJSZXZpZXcgQ29udGVudCBQYWNrYWdlcyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+RXZlcnkgY29udGVudCBwYWNrYWdlIGNvbnRhaW5zIGRpZmZlcmVudCB0eXBlcyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyB3aGljaCBhcmUgc29ydGVkIGludG8gZGlmZmVyZW50IGNhdGVnb3JpZXMuIFRoZSBjYXRlZ29yaWVzIGFyZSByb2xlcywgdGFza3MsIHdvcmsgcHJvZHVjdHMsIGFuZCBndWlkYW5jZS48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudC5odG1sIiB0aXRsZT0iT3BlbiBhIE1ldGhvZCBDb250ZW50IEVsZW1lbnQgRWRpdG9yIiBza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgYSBtZXRob2QgZWxlbWVudCwgc3VjaCBhcyBhIHRhc2ssIGFuZCBkb3VibGUgY2xpY2sgdG8gb3BlbiBpdHMgZWRpdG9yLjxici8+PGJyLz5UaGUgZWRpdG9yIHByb3ZpZGVzIHRhYnMgYW5kIGZvcm1zIHRvIG9yZ2FuaXplIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIHRoZSBlbGVtZW50LiAgU2VsZWN0IHRoZSBkaWZmZXJlbnQgdGFicyBhbmQgdGhlIGJvdHRvbSBvZiBldmVyeSBlZGl0b3IgYW5kIHJldmlldyB0aGUgZGlmZmVyZW50IGZvcm1zIGRpc3BsYXllZC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSBocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCIgdGl0bGU9IkV4YW1pbmUgQ2F0ZWdvcmllcyIgc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2l0aGluIHRoZSBsaWJyYXJ5IHZpZXcgdHJlZS1icm93c2VyLCBleHBhbmQgdGhlIHBhY2thZ2VzIHRvIHRoZSBzYW1lIGxldmVsIGFzIGNvbnRlbnQgcGFja2FnZXMgdW50aWwgeW91IGZpbmQgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgYW5kICJTdGFuZGFyZCBDYXRlZ29yaWVzIiBwYWNrYWdlcy4gRHJpbGwgaW50byB0aGVzZSBwYWNrYWdlcyBhbmQgdGhlbiBleGFtaW5lIHRoZWlyIGNvbnRlbnRzLjxici8+PGJyLz5FdmVyeSBjYXRlZ29yeSBsaXN0ZWQgaGVyZSBpcyBhIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsLiAgT3BlbiB0aGUgZGVzY3JpcHRpb24gb2YgYSBjYXRlZ29yeSBzdWNoIGFzIGEgZGlzY2lwbGluZSBvciBhIGRvbWFpbiBieSBkb3VibGUgY2xpY2tpbmcgdGhlIGNhdGVnb3J5IHdoaWNoIG9wZW5zIHRoZSBjYXRlZ29yeSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb252aWV3Lmh0bWwiIHRpdGxlPSJTZWxlY3QgYSBDb25maWd1cmF0aW9uIGZvciB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPkJlY2F1c2UgdGhlIG1ldGhvZCBsaWJyYXJ5IGNhbiBjb250YWluIGxhcmdlIG51bWJlcnMgb2YgZWxlbWVudHMsIHlvdSBtYXkgd2FudCB0byBsaW1pdCB5b3VyIHdvcmsgdG8gYSB1c2VyLWRlZmluZWQgc3Vic2V0IG9mIHRoZSBsaWJyYXJ5IGNhbGxlZCBtZXRob2QgY29uZmlndXJhdGlvbi4gQSBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgaGVscHMgeW91IGxpbWl0IHlvdXIgdmlldyB0byBhIHN1YnNldCBvZiBhbGwgZWxlbWVudHMuIFRoZSBlbGVtZW50cyB0aGF0IGFyZSBwYXJ0IG9mIGEgc2VsZWN0ZWQgY29uZmlndXJhdGlvbiBhcmUgZGlzcGxheWVkIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuPGJyLz48YnIvPlRoZSBjb25maWd1cmF0aW9uIHZpZXcgZGlzcGxheXMgY2F0ZWdvcml6ZWQgbWV0aG9kIGVsZW1lbnRzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gIFRoaXMgaXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBoYXMgYmVlbiBzZWxlY3RlZCBpbiB0aGUgdW5sYWJlbGVkIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIuICBVc2UgdGhpcyBjb21ibyBib3ggdG8gc2VsZWN0IGEgY29uZmlndXJhdGlvbi48YnIvPjxici8+QWZ0ZXIgc2VsZWN0aW5nIGEgY29uZmlndXJhdGlvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGlzIChyZS0pcG9wdWxhdGVkIHdpdGggbmV3IHRyZWVzIHNob3dpbmcgZWxlbWVudHMgZnJvbSB0aGF0IGNvbmZpZ3VyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkRyaWxsIGludG8gQ2F0ZWdvcmllcyBpbiBDb25maWd1cmF0aW9uIFZpZXciIHNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkRyaWxsIGludG8gdGhlIGNvbmZpZ3VyYXRpb24gdmlldydzIGNhdGVnb3JpZXMgZm9sZGVycyBhbmQgZXhhbWluZSB0aGUgZWxlbWVudHMgbGlzdGVkIHRoZXJlLjxici8+PGJyLz5BcyBpbiB0aGUgbGlicmFyeSB2aWV3IHlvdSBjYW4gb3BlbiBlbGVtZW50cyBsaXN0ZWQgaGVyZSB2aWEgYSBkb3VibGUtY2xpY2suIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgY29tcHV0ZXMgc28tY2FsbGVkIGNvbnRyaWJ1dGlvbnMgYW5kIHJlcGxhY2VtZW50cyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyAoc2VlICJWYXJpYWJpbGl0eSBPdmVydmlldyIgaW4gdGhlIG9ubGluZSBoZWxwIGZvciBtb3JlIGRldGFpbHMpLiBJZiBhbiBlbGVtZW50IGhhcyBjb250cmlidXRpbmcgZWxlbWVudHMgdGhlbiBhIGRvdWJsZSBjbGljayB3aWxsIHNob3cgeW91IGEgZGlhbG9nIHdpdGggYWxsIHRoZSBlbGVtZW50cyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBjb250cmlidXRpb24uICBTZWxlY3Qgb25lIGVsZW1lbnQgdG8gb3BlbiBpdHMgZWRpdG9yLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCTxpdGVtIHRpdGxlPSJEb25lIj4KLQkJPGRlc2NyaXB0aW9uLz4KLQk8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL3JlcGxhY2VleGlzdGluZ21ldGhvZGVsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1ZmI2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvcmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJSZXBsYWNlIEV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSkiPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHRhaWxvciBleGlzdGluZyBtZXRob2QgZWxlbWVudHMsIHN1Y2ggYXMgYW4gZWxlbWVudCB0aGF0IGlzIGRlZmluZWQgaW4gYSBsb2NrZWQgcGx1Zy1pbiwgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgaXQsIGJ1dCBieSByZXBsYWNpbmcgaXQgd2l0aCBvbmUgb2YgeW91ciBvd24gZWxlbWVudHMgZGVmaW5lZCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi4gVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgc3VjaCBhIHJlcGxhY2VtZW50LiAgU2VlIHRoZSBvbmxpbmUgaGVscCBzZWN0aW9uICJWYXJpYWJpbGl0eSBPdmVydmlldyIgZm9yIGFuIGludHJvZHVjdGlvbiBvbiB2YXJpYWJpbGl0eSBhbmQgcmVwbGFjZW1lbnRzLjxici8+PGJyLz5SZXBsYWNlbWVudHMgY2FuIGFsc28gYmUgYXBwbGllZCB3aXRoaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4gYmV0d2VlbiBtZXRob2QgY29udGVudCBlbGVtZW50cyBmcm9tIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzLiAgVGhpcyBpcyB1c2VmdWwgaW4gdGhlIGNhc2Ugd2hlcmUgeW91IHdhbnQgdG8gcHJvdmlkZSBhbHRlcm5hdGl2ZSBjb250ZW50IHRoYXQgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIGRpZmZlcmVudCBtZXRob2QgY29uZmlndXJhdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCi0JPGl0ZW0KLQkJdGl0bGU9IlBsYW4geW91ciBSZXBsYWNlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+V2hlbiBkZWZpbmluZyB0aGUgcmVwbGFjZW1lbnQgb2YgYW4gZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnQgeW91IG5lZWQgdG8ga25vdyB3aGVyZSB0aGUgZXhpc3RpbmcgZWxlbWVudCB0aGF0IHlvdSB3YW50IHRvIHJlcGxhY2UgaXMgcGh5c2ljYWxseSBsb2NhdGVkIHdpdGhpbiBpdHMgbWV0aG9kIHBsdWctaW4uIFlvdSBhbHNvIG5lZWQgdG8gZGVjaWRlIHdlcmUgdG8gY3JlYXRlIGFuZCBwbGFjZSB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIFR5cGljYWxseSB5b3UgY3JlYXRlIHRoZSByZXBsYWNpbmcgZWxlbWVudCB3aXRoaW4gYSBzcGVjaWZpYyBjb250ZW50IHBhY2thZ2UgaW4geW91ciBvd24gbWV0aG9kIHBsdWctaW4uIEZpbmFsbHksIHlvdSBuZWVkIHRvIGtub3cgd2hhdCB0aGUgcmVwbGFjaW5nIGVsZW1lbnQncyBjb250ZW50IGlzLCBiZWNhdXNlIGFsbCBvZiB0aGUgcmVwbGFjZWQgZWxlbWVudOKAmXMgY29udGVudCAoaS5lLiBpdHMgdGV4dCBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgaXRzIHJlbGF0aW9uc2hpcHMgdGhhdCBwb2ludCB0byBvdGhlciBlbGVtZW50cykgd2lsbCBiZSByZW1vdmVkLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBhIFJlcGxhY2luZyBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgaW4geW91ciBtZXRob2QgcGx1Zy1pbiB0aGF0IHlvdSBpbnRlbmQgdG8gYmUgdGhlIHJlcGxhY2luZyBjb250ZW50IGVsZW1lbnQuIFJlbWVtYmVyLCB5b3UgbXVzdCBwcm92aWRlIHRoaXMgZWxlbWVudCB3aXRoIGl0cyBvd24gY29udGVudCBiZWNhdXNlIGFsbCBhdHRyaWJ1dGVzIG9mIHRoZSByZXBsYWNlZCBlbGVtZW50IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBlbXB0eSBmaWVsZHMsIGlmIHlvdSBkbyBub3QgcHJvdmlkZSBuZXcgZGVzY3JpcHRpb25zLjxici8+PGJyLz5HbyB0byBjaGVhdCBzaGVldCAiQWRkIGEgbmV3IE1ldGhvZCBDb250ZW50IHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzLCBvciBHdWlkYW5jZSIgdG8gYmUgZ3VpZGVkIHRocm91Z2ggdGhlc2Ugc3RlcHMuPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcmVwbGFjZS5odG1sIiAKLQkJdGl0bGU9IlNwZWNpZnkgdGhlIFJlcGxhY2VtZW50IFJlbGF0aW9uc2hpcCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+R28gdG8gdGhlICJDb250ZW50IFZhcmlhYmlsaXR5IiBzZWN0aW9uIG9mIHRoZSBlbGVtZW50cyBkZXNjcmlwdGlvbiB0YWIuIFNlbGVjdCAiUmVwbGFjZXMiIGZyb20gdGhlIGNvbWJvIGJveC4gQ2xpY2sgdGhlICJTZWxlY3QuLi4iIGJ1dHRvbiBvZiB0aGUgYmFzZSByb2xlIGZpZWxkIGFuZCBzZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCB5b3VyIG5ldyBlbGVtZW50IHJlcGxhY2VzLjwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiIAotCQl0aXRsZT0iUmV2aWV3IHlvdXIgUmVwbGFjZWQgRWxlbWVudCIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+VG8gcmV2aWV3IHlvdXIgcmVwbGFjZWQgZWxlbWVudCwgc2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBjb21ibyBib3ggaW4gdGhlIHRvb2wgYmFyIHRoYXQgY29udGFpbnMgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgY29udGVudCBwYWNrYWdlcyBvZiBib3RoIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4geW91ciByZXBsYWNlbWVudC4gSW4gb3RoZXIgd29yZHMsIHRoZSBjb25maWd1cmF0aW9uIG11c3QgY29udGFpbiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgYXMgd2VsbCBhcyB0aGUgcmVwbGFjZWQgYmFzZSBlbGVtZW50Ljxici8+PGJyLz5Td2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlLiBGaW5kIGFuZCBzZWxlY3QgdGhlIHJlcGxhY2luZyBlbGVtZW50IChpLmUuIHlvdXIgbmV3IGVsZW1lbnQpIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFRoZSBjb250ZW50IHdpbmRvdyBkaXNwbGF5cyB0aGUgcmVzdWx0cyBvZiB0aGUgcmVwbGFjZW1lbnQuIFJldmlldyBhbiBlbGVtZW50IHRoYXQgcmVmZXJyZWQgdG8gdGhlIHJlcGxhY2VkIGVsZW1lbnQuIEluIG90aGVyIHdvcmRzLCBpZiB5b3UgcmVwbGFjZWQgYW4gYXJ0aWZhY3QsIGZpbmQgYSB0YXNrIHRoYXQgdXNlZCB0aGlzIGFydGlmYWN0IGFzIGFuIGlucHV0IG9yIG91dHB1dC4gTWFrZSBzdXJlIHRoaXMgZWxlbWVudCBub3cgcmVmZXJzIHRvIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRG9uZSI+PGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+PC9pdGVtPgotPC9jaGVhdHNoZWV0PgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY2hlYXRzaGVldHMvdGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZjcyNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NoZWF0c2hlZXRzL3RhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxjaGVhdHNoZWV0IHRpdGxlPSJUYWlsb3IgRXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlKSBVc2luZyBDb250cmlidXRpb24iPgotCi0JPGludHJvIAotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCI+Ci0JCTxkZXNjcmlwdGlvbj5Zb3UgY2FuIHRhaWxvciBleGlzdGluZyBtZXRob2QgZWxlbWVudHMsIHN1Y2ggYXMgYW4gZWxlbWVudCB0aGF0IGlzIGRlZmluZWQgaW4gYSBsb2NrZWQgbWV0aG9kIHBsdWctaW4sIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIGl0LCBidXQgYnkgY29udHJpYnV0aW5nIG5ldyBjb250ZW50IG9yIHJlbGF0aW9uc2hpcHMgdG8gaXQgZnJvbSBhbiBlbGVtZW50IGRlZmluZWQgaW4gb25lIG9mIHlvdXIgb3duIG1ldGhvZCBwbHVnLWlucy4gVGhpcyBjaGVhdCBzaGVldCB3YWxrcyB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgb2YgY3JlYXRpbmcgc3VjaCBhIGNvbnRyaWJ1dGlvbi4gIFNlZSB0aGUgb25saW5lIGhlbHAgc2VjdGlvbiAiVmFyaWFiaWxpdHkgT3ZlcnZpZXciIGZvciBhbiBpbnRyb2R1Y3Rpb24gb24gdmFyaWFiaWxpdHkgYW5kIGNvbnRyaWJ1dGlvbnMuPGJyLz48YnIvPkNvbnRyaWJ1dGlvbnMgY2FuIGFsc28gYmUgYXBwbGllZCB3aXRoaW4gdGhlIHNhbWUgbWV0aG9kIHBsdWctaW4gYmV0d2VlbiBlbGVtZW50cyBmcm9tIGRpZmZlcmVudCBjb250ZW50IHBhY2thZ2VzLiBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgZXZlbnQgeW91IHdhbnQgdG8gYnVpbGQgdXAgeW91ciBjb250ZW50IGVsZW1lbnRzIGluIGxheWVycyBvZiBjb21wbGV4aXR5IGJ5IGdyYWR1YWxseSBhZGRpbmcgbW9yZSBhbmQgbW9yZSBjb250ZW50IHZpYSBjb250cmlidXRpb24uICBUaGUgcmVzcGVjdGl2ZSBsZXZlbHMgb2YgY29udHJpYnV0aW9uIGNhbiB0aGVuIGJlIHNlbGVjdGVkIHdpdGhpbiBtZXRob2QgY29uZmlndXJhdGlvbnMgdGhhdCBhbGxvdyB5b3UgdG8gaW5jbHVkZSBvciBleGNsdWRlIHRoZSBjb250ZW50IHBhY2thZ2VzIHdpdGggdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0KLQk8aXRlbQotCQl0aXRsZT0iUGxhbiB5b3VyIENvbnRyaWJ1dGlvbiIKLQkJc2tpcD0iZmFsc2UiPgotCQk8ZGVzY3JpcHRpb24+QmVmb3JlIHlvdSBjYW4gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGFuIGV4aXN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgeW91IG5lZWQgdG8ga25vdyB3aGVyZSB0aGlzIGVsZW1lbnQgaXMgbG9jYXRlZCB3aXRoaW4gaXRzIG1ldGhvZCBwbHVnLWluLiBZb3UgYWxzbyBuZWVkIHRvIGRlY2lkZSB3aGVyZSB0byBjcmVhdGUgYW5kIHBsYWNlIHRoZSBjb250cmlidXRpbmcgZWxlbWVudC4gVHlwaWNhbGx5LCB5b3UgY3JlYXRlIHRoaXMgZWxlbWVudCBpbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbiwgaW4gYSBzcGVjaWZpYyBjb250ZW50IHBhY2thZ2UuIEZpbmFsbHksIHlvdSBuZWVkIHRvIGtub3cgd2hhdCBpdCBpcyB5b3UgYWN0dWFsbHkgd2FudCB0byBjb250cmlidXRlLiBUaGlzIGNvdWxkIGJlIGFkZGl0aW9uYWwgdGV4dCBmb3IgdGhlIGZvcm0gZmllbGRzLCBuZXcgcmVsYXRpb25zaGlwcyB0byBvdGhlciBlbGVtZW50cywgb3IgbmV3IGNhdGVnb3JpemF0aW9ucy4gKFNlZSB0aGUgb25saW5lIGhlbHAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGVzZSBmaWVsZHMgYW5kIHJlbGF0aW9uc2hpcHMuKTwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotCi0JPGl0ZW0KLQkJaHJlZj0iL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIKLQkJdGl0bGU9IkNyZWF0ZSBhIENvbnRyaWJ1dGluZyBDb250ZW50IEVsZW1lbnQiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhIGNvbnRlbnQgZWxlbWVudCBpbiB5b3VyIG1ldGhvZCBwbHVnLWluIHRoYXQgcHJvdmlkZXMgY29udHJpYnV0aW9ucyB0byB0aGUgY29udGVudCBlbGVtZW50IHRoYXQgeW91IHdpc2ggdG8gdGFpbG9yLiAgR28gdG8gdGhlIGNoZWF0IHNoZWV0ICJBZGQgYSBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMsIG9yIEd1aWRhbmNlIiB0byBiZSBndWlkZWQgdGhyb3VnaCB0aGVzZSBzdGVwcy48YnIvPjxici8+QWRkIHlvdXIgY29udHJpYnV0aW9ucyBzdWNoIGFzIHJldmlzZWQgdGV4dCBmb3IgZm9ybSBmaWVsZHMgb3IgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIHRvIHlvdXIgbWV0aG9kIGNvbnRlbnQgZWxlbWVudC48L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQotCTxpdGVtCi0JCWhyZWY9Ii9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sIiAKLQkJdGl0bGU9IlNwZWNpZnkgdGhlIENvbnRyaWJ1dGlvbiBSZWxhdGlvbnNoaXAiCi0JCXNraXA9ImZhbHNlIj4KLQkJPGRlc2NyaXB0aW9uPkdvIHRvIHRoZSAiQ29udGVudCBWYXJpYWJpbGl0eSIgc2VjdGlvbiBvZiB0aGUgZWxlbWVudHMgZGVzY3JpcHRpb24gdGFiLiBTZWxlY3QgIkNvbnRyaWJ1dGVzIiBmcm9tIHRoZSBjb21ibyBib3guIENsaWNrIHRoZSAiU2VsZWN0Li4uIiBidXR0b24gb2YgdGhlIGJhc2Ugcm9sZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgdGhlIGVsZW1lbnQgdGhhdCB5b3Ugd2FudCB5b3VyIG5ldyBlbGVtZW50IHRvIGNvbnRyaWJ1dGUgdG8uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0KLQk8aXRlbQotCQlocmVmPSIvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgCi0JCXRpdGxlPSJSZXZpZXcgeW91ciBDb250cmlidXRpb25zIgotCQlza2lwPSJmYWxzZSI+Ci0JCTxkZXNjcmlwdGlvbj5UbyByZXZpZXcgeW91ciBjb250cmlidXRpb25zIHNlbGVjdCAob3IgY3JlYXRlIGZpcnN0IGFuZCB0aGVuIHNlbGVjdCkgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbWJvIGJveCBpbiB0aGUgdG9vbCBiYXIgdGhhdCBjb250YWlucyB0aGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIG9mIGJvdGggb2YgdGhlIGVsZW1lbnRzIHBhcnRpY2lwYXRpbmcgaW4geW91ciBjb250cmlidXRpb24uICBJbiBvdGhlciB3b3JkcyB0aGUgY29uZmlndXJhdGlvbiBoYXMgdG8gY29udGFpbiB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQgYXMgd2VsbCBhcyB0aGUgYmFzZSBlbGVtZW50Ljxici8+PGJyLz5Td2l0Y2ggdG8gdGhlICJCcm93c2luZyBQZXJzcGVjdGl2ZSIuIEZpbmQgYW5kIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IChpLmUuIHRoZSBlbGVtZW50IHlvdSBjb250cmlidXRlZCB0bykgaW4gdGhlIGNvbmZpZ3VyYXRpb24gdmlldy4gVGhlIGNvbnRlbnQgd2luZG93IGRpc3BsYXlzIHRoZSByZXN1bHRzIG9mIHRoZSBjb250cmlidXRpb24uPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+CQotCTxpdGVtIHRpdGxlPSJEb25lIj48ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb2RlX21hbmFnZW1lbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjMyYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvZGVfbWFuYWdlbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHRvYyBsYWJlbD0iU3VwcG9ydCBmb3IgY29kZSBtYW5hZ2VtZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjb2RlX21hbmFnZW1lbnRfaWQiPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBDVlMiIGhyZWY9Imh0bWwvaGVscC9jbV9jdnMuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBvcnQgZm9yIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC9oZWxwL2NtX3JhdGlvbmFsY2MuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJTdXBwb3J0IGZvciBSYXRpb25hbCBDQ1JDIiBocmVmPSJodG1sL2hlbHAvY21fY2NyYy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY29uY2VwdHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTg4MWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb25jZXB0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJtYWluLnhtbCNjb25jZXB0c19pZCI+Ci0gICA8dG9waWMgbGFiZWw9Ik92ZXJ2aWV3IG9mIEVQRiBDb21wb3NlciIgaHJlZj0iaHRtbC9vdmVydmlldy9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L21ldGhvZF9jb250ZW50X2F1dGhvcmluZ19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L3Byb2Nlc3NfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbmZpZ3VyYXRpb25zIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L21ldGhvZF9jb25maWd1cmF0aW9uc19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlVzZXIgcm9sZXMgYW5kIHJvbGUgc3BlY2lmaWMgdGFza3MiIGhyZWY9Imh0bWwvaGVscC91c2VyX3JvbGVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9tZXRob2RfY29udGVudC5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19TZWFyY2gueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0N2I4MDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX1NlYXJjaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgIGlkPSJvcGVuX3NlYXJjaF9kaWFsb2dfYWN0aW9uX2NvbnRleHQiID4KLSAgICAgIAk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLSAJCTx0b3BpYyBsYWJlbD0iU2VhcmNoIGZvciBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL3NlYXJjaGZvcm1ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIAk8L2NvbnRleHQ+Ci0KLSAgIAk8Y29udGV4dCAgaWQ9ImZpbGVfc2VhcmNoX2FjdGlvbl9jb250ZXh0IiA+Ci0gICAgIAkgPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+Ci0gCQk8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9zZWFyY2hmb3JtZXRob2RfY29udGVudC5odG1sIi8+Ci0gICAJPC9jb250ZXh0PgotICAgCQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jb250ZXh0c19hdXRob3JpbmdfdWkueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOWYxMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NvbnRleHRzX2F1dGhvcmluZ191aS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08Y29udGV4dHM+IAotCTxjb250ZXh0ICBpZD0iZmlsZV9uZXdfbGlicmFyeV9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X292ZXJ2aWV3Lmh0bWwiICBsYWJlbD0iTWV0aG9kIGxpYnJhcnkgb3ZlcnZpZXciLz4gIAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX25ld19wbHVnaW5fY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9wbHVnaW4uaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9uZXdfY29uZmlndXJhdGlvbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZmlsZV9vcGVuX2xpYnJhcnlfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbGlicmFyeV9vdmVydmlldy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmaWxlX29wZW5fY29uZmlndXJhdGlvbl9jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0ibGlicmFyeV9uYXZpZ2F0b3Jfdmlld19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbGlicmFyeV92aWV3Lmh0bWwiICBsYWJlbD0iTGlicmFyeSB2aWV3Ii8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIiAgbGFiZWw9IkF1dGhvcmluZyBwZXJzcGVjdGl2ZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX3ZpZXdfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29uZmlndXJhdGlvbl92aWV3Lmh0bWwiICBsYWJlbD0iQ29uZmlndXJhdGlvbiB2aWV3Ii8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCIgIGxhYmVsPSJCcm93c2luZyBwZXJzcGVjdGl2ZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQkJPCEtLSBiZWdpbm5pbmcgb2YgdGhlIGxpYnJhcnkgbmF2aWdhdG9yIG5vZGUgc2Vuc2l0aXZlIEYxIGNvbnRleHQgaGVscHMgLS0+Ci0JCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19tZXRob2RfcGx1Z2luX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIHBsdWctaW4gbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2NvbnRlbnRfcGFja2FnZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IENvbnRlbnRQYWNrYWdlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld190YXNrX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgbWV0aG9kIFRhc2sgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3dvcmtfcHJvZHVjdF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFdvcmtQcm9kdWN0IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19ndWlkYW5jZV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IEd1aWRhbmNlIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19kaXNjaXBsaW5lX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRGlzY2lwbGluZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IERpc2NpcGxpbmVHcm91cGluZyBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfZG9tYWluX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgRG9tYWluIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImxpYnJhcnlfdmlld19yb2xlX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUm9sZSBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfd29ya19wcm9kdWN0X3R5cGVfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBXb3JrUHJvZHVjdFR5cGUgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcm9sZV9zZXRfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGxpYnJhcnkgdmlldyBSb2xlU2V0IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQotCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfdG9vbF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IG1ldGhvZCBUb29sIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3JvbGVfc2V0X2dyb3VwaW5nX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUm9sZVNldEdyb3VwaW5nIG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IEN1c3RvbUNhdGVnb3J5IG5vZGUuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X3Byb2Nlc3NfY29tcG9uZW50X2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgUHJvY2Vzc0NvbXBvbmVudCBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJsaWJyYXJ5X3ZpZXdfcHJvY2Vzc19jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgbGlicmFyeSB2aWV3IFByb2Nlc3Mgbm9kZS48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCQotCQkJCTxjb250ZXh0ICBpZD0ibGlicmFyeV92aWV3X21ldGhvZF9jb25maWd1cmF0aW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBsaWJyYXJ5IHZpZXcgTWV0aG9kQ29uZmlndXJhdGlvbiBub2RlLjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJPCEtLSBlbmQgb2YgdGhlIGxpYnJhcnkgbmF2aWdhdG9yIG5vZGUgc2Vuc2l0aXZlIEYxIGNvbnRleHQgaGVscHMgLS0+Ci0JCi0JCi0JPCEtLSBmb3JtIGVkaXRvciBzZWN0aW9uIGNvbnRleHQgaGVscCAtLT4KLQkKLQk8Y29udGV4dCAgaWQ9InBsdWdpbl9lZGl0b3JfZGVzY3JpcHRpb25fYWxsX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPiA8L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZHBsdWdpbi5odG1sIiAgbGFiZWw9Ik1ldGhvZCBwbHVnLWluIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX2VkaXRvcl9hbGxfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb25maWd1cmF0aW9uLmh0bWwiICBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMgb3ZlcnZpZXciLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImNvbnRlbnRfcGFja2FnZV9lZGl0b3JfYWxsX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jb250ZW50cGFja2FnZS5odG1sIiAgbGFiZWw9IkNyZWF0aW5nIGEgY29udGVudCBwYWNrYWdlIi8+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgcGFja2FnZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3JvbGVfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3Rhc2tfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHRhc2siLz4gIAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl93b3JrX3Byb2R1Y3RfY29udGV4dF9oZWxwX0lEIj4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIgIGxhYmVsPSJDcmVhdGUgd29yayBwcm9kdWN0Ii8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9ndWlkYW5jZV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIiAgbGFiZWw9IkNyZWF0aW5nIGd1aWRhbmNlIi8+IAotCTwvY29udGV4dD4gCi0KLQk8Y29udGV4dCAgaWQ9ImVkaXRvcl9kaXNjaXBsaW5lX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfZGlzY2lwbGluZV9ncm91cGluZ19jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2RvbWFpbl9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3dvcmtfcHJvZHVjdF90eXBlX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX3JvbGVfc2V0X2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3Jfcm9sc2Vfc2V0X2dyb3VwaW5nX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiICBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgY2F0ZWdvcmllcyIvPiAKLQk8L2NvbnRleHQ+IAotCi0JPGNvbnRleHQgIGlkPSJlZGl0b3JfdG9vbF9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2N1c3RvbV9jYXRlZ29yeV9jb250ZXh0X2hlbHBfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2NvbnRlbnRfY2F0ZWdvcmllcy5odG1sIiAgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQkJCTwhLS0gYmVnaW5uaW5nIG9mIHNlY3Rpb24gYmFzZWQgRjEgY29udGV4dCBoZWxwIC0tPgotCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9nZW5lcmFsX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2RldGFpbF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZGV0YWlsX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX25vdGF0aW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl9ub3RhdGlvbl9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl90YWlsb3JpbmdfY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX3RhaWxvcmluZ19jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQkJPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQiPiAKLQkJCQk8ZGVzY3JpcHRpb24+IFRoaXMgaXMgYSBzYW1wbGUgRjEgaGVscCB0ZXh0IGZvciBmb3JtX2VkaXRvcl9kZXNjcmlwdGlvbl92ZXJzaW9uX2NvbnRleHQuPC9kZXNjcmlwdGlvbj4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9tYWludG9waWMuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMxIi8+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvc3VidG9waWMyLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMiIvPiAKLQkJCTwvY29udGV4dD4gCi0JCQkKLQkJCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0Ij4gCi0JCQkJPGRlc2NyaXB0aW9uPiBUaGlzIGlzIGEgc2FtcGxlIEYxIGhlbHAgdGV4dCBmb3IgZm9ybV9lZGl0b3JfZGVzY3JpcHRpb25fZWxlbWVudF9jb250ZXh0LjwvZGVzY3JpcHRpb24+IAotCQkgICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvbWFpbnRvcGljLmh0bWwiICBsYWJlbD0iSGVscFRvcGljMSIvPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3N1YnRvcGljMi5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzIiLz4gCi0JCQk8L2NvbnRleHQ+IAotCQkJCi0JCQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2ljb25fY29udGV4dCI+IAotCQkJCTxkZXNjcmlwdGlvbj4gVGhpcyBpcyBhIHNhbXBsZSBGMSBoZWxwIHRleHQgZm9yIGZvcm1fZWRpdG9yX2Rlc2NyaXB0aW9uX2ljb25fY29udGV4dC48L2Rlc2NyaXB0aW9uPiAKLQkJICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL21haW50b3BpYy5odG1sIiAgbGFiZWw9IkhlbHBUb3BpYzEiLz4gCi0JCSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9zdWJ0b3BpYzIuaHRtbCIgIGxhYmVsPSJIZWxwVG9waWMyIi8+IAotCQkJPC9jb250ZXh0PiAKLQkJCTwhLS0gZW5kIG9mIHNlY3Rpb24gYmFzZWQgRjEgY29udGV4dCBoZWxwIC0tPgotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2NwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0JCTx0b3BpYyBocmVmPSJodG1sL2hlbHAvY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIgIGxhYmVsPSJDYXBhYmlsaXR5IHBhdHRlcm4iLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIiAgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZWRpdG9yX2RwX2Rlc2NyaXB0aW9uX2NvbnRleHRfaGVscF9JRCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0JCTx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGVsaXZlcnlfcHJvY2Vzcy5odG1sIiAgbGFiZWw9IkRlbGl2ZXJ5IHByb2Nlc3MiLz4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIgIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIi8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJmb3JtX2VkaXRvcl9wcm9jZXNzX3dic19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dicy5odG1sIiAgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiLz4gCi0JPC9jb250ZXh0PiAKLQkKLQk8Y29udGV4dCAgaWQ9ImZvcm1fZWRpdG9yX3Byb2Nlc3Nfb2JzX2NvbnRleHQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIgIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCQotCTxjb250ZXh0ICBpZD0iZm9ybV9lZGl0b3JfcHJvY2Vzc19wYnNfY29udGV4dCI+IAotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4gCi0gICAgICAgIDx0b3BpYyBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIgIGxhYmVsPSJEZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSIvPiAKLQk8L2NvbnRleHQ+IAotCi0JCi0JPGNvbnRleHQgIGlkPSJjb25maWd1cmF0aW9uX3B1Ymxpc2hfd2l6YXJkX2FsbF9wYWdlc19jb250ZXh0Ij4gCi0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCIgIGxhYmVsPSJQdWJsaXNoaW5nIG92ZXJ2aWV3Ii8+IAotCTwvY29udGV4dD4gCi0JCi0JPGNvbnRleHQgIGlkPSJyaWNoX3RleHRfZWRpdG9yX2NvbnRleHRfSUQiPiAKLQkJPGRlc2NyaXB0aW9uPjwvZGVzY3JpcHRpb24+IAotICAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9oZWxwL3JpY2h0ZXh0ZWRpdG9yLmh0bWwiICBsYWJlbD0iUmljaCB0ZXh0IGVkaXRvciIvPiAKLSAgICAgICAgPHRvcGljIGhyZWY9Imh0bWwvaGVscC9hZGRfaHlwZXJsaW5rLmh0bWwiICBsYWJlbD0iQWRkaW5nIGEgcmVmZXJlbmNlIG9yIGh5cGVybGluayIvPiAKLQk8L2NvbnRleHQ+IAotCQotPC9jb250ZXh0cz4gCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRlcmV1c2FibGVtZXRob2Rjb250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGVlZmI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGVyZXVzYWJsZW1ldGhvZGNvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0ZXJldXNhYmxlbWV0aG9kY29udGVudF9pZCI+Ci0gIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL2hlbHAvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL21ldGhvZF9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIG1ldGhvZCBjb250ZW50IiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX21ldGhvZF9jb250ZW50Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByb2xlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3JvbGUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB0YXNrIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX3Rhc2suaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSB3b3JrIHByb2R1Y3QiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgZ3VpZGFuY2UiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZ3VpZGFuY2UuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5Lmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJDb250cmlidXRlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2NvbnRyaWJ1dGVzLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2V4dGVuZHMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlcyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X3JlcGxhY2UuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJWYXJpYWJpbGl0eSBhc3NvY2lhdGlvbnMiIGhyZWY9Imh0bWwvaGVscC92YXJpYWJpbGl0eV9hc3NvY2lhdGlvbnMuaHRtbCIvPgotICAgICAgPC90b3BpYz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgcHJldmlldyBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC9oZWxwL2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9jcmVhdGluZ19tZXRob2RfY29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxY2JiNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX21ldGhvZF9jb250ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9IkNyZWF0aW5nIHJldXNhYmxlIG1ldGhvZCBjb250ZW50IiBsaW5rX3RvPSJtYWluLnhtbCNjcmVhdGluZ19tZXRob2RfY29udGVudF9pZCI+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBNZXRob2QgQ29udGVudCIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBSb2xlIiBocmVmPSJodG1sL3RvcGljcy90X2NyZWF0ZV9yb2xlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgVGFzayIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIFdvcmsgUHJvZHVjdCIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfd29ya3Byb2R1Y3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgR3VpZGFuY2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX2d1aWRhbmNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iR3VpZGFuY2UgUmVsYXRpb25zaGlwcyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9ndWlkYW5jZV9yZWxhdGlvbnNoaXBzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUmljaCBUZXh0IEVkaXRvciIgaHJlZj0iaHRtbC90b3BpY3MvY19yaWNodGV4dF9lZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIiBocmVmPSJodG1sL3RvcGljcy90X2FkZF9oeXBlcmxpbmsuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgQ29udGVudCBWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC90b3BpY3MvY192YXJpYWJpbGl0eS5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZXMgVmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5X2V4dGVuZHMuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJSZXBsYWNlcyBWYXJpYWJpbGl0eSIgaHJlZj0iaHRtbC90b3BpY3MvY192YXJpYWJpbGl0eV9yZXBsYWNlcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkV4dGVuZHMgYW5kIHJlcGxhY2VzIHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX3ZhcmlhYmlsaXR5X2V4dGVuZF9yZXBsYWNlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb25zIEltcGFjdGVkIGJ5IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9yX3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIFZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcHMiIGhyZWY9Imh0bWwvdG9waWNzL3RfdmFyaWFiaWxpdHlfYnJvd3NpbmcuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iQnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50IiBocmVmPSJodG1sL3RvcGljcy90X2Jyb3dzZV9jb250ZW50Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgSW5kZXggRW50cmllcyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9pbmRleF9zeW50YXguaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDaGFuZ2luZyBUaGUgRmVlZGJhY2sgQWRkcmVzcyIgaHJlZj0iaHRtbC90b3BpY3MvY19jaGFuZ2luZ19mZWVkYmFjay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldlYiBTaXRlIFNlYXJjaCIgaHJlZj0iaHRtbC90b3BpY3MvY19zaXRlX3NlYXJjaC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikdsb3NzYXJ5IGVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL2NfZ2xvc3NhcnkuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIEdsb3NzYXJ5IEVudHJpZXMiIGhyZWY9Imh0bWwvdG9waWNzL3RfZ2xvc3NhcnlfY3JlYXRlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRWRpdGluZyBHbG9zc2FyeSBFbnRyaWVzIiBocmVmPSJodG1sL3RvcGljcy90X2dsb3NzYXJ5X2VkaXQuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJEZWxldGluZyBHbG9zc2FyeSBFbnRyaWVzIiBocmVmPSJodG1sL3RvcGljcy90X2dsb3NzYXJ5X2RlbGV0ZS5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDb3B5cmlnaHQgbm90aWNlcyIgaHJlZj0iaHRtbC90b3BpY3MvY19jb3B5cmlnaHQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNvcHlyaWdodCBOb3RpY2VzIGluIGEgTmV3IFBsdWctSW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY29weXJpZ2h0X25ld19wbHVnaW4uaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDaGFuZ2luZyB0aGUgRGVmYXVsdCBDb3B5cmlnaHQgTm90aWNlIiBocmVmPSJodG1sL3RvcGljcy90X2NvcHlyaWdodF9jaGFuZ2luZ19kZWZhdWx0Lmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iT3ZlcnJpZGluZyB0aGUgQ29weXJpZ2h0IE5vdGljZSBpbiBhIFBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY29weXJpZ2h0X292ZXJyaWRpbmdfZGVmYXVsdC5odG1sIi8+Ci0gICA8L3RvcGljPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5nX3Byb2Nlc3Nlcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOWY0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iQ3JlYXRpbmcgcHJvY2Vzc2VzIiBsaW5rX3RvPSJtYWluLnhtbCNjcmVhdGluZ19wcm9jZXNzZXNfaWQiPiAgCi0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcmV1c2FibGUgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL3RvcGljcy90X2NhcGFiaWxpdHlfcGF0dGVybl9jcmVhdGUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvdG9waWNzL3RfZGV2ZWxvcF93YnMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB0ZWFtIGFsbG9jYXRpb24gc3RydWN0dXJlIiBocmVmPSJodG1sL3RvcGljcy90X2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIiBocmVmPSJodG1sL3RvcGljcy90X2RldmVsb3Bfd29ya3Byb2R1Y3Rfc3RydWN0dXJlLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJBcHBseWluZyBjYXBhYmlsaXR5IHBhdHRlcm5zIiBocmVmPSJodG1sL3RvcGljcy9jX2NhcGFiaWxpdHlfcGF0dGVybi5odG1sIj4KLSAgICA8dG9waWMgbGFiZWw9IkNvcHlpbmcgYSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvdG9waWNzL3RfY2FwYWJpbGl0eV9wYXR0ZXJuX2NvcHkuaHRtbCIvPgotICAgIDx0b3BpYyBsYWJlbD0iRXh0ZW5kaW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL3RvcGljcy90X2NhcGFiaWxpdHlfcGF0dGVybl9leHRlbmQuaHRtbCIvPgotICAgIDx0b3BpYyBsYWJlbD0iRGVlcCBjb3B5aW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL3RvcGljcy90X2NhcGFiaWxpdHlfcGF0dGVybl9kZWVwX2NvcHkuaHRtbCIvPgotICAgIDwvdG9waWM+Ci0gIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvY19wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGFjdGl2aXR5IHZhcmlhYmlsaXR5IiBocmVmPSJodG1sL3RvcGljcy9jX2FjdGl2aXR5X3ZhcmlhYmlsaXR5Lmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJVc2luZyBwcm9jZXNzIHRvIG1ldGhvZCBzeW5jaHJvbml6YXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfdXNpbmdfc3luY2hyb25pemF0aW9uLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggcHJvY2VzcyBkaWFncmFtcyIgaHJlZj0iaHRtbC90b3BpY3MvY19wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC90b3BpY3MvY19hY3Rpdml0eV9kaWFncmFtcy5odG1sIi8+Ci0gICAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyIgaHJlZj0iaHRtbC90b3BpY3MvY19hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbXMuaHRtbCIvPgotICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2NyZWF0aW5ncHJvY2Vzc2VzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYzdiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvY3JlYXRpbmdwcm9jZXNzZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJDcmVhdGluZyBQcm9jZXNzZXMiIGxpbmtfdG89Im1haW4ueG1sI2NyZWF0aW5ncHJvY2Vzc2VzX2lkIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNhcGFiaWxpdHkgcGF0dGVybiIgaHJlZj0iaHRtbC9oZWxwL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfZGVsaXZlcnlfcHJvY2Vzcy5odG1sIj4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGVsaXZlcnkgcHJvY2VzcyIgaHJlZj0iaHRtbC9oZWxwL2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHRlYW0gYWxsb2NhdGlvbiBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3RlYW1fc3RydWN0dXJlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgcHJvZHVjdCB1c2FnZSBzdHJ1Y3R1cmUiIGhyZWY9Imh0bWwvaGVscC9kZXZlbG9wX3dvcmtwcm9kdWN0X3N0cnVjdHVyZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvYXBwbHlfY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcm9jZXNzIGVsZW1lbnQgcHJvcGVydGllcyB2aWV3IiBocmVmPSJodG1sL2hlbHAvcHJvcGVydGllc192aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3MgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kaWFncmFtcy5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9hY3Rpdml0eV9kZXRhaWxfZGlhZ3JhbXMuaHRtbCIvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdfc3RhcnRlZC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ19zdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0NWMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ19zdGFydGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9IkdldHRpbmcgc3RhcnRlZCIgbGlua190bz0ibWFpbi54bWwjZ2V0dGluZ19zdGFydGVkX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iVXNlciBJbnRlcmZhY2UgUmVmZXJlbmNlIiBocmVmPSJodG1sL3RvcGljcy9yX3VzZXJfaW50ZXJmYWNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQXV0aG9yaW5nIFBlcnNwZWN0aXZlIiBocmVmPSJodG1sL3RvcGljcy9jX2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIFBlcnNwZWN0aXZlIiBocmVmPSJodG1sL3RvcGljcy9jX2Jyb3dzaW5nX3BlcnNwZWN0aXZlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ29uZmlndXJhdGlvbiB2aWV3IiBocmVmPSJodG1sL3RvcGljcy9jX2NvbmZpZ3VyYXRpb25fdmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudCIgaHJlZj0iaHRtbC90b3BpY3MvdF9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQiIGhyZWY9Imh0bWwvdG9waWNzL3Rfc2VhcmNoX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBNZXRob2QgUGx1Zy1pbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfbWV0aG9kX3BsdWdpbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jcmVhdGVfY29udGVudF9wYWNrYWdlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBOZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfbWV0aG9kX2NvbmZpZ3VyYXRpb25fbmV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgQSBDb3B5IG9mIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfbWV0aG9kX2NvbmZpZ3VyYXRpb25fY29weS5odG1sIi8+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ3N0YXJ0ZWQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dldHRpbmdzdGFydGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMTdlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2V0dGluZ3N0YXJ0ZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiIGxpbmtfdG89Im1haW4ueG1sI2dldHRpbmdzdGFydGVkX2lkIj4KLSAgPHRvcGljIGxhYmVsPSJNZXRob2QgbGlicmFyeSBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL2xpYnJhcnlfb3ZlcnZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJUb29sIGludGVyZmFjZSIgaHJlZj0iaHRtbC9oZWxwL3VzZXJpbnRlcmZhY2Vfb3ZlcnZpZXcuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkF1dGhvcmluZyBwZXJzcGVjdGl2ZSIgaHJlZj0iaHRtbC9oZWxwL2F1dGhvcmluZ19wZXJzcGVjdGl2ZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIHBlcnNwZWN0aXZlIiBocmVmPSJodG1sL2hlbHAvYnJvd3NpbmdfcGVyc3BlY3RpdmUuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJDb25maWd1cmF0aW9uIFZpZXciIGhyZWY9Imh0bWwvaGVscC9jb25maWd1cmF0aW9uX3ZpZXcuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJMaWJyYXJ5IHZpZXciIGhyZWY9Imh0bWwvaGVscC9saWJyYXJ5X3ZpZXcuaHRtbCIvPgotICAgICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IlNlYXJjaCBmb3IgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9zZWFyY2hfY29udGVudC5odG1sIi8+Ci0gICA8L3RvcGljPgotICAgICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBtZXRob2QgcGx1Zy1pbiIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9tZXRob2RfcGx1Z2luLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY29udGVudCBwYWNrYWdlIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2NvbnRlbnRwYWNrYWdlLmh0bWwiLz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbmZpZ3VyYXRpb24uaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2xvc3NhcnkueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2dsb3NzYXJ5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwZGY3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvZ2xvc3NhcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPHRvYyBsYWJlbD0iR2xvc3NhcnkiIGxpbmtfdG89Im1haW4ueG1sI2dsb3NzYXJ5X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iQWN0aXZpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2dfYWN0aXZpdHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBcnRpZmFjdCIgaHJlZj0iaHRtbC90b3BpY3MvZ19hcnRpZmFjdC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNoZWNrbGlzdCIgaHJlZj0iaHRtbC90b3BpY3MvZ19jaGVja2xpc3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJDb25jZXB0IiBocmVmPSJodG1sL3RvcGljcy9nX2NvbmNlcHQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZWVwIGNvcHkiIGhyZWY9Imh0bWwvdG9waWNzL2dfZGVlcF9jb3B5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRGVsaXZlcmFibGUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZGVsaXZlcmFibGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL3RvcGljcy9nX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEaXNjaXBsaW5lIiBocmVmPSJodG1sL3RvcGljcy9nX2Rpc2NpcGxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJEb21haW4iIGhyZWY9Imh0bWwvdG9waWNzL2dfZG9tYWluLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXN0aW1hdGluZyBjb25zaWRlcmF0aW9ucyIgaHJlZj0iaHRtbC90b3BpY3MvZ19lc3RpbWF0aW5nX2NvbnNpZGVyYXRpb25zLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRXN0aW1hdGluZyBndWlkZWxpbmUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZXN0aW1hdGluZ19ndWlkZWxpbmUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJFeGFtcGxlIiBocmVmPSJodG1sL3RvcGljcy9nX2V4YW1wbGUuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJHdWlkZWxpbmUiIGhyZWY9Imh0bWwvdG9waWNzL2dfZ3VpZGVsaW5lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iSXRlcmF0aW9uIiBocmVmPSJodG1sL3RvcGljcy9nX2l0ZXJhdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkxpYnJhcnkgdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvZ19saWJyYXJ5X3ZpZXcuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNaWxlc3RvbmUiIGhyZWY9Imh0bWwvdG9waWNzL2dfbWlsZXN0b25lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iT3V0Y29tZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19vdXRjb21lLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUGhhc2UiIGhyZWY9Imh0bWwvdG9waWNzL2dfcGhhc2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJQcmFjdGljZSIgaHJlZj0iaHRtbC90b3BpY3MvZ19wcmFjdGljZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlByZXZpZXciIGhyZWY9Imh0bWwvdG9waWNzL2dfcHJldmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJlcG9ydCIgaHJlZj0iaHRtbC90b3BpY3MvZ19yZXBvcnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSZXVzYWJsZSBhc3NldCIgaHJlZj0iaHRtbC90b3BpY3MvZ19yZXVzYWJsZV9hc3NldC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvYWRtYXAiIGhyZWY9Imh0bWwvdG9waWNzL2dfcm9hZG1hcC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvbGUiIGhyZWY9Imh0bWwvdG9waWNzL2dfcm9sZS5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlJvbGUgc2V0IiBocmVmPSJodG1sL3RvcGljcy9nX3JvbGVzZXQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJSb2xlIHNldCBncm91cGluZyIgaHJlZj0iaHRtbC90b3BpY3MvZ19yb2xlc2V0X2dyb3VwaW5nLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3RlcCIgaHJlZj0iaHRtbC90b3BpY3MvZ19zdGVwLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3VwcG9ydGluZyBtYXRlcmlhbCIgaHJlZj0iaHRtbC90b3BpY3MvZ19zdXBwb3J0aW5nX21hdGVyaWFsLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iU3luY2hyb25pemF0aW9uIiBocmVmPSJodG1sL3RvcGljcy9nX3N5bmNocm9uaXphdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRhc2siIGhyZWY9Imh0bWwvdG9waWNzL2dfdGFzay5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRlbXBsYXRlIiBocmVmPSJodG1sL3RvcGljcy9nX3RlbXBsYXRlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iVGVybSBkZWZpbml0aW9uIiBocmVmPSJodG1sL3RvcGljcy9nX3Rlcm1fZGVmaW5pdGlvbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlRvb2wgbWVudG9yIiBocmVmPSJodG1sL3RvcGljcy9nX3Rvb2xfbWVudG9yLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iV2hpdGUgcGFwZXIiIGhyZWY9Imh0bWwvdG9waWNzL2dfd2hpdGVwYXBlci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90b3BpY3MvZ193b3JrX3Byb2R1Y3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJXb3JrIHByb2R1Y3QgZGVzY3JpcHRvciIgaHJlZj0iaHRtbC90b3BpY3MvZ193b3JrX3Byb2R1Y3RfZGVzY3JpcHRvci5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IldvcmsgcHJvZHVjdCBraW5kIiBocmVmPSJodG1sL3RvcGljcy9nX3dvcmtfcHJvZHVjdF9raW5kLmh0bWwiLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL0F1dGhvclBlcnNwLkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL0F1dGhvclBlcnNwLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE0ZTc5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9BdXRob3JQZXJzcC5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTU2MjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWJvdXRlcGZjb21wb3Nlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJhYm91dGVwZmNvbXBvc2VyIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFib3V0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFib3V0ZXBmY29tcG9zZXIiPjxhIG5hbWU9ImFib3V0ZXBmY29tcG9zZXIiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC9oMT4KLTxkaXY+PHA+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpLiBFUEYgQ29tcG9zZXIgaXMgYSB0b29sIHBsYXRmb3JtIHRoYXQKLWVuYWJsZXMgcHJvY2VzcyBlbmdpbmVlcnMgYW5kIG1hbmFnZXJzIHRvIGltcGxlbWVudCwgZGVwbG95LCBhbmQgbWFpbnRhaW4KLXByb2Nlc3NlcyBmb3Igb3JnYW5pemF0aW9ucyBvciBpbmRpdmlkdWFsIHByb2plY3RzLiBUeXBpY2FsbHksIHR3byBrZXkgcHJvYmxlbXMKLW5lZWQgdG8gYmUgYWRkcmVzc2VkIHRvIHN1Y2Nlc3NmdWxseSBkZXBsb3kgbmV3IHByb2Nlc3Nlcy48L3A+Ci08cD5GaXJzdCwgZGV2ZWxvcG1lbnQgdGVhbXMgbmVlZCB0byBiZSBlZHVjYXRlZCBvbiB0aGUgbWV0aG9kcyBhcHBsaWNhYmxlCi10byB0aGUgcm9sZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuIFNvZnR3YXJlIGRldmVsb3BlcnMgdHlwaWNhbGx5Ci1uZWVkIHRvIGxlYXJuIGhvdyB0byBkbyBhbmFseXNpcyBhbmQgZGVzaWduLCB0ZXN0ZXJzIG5lZWQgdG8gbGVhcm4gaG93IHRvCi10ZXN0IGltcGxlbWVudGF0aW9ucyBhZ2FpbnN0IHJlcXVpcmVtZW50cywgbWFuYWdlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gbWFuYWdlCi10aGUgcHJvamVjdCBzY29wZSBhbmQgY2hhbmdlLCBhbmQgc28gb24uIFNvbWUgb3JnYW5pemF0aW9ucyBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzCi1pbXBsaWNpdGx5IGtub3cgaG93IHRvIGRvIHN1Y2ggd29yayB3aXRob3V0IGRvY3VtZW50aW5nIHRoZWlyIG1ldGhvZHMsIGJ1dAotbWFueSBvcmdhbml6YXRpb25zIHdhbnQgdG8gZXN0YWJsaXNoIGNvbW1vbiBhbmQgcmVndWxhdGVkIHByYWN0aWNlcywgdG8gZHJpdmUKLXNwZWNpZmljIGltcHJvdmVtZW50IG9iamVjdGl2ZXMsIGFuZCB0byBtZWV0IGNvbXBsaWFuY2Ugc3RhbmRhcmRzLiA8L3A+Ci08cD5TZWNvbmQsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdG8gYXBwbHkgdGhlc2UgbWV0aG9kcwotdGhyb3VnaG91dCBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gVGhhdCBpcywgdGhleSBuZWVkIHRvIGRlZmluZSBvciBzZWxlY3QKLWEgZGV2ZWxvcG1lbnQgcHJvY2Vzcy4gRm9yIGV4YW1wbGUsIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZHMgaGF2ZSB0bwotYmUgYXBwbGllZCBkaWZmZXJlbnRseSBpbiBlYXJseSBwaGFzZXMgb2YgYSBwcm9qZWN0IHdoZXJlIHRoZSBmb2N1cyBpcyBvbgotZWxpY2l0YXRpb24gb2Ygc3Rha2Vob2xkZXIgbmVlZHMgYW5kIHJlcXVpcmVtZW50cyBhbmQgc2NvcGluZyBhIHZpc2lvbiwgdGhhbgotaW4gbGF0ZXIgcGhhc2VzIHdoZXJlIHRoZSBmb2N1cyBpcyBvbiBtYW5hZ2luZyByZXF1aXJlbWVudHMgdXBkYXRlcyBhbmQgY2hhbmdlcwotYW5kIHBlcmZvcm1pbmcgaW1wYWN0IGFuYWx5c2lzIG9mIHRoZXNlIHJlcXVpcmVtZW50cyBjaGFuZ2VzLiBUZWFtcyBhbHNvIG5lZWQKLWNsZWFyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkaWZmZXJlbnQgdGFza3Mgb2YgdGhlIG1ldGhvZHMgcmVsYXRlIHRvIGVhY2gKLW90aGVyLCBmb3IgZXhhbXBsZSwgaG93IHRoZSBjaGFuZ2UgbWFuYWdlbWVudCBtZXRob2QgaW1wYWN0cyB0aGUgcmVxdWlyZW1lbnRzCi1tYW5hZ2VtZW50IG1ldGhvZCBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZyBtZXRob2QgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlLgotRXZlbiBzZWxmLW9yZ2FuaXppbmcgdGVhbXMgbmVlZCB0byBkZWZpbmUgYSBwcm9jZXNzIHRoYXQgZ2l2ZXMgYXQgbWluaW11bQotc29tZSBndWlkYW5jZSBvbiBob3cgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUgc2NvcGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSwKLXdoZW4gbWlsZXN0b25lcyB3aWxsIGJlIGFjaGlldmVkIGFuZCB2ZXJpZmllZCwgYW5kIHNvIG9uLiAgPC9wPgotPGRpdiBjbGFzcz0icCI+VG8gdGhhdCBlbmQsIEVQRiBDb21wb3NlciBoYXMgdHdvIG1haW4gcHVycG9zZXM6PHVsPjxsaT5UbyBwcm92aWRlIGEga25vd2xlZGdlIGJhc2Ugb2YgaW50ZWxsZWN0dWFsIGNhcGl0YWwgd2hpY2ggeW91IGNhbiBicm93c2UsCi1tYW5hZ2UgYW5kIGRlcGxveS4gVGhpcyBjb250ZW50IGNhbiBpbmNsdWRlIGV4dGVybmFsbHkgZGV2ZWxvcGVkIGNvbnRlbnQsCi1hbmQsIG1vcmUgaW1wb3J0YW50bHksIGNhbiBpbmNsdWRlIHlvdXIgb3duIGNvbnRlbnQgaW5jbHVkaW5nIG9mIHdoaXRlcGFwZXJzLAotZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBwcmluY2lwbGVzLCBiZXN0IHByYWN0aWNlcywgaW50ZXJuYWwgcHJvY2VkdXJlcyBhbmQKLXJlZ3VsYXRpb25zLCB0cmFpbmluZyBtYXRlcmlhbCwgYW5kIGFueSBvdGhlciBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB5b3VyCi1tZXRob2RzLiBUaGlzIGtub3dsZWRnZSBiYXNlIGNhbiB1c2VkIGZvciByZWZlcmVuY2UgYW5kIGVkdWNhdGlvbi4gSXQgYWxzbwotZm9ybXMgdGhlIGJhc2lzIGZvciBkZXZlbG9waW5nIHByb2Nlc3NlcyAodGhlIHNlY29uZCBwdXJwb3NlKS4gRVBGIENvbXBvc2VyIGlzIGRlc2lnbmVkCi10byBiZSBhIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0gdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBtYW5hZ2VtZW50IHN0cnVjdHVyZQotYW5kIGxvb2sgYW5kIGZlZWwgZm9yIGFsbCBvZiB5b3VyIGNvbnRlbnQsIHJhdGhlciB0aGFuIGJlaW5nIGEgZG9jdW1lbnQgbWFuYWdlbWVudAotc3lzdGVtIGluIHdoaWNoIHlvdSB3b3VsZCBzdG9yZSBhbmQgYWNjZXNzIGhhcmQgdG8gbWFpbnRhaW4gbGVnYWN5IGRvY3VtZW50cwotYWxsIGluIHRoZWlyIG93biBzaGFwZXMgYW5kIGZvcm1hdHMuIEFsbCBjb250ZW50IG1hbmFnZWQgaW4gRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQKLXRvIGh0bWwgYW5kIGRlcGxveWVkIHRvIFdlYiBzZXJ2ZXJzIGZvciBkaXN0cmlidXRlZCB1c2FnZS4gPC9saT4KLTxsaT5UbyBwcm92aWRlIHByb2Nlc3MgZW5naW5lZXJpbmcgY2FwYWJpbGl0aWVzIGJ5IHN1cHBvcnRpbmcgcHJvY2VzcyBlbmdpbmVlcnMKLWFuZCBwcm9qZWN0IG1hbmFnZXJzIGluIHNlbGVjdGluZywgdGFpbG9yaW5nLCBhbmQgcmFwaWRseSBhc3NlbWJsaW5nIHByb2Nlc3NlcwotZm9yIHRoZWlyIGNvbmNyZXRlIGRldmVsb3BtZW50IHByb2plY3RzLiBFUEYgQ29tcG9zZXIgcHJvdmlkZXMgY2F0YWxvZ3Mgb2YgcHJlLWRlZmluZWQKLXByb2Nlc3NlcyBmb3IgdHlwaWNhbCBwcm9qZWN0IHNpdHVhdGlvbnMgdGhhdCBjYW4gYmUgYWRhcHRlZCB0byBpbmRpdmlkdWFsCi1uZWVkcy4gSXQgYWxzbyBwcm92aWRlcyBwcm9jZXNzIGJ1aWxkaW5nIGJsb2NrcywgY2FsbGVkIGNhcGFiaWxpdHkgcGF0dGVybnMsCi10aGF0IHJlcHJlc2VudCBiZXN0IGRldmVsb3BtZW50IHByYWN0aWNlcyBmb3Igc3BlY2lmaWMgZGlzY2lwbGluZXMsIHRlY2hub2xvZ2llcywKLW9yIG1hbmFnZW1lbnQgc3R5bGVzLiBUaGVzZSBidWlsZGluZyBibG9ja3MgZm9ybSBhIHRvb2xraXQgZm9yIHF1aWNrIGFzc2VtYmx5Ci1vZiBwcm9jZXNzZXMgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBuZWVkcy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBzZXQgdXAKLXlvdXIgb3duIG9yZ2FuaXphdGlvbi1zcGVjaWZpYyBjYXBhYmlsaXR5IHBhdHRlcm4gbGlicmFyaWVzLiBGaW5hbGx5LCB0aGUKLXByb2Nlc3NlcyBjcmVhdGVkIHdpdGggRVBGIENvbXBvc2VyIGNhbiBiZSBwdWJsaXNoZWQgYW5kIGRlcGxveWVkIGFzIFdlYiBzaXRlcy4gPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBLZXkgQ29uY2VwdHM8L3N0cm9uZz48dWw+PGxpPlByb3ZpZGVzIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0b29scyBmb3IgYXV0aG9yaW5nLCBjb25maWd1cmluZywgdmlld2luZywKLWFuZCBwdWJsaXNoaW5nIGRldmVsb3BtZW50IHByb2Nlc3Nlcy4gPC9saT4KLTxsaT5Qcm92aWRlcyBqdXN0LWluLXRpbWUgZ2VuZXJhdGlvbiBvZiBwdWJsaWNhdGlvbiBwcmV2aWV3cyBpbiBkZWRpY2F0ZWQKLWJyb3dzaW5nIHBlcnNwZWN0aXZlIHRoYXQgYWxsb3dzIHJhcGlkIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nLiA8L2xpPgotPGxpPk1hbmFnZXMgbWV0aG9kIGNvbnRlbnQgdXNpbmcgc2ltcGxlIGZvcm0tYmFzZWQgdXNlciBpbnRlcmZhY2VzLiBUaGVyZWZvcmUsCi1VTUwgbW9kZWxpbmcgc2tpbGxzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQuIDwvbGk+Ci08bGk+UHJvdmlkZXMgaW50dWl0aXZlIHJpY2ggdGV4dCBlZGl0b3JzIGZvciBjcmVhdGluZyBpbGx1c3RyYXRpdmUgY29udGVudAotZGVzY3JpcHRpb25zLiBFZGl0b3JzIGFsbG93IHVzZSBvZiBzdHlsZXMsIGltYWdlcywgdGFibGVzLCBoeXBlcmxpbmtzLCBhbmQKLWRpcmVjdCBIVE1MIGVkaXRpbmcuPC9saT4KLTxsaT5BbGxvd3MgY3JlYXRpbmcgcHJvY2Vzc2VzIHdpdGggYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3JzIGFuZCB3b3JrZmxvdwotZGlhZ3JhbXMgdGhyb3VnaCB1c2Ugb2YgbXVsdGktcHJlc2VudGF0aW9uIHByb2Nlc3MgZWRpdG9ycy4gQnJlYWtkb3duIHN0cnVjdHVyZQotZWRpdG9yIHN1cHBvcnRzIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzOiB3b3JrLWJyZWFrZG93biB2aWV3LCB3b3JrIHByb2R1Y3QKLXVzYWdlIHZpZXcsIGFuZCB0ZWFtIGFsbG9jYXRpb24gdmlldy4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIGFsbCBwcmVzZW50YXRpb25zCi13aXRoIHByb2Nlc3MgY2hhbmdlcy4gPC9saT4KLTxsaT5Qcm92aWRlcyBzdXBwb3J0IGZvciBtYW55IGFsdGVybmF0aXZlIGxpZmVjeWNsZQotbW9kZWxzLiBGb3IgZXhhbXBsZSwgd2F0ZXJmYWxsLCBpbmNyZW1lbnRhbCwgb3IgaXRlcmF0aXZlIG1vZGVscyBjYW4gYmUgY3JlYXRlZAotd2l0aCB0aGUgc2FtZSBvdmVybGFwcGluZyBtZXRob2QgY29udGVudC4gPC9saT4KLTxsaT5JbXByb3ZlZCByZXVzZSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMuIFRoZSBwbHVnLWluIG1lY2hhbmlzbXMKLWZyb20gcGFzdCB2ZXJzaW9ucyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBleHRlbnNpb25zIGZvciBicmVha2Rvd24KLXN0cnVjdHVyZXMuPC9saT4KLTxsaT5TdXBwb3J0cyByZXVzYWJsZSBkeW5hbWljYWxseS1saW5rZWQgcHJvY2VzcyBwYXR0ZXJucyBvZiBiZXN0IHByYWN0aWNlcwotZm9yIHJhcGlkIHByb2Nlc3MgYXNzZW1ibHkgdmlhIGRyYWctYW5kLWRyb3AuIDwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48c3Ryb25nPktleSBUZXJtaW5vbG9neSBhbmQgQ29uY2VwdHM8L3N0cm9uZz48L3A+Ci08cD5UbyBlZmZlY3RpdmVseSB3b3JrIHdpdGggRVBGIENvbXBvc2VyLCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIGEgZmV3Ci1jb25jZXB0cyB0aGF0IGFyZSB1c2VkIHRvIG9yZ2FuaXplIHRoZSBjb250ZW50LiBUaGUgcGFnZXMgTWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nCi1PdmVydmlldyBhbmQgUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXcgY29udGFpbiBtb3JlIGRldGFpbCBhbmQgY29uY3JldGUgZXhhbXBsZXMKLW9mIGhvdyB0byB3b3JrIGluIHRoZSB0b29sLiBUaGlzIHBhZ2UgcHJvdmlkZXMgeW91IHdpdGggYSBnZW5lcmFsIG92ZXJ2aWV3Ci1vZiB0aGVzZSBjb25jZXB0cy4gPC9wPgotPHA+VGhlIG1vc3QgZnVuZGFtZW50YWwgcHJpbmNpcGxlIGluIEVQRiBDb21wb3NlciBpcyB0aGUgc2VwYXJhdGlvbiBvZiByZXVzYWJsZSBjb3JlCi1tZXRob2QgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuIFRoaXMgZGlyZWN0bHkgcmVsYXRlcyBiYWNrCi10byB0aGUgdHdvIHB1cnBvc2VzIG9mIEVQRiBDb21wb3NlciBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24uIEFsbW9zdCBhbGwgb2YgRVBGIENvbXBvc2VyJ3MKLWNvbmNlcHRzIGFyZSBjYXRlZ29yaXplZCBhbG9uZyB0aGlzIHNlcGFyYXRpb24uIE1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyB3aGF0Ci1pcyB0byBiZSBwcm9kdWNlZCwgdGhlIG5lY2Vzc2FyeSBza2lsbHMgcmVxdWlyZWQgYW5kIHRoZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQuIFRoZXNlIG1ldGhvZCBjb250ZW50Ci1kZXNjcmlwdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgZGVzY3JpYmUKLXRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZSBtZXRob2QgY29udGVudCBlbGVtZW50cyBhbmQKLXJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzCi1vZiBwcm9qZWN0cy4gPC9wPgotPHA+PGltZyBzcmM9InVtYV9odW1wLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgdGhpcyBzZXBhcmF0aW9uIGlzIGRlcGljdGVkIGluIEJhc2ljIFVuaWZpZWQKLVByb2Nlc3MuIE1ldGhvZCBjb250ZW50LCBkZXNjcmliaW5nIGhvdyBkZXZlbG9wbWVudCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCwKLWlzIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmVzIGFsb25nIHRoZSB5LWF4aXMgb2YgdGhlIGRpYWdyYW0uIFRoZSB3b3JrIGRlc2NyaWJlZAotaW4gYSBwcm9jZXNzIGlzIHNlZW4gYWxvbmcgdGhlIHgtYXhpcyByZXByZXNlbnRpbmcgdGhlIHRpbWVsaW5lLiBUaGlzIGlzIHRoZQotbGlmZWN5Y2xlIG9mIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gSXQgZXhwcmVzc2VzIHdoZW4gd2hhdCB3b3JrIHdpbGwgYmUgcGVyZm9ybWVkLgotVGhlIGdyYXBoIGluIHRoZSBpbGx1c3RyYXRpb24gcmVwcmVzZW50cyBhbiBlc3RpbWF0ZWQgd29ya2xvYWQgZm9yIGVhY2ggZGlzY2lwbGluZS4KLUFzIHlvdSBzZWUsIGZvciBleGFtcGxlLCBvbmUgbmV2ZXIgc3RvcHMgd29ya2luZyBvbiByZXF1aXJlbWVudHMgaW4gT3BlblVQL0Jhc2ljLCBidXQKLXRoZXJlIGFyZSBjZXJ0YWlubHkgcGVhayB0aW1lcyBpbiB3aGljaCBtb3N0IG9mIHRoZSByZXF1aXJlbWVudHMgZWxpY2l0YXRpb24KLWFuZCBkZXNjcmlwdGlvbiB3b3JrIGlzIHBlcmZvcm1lZC4gVGhlcmUgYXJlIGFsc28gdGltZXMgYXQgd2hpY2ggYSBkb3dud2FyZAotdHJlbmQgbmVlZHMgdG8gYmUgb2JzZXJ2ZWQgd2hlcmUgZmV3ZXIgYW5kIGZld2VyIHJlcXVpcmVtZW50cyBjaGFuZ2VzIGhhdmUKLXRvIGJlIHByb2Nlc3NlZCB0byBicmluZyB0aGUgcHJvamVjdCB0byBhIGNsb3NlLiBUaGlzIGF2b2lkcyB3aGF0IGlzIHJlZmVycmVkCi10byBhcyBmZWF0dXJlIGNyZWVwIGluIHdoaWNoIHJlcXVpcmVtZW50cyB3b3JrIHJlbWFpbnMgY29uc3RhbnQgb3IgZXZlbiBpbmNyZWFzZXMuCi1IZW5jZSwgYSBsaWZlY3ljbGUgKHByb2Nlc3MpIGV4cHJlc3NlcyB0aGUgdmFyaWFuY2VzIG9mIHdvcmsgcGVyZm9ybWVkIGluCi10aGUgdmFyaW91cyBkaXNjaXBsaW5lcyAobWV0aG9kIGNvbnRlbnQpLiA8L3A+Ci08cD48aW1nIHNyYz0ibWV0aF92c19wcm9jLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+VGhlIHBpY3R1cmUgYWJvdmUgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBrZXkgZWxlbWVudHMgdXNlZCBpbiBFUEYgQ29tcG9zZXIgYW5kCi1ob3cgdGhleSByZWxhdGUgdG8gbWV0aG9kIGNvbnRlbnQgb3IgcHJvY2Vzcy4gQXMgeW91IHNlZSwgbWV0aG9kIGNvbnRlbnQgaXMKLXByaW1hcmlseSBleHByZXNzZWQgdXNpbmcgd29yayBwcm9kdWN0cywgcm9sZXMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UuIEd1aWRhbmNlLAotc3VjaCBhcyBjaGVja2xpc3RzLCBleGFtcGxlcywgb3Igcm9hZG1hcHMsIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gcHJvdmlkZQotZXhlbXBsYXJ5IHdhbGt0aHJvdWdocyBvZiBhIHByb2Nlc3MuIE9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGRpYWdyYW0sCi15b3Ugc2VlIHRoZSBlbGVtZW50cyB1c2VkIHRvIHJlcHJlc2VudCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyLiBUaGUgbWFpbiBlbGVtZW50Ci1pcyB0aGUgYWN0aXZpdHkgdGhhdCBjYW4gYmUgbmVzdGVkIHRvIGRlZmluZSBicmVha2Rvd24gc3RydWN0dXJlcyBhcyB3ZWxsCi1hcyByZWxhdGVkIHRvIGVhY2ggb3RoZXIgdG8gZGVmaW5lIGEgZmxvdyBvZiB3b3JrLiBBY3Rpdml0aWVzIGFsc28gY29udGFpbgotZGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UgbWV0aG9kIGNvbnRlbnQuIEFjdGl2aXRpZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHByb2Nlc3Nlcwotb2Ygd2hpY2ggRVBGIENvbXBvc2VyIHN1cHBvcnQgdHdvIG1haW4ga2luZHM6IGRlbGl2ZXJ5IHByb2Nlc3NlcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJucy4KLURlbGl2ZXJ5IHByb2Nlc3NlcyByZXByZXNlbnQgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBwcm9jZXNzIHRlbXBsYXRlIGZvcgotcGVyZm9ybWluZyBvbmUgc3BlY2lmaWMgdHlwZSBvZiBwcm9qZWN0LiBUaGV5IGRlc2NyaWJlIGEgY29tcGxldGUgZW5kLXRvLWVuZAotcHJvamVjdCBsaWZlY3ljbGUgYW5kIGFyZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhcgotY2hhcmFjdGVyaXN0aWNzLiBDYXBhYmlsaXR5IHBhdHRlcm5zIGFyZSBwcm9jZXNzZXMgdGhhdCBleHByZXNzIGFuZCBjb21tdW5pY2F0ZQotcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIGRpc2NpcGxpbmUgb3IgYSBiZXN0Ci1wcmFjdGljZS4gVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMKLW9yIGxhcmdlciBjYXBhYmlsaXR5IHBhdHRlcm5zLiBUaGlzIGVuc3VyZXMgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24KLW9mIHRoZWlyIGtleSBiZXN0IHByYWN0aWNlcyBpbiBwcm9jZXNzIGF1dGhvcmluZyBhY3Rpdml0aWVzIGluIEVQRiBDb21wb3Nlci48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sI21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FjdGl2aXR5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NTIxNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWN0aXZpdHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFjdGl2aXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWN0aXZpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QWN0aXZpdHk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFjdGl2aXR5Ij48YSBuYW1lPSJhY3Rpdml0eSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFjdGl2aXR5PC9oMT4KLTxkaXY+PHA+QWN0aXZpdGllcyByZXByZXNlbnQgdGhlIGtleSBidWlsZGluZyBibG9ja3MgZm9yIHByb2Nlc3Nlcy4gQWN0aXZpdGllcwotcmVwcmVzZW50IGEgZ3JvdXBpbmcgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgYWN0aXZpdGllcywgdGFzawotZGVzY3JpcHRvcnMsIHJvbGUgZGVzY3JpcHRvcnMsIDxhIGhyZWY9Indvcmtwcm9kdWN0ZGVzY3JpcHRvcnMuaHRtbCN3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIj53b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnM8L2E+LCBhbmQgPGEgaHJlZj0ibWlsZXN0b25lLmh0bWwjbWlsZXN0b25lIj5taWxlc3RvbmVzPC9hPi4gSW4gYWRkaXRpb24gdG8gYnJlYWtkb3duIHN0cnVjdHVyZXMsIGFjdGl2aXRpZXMKLWNhbiBhbHNvIGJlIHByZXNlbnRlZCBpbiBhY3Rpdml0eSBkaWFncmFtcyB0aGF0IGdyYXBoaWNhbGx5IHNob3cgdGhlIGZsb3cKLW9mIHdvcmsgYnkgc2hvd2luZyB3aGljaCBhY3Rpdml0aWVzIHByZWNlZGUgb3RoZXIgYWN0aXZpdGllcy4gPGEgaHJlZj0icGhhc2UuaHRtbCNwaGFzZSI+UGhhc2U8L2E+IGFuZCA8YSBocmVmPSJpdGVyYXRpb24uaHRtbCNpdGVyYXRpb24iPml0ZXJhdGlvbjwvYT4gYXJlCi1zcGVjaWFsIHR5cGVzIG9mIGFjdGl2aXRpZXMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgcHJvcGVydGllcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxMjUwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbmsiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkFkZCBhIFJlZmVyZW5jZSBvciBIeXBlcmxpbms8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci0KLTxkaXYgY2xhc3M9Im5lc3RlZDAiIGlkPSJhZGRhcmVmZXJlbmNlb3JoeXBlcmxpbmsiPjxhIG5hbWU9ImFkZGFyZWZlcmVuY2Vvcmh5cGVybGluayI+PCEtLSAtLT48L2E+PGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkIGEgUmVmZXJlbmNlIG9yIEh5cGVybGluazwvaDE+Ci08ZGl2PjxwPllvdSBjYW4gYWRkIHR3byB0eXBlcyBvZiByZWZlcmVuY2VzIG9yIGh5cGVybGlua3MgdG8geW91ciBjb250ZW50IHRleHQ6Ci1yZWZlcmVuY2VzICB0byBvdGhlciBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgb3IgcmVmZXJlbmNlcyB0byBleHRlcm5hbAotdGV4dCB3aXRoIGEgVVJMIHRoYXQgcmVzaWRlcyBvdXRzaWRlIHRoZSBtZXRob2QgbGlicmFyeS48L3A+Ci08cD5UZXh0IGZpZWxkcyB0aGF0IHN1cHBvcnQgaHlwZXJsaW5rcyBoYXZlIGEgdHdpc3R5IHN5bWJvbCA8aW1nIHNyYz0idHdpc3R5IHN5bWJvbDEuSlBHIiBhbHQ9IiIgLz4gbmV4dCB0byB0aGUgdGV4dCBmaWVsZCdzIGxhYmVsLiBDbGljayB0aGUgc3ltYm9sIHRvIGV4cGFuZAotdGhlIGZpZWxkIGludG8gYSBmdWxsIHRleHQgZWRpdG9yLiA8L3A+Ci08cD5UbyBpbnNlcnQgYSBoeXBlcmxpbmsgdG8gYW5vdGhlciBlbGVtZW50IGluIHRoZSBtZXRob2QgbGlicmFyeSBpbnRvIGEgdGV4dAotZmllbGQsIGxvY2F0ZSB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBjcmVhdGUgYSBsaW5rIHRvIGluIHRoZSBsaWJyYXJ5IG9yIGNvbmZpZ3VyYXRpb24KLXZpZXcgYW5kIHRoZW4gZHJhZyBpdCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0ZXh0IGZpZWxkLCBUaGUgbGluayB0byB0aGUgZWxlbWVudAotaXMgYWRkZWQgYXMgYSBtZXRob2QgZWxlbWVudCB3aXRoIHR5cGUgcHJlZml4LCBtZWFuaW5nIHRoYXQgdGhlIG1ldGhvZCBlbGVtZW50Ci1uYW1lIGlzIHByZWZpeGVkIHdpdGggdGhlIG1ldGhvZCBlbGVtZW50IHR5cGUuIFlvdSBjYW4gYWxzbyBkcmFnIGEgbWV0aG9kCi1lbGVtZW50IGludG8gYW4gdW5leHBhbmRlZCB0ZXh0IGZpZWxkIHRoYXQgc3VwcG9ydHMgaHlwZXJsaW5rcyB3aXRoIHRoZSBzYW1lCi1yZXN1bHQuPC9wPgotPGRpdiBjbGFzcz0icCI+WW91IGNhbiB1c2UgdGhlIEFkZCBMaW5rIGZ1bmN0aW9uIGluIHRoZSByaWNoIHRleHQgZWRpdG9yIHRvIGFkZCBsaW5rcwotdGhhdCBhcmUgcmVmZXJlbmNlcyB0byBvdGhlciBtZXRob2QgZWxlbWVudHMgb3IgbGlua3MgdG8gZmlsZXMgb3IgV2ViIHBhZ2VzLgotVGhpcyBnaXZlcyB5b3UgZnVydGhlciBvcHRpb25zIGluIGhvdyB5b3VyIGxpbmtzIGFyZSBkaXNwbGF5ZWQuPG9sPjxsaT5JbiB0aGUgdGV4dCBlZGl0b3IsIHBvc2l0aW9uIHRoZSBjdXJzb3Igd2hlcmUgeW91IHdhbnQgdG8gaW5zZXJ0IHRoZSBsaW5rCi1hbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5BZGQgTGluazwvc3Ryb25nPiBidXR0b24gPGltZyBzcmM9ImFkZGxpbmtfY28uZ2lmIiBhbHQ9IiIgLz4gaW4gdGhlIHRvb2wgYmFyLiBUaGUgQWRkIExpbmsgZGlhbG9nIG9wZW5zLjwvbGk+Ci08bGk+Q2xpY2sgdGhlIDxzdHJvbmc+QnJvd3NlPC9zdHJvbmc+IGJ1dHRvbiB0byBsb2NhdGUgYW5kIHNlbGVjdCB0aGUgZWxlbWVudCB5b3Ugd2lzaAotdG8gY3JlYXRlIGEgbGluayB0by4gVGhlcmUgYXJlIHNldmVyYWwgb3B0aW9ucyBmb3IgY3JlYXRpbmcgbGlua3MgdG8gb3RoZXIKLWNvbnRlbnQgZWxlbWVudHMsIHdpdGggZWFjaCBvcHRpb24gb2ZmZXJpbmcgYSBkaWZmZXJlbnQgd2F5IGZvciBkaXNwbGF5aW5nCi10aGUgbGluaydzIG5hbWU6PHVsPjxsaT5NZXRob2QgZWxlbWVudDogdGhlIGxpbmsgZGlzcGxheXMgdGhlIGVsZW1lbnQgbmFtZS48L2xpPgotPGxpPk1ldGhvZCB3aXRoIHR5cGUgcHJlZml4OiB0aGUgbGluayBkaXNwbGF5cyB0aGUgZWxlbWVudCBuYW1lIGFuZCB0eXBlLjwvbGk+Ci08bGk+TWV0aG9kIGVsZW1lbnQgd2l0aCBjdXN0b20gdGV4dDogdGhlIGxpbmsgZGlzcGxheXMgdXNlciBkZWZpbmVkIHRleHQuCi1UbyBkZWZpbmUgdGhpcyB0ZXh0IG1hbmlwdWxhdGUgdGhlIHRleHQgaW4gYmV0d2VlbiB0aGUgJmx0O2EmZ3Q7Jmx0Oy9hJmx0OwotdGFncyBpbiB0aGUgVVJMIHRleHQgZmllbGQgb25lIHlvdSBoYXZlIHNlbGVjdGVkIGFuIGVsZW1lbnQgdXNpbmcgdGhlIDxzdHJvbmc+QnJvd3NlPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+VG8gaW5zZXJ0IGEgaHlwZXJsaW5rIHRvIGFuIGV4dGVybmFsIFVSTCwgc2VsZWN0IFVSTCBmcm9tIHRoZSBUeXBlIGRyb3AKLWRvd24gbGlzdCwgdHlwZSB0aGUgVVJMIGRldGFpbHMgaW4gdGhlIFVSTCBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotPGxpPlRvIGluc2VydCBhIGh5cGVybGluayB0byBhIGZpbGUsIGluIHRoZSBUeXBlIGRyb3AgZG93biBsaXN0LCBjbGljayA8c3Ryb25nPkZpbGU8L3N0cm9uZz4sCi1lbnRlciB0aGUgZmlsZSBuYW1lIG9yIGJyb3dzZSB0byBmaW5kIHRoZSBmaWxlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LgotRWFjaCB0aW1lIHlvdSBhZGQgYSBsaW5rIHlvdSBjYW4gY2hvb3NlIHRvIGhhdmUgdGhlIHRhcmdldCBvcGVuIGluIHRoZSBzYW1lCi1icm93c2VyIHdpbmRvdyBvciBpbiBhIG5ldyB3aW5kb3cuPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkaW1nX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiZDcyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRpbWdfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkbGlua19jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRsaW5rX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhMzg2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGRsaW5rX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZG9yZGxpc3RfY28uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkb3JkbGlzdF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MWQ2NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkb3JkbGlzdF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR0YWJsZV9jby5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hZGR0YWJsZV9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzZkZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdGFibGVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FkZHVub3JkbGlzdF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzQ5ZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYWRkdW5vcmRsaXN0X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzczNjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj48YSBuYW1lPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+V2hlbiBkZXZlbG9waW5nIGEgcHJvY2VzcywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkZXZlbG9wIHRoZSBwcm9jZXNzCi1mcm9tIHNjcmF0Y2gsIGFkZGluZyBkZXNjcmlwdG9ycyBvbmUgYnkgb25lLiBZb3UgY2FuIHJldXNlIGV4aXN0aW5nIGNhcGFiaWxpdHkKLXBhdHRlcm5zIG9yIGV2ZW4gY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncwotY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gZm9yIHdoaWNoIGl0IGlzIGFwcGxpZWQuIEEgY2FwYWJpbGl0eQotcGF0dGVybiBtdXN0IGJlIGFwcGxpZWQgdG8gb25lIHNwZWNpZmljIGFjdGl2aXR5IGluIGEgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlcmUgYXJlIHR3byB3YXlzIHRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuOiBDb3B5IGFuZCBFeHRlbmQuIDxwPjxzdHJvbmc+Q29weQotYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9zdHJvbmc+PC9wPgotPGRpdiBjbGFzcz0icCI+SWYgYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgY29waWVkIGludG8gYSBwcm9jZXNzLAotbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgaW4gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlCi1vcmlnaW5hbC4gVGhlIGNhcGFiaWxpdHkgcGF0dGVybiBlbGVtZW50cyBjYW4gYmUgYWx0ZXJlZCwgZGVsZXRlZCBvciBjaGFuZ2VkCi1hcyB5b3Ugd2FudCBpbiB0aGUgcHJvY2VzcyBlZGl0b3Igd2l0aG91dCBhZmZlY3RpbmcgdGhlIG9yaWdpbmFsIG1ldGhvZCBjb250ZW50Ci1lbGVtZW50cy4gTWV0aG9kIGVsZW1lbnRzIGluIGEgY29waWVkIGNhcGFiaWxpdHkgcGF0dGVybiBhcHBlYXIgaW4gcmVndWxhcgotYmxhY2sgZm9udC4gVG8gY29weSBhIGNhcGFiaWxpdHkgcGF0dGVybjo8b2w+PGxpPkluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LAotc2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGl0cyBwYXJ0cyB0aGF0IHlvdSB3YW50IHRvIGNvcHkgaW50byBhbiBhY3Rpdml0eQotaW4gYSBwcm9jZXNzIGFuZCBkcmFnIHRoZSBwYXR0ZXJuIG9yIHBhcnRzIGludG8gdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdQotd2FudCBpdCB0byBhcHBseS4gVG8gc2VsZWN0IG11bHRpcGxlIGFjdGl2aXRpZXMgaW4gYSBjYXBhYmlsaXR5IHBhdHRlcm4sIHByZXNzCi10aGUgQ1RSTCBvciBTSElGVCBrZXlzIHdoaWxlIHlvdSBzZWxlY3QuIDwvbGk+Ci08bGk+SW4gdGhlIHBvcC11cCBib3ggdGhhdCBhcHBlYXJzLCBjbGljayA8c3Ryb25nPkNvcHk8L3N0cm9uZz4uIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLW5hbWUgaXMgZGlzcGxheWVkIGluIGJsYWNrIGFuZCBpcyBub3cgYXZhaWxhYmxlIGZvciB5b3UgdG8gZWRpdC48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+T3IsPG9sPjxsaT5JbiB0aGUgcHJvY2VzcyB2aWV3LCByaWdodCBjbGljayBhbiBhY3Rpdml0eSwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5BcHBseQotUGF0dGVybiAmZ3Q7IENvcHk8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMgd2luZG93IGFwcGVhcnMuPC9saT4KLTxsaT5EcmlsbCBkb3duIGludG8gdGhlIHByb2Nlc3MgdHJlZSB1bnRpbCB5b3UgbG9jYXRlIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLXlvdSB3YW50IHRvIGNvcHkuPC9saT4KLTxsaT5TZWxlY3QgdGhlIHBhdHRlcm4sIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMKLXdpbmRvdyBjbG9zZXMgYW5kIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYXBwbGllZC48L2xpPgotPC9vbD4KLTwvZGl2PgotPHA+PHN0cm9uZz5FeHRlbmQgYSBjYXBhYmlsaXR5IHBhdHRlcm46PC9zdHJvbmc+PC9wPgotPGRpdiBjbGFzcz0icCI+SWYgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLWlzIGV4dGVuZGVkIGludG8gYSBwcm9jZXNzLCBtZXRob2QgY29udGVudCBlbGVtZW50cyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuCi1yZXRhaW4gYSBjb25uZWN0aW9uIHRvIHRoZSBvcmlnaW5hbC4gRXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuIGVsZW1lbnRzCi1jYW5ub3QgYmUgZGVsZXRlZCBvciBtb2RpZmllZCBhbmQgYXBwZWFyIGFzIHJlYWQtb25seSBpbiBhIGdyZWVuLWl0YWxpYyBmb250LgotVG8gZXh0ZW5kIGEgY2FwYWJpbGl0eSBwYXR0ZXJuOiA8b2w+PGxpPkluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LAotc2VsZWN0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGl0cyBwYXJ0cyB0aGF0IHlvdSB3YW50IHRvIGV4dGVuZCBpbnRvIGFuIGFjdGl2aXR5Ci1pbiBhIHByb2Nlc3MgYW5kIGRyYWcgdGhlIHBhdHRlcm4gb3IgcGFydHMgaW50byB0aGUgYWN0aXZpdHkgdG8gd2hpY2ggeW91Ci13YW50IGl0IHRvIGFwcGx5LiBUbyBzZWxlY3QgbXVsdGlwbGUgYWN0aXZpdGllcyBpbiBhIGNhcGFiaWxpdHkgcGF0dGVybiwgcHJlc3MKLXRoZSBDVFJMIG9yIFNISUZUIGtleXMgd2hpbGUgeW91IHNlbGVjdC48L2xpPgotPGxpPkluIHRoZSBwb3AtdXAgYm94IHRoYXQgYXBwZWFycywgY2xpY2sgPHN0cm9uZz5FeHRlbmQ8L3N0cm9uZz4uIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4KLW5hbWUgaXMgZGlzcGxheWVkIGluIGdyZWVuLCB3aGljaCBpbmRpY2F0ZXMgaXQgaXMgcGFydCBvZiBhIHByb2Nlc3MgZGVmaW5lZAotZWxzZXdoZXJlLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj5PciwgPG9sPjxsaT5JbiB0aGUgcHJvY2VzcyB2aWV3LCByaWdodCBjbGljayBhbiBhY3Rpdml0eSBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkFwcGx5Ci1QYXR0ZXJuICZndDsgRXh0ZW5kPC9zdHJvbmc+LiBUaGUgU2VsZWN0IERpYWxvZyBGb3IgUHJvY2Vzc2VzIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci08bGk+RHJpbGwgZG93biBpbnRvIHRoZSBwcm9jZXNzIHRyZWUgdW50aWwgeW91IGxvY2F0ZSB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuCi15b3Ugd2FudCB0byBleHRlbmQuPC9saT4KLTxsaT5TZWxlY3QgdGhlIHBhdHRlcm4sIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBTZWxlY3QgRGlhbG9nIEZvciBQcm9jZXNzZXMKLXdpbmRvdyBjbG9zZXMgYW5kIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYXBwbGllZC48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IElmIHlvdSBkbyBub3Qgd2FudCBhIHNwZWNpZmljIGFjdGl2aXR5IG9yIHRhc2sgaW4gdGhlIGNhcGFiaWxpdHkKLXBhdHRlcm4gdG8gYmUgaW5jbHVkZWQgaW4geW91ciBwcm9jZXNzIHlvdSBjYW4gc3VwcHJlc3MgaXQuIFRoZSBhY3Rpdml0eSBvcgotdGFzayB3aWxsIG5vdCBhcHBlYXIgaW4gdGhlIHB1Ymxpc2hlZCBwcm9jZXNzIG9yIGJlIGV4cG9ydGVkIHRvIGEgcHJvamVjdAotcGxhbm5pbmcgdG9vbC4gVG8gc3VwcHJlc3MgYSBwcm9jZXNzIGVsZW1lbnQsIHJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IGFuZAotdGhlbiBzZWxlY3QgPHN0cm9uZz5TdXBwcmVzczwvc3Ryb25nPi4gVGhlIGVsZW1lbnQgYXBwZWFycyBncmF5ZWQgb3V0IGluIHRoZSBwcm9jZXNzCi12aWV3LjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxkaXYgY2xhc3M9InAiPlRvIGFkZCBlbGVtZW50cyB0byBhbiBhY3Rpdml0eSBpbiBhbiBleHRlbmRlZCBjYXBhYmlsaXR5IHBhdHRlcm46PG9sPjxsaT5GaW5kIHRoZSBhY3Rpdml0eSdzIHBhcmVudCBlbGVtZW50LiBJZiB0aGlzIGVsZW1lbnQgaXMgYSBub3QgYSBsb2NhbCBlbGVtZW50Ci10aGF0IGFwcGVhcnMgaW4gZ3JlZW4gaXRhbGljIGZvbnQsIHRoZW4geW91IG5lZWQgY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvCi10aGlzIHBhcmVudCBmaXJzdC4gIElmIHRoZSBwYXJlbnQncyBwYXJlbnQgaXMgbm90IGxvY2FsLCBhbHNvIGFwcGVhcmluZyBpbgotZ3JlZW4gaXRhbGljIGZvbnQsIHRoZW4geW91IG5lZWQgdG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIHRoZSBwYXJlbnQgZmlyc3QsCi1hbmQgc28gb24uIDwvbGk+Ci08bGk+VG8gY3JlYXRlIGEgY29udHJpYnV0aW9uIHRvIGFuIGV4dGVuZGVkIGFjdGl2aXR5LCByaWdodCBjbGljayB0aGUgZXh0ZW5kZWQKLWFjdGl2aXR5IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29udHJpYnV0ZTwvc3Ryb25nPi4gVGhlIGFjdGl2aXR5IGJlY29tZXMgbG9jYWwgYW5kCi1hcHBlYXJzIGluIGEgc3RhbmRhcmQgYmxhY2sgZm9udC4gRG8gdGhpcyB3aXRoIGFsbCBwYXJlbnQgZWxlbWVudHMsIHRvcC1kb3duLAotdW50aWwgeW91IHJlYWNoIHRoZSBhY3Rpdml0eSB0byB3aGljaCB5b3Ugd2FudCB0byBhcHBseSB0aGUgZWxlbWVudC4gT25jZQoteW91IGNsaWNrIENvbnRyaWJ1dGUsIHRoZSBhY3Rpdml0eSBiZWNvbWVzIGxvY2FsIGFuZCBpcyBwcmVzZW50ZWQgaW4gc3RhbmRhcmQKLWJsYWNrIGZvbnQuPC9saT4KLTwvb2w+Ci1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyI+Q29udHJpYnV0ZXM8L2E+LjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXJ0aWZhY3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlNWZjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hcnRpZmFjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ib3V0Y29tZS5odG1sI291dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYXJ0aWZhY3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QXJ0aWZhY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImFydGlmYWN0Ij48YSBuYW1lPSJhcnRpZmFjdCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFydGlmYWN0PC9oMT4KLTxkaXY+PHA+QW4gYXJ0aWZhY3QgaXMgYSB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdGhhdCBpcyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkCi1ieSB0YXNrcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsCi1hcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4gPC9wPgotPHA+Um9sZXMgdXNlIGFydGlmYWN0cyB0byBwZXJmb3JtIHRhc2tzIGFuZCB0byBwcm9kdWNlIG90aGVyIGFydGlmYWN0cy4gRWFjaAotYXJ0aWZhY3QgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIHJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5Ci10byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uCi1wcm9kdWNlZCBpbiBhIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25seQotb25lIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yIGFuIGFydGlmYWN0LCBvdGhlciByb2xlcyBtYXkgdXNlIHRoZSBhcnRpZmFjdHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0Ij5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2F1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjRhNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkF1dGhvcmluZyBQZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUiPjxhIG5hbWU9ImF1dGhvcmluZ3BlcnNwZWN0aXZlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9oMT4KLTxkaXY+PHA+VGhlIEF1dGhvcmluZyBQZXJzcGVjdGl2ZSBwcm92aWRlcyB2aWV3cyBhbmQgZnVuY3Rpb25zIHRvIG5hdmlnYXRlIGFuZAotYXV0aG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuIFlvdSBtdXN0IGJlIGluIHRoZSBBdXRob3JpbmcgUGVyc3BlY3RpdmUKLXRvIGNyZWF0ZSBvciBtb2RpZnkgYW55IGVsZW1lbnQgdHlwZXMuPC9wPgotPHA+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCBBdXRob3JpbmcgdG8gb3BlbiB0aGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlLiA8L3A+Ci08cD48aW1nIHNyYz0iQXV0aG9yUGVyc3AuSlBHIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIGNvbnRhaW5zIHR3byBWaWV3czogdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBEb3VibGUgY2xpY2sgYW55IGVsZW1lbnQgaW4gdGhlCi1MaWJyYXJ5IFZpZXcgb3IgQ29uZmlndXJhdGlvbiBWaWV3IHRvIG9wZW4gdGhlIEVkaXRvciB3aW5kb3cgb24gdGhlIHJpZ2h0LgotVGhlIEVkaXRvciB3aW5kb3cgY29udGFpbnMgc2V2ZXJhbCB0YWJzIHRocm91Z2ggd2hpY2ggeW91IGNhbiBlZGl0IGluZm9ybWF0aW9uCi1hYm91dCB0aGUgZWxlbWVudCB5b3UgaGF2ZSBzZWxlY3RlZC48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0ibmV4dGxpbmsiPjxzdHJvbmc+TmV4dCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ib2xkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGM0Njg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2JvbGQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzY2MwMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QnJvd3NlIGFuZCBQcmV2aWV3IE1ldGhvZCBDb250ZW50PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudCI+PGEgbmFtZT0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Zb3UgY2FuIGJyb3dzZSBtZXRob2QgY29udGVudCBpbiBib3RoIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4uIFdoaWxlIGF1dGhvcmluZyBtZXRob2QgY29udGVudCwgeW91IGNhbiBzZWUgYSBwcmV2aWV3Ci1vZiB0aGUgcHVibGlzaGVkIHBhZ2UgZm9yIHRoZSBjb250ZW50IHlvdSBhcmUgZWRpdGluZyBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIKLWF0IHRoZSBib3R0b20gb2YgdGhlIGNvbnRlbnQgZWRpdG9yLiBDbGljayBhbnkgbGluayBpbiB0aGUgZGlzcGxheWVkIHBhZ2UKLXRvIGdvIHRvIHRoYXQgcGFnZS4gVXNlIHRoZSBidXR0b25zIGluIHRoZSBlZGl0b3IgdG9vbGJhciB0byBwZXJmb3JtIGZhbWlsaWFyCi1icm93c2VyIGFjdGlvbnMgc3VjaCBhcyBiYWNrIG9yIHJlZnJlc2guIFdoaWxlIGJyb3dzaW5nIG1ldGhvZCBjb250ZW50IGluCi10aGUgYnJvd3NpbmcgcGVyc3BlY3RpdmUgeW91IGNhbiBzZWUgYSBwcmV2aWV3IG9mIGFueSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudAotaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbiBhcyBpdCBhcHBlYXJzIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLiA8L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGJyb3dzZSBhbmQgcHJldmlldyA8YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT4gaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT46PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPiBhbmQgc2VsZWN0IDxzdHJvbmc+QXV0aG9yaW5nPC9zdHJvbmc+LiBUaGUgQXV0aG9yaW5nIHBlcnNwZWN0aXZlCi1vcGVucyB3aXRoIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+IGFuZCA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+IG9uCi10aGUgbGVmdCBhbmQgdGhlIGNvbnRlbnQgdmlldyBvbiB0aGUgcmlnaHQuIElmIGEgbWV0aG9kIGVsZW1lbnQgaXMgc2VsZWN0ZWQsCi10aGUgYXBwcm9wcmlhdGUgZWRpdG9yIGlzIG9wZW4gb24gdGhlIHJpZ2h0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBsb3JlIHRoZSBjb250ZW50cyBpbiB0aGUgYm90aCB0aGUgTGlicmFyeSBWaWV3IGFuZCBDb25maWd1cmF0aW9uCi1WaWV3IGJ5IGV4cGFuZGluZyB0aGUgZGlmZmVyZW50IGNvbnRlbnQgcGFja2FnZXMgYW5kIG1ldGhvZCBwbHVnLWlucyBkb3duCi10byB0aGVpciBtZXRob2QgZWxlbWVudHMuIERvdWJsZSBjbGljayBhbiBlbGVtZW50IHRvIG9wZW4gaXQgaW4gdGhlIGVkaXRvci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgY29udGVudCBlZGl0b3IKLXRvIHByZXZpZXcgdGhlIGNvbnRlbnQgb2YgYW55IHNlbGVjdGVkIGVsZW1lbnQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlIHByZXZpZXcKLXBhZ2UgaW4gdGhlIGNvbnRlbnQgZWRpdG9yIGRvZXMgbm90IHJlc29sdmUgY29udGVudCB2YXJpYWJpbGl0eSByZWxhdGlvbnNoaXBzLgotSWYgeW91IGFyZSBleHRlbmRpbmcsIGNvbnRyaWJ1dGluZyB0bywgb3IgcmVwbGFjaW5nIGEgYmFzZSBjb250ZW50IGl0ZW0sIHlvdQotY2FuIG9ubHkgc2VlIHRoZSByZXN1bHQgb2YgdGhpcyBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IGluIHRoZSBCcm93c2luZwotUGVyc3BlY3RpdmUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4uPC9kaXY+Ci08cD48L3A+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGJyb3dzZSBhbmQgcHJldmlldzxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+OjwvcD4KLTxvbD48bGk+Q2xpY2sgdGhlIE9wZW4gUGVyc3BlY3RpdmUgYnV0dG9uIDxpbWcgc3JjPSJvcGVucGVyc3AuSlBHIiBhbHQ9IiIgLz4gYW5kIHNlbGVjdCA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+LiBUaGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IG9wZW5zIHdpdGggdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gb24gdGhlIGxlZnQgYW5kIHRoZSBDb250ZW50IFZpZXcgb24gdGhlIHJpZ2h0LjxwPjwvcD4KLTwvbGk+Ci08bGk+U2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgY29uZmlndXJhdGlvbiBkcm9wLWRvd24gbGlzdCBpbgotdGhlIHRvb2wgYmFyLiBUaGUgY29udGVudCBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYXBwZWFycyBpbiB0aGUgY29udGVudAotdmlldywgYXMgaXQgd2lsbCBhcHBlYXIgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuPHA+PC9wPgotPC9saT4KLTxsaT5FeHBsb3JlIGFuZCBwcmV2aWV3IHRoZSBjb250ZW50IGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgYnkgZXhwYW5kaW5nCi10aGUgY2F0ZWdvcmllcyBhbmQgb3RoZXIgZm9sZGVycyBkb3duIHRvIG1ldGhvZCBlbGVtZW50cy4gQ2xpY2sgYSBtZXRob2QgZWxlbWVudAotdG8gb3BlbiBpdCBpbiB0aGUgY29udGVudCB2aWV3LjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlcGVyc3AuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvYnJvd3NlcGVyc3AuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY5MWZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzZXBlcnNwLkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Jyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxZmU0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9icm93c2luZ3BlcnNwZWN0aXZlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJCcm93c2luZyBQZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJicm93aW5ncGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImJyb3dpbmdwZXJzcGVjdGl2ZSI+PGEgbmFtZT0iYnJvd2luZ3BlcnNwZWN0aXZlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2gxPgotPGRpdj48cD5UaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgYWxsb3dzIHlvdSB0byBwcmV2aWV3IGFuZCBuYXZpZ2F0ZSB0aHJvdWdoIGEgTWV0aG9kCi1Db25maWd1cmF0aW9uIHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2VzLjwvcD4KLTxwPkNsaWNrIHRoZSBPcGVuIFBlcnNwZWN0aXZlIGJ1dHRvbiA8aW1nIHNyYz0ib3BlbnBlcnNwLkpQRyIgYWx0PSIiIC8+IGFuZCBzZWxlY3QgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiB0byBvcGVuIHRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZS48L3A+Ci08cD48aW1nIHNyYz0iYnJvd3NlcGVyc3AuSlBHIiBhbHQ9IiIgLz48L3A+Ci08cD5UaGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUgY29udGFpbnMgdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sIHdoaWNoIHNob3dzIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50bHkKLXNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIENsaWNrIGFueSBlbGVtZW50IGluIHRoZSBDb25maWd1cmF0aW9uCi1WaWV3IHRvIHByZXZpZXcgdGhlIGVsZW1lbnQgaW4gdGhlIENvbnRlbnQgVmlldyBhcyBpdCB3aWxsIGFwcGVhciBpbiBhIHB1Ymxpc2hlZAotV2ViIHNpdGUuIFRoZSBDb250ZW50IFZpZXcgcHJvdmlkZXMgYnJvd3Nlci1saWtlIG5hdmlnYXRpb24gZmVhdHVyZXMuIENsaWNrCi1hbnkgbGluayBpbiB0aGUgZGlzcGxheWVkIHBhZ2UgdG8gZ28gdG8gdGhhdCBwYWdlLiBVc2UgdGhlIGJ1dHRvbnMgaW4gdGhlCi1Db250ZW50IFZpZXcgdG9vbGJhciB0byBwZXJmb3JtIGZhbWlsaWFyIGJyb3dzZXIgYWN0aW9ucyBzdWNoIGFzIGJhY2sgb3IgcmVmcmVzaC48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jYXBhYmlsaXR5cGF0dGVybi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU1NmFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRpc2NpcGxpbmUuaHRtbCNkaXNjaXBsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyeXByb2Nlc3MuaHRtbCNkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q2FwYWJpbGl0eSBQYXR0ZXJuPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjYXBhYmlsaXR5cGF0dGVybiI+PGEgbmFtZT0iY2FwYWJpbGl0eXBhdHRlcm4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DYXBhYmlsaXR5IFBhdHRlcm48L2gxPgotPGRpdj48cD5BIENhcGFiaWxpdHkgcGF0dGVybiBpcyBhIHNwZWNpYWwgcHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIKLW9mIGFjdGl2aXRpZXMgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuIENhcGFiaWxpdHkgcGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUKLXByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIGFuZCBjYW4KLWJlIGRpcmVjdGx5IHVzZWQgYnkgYSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gQ2FwYWJpbGl0eSBwYXR0ZXJucwotYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlcgotY2FwYWJpbGl0eSBwYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcwotdGhleSBleHByZXNzLjwvcD4KLTxwPkV4YW1wbGVzIG9mIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGNvdWxkIGJlICJ1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMKLW1hbmFnZW1lbnQiLCAidXNlIGNhc2UgYW5hbHlzaXMiLCBvciAidW5pdCB0ZXN0aW5nIi4gVHlwaWNhbGx5LCBidXQgbm90IG5lY2Vzc2FyaWx5LAotY2FwYWJpbGl0eSBwYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24KLW9mIHJldXNhYmxlIGNvbXBsZXggYWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgcm9sZXMgd2hpY2ggcGVyZm9ybSB0YXNrcwotd2l0aGluIHRoZXNlIGFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQKLXByb2R1Y2VkLiBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljCi1waGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gSW4KLW90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZQotaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiB0aGVyZWJ5IGVuYWJsaW5nIGl0cyBhY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkCi10byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBkZWxpdmVyeSBwcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nCi1hcHBsaWVkLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkaXNjaXBsaW5lLmh0bWwjZGlzY2lwbGluZSI+RGlzY2lwbGluZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImFwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjYXBwbHlhY2FwYWJpbGl0eXBhdHRlcm4iPkFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NoZWNrbGlzdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2hlY2tsaXN0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNzhhZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY2hlY2tsaXN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDaGVja2xpc3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY2hlY2tsaXN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNoZWNrbGlzdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2hlY2tsaXN0Ij48YSBuYW1lPSJjaGVja2xpc3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DaGVja2xpc3Q8L2gxPgotPGRpdj48cD5BIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mCi1pdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmlmaWVkLiBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluCi1yZXZpZXdzIHN1Y2ggYXMgYSB3YWxrLXRocm91Z2hzIG9yIGluc3BlY3Rpb25zLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jbGVhcmNvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTM1ZjQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NsZWFyY29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29sbGFwc2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4Nzc1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb2xsYXBzZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uY2VwdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uY2VwdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk4MmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmNlcHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Db25jZXB0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25jZXB0Ij48YSBuYW1lPSJjb25jZXB0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29uY2VwdDwvaDE+Ci08ZGl2PjxwPkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZAotd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcwotbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIGd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldmVyYWwgd29yayBwcm9kdWN0IGFuZC9vcgotdGFza3Mgb3IgYWN0aXZpdGllcy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25mLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTVlNmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTExZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnNhbmRwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbmZpZ3VyYXRpb25zIGFuZCBQdWJsaXNoaW5nIE92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlB1dCB5b3VyIHNob3J0IGRlc2NyaXB0aW9uIGhlcmU7IHVzZWQgZm9yIGZpcnN0IHBhcmFncmFwaCBhbmQgYWJzdHJhY3QuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlB1dCB5b3VyIHNob3J0IGRlc2NyaXB0aW9uIGhlcmU7IHVzZWQgZm9yIGZpcnN0IHBhcmFncmFwaCBhbmQgYWJzdHJhY3QuIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNvbmZpZ3VyYXRpb25zYW5kcHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNvbmZpZ3VyYXRpb25zIGFuZCBQdWJsaXNoaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25maWd1cmF0aW9uc2FuZHB1Ymxpc2hpbmdvdmVydmlldyI+Ci08aDM+TWV0aG9kIENvbmZpZ3VyYXRpb25zIE92ZXJ2aWV3PC9oMz4KLTxwPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgc2hpcHMgd2l0aCBhIGxvdCBvZiBjb250ZW50IG91dCBvZiB0aGUgYm94LiBJdCBpbmNsdWRlcwotICB0aGUgT3BlblVQIGZyYW1ld29yayBhbmQgdmFyaW91cyBwbHVnLWlucyBleHRlbmRpbmcKLSAgT3BlblVQL0Jhc2ljIHdpdGggZG9tYWluLXNwZWNpZmljIGFkZGl0aW9ucy4gTm8gb3JnYW5pemF0aW9uIG9yIHByb2plY3QgcmVxdWlyZXMgYWxsIG9mIHRoaXMKLSAgZG9jdW1lbnRhdGlvbiBhbGwgYXQgb25jZSwgYnV0IHdvdWxkIHdvcmsgd2l0aCBhIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBzdWJzZXRzLjwvcD4KLTxwPiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpIG1hbmFnZXMgZm9yIHRoYXQgcHVycG9zZSBzby1jYWxsZWQgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb25zLCB3aGljaCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB3b3JraW5nIHNldHMgb2YgY29udGVudCBhbmQgcHJvY2Vzc2VzCi0gIGZvciBhIHNwZWNpZmljIGNvbnRleHQsIHN1Y2ggYXMgYSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZSBPcGVuVVAgZnJhbWV3b3JrIHRoYXQKLSAgeW91IHdhbnQgdG8gcHVibGlzaCBhbmQgZGVwbG95IGZvciBhIGdpdmVuIHNvZnR3YXJlIHByb2plY3Qgb3IgYXMgYSBmb3VuZGF0aW9uCi0gIGZvciBhIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbi4gQWxsIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgYXJlIG9yZ2FuaXplZAotICBpbiBtZXRob2QgcGx1Zy1pbnMsIHdoaWNoIGFyZSBvcmdhbml6ZWQgaW50byBtZXRob2QgcGFja2FnZXMuIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgaXMgc2ltcGx5IGEgc2VsZWN0aW9uIG9mIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLjwvcD4KLTxwPjxpbWcgc3JjPSJjb25mLmdpZiIgd2lkdGg9IjY2NSI+PC9wPgotPHA+WW91IGNyZWF0ZSBhbmQgc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yIGRlcGljdGVkCi0gIGluIHRoZSBmaWd1cmUgYWJvdmUuIFlvdSBjb3VsZCBzdGFydCBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29uZmlndXJhdGlvbgotICBieSBjb3B5aW5nIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCBzaGlwIHdpdGggRVBGIENvbXBvc2VyIGFuZCBtb2RpZnkgaXQgdG8gZml0Ci0gIHlvdXIgc3BlY2lmaWMgbmVlZHMuIFlvdSBjYW4gYWRkIG9yIHJlbW92ZSB3aG9sZSBtZXRob2QgcGx1Zy1pbnMgYXMgd2VsbCBhcwotICBtYWtlIHNlbGVjdGlvbiB3aXRoIGVhY2ggcGx1Zy1pbiBieSBjaGVja2luZyBvciB1bi1jaGVja2luZyBwYWNrYWdlcy4gPC9wPgotPHA+IFlvdSBjYW4gdXNlIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiBhcyB5b3VyIHdvcmtpbmcgc2V0IGZvciB5b3VyIEVQRiBDb21wb3NlcgotICB3b3JrLiBUaGUgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24sIGkuZS4gdGhlIGluY2x1ZGVkIG1ldGhvZCBjb250ZW50Ci0gIGFuZCBwcm9jZXNzIGVsZW1lbnRzIGFyZSBhbHdheXMgYWNjZXNzaWJsZSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LiBVc2UgdGhlCi0gIGNvbWJvIGJveCBpbiB0aGUgdG9vbGJhciB0byBzZWxlY3QgdGhlIGN1cnJlbnRseSB1c2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxoMz5QdWJsaXNoaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPk1ldGhvZCBjb25maWd1cmF0aW9ucyBhcmUgdGhlIGJhc2lzIGZvciBwdWJsaXNoaW5nIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuCi0gIEEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gaXMgYW4gaHRtbCBXZWIgc2l0ZSB0aGF0IHByZXNlbnRzIGFsbCB0aGUgbWV0aG9kCi0gIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBvZiB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYSBuYXZpZ2FibGUgYW5kIHNlYXJjaGFibGUKLSAgd2F5LiBJdCB1c2VzIHRoZSByZWxhdGlvbnNoaXBzIGVzdGFibGlzaGVkIGR1cmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcwotICBhdXRob3JpbmcgdG8gZ2VuZXJhdGUgaHlwZXJsaW5rcyBiZXR3ZWVuIGVsZW1lbnRzIGFzIHdlbGwgYXMgcHJvdmlkZXMgdHJlZQotICBicm93c2VycyBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGFuZCB1c2VyLWRlZmluZWQgY2F0ZWdvcml6YXRpb25zIG9mCi0gIHRoZSBjb250ZW50LiBUaGUgZmlndXJlIGJlbG93IHNob3dzIGFuIGV4YW1wbGUgb2YgdGhlIHB1Ymxpc2hlZCAnQ2xhc3NpYyBSVVAnCi0gIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvcD4KLTxwPjxpbWcgc3JjPSJwdWIuZ2lmIiB3aWR0aD0iNTUwIj48L3A+Ci08cD5Gb3IgcHVibGlzaGluZyBzaW1wbHkgY3JlYXRlIGFuZCBzZWxlY3QgYSBjb25maWd1cmF0aW9uLiBUaGUgcHVibGljYXRpb24gd2l6YXJkCi0gIHdpbGwgZG8gdGhlIHJlc3QgZm9yIHlvdSBhbmQgb25seSBwdWJsaXNoIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIHRoZSBtZXRob2QKLSAgY29uZmlndXJhdGlvbi4gSXQgd2lsbCBhbHNvIGF1dG9tYXRpY2FsbHkgYWRvcHQgY29udGVudCB0byB0aGUgY29uZmlndXJhdGlvbgotICBzdWNoIGFzIHJlbW92aW5nCi0gIHJlZmVyZW5jZXMgb2YgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgdG8gZWxlbWVudHMgb3V0c2lkZSBvZiB0aGUgY29uZmlndXJhdGlvbgotICBvciByZW1vdmluZyBhY3Rpdml0aWVzIGZyb20geW91ciBwcm9jZXNzZXMgdGhhdCBvbmx5IGNvbnRhaW4gd29yayBkZWZpbmVkIG91dHNpZGUKLSAgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc2V0LiBIZW5jZSwgcHVibGlzaGluZyB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgY29udGVudCB0aGF0Ci0gIHlvdSByZWFsbHkgbmVlZC4gWW91IGNhbiBhbHdheXMgcHJldmlldyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHVzaW5nIEVQRiBDb21wb3NlcidzCi1icm93c2luZyBwZXJzcGVjdGl2ZS48L3A+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29uZmlndXJhdGlvbnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2MTkyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb25maWd1cmF0aW9udmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29uZmlndXJhdGlvbiBWaWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImxpYnJhcnl2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29uZmlndXJhdGlvbiBWaWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjb25maWd1cmF0aW9udmlldyI+PGEgbmFtZT0iY29uZmlndXJhdGlvbnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Db25maWd1cmF0aW9uIFZpZXc8L2gxPgotPGRpdj48cD5UaGUgQ29uZmlndXJhdGlvbiB2aWV3IHNob3dzIHRoZSBjb250ZW50IGVsZW1lbnRzIGluIGEgbGlicmFyeSBmaWx0ZXJlZAotYnkgYSBjb25maWd1cmF0aW9uLiA8L3A+Ci08cD5BIGNvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgdGhlIDxhIGhyZWY9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwjc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciPm1ldGhvZCBsaWJyYXJ5PC9hPiBjb250ZW50LiBPbmNlIGEgY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZAotaW4gdGhlIENvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCwgdGhlIENvbmZpZ3VyYXRpb24gdmlldyBpcyByZWZyZXNoZWQgd2l0aAotdGhlIGNvbnRlbnQgZnJvbSB0aGUgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4gVGhlIGNvbnRlbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24KLXZpZXcgaXMgYWx3YXlzIHByZXNlbnRlZCBpbiB0aGUgc2FtZSB3YXkgaW4gc3RhbmRhcmQgY2F0ZWdvcmllcywgcHJvY2Vzc2VzLAotY3VzdG9tIGNhdGVnb3JpZXMsIGFuZCBndWlkYW5jZS4gVGhlIENvbmZpZ3VyYXRpb24gdmlldyBkb2VzIG5vdCBzaG93IGFueQotcGh5c2ljYWwgZm9sZGVycy4gRm9sZGVycyBhcmUgb25seSBzaG93biBpbiB0aGUgTGlicmFyeSB2aWV3LjwvcD4KLTxwPjwvcD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sIj5MaWJyYXJ5IFZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29udHJpYnV0ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM0MWJiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb250cmlidXRlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q29udHJpYnV0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNvbnRyaWJ1dGVzIj48YSBuYW1lPSJjb250cmlidXRlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbnRyaWJ1dGVzPC9oMT4KLTxkaXY+PHA+QSBjb250cmlidXRpbmcgZWxlbWVudCBhZGRzIHRvIHRoZSBiYXNlIGVsZW1lbnQuIENvbnRyaWJ1dGVzIHByb3ZpZGVzIGEKLXdheSBmb3IgZWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBlbGVtZW50IHdpdGhvdXQKLWRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgc3VjaCBhcyBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLgotVGhlIGVmZmVjdCwgYWZ0ZXIgY29udHJpYnV0aW9uLCBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkCi13aXRoIGFuIGVsZW1lbnQgdGhhdCBjb21iaW5lcyB0aGUgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIG9mIHRoZSBjb250cmlidXRpbmcKLWVsZW1lbnQgd2l0aCB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1jb250cmlidXRlIHRvIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXM8L3N0cm9uZz4gYXMgdGhlIFZhcmlhYmlsaXR5Ci10eXBlIGFuZCB0aGVuIHNlbGVjdCB0aGUgYmFzZSBlbGVtZW50IHRvIHdoaWNoIHRoaXMgZWxlbWVudCB3aWxsIGNvbnRyaWJ1dGUuCi1UaGUgYmFzZSBlbGVtZW50IG11c3QgYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSBjb250cmlidXRpbmcgZWxlbWVudC48L3A+Ci08cD5BbnkgaW5mb3JtYXRpb24geW91IGVudGVyIGluIHRoZSBjb250cmlidXRpbmcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgYmFzZQotZWxlbWVudC4gVGV4dCBmaWVsZHMgaW4gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQotcmVzcGVjdGl2ZSB0ZXh0IGZpZWxkcyBpbiB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLTxwPkNvbnRyaWJ1dGlvbiBvbmx5IGFkZHMgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIHRvIHRoZSBiYXNlLiBJdCBuZXZlcgotb3ZlcnJpZGVzIG9yIHJlcGxhY2VzIGFueSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYXNlLiBJbiBvdGhlciB3b3JkcywgaWYgdGhlCi1iYXNlIGlzIGFsbG93ZWQgYW4gYXNzb2NpYXRpb24gdG8gZXhhY3RseSBvbmUgb3RoZXIgZWxlbWVudCBhbmQgaGFzIHRoaXMgb25lCi1hbHJlYWR5IGRlZmluZWQsIGl0IGlzIG5vdCBiZWluZyByZXBsYWNlZCBieSBhIGNvbnRyaWJ1dG9yJ3MgYXNzb2NpYXRpb24uPC9wPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Db250cmlidXRpb24gcnVsZXM6PC9zdHJvbmc+PHVsPjxsaT5BdHRyaWJ1dGVzIGFyZSBhcHBlbmRlZCBleGNlcHQgZm9yIGlkZW50aWZ5aW5nL25hbWluZyBhdHRyaWJ1dGVzIGFuZCBub24tc3RyaW5nCi1hdHRyaWJ1dGVzIHN1Y2ggYXMgYm9vbGVhbiwgZGF0ZSwgZXRjLjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tb25lIGFzc29jaWF0aW9ucyBvZiB0aGUgY29udHJpYnV0b3IgYXJlIGlnbm9yZWQgaWYgdGhlIGJhc2UKLWFscmVhZHkgaGFzIHN1Y2ggYW4gYXNzb2NpYXRpb24gb3IgaWYgdGhlIGJhc2UgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSBjb250cmlidXRpbmcKLWVsZW1lbnQgKGkuZS4gaXQgY2Fubm90IGJlIGRlY2lkZWQgd2hpY2ggY29udHJpYnV0aW9uIHNob3VsZCBiZSBjaG9zZSwgdGhlbgotbm9uZSB3aWxsIGJlIGNob3NlbikuPC9saT4KLTxsaT5PdXRnb2luZyB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgZWxlbWVudHMgb2YgYSBjb250cmlidXRpb24uPC9saT4KLTxsaT5JbmNvbWluZyBhc3NvY2lhdGlvbnMgdG8gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IHdpdGggYSB0by1vbmUgY29uc3RyYWludAotb24gdGhlIG90aGVyIGFzc29jaWF0aW9uIGVuZCBhcmUgaWdub3JlZCBpZiB0aGUgYmFzZSBhbHJlYWR5IGhhcyBzdWNoIGFuIGluY29taW5nCi1hc3NvY2lhdGlvbiBvciBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dGlvbiB0byBjb25zaWRlciBmb3IgdGhlCi1iYXNlIGVsZW1lbnQuPC9saT4KLTxsaT5PdGhlciBpbmNvbWluZyBhc3NvY2lhdGlvbnMgdG8gdGhlIGNvbnRyaWJ1dGluZyBlbGVtZW50IGFyZSBhZGRlZCB0byB0aGUKLWJhc2UgZWxlbWVudHMgb2YgYSBjb250cmlidXRpb24uPC9saT4KLTxsaT5BIGJhc2UgZWxlbWVudCBvZiBhIGNvbnRyaWJ1dGlvbiBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dG9yPC9saT4KLTxsaT5Db250cmlidXRpb24gd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGEgY29udHJpYnV0aW9uIGVsZW1lbnQgY29udHJpYnV0ZXMKLWl0cyBvd24gY29udHJpYnV0b3JzLjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gdG8gZmluZCB0aGUgYXNzb2NpYXRpb25zIGZvciBlYWNoIGVsZW1lbnQKLXR5cGUuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiPkV4dGVuZHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY29weS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2ZGZlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jb3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNThiOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBDb250ZW50IFBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWNvbnRlbnRwYWNrYWdlIj48YSBuYW1lPSJjcmVhdGVjb250ZW50cGFja2FnZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBjb250ZW50IGlzIG9yZ2FuaXplZCBpbnRvIGNvbnRlbnQgcGFja2FnZXMgd2hpY2gsIGluIHR1cm4sCi1hcmUgY29udGFpbmVkIGluIG1ldGhvZCBwbHVnLWlucy48L3A+Ci1CZWZvcmUgY3JlYXRpbmcgYSBjb250ZW50IHBhY2thZ2UsIHlvdQotc2hvdWxkIGNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT4uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgYSBuZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT4gYW5kIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPiBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQKLXlvdSBwcm9kdWNlLiBUaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSBvcmlnaW5hbCBjb250ZW50IHNoaXBwZWQgd2l0aAotdGhlIHRvb2wgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgbGlicmFyeSByZWxlYXNlcwotd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91Ci1jYW5ub3QgY3JlYXRlIGEgbmV3IGNvbnRlbnQgcGFja2FnZSBvciBhbnkgb3RoZXIgZWxlbWVudCBpbiBhIGxvY2tlZCBwbHVnLWluLjwvZGl2PgotPHA+VG8KLWNyZWF0ZSBhIGNvbnRlbnQgcGFja2FnZTo8L3A+Ci08L2Rpdj4KLTxvbD48bGk+PHNwYW4+RmluZCB5b3VyIG1ldGhvZCBwbHVnLWluIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkRyaWxsIGludG8gdGhlIHBsdWctaW4gdG8gbG9jYXRlIHRoZSBwYWNrYWdlIGNhbGxlZCA8c3Ryb25nPkNvbnRlbnQKLVBhY2thZ2VzPC9zdHJvbmc+LiBUaGlzIHBhY2thZ2UgY29udGFpbnMgYWxsIHBhY2thZ2VzIHRoYXQgYXJlIGFsbG93ZWQgdG8gY29udGFpbgotbWV0aG9kIGVsZW1lbnRzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBjb250ZW50IHBhY2thZ2UgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgQ29udGVudAotUGFja2FnZTwvc3Ryb25nPi4gVGhlIGNvbnRlbnQgcGFja2FnZSBlZGl0b3IgYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5VbmRlciBHZW5lcmFsIEluZm9ybWF0aW9uLCBnaXZlIHRoZSBuZXcgY29udGVudCBwYWNrYWdlIGEgdW5pcXVlCi1uYW1lIGFuZCBwcm92aWRlIGEgYnJpZWYgZGVzY3JpcHRpb24uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+U2F2ZSB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZSBpbiBvbmUgb2YgdGhyZWUgd2F5czo8L3NwYW4+PG9sIHR5cGU9ImEiPjxsaT48c3Bhbj5DbGljayB0aGUgZGlzayBpY29uIGluIHRoZSB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNlbGVjdCA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPlNpbXBseSBjbG9zZSB0aGUgY29udGVudCBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08L29sPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhlIHRvb2wgYXV0b21hdGljYWxseSBjcmVhdGVzIG5vZGVzIGZvciA8YSBocmVmPSJ0YXNrLmh0bWwjdGFzayI+VGFzazwvYT4sIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPiwgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPiwgYW5kIDxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPiB1bmRlciB0aGUgbmV3IGNvbnRlbnQgcGFja2FnZS48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSI+TWV0aG9kIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwjY3JlYXRlYW1ldGhvZHBsdWdpbiI+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RlZjJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzLmh0bWwjcHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGVsaXZlcnlwcm9jZXNzLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj48YSBuYW1lPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPkEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaAotZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyB0eXBlIG9mIHByb2plY3QuIEEgRGVsaXZlcnkgUHJvY2VzcyBkZXNjcmliZXMgd2hhdAotaXMgcHJvZHVjZWQsIGhvdyBpdCBpcyBwcm9kdWNlZCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGZvciB0aGUgZW50aXJlIHByb2plY3QKLWxpZmVjeWNsZS48L3A+Ci1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgY3JlYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgcHJvamVjdAotdG8gcmVmbGVjdCB0aGUgc3BlY2lmaWMgcGxhbm5pbmcgYW5kIHByb2plY3QgbWFuYWdlbWVudCBuZWVkcy4gPHA+QmVmb3JlCi1jcmVhdGluZyBhIGRlbGl2ZXJ5IHByb2Nlc3M6PC9wPgotPHVsPjxsaT5TZWxlY3QgYSBtZXRob2QgcGx1Zy1pbiB0byBob2xkIHlvdXIgcHJvY2Vzcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCNtZXRob2RwbHVnaW4iPk1ldGhvZCBQbHVnLWluPC9hPi48L2xpPgotPGxpPkZpbmQgb3IgY3JlYXRlIGEgcHJvY2VzcyBwYWNrYWdlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHBvcHVsYXRlIGEgcHJvY2VzcyB3aXRoIG1ldGhvZCBlbGVtZW50czo8dWw+PGxpPkJ5IGluY29ycG9yYXRpbmcgaW5kaXZpZHVhbCBtZXRob2QgZWxlbWVudHMgYnkgZHJhZ2dpbmcgdGhlIGVsZW1lbnRzIG9udG8KLWFuIGFjdGl2aXR5IGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgaW5jbHVkaW5nIHBhcnRzIG9mIGFscmVhZHkgZGVmaW5lZCBjYXBhYmlsaXR5IHBhdHRlcm5zLjwvbGk+Ci08bGk+QnkgY3JlYXRpbmcgZGVzY3JpcHRvcnMgZGlyZWN0bHkgaW4gdGhlIHByb2Nlc3MsIHdoaWNoIGFyZSBlaXRoZXIgdW5yZWxhdGVkCi10byBhbnkgbWV0aG9kIGNvbnRlbnQgb3IgcmVsYXRlZCB0byBtZXRob2QgY29udGVudCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUuPC9saT4KLTwvdWw+Ci1UbyBjcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T25jZSB5b3UgaGF2ZSBzZWxlY3RlZCBvciBjcmVhdGVkIGEgcHJvY2VzcyBwYWNrYWdlLCByaWdodCBjbGljawotdGhlIHByb2Nlc3MgcGFja2FnZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5OZXcgJmd0OyBEZWxpdmVyeSBQcm9jZXNzPC9zdHJvbmc+LiBUaGUgTmV3IFByb2Nlc3MgQ29tcG9uZW50Ci1kaWFsb2cgYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBkZWxpdmVyeSBwcm9jZXNzIGludG8gdGhlIDxzdHJvbmc+TmFtZTwvc3Ryb25nPiBmaWVsZAotYW5kIHRoZW4gc2VsZWN0IGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGRyb3AgZG93biBsaXN0LiBZb3VyIHByb2Nlc3MKLWNhbiBjb250YWluIGNvbnRlbnQgZnJvbSBtYW55IGRpZmZlcmVudCBtZXRob2QgcGx1Zy1pbnMuIGZvciB0aGlzIHJlYXNvbiB5b3UKLW5lZWQgdG8gZGVmaW5lIGEgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgdGhlIHZpc2libGUgc2V0IG9mIGVsZW1lbnRzIGFuZAotcmVsYXRpb25zaGlwcyB3aGVuIHRoZSBwcm9jZXNzIGlzIGF1dGhvcmVkLiBUaGlzIHByb2Nlc3MgYXV0aG9yaW5nIGNvbmZpZ3VyYXRpb24KLWlzIHJlZmVycmVkIHRvIGFzIHRoZSBEZWZhdWx0IENvbmZpZ3VyYXRpb24gZm9yIHRoZSBwcm9jZXNzIGFuZCBzaG91bGQgZGVmaW5lCi10aGUgbGFyZ2VzdCByZWFzb25hYmxlIHNldCBvZiBtZXRob2QgcGx1Zy1pbnMsIGNvbnRlbnQgcGFja2FnZXMsIGFuZCBvdGhlcgotcHJvY2Vzc2VzIGZyb20gdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSByZWZlcnJlZCB0byBieSB0aGUgcHJvY2VzcwotYXQgc29tZSBwb2ludC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHByb2Nlc3MgaXMgY3JlYXRlZCBhbmQgdGhlIHByb2Nlc3MgZWRpdG9yCi1pcyBvcGVuZWQuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSWYgdGhlIFByb3BlcnRpZXMgd2luZG93IG9wZW5zIHRvIHRoZSByaWdodCBvZgotdGhlIHByb2Nlc3MgZWRpdG9yLCBjbGljayB0aGUgPHN0cm9uZz54PC9zdHJvbmc+IHRvIGNsb3NlIGl0LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIHByb2Nlc3MgZWRpdG9yLCB1bmRlciB0aGUgRGVzY3JpcHRpb24gdGFiLCBkb2N1bWVudCB5b3VyCi1wcm9jZXNzIHVzaW5nIHRoZSBhdmFpbGFibGUgdGV4dCBmaWVsZHMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlCi1SaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eQotc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sCi10byBhY2Nlc3MgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIENsaWNrIHRoZSBzeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dAotRWRpdG9yLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0icmljaHRleHRlZGl0b3IuaHRtbCNyaWNodGV4dGVkaXRvciI+UmljaCBUZXh0IEVkaXRvcjwvYT48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRlY2lkZSBvbiB5b3VyIHByaW1hcnkgcHJvY2VzcyBhdXRob3Jpbmcgdmlldy4gWW91IGRldmVsb3AgYSBwcm9jZXNzCi11c2luZyB0aHJlZSBkaWZmZXJlbnQgdmlld3M6PC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3N0cm9uZz46IERlZmluZSBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZQotaW4geW91ciBwcm9jZXNzLiBDcmVhdGUgaXRlcmF0aW9ucyBhbmQgYWN0aXZpdGllcyBmaXJzdCwgYW5kIHRoZW4gcG9wdWxhdGUKLXlvdXIgYWN0aXZpdGllcyBieSBhcHBseWluZyB0YXNrcyBmcm9tIHlvdXIgTWV0aG9kIENvbnRlbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uCi1zZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz46IERlZmluZSB3aGljaCB0ZWFtcyBhbmQgcm9sZXMgc2hhbGwgcGFydGljaXBhdGUKLWluIGFjdGl2aXRpZXMgYW5kIHRoZW4gZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz46IERlZmluZSB3aGljaCB3b3JrIHByb2R1Y3RzIHNob3VsZCBiZSBjcmVhdGVkCi1pbiBhY3Rpdml0aWVzIGFuZCBmaW5kIHRhc2tzIGFuZCByb2xlcyBmcm9tIHRoZXJlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT4uPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj48YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT4gb3IgY2FwYWJpbGl0eSBwYXR0ZXJuIHBhcnRzIHRvIHRoZSBkZWxpdmVyeSBwcm9jZXNzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sIj5EZWxpdmVyeSBQcm9jZXNzPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3MuaHRtbCNwcm9jZXNzIj5Qcm9jZXNzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmE0NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kcGx1Z2luLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBNZXRob2QgQ29uZmlndXJhdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iPjxhIG5hbWU9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIENvbmZpZ3VyYXRpb248L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGFsbG93cyB5b3UgdG8gc2VsZWN0IGFuZCBkZXNlbGVjdCBmcm9tIHRoZQotY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5J3Mgc2V0IG9mIHBsdWctaW5zLgotVGhlIHNlbGVjdGlvbnMgeW91IG1ha2UgaGVscCB5b3UgbmFycm93IGRvd24gdGhlIGNvbnRlbnQgeW91IGFyZSByZWFsbHkgaW50ZXJlc3RlZAotaW4gd29ya2luZyB3aXRoLCBhcyB3ZWxsIGFzIGRldGVybWluZSB0aGUgY29udGVudCBvZiB0aGUgV2ViIHNpdGUgeW91IHVsdGltYXRlbHkKLXB1Ymxpc2ggdG8gZGVwbG95IHlvdXIgcHJvY2Vzcy4gQSBjb25maWd1cmF0aW9uIGlzIGdpdmVuIGEgbmFtZSBhbmQgdGhlbiBzYXZlZAotc28gaXQgY2FuIGJlIGNoYW5nZWQgYW5kIHRoZW4gcmUtcHVibGlzaGVkIGF0IGEgbGF0ZXIgZGF0ZS48L3A+Ci1CZWZvcmUgY3JlYXRpbmcKLWEgbWV0aG9kIGNvbmZpZ3VyYXRpb24sIGFzc2VzcyB5b3VyIG5lZWRzIGFuZCBnb2FscyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24uPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGVyZSBhcmUgdHdvIHdheXMgdG8gY3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb246PGEgbmFtZT0iY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb25fX2NyZWF0ZSI+PCEtLSAtLT48L2E+PHVsIGlkPSJjcmVhdGVhbWV0aG9kY29uZmlndXJhdGlvbl9fY3JlYXRlIj48bGk+Q3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaC48L2xpPgotPGxpPkNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbi48L2xpPgotPC91bD4KLTxzdHJvbmc+VG8gY3JlYXRlIGEgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uIGZyb20gc2NyYXRjaDo8L3N0cm9uZz48L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBMaWJyYXJ5IHZpZXcsIHJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlcgotYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+TmV3ICZndDsgTWV0aG9kIENvbmZpZ3VyYXRpb248L3N0cm9uZz4uIFlvdXIgbmV3IGNvbmZpZ3VyYXRpb24KLWlzIGNyZWF0ZWQgYW5kIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBpcyBvcGVuZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciB3aW5kb3csIHR5cGUgYSBuYW1lIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24KLWluIHRoZSA8c3Ryb25nPk5hbWU8L3N0cm9uZz4gZmllbGQuIElmIHlvdSBjbGljayBhbnl3aGVyZSBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBvciA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LCB5b3UKLXdpbGwgYmUgYWJsZSB0byBzZWUgeW91ciBuZXcgY29uZmlndXJhdGlvbiBuYW1lIGluIHRoZSBDb25maWd1cmF0aW9ucyBmb2xkZXIKLWluIHRoZSBMaWJyYXJ5IHZpZXcgdHJlZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIGRlc2NyaXB0aW9uIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24gaW4gdGhlIERlc2NyaXB0aW9uIGZpZWxkLAotYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgQWxsPC9zdHJvbmc+IHRvIHNhdmUgeW91ciBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkF0IHRoZSBib3R0b20gb2YgdGhlIGVkaXRvciB3aW5kb3csIGNsaWNrIHRoZSA8c3Ryb25nPlBsdWctaW4gYW5kIFBhY2thZ2UKLVNlbGVjdGlvbjwvc3Ryb25nPiB0YWIuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIHNlY3Rpb24gZGlzcGxheXMgYSBsaXN0IG9mIGFsbAotbWV0aG9kIHBsdWctaW5zIHRoZWlyIGNvbnRlbnQgcGFja2FnZXMgYW5kIHByb2Nlc3Nlcy4gVXNlIHRoZSBjaGVjayBib3hlcwotdG8gYWRkIG9yIHJlbW92ZSBwbHVnLWlucywgcGFja2FnZXMsIGFuZCBwcm9jZXNzZXMgdG8gb3IgZnJvbSB5b3VyIGNvbmZpZ3VyYXRpb24uCi1FeHBhbmQgZWFjaCBwbHVnLWluIHRvIHNlbGVjdCBhbmQgZGVzZWxlY3QgaW5kaXZpZHVhbCBwYWNrYWdlcyBhbmQgcHJvY2Vzc2VzLjwvc3Bhbj4gPHA+QXMgeW91IG1ha2UgeW91ciBzZWxlY3Rpb25zLCB3YXJuaW5nIHNpZ25zIG1heSBhcHBlYXIgYWdhaW5zdAotc29tZSBvZiB0aGUgcGx1Zy1pbiBhbmQgcGFja2FnZSBuYW1lcywgYW5kIHRoZSBDb25maWd1cmF0aW9uIFdhcm5pbmcgTG9nIHZpZXcKLW1heSBiZSBkaXNwbGF5ZWQuIFRoZXNlIHdhcm5pbmdzIGFyZSBpbnRlbmRlZCB0byBoZWxwIGVuc3VyZSB0aGF0IHlvdSBjcmVhdGUKLWEgY29uZmlndXJhdGlvbiB0aGF0ICJtYWtlcyBzZW5zZSIuPC9wPgotPHA+SWYgeW91IHJlZmVyZW5jZSBhbiBlbGVtZW50IGluIGEKLXBhY2thZ2UgdGhhdCBpcyBmcm9tIGFub3RoZXIgcGFja2FnZSwgeW91IGNhbiBvbmx5IHNlZSB0aGUgZnVsbCBkZXRhaWxzIGZvcgotdGhhdCBlbGVtZW50IGluIGEgcHVibGlzaGVkIFdlYiBzaXRlIGlmIHRoZSBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQKLWlzIGluIHRoZSBjb25maWd1cmF0aW9uLiBJZiB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUKLWNvbmZpZ3VyYXRpb24sIHRoZSAib2ZmZW5kaW5nIiBwYWNrYWdlIGlzIG1hcmtlZCB3aXRoIGEgd2FybmluZyBzaWduLiBZb3UKLW1heSBjaG9vc2Ugbm90IHRvIGluY2x1ZGUgdGhlIGZ1bGwgZGV0YWlscyBvZiBhIHJlZmVyZW5jZWQgZWxlbWVudC4gQ2xpY2sKLXRoZSA8c3Ryb25nPkFkZCBNaXNzaW5nIFJlZmVyZW5jZXM8L3N0cm9uZz4gYnV0dG9uIHRvIGF1dG9tYXRpY2FsbHkgYW5kIHJlY3Vyc2l2ZWx5Ci1hZGQgcGFja2FnZXMgY29udGFpbmluZyBhbnkgZWxlbWVudHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBhbHJlYWR5IHNlbGVjdGVkCi1wYWNrYWdlcy4gU2luY2UgdGhpcyBpcyByZWN1cnNpdmUsIGEgbGFyZ2UgbnVtYmVyIG9mIHBhY2thZ2VzIG1heSBiZSBhZGRlZCwKLXBlcmhhcHMgbWFraW5nIHlvdXIgY29uZmlndXJhdGlvbiBsYXJnZXIgdGhhbiB5b3Ugd2FudCBpdCB0byBiZS48L3A+Ci08cD5JZgoteW91IGhhdmUgZWxlbWVudHMgaW4gYSBwYWNrYWdlIHRoYXQgY29udHJpYnV0ZSB0bywgZXh0ZW5kLCBvciByZXBsYWNlIGVsZW1lbnRzCi1pbiBhbm90aGVyIHBhY2thZ2UsIGl0IGlzIGFuIGVycm9yIGlmIHRoZSBiYXNlIHBhY2thZ2UgaXMgbm90IGluY2x1ZGVkIGluCi10aGUgY29uZmlndXJhdGlvbi4gRXJyb3JzIGFyZSBtYXJrZWQgd2l0aCBhIHJlZCBjcm9zcy4gSWYgeW91IGRyaWxsIGRvd24gaW50bwotYSBwbHVnLWluIG9yIHBhY2thZ2UgbWFya2VkIHdpdGggYSBjcm9zcyB5b3Ugd2lsbCBkaXNjb3ZlciB0aGUgIm9mZmVuZGluZyIKLXBhY2thZ2UgYW5kIHRoZW4geW91IGNhbiBmaW5kIHRoZSBwYWNrYWdlcyB5b3UgbmVlZCB0byBpbmNsdWRlIHRvIHJlc29sdmUKLXRoZSBlcnJvci4gQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNsaWNrIHRoZSA8c3Ryb25nPk1ha2UgY2xvc3VyZSBieSBmaXhpbmcgZXJyb3JzPC9zdHJvbmc+IGJ1dHRvbgotdG8gYXV0b21hdGljYWxseSBmaXggdGhlIGVycm9ycyBieSBhZGRpbmcgdGhlIG1pc3NpbmcgYmFzZSBwYWNrYWdlcy48L3A+Ci08cD5UaGUKLUNvbmZpZ3VyYXRpb24gV2FybmluZyBMb2cgbGlzdHMgYW5kIGV4cGxhaW5zIGFsbCBlcnJvcnMgYW5kIHdhcm5pbmdzIGluIHRoZQotY29uZmlndXJhdGlvbi48L3A+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHN0cm9uZz5GaWxlICZndDsgU2F2ZSBBbGw8L3N0cm9uZz48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RGVmaW5lIHRoZSB2aWV3cyBmb3IgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLiBBIHZpZXcgaXMgYSBuYXZpZ2F0aW9uCi10cmVlIGJyb3dzZXIgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4gRXZlcnkgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gY2FuCi1oYXZlIHNldmVyYWwgdmlld3MgdGhhdCBhcmUgZGlzcGxheWVkIGFzIHN0YWNrZWQgdHJlZSBicm93c2VyIHRhYnMuIFRoZSBzdHJ1Y3R1cmUKLW9mIHRoZSB2aWV3IGlzIGRlZmluZWQgYXMgYSBDdXN0b20gQ2F0ZWdvcnkuPC9zcGFuPjxvbCB0eXBlPSJhIj48bGk+PHNwYW4+SW4gdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLCBjbGljayB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+QWRkIFZpZXc8L3N0cm9uZz4gYnV0dG9uLiBUaGUgU2VsZWN0IENhdGVnb3JpZXMgZGlhbG9nCi1hcHBlYXJzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPklmIG5lZWRlZCwgY2xpY2sgdGhlICgrKSBzaWduIHRvIGV4cGFuZCB0aGUgQ3VzdG9tIENhdGVnb3JpZXMKLWZvbGRlciBhbmQgdGhlbiBzZWxlY3QgdGhlIGNhdGVnb3J5IHlvdSB3YW50IHRvIHVzZSBhcyB5b3VyIHZpZXcuIENsaWNrIHRoZQotKCspIHNpZ24gdG8gZXhwYW5kIHlvdXIgY2hvc2VuIGNhdGVnb3J5IGFuZCB2aWV3IGl0J3MgY29udGVudHMuIFByZXNzIGFuZAotaG9sZCB0aGUgQ1RSTCBrZXkgdG8gc2VsZWN0IG11bHRpcGxlIHZpZXdzLjwvc3Bhbj48L2xpPgotPGxpPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBkaWFsb2cgd2luZG93IGRpc2FwcGVhcnMgYW5kIHRoZSB2aWV3cwoteW91IHNlbGVjdGVkIGFyZSBhZGRlZCB0byB0aGUgQ29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIHZpZXcgeW91IHdhbnQgdG8gZGlzcGxheSBhcyB5b3VyIGNvbmZpZ3VyYXRpb24ncyBzdGFydC11cAotdmlldyBhbmQgdGhlbiBjbGljayB0aGUgPHN0cm9uZz5NYWtlIERlZmF1bHQ8L3N0cm9uZz4gYnV0dG9uLiBUaGUgc3RhcnQtdXAgdmlldyBpcyB0aGUKLWZpcnN0IHZpZXcgc2hvd24gd2hlbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCBmb3IgdGhlIGZpcnN0Ci10aW1lLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlIGFsbDwvc3Ryb25nPiB0byBzYXZlIHlvdXIgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48c3Ryb25nPlRvIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGJ5IGNvcHlpbmcgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbjwvc3Ryb25nPjo8b2w+PGxpPk1ha2Ugc3VyZSB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPHA+PC9wPgotPC9saT4KLTxsaT5JbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiwKLWV4cGFuZCB0aGUgQ29uZmlndXJhdGlvbnMgZm9sZGVyLjxwPjwvcD4KLTwvbGk+Ci08bGk+IFJpZ2h0IGNsaWNrIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB5b3Ugd2FudCB0byBjb3B5IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+Q29weTwvc3Ryb25nPi48cD48L3A+Ci08L2xpPgotPGxpPlJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPkNvbmZpZ3VyYXRpb25zPC9zdHJvbmc+IGZvbGRlciBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlBhc3RlPC9zdHJvbmc+LgotVHlwZSBhIG5hbWUgZm9yIHRoZSBuZXcgY29uZmlndXJhdGlvbiBpbiB0aGUgcG9wLXVwIHdpbmRvdy4gVGhlIGNvcGllZCBtZXRob2QKLWNvbmZpZ3VyYXRpb24gaXMgcGFzdGVkIGludG8gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlci48cD48L3A+Ci08L2xpPgotPGxpPkRvdWJsZSBjbGljayB0aGUgbmV3bHkgcGFzdGVkIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvIG9wZW4gaXRzIGNvbmZpZ3VyYXRpb24KLWVkaXRvci48cD48L3A+Ci08L2xpPgotPGxpPkZvbGxvdyBzdGVwcyAzIHRocm91Z2ggMTAgaW4gPHN0cm9uZz5UbyBDcmVhdGUgYSBOZXcgTWV0aG9kIENvbmZpZ3VyYXRpb24gZnJvbQotU2NyYXRjaDwvc3Ryb25nPiBhYm92ZSB0byBjb250aW51ZS48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJtZXRob2RwbHVnaW4uaHRtbCI+TWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kcGx1Z2luLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZDYyMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHBsdWdpbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIFBsdWctaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudHBhY2thZ2UuaHRtbCNtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIGEgTWV0aG9kIFBsdWctaW48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4iPjxhIG5hbWU9ImNyZWF0ZWFtZXRob2RwbHVnaW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBQbHVnLWlucyBhbGxvdyB0aGUgZXh0ZW5zaW9uIG9yIGN1c3RvbWl6YXRpb24gb2YgYmFzZSBsaWJyYXJ5Ci1jb250ZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgdGhhdCBiYXNlIGNvbnRlbnQgYnkgZGVmaW5pbmcgdGhlIGRpZmZlcmVuY2VzCi10byB0aGUgY29udGVudC4gWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdAoteW91IHByb2R1Y2UgdG8gc2VwYXJhdGUgeW91ciBjb250ZW50IGZyb20gdGhlIG9yaWdpbmFsIE9wZW5VUC9CYXNpYyBjb250ZW50LiBUaGlzCi1hbHNvIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUC9CYXNpYyBNZXRob2QKLUxpYnJhcnkgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGluIHlvdXIgb3duIHBsdWctaW5zLjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBQbHVnLWlucwotdGhhdCBhcmUgc2hpcHBlZCB3aXRoIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgYXJlIGxvY2tlZCBhbmQgcmVhZC1vbmx5LgotVGhlc2UgcGx1Zy1pbnMgYXJlIGdyYXllZCBvdXQgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sIGluZGljYXRpbmcgdGhhdCB0aGV5IGFyZSBsb2NrZWQuPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhIG5ldyBNZXRob2QgUGx1Zy1pbjo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGJlZ2luIHRoZSBtZXRob2QgcGx1Zy1pbiBjcmVhdGlvbiBwcm9jZXNzIGluIG9uZSBvZiB0d28KLXdheXM6PC9zcGFuPjx1bD48bGk+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgTWV0aG9kIFBsdWctaW48L3N0cm9uZz4uIE9yLDwvbGk+Ci08bGk+SW4gdGhlIExpYnJhcnkgdmlldywgcmlnaHQgY2xpY2sgYW4gZXhpc3RpbmcgcGx1Zy1pbiBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3Ci1NZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi48L2xpPgotPC91bD4KLSBUaGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBvcGVucy48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmFtZSBmb3IgeW91ciBuZXcgcGx1Zy1pbiBpbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkIGFuZCB0aGVuCi1zZWxlY3QgYSBwbHVnaW4gaW4gdGhlIDxzdHJvbmc+UmVmZXJlbmNlZCBQbHVnLWluczwvc3Ryb25nPiBmaWVsZC4gVGhlIHBsdWctaW4geW91IGNyZWF0ZQotZXh0ZW5kcyB0aGUgcGx1Zy1pbiB5b3Ugc2VsZWN0IGZyb20gdGhlIGxpc3QgYW5kIGFsbG93cyB5b3UgdG8gdXNlIGNvbnRlbnQKLWZyb20gdGhlIHNlbGVjdGVkIHBsdWctaW4gYXMgeW91IGNyZWF0ZSB5b3VyIG93biBwbHVnLWluIGNvbnRlbnQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlByb3ZpZGUgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgcGx1Zy1pbiBhbmQgbGlzdCBpdHMgYXV0aG9ycwotdG8gaGVscCB5b3UgYW5kIG90aGVycyBrZWVwIHRyYWNrIG9mIHRoZSBwbHVnLWlucyBpbiB0aGUgbGlicmFyeS4gWW91IGNhbgotcmV0dXJuIHRvIGVkaXQgdGhpcyBpbmZvcm1hdGlvbiBhdCBhbnkgdGltZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFlvdXIgbmV3IHBsdWctaW4gbm93IGFwcGVhcnMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gd2l0aCB0aGUgb3RoZXIKLU1ldGhvZCBQbHVnLWlucy48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwiPk1ldGhvZCBQbHVnLWluPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiPkNyZWF0ZSBhIENvbnRlbnQgUGFja2FnZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWRhNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBNZXRob2QgVmlldyB3aXRoIEN1c3RvbSBDYXRlZ29yaWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIj48YSBuYW1lPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPkN1c3RvbSBjYXRlZ29yaWVzIGFsbG93IHlvdSB0byBjYXRlZ29yaXplIGNvbnRlbnQgYWNjb3JkaW5nIHRvIGFueQotc2NoZW1lIHlvdSB3YW50LiBDdXN0b20gY2F0ZWdvcmllcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUKLXZpZXdzLCBwcm92aWRpbmcgYSBtZWFucyB0byBvcmdhbml6ZSBtZXRob2QgY29udGVudCBwcmlvciB0byBwdWJsaXNoaW5nLjxwPlRvCi1jcmVhdGUgYSBuZXcgY3VzdG9tIGNhdGVnb3J5OjwvcD4KLTwvZGl2PgotPG9sPjxsaT48c3Bhbj5Td2l0Y2ggdG8gdGhlIDxhIGhyZWY9ImF1dGhvcmluZ3BlcnNwZWN0aXZlLmh0bWwjYXV0aG9yaW5ncGVyc3BlY3RpdmUiPkF1dGhvcmluZyBQZXJzcGVjdGl2ZTwvYT4uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T3BlbiB0aGUgPHN0cm9uZz5NZXRob2QgQ29udGVudDwvc3Ryb25nPiBmb2xkZXIgaW4gdGhlIG1ldGhvZCBwbHVnLWluIHdoZXJlCi15b3Ugd2FudCB0byBjcmVhdGUgdGhlIGN1c3RvbSBjYXRlZ29yeS48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5SaWdodCBjbGljayB0aGUgQ3VzdG9tIENhdGVnb3JpZXMgZm9sZGVyIGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBDdXN0b20KLUNhdGVnb3J5PC9zdHJvbmc+LiBUaGUgZWRpdG9yIHdpbmRvdyBvcGVucy48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5Qcm92aWRlIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXN0b20gY2F0ZWdvcnkgaW4gdGhlCi1maWVsZHMgYXZhaWxhYmxlIHVuZGVyIHRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IHRhYi48L3NwYW4+PC9saT4KLTxsaT48c3Bhbj5VbmRlciB0aGUgPHN0cm9uZz5Bc3NpZ248L3N0cm9uZz4gdGFiLCB5b3UgY2FuIHNlbGVjdCB0aGUgdGhpbmdzIHlvdSB3YW50Ci10byBpbmNsdWRlIGluIHRoZSBjdXN0b20gY2F0ZWdvcnkuIFNlbGVjdCBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cywgcHJvY2Vzc2VzLAotc3RhbmRhcmQgY2F0ZWdvcmllcyBvciBjdXN0b20gY2F0ZWdvcmllcy4gVGhlIGN1c3RvbSBjYXRlZ29yeQotaXMgYWxzbyBhdmFpbGFibGUgdG8gYWRkIHRvIGluZGl2aWR1YWwgZWxlbWVudHMgb24gdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIKLWluIHRoZSBhcHByb3ByaWF0ZSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+T25jZSB5b3UgYXNzaWduIGNvbnRlbnQgdG8gdGhlIGN1c3RvbSBjYXRlZ29yeSwgeW91IGNhbiBtb2RpZnkKLXRoZSBzZXF1ZW5jZSBvZiB0aGUgaXRlbXMgaW4gdGhlIGNhdGVnb3J5LiBUaGlzIGFmZmVjdHMgdGhlIHNlcXVlbmNlIG9mIHRoZQotaXRlbXMgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYW5kIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4sIGFzCi13ZWxsIGFzIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlIGlmIHRoZSBjdXN0b20gY2F0ZWdvcnkgaXMgaW5jbHVkZWQgYXMgYSB2aWV3Ci1pbiBhIGNvbmZpZ3VyYXRpb24uPC9zcGFuPjwvbGk+Ci08bGk+PHNwYW4+VG8gc2F2ZSB5b3VyIG5ldyBjdXN0b20gY2F0ZWdvcnksIGNsaWNrIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmU8L3N0cm9uZz4gb3IgY2xvc2UKLXRoZSBlZGl0b3IgYW5kIGNsaWNrIDxzdHJvbmc+WWVzPC9zdHJvbmc+IHdoZW4gcHJvbXB0ZWQgdG8gc2F2ZSB0aGUgY2hhbmdlcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIG5vdyB1c2UgdGhlIGN1c3RvbSBjYXRlZ29yeSBhcyBhIHZpZXcgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi48b2w+PGxpPlN3aXRjaCB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPi48L2xpPgotPGxpPkluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LAotZG91YmxlIGNsaWNrIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBhIHZpZXcuIFRoZSBjb25maWd1cmF0aW9uCi1lZGl0b3Igb3BlbnMuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkIFZpZXc8L3N0cm9uZz4gYnV0dG9uLgotVGhlIFNlbGVjdCBDYXRlZ29yaWVzIGRpYWxvZyBhcHBlYXJzLiBUaGUgU2VsZWN0IENhdGVnb3JpZXMgZGlhbG9nIGRpc3BsYXlzCi1hbGwgdGhlIHN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllcyBpbiB0aGUgY29uZmlndXJhdGlvbi48L2xpPgotPGxpPlNlbGVjdCBvbmUgb3IgbW9yZSBjYXRlZ29yaWVzIHRvIGluY2x1ZGUgYXMgYSB2aWV3IGluIHlvdXIgY29uZmlndXJhdGlvbgotYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVGhlIHZpZXcgZGlzcGxheSBwcm92aWRlcyBhIHByZXZpZXcgb2YgaG93IHRoZSB2aWV3Ci13aWxsIGFwcGVhciBuIHRoZSBwdWJsaXNoZWQgdHJlZSBicm93c2VyLjwvbGk+Ci08bGk+U2VsZWN0IGEgdmlldyB0byBkaXNwbGF5IGFzIHRoZSBkZWZhdWx0IHN0YXJ0LXVwIHZpZXcgaW4gdGhlIHB1Ymxpc2hlZAotV2ViIHNpdGUsIGFuZCB0aGVuIGNsaWNrIHRoZSA8c3Ryb25nPk1ha2UgRGVmYXVsdDwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5UbyBzYXZlIHRoZSBjb25maWd1cmF0aW9uLCBjbGljayA8c3Ryb25nPkZpbGUgJmd0OyBTYXZlPC9zdHJvbmc+IG9yIGNsb3NlIHRoZSBjb25maWd1cmF0aW9uCi1lZGl0b3IgYW5kIGNsaWNrIDxzdHJvbmc+WWVzPC9zdHJvbmc+IHdoZW4gcHJvbXB0ZWQgdG8gc2F2ZSB0aGUgY2hhbmdlcy48L2xpPgotPC9vbD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwiPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWQzNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCNwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjYXBhYmlsaXR5cGF0dGVybi5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFJldXNhYmxlIENhcGFiaWxpdHkgUGF0dGVybjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4iPjxhIG5hbWU9ImNyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSBDYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBzcGVjaWFsIHByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZQotY2x1c3RlciBvZiBhY3Rpdml0aWVzIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQKLWRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gQ2FwYWJpbGl0eSBwYXR0ZXJucyBjYW4gYmUgdXNlZCBhcwotYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBvciBsYXJnZXIgY2FwYWJpbGl0eSBwYXR0ZXJucy4gPC9wPgotQmVmb3JlCi1jcmVhdGluZyBhIGNhcGFiaWxpdHkgcGF0dGVybjo8dWw+PGxpPlNlbGVjdCBhIG1ldGhvZCBwbHVnLWluIHRvIGhvbGQgeW91ciBwcm9jZXNzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+LjwvbGk+Ci08bGk+RmluZCBvciBjcmVhdGUgYSBwcm9jZXNzIHBhY2thZ2UuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uCi1vZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiBJbiBvdGhlciB3b3JkcywgYSBjYXBhYmlsaXR5Ci1wYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSBzbyB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYQotZGVsaXZlcnkgcHJvY2Vzcy4gVGhpcyBlbmFibGVzIHRoZSBwYXR0ZXJuJ3MgYWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZAotdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgZGVsaXZlcnkgcHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZwotYXBwbGllZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImNhcGFiaWxpdHlwYXR0ZXJuLmh0bWwjY2FwYWJpbGl0eXBhdHRlcm4iPkNhcGFiaWxpdHkgUGF0dGVybjwvYT4uPGRpdiBjbGFzcz0icCI+WW91IGRvIG5vdCBuZWVkIHRvIGRldmVsb3AgeW91ciBwcm9jZXNzIGZyb20gc2NyYXRjaDsKLXlvdSBjYW4gcmV1c2UgZXhpc3RpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBvciBldmVuIGNhcGFiaWxpdHkgcGF0dGVybiBwYXJ0cy4KLVRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gcG9wdWxhdGUgYSBwcm9jZXNzIHdpdGggbWV0aG9kIGVsZW1lbnRzOjx1bD48bGk+QnkgaW5jb3Jwb3JhdGluZyBpbmRpdmlkdWFsIG1ldGhvZCBlbGVtZW50cyBieSBkcmFnZ2luZyB0aGUgZWxlbWVudHMgb250bwotYW4gYWN0aXZpdHkgaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBpbmNsdWRpbmcgcGFydHMgb2YgYWxyZWFkeSBkZWZpbmVkIGNhcGFiaWxpdHkgcGF0dGVybnMuPC9saT4KLTxsaT5CeSBjcmVhdGluZyBkZXNjcmlwdG9ycyBkaXJlY3RseSBpbiB0aGUgcHJvY2Vzcywgd2hpY2ggYXJlIGVpdGhlciB1bnJlbGF0ZWQKLXRvIGFueSBtZXRob2QgY29udGVudCBvciByZWxhdGVkIHRvIG1ldGhvZCBjb250ZW50IGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+IFRvIGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybjo8L3A+Ci08L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uY2UgeW91IGhhdmUgc2VsZWN0ZWQgb3IgY3JlYXRlZCBhIHByb2Nlc3MgcGFja2FnZSwgcmlnaHQgY2xpY2sKLXRoZSA8c3Ryb25nPlByb2Nlc3MgUGFja2FnZTwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5OZXcg4oCTJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm48L3N0cm9uZz4uIFRoZSBOZXcgUHJvY2VzcyBDb21wb25lbnQKLWRpYWxvZyBib3ggYXBwZWFycy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5hbWUgZm9yIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gaW50byB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkCi1hbmQgdGhlbiBzZWxlY3QgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZHJvcCBkb3duIGxpc3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRoZSBwcm9jZXNzIGlzIGNyZWF0ZWQgYW5kIHRoZSBwcm9jZXNzIGVkaXRvcgotaXMgb3BlbmVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHVuZGVyIHRoZSBEZXNjcmlwdGlvbiB0YWIsIGRvY3VtZW50IHlvdXIKLXByb2Nlc3MgdXNpbmcgdGhlIGF2YWlsYWJsZSB0ZXh0IGZpZWxkcy48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIHVzZSB0aGUKLVJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IgYW55IGZpZWxkIHRoYXQgaGFzIGEgdHdpc3R5Ci1zeW1ib2wgPGltZyBzcmM9InR3aXN0eSBzeW1ib2wxLkpQRyIgYWx0PSIiIC8+LiBTaW1wbHkgY2xpY2sKLXRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUgc3ltYm9sIGFnYWluIHRvIGNsb3NlCi10aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+PC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5EZWNpZGUgb24geW91ciBwcmltYXJ5IHByb2Nlc3MgYXV0aG9yaW5nIHZpZXcuIFlvdSBkZXZlbG9wIGEgcHJvY2VzcwotdXNpbmcgdGhyZWUgZGlmZmVyZW50IHZpZXdzOiA8L3NwYW4+PHVsPjxsaT48c3Ryb25nPldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPjogRGVmaW5lIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlCi1pbiB5b3VyIHByb2Nlc3MuIENyZWF0ZSBpdGVyYXRpb25zIGFuZCBhY3Rpdml0aWVzIGZpcnN0LCBhbmQgdGhlbiBwb3B1bGF0ZQoteW91ciBhY3Rpdml0aWVzIGJ5IGFwcGx5aW5nIHRhc2tzIGZyb20geW91ciBtZXRob2QgY29udGVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08bGk+PHN0cm9uZz5UZWFtIEFsbG9jYXRpb248L3N0cm9uZz46IERlZmluZSB3aGljaCB0ZWFtcyBhbmQgcm9sZXMgc2hhbGwgcGFydGljaXBhdGUKLWluIGFjdGl2aXRpZXMgYW5kIHRoZW4gZmluZCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGFuZCB0YXNrcyBmcm9tIHRoZXJlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwiPkRldmVsb3AgYSBUZWFtIEFsbG9jYXRpb24gU3RydWN0dXJlPC9hPi48L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+OiBEZWZpbmUgd2hpY2ggd29yayBwcm9kdWN0cyBzaG91bGQgYmUgY3JlYXRlZAotaW4gYWN0aXZpdGllcyBhbmQgZmluZCB0YXNrcyBhbmQgcm9sZXMgZnJvbSB0aGVyZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+LjwvbGk+Ci08L3VsPgotIDxwPk9uY2UgeW91IGhhdmUgY3JlYXRlZCB5b3VyIGNhcGFiaWxpdHkgcGF0dGVybiwgeW91IG5lZWQgdG8gYXBwbHkKLWl0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSA8YSBocmVmPSJhcHBseWFjYXBhYmlsaXR5cGF0dGVybi5odG1sI2FwcGx5YWNhcGFiaWxpdHlwYXR0ZXJuIj5BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybjwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzcy5odG1sI3Byb2Nlc3MiPlByb2Nlc3M8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sI3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldyI+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiPkNyZWF0ZSBhIERlbGl2ZXJ5IFByb2Nlc3M8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWFyb2xlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTY5MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXJvbGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBSb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBSb2xlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhcm9sZSI+PGEgbmFtZT0iY3JlYXRlYXJvbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBSb2xlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSA8c3BhbiBjbGFzcz0ia2V5d29yZCI+Um9sZTwvc3Bhbj4gZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLAotYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBpbmRpdmlkdWFscy48L3A+Ci1Zb3Ugc2hvdWxkIGFsd2F5cwotY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSByb2xlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSByb2xlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBSb2xlPC9zdHJvbmc+LiBUaGUKLXJvbGUgZWRpdG9yIGFwcGVhcnMgd2l0aCB0aGUgRGVzY3JpcHRpb24gdGFiIHNldCBhcyB0aGUgZGVmYXVsdC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hbWUgZmllbGQsIHR5cGUgYSB1bmlxdWUgbmFtZSBmb3IgeW91ciByb2xlLiBUaGUgcm9sZSBuYW1lCi1pcyB0aGUgZmlsZSBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGUgTGlicmFyeSB2aWV3Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlc2VudGF0aW9uIG5hbWUgZmllbGQsIHR5cGUgYSBwcmVzZW50YXRpb24gbmFtZS4gVGhlIHByZXNlbnRhdGlvbgotbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4geW91ciBwdWJsaXNoZWQgY29udGVudCBhbmQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIFlvdSBjYW4gYWxzbyBtYWtlIHRoaXMgbmFtZSBhcHBlYXIgaW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4gYnkgdG9nZ2xpbmcgdGhlIDxzdHJvbmc+U2hvdyBQcmVzZW50YXRpb24gTmFtZXM8L3N0cm9uZz4gYnV0dG9uCi1pbiB0aGUgTGlicmFyeSBWaWV3IHRvb2xiYXIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZCwgdHlwZSBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZQotbmV3IFJvbGUuIDwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IFJvbGUgaW4gdGhlIE1haW4gRGVzY3JpcHRpb24KLWZpZWxkLiBUaGUgbWFpbiBkZXNjcmlwdGlvbiBpcyBhIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRpb24KLXlvdSB0eXBlZCBpbnRvIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgeW91IGNhbiBjcmVhdGUKLXRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSBieSB1c2luZyB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFuIEhUTUwgc291cmNlIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVuZGVyIFZlcnNpb24gSW5mb3JtYXRpb24sIHByb3ZpZGUgYW55IHBlcnRpbmVudCB2ZXJzaW9uIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgcm9sZS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiB0YWIgYW5kIHRoZW4gY2xpY2sgdGhlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbgotdG8gdGhlIHJpZ2h0IG9mIHRoZSAiUm9sZSBpcyByZXNwb25zaWJsZSBmb3I6IiBmaWVsZC4gVGhlIFNlbGVjdCBEaWFsb2cgZm9yCi1Xb3JrIFByb2R1Y3RzIGRpYWxvZyBvcGVucy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgZnJvbSB0aGUgbGlzdC4gQSBkZXNjcmlwdGlvbiBvZgotdGhlIHdvcmsgcHJvZHVjdCB5b3Ugc2VsZWN0IGFwcGVhcnMgaW4gdGhlIEJyaWVmIERlc2NyaXB0aW9uIGZpZWxkIGF0IHRoZQotYm90dG9tIG9mIHRoZSBkaWFsb2cgYm94Ljwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlCi0iV29yayBwcm9kdWN0cyB0aGF0IGFyZSBvdXRwdXQgb2YgdGFza3MgdGhhdCB0aGlzIHJvbGUgcGVyZm9ybXMiIGZpZWxkIGlzCi1jYWxjdWxhdGVkIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCB3aXRoIHRoZSByb2xlIGVkaXRvci4gQSB3b3JrIHByb2R1Y3QgYXBwZWFycwotaGVyZSBpZiBpdCBpcyBhbiBvdXRwdXQgb2YgYSB0YXNrIHRoYXQgdGhlIHJvbGUgcGVyZm9ybXMuPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgZGlhbG9nIGJveCBjbG9zZXMgYW5kIHRoZSAiUm9sZSBpcyByZXNwb25zaWJsZQotZm9yOiIgZmllbGQgaXMgcG9wdWxhdGVkLjwvc3Bhbj4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFNlbGVjdGVkIGVsZW1lbnRzIGluIGFuIEFkZC9SZW1vdmUKLXNlY3Rpb24gZGlzcGxheSBib3RoIHRoZSBlbGVtZW50IG5hbWUgKHBsdWctaW4gbmFtZSkgYW5kIHRoZSAicGF0aCIgKHBhY2thZ2UKLW5hbWUpIHRvIHRoYXQgZWxlbWVudC48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IHRhYi4gVGhpcyBwYXJ0IG9mIHRoZSBlZGl0b3IgYWxsb3dzIHlvdQotdG8gYWRkIGFuZCByZW1vdmUgZ3VpZGFuY2UgZm9yIHRoZSByb2xlLiBUbyBhZGQgZ3VpZGFuY2UsIGNsaWNrIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24sCi1zZWxlY3QgdGhlIGd1aWRhbmNlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlIGd1aWRhbmNlLAotc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBmaWVsZCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPi4gV2hlbiB5b3Ugc2VsZWN0Ci1hIGd1aWRhbmNlIGVsZW1lbnQsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ3VpZGFuY2UgaXMgZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYi4gQSByb2xlIGNhbiBiZSBpbmNsdWRlZCBpbiBvbmUKLW9yIG1vcmUgcm9sZXNldHMgYW5kIGFueSBudW1iZXIgb2YgY3VzdG9tIGNhdGVnb3JpZXMuIE9wZW4gdGhlIGFwcHJvcHJpYXRlCi1TZWxlY3QgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZDwvc3Ryb25nPiBidXR0b24gbmV4dCB0byB0aGUgY2F0ZWdvcnkgbGlzdHMuCi1Zb3UgY2FuIHJlbW92ZSBhIHJvbGUgZnJvbSBhIGNhdGVnb3J5IGJ5IHNlbGVjdGluZyBpdCBhbmQgdGhlbiBjbGlja2luZyB0aGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkCi1yb2xlIGFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPk1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWF0YXNrLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmUyMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXRhc2suaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBUYXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVhdGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5DcmVhdGUgYSBUYXNrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVhdGFzayI+PGEgbmFtZT0iY3JlYXRlYXRhc2siPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBUYXNrPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+PHA+QSB0YXNrIGlzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiBFdmVyeSB0YXNrIGlzIGFzc2lnbmVkIHRvCi1hIHNwZWNpZmljIHJvbGUuIFRoZSBncmFudWxhcml0eSBvZiBhIHRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3Ci1kYXlzIGFuZCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCB1bWJlciBvZiB3b3JrIHByb2R1Y3RzLjwvcD4KLVlvdQotc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdCB5b3UgcHJvZHVjZS4gPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSB0YXNrOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBjb250ZW50IHBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIHRoZSB0YXNrLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPlRhc2tzPC9zdHJvbmc+LCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5OZXcgJmd0OyBUYXNrPC9zdHJvbmc+LiBUaGUKLXRhc2sgZWRpdG9yIGFwcGVhcnMgd2l0aCB0aGUgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPiB0YWIgc2V0IGFzIHRoZSBkZWZhdWx0Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgTmFtZSBmaWVsZCwgdHlwZSBhIHVuaXF1ZSBuYW1lIGZvciB5b3VyIHRhc2suIHRoZSB0YXNrIG5hbWUKLWlzIHRoZSBmaWxlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlc2VudGF0aW9uIG5hbWUgZmllbGQsIHR5cGUgYSBwcmVzZW50YXRpb24gbmFtZS4gVGhlIHByZXNlbnRhdGlvbgotbmFtZSBpcyB0aGUgbmFtZSB0aGF0IGFwcGVhcnMgaW4geW91ciBwdWJsaXNoZWQgY29udGVudCBhbmQgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwiPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uCi1Zb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSBMaWJyYXJ5IHZpZXcgYnkgdG9nZ2xpbmcgdGhlIDxzdHJvbmc+U2hvdwotUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuPC9zcGFuPiA8L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyB0YXNrLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbW9yZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgbmV3IHRhc2sgaW4gdGhlIE1haW4gRGVzY3JpcHRpb24KLWZpZWxkLiBUaGUgbWFpbiBkZXNjcmlwdGlvbiBpcyBhIG1vcmUgZGV0YWlsZWQgdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRpb24KLXlvdSB0eXBlZCBpbnRvIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlcmUgYXJlIHRocmVlIHdheXMgeW91IGNhbiBjcmVhdGUKLXRleHQgZm9yIHRoZSBkZXNjcmlwdGlvbjo8L3NwYW4+IDx1bD48bGk+RGlyZWN0bHksIGJ5IHR5cGluZyBpdCBtYW51YWxseSBpbiB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFub3RoZXIgc2ltaWxhciByb2xlIGFuZCB0aGVuIG1vZGlmeSBieSB1c2luZyB0aGUgZWRpdG9yLjwvbGk+Ci08bGk+Q29weSBmcm9tIGFuIEhUTUwgc291cmNlIHN1Y2ggYXMgYSBwdWJsaXNoZWQgT3BlblVQL0Jhc2ljIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFlvdSBjYW4gdXNlIHRoZSBSaWNoIFRleHQgRWRpdG9yIHRvIGVkaXQgb3IgZW50ZXIgdGhlIHRleHQgZm9yCi1hbnkgZmllbGQgdGhhdCBoYXMgYSB0d2lzdHkgc3ltYm9sIDxpbWcgc3JjPSJjb2xsYXBzZWQuZ2lmIiBhbHQ9IiIgLz4uIFNpbXBseSBjbGljayB0aGUgc3ltYm9sIHRvIGFjY2VzcyB0aGUgUmljaCBUZXh0IEVkaXRvci4gQ2xpY2sgdGhlCi1zeW1ib2wgYWdhaW4gdG8gY2xvc2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNvbXBsZXRlIHRoZSBvdGhlciB0YXNrIHNwZWNpZmljIGZpZWxkcyBpbiBEZXRhaWwgSW5mb3JtYXRpb24gYXMKLW5lZWRlZC4gU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiPlZhcmlhYmlsaXR5PC9hPiBmb3IKLWluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIHZhcmlhYmlsaXR5LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBUaGUgU3RlcHMgRWRpdG9yIGFwcGVhcnMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJwIj5BCi10YXNrIGNhbiBoYXZlIGEgc2VyaWVzIG9mIHN0ZXBzIHRoYXQgZGV0YWlsIGhvdyB0byBwZXJmb3JtIHRoYXQgdGFzay4gVGhlCi1TdGVwIEVkaXRvciBhbGxvd3MgeW91IHRvOjx1bD48bGk+Q3JlYXRlIGEgbmV3IHN0ZXA8dWw+PGxpPkNsaWNrIHRoZSA8c3Ryb25nPk5ldzwvc3Ryb25nPiBidXR0b24uPC9saT4KLTxsaT5HaXZlIHRoZSBUYXNrIGEgbmFtZSBpbiB0aGUgPHN0cm9uZz5OYW1lPC9zdHJvbmc+IGZpZWxkLjwvbGk+Ci08bGk+RGVzY3JpYmUgdGhlIFRhc2sgaW4gdGhlIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz4gZmllbGQuPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlJlbW92ZSBhIHN0ZXA8dWw+PGxpPlNlbGVjdCB0aGUgc3RlcCB0byByZW1vdmUgaW4gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gZmllbGQuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5EZWxldGU8L3N0cm9uZz4gYnV0dG9uLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5Nb3ZlIGEgc3RlcCB1cCB0aGUgbGlzdDx1bD48bGk+U2VsZWN0IHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgdXAuPC9saT4KLTxsaT5DbGljayB0aGUgPHN0cm9uZz5Nb3ZlIFVwPC9zdHJvbmc+IGJ1dHRvbi48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+TW92ZSBhIHN0ZXAgZG93biB0aGUgbGlzdDx1bD48bGk+U2VsZWN0IHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgZG93bi48L2xpPgotPGxpPkNsaWNrIHRoZSA8c3Ryb25nPk1vdmUgRG93bjwvc3Ryb25nPiBidXR0b248L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5Sb2xlczwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGRlZmluZSB0aGUgcm9sZXMgdGhhdCBwZXJmb3JtIHRoZSB0YXNrLiBZb3Ugc2hvdWxkIHNlbGVjdCBhIHJvbGUgYXMgdGhlCi1QZXJmb3JtaW5nIFJvbGUgZm9yIHRoaXMgdGFzay4gWW91IGNhbiBhbHNvIGFkZCBvbmUgb3IgbW9yZSByb2xlcyBhcyBBZGRpdGlvbmFsCi1QZXJmb3JtZXJzLiBUbyBhZGQgYSByb2xlLCBjbGljayB0aGUgPHN0cm9uZz5TZWxlY3Q8L3N0cm9uZz4gb3IgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIGFzCi1hcHByb3ByaWF0ZSwgc2VsZWN0IHRoZSByb2xlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8KLXJlbW92ZSBhIHJvbGUsIHNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgYm94LCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkNsZWFyPC9zdHJvbmc+IG9yIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGFzCi1hcHByb3ByaWF0ZS4gV2hlbiB5b3Ugc2VsZWN0IGEgcm9sZSB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhhdCByb2xlIGlzCi1kaXNwbGF5ZWQuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdHM8L3N0cm9uZz4gdGFiLiBUaGlzIHBhcnQgb2YgdGhlIGVkaXRvciBhbGxvd3MKLXlvdSB0byBkZWZpbmUgdGhlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciB0aGlzIHRhc2suCi1Zb3UgY2FuIHNlbGVjdCBhbnkgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMgYXMgTWFuZGF0b3J5IElucHV0cywgT3B0aW9uYWwgSW5wdXRzLAotYW5kIE91dHB1dHMuIFRvIGFkZCBhIHdvcmsgcHJvZHVjdCwgY2xpY2sgdGhlIGFwcHJvcHJpYXRlIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbiwKLXNlbGVjdCB0aGUgd29yayBwcm9kdWN0cyB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZQotYSB3b3JrIHByb2R1Y3QsIHNlbGVjdCBpdCBpbiB0aGUgYXBwcm9wcmlhdGUgYm94IGFuZCB0aGVuIGNsaWNrIHRoZSBjb3JyZXNwb25kaW5nIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+IGJ1dHRvbi4KLVdoZW4geW91IHNlbGVjdCBhIHdvcmsgcHJvZHVjdCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHdvcmsgcHJvZHVjdCBpcwotZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cyB5b3UKLXRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgdGFzay4gVG8gYWRkIGd1aWRhbmNlLCBjbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLAotc2VsZWN0IHRoZSBndWlkYW5jZSB5b3Ugd2FudCB0byBhZGQsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFRvIHJlbW92ZSBndWlkYW5jZSwKLXNlbGVjdCBpdCBpbiB0aGUgR3VpZGFuY2UgYm94IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+UmVtb3ZlPC9zdHJvbmc+LiBXaGVuIHlvdSBzZWxlY3QKLWEgZ3VpZGFuY2UgZWxlbWVudCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGd1aWRhbmNlIGlzIGRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzdHJvbmc+Q2F0ZWdvcmllczwvc3Ryb25nPiB0YWIuIEEgdGFzayBjYW4gYmUgaW5jbHVkZWQgaW4gb25lCi1kaXNjaXBsaW5lIGFuZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzLiBPcGVuIHRoZSBTZWxlY3QgZGlhbG9nIGJ5Ci1jbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5TZWxlY3Q8L3N0cm9uZz4gb3IgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uIG5leHQgdG8gdGhlIGNhdGVnb3J5Ci1saXN0cy4gU2VsZWN0IGEgc2luZ2xlIGRpc2NpcGxpbmUgb3IgYW55IG51bWJlciBvZiBjdXN0b20gY2F0ZWdvcmllcywgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFlvdSBjYW4gcmVtb3ZlIGEgdGFzayBmcm9tIGEgY2F0ZWdvcnkgYnkgc2VsZWN0aW5nIGl0Ci1hbmQgdGhlbiBjbGlja2luZyB0aGUgYXBwcm9wcmlhdGUgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4gYnV0dG9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3PC9zdHJvbmc+IHRhYiB0byB2aWV3IHRoZSBuZXdseSBjcmVhdGVkIHRhc2sgYXMKLWl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBwYWdlLCBhbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIHRpdGxlPSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iPlZhcmlhYmlsaXR5PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhd29ya3Byb2R1Y3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NGY5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVhd29ya3Byb2R1Y3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgYSBXb3JrIFByb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlYXdvcmtwcm9kdWN0Ij48YSBuYW1lPSJjcmVhdGVhd29ya3Byb2R1Y3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48ZGl2IGNsYXNzPSJwIj5Xb3JrIHByb2R1Y3QgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIHRhc2sgaW5wdXRzIGFuZCBvdXRwdXRzLiBUaGVyZQotYXJlIHRocmVlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdDo8dWw+PGxpPjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ib3V0Y29tZS5odG1sI291dGNvbWUiPk91dGNvbWU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIj5EZWxpdmVyYWJsZTwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotWW91IHNob3VsZCBhbHdheXMgY3JlYXRlIG5ldyBtZXRob2QgY29udGVudCBpbiBhIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+TWV0aG9kIFBsdWctaW48L2E+IHRoYXQgeW91IHByb2R1Y2UuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSB3b3JrIHByb2R1Y3Q6PC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FeHBhbmQgdGhlIENvbnRlbnQgUGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHdvcmsKLXByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiwgYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOjwvc3Bhbj4gPHVsPjxsaT48c3Ryb25nPk5ldyAmZ3Q7IEFydGlmYWN0PC9zdHJvbmc+PC9saT4KLTxsaT48c3Ryb25nPk5ldyAmZ3Q7IE91dGNvbWU8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+TmV3ICZndDsgRGVsaXZlcmFibGU8L3N0cm9uZz48L2xpPgotPC91bD4KLVRoZSBXb3JrIFByb2R1Y3QgZWRpdG9yIGZvciB0aGUgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgeW91IGFyZQotY3JlYXRpbmcgYXBwZWFycyB3aXRoIHRoZSBEZXNjcmlwdGlvbiB0YWIgc2V0IGFzIHRoZSBkZWZhdWx0LjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIGEgdW5pcXVlIG5hbWUgZm9yIHlvdXIgd29yayBwcm9kdWN0LiBUaGUKLXdvcmsgcHJvZHVjdCBuYW1lIGlzIHRoZSBmaWxlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHRoZSA8YSBocmVmPSJsaWJyYXJ5dmlldy5odG1sI2xpYnJhcnl2aWV3Ij5MaWJyYXJ5IFZpZXc8L2E+LiA8L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZXNlbnRhdGlvbiBuYW1lIGZpZWxkLCB0eXBlIGEgcHJlc2VudGF0aW9uIG5hbWUuIHRoZSBwcmVzZW50YXRpb24KLW5hbWUgaXMgdGhlIG5hbWUgdGhhdCBhcHBlYXJzIGluIHlvdXIgcHVibGlzaGVkIGNvbnRlbnQgYW5kIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIGFsc28gbWFrZSB0aGlzIG5hbWUgYXBwZWFyIGluIHRoZSBsaWJyYXJ5Ci12aWV3IGJ5IHRvZ2dsaW5nIHRoZSA8c3Ryb25nPlNob3cgUHJlc2VudGF0aW9uIE5hbWVzPC9zdHJvbmc+IGJ1dHRvbiBpbiB0aGUgbGlicmFyeQotdmlldyB0b29sYmFyLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQsIHR5cGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUKLW5ldyB3b3JrIHByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgd29yayBwcm9kdWN0IGluIHRoZQotTWFpbiBEZXNjcmlwdGlvbiBmaWVsZC4gVGhlIG1haW4gZGVzY3JpcHRpb24gaXMgYSBtb3JlIGRldGFpbGVkIHZlcnNpb24gb2YKLXRoZSBkZXNjcmlwdGlvbiB5b3UgdHlwZWQgaW50byB0aGUgQnJpZWYgRGVzY3JpcHRpb24gZmllbGQuIFRoZXJlIGFyZSB0aHJlZQotd2F5cyB0byBjcmVhdGUgdGV4dCBmb3IgdGhlIGRlc2NyaXB0aW9uOjwvc3Bhbj4gPHVsPjxsaT5EaXJlY3RseSwgYnkgdHlwaW5nIGl0IG1hbnVhbGx5IGluIHRoZSBlZGl0b3IuPC9saT4KLTxsaT5Db3B5IGZyb20gYW5vdGhlciBzaW1pbGFyIHdvcmsgcHJvZHVjdCBhbmQgdGhlbiBtb2RpZnkgdXNpbmcgdGhlIGVkaXRvci48L2xpPgotPGxpPkNvcHkgZnJvbSBhbiBIVE1MIHNvdXJjZSwgc3VjaCBhcyBhIHB1Ymxpc2hlZCBPcGVuVVAvQmFzaWMgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlciB0aGUgdGV4dCBmb3IKLWFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLiBDbGljayB0aGUKLXN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9InJpY2h0ZXh0ZWRpdG9yLmh0bWwjcmljaHRleHRlZGl0b3IiPlJpY2ggVGV4dCBFZGl0b3I8L2E+LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHN0cm9uZz5Ob3RhdGlvbjwvc3Ryb25nPiwgcHJvdmlkZSBhbnkgbm90YXRpb25zIGFib3V0IHRoZSBXb3JrIFByb2R1Y3QuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQXJ0aWZhY3RzIGFuZCBEZWxpdmVyYWJsZXMgY29udGFpbiB0aGUgTm90YXRpb24gZmllbGRzLCB3aGlsZQotT3V0Y29tZXMgZG8gbm90LjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VW5kZXIgPHN0cm9uZz5JY29uPC9zdHJvbmc+IHlvdSBjYW4gc2VsZWN0IGEgbm9kZSBpY29uIHRvIGFwcGVhciB3aXRoIHRoZQotd29yayBwcm9kdWN0IGluIHRoZSBMaWJyYXJ5IGFuZCBDb25maWd1cmF0aW9uIHZpZXdzIGFuZCBpbiB0aGUgdHJlZSBicm93c2VyCi1pbiBhIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gVGhlIG5vZGUgaWNvbiBzaG91bGQgYmUgMTYgeCAxNiBwaXhlbHMuIFlvdSBjYW4gYWxzbwotc2VsZWN0IGEgU2hhcGUgaWNvbiB0byBhcHBlYXIgYXQgdGhlIHRvcCBvZiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUKLXdvcmsgcHJvZHVjdC4gdGhlIFNoYXBlIGljb24gc2hvdWxkIGJlIDMyIHggMzIgcGl4ZWxzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db21wbGV0ZSB0aGUgb3RoZXIgd29yayBwcm9kdWN0IHNwZWNpZmljIGZpZWxkcyBhcyBuZWVkZWQuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5Ij5WYXJpYWJpbGl0eTwvYT4gZm9yIGluZm9ybWF0aW9uCi1vbiBhZGRpbmcgdmFyaWFiaWxpdHkgdG8geW91ciB3b3JrIHByb2R1Y3QuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHN0cm9uZz5HdWlkYW5jZTwvc3Ryb25nPiB0YWIuIFRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIGFsbG93cwoteW91IHRvIGFkZCBhbmQgcmVtb3ZlIGd1aWRhbmNlIGZvciB0aGUgd29yayBwcm9kdWN0LiBUbyBhZGQgZ3VpZGFuY2UsIGNsaWNrCi10aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLCBzZWxlY3QgdGhlIGd1aWRhbmNlIHlvdSB3YW50IHRvIGFkZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4KLVRvIHJlbW92ZSBndWlkYW5jZSwgc2VsZWN0IGl0IGluIHRoZSBHdWlkYW5jZSBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uCi1XaGVuIHlvdSBzZWxlY3QgYSBndWlkYW5jZSBlbGVtZW50IHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgZ3VpZGFuY2UgaXMKLWRpc3BsYXllZC48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSA8c3Ryb25nPkNhdGVnb3JpZXM8L3N0cm9uZz4gdGFiLiBBIHdvcmsgcHJvZHVjdCBjYW4gYmUgaW5jbHVkZWQKLWluIG9uZSBkb21haW4sIGFueSBudW1iZXIgb2Ygd29yayBwcm9kdWN0IHR5cGVzLCBhbmQgYW55IG51bWJlciBvZiBjdXN0b20KLWNhdGVnb3JpZXMuIE9wZW4gdGhlIGFwcHJvcHJpYXRlIFNlbGVjdCBkaWFsb2cgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+U2VsZWN0PC9zdHJvbmc+IG9yIDxzdHJvbmc+QWRkPC9zdHJvbmc+IGJ1dHRvbgotbmV4dCB0byB0aGUgY2F0ZWdvcnkgbGlzdHMuIFNlbGVjdCBhIHNpbmdsZSBkb21haW4gb3IgYW55IG51bWJlciBvZiB3b3JrIHByb2R1Y3QKLWtpbmRzIG9yIGN1c3RvbSBjYXRlZ29yaWVzIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIFlvdSBjYW4gcmVtb3ZlIGEgd29yawotcHJvZHVjdCBmcm9tIGEgY2F0ZWdvcnkgYnkgc2VsZWN0aW5nIGl0IGFuZCB0aGVuIGNsaWNraW5nIHRoZSBhcHByb3ByaWF0ZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZSB3b3JrIHByb2R1Y3QgaXMgYSBkZWxpdmVyYWJsZSwgeW91IGNhbiBkZWZpbmUgd2hhdCB0aGUgZGVsaXZlcmFibGUKLWNvbnNpc3RzIG9mIG9uIHRoZSBEZWxpdmVyYWJsZSBQYXJ0cyB0YWIuIENsaWNrIHRoZSA8c3Ryb25nPkRlbGl2ZXJhYmxlIFBhcnRzPC9zdHJvbmc+IHRhYi4KLVRoaXMgcGFydCBvZiB0aGUgZWRpdG9yIG9ubHkgYXBwZWFycyBmb3IgZGVsaXZlcmFibGVzIGFuZCBpdCBhbGxvd3MgeW91IHRvCi1hZGQgb3RoZXIgd29yayBwcm9kdWN0cyBhcyBwYXJ0IG9mIHRoZSBkZWxpdmVyYWJsZS4gVG8gYWRkIHdvcmsgcHJvZHVjdHMsCi1jbGljayB0aGUgPHN0cm9uZz5BZGQ8L3N0cm9uZz4gYnV0dG9uLCBzZWxlY3QgdGhlIHdvcmsgcHJvZHVjdHMgeW91IHdhbnQgdG8gYWRkLCBhbmQKLXRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi4gVG8gcmVtb3ZlIGEgd29yayBwcm9kdWN0LCBzZWxlY3QgaXQgaW4gdGhlIHdvcmsgcHJvZHVjdHMKLWFzIGRlbGl2ZXJhYmxlIHBhcnRzOiBmaWVsZCwgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5SZW1vdmU8L3N0cm9uZz4uIFdoZW4geW91IHNlbGVjdAotYSB3b3JrIHByb2R1Y3QgdGhlIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSB3b3JrIHByb2R1Y3QgaXMgZGlzcGxheWVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIHByb2R1Y3QsCi1hbmQgdGhlbiBzYXZlIGJ5IGNsb3NpbmcgdGhlIHRhYi48L3NwYW4+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIj5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCI+Q3JlYXRlIGEgVGFzazwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlZ3VpZGFuY2UuaHRtbCNjcmVhdGVndWlkYW5jZSI+Q3JlYXRlIEd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVndWlkYW5jZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWYzMzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZWd1aWRhbmNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRlIEd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXRhc2suaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Q3JlYXRlIEd1aWRhbmNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGVndWlkYW5jZSI+PGEgbmFtZT0iY3JlYXRlZ3VpZGFuY2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGUgR3VpZGFuY2U8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj48cD5HdWlkYW5jZSBpcyBhIGdlbmVyYWwgdGVybSBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlPC9hPiwgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2s8L2E+LCBhbmQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCI+V29yayBQcm9kdWN0PC9hPi4gR3VpZGFuY2UKLXByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGhvdyB0byBwZXJmb3JtIHlvdXIgcm9sZSwgaG93IHRvIGNyZWF0ZSBhIHdvcmsgcHJvZHVjdCwKLWhvdyB0byBwZXJmb3JtIHlvdXIgdGFzaywgYW5kIHNvIG9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+LjwvcD4KLTxwPllvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+IGluIGEgPGEgaHJlZj0ibWV0aG9kcGx1Z2luLmh0bWwjbWV0aG9kcGx1Z2luIj5NZXRob2QgUGx1Zy1pbjwvYT4gdGhhdAoteW91IHByb2R1Y2UuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBjcmVhdGU8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+OjwvcD4KLTwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RXhwYW5kIHRoZSBDb250ZW50IFBhY2thZ2UgaW4gd2hpY2ggeW91IHdhbnQgdG8gY3JlYXRlIEd1aWRhbmNlCi11bnRpbCB5b3Ugc2VlIHRoZSBNZXRob2QgRWxlbWVudHMgKFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgR3VpZGFuY2UpLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayA8c3Ryb25nPkd1aWRhbmNlPC9zdHJvbmc+IGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3ICZndDsgImd1aWRhbmNlIHR5cGUiPC9zdHJvbmc+LgotVGhlIGd1aWRhbmNlIGVkaXRvciBmb3IgdGhhdCBwYXJ0aWN1bGFyIGd1aWRhbmNlIHR5cGUgb3BlbnMuIDwvc3Bhbj4gPGRpdiBjbGFzcz0icCI+VGhlCi1mb2xsb3dpbmcgZ3VpZGFuY2UgdHlwZXMgaGF2ZSB0aGUgc2FtZSBlZGl0b3Igd2hpY2ggaW5jbHVkZXMgYSBEZXNjcmlwdGlvbgotdGFiIGFuZCBhIFByZXZpZXcgdGFiOjx1bD48bGk+PGEgaHJlZj0iY29uY2VwdC5odG1sI2NvbmNlcHQiPkNvbmNlcHQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJleGFtcGxlLmh0bWwjZXhhbXBsZSI+RXhhbXBsZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9Imd1aWRlbGluZS5odG1sI2d1aWRlbGluZSI+R3VpZGVsaW5lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icmVwb3J0Lmh0bWwjcmVwb3J0Ij5SZXBvcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyZXVzYWJsZWFzc2V0Lmh0bWwjcmV1c2FibGVhc3NldCI+UmV1c2FibGUgQXNzZXQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJyb2FkbWFwLmh0bWwjcm9hZG1hcCI+Um9hZG1hcDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InN1cHBvcnRpbmdtYXRlcmlhbC5odG1sIj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idGVybWRlZmluaXRpb24uaHRtbCN0ZXJtZGVmaW5pdGlvbiI+VGVybSBEZWZpbml0aW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idG9vbG1lbnRvci5odG1sI3Rvb2xtZW50b3IiPlRvb2wgTWVudG9yPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0id2hpdGVwYXBlci5odG1sI3doaXRlcGFwZXIiPldoaXRlcGFwZXI8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlVzZSB0aGUgZmllbGRzIGluIHRoZSBjb250ZW50IGVsZW1lbnQgZWRpdG9yIHRvIHNwZWNpZnkgdGhlIGd1aWRhbmNlCi1kZXRhaWxzLiBTdGFydCBieSBhc3NpZ25pbmcgYSB1bmlxdWUgbmFtZSB0byB0aGUgZ3VpZGFuY2UgZWxlbWVudCBhbG9uZyB3aXRoCi1hIHByZXNlbnRhdGlvbiBuYW1lIHRoYXQgaXMgdXNlZCBhcyB0aGUgZXh0ZXJuYWwgdmlzaWJsZSBuYW1lIHdoZW4gb3RoZXIgZWxlbWVudHMKLXJlZmVyIHRvIHRoaXMgZWxlbWVudCwgb3Igd2hlbiB0aGUgZWxlbWVudCBpcyBwdWJsaXNoZWQuIEV2ZXJ5IGd1aWRhbmNlIHR5cGUKLWhhcyBzcGVjaWZpYyBjb250ZW50IGZpZWxkcyBpbiB0aGUgY29udGVudCBlZGl0b3IgdGhhdCBhcmUgZGlzdHJpYnV0ZWQgb3ZlcgotdHdvIG9yIG1vcmUgc3RhY2tlZCB0YWJzLiBVc2UgdGhlIGNvbnRlbnQgZmllbGRzIHRvIGRlc2NyaWJlIHlvdXIgZ3VpZGFuY2UKLXR5cGUuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gWW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgdG8gZWRpdCBvciBlbnRlcgotdGhlIHRleHQgZm9yIGFueSBmaWVsZCB0aGF0IGhhcyBhIHR3aXN0eSBzeW1ib2wgPGltZyBzcmM9ImNvbGxhcHNlZC5naWYiIGFsdD0iIiAvPi4gU2ltcGx5IGNsaWNrIHRoZSBzeW1ib2wgdG8gYWNjZXNzIHRoZSBSaWNoIFRleHQgRWRpdG9yLgotQ2xpY2sgdGhlIHN5bWJvbCBhZ2FpbiB0byBjbG9zZSB0aGUgUmljaCBUZXh0IEVkaXRvci4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLXNlZSA8YSBocmVmPSJyaWNodGV4dGVkaXRvci5odG1sI3JpY2h0ZXh0ZWRpdG9yIj5SaWNoIFRleHQgRWRpdG9yPC9hPi48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBJY29uIHNlY3Rpb24sIHNlbGVjdCBhIE5vZGUgaWNvbiB0byBhcHBlYXIgd2l0aCB0aGUgd29yawotcHJvZHVjdCBpbiB0aGUgPGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCNsaWJyYXJ5dmlldyI+TGlicmFyeSBWaWV3PC9hPiBhbmQgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPiBhbmQKLWluIHRoZSB0cmVlIGJyb3dzZXIgaW4gYSBwdWJsaXNoZWQgV2ViIHNpdGUuIFRoZSBub2RlIGljb24gc2hvdWxkIGJlIDE2IHgKLTE2IHBpeGVscy4gWW91IGNhbiBhbHNvIHNlbGVjdCBhIFNoYXBlIGljb24gdG8gYXBwZWFyIGF0IHRoZSB0b3Agb2YgdGhlIHB1Ymxpc2hlZAotcGFnZSBmb3IgdGhlIHdvcmsgcHJvZHVjdC4gVGhlIHNoYXBlIGljb24gc2hvdWxkIGJlIDMyIHggMzIgcGl4ZWxzLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzdHJvbmc+UHJldmlldzwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCB3b3JrIHByb2R1Y3QKLWFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgdGFiLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkl0IGlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgdHlwZXMgb2Ygc29tZSB0eXBlcyBvZiBndWlkYW5jZSB0byBhCi1saW1pdGVkIG51bWJlciBvZiBvdGhlciBndWlkYW5jZSB0eXBlcy4gVG8gY2hhbmdlIGEgZ3VpZGFuY2UgdHlwZSwgY2xpY2sgdGhlIDxzdHJvbmc+Q2hhbmdlCi1UeXBlPC9zdHJvbmc+IGJ1dHRvbiBhbmQgc2VsZWN0IGFuIGF2YWlsYWJsZSBuZXcgdHlwZS48cD5JZiB0aGUgdHlwZSBvZiBndWlkYW5jZQotaXMgYSA8YSBocmVmPSJwcmFjdGljZS5odG1sI3ByYWN0aWNlIj5QcmFjdGljZTwvYT4sIHlvdSBjYW4gYWRkCi1yZWZlcmVuY2VzIHRvIG90aGVyIGVsZW1lbnRzLiBJZiB0aGUgZ3VpZGFuY2UgaXMgYSA8YSBocmVmPSJ0ZW1wbGF0ZS5odG1sIj5UZW1wbGF0ZTwvYT4sCi15b3UgY2FuIGF0dGFjaCBhIGZpbGUgdG8gdGhlIGd1aWRhbmNlLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCI+Q3JlYXRlIE1ldGhvZCBDb250ZW50PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwiPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sI2NyZWF0ZWF3b3JrcHJvZHVjdCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2NyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmMjZmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9jcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGUgTWV0aG9kIENvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlZ3VpZGFuY2UuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRlbWV0aG9kY29udGVudCI+PGEgbmFtZT0iY3JlYXRlbWV0aG9kY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPjxwPk1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi1wbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUKLW1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQKLXRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPk1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZTo8L3A+Ci08dWw+PGxpPjxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkYW5jZS5odG1sIj5HdWlkYW5jZTwvYT48L2xpPgotPC91bD4KLUNsaWNrIGhlcmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+LjwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIG1ldGhvZCBjb250ZW50OjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkgVmlldzwvYT4sCi1leHBhbmQgdGhlIGNvbnRlbnQgcGFja2FnZSBpbiB3aGljaCB5b3Ugd2FudCB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgZm9sZGVyIGNvbnRhaW5pbmcgdGhlIHR5cGUgb2YgbWV0aG9kIGVsZW1lbnQgeW91Ci13YW50IHRvIGNyZWF0ZSwgY2xpY2sgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gc2VsZWN0IHRoZSBlbGVtZW50IHRoYXQgYXBwZWFycy4KLVRoZSBuZXcgZWxlbWVudCBpcyBjcmVhdGVkIGFuZCBpdHMgcmVzcGVjdGl2ZSBlZGl0b3Igb3BlbnMuPC9zcGFuPiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRm9yCi1Xb3JrIFByb2R1Y3RzLCBjaG9vc2UgYmV0d2VlbiBBcnRpZmFjdCwgT3V0Y29tZSwgb3IgRGVsaXZlcmFibGUuIEZvciBHdWlkYW5jZSwKLWNob29zZSBmcm9tIHRoZSBsaXN0IG9mIGd1aWRhbmNlIHR5cGVzLjwvZGl2PgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVhcm9sZS5odG1sIj5DcmVhdGUgYSBSb2xlPC9hPjwvc3Ryb25nPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iY3JlYXRlYXRhc2suaHRtbCI+Q3JlYXRlIGEgVGFzazwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJjcmVhdGVndWlkYW5jZS5odG1sIj5DcmVhdGUgR3VpZGFuY2U8L2E+PC9zdHJvbmc+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sIj5WYXJpYWJpbGl0eTwvYT48L3N0cm9uZz48YnIgLz4KLVZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZQotb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcKLXRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZwotdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLjwvbGk+Ci08L3VsPgotCi08ZGl2IGNsYXNzPSJsaW5rbGlzdCI+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF0YXNrLmh0bWwjY3JlYXRlYXRhc2siPkNyZWF0ZSBhIFRhc2s8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIj5DcmVhdGUgYSBXb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2N1dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjExZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvY3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyYWJsZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IyNjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJhYmxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwjY3JlYXRlYXdvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcnRpZmFjdC5odG1sI2FydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJvdXRjb21lLmh0bWwjb3V0Y29tZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZWxpdmVyYWJsZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EZWxpdmVyYWJsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGVsaXZlcmFibGUiPjxhIG5hbWU9ImRlbGl2ZXJhYmxlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVsaXZlcmFibGU8L2gxPgotPGRpdj48cD5BIGRlbGl2ZXJhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiB3b3JrIHByb2R1Y3RzLCB1c3VhbGx5IGFydGlmYWN0cy4gQSBkZWxpdmVyYWJsZQotaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvZiB3b3JrIHByb2R1Y3RzCi1wYWNrYWdlZCBmb3IgZGVsaXZlcnkuIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYQotcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIsIG9yIG90aGVyCi1zdGFrZWhvbGRlci48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImFydGlmYWN0Lmh0bWwjYXJ0aWZhY3QiPkFydGlmYWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZWxpdmVyeXByb2Nlc3MuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJ5cHJvY2Vzcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDVlOWJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RlbGl2ZXJ5cHJvY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsaXZlcnkgUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2NyZWF0ZWFkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkZWxpdmVyeXByb2Nlc3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGVsaXZlcnkgUHJvY2VzczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZGVsaXZlcnlwcm9jZXNzIj48YSBuYW1lPSJkZWxpdmVyeXByb2Nlc3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZWxpdmVyeSBQcm9jZXNzPC9oMT4KLTxkaXY+PHA+QSBEZWxpdmVyeSBQcm9jZXNzIGlzIHRoZSBwcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlCi1mcm9tIGJlZ2lubmluZyB0byBlbmQuIEEgRGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZwotYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQKLXBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMuPC9wPgotPC9kaXY+Ci08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjNhOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkluIHRoZSBUZWFtIEFsbG9jYXRpb24gdmlldywgeW91IGNhbiBjcmVhdGUgYSBwcm9jZXNzIGJ5IGRlZmluaW5nCi13aGljaCByb2xlcyBwYXJ0aWNpcGF0ZSBpbiBhY3Rpdml0aWVzIGFuZCBmaW5kIHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgYW5kCi10YXNrcyBmcm9tIHRoZXJlLiBZb3UgY2FuIGFsc28gcmV2aWV3IHRoZSByb2xlcyBpbiBhIHByb2Nlc3MgdGhhdCBoYXMgYmVlbgotY3JlYXRlZCBieSBhZGRpbmcgdGFza3Mgb3Igd29yayBwcm9kdWN0cyB0byB0aGUgcHJvY2Vzcy4gQmVmb3JlIHlvdSBjcmVhdGUKLWEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGluIHRoZSB0b29sCi1iYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLWZvciB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgdGVhbSBhbGxvY2F0aW9uIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPlRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPiB0YWIKLWluIHRoZSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgdG9waWMsIHRoZQotYnJlYWtkb3duIGVsZW1lbnQgZXhhbXBsZSB1c2VkIGlzIDxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPi4KLU90aGVyIGJyZWFrZG93biBlbGVtZW50cyBpbmNsdWRlIChidXQgYXJlIG5vdCBsaW1pdGVkIHRvKSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4gYW5kIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPi4KLVRoZSBlbGVtZW50IHlvdSB1c2UgZGVwZW5kcyBvbiB0aGUgc2NvcGUgb2YgdGhlIHByb2Nlc3MgeW91IGNyZWF0ZS48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS4KLVlvdSBjYW4gYWRkIHJvbGVzIGRpcmVjdGx5IHRvIHlvdXIgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldywgcmV2aWV3IHRoZSBsaXN0IG9mIHJvbGVzLiBJbiB0aGlzIHZpZXcsCi10YXNrcyBhcmUgc29ydGVkIGJ5IHJvbGUgc2V0cy48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RHJpbGwgaW50byB0aGUgcm9sZSBzZXRzIGhpZXJhcmNoeSB0byBzZWUgd2hpY2ggcm9sZXMgYXJlIGF2YWlsYWJsZQotaW4gdGhpcyBjb25maWd1cmF0aW9uLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSByb2xlIGFuZCBkcmFnIGl0IG9uIHRvcCBvZiB0aGUgYXBwcm9wcmlhdGUgYWN0aXZpdHkuIFRoZQotcm9sZSBpcyBhZGRlZCBhcyBhIHJvbGUgZGVzY3JpcHRvci4gSWYgdGhlIHJvbGUgaXMgcmVzcG9uc2libGUgZm9yIHdvcmsgcHJvZHVjdHMKLWluIHRoZSBjb25maWd1cmF0aW9uJ3MgbWV0aG9kIGNvbnRlbnQsIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdSB0byBhZGQKLXdvcmsgcHJvZHVjdHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uIEZvcgotZWFjaCBzZWxlY3RlZCB3b3JrIHByb2R1Y3QgdGhlIG5leHQgd2l6YXJkIHdpbmRvdyBwcm9tcHRzIHlvdSB0byBzZWxlY3QgdGFza3MKLXRoYXQgcHJvZHVjZSB0aGVzZSB3b3JrIHByb2R1Y3RzLiBBZ2Fpbiwgc2VsZWN0IG9uZSBvciBtb3JlIHRhc2tzIGFuZCB0aGVuCi1jbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+IHRvIGFkZCB0aGVzZSBlbGVtZW50cyB0byB5b3VyIHByb2Nlc3MuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJldmlldyB0aGUgcm9sZSBkZXNjcmlwdG9yJ3MgZGV0YWlscyBpbiBpdHMgcHJvcGVydGllcyB2aWV3LiBJZgotdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3QgZGlzcGxheWVkLCBpbiB0aGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwKLXJpZ2h0IGNsaWNrIHRoZSByb2xlIGFuZCB0aGVuIHNlbGVjdCA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4uIFVzZSB0aGUgdGFicyBvbiB0aGUKLXNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50IGFzcGVjdHMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvci4KLUluIHRoZSBwcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwgbW9kaWZpY2F0aW9ucyBvZiB0aGUKLXJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLCBhZGQgdGV4dHVhbCBkZXNjcmlwdGlvbnMsCi1jaGFuZ2Ugd29yayBwcm9kdWN0cyB0aGUgcm9sZSBpcyByZXNwb25zaWJsZSBmb3IsIGFuZCBtb3JlLiBXaGVuIGNoYW5naW5nCi10aGUgdGFzayBkZXNjcmlwdG9yJ3MgcmVsYXRpb25zaGlwcyB1bmRlciB0aGUgcm9sZXMgb3Igd29yayBwcm9kdWN0cyB0YWJzLAoteW91IGNhbiBhZGQgbmV3IGVsZW1lbnRzIGZyb20geW91ciBtZXRob2QgY29udGVudCBieSBjbGlja2luZyB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uLAotb3IgY29ubmVjdCB5b3VyIHRhc2sgZGVzY3JpcHRvciB3aXRoIHRhc2tzIGFscmVhZHkgcHJlc2VudCBpbiB0aGlzIGFjdGl2aXR5LgotRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8YSBocmVmPSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwjcHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldyI+UHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldzwvYT48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHJvbGVzIHRvIHlvdXIgYWN0aXZpdGllcy48L3NwYW4+PC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIHByZXZpZXcgd2hhdCB5b3VyIHByb2Nlc3Mgd2lsbCBsb29rIGxpa2UgaW4gYSBwdWJsaXNoZWQgV2ViCi1zaXRlIGF0IGFueSB0aW1lIGJ5IHN3aXRjaGluZyB0byB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCB0aGVuIHNlbGVjdGluZyB0aGUgcHJvY2Vzcywgb3IgYW4gYWN0aXZpdHkgaW4gdGhlCi1wcm9jZXNzLCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gWW91IGNhbiB1c2UgdGhlCi1saW5rcyBvbiB0aGUgcGFnZSB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBwcm9jZXNzLiBTd2l0Y2ggYmFjayB0byB0aGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPiB0bwotY29udGludWUgZWRpdGluZyB5b3VyIHByb2Nlc3MuPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUiPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+RGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0N2ViMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmticmVha2Rvd25zdHJ1Y3R1cmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJ0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSI+PGEgbmFtZT0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGV2ZWxvcCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkEgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGlzIGEgaGllcmFyY2hpY2FsIGJyZWFrZG93biBvZiB3b3JrLCBzdWNoCi1hcyBhY3Rpdml0aWVzLCB0YXNrcywgYW5kIHN0ZXBzLCBkZWZpbmluZyBhIHByb2Nlc3MuIDxwPkJlZm9yZSBjcmVhdGluZyBhCi13b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsIGJlIHN1cmUgdGhhdCB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3RlZCBpbiB0aGUgdG9vbAotYmFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLWZvciB5b3VyIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgd29yayBicmVha2Rvd24gc3RydWN0dXJlOjwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gYWNjZXNzIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCBzZWxlY3QgdGhlIDxzdHJvbmc+V29yawotQnJlYWtkb3duIFN0cnVjdHVyZTwvc3Ryb25nPiB0YWIgaW4gYSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGJyZWFrZG93bgotc3RydWN0dXJlIGlzIGNyZWF0ZWQgd2l0aCBicmVha2Rvd24gZWxlbWVudHMuIEV4YW1wbGVzIG9mIGJyZWFrZG93biBlbGVtZW50cwotYXJlIDxhIGhyZWY9InBoYXNlLmh0bWwjcGhhc2UiPlBoYXNlPC9hPiwgPGEgaHJlZj0iaXRlcmF0aW9uLmh0bWwjaXRlcmF0aW9uIj5JdGVyYXRpb248L2E+LCA8YSBocmVmPSJhY3Rpdml0eS5odG1sI2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT4sCi1vciB0YXNrIGRlc2NyaXB0b3IuIFR5cGljYWxseSwgYSBwcm9jZXNzIGlzIGNyZWF0ZWQgYnkgZGVmaW5pbmcKLWl0cyBwaGFzZXMgYW5kIGl0ZXJhdGlvbnMgd2l0aGluIG9yIGFjcm9zcyB0aGVzZSBwaGFzZXMuIFBoYXNlcyBhbmQgaXRlcmF0aW9ucwotYXJlIHRoZW4gZnVydGhlciBicm9rZW4gZG93biBpbnRvIGxldmVscyBvZiBhY3Rpdml0aWVzLiBGaW5hbGx5LCB5b3UgY2FuIHBvcHVsYXRlCi1hIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSdzIGFjdGl2aXR5IHdpdGggdGFzayBkZXNjcmlwdG9ycy48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSB0aGUgbmV3IGFjdGl2aXR5LiBJZiBuZWVkZWQsIGNyZWF0ZSBtb3JlIGFjdGl2aXRpZXMKLXRvIHNldCB1cCB5b3VyIGJyZWFrZG93biBzdHJ1Y3R1cmUuIEFjdGl2aXRpZXMgKGFzIHdlbGwgYXMgcGhhc2VzIGFuZCBpdGVyYXRpb25zKQotY2FuIGJlIG5lc3RlZCBpbnNpZGUgZWFjaCBvdGhlciBhY2NvcmRpbmcgdG8gaG93IGVhY2ggcmVsYXRlcyBpbiB0aGUgaGllcmFyY2h5Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayB0aGUgYWN0aXZpdHkgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPiB0byBvcGVuCi10aGUgUHJvcGVydGllcyB2aWV3LiBDb21wbGV0ZSB0aGUgaW5mb3JtYXRpb24gdW5kZXIgdGhlIERvY3VtZW50YXRpb24gdGFiCi1mb3IgdGhlIGFjdGl2aXR5LiBUaGlzIGluZm9ybWF0aW9uIGFwcGVhcnMgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlCi1hY3Rpdml0eS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBsaXN0IG9mIHRhc2tzIGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcgdG8gc2VlIHdoaWNoCi10YXNrcyBhcmUgYXZhaWxhYmxlLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSB0YXNrIHRvIGFkZCB0byB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdGhlbiBkcmFnIGl0Ci1vbiB0b3Agb2YgdGhlIGFjdGl2aXR5IHRvIHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlbG9uZy4gVGhlIHRhc2sgaXMgYWRkZWQgYXMKLWEgdGFzayBkZXNjcmlwdG9yIHRvIHRoYXQgYWN0aXZpdHkuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZSBwcm9wZXJ0aWVzIHZpZXcgZm9yIHRoZSBhY3Rpdml0eSBpcyBub3QgZGlzcGxheWVkLCBzZWxlY3QKLXRoZSB0YXNrIGluIHRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCByaWdodCBjbGljaywgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+UHJvcGVydGllczwvc3Ryb25nPi4KLUNsaWNrIHRoZSA8c3Ryb25nPkRvY3VtZW50YXRpb248L3N0cm9uZz4gdGFiIGFuZCB0aGVuIGNvbXBsZXRlIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotdW5kZXIgdGhpcyB0YWIuIFRoaXMgaW5mb3JtYXRpb24gYXBwZWFycyBpbiB0aGUgcHVibGlzaGVkIFdlYiBwYWdlIGZvciB0aGUKLWFjdGl2aXR5LiBVc2UgdGhlIHRhYnMgb24gdGhlIHNpZGUgb2YgdGhlIHByb3BlcnRpZXMgdmlldyB0byByZXZpZXcgZGlmZmVyZW50Ci1hc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IuIEluIHRoZSBwcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gcGVyZm9ybSBpbmRpdmlkdWFsCi1tb2RpZmljYXRpb25zIG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IsIHN1Y2ggYXMgY2hhbmdlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwKLWFkZCB0ZXh0dWFsIGRlc2NyaXB0aW9ucywgYW5kIGNoYW5nZSBwZXJmb3JtaW5nIHJvbGVzLCBhbW9uZyBvdGhlcnMuIFdoZW4KLWNoYW5naW5nIHRoZSB0YXNrIGRlc2NyaXB0b3IncyByZWxhdGlvbnNoaXBzIHVuZGVyIHRoZSByb2xlcyBvciB3b3JrIHByb2R1Y3RzCi10YWJzLCB5b3UgY2FuIGFkZCBuZXcgZWxlbWVudHMgZnJvbSB5b3VyIG1ldGhvZCBjb250ZW50IGJ5IGNsaWNraW5nIHRoZSA8c3Ryb25nPkFkZC4uLjwvc3Ryb25nPiBidXR0b24sCi1vciBjb25uZWN0IHlvdXIgdGFzayBkZXNjcmlwdG9yIHdpdGggdGFza3MgYWxyZWFkeSBwcmVzZW50IGluIHRoaXMgYWN0aXZpdHkuCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCNwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Ij5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9hPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q29udGludWUgYWRkaW5nIHRhc2tzIHRvIHRoZSBhY3Rpdml0eSBvciBhY3Rpdml0aWVzLjwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gcHJldmlldyB3aGF0IHlvdXIgcHJvY2VzcyB3aWxsIGxvb2sgbGlrZSBpbiBhIHB1Ymxpc2hlZCBXZWIKLXNpdGUgYXQgYW55IHRpbWUgYnkgc3dpdGNoaW5nIHRvIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIHRoZW4gc2VsZWN0aW5nIHRoZSBwcm9jZXNzLCBvciBhbiBhY3Rpdml0eSBpbiB0aGUKLXByb2Nlc3MsIGluIHRoZSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+LiBZb3UgY2FuIHVzZSB0aGUKLWxpbmtzIG9uIHRoZSBwYWdlIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIHByb2Nlc3MuIFN3aXRjaCBiYWNrIHRvIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IHRvCi1jb250aW51ZSBlZGl0aW5nIHlvdXIgcHJvY2Vzcy48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImRldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUuaHRtbCNkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlIj5EZXZlbG9wIGEgVGVhbSBBbGxvY2F0aW9uIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBQcm9kdWN0IFVzYWdlIFN0cnVjdHVyZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBhMDYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRhc2siIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGV2ZWxvcCBhIFdvcmsgUHJvZHVjdCBVc2FnZSBTdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImRldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZS5odG1sI2RldmVsb3Bhd29ya2JyZWFrZG93bnN0cnVjdHVyZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZS5odG1sI2RldmVsb3BhdGVhbWFsbG9jYXRpb25zdHJ1Y3R1cmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGV2ZWxvcGF3b3JrcHJvZHVjdHVzYWdlc3RydWN0dXJlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkZXZlbG9wYXdvcmtwcm9kdWN0dXNhZ2VzdHJ1Y3R1cmUiPjxhIG5hbWU9ImRldmVsb3Bhd29ya3Byb2R1Y3R1c2FnZXN0cnVjdHVyZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRldmVsb3AgYSBXb3JrIFByb2R1Y3QgVXNhZ2UgU3RydWN0dXJlPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0icCI+SW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZSB2aWV3LCB5b3UgY2FuIGNyZWF0ZSBhIHByb2Nlc3MgYnkgZGVmaW5pbmcKLXdoaWNoIHdvcmsgcHJvZHVjdHMgd2lsbCBiZSBjcmVhdGVkIGFuZCB1c2VkIGluIHRoZSBwcm9jZXNzLCBhbmQgdGhlbiBmaW5kaW5nCi1yZXNwb25zaWJsZSByb2xlcyBhbmQgdGFza3MgZnJvbSB0aGVyZS4gWW91IGNhbiBhbHNvIHJldmlldyB0aGUgd29yayBwcm9kdWN0cwotaW4gYSBwcm9jZXNzIHRoYXQgaGFzIGJlZW4gY3JlYXRlZCBieSBhZGRpbmcgdGFza3Mgb3Igcm9sZXMgdG8gdGhlIHByb2Nlc3MuPHA+QmVmb3JlCi15b3UgY3JlYXRlIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZSwgZW5zdXJlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGVkCi1pbiB0aGUgdG9vbCBiYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNvbmZpZ3VyYXRpb24geW91IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0Ci1jb25maWd1cmF0aW9uIGZvciB5b3VyIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBkZXZlbG9wIGEgd29yayBwcm9kdWN0IHVzYWdlIHN0cnVjdHVyZTo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFjY2VzcyB0aGUgd29yayBwcm9kdWN0IHVzYWdlIGVkaXRvciwgc2VsZWN0IHRoZSA8c3Ryb25nPldvcmsgUHJvZHVjdAotVXNhZ2U8L3N0cm9uZz4gdGFiIGluIHRoZSBwcm9jZXNzIGVkaXRvci48L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBGb3IgdGhlIHB1cnBvc2VzIG9mCi10aGlzIHRvcGljLCB0aGUgYnJlYWtkb3duIGVsZW1lbnQgZXhhbXBsZSB1c2VkIGlzIDxhIGhyZWY9ImFjdGl2aXR5Lmh0bWwjYWN0aXZpdHkiPkFjdGl2aXR5PC9hPi4gT3RoZXIgYnJlYWtkb3duIGVsZW1lbnRzIGluY2x1ZGUgKGJ1dCBhcmUgbm90IGxpbWl0ZWQKLXRvKSA8YSBocmVmPSJwaGFzZS5odG1sI3BoYXNlIj5QaGFzZTwvYT4gYW5kIDxhIGhyZWY9Iml0ZXJhdGlvbi5odG1sI2l0ZXJhdGlvbiI+SXRlcmF0aW9uPC9hPi4gVGhlIGVsZW1lbnQgeW91IHVzZSBkZXBlbmRzIG9uIHRoZSBzY29wZSBvZiB0aGUgcHJvY2VzcwoteW91IGNyZWF0ZS48L2Rpdj4KLTwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIHRoZSBlbGVtZW50IChlaXRoZXIgYSA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5DYXBhYmlsaXR5IFBhdHRlcm48L2E+IG9yIDxhIGhyZWY9ImRlbGl2ZXJ5cHJvY2Vzcy5odG1sI2RlbGl2ZXJ5cHJvY2VzcyI+RGVsaXZlcnkgUHJvY2VzczwvYT4pIHRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCBzdHJ1Y3R1cmUsIGFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+TmV3Ci1DaGlsZCAmZ3Q7IEFjdGl2aXR5PC9zdHJvbmc+IHRvIGNyZWF0ZSBhIG5ldyBhY3Rpdml0eS4gSWYgbmVlZGVkLCBjcmVhdGUgbW9yZSBhY3Rpdml0aWVzCi10byBzZXQgdXAgeW91ciBicmVha2Rvd24gc3RydWN0dXJlLiBBY3Rpdml0aWVzIChhcyB3ZWxsIGFzIHBoYXNlcyBhbmQgaXRlcmF0aW9ucykKLWNhbiBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIgYWNjb3JkaW5nIHRvIGhvdyBlYWNoIHJlbGF0ZXMgaW4gdGhlIGhpZXJhcmNoeS48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+UmV2aWV3IHRoZSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMgaW4gdGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4uIEluIHRoaXMgdmlldywgd29yayBwcm9kdWN0cyBhcmUgc29ydGVkIGJ5IGRvbWFpbiBhcwotd2VsbCBhcyB3b3JrIHByb2R1Y3Qga2luZHMuIERyaWxsIGludG8gZWl0aGVyIG9mIHRoZXNlIGhpZXJhcmNoaWVzIHRvIHNlZQotd2hpY2ggd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlIGluIHRoaXMgY29uZmlndXJhdGlvbi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGEgd29yayBwcm9kdWN0IHRvIGFkZCB0byBhY3Rpdml0eSBhbmQgdGhlbiBkcmFnIGl0IG9uIHRvcAotb2YgdGhlIGFjdGl2aXR5IHdoaWNoIHlvdSB3YW50IGl0IHRvIGJlbG9uZy4gVGhlIHdvcmsgcHJvZHVjdCBpcyBhZGRlZCBhcwotYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGF0IGFjdGl2aXR5LiBJZiB0aGUgd29yayBwcm9kdWN0IGlzIGFuIG91dHB1dAotdG8gb25lIG9yIG1vcmUgdGFza3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGEgd2l6YXJkIGFwcGVhcnMgcHJvbXB0aW5nIHlvdQotdG8gYWRkIHRoZSB0YXNrLiA8L3NwYW4+IDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJdCBpcyBub3QgcmVxdWlyZWQgdG8gYWRkIGEgdGFzay4gQSB2YWxpZAotcHJvY2VzcyBjYW4gY29udGFpbiBqdXN0IHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgZW50cnkgYW5kIGV4aXQgc3RhdGVzIG9mIHRoZSB3b3JrIHByb2R1Y3QgZm9yIHRoZSBhY3Rpdml0eQotdG8gd2hpY2ggaXQgd2FzIGFkZGVkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SZXZpZXcgdGhlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBkZXRhaWxzIGluIHRoZSBwcm9wZXJ0aWVzCi12aWV3LiBJZiB0aGUgcHJvcGVydGllcyB2aWV3IGlzIG5vdCBkaXNwbGF5ZWQsIHJpZ2h0IGNsaWNrIHRoZSB3b3JrIHByb2R1Y3QKLWRlc2NyaXB0b3IgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLCBhbmQgdGhlbiBzZWxlY3QgPHN0cm9uZz5Qcm9wZXJ0aWVzPC9zdHJvbmc+LiBVc2UgdGhlCi10YWJzIG9uIHRoZSBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzIHZpZXcgdG8gcmV2aWV3IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZQotd29yayBwcm9kdWN0IGRlc2NyaXB0b3IuIEluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHlvdSBjYW4gYWxzbyBwZXJmb3JtIGluZGl2aWR1YWwKLW1vZGlmaWNhdGlvbnMgb2YgdGhlIHJvbGUgZGVzY3JpcHRvciwgc3VjaCBhcyBjaGFuZ2UgdGhlIHByZXNlbnRhdGlvbiBuYW1lLAotYWRkIHRleHR1YWwgZGVzY3JpcHRpb25zLCBhZGQgZW50cnkgYW5kIGV4aXQgc3RhdGVzLCBhbmQgbW9yZS4gV2hlbiBjaGFuZ2luZwotdGhlIHJvbGUgZGVzY3JpcHRvcidzIHJlbGF0aW9uc2hpcHMgdW5kZXIgdGhlIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMgdGFicywKLXlvdSBjYW4gYWRkIG5ldyBlbGVtZW50cyBmcm9tIHlvdXIgbWV0aG9kIGNvbnRlbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+QWRkLi4uPC9zdHJvbmc+IGJ1dHRvbiwKLW9yIGNvbm5lY3QgeW91ciByb2xlIGRlc2NyaXB0b3Igd2l0aCB0YXNrcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhpcyBhY3Rpdml0eS4KLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0icHJvY2Vzc2VsZW1lbnRwcm9wZXJ0aWVzdmlldy5odG1sI3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L2E+Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Db250aW51ZSBhZGRpbmcgd29yayBwcm9kdWN0cyB0byB5b3VyIGFjdGl2aXRpZXMuIDwvc3Bhbj48L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlNlZSBhbHNvOjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF3b3JrYnJlYWtkb3duc3RydWN0dXJlIj5EZXZlbG9wIGEgV29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJkZXZlbG9wYXRlYW1hbGxvY2F0aW9uc3RydWN0dXJlLmh0bWwjZGV2ZWxvcGF0ZWFtYWxsb2NhdGlvbnN0cnVjdHVyZSI+RGV2ZWxvcCBhIFRlYW0gQWxsb2NhdGlvbiBTdHJ1Y3R1cmU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2RpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGIxYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEaWZmZXJlbmNlcyBCZXR3ZWVuIElCTSBSVVAgMjAwMyBhbmQgTWlncmF0ZWQgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWlncmF0aW9ub3ZlcnZpZXcuaHRtbCNtaWdyYXRpb25vdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWlncmF0ZWFucnB3MjAwM3BsdWdpbi5odG1sI21pZ3JhdGVhbnJwdzIwMDNwbHVnaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGlmZmVyZW5jZXNiZXR3ZWVuZXhpc3RpbmdhbmRtaWdyYXRlZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RGlmZmVyZW5jZXMgQmV0d2VlbiBJQk0gUlVQIDIwMDMgYW5kIE1pZ3JhdGVkIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImRpZmZlcmVuY2VzYmV0d2VlbmV4aXN0aW5nYW5kbWlncmF0ZWRjb250ZW50Ij48YSBuYW1lPSJkaWZmZXJlbmNlc2JldHdlZW5leGlzdGluZ2FuZG1pZ3JhdGVkY29udGVudCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRpZmZlcmVuY2VzIEJldHdlZW4gSUJNIFJVUCAyMDAzIGFuZCBNaWdyYXRlZCBDb250ZW50PC9oMT4KLTxkaXY+PHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBjb250ZW50IGlzIGJhc2VkIG9uIElCTSBVbmlmaWVkCi1NZXRob2QgQXJjaGl0ZWN0dXJlLjwvcD4KLTx1bD48bGk+PHN0cm9uZz5BY3Rpdml0aWVzIGhhdmUgYmVlbiByZW5hbWVkIHRvIHRhc2s8L3N0cm9uZz46IFRvIHByb3ZpZGUgYSB0aWdodGVyIGxpbmsKLXRvIHByb2Nlc3MgZW5hY3RtZW50IGFuZCBwcm9qZWN0IG1hbmFnZW1lbnQgd2UgcmVuYW1lZCB0aGUgbG93ZXN0IGFzc2lnbmFibGUKLXVuaXRzIG9mIHdvcmsgdG8gVGFzaywgYmVjYXVzZSB0aGlzIGlzIHRoZSB0ZXJtIG1vc3QgY29tbW9ubHkgdXNlZC48L2xpPgotPGxpPjxzdHJvbmc+V29ya2Zsb3cgZGV0YWlscyByZW5hbWVkIHRvIGFjdGl2aXR5PC9zdHJvbmc+OiBXb3JrZmxvd3MgYXJlIGNvbW1vbmx5IGV4cHJlc3NlZAotaW4gaGllcmFyY2hpZXMgb2YgYWN0aXZpdHkgZGlhZ3JhbXMgKGUuZy4gYWN0aXZpdHkgZGlhZ3JhbXMgZGVmaW5lZCBpbiB0aGUKLVVNTCAyLjApLiAgQWx0aG91Z2ggUlVQIG9ubHkgcHJvdmlkZWQgb25lIGxldmVsIG9mIHdvcmtmbG93IGJyZWFrZG93biwgVU1BCi1pcyBkZXNpZ25lZCB0byBwcm92aWRlIG11bHRpcGxlIGxldmVscyBvZiBzdWNoIGEgYnJlYWtkb3duLiBCZWNhdXNlIHRoZSB3b3JkCi1BY3Rpdml0eSB3YXMgbW9yZSBjb21tb25seSB1c2VkIHRvIGV4cHJlc3MgdGhlIGVsZW1lbnRzIG9mIGFjdGl2aXR5IGRpYWdyYW1zCi1hcyB3ZWxsIGFzIHRoZSBhY3Rpdml0eSBkaWFncmFtIGl0c2VsZiwgd2UgZGVjaWRlZCB0byByZXBsYWNlIHRoZSBuYW1lIFdvcmtmbG93Ci1EZXRhaWwgdXNlZCBpbiBSVVAgd2l0aCB0aGUgbmFtZSBBY3Rpdml0eS4gIFdlIHJlYWxpemUgdGhhdCB0aGUgc2hpZnQgaW4gdGhlCi11c2FnZSBvZiB0aGUgd29yZCBBY3Rpdml0eSBtaWdodCBjYXVzZSBjb25mdXNpb24gd2l0aCBleGlzdGluZyBSVVAgdXNlcnMuCi0gSG93ZXZlciwgb25lIGltcG9ydGFudCBnb2FsIG9mIHRoZSBVTUEgd29yayB3YXMgdG8gdXNlIHRlcm1zIGluIHRoZSB3YXkgdGhleQotYXJlIG1vc3QgY29tbW9ubHkgdXNlZCBpbiBzdGFuZGFyZHMgYW5kIGluZHVzdHJ5LiA8L2xpPgotPGxpPjxzdHJvbmc+VGFza3MgKGZvcm1lciBSVVAgQWN0aXZpdGllcykgY2FuIGJlIHBlcmZvcm1lZCBieSBtYW55IHJvbGVzPC9zdHJvbmc+OiAKLUluIFJVUCAyMDAzIGFuIGFjdGl2aXR5IHdhcyBtb2RlbGVkIGFzIGFuIG9wZXJhdGlvbiBvZiBhIHJvbGUuICBDdXN0b21lciBmZWVkYmFjaywKLWEgbG9vayBhdCBvdGhlciBwcm9jZXNzIG1vZGVsaW5nIGFwcHJvYWNoZXMsIGFzIHdlbGwgYXMgY2hhbmdlcyBpbnRyb2R1Y2VkCi1pbiBVTUwgMi4wIGluZGljYXRlZCB0aGF0IHRoaXMgd2FzIGEgdG9vIHJlc3RyaWN0aXZlIHdheSBvZiBtb2RlbGluZyBodW1hbgotYmVoYXZpb3IuICBUaGlzIGFwcHJvYWNoIGRpZCBub3QgYWxsb3cgZXhwcmVzc2luZyB0aGF0IHNvbWUgd29yayB3YXMgcGVyZm9ybWVkCi1hcyBhIGNvbGxhYm9yYXRpb24gb2YgZGlmZmVyZW50IHJvbGVzLiAgVU1BIGFkZHJlc3NlcyB0aGlzIGlzc3VlIGJ5IG1ha2luZwotVGFzayBhbiBpbmRlcGVuZGVudCBtb2RlbCBlbGVtZW50IHRvIHdoaWNoIHBlcmZvcm1pbmcgcm9sZXMgY2FuIGJlIGFzc2lnbmVkCi1hcyByZXNvdXJjZXMuICBVTUEgdGhlcmVmb3JlIG5vdyBhbGxvd3Mgc2V2ZXJhbCByb2xlcyB0byBiZSBhc3NpZ25lZCB0byBhCi10YXNrLiAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGl0IHN0aWxsIGFsbG93cyBhIHByaW1hcnkgcGVyZm9ybWluZyByb2xlCi10byBiZSBpZGVudGlmaWVkIChiZWluZyByZXNwb25zaWJsZSBmb3IgdGhlIHRhc2spIGFzIHdlbGwgYXMgc2V2ZXJhbCBhZGRpdGlvbmFsCi1wZXJmb3JtZXJzLjwvbGk+Ci08bGk+PHN0cm9uZz5SZWZpbmVtZW50IG9mIHRoZSBhcnRpZmFjdCBjb25jZXB0PC9zdHJvbmc+OiBSVVAgb25seSB1c2VkIHRoZSBjb25jZXB0IG9mCi1hcnRpZmFjdCB0byBkZWZpbmUgdGhpbmdzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4KLSBVTUEgZGVmaW5lcyBhbiBleHRlbmRlZCB0YXhvbm9teSBmb3IgdGhlc2UgY29uY2VwdHMuICBJdCBkZWZpbmVzIHRoZSBnZW5lcmFsCi1jb25jZXB0IG9mIHdvcmsgcHJvZHVjdCwgd2hpY2ggaGFzIHRocmVlIGRpZmZlcmVudCBzcGVjaWFsaXphdGlvbnMgKHNwZWNpZmljCi13b3JrIHByb2R1Y3QgdHlwZXMpOiBBcnRpZmFjdHMgKG1hbmFnZWQgd29yayBwcm9kdWN0cyksIERlbGl2ZXJhYmxlcyAocGFja2FnZWQKLXdvcmsgcHJvZHVjdHMgdGhhdCB3aWxsIGJlIGRlbGl2ZXJlZCB0byBhIHN0YWtlaG9sZGVyIGZvciByZXZpZXcpLCBhbmQgT3V0Y29tZQotKHVubWFuYWdlZCwgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzKS48L2xpPgotPGxpPjxzdHJvbmc+RGlmZmVyZW50IGNhdGVnb3JpemF0aW9ucyBmb3Igd29yayBwcm9kdWN0cyBhbmQgcm9sZXM8L3N0cm9uZz46IEluIFJVUCwKLWFydGlmYWN0cyBhbmQgcm9sZXMgd2VyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZS4gSG93ZXZlciwgc29tZXRpbWVzCi1hcnRpZmFjdHMgd2VyZSB1c2VkIGFjcm9zcyBkaXNjaXBsaW5lcyBhbmQgYSBjYXRlZ29yaXphdGlvbiB0byBvbmx5IG9uZSBkaXNjaXBsaW5lCi1jYXVzZWQgY29uZnVzaW9uLiAgSW4gVU1BIGRpZmZlcmVudCBjYXRlZ29yaWVzIGhhdmUgYmVlbiBkZWZpbmVkIGZvciB3b3JrCi1kZWZpbml0aW9ucyAoZGlzY2lwbGluZSBmb3IgdGFza3MgYW5kIGFjdGl2aXRpZXMpLCB3b3JrIHByb2R1Y3RzIChkb21haW4gYW5kCi13b3JrIHByb2R1Y3Qga2luZCksIGFuZCByb2xlcyAocm9sZSBzZXRzKS48L2xpPgotPGxpPjxzdHJvbmc+UHJvY2VzcyBDb21wb25lbnRzIHJlbmFtZWQgdG8gTWV0aG9kIFBhY2thZ2U8L3N0cm9uZz46ICBUaGUgY29uY2VwdCBvZiBjb21wb25lbnQKLWlzIGNvbW1vbmx5IHVzZWQgaW4gbWFueSBzdGFuZGFyZHMgYW5kIHRlY2hub2xvZ2llcy4gIE1vc3QgYXBwbGljYXRpb25zIG9mCi1jb21wb25lbnQgbGluayBpdCB0byB0aGUgYWJzdHJhY3Rpb24gb2YgZW5jYXBzdWxhdGlvbiBkZWZpbmluZyBhIGNvbXBvbmVudAotYXMgYSBibGFjayBib3ggd2hpY2ggY2FuIGJlIHVzZWQgdmlhIHdlbGwtZGVmaW5lZCBpbnRlcmZhY2VzLiAgUlVQIGNvbXBvbmVudAotZGlkIG5vdCBmdWxmaWxsIHRoaXMgYmxhY2sgYm94IGNyaXRlcmlvbi4gIEFsc28gdGhlIFNQRU0gc3RhbmRhcmQgZGVmaW5lZAotcGFja2FnZXMgYXMgd2VsbCBhcyBjb21wb25lbnRzLiBUbyBiZSBjb21wbGlhbnQgdG8gU1BFTSBhbmQgdGhlIGluZHVzdHJ5IHVzYWdlCi1vZiB0aGUgd29yZCBjb21wb25lbnQsIHdlIHJlbmFtZWQgUHJvY2VzcyBDb21wb25lbnQgdG8gTWV0aG9kIFBhY2thZ2UgKCdtZXRob2QnCi1iZWNhdXNlIGl0IGNhbiBjb250YWluIG1ldGhvZCBlbGVtZW50cyBvciBwcm9jZXNzIGVsZW1lbnRzKTwvbGk+Ci08bGk+PHN0cm9uZz5TZXBhcmF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGZyb20gcHJvY2VzcyBlbGVtZW50czwvc3Ryb25nPjogSW4KLVJVUCAyMDAzIHlvdSBjcmVhdGVkIGEgbmV3IHByb2Nlc3MgYnkgZGVmaW5pbmcgYSBuZXcgY29uZmlndXJhdGlvbiBhbmQgZG9jdW1lbnRpbmcKLW1hbnVhbGx5IGluIGEgZGV2ZWxvcG1lbnQgY2FzZSBhcnRpZmFjdCBjaGFuZ2VzIHRvIHN0YW5kYXJkIFJVUC4gIFVNQSBwcm92aWRlcwotZXh0ZW5kZWQgY29uY2VwdHMgaW4gYWRkaXRpb24gdG8gdGhlIGNvbmZpZ3VyYXRpb24gY29uY2VwdCBmb3IgdGFpbG9yaW5nIHByb2Nlc3Nlcy4KLSBJdCBhbGxvd3MgeW91IHRvIG1vZGVsIGNvbmNyZXRlbHkgZm9yIGEgcHJvY2VzcyB3aGF0IHdvcmsgZGVmaW5lZCBpbiB0aGUKLW1ldGhvZCBjb250ZW50IHlvdSB3YW50IHRvIGFjdHVhbGx5IGRvIGluIGVhY2ggcGhhc2UsIGJlY2F1c2UgeW91IGNhbiBlYXNpbHkKLWFkZCwgcmVtb3ZlLCBhbmQgcmVvcmRlciBlbGVtZW50cyBpbiB0aGUgcHJvY2VzcyBzdHJ1Y3R1cmUsIHJldXNpbmcgb3Igbm90Ci1yZXVzaW5nIHdoYXRldmVyIHlvdSB3YW50IGZyb20gdGhlIG1ldGhvZCBjb250ZW50LiBJdCBhY2hpZXZlcyB0aGVzZSBmZWF0dXJlcwotYnkgYSBtb3JlIGNsZWFyIHNlcGFyYXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgKGUuZy4gdGFza3MgZGVmaW5lZCBmb3IgZGlzY2lwbGluZXMpCi1hbmQgdGhlIGFwcGxpY2F0aW9uIG9mIG1ldGhvZCBjb250ZW50IGluIHByb2Nlc3MgKGV4cHJlc3NlZCB3aXRoIGFjdGl2aXR5Ci1kaWFncmFtcyBhbmQvb3Igd29yayBicmVha2Rvd24gc3RydWN0dXJlcykgYXMgd2VsbCBhcyB0aGUgbW9kZWxpbmcgb2YgcHJvY2Vzc2VzCi0oaS5lLiBjcmVhdGluZyBuZXcgb3IgYWRhcHRlZCBhY3Rpdml0eSBkaWFncmFtcyBvciBuZXcgb3IgYWRhcHRlZCB3b3JrIGJyZWFrZG93bgotc3RydWN0dXJlcykuICBJdCBpbnRyb2R1Y2VzIGEgZmV3IG5ldyBjb25jZXB0cyBzdWNoIGFzIGRlc2NyaXB0b3IgdGhhdCBzdXBwb3J0Ci10aGlzIHNlcGFyYXRpb24gYW5kIGFjaGlldmUgbmV3IGNhcGFiaWxpdGllcyBmb3IgbWFpbnRhaW5pbmcgYW5kIHJldXNpbmcgbWFueQotZGlmZmVyZW50IGZhbWlsaWVzIG9mIGFsdGVybmF0aXZlIHByb2Nlc3NlcyBhbmQgcHJvY2VzcyBwYXJ0cyBhbGwgd2l0aGluIHRoZQotc2FtZSBjb25maWd1cmF0aW9uLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWlncmF0aW9ub3ZlcnZpZXcuaHRtbCNtaWdyYXRpb25vdmVydmlldyI+TWlncmF0aW9uIE92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1pZ3JhdGVhbnJwdzIwMDNwbHVnaW4uaHRtbCNtaWdyYXRlYW5ycHcyMDAzcGx1Z2luIj5NaWdyYXRlIGFuIElCTSBSVVAgMjAwMy4wNiBQbHVnaW48L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlzY2lwbGluZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZGlzY2lwbGluZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVhMjlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Rpc2NpcGxpbmUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRpc2NpcGxpbmUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0iZGlzY2lwbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5EaXNjaXBsaW5lPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkaXNjaXBsaW5lIj48YSBuYW1lPSJkaXNjaXBsaW5lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGlzY2lwbGluZTwvaDE+Ci08ZGl2PjxwPkEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2tzPC9hPiB0aGF0Ci1hcmUgcmVsYXRlZCB0byBhIG1ham9yIGFyZWEgb2YgY29uY2VybiB3aXRoaW4gdGhlIG92ZXJhbGwgSVQgZW52aXJvbm1lbnQuCi1Gb3IgZXhhbXBsZSwgb24gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0LCBpdCBpcyBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluCi1yZXF1aXJlbWVudHMgdGFza3MgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiB0YXNrcy4gU2VwYXJhdGluZwotdGhlc2UgdGFza3MgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgdGFza3MgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi1EaXNjaXBsaW5lcyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIERpc2NpcGxpbmUgR3JvdXBpbmdzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZG9tYWluLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kb21haW4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0MjM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9kb21haW4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRvbWFpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJkb21haW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RG9tYWluPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJkb21haW4iPjxhIG5hbWU9ImRvbWFpbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRvbWFpbjwvaDE+Ci08ZGl2PjxwPkEgRG9tYWluIGlzIGEgcmVmaW5lYWJsZSwgbG9naWNhbCwgaGllcmFyY2h5IG9mIHJlbGF0ZWQgPGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0czwvYT4gZ3JvdXBlZCB0b2dldGhlciBiYXNlZCBvbiB0aW1pbmcsIHJlc291cmNlcywKLW9yIHJlbGF0aW9uc2hpcC4gV2hpbGUgYSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSB3b3JrIHByb2R1Y3RzLCBhIHdvcmsgcHJvZHVjdAotYmVsb25ncyB0byBvbmx5IG9uZSBEb21haW4uIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4YW1wbGUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4YW1wbGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQxYTUxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9leGFtcGxlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFeGFtcGxlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImV4YW1wbGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+RXhhbXBsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iZXhhbXBsZSI+PGEgbmFtZT0iZXhhbXBsZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4YW1wbGU8L2gxPgotPGRpdj48cD5BbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFuIGV4YW1wbGUgb2YgYQotY29tcGxldGVkIHdvcmsgcHJvZHVjdC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXh0ZW5kcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZXh0ZW5kcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTFmYjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2V4dGVuZHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29udHJpYnV0ZXMuaHRtbCNjb250cmlidXRlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkV4dGVuZHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImV4dGVuZHMiPjxhIG5hbWU9ImV4dGVuZHMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FeHRlbmRzPC9oMT4KLTxkaXY+PHA+QW4gZXh0ZW5kaW5nIGVsZW1lbnQgaW5oZXJpdHMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBiYXNlIGVsZW1lbnQuIEV4dGVuc2lvbgotYWxsb3dzIE1ldGhvZCBQbHVnLWlucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIGJhc2UgcGx1Zy1pbiBieSBwcm92aWRpbmcKLWEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbgotaW5zdGFuY2VzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgImJhc2VkLW9uIiBlbGVtZW50IHRvIHRoZSBleHRlbmRpbmcgZWxlbWVudC4KLVRoZSByZXN1bHQgaXMgdGhhdCB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhlICJiYXNlZC1vbiIKLWVsZW1lbnQsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuIEV4dGVuZHMgaXMgbm90IHVzZWQgdG8gbW9kaWZ5Ci1jb250ZW50IG9mIHRoZSBiYXNlIHBsdWctaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nCi1wbHVnLWluIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkLgotRm9yIGV4YW1wbGUsIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUKLW9mIHJldmlldy4gVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgZWxlbWVudCBhbmQgYW55IG51bWJlciBvZiBleHRlbmRpbmcKLWVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdGhyb3VnaCB0aGUgZXh0ZW5kcwotcmVsYXRpb25zaGlwLiBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgY2FwYWJpbGl0eQotcGF0dGVybnMgdG8gcHJvY2Vzc2VzOiBBIHBhdHRlcm4gaXMgYXBwbGllZCBieSBkZWZpbmluZyBhbiBleHRlbmRzIHJlbGF0aW9uc2hpcAotZnJvbSBhbiBhY3Rpdml0eSBvZiB0aGUgYXBwbHlpbmcgcHJvY2Vzc2VzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZQotYWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb24gaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMKLXRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBwcm9jZXNzIGFmdGVyIGludGVycHJldGF0aW9uLjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1leHRlbmQgYW5vdGhlciBlbGVtZW50LiBTZWxlY3QgPHN0cm9uZz5FeHRlbmRzPC9zdHJvbmc+IGFzIHRoZSBWYXJpYWJpbGl0eSBUeXBlLCBhbmQKLXRoZW4gc2VsZWN0IHRoZSBiYXNlIGVsZW1lbnQgd2hpY2ggdGhpcyBlbGVtZW50IGV4dGVuZHMuIFRoZSBiYXNlIGVsZW1lbnQKLW11c3QgYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSBleHRlbmRpbmcgZWxlbWVudC48L3A+Ci08cD5BbnkgaW5mb3JtYXRpb24geW91IGVudGVyIGluIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgYmFzZQotZWxlbWVudCBpbiBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIGVsZW1lbnQuIFRleHQgZmllbGRzIGluIHRoZSBleHRlbmRpbmcgZWxlbWVudAotYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIHJlc3BlY3RpdmUgdGV4dCBmaWVsZHMgaW4gdGhlIGJhc2UgZWxlbWVudC48L3A+Ci08cD5FeHRlbmRzIG9ubHkgZGVmaW5lcyBpbmhlcml0YW5jZSBmb3IgdGhlIGV4dGVuZGluZyBlbGVtZW50LiBUaGUgYmFzZSByZW1haW5zCi11bnRvdWNoZWQuIElmIHRoZSBleHRlbmRpbmcgZWxlbWVudCBpcyBhbGxvd2VkIGFuIGFzc29jaWF0aW9uIHRvIG9ubHkgb25lCi1vdGhlciBlbGVtZW50IGFuZCBoYXMgc3VjaCBhbiBlbGVtZW50IGRlZmluZWQgaXRzZWxmLCBpbmhlcml0YW5jZSB3aWxsIG5vdAotb3ZlcnJpZGUgdGhpcyBhc3NvY2lhdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPkV4dGVuZHMgcnVsZXM6PC9zdHJvbmc+PHVsPjxsaT5BdHRyaWJ1dGUgdmFsdWVzIG9mIHRoZSBiYXNlIGVsZW1lbnQgYXJlIGluaGVyaXRlZCB0byB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQKLWlmIHRoZSBleHRlbmRpbmcgZWxlbWVudCBoYXMgbm90IGRlZmluZWQgaXRzIG93biB2YWx1ZXMuPC9saT4KLTxsaT5PdXRnb2luZyB0by1tYW55IGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgdG8gdGhlCi1leHRlbmRpbmcgZWxlbWVudC48L2xpPgotPGxpPk91dGdvaW5nIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIG9ubHkgaW5oZXJpdGVkIGlmIHRoZSBleHRlbmRpbmcgZWxlbWVudAotZG9lcyBub3QgZGVmaW5lIGl0cyBvd24gdG8tb25lIGFzc29jaWF0aW9uLjwvbGk+Ci08bGk+RXh0ZW5kcyB3b3JrcyB0cmFuc2l0aXZlbHksIGkuZS4gaWYgYW4gZXh0ZW5kaW5nIGVsZW1lbnQgaXMgZXh0ZW5kZWQgaXRzZWxmLAotdGhlIHNlY29uZCBleHRlbnNpb24gaW5oZXJpdHMgZnJvbSBpdHMgZGlyZWN0IGFuZCBpbmRpcmVjdCBiYXNlIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHByZWNlZGVzIEV4dGVuZHMsIGkuZS4gY29udHJpYnV0aW9uIGlzIGV2YWx1YXRlZCBmaXJzdCBhbmQKLXRoZW4gZXh0ZW5kaW5nIGVsZW1lbnRzIGluaGVyaXQgYWZ0ZXJ3YXJkcyBmcm9tIHRoZSBiYXNlIGVsZW1lbnQgKGluY2x1ZGluZwotYWxsIG9mIGl0cyBjb250cmlidXRpb24pLjwvbGk+Ci08bGk+UmVwbGFjZSBwcmVjZWRlcyBFeHRlbmRzLCBpLmUuIGlmIGEgYmFzZSBlbGVtZW50IGhhcyBhIHJlcGxhY2UgYW5kIGV4dGVuZHMKLXJlbGF0aW9uc2hpcCwgdGhlIGV4dGVuZGluZyBlbGVtZW50IGluaGVyaXRzIGZyb20gdGhlIHJlcGxhY2luZyBlbGVtZW50LjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJlcGxhY2UuaHRtbCNyZXBsYWNlcyI+UmVwbGFjZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiPkNvbnRyaWJ1dGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2ZpbmRyZXBsYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2ZpbmRyZXBsYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzOTYzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9maW5kcmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvZ3VpZGFuY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3MmE0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkYW5jZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVndWlkYW5jZS5odG1sI2NyZWF0ZWd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Imd1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPkd1aWRhbmNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJndWlkYW5jZSI+PGEgbmFtZT0iZ3VpZGFuY2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5HdWlkYW5jZTwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPkd1aWRhbmNlIGlzIGEgZ2VuZXJhbCB0ZXJtIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPnJvbGVzPC9hPiwgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPnRhc2tzPC9hPiwgYW5kIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPndvcmsgcHJvZHVjdHM8L2E+LiBFeGFtcGxlcyBvZiBndWlkYW5jZSBhcmU6PHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5HdWlkZWxpbmU8L3NwYW4+PC9zdHJvbmc+IC0gUHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93Ci10byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzLCBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwKLWRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4KLUFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQKLWFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbgotb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUKLXRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQKLWFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBhbmQgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHkuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5UZW1wbGF0ZTwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdAotcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLAotYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMKLWFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkKLWJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhCi1zdG9yZXMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5DaGVja2xpc3Q8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQKLWlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpZmllZC4gQ2hlY2tsaXN0cwotYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy48cD48L3A+Ci08L2xpPgotPGxpPjxzdHJvbmc+PHNwYW4gY2xhc3M9ImtleXdvcmQiPlRvb2wgTWVudG9yPC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0Ci1zaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yaywgZWl0aGVyCi1pbiB0aGUgY29udGV4dCBvZiwgb3IgaW5kZXBlbmRlbnQgZnJvbSwgYSB0YXNrIG9yIGFjdGl2aXR5LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+U3VwcG9ydGluZyBNYXRlcmlhbDwvc3Bhbj48L3N0cm9uZz4gLSBVc2VkIGFzIGEgY2F0Y2ggYWxsIGZvcgotb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQKLXRvIGFsbCBraW5kcyBvZiBjb250ZW50IGVsZW1lbnRzLCBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXBvcnQ8L3NwYW4+PC9zdHJvbmc+IC0gQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQKLWlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0KLW9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksCi13aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwKLWFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24KLWludG8gYSByZXBvcnQuPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Db25jZXB0PC9zcGFuPjwvc3Ryb25nPiAtIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzCi1rZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLgotQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gZ3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3MKLXNldmVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcyBvciBhY3Rpdml0aWVzLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+UHJhY3RpY2U8L3NwYW4+PC9zdHJvbmc+IC0gUmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kKLW9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0Ci1vciBwcm9jZXNzIHF1YWxpdHkuIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4KLVRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWF5IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvcgotc3BlY2lmaWMgcHJvY2Vzcy4gPHA+PC9wPgotPC9saT4KLTxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXVzYWJsZSBBc3NldDwvc3Bhbj48L3N0cm9uZz4gLSBQcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbQotZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24KLWluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuCi1UaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nIGhvdyB0aGUKLWFzc2V0IHNob3VsZCBiZSB1c2VkLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+VGVybSBEZWZpbml0aW9uPC9zcGFuPjwvc3Ryb25nPiAtIERlZmluZXMgY29uY2VwdHMgYW5kIGlzIHVzZWQKLXRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gQSB0ZXJtIGRlZmluaXRpb24gaXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gY29udGVudAotZWxlbWVudHMsIGJ1dCBpdHMgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgdGVybSBpcyB1c2VkIGluIHRoZQotY29udGVudCBlbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+V2hpdGUgUGFwZXI8L3NwYW4+PC9zdHJvbmc+IC0gQSBzcGVjaWFsIGNvbmNlcHQgZ3VpZGFuY2UgdGhhdAotaGFzIGJlZW4gZXh0ZXJuYWwgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbgotaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjxwPjwvcD4KLTwvbGk+Ci08bGk+PHN0cm9uZz48c3BhbiBjbGFzcz0ia2V5d29yZCI+RXhhbXBsZTwvc3Bhbj48L3N0cm9uZz4gLSBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcwotYW4gZXhhbXBsZSBvZiBhIGNvbXBsZXRlZCB3b3JrIHByb2R1Y3QuPC9saT4KLTwvdWw+Ci1TZWUgYWxzbzo8L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWd1aWRhbmNlLmh0bWwjY3JlYXRlZ3VpZGFuY2UiPkNyZWF0ZSBHdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9ndWlkZWxpbmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRlbGluZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWU3ODhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2d1aWRlbGluZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR3VpZGVsaW5lIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Imd1aWRlbGluZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5HdWlkZWxpbmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Imd1aWRlbGluZSI+PGEgbmFtZT0iZ3VpZGVsaW5lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+R3VpZGVsaW5lPC9oMT4KLTxkaXY+PHA+QSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwKLW9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzLCBvciB0aGF0IHByb3ZpZGVzCi1hZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4KLUFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQKLWFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbgotb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUKLXRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQKLWFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzLCBhbmQgbWF0dXJpdHkuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSI+R3VpZGFuY2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaWJtZGl0YS5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pYm1kaXRhLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhMjZjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pYm1kaXRhLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLnNpZGViYXIge2JhY2tncm91bmQ6IHNpbHZlciB9Ci0udG9jIHtmb250LXNpemU6IHNtYWxsOyB9Ci0KLS5iYXNlIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyO30KLS5wcmVyZXEgeyBtYXJnaW4tbGVmdCA6IDIwcHg7fQotLmhpZXJhcmNoeSB7IGRpc3BsYXk6IGJsb2NrOyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLS5uZXN0ZWQxIHsgfQotLm5lc3RlZDIgeyB9Ci0KLS5wIHttYXJnaW4tdG9wOiAxZW19Ci0KLS50YWJsZWJvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS50YWJsZW5vYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotY2FwdGlvbiB7IHRleHQtYWxpZ246IGxlZnQ7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uc2ltcGxldGFibGVib3JkZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2ltcGxldGFibGVub2JvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5jaG9pY2V0YWJsZWJvcmRlciB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5jaG9pY2V0YWJsZW5vYm9yZGVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0uZmlnY2FwIHsgZm9udC1zdHlsZTogaXRhbGljIH0KLS5maWdkZXNjIHsgZm9udC1zdHlsZTogbm9ybWFsIH0KLQotLmZpZ25vbmUge21hcmdpbi10b3A6IDFlbX0KLS5maWdib3JkZXIgeyBib3JkZXItc3R5bGU6IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci13aWR0aCA6IDJweDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3NpZGVzIHsgYm9yZGVyLWxlZnQgOiAycHggc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXJpZ2h0IDogMnB4IHNvbGlkOyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wIHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ2JvdHRvbSB7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlndG9wYm90IHsgYm9yZGVyLXRvcCA6IDJweCBzb2xpZDsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotCi0uc3lubm9uZSB7bWFyZ2luLXRvcDogMWVtfQotLnN5bmJvcmRlciB7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3luc2lkZXMgeyBib3JkZXItbGVmdCA6IDJweCBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItcmlnaHQgOiAycHggc29saWQ7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW50b3AgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uc3luYm90dG9tIHsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5zeW50b3Bib3QgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS5za2lwIHsgbWFyZ2luLXRvcDogMWVtIH0KLS5za2lwc3BhY2UgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0d2l0aGNoaWxkIHsgbWFyZ2luLWxlZnQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5zdWJsaW5rbGlzdCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0ucmVsY29uY2VwdHMgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsdGFza3MgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVscmVmIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbGluZm8geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci1kaXYuYnJlYWRjcnVtYiB7bWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLnRvcGljdGl0bGUxIHsgbWFyZ2luLXRvcDogMHBjOyBtYXJnaW4tYm90dG9tOiAuMWVtOyBmb250LXNpemU6IDEuMzRlbTsgfQotLnRvcGljdGl0bGUyIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuNDVlbTsgZm9udC1zaXplOiAxLjE3ZW07IH0KLS50b3BpY3RpdGxlMyB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjE3ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU0IHsgbWFyZ2luLXRvcDogLjgzZW07IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU1IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTYgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uc2VjdGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwZW07IGNvbG9yOiBibGFjazsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkO30KLS5zZWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmV4YW1wbGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmRhbmdlciB7IHBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsgYm9yZGVyOiBzb2xpZDsgYm9yZGVyLXdpZHRoOiB0aGluOyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0uY2F1dGlvbnRpdGxlIHsgbWFyZ2luLXRvcDogMWVtOyBmb250LXdlaWdodDogYm9sZCB9Ci0uY2F1dGlvbiB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS5ib2xkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5ib2xkSXRhbGljIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLml0YWxpYyB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnVuZGVybGluZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnVpY29udHJvbCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybW5hbWUgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmRlZnBhcm1uYW1lIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS5wdG9jSDEge2ZvbnQtc2l6ZTogeC1zbWFsbDsgfQotLnB0b2NIMiB7Zm9udC1zaXplOiB4LXNtYWxsOyB9Ci0KLS5zbWFsbENhcHMgeyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBmb250LXNpemU6IHNtYWxsZXI7IH0KLS5zdGl0bGUgeyBmb250LXN0eWxlOiBpdGFsaWM7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0ubnRlIHt9Ci0KLS5kbHRlcm0geyBmb250LXdlaWdodDogYm9sZDsgfQotLmRsdGVybWV4cGFuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tdG9wOiAxZW07IH0KLS5kZWZMaXN0SGVhZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnBhcm1MaXN0S3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtTGlzdFZhciB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnBrIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLSpbY29tcGFjdD0ieWVzIl0+bGkgeyBtYXJnaW4tdG9wOiAwZW07fQotKltjb21wYWN0PSJubyJdPmxpIHsgbWFyZ2luLXRvcDogLjUzZW07fQkKLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLUNJVEUgeyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLUVNIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci1TVFJPTkcgeyBmb250LXdlaWdodDogYm9sZDsgfQotVkFSIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIFN0eWxlcyBhZGRlZCB0byBzdXBwb3J0IC5ORVQgb3V0cHV0LiBOb3QgdXNlZCBieSBzdGFuZGFyZCBwcm9jZXNzaW5nLiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvZHkuZG90bmV0IC8qIFRoaXMgYm9keSB0YWcgcmVxdWlyZXMgdGhlIHVzZSBvZiBvbmUgb2YgdGhlIHNldHMgb2YgYmFubmVyIGFuZC9vciB0ZXh0IGRpdiBpZHMgKi8KLQl7Ci0JbWFyZ2luOiAwcHggMHB4IDBweCAwcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCWJhY2tncm91bmQ6ICNmZmZmZmY7IAotCWNvbG9yOiAjMDAwMDAwOwotCXdpZHRoOiAxMDAlOwotCX0KLQotZGl2Lm5zdGV4dCAvKiBDcmVhdGVzIHRoZSBzY3JvbGxpbmcgdGV4dCBhcmVhIGZvciBOb25zY3JvbGxpbmcgcmVnaW9uIHRvcGljICovCi0JewotCXBhZGRpbmc6IDVweCAxMHB4IDBweCAyMnB4OyAKLQl9Ci0KLWRpdi5uc2Jhbm5lciAvKiBDcmVhdGVzIE5vbnNjcm9sbGluZyBiYW5uZXIgcmVnaW9uICovCi0JewotCXBvc2l0aW9uOiByZWxhdGl2ZTsKLQlsZWZ0OiAwcHg7Ci0JcGFkZGluZzogMHB4IDBweCAwcHggMHB4OwotCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjOTk5OTk5OwotCX0KLQotZGl2LmJhbm5lcnJvdzEgLyogcHJvdmlkZXMgZnVsbC13aWR0aCBjb2xvciB0byB0b3Agcm93IGluIHJ1bm5pbmcgaGVhZCAqLwotCXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOwotCX0KLQotLyogICAgICAgU1RZTEVTIEZPUiBSVU5OSU5HIEhFQURTICAgICAgKi8KLQotdGFibGUuYmFubmVycGFydGhlYWQsIHRhYmxlLmJhbm5lcnRpdGxlIC8qIEdlbmVyYWwgdmFsdWVzIGZvciB0aGUgUnVubmluZyBIZWFkIHRhYmxlcyAqLwotCXsKLQlwb3NpdGlvbjogcmVsYXRpdmU7Ci0JbGVmdDogMHB4OwotCXRvcDogMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQltYXJnaW46IDBweCAwcHggMHB4IDBweDsKLQl3aWR0aDogMTAwJTsKLQloZWlnaHQ6IDIxcHg7IAotCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IDBweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljY2ZmOyAKLQlmb250LXNpemU6IDEwMCU7Ci0JfQotdGFibGUuYmFubmVycGFydGhlYWQgdGQgLyogR2VuZXJhbCBWYWx1ZXMgZm9yIGNlbGxzIGluIHRoZSB0b3Agcm93IG9mIHJ1bm5pbmcgaGVhZCAqLwotCXsKLQltYXJnaW46IDBweCAwcHggMHB4IDBweDsKLQlwYWRkaW5nOiAycHggMHB4IDBweCA0cHg7Ci0JdmVydGljYWwtYWxpZ246IG1pZGRsZTsKLQkvKmJvcmRlci13aWR0aDogMHB4IDBweCAxcHggMHB4OyAqLwotCWJvcmRlci13aWR0aDogMHB4Ci0JYm9yZGVyLXN0eWxlOiBzb2xpZDsKLQlib3JkZXItY29sb3I6ICM5OTk5OTk7Ci0JYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IAotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCX0KLXRhYmxlLmJhbm5lcnBhcnRoZWFkIHRkLnByb2R1Y3QgLyogVmFsdWVzIGZvciB0b3AgcmlnaHQgY2VsbCBpbiBydW5uaW5nIGhlYWQgKi8KLQl7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGxvd3MgZm9yIGEgc2Vjb25kIHRleHQgYmxvY2sgaW4gdGhlIHJ1bm5pbmcgaGVhZCAqLwotCXRleHQtYWxpZ246IHJpZ2h0OwotCXBhZGRpbmc6IDJweCA1cHggMHB4IDVweDsKLQl9Ci0KLWgxLmR0SDEgewotCW1hcmdpbi1sZWZ0OiAtMThweDsKLQl9Ci1kaXYudGl0bGVyb3cgLyogcHJvdmlkZXMgbm9uLXNjcm9sbCB0b3BpYyB0aXRsZSBhcmVhIChyZXF1aXJlcyBzY3JpcHQpICovCi0JewotCXdpZHRoOiAxMDAlOyAvKiBGb3JjZXMgdGFibGVzIHRvIGhhdmUgY29ycmVjdCByaWdodCBtYXJnaW4gKi8KLQlwYWRkaW5nOiAwcHggMTBweCAwcHggMjJweDsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2NmZjsgICAgICAgIAotCX0KLWRpdi50aXRsZXJvdyBoMQotCXsKLQltYXJnaW4tdG9wOiAwZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogLjJlbQotCX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFmYjc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2luZGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlM2UwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGFsaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvaXRlcmF0aW9uLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGVyYXRpb24uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0YTM2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9pdGVyYXRpb24uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikl0ZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJpdGVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+SXRlcmF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJpdGVyYXRpb24iPjxhIG5hbWU9Iml0ZXJhdGlvbiI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkl0ZXJhdGlvbjwvaDE+Ci08ZGl2PjxwPkl0ZXJhdGlvbiBpcyBhIGdyb3VwIG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLgotSXRlcmF0aW9uIHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbgotcmVwZXRpdGl2ZSBjeWNsZXMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2xpYnJhcnl2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMjdlOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbGlicmFyeXZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkxpYnJhcnkgVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJsaWJyYXJ5dmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5MaWJyYXJ5IFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImxpYnJhcnl2aWV3Ij48YSBuYW1lPSJsaWJyYXJ5dmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpYnJhcnkgVmlldzwvaDE+Ci08ZGl2PjxwPlRoZSBMaWJyYXJ5IFZpZXcgZGlzcGxheXMgdGhlIE1ldGhvZCBQbHVnLWlucyBhbmQgQ29uZmlndXJhdGlvbnMgY29udGFpbmVkCi1pbiBhIDxhIGhyZWY9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Lmh0bWwiPk1ldGhvZCBMaWJyYXJ5PC9hPi48L3A+Ci08cD5UaGUgTGlicmFyeSBWaWV3IGlzIGF2YWlsYWJsZSBvbmx5IGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+IGFuZCwKLXdoZW4gb3BlbiwgZW5hYmxlcyB0aGUgY3JlYXRpb24sIG1vZGlmaWNhdGlvbiBhbmQgdmlld2luZyBvZiBhbGwgZWxlbWVudCB0eXBlcy48L3A+Ci08L2Rpdj4KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwiIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdiBjbGFzcz0icHJldmlvdXNsaW5rIj48c3Ryb25nPlByZXZpb3VzIHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJuZXh0bGluayI+PHN0cm9uZz5OZXh0IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIj5Ccm93c2UgYW5kIFByZXZpZXcgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idXNlcmludGVyZmFjZW92ZXJ2aWV3Lmh0bWwjdXNlcmludGVyZmFjZW92ZXJ2aWV3IiB0aXRsZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6Ij5Ub29sIEludGVyZmFjZTwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21jLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyY2VlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aF92c19wcm9jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NWFiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRoX3ZzX3Byb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDU2N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXciPjxhIG5hbWU9Im1ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+TWV0aG9kIGNvbnRlbnQgaXMgZGVzY3JpYmVkIGJ5IGRlZmluaW5nIHRhc2tzIHRoYXQgaGF2ZSB3b3JrIHByb2R1Y3RzIGFzCi1pbnB1dHMgYW5kIG91dHB1dHMgYW5kIHRoYXQgYXJlIHBlcmZvcm1lZCBieSByb2xlcy4gVGhlIHJvbGVzIGFsc28gZGVmaW5lCi1yZXNwb25zaWJpbGl0eSByZWxhdGlvbnNoaXBzIHRvIHRoZSB3b3JrIHByb2R1Y3RzLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiIGFsdD0iIiAvPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzCi1ob3cgdGhlIG1ldGhvZCBjb250ZW50IGlzIHJlcHJlc2VudGVkLiBUbyBsZWFybiBhYm91dCBkZXZlbG9wbWVudCBtZXRob2RzLAotcGVvcGxlIHJlc2VhcmNoIGluIGxpYnJhcmllcyBvciByZWNlaXZlIHRyYWluaW5nLiBEZXZlbG9wbWVudCBtZXRob2RzIGFyZQotdHlwaWNhbGx5IGRlc2NyaWJlZCBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLAotc3RhbmRhcmRzIGFuZCByZWd1bGF0aW9ucywgb3IgYW55IG90aGVyIGZvcm0gb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcwotdXN1YWxseSBkb2N1bWVudCBtZXRob2RzIGJ5IHByb3ZpZGluZyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIGZvciBhIHBhcnRpY3VsYXIKLXdheSBvZiBhY2hpZXZpbmcgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FsIHVuZGVyIGdlbmVyYWwgY2lyY3Vtc3RhbmNlcy4KLVNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsKLWRlZmluaW5nIGFuIGFyY2hpdGVjdHVyYWwgbWVjaGFuaXNtIGJhc2VkIG9uIGZ1bmN0aW9uYWwgYW5kIG5vbi1mdW5jdGlvbmFsCi1yZXF1aXJlbWVudHM7IGNyZWF0aW5nIGEgcHJvamVjdCBwbGFuIGZvciBhIGRldmVsb3BtZW50IGl0ZXJhdGlvbjsgZGVmaW5pbmcKLWEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3MKLW9yZ2FuaXphdGlvbiBiYXNlZCBvbiBhIG5ldyBzdHJhdGVnaWMgZGlyZWN0aW9uLCBhbmQgc28gb24uIDwvcD4KLTxwPlRoaXMgdG9vbCB0YWtlcyBjb250ZW50IHN1Y2ggYXMgdGhlIGNvbnRlbnQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcwotaXQgaW4gb25lIHNwZWNpZmljIHdheSB1c2luZyBhIHByZWRlZmluZWQgc2NoZW1hIG9mIGNvbmNlcHRzLiBUaGlzIHNjaGVtYQotc3VwcG9ydHMgdGhlIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQKLW1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gU3VjaCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGRvIG5vdCBoYXZlIHRvIGJlCi1saW1pdGVkIHRvIHNvZnR3YXJlIGVuZ2luZWVyaW5nLCBidXQgY2FuIGFsc28gY292ZXIgb3RoZXIgZGVzaWduIGFuZCBlbmdpbmVlcmluZwotZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMKLWN5Y2xlcywgYW5kIHNvIG9uLiA8L3A+Ci08cD5UaGUgc2NoZW1hIGZvciBtZXRob2QgY29udGVudCBpcyByZXByZXNlbnRlZCB0aGlzIHRvb2wgYXMgYSBjb25zdHJ1Y3Qgb2YKLXJvbGVzIGRlZmluaW5nIGRldmVsb3BtZW50IHNraWxscyBhbmQgcmVzcG9uc2liaWxpdGllcyBmb3Igd29yayBwcm9kdWN0cy4KLVRoZXNlIHdvcmsgcHJvZHVjdHMgYXJlIHByb2R1Y2VkIGJ5IHRhc2tzIHRoYXQgYXJlIHBlcmZvcm1lZCBieSB0aGUgcm9sZXMKLWFuZCBoYXZlIHRoZSB3b3JrIHByb2R1Y3RzIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gVGhlIHNjcmVlbiBjYXB0dXJlIGluIHRoZQotZmlndXJlIGFib3ZlIHNob3dzIGhvdyBzdWNoIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gdHJlZQotYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8gYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudAotaW5kZXhlcyBvZiB0aGUgYXZhaWxhYmxlIGVsZW1lbnRzIGZvciByYXBpZCBhY2Nlc3MuIFRoZSBzY3JlZW4gY2FwdHVyZSBzaG93cwotb24gdGhlIHJpZ2h0IGFuIGV4YW1wbGUgb2YgYSB0YXNrIHByZXNlbnRhdGlvbi4gVGhpcyB0YXNrIHByZXNlbnRhdGlvbiBkZWZpbmVzCi10aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkIHRvIGFjaGlldmUgdGhlIHRhc2sncwotcHVycG9zZS4gWW91IGNhbiBzZWUgdGhhdCB0aGUgdGFzayBoYXMgdmFyaW91cyByZWxhdGlvbnNoaXBzLCBzdWNoIGFzIHJlbGF0aW9uc2hpcHMKLXRvIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3RzIHRoYXQgc2VydmUgYXMgaW5wdXRzIGFuZCBvdXRwdXRzCi10byB0aGUgdGFzay4gRmluZCBtb3JlIGRldGFpbHMgb24gdGFza3MsIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3RzIGluIHRoZSBvbmxpbmUKLWhlbHAgaGVyZS4gSW4gYWRkaXRpb24gdG8gcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cywgdGhpcyB0b29sIHN1cHBvcnRzCi10aGUgYWRkaXRpb24gb2YgZ3VpZGFuY2UgZWxlbWVudHMuIEd1aWRhbmNlIGFyZSBzdXBwbGVtZW50YXJ5IGZyZWUtZm9ybSBkb2N1bWVudGF0aW9uCi1zdWNoIGFzIHdoaXRlIHBhcGVycywgY29uY2VwdCBkZXNjcmlwdGlvbnMsIGd1aWRlbGluZXMsIHRlbXBsYXRlcywgZXhhbXBsZXMsCi1hbmQgc28gb24uIDwvcD4KLTxwPlRoaXMgdG9vbCBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50Ci1lbGVtZW50cy4gRG9jdW1lbnQgeW91ciB0YXNrLCByb2xlcywgd29yayBwcm9kdWN0cywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzCi11c2luZyBpbnR1aXRpdmUgcmljaC10ZXh0IGVkaXRvcnMgdGhhdCBhbGxvdyB5b3UgdG8gY29weSBhbmQgcGFzdGUgdGV4dCBmcm9tCi1vdGhlciBzb3VyY2VzIHN1Y2ggYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaAotcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGNvbnRlbnQgZWxlbWVudHMuIEZvciBleGFtcGxlLCBtYWtlIGEgd29yayBwcm9kdWN0IHRoZQotaW5wdXQgdG8geW91ciB0YXNrIHNpbXBseSBieSBzZWxlY3RpbmcgaXQgaW4gYSBkaWFsb2cuPC9wPgotPHA+VXNpbmcgdGhpcyB0b29sLCB5b3UgY2FuIG9yZ2FuaXplIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcwotdGhhdCBhbGxvdyB5b3UgdG8gbWFuYWdlIHlvdXIgY29udGVudCBpbiBjb25maWd1cmFibGUgdW5pdHMuIFlvdSBjYW4gYWxzbwotY2F0ZWdvcml6ZSB5b3VyIGNvbnRlbnQgYmFzZWQgb24gYSBzZXQgb2YgcHJlZGVmaW5lZCBjYXRlZ29yaWVzIChmb3IgZXhhbXBsZSwKLWNhdGVnb3JpemUgeW91ciB0YXNrcyBpbnRvIGRldmVsb3BtZW50IGRpc2NpcGxpbmVzLCBvciB5b3VyIHdvcmsgcHJvZHVjdHMKLWludG8gZG9tYWlucykgb3IgY3JlYXRlIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoCi15b3VyIG93biB1c2VyLWRlZmluZWQgY2F0ZWdvcmllcyB0aGF0IGFsbG93IHlvdSB0byBpbmRleCBjb250ZW50IGluIGFueSB3YXkKLXlvdSB3YW50LiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwMGYyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb25maWd1cmF0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwjY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbmZpZ3VyYXRpb248L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zIj48YSBuYW1lPSJtZXRob2Rjb25maWd1cmF0aW9ucyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9oMT4KLTxkaXY+PHA+TWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB1c2VyLWRlZmluZWQgc3Vic2V0cyBvZiBlbGVtZW50cyBjb250YWluZWQgaW4KLXRoZSBNZXRob2QgTGlicmFyeS48L3A+Ci08cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGRlZmluZXMgYSB3b3JraW5nIHNldCBvZiBwYWNrYWdlcyB3aXRoaW4gdGhlIG1ldGhvZAotbGlicmFyeSB0aGF0IGhlbHBzIHlvdSBsaW1pdCB5b3VyIHZpZXcgdG8gYSBzdWJzZXQgb2YgZWxlbWVudHMuIFRoZSBlbGVtZW50cwotdGhhdCBhcmUgcGFydCBvZiBhIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24gYXJlIGRpc3BsYXllZCBpbiB0aGUgPGEgaHJlZj0iY29uZmlndXJhdGlvbnZpZXcuaHRtbCNjb25maWd1cmF0aW9udmlldyI+Q29uZmlndXJhdGlvbiBWaWV3PC9hPi4gTWV0aG9kIGNvbmZpZ3VyYXRpb25zIGFyZSB1c2VkIGZvciBjcmVhdGluZyBwcm9jZXNzZXMKLWFuZCBmb3IgcHVibGljYXRpb24gYnkgZGVmaW5pbmcgd2hpY2ggZWxlbWVudHMgYXJlIHB1Ymxpc2hlZCBpbiBIVE1MIGFuZCB3aGljaAotYXJlIG5vdC48L3A+Ci08cD5BIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbnNpc3RzIG9mIHRocmVlIHNwZWNpZnlpbmcgcGFydHM6PC9wPgotPHVsPjxsaT5BIGRlc2NyaXB0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+QSBzZWxlY3Rpb24gZnJvbSB0aGUgc2V0IG9mIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L2xpPgotPGxpPkEgc2VsZWN0aW9uIG9mIHZpZXdzIHRvIGJlIHB1Ymxpc2hlZCBpbiB0aGUgV2ViIHNpdGUuPC9saT4KLTwvdWw+Ci08cD5JbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLCB5b3UgYXJlIGFibGUgdG8gc2VsZWN0IGFuZCBkZXNlbGVjdCBmcm9tIHRoZQotY29udGVudCBwYWNrYWdlcyBhbmQgcHJvY2VzcyBhdmFpbGFibGUgaW4gdGhlIG1ldGhvZCBsaWJyYXJ5J3MKLXNldCBvZiBwbHVnLWlucy4gVGhlIHNlbGVjdGlvbnMgeW91IG1ha2UgaGVscCBkZXRlcm1pbmUgdGhlIGNvbnRlbnQgb2YgeW91cgotcHVibGlzaGVkIFdlYiBzaXRlLiBBIGNvbmZpZ3VyYXRpb24gaXMgZ2l2ZW4gYSBuYW1lIGFuZCB0aGVuIHNhdmVkIHNvIGl0IGNhbgotYmUgY2hhbmdlZCBhbmQgdGhlbiByZS1wdWJsaXNoZWQgYXQgYSBsYXRlciBkYXRlLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2Rjb25maWd1cmF0aW9uLmh0bWwjY3JlYXRlYW1ldGhvZGNvbmZpZ3VyYXRpb24iPkNyZWF0ZSBhIE1ldGhvZCBDb25maWd1cmF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjYmRkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJNZXRob2QgQ29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9ImNyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj48YSBuYW1lPSJjcmVhdGluZ3JldXNhYmxlbWV0aG9kY29udGVudHMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudDwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcKLWhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQsIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQKLW9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kCi1lbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8KLXNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPk1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZTo8L3A+Ci08dWw+PGxpPjxhIGhyZWY9InRhc2suaHRtbCN0YXNrIj5UYXNrPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJndWlkYW5jZS5odG1sIj5HdWlkYW5jZTwvYT48L2xpPgotPC91bD4KLTxwPkEgUHJvY2VzcyBFbmdpbmVlciBhdXRob3JzIHRoZXNlIGVsZW1lbnRzLCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KLXRoZW0sIGFuZCB0aGVuIGNhdGVnb3JpemVzIHRoZW0uIE1ldGhvZCBjb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsCi1kZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi1wbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGVzZQotbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZAotdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuPC9wPgotPHA+Rm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRldmVsb3BzIGFuIGFwcGxpY2F0aW9uCi1mcm9tIHNjcmF0Y2ggcGVyZm9ybXMgZGV2ZWxvcG1lbnQgdGFza3Mgc3VjaCBhcyAiRGV2ZWxvcCBWaXNpb24iIG9yICJVc2UgQ2FzZQotRGVzaWduIiBzaW1pbGFyIHRvIGEgcHJvamVjdCB0aGF0IGV4dGVuZHMgYW4gZXhpc3Rpbmcgc29mdHdhcmUgc3lzdGVtLiBIb3dldmVyLAotdGhlIHR3byBwcm9qZWN0cyB3aWxsIHBlcmZvcm0gdGhlIHRhc2tzIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSB3aXRoIGEKLWRpZmZlcmVudCBlbXBoYXNpcywgaS5lLiwgdGhleSBwZXJmb3JtIHRoZSBzdGVwcyBvZiB0aGVzZSB0YXNrcyBhdCBkaWZmZXJlbnQKLXBvaW50cyBvZiB0aW1lIGFuZCBwZXJoYXBzIGFwcGx5IGluZGl2aWR1YWwgdmFyaWF0aW9ucyBhbmQgYWRkaXRpb25zLiA8L3A+Ci08cD5NZXRob2QgY29udGVudCBlbGVtZW50cyBhcmUgY29udGFpbmVkIHdpdGhpbiBtZXRob2QgY29udGVudCBwYWNrYWdlcyB3aGljaCwKLWluIHR1cm4sIGFyZSBjb250YWluZWQgd2l0aGluIGEgTWV0aG9kIHBsdWctaW4uIEluIG9yZGVyIHRvIHNlcGFyYXRlIHlvdXIKLW93biBjb250ZW50IGZyb20gb3JpZ2luYWwgT3BlblVQIGNvbnRlbnQsIHlvdSBzaG91bGQgYWx3YXlzIGNyZWF0ZSBuZXcKLW1ldGhvZCBjb250ZW50IGluIGEgbWV0aG9kIHBsdWctaW4gdGhhdCB5b3UgcHJvZHVjZS4gQ3JlYXRpbmcgbWV0aG9kIGNvbnRlbnQKLWluIGEgbWV0aG9kIHBsdWctaW4gb2YgeW91ciBvd24gYWxzbyBhbGxvd3MgeW91IHRvIHVwZGF0ZSB5b3VyIG93biBsaWJyYXJ5Ci13aXRoIG5ldyByZWxlYXNlcyBvZiB0aGUgT3BlblVQIGxpYnJhcnkgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNvbnRlbnQKLXRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy48L3A+Ci08cD5TZWUgYWxzbzo8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZW1ldGhvZGNvbnRlbnQuaHRtbCNjcmVhdGVtZXRob2Rjb250ZW50Ij5DcmVhdGUgTWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhNjQ5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMiPjxhIG5hbWU9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWV0aG9kIENvbnRlbnQgQ2F0ZWdvcmllczwvaDE+Ci08ZGl2PjxwPk1ldGhvZCBDb250ZW50IGVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW50byBsb2dpY2FsIGNhdGVnb3JpZXMuIFRoZSBjYXRlZ29yaWVzCi1jYW4gYXBwZWFyIGluIHlvdXIgZmluYWwsIHB1Ymxpc2hlZCBXZWIgc2l0ZSBhcyB2aWV3cy48L3A+Ci08cD5UaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNhdGVnb3J5OiBTdGFuZGFyZCBhbmQgQ3VzdG9tLjwvcD4KLTxwPjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TdGFuZGFyZCBDYXRlZ29yaWVzPC9oND48cD5TdGFuZGFyZCBDYXRlZ29yaWVzIHByb3ZpZGUKLWEgbWVhbnMgdG8gY2F0ZWdvcml6ZSBjb3JlIG1ldGhvZCBjb250ZW50IGluIGxpbmUgd2l0aCB0aGUgYmVzdCBwcmFjdGljZXMKLWZvciBjcmVhdGluZyBzdHJ1Y3R1cmVkIG1ldGhvZHMuIFN0YW5kYXJkIENhdGVnb3JpZXMgYXJlIGxpbmtlZCB3aXRoIGEgc3BlY2lmaWMKLW1ldGhvZCBjb250ZW50IHR5cGUsIGUuZy4gRGlzY2lwbGluZXMgY29udGFpbiBvbmx5IHRhc2tzLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5TdGFuZGFyZAotQ2F0ZWdvcnkgdHlwZXMgYXJlOjx1bD48bGk+PHN0cm9uZz5EaXNjaXBsaW5lczwvc3Ryb25nPiAtIEEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgPGEgaHJlZj0idGFzay5odG1sI3Rhc2siPlRhc2tzPC9hPiB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgYXJlYSBvZiBjb25jZXJuIHdpdGhpbgotdGhlIG92ZXJhbGwgSVQgZW52aXJvbm1lbnQuIEZvciBleGFtcGxlLCBvbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QsCi1pdCBpcyBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyB0YXNrcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aAotYW5hbHlzaXMgYW5kIGRlc2lnbiB0YXNrcy4gU2VwYXJhdGluZyB0aGVzZSB0YXNrcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzCi1tYWtlcyB0aGUgdGFza3MgZWFzaWVyIHRvIGNvbXByZWhlbmQuIERpc2NpcGxpbmVzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgRGlzY2lwbGluZQotR3JvdXBpbmdzLjwvbGk+Ci08bGk+PHN0cm9uZz5Eb21haW5zPC9zdHJvbmc+IC0gQSBEb21haW4gaXMgYSByZWZpbmVhYmxlLCBsb2dpY2FsLCBoaWVyYXJjaHkgb2YgcmVsYXRlZCA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPiBncm91cGVkCi10b2dldGhlciBiYXNlZCBvbiB0aW1pbmcsIHJlc291cmNlcywgb3IgcmVsYXRpb25zaGlwLiBXaGlsZSBhIERvbWFpbiBjYXRlZ29yaXplcwotbWFueSB3b3JrIHByb2R1Y3RzLCBhIHdvcmsgcHJvZHVjdCBiZWxvbmdzIHRvIG9ubHkgb25lIERvbWFpbi4gRG9tYWlucyBjYW4KLWJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLiA8L2xpPgotPGxpPjxzdHJvbmc+V29yayBQcm9kdWN0IEtpbmRzPC9zdHJvbmc+IC0gV29yayBQcm9kdWN0IEtpbmQgaXMgYW5vdGhlciBjYXRlZ29yeSBmb3IKLWdyb3VwaW5nIDxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdHM8L2E+LgotQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSB3b3JrIHByb2R1Y3Qga2luZHMuIEFzIGFuIGV4YW1wbGUsIHlvdSBtaWdodAotd2FudCB0byBoYXZlIGEgc2VyaWVzIG9mIHdvcmsgcHJvZHVjdCBraW5kcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIG92ZXJhbGwKLWludGVudCBvZiB3b3JrIHByb2R1Y3RzLCBzdWNoIGFzIHNwZWNpZmljYXRpb24sIHBsYW4sIG9yIG1vZGVsLjwvbGk+Ci08bGk+PHN0cm9uZz5Sb2xlIFNldHM8L3N0cm9uZz4gLSBBIFJvbGUgU2V0IGlzIHVzZWQgdG8gZ3JvdXAgPGEgaHJlZj0icm9sZS5odG1sI3JvbGUiPlJvbGVzPC9hPiB3aXRoIGNlcnRhaW4gY29tbW9uYWxpdGllcyB0b2dldGhlci4gRm9yIGV4YW1wbGUsCi1pbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBhbiBBbmFseXN0IHJvbGUgc2V0IGNvdWxkIGJlIHVzZWQgdG8KLWdyb3VwIHRvZ2V0aGVyIHJvbGVzIHN1Y2ggYXMgQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0LCBTeXN0ZW0gQW5hbHlzdCBhbmQKLVJlcXVpcmVtZW50cyBTcGVjaWZpZXIuIEVhY2ggb2YgdGhlc2Ugcm9sZXMgd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQKLWhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgbWF5IGJlIHJlc3BvbnNpYmxlIGZvciBwZXJmb3JtaW5nIGNlcnRhaW4gdGFza3MKLWFuZCBjcmVhdGluZyBjZXJ0YWluIHdvcmsgcHJvZHVjdHMuIFJvbGUgc2V0cyBjYW4gYmUgb3JnYW5pemVkIHVzaW5nIFJvbGUKLVNldCBHcm91cGluZ3MuPC9saT4KLTxsaT48c3Ryb25nPlRvb2xzPC9zdHJvbmc+IC0gVG9vbHMgaXMgYSBjb250YWluZXIgZm9yIDxhIGhyZWY9InRvb2xtZW50b3IuaHRtbCN0b29sbWVudG9yIj5Ub29sIE1lbnRvcnM8L2E+LiBUb29scyBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zCi1vZiBhIHRvb2wgYW5kIGl0J3MgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkN1c3RvbSBDYXRlZ29yaWVzPC9oND48cD5DdXN0b20gQ2F0ZWdvcmllcyBhcmUgaGlnaGx5IGN1c3RvbWl6YWJsZQotYW5kIGNhbiBjb250YWluIGFueSB0eXBlIG9mIGVsZW1lbnQuIEN1c3RvbSBDYXRlZ29yaWVzIGFsbG93IHlvdSB0byBjYXRlZ29yaXplCi1jb250ZW50IGFjY29yZGluZyB0byBhbnkgc2NoZW1lIHlvdSB3YW50IGFuZCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUKLVZpZXdzLCBwcm92aWRpbmcgYSBtZWFucyB0byBvcmdhbml6ZSB0aGUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy4KLUZvciBleGFtcGxlLCB5b3UgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRoYXQgbG9naWNhbGx5IG9yZ2FuaXplcyBjb250ZW50Ci1yZWxldmFudCB0byB5b3VyIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50LCBzdWNoIGFzIGEgVGVzdGluZyBjYXRlZ29yeQotdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnRzCi1yZWxldmFudCB0byB0ZXN0aW5nLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+TWV0aG9kIENvbnRlbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRwYWNrYWdlLmh0bWwjbWV0aG9kY29udGVudHBhY2thZ2UiPk1ldGhvZCBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kY29udGVudHBhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4NWY5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2Rjb250ZW50cGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIENvbnRlbnQgUGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYWNvbnRlbnRwYWNrYWdlLmh0bWwjY3JlYXRlY29udGVudHBhY2thZ2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRlbWV0aG9kY29udGVudCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBQYWNrYWdlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJtZXRob2Rjb250ZW50cGFja2FnZSI+PGEgbmFtZT0ibWV0aG9kY29udGVudHBhY2thZ2UiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9oMT4KLTxkaXY+PHA+QSBNZXRob2QgcGFja2FnZSBpcyBhIGNvbnRhaW5lciBmb3IgbWV0aG9kIGVsZW1lbnRzLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkCi1pbiBtZXRob2QgcGFja2FnZXMgdG8gc3RydWN0dXJlIGEgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiBNZXRob2QgZWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZQotY2FuIHJldXNlIGVsZW1lbnRzIGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSBsaW5rIGJldHdlZW4gdGhlbS4gRm9yCi1leGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvcgotdGFza3MgZGVmaW5lZCBpbiBhbm90aGVyIHBhY2thZ2UsIGVuc3VyaW5nIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mCi10aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuIEFsc28sIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkKLWltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS48L3A+Ci08cD48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U3RydWN0dXJlIG9mIGEgTWV0aG9kIFBhY2thZ2U8L2g0PjxwPkFsdGhvdWdoIGEgbWV0aG9kCi1wYWNrYWdlIGlzIGEgY29udGFpbmVyIGZvciBtZXRob2QgZWxlbWVudHMsIGl0cyBzdHJ1Y3R1cmUgaXMgYnJva2VuIGRvd24gaW50bwotc21hbGxlciBwYWNrYWdlcyB0byBiZXR0ZXIgb3JnYW5pemUgdGhlIGNvbnRlbnQsIHN1Y2ggYXMgY29udGVudCBwYWNrYWdlcywKLXN0YW5kYXJkIGNhdGVnb3JpZXMsIGFuZCBjdXN0b20gY2F0ZWdvcmllcy48L3A+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFjb250ZW50cGFja2FnZS5odG1sI2NyZWF0ZWNvbnRlbnRwYWNrYWdlIj5DcmVhdGUgYSBDb250ZW50IFBhY2thZ2U8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlbWV0aG9kY29udGVudC5odG1sI2NyZWF0ZW1ldGhvZGNvbnRlbnQiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RwbHVnaW4uaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZHBsdWdpbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODM5MDRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZHBsdWdpbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWV0aG9kIFBsdWctaW4iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1ldGhvZHBsdWdpbiIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NZXRob2QgUGx1Zy1pbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ibWV0aG9kcGx1Z2luIj48YSBuYW1lPSJtZXRob2RwbHVnaW4iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5NZXRob2QgUGx1Zy1pbjwvaDE+Ci08ZGl2PjxwPkFsbCBjb250ZW50IGlzIG9yZ2FuaXplZCBpbiBtZXRob2QgcGx1Zy1pbnMuIEEgbWV0aG9kIHBsdWctaW4gaXMgYSBjb250YWluZXIKLWZvciBtZXRob2QgcGFja2FnZXMgd2hpY2gsIGluIHR1cm4sIGNvbnRhaW4gdGhlIG1ldGhvZCBhbmQgcHJvY2VzcyBjb250ZW50LgotTWV0aG9kIHBsdWctaW5zIGFuZCBtZXRob2QgcGFja2FnZXMgYWxsb3cgeW91IHRvIG9yZ2FuaXplIHlvdXIgY29udGVudCBhdAotYSBsZXZlbCBvZiBncmFudWxhcml0eSB0aGF0IHN1aXRzIHlvdXIgbmVlZHMgZm9yIGF1dGhvcmluZyBhbmQgcmV1c2luZyB0aGUKLWNvbnRlbnQuIDwvcD4KLTxwPldoZW4geW91IGNyZWF0ZSBhIG1ldGhvZCBwbHVnLWluLCB5b3Ugd2lsbCB1c3VhbGx5IHdhbnQgdG8gcmV1c2UgY29udGVudAotaW4gb3RoZXIgcGx1Zy1pbnMuIFlvdSBtYXkgd2FudCB0byBtb2RpZnkgb3IgZXh0ZW5kIHRoZSBjb250ZW50IGluIHRoZXNlIG90aGVyCi1wbHVnLWlucyBvciBhZGQgeW91ciBvd24gY29udGVudC4gV2hlbiB5b3UgY3JlYXRlIGEgcGx1Zy1pbiB5b3UKLWNhbiByZWZlcmVuY2UgYW55IG51bWJlciBvZiBvdGhlciBwbHVnLWlucyB0aGF0IHdhbnQgdG8gdXNlIGluIHRoaXMgd2F5LiBBCi1tZXRob2QgcGx1Zy1pbiBjYW4gYWxzbyBiZSBzdGFuZC1hbG9uZSBhbmQgbm90IHJlZmVyZW5jZSBvdGhlciBwbHVnLWlucy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50cGFja2FnZS5odG1sI21ldGhvZGNvbnRlbnRwYWNrYWdlIj5NZXRob2QgQ29udGVudCBQYWNrYWdlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFtZXRob2RwbHVnaW4uaHRtbCNjcmVhdGVhbWV0aG9kcGx1Z2luIj5DcmVhdGUgYSBNZXRob2QgUGx1Zy1pbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9taWxlc3RvbmUuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21pbGVzdG9uZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWNjNzc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21pbGVzdG9uZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTWlsZXN0b25lIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im1pbGVzdG9uZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5NaWxlc3RvbmU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Im1pbGVzdG9uZSI+PGEgbmFtZT0ibWlsZXN0b25lIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TWlsZXN0b25lPC9oMT4KLTxkaXY+PHA+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBwcm9qZWN0LCBzdWNoCi1hcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5Ci1zdWNoIGFzIHRoZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZS48L3A+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3BlbnBlcnNwLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0YTYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vcGVucGVyc3AuSlBHCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0Y29tZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3V0Y29tZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDNmYmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGNvbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ik91dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWF3b3JrcHJvZHVjdC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJhcnRpZmFjdC5odG1sI2FydGlmYWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJkZWxpdmVyYWJsZS5odG1sI2RlbGl2ZXJhYmxlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9Im91dGNvbWUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+T3V0Y29tZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ib3V0Y29tZSI+PGEgbmFtZT0ib3V0Y29tZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPk91dGNvbWU8L2gxPgotPGRpdj48cD5BbiBvdXRjb21lIGlzIGFuIGludGFuZ2libGUgd29yayBwcm9kdWN0IHRoYXQgbWF5IGJlIGEgcmVzdWx0IG9yIHN0YXRlLgotT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseQotZGVmaW5lZC4gPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0id29ya3Byb2R1Y3QuaHRtbCN3b3JrcHJvZHVjdCI+V29yayBQcm9kdWN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhcnRpZmFjdC5odG1sI2FydGlmYWN0Ij5BcnRpZmFjdDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZGVsaXZlcmFibGUuaHRtbCNkZWxpdmVyYWJsZSI+RGVsaXZlcmFibGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXdvcmtwcm9kdWN0Lmh0bWwiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdXRkZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY0NjkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL291dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGFzdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGFzdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdlNjkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BlcnNwZWN0aXZlcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGVyc3BlY3RpdmVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzNlNWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcGVyc3BlY3RpdmVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQZXJzcGVjdGl2ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InVzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sI3VzZXJpbnRlcmZhY2VvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwZXJzcGVjdGl2ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UGVyc3BlY3RpdmVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJwZXJzcGVjdGl2ZXMiPjxhIG5hbWU9InBlcnNwZWN0aXZlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlBlcnNwZWN0aXZlczwvaDE+Ci08ZGl2PjxwPkEgUGVyc3BlY3RpdmUgZGVmaW5lcyBhIHNldCBvZiB2aWV3cyBhbmQgZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3Igc3BlY2lmaWMKLXRhc2tzLiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGNvbnRhaW5zIHR3byB3b3JraW5nIHBlcnNwZWN0aXZlczogYW4KLUF1dGhvcmluZyBQZXJzcGVjdGl2ZSBhbmQgYSBCcm93c2luZyBQZXJzcGVjdGl2ZS48L3A+Ci08cD5UaGUgPGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nCi1QZXJzcGVjdGl2ZTwvYT4gcHJvdmlkZXMgdmlld3MgYW5kIGZ1bmN0aW9ucyB0byBuYXZpZ2F0ZSBhbmQgYXV0aG9yIG1ldGhvZAotY29udGVudCBhbmQgcHJvY2Vzc2VzLCB3aGlsZSB0aGUgPGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSI+QnJvd3NpbmcgUGVyc3BlY3RpdmU8L2E+LCBhcyBpdHMgbmFtZSBpbXBsaWVzLCBhbGxvd3MgeW91Ci10byBwcmV2aWV3IGFuZCBuYXZpZ2F0ZSB0aHJvdWdoIGEgPGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+IHdpdGhvdXQgbWFraW5nIGFueSBjaGFuZ2VzLjwvcD4KLTxwPlRvIHNlbGVjdCBhIHBlcnNwZWN0aXZlLCBjbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24gPGltZyBzcmM9Im9wZW5wZXJzcC5KUEciIGFsdD0iIiAvPi48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCN1c2VyaW50ZXJmYWNlb3ZlcnZpZXciIHRpdGxlPSJFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGJ1aWx0IG9uIHRoZSBFY2xpcHNlIEludGVncmF0ZWQgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQgKElERSkuIFRoZSBwYXJ0cyBvZiB0aGUgd29ya3NwYWNlIGFyZToiPlRvb2wgSW50ZXJmYWNlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImJyb3dzaW5ncGVyc3BlY3RpdmUuaHRtbCNicm93aW5ncGVyc3BlY3RpdmUiPkJyb3dzaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9waGFzZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJmZWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3BoYXNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQaGFzZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwaGFzZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QaGFzZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icGhhc2UiPjxhIG5hbWU9InBoYXNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UGhhc2U8L2gxPgotPGRpdj48cD5BIFBoYXNlIGlzIGEgc3BlY2lhbCB0eXBlIG9mIGFjdGl2aXR5IHRoYXQgcmVwcmVzZW50cyBhIHNpZ25pZmljYW50Ci1wZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBhIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lCi1vciBzZXQgb2YgZGVsaXZlcmFibGVzLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmFjdGljZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc0Y2EyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ByYWN0aWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQcmFjdGljZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcmFjdGljZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5QcmFjdGljZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJhY3RpY2UiPjxhIG5hbWU9InByYWN0aWNlIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJhY3RpY2U8L2gxPgotPGRpdj48cD5BIHByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZQotYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuIFByYWN0aWNlcwotYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMKLXRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gRXhhbXBsZXMKLWZvciBwcmFjdGljZXMgd291bGQgYmUgbWFuYWdlIHJpc2tzLCBjb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHksIGFyY2hpdGVjdHVyZQotY2VudHJpYywgYW5kIGNvbXBvbmVudCBiYXNlZCBkZXZlbG9wbWVudCwgdG8gbmFtZSBhIGZldy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmV2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcmV2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTRmOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJldmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJldmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcmV2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByZXZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByZXZpZXciPjxhIG5hbWU9InByZXZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5QcmV2aWV3PC9oMT4KLTxkaXY+PHA+UHJldmlldyBkaXNwbGF5cyB5b3VyIGNvbnRlbnQgaW4gYnJvd3NlciBmb3JtYXQgc2ltaWxhciB0bwotaG93IGl0IHdpbGwgYXBwZWFyIHRvIGFuIGVuZCB1c2VyIGJyb3dzaW5nIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2NhdXRoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2NhdXRoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmOGU4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jYXV0aC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZmM4MmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByb2Nlc3M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3MiPjxhIG5hbWU9InByb2Nlc3MiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzPC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QSA8c3BhbiBjbGFzcz0ia2V5d29yZCI+cHJvY2Vzczwvc3Bhbj4gZGVzY3JpYmVzIGhvdyBhIHBhcnRpY3VsYXIgcGllY2UKLW9mIHdvcmsgc2hvdWxkIGJlIGRvbmUuIFRoZSB3b3JrIG1heSBoYXZlIGEgcmVsYXRpdmVseSBzbWFsbCBzY29wZSwgaW4gd2hpY2gKLWNhc2UgaXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhIGNhcGFiaWxpdHkgcGF0dGVybiwgb3IgbWF5IGFkZHJlc3MgYSBmdWxsIHByb2plY3QKLWxpZmVjeWNsZSwgaW4gd2hpY2ggY2FzZSBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgZGVsaXZlcnkgcHJvY2Vzcy4gQSBwcm9jZXNzCi1jYW4gcmV1c2UgbWV0aG9kIGVsZW1lbnRzIGFuZCBjb21iaW5lcyB0aGVtIGludG8gYSBzdHJ1Y3R1cmUgYW5kIHNlcXVlbmNlCi1mb3IgY2Fycnlpbmcgb3V0IHdvcmsuPC9wPgotPHA+VGhlcmUgYXJlIHR3byBtYWluIHR5cGVzIG9mIHByb2Nlc3MsIGEgPGEgaHJlZj0iY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjYXBhYmlsaXR5cGF0dGVybiI+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9hPiBhbmQKLWEgPGEgaHJlZj0iZGVsaXZlcnlwcm9jZXNzLmh0bWwjZGVsaXZlcnlwcm9jZXNzIj5EZWxpdmVyeSBQcm9jZXNzPC9hPi4KLUEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgc3BlY2lhbCBwcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3Rlcgotb2YgYWN0aXZpdGllcyBpbiBjb21tb24gcHJvY2VzcyBhcmVhcywgd2hpbGUgYSBkZWxpdmVyeSBwcm9jZXNzIGRlc2NyaWJlcwotYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHR5cGUgb2YgcHJvamVjdC48L3A+Ci08cD5FYWNoCi10aW1lIGEgdGFzayBpcyBpbmNsdWRlZCBpbiBhIHByb2Nlc3MsIGEgcmVmZXJlbmNlIG9iamVjdCB0byB0aGF0IHRhc2sgaXMgY3JlYXRlZAotaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2Nlc3MuIFRoaXMgaXMgY2FsbGVkIGEgdGFzayBkZXNjcmlwdG9yLiBUaGUgc2FtZQotdGFzayBjYW4gYmUgcmVmZXJlbmNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzIGluIHRoZSBzYW1lIHByb2Nlc3MuIEluIG90aGVyIHdvcmRzLAotb25lIHRhc2sgY2FuIGhhdmUgbWFueSB0YXNrIGRlc2NyaXB0b3JzLiBBIHRhc2sgZGVzY3JpcHRvciBjYW4gYWxzbyBtb2RpZnkKLXRoZSBiYXNlIHRhc2sgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZyB0aGUgdGFzay4gRm9yIGV4YW1wbGUsIHJvbGVzIGFuZCB3b3JrCi1wcm9kdWN0cyBjYW4gYmUgYWRkZWQgb3Igc3VwcHJlc3NlZCwgYW5kIHN0ZXBzIGNhbiBiZSBzdXBwcmVzc2VkIG9yIHJlLXNlcXVlbmNlZC48L3A+Ci08cD5Sb2xlcwotYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGFsc28gYmUgaW5jbHVkZWQgaW4gcHJvY2Vzc2VzIGFzIHJvbGUgZGVzY3JpcHRvcnMgYW5kCi13b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMuIFJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBiZSBjdXN0b21pemVkIHRvIGZpdAotd2l0aCB0aGUgY29udGVudCBvZiB0aGUgcHJvY2VzcyBpbiB3aGljaCB0aGV5IGFyZSB1c2VkLjwvcD4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwjcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyI+Q3JlYXRlIGEgRGVsaXZlcnkgUHJvY2VzczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJldXNhYmxlY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCNjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybiI+Q3JlYXRlIGEgUmV1c2FibGUgQ2FwYWJpbGl0eSBQYXR0ZXJuPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2NiNGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InByb2Nlc3MuaHRtbCNwcm9jZXNzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhZGVsaXZlcnlwcm9jZXNzLmh0bWwjY3JlYXRlYWRlbGl2ZXJ5cHJvY2VzcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icHJvY2Vzcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InByb2Nlc3NhdXRob3JpbmdvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Ij48YSBuYW1lPSJwcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzIEF1dGhvcmluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kCi13b3JrIHByb2R1Y3RzIHByb2R1Y2VkIG92ZXIgdGltZS4gPC9wPgotPHA+PGltZyBzcmM9InByb2NhdXRoLmdpZiIgYWx0PSIiIC8+PC9wPgotPHA+UHJvY2Vzc2VzIGFyZSB0eXBpY2FsbHkgZXhwcmVzc2VkIGFzIHdvcmtmbG93cyBvciBicmVha2Rvd24KLXN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsIGlzIGFzIG11Y2gKLWEgcHJvY2VzcyBhcyBkZWZpbmluZyBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIGluIGl0ZXJhdGlvbnMgb2YgcGFyYWxsZWwgd29yay4KLVRoZXkganVzdCByZXByZXNlbnQgZGlmZmVyZW50IGRldmVsb3BtZW50IGFwcHJvYWNoZXMuIEhlbmNlLCBmb3IgZGVmaW5pbmcKLWEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0Ci1zcGVjaWZ5IGhvdyB0aGUgd29yayBzaGFsbCBiZSBvcmdhbml6ZWQgb3ZlciB0aW1lLCB0byBtZWV0IHRoZSBuZWVkcyBvZiBhCi1wYXJ0aWN1bGFyIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdCAoc3VjaCBhcyBzb2Z0d2FyZSBmb3IgYSBvbmxpbmUgc3lzdGVtCi12ZXJzdXMgc29mdHdhcmUgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgcHJvY2Vzc2VzCi1iYXNlZCBvbiBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcyBhY3Jvc3MgbWFueSBkaWZmZXJlbnQgbGlmZWN5Y2xlCi1tb2RlbHMsIGluY2x1ZGluZyB3YXRlcmZhbGwsIGluY3JlbWVudGFsLCBhbmQgaXRlcmF0aXZlIGxpZmVjeWNsZXMuIEVQRiBDb21wb3NlciBhbHNvCi1zdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucyBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUKLW9yIHdvcmtmbG93IHByZXNlbnRhdGlvbnMuIFlvdSBjYW4gYWxzbyBkZWZpbmUgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3NlciB0aGF0IHVzZSBhCi1taW5pbWFsIHNldCBvZiBtZXRob2QgY29udGVudCB0byBkZWZpbmUgcHJvY2Vzc2VzIGZvciBhZ2lsZSwgc2VsZi1vcmdhbml6aW5nCi10ZWFtcy48L3A+Ci08cD5UaGUgRVBGIENvbXBvc2VyIHNjcmVlbiBjYXB0dXJlIGFib3ZlIHNob3dzIGFuIGV4YW1wbGUgb2YgYSBwcm9jZXNzIHByZXNlbnRlZCBhcwotYSBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eQotZGlhZ3JhbSBmb3Igb25lIHBhcnRpY3VsYXIgYWN0aXZpdHksIHRoZSBpbmNlcHRpb24gcGhhc2UuIEl0IGFsc28gaW5kaWNhdGVzCi13aXRoIHRoZSB0d28gYmx1ZSBhcnJvd3MgdGhhdCB0aGUgcGFydGljdWxhciBtZXRob2QgY29udGVudCB0YXNrICJEZXRhaWwgYQotVXNlIENhc2UiIGhhcyBiZWVuIGFwcGxpZWQgaW4gdGhlIHByb2Nlc3MgdHdpY2U7IGZpcnN0bHkgaW4gdGhlIGluY2VwdGlvbgotcGhhc2UgdW5kZXIgdGhlIGFjdGl2aXR5ICJEZWZpbmUgdGhlIFN5c3RlbSwiIGFuZCBzZWNvbmRseSwgaW4gdGhlIGVsYWJvcmF0aW9uCi1waGFzZSBpbiB0aGUgYWN0aXZpdHkgIlJlZmluZSB0aGUgc3lzdGVtIGRlZmluaXRpb24iLiBZb3Ugc2VlIGJlbG93IGVhY2ggb2YKLXRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gRVBGIENvbXBvc2VyLCBsaXN0cyBvZgotdGhlIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB0aGUgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiBJZiB5b3UKLWxvb2sgY2xvc2VseSwgeW91IHNlZSB0aGF0IHRoZXNlIGxpc3RzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggb2YgdGhlc2UgdHdvCi10YXNrIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICJEZXRhaWwgYSBVc2UgQ2FzZSIKLW1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi1pbiB0aGUgbGlzdCBvZiBpbnB1dHMgdG8gYmUgY29uc2lkZXJlZCBhbmQgb3V0cHV0cyB0byBiZSBwcm9kdWNlZCBvciB1cGRhdGVkLgotVGhlc2UgY2hhbmdlcyB3ZXJlIGRlZmluZWQgYnkgdGhlIGF1dGhvciB0aGF0IGNyZWF0ZWQgdGhpcyBwcm9jZXNzIHRvIGV4cHJlc3MKLXRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotdXBkYXRpbmcgdGhlIHJvbGVzLCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMgZm9yIGEgdGFzayBkZXNjcmlwdG9yLAoteW91IGNhbiBhbHNvIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUKLWV4YWN0IHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi1vY2N1cnJlbmNlIG9mIHRoZSB0YXNrLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgcHJvdmlkZXMgeW91IHdpdGggYSBwcm9jZXNzIGVkaXRvciB0aGF0IHN1cHBvcnRzIGRpZmZlcmVudCBicmVha2Rvd24KLXN0cnVjdHVyZSB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsCi15b3UgdHlwaWNhbGx5IHN0YXJ0IGJ5IGNyZWF0aW5nIGFuIGFjdGl2aXR5IGJyZWFrZG93biwgZGl2aWRpbmcgYW5kIGJyZWFraW5nCi15b3VyIHByb2Nlc3MgZG93biBpbnRvIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGhpZ2gtbGV2ZWwgYWN0aXZpdGllcy4gSW5zdGVhZAotb2YgY3JlYXRpbmcgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5Ci13b3JrIGluIGEgZ3JhcGhpY2FsIGFjdGl2aXR5IGRpYWdyYW0gZWRpdG9yIHRoYXQgYWxsb3dzIHlvdSB0byBncmFwaGljYWxseQotY3JlYXRlIGEgd29ya2Zsb3cgZm9yIHlvdXIgYWN0aXZpdGllcy4gVG8gYXNzaWduIG1ldGhvZCBjb250ZW50IHRvIHlvdXIgcHJvY2VzcywKLXlvdSB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93bgotc3RydWN0dXJlLCB3b3JrIHByb2R1Y3QgdXNhZ2UsIG9yIHRlYW0gYWxsb2NhdGlvbiB2aWV3KS4gRWFjaCB2aWV3IHN1cHBvcnRzCi1hIGRpZmZlcmVudCBhcHByb2FjaCBmb3IgY3JlYXRpbmcgYSBwcm9jZXNzLiBZb3UgY2FuIGRlZmluZSB0aGUgd29yayB0byBiZQotZG9uZSwgZGVmaW5lIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91cgotcm9sZXMuIElmIHJlcXVlc3RlZCwgdGhlIGVkaXRvciB1cGRhdGVzIHRoZSBvdGhlciBwcm9jZXNzIHZpZXdzIHNlbWktYXV0b21hdGljYWxseQotdXNpbmcgd2l6YXJkcyB0aGF0IHByb21wdCB5b3UgZm9yIGRlY2lzaW9ucyBvbiBzZWxlY3RpbmcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMuIDwvcD4KLTwvZGl2PgotPGRpdj4KLTx1bCBjbGFzcz0idWxsaW5rcyI+Ci08bGkgY2xhc3M9InVsY2hpbGRsaW5rIj48c3Ryb25nPjxhIGhyZWY9InByb2Nlc3MuaHRtbCI+UHJvY2VzczwvYT48L3N0cm9uZz48YnIgLz4KLTwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJwcm9jZXNzLmh0bWwjcHJvY2VzcyI+UHJvY2VzczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhcmV1c2FibGVjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NyZWF0ZWFyZXVzYWJsZWNhcGFiaWxpdHlwYXR0ZXJuIj5DcmVhdGUgYSBSZXVzYWJsZSBDYXBhYmlsaXR5IFBhdHRlcm48L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFkZWxpdmVyeXByb2Nlc3MuaHRtbCNjcmVhdGVhZGVsaXZlcnlwcm9jZXNzIj5DcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExNDJlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUHJvY2VzcyBFbGVtZW50IFByb3BlcnRpZXMgVmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJwcm9jZXNzZWxlbWVudHByb3BlcnRpZXN2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlByb2Nlc3MgRWxlbWVudCBQcm9wZXJ0aWVzIFZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPjxhIG5hbWU9InByb2Nlc3NlbGVtZW50cHJvcGVydGllc3ZpZXciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Qcm9jZXNzIEVsZW1lbnQgUHJvcGVydGllcyBWaWV3PC9oMT4KLTxkaXY+PHA+V2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBwcm9jZXNzLCB0aGUgcHJvY2VzcyBlbGVtZW50IHByb3BlcnRpZXMgdmlldyBhbGxvd3MKLXlvdSB0byBlZGl0IGFsbCB0aGUgZGV0YWlscyBmb3IgYSBzaW5nbGUgZWxlbWVudCBpbiB0aGUgcHJvY2Vzcy4gSWYgeW91IGNsaWNrCi1pbiBhbnkgcm93IGluIGEgcHJvY2VzcyBkaXNwbGF5LCB5b3Ugd2lsbCBzZWUgdGhlIGZ1bGwgZGV0YWlscyBvZiB0aGUgcHJvY2VzcwotZWxlbWVudCBpbiB0aGUgcm93IGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuPC9wPgotPHA+SWYgdGhlIHByb3BlcnRpZXMgdmlldyBpcyBub3Qgb3BlbiwgcmlnaHQgY2xpY2sgYW55IHJvdyBpbiBhIHByb2Nlc3MgYW5kCi1zZWxlY3QgPHN0cm9uZz5TaG93IFByb3BlcnRpZXMgVmlldzwvc3Ryb25nPi48L3A+Ci08cD5UaGUgcHJvcGVydGllcyB2aWV3IGlzIHRoZSBlZGl0b3IgZm9yIGFjdGl2aXRpZXMsIHRhc2sgZGVzY3JpcHRvcnMsIHJvbGVzCi1kZXNjcmlwdG9ycywgYW5kIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycy4gVGhlIGluZm9ybWF0aW9uIGZvcgotYSBkZXNjcmlwdG9yIGlzIHNpbWlsYXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIGVsZW1lbnQgZWRpdG9yLCBidXQgaXQKLWFsc28gaGFzIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIHByb2Nlc3MuIFRoZSBwcm9jZXNzIGluZm9ybWF0aW9uCi1pcyBhbHNvIGRpc3BsYXllZCBpbiB0aGUgY29ycmVzcG9uZGluZyByb3cgaW4gdGhlIHByb2Nlc3MgZGlzcGxheS48L3A+Ci08cD48c3Ryb25nPkdlbmVyYWwgSW5mb3JtYXRpb24gdGFiOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSBOYW1lIGFuZCBQcmVzZW50YXRpb24gTmFtZSBkZWZhdWx0IHRvIHRoZSBjb3JyZXNwb25kaW5nIG5hbWVzIGluIHRoZQotYmFzZSBtZXRob2QgZWxlbWVudC4gVGhlc2UgbmFtZXMgY2FuIGJlIGNoYW5nZWQgaW4gYSBkZXNjcmlwdG9yLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdXNlZCB0byBzcGVjaWZ5IGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgZWxlbWVudAotaW4gdGhlIHByb2Nlc3MgYW5kIGNhbiBiZSBzZXQgZm9yIGFsbCB0eXBlcyBvZiBwcm9jZXNzIGVsZW1lbnRzOjx1bD48bGk+PHN0cm9uZz5PcHRpb25hbDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGVsZW1lbnQKLWlzIGNvbnNpZGVyZWQgb3B0aW9uYWwgaW4gdGhlIHByb2Nlc3MuIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBzYWZlIHRvIHJlbW92ZQotdGhlIGVsZW1lbnQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwgdGhlIGVsZW1lbnQgaXMgY29uc2lkZXJlZCBtYW5kYXRvcnkKLWFuZCBzaG91bGQgbm90IGJlIHJlbW92ZWQgZnJvbSB0aGUgcHJvY2Vzcy48L2xpPgotPGxpPjxzdHJvbmc+TXVsdGlwbGUgT2NjdXJyZW5jZXM8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0Ci13aGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZCBhcyBhIHByb2plY3Qgb3Igb3RoZXIgcHJvY2VzcywgaXQgaXMgZXhwZWN0ZWQKLXRoYXQgdGhlcmUgd2lsbCBiZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGlzIGVsZW1lbnQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQKLShmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIG9jY3VycmVuY2Ugb2YgdGhpcwotZWxlbWVudCB3aGVuIHRoZSBwcm9jZXNzIGlzIGluc3RhbnRpYXRlZC48L2xpPgotPGxpPjxzdHJvbmc+UGxhbm5lZDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgdGhlIGVsZW1lbnQgd2lsbCBiZSBpbmNsdWRlZAotaW4gYW4gZXhwb3J0IHRvIGEgcHJvamVjdCBtYW5hZ2VtZW50IHRvb2wuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQgKGZhbHNlKSwKLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIGFuIGV4cG9ydC48L2xpPgotPGxpPjxzdHJvbmc+U3VwcHJlc3NlZDwvc3Ryb25nPjogSWYgdGhpcyBpcyBjaGVja2VkICh0cnVlKSwgdGhlIGVsZW1lbnQgd2lsbCBub3QgYXBwZWFyCi1pbiBhIHB1Ymxpc2hlZCBwcm9jZXNzLiBUaGlzIGlzIHVzdWFsbHkgdXNlZCB0byBtb2RpZnkgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLWluY2x1ZGVkIGluIGEgcHJvY2Vzcy4gVGhpcyBpcyBub3QgY2hlY2tlZCAoZmFsc2UpIGFzIGRlZmF1bHQuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPlRoZSBmb2xsb3dpbmcgZWxlbWVudHMgY2FuIGJlIHNldCBmb3IgdGFzayBkZXNjcmlwdG9ycyBhbmQgYWN0aXZpdGllczo8dWw+PGxpPjxzdHJvbmc+RXZlbnQgRHJpdmVuPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUKLXRhc2sgb3IgYWN0aXZpdHkgd2lsbCBiZSBpbml0aWF0ZWQgd2hlbiBhIHBhcnRpY3VsYXIgZXZlbnQgb2NjdXJzLiBJZiB0aGlzCi1pcyBub3QgY2hlY2tlZCAoZmFsc2UpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBvciBhY3Rpdml0eSB3aWxsIGJlIGluaXRpYXRlZAotYmFzZWQgb24gb3RoZXIgdGFza3MgaW4gdGhlIHByb2Nlc3MuPC9saT4KLTxsaT48c3Ryb25nPk9uZ29pbmc8L3N0cm9uZz46IElmIHRoaXMgaXMgY2hlY2tlZCAodHJ1ZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrCi1vciBhY3Rpdml0eSBpcyBjb250aW51b3VzLiBJZiB0aGlzIGlzIG5vdCBjaGVja2VkIChmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0Ci10aGUgdGFzayBvciBhY3Rpdml0eSBoYXMgYSBjbGVhciBzdGFydCBhbmQgZmluaXNoIGluIHRoZSBwcm9jZXNzLjwvbGk+Ci08bGk+PHN0cm9uZz5SZXBlYXRhYmxlPC9zdHJvbmc+OiBJZiB0aGlzIGlzIGNoZWNrZWQgKHRydWUpLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzawotb3IgYWN0aXZpdHkgY2FuIGl0ZXJhdGUgd2hlbiB0aGUgcHJvY2VzcyBpcyBpbnN0YW50aWF0ZWQuIElmIHRoaXMgaXMgbm90IGNoZWNrZWQKLShmYWxzZSksIGl0IGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIG9yIGFjdGl2aXR5IHdpbGwgb25seSBvY2N1ciBvbmNlIGluIHRoZQotcHJvY2Vzcy48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+RGVwZW5kZW5jeSBGaWVsZDogWW91IGNhbiBhZGQgb25lIG9yIG1vcmUgZGVwZW5kZW5jaWVzIGZvciBhIHRhc2sgb3IgYWN0aXZpdHkuCi1DbGljayB0aGUgPHN0cm9uZz5BZGQuLi48L3N0cm9uZz4gYnV0dG9uIGFuZCBlbnRlciB0aGUgaW5kZXggbnVtYmVyIGZvciB0aGUgdGFzayBvcgotYWN0aXZpdHkgb24gd2hpY2ggdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBkZXBlbmRlbnQuIFRoZSBkZXBlbmRlbmN5ICh0eXBlKQotZGVmYXVsdHMgdG8gRmluaXNoLXRvLVN0YXJ0LiBJZiB5b3Ugd2FudCB0byBzZXQgYW5vdGhlciBkZXBlbmRlbmN5IHR5cGUsIGNsaWNrCi10aGUgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IGJ1dHRvbiBhbmQgc2VsZWN0IHRoZSByZXF1aXJlZCBkZXBlbmRlbmN5IHR5cGUgaW4gdGhlIGRlcGVuZGVuY3kKLWRyb3AgZG93biBib3guIFlvdSBjYW4gZW50ZXIgYSBkaWZmZXJlbnQgaW5kZXggbnVtYmVyIG9uIHRoZSBFZGl0IGRpYWxvZy4KLVlvdSBjYW4gYWxzbyByZW1vdmUgYSBkZXBlbmRlbmN5IGJ5IHNlbGVjdGluZyB0aGUgZGVwZW5kZW5jeSBhbmQgY2xpY2tpbmcKLXRoZSA8c3Ryb25nPlJlbW92ZTwvc3Ryb25nPiBidXR0b24uPC9wPgotPHA+VGhlIGJhc2UgbWV0aG9kIGVsZW1lbnQgZm9yIHRoZSBkZXNjcmlwdG9yIGlzIGRpc3BsYXllZCBvbiB0aGUgcGFnZS4gWW91Ci1jYW4gc2VsZWN0IGEgZGlmZmVyZW50IGVsZW1lbnQgYnkgY2xpY2tpbmcgdGhlIDxzdHJvbmc+TGluayBNZXRob2QgRWxlbWVudDwvc3Ryb25nPiBidXR0b24KLWFuZCBzZWxlY3RpbmcgdGhlIHJlcXVpcmVkIGVsZW1lbnQuPC9wPgotPHA+PHN0cm9uZz5Eb2N1bWVudGF0aW9uIHRhYjo8L3N0cm9uZz48L3A+Ci08cD5UaGUgZG9jdW1lbnRhdGlvbiB0YWIgY29udGFpbnMgZGVzY3JpcHRpdmUgYXR0cmlidXRlcyBmb3IgdGhlIGRlc2NyaXB0b3IKLW9yIGFjdGl2aXR5LjwvcD4KLTxwPjxzdHJvbmc+Um9sbC1VcCB0YWJzOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSBwcm9wZXJ0aWVzIHZpZXcgZm9yIGFuIGFjdGl2aXR5IGluY2x1ZGVzIHJvbGwtdXAgdGFicyB0aGF0IHByb3ZpZGUKLWxpc3RzIG9mIHRhc2tzLCByb2xlcywgb3Igd29yayBwcm9kdWN0cyAicm9sbGVkIHVwIiwgb3Igc3VtbWFyaXplZCwgZm9yIHRoZQotYWN0aXZpdHkuPC9wPgotPHA+PHN0cm9uZz5Bc3NvY2lhdGlvbiB0YWJzOjwvc3Ryb25nPjwvcD4KLTxwPlRoZSByZW1haW5pbmcgdGFicyBhcmUgdXNlZCB0byBhZGQgb3IgcmVtb3ZlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSBhY3Rpdml0eQotb3IgZGVzY3JpcHRvciB0byBtZXRob2QgZWxlbWVudHMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Yi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjU0NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3B1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYi5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjlhNWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJQdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbCNwdWJsaXNoaW5nb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sLmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlB1Ymxpc2hpbmcgYSBNZXRob2QgQ29uZmlndXJhdGlvbiB0byBhIE1ldGhvZCBXZWI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InB1Ymxpc2hpbmdhbWV0aG9kY29uZmlndXJhdGlvbnRvYW1ldGhvZHdlYiI+PGEgbmFtZT0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHVibGlzaGluZyBhIE1ldGhvZCBDb25maWd1cmF0aW9uIHRvIGEgTWV0aG9kIFdlYjwvaDE+Ci08ZGl2PjxkaXYgY2xhc3M9InAiPlVzaW5nIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIHdpemFyZCwgeW91IGNhbiBzZWxlY3QgZnJvbQotYSBzZXJpZXMgb2YgcHVibGljYXRpb24gb3B0aW9ucyB0byB0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW50byBhIHB1Ymxpc2hlZAotbWV0aG9kIFdlYi48L2Rpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHB1Ymxpc2ggYSBtZXRob2QgY29uZmlndXJhdGlvbjo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIHRvb2xiYXIsIHNlbGVjdCA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gJmd0OyBQdWJsaXNoPC9zdHJvbmc+LiBUaGUgUHVibGlzaAotTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkIGFwcGVhcnMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9uIHRoZSBTZWxlY3QgQ29uZmlndXJhdGlvbiBwYWdlLCBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24geW91Ci13YW50IHRvIHB1Ymxpc2ggZnJvbSB0aGUgbGlzdCBvZiBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gdGhlIGxpYnJhcnkgYW5kCi10aGVuIGNsaWNrIDxzdHJvbmc+TmV4dDwvc3Ryb25nPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T24gdGhlIFNwZWNpZnkgUHVibGlzaGluZyBPcHRpb25zIHBhZ2U6PC9zcGFuPjx1bD48bGk+UHJvdmlkZSBhIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgdGhlIHB1Ymxpc2hlZCBXZWIgc2l0ZSBpbiB0aGUKLVB1YmxpY2F0aW9uIHBhdGggZmllbGQuPC9saT4KLTxsaT5Qcm92aWRlIGEgdGl0bGUgZm9yIHRoZSBwdWJsaXNoZWQgbWV0aG9kIHdlYi48L2xpPgotPGxpPlNlbGVjdCBhIGJhbm5lciBpbWFnZSB0byB1c2UuPC9saT4KLTxsaT5TZWxlY3QgYSBmaWxlIHRvIHVzZSBmb3IgdGhlICJhYm91dCIgaW5mb3JtYXRpb24uPC9saT4KLTxsaT5Qcm92aWRlIGEgZmVlZGJhY2sgVVJMPC9saT4KLTxsaT5DaG9vc2UgdG8gaW5jbHVkZSBhIGdsb3NzYXJ5LCBpbmRleCwgc2VhcmNoIGNhcGFiaWxpdHkgYW5kL29yIHByb2Nlc3MKLXRyZWUgY3VzdG9taXphdGlvbi48L2xpPgotPGxpPkNob29zZSB0byBjaGVjayB0aGF0IGV4dGVybmFsIGh5cGVybGlua3MgYXJlIHZhbGlkLjwvbGk+Ci08bGk+Q2hvb3NlIHRvIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBoYXZlIG5vdCBiZWVuIGVkaXRlZCwgc3VjaAotYXMgYWN0aXZpdHkgZGlhZ3JhbXMgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSB0b29sLCBidXQgbm90IG1hbnVhbGx5Ci1lZGl0ZWQuPC9saT4KLTwvdWw+Ci0gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IENob29zaW5nIHRvIGluY2x1ZGUgZWl0aGVyIHRoZSBzZWFyY2ggY2FwYWJpbGl0eSBvciB0byBzdXBwb3J0Ci1jdXN0b21pemF0aW9uIG9mIHRoZSBwcm9jZXNzIHZpZXcgd2lsbCBpbmNsdWRlIHRoZSBicm93c2VyIGFwcGxldCBpbiB0aGUgcHVibGlzaGVkCi1XZWIgc2l0ZS4gSWYgeW91IGNob29zZSBub3QgdG8gcHVibGlzaCB3aXRoIHRoZSBsYXN0IHR3byBvcHRpb25zLCB0aGUgYnJvd3NlcgotYXBwbGV0IHdpbGwgbm90IGJlIGluY2x1ZGVkLjwvZGl2PgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5GaW5pc2g8L3N0cm9uZz4uIFB1Ymxpc2hpbmcgaXMgaW5pdGlhdGVkLjwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InB1Ymxpc2hpbmdvdmVydmlldy5odG1sI3B1Ymxpc2hpbmdvdmVydmlldyI+UHVibGlzaGluZyBPdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0ibWV0aG9kY29uZmlndXJhdGlvbnMuaHRtbCNtZXRob2Rjb25maWd1cmF0aW9ucyI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHVibGlzaGluZ292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5ODBlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wdWJsaXNoaW5nb3ZlcnZpZXcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlB1Ymxpc2hpbmcgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNyZWF0ZWFtZXRob2R2aWV3d2l0aGN1c3RvbWNhdGVnb3JpZXMuaHRtbCNjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbCNwdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4cG9ydGFwcm9jZXNzb3JtZXRob2Rjb250ZW50dG9hcGxhbm5pbmd0b29sLmh0bWwjZXhwb3J0YXByb2Nlc3Nvcm1ldGhvZGNvbnRlbnR0b2FwbGFubmluZ3Rvb2wiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icHVibGlzaGluZ292ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlB1Ymxpc2hpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InB1Ymxpc2hpbmdvdmVydmlldyI+PGEgbmFtZT0icHVibGlzaGluZ292ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHVibGlzaGluZyBPdmVydmlldzwvaDE+Ci08ZGl2PjxwPlRoZSB1bHRpbWF0ZSBvdXRwdXQgb2YgRVBGIENvbXBvc2VyIGlzIGEgcHVibGlzaGVkIFdlYiBzaXRlIHdpdGggbWV0aG9kCi1ndWlkYW5jZSBhbmQgcHJvY2Vzc2VzIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBwcm9qZWN0IHRlYW0uIFRoZSBpbmZvcm1hdGlvbgotY29udGFpbmVkIGluIHRoZSBXZWIgc2l0ZSBwcm92aWRlcyBhIHByb2plY3QgdGVhbSB3aXRoIGEgY29uc2lzdGVudCBtZXRob2QKLWZvciB0aGUgZW50aXJlIHRlYW0gdG8gZm9sbG93IGFuZCBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBlbmQtdG8tZW5kCi13b3JrIGxpZmVjeWNsZS4gPC9wPgotPHA+SXQgaXMgZWFzeSB0byBjb25maWd1cmUgYSBwcm9jZXNzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvciBzaXplIG9mIHByb2plY3QKLWFuZCB0byBwdWJsaXNoIHRoZSBndWlkYW5jZSB0byBhIFdlYiBzaXRlLiBBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgc2VsZWN0aW9uCi1vZiBDb250ZW50IFBhY2thZ2VzIGFjcm9zcyBkaWZmZXJlbnQgTWV0aG9kIFBsdWctaW5zIGNvbnRhaW5pbmcgdGhlIG1ldGhvZAotYW5kIHByb2Nlc3MgY29udGVudCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZCBXZWIgc2l0ZS4gQXQgcHVibGlzaGluZwotdGltZSwgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY29tYmluZWQgd2l0aCBkaWZmZXJlbnQgTWV0aG9kIFZpZXdzIHdoaWNoIGRlZmluZQotdGhlIFdlYiBzaXRlJ3MgbmF2aWdhdGlvbiBzdHJ1Y3R1cmVzIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi48L3A+Ci08cD5UaGUgQnJvd3NpbmcgUGVyc3BlY3RpdmUgcmVuZGVycyB0aGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gY29udGVudCBpbiBIVE1MCi1mb3JtYXQgd2l0aGluIHRoZSB0b29sLCBwcm92aWRpbmcgYSBuYXZpZ2FibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZAotb3IgcHJvY2VzcyBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbi48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhbWV0aG9kdmlld3dpdGhjdXN0b21jYXRlZ29yaWVzLmh0bWwjY3JlYXRlYW1ldGhvZHZpZXd3aXRoY3VzdG9tY2F0ZWdvcmllcyI+Q3JlYXRlIGEgTWV0aG9kIFZpZXcgd2l0aCBDdXN0b20gQ2F0ZWdvcmllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViLmh0bWwjcHVibGlzaGluZ2FtZXRob2Rjb25maWd1cmF0aW9udG9hbWV0aG9kd2ViIj5QdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gdG8gYSBNZXRob2QgV2ViPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcGxhY2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcGxhY2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlZTJmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBsYWNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZXBsYWNlcyIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImNvbnRyaWJ1dGVzLmh0bWwjY29udHJpYnV0ZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+UmVwbGFjZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlcGxhY2VzIj48YSBuYW1lPSJyZXBsYWNlcyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJlcGxhY2VzPC9oMT4KLTxkaXY+PHA+QSByZXBsYWNpbmcgZWxlbWVudCByZXBsYWNlcyBwYXJ0cyBvZiB0aGUgYmFzZSBlbGVtZW50LiBSZXBsYWNlcyBwcm92aWRlcwotYSB3YXkgZm9yIGFuIGVsZW1lbnQgdG8gcmVwbGFjZSBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueQotb2YgdGhlIGJhc2UgZWxlbWVudCdzIGV4aXN0aW5nIHByb3BlcnRpZXMuIFRoaXMgaXMsIGluIG1vc3QgY2FzZXMsIHVzZWQgZm9yCi1tZXRob2QgcGx1Zy1pbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgcm9sZXMsCi10YXNrcywgb3IgYWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlbHkgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIHRoZQotZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cy4gVGhlIGVmZmVjdCBvZiB0aGlzLCBpcyB0aGF0IHRoZQotYmFzZSBjb250ZW50IGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5ldyByZXBsYWNpbmcgZWxlbWVudAotdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkKLW5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLjwvcD4KLTxwPlVzZSB0aGUgQ29udGVudCBWYXJpYWJpbGl0eSBzZWN0aW9uIG9uIHRoZSBEZXNjcmlwdGlvbiB0YWIgdG8gbWFrZSBhbiBlbGVtZW50Ci1yZXBsYWNlIGFub3RoZXIgZWxlbWVudC4gU2VsZWN0IDxzdHJvbmc+UmVwbGFjZXM8L3N0cm9uZz4gYXMgdGhlIHZhcmlhYmlsaXR5IHR5cGUgYW5kCi1zZWxlY3QgdGhlIGJhc2UgZWxlbWVudCB0aGF0IHRoaXMgZWxlbWVudCB3aWxsIHJlcGxhY2UuIFRoZSBiYXNlIGVsZW1lbnQgbXVzdAotYmUgdGhlIHNhbWUgdHlwZSBvZiBlbGVtZW50IGFzIHRoZSByZXBsYWNpbmcgZWxlbWVudC48L3A+Ci08cD5XaGVuIHlvdSByZXBsYWNlIGFuIGVsZW1lbnQsIGFsbCB0aGUgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBhcmUgcmVwbGFjZWQKLWJ5IHRoZSByZXBsYWNpbmcgZWxlbWVudC4gSWYgYSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGUgaW4gdGhlIHJlcGxhY2luZyBlbGVtZW50Ci1pcyBibGFuaywgYnV0IHRoZSBiYXNlIGVsZW1lbnQgaGFzIGNvbnRlbnQsIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSBibGFuayBpbgotdGhlIHJlc3VsdGluZyBlbGVtZW50LjwvcD4KLTxwPlJlcGxhY2UgYWx3YXlzIHJlcGxhY2VzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50Ci13aXRoIHRoZSByZXBsYWNpbmcgZWxlbWVudCdzIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucywgZXhjZXB0IGZvciBpbmNvbWluZwotYXNzb2NpYXRpb25zLCB3aGljaCBhcmUgb25seSBhZGRlZCB0byB0aGUgYmFzZSwgYnV0IGRvIG5vdCByZXBsYWNlIHRoZSBiYXNlJ3MKLWluY29taW5nIGFzc29jaWF0aW9ucy48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPlJlcGxhY2VzIHJ1bGVzOjwvc3Ryb25nPjx1bD48bGk+QXR0cmlidXRlcyBvZiB0aGUgYmFzZSBlbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIGF0dHJpYnV0ZXMgb2YgdGhlIHJlcGxhY2luZwotZWxlbWVudCBpbmNsdWRpbmcgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+T3V0Z29pbmcgdG8tb25lIGFuZCB0by1tYW55IGFzc29jaWF0aW9ucyBvZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQgcmVwbGFjZQotYW55IG91dGdvaW5nIGFzc29jaWF0aW9ucyBvZiB0aGUgYmFzZSBlbGVtZW50LiBJZiB0aGUgY29udHJpYnV0b3IgZG9lcyBub3QKLWhhdmUgYW55IG91dGdvaW5nIGFzc29jaWF0aW9ucywgdGhlbiBuZWl0aGVyIHdpbGwgdGhlIHJlc3VsdGluZyBlbGVtZW50LjwvbGk+Ci08bGk+SW5jb21pbmcgYXNzb2NpYXRpb25zIHdpdGggYSB0by1tYW55IGNvbnN0cmFpbnQgb24gdGhlIG90aGVyIGFzc29jaWF0aW9uCi1lbmQgdG8gdGhlIHJlcGxhY2VkIGVsZW1lbnQgYXJlIHByZXNlcnZlZCBhbmQgYXVnbWVudGVkIHdpdGggaW5jb21pbmcgYXNzb2NpYXRpb25zCi1vZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuPC9saT4KLTxsaT5JbmNvbWluZyBhc3NvY2lhdGlvbnMgd2l0aCBhIHRvLW9uZSBjb25zdHJhaW50IG9uIHRoZSBvdGhlciBhc3NvY2lhdGlvbgotZW5kIHRvIHRoZSByZXBsYWNlZCBlbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHRoZSByZXNwZWN0aXZlIGluY29taW5nIGFzc29jaWF0aW9uCi1vZiB0aGUgcmVwbGFjaW5nIGVsZW1lbnQuIElmIHRoZSByZXBsYWNpbmcgZWxlbWVudCBkb2VzIG5vdCBoYXZlIHN1Y2ggYW4gYXNzb2NpYXRpb24KLXRoZW4gdGhlIHJlc3VsdGluZyBlbGVtZW50IGtlZXBzIHRoZSBpbmNvbWluZyBhc3NvY2lhdGlvbiBvZiB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08bGk+QSBiYXNlIGVsZW1lbnQgb2YgYSByZXBsYWNlbWVudCBjYW4gaGF2ZSBvbmx5IG9uZSByZXBsYWNpbmcgZWxlbWVudCBwZXIKLWNvbmZpZ3VyYXRpb24uIElmIG1vcmUgdGhhbiBvbmUgcmVwbGFjaW5nIGVsZW1lbnQgaXMgcHJlc2VudCwgbm8gcmVwbGFjZW1lbnQKLXRha2VzIHBsYWNlLjwvbGk+Ci08bGk+UmVwbGFjZW1lbnQgd29ya3MgdHJhbnNpdGl2ZWx5LCBpLmUuIGlmIGEgcmVwbGFjaW5nIGVsZW1lbnQgaXMgcmVwbGFjZWQKLWl0c2VsZiwgdGhlIGZpbmFsIHJlcGxhY2VyIHByZXZhaWxzLjwvbGk+Ci08bGk+Q29udHJpYnV0aW9uIHByZWNlZGVzIFJlcGxhY2VtZW50LCBpLmUuIGNvbnRyaWJ1dGlvbiBpcyBldmFsdWF0ZWQgZmlyc3QKLWFuZCB0aGVuIHJlcGxhY2VtZW50IHBlcmZvcm1lZCBhZnRlcndhcmQuIFRoZSBldmFsdWF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBhbmQKLXJlcGxhY2VtZW50IGlzIHBlcmZvcm1lZCB0b3AtZG93biBpbiB0aGUgc3BlY2lhbGl6YXRpb24gaGllcmFyY2h5LjwvbGk+Ci08L3VsPgotU2VlIDxhIGhyZWY9InZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwjdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPlZhcmlhYmlsaXR5IEFzc29jaWF0aW9uczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCBlbGVtZW50Ci10eXBlLjwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHkuaHRtbCN2YXJpYWJpbGl0eSIgdGl0bGU9IlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZSBvciBtb2RpZnkgZWxlbWVudHMgaW4gb3RoZXIgY29udGVudCBwYWNrYWdlcyB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudC4gVmFyaWFiaWxpdHkgZW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IHdoaWxlIGtlZXBpbmcgdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLiI+VmFyaWFiaWxpdHk8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImV4dGVuZHMuaHRtbCNleHRlbmRzIj5FeHRlbmRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sI2NvbnRyaWJ1dGVzIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXBvcnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcG9ydC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUzYTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JlcG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVwb3J0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJlcG9ydCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5SZXBvcnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlcG9ydCI+PGEgbmFtZT0icmVwb3J0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVwb3J0PC9oMT4KLTxkaXY+PHA+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZQotYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLgotRm9yIGV4YW1wbGUsIGEgcmVwb3J0IG1heSBjb21iaW5lIGEgZ3JhcGhpY2FsIG1vZGVsIGZyb20gYSBkZXNpZ24gdG9vbCB3aXRoCi10ZXh0dWFsIGluZm9ybWF0aW9uIGRvY3VtZW50cyBpbnRvIGEgcmVwb3J0LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JldXNhYmxlYXNzZXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JldXNhYmxlYXNzZXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwMTE0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yZXVzYWJsZWFzc2V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSZXVzYWJsZSBBc3NldCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyZXVzYWJsZWFzc2V0IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJldXNhYmxlIEFzc2V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyZXVzYWJsZWFzc2V0Ij48YSBuYW1lPSJyZXVzYWJsZWFzc2V0Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmV1c2FibGUgQXNzZXQ8L2gxPgotPGRpdj48cD5BIHJldXNhYmxlIGFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuCi1UaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nIGhvdyB0aGUKLWFzc2V0IHNob3VsZCBiZSB1c2VkLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yaWNodGV4dGVkaXRvci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWMxYTQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JpY2h0ZXh0ZWRpdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSaWNoIFRleHQgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJpY2h0ZXh0ZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJpY2ggVGV4dCBFZGl0b3I8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY2h0ZXh0ZWRpdG9yIj48YSBuYW1lPSJyaWNodGV4dGVkaXRvciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJpY2ggVGV4dCBFZGl0b3I8L2gxPgotPGRpdj48cD5UaGUgUmljaCBUZXh0IEVkaXRvciBwcm92aWRlcyBzaW1wbGUgdGV4dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucwotdGhhdCBhbGxvdyBhbiBhdXRob3IgdG8gY2hhbmdlIGhvdyBzZWN0aW9ucyBvZiB0ZXh0IGFwcGVhciBpbiBhIHB1Ymxpc2hlZAotV2ViIHNpdGUuIFRoZSBSaWNoIFRleHQgRWRpdG9yIGFsbG93cyBpbmRpdmlkdWFsIGNvbXBvbmVudHMgb2YgdGV4dCB0byBiZQotY2hhbmdlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIG92ZXJhbGwgc3R5bGUgc2hlZXQocykgdGhhdCBkZXRlcm1pbmUgdGhlCi1zdHlsZSBhbmQgZm9ybWF0IG9mIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBSaWNoIFRleHQgRWRpdG9yIGFsbG93cyB5b3UgdG86PHVsPjxsaT5Db3B5LCBjdXQgYW5kIHBhc3RlIHRleHQuIFNpbXBseSBoaWdobGlnaHQgdGhlIHRleHQgeW91IHdhbnQgdG8gY3V0IG9yCi1jb3B5IGFuZCB0aGVuIGNsaWNrIHRoZSBDdXQgPGltZyBzcmM9ImN1dC5naWYiIGFsdD0iIiAvPiBvciBDb3B5IDxpbWcgc3JjPSJjb3B5LmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuIFRvIHBhc3RlIHRleHQsIHBsYWNlIHRoZSBjdXJzb3IKLXdoZXJlIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIHRleHQgYW5kIHRoZW4gY2xpY2sgdGhlIFBhc3RlIGJ1dHRvbiA8aW1nIHNyYz0icGFzdGUuZ2lmIiBhbHQ9IiIgLz4uPC9saT4KLTxsaT5SZW1vdmUgYWxsIHRoZSBjb250ZW50cyBpbiB0aGUgdGV4dCBlZGl0b3Igd2luZG93IGF0IG9uY2UgYnkgY2xpY2tpbmcKLXRoZSBDbGVhciBDb250ZW50IGJ1dHRvbiA8aW1nIHNyYz0iY2xlYXJjb250ZW50LmdpZiIgYWx0PSIiIC8+LjwvbGk+Ci08bGk+Q2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHlvdXIgdGV4dCBieSBtYWtpbmcgaXQgYm9sZCwgaXRhbGljaXplZCwgb3IgdW5kZXJsaW5pbmcKLWl0LiBIaWdobGlnaHQgdGhlIHRleHQgeW91IHdhbnQgdG8gY2hhbmdlIGFuZCB0aGVuIGNsaWNrIHRoZSBCb2xkIDxpbWcgc3JjPSJib2xkLmdpZiIgYWx0PSIiIC8+LCBJdGFsaWNzIDxpbWcgc3JjPSJpdGFsaWMuZ2lmIiBhbHQ9IiIgLz4sCi1vciBVbmRlcmxpbmUgPGltZyBzcmM9InVuZGVybGluZS5naWYiIGFsdD0iIiAvPiBidXR0b24uPC9saT4KLTxsaT5DcmVhdGUgU3VwZXIgb3IgU3ViIHNjcmlwdCBieSBjbGlja2luZyB0aGUgU3VwZXJzY3JpcHQgPGltZyBzcmM9InN1cGVyc2NyaXB0LmdpZiIgYWx0PSIiIC8+IG9yIFN1YnNjcmlwdCA8aW1nIHNyYz0ic3Vic2NyaXB0LmdpZiIgYWx0PSIiIC8+IGJ1dHRvbnMuPC9saT4KLTxsaT5BZGQgbnVtYmVyZWQgb3IgYnVsbGV0ZWQgbGlzdHMgdXNpbmcgdGhlIG9yZGVyZWQgPGltZyBzcmM9ImFkZG9yZGxpc3RfY28uZ2lmIiBhbHQ9IiIgLz4gb3IgdW5vcmRlcmVkIGxpc3QgPGltZyBzcmM9ImFkZHVub3JkbGlzdF9jby5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+SW5kZW50IG9yIE91dGRlbnQgdGV4dCB1c2luZyB0aGUgSW5kZW50IDxpbWcgc3JjPSJpbmRlbnQuZ2lmIiBhbHQ9IiIgLz4gb3IgT3V0ZGVudCA8aW1nIHNyYz0ib3V0ZGVudC5naWYiIGFsdD0iIiAvPiBidXR0b25zLjwvbGk+Ci08bGk+RmluZCBhbmQgcmVwbGFjZSB0ZXh0LiBDbGljayB0aGUgRmluZC9SZXBsYWNlIGJ1dHRvbiA8aW1nIHNyYz0iZmluZHJlcGxhY2UuZ2lmIiBhbHQ9IiIgLz4uIFRoZSBGaW5kL1JlcGxhY2UgZGlhbG9nIGJveCBhcHBlYXJzLiBUeXBlIHRoZSB0ZXh0IHlvdQotd2FudCB0byBmaW5kIGluIHRoZSBGaW5kIGZpZWxkIGFuZCwgaWYgeW91IGFyZSByZXBsYWNpbmcgdGhhdCB0ZXh0LCB0eXBlIHRoZQotcmVwbGFjZW1lbnQgdGV4dCBpbiB0aGUgUmVwbGFjZSB3aXRoIGZpZWxkLiBZb3UgY2FuIHNlYXJjaCBmb3J3YXJkIG9yIGJhY2sKLWFuZCBzcGVjaWZ5IHdoZXRoZXIgeW91IHdhbnQgeW91ciBzZWFyY2ggdG8gYmUgY2FzZSBzZW5zaXRpdmUgb3Igc2VhcmNoIGZvcgotb25seSBwYXJ0cyBvZiB3b3Jkcy48L2xpPgotPGxpPkFkZCBvciBjcmVhdGUgaHlwZXJsaW5rcyB1c2luZyB0aGUgQWRkIGxpbmsgYnV0dG9uIDxpbWcgc3JjPSJhZGRsaW5rX2NvLmdpZiIgYWx0PSIiIC8+LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rLmh0bWwjYWRkYXJlZmVyZW5jZW9yaHlwZXJsaW5rIj5BZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rPC9hPi48L2xpPgotPGxpPkFkZCBpbWFnZXMuIENsaWNrIHRoZSBBZGQgSW1hZ2UgYnV0dG9uIDxpbWcgc3JjPSJhZGRpbWdfY28uZ2lmIiBhbHQ9IiIgLz4uIFRoZSBBZGQgSW1hZ2UgZGlhbG9nIGJveCBhcHBlYXJzLiBCcm93c2UgZm9yIHRoZSBpbWFnZSB5b3UnZCBsaWtlCi10byBhZGQgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5PSzwvc3Ryb25nPi48L2xpPgotPGxpPkFkZCB0YWJsZXMuIENsaWNrIHRoZSBBZGQgVGFibGUgYnV0dG9uIDxpbWcgc3JjPSJhZGR0YWJsZV9jby5naWYiIGFsdD0iIiAvPi4gVGhlIEFkZCBUYWJsZSBkaWFsb2cgYm94IGFwcGVhcnMuIFNwZWNpZnkgdGhlIHRhYmxlIHBhcmFtZXRlcnMKLWFuZCB0aGVuIGNsaWNrIDxzdHJvbmc+T0s8L3N0cm9uZz4uPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvYWRtYXAuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3JvYWRtYXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5OWJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2FkbWFwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJSb2FkbWFwIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvYWRtYXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+Um9hZG1hcDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9hZG1hcCI+PGEgbmFtZT0icm9hZG1hcCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvYWRtYXA8L2gxPgotPGRpdj48cD5BIFJvYWRtYXAgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGhvdyBhIHByb2Nlc3MgaXMKLXR5cGljYWxseSBwZXJmb3JtZWQuIE9mdGVuIHByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nCi1hIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoZSBwcm9jZXNzLgotSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZQotcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgcm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0Ci1ob3cgYWN0aXZpdGllcyBhbmQgdGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiA8L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWJkOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlJvbGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJvbGUiPjxhIG5hbWU9InJvbGUiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlPC9oMT4KLTxkaXY+PHA+QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMKLW9mIGFuIGluZGl2aWR1YWwgb3IgaW5kaXZpZHVhbHMuPC9wPgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3JlYXRlYXJvbGUuaHRtbCNjcmVhdGVhcm9sZSI+Q3JlYXRlIGEgUm9sZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YmJjMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUm9sZSBTZXQiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0icm9sZXNldCIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlIFNldDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9sZXNldCI+PGEgbmFtZT0icm9sZXNldCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlJvbGUgU2V0PC9oMT4KLTxkaXY+PHA+QSBSb2xlIFNldCBpcyB1c2VkIHRvIGdyb3VwIDxhIGhyZWY9InJvbGUuaHRtbCNyb2xlIj5Sb2xlczwvYT4gd2l0aAotY2VydGFpbiBjb21tb25hbGl0aWVzIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSwgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwKLWFuIEFuYWx5c3Qgcm9sZSBzZXQgY291bGQgYmUgdXNlZCB0byBncm91cCB0b2dldGhlciByb2xlcyBzdWNoIGFzIEJ1c2luZXNzCi1Qcm9jZXNzIEFuYWx5c3QsIFN5c3RlbSBBbmFseXN0IGFuZCBSZXF1aXJlbWVudHMgU3BlY2lmaWVyLiBFYWNoIG9mIHRoZXNlCi1yb2xlcyB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IG1heSBiZQotcmVzcG9uc2libGUgZm9yIHBlcmZvcm1pbmcgY2VydGFpbiB0YXNrcyBhbmQgY3JlYXRpbmcgY2VydGFpbiB3b3JrIHByb2R1Y3RzLgotUm9sZSBzZXRzIGNhbiBiZSBvcmdhbml6ZWQgdXNpbmcgUm9sZSBTZXQgR3JvdXBpbmdzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPk1ldGhvZCBDb250ZW50IENhdGVnb3JpZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcm9sZXNldGdyb3VwaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Z3JvdXBpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NWZiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9yb2xlc2V0Z3JvdXBpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5UeXBlIiBjb250ZW50PSJjb25jZXB0IiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJvbGUgU2V0IEdyb3VwaW5nIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyb2xlc2V0Lmh0bWwjcm9sZXNldCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0icm9sZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhcm9sZS5odG1sI2NyZWF0ZWFyb2xlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InJvbGVzZXRncm91cGluZyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5Sb2xlIFNldCBHcm91cGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icm9sZXNldGdyb3VwaW5nIj48YSBuYW1lPSJyb2xlc2V0Z3JvdXBpbmciPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Sb2xlIFNldCBHcm91cGluZzwvaDE+Ci08ZGl2PjxwPlJvbGUgc2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byByb2xlIHNldCBncm91cGluZ3MuIEZvciBleGFtcGxlLCBkaWZmZXJlbnQKLW1ldGhvZCBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMgd2hpY2gsIGhvd2V2ZXIsIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZAotZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsCi1mb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIHNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudAotT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InJvbGVzZXQuaHRtbCNyb2xlc2V0Ij5Sb2xlIFNldDwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icm9sZS5odG1sIj5Sb2xlPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNyZWF0ZWFyb2xlLmh0bWwjY3JlYXRlYXJvbGUiPkNyZWF0ZSBhIFJvbGU8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aGNvbnQuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc2VhcmNoZm9ybWV0aGNvbnQuSlBHCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWM1MGRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhjb250LkpQRworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3NlYXJjaGZvcm1ldGhvZGNvbnRlbnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkMjU1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NlYW5kcHJldmlld21ldGhvZGNvbnRlbnQuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzZWFyY2hmb3JtZXRob2Rjb250ZW50IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQiPjxhIG5hbWU9InNlYXJjaGZvcm1ldGhvZGNvbnRlbnQiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZWFyY2ggZm9yIE1ldGhvZCBDb250ZW50PC9oMT4KLTxkaXY+PGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gU2VhcmNoIGZvciBNZXRob2QgQ29udGVudDo8L2Rpdj4KLTxvbD48bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGJlZ2luIHlvdXIgc2VhcmNoIGZvciBtZXRob2QgY29udGVudC48L3NwYW4+PHVsPjxsaT5TZWxlY3QgPHN0cm9uZz5TZWFyY2ggJmd0OyBTZWFyY2g8L3N0cm9uZz48L2xpPgotPGxpPjxzdHJvbmc+U2VhcmNoICZndDsgRmlsZTwvc3Ryb25nPjwvbGk+Ci08bGk+Q2xpY2sgdGhlIFNlYXJjaCBidXR0b24gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+PGltZyBzcmM9InNlYXJjaGZvcm1ldGhjb250LkpQRyIgYWx0PSIiIC8+PC9zcGFuPiBpbiB0aGUgdG9vbCBiYXIuPC9saT4KLTwvdWw+Ci0gVGhlIFNlYXJjaCBkaWFsb2cgd2luZG93IG9wZW5zLjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIGVpdGhlciB0aGUgPHN0cm9uZz5GaWxlIFNlYXJjaDwvc3Ryb25nPiB0YWIgb3IgdGhlIDxzdHJvbmc+TWV0aG9kIFNlYXJjaDwvc3Ryb25nPiB0YWIKLWFuZCB0aGVuIHNldCB5b3VyIGNyaXRlcmlhLiBVc2luZyB0aGUgPHN0cm9uZz5GaWxlIFNlYXJjaDwvc3Ryb25nPiB0YWIsIHlvdSBjYW4gc2VhcmNoCi1mb3IgY29udGVudCBieSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBjb250ZW50LiBVc2luZyB0aGUgPHN0cm9uZz5NZXRob2QgU2VhcmNoPC9zdHJvbmc+IHRhYiwKLXlvdSBjYW4gc2VhcmNoIHRoZSBtZXRob2QgY29udGVudCBpdHNlbGYuPC9zcGFuPjx1bD48bGk+PHN0cm9uZz5Vc2luZyBGaWxlIFNlYXJjaDwvc3Ryb25nPjogVHlwZSBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3Igd2l0aGluCi10aGUgZmlsZXMgKG9wdGlvbmFsKSwgb3IgdHlwZSBhIGZpbGUgbmFtZSBwYXR0ZXJuIHRvIHVzZSBmb3IgbWF0Y2hpbmcgZmlsZQotbmFtZXMuIFlvdSBtdXN0IHVzZSBhIHBhdHRlcm4uIFVzZSAqIGlmIHlvdSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIHRleHQgaW4KLWFsbCBmaWxlcy4gTGVhdmUgYWxsIG90aGVyIG9wdGlvbnMgYXMgZGVmYXVsdC48L2xpPgotPGxpPjxzdHJvbmc+VXNpbmcgTWV0aG9kIFNlYXJjaDwvc3Ryb25nPjogVHlwZSBhIHRleHQgc3RyaW5nIHRvIHNlYXJjaCBmb3Igd2l0aGluCi10aGUgZmlsZXMgKG9wdGlvbmFsKSwgb3IgdHlwZSBhIG5hbWUgcGF0dGVybiBmb3IgbWF0Y2hpbmcgZWxlbWVudCBuYW1lcyBhbmQKLXByZXNlbnRhdGlvbiBuYW1lcy4gWW91IG11c3QgdXNlIGEgcGF0dGVybi4gVXNlICogaWYgeW91IHdhbnQgdG8gc2VhcmNoIGZvcgotdGV4dCBpbiBhbGwgZmlsZXMuIEluIHRoZSBTY29wZSBzZWN0aW9uLCB5b3UgY2FuIHJlc3RyaWN0IHlvdXIgc2VhcmNoIHRvIGEKLXN1YnNldCBvZiBlbGVtZW50IHR5cGVzLjwvbGk+Ci08L3VsPgotPC9saT4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHN0cm9uZz5TZWFyY2g8L3N0cm9uZz4uIFRoZSBTZWFyY2ggVmlldyBvcGVucyB3aXRoIHlvdXIgc2VhcmNoIHJlc3VsdHMuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBTZWFyY2ggVmlldywgeW91IGNhbiBkcmlsbCBkb3duIGludG8gdGhlIHNlYXJjaCByZXN1bHRzCi1hbmQgZG91YmxlLWNsaWNrIGFuIGVsZW1lbnQgdG8gb3BlbiB0aGUgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudC4gSWYKLXlvdSBoYXZlIExpbmsgd2l0aCBFZGl0b3Igc2VsZWN0ZWQgaW4gdGhlIGxpYnJhcnkgdmlldywgdGhlIGxpYnJhcnkgdmlldyBkaXNwbGF5Ci1jaGFuZ2VzIHRvIHNob3cgeW91IHdoZXJlIHRoZSBzZWxlY3RlZCBlbGVtZW50IGlzIGluIHRoZSBsaWJyYXJ5Ljwvc3Bhbj48L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCIgdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiI+VG9vbCBJbnRlcmZhY2U8L2E+PC9kaXY+Ci08ZGl2IGNsYXNzPSJwcmV2aW91c2xpbmsiPjxzdHJvbmc+UHJldmlvdXMgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Lmh0bWwjY3JlYXRpbmdyZXVzYWJsZW1ldGhvZGNvbnRlbnRzIj5NZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliYWVhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgbWV0aG9kIHBsdWctaW5zIGFuZCBtZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gQWxsIG1ldGhvZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgbWV0aG9kIGxpYnJhcnkuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIG1ldGhvZCBwbHVnLWlucyBhbmQgbWV0aG9kIGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuIEFsbCBtZXRob2QgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIG1ldGhvZCBsaWJyYXJ5LiIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5TdGFuZGFyZCBNZXRob2QgTGlicmFyeSBPdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXciPjxhIG5hbWU9InN0YW5kYXJkbWV0aG9kbGlicmFyeW92ZXJ2aWV3Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3RhbmRhcmQgTWV0aG9kIExpYnJhcnkgT3ZlcnZpZXc8L2gxPgotPGRpdj48cD5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBtZXRob2QgcGx1Zy1pbnMgYW5kCi1tZXRob2QgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gQWxsIG1ldGhvZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgbWV0aG9kCi1saWJyYXJ5LjwvcD4KLTxwPk11Y2ggbGlrZSBhIGxpYnJhcnkgaGFzIGJvb2tzLCBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBtZXRob2QgcGx1Zy1pbnMuIFdoZXJlCi1hIGxpYnJhcnkgYm9vayBpcyBtYWRlIHVwIG9mIHNlY3Rpb25zIG9yIGNoYXB0ZXJzIGFuZCBjb250ZW50IHdpdGhpbiB0aG9zZQotY2hhcHRlcnMsIDxhIGhyZWY9Im1ldGhvZHBsdWdpbi5odG1sI21ldGhvZHBsdWdpbiI+bWV0aG9kCi1wbHVnLWluczwvYT4gYXJlIG1hZGUgdXAgb2YgPGEgaHJlZj0ibWV0aG9kY29udGVudC5odG1sI2NyZWF0aW5ncmV1c2FibGVtZXRob2Rjb250ZW50cyI+bWV0aG9kIGNvbnRlbnQ8L2E+IGFuZCBwcm9jZXNzZXMuIE1ldGhvZCBjb250ZW50IGNvbnRhaW5zCi1jb250ZW50IHBhY2thZ2VzIGFuZCBib3RoIDxhIGhyZWY9Im1ldGhvZGNvbnRlbnRjYXRlZ29yaWVzLmh0bWwjbWV0aG9kY29udGVudGNhdGVnb3JpZXMiPnN0YW5kYXJkIGFuZCBjdXN0b20gY2F0ZWdvcmllczwvYT4sIHdoaWxlIHByb2Nlc3NlcyBzdHJ1Y3R1cmUKLXRoaXMgY29udGVudCBpbnRvIHByb2Nlc3MgZnJhZ21lbnRzIGNhbGxlZCA8YSBocmVmPSJjYXBhYmlsaXR5cGF0dGVybi5odG1sI2NhcGFiaWxpdHlwYXR0ZXJuIj5jYXBhYmlsaXR5IHBhdHRlcm5zPC9hPiBhbmQgZnVsbCBsaWZlY3ljbGUgcHJvY2Vzc2VzIGNhbGxlZCA8YSBocmVmPSJkZWxpdmVyeXByb2Nlc3MuaHRtbCI+ZGVsaXZlcnkgcHJvY2Vzc2VzPC9hPi48L3A+Ci08cD5BIG1ldGhvZCBsaWJyYXJ5IGFsc28gaGFzIG9uZSBvciBtb3JlIDxhIGhyZWY9Im1ldGhvZGNvbmZpZ3VyYXRpb25zLmh0bWwjbWV0aG9kY29uZmlndXJhdGlvbnMiPm1ldGhvZCBjb25maWd1cmF0aW9uczwvYT4gdGhhdCBmaWx0ZXIgdGhlIGxpYnJhcnkgYW5kIHByb3ZpZGUKLXNtYWxsZXIgd29ya2luZyBzZXRzIG9mIGxpYnJhcnkgY29udGVudCBmb3IgdGhlIGVuZCB1c2VyLjwvcD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0ZXAuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N0ZXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlZDBhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGVwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdGVwIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InN0ZXAiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3RlcDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3RlcCI+PGEgbmFtZT0ic3RlcCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlN0ZXA8L2gxPgotPGRpdj48cD5BIFN0ZXAgaXMgYSBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIHRhc2suIFRoZSBjb2xsZWN0aW9uCi1vZiBzdGVwcyBkZWZpbmVkIGZvciBhIHRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0bwotYWNoaWV2ZSB0aGUgb3ZlcmFsbCBnb2FsIG9mIHRoZSB0YXNrLiBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQKLWVhY2ggdGltZSBhIHRhc2sgaXMgaW52b2tlZCBpbiBhIHByb2Nlc3MuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1YnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMzNjODMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3Vic2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cGVyc2NyaXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cGVyc2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2NzVjYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBlcnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdXBwb3J0aW5nbWF0ZXJpYWwuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM2ZDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3N1cHBvcnRpbmdtYXRlcmlhbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU3VwcG9ydGluZyBNYXRlcmlhbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJzdXBwb3J0aW5nbWF0ZXJpYWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+U3VwcG9ydGluZyBNYXRlcmlhbDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0ic3VwcG9ydGluZ21hdGVyaWFsIj48YSBuYW1lPSJzdXBwb3J0aW5nbWF0ZXJpYWwiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9oMT4KLTxkaXY+PHA+U3VwcG9ydGluZyBNYXRlcmlhbCBpcyBhIGNhdGNoLWFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2UKLW5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBjb250ZW50Ci1lbGVtZW50cywgaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rhc2suaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rhc2suaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1NTc3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90YXNrLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUYXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGFzayIgLz4KLTxtZXRhIG5hbWU9IkRDLkxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIgLz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi9pYm1kaXRhLmNzcyIgLz4KLTx0aXRsZT5UYXNrPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YXNrIj48YSBuYW1lPSJ0YXNrIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VGFzazwvaDE+Ci08ZGl2PjxwPkEgVGFzayBpcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBhIHNwZWNpZmljCi1Sb2xlLiBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzIGFuZAotdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgdW1iZXIgb2YgV29yayBQcm9kdWN0cy48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhdGFzay5odG1sI2NyZWF0ZWF0YXNrIj5DcmVhdGUgYSBUYXNrPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjcmVhdGVtZXRob2Rjb250ZW50Lmh0bWwiPkNyZWF0ZSBNZXRob2QgQ29udGVudDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdGVtcGxhdGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NzExMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZW1wbGF0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVGVtcGxhdGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGVtcGxhdGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGVtcGxhdGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlbXBsYXRlIj48YSBuYW1lPSJ0ZW1wbGF0ZSI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRlbXBsYXRlPC9oMT4KLTxkaXY+PHA+QSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHdvcmsgcHJvZHVjdAotd2l0aCBhIHByZWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLAotYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIHNlY3Rpb25zCi1hbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbiBiZSBwcm92aWRlZAotZm9yIGRvY3VtZW50cyBhcyB3ZWxsIGFzIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90ZXJtZGVmaW5pdGlvbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVhMzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rlcm1kZWZpbml0aW9uLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUZXJtIERlZmluaXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idGVybWRlZmluaXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VGVybSBEZWZpbml0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZXJtZGVmaW5pdGlvbiI+PGEgbmFtZT0idGVybWRlZmluaXRpb24iPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5UZXJtIERlZmluaXRpb248L2gxPgotPGRpdj48cD5UZXJtIGRlZmluaXRpb25zIGRlZmluZXMgYSBzcGVjaWZpYyB0ZXJtLCBjb25jZXB0LCBvciBvdGhlciBpZGVhIHJlbGV2YW50Ci10byBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudC4gQSB0ZXJtIGRlZmluaXRpb24gaXMgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8KLWFueSBjb250ZW50IGVsZW1lbnRzLCBidXQgcmVsYXRpb25zaGlwcyBhcmUgZGVyaXZlZCB3aGVuIHRoZSB0ZXJtIGlzIHVzZWQKLWluIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGluIGEgY29udGVudCBlbGVtZW50LjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Imd1aWRhbmNlLmh0bWwjZ3VpZGFuY2UiPkd1aWRhbmNlPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rvb2xtZW50b3IuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Rvb2xtZW50b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEzZWY0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90b29sbWVudG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJUb29sIE1lbnRvciIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iZ3VpZGFuY2UuaHRtbCNndWlkYW5jZSIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ0b29sbWVudG9yIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRvb2wgTWVudG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0b29sbWVudG9yIj48YSBuYW1lPSJ0b29sbWVudG9yIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VG9vbCBNZW50b3I8L2gxPgotPGRpdj48cD5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYwotdG9vbCB0byBhY2NvbXBsaXNoIGEgcGllY2Ugb2Ygd29yay48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjkzMGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEV4cGxvcmUgdGhlIFVzZXIgSW50ZXJmYWNlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCB0aGUgbWFqb3IgcGFydHMgb2YgdGhlIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgdXNlciBpbnRlcmZhY2UuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCBwZXJzcGVjdGl2ZS4gVGhlIGN1cnJlbnQgcGVyc3BlY3RpdmUgaXMgZGlzcGxheWVkIG5lYXIgdGhlIHRvcCByaWdodCBvZiB0aGUgc2NyZWVuLiBZb3Ugd2lsbCBzZWUgZWl0aGVyIEF1dGhvcmluZyBvciBCcm93c2luZy4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+T3BlbiBQZXJzcGVjdGl2ZTwvc3Ryb25nPiBpY29uLCBhbmQgc2VsZWN0IHRoZSBvdGhlciBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RXhwbG9yZSB0aGUgPHN0cm9uZz5MaWJyYXJ5PC9zdHJvbmc+IDxzdHJvbmc+Vmlldzwvc3Ryb25nPi4gVGhlIGxpYnJhcnkgdmlldyBpcyBhdmFpbGFibGUgaW4gYXV0aG9yaW5nIHBlcnNwZWN0aXZlIJYgaXQgaXMgbm90IHNob3duIGluIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZS4gVGhlIExpYnJhcnkgVmlldyBzaG93cyB5b3UgYWxsIHRoZSBjb250ZW50IGluIHRoZSBjdXJyZW50IGxpYnJhcnkuIFRoZSBoaWdoZXN0IGxldmVsIGNvbnRlbnQgdW5pdCBpcyBhIHBsdWdpbi4gQ2xpY2sgb24gc29tZSA8c3Ryb25nPis8L3N0cm9uZz4gc2lnbnMgYW5kIGV4cGxvcmUgdGhlIGNvbnRlbnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkRyaWxsIGRvd24gaW50byBhIHBsdWdpbiBhcyBmb2xsb3dzOiA8c3Ryb25nPk1ldGhvZCBDb250ZW50ICZndDsgQ29udGVudCBQYWNrYWdlcyAmZ3Q7IFthbnldICZndDsgVGFza3M8L3N0cm9uZz4uIERvdWJsZSBjbGljayBvbiBhIHRhc2suIFRoZSBUYXNrIEVkaXRvciBpcyBkaXNwbGF5ZWQgb24gdGhlIHJpZ2h0IG9mIHRoZSBzY3JlZW4uIFRoZXJlIGFyZSBzZXBhcmF0ZSBlZGl0b3JzIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGNvbnRlbnQgdGhhdCB5b3UgY2FuIGNyZWF0ZSBpbiBhIGxpYnJhcnkuIEVhY2ggZWRpdG9yIGhhcyBhIHNlcmllcyBvZiB0YWJzIGFuZCBhIG51bWJlciBvZiBmb3JtIGVsZW1lbnRzIG9uIGVhY2ggdGFiLiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlc2UgaW4gdGhlIDx1PkNyZWF0ZSBNZXRob2QgQ29udGVudCA8L3U+dHV0b3JpYWwuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gQSBwcmV2aWV3IG9mIGFuIEhUTUwgcGFnZSBpcyBkaXNwbGF5ZWQuIFRoaXMgaXMgd2hhdCB0aGUgc2VsZWN0ZWQgZWxlbWVudCB3aWxsIGxvb2sgbGlrZSBpbiBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPmJyb3dzaW5nIHBlcnNwZWN0aXZlPC9zdHJvbmc+LiBUaGUgQ29uZmlndXJhdGlvbiBWaWV3IGlzIG5vdyBkaXNwbGF5ZWQuIFRoZSBjb25maWd1cmF0aW9uIHZpZXcgYWx3YXlzIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYnV0IHRoZSBjb250ZW50IGNoYW5nZXMgYmFzZWQgb24gd2hpY2ggY29uZmlndXJhdGlvbiBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIERyaWxsIGRvd24gaW50byB0aGUgRGlzY2lwbGluZXMgZm9sZGVyIHVudGlsIHlvdSBnZXQgdG8gdGFza3MgYW5kIGNsaWNrIG9uIGEgdGFzay4gVGhlIEhUTUwgcHJldmlldyBvZiB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBzaG93biBvbiB0aGUgcmlnaHQgb2YgdGhlIHNjcmVlbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIGNvbmZpZ3VyYXRpb25zLiBUaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIGRpc3BsYXllZCBpbiB0aGUgc2VsZWN0aW9uIGJveCBiZWxvdyB0aGUgbWFpbiBtZW51IGJhci4gU2VsZWN0IGEgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkcm9wIGRvd24gbGlzdC4gWW91IHdpbGwgc2VlIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgcmVmcmVzaCB3aGVuIHlvdSBkbyB0aGlzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+YXV0aG9yaW5nPC9zdHJvbmc+IDxzdHJvbmc+cGVyc3BlY3RpdmU8L3N0cm9uZz4uIERyaWxsIGRvd24gaW50byBhIHBsdWdpbiBhcyBmb2xsb3dzOiA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBbYW55XSAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnM8L3N0cm9uZz4uIE5vdGUgdGhhdCBub3QgYWxsIHBsdWdpbnMgaGF2ZSBjYXBhYmlsaXR5IHBhdHRlcm5zLiBEb3VibGUtY2xpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4uIFRoZSByaWdodCBzaWRlIG9mIHRoZSBzY3JlZW4gaXMgbm93IGZpbGxlZCB3aXRoIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gZWRpdG9yIGFuZCB0aGUgUHJvcGVydGllcyBWaWV3LiBZb3UgY2FuIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlc2UgaW4gdGhlIDx1Pldvcmtpbmcgd2l0aCBQcm9jZXNzZXM8L3U+IHR1dG9yaWFsLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3YTkyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAyOiBCcm93c2UgTWV0aG9kIENvbnRlbnQgdmlhIEJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBtZXRob2QgY29udGVudCBpbiBhIGxpYnJhcnkgdXNpbmcgdGhlIGJyb3dzaW5nIHBlcnNwZWN0aXZlLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgPHN0cm9uZz5SVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGRyb3AtZG93biBsaXN0IGxvY2F0ZWQgdW5kZXJuZWF0aCB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2VsZWN0IDxzdHJvbmc+QnJvd3NpbmcgcGVyc3BlY3RpdmU8L3N0cm9uZz4uIFRoZSBDb25maWd1cmF0aW9uIFZpZXcgYXBwZWFycyBvbiB0aGUgbGVmdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+VG8gdmlldyBhIFRhc2ssIGNsaWNrIDxzdHJvbmc+RGlzY2lwbGluZXMgJmd0OyBSVVAgRGlzY2lwbGluZXMgJmd0OyBBbmFseXNpcyAmYW1wOyBEZXNpZ24gJmd0OyBEZXNpZ24gdGhlIFVzZXIgSW50ZXJmYWNlPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQgaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmltYXJ5IFBlcmZvcm1lciA8L3N0cm9uZz5saW5rIGluIHRoZSByZWxhdGlvbnNoaXBzIHNlY3Rpb24uIFRoaXMgd2lsbCBzaG93IHRoZSBwcmV2aWV3IHBhZ2UgZm9yIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+WW91IGNhbiBjbGljayBvbiBhbnkgbGlua3MgaW4gdGhlIHByZXZpZXcgYW5kIHVzZSB0aGUgYmFjayBpY29uIGluIHRoZSBwcmV2aWV3IHRvb2xiYXIgdG8gcmV0dXJuIHRvIHByZXZpb3VzIHBhZ2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5WaWV3IG90aGVyIGVsZW1lbnRzIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgdHJlZSCWIGUuZy4gdW5kZXIgRG9tYWlucywgUm9sZSBTZXRzLCBldGMuIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzMuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTFhODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMzogQnJvd3NlIFByb2Nlc3MgQ29udGVudCB2aWEgQnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBwcm9jZXNzIGNvbnRlbnQgaW4gYSBsaWJyYXJ5IHVzaW5nIHRoZSBicm93c2luZyBwZXJzcGVjdGl2ZSA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRvIHZpZXcgYSBDYXBhYmlsaXR5IFBhdHRlcm4sIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBBbmFseXNpcyBhbmQgRGVzaWduPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIENhcGFiaWxpdHkgUGF0dGVybiBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvbnRhaW5zIGEgbGFyZ2UgYW1vdW50IG9mIGluZm9ybWF0aW9uIGFuZCBpcyBkaXNwbGF5ZWQgb3ZlciBmb3VyIHRhYnMgliBEZXNjcmlwdGlvbiwgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgVXNhZ2UgYW5kIFRlYW0gQWxsb2NhdGlvbi4gRXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gb24gZWFjaCB0YWIuIAotICAgIDxwPk5vdGUgdGhhdCB3aGVuIHlvdSBjbGljayBvbiBhIHRhc2sgaW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSB0YWIgeW91IHByZXZpZXcgYSCRVGFzayBEZXNjcmlwdG9yJy4gQSBUYXNrIERlc2NyaXB0b3IgaXMgYSB0YXNrIHdpdGhpbiBhIHByb2Nlc3MuIFRoZSB0YXNrIGRlc2NyaXB0b3IgcGFnZSBoYXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhc2sgYXMgaXQgaXMgdXNlZCBhdCBhIHNwZWNpZmljIHBvaW50IGluIGEgcHJvY2Vzcy4gVGhlIHRhc2sgZGVzY3JpcHRvciBoYXMgYSBsaW5rIHRvIHRoZSBUYXNrIG9uIHdoaWNoIGl0IGlzIGJhc2VkLiA8L3A+Ci0gICAgPHA+Q2xpY2tpbmcgb24gYSByb2xlIG9yIHdvcmsgcHJvZHVjdCBpbiBhIHRhc2sgZGVzY3JpcHRvciB0YWtlcyB5b3UgdG8gYSBSb2xlIERlc2NyaXB0b3Igb3IgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvci4gVGhlc2UgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcm9sZSBvciB3b3JrIHByb2R1Y3QgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIHByb2Nlc3MgYW5kIGFsc28gcHJvdmlkZSBsaW5rcyBiYWNrIHRvIHRoZSBjb3JlIG1ldGhvZCBlbGVtZW50IG9uIHdoaWNoIHRoZXkgYXJlIGJhc2VkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyB2aWV3IGEgRGVsaXZlcnkgUHJvY2VzcywgY2xpY2sgPHN0cm9uZz5Qcm9jZXNzZXMgJmd0OyBEZWxpdmVyeSBQcm9jZXNzZXMgJmd0OyBDbGFzc2ljIFJVUCBMaWZlY3ljbGU8L3N0cm9uZz4uIFRoZSBkaXNwbGF5IGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgc2ltaWxhciB0byBhIENhcGFiaWxpdHkgUGF0dGVybi4gPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNmY0NWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogQnJvd3NlIE1ldGhvZCBDb250ZW50IHZpYSBBdXRob3JpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD4gVGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBiZWNvbWUgZmFtaWxpYXIgd2l0aCBicm93c2luZyBsaWJyYXJ5IGNvbnRlbnQgd2hpbGUgaW4gdGhlIGF1dGhvcmluZyBwZXJzcGVjdGl2ZS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIEF1dGhvcmluZyBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgbmF2aWdhdGUgdG8gPHN0cm9uZz5SVVAgJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXMgJmd0OyBEZXNpZ24gJmd0OyBHVUkgRGVzaWduICZndDsgUm9sZTwvc3Ryb25nPnMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlNlbGVjdCBhIHJvbGUgKGRvdWJsZSBjbGljaykgYW5kIHVzZSB0aGUgcHJldmlldyB0YWIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcm9sZSB3aW5kb3cgdG8gdmlldyB0aGUgaHRtbCByZXByZXNlbnRhdGlvbiBvZiB0aGF0IHJvbGUgYW5kIGl0cyByZWxhdGlvbnNoaXBzIHRvIG90aGVyIG1ldGhvZCBlbGVtZW50cy4gVmlldyB0aGUgb3RoZXIgdGFicyB0byBzZWUgdGhlIGluZm9ybWF0aW9uIHByZXNlbnRlZCB3aGVuIGF1dGhvcmluZyB0aGUgbWV0aG9kIGNvbnRlbnQgYW5kIHJlbGF0aW9uc2hpcHMgZm9yIGEgcm9sZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+UmVwZWF0IHN0ZXAgMyB0byBwcmV2aWV3IGEgPHN0cm9uZz50YXNrPC9zdHJvbmc+ICwgPHN0cm9uZz53b3JrIHByb2R1Y3Q8L3N0cm9uZz4sIGFuZCA8c3Ryb25nPmd1aWRhbmNlIGVsZW1lbnQ8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2V4XzUuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNDUxYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzFfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNTogU2VhcmNoIGZvciBNZXRob2QgQ29udGVudCA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gYmVjb21lIGZhbWlsaWFyIHdpdGggdGhlIHNlYXJjaCBmdW5jdGlvbiBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPk9wZW4gdXAgdGhlIFNlYXJjaCBkaWFsb2cgYnkgOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQ2xpY2tpbmcgb24gdGhlIEZsYXNobGlnaHQgaWNvbiBpbiB0aGUgdG9vbGJhciA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgPHA+PHN0cm9uZz5PciA8L3N0cm9uZz48L3A+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBTZWxlY3RpbmcgPHN0cm9uZz5TZWFyY2ggLyBTZWFyY2g8L3N0cm9uZz4gaW4gdGhlIG1haW4gbWVudS4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5NZXRob2QgU2VhcmNoPC9zdHJvbmc+IHRhYi4gRW50ZXIgPHNwYW4gY2xhc3M9InN0eWxlMSI+RGF0YWJhc2U8L3NwYW4+IGluIHRoZSB0ZXh0IGJveCBhbmQgY2xpY2sgb24gPHN0cm9uZz5TZWFyY2g8L3N0cm9uZz4uIEl0IHdpbGwgdGFrZSBhIGZldyBzZWNvbmRzIHRvIGZpbmQgYWxsIHRoZSBoaXRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5EcmlsbCBkb3duIGluIHRoZSBzZWFyY2ggcmVzdWx0cyBhbmQgZG91YmxlLWNsaWNrIG9uIGFuIGVsZW1lbnQuIFRoZSBlZGl0b3IgZm9yIHRoZSBzZWxlY3RlZCBpdGVtIGlzIG9wZW5lZC4gSWYgeW91IGhhdmUgPHN0cm9uZz5MaW5rIHdpdGggRWRpdG9yPC9zdHJvbmc+IHNlbGVjdGVkIGluIHRoZSBsaWJyYXJ5IHZpZXcsIHRoZSBsaWJyYXJ5IHZpZXcgZGlzcGxheSBjaGFuZ2VzIHRvIHNob3cgeW91IHdoZXJlIHRoZSBzZWxlY3RlZCBpdGVtIGlzIGluIHRoZSBsaWJyYXJ5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBzZWFyY2ggZGlhbG9nIGFnYWluIGFuZCByZXBlYXQgdGhlIHNhbWUgc2VhcmNoIGJ1dCB0aGlzIHRpbWUgcmVkdWNlIHRoZSBzY29wZSB0byBqdXN0IGxvb2sgZm9yIHRhc2tzLiBVbmNoZWNrIGFsbCB0aGUgb3RoZXIgY29udGVudCB0eXBlcyBpbiB0aGUgc2NvcGUgcGFuZWwuIFRoZSBzZWFyY2ggc2hvdWxkIGJlIHF1aWNrZXIgYW5kIHJlc3VsdCBpbiBmZXdlciBoaXRzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBzZWFyY2ggZGlhbG9nIGFnYWluIGFuZCByZXBlYXQgdGhlIHNhbWUgc2VhcmNoIGJ1dCB0aGlzIHRpbWUgYWRkIDxzdHJvbmc+cnVwXyo8L3N0cm9uZz4gYXMgYSBmaWxlIG5hbWUgcGF0dGVybi4gTWFrZSBzdXJlIHRoZSBzY29wZSBpcyBzdGlsbCBzZXQgdG8gdGFza3MuIFRoZSBzZWFyY2ggc2hvdWxkIGJlIGV2ZW4gcXVpY2tlciBhbmQgcmVzdWx0IGluIGV2ZW4gZmV3ZXIgaGl0cy4gPC9wPgotICA8L2xpPgotICA8bGk+RXhwZXJpbWVudCB3aXRoIG90aGVyIE1ldGhvZCBTZWFyY2hlcy48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2ludHJvLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8xX2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhMmRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMV9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+VHV0b3JpYWw6IAotCi0KLSBOYXZpZ2F0ZSB0aGUgVXNlciBJbnRlcmZhY2UKLQotPC9hPjwvaDE+Ci08aDI+PGE+SW50cm9kdWN0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyB0dXRvcmlhbCBpcyB0byBnZXQgZmFtaWxpYXIgd2l0aCB1c2VyIGludGVyZmFjZSBhbmQgdGhlIHdheSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudCBpcyBzdG9yZWQgYW5kIHZpZXdlZC4gPC9wPgotPHA+QSBNZXRob2QgTGlicmFyeSBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiA8c3Ryb25nPjxlbT5tZXRob2QgcGx1Zy1pbnMuIDwvZW0+PC9zdHJvbmc+V2l0aGluIGEgcGx1Z2luLCBjb250ZW50IGlzIHNlcGFyYXRlZCBpbnRvIDxzdHJvbmc+PGVtPk1ldGhvZCBDb250ZW50IDwvZW0+PC9zdHJvbmc+ICh0YXNrcywgcm9sZXMsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlKSBhbmQgPHN0cm9uZz48ZW0+UHJvY2Vzc2VzIDwvZW0+PC9zdHJvbmc+IChjYXBhYmlsaXR5IHBhdHRlcm5zIGFuZCBkZWxpdmVyeSBwcm9jZXNzZXMpLiBUaGlzIGlzIGhvdyB0aGUgTGlicmFyeSBWaWV3LCB3aGljaCBzaG93cyBhbGwgdGhlIGNvbnRlbnQgaW4gdGhlIGxpYnJhcnkgaXMgb3JnYW5pemVkLiA8L3A+Ci08cD5BIGNvbmZpZ3VyYXRpb24gaXMgYSBzdWJzZXQgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQuIFRoZSBDb25maWd1cmF0aW9uIFZpZXcgc2hvd3MgdGhlIGNvbnRlbnQgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiBPbmNlIGEgY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZCwgdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBpcyByZWZyZXNoZWQgd2l0aCB0aGUgY29udGVudCBmcm9tIHRoZSBjb25maWd1cmF0aW9uLiBUaGUgY29udGVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2aWV3IGlzIGFsd2F5cyBsYWlkIG91dCB1c2luZyB0aGUgc2FtZSBzZXQgb2YgZm9sZGVycyByZWdhcmRsZXNzIG9mIHdoaWNoIGNvbmZpZ3VyYXRpb24gaXMgc2VsZWN0ZWQuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBoYXMgdHdvIJFwZXJzcGVjdGl2ZXMnLiBUaGUgQXV0aG9yaW5nIFBlcnNwZWN0aXZlIHByb3ZpZGVzIGZ1bGwgYnJvd3NpbmcgYW5kIGF1dGhvcmluZyBjYXBhYmlsaXRpZXMuIFRoZSBCcm93c2luZyBQZXJzcGVjdGl2ZSBhbGxvd3MgYnJvd3NpbmcgY29udGVudCBpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIDwvcD4KLTxwPkNvbnRlbnQgaXMgY3JlYXRlZCBhbmQgbWFpbnRhaW5lZCB1c2luZyBhIHNlcmllcyBvZiA8c3Ryb25nPjxlbT5lZGl0b3JzLiA8L2VtPjwvc3Ryb25nPjwvcD4KLTxoMj4mbmJzcDs8L2gyPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8xLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ0MWM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8xLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMTogQ3JlYXRlIG9yIE1vZGlmeSBhIE1ldGhvZCBDb250ZW50IFBhY2thZ2UgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHRhc2sgaXMgdG8gY3JlYXRlIGEgbmV3IDxzdHJvbmc+Q29udGVudCBQYWNrYWdlIDwvc3Ryb25nPiB3aXRoaW4gYSA8c3Ryb25nPk1ldGhvZCBQbHVnLWluPC9zdHJvbmc+LiA8L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgTWV0aG9kIFBsdWctaW46IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBNYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayA8c3Ryb25nPkZpbGUgJmd0OyBOZXcgJmd0OyBNZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gCi0gICAgPHA+T3IgPC9wPgotICAgIDxwPlJpZ2h0LWNsaWNrIGFuIGV4aXN0aW5nIFBsdWctaW4gYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBNZXRob2QgUGx1Zy1pbjwvc3Ryb25nPi4gPGJyPgotICBUaGUgTmV3IE1ldGhvZCBQbHVnLWluIHdpemFyZCBpcyBsYXVuY2hlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIE5ldyBNZXRob2QgUGx1Zy1pbiB3aXphcmQsIHByb3ZpZGUgYSBuYW1lIGZvciB0aGUgbmV3IHBsdWctaW4uIEluIHRoaXMgaW5zdGFuY2UsIHdlJ2xsIGNhbGwgaXQgTXkgUGx1Z2luLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgPHN0cm9uZz5SVVAgPC9zdHJvbmc+IGluIHRoZSBSZWZlcmVuY2VkIFBsdWctaW5zIHBhbmVsLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi4gVGhpcyBtZWFucyB0aGF0IHlvdXIgcGx1Zy1pbiB3aWxsIGV4dGVuZCB0aGUgUlVQIHBsdWctaW4gYW5kIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VsZWN0IGNvbnRlbnQgZnJvbSB0aGUgUlVQIHBsdWctaW4gYXMgeW91IGNyZWF0ZSB5b3VyIG93biBwbHVnLWluIGNvbnRlbnQuIDxicj4KLSAgICAgIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFBsdWdpbjwvc3Bhbj4gbm93IGFwcGVhcnMgaW4gdGhlIExpYnJhcnkgVmlldyBvbiB0aGUgbGVmdCBzaWRlIG9mIHlvdXIgc2NyZWVuLiBJdCBpcyBub3QgZ3JheWVkIG91dCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgbm90IGxvY2tlZCBhbmQgdGhhdCB5b3UgY2FuIGVkaXQgaXQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkRvdWJsZSBjbGljayBvbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBQbHVnaW48L3NwYW4+IHRvIG9wZW4gdGhlIFBsdWdpbiBlZGl0b3IuIEFib3V0IGhhbGZ3YXkgZG93biB0aGUgcGFnZSB5b3Ugd2lsbCBzZWUgdGhlIJFMb2NrIFBsdWdpbicgY2hlY2tib3guIFRoaXMgd2lsbCBiZSB1bmNoZWNrZWQgZm9yIHlvdXIgbmV3IHBsdWdpbi4gSWYgeW91IG9wZW4gdGhlIHBsdWdpbiBlZGl0b3IgZm9yIHRoZSBSVVAgcGx1Z2luIHRoaXMgZmllbGQgd2lsbCBiZSBjaGVja2VkLiA8L2xpPgotPC9vbD4KLTxwPlRvIGNyZWF0ZSBhIE1ldGhvZCBQYWNrYWdlOiA8L3A+Ci08b2wgc3RhcnQ9IjYiPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgY2xpY2sgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uICA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5SaWdodC1jbGljayA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBIaWdobGlnaHQgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db250ZW50IFBhY2thZ2U8L3N0cm9uZz4gdG8gY3JlYXRlIGEgbmV3IENvbnRlbnQgUGFja2FnZS4gPGJyPgotICAgICAgVGhlIENvbnRlbnQgUGFja2FnZSBlZGl0b3IgaXMgZGlzcGxheWVkIGFuZCB5b3UgY2FuIG5hbWUgdGhlIHBhY2thZ2UgYW5kIHByb3ZpZGUgYSBCcmllZiBEZXNjcmlwdGlvbi4gV2UnbGwgY2FsbCBpdCCTTXkgQ29udGVudCBQYWNrYWdllC4gPGJyPgotICAgICAgPHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gWW91IGNhbm5vdCBjcmVhdGUgYSBuZXcgQ29udGVudCBQYWNrYWdlIG9yIGFueSBvdGhlciBlbGVtZW50IGluIGEgbG9ja2VkIHBsdWdpbi4gPC9wPgotICA8L2xpPgotICA8bGk+U2F2ZSB5b3VyIG5ldyBjb250ZW50LiA8L2xpPgotPC9vbD4KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFdoZW4geW91IGNyZWF0ZSBhIG5ldyBlbGVtZW50IG9yIG1vZGlmeSBhbiBleGlzdGluZyBlbGVtZW50LCBhIJEqJyBhcHBlYXJzIGluIHRoZSB0YWIgbmV4dCB0byB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCwgaW5kaWNhdGluZyB0aGF0IHRoZSBlbGVtZW50IG5lZWRzIHRvIGJlIHNhdmVkLiBBbiBlbGVtZW50IGNhbiBiZSBzYXZlZCBieSBjbG9zaW5nIHRoZSBlZGl0b3IsIGNsaWNraW5nIHRoZSBkaXNrIGljb24gaW4gdGhlIHRvb2xiYXIsIG9yIGNsaWNraW5nIDxzdHJvbmc+RmlsZSAmZ3Q7IFNhdmUgPC9zdHJvbmc+LiA8L3A+Ci08cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBFUEYgQ29tcG9zZXIgYXV0b21hdGljYWxseSBjcmVhdGVzIG5vZGVzIGZvciB0YXNrcywgcm9sZXMsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlIHVuZGVyIHRoZSBuZXcgY29udGVudCBwYWNrYWdlLiA8L3A+Ci08aDE+Jm5ic3A7PC9oMT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8yLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWY0NTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAyOiBDcmVhdGUgV29yayBQcm9kdWN0PC9hPnMgPC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIG5ldyBtZXRob2QgY29udGVudC4gU3BlY2lmaWNhbGx5LCA8c3Ryb25nPldvcmsgUHJvZHVjdHMgPC9zdHJvbmc+b2YgdHlwZSA8c3Ryb25nPiBBcnRpZmFjdCA8L3N0cm9uZz4uIFlvdSBjYW4gY3JlYXRlIGFueSBjb250ZW50IGJ1dCBzb21lIGV4YW1wbGVzIGFyZSBwcm92aWRlZCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlbS4gVGhlc2UgZXhhbXBsZXMgYXJlIHJlZmVycmVkIHRvIGluIG90aGVyIHR1dG9yaWFscy4gPC9wPgotPHA+TWV0aG9kIGFuZCBQcm9jZXNzIGVsZW1lbnRzIGhhdmUgdHdvIG5hbWVzIGluIEVQRiBDb21wb3NlcjogTmFtZSBhbmQgUHJlc2VudGF0aW9uIE5hbWUuIDwvcD4KLTxwPlRoZSBOYW1lIGZpZWxkIGlzIHVzZWQgYXMgdGhlIGZpbGUgbmFtZSBmb3IgdGhlIGl0ZW0uIEluIFJVUCwgd2UgYXJlIGNhcmVmdWwgaG93IHdlIG5hbWUgdGhlIGZpbGVzIGFuZCB1c2UgY29udmVudGlvbnMgc3VjaCBhcyBsb3dlciBjYXNlLCBubyBzcGFjZXMsIGFuZCBubyBzcGVjaWFsIGNoYXJhY3RlcnMuIFdlIGRvIHRoaXMgc28gdGhhdCB0aGUgbmFtZSBpcyBhIHZhbGlkIGZpbGUgbmFtZSBvbiBhbGwgb3BlcmF0aW5nIHN5c3RlbXMgYW5kIGZvciBpbnRlZ3JhdGlvbiB3aXRoIHNvdXJjZSBjb250cm9sIHNvZnR3YXJlIGluIHRoZSBmdXR1cmUuIFRoZSBOYW1lIGlzIHNob3duIGluIHRoZSBMaWJyYXJ5IFZpZXcuIDwvcD4KLTxwPlRoZSBQcmVzZW50YXRpb24gTmFtZSBpcyB0aGUgbmFtZSB0aGF0IGlzIHNob3duIG9uIHB1Ymxpc2hlZCBwYWdlcyBhbmQgaXQgaXMgYWxzbyBzaG93biBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LiBUaGlzIG5hbWUgY2FuIGNvbnRhaW4gYW55IGNoYXJhY3RlcnMsIGJ1dCBieSBjb252ZW50aW9uIGluIFJVUCwgd2UgdXNlIHRoZSBzYW1lIHRleHQgYXMgdGhlIE5hbWUsIGp1c3QgcHJldHRpZXIuIDwvcD4KLTxwPkluIHRoZSBMaWJyYXJ5IHZpZXcgeW91IGNhbiBjaG9vc2UgdG8gZGlzcGxheSBOYW1lcyBvciBQcmVzZW50YXRpb24gTmFtZXMuIFlvdSBjYW4gc3dpdGNoIHRoZSBuYW1lIGRpc3BsYXkgdXNpbmcgdGhlIJFTaG93IFByZXNlbnRhdGlvbiBOYW1lcycgYnV0dG9uIGluIHRoZSBMaWJyYXJ5IHZpZXcgdG9vbGJhci4gPC9wPgotPHA+SW4gZ2VuZXJhbCwgeW91IGNyZWF0ZSBuZXcgZWxlbWVudHMgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgbmV3IGVsZW1lbnQuIEZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBuZXcgcm9sZSBpbiBhIGNvbnRlbnQgcGFja2FnZSwgcmlnaHQtY2xpY2sgdGhlIDxzdHJvbmc+Um9sZXMgPC9zdHJvbmc+IGZvbGRlciwgaGlnaGxpZ2h0IDxzdHJvbmc+TmV3IDwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPlJvbGU8L3N0cm9uZz4uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBXaXRoaW4gPHNwYW4gY2xhc3M9InN0eWxlMSI+TXkgQ29udGVudCBQYWNrYWdlPC9zcGFuPiByaWdodC1jbGljayBvbiB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEhpZ2hsaWdodCA8c3Ryb25nPk5ldzwvc3Ryb25nPiBhbmQgdGhlbiBjbGljayA8c3Ryb25nPkFydGlmYWN0PC9zdHJvbmc+LiBUaGUgYXJ0aWZhY3QgZWRpdG9yIGlzIGRpc3BsYXllZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBOYW1lIGZpZWxkLCB0eXBlIHRoZSBuZXcgQXJ0aWZhY3QgbmFtZS4gSW4gdGhpcyBpbnN0YW5jZSwgd2UnbGwgY2FsbCBpdCA8c3Ryb25nPm15X3J1cF9uYXZtYXA8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiBJbiB0aGUgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZTwvc3Ryb25nPiBmaWVsZCwgdHlwZTogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+TXkgUlVQIE5hdmlnYXRpb24gTWFwPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbjwvc3Ryb25nPiBmaWVsZCwgdHlwZToKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPlRoZSBOYXZpZ2F0aW9uIE1hcCBleHByZXNzZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdXNlci1pbnRlcmZhY2UgZWxlbWVudHMgaW4gdGhlIHN5c3RlbSwgYWxvbmcgd2l0aCB0aGVpciBwb3RlbnRpYWwgbmF2aWdhdGlvbiBwYXRod2F5cy48L3A+Ci0gICAgPC9ibG9ja3F1b3RlPgotICA8L2xpPgotICA8bGk+IEluIHRoZSA8c3Ryb25nPlB1cnBvc2U8L3N0cm9uZz4gZmllbGQgdHlwZTogCi0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD5UaGVyZSBpcyBvbmUgTmF2aWdhdGlvbiBNYXAgcGVyIHN5c3RlbS4gVGhlIHB1cnBvc2Ugb2YgdGhlIE5hdmlnYXRpb24gTWFwIGlzIHRvIGV4cHJlc3MgdGhlIHByaW5jaXBhbCB1c2VyIGludGVyZmFjZSBwYXRocyB0aHJvdWdoIHRoZSBzeXN0ZW0uIFRoZXNlIGFyZSB0aGUgbWFpbiBwYXRod2F5cyB0aHJvdWdoIHRoZSBzY3JlZW5zIG9mIHRoZSBzeXN0ZW0gYW5kIG5vdCBuZWNlc3NhcmlseSBhbGwgb2YgdGhlIHBvc3NpYmxlIHBhdGhzLiBJdCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHJvYWQgbWFwIG9mIHRoZSBzeXN0ZW0ncyB1c2VyIGludGVyZmFjZS4gVGhlIE5hdmlnYXRpb24gTWFwIG1ha2VzIGl0IGVhc3kgdG8gc2VlIGhvdyBtYW55ICZxdW90O2NsaWNrcyZxdW90OyBpdCB3aWxsIHRha2UgYSB1c2VyIHRvIGdldCB0byBhIHNwZWNpZmljIHNjcmVlbi4gPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIHRoZSBwcmV2aWV3IHRhYiB0byB2aWV3IHRoZSBuZXcgQXJ0aWZhY3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSBBcnRpZmFjdC4gPC9wPgotICA8L2xpPgotICA8bGk+IFJlcGVhdCBzdGVwcyAyIHRocm91Z2ggOSB1c2luZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFydGlmYWN0IE5hbWU8L3N0cm9uZz46IG15X3J1cF91c2VyX2ludGVyZmFjZV9wcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHJlc2VudGF0aW9uIE5hbWU8L3N0cm9uZz46IE15IFJVUCBVSSBQcm90b3R5cGUgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb248L3N0cm9uZz46IEEgdXNlci1pbnRlcmZhY2UgcHJvdG90eXBlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIHVzZXIgaW50ZXJmYWNlIHRoYXQgaXMgYnVpbHQgaW4gb3JkZXIgdG8gZXhwbG9yZSBhbmQvb3IgdmFsaWRhdGUgdGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbi4gPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+UHVycG9zZTogPC9zdHJvbmc+IFRoZSBmb2xsb3dpbmcgcm9sZXMgdXNlIHRoZSB1c2VyLWludGVyZmFjZSBwcm90b3R5cGU6IDwvcD4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8cD4tIDxzdHJvbmc+dXNlci1pbnRlcmZhY2UgZGVzaWduZXJzPC9zdHJvbmc+ICwgdG8gZXhwbG9yZSBhbmQvb3IgdmFsaWRhdGUgdGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbiBiZWZvcmUgdG9vIG11Y2ggaXMgaW52ZXN0ZWQgaW4gaXQgPC9wPgotICAgICAgICA8cD4tIDxzdHJvbmc+cmVxdWlyZW1lbnRzIHNwZWNpZmllcnMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIHRoZSB1c2VyIGludGVyZmFjZSBmb3IgYSBVc2UgQ2FzZSA8L3A+Ci0gICAgICAgIDxwPjxzdHJvbmc+LSBzeXN0ZW0gYW5hbHlzdHMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdXNlciBpbnRlcmZhY2UgaW1wYWN0cyB0aGUgYW5hbHlzaXMgb2YgdGhlIHN5c3RlbSA8L3A+Ci0gICAgICAgIDxwPi0gPHN0cm9uZz5kZXNpZ25lcnMgPC9zdHJvbmc+LCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgdXNlciBpbnRlcmZhY2UgaW1wYWN0cyBhbmQgd2hhdCBpdCByZXF1aXJlcyBmcm9tIHRoZSAmcXVvdDtpbnNpZGUmcXVvdDsgb2YgdGhlIHN5c3RlbSA8L3A+Ci0gICAgICAgIDxwPiAtIDxzdHJvbmc+bWFuYWdlcnMgPC9zdHJvbmc+LCB0byBwbGFuIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIGFjdGl2aXRpZXMgPC9wPgotICAgICAgPC9ibG9ja3F1b3RlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfMy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkNmU4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+RXhlcmNpc2UgMzogQ3JlYXRlIFJvbGVzIDwvYT48L2gyPgotPHA+VG8gY3JlYXRlIGEgUm9sZSBpbiBNeSBDb250ZW50IFBhY2thZ2U6IDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBNYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5XaXRoaW4gTXkgQ29udGVudCBQYWNrYWdlIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJvbGVzIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Sb2xlPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgPHN0cm9uZz5OYW1lIGZpZWxkIDwvc3Ryb25nPiB0eXBlOiBteV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkluIHRoZSA8c3Ryb25nPlByZXNlbnRhdGlvbiBOYW1lPC9zdHJvbmc+IGZpZWxkIHR5cGU6IE15IFVJIERlc2lnbmVyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiA8L3N0cm9uZz4gZmllbGQgdHlwZTogPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhlIHVzZXItaW50ZXJmYWNlIGRlc2lnbmVyIGNvb3JkaW5hdGVzIHRoZSBkZXNpZ24gb2YgdGhlIHVzZXIgaW50ZXJmYWNlLiBVc2VyLWludGVyZmFjZSBkZXNpZ25lcnMgYXJlIGFsc28gaW52b2x2ZWQgaW4gZ2F0aGVyaW5nIHVzYWJpbGl0eSByZXF1aXJlbWVudHMgYW5kIHByb3RvdHlwaW5nIGNhbmRpZGF0ZSB1c2VyLWludGVyZmFjZSBkZXNpZ25zIHRvIG1lZXQgdGhvc2UgcmVxdWlyZW1lbnRzLiA8L3A+Ci0gICAgPHA+PHN0cm9uZz5UaXAgPC9zdHJvbmc+IC0gdGhlcmUgYXJlIGRpZmZlcmVudCB3YXlzIHRoYXQgeW91IGNhbiBjcmVhdGUgdGhlIHRleHQgYWJvdmUgZm9yIHRoZSBuZXcgcm9sZTogPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IERpcmVjdGx5LCBieSB0eXBpbmcgaXQgbWFudWFsbHkgaW4gdGhlIEVQRiBDb21wb3NlciBlZGl0b3IuIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyBCeSBjb3B5aW5nIGZyb20gYW5vdGhlciBzaW1pbGFyIHJvbGUgYW5kIHRoZW4gbW9kaWZ5IHVzaW5nIHRoZSBlZGl0b3JzIChlLmcuIHJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcikuIDwvcD4KLSAgICAmIzE0OTsmbmJzcDtCeSBjb3B5aW5nIGZyb20gYW4gaHRtbCBzb3VyY2Ugc3VjaCBhcyB0aGUgdHV0b3JpYWwgeW91IGFyZSByZWFkaW5nLiA8L2Jsb2NrcXVvdGU+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPiAgICBUcnkgdGhlIDxzdHJvbmc+UmljaCBUZXh0IEVkaXRvciA8L3N0cm9uZz4gZm9yIGVkaXRpbmcgdGhlIDxzdHJvbmc+TWFpbiBEZXNjcmlwdGlvbi4gPC9zdHJvbmc+WW91IGNhbiBvcGVuIHRoZSBSaWNoIFRleHQgRWRpdG9yIGZvciBhbnkgaXRlbSB0aGF0IGhhcyBhIJF0d2lzdHknIDxpbWcgd2lkdGg9IjEzIiBoZWlnaHQ9IjEzIiBzcmM9InR1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZiI+c3ltYm9sIAotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ25lciByb2xlIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSB1c2VyIGludGVyZmFjZS4gSW5zdGVhZCwgdGhpcyByb2xlIGZvY3VzZXMgb24gdGhlIGRlc2lnbiBhbmQgdGhlICZxdW90O3Zpc3VhbCBzaGFwaW5nJnF1b3Q7IG9mIHRoZSB1c2VyIGludGVyZmFjZSwgYnk6IDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxvbD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPiAtIENhcHR1cmluZyByZXF1aXJlbWVudHMgb24gdGhlIHVzZXIgaW50ZXJmYWNlLCBpbmNsdWRpbmcgdXNhYmlsaXR5IHJlcXVpcmVtZW50cy4gPC9wPgotICAgICAgPHA+LSBCdWlsZGluZyB1c2VyLWludGVyZmFjZSBwcm90b3R5cGVzLjwvcD4KLSAgICAgIDxwPi0gSW52b2x2aW5nIG90aGVyIHN0YWtlaG9sZGVycyBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIHN1Y2ggYXMgZW5kLXVzZXJzLCBpbiB1c2FiaWxpdHkgcmV2aWV3cyBhbmQgdXNlIHRlc3Rpbmcgc2Vzc2lvbnMuIDwvcD4KLSAgICAgIDxwPi0gUmV2aWV3aW5nIGFuZCBwcm92aWRpbmcgdGhlIGFwcHJvcHJpYXRlIGZlZWRiYWNrIG9uIHRoZSBmaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdXNlciBpbnRlcmZhY2UsIGFzIGNyZWF0ZWQgYnkgb3RoZXIgZGV2ZWxvcGVyczsgdGhhdCBpcywgZGVzaWduZXJzIGFuZCBpbXBsZW1lbnRlcnMuIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvb2w+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPiCWIGlmIHlvdSBjb3B5IHRleHQgZnJvbSBhIE1pY3Jvc29mdCBXb3JkIGRvY3VtZW50IHlvdSB3aWxsIGdldCBhIGxvdCBvZiBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IG5lZWRlZCBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiBZb3UgY2FuIHNlZSB0aGlzIGlmIHlvdSBvcGVuIHRoZSBIVE1MIGVkaXRvciBpbiB0aGUgUmljaCBUZXh0IEVkaXRvci4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5Xb3JrUHJvZHVjdHMgPC9zdHJvbmc+IHRhYjsgbWFrZSB0aGlzIG5ldyByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgbXlfcnVwX25hdm1hcCBhbmQgbXlfcnVwX3VzZXJfaW50ZXJmYWNlX3Byb3RvdHlwZSBhcnRpZmFjdHMgdGhhdCB5b3UgcHJldmlvdXNseSBjcmVhdGVkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5BZGQgPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyBkaXNwbGF5cyBhIHNlbGVjdGlvbiBkaWFsb2cgd2hlcmUgeW91IGNhbiBzZWxlY3QgdGhlIFdvcmsgUHJvZHVjdHMgdG8gYWRkLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5PbmNlIHlvdSBoYXZlIHNlbGVjdGVkIHRoZSBhcHByb3ByaWF0ZSBXb3JrIFByb2R1Y3RzLCBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LiBUaGUgd29yayBwcm9kdWN0cyB5b3Ugc2VsZWN0ZWQgYXBwZWFyIGluIHRoZSA8c3Ryb25nPlJlc3BvbnNpYmxlIGZvcjogPC9zdHJvbmc+IHBhbmVsLiAKLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwPk5vdGUgdGhhdCBzZWxlY3RlZCBlbGVtZW50cyBpbiBhbiBBZGQvUmVtb3ZlIHNlY3Rpb24gZGlzcGxheSBib3RoIHRoZSBlbGVtZW50IG5hbWUgYW5kIHRoZSCRcGF0aCcgdG8gdGhhdCBlbGVtZW50IJYgdGhlIFBsdWdpbiBuYW1lIGFuZCBwYWNrYWdlIG5hbWUuIDwvcD4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB0aGUgbmV3bHkgY3JlYXRlZCByb2xlIGFuZCB0aGVuIHNhdmUgYnkgY2xvc2luZyB0aGUgZWRpdG9yLiA8L2xpPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfM19jbGlwX2ltYWdlMDAyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyZmM4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF8zX2NsaXBfaW1hZ2UwMDIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDQ6IENyZWF0ZSBUYXNrcyA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIGEgdGFzayBhbmQgdGhlbiByZWxhdGUgdGhhdCB0YXNrIHRvIHRoZSBvdGhlciBlbGVtZW50cyB5b3UgaGF2ZSBjcmVhdGVkLiA8L3A+Ci08cD5UbyBjcmVhdGUgYSBUYXNrIGluIE15IENvbnRlbnQgUGFja2FnZTogPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFdpdGhpbiBNeSBDb250ZW50IFBhY2thZ2UgcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+VGFza3MgPC9zdHJvbmc+IGZvbGRlci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5UYXNrPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5Vc2UgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB0byBjcmVhdGUgdGhlIHRhc2s6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5UYXNrOiA8L3N0cm9uZz4gbXlfZGVzaWduX3VzZXJfaW50ZXJmYWNlIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5QcmVzZW50YXRpb24gTmFtZSA8L3N0cm9uZz46IE15IERlc2lnbiBVc2VyIEludGVyZmFjZSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb246IDwvc3Ryb25nPiBUbyBwcm9kdWNlIGEgZGVzaWduIG9mIHRoZSB1c2VyIGludGVyZmFjZSB0aGF0IHN1cHBvcnRzIHRoZSByZWFzb25pbmcgYWJvdXQsIGFuZCB0aGUgZW5oYW5jZW1lbnQgb2YsIGl0cyB1c2FiaWxpdHkuIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5TdGVwcyA8L3N0cm9uZz4oVXNlIHN0ZXBzIHRhYik6PC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHA+LSBEZXNjcmliZSB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHJlbGF0ZWQgdXNlcnMgPC9wPgotICAgIC0gSWRlbnRpZnkgdGhlIHByaW1hcnkgdXNlciBpbnRlcmZhY2UgZWxlbWVudHMgPC9ibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlJvbGVzIChQcmltYXJ5IFBlcmZvcm1lcik6IDwvc3Ryb25nPm15X3J1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lciA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoTWFuZGF0b3J5IElucHV0KSA8L3N0cm9uZz4gcnVwX3NvZnR3YXJlX3JlcXVpcmVtZW50ICh1bmRlciByZXF1aXJlbWVudHMpIDxzdHJvbmc+PC9zdHJvbmc+PC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPldvcmsgUHJvZHVjdHMgPC9zdHJvbmc+IChPdXRwdXRzKTogbXlfcnVwX25hdm1hcCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+R3VpZGFuY2U6IDwvc3Ryb25nPnJlcHJlc2VudGluZ19ncmFwaGljYWxfdXNlci1pbnRlcmZhY2VzICh1bmRlciBndWlfZGVzaWduKSA8c3Ryb25nPjwvc3Ryb25nPjwvcD4KLSAgJiMxNDk7Jm5ic3A7IDxzdHJvbmc+Q2F0ZWdvcmllczogPC9zdHJvbmc+cnVwX2FuYWx5c2lzX2Rlc2lnbl9kaXNjaXBsaW5lIDxzdHJvbmc+PC9zdHJvbmc+PC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgdGhlIDxzdHJvbmc+UHJldmlldyA8L3N0cm9uZz4gdGFiIHRvIHZpZXcgdGhlIG5ld2x5IGNyZWF0ZWQgdGFzayBhbmQgc2F2ZSBieSBjbG9zaW5nIHRoZSBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDcmVhdGUgYW5vdGhlciB0YXNrIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5UYXNrOiA8L3N0cm9uZz4gbXlfcHJvdG90eXBlX3VzZXJfaW50ZXJmYWNlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPlByZXNlbnRhdGlvbiBuYW1lIDwvc3Ryb25nPjogTXkgUHJvdG90eXBlIFVzZXIgSW50ZXJmYWNlIDwvcD4KLSAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uOiA8L3N0cm9uZz4gVG8gcHJvdG90eXBlIHRoZSBzeXN0ZW0ncyB1c2VyIGludGVyZmFjZSBpbiBhbiBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSB1c2VyLWludGVyZmFjZSBkZXNpZ24gYWdhaW5zdCB0aGUgZnVuY3Rpb25hbCBhbmQgdXNhYmlsaXR5IHJlcXVpcmVtZW50cy4gPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+U3RlcHM6IDwvc3Ryb25nPjwvcD4KLSAgICAgIDxibG9ja3F1b3RlPgotICAgICAgICA8cD4tJm5ic3A7IERlc2lnbiB0aGUgdXNlciBpbnRlcmZhY2UgcHJvdG90eXBlIDwvcD4KLSAgICAgICAgPHA+LSZuYnNwOyBJbXBsZW1lbnQgdGhlIHVzZXIgaW50ZXJmYWNlIHByb3RvdHlwZSA8L3A+Ci0gICAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Sb2xlcyAoUHJpbWFyeSBQZXJmb3JtZXIpOiA8L3N0cm9uZz5teV9ydXBfdXNlcl9pbnRlcmZhY2VfZGVzaWduZXIgPC9wPgotICAgICAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+V29yayBQcm9kdWN0cyAoTWFuZGF0b3J5IElucHV0KSA8L3N0cm9uZz4gbXlfcnVwX25hdm1hcCA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIChPdXRwdXRzKTogPC9zdHJvbmc+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX3Byb3RvdHlwZSA8L3A+Ci0gICAgICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5DYXRlZ29yaWVzOiA8L3N0cm9uZz5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmUgPC9wPgotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9saT4KLSAgPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF81Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FkZWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNTogV29ya2luZyB3aXRoIFN0ZXBzIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byB1bmRlcnN0YW5kIHRoZSBTdGVwIEVkaXRvciB0aGF0IGlzIHBhcnQgb2YgdGhlIFRhc2sgRWRpdG9yLiA8L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYSB0YXNrLCB5b3UgY2FuIGRlZmluZSBhIHNlcmllcyBvZiBzdGVwcyB0aGF0IGRldGFpbCBob3cgdG8gcGVyZm9ybSB0aGUgdGFzay4gVGhlIFN0ZXAgRWRpdG9yIGFsbG93cyB5b3UgdG8gYWRkIG5ldyBzdGVwcywgY2hhbmdlIHRoZSBzZXF1ZW5jZSBvZiBzdGVwcyBhbmQgdG8gZGVsZXRlIHN0ZXBzLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5PcGVuIHRoZSBteV9kZXNpZ25fdXNlcl9pbnRlcmZhY2UgdGFzayBvciBjcmVhdGUgYSBuZXcgdGFzay4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DcmVhdGUgYSBuZXcgc3RlcDogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyBFbnRlciBhIG5hbWUgZm9yIHRoZSBzdGVwIGluIHRoZSCRU3RlcHMnIGJveC4gPC9wPgotICAgIDxwPiYjMTQ5OyBFbnRlciBhIDxzdHJvbmc+RGVzY3JpcHRpb24gPC9zdHJvbmc+IJYgeW91IGNhbiB1c2UgdGhlIFJpY2ggVGV4dCBFZGl0b3IgZm9yIHRoaXMuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xpY2sgdGhlIDxzdHJvbmc+QWRkIDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgICA8cD4mIzE0OTsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgUmVtb3ZlIGEgc3RlcCA6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7IENsaWNrIHRoZSBzdGVwIHRvIHJlbW92ZSBpbiB0aGUgU3RlcHMgcGFuZWwuIDwvcD4KLSAgICA8cD4mIzE0OTsgQ2xpY2sgdGhlIDxzdHJvbmc+RGVsZXRlIDwvc3Ryb25nPiBidXR0b24uIDwvcD4KLSAgICA8cD4mIzE0OTsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4gICAgTW92ZSBhIHN0ZXAgdXAgdGhlIGxpc3Q6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgdXAuPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDbGljayB0aGUgPHN0cm9uZz5VcCA8L3N0cm9uZz4gYnV0dG9uLjwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgU2VlIHRoZSByZXN1bHRzIG9uIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5Nb3ZlIGEgc3RlcCBkb3duIHRoZSBsaXN0IDogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBSZXR1cm4gdG8gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSBzdGVwIHlvdSB3YW50IHRvIG1vdmUgZG93bi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IENsaWNrIHRoZSA8c3Ryb25nPkRvd24gPC9zdHJvbmc+IGJ1dHRvbi48L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNlZSB0aGUgcmVzdWx0cyBvbiB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotPC9vbD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF82Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzYuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTEyZGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8yX2V4XzYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT48L2E+PGE+RXhlcmNpc2UgNjogQ3JlYXRlIEd1aWRhbmNlIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBjcmVhdGUgbWV0aG9kIDxzdHJvbmc+R3VpZGFuY2UgPC9zdHJvbmc+IGVsZW1lbnRzLiBUaGVyZSBpcyBhIHJhbmdlIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBndWlkYW5jZSB0aGF0IGNhbiBiZSBjcmVhdGVkLiBGb3IgdGhpcyB0YXNrIHdlIHdpbGwgc2ltcGx5IGNyZWF0ZSBhIHJlcHJlc2VudGF0aXZlIGd1aWRhbmNlIGVsZW1lbnQsIGEgY2hlY2tsaXN0LiBPbmNlIHlvdSBoYXZlIGRvbmUgdGhpcywgdHJ5IGF1dGhvcmluZyBhZGRpdGlvbmFsIEd1aWRhbmNlIHR5cGVzLiA8L3A+Ci08cD5JbiBhIGNoZWNrbGlzdCwgQ2hlY2sgSXRlbXMgYXJlIGNyZWF0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIFN0ZXBzIGluIGEgdGFzayBhcmUgY3JlYXRlZCB1c2luZyB0aGUgPHN0cm9uZz5DaGVjayBJdGVtcyA8L3N0cm9uZz4gdGFiIGluIHRoZSA8c3Ryb25nPkNoZWNrbGlzdCBFZGl0b3I8L3N0cm9uZz4uIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldpdGhpbiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBDb250ZW50IFBhY2thZ2U8L3NwYW4+IHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkd1aWRhbmNlIDwvc3Ryb25nPiBmb2xkZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkhpZ2hsaWdodCA8c3Ryb25nPk5ldyA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DaGVja2xpc3Q8L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk5hbWUgdGhlIGd1aWRhbmNlLCBteV9jcmVhdGVfcGh5c2ljYWxfYXBwZWFyYW5jZV9jaGVja2xpc3QsIGFuZCBwcm92aWRlIHRoZSBwcmVzZW50YXRpb24gbmFtZSwgTXkgQ3JlYXRlIFBoeXNpY2FsIEFwcGVhcmFuY2UgQ2hlY2tsaXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSBmb2xsb3dpbmcgY2hlY2sgaXRlbXM6IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBDcmVhdGUgYnJhbmRpbmcgc3BlY2lmaWNhdGlvbnMgPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBEZWZpbmUgcGh5c2ljYWwgc3BlY2lmaWNhdGlvbnMgPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT5BZGQgdGhlIGNoZWNrbGlzdCB0byB0aGUgPHN0cm9uZz4gbXlfcHJvdG90eXBlX3VzZXJfaW50ZXJmYWNlIDwvc3Ryb25nPnRhc2sgYW5kIHRoZW4gbG9vayBmb3IgaXQgb24gdGhlIHByZXZpZXcgcGFnZS4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfNy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF83Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkNDYwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF83Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT5FeGVyY2lzZSA3OiBNYW5hZ2UgR3VpZGFuY2UgPC9hPjwvaDI+Ci08cD5HdWlkYW5jZSBjYW4gYmUgYXR0YWNoZWQgdG8gYW55IENvcmUgTWV0aG9kIENvbnRlbnQgb3IgUHJvY2VzcyBFbGVtZW50LiBHdWlkYW5jZSBjYW4gZXZlbiBiZSBhdHRhY2hlZCB0byBhIEd1aWRhbmNlIGVsZW1lbnQuIDwvcD4KLTxwPlRoZSBnb2FsIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY2Fycnkgb3V0IHNvbWUgc2ltcGxlIGd1aWRhbmNlIG1hbmFnZW1lbnQgdGFza3MgKGkuZS4sIGFkZGluZyBhbmQgcmVtb3ZpbmcgZ3VpZGFuY2UuKTwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPk5hdmlnYXRlIHRvIHRoZSBhcnRpZmFjdCA8c3Ryb25nPm15X3J1cF9uYXZtYXAgPC9zdHJvbmc+IHRoYXQgeW91IGNyZWF0ZWQgaW4gZXhlcmNpc2UgMiBpbiB0aGlzIHR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQWRkIHRoZSBDb25jZXB0IFBhcGVyIDxzdHJvbmc+cHJvY2Vzc192aWV3IDwvc3Ryb25nPiBmcm9tIHRoZSBSVVAgcGx1Zy1pbi4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlIFNlbGVjdCBEaWFsb2cgaXMgcmVzdHJpY3RlZCB0byBqdXN0IHRob3NlIGl0ZW1zIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgYWRkZWQuIFRoZSBsaXN0IGNhbiBiZSBsb25nIHRob3VnaC4gWW91IGNhbiBlbnRlciBhIHNlYXJjaCBzdHJpbmcsIHN1Y2ggYXMgkXBybycgaW4gdGhlIJFOYW1lIHBhdHRlcm5zJyBib3ggdG8gZmlsdGVyIHRoZSBpdGVtcyB0aGF0IGFyZSBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB5b3UgY2FuIHVzZSB0aGUgQ29sbGFwc2UgQWxsIGFuZCBFeHBhbmQgQWxsIGJ1dHRvbnMgb24gdGhpcyBkaWFsb2cgdG8gY2hhbmdlIHRoZSB3YXkgdGhlIHRyZWUgaXMgZGlzcGxheWVkLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPkFkZCA8c3Ryb25nPm15X2NyZWF0ZV9waHlzaWNhbF9hcHBlYXJhbmNlX2NoZWNrbGlzdCA8L3N0cm9uZz4gQ2hlY2tsaXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayB0aGUgPHN0cm9uZz5QcmV2aWV3IDwvc3Ryb25nPiB0YWIgdG8gdmlldyB5b3VyIHdvcmsuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJlbW92ZSB0aGUgQ29uY2VwdCBQYXBlciBwcm9jZXNzX3ZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPkNsaWNrIHRoZSA8c3Ryb25nPlByZXZpZXcgPC9zdHJvbmc+IHRhYiB0byB2aWV3IHlvdXIgd29yay4gPC9saT4KLTwvb2w+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF84Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyMzY5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF84Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDg6IENyZWF0ZSBOZXcgU3RhbmRhcmQgQ2F0ZWdvcnkgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHVuZGVyc3RhbmQgYW5kIHVzZSA8c3Ryb25nPlN0YW5kYXJkIENhdGVnb3JpZXMuIDwvc3Ryb25nPkluIHByYWN0aWNlLCB0aGlzIHdpbGwgbm90IGJlIGRvbmUgdmVyeSBvZnRlbiwgYXMgU3RhbmRhcmQgQ2F0ZWdvcmllcyB0ZW5kIHRvIGJlIHJlbGF0aXZlbHkgc3RhYmxlLiBBbHNvLCBpZiB5b3UgYXJlIGNyZWF0aW5nIGEgcGx1Zy1pbiB0aGF0IGV4dGVuZHMgUlVQLCB5b3Ugc2hvdWxkIGF0dGVtcHQgdG8gdXNlIHRoZSBSVVAgU3RhbmRhcmQgQ2F0ZWdvcmllcyBiZWZvcmUgY3JlYXRpbmcgbmV3IG9uZXMuIDwvcD4KLTxwPjxzdHJvbmc+U3RhbmRhcmQgQ2F0ZWdvcmllcyA8L3N0cm9uZz4gcHJvdmlkZSBhIG1lYW5zIHRvIGNhdGVnb3JpemUgY29yZSBtZXRob2QgY29udGVudCBpbiBsaW5lIHdpdGggYmVzdCBwcmFjdGljZXMgZm9yIGNyZWF0aW5nIHN0cnVjdHVyZWQgbWV0aG9kcy4gSW4gb3JkZXIgdG8gZW5jb3VyYWdlIGdvb2QgbWV0aG9kIHN0cnVjdHVyZSB3ZSBwcm92aWRlIHN0YW5kYXJkIGNhdGVnb3JpZXMgZm9yIGdyb3VwaW5nIDxzdHJvbmc+VGFza3MgPC9zdHJvbmc+aW50byA8c3Ryb25nPjxlbT5EaXNjaXBsaW5lcyA8L2VtPjwvc3Ryb25nPiwgPHN0cm9uZz5Xb3JrIFByb2R1Y3RzIDwvc3Ryb25nPiBpbnRvIDxzdHJvbmc+PGVtPkRvbWFpbnMgPC9lbT48L3N0cm9uZz4sIDxzdHJvbmc+Um9sZXMgPC9zdHJvbmc+IGludG8gPHN0cm9uZz48ZW0+Um9sZSBTZXRzIDwvZW0+PC9zdHJvbmc+LCBhbmQgPHN0cm9uZz5Ub29sLU1lbnRvcnMgPC9zdHJvbmc+IGludG8gPHN0cm9uZz48ZW0+VG9vbHMgPC9lbT48L3N0cm9uZz4uIFVubGlrZSA8c3Ryb25nPjxlbT5DdXN0b20gPC9lbT4gQ2F0ZWdvcmllcyA8L3N0cm9uZz4sIDxzdHJvbmc+U3RhbmRhcmQgQ2F0ZWdvcmllcyA8L3N0cm9uZz4gYnkgZGVmaW5pdGlvbiBhcmUgbGlua2VkIHdpdGggYSBzcGVjaWZpYyBtZXRob2QgY29udGVudCB0eXBlIJYgZS5nLiBSb2xlIFNldHMgd2l0aCBSb2xlcywgRGlzY2lwbGluZXMgd2l0aCBUYXNrcywgYW5kIERvbWFpbnMgd2l0aCBXb3JrIFByb2R1Y3RzLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5DbGljayA8c3Ryb25nPk15IFBsdWdpbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgU3RhbmRhcmQgQ2F0ZWdvcmllczwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPlJvbGUgU2V0IDwvc3Ryb25nPm5hbWVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2Rlc2lnbjwvc3Bhbj4gd2l0aCBhIHByZXNlbnRhdGlvbiBuYW1lIG9mIDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IERlc2lnbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBBZGQgdGhlIHJvbGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPiB0byB0aGU8c3BhbiBjbGFzcz0ic3R5bGUxIj4gbXlfZGVzaWduPC9zcGFuPiA8c3Ryb25nPlJvbGUgU2V0PC9zdHJvbmc+LiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD5UaGVyZSBhcmUgdHdvIHdheXMgeW91IGNhbiBkbyB0aGlzOiA8L3A+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBJbiB0aGUgU3RhbmRhcmQgQ2F0ZWdvcnkgZWRpdG9yIGZvciA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+LCBvcGVuIHRoZSA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+IHRhYiwgYW5kIGFkZCB0aGUgcm9sZSB0byB0aGUgcm9sZXNldC4gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwO0luIHRoZSBSb2xlIGVkaXRvciBmb3IgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPiwgb3BlbiB0aGUgPHN0cm9uZz5DYXRlZ29yaWVzPC9zdHJvbmc+IHRhYiBhbmQgYWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9kZXNpZ248L3NwYW4+IGNhdGVnb3J5IGFzIGEgU2VsZWN0ZWQgUm9sZXNldC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci08L2Jsb2NrcXVvdGU+Ci08aDI+Jm5ic3A7PC9oMj4KLTxoMT4mbmJzcDs8L2gxPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfZXhfOS5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF85Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ODkzMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9leF85Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjxhPkV4ZXJjaXNlIDk6IDwvYT5BZGRpbmcgWW91ciBQbHVnLWluIHRvIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgPC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gbGVhcm4gaG93IHRvIGluY2x1ZGUgeW91ciBwbHVnLWluIGluIGEgY29uZmlndXJhdGlvbi4gPC9wPgotPHA+QmVmb3JlIHlvdXIgbmV3IGVsZW1lbnRzIGNhbiBiZSBzZWVuIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcsIHlvdSBuZWVkIHRvIGZpcnN0IGFkZCB5b3VyIG5ldyBwbHVnLWluIHRvIGEgY29uZmlndXJhdGlvbi4gV2UnbGwgYWRkIHRoZSBuZXcgcGx1Zy1pbiB0byB0aGUgQ29uZmlnIGZvciBSVVAgY29uZmlndXJhdGlvbiBhbmQgc2VlIHRoZSByZXN1bHRzIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZyA8L3N0cm9uZz5wZXJzcGVjdGl2ZSBhbmQgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3IDwvc3Ryb25nPnRyeSB0byBmaW5kIHlvdXIgbmV3IGNvbnRlbnQuIEZvciBleGFtcGxlIGxvb2sgZm9yIE15IERlc2lnbiBSb2xlc2V0LiBZb3Ugc2hvdWxkbid0IHNlZSBpdC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+cGVyc3BlY3RpdmUgYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5Db25maWd1cmF0aW9ucyA8L3N0cm9uZz4gYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZSBkaXNwbGF5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSBhIGNvcHkgb2YgdGhlIDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbi4gUmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+UlVQIGZvciBTbWFsbCBQcm9qZWN0cyA8L3N0cm9uZz4gY29uZmlndXJhdGlvbiBhbmQgc2VsZWN0IDxzdHJvbmc+Q29weSA8L3N0cm9uZz4uIFRoZW4gcmlnaHQtY2xpY2sgb24gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlciBhbmQgY2xpY2sgPHN0cm9uZz5QYXN0ZSA8L3N0cm9uZz4uIE5hbWUgdGhlIG5ldyBjb25maWd1cmF0aW9uIDxzdHJvbmc+TXkgUlVQIGZvciBTbWFsbCBQcm9qZWN0cy4gPC9zdHJvbmc+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERvdWJsZS1jbGljayBvbiB0aGUgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPiBjb25maWd1cmF0aW9uIHRvIG9wZW4gdGhlIENvbmZpZ3VyYXRpb24gRWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+UGx1Zy1pbiBhbmQgUGFja2FnZSBTZWxlY3Rpb248L3N0cm9uZz4gdGFiLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIDxzdHJvbmc+TXkgUGx1Z2luIDwvc3Ryb25nPiB0byB0aGUgY29uZmlndXJhdGlvbiBieSBjaGVja2luZyB0aGUgYm94IG5leHQgdG8gaXQgaW4gdGhlIENvbmZpZ3VyYXRpb24gQ29tcG9uZW50cyBmaWVsZC4gSWYgeW91IGV4cGFuZCA8c3Ryb25nPk15IFBsdWdpbiA8L3N0cm9uZz4geW91IHdpbGwgc2VlIHRoYXQgdGhlIGZ1bGwgY29udGVudHMgb2YgdGhlIHBsdWctaW4gaGF2ZSBiZWVuIHNlbGVjdGVkLiAKLSAgICAgIFlvdSBtYXkgc2VlIHNvbWUgZXJyb3JzIGluIHRoZSBMaWJyYXJ5IEVycm9yIExvZyB2aWV3LiBZb3UgY2FuIGNsaWNrIHRocm91Z2ggdGhlc2UgZXJyb3JzIG9yIGlnbm9yZSB0aGVtIGZvciBub3cuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbG9zZSB0aGUgZWRpdG9yIGFuZCBzYXZlIHRoZSBjaGFuZ2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ2hhbmdlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIDwvc3Ryb25nPmluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggaW4gdGhlIEVQRiBDb21wb3NlciB0b29sYmFyLCBqdXN0IGJlbG93IHRoZSBtYWluIG1lbnUgYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgbm93IGxvb2sgZm9yIHlvdXIgY29udGVudCBpbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4uIFlvdSBzaG91bGQgbm93IHNlZSA8c3Ryb25nPk15IERlc2lnbiBSb2xlc2V0IDwvc3Ryb25nPi4gWW91IHNob3VsZCBhbHNvIHNlZSB5b3VyIG5ldyBXb3JrIFByb2R1Y3RzIGluIHRoZSBVbmNhdGVnb3JpemVkIGZvbGRlciB1bmRlciBEb21haW5zLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPiZuYnNwOzwvYmxvY2txdW90ZT4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9pbnRyby5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfMl9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWNhODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzJfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiBDcmVhdGUgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDE+Ci08aDI+PGE+SW50cm9kdWN0aW9uIDwvYT48L2gyPgotPHA+RVBGIENvbXBvc2VyIHNlcGFyYXRlcyByZXVzYWJsZSA8c3Ryb25nPm1ldGhvZCBjb250ZW50IDwvc3Ryb25nPiBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiA8c3Ryb25nPnByb2Nlc3NlcyA8L3N0cm9uZz4uIFRoZSBwcmltYXJ5IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFyZSA8c3Ryb25nPnRhc2tzIDwvc3Ryb25nPiwgPHN0cm9uZz5yb2xlcyA8L3N0cm9uZz4sIDxzdHJvbmc+d29yayBwcm9kdWN0cyA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+LiBBIFByb2Nlc3MgRW5naW5lZXIgdXNlcyBFUEYgQ29tcG9zZXIgdG8gYXV0aG9yIHRoZXNlIGVsZW1lbnRzLCBkZWZpbmUgdGhlIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGVtLCBhbmQgdG8gY2F0ZWdvcml6ZSB0aGVtLiBNZXRob2QgY29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBzdXBwb3J0cyB0aGUgY29uY2VwdCBvZiA8c3Ryb25nPk1ldGhvZCBQbHVnLWlucyA8L3N0cm9uZz4gdGhhdCBhbGxvd3MgdGhlIGV4dGVuc2lvbiBvciBjdXN0b21pemF0aW9uIG9mIGJhc2UgbGlicmFyeSBjb250ZW50IHdpdGhvdXQgZGlyZWN0bHkgY2hhbmdpbmcgdGhhdCBiYXNlIGNvbnRlbnQuIFdoZW4gd2Ugc2hpcCBhIGxpYnJhcnkgd2l0aCBFUEYgQ29tcG9zZXIgdGhlIGxpYnJhcnkgaXMgcHJvdGVjdGVkIGZyb20gZGlyZWN0IG1vZGlmaWNhdGlvbi4gVGhlIFJVUCBwbHVnaW5zIGFyZSBncmF5ZWQgb3V0IGluIHRoZSBMaWJyYXJ5IHZpZXcgaW5kaWNhdGluZyB0aGF0IHRoZXkgYXJlIGxvY2tlZC4gPC9wPgotPHA+PHN0cm9uZz5Zb3Ugc2hvdWxkIGFsd2F5cyBjcmVhdGUgbmV3IGNvbnRlbnQgaW4gYSBNZXRob2QgUGx1Zy1pbiB0aGF0IHlvdSBwcm9kdWNlLiA8L3N0cm9uZz5UaGlzIHNlcGFyYXRlcyB5b3VyIGNvbnRlbnQgZnJvbSB0aGUgb3JpZ2luYWwgT3BlblVQIGNvbnRlbnQgYW5kIGFsbG93cyB5b3UgdG8gdXBkYXRlIHlvdXIgb3duIGxpYnJhcnkgd2l0aCBuZXcgcmVsZWFzZXMgb2YgdGhlIE9wZW5VUCBsaWJyYXJ5IHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb250ZW50IHRoYXQgeW91IGhhdmUgY3JlYXRlZCBpbiB5b3VyIG93biBwbHVnLWlucy4gPC9wPgotPHA+SW4gdGhpcyB0dXRvcmlhbCB5b3Ugd2lsbCB1c2Ugc2V2ZXJhbCCRZWRpdG9ycycuIEVhY2ggZWRpdG9yIG9wZW5zIGluIGl0cyBvd24gdGFiIGluIHRoZSBjb250ZW50IGRpc3BsYXkgc2VjdGlvbiBvZiB0aGUgc2NyZWVuLiBJdCBpcyBnb29kIHByYWN0aWNlIHRvIGNsb3NlIGFuIGVkaXRvciB3aGVuIHlvdSBoYXZlIGZpbmlzaGVkIHdpdGggaXQuIFRoaXMgZW5zdXJlcyB0aGF0IHlvdSBzYXZlIGFueSBjaGFuZ2VzIHlvdSBtYWtlLiA8L3A+Ci08cD5JZiB5b3UgZG8gaGF2ZSBzZXZlcmFsIGVkaXRvcnMgb3BlbiwgeW91IG1heSB3YW50IHRvIHR1cm4gb24gdGhlIJFMaW5rIHdpdGggRWRpdG9yJyBmZWF0dXJlIGJ5IGNsaWNraW5nIG9uIHRoZSBMaW5rIHdpdGggRWRpdG9yIGJ1dHRvbiBpbiB0aGUgTGlicmFyeSB2aWV3IHRvb2xiYXIuIElmIHRoaXMgaXMgc2VsZWN0ZWQsIHdoZW4geW91IHN3aXRjaCBiZXR3ZWVuIGVkaXRvcnMsIHRoZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGVkaXRvciBpcyBoaWdobGlnaHRlZCBpbiB0aGUgTGlicmFyeSB2aWV3LiA8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGV4ZXJjaXNlcyB0YWtlIHlvdSB0aHJvdWdoIHRoZSBjcmVhdGlvbiBvZiCTY29yZSBtZXRob2QgY29udGVudJQuIDwvcD4KLTxoMj4mbmJzcDs8L2gyPgotPGgxPiZuYnNwOzwvaDE+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjg5YjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEFkZGluZyB0byBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHJvbGUgdXNpbmcgQ29udHJpYnV0aW9uIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSByb2xlIGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlRoaXMgZXhlcmNpc2UgYWRkcyBjb250ZW50IHRvIHRoZSBNeSBQbHVnaW4gcGx1Z2luLiBJZiB5b3UgaGF2ZSBub3QgY2FycmllZCBvdXQgdGhlIJFDcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudCB0dXRvcmlhbCwgY3JlYXRlIGl0IG5vdy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q3JlYXRlIGEgQ29udGVudCBQYWNrYWdlIGluIHRoZSBNeSBQbHVnaW4gcGx1Zy1pbiBjYWxsZWQgPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW9uPC9zcGFuPiBUZXN0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5JbiB0aGUgbmV3IENvbnRyaWJ1dGlvbiBUZXN0IGNvbnRlbnQgcGFja2FnZSwgY3JlYXRlIGEgbmV3IFJvbGU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ191aV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlBhZ2UgZG93biB0aGUgRGVzY3JpcHRpb24gdGFiIHRvIHRoZSBDb250ZW50IFZhcmlhYmlsaXR5IHNlY3Rpb24gYW5kIHRoZW4sIGluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+LCBzZWxlY3QgPHN0cm9uZz5Db250cmlidXRlcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSByb2xlOiA8c3Ryb25nPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lciA8L3N0cm9uZz4uIFlvdSB3aWxsIGZpbmQgdGhpcyBpbiA8c3Ryb25nPlJVUCAmZ3Q7IERlc2lnbiAmZ3Q7IEdVSSBEZXNpZ248L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDb21wbGV0ZSB0aGUgZm9sbG93aW5nOiA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgQWRkIEJyaWVmIERlc2NyaXB0aW9uOiBDb250cmlidXRpbmcgYnJpZWYgZGVzY3JpcHRpb24gdGV4dCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEFkZCBNYWluIERlc2NyaXB0aW9uIDogQ29udHJpYnV0aW5nIG1haW4gZGVzY3JpcHRpb24gdGV4dCA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFNhdmUgKGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yKS4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD5DcmVhdGUgYSBuZXcgQ29uZmlndXJhdGlvbiBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnMgPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgTGlicmFyeSBWaWV3IHRyZWUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlJpZ2h0IGNsaWNrIHRoZSBmb2xkZXIgdG8gY3JlYXRlIG5ldyBjb25maWd1cmF0aW9uIGFuZCB0aGVuIG5hbWUgdGhlIGNvbmZpZ3VyYXRpb24gPHNwYW4gY2xhc3M9InN0eWxlMSI+VmFyaWFiaWxpdHkgQ29uZmlndXJhdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgdGhlIFJVUCBiYXNlIGFuZCB5b3VyIHBsdWctaW4gKE15IFBsdWdpbikgYnkgbWFya2luZyB0aGUgY2hlY2tib3hlcy4gU2F2ZSB0aGUgY29uZmlndXJhdGlvbiAoY2xvc2UgdGhlIGNvbmZpZ3VyYXRpb24gdGFiKS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+U2V0IJNjdXJyZW50IGNvbmZpZ3VyYXRpb26UIJYgbG9jYXRlZCB1bmRlciBtYWluIG1lbnUgYmFyIGFzIJNWYXJpYWJpbGl0eSBDb25maWd1cmEgdGlvbpQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPlN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgdGhlbiBvcGVuIHRoZSBVc2VyLUludGVyZmFjZSBEZXNpZ25lciByb2xlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Ci0gIDxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSBDb25maWd1cmF0aW9uIFZpZXcgcmVzb2x2ZXMgdGhlIHZhcmlhYmlsaXR5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIHBsdWctaW5zIGluIGEgY29uZmlndXJhdGlvbiBhbmQgc2hvd3MgdGhlIHJlc3VsdHMgYXMgdGhleSB3aWxsIGJlIHB1Ymxpc2hlZCBpbiBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzIuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzk3M2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMjogQWRkaW5nIHRvIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgd29yayBwcm9kdWN0IHVzaW5nIDx1PkNvbnRyaWJ1dGlvbjwvdT4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGV4dGVuZCBhIDxzdHJvbmc+V29yayBQcm9kdWN0IDwvc3Ryb25nPiAoPHN0cm9uZz5BcnRpZmFjdDwvc3Ryb25nPikgaW4gUlVQIHVzaW5nIJFjb250cmlidXRpb24nLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFdpdGhpbiB0aGUgQ29udHJpYnV0aW9uIFRlc3QgcGFja2FnZSBjcmVhdGUgYSBuZXcgYXJ0aWZhY3QgY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRyaWJ1dGluZ19uYXZtYXA8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIGEgPHN0cm9uZz5CcmllZiBEZXNjcmlwdGlvbiwgTWFpbiBEZXNjcmlwdGlvbjwvc3Ryb25nPiwgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+LCBldGMuLCA6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPkNvbnRyaWJ1dGluZyBCcmllZiBEZXNjcmlwdGlvbiwgQ29udHJpYnV0aW5nIE1haW4gRGVzY3JpcHRpb24sIGFuZCBDb250cmlidXRpbmcgUHVycG9zZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiA8c3Ryb25nPlZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcCA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXMgPC9zdHJvbmc+LCBhbmQgZm9yIDxzdHJvbmc+YmFzZSBhcnRpZmFjdCA8L3N0cm9uZz4gc2VsZWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9uYXZtYXA8L3NwYW4+LiBTYXZlIGJ5IGNsb3NpbmcgdGhlIFdvcmsgUHJvZHVjdCBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIEJyb3dzaW5nIHBlcnNwZWN0aXZlIGFuZCB2aWV3IHRoZSBOYXZpZ2F0aW9uIE1hcCBhcnRpZmFjdCBpbiB0aGUgPHN0cm9uZz5BbmFseXNpcyBhbmQgRGVzaWduIERvbWFpbiA8L3N0cm9uZz4gZm9sZGVyIGluIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gWW91IHNob3VsZCBzZWUgdGhlIHRleHQgdGhhdCB5b3UgaW5jbHVkZWQgaW4gdGhlIENvbnRyaWJ1dGluZyByb2xlIGRpc3BsYXllZCBpbiB0aGUgVXNlci1JbnRlcmZhY2UgRGVzaWduZXIuIDwvbGk+Ci08L29sPgotPGJsb2NrcXVvdGU+Jm5ic3A7PC9ibG9ja3F1b3RlPgotPGgyPiZuYnNwOzwvaDI+Ci08aDE+Jm5ic3A7PC9oMT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzMuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NGQ5MGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMzogQWRkaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgdGFzayB1c2luZyA8dT5Db250cmlidXRpb248L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYSA8c3Ryb25nPlRhc2sgPC9zdHJvbmc+IGluIFJVUCB1c2luZyCRY29udHJpYnV0aW9uJy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPldpdGhpbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW9uIFRlc3QgPC9zcGFuPnBhY2thZ2UgY3JlYXRlIGEgbmV3IDxzdHJvbmc+VGFzazwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29udHJpYnV0aW5nX2Rlc2lnbl91c2VyX2ludGVyZmFjZTwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uLCBNYWluIGRlc2NyaXB0aW9uIDwvc3Ryb25nPiwgPHN0cm9uZz5QdXJwb3NlPC9zdHJvbmc+LCBldGMuLDogPHNwYW4gY2xhc3M9InN0eWxlMSI+Q29udHJpYnV0aW5nIEJyaWVmIERlc2NyaXB0aW9uIHRleHQsIENvbnRyaWJ1dGluZyBNYWluIERlc2NyaXB0aW9uIHRleHQsIGFuZCBDb250cmlidXRpbmcgUHVycG9zZSB0ZXh0LiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0d28gbmV3IHN0ZXBzOiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Db250cmlidXRpbmcgU3RlcCAxIDwvc3Bhbj5hbmQ8c3BhbiBjbGFzcz0ic3R5bGUxIj4gQ29udHJpYnV0aW5nIFN0ZXAgMjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiA8c3Ryb25nPlZhcmlhYmlsaXR5IFJlbGF0aW9uc2hpcCA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+Q29udHJpYnV0ZXM8L3N0cm9uZz4sIGFuZCBmb3IgYmFzZSA8c3Ryb25nPnRhc2sgPC9zdHJvbmc+IHNlbGVjdCwgPHNwYW4gY2xhc3M9InN0eWxlMSI+ZGVzaWduX3VzZXJfaW50ZXJmYWNlPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEdvIGJhY2sgdG8gdGhlIDxzdHJvbmc+U3RlcHMgPC9zdHJvbmc+IHRhYiBhbmQgY2xpY2sgdGhlIDxzdHJvbmc+T3JkZXIgPC9zdHJvbmc+IGJ1dHRvbi4gWW91IGNhbiBub3cgaW5zZXJ0IHlvdXIgbmV3IHN0ZXBzIGludG8gdGhlIG9yaWdpbmFsIHN0ZXBzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TYXZlIHRoZSBuZXcgdGFzayBieSBjbG9zaW5nIHRoZSB0YXNrIGVkaXRvci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgQnJvd3NpbmcgcGVyc3BlY3RpdmUgYW5kIHZpZXcgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRlc2lnbiB0aGUgVXNlciBJbnRlcmZhY2U8L3NwYW4+IHRhc2sgaW4gdGhlIDxzdHJvbmc+RGlzY2lwbGluZXMgPC9zdHJvbmc+IGZvbGRlciBpbiA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldyA8L3N0cm9uZz4uIFlvdSB3aWxsIGZpbmQgaXQgdW5kZXIgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkFuYWx5c2lzXyZhbXA7IERlc2lnbjwvc3Bhbj4gZGlzY2lwbGluZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IExvb2sgYXQgdGhlIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHN0ZXBzIHRvIHNlZSBob3cgeW91ciBuZXcgbWF0ZXJpYWwgd2FzIGNvbnRyaWJ1dGVkLiBZb3Ugc2hvdWxkIHNlZSB0aGUgdGV4dCB0aGF0IHlvdSBpbmNsdWRlZCBpbiB0aGUgQ29udHJpYnV0aW5nIHJvbGUgZGlzcGxheWVkIGluIHRoZSBVc2VyIEludGVyZmFjZSB0YXNrLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gWW91IGNhbiBhbHNvIHRyeSBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgPHN0cm9uZz5hcnRpZmFjdHMgPC9zdHJvbmc+LCA8c3Ryb25nPmd1aWRhbmNlIDwvc3Ryb25nPiwgPHN0cm9uZz5hZGRpdGlvbmFsIHBlcmZvcm1lciByb2xlczwvc3Ryb25nPiwgZXRjLiwgaW4gdGhlIGNvbnRyaWJ1dGluZyB0YXNrIChpbiBBdXRob3JpbmcgcGVyc3BlY3RpdmUpIGFuZCB0aGVuIHZpZXcgdGhlIHJlc3VsdCBpbiB0aGUgQ29uZmlndXJhdGlvbiBWaWV3IHRvIHNlZSB0aGUgYmVoYXZpb3IuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNC5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF80Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1Y2U0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF80Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA0OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCBhc3NvY2lhdGVkIHdpdGggYSByb2xlIHVzaW5nIDx1PkV4dGVuZHM8L3U+IDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHRlbmQgYmFzZSBtZXRob2QgY29udGVudCB2aWEgZXh0ZW5kcyB2YXJpYWJpbGl0eS4gRXh0ZW5kcyB2YXJpYWJpbGl0eSB3b3JrcyBkaWZmZXJlbnRseSB0aGFuIENvbnRyaWJ1dGVzIHZhcmlhYmlsaXR5IGluIHRoYXQgdGhlIG1ldGhvZCBjb250ZW50IGVsZW1lbnQgdGhhdCBleHRlbmRzIHRoZSBiYXNlIG1ldGhvZCBlbGVtZW50IGluaGVyaXRzIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBleHRlbmRlZCBiYXNlIGVsZW1lbnQuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPkNvbnRlbnQgUGFja2FnZSA8L3N0cm9uZz4gaW4gdGhlIE15IFBsdWdpbiBQbHVnLWluIGNhbGxlZCBFeHRlbmRzIFRlc3QuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5Sb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc191aV9kZXNpZ25lciw8L3NwYW4+IHdpdGggdGhlIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBVSSBEZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBzZWxlY3QgPHN0cm9uZz5FeHRlbmRzIDwvc3Ryb25nPiBhbmQgY2hvb3NlIHRoZSBiYXNlIHJvbGU6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF91c2VyX2ludGVyZmFjZV9kZXNpZ25lcjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uPC9zdHJvbmc+OiBFeHRlbmRzIFJvbGUgQnJpZWYgRGVzY3JpcHRpb24uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPk1haW4gRGVzY3JpcHRpb24gPC9zdHJvbmc+OiBFeHRlbmRzIFJvbGUgTWFpbiBEZXNjcmlwdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIG5ldyByb2xlIGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gVXBkYXRlIHRoZSBWYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uIHRvIGluY2x1ZGUgdGhlIG5ldyBjb250ZW50IHBhY2thZ2UuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAmIzE0OTsmbmJzcDtPcGVuIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5WYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uPC9zcGFuPiBhbmQgZXhwYW5kIDxzdHJvbmc+TXkgUGx1Z2luICZndDsgTWV0aG9kIENvbnRlbnQgJmd0OyBDb250ZW50IFBhY2thZ2VzLiA8L3N0cm9uZz4gPC9wPgotICAgIDxwPiYjMTQ5OyBVbmNoZWNrIENvbnRyaWJ1dGlvbiBUZXN0LiA8L3A+Ci0gICAgPHA+JiMxNDk7IE1ha2Ugc3VyZSA8c3Ryb25nPkV4dGVuZHMgVGVzdCA8L3N0cm9uZz5pcyBjaGVja2VkLiBUaGlzIGlzIGRvbmUgc28gdGhlcmUgdGhhdCBhcmUgbm8gY29uZmxpY3RpbmcgZXh0ZW5zaW9ucyB0byB0aGUgc2FtZSBtZXRob2QgZWxlbWVudC4gPC9wPgotICAgIDxwPiYjMTQ5OyBDbG9zZSBhbmQgc2F2ZSB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbi4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gSW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIFVJIERlc2lnbmVyIHJvbGU8L3NwYW4+IGluIHRoZSBVbmNhdGVnb3JpemVkIFJvbGVzIGZvbGRlciB1bmRlciB0aGUgkzxzdHJvbmc+Um9sZSBTZXRzPC9zdHJvbmc+lCBmb2xkZXIuIFlvdSB3aWxsIHNlZSBpbiB0aGUgaHRtbCBwYWdlIHRoYXQgY29udGVudCBlbnRlcmVkIGluIHRoZSBleHRlbmRpbmcgcm9sZSBoYXMgYmVlbiByZXBsYWNlZCwgd2hlcmVhcyBjb250ZW50IG5vdCBwcm92aWRlZCBoYXMgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSBhcnRpZmFjdC4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCByb2xlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPlVzZXItSW50ZXJmYWNlIERlc2lnbmVyPC9zcGFuPiByZW1haW5zIHVuY2hhbmdlZC4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF81Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI4NTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDU6IEV4dGVuZGluZyBiYXNlIG1ldGhvZCBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIFdvcmsgUHJvZHVjdCB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgYmFzZSBtZXRob2Qgd29yayBwcm9kdWN0IHVzaW5nIGV4dGVuZHMgdmFyaWFiaWxpdHkuIDwvcD4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz4gaW4gdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgVGVzdDwvc3Bhbj4gQ29udGVudCBQYWNrYWdlIGNhbGxlZCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9leHRlbmRzX3J1cF9uYXZtYXA8L3NwYW4+IHdpdGggdGhlIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5FeHRlbmRzIFJVUCBOYXZtYXA8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSA8L3N0cm9uZz4gc2VsZWN0IDxzdHJvbmc+ZXh0ZW5kcyA8L3N0cm9uZz4gYW5kIGNob29zZSB0aGUgYmFzZSA8c3Ryb25nPldvcmsgUHJvZHVjdCA8L3N0cm9uZz48c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfbmF2bWFwPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+OiBFeHRlbmRzIE5hdm1hcCBCcmllZiBEZXNjcmlwdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgYW5kIHRoZW4gc3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkV4dGVuZHMgUlVQIE5hdm1hcDwvc3Bhbj4gd29yayBwcm9kdWN0IGluIHRoZSA8c3Ryb25nPlVuY2F0ZWdvcml6ZWQgRm9sZGVyIDwvc3Ryb25nPiB1bmRlciA8c3Ryb25nPkRvbWFpbnMgPC9zdHJvbmc+LiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IGNvbnRlbnQgZW50ZXJlZCBpbiB0aGUgZXh0ZW5kaW5nIGFydGlmYWN0IGhhcyBiZWVuIHJlcGxhY2VkLCB3aGVyZWFzIGNvbnRlbnQgbm90IHByb3ZpZGVkIGhhcyBiZWVuIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIGFydGlmYWN0LiBOb3RlIHRoYXQgdGhlIGV4dGVuZGVkIGFydGlmYWN0IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk5hdmlnYXRpb24gTWFwPC9zcGFuPiByZW1haW5zIHVuY2hhbmdlZC48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2V4XzYuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYjRjNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci08IS0tCi0uc3R5bGUxIHtmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNjogRXh0ZW5kaW5nIGJhc2UgbWV0aG9kIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIGEgVGFzayB1c2luZyA8dT5FeHRlbmRzPC91PiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGEgYmFzZSBtZXRob2QgdGFzayB1c2luZyBleHRlbmRzIHZhcmlhYmlsaXR5LiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gaW4gdGhlIEV4dGVuZHMgVGVzdCBjb250ZW50IHBhY2thZ2UgY2FsbGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfZGVzaWduX3VzZXJfaW50ZXJmYWNlPC9zcGFuPiwgd2l0aCBwcmVzZW50YXRpb24gbmFtZSwgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBEZXNpZ24gVXNlciBJbnRlcmZhY2UuIDwvc3Bhbj48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gSW4gdGhlIDxzdHJvbmc+VmFyaWFiaWxpdHkgVHlwZSwgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPmV4dGVuZHMgPC9zdHJvbmc+IGFuZCBjaG9vc2UgdGhlIGJhc2UgdGFzayBkZXNpZ25fdXNlcl9pbnRlcmZhY2UuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgYSA8c3Ryb25nPkJyaWVmIERlc2NyaXB0aW9uIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBUYXNrIEJyaWVmIERlc2NyaXB0aW9uPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCA8c3Ryb25nPlN0ZXBzIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kIFN0ZXAgMSwgRXh0ZW5kIFN0ZXAgMiA8L3NwYW4+PC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgPHN0cm9uZz5Sb2xlIDwvc3Ryb25nPiBjcmVhdGVkIGluIGV4ZXJjaXNlIDQ6IDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2V4dGVuZHNfdWlfZGVzaWduZXI8L3NwYW4+LCBhcyBQcmltYXJ5IFBlcmZvcm1lci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCB0aGUgV29yayBQcm9kdWN0IGNyZWF0ZWQgaW4gZXhlcmNpc2UgNTogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfZXh0ZW5kc19ydXBfbmF2bWFwPC9zcGFuPiwgYXMgYW4gT3V0cHV0LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQWRkIDxzdHJvbmc+R3VpZGFuY2UgPC9zdHJvbmc+KGNob29zZSBhbnkgZ3VpZGFuY2UpIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzdHJvbmc+dGFzayA8L3N0cm9uZz4gdG8gdGhlIGFwcHJvcHJpYXRlIFN0YW5kYXJkIENhdGVnb3J5OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5ydXBfYW5hbHlzaXNfZGVzaWduX2Rpc2NpcGxpbmU8L3NwYW4+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2F2ZSBhbmQgdGhlbiBzd2l0Y2ggdG8gdGhlIDxzdHJvbmc+QnJvd3NpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5JbiB0aGUgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXc8L3N0cm9uZz4sIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+RXh0ZW5kcyBEZXNpZ24gVXNlciBJbnRlcmZhY2U8L3NwYW4+IHRhc2sgdW5kZXIgdGhlIDxzdHJvbmc+RGlzY2lwbGluZXMgPC9zdHJvbmc+IGZvbGRlciBpbiB0aGUgPHNwYW4gY2xhc3M9InN0eWxlMSI+QW5hbHlzaXMgJmFtcDsgRGVzaWduPC9zcGFuPiBkaXNjaXBsaW5lLiBZb3Ugd2lsbCBzZWUgaW4gdGhlIGh0bWwgcGFnZSB0aGF0IG1ldGhvZCBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzIGhhdmUgYmVlbiBpbmhlcml0ZWQgZnJvbSB0aGUgYmFzZSB0YXNrIGFuZCBleHRlbmRlZCBieSB0aGUgcGx1Zy1pbiBleHRlbmRpbmcgY29udGVudCBhbmQgcmVsYXRpb25zaGlwcy4gTm90ZSB0aGF0IHRoZSBleHRlbmRlZCB0YXNrIHJlbWFpbnMgdW5jaGFuZ2VkLjwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfZXhfNy5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF83Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExNWQ0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfM19leF83Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSA3OiBFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCB1c2luZyA8dT5SZXBsYWNlPC91PiB2YXJpYWJpbGl0eSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gZXh0ZW5kIGJhc2UgbWV0aG9kIGNvbnRlbnQgdXNpbmcgcmVwbGFjZSB2YXJpYWJpbGl0eS4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5jb250ZW50IHBhY2thZ2UgPC9zdHJvbmc+IG5hbWVkLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIFRlc3Q8L3NwYW4+LCBpbiB0aGUgTXkgUGx1Z2luIHBsdWctaW4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDcmVhdGUgYSBuZXcgPHN0cm9uZz5yb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfcmVwbGFjZV91aV9kZXNpZ25lciByb2xlPC9zcGFuPiB3aXRoIHByZXNlbnRhdGlvbiBuYW1lLCA8c3BhbiBjbGFzcz0ic3R5bGUxIj5NeSBSZXBsYWNlIFVJIERlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSA8c3Ryb25nPlZhcmlhYmlsaXR5IFR5cGUgPC9zdHJvbmc+IHNlbGVjdCA8c3Ryb25nPnJlcGxhY2VzIDwvc3Ryb25nPiBhbmQgdGhlbiBjaG9vc2UgdGhlIDxzdHJvbmc+YmFzZSByb2xlIDwvc3Ryb25nPjogPHNwYW4gY2xhc3M9InN0eWxlMSI+cnVwX3VzZXJfaW50ZXJmYWNlX2Rlc2lnbmVyPC9zcGFuPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+QnJpZWYgRGVzY3JpcHRpb24gPC9zdHJvbmc+OiA8c3BhbiBjbGFzcz0ic3R5bGUxIj5SZXBsYWNlIEJyaWVmIERlc2NyaXB0aW9uLjwvc3Bhbj4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEFkZCBhIDxzdHJvbmc+TWFpbiBEZXNjcmlwdGlvbiA8L3N0cm9uZz46IDxzcGFuIGNsYXNzPSJzdHlsZTEiPlJlcGxhY2UgTWFpbiBEZXNjcmlwdGlvbjwvc3Bhbj4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTYXZlIHRoZSByb2xlIGJ5IGNsb3NpbmcgdGhlIHJvbGUgZWRpdG9yLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgVXBkYXRlIHRoZSBWYXJpYWJpbGl0eSBUZXN0IENvbmZpZ3VyYXRpb246IDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiAmIzE0OTsmbmJzcDtPcGVuIHRoZSBWYXJpYWJpbGl0eSBDb25maWd1cmF0aW9uIGFuZCBleHBhbmQgPHN0cm9uZz5NeSBQbHVnaW4gJmd0OyBNZXRob2QgQ29udGVudCAmZ3Q7IENvbnRlbnQgUGFja2FnZXM8L3N0cm9uZz4uIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDtVbmNoZWNrIDxzdHJvbmc+RXh0ZW5kcyBUZXN0PC9zdHJvbmc+LiA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7Q2hlY2sgPHN0cm9uZz5SZXBsYWNlIFRlc3Q8L3N0cm9uZz4uIFRoaXMgaXMgZG9uZSBzbyB0aGVyZSBhcmUgbm8gY29uZmxpY3RpbmcgZXh0ZW5zaW9ucyBpbiB0aGUgc2FtZSBtZXRob2QgZWxlbWVudC4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+LCB5b3Ugd2lsbCBzZWUgdGhhdCB0aGVyZSBpcyBubyBsb25nZXIgYSAoUlVQKSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcm9sZSBpbiB0aGUgPHN0cm9uZz5Sb2xlIFNldHMgPC9zdHJvbmc+IGZvbGRlci4gSXQgd2FzIHJlcGxhY2VkIGJ5IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFJlcGxhY2UgVUkgRGVzaWduZXI8L3NwYW4+IHJvbGUuIE1vcmVvdmVyLCBvdGhlciBjb250ZW50IGVsZW1lbnRzIGluIHRoZSBiYXNlIHBsdWctaW4gdGhhdCByZWZlcmVuY2VkIHRoZSAoUlVQKSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5Vc2VyLUludGVyZmFjZSBEZXNpZ25lcjwvc3Bhbj4gcm9sZSBub3cgcmVmZXJlbmNlIHRoZSByZXBsYWNpbmcgcm9sZSBpbnN0ZWFkIChlLmcuLCBpZiB5b3Ugb3BlbiB0aGUgZGlzY2lwbGluZXMgZm9sZGVyIGFuZCB2aWV3IHRoZSB0YXNrIDxzcGFuIGNsYXNzPSJzdHlsZTEiPkRlc2lnbiBUaGUgVXNlciBJbnRlcmZhY2U8L3NwYW4+IHlvdSB3aWxsIHNlZSB0aGF0IHRoZSA8c3Ryb25nPlBlcmZvcm1pbmcgUm9sZSA8L3N0cm9uZz4gaXMgbm93IDxzcGFuIGNsYXNzPSJzdHlsZTEiPk15IFJlcGxhY2UgVUkgRGVzaWduZXI8L3NwYW4+LikgPHN0cm9uZz5SZXBsYWNlIDwvc3Ryb25nPiB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IGZvciA8c3Ryb25nPnRhc2tzPC9zdHJvbmc+LCA8c3Ryb25nPmFydGlmYWN0cyA8L3N0cm9uZz4sIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+IGFuZCA8c3Ryb25nPmNhdGVnb3JpZXMgPC9zdHJvbmc+IChmZWVsIGZyZWUgdG8gdHJ5IGl0IG91dCkuIDwvbGk+Ci08L29sPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfaW50cm8uaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzNfaW50cm8uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE3OGNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF8zX2ludHJvLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT48L2E+PGE+PC9hPjxhPjwvYT48YT48L2E+PGE+PC9hPjwvaDI+Ci08aDE+PGE+PC9hPjxhPlR1dG9yaWFsOiBDcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQgPC9hPjwvaDE+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIHR1dG9yaWFsIGlzIHRvIHVuZGVyc3RhbmQgdGhlIHZhcmlldHkgb2Ygd2F5cyBpbiB3aGljaCB0aGUgY29udGVudCBpbiBhIGJhc2UgcGx1Zy1pbiBjYW4gYmUgZXh0ZW5kZWQgYW5kIG1vZGlmaWVkIGJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIDwvcD4KLTxwPlRoZSCRQ3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQnIHR1dG9yaWFsIHNob3dzIGhvdyB0byBjcmVhdGUgbmV3IGNvbnRlbnQgaW4gYSBwbHVnLWluLiBJbiB0aGlzIHR1dG9yaWFsIHdlIHdpbGwgc2VlIGhvdyB0byBleHRlbmQgZXhpc3RpbmcgY29udGVudCBpbiBhIHBsdWctaW4uIDwvcD4KLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+SW4gdGhlIGZvbGxvd2luZyBleGVyY2lzZXMgd2UgY3JlYXRlIHNlcGFyYXRlIENvbnRlbnQgUGFja2FnZXMgdG8gZGVtb25zdHJhdGUgZWFjaCBvZiB0aGUgd2F5cyB0aGF0IGEgbWV0aG9kIHBsdWctaW4gY2FuIG1vZGlmeSBjb250ZW50IGluIGFub3RoZXIgcGx1Zy1pbiAoaS5lLiBleHRlbmRzLCByZXBsYWNlcywgYW5kL29yIGNvbnRyaWJ1dGVzKS4gVGhpcyBpcyBmb3IgZWFzeSBpbGx1c3RyYXRpb24gb2YgdGhlIGVmZmVjdCBvZiBhcHBseWluZyBlYWNoIHR5cGUgb2YgbWV0aG9kIGVsZW1lbnQgdmFyaWFiaWxpdHkuIDwvcD4KLU1hbmFnaW5nIGNvbnRlbnQgdmlhIHRoZSBNZXRob2QgUGx1Zy1pbiBtZWNoYW5pc20gaXMgYSBrZXkgYW5kIHZlcnkgcG93ZXJmdWwgZmVhdHVyZSBvZiBFUEYgQ29tcG9zZXIuIFRoaXMgdHV0b3JpYWwgZXhwbG9yZXMgdGhlIGVmZmVjdHMgb2YgdGhlIGRpZmZlcmVudCB2YXJpYWJpbGl0eSB0eXBlcyBpbiB0aGUgZm9sbG93aW5nIGV4ZXJjaXNlcy4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzEuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjMzM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgMTogUHVibGlzaGluZyBhIHByZS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHB1Ymxpc2ggYSA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gPC9zdHJvbmc+dGhhdCBpcyBpbmNsdWRlZCBpbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IHRoZSA8c3Ryb25nPkF1dGhvcmluZyA8L3N0cm9uZz4gcGVyc3BlY3RpdmUuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBJbiB0aGUgPHN0cm9uZz5MaWJyYXJ5IFZpZXc8L3N0cm9uZz4sIG9wZW4gdGhlIENvbmZpZ3VyYXRpb25zIGZvbGRlciBhbmQgc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uOiBNeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzLiBUaGlzIG9wZW5zIHRoZSBDb25maWd1cmF0aW9uIEVkaXRvci4gCi0gICAgPHA+VGhlIFBsdWcgaW4gYW5kIFBhY2thZ2UgU2VsZWN0aW9uIHRhYiBzaG93cyB0aGUgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHdpdGhpbiBlYWNoIHBsdWctaW4gdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIENvbmZpZ3VyYXRpb24uIFRoZSBwbHVnLWlucyBhbmQgcGFja2FnZXMgaW4gdGhlIENvbmZpZ3VyYXRpb24gY2FuIGJlIGFkanVzdGVkIGJ5IHNlbGVjdGluZyBhbmQgZGVzZWxlY3RpbmcgdGhlbSBpbiB0aGUgdHJlZSBkaXNwbGF5LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgUmV2aWV3IDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz48c3Ryb25nPlZpZXdzIDwvc3Ryb25nPjogKGkuZS4gaG93IHRoZSBwdWJsaXNoZWQgc2l0ZSB3aWxsIGJlIGxhaWQgb3V0KS4gCi0gICAgPHA+U2VsZWN0IHRoZSA8c3Ryb25nPlZpZXdzIDwvc3Ryb25nPiB0YWIgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWRpdG9yLiBBIFZpZXcgaXMgYSBDdXN0b20gQ2F0ZWdvcnkgdGhhdCBpcyBkZXNpZ25lZCBmb3IgcHVibGljYXRpb24uIFJlcXVpcmVkIHBhY2thZ2VzIGFuZCBjb250ZW50IGVsZW1lbnRzIGFyZSBhc3NpZ25lZCB0byBhIEN1c3RvbSBDYXRlZ29yeS4gVGhlIEN1c3RvbSBDYXRlZ29yeSBjYW4gdGhlbiBiZSBhZGRlZCBhcyBhIFZpZXcgdG8gYSBDb25maWd1cmF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgU2VsZWN0IDxzdHJvbmc+RGVmYXVsdDwvc3Ryb25nPiBWaWV3LgotICAgIDxwPk9uZSBvZiB0aGUgdmlld3MgY2FuIGJlIHNlbGVjdGVkIGFzIHRoZSBEZWZhdWx0IFZpZXcgYnkgc2VsZWN0aW5nIHRoZSBWaWV3IGFuZCBjbGlja2luZyB0aGUgkU1ha2UgRGVmYXVsdCcgYnV0dG9uLiBXaGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIHB1Ymxpc2hlZCwgdGhlIERlZmF1bHQgVmlldyB3aWxsIGJlIHNlbGVjdGVkIHdoZW4gdGhlIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIG9wZW5lZCBpbiB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbG9zZSB0aGUgY29uZmlndXJhdGlvbiBlZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGluIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBib3ggaW4gdGhlIEVQRiBDb21wb3NlciB0b29sYmFyLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gU2VsZWN0IDxzdHJvbmc+Q29uZmlndXJhdGlvbiAmZ3Q7IFB1Ymxpc2ggPC9zdHJvbmc+IGZyb20gdGhlIG1haW4gbWVudSBiYXIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBTdGVwIHRocm91Z2ggUHVibGlzaCB3aXphcmQsIGFjY2VwdGluZyB0aGUgZGVmYXVsdHMsIGFuZCBwdWJsaXNoIHRoZSBjb25maWd1cmF0aW9uLiBJdCB3aWxsIHRha2UgYSBmZXcgbWludXRlcyB0byBnZW5lcmF0ZSB0aGUgd2ViIHNpdGUuIEFzc3VtaW5nIHRoYXQgeW91IGhhdmUgdGhlIHJpZ2h0IGphdmEgZW52aXJvbm1lbnQsIHRoZSBFUEYgQ29tcG9zZXIgQnJvd3NlciBhcHBsZXQgc2hvdWxkIGxhdW5jaCBhbGxvd2luZyB5b3UgdG8gdmlldyB0aGUgcmVzdWx0aW5nIHB1Ymxpc2hlZCB3ZWIgc2l0ZSAoYWNjZXB0IHRoZSBzZWN1cml0eSB3YXJuaW5ncyB3aGVuIHRoZSBhcHBsZXQgZmlyZXMgdXApLiA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD48c3Ryb25nPk5vdGU6IDwvc3Ryb25nPiBUaGUgcHVibGlzaGVkIHdlYiBzaXRlIGhhcyBhIHJpY2hlciBvcmdhbml6YXRpb24gYW5kIGxheS1vdXQgYXMgZGVmaW5lZCBieSB0aGUgQ29uZmlndXJhdGlvbiBWaWV3LCBhcyBjb21wYXJlZCB0byB0aGUgbW9yZSBzaW1wbGUgdmlldyBvZiB0aGUgY29uZmlndXJhdGlvbiBjb250ZW50IGF2YWlsYWJsZSB3aXRoaW4gdGhlIEVQRiBDb21wb3NlciA8c3Ryb25nPkNvbmZpZ3VyYXRpb24gVmlldzwvc3Ryb25nPi4gPC9wPgotPC9ibG9ja3F1b3RlPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfZXhfMi5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8yLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjOGUzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8yLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08aHRtbD4KLTxoZWFkPgotPHRpdGxlPlVudGl0bGVkIERvY3VtZW50PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLTwhLS0KLS5zdHlsZTEge2ZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vfQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48YT5FeGVyY2lzZSAyOiBDcmVhdGUgTmV3IEN1c3RvbSBDYXRlZ29yeSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gdW5kZXJzdGFuZCBhbmQgdXNlIDxzdHJvbmc+Q3VzdG9tIENhdGVnb3JpZXMgPC9zdHJvbmc+LiA8L3A+Ci08cD48c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzIDwvc3Ryb25nPiBhbGxvdyB5b3UgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGFjY29yZGluZyB0byBhbnkgc2NoZW1lIHlvdSB3YW50LiBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbXBvc2UgcHVibGlzaGFibGUgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gcHJvdmlkaW5nIGEgbWVhbnMgdG8gb3JnYW5pemUgbWV0aG9kIGNvbnRlbnQgcHJpb3IgdG8gcHVibGlzaGluZy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE5hdmlnYXRlIHRvIDxzdHJvbmc+TXkgUGx1Zy1pbiAmZ3Q7IE1ldGhvZCBDb250ZW50ICZndDsgQ3VzdG9tIENhdGVnb3JpZXM8L3N0cm9uZz4uIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGNyZWF0ZWQgdGhpcyBwbHVnaW4sIGNyZWF0ZSBpdCBub3csIG9yIGdvIHRocm91Z2ggdGhlIDx1PkNyZWF0ZSBDb3JlIE1ldGhvZCBDb250ZW50PC91PiB0dXRvcmlhbC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBjdXN0b20gY2F0ZWdvcnkgbmFtZWQsIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2N1c3RvbV9jYXRlZ29yeTwvc3Bhbj4uIFJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPkN1c3RvbSBDYXRlZ29yaWVzPC9zdHJvbmc+IGZvbGRlciwgaGlnaGxpZ2h0IDxzdHJvbmc+TmV3LCA8L3N0cm9uZz4gYW5kIHRoZW4gY2xpY2sgPHN0cm9uZz5DdXN0b20gQ2F0ZWdvcnkgPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgT3BlbiB0aGUgPHN0cm9uZz5Bc3NpZ24gPC9zdHJvbmc+IHRhYi4gSWYgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbnRlbnRfcGFja2FnPC9zcGFuPmUsIGFkZCB0aGUgPHN0cm9uZz5yb2xlcyA8L3N0cm9uZz4sIDxzdHJvbmc+YXJ0aWZhY3RzPC9zdHJvbmc+LCA8c3Ryb25nPnRhc2tzLCA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+Z3VpZGFuY2UgPC9zdHJvbmc+IGZyb20gaXQgaW50byB0aGUgY3VzdG9tIGNhdGVnb3J5LiBJZiB5b3UgZG8gbm90IGhhdmUgdGhpcyBwYWNrYWdlLCBhZGQgY29udGVudCBmcm9tIGFub3RoZXIgYXJlYSBpbiB0aGUgbGlicmFyeS4gPC9saT4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gWW91IGNhbiBkbyBtdWx0aXBsZSBzZWxlY3QgdXNpbmcgc2hpZnQgb3IgY29udHJvbCBrZXkgLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPGxpPgotICAgIDxwPiBBZGQgdGhlIDxzcGFuIGNsYXNzPSJzdHlsZTEiPnJ1cF9hbmFseXNpc19kZXNpZ25fZGlzY2lwbGluZTwvc3Bhbj4uIFlvdSB3aWxsIGZpbmQgdGhpcyB1bmRlciA8c3Ryb25nPlJVUCAmZ3Q7IERpc2NpcGxpbmVzICZndDsgcnVwX2Rpc2NpcGxpbmVzLiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gT3BlbiBvbmUgb2YgdGhlIGVsZW1lbnRzIHlvdSBhc3NpZ25lZCB0byB0aGUgbmV3IGN1c3RvbSBjYXRlZ29yeS4gT2JzZXJ2ZSBob3cgdGhlIGN1c3RvbSBjYXRlZ29yeSBpcyBub3cgcmVmbGVjdGVkIGluIHRoZSA8c3Ryb25nPkNhdGVnb3JpZXMgPC9zdHJvbmc+IHRhYi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF8zLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQxMzliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotPCEtLQotLnN0eWxlMSB7Zm9udC1mYW1pbHk6ICJDb3VyaWVyIE5ldyIsIENvdXJpZXIsIG1vbm99Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDM6IENyZWF0ZSBhIGN1c3RvbWl6ZWQgY29uZmlndXJhdGlvbiA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgZXhlcmNpc2UgaXMgdG8gY3JlYXRlIHlvdXIgb3duIGN1c3RvbWl6ZWQgY29uZmlndXJhdGlvbi4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+TWFrZSBzdXJlIHlvdSBhcmUgaW4gdGhlIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5GaWxlICZndDsgTmV3ICZndDsgQ29uZmlndXJhdGlvbjwvc3Ryb25nPi4gT3IsIHlvdSBjYW4gcmlnaHQtY2xpY2sgb24gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbnM8L3N0cm9uZz4gZm9sZGVyIGluIHRoZSBMaWJyYXJ5IFZpZXcgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDb25maWd1cmF0aW9uLiA8L3N0cm9uZz5UaGUgQ29uZmlndXJhdGlvbiBFZGl0b3IgaXMgbGF1bmNoZWQuPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IE5hbWUgdGhlIGNvbmZpZ3VyYXRpb24sIDxzcGFuIGNsYXNzPSJzdHlsZTEiPm15X2NvbmZpZ3VyYXRpb248L3NwYW4+LjwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDbGljayBvbiB0aGUgPHN0cm9uZz5QbHVnLWluIGFuZCBQYWNrYWdlIFNlbGVjdGlvbiA8L3N0cm9uZz4gdGFiLiBJbiB0aGUgbGlzdCBvZiBQbHVnaW5zLCBjaGVjayBNeSBQbHVnaW4gdGhhdCB5b3UgY3JlYXRlZCBpbiB0aGUgPHU+Q3JlYXRlIENvcmUgTWV0aG9kIENvbnRlbnQ8L3U+IHR1dG9yaWFsLiBUaGlzIHBsdWdpbiBoYXMgUlVQIGFzIGEgYmFzZSBhbmQgcmVmZXJlbmNlcyBwYXJ0cyBvZiB0aGUgUlVQIGNvbnRlbnQsIGFuZCBhbHNvIGhhcyBlbGVtZW50cyB0aGF0IGV4dGVuZCwgY29udHJpYnV0ZSB0bywgYW5kIHJlcGxhY2UgYmFzZSBSVVAgY29udGVudC4gPGJyPgotICAgICAgSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgcGx1Z2luLCBjb25zaWRlciBjb21wbGV0aW5nIHRoZSA8dT5DcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudDwvdT4gdHV0b3JpYWwgYmVmb3JlIGNvbnRpbnVpbmcgd2l0aCB0aGlzIHR1dG9yaWFsLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gVGhlIGRpc3BsYXkgd2lsbCBnaXZlIHlvdSBhIHNlcmllcyBvZiB3YXJuaW5ncyBhbmQgdGhlIExpYnJhcnkgRXJyb3IgTG9nIHZpZXcgd2lsbCBiZSBkaXNwbGF5ZWQuIDxicj4KLSAgICAgIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgZ2l2ZXMgdGhlc2Ugd2FybmluZ3MgdG8gaGVscCBlbnN1cmUgdGhhdCB5b3UgY3JlYXRlIGEgY29uZmlndXJhdGlvbiB0aGF0IJFtYWtlcyBzZW5zZScuIElmIHlvdSByZWZlcmVuY2UgYW4gZWxlbWVudCwgeW91IHdpbGwgb25seSBiZSBhYmxlIHRvIHNlZSB0aGUgZnVsbCBkZXRhaWxzIGZvciB0aGF0IGVsZW1lbnQgaW4gYSBwdWJsaXNoZWQgd2ViIHNpdGUgaWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbi4gSWYgdGhlIHBhY2thZ2UgY29udGFpbmluZyB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIHRoZSCRb2ZmZW5kaW5nJyBwYWNrYWdlIGlzIG1hcmtlZCBhcyBhIHdhcm5pbmcgliB5b3UgbWF5IGNob29zZSBub3QgdG8gaW5jbHVkZSB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDaGVjayB0aGUgPHN0cm9uZz5BZGQgTWlzc2luZyBSZWZlcmVuY2VzPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgYW5kIHJlY3Vyc2l2ZWx5IGFkZCBwYWNrYWdlcyBjb250YWluaW5nIGFueSBlbGVtZW50cyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIGFscmVhZHkgc2VsZWN0ZWQgcGFja2FnZXMuIEV4cGxvcmUgd2hhdCBwYWNrYWdlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24uIFlvdSB3aWxsIHByb2JhYmx5IG5vdyBzZWUgYWxsIG9mIFJVUCBzZWxlY3RlZC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSBpbnRlci1jb25uZWN0ZWQgbmF0dXJlIG9mIFJVUC4gVW5jaGVjayBSVVAgdG8gcmVzdG9yZSB0aGUgd2FybmluZ3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBEcmlsbCBkb3duIGludG8gdGhlIGNvbnRlbnQgcGFja2FnZXMgaW4gdGhlIE15IFBsdWdpbiwgcGx1Z2luIHBhY2thZ2UgICBieSBjbGlja2luZyBvbiB0aGUgPHN0cm9uZz4rPC9zdHJvbmc+IHNpZ25zLiBVbmNoZWNrIHRoZTxzdHJvbmc+IEV4dGVuZHMgVGVzdCA8L3N0cm9uZz5hbmQgPHN0cm9uZz5SZXBsYWNlIFRlc3QgPC9zdHJvbmc+Y29udGVudCBwYWNrYWdlcy4gVW5jaGVja2luZyB0aGVzZSBhdm9pZHMgY29uZmxpY3RzIHRoYXQgbWF5IG9jY3VyIGJlY2F1c2UgdGhlIHNhbWUgYmFzZSBlbGVtZW50IGlzIGFmZmVjdGVkIGJ5IHRoZSBwbHVnaW5zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gVGhlcmUgc2hvdWxkIGJlIGEgPHN0cm9uZz4rPC9zdHJvbmc+IGJ5IHRoZSA8c3Ryb25nPkNvbnRyaWJ1dGlvbiBUZXN0PC9zdHJvbmc+IHBhY2thZ2UuIENsaWNrIHRoZSA8c3Ryb25nPk1ha2UgQ2xvc3VyZSBieSBGaXhpbmcgRXJyb3JzPC9zdHJvbmc+IGJ1dHRvbi4gVGhpcyBhdXRvbWF0aWNhbGx5IG1ha2VzIHlvdXIgY29uZmlndXJhdGlvbiBjb21wbGV0ZSBiYXNlZCBvbiB3aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZC4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IERyaWxsIGRvd24gaW50byB0aGUgUlVQIHBsdWdpbiwgYW5kIHNlZSB3aGF0IHBhY2thZ2VzIGhhdmUgYmVlbiBzZWxlY3RlZC4gVGhlc2Ugd2lsbCBiZSB0aGUgcGFja2FnZXMgdGhhdCBjb250YWluIHRoZSBlbGVtZW50cyB1c2VkIGFzIGJhc2UgZWxlbWVudHMgaW4gdGhlIENvbmZpZ3VyYXRpb24gVGVzdCBjb250ZW50IHBhY2thZ2UuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayBvbiB0aGUgPHN0cm9uZz5WaWV3czwvc3Ryb25nPiB0YWIuIAotICAgIDxwPkFueSBjdXN0b20gY2F0ZWdvcnkgY2FuIGJlIGFkZGVkIGFzIGEgdmlldyB0byBhIGNvbmZpZ3VyYXRpb24uIFlvdSBjYW4gY3JlYXRlZCBhbnkgbnVtYmVyIG9mIGN1c3RvbSBjYXRlZ29yaWVzIGFuZCB0aGV5IGFyZSB2ZXJ5IGZsZXhpYmxlIGluIHRlcm1zIG9mIHRoZSBjb250ZW50IHRoYXQgeW91IGNhbiBhZGQgdG8gYSBjdXN0b20gY2F0ZWdvcnkgYW5kIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29udGVudCBhcHBlYXJzLiA8L3A+Ci0gICAgPHA+QWRkIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IGN1c3RvbSBjYXRlZ29yeSBhcyBhIHZpZXcgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIDwvcD4KLSAgICA8cD5FeHBlcmltZW50IHdpdGggYWRkaW5nIG90aGVyIGN1c3RvbSBjYXRlZ29yaWVzIGFzIHZpZXdzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gTWFrZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IHRoZSBkZWZhdWx0IHZpZXcgYnkgc2VsZWN0aW5nIHRoZSA8c3BhbiBjbGFzcz0ic3R5bGUxIj5teV9jdXN0b21fY2F0ZWdvcnk8L3NwYW4+IHRhYiBhbmQgY2xpY2tpbmcgdGhlIDxzdHJvbmc+TWFrZSBEZWZhdWx0PC9zdHJvbmc+IGJ1dHRvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgY2xvc2luZyB0aGUgQ29uZmlndXJhdGlvbiBFZGl0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHNwYW4gY2xhc3M9InN0eWxlMSI+bXlfY29uZmlndXJhdGlvbjwvc3Bhbj4gaW4gdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGJveCBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4uIFlvdSB3aWxsIHNlZSB0aGUgaXRlbXMgZGlzcGxheWVkIGluIHRoZSBDb25maWd1cmF0aW9uIFZpZXcgY2hhbmdlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3dpdGNoIHRvIHRoZSA8c3Ryb25nPkJyb3dzaW5nPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiBFeHBsb3JlIHRoZSBjb250ZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZpZXcuIFlvdSBzaG91bGQgc2VlIHRoZSBjb250ZW50IHlvdSBjcmVhdGVkIGluIHlvdXIgcGx1Z2lucyBhbmQgc29tZSBSVVAgY29udGVudC4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9leF80Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDhiZTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF80X2V4XzQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDQ6IFB1Ymxpc2hpbmcgYSBjdXN0b20gY29uZmlndXJhdGlvbiA8L2E+PC9oMj4KLTxvbD4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5Db25maWd1cmF0aW9uICZndDsgUHVibGlzaCA8L3N0cm9uZz4gZnJvbSB0aGUgbWFpbiBtZW51IGJhci4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCBteS1jb25maWd1cmF0aW9uIGluIHRoZSBsaXN0IG9mIGNvbmZpZ3VyYXRpb25zLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gU3RlcCB0aHJvdWdoIFB1Ymxpc2ggd2l6YXJkLCBhY2NlcHRpbmcgdGhlIGRlZmF1bHRzLCBhbmQgcHVibGlzaCB0aGUgY29uZmlndXJhdGlvbi4gSXQgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gZ2VuZXJhdGUgdGhlIHdlYiBzaXRlLiBBc3N1bWluZyB0aGF0IHlvdSBoYXZlIHRoZSByaWdodCBqYXZhIGVudmlyb25tZW50LCB0aGUgRVBGIENvbXBvc2VyIEJyb3dzZXIgYXBwbGV0IHNob3VsZCBsYXVuY2ggYWxsb3dpbmcgeW91IHRvIHZpZXcgdGhlIHJlc3VsdGluZyBwdWJsaXNoZWQgd2ViIHNpdGUgKGFjY2VwdCB0aGUgc2VjdXJpdHkgd2FybmluZ3Mgd2hlbiB0aGUgYXBwbGV0IGZpcmVzIHVwKS4gPC9saT4KLTwvb2w+Ci08YmxvY2txdW90ZT4KLSAgPHA+PHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz4gVGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZSBoYXMgYSByaWNoZXIgb3JnYW5pemF0aW9uIGFuZCBsYXktb3V0IGFzIGRlZmluZWQgYnkgdGhlIENvbmZpZ3VyYXRpb24gVmlldywgYXMgY29tcGFyZWQgdG8gdGhlIG1vcmUgc2ltcGxlIHZpZXcgb2YgdGhlIGNvbmZpZ3VyYXRpb24gY29udGVudCBhdmFpbGFibGUgd2l0aGluIHRoZSBFUEYgQ29tcG9zZXIgPHN0cm9uZz5Db25maWd1cmF0aW9uIFZpZXcgPC9zdHJvbmc+LiA8L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9pbnRyby5odG0gYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNF9pbnRyby5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWRiN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzRfaW50cm8uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPjxhPlR1dG9yaWFsOiBQdWJsaXNoaW5nIGFuZCBFeHBvcnRpbmcgPC9hPjwvaDE+Ci08cD5FUEYgQ29tcG9zZXIgaXMgZXNzZW50aWFsbHkgYSBjb250ZW50IG1hbmFnZW1lbnQgYXBwbGljYXRpb24uIFRoZSB1bHRpbWF0ZSBvdXRwdXQgb2YgRVBGIENvbXBvc2VyIGlzIGEgV2ViIHNpdGUgd2l0aCBwdWJsaXNoZWQgbWV0aG9kIGd1aWRhbmNlIGFuZCBwcm9jZXNzZXMgdGhhdCBjYW4gYmUgdmlld2VkIGJ5IGEgcHJvamVjdCB0ZWFtLiA8L3A+Ci08cD5FUEYgQ29tcG9zZXIgbWFrZXMgaXQgZWFzeSB0byBjb25maWd1cmUgYSBwcm9jZXNzIGZvciBhIHBhcnRpY3VsYXIgdHlwZSBvciBzaXplIG9mIHByb2plY3QgYW5kIHRvIHB1Ymxpc2ggdGhlIGd1aWRhbmNlIHRvIGEgV2ViIHNpdGUuIEEgTWV0aG9kIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gaXMgYSBzZWxlY3Rpb24gb2YgPHN0cm9uZz5Db250ZW50IFBhY2thZ2VzIDwvc3Ryb25nPiBhY3Jvc3MgZGlmZmVyZW50IDxzdHJvbmc+TWV0aG9kIFBsdWctaW5zIDwvc3Ryb25nPiBjb250YWluaW5nIHRoZSBtZXRob2QgYW5kIHByb2Nlc3MgY29udGVudCB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4gQXQgcHVibGlzaGluZyB0aW1lLCB0aGUgY29uZmlndXJhdGlvbiBpcyBjb21iaW5lZCB3aXRoIGRpZmZlcmVudCBNZXRob2QgPHN0cm9uZz5WaWV3cyA8L3N0cm9uZz4gd2hpY2ggZGVmaW5lIHRoZSB3ZWJzaXRlJ3MgbmF2aWdhdGlvbiBzdHJ1Y3R1cmVzIGFuZCBjb250ZW50IG9yZ2FuaXphdGlvbi4gPC9wPgotPHA+VGhlIEVQRiBDb21wb3NlciA8c3Ryb25nPkJyb3dzaW5nIFBlcnNwZWN0aXZlIDwvc3Ryb25nPiByZW5kZXJzIHRoZSBNZXRob2QgPHN0cm9uZz5Db25maWd1cmF0aW9uIDwvc3Ryb25nPiBjb250ZW50IGluIGh0bWwgZm9ybWF0IHdpdGhpbiBFUEYgQ29tcG9zZXIsIHByb3ZpZGluZyBhIG5hdmlnYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgY29udGVudCBhc3NvY2lhdGVkIHdpdGggdGhhdCBDb25maWd1cmF0aW9uLiA8L3A+Ci08cD5UaGlzIHR1dG9yaWFsIHVzZXMgY29udGVudCB0aGF0IGlzIGNyZWF0ZWQgaW4gdGhlIJFDcmVhdGUgQ29yZSBNZXRob2QgQ29udGVudCcgYW5kIJFFeHRlbmRpbmcgYmFzZSBtZXRob2QgY29udGVudCB1c2luZyBWYXJpYWJpbGl0eScgdHV0b3JpYWxzLiA8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8xLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjJiODFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPkV4ZXJjaXNlIDE6IEJyb3dzZSBQcm9jZXNzIENvbnRlbnQgdXNpbmcgQnJvd3NpbmcgUGVyc3BlY3RpdmUgPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGdldCBhIGJhc2ljIHVuZGVyc3RhbmRpbmcgb2YgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gPC9wPgotPHA+KE5vdGUgdGhhdCB0aGlzIGlzIGEgcmVwZWF0IG9mIGV4ZXJjaXNlIDIgaW4gdGhlIDx1PkJyb3dzZSB0aGUgTGlicmFyeTwvdT4gdHV0b3JpYWwuKSA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5NYWtlIHN1cmUgeW91IGFyZSBpbiB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFNlbGVjdCB0aGUgPHN0cm9uZz5NeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzPC9zdHJvbmc+IGNvbmZpZ3VyYXRpb24uIElmIHlvdSBoYXZlIG5vdCBjcmVhdGVkIHRoaXMgY29uZmlndXJhdGlvbiwgc2VsZWN0IHRoZSA8c3Ryb25nPlJVUCBmb3IgU21hbGwgUHJvamVjdHM8L3N0cm9uZz4gY29uZmlndXJhdGlvbi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFRvIHZpZXcgYSBDYXBhYmlsaXR5IFBhdHRlcm4sIGNsaWNrIDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgQ2FwYWJpbGl0eSBQYXR0ZXJucyAmZ3Q7IENsYXNzaWMgUlVQICZndDsgRGlzY2lwbGluZSBXb3JrZmxvd3MgJmd0OyBBbmFseXNpcyBhbmQgRGVzaWduPC9zdHJvbmc+LiBBIHByZXZpZXcgb2YgdGhlIHB1Ymxpc2hlZCBXZWIgcGFnZSBmb3IgdGhlIHNlbGVjdGVkIENhcGFiaWxpdHkgUGF0dGVybiBpcyBkaXNwbGF5ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBBIENhcGFiaWxpdHkgUGF0dGVybiBjb250YWlucyBhIGxhcmdlIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBhbmQgaXMgZGlzcGxheWVkIG92ZXIgZm91ciB0YWJzIJYgPHN0cm9uZz5EZXNjcmlwdGlvbiwgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgVXNhZ2UsIDwvc3Ryb25nPmFuZDxzdHJvbmc+IFRlYW0gQWxsb2NhdGlvbjwvc3Ryb25nPi4gRXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gb24gZWFjaCB0YWIuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRvIHZpZXcgYSBEZWxpdmVyeSBQcm9jZXNzLCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IERlbGl2ZXJ5IFByb2Nlc3NlcyAmZ3Q7IENsYXNzaWMgUlVQIExpZmVjeWNsZTwvc3Ryb25nPi4gVGhlIGRpc3BsYXkgZm9yIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBzaW1pbGFyIHRvIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuLiA8L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzIuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGVmYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDI6IEV4cGxvcmUgYSBQcm9jZXNzIHVzaW5nIEF1dGhvcmluZyBwZXJzcGVjdGl2ZSA8L2E+PC9oMj4KLTxwPlRoZSBwdXJwb3NlIG9mIHRoaXMgdHV0b3JpYWwgaXMgdG8gZXhwbG9yZSB0aGUgaW5mb3JtYXRpb24gYW5kIGVkaXRvcnMgZm9yIHByb2Nlc3Nlcy4gQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgdXNlZCBhcyBhbiBleGFtcGxlIGJ1dCB0aGUgc2FtZSBhcHBsaWVzIHRvIERlbGl2ZXJ5IFByb2Nlc3Nlcy4gPC9wPgotPG9sPgotICA8bGk+Ci0gICAgPHA+U3dpdGNoIHRvIDxzdHJvbmc+QXV0aG9yaW5nIDwvc3Ryb25nPiBwZXJzcGVjdGl2ZS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+SW4gdGhlIExpYnJhcnkgVmlldywgY2xpY2sgPHN0cm9uZz5SVVAgJmd0OyBQcm9jZXNzZXMgJmd0OyBDYXBhYmlsaXR5IFBhdHRlcm5zICZndDsgQ2xhc3NpYyBSVVAgJmd0OyBEaXNjaXBsaW5lIFdvcmtmbG93czwvc3Ryb25nPi4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RG91YmxlIGNsaWNrIHRoZSA8c3Ryb25nPkFuYWx5c2lzIGFuZCBEZXNpZ24gQ2FwYWJpbGl0eSBQYXR0ZXJuPC9zdHJvbmc+IGFuZCBleGFtaW5lIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPlRoZSA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+IHRhYiBwcm92aWRlcyBhIG51bWJlciBvZiBzZWN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGZ1bGx5IGRlc2NyaWJlIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIAotICAgIDxwPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYXQgbGVhc3Qgb25lIGNvbmZpZ3VyYXRpb24gYnV0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbWFueS4gVGhlIGNvbmZpZ3VyYXRpb24gc2V0cyB0aGUgc2NvcGUgZm9yIGNvcmUgbWV0aG9kIGNvbnRlbnQgYW5kIG90aGVyIHByb2Nlc3MgZWxlbWVudHMgdGhhdCBjYW4gYmUgaW5jbHVkZWQgaW4gYSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgQWN0aXZpdGllcyBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIGFuZCB0aGUgKGNvcmUgbWV0aG9kIGNvbnRlbnQpIHRhc2tzIHRoYXQgYXJlIGluY2x1ZGVkIGluIGVhY2ggQWN0aXZpdHkuIDwvcD4KLSAgICA8cD5XaGVuIGEgdGFzayBpcyBhZGRlZCB0byBhIHByb2Nlc3MsIHRoZSByb2xlcyBhbmQgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYXJlIGFsc28gcHVsbGVkIGludG8gdGhlIHByb2Nlc3MuIDwvcD4KLSAgICA8cD5FYWNoIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3Qgc2hvd24gaW4gdGhlIGFjdGl2aXR5IGlzIGFjdHVhbGx5IGFuIGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGFzIGl0IGlzIHVzZWQgYXQgdGhlIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGhlIHByb2Nlc3MuIFNvIHdoYXQgeW91IHNlZSBpbiB0aGUgcHJvY2VzcyBhcmUgYWN0dWFsbHkgVGFzayBEZXNjcmlwdG9ycywgUm9sZSBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+VGVhbSBBbGxvY2F0aW9uPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgYWN0aXZpdGllcyBpbiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCB0aGUgcm9sZXMgdGhhdCBhcmUgdGhlIHBlcmZvcm1lcnMgb2YgdGhlIHRhc2tzIGluIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4gICAgQ2xpY2sgdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0IFVzYWdlPC9zdHJvbmc+IHRhYi4gCi0gICAgPHA+VGhpcyBzaG93cyB0aGUgYWN0aXZpdGllcyBpbiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCB0aGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBpbnB1dCBhbmQgb3V0cHV0cyBvZiB0aGUgdGFza3MgaW4gdGhlIGFjdGl2aXRpZXMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBDbGljayBvbiB0aGUgPHN0cm9uZz5Db25zb2xpZGF0ZWQgVmlldzwvc3Ryb25nPiB0YWIuIAotICAgIDxwPlRoaXMgc2hvd3MgdGhlIGZ1bGwgc2V0IG9mIGluZm9ybWF0aW9uIGZvciBlYWNoIGFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4uIEl0IHNob3dzIHRoZSB0YXNrcywgd29yayBwcm9kdWN0cyBhbmQgcm9sZXMgd2l0aGluIGVhY2ggYWN0aXZpdHkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICBSaWdodCBjbGljayBhbnkgPHN0cm9uZz50YXNrIDwvc3Ryb25nPiBpbiB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgdmlldywgPC9zdHJvbmc+IGFuZCBjbGljayBvbiA8c3Ryb25nPlNob3cgUHJvcGVydGllcyBWaWV3PC9zdHJvbmc+LiAKLSAgICA8cD5UaGlzIGRpc3BsYXlzIGEgbmV3IHZpZXcgdGhhdCBzaG93cyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YXNrICh0YXNrIGRlc2NyaXB0b3IpIGFzIGl0IGlzIHVzZWQgaW4gdGhlIHByb2Nlc3MgYW5kIGFsbG93cyB5b3UgdG8gY3VzdG9taXplIHRoZSB0YXNrIGFzIGl0IGlzIHVzZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICAgIDxwPlRoZSBQcm9wZXJ0aWVzIFZpZXcgaGFzIGEgbnVtYmVyIG9mIHRhYnMgdGhhdCBvcmdhbml6ZSB0aGUgdGFzayBkZXNjcmlwdG9yIGluZm9ybWF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5DbGljayBvbiB0aGUgPHN0cm9uZz5Eb2N1bWVudGF0aW9uPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIGVudGVyIGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhpcyBUYXNrIERlc2NyaXB0b3IuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPkNsaWNrIG9uIHRoZSA8c3Ryb25nPlJvbGVzPC9zdHJvbmc+IHRhYi4gVGhpcyBhbGxvd3MgeW91IHRvIHJlcGxhY2UsIHJlbW92ZSBvciBhZGQgdG8gdGhlIHJvbGVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBtZXRob2QgdGFzayBmb3IgdGhpcyBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgdGFzayBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+V29yayBQcm9kdWN0czwvc3Ryb25nPiB0YWIuIFRoaXMgYWxsb3dzIHlvdSB0byByZXBsYWNlLCByZW1vdmUgb3IgYWRkIHRvIHRoZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29yZSBtZXRob2QgdGFzayBmb3IgdGhpcyBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgdGFzayBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBUaGlzIGFsbG93cyB5b3UgdG8gYWRqdXN0IHRoZSB0YXNrIHN0ZXBzIGFzIHRoZXkgYXJlIGFwcGxpZWQgYXQgdGhpcyBwb2ludCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+V2hlbiBhIHJvbGUgaXMgc2VsZWN0ZWQgaW4gdGhlIFRlYW0gQWxsb2NhdGlvbiB2aWV3LCBvciBhIHdvcmsgcHJvZHVjdCBpcyBzZWxlY3RlZCBpbiB0aGUgV29yayBQcm9kdWN0IFVzYWdlIHZpZXcsIHRoZSBQcm9wZXJ0aWVzIFZpZXcgYWxsb3dzIHlvdSB0byBlZGl0IHRoZXNlIGVsZW1lbnRzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5DbGljayBvbiBhbiA8c3Ryb25nPkFjdGl2aXR5PC9zdHJvbmc+IGluIHRoZSBwcm9jZXNzLiA8YnI+Ci0gICAgVGhlIHByb3BlcnRpZXMgdmlldyBhbGxvd3MgeW91IHRvIHNlZSByb2xsLXVwcyBvZiB0aGUgdGFza3MsIHJvbGVzLCBhbmQgd29yayBwcm9kdWN0cyBpbiB0aGUgYWN0aXZpdHkuIFJvbGwtdXBzIGNhbiBhbHNvIGJlIGRpc3BsYXllZCBpbiB0aGUgbWFpbiBjb250ZW50IHdpbmRvdyBieSBzZWxlY3RpbmcgdGhlIDxzdHJvbmc+Um9sbC1VcDwvc3Ryb25nPiBvcHRpb24gaW4gdGhlIGNvbnRleHQgc2Vuc2l0aXZlIG1lbnUuIFRoZSBSb2xsLVVwIHZpZXcgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2VsZWN0aW5nLCA8c3Ryb25nPlJvbGwtRG93bjwvc3Ryb25nPi4gPC9saT4KLTwvb2w+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9leF8zLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDM1YWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKLSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+VW50aXRsZWQgRG9jdW1lbnQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgyPjxhPjwvYT48YT5FeGVyY2lzZSAzOiBDcmVhdGUgYSBEZWxpdmVyeSBQcm9jZXNzIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBsZWFybiBob3cgdG8gY3JlYXRlIGEgZGVsaXZlcnkgcHJvY2VzcyB1c2luZyBjb3JlIG1ldGhvZCBjb250ZW50IGRpcmVjdGx5LiA8L3A+Ci08cD5JbiA8c3Ryb25nPlByb2Nlc3MgQXV0aG9yaW5nIDwvc3Ryb25nPiB3ZSBkbyBub3QgZGlyZWN0bHkgaW5jbHVkZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIGNvcmUgbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBXQlMgYnV0IHJhdGhlciBjcmVhdGUgbG9jYWwgcmVmZXJlbmNlcyB0ZXJtZWQgPHN0cm9uZz5kZXNjcmlwdG9ycyA8L3N0cm9uZz4gdGhhdCByZWZlciBiYWNrIHRvIHRoZSBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkgYnV0IGFsc28gY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYXQgaXMgb25seSByZWxldmFudCB0byB0aGUgbG9jYWwgcHJvY2Vzcy4gPC9wPgotPHA+RGVzY3JpcHRvcnMgYWxzbyBwcm92aWRlIGEgbWVjaGFuaXNtIHdoZXJlYnkgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGluIGNvcmUgbWV0aG9kIGF1dGhvcmluZyAoZS5nLiByb2xlcyBhc3NvY2lhdGVkIHdpdGggYSB0YXNrLCBpbnB1dCBhbmQgb3V0cHV0LCB3b3JrIHByb2R1Y3RzLCBldGMuKSwgY2FuIGJlIGRlZmluZWQgb3IgY2hhbmdlZCBsb2NhbGx5IHdpdGhpbiB0aGUgcHJvY2Vzcy4gPC9wPgotPG9sPgotICA8bGk+ICAgIENyZWF0ZSBhIG5ldyBEZWxpdmVyeSBQcm9jZXNzIGluIHRoZSBNeSBQbHVnaW4sIHBsdWctaW4gY2FsbGVkLCBNeSBSVVAuIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPldoZW4geW91IGNyZWF0ZSBhIHByb2Nlc3MgeW91IGFyZSBhc2tlZCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBDb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGUgcHJvY2Vzcy4gU2VsZWN0IHRoZSBNeSBSVVAgZm9yIFNtYWxsIFByb2plY3RzIGNvbmZpZ3VyYXRpb24uIElmIHlvdSBuYXZlIG5vdCBjcmVhdGVkIHRoaXMgY29uZmlndXJhdGlvbiwgc2VsZWN0IFJVUCBmb3IgU21hbGwgUHJvamVjdHMuIDwvcD4KLSAgICA8cD5BIHByb2Nlc3MgaGFzIGEgaGllcmFyY2h5IG9mIGFjdGl2aXRpZXMgYW5kIGNhbiBpbmNsdWRlIHRoZSBzcGVjaWFsIHR5cGVzIG9mIGFjdGl2aXR5IJYgUGhhc2VzIGFuZCBJdGVyYXRpb25zLiBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucy4gRmlyc3Qgb2YgYWxsLCB3ZSdsbCBjcmVhdGUgc29tZSBhY3Rpdml0aWVzIGRpcmVjdGx5IGFuZCByZXVzZSBzb21lIGNhcGFiaWxpdHkgcGF0dGVybnMgbGF0ZXIuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+IFRvIGNyZWF0ZSB0aGUgSW5jZXB0aW9uIFBoYXNlLCBpbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIHZpZXcsIHJpZ2h0IGNsaWNrIHRoZSA8c3Ryb25nPk15IFJVUCA8L3N0cm9uZz5Qcm9jZXNzLCBhbmQgdGhlbiBzZWxlY3QsIDxzdHJvbmc+TmV3IENoaWxkICZndDsgUGhhc2UgPC9zdHJvbmc+LiBDYWxsIHRoZSBQaGFzZSwgPHN0cm9uZz5JbmNlcHRpb248L3N0cm9uZz4uIDwvcD4KLSAgPC9saT4KLSAgPGxpPiAgICAKLSAgICA8cD5UbyBjcmVhdGUgdGhlIFJlcXVpcmVtZW50cyBEaXNjaXBsaW5lIGluIEluY2VwdGlvbiwgaW4gdGhlIDxzdHJvbmc+V29yayBCcmVha2Rvd24gU3RydWN0dXJlIDwvc3Ryb25nPiB2aWV3LCByaWdodCBjbGljayA8c3Ryb25nPkluY2VwdGlvbiwgPC9zdHJvbmc+IGFuZCBzZWxlY3QgPHN0cm9uZz5OZXcgPC9zdHJvbmc+PHN0cm9uZz5DaGlsZCAmZ3Q7IEFjdGl2aXR5IDwvc3Ryb25nPi4gQ2FsbCB0aGlzIDxzdHJvbmc+UmVxdWlyZW1lbnRzPC9zdHJvbmc+LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT5UbyBhZGQgVGFza3MgdG8gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eSwgaW4gdGhlIDxzdHJvbmc+Q29uZmlndXJhdGlvbiA8L3N0cm9uZz4gdmlldywgb3BlbiB0aGUgUmVxdWlyZW1lbnRzIERpc2NpcGxpbmUgYW5kIHRoZW4gZHJhZyBhbmQgZHJvcCB0aGUgZm9sbG93aW5nIHRhc2tzIG9udG8gdGhlIFJlcXVpcmVtZW50cyBBY3Rpdml0eSB5b3UgaGF2ZSBqdXN0IGNyZWF0ZWQ6ICA8L2xpPgotICA8YmxvY2txdW90ZT4KLSAgICA8cD4mIzE0OTsmbmJzcDsgRGV2ZWxvcCBWaXNpb24gPC9wPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBEZXRhaWwgdGhlIFNvZnR3YXJlIFJlcXVpcmVtZW50cyA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IEZpbmQgQWN0b3JzIGFuZCB1c2UgQ2FzZXMgPC9wPgotICAgIDxwPldoZW4geW91IGluY2x1ZGUgdGhlc2UgdGFza3MgaW4geW91ciBwcm9jZXNzLCB0aGUgYXNzb2NpYXRlZCByb2xlcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGUgcHJvY2Vzcy4gPC9wPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxsaT4KLSAgICA8cD4gWW91IGNhbiByZXZpZXcgdGhlIGluZm9ybWF0aW9uIGZvciBlYWNoIG1ldGhvZCBlbGVtZW50IGluIHRoZSA8c3Ryb25nPlByb3BlcnRpZXMgPC9zdHJvbmc+IHZpZXcuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBDdXN0b21pemUgdGhlIHN0ZXBzIGZyb20gdGhlIEZpbmQgQWN0b3JzIGFuZCBVc2UgQ2FzZXMgdGFzayBmb3IgdGhlIEluY2VwdGlvbiBwaGFzZS4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+RmluZCBBY3RvcnMgYW5kIFVzZSBDYXNlczwvc3Ryb25nPiB0YXNrIGRlc2NyaXB0b3IsIGFuZCBvcGVuIHRoZSA8c3Ryb25nPlByb3BlcnRpZXM8L3N0cm9uZz4gdmlldy4gQ2xpY2sgb24gdGhlIDxzdHJvbmc+U3RlcHM8L3N0cm9uZz4gdGFiLiBSZW1vdmUgdGhlIGxhc3QgZm91ciBzdGVwcyBhbmQgY2xvc2UgdGhlIHByb3BlcnRpZXMgdmlldy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IFN3aXRjaCB0byB0aGUgPHN0cm9uZz5Ccm93c2luZzwvc3Ryb25nPiBwZXJzcGVjdGl2ZSBhbmQgc2VsZWN0IDxzdHJvbmc+UHJvY2Vzc2VzICZndDsgRGVsaXZlcnkgUHJvY2Vzc2VzICZndDsgTXkgUlVQPC9zdHJvbmc+LiBUaGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlIHRhYiBpcyBkaXNwbGF5ZWQuIENsaWNrIG9uIDxzdHJvbmc+RmluZCBBY3RvcnMgYW5kIFVzZSBDYXNlczwvc3Ryb25nPi4gT25seSB0aGUgZmlyc3QgdGhyZWUgc3RlcHMgZnJvbSB0aGUgY29yZSBtZXRob2QgdGFzayBhcmUgaW5jbHVkZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPk1ha2Ugb3RoZXIgY2hhbmdlcyB0byB0aGUgdGFza3MgaW4gdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgeW91IGhhdmUganVzdCBjcmVhdGVkIGFuZCBzZWUgaG93IHRoZXkgYXJlIHJlZmxlY3RlZCB3aGVuIHlvdSB2aWV3IHRoZSBwcm9jZXNzIGluIHRoZSBCcm93c2luZyBwZXJzcGVjdGl2ZS48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzQuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjBkMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+RXhlcmNpc2UgNDogQ3JlYXRlIGEgbmV3IGRlbGl2ZXJ5IFByb2Nlc3MgdXNpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucy4gPC9hPjwvaDI+Ci08cD5UaGUgcHVycG9zZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIGxlYXJuIGhvdyB0byBjcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIHVzaW5nIDxzdHJvbmc+Q2FwYWJpbGl0eSBQYXR0ZXJucyA8L3N0cm9uZz4uIDwvcD4KLTxwPkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgcHJvY2VzcyCRZnJhZ21lbnQnLiBJdCByZXByZXNlbnRzIGEgcHJvY2VzcyB0aGF0IGNhbiBiZSByZXVzZWQgbWFueSB0aW1lcyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFuZCAvIG9yIGluIGRpZmZlcmVudCBwcm9jZXNzZXMuIE9yZ2FuaXppbmcgY29yZSBtZXRob2QgY29udGVudCBpbnRvIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIHRoZW4gdXNpbmcgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgdG8gY29uc3RydWN0IGZ1bGwgbGlmZS1jeWNsZSBkZWxpdmVyeSBwcm9jZXNzZXMgaXMgYSBrZXkgZmVhdHVyZSBvZiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLiA8L3A+Ci08cD5BIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgaW5jbHVkZWQgaW4gYW5vdGhlciBwcm9jZXNzIChhbm90aGVyIGNhcGFiaWxpdHkgcGF0dGVybiBvciBhIGRlbGl2ZXJ5IHByb2Nlc3MpIGluIHR3byB3YXlzOiA8L3A+Ci08YmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IENvcHkgliB0aGlzIGNyZWF0ZXMgYSBmdWxsIGNvcHkgb2YgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgdGFyZ2V0IHByb2Nlc3MgYnV0IGRvZXMgbm90IHJldGFpbiBhbnkgbGlua3MgYmFjayB0byB0aGUgb3JpZ2luYWwgY2FwYWJpbGl0eSBwYXR0ZXJuLiBUaGUgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSBjdXN0b21pemVkIGluIHRoZSBuZXcgcHJvY2Vzcy4gQW55IGNoYW5nZXMgdGhhdCBhcmUgc3Vic2VxdWVudGx5IG1hZGUgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgbm90IHJlZmxlY3RlZCBpbiB0aGUgcHJvY2VzcyBpbnRvIHdoaWNoIGl0IHdhcyBjb3BpZWQuIDwvcD4KLSAgPHA+JiMxNDk7Jm5ic3A7IEV4dGVuZHMgliB0aGlzIGV4dGVuZHMgdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBpbnRvIHRoZSBwcm9jZXNzLiBUaGUgcHJvY2VzcyByZXRhaW5zIGxpbmtzIHRvIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gYW5kIGFueSBzdWJzZXF1ZW50IGNoYW5nZXMgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybiBhcmUgcmVmbGVjdGVkIGluIHRoZSBwcm9jZXNzIGludG8gd2hpY2ggaXQgaXMgZXh0ZW5kZWQuIFRoZSBjYXBhYmlsaXR5IHBhdHRlcm4gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgc3VwcHJlc3NpbmcgdGFza3MsIHJvbGVzLCBhbmQgd29yayBwcm9kdWN0cy4gT3RoZXIgY2hhbmdlcyBjYW5ub3QgYmUgbWFkZS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPHA+V2Ugd2lsbCBhZGQgc29tZSBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHlvdSBjcmVhdGVkIGluIEV4ZXJjaXNlIDMuIDwvcD4KLTxwPlRvIGFkZCBhIENhcGFiaWxpdHkgUGF0dGVybiB1c2luZyBDb3B5OiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD4gU3dpdGNoIHRvIHRoZSBhdXRob3JpbmcgcGVyc3BlY3RpdmUgYW5kIG9wZW4gdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzIHlvdSBjcmVhdGVkIGluIEV4ZXJjaXNlIDMuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBJbiB0aGUgQ29uZmlndXJhdGlvbnMgVmlldyBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgUHJvamVjdCBNYW5hZ2VtZW50LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJhZyBhbmQgZHJvcCB0aGUgPHN0cm9uZz5Qcm9qZWN0IE1hbmFnZW1lbnQgPC9zdHJvbmc+IENhcGFiaWxpdHkgUGF0dGVybiBvbnRvIHRoZSBJbmNlcHRpb24gcGhhc2UgaW4gTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5Db3B5IDwvc3Ryb25nPiBpbiB0aGUgcG9wLXVwIGJveC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgRXhwYW5kIG9uZSBvZiB0aGUgYWN0aXZpdGllcyBpbiB0aGUgUHJvamVjdCBNYW5hZ2VtZW50IGNhcGFiaWxpdHkgcGF0dGVybiB0byB0aGUgVGFzayBsZXZlbC4gTm90ZSB0aGF0IHRoZSB0YXNrIG5hbWUgaXMgZGlzcGxheWVkIGluIGJsYWNrLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB0YXNrIGlzIGF2YWlsYWJsZSBmb3IgeW91IHRvIGVkaXQuIEFueSBjaGFuZ2VzIGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHlvdXIgcHJvY2Vzcy4gWW91IGNhbiBlZGl0IHRoZSB0YXNrIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuIDwvbGk+Ci08L29sPgotPHA+VG8gYWRkIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHVzaW5nIEV4dGVuZHM6ICA8L3A+Ci08b2wgc3RhcnQ9IjYiPgotICA8bGk+Ci0gICAgPHA+IENyZWF0ZSBhIG5ldyBQaGFzZSBpbiB0aGUgTXkgUlVQIGRlbGl2ZXJ5IHByb2Nlc3MuIFJpZ2h0LWNsaWNrIG9uIHRoZSBmaXJzdCByb3cgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldyBDaGlsZCAmZ3Q7IFBoYXNlIDwvc3Ryb25nPi4gQ2FsbCB0aGUgcGhhc2UsIEVsYWJvcmF0aW9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gQ3JlYXRlIGEgbmV3IEl0ZXJhdGlvbiBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2UuIFJpZ2h0LWNsaWNrIG9uIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBhbmQgc2VsZWN0IDxzdHJvbmc+TmV3IENoaWxkICZndDsgSXRlcmF0aW9uIDwvc3Ryb25nPi4gQ2FsbCB0aGUgaXRlcmF0aW9uLCBFbGFib3JhdGlvbiBJdGVyYXRpb24gMS4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+IEluIHRoZSBDb25maWd1cmF0aW9ucyBWaWV3LCBjbGljayA8c3Ryb25nPlByb2Nlc3NlcyAmZ3Q7IENhcGFiaWxpdHkgUGF0dGVybnMgJmd0OyBDbGFzc2ljIFJVUCAmZ3Q7IERpc2NpcGxpbmUgV29ya2Zsb3dzICZndDsgUHJvamVjdCBNYW5hZ2VtZW50LiA8L3N0cm9uZz48L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRHJhZyBhbmQgZHJvcCB0aGUgPHN0cm9uZz5Qcm9qZWN0IE1hbmFnZW1lbnQgPC9zdHJvbmc+IENhcGFiaWxpdHkgUGF0dGVybiBvbnRvIHRoZSBFbGFib3JhdGlvbiBJdGVyYXRpb24gMSBpdGVyYXRpb24gaW4gTXkgUlVQIFByb2Nlc3MuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPiBTZWxlY3QgPHN0cm9uZz5FeHRlbmQgPC9zdHJvbmc+IGluIHRoZSBwb3AtdXAgYm94LiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD4gRXhwYW5kIG9uZSBvZiB0aGUgYWN0aXZpdGllcyBpbiB0aGUgUHJvamVjdCBNYW5hZ2VtZW50IGNhcGFiaWxpdHkgcGF0dGVybiB5b3UgaGF2ZSBqdXN0IGFkZGVkIHRvIHRoZSBUYXNrIGxldmVsLiBOb3RlIHRoYXQgdGhlIHRhc2sgbmFtZSBpcyBkaXNwbGF5ZWQgaW4gZ3JlZW4gaXRhbGljcy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFzayBpcyBpbiBhIHBhcnQgb2YgYSBwcm9jZXNzIGRlZmluZWQgZWxzZXdoZXJlIJYgYSBDYXBhYmlsaXR5IFBhdHRlcm4uIEFueSBjaGFuZ2VzIHRvIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gd2lsbCBiZSByZWZsZWN0ZWQgaW4geW91ciBwcm9jZXNzLiBBbHNvLCB0aGUgUHJvcGVydGllcyB2aWV3IHNob3dzIHRoZSB0YXNrIGRldGFpbHMsIGJ1dCB0aGV5IGNhbm5vdCBiZSBlZGl0ZWQuIDwvcD4KLSAgPC9saT4KLSAgPGxpPlJpZ2h0IGNsaWNrIG9uIGEgdGFzayBpbiB0aGUgZXh0ZW5kZWQgY2FwYWJpbGl0eSBwYXR0ZXJuIGFuZCBzZWxlY3QgPHN0cm9uZz5TdXBwcmVzcyA8L3N0cm9uZz4uIFRoZSB0YXNrIGlzIGdyYXllZCBvdXQuIFRoZSB0YXNrIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgcHVibGlzaGVkIHZlcnNpb24gb2YgdGhlIGRlbGl2ZXJ5IHByb2Nlc3MsIG5vciB3aWxsIGl0IGJlIGluY2x1ZGVkIGluIGFuIGV4cG9ydCBvZiB0aGUgcHJvY2Vzcy48L2xpPgotPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2V4XzUuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYmY4MmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dG9yaWFsXzVfZXhfNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDI+PGE+PC9hPjxhPkV4ZXJjaXNlIDU6IENyZWF0ZSBQcm9jZXNzIERpYWdyYW1zIDwvYT48L2gyPgotPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBleGVyY2lzZSBpcyB0byBleHBsb3JlIHRoZSBkaWFncmFtIGZlYXR1cmVzIG9mIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIuIDwvcD4KLTxwPkVQRiBDb21wb3NlciBzdXBwb3J0cyB0aHJlZSB0eXBlcyBvZiBwcm9jZXNzIGRpYWdyYW0uIFRoZXNlIGFyZTogPC9wPgotPGJsb2NrcXVvdGU+Ci0gICAgICAgIDxwPiYjMTQ5OyZuYnNwOyA8c3Ryb25nPkFjdGl2aXR5IERpYWdyYW08L3N0cm9uZz4gPC9wPgotICAgICAgICA8YmxvY2txdW90ZT4KLSAgICAgICAgICA8cD4gICAgICAgICAgICBUaGlzIHNob3dzIHRoZSAoc3ViKSBhY3Rpdml0aWVzIGluIGEgaGlnaGVyIGxldmVsIGFjdGl2aXR5LiBJdCBzaG93cyB0aGUgc2VxdWVuY2UgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBhY3Rpdml0aWVzLiA8L3A+Ci0gICAgICAgIDwvYmxvY2txdW90ZT4KLSAgPHA+JiMxNDk7Jm5ic3A7IDxzdHJvbmc+QWN0aXZpdHkgRGV0YWlsPC9zdHJvbmc+IJYgc2ltaWxhciB0byBSVVAgV29ya2Zsb3cgRGV0YWlsIDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+ICAgICAgVGhpcyBzaG93cyB0aGUgdGFza3MgaW4gYW4gYWN0aXZpdHkgd2l0aCB0aGVpciBwZXJmb3JtaW5nIHJvbGVzIGFuZCBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8cD4mIzE0OTsmbmJzcDsgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSBEaWFncmFtPC9zdHJvbmc+IDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHA+VGhpcyBkaWFncmFtIGNhbiBiZSB1c2VkIHRvIHNob3cgaG93IGEgd29yayBwcm9kdWN0IGlzIGRlcGVuZGVudCBvbiBvdGhlciB3b3JrIHByb2R1Y3RzLiA8L3A+Ci0gIDwvYmxvY2txdW90ZT4KLTwvYmxvY2txdW90ZT4KLTxwPlRoZXNlIGRpYWdyYW1zIGNhbiB0aGVuIGJlIGluY2x1ZGVkIGluIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIFRoZSBkaWFncmFtcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgKHRvIGEgZGVncmVlKSBhbmQgaW5oZXJlbnRseSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgV0JTLiBDaGFuZ2VzIHRvIHRoZSBwcm9jZXNzIHN0cnVjdHVyZSB1c2luZyB0aGUgZGlhZ3JhbSBlZGl0b3IgYXJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIHRoZSBXQlMsIGFuZCB2aWNlIHZlcnNhLiA8L3A+Ci08b2w+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggdG8gPHN0cm9uZz5BdXRob3JpbmcgPC9zdHJvbmc+IHBlcnNwZWN0aXZlLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5TZWxlY3QgdGhlIE15IFJVUCBkZWxpdmVyeSBwcm9jZXNzIHRoYXQgeW91IGhhdmUgYmVlbiB3b3JraW5nIG9uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5IaWdobGlnaHQgdGhlIGRlbGl2ZXJ5IHByb2Nlc3MgaW4gdGhlIFdCUyBhbmQgdGhlbiByaWdodC1jbGljay4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xpY2sgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gQWN0aXZpdHkgRGlhZ3JhbTwvc3Ryb25nPi4gVGhlIGRpYWdyYW0gZWRpdG9yIHNob3VsZCBvcGVuLCBzaG93aW5nIHRoZSB0b3AgbGV2ZWwgYWN0aXZpdGllcyAtIHBoYXNlcy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+RXhwYW5kIHRoZSA8c3Ryb25nPlBhbGV0dGUgPC9zdHJvbmc+IG9uIHRoZSByaWdodCBvZiB0aGUgZGlhZ3JhbSB2aWV3LiBBbGwgdGhlIGVsZW1lbnRzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhbiA8c3Ryb25nPkFjdGl2aXR5IERpYWdyYW0gPC9zdHJvbmc+IGFyZSBhdmFpbGFibGUgb24gdGhlIHBhbGV0dGUuIEFkZCBhIG5ldyBwaGFzZSB0byB0aGUgZGlhZ3JhbSCWIGNhbGwgaXQsIENvbnN0cnVjdGlvbi4gQ3JlYXRlIGxpbmtzIGJldHdlZW4gdGhlIHBoYXNlcyB0byBzaG93IHRoZSBzZXF1ZW5jZSBvZiB0aGUgcGhhc2VzLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggYmFjayB0byB0aGUgPHN0cm9uZz5Xb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUgPC9zdHJvbmc+dmlldyBhbmQgbm90aWNlIHRoZSBuZXcgcGhhc2UuIEFsc28gbm90aWNlIHRoYXQgdGhlIGxpbmtzIHlvdSBhZGRlZCBvbiB0aGUgZGlhZ3JhbSBhcmUgcmVmbGVjdGVkIGluIHRoZSBQcmVkZWNlc3NvcnMgY29sdW1uLiA8L3A+Ci0gIDwvbGk+Ci0gIDxsaT4KLSAgICA8cD5Eb3VibGUgY2xpY2sgdGhlIDxzdHJvbmc+SW5jZXB0aW9uIFBoYXNlPC9zdHJvbmc+IGluIHRoZSBkaWFncmFtIJYgaXQgd2lsbCBkcmlsbCBkb3duIHRvIHNob3cgdGhlIGNvbnRhaW5lZCBBY3Rpdml0aWVzICh0aGUgcnVsZSBpcyB0aGF0IHRoZSBlZGl0b3Igd2lsbCBkaXNwbGF5IHRoZSBwcm9jZXNzIGVsZW1lbnRzIGF0IHRoZSBsZXZlbCBiZWxvdyB0aGUgY3VycmVudCBzZWxlY3RlZCBlbGVtZW50KS4gU3VjY2Vzc2l2ZSBkcmlsbCBkb3duIHRocm91Z2ggdGhlIGxldmVscyBpcyBwb3NzaWJsZSBieSBjbGlja2luZyBvbiB0aGUgZGlhZ3JhbSBlbGVtZW50cy4gPC9wPgotICA8L2xpPgotICA8bGk+Ci0gICAgPHA+Q2xvc2UgdGhlIGRpYWdyYW1zIHlvdSBoYXZlIG9wZW5lZC4gPC9wPgotICA8L2xpPgotICA8bGk+SW4gdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgcmlnaHQtY2xpY2sgb24gdGhlIFJlcXVpcmVtZW50cyBhY3Rpdml0eSBhbmQgc2VsZWN0LCA8c3Ryb25nPkRpYWdyYW1zICZndDsgT3BlbiBBY3Rpdml0eSBEZXRhaWwgRGlhZ3JhbS4gPC9zdHJvbmc+VGhlIEFjdGl2aXR5IERldGFpbCBEaWFncmFtIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBJdCBzaG93czogIDwvbGk+Ci0gIDxibG9ja3F1b3RlPgotICAgIDxwPiYjMTQ5OyZuYnNwOyBUaGUgUm9sZXMgdGhhdCBwZXJmb3JtIHRhc2tzIGluIHRoZSBhY3Rpdml0eSA8L3A+Ci0gICAgPHA+JiMxNDk7Jm5ic3A7IFRoZSBUYXNrcyB0aGF0IHRoZSByb2xlcyBwZXJmb3JtIDwvcD4KLSAgICA8cD4mIzE0OTsmbmJzcDsgVGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgZWFjaCB0YXNrIDwvcD4KLSAgICA8cD5Zb3UgY2FuIGNoYW5nZSB0aGUgbGF5b3V0IG9mIHRoZSBkaWFncmFtIGJ1dCB5b3UgY2Fubm90IGFkZCBvciByZW1vdmUgYW55IGVsZW1lbnRzIGZyb20gdGhlIGRpYWdyYW0uIDwvcD4KLSAgPC9ibG9ja3F1b3RlPgotICA8bGk+Ci0gICAgPHA+Q2xvc2UgdGhlIGRpYWdyYW1zIHlvdSBoYXZlIG9wZW5lZC4gPC9wPgotICA8L2xpPgotICA8bGk+ICAgIEluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkgYW5kIHNlbGVjdCwgPHN0cm9uZz5EaWFncmFtcyAmZ3Q7IE9wZW4gV29yayBQcm9kdWN0IERlcGVuZGVuY3kgRGlhZ3JhbS4gPC9zdHJvbmc+VGhlIHdvcmsgcHJvZHVjdHMgdXNlZCBpbiB0aGUgYWN0aXZpdHkgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGRpYWdyYW0uICA8L2xpPgotPC9vbD4KLTxibG9ja3F1b3RlPgotICA8cD5BZGQgYSAoZGVwZW5kZW5jeSkgbGluayBiZXR3ZWVuIHR3byB3b3JrIHByb2R1Y3RzLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB3b3JrIHByb2R1Y3QgYXQgdGhlIGFycm93IGVuZCBvZiB0aGUgbGluayBpcyBkZXBlbmRlbnQgb24gdGhlIG90aGVyIHdvcmsgcHJvZHVjdCwgaS5lLiwgdGhlIG90aGVyIHdvcmsgcHJvZHVjdCBuZWVkcyB0byBiZSBjcmVhdGVkIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgc2Vjb25kIHdvcmsgcHJvZHVjdC4KLSAgPC9wPgotICA8cD5BZGQgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0aGUgZGlhZ3JhbS4gPC9wPgotPC9ibG9ja3F1b3RlPgotPG9sIHN0YXJ0PSIxMiI+Ci0gIDxsaT4KLSAgICA8cD5Td2l0Y2ggYmFjayB0byB0aGUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgb3BlbiB0aGUgPHN0cm9uZz5Xb3JrIFByb2R1Y3QgVXNhZ2U8L3N0cm9uZz4gdmlldy4gTm90aWNlIHRoZSBuZXcgd29yayBwcm9kdWN0IGluIHRoZSBSZXF1aXJlbWVudHMgYWN0aXZpdHkuIDwvcD4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxwPk9uY2UgeW91IGhhdmUgZWRpdGVkIGEgZGlhZ3JhbSwgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSBpdCBvciBleGNsdWRlIGl0IHdoZW4gcHVibGlzaGluZyB0aGUgcHJvY2VzcyBpbiBhIGNvbmZpZ3VyYXRpb24uIEluIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIHJpZ2h0LWNsaWNrIG9uIHRoZSA8c3Ryb25nPlJlcXVpcmVtZW50czwvc3Ryb25nPiBhY3Rpdml0eSBhbmQgc2VsZWN0IDxzdHJvbmc+RGlhZ3JhbXMgJmd0OyBQdWJsaXNoaW5nIE9wdGlvbnMuIDwvc3Ryb25nPkNoZWNrIG9yIHVuY2hlY2sgdGhlIHR5cGVzIG9mIGRpYWdyYW0gbGlzdGVkLiBJZiBhIGRpYWdyYW0gdHlwZSBpcyBub3QgbGlzdGVkLCBpdCBtZWFucyB0aGF0IHlvdSBoYXZlIG5vdCBlZGl0ZWQgdGhhdCBkaWFncmFtIHR5cGUgZm9yIHRoZSBhY3Rpdml0eSB5ZXQuIDwvcD4KLSAgPC9saT4KLSAgPC9vbD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2ludHJvLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXRvcmlhbF81X2ludHJvLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhMzUxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0b3JpYWxfNV9pbnRyby5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5VbnRpdGxlZCBEb2N1bWVudDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+PGE+PC9hPjxhPlR1dG9yaWFsOiBXb3JraW5nIHdpdGggUHJvY2Vzc2VzIDwvYT48L2gxPgotPHA+PHN0cm9uZz48ZW0+UHJvY2VzcyBBdXRob3JpbmcgPC9lbT48L3N0cm9uZz4gYWxsb3dzIGEgUHJvY2VzcyBFbmdpbmVlciB0byBpbmNvcnBvcmF0ZSA8c3Ryb25nPjxlbT5NZXRob2QgRWxlbWVudHMgPC9lbT48L3N0cm9uZz4gaW50byBwcm9jZXNzIHN0cnVjdHVyZXMuIEZvciBleGFtcGxlLCBhIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSBmb3JtYXQgZmFtaWxpYXIgdG8gUHJvamVjdCBNYW5hZ2Vycy4gVGhlIHByb2Nlc3NlcyBjYW4gYmUgaW5jbHVkZWQgaW4gYSBjb25maWd1cmF0aW9uIHRvIGJlIHB1Ymxpc2hlZCBhcyBwYXJ0IG9mIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUuIDwvcD4KLTxwPkluIDxzdHJvbmc+PGVtPk1ldGhvZCA8L2VtPiBBdXRob3JpbmcgPC9zdHJvbmc+IHRoZSBQcm9jZXNzIEVuZ2luZWVyIGRlZmluZXMgcm9sZXMsIHRhc2tzLCB3b3JrIHByb2R1Y3RzIGFuZCBndWlkYW5jZSBhbmQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZXNlIGVsZW1lbnRzLiA8L3A+Ci08cD5JbiA8c3Ryb25nPjxlbT5Qcm9jZXNzIDwvZW0+IEF1dGhvcmluZyA8L3N0cm9uZz4gdGhlIHByb2Nlc3MgZW5naW5lZXIgZGVmaW5lcyBhZGRpdGlvbmFsIGxpZmVjeWNsZSBlbGVtZW50cyBzdWNoIGFzIDxzdHJvbmc+QWN0aXZpdGllcyA8L3N0cm9uZz4gKHN1bW1hcnkgdGFza3MpLCA8c3Ryb25nPlBoYXNlcyA8L3N0cm9uZz4sIDxzdHJvbmc+SXRlcmF0aW9ucyA8L3N0cm9uZz4gYW5kIDxzdHJvbmc+TWlsZXN0b25lcyA8L3N0cm9uZz4sIHRoYXQgY2FuIHRoZW4gYmUgdXNlZCB0byBjb21wb3NlIHRoZSBjb3JlIGVsZW1lbnRzIGludG8gcHJvY2Vzc2VzLiBBIGNvbXBsZXRlIHByb2Nlc3MgY29ycmVzcG9uZGluZyB0byBhIHByb2plY3QgcGxhbiBvciBhIHBoYXNlIHdlIGNhbGwgYSA8c3Ryb25nPjxlbT5EZWxpdmVyeSBQcm9jZXNzIDwvZW0+PC9zdHJvbmc+PGVtPihjb3JyZXNwb25kaW5nIHRvIFNtYWxsIFJVUCwgZm9yIGV4YW1wbGUpIDwvZW0+LiBXZSBjYW4gYWxzbyBjcmVhdGUgc21hbGxlciBtb3JlIGdyYW51bGFyIHNlY3Rpb25zIG9mIHByb2Nlc3MsIHRlcm1lZCA8c3Ryb25nPjxlbT5DYXBhYmlsaXR5IFBhdHRlcm5zIDwvZW0+PC9zdHJvbmc+IHRoYXQgY2FuIGJlIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIG1vcmUgZWFzaWx5IGNvbXBvc2UgZGVsaXZlcnkgcHJvY2Vzc2VzLiA8L3A+Ci08cD5FYWNoIHRpbWUgYSB0YXNrIGlzIGluY2x1ZGVkIGluIGEgcHJvY2VzcywgYSBjb3B5IG9mIHRoYXQgdGFzayBpcyBjcmVhdGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzLiBXZSBjYWxsIHRoaXMgYSBUYXNrIERlc2NyaXB0b3IuIFRoZSBzYW1lIHRhc2sgY2FuIGJlIGluY2x1ZGVkIGFueSBudW1iZXIgb2YgdGltZXMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBhbGxvd3MsIGZvciBleGFtcGxlLCB0aGUgc2FtZSBSVVAgdGFzayB0byBiZSBpbmNsdWRlZCBpbiBlYWNoIEl0ZXJhdGlvbiBpbiBlYWNoIFJVUCBQaGFzZS4gQSBUYXNrIERlc2NyaXB0b3IgY2FuIGFsc28gbW9kaWZ5IHRoZSBiYXNlIHRhc2sgd2l0aG91dCBhY3R1YWxseSBjaGFuZ2luZyB0aGUgdGFzay4gRm9yIGV4YW1wbGUsIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzIGNhbiBiZSBhZGRlZCBvciBzdXBwcmVzc2VkLCBzdGVwcyBjYW4gYmUgc3VwcHJlc3NlZCBvciByZS1zZXF1ZW5jZWQuIDwvcD4KLTxwPm9sZXMgYW5kIFdvcmsgUHJvZHVjdHMgYXJlIGFsc28gaW5jbHVkZWQgaW4gcHJvY2Vzc2VzIGFzIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gU28gcm9sZXMgYW5kIHdvcmsgcHJvZHVjdHMgY2FuIGFsc28gYmUgY3VzdG9taXplZCB0byBmaXQgd2l0aCB0aGUgY29udGV4dCBvZiB0aGUgcHJvY2VzcyBpbiB3aGljaCB0aGV5IGFyZSB1c2VkLjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R3aXN0eSBzeW1ib2wxLkpQRyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R3aXN0eSBzeW1ib2wxLkpQRwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiMTFiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90d2lzdHkgc3ltYm9sMS5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bWFfaHVtcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91bWFfaHVtcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ1NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW1hX2h1bXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzY4YzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdW5kZXJsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2UuSlBHIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZS5KUEcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzY4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcmludGVyZmFjZS5KUEcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2VyaW50ZXJmYWNlb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTI4Mzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3VzZXJpbnRlcmZhY2VvdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iVG9vbCBJbnRlcmZhY2UiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpLiBUaGUgcGFydHMgb2YgdGhlIHdvcmtzcGFjZSBhcmU6IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYnVpbHQgb24gdGhlIEVjbGlwc2UgSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOiIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sI2Jyb3dpbmdwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb25maWd1cmF0aW9udmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJsaWJyYXJ5dmlldy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJicm93c2VhbmRwcmV2aWV3bWV0aG9kY29udGVudC5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idXNlcmludGVyZmFjZW92ZXJ2aWV3IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlRvb2wgSW50ZXJmYWNlPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ1c2VyaW50ZXJmYWNlb3ZlcnZpZXciPjxhIG5hbWU9InVzZXJpbnRlcmZhY2VvdmVydmlldyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlRvb2wgSW50ZXJmYWNlPC9oMT4KLTxkaXY+PHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBidWlsdCBvbiB0aGUgRWNsaXBzZSBJbnRlZ3JhdGVkCi1EZXZlbG9wbWVudCBFbnZpcm9ubWVudCAoSURFKS4gVGhlIHBhcnRzIG9mIHRoZSB3b3Jrc3BhY2UgYXJlOjwvcD4KLTxwPjxpbWcgc3JjPSJ1c2VyaW50ZXJmYWNlLkpQRyIgYWx0PSIiIC8+PC9wPgotPGRpdiBjbGFzcz0icCI+PHVsPjxsaT48c3Ryb25nPkNvbmZpZ3VyYXRpb24gZHJvcC1kb3duIHNlbGVjdGlvbiBib3g8L3N0cm9uZz4gLSBUaGUgY29uZmlndXJhdGlvbiBkcm9wLWRvd24KLXNlbGVjdGlvbiBib3ggYWxsb3dzIHlvdSB0byBzZWxlY3QgYSA8YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sI2NvbmZpZ3VyYXRpb252aWV3Ij5jb25maWd1cmF0aW9uPC9hPiBpbiB3aGljaCB0byB3b3JrLiA8L2xpPgotPGxpPjxzdHJvbmc+T3BlbiBQZXJzcGVjdGl2ZSBidXR0b248L3N0cm9uZz4gLSBDbGljayB0aGUgT3BlbiBQZXJzcGVjdGl2ZSBidXR0b24KLXRvIHNlbGVjdCBhIDxhIGhyZWY9InBlcnNwZWN0aXZlcy5odG1sI3BlcnNwZWN0aXZlcyI+cGVyc3BlY3RpdmU8L2E+LgotVGhlcmUgYXJlIHR3byBwZXJzcGVjdGl2ZXMgdG8gc2VsZWN0IGZyb206IFRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT4gYW5kIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+LiA8L2xpPgotPGxpPjxzdHJvbmc+TGlicmFyeSBWaWV3PC9zdHJvbmc+IC0gVGhlIDxhIGhyZWY9ImxpYnJhcnl2aWV3Lmh0bWwjbGlicmFyeXZpZXciPkxpYnJhcnkKLVZpZXc8L2E+IGRpc3BsYXlzIHRoZSBNZXRob2QgUGx1Zy1pbnMgYW5kIENvbmZpZ3VyYXRpb25zIGNvbnRhaW5lZCBpbiBhCi1NZXRob2QgTGlicmFyeS48L2xpPgotPGxpPjxzdHJvbmc+Q29uZmlndXJhdGlvbiBWaWV3PC9zdHJvbmc+IC0gVGhlIDxhIGhyZWY9ImNvbmZpZ3VyYXRpb252aWV3Lmh0bWwjY29uZmlndXJhdGlvbnZpZXciPkNvbmZpZ3VyYXRpb24gVmlldzwvYT4gc2hvd3MgdGhlIGNvbnRlbnQgZWxlbWVudHMgaW4gYSBsaWJyYXJ5Ci1maWx0ZXJlZCBieSBhIGNvbmZpZ3VyYXRpb24uPC9saT4KLTxsaT48c3Ryb25nPkNvbnRlbnQgRWRpdG9ycyBhbmQgUHJldmlldzwvc3Ryb25nPiAtIFdoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSA8YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sI2F1dGhvcmluZ3BlcnNwZWN0aXZlIj5BdXRob3JpbmcKLVBlcnNwZWN0aXZlPC9hPiwgdGhlIHdpbmRvdyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB5b3VyIHNjcmVlbiBjb250YWlucyBjb250ZW50Ci1lZGl0b3JzLCB3aGljaCBhbGxvdyB5b3UgdG8gY3JlYXRlIG9yIG1vZGlmeSBlbGVtZW50IHR5cGVzLiBXaGVuIHRoZSA8YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZwotUGVyc3BlY3RpdmU8L2E+IGlzIG9wZW4sIHRoZSB3aW5kb3cgb24gdGhlIHJpZ2h0IGNvbnRhaW5zIGEgcHJldmlldyBvZgoteW91ciBjb250ZW50IGFzIGl0IHdpbGwgYXBwZWFyIGluIGEgcHVibGlzaGVkIFdlYiBzaXRlLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+Ci08b2w+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJhdXRob3JpbmdwZXJzcGVjdGl2ZS5odG1sIj5BdXRob3JpbmcgUGVyc3BlY3RpdmU8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0iYnJvd3NpbmdwZXJzcGVjdGl2ZS5odG1sIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJjb25maWd1cmF0aW9udmlldy5odG1sIj5Db25maWd1cmF0aW9uIFZpZXc8L2E+PGJyIC8+Ci08L2xpPgotPGxpIGNsYXNzPSJvbGNoaWxkbGluayI+PGEgaHJlZj0ibGlicmFyeXZpZXcuaHRtbCI+TGlicmFyeSBWaWV3PC9hPjxiciAvPgotPC9saT4KLTxsaSBjbGFzcz0ib2xjaGlsZGxpbmsiPjxhIGhyZWY9ImJyb3dzZWFuZHByZXZpZXdtZXRob2Rjb250ZW50Lmh0bWwiPkJyb3dzZSBhbmQgUHJldmlldyBNZXRob2QgQ29udGVudDwvYT48YnIgLz4KLTwvbGk+Ci08bGkgY2xhc3M9Im9sY2hpbGRsaW5rIj48YSBocmVmPSJzZWFyY2hmb3JtZXRob2Rjb250ZW50Lmh0bWwiPlNlYXJjaCBmb3IgTWV0aG9kIENvbnRlbnQ8L2E+PGJyIC8+Ci08L2xpPgotPC9vbD4KLTxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iYXV0aG9yaW5ncGVyc3BlY3RpdmUuaHRtbCNhdXRob3JpbmdwZXJzcGVjdGl2ZSI+QXV0aG9yaW5nIFBlcnNwZWN0aXZlPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJicm93c2luZ3BlcnNwZWN0aXZlLmh0bWwjYnJvd2luZ3BlcnNwZWN0aXZlIj5Ccm93c2luZyBQZXJzcGVjdGl2ZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmMTY0My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC91c2Vycm9sZXNhbmRyb2xlc3BlY2lmaWN0YXNrcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9InRvcGljIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzZXIgUm9sZXMgYW5kIFJvbGUgU3BlY2lmaWMgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VXNlciBSb2xlcyBhbmQgUm9sZSBTcGVjaWZpYyBUYXNrczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idXNlcnJvbGVzYW5kcm9sZXNwZWNpZmljdGFza3MiPjxhIG5hbWU9InVzZXJyb2xlc2FuZHJvbGVzcGVjaWZpY3Rhc2tzIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VXNlciBSb2xlcyBhbmQgUm9sZSBTcGVjaWZpYyBUYXNrczwvaDE+Ci08ZGl2PjxwPlRoZXJlIGFyZSBmb3VyIHByaW1hcnkgcm9sZXMgcGxheWVkIGJ5IHRoZSB1c2VycyBvZiB0aGlzIHRvb2w6PC9wPgotPHVsPjxsaT5NZXRob2QgQXV0aG9yPC9saT4KLTxsaT5Qcm9jZXNzIEF1dGhvcjwvbGk+Ci08bGk+UHJvY2VzcyBDb25maWd1cmF0b3I8L2xpPgotPGxpPlByYWN0aXRpb25lcjwvbGk+Ci08L3VsPgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5NZXRob2QgQXV0aG9yPC9zdHJvbmc+IC0gVGhlIE1ldGhvZCBBdXRob3IgdXNlcyB0aGUgdG9vbCBvbiBhIHJlZ3VsYXIgYmFzaXMKLXRvIHByb3ZpZGUgc3RhbmRhcmQgcHJvY2Vzc2VzIGZvciB1c2UgaW4gYW4gb3JnYW5pemF0aW9uLiBUaGUgTWV0aG9kIEF1dGhvcgotdXNlcyB0aGUgZnVsbCBmdW5jdGlvbmFsaXR5IG9mIHRoZSB0b29sIHRvOjx1bD48bGk+Q3JlYXRlIHBsdWctaW5zLjwvbGk+Ci08bGk+Q3JlYXRlIG5ldyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5FeHRlbmQgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIHJldXNhYmxlIGNhcGFiaWxpdHkgcGF0dGVybnMgYnkgcmV1c2luZyBtZXRob2QgZWxlbWVudHMuPC9saT4KLTxsaT5DcmVhdGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGJ5IHJldXNpbmcgY2FwYWJpbGl0eSBwYXR0ZXJucyBhbmQgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGN1c3RvbSBjYXRlZ29yaWVzIGZvciB1c2UgYXMgdmlld3MgaW4gYSBjb25maWd1cmF0aW9uLjwvbGk+Ci08bGk+Q3JlYXRlIGFuZCBtb2RpZnkgY29uZmlndXJhdGlvbnMuPC9saT4KLTxsaT5QdWJsaXNoIGNvbmZpZ3VyYXRpb25zIG9yIHByb2Nlc3Nlcy48L2xpPgotPC91bD4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+PHN0cm9uZz5Qcm9jZXNzIEF1dGhvcjwvc3Ryb25nPiAtIFRoZSBQcm9jZXNzIEF1dGhvcidzIGdvYWwgaXMgdG8gcHJvZHVjZSBhIGRlbGl2ZXJ5Ci1wcm9jZXNzIGZvciB0aGVpciBwcm9qZWN0KHMpIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLiBUaGUgUHJvY2VzcyBBdXRob3IKLXVzZXMgdGhlIHRvb2wgb2NjYXNpb25hbGx5LCBhcyBwcm9qZWN0IG5lZWRzIGRpY3RhdGUsIHR5cGljYWxseSBzdXBwb3J0aW5nCi1vbmUgb3IsIG1vcmUgbGlrZWx5LCBzZXZlcmFsIHByb2plY3RzIGJ5IHNwZWNpZnlpbmcgdGhlIHByb2Nlc3NlcyB0byBiZSBmb2xsb3dlZC4KLVRoZSBQcm9jZXNzIEF1dGhvciB1c2VzIHRoZSBwcm9jZXNzIGF1dGhvcmluZyBhbmQgY29uZmlndXJhdGlvbiBwdWJsaXNoaW5nCi1mdW5jdGlvbmFsaXR5IG9mIHRoaXMgdG9vbCB0bzo8dWw+PGxpPkNyZWF0ZSBwbHVnLWlucy48L2xpPgotPGxpPkNyZWF0ZSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGJ5IHJldXNpbmcgbWV0aG9kIGVsZW1lbnRzLjwvbGk+Ci08bGk+Q3JlYXRlIGRlbGl2ZXJ5IHByb2Nlc3NlcyBieSByZXVzaW5nIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIG1ldGhvZCBlbGVtZW50cy48L2xpPgotPGxpPkNyZWF0ZSBjdXN0b20gY2F0ZWdvcmllcyBmb3IgdXNlIGFzIHZpZXdzIGluIGEgY29uZmlndXJhdGlvbi4gPC9saT4KLTxsaT5DcmVhdGUgYW5kIG1vZGlmeSBjb25maWd1cmF0aW9ucy48L2xpPgotPGxpPlB1Ymxpc2ggY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc2VzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPlByb2Nlc3MgQ29uZmlndXJhdG9yPC9zdHJvbmc+IC0gVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yJ3MgZ29hbCBpcyB0byBwcm9kdWNlCi1hIGRlbGl2ZXJ5IHByb2Nlc3MgZm9yIHRoZWlyIHByb2plY3QocykgYnkgcmFwaWRseSBsZXZlcmFnaW5nIHJlYWR5LW1hZGUgcGx1Zy1pbnMuCi1UaGUgUHJvY2VzcyBDb25maWd1cmF0b3IgdXNlcyB0aGlzIHRvb2wgb2NjYXNpb25hbCwgYXMgcHJvamVjdCBuZWVkcyBkaWN0YXRlLAotdHlwaWNhbGx5IHN1cHBvcnRpbmcgb25lIG9yIHNldmVyYWwgcHJvamVjdHMgYnkgc3BlY2lmeWluZyB0aGUgcHJvY2VzcyBmb3IKLXRoZSBwcm9qZWN0cy4gVGhlIFByb2Nlc3MgQ29uZmlndXJhdG9yIHVzZXMgdGhlIGNvbmZpZ3VyYXRpb24KLXB1Ymxpc2hpbmcgZnVuY3Rpb25hbGl0eSBpbiB0aGlzIHRvb2wgdG86PHVsPjxsaT5DcmVhdGUgYW5kIG1vZGlmeSBjb25maWd1cmF0aW9ucy48L2xpPgotPGxpPlB1Ymxpc2ggY29uZmlndXJhdGlvbnMgb3IgcHJvY2Vzc2VzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48c3Ryb25nPlByYWN0aXRpb25lcjwvc3Ryb25nPiAtIEEgUHJhY3RpdGlvbmVyJ3MgZ29hbCBpcyB0byBjb3JyZWN0bHkgdXNlIHRoZSBvcmdhbml6YXRpb24ncwotcHJvY2Vzc2VzIGFuZCBiZXN0IHByYWN0aWNlcyBlZmZlY3RpdmVseS4gQSBQcmFjdGl0aW9uZXIgdXNlcyBhIHB1Ymxpc2hlZAotY29uZmlndXJhdGlvbiBvbiBhIHJlZ3VsYXIgYmFzaXMgZHJpdmVuIGJ5IHRoZSB3b3JrIGJlaW5nIHBlcmZvcm1lZCB0byB2aWV3Ci1wcm9jZXNzZXMgYW5kIG1ldGhvZHMuPC9wPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YWE5YjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYXJpYWJpbGl0eSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJWYXJpYWJpbGl0eSBhbGxvd3MgZWxlbWVudHMgaW4gb25lIGNvbnRlbnQgcGFja2FnZSB0byBpbmZsdWVuY2Ugb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuIFZhcmlhYmlsaXR5IGVuYWJsZXMgY2hhbmdlcyB0byB0aGUgY29udGVudCB3aGlsZSBrZWVwaW5nIHRoZSBjaGFuZ2VzIHNlcGFyYXRlIGFuZCBvcHRpb25hbC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjb250cmlidXRlcy5odG1sIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJyZXBsYWNlLmh0bWwjcmVwbGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9ImV4dGVuZHMuaHRtbCNleHRlbmRzIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9InZhcmlhYmlsaXR5IiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPlZhcmlhYmlsaXR5PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ2YXJpYWJpbGl0eSI+PGEgbmFtZT0idmFyaWFiaWxpdHkiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYXJpYWJpbGl0eTwvaDE+Ci08ZGl2PjxwPlZhcmlhYmlsaXR5IGFsbG93cyBlbGVtZW50cyBpbiBvbmUgY29udGVudCBwYWNrYWdlIHRvIGluZmx1ZW5jZQotb3IgbW9kaWZ5IGVsZW1lbnRzIGluIG90aGVyIGNvbnRlbnQgcGFja2FnZXMgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcKLXRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZwotdGhlIGNoYW5nZXMgc2VwYXJhdGUgYW5kIG9wdGlvbmFsLjwvcD4KLTxwPlZhcmlhYmlsaXR5IGFsbG93cyB5b3UgdG8gZmFjdG9yIHlvdXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQKLXVuaXRzIGFuZCB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQKLWVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiBWYXJpYWJpbGl0eSBhbHNvIGFsbG93cyB5b3UgdG8gZXh0ZW5kIGFuZAotdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgeW91IGRvIG5vdCBvd24gYW5kIGNhbm5vdCBkaXJlY3RseSBtb2RpZnksCi1hbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHlpbmcgeW91ciBwZXJzb25hbAotY2hhbmdlcyB0byB0aGUgdXBncmFkZXMuPC9wPgotPHA+VGhlIHVzZSBvZiB2YXJpYWJpbGl0eSBhZmZlY3RzIHR3byBjaGFyYWN0ZXJpc3RpY3Mgb2YgYSBtZXRob2QgZWxlbWVudDoKLWl0cyBhdHRyaWJ1dGVzIGFuZCBpdHMgcmVsYXRpb25zaGlwcyB3aXRoIG90aGVyIGNvbnRlbnQgZWxlbWVudHMuIElmIGFuIGVsZW1lbnQKLWFsbG93cyB2YXJpYWJpbGl0eSwgdGhlIHNwZWNpZmljYXRpb24gaXMgc2hvd24gYXQgdGhlIGJvdHRvbSBvZiB0aGUgZWxlbWVudCdzCi1kZXNjcmlwdGlvbiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9InAiPkZvciB0aGUgcHVycG9zZXMgb2YgdmFyaWFiaWxpdHksIHRoZXJlIGFyZSB0aHJlZSBncm91cHMgb2YgaW5mb3JtYXRpb24KLWZvciBhbnkgZWxlbWVudCB0byBiZSBjb25zaWRlcmVkOjx1bD48bGk+PHN0cm9uZz5BdHRyaWJ1dGVzPC9zdHJvbmc+IC0gcGllY2VzIG9mIGRhdGEgYWJvdXQgYW4gZWxlbWVudCBzdWNoIGFzIE1haW4gRGVzY3JpcHRpb24uPC9saT4KLTxsaT48c3Ryb25nPkluY29taW5nIEFzc29jaWF0aW9uczwvc3Ryb25nPiAtIGFzc29jaWF0aW9ucyB0byBvdGhlciBlbGVtZW50cyB3aGVyZSB0aGUKLWFzc29jaWF0aW9uIHJlZmVyZW5jZSBpcyBoZWxkIGluIHRoZSBvdGhlciBlbGVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhlIG90aGVyCi1lbGVtZW50IGhhcyByZWZlcmVuY2VzIHRvIHRoZSBzdWJqZWN0IGVsZW1lbnQuPC9saT4KLTxsaT48c3Ryb25nPk91dGdvaW5nIEFzc29jaWF0aW9uczwvc3Ryb25nPiAtIGFzc29jaWF0aW9ucyB0byBvdGhlciBlbGVtZW50cyB3aGVyZSB0aGUKLWFzc29jaWF0aW9uIHJlZmVyZW5jZSBpcyBoZWxkIGluIHRoZSBzdWJqZWN0IGVsZW1lbnQuIEluIG90aGVyIHdvcmRzLCB0aGUKLXN1YmplY3QgZWxlbWVudCBoYXMgcmVmZXJlbmNlcyB0byB0aGUgb3RoZXIgZWxlbWVudC48L2xpPgotPC91bD4KLUluIGFkZGl0aW9uLCBhc3NvY2lhdGlvbnMgY2FuIGJlIG9uZS10by1vbmUgb3Igb25lLXRvLW1hbnkuIFNlZSA8YSBocmVmPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucy5odG1sI3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2E+IGZvcgotYSBmdWxsIGxpc3Qgb2YgdGhlIGFzc29jaWF0aW9ucyBmb3IgZWFjaCB0eXBlIG9mIGVsZW1lbnQuPC9kaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+VmFyaWFiaWxpdHkgVHlwZTwvaDQ+PGRpdiBjbGFzcz0icCI+VmFyaWFiaWxpdHkKLXR5cGUgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBvbmUgZWxlbWVudCBhZmZlY3RzIGFub3RoZXIgZWxlbWVudCB1c2luZyB2YXJpYWJpbGl0eS4KLVRoZSB2YXJpYWJpbGl0eSB0eXBlcyBhcmU6PHVsPjxsaT48c3Ryb25nPk5vdCBBcHBsaWNhYmxlPC9zdHJvbmc+IC0gVGhlIGVsZW1lbnQgaXMgYSBiYXNlIGVsZW1lbnQgYW5kIGRvZXMgbm90IGFmZmVjdAotYW5vdGhlciBlbGVtZW50IHRocm91Z2ggdmFyaWFiaWxpdHkuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYW4gZWxlbWVudCdzCi12YXJpYWJpbGl0eSB0eXBlLjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5Db250cmlidXRlczwvc3Bhbj48L3N0cm9uZz4gLQotQSBjb250cmlidXRpbmcgZWxlbWVudCBhZGRzIHRvIHRoZSBiYXNlIGVsZW1lbnQuIENvbnRyaWJ1dGVzIHByb3ZpZGVzIGEgd2F5Ci1mb3IgZWxlbWVudHMgdG8gY29udHJpYnV0ZSB0aGVpciBwcm9wZXJ0aWVzIGludG8gdGhlaXIgYmFzZSBlbGVtZW50IHdpdGhvdXQKLWRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgc3VjaCBhcyBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLgotVGhlIGVmZmVjdCwgYWZ0ZXIgY29udHJpYnV0aW9uLCBpcyB0aGF0IHRoZSBiYXNlIGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkCi13aXRoIGFuIGVsZW1lbnQgdGhhdCBjb21iaW5lcyB0aGUgYXR0cmlidXRlcyBhbmQgYXNzb2NpYXRpb25zIG9mIHRoZSBjb250cmlidXRpbmcKLWVsZW1lbnQgd2l0aCB0aGUgYmFzZSBlbGVtZW50LjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5SZXBsYWNlczwvc3Bhbj48L3N0cm9uZz4gLQotQSByZXBsYWNpbmcgZWxlbWVudCByZXBsYWNlcyBwYXJ0cyBvZiB0aGUgYmFzZSBlbGVtZW50LiBSZXBsYWNlcyBwcm92aWRlcwotYSB3YXkgZm9yIGFuIGVsZW1lbnQgdG8gcmVwbGFjZSBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueQotb2YgdGhlIGJhc2UgZWxlbWVudCdzIGV4aXN0aW5nIHByb3BlcnRpZXMuIFRoaXMgaXMsIGluIG1vc3QgY2FzZXMsIHVzZWQgZm9yCi1tZXRob2QgcGx1Zy1pbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgcm9sZXMsCi10YXNrcywgb3IgYWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlbHkgbmV3IHZhcmlhbnQgb3IgdG8gY2hhbmdlIHRoZQotZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cy4gVGhlIGVmZmVjdCBvZiB0aGlzLCBpcyB0aGF0IHRoZQotYmFzZSBjb250ZW50IGVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggdGhlIG5ldyByZXBsYWNpbmcgZWxlbWVudAotdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkKLW5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLjwvbGk+Ci08L3VsPgotPHVsPjxsaT48c3Ryb25nPjxzcGFuIGNsYXNzPSJrZXl3b3JkIj5FeHRlbmRzPC9zcGFuPjwvc3Ryb25nPiAtCi1BbiBleHRlbmRpbmcgZWxlbWVudCBpbmhlcml0cyBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGJhc2UgZWxlbWVudC4gRXh0ZW5zaW9uCi1hbGxvd3MgTWV0aG9kIFBsdWctaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgYmFzZSBwbHVnLWluIGJ5IHByb3ZpZGluZwotYSBraW5kIG9mIGluaGVyaXRhbmNlIGZvciB0aGUgZXh0ZW5kaW5nIGVsZW1lbnQuIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uCi1pbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSAiYmFzZWQtb24iIGVsZW1lbnQgdG8gdGhlIGV4dGVuZGluZyBlbGVtZW50LgotVGhlIHJlc3VsdCBpcyB0aGF0IHRoZSBleHRlbmRpbmcgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgImJhc2VkLW9uIgotZWxlbWVudCwgYnV0IG1pZ2h0IGRlZmluZSBpdHMgb3duIGFkZGl0aW9ucy4gRXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkKLWNvbnRlbnQgb2YgdGhlIGJhc2UgcGx1Zy1pbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcKLXBsdWctaW4gdG8gZGVmaW5lIGl0cyBvd24gY29udGVudCB3aGljaCBpcyBhIHZhcmlhbnQgb2YgY29udGVudCBhbHJlYWR5IGRlZmluZWQuCi1Gb3IgZXhhbXBsZSwgYSBzcGVjaWFsIHZlcnNpb24gb2YgYSBnZW5lcmljIFJldmlldyBSZWNvcmQgZm9yIGEgc3BlY2lmaWMgdHlwZQotb2YgcmV2aWV3LiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBlbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZwotZWxlbWVudHMgY2FuIGJlIHVzZWQgc2lkZSBieSBzaWRlLCBidXQgcmVmZXIgdG8gZWFjaCBvdGhlciB0aHJvdWdoIHRoZSBleHRlbmRzCi1yZWxhdGlvbnNoaXAuIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBjYXBhYmlsaXR5Ci1wYXR0ZXJucyB0byBwcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwCi1mcm9tIGFuIGFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBwcm9jZXNzZXMgdG8gdGhlIGNhcGFiaWxpdHkgcGF0dGVybi4gVGhlCi1hY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgZnJvbSB0aGUgcGF0dGVybiBhbmQgdGhlIHBhdHRlcm4gYXBwZWFycwotdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIHByb2Nlc3MgYWZ0ZXIgaW50ZXJwcmV0YXRpb24uPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCN2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjb250cmlidXRlcy5odG1sIj5Db250cmlidXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0icmVwbGFjZS5odG1sI3JlcGxhY2VzIj5SZXBsYWNlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iZXh0ZW5kcy5odG1sI2V4dGVuZHMiPkV4dGVuZHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3ZhcmlhYmlsaXR5YXNzb2NpYXRpb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YTNkMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwjdmFyaWFiaWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJEQy5SZWxhdGlvbiIgc2NoZW1lPSJVUkkiIGNvbnRlbnQ9InZhcmlhYmlsaXR5Lmh0bWwiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+VmFyaWFiaWxpdHkgQXNzb2NpYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ2YXJpYWJpbGl0eWFzc29jaWF0aW9ucyI+PGEgbmFtZT0idmFyaWFiaWxpdHlhc3NvY2lhdGlvbnMiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYXJpYWJpbGl0eSBBc3NvY2lhdGlvbnM8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBpbmNvbWluZyBhbmQgb3V0Z29pbmcgYXNzb2NpYXRpb25zIGZvciBlYWNoCi1lbGVtZW50IHR5cGUgZm9yIHdoaWNoIHZhcmlhYmlsaXR5IGNhbiBiZSB1c2VkLiBBc3NvY2lhdGlvbnMgYWxzbyBoYXZlIGEgY2FyZGluYWxpdHkKLW9mIHRvLW1hbnkgb3IgdG8tb25lLgotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCIgc3VtbWFyeT0iIiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPjx0aGVhZCBhbGlnbj0ibGVmdCI+PHRyIHZhbGlnbj0iYm90dG9tIj48dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUxNiI+RWxlbWVudCBUeXBlPC90aD4KLTx0aCB2YWxpZ249ImJvdHRvbSIgaWQ9ImQwZTE4Ij5Bc3NvY2lhdGVkIEVsZW1lbnQgVHlwZTwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJkMGUyMCI+QXNzb2NpYXRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+PHRyPjx0ZCByb3dzcGFuPSI4IiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Xb3JrIFByb2R1Y3Q8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRhaW5lZCBhcnRpZmFjdHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRlbGl2ZXJhYmxlIHBhcnRzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5ndWlkYW5jZTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y29udGFpbmVyIGFydGlmYWN0PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+ZGVsaXZlcmFibGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZXNwb25zaWJsZSByb2xlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+aW5wdXQgYW5kIG91dHB1dCB0byB0YXNrczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlJvbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJlc3BvbnNpYmxlIGZvciB3b3JrIHByb2R1Y3Q8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmd1aWRhbmNlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5wZXJmb3JtZXIgaW4gdGFzazwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjciIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPlRhc2s8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnByaW1hcnkgcGVyZm9ybWVyIHJvbGU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+YWRkaXRpb25hbCBwZXJmb3JtZXIgcm9sZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Z3VpZGFuY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnN0ZXBzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRpc2NpcGxpbmU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgZDBlMTggZDBlMjAgIj5DYXRlZ29yaWVzPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkN1c3RvbSBDYXRlZ29yeTwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgZWxlbWVudHM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPm90aGVyIGN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjQiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPkRpc2NpcGxpbmU8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHRhc2tzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5yZWZlcmVuY2VkIHdvcmtmbG93IGFjdGl2aXR5PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmRpc2NpcGxpbmUgZ3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW9uZTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIyIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5EaXNjaXBsaW5lIEdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCBkaXNjaXBsaW5lczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iNCIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+RG9tYWluPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB3b3JrIHByb2R1Y3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5zdWItZG9tYWluczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+c3VwZXItZG9tYWluczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tb25lPC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmN1c3RvbSBjYXRlZ29yaWVzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHJvd3NwYW49IjIiIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxNiAiPldvcmsgUHJvZHVjdCBUeXBlPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jYXRlZ29yaXplZCB3b3JrIHByb2R1Y3RzPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5vdXQtbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTggIj5jdXN0b20gY2F0ZWdvcmllczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+aW4tbWFueTwvdGQ+Ci08L3RyPgotPHRyPjx0ZCByb3dzcGFuPSIzIiB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMTYgIj5Sb2xlIFNldDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y2F0ZWdvcml6ZWQgcm9sZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPm91dC1tYW55PC90ZD4KLTwvdHI+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnJvbGUgc2V0IGdyb3VwaW5nPC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iZDBlMjAgIj5pbi1vbmU8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+Um9sZSBTZXQgR3JvdXBpbmc8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNhdGVnb3JpemVkIHJvbGUgc2V0czwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE4ICI+Y3VzdG9tIGNhdGVnb3JpZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUyMCAiPmluLW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgY29sc3Bhbj0iMyIgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2IGQwZTE4IGQwZTIwICI+R3VpZGFuY2U8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+UHJhY3RpY2U8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPmNvbnRlbnQgZWxlbWVudDwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTE2ICI+T3RoZXIgR3VpZGFuY2UgVHlwZXM8L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJkMGUxOCAiPnNlY3Rpb25zIHZpYSBjb250ZW50IGRlc2NyaXB0aW9uczwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9ImQwZTIwICI+b3V0LW1hbnk8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sIiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ2YXJpYWJpbGl0eS5odG1sI3ZhcmlhYmlsaXR5IiB0aXRsZT0iVmFyaWFiaWxpdHkgYWxsb3dzIGVsZW1lbnRzIGluIG9uZSBjb250ZW50IHBhY2thZ2UgdG8gaW5mbHVlbmNlIG9yIG1vZGlmeSBlbGVtZW50cyBpbiBvdGhlciBjb250ZW50IHBhY2thZ2VzIHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LiBWYXJpYWJpbGl0eSBlbmFibGVzIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgd2hpbGUga2VlcGluZyB0aGUgY2hhbmdlcyBzZXBhcmF0ZSBhbmQgb3B0aW9uYWwuIj5WYXJpYWJpbGl0eTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1ZTZiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzNDJjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21jX3ZzX3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGYxYjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvbWNfdnNfcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9tZXRob2RhdXRob3JpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4ZGQwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL21ldGhvZGF1dGhvcmluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPk1ldGhvZCBDb250ZW50IEF1dGhvcmluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29udGVudCBkZXNjcmliZXMgcm9sZXMsIHRoZSB0YXNrcyB0aGF0IHRoZXkgcGVyZm9ybSwgdGhlIHdvcmsgcHJvZHVjdHMKLSAgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQgYnkgdGhvc2UgdGFza3MsIGFuZCBzdXBwb3J0aW5nIGd1aWRhbmNlLjwvcD4KLTxwPjxpbWcgc3JjPSJtYy5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgZGVwaWN0cyB0eXBpY2FsIHNvdXJjZXMgZm9yIG1ldGhvZCBjb250ZW50LCBhcyB3ZWxsIGFzIGhvdwotICB0aGUgbWV0aG9kIGNvbnRlbnQgaXMgcmVwcmVzZW50ZWQgaW4gRVBGIENvbXBvc2VyLiBNYW55IGRldmVsb3BtZW50IG1ldGhvZHMgYXJlIGRlc2NyaWJlZAotICBpbiBwdWJsaWNhdGlvbnMgc3VjaCBhcyBib29rcywgYXJ0aWNsZXMsIHRyYWluaW5nIG1hdGVyaWFsLCBzdGFuZGFyZHMgYW5kIHJlZ3VsYXRpb25zLAotICBhbmQgb3RoZXIgZm9ybXMgb2YgZG9jdW1lbnRhdGlvbi4gVGhlc2Ugc291cmNlcyB1c3VhbGx5IGRvY3VtZW50IG1ldGhvZHMgYnkKLSAgcHJvdmlkaW5nIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIGEgcGFydGljdWxhciB3YXkgb2YgYWNoaWV2aW5nIGEgc3BlY2lmaWMKLSAgZGV2ZWxvcG1lbnQgZ29hbCB1bmRlciBnZW5lcmFsIGNpcmN1bXN0YW5jZXMuIFNvbWUgZXhhbXBsZXMgYXJlOiB0cmFuc2Zvcm1pbmcKLSAgYSByZXF1aXJlbWVudHMgZG9jdW1lbnQgaW50byBhbiBhbmFseXNpcyBtb2RlbDsgZGVmaW5pbmcgYW4gYXJjaGl0ZWN0dXJhbCBtZWNoYW5pc20KLSAgYmFzZWQgb24gZnVuY3Rpb25hbCBhbmQgbm9uLWZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzOyBjcmVhdGluZyBhIHByb2plY3QgcGxhbgotICBmb3IgYSBkZXZlbG9wbWVudCBpdGVyYXRpb247IGRlZmluaW5nIGEgcXVhbGl0eSBhc3N1cmFuY2UgcGxhbiBmb3IgZnVuY3Rpb25hbAotICByZXF1aXJlbWVudHM7IHJlZGVzaWduaW5nIGEgYnVzaW5lc3Mgb3JnYW5pemF0aW9uIGJhc2VkIG9uIGEgbmV3IHN0cmF0ZWdpYyBkaXJlY3Rpb24sCi0gIGFuZCBzbyBvbi48L3A+Ci08cD5FUEYgQ29tcG9zZXIgdGFrZXMgY29udGVudCBzdWNoIGFzIHRoYXQgZGVzY3JpYmVkIGFib3ZlLCBhbmQgc3RydWN0dXJlcyBpdCBpbiBhIHNwZWNpZmljCi0gIHNjaGVtYSBvZiByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZS4gVGhpcyBzY2hlbWEgc3VwcG9ydHMgdGhlCi0gIG9yZ2FuaXphdGlvbiBvZiBsYXJnZSBhbW91bnRzIG9mIGRlc2NyaXB0aW9ucyBmb3IgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLgotICBTdWNoIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgZG8gbm90IGhhdmUgdG8gYmUgbGltaXRlZCB0byBzb2Z0d2FyZSBlbmdpbmVlcmluZywKLSAgYnV0IGNhbiBhbHNvIGNvdmVyIG90aGVyIGRlc2lnbiBhbmQgZW5naW5lZXJpbmcgZGlzY2lwbGluZXMgc3VjaCBhcyBtZWNoYW5pY2FsCi0gIGVuZ2luZWVyaW5nLCBidXNpbmVzcyB0cmFuc2Zvcm1hdGlvbiwgc2FsZXMgY3ljbGVzLCBhbmQgc28gb24uPC9wPgotPHA+IFRoZSBFUEYgQ29tcG9zZXIgc2NyZWVuIGNhcHR1cmUgaW4gdGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc3VjaCBtZXRob2QgY29udGVudCBlbGVtZW50cwotICBhcmUgb3JnYW5pemVkIGluIHRyZWUgYnJvd3NlcnMgb24gdGhlIGxlZnQuIFRoZXNlIHRyZWUgYnJvd3NlcnMsIHNpbWlsYXIgdG8KLSAgYSBsaWJyYXJ5LCBwcm92aWRlIGRpZmZlcmVudCBpbmRleGVzIG9mIHRoZSBhdmFpbGFibGUgZWxlbWVudHMgZm9yIHJhcGlkIGFjY2Vzcy4KLSAgVGhlIHNjcmVlbiBjYXB0dXJlIHNob3dzIG9uIHRoZSByaWdodCBhbiBleGFtcGxlIG9mIGEgdGFzayBwcmVzZW50YXRpb24uIFRoaXMKLSAgdGFzayBwcmVzZW50YXRpb24gZGVmaW5lcyB0aGUgdGFzayBpbiB0ZXJtcyBvZiBzdGVwcyB0aGF0IG5lZWQgdG8gYmUgcGVyZm9ybWVkCi0gIHRvIGFjaGlldmUgdGhlIHRhc2sncyBwdXJwb3NlLiBZb3UgY2FuIHNlZSB0aGF0IHRoZSB0YXNrIGhhcyB2YXJpb3VzIHJlbGF0aW9uc2hpcHMsCi0gIHN1Y2ggYXMgcmVsYXRpb25zaGlwcyB0byBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgd29yayBwcm9kdWN0cyB0aGF0IHNlcnZlCi0gIGFzIGlucHV0cyBhbmQgb3V0cHV0cyB0byB0aGUgdGFzay4gRmluZCBvdXQgbW9yZSBkZXRhaWxzIG9uIHRhc2tzLCByb2xlLCBhbmQKLSAgd29yayBwcm9kdWN0cyBpbiB0aGUgb25saW5lIGhlbHAgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPmhlcmU8L2E+LgotICBJbiBhZGRpdGlvbiB0byByb2xlcywgdGFza3MsIGFuZCB3b3JrIHByb2R1Y3RzLCBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgdGhlIGFkZGl0aW9uIG9mCi0gIGd1aWRhbmNlIGVsZW1lbnRzLiBHdWlkYW5jZSBhcmUgc3VwcGxlbWVudGFyeSBmcmVlLWZvcm0gZG9jdW1lbnRhdGlvbiBzdWNoIGFzCi0gIHdoaXRlcGFwZXJzLCBjb25jZXB0IGRlc2NyaXB0aW9ucywgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBleGFtcGxlcywgYW5kIHNvIG9uLjwvcD4KLTxwPkVQRiBDb21wb3NlciBwcm92aWRlcyB2YXJpb3VzIGZvcm0tYmFzZWQgZWRpdG9ycyB0byBjcmVhdGUgbmV3IG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLgotICBEb2N1bWVudCB5b3VyIHRhc2ssIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudHMgdXNpbmcgaW50dWl0aXZlCi0gIHJpY2gtdGV4dCBlZGl0b3JzIHRoYXQgYWxsb3cgeW91IHRvIGNvcHkgYW5kIHBhc3RlIHRleHQgZnJvbSBvdGhlciBzb3VyY2VzIHN1Y2gKLSAgYXMgd2ViIHBhZ2VzIG9yIGRvY3VtZW50cy4gVXNlIHNpbXBsZSBkaWFsb2dzIHRvIGVzdGFibGlzaCByZWxhdGlvbnNoaXBzIGJldHdlZW4KLSAgY29udGVudCBlbGVtZW50cy48L3A+Ci08cD5FUEYgQ29tcG9zZXIgb3JnYW5pemVzIGNvbnRlbnQgaW4gcGh5c2ljYWwgY29udGVudCBwYWNrYWdlcyB0aGF0IGFsbG93IHlvdSB0byBtYW5hZ2UKLSAgeW91ciBjb250ZW50IGluIGNvbmZpZ3VyYWJsZSB1bml0cy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBjYXRlZ29yaXplIHlvdXIgY29udGVudAotICBiYXNlZCBvbiBhIHNldCBvZiBwcmVkZWZpbmVkIGNhdGVnb3JpZXMgKGZvciBleGFtcGxlLCBjYXRlZ29yaXplIHlvdXIgdGFza3MKLSAgaW50byBkZXZlbG9wbWVudCBkaXNjaXBsaW5lcywgb3IgeW91ciB3b3JrIHByb2R1Y3RzIGludG8gZG9tYWlucykgb3IgY3JlYXRlCi0gIHlvdXIgb3duIGNhdGVnb3JpemF0aW9uIHNjaGVtZXMgZm9yIHlvdXIgY29udGVudCB3aXRoIHlvdXIgb3duIHVzZXItZGVmaW5lZAotICBjYXRlZ29yaWVzIHRoYXQgYWxsb3cgeW91IHRvIGluZGV4IGNvbnRlbnQgaW4gYW55IHdheSB5b3Ugd2FudC48L3A+Ci08cD5Gb3IgbW9yZSBkZXRhaWxzIG9uIG1ldGhvZCBjb250ZW50IGF1dGhvcmluZyBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL21ldGhvZGF1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPk1ldGhvZAotICAgICAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD4mbmJzcDs8L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL292ZXJ2aWV3Lmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZjkxNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9vdmVydmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+SW50cm9kdWN0aW9uIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgKEVQRiBDb21wb3Nlcik8L2gzPgotPHA+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIChFUEYgQ29tcG9zZXIpLiBFUEYgQ29tcG9zZXIgaXMgYSB0b29sIHBsYXRmb3JtIHRoYXQgZW5hYmxlcwotICBwcm9jZXNzIGVuZ2luZWVycyBhbmQgbWFuYWdlcnMgdG8gaW1wbGVtZW50LCBkZXBsb3ksIGFuZCBtYWludGFpbiBwcm9jZXNzZXMKLSAgZm9yIG9yZ2FuaXphdGlvbnMgb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4gVHlwaWNhbGx5LCB0d28ga2V5IHByb2JsZW1zIG5lZWQgdG8KLSAgYmUgYWRkcmVzc2VkIHRvIHN1Y2Nlc3NmdWxseSBkZXBsb3kgbmV3IHByb2Nlc3Nlcy48L3A+Ci08cD4gRmlyc3QsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gYmUgZWR1Y2F0ZWQgb24gdGhlIG1ldGhvZHMgYXBwbGljYWJsZSB0bwotICB0aGUgcm9sZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuIFNvZnR3YXJlIGRldmVsb3BlcnMgdHlwaWNhbGx5IG5lZWQKLSAgdG8KLSAgbGVhcm4KLSAgaG93Ci0gIHRvCi0gIGRvIGFuYWx5c2lzIGFuZCBkZXNpZ24sIHRlc3RlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gdGVzdCBpbXBsZW1lbnRhdGlvbnMgYWdhaW5zdAotICAgcmVxdWlyZW1lbnRzLCBtYW5hZ2VycyBuZWVkIHRvIGxlYXJuIGhvdyB0byBtYW5hZ2UgdGhlIHByb2plY3Qgc2NvcGUgYW5kIGNoYW5nZSwKLQotICBhbmQgc28gb24uIFNvbWUgb3JnYW5pemF0aW9ucyBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzIGltcGxpY2l0bHkga25vdyBob3cgdG8KLSAgIGRvIHN1Y2ggd29yayB3aXRob3V0IGRvY3VtZW50aW5nIHRoZWlyIG1ldGhvZHMsIGJ1dCBtYW55IG9yZ2FuaXphdGlvbnMgd2FudAotCi0gIHRvIGVzdGFibGlzaCBjb21tb24gYW5kIHJlZ3VsYXRlZCBwcmFjdGljZXMsIHRvIGRyaXZlIHNwZWNpZmljIGltcHJvdmVtZW50Ci0gIG9iamVjdGl2ZXMsICBhbmQgdG8gbWVldCBjb21wbGlhbmNlIHN0YW5kYXJkcy48L3A+Ci08cD4gU2Vjb25kLCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRvIGFwcGx5IHRoZXNlIG1ldGhvZHMgdGhyb3VnaG91dAotICBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gVGhhdCBpcywgdGhleSBuZWVkIHRvIGRlZmluZSBvciBzZWxlY3QgYSBkZXZlbG9wbWVudAotICBwcm9jZXNzLiBGb3IKLQotICBleGFtcGxlLCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2RzIGhhdmUgdG8gYmUgYXBwbGllZCBkaWZmZXJlbnRseSBpbgotICBlYXJseSAgcGhhc2VzIG9mIGEgcHJvamVjdCB3aGVyZSB0aGUgZm9jdXMgaXMgb24gZWxpY2l0YXRpb24gb2Ygc3Rha2Vob2xkZXIKLSAgbmVlZHMgYW5kCi0gIHJlcXVpcmVtZW50cyBhbmQgc2NvcGluZyBhIHZpc2lvbiwgdGhhbiBpbiBsYXRlciBwaGFzZXMgd2hlcmUgdGhlIGZvY3VzIGlzCi0gIG9uICBtYW5hZ2luZyByZXF1aXJlbWVudHMgdXBkYXRlcyBhbmQgY2hhbmdlcyBhbmQgcGVyZm9ybWluZyBpbXBhY3QgYW5hbHlzaXMKLSAgb2YKLSAgdGhlc2UgcmVxdWlyZW1lbnRzIGNoYW5nZXMuIFRlYW1zIGFsc28gbmVlZCBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUKLSAgZGlmZmVyZW50ICB0YXNrcyBvZiB0aGUgbWV0aG9kcyByZWxhdGUgdG8gZWFjaCBvdGhlciwgZm9yIGV4YW1wbGUsIGhvdyB0aGUKLSAgY2hhbmdlIG1hbmFnZW1lbnQKLSAgbWV0aG9kIGltcGFjdHMgdGhlIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZCBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZwotICAgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4gRXZlbiBzZWxmLW9yZ2FuaXppbmcgdGVhbXMgbmVlZCB0byBkZWZpbmUKLSAgYQotICBwcm9jZXNzIHRoYXQgZ2l2ZXMgYXQgbWluaW11bSBzb21lIGd1aWRhbmNlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgd2lsbCBiZQotICBzY29wZWQgIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSwgd2hlbiBtaWxlc3RvbmVzIHdpbGwgYmUgYWNoaWV2ZWQgYW5kIHZlcmlmaWVkLAotICBhbmQKLSAgc28gb24uIDwvcD4KLTxwPlRvIHRoYXQgZW5kLCBFUEYgQ29tcG9zZXIgaGFzIHR3byBtYWluIHB1cnBvc2VzOiA8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij48dWw+Ci0gIDxsaT5UbyBwcm92aWRlIGEga25vd2xlZGdlIGJhc2Ugb2YgaW50ZWxsZWN0dWFsIGNhcGl0YWwgd2hpY2ggeW91IGNhbiBicm93c2UsCi0gICAgbWFuYWdlIGFuZCBkZXBsb3kuIFRoaXMgY29udGVudCBjYW4gaW5jbHVkZSBleHRlcm5hbGx5IGRldmVsb3BlZCBjb250ZW50LAotICAgIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgY2FuIGluY2x1ZGUgeW91ciBvd24gY29udGVudCBpbmNsdWRpbmcgb2Ygd2hpdGVwYXBlcnMsCi0gICAgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBwcmluY2lwbGVzLCBiZXN0IHByYWN0aWNlcywgaW50ZXJuYWwgcHJvY2VkdXJlcyBhbmQKLSAgICByZWd1bGF0aW9ucywgdHJhaW5pbmcgbWF0ZXJpYWwsIGFuZCBhbnkgb3RoZXIgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgeW91cgotICAgIG1ldGhvZHMuIFRoaXMga25vd2xlZGdlIGJhc2UgY2FuIHVzZWQgZm9yIHJlZmVyZW5jZSBhbmQgZWR1Y2F0aW9uLiBJdCBhbHNvCi0gICAgZm9ybXMgdGhlIGJhc2lzIGZvciBkZXZlbG9waW5nIHByb2Nlc3NlcyAodGhlIHNlY29uZCBwdXJwb3NlKS4gRVBGIENvbXBvc2VyIGlzIGRlc2lnbmVkCi0gICAgdG8gYmUgYSBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gbWFuYWdlbWVudCBzdHJ1Y3R1cmUKLSAgICBhbmQgbG9vayBhbmQgZmVlbCBmb3IgYWxsIG9mIHlvdXIgY29udGVudCwgcmF0aGVyIHRoYW4gYmVpbmcgYSBkb2N1bWVudCBtYW5hZ2VtZW50Ci0gICAgc3lzdGVtIGluIHdoaWNoIHlvdSB3b3VsZCBzdG9yZSBhbmQgYWNjZXNzIGhhcmQgdG8gbWFpbnRhaW4gbGVnYWN5IGRvY3VtZW50cwotICAgIGFsbCBpbiB0aGVpciBvd24gc2hhcGVzIGFuZCBmb3JtYXRzLiBBbGwgY29udGVudCBtYW5hZ2VkIGluIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkCi0gICAgdG8gaHRtbCBhbmQgZGVwbG95ZWQgdG8gV2ViIHNlcnZlcnMgZm9yIGRpc3RyaWJ1dGVkIHVzYWdlLjxicj4KLSAgPC9saT4KLSAgPGxpPlRvIHByb3ZpZGUgcHJvY2VzcyBlbmdpbmVlcmluZyBjYXBhYmlsaXRpZXMgYnkgc3VwcG9ydGluZyBwcm9jZXNzIGVuZ2luZWVycwotICAgIGFuZCBwcm9qZWN0IG1hbmFnZXJzIGluIHNlbGVjdGluZywgdGFpbG9yaW5nLCBhbmQgcmFwaWRseSBhc3NlbWJsaW5nIHByb2Nlc3NlcwotICAgIGZvciB0aGVpciBjb25jcmV0ZSBkZXZlbG9wbWVudCBwcm9qZWN0cy4gRVBGIENvbXBvc2VyIHByb3ZpZGVzIGNhdGFsb2dzIG9mIHByZS1kZWZpbmVkCi0gICAgcHJvY2Vzc2VzIGZvciB0eXBpY2FsIHByb2plY3Qgc2l0dWF0aW9ucyB0aGF0IGNhbiBiZSBhZGFwdGVkIHRvIGluZGl2aWR1YWwKLSAgICBuZWVkcy4gSXQgYWxzbyBwcm92aWRlcyBwcm9jZXNzIGJ1aWxkaW5nIGJsb2NrcywgY2FsbGVkIGNhcGFiaWxpdHkgcGF0dGVybnMsCi0gICAgdGhhdCByZXByZXNlbnQgYmVzdCBkZXZlbG9wbWVudCBwcmFjdGljZXMgZm9yIHNwZWNpZmljIGRpc2NpcGxpbmVzLCB0ZWNobm9sb2dpZXMsCi0gICAgb3IgbWFuYWdlbWVudCBzdHlsZXMuIFRoZXNlIGJ1aWxkaW5nIGJsb2NrcyBmb3JtIGEgdG9vbGtpdCBmb3IgcXVpY2sgYXNzZW1ibHkKLSAgICBvZiBwcm9jZXNzZXMgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBuZWVkcy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBzZXQgdXAKLSAgICB5b3VyIG93biBvcmdhbml6YXRpb24tc3BlY2lmaWMgY2FwYWJpbGl0eSBwYXR0ZXJuIGxpYnJhcmllcy4gRmluYWxseSwgdGhlCi0gICAgcHJvY2Vzc2VzIGNyZWF0ZWQgd2l0aCBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZCBhbmQgZGVwbG95ZWQgYXMgV2ViIHNpdGVzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08aDM+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcidzIEtleSBDYXBhYmlsaXRpZXM8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG5ldyBrZXkgY2FwYWJpbGl0aWVzOjwvcD4KLSAgPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT4gUHJvdmlkZXMgY29tcGxldGVseSByZWRlc2lnbmVkIHRvb2xzIGZvciBhdXRob3JpbmcsIGNvbmZpZ3VyaW5nLCB2aWV3aW5nLAotICAgIGFuZCBwdWJsaXNoaW5nIGRldmVsb3BtZW50IHByb2Nlc3Nlcy48L2xpPgotICA8bGk+IFByb3ZpZGVzIGp1c3QtaW4tdGltZSBnZW5lcmF0aW9uIG9mIHB1YmxpY2F0aW9uIHByZXZpZXdzIGluIGRlZGljYXRlZCBicm93c2luZwotICAgIHBlcnNwZWN0aXZlIHRoYXQgYWxsb3dzIHJhcGlkIGNvbmZpZ3VyYXRpb24gc3dpdGNoaW5nLjwvbGk+Ci0gIDxsaT4gTWFuYWdlcyBtZXRob2QgY29udGVudCB1c2luZyBzaW1wbGUgZm9ybS1iYXNlZCB1c2VyIGludGVyZmFjZXMuIFRoZXJlZm9yZSwKLSAgICBVTUwgbW9kZWxpbmcgc2tpbGxzIGFyZSBubyBsb25nZXIgcmVxdWlyZWQuPC9saT4KLSAgPGxpPiBQcm92aWRlcyBpbnR1aXRpdmUgcmljaCB0ZXh0IGVkaXRvcnMgZm9yIGNyZWF0aW5nIGlsbHVzdHJhdGl2ZSBjb250ZW50Ci0gICAgZGVzY3JpcHRpb25zLiBFZGl0b3JzIGFsbG93IHVzZSBvZiBzdHlsZXMsIGltYWdlcywgdGFibGVzLCBoeXBlcmxpbmtzLCBhbmQKLSAgICBkaXJlY3QgaHRtbCBlZGl0aW5nLjwvbGk+Ci0gIDxsaT5BbGxvd3MgY3JlYXRpbmcgcHJvY2Vzc2VzIHdpdGggYnJlYWtkb3duIHN0cnVjdHVyZSBlZGl0b3JzIGFuZCB3b3JrZmxvdwotICAgIGRpYWdyYW1zIHRocm91Z2ggdXNlIG9mIG11bHRpLXByZXNlbnRhdGlvbiBwcm9jZXNzIGVkaXRvcnMuIEJyZWFrZG93biBzdHJ1Y3R1cmUKLSAgICBlZGl0b3Igc3VwcG9ydHMgZGlmZmVyZW50IHByb2Nlc3Mgdmlld3M6IHdvcmstYnJlYWtkb3duIHZpZXcsIHdvcmsgcHJvZHVjdAotICAgIHVzYWdlIHZpZXcsIGFuZCB0ZWFtIGFsbG9jYXRpb24gdmlldy4gRVBGIENvbXBvc2VyIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIGFsbCBwcmVzZW50YXRpb25zCi0gICAgd2l0aCBwcm9jZXNzIGNoYW5nZXMuIDwvbGk+Ci0gIDxsaT5Qcm92aWRlcyBzdXBwb3J0IGZvciBtYW55IGFsdGVybmF0aXZlIGxpZmVjeWNsZQotICAgIG1vZGVscy4gRm9yIGV4YW1wbGUsIHdhdGVyZmFsbCwgaW5jcmVtZW50YWwsIG9yIGl0ZXJhdGl2ZSBtb2RlbHMgY2FuIGJlIGNyZWF0ZWQKLSAgICB3aXRoIHRoZSBzYW1lIG92ZXJsYXBwaW5nIG1ldGhvZCBjb250ZW50LjwvbGk+Ci0gIDxsaT5JbXByb3ZlZCByZXVzZSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMuIFRoZSBwbHVnLWluIG1lY2hhbmlzbXMgZnJvbQotICAgIHBhc3QgdmVyc2lvbnMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHN1cHBvcnQgZXh0ZW5zaW9ucyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC9saT4KLSAgPGxpPlN1cHBvcnRzIHJldXNhYmxlIGR5bmFtaWNhbGx5LWxpbmtlZCBwcm9jZXNzIHBhdHRlcm5zIG9mIGJlc3QgcHJhY3RpY2VzCi0gICAgZm9yIHJhcGlkIHByb2Nlc3MgYXNzZW1ibHkgdmlhIGRyYWctYW5kLWRyb3AuPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxoMz5LZXkgVGVybWlub2xvZ3kgYW5kIENvbmNlcHRzPC9oMz4KLTxwPlRvIGVmZmVjdGl2ZWx5IHdvcmsgd2l0aCBFUEYgQ29tcG9zZXIsIHlvdSBuZWVkIHRvIHVuZGVyc3RhbmQgYSBmZXcgY29uY2VwdHMKLSAgdGhhdCBhcmUgdXNlZCB0byBvcmdhbml6ZSB0aGUgY29udGVudC4gVGhlIHBhZ2VzIDxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9tZXRob2RhdXRob3JpbmdvdmVydmlldy5odG1sIj5NZXRob2QKLSAgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvcHJvY2Vzc2F1dGhvcmluZ292ZXJ2aWV3Lmh0bWwiPlByb2Nlc3MKLSAgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPiBjb250YWluIG1vcmUgZGV0YWlsIGFuZCBjb25jcmV0ZSBleGFtcGxlcyBvZiBob3cgdG8gd29yawotICBpbiB0aGUgdG9vbC4gVGhpcyBwYWdlIHByb3ZpZGVzIHlvdSB3aXRoIGEgZ2VuZXJhbCBvdmVydmlldyBvZiB0aGVzZSBjb25jZXB0cy48L3A+Ci08cD5UaGUgbW9zdCBmdW5kYW1lbnRhbCBwcmluY2lwbGUgaW4gRVBGIENvbXBvc2VyIGlzIHRoZSBzZXBhcmF0aW9uIG9mIHJldXNhYmxlIGNvcmUgbWV0aG9kCi0gIGNvbnRlbnQgZnJvbSBpdHMgYXBwbGljYXRpb24gaW4gcHJvY2Vzc2VzLiBUaGlzIGRpcmVjdGx5IHJlbGF0ZXMgYmFjayB0byB0aGUKLSAgdHdvIHB1cnBvc2VzIG9mIEVQRiBDb21wb3NlciBkZXNjcmliZWQgaW4gdGhlIGZpcnN0IHNlY3Rpb24uIEFsbW9zdCBhbGwgb2YgRVBGIENvbXBvc2VyJ3MgY29uY2VwdHMKLSAgYXJlIGNhdGVnb3JpemVkIGFsb25nIHRoaXMgc2VwYXJhdGlvbi4gTWV0aG9kIGNvbnRlbnQgZGVzY3JpYmVzIHdoYXQgaXMgdG8gYmUKLSAgcHJvZHVjZWQsIHRoZSBuZWNlc3Nhcnkgc2tpbGxzIHJlcXVpcmVkIGFuZCB0aGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBkZXNjcmliaW5nCi0gIGhvdyBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQuIFRoZXNlIG1ldGhvZCBjb250ZW50IGRlc2NyaXB0aW9ucwotICBhcmUgaW5kZXBlbmRlbnQgb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuIFByb2Nlc3NlcyBkZXNjcmliZSB0aGUgZGV2ZWxvcG1lbnQKLSAgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgdGFrZSB0aGUgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkCi0gIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLjwvcD4KLTxwPjxpbWcgc3JjPSJ1bWFfaHVtcC5naWYiPjwvcD4KLTxwPlRoZSBmaWd1cmUgYWJvdmUgc2hvd3MgaG93IHRoaXMgc2VwYXJhdGlvbiBpcyBkZXBpY3RlZCBpbiBCYXNpYyBVbmlmaWVkCi0gIFByb2Nlc3MuIE1ldGhvZCBjb250ZW50LCBkZXNjcmliaW5nIGhvdyBkZXZlbG9wbWVudCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCwKLSAgaXMgY2F0ZWdvcml6ZWQgYnkgZGlzY2lwbGluZXMgYWxvbmcgdGhlIHktYXhpcyBvZiB0aGUgZGlhZ3JhbS4gVGhlIHdvcmsgZGVzY3JpYmVkCi0gIGluIGEgcHJvY2VzcyBpcyBzZWVuIGFsb25nIHRoZSB4LWF4aXMgcmVwcmVzZW50aW5nIHRoZSB0aW1lbGluZS4gVGhpcyBpcyB0aGUKLSAgbGlmZWN5Y2xlIG9mIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gSXQgZXhwcmVzc2VzIHdoZW4gd2hhdCB3b3JrIHdpbGwgYmUgcGVyZm9ybWVkLgotICBUaGUgZ3JhcGggaW4gdGhlIGlsbHVzdHJhdGlvbiByZXByZXNlbnRzIGFuIGVzdGltYXRlZCB3b3JrbG9hZCBmb3IgZWFjaCBkaXNjaXBsaW5lLgotICBBcyB5b3Ugc2VlLCBmb3IgZXhhbXBsZSwgb25lIG5ldmVyIHN0b3BzIHdvcmtpbmcgb24gcmVxdWlyZW1lbnRzIGluIFJVUCwgYnV0Ci0gIHRoZXJlIGFyZSBjZXJ0YWlubHkgcGVhayB0aW1lcyBpbiB3aGljaCBtb3N0IG9mIHRoZSByZXF1aXJlbWVudHMgZWxpY2l0YXRpb24KLSAgYW5kIGRlc2NyaXB0aW9uIHdvcmsgaXMgcGVyZm9ybWVkLiBUaGVyZSBhcmUgYWxzbyB0aW1lcyBhdCB3aGljaCBhIGRvd253YXJkCi0gIHRyZW5kIG5lZWRzIHRvIGJlIG9ic2VydmVkIHdoZXJlIGZld2VyIGFuZCBmZXdlciByZXF1aXJlbWVudHMgY2hhbmdlcyBoYXZlIHRvCi0gIGJlIHByb2Nlc3NlZCB0byBicmluZyB0aGUgcHJvamVjdCB0byBhIGNsb3NlLiBUaGlzIGF2b2lkcyB3aGF0IGlzIHJlZmVycmVkIHRvCi0gIGFzIGZlYXR1cmUgY3JlZXAgaW4gd2hpY2ggcmVxdWlyZW1lbnRzIHdvcmsgcmVtYWlucyBjb25zdGFudCBvciBldmVuIGluY3JlYXNlcy4KLSAgSGVuY2UsIGEgbGlmZWN5Y2xlIChwcm9jZXNzKSBleHByZXNzZXMgdGhlIHZhcmlhbmNlcyBvZiB3b3JrIHBlcmZvcm1lZCBpbiB0aGUKLSAgdmFyaW91cyBkaXNjaXBsaW5lcyAobWV0aG9kIGNvbnRlbnQpLjwvcD4KLTxwPjxpbWcgc3JjPSJtY192c19wLmdpZiI+PC9wPgotPHA+VGhlIHBpY3R1cmUgYWJvdmUgcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIHRoZSBrZXkgZWxlbWVudHMgdXNlZCBpbiBFUEYgQ29tcG9zZXIgYW5kIGhvdwotICB0aGV5IHJlbGF0ZSB0byBtZXRob2QgY29udGVudCBvciBwcm9jZXNzLiBBcyB5b3Ugc2VlLCBtZXRob2QgY29udGVudCBpcyBwcmltYXJpbHkKLSAgZXhwcmVzc2VkIHVzaW5nIHdvcmsgcHJvZHVjdHMsIHJvbGVzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBHdWlkYW5jZSwgc3VjaCBhcwotICBjaGVja2xpc3RzLCBleGFtcGxlcywgb3Igcm9hZG1hcHMsIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gcHJvdmlkZSBleGVtcGxhcnkKLSAgd2Fsa3Rocm91Z2hzIG9mIGEgcHJvY2Vzcy4gT24gdGhlIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGUgZGlhZ3JhbSwgeW91IHNlZSB0aGUKLSAgZWxlbWVudHMgdXNlZCB0byByZXByZXNlbnQgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci4gVGhlIG1haW4gZWxlbWVudCBpcyB0aGUgYWN0aXZpdHkKLSAgdGhhdCBjYW4gYmUgbmVzdGVkIHRvIGRlZmluZSBicmVha2Rvd24gc3RydWN0dXJlcyBhcyB3ZWxsIGFzIHJlbGF0ZWQgdG8gZWFjaAotICBvdGhlciB0byBkZWZpbmUgYSBmbG93IG9mIHdvcmsuIEFjdGl2aXRpZXMgYWxzbyBjb250YWluIGRlc2NyaXB0b3JzIHRoYXQgcmVmZXJlbmNlCi0gIG1ldGhvZCBjb250ZW50LiBBY3Rpdml0aWVzIGFyZSB1c2VkIHRvIGRlZmluZSBwcm9jZXNzZXMgb2Ygd2hpY2ggRVBGIENvbXBvc2VyIHN1cHBvcnQKLSAgdHdvIG1haW4ga2luZHM6IGRlbGl2ZXJ5IHByb2Nlc3NlcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJucy4gRGVsaXZlcnkgcHJvY2Vzc2VzCi0gIHJlcHJlc2VudCBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIHByb2Nlc3MgdGVtcGxhdGUgZm9yIHBlcmZvcm1pbmcgb25lIHNwZWNpZmljCi0gIHR5cGUgb2YgcHJvamVjdC4gVGhleSBkZXNjcmliZSBhIGNvbXBsZXRlIGVuZC10by1lbmQgcHJvamVjdCBsaWZlY3ljbGUgYW5kIGFyZQotICB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MuIENhcGFiaWxpdHkKLSAgcGF0dGVybnMgYXJlIHByb2Nlc3NlcyB0aGF0IGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhCi0gIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBkaXNjaXBsaW5lIG9yIGEgYmVzdCBwcmFjdGljZS4gVGhleSBhcmUgYWxzbwotICB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBkZWxpdmVyeSBwcm9jZXNzZXMgb3IgbGFyZ2VyIGNhcGFiaWxpdHkKLSAgcGF0dGVybnMuIFRoaXMgZW5zdXJlcyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGVpciBrZXkgYmVzdCBwcmFjdGljZXMKLSAgaW4gcHJvY2VzcyBhdXRob3JpbmcgYWN0aXZpdGllcyBpbiBFUEYgQ29tcG9zZXIuIDwvcD4KLQotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyLCBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL2Fib3V0ZXBmY29tcG9zZXIuaHRtbCI+T3ZlcnZpZXc8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9zdGFuZGFyZG1ldGhvZGxpYnJhcnlvdmVydmlldy5odG1sIj5HZXR0aW5nCi0gICAgICBTdGFydGVkPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08cD48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I4Njg4Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS9wcm9jZXNzYXV0aG9yaW5nLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3Byb2Nlc3NhdXRob3JpbmcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4NDIyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3Byb2Nlc3NhdXRob3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTxoZWFkPgotPHRpdGxlPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgzPlByb2Nlc3MgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPkEgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZWZpbmVzIHNlcXVlbmNlcyBvZiB0YXNrcyBwZXJmb3JtZWQgYnkgcm9sZXMgYW5kIHdvcmsKLSAgcHJvZHVjdHMgcHJvZHVjZWQgb3ZlciB0aW1lLjwvcD4KLTxwPjxpbWcgc3JjPSJwLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyB0aGF0IHByb2Nlc3NlcyBhcmUgdHlwaWNhbGx5IGV4cHJlc3NlZCBhcyB3b3JrZmxvd3MKLSAgb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMuIERlZmluaW5nIGEgc3RyaWN0IHNlcXVlbmNlIGFzIGluIGEgd2F0ZXJmYWxsIG1vZGVsCi0gIGlzIGFzIG11Y2ggYSBwcm9jZXNzIGFzIGRlZmluaW5nIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgaW4gaXRlcmF0aW9ucyBvZiBwYXJhbGxlbAotICB3b3JrLiBUaGV5IGp1c3QgcmVwcmVzZW50IGRpZmZlcmVudCBkZXZlbG9wbWVudCBhcHByb2FjaGVzLiBIZW5jZSwgZm9yIGRlZmluaW5nCi0gIGEgcHJvY2Vzcywgb25lIGNhbiB0YWtlIG1ldGhvZCBjb250ZW50IGFuZCBjb21iaW5lIGl0IGludG8gc3RydWN0dXJlcyB0aGF0IHNwZWNpZnkKLSAgaG93IHRoZSB3b3JrIHNoYWxsIGJlIG9yZ2FuaXplZCBvdmVyIHRpbWUsIHRvIG1lZXQgdGhlIG5lZWRzIG9mIGEgcGFydGljdWxhcgotICB0eXBlIG9mIGRldmVsb3BtZW50IHByb2plY3QgKHN1Y2ggYXMgc29mdHdhcmUgZm9yIGEgb25saW5lIHN5c3RlbSB2ZXJzdXMgc29mdHdhcmUKLSAgYW5kIGhhcmR3YXJlIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0pLiBFUEYgQ29tcG9zZXIgc3VwcG9ydHMgcHJvY2Vzc2VzIGJhc2VkIG9uIGRpZmZlcmVudAotICBkZXZlbG9wbWVudCBhcHByb2FjaGVzIGFjcm9zcyBtYW55IGRpZmZlcmVudCBsaWZlY3ljbGUgbW9kZWxzLCBpbmNsdWRpbmcgd2F0ZXJmYWxsLAotICBpbmNyZW1lbnRhbCwgYW5kIGl0ZXJhdGl2ZSBsaWZlY3ljbGVzLiBFUEYgQ29tcG9zZXIgYWxzbyBzdXBwb3J0cyBkaWZmZXJlbnQgcHJlc2VudGF0aW9ucwotICBmb3IgcHJvY2Vzcywgc3VjaCBhcyB3b3JrLWJyZWFrZG93biBzdHJ1Y3R1cmUgb3Igd29ya2Zsb3cgcHJlc2VudGF0aW9ucy4gWW91Ci0gIGNhbiBhbHNvIGRlZmluZSBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIHRoYXQgdXNlIGEgbWluaW1hbCBzZXQgb2YgbWV0aG9kIGNvbnRlbnQgdG8KLSAgZGVmaW5lIHByb2Nlc3NlcyBmb3IgYWdpbGUsIHNlbGYtb3JnYW5pemluZyB0ZWFtcy48L3A+Ci08cD4gVGhlIEVQRiBDb21wb3NlciBzY3JlZW4gY2FwdHVyZSBhYm92ZSBzaG93cyBhbiBleGFtcGxlIG9mIGEgcHJvY2VzcyBwcmVzZW50ZWQgYXMgYQotICBicmVha2Rvd24gc3RydWN0dXJlIG9mIG5lc3RlZCBhY3Rpdml0aWVzIGFzIHdlbGwgYXMgYSB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtCi0gIGZvciBvbmUgcGFydGljdWxhciBhY3Rpdml0eSwgdGhlIGluY2VwdGlvbiBwaGFzZS4gSXQgYWxzbyBpbmRpY2F0ZXMgd2l0aCB0aGUKLSAgdHdvIGJsdWUgYXJyb3dzIHRoYXQgdGhlIHBhcnRpY3VsYXIgbWV0aG9kIGNvbnRlbnQgdGFzayAmcXVvdDtEZXRhaWwgYSBVc2UgQ2FzZSZxdW90OwotICBoYXMgYmVlbiBhcHBsaWVkIGluIHRoZSBwcm9jZXNzIHR3aWNlOyBmaXJzdGx5IGluIHRoZSBpbmNlcHRpb24gcGhhc2UgdW5kZXIKLSAgdGhlIGFjdGl2aXR5ICZxdW90O0RlZmluZSB0aGUgU3lzdGVtLCZxdW90OyBhbmQgc2Vjb25kbHksIGluIHRoZSBlbGFib3JhdGlvbgotICBwaGFzZSBpbiB0aGUgYWN0aXZpdHkgJnF1b3Q7UmVmaW5lIHRoZSBzeXN0ZW0gZGVmaW5pdGlvbiZxdW90Oy4gWW91IHNlZSBiZWxvdwotICBlYWNoIG9mIHRoZXNlIHRhc2sgYXBwbGljYXRpb25zLCByZWZlcnJlZCB0byBhcyBhIHRhc2sgZGVzY3JpcHRvcnMgaW4gRVBGIENvbXBvc2VyLCBsaXN0cwotICBvZiB0aGUgcGVyZm9ybWluZyByb2xlcyBhcyB3ZWxsIGFzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuIElmIHlvdQotICBsb29rIGNsb3NlbHksIHlvdSBzZWUgdGhhdCB0aGVzZSBsaXN0cyBhcmUgZGlmZmVyZW50IGZvciBlYWNoIG9mIHRoZXNlIHR3byB0YXNrCi0gIGRlc2NyaXB0b3JzLCBleHByZXNzaW5nIGRpZmZlcmVuY2VzIGluIHBlcmZvcm1pbmcgdGhlICZxdW90O0RldGFpbCBhIFVzZSBDYXNlJnF1b3Q7Ci0gIG1ldGhvZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUuIFlvdSBzZWUgZGlmZmVyZW50IHJvbGVzIGludm9sdmVkIGFuZCBjaGFuZ2VzCi0gIGluIHRoZSBsaXN0IG9mIGlucHV0cyB0byBiZSBjb25zaWRlcmVkIGFuZCBvdXRwdXRzIHRvIGJlIHByb2R1Y2VkIG9yIHVwZGF0ZWQuCi0gIFRoZXNlIGNoYW5nZXMgd2VyZSBkZWZpbmVkIGJ5IHRoZSBhdXRob3IgdGhhdCBjcmVhdGVkIHRoaXMgcHJvY2VzcyB0byBleHByZXNzCi0gIHRoZSBleGFjdCBmb2N1cyBvZiB0aGUgdGFzayBwZXJmb3JtYW5jZSBmb3IgZWFjaCBvY2N1cnJlbmNlLiBJbiBhZGRpdGlvbiB0bwotICB1cGRhdGluZyB0aGUgcm9sZXMsIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cyBmb3IgYSB0YXNrIGRlc2NyaXB0b3IsIHlvdQotICBjYW4gYWxzbyBwcm92aWRlIGFkZGl0aW9uYWwgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlIGV4YWN0Ci0gIHN0ZXBzIG9mIHRoZSB0YXNrIHRoYXQgc2hvdWxkIGFuZCBzaG91bGQgbm90IGJlIHBlcmZvcm1lZCBmb3IgdGhpcyBwYXJ0aWN1bGFyCi0gIG9jY3VycmVuY2Ugb2YgdGhlIHRhc2suPC9wPgotPHA+RVBGIENvbXBvc2VyIHByb3ZpZGVzIHlvdSB3aXRoIGEgcHJvY2VzcyBlZGl0b3IgdGhhdCBzdXBwb3J0cyBkaWZmZXJlbnQgYnJlYWtkb3duIHN0cnVjdHVyZQotICB2aWV3cyBhcyB3ZWxsIGFzIGdyYXBoaWNhbCBwcm9jZXNzIHByZXNlbnRhdGlvbnMuIEFzIGEgcHJvY2VzcyBhdXRob3IsIHlvdSB0eXBpY2FsbHkKLSAgc3RhcnQgYnkgY3JlYXRpbmcgYW4gYWN0aXZpdHkgYnJlYWtkb3duLCBkaXZpZGluZyBhbmQgYnJlYWtpbmcgeW91ciBwcm9jZXNzCi0gIGRvd24gaW50byBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBoaWdoLWxldmVsIGFjdGl2aXRpZXMuIEluc3RlYWQgb2YgY3JlYXRpbmcKLSAgeW91ciBhY3Rpdml0aWVzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGVkaXRvciwgeW91IGNhbiBhbHRlcm5hdGl2ZWx5IHdvcmsKLSAgaW4gYSBncmFwaGljYWwgYWN0aXZpdHkgZGlhZ3JhbSBlZGl0b3IgdGhhdCBhbGxvd3MgeW91IHRvIGdyYXBoaWNhbGx5IGNyZWF0ZQotICBhIHdvcmtmbG93IGZvciB5b3VyIGFjdGl2aXRpZXMuIFRvIGFzc2lnbiBtZXRob2QgY29udGVudCB0byB5b3VyIHByb2Nlc3MsIHlvdQotICB0aGVuIGhhdmUgdGhlIGNob2ljZSBvZiB3b3JraW5nIGluIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzICh3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUsCi0gIHdvcmsgcHJvZHVjdCB1c2FnZSwgb3IgdGVhbSBhbGxvY2F0aW9uIHZpZXcpLiBFYWNoIHZpZXcgc3VwcG9ydHMgYSBkaWZmZXJlbnQKLSAgYXBwcm9hY2ggZm9yIGNyZWF0aW5nIGEgcHJvY2Vzcy4gWW91IGNhbiBkZWZpbmUgdGhlIHdvcmsgdG8gYmUgZG9uZSwgZGVmaW5lCi0gIHRoZSByZXN1bHRzIHRvIGJlIHByb2R1Y2VkLCBvciBkZWZpbmUgcmVzcG9uc2liaWxpdGllcyBmb3IgeW91ciByb2xlcy4gSWYgcmVxdWVzdGVkLAotICB0aGUgZWRpdG9yIHVwZGF0ZXMgdGhlIG90aGVyIHByb2Nlc3Mgdmlld3Mgc2VtaS1hdXRvbWF0aWNhbGx5IHVzaW5nIHdpemFyZHMKLSAgdGhhdCBwcm9tcHQgeW91IGZvciBkZWNpc2lvbnMgb24gc2VsZWN0aW5nIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzLjwvcD4KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gcHJvY2VzcyBhdXRob3Jpbmcgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9wcm9jZXNzYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+UHJvY2VzcwotICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyNTQ3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3B1Ymxpc2hpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHVibGlzaGluZy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGI4YzFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dlbGNvbWUvcHVibGlzaGluZy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPGhlYWQ+Ci08dGl0bGU+Q29uZmlndXJhdGlvbiBhbmQgUHVibGlzaGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5NZXRob2QgQ29uZmlndXJhdGlvbnMgT3ZlcnZpZXc8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBzaGlwcyB3aXRoIGEgbG90IG9mIGNvbnRlbnQgb3V0IG9mIHRoZSBib3guIEl0IGluY2x1ZGVzCi0gIHRoZSBPcGVuIFVuaWZpZWQgUHJvY2VzcyAoT3BlblVQKSBmcmFtZXdvcmsgYW5kIHZhcmlvdXMgcGx1Zy1pbnMgZXh0ZW5kaW5nCi0gIE9wZW5VUC9CYXNpYyB3aXRoIGRvbWFpbi1zcGVjaWZpYyBhZGRpdGlvbnMuIE5vIG9yZ2FuaXphdGlvbiBvciBwcm9qZWN0IHJlcXVpcmVzIGFsbCBvZiB0aGlzCi0gIGRvY3VtZW50YXRpb24gYWxsIGF0IG9uY2UsIGJ1dCB3b3VsZCB3b3JrIHdpdGggYSBzZWxlY3Rpb24gb2Ygc3BlY2lmaWMgc3Vic2V0cy48L3A+Ci08cD4gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciAoRVBGIENvbXBvc2VyKSBtYW5hZ2VzIGZvciB0aGF0IHB1cnBvc2Ugc28tY2FsbGVkIG1ldGhvZAotICBjb25maWd1cmF0aW9ucywgd2hpY2ggYWxsb3cgeW91IHRvIHNwZWNpZnkgd29ya2luZyBzZXRzIG9mIGNvbnRlbnQgYW5kIHByb2Nlc3NlcwotICBmb3IgYSBzcGVjaWZpYyBjb250ZXh0LCBzdWNoIGFzIGEgc3BlY2lmaWMgdmFyaWFudCBvZiB0aGUgUlVQIGZyYW1ld29yayB0aGF0Ci0gIHlvdSB3YW50IHRvIHB1Ymxpc2ggYW5kIGRlcGxveSBmb3IgYSBnaXZlbiBzb2Z0d2FyZSBwcm9qZWN0IG9yIGFzIGEgZm91bmRhdGlvbgotICBmb3IgYSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24uIEFsbCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gRVBGIENvbXBvc2VyIGFyZSBvcmdhbml6ZWQKLSAgaW4gbWV0aG9kIHBsdWctaW5zLCB3aGljaCBhcmUgb3JnYW5pemVkIGludG8gbWV0aG9kIHBhY2thZ2VzLiBBIG1ldGhvZCBjb25maWd1cmF0aW9uCi0gIGlzIHNpbXBseSBhIHNlbGVjdGlvbiBvZiB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy48L3A+Ci08cD48aW1nIHNyYz0iY29uZi5naWYiPjwvcD4KLTxwPllvdSBjcmVhdGUgYW5kIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBkZXBpY3RlZAotICBpbiB0aGUgZmlndXJlIGFib3ZlLiBZb3UgY291bGQgc3RhcnQgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgYnkgY29weWluZyBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgc2hpcCB3aXRoIEVQRiBDb21wb3NlciBhbmQgbW9kaWZ5IGl0IHRvIGZpdAotICB5b3VyIHNwZWNpZmljIG5lZWRzLiBZb3UgY2FuIGFkZCBvciByZW1vdmUgd2hvbGUgbWV0aG9kIHBsdWctaW5zIGFzIHdlbGwgYXMKLSAgbWFrZSBzZWxlY3Rpb24gd2l0aCBlYWNoIHBsdWctaW4gYnkgY2hlY2tpbmcgb3IgdW4tY2hlY2tpbmcgcGFja2FnZXMuIDwvcD4KLTxwPiBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gYXMgeW91ciB3b3JraW5nIHNldCBmb3IgeW91ciBFUEYgQ29tcG9zZXIKLSAgd29yay4gVGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBjb25maWd1cmF0aW9uLCBpLmUuIHRoZSBpbmNsdWRlZCBtZXRob2QgY29udGVudAotICBhbmQgcHJvY2VzcyBlbGVtZW50cyBhcmUgYWx3YXlzIGFjY2Vzc2libGUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4gVXNlIHRoZQotICBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdXNlZCBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08aDM+UHVibGlzaGluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHRoZSBiYXNpcyBmb3IgcHVibGlzaGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotICBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGFuIGh0bWwgV2ViIHNpdGUgdGhhdCBwcmVzZW50cyBhbGwgdGhlIG1ldGhvZAotICBjb250ZW50IGFuZCBwcm9jZXNzZXMgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbmF2aWdhYmxlIGFuZCBzZWFyY2hhYmxlCi0gIHdheS4gSXQgdXNlcyB0aGUgcmVsYXRpb25zaGlwcyBlc3RhYmxpc2hlZCBkdXJpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3MKLSAgYXV0aG9yaW5nIHRvIGdlbmVyYXRlIGh5cGVybGlua3MgYmV0d2VlbiBlbGVtZW50cyBhcyB3ZWxsIGFzIHByb3ZpZGVzIHRyZWUKLSAgYnJvd3NlcnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgdXNlci1kZWZpbmVkIGNhdGVnb3JpemF0aW9ucyBvZgotICB0aGUgY29udGVudC4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBhbiBleGFtcGxlIG9mIHRoZSBwdWJsaXNoZWQgJ0NsYXNzaWMgUlVQJwotICBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08cD48aW1nIHNyYz0icHViLmdpZiI+PC9wPgotPHA+Rm9yIHB1Ymxpc2hpbmcgc2ltcGx5IGNyZWF0ZSBhbmQgc2VsZWN0IGEgY29uZmlndXJhdGlvbi4gVGhlIHB1YmxpY2F0aW9uIHdpemFyZAotICB3aWxsIGRvIHRoZSByZXN0IGZvciB5b3UgYW5kIG9ubHkgcHVibGlzaCBjb250ZW50IHRoYXQgaXMgcGFydCBvZiB0aGUgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb24uIEl0IHdpbGwgYWxzbyBhdXRvbWF0aWNhbGx5IGFkb3B0IGNvbnRlbnQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLSAgc3VjaCBhcyByZW1vdmluZwotICByZWZlcmVuY2VzIG9mIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIHRvIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLSAgb3IgcmVtb3ZpbmcgYWN0aXZpdGllcyBmcm9tIHlvdXIgcHJvY2Vzc2VzIHRoYXQgb25seSBjb250YWluIHdvcmsgZGVmaW5lZCBvdXRzaWRlCi0gIG9mIHRoZSBjb25maWd1cmF0aW9uIHNldC4gSGVuY2UsIHB1Ymxpc2hpbmcgd2lsbCBvbmx5IGluY2x1ZGUgdGhlIGNvbnRlbnQgdGhhdAotICB5b3UgcmVhbGx5IG5lZWQuIFlvdSBjYW4gYWx3YXlzIHByZXZpZXcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiB1c2luZyBFUEYgQ29tcG9zZXIncwotYnJvd3NpbmcgcGVyc3BlY3RpdmUuPC9wPgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd2VsY29tZS91bWFfaHVtcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3VtYV9odW1wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5OGYyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93ZWxjb21lL3VtYV9odW1wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3doaXRlcGFwZXIuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3doaXRlcGFwZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVjZTMzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93aGl0ZXBhcGVyLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXaGl0ZXBhcGVyIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIiAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTxtZXRhIG5hbWU9IkRDLklkZW50aWZpZXIiIGNvbnRlbnQ9IndoaXRlcGFwZXIiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V2hpdGVwYXBlcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id2hpdGVwYXBlciI+PGEgbmFtZT0id2hpdGVwYXBlciI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldoaXRlcGFwZXI8L2gxPgotPGRpdj48cD5BIFdoaXRlcGFwZXIgaXMgYSBzcGVjaWFsIHR5cGUgb2YgY29uY2VwdCBndWlkYW5jZSB0aGF0IGlzIGV4dGVybmFsbHkgcmV2aWV3ZWQKLW9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQKLWVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJndWlkYW5jZS5odG1sI2d1aWRhbmNlIj5HdWlkYW5jZTwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhMmMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPG1ldGEgbmFtZT0iREMuSWRlbnRpZmllciIgY29udGVudD0id29ya3Byb2R1Y3QiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V29yayBQcm9kdWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ3b3JrcHJvZHVjdCI+PGEgbmFtZT0id29ya3Byb2R1Y3QiPjwhLS0gLS0+PC9hPgotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JrIFByb2R1Y3Q8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJwIj5Xb3JrIHByb2R1Y3QgaXMgYSBnZW5lcmFsIHRlcm0gZm9yIHRhc2sgaW5wdXRzIGFuZCBvdXRwdXRzLAotZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsCi1vciBtb2RpZmllZCBieSBhIHRhc2suIFRoZSB0aHJlZSB0eXBlcyBvZiB3b3JrIHByb2R1Y3QgYXJlOjx1bD48bGk+PGEgaHJlZj0iYXJ0aWZhY3QuaHRtbCNhcnRpZmFjdCI+QXJ0aWZhY3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJvdXRjb21lLmh0bWwjb3V0Y29tZSI+T3V0Y29tZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImRlbGl2ZXJhYmxlLmh0bWwjZGVsaXZlcmFibGUiPkRlbGl2ZXJhYmxlPC9hPjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCNjcmVhdGVhd29ya3Byb2R1Y3QiPkNyZWF0ZSBhIFdvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC93b3JrcHJvZHVjdGRlc2NyaXB0b3JzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmNhOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RkZXNjcmlwdG9ycy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iKEMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyAyMDA1LCAyMDA2IiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLlR5cGUiIGNvbnRlbnQ9ImNvbmNlcHQiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0IiAvPgotPG1ldGEgbmFtZT0iREMuUmVsYXRpb24iIHNjaGVtZT0iVVJJIiBjb250ZW50PSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3b3JrcHJvZHVjdGRlc2NyaXB0b3JzIiAvPgotPG1ldGEgbmFtZT0iREMuTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiAvPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL2libWRpdGEuY3NzIiAvPgotPHRpdGxlPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+PGEgbmFtZT0id29ya3Byb2R1Y3RkZXNjcmlwdG9ycyI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yczwvaDE+Ci08ZGl2PjxwPkEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgYSB3b3JrIHByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljCi1hY3Rpdml0eS4gRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mCi13b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgb2YgdGFzayBkZXNjcmlwdG9ycyBhbmQgcm9sZSBkZXNjcmlwdG9ycy4gT25lIHdvcmsKLXByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzLCBlYWNoIHdpdGhpbiB0aGUKLWNvbnRleHQgb2YgYW4gYWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvcD4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Indvcmtwcm9kdWN0Lmh0bWwjd29ya3Byb2R1Y3QiPldvcmsgUHJvZHVjdDwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjcmVhdGVhd29ya3Byb2R1Y3QuaHRtbCI+Q3JlYXRlIGEgV29yayBQcm9kdWN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3dvcmtwcm9kdWN0a2luZC5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RraW5kLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGRiMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvd29ya3Byb2R1Y3RraW5kLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSIoQykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIDIwMDUsIDIwMDYiIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgMjAwNSwgMjAwNiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuVHlwZSIgY29udGVudD0iY29uY2VwdCIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JrIFByb2R1Y3QgS2luZCIgLz4KLTxtZXRhIG5hbWU9IkRDLlJlbGF0aW9uIiBzY2hlbWU9IlVSSSIgY29udGVudD0ibWV0aG9kY29udGVudGNhdGVnb3JpZXMuaHRtbCNtZXRob2Rjb250ZW50Y2F0ZWdvcmllcyIgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08bWV0YSBuYW1lPSJEQy5JZGVudGlmaWVyIiBjb250ZW50PSJ3b3JrcHJvZHVjdGtpbmQiIC8+Ci08bWV0YSBuYW1lPSJEQy5MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiIC8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+V29yayBQcm9kdWN0IEtpbmQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtwcm9kdWN0a2luZCI+PGEgbmFtZT0id29ya3Byb2R1Y3RraW5kIj48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29yayBQcm9kdWN0IEtpbmQ8L2gxPgotPGRpdj48cD5Xb3JrIFByb2R1Y3QgS2luZCBpcyBhbm90aGVyIGNhdGVnb3J5IGZvciBncm91cGluZyA8YSBocmVmPSJ3b3JrcHJvZHVjdC5odG1sI3dvcmtwcm9kdWN0Ij5Xb3JrIFByb2R1Y3RzPC9hPi4gQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSB3b3JrIHByb2R1Y3QKLWtpbmRzLiBBcyBhbiBleGFtcGxlLCB5b3UgbWlnaHQgd2FudCB0byBoYXZlIGEgc2VyaWVzIG9mIHdvcmsgcHJvZHVjdCBraW5kcwotdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBvdmVyYWxsIGludGVudCBvZiB3b3JrIHByb2R1Y3RzLCBzdWNoIGFzIHNwZWNpZmljYXRpb24sCi1wbGFuLCBvciBtb2RlbC48L3A+Ci08L2Rpdj4KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJtZXRob2Rjb250ZW50Y2F0ZWdvcmllcy5odG1sI21ldGhvZGNvbnRlbnRjYXRlZ29yaWVzIj5NZXRob2QgQ29udGVudCBDYXRlZ29yaWVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9tYWluLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9tYWluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzM2EyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvbWFpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPD9OTFMgIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkVQRiBDb21wb3NlciIgPgotPHRvcGljIGxhYmVsPSJPdmVydmlldyI+Ci0JPGFuY2hvciBpZD0ib3ZlcnZpZXdfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkdldHRpbmcgc3RhcnRlZCI+Ci0JPGFuY2hvciBpZD0iZ2V0dGluZ19zdGFydGVkX2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0JPGFuY2hvciBpZD0iY3JlYXRpbmdfbWV0aG9kX2NvbnRlbnRfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkNhdGVnb3JpemluZyByZXVzYWJsZSBtZXRob2QgY29udGVudCI+Ci0JPGFuY2hvciBpZD0iY2F0ZWdvcml6aW5nX21ldGhvZF9jb250ZW50X2lkIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBwcm9jZXNzZXMiPgotCTxhbmNob3IgaWQ9ImNyZWF0aW5nX3Byb2Nlc3Nlc19pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIj4KLQk8YW5jaG9yIGlkPSJwdWJsaXNoaW5nX2V4cG9ydGluZ19pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgdmVyc2lvbiBjb250cm9sIHN5c3RlbSIgPgotCTxhbmNob3IgaWQ9InZlcnNpb25fY29udHJvbF9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSIgPgotCTxhbmNob3IgaWQ9ImFjY2Vzc2liaWxpdHlfaWQiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9Ikdsb3NzYXJ5Ij4KLQk8YW5jaG9yIGlkPSJnbG9zc2FyeV9pZCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iVHV0b3JpYWxzIiA+Ci0JPGFuY2hvciBpZD0idHV0b3JpYWxzX2lkIi8+Ci08L3RvcGljPgotPC90b2M+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL292ZXJ2aWV3LnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9vdmVydmlldy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOTRlODUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL292ZXJ2aWV3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTx0b2MgbGFiZWw9IkVQRiBDb21wb3NlciBvdmVydmlldyIgbGlua190bz0ibWFpbi54bWwjb3ZlcnZpZXdfaWQiPgotICAgPHRvcGljIGxhYmVsPSJFUEYgQ29tcG9zZXIgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvYV9wcm9kdWN0X292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIG92ZXJ2aWV3IiBocmVmPSJodG1sL292ZXJ2aWV3L2FfbWV0aG9kX2NvbnRlbnRfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyBhdXRob3Jpbmcgb3ZlcnZpZXciIGhyZWY9Imh0bWwvb3ZlcnZpZXcvYV9wcm9jZXNzX2F1dGhvcmluZ19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb25maWd1cmF0aW9ucyBvdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy9hX21ldGhvZF9jb25maWd1cmF0aW9uc19vdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IktleSBjb25jZXB0cyI+Ci0gICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBsaWJyYXJ5IiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9saWJyYXJ5Lmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX2NvbnRlbnQuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBwYWNrYWdlIiBocmVmPSJodG1sL3RvcGljcy9jX21ldGhvZF9jb250ZW50X3BhY2thZ2UuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29uZmlndXJhdGlvbnMiIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX2NvbmZpZ3VyYXRpb25zLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIHBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL2NfbWV0aG9kX3BsdWdpbi5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9Ikd1aWRhbmNlIiBocmVmPSJodG1sL3RvcGljcy9jX2d1aWRhbmNlLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iUHJvY2VzcyIgaHJlZj0iaHRtbC90b3BpY3MvY19wcm9jZXNzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iTWV0aG9kIGNvbnRlbnQgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvdG9waWNzL2NfdmFyaWFiaWxpdHkuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJVc2VyIHJvbGVzIGFuZCByb2xlLXNwZWNpZmljIHRhc2tzIiBocmVmPSJodG1sL3RvcGljcy9jX3VzZXJfcm9sZXMuaHRtbCIvPgotPC90b3BpYz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyYTViNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0KLSMgQ2hlYXQgU2hlZXRzCi1tZXRob2RBdXRob3JpbmdDaGVhdFNoZWV0c05hbWU9TWV0aG9kIEF1dGhvcmluZyBDaGVhdCBTaGVldHMKLUNoZWF0c2hlZXRHZXRzdGFydGVkQ2F0ZWdvcnlUZXh0PUdldHRpbmcgU3RhcnRlZAotQ2hlYXRzaGVldFJldXNhYmxlQ29udGVudENhdGVnb3J5VGV4dD1DcmVhdGUgUmV1c2FibGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQ9V3JpdGUgTWV0aG9kIENvbnRlbnQKLUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQ9V29yayB3aXRoIFByb2Nlc3NlcwotQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudD1OYXZpZ2F0ZSBNZXRob2QgQ29udGVudAotQ2hlYXRzaGVldENyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb249Q3JlYXRlIHlvdXIgb3duIE1ldGhvZCBDb25maWd1cmF0aW9uCi1DaGVhdHNoZWV0Q3JlYXRlTWV0aG9kUGx1Z2luPUNyZWF0ZSB5b3VyIG93biBNZXRob2QgUGx1Zy1pbgotQ2hlYXRzaGVldEFkZE1ldGhvZENvbnRlbnQ9QWRkIG5ldyBNZXRob2QgQ29udGVudCBzdWNoIGFzIFJvbGVzLCBUYXNrcywgV29yayBQcm9kdWN0cywgb3IgR3VpZGFuY2UKLUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cz1UYWlsb3IgZXhpc3RpbmcgTWV0aG9kIEVsZW1lbnRzIChSb2xlcywgVGFza3MsIFdvcmsgUHJvZHVjdHMgb3IgR3VpZGFuY2UpIFVzaW5nIENvbnRyaWJ1dGlvbgotQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cz1SZXBsYWNlIGV4aXN0aW5nIE1ldGhvZCBFbGVtZW50cyAoUm9sZXMsIFRhc2tzLCBXb3JrIFByb2R1Y3RzIG9yIEd1aWRhbmNlKQotQ2hlYXRzaGVldEFkZE1ldGhvZFJlZk9ySHlwZXJsaW5rPUFkZCBhIE1ldGhvZCBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIChVUkwpCi1DaGVhdHNoZWV0QXBwbHlDYXBhYmlsaXR5UGF0dGVybj1BcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybgotQ2hlYXRzaGVldENyZWF0ZVByb2Nlc3M9Q3JlYXRlIGEgUHJvY2VzcyAoQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MpCi0KLQotCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQyNmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIAk8dG9jCi0gICAgICAgICAgICBmaWxlPSJtYWluLnhtbCIKLSAgICAgICAgICAgIHByaW1hcnk9InRydWUiPgotICAgICAgCTwvdG9jPgotICAgICAgCTx0b2MKLQkJZmlsZT0iZ2V0dGluZ19zdGFydGVkLnhtbCI+Ci0gICAgICAJPC90b2M+Ci0gICAgICAJPHRvYwotCQlmaWxlPSJvdmVydmlldy54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJjcmVhdGluZ19tZXRob2RfY29udGVudC54bWwiPgotICAgICAgCTwvdG9jPgotCi0gICAgICAJPHRvYwotCQlmaWxlPSJjYXRlZ29yaXppbmdfbWV0aG9kX2NvbnRlbnQueG1sIj4KLSAgICAgIAk8L3RvYz4KLQotICAgICAgCTx0b2MKLQkJZmlsZT0iY3JlYXRpbmdfcHJvY2Vzc2VzLnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLSAgICAgIAk8dG9jCi0JCWZpbGU9InB1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbCI+Ci0gICAgICAJPC90b2M+Ci0KLQk8dG9jCi0JCWZpbGU9InZlcnNpb25fY29udHJvbC54bWwiPgotCTwvdG9jPgotCTx0b2MKLQkJZmlsZT0iYWNjZXNzaWJpbGl0eS54bWwiPgotCTwvdG9jPgotCTx0b2MKLQkJZmlsZT0iZ2xvc3NhcnkueG1sIj4KLQk8L3RvYz4KLQk8dG9jCi0JCWZpbGU9InR1dG9yaWFscy54bWwiPgotCTwvdG9jPgotICAgPC9leHRlbnNpb24+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEYxIGNvbnRleHQgZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPiAKLQkJPGNvbnRleHRzIGZpbGU9IiRubCQvY29udGV4dHNfYXV0aG9yaW5nX3VpLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIi8+IAotCTwvZXh0ZW5zaW9uPgotCi0gCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPiAKLSAgICAgIDxjb250ZXh0cyBmaWxlPSIkbmwkL2NvbnRleHRzX1NlYXJjaC54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2Uuc2VhcmNoIi8+IAotICAgCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIgotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIgCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldEdldHN0YXJ0ZWRDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLm5hdmlnYXRlbWV0aG9kY29udGVudCIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL25hdmlnYXRlbWV0aG9kY29udGVudC54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldE5hdmlnYXRlTWV0aG9kQ29udGVudCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuY3JlYXRlbWV0aG9kY29uZmlndXJhdGlvbiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMuZ2V0c3RhcnRlZCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2NyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24ueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRDcmVhdGVNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5jcmVhdGVtZXRob2RwbHVnaW4iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmdldHN0YXJ0ZWQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVtZXRob2RwbHVnaW4ueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRDcmVhdGVNZXRob2RQbHVnaW4iLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiIAotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cyIgCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5yZXN1YWJsZS5jb250ZW50IgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRSZXVzYWJsZUNvbnRlbnRDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmFkZG5ld21ldGhvZGNvbnRlbnQiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hZGRuZXdtZXRob2Rjb250ZW50LnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0QWRkTWV0aG9kQ29udGVudCIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMudGFpbG9yZXhpc3RpbmdtZXRob2RlbGVtZW50cyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVzdWFibGUuY29udGVudCIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL3RhaWxvcmV4aXN0aW5nbWV0aG9kZWxlbWVudHMueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRUYWlsb3JNZXRob2RFbGVtZW50cyIvPgotICAgICAgPGNoZWF0c2hlZXQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucmVwbGFjZWV4aXN0aW5nbWV0aG9kZWxlbWVudHMiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnJlc3VhYmxlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9yZXBsYWNlZXhpc3RpbmdtZXRob2RlbGVtZW50cy54bWwiCi0gICAgICAgICAgICBuYW1lPSIlQ2hlYXRzaGVldFJlcGxhY2VNZWh0b2RFbGVtZW50cyIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cy5jaGVhdFNoZWV0Q29udGVudCIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMiCi0gICAgICAgICBuYW1lPSIlbWV0aG9kQXV0aG9yaW5nQ2hlYXRTaGVldHNOYW1lIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy53cml0ZS5jb250ZW50IgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRXcml0ZUNvbnRlbnRDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmFkZG1ldGhvZHJlZl9vcl9oeXBlcmxpbmsiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLndyaXRlLmNvbnRlbnQiCi0gICAgICAgICAgICBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hZGRtZXRob2RyZWZfb3JfaHlwZXJsaW5rLnhtbCIKLSAgICAgICAgICAgIG5hbWU9IiVDaGVhdHNoZWV0QWRkTWV0aG9kUmVmT3JIeXBlcmxpbmsiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzIgotICAgICAgICAgbmFtZT0iJW1ldGhvZEF1dGhvcmluZ0NoZWF0U2hlZXRzTmFtZSI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucHJvY2Vzc2VzIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRQcm9jZXNzZXNDYXRlZ29yeVRleHQiLz4KLSAgICAgIDxjaGVhdHNoZWV0Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLmFwcGx5Y2FwYWJpbGl0eXBhdHRlcm4iCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jLmNoZWF0c2hlZXRzLnByb2Nlc3NlcyIKLSAgICAgICAgICAgIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL2FwcGx5Y2FwYWJpbGl0eXBhdHRlcm4ueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRBcHBseUNhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgICA8Y2hlYXRzaGVldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy5jaGVhdHNoZWV0cy5jcmVhdGVhcHJvY2VzcyIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuY2hlYXRzaGVldHMucHJvY2Vzc2VzIgotICAgICAgICAgICAgY29udGVudEZpbGU9IiRubCQvY2hlYXRzaGVldHMvY3JlYXRlYXByb2Nlc3MueG1sIgotICAgICAgICAgICAgbmFtZT0iJUNoZWF0c2hlZXRDcmVhdGVQcm9jZXNzIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hhbmRleHBvcnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTJlYzMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9wdWJsaXNoYW5kZXhwb3J0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iUHVibGlzaGluZyBhbmQgZXhwb3J0aW5nIiBsaW5rX3RvPSJtYWluLnhtbCNwdWJsaXNoYW5kZXhwb3J0X2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iUHVibGlzaGluZyBvdmVydmlldyIgaHJlZj0iaHRtbC9oZWxwL3B1Ymxpc2hpbmdvdmVydmlldy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIG1ldGhvZCB3ZWIiIGhyZWY9Imh0bWwvaGVscC9wdWJsaXNoaW5nYW1ldGhvZGNvbmZpZ3VyYXRpb250b2FtZXRob2R3ZWIuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGluZ19leHBvcnRpbmcueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3B1Ymxpc2hpbmdfZXhwb3J0aW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5ZTkyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcHVibGlzaGluZ19leHBvcnRpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx0b2MgbGFiZWw9IlB1Ymxpc2hpbmcgYW5kIGV4cG9ydGluZyBtZXRob2QgY29udGVudCIgbGlua190bz0ibWFpbi54bWwjcHVibGlzaGluZ19leHBvcnRpbmdfaWQiPiAgCi0JPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGEgY29uZmlndXJhdGlvbiBhcyBhIHdlYiBzaXRlIiBocmVmPSJodG1sL3RvcGljcy90X3B1Ymxpc2hpbmdfaHRtbC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgdG8gTWljcm9zb2Z0IFByb2plY3QiIGhyZWY9Imh0bWwvdG9waWNzL3RfbXNwcm9qZWN0X2V4cG9ydC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdG9waWNzL3RfY29uZmlndXJhdGlvbl9leHBvcnQuaHRtbCIvPgkKLQk8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90b3BpY3MvdF9jb25maWd1cmF0aW9uX2ltcG9ydC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgYSBwbHVnLWluIiBocmVmPSJodG1sL3RvcGljcy90X3BsdWdpbl9leHBvcnQuaHRtbCIvPgkKLQk8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhIHBsdWctaW4iIGhyZWY9Imh0bWwvdG9waWNzL3RfcGx1Z2luX2ltcG9ydC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFeHBvcnRpbmcgWE1MIiBocmVmPSJodG1sL3RvcGljcy90X3htbF9leHBvcnQuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIFhNTCIgaHJlZj0iaHRtbC90b3BpY3MvdF94bWxfaW1wb3J0Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3JlZmVyZW5jZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhNmJiYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iUmVmZXJlbmNlIiBsaW5rX3RvPSJtYWluLnhtbCNyZWZlcmVuY2VfaWQiPgotICAgPHRvcGljIGxhYmVsPSJTdXBvcnQgZm9yIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW1zIiBocmVmPSJodG1sL2hlbHAvY21fb3ZlcnZpZXcuaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIENWUyIgaHJlZj0iaHRtbC9oZWxwL2NtX2N2cy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cG9ydCBmb3IgUmF0aW9uYWwgQ2xlYXJDYXNlIiBocmVmPSJodG1sL2hlbHAvY21fcmF0aW9uYWxjYy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IlN1cHBvcnQgZm9yIFJhdGlvbmFsIENDUkMiIGhyZWY9Imh0bWwvaGVscC9jbV9jY3JjLmh0bWwiLz4KLTwvdG9waWM+Ci0KLSAgIDx0b3BpYyBsYWJlbD0iQWNjZXNzaWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL2FjX21haW4uaHRtbCI+Ci0gICA8dG9waWMgbGFiZWw9IktleWJvYXJkIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvaGVscC9hY19uYXZpZ2F0aW9uLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iRm9udHMgYW5kIGNvbG9ycyIgaHJlZj0iaHRtbC9oZWxwL2FjX2ZvbnRzYW5kY29sb3JzLmh0bWwiLz4KLTwvdG9waWM+Ci0gICAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvRG9jUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkYTkzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9Eb2NQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgRG9jUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERvY1BsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIERvY1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERvY1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotLy8JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IERvY1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLS8vCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotLy8JCQlyZXR1cm4ga2V5OwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLS8vCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLS8vCQl0cnkgewotLy8JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLS8vCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MuRG9jUGx1Z2luUmVzb3VyY2VzIik7Ci0vLwkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLS8vCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotLy8JCX0KLS8vCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbgotCSAqIHBsdWctaW4gcmVsYXRpdmUgcGF0aC4KLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0vLwkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbigib3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jIiwgcGF0aCk7Ci0vLwl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvc3JjL29yZy9lY2xpcHNlL2VwZi9oZWxwL2RvYy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZGI4NmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3NyYy9vcmcvZWNsaXBzZS9lcGYvaGVscC9kb2MvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIERvY3VtZW50YXRpb24gcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3Rhc2tzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90YXNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDYxNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3Rhc2tzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89Im1haW4ueG1sI3Rhc2tzX2lkIj4gIAotCi0gIDwhLS0gQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcmV1c2FibGUgbWV0aG9kIGNvbnRlbnQiPgotICAgPHRvcGljIGxhYmVsPSJNZXRob2QgY29udGVudCBjYXRlZ29yaWVzIiBocmVmPSJodG1sL2hlbHAvY29udGVudF9jYXRlZ29yaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgbWV0aG9kIHZpZXcgd2l0aCBjdXN0b20gY2F0ZWdvcmllcyIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9jdXN0b21fY2F0ZWdvcmllcy5odG1sIi8+IAotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfbWV0aG9kX2NvbnRlbnQuaHRtbCI+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHJvbGUiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfcm9sZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHRhc2siIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfdGFzay5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV93b3JrcHJvZHVjdC5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBndWlkYW5jZSIgaHJlZj0iaHRtbC9oZWxwL2NyZWF0ZV9ndWlkYW5jZS5odG1sIi8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBDb250ZW50IFZhcmlhYmlsaXR5IiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHkuaHRtbCI+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkNvbnRyaWJ1dGVzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfY29udHJpYnV0ZXMuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJFeHRlbmRzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfZXh0ZW5kcy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IlJlcGxhY2VzIiBocmVmPSJodG1sL2hlbHAvdmFyaWFiaWxpdHlfcmVwbGFjZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkFzc29jaWF0aW9ucyBpbXBhY3RlZCBieSB2YXJpYWJpbGl0eSIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Fzc29jaWF0aW9ucy5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkJyb3dzaW5nIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9ucyIgaHJlZj0iaHRtbC9oZWxwL3ZhcmlhYmlsaXR5X2Jyb3dzaW5nLmh0bWwiLz4KLSAgICAgIDwvdG9waWM+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJCcm93c2UgYW5kIHByZXZpZXcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvaGVscC9icm93c2VfY29udGVudC5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGluZGV4IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9pbmRleGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGdsb3NzYXJ5IGVudHJpZXMiIGhyZWY9Imh0bWwvaGVscC9nbG9zc2FyeV9lbnRyaWVzLmh0bWwiLz4KLSAgIDx0b3BpYyBsYWJlbD0iQ2hhbmdpbmcgY29weXJpZ2h0IG5vdGljZXMiIGhyZWY9Imh0bWwvaGVscC9jaGFuZ2luZ19jb3B5cmlnaHQuaHRtbCIvPgotPC90b3BpYz4KLQotICA8IS0tIENhdGVnb3JpemluZyBtZXRob2QgY29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJDYXRlZ29yaXppbmcgbWV0aG9kIGNvbnRlbnQiPgotICA8dG9waWMgbGFiZWw9Ik1ldGhvZCBjb250ZW50IGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jb250ZW50X2NhdGVnb3JpZXMuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIG1ldGhvZCB2aWV3IHdpdGggY3VzdG9tIGNhdGVnb3JpZXMiIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY3VzdG9tX2NhdGVnb3JpZXMuaHRtbCIvPjwvdG9waWM+Ci0KLSAgPCEtLSBDcmVhdGluZyBwcm9jZXNzZXMgLS0+Ci0gIDx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgcHJvY2Vzc2VzIj4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSByZXVzYWJsZSBjYXBhYmlsaXR5IHBhdHRlcm4iIGhyZWY9Imh0bWwvaGVscC9jcmVhdGVfY2FwYWJpbGl0eV9wYXR0ZXJuLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBkZWxpdmVyeSBwcm9jZXNzIiBocmVmPSJodG1sL2hlbHAvY3JlYXRlX2RlbGl2ZXJ5X3Byb2Nlc3MuaHRtbCI+Ci0gIDx0b3BpYyBsYWJlbD0iRGV2ZWxvcCBhIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3Bfd2JzLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJEZXZlbG9wIGEgdGVhbSBhbGxvY2F0aW9uIHN0cnVjdHVyZSIgaHJlZj0iaHRtbC9oZWxwL2RldmVsb3BfdGVhbV9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkRldmVsb3AgYSB3b3JrIHByb2R1Y3QgdXNhZ2Ugc3RydWN0dXJlIiBocmVmPSJodG1sL2hlbHAvZGV2ZWxvcF93b3JrcHJvZHVjdF9zdHJ1Y3R1cmUuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IkFwcGx5IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIiBocmVmPSJodG1sL2hlbHAvYXBwbHlfY2FwYWJpbGl0eXBhdHRlcm4uaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlByb2Nlc3MgZWxlbWVudCBwcm9wZXJ0aWVzIFZpZXciIGhyZWY9Imh0bWwvaGVscC9wcm9wZXJ0aWVzX3ZpZXcuaHRtbCIvPgotICA8dG9waWMgbGFiZWw9IlVzaW5nIGRlZXAgY29weSIgaHJlZj0iaHRtbC9oZWxwL3VzaW5nX2RlZXBfY29weS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iVXNpbmcgYWN0aXZpdHkgdmFyaWFiaWxpdHkiIGhyZWY9Imh0bWwvaGVscC91c2luZ19hY3Rpdml0eV92YXJpYWJpbGl0eS5odG1sIi8+Ci0gIDx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3MgZGlhZ3JhbXMiIGhyZWY9Imh0bWwvaGVscC9wcm9jZXNzX2RpYWdyYW1zLmh0bWwiPgotICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBhY3Rpdml0eSBkaWFncmFtcyIgaHJlZj0iaHRtbC9oZWxwL2FjdGl2aXR5X2RpYWdyYW1zLmh0bWwiLz4KLSAgPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIiBocmVmPSJodG1sL2hlbHAvYWN0aXZpdHlfZGV0YWlsX2RpYWdyYW1zLmh0bWwiLz4KLQotICA8L3RvcGljPgotCi0gIDwhLS0gUHVibGlzaGluZyBNZXRob2QgQ29udGVudCAtLT4KLSAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGFuZCBleHBvcnRpbmcgbWV0aG9kIGNvbnRlbnQiPgotICAgPHRvcGljIGxhYmVsPSJQdWJsaXNoaW5nIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gdG8gYSBtZXRob2Qgd2ViIiBocmVmPSJodG1sL2hlbHAvcHVibGlzaGluZy5odG1sIi8+Ci0gICA8dG9waWMgbGFiZWw9IkV4cG9ydGluZyB0byBNaWNyb3NvZnQgUHJvamVjdCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b19tc3Byb2plY3QuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJYTUwgSW1wb3J0L0V4cG9ydCIgaHJlZj0iaHRtbC9oZWxwL2V4cG9ydF90b194bWwuaHRtbCIvPgotIDwvdG9waWM+Ci0KLSAgPCEtLSBXb3JraW5nIHdpdGggVGV4dHVhbCBEZXNjcmlwdGlvbnMgLS0+Ci0gPHRvcGljIGxhYmVsPSJSaWNoIHRleHQgZWRpdG9yIiBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSByZWZlcmVuY2Ugb3IgaHlwZXJsaW5rIiBocmVmPSJodG1sL2hlbHAvYWRkX2h5cGVybGluay5odG1sIi8+Ci0gIDwvdG9waWM+Ci0gIDwvdG9waWM+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2MueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTk2YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciIgdG9waWM9Imh0bWwvdG9jLmh0bWwiPgotICAgPHRvcGljIGxhYmVsPSJHZXR0aW5nIFN0YXJ0ZWQiPgotICAgICAgPGFuY2hvciBpZD0iZ2V0dGluZ3N0YXJ0ZWQiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IkNvbmNlcHRzIj4KLSAgICAgIDxhbmNob3IgaWQ9ImNvbmNlcHRzIi8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJUYXNrcyI+Ci0gICAgICA8YW5jaG9yIGlkPSJ0YXNrcyIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIj4KLSAgICAgIDxhbmNob3IgaWQ9InJlZmVyZW5jZSIvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iU2FtcGxlcyI+Ci0gICAgICA8YW5jaG9yIGlkPSJzYW1wbGVzIi8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jY29uY2VwdHMueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY2NvbmNlcHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwOWUxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jY29uY2VwdHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx0b2MgbGFiZWw9IkNvbmNlcHRzIiBsaW5rX3RvPSJ0b2MueG1sI2NvbmNlcHRzIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9jb25jZXB0cy9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9jb25jZXB0cy9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9jb25jZXB0cy9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NnZXR0aW5nc3RhcnRlZC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jZ2V0dGluZ3N0YXJ0ZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFiMzE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NnZXR0aW5nc3RhcnRlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iR2V0dGluZyBTdGFydGVkIiBsaW5rX3RvPSJ0b2MueG1sI2dldHRpbmdzdGFydGVkIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9tYWludG9waWMuaHRtbCI+IAotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyIgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9zdWJ0b3BpYy5odG1sIiAvPiAKLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iTWFpbiBUb3BpYyAyIj4KLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMgMiIgaHJlZj0iaHRtbC9nZXR0aW5nc3RhcnRlZC9zdWJ0b3BpYzIuaHRtbCIgLz4KLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3RvY3JlZmVyZW5jZS54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU1YzVhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jcmVmZXJlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJSZWZlcmVuY2UiIGxpbmtfdG89InRvYy54bWwjcmVmZXJlbmNlIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9yZWZlcmVuY2UvbWFpbnRvcGljLmh0bWwiPiAKLQkJPHRvcGljIGxhYmVsPSJTdWIgVG9waWMiIGhyZWY9Imh0bWwvcmVmZXJlbmNlL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL3JlZmVyZW5jZS9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NzYW1wbGVzLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2NzYW1wbGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZWZiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jc2FtcGxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iU2FtcGxlcyIgbGlua190bz0idG9jLnhtbCNzYW1wbGVzIj4gCi0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIiAgaHJlZj0iaHRtbC9zYW1wbGVzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL3NhbXBsZXMvc3VidG9waWMuaHRtbCIgLz4gCi0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiI+Ci0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIDIiIGhyZWY9Imh0bWwvc2FtcGxlcy9zdWJ0b3BpYzIuaHRtbCIgLz4gCi0JPC90b3BpYz4gCi08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2N0YXNrcy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdG9jdGFza3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE0NTQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy90b2N0YXNrcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVGFza3MiIGxpbmtfdG89InRvYy54bWwjdGFza3MiPiAKLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMiICBocmVmPSJodG1sL3Rhc2tzL21haW50b3BpYy5odG1sIj4gCi0JCTx0b3BpYyBsYWJlbD0iU3ViIFRvcGljIiBocmVmPSJodG1sL3Rhc2tzL3N1YnRvcGljLmh0bWwiIC8+IAotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJNYWluIFRvcGljIDIiPgotCQk8dG9waWMgbGFiZWw9IlN1YiBUb3BpYyAyIiBocmVmPSJodG1sL3Rhc2tzL3N1YnRvcGljMi5odG1sIiAvPiAKLQk8L3RvcGljPiAKLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3R1dG9yaWFscy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhODY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdHV0b3JpYWxzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPHRvYyBsYWJlbD0iVHV0b3JpYWxzIiBsaW5rX3RvPSJtYWluLnhtbCN0dXRvcmlhbHNfaWQiPgotICAgPHRvcGljIGxhYmVsPSJFeHBsb3JlIHRoZSB1c2VyIGludGVyZmFjZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9pbnRyby5odG0iPgotCTx0b3BpYyBsYWJlbD0iQ29uY2VwdHMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfY29uY2VwdHMuaHRtIiAvPiAKLSAgIAk8dG9waWMgbGFiZWw9IkJhc2ljIG5hdmlnYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDFfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkJyb3dzZSBtZXRob2QgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDMuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHdoaWxlIGF1dGhvcmluZyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0MV9leDQuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iU2VhcmNoIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQxX2V4NS5odG0iIC8+Ci0gICA8L3RvcGljPgotICAgPHRvcGljIGxhYmVsPSJDcmVhdGUgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfaW50cm8uaHRtIj4KLQk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2NvbmNlcHRzLmh0bSIgLz4gCi0JPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBjb250ZW50IHBhY2thZ2UiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDJfZXgxLmh0bSIgLz4KLQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDIuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDMuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDQuaHRtIiAvPgotCTx0b3BpYyBsYWJlbD0iV29yayB3aXRoIHN0ZXBzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4NS5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBndWlkYW5jZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDYuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iTWFuYWdlIGd1aWRhbmNlIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQyX2V4Ny5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBzdGFuZGFyZCBjYXRlZ29yeSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDguaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkIGEgcGx1Zy1pbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0Ml9leDkuaHRtIiAvPgotICAgPC90b3BpYz4KLSAgIDx0b3BpYyBsYWJlbD0iUmV1c2UgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfaW50cm8uaHRtIj4KLSAgIAk8dG9waWMgbGFiZWw9IkNvbmNlcHRzIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQzX2NvbmNlcHRzLmh0bSIgLz4gCi0gICAJPHRvcGljIGxhYmVsPSJDb250cmlidXRlIHRvIGEgcm9sZSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZSB0byBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ29udHJpYnV0ZSB0byBhIHRhc2siIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4dGVuZCBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg0Lmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkV4dGVuZCBhIHdvcmsgcHJvZHVjdCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDUuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXh0ZW5kIGEgdGFzayIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0M19leDYuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iUmVwbGFjZSBhIHJvbGUiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDNfZXg3Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBwcm9jZXNzZXMiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfaW50cm8uaHRtIj4KLSAgICAgICAJPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iQnJvd3NlIHByb2Nlc3MgY29udGVudCIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NV9leDEuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iRXhwbG9yZSBwcm9jZXNzIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXgyLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlVzZSBjYXBhYmlsaXR5IHBhdHRlcm5zIiBocmVmPSJodG1sL3R1dG9yaWFscy90dXQ1X2V4NC5odG0iIC8+Ci0gICAJPHRvcGljIGxhYmVsPSJDcmVhdGUgYSBwcm9jZXNzIGRpYWdyYW0iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDVfZXg1Lmh0bSIgLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQiIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfaW50cm8uaHRtIj4KLSAgICAgICAJPHRvcGljIGxhYmVsPSJDb25jZXB0cyIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9jb25jZXB0cy5odG0iIC8+IAotICAgCTx0b3BpYyBsYWJlbD0iUHVibGlzaCBhIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXgxLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDIuaHRtIiAvPgotICAgCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24iIGhyZWY9Imh0bWwvdHV0b3JpYWxzL3R1dDRfZXgzLmh0bSIgLz4KLSAgIAk8dG9waWMgbGFiZWw9IlB1Ymxpc2ggYSBjdXN0b20gY29uZmlndXJhdGlvbiIgaHJlZj0iaHRtbC90dXRvcmlhbHMvdHV0NF9leDQuaHRtIiAvPgotICAgPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3ZlcnNpb25fY29udHJvbC54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdmVyc2lvbl9jb250cm9sLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjYzIyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvdmVyc2lvbl9jb250cm9sLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyAgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08dG9jIGxhYmVsPSJVc2luZyB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtcyIgbGlua190bz0ibWFpbi54bWwjdmVyc2lvbl9jb250cm9sX2lkIj4KLSAgIDx0b3BpYyBsYWJlbD0iVXNpbmcgUmF0aW9uYWwgQ2xlYXJDYXNlIiA+Ci0gICAJPHRvcGljIGxhYmVsPSJJbnRlZ3JhdGlvbiB3aXRoIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvY19jbGVhcmNhc2Vfb3ZlcnZpZXcuaHRtbCIvPgotIAk8dG9waWMgbGFiZWw9Ikluc3RhbGxpbmcgYW5kIGNvbmZpZ3VyaW5nIFJhdGlvbmFsIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfaW5zdGFsbC5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJJbnN0YWxsaW5nIGFuZCBjb25maWd1cmluZyBSYXRpb25hbCBDQ1JDIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9jY3JjX2luc3RhbGwuaHRtbCIvPiAgIAotICAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgQ2xlYXJDYXNlIHZpZXciIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2NyZWF0ZV92aWV3Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgdmlldyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfbmV3X3ZpZXcuaHRtbCIvPgotIAk8dG9waWMgbGFiZWw9IlVzaW5nIENsZWFyQ2FzZSBkeW5hbWljIHZpZXdzIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9keW5hbWljX3ZpZXdzLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIG5ldyBsaWJyYXJ5IHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfbmV3X2xpYnJhcnkuaHRtbCIvPgotCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGV4aXN0aW5nIGxpYnJhcnkgdG8gQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9leGlzdGluZ19saWJyYXJ5Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkltcG9ydGluZyBhIGxpYnJhcnkgY29uZmlndXJhdGlvbiB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfaW1wb3J0X2NvbmZpZ3VyYXRpb24uaHRtbCIvPgotICAJPHRvcGljIGxhYmVsPSJBZGRpbmcgYSBwbHVnLWluIHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfYWRkX3BsdWdpbi5odG1sIi8+Ci0gIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gd2l0aCBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX25ld19jb25maWd1cmF0aW9uLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIGNvbnRlbnQgcGFja2FnZSB0byBDbGVhckNhc2UiIGhyZWY9Imh0bWwvdG9waWNzL3RfY2xlYXJjYXNlX2NvbnRlbnRfcGFja2FnZS5odG1sIi8+IAotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgbmV3IG1ldGhvZCBlbGVtZW50IHRvIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfYWRkX2VsZW1lbnQuaHRtbCIvPgotICAJPHRvcGljIGxhYmVsPSJFZGl0aW5nIG1ldGhvZCBlbGVtZW50cyB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfZWRpdF9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkRlbGV0aW5nIG1ldGhvZCBlbGVtZW50cyB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfZGVsZXRlX2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iTW92aW5nIG1ldGhvZCBlbGVtZW50cyB3aXRoIENsZWFyQ2FzZSIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfbW92ZV9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy90X2NsZWFyY2FzZV9jYXBhYmlsaXR5X3BhdHRlcm4uaHRtbCIvPgotIAk8dG9waWMgbGFiZWw9Ik11bHRpLVVzZXIgc2NlbmFyaW9zIHdpdGggQ2xlYXJDYXNlIiBocmVmPSJodG1sL3RvcGljcy9jX2NsZWFyY2FzZV9tdWx0aXVzZXIuaHRtbCIvPgotICAJPHRvcGljIGxhYmVsPSJEaXNhYmxpbmcgUmF0aW9uYWwgQ0NSQyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jbGVhcmNhc2VfY2NyY19kaXNhYmxlLmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlVzaW5nIENWUyIgPgotICAgCTx0b3BpYyBsYWJlbD0iSW5zdGFsbGluZyBhbmQgY29uZmlndXJpbmcgQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19pbnN0YWxsLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IHZpZXcgd2l0aCBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX25ld192aWV3Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkFkZGluZyBhIG5ldyBsaWJyYXJ5IHRvIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfbmV3X2xpYnJhcnkuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGEgcGx1Zy1pbiB0byBDVlMiIGhyZWY9Imh0bWwvdG9waWNzL3RfY3ZzX2FkZF9wbHVnaW4uaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGVsZW1lbnQgdG8gQ1ZTIiBocmVmPSJodG1sL3RvcGljcy90X2N2c19hZGRfZWxlbWVudC5odG1sIi8+Ci0gICAJPHRvcGljIGxhYmVsPSJEZWxldGluZyBhbiBlbGVtZW50IHVuZGVyIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfZGVsZXRlX2VsZW1lbnQuaHRtbCIvPgotICAgCTx0b3BpYyBsYWJlbD0iRWRpdGluZyBhbiBlbGVtZW50IHVuZGVyIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfZWRpdF9lbGVtZW50Lmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9Ik1vdmluZyBhbiBlbGVtZW50IHVuZGVyIENWUyIgaHJlZj0iaHRtbC90b3BpY3MvdF9jdnNfbW92ZV9lbGVtZW50Lmh0bWwiLz4KLSAgIDwvdG9waWM+Ci0gICA8dG9waWMgbGFiZWw9IlZlcnNpb24gY29udHJvbCByZWZlcmVuY2UiID4KLSAgIAk8dG9waWMgbGFiZWw9IlZlcnNpb24gY29udHJvbCBmb3Igc3BlY2lmaWMgZmlsZXMiIGhyZWY9Imh0bWwvdG9waWNzL3JfY2xlYXJjYXNlX2ZpbGVzLmh0bWwiLz4KLSAgIAk8dG9waWMgbGFiZWw9IkNvbW1vbiBhY3Rpb25zIGltcGFjdCBvbiBzcGVjaWZpYyBmaWxlcyIgaHJlZj0iaHRtbC90b3BpY3Mvcl9jbGVhcmNhc2VfYWN0aW9ucy5odG1sIi8+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvd29ya3dpdGh0ZXh0ZGVzYy54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2Mvd29ya3dpdGh0ZXh0ZGVzYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyODc2ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL3dvcmt3aXRodGV4dGRlc2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTw/TkxTICBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJXb3JraW5nIHdpdGggVGV4dHVhbCBEZXNjcmlwdGlvbnMiIGxpbmtfdG89Im1haW4ueG1sI3dvcmt3aXRodGV4dGRlc2NfaWQiPgotICAgPHRvcGljIGxhYmVsPSJSaWNoIFRleHQgRWRpdG9yIiBocmVmPSJodG1sL2hlbHAvcmljaHRleHRlZGl0b3IuaHRtbCIvPgotICAgPHRvcGljIGxhYmVsPSJBZGQgYSBSZWZlcmVuY2Ugb3IgSHlwZXJsaW5rIiBocmVmPSJodG1sL2hlbHAvYWRkX2h5cGVybGluay5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzlkMWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSB4bWwgaW1wb3J0IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNzU5OWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDM2ZWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YmNjMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9ldG9vbDE2L2ltcF94bWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZXRvb2wxNi9pbXBfeG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlZTc0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9pY29ucy9ldG9vbDE2L2ltcF94bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vaW1wX3htbF93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvaWNvbnMvZnVsbC93aXpiYW4vaW1wX3htbF93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ4NDZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL2ljb25zL2Z1bGwvd2l6YmFuL2ltcF94bWxfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTQ3ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgSW1wb3J0IFhNTCBQbHVnLWluCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBJbXBvcnQgWE1MIFdpemFyZAotaW1wb3J0WE1MV2l6YXJkTmFtZT1YTUwKLWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uPUltcG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHN0b3JlZCBpbiBhIFhNTCBmaWxlLgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NDVlNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLmltcG9ydFdpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwud2l6YXJkcy5JbXBvcnRYTUxXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9ldG9vbDE2L2ltcF94bWwuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWltcG9ydFhNTFdpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgJWltcG9ydFhNTFdpemFyZERlc2NyaXB0aW9uCi0gICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPC93aXphcmQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHMuSW1wb3J0WE1MV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDFiY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEltcG9ydFhNTFBsdWdpbiBwbHVnaW47Ci0JcHJpdmF0ZSBVbWFQYWNrYWdlIHVtYVBhY2thZ2U7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBJbXBvcnRYTUxQbHVnaW4oKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCQotCQkvL0FsbG93IFVtYVBhY2thZ2UgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGFueSBpbXBvcnQgYWN0aW9uCi0JCXVtYVBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJCi0JCS8vIHNldCB0aGlzIHRvIGFsbG93IHBhcnNlIGxhcmdlIHhtbCBmaWxlCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgiZW50aXR5RXhwYW5zaW9uTGltaXQiLCAiMTAwMDAwMDAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wb3J0WE1MUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvSW1wb3J0WE1MUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzJjNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL0ltcG9ydFhNTFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFeHBvcnQgWE1MIG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEltcG9ydFhNTFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbXBvcnRYTUxSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTFdpemFyZF90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25Hcm91cF90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wdGlvbkdyb3VwMV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3ZlcndyaXRlUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lcmdlUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydGluZ1hNTF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV2aWV3X2xvZ19maWxlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydFhNTEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRYTUxGaWxlX2Vycm9yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X25vdF9oYW5kbGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX25vX2VjbGFzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfbm9fcGFja2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X29iamVjdF9zdHJpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSW1wb3J0WE1MUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWY0ZTNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jCi0jIE1lc3NhZ2UgSUQgUmFuZ2U6Ci0jCi0KLSMgSW1wb3J0IFhNTCBXaXphcmQKLWltcG9ydFhNTFdpemFyZF90aXRsZT1JbXBvcnQgWE1MCi0KLSMgU2VsZWN0IEltcG9ydCBYTUwgRmlsZSBXaXphcmQgUGFnZQotc2VsZWN0WE1MRmlsZVBhZ2VfdGl0bGU9U3BlY2lmeSBpbXBvcnQgZmlsZQotc2VsZWN0WE1MRmlsZVBhZ2VfZGVzYz1TcGVjaWZ5IHRoZSBYTUwgZmlsZSBjb250YWluaW5nIHRoZSBtZXRob2QgbGlicmFyeSBjb250ZW50IHRvIGltcG9ydCwgYW5kIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IG9wZXJhdGlvbiB0byBwZXJmb3JtLgotZmlsZUxhYmVsX3RleHQ9WE1MIEZpbGU6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLW9wdGlvbkdyb3VwX3RleHQ9TWVyZ2Ugb3B0aW9uCi1vcHRpb25Hcm91cDFfdGV4dD1DaGVjayBiYXNlIHBsdWctaW4gb3B0aW9uCi1vdmVyd3JpdGVSYWRpb0J1dHRvbl90ZXh0PU92ZXJyaWRlIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgd2l0aCB0aGUgaW1wb3J0ZWQgY29udGVudAotbWVyZ2VSYWRpb0J1dHRvbl90ZXh0PU1lcmdlIGltcG9ydGVkIGNvbnRlbnQgaW50byB0aGUgZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotaW1wb3J0aW5nWE1MX3RleHQ9SW1wb3J0aW5nIFhNTCBsaWJyYXJ5IGNvbnRlbnQgaW50byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4uLgotCi0jIEltcG9ydCBYTUwgRXJyb3IgRGlhbG9nCi1yZXZpZXdfbG9nX2ZpbGVzPVRoZSBpbXBvcnQgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZC4gUmV2aWV3IHRoZSBsb2cgZmlsZXMgaW4gdGhlIFxuJyd7MH0nJyBmb2xkZXIgZm9yIGFueSBlcnJvcnMuCi1pbXBvcnRYTUxFcnJvcl9tc2c9SVVQTTAwMDBFOiBUaGUgaW1wb3J0IG9wZXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLWltcG9ydFhNTEVycm9yX3JlYXNvbj1JVVBNMDAwOUU6IFRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGlzIHJlYWQtb25seS5cblxuTWFrZSBzdXJlIHRoYXQgJyd7MH0nJyBpcyB3cml0YWJsZSBvciBjcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkgYW5kIHRyeSBhZ2Fpbi4KLQotIyBFcnJvciBNZXNzYWdlcwotaW52YWxpZFhNTEZpbGVfZXJyb3I9VGhlIHNwZWNpZmllZCBYTUwgZmlsZSBpcyBub3QgdmFsaWQuCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YT1JVVBNMDAxMEU6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgd2FzIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiAoezB9KSBvZiB7MX0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezF9LgotdmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93bj1JVVBNMDAxMUU6IFRoZSBzcGVjaWZpZWQgWE1MIGZpbGUgd2FzIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiBvZiB7MH0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezB9LgotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQTTAwMTJFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIHdhcyBleHBvcnRlZCBieSBhIG5ld2VyIHZlcnNpb24gKHswfSkgb2YgezF9LiBZb3UgbXVzdCB1cGdyYWRlIHsxfSBpbiBvcmRlciB0byBpbXBvcnQgdGhlIGZpbGUuICAKLXZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd249SVVQTTAwMTNFOiBUaGUgc3BlY2lmaWVkIFhNTCBmaWxlIGNhbm5vdCBiZSBvcGVuZWQuIFlvdSBtdXN0IHVwZ3JhZGUgezB9IGluIG9yZGVyIHRvIGltcG9ydCB0aGUgZmlsZS4gIAotCi1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfbm90X2hhbmRsZWQ9RWxlbWVudCBub3QgaGFuZGxlZDogezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX2VsZW1lbnRfd2l0aG91dF9pZD1FbGVtZW50IHdpdGhvdXQgSUQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkPUltcG9ydCBmYWlsZWQ6IHswfQotaW1wb3J0WE1MU2VydmljZV9taXNzaW5nX3BsdWdpbj1NaXNzaW5nIHJlcXVpcmVkIHBsdWctaW4gezB9Ci1pbXBvcnRYTUxTZXJ2aWNlX2Vycm9yX21pc3NpbmdfcGx1Z2lucz1NaXNzaW5nIHJlcXVpcmVkIHBsdWctaW4ocykuIFBsZWFzZSBjaGVjayB0aGUgbG9nIGZpbGVzIGZvciBkZXRhaWxzCi0KLWxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzPUVycm9yIGNyZWF0aW5nIENvbnRlbnRDYXRlZ29yeTogVW5hYmxlIHRvIGdldCBFQ2xhc3MgZm9yIHswfQotbGlicmFyeV9ub19wYWNrYWdlPVVuYWJsZSB0byBmaW5kIG93bmluZyBwYWNrYWdlIGZvciBvYmplY3QgezB9Ci1saWJyYXJ5X2Vycm9yX2NyZWF0ZV9lbGVtZW50PUVycm9yIGNyZWF0aW5nIGVsZW1lbnQ6IHswfQotbGlicmFyeV9vYmplY3Rfc3RyaW5nPW9iamVjdCB7MH0sIGZlYXR1cmUgezF9Ci1saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGVfMj1FcnJvciBzZXR0aW5nIGF0dHJpYnV0ZTogSW52YWxpZCBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZSB7MH0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZT1FcnJvciBzZXR0aW5nIGF0dHJpYnV0ZSBmb3Igb2JqZWN0IHswfSwgZmVhdHVyZSB7MX0sIGFuZCB2YWx1ZSB7Mn0KLWxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8zPURvIG5vdCBrbm93IGhvdyB0byBzZXQgYXR0cmlidXRlIGZvciBvYmplY3QgezB9LCBmZWF0dXJlIHsxfSwgYW5kIHZhbHVlIHsyfQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlPUVycm9yIHNldHRpbmcgcmVmZXJlbmNlIGZvciBmZWF0dXJlIHswfTogbm8gZWxlbWVudCB3aXRoIGlkIHsxfQotbGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzI9RXJyb3Igc2V0dGluZyByZWZlcmVuY2UgZm9yIG9iamVjdCB7MH0sIGZlYXR1cmUgezF9LCBhbmQgdmFsdWUgezJ9Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWE3MjM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgSW1wb3J0IFhNTCBwbHVnLWluJ3MgbGlmZSBjeWNsZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvcHJlZmVyZW5jZXMvSW1wb3J0WE1MUHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9JbXBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFlMTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9JbXBvcnRYTUxQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgRXhwb3J0IFhNTCBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9GSUxFID0gInhtbEZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbWVyZ2Ugb3B0aW9uIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX09QVElPTiA9ICJtZXJnZU9wdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBsYXN0IGltcG9ydCBjaGVjayBwbHVnaW5zIG9wdGlvbiBwcmVmZXJlbmNlIGtleQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0JBU0VfUExVR0lOU19PUFRJT04gPSAiY2hlY2tCYXNlUGx1Z2luc09wdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTF9GSUxFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChNRVJHRV9PUFRJT04sIGZhbHNlKTsgCi0JCXN0b3JlLnNldERlZmF1bHQoQ0hFQ0tfQkFTRV9QTFVHSU5TX09QVElPTiwgdHJ1ZSk7IAkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbXBvcnQgWE1MIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFhNTEZpbGUoKSB7Ci0JCXJldHVybiBJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlYTUxfRklMRSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1wb3J0IFhNTCBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgWE1MIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0WE1MRmlsZShTdHJpbmcgcGF0aCkgewotCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKFhNTF9GSUxFLAotCQkJCXBhdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lcmdlIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgbWVyZ2Ugb3B0aW9uIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRNZXJnZU9wdGlvbigpIHsKLQkJcmV0dXJuIEltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbigKLQkJCQlNRVJHRV9PUFRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1lcmdlIG9wdGlvbiBmaWxlIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG1lcmdlT3B0aW9uCi0JICogICAgICAgICAgICB0aGUgdXNlciBzcGVjaWZpZWQgbWVyZ2Ugb3B0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldE1lcmdlT3B0aW9uKGJvb2xlYW4gbWVyZ2VPcHRpb24pIHsKLQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlNRVJHRV9PUFRJT04sIG1lcmdlT3B0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hlY2tCYXNlUGx1Z2lucyBvcHRpb24gZmlsZSBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNoZWNrQmFzZVBsdWdpbnMgb3B0aW9uIGZpbGUgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDaGVja0Jhc2VQbHVnaW5zT3B0aW9uKCkgewotCQlyZXR1cm4gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCUNIRUNLX0JBU0VfUExVR0lOU19PUFRJT04pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrQmFzZVBsdWdpbnMgb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgIHRoZSB1c2VyIHNwZWNpZmllZCBjaGVja0Jhc2VQbHVnaW5zIG9wdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zT3B0aW9uKGJvb2xlYW4gYikgewotCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCUNIRUNLX0JBU0VfUExVR0lOU19PUFRJT04sIGIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTY0ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIEltcG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0UmVzb3VyY2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MWRkNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuQmFzZVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLnV0aWwuVXJsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIHJlc291cmNlIGhhbmRsZXIgZm9yIGNvbnRlbnQgaW4gdGhlIGltcG9ydGVkIGxpYnJhcnkKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBCYXNlUmVzb3VyY2VIYW5kbGVyIHsKLQotCQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gc291cmNlTGliUm9vdAotCSAqIEBwYXJhbSB0YXJnZXRMaWJSb290Ci0JICovCi0JcHVibGljIEltcG9ydFJlc291cmNlSGFuZGxlcihGaWxlIHNvdXJjZUxpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCkgewotCQlzdXBlcihzb3VyY2VMaWJSb290LCB0YXJnZXRMaWJSb290KTsKLQl9Ci0JCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgdXJsLiBwdXQgdGhlIHJlc291cmNlcyBpbnRvIHRoZSBsb2NhdGlvbiBiYXNlZCBvbiB0aGUgbGlicmFyeSByZXNvdXJjZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KLQkgKi8KLQlwdWJsaWMgVXJsSW5mbyByZXNvbHZlRmlsZVVybChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVybEluZm8gaW5mbyA9IG5ldyBVcmxJbmZvKCk7Ci0KLQkJaW5mby5zb3VyY2VVcmwgPSBzcmNVcmw7Ci0JCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCkuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsgCi0JCWluZm8udGFyZ2V0RmlsZSA9IG51bGw7Ci0KLQkJaWYgKGluZm8uc291cmNlRmlsZSA9PSBudWxsIHx8ICFpbmZvLnNvdXJjZUZpbGUuZXhpc3RzKCkgKSB7Ci0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCQkKLQkJaWYgKCBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkvLyBmaXggdGhlIHRhcmdldCB1cmwgYW5kIAotCQkJaW5mby50YXJnZXRVcmwgPSBmaXhVcmwoc3JjVXJsKTsKLQkJCQotCQkJLy9TdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKG93bmVyKTsKLQkJCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKCAoTWV0aG9kRWxlbWVudClvd25lcik7Ci0JCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncigoTWV0aG9kRWxlbWVudClvd25lcik7Ci0JCQlTdHJpbmcgc3JjUGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgoKE1ldGhvZEVsZW1lbnQpb3duZXIpOwotCQkJRmlsZSBzcmNSb290ID0gKG5ldyBGaWxlKHNyY1BsdWdpblBhdGgpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpbmZvLnRhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShzcmNSb290LCBlbGVtZW50UGF0aCksIGluZm8udGFyZ2V0VXJsKTsJCi0JCX0gZWxzZSB7Ci0JCQlpbmZvLnRhcmdldFVybCA9IHNyY1VybDsgCi0JCQlpbmZvLnNvdXJjZUZpbGUgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCBzcmNVcmwpOwotCQl9Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4VXJsKFN0cmluZyB1cmwpIHsKLQkJdXJsID0gdXJsLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOyAgCi0JCWludCBpbmR4ID0gdXJsLmxhc3RJbmRleE9mKFJlc291cmNlSGVscGVyLlJFU09VUkNFX0ZPTERFUiArICIvIik7ICAvLyROT04tTkxTLTEkCi0JCWlmICggaW5keCA+PTAgKSB7Ci0JCQlyZXR1cm4gdXJsLnN1YnN0cmluZyhpbmR4KTsKLQkJfQotCQkKLQkJLy8gcHV0IHRoZSByZXNvdXJjZSBpbnRvIHRoZSByZXNvdXJjZXMgZm9sZGVyCi0JCXJldHVybiBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5SRVNPVVJDRV9GT0xERVIsIHVybCkKLQkJCS50b1N0cmluZygpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOyAKLQl9Ci0JCi0JLyoqCi0JICogY29weWluZyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZUZpbGUgdGhlIGZpbGUgcGF0aCByZWxhdGl2ZSB0byB0aGUgc291cmNlIHJvb3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHNvdXJjZUZpbGUsIEVPYmplY3Qgb2JqLCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiB1bWFQbHVnaW4pIHsKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IodW1hUGx1Z2luKTsKLQkJU3RyaW5nIHRndFBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKHVtYVBsdWdpbik7Ci0JCUZpbGUgdGd0UGx1Z2luUm9vdCA9IG5ldyBGaWxlKHRndFBsdWdpblBhdGgpOwotCQlGaWxlIHNyY1BsdWdpblJvb3QgPSBuZXcgRmlsZShzb3VyY2VMaWJSb290LCB1bWFQbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCi0JCUZpbGUgc3JjID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdCwgc291cmNlRmlsZSk7Ci0JCWlmICggc3JjLmV4aXN0cygpICkgewotCQkJRmlsZSB0Z3QgPSBuZXcgRmlsZSh0Z3RQbHVnaW5Sb290LCBzb3VyY2VGaWxlKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNyYywgdGd0KTsKLQkJfQotCX0KLQkKLS8vCS8qKgotLy8JICogdGhlIHJlc291cmNlIHBhdGggd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbGliYXJ5IHJvb3QuIHVybHMgbmVlZHMgdG8gYmUgZml4ZWQKLS8vCSAqIAotLy8JICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0vLwkgKiBAcGFyYW0gc3JjVXJsIHRoZSB1cmwgcmVmZXJlbmNlZCBpbiB0aGUgc291cmNlIGNvbnRlbnQKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHJpdmF0ZSBVcmxJbmZvIGxvYWRVcmxJbmZvV2l0aEZpeGVkUGF0aChPYmplY3Qgb3duZXIsIFN0cmluZyBzcmNVcmwpIHsKLS8vCQlVcmxJbmZvIGluZm8gPSBuZXcgVXJsSW5mbygpOwotLy8JCWluZm8uc291cmNlVXJsID0gc3JjVXJsOwotLy8JCWluZm8udGFyZ2V0VXJsID0gc3JjVXJsOwotLy8JCWluZm8uc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUxpYlJvb3QsIHNyY1VybCk7Ci0vLwkJaW5mby50YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGliUm9vdCwgc3JjVXJsKTsKLS8vCi0vLwkJaWYgKCBvd25lciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICB7Ci0vLwkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKCAoTWV0aG9kRWxlbWVudClvd25lcik7Ci0vLwkJCWluZm8udGFyZ2V0VXJsID0gYmFja1BhdGggKyBzcmNVcmw7Ci0vLwkJfQotLy8JCXJldHVybiBpbmZvOwkKLS8vCX0KLS8vCQotLy8JLyoqCi0vLwkgKiB0aGUgcmVzb3VyY2UgcGF0aCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50LiAKLS8vCSAqIHVybHMgd2lsbCBub3QgYmUgY2hhbmdlZCBidXQgcmVzb3VyY2UgZmlsZXMgaXMgcmVsaWNhdGVkLgotLy8JICogQHBhcmFtIG93bmVyIG93bmVyIHRoZSBvd25lciBvYmplY3QgaW4gdGhlIHRhcmdldCBsaWJyYXJ5Ci0vLwkgKiBAcGFyYW0gc3JjVXJsCi0vLwkgKiBAcmV0dXJuCi0vLwkgKi8KLS8vCXByaXZhdGUgVXJsSW5mbyBsb2FkVXJsSW5mb1dpdGhSZWxhdGl2ZVBhdGgoT2JqZWN0IG93bmVyLCBTdHJpbmcgc3JjVXJsKSB7Ci0vLwkJVXJsSW5mbyBpbmZvID0gbmV3IFVybEluZm8oKTsKLS8vCQlpbmZvLnNvdXJjZVVybCA9IHNyY1VybDsKLS8vCQlpbmZvLnRhcmdldFVybCA9IGluZm8uc291cmNlVXJsOyAvLyBubyB1cmwgY2hhbmdlCi0vLwkJaW5mby5zb3VyY2VGaWxlID0gbmV3IEZpbGUoc291cmNlTGliUm9vdCwgc3JjVXJsKTsKLS8vCQkKLS8vCQlpZiAoIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgIHsKLS8vCQkJLy9TdHJpbmcgZWxlbWVudFBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKG93bmVyKTsKLS8vCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFJlc291cmNlUGF0aCgoTWV0aG9kRWxlbWVudClvd25lcik7Ci0vLwkJCWluZm8udGFyZ2V0RmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHRhcmdldExpYlJvb3QsIGVsZW1lbnRQYXRoKSwgc3JjVXJsKTsJCQkKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9JbXBvcnRYTUxTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTljMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuRGlhZ3JhbUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuRXhwb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkZlYXR1cmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLlhNTExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkZpbGVNb2RpZnlDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuTGlicmFyeUltcG9ydE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLlBsdWdpbk1vZGlmeUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NYXBwaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFhtbCBpbXBvcnQgc2VydmljZSBjbGFzcyB0byBwcm9jZXNzIHRoZSBpbXBvcnRpbmcgdGFzawotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0WE1MU2VydmljZSB7Ci0KLQlwcml2YXRlIExpc3QgdW5sb2NrZWRQbHVnaW5zOyAKLQkKLQlwcml2YXRlIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLQkKLQlwcml2YXRlIE1hcCByZW5hbWVFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQkKLQlwcml2YXRlIFN0cmluZyB4bWxQYXRoOwotCi0JcHJpdmF0ZSBYTUxMaWJyYXJ5IHhtbExpYjsKLQotCXByaXZhdGUgVW1hTGlicmFyeSB1bWFMaWI7Ci0KLQlwcml2YXRlIEltcG9ydFhNTG9nZ2VyIGxvZ2dlciA9IG5ldyBJbXBvcnRYTUxvZ2dlcigpOwotCi0JcHJpdmF0ZSBMaXN0IGRpc2NhcmRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBEaWFncmFtSGFuZGxlciBkaWFncmFtSGFuZGxlcjsKLQkKLQkvL3RkcyB3aXRoIHN0ZXBzCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4gdGRNYXA7Ci0JCi0JLy8gbWFwIHhtbCBXb3JrT3JkZXIgdG8gdW1hIFdvcmtPcmRlcgotCU1hcCB3b3JrT3JkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgSU1pZ3JhdG9yIG1pZ3JhdG9yOwotCQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zID0gdHJ1ZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBJbXBvcnRYTUxTZXJ2aWNlKCkgewotCi0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHhtbCBmaWxlLgotCSAqIEBwYXJhbSB4bWxQYXRoCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2NlZWRzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGxvYWRYbWwoZmluYWwgU3RyaW5nIHhtbFBhdGgpIHsKLQkJU3RyaW5nIHZlcnNpb25FcnJvciA9IHZlcnNpb25DaGVjayh4bWxQYXRoLAlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlKTsJCQotCQlpZiAodmVyc2lvbkVycm9yICE9IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkJCQotCQl0aGlzLnhtbFBhdGggPSB4bWxQYXRoOwotCi0JCWxvZ2dlci5sb2dNZXNzYWdlKCJMb2FkaW5nIHhtbCBsaWJyYXJ5IC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy54bWxMaWIgPSBuZXcgWE1MTGlicmFyeShudWxsLCBsb2dnZXIsIHhtbFBhdGgpOwotCQkJdGhpcy54bWxMaWIubG9hZCgpOwotCQkJcmV0ID0gY2hlY2tPbGRQbHVnaW5zKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoTkxTLmJpbmQoCi0JCQkJCUV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sLCB4bWxQYXRoKSwgZSk7Ci0JCQlmaW5hbCBTdHJpbmcgZXJyU3RyID0gZS50b1N0cmluZygpOwotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CQotCQkJCQlJbXBvcnRYTUxQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCU5MUy5iaW5kKEV4cG9ydFhNTFJlc291cmNlcy54bWxMaWJyYXJ5X2Vycm9yX2xvYWRfeG1sLCB4bWxQYXRoKSwgZXJyU3RyKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrT2xkUGx1Z2lucygpIHsKLQkJCi0JCXVubG9ja2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBmaWxlTmFtZVRvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlNYXAgZ3VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgYmFzZVBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gcGx1Z2luID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luKSBiYXNlUGx1Z2lucy5nZXQoaSk7Ci0JCQltYXAucHV0KHBsdWdpbi5nZXROYW1lKCksIHBsdWdpbik7Ci0JCQlndWlkTWFwLnB1dChwbHVnaW4uZ2V0R3VpZCgpLCBwbHVnaW4pOwotCQl9Ci0JCQotCQlMaXN0IHBsdWdpbnMgPSAoKE1ldGhvZExpYnJhcnkpIHhtbExpYi5nZXRSb290KCkpLmdldE1ldGhvZFBsdWdpbigpOwotCQlMaXN0IGd1aWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIHBsdWdpbnMuZ2V0KGkpOwotCQkJZ3VpZHMuYWRkKGVsZW0uZ2V0SWQoKSk7Ci0JCQkKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAKLQkJCQkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4pIG1hcC5nZXQoZWxlbS5nZXROYW1lKCkpOwotCQkJYm9vbGVhbiB0b0FkZCA9IGZhbHNlOwotCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAmJiAhIGJhc2VQbHVnaW4uZ2V0R3VpZCgpLmVxdWFscyhlbGVtLmdldElkKCkpCi0JCQkJCSYmICEgYmFzZVBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQkJdG9BZGQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQliYXNlUGx1Z2luID0gCi0JCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbikgZ3VpZE1hcC5nZXQoZWxlbS5nZXRJZCgpKTsKLQkJCQlpZiAoYmFzZVBsdWdpbiAhPSBudWxsIC8qJiYgISBiYXNlUGx1Z2luLmdldE5hbWUoKS5lcXVhbHMoZWxlbS5nZXROYW1lKCkpKi8KLQkJCQkJCSYmICEgYmFzZVBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQkJCXRvQWRkID0gdHJ1ZTsKLQkJCQl9IAotCQkJfQotCQkJaWYgKHRvQWRkKSB7Ci0JCQkJdW5sb2NrZWRQbHVnaW5zLmFkZChiYXNlUGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJYmFzZVBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJUmVzb3VyY2UgcmVzID0gYmFzZVBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlmaWxlTmFtZVRvQ2hlY2suYWRkKGZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbGVOYW1lVG9DaGVjay5zaXplKCkgPiAwKSB7Ci0JCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBmaWxlTmFtZVRvQ2hlY2s7CQotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShtb2RpZmllZEZpbGVzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJaWYgKCEgdW5sb2NrZWRQbHVnaW5zLmlzRW1wdHkoKSAmJiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkmJiAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkvLyBsb2cgZXJyb3IKLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGU7IAotCQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfaW1wb3J0X2ZhaWxlZDsgCi0JCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywgZmlsZUNoZWNrZWRPdXRTdGF0dXMpOwotCQkJCQl9Ci0JCQl9KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJZmluYWwgUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZQotCQkJCQkJCQkJCS5jaGVja01vZGlmeShndWlkcywgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCBmYWxzZSk7CQkKLQotCQkvLyBhbGxvdyB1c2VyIHRvIHByb2NlZWQgd2l0aCBsb2NrZWQgcGx1Z2lucwotCQlpZiAoIG1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5zaXplKCkgPiAwICkgewotCQkJZmluYWwgYm9vbGVhbiByZXRbXSA9IG5ldyBib29sZWFuWzFdOwotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIFdJWkFSRF9USVRMRSA9IEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGU7IAotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IG1vZGlmeUluZm8uZ2V0TG9ja2VkTWVzc2FnZSgpLnRvU3RyaW5nKCkgKwotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9jb25maXJtX2NvbnRpbnVlOyAKLQkJCQkJcmV0WzBdID0gSW1wb3J0WE1MUGx1Z2luCi0JCQkJCQkJLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5Q29uZmlybWF0aW9uKFdJWkFSRF9USVRMRSwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfSk7CQkKLQkJCXJldHVybiByZXRbMF07Ci0JCX0gCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2cgZmlsZS4KLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRMb2dQYXRoKCkgewotCQlyZXR1cm4gbG9nZ2VyLmdldExvZ1BhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlkaXNjYXJkZWRFbGVtZW50cy5jbGVhcigpOwotCQl3b3JrT3JkZXJNYXAuY2xlYXIoKTsKLQkJbG9nZ2VyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2VzIFhNTCBleHBvcnQuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGRvSW1wb3J0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5pc0VuYWJsZWQoKTsKLQkJdHJ5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gZGlzYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIGR1cmluZyBpbXBvcnQKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0KLQkJCQotCQkJaGFuZGxlVHlwZUNoYW5nZXMoKTsKLQkJCQotCQkJSVJlc291cmNlSGFuZGxlciBoYW5kbGVyID0gbmV3IEltcG9ydFJlc291cmNlSGFuZGxlcihuZXcgRmlsZSgKLQkJCQkJeG1sUGF0aCkuZ2V0UGFyZW50RmlsZSgpLCBuZXcgRmlsZShMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKTsKLQotCQkJQ29udGVudFByb2Nlc3NvciBjb250ZW50UHJvYyA9IG5ldyBDb250ZW50UHJvY2Vzc29yKGhhbmRsZXIsCi0JCQkJCXRoaXMubG9nZ2VyKTsKLQkJCQotCQkJZGlhZ3JhbUhhbmRsZXIgPSBuZXcgRGlhZ3JhbUhhbmRsZXIobmV3IEZpbGUoCi0JCQkJCXhtbFBhdGgpLmdldFBhcmVudEZpbGUoKSwgbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UKLQkJCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkpKSB7CQkJCQotCQkJCS8vWzBdOiBzb3VyY2VGaWxlCi0JCQkJLy9bMV06IHRhcmdldEZpbGUKLQkJCQlwcm90ZWN0ZWQgRmlsZVtdIGdldEZpbGVzKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCQkJCUZpbGVbXSBmaWxlcyA9IHN1cGVyLmdldEZpbGVzKGVsZW0sIGZhbHNlKTsKLQkJCQkJCQkJCQkKLQkJCQkJRURhdGFPYmplY3QgeG1sT2JqID0geG1sTGliLmdldEVsZW1lbnQoZWxlbS5nZXRHdWlkKCkpOwotCQkJCQlpZiAoeG1sT2JqIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykgewotCQkJCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jID0gCi0JCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKSB4bWxPYmo7Ci0JCQkJCQlTdHJpbmcgdXJpID0gcHJvYy5nZXREaWFncmFtVVJJKCk7Ci0JCQkJCQlpZiAodXJpICE9IG51bGwgJiYgdXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGdldFNvdXJjZUxpYlJvb3QoKSwgdXJpKTsKLQkJCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiTEQ6IGZpbGU6ICIgKyBmaWxlKTsKLQkJCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCQlmaWxlc1swXSA9IGZpbGU7Ci0JCQkJCQkJCWZpbGVzWzFdID0gbmV3IEZpbGUoZ2V0VGFyZ2V0TGliUm9vdCgpLCB1cmkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJMRDogZmlsZXNbMF06ICIgKyBmaWxlc1swXSk7Ci0JCQkJCQkJfQotCQkJCQkJfQkJCQkJCi0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiBmaWxlczsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCi0JCQl0aGlzLnhtbExpYi5maXhMaWJyYXJ5Rm9ySW1wb3J0KCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBhbGwgdGhlIGRlcGVuZGVudCBwbHVnaW5zIGFyZSB0aGVyZQotCQkJTGlzdCByZWZlcmVuY2VkUGx1Z2lucyA9IHhtbExpYi5nZXRSZWZlcmVuY2VkUGx1Z2lucygpOwotCQkJaWYgKHJlZmVyZW5jZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlCi0JCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQkJTGlzdCBwbHVnaW5zID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVN0cmluZyBpZCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4pIGl0Ci0JCQkJCQkJCS5uZXh0KCkpLmdldEd1aWQoKTsKLQkJCQkJCXJlZmVyZW5jZWRQbHVnaW5zLnJlbW92ZShpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpc0NoZWNrQmFzZVBsdWdpbnMoKSAmJiByZWZlcmVuY2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQkJIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0geG1sTGliLmdldEd1aWRUb1BsdWdOYW1lTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIG5hbWVBbmRJZCA9ICIiOwkJLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSBtYXAuZ2V0KGlkKTsKLQkJCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCQluYW1lQW5kSWQgKz0gbmFtZSArICIsICI7Ly8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW5hbWVBbmRJZCArPSBpZDsKLQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX21pc3NpbmdfcGx1Z2luLCBuYW1lQW5kSWQpLAotCQkJCQkJCW51bGwpOwkJCQotCQkJCX0KLQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9lcnJvcl9taXNzaW5nX3BsdWdpbnMpOwotCQkJfQotCi0JCQl0aGlzLnVtYUxpYiA9IG5ldyBVbWFMaWJyYXJ5KHJlbmFtZUVsZW1lbnRNYXAsIGNvbnRlbnRQcm9jLCBsb2dnZXIsIG92ZXJ3cml0ZSk7Ci0KLQkJCUVEYXRhT2JqZWN0IHhtbFJvb3QgPSB0aGlzLnhtbExpYi5nZXRSb290KCk7Ci0JCQlFRGF0YU9iamVjdCB1bWFSb290ID0gdGhpcy51bWFMaWIuZ2V0Um9vdCgpOwotCQkJCi0JCQlsb2dnZXIubG9nTWVzc2FnZSgiY3JlYXRlIHRhcmdldCBsaWJyYXJ5IGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdEVEYXRhT2JqZWN0VHJlZSh4bWxSb290LCB1bWFSb290KTsKLQotCQkJbG9nZ2VyCi0JCQkJCS5sb2dNZXNzYWdlKCJjb3B5aW5nIGFsbCBmZWF0dXJlIHZhbHVlcyBmb3IgdGFyZ2V0IGxpYnJhcnkgZWxlbWVudHMgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSB4bWxSb290KTsKLQotCQkJbG9nZ2VyLmxvZ01lc3NhZ2UoImZpeCB0aGUgdGFyZ2V0IGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXVtYUxpYi5maXhMaWJyYXJ5KCk7Ci0JCQl1bWFMaWIuZml4VGFza0Rlc2NyaXB0b3JzKHRkTWFwKTsKLQotCQkJTGlicmFyeUltcG9ydE1hbmFnZXIuaGFuZGxlTmFtZVJlcGxhY2UocmVuYW1lRWxlbWVudE1hcCk7Ci0JCQkKLQkJCWRpYWdyYW1IYW5kbGVyLnBvc3RSZWdpc3RlckVsZW1lbnRzKCk7Ci0JCQkKLQkJCS8vIGRlbGV0ZSB0aGUgdW4tbmVlZGVkIGVsZW1lbnRzCi0JCQlsb2dnZXIubG9nTWVzc2FnZSgiZGVsZXRlIHVubmVlZGVkIGVsZW1lbnRzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQl1bWFMaWIuZGVsZXRlRWxlbWVudHMoKTsKLQkJCQotCQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gRmlsZU1vZGlmeUNoZWNrZXIuZ2V0TW9kaWZpZWRGaWxlcyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLgotCQkJCQkJCQkJCWdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQltb2RpZmllZEZpbGVzLmFkZEFsbChkaWFncmFtSGFuZGxlci5nZXRNb2RpZmllZEZpbGVzKCkpOwotCQkJZmluYWwgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLnN5bmNFeGVjQ2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQkKLQkJCWlmIChmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQotCQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJzYXZpbmcgdGFyZ2V0IGxpYnJhcnkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCQlMaXN0IGNvbmZpZ3MgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQkJaW50IGNvbmZpZ1N6ID0gY29uZmlncyA9PSBudWxsID8gMCA6IGNvbmZpZ3Muc2l6ZSgpOwotCQkJCWZvciAoaW50IGk9MDsgaTxjb25maWdTejsgaSsrKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAKLQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gKSBjb25maWdzLmdldChpKTsKLQkJCQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIGNvbmZpZyk7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChjb25maWdTeiAhPSAwKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSBjdXJyTGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgY3VyckxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJaWYgKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0JCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBpcCA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgcGVyc2lzdGVyOwotCQkJCQkJRmlsZSBjb25maWdGb2xkZXIgPSBpcC5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihjdXJyTGliKTsKLQkJCQkJCWlmIChjb25maWdGb2xkZXIgIT0gbnVsbCkgewotCQkJCQkJCWlwLnNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGN1cnJMaWIsIGNvbmZpZ0ZvbGRlcik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBkb24ndCByZWZyZXNoIHRoZSB3b3Jrc3BhY2UKLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zICE9IG51bGwgJiYgISB1bmxvY2tlZFBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmxvY2tVbmxvY2tlZFBsdWdpbnModW5sb2NrZWRQbHVnaW5zKTsKLQkJCQl9Ci0JCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGZhbHNlLCBmYWxzZSk7Ci0JCQkJZGlhZ3JhbUhhbmRsZXIuZXhlY3V0ZSgpOwkJCQkKLQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgicmUtb3BlbiB0YXJnZXQgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQlpZiAobWlncmF0b3IgIT0gbnVsbCkgewotCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQltaWdyYXRvci5taWdyYXRlWG1sSW1wb3J0ZWRMaWIobGliLCBtb25pdG9yKTsJCQkJCQotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJCQkKLQkJCQlsb2dnZXIubG9nTWVzc2FnZSgiaW1wb3J0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlTdHJpbmcgdGl0bGUgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlOyAKLQkJCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9pbXBvcnRfZmFpbGVkOyAKLQkJCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQkJCX0KLQkJCQl9KTsKLQkJCX0JCi0JCQkJCQkKLQkJCS8vUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJLy8JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBtb25pdG9yKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxTZXJ2aWNlX2ltcG9ydF9mYWlsZWQsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0KLQkJCXRocm93IGU7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJLy8gcmUtZW5hYmxlIHJlc291cmNlIHJlZnJlc2hpbmcKLQkJCQkvLwotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0RURhdGFPYmplY3RUcmVlKEVEYXRhT2JqZWN0IHhtbE9iaiwgRURhdGFPYmplY3QgdW1hT2JqKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHhtbE9iai5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFRGF0YU9iamVjdCBjaGlsZCA9IChFRGF0YU9iamVjdCkgaXQubmV4dCgpOwotCQkJY3JlYXRlUm1jT2JqZWN0KGNoaWxkLCB1bWFPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJtY09iamVjdChFRGF0YU9iamVjdCB4bWxFbGVtZW50LAotCQkJRURhdGFPYmplY3QgdGFyZ2V0Q29udGFpbmVyKSB7Ci0JCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudFByb3BlcnR5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZ2V0IHRoZSB0YXJnZXRDb250YWluZXIncyBjb250YWluaW5nIGZlYXR1cmUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSB4bWxFbGVtZW50LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJY3JlYXRlUm1jT2JqZWN0KHhtbEVsZW1lbnQsIHRhcmdldENvbnRhaW5lciwgZmVhdHVyZS5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSbWNPYmplY3QoRURhdGFPYmplY3QgeG1sRWxlbWVudCwKLQkJCUVEYXRhT2JqZWN0IHRhcmdldENvbnRhaW5lciwgU3RyaW5nIGNvbnRhaW5tZW50WG1sRmVhdHVyZSkgewotCi0JCXRyeSB7Ci0JCQlpZiAoeG1sRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlFRGF0YU9iamVjdCB1bWFFbGVtZW50ID0gbnVsbDsKLQotCQkJLy8gZG9uJ3QgY3JlYXRlIGNvbnRlbnQgY2F0ZWdvcnkgcGFja2FnZSBzaW5jZSBpbiB1bWEsIGl0J3MKLQkJCS8vIHNlcGVyYXRlZCBiYXNlZCBvbiB0eXBlCi0JCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSB4bWxFbGVtZW50OwotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlTWV0aG9kUGx1Z2luKHBsdWdpbi5nZXRJZCgpLCBwbHVnaW4KLQkJCQkJCS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCQkJCS8vIGRvbid0IGNyZWF0ZSwgZG8gbm90aGluZwotCQkJCS8vIG1hcmsgYXMgZGlzY2FyZGVkIHNvIHdlIGRvbid0IG5lZWQgdG8gY29weSBpdCdzIGF0dHJpYnV0ZXMKLQkJCQlzZXREaXNjYXJkZWQoKChDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB4bWxFbGVtZW50KS5nZXRJZCgpKTsKLQotCQkJfSBlbHNlIGlmICgoeG1sRWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkKLQkJCQkJJiYgISh4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERvbWFpbiAKLQkJCQkJCQl8fCB4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpCi0JCQkJCXx8ICh4bWxFbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UpKSB7Ci0JCQkJLy8gY3JlYXRlIHRoZSBjb250ZW50IGNhdGVnb3JpZXMgZm9yIHJvb3QgY29udGVudCBjYXRlZ29yaWVzLAotCQkJCS8vIG5vdCBmb3Igc3ViLWRvbWFpbiBhbmQgc3ViLWRpc2NpcGxpbmUKLQkJCQkvLyAxNTQxNDMgLSBpbXBvcnQgeG1sIGRpZCBub3QgcmVzZXJ2ZSB0aGUgc3ViLWRpc2NpcGxpbmUgc3RydWN0dXJlCi0JCQkJU3RyaW5nIHBsdWdpbklkID0gZ2V0UGx1Z2luKHhtbEVsZW1lbnQpLmdldElkKCk7Ci0JCQkJdW1hRWxlbWVudCA9IHVtYUxpYi5jcmVhdGVDb250ZW50Q2F0ZWdvcnkocGx1Z2luSWQsIHhtbEVsZW1lbnQKLQkJCQkJCS5lQ2xhc3MoKS5nZXROYW1lKCksIHhtbEVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSwKLQkJCQkJCXhtbExpYi5nZXRFbGVtZW50SWQoeG1sRWxlbWVudCkpOwotCQkJfSBlbHNlIHsKLQotCQkJCS8vIGlmIHRoaXMgaXMgcm9vdCBsZXZlbCBwYWNrYWdlLCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nCi0JCQkJLy8gY29udGFpbmVyIGZvciB0aGUgVU1BIG9iamVjdAotCQkJCWlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkJJiYgeG1sRWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCS5nZXRDb250ZW50Um9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJT2JqZWN0IHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHhtbEVsZW1lbnQpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJfSBlbHNlIGlmIChwcm9jIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCQkJdGFyZ2V0Q29udGFpbmVyID0gdW1hTGliCi0JCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmICh4bWxFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCUxpc3QgcHJvY3MgPSB4bWxMaWIKLQkJCQkJCQkJLmdldEFsbFByb2Nlc3NlcygoTWV0aG9kUGFja2FnZSkgeG1sRWxlbWVudCk7Ci0JCQkJCQlpZiAocHJvY3MgIT0gbnVsbCAmJiBwcm9jcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJT2JqZWN0IHByb2MgPSBwcm9jcy5nZXQoMCk7Ci0JCQkJCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCQkuZ2V0Q2FwYWJpbGl0eVBhdHRlcm5Sb290UGFja2FnZSh0YXJnZXRDb250YWluZXIpOwotCQkJCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCQkJCQl0YXJnZXRDb250YWluZXIgPSB1bWFMaWIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzUm9vdFBhY2thZ2UodGFyZ2V0Q29udGFpbmVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHRhcmdldENvbnRhaW5lciBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgJiYKLQkJCQkJY29udGFpbm1lbnRYbWxGZWF0dXJlLmVxdWFscygic3RlcCIpKSB7CS8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBnZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgc28gd2UgY2FuIGNyZWF0ZSB0aGUgb2JqZWN0IG9mCi0JCQkJLy8gdGhlIHNhbWUgdHlwZQotCQkJCXVtYUVsZW1lbnQgPSB1bWFMaWIuY3JlYXRlRWxlbWVudCh0YXJnZXRDb250YWluZXIsCi0JCQkJCQljb250YWlubWVudFhtbEZlYXR1cmUsIHhtbEVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpLAotCQkJCQkJeG1sRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpLCB4bWxMaWIKLQkJCQkJCQkJLmdldEVsZW1lbnRJZCh4bWxFbGVtZW50KSk7Ci0JCQkJCi0JCQkJaWYgKHhtbEVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgeG1sRWxlbWVudDsKLQkJCQkJaWYgKHRkLmdldFRhc2soKSAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IHN0ZXBzID0gdGQuZ2V0U3RlcCgpOwotCQkJCQkJaWYgKHN0ZXBzICE9IG51bGwgJiYgIXN0ZXBzLmlzRW1wdHkoKSkgewotCQkJCQkJCWlmICh0ZE1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJCXRkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4oKTsKLQkJCQkJCQl9Ci0JCQkJCQkJdGRNYXAucHV0KHRkLmdldElkKCksIHRkKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHhtbCBXb3JrT3JkZXIgZG9lcyBub3QgaGF2ZSBhbiBpZCwgbmVlZCB0byBtYXAgdGhlIHVtYSBPYmplY3QKLQkJCQlpZiAoeG1sRWxlbWVudCBpbnN0YW5jZW9mIFdvcmtPcmRlcikgewotCQkJCQl3b3JrT3JkZXJNYXAucHV0KHhtbEVsZW1lbnQsIHVtYUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVjdXJzaXZlLAotCQkJLy8gbm90ZSwgdW1hIGVsZW1lbnQgbWlnaHQgYmUgbnVsbCBzaW5jZSB3ZSBjYW4ndCBkZXRlcm1pbmUgdGhlCi0JCQkvLyBvd25lciBvZiB0aGUgZWxlbWVudCB5ZXQKLQkJCWNyZWF0RURhdGFPYmplY3RUcmVlKHhtbEVsZW1lbnQsIHVtYUVsZW1lbnQpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZT8/PwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGdldFBsdWdpbihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJd2hpbGUgKChlbGVtZW50ICE9IG51bGwpICYmICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCWVsZW1lbnQgPSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJfQotCi0JCXJldHVybiAoTWV0aG9kUGx1Z2luKSBlbGVtZW50OwotCX0KLQotCXByaXZhdGUgRURhdGFPYmplY3QgZ2V0Um1jT2JqZWN0KE1ldGhvZEVsZW1lbnQgeG1sT2JqKSB7Ci0JCWlmICh4bWxPYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gdW1hTGliLmdldFJvb3QoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBpZCA9IHhtbE9iai5nZXRJZCgpOwotCQkJcmV0dXJuIHRoaXMudW1hTGliLmdldEVsZW1lbnQoaWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdEVEYXRhT2JqZWN0KE1ldGhvZEVsZW1lbnQgc3JjT2JqKSB7Ci0JCWl0ZXJhdEVEYXRhT2JqZWN0XyhzcmNPYmopOwotCQlFRGF0YU9iamVjdCB0YXJnZXRPYmogPSBnZXRSbWNPYmplY3Qoc3JjT2JqKTsKLQkJaWYgKHRhcmdldE9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgewotCQkJZGlhZ3JhbUhhbmRsZXIucmVnaXN0ZXJFbGVtZW50KChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iaik7IAotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpdGVyYXRFRGF0YU9iamVjdF8oTWV0aG9kRWxlbWVudCBzcmNPYmopIHsKLQotCQlsb2dnZXIKLQkJCQkubG9nTWVzc2FnZSgiID09PSBwcm9jZXNzaW5nIGVsZW1lbnQgIiArIHNyY09iai5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjogIiArIHNyY09iai5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpZiAoaXNQcm9jZXNzZWQoc3JjT2JqLmdldElkKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UHJvY2Vzc2VkKHNyY09iai5nZXRJZCgpKTsKLQotCQkvLyBpZiBvYmplY3QgaXMgbm90IGNyZWF0ZWQsIGl0J3MgeG1sIHdyYXBwZXIgcGFja2FnZQotCQlpZiAoc3JjT2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5UGFja2FnZSkgewotCi0JCQkvLyBpdGVyYXRlIHRoZSBjaGlsZCBwYWNrYWdlcwotCQkJZm9yIChJdGVyYXRvciBpdCA9ICgoQ29udGVudENhdGVnb3J5UGFja2FnZSkgc3JjT2JqKQotCQkJCQkuZ2V0Q29udGVudENhdGVnb3J5KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRURhdGFPYmplY3QgdGFyZ2V0T2JqID0gZ2V0Um1jT2JqZWN0KHNyY09iaik7Ci0JCUVDbGFzcyBlQ2xhc3MgPSBzcmNPYmouZUNsYXNzKCk7Ci0KLQkJRUxpc3QgZmVhdHVyZXMgPSBlQ2xhc3MuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlib29sZWFuIGlzTmV3RWxlbWVudCA9IHVtYUxpYi5pc05ld0VsZW1lbnQoc3JjT2JqLmdldElkKCkpIHx8IHNyY09iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnk7Ci0JCWJvb2xlYW4gaXNPbGRQbHVnaW4gPSAhaXNOZXdFbGVtZW50ICYmIChzcmNPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXQubmV4dCgpOwotCQkJCQkJCi0JCQlpZiAoRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuaXNVbm5lZWRlZFhtbEZlYXR1cmUoZmVhdHVyZS5nZXROYW1lKCkpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoaXNPbGRQbHVnaW4gJiYgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkgPT0gZmVhdHVyZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlPYmplY3QgdmFsdWUgPSBzcmNPYmouZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJYm9vbGVhbiBpc01lcCA9IGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibWV0aG9kRWxlbWVudFByb3BlcnR5Iik7IC8vJE5PTi1OTFMtMSQJCi0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCAmJiAhIGlzTWVwKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXR2ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXR2Ci0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBzcmNfdmFsdWUgPSBpdHYubmV4dCgpOwotCi0JCQkJCQlpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0KLQkJCQkJCQkvLyBpdCdzIGFuIGlkIHJlZmVyZW5jZQotCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCS5nZXROYW1lKCksIChTdHJpbmcpIHNyY192YWx1ZSk7Ci0JCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkvLyBzZXQgdGhlIHJlZmVyZW5jZQotCQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWU7Ci0JCQkJCQkJU3RyaW5nIGd1aWQgPSBlLmdldElkKCk7Ci0KLQkJCQkJCQkvLyBkb24ndCBzZXQgdGhlIGNvbnRhaW5tZW50IGZlYXR1cmUgdmFsdWUgc2luY2UKLQkJCQkJCQkvLyBpdCdzIGFscmVhZHkgaGFuZGxlZAotCQkJCQkJCS8vIHdoZW4gY3JlYXRpbmcgdGhlIGxpYnJhcnkgc3RydWN0dXJlCi0JCQkJCQkJaWYgKCFpc0Rpc2NhcmRlZChndWlkKSAmJiBlLmVDb250YWluZXIoKSAhPSBzcmNPYmopIHsKLQkJCQkJCQkJdW1hTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZQotCQkJCQkJCQkJCS5nZXROYW1lKCksIGd1aWQpOwotCQkJCQkJCX0KLQotCQkJCQkJCWl0ZXJhdEVEYXRhT2JqZWN0KChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpOwotCQkJCQkJfSBlbHNlIGlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJCQkvLyBXb3JrT3JkZXIgaXMgbm90IG1ldGhvZCBlbGVtZW50IGFuZCBkb2VzIG5vdCBoYXZlCi0JCQkJCQkJLy8gYW4gaWQsIG5lZWQgc3BlY2lhbCBoYW5kbGluZwotCQkJCQkJCS8vIHNldCB0aGUgcHJlZGUKLQkJCQkJCQlXb3JrT3JkZXIgd3IgPSAoV29ya09yZGVyKSBzcmNfdmFsdWU7Ci0JCQkJCQkJT2JqZWN0IHVtYVdyID0gd29ya09yZGVyTWFwLmdldCh3cik7Ci0JCQkJCQkJdW1hTGliLnNldFdvcmtPcmRlcih1bWFXciwgd3IuZ2V0VmFsdWUoKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWxvZ2dlcgotCQkJCQkJCQkJLmxvZ01lc3NhZ2UoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZCwgc3JjX3ZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmICEgaXNNZXApIHsKLQotCQkJCQkvLyBnZXQgdGhlIHhtbCBvYmplY3QgYW5kIGl0ZXJhdGUgYWdhaW4KLQkJCQkJT2JqZWN0IHNyY192YWx1ZSA9IHZhbHVlOwotCi0JCQkJCWlmIChzcmNfdmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXIpIHsKLQkJCQkJCWxvZ2dlci5sb2dNZXNzYWdlKCJ3b3Jrb3JkZXIgdmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgaWYgKHNyY192YWx1ZSBpbnN0YW5jZW9mIFN0cmluZwotCQkJCQkJCSYmICFpc0Rpc2NhcmRlZCgoU3RyaW5nKSBzcmNfdmFsdWUpKSB7Ci0JCQkJCQkvLyBpdCdzIGFuIGlkIHJlZmVyZW5jZQotCQkJCQkJdW1hTGliLnNldFJlZmVyZW5jZVZhbHVlKHRhcmdldE9iaiwgZmVhdHVyZS5nZXROYW1lKCksCi0JCQkJCQkJCShTdHJpbmcpIHNyY192YWx1ZSk7Ci0JCQkJCX0gZWxzZSBpZiAoc3JjX3ZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJLy8gc2V0IHRoZSByZWZlcmVuY2UKLQkJCQkJCVN0cmluZyBndWlkID0gKChNZXRob2RFbGVtZW50KSBzcmNfdmFsdWUpLmdldElkKCk7Ci0JCQkJCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQkJCQkJbG9nZ2VyCi0JCQkJCQkJCQkubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MU2VydmljZV9lbGVtZW50X3dpdGhvdXRfaWQsICgoTWV0aG9kRWxlbWVudCkgc3JjX3ZhbHVlKQotCQkJCQkJCQkJLmdldE5hbWUoKSkpOwotCQkJCQkJfQotCQkJCQkJaWYgKCFpc0Rpc2NhcmRlZChndWlkKSkgewotCQkJCQkJCXVtYUxpYi5zZXRSZWZlcmVuY2VWYWx1ZSh0YXJnZXRPYmosIGZlYXR1cmUKLQkJCQkJCQkJCS5nZXROYW1lKCksIGd1aWQpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0RURhdGFPYmplY3QoKE1ldGhvZEVsZW1lbnQpIHNyY192YWx1ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlsb2dnZXIKLQkJCQkJCQkJLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmltcG9ydFhNTFNlcnZpY2VfZWxlbWVudF9ub3RfaGFuZGxlZCwgc3JjX3ZhbHVlKSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh0YXJnZXRPYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKSB7Ci0JCQkJCQlsb2dnZXIubG9nTWVzc2FnZSgiaHJyZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQotCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrT3JkZXJUeXBlKSB7Ci0JCQkJCQl2YWx1ZSA9ICgoV29ya09yZGVyVHlwZSkgdmFsdWUpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYm9vbGVhbiByZW5hbWUgPSBmYWxzZTsKLQkJCQkJaWYgKCFpc05ld0VsZW1lbnQgJiYgZmVhdHVyZSA9PSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCQlTdHJpbmcgb2xkTmFtZSA9IChTdHJpbmcpdGFyZ2V0T2JqLmVHZXQob3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQkJCVN0cmluZyBuZXdOYW1lID0gKFN0cmluZylzcmNPYmouZUdldChmZWF0dXJlKTsJCQkJCi0JCQkJCQlpZiAoIW5ld05hbWUuZXF1YWxzKG9sZE5hbWUpKSB7Ci0JCQkJCQkJTGlicmFyeUltcG9ydE1hbmFnZXIuZW5zdXJlVW5pcXVlTmFtZUZvckV4aXN0aW5nRWxlbWVudAotCQkJCQkJCQkoKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkgdGFyZ2V0T2JqLCBvbGROYW1lLCBuZXdOYW1lLCByZW5hbWVFbGVtZW50TWFwKTsKLQkJCQkJCQlyZW5hbWUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghcmVuYW1lKSB7Ci0JCQkJCQl1bWFMaWIuc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWUodGFyZ2V0T2JqLAotCQkJCQkJCQlmZWF0dXJlLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJCQl9Ci0JCQkJCWlmIChpc05ld0VsZW1lbnQgJiYgZmVhdHVyZSA9PSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgZWxlbSA9IChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpIHRhcmdldE9iajsKLQkJCQkJCUVPYmplY3QgY2VvYmogPSBlbGVtLmVDb250YWluZXIoKTsJCQkJCQkKLQkJCQkJCWlmIChjZW9iaiBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCAmJiAKLQkJCQkJCQkJISB1bWFMaWIuaXNOZXdFbGVtZW50KCgob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KSBjZW9iaikuZ2V0R3VpZCgpKSkgewotCQkJCQkJCUxpYnJhcnlJbXBvcnRNYW5hZ2VyLmVuc3VyZVVuaXF1ZU5hbWUoY2VvYmosIGVsZW0sIHJlbmFtZUVsZW1lbnRNYXApOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyB0aGUgZXJyb3IgYW5kIGNvbnRpbnVlPz8/Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0KLQl9Ci0KLQkvLyBnb2lkIG9mIHByb2Nlc3NlZCBlbGVtZW50Ci0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzUHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBwcm9jZXNzZWRFbGVtZW50cy5jb250YWlucyhndWlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvY2Vzc2VkKFN0cmluZyBndWlkKSB7Ci0JCWlmICghcHJvY2Vzc2VkRWxlbWVudHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCXByb2Nlc3NlZEVsZW1lbnRzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2NhcmRlZChTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGRpc2NhcmRlZEVsZW1lbnRzLmNvbnRhaW5zKGlkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGlzY2FyZGVkKFN0cmluZyBpZCkgewotCQlkaXNjYXJkZWRFbGVtZW50cy5hZGQoaWQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIG92ZXJ3cml0ZSBhdHRyaWJ1dGUuCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBiKSB7Ci0JCW92ZXJ3cml0ZSA9IGI7Ci0JfQkKLQkKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uQ2hlY2soZmluYWwgU3RyaW5nIHhtbFBhdGgsIGZpbmFsIFN0cmluZyB0aXRsZSkgewotCQlmaW5hbCBTdHJpbmdbXSByZXQgPSBuZXcgU3RyaW5nWzFdOwotCQlyZXRbMF0gPSBudWxsOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CQotCQkJcHVibGljIHZvaWQgcnVuKCkgewkJCQkKLQkJCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbC5jaGVja1hNTFZlcnNpb24obmV3IEZpbGUoeG1sUGF0aCkpOwotCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJcmV0WzBdID0gTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaF9vbGREYXRhX3Vua25vd24sIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGluZm8ucmVzdWx0IDwgMCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQltaWdyYXRvciA9IE1hcHBpbmdVdGlsLmdldE1pZ3JhdG9yQnlMaWJQYXRoKHhtbFBhdGgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlyZXRbMF0gPSBlLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobWlncmF0b3IgPT0gbnVsbCAmJiByZXRbMF0gPT0gbnVsbCkgewotCQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGEsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsJCQkJCQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChpbmZvLnJlc3VsdCA+IDApIHsKLQkJCQkJCWlmIChpbmZvLnRvb2xJRC5lcXVhbHMoVmVyc2lvblV0aWwuZ2V0UHJpbWFyeVRvb2xJRCgpKSkgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbCwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiwgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCVBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCl9KTsKLQkJCQkJCX0KLQkJCQkJfSAKLQkJCQl9Ci0JCQkJaWYgKHJldFswXSAhPSBudWxsKSB7Ci0JCQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLCByZXRbMF0pOwkJCQkJCi0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkgcHVibGljIHZvaWQgaGFuZGxlVHlwZUNoYW5nZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSBiYXNlTGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCUhhc2hNYXAgYmFzZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmNvbGxlY3RQb3RlbnRpYWxUeXBlQ2hhbmdlZChiYXNlTGliLCBiYXNlTWFwKTsKLQkJCi0JCUhhc2hNYXAgZUNsYXNzT2JqTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSGFzaE1hcCBpbXBvcnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0geG1sTGliLmdldFJvb3QoKS5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBHdWlkYW5jZSB8fAotCQkJCW9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCB4bWxFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlTdHJpbmcgZUNsYXNzTmFtZSA9IHhtbEVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCU9iamVjdCBlQ2xhc3NPYmogPSBlQ2xhc3NPYmpNYXAuZ2V0KGVDbGFzc05hbWUpOwotCQkJCWlmIChlQ2xhc3NPYmogPT0gbnVsbCkgewotCQkJCQlFQ2xhc3Mgb2JqRUNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRUNsYXNzKGVDbGFzc05hbWUpOwotCQkJCQlpZiAob2JqRUNsYXNzICE9IG51bGwpIHsKLQkJCQkJCWVDbGFzc09iaiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShvYmpFQ2xhc3MpOwotCQkJCQkJZUNsYXNzT2JqTWFwLnB1dChlQ2xhc3NOYW1lLCBlQ2xhc3NPYmopOwkKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZUNsYXNzT2JqICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0TWFwLnB1dCh4bWxFbGVtZW50LmdldElkKCksIGVDbGFzc09iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5oYW5kbGVUeXBlQ2hhbmdlcyhiYXNlTWFwLCBpbXBvcnRNYXApOwkKLQl9Ci0JIAotCXByaXZhdGUgYm9vbGVhbiBpc0NoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zKSB7Ci0JCXRoaXMuY2hlY2tCYXNlUGx1Z2lucyA9IGNoZWNrQmFzZVBsdWdpbnM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL0ltcG9ydFhNTG9nZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyZDBmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvSW1wb3J0WE1Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRhdGFleGNoYW5nZS51dGlsLkZpbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci0KLS8qKgotICogTG9nZ2VyIGNsYXNzIGZvciB4bWwgaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxvZ2dlciBleHRlbmRzIEZpbGVMb2dnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HU19GT0xERVIgPSAibG9ncy9pbXBvcnQveG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEltcG9ydFhNTG9nZ2VyKCkgewotCQlzdXBlcihuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSwgTE9HU19GT0xERVIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9VbWFMaWJyYXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvc2VydmljZXMvVW1hTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTEwY2ZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9VbWFMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5FRGF0YU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UuaW1wb3J0aW5nLkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5Db250ZW50UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UudXRpbC5JTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkZlYXR1cmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogVW1hTGlicmFyeSByZXByZXNlbnRzIGEgbWV0aG9kIGxpYnJhcnkgYW5kIHByb3ZpZGUgbWV0aG9kcyB0byBjcmVhdGUgZWxlbWVudHMKLSAqIGFuZCBzZXQgYXR0cmlidXRlcyBhbmQgZmVhdHVyZSB2YWx1ZXMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVtYUxpYnJhcnkgewotCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlOwkKLQkKLQlwcml2YXRlIElMb2dnZXIgbG9nZ2VyOwotCi0JcHJpdmF0ZSBDb250ZW50UHJvY2Vzc29yIGNvbnRlbnRQcm9jID0gbnVsbDsKLQkKLQlwcml2YXRlIE1hcCBuZXdFbGVtZW50c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcDsKLQotCS8vIG1hcCBvZiBjcmVhdGVkIGVsZW1lbnRzLCBndWlkIC0gRURhdGFPYmplY3QKLQlNYXAgZWxlbWVudHNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8ga2VlcCB0aGUgc291cmNlIGVsZW1lbnQgaWRzIHNvIHdlIGNhbiBkZXRlcm1pbmUgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBpbiB0aGUgeG1sIHNvdXJjZSBsaWJyYXJ5Ci0JLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGRlbGV0aW5nIHVuLW5lZWRlZCBlbGVtZW50cwotCS8vIDE1NDE0OSAtIGFsbG93IHBhY2thZ2UgbGV2ZWwgbWVyZ2luZyBmb3IgeG1sIGltcG9ydAotCUhhc2hTZXQgc291cmNlRWxlbWVudElEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqIEBwYXJhbSBjb250ZW50UHJvYwotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiBAcGFyYW0gb3ZlcndyaXRlCi0JICovCi0JcHVibGljIFVtYUxpYnJhcnkoTWFwIHJlbmFtZUVsZW1lbnRNYXAsIENvbnRlbnRQcm9jZXNzb3IgY29udGVudFByb2MsIElMb2dnZXIgbG9nZ2VyLCBib29sZWFuIG92ZXJ3cml0ZSkgewotCQl0aGlzLnJlbmFtZUVsZW1lbnRNYXAgPSByZW5hbWVFbGVtZW50TWFwOwotCQl0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLQkJdGhpcy5jb250ZW50UHJvYyA9IGNvbnRlbnRQcm9jOwotCQl0aGlzLm92ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsKLQotCQlidWlsZEVsZW1lbnRzTWFwKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgY3VycmVudCBsaWJyYXJ5IGFzIHRoZSByb290IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRSb290KCkgewotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEVsZW1lbnRzTWFwKCkgewotCQkvLyBidWlsZCB0aGUgZWxlbWVudHMgbWFwIGZvciBlYXN5IG9wZXJhdGlvbgotCi0JCWVsZW1lbnRzTWFwLmNsZWFyKCk7Ci0JCWVsZW1lbnRzTWFwLnB1dChnZXRSb290KCkuZ2V0R3VpZCgpLCBnZXRSb290KCkpOwotCQlUcmVlSXRlcmF0b3IgaXQgPSBnZXRSb290KCkuZUFsbENvbnRlbnRzKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZWxlbWVudHNNYXAucHV0KCgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb250ZW50IGNhdGVyZ29yeS4KLQkgKiBAcGFyYW0gcGx1Z2luSWQKLQkgKiBAcGFyYW0geG1sRUNsYXNzTmFtZQotCSAqIEBwYXJhbSB4bWxFbGVtZW50VHlwZQotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRURhdGFPYmplY3QgY3JlYXRlQ29udGVudENhdGVnb3J5KFN0cmluZyBwbHVnaW5JZCwKLQkJCVN0cmluZyB4bWxFQ2xhc3NOYW1lLCBTdHJpbmcgeG1sRWxlbWVudFR5cGUsIFN0cmluZyBpZCkgewotCi0JCXNldFNvdXJjZUlkKGlkKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgc2FtZSBvYmplY3QgY3JlYXRlZCBvbmx5IG9uY2UKLQkJRURhdGFPYmplY3Qgb2JqID0gZ2V0RWxlbWVudChpZCk7Ci0JCWlmIChvYmogIT0gbnVsbCkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBnZXRFbGVtZW50KHBsdWdpbklkKTsKLQotCQlFQ2xhc3Mgb2JqQ2xhc3MgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNFQ2xhc3MoeG1sRUNsYXNzTmFtZSk7Ci0JCWlmIChvYmpDbGFzcyA9PSBudWxsKSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9ub19lY2xhc3MsIHhtbEVDbGFzc05hbWUpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJb2JqID0gKEVEYXRhT2JqZWN0KSBFY29yZVV0aWwuY3JlYXRlKG9iakNsYXNzKTsKLQkJc2V0RWxlbWVudChpZCwgb2JqKTsKLQotCQlDb250ZW50UGFja2FnZSByb290UGtnID0gKENvbnRlbnRQYWNrYWdlKSBnZXRSb290UGFja2FnZShwbHVnaW4sIG9iaik7Ci0JCXJvb3RQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKChDb250ZW50Q2F0ZWdvcnkpb2JqKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb290IHBhY2thZ2UKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBnZXRSb290UGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luLCBPYmplY3Qgb2JqKSB7Ci0KLQkJU3RyaW5nW10gcGF0aCA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aDsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGg7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldCB8fCBvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2wpIHsKLQkJCXBhdGggPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSkgewotCQkJcGF0aCA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aDsKLQkJfQotCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9ub19wYWNrYWdlLCBvYmopKTsgCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbWV0aG9kIHBsdWdpbi4KLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVNZXRob2RQbHVnaW4oU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBzYW1lIG9iamVjdCBjcmVhdGVkIG9ubHkgb25jZQotCQlFRGF0YU9iamVjdCBvYmogPSBnZXRFbGVtZW50KGlkKTsKLQkJYm9vbGVhbiBpc09sZCA9IG9iaiAhPSBudWxsOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCW9wdGlvbnMucHV0KCJyZW5hbWVFbGVtZW50TWFwIiwgcmVuYW1lRWxlbWVudE1hcCk7Ci0JCQlvYmogPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW4obmFtZSwgaWQsIG9wdGlvbnMpOwotCi0JCQlzZXRFbGVtZW50KGlkLCBvYmopOwotCQl9Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBzeXN0ZW0gcGFja2FnZXMgYXJlIGluY2x1ZGVkCi0JCXNldFNvdXJjZUlkKGlkKTsKLQkJTGlzdCBwa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcygoTWV0aG9kUGx1Z2luKW9iaik7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IChNZXRob2RQYWNrYWdlKWl0Lm5leHQoKTsKLQkJCXNldFNvdXJjZUlkKHBrZy5nZXRHdWlkKCkpOwotCQkJaWYgKCFpc09sZCkgewotCQkJCW5ld0VsZW1lbnRzTWFwLnB1dChwa2cuZ2V0R3VpZCgpLCBwa2cpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gb2JqOwotCX0KLQotCS8qKgotCSAqIEdldHMgY29udGVudCdzIHJvb3QgcGFja2FnZS4KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRDb250ZW50Um9vdFBhY2thZ2UoRURhdGFPYmplY3QgcGx1Z2luKSB7Ci0JCWlmICghKHBsdWdpbiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKChNZXRob2RQbHVnaW4pIHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBjYXBhYmlsaXR5IHBhdHRlcm4nIHJvb3QgcGFja2FnZS4KLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRDYXBhYmlsaXR5UGF0dGVyblJvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotCQlpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgoTWV0aG9kUGx1Z2luKSBwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgZGVsaXZlcnkgcHJvY2Vzcycgcm9vdCBwYWNrYWdlLgotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldERlbGl2ZXJ5UHJvY2Vzc1Jvb3RQYWNrYWdlKEVEYXRhT2JqZWN0IHBsdWdpbikgewotCQlpZiAoIShwbHVnaW4gaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgoTWV0aG9kUGx1Z2luKSBwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQl9Ci0KLS8vCXB1YmxpYyBFRGF0YU9iamVjdCBnZXRQcm9jZXNzQ29udHJpYnV0aW9uUm9vdFBhY2thZ2UoRURhdGFPYmplY3QgcGx1Z2luKSB7Ci0vLwkJaWYgKCEocGx1Z2luIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJcmV0dXJuIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgcGx1Z2luLAotLy8JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVsZW1lbnQuCi0JICogQHBhcmFtIGNvbnRhaW5lcgotCSAqIEBwYXJhbSB4bWxGZWF0dXJlTmFtZQotCSAqIEBwYXJhbSB4bWxFQ2xhc3NOYW1lCi0JICogQHBhcmFtIHhtbEVsZW1lbnRUeXBlCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBFRGF0YU9iamVjdCBjcmVhdGVFbGVtZW50KEVEYXRhT2JqZWN0IGNvbnRhaW5lciwKLQkJCVN0cmluZyB4bWxGZWF0dXJlTmFtZSwgU3RyaW5nIHhtbEVDbGFzc05hbWUsIFN0cmluZyB4bWxFbGVtZW50VHlwZSwKLQkJCVN0cmluZyBpZCkgewotCi0JCXNldFNvdXJjZUlkKGlkKTsKLQotCQkvLyBtYWtlIHN1cmUgdGhlIHNhbWUgb2JqZWN0IGNyZWF0ZWQgb25seSBvbmNlCi0JCUVEYXRhT2JqZWN0IG9iaiA9IGdldEVsZW1lbnQoaWQpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUVPYmplY3QgZW9iaiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlQcm9jZXNzUGFja2FnZSBwID0gKFByb2Nlc3NQYWNrYWdlKSBlb2JqOwotCQkJCQlzZXRTb3VyY2VJZChwLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG9iajsKLQkJfQotCi0JCS8vIGlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICkgewotCQkvLyByZXR1cm4gZ2V0RWxlbWVudChpZCk7Ci0JCS8vIH0KLQotCQkvLyAvLyB0aGlzIGlzIGFuIGVhc2llciB3YXksIHRlc3QgaXQsCi0JCS8vIC8vIGRvZXMgbm90IHdvcmsgc2luY2UgZmVhdHVyZS5nZXRFVHlwZSgpIHJldHVybnMgdGhlIGJhc2UgZWxlbWVudAotCQkvLyB0eXBlLCBub3QgdGhlIGV4dGVuZGVkIG9uZQotCQkvLyAvLyBmb3IgZXhhbXBsZSwgaXQgcmV0dXJucyBNZXRob2RQYWNrYWdlIGluc3RlYWQgb2YgUHJvY2Vzc1BhY2thZ2Ugb3IKLQkJLy8gQ29udGVudFBhY2thZ2UKLQkJLy8gLy8gc28gd2UgbmVlZCB0byBtYWtlIG91ciBvd24gbWFwCi0JCS8vIEVDbGFzc2lmaWVyIGMgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0KLQkJRUNsYXNzIG9iakNsYXNzID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRUNsYXNzKHhtbEVDbGFzc05hbWUpOwotCQlpZiAob2JqQ2xhc3MgPT0gbnVsbCkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfbm9fZWNsYXNzLCB4bWxFQ2xhc3NOYW1lKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlvYmogPSAoRURhdGFPYmplY3QpIEVjb3JlVXRpbC5jcmVhdGUob2JqQ2xhc3MpOwkKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQkvLyBXb3JrT3JkZXIgaXMgbm90IGEgbWV0aG9kIGVsZW1lbnQgaW4geG1sIHVtYSwgbmVlZCB0byBjcmVhdGUgaXQKLQkJCS8vIHdpdGggYSBndWlkCi0JCQkvL2lkID0gRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpOwotCi0JCQkvLyBhbHNvIG5lZWQgdG8gYWRkIHRoZSBlbGVtZW50IGludG8gdGhlIGNvbnRhaW5lciBvZiB0aGUgb3duZXIKLQkJCSgoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lci5lQ29udGFpbmVyKCkpLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgKLQkJCQkJKFdvcmtPcmRlcilvYmopOwotCQl9Ci0KLQkJc2V0RWxlbWVudChpZCwgb2JqKTsKLQotCQl0cnkgewotCQkJaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBjb250YWluZXI7Ci0JCQkJLy8gbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGZvciBuZXcgcGx1Z2luCi0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCS8vIGNvbnRlbnQgcGFja2FnZSBhbmQgb3duZXIgaXMgUGx1Z2luLCBnb3RvIHRoZSByb290Ci0JCQkJCS8vIGNvbnRlbnQgcGFja2FnZQotCQkJCQlNZXRob2RQYWNrYWdlIHBrZ19jb3JlX2NvbnRlbnQgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKAotCQkJCQkJCXBsdWdpbiwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJCQlwa2dfY29yZV9jb250ZW50LmdldENoaWxkUGFja2FnZXMoKS5hZGQoKENvbnRlbnRQYWNrYWdlKW9iaik7Ci0JCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCU1ldGhvZFBhY2thZ2UgcGtnX2NwID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgpOwotCQkJCQlwa2dfY3AuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudClvYmopOwotCi0JCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkvLyB0aGlzIGlzIGEgcm9vdCBwcm9jZXNzIHBhY2thZ2UKLQkJCQkJLy8gcHV0IGludG8gdGhlIHJvb3QgZGVsaXZlcnkgcHJvY2Vzc2VzIHBhY2thZ2UKLQkJCQkJTWV0aG9kUGFja2FnZSBwa2dfZHAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCQkJCQlwa2dfZHAuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoUHJvY2Vzc1BhY2thZ2Upb2JqKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCi0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRQotCQkJCQkJLmdldFJtY0ZlYXR1cmUoY29udGFpbmVyLmVDbGFzcygpLCB4bWxGZWF0dXJlTmFtZSk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoKGNvbnRhaW5lciBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCQkJJiYgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkJJiYgb2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCi0JCQkJCS8vIHRoZSBjb250YWluZXIgbmVlZHMgdG8gYmUgYSBwcm9jZXNzIHBhY2thZ2UKLQkJCQkJRU9iamVjdCBwa2cgPSBjb250YWluZXI7Ci0JCQkJCXdoaWxlICgocGtnICE9IG51bGwpICYmICEocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCQl9Ci0KLQkJCQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbiBhY3Rpdml0eSwgY3JlYXRlIGEgcGFja2FnZSBmb3IgaXQgYW5kCi0JCQkJCS8vIGFsbCBpdCdzIGJyZWFrZG93biBlbGVtZW50cwotCQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQkJTGlzdCBjaGlsZFBrZ3MgPSAoKFByb2Nlc3NQYWNrYWdlKSBwa2cpCi0JCQkJCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQkJCQlQcm9jZXNzUGFja2FnZSBwcCA9IG51bGw7Ci0JCQkJCQlpZiAodHJ1ZSB8fCBjaGlsZFBrZ3Muc2l6ZSgpID09IDApIHsJLy8xNTgzNjM6IGFsd2F5cyBjcmVhdGUgYSBwYWNrYWdlIGZvciBhY3QKLQkJCQkJCQlwcCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQkJCQkJcHAuc2V0TmFtZSgoKE1ldGhvZEVsZW1lbnQpIGNvbnRhaW5lcikuZ2V0TmFtZSgpKTsKLQkJCQkJCQlzZXRFbGVtZW50KEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSwgcHApOwotCQkJCQkJCXNldFNvdXJjZUlkKHBwLmdldEd1aWQoKSk7Ci0JCQkJCQkJY2hpbGRQa2dzLmFkZChwcCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXBwID0gKFByb2Nlc3NQYWNrYWdlKSBjaGlsZFBrZ3MuZ2V0KDApOwotCQkJCQkJfQotCi0JCQkJCQlwa2cgPSBwcDsKLQkJCQkJfQotCi0JCQkJCSgoUHJvY2Vzc1BhY2thZ2UpIHBrZykuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKChQcm9jZXNzRWxlbWVudClvYmopOwotCQkJCX0KLQotCQkJCS8vIG5vdGU6IGFsbCBlbGVtZW50IHJlZmVyZW5jZXMgYXJlIHN0cmluZyB0eXBlIChpZCkKLQkJCQkvLyBwYWNrYWdlIHJlZmVyZW5jZXMgYXJlIG9iamVjdCByZWZlcmVuY2VzCi0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCXZhbHVlcy5hZGQob2JqKTsKLQkJCQl9IGVsc2UgewotCQkJCQljb250YWluZXIuZVNldChmZWF0dXJlLCBvYmopOwotCQkJCX0KLQkJCX0JCQkJCi0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3JfY3JlYXRlX2VsZW1lbnQsIGUuZ2V0TWVzc2FnZSgpKSk7Ci0JCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RWxlbWVudChTdHJpbmcgZ3VpZCwgRURhdGFPYmplY3Qgb2JqKSB7Ci0JCS8vIGFkZEVsZW1lbnRUb0NvbnRhaW5lcihjb250YWluZXIsIG9iaik7Ci0JCQkJCi0JCWlmICghZWxlbWVudHNNYXAuY29udGFpbnNLZXkoZ3VpZCkpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG9iaikuc2V0R3VpZChndWlkKTsKLQkJCX0KLQotCQkJZWxlbWVudHNNYXAucHV0KGd1aWQsIG9iaik7Ci0JCQkJCQotCQkJc2V0RGlydHkob2JqKTsKLQkJCW5ld0VsZW1lbnRzTWFwLnB1dChndWlkLCBvYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNvdXJjZUlkKFN0cmluZyBpZCkgewotCQkvLyAxNTQxNDkgLSBhbGxvdyBwYWNrYWdlIGxldmVsIG1lcmdpbmcgZm9yIHhtbCBpbXBvcnQKLQkJaWYgKCAhc291cmNlRWxlbWVudElEcy5jb250YWlucyhpZCkgKSB7Ci0JCQlzb3VyY2VFbGVtZW50SURzLmFkZChpZCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldERpcnR5KEVPYmplY3Qgb2JqKSB7Ci0JCS8vIG1hcmsgdGhlIHJlc291cmNlIGFzIGRpcnR5Ci0JCVJlc291cmNlIHJlcyA9IG9iai5lUmVzb3VyY2UoKTsKLQkJaWYgKCByZXMgIT0gbnVsbCAmJiAhcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGVsZW1lbnQgZ2l2ZW4gdGhlIGd1aWQuCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIEVEYXRhT2JqZWN0IGdldEVsZW1lbnQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChFRGF0YU9iamVjdCkgZWxlbWVudHNNYXAuZ2V0KGd1aWQpOwotCX0KLQotCXByaXZhdGUgRGF0ZSBjcmVhdGVEYXRlKFN0cmluZyBkYXRlU3RyKSB7Ci0JCWRhdGVTdHIgPSBkYXRlU3RyLnJlcGxhY2UoJ1QnLCAnICcpOwotCQlTaW1wbGVEYXRlRm9ybWF0IGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmLnBhcnNlKGRhdGVTdHIsIG5ldyBQYXJzZVBvc2l0aW9uKDApKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0cmluZyhPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJc3RyID0gTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoKE1ldGhvZEVsZW1lbnQpIG9iaik7Ci0JCX0gZWxzZSBpZiAob2JqICE9IG51bGwpIHsKLQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlLgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0cmlidXRlRmVhdHVyZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLAotCQkJT2JqZWN0IHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBvYmouZURlbGl2ZXIoKTsKLQkJb2JqLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJc2V0QXRyaWJ1dGVGZWF0dXJlVmFsdWVfKG9iaiwgZmVhdHVyZU5hbWUsIHZhbHVlKTsKLQkJb2JqLmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRBdHJpYnV0ZUZlYXR1cmVWYWx1ZV8oRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlPYmplY3QgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QgfHwgdmFsdWUgaW5zdGFuY2VvZiBFRGF0YU9iamVjdCkgewotCQkJaWYgKGZlYXR1cmVOYW1lLmVxdWFscygibWV0aG9kRWxlbWVudFByb3BlcnR5IikpIHsJCS8vJE5PTi1OTFMtMSQKLQkJCQlzZXRNZXBGZWF0dXJlVmFsdWUob2JqLCBmZWF0dXJlTmFtZSwgdmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X2F0dHJpYnV0ZV8yLCB2YWx1ZSkpOyAKLQkJfQotCi0JCS8vIGZpbmQgdGhlIGZlYXR1cmUgYW5kIHNldCB0aGUgdmFsdWUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwgdmFsdWUgfTsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGUsIHBhcmFzKSArIG9iaik7IAotCQkJcmV0dXJuOwotCQl9IAotCQkKLQkJc2V0RGlydHkob2JqKTsKLQotCQkvLyAxNTg2ODggLSBNaXNzaW5nIHRlbXBsYXRlIGZpbGVzIGluIGV4cG9ydGVkIHhtbCBsaWJyYXJ5Ci0JCS8vIHByb2Nlc3MgdGhlIGF0dGFjaG1lbnQgdXJsCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgKSB7Ci0JCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7Ci0JCQkJdmFsdWUgPSBjb250ZW50UHJvYy5yZXNvbHZlQXR0YWNobWVudFJlc291cmNlcyhvYmosIHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsKLQkJCX0KLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCQkKLQkJZWxzZSBpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCS8vIGlmIHRoZSB1bWEgZmVhdHVyZSBpcyBhIHJlZmVyZW5jZSBmZWF0dXJlCi0JCQkvLyBidXQgdGhlIHhtbCBmZWF0dXJlIGlzIGFuIGF0dHJpYnV0ZQotCQkJLy8gdGhlIGF0dHJpYnV0ZSB2YWx1ZSBtdXN0IGJlIGEgZ3VpZAotCQkJT2JqZWN0IGUgPSBnZXRFbGVtZW50KChTdHJpbmcpIHZhbHVlKTsKLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5hZGQoZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2JqLmVTZXQoZmVhdHVyZSwgZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLAotCQkJCQkJZmVhdHVyZS5nZXROYW1lKCksIHZhbHVlIH07Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9hdHRyaWJ1dGUsIHBhcmFzKTsgCi0JCQkJbG9nZ2VyLmxvZ1dhcm5pbmcobXNnKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJ2YXJpYWJpbGl0eVR5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gVmFyaWFiaWxpdHlUeXBlLmdldCh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKGZlYXR1cmUuZ2V0TmFtZSgpLmVxdWFscygibGlua1R5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gV29ya09yZGVyVHlwZS5nZXQodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkpIHsKLQkJCQkJLy8gY29udmVydCBqYXZhLnV0aWwuRGF0ZSB0byB4bWwgRGF0ZQotCQkJCQl2YWx1ZSA9IGNyZWF0ZURhdGUodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJfSBlbHNlIGlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm5vZGVpY29uIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJfHwgZmVhdHVyZS5nZXROYW1lKCkuZXF1YWxzKCJzaGFwZWljb24iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCU1ldGhvZFBsdWdpbiB0Z3RQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJCQkJaW50IGl4ID0gdGd0UGx1Z2luLmdldE5hbWUoKS5sZW5ndGgoKSArIDE7Ci0JCQkJCQkJCQkJCi0JCQkJCXZhbHVlID0gbmV3IGphdmEubmV0LlVSSSh2YWx1ZS50b1N0cmluZygpLnN1YnN0cmluZyhpeCkpOwotCi0JCQkJCS8vIG5lZWQgdG8gY29weSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkKLQkJCQkJY29udGVudFByb2MuY29weVJlc291cmNlKCgoamF2YS5uZXQuVVJJKSB2YWx1ZSkuZ2V0UGF0aCgpLCBvYmosIHRndFBsdWdpbik7Ci0JCQkJfSBlbHNlIGlmICgoY29udGVudFByb2MgIT0gbnVsbCkKLQkJCQkJCSYmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJCQkJJiYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQl2YWx1ZSA9IGNvbnRlbnRQcm9jLnJlc29sdmVSZXNvdXJjZUZpbGVzKAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBvYmosIChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9Ci0JCQkJb2JqLmVTZXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsCi0JCQkJCQl2YWx1ZSB9OwotCQkJCWxvZ2dlci5sb2dFcnJvcihOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlLCBwYXJhcyksIGUpOyAKLQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIHZhbHVlIH07Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfYXR0cmlidXRlXzMsIHBhcmFzKSk7IAotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWVwRmVhdHVyZVZhbHVlKEVEYXRhT2JqZWN0IG9iaiwgU3RyaW5nIGZlYXR1cmVOYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJTGlzdCBzcmNMaXN0ID0gKExpc3QpIHZhbHVlOwotCQlpbnQgc3ogPSBzcmNMaXN0ID09IG51bGwgPyAwIDogc3JjTGlzdC5zaXplKCk7CQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBGZWF0dXJlTWFuYWdlci5JTlNUQU5DRS5nZXRSbWNGZWF0dXJlKG9iagotCQkJCS5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQlMaXN0IHRndExpc3QgPSAoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSk7Ci0JCWludCB0c3ogPSB0Z3RMaXN0ID09IG51bGwgPyAwIDogdGd0TGlzdC5zaXplKCk7Ci0KLQkJLy9Tb3VyY2UgbGlzdCBpcyBlbXB0eQotCQlpZiAoc3ogPT0gMCkgewotCQkJaWYgKHRzeiA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGd0TGlzdC5yZW1vdmVBbGwodGd0TGlzdCk7Ci0JCQlzZXREaXJ0eShvYmopOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL1NvcnVjZSBhbmQgdGFyZ2V0IGFyZSBwb3RlbnRpYWxseSB0aGUgc2FtZQotCQlib29sZWFuIHNhbWUgPSBmYWxzZTsKLQkJaWYgKHN6ID09IHRzeikgewotCQkJc2FtZSA9IHRydWU7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBzejsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IHNyY01lcCA9IAotCQkJCQkob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5KSBzcmNMaXN0LmdldChpKTsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgdGd0TWVwID0gCi0JCQkJCShNZXRob2RFbGVtZW50UHJvcGVydHkpIHRndExpc3QuZ2V0KGkpOwotCQkJCWlmICghIHNyY01lcC5nZXROYW1lKCkuZXF1YWxzKHRndE1lcC5nZXROYW1lKCkpKSB7Ci0JCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICghIHNyY01lcC5nZXRWYWx1ZSgpLmVxdWFscyh0Z3RNZXAuZ2V0VmFsdWUoKSkpIHsKLQkJCQkJc2FtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNhbWUpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9Tb3J1Y2UgYW5kIHRhcmdldCBhcmUgbm90IHRoZSBzYW1lCi0JCXRndExpc3QucmVtb3ZlQWxsKHRndExpc3QpOwotCQlmb3IgKGludCBpPTA7IGkgPCBzejsgaSsrKSB7Ci0JCQlPYmplY3Qgc3JjSXRlbSA9IHNyY0xpc3QuZ2V0KGkpOwotCQkJaWYgKHNyY0l0ZW0gaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkpIHsKLQkJCQlvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgbWVwID0gCi0JCQkJCQkob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5KSBzcmNJdGVtOwotCQkJCUVDbGFzcyBvYmpDbGFzcyA9IEZlYXR1cmVNYW5hZ2VyLklOU1RBTkNFCi0JCQkJLmdldFJtY0VDbGFzcygiTWV0aG9kRWxlbWVudFByb3BlcnR5Iik7CS8vJE5PTi1OTFMtMSQKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgeG1sTWVwID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgRWNvcmVVdGlsLmNyZWF0ZShvYmpDbGFzcyk7Ci0JCQkJeG1sTWVwLnNldFZhbHVlKG1lcC5nZXRWYWx1ZSgpKTsKLQkJCQl4bWxNZXAuc2V0TmFtZShtZXAuZ2V0TmFtZSgpKTsKLQkJCQl0Z3RMaXN0LmFkZCh4bWxNZXApOwotCQkJfQotCQl9Ci0JCXNldERpcnR5KG9iaik7Ci0JCS8vb2JqLmVTZXQoZmVhdHVyZSwgdGd0TGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyByZWZlcmVuY2UgdmFsdWUuCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEBwYXJhbSBpZAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlVmFsdWUoRURhdGFPYmplY3Qgb2JqLCBTdHJpbmcgZmVhdHVyZU5hbWUsIFN0cmluZyBpZCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAob2JqID09IG51bGwgfHwgZmVhdHVyZU5hbWUgPT0gbnVsbCB8fCBpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUVPYmplY3QgdmFsdWUgPSBnZXRFbGVtZW50KGlkKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWxvZ2dlci5sb2dXYXJuaW5nKE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5saWJyYXJ5X2Vycm9yX3NldF9yZWZlcmVuY2UsIGZlYXR1cmVOYW1lLCBpZCkpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBmZWF0dXJlIGFuZCBzZXQgdGhlIHZhbHVlCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gRmVhdHVyZU1hbmFnZXIuSU5TVEFOQ0UuZ2V0Um1jRmVhdHVyZShvYmoKLQkJCQkuZUNsYXNzKCksIGZlYXR1cmVOYW1lKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGFyYXMgPSBuZXcgT2JqZWN0W10geyBnZXRTdHJpbmcob2JqKSwgZmVhdHVyZU5hbWUsIGlkIH07Ci0JCQlsb2dnZXIubG9nV2FybmluZyhOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMubGlicmFyeV9lcnJvcl9zZXRfcmVmZXJlbmNlXzIsIHBhcmFzKSk7IAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZG9uJ3QgaXRlcmF0ZSB0aGUgY29udGFpbm1lbnQgZmVhdHVyZQotCQlpZiAodmFsdWUuZUNvbnRhaW5lcigpID09IG9iaikgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gU3RyaW5nIHN0ciA9IGZlYXR1cmUuZ2V0RVR5cGUoKS5nZXROYW1lKCk7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQl0cnkgewotCQkJCUxpc3QgaXRlbXMgPSAoTGlzdCkgb2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKCFpdGVtcy5jb250YWlucyh2YWx1ZSkpIHsKLQkJCQkJaXRlbXMuYWRkKHZhbHVlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQlPYmplY3RbXSBwYXJhcyA9IG5ldyBPYmplY3RbXSB7IGdldFN0cmluZyhvYmopLCBmZWF0dXJlTmFtZSwgaWQgfTsKLQkJCQlsb2dnZXIKLQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJTkxTLmJpbmQoSW1wb3J0WE1MUmVzb3VyY2VzLmxpYnJhcnlfZXJyb3Jfc2V0X3JlZmVyZW5jZV8yLCBwYXJhcyksIGUpOyAKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW9iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJfQotCQkKLQkJc2V0RGlydHkob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdvcmsgb3JkZXIuCi0JICogQHBhcmFtIHVtYVdvcmtPcmRlcgotCSAqIEBwYXJhbSBwcmVkSWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrT3JkZXIoT2JqZWN0IHVtYVdvcmtPcmRlciwgU3RyaW5nIHByZWRJZCkgewotCQlpZiAodW1hV29ya09yZGVyIGluc3RhbmNlb2YgV29ya09yZGVyKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBnZXRFbGVtZW50KHByZWRJZCk7Ci0JCQkoKFdvcmtPcmRlcikgdW1hV29ya09yZGVyKS5zZXRQcmVkKGUpOwotCQkJCi0JCQlzZXREaXJ0eSgoRU9iamVjdCl1bWFXb3JrT3JkZXIpOwotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaXhlcyBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGZpeExpYnJhcnkoKSB7Ci0JCU1ldGhvZExpYnJhcnkgcm9vdE9iamVjdCA9IGdldFJvb3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9ICgoTWV0aG9kTGlicmFyeSkgcm9vdE9iamVjdCkuZ2V0TWV0aG9kUGx1Z2lucygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWZpeFBsdWdpbigoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGZpeCB0YXNrIGRlc2NyaXB0b3JzIGZvciBpbXBvcnQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhUYXNrRGVzY3JpcHRvcnMoTWFwPFN0cmluZywgVGFza0Rlc2NyaXB0b3I+IHRkTWFwKSB7Ci0JCWlmICh0ZE1hcCA9PSBudWxsIHx8IHRkTWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4+IGl0ID0gdGRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnk8U3RyaW5nLCBUYXNrRGVzY3JpcHRvcj4gZW50cnkgPSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IGVudHJ5LmdldEtleSgpOwotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciB1bWFUZCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yKSBlbGVtZW50c01hcC5nZXQoZ3VpZCk7Ci0JCQlhc3NlcnQodW1hVGQgIT0gbnVsbCk7Ci0JCQlpZiAodW1hVGQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCBzdGVwcyA9IHRkLmdldFN0ZXAoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxzdGVwcy5zaXplKCk7IGkrKykgewotCQkJCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQgc3RlcCA9IChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50KSBzdGVwcy5nZXQoaSk7Ci0JCQkJU2VjdGlvbiB1bWFTdGVwID0gIChTZWN0aW9uKSBlbGVtZW50c01hcC5nZXQoc3RlcC5nZXRJZCgpKTsKLQkJCQlhc3NlcnQodW1hU3RlcCAhPSBudWxsKTsKLQkJCQlpZiAodW1hU3RlcCAhPSBudWxsKSB7Ci0JCQkJCXVtYVRkLmdldFNlbGVjdGVkU3RlcHMoKS5hZGQodW1hU3RlcCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZFBhY2thZ2UgY3BSb290ID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kUGFja2FnZSBkcFJvb3QgPSBudWxsOwotCi0vLwlwcml2YXRlIE1ldGhvZFBhY2thZ2UgcGNSb290ID0gbnVsbDsKLQotCXByaXZhdGUgdm9pZCBmaXhQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCi0JCS8vIGZpeCB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcmllcwotCQlmaXhDdXN0b21DYXRlZ29yaWVzKHBsdWdpbik7Ci0KLQkJTGlzdCBjcFBrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgZHBQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCUxpc3QgcGNQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWNwUm9vdCA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoKTsKLQkJZHBSb290ID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLS8vCQlwY1Jvb3QgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLS8vCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpOwotCQlnZXRBbGxQYWNrYWdlcyhjcFJvb3QsIGNwUGtncyk7Ci0JCWdldEFsbFBhY2thZ2VzKGRwUm9vdCwgZHBQa2dzKTsKLQkJCi0vLwkJaWYgKCBwY1BrZ3MgIT0gbnVsbCApIHsKLS8vCQkJZ2V0QWxsUGFja2FnZXMocGNSb290LCBwY1BrZ3MpOwotLy8JCX0KLQkJCQotCQlMaXN0IHByb2NzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdClpdC5uZXh0KCk7Ci0JCQlib29sZWFuIG9sZE5vdGlmeSA9IG8uZURlbGl2ZXIoKTsKLQkJCXRyeQl7Ci0JCQkJLy8gdHVybiBvZmYgbm90aWZpY2F0aW9ucyB0byBhdm9pZCBwb3NzaWJsZSBkZWFkbG9jayBvciB0aHJlYWQgaXNzdWUKLQkJCQkvLyAxNTQxNDIgLSBpbXBvcnQgeG1sIGNhdXNlZCB0aHJlYWQgYWNjZXNzIGVycm9yCi0JCQkJby5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCi0JCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCXByb2NzLmFkZChvKTsKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIHBOYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG8pLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJaWYgKHBOYW1lID09IG51bGwgfHwgcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG8pCi0JCQkJCQkJCS5zZXRQcmVzZW50YXRpb25OYW1lKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvKQotCQkJCQkJCQkJCS5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCS8vIGZpeCB0aGUgbmFtZSBzdHJpbmcKLQkJCQlpZiAobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgIShvIGluc3RhbmNlb2YgU2VjdGlvbikpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG8pLmdldE5hbWUoKTsKLQkJCQkJU3RyaW5nIG5ld19uYW1lID0gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuYW1lKTsKLQkJCQkJaWYgKCAhbmV3X25hbWUuZXF1YWxzKG5hbWUpICkgewotCQkJCQkJKChNZXRob2RFbGVtZW50KSBvKS5zZXROYW1lKG5ld19uYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJby5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2NzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9jcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IHByb2MgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJaWYgKCFkcFBrZ3MuY29udGFpbnMocGMpKSB7Ci0JCQkJCQltb3ZlUHJvY2Vzc0NvbXBvbmVudChwYywgZHBSb290KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCWlmICghY3BQa2dzLmNvbnRhaW5zKHBjKSkgewotCQkJCQkJbW92ZVByb2Nlc3NDb21wb25lbnQocGMsIGNwUm9vdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0QWxsUGFja2FnZXMoTWV0aG9kUGFja2FnZSBwa2csIExpc3QgcGtncykgewotCQlwa2dzLmFkZChwa2cpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRBbGxQYWNrYWdlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBwa2dzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIG1vdmUgdGhlIHByb2Nlc3MgcGFja2FnZSB0byB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciwgaWYgdGhlIHBhY2thZ2UgaXMKLQkgKiB0aGUgb25seSBjaGlsZCBvZiBpdCdzIHBhcmVudCwgbW92ZSBpdCdzIHBhcmVudAotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKiBAcGFyYW0gY29udGFpbmVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vdmVQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NQYWNrYWdlIHBrZywKLQkJCU1ldGhvZFBhY2thZ2UgY29udGFpbmVyKSB7Ci0JCS8vIG1ha2Ugc3VyZSBDYXBhYmlsaXR5IHBhdHRlcm5zIGFyZSBpbiB0aGUgQ2FwYWJpbGl0eSBwYWNrYWdlcwotCQlPYmplY3QgbyA9IHBrZy5lQ29udGFpbmVyKCk7Ci0JCWlmICgobyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKQotCQkJCSYmICgoKFByb2Nlc3NQYWNrYWdlKSBvKS5nZXRDaGlsZFBhY2thZ2VzKCkuc2l6ZSgpID09IDEpCi0JCQkJJiYgbyAhPSBjcFJvb3QgJiYgbyAhPSBkcFJvb3QgKSB7Ci0JCQltb3ZlUHJvY2Vzc0NvbXBvbmVudCgoUHJvY2Vzc1BhY2thZ2UpIG8sIGNvbnRhaW5lcik7Ci0JCX0gZWxzZSB7Ci0JCQljb250YWluZXIuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZmluZCB0aGUgcm9vdCBjdXN0b20gY2FnZWdvcnkgYW5kIHB1dCB0byB0aGUgcm9vdCBwYWNrYWdlCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeEN1c3RvbUNhdGVnb3JpZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgpOwotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdChwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCi0JCUxpc3Qgcm9vdEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgY2MgPSAoQ3VzdG9tQ2F0ZWdvcnkpIGl0ZW1zLnJlbW92ZSgwKTsKLQkJCXJvb3RJdGVtcy5hZGQoY2MpOwotCQkJCi0JCQkvLyAxNTg2OTFDdXN0b20gQ2F0ZWdvcnkgaXMgZGlmZmVyZW50IGluIGV4cG9ydGVkIGxpYnJhcnkKLQkJCS8vIG5lZWQgdG8gcmVtb3ZlIHN1Yi1jYXRlZ29yaWVzIHJlY3Vyc2l2ZWx5Ci0JCQlmaXhDdXN0b21DYXRlZ29yaWVzKGNjLCBpdGVtcywgcm9vdEl0ZW1zKTsKLQkJfQotCi0JCVRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbikuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmFkZEFsbCgKLQkJCQlyb290SXRlbXMpOwotCi0JfQotCQotCS8qKgotCSAqIGZpbmQgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3JpZXMgYnkgcmVtb3ZpbmcgdGhlIHN1Yi1jYXRlZ29yaWVzIHJlY3Vyc2l2ZWx5Ci0JICogCi0JICogQHBhcmFtIGNjCi0JICogQHBhcmFtIGl0ZW1zCi0JICogQHBhcmFtIHJvb3RJdGVtcwotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhDdXN0b21DYXRlZ29yaWVzKEN1c3RvbUNhdGVnb3J5IGNjLCBMaXN0IGl0ZW1zLCBMaXN0IHJvb3RJdGVtcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2MuZ2V0U3ViQ2F0ZWdvcmllcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJaXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJcm9vdEl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCWZpeEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KWl0ZW0sIGl0ZW1zLCByb290SXRlbXMpOwotCQl9Ci0JCQotCQkvLyBhbHNvIGl0ZXJhdGUgdGhlIGNvbnRhaW5lZCBlbGVtZW50cwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2MuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaXQubmV4dCgpOwotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCWl0ZW1zLnJlbW92ZShpdGVtKTsKLQkJCQlyb290SXRlbXMucmVtb3ZlKGl0ZW0pOwotCQkJCWZpeEN1c3RvbUNhdGVnb3JpZXMoKEN1c3RvbUNhdGVnb3J5KWl0ZW0sIGl0ZW1zLCByb290SXRlbXMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIGRlbGV0ZSB0aGUgdW4tbmVlZGVkIGVsZW1lbnRzIGFyZSBjbGVhciByZXNvdXJjZXMgCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlRWxlbWVudHMoKSB7Ci0JCQotCQlJRmlsZU1hbmFnZXIgZmlsZU1nciA9IFNlcnZpY2VzLmdldEZpbGVNYW5hZ2VyKCk7Ci0KLQkJTGlzdCBkZWxldGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKWVudHJ5LmdldEtleSgpOwotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpZW50cnkuZ2V0VmFsdWUoKTsKLQkJCWlmICggc291cmNlRWxlbWVudElEcy5jb250YWlucyhpZCkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKG92ZXJ3cml0ZSkgewotCQkJCWJvb2xlYW4gdG9EZWxldGUgPSAhKGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4KLQkJCQkJCQkJCXx8IGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAodG9EZWxldGUpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCQkJdG9EZWxldGUgPSBwbHVnaW4gIT0gbnVsbCAmJiAhaXNOZXdFbGVtZW50KHBsdWdpbi5nZXRHdWlkKCkpCi0JCQkJCSYmIHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJCWlmICh0b0RlbGV0ZSkgewotCQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJCQloYW5kbGVBY3Rpdml0eVJlbW92YWwoZSk7Ci0JCQkJCS8vRWNvcmVVdGlsLnJlbW92ZShlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoIChlIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpICYmIFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoIChDdXN0b21DYXRlZ29yeSllICkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9CQkJCi0JCQkKLQkJCS8vIGRlbGV0ZSB0aGUgZWxlbWVudCBpZiB0aGUgY29udGFpbmcgcGFja2FnZSBpcyBpbiB0aGUgc291cmNlIGxpYnJhcnkKLQkJCS8vIGRvbid0IGRlbGV0ZSBpZiB0aGUgcGFja2FnZSBpcyBub3QgaW4gdGhlIHhtbCBsaWJyYXJ5Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFRuZ1V0aWwuZ2V0TWV0aG9kUGFja2FnZShlKTsKLQkJCQotCQkJaWYgKCBwa2cgIT0gbnVsbCApIHsgCi0JCQkJU3RyaW5nIHBpZCA9IHBrZy5nZXRHdWlkKCk7Ci0JCQkJaWYgKCBzb3VyY2VFbGVtZW50SURzLmNvbnRhaW5zKHBpZCkgKSB7Ci0JCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCWhhbmRsZUFjdGl2aXR5UmVtb3ZhbChlKTsKLQkJCQkJCi0JCQkJCS8vIGRlbGV0ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBsaWJyYXJ5Ci0JCQkJCS8vRWNvcmVVdGlsLnJlbW92ZShlKTsJCQkJCi0JCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCi0JCQkJCWJvb2xlYW4gdG9DaGVjayA9IHRydWU7Ci0JCQkJCU1ldGhvZFBhY2thZ2UgcGMgPSBwa2c7CQkJCQkKLQkJCQkJd2hpbGUocGMgIT0gbnVsbCAmJiAhIChwYyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpKSB7Ci0JCQkJCQlwYyA9IFRuZ1V0aWwuZ2V0UGFyZW50TWV0aG9kUGFja2FnZShwYyk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBjIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJdG9DaGVjayA9IHNvdXJjZUVsZW1lbnRJRHMuY29udGFpbnMocGMuZ2V0R3VpZCgpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKHRvQ2hlY2spIHsKLQkJCQkJCXBrZyA9IFRuZ1V0aWwuZ2V0TWV0aG9kUGFja2FnZShwa2cpOwotCQkJCQkJd2hpbGUgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCQkJcGlkID0gcGtnLmdldEd1aWQoKTsKLQkJCQkJCQlpZiAoc291cmNlRWxlbWVudElEcy5jb250YWlucyhwaWQpKSB7Ci0JCQkJCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQkJCWhhbmRsZUFjdGl2aXR5UmVtb3ZhbChlKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCXBrZyA9IFRuZ1V0aWwuZ2V0UGFyZW50TWV0aG9kUGFja2FnZShwa2cpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBkZWxldGUgdGhlIHJlc291cmNlcwotCQlkZWxldGVSZXNvcnVjZXMoZGVsZXRlZEVsZW1lbnRzKTsKLQl9Ci0KLQkvLwkxNjQ1ODEKLQlwcml2YXRlIHZvaWQgaGFuZGxlQWN0aXZpdHlSZW1vdmFsKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoIShlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlCcmVha2Rvd25FbGVtZW50IGVhY3QgPSAoQnJlYWtkb3duRWxlbWVudCkgZTsKLQkJQWN0aXZpdHkgc2FjdCA9IGVhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCWlmIChzYWN0ICE9IG51bGwpIHsKLQkJCXNhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmUoZWFjdCk7Ci0JCX0KLQl9Ci0JCi0JLy8gY2xlYXIgcmVzb3VyY2VzIGZvciBkZWxldGVkIGVsZW1lbnRzCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlc29ydWNlcyhMaXN0IGRlbGV0ZWRFbGVtZW50cykgewotCQlpZiAoIGRlbGV0ZWRFbGVtZW50cy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQotCQkJRU9iamVjdCBvYmogPSBudWxsOwotCQkJaWYgKCBlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICkgewotCQkJCW9iaiA9ICgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiB8fAotCQkJCQlvdmVyd3JpdGUgJiYgZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlvYmogPSBlOwotCQkJfQotCQkJaWYgKCBvYmogIT0gbnVsbCApIHsKLQkJCQlNZXRob2RFbGVtZW50IHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGUpOwotCQkJCVJlc291cmNlIHBsdWdpblJlcyA9IHBsdWdpbiA9PSBudWxsID8gbnVsbCA6IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQkKLQkJCQlSZXNvdXJjZSByZXMgPSBvYmouZVJlc291cmNlKCk7Ci0JCQkJaWYgKCByZXMgIT0gbnVsbCAmJiByZXMgIT0gcGx1Z2luUmVzKSB7CQkvL1Byb3RlY3RlZCBmcm9tIGJ1Z3MgbGlrZSAxNzcwNDIKLQkJCQkJU3RyaW5nIGZpbGUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0aW5nIHJlc291cmNlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCAhZmlsZU1nci5kZWxldGUoZmlsZSkgKSB7Ci0JCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hYmxlIHRvIGRlbGV0ZSBmaWxlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQkJRU9iamVjdCByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKHJlc01ncik7Ci0JCQkJCX0KLQkJCQkJRU9iamVjdCByZXNEZXMgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzKTsKLQkJCQkJaWYgKHJlc0RlcyAhPSBudWxsKSB7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKHJlc0Rlcyk7Ci0JCQkJCX0KLQkJCQkJaWYgKG92ZXJ3cml0ZSkgewkJCQkJCQotCQkJCQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShmaWxlKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQlGaWxlIGZpbGVzW10gPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0JCQkJCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCApIHsKLQkJCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0aW5nIGZvbGRlciByZXNvdXJjZTogIiArIGZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCAhZmlsZU1nci5kZWxldGUoZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKSApIHsKLQkJCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hYmxlIHRvIGRlbGV0ZSBmb2xkZXIgZmlsZTogIiArIGZvbGRlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQkJCi0JCQlFY29yZVV0aWwucmVtb3ZlKGUpOwotCQl9Ci0JfQotCQkJCi0JLyoqCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgZ2l2ZW4gYnkgZ3VpZCBpcyBuZXcuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiBuZXdFbGVtZW50c01hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OWIxNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEltcG9ydCBYTUwgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9JbXBvcnRYTUxXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL0ltcG9ydFhNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVhYTkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL0ltcG9ydFhNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkud2l6YXJkcy5TYXZlQWxsRWRpdG9yc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5FeHBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLkltcG9ydFhNTFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5wcmVmZXJlbmNlcy5JbXBvcnRYTUxQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlcy5JbXBvcnRYTUxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5hY3Rpb25zLkxpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JSW1wb3J0V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogVGhlIEltcG9ydCBYTUwgd2l6YXJkLgotICogPHA+Ci0gKiBUaGlzIHdpemFyZCBpcyB1c2VkIHRvIGltcG9ydCBtZXRob2QgbGlicmFyeSBjb250ZW50IHN0b3JlZCBpbiBhIFhNTCBmaWxlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRYTUxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCUltcG9ydFhNTFNlcnZpY2Ugc2VydmljZSA9IG5ldyBJbXBvcnRYTUxTZXJ2aWNlKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3VjY2VlZCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBTZWxlY3RYTUxGaWxlUGFnZSBmaWxlUGFnZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRYTUxXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gY2hlY2sgb3V0IHRoZSBsaWJyYXJ5IGZpcnN0Ci0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCksCi0JCQkJCU1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSk7Ci0JCX0KLQotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IChJTGlicmFyeU1hbmFnZXIpIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwgJiYgbWFuYWdlci5pc01ldGhvZExpYnJhcnlSZWFkT25seSgpKSB7Ci0JCQlGaWxlIGxpYnJhcnlGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpLAotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUpOwotCQkJSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxXaXphcmRfdGl0bGUsCi0JCQkJCUltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxFcnJvcl9tc2csCi0JCQkJCU5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5pbXBvcnRYTUxFcnJvcl9yZWFzb24sCi0JCQkJCQkJbGlicmFyeUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgSW1wb3J0WE1MUGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZmlsZVBhZ2UgPSBuZXcgU2VsZWN0WE1MRmlsZVBhZ2UoKTsKLQkJYWRkUGFnZShmaWxlUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUV4cG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9YTUxGaWxlLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQlpZiAocmVmcmVzaCkgewotCQkJLy9OZWVkZWQ6IGJlY2F1c2UgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgYWRkcyBldmVudHMgdG8gUmVmcmVzaEpvYiBhdCB0aGUKLQkJCS8vZW5kIG9mICJydW4iIGNhbGwhCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0JCQotCQlmaW5hbCBib29sZWFuIHJldFtdID0gbmV3IGJvb2xlYW5bMV07CQkKLQkJTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJcmV0WzBdID0gcGVyZm9ybUZpbmlzaF8oKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCWlmIChyZWZyZXNoKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsgLy8gdGVtcCBzb2x1dGlvbiBmb3IgcG90ZW50aWFsIHJhY2luZwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHRydWUpOwotCQl9Ci0JCQotCQkKLQkJcnVubmVyID0gbmV3IExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKEltcG9ydFhNTFJlc291cmNlcy5yZXZpZXdfbG9nX2ZpbGVzLAotCQkJCQkJc2VydmljZS5nZXRMb2dQYXRoKCkpOwotCQkJCQlNc2dCb3gucHJvbXB0KG1zZywgU1dULk9LKTsKLQkJCX0JCQkKLQkJfSk7CQkKLQkJCi0JCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwZXJmb3JtRmluaXNoXygpIHsKLQkJTGlicmFyeUJhY2t1cFV0aWwucHJvbXB0QmFja3VwQ3VycmVudExpYnJhcnkobnVsbCwgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKSk7Ci0KLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLmJlZ2luVGFzayhJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0aW5nWE1MX3RleHQsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQotCQkJCQlTdHJpbmcgeG1sRmlsZSA9IGZpbGVQYWdlLmdldFBhdGgoKTsKLQkJCQkJYm9vbGVhbiBtZXJnZU9wdGlvbiA9IGZpbGVQYWdlLmdldE1lcmdlT3B0aW9uKCk7Ci0JCQkJCWJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucyA9IGZpbGVQYWdlLmdldENoZWNrQmFzZVBsdWdpbnMoKTsKLQkJCQkJc2VydmljZS5zZXRPdmVyd3JpdGUoIW1lcmdlT3B0aW9uKTsKLQkJCQkJc2VydmljZS5zZXRDaGVja0Jhc2VQbHVnaW5zKGNoZWNrQmFzZVBsdWdpbnMpOwotCQkJCQlzdWNjZWVkID0gc2VydmljZS5sb2FkWG1sKHhtbEZpbGUpOwotCQkJCQlpZiAoISBzdWNjZWVkKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0JCQkJCQotCQkJCQlzZXJ2aWNlLmRvSW1wb3J0KG1vbml0b3IpOwotCQkJCQlJbXBvcnRYTUxQcmVmZXJlbmNlcy5zZXRYTUxGaWxlKHhtbEZpbGUpOwotCQkJCQlJbXBvcnRYTUxQcmVmZXJlbmNlcy5zZXRNZXJnZU9wdGlvbihtZXJnZU9wdGlvbik7Ci0JCQkJCUltcG9ydFhNTFByZWZlcmVuY2VzLnNldENoZWNrQmFzZVBsdWdpbnNPcHRpb24oY2hlY2tCYXNlUGx1Z2lucyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSByZWFsRXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCUltcG9ydFhNTFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMuaW1wb3J0WE1MV2l6YXJkX3RpdGxlLAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgcmVhbEV4Y2VwdGlvbik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIXN1Y2NlZWQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvL1N0cmluZyBtc2cgPSBOTFMuYmluZChJbXBvcnRYTUxSZXNvdXJjZXMucmV2aWV3X2xvZ19maWxlcywKLQkJLy8Jc2VydmljZS5nZXRMb2dQYXRoKCkpOwotCQkvL01zZ0JveC5wcm9tcHQobXNnLCBTV1QuT0spOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIG9mIHRoaXMgd2l6YXJkIGFuZCBmcmVlcyBhbGwgU1dUIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlzZXJ2aWNlLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvU2VsZWN0WE1MRmlsZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmNTQ5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy94bWwvd2l6YXJkcy9TZWxlY3RYTUxGaWxlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5JbXBvcnRYTUxQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy54bWwuSW1wb3J0WE1MUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcueG1sLnByZWZlcmVuY2VzLkltcG9ydFhNTFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIFhNTCBmaWxlIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0WE1MRmlsZVBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RYTUxGaWxlUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIFRleHQgcGF0aFRleHQ7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXRoOwotCi0JcHJpdmF0ZSBib29sZWFuIG1lcmdlT3B0aW9uID0gdHJ1ZTsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucyA9IHRydWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RYTUxGaWxlUGFnZSgpIHsKLQkJc3VwZXIoUEFHRV9OQU1FKTsKLQkJc2V0VGl0bGUoSW1wb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0WE1MUmVzb3VyY2VzLnNlbGVjdFhNTEZpbGVQYWdlX2Rlc2MpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoSW1wb3J0WE1MUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvd2l6YmFuL2ltcF94bWxfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGZpbGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsZUxhYmVsLnNldFRleHQoSW1wb3J0WE1MUmVzb3VyY2VzLmZpbGVMYWJlbF90ZXh0KTsgCi0KLQkJcGF0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlwYXRoVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcGF0aFRleHQuc2V0VGV4dChJbXBvcnRYTUxQcmVmZXJlbmNlcy5nZXRYTUxGaWxlKCkpOwkJCi0JCXBhdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChpc1ZhbGlkUGF0aChwYXRoVGV4dC5nZXRUZXh0KCkudHJpbSgpKSkgewotCQkJCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UoSW1wb3J0WE1MUmVzb3VyY2VzLmludmFsaWRYTUxGaWxlX2Vycm9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5EKSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEltcG9ydFhNTFJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlGaWxlRGlhbG9nIGZkID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJCS5nZXRBY3RpdmVTaGVsbCgpLCBTV1QuT1BFTik7Ci0JCQkJZmQuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi54bWwiLCAiKi4qIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIHBhdGggPSBmZC5vcGVuKCk7Ci0JCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJcGF0aFRleHQuc2V0VGV4dChwYXRoKTsKLQkJCQkJb2sgPSBpc1ZhbGlkUGF0aChwYXRoKTsKLQkJCQl9Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKG9rKTsKLQkJCX0KLQkJfSk7Ci0KLQkJR3JvdXAgb3B0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCW9wdGlvbkdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlvcHRpb25Hcm91cC5zZXRUZXh0KEltcG9ydFhNTFJlc291cmNlcy5vcHRpb25Hcm91cF90ZXh0KTsKLQotCQltZXJnZU9wdGlvbiA9IEltcG9ydFhNTFByZWZlcmVuY2VzLmdldE1lcmdlT3B0aW9uKCk7Ci0JCQkKLQkJQnV0dG9uIG92ZXJ3cml0ZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAsCi0JCQkJSW1wb3J0WE1MUmVzb3VyY2VzLm92ZXJ3cml0ZVJhZGlvQnV0dG9uX3RleHQsIDEsICFtZXJnZU9wdGlvbik7Ci0JCW92ZXJ3cml0ZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW1lcmdlT3B0aW9uID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIG1lcmdlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cCwKLQkJCQlJbXBvcnRYTUxSZXNvdXJjZXMubWVyZ2VSYWRpb0J1dHRvbl90ZXh0LCAxLCBtZXJnZU9wdGlvbik7Ci0JCW1lcmdlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbWVyZ2VPcHRpb24gPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJCi0JCQotCQlHcm91cCBvcHRpb25Hcm91cDEgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbkdyb3VwMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ3JpZERhdGExID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhMS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCW9wdGlvbkdyb3VwMS5zZXRMYXlvdXREYXRhKGdyaWREYXRhMSk7Ci0JCW9wdGlvbkdyb3VwMS5zZXRUZXh0KEltcG9ydFhNTFJlc291cmNlcy5vcHRpb25Hcm91cDFfdGV4dCk7Ci0JCWNoZWNrQmFzZVBsdWdpbnMgPSBJbXBvcnRYTUxQcmVmZXJlbmNlcy5nZXRDaGVja0Jhc2VQbHVnaW5zT3B0aW9uKCk7Ci0JCQkKLQkJQnV0dG9uIGNoZWNrQmFzZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24ob3B0aW9uR3JvdXAxLAotCQkJCUltcG9ydFJlc291cmNlcy5jaGVja0Jhc2VSYWRpb0J1dHRvbl90ZXh0LCAxLCBjaGVja0Jhc2VQbHVnaW5zKTsJCi0JCWNoZWNrQmFzZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNoZWNrQmFzZVBsdWdpbnMgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBpZ25vcmVSZW1vdmVSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwMSwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuaWdub3JlUmVtb3ZlUmFkaW9CdXR0b25fdGV4dCwgMSwgIWNoZWNrQmFzZVBsdWdpbnMpOwotCQlpZ25vcmVSZW1vdmVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljaGVja0Jhc2VQbHVnaW5zID0gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNWYWxpZFBhdGgocGF0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKSkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyIHNwZWNpZmljIHBhdGggaXMgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSB1c2VyIHNwZWNpZmljIHBhdGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB1c2VyIHNwZWNpZmllZCBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUGF0aChTdHJpbmcgcGF0aCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5pc0ZpbGUoKSkgewotCQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBYTUwgZmlsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIFhNTCBmaWxlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBpbXBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVzZXIgc2VsZWN0ZWQgdGhlIG1lcmdlIG9wdGlvbiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgdXNlciBzZWxlY3RlZCB0aGUgb3ZlcndyaXRlIG9wdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1lcmdlT3B0aW9uKCkgewotCQlyZXR1cm4gbWVyZ2VPcHRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKExpYnJhcnlVSVJlc291cmNlcy5ub09wZW5MaWJyYXJ5V2FybmluZ19tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQkKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBjaGVjayBiYXNlIHBsdWdpbiBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBzZWxlY3RlZCB0aGUgY2hlY2sgYmFzZSBwbHVnaW4gb3B0aW9uLAotCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSB1c2VyIHNlbGVjdGVkIHRoZSBpZ25vcmUgY2hlY2sgYmFzZSBwbHVnaW4gb3B0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2hlY2tCYXNlUGx1Z2lucygpIHsKLQkJcmV0dXJuIGNoZWNrQmFzZVBsdWdpbnM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcveG1sL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVlNjIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sL3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3htbC93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIGltcG9ydGluZyBtZXRob2QgbGlicmFyeSBjb250ZW50IHN0b3JlZCBpbiBYTUwuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2VjZDk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIEltcG9ydCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjQ0MTUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuaW1wb3J0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2EwMmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmltcG9ydDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmFudCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ODBjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9BdXRob3JpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFiYWYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvQXV0aG9yaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvSW1wb3J0aW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvSW1wb3J0aW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2Mzk0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL0ltcG9ydGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX2xpYl9jb25mLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZXRvb2wxNi9pbXBfbGliX2NvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMyY2U4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZXRvb2wxNi9pbXBfbGliX2NvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9ldG9vbDE2L2ltcF9tZXRoX3BsdWdpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX21ldGhfcGx1Z2luLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NDQzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2V0b29sMTYvaW1wX21ldGhfcGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vaW1wX2xpYl9jb25mX3dpemJhbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9saWJfY29uZl93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODkxZTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvaWNvbnMvZnVsbC93aXpiYW4vaW1wX2xpYl9jb25mX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9pY29ucy9mdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiZDY2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L2ljb25zL2Z1bGwvd2l6YmFuL2ltcF9tZXRoX3BsdWdpbl93aXpiYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjE5ODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgSW1wb3J0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBJbXBvcnQgV2l6YXJkIENhdGVnb3J5Ci1pbXBvcnRDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgSW1wb3J0IExpYnJhcnkgQ29uZmlndXJhdGlvbiBXaXphcmQKLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkTmFtZT1MaWJyYXJ5IENvbmZpZ3VyYXRpb24KLWltcG9ydExpYnJhcnlDb25maWd1cmF0aW9uV2l6YXJkVGV4dD1JbXBvcnQgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0KLSMgSW1wb3J0IE1ldGhvZCBQbHVnLWlucyBXaXphcmQKLWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lPU1ldGhvZCBQbHVnLWlucwotaW1wb3J0TWV0aG9kUGx1Z2luc1dpemFyZFRleHQ9SW1wb3J0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucy4KLQotCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxNjA2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmltcG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iL2ljb25zL2V0b29sMTYvaW1wX2xpYl9jb25mLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVpbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZE5hbWUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPiAKLSAgICAgICAgICAgICAgICVpbXBvcnRMaWJyYXJ5Q29uZmlndXJhdGlvbldpemFyZFRleHQKLSAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L3dpemFyZD4KLSAgICAgIDx3aXphcmQKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0UGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgaWNvbj0iL2ljb25zL2V0b29sMTYvaW1wX21ldGhfcGx1Z2luLmdpZiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0UGx1Z2luV2l6YXJkIgotICAgICAgICAgICAgbmFtZT0iJWltcG9ydE1ldGhvZFBsdWdpbnNXaXphcmROYW1lIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICVpbXBvcnRNZXRob2RQbHVnaW5zV2l6YXJkVGV4dAotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHMuSW1wb3J0UGx1Z2luV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzIj4KLSAgICAgIDx3aXphcmQgaWQ9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UuY29tbWFuZExpbmVSdW5uZXJzIj4KLSAgICAgIDxjb21tYW5kTGluZVJ1bm5lcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlciIKLSAgICAgICAgICAgIHJ1bm5lcklkPSJjb21tYW5kTGluZVBsdWdpbkltcG9ydGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzYmI4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGUgSW1wb3J0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEltcG9ydFBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBJbXBvcnRQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wb3J0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9JbXBvcnRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNzhkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL0ltcG9ydFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEltcG9ydFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSW1wb3J0UmVzb3VyY2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdTcGVjc1dpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UGx1Z2luc1dpemFyZFBhZ2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX2hhbmRsZVRvb2xWZXJzaW9uX2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNb2RpZnlDaGVja2VyX0NoZWNrb3V0X2ZhaWxlZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fZXhpc3RpbmdfcGx1Z2luczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbXBvcnRQbHVnaW5XaXphcmRfd2Fybl9jaXJjdWxhcl9wbHVnaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ3NUb0ltcG9ydF9sYWJlbDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfdGl0bGUyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub3RfdXNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm9fZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX3ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9yZWFkb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfY29udGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0Vmlld2VyX2luX2ltcG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfaW5fbGliOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNOb1NlbGVjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9jb25maWdTcGVjRGF0YUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2NvbmZpZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm9fcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19kaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fcmVhZG9ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luRGF0YUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpZmZSZXBvcnRWaWV3ZXJfdHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZlcnNpb25NaXNtYXRjaF9vbGRUb29sX3Vua25vd247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3B0aW9uR3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0Jhc2VSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlnbm9yZVJlbW92ZVJhZGlvQnV0dG9uX3RleHQ7Ci0JCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEltcG9ydFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTA4Y2U4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBFMDIwMEUgLSBJVVBFMDI5OUUKLSMKLQotIyBJbXBvcnQgTGlicmFyeSBDb25maWd1cmF0aW9uIFdpemFyZAotaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlPUltcG9ydCBMaWJyYXJ5IENvbmZpZ3VyYXRpb24KLXNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGU9U3BlY2lmeSBpbXBvcnQgZGlyZWN0b3J5Ci1zZWxlY3RDb25maWdEaXJXaXphcmRQYWdlX3RleHQ9U3BlY2lmeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbiB0byBpbXBvcnQuCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90aXRsZT1SZXZpZXcgbGlicmFyeSBjaGFuZ2VzCi1yZXZpZXdDaGFuZ2VzV2l6YXJkUGFnZV90ZXh0PVJldmlldyB0aGUgY2hhbmdlcyB0aGF0IHdpbGwgYmUgbWFkZSB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLXNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90aXRsZT1TZWxlY3QgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucwotc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RleHQ9U2VsZWN0IG9uZSBvciBtb3JlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgdG8gaW1wb3J0LgotCi0jIEltcG9ydCBNZXRob2QgUGx1Zy1pbnMgV2l6YXJkCi1pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlPUltcG9ydCBNZXRob2QgUGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNEaXJXaXphcmRQYWdlX3RpdGxlPVNwZWNpZnkgaW1wb3J0IGRpcmVjdG9yeQotc2VsZWN0UGx1Z2luc0RpcldpemFyZFBhZ2VfdGV4dD1TcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4KLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgcGx1Zy1pbnMKLXNlbGVjdFBsdWdpbnNXaXphcmRQYWdlX3RleHQ9U2VsZWN0IG9uZSBvciBtb3JlIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuIElmIGEgc2VsZWN0ZWQgcGx1Zy1pbiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSwgdmVyaWZ5IHRoZSB2ZXJzaW9uIGRpZmZlcmVuY2VzLgotaW1wb3J0UGx1Z2luc1dpemFyZF9FUlJfSW1wb3J0X3BsdWdpbj1JbXBvcnQgcGx1Zy1pbiBmYWlsZWQKLQotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMD1WYWxpZGF0aW5nIHNlbGVjdGVkIGxpYnJhcnkgY29uZmlndXJhdGlvbi4uLgotQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMT1UaGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgY29uZmlndXJhdGlvbi4KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzM9SW1wb3J0aW5nIG1ldGhvZCBjb25maWd1cmF0aW9uLi4uCi1Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyPUNhbm5vdCBpbXBvcnQgdGhlIGN1cnJlbnRseSBvcGVuZWQgbGlicmFyeSBpbnRvIGl0c2VsZi4KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfTVNHMT1JbXBvcnRpbmcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uLi4KLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfRVJSX0ltcG9ydF9jb25maWd1cmF0aW9uPUltcG9ydCBjb25maWd1cmF0aW9uIGZhaWxlZAotCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU9Q2hlY2tvdXQgZmFpbGVkCi1GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfbXNnPVNvbWUgZmlsZXMgYXJlIG5vdCBjaGVja2VkIG91dCwgZG8geW91IHdhbnQgdG8gdHJ5IGFnYWluPwotCi1JbXBvcnRDb25maWdSZXBvcnRQYWdlX3RpdGxlPUltcG9ydGluZyBDb25maWd1cmF0aW9uIFJlcG9ydAotSW1wb3J0UGx1Z2luV2l6YXJkX3JlYWRvbmx5PUlVUEUwMjAxRTogTGlicmFyeSBpcyByZWFkLW9ubHkuCi1JbXBvcnRQbHVnaW5XaXphcmRfTVNHMT1JbXBvcnRpbmcgbWV0aG9kIHBsdWctaW4uLi4KLUltcG9ydFBsdWdpbldpemFyZF9lcnJvcj1FcnJvcgotSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fZXhpc3RpbmdfcGx1Z2lucz1JVVBFMDIwMEU6IFRoZSBmb2xsb3dpbmcgc2VsZWN0ZWQgcGx1Zy1pbihzKSBhbHJlYWR5IGV4aXN0IGFuZCByZS1pbXBvcnRpbmcgdGhlIHNhbWUgcGx1Zy1pbihzKSB3aWxsIG92ZXJ3cml0ZSB0aGUgZXhpc3Rpbmcgb25lKHMpOlxuXG4gezB9IFxuXG5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci1JbXBvcnRQbHVnaW5XaXphcmRfY29uZmlybV9jb250aW51ZT1cblxuQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fY2lyY3VsYXJfcGx1Z2lucz1DaXJjdWxhciByZWZlcmVuY2VzIGRldGVjdGVkIGFtb25nIHRoZSBmb2xsb3dpbmcgcGx1Zy1pbnMKLQotU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMT1UaGUgZm9sbG93aW5nIGVsZW1lbnRzIHdpbGwgYmUgaW1wb3J0ZWQ6Ci1JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yPUVycm9yCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX01TRzE9QW5hbHl6aW5nCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV90aXRsZTI9U2VsZWN0IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMgdG8gaW1wb3J0Ci1TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQKLVNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoPVRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgotU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vX2Rpcj1ObyBkaXJlY3Rvcnkgc3BlY2lmaWVkCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfcGx1Z2lucz1BdmFpbGFibGUgcGx1Zy1pbnMgaW4gdGhlIGltcG9ydCBkaXJlY3Rvcnk6Ci1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfYXV0aG9yPUF1dGhvcjoKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uPVZlcnNpb246Ci1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYz1CcmllZiBkZXNjcmlwdGlvbjoKLUltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfcmVhZG9ubHk9SVVQRTAyMDFFOiBMaWJyYXJ5IGlzIHJlYWQtb25seS4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMD1WYWxpZGF0aW5nIHNlbGVjdGVkIHBsdWctaW5zLi4uCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzE9VGhlIHNwZWNpZmllZCBwYXRoIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBtZXRob2QgcGx1Zy1pbi4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHMz1JbXBvcnRpbmcgbWV0aG9kIHBsdWctaW4uLi4KLVBsdWdpbkltcG9ydGluZ1NlcnZpY2VfTVNHNT1UaGUgc2VsZWN0ZWQgbWV0aG9kIHBsdWctaW4gY2Fubm90IGJlIGltcG9ydGVkLiBJdHMgZGVwZW5kZW50IHBsdWctaW4gJyd7MH0nJyBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi1QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzY9VGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnLWluIGNhbm5vdCBiZSBpbXBvcnRlZC4gQSBkZXBlbmRlbnQgcGx1Zy1pbiBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi1EaWZmUmVwb3J0Vmlld2VyX2NvbnRlbnQ9Q29udGVudAotRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQ9SW4gSW1wb3J0Ci1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfTVNHMT1BbmFseXppbmcgZmlsZXMuLi4KLURpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llcz1ZZXMKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9lcnJvcj1FcnJvcgotRGlmZlJlcG9ydFZpZXdlcl9pbl9saWI9SW4gTGlicmFyeQotRGlmZlJlcG9ydFZpZXdlcl9zdGF0dXM9U3RhdHVzCi1TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbkV4aXN0cz1TZWxlY3RlZCBwbHVnLWluIGZvdW5kIGluIHRoZSBjdXJyZW50IGxpYnJhcnkKLVNlbGVjdFBsdWdpbnNUb0ltcG9ydF9saWJyYXJ5UGx1Z2luTm90RXhpc3RzPVNlbGVjdGVkIHBsdWctaW4gbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGxpYnJhcnkKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xpYnJhcnlDb25maWdTcGVjRXhpc3RzPUNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uPU5vIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBzZWxlY3RlZC4KLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2NvbmZpZ1NwZWNEYXRhTGFiZWw9U2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeQotU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfbGFiZWxfY29uZmlncz1BdmFpbGFibGUgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyBpbiB0aGUgaW1wb3J0IGRpcmVjdG9yeToKLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQ9bm90X3VzZWQKLVNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2M9QnJpZWYgZGVzY3JpcHRpb246Ci1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX3BhdGg9VGhlIHNwZWNpZmllZCBwYXRoIGRvZXMgbm90IGV4aXN0LgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbk5vU2VsZWN0aW9uPU5vIHBsdWctaW4gc2VsZWN0ZWQuCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX25vX2Rpcj1ObyBkaXJlY3Rvcnkgc3BlY2lmaWVkCi1TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seT1QbHVnLWluIHswfSBpcyByZWFkLW9ubHlcbgotU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9wbHVnaW5fbG9ja2VkPUlVUEUwMjAzRTogUGx1Zy1pbiB7MH0gaXMgbG9ja2VkXG4KLVNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfZXJyb3Jfbm90X3VwZGF0YWJsZT1Tb21lIG9mIHRoZSBwbHVnLWluKHMpIGluIHRoZSBsaWJyYXJ5IGFyZSBlaXRoZXIgbG9ja2VkIG9yIHJlYWQtb25seS5cbiBQbGVhc2UgdW5sb2NrIHRoZSBwbHVnLWlucyBhbmQgbWFrZSBzdXJlIHRoZSBmaWxlcyBhcmUgdXBkYXRhYmxlLgotU2VsZWN0UGx1Z2luc1RvSW1wb3J0X3BsdWdpbkRhdGFMYWJlbD1TZWxlY3RlZCBwbHVnLWluIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5Ci1EaWZmUmVwb3J0Vmlld2VyX3R5cGU9Q29udGVudCBUeXBlCi1TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cz1TZWxlY3RlZCBjb25maWd1cmF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LgotdmVyc2lvbk1pc21hdGNoX29sZERhdGE9SVVQRTAyMDRFOiBUaGUgc3BlY2lmaWVkIGZpbGVzIHdlcmUgZXhwb3J0ZWQgYnkgYSBwcmV2aW91cyB2ZXJzaW9uICh7MH0pIG9mIHsxfS4gVGhlIGZpbGVzIG11c3QgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB7MX0uCi12ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duPUlVUEUwMjA1RTogVGhlIHNwZWNpZmllZCBmaWxlcyB3ZXJlIGV4cG9ydGVkIGJ5IGEgcHJldmlvdXMgdmVyc2lvbiBvZiB7MH0uIFRoZSBmaWxlcyBtdXN0IGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgezB9LgotdmVyc2lvbk1pc21hdGNoX29sZFRvb2w9SVVQRTAyMDZFOiBUaGUgc3BlY2lmaWVkIGZpbGVzIHdlcmUgZXhwb3J0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uICh7MH0pIG9mIHsxfS4gWW91IG11c3QgdXBncmFkZSB7MX0gaW4gb3JkZXIgdG8gaW1wb3J0IHRoZSBmaWxlcy4gIAotdmVyc2lvbk1pc21hdGNoX29sZFRvb2xfdW5rbm93bj1JVVBFMDIwN0U6IFRoZSBzcGVjaWZpZWQgZmlsZXMgY2Fubm90IGJlIG9wZW5lZC4gWW91IG11c3QgdXBncmFkZSB7MH0gaW4gb3JkZXIgdG8gaW1wb3J0IHRoZSBmaWxlcy4KLUNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX2hhbmRsZVRvb2xWZXJzaW9uX2Vycm9yPUlVUEUwMjA4RTogRmFpbGVkIHRvIHVwZ3JhZGUgdGhlIHBsdWctaW4ocykuCi1vcHRpb25Hcm91cF90ZXh0PUltcG9ydCBvcHRpb24KLWNoZWNrQmFzZVJhZGlvQnV0dG9uX3RleHQ9Q2hlY2sgYmFzZSBwbHVnLWlucwotaWdub3JlUmVtb3ZlUmFkaW9CdXR0b25fdGV4dD1JZ25vcmUgYW5kIHJlbW92ZSB1bnJlc29sdmVkIHJlZmVyZW5jZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YjkwMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgYWN0aXZhdG9yIGZvciBtYW5hZ2luZyB0aGUgSW1wb3J0IHBsdWctaW4ncyBsaWZlIGN5Y2xlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29tbWFuZExpbmVQbHVnaW5JbXBvcnRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db21tYW5kTGluZVBsdWdpbkltcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YmJjODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db21tYW5kTGluZVBsdWdpbkltcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzLkNvbW1hbmRMaW5lUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gZm9yIGltcG9ydGluZyBwbHVnaW4gZHJpdmVuIGJ5IGNvbW1hbmQgbGluZQotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRMaW5lUGx1Z2luSW1wb3J0ZXIgZXh0ZW5kcyBDb21tYW5kTGluZVJ1bm5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSW1wb3J0UGx1Z2luc1RhZyA9ICJJbXBvcnRQbHVnaW5zIjsgCS8vJE5PTi1OTFMtMSQiCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBTZWxlY3RlZFBsdWdpblRhZyA9ICJTZWxlY3RlZFBsdWdpbiI7IC8vJE5PTi1OTFMtMSQiCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJhc2VMaWJyYXJ5Rm9sZGVyVXJpQXR0PSAiYmFzZUxpYnJhcnlGb2xkZXJVcmkiOwkJLy8kTk9OLU5MUy0xJCIKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSW1wb3J0TGlicmFyeUZvbGRlclVyaUF0dD0gImltcG9ydExpYnJhcnlGb2xkZXJVcmkiOwkJLy8kTk9OLU5MUy0xJCIKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTmFtZUF0dD0gIm5hbWUiOwkJLy8kTk9OLU5MUy0xJCIKLQotCXByaXZhdGUgU3RyaW5nIGJhc2VMaWJQYXRoOwotCXByaXZhdGUgU3RyaW5nIGltcG9ydExpYlBhdGg7Ci0JCi0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBzZWxlY3RlZFBsdWdpbnM7Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmICghIHN1cGVyLmV4ZWN1dGUoYXJncykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0cnkgewotCQkJbG9hZElucHV0RmlsZSgpOwotCQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQkJcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoIk9wZW5uaW5nIGJhc2UgbGlicmFyeSBhbmQgcHJlcGFyaW5nIGltcG9ydCAuLi4iKTsvLyROT04tTkxTLTEkIgotCQkJCQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnkoYmFzZUxpYlBhdGgpOwotCi0JCQkJCQlGaWxlIGltcG9ydExpYkZvbGRlciA9IG5ldyBGaWxlKGltcG9ydExpYlBhdGgpOwotCi0JCQkJCQlQbHVnaW5JbXBvcnREYXRhIGRhdGEgPSBuZXcgUGx1Z2luSW1wb3J0RGF0YSgpOwotCQkJCQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShpbXBvcnRMaWJGb2xkZXIuZ2V0TmFtZSgpKTsKLQkJCQkJCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihpbXBvcnRMaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJZmluYWwgUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlID0gbmV3IFBsdWdpbkltcG9ydGluZ1NlcnZpY2UoZGF0YSk7Ci0JCQkJCQlzZXJ2aWNlLnZhbGlkYXRlKG51bGwpOwotCQkJCQkJCi0JCQkJCQlMaXN0IGltcG9ydFBsdWdpbnMgPSBkYXRhLmdldFBsdWdpbnMoKTsKLQkJCQkJCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlQbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW5mbykgaW1wb3J0UGx1Z2lucy5nZXQoaSk7Ci0JCQkJCQkJaW5mby5zZWxlY3RlZCA9IHNlbGVjdGVkUGx1Z2lucy5pc0VtcHR5KCkgfHwgc2VsZWN0ZWRQbHVnaW5zLmNvbnRhaW5zKGluZm8ubmFtZSk7CQkJCQkJCQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlzZXJ2aWNlLnBlcmZvcm1JbXBvcnQobW9uaXRvcik7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJCi0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgcG1EaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJcG1EaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZElucHV0RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChnZXRJbnB1dEZpbGUoKSk7CQotCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKCEgcm9vdC5nZXRUYWdOYW1lKCkuZXF1YWxzKEltcG9ydFBsdWdpbnNUYWcpKSB7Ci0JCQlTdHJpbmcgbXNnID0gIlRoZSByb290IGVsZW1lbnQgbXVzdCBiZTogICIgKyBJbXBvcnRQbHVnaW5zVGFnOyAgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKLQkJfQotCQliYXNlTGliUGF0aCA9IHJvb3QuZ2V0QXR0cmlidXRlKEJhc2VMaWJyYXJ5Rm9sZGVyVXJpQXR0KTsKLQkJaW1wb3J0TGliUGF0aCA9IHJvb3QuZ2V0QXR0cmlidXRlKEltcG9ydExpYnJhcnlGb2xkZXJVcmlBdHQpOwotCQlzZWxlY3RlZFBsdWdpbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQotCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc3ogPSBub2RlcyA9PSBudWxsID8gMCA6IG5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJTm9kZSBub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJCWlmIChlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHMoU2VsZWN0ZWRQbHVnaW5UYWcpKSB7Ci0JCQkJCVN0cmluZyBuYW1lICA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKE5hbWVBdHQpOwkJCQkJCi0JCQkJCXNlbGVjdGVkUGx1Z2lucy5hZGQobmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk2OTcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlnU3BlY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQuc2VydmljZXMuQ29uZmlndXJhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0KLS8qKgotICogTW9kZWxzIGEgbGlzdCBvZiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdTcGVjcyB7Ci0KLQkvLyBBIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBlbnRyaWVzLgotCXB1YmxpYyBMaXN0IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWdTcGVjcygpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGVudHJ5LgotCSAqLwotCXB1YmxpYyBFbnRyeSBuZXdFbnRyeSgpIHsKLQkJRW50cnkgZSA9IG5ldyBFbnRyeSgpOwotCQljb25maWdzLmFkZChlKTsKLQotCQlyZXR1cm4gZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaXRlcmF0b3IgZm9yIHRoZSBjb25maWcgc3BlY3MuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gY29uZmlncy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBFbnRyeSB7Ci0KLQkJcHVibGljIENvbmZpZ3VyYXRpb25TcGVjIGNvbmZpZ1NwZWMgPSBudWxsOwotCi0JCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGV4aXN0aW5nQ29uZmlnID0gbnVsbDsKLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWlmIChjb25maWdTcGVjICE9IG51bGwpCi0JCQkJaWYgKGNvbmZpZ1NwZWMubmFtZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gY29uZmlnU3BlYy5uYW1lOwotCQkJcmV0dXJuICJ1bmtub3duIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWdTcGVjc0ltcG9ydE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwNjliMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkxpYnJhcnlEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgaW1wb3J0IG9mIGxpYnJhcnkgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCUNvbmZpZ1NwZWNzSW1wb3J0TWFuYWdlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25maWcgc3BlY3MgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBDb25maWdTcGVjcyBnZXRDb25maWdTcGVjcyhmaW5hbCBMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZmluYWwgQ29uZmlnU3BlY3MgY29uZmlnU3BlY3MgPSBuZXcgQ29uZmlnU3BlY3MoKTsKLQotCQkvLyBSZW1vdmUgdGhlIHVubmVlZGVkIGNvbmZpZ3VyYXRpb25zLgotCQlGaWxlIGNvbmZpZ0RpciA9IG5ldyBGaWxlKGRvY3VtZW50LmdldEZpbGUoKS5nZXRQYXJlbnQoKSwgTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUpOwkJCQotCQlMaWJyYXJ5RG9jdW1lbnQuQ29uZmlnRG9jVmlzaXRvciB2aXNpdG9yID0gbmV3IExpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yKCkgewotCQkJcHVibGljIHZvaWQgdmlzaXQoRmlsZSBmaWxlLCBFbGVtZW50IG5vZGUpIHsKLQkJCQlDb25maWdTcGVjcy5FbnRyeSBlbnRyeSA9IGNvbmZpZ1NwZWNzLm5ld0VudHJ5KCk7Ci0JCQkJZW50cnkuY29uZmlnU3BlYyA9IGRvY3VtZW50LmdldENvbmZpZ3VyYXRpb25TcGVjKG5vZGUpOwotCQkJCWVudHJ5LmV4aXN0aW5nQ29uZmlnID0gZ2V0RXhpc3RpbmdDb25maWcoZW50cnkuY29uZmlnU3BlYy5ndWlkKTsKLQkJCX0KLQkJfTsJCQkKLQkJTGlicmFyeURvY3VtZW50LnZpc2l0Q29uZmlnRmlsZXMoY29uZmlnRGlyLCB2aXNpdG9yKTsJCQkKLQkJcmV0dXJuIGNvbmZpZ1NwZWNzOwotCX0KLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRFeGlzdGluZ0NvbmZpZyhTdHJpbmcgZ3VpZCkgewotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWlmIChjb25maWdzID09IG51bGwgfHwgY29uZmlncy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpXTsKLQkJCWlmIChjb25maWcuZ2V0R3VpZCgpLmVxdWFscyhndWlkKSkgewotCQkJCXJldHVybiBjb25maWc7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbXBvcnRzIHRoZSBzZWxlY3RlZCBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbnMuCi0JICogCi0JICogQHBhcmFtIHNwZWNzCi0JICogICAgICAgICAgICBBIGxpYnJhcnkgY29uZmlndXJhdGlvbiBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgZG9JbXBvcnQoQ29uZmlnU3BlY3Mgc3BlY3MpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJTGlicmFyeVV0aWwubG9hZEFsbChsaWIpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3BlY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUNvbmZpZ1NwZWNzLkVudHJ5IGVudHJ5ID0gKENvbmZpZ1NwZWNzLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGVudHJ5LnNlbGVjdGVkKSB7Ci0JCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gY3JlYXRlQ29uZmlnKGVudHJ5LmNvbmZpZ1NwZWMpOwotCi0JCQkJCWlmIChlbnRyeS5leGlzdGluZ0NvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCQkvLyBNZXJnZSB0aGUgbmV3IHBsdWctaW5zIGFuZCBwYWNrYWdlcyBpbnRvIHRoZSBleGlzdGluZwotCQkJCQkJLy8gb25lLAotCQkJCQkJLy8gYW55dGhpbmcgaW4gdGhlIGN1cnJlbnQgY29uZmlndWF0aW9uIHNob3VsZCBiZSBrZXB0LgotCQkJCQkJLy8gRWNvcmVVdGlsLnJlcGxhY2UoZW50cnkuZXhpc3RpbmdDb25maWcsIGNvbmZpZyk7Ci0JCQkJCQlMaXN0IHBsdWdpbnMgPSBlbnRyeS5leGlzdGluZ0NvbmZpZwotCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQkJCQlMaXN0IHBrZ3MgPSBlbnRyeS5leGlzdGluZ0NvbmZpZwotCQkJCQkJCQkuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCQkJTGlzdCB2aWV3cyA9IGVudHJ5LmV4aXN0aW5nQ29uZmlnLmdldFByb2Nlc3NWaWV3cygpOwotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZSA9IGl0cC5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFwbHVnaW5zLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCXBsdWdpbnMuYWRkKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJZm9yIChJdGVyYXRvciBpdHAgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlID0gaXRwLm5leHQoKTsKLQkJCQkJCQlpZiAoIXBrZ3MuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJcGtncy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IGNvbmZpZy5nZXRQcm9jZXNzVmlld3MoKS5pdGVyYXRvcigpOyBpdHAKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZSA9IGl0cC5uZXh0KCk7Ci0JCQkJCQkJaWYgKCFwa2dzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQkJCXZpZXdzLmFkZChlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBBZGQgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQkJCQlsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuYWRkKGNvbmZpZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGxpYiwgZmFsc2UsIGZhbHNlKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZUNvbmZpZyhDb25maWd1cmF0aW9uU3BlYyBzcGVjKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JCS8vIFNldCB0aGUgYXR0cmlidXRlcy4KLQkJY29uZmlnLnNldE5hbWUoc3BlYy5uYW1lKTsKLQkJY29uZmlnLnNldEJyaWVmRGVzY3JpcHRpb24oc3BlYy5icmllZl9kZXNjKTsKLQkJY29uZmlnLnNldEd1aWQoc3BlYy5ndWlkKTsKLQotCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCUxpc3Qgdmlld3MgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3BlYy5wbHVnaW5JZHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBndWlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCU9iamVjdCBlbGVtZW50ID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgIXBsdWdpbnMuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJcGx1Z2lucy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc3BlYy5wYWNrYWdlSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgZWxlbWVudCA9IG1hbmFnZXIuZ2V0TWV0aG9kRWxlbWVudChndWlkKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmICFwa2dzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCXBrZ3MuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHNwZWMudmlld0lkcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAhdmlld3MuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJdmlld3MuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb25maWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnREYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NGNlNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uSW1wb3J0RGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgdGhlIGlucHV0IGRhdGEgcmVxdWlyZWQgdG8gaW1wb3J0IGEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgewotCi0JcHVibGljIExpYnJhcnlMb2NhdGlvbkRhdGEgbGxEYXRhID0gbmV3IExpYnJhcnlMb2NhdGlvbkRhdGEoKTsKLQotCXByaXZhdGUgRXJyb3JJbmZvIGVycm9yID0gbmV3IEVycm9ySW5mbygpOwotCi0JLy8gSWYgc3BlY3MgIT0gbnVsbCwgaXQncyBhIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBvbmx5LgotCXB1YmxpYyBDb25maWdTcGVjcyBzcGVjcyA9IG51bGw7Ci0KLQlwdWJsaWMgTGlzdCBpbXBvcnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gSW5kaWNhdGUgaWYgeW91IHdhbnQgdG8gcmVwbGFjZSBleGlzdGluZyBtZXRob2QgcGFja2FnZXMuCi0JcHVibGljIGJvb2xlYW4gcmVwbGFjZUV4aXN0aW5nID0gdHJ1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgaWYgYW55LgotCSAqLwotCXB1YmxpYyBFcnJvckluZm8gZ2V0RXJyb3JJbmZvKCkgewotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcHVibGljIGNsYXNzIEVycm9ySW5mbyB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXJyb3JNZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCXB1YmxpYyBFcnJvckluZm8oKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQkJZXJyb3JNZXNzYWdlLmFwcGVuZChtZXNzYWdlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3IoKSB7Ci0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWVycm9yTWVzc2FnZS5zZXRMZW5ndGgoMCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxYTVhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0NvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkxpYnJhcnlEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLkNvbnZlcnRHdWlkYW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudXRpbC5UeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIEltcG9ydHMgYSBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCQotCXByaXZhdGUgVXBncmFkZUNhbGxlckluZm8gdXBHcmFkZUluZm87Ci0JCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCi0JTGlicmFyeURvY3VtZW50IGltcG9ydGluZ0xpYkRvYyA9IG51bGw7Ci0KLQlMaWJyYXJ5RGlmZk1hbmFnZXIgZGlmZk1nciA9IG51bGw7Ci0KLQlDb25maWdTcGVjc0ltcG9ydE1hbmFnZXIgc3BlY3NNZ3IgPSBudWxsOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlKENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBBbmFseXplcyB0aGUgaW1wb3J0ZWQgbGlicmFyeSB3aXRoIHJlc3BlY3QgdG8gdGhlIGJhc2UgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhbmFseXplKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCW1vbml0b3Iuc2V0VGFza05hbWUoSW1wb3J0UmVzb3VyY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlX01TRzApOwotCQkJfQotCi0JCQlkYXRhLmdldEVycm9ySW5mbygpLmNsZWFyKCk7Ci0KLQkJCS8vIFByZXBhcmUgdGhlIGxpYnJhcnkgZmlsZXMuCi0JCQlTdHJpbmcgcGF0aCA9IGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpOwotCQkJaWYgKHBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvciArIExpYnJhcnlEb2N1bWVudC5saWJyYXJ5RmlsZSkgPCAwKSB7Ci0JCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIExpYnJhcnlEb2N1bWVudC5saWJyYXJ5RmlsZTsKLQkJCX0KLQkJCUZpbGUgaW1wb3J0aW5nTGliUGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJCi0JCQlib29sZWFuIGlzTGlicmFyeUZpbGUgPSB0cnVlOwotCQkJaWYgKCFpbXBvcnRpbmdMaWJQYXRoLmV4aXN0cygpKSB7Ci0JCQkJaW1wb3J0aW5nTGliUGF0aCA9IG5ldyBGaWxlKGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50RmlsZSgpLAotCQkJCQkJTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpOwotCQkJCWlzTGlicmFyeUZpbGUgPSBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKCFpbXBvcnRpbmdMaWJQYXRoLmV4aXN0cygpKSB7Ci0JCQkJZGF0YQotCQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCQkuYWRkRXJyb3IoCi0JCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cxLCBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpKSk7IAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJYm9vbGVhbiBoYW5kbGVWZXJzaW9uID0gaXNMaWJyYXJ5RmlsZTsKLQkJCWlmIChoYW5kbGVWZXJzaW9uKSB7Ci0JCQkJdXBHcmFkZUluZm8gPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UuVXBncmFkZUluZm8oVXBncmFkZUNhbGxlckluZm8udXBncmFkZUltcG9ydENvbmZpZywgaW1wb3J0aW5nTGliUGF0aCk7Ci0JCQkJaWYgKCEgaGFuZGxlVG9vbFZlcnNpb24oaW1wb3J0aW5nTGliUGF0aCwgdXBHcmFkZUluZm8pKSB7Ci0JCQkJCWRhdGEKLQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCS5hZGRFcnJvcigKLQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9FUlJfSW1wb3J0X2NvbmZpZ3VyYXRpb24sIGltcG9ydGluZ0xpYlBhdGguZ2V0UGFyZW50KCkpKTsgCi0KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodXBHcmFkZUluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJaW1wb3J0aW5nTGliUGF0aCA9IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJCQkKLQkJCWltcG9ydGluZ0xpYkRvYyA9IG5ldyBMaWJyYXJ5RG9jdW1lbnQoaW1wb3J0aW5nTGliUGF0aCk7Ci0JCQkKLQkJCWlmICghIGhhbmRsZVZlcnNpb24pIHsKLQkJCQlTdHJpbmcgdmVyc2lvbkVycm9yID0gdmVyc2lvbkNoZWNrKGltcG9ydGluZ0xpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIAotCQkJCQkJCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGUpOwotCQkJCWlmICh2ZXJzaW9uRXJyb3IgIT0gbnVsbCkgewotCQkJCQlkYXRhLmdldEVycm9ySW5mbygpLmFkZEVycm9yKHZlcnNpb25FcnJvcik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJvb2xlYW4gaXNDb25maWdTcGVjcyA9IGltcG9ydGluZ0xpYkRvYy5pc0NvbmZpZ1NwZWNzT25seSgpOwotCi0JCQlpZiAoaXNDb25maWdTcGVjcykgewotCi0JCQkJc3BlY3NNZ3IgPSBuZXcgQ29uZmlnU3BlY3NJbXBvcnRNYW5hZ2VyKCk7Ci0KLQkJCQkvLyBTY2FuIHRoZSBsaWJyYXJ5IGZpbGUgZm9yIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCi0JCQkJZGF0YS5zcGVjcyA9IHNwZWNzTWdyLmdldENvbmZpZ1NwZWNzKGltcG9ydGluZ0xpYkRvYyk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFpc0xpYnJhcnlGaWxlKSB7Ci0JCQkJCWRhdGEKLQkJCQkJLmdldEVycm9ySW5mbygpCi0JCQkJCS5hZGRFcnJvcigKLQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2VfTVNHMSwgaW1wb3J0aW5nTGliUGF0aC5nZXRQYXJlbnQoKSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlkYXRhLnNwZWNzID0gbnVsbDsKLQotCQkJCS8vIE9wZW4gdGhlIGxpYnJhcnkgYW5kIGNvbXBhcmUgdGhlIGRpZmZlcmVuY2UuCi0JCQkJCi0JCQkJLy8gbmVlZCB0byBvcGVuIGFuZCBjbG9zZSB0aGUgbGlicmFyeSB0byBoYXZlIHRoZSBwcm9qZWN0IHJlc291cmNlcyBpbml0aWFsaXplZCBwcm9wZXJseQotCQkJCVN0cmluZyBsaWJEaXIgPSBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9ICJDb25maWd1cmF0aW9uIEltcG9ydCBQcm9qZWN0ICgiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgSW50ZWdlci50b0hleFN0cmluZyhsaWJEaXIuaGFzaENvZGUoKSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJEaXIsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJCQl0cnkgewotCQkJCQlNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHkgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCS5sb2FkTGlicmFyeShpbXBvcnRpbmdMaWJQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJCi0JCQkJCWhhbmRsZVR5cGVDaGFuZ2VzKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJCi0JCQkJCVN0cmluZyBiYXNlTGliRGlyID0gbnVsbDsKLQkJCQkJdHJ5IHsJLy9Ob3QgbmVjY2Vzc2FyeSwgYnV0IHByZXZlbnQgaW50cm9kdWNpbmcgYW55IHBvdGVudGlhbCByZWdyZXNzaW9uIGR1ZSB0byB0aGlzIGNoYW5nZQotCQkJCQkJRmlsZSBiRmlsZSA9IG5ldyBGaWxlKGJhc2VMaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7OwotCQkJCQkJYmFzZUxpYkRpciA9IGJGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewkJCQkJCQotCQkJCQl9Ci0JCQkJCWlmIChsaWJEaXIuZXF1YWxzSWdub3JlQ2FzZShiYXNlTGliRGlyKSkgewotCQkJCQkJZGF0YQotCQkJCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0cyLCBpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpKSk7IAotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJCi0JCQkJCWRpZmZNZ3IgPSBuZXcgTGlicmFyeURpZmZNYW5hZ2VyKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQkJCQkJZGlmZk1nci5idWlsZERpZmZUcmVlKCk7Ci0JCQkJCQotCQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQkJZGlmZk1nci5yb290RGlmZlRyZWUuZGVidWdEdW1wKCk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJTWV0aG9kTGlicmFyeVByb2plY3QuY2xvc2VQcm9qZWN0KGxpYkRpciwgbW9uaXRvcik7Ci0JCQkJTWV0aG9kTGlicmFyeVByb2plY3QuZGVsZXRlUHJvamVjdChsaWJEaXIsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgZGF0YS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZ2V0SW1wb3J0RGF0YSgpIHsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBzcGVjIG9ubHkgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3BlY3NPbmx5KCkgewotCQlyZXR1cm4gKGRhdGEuc3BlY3MgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZiB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgZ2V0RGlmZlRyZWUoKSB7Ci0JCXJldHVybiBkaWZmTWdyLmdldERpZmZUcmVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IGxpYnJhcnkuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0SW1wb3J0aW5nTGlicmFyeSgpIHsKLQkJcmV0dXJuIGRpZmZNZ3IuZ2V0SW1wb3J0aW5nTGlicmFyeSgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBpbXBvcnQuCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUltcG9ydChmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCS8vIG5lZWQgdG8gZGlzYWJsZSB0aGUgd29ya3NwYWNlIHJlZnJlc2hpbmcKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQlpZihyZWZyZXNoKSB7Ci0JCQkvLyBkaXNhYmxlIHJlc291cmNlIHJlZnJlc2hpbmcgZHVyaW5nIGltcG9ydAotCQkJLy8KLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZV9NU0czKTsKLQkJCX0KLQotCQkJaWYgKGlzU3BlY3NPbmx5KCkpIHsKLQkJCQlzcGVjc01nci5kb0ltcG9ydChkYXRhLnNwZWNzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJTGlicmFyeUltcG9ydE1hbmFnZXIgaW1wb3J0aW5nTWdyID0gbmV3IExpYnJhcnlJbXBvcnRNYW5hZ2VyKGRpZmZNZ3IsIGRhdGEuaW1wb3J0TGlzdCk7CQkJCi0JCQkJaW1wb3J0aW5nTWdyLmRvTWVyZ2UoZGF0YS5yZXBsYWNlRXhpc3RpbmcsIG1vbml0b3IpOwotCQkJfQotCQkJCi0JCQkvLyByZWZyZXNoIGxpYnJhcnkgZmlsZXMgaW4gd29ya3NwYWNlCi0JCQkvLwotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nIAotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQlpZiAodXBHcmFkZUluZm8gIT0gbnVsbCkgewotCQkJCXVwR3JhZGVJbmZvLnJlbW92ZUNvcGllZExpYnJhcnkoKTsKLQkJCQl1cEdyYWRlSW5mbyA9IG51bGw7Ci0JCQl9Ci0JCX0JCi0JCQotCQl0cnkgewotCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwkJCi0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHRoZSB0b29sIHZlcnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbkNoZWNrKGZpbmFsIFN0cmluZyB4bWxQYXRoLCBmaW5hbCBTdHJpbmcgdGl0bGUpIHsKLQkJZmluYWwgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1sxXTsKLQkJcmV0WzBdID0gbnVsbDsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewkKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsJCQkJCi0JCQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwuY2hlY2tMaWJyYXJ5VmVyc2lvbihuZXcgRmlsZSh4bWxQYXRoKSk7Ci0JCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGFfdW5rbm93biwgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQlQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7CQkJCQkKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoaW5mby5yZXN1bHQgPCAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZERhdGEsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uLCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkRGF0YV91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoaW5mby5yZXN1bHQgPiAwKSB7Ci0JCQkJCQlpZiAoaW5mby50b29sSUQuZXF1YWxzKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSkpIHsKLQkJCQkJCQlyZXRbMF0gPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMudmVyc2lvbk1pc21hdGNoX29sZFRvb2wsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQlpbmZvLnRvb2xWZXJzaW9uLCBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpfSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldFswXSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy52ZXJzaW9uTWlzbWF0Y2hfb2xkVG9vbF91bmtub3duLCBuZXcgT2JqZWN0W10gewotCQkJCQkJCQkJUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKX0pOwotCQkJCQkJfQotCQkJCQl9IAotCQkJCX0KLQkJCQlpZiAocmV0WzBdICE9IG51bGwpIHsKLQkJCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IodGl0bGUsIHJldFswXSk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkJCi0JCXJldHVybiByZXRbMF07Ci0JfQotCQotCS8qKgotCSAqIEZpeGVzIHRoZSBpbXBvcnRlZCBsaWJyYXJ5J3Mgc3lzdGVtIHBhY2thZ2UgZ3VpZHMgd2l0aCB0aG9zZSBiYXNlJ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpeEltcG9ydExpYnJhcnlTeXN0ZW1QYWNrYWdlR1VJRHMoTWV0aG9kTGlicmFyeSBiYXNlTGlicmFyeSwgTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5KSB7Ci0JCUhhc2hNYXAgcGx1Z2luc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGJhc2VMaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpOwotCQkJcGx1Z2luc01hcC5wdXQocGx1Z2luLmdldEd1aWQoKSwgcGx1Z2luKTsKLQkJfQotCQlpZiAocGx1Z2luc01hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBpbXBvcnRQbHVnaW5zVG9GaXggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW1wb3J0UGx1Z2lucyA9IGltcG9ydExpYnJhdHkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKGludCBpPTA7IGkgPCBpbXBvcnRQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaW1wb3J0UGx1Z2lucy5nZXQoaSk7Ci0JCQlpZiAocGx1Z2luc01hcC5jb250YWluc0tleShwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCWltcG9ydFBsdWdpbnNUb0ZpeC5hZGQocGx1Z2luKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChpbnQgaT0wOyBpIDwgaW1wb3J0UGx1Z2luc1RvRml4LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gaW1wb3J0UGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaW1wb3J0UGx1Z2luc1RvRml4LmdldChpKTsKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgcGx1Z2luc01hcC5nZXQoaW1wb3J0UGx1Z2luLmdldEd1aWQoKSk7Ci0JCQlpZiAoYmFzZVBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlMaXN0IGltcG9ydFBhY2thZ2VzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhpbXBvcnRQbHVnaW4pOwotCQkJSGFzaE1hcCBpbXBvcnRQYWNrYWdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGo9MDsgaiA8IGltcG9ydFBhY2thZ2VzLnNpemUoKTsgaisrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBpbXBvcnRQYWNrYWdlID0gKE1ldGhvZEVsZW1lbnQpIGltcG9ydFBhY2thZ2VzLmdldChqKTsKLQkJCQlpbXBvcnRQYWNrYWdlTWFwLnB1dChpbXBvcnRQYWNrYWdlLmdldE5hbWUoKSwgaW1wb3J0UGFja2FnZSk7Ci0JCQl9Ci0JCQkKLQkJCUxpc3QgYmFzZVBhY2thZ2VzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhiYXNlUGx1Z2luKTsJCQkKLQkJCWZvciAoaW50IGo9MDsgaiA8IGJhc2VQYWNrYWdlcy5zaXplKCk7IGorKykgewotCQkJCU1ldGhvZEVsZW1lbnQgYmFzZVBhY2thZ2UgPSAoTWV0aG9kRWxlbWVudCkgYmFzZVBhY2thZ2VzLmdldChqKTsKLQkJCQlNZXRob2RFbGVtZW50IGltcG9ydFBhY2thZ2UgPSAoTWV0aG9kRWxlbWVudCkgaW1wb3J0UGFja2FnZU1hcC5nZXQoYmFzZVBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoaW1wb3J0UGFja2FnZSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmcgZ3VpZCA9IGJhc2VQYWNrYWdlLmdldEd1aWQoKTsKLQkJCQlpZiAoISBpbXBvcnRQYWNrYWdlLmdldEd1aWQoKS5lcXVhbHMoZ3VpZCkpIHsKLQkJCQkJaW1wb3J0UGFja2FnZS5zZXRHdWlkKGd1aWQpOwotCQkJCX0KLQkJCX0KLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlVHlwZUNoYW5nZXMoTWV0aG9kTGlicmFyeSBiYXNlTGliLCBNZXRob2RMaWJyYXJ5IGltcG9ydExpYikgewotCQlIYXNoTWFwIGJhc2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoYmFzZUxpYiwgYmFzZU1hcCk7Ci0JCUhhc2hNYXAgaW1wb3J0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJY29sbGVjdFBvdGVudGlhbFR5cGVDaGFuZ2VkKGltcG9ydExpYiwgaW1wb3J0TWFwKTsKLQkJaGFuZGxlVHlwZUNoYW5nZXMoYmFzZU1hcCwgaW1wb3J0TWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIE1ldGhvZEVsZW1lbnQgdHlwZSBjaGFuZ2VzLiBOb3RlOiBmb3IgTWV0aG9kRWxlbWVudCBvYmplY3RzIGluIGltcG9ydE1hcAotCSAqIG9ubHkgZUNsYXNzIHR5cGUgaXMgdXNlZCBpbiB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlVHlwZUNoYW5nZXMoSGFzaE1hcCBiYXNlTWFwLCBIYXNoTWFwIGltcG9ydE1hcCkgewotCQlBcnJheUxpc3QgdG9DaGFuZ2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW1wb3J0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IGd1aWQgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCU1ldGhvZEVsZW1lbnQgYmFzZUVsZW0gPSAoTWV0aG9kRWxlbWVudCkgYmFzZU1hcC5nZXQoZ3VpZCk7Ci0JCQlpZiAoYmFzZUVsZW0gIT0gbnVsbCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmICghIGVsZW0uZUNsYXNzKCkuZXF1YWxzKGJhc2VFbGVtLmVDbGFzcygpKSkgewotCQkJCQlNZXRob2RFbGVtZW50IGVsZW1QYWlyW10gPSBuZXcgTWV0aG9kRWxlbWVudFtdIHtiYXNlRWxlbSwgZWxlbX07Ci0JCQkJCXRvQ2hhbmdlTGlzdC5hZGQoZWxlbVBhaXIpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8dG9DaGFuZ2VMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1QYWlyW10gPSAoTWV0aG9kRWxlbWVudFtdKSB0b0NoYW5nZUxpc3QuZ2V0KGkpOwotCQkJZmluYWwgTWV0aG9kRWxlbWVudCBiYXNlRWxlbSA9IGVsZW1QYWlyWzBdOwotCQkJZmluYWwgTWV0aG9kRWxlbWVudCBpbXBvcnRFbGVtID0gZWxlbVBhaXJbMV07Ci0JCQlpZiAoYmFzZUVsZW0gaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJQ29udmVydEd1aWRhbmNlVHlwZS5jb252ZXJ0R3VpZGFuY2UoKEd1aWRhbmNlKSBiYXNlRWxlbSwgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCBudWxsLCBpbXBvcnRFbGVtLmVDbGFzcygpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfSBlbHNlIGlmIChiYXNlRWxlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJVHlwZUNvbnZlcnRlci5jb252ZXJ0QWN0aXZpdHkoKEFjdGl2aXR5KSBiYXNlRWxlbSwgaW1wb3J0RWxlbS5lQ2xhc3MoKSk7IAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgZWxlbWVudHMgaW4gbGliIHRoYXQgbWF5IGhhdmUgdHlwZSBjaGFuZ2VzIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0UG90ZW50aWFsVHlwZUNoYW5nZWQoTWV0aG9kTGlicmFyeSBsaWIsIEhhc2hNYXAgbWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UgfHwKLQkJCQlvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJbWFwLnB1dChlbGVtLmdldEd1aWQoKSwgZWxlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhbmRsZVRvb2xWZXJzaW9uKEZpbGUgbGliRmlsZSwgZmluYWwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgewotCQlmaW5hbCBTdHJpbmcgbGliRm9sZGVyUGF0aCA9IGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlmaW5hbCBib29sZWFuIHJldFtdID0gbmV3IGJvb2xlYW5bMV07Ci0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsJCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmV0WzBdID0gT3BlbkxpYnJhcnlXaXphcmQuaGFuZGxlVG9vbFZlcnNpb24obGliRm9sZGVyUGF0aCwgaW5mbyk7Ci0JCQl9Ci0JCX0pOwkJCQkJCQkJCi0JCXJldHVybiByZXRbMF07Ci0JfQkKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVXBncmFkZUluZm8gZXh0ZW5kcyBVcGdyYWRlQ2FsbGVySW5mbyB7Ci0JCQotCQlwdWJsaWMgVXBncmFkZUluZm8oaW50IGNhbGxlclR5cGUsIEZpbGUgbGliRmlsZSkgewotCQkJc3VwZXIoY2FsbGVyVHlwZSwgbGliRmlsZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGNvcHlMaWJyYXJ5KCkgewotCQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGRlc0xpYkZvbGRlclBhdGggPSB1c2VySG9tZSArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJFeHBvcnQiICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKSArIEZpbGUuc2VwYXJhdG9yOwkJCi0JCQlGaWxlIGRlc0xpYkZvbGRlciA9IG5ldyBGaWxlKGRlc0xpYkZvbGRlclBhdGgpOwotCQkJaWYgKCFkZXNMaWJGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlkZXNMaWJGb2xkZXIubWtkaXJzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGRlc0xpYkZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCQkKLQkJCVBsdWdpbkV4cG9ydFNlcnZpY2UuY29weURpcihnZXRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLCBkZXNMaWJGb2xkZXIpOwotCQkJc2V0Q29waWVkTGliRmlsZShuZXcgRmlsZShkZXNMaWJGb2xkZXJQYXRoICsgZ2V0TGliRmlsZSgpLmdldE5hbWUoKSkpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb3BpZWRMaWJyYXJ5KCkgewotCQkJaWYgKGdldENvcGllZExpYkZpbGUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMoZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlnZXRDb3BpZWRMaWJGaWxlKCkuZ2V0UGFyZW50RmlsZSgpLmRlbGV0ZSgpOwotCQkJc2V0Q29waWVkTGliRmlsZShudWxsKTsKLQkJfQotCX07CQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRGlyQ29weS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9EaXJDb3B5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWM0ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9EaXJDb3B5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gY29weSBmaWxlcyBmcm9tIG9uZSBkaXIgdG8gYW5vdGhlciwgYW5kIGRlbGV0ZSB0aGUgdW4tbmVlZGVkIGZpbGVzIGZyb20gc291cmNlIGRpci4KLSAqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlyQ29weSB7Ci0KLQkvL3ByaXZhdGUgSVN0YXR1cyBmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IG51bGw7Ci0JCi0JRmlsZSBzcmNEaXI7Ci0JRmlsZSB0YXJnZXREaXI7Ci0JCi0JLy8gbmV3IGZpbGVzIHRvIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKLQlMaXN0IG5ld0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZpbGVzIGV4aXN0cyBpbiBib3RoIHNyYyBhbmQgdGFyZ2V0IGRpcgotCUxpc3Qgb2xkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLy8gZmlsZXMgb25seSBpbiB0YXJnZXQgZGlyLCB0aGVzZSBmaWxlcyBhcmUgdHJlYXRlZCBhcyBkZWxldGVkIGluIHRoZSBzcmMgZm9sZGVyLgotCUxpc3QgZGVsZXRlZEZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpckNvcHkoRmlsZSBzcmNEaXIsIEZpbGUgdGFyZ2V0RGlyKSB7Ci0JCXRoaXMuc3JjRGlyID0gc3JjRGlyOwotCQl0aGlzLnRhcmdldERpciA9IHRhcmdldERpcjsKLQkJCi0JCXByZXBhcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIENQX0ZPRExFUiA9IE11bHRpRmlsZVNhdmVVdGlsLkNBUEFCSUxJVFlfUEFUVEVSTl9QQVRIICsgIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERQX0ZPRExFUiA9IE11bHRpRmlsZVNhdmVVdGlsLkRFTElWRVJZX1BST0NFU1NfUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIGNoZWNrIG91dCB0aGUgZXhpc3RpbmcgZmlsZXMsIGRlbGV0ZSB0aGUgZmlsZXMgZnJvbSBjbSwgYW5kIGFkZCBuZXcgZmlsZXMsIGNvcHkgdGhlIGZpbGVzIG92ZXIKLQkgKgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoKSB7Ci0JCQkKLQkJLy8gY2hlY2sgb3V0IGZpbGVzCi0JCUxpc3QgZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gb2xkRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZylpdC5uZXh0KCk7CQkJCQkJCi0JCQlpZiAobmVlZENvcHkobmV3IEZpbGUoc3JjRGlyLCBwYXRoKSwgbmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKSkpIHsJLy8xNTQzMjEKLQkJCQlmaWxlcy5hZGQobmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlci5jaGVja01vZGlmeShmaWxlcyk7Ci0JCQotCQlpZiAoICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkgKSB7Ci0JCQlyZXR1cm4gZmlsZUNoZWNrZWRPdXRTdGF0dXM7Ci0JCX0KLQkJCQotCQkvLyBkZWxldGUgZmlsZXMKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGRlbGV0ZWRGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCk7Ci0JCQlmaWxlTWdyLmRlbGV0ZShmLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQotCQkJLy8gZGVsZXRlIHRoZSBlbXB0eSBDUCBhbmQgRFAgZm9sZGVyCi0JCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsgCi0JCQlpZiAoIHBhdGguc3RhcnRzV2l0aChDUF9GT0RMRVIpIHx8IHBhdGguc3RhcnRzV2l0aChEUF9GT0RMRVIpICkgewotCQkJCUZpbGUgZm9sZGVyID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJU3RyaW5nW10gaXRlbXMgPSBmb2xkZXIubGlzdCgpOwotCQkJCWlmICggaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5sZW5ndGggPT0gMCApIHsKLQkJCQkJZmlsZU1nci5kZWxldGUoZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsJCQkJCi0JCQkJfQotCQkJfQotCQl9CQotCQkKLQkJLy8gY29weSBvbGQgZmlsZXMKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBvbGRGaWxlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKWl0Lm5leHQoKTsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKG5ldyBGaWxlKHNyY0RpciwgcGF0aCksIG5ldyBGaWxlKHRhcmdldERpciwgcGF0aCkpOwotCQl9Ci0JCQotCQkvLyBjb3B5IG5ldyBmaWxlcwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IG5ld0ZpbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpaXQubmV4dCgpOwotCQkJRmlsZVV0aWwuY29weUZpbGUobmV3IEZpbGUoc3JjRGlyLCBwYXRoKSwgbmV3IEZpbGUodGFyZ2V0RGlyLCBwYXRoKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlQ2hlY2tlZE91dFN0YXR1czsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmUoKSB7Ci0JCUxpc3QgYWxsU3JjRmlsZXMgPSBnZXRBbGxGaWxlcyhzcmNEaXIpOwotCQlMaXN0IGFsbFRhcmdldEZpbGVzID0gZ2V0QWxsRmlsZXModGFyZ2V0RGlyKTsKLQotCQl3aGlsZSAoIGFsbFRhcmdldEZpbGVzLnNpemUoKSA+IDAgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpYWxsVGFyZ2V0RmlsZXMucmVtb3ZlKDApOwotCQkJaWYgKCBhbGxTcmNGaWxlcy5jb250YWlucyhwYXRoKSApIHsKLQkJCQlvbGRGaWxlcy5hZGQocGF0aCk7Ci0JCQkJYWxsU3JjRmlsZXMucmVtb3ZlKHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlkZWxldGVkRmlsZXMuYWRkKHBhdGgpOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgcmVtYWluaW5nIGZpbGVzIGluIHRoZSB0YXJnZXQgbGlzdCBpcyB0aGUgbmV3IGZpbGVzCi0JCW5ld0ZpbGVzLmFkZEFsbChhbGxTcmNGaWxlcyk7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgdGhlIGZpbGVzIHdpdGggcmVsYXRpdmUgcGF0aCB0byB0aGUgcm9vdAotCSAqIEBwYXJhbSBkaXIgdGhlIHJvb3QgZGlyCi0JICogQHJldHVybiBMaXN0IGFsbCBmaWxlcyBpbiB0aGUgZGlyLCB3aXRoIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3QKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0QWxsRmlsZXMoRmlsZSBkaXIpIHsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZVV0aWwuZ2V0QWxsRmlsZXMoZGlyLCBmaWxlcywgdHJ1ZSk7Ci0KLQkJLy8gY29udmVydCB0byBsaXN0IG9mIHBhdGgsIG5vdCBGaWxlCi0JCVVSSSBiYXNlVXJsID0gZGlyLnRvVVJJKCk7Ci0JCQotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICggaSA8IGZpbGVzLnNpemUoKSApIHsKLQkJCUZpbGUgZiA9IChGaWxlKWZpbGVzLmdldChpKTsKLQkJCWlmICggY2FuSWdub3JlKGYuZ2V0QWJzb2x1dGVQYXRoKCkpIHx8IGNhbklnbm9yZShmKSkgewotCQkJCWZpbGVzLnJlbW92ZShpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVVJJIHJlbCA9IGJhc2VVcmwucmVsYXRpdml6ZShmLnRvVVJJKCkpOwotCQkJCWZpbGVzLnNldChpLCByZWwuZ2V0UGF0aCgpKTsJCi0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1ZTX0ZPTERFUiA9IEZpbGUuc2VwYXJhdG9yICsgIkNWUyIgKyBGaWxlLnNlcGFyYXRvcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVk5fRk9MREVSID0gRmlsZS5zZXBhcmF0b3IgKyAiLnN2biIgKyBGaWxlLnNlcGFyYXRvcjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBib29sZWFuIGNhbklnbm9yZShTdHJpbmcgcGF0aCkgewotCQlpZiAoIHBhdGguaW5kZXhPZihDVlNfRk9MREVSKSA+PTAgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoIHBhdGguaW5kZXhPZihTVk5fRk9MREVSKSA+PTAgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBpZ25vcmVGaWxlcyA9IHsKLQkJCQkJCQkJCSIuY29weWFyZWEuZGF0IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJIi5jb3B5YXJlYS5kYiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfTsJCQkKLQlwcml2YXRlIGJvb2xlYW4gY2FuSWdub3JlKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlmb3IgKGludCBpPTA7IGk8aWdub3JlRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuYW1lLmVxdWFscyhpZ25vcmVGaWxlc1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGNvcHkgYWN0aW9uIGlzIG5lZWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZENvcHkoRmlsZSBzb3VyY2UsIEZpbGUgZGVzdCkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChkZXN0LmV4aXN0cygpKSB7Ci0JCQlyZXQgPSAoZGVzdC5sYXN0TW9kaWZpZWQoKSAhPSBzb3VyY2UubGFzdE1vZGlmaWVkKCkpCi0JCQkJCXx8IChkZXN0Lmxlbmd0aCgpICE9IHNvdXJjZS5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9FbGVtZW50RGlmZlRyZWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRWxlbWVudERpZmZUcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYjgxOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9FbGVtZW50RGlmZlRyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgZWxlbWVudCBkaWZmZXJlbmNlcyBpbiBhIHRyZWUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGlmZlRyZWUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElGRl9TVEFURV9TQU1FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfTkVXID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJRkZfU1RBVEVfQ0hBTkdFRCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESUZGX1NUQVRFX09MRF9PTkxZID0gNTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMTsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMjsKLQotCS8vIFRoZSBwYXJlbnQgaW4gdGhlIGJhc2UgbGlicmFyeSBpZiBlMiBpcyBhIG5ldyBlbGVtZW50LgotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlMV9wYXJlbnQ7Ci0KLQlwcml2YXRlIEVsZW1lbnREaWZmVHJlZSBwYXJlbnQgPSBudWxsOwotCi0JLy8gRGVmaW5lIHRoZSBkaWZmIHN0YXRlIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBjb21wYXJlZCB0byB0aGUgZmlyc3Qgb25lLgotCXByaXZhdGUgaW50IGRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfU0FNRTsKLQotCXByaXZhdGUgTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNEaXJ0eUNoaWxkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUoTWV0aG9kRWxlbWVudCBlMSwgTWV0aG9kRWxlbWVudCBlMikgewotCQl0aGlzKGUxLCBlMiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlKE1ldGhvZEVsZW1lbnQgZTEsIE1ldGhvZEVsZW1lbnQgZTIsCi0JCQlNZXRob2RFbGVtZW50IGUxX3BhcmVudCkgewotCQl0aGlzLmUxX3BhcmVudCA9IGUxX3BhcmVudDsKLQkJdGhpcy5lMSA9IGUxOwotCQl0aGlzLmUyID0gZTI7Ci0KLQkJcmVzb2x2ZURpZmZTdGF0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEJhc2VFbGVtZW50KCkgewotCQlyZXR1cm4gZTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBtZXRob2QgZWxlbWVudCdzIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRCYXNlUGFyZW50RWxlbWVudCgpIHsKLQkJcmV0dXJuIGUxX3BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0SW1wb3J0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGUyOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIG5ldyB0byB0aGUgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKLQkJcmV0dXJuIChlMSA9PSBudWxsKSAmJiAoZTIgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVsZW1lbnQgZXhpc3RzIG9ubHkgaW4gdGhlIGxpYnJhcnkgYW5kIG5vdCBpbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uIHRvIGJlIGltcG9ydGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2xkT25seSgpIHsKLQkJcmV0dXJuIChlMSAhPSBudWxsKSAmJiAoZTIgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGggYmFzZSBhbmQgaW1wb3J0IGVsZW1lbnRzIGFyZSBub3QgbnVsbCwgCi0JICogb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb3RoKCkgewotCQlyZXR1cm4gKGUxICE9IG51bGwpICYmIChlMiAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY2hpbGQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChFbGVtZW50RGlmZlRyZWUgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGhhc0RpcnR5Q2hpbGQgYXR0cmlidXRlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0RpcnR5Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0RpcnR5Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBoYXNEaXJ0eUNoaWxkIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eUNoaWxkKGJvb2xlYW4gZmxhZykgewotCQloYXNEaXJ0eUNoaWxkID0gaGFzRGlydHlDaGlsZCB8fCBmbGFnOwotCQlpZiAoaGFzRGlydHlDaGlsZCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LnNldERpcnR5Q2hpbGQoaGFzRGlydHlDaGlsZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGFyZW50KEVsZW1lbnREaWZmVHJlZSBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmIChkaWZmU3RhdGUgIT0gRElGRl9TVEFURV9TQU1FICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuc2V0RGlydHlDaGlsZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudERpZmZUcmVlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCS8qKgotCSAqIGhhc0NoaWxkcmVuIGF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIChjaGlsZHJlbiAhPSBudWxsKSAmJiAoY2hpbGRyZW4uc2l6ZSgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpZmYgc3RhdGUgb2YgdGhlIHNlY29uZCBlbGVtZW50IGNvbXBhcmluZyB0byB0aGUgZmlyc3Qgb25lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGlmZlN0YXRlKCkgewotCQlyZXR1cm4gZGlmZlN0YXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtZXNzYWdlIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpZmZNZXNzYWdlKCkgewotCQlyZXR1cm4gIlsiICsgZ2V0VmVyc2lvbihlMSkgKyAiXSA6IFsiICsgZ2V0VmVyc2lvbihlMikgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVEaWZmU3RhdGUoKSB7Ci0JCS8vIGhvdyB0byBmaWRkIHR3byBlbGVtZW50cz8KLQkJLy8gMS4gYXR0cmlidXRlcwotCQkvLyAyLiB2ZXJzaW9uIG51bWJlcgotCQkvLyAzLiBjaGlsZHJlbgotCQkvLyA0LiByZWZlcmVuY2VzCi0JCS8vIDUuIC4uLgotCQlpZiAoZTEgPT0gbnVsbCkgewotCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9ORVc7Ci0JCX0gZWxzZSBpZiAoZTIgPT0gbnVsbCkgewotCQkJZGlmZlN0YXRlID0gRElGRl9TVEFURV9PTERfT05MWTsKLQkJfSBlbHNlIHsKLQkJCWlmIChlMSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlkaWZmU3RhdGUgPSBESUZGX1NUQVRFX1NBTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRpZmZTdGF0ZSA9IERJRkZfU1RBVEVfQ0hBTkdFRDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZlcnNpb24oTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGdldFBhY2thZ2UoZWxlbWVudCkuZ2V0VmVyc2lvbigpOwotCX0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0IGdldFBhY2thZ2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0KSB7Ci0JCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCkgZWxlbWVudDsKLQkJfQotCi0JCXJldHVybiBnZXRQYWNrYWdlKChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSk7Ci0JfQotCi0JLy8gVXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSBlbGVtZW50IGluZm9ybWF0aW9uLgotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAoZTEgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUxLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoZTIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGUyLmdldE5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCB0eXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IGUxOwotCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQllID0gZTI7Ci0JCX0KLQotCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZS5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIGRlYnVnRHVtcCgpIHsKLQkJZGVidWdEdW1wKDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVidWdEdW1wKGludCBsZXZlbCwgU3RyaW5nIGluZGVudCkgewotCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCWlmIChlMSA9PSBudWxsKSB7Ci0JCQlsaW5lID0gIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlsaW5lID0gZTEuZ2V0R3VpZCgpICsgIiwgIiArIGUxLmdldE5hbWUoKSArICIsICIgKyBlMS5lQ2xhc3MoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCW91dExuKGxldmVsLCBpbmRlbnQsIGxpbmUpOwotCQkKLQkJaWYgKGUyID09IG51bGwpIHsKLQkJCWxpbmUgPSAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWxpbmUgPSBlMi5nZXRHdWlkKCkgKyAiLCAiICsgZTIuZ2V0TmFtZSgpICsgIiwgIiArIGUyLmVDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJb3V0TG4obGV2ZWwsIGluZGVudCwgbGluZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgY2hpbGQgPSAoRWxlbWVudERpZmZUcmVlKSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQljaGlsZC5kZWJ1Z0R1bXAobGV2ZWwgKyAxLCBpbmRlbnQgKyAiICAgIik7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRMbihpbnQgbGV2ZWwsIFN0cmluZyBpbmRlbnQsIFN0cmluZyBsaW5lKSB7Ci0JCVN0cmluZyBzdHIgPSBpbmRlbnQgKyBsZXZlbCArICI6ICIgKyBsaW5lOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9GaWxlTW9kaWZ5Q2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9GaWxlTW9kaWZ5Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTk4MjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvRmlsZU1vZGlmeUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLQotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gY2hlY2sgZmlsZXMgZm9yIG1vZGlmaWNhdGlvbnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlTW9kaWZ5Q2hlY2tlciB7Ci0KLQkvKioKLQkgKiBDaGVja3MgbW9kaWZpY2F0aW9uIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoTGlzdCBtb2RpZmllZEZpbGVzKSB7Ci0JCQotCQl0cnkgewotCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW21vZGlmaWVkRmlsZXMuc2l6ZSgpXTsKLQkJCW1vZGlmaWVkRmlsZXMudG9BcnJheShwYXRocyk7Ci0JCQkKLQkJCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZmlsZU1nci5jaGVja01vZGlmeShwYXRocywgTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKTsKLQotCQkJLy8gbWFrZSBzdXJlIGFsbCB0aGUgZmlsZXMgYXJlIHVwZGF0YWJsZQkJCQotCQkJTGlzdCByZWFkb25seUZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKyApIHsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoc1tpXSk7Ci0JCQkJaWYgKCBmLmV4aXN0cygpICYmICFmLmNhbldyaXRlKCkgKSB7Ci0JCQkJCXJlYWRvbmx5RmlsZXMuYWRkKHBhdGhzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICggcmVhZG9ubHlGaWxlcy5zaXplKCkgPiAwICkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5GaWxlTW9kaWZ5Q2hlY2tlcl9DaGVja291dF9mYWlsZWRfdGl0bGU7IAotCQkJCVN0cmluZyBtc2cgPSBJbXBvcnRSZXNvdXJjZXMuRmlsZU1vZGlmeUNoZWNrZXJfQ2hlY2tvdXRfZmFpbGVkX21zZzsgCi0JCQkJaWYgKCBuZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpLmRpc3BsYXlQcm9tcHQodGl0bGUsIG1zZykgKSB7Ci0JCQkJCXJldHVybiBjaGVja01vZGlmeShyZWFkb25seUZpbGVzKTsKLQkJCQl9Ci0JCQl9CQkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCQkKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBlLmdldE1lc3NhZ2UoKSA9PSBudWxsID8gIiIgOiBlLmdldE1lc3NhZ2UoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgbW9kaWZpY2F0aW9uIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgc3luY0V4ZWNDaGVja01vZGlmeShmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMpIHsKLQkJZmluYWwgSVN0YXR1c1tdIHJldCA9IG5ldyBJU3RhdHVzWzFdOwotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmV0WzBdID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gcmV0WzBdOwotCX0KLQkKLQkvKioKLQkgKiBSZXRydW5zIHRoZSBtb2RpZmllZCBmaWxlIGxpc3Qgb2YgdGhlIGdpdmVuIHJlc291cmNlIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TW9kaWZpZWRGaWxlcyhSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJaWYgKHJlcyAhPSBudWxsICYmIHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCQlyZXQuYWRkKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5RGlmZk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvTGlicmFyeURpZmZNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDE0YWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5RGlmZk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gbWV0aG9kIGVsZW1lbnRzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kCi0gKiB0aG9zZSB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5RGlmZk1hbmFnZXIgewotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5OwotCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGltcG9ydExpYnJhdHk7Ci0KLQkvLyBNYXAgb2YgdWlkIHRvIEVsZW1lbnREaWZmVHJlZSwgdGhlIHJvb3Qgb2YgdGhlIEVsZW1lbnREaWZmVHJlZSBpcyB0aGUKLQkvLyBsaWJyYXJ5LgotCXByaXZhdGUgTWFwIGRpZmZFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIE1hcCBvZiB1aWQgdG8gZWxlbWVudCBmb3IgaW1wb3J0IGxpYnJhcnkgY29uZmlndXJhdGlvbi4KLQlwcml2YXRlIE1hcCBpbXBvcnRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8vIGlkIHRvIGVsZW1lbnQgbWFwIG9mIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JcHJpdmF0ZSBNYXAgY3VycmVudEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gVGhlIGRpZmYgdHJlZS4KLQlFbGVtZW50RGlmZlRyZWUgcm9vdERpZmZUcmVlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlEaWZmTWFuYWdlcihNZXRob2RMaWJyYXJ5IGJhc2VMaWJyYXJ5LAotCQkJTWV0aG9kTGlicmFyeSBpbXBvcnRMaWJyYXR5KSB7Ci0JCXRoaXMuYmFzZUxpYnJhcnkgPSBiYXNlTGlicmFyeTsKLQkJdGhpcy5pbXBvcnRMaWJyYXR5ID0gaW1wb3J0TGlicmF0eTsKLQotCQlyb290RGlmZlRyZWUgPSBuZXcgRWxlbWVudERpZmZUcmVlKGJhc2VMaWJyYXJ5LCBpbXBvcnRMaWJyYXR5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRJbXBvcnRpbmdMaWJyYXJ5KCkgewotCQlyZXR1cm4gdGhpcy5pbXBvcnRMaWJyYXR5OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGlmZmVyZW5jZSB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgYnVpbGREaWZmVHJlZSgpIHsKLQkJLy8gQnVpbGQgdGhlIHVpZCB0byBlbGVtZW50IG1hcCBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5LgotCQlidWlsZFVJRE1hcChpbXBvcnRMaWJyYXR5LmVDb250ZW50cygpLCBpbXBvcnRFbGVtZW50TWFwLCB0cnVlLCBmYWxzZSk7Ci0KLQkJYnVpbGRVSURNYXAoYmFzZUxpYnJhcnkuZUNvbnRlbnRzKCksIGN1cnJlbnRFbGVtZW50TWFwLCB0cnVlLCB0cnVlKTsKLQotCQkvLyBHZXQgYWxsIHRoZSBzeXN0ZW0gcGFja2FnZXMgaW4gZWFjaCBwbHVnLWluIHNvIHdlIGNhbiBmaWx0ZXIgb3V0Ci0JCS8vIHRob3NlIHBhY2thZ2VzIHdoZW4gY29tcGFyaW5nIHRoZSBsaWJyYXJpZXMuCi0KLQkJLy8gSXRlcmF0ZSB0aGUgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5LCBhbmQgYnVpbGQgYSBkaWZmIHRyZWUgYnkKLQkJLy8gY29tcGFyaW5nIHRvIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkJTGlzdCBwbHVnaW5zID0gYmFzZUxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJTGlzdCBzeXN0ZW1QYWNrYWdlcyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJCQotCQkJLy8gY29udGVudCBjYXRlZ29yeSBwYWNrYWdlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW50byB0aGUgZGlmZiB0cmVlIAotCQkJLy8gb3RoZXJ3aXNlIHRoZSBjYXRlZ29yeSBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvc3QKLQkJCUxpc3QgY2F0ZWdvcnlMaXN0ID0gVG5nVXRpbC5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pOwotCQkJZm9yICggSXRlcmF0b3IgaXRjID0gY2F0ZWdvcnlMaXN0Lml0ZXJhdG9yKCk7IGl0Yy5oYXNOZXh0KCk7ICkgewotCQkJCU9iamVjdCBvID0gaXRjLm5leHQoKTsKLQkJCQlpZiAoIHN5c3RlbVBhY2thZ2VzLmNvbnRhaW5zKG8pICkgewotCQkJCQlzeXN0ZW1QYWNrYWdlcy5yZW1vdmUobyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyB0aGUgcm9vdCBjdXN0b21jYXRlZ290eSBwYWNrYWdlIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGRpZmYgdHJlZQotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBzeXN0ZW1QYWNrYWdlcy5zaXplKCkgKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlzeXN0ZW1QYWNrYWdlcy5nZXQoaSk7Ci0JCQkJaWYgKCBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKHBrZykgKSB7Ci0JCQkJCXN5c3RlbVBhY2thZ2VzLnJlbW92ZShwa2cpOwotCQkJCQlicmVhazsKLQkJCQl9IGVsc2UgewotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBCdWlsZCB0aGUgZGlmZiB0cmVlIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQkJaXRlcmF0ZUVsZW1lbnQocGx1Z2luLCByb290RGlmZlRyZWUsIHN5c3RlbVBhY2thZ2VzKTsKLQkJfQotCi0JCUxpc3QgY29uZmlncyA9IGJhc2VMaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29uZmlncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0KLQkJCS8vIEJ1aWxkIHRoZSBkaWZmIHRyZWUgYnkgaXRlcmF0aW5nIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCQlpdGVyYXRlRWxlbWVudChjb25maWcsIHJvb3REaWZmVHJlZSwgbmV3IEFycmF5TGlzdCgpKTsKLQkJfQotCi0JCS8vIFByb2Nlc3MgdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgaW1wb3J0IGxpYnJhcnkgYW5kIGFkZCB0aGVtIHRvIHRoZQotCQkvLyBkaWZmIHRyZWUuCi0JCWhhbmRsZU5ld0VsZW1lbnRzKGltcG9ydExpYnJhdHkpOwotCi0JCXJldHVybiByb290RGlmZlRyZWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZmVybmVjZSB0cmVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50RGlmZlRyZWUgZ2V0RGlmZlRyZWUoKSB7Ci0JCXJldHVybiByb290RGlmZlRyZWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlmZmVybmVjZSBtYXAuCi0JICovCi0JcHVibGljIE1hcCBnZXREaWZmVHJlZU1hcCgpIHsKLQkJcmV0dXJuIGRpZmZFbGVtZW50TWFwOwotCX0KLQotCS8qKgotCSAqIEl0ZXJhdGVzIHRoZSBlbGVtZW50IGluIHRoZSBjdXJyZW50IGxpYnJhcnkgYW5kIGJ1aWxkIGEgZGlmZiB0cmVlIGJ5Ci0JICogY29tcGFyaW5nIHRvIHRoZSBpbXBvcnQgbGlicmFyeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRWxlbWVudERpZmZUcmVlIGRpZmZUcmVlLCBMaXN0IHN5c3RlbVBhY2thZ2VzKSB7Ci0JCWlmICghc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBkaWZmZWxlbWVudCBVSUQgbWFwLgotCQlpZiAoIXN5c3RlbVBhY2thZ2VzLmNvbnRhaW5zKGVsZW1lbnQpCi0JCQkJJiYgIShlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCVN0cmluZyB1aWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmQ2hpbGQgPSBuZXcgRWxlbWVudERpZmZUcmVlKGVsZW1lbnQsCi0JCQkJCShNZXRob2RFbGVtZW50KSBpbXBvcnRFbGVtZW50TWFwLmdldCh1aWQpKTsKLQkJCWRpZmZFbGVtZW50TWFwLnB1dCh1aWQsIGRpZmZDaGlsZCk7Ci0JCQlkaWZmVHJlZS5hZGRDaGlsZChkaWZmQ2hpbGQpOwotCQkJZGlmZlRyZWUgPSBkaWZmQ2hpbGQ7Ci0JCX0KLQotCQkvLyBDaGVjayB3aXRoIHRoZSBpbXBvcnRpbmcgZWxlbWVudCBhbmQgY3JlYXRlIGFuIEVsZW1lbnREaWZmSW5mbyBvYmplY3QKLQkJRUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBjaGlsZCA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCQlpZiAoc2VsZWN0YWJsZShjaGlsZCkpIHsKLQkJCQkJCWl0ZXJhdGVFbGVtZW50KGNoaWxkLCBkaWZmVHJlZSwgc3lzdGVtUGFja2FnZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IhICIgKyBlICsgIiBpcyBub3QgYSBNZXRob2RFbGVtZW50IG9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBuZXdseSBhZGRlZCBlbGVtZW50cyBpbiB0aGUgaW1wb3J0aW5nIGxpYnJhcnksIGFkZCB0aGUgbmV3Ci0JICogZWxlbWVudHMgaW50byB0aGUgcGFyZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU5ld0VsZW1lbnRzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoIXNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChpc05ld0VsZW1lbnQoZWxlbWVudCkpIHsKLQkJCS8vIFRoaXMgaXMgYSBuZXcgZWxlbWVudCwgZmluZCB0aGUgcGFyZW50IGluIHRoZSBiYXNlIGxpYnJhcnkuCi0JCQlNZXRob2RFbGVtZW50IHBhcmVudCA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKTsKLQkJCXdoaWxlIChpc05ld0VsZW1lbnQocGFyZW50KSkgewotCQkJCWVsZW1lbnQgPSBwYXJlbnQ7Ci0JCQkJcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0KLQkJCS8vIEFsd2F5cyBtZXJnZSBsaWJyYXkgcGx1Z2lucyBldmVuIGl0J3MgZnJvbSBhIGRpZmZlcmVudCBsaWJyYXJ5LgotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlwYXJlbnQgPSBiYXNlTGlicmFyeTsKLQkJCX0KLQotCQkJLy8gTmVlZCB0byBmaW5kIHRoZSBwYXJlbnQgZWxlbWVudCBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IHNvIHRoYXQgd2UKLQkJCS8vIGtub3cgd2hlcmUgdG8gYWRkIHRoZSBuZXcgZWxlbWVudC4KLQkJCU1ldGhvZEVsZW1lbnQgbGliX3BhcmVudCA9IChNZXRob2RFbGVtZW50KSBjdXJyZW50RWxlbWVudE1hcAotCQkJCQkuZ2V0KHBhcmVudC5nZXRHdWlkKCkpOwotCQkJaWYgKGxpYl9wYXJlbnQgPT0gbnVsbCkgewotCQkJCWxpYl9wYXJlbnQgPSBiYXNlTGlicmFyeTsKLQkJCX0KLQkJCUVsZW1lbnREaWZmVHJlZSBlbGVtZW50RGlmZlRyZWUgPSBuZXcgRWxlbWVudERpZmZUcmVlKG51bGwsCi0JCQkJCWVsZW1lbnQsIGxpYl9wYXJlbnQpOwotCi0JCQkvLyBGaW5kIHRoZSBwYXJlbnQgZGlmZiB0cmVlLgotCQkJRWxlbWVudERpZmZUcmVlIHBhcmVudERpZmZUcmVlID0gbnVsbDsKLQkJCXdoaWxlICgocGFyZW50RGlmZlRyZWUgPT0gbnVsbCkgJiYgKHBhcmVudCAhPSBudWxsKSkgewotCQkJCXBhcmVudERpZmZUcmVlID0gKEVsZW1lbnREaWZmVHJlZSkgZGlmZkVsZW1lbnRNYXAuZ2V0KHBhcmVudAotCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCQl9Ci0KLQkJCWlmIChwYXJlbnREaWZmVHJlZSA9PSBudWxsKSB7Ci0JCQkJcGFyZW50RGlmZlRyZWUgPSByb290RGlmZlRyZWU7Ci0JCQl9Ci0KLQkJCXBhcmVudERpZmZUcmVlLmFkZENoaWxkKGVsZW1lbnREaWZmVHJlZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBJdGVyYXRlIHRoZSBjaGlsZHJlbi4KLQkJCUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQkJZm9yIChJdGVyYXRvciBpdGMgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGMuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGMubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7IAotCQkJCQloYW5kbGVOZXdFbGVtZW50cyhlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0VsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gIWN1cnJlbnRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVSURNYXAoTGlzdCBlbGVtZW50cywgTWFwIGVsZW1lbnRVSURNYXAsIGJvb2xlYW4gcmVjdXJzaXZlLCBib29sZWFuIGZ1bGwpIHsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJaWYgKHNlbGVjdGFibGUoZWxlbWVudCkgfHwgZnVsbCkgewotCQkJCQlTdHJpbmcgdWlkID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQkJCWVsZW1lbnRVSURNYXAucHV0KHVpZCwgZWxlbWVudCk7Ci0KLQkJCQkJaWYgKHJlY3Vyc2l2ZSkgewotCQkJCQkJYnVpbGRVSURNYXAoZWxlbWVudC5lQ29udGVudHMoKSwgZWxlbWVudFVJRE1hcCwKLQkJCQkJCQkJcmVjdXJzaXZlLCBmdWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoICEoZSBpbnN0YW5jZW9mIFBvaW50IHx8IGUgaW5zdGFuY2VvZiBEaW1lbnNpb24gfHwgZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgKXsKLQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkJCSJJbXBvcnQgZXJyb3IuICIgKyBlICsgIiBpcyBub3QgYSBNZXRob2RFbGVtZW50IG9iamVjdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBzZWxlY3RhYmxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNlbGVjdGFibGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhpc3RpbmcgbWV0aG9kIGVsZW1lbnQgZ2l2ZW4gYnkgdGhlIGd1aWQuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXhpc3RpbmdFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoTWV0aG9kRWxlbWVudCljdXJyZW50RWxlbWVudE1hcC5nZXQoZ3VpZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlJbXBvcnRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL0xpYnJhcnlJbXBvcnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTYyYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9MaWJyYXJ5SW1wb3J0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkudmlld3MuTGlicmFyeVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkRpYWdyYW1IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlIZWxwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGltcG9ydGluZyBvZiBhIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5SW1wb3J0TWFuYWdlciB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVuYW1lUGx1Z2luTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBNYXAgcmVuYW1lRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgc2V0RWxlbWVudE1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIExpYnJhcnlEaWZmTWFuYWdlciBkaWZmTWdyOwotCXByaXZhdGUgRWxlbWVudERpZmZUcmVlIHJvb3RUcmVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBjb25maWdGb2xkZXJFcnJvciA9IGZhbHNlOwotCi0JLy9wcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBudWxsOwotCi0JLy9wcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgYWZjcCA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgYmFzZUxpYnJhcnkgPSBudWxsOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBpbXBvcnRpbmdMaWJyYXJ5ID0gbnVsbDsKLQotCS8vIGd1aWQgb2YgcmVwbGFjZWQgZWxlbWVudCBpZCB0byB0aGUgZWxlbWVudCBpbiB0aGUgYmFzZSBsaWJyYXJ5Ci0JLy8gd2UgbmVlZCB0aGlzIHRvIHJlZGlyZWN0IHRoZSByZWZlcmVuY2Ugb2YgbmV3IGVsZW1lbnRzIGZyb20gdGhlIGltcG9ydGluZwotCS8vIGxpYnJhdHkgdG8gdGhlIGJhc2UgbGlicmFyeQotCXByaXZhdGUgTWFwIHJlcGxhY2VkRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBrZWVwIHRoZSBuZXcgZWxlbWVudHMsIHdlIG5lZWQgdG8gaXRlcmF0ZSB0aGVpciBmZWF0dXJlIHZhbHVlIGFuZAotCS8vIHJlZGlyZWN0IHRoZSB2YWxldSBlbGVtZW50Ci0JLy8gZnJvbSB0aGUgaW1wb3J0aW5nIGxpYnJhcnkgdG8gdGhlIGJhc2UgbGlicmFyeQotCXByaXZhdGUgTGlzdCBuZXdFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JLy8gZGVsZXRlZCBlbGVtZW50cywKLQlwcml2YXRlIExpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQkvLyBsaXN0IG9mIHVzZXIgc2VsZWN0ZWQgaXRlbXMgdG8gYmUgaW1wb3J0ZWQKLQlMaXN0IGNoZWNrZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8vIGZsYWcgdG8gaW5kaWNhdGUgdGhlIGZpbGUgY2hlb3V0IHN0YXR1cwotCUlTdGF0dXMgZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBudWxsOwotCQotCS8vIHJlc291cmNlIGZpbGUgcGF0aCBmb3IgbmV3IHJlc29ydWNlcwotCUxpc3QgbmV3UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCVJlc291cmNlU2Nhbm5lciByZXNTY2FubmVyOwotCQotCXByaXZhdGUgRGlhZ3JhbUhhbmRsZXIgZGlhZ3JhbUhhbmRsZXI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUltcG9ydE1hbmFnZXIoTGlicmFyeURpZmZNYW5hZ2VyIGRpZmZNZ3IsCi0JCQlMaXN0IGNoZWNrZWRJdGVtcykgewotCQl0aGlzLmRpZmZNZ3IgPSBkaWZmTWdyOwotCQl0aGlzLnJvb3RUcmVlID0gZGlmZk1nci5nZXREaWZmVHJlZSgpOwotCQkKLQkJaWYgKCBjaGVja2VkSXRlbXMgIT0gbnVsbCApIHsKLQkJCS8vIGNoZWNrZWRMaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBFbGVtZW50RGlmZlRyZWUgb2JqZWN0cwotCQkJLy8gZ2V0IHRoZSBwYWNrYWdlcyBhcyB3ZWxsCi0JCQl0aGlzLmNoZWNrZWRMaXN0LmFkZEFsbChjaGVja2VkSXRlbXMpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNoZWNrZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUVsZW1lbnREaWZmVHJlZSBkaWZmVHJlZSA9IChFbGVtZW50RGlmZlRyZWUpIGl0Lm5leHQoKTsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSBkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCQljaGVja2VkTGlzdC5hZGQoZSk7Ci0JCQkJfQotCQkJCQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYWxzbyBpbmNsZHVlIHRoZSBoaWRkZW4gcm9vdCBjdXN0b20gcGFja2FnZSBpZiB0aGUgcGFja2FnZSBpcyB0aGUgQ3VzdG9tQ2F0ZWdvcmllcyBwYWNrYWdlCi0JCQkJLy8gMTUwODk1IC0gSW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgKSB7Ci0JCQkJCUxpc3QgY2hpbGRyZW4gPSAoKE1ldGhvZFBhY2thZ2UpZSkuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkJCQlpZiAoIGNoaWxkcmVuLnNpemUoKSA9PSAxICkgewotCQkJCQkJTWV0aG9kUGFja2FnZSBwa2cgID0gKE1ldGhvZFBhY2thZ2UpY2hpbGRyZW4uZ2V0KDApOwotCQkJCQkJaWYgKCBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKHBrZykgKSB7Ci0JCQkJCQkJY2hlY2tlZExpc3QuYWRkKHBrZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJZSA9IGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKTsKLQkJCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCQkJY2hlY2tlZExpc3QuYWRkKGUpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCQlMaWJyYXJ5VXRpbC5nZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKWUsIGNoZWNrZWRMaXN0KTsKLQkJCQl9Ci0KLQkJCQkKLQkJCQkvLyBmb3IgbmV3IGl0ZW0sIGFkZCBhbGwgdGhlIHN1YiBwYWNrYWdlcwotCQkJCWlmICggZGlmZlRyZWUuaXNOZXcoKSApIHsKLQkJCQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICkgewotCQkJCQkJY2hlY2tlZExpc3QuYWRkQWxsKExpYnJhcnlVdGlsLmdldEFsbFBhY2thZ2VzKChNZXRob2RQbHVnaW4pZSkpOwotCQkJCQl9IGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSApIHsKLQkJCQkJCUxpYnJhcnlVdGlsLmdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpZSwgY2hlY2tlZExpc3QpOwotCQkJCQl9IAotCQkJCX0KLQkJCX0KLQkJCQotCQl9IGVsc2UgewotCQkJY2hlY2tlZExpc3QgPSBudWxsOwotCQl9Ci0JCQotCQkKLQkJaW5pdCgpOwotCi0JCS8vIEdldCB0aGUgY3VycmVudCBsaWJyYXJ5LgotCQliYXNlTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSB0aGlzLnJvb3RUcmVlLmdldEJhc2VFbGVtZW50KCk7Ci0JCWltcG9ydGluZ0xpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSkgdGhpcy5yb290VHJlZQotCQkJCS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0KLQkJLy8gY3JlYXRlIHRoZSByZXNvdXJjZSBzY2FubmVyCi0JCXJlc1NjYW5uZXIgPSBuZXcgUmVzb3VyY2VTY2FubmVyKAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChpbXBvcnRpbmdMaWJyYXJ5KSwgCi0JCQkJTGlicmFyeVV0aWwuZ2V0TGlicmFyeVJvb3RQYXRoKGJhc2VMaWJyYXJ5KSwgcmVuYW1lUGx1Z2luTWFwKTsKLQkJCQotCQlkaWFncmFtSGFuZGxlciA9IG5ldyBEaWFncmFtSGFuZGxlcigKLQkJCQlMaWJyYXJ5VXRpbC5nZXRMaWJyYXJ5Um9vdFBhdGgoaW1wb3J0aW5nTGlicmFyeSksIAotCQkJCUxpYnJhcnlVdGlsLmdldExpYnJhcnlSb290UGF0aChiYXNlTGlicmFyeSkpIHsJCQkJCi0JCQkvL1swXTogc291cmNlRmlsZQotCQkJLy9bMV06IHRhcmdldEZpbGUKLQkJCXByb3RlY3RlZCBGaWxlW10gZ2V0RmlsZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IGVsZW0pIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0RmlsZXMoZWxlbSwgZmFsc2UpOwotCQkJfQotCQkJCi0JCX07Ci0JCQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0vLwkJLy8gU2V0IHRoZSB0cmVlIGNvbnRlbnQuCi0vLwkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQlmYWN0b3JpZXMuYWRkKG5ldyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLS8vCQlmYWN0b3JpZXMuYWRkKG5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0vLwotLy8JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLS8vCQkJCWZhY3Rvcmllcyk7Ci0vLwkJYWZjcCA9IG5ldyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcihhZGFwdGVyRmFjdG9yeSk7Ci0vLwotLy8JCUJhc2ljQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjayA9IG5ldyBCYXNpY0NvbW1hbmRTdGFjaygpOwotLy8KLS8vCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluIHdpdGggYSBzcGVjaWFsIGNvbW1hbmQgc3RhY2suCi0vLwkJZWRpdGluZ0RvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oYWRhcHRlckZhY3RvcnksCi0vLwkJCQljb21tYW5kU3RhY2ssIG5ldyBIYXNoTWFwKCkpOwotLy8KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTZWxlY3RlZChFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUpIHsKLQkJaWYgKCBjaGVja2VkTGlzdCA9PSBudWxsIHx8IGNoZWNrZWRMaXN0LmNvbnRhaW5zKGRpZmZUcmVlKSApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlNZXRob2RFbGVtZW50IGUgPSBkaWZmVHJlZS5nZXRCYXNlRWxlbWVudCgpOwkJCi0JCWlmICggZSA9PSBudWxsICkgewotCQkJZSA9IGRpZmZUcmVlLmdldEltcG9ydEVsZW1lbnQoKTsKLQkJfQotCQkKLQkJcmV0dXJuIGlzU2VsZWN0ZWQoZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGVjdGVkKE1ldGhvZEVsZW1lbnQgZSkgewotCQkKLQkJaWYgKCBjaGVja2VkTGlzdCA9PSBudWxsIHx8IAotCQkJCWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgCi0JCQkJZS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gfHwgCi0JCQkJZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCBjaGVja2VkTGlzdC5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCBlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLQkJCXJldHVybiBjaGVja2VkTGlzdC5jb250YWlucyhlKTsKLQkJfQotCQkKLQkJTWV0aG9kRWxlbWVudCBvID0gKE1ldGhvZEVsZW1lbnQpTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlKTsKLQkJaWYgKCBvID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gCi0JCQotCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5ICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBjaGVja2VkTGlzdC5jb250YWlucyhvKTsKLQl9Ci0JCi0JLyoqCi0JICogRG9lcyBtZXJnZSBmcm9tIHRoZSBpbXBvcnQgbGlicmFyeSBpbnRvIHRoZSBiYXNlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHZvaWQgZG9NZXJnZShib29sZWFuIHJlcGxhY2VFeGlzdGluZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29uZmlnRm9sZGVyRXJyb3IgPSBmYWxzZTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1lcmdpbmcgY29uZmlndXJhdGlvbiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQkKLQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBwYXRoIGJlZm9yZSBkZXRhY2hpbmcgdGhlIHJlc291cmNlLgotCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvYWRpbmcgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IHVubG9ja2VkUGx1Z2lucyA9IHVubG9ja1BsdWdpbnMoKTsKLQkJaWYgKCEgdW5sb2NrZWRQbHVnaW5zLmlzRW1wdHkoKSAmJiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkmJiAhZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpKSB7Ci0JCQkvLyBsb2cgZXJyb3IKLQkJCWZpbGVDaGVja091dEVycm9yKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGJhc2VMaWJyYXJ5KTsKLQkJTGlicmFyeVV0aWwubG9hZEFsbChpbXBvcnRpbmdMaWJyYXJ5KTsKLQotCQkvLyBEZXRhY2ggdGhlIG5ldyBsaWJyYXJ5IGZyb20gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc28gaXQgY2FuIGJlCi0JCS8vIGFkZGVkIHRvIGEgbmV3IExpYnJhcnkgUHJvY2Vzc29yIGluc3RhbmNlLgotCQlMaWJyYXJ5VXRpbC5kZXRhY2hGcm9tUmVzb3VyY2UoaW1wb3J0aW5nTGlicmFyeSk7Ci0KLQkJLy8gZm9yIHRlc3QKLQkJaW1wb3J0aW5nTGlicmFyeS5zZXROYW1lKCJJbXBvcnRpbmdMaWI6ICIgKyBpbXBvcnRpbmdMaWJyYXJ5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3MgY29uZmlndXJhdGlvbiBkaWZmIHRyZWUgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGJlZm9yZSBwcm9jZXNzaW5nLCBzYXZlIHRoZSBvcmlnaW5hbCByZXNvdXJjZXMgCi0JCS8vIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIG5ld2x5IGFkZGVkIHJlc291cmNlcwotCQlMaXN0IG9sZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoCi0JCQkJYmFzZUxpYnJhcnkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSk7Ci0JCQotCQkvLyBJdGVyYXRlIGVhY2ggZWxlbWVudCBhbmQgdGhlIG5lY2Vzc2FyeSBtZXJnZXMuCi0JCXByb2Nlc3NEaWZmVHJlZShyb290VHJlZSwgcmVwbGFjZUV4aXN0aW5nKTsKLQotCQloYW5kbGVTZXRFbGVtZW50cygpOwotCQkKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGVyZm9ybSBpbnRlZ3JpdHkgY2hlY2tpbmcgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIHBlcmZvcm0gYW4gaW50ZWdyaXR5IGNoZWNrIG9mIHRoZSBsaWJyYXJ5Ci0JCS8vIGZpeCBhbnkgZGFuZmxpbmcgZWxlbWVudHMgZHVlIHRvIHBhY2thZ2UvZWxlbWVudCByZXBsYWNlbWVudAotCQlkb0ludGVncml0eUNoZWNrKCk7Ci0KLQkJLy8gbm93IHByb2Nlc3MgdGhlIG5ldyByZXNvdXJjZXMgYW5kIG1hcmsgdGhlbSBkaXJzdCBzbyB0aGF0IAotCQkvLyB0aGUgZGF0YSB3aWxsIGJlIHNhdmVkIGFnYWluLiAKLQkJLy8gVGhpcyBzdGVwIGlzIGNyaXRpY2FsIHNpbmNlIHRoZSBmaXJzdCByb3VuZCBvbmx5IGNyZWF0ZWQgdGhlIGRhdGEgc3RydWN0dXJlCi0JCS8vIHNvbWUgb2YgdGhlIGNyb3NzLXJlZmVyZW5jZWQgZWxlbWVudHMgbWlnaHQgYmUgbG9zdCBvbiB0aGUgZmlyc3Qgc2F2aW5nCi0JCS8vIGZvciBleGFtcGxlLCB3aGVuIGNyZWF0ZSBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggcmVmZXJlbmNlcyB0byBhIG5ldyBwbHVnaW4sCi0JCS8vIHdoaWNoIGFyZSBub3Qgc2F2ZWQgeWV0LCB0aG9zZSByZWZlcmVuY2VzIHdpbGwgYmUgbG9zdC4KLQkJLy8gMTQ1ODkxIC0gSW1wb3J0IENvbmZpZ3VyYXRpb246IGRlZmF1bHQgY29uZmlnIGlzIGxvc3MgYWZ0ZXIgaW1wb3J0Ci0JCWhhbmRsZU5ld1Jlc291cmNlcyhvbGRSZXNvdXJjZXMpOwotCQkKLQkJaGFuZGxlTmFtZVJlcGxhY2UocmVuYW1lRWxlbWVudE1hcCk7Ci0JCQotCQlkaWFncmFtSGFuZGxlci5wb3N0UmVnaXN0ZXJFbGVtZW50cygpOwotCQkKLQkJLy8gZ2V0IGFsbCB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzIGFuZCByZXNvdXJjZSBmaWxlcwotCQkvLyBjaGVjayBDTSBmb3IgZmlsZSBjaGVjay1vdXQKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hlY2sgb3V0IGZpbGVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIGNsZWFyIHJlc291cmNlcyBmb3IgZGVsZXRlZCBlbGVtZW50cwotCQlkZWxldGVSZXNvcnVjZXMoKTsKLQkKLQkJY2hlY2tNb2RpZmllZEZpbGVzKCk7Ci0JCQkJCi0JCWlmICggZmlsZUNoZWNrZWRPdXRTdGF0dXMuaXNPSygpICkgewotCQkgCi0JCQlpZiAoIGRlYnVnICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY29weWluZyByZXNvdXJjZSBmaWxlcyAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVzU2Nhbm5lci5leGVjdXRlKCk7Ci0JCQlkaWFncmFtSGFuZGxlci5leGVjdXRlKCk7Ci0KLQkJCWlmICggZGVidWcgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZpbmcgbGlicmFyeSAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlpZiAoISBjb25maWdGb2xkZXJFcnJvcikgewotCQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCQlsb2NrVW5sb2NrZWRQbHVnaW5zKHVubG9ja2VkUGx1Z2lucyk7Ci0JCQkJfQotCQkJCUxpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGJhc2VMaWJyYXJ5LCBmYWxzZSwgZmFsc2UpOwotCQkJfQotCQl9IAotCQllbHNlIHsKLQkJCWZpbGVDaGVja091dEVycm9yKCk7Ci0JCX0JCi0vLyBpZiAoIGRlYnVnICkgewotLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb3B5aW5nIHJlc291cmNlIGZpbGVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0vLyB9Ci0vLwotLy8gLy8gQ29weSB0aGUgcmVzb3VyY2UgZmlsZXMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSB0byB0aGUgbmV3IGxpYnJhcnkuCi0vLyAvLyBGb3Igc2ltcGxpY2l0eSBzYWtlLCBjb3B5IGFsbCByZXNvdXJjZSBmaWxlcyBpZiB0aGUgZmlsZXMgZG8gbm90Ci0vLyAvLyBleGlzdCBpbiB0aGUgdGFyZ2V0IGxpYnJhcnkgb3IgaWYgdGhlIGZpbGVzIGFyZSBuZXdlci4KLS8vIFN0cmluZyBpbmNsdWRlcyA9ICJyZXNvdXJjZXMvKiosICoqL3Jlc291cmNlcy8qKiI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLyBMYXlvdXRSZXNvdXJjZXMuY29weURpcihzcmNEaXIsIGRlc3REaXIsIGluY2x1ZGVzLCBudWxsKTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNZXJnaW5nIGNvbmZpZ3VyYXRpb24gZG9uZS4uLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZmlsZUNoZWNrT3V0RXJyb3IoKSB7Ci0JCS8vIGxvZyBlcnJvcgotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydENvbmZpZ1dpemFyZF90aXRsZTsgCi0JCQkJU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX0VSUl9JbXBvcnRfY29uZmlndXJhdGlvbjsgCi0JCQkJbmV3IE1zZ0RpYWxvZyhJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpKQotCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2csIGZpbGVDaGVja2VkT3V0U3RhdHVzKTsKLQkJCQl9Ci0JCX0pOwotCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNoZWNrb3V0IGZpbGVzIGZhaWxlZCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlTmV3UmVzb3VyY2VzKExpc3Qgb2xkUmVzb3VyY2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlTGlicmFyeS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpaXQubmV4dCgpOwotCQkJaWYgKCAhb2xkUmVzb3VyY2VzLmNvbnRhaW5zKHJlcykgKSB7Ci0JCQkJbG9nTmV3UmVzb3VyY2UocmVzKTsKLQkJCX0KLQkJfQkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSBkaWZmIHRyZWUuIE9ubHkgbmVlZCB0byBkbyB0aGUgZmlyc3QgbGV2ZWwgc2luY2UgdGhlCi0JICogcmVwbGFjZSBvciBhZGQgaXMgZG9uZSBhdCB0aGUgbWV0aG9kIHBhY2thZ2UgbGV2ZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaWZmVHJlZShFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUsCi0JCQlib29sZWFuIHJlcGxhY2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkaWZmVHJlZSA9PSBudWxsIHx8ICFpc1NlbGVjdGVkKGRpZmZUcmVlKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIFRoZXJlIGlzIGEgY2hhbmdlLgotCQlpbnQgc3RhdGUgPSBkaWZmVHJlZS5nZXREaWZmU3RhdGUoKTsKLQkJTWV0aG9kRWxlbWVudCBiYXNlID0gZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKTsKLQkJTWV0aG9kRWxlbWVudCBpbXAgPSBkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCk7Ci0JCWlmIChyZXBsYWNlRXhpc3RpbmcgJiYgKHN0YXRlID09IEVsZW1lbnREaWZmVHJlZS5ESUZGX1NUQVRFX0NIQU5HRUQpICkgewotCi0JCQlpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCQkvLyByZXBsYWNlIHRoZSBjb25maWd1cmF0aW9uIGJ5IGFkZGluZyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlCi0JCQkJLy8gY29uZmlndXJhdGlvbgotCQkJCWRvUmVwbGFjZUNvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pIGJhc2UsIChNZXRob2RDb25maWd1cmF0aW9uKSBpbXApOwotCQkJfQotCQkJZWxzZSBpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSkgewotCQkJCS8vIFJlcGxhY2UgdGhlIHBsdWdpbiB3aXRoIHRoZSBub24tcGFja2FnZSBmZWF0dXJlcy4KLQkJCQlkb1JlcGxhY2VQbHVnaW4oKE1ldGhvZFBsdWdpbikgYmFzZSwgKE1ldGhvZFBsdWdpbikgaW1wKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCAoYmFzZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpKSB7Ci0JCQkJLy8gUmVwbGFjZSB0aGUgcGFja2FnZS4KLQkJCQlkb1JlcGxhY2VQYWNrYWdlKChNZXRob2RQYWNrYWdlKSBiYXNlLCAoTWV0aG9kUGFja2FnZSkgaW1wKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2hhdCBpcyB0aGlzOiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoYmFzZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHN0YXRlID09IEVsZW1lbnREaWZmVHJlZS5ESUZGX1NUQVRFX05FVykgewotCQkJLy8gQWRkIHRoZSBuZXcgcGFja2FnZSBmcm9tIGltcG9ydCBsaWJyYXJ5LgotCQkJZG9BZGQoZGlmZlRyZWUuZ2V0QmFzZVBhcmVudEVsZW1lbnQoKSwgZGlmZlRyZWUuZ2V0SW1wb3J0RWxlbWVudCgpKTsgCi0JCX0KLQotCQkvLyBQcm9jZXNzIHRoZSBjaGlsZHJlbiByZWN1cnNpdmVseSBpZiBpdCdzIG5vdCBhIG5ldyBvbmUuCi0JCWlmIChzdGF0ZSAhPSBFbGVtZW50RGlmZlRyZWUuRElGRl9TVEFURV9ORVcpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSBkaWZmVHJlZS5nZXRDaGlsZHJlbigpOwotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4uc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCXByb2Nlc3NEaWZmVHJlZSgoRWxlbWVudERpZmZUcmVlKSBpdC5uZXh0KCksCi0JCQkJCQkJcmVwbGFjZUV4aXN0aW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgcmVwbGFjaW5nIHRoZSBub24tcGFja2FnZSBmZWF0dXJlcywgYW5kCi0JICogYWRkaW5nIHRoZSBuZXcgcGFja2FnZXMgaW50byB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gbmV3T2JqCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZUNvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBvbGRPYmosIE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3T2JqKQotCXsKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMob2xkT2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQkJLy8gZG9uJ3QgZGVsZXRlIG9sZCBmZWF0dXJlIHZhbHVlcwotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLS8vIHByaXZhdGUgdm9pZCBtZXJnZUVsZW1lbnRMaXN0KExpc3Qgc291cmNlLCBMaXN0IHRhcmdldCkKLS8vIHsKLS8vIExpc3QgaWRzID0gbmV3IEFycmF5TGlzdCgpOwotLy8gZm9yICggSXRlcmF0b3IgaXQgPSB0YXJnZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0vLyB7Ci0vLyBNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0vLyBpZHMuYWRkKGUuZ2V0R3VpZCgpKTsKLS8vIH0KLS8vCi0vLyBmb3IgKCBJdGVyYXRvciBpdCA9IHNvdXJjZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLS8vIHsKLS8vIE1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLS8vIGlmICggIWlkcy5jb250YWlucyhlLmdldEd1aWQoKSkgKQotLy8gewotLy8gdGFyZ2V0LmFkZChlKTsKLS8vIH0KLS8vIH0KLS8vIH0KLQotCS8qKgotCSAqIHJlcGxhY2UgdGhlIHBsdWdpbiBmZWF0dXJlcywgYnV0IG5vdCB0aGUgcGx1Z2luIG9iamVjdCBhbmQgaXQncyBwYWNrYWdlcwotCSAqIAotCSAqIEBwYXJhbSBvbGRPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb1JlcGxhY2VQbHVnaW4oTWV0aG9kUGx1Z2luIG9sZE9iaiwgTWV0aG9kUGx1Z2luIG5ld09iaikgewotCQlpZiAoIGlzUmVwbGFjZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZXRSZXBsYWNlZChvbGRPYmopOwotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQlpZiAoIGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkgKQotCQkJCXsKLQkJCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCB0cnVlKTsKLQkJCQl9Ci0JCQkJLyogTm8sIGRvbid0IGRvIHRoaXMsIGZpeCB0aGUgZGlmZiBtYW5hZ2VyIHRvIGluY2x1ZGUgdGhlIHJvb3QgcGFja2FnZSBpbnN0ZWFkCi0JCQkJICogMTUwODk1IC0gSW1wb3J0IENvbmZpZzogQ3VzdG9tQ2F0ZWdvcnkgZGlkIG5vdCBzeW5jIHVwIGJ5IGltcG9ydAotCQkJCWVsc2UgewotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcmllcyBwYWNrYWdlIG5lZWRzIHNwZWNpYWwgaGFuZGluZwotCQkJCQkvLyB3ZSBuZWVkIHRvIHN0YXJ0IHdpdGggdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5IG90aGVyd2lzZQotCQkJCQkvLyBhbGwgY2hpbGQgY2F0ZWdvcmllcyB3aWxsIGJlIGxvc3QKLQkJCQkJTWV0aG9kUGFja2FnZSBvbGRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShvbGRPYmosIE1vZGVsU3RydWN0dXJlLkRFRkFVTFRfQ1VTVE9NX0NBVEVHT1JZX1BBVEgpOwotLy8gQ29udGVudFBhY2thZ2UgbmV3UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobmV3T2JqLAotLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5ERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIKTsKLQkJCQkJc2V0UmVwbGFjZWQob2xkUGtnKTsKLQkJCQkJCi0JCQkJCS8vIGZpbmQgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3J5IGFuZCBzdGFydCBmcm9tIHRoZXJlCi0JCQkJCUN1c3RvbUNhdGVnb3J5IG9sZENDID0gVG5nVXRpbC5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkob2xkT2JqKTsKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgbmV3Q0MgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShuZXdPYmopOwotCQkJCQlvbGRQa2cgPSAoTWV0aG9kUGFja2FnZSlvbGRDQy5lQ29udGFpbmVyKCk7Ci0JCQkJCXNldFJlcGxhY2VkKG9sZFBrZyk7Ci0JCQkJCWRvUmVwbGFjZUVsZW1lbnQob2xkQ0MsIG5ld0NDKTsKLQkJCQl9Ci0JCQkJKi8KLQkJCX0KLQkJfQotCi0JfQotCi0KLQotCS8qKgotCSAqIFJlcGxhY2VzIHRoZSBhdHJyaWJ1dGVzIGFuZCBjb250YWluZWQgZWxlbWVudHMsIGJ1dCBub3QgdGhlIGNoaWxkCi0JICogcGFja2FnZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZXBsYWNlUGFja2FnZShNZXRob2RQYWNrYWdlIG9sZE9iaiwgTWV0aG9kUGFja2FnZSBuZXdPYmopIHsKLQkJaWYgKCBpc1JlcGxhY2VkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQotCQlpZiAoIGRlYnVnICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNpbmcgcGFja2FnZSAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob2xkT2JqKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkKLQkJYm9vbGVhbiBpc1Byb2Nlc3NQYWNrYWdlID0gb2xkT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2U7Ci0JCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSAmJgotCQkJCQkgIWlzUHJvY2Vzc1BhY2thZ2UpCi0JCQkJewkJCQkJCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0vLyBwcml2YXRlIE1ldGhvZEVsZW1lbnQgb2JqT2xkID0gbnVsbDsKLS8vIHByaXZhdGUgTWV0aG9kRWxlbWVudCBvYmpOZXcgPSBudWxsOwotLy8gcHJpdmF0ZSB2b2lkIHRlc3RJdCgpIHsKLS8vIGlmICggb2JqT2xkICE9IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIk9sZCBjb250YWluZXIgPSIgKyBvYmpPbGQuZUNvbnRhaW5lcigpKTsKLS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTmV3IGNvbnRhaW5lciA9IiArIG9iak5ldy5lQ29udGFpbmVyKCkpOwotLy8gaWYgKCBvYmpPbGQuZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIm9sZCBpcyBnb25lISIpOwotLy8gfQotLy8gaWYgKCBvYmpOZXcuZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBpcyBnb25lISIpOwotLy8gfQotLy8gfQotLy8gfQotCQotCS8qKgotCSAqIHJlcGxhY2UgdGhlIGVsZW1lbnQgYnkgcmVwbGFjaW5nIHRoZSBmZWF0dXJlIHZhbHVlcywgYnV0IGRvbid0IHJlcGxhY2UKLQkgKiB0aGUgb2JqZWN0IGlmIGl0IGlzIG1hcmtlZCBhcyBub3QgcmVwbGFjZWFibGUuIHJlY3Vyc2l2ZSB0aGUgZmVhdHVyZQotCSAqIHZhbHVlIGFuZCByZXBsYWNlIGl0Ci0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvUmVwbGFjZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBvbGRPYmosIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB7Ci0JCQotCQkvLyBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHJlcGxhY2VkIG9yIG5vdAotCQlpZiAoIGlzUmVwbGFjZWQob2xkT2JqKSApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICggZGlmZk1nci5zZWxlY3RhYmxlKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoICFpc1NlbGVjdGVkKG9sZE9iaikgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGlmIGNvbnRlbnQgZGVzY3JpcHRpb24sIGNoZWNrIGlmIGl0J3MgY2hhbmdlZCBvciBub3QKLQkJaWYgKCAob2xkT2JqIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAmJiAobmV3T2JqIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSApIHsKLQkJCWlmICggTGlicmFyeVV0aWwuaXNJZGVudGljYWwoKENvbnRlbnREZXNjcmlwdGlvbilvbGRPYmosIChDb250ZW50RGVzY3JpcHRpb24pbmV3T2JqKSApIHsKLQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IG9sZE9iai5lUmVzb3VyY2UoKTsKLQkJCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSWRlbnRpY2FsIGVsZW1lbnQgbm90IHJlcGxhY2VkOiAiICsgcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpICk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBldmVuIHRob3VnaCB0aGUgY29udGVudCBpcyB0aGUgc2FtZSwgd2Ugc3RpbGwgbmVlZCB0byBjb3B5IHRoZSByZXNvdXJjZXMKLQkJCQlzY2FuUmVzb3VyY2VzKG9sZE9iaiwgdHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfSAKLQkJfQotCQkKLQkJLy8gc2V0IHJlcGFsY2VkIGZpcnN0IHRvIGF2b2lkIGNhbGxpbmcgaW50byB0aGUgc2FtZSBvYmplY3QgcmVjdXJzaXZlbHkKLQkJc2V0UmVwbGFjZWQob2xkT2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlcGxhY2luZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShvbGRPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMob2xkT2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBvbGRPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0KLQkJCQkvLyBwYWNrYWdlIHN0cnVjdHVyZSBpcyBoYW5kbGVkIGJ5IHRoZSBkaWZmIHRyZWUKLQkJCQkvLyBzbyB3ZSBkb24ndCBwcm9jZXNzIHRoZSByZWxhdGVkIGZlYXR1cmUKLQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2VzKCkKLQkJCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgCi0JCQkJCQl8fCBmZWF0dXJlLmlzRGVyaXZlZCgpICkKLQkJCQl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCQkJCXNldEZlYXR1cmVWYWx1ZShvbGRPYmosIGZlYXR1cmUsIG5ld1ZhbHVlLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBuZXcgdmFsdWUgZnJvbSB0aGUgaW1wb3J0aW5nIGxpYnJhcnkgdG8gdGhlIG9sZCBvYmplY3QgaW4gdGhlCi0JICogYmFzZSBsaWJyYXJ5LiBpZiB0aGUgdmFsdWUgb3Igb25sZSBvZiB2YWx1ZXMgYXJlIG5vdCByZXBsYWNlYWJsZSwgc3VhY2gKLQkgKiBhcyBNZXRob2RMaWJyYXJ5LCBNZXRob2RQbHVnaW4sIE1ldGhvZFBhY2thZ2UsIGV0YywgdGhvc2UgdmFsdWVzIHNob3VsZAotCSAqIGJlIHN1YnN0aXR1ZWQgd2l0aCB0aGUgb25lIGluIHRoZSBvbGQgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQkKLQotCXN0YXRpYyBNZXRob2RFbGVtZW50IG5ld0NvbnQgPSBudWxsOwotCXN0YXRpYyBNZXRob2RFbGVtZW50IG5ld0VsZW0gPSBudWxsOwotCXByaXZhdGUgdm9pZCBzZXRGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlLCBib29sZWFuIGRvRGVsZXRlKQotCXsJCQotCQlpZiAoIGNhbklnbm9yZShmZWF0dXJlKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBvbGROb3RpZnkgPSBlbGVtZW50LmVEZWxpdmVyKCk7Ci0JCXRyeQotCQl7Ci0JCQkvLyB0dXJuIG9mZiBub3RpZmljYXRpb25zIHRvIGF2b2lkIHBvc3NpYmxlIGRlYWRsb2NrIG9yIHRocmVhZCBpc3N1ZQotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkKLQkJCWlmICggY2FuUmVzZXQoZmVhdHVyZSkgKSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKCBmZWF0dXJlLmlzTWFueSgpICYmIG5ld1ZhbHVlIGluc3RhbmNlb2YgTGlzdCkKLQkJCXsKLQkJCQlMaXN0IG9sZFZhbHVlID0gKExpc3QpZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCWlmIChmZWF0dXJlLmdldE5hbWUoKS5lcXVhbHMoIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJCXNldE1lcEZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCBvbGRWYWx1ZSwgKExpc3QpIG5ld1ZhbHVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlFbGVtZW50TGlzdERpZmYgZGlmZiA9IG5ldyBFbGVtZW50TGlzdERpZmYob2xkVmFsdWUsIChMaXN0KW5ld1ZhbHVlKTsKLQkJCQlpZiAoIGRvRGVsZXRlICYmIGRpZmYuZGVsZXRlZEl0ZW1zLnNpemUoKSA+IDAgKSB7Ci0JCQkJCW9sZFZhbHVlLnJlbW92ZUFsbChkaWZmLmRlbGV0ZWRJdGVtcyk7Ci0JCQkJCWxvZ1JlbW92ZWRFbGVtZW50cyhkaWZmLmRlbGV0ZWRJdGVtcyk7Ci0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgRGVsZXRpbmcgZmVhdHVyZSB2YWx1ZSwgZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpICsgIiwgIGVsZW1lbnQ6ICIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkrIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgdmFsdWVzOiAiICsgIGRpZmYuZGVsZXRlZEl0ZW1zKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCBkaWZmLm5ld0l0ZW1zLnNpemUoKSA+IDAgKSB7CQkJCQkKLQkJCQkJLy8gc2F2ZSB0aGUgbmV3IGVsZW1lbnRzIGFuZCBmaXggdGhlIHJlZmVyZW5jZXMgbGF0ZXIKLQkJCQkJLy8gbm90ZTogdGhlIG5ld2x5IGFkZGVkIGZlYXR1cmUgdmFsdWVzIG1pZ2h0IG5vdCBiZSBSRUFMTFkKLQkJCQkJLy8gbmV3IGVsZW1lbnQgdG8gdGhlIGJhc2UgbGlicmFyeQotCQkJCQkvLyBpdCBtaWdodCBiZSBqdXN0IGEgbmV3bHkgYWRkZWQgcmVmZXJlbmNlLCBzbyBjaGVjayBhbmQKLQkJCQkJLy8gbWFrZSBzdXJlCi0JCQkJCS8vIGlmIGl0J3Mgb2xkIGVsZW1lbnQsIGRvIHJlcGxhY2UgYWdhaW4KLQkJCQkJZm9yICggSXRlcmF0b3IgaXRuID0gZGlmZi5uZXdJdGVtcy5pdGVyYXRvcigpOyBpdG4uaGFzTmV4dCgpOyApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpaXRuLm5leHQoKTsKLQkJCQkJCQotCQkJCQkJLy8gb25seSBwcm9jZXNzIHRoZSBuZXcgb2JqZWN0IGlmIGl0J3Mgc2VsZWN0ZWQKLQkJCQkJCWlmICggaXNTZWxlY3RlZChuZXdPYmopICkgewotCQkJCQkJCU1ldGhvZEVsZW1lbnQgb2xkT2JqID0gZGlmZk1nci5nZXRFeGlzdGluZ0VsZW1lbnQobmV3T2JqLmdldEd1aWQoKSk7Ci0JCQkJCQkJaWYgKCBvbGRPYmogPT0gbnVsbCApIHsKLQkJCQkJCQkJb2xkVmFsdWUuYWRkKG5ld09iaik7Ci0JCQkJCQkJCS8vbG9nTmV3RWxlbWVudChuZXdPYmopOwotCQkJCQkJCQlsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihuZXdPYmopOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCW9sZFZhbHVlLmFkZChvbGRPYmopOwotCQkJCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZE9iaiwgbmV3T2JqKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgQWRkaW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlczogIiArICBkaWZmLm5ld0l0ZW1zKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCQotCQkJCX0KLQotCQkJCWlmICggZGlmZi5vbGROZXdNYXAuc2l6ZSgpID4gMCApIHsKLQkJCQkJZm9yICggSXRlcmF0b3IgaXQgPSBkaWZmLm9sZE5ld01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG9sZE9iaiA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldEtleSgpOwotCQkJCQkJCi0JCQkJCQkvLyBvbmx5IHByb2Nlc3MgdGhlIG5ldyBvYmplY3QgaWYgaXQncyBzZWxlY3RlZAotCQkJCQkJaWYgKCAhaXNTZWxlY3RlZChvbGRPYmopICkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlNZXRob2RFbGVtZW50IG5ld09iaiA9IChNZXRob2RFbGVtZW50KWVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJCQlpZiAoIGNhblJlc2V0KG9sZE9iaikgKSB7Ci0JCQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIFJlc2V0dGluZyBmZWF0dXJlIHZhbHVlLCBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXROYW1lKCkgKyAiLCAgZWxlbWVudDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlOiAiICsgIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG9sZE9iaikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCi0JCQkJCQkJRWNvcmVVdGlsLnJlcGxhY2UoZWxlbWVudCwgZmVhdHVyZSwgb2xkT2JqLCBuZXdPYmopOwotCQkJCQkJCWxvZ1Jlc2V0RWxlbWVudChuZXdPYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlkb1JlcGxhY2VFbGVtZW50KG9sZE9iaiwgbmV3T2JqKTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQl7Ci0JCQkJLy8gaWYgdGhlIG9sZCBhbmQgbmV3IGVsZW1lbnQgYXJlIHRoZSBzYW1lLAotCQkJCS8vIG9ubHkgcmVwbGFjZSB0aGUgZmVhdHVyZSB2YWx1ZQotCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KWVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlNZXRob2RFbGVtZW50IG4gPSAoTWV0aG9kRWxlbWVudCluZXdWYWx1ZTsKLQkJCQkKLQkJCQkvLyBvbmx5IHByb2Nlc3MgdGhlIG5ldyBvYmplY3QgaWYgaXQncyBzZWxlY3RlZAotCQkJCWlmICggKG8gPT0gbnVsbCB8fCBpc1NlbGVjdGVkKG8pKSAmJiBpc1NlbGVjdGVkKG4pICkgewotCi0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgUmVwbGFjaW5naW5nIGZlYXR1cmUgdmFsdWUsIGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSArICIsICBlbGVtZW50OiAiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSArICIsIHZhbHVlOiAiICsgIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG8pKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCi0JCQkJCWlmICggbmV3VmFsdWUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gKSB7Ci0JCQkJCQkvLyBhbHdheXMgcmVwbGFjZSBjb250ZW50IGRlc2NyaXB0aW9uIChub3QgcmVzZXQpIHRvCi0JCQkJCQkvLyByZXNlcnZlIHRoZSBleGlzdGluZyByZXNvdXJjZSAoeG1pIGZpbGUpCi0JCQkJCQkvLyBzaW5jZSB0aGUgY29udGVudERlc2NyaXB0aW9uIGlzIHVuaXF1ZSB0aGUgYSBtZXRob2QKLQkJCQkJCS8vIGVsZW1lbnQsIHNvIHdlIGRvbid0IG5lZWQgdG8gY29tcGFyZSB0aGUgZ3VpZAotCQkJCQkJCQkJCQkJCi0JCQkJCQkvLyBpZiBib3RoIG9iamVjdCBoYXMgbm8gY29udGFpbmVyLCB0aGVyZSBpcyBubyBzdWNoCi0JCQkJCQkvLyBkZXNjcmlwdGlvbiwgaWdub3JlIGl0Ci0JCQkJCQlpZiAoIG8uZUNvbnRhaW5lcigpICE9IG51bGwgfHwgbi5lQ29udGFpbmVyKCkgIT0gbnVsbCApIHsKLQkJCQkJCQlpZiAoIG8uZUNvbnRhaW5lcigpID09IG51bGwgKSB7Ci0JCQkJCQkJCWVsZW1lbnQuZVNldChmZWF0dXJlLCBvKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZG9SZXBsYWNlRWxlbWVudChvLCBuKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBpZiB0aGUgZWxlbWVudCBjYW4gYmUgcmVwbGFjZWQsIHN1Y2ggYXMgZm9yCi0JCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbiBlbGVtZW50Ci0JCQkJCS8vIHNldCB0aGUgdmFsdWUgZGlyZWN0bHkKLQkJCQkJZWxzZSBpZiAoIGNhblJlc2V0KG4pICkgewotCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCS8vbG9nTmV3RWxlbWVudChuKTsKLQkJCQkJCWxvZ05ld0VsZW1lbnRVbmRlckV4aXN0aW5nUGx1Z2luKG4pOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJaWYgKCBvICE9IG51bGwgJiYgbiAhPSBudWxsICYmIG8uZ2V0R3VpZCgpLmVxdWFscyhuLmdldEd1aWQoKSkgKSB7Ci0JCQkJCQkJIGRvUmVwbGFjZUVsZW1lbnQobywgbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsJCQkJCQkJCQkJCQkJCi0JCQkJCQkJcmVnaXN0ZXJTZXRFbGVtZW50KGVsZW1lbnQsIGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJCQkKLQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQkJCS8vbG9nTmV3RWxlbWVudChuKTsKLQkJCQkJCQlsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkgKSB7Ci0JCQkJLy8gY2hlY2sgZGlmZmVyZW5jZSBuYW1lLCBpZiByZXBsYWNlLCBuZWVkIHRvIHJlbmFtZSByZXNvdXJjZXMgaWYgaWYgaGFzIGl0J3Mgb3duIHJlc291cmNlCi0JCQkJLy8gbGlrZSBjb250ZW50IGVsZW1lbnRzLCBwbHVnaW5zLCBjb25maWd1aXJhdGlvbnMsIGFuZCBwcm9jZXNzIGNvbXBvbmVudHMJCQkJCQotCQkJCWlmICghIChuZXdWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCVN0cmluZyBvbGROYW1lID0gKFN0cmluZyllbGVtZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkTmFtZSkpIHsJCQkJCQotCQkJCQllbnN1cmVVbmlxdWVOYW1lRm9yRXhpc3RpbmdFbGVtZW50KGVsZW1lbnQsIG9sZE5hbWUsIChTdHJpbmcpIG5ld1ZhbHVlLCByZW5hbWVFbGVtZW50TWFwKTsJCQkJCQkJCQkJCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJCQotCQkJCS8vIHNjYW4gYW5kIGNvcHkgdGhlIHJlc291cmNlcwotCQkJCXNjYW5SZXNvdXJjZXMoZWxlbWVudCwgZmVhdHVyZSwgbmV3VmFsdWUpOwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseQotCQl7Ci0JCQllbGVtZW50LmVTZXREZWxpdmVyKG9sZE5vdGlmeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWVwRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3Qgb2xkVmFsdWUsIExpc3QgbmV3VmFsdWUpIHsKLQkJaW50IHN6ID0gbmV3VmFsdWUuc2l6ZSgpOwotCQlpZiAob2xkVmFsdWUuc2l6ZSgpID09IHN6KSB7Ci0JCQlpZiAoc3ogPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWJvb2xlYW4gc2FtZSA9IHRydWU7Ci0JCQlmb3IgKGludCBpPTA7IGkgPCBzejsgaSsrKSB7Ci0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IG9sZE1lcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIG9sZFZhbHVlLmdldChpKTsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgbmV3TWVwID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgbmV3VmFsdWUuZ2V0KGkpOwotCQkJCWlmICghIG9sZE1lcC5nZXROYW1lKCkuZXF1YWxzKG5ld01lcC5nZXROYW1lKCkpIHx8Ci0JCQkJCSEgb2xkTWVwLmdldFZhbHVlKCkuZXF1YWxzKG5ld01lcC5nZXRWYWx1ZSgpKSkgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYW1lKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQkJCQkJCi0JCX0KLQkJb2xkVmFsdWUucmVtb3ZlQWxsKG9sZFZhbHVlKTsKLQkJb2xkVmFsdWUuYWRkQWxsKG5ld1ZhbHVlKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBzY2FuUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiByZWN1cnNpdmUpIHsKLQotCQlpZiAoIGVsZW1lbnQgPT0gbnVsbCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCWlmICggIShmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQlzY2FuUmVzb3VyY2VzKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCAhcmVjdXJzaXZlICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpaXQubmV4dCgpOwotCQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeQotCQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgCi0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKCBvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCXNjYW5SZXNvdXJjZXMoKE1ldGhvZEVsZW1lbnQpb2JqLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNjYW5SZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWRpYWdyYW1IYW5kbGVyLnJlZ2lzdGVyRWxlbWVudChlbGVtZW50KTsKLQkJCi0JCS8vIHNjYW4gdGhlIHJlc291cmNlcwotCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpICkgewotCQkJLy8gcHJvY2VzcyB0aGUgYXR0YWNobWVudHMKLQkJCVN0cmluZyB1cmxzID0gKFN0cmluZyluZXdWYWx1ZTsKLQkJCWlmICggKHVybHMgIT0gbnVsbCkgJiYgdXJscy5sZW5ndGgoKSAhPSAwICkgewotCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJscywgInwiKTsgLy8gdGhpcyBpcyBoYXJkY29kZWQgc29tZWhvdyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKLQkJCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQlyZXNTY2FubmVyLmNvcHlSZXNvdXJjZSAoZWxlbWVudCwgdXJsKTsKLQkJCQl9CQkJCQkJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoIG5ld1ZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotCQkJcmVzU2Nhbm5lci5zY2FuKGVsZW1lbnQsIG5ld1ZhbHVlLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgVVJJICkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJcmVzU2Nhbm5lci5jb3B5UmVzb3VyY2UgKCAoKFVSSSluZXdWYWx1ZSkuZ2V0UGF0aCgpLCBwbHVnaW4pOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRvQWRkKEVPYmplY3Qgb3duZXIsIE1ldGhvZEVsZW1lbnQgbmV3T2JqKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKChNZXRob2RFbGVtZW50KW5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyB0aGUgb3duZXIgY2FuIG9ubHkgYmUgbGlicmFyeSBhbmQgcGFja2FnZQotCQlpZiAob3duZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQllbnN1cmVVbmlxdWVOYW1lKG93bmVyLCBuZXdPYmosIHJlbmFtZUVsZW1lbnRNYXApOwotCQkKLQkJYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewkJCQotCQkJLy8gY2FuIGJlIGNvbmZpZ3VyYXRpb24gb3IgcGx1Z2luCi0JCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pbmV3T2JqOwkJCQkKLQkJCQkKLQkJCQljaGVja01vZGlmaWVkRmlsZXMoKTsJCQkJCi0JCQkJZXJyb3IgPSAhIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsJCQkJCi0JCQkJCQkJCQotCQkJCS8vIGRvbid0IGludGl0aWFsaXplIHRoZSBzdG9yYWdlIHNpbmNlIHRoaXMgd2lsbCByZWNyZWF0ZSB0aGUgZ2xvYmFsIHBhY2thZ2VzCi0JCQkJLy8gYW5kIHN1Y2ggY2F1c2luZyB0d28gc2V0IG9mIGdsb2JhbCBwYWNrYWdlcwotCQkJCS8vIDE0NTg1MCAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBDUC9EUHMgZGlkIG5vdCBzaG93biBpbiBhdXRoZXJpbmcKLQkJCQkvLyBNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pOwotCQkJCS8vIE5PLCBzaW5jZSB0aGUgZ2xvYmFsIHBhY2thZ2VzIGFyZSBhbHJlYWR5IGNyZWF0ZWQKLQkJCQlpZiAoIWVycm9yKSB7Ci0JCQkJCSgoTWV0aG9kTGlicmFyeSlvd25lcikuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4pOwotCQkJCQl0cnkgewotCQkJCQkJTXVsdGlGaWxlWE1JSGVscGVySW1wbC51bm1vZGlmaWVkR2V0VmFsdWUgPSB0cnVlOwotCQkJCQkJTGlicmFyeVV0aWwuc2F2ZUxpYnJhcnkoKE1ldGhvZExpYnJhcnkpb3duZXIsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLnVubW9kaWZpZWRHZXRWYWx1ZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCQkJCQkKLQkJCX0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiApIHsKLQkJCQljaGVja01vZGlmaWVkRmlsZXMoKTsJCQkJCi0JCQkJZXJyb3IgPSBjb25maWdGb2xkZXJFcnJvciB8fCAhIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsKLQkJCQlpZiAoIWVycm9yKSB7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpb3duZXI7Ci0JCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5hZGQoKE1ldGhvZENvbmZpZ3VyYXRpb24pbmV3T2JqKTsKLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKS5nZXRQZXJzaXN0ZXIoKTsKLQkJCQkJaWYgKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0JCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBpcCA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgcGVyc2lzdGVyOwotCQkJCQkJRmlsZSBjb25maWdGb2xkZXIgPSBpcC5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWIpOwotCQkJCQkJaWYgKGNvbmZpZ0ZvbGRlciAhPSBudWxsKSB7Ci0JCQkJCQkJaXAuc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGliLCBjb25maWdGb2xkZXIpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllcnJvciA9IHRydWU7Ci0JCQkJCQkJY29uZmlnRm9sZGVyRXJyb3IgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghIGVycm9yKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCU11bHRpRmlsZVhNSUhlbHBlckltcGwudW5tb2RpZmllZEdldFZhbHVlID0gdHJ1ZTsKLQkJCQkJCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeSgoTWV0aG9kTGlicmFyeSlvd25lciwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJTXVsdGlGaWxlWE1JSGVscGVySW1wbC51bm1vZGlmaWVkR2V0VmFsdWUgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXJyb3IgPSB0cnVlOwkJCQotCQkJfQotCQl9IGVsc2UgaWYgKCAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkmJiAob3duZXIuZUNvbnRhaW5lcigpICE9IG51bGwpIAotCQkJCSYmIChuZXdPYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSApIHsKLQkJCSgoTWV0aG9kUGFja2FnZSlvd25lcikuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSluZXdPYmopOwotCQl9IGVsc2UgewotCQkJZXJyb3IgPSB0cnVlOwotCQl9Ci0JCQkKLQkJaWYgKCBlcnJvciApIHsKLQkJCVN0cmluZyBvd25lclN0ciA9IG93bmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCA/IAotCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZSgoTWV0aG9kRWxlbWVudClvd25lcikgOiBvd25lci50b1N0cmluZygpOwotCQkJCQkKLQkJCVN0cmluZyBtc2cgPSAiY2FuJ3QgYWRkICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopIC8vJE5PTi1OTFMtMSQKLQkJCSsgIiB0byAiICsgb3duZXJTdHI7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihtc2cpOyAKLQkJCWlmICggZGVidWcgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlsb2dOZXdFbGVtZW50KG5ld09iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tNb2RpZmllZENvbmZpZ3MoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGNvbmZpZ0xpc3QgPSBMaWJyYXJ5VXRpbC5nZXRBc3NvY2lhdGVkQ29uZmlndXJhdGlvbnMocGx1Z2luKTsKLQkJTGlzdCBiYXNlQ29uZmlncyA9IGJhc2VMaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQlNYXAgYmFzZUNvbmZpZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxiYXNlQ29uZmlncy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgYmFzZUNvbmZpZ3MuZ2V0KGkpOwotCQkJYmFzZUNvbmZpZ01hcC5wdXQoY29uZmlnLmdldEd1aWQoKSwgY29uZmlnKTsKLQkJfQotCQlmaW5hbCBMaXN0IG1vZGlmaWVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjb25maWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBjb25maWdMaXN0LmdldChpKTsKLQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBiYXNlQ29uZmlnTWFwLmdldChjb25maWcuZ2V0R3VpZCgpKTsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJCVJlc291cmNlIHJlcyA9IGNvbmZpZy5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRGaWxlcy5hZGQocmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRGaWxlcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaWxlQ2hlY2tPdXRFcnJvcigpOwotCQkKLQkJcmV0dXJuIGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9JbnRlZ3JpdHlDaGVjaygpCi0JewkJCi0JCS8vIG5vdyB0aGUgbmV3bHkgYWRkZWQgZWxlbWVudHMgbWF5IGhhdmUgZmVhdHVyZSB2YWx1ZSBlbGVtZW50IHRoYXQKLQkJLy8gc3RpbGwgcG9pbnRpbmcgdG8gdGhlIGltcG9ydGluZyBsaWJyYXJ5Ci0JCS8vIHdlIG5lZWQgdG8gcmVwbGFjZSB0aG9zZSB3aXRoIHRoZSBvbmUgaW4gdGhlIGJhc2UgbGlicmFyeQotCQl3aGlsZSAobmV3RWxlbWVudHMuc2l6ZSgpID4gMCkgewotCQkJTWV0aG9kRWxlbWVudCBuZXdPYmogPSAoTWV0aG9kRWxlbWVudCluZXdFbGVtZW50cy5yZW1vdmUoMCk7Ci0JCQl0cnkgewotCQkJCWlmICggbmV3T2JqIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQgKSB7Ci0JCQkJCWZpeERpYWdyYW0oKERpYWdyYW1FbGVtZW50KW5ld09iaik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZml4TmV3RWxlbWVudFJlZmVyZW5jZXMobmV3T2JqKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiB3aGlsZSBmaXhpbmcgbmV3IGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHRoZSBjb25maWd1cmF0aW9ucyBuZWVkcyB0byBiZSBmaXhlZAotCQlMaXN0IGNvbmZpZ3MgPSBiYXNlTGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKWl0Lm5leHQoKTsKLQkJCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihudWxsLCBjb25maWcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHByb2Nlc3NlZE5ld0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQotCQotCS8qKgotCSAqIGl0ZXJhdGUgYWxsIGZlYXR1cmVzLCBpZiB0aGUgZmVhdHVyZSB2YWx1ZSByZWZlcmVuY2VzIGFuIGVsZW1lbnQgd2hpY2ggaXMKLQkgKiBhbiBvbGQgZWxlbWVudCwgcmVwbGFjZSBpdCB3aXRoIHRoZSBvbGQgZWxlbWVudC4gaWYgdGhlIGVsZW1lbnQgaXMgbmV3LAotCSAqIGl0ZXJhdGUgaXQncyBjb250YWlubWVudCBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4TmV3RWxlbWVudFJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJaWYgKCBwcm9jZXNzZWROZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwcm9jZXNzZWROZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpeGluZyBlbGVtZW50ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShuZXdPYmopKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG5ld09iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gbmV3T2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG5ld09iai5lR2V0KGZlYXR1cmUpOwotCi0JCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJCi0JCQkJCS8vIGZpeGluZyB0aGUgZmVhdHVyZSB2YWx1ZSBtYXkgY2F1c2UgdGhlIGxpc3QgdG8gY2hhbmdlCi0JCQkJCS8vIGl0ZXJhdGUgb24gYSBuZXcgY29weSB0byBhdm9pZAotCQkJCQkvLyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCQkJCWZvciAoSXRlcmF0b3IgaXQ9IG5ldyBBcnJheUxpc3QoKChMaXN0KXZhbHVlKSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIG8pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JfQotCQotCQotCXByaXZhdGUgdm9pZCBmaXhEaWFncmFtKERpYWdyYW1FbGVtZW50IG5ld09iaikgewkJCi0KLQkJaWYgKCBwcm9jZXNzZWROZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwcm9jZXNzZWROZXdFbGVtZW50cy5hZGQobmV3T2JqKTsKLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZpeGluZyBkaWFncmFtIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG5ld09iaikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMobmV3T2JqKTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBuZXdPYmouZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0KLQkJCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkKLQkJCQkJLy8gZml4aW5nIHRoZSBmZWF0dXJlIHZhbHVlIG1heSBjYXVzZSB0aGUgbGlzdCB0byBjaGFuZ2UKLQkJCQkJLy8gaXRlcmF0ZSBvbiBhIG5ldyBjb3B5IHRvIGF2b2lkCi0JCQkJCS8vIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJCQkJZm9yIChJdGVyYXRvciBpdD0gbmV3IEFycmF5TGlzdCgoKExpc3QpdmFsdWUpKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAoIG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCQkJCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSApIHsKLQkJCQkJCQkJZml4TmV3RWxlbWVudEZlYXR1cmVWYWx1ZShuZXdPYmosIGZlYXR1cmUsIG8pOwotCQkJCQkJCX0gZWxzZSBpZiAoIChvIGluc3RhbmNlb2YgRGlhZ3JhbUVsZW1lbnQpICkgewotCQkJCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudClvKTsKLQkJCQkJCQl9IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICkgewotCQkJCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgKSB7Ci0JCQkJCQlmaXhOZXdFbGVtZW50RmVhdHVyZVZhbHVlKG5ld09iaiwgZmVhdHVyZSwgdmFsdWUpOwotCQkJCQl9IGVsc2UgaWYgKCAodmFsdWUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgKSB7Ci0JCQkJCQlmaXhEaWFncmFtKChEaWFncmFtRWxlbWVudCl2YWx1ZSk7Ci0JCQkJCX0gCi0JCQkJfQotCQkJfQotCQl9CQotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgdmFsdWUgaXMgYW4gb2xkIGVsZW1lbnQgaW4gdGhlIGJhc2UsIGlmIHllcywgcmVwbGFjZSBpdCB3aXRoCi0JICogdGhlIG9sZCBvbmUgaWYgaXQncyBuZXcsIGl0ZXJhdGUgaXQncyBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gb2JqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpeE5ld0VsZW1lbnRGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG9iaikgewotCQlpZiAoICEob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggZGVidWcgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZpeGluZyBlbGVtZW50IGZlYXR1cmUgdmFsdWUgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICsgIiwgZmVhdHVyZT0iICsgZmVhdHVyZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQl0cnkKLQkJewotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkKLQkJCU1ldGhvZEVsZW1lbnQgbmV3T2JqID0gKE1ldGhvZEVsZW1lbnQpb2JqOwotCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSBnZXRSZXBsYWNlZChuZXdPYmouZ2V0R3VpZCgpKTsKLQkJCWlmICggb2xkT2JqID09IG51bGwgKSB7Ci0JCQkJLy8gZ2V0IGV4aXN0aW5nIGVsZW1lbnQsIGZvciBleGFtcGxlLCB0aGUgZ2xvYmFsIHBhY2thZ2VzIGluIHRoZQotCQkJCS8vIGNvbmZpZ3VyYXRpb24gZmVhdHVyZQotCQkJCW9sZE9iaiA9IGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpOwotCQkJfQotCQkJCi0JCQlpZiAoIG9sZE9iaiA9PSBudWxsICkgewotCQkJCS8vIGl0J3MgYSBuZXcgb25lCi0JCQkJZml4TmV3RWxlbWVudFJlZmVyZW5jZXMobmV3T2JqKTsKLQkJCX0gZWxzZSB7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJLy8gcmVwbGFjZSB0aGUgbmV3T2JqIHdpdGggdGhlIG9sZE9iagotCQkJCQlFY29yZVV0aWwucmVwbGFjZShlbGVtZW50LCBmZWF0dXJlLCBuZXdPYmosIG9sZE9iaik7IAotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIGlmIHJlcGxhY2UgZmFpbGVkLCByZW1vdmUgdGhlIGZlYXR1cmUKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShlbGVtZW50LCBmZWF0dXJlLCBuZXdPYmopOyAKLQkJCQkJaWYgKGRlYnVnICkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXBsYWNlaW5nIGZlYXR1cmUgdmFsdWUgZmFpbGVkIGZvciBlbGVtZW50IFsiICAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiXSwgZmVhdHVyZSBbIiAgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGZlYXR1cmUuZ2V0TmFtZSgpICsgIl0sIHZhbHVlPSIgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyBuZXdPYmogKyAiLiBUaGUgZmVhdHVyZSB2YWx1ZSBpcyByZW1vdmVkLiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9CQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJZWxlbWVudC5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5SZXNldChNZXRob2RFbGVtZW50IGUpIHsKLQkJYm9vbGVhbiByZXNldCA9IGZhbHNlOwotCQkKLQkJLy8gYW4gZWxlbWVudCBjYW4gYmUgcmVzZXQgaWYgeW91IGFyZSBzdXJlIHRoYXQgbm8gb3RoZXIgZWxlbWVudChzKQotCQkvLyByZWZlcmVuY2UgdG8gaXQKLQkJLy8gcmVzZXQgZWxlbWVudHMgbWF5IGhhdmUgcmVmZXJlbmNlcyB0byBvdGhlciBlbGVtZW50cyBpbiB0aGUgaW1wb3J0aW5nCi0JCS8vIGxpYnJhcnksIHRoYXQgbmVlZHMgdG8gYmUgZml4ZWQgbGF0ZXIKLQkJCi0JCS8vIGZvciBhbnl0aGluZyBjb250YWluZWQgYnkgQ29udGVudERlc2NyaXB0aW9uLCByZXNldCBpdAotCQlpZiAoIGUgPT0gbnVsbCAvKiB8fCBlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiAqLwotCQkJCXx8IGUgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkgewotCQkJcmVzZXQgPSB0cnVlOwotCQl9Ci0JCQkJCi0JCXJldHVybiByZXNldDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVzZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gZm9yIGFueXRoaW5nIGNvbnRhaW5lZCBieSBDb250ZW50RGVzY3JpcHRpb24sIHJlc2V0IGl0Ci0JCS8vIG5vIGRvbid0IHJlc2V0IHRoZSBzZWN0aW9ucyBzaW5jZSBpdCB3aWxsIGNhdXNlIHRoZSBvbmUgaW4gdGhlCi0JCS8vIGltcG9ydGluZyBsaWJyYXJ5IHJlbW92ZWQKLQkJLy8gd2hpY2ggY2F1c2VkIHByb2JsZW0gZm9yIFRhc2tEZXNjcmlwdGlvbiB3aGVyZSB0aGUgc2FtZSBmZWF0dXJlCi0JCS8vIChTdGVwcykgY2FuJ3QgZmluZCB0aGUgc3RlcHMgZnJvbSB0aGUgaW1wb3J0aW5nIGxpYnJhcnkKLQkJLy8gd2hpY2ggdGhlbiB3aWxsIHRyZWF0IHRoZSBzdGVwcyBpbiB0aGUgYmFzZSBsaWJyYXJ5IGJlaW5nIGRldGV0ZWQKLS8vIGlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSkgewotLy8gcmV0dXJuIHRydWU7Ci0vLyB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSWdub3JlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIGRvbid0IHJlc2V0IHRoZSBwbHVnaW4gbG9jayBzdGF0dXMKLQkJaWYgKCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIDE0NjE0NCAtIEltcG9ydCBDb25maWd1cmF0aW9uOiBzb21lIHVuY2hhbmdlIGVsZW1lbnRzIGRpc2FwcGVhciBpbiBhdXRob3JpbmcgYWZ0ZXIgaW1wb3J0Ci0JCS8vIHRoaXMgaXMgY2F1c2VkIGJ5IGEgYnVnIGluIEFydGlmYWN0SW1wbCwgd2hlbiBzZXRDb250YWluZXJBcnRpZmFjdCB0byBudWxsLCAKLQkJLy8gIGl0IHNldCB0aGUgZUNvbnRhaW5lciB0byBudWxsLCBpZiB0aGUgZUNvbnRhaW5lciBpcyBhIGNvbnRlbnQgcGFja2FnZSwgCi0JCS8vIHRoZSBhcnRpZmFjdCBpcyByZW1vdmVkIGZyb20gdGhlIHBhY2thZ2UKLQkJLy8gIHRoaXMgYnVnIHdpbGwgYmUgZml4ZWQgaW4gTTQuIAotCQkvLyBmb3Igbm93LCBpZ25vcmUgdGhpcyBmZWF0dXJlIHNpbmNlIHRoaXMgaXMgYW4gb3Bwb3NpdGUgZmVhdHVyZSwgd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgaXQJCi0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNSZXBsYWNlZChNZXRob2RFbGVtZW50IG9sZE9iaikgewotCQlyZXR1cm4gcmVwbGFjZWRFbGVtZW50TWFwLmNvbnRhaW5zS2V5KG9sZE9iai5nZXRHdWlkKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSZXBsYWNlZChNZXRob2RFbGVtZW50IG9sZE9iaikgewotCQlTdHJpbmcgZ3VpZCA9IG9sZE9iai5nZXRHdWlkKCk7Ci0JCWlmICggIXJlcGxhY2VkRWxlbWVudE1hcC5jb250YWluc0tleShndWlkKSApIHsKLQkJCXJlcGxhY2VkRWxlbWVudE1hcC5wdXQoZ3VpZCwgb2xkT2JqKTsKLQkJCXNldE1vZGlmaWVkKG9sZE9iaik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBvbGQgZWxlbWVudCBiZWVuIHJlcGxhY2VkCi0JICogCi0JICogQHBhcmFtIG9sZE9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0UmVwbGFjZWQoU3RyaW5nIGd1aWQpIHsKLQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXJlcGxhY2VkRWxlbWVudE1hcC5nZXQoZ3VpZCk7Ci0JfQotCQotCS8qKgotCSAqIHdoZW4gbmV3IGVsZW1lbnRzIGFyZSBhZGRlZCBpbnRvIHRoZSBsaWJyYXJ5LCB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZQotCSAqIGZpbGVzIG11c3QgYmUgY29waWVkIG92ZXIgYXMgd2VsbAotCSAqIAotCSAqIEBwYXJhbSBuZXdPYmoKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY29weU5ld0VsZW1lbnRSZXNvdXJjZXMoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJCi0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gbmV3T2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotLy8JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KGkpOwotLy8JCQkJT2JqZWN0IHZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgVVJJICkgewotLy8JCQkJCXJlc1NjYW5uZXIuY29weVJlc291cmNlKCgoVVJJKXZhbHVlKS5nZXRQYXRoKCkpOwotLy8JCQkJfSBlbHNlIGlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgKSB7Ci0vLwkJCQkJcmVzU2Nhbm5lci5zY2FuKG5ld09iaiwgKFN0cmluZyl2YWx1ZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJZm9yICggSXRlcmF0b3IgaXQgPSBuZXdPYmouZUNvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0vLwkJCWlmICggbyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0vLwkJCQljb3B5TmV3RWxlbWVudFJlc291cmNlcygoTWV0aG9kRWxlbWVudClvKTsKLS8vCQkJfQotLy8JCX0KLQkJCi0JCXNjYW5SZXNvdXJjZXMobmV3T2JqLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ05ld0VsZW1lbnQoTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIG9yaWdpbmFsIGxpYnJhcnkKLQkJLy8gc2luY2Ugd2UgaGF2ZSB0aGUgZ3VpZC1lbGVtZW50IG1hcCBidWlsZCB1cCBpbiB0aGUgZGlmZiBtYW5hZ2VyLAotCQkvLyBjaGVjayB0aGVyZQotCQlpZiAoICFuZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICYmIGRpZmZNZ3IuZ2V0RXhpc3RpbmdFbGVtZW50KG5ld09iai5nZXRHdWlkKCkpID09IG51bGwpIHsKLQkJCW5ld0VsZW1lbnRzLmFkZChuZXdPYmopOwotCQkJY29weU5ld0VsZW1lbnRSZXNvdXJjZXMobmV3T2JqKTsKLQkJCXNldE1vZGlmaWVkKG5ld09iaik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ1Jlc2V0RWxlbWVudChNZXRob2RFbGVtZW50IG5ld09iaikgewotCQlpZiAoICFuZXdFbGVtZW50cy5jb250YWlucyhuZXdPYmopICkgewotCQkJbmV3RWxlbWVudHMuYWRkKG5ld09iaik7Ci0JCQlzZXRNb2RpZmllZChuZXdPYmopOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZ05ld1Jlc291cmNlKFJlc291cmNlIHJlcyApIHsKLQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQotCQkJLy8gbWFyayB0aGUgcmVzb3VyY2UgYXMgZGlydHkgc28gdGhhdCB3ZSBjYW4gc2F2ZSBpdCBhZ2FpbgotCQkJLy8gdGhlIGZpcnN0IHNhdmUgbWF5IGxvc2UgY3Jvc3MgcmVmZXJlbmNlcyAKLQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCVN0cmluZyBmaWxlID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJaWYgKCAhbmV3UmVzb3VyY2VzLmNvbnRhaW5zKGZpbGUpICkgewotCQkJCW5ld1Jlc291cmNlcy5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ1JlbW92ZWRFbGVtZW50cyhMaXN0IGl0ZW1zKSB7Ci0JCQotCQlpZiAoIGl0ZW1zID09IG51bGwgfHwgaXRlbXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHJlbW92ZWQgZWxlbWVudHMgY2FuIGJlIHJlbW92ZWQgZnJvbSBhbnkgZmVhdHVyZQotCQkvLyBjaGVjayBpZiB0aGUgZWxlbWVudCdzIGNvbnRhaW5lciBpcyBudWxsCi0JCS8vIGlmIGlzLCB0aGVuIHRoZSBlbGVtZW50IGlzIGRlbGV0ZWQgYW5kIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgZGVsZXRlZAotCQkvLyBhcyB3ZWxsCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJaWYgKCAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgJiYgIWRlbGV0ZWRFbGVtZW50cy5jb250YWlucyhlKSApIHsJCQkKLQkJCQlkZWxldGVkRWxlbWVudHMuYWRkKGUpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRNb2RpZmllZChFT2JqZWN0IG9iaikgewotCQlpZiAoIG9iaiAhPSBudWxsICkgewotCQkJUmVzb3VyY2UgcmVzID0gb2JqLmVSZXNvdXJjZSgpOwotCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQlpZiAoICFyZXMuaXNNb2RpZmllZCgpICkgewotCQkJCQlyZXMuc2V0TW9kaWZpZWQodHJ1ZSk7CQkJCQotCQkJCX0KLS8vIH0gZWxzZSB7Ci0vLyBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIHJlc291cmNlIGZvciAiICsgb2JqKTsKLQkJCQkKLQkJCQlpZiAoZGVidWcgJiYgcmVzLmlzTW9kaWZpZWQoKSApIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb2RpZmllZDogIiArIHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRNb2RpZmllZFJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYikgewotCQkKLQkJLy8gYXZvaWQgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnQgcmVzb3VyY2VzCi0JCUxpc3QgbW9kaWZpZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlSZXNvdXJjZSByZXMgPSBsaWIuZVJlc291cmNlKCk7Ci0JCWlmICggcmVzICE9IG51bGwgKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gcmVzU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJcmVzID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCByZXMgIT0gbnVsbCAmJiByZXMuaXNNb2RpZmllZCgpICkgewotCQkJCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQkJaWYgKCBuZXdSZXNvdXJjZXMuY29udGFpbnMoZmlsZSkgKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCBkZWJ1ZyApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb3VyY2UgbW9kaWZpZWQ6ICIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9CQkKLQkJCQkJbW9kaWZpZWRMaXN0LmFkZChmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkTGlzdDsKLQl9Ci0KLQkvLyBjbGVhciByZXNvdXJjZXMgZm9yIGRlbGV0ZWQgZWxlbWVudHMKLQlwcml2YXRlIHZvaWQgZGVsZXRlUmVzb3J1Y2VzKCkgewotCQlpZiAoIGRlbGV0ZWRFbGVtZW50cy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSUZpbGVNYW5hZ2VyIGZpbGVNZ3IgPSBTZXJ2aWNlcy5nZXRGaWxlTWFuYWdlcigpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZWxldGVkRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQotCQkJRU9iamVjdCBvYmogPSBudWxsOwotCQkJaWYgKCBlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICkgewotCQkJCW9iaiA9ICgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpOwotCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiApIHsKLQkJCQlvYmogPSBlOwotCQkJfQotCQkJaWYgKCBvYmogIT0gbnVsbCApIHsKLQkJCQlSZXNvdXJjZSByZXMgPSBvYmouZVJlc291cmNlKCk7Ci0JCQkJaWYgKCByZXMgIT0gbnVsbCApIHsKLQkJCQkJU3RyaW5nIGZpbGUgPSByZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCWlmICggZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0aW5nIHJlc291cmNlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKCAhZmlsZU1nci5kZWxldGUoZmlsZSkgKSB7Ci0JCQkJCQlpZiAoIGRlYnVnICkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hYmxlIHRvIGRlbGV0ZSBmaWxlOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQl9Ci0JfQotCi0JCi0JcHVibGljIGNsYXNzIEVsZW1lbnRMaXN0RGlmZiB7Ci0KLQkJTGlzdCBuZXdJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBkZWxldGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyB1c2UgTGlua2VkSGFzaE1hcCB0byByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgdmFsdWVzCi0JCU1hcCBvbGROZXdNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCi0JCS8vIHdpdGggdGhlIG9sZCBhbmQgbmV3IGxpc3Qgb2YgTWV0aG9kRWxlbWVudHMsCi0JCS8vIGZpbmQgdGhlIGNvbW1vbiBvbmVzLCB0aGUgZGVsZXRlZCBvbmVzLCBhbmQgdGhlIG5ldyBvbmVzCi0JCXB1YmxpYyBFbGVtZW50TGlzdERpZmYoTGlzdCBvbGRMaXN0LCBMaXN0IG5ld0xpc3QpIHsKLQkJCS8vIE1hcCBvbGRMaXN0R3VpZE1hcCA9IGdldEd1aWRNYXAob2xkTGlzdCk7Ci0JCQlNYXAgbmV3TGlzdEd1aWRNYXAgPSBnZXRHdWlkTWFwKG5ld0xpc3QpOwotCi0JCQluZXdJdGVtcy5hZGRBbGwobmV3TGlzdCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBvbGRPYmogPSAoTWV0aG9kRWxlbWVudClpdC5uZXh0KCk7Ci0JCQkJU3RyaW5nIGd1aWQgPSBvbGRPYmouZ2V0R3VpZCgpOwotCQkJCU9iamVjdCBuZXdPYmogPSBuZXdMaXN0R3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJaWYgKCBuZXdPYmogIT0gbnVsbCApIHsKLQkJCQkJb2xkTmV3TWFwLnB1dChvbGRPYmosIG5ld09iaik7Ci0JCQkJCW5ld0l0ZW1zLnJlbW92ZShuZXdPYmopOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQkvLyBpdCdzIGJlZW4gZGVsZXRlZAotCQkJCQlkZWxldGVkSXRlbXMuYWRkKG9sZE9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBNYXAgZ2V0R3VpZE1hcChMaXN0IGl0ZW1zKSB7Ci0JCQlNYXAgbSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0PSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQltLnB1dChlLmdldEd1aWQoKSwgZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBtOwotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBIYW5kbGVzIG5hbWUgcmVwbGFjZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZU5hbWVSZXBsYWNlKE1hcCByZW5hbWVFbGVtZW50TWFwKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVuYW1lRWxlbWVudE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU9iamVjdFtdIHZhbCA9IChPYmplY3RbXSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzBdOwotCQkJU3RyaW5nIG5ld05hbWUgPSB2YWwubGVuZ3RoID09IDQgPyBlbGVtZW50LmdldEd1aWQoKSA6IChTdHJpbmcpIHZhbFsxXTsKLQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCWlmICh2YWwubGVuZ3RoID09IDQpIHsKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsyXTsKLQkJCQluZXdOYW1lID0gKFN0cmluZykgdmFsWzNdOwotCQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCQkKLQkJCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFswXTsKLQkJCQluZXdOYW1lID0gKFN0cmluZykgdmFsWzFdOwotCQkJCXJlbmFtZShlbGVtZW50LCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCQkKLQkJLy9NYWtlIHJlc291Y2VzIGRpcnR5IGFnYWluLCBhcyByZW5hbWUgcHJvY2VzcyB3b3VsZCBtYXJrIHJlc291Y2UgdW4tbW9kaWZpZWQKLQkJaXQgPSByZW5hbWVFbGVtZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0W10gdmFsID0gKE9iamVjdFtdKWVudHJ5LmdldFZhbHVlKCk7CQkJCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzBdOwotCQkJZWxlbWVudC5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiB8fCBlbGVtZW50LmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkKLQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJcHJvYy5zZXROYW1lKG5ld05hbWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW1lbnQsIG5ld05hbWUpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJTZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlTdHJpbmcgZ3VpZDAgPSAoKE1ldGhvZEVsZW1lbnQpbmV3VmFsdWUpLmdldEd1aWQoKTsKLQkJU3RyaW5nIGd1aWQxID0gZWxlbWVudC5nZXRHdWlkKCk7Ci0JCU9iamVjdFtdIHZhbCA9IG5ldyBPYmplY3RbM107Ci0JCXZhbFswXSA9IGZlYXR1cmU7Ci0JCXZhbFsxXSA9IG5ld1ZhbHVlOwotCQl2YWxbMl0gPSBlbGVtZW50OwotCQlpZiAoc2V0RWxlbWVudE1hcCA9PSBudWxsKSB7Ci0JCQlzZXRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlzZXRFbGVtZW50TWFwLnB1dChlbGVtZW50LmdldE5hbWUoKSArIGd1aWQwICsgZ3VpZDEsIHZhbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVTZXRFbGVtZW50cygpIHsKLQkJaWYgKHNldEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzZXRFbGVtZW50TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0W10gdmFsID0gKE9iamVjdFtdKWVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHZhbFswXTsKLQkJCU1ldGhvZEVsZW1lbnQgbmV3VmFsdWUgPSAoTWV0aG9kRWxlbWVudCkgdmFsWzFdOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIHZhbFsyXTsKLQkJCVN0cmluZyBndWlkID0gbmV3VmFsdWUuZ2V0R3VpZCgpOwotCQkJTWV0aG9kRWxlbWVudCBtZXJnZWRWYWx1ZSA9IChNZXRob2RFbGVtZW50KSByZXBsYWNlZEVsZW1lbnRNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKG1lcmdlZFZhbHVlICE9IG51bGwgJiYgbWVyZ2VkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbWVyZ2VkVmFsdWUpOwotCQkJfQkJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB1bmlxdWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVW5pcXVlTmFtZShFT2JqZWN0IG93bmVyLCBNZXRob2RFbGVtZW50IG5ld09iaiwgTWFwIHJlbmFtZUVsZW1lbnRNYXApIHsKLQkJaWYgKG93bmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlDbGFzcyBjbHMgPSBuZXdPYmouZ2V0Q2xhc3MoKTsKLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGkgPCBvd25lci5lQ29udGVudHMoKS5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9sZE9iaiA9IG93bmVyLmVDb250ZW50cygpLmdldChpKTsKLQkJCWlmIChvbGRPYmouZ2V0Q2xhc3MoKSA9PSBjbHMgJiYgb2xkT2JqICE9IG5ld09iaikgewotCQkJCU1ldGhvZEVsZW1lbnQgb2xkRWxlbSA9IChNZXRob2RFbGVtZW50KSBvbGRPYmo7Ci0JCQkJbmFtZU1hcC5wdXQob2xkRWxlbS5nZXROYW1lKCksIG9sZEVsZW0pOwotCQkJfQotCQl9Ci0JCVN0cmluZyBuYW1lID0gbmV3T2JqLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlbmFtZWQgPSBuYW1lOwotCQl3aGlsZSAobmFtZU1hcC5jb250YWluc0tleShyZW5hbWVkKSkgewotCQkJcmVuYW1lZCArPSAiX3JlbmFtZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHJlbmFtZWQgIT0gbmFtZSkgewotCQkJbmV3T2JqLnNldE5hbWUocmVuYW1lZCk7Ci0JCQkKLQkJCU9iamVjdFtdIGVudHJ5VmFsID0gbmV3IE9iamVjdFs0XTsKLQkJCWVudHJ5VmFsWzBdID0gbmV3T2JqOwotCQkJZW50cnlWYWxbMV0gPSBuYW1lOwotCQkJZW50cnlWYWxbMl0gPSBuYW1lTWFwLmdldChuYW1lKTsKLQkJCWVudHJ5VmFsWzNdID0gcmVuYW1lZDsKLQkJCXJlbmFtZUVsZW1lbnRNYXAucHV0KG5ld09iai5nZXRHdWlkKCksIGVudHJ5VmFsKTsJCQkKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHVuaXF1ZSBuYW1lIGZvciBleGlzdGluZyBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVVbmlxdWVOYW1lRm9yRXhpc3RpbmdFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lLCBNYXAgcmVuYW1lRWxlbWVudE1hcCkgewotCQlFT2JqZWN0IGVsZW1lbnRPd25lciA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwkJCQkJCi0JCWlmIChlbGVtZW50T3duZXIgIT0gbnVsbCkgewotCQkJZWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotCQkJZW5zdXJlVW5pcXVlTmFtZShlbGVtZW50T3duZXIsIGVsZW1lbnQsIHJlbmFtZUVsZW1lbnRNYXApOwotCQkJaWYgKCFlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMobmV3TmFtZSkpIHsJLy9pZiBoYW5kbGVkIHRoZW4gcmV0dXJuCi0JCQkJcmV0dXJuOwotCQkJfQkJCQotCQkJZWxlbWVudC5zZXROYW1lKG9sZE5hbWUpOwotCQl9CQkJCi0JCU9iamVjdFtdIGVudHJ5VmFsID0gbmV3IE9iamVjdFsyXTsKLQkJZW50cnlWYWxbMF0gPSBlbGVtZW50OwotCQllbnRyeVZhbFsxXSA9IG5ld05hbWU7Ci0JCXJlbmFtZUVsZW1lbnRNYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBlbnRyeVZhbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpZWRGaWxlcygpIHsKLQkJZmluYWwgTGlzdCBtb2RpZmllZEZpbGVzID0gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoYmFzZUxpYnJhcnkpOwotCQltb2RpZmllZEZpbGVzLmFkZEFsbChyZXNTY2FubmVyLmdldEZpbGVzVG9iZVJlcGxhY2VkKCkpOwotCQltb2RpZmllZEZpbGVzLmFkZEFsbChkaWFncmFtSGFuZGxlci5nZXRNb2RpZmllZEZpbGVzKCkpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgdW5sb2NrUGx1Z2lucygpIHsKLQotCQlMaXN0IHBsdWdpbklkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCU1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+KCk7Ci0JCU1hcDxTdHJpbmcsIE1ldGhvZFBsdWdpbj4gZ3VpZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kUGx1Z2luPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gYmFzZVBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGJhc2VQbHVnaW5zLmdldChpKTsKLQkJCW1hcC5wdXQocGx1Z2luLmdldE5hbWUoKSwgcGx1Z2luKTsKLQkJCWd1aWRNYXAucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQkJCi0JCWlmIChtYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gcGx1Z2luSWRzOwotCQl9Ci0JCQotCQlMaXN0IGZpbGVOYW1lVG9DaGVjayA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IGltcG9ydFBsdWdpbnMgPSBpbXBvcnRpbmdMaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaW1wb3J0UGx1Z2lucy5nZXQoaSk7Ci0JCQlTdHJpbmcgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZ3VpZCA9IHBsdWdpbi5nZXRHdWlkKCk7Ci0JCQkKLQkJCU1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luMCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJaWYgKGJhc2VQbHVnaW4wICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZTAgPSBiYXNlUGx1Z2luMC5nZXROYW1lKCk7Ci0JCQkJaWYgKCEgbmFtZTAuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJlbmFtZVBsdWdpbk1hcC5wdXQobmFtZTAsIG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBtYXAuZ2V0KG5hbWUpOwotCQkJYm9vbGVhbiB0b0FkZCA9IGZhbHNlOwotCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAmJiAhIGJhc2VQbHVnaW4uZ2V0R3VpZCgpLmVxdWFscyhndWlkKQotCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCXRvQWRkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmFzZVBsdWdpbiA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCWlmIChiYXNlUGx1Z2luICE9IG51bGwgLyomJiAhIGJhc2VQbHVnaW4uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSovCi0JCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCQl0b0FkZCA9IHRydWU7Ci0JCQkJfSAKLQkJCX0KLQkJCQotCQkJaWYgKHRvQWRkKXsJCQkJCi0JCQkJcGx1Z2luSWRzLmFkZChiYXNlUGx1Z2luLmdldEd1aWQoKSk7Ci0JCQkJYmFzZVBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJUmVzb3VyY2UgcmVzID0gYmFzZVBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlmaWxlTmFtZVRvQ2hlY2suYWRkKGZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCi0JCQotCQlpZiAoZmlsZU5hbWVUb0NoZWNrLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IGZpbGVOYW1lVG9DaGVjazsJCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gcGx1Z2luSWRzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1bmxvY2tlZFBsdWdpbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9ja1VubG9ja2VkUGx1Z2lucyhMaXN0IHVubG9ja2VkUGx1Z2lucykgewotCQlMaXN0IHBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHVubG9ja2VkUGx1Z2lucy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCXBsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbihmYWxzZSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dOZXdFbGVtZW50VW5kZXJFeGlzdGluZ1BsdWdpbihNZXRob2RFbGVtZW50IG5ld09iaikgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihuZXdPYmopOwotCQlTdHJpbmcgcGx1Z2luUGF0aCA9IGxpYlJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgobmV3T2JqKTsKLQkJaWYgKHBsdWdpblBhdGggIT0gbnVsbCkgewotCQkJbG9nTmV3RWxlbWVudChuZXdPYmopOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0RGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWQ0NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9QbHVnaW5JbXBvcnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkxpYnJhcnlMb2NhdGlvbkRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBpbnB1dCBkYXRhIHJlcXVpcmVkIHRvIGltcG9ydCBhIG1ldGhvZCBwbHVnLWluLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSW1wb3J0RGF0YSB7Ci0KLQkvLyB0aGVzZSBhcmUgc2V0IGJ5IHRoZSB3aXphcmQKLQlwdWJsaWMgTGlicmFyeUxvY2F0aW9uRGF0YSBsbERhdGEgPSBuZXcgTGlicmFyeUxvY2F0aW9uRGF0YSgpOwotCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlRXhpc3RpbmdQbHVnaW5zOwotCi0JLy8gdGhlc2UgYXJlIGZpbGxlZCBpbiBieSB0aGUgaW1wb3J0aW5nIHNlcnZpY2UKLQlwdWJsaWMgU3RyaW5nIGxpYnJhcnlWZXJzaW9uOwotCi0JcHJpdmF0ZSBMaXN0PFBsdWdpbkluZm8+IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PFBsdWdpbkluZm8+KCk7Ci0KLQlwcml2YXRlIExpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgRXJyb3JJbmZvIGVycm9yID0gbmV3IEVycm9ySW5mbygpOwotCi0JLy8gYXAgdGhlIGd1aWQgdG8gdXJsIGZvciBiYXNlIHBsdWdpbiwgdGhpcyBpcyB0aGUgb25seSBmb3JtYXRpb24gYXZhaWxhYmxlCi0JcHVibGljIE1hcCBiYXNlUGx1Z2luVXJsTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFBsdWdpbkltcG9ydERhdGEoKSB7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBjb250ZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJcGx1Z2lucy5jbGVhcigpOwotCQljb25maWdzLmNsZWFyKCk7Ci0JCWVycm9yLmVycm9yTWVzc2FnZS5zZXRMZW5ndGgoMCk7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBwbHVnaW5zLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUGx1Z2lucygpIHsKLQkJUGx1Z2luSW5mbyBpbmZvOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgcGx1Z2lucy5zaXplKCkpIHsKLQkJCWluZm8gPSAoUGx1Z2luSW5mbykgcGx1Z2lucy5nZXQoaSk7Ci0JCQlpZiAoaW5mby51cmwgPT0gbnVsbCkgewotCQkJCXBsdWdpbnMucmVtb3ZlKGkpOwotCQkJfSBlbHNlIHsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luSW5mbyBvYmplY3QgZ2l2ZW4gdGhlIGd1aWQuCi0JICovCi0JcHVibGljIFBsdWdpbkluZm8gZ2V0UGx1Z2luSW5mbyhTdHJpbmcgZ3VpZCkgewotCQlQbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3I8UGx1Z2luSW5mbz4gaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uZ3VpZC5lcXVhbHMoZ3VpZCkpIHsKLQkJCQlyZXR1cm4gaW5mbzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBQbHVnaW5JbmZvIG9iamVjdCBnaXZlbiB0aGUgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQbHVnaW5JbmZvKFN0cmluZyBndWlkKSB7Ci0JCVBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvcjxQbHVnaW5JbmZvPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaW5mby5ndWlkLmVxdWFscyhndWlkKSkgewotCQkJCXBsdWdpbnMucmVtb3ZlKGluZm8pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgQ29uZmlndWFyYXRpb25JbmZvIG9iamVjdCBnaXZlbiB0aGUgZ3VpZC4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndWFyYXRpb25JbmZvIGdldENvbmZpZ0luZm8oU3RyaW5nIGd1aWQpIHsKLQotCQlpZiAoIGd1aWQgPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0Q29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWNpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZ3VpZC5lcXVhbHMoY2luZm8uZ3VpZCkgKSB7Ci0JCQkJcmV0dXJuIGNpbmZvOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBQbHVnaW5JbmZvIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgUGx1Z2luSW5mbyBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3Q8UGx1Z2luSW5mbz4gZ2V0UGx1Z2lucygpIHsKLQkJcmV0dXJuIHBsdWdpbnM7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGEgbGlzdCBvZiBDb25maWdJbmZvIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb25maWdzKCkgewotCQlyZXR1cm4gY29uZmlnczsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGVycm9yIG1lc3NhZ2UgaWYgYW55Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvIGdldEVycm9ySW5mbygpIHsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCXB1YmxpYyBjbGFzcyBQbHVnaW5JbmZvIHsKLQotCQkvLyBJZiBub3QgbnVsbCwgdGhpcyBpcyBhIHZhbGlkIHBsdWctaW4uCi0JCXB1YmxpYyBTdHJpbmcgdXJsID0gbnVsbDsKLQotCQlwdWJsaWMgU3RyaW5nIG5hbWU7Ci0KLQkJcHVibGljIFN0cmluZyBndWlkOwotCi0JCXB1YmxpYyBTdHJpbmcgdmVyc2lvbjsKLQotCQlwdWJsaWMgU3RyaW5nIGJyaWVmX2Rlc2M7Ci0KLQkJcHVibGljIFN0cmluZyBhdXRob3JzOwotCi0JCXB1YmxpYyBTdHJpbmcgY2hhbmdlRGF0ZTsKLQotCQlwdWJsaWMgTGlzdCB1c2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBJZiBudWxsLCB0aGlzIHBsdWctaW4gZG9lcyBub3QgZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCXB1YmxpYyBNZXRob2RQbHVnaW4gZXhpc3RpbmdQbHVnaW4gPSBudWxsOwotCi0JCS8vIElmIHRydWUsIHJlcGxhY2UgdGhlIGN1cnJlbnQgcGx1Zy1pbiB3aXRoIHRoZSBvbmUgaW4gdGhlIGltcG9ydAotCQkvLyBsaWJyYXJ5LiBJZiBmYWxzZSwgZG9uJ3QgaW1wb3J0IHRoZSBwbHVnLWluLgotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3RlZCA9IGZhbHNlOwotCi0JCXB1YmxpYyBQbHVnaW5JbmZvKCkgewotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENvbmZpZ3VhcmF0aW9uSW5mbyB7Ci0KLQkJcHVibGljIFN0cmluZyBuYW1lOwotCi0JCXB1YmxpYyBTdHJpbmcgZ3VpZDsKLQotCQlwdWJsaWMgU3RyaW5nIHZlcnNpb247Ci0KLQkJLy8gVGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkJcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZXhpc3RpbmdDb25maWcgPSBudWxsOwotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdGVkID0gdHJ1ZTsKLQotCQlwdWJsaWMgQ29uZmlndWFyYXRpb25JbmZvKCkgewotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQotCQlwcml2YXRlIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJcHVibGljIEVycm9ySW5mbygpIHsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCWVycm9yTWVzc2FnZS5hcHBlbmQobWVzc2FnZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgewotCQkJcmV0dXJuIGVycm9yTWVzc2FnZS50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0TGVuZ3RoKDApOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL1BsdWdpbkltcG9ydGluZ1NlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0aW5nU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzM4MTNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUGx1Z2luSW1wb3J0aW5nU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkxpYnJhcnlWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkxpYnJhcnlEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEltcG9ydHMgYSBtZXRob2QgcGx1Zy1pbiBpbnRvIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSW1wb3J0aW5nU2VydmljZSB7Ci0KLQlwcml2YXRlIFVwZ3JhZGVDYWxsZXJJbmZvIHVwR3JhZGVJbmZvOwotCQotCS8vVGVtcCBmbGFnIGluZGljYXRpbmcgdXNlIG9mIHRoZSBuZXcgbWVyZ2Ugc2NoZW1lCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBuZXdNZXJnZVNjaGVtZSA9IHRydWU7IAotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCQotCXByaXZhdGUgUGx1Z2luSW1wb3J0RGF0YSBkYXRhOwotCQotCXByaXZhdGUgT2JqZWN0IHZhbGlkYXRlSG9va0RhdGE7Ci0KLQlMaWJyYXJ5RG9jdW1lbnQgaW1wb3J0aW5nTGliRG9jOwotCUxpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2M7Ci0KLQkvLyBGbGFnIHRvIGluZGljYXRlIHRoZSBmaWxlIGNoZWNrb3V0IHN0YXR1cy4KLQlJU3RhdHVzIGZpbGVDaGVja2VkT3V0U3RhdHVzID0gbnVsbDsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucyA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBGaWxlIGRlZmF1bHRDb25maWdGb2xkZXI7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWxlPiB0YXJnZXRGaWxlTWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luSW1wb3J0aW5nU2VydmljZShQbHVnaW5JbXBvcnREYXRhIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHBsdWctaW4gYWdhaW5zdCB0aGUgY3VycmVudCBsaWJyYXJ5LCBjb2xsZWN0cyBhbGwgdGhlCi0JICogaW5mb3JtYXRpb25zIGluY2x1ZGluZyBwbHVnLWluIGluZm8sIGNvbmZpZ3VhdGlvbiBpbmZvIGFuZCBlcnJvciBpbmZvLgotCSAqIENhbGwgdGhpcyBtZXRob2QsIHRoZW4gY2FsbCBnZXRFcnJvcigpLCBnZXRQbHVnaW5zKCksIGdldENvbmZpZ3MoKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzApOyAKLQkJCX0KLQotCQkJaWYgKHRoaXMuZGF0YSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl0aGlzLmRhdGEuY2xlYXIoKTsKLQotCQkJLy8gUHJlcGFyZSB0aGUgbGliIGZpbGVzLgotCQkJRmlsZSBpbXBvcnRpbmdMaWJQYXRoID0gbmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIExpYnJhcnlEb2N1bWVudC5leHBvcnRGaWxlKTsKLQkJCWlmICghaW1wb3J0aW5nTGliUGF0aC5leGlzdHMoKSkgewotCQkJCWRhdGEKLQkJCQkJCS5nZXRFcnJvckluZm8oKQotCQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCQlOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0cxLCBpbXBvcnRpbmdMaWJQYXRoLnRvU3RyaW5nKCkpKTsgCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlib29sZWFuIGhhbmRsZVZlcnNpb24gPSB0cnVlOwotCQkJaWYgKGhhbmRsZVZlcnNpb24pIHsKLQkJCQl1cEdyYWRlSW5mbyA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5VcGdyYWRlSW5mbyhVcGdyYWRlQ2FsbGVySW5mby51cGdyYWRlSW1wb3J0UGx1Z2luLCBpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQlpZiAoISBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5oYW5kbGVUb29sVmVyc2lvbihpbXBvcnRpbmdMaWJQYXRoLCB1cEdyYWRlSW5mbykpIHsKLQkJCQkJZGF0YQotCQkJCQkuZ2V0RXJyb3JJbmZvKCkKLQkJCQkJLmFkZEVycm9yKAotCQkJCQkJCU5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luLCBpbXBvcnRpbmdMaWJQYXRoLnRvU3RyaW5nKCkpKTsgCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKSAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydGluZ0xpYlBhdGggPSB1cEdyYWRlSW5mby5nZXRDb3BpZWRMaWJGaWxlKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgdmVyc2lvbkVycm9yID0gQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UudmVyc2lvbkNoZWNrKGltcG9ydGluZ0xpYlBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUpOwotCQkJCWlmICh2ZXJzaW9uRXJyb3IgIT0gbnVsbCkgewotCQkJCQlkYXRhLmdldEVycm9ySW5mbygpLmFkZEVycm9yKHZlcnNpb25FcnJvcik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXZhbGlkYXRlSG9vayhtb25pdG9yLCBpbXBvcnRpbmdMaWJQYXRoLCB2YWxpZGF0ZUhvb2tEYXRhKTsKLQotCQkJaW1wb3J0aW5nTGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChpbXBvcnRpbmdMaWJQYXRoKTsKLQkJCQotCQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJdGFyZ2V0TGliRG9jID0gbmV3IExpYnJhcnlEb2N1bWVudChsaWJGaWxlKTsKLQotCQkJc2NhbkxpYnJhcnlGaWxlKGltcG9ydGluZ0xpYkRvYyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSG9vayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZpbGUgaW1wb3J0aW5nTGliUGF0aCwgT2JqZWN0IG9iamVjdCkgewotCX0KLQkKLQkvKioKLQkgKiBQZXJmb3JtcyBpbXBvcnQuCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybUltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIG5lZWQgdG8gZGlzYWJsZSB0aGUgd29ya3NwYWNlIHJlZnJlc2hpbmcKLQkJYm9vbGVhbiByZWZyZXNoID0gUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmlzRW5hYmxlZCgpOwotCQl0cnkgewotCQkJaWYgKHJlZnJlc2gpIHsKLQkJCQkvLyBkaXNhYmxlIHJlc291cmNlIHJlZnJlc2hpbmcgZHVyaW5nIGltcG9ydAotCQkJCS8vCi0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCi0JCQlfX2RvSW1wb3J0KG1vbml0b3IpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVmcmVzaCkgewotCQkJCS8vIHJlLWVuYWJsZSByZXNvdXJjZSByZWZyZXNoaW5nCi0JCQkJLy8KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0KLQkJCWlmICh1cEdyYWRlSW5mbyAhPSBudWxsKSB7Ci0JCQkJdXBHcmFkZUluZm8ucmVtb3ZlQ29waWVkTGlicmFyeSgpOwotCQkJCXVwR3JhZGVJbmZvID0gbnVsbDsKLQkJCX0KLQkJCWRlZmF1bHRDb25maWdGb2xkZXIgPSBudWxsOwotCQkJdGFyZ2V0RmlsZU1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX19kb0ltcG9ydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzMpOyAKLQkJCX0KLQotCQkJTGlzdCB1bmxvY2tlZFBsdWdpbnMgPSB1bmxvY2tQbHVnaW5zKCk7Ci0JCQlpZiAoKGZpbGVDaGVja2VkT3V0U3RhdHVzICE9IG51bGwpCi0JCQkJCSYmICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQkvLyBsb2cgZXJyb3IKLQkJCQlkaXNwbGF5Q2hlY2tPdXRFcnJvcigpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gVG8gaW1wb3J0IHRoZSBwbHVnLWlucywgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOgotCQkJLy8gMS4gRGVsZXRlIHRoZSBwbHVnLWlucyBpbiB0aGUgY3VycmVudCBsaWJyYXJ5IGlmIHVzZXIgc3BlY2lmeQotCQkJLy8gcmVtb3ZlCi0JCQkvLyAyLiBDb3B5IHRoZSBzZWxlY3RlZCBwbHVnaW4gZmlsZXMgdG8gdGhlIGRlc3RpbmF0aW9uCi0JCQkvLyAzLiBVcGRhdGUgdGhlIGxpYnJhcnkueG1pCi0JCQkvLyA0LiBSZWxvYWQgdGhlIGxpYnJhcnkKLQkJCQotCQkJRmlsZSBsaWJGaWxlID0gdGFyZ2V0TGliRG9jLmdldEZpbGUoKTsKLQkJCWRlZmF1bHRDb25maWdGb2xkZXIgPSBudWxsOwotCQkJdGFyZ2V0RmlsZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRmlsZT4oKTsKLQkJCQotCQkJaWYgKG5ld01lcmdlU2NoZW1lKSB7CQkJCi0JCQkJaWYgKCEgbWVyZ2UodGFyZ2V0TGliRG9jKSkgewotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJU3RyaW5nIHRpdGxlID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGU7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX0VSUl9JbXBvcnRfcGx1Z2luOyAKLQkJCQkJCQluZXcgTXNnRGlhbG9nKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkpCi0JCQkJCQkJCQkuZGlzcGxheUVycm9yKHRpdGxlLCBtc2cpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlb3BlbkN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJfQotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbW9uaXRvcik7Ci0JCQkJcmV0dXJuOwotCQkJfQkJCQotCi0JCQkvLyAvLyBSZW1vdmUgZXhpc3RpbmcgZW50cmllcy4KLQkJCS8vIHJlbW92ZUV4aXN0aW5nRW50cmllcyh0YXJnZXRMaWJEb2MpOwotCi0JCQkvLyBJbXBvcnQgZW50cmllcyBhbmQgY29weSBmaWxlcy4KLQkJCWlmIChpbXBvcnRFbnRyaWVzKHRhcmdldExpYkRvYykpIHsKLQkJCQkvLyBTYXZlIHRoZSB1cGRhdGVkIGxpYnJhcnkgZmlsZS4KLQkJCQl0YXJnZXRMaWJEb2Muc2F2ZSgpOwotCi0JCQkJLy8gUmVwbGFjZSB0aGUgZ3VpZCBvZiB0aGUgb2xkIE1ldGhvZExpYnJhcnkgd2l0aCB0aGUgbmV3IG9uZS4KLQkJCQlmaXhMaWJyYXJ5R3VpZChsaWJGaWxlLmdldFBhcmVudEZpbGUoKSwgaW1wb3J0aW5nTGliRG9jCi0JCQkJCQkuZ2V0TGlicmFyeUd1aWQoKSwgdGFyZ2V0TGliRG9jLmdldExpYnJhcnlHdWlkKCkpOwotCi0JCQkJLy8gUmVvcGVuIHRoZSBsaWJyYXJ5LgotCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJCS8vIEZpbmFsbHksIHJlLWxvY2sgdGhlIHVubG9ja2VkIHBsdWdpbnMgYW5kIHNhdmUgdGhlIGxpYnJhcnkKLQkJCQkvLyBhZ2Fpbi4KLQkJCQlpZiAodW5sb2NrZWRQbHVnaW5zLnNpemUoKSA+IDApIHsKLQkJCQkJbG9ja1VubG9ja2VkUGx1Z2lucyh1bmxvY2tlZFBsdWdpbnMpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gUmUtb3BlbiBsaWJyYXJ5IGFuZCBmcmVzaCB0aGUgd29ya3NwYWNlLgotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQkvLyByZWZyZXNoIGxpYnJhcnkgZmlsZXMgaW4gd29ya3NwYWNlCi0JCQkvLwotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IHVubG9ja1BsdWdpbnMoKSB7Ci0KLQkJTGlzdCBwbHVnaW5JZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlNYXA8U3RyaW5nLCBNZXRob2RQbHVnaW4+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kUGx1Z2luPigpOwotCQlMaXN0PE1ldGhvZFBsdWdpbj4gYmFzZVBsdWdpbnMgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkKLQkJCQkJCQkJCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXNlUGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGJhc2VQbHVnaW5zLmdldChpKTsKLQkJCW1hcC5wdXQocGx1Z2luLmdldE5hbWUoKSwgcGx1Z2luKTsKLQkJfQotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAoKGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgJiYgaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKLQkJCQkJaW5mby5leGlzdGluZ1BsdWdpbi5zZXRVc2VyQ2hhbmdlYWJsZShuZXcgQm9vbGVhbih0cnVlKSk7Ci0JCQkJCXBsdWdpbklkcy5hZGQoaW5mby5leGlzdGluZ1BsdWdpbi5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBtYXAuZ2V0KGluZm8ubmFtZSk7Ci0JCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCAmJiAhIGJhc2VQbHVnaW4uZ2V0R3VpZCgpLmVxdWFscyhpbmZvLmd1aWQpCi0JCQkJCQkmJiAhIGJhc2VQbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKSkgewotCQkJCQlwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucy5hZGQoYmFzZVBsdWdpbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQloYW5kbGVFeHRyYVVubG9ja1BsdWdpbnMocGx1Z2luSWRzLCBwb3NzaWJsZUV4dHJhVW5sb2NrUGx1Z2lucyk7Ci0JCQotCQlyZXR1cm4gcGx1Z2luSWRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeHRyYVVubG9ja1BsdWdpbnMoTGlzdCBwbHVnaW5JZHMsCi0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMpIHsKLQkJaWYgKHBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zID09IG51bGwgfHwgcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3QgZmlsZU5hbWVUb0NoZWNrID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc3NpYmxlRXh0cmFVbmxvY2tQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gcG9zc2libGVFeHRyYVVubG9ja1BsdWdpbnMuZ2V0KGkpOwotCQkJU3RyaW5nIGd1aWQgPSBwbHVnaW4uZ2V0R3VpZCgpOwotCQkJaWYgKCEgcGx1Z2luSWRzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJcGx1Z2luLnNldFVzZXJDaGFuZ2VhYmxlKG5ldyBCb29sZWFuKHRydWUpKTsKLQkJCQlwbHVnaW5JZHMuYWRkKGd1aWQpOwotCQkJCVJlc291cmNlIHJlcyA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gcmVzLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQlmaWxlTmFtZVRvQ2hlY2suYWRkKGZpbGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsZU5hbWVUb0NoZWNrLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsIExpc3QgbW9kaWZpZWRGaWxlcyA9IGZpbGVOYW1lVG9DaGVjazsJCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IEZpbGVNb2RpZnlDaGVja2VyLmNoZWNrTW9kaWZ5KG1vZGlmaWVkRmlsZXMpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvY2tVbmxvY2tlZFBsdWdpbnMoTGlzdCB1bmxvY2tlZFBsdWdpbnMpIHsKLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmICh1bmxvY2tlZFBsdWdpbnMuY29udGFpbnMocGx1Z2luLmdldEd1aWQoKSkpIHsKLQkJCQlwbHVnaW4uc2V0VXNlckNoYW5nZWFibGUobmV3IEJvb2xlYW4oZmFsc2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbXBvcnRFbnRyaWVzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MpIHsKLQkJLy8gMS4gRmluZCB0aGUgZW50cmllcyB0byBiZSByZW1vdmVkLgotCQlMaXN0IGltcG9ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJCW5ld0xpc3QuYWRkKGluZm8uZ3VpZCk7Ci0JCQkJfQotCi0JCQkJaW1wb3J0TGlzdC5hZGQoaW5mby5ndWlkKTsKLQkJCX0KLQkJfQotCi0JCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY2luZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChjaW5mby5zZWxlY3RlZCkgewotCQkJCWlmIChjaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsKSB7Ci0JCQkJCW5ld0xpc3QuYWRkKGNpbmZvLmd1aWQpOwotCQkJCX0KLQotCQkJCWltcG9ydExpc3QuYWRkKGNpbmZvLmd1aWQpOwotCi0JCQl9Ci0JCX0KLQotCQkvLyAyLiBJdGVyYXRlIHRoZSBkb2N1ZW1udCBhbmQgYWRkIHRoZSBuZXcgZW50cmllcy4KLQkJaWYgKCFuZXdNZXJnZVNjaGVtZSkgewotCQkJaW1wb3J0TGliRW50cmllcyh0YXJnZXRMaWJEb2MsIG5ld0xpc3QpOwotCQl9IGVsc2UgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQllbnN1cmVVbmlxdWVOYW1lcyhsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJCWVuc3VyZVVuaXF1ZU5hbWVzKGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvcHlGaWxlcyh0YXJnZXRMaWJEb2MsIGltcG9ydExpc3QsIG5ld0xpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRMaWJFbnRyaWVzKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIExpc3QgbmV3TGlzdCkgewotCi0JCWlmIChuZXdMaXN0ID09IG51bGwgfHwgbmV3TGlzdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQWRkIHBsdWctaW5zLgotCQlOb2RlTGlzdCBub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUGx1Z2luKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGNvbmZpZ3VyYXRpb25zLgotCQlub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIGd1aWQgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0R3VpZChub2RlKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZENvbmZpZ3VyYXRpb24obm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgcmVzb3VyY2UgZW50cmllcwotCQlub2RlcyA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCBub2RlID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oaSk7Ci0JCQlTdHJpbmcgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX2lkKTsKLQkJCWlmIChuZXdMaXN0LmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJdGFyZ2V0TGliRG9jLmFkZFJlc291cmNlKG5vZGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIHRoZSByZXNvdXJjZSBzdWIgbWFuYWdlcnMuCi0JCW5vZGVzID0gaW1wb3J0aW5nTGliRG9jLmdldFJlc291cmNlU3ViTWFuYWdlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gTGlicmFyeURvY3VtZW50LmdldFN1Yk1hbmFnZXJCYXNlR3VpZChub2RlCi0JCQkJCS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaHJlZikpOwotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRMaWJEb2MuYWRkUmVzb3VyY2Uobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb3B5RmlsZXMoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTGlzdCBpbXBvcnRMaXN0LAotCQkJTGlzdCBuZXdMaXN0KSB7Ci0JCWZpbmFsIE1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGltcG9ydExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgc3JjX3VyaSA9IGltcG9ydGluZ0xpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsKLQkJCVN0cmluZyB0YXJnZXRfdXJpOwotCQkJaWYgKHNyY191cmkgPT0gbnVsbCB8fCBzcmNfdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJdGFyZ2V0X3VyaSA9IHNyY191cmk7Ci0JCQkvKgotCQkJaWYgKG5ld0xpc3QuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQl0YXJnZXRfdXJpID0gc3JjX3VyaTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFyZ2V0X3VyaSA9IHRhcmdldExpYkRvYy5nZXRSZXNvdXJjZVVyaShndWlkKTsgLy8gdGhlIHJlc291cmNlCi0JCQkJLy8gbWlnaHQgYmUKLQkJCQkvLyByZW5hbWVkCi0JCQl9Ci0JCQkqLwotCi0JCQkvLyBDaGVjayB0aGUgcGx1Z2luLnhtaSBmaWxlLiBJZiBpdCBleGlzdHMsIGNvcHkgdGhlIGZvbGRlciB0bwotCQkJLy8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLQkJCWZpbmFsIEZpbGUgc3JjX2ZpbGUgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0RmlsZUZyb21Vcmkoc3JjX3VyaSk7Ci0JCQlpZiAoc3JjX2ZpbGUuZXhpc3RzKCkpIHsKLS8qCQkJCWZpbmFsIEZpbGUgdGFyZ2V0X2ZpbGUgPSB0YXJnZXRMaWJEb2MKLQkJCQkJCS5nZXRGaWxlRnJvbVVyaSh0YXJnZXRfdXJpKTsqLwotCQkJCQotCQkJCWZpbmFsIEZpbGUgdGFyZ2V0X2ZpbGUgPSBnZXRUYXJnZXRGaWxlKGxpYiwgZ3VpZCk7Ci0JCQkJaWYgKHRhcmdldF9maWxlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQl0YXJnZXRGaWxlTWFwLnB1dChndWlkLCB0YXJnZXRfZmlsZSk7Ci0KLQkJCQkvLyBpZiBpdCdzIGEgY29uZmlndXJhdGlvbiwgb25seSBjb3B5IHRoZSBmaWxlLAotCQkJCS8vIGlmIGl0J3MgYSBwbHVnaW4sIGNvcHkgdGhlIHdob2xlIGRpcmVjdG9yeQotCi0JCQkJaWYgKGRhdGEuZ2V0UGx1Z2luSW5mbyhndWlkKSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0YXJnZXRfZmlsZS5leGlzdHMoKSkgewotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJRGlyQ29weSBjb3B5ID0gbmV3IERpckNvcHkoc3JjX2ZpbGUKLQkJCQkJCQkJCQkuZ2V0UGFyZW50RmlsZSgpLCB0YXJnZXRfZmlsZQotCQkJCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQkJCQlmaWxlQ2hlY2tlZE91dFN0YXR1cyA9IGNvcHkuZXhlY3V0ZSgpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY29weURpcihzcmNfZmlsZS5nZXRQYXJlbnRGaWxlKCksIHRhcmdldF9maWxlCi0JCQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChkYXRhLmdldENvbmZpZ0luZm8oZ3VpZCkgIT0gbnVsbCAmJiBEaXJDb3B5Lm5lZWRDb3B5KHNyY19maWxlLCB0YXJnZXRfZmlsZSkpIHsKLQkJCQkJZmluYWwgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKHRhcmdldF9maWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlmaWxlcy5hZGQodGFyZ2V0X2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMgPSBGaWxlTW9kaWZ5Q2hlY2tlcgotCQkJCQkJCQkJCS5jaGVja01vZGlmeShmaWxlcyk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZmlsZUNoZWNrZWRPdXRTdGF0dXMgPT0gbnVsbAotCQkJCQkJCXx8IGZpbGVDaGVja2VkT3V0U3RhdHVzLmlzT0soKSkgewotCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjX2ZpbGUsIHRhcmdldF9maWxlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgoZmlsZUNoZWNrZWRPdXRTdGF0dXMgIT0gbnVsbCkKLQkJCQkJCSYmICFmaWxlQ2hlY2tlZE91dFN0YXR1cy5pc09LKCkpIHsKLQkJCQkJLy8gbG9nIGVycm9yCi0JCQkJCWRpc3BsYXlDaGVja091dEVycm9yKCk7Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNwbGF5Q2hlY2tPdXRFcnJvcigpIHsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN0cmluZyB0aXRsZSA9IEltcG9ydFJlc291cmNlcy5pbXBvcnRQbHVnaW5zV2l6YXJkX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfRVJSX0ltcG9ydF9wbHVnaW47IAotCQkJCW5ldyBNc2dEaWFsb2coSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKSkKLQkJCQkJCS5kaXNwbGF5RXJyb3IodGl0bGUsIG1zZywKLQkJCQkJCQkJZmlsZUNoZWNrZWRPdXRTdGF0dXMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDb3BpZXMgZGlyZWN0b3JpZXMgZnJvbSAiZnJvbURpciIgdG8gInRvRGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIpIHsKLQkJQ29weSBjcCA9IG5ldyBDb3B5KCk7Ci0JCWNwLnNldE92ZXJ3cml0ZSh0cnVlKTsKLQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQlzZXQuc2V0RXhjbHVkZXMoQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UuZXhjbHVkZXMpOwotCQlzZXQuc2V0RGlyKGZyb21EaXIpOwotCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCWNwLnNldFRvZGlyKHRvRGlyKTsKLQkJY3Auc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJY3AuZXhlY3V0ZSgpOwotCi0JfQotCi0JLy8gLyoqCi0JLy8gKiByZW1vdmUgdGhlIHBsdWdpbiBlbnRyeSBmcm9tIHRoZSBsaWJyYXJ5IGRvY3VtZW50Ci0JLy8gKgotCS8vICogQHBhcmFtIGRvY3VtZW50Ci0JLy8gKiBMaWJyYXJ5RG9jdW1lbnQKLQkvLyAqIEBwYXJhbSBndWlkCi0JLy8gKiBTdHJpbmcgZ3VpZCBvZiB0aGUgcGx1Z2luCi0JLy8gKi8KLQkvLyBwcml2YXRlIHZvaWQgcmVtb3ZlRXhpc3RpbmdFbnRyaWVzKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCS8vIC8vIDEuIEZpbmQgdGhlIGVudHJpZXMgdG8gYmUgcmVtb3ZlZC4KLQkvLyBMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm87Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkvLyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCS8vIGlmICgoaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JLy8gcmVtb3ZlTGlzdC5hZGQoaW5mby5ndWlkKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gY2luZm87Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0Q29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkvLyBjaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaXQubmV4dCgpOwotCS8vIGlmICgoY2luZm8uZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgJiYgY2luZm8uc2VsZWN0ZWQpIHsKLQkvLyByZW1vdmVMaXN0LmFkZChjaW5mby5ndWlkKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8gLy8gMi4gSXRlcmF0ZSB0aGUgZG9jdWVtbnQgYW5kIHJlbW92ZSB0aGUgZW50cmllcy4KLQkvLyBkb2N1bWVudC5yZW1vdmVQbHVnaW5zKHJlbW92ZUxpc3QpOwotCS8vIGRvY3VtZW50LnJlbW92ZUNvbmZpZ3VyYXRpb25zKHJlbW92ZUxpc3QpOwotCS8vIGRvY3VtZW50LnJlbW92ZVJlc291cmNlRW50cmllcyhyZW1vdmVMaXN0KTsKLQkvLyB9Ci0KLQkgLyoqIAotCSAgKiBWYWxpZGF0ZXMgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdmFsaWRhdGVTZWxlY3Rpb24oKSB7Ci0JCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlkYXRhLmdldEVycm9ySW5mbygpLmNsZWFyKCk7Ci0KLQkJLy8gSXRlcmF0ZSB0aGUgbmV3IHBsdWdpbnMsIG1ha2Ugc3VyZSB0aGUgYmFzZSBpcyBpbmNsdWRlZAotCQkvLyBlaXRoZXIgYXMgYW4gaW1wb3J0aW5nIHBsdWdpbiwgb3IgaXMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeQotCQkvLyBnZXQgdGhlIG1ldGhvZCBwbHVnaW5zIGluIHRoZSBjdXJyZW50IGxpYnJhcnkuCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTGlzdCBwbHVnaW5zID0gKGxpYnJhcnkgPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0KCkgOiBsaWJyYXJ5Ci0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJTWFwIHBsdWdpbmlkcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlwbHVnaW5pZHMucHV0KHBsdWdpbi5nZXRHdWlkKCksIHBsdWdpbik7Ci0JCX0KLQotCQkvLyBUaGUgYmFzZSBwbHVnLWlucyBNVVNUIGJlIGVpdGhlciBhIHNlbGVjdGVkIG9uZSBvciBhbiBleGlzdGluZyBvbmUKLQkJLy8gb3RoZXJ3aXNlLCBjYW4ndCBpbXBvcnQKLQkJU2V0IGJhc2VQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsKLQotCQlTZXQgbmV3UGx1Z2lucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQkvL2lmIChpbmZvLnNlbGVjdGVkICYmIChpbmZvLmV4aXN0aW5nUGx1Z2luID09IG51bGwpKSB7Ci0JCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCW5ld1BsdWdpbnMuYWRkKGluZm8uZ3VpZCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGIgPSBpbmZvLnVzZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Yi5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBiYXNlID0gaXRiLm5leHQoKTsKLQkJCQkJaWYgKCFiYXNlUGx1Z2lucy5jb250YWlucyhiYXNlKSkgewotCQkJCQkJYmFzZVBsdWdpbnMuYWRkKGJhc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld1BsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGJhc2VQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcgdXJpID0gKFN0cmluZykgZGF0YS5iYXNlUGx1Z2luVXJsTWFwLmdldChndWlkKTsKLQkJCQlpZiAoIW5ld1BsdWdpbnMuY29udGFpbnMoZ3VpZCkgJiYgIXBsdWdpbmlkcy5jb250YWluc0tleShndWlkKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c1LCB1cmkpOyAKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gZ3VpZFRvUGx1Z05hbWVNYXAgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0R3VpZFRvUGx1Z05hbWVNYXAoKTsKLQkJCQkJCVN0cmluZyBwbHVnaW5OYW1lID0gZ3VpZFRvUGx1Z05hbWVNYXAgPT0gbnVsbCA/IG51bGwgOiBndWlkVG9QbHVnTmFtZU1hcC5nZXQoZ3VpZCk7Ci0JCQkJCQlpZiAocGx1Z2luTmFtZSA9PSBudWxsIHx8IHBsdWdpbk5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCW1lc3NhZ2UgPSBJbXBvcnRSZXNvdXJjZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZV9NU0c2OyAKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbWVzc2FnZSA9IE5MUy5iaW5kKEltcG9ydFJlc291cmNlcy5QbHVnaW5JbXBvcnRpbmdTZXJ2aWNlX01TRzUsIAotCQkJCQkJCQkJcGx1Z2luTmFtZSArICIsICIgKyBndWlkKTsgCQkvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZGF0YS5nZXRFcnJvckluZm8oKS5hZGRFcnJvcihtZXNzYWdlKTsKLQotCQkJCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGRhdGEuZ2V0RXJyb3JJbmZvKCkuZ2V0RXJyb3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2NhbkxpYnJhcnlGaWxlKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQl2aXNpdExpYlRhZyhkb2N1bWVudCk7Ci0JCXZpc2l0UmVzb3VyY2VUYWcoZG9jdW1lbnQpOwotCQlkYXRhLnZhbGlkYXRlUGx1Z2lucygpOwotCi0JCS8vIENoZWNrIGJhc2UgcGx1Zy1pbiBkZXBlbmRlbmNpZXMuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Ci0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGJhc2UgPSBpbmZvLnVzZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0YmFzZQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGd1aWQgPSAoU3RyaW5nKSBpdGJhc2UubmV4dCgpOwotCQkJCQlpZiAoIWRhdGEuYmFzZVBsdWdpblVybE1hcC5jb250YWluc0tleShndWlkKSkgewotCQkJCQkJZGF0YS5iYXNlUGx1Z2luVXJsTWFwLnB1dChndWlkLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdExpYlRhZyhMaWJyYXJ5RG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gUmVsb2FkIHRoZSBlbGVtZW50IG1hcHBpbmcuCi0JCU5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnQuZ2V0UGx1Z2lucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2Rlcy5pdGVtKGkpOwotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIHBpID0gZGF0YS5uZXcgUGx1Z2luSW5mbygpOwotCQkJcGkuZ3VpZCA9IExpYnJhcnlEb2N1bWVudC5nZXRHdWlkKG5vZGUpOwotCQkJZGF0YS5nZXRQbHVnaW5zKCkuYWRkKHBpKTsKLQotCQkJLy8gQ2hlY2sgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5LCBnZXQgdGhlIHJlbGF0ZWQgaW5mb3JtYXRpb24uCi0JCQlsb2FkRXhpc3RpbmdQbHVnaW5JbmZvKHBpKTsKLQkJfQotCi0JCS8vIFJlbW92ZSB0aGUgdW5uZWVkZWQgY29uZmlndXJhdGlvbnMuCi0JCWJ1aWxkQ29uZmlnSW5mb0Zyb21GaWxlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdFJlc291cmNlVGFnKExpYnJhcnlEb2N1bWVudCBkb2N1bWVudCkgewotCQlOb2RlTGlzdCBub2RlcyA9IGRvY3VtZW50LmdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyBndWlkID0gbm9kZS5nZXRBdHRyaWJ1dGUoTGlicmFyeURvY3VtZW50LkFUVFJfaWQpOwotCQkJU3RyaW5nIHVyaSA9IG5vZGUuZ2V0QXR0cmlidXRlKExpYnJhcnlEb2N1bWVudC5BVFRSX3VyaSk7Ci0KLQkJCS8vIExvYWQgdGhlIHBsdWdpbi54bWkgZmlsZSBmb3IgZGV0YWlsIGluZm9ybWF0aW9uLgotCQkJRmlsZSBmaWxlID0gZG9jdW1lbnQuZ2V0RmlsZUZyb21VcmkodXJpKTsKLQotCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIHBpID0gZGF0YS5nZXRQbHVnaW5JbmZvKGd1aWQpOwotCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQlsb2FkUGx1Z2luSW5mbyhmaWxlLCBwaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gUmVtb3ZlIHRoZSBwbHVnLWluIGluZm8gZW50cnkgc2luY2UgdGhpYXMgaXMgbm90Ci0JCQkJCS8vIGEgdmFsaWQgcGx1Zy1pbiB0byBpbXBvcnQuCi0JCQkJCWRhdGEucmVtb3ZlUGx1Z2luSW5mbyhndWlkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIG5vdCBwbHVnaW4sIG1pZ2h0IGJlIGEgY29uZmlndXJhdGlvbgotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGNpID0gZGF0YQotCQkJCQkJLmdldENvbmZpZ0luZm8oZ3VpZCk7Ci0JCQkJaWYgKGNpICE9IG51bGwpIHsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWxvYWRDb25maWdJbmZvKGZpbGUsIGNpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRDb25maWdJbmZvKEZpbGUgc291cmNlLAotCQkJUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbykgewotCQl0cnkgewotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBYTUxVdGlsLmxvYWRYbWwoc291cmNlKTsKLQkJCUVsZW1lbnQgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCi0JCQlFbGVtZW50IGNvbmZpZ1RhZyA9IG51bGw7Ci0JCQlpZiAocm9vdC5nZXRUYWdOYW1lKCkuZXF1YWxzKAotCQkJCQkib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQljb25maWdUYWcgPSByb290OwotCQkJfSBlbHNlIHsKLQkJCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QKLQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWNvbmZpZ1RhZyA9IChFbGVtZW50KSBub2Rlcy5pdGVtKDApOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNvbmZpZ1RhZyAhPSBudWxsKSB7Ci0JCQkJaW5mby5uYW1lID0gY29uZmlnVGFnLmdldEF0dHJpYnV0ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFBsdWdpbkluZm8oRmlsZSBzb3VyY2UsIFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvKSB7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbChzb3VyY2UpOwotCQkJRWxlbWVudCByb290ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0KLQkJCUVsZW1lbnQgcGx1Z2luVGFnID0gbnVsbDsKLQkJCWlmIChyb290LmdldFRhZ05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlwbHVnaW5UYWcgPSByb290OwotCQkJfSBlbHNlIHsKLQkJCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QKLQkJCQkJCS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJcGx1Z2luVGFnID0gKEVsZW1lbnQpIG5vZGVzLml0ZW0oMCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGx1Z2luVGFnICE9IG51bGwpIHsKLQkJCQlpbmZvLm5hbWUgPSBwbHVnaW5UYWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLnZlcnNpb24gPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby5icmllZl9kZXNjID0gTGlicmFyeURvY3VtZW50LmdldENoaWxkVmFsdWUocGx1Z2luVGFnLAotCQkJCQkJImJyaWVmRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZm8uYXV0aG9ycyA9IExpYnJhcnlEb2N1bWVudC5nZXRDaGlsZFZhbHVlKHBsdWdpblRhZywKLQkJCQkJCSJhdXRob3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvLmNoYW5nZURhdGUgPSBMaWJyYXJ5RG9jdW1lbnQuZ2V0Q2hpbGRWYWx1ZShwbHVnaW5UYWcsCi0JCQkJCQkiY2hhbmdlRGF0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW5mby51cmwgPSBzb3VyY2UudG9TdHJpbmcoKTsKLQotCQkJCS8vIEdldCB0aGUgYmFzZSBwbHVnLWlucy4KLQkJCQlOb2RlTGlzdCBub2RlcyA9IHBsdWdpblRhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYmFzZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlFbGVtZW50IG5vZGUgPSAoRWxlbWVudCkgbm9kZXMuaXRlbShpKTsKLQkJCQkJU3RyaW5nIGd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ocmVmKTsKLQotCQkJCQlpbnQgaW5keCA9IGd1aWQuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbmR4ID4gMCkgewotCQkJCQkJZ3VpZCA9IGd1aWQuc3Vic3RyaW5nKGluZHggKyAxKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZHggPSBndWlkLmluZGV4T2YoInVtYTovLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoaW5keCA+PSAwKSB7Ci0JCQkJCQkJZ3VpZCA9IGd1aWQuc3Vic3RyaW5nKGluZHggKyA2KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpbmZvLnVzZWRQbHVnaW5zLmFkZChndWlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeGlzdGluZ1BsdWdpbkluZm8oUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8pIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlMaXN0IHBsdWdpbnMgPSAobGlicmFyeSA9PSBudWxsKSA/IG5ldyBBcnJheUxpc3QoKSA6IGxpYnJhcnkKLQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXQubmV4dCgpOwotCQkJaWYgKHBsdWdpbi5nZXRHdWlkKCkuZXF1YWxzKGluZm8uZ3VpZCkpIHsKLQkJCQlpbmZvLmV4aXN0aW5nUGx1Z2luID0gcGx1Z2luOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRFeGlzdGluZ0NvbmZpZ0luZm8oUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8gaW5mbykgewotCQlNZXRob2RDb25maWd1cmF0aW9uW10gY29uZmlncyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCWlmIChjb25maWdzID09IG51bGwgfHwgY29uZmlncy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbmZpZ3NbaV07Ci0JCQlpZiAoY29uZmlnLmdldEd1aWQoKS5lcXVhbHMoaW5mby5ndWlkKSkgewotCQkJCWluZm8uZXhpc3RpbmdDb25maWcgPSBjb25maWc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZ3VpZCBvZiB0aGUgb2xkIG1ldGhvZCBsaWJyYXJ5IHdpdGggdGhlIG5ldyBvbmUuCi0JICogPHA+Ci0JICogU2VhcmNoIGZvciB0aGUgZm9sbG93aW5nIGZpbGVzOiBsaWJyYXJ5LnhtaSwgcGx1Z2luLnhtaSwgbW9kZWwueG1pLgotCSAqLwotCXByaXZhdGUgdm9pZCBmaXhMaWJyYXJ5R3VpZChGaWxlIHBhdGgsIFN0cmluZyBvbGRHdWlkLCBTdHJpbmcgbmV3R3VpZCkgewotCQlpZiAoIXBhdGguaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRmlsZVtdIGZpbGVzID0gcGF0aC5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKLQotCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gbmFtZS5lcXVhbHMoImxpYnJhcnkueG1pIikgfHwgbmFtZS5lcXVhbHMoInBsdWdpbi54bWkiKSB8fCBuYW1lLmVxdWFscygibW9kZWwueG1pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0pOwotCi0JCWlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCWZpeExpYnJhcnlHdWlkKGZpbGVzW2ldLCBvbGRHdWlkLCBuZXdHdWlkKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gUmVhZCBpbiB0aGUgZmlsZSwgdXBkYXRlIGl0IGFuZCBzYXZlIHRoZSBmaWxlLgotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBzb3VyY2UgPSBGaWxlVXRpbC5yZWFkRmlsZShmaWxlc1tpXSwKLQkJCQkJCQlGaWxlVXRpbC5FTkNPRElOR19VVEZfOCkudG9TdHJpbmcoKTsKLQkJCQkJaWYgKHNvdXJjZS5pbmRleE9mKG9sZEd1aWQpID49IDApIHsKLQkJCQkJCS8vIFRPRE86IFRoaXMgaXMgYSByZWdleHAgcmVwYWxjZW1lbnQsIGlzIGl0IHNhZmU/Ci0JCQkJCQlzb3VyY2UgPSBzb3VyY2UucmVwbGFjZUFsbChvbGRHdWlkLCBuZXdHdWlkKTsKLQotCQkJCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmaWxlc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCQkJc291cmNlKTsKLQkJCQkJfQotCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbWVyZ2UoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vQ29weSBmaWxlcyBvbmx5IGFzIG5ld01lcmdlU2NoZW1lID0gdHJ1ZQotCQlpZiAoISBpbXBvcnRFbnRyaWVzKHRhcmdldExpYkRvYykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCVJlc291cmNlIHJlczAgPSBsaWIuZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IwID0gKFJlc291cmNlTWFuYWdlcikgTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlczApOwotCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMwLmdldFJlc291cmNlU2V0KCk7Ci0JCQotCQltZXJnZVBsdWdpbnModGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCk7CQkKLQkJbWVyZ2VDb25maWdzKHRhcmdldExpYkRvYywgbGliLCByZXNNZ3IwLCByZXNTZXQpOwotCQkKLQkJbGliLmVSZXNvdXJjZSgpLnNldE1vZGlmaWVkKHRydWUpOwotCQkKLQkJc2F2ZShsaWIsIG51bGwpOwkJCQkKLQkJCi0JCS8vZml4TGlicmFyeUd1aWQodGFyZ2V0TGliRG9jLmdldEZpbGUoKS5nZXRQYXJlbnRGaWxlKCksIGltcG9ydGluZ0xpYkRvYwotCQkvLwkJLmdldExpYnJhcnlHdWlkKCksIHRhcmdldExpYkRvYy5nZXRMaWJyYXJ5R3VpZCgpKTsKLQkJCi0JCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkucmVvcGVuQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCi0JCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpKSB7Ci0JCQlsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKGxpYik7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gbWlzc2luZ0Jhc2VQbHVnaW5zID0gY29sbGVjdE1pc3NpbmdCYXNlUGx1Z2lucyhsaWIpOwotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOy8vIGNvbGxlY3RJbXBvcnRlZENvbmZpZ3VyYXRpb25zKGxpYik7CQkJCi0JCQljaGVja01vZGlmeShjb25maWdzKTsKLQkJCWlmICghIG1pc3NpbmdCYXNlUGx1Z2lucy5pc0VtcHR5KCkgfHwgISBjb25maWdzLmlzRW1wdHkoKSkgewkJCQotCQkJCWxpYi5lUmVzb3VyY2UoKS5zZXRNb2RpZmllZCh0cnVlKTsJCQkJCi0JCQkJU2V0PFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSA9IG5ldyBMaW5rZWRIYXNoU2V0PFJlc291cmNlPigpOwotCQkJCWNvbGxlY3RSZXNvdXJjZXN0b1NhdmUocmVzb3VyZXNUb1NhdmUsIG1pc3NpbmdCYXNlUGx1Z2lucyk7Ci0JCQkJY29sbGVjdFJlc291cmNlc3RvU2F2ZShyZXNvdXJlc1RvU2F2ZSwgY29uZmlncyk7Ci0JCQkJc2F2ZShsaWIsIHJlc291cmVzVG9TYXZlKTsJCQkJCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tNb2RpZnkoTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzKSB7Ci0JCWlmIChjb25maWdzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBMaXN0IGNvbmZpZ0ZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3Muc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlncy5nZXQoaSk7Ci0JCQlSZXNvdXJjZSByZXMgPSBjb25maWcuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZSA9IHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQljb25maWdGaWxlcy5hZGQoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZpbGVDaGVja2VkT3V0U3RhdHVzID0gRmlsZU1vZGlmeUNoZWNrZXIuY2hlY2tNb2RpZnkoY29uZmlnRmlsZXMpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PE1ldGhvZFBsdWdpbj4gY29sbGVjdE1pc3NpbmdCYXNlUGx1Z2lucyhNZXRob2RMaWJyYXJ5IGxpYikgewotCQlMaXN0PE1ldGhvZFBsdWdpbj4gcmV0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0JCQotCQlNYXAgbWFwID0gTWV0aG9kRWxlbWVudFV0aWwuYnVpbGRNYXAobGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkICkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtYXAuZ2V0KGluZm8uZ3VpZCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBiYXNlcyA9IHBsdWdpbi5nZXRCYXNlcygpOwotCQkJCQlmb3IgKGludCBpPTA7IGkgPCBiYXNlcy5zaXplKCk7IGkrKykgewotCQkJCQkJTWV0aG9kUGx1Z2luIGJhc2UgPSBiYXNlcy5nZXQoaSk7Ci0JCQkJCQlpZiAoISBtYXAuY29udGFpbnNLZXkoYmFzZS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJcmV0LmFkZChwbHVnaW4pOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0OwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RSZXNvdXJjZXN0b1NhdmUoU2V0PFJlc291cmNlPiByZXNvdXJjZXMsIExpc3Q8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsIHx8IGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9CQkKLQkJZm9yIChpbnQgaT0wOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCWNvbGxlY3RSZXNvdXJjZXN0b1NhdmUocmVzb3VyY2VzLCBlbGVtZW50cy5nZXQoaSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb2xsZWN0UmVzb3VyY2VzdG9TYXZlKFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzLCBNZXRob2RFbGVtZW50IHBhcmVudCkgewotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7CQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnQuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlSZXNvdXJjZSByZXMgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCQlyZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJUmVzb3VyY2UgcmVzID0gcGFyZW50LmVSZXNvdXJjZSgpOwotCQlyZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCXJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmUoSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciwgU2V0PFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSkgCi0JCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAocmVzb3VyZXNUb1NhdmUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gcmVzb3VyZXNUb1NhdmUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlcyA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGl0Lm5leHQoKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKCEgcmVzLmlzU3luY2hyb25pemVkKCkpIHsKLQkJCQkJcmVzLmxvYWQocmVzLmdldFJlc291cmNlU2V0KCkuZ2V0TG9hZE9wdGlvbnMoKSk7Ci0JCQkJfQotCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0JCi0KLQlwcml2YXRlIHZvaWQgc2F2ZShNZXRob2RMaWJyYXJ5IGxpYiwgU2V0PFJlc291cmNlPiByZXNvdXJlc1RvU2F2ZSkgewotCQkvL0xpYnJhcnlVdGlsLnNhdmVMaWJyYXJ5KGxpYiwgZmFsc2UsIGZhbHNlKTsKLQkJCi0JCS8vVGhpcyBpcyB0ZW1wLCBhbmQgY2FuIGJlIHJldm9tdmVkIGFmdGVyIGEgZml4IGlzIGRvbmUgZm9yIHBhc3NpbmcgcGVyc2lzdGVyJ3Mgb3B0aW9uIHRvIHNhdmUKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCU1hcCBkZWZhdWx0U2F2ZU9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJT2JqZWN0IG9sZERlZmF1bHRPcHRpb25WYWwgPSBkZWZhdWx0U2F2ZU9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKTsKLQkJCi0JCUlMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudFBlcnNpc3RlcigpLmdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0JCU1hcCBzYXZlT3B0aW9ucyA9IHBlcnNpc3Rlci5nZXRTYXZlT3B0aW9ucygpOwotCQlpZiAoISBpc0NoZWNrQmFzZVBsdWdpbnMoKSAmJiByZXNvdXJlc1RvU2F2ZSAhPSBudWxsKSB7Ci0JCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsIEJvb2xlYW4uVFJVRSk7Ci0JCQlkZWZhdWx0U2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLCBCb29sZWFuLlRSVUUpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXNhdmUocGVyc2lzdGVyLCByZXNvdXJlc1RvU2F2ZSk7Ci0JCQlwZXJzaXN0ZXIuc2F2ZShsaWIuZVJlc291cmNlKCkpOwotCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghIGlzQ2hlY2tCYXNlUGx1Z2lucygpICYmIHJlc291cmVzVG9TYXZlICE9IG51bGwpIHsJCQkJCi0JCQkJaWYgKG9sZERlZmF1bHRPcHRpb25WYWwgPT0gbnVsbCkgewotCQkJCQlkZWZhdWx0U2F2ZU9wdGlvbnMucmVtb3ZlKE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkZWZhdWx0U2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLCBvbGREZWZhdWx0T3B0aW9uVmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWVyZ2VQbHVnaW5zKExpYnJhcnlEb2N1bWVudCB0YXJnZXRMaWJEb2MsIE1ldGhvZExpYnJhcnkgbGliLCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyMCwgUmVzb3VyY2VTZXQgcmVzU2V0KSB7Ci0JCUxpc3QgZXhpc3RpbmdQbHVnaW5HdWlkcyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkICYmIGluZm8uZXhpc3RpbmdQbHVnaW4gIT0gbnVsbCkgewotCQkJCWlmIChleGlzdGluZ1BsdWdpbkd1aWRzID09IG51bGwpIHsKLQkJCQkJZXhpc3RpbmdQbHVnaW5HdWlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQl9Ci0JCQkJZXhpc3RpbmdQbHVnaW5HdWlkcy5hZGQoaW5mby5ndWlkKTsKLQkJCX0KLQkJfQotCQkKLQkJTWFwIHBnVG9SZ01hcCA9IGltcG9ydGluZ0xpYkRvYy5idWlsZFBsdWdpbkd1aWRUb1Jlc01nckd1aWRNYXAoZXhpc3RpbmdQbHVnaW5HdWlkcyk7CQkJCQotCQkKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvID0gKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKGluZm8uc2VsZWN0ZWQgJiYgaW5mby5leGlzdGluZ1BsdWdpbiA9PSBudWxsKSB7Ci0JCQkJbWVyZ2VFbGVtZW50KGluZm8uZ3VpZCwgdGFyZ2V0TGliRG9jLCBsaWIsIHJlc01ncjAsIHJlc1NldCwgbGliLmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JCQl9IGVsc2UgaWYgKGluZm8uc2VsZWN0ZWQgJiYgcGdUb1JnTWFwICE9IG51bGwpIHsJLy8xNTE3ODYKLQkJCQlSZXNvdXJjZSByZXMgPSBpbmZvLmV4aXN0aW5nUGx1Z2luLmVSZXNvdXJjZSgpOwotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCQlTdHJpbmcgZXhpc3RpbmdHdWlkID0gcmVzTWdyLmdldEd1aWQoKTsKLQkJCQlTdHJpbmcgaW1wb3J0ZWRHdWlkID0gKFN0cmluZykgcGdUb1JnTWFwLmdldChpbmZvLmd1aWQpOwotCQkJCWlmIChpbXBvcnRlZEd1aWQgIT0gbnVsbCAmJiAhaW1wb3J0ZWRHdWlkLmVxdWFscyhleGlzdGluZ0d1aWQpKSB7Ci0JCQkJCXJlc01nci5zZXRHdWlkKGltcG9ydGVkR3VpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtZXJnZUNvbmZpZ3MoTGlicmFyeURvY3VtZW50IHRhcmdldExpYkRvYywgTWV0aG9kTGlicmFyeSBsaWIsIFJlc291cmNlTWFuYWdlciByZXNNZ3IwLCBSZXNvdXJjZVNldCByZXNTZXQpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0Q29uZmlncygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmIChpbmZvLnNlbGVjdGVkICYmIGluZm8uZXhpc3RpbmdDb25maWcgPT0gbnVsbCkgewotCQkJCW1lcmdlRWxlbWVudChpbmZvLmd1aWQsIHRhcmdldExpYkRvYywgbGliLCByZXNNZ3IwLCByZXNTZXQsIGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCQl9CQkJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbWVyZ2VFbGVtZW50KFN0cmluZyBndWlkLCBMaWJyYXJ5RG9jdW1lbnQgdGFyZ2V0TGliRG9jLCAKLQkJCU1ldGhvZExpYnJhcnkgbGliLCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyMCwgUmVzb3VyY2VTZXQgcmVzU2V0LCBMaXN0IGVsZW1lbnRzKXsKLQkJU3RyaW5nIHNyY191cmkgPSBpbXBvcnRpbmdMaWJEb2MuZ2V0UmVzb3VyY2VVcmkoZ3VpZCk7Ci0JCWlmIChzcmNfdXJpID09IG51bGwgfHwgc3JjX3VyaS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy9GaWxlIHRhcmdldF9maWxlID0gdGFyZ2V0TGliRG9jLmdldEZpbGVGcm9tVXJpKHNyY191cmkpOwotCQlGaWxlIHRhcmdldF9maWxlID0gdGFyZ2V0RmlsZU1hcC5nZXQoZ3VpZCk7Ci0JCQotCQlTdHJpbmcgcGF0aCA9IHRhcmdldF9maWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlSZXNvdXJjZSByZXMgPSByZXNTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzKTsKLQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwkJCi0JCQotCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyMCwgZWxlbWVudCwgdXJpKTsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihyZXMpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCXJlc01ncjAuZ2V0U3ViTWFuYWdlcnMoKS5hZGQocmVzTWdyKTsKLQkJfQotCX0JCQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbmZpZ0luZm9Gcm9tRmlsZXMoKSB7CQotCQlGaWxlIGNvcGllZExpYlBhdGggPSB1cEdyYWRlSW5mbyA9PSBudWxsID8gbnVsbCA6IHVwR3JhZGVJbmZvLmdldENvcGllZExpYkZpbGUoKTsKLQkJRmlsZSBpbXBvcnRpbmdMaWJQYXRoID0gY29waWVkTGliUGF0aCA9PSBudWxsID8gbmV3IEZpbGUoZGF0YS5sbERhdGEuZ2V0UGFyZW50Rm9sZGVyKCkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgTGlicmFyeURvY3VtZW50LmV4cG9ydEZpbGUpIDogY29waWVkTGliUGF0aDsKLQkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShpbXBvcnRpbmdMaWJQYXRoLmdldFBhcmVudCgpLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCQotCQlMaWJyYXJ5RG9jdW1lbnQuQ29uZmlnRG9jVmlzaXRvciB2aXNpdG9yID0gbmV3IExpYnJhcnlEb2N1bWVudC5Db25maWdEb2NWaXNpdG9yKCkgewotCQkJcHVibGljIHZvaWQgdmlzaXQoRmlsZSBmaWxlLCBFbGVtZW50IG5vZGUpIHsKLQkJCQlQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbyBjaSA9IGRhdGEubmV3IENvbmZpZ3VhcmF0aW9uSW5mbygpOwotCQkJCWNpLmd1aWQgPSBub2RlLmdldEF0dHJpYnV0ZShMaWJyYXJ5RG9jdW1lbnQuQVRUUl9ndWlkKTsKLQkJCQljaS5uYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSArIEZpbGUuc2VwYXJhdG9yICsgZmlsZS5nZXROYW1lKCk7Ci0JCQkJaW1wb3J0aW5nTGliRG9jLmFkZFRvR3VpZFRvVXJpTWFwKGNpLmd1aWQsIHVyaSk7Ci0JCQkJZGF0YS5nZXRDb25maWdzKCkuYWRkKGNpKTsKLQkJCQkvLyBDaGVjayB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnksIGdldCB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbi4KLQkJCQlsb2FkRXhpc3RpbmdDb25maWdJbmZvKGNpKTsKLQkJCQlpZiAoY2kuZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQlVUkkgcmVzVXJpID0gY2kuZXhpc3RpbmdDb25maWcuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCQkJCXVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLk1FVEhPRF9DT05GSUdVUkFUSU9OX0ZPTERFUl9OQU1FICsgRmlsZS5zZXBhcmF0b3IgKyByZXNVcmkubGFzdFNlZ21lbnQoKTsKLQkJCQkJdXJpID0gdGFyZ2V0TGliRG9jLmRlY29kZVVyaSh1cmkpOwotCQkJCQl0YXJnZXRMaWJEb2MuYWRkVG9HdWlkVG9VcmlNYXAoY2kuZ3VpZCwgdXJpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCQotCQlMaWJyYXJ5RG9jdW1lbnQudmlzaXRDb25maWdGaWxlcyhjb25maWdEaXIsIHZpc2l0b3IpOwkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVVuaXF1ZU5hbWVzKExpc3QgZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1hcCBuYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50cy5nZXQoaSk7Ci0JCQluYW1lTWFwLnB1dChlbGVtLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpLCBlbGVtKTsKLQkJfQotCQkKLQkJTGlzdCBpbXBvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW1wb3J0ZWRFeGlzdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChlbGVtZW50cy5nZXQoMCkgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBkYXRhLmdldFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGluZm8uc2VsZWN0ZWQpIHsKLQkJCQkJaWYgKGluZm8uZXhpc3RpbmdQbHVnaW4gPT0gbnVsbCB8fCAKLQkJCQkJCQkhaW5mby5leGlzdGluZ1BsdWdpbi5nZXROYW1lKCkuZXF1YWxzKGluZm8ubmFtZSkpIHsKLQkJCQkJCWltcG9ydGVkTGlzdC5hZGQoaW5mby5uYW1lKTsKLQkJCQkJCWlmIChpbmZvLmV4aXN0aW5nUGx1Z2luICE9IG51bGwpIHsKLQkJCQkJCQlpbXBvcnRlZEV4aXN0TGlzdC5hZGQoaW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRDb25maWdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVBsdWdpbkltcG9ydERhdGEuQ29uZmlndWFyYXRpb25JbmZvIGluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5Db25maWd1YXJhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5zZWxlY3RlZCkgewotCQkJCQlpZiAoaW5mby5leGlzdGluZ0NvbmZpZyA9PSBudWxsIHx8IAotCQkJCQkJCSFpbmZvLmV4aXN0aW5nQ29uZmlnLmdldE5hbWUoKS5lcXVhbHMoaW5mby5uYW1lKSkgewotCQkJCQkJaW1wb3J0ZWRMaXN0LmFkZChpbmZvLm5hbWUpOwotCQkJCQkJaWYgKGluZm8uZXhpc3RpbmdDb25maWcgIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydGVkRXhpc3RMaXN0LmFkZChpbmZvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGltcG9ydGVkTGlzdC5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpbXBvcnRlZExpc3QuZ2V0KGkpOwotCQkJU3RyaW5nIHJlbmFtZWQgPSBuYW1lOwotCQkJd2hpbGUgKG5hbWVNYXAuY29udGFpbnNLZXkocmVuYW1lZC50b1VwcGVyQ2FzZSgpKSkgewotCQkJCXJlbmFtZWQgKz0gIl9yZW5hbWVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlbmFtZWQgIT0gbmFtZSkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBuYW1lTWFwLmdldChuYW1lLnRvVXBwZXJDYXNlKCkpOwotCQkJCUxpYnJhcnlWaWV3LnJ1blJlbmFtZShlbGVtLCByZW5hbWVkKTsKLQkJCX0JCQkKLQkJfQkJCQkKLQkJZm9yIChpbnQgaT0wOyBpPGltcG9ydGVkRXhpc3RMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3QgaW5mbyA9IGltcG9ydGVkRXhpc3RMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8gaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gPyAKLQkJCQkJKE1ldGhvZEVsZW1lbnQpKChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGluZm8pLmV4aXN0aW5nUGx1Z2luIDoKLQkJCQkJKE1ldGhvZEVsZW1lbnQpKChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaW5mbykuZXhpc3RpbmdDb25maWc7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IGluZm8gaW5zdGFuY2VvZiBQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gPyAKLQkJCQkJKFN0cmluZykoKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgaW5mbykubmFtZSA6Ci0JCQkJCShTdHJpbmcpKChQbHVnaW5JbXBvcnREYXRhLkNvbmZpZ3VhcmF0aW9uSW5mbykgaW5mbykubmFtZTsJCQkJCQkJCQotCQkJTGlicmFyeVZpZXcucnVuUmVuYW1lKGVsZW0sIG5ld05hbWUpOwkJCi0JCX0JCi0JCQotCQkKLQkJCi0JfQotCQotCXByaXZhdGUgRmlsZSBnZXRUYXJnZXRGaWxlKGZpbmFsIE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgZ3VpZCkgewotCQlGaWxlIHBhcmVudCA9IG51bGw7Ci0JCWZpbmFsIEZpbGVbXSBwZmlsZXMgPSBuZXcgRmlsZVsxXTsgCi0JCWZpbmFsIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcikgTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKTsKLQkJQ29uZmlndWFyYXRpb25JbmZvIGNpbmZvID0gZGF0YS5nZXRDb25maWdJbmZvKGd1aWQpOwotCQlpZiAoY2luZm8gIT0gbnVsbCkgewotCQkJRmlsZSBmaWxlID0gZ2V0UmVzb3VyY2VGaWxlKGNpbmZvLmV4aXN0aW5nQ29uZmlnKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJCWlmIChkZWZhdWx0Q29uZmlnRm9sZGVyID09IG51bGwpIHsKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXBmaWxlc1swXSA9IHBlcnNpc3Rlci5nZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihsaWIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJcGFyZW50ID0gcGZpbGVzWzBdOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJZGVmYXVsdENvbmZpZ0ZvbGRlciA9IHBhcmVudDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyZW50ID0gZGVmYXVsdENvbmZpZ0ZvbGRlcjsKLQkJCX0KLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZGVmYXVsdENvbmZpZ0ZvbGRlcjogIiArIHBhcmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVBsdWdpbkluZm8gcGluZm8gPSBkYXRhLmdldFBsdWdpbkluZm8oZ3VpZCk7Ci0JCQlpZiAocGluZm8gIT0gbnVsbCkgewotCQkJCUZpbGUgZmlsZSA9IGdldFJlc291cmNlRmlsZShwaW5mby5leGlzdGluZ1BsdWdpbik7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmlsZTsKLQkJCQl9Ci0JCQkJcGFyZW50ID0gcGVyc2lzdGVyLmNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihwaW5mby5uYW1lLCBsaWIpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBmaWxlTmFtZSA9IGNpbmZvID09IG51bGwgPyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRSA6IAotCQkJCQkJCQkJY2luZm8ubmFtZSArIE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT047CQotCQlyZXR1cm4gbmV3IEZpbGUocGFyZW50LCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDaGVja0Jhc2VQbHVnaW5zKCkgewotCQlyZXR1cm4gY2hlY2tCYXNlUGx1Z2luczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGVja0Jhc2VQbHVnaW5zKGJvb2xlYW4gY2hlY2tCYXNlUGx1Z2lucykgewotCQl0aGlzLmNoZWNrQmFzZVBsdWdpbnMgPSBjaGVja0Jhc2VQbHVnaW5zOwotCX0KLQkKLQlwcml2YXRlIEZpbGUgZ2V0UmVzb3VyY2VGaWxlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlSZXNvdXJjZSByZXMgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQlyZXR1cm4gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbGlkYXRlSG9va0RhdGEoKSB7Ci0JCXJldHVybiB2YWxpZGF0ZUhvb2tEYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlSG9va0RhdGEoT2JqZWN0IHZhbGlkYXRlSG9va0RhdGEpIHsKLQkJdGhpcy52YWxpZGF0ZUhvb2tEYXRhID0gdmFsaWRhdGVIb29rRGF0YTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvUmVzb3VyY2VTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzliYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy9zZXJ2aWNlcy9SZXNvdXJjZVNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotCi0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBzY2FuIGFuZCBjb3B5IHJlc291cmNlcyBmcm9tIHRoZSBzb3VyY2UgbGlicmFyeSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VTY2FubmVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3NyY19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoInNyY1xccyo9XFxzKlwiKC4qPylcIiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotLy8JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoIjxhXFxzKz8oW14+XSopPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2hyZWZfcmVmID0gUGF0dGVybi5jb21waWxlKCJocmVmXFxzKj1cXHMqXCIoLio/KVwiIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlGaWxlIHNyY0xpYlJvb3Q7Ci0JRmlsZSB0YXJnZXRMaWJSb290OwotCQotCXByaXZhdGUgTWFwIG5ld0ZpbGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGV4aXN0aW5nRmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JTWFwPFN0cmluZywgU3RyaW5nPiByZW5hbWVQbHVnaW5NYXA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8JCi0JcHVibGljIFJlc291cmNlU2Nhbm5lcihGaWxlIHNyY0xpYlJvb3QsIEZpbGUgdGFyZ2V0TGliUm9vdCwgTWFwPFN0cmluZywgU3RyaW5nPiByZW5hbWVQbHVnaW5NYXApIHsKLQkJdGhpcy5zcmNMaWJSb290ID0gc3JjTGliUm9vdDsKLQkJdGhpcy50YXJnZXRMaWJSb290ID0gdGFyZ2V0TGliUm9vdDsKLQkJdGhpcy5yZW5hbWVQbHVnaW5NYXAgPSByZW5hbWVQbHVnaW5NYXA7Ci0JfQotCQotCS8qKgotCSAqIHNjYW4gdGggZXRleHQgYW5kIGNvcHkgdGhlIHJlc291cmNlcwotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHNvdXJjZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzY2FuKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBzb3VyY2UpIHsKLQkJCi0JCXRyeQotCQl7Ci0JCQkvLyBwcm9jZXNzIGltYWdlcyBhbmQgb3RoZXIgc3JjIHJlc291cmNlcwotCQkJTWF0Y2hlciBtID0gcF9zcmNfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXdoaWxlICggbS5maW5kKCkgKQotCQkJewotCQkJCVN0cmluZyB1cmwgPSBtLmdyb3VwKDEpOwotCQkJCXByb2Nlc3NVcmwob3duZXIsIHVybCk7Ci0JCQl9Ci0KLQkJCS8vIHByb2Nlc3MgaHJlZnMKLQkJCW0gPSBwX2hyZWZfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCQotCQkJd2hpbGUgKCBtLmZpbmQoKSApCi0JCQl7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQkJcHJvY2Vzc1VybChvd25lciwgdXJsKTsKLQkJCX0JCQkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQl7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBwcm9jZXNzIHRoZSB1cmwgYW5kIGNvcHkgdGhlIHJlc291cmNlCi0JICogaWYgdGhlIG93bmVyIGVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUgdXJsIGlzIHJlbGF0aXZlIHRvIHRoZSBvd25lciBlbGVtZW50LCAKLQkgKm90aGVyd2lzZSBpdCdzIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5Ci0JICoKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gdXJsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NVcmwoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIHVybCkgewotCQlwcm9jZXNzVXJsKG93bmVyLCB1cmwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1VybChNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCQotCQlpZiAoIHVybCA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZigiIyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaW5kZXggPj0gMCApCi0JCXsKLQkJCXVybCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlpbmRleCA9IHVybC5pbmRleE9mKCI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBpbmRleCA+PSAwICkKLQkJewotCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQkJCi0JCWlmICh1cmwudHJpbSgpLmxlbmd0aCgpID09IDAgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHRoZSB1cmwgaXMgcmVsYXRpdmUgdG8gdGhlIG93bmVyIGVsZW1lbnQKLQkJLy8gbmVlZCB0byBjb252ZXJ0IHRvIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkJRmlsZSBzcmNGaWxlID0gbnVsbDsKLQkJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICggb3duZXIgIT0gbnVsbCApIHsKLQkJCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciBsaWJSZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCQkJU3RyaW5nIGVsZW1lbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgob3duZXIpOwotCQkJCS8vc3JjRmlsZSA9IG5ldyBGaWxlKG5ldyBGaWxlKHNyY0xpYlJvb3QsIGVsZW1lbnRQYXRoKSwgdXJsKTsKLQkJCQkvL2lmICghc3JjRmlsZS5pc0ZpbGUoKSB8fCAhc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCQllbGVtZW50UGF0aCA9IGdldEVsZW1lbnRQYXRoV2l0aFJlbmFtZWRQbHVnaW4oZWxlbWVudFBhdGgpOwotCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUoc3JjTGliUm9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJCS8vfQotCQkJCWlmICghc3JjRmlsZS5pc0ZpbGUoKSB8fCAhc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCQl1cmwgPSBOZXRVdGlsLmRlY29kZVVSTCh1cmwpOwotCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUoc3JjTGliUm9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJCX0KLQkJCQkvL3RhcmdldEZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZSh0YXJnZXRMaWJSb290LCBlbGVtZW50UGF0aCksIHVybCk7Ci0JCQkJU3RyaW5nIHBsdWdpblBhdGggPSBsaWJSZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG93bmVyKTsKLQkJCQlGaWxlIHRhcmdldFJvb3QgPSAobmV3IEZpbGUocGx1Z2luUGF0aCkpLmdldFBhcmVudEZpbGUoKTsKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUodGFyZ2V0Um9vdCwgZWxlbWVudFBhdGgpLCB1cmwpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQkJfQkJCQotCQkJCUZpbGUgc3JjUGx1Z2luUm9vdCA9IG5ldyBGaWxlKHNyY0xpYlJvb3QsIHBsdWdpbi5nZXROYW1lKCkpOwotCQkJCXNyY0ZpbGUgPSBuZXcgRmlsZShzcmNQbHVnaW5Sb290LCB1cmwpOwotCQkJCWlmICghc3JjRmlsZS5pc0ZpbGUoKSB8fCAhc3JjRmlsZS5leGlzdHMoKSkgewotCQkJCQl1cmwgPSBOZXRVdGlsLmRlY29kZVVSTCh1cmwpOwotCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdCwgdXJsKTsKLQkJCQl9Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IocGx1Z2luKTsJCQkJCi0JCQkJU3RyaW5nIHNyY1BsdWdpblJvb3RQYXRoID0gbGliUmVzTWdyLmdldFBoeXNpY2FsUGx1Z2luUGF0aChwbHVnaW4pOwkKLQkJCQl0YXJnZXRGaWxlID0gbmV3IEZpbGUoc3JjUGx1Z2luUm9vdFBhdGgsIHVybCk7CQkJCQotCQkJfQotCQkJCi0JCQlpZiAoIHNyY0ZpbGUuaXNGaWxlKCkgJiYgc3JjRmlsZS5leGlzdHMoKSApIHsKLQotCQkJCXNyY0ZpbGUgPSBzcmNGaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJCQl0YXJnZXRGaWxlID0gdGFyZ2V0RmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCQkJCi0JCQkJaWYgKCB0YXJnZXRGaWxlLmV4aXN0cygpICkgewotCQkJCQlpZiAoICFleGlzdGluZ0ZpbGVNYXAuY29udGFpbnNLZXkoc3JjRmlsZSkgKSB7Ci0JCQkJCQlpZiAoIHNyY0ZpbGUubGVuZ3RoKCkgIT0gdGFyZ2V0RmlsZS5sZW5ndGgoKSAKLQkJCQkJCQkJfHwgc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSAhPSB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpICkKLQkJCQkJCXsKLQkJCQkJCQlleGlzdGluZ0ZpbGVNYXAucHV0KHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCAhbmV3RmlsZU1hcC5jb250YWluc0tleShzcmNGaWxlKSApIHsKLQkJCQkJCW5ld0ZpbGVNYXAucHV0KHNyY0ZpbGUsIHRhcmdldEZpbGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBMb2cgdGhlIGVycm9yIGFuZCBwcm9jZWVkLiBUT0RPCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50UGF0aFdpdGhSZW5hbWVkUGx1Z2luKFN0cmluZyBlbGVtZW50UGF0aCkgewotCQlpZiAocmVuYW1lUGx1Z2luTWFwICE9IG51bGwgJiYgISByZW5hbWVQbHVnaW5NYXAuaXNFbXB0eSgpKSB7Ci0JCQlpbnQgaXggPSBlbGVtZW50UGF0aC5pbmRleE9mKCJcXCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChpeCA+IDApIHsKLQkJCQlTdHJpbmcgYmFzZVBsdWdpbk5hbWUgPSAgZWxlbWVudFBhdGguc3Vic3RyaW5nKDAsIGl4KTsKLQkJCQlTdHJpbmcgaW1wb3J0UGx1Z2luTmFtZSA9IHJlbmFtZVBsdWdpbk1hcC5nZXQoYmFzZVBsdWdpbk5hbWUpOwotCQkJCWlmIChpbXBvcnRQbHVnaW5OYW1lICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGltcG9ydFBsdWdpbk5hbWUgKyBlbGVtZW50UGF0aC5zdWJzdHJpbmcoaXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudFBhdGg7Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2UoU3RyaW5nIHVybCwgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlwcm9jZXNzVXJsKG51bGwsIHVybCwgcGx1Z2luKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsKSB7Ci0JCXByb2Nlc3NVcmwob3duZXIsIHVybCk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlcyB0byBiZSByZXBsYWNlZAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZmlsZSBwYXRoIHN0cmluZwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEZpbGVzVG9iZVJlcGxhY2VkKCkgewotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIGV4aXN0aW5nRmlsZU1hcC5zaXplKCkgPiAwICkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGV4aXN0aW5nRmlsZU1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUZpbGUgZiA9IChGaWxlKWl0Lm5leHQoKTsKLQkJCQlpZiAoZiAhPSBudWxsICkgewotCQkJCQlTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJCWlmICggIWZpbGVzLmNvbnRhaW5zKHBhdGgpICkgewotCQkJCQkJZmlsZXMuYWRkKHBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCQotCS8qKgotCSAqIGNvcHkgYWxsIHRoZSBmaWxlcyB0byB0aGUgZGVzdGluYXRpb24KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3RmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCUZpbGUgc3JjRmlsZSA9IChGaWxlKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IChGaWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGFyZ2V0RmlsZSk7Ci0JCX0JCi0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXhpc3RpbmdGaWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOwotCQkJRmlsZSBzcmNGaWxlID0gKEZpbGUpIGVudHJ5LmdldEtleSgpOwotCQkJRmlsZSB0YXJnZXRGaWxlID0gKEZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0YXJnZXRGaWxlKTsKLQkJfQkKLQl9Ci0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmIxMTE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGNvbmZpZ3VyYXRpb24gaW1wb3J0IHNlcnZpY2VzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWY3NjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkVsZW1lbnREaWZmVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZGlmZiByZXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmUmVwb3J0Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlcigpIHsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50RGlmZlRyZWUpIHsKLQkJCQotCQkJTWV0aG9kRWxlbWVudCBlID0gKChFbGVtZW50RGlmZlRyZWUpaW5wdXRFbGVtZW50KS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCi0JCQkvLyBkb24ndCBzaG93IHN1Yi1wYWNrYWdlcyB1bmRlciBwcm9jZXNzIGNvbXBvbmVudCwgaGlkZSB0aGUgcHJvY2VzcyBkZXRpYWwKLQkJCWlmICggKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSApIHsKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCQkJfQotCi0JCQlMaXN0IGl0ZW1zID0gKChFbGVtZW50RGlmZlRyZWUpIGlucHV0RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQkJTGlzdCBkaXJ0eUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVsZW1lbnREaWZmVHJlZSBpdGVtID0gKEVsZW1lbnREaWZmVHJlZSkgaXQubmV4dCgpOwotCQkJCQlpZiAoaXRlbS5pc09sZE9ubHkoKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIDE1MDg5NUltcG9ydCBDb25maWc6IEN1c3RvbUNhdGVnb3J5IGRpZCBub3Qgc3luYyB1cCBieSBpbXBvcnQKLQkJCQkJLy8gdG8gZml4IHRoaXMgcHJvYmxlbSwgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBIaWRkZW4gcm9vdCBjdXN0b21DYXRlZ29yeSBwYWNrYWdlIAotCQkJCQkvLyBidXQgbmVlZCB0byBoaWRlIGhlcmUKLQkJCQkJTWV0aG9kRWxlbWVudCBiYXNlID0gaXRlbS5nZXRCYXNlRWxlbWVudCgpOwotCQkJCQlpZiAoIChiYXNlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgCi0JCQkJCQkJJiYgVG5nVXRpbC5pc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZSgoTWV0aG9kUGFja2FnZSliYXNlKSApIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlkaXJ0eUl0ZW1zLmFkZChpdGVtKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gZGlydHlJdGVtcy50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRzKHBhcmVudEVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJcmV0dXJuICgoRWxlbWVudERpZmZUcmVlKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnREaWZmVHJlZSkgewotCQkJcmV0dXJuICgoRWxlbWVudERpZmZUcmVlKSBlbGVtZW50KS5oYXNDaGlsZHJlbigpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0TGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzlmYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0RpZmZSZXBvcnRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuRWxlbWVudERpZmZUcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBkaWZmIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpZmZSZXBvcnRMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIsCi0JCUlUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlmZlJlcG9ydExhYmVsUHJvdmlkZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlRnJvbU9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRJbWFnZShvYmplY3QpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudERpZmZUcmVlKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgZGlmZlRyZWUgPSAoRWxlbWVudERpZmZUcmVlKSBvYmplY3Q7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXROYW1lKCk7Ci0KLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkgewotCQkJCXJldHVybiBkaWZmVHJlZS5nZXRDb250ZW50VHlwZSgpOwotCQkJfSBlbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKSB7Ci0JCQkJcmV0dXJuIChkaWZmVHJlZS5nZXRJbXBvcnRFbGVtZW50KCkgPT0gbnVsbCkgPyAiIiA6IEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0TGFiZWxQcm92aWRlcl95ZXM7IC8vJE5PTi1OTFMtMSQJCQkKLSAKLQkJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykgewotCQkJCXJldHVybiAoZGlmZlRyZWUuZ2V0QmFzZUVsZW1lbnQoKSA9PSBudWxsKSA/ICIiIDogSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRMYWJlbFByb3ZpZGVyX3llczsgLy8kTk9OLU5MUy0xJAkJCi0gCi0JCQl9IGVsc2UgaWYgKGNvbHVtbkluZGV4ID09IDQpIHsKLQkJCQlyZXR1cm4gZGlmZlRyZWUuZ2V0RGlmZk1lc3NhZ2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uVGV4dChvYmplY3QsIDApOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIHdlIHdvbid0IGV2ZXIgZ2VuZXJhdGUgdGhlc2Ugbm90aWZpY2F0aW9ucywgd2UgY2FuIGp1c3QgaWdub3JlCi0JICogdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugd2Ugd29uJ3QgZXZlciBhZGQgbGlzdGVuZXJzLCB3ZSBjYW4ganVzdCBpZ25vcmUgdGhpcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogQWx3YXlzIHJldHVybnMgdHJ1ZSBmb3Igbm93LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Vmlld2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvRGlmZlJlcG9ydFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY2NDA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9EaWZmUmVwb3J0Vmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRyZWVDb2x1bW47Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgbWV0aG9kIGxpYnJhcnkgZGlmZmVyZW5jZXMgZm9yIGFuIGltcG9ydAotICogb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWZmUmVwb3J0Vmlld2VyIHsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJvdGVjdGVkIENoZWNrYm94VHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCURpZmZSZXBvcnRWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YSkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJCi0JCXRyZWVWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHBhcmVudCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpCi0JCQkJLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRGlmZlJlcG9ydENvbnRlbnRQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEaWZmUmVwb3J0TGFiZWxQcm92aWRlcigpKTsKLQkJY3JlYXRlVGFibGVDb2x1bW5zKCk7Ci0JCQotCQlhZGRMaXN0ZW5lcnMoKTsKLQkJCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGFibGUgY29sdW1ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVDb2x1bW5zKCkgewotCQlUcmVlIHRyZWUgPSB0cmVlVmlld2VyLmdldFRyZWUoKTsKLQkJdHJlZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdHJlZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0cmVlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlUcmVlQ29sdW1uIGNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCAwKTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfY29udGVudCk7IAotCQljb2x1bW4uc2V0V2lkdGgoMjAwKTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMSk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX3R5cGUpOyAKLQkJY29sdW1uLnNldFdpZHRoKDE1MCk7Ci0KLQkJY29sdW1uID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULk5PTkUsIDIpOwotCQljb2x1bW4uc2V0VGV4dChJbXBvcnRSZXNvdXJjZXMuRGlmZlJlcG9ydFZpZXdlcl9pbl9pbXBvcnQpOyAKLQkJY29sdW1uLnNldFdpZHRoKDc1KTsKLQotCQljb2x1bW4gPSBuZXcgVHJlZUNvbHVtbih0cmVlLCBTV1QuTk9ORSwgMyk7Ci0JCWNvbHVtbi5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5EaWZmUmVwb3J0Vmlld2VyX2luX2xpYik7IAotCQljb2x1bW4uc2V0V2lkdGgoNzUpOwotCi0JCWNvbHVtbiA9IG5ldyBUcmVlQ29sdW1uKHRyZWUsIFNXVC5OT05FLCA0KTsKLQkJY29sdW1uLnNldFRleHQoSW1wb3J0UmVzb3VyY2VzLkRpZmZSZXBvcnRWaWV3ZXJfc3RhdHVzKTsgCi0JCWNvbHVtbi5zZXRXaWR0aCgxMDApOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSByZXZpdy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UmVwb3J0KE9iamVjdCBpbnB1dCkgewotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJdHJlZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCXNldENoZWNrU3RhdGVzKCk7Ci0JCXRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJLy8gYWRkIGEgY2hlY2sgc3RhdGUgY2hhbmdlIGxpc3RlbmVyCi0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gY2hlY2tlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJCQl1cGRhdGVDaGVja1N0YXRlcyhldmVudC5nZXRFbGVtZW50KCksIGNoZWNrZWQpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoZWNrU3RhdGVzKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQotCQkvLyBPYmplY3QgZWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQotCQlpZiAoY2hlY2tlZCA9PSB0cnVlKSB7Ci0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdHJlZVZpZXdlcgotCQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQljaGVja1BhcmVudChjcCwgZWxlbWVudCk7Ci0JCQkvLyB0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIGZhbHNlKTsKLQkJCQotCQlzZWxlY3Rpb25DaGlsZHJlbihlbGVtZW50LCBjaGVja2VkKTsKLQotCQlzZXREYXRhKHRyZWVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY2hlY2tlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoaWxkcmVuKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGNoZWNrZWQpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdFtdIGNoaWxkcyA9IGNwLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcy5sZW5ndGg7IGkrKykgewotCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGNoaWxkc1tpXSwgY2hlY2tlZCk7Ci0JCQlzZWxlY3Rpb25DaGlsZHJlbihjaGlsZHNbaV0sIGNoZWNrZWQpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY2hlY2tQYXJlbnQoSVRyZWVDb250ZW50UHJvdmlkZXIgY3AsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiB8fCBlbGVtZW50ID09Ci0JCQkJCQkJCQkJCQkJCQkJICogY3VycmVudFJvb3ROb2RlCi0JCQkJCQkJCQkJCQkJCQkJICovKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHBhcmVudCA9IExpYnJhcnlVdGlsLnVud3JhcChjcC5nZXRQYXJlbnQoZWxlbWVudCkpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJLy8gY29uZmlnRmFjdG9yeS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmFkZCgoRU9iamVjdClwYXJlbnQsCi0JCQkvLyBmYWxzZSk7Ci0JCQljaGVja1BhcmVudChjcCwgcGFyZW50KTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDaGVja1N0YXRlcygpIHsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHRyZWVWaWV3ZXIuZ2V0SW5wdXQoKTsKLQkJCXNlbGVjdGlvbkNoaWxkcmVuKGVsZW1lbnQsIHRydWUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0VmlzaWJsZSh0cnVlKTsKLQkJfQotCi0JCXNldERhdGEodHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXREYXRhKE9iamVjdFtdIHNlbHMpIHsKLQkJaWYgKCBzZWxzID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWRhdGEuaW1wb3J0TGlzdC5jbGVhcigpOwotCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBzZWxzLmxlbmd0aDsgaSsrICkgewotCQkJZGF0YS5pbXBvcnRMaXN0LmFkZChzZWxzW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0Q29uZmlnUmVwb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmViM2MxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWdSZXBvcnRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBkaXNwbGF5cyB0aGUgcmVzdWx0IG9mIGFuIGltcG9ydCBvcGVyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRDb25maWdSZXBvcnRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBpbXBvcnRpbmdTZXJ2aWNlOwotCi0JRGlmZlJlcG9ydFZpZXdlciB2aWV3ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRDb25maWdSZXBvcnRQYWdlKENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlIGltcG9ydGluZ1NlcnZpY2UpIHsKLQkJc3VwZXIoSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ1JlcG9ydFBhZ2VfdGl0bGUpOwotCQl0aGlzLmltcG9ydGluZ1NlcnZpY2UgPSBpbXBvcnRpbmdTZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RICi0JCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfVkVSVElDQUwpKTsKLQotCQl2aWV3ZXIgPSBuZXcgRGlmZlJlcG9ydFZpZXdlcihjb250YWluZXIsIGltcG9ydGluZ1NlcnZpY2UKLQkJCQkuZ2V0SW1wb3J0RGF0YSgpKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93IHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93UmVzdWx0KCkgewotCQkvLyBBbmFseXplIHRoZSBpbXBvcnRpbmcgY29uZmlndXJhdGlvbiBhbmQgcmVwb3J0IHJlc3VsdC4KLQkJaW1wb3J0aW5nU2VydmljZS5hbmFseXplKG51bGwpOwotCi0JCXZpZXdlci5zaG93UmVwb3J0KGltcG9ydGluZ1NlcnZpY2UuZ2V0RGlmZlRyZWUoKSk7Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWFhYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL0ltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS53aXphcmRzLlNhdmVBbGxFZGl0b3JzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTGlicmFyeUJhY2t1cFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGltcG9ydHMgZXhwb3J0ZWQgbGlicmFyeSBjb25maWd1cmF0aW9ucyBpbnRvIHRoZSBjdXJyZW50IG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJSW1wb3J0V2l6YXJkIHsKLQotCXB1YmxpYyBib29sZWFuIG9rVG9Db21wbGV0ZSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UgcGFnZTE7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnc1RvSW1wb3J0IGNvbmZpZ1BhZ2U7Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2Ugc3BlY3NQYWdlOwotCi0JcHJvdGVjdGVkIENvbmZpZ3VyYXRpb25JbXBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkltcG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlKAotCQkJZGF0YSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKCkgewotCQlzZXRXaW5kb3dUaXRsZShJbXBvcnRSZXNvdXJjZXMuaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlKTsKLQkJc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJLnRvRmlsZVN0cmluZygpLCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQl9Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIG1hbmFnZXIuaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSkgewotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5pbXBvcnRDb25maWdXaXphcmRfdGl0bGUsCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX3JlYWRvbmx5KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVNhdmVBbGxFZGl0b3JzUGFnZS5hZGRQYWdlSWZOZWVkZWQodGhpcywgdHJ1ZSwgbnVsbCwgbnVsbCwgSW1wb3J0UGx1Z2luCi0JCQkJLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vSW1wb3J0TGlicmFyeUNvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZShkYXRhLCBzZXJ2aWNlKTsKLQkJYWRkUGFnZShwYWdlMSk7Ci0KLQkJY29uZmlnUGFnZSA9IG5ldyBTZWxlY3RDb25maWdzVG9JbXBvcnQoc2VydmljZSk7Ci0JCWFkZFBhZ2UoY29uZmlnUGFnZSk7Ci0KLQkJc3BlY3NQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlKGRhdGEpOwotCQlhZGRQYWdlKHNwZWNzUGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX0NPTkZJR1VSQVRPTik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJcmV0dXJuIG9rVG9Db21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkI3BlcmZvcm1GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCS8vIFByb21wdCB0aGUgdXNlciB0byBiYWNrIHVwIGxpYnJhcnkuCi0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cEN1cnJlbnRMaWJyYXJ5KG51bGwsIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCS8vIFN0YXJ0IHRoZSBpbXBvcnQuCi0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX01TRzEsCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQkJc2VydmljZS5wZXJmb3JtSW1wb3J0KG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIGZhbHNlLCBvcCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlUaHJvd2FibGUgcmVhbEV4Y2VwdGlvbiA9IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydENvbmZpZ3VyYXRpb25XaXphcmRfZXJyb3IsCi0JCQkJCXJlYWxFeGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFNhdmUgdGhlIGltcG9ydCBwYXRoIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JCUltcG9ydFVJUHJlZmVyZW5jZXMuYWRkSW1wb3J0Q29uZmlnRGlyKGRhdGEubGxEYXRhLmdldFBhcmVudEZvbGRlcigpKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRQbHVnaW5XaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRQbHVnaW5XaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkY2UzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0UGx1Z2luV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLndpemFyZHMuU2F2ZUFsbEVkaXRvcnNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlBsdWdpbkRlcEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklJbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGltcG9ydHMgYW4gZXhwb3J0ZWQgbWV0aG9kIHBsdWctaW5zIGludG8gdGhlIGN1cnJyZW50IG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFBsdWdpbldpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElJbXBvcnRXaXphcmQgewotCi0JcHJvdGVjdGVkIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZSBwYWdlMTsKLQotCXByb3RlY3RlZCBTZWxlY3RQbHVnaW5zVG9JbXBvcnQgcGFnZTI7Ci0KLQlwcm90ZWN0ZWQgUGx1Z2luSW1wb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkltcG9ydERhdGEoKTsKLQotCXByb3RlY3RlZCBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgUGx1Z2luSW1wb3J0aW5nU2VydmljZShkYXRhKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltcG9ydFBsdWdpbldpemFyZCgpIHsKLQkJc2V0V2luZG93VGl0bGUoSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChJV29ya2JlbmNoLAotCSAqICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gY2hlY2sgb3V0IHRoZSBsaWJyYXJ5IGZpcnN0Ci0JCUlGaWxlTWFuYWdlciBmaWxlTWdyID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKTsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlmaWxlTWdyLmNoZWNrTW9kaWZ5KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkuZVJlc291cmNlKCkuZ2V0VVJJKCkKLQkJCQkJLnRvRmlsZVN0cmluZygpLCBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkpOwotCQl9Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeVJlYWRPbmx5KCkpIHsKLQkJCUltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuaW1wb3J0UGx1Z2luc1dpemFyZF90aXRsZSwKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF9yZWFkb25seSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTYXZlQWxsRWRpdG9yc1BhZ2UuYWRkUGFnZUlmTmVlZGVkKHRoaXMsIHRydWUsIG51bGwsIG51bGwsIEltcG9ydFBsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCQkJImZ1bGwvd2l6YmFuL0ltcG9ydE1ldGhvZFBsdWdpbnMuZ2lmIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFnZTEgPSBuZXcgU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlKGRhdGEsIHNlcnZpY2UpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQotCQlwYWdlMiA9IG5ldyBTZWxlY3RQbHVnaW5zVG9JbXBvcnQoZGF0YSwgc2VydmljZSk7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZShMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9QTFVHSU4pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmICh0aGlzLmdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgIT0gcGFnZTIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBwYWdlMi5pc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHBsdWctaW5zIGFyZSB1cGRhdGFibGUgb3Igbm90LgotCQlQbHVnaW5Nb2RpZnlJbmZvIG1vZGlmeUluZm8gPSBjaGVja01vZGlmeSgpOwotCi0JCS8vIGlmIG9ubHkgbG9ja2VkLCB3ZSBjYW4gYXV0by11bmxvY2sgYW5kIHJlbG9jayB0aGUgcGx1Z2lucwotCQkvLyBpZiB0aGUgcGx1aW4gaXMgcmVhZG9ubHksIHVzZXIgbmVlZCB0byBtYW51YWxseSBtYWtlIGl0IHVwZGF0YWJsZQotCQkvLyBjdXN0b21lcnMgbmVlZCB0byBtYW51YWxseSB1bmxvY2sgYW5kIGxvY2sgcGx1Z2lucwotCQkvLyBkdXJpbmcgY29udGVudCBsaWJyYXJ5IHVwZ3JhZGUKLQotCQlpZiAobW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJLy8gRGlzcGxheSBhbiBlcnJvciBtZXNzYWdlLgotCQkJU3RyaW5nIGVycm9yID0gbW9kaWZ5SW5mby5nZXRSZWFkb25seU1lc3NhZ2UoKS50b1N0cmluZygpOwotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkX2Vycm9yLCBlcnJvcik7Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbyBpbmZvOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGF0YS5nZXRQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaW5mbyA9IChQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICgoaW5mby5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSAmJiBpbmZvLnNlbGVjdGVkKSB7Ci0JCQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpLmFwcGVuZChpbmZvLm5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotCQkJYm9vbGVhbiB5ZXMgPSBJbXBvcnRQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUsCi0JCQkJCQkJTkxTCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJSW1wb3J0UmVzb3VyY2VzLkltcG9ydFBsdWdpbldpemFyZF93YXJuX2V4aXN0aW5nX3BsdWdpbnMsCi0JCQkJCQkJCQkJCWJ1ZmZlci50b1N0cmluZygpKSk7Ci0KLQkJCWlmICgheWVzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJaWYgKG1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IG1vZGlmeUluZm8uZ2V0TG9ja2VkTWVzc2FnZSgpLnRvU3RyaW5nKCkKLQkJCQkJKyBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7Ci0JCQlib29sZWFuIHllcyA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJSW1wb3J0UmVzb3VyY2VzLmltcG9ydFBsdWdpbnNXaXphcmRfdGl0bGUsIG1lc3NhZ2UpOwotCQkJaWYgKCF5ZXMpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBQcm9tcHQgdXNlciB0byBiYWNrIHVwIGxpYnJhcnkuCi0JCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cEN1cnJlbnRMaWJyYXJ5KG51bGwsIExpYnJhcnlTZXJ2aWNlCi0JCQkJLmdldEluc3RhbmNlKCkpOwotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfTVNHMSwKLQkJCQkJCQlJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCi0JCQkJCS8vIFN0YXJ0IHRoZSBpbXBvcnQuCi0JCQkJCXNlcnZpY2UucGVyZm9ybUltcG9ydChtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCBmYWxzZSwgb3ApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHJlYWxFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCUltcG9ydFJlc291cmNlcy5JbXBvcnRQbHVnaW5XaXphcmRfZXJyb3IsIAotCQkJCQlyZWFsRXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJY2hlY2tQbHVnaW5DaXJjdWxhckRlcGVuZGVuY3koKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQkvLyBTYXZlIHRoZSBpbXBvcnQgcGF0aCB0byBwcmVmZXJlbmNlIHN0b3JlLgotCQlJbXBvcnRVSVByZWZlcmVuY2VzLmFkZEltcG9ydFBsdWdpbkRpcihkYXRhLmxsRGF0YS5nZXRQYXJlbnRGb2xkZXIoKSk7Ci0KLQkJSW1wb3J0VUlQcmVmZXJlbmNlcy5zZXRDaGVja0Jhc2VQbHVnaW5zKHNlcnZpY2UuaXNDaGVja0Jhc2VQbHVnaW5zKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgUGx1Z2luTW9kaWZ5SW5mbyBvYmplY3QuCi0JICovCi0JcHVibGljIFBsdWdpbk1vZGlmeUluZm8gY2hlY2tNb2RpZnkoKSB7Ci0JCS8vIFN0cmluZ0J1ZmZlciBlcnJvciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gbmV3IFBsdWdpbk1vZGlmeUluZm8oKTsKLQotCQlQbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm8gaW5mbzsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGRhdGEuZ2V0UGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWluZm8gPSAoUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSBpdC5uZXh0KCk7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gaW5mby5leGlzdGluZ1BsdWdpbjsKLQkJCWlmICgocGx1Z2luICE9IG51bGwpICYmIGluZm8uc2VsZWN0ZWQpIHsKLQkJCQlpZiAocGx1Z2luLmdldFVzZXJDaGFuZ2VhYmxlKCkuYm9vbGVhblZhbHVlKCkgPT0gZmFsc2UpIHsKLQkJCQkJLy8gVGhlIHBsdWctaW4gaXMgbG9ja2VkCi0JCQkJCW1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBUaGUgcGx1Zy1pbiBleGlzdHMgaW4gdGhlIGN1cnJlbnQgbGlicmFyeSwgbWFrZSBzdXJlIHRoZQotCQkJCQkvLyBwbHVnLWluIGlzIHVwZGF0YWJsZS4KLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChwbHVnaW4sIGdldFNoZWxsKCkpOwotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCW1vZGlmeUluZm8ucmVhZG9ubHlQbHVnaW5zLmFkZChwbHVnaW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmeUluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrUGx1Z2luQ2lyY3VsYXJEZXBlbmRlbmN5KCkgewotCQlQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3IgPSBuZXcgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IoCi0JCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuQ2hlY2tSZXN1bHQgcmVzdWx0ID0gbWdyCi0JCQkJLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KG51bGwsIGZhbHNlKTsKLQkJaWYgKHJlc3VsdC5jaXJjdWxhckxpc3QgIT0gbnVsbCAmJiAhcmVzdWx0LmNpcmN1bGFyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgY2lyUGx1Z2lucyA9IChMaXN0KSByZXN1bHQuY2lyY3VsYXJMaXN0LmdldCgwKTsKLQkJCVN0cmluZyBtc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaXJQbHVnaW5zLnNpemUoKTsgaSsrKSB7Ci0JCQkJUGx1Z2luRGVwSW5mbyBwaW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJQbHVnaW5zLmdldChpKTsKLQkJCQlpZiAoaSAhPSAwKSB7Ci0JCQkJCW1zZyArPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW1zZyArPSBwaW5mby5nZXRQbHVnaW4oKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlXYXJuaW5nKAotCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX3dhcm5fY2lyY3VsYXJfcGx1Z2lucywKLQkJCQkJbXNnKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvSW1wb3J0VUlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDgyOTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9JbXBvcnRVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgSW1wb3J0IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0VUlQcmVmZXJlbmNlcyB7Ci0KLQkvLyBUaGUgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9QTFVHSU5fRElSUyA9ICJpbXBvcnRQbHVnaW5EaXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzIHByZWZlcmVuY2Uga2V5LgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBPUlRfQ09ORklHX0RJUlMgPSAiaW1wb3J0Q29uZmlnRGlycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjaGVjayBiYXNlIHBsdWctaW5zIHByZWZlcmVuY2Uga2V5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tfQkFTRV9QTFVHSU5TID0gImNoZWNrQmFzZVBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgZGVmYXVsdCBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcnkgbmFtZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTVBPUlRfUExVR0lOX0RJUl9OQU1FID0gIkV4cG9ydCIgKyBGaWxlVXRpbC5GSUxFX1NFUCArICJQbHVnaW5zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCSAKLQotCS8vIFRoZSBkZWZhdWx0IGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSBuYW1lLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lNUE9SVF9DT05GSUdfRElSX05BTUUgPSAiRXhwb3J0IiArIEZpbGVVdGlsLkZJTEVfU0VQICsgIkNvbmZpZ3VyYXRpb25zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCSAKLQotCS8vIFRoZSBkZWZhdWx0IGltcG9ydCBwbHVnLWluIGRpcmVjdG9yeS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdEltcG9ydFBsdWdpbkRpciA9IG51bGw7Ci0KLQkvLyBUaGUgZGVmYXVsdCBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRJbXBvcnRDb25maWdEaXIgPSBudWxsOwotCi0JLy8gVGhlIHBsdWctaW4gc3BlY2lmaWMgcHJlZmVyZW5jZSBzdG9yZS4KLQlwcml2YXRlIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlIHByZWZTdG9yZSA9IEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KElNUE9SVF9QTFVHSU5fRElSUywgZ2V0RGVmYXVsdEltcG9ydFBsdWdpbkRpcigpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU1QT1JUX0NPTkZJR19ESVJTLCBnZXREZWZhdWx0SW1wb3J0Q29uZmlnRGlyKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChDSEVDS19CQVNFX1BMVUdJTlMsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEltcG9ydFBsdWdpbkRpcigpIHsKLQkJaWYgKGRlZmF1bHRJbXBvcnRQbHVnaW5EaXIgPT0gbnVsbCkgewotCQkJZGVmYXVsdEltcG9ydFBsdWdpbkRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhcHBOYW1lID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0QXBwbGljYXRpb25TaG9ydE5hbWUoKTsKLQkJCWlmIChhcHBOYW1lICE9IG51bGwgJiYgYXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZWZhdWx0SW1wb3J0UGx1Z2luRGlyID0gZGVmYXVsdEltcG9ydFBsdWdpbkRpcgotCQkJCQkJKyBGaWxlVXRpbC5GSUxFX1NFUCArIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0lNUE9SVF9QTFVHSU5fRElSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRJbXBvcnRQbHVnaW5EaXIgPSBkZWZhdWx0SW1wb3J0UGx1Z2luRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgREVGQVVMVF9JTVBPUlRfUExVR0lOX0RJUl9OQU1FOwotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0SW1wb3J0UGx1Z2luRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltcG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0SW1wb3J0UGx1Z2luRGlycygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIElNUE9SVF9QTFVHSU5fRElSUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1wb3J0IHBsdWctaW4gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBpbXBvcnQgcGx1Zy1pbiBkaXJlY3RvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEltcG9ydFBsdWdpbkRpcnNMaXN0KCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0TGlzdChwcmVmU3RvcmUsIElNUE9SVF9QTFVHSU5fRElSUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGltcG9ydCBkaXJlY3RvcnkgdG8gdGhlIGltcG9ydCBwbHVnLWluIGRpcmVjdG9yaWVzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgYW4gaW1wb3J0IGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbXBvcnRQbHVnaW5EaXIoU3RyaW5nIGRpcikgewotCQlQcmVmZXJlbmNlVXRpbC5hZGRUb0xpc3QocHJlZlN0b3JlLCBJTVBPUlRfUExVR0lOX0RJUlMsIGRpcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0SW1wb3J0Q29uZmlnRGlyKCkgewotCQlpZiAoZGVmYXVsdEltcG9ydENvbmZpZ0RpciA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0SW1wb3J0Q29uZmlnRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRJbXBvcnRDb25maWdEaXIgPSBkZWZhdWx0SW1wb3J0Q29uZmlnRGlyCi0JCQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgYXBwTmFtZSArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfSU1QT1JUX0NPTkZJR19ESVJfTkFNRTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVmYXVsdEltcG9ydENvbmZpZ0RpciA9IGRlZmF1bHRJbXBvcnRDb25maWdEaXIKLQkJCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyBERUZBVUxUX0lNUE9SVF9DT05GSUdfRElSX05BTUU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRJbXBvcnRDb25maWdEaXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRJbXBvcnRDb25maWdEaXJzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZVV0aWwuZ2V0U3RyaW5nVmFsdWVzKHByZWZTdG9yZSwgSU1QT1JUX0NPTkZJR19ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbXBvcnQgY29uZmlndXJhdGlvbiBkaXJlY3RvcmllcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGltcG9ydCBjb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0SW1wb3J0Q29uZmlnRGlyc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgSU1QT1JUX0NPTkZJR19ESVJTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgaW1wb3J0IGRpcmVjdG9yeSB0byB0aGUgaW1wb3J0IGNvbmZpZ3VyYXRpb24gZGlyZWN0b3JpZXMKLQkgKiBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIGFuIGltcG9ydCBkaXJlY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkSW1wb3J0Q29uZmlnRGlyKFN0cmluZyBkaXIpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgSU1QT1JUX0NPTkZJR19ESVJTLCBkaXIpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNoZWNrIGJhc2UgcGx1Zy1pbnMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrQmFzZVBsdWdpbnMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDSEVDS19CQVNFX1BMVUdJTlMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5vdENoZWNrQmFzZVBsdWdpbnMgb3B0aW9uIGZpbGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoQ0hFQ0tfQkFTRV9QTFVHSU5TLCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvUGx1Z2luTW9kaWZ5SW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1BsdWdpbk1vZGlmeUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmMjlhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvUGx1Z2luTW9kaWZ5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLkltcG9ydFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBjb25zdHJ1Y3QgYSBtZXNzYWdlIHRoYXQgbGlzdHMgYWxsIHRoZSBsb2NrZWQgb3IgcmVhZC1vbmx5Ci0gKiBtZXRob2QgcGx1Zy1pbnMgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbk1vZGlmeUluZm8gewotCi0JcHVibGljIExpc3Q8TWV0aG9kUGx1Z2luPiBsb2NrZWRQbHVnaW5zID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IHJlYWRvbmx5UGx1Z2lucyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luTW9kaWZ5SW5mbygpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgbWVzc2FnZSB0aGF0IGxpc3RzIGFsbCB0aGUgbG9ja2VkIG1ldGhvZCBwbHVnLWlucy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nQnVmZmVyPGNvZGU+IGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldExvY2tlZE1lc3NhZ2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsb2NrZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9sb2NrZWQsCi0JCQkJCQkJcGx1Z2luLmdldE5hbWUoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKG1zZyk7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgYSBtZXNzYWdlIHRoYXQgbGlzdHMgYWxsIHRoZSByZWFkLW9ubHkgbWV0aG9kIHBsdWctaW5zLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmdCdWZmZXI8Y29kZT4gY29udGFpbmluZyB0aGUgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVhZG9ubHlNZXNzYWdlKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVhZG9ubHlQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX3BsdWdpbl9yZWFkb25seSwKLQkJCQkJCQlwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQobXNnKTsKLQkJfQotCi0JCXJldHVybiBidWZmZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjJkNzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlnU3BlY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uCi0gKiBzcGVjaWZpY2FpdG9ucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZS5jbGFzcwotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5Q29uZmlnU3BlY0V4aXN0cyA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY0V4aXN0czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsaWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0cyA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9saWJyYXJ5Q29uZmlnU3BlY05vdEV4aXN0czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb25maWdTcGVjTm9TZWxlY3Rpb24gPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY05vU2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNvbmZpZ1NwZWNEYXRhTGFiZWwgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2VfY29uZmlnU3BlY0RhdGFMYWJlbDsKLQotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBjdHJsX2Noa2JveFRhYmxlVmlld2VyOwotCi0JLy8gMiBjb250cm9scyBmb3IgZGlzcGxheWluZyBjb25maWdzcGVjIGluZm8gZm9yIHBsdWdpbnMgaW4gaW1wb3J0IGRpcmVjdG9yeQotCXByaXZhdGUgVGV4dCBjdHJsX2JyaWVmRGVzY0ltcG9ydDsKLQotCXByaXZhdGUgTGFiZWwgaW1wb3J0Q29uZmlnU3BlY0xhYmVsOwotCi0JLy8gMiBjb250cm9scyBmb3IgZGlzcGxheWluZyBjb25maWdzcGVjIGluZm8gZm9yIHBsdWdpbnMgaW4gdGhlIGxpYnJhcnkKLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NMaWJyYXJ5OwotCi0JcHJpdmF0ZSBMYWJlbCBsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29uZmlnU3BlY3NUb0ltcG9ydFBhZ2UoQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnU3BlY3NXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ1NwZWNzV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0KLQkJQ29tcG9zaXRlIHRhYmxlQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjb250YWluZXIsIFNXVC5OT05FKTsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNyZWF0ZUxhYmVsKHRhYmxlQ29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9jb25maWdzLCAyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlciA9IGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIodGFibGVDb250YWluZXIsIDEpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBMaWJyYXJ5VUlJbWFnZXMuSU1HX01FVEhPRF9DT05GSUdVUkFUT047Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9OwotCi0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSBpbXBvcnRDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJY3JlYXRlSW1wb3J0Q29uZmlnU3BlY0luZm8oaW1wb3J0Q29udGFpbmVyKTsKLQotCQlDb21wb3NpdGUgbGlicmFyeUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlsaWJyYXJ5Q29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNyZWF0ZUxpYnJhcnlDb25maWdTcGVjSW5mbyhsaWJyYXJ5Q29udGFpbmVyKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUltcG9ydENvbmZpZ1NwZWNJbmZvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW1wb3J0Q29uZmlnU3BlY0xhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBjb25maWdTcGVjTm9TZWxlY3Rpb24sIDEpOwotCQljcmVhdGVMaW5lKGNvbnRhaW5lciwgMSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RDb25maWdTcGVjc1RvSW1wb3J0UGFnZV9sYWJlbF9kZXNjLCAxKTsKLQkJY3RybF9icmllZkRlc2NJbXBvcnQgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaWJyYXJ5Q29uZmlnU3BlY0luZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBjb25maWdTcGVjTm9TZWxlY3Rpb24sCi0JCQkJMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdENvbmZpZ1NwZWNzVG9JbXBvcnRQYWdlX2xhYmVsX2Rlc2MsIDEpOwotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQkJc2V0RGlzcGxheUF0dHJpYnV0ZXMoKENvbmZpZ1NwZWNzLkVudHJ5KSBjb25maWdzWzBdKTsKLQkJfSBlbHNlIHsKLQkJCWNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNwbGF5QXR0cmlidXRlcyhDb25maWdTcGVjcy5FbnRyeSBzcGVjKSB7Ci0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0Ci0JCQkJLnNldFRleHQoc3BlYy5jb25maWdTcGVjLmJyaWVmX2Rlc2MgPT0gbnVsbCA/ICIiIDogc3BlYy5jb25maWdTcGVjLmJyaWVmX2Rlc2MpOyAvLyROT04tTkxTLTEkCi0JCWltcG9ydENvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGNvbmZpZ1NwZWNEYXRhTGFiZWwpOwotCi0JCWlmIChzcGVjLmV4aXN0aW5nQ29uZmlnICE9IG51bGwpIHsKLQkJCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KHNwZWMuZXhpc3RpbmdDb25maWcKLQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsLnNldFRleHQobGlicmFyeUNvbmZpZ1NwZWNFeGlzdHMpOwotCQl9IGVsc2UgewotCQkJbGlicmFyeUNvbmZpZ1NwZWNMYWJlbC5zZXRUZXh0KGxpYnJhcnlDb25maWdTcGVjTm90RXhpc3RzKTsKLQkJCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKSB7Ci0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlsaWJyYXJ5Q29uZmlnU3BlY0xhYmVsLnNldFRleHQoY29uZmlnU3BlY05vU2VsZWN0aW9uKTsKLQkJaW1wb3J0Q29uZmlnU3BlY0xhYmVsLnNldFRleHQoY29uZmlnU3BlY05vU2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKGdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkubGVuZ3RoID4gMCkgewotCQkJLy8gU2V0IGRhdGEuc3BlY3MuY29uZmlncyBsaXN0LCBmaXggdGhlIHNlbGVjdGVkIGZpZWxkIG9mIGVhY2gKLQkJCS8vIGVudHJ5LgotCQkJSXRlcmF0b3IgaXRlciA9IGRhdGEuc3BlY3MuY29uZmlncy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJQ29uZmlnU3BlY3MuRW50cnkgZSA9IChDb25maWdTcGVjcy5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGN0cmxfY2hrYm94VGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlKSkKLQkJCQkJZS5zZWxlY3RlZCA9IHRydWU7Ci0JCQkJZWxzZQotCQkJCQllLnNlbGVjdGVkID0gZmFsc2U7Ci0JCQl9Ci0JCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJKChJbXBvcnRDb25maWd1cmF0aW9uV2l6YXJkKSBnZXRXaXphcmQoKSkub2tUb0NvbXBsZXRlID0gZmFsc2U7Ci0JCX0KLQotCQkvLyBBbHdheXMgcmV0dXJuIGZhbHNlIHNvIHRoYXQgdGhlICJOZXh0IiBidXR0b24gaXMgbmV2ZXIgZW5hYmxlZC4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjY2FuRmxpcFRvTmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZsaXBUb05leHRQYWdlKCkgewotCQlyZXR1cm4gaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0SW5wdXQoZGF0YS5zcGVjcy5jb25maWdzKTsKLQkJaWYgKGRhdGEuc3BlY3MuY29uZmlncy5zaXplKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJZGF0YS5zcGVjcy5jb25maWdzLmdldCgwKSk7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWwpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWVjOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdENvbmZpZ3NUb0ltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgZGlzcGxheXMgdGhlIGxpYnJhcnkgY29uZmlndXJhdGlvbiBlbGVtZW50cyB0aGF0IHdpbGwgYmUKLSAqIGltcG9ydGVkLgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0Q29uZmlnc1RvSW1wb3J0IGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29uZmlnc1RvSW1wb3J0LmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZSBzZXJ2aWNlOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCi0JcHJpdmF0ZSBEaWZmUmVwb3J0Vmlld2VyIGRpZmY7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RDb25maWdzVG9JbXBvcnQoQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZSkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShJbXBvcnRSZXNvdXJjZXMucmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMucmV2aWV3Q2hhbmdlc1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vaW1wX2xpYl9jb25mX3dpemJhbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLCBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0Q29uZmlnc1RvSW1wb3J0X2xhYmVsMSwgMSk7Ci0JCWRpZmYgPSBuZXcgRGlmZlJlcG9ydFZpZXdlcihjb250YWluZXIsIHNlcnZpY2UuZ2V0SW1wb3J0RGF0YSgpKTsKLQotCQlzZXRDb250cm9sKGNvbnRhaW5lcik7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCSgoSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZCkgZ2V0V2l6YXJkKCkpLm9rVG9Db21wbGV0ZSA9IHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWRpZmYuc2hvd1JlcG9ydChzZXJ2aWNlLmdldERpZmZUcmVlKCkpOwotCQkoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5va1RvQ29tcGxldGUgPSB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MzFmNzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZQotICogY29uZmlndXJhdGlvbnMgdG8gaW1wb3J0LgotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZSBleHRlbmRzIERlc3RpbmF0aW9uQ29tbW9uUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdHVzIG9rU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLAotCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsIDAsCi0JCQkiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydERhdGEgZGF0YTsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZTsKLQotCXByaXZhdGUgU3RhdHVzIHN0YXR1cyA9IG9rU3RhdHVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZShDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhLAotCQkJQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2Ugc2VydmljZSkgewotCQlzdXBlcihQQUdFX05BTUUsIGRhdGEubGxEYXRhKTsKLQkJc2V0VGl0bGUoSW1wb3J0UmVzb3VyY2VzLnNlbGVjdENvbmZpZ0RpcldpemFyZFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihJbXBvcnRSZXNvdXJjZXMuc2VsZWN0Q29uZmlnRGlyV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbGliX2NvbmZfd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZ1tdIGV4cG9ydERpcnMgPSBJbXBvcnRVSVByZWZlcmVuY2VzLmdldEltcG9ydENvbmZpZ0RpcnMoKTsKLQkJaWYgKGV4cG9ydERpcnMgIT0gbnVsbCAmJiBleHBvcnREaXJzLmxlbmd0aCA+IDApIHsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRJdGVtcyhleHBvcnREaXJzKTsKLQkJCWV4cG9ydFBhdGhDb21iby5zZXRUZXh0KGV4cG9ydERpcnNbMF0pOwotCQl9Ci0JCXN1cGVyLmluaXRDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpID09IG51bGwpIHsKLQkJCXNldEVycm9yTWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMubm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlib29sZWFuIHJldHVyblZhbHVlID0gZmFsc2U7Ci0JCXN0YXR1cyA9IG9rU3RhdHVzOwotCQlpZiAoZXhwb3J0UGF0aENvbWJvLmdldFRleHQoKS5sZW5ndGgoKSA+IDApIHsKLQkJCXNhdmVUb0RhdGFNb2RlbCgpOwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCWlmICghbGliRGlyLmV4aXN0cygpKSB7Ci0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwKLQkJCQkJCTAsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub19wYXRoLAotCQkJCQkJbnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVyblZhbHVlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhcHBseVRvU3RhdHVzTGluZSgpOwotCQlyZXR1cm4gcmV0dXJuVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlzYXZlVG9EYXRhTW9kZWwoKTsKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2VfTVNHMSwKLQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7Ci0JCQkJc2VydmljZS5hbmFseXplKG1vbml0b3IpOwotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9OwotCQl0cnkgewotCQkJLy8gVGhpcyBydW5zIHRoZSBvcHRpb25zLCBhbmQgc2hvd3MgcHJvZ3Jlc3MuCi0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yID0gZGF0YS5nZXRFcnJvckluZm8oKS5nZXRFcnJvcigpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGgoKSA+IDApIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydENvbmZpZ3VyYXRpb25Tb3VyY2Vfbm90X3VzZWQsCi0JCQkJCTAsIGVycm9yLCBudWxsKTsKLQkJCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCQlCYXNlV2l6YXJkUGFnZSBwYWdlID0gbnVsbDsKLQkJaWYgKGRhdGEuc3BlY3MgIT0gbnVsbCkKLQkJCXBhZ2UgPSAoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5zcGVjc1BhZ2U7Ci0JCWVsc2UgewotCQkJUGx1Z2luTW9kaWZ5SW5mbyBtb2RpZnlJbmZvID0gY2hlY2tNb2RpZnkoKTsKLQotCQkJLy8gaWYgb25seSBsb2NrZWQsIHdlIGNhbiBhdXRvLXVubG9jayBhbmQgcmVsb2NrIHRoZSBwbHVnaW5zCi0JCQkvLyBpZiB0aGUgcGx1aW4gaXMgcmVhZG9ubHksIHVzZXIgbmVlZCB0byBtYW51YWxseSBtYWtlIGl0IHVwZGF0YWJsZQotCQkJLy8gY3VzdG9tZXJzIG5lZWQgdG8gbWFudWFsbHkgdW5sb2NrIGFuZCBsb2NrIHBsdWdpbnMgZHVyaW5nIGNvbnRlbnQKLQkJCS8vIGxpYnJhcnkgdXBncmFkZQotCi0JCQlpZiAobW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuc2l6ZSgpID4gMCkgewotCi0JCQkJZXJyb3IgPSBtb2RpZnlJbmZvLmdldFJlYWRvbmx5TWVzc2FnZSgpLnRvU3RyaW5nKCk7Ci0KLQkJCQkvLyBzaG93IGVycm9yIG1lc3NhZ2UgYm94Ci0JCQkJSW1wb3J0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKS5kaXNwbGF5RXJyb3IoCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuSW1wb3J0Q29uZmlndXJhdGlvbldpemFyZF9lcnJvciwgZXJyb3IpOwotCi0JCQkJc3RhdHVzID0gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwKLQkJCQkJCTAsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9lcnJvcl9ub3RfdXBkYXRhYmxlLAotCQkJCQkJbnVsbCk7Ci0JCQkJYXBwbHlUb1N0YXR1c0xpbmUoKTsKLQkJCQlyZXR1cm4gdGhpczsKLQkJCX0KLQotCQkJLy8gYWxsb3cgdXNlciB0byBwcm9jZWVkIHdpdGggbG9ja2VkIHBsdWdpbnMKLQkJCWlmIChtb2RpZnlJbmZvLmxvY2tlZFBsdWdpbnMuc2l6ZSgpID4gMCkgewotCQkJCVN0cmluZyBXSVpBUkRfVElUTEUgPSBJbXBvcnRSZXNvdXJjZXMuaW1wb3J0Q29uZmlnV2l6YXJkX3RpdGxlOwotCQkJCVN0cmluZyBtZXNzYWdlID0gbW9kaWZ5SW5mby5nZXRMb2NrZWRNZXNzYWdlKCkudG9TdHJpbmcoKQotCQkJCQkJKyBJbXBvcnRSZXNvdXJjZXMuSW1wb3J0UGx1Z2luV2l6YXJkX2NvbmZpcm1fY29udGludWU7Ci0JCQkJYm9vbGVhbiB5ZXMgPSBJbXBvcnRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbihXSVpBUkRfVElUTEUsIG1lc3NhZ2UpOwotCQkJCWlmICgheWVzKSB7Ci0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoCi0JCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0Q29uZmlndXJhdGlvblNvdXJjZV9ub3RfdXNlZCwKLQkJCQkJCQkwLAotCQkJCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRDb25maWd1cmF0aW9uU291cmNlX2Vycm9yX25vdF91cGRhdGFibGUsCi0JCQkJCQkJbnVsbCk7Ci0JCQkJCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCQkJCXJldHVybiB0aGlzOwotCQkJCX0KLQkJCX0KLQkJCXBhZ2UgPSAoKEltcG9ydENvbmZpZ3VyYXRpb25XaXphcmQpIGdldFdpemFyZCgpKS5jb25maWdQYWdlOwotCQl9Ci0JCXBhZ2Uub25FbnRlclBhZ2UobnVsbCk7Ci0JCXJldHVybiBwYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBQbHVnaW5Nb2RpZnlJbmZvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luTW9kaWZ5SW5mbyBjaGVja01vZGlmeSgpIHsKLQkJcmV0dXJuIGNoZWNrTW9kaWZ5KExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbkd1aWRzKHNlcnZpY2UKLQkJCQkuZ2V0SW1wb3J0aW5nTGlicmFyeSgpKSwgZ2V0U2hlbGwoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIFBsdWdpbk1vZGlmeUluZm8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGx1Z2luTW9kaWZ5SW5mbyBjaGVja01vZGlmeShMaXN0IGd1aWRzLCBTaGVsbCBzaGVsbCwKLQkJCWJvb2xlYW4gY2hlY2tFZGl0KSB7Ci0JCVBsdWdpbk1vZGlmeUluZm8gbW9kaWZ5SW5mbyA9IG5ldyBQbHVnaW5Nb2RpZnlJbmZvKCk7Ci0JCS8vIFN0cmluZ0J1ZmZlciBlcnJvciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gTGlzdCBndWlkcyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbkd1aWRzKHNlcnZpY2UKLQkJLy8gLmdldEltcG9ydGluZ0xpYnJhcnkoKSk7Ci0KLQkJTGlzdCBwbHVnaW5zID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQkJLmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmIChndWlkcy5jb250YWlucyhwbHVnaW4uZ2V0R3VpZCgpKSkgewotCQkJCWlmIChwbHVnaW4uZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSA9PSBmYWxzZSkgewotCQkJCQkvLyBwbHVnaW4gaXMgbG9ja2VkCi0JCQkJCW1vZGlmeUluZm8ubG9ja2VkUGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJCQl9IGVsc2UgaWYgKGNoZWNrRWRpdCkgewotCQkJCQkvLyBwbHVnaW4gZXhpc3RzIGluIHRoZSBjdXJyZW50IGxpYnJhcnksIG1ha2Ugc3VyZSB0aGUKLQkJCQkJLy8gcGx1Z2luIGlzIHVwZGF0YWJsZQotCQkJCQkvLyBJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KHBsdWdpbiwgZ2V0U2hlbGwoKSk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocGx1Z2luLCBzaGVsbCk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJbW9kaWZ5SW5mby5yZWFkb25seVBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbW9kaWZ5SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2NhbkZsaXBUb05leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKCkgewotCQlpZiAoc3RhdHVzICE9IG9rU3RhdHVzKQotCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydFBsdWdpblNvdXJjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC9zcmMvb3JnL2VjbGlwc2UvZXBmL2ltcG9ydGluZy93aXphcmRzL1NlbGVjdEltcG9ydFBsdWdpblNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2JhMzc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQud2l6YXJkcy5EZXN0aW5hdGlvbkNvbW1vblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5JbXBvcnRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0aW5nU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0aGUKLSAqIG1ldGhvZCBwbHVnLWlucyB0byBpbXBvcnQuCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2UgZXh0ZW5kcyBEZXN0aW5hdGlvbkNvbW1vblBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywKLQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RJbXBvcnRQbHVnaW5Tb3VyY2Vfbm90X3VzZWQsIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnREYXRhIGRhdGE7Ci0KLQlwcml2YXRlIFBsdWdpbkltcG9ydGluZ1NlcnZpY2Ugc2VydmljZTsKLQotCXByaXZhdGUgU3RhdHVzIHN0YXR1cyA9IE9LX1NUQVRVUzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdEltcG9ydFBsdWdpblNvdXJjZShQbHVnaW5JbXBvcnREYXRhIGRhdGEsCi0JCQlQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJc3VwZXIoUEFHRV9OQU1FLCBkYXRhLmxsRGF0YSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zRGlyV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlTdHJpbmdbXSBleHBvcnREaXJzID0gSW1wb3J0VUlQcmVmZXJlbmNlcy5nZXRJbXBvcnRQbHVnaW5EaXJzKCk7Ci0JCWlmIChleHBvcnREaXJzICE9IG51bGwgJiYgZXhwb3J0RGlycy5sZW5ndGggPiAwKSB7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0SXRlbXMoZXhwb3J0RGlycyk7Ci0JCQlleHBvcnRQYXRoQ29tYm8uc2V0VGV4dChleHBvcnREaXJzWzBdKTsKLQkJfQotCQlzdXBlci5pbml0Q29udHJvbHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiByZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQlzdGF0dXMgPSBPS19TVEFUVVM7Ci0JCWlmIChleHBvcnRQYXRoQ29tYm8uZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJc2F2ZVRvRGF0YU1vZGVsKCk7Ci0JCQlGaWxlIGxpYkRpciA9IG5ldyBGaWxlKGV4cG9ydFBhdGhDb21iby5nZXRUZXh0KCkpOwotCQkJaWYgKCFsaWJEaXIuZXhpc3RzKCkpIHsKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0SW1wb3J0UGx1Z2luU291cmNlX25vdF91c2VkLCAwLAotCQkJCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdEltcG9ydFBsdWdpblNvdXJjZV9ub19wYXRoLCBudWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuVmFsdWUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFwcGx5VG9TdGF0dXNMaW5lKCk7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXNhdmVUb0RhdGFNb2RlbCgpOwotCi0JCS8vIFZhbGlkYXRlIGZpcnN0IGJlZm9yZSBnb2luZyB0byB0aGUgbmV4dCBwYWdlLgotCQlzZXJ2aWNlLnZhbGlkYXRlKG51bGwpOwotCQlTdHJpbmcgZXJyb3IgPSBkYXRhLmdldEVycm9ySW5mbygpLmdldEVycm9yKCk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLmxlbmd0aCgpID4gMCkgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKGVycm9yKTsKLQkJCXJldHVybiB0aGlzOwotCQl9IGVsc2UgewotCQkJU2VsZWN0UGx1Z2luc1RvSW1wb3J0IHBhZ2UgPSAoKEltcG9ydFBsdWdpbldpemFyZCkgZ2V0V2l6YXJkKCkpLnBhZ2UyOwotCQkJcGFnZS5vbkVudGVyUGFnZShudWxsKTsKLQkJCXJldHVybiBwYWdlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNjYW5GbGlwVG9OZXh0UGFnZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBseVRvU3RhdHVzTGluZSgpIHsKLQkJaWYgKHN0YXR1cyAhPSBPS19TVEFUVVMpCi0JCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQWRkaXRpb25hbENvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgb3B0aW9uR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCW9wdGlvbkdyb3VwLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlvcHRpb25Hcm91cC5zZXRUZXh0KEltcG9ydFJlc291cmNlcy5vcHRpb25Hcm91cF90ZXh0KTsKLQotCQlib29sZWFuIGNoZWNrQmFzZVBsdWdpbnMgPSBJbXBvcnRVSVByZWZlcmVuY2VzLmdldENoZWNrQmFzZVBsdWdpbnMoKTsKLQkJc2V0Q2hlY2tCYXNlUGx1Z2lucyhjaGVja0Jhc2VQbHVnaW5zKTsKLQotCQlCdXR0b24gY2hlY2tCYXNlUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihvcHRpb25Hcm91cCwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuY2hlY2tCYXNlUmFkaW9CdXR0b25fdGV4dCwgMSwgY2hlY2tCYXNlUGx1Z2lucyk7Ci0JCWNoZWNrQmFzZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldENoZWNrQmFzZVBsdWdpbnModHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUJ1dHRvbiBpZ25vcmVSZW1vdmVSYWRpb0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKG9wdGlvbkdyb3VwLAotCQkJCUltcG9ydFJlc291cmNlcy5pZ25vcmVSZW1vdmVSYWRpb0J1dHRvbl90ZXh0LCAxLAotCQkJCSFjaGVja0Jhc2VQbHVnaW5zKTsKLQkJaWdub3JlUmVtb3ZlUmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2V0Q2hlY2tCYXNlUGx1Z2lucyhmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENoZWNrQmFzZVBsdWdpbnMoYm9vbGVhbiBjaGVja0Jhc2VQbHVnaW5zKSB7Ci0JCXNlcnZpY2Uuc2V0Q2hlY2tCYXNlUGx1Z2lucyhjaGVja0Jhc2VQbHVnaW5zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RQbHVnaW5zVG9JbXBvcnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9TZWxlY3RQbHVnaW5zVG9JbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmOTE0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuSW1wb3J0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byB0aGUgbWV0aG9kIHBsdWctaW5zIHRvIGltcG9ydC4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdFBsdWdpbnNUb0ltcG9ydCBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSUNoZWNrU3RhdGVMaXN0ZW5lciwgTGlzdGVuZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UGx1Z2luc1RvSW1wb3J0LmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxpYnJhcnlQbHVnaW5FeGlzdHMgPSBJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xpYnJhcnlQbHVnaW5FeGlzdHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlicmFyeVBsdWdpbk5vdEV4aXN0cyA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGlicmFyeVBsdWdpbk5vdEV4aXN0czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwbHVnaW5Ob1NlbGVjdGlvbiA9IEltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfcGx1Z2luTm9TZWxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcGx1Z2luRGF0YUxhYmVsID0gSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9wbHVnaW5EYXRhTGFiZWw7Ci0KLQlwcml2YXRlIENoZWNrYm94VGFibGVWaWV3ZXIgY3RybF9jaGtib3hUYWJsZVZpZXdlcjsKLQotCXByaXZhdGUgVGV4dCBjdHJsX2F1dGhvckltcG9ydDsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb25JbXBvcnQ7Ci0KLQlwcml2YXRlIFRleHQgY3RybF9icmllZkRlc2NJbXBvcnQ7Ci0KLQlwcml2YXRlIExhYmVsIGltcG9ydFBsdWdpbkxhYmVsOwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYXV0aG9yTGlicmFyeTsKLQotCXByaXZhdGUgVGV4dCBjdHJsX3ZlcnNpb25MaWJyYXJ5OwotCi0JcHJpdmF0ZSBUZXh0IGN0cmxfYnJpZWZEZXNjTGlicmFyeTsKLQotCXByaXZhdGUgTGFiZWwgbGlicmFyeVBsdWdpbkxhYmVsOwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCi0JcHJpdmF0ZSBpbnQgY2hlY2tlZENvdW50ID0gMDsKLQotCXByaXZhdGUgTGlzdCBjaGVja2VkUGx1Z2luTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgUGx1Z2luSW1wb3J0RGF0YSBkYXRhOwotCi0JcHJpdmF0ZSBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIHNlcnZpY2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQbHVnaW5zVG9JbXBvcnQoUGx1Z2luSW1wb3J0RGF0YSBkYXRhLAotCQkJUGx1Z2luSW1wb3J0aW5nU2VydmljZSBzZXJ2aWNlKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEltcG9ydFJlc291cmNlcy5zZWxlY3RQbHVnaW5zV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEltcG9ydFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9pbXBfbWV0aF9wbHVnaW5fd2l6YmFuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JCXRoaXMuc2VydmljZSA9IHNlcnZpY2U7Ci0JCXRoaXMuZGF0YSA9IGRhdGE7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQotCQlDb21wb3NpdGUgdGFibGVDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGVDb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY3JlYXRlTGFiZWwodGFibGVDb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9wbHVnaW5zLCAyKTsKLQotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyID0gY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZUNvbnRhaW5lciwgMik7Ci0KLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlVSUltYWdlcy5JTUdfTUVUSE9EX1BMVUdJTjsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJcmV0dXJuICgoTWV0aG9kUGx1Z2luKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY3RybF9jaGtib3hUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCUNvbXBvc2l0ZSBpbXBvcnRDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlpbXBvcnRDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUltcG9ydFBsdWdpbkluZm8oaW1wb3J0Q29udGFpbmVyKTsKLQotCQlDb21wb3NpdGUgbGlicmFyeUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxpYnJhcnlDb250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCWNyZWF0ZUxpYnJhcnlQbHVnaW5JbmZvKGxpYnJhcnlDb250YWluZXIpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29udGFpbmVyKTsKLQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSW1wb3J0UGx1Z2luSW5mbyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWltcG9ydFBsdWdpbkxhYmVsID0gY3JlYXRlTGFiZWwoY29udGFpbmVyLCBwbHVnaW5Ob1NlbGVjdGlvbiwgMSk7Ci0JCWNyZWF0ZUxpbmUoY29udGFpbmVyLCAxKTsKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF9hdXRob3IsIDEpOwotCQljdHJsX2F1dGhvckltcG9ydCA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCA0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uLCAxKTsKLQkJY3RybF92ZXJzaW9uSW1wb3J0ID0gY3JlYXRlVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoY29udGFpbmVyLAotCQkJCUltcG9ydFJlc291cmNlcy5TZWxlY3RQbHVnaW5zVG9JbXBvcnRfbGFiZWxfZGVzYywgMSk7Ci0JCWN0cmxfYnJpZWZEZXNjSW1wb3J0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb250YWluZXIsICIiLCAyNzUsIDEwMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGlicmFyeVBsdWdpbkluZm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlsaWJyYXJ5UGx1Z2luTGFiZWwgPSBjcmVhdGVMYWJlbChjb250YWluZXIsIHBsdWdpbk5vU2VsZWN0aW9uLCAxKTsKLQkJY3JlYXRlTGluZShjb250YWluZXIsIDEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2F1dGhvciwgMSk7Ci0JCWN0cmxfYXV0aG9yTGlicmFyeSA9IGNyZWF0ZU11bHRpTGluZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCA0MCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQljcmVhdGVMYWJlbChjb250YWluZXIsCi0JCQkJSW1wb3J0UmVzb3VyY2VzLlNlbGVjdFBsdWdpbnNUb0ltcG9ydF9sYWJlbF92ZXJzaW9uLCAxKTsKLQkJY3RybF92ZXJzaW9uTGlicmFyeSA9IGNyZWF0ZVRleHQoY29udGFpbmVyLCAiIiwgMjc1LCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNyZWF0ZUxhYmVsKGNvbnRhaW5lciwKLQkJCQlJbXBvcnRSZXNvdXJjZXMuU2VsZWN0UGx1Z2luc1RvSW1wb3J0X2xhYmVsX2Rlc2MsIDEpOwotCQljdHJsX2JyaWVmRGVzY0xpYnJhcnkgPSBjcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgIiIsIDI3NSwgMTAwLCAxKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lciNjaGVja1N0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQlPYmplY3Qgb2JqID0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCS8vIFNldCB0aGUgZmxhZyB0byBpbXBvcnQgdGhlIHNlbGVjdGVkIHBsdWctaW5zLgotCQlpZiAob2JqIGluc3RhbmNlb2YgUGx1Z2luSW1wb3J0RGF0YS5QbHVnaW5JbmZvKSB7Ci0JCQkoKFBsdWdpbkltcG9ydERhdGEuUGx1Z2luSW5mbykgb2JqKS5zZWxlY3RlZCA9IGV2ZW50LmdldENoZWNrZWQoKTsKLQkJfQotCQlTdHJpbmcgbWVzc2FnZSA9IHNlcnZpY2UudmFsaWRhdGVTZWxlY3Rpb24oKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKG1lc3NhZ2UpOwotCQl9IGVsc2UgewotCQkJc3VwZXIuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQl9Ci0KLQkJaWYgKGV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJY2hlY2tlZENvdW50Kys7Ci0JCQljaGVja2VkUGx1Z2luTGlzdC5hZGQob2JqKTsKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRDb3VudC0tOwotCQkJY2hlY2tlZFBsdWdpbkxpc3QucmVtb3ZlKG9iaik7Ci0JCX0KLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50Ci0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdFtdIHBsdWdpbiA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQlzZXREaXNwbGF5QXR0cmlidXRlcygoUGx1Z2luSW5mbykgcGx1Z2luWzBdKTsKLQkJfSBlbHNlIHsKLQkJCWNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXIjaGFuZGxlRXZlbnQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERpc3BsYXlBdHRyaWJ1dGVzKFBsdWdpbkluZm8gcGx1Z2luKSB7Ci0JCWN0cmxfYXV0aG9ySW1wb3J0LnNldFRleHQocGx1Z2luLmF1dGhvcnMgPT0gbnVsbCA/ICIiIDogcGx1Z2luLmF1dGhvcnMpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfdmVyc2lvbkltcG9ydAotCQkJCS5zZXRUZXh0KHBsdWdpbi52ZXJzaW9uID09IG51bGwgPyAiIiA6IHBsdWdpbi52ZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2JyaWVmRGVzY0ltcG9ydAotCQkJCS5zZXRUZXh0KHBsdWdpbi5icmllZl9kZXNjID09IG51bGwgPyAiIiA6IHBsdWdpbi5icmllZl9kZXNjKTsgLy8kTk9OLU5MUy0xJAotCQlpbXBvcnRQbHVnaW5MYWJlbC5zZXRUZXh0KHBsdWdpbkRhdGFMYWJlbCk7Ci0KLQkJaWYgKHBsdWdpbi5leGlzdGluZ1BsdWdpbiAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5UGx1Z2luTGFiZWwuc2V0VGV4dChsaWJyYXJ5UGx1Z2luRXhpc3RzKTsKLQkJCWN0cmxfYXV0aG9yTGlicmFyeS5zZXRUZXh0KHBsdWdpbi5leGlzdGluZ1BsdWdpbi5nZXRBdXRob3JzKCkpOwotCQkJY3RybF92ZXJzaW9uTGlicmFyeS5zZXRUZXh0KHBsdWdpbi5leGlzdGluZ1BsdWdpbi5nZXRWZXJzaW9uKCkpOwotCQkJY3RybF9icmllZkRlc2NMaWJyYXJ5LnNldFRleHQocGx1Z2luLmV4aXN0aW5nUGx1Z2luCi0JCQkJCS5nZXRCcmllZkRlc2NyaXB0aW9uKCkpOwotCQl9IGVsc2UgewotCQkJbGlicmFyeVBsdWdpbkxhYmVsLnNldFRleHQobGlicmFyeVBsdWdpbk5vdEV4aXN0cyk7Ci0JCQljdHJsX2F1dGhvckxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfdmVyc2lvbkxpYnJhcnkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGlzcGxheUF0dHJpYnV0ZXMoKSB7Ci0JCWltcG9ydFBsdWdpbkxhYmVsLnNldFRleHQocGx1Z2luTm9TZWxlY3Rpb24pOwotCQljdHJsX2F1dGhvckltcG9ydC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZlcnNpb25JbXBvcnQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJY3RybF9icmllZkRlc2NJbXBvcnQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlsaWJyYXJ5UGx1Z2luTGFiZWwuc2V0VGV4dChwbHVnaW5Ob1NlbGVjdGlvbik7Ci0JCWN0cmxfYXV0aG9yTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX3ZlcnNpb25MaWJyYXJ5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWN0cmxfYnJpZWZEZXNjTGlicmFyeS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNQYWdlQ29tcGxldGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChjaGVja2VkQ291bnQgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgcGx1Z2lucyA9IGRhdGEuZ2V0UGx1Z2lucygpOwotCQlpZiAocGx1Z2lucyAhPSBudWxsKSB7Ci0JCQljdHJsX2Noa2JveFRhYmxlVmlld2VyLnNldElucHV0KHBsdWdpbnMudG9BcnJheSgpKTsKLQkJCWlmICghcGx1Z2lucy5pc0VtcHR5KCkpIHsKLQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHBsdWdpbnMKLQkJCQkJCS5nZXQoMCkpOwotCQkJCWN0cmxfY2hrYm94VGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0L3NyYy9vcmcvZWNsaXBzZS9lcGYvaW1wb3J0aW5nL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTYxMDdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQvc3JjL29yZy9lY2xpcHNlL2VwZi9pbXBvcnRpbmcvd2l6YXJkcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB3aXphcmRzIGZvciBpbXBvcnRpbmcgbWV0aG9kIHBsdWctaW5zIGFuZCBjb25maWd1cmF0aW9ucy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MzlkOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYjkwOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IExpYnJhcnkgRWRpdCBVSSBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5MaWJyYXJ5RWRpdFVJUGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODYzZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY0MTM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWlIZWxwZXIiPgotICAgICAgPHVpSGVscGVyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5VSUhlbHBlciI+Ci0gICAgICA8L3VpSGVscGVyPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9MaWJyYXJ5RWRpdFVJUGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0xpYnJhcnlFZGl0VUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlY2VlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0xpYnJhcnlFZGl0VUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5RWRpdFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aSI7Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeUVkaXRVSVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIExpYnJhcnlFZGl0VUlQbHVnaW4oKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlFZGl0VUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5ZTBlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL1Byb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgamF2YSBmaWxlIGV4dGVuZHMgamZhY2UgTGlzdFNlbGVjdGlvbkRpYWxvZyBhbmQgcmVtb3ZlIGNhbmNlbCBidXR0b24KLSAqIGZyb20gZGlhbG9nCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4xCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBMaXN0U2VsZWN0aW9uRGlhbG9nIHsKLQotCXB1YmxpYyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgT2JqZWN0IGlucHV0LAotICAgICAgICAgICAgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLAotICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVGVhbVNlbGVjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9UZWFtU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDQ0YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9UZWFtU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotCi0vKioKLSAqIFVJIERpYWxvZyBjbGFzcyB3aGljaCB3aWxsIGFzayB1c2VyIHRvIGFzc2lnbiBhIHJvbGUgdG8gdGVhbSBhdXRvbWF0aWNhbGx5LgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVNlbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBJdCBzaG93cyBkaWFsb2cgYm94IGFsbCB0ZWFtcy4gUmV0dXJucyB0ZWFtIHVzZXIgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlYW1Qcm9maWxlIGdldFNlbGVjdGVkVGVhbShMaXN0IHRlYW1MaXN0LCBSb2xlIHJvbGUsIFNoZWxsIHNoZWxsKSB7Ci0vLwkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0vLwkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0vLwkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0vLwkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLS8vCQkJCQlyZXR1cm4gKChUZWFtUHJvZmlsZSkgb2JqKS5nZXROYW1lKCk7Ci0vLwkJCQl9Ci0vLwkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotLy8JCX07Ci0vLwkJaWYoc2hlbGwgPT0gbnVsbCkgewotLy8JCQl0cnkgewotLy8JCQkJc2hlbGwgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7IC8vTXNnQm94LmdldERlZmF1bHRTaGVsbCgpOwotLy8JCQl9Ci0vLwkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkKLS8vCQkJfQotLy8JCX0KLS8vCQlFbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgRWxlbWVudExpc3RTZWxlY3Rpb25EaWFsb2coc2hlbGwsIGxhYmVsUHJvdmlkZXIpOwotLy8KLS8vCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0vLwkJZGxnLnNldEVsZW1lbnRzKHRlYW1MaXN0LnRvQXJyYXkoKSk7Ci0vLwkJZGxnLnNldE11bHRpcGxlU2VsZWN0aW9uKGZhbHNlKTsKLS8vCQlkbGcKLS8vCQkJCS5zZXRNZXNzYWdlKE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNlbGVjdFRlYW1zRGlhbG9nX3RleHQsIChuZXcgT2JqZWN0W10geyByb2xlLmdldE5hbWUoKSB9KSkpOyAKLS8vCQlkbGcuc2V0VGl0bGUoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGUpOyAvLyROT04tTkxTLTEkCi0vLwkJZGxnLnNldEZpbHRlcihudWxsKTsKLS8vCQlkbGcub3BlbigpOwotLy8JCU9iamVjdCBvYmogPSBkbGcuZ2V0Rmlyc3RSZXN1bHQoKTsKLS8vCQkvLyBkaXNwb3NlCi0vLwkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0vLwkJcmV0dXJuIChUZWFtUHJvZmlsZSkgb2JqOwotCQkKLQkJZmluYWwgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCWZpbmFsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJZmluYWwgU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGl0bGU7Ci0JCQlmaW5hbCBTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuc2VsZWN0VGVhbXNEaWFsb2dfdGV4dCwgKG5ldyBPYmplY3RbXSB7IHJvbGUuZ2V0TmFtZSgpIH0pKTsKLQkJCWZpbmFsIExpc3QgZmluYWxTZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZpbmFsIExpc3QgZmluYWxUZWFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZpbmFsVGVhbXMuYWRkQWxsKHRlYW1MaXN0KTsKLQotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCUxpc3Qgc2VsZWN0ZWQgPSB1aUhhbmRsZXIuc2VsZWN0KGZpbmFsVGVhbXMsIGxhYmVsUHJvdmlkZXIsIGZhbHNlLAotCQkJCQkJCWZpbmFsVGVhbXMsIHRpdGxlLCBtc2cpOwotCi0JCQkJCWlmIChzZWxlY3RlZCAhPSBudWxsKQotCQkJCQkJZmluYWxTZWxlY3RlZC5hZGRBbGwoc2VsZWN0ZWQpOwotCQkJCX0KLQkJCX0sIHRydWUpOwotCi0JCQlpZiAoZmluYWxTZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZihmaW5hbFNlbGVjdGVkLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIChUZWFtUHJvZmlsZSkgZmluYWxTZWxlY3RlZC5nZXQoMCk7Ci0JCX0KLQotCQkvLyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIgYXZhaWxhYmxlCi0JCS8vIHJldHVybiBudWxsCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9VSUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9VSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTAyNmFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVUlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkudmlld2VyLklWaWV3ZXJQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5Nb2RhbENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuV29ya2JlbmNoSm9iOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgVUlIZWxwZXIgaW1wbGVtZW50cyBJVUlIZWxwZXIgewotCS8qKgotCSAqIEdldCB0ZWFtcyBpbiBzY29wZQotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcGFyYW0gdGVhbUxpc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldFRlYW1zSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgUm9sZSByb2xlLCBMaXN0IHRlYW1MaXN0KSB7Ci0JCS8vIGdldCBjaGlsZHJlbiBmb3IgYWN0aXZpdHkKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGUsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBpdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgb2JqOwotCQkJCUxpc3QgYWxsVGVhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJLy8gZ2V0IGFsbCBzdWIgdGVhbXMgYXMgd2VsbAotCQkJCVByb2Nlc3NVdGlsLmdldEFsbFN1YlRlYW1zKHRlYW0sIGFsbFRlYW1zKTsKLQotCQkJCWZvciAoSXRlcmF0b3IgdGVhbUl0b3IgPSBhbGxUZWFtcy5pdGVyYXRvcigpOyB0ZWFtSXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSB0ZWFtSXRvci5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJCS8vIGdldCByb2xlcyBmcm9tIHRlYW1zCi0JCQkJCQlMaXN0IHJvbGVzID0gUHJvY2Vzc1V0aWwuZ2V0Um9sZXMoKChUZWFtUHJvZmlsZSkgbykKLQkJCQkJCQkJLmdldFRlYW1Sb2xlcygpKTsKLQkJCQkJCWlmIChyb2xlcy5jb250YWlucyhyb2xlKSkgewotCQkJCQkJCXRlYW1MaXN0LmFkZChvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGdldCBwYXJlbnQKLQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KGUpOwotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQkvLyBnbyB1cAotCQkJZ2V0VGVhbXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgY3VycmVudFBhcmVudCwKLQkJCQkJcm9sZSwgdGVhbUxpc3QpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklVSUhlbHBlciNnZXRUZWFtKG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHksIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlLCBPYmplY3QgVUlDb250ZXh0KSB7Ci0JCUxpc3QgdGVhbUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gZmluZCBvdXQgYWxsIHRlYW0gaW4gdmlzaWJsZSBzY29wZQotCQlnZXRUZWFtc0luU2NvcGUoYWRhcHRlckZhY3RvcnksIGFjdGl2aXR5LCByb2xlLCB0ZWFtTGlzdCk7Ci0JCWlmICh0ZWFtTGlzdC5zaXplKCkgPT0gMSkgewotCQkJcmV0dXJuIChUZWFtUHJvZmlsZSkgdGVhbUxpc3QuZ2V0KDApOwotCQl9Ci0JCWlmICh0ZWFtTGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlyZXR1cm4gVGVhbVNlbGVjdGlvbi5nZXRTZWxlY3RlZFRlYW0odGVhbUxpc3QsIHJvbGUsCi0JCQkJCVVJQ29udGV4dCBpbnN0YW5jZW9mIFNoZWxsID8gKFNoZWxsKSBVSUNvbnRleHQgOiBudWxsKTsKLQkJfQotCQkvLyB0aGVyZSBhcmUgbm8gdGVhbXMgdG8gYXNzaWduCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVUlIZWxwZXIjcnVuSW5Nb2RhbENvbnRleHQob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzcywgYm9vbGVhbiwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuSW5Nb2RhbENvbnRleHQoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwKLQkJCWJvb2xlYW4gZm9yaywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgdWlDb250ZXh0KSB7Ci0JCW9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlvcGVyYXRpb24ucnVuKG1vbml0b3IpOwotCQkJfQotCQkJCi0JCX07Ci0JCXRyeSB7Ci0JCQlNb2RhbENvbnRleHQucnVuKG9wLCB0cnVlLCBtb25pdG9yLCAoKFNoZWxsKXVpQ29udGV4dCkKLQkJCQkJLmdldERpc3BsYXkoKSk7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCVRocm93YWJsZSBleDsKLQkJCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCWV4ID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKQotCQkJCQkJLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlTdHJpbmcgbXNnID0gVG5nVXRpbC50b1N0YWNrVHJhY2VTdHJpbmcoZXgpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsCi0JCQkJCW1zZywgZXgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBzZWxlY3RUYXNrcyhMaXN0IHRhc2tMaXN0LCBXb3JrUHJvZHVjdCB3cCkgewotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbHVtbikgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUob2JqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqKTsKLQkJCX0KLQkJfTsKLQotCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gKChMaXN0KSBvYmplY3QpLnRvQXJyYXkoKTsKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2cgZGxnID0gbmV3IFByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nKAotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJLmdldFNoZWxsKCksCi0JCQkJCXRhc2tMaXN0LAotCQkJCQljb250ZW50UHJvdmlkZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJCU5MUwotCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2csCi0JCQkJCQkJCQl3cC5nZXROYW1lKCkpKTsKLQotCQkJZGxnLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcyk7Ci0JCQlkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkbGcub3BlbigpOwotCQkJT2JqZWN0W10gb2JqcyA9IGRsZy5nZXRSZXN1bHQoKTsKLQotCQkJTGlzdCBzZWxlY3RlZFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChvYmpzICE9IG51bGwpICYmIChvYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXNlbGVjdGVkVGFza3MuYWRkKG9ianNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzZWxlY3RlZFRhc2tzOwotCQl9IGZpbmFsbHkgewotCQkJLy8gZGlzcG9zZQotCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQljb250ZW50UHJvdmlkZXIuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3Qgc2VsZWN0V29ya1Byb2R1Y3RzKExpc3Qgd3BMaXN0LCBSb2xlIHJvbGUpIHsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2x1bW4pIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKG9iaik7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCQl9Ci0JCX07Ci0KLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuICgoTGlzdCkgb2JqZWN0KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCVByb2Nlc3NMaXN0U2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZygKLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJCS5nZXRTaGVsbCgpLAotCQkJCQkvLyBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksCi0JCQkJCXdwTGlzdCwKLQkJCQkJY29udGVudFByb3ZpZGVyLAotCQkJCQlsYWJlbFByb3ZpZGVyLAotCQkJCQlOTFMKLQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2csCi0JCQkJCQkJCQlyb2xlLmdldE5hbWUoKSkpOwotCi0JCQlkbGcKLQkJCQkJLnNldFRpdGxlKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93b3JrcHJvZHVjdHMpOyAKLQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRsZy5vcGVuKCk7Ci0JCQlPYmplY3RbXSBvYmpzID0gZGxnLmdldFJlc3VsdCgpOwotCi0JCQlMaXN0IHNlbGVjdGVkV3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChvYmpzICE9IG51bGwpICYmIChvYmpzLmxlbmd0aCA+IDApKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmpzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXNlbGVjdGVkV3BzLmFkZChvYmpzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0ZWRXcHM7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBkaXNwb3NlCi0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVubmFibGVXaXRoUHJvZ3Jlc3MgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQkJcHJpdmF0ZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uOwotCi0JCXB1YmxpYyBSdW5uYWJsZVdpdGhQcm9ncmVzcyhJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3ApIHsKLQkJCXRoaXMub3BlcmF0aW9uID0gb3A7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlvcGVyYXRpb24ucnVuKG1vbml0b3IpOwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bkFzSm9iKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgU3RyaW5nIHRhc2tOYW1lLAotCQkJT2JqZWN0IHNoZWxsKSB7Ci0JCUpvYiBqb2IgPSBuZXcgV29ya3NwYWNlSm9iKHRhc2tOYW1lKSB7Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCS8vIG1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJCQlydW5uYWJsZS5ydW4obW9uaXRvcik7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlUaHJvd2FibGUgZXg7Ci0JCQkJCWlmIChlLmdldENhdXNlKCkgIT0gbnVsbCkgewotCQkJCQkJZXggPSBlLmdldENhdXNlKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlleCA9IGU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZXgudG9TdHJpbmcoKSwgZXgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4KLQkJCQkJCQkuZ2V0UGx1Z2luKCkuZ2V0SWQoKSwgMCwgZS50b1N0cmluZygpLCBlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKS5zaG93SW5EaWFsb2coKFNoZWxsKSBzaGVsbCwgam9iKTsKLQkJam9iLnNjaGVkdWxlKCk7Ci0JCXJldHVybiBqb2IuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcnVuSW5VSShJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlJU2NoZWR1bGluZ1J1bGUgcnVsZSwgT2JqZWN0IHNoZWxsKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlzaGVsbCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCX0KLQkJSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZygoU2hlbGwpIHNoZWxsKTsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkucnVuSW5VSShjb250ZXh0LAotCQkJCQluZXcgUnVubmFibGVXaXRoUHJvZ3Jlc3MocnVubmFibGUpLCBydWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGU7Ci0JCQlFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkuZ2V0TWVzc2VuZ2VyKCkKLQkJCQkuc2hvd0Vycm9yKHRpdGxlLCBlLnRvU3RyaW5nKCksIG51bGwsIGUpOwotLy8JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKHRpdGxlLAotLy8JCQkJCWUudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJZmluYWwgSVJ1bm5hYmxlQ29udGV4dCBydW5uYWJsZUNvbnRleHQsIGZpbmFsIGJvb2xlYW4gY2FuQ2FuY2VsLCBmaW5hbCBTdHJpbmcgbXNnKSB7Ci0JCWZpbmFsIE11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywKLQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9yZWFzb24sIG51bGwpOyAKLQotCQlmaW5hbCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKG1zZywgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1lc3NhZ2VFeGNlcHRpb24pIHsKLQkJCQkJCW1zZyA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpKTsKLQkJCQkJCW1zZyA9IHN0cldyaXRlci50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJCW1zZywgZSkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCXRyeSB7Ci0JCQlpZiAoRGlzcGxheS5nZXRDdXJyZW50KCkgPT0gbnVsbCkgewotCQkJCS8vIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBhIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCQkJCS8vCi0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcnVubmFibGVDb250ZXh0LnJ1bih0cnVlLCBjYW5DYW5jZWwsIG9wZXJhdGlvbik7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfSk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bm5hYmxlQ29udGV4dC5ydW4odHJ1ZSwgY2FuQ2FuY2VsLCBvcGVyYXRpb24pOwotCQkJfQotCi0JCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCkKLQkJCQkJCS5nZXRNZXNzZW5nZXIoKS5zaG93RXJyb3IoCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvcl9tc2dXaXRoRGV0YWlscywKLQkJCQkJCQkJc3RhdHVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHRoYXQgc2hvdWxkbid0LgotCQkJLy8KLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleGNlcHRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJ1bldpdGhQcm9ncmVzcyhJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlib29sZWFuIGNhbkNhbmNlbCwgU3RyaW5nIG1zZykgewotCQlyZXR1cm4gcnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBnZXRSdW5uYWJsZUNvbnRleHQoKSwgZmFsc2UsIG1zZyk7Ci0JfQotCi0JcHVibGljIElSdW5uYWJsZUNvbnRleHQgZ2V0UnVubmFibGVDb250ZXh0KCkgewotCQlTaGVsbCBzaGVsbDsKLQkJT2JqZWN0IHVpQ3R4ID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpLmdldFVJQ29udGV4dCgpOwotCQlpZiAodWlDdHggaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJc2hlbGwgPSAoU2hlbGwpIHVpQ3R4OwotCQl9IGVsc2UgewotCQkJc2hlbGwgPSBNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZpZXdlciBkb0dldFZpZXdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCWlmIChhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNvbnRlbnRQcm92aWRlciAmJiBsaXN0ZW5lciBpbnN0YW5jZW9mIElWaWV3ZXJQcm92aWRlcikgewkJCQkJCi0JCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQlpZiAodmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCQkJJiYgKChQcm9jZXNzQ29tcG9uZW50KSB2aWV3ZXIuZ2V0SW5wdXQoKSkKLQkJCQkJCQkJCS5nZXRQcm9jZXNzKCkgPT0gcHJvYykKLQkJCQkJCXJldHVybiB2aWV3ZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZnJlc2hOZWVkZWQoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlcikgewotCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgaXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpcyBjdXJyZW50bHkgb3BlbmVkIGluIGVkaXRvcgotCQkvLwotCQlWaWV3ZXIgdmlld2VyID0gZG9HZXRWaWV3ZXIoYWRhcHRlckZhY3RvcnksIHByb2Nlc3MpOwotCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJJiYgIXZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKHByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAocmVmcmVzaE5lZWRlZChhZGFwdGVyRmFjdG9yeSwgYWRhcHRlcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycyhwcm9jZXNzLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKHJlZnJlc2hOZWVkZWQoYWRhcHRlckZhY3RvcnksIGFkYXB0ZXIpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hBbGxWaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQkJCWFkYXB0ZXJGYWN0b3J5LmdldENoYW5nZUxpc3RlbmVycygpKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDb250ZW50UHJvdmlkZXIgJiYgbGlzdGVuZXIgaW5zdGFuY2VvZiBJVmlld2VyUHJvdmlkZXIpIHsJCQkJCQotCQkJCQkJVmlld2VyIHZpZXdlciA9ICgoSVZpZXdlclByb3ZpZGVyKSBsaXN0ZW5lcikuZ2V0Vmlld2VyKCk7Ci0JCQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsCi0JCQkJCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKQotCQkJCQkJCQkmJiB2aWV3ZXIuZ2V0SW5wdXQoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCi0JCX0sIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hWaWV3ZXIoQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgUHJvY2VzcyBwcm9jKSB7Ci0JCWZpbmFsIFZpZXdlciB2aWV3ZXIgPSBkb0dldFZpZXdlcihmYWN0b3J5LCBwcm9jKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCSYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJCi0JCQl9LCB0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2hJRHNJblZpZXdlcihmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBJQ29udGVudFByb3ZpZGVyICYmIGxpc3RlbmVyIGluc3RhbmNlb2YgSVZpZXdlclByb3ZpZGVyKSB7CQkJCQkKLQkJCQkJCVZpZXdlciB2aWV3ZXIgPSAoKElWaWV3ZXJQcm92aWRlcikgbGlzdGVuZXIpLmdldFZpZXdlcigpOwotCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbAotCQkJCQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkKLQkJCQkJCQkJJiYgdmlld2VyLmdldElucHV0KCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSB2aWV3ZXIuZ2V0SW5wdXQoKSkKLQkJCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJCS5hZGFwdChwcm9jLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJCWlmIChpdGVtUHJvdmlkZXIuaXNSZWZyZXNoQWxsSURzUmVxdWlyZWQoKSkgewotCQkJCQkJCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHByb2MpOwotCQkJCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCQkJCQlpdGVtUHJvdmlkZXIuc2V0UmVmcmVzaEFsbElEc1JlcXVpcmVkKGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRWaWV3ZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFByb2Nlc3MgcHJvYykgewotCQlyZXR1cm4gZG9HZXRWaWV3ZXIoYWRhcHRlckZhY3RvcnksIHByb2MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1blNhZmVseShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwgYm9vbGVhbiBzeW5jaHJvbm91cykgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotCQl0cnkgewotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8KLQkJfQotCQkKLQkJUnVubmFibGUgcnVubmVyID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0KLQkJaWYoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkvLyBjdXJyZW50IHRocmVhZCBpcyBub3QgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCS8vCi0JCQl0cnkgewotCQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCX0KLQkJCWlmKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCWlmKHN5bmNocm9ub3VzKSB7Ci0JCQkJCWRpc3BsYXkuc3luY0V4ZWMocnVubmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5lcik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcnVubmVyLnJ1bigpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gY3VycmVudCB0aHJlYWQgaXMgYSB1c2VyLWludGVyZmFjZSB0aHJlYWQKLQkJCS8vCi0JCQlpZihzeW5jaHJvbm91cykgewotCQkJCXJ1bm5lci5ydW4oKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKHJ1bm5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoQnVzeUluZGljYXRvcihSdW5uYWJsZSBydW5uYWJsZSkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcnVubmFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bkluVUkoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBTdHJpbmcgdGFza05hbWUpIHsKLQkJU2hlbGwgc2hlbGwgPSAoU2hlbGwpIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJ1bm5hYmxlLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlKb2Igam9iID0gbmV3IFdvcmtiZW5jaEpvYih0YXNrTmFtZSkgewotCi0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJcnVubmFibGUucnVuKG1vbml0b3IpOwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJVGhyb3dhYmxlIGV4OwotCQkJCQlpZiAoZS5nZXRDYXVzZSgpICE9IG51bGwpIHsKLQkJCQkJCWV4ID0gZS5nZXRDYXVzZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZXggPSBlOwotCQkJCQl9Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luCi0JCQkJCQkJLmdldFBsdWdpbigpLmdldElkKCksIDAsIGV4LnRvU3RyaW5nKCksIGV4KTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luCi0JCQkJCQkJLmdldFBsdWdpbigpLmdldElkKCksIDAsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCi0JCX07Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCkuc2hvd0luRGlhbG9nKHNoZWxsLCBqb2IpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhYjExMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ly5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UKLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzBmYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZWRjZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5jb21tb247dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzcywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OGIwODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9jaGVja2VkX2JveC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2NoZWNrZWRfYm94LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVBY3Rpdml0eV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9jb25jZXB0c0FuZFBhcGVyc19Db25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfY2F0ZWdvcml6ZWRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUN1c3RvbUNhdGVnb3J5X3N1YkNhdGVnb3JpZXNfQ3VzdG9tQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfRGlzY2lwbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nX2Rpc2NpcGxpbmVzX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJvbGVTZXRHcm91cGluZ19yb2xlU2V0c19Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJvbGVTZXRHcm91cGluZ19yb2xlU2V0c19Sb2xlU2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNjQzZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya1Byb2R1Y3RfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0FydGlmYWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTQ3NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjZkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NoZWNrbGlzdHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHRzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25maWd1cmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uZmlndXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTI0ZmRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25maWd1cmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2E1ZDdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyNGE5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW5zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Eb21haW5zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWlucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOTQ0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Gb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDE5ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMTQxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VGb2xkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2VzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzhjZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwMzUxOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvT3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdUZW1wbGF0ZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nVGVtcGxhdGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNmVkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGxhbm5pbmdUZW1wbGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJhY3RpY2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbGllcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxYmE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZDhjMmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3Nlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVwb3J0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjNlMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXRzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmNmZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JldXNhYmxlQXNzZXRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFiYzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2FkbWFwcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5ODM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhbmRhcmRDYXRlZ29yaWVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMjFlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM4YmQ4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tzX2Nmdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza3NfY2Z2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWNobmlxdWVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4NjZkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVtcGxhdGVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxYmZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9ycy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvcnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9ycy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2xzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ZjhlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXJzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9XaGl0ZXBhcGVycy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjQ4MDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXJzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2ZhNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0R3VpZGVsaW5lcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eV9wYWNrX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvZW1wdHlfcGFja19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODgyODRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eV9wYWNrX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxYzI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy9mdWxsL29iajE2L3Byb2Nmb2xkX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4ZTI3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvcHJvY2ZvbGRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi90b29sc2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvaWNvbnMvZnVsbC9vYmoxNi90b29sc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI0ZjhlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvdG9vbHNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL3VuY2hlY2tlZF9ib3guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9pY29ucy91bmNoZWNrZWRfYm94LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiOWY4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L2ljb25zL3VuY2hlY2tlZF9ib3guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWRmZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBFZGl0Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotX1VJX0NvbnRlbnRfZ3JvdXA9TWV0aG9kIENvbnRlbnQKLQotX1VJX0Rpc2NpcGxpbmVzX2dyb3VwPURpc2NpcGxpbmVzCi1fVUlfRG9tYWluc19ncm91cD1Eb21haW5zCi1fVUlfV29ya1Byb2R1Y3RUeXBlc19ncm91cD1Xb3JrIFByb2R1Y3QgS2luZHMKLV9VSV9Sb2xlX1NldHNfZ3JvdXA9Um9sZSBTZXRzCi1fVUlfVG9vbHNfZ3JvdXA9VG9vbHMKLV9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwPVN0YW5kYXJkIENhdGVnb3JpZXMKLV9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cD1DdXN0b20gQ2F0ZWdvcmllcwotX1VJX01ldGhvZENvbnRlbnRfZ3JvdXA9Q29udGVudCBQYWNrYWdlcwotCi1fVUlfUHJvY2Vzc2VzX2dyb3VwPVByb2Nlc3NlcwotX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwPVBsYW5uaW5nIFRlbXBsYXRlcwotCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5zX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJucwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ9RGVsaXZlcnkgUHJvY2Vzc2VzCi1fVUlfUHJvY2Vzc0NvbnRyaWJ1dGlvbnNfdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2Vzc2VzCi1fVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dD1QbGFubmluZyBUZW1wbGF0ZXMKLQotX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1fVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQ9RGVsaXZlcnkgUHJvY2VzcwotX1VJX1Byb2Nlc3NDb250cmlidXRpb25fdGV4dD1EaWZmZXJlbnRpYWwgUHJvY2VzcwotCi1fVUlfQ29uZmlndXJhdGlvbnNfdGV4dD1Db25maWd1cmF0aW9ucwotCi1fVUlfUHJvY2Vzc0ZhbWlsaWVzX3RleHQ9UHJvY2VzcyBGYW1pbGllcwotCi1fVUlfVW5jYXRlZ29yaXplZF90ZXh0PVVuY2F0ZWdvcml6ZWQKLV9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQ9VW5jYXRlZ29yaXplZCBUYXNrcwotX1VJX1VuY2F0ZWdvcml6ZWRfUm9sZXNfdGV4dD1VbmNhdGVnb3JpemVkIFJvbGVzCi0KLV9VSV9HdWlkYW5jZXNfZ3JvdXA9R3VpZGFuY2UKLV9VSV9HdWlkYW5jZXNfQ2hlY2tsaXN0cz1DaGVja2xpc3RzCi1fVUlfR3VpZGFuY2VzX0NvbmNlcHRzPUNvbmNlcHRzCi1fVUlfR3VpZGFuY2VzX0V4YW1wbGVzPUV4YW1wbGVzCi1fVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucz1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfR3VpZGFuY2VzX1ByYWN0aWNlcz1QcmFjdGljZXMKLV9VSV9HdWlkYW5jZXNfUmVwb3J0cz1SZXBvcnRzCi1fVUlfR3VpZGFuY2VzX1JldXNhYmxlQXNzZXRzPVJldXNhYmxlIEFzc2V0cwotX1VJX0d1aWRhbmNlc19Sb2FkbWFwPVJvYWRtYXAKLV9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscz1TdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX0d1aWRhbmNlc19UZWNobmlxdWVzPVRlY2huaXF1ZXMKLV9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzPVRlbXBsYXRlcwotX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnM9VGVybSBEZWZpbml0aW9ucwotX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycz1Ub29sIE1lbnRvcnMKLV9VSV9HdWlkYW5jZXNfV2hpdGVwYXBlcnM9V2hpdGVwYXBlcnMKLV9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzPUd1aWRlbGluZXMKLV9VSV9LZXlfQ29uY2VwdHM9S2V5IENvbmNlcHRzCi0KLQotX1VJX1JvbGVzX2dyb3VwPVJvbGVzCi1fVUlfVGFza3NfZ3JvdXA9VGFza3MKLV9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXA9V29yayBQcm9kdWN0cwotX1VJX0FjdGl2aXRpZXNfZ3JvdXA9QWN0aXZpdGllcwotCi0jIEJyZWFrZG93biBzdHJ1Y3R1cmUgY29sdW1uIGRpc3BsYXkgbmFtZXMKLUJTX0NvbHVtbl9uYW1lPU5hbWUKLUJTX0NvbHVtbl9wcmVmaXg9UHJlZml4Ci1CU19Db2x1bW5faWQ9SW5kZXgKLUJTX0NvbHVtbl9wcmVkZWNlc3NvcnM9UHJlZGVjZXNzb3JzCi1CU19Db2x1bW5faXNfcmVwZWF0YWJsZT1SZXBlYXRhYmxlCi1CU19Db2x1bW5faXNfb25nb2luZz1PbmdvaW5nCi1CU19Db2x1bW5faXNfZXZlbnRfZHJpdmVuPUV2ZW50LURyaXZlbgotQlNfQ29sdW1uX2VudHJ5X3N0YXRlPUVudHJ5IFN0YXRlCi1CU19Db2x1bW5fZXhpdF9zdGF0ZT1FeGl0IFN0YXRlCi1CU19Db2x1bW5fdGVhbXM9VGVhbQotQlNfQ29sdW1uX3R5cGU9VHlwZQotQlNfQ29sdW1uX21vZGVsX2luZm89TW9kZWwgSW5mbwotQlNfQ29sdW1uX3ByZXNlbnRhdGlvbl9uYW1lPVByZXNlbnRhdGlvbiBOYW1lCi1CU19Db2x1bW5fZGVsaXZlcmFibGU9RGVsaXZlcmFibGUKLUJTX0NvbHVtbl9pc19vcHRpb25hbD1PcHRpb25hbAotQlNfQ29sdW1uX2lzX3BsYW5uZWQ9UGxhbm5lZAotQlNfQ29sdW1uX2hhc19tdWx0aXBsZV9vY2N1cnJlbmNlcz1NdWx0aXBsZSBPY2N1cnJlbmNlcwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYWU0MjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ0ZXh0UmVmZXJlbmNlUmVwbGFjZXIiIG5hbWU9IlRleHQgUmVmZXJlbmNlIFJlcGxhY2VyIiBzY2hlbWE9InNjaGVtYS90ZXh0UmVmZXJlbmNlUmVwbGFjZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGlhZ3JhbU1hbmFnZXIiIG5hbWU9IkRpYWdyYW0gTWFuYWdlciIgc2NoZW1hPSJzY2hlbWEvZGlhZ3JhbU1hbmFnZXIuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tbWFuZExpc3RlbmVycyIgbmFtZT0iQ29tbWFuZCBMaXN0ZW5lcnMiIHNjaGVtYT0ic2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibGlicmFyeUluc3BlY3RvciIgbmFtZT0iTGlicmFyeSBJbnNwZWN0b3IiIHNjaGVtYT0ic2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIgbmFtZT0iTmVzdGVkIENvbW1hbmQgUHJvdmlkZXJzIiBzY2hlbWE9InNjaGVtYS9uZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9wcG9zaXRlRmVhdHVyZUxvYWRlcnMiIG5hbWU9Ik9wcG9zaXRlRmVhdHVyZSBMb2FkZXJzIiBzY2hlbWE9InNjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiIG5hbWU9IlVzZXIgSW50ZXJhY3Rpb24gSGFuZGxlciIgc2NoZW1hPSJzY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ2YWxpZGF0aW9uU3VwcG9ydCIgbmFtZT0iVmFsaWRhdGlvbiBTdXBwb3J0IiBzY2hlbWE9InNjaGVtYS92YWxpZGF0aW9uU3VwcG9ydC5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJ1aUhlbHBlciIgbmFtZT0iVUkgSGVscGVyIiBzY2hlbWE9InNjaGVtYS91aUhlbHBlci5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhZGFwdGVyRmFjdG9yaWVzIiBuYW1lPSJBZGFwdGVyIEZhY3RvcmllcyIgc2NoZW1hPSJzY2hlbWEvYWRhcHRlckZhY3Rvcmllcy5leHNkIi8+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovLy9jb20vaWJtL3VtYS9lZGl0L3RuZy91dGlsL21vZGVsLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9hZGFwdGVyRmFjdG9yaWVzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9hZGFwdGVyRmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYmM4MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvYWRhcHRlckZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJhZGFwdGVyRmFjdG9yaWVzIiBuYW1lPSJBZGFwdGVyIEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvY29tbWFuZExpc3RlbmVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTNhNzA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2NvbW1hbmRMaXN0ZW5lcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0iY29tbWFuZExpc3RlbmVycyIgbmFtZT0iQ29tbWFuZCBMaXN0ZW5lcnMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbW1hbmRMaXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb21tYW5kTGlzdGVuZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtaWdyYXRvci4gVGhpcyBjbGFzcyBtdXN0IGJlIGEgcHVibGljIGltcGxlbWVudGF0aW9uIG9mICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbW1hbmRMaXN0ZW5lciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9kaWFncmFtTWFuYWdlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc1N2E5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2RpYWdyYW1NYW5hZ2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImRpYWdyYW1NYW5hZ2VyIiBuYW1lPSJEaWFncmFtIE1hbmFnZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRpYWdyYW1NYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGlhZ3JhbU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL2xpYnJhcnlJbnNwZWN0b3IuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyMTFhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9saWJyYXJ5SW5zcGVjdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9ImxpYnJhcnlJbnNwZWN0b3IiIG5hbWU9IkxpYnJhcnkgSW5zcGVjdG9yIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEluc3BlY3QgY29udGVudHMgb2YgbGliYXJ5IGZvciBkZWJ1ZyBvciB0ZXN0aW5nIHB1cnBvc2UuIFRoZSBpbnRlbnRpb24gaXMgdG8gcHJvdmlkZSBhIGNvbnZlaWVudCBwbGFjZSB0byBob29rIGFueSBleHRlcm5hbCBkZWJ1ZyBvciB0ZXN0aW5nIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbm90IHBhcnQgb2YgRVBGLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGlicmFyeUluc3BlY3RvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImxpYnJhcnlJbnNwZWN0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JTGlicmFyeUluc3BlY3RvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQ5MzdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL25lc3RlZENvbW1hbmRQcm92aWRlcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0ibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIgbmFtZT0iTmVzdGVkIENvbW1hbmQgUHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3ZpZGVycyBvZiBuZXN0ZWQgY29tbWFuZHMgdG8gZXhlY3V0ZSByaWdodCBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBtYWluIGNvbW1hbmQuIFRoZSBleHRlbnNpb24gbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibmVzdGVkQ29tbWFuZFByb3ZpZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5lc3RlZENvbW1hbmRQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklOZXN0ZWRDb21tYW5kUHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL29wcG9zaXRlRmVhdHVyZUxvYWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL29wcG9zaXRlRmVhdHVyZUxvYWRlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjYTllYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS9vcHBvc2l0ZUZlYXR1cmVMb2FkZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9Im9wcG9zaXRlRmVhdHVyZUxvYWRlcnMiIG5hbWU9Ik9wcG9zaXRlRmVhdHVyZSBMb2FkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9wcG9zaXRlRmVhdHVyZUxvYWRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3RleHRSZWZlcmVuY2VSZXBsYWNlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMDlkM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdGV4dFJlZmVyZW5jZVJlcGxhY2VyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdCIgaWQ9InRleHRSZWZlcmVuY2VSZXBsYWNlciIgbmFtZT0iVGV4dCBSZWZlcmVuY2UgUmVwbGFjZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgUmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZSBvbGQgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbmV3IG9iamVjdHMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InRleHRSZWZlcmVuY2VSZXBsYWNlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InRleHRSZWZlcmVuY2VSZXBsYWNlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIG1pZ3JhdG9yLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklUZXh0UmVmZXJlbmNlUmVwbGFjZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS91aUhlbHBlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdWlIZWxwZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkZTgzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NjaGVtYS91aUhlbHBlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQiIGlkPSJ1aUhlbHBlciIgbmFtZT0iVUkgSGVscGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBwcm92aWRlIGltcGxlbWVudGF0aW9uIG9mIHNvbWUgVUktc3BlY2lmaWMgb3BlcmF0aW9ucy9mdW5jdGlvbnMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVpSGVscGVyIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1aUhlbHBlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuSVVJSGVscGVyIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklVSUhlbHBlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdXNlckludGVyYWN0aW9uSGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTMxNjgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3VzZXJJbnRlcmFjdGlvbkhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0idXNlckludGVyYWN0aW9uSGFuZGxlciIgbmFtZT0iVXNlciBJbnRlcmFjdGlvbiBIYW5kbGVyIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCB0byBpbnRlcmFjdCB3aXRoIHVzZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InVzZXJJbnRlcmFjdGlvbkhhbmRsZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ1c2VySW50ZXJhY3Rpb25IYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgcHVibGljIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuIFRoaXMgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgbm9uLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc2NoZW1hL3ZhbGlkYXRpb25TdXBwb3J0LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWRkYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zY2hlbWEvdmFsaWRhdGlvblN1cHBvcnQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiBpZD0idmFsaWRhdGlvblN1cHBvcnQiIG5hbWU9IlZhbGlkYXRpb24gU3VwcG9ydCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBTdXBwb3J0cyBjb250cmlidXRpb24vcmVwbGFjZW1lbnQgb2YgdmFsaWRhdG9ycwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0aW9uRmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0aW9uRmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY2xhc3MiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJyZXBsYWNlIiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaWYgc2V0IHRvICZsdDtjb2RlJmd0O3RydWUmbHQ7L2NvZGUmZ3Q7IHdpbGwgcmVwbGFjZSBhbnkgb3RoZXIgZXhpc3RpbmcgdmFsaWRhdGlvbiBmYWN0b3J5IGluIHRoZSBzeXN0ZW0uIEl0IGlzICZsdDtjb2RlJmd0O2ZhbHNlJmx0Oy9jb2RlJmd0OyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0ZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2ZmM2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0ZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBBIHN1YmNsYXNzIG9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIHRoYXQga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlCi0gKiBjb250YWluaW5nIGZlYXR1cmUgb2YgdGhlIHdyYXBwZWQgdmFsdWUgYW5kIGltcGxlbWVudHMgQ29tcGFyYWJsZSB0byBzdXBwb3J0Ci0gKiBzb3J0aW5nLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0KLQlwdWJsaWMgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0JCQotCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIobnVsbCwgdmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIGdpdmVuIHdyYXBwZXJzIGJ5IGtlZXBpbmcgZXhpc3RpbmcsIHJlbW92aW5nL2Rpc3Bvc2Ugb2xkLCBhbmQKLQkgKiBhZGRpbmcgbmV3IG9uZXMuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXJzCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGwoQ29sbGVjdGlvbiB3cmFwcGVycywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlDb2xsZWN0aW9uIHZhbHVlcywgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZiAoIXZhbHVlcy5yZW1vdmUod3JhcHBlci5nZXRWYWx1ZSgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJd3JhcHBlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJd3JhcHBlcnMuYWRkKG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKGZlYXR1cmUsIGl0ZXIKLQkJCQkJLm5leHQoKSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQlPYmplY3Qgb3RoZXJWYWx1ZSA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldFZhbHVlKCk7Ci0JCWlmICghKHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQl8fCAhKG90aGVyVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSB2YWx1ZSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIG90aGVyVmFsdWUpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzdXBlci5maXJlTm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM1M2Y3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWRhcHRlckZhY3RvcnlQcm92aWRlciB7Ci0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgYWRhcHRlciBmYWN0b3J5IGZvciB0ZWFtIHVzYWdlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIGFkYXB0ZXIgZmFjdG9yeSBmb3Igd29yayBwcm9kdWN0IHVzYWdlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIGNvbnNvbGlkYXRlZCB2aWV3IG9mIHRoZSBwcm9jZXNzLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlBZGFwdGVyRmFjdG9yeSBnZXRDQlNBZGFwdGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZWVlZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBicmVhayBkb3duIGVsZW1lbnQgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50Ci0gKiB0byBtYW50YWluIGEgbGlzdCBjYWNoZWQgY2hpbGRyZW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNhY2hlZCBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjYWNoZWQgY2hpbGRyZW4uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNhY2hlZCByb2xsdXAgY2hpbGRlbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjYWNoZWQgcm9sbHVwIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbW1hbmRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29tbWFuZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNDdiYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29tbWFuZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBjb21tYW5kcyB0aGF0IHdhbnQgdG8gbm90aWZ5IHRoZWlyIGxpc3RlbmVycyBvZgotICogY2VydGFpbiBldmVudHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIHNrYW5ub29yCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbW1hbmRMaXN0ZW5lciB7Ci0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHByaW9yIHRvIHRoZSBleGVjdXRpb24gdGhlIGdpdmVuIGNvbW1hbmQKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXB1YmxpYyB2b2lkIHByZUV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB0aGF0IGEgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgYSBjb21tYW5kCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXhlY3V0ZWQoQ29tbWFuZCBjb21tYW5kKTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBwcmlvciB0byB0aGUgdW5kbyBvZiB0aGUgZ2l2ZW4gY29tbWFuZAotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogICAgICAgICAgICBhbiB1bmRvIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVVbmRvKENvbW1hbmQgY29tbWFuZCk7Ci0KLQkKLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gYWZ0ZXIgdW5kbwotCSAqLwotCQotCXB1YmxpYyB2b2lkIHBvc3RVbmRvKENvbW1hbmQgY29tbWFuZCk7Ci0JLyoqCi0JICogR2V0cyB0aGUgY29tbWFuZCBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29tbWFuZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0Q29tbWFuZFR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhYmxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4YjZkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBpdGVtIHByb3ZpZGVycyB0aGF0IGNhbiBiZSBjb25maWd1cmVkIHRvIGRpc3BsYXkgYQotICogZmlsdGVyZWQgbGlzdCBvZiBjaGlsZHJlbiBhbmQgaGF2ZSB0aGVpciBkZWZhdWx0IGxhYmVsIG92ZXJ3cml0dGVuIGF0Ci0gKiBydW50aW1lLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmFibGUgewotCi0JLyoqCi0JICogU2V0cyB0aGUgZmlsdGVyIHRoYXQgaXMgdXNlZCB0byBmaWx0ZXIgdGhpcyBvYmplY3QncyBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhbiA8Y29kZT5JRmlsdGVyPC9jb2RlPiBvYmplY3QKLQkgKiBAc2VlIElGaWx0ZXIKLQkgKi8KLQl2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbCBmb3IgdGhpcyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGEKLQkgKiAgICAgICAgICAgIHN0cmluZyBsYWJlbAotCSAqLwotCXZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYmVmMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdG8gb2J0YWluIGFuZCByZXNvbHZlIG1ldGhvZCBlbGVtZW50IGF0dHJpYnV0ZXMgYW5kCi0gKiByZWZlcmVuY2VzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmF0aW9uQXBwbGljYXRvciB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSB2YXJpYWJpbGl0eSBlbGVtZW50IGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmUKLQkgKiAgICAgICAgICAgIGEgdmFyaWFiaWxpdHkgZWxlbWVudAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBhbiBhdHRyaWJ1dGUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFQXR0cmlidXRlIGF0dHIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYSBjb250ZW50IGRlc2NyaXB0aW9uIGluIGEgbWV0aG9kCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzYwotCSAqICAgICAgICAgICAgYSBjb250ZW50IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgYW4gYXR0cmlidXRlIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLCBEZXNjcmliYWJsZUVsZW1lbnQgb3duZXIsCi0JCQlFQXR0cmlidXRlIGF0dHIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBvZiBhIHZhcmlhYmlsaXR5IGVsZW1lbnQgaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2ZQotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZgotCSAqICAgICAgICAgICAgYSByZWZlcmVuY2UgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBFUmVmZXJlbmNlIHJlZiwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBvZiBhIGNvbnRlbnQgZGVzY3JpcHRpb24gaW4gYSBtZXRob2QKLQkgKiBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBkZXNjCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2UgZGVyaXZlZCBmcm9tIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqICAgICAgICAgY2xvc3VyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLCBEZXNjcmliYWJsZUVsZW1lbnQgb3duZXIsCi0JCQlFUmVmZXJlbmNlIHJlZiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVmZXJlbmNlIHZhbHVlIG9mIGEgbWV0aG9kIGVsZW1lbnQgb3Bwb3NpdGUgZmVhdHVyZSBpbiBhIG1ldGhvZAotCSAqIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGRlcml2ZWQgZnJvbSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIG9iamVjdCB1c2luZyB0aGUgZ2l2ZW4gbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBtZXRob2QgZWxlbWVudCBkZXJpdmVkIGZyb20gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogICAgICAgICBjbG9zdXJlCi0JICovCi0JT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGQzODVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBpdGVtIHByb3ZpZGVycyBhbmQgY29tbWFuZHMgdGhhdCB3YW50IHRvIGZpbHRlcgotICogZG93biByZWxhdGVkIG1ldGhvZCBlbGVtZW50cyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdG9yIGV4dGVuZHMgSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlciwgSUZpbHRlciwgQWRhcHRlciB7Ci0KLQl2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogSWYgdGhpcyBtZXRob2QgcmV0dXJuIGEgbm9uLU5VTEwsIHRoZSBpdGVtIHByb3ZpZGVyIHdpbGwgdXNlIHRoZSByZXR1cm5lZAotCSAqIGNvbGxlY3Rpb24gYXMgY2hpbGRyZW4gaW4gcGxhY2Ugb2YgaXRzIGRlZmF1bHQgY2hpbHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGNoaWxkRmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpOwotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhpcyBvYmplY3QgYWNjb3JkaW5nIHRvIHZhcmlhYmlsaXR5IHJ1bGVzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIHJlc29sdmVkIG9iamVjdCB0aGF0IGlzIGVpdGhlciB0aGUgb2JqZWN0IGl0c2VsZiwgb3IgaXRzIHJlcGxhY2VyCi0JICogICAgICAgICBkZXBlbmRpbmcgb24gdGhlIHZhcmlhYmlsaXR5IG9mIHRoaXMgb2JqZWN0IGluIHRoZSBjb25maWd1cmF0aW9uLgotCSAqLwotCU9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogR2V0cyB2YXJpYWJpbGl0eSBpbmZvcm1hdGlvbiBmb3IgdGhlIGdpdmVuIFZhcmlhYmlsaXR5RWxlbWVudCBjYWxjdWxhdGVkCi0JICogYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBjb25maWd1cmF0b3IgYW5kIGFjY29yZGluZyB0byB0aGUKLQkgKiB2YXJpYWJpbGl0eSBydWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdmUKLQkgKiBAcmV0dXJuCi0JICogQHNlZSBWYXJpYWJpbGl0eUluZm8KLQkgKi8KLQlWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCB0YXNrcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCk7Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3Igd29ya3Byb2R1Y3RzIHdpdGhvdXQgYSBkb21haW4KLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXREb21haW5VbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB3b3JrcHJvZHVjdHMgd2l0aG91dCBhIFdQIFR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHJvbGVzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFJvbGVGaWx0ZXIoKTsKLQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHVuY2F0ZWdvcml6ZWQgdG9vbCBtZW50b3JzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0VW5jYXRlZ29yaXplZFRvb2xNZW50b3JGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciBkaXNjaXBsaW5lcyBhbmQgZGlzcGxpbmUgZ3JvdXBpbmdzCi0JICogCi0JICogQHJldHVybiBJRmlsdGVyCi0JICovCi0JcHVibGljIElGaWx0ZXIgZ2V0RGlzY2lwbGluZXNGaWx0ZXIoKTsKLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciByb2xlc2V0cyBhbmQgcm9sZXNldCBncm91cGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRSb2xlU2V0c0ZpbHRlcigpOwotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUNvbmZpZ3VyYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjYjk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lDb25maWd1cmF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgY29uZmlndXJhdGlvbiBmaWx0ZXIgZmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdG9yRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29uZmlndXJhdGlvbiBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIGZpbHRlci4KLQkgKi8KLQlJQ29uZmlndXJhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSURlZmF1bHROYW1lU2V0dGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lEZWZhdWx0TmFtZVNldHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWYwYTdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSURlZmF1bHROYW1lU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50IHRvIGFzc2lnbiBhIGRlZmF1bHQgbmFtZQotICogZm9yIGVhY2ggbmV3bHkgY3JlYXRlZCBtZXRob2QgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVmYXVsdE5hbWVTZXR0ZXIgewotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBuYW1lIGZvciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopOwotCi0JLyoqCi0JICogR2V0cyB0aGUgSUQgb2YgdGhlIGZlYXR1cmUgdGhhdCBjb250YWlucyBtZXRob2QgZWxlbWVudHMgd2hvc2UgZGVmYXVsdAotCSAqIG5hbWUgc2V0IHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgSUQgb2YgYSBmZWF0dXJlCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvd25lciBjbGFzcyBvZiB0aGUgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIG1ldGhvZCBlbGVtZW50cyB3aG9zZQotCSAqIGRlZmF1bHQgbmFtZSBzZXQgdGhyb3VnaCB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBvd25lciBjbGFzcyBvZiBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTJhMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIEEgZ2VuZXJpYyBmaWx0ZXIgdGhhdCB1c2VzIHRoZSB2aXNpdG9yIGRlc2lnbiBwYXR0ZXJuLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWx0ZXIgewotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBvYmplY3QgY2FuIGJlIGFjY2VwdGVkIGJ5IHRoaXMgZmlsdGVyLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIHRoZSB2aXNpdGluZyBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgYWNjZXB0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaik7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUdyb3VwQ29udGFpbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lHcm91cENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDIwNTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSUdyb3VwQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50IHRvIGxldCBjbGllbnRzIGFjY2VzcyBpdHMKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyIDxlbT5ncm91cCBpdGVtIHByb3ZpZGVyczwvZW0+fQotICogYnkgbmFtZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJR3JvdXBDb250YWluZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgZ3JvdXAgaXRlbSBwcm92aWRlciB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAgaXRlbSBwcm92aWRlcgotCSAqIEByZXR1cm4gYSA8Y29kZT5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjxjb2RlPiBvYmplY3QKLQkgKi8KLQlPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMmE1M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgaXRlbSBwcm92aWRlcnMgdGhhdCB3YW50IHRvIGluY2x1ZGUgVUkgZm9sZGVycwotICogYW5kIGZlYXR1cmUgZGVyaXZlZCBjaGlsZHJlbi4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgaXRlbSBwcm92aWRlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBhIHBhcmVudCBvYmplY3QsIHR5cGljYWxseSBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0Jdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjaGlsZHJlbiBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZmVhdHVyZXMgZm9yIHJldHJpZXZpbmcgdGhlIGNoaWxkIGVsZW1lbnRzCi0JICovCi0JQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lNZXRob2RDb25maWd1cmF0aW9uUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzk4ZTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmUgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZENvbmZpZ3VyYXRpb25Qcm92aWRlciB7Ci0JTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lOYW1lZEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JTmFtZWRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjMWE1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lOYW1lZEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lZEZpbHRlciBleHRlbmRzIElGaWx0ZXIgewotCVN0cmluZyBnZXROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YTI4NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotcHVibGljIGludGVyZmFjZSBJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBQbHVnaW4gUGFja2FnZSBwcmVzZW50YXRpb24gY2hhbmdlZC4KLQkgKiBAcGFyYW0gaXNGbGF0IGlmIDxjb2RlPnRydWU8L2NvZGU+LCBsYXlvdXQgaXMgbm93IGZsYXQgbW9kZS4gaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIGxheW91dCBpcyBoaWVyYXJjaGljYWwuCi0JICovCi0Jdm9pZCBsYXlvdXRDaGFuZ2VkKGJvb2xlYW4gaXNGbGF0KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUmVmZXJlbmNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JUmVmZXJlbmNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmU5NDJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVJlZmVyZW5jZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBhZGFwdGVyIGZhY3RvcmllcyBmb3IgY2xlYW5pbmcgdXAgcmVmZXJlbmNlcyB0bwotICogdW51c2VkIGl0ZW0gcHJvdmlkZXJzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZlcmVuY2VyIHsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHJlZmVyZW5jZSB0byBhbiBpdGVtIHByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHRvIGFuIGl0ZW0gcHJvdmlkZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZWZlcmVuY2UgaXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHJlZik7Ci0KLQkvKioKLQkgKiBDbGVhbnMgdXAgYWxsIHVudXNlZCByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JU3RhdGVmdWxJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVN0YXRlZnVsSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzJjZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JU3RhdGVmdWxJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBzdGF0ZWZ1bHQgaXRlbSBwcm92aWRlcnMgdGhhdCBuZWVkIHRvIGJlCi0gKiBkaXNwb3NlZCBhZnRlciB0aGV5IGFyZSBubyBsb25nZXIgdXNlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJRGlzcG9zYWJsZSB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkNjU5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXcmFwcGVyIHsKLQotCU9iamVjdCB3cmFwKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLAotCQkJaW50IGluZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjM2ZmMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9JV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBJV3JhcHBlckl0ZW1Qcm92aWRlcn0KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgd3JhcHBlciBvZiBnaXZlbiB2YWx1ZSBmb3IgdGhlIGdpdmVuIG93bmVyCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCUlXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIHZhbHVlIGlzIGxvY2F0ZWQuIElmIGZlYXR1cmUgaXMgbm9uLW51bGwsIHRoaXMgaW5kZXggaXMgd2l0aGluIHRoYXQgZmVhdHVyZS4KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzZGE2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L0lXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIgewotCUlXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBnZXRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTM3MmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBMaWJyYXJ5IEVkaXQgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUVkaXRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBwbHVnaW47Ci0KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlFZGl0UGx1Z2luIElOU1RBTkNFOwotCi0JLy8gVGhlIHNoYXJlZCBpbWFnZSBoYXNoIG1hcC4KLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBpbWFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5RWRpdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlFZGl0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5RWRpdFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGlzIHBsdWctaW4uCi0JICogCi0JICogQHJldHVybiBUaGUgc3ltYm9saWMgbmFtZSBvZiB0aGlzIHBsdWctaW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeW1ib2xpY05hbWUoKSB7Ci0JCXJldHVybiBnZXRJZCgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCSAgICBPYmplY3QgcmVzdWx0ID0gaW1hZ2VzLmdldChrZXkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gZG9HZXRJbWFnZShrZXkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCQlpZihyZXN1bHQgIT0gbnVsbCkgewotCQkJCWltYWdlcy5wdXQoa2V5LCByZXN1bHQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZG9HZXRJbWFnZShTdHJpbmcga2V5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCSAgICBVUkwgdXJsID0gbmV3IFVSTChpY29uVVJMICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJAotCSAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7IAotCSAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOwotCSAgICByZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbWFnZSBnaXZlbiB0aGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZVVSSQotCSAqICAgICAgICAgICAgVGhlIGltYWdlJ3MgVVJJLgotCSAqIEByZXR1cm4gVGhlIGltYWdlLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkSW1hZ2UoVVJJIGltYWdlVVJJKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaW1hZ2VVUkkudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9MaWJyYXJ5RWRpdFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMzYmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvTGlicmFyeUVkaXRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgTGlicmFyeSBFZGl0IG1lc3NhZ2UgcmVzb3VyY2UgYnVuZGxlIGFjY2Vzc29yIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpYnJhcnlFZGl0UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X2RlZXBfY29weV92YXJpYWJpbGl0eV9wcm9tcHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZF90b19kZWZhdWx0X2NvbmZpZ19kbGdfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RfY29weV9vcl9leHRlbmRfZGVsaXZlcnlfcHJvY2VzczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZXNjcmlwdG9yc0RlbGV0aW9uX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZXNjcmlwdG9yc0RlbGV0aW9uX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nUmVzb3VyY2VzX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YXJpYWJpbGl0eV9lcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyAgcmVwbGFjaW5nX2FuY2VzdG9yX2Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBseV9wYXR0ZXJuX2Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUZlYXR1cmVWYWx1ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGVfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdBY3Rpdml0aWVzX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsUmVwbGFjZW1lbnRBbmREZWVwQ29weV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlfcHJvbXB0TXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVlcENvcHlfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvckRpYWxvZ19jYW5ub3RSZW5hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlUmVmZXJlbmNlc0RpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZU5hbWVDb25mbGljdERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV3UHJvY2Vzc0NvbXBvbmVudERpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlUHJvY2Vzc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFzc29jaWF0aW9uRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RUZWFtc0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRlYW1zRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrU2VsZWN0aW9uRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGl0bGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5RWxlbWVudE5hbWVFcnJvcl9zaW1wbGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2cyOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50TmFtZUVycm9yMV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQbHVnaW5OYW1lRXJyb3JfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vQ29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9EZWxpdmVyeVByb2Nlc3NFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub0RlZmF1bHRDb25maWdFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub0Jhc2VQcm9jZXNzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlUHJvY2Vzc0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUVsZW1lbnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVFbGVtZW50RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkdXBsaWNhdGVDb250ZW50RmlsZUVycm9yX3NpbXBsZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmRvQ29tbWFuZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQcmVkZWNlc3NvckVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZV9vdXRvZnN5bmNoX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZGF0ZV9vdXRvZnN5bmNoX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX21zZ1dpdGhEZXRhaWxzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUZpbGVFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucmVzb2x2ZWRPYmplY3RFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZF9vcmlnaW5hbE5vdEZvdW5kV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRpbmdQcm9jZXNzQ29tcG9uZW50VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc2luZ1JlZmVyZW5jZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxldGluZ0VsZW1lbnRzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZpbmdSZWZlcmVuY2VzdGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2aW5nTW9kaWZpZWRGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZpbmdUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZpbmdGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZpbmdGaWxlVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlUHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udHJpYnV0ZXNUb190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYWxDb250cmlidXRlc1RvX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbmRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlc190ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuZHNfcmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvY2FsUmVwbGFjZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyYWJsZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRyaWJ1dGVUb0FjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eURyb3BDb21tYW5kX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUFjdGl2aXR5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkaXJlY3RvcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucmVzb2x2ZWRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzc2lzdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVua25vd25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbW1hbmRfZG9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3JlZl9kZWxldGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9yZWZfZGVsZXRlMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVpX3JlZmVyZW5jZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfd29ya3Byb2R1Y3RkZXNjcmlwdG9yX29wdGlvbnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV93b3JrcHJvZHVjdGRlc2NyaXB0b3Jfb3V0cHV0bGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV93b3JrcHJvZHVjdGRlc2NyaXB0b3JfZGVsZXRlX3Rhc2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX2dlbmVyaWNFcnJfbWVzc2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc0F1dG9TeW5jaHJvbml6ZUFjdGlvbl9ub0Rlc2NyaXB0b3JUb1N5bmNoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfY29uZmlndXJhYmxlY29tcG9zZWRhZGFwdGVyX3VuaGFuZGxlZF9leGNlcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dwbGlzdGRsZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfcm9sZWxpc3RkbGdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfZmF0YWxlcnI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfd29ya3Byb2R1Y3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXRpbF9Qcm9jZXNzVXRpbF9lcnJfc2FtZV9zdWJfZWxlbWVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX3dyb25nX2VsZW1lbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3Rhc2tzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdWlfYXNzb2NpYXRpb25fdGFza19zZWxlY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1dGlsX1Byb2Nlc3NVdGlsX2NoaWxkYWRhcHRlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHV0aWxfUHJvY2Vzc1V0aWxfbG9jYWxDb250cmlidXRlc3RvOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc19leHRlbmRzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc19yZXBsYWNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfbG9jYWxSZXBsYWNlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVncm91cGluZ3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Rvb2xtZW50b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2xlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19hbGxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfYWN0aXZpdGllc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3ByYWN0aWNlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3RlbXBsYXRlc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2NoZWNrbGlzdHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcm9sZXNldHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2NvbmNlcHRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfZXhhbXBsZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2xlZGVzY3JpcHRvcnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzQXV0b1N5bmNocm9uaXplQWN0aW9uX3ByZXBhcmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3N1cHBvcnRpbmdtYXRlcmlhbHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX2Vycm9yU2F2aW5nRmlsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3dvcmtwcm9kdWN0dHlwZXNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmlsdGVyQ29uc3RhbnRzX3JlcG9ydHNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW51YWxTeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvU3luY2hyb25pemVDb21tYW5kX3N1Y2Vzc2Z1bDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTeW5jaHJvbml6ZUNvbXBsZXRlRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXNlckludGVyYWN0aW9uSGVscGVyX1Byb2Nlc3NQYWNrYWdlX05hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdFbGVtZW50X3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmRfTWVzc2FnZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNvcnRUeXBlX0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfTWFudWFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydFR5cGVfQWxwaGFiZXRpYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9SZXZlcnNlQWxwaGFiZXRpYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3J0VHlwZV9NZXRob2RUeXBlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNwZWNpZnlOYW1lVGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19TVEFSVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19GSU5JU0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9TVEFSVF9UT19GSU5JU0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9TVEFSVF9UT19TVEFSVDsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QbHVnaW5VSVBhY2thZ2VDb250ZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1BsdWdpblVJUGFja2FnZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNjY5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1BsdWdpblVJUGFja2FnZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBTdG9yZXMgKGluIG1lbW9yeSBvbmx5KSB0aGUgRmxhdC9IaWVyYXJjaGljYWwgcGx1Z2luLXBhY2thZ2UgbGF5b3V0Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5VSVBhY2thZ2VDb250ZXh0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBsdWdpblVJUGFja2FnZUNvbnRleHQgSU5TVEFOQ0UgPSBuZXcgUGx1Z2luVUlQYWNrYWdlQ29udGV4dCgpOyAKLQotCXByaXZhdGUgYm9vbGVhbiBpc0ZsYXRMYXlvdXQgPSBmYWxzZTsKLQkKLQlwcml2YXRlIExpc3Q8SVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXI+IGxpc3RlbmVyczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJRVJBUkNISUNBTF9MQVlPVVQ9ICJoaWVyYXJjaGljYWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBVF9MQVlPVVQ9ICJmbGF0IjsgLy8kTk9OLU5MUy0xJAotCi0JCi0JcHVibGljIGJvb2xlYW4gaXNGbGF0TGF5b3V0KCkgewotCQlyZXR1cm4gaXNGbGF0TGF5b3V0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0b2dnbGVMYXlvdXQoKSB7Ci0JCWlzRmxhdExheW91dCA9ICFpc0ZsYXRMYXlvdXQ7Ci0JCW5vdGlmeUxpc3RlbmVycygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExheW91dEFzU3RyaW5nKCkgewotCQlpZiAoaXNGbGF0TGF5b3V0KCkpIHsKLQkJCXJldHVybiBGTEFUX0xBWU9VVDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBISUVSQVJDSElDQUxfTEFZT1VUOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExheW91dEhpZXJhcmNoaWNhbCgpIHsKLQkJaXNGbGF0TGF5b3V0ID0gZmFsc2U7Ci0JCW5vdGlmeUxpc3RlbmVycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExheW91dEZsYXQoKSB7Ci0JCWlzRmxhdExheW91dCA9IHRydWU7Ci0JCW5vdGlmeUxpc3RlbmVycygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXRGbGF0V2l0aG91dE5vdGlmeShib29sZWFuIGZsYWcpIHsKLQkJaXNGbGF0TGF5b3V0ID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyPigpOwotCQl9Ci0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSVBsdWdpblVJUGFja2FnZUNvbnRleHRDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvcjxJUGx1Z2luVUlQYWNrYWdlQ29udGV4dENoYW5nZWRMaXN0ZW5lcj4gaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlQbHVnaW5VSVBhY2thZ2VDb250ZXh0Q2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIubGF5b3V0Q2hhbmdlZChpc0ZsYXRMYXlvdXQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9QcmVzZW50YXRpb25Db250ZXh0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ByZXNlbnRhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmMzIyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ByZXNlbnRhdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByZXNlbnRhdGlvbkNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlc2VudGF0aW9uQ29udGV4dCBJTlNUQU5DRSA9IG5ldyBQcmVzZW50YXRpb25Db250ZXh0KCk7IAotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lcyA9IGZhbHNlOwotCXByaXZhdGUgQ29tcGFyYXRvciBjb21wYXJhdG9yID0gQ29tcGFyYXRvcnMuREVGQVVMVF9DT01QQVJBVE9SOwotCXByaXZhdGUgQ29tcGFyYXRvciByZXZlcnNlQ29tcGFyYXRvciA9IENvbXBhcmF0b3JzLlJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SOwotCXByaXZhdGUgQ29tcGFyYXRvciBtZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IgPSBDb21wYXJhdG9ycy5NRVRIT0RfVFlQRV9DT01QQVJBVE9SOwotCQotCQotCXByaXZhdGUgQ29tcGFyYXRvciBndWlkYW5jZVR5cGVDb21wYXJhdG9yID0gbmV3IFR5cGVDb21wYXJhdG9yKCkgewotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzLlR5cGVDb21wYXJhdG9yI2dldERlZmF1bHRDb21wYXJhdG9yKCkKLQkJICovCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yIGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIGNvbXBhcmF0b3I7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJaW50IGlkID0gKChHdWlkYW5jZSkgb2JqKS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQlpZiAoaWQgPT0gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04pIHsKLQkJCQkJaWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgQ29tcGFyYXRvciBwcm9jZXNzUGFja2FnZUNvbXBhcmF0b3IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gY29tcGFyYXRvcjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQotCi0JCi0JcHJpdmF0ZSBQcmVzZW50YXRpb25Db250ZXh0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gc2hvd1ByZXNlbnRhdGlvbk5hbWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNob3dQcmVzZW50YXRpb25OYW1lcyhib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lcykgewotCQl0aGlzLnNob3dQcmVzZW50YXRpb25OYW1lcyA9IHNob3dQcmVzZW50YXRpb25OYW1lczsKLQkJY29tcGFyYXRvciA9IHNob3dQcmVzZW50YXRpb25OYW1lcyA/IENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IgOiBDb21wYXJhdG9ycy5ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JCXJldmVyc2VDb21wYXJhdG9yID0gc2hvd1ByZXNlbnRhdGlvbk5hbWVzID8gQ29tcGFyYXRvcnMuUkVWRVJTRV9QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SIDogQ29tcGFyYXRvcnMuUkVWRVJTRV9ERUZBVUxUX0NPTVBBUkFUT1I7Ci0JCW1ldGhvZEVsZW1lbnRUeXBlQ29tcGFyYXRvciA9IHNob3dQcmVzZW50YXRpb25OYW1lcyA/IENvbXBhcmF0b3JzLk1FVEhPRF9UWVBFX1BSRVNfTkFNRV9DT01QQVJBVE9SIDogQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfQ09NUEFSQVRPUjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gY29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIHJldmVyc2VDb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldEd1aWRhbmNlVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBndWlkYW5jZVR5cGVDb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvcjsKLQl9Ci0JCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0TWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgQ29tcGFyYXRvciBnZXRQcmVzTmFtZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SOwotCX0KLQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByZXNOYW1lUmV2ZXJzZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBDb21wYXJhdG9ycy5SRVZFUlNFX1BSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1I7Ci0JfQotCQotCXB1YmxpYyBDb21wYXJhdG9yIGdldFByZXNOYW1lTWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gQ29tcGFyYXRvcnMuTUVUSE9EX1RZUEVfUFJFU19OQU1FX0NPTVBBUkFUT1I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Byb3ZpZGVycy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9Qcm92aWRlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMTBmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Byb3ZpZGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb3ZpZGVycyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29uZmlndXJhdG9yRmFjdG9yeSBjb25maWd1cmF0b3JGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZmVyZW5jZVN0b3JlOwotCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgYXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlOwotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBQcm92aWRlcnMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdG9yRmFjdG9yeSBnZXRDb25maWd1cmF0b3JGYWN0b3J5KCkgewotCQlyZXR1cm4gY29uZmlndXJhdG9yRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlndXJhdG9yRmFjdG9yeSgKLQkJCUlDb25maWd1cmF0b3JGYWN0b3J5IGNvbmZpZ3VyYXRvckZhY3RvcnkpIHsKLQkJUHJvdmlkZXJzLmNvbmZpZ3VyYXRvckZhY3RvcnkgPSBjb25maWd1cmF0b3JGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKAotCQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKSB7Ci0JCVByb3ZpZGVycy5jb25maWd1cmF0aW9uQXBwbGljYXRvciA9IGNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gcHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcmVmZXJlbmNlU3RvcmUoSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZmVyZW5jZVN0b3JlKSB7Ci0JCVByb3ZpZGVycy5wcmVmZXJlbmNlU3RvcmUgPSBwcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBnZXRBdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBhdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEF1dGhvcmluZ1BsdWdpblByZWZlcmVuY2VTdG9yZShJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSkgewotCQlhdXRob3JpbmdQbHVnaW5QcmVmZXJlbmNlU3RvcmUgPSBzdG9yZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIoSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlMaXN0IGxpc3RlbmVycyA9IChMaXN0KSBjb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLmdldChsaXN0ZW5lcgotCQkJCS5nZXRDb21tYW5kVHlwZSgpKTsKLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLnB1dChsaXN0ZW5lci5nZXRDb21tYW5kVHlwZSgpLCBsaXN0ZW5lcnMpOwotCQl9IGVsc2UgaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ29tbWFuZExpc3RlbmVyKElDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJTGlzdCBsaXN0ZW5lcnMgPSAoTGlzdCkgY29tbWFuZFR5cGVUb0xpc3RlbmVyc01hcC5nZXQobGlzdGVuZXIKLQkJCQkuZ2V0Q29tbWFuZFR5cGUoKSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlpZiAobGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJCWNvbW1hbmRUeXBlVG9MaXN0ZW5lcnNNYXAucmVtb3ZlKGxpc3RlbmVyLmdldENvbW1hbmRUeXBlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENvbW1hbmRMaXN0ZW5lcnMoQ2xhc3MgY29tbWFuZFR5cGUpIHsKLQkJcmV0dXJuIChMaXN0KSBjb21tYW5kVHlwZVRvTGlzdGVuZXJzTWFwLmdldChjb21tYW5kVHlwZSk7Ci0JfQotCi0Jc3RhdGljIHsKLQkJLy8gcmVnaXN0ZXIgY29tbWFuZCBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gY29udHJpYnV0ZWQgdmlhIGV4dGVuc2lvbiBwb2ludCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmRMaXN0ZW5lcnMKLQkJLy8KLQkJdHJ5IHsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKTsKLQkJCVN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUgPSAiY29tbWFuZExpc3RlbmVycyI7IC8vJE5PTi1OTFMtMSQKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCU9iamVjdCBleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJaWYoZXh0IGluc3RhbmNlb2YgSUNvbW1hbmRMaXN0ZW5lcikgewotCQkJCQkJCQkJcmVnaXN0ZXJDb21tYW5kTGlzdGVuZXIoKElDb21tYW5kTGlzdGVuZXIpIGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyNDVjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgR2VuZXJpYyBEaWFsb2cgVGl0bGVzCi1tb3ZlRGlhbG9nX3RpdGxlPU1vdmUKLWRlbGV0ZURpYWxvZ190aXRsZT1EZWxldGUgRWxlbWVudAotZXJyb3JEaWFsb2dfdGl0bGU9RXJyb3IKLWVycm9yRGlhbG9nX2Nhbm5vdFJlbmFtZT1DYW5ub3QgcmVuYW1lIHswfSAnJ3sxfScnIHRvICcnezJ9JycuIFJlc29sdmUgdGhlIGlzc3VlIHNob3duIGluIERldGFpbHMgYW5kIGNsaWNrIE9LIHRvIGNvbnRpbnVlIG9yIENhbmNlbCB0byBhYm9ydCB0aGlzIG9wZXJhdGlvbi4KLQotIyBDb25maXJtIFJlZmVyZW5jZXMgUmVtb3ZhbCBEaWFsb2cKLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGl0bGU9Q29uZmlybSBSZWZlcmVuY2VzIFJlbW92YWwKLWRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dD1UaGUgZWxlbWVudChzKSB5b3UgYXJlIGFib3V0IHRvIGRlbGV0ZSBhcmUgc3RpbGwgYmVpbmcgcmVmZXJlbmNlZCBieSBvdGhlciBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkuIERlbGV0aW5nIHRoZXNlIGVsZW1lbnRzIHdpbGwgcmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlbSwgdGhlcmVmb3JlLCB3aWxsIHVwZGF0ZSB0aGUgcmVmZXJyaW5nIGVsZW1lbnRzIGFzIHdlbGwuICBNYWtlIHN1cmUgeW91IGhhdmUgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIHJlZmVycmluZyBlbGVtZW50cyBiZWZvcmUgY2xpY2tpbmcgT0suICBDbGljayBEZXRhaWxzIHRvIHJldmlldyB0aGUgbGlzdCBvZiBlbGVtZW50cyB0aGF0IHJlZmVyZW5jZSB0aGUgZWxlbWVudChzKSB0aGF0IHlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlLgotCi0jIFJlc29sdmUgTmFtZSBDb25mbGljdCBEaWFsb2cKLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU9UmVzb2x2ZSBFbGVtZW50IE5hbWUgQ29uZmxpY3QKLXJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGV4dD1FbnRlciBhIG5ldyB7MH0gZm9yICcnezF9Jyc6Ci0KLSMgU2VsZWN0IERlbGl2ZXJhYmxlcyBEaWFsb2cKLXNlbGVjdERlbGl2ZXJhYmxlc0RpYWxvZ190aXRsZT1TZWxlY3QgRGVsaXZlcmFibGVzCi1zZWxlY3REZWxpdmVyYWJsZXNEaWFsb2dfdGV4dD1TZWxlY3QgYSBkZWxpdmVyYWJsZSB3aGVyZSB5b3Ugd2FudCB3b3JrIHByb2R1Y3QgJyd7MH0nJyB0byBiZSBhc3NpZ25lZC4KLQotIyBOZXcgUHJvY2VzcyBDb21wb25lbnQgRGlhbG9nCi1uZXdQcm9jZXNzQ29tcG9uZW50RGlhbG9nX3RpdGxlPU5ldyBQcm9jZXNzIENvbXBvbmVudAotbmFtZUxhYmVsX3RleHQ9TmFtZToKLWRlZmF1bHRDb25maWdMYWJlbF90ZXh0PURlZmF1bHQgQ29uZmlndXJhdGlvbjoKLWJhc2VQcm9jZXNzTGFiZWxfdGV4dD1CYXNlIFByb2Nlc3M6Ci1iYXNlZE9uUHJvY2Vzc2VzTGFiZWxfdGV4dD1CYXNlZCBvbiBQcm9jZXNzZXM6Ci1TcGVjaWZ5TmFtZVRleHQ9U3BlY2lmeSBhIHZhbGlkIG5hbWUuCi0KLSMgUm9sZSBBc3NvY2lhdGlvbiBEaWFsb2cKLXNlbGVjdEFzc29jaWF0aW9uTGFiZWxfdGV4dD1TZWxlY3QgYXNzb2NpYXRpb24gZm9yIHRoZSB0YXNrICcnezB9JycKLQotIyBSZW1vdmUgQXNzb2NpYXRpb24gZGlhbG9nCi1yZW1vdmVBc3NvY2lhdGlvbkRpYWxvZ190ZXh0PVJlbW92ZSBBc3NvY2lhdGlvbgotCi0jIFNlbGVjdCBUZWFtcyBEaWFsb2cKLXNlbGVjdFRlYW1zRGlhbG9nX3RpdGxlPVNlbGVjdCBUZWFtcwotc2VsZWN0VGVhbXNEaWFsb2dfdGV4dD1TZWxlY3QgYSB0ZWFtIHdoZXJlIHlvdSB3YW50IGEgcm9sZSAnJ3swfScnIHRvIGJlIGFzc2lnbmVkLgotCi0jIFRhc2sgU2VsZWN0aW9uIERpYWxvZwotdGFza1NlbGVjdGlvbkRpYWxvZ190aXRsZT1UYXNrIFNlbGVjdGlvbgotdGl0bGVMYWJlbF90ZXh0PVNlbGVjdCB0YXNrcy4uCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWVtcHR5RWxlbWVudE5hbWVFcnJvcl9tc2c9SVVQTDAxMDBFOiBUaGUgezB9IG5hbWUgaXMgbWlzc2luZy5cbkFsbCBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMgbXVzdCBoYXZlIGEgbmFtZS5cbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZW1wdHlFbGVtZW50TmFtZUVycm9yX3NpbXBsZV9tc2c9VGhlIG5hbWUgY2Fubm90IGJlIGVtcHR5LiBQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIG5hbWUuCi1kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZz1JVVBMMDEwMUU6IFRoZSBuYW1lICcnezB9JycgYWxyZWFkeSBleGlzdHMuXG5BIG1ldGhvZCBlbGVtZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lLlxuRW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2cyPUVudGVyIGEgZGlmZmVyZW50IG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZz1UaGUgbmFtZSBhbHJlYWR5IGV4aXN0cy4gUGxlYXNlIHNwZWNpZnkgYW5vdGhlciBuYW1lLgotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IxX21zZz1JVVBMMDEwMkU6IFRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3Qgc3RhcnQgd2l0aCBhIHNwYWNlLlxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnPUlVUEwwMTAzRTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBlbmQgd2l0aCBhIHBlcmlvZC5cbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZz1JVVBMMDEwNEU6IFRoZSBuYW1lICcnezB9JycgaXMgaW52YWxpZC5cbkEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/ICIgPCA+IDsgfFxuRW50ZXIgYSB2YWxpZCBuYW1lIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjRfbXNnPUlVUEwwMTA1RTogVGhlIG5hbWUgJyd7MH0nJyBpcyBpbnZhbGlkLlxuQSBtZXRob2QgZWxlbWVudCBuYW1lIGNhbm5vdCBjb250YWluIHRoZSBjaGFyYWN0ZXI6ICZcbkVudGVyIGEgdmFsaWQgbmFtZSBhbmQgdHJ5IGFnYWluLgotaW52YWxpZFBsdWdpbk5hbWVFcnJvcl9tc2c9SVVQTDAxMjFFOiBUaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuXG5BIG1ldGhvZCBwbHVnLWluJydzIG5hbWUgY2Fubm90IGNvbnRhaW4gdGhlc2UgY2hhcmFjdGVyczogXFwgLyA6ICogPyAiIDwgPiA7IHwgIyAlICcnXG5FbnRlciBhIHZhbGlkIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLWZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnPUZpbGUgcGF0aCBuYW1lIHRvbyBsb25nIChleGNlZWRpbmcgJyd7MH0nJykgCi1ub0NvbmZpZ0Vycm9yX21zZz1UaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBkb2VzIG5vdCBjb250YWluIGFueSBtZXRob2QgY29uZmlndXJhdGlvbi5cbkEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaXMgbmVlZGVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9jZXNzLlxuQ3JlYXRlIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KLW5vRGVsaXZlcnlQcm9jZXNzRXJyb3JfbXNnPUlVUEwwMTA2RTogVGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgZG9lcyBub3QgY29udGFpbiBhbnkgZGVsaXZlcnkgcHJvY2Vzc2VzLlxuQSBiYXNlIGRlbGl2ZXJ5IHByb2Nlc3MgaXMgbmVlZGVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9jZXNzIGNvbnRyaWJ1dGlvbi5cbkNyZWF0ZSBhIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIHRyeSBhZ2Fpbi4KLW5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZz1JVVBMMDEwN0U6IE5vIG1ldGhvZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHNlbGVjdGVkLlxuQSBkZWZhdWx0IG1ldGhvZCBjb25maWd1cmF0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gdGhlIG5ldyBwcm9jZXNzLlxuU2VsZWN0IGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gYW5kIHRyeSBhZ2Fpbi4KLW5vQmFzZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDhFOiBObyBkZWxpdmVyeSBwcm9jZXNzIGhhcyBiZWVuIHNlbGVjdGVkLlxuQSBwcm9jZXNzIGNvbnRyaWJ1dGlvbiByZXF1aXJlcyBhIGJhc2UgZGVsaXZlcnkgcHJvY2Vzcy5cblNlbGVjdCBhIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIHRyeSBhZ2Fpbi4KLWNyZWF0ZVByb2Nlc3NFcnJvcl9tc2c9SVVQTDAxMDlFOiBUaGUgcHJvY2VzcyBjYW5ub3QgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCi1jcmVhdGVFbGVtZW50RXJyb3JfbXNnPUlVUEwwMTEwRTogVGhlIGVsZW1lbnQgY2Fubm90IGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgotZGVsZXRlRWxlbWVudEVycm9yX21zZz1JVVBMMDExMUU6IFRoZSBlbGVtZW50IGNhbm5vdCBiZSBkZWxldGVkIHN1Y2Nlc3NmdWxseS4KLWR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnPUlVUEwwMTEyRTogVGhlIGNvbnRlbnQgZmlsZSBmb3IgdGhlIGVsZW1lbnQgY2Fubm90IGJlIGNyZWF0ZWQgb3IgcmVuYW1lZCB0byBtYXRjaCB0aGUgZWxlbWVudCBuYW1lLlxuXG5BIGZpbGUgJyd7MH0nJyBhbHJlYWR5IGV4aXN0cy5cblxuRW50ZXIgYSBkaWZmZXJlbnQgbmFtZSBhbmQgdHJ5IGFnYWluLgotZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9zaW1wbGVfbXNnPUEgY29udGVudCBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBleGl0cy4gUGxlYXNlIHNwZWNpZnkgYW5vdGhlciBuYW1lLgotdW5kb0NvbW1hbmRFcnJvcl9tc2c9SVVQTDAxMTNFOiBUaGUgdW5kbyBjb21tYW5kICcnezB9JycgY2Fubm90IGJlIGNvbXBsZXRlZC5cblxuQW4gZXJyb3IgaGFzIG9jY3VycmVkOiB7MX0KLWludmFsaWRQcmVkZWNlc3NvckVycm9yX21zZz1JVVBMMDExNEU6IFRoZSBzcGVjaWZpZWQgcHJlZGVjZXNzb3IgaW5kZXggaXMgaW52YWxpZC5cblxuQSBwcmVkZWNlc3NvciBpbmRleCBtdXN0IGJlIGFuIGludGVnZXIgdmFsdWUgZnJvbSB0aGUgJ0luZGV4JyBjb2x1bW4uXG5cblNwZWNpZnkgYSB2YWxpZCB2YWx1ZSBhbmQgdHJ5IGFnYWluLgotVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cz1JVVBMMDEwMFc6ICcnezB9JycgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHRvICcnezF9JycuICBPbmx5IG9uZSBhc3NvY2lhdGlvbiBvZiB0aGlzIGtpbmQgaXMgYWxsb3dlZC4gIFRvIGFzc2lnbiAnJ3swfScnIHRvICcnezJ9JycgeW91IG5lZWQgdG8gZmlyc3QgcmVtb3ZlIGl0IGZyb20gJyd7MX0nJy4KLWVycm9yX21zZ1dpdGhEZXRhaWxzPUlVUEwwMTE2RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkLiBDbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotZXJyb3JfbXNnPUlVUEwwMTE3RTogQW4gZXJyb3IgaGFzIG9jY3VycmVkLiBTZWUgZXJyb3IgbG9nIGZvciBtb3JlIGRldGFpbHMuCi1TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb249SVVQTDAxMThFOiBOYW1lIGNvbmZsaWN0IHdpbGwgb2NjdXIgYWZ0ZXIgdGhpcyBvcGVyYXRpb24uIENoZWNrIGVsZW1lbnQncyBuYW1lIGZvciBkdXBsaWNhdGlvbiBhbmQgdHJ5IGFnYWluCi1TdXBwcmVzc2lvbl9wcmVzZW50YXRpb25OYW1lRHVwbGljYXRpb249SVVQTDAxMTlFOiBOYW1lIGNvbmZsaWN0IHdpbGwgb2NjdXIgYWZ0ZXIgdGhpcyBvcGVyYXRpb24uIENoZWNrIGVsZW1lbnQncyBwcmVzZW50YXRpb24gbmFtZSBmb3IgZHVwbGljYXRpb24gYW5kIHRyeSBhZ2FpbgotCi0jIEVycm9yIFJlYXNvbnMKLWVycm9yX3JlYXNvbj1BbiBlcnJvciBoYXMgb2NjdXJyZWQuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zYXZlUHJvY2Vzc0Vycm9yX3JlYXNvbj1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgc2F2aW5nIHRoZSBwcm9jZXNzICcnezB9JycuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1kZWxldGVSZWZlcmVuY2VzRXJyb3JfcmVhc29uPUFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSByZW1vdmluZyByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1zYXZlRmlsZUVycm9yX3JlYXNvbj1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hpbGUgc2F2aW5nIHRoZSBmaWxlICcnezB9JycuIENsaWNrIERldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1pbnZhbGlkUmVmZXJlbmNlc0Vycm9yX3JlYXNvbj1EZXRlY3RlZCBtZXRob2QgZWxlbWVudHMgd2l0aCBpbnZhbGlkIHJlZmVyZW5jZXMgYXMgYSByZXN1bHQgb2YgY3Jvc3MgcGx1Zy1pbiBjb3B5LlxuVGhlc2UgcmVmZXJlbmNlcyB3aWxsIGJlIHJlbW92ZWQuIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotdW5yZXNvbHZlZE9iamVjdEVycm9yX3JlYXNvbj1DYW5ub3QgbW9kaWZ5IGFuIHVucmVzb2x2ZWQgb2JqZWN0OiB7MH0oVVJJID0gezF9KXsyfQotCi0jIFdhcm5pbmcgbWVzc2FnZXMKLU1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZz1JVVBMMDExOFc6IENvdWxkIG5vdCBmaW5kIG9uZSBvciBtb3JlIHNvdXJjZSBlbGVtZW50cy4gQXNzb2NpYXRlZCBmaWxlcyBpbiB0aGUgcmVzb3VyY2VzIGZvbGRlciB3aWxsIG5vdCBiZSBjb3BpZWQuCi1BY3Rpdml0eUFkZENvbW1hbmRfb3JpZ2luYWxOb3RGb3VuZFdhcm5pbmdfbXNnPUlVUEwwMTE5VzogQ291bGQgbm90IGZpbmQgb25lIG9yIG1vcmUgc291cmNlIGVsZW1lbnRzLiBBc3NvY2lhdGVkIFByb2Nlc3MgUGFja2FnZXMgd2lsbCBub3QgYmUgY29waWVkLgotQWN0aXZpdHlEcm9wQ29tbWFuZF9kZWVwQ29weV9wcm9tcHRDb25maWd1cmF0aW9uTXNnPURvIHlvdSB3YW50IHRvIGNvcHkgYWxsIGRlc2NyaXB0b3JzP1xuXG5DbGlja2luZyBvbiBObyB3aWxsIGNvcHkgb25seSB0aGUgZGVzY3JpcHRvcnMgdGhhdCBhcmUgcGFydCBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotZGVlcENvcHlfcHJvbXB0TXNnPVlvdSB3aWxsIGdldCBhIGNvcHkgb2YgYWxsIGR5bmFtaWNhbGx5IGxpbmtlZCBlbGVtZW50cyB0aGF0IHlvdSBuZWVkIHRvIG1haW50YWluIHNlcGFyYXRlbHkgZnJvbSBub3cgb24uIERvIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotZGVlcENvcHlfdGl0bGU9RGVlcCBDb3B5Ci0KLSMgUHJvZ3Jlc3MgbWVzc2FnZXMKLWNyZWF0aW5nUHJvY2Vzc0NvbXBvbmVudFRhc2tfbmFtZT1DcmVhdGluZyBwcm9jZXNzIGNvbXBvbmVudCAnJ3swfScnLi4uCi1wcm9jZXNzaW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1Qcm9jZXNzaW5nIHJlZmVyZW5jZXMuLi4KLWRlbGV0aW5nRWxlbWVudHNUYXNrX25hbWU9RGVsZXRpbmcgZWxlbWVudHMgYW5kIGFzc29jaWF0ZWQgZmlsZXMuLi4KLWNoZWNraW5nUmVmZXJlbmNlc1Rhc2tfbmFtZT1DaGVja2luZyBmb3IgcmVmZXJlbmNlcy4uLgotcmVtb3ZpbmdSZWZlcmVuY2VzdGFza19uYW1lPVJlbW92aW5nIHJlZmVyZW5jZXMuLi4KLXNhdmluZ01vZGlmaWVkRmlsZXNUYXNrX25hbWU9U2F2aW5nIG1vZGlmaWVkIGZpbGUocykuLi4KLWNoZWNrQWZmZWN0ZWRSZXNvdXJjZXNUYXNrX25hbWU9Q2hlY2tpbmcgYWZmZWN0ZWQgcmVzb3VyY2VzLi4uCi1tb3ZpbmdUYXNrX25hbWU9TW92aW5nLi4uCi1tb3ZpbmdGaWxlc1Rhc2tfbmFtZT1Nb3ZpbmcgZmlsZXMuLi4KLWNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWU9Q29weWluZyByZXNvdXJjZXMuLi4KLWNvcHlpbmdBY3Rpdml0aWVzX21zZz1Db3B5aW5nIGFjdGl2aXR5ICcnezB9JycKLXNhdmluZ0ZpbGVUYXNrX25hbWU9U2F2aW5nIGZpbGUgJyd7MH0nJy4uLgotc2F2aW5nUmVzb3VyY2VzX21zZz1TYXZpbmcgcmVzb3VyY2VzCi0KLSMgVUkgVGV4dAotZWxlbWVudF90ZXh0PWVsZW1lbnQKLWNyZWF0ZUVsZW1lbnRfdGV4dD1DcmVhdGUgRWxlbWVudAotY3JlYXRlUHJvY2Vzc190ZXh0PUNyZWF0ZSBQcm9jZXNzCi1jb250cmlidXRlc1RvX3RleHQ9Q29udHJpYnV0ZXMgdG8KLWxvY2FsQ29udHJpYnV0ZXNUb190ZXh0PUxvY2FsbHkgQ29udHJpYnV0ZXMgdG8KLWV4dGVuZHNfdGV4dD1FeHRlbmRzCi1yZXBsYWNlc190ZXh0PVJlcGxhY2VzCi1leHRlbmRzX3JlcGxhY2VzX3RleHQ9RXh0ZW5kcyBhbmQgUmVwbGFjZXMKLWxvY2FsUmVwbGFjZXNfdGV4dD1Mb2NhbGx5IFJlcGxhY2VzCi1sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dD1Mb2NhbCBSZXBsYWNlbWVudCBhbmQgRGVlcCBDb3AmeQotZWxlbWVudFR5cGVfdGV4dD17MH06IHsxfQotZGVsaXZlcmFibGVzX3RleHQ9RGVsaXZlcmFibGVzCi1jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0PUNvbnRyaWJ1dGUgVG8gQWN0aXZpdHkKLUFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWw9RHJvcCBBY3Rpdml0eQotcmVwbGFjZUFjdGl2aXR5X3RleHQ9UmVwbGFjZSBBY3Rpdml0eQotZmlsZV90ZXh0PWZpbGUKLWRpcmVjdG9yeV90ZXh0PWRpcmVjdG9yeQotdW5yZXNvbHZlZF90ZXh0PSh1bnJlc29sdmVkICcnezB9JycpCi1hc3Npc3RzX3RleHQ9QXNzaXN0aW5nIFBlcmZvcm1lcgotdW5rbm93bl90ZXh0PVVua25vd24KLWNvbW1hbmRfZG9uZT1Eb25lCi0KLSMgVGhlIGZvbGxvd2luZyBVSSB0ZXh0IHNob3VsZCBiZSByZXZpZXdlZC4KLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvPXswfSAoezF9ICcnezJ9JycgaW4gJyd7M30nJykKLVV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5X2luZm89ezB9ICh7MX0gJyd7Mn0nJykKLXVpX3JlZl9kZWxldGU9VGhlIGRlc2NyaXB0b3IgJyd7MH0nJyBoYXMgdGhlIGZvbGxvd2luZyByZWZlcmVuY2VzIHdoaWNoIGFyZSBub3QgdXNlZCBhbnl3aGVyZS5cblNlbGVjdCB0aGUgb25lcyB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBkZWxldGU6Ci11aV9yZWZfZGVsZXRlMj1UaGVzZSBmb2xsb3dpbmcgcmVmZXJlbmNlcyBhcmUgbm90IGJlaW5nIHVzZWQgYW55d2hlcmUuXG5TZWxlY3QgdGhlIG9uZXMgd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gZGVsZXRlOgotdWlfcmVmZXJlbmNlcz1SZWZlcmVuY2VzCi11aV93b3JrcHJvZHVjdF9kZXNjcmlwdG9yX2Rlc2NyaXB0aW9uPVdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yICcnezB9JycgaXMgYXNzb2NpYXRlZCAoT3V0cHV0IEZyb20pIHdpdGggdGFzayBkZXNjcmlwdG9yICcnezF9JycKLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vcHRpb25zPU9wdGlvbnMKLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9vdXRwdXRsYWJlbD1SZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgb3V0cHV0IG9mIHRoZSB0YXNrIGRlc2NyaXB0b3IKLXVpX3dvcmtwcm9kdWN0ZGVzY3JpcHRvcl9kZWxldGVfdGFzaz1EZWxldGUgdGFzayBkZXNjcmlwdG9yIGZyb20gdGhlIGFjdGl2aXR5Ci11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrPVRoZSBzZWxlY3RlZCBlbGVtZW50ICcnezB9JycgaXMgbm90IGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgeW91ciBwcm9jZXNzLlxuRG8geW91IHdhbnQgdG8gYWRkIGl0IGFuZCBpdHMgZGVwZW5kZW5jaWVzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24/Ci11aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZ2VuZXJpY0Vycl9tZXNzYWdlX3RleHQ9RXJyb3JzIG9jY3VycmVkIGluIHRoZSBvcGVyYXRpb24uIENsaWNrIG9uIGRldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24KLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fbm9EZXNjcmlwdG9yVG9TeW5jaD1ObyBkZXNjcmlwdG9yIHdpdGggbGlua2VkIG1ldGhvZCBlbGVtZW50IGZvdW5kIHRvIHN5bmNocm9uaXplCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9yZWZlcnNoaW5ndmlld2VyPUVycm9yIHJlZnJlc2hpbmcgdmlld2VyCi1jb25maXJtX3JlbW92ZV9yZWZlcmVuY2VzX3RleHQ9RWxlbWVudChzKSBsaXN0ZWQgaW4gRGV0YWlscyBtaWdodCBoYXZlIGlsbGVnYWwgcmVmZXJlbmNlcyB0byB0aGlzIGd1aWRhbmNlIGFmdGVyIGNvbnZlcnNpb24uIENsaWNrIE9LIHRvIHJlbW92ZSB0aGVtIGFuZCBjb250aW51ZS4KLWNvbmZpcm1EZXNjcmlwdG9yc0RlbGV0aW9uX3RpdGxlPUNvbmZpcm0gRGVzY3JpcHRvcnMgRGVsZXRpb24KLWNvbmZpcm1EZXNjcmlwdG9yc0RlbGV0aW9uX21zZz1UaGUgZWxlbWVudChzKSB5b3UgYXJlIGFib3V0IHRvIGRlbGV0ZSBhcmUgc3RpbGwgYmVpbmcgcmVmZXJlbmNlZCBieSBkZXNjcmlwdG9ycyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkuICBDbGljayBZZXMgaWYgeW91IHdhbnQgdG8gZGVsZXRlIHRoZXNlIGRlc2NyaXB0b3JzIGFzIHdlbGwuICBNYWtlIHN1cmUgeW91IGhhdmUgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIGRlc2NyaXB0b3JzIGJlZm9yZSBjbGlja2luZyBZZXMuICBDbGljayBEZXRhaWxzIHRvIHJldmlldyB0aGUgbGlzdCBvZiBkZXNjcmlwdG9ycyB0aGF0IHJlZmVyZW5jZSB0aGUgZWxlbWVudChzKSB0aGF0IHlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlLgotdXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbj1VbmhhbmRsZWQgZXhjZXB0aW9uCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX2JyZWFrZG93bl9lbGVtZW50PUNhbm5vdCBoYXZlIHRoZSBzYW1lIGJyZWFrZG93biBlbGVtZW50IGFzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IKLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl93cGxpc3RkbGdfbXNnPVRoZSB3b3JrIHByb2R1Y3QgJyd7MH0nJyBpcyBhbiBvdXRwdXQgdG8gdGhlIGZvbGxvd2luZyB0YXNrcy5cblNlbGVjdCB0aGUgdGFza3MgZm9yIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIGNyZWF0ZSB0aGUgY29ycmVzcG9uZGluZyBkZXNjcmlwdG9ycy4KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl9yb2xlbGlzdGRsZ19tc2c9VGhlIHJvbGUgJyd7MH0nJyBoYXMgdGhlIGZvbGxvd2luZyByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzLlxuU2VsZWN0IHRoZSB3b3JrIHByb2R1Y3RzIGZvciB3aGljaCB5b3Ugd291bGQgbGlrZSB0byBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvcnMuCi11dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVycj1GYXRhbCBlcnJvcgotdWlfVXNlckludGVyYWN0aW9uSGVscGVyX3dvcmtwcm9kdWN0cz1Xb3JrIFByb2R1Y3RzCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9zYW1lX3N1Yl9lbGVtZW50PUNhbm5vdCBsaW5rIGEgYnJlYWtkb3duIGVsZW1lbnQgdG8gb25lIG9mIGl0cyBzdWItZWxlbWVudC4KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3dyb25nX2VsZW1lbnQ9Q2Fubm90IGxpbmsgdG8gZWxlbWVudCBvdGhlciB0aGFuIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQuCi11dGlsX1Byb2Nlc3NVdGlsX2Vycl9jaGlsZF9lbGVtZW50PUNhbm5vdCBsaW5rIGEgYnJlYWtkb3duIGVsZW1lbnQgdG8gb25lIG9mIGl0cyBjaGlsZHJlbi4KLXVpX1VzZXJJbnRlcmFjdGlvbkhlbHBlcl90YXNrcz1UYXNrcwotdWlfYXNzb2NpYXRpb25fdGFza19zZWxlY3Rpb249VGFzayBTZWxlY3Rpb24uLi4KLXV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyPVwgXCBjaGlsZCdzIGFkYXB0ZXI6Ci0KLXV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NldHBhcmVudD1Db3VsZCBub3Qgc2V0IHBhcmVudCBmb3IgY2hpbGQKLXV0aWxfdG5ndXRpbF9jYW5ub3RfZWRpdF9yZXNvdXJjZT1DYW5ub3QgZWRpdCByZXNvdXJjZS4KLXV0aWxfUHJvY2Vzc1V0aWxfY29udHJpYnV0ZXN0bz1jb250cmlidXRlcyB0byAnJ3swfScnCi11dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bz1sb2NhbGx5IGNvbnRyaWJ1dGVzIHRvICcnezB9JycKLXByb2Nlc3NfZXh0ZW5kcz1leHRlbmRzICcnezB9JycKLXByb2Nlc3NfcmVwbGFjZXM9cmVwbGFjZXMgJyd7MH0nJwotcHJvY2Vzc19sb2NhbFJlcGxhY2VzPWxvY2FsbHkgcmVwbGFjZXMgJyd7MH0nJwotIyBGaWx0ZXIgY29uc3RhbnRzIGV4dGVybmFsaXplZCBzdHJpbmdzLgotRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ9RGlzY2lwbGluZXMKLUZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ9RGlzY2lwbGluZSBHcm91cGluZ3MKLUZpbHRlckNvbnN0YW50c193aGl0ZXBhcGVyc190ZXh0PVdoaXRlcGFwZXJzCi1GaWx0ZXJDb25zdGFudHNfdG9vbG1lbnRvcnNfdGV4dD1Ub29sIE1lbnRvcnMKLUZpbHRlckNvbnN0YW50c190b29sc190ZXh0PVRvb2xzCi1GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dD1Sb2xlcwotRmlsdGVyQ29uc3RhbnRzX3Rhc2tzX3RleHQ9VGFza3MKLUZpbHRlckNvbnN0YW50c19yZXVzYWJsZWFzc2V0c190ZXh0PVJldXNhYmxlIEFzc2V0cwotRmlsdGVyQ29uc3RhbnRzX2FsbF90ZXh0PU1vc3QgY29tbW9uCi1GaWx0ZXJDb25zdGFudHNfcHJvY2Vzc2VzX3RleHQ9UHJvY2Vzc2VzCi1GaWx0ZXJDb25zdGFudHNfYWN0aXZpdGllc190ZXh0PUFjdGl2aXRpZXMKLUZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dD1QcmFjdGljZXMKLUZpbHRlckNvbnN0YW50c190ZW1wbGF0ZXNfdGV4dD1UZW1wbGF0ZXMKLUZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dD1Xb3JrIFByb2R1Y3RzCi1GaWx0ZXJDb25zdGFudHNfY2hlY2tsaXN0c190ZXh0PUNoZWNrbGlzdHMKLUZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ9R3VpZGVsaW5lcwotRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRzX3RleHQ9Um9sZSBTZXRzCi1GaWx0ZXJDb25zdGFudHNfZ3VpZGFuY2VfdGV4dD1HdWlkYW5jZQotRmlsdGVyQ29uc3RhbnRzX2NvbmNlcHRzX3RleHQ9Q29uY2VwdHMKLUZpbHRlckNvbnN0YW50c19leGFtcGxlc190ZXh0PUV4YW1wbGVzCi1GaWx0ZXJDb25zdGFudHNfY29udGVudHBhY2thZ2VzX3RleHQ9Q29udGVudCBQYWNrYWdlcwotRmlsdGVyQ29uc3RhbnRzX3JvbGVkZXNjcmlwdG9yc190ZXh0PVJvbGUgRGVzY3JpcHRvcnMKLUZpbHRlckNvbnN0YW50c19yb2xlc2V0Z3JvcHVpbmdzX3RleHQ9Um9sZSBTZXQgR3JvdXBpbmdzCi1GaWx0ZXJDb25zdGFudHNfdGFza2Rlc2NyaXB0b3JzX3RleHQ9VGFzayBEZXNjcmlwdG9ycwotRmlsdGVyQ29uc3RhbnRzX2NvbnRlbnRlbGVtZW50c190ZXh0PUNvbnRlbnQgRWxlbWVudHMKLVByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZT1QcmVwYXJpbmcgc3luY2hyb25pemF0aW9uLi4uCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0PVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycwotRmlsdGVyQ29uc3RhbnRzX2FsbGNvbnRlbnRlbGVtZW50c190ZXh0PUFsbCBDb250ZW50IEVsZW1lbnRzCi1GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0PVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzPUVycm9yIHNhdmluZyBmaWxlKHMpCi1GaWx0ZXJDb25zdGFudHNfY3VzdG9tY2F0ZWdvcmllc190ZXh0PUN1c3RvbSBDYXRlZ29yaWVzCi1GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3R0eXBlc190ZXh0PVdvcmsgUHJvZHVjdCBLaW5kcwotRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRfd2FybmluZ01zZz1EZWxldGlvbiBjb21wbGV0ZWQgd2l0aCB3YXJuaW5nCi1GaWx0ZXJDb25zdGFudHNfbWV0aG9kcGx1Z2luc190ZXh0PU1ldGhvZCBQbHVnLWlucwotVXNlckludGVyYWN0aW9uSGVscGVyX2xvY2tlZFBsdWdpbj1JVVBMMDEyMEU6IFRoZSBwbHVnLWluICcnezB9JycgaXMgbG9ja2VkLgotRmlsdGVyQ29uc3RhbnRzX2RvbWFpbnNfdGV4dD1Eb21haW5zCi1GaWx0ZXJDb25zdGFudHNfcm9hZG1hcF90ZXh0PVJvYWRtYXBzCi1GaWx0ZXJDb25zdGFudHNfcmVwb3J0c190ZXh0PVJlcG9ydHMKLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfbGFiZWw9RGVmYXVsdCBTJnluY2hyb25pemF0aW9uIGZyb20gTWV0aG9kIENvbnRlbnQKLU1hbnVhbFN5bmNocm9uaXplQ29tbWFuZF9sYWJlbD1DdXN0b20gU3luY2hyb25pJnphdGlvbi4uLgotU3luY2hyb25pemVDb21wbGV0ZURpYWxvZ19UaXRsZT1TeW5jaHJvbml6YXRpb24gQ29tcGxldGUKLUF1dG9TeW5jaHJvbml6ZUNvbW1hbmRfc3VjZXNzZnVsPVN5bmNocm9uaXphdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lgotc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZV9tc2c9VGhlIGZvbGxvd2luZyBkZXNjcmlwdG9ycyBhcmUgbm90IHVzZWQgYW55d2hlcmUgYWZ0ZXIgZGVsZXRpb24gb2YgdGhlIHNlbGVjdGVkIGVsZW1lbnRzLlxuU2VsZWN0IGRlc2NyaXB0b3JzIHlvdSB3YW50IHRvIGRlbGV0ZS4KLQotQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmRfTWVzc2FnZT1TcGVjaWZ5IG5hbWUgYW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgdGhlIHswfSB0byBiZSBjcmVhdGVkLgotIyBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLVVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lPU5hbWU6Ci0KLSMgTWV0aG9kQ3JlYXRlQ2hpbGRDb21tYW5kCi1uZXdFbGVtZW50X3RleHQ9TmV3IHswfQotdXBkYXRlX291dG9mc3luY2hfdGl0bGU9VXBkYXRlIGNvbmZsaWN0Ci11cGRhdGVfb3V0b2ZzeW5jaF9tc2c9VGhlIGZpbGUocykgaGFzIGJlZW4gY2hhbmdlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uIERvIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgY2hhbmdlcz8KLWR1cGxpY2F0ZUZlYXR1cmVWYWx1ZT1DYW5ub3QgaGF2ZSAyIGVsZW1lbnRzIHVuZGVyICcnezB9Jycgd2l0aCB0aGUgc2FtZSB2YWx1ZSBmb3IgJyd7MX0nJwotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2c9Q2Fubm90IGFwcGx5IGFjdGl2aXR5ICcnezB9JycgdG8gdGhlIHByb2Nlc3MgJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxPUNhbm5vdCBhcHBseSBhY3Rpdml0eSAnJ3swfScnIHRvIHRoZSBwcm9jZXNzICcnezF9Jycgc2luY2UgJyd7MH0nJyBhbHJlYWR5IGhhcyBvbmUgb3IgbW9yZSBjb250cmlidXRlZC9yZXBsYWNlZCBhY3Rpdml0aWVzIGFzIGl0cyBjaGlsZHJlbi4KLWFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzE9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggb25lIG9mIGl0cyBkaXJlY3QgcGFyZW50LgotYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMj1BY3Rpdml0eSAnJ3swfScnIGNhbm5vdCBzZXQgdmFyaWFiaWxpdHkgd2l0aCAnJ3sxfScnIHNpbmNlIGl0IHdpbGwgcmVzdWx0IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kuCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2czPUNhbm5vdCByZXBsYWNlcyBhIHRvcCBwcm9jZXNzIHdpdGggYW4gYWN0aXZpdHkuCi1hY3Rpdml0eV9kZWVwX2NvcHlfdmFyaWFiaWxpdHlfcHJvbXB0PVRoZSBzb3VyY2UgYWN0aXZpdHkgbWlnaHQgaGF2ZSBleHRlcm5hbCBjb250cmlidXRpb25zIG9yIHJlcGxhY2VtZW50cy5cbkRvIHlvdSB3YW50IHRvIGNvcHkgdGhlbSBhcyB3ZWxsP1xuXG5DbGlja2luZyBvbiBObyB3aWxsIGNvcHkgb25seSB0aGUgb3JpZ2luYWwgYWN0aXZpdHkuCi1hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2c9QWN0aXZpdHkgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSAnJ3sxfScnIGFscmVhZHkgaGFzIG9uZSBvciBtb3JlIGNvbnRyaWJ1dGVkL3JlcGxhY2VkIGFjdGl2aXRpZXMgYXMgaXRzIGNoaWxkcmVuLgotdmFyaWFiaWxpdHlfZXJyb3JfbXNnPVZhcmlhYmlsaXR5IGVsZW1lbnQgJyd7MH0nJyBjYW5ub3Qgc2V0IHZhcmlhYmlsaXR5IHdpdGggJyd7MX0nJyBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotY2lyY3VsYXJfZGVwZW5kZW5jeV9lcnJvcl9tc2c9Q2Fubm90IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBzaW5jZSBpdCB3aWxsIHJlc3VsdCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5LgotCi0jIFZhbGlkYXRpb24gbWVzc2FnZXMKLXZhcmlhYmlsaXR5X2VsZW1lbnRfY2lyY3VsYXJfbG9vcF9lcnJvcl9tc2c9Q2lyY3VsYXIgZGVwZW5kZW5jeSBsb29wIGRldGVjdGVkIC4uLiAKLXJlcGxhY2luZ19hbmNlc3Rvcl9lcnJvcl9tc2c9UmVwbGFjaW5nIGFuIGFuY2VzdG9yIGVycm9yIGlzIGRldGVjdGVkLgotY2Fubm90X2NvcHlfb3JfZXh0ZW5kX2RlbGl2ZXJ5X3Byb2Nlc3M9Q2Fubm90IGNvcHkgb3IgZXh0ZW5kIGEgZGVsaXZlcnkgcHJvY2VzcyBvciBhbnkgb2YgaXRzIGFjdGl2aXRpZXMuCi0KLSMgU29ydCBvcHRpb25zCi1Tb3J0VHlwZV9MYWJlbD1Tb3J0IFR5cGU6Ci1Tb3J0VHlwZV9NYW51YWw9TWFudWFsCi1Tb3J0VHlwZV9BbHBoYWJldGljPUFscGhhYmV0aWMKLVNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljPVJldmVyc2UgQWxwaGFiZXRpYwotU29ydFR5cGVfTWV0aG9kVHlwZT1FbGVtZW50IFR5cGUKLQotV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9GSU5JU0hfVE9fU1RBUlQ9RlMKLVdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fRklOSVNIX1RPX0ZJTklTSD1GRgotV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbl9TVEFSVF9UT19GSU5JU0g9U0YKLVdvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fU1RBUlRfVE9fU1RBUlQ9U1MKLWFkZF90b19kZWZhdWx0X2NvbmZpZ19kbGdfdGl0bGU9QWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9TdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1N0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEyZjAwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1N0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHN0cnVjdHVyZWQgbWV0aG9kIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUdyb3VwQ29udGFpbmVyLAotCQlJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByaXZhdGUgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbFN0cnVjdHVyZShNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQl0aGlzLm1vZGVsU3RydWN0ID0gbW9kZWxTdHJ1Y3Q7Ci0JfQotCi0JcHVibGljIE1vZGVsU3RydWN0dXJlIGdldE1vZGVsU3RydWN0dXJlKCkgewotCQlyZXR1cm4gbW9kZWxTdHJ1Y3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ3JvdXBJdGVtUHJvdmlkZXJNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkJCQkoKElEaXNwb3NhYmxlKSBhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAuY2xlYXIoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbnVsbDsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVG5nQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVG5nQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlZDA2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RuZ0FkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pbnRlcm5hbC5UbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci0KLS8qKgotICogVGhlIGZhY3RvcnkgZm9yIGFsbCB0aGUgYWRhcHRlciBmYWN0b3JpZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG5nQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUbmdBZGFwdGVyRmFjdG9yeSBJTlNUQU5DRSA9IFRuZ0FkYXB0ZXJGYWN0b3J5SW1wbC5jcmVhdGVBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBZGFwdGVyRmFjdG9yeVtdIHByb2Nlc3NBZGFwdGVyRmFjdG9yaWVzID0gewotCQlJTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlJTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlJTlNUQU5DRS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQlJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JfTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbXBvc2VkIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIExpYnJhcnkgdmlldy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBMaWJyYXJ5IHZpZXcKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IGZpbHRlcgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIENvbmZpZ3VyYXRpb24gdmlldwotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZS4gQ2xpZW50IGlzCi0JICogcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUuIENsaWVudCBpcwotCSAqIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVRCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25zb2xpZGF0ZWQgQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uc29saWRhdGVkIEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLgotCSAqIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgV29yayBCcmVha2Rvd24gU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1dCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgcHVibGlzaGVkIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZS4KLQkgKiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZhY3RvcnkgZm9yIHB1Ymxpc2hlZCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duCi0JICogU3RydWN0dXJlLiBDbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGRpc3Bvc2luZyBpdCBhZnRlciB1c2UgYnkgY2FsbGluZwotCSAqIHtAbGlua3BsYWluIENvbXBvc2VkQWRhcHRlckZhY3RvcnkjZGlzcG9zZSgpfQotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24KLQkgKiAgICAgICAgIFN0cnVjdHVyZQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgcHVibGlzaGVkIENvbnNvbGlkYXRlZCBCcmVha2Rvd24KLQkgKiBTdHJ1Y3R1cmUuIENsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIGl0IGFmdGVyIHVzZSBieSBjYWxsaW5nCi0JICoge0BsaW5rcGxhaW4gQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCl9Ci0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBwdWJsaXNoZWQgQ29uc29saWRhdGVkIEJyZWFrZG93bgotCSAqICAgICAgICAgU3RydWN0dXJlCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGxpYnJhcnkuCi0JICogQ2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciBkaXNwb3NpbmcgaXQgYWZ0ZXIgdXNlIGJ5IGNhbGxpbmcKLQkgKiB7QGxpbmtwbGFpbiBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKX0KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVMaWJyYXJ5Q29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QKLQkgKiBCcmVha2Rvd24gU3RydWN0dXJlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZWRpdG9yCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZSBlZGl0b3IuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciBXb3JrIFByb2R1Y3QgQnJlYWtkb3duCi0JICogU3RydWN0dXJlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZWRpdG9yCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25zb2xpZGF0ZWQKLQkgKiBCcmVha2Rvd24gU3RydWN0dXJlIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25zb2xpZGF0ZWQgQnJlYWtkb3duIFN0cnVjdHVyZQotCSAqICAgICAgICAgZWRpdG9yCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgQ29uZmlndXJhdGlvbiB2aWV3Ci0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyBhZGFwdGVyIGZhY3RvcnkgZm9yIEl0ZW1zRmlsdGVyIHBhY2thZ2UuIEVpdGhlcgotCSAqIGdldEZpbHRlclZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIG9yCi0JICogZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHNob3VsZCBiZSB1c2VkLiBCb3RoIGNhbiBiZQotCSAqIHVzZWQgYXQgdGhlIHNhbWUgdGltZSBkZXBlbmRzIG9uIHB1cnBvc2UuCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIEdldHMgYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGZpbHRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50IGZpbHRlcgotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGZpbHRlcgotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpOwotCi0JLyoqCi0JICogR2V0cyBhbiBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIuCi0JICogCi0JICogQHBhcmFtIGZpbHRlcgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBmaWx0ZXIKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlCi0JICogICAgICAgICBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNpbmdsZXRvbiBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBUZWFtIEJyZWFrZG93bgotCSAqIFN0cnVjdHVyZSBmaWx0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGZpbHRlcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE9CU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0Ci0JICogQnJlYWtkb3duIFN0cnVjdHVyZSBmaWx0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUKLQkgKiAgICAgICAgIGZpbHRlcgotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaW5nbGV0b24gY29tcG9zZWQgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgaXRlbSBmaWx0ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgaXRlbSBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCk7Ci0KLQkvKioKLQkgKiBSZWxlYXNlcyB1bnVzZWQgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjM2RjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1RyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogSXRlbSBwcm92aWRlciBmb3IgVUkgdHJhbnNpZW50IG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBncm91cC9vcmdhbml6ZQotICogbW9kZWwgb2JqZWN0cyBpbiBhIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElDb25maWd1cmFibGUsIElEZWZhdWx0TmFtZVNldHRlciwKLQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgY2hpbGRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXBhcmVudC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXBhcmVudC5lQWRhcHRlcnMoKS5hZGQodGhpcyk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmIChjaGlsZEZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2hpbGRGaWx0ZXIuYWNjZXB0KG9iaik7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyh0YXJnZXQsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRSZXNvdXJjZUxvY2F0b3IoKQotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsCi0JICogICAgICBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQoZG9tYWluLCAoRU9iamVjdCkgdGFyZ2V0LAotCQkJCWZlYXR1cmUsIHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kOgotCQkvLyBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVBZGRDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbiwgaW50KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGFjY2VwdEFzQ2hpbGQoZWxlbWVudCkpIHsKLQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoZG9tYWluLAotCQkJCShFT2JqZWN0KSB0YXJnZXQsIGZlYXR1cmUsIHNlbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlUmVtb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlUmVtb3ZlQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVSZW1vdmVDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCBjb2xsZWN0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVSZW1vdmVDb21tYW5kOiBjYW4KLQkJLy8gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVNb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZU1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUNvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlTW92ZUNvbW1hbmQoZG9tYWluLCAoRU9iamVjdCkgdGFyZ2V0LAotCQkJCWZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlTW92ZUNvbW1hbmQ6IGNhbgotCQkvLyBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCXJldHVybiBjbWQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJaWYgKGNvbW1hbmRDbGFzcyA9PSBSZW1vdmVDb21tYW5kLmNsYXNzKSB7Ci0JCQljb21tYW5kUGFyYW1ldGVyLnNldE93bmVyKHRhcmdldCk7Ci0JCX0KLQkJQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JCQkJY29tbWFuZFBhcmFtZXRlcik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlQ29tbWFuZDogIiArCi0JCS8vIGNvbW1hbmRDbGFzcyArICIsIGNhbiBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSArICIsIG93bmVyOiAiICsKLQkJLy8gY29tbWFuZFBhcmFtZXRlci5nZXRPd25lcigpICsgIiwgY29sbGVjdGlvbjogIiArCi0JCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0Q29sbGVjdGlvbigpKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNoaWxkcmVuU3RvcmUgc3RvcmUgPSBnZXRDaGlsZHJlblN0b3JlKHRhcmdldCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RvcmUuZ2V0Q2hpbGRyZW4oKTsKLQkJfQotCi0JCXN0b3JlID0gY3JlYXRlQ2hpbGRyZW5TdG9yZSh0YXJnZXQpOwotCQlMaXN0IHJlc3VsdCA9IHN0b3JlICE9IG51bGwgPyBudWxsIDogbmV3IEFycmF5TGlzdCgpOwotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgdGFyZ2V0OwotCi0JCWlmICh0YXJnZXQgPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuRmVhdHVyZXModGFyZ2V0KS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaS5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTsgaW5kZXgrKykgewotCQkJCQlPYmplY3QgY2hpbGQgPSBjaS5uZXh0KCk7Ci0JCQkJCWlmIChhY2NlcHRBc0NoaWxkKGNoaWxkKSkgewotCQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLCBpbmRleCk7Ci0JCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJCQkJCXN0b3JlLmdldExpc3QoZmVhdHVyZSkuYWRkKGNoaWxkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdCBjaGlsZCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLQkJCQkJY2hpbGQgPSB3cmFwKGVPYmplY3QsIGZlYXR1cmUsIGNoaWxkLAotCQkJCQkJCUNvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgpOwotCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJCQkJc3RvcmUuc2V0VmFsdWUoZmVhdHVyZSwgY2hpbGQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdCBjaGlsZHJlbiA9IHN0b3JlICE9IG51bGwgPyBzdG9yZS5nZXRDaGlsZHJlbigpIDogcmVzdWx0OwotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGZsb2F0LCBpbnQsIGludCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJYm9vbGVhbiBjYW5FeGVjID0gdHJ1ZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmICghYWNjZXB0QXNDaGlsZChpdGVyLm5leHQoKSkpIHsKLQkJCQljYW5FeGVjID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJQ29tbWFuZCBjbWQ7Ci0JCWlmIChjYW5FeGVjKSB7Ci0JCQljbWQgPSBzdXBlci5jcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sCi0JCQkJCW9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQljbWQgPSBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlTW92ZUNvbW1hbmQ6IGNhbgotCQkvLyBleGVjdXRlOiAiICsgY21kLmNhbkV4ZWN1dGUoKSk7Ci0JCXJldHVybiBjbWQ7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbXNnKTsKLQotCQkvLyBpZihtc2cuZ2V0Tm90aWZpZXIoKSA9PSB0YXJnZXQpIHsKLQkJLy8gaWYoZmVhdHVyZUlkID09IFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTKSB7Ci0JCS8vIGJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCS8vIHN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkvLyBjYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkvLyBPYmplY3Qgb2JqID0gbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCS8vIG5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJLy8gb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCS8vIG5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJLy8gYnJlYWs7Ci0JCS8vIGNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkvLyBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCS8vIGZvcl9jaGVjazoKLQkJLy8gZm9yKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBpZihhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkvLyBub3RpZnkgPSB0cnVlOwotCQkvLyBicmVhayBmb3JfY2hlY2s7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCS8vIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCS8vIGZvcl9jaGVjazoKLQkJLy8gZm9yKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBpZihhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkvLyBub3RpZnkgPSB0cnVlOwotCQkvLyBicmVhayBmb3JfY2hlY2s7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBicmVhazsKLQkJLy8KLQkJLy8gfQotCQkvLyBpZihub3RpZnkpIHsKLQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsIGZhbHNlKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0Q29uZmlndXJhdGlvbihvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuY2hpbGRGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Gb2xkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVmFyaWFiaWxpdHlJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L1ZhcmlhYmlsaXR5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBlNzQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvVmFyaWFiaWxpdHlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBzdG9yaW5nIHZhcmlhYmlsaXR5IGluZm9ybWF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVmFyaWFiaWxpdHlJbmZvIHsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyOwotCi0JcHJpdmF0ZSBMaXN0IGluaGVyaXRhbmNlTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbnRyaWJ1dG9yczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBhIHZhcmlhYmlsaXR5IGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lcikgewotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3duZXIgb2YgdGhpcyBWYXJpYWJpbGl0eUluZm8gb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG93bmVyIG9mIHRoaXMgVmFyaWFiaWxpdHlJbmZvIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgVmFyaWFiaWxpdHlFbGVtZW50IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVhbGl6ZWQgaW5oZXJpdGFuY2UgbGlzdCBpbiB0aGUgb3JkZXIgZnJvbSB0aGUgcmVzb2x2ZWQgb2JqZWN0Ci0JICogb2YgdGhlIG93bmVyIHRvIHRoZSBpdHMgdG9wIGJhc2UuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEluaGVyaXRhbmNlTGlzdCgpIHsKLQkJaWYgKGluaGVyaXRhbmNlTGlzdCA9PSBudWxsKSB7Ci0JCQlpbmhlcml0YW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGluaGVyaXRhbmNlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCBjb250cmlidXRvciB0bwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb250cmlidXRvcnMoKSB7Ci0JCWlmIChjb250cmlidXRvcnMgPT0gbnVsbCkgewotCQkJY29udHJpYnV0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjb250cmlidXRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2JyZWFrZG93bmVsZW1lbnQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM3YTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmJyZWFrZG93bmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3Igc2thbm5vb3IKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKG9iamVjdCk7Ci0JCXJldHVybiBpbWcgIT0gbnVsbCA/IGltZyA6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9icmVha2Rvd25lbGVtZW50L01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjhkNzlkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvYnJlYWtkb3duZWxlbWVudC9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBza2Fubm9vcgotICoKLSAqLwotcHVibGljIGNsYXNzIE1pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWlsZXN0b25lSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzRiNzVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkN1c3RvbSBDYXRlZ29yaWVzIiBmb2xkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlMaXN0IG15Q2F0ZWdvcmllcyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgb2JqKTsKLQkJCWlmIChteUNhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChteUNhdGVnb3JpZXMuc2l6ZSgpID09IDEpIHsKLQkJCQkvLyByb290IGN1c3RvbSBjYXRlZ29yeSBpcyB1bmRlIHRoZSBoaWRkZW4gcGFja2FnZSBhbmQgd2lsbCBub3QKLQkJCQkvLyBiZSBwcm9jZXNzZWQuCi0JCQkJLy8gbmVlZCB0byBzaG93IHN1YiBjYXRlZ29yaWVzIHVuZGVyIGl0Ci0JCQkJQ3VzdG9tQ2F0ZWdvcnkgYyA9IChDdXN0b21DYXRlZ29yeSkgbXlDYXRlZ29yaWVzLmdldCgwKTsKLQkJCQlpZiAoVG5nVXRpbC5pc1Jvb3RDdXN0b21DYXRlZ29yeShjKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBDdXN0b21DYXRlZ29yeS5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DVVNUT01fQ0FURUdPUlkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmRkZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5FTUZFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ2F0ZWdvcnlTb3J0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjdXN0b20gY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCS8vIHRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdDsKLQkJLy8gaWYoY2F0ZWdvcnkuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gaWYocGFyZW50ICE9IG51bGwpIHsKLQkJLy8gcmV0dXJuIHBhcmVudDsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIGlmKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkvLyAvL2lmKHBsdWdpbiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8JCQkKLQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJLy8gU3RyaW5nW10gcGF0aCA9IHsKLQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpCi0JCS8vICxMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpCi0JCS8vIH07Ci0JCS8vIHJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9Ci0KLQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSk7Ci0JCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9Qcm9jZXNzRWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVJlbW92ZWQoQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJaWYgKEFzc29jaWF0aW9uSGVscGVyLmdldEN1c3RvbUNhdGVnb3JpZXMoY2F0ZWdvcnkpLmlzRW1wdHkoKSkgewotCQkJLy8gcmVtb3ZlIGFsbCBzdWJjYXRlZ29yaWVzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2F0ZWdvcnkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUVjb3JlVXRpbC5yZW1vdmUoY2F0ZWdvcnkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJQ29udGVudFBhY2thZ2UgcGtnOwotCQkvLyBib29sZWFuIHJlZnJlc2hDdXN0b21DYXRlZ29yeVJvb3QgPSBmYWxzZTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEN1c3RvbUNhdGVnb3J5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkvL2ZvciBlcGYgZGVmZWN0OjE3NDA0MwotCQkJaWYoIVRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KW5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSl7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IE1ldGhvZEVsZW1lbnRVdGlsLmdldE1ldGhvZE1vZGVsKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQlpZihwbHVnaW4gIT1udWxsKXsKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdCA9IFRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHBsdWdpbik7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCByb290LCB0cnVlLCBmYWxzZSkpOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJYnJlYWs7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXBrZyA9IChDb250ZW50UGFja2FnZSkgKChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWlmICgocGtnICE9IG51bGwpCi0JCQkJCSYmIChNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FCi0JCQkJCQkJLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkpIHsKLQkJCQkvLyBub3RpZmllciBpcyB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJCQkvLwotCQkJCXBrZyA9IChDb250ZW50UGFja2FnZSkgcGtnLmVDb250YWluZXIoKTsKLQkJCX0KLQkJCU9iamVjdCBvYmo7Ci0JCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeTsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCWNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmo7Ci0JCQkJCWlmIChjYXRlZ29yeS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChjYXRlZ29yeSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyByZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCW9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJCWNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSBvYmo7Ci0JCQkJCQlpZiAoY2F0ZWdvcnkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNhdGVnb3J5KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gcmVmcmVzaEN1c3RvbUNhdGVnb3J5Um9vdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkJCi0JCQkJLy8gcmVtb3Zpbmcgc3ViY2F0ZWdvcmllcyBpcyBoYW5kbGVkIGJ5IHRoZSByZW1vdmUgY29tbWFuZAotCQkJCS8vCi0vLwkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLS8vCQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotLy8JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQkJaGFuZGxlUmVtb3ZlZCgoQ3VzdG9tQ2F0ZWdvcnkpIG9iaik7Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKQotLy8JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJb2JqID0gaXRlci5uZXh0KCk7Ci0vLwkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0vLwkJCQkJCWhhbmRsZVJlbW92ZWQoKEN1c3RvbUNhdGVnb3J5KSBvYmopOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCi0JCQkvLyAvLyByZWZyZXNoIHdyYXBwZXJzCi0JCQkvLyAvLwotCQkJLy8gaWYod3JhcHBlcnMgIT0gbnVsbCkgewotCQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdCh3cmFwcGVycykuaXRlcmF0b3IoKTsKLQkJCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy8gZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkvLyBpdGVyLm5leHQoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vCQkJCi0JCQkvLyBpZihyZWZyZXNoQ3VzdG9tQ2F0ZWdvcnlSb290KSB7Ci0JCQkvLyAvLyBzdWIgY2F0ZWdvcnkgaGFzIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBjdXN0b20KLQkJCS8vIGNhdGVnb3J5Ci0JCQkvLyAvLyBuZWVkIHRvIHJlZnJlc2ggdGhlIGZvbGRlciBmb3IgYWxsIGN1c3RvbSBjYXRlZ29yaWVzCi0JCQkvLyAvLwotCQkJLy8gTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpOwotCQkJLy8JCQkJCi0JCQkvLyBpZihwbHVnaW4gIT0gbnVsbCkgewotCQkJLy8gU3RyaW5nW10gcGF0aCA9IHsKLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKQotCQkJLy8gLExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0N1c3RvbV9DYXRlZ29yaWVzX2dyb3VwIikKLQkJCS8vIH07Ci0JCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpLCB0cnVlLCBmYWxzZSkpOwotCQkJLy8gfQotCQkJLy8gfQotCi0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdDsKLQkJcmV0dXJuICFjYXRlZ29yeS5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuaXNFbXB0eSgpCi0JCS8vIHx8ICFjYXRlZ29yeS5nZXRTdWJDYXRlZ29yaWVzKCkuaXNFbXB0eSgpCi0JCTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCVN0cmluZyBjY05hbWUgPSAoKEN1c3RvbUNhdGVnb3J5KW9iaikuZ2V0TmFtZSgpOwotCQkJaWYgKGNjTmFtZSA9PSBudWxsIHx8IGNjTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NVU1RPTV9DQVRFR09SWTsKLQkJCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKChDdXN0b21DYXRlZ29yeSkgcGFyZW50LCAoQ3VzdG9tQ2F0ZWdvcnkpIG9iaiwgYmFzZU5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIEN1c3RvbUNhdGVnb3J5LmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJQ29sbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCS8vIGNoZWNrIGN1c3RvbSBjYXRlZ29yeSBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCQkJCS8vCi0JCQkJaWYgKCEob3duZXIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYgVG5nVXRpbAotCQkJCQkJLmlzQW5jZXNzb3JPZigoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW1lbnQsCi0JCQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG93bmVyKSkpIHsKLQkJCQkJc2VsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVSZW1vdmVDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVSZW1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gc3VwZXIuY3JlYXRlUmVtb3ZlQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKFRuZ1V0aWwuaXNSb290Q3VzdG9tQ2F0ZWdvcnkoKEN1c3RvbUNhdGVnb3J5KSBvYmplY3QpKQotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkgIT0gbnVsbCkgewotCQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCQkoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpKTsKLQkJCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIGRvIG5vdGhpbmcsIGFscmVhZHkgaGFuZGxlZCBieSBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24pCi0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYoY2hhbmdlTm90aWZpZXIgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgY2hhbmdlTm90aWZpZXIpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZihUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSlvYmplY3QpKXsKLQkJCUxpc3Qgc29ydExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzb3J0TGlzdC5hZGRBbGwoY29sKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoc29ydExpc3QsIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJCXJldHVybiBzb3J0TGlzdDsKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlMaXN0IHNvcnRMaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKChNZXRob2RFbGVtZW50KW9iamVjdCwgY29sLnRvQXJyYXkoKSk7Ci0JCQlyZXR1cm4gc29ydExpc3Q7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyM2Q4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkRpc2NpcGxpbmVzIiBmb2xkZXIuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIERpc2NpcGxpbmVzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyI2lzSW5oZXJpdGVkKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5oZXJpdGVkKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gKGNhdGVnb3J5IGluc3RhbmNlb2YgRGlzY2lwbGluZSB8fCBjYXRlZ29yeSBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykKLQkJCQkmJiBjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJTGlzdCBncm91cHMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBvYmopOwotCQkJaWYgKGdyb3Vwcy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChPYmplY3QgZ3JvdXAgOiBncm91cHMpIHsKLQkJCQkJaWYgKGdyb3VwIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQkJCQlpZiAoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKERpc2NpcGxpbmVHcm91cGluZylncm91cCkgPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKERpc2NpcGxpbmUpb2JqKSkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJRGlzY2lwbGluZSBjaGlsZCA9IChEaXNjaXBsaW5lKSBlbGVtZW50OwotCQkJCURpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKERpc2NpcGxpbmVJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgRGlzY2lwbGluZS5jbGFzcyksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORV9HUk9VUElORyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjljNmIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5FTUZFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZGlzY2lwbGluZSBncm91cGluZy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvYmplY3QpOwotCQkvLyBpZihtb2RlbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8gSUdyb3VwQ29udGFpbmVyIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBJR3JvdXBDb250YWluZXIuY2xhc3MpOwotCQkvLyBpZihncm91cENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCS8vIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gZ3JvdXBDb250YWluZXIuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpKTsKLQkJLy8gcmV0dXJuCi0JCS8vIGdyb3VwQ29udGFpbmVyLmdldEdyb3VwSXRlbVByb3ZpZGVyKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOwotCQkvLyB9Ci0JCS8vIC8vIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RNb2RlbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCS8vIC8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXMoKTsKLQkJLy8gLy8gfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kLkhlbHBlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlICYmIGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgZmVhdHVyZTsKLQkJCUVDbGFzcyBwYXJlbnRDbGFzcyA9IHJlZmVyZW5jZS5nZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQlFQ2xhc3MgY2hpbGRDbGFzcyA9ICgoRU9iamVjdCkgY2hpbGQpLmVDbGFzcygpOwotCQkJU3RyaW5nIG5hbWUgPSAiZnVsbC9jdG9vbDE2L0NyZWF0ZSIgKyBwYXJlbnRDbGFzcy5nZXROYW1lKCkgKyAiXyIgKyByZWZlcmVuY2UuZ2V0TmFtZSgpICsgIl8iICsgY2hpbGRDbGFzcy5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl0cnkgewotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShuYW1lKTsKLQkJCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFTUZFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL2N0b29sMTYvQ3JlYXRlQ2hpbGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJLy8gU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCS8vIGdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIikpOwotCQkvLyBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0KLQkJLy8gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJLy8gaWYoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIGxhYmVsID0gbGFiZWwgKyAiIChpbmhlcml0ZWQgZnJvbSAiICsgYmFzZVBsdWdpbi5nZXROYW1lKCkgKyAnKSc7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vIGNvbW1lbnRpbmcgYmVsb3csIHVzZWZ1bCBmb3Igc3RhdGVmdWwgaXRlbXByb3ZpZGVyLgotCQkvL1RuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJCi0JCS8vIEZvciBzdGF0ZWxlc3MgaXRlbXByb3ZpZGVyLCBuZWVkIHRoaXMuCi0JCXNldERlZmF1bHROYW1lKG5vdGlmaWNhdGlvbik7Ci0JCQotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCURpc2NpcGxpbmUgZGlzY2lwbGluZTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmVHcm91cGluZy5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkVTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQotCQkJYm9vbGVhbiByZWZyZXNoUGFyZW50ID0gZmFsc2U7Ci0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCWRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkaXNjaXBsaW5lKTsKLQkJCQl9IGVsc2UgaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZGlzY2lwbGluZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJcGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChkaXNjaXBsaW5lKTsKLQkJCQkJfSBlbHNlIGlmIChkaXNjaXBsaW5lLmVDb250YWluZXIoKSA9PSBwa2cpIHsKLQkJCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocmVmcmVzaFBhcmVudCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZ2V0UGFyZW50KHRhcmdldCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlpZiAoIWlzV3JhcHBpbmdOZWVkZWQob2JqZWN0KSkKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIFRuZ1V0aWwuY3JlYXRlV3JhcHBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCk7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBEaXNjaXBsaW5lIGNoaWxkID0gKERpc2NpcGxpbmUpIGl0ZXIubmV4dCgpOwotCS8vIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKERpc2NpcGxpbmVJdGVtUHJvdmlkZXIpCi0JLy8gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JLy8gaXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCS8vIH0KLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTm90aWZpY2F0aW9uIG1zZykgewotCQlJRGVmYXVsdE5hbWVTZXR0ZXIgZGVmYXVsdE5hbWVTZXR0ZXIgPSB0aGlzOwotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCS8vIE1ha2luZyBwbHVnaW4gbGV2ZWwgdW5pcXVlbmVzcyBvZiBkaXNjaXBsaW5lLCBvbiByZW1vdmluZyBkaXNjaXBsaW5lIHJlZmVyZW5jZSAKLQkJCS8vIGZyb20gZGlzY2lwbGluZSBncm91cGluZywgZGlzY2lwbGluZSBnb2VzIGJhY2sgdG8gdG9wbGV2ZWwgY2F1c2luZyBkdXBsaWNhdGUuIAotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoCi0JCQkJCSgoQ29udGVudFBhY2thZ2UpICgoKERpc2NpcGxpbmVHcm91cGluZykgcGFyZW50KQotCQkJCQkJCS5lQ29udGFpbmVyKCkpKS5nZXRDb250ZW50RWxlbWVudHMoKSwKLQkJCQkJRGlzY2lwbGluZS5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ESVNDSVBMSU5FKTsKLQkJfQotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0RJU0NJUExJTkU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEaXNjaXBsaW5lR3JvdXBpbmcpIHRhcmdldCkKLQkJCQkJLmdldERpc2NpcGxpbmVzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTU4MmNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciwgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJaWYgKHBhcmVudCAhPSBudWxsKQotLy8JCQlyZXR1cm4gcGFyZW50OwotLy8JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpb2JqZWN0OwotCQlpZihkaXNjaXBsaW5lLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpewotCQkJcGFyZW50ID0gIHN1cGVyLmdldFBhcmVudChkaXNjaXBsaW5lKTsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJCi0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRpc2NpcGxpbmUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQksCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCX07Ci0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihtb2RlbCwgcGF0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNjaXBsaW5lKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvL3JldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlpZihjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUodGhpcywgbm90aWZpY2F0aW9uKTsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQkvLyByZWZyZXNoIHVuY2F0ZWdvcml6ZWQgdGFza3MgZm9sZGVyCi0JCQkvLyBUbmdVdGlsLnJlZnJlc2hBZGFwdGVyKExpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfVEFTS1NfUEFUSCwKLQkJCS8vIG5vdGlmaWNhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsJCQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJCQotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCkgewotCQlpZihjaGFuZ2VOb3RpZmllciBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBjaGFuZ2VOb3RpZmllcik7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2hhc0NoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIChjb21tZW50ZWQgZm9yIHRoaXMgZGVmZWN0KQotCQkvLyByZXR1cm4gISgoRGlzY2lwbGluZSkgb2JqZWN0KS5nZXRUYXNrcygpLmlzRW1wdHkoKTsKLQkJLy9yZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdXBlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJLy8gcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkKLQkJLy8gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCQkvL3JldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gVW5leGVjdXRhYmxlQ29tbWFuZC5JTlNUQU5DRTsKLQkJfQotCi0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBEaXNjaXBsaW5lLmNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRElTQ0lQTElORTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKERpc2NpcGxpbmUpIHRhcmdldCkuZ2V0U3ViZGlzY2lwbGluZSgpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCS8vcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ZhODc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EaXNwb3NhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZG9tYWluLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRvbWFpbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlEZWZhdWx0TmFtZVNldHRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWlucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgb2JqZWN0OwotCQlpZiAoZG9tYWluLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRvbWFpbik7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCSwKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Eb21haW5zX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQl9OwotCi0JCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIobW9kZWwsIHBhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX0RvbWFpbl90eXBlIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCi0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG9tYWluLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0KQotCQkJQ29sbGVjdGlvbnMuc29ydCgoTGlzdCkgY2hpbGRyZW4sIFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UKLQkJCQkJLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVXcmFwcGVycyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJaWYgKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCXdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmZpbGwod3JhcHBlcnMsIG51bGwsIG9iamVjdHMsIHRoaXMsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3Qod3JhcHBlcnMpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ET01BSU47Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEb21haW4pIHBhcmVudCkKLQkJCQkJLmdldFN1YmRvbWFpbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ET01BSU47Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChEb21haW4pIHRhcmdldCkuZ2V0U3ViZG9tYWlucygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBEb21haW4uY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJCXNlbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvRG9tYWluc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTgzZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Eb21haW5zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiRG9tYWlucyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5zSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERvbWFpbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCB0YXJnZXQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlRG9tYWluKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBEb21haW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBEb21haW4uY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRE9NQUlOKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZDdmMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LkVNRkVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSByb2xlIHNldCBncm91cGluZy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIGNoaWxkcmVuOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldENhdGVnb3J5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGVTZXQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZE1vZGVsSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RNb2RlbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRBZGFwdGVyKChFT2JqZWN0KW1vZGVsLCBNZXRob2RNb2RlbEl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCS8vIGlmKGl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0Um9sZVNldHMoKTsKLQkJLy8gfQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZC5IZWxwZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiBjaGlsZCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVSZWZlcmVuY2UgcmVmZXJlbmNlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQlFQ2xhc3MgcGFyZW50Q2xhc3MgPSByZWZlcmVuY2UuZ2V0RUNvbnRhaW5pbmdDbGFzcygpOwotCQkJRUNsYXNzIGNoaWxkQ2xhc3MgPSAoKEVPYmplY3QpIGNoaWxkKS5lQ2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gImZ1bGwvY3Rvb2wxNi9DcmVhdGUiICsgcGFyZW50Q2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcmVmZXJlbmNlLmdldE5hbWUoKSArICJfIiArIGNoaWxkQ2xhc3MuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UobmFtZSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gRU1GRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUNoaWxkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gU3RyaW5nIGxhYmVsID0gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsCi0JCS8vIGdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikpOwotCQkvLyBDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KSBvYmplY3Q7Ci0JCS8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBiYXNlUGx1Z2luID0KLQkJLy8gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJLy8gaWYoYmFzZVBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIGxhYmVsID0gbGFiZWwgKyAiIChpbmhlcml0ZWQgZnJvbSAiICsgYmFzZVBsdWdpbi5nZXROYW1lKCkgKyAnKSc7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyByZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2hpbGRyZW4oTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCS8vIEVPYmplY3Qgb2JqZWN0ID0gKEVPYmplY3Qpbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JLy8gQ2hpbGRyZW5TdG9yZSBjaGlsZHJlblN0b3JlID0gZ2V0Q2hpbGRyZW5TdG9yZShvYmplY3QpOwotCS8vCQkKLQkvLyBpZiAoY2hpbGRyZW5TdG9yZSAhPSBudWxsKQotCS8vIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9Ci0JLy8gKEVTdHJ1Y3R1cmFsRmVhdHVyZSlub3RpZmljYXRpb24uZ2V0RmVhdHVyZSgpOwotCS8vIEVMaXN0IGNoaWxkcmVuID0gY2hpbGRyZW5TdG9yZS5nZXRMaXN0KGZlYXR1cmUpOwotCS8vIGlmIChjaGlsZHJlbiAhPSBudWxsKQotCS8vIHsKLQkvLyBpbnQgaW5kZXggPSBub3RpZmljYXRpb24uZ2V0UG9zaXRpb24oKTsKLQkvLwkJCQkKLQkvLyBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSkKLQkvLyB7Ci0JLy8gY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCS8vIHsKLQkvLyBFTGlzdCB2YWx1ZXMgPSAoRUxpc3Qpb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JLy8JCQkJCQkKLQkvLyBpZiAodmFsdWVzLnNpemUoKSA9PSAwKQotCS8vIHsKLQkvLyBkaXNwb3NlV3JhcHBlcnMoY2hpbGRyZW4pOwotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vCQkKLQkvLyBzdXBlci51cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlDb250ZW50UGFja2FnZSBwa2c7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlU2V0R3JvdXBpbmcuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCi0JCQlwa2cgPSAoQ29udGVudFBhY2thZ2UpICgoRU9iamVjdCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlSb2xlU2V0IHJvbGVTZXQ7Ci0JCQlib29sZWFuIHJlZnJlc2hQYXJlbnQgPSBmYWxzZTsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJcm9sZVNldCA9IChSb2xlU2V0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCQlpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCX0gZWxzZSBpZiAocm9sZVNldC5lQ29udGFpbmVyKCkgPT0gcGtnKSB7Ci0JCQkJCXJlZnJlc2hQYXJlbnQgPSB0cnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXJvbGVTZXQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChyb2xlU2V0LmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKHJvbGVTZXQpOwotCQkJCQl9IGVsc2UgaWYgKHJvbGVTZXQuZUNvbnRhaW5lcigpID09IHBrZykgewotCQkJCQkJcmVmcmVzaFBhcmVudCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQlyZWZyZXNoUGFyZW50ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlpZiAocmVmcmVzaFBhcmVudCkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZ2V0UGFyZW50KHRhcmdldCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIFJvbGVTZXQgY2hpbGQgPSAoUm9sZVNldCkgaXRlci5uZXh0KCk7Ci0JCS8vIFJvbGVTZXRJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKFJvbGVTZXRJdGVtUHJvdmlkZXIpCi0JCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQkJaWYgKGNoaWxkcmVuIGluc3RhbmNlb2YgTGlzdCkKLQkJCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCQkvLyByZXR1cm4gY3JlYXRlV3JhcHBlcnMoY2hpbGRyZW4pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8vIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlV3JhcHBlcihPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gT2JqZWN0IHdyYXBwZXIgPSBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIChFT2JqZWN0KSB0YXJnZXQsCi0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksIG9iamVjdCwgLTEpOwotCS8vIGlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkvLyB3cmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JLy8gfQotCS8vIHdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQkvLyByZXR1cm4gd3JhcHBlcjsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVXcmFwcGVycyhDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyLmZpbGwoY2hpbGRyZW4sIG51bGwsIG9iamVjdHMsIHRhcmdldCwKLQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyID0gdGhpczsKLQkJaWYgKGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpICE9IG51bGwpIHsKLQkJCWludCBmZWF0dXJlSWQgPSBtc2cuZ2V0RmVhdHVyZUlEKGRlZmF1bHROYW1lU2V0dGVyCi0JCQkJCS5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IGRlZmF1bHROYW1lU2V0dGVyLmdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSkgewotCQkJCXN3aXRjaCAobXNnLmdldEV2ZW50VHlwZSgpKSB7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQlzZXREZWZhdWx0TmFtZShtc2cuZ2V0TmV3VmFsdWUoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlzZXREZWZhdWx0TmFtZShpdGVyLm5leHQoKSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqLCBPYmplY3QgcGFyZW50KSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJLy8gTWFraW5nIHBsdWdpbiBsZXZlbCB1bmlxdWVuZXNzIG9mIHJvbGVzZXQsIG9uIHJlbW92aW5nIHJvbGVzZXQgcmVmZXJlbmNlIAotCQkJLy8gZnJvbSByb2xlc2V0IGdyb3VwaW5nLCByb2xlc2V0IGdvZXMgYmFjayB0byB0b3BsZXZlbCBjYXVzaW5nIGR1cGxpY2F0ZS4gCi0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgKLQkJCQkJKChDb250ZW50UGFja2FnZSkgKCgoUm9sZVNldEdyb3VwaW5nKSBwYXJlbnQpCi0JCQkJCQkJLmVDb250YWluZXIoKSkpLmdldENvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCVJvbGVTZXQuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUk9MRV9TRVQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKFJvbGVTZXRHcm91cGluZykgdGFyZ2V0KS5nZXRSb2xlU2V0cygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gUm9sZVNldEdyb3VwaW5nLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNmJlZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUgc2V0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlU2V0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZVNldEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCX07Ci0KLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlU2V0LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCS8vIHJlZnJlc2ggd3JhcHBlcnMKLQkJCS8vCi0JCQlpZiAod3JhcHBlcnMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qod3JhcHBlcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBpdGVyCi0JCQkJCQkJLm5leHQoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlZnJlc2ggdW5jYXRlZ29yaXplZCByb2xlcwotCQkJLy8KLQkJCS8vIFRuZ1V0aWwucmVmcmVzaEFkYXB0ZXIoTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9ST0xFU19QQVRILAotCQkJLy8gbm90aWZpY2F0aW9uKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vdGlmeUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmKGNoYW5nZU5vdGlmaWVyIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGNoYW5nZU5vdGlmaWVyKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkKLQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JLy8gQWRkIGJlbG93IG1ldGhvZCB0byBhdm9pZCBjaGlsZHJlbiBmb3IgdGhpcyBJdGVtUHJvdmlkZXIuICsKLQkvLyBzaWduIHRvby4KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIExpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIG9iamVjdDsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlU2V0LmdldFJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gUm9sZSByb2xlID0gKFJvbGUpIGl0ZXIubmV4dCgpOwotCS8vIC8vIGxvb2sgaWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgT2JqZWN0TGlua0l0ZW1Qcm92aWRlciBmb3IgdGhpcyB0YXNrIGluCi0JLy8gdGhlIGN1cnJlbnQgY2hpbGRyZW4gbGlzdCBmaXJzdAotCS8vIC8vCi0JLy8gT2JqZWN0TGlua0l0ZW1Qcm92aWRlciBjaGlsZCA9IGZpbmRFeGlzdGluZ09iamVjdExpbmtJdGVtUHJvdmlkZXIocm9sZSk7Ci0JLy8gaWYoY2hpbGQgPT0gbnVsbCkgewotCS8vIGNoaWxkID0gbmV3IE9iamVjdExpbmtJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgcm9sZSk7Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIGNoaWxkcmVuLnJlbW92ZShjaGlsZCk7Ci0JLy8gfQotCS8vIG5ld0NoaWxkcmVuLmFkZChjaGlsZCk7Ci0JLy8gfQotCS8vIC8vIGRpc3Bvc2UgdGhlIG9sZCBjaGlsZHJlbgotCS8vIC8vCi0JLy8gaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIgY2hpbGQgPSAoT2JqZWN0TGlua0l0ZW1Qcm92aWRlcikgaXRlci5uZXh0KCk7Ci0JLy8gY2hpbGQuZGlzcG9zZSgpOwotCS8vIH0KLQkvLyB9Ci0JLy8gY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjsKLQkvLyByZXR1cm4gY2hpbGRyZW47Ci0JLy8gfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQkvLyByZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKQotCQkvLyBzdXBlci5jcmVhdGVBZGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0c0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Sb2xlU2V0c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA4ZTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvUm9sZVNldHNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGUgU2V0cyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0c0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlU2V0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5UcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIjaXNJbmhlcml0ZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbmhlcml0ZWQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcgfHwgY2F0ZWdvcnkgaW5zdGFuY2VvZiBSb2xlU2V0KQotCQkJCSYmIGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZVNldCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlMaXN0IGdyb3VwcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJvbGVTZXRHcm91cHMoKFJvbGVTZXQpIG9iaik7Ci0JCQlpZiAoZ3JvdXBzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKE9iamVjdCBncm91cCA6IGdyb3VwcykgewotCQkJCQlpZiAoZ3JvdXAgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCQkJCWlmIChVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoUm9sZVNldEdyb3VwaW5nKWdyb3VwKSA9PSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoUm9sZVNldClvYmopKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAgc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEVfU0VUX0dST1VQSU5HKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKFRuZ1V0aWwuZXh0cmFjdCgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgUm9sZVNldC5jbGFzcyksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ST0xFX1NFVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1N0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZmNTMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlN0YW5kYXJkIENhdGVnb3JpZXMiIGZvbGRlci4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJR3JvdXBDb250YWluZXIgewotCi0JcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXB1YmxpYyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1N0YW5kYXJkQ2F0ZWdvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcyk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCS8vIGlmKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCS8vIFRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSl0YXJnZXQpLmdldENoaWxkUGFja2FnZXMoKSwKLQkJLy8gKE1ldGhvZEVsZW1lbnQpIG9iaiwgIk5ldyBDb250ZW50IFBhY2thZ2UiKTsKLQkJLy8gfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlJTGlicmFyeUl0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJLy8gY3JlYXRlIHRoZSBkaXNjaXBsaW5lcyBjYXRlZ29yaWVzIGZvbGRlcgotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkgKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmplY3QpCi0JCQkJCQkJLmdldFRhcmdldCgpKTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBkb21haW4gY2F0ZWdvcmllcyBmb2xkZXIKLQkJCWNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQlpZiAoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2hpbGQgPSBuZXcgRG9tYWluc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkJCW5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSB3b3JrIHByb2R1Y3QgdHlwZXMgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCQkJaWYgKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQljb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgcm9sZSBzZXQgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFJvbGVTZXRzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCQkJbmFtZSk7Ci0JCQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCX0KLQotCQkJLy8gY3JlYXRlIHRvb2wgZm9sZGVyCi0JCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNoaWxkID0gbmV3IFRvb2xzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzZjQzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgYSB0b29sLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSXRlbVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Ub29sSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSBvYmplY3QpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcGF0aCA9IHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQksCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Ub29sc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQl9OwotCi0JCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUb29sX1Rvb2xNZW50b3JzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERpc2NpcGxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaENvbnRyaWJ1dG9ycyh0aGlzLCBub3RpZmljYXRpb24sIGZhbHNlLCB0cnVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1dyYXBwaW5nTmVlZGVkKG9iamVjdCkpCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCXJldHVybiBUbmdVdGlsLmNyZWF0ZVdyYXBwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUsCi0JCQkJaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1Rvb2xzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjM0ODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Ub29sc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJUb29scyIgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sc0l0ZW1Qcm92aWRlciBleHRlbmRzIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUb29sc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIHRhcmdldCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHRhcmdldCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUb29sKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVG9vbHMiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gVG9vbCBjaGlsZCA9IChUb29sKSBpdGVyLm5leHQoKTsKLQkJLy8gVG9vbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoVG9vbEl0ZW1Qcm92aWRlcikKLQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNoaWxkLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuc2V0UGFyZW50KG9iamVjdCk7Ci0JCS8vIH0KLQotCQkvLyBDaGFuZ2UgQ2F0ZWdvcmllcyBkaXNwbGF5IGluIExpYnJhcnkgTmF2aWdhdG9yCi0JCS8vIChjb21tZW50ZWQgZm9yIHRoaXMgZGVmZWN0KQotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVsZW1lbnQpCi0JCS8vICgoSXRlbVByb3ZpZGVyQWRhcHRlcilvYmplY3QpLmdldFRhcmdldCgpKTsKLQkJLy8gQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJLy8gVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyIHVuY2F0ZWdvcml6ZWQgPSBuZXcKLQkJLy8gVW5jYXRlZ29yaXplZFRvb2xNZW50b3JzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb3JlQ29udGVudFBrZyk7Ci0JCS8vIGNoaWxkcmVuLmFkZCh1bmNhdGVnb3JpemVkKTsKLQkJLy8gaWYoZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPT0gbnVsbCkgewotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCS8vIH0KLQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KHVuY2F0ZWdvcml6ZWQuZ2V0VGV4dChudWxsKSwgdW5jYXRlZ29yaXplZCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgVG9vbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShUbmdVdGlsLmV4dHJhY3QoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIFRvb2wuY2xhc3MpLCAoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVE9PTCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1RyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzcyODlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSBjYXRlZ29yeSBmb2xkZXJzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJR3JvdXBDb250YWluZXIgewotCi0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlPYmplY3QgdW5jYXRlZ29yaXplZCA9IGNyZWF0ZVVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoKTsKLQkJaWYgKHVuY2F0ZWdvcml6ZWQgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uYWRkKHVuY2F0ZWdvcml6ZWQpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAobm90aWZ5KSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCB0aGlzLCB0cnVlLAotCQkJCQkJCWZhbHNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaGVyaXRlZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGFjY2VwdEFzQ2hpbGQoY2F0ZWdvcnkpCi0JCQkJJiYgY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBDb250ZW50UGFja2FnZS5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jYXRlZ29yeS9Xb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkZDljMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHdvcmsgcHJvZHVjdCBraW5kLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBXb3JrUHJvZHVjdEtpbmRJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJV3JhcHBlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCVN0cmluZ1tdIHBhdGggPSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSwKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQkJfTsKLQotCQkJCXJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkJVG5nVXRpbC5yZWZyZXNoQ29udHJpYnV0b3JzKHRoaXMsIG5vdGlmaWNhdGlvbiwgZmFsc2UsIHRydWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QsCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmICghaXNXcmFwcGluZ05lZWRlZChvYmplY3QpKQotCQkJcmV0dXJuIHZhbHVlOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIG5ldyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKGZlYXR1cmUsIHZhbHVlLCBvYmplY3QsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gVG5nVXRpbC5jcmVhdGVXcmFwcGVyKGFkYXB0ZXJGYWN0b3J5LCBvYmplY3QsIGZlYXR1cmUsIHZhbHVlLAotCQkJCWluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gcmV0dXJuICEoKFdvcmtQcm9kdWN0VHlwZSkgb2JqZWN0KS5nZXRXb3JrUHJvZHVjdHMoKS5pc0VtcHR5KCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciN3cmFwKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgd3JhcChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQlyZXR1cm4gc3VwZXIud3JhcChvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBkZTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIldvcmsgUHJvZHVjdCBLaW5kcyIgZm9sZGVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBXb3JrUHJvZHVjdEtpbmRzSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29udGVudFBhY2thZ2UgdGFyZ2V0LCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgdGFyZ2V0LCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gV29ya1Byb2R1Y3RUeXBlIGNoaWxkID0gKFdvcmtQcm9kdWN0VHlwZSkgaXRlci5uZXh0KCk7Ci0JCS8vIFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPQotCQkvLyAoV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKQotCQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkuYWRhcHQoY2hpbGQsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJLy8gfQotCi0JCS8vIENoYW5nZSBDYXRlZ29yaWVzIGRpc3BsYXkgaW4gTGlicmFyeSBOYXZpZ2F0b3IKLQkJLy8gKGNvbW1lbnRlZCBmb3IgdGhpcyBkZWZlY3QpCi0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkKLQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKW9iamVjdCkuZ2V0VGFyZ2V0KCkpOwotCQkvLyBDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkvLyBXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgdW5jYXRlZ29yaXplZCA9Ci0JCS8vIG5ldwotCQkvLyBXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCS8vIGNvcmVDb250ZW50UGtnKTsKLQkJLy8gY2hpbGRyZW4uYWRkKHVuY2F0ZWdvcml6ZWQpOwotCQkvLyBpZihncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKSB7Ci0JCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gfQotCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQodW5jYXRlZ29yaXplZC5nZXRUZXh0KG51bGwpLCB1bmNhdGVnb3JpemVkKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoVG5nVXRpbC5leHRyYWN0KCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfV09SS19QUk9EVUNUX1RZUEUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NhdGVnb3J5L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc2YjJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY2F0ZWdvcnkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZGlzcGxheSBhbmQgZWRpdGluZyBzdXBwb3J0IGZvciBzdGFuZGFyZCBhbmQgY3VzdG9tIGNhdGVnb3JpZXMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9BY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTM3OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuU2V0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgZXhlY3V0aW9uIG9mIGVkaXRpbmcgY29tbWFuZHMgd2l0aCBmdWxsIHN1cHBvcnQgZm9yIGRpcnR5IGZsYWcsCi0gKiB1bmRvIGFuZCByZWRvLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIElBY3Rpb25NYW5hZ2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwcml2YXRlIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2s7Ci0KLQlwdWJsaWMgQWN0aW9uTWFuYWdlcigpIHsKLQkJY29tbWFuZFN0YWNrID0gY3JlYXRlQ29tbWFuZFN0YWNrKCk7Ci0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrIGNyZWF0ZUNvbW1hbmRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2sodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyT2YoRU9iamVjdCBvYmplY3QpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZWdpc3RlckFzTW9kaWZpZXJPZihyZXNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyT2YoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3luY2hyb25pemVkIChSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQKSB7Ci0JCQlTZXQgbW9kcyA9IChTZXQpIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZ2V0KHJlc291cmNlKTsKLQkJCWlmIChtb2RzID09IG51bGwpIHsKLQkJCQltb2RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLnB1dChyZXNvdXJjZSwgbW9kcyk7Ci0JCQl9Ci0JCQltb2RzLmFkZCh0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJBc01vZGlmaWVyKCkgewotCQlzeW5jaHJvbml6ZWQgKFJFU09VUkNFX1RPX01PRElGSUVSU19NQVApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlTZXQgbW9kcyA9IChTZXQpIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAuZ2V0KHJlc291cmNlKTsKLQkJCQlpZiAobW9kcyAhPSBudWxsKSB7Ci0JCQkJCW1vZHMucmVtb3ZlKHRoaXMpOwotCQkJCQlpZiAobW9kcy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIHNhdmUgdGhlIHJlc291cmNlIGJlZm9yZSBpdCByZW1vdmVkIGZyb20KLQkJCQkJCS8vIFJFU09VUkNFX1RPX01PRElGSUVSU19NQVAKLQkJCQkJCS8vIAotCQkJCQkJc2F2ZShyZXNvdXJjZSk7Ci0JCQkJCQlSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQ29tbWFuZCBjbWQgPSBudWxsOwotCQlPYmplY3Qgb2xkVmFsdWUgPSBudWxsOwotCQlzd2l0Y2ggKGFjdGlvblR5cGUpIHsKLQkJY2FzZSBBREQ6IHsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCWluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJY21kID0gbmV3IEFkZENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIEFERF9NQU5ZOiB7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCQkJCWNtZCA9IG5ldyBBZGRDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwKLQkJCQkJCShDb2xsZWN0aW9uKSB2YWx1ZSwgaW5kZXgpOwotCQkJfSBlbHNlIHsKLQkJCQljbWQgPSBuZXcgQWRkQ29tbWFuZChlZGl0aW5nRG9tYWluLCBvYmplY3QsIGZlYXR1cmUsCi0JCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSRU1PVkU6IHsKLQkJCWNtZCA9IG5ldyBSZW1vdmVDb21tYW5kKGVkaXRpbmdEb21haW4sIG9iamVjdCwgZmVhdHVyZSwgdmFsdWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBSRU1PVkVfTUFOWTogewotCQkJY21kID0gbmV3IFJlbW92ZUNvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLAotCQkJCQkoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBTRVQ6IHsKLQkJCW9sZFZhbHVlID0gb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAoKG9sZFZhbHVlICE9IG51bGwgJiYgIW9sZFZhbHVlLmVxdWFscyh2YWx1ZSkpCi0JCQkJCXx8IChvbGRWYWx1ZSA9PSBudWxsICYmIHZhbHVlICE9IG51bGwpKSB7Ci0JCQkJY21kID0gbmV3IFNldENvbW1hbmQoZWRpdGluZ0RvbWFpbiwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl9Ci0JCWlmIChjbWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbW1hbmRTdGFjay5kb0V4ZWN1dGUoY21kKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJY29tbWFuZFN0YWNrLnVuZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQljb21tYW5kU3RhY2sucmVkbygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9BbGwoKSB7Ci0JCWJvb2xlYW4gYiA9IGNvbW1hbmRTdGFjay51bmRvQWxsKCk7Ci0JCXVucmVnaXN0ZXJBc01vZGlmaWVyKCk7Ci0JCS8vIGZpcmVOb3RpZnlDaGFuZ2VkKG51bGwpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQljb21tYW5kU3RhY2suc2F2ZUlzRG9uZSgpOwotCQl1bnJlZ2lzdGVyQXNNb2RpZmllcigpOwotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCWJvb2xlYW4gcmV0ID0gY29tbWFuZFN0YWNrLmlzU2F2ZU5lZWRlZCgpOwotCQlpZiAoIXJldCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldE1vZGlmaWVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbW1hbmRTdGFjay5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlzeW5jaHJvbml6ZWQgKFJFU09VUkNFX1RPX01PRElGSUVSU19NQVApIHsKLQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gUkVTT1VSQ0VfVE9fTU9ESUZJRVJTX01BUC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlTZXQgbW9kcyA9IChTZXQpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKG1vZHMuY29udGFpbnModGhpcykpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQl9Ci0KLQkvLyBwdWJsaWMgdm9pZCBmaXJlTm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JLy8gY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkvLyB9Ci0JLy8KLQkvLyBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCS8vIGNoYW5nZU5vdGlmaWVyLmFkZChub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCS8vIH0KLQkvLwotCS8vIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotCS8vIHsKLQkvLyBjaGFuZ2VOb3RpZmllci5yZW1vdmUobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBEb2VzIG5vdGhpbmcgaGVyZSwgc3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCB0byBwcm92aWRlIHNhdmluZyB0aGUKLQkgKiByZXNvdXJjZSBiZWZvcmUgaXQgZ290IHJlbW92ZWQgZnJvbSBSRVNPVVJDRV9UT19NT0RJRklFUlNfTUFQCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgewotCX0KLQotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gY29tbWFuZFN0YWNrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCkgewotCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21tYW5kU3RhY2suZG9FeGVjdXRlKGNtZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvQ2F0ZWdvcnlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9DYXRlZ29yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNzViMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9DYXRlZ29yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGFzc2lnbiBhIG1ldGhvZCBlbGVtZW50IHRvIGEgY2F0ZWdvcnkuIElmIHRoZSBjYXRlZ29yeQotICogaXMgaW4gYSBiYXNlIG1ldGhvZCBwbHVnLWluIG9mIHRoZSBlbGVtZW50LCB0aGlzIGNvbW1hbmQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0gKiBjcmVhdGUgYSBjb250cmlidXRvciB0byB0aGUgYmFzZSBjYXRlZ29yeSBhbmQgYXNzaWduIHRoZSBlbGVtZW50IHRvIHRoZQotICogY29udHJpYnV0aW5nIGNhdGVnb3J5LiBUaGlzIGlzIGF2b2lkcyBtb2RpZnlpbmcgdGhlIGJhc2UgbWV0aG9kIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUb0NhdGVnb3J5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvcjsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY3JlYXRlTmV3Q29udHJpYnV0b3IgPSBmYWxzZTsKLQotCXByaXZhdGUgQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2c7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIE9iamVjdCBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZTsKLQkKLQlwcml2YXRlIExpc3QgdXNlZENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgQWRkVG9DYXRlZ29yeUNvbW1hbmQoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5LAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCwgYm9vbGVhbiBjaGVja0ZvckV4aXN0aW5nQ29udHJpYnV0b3IsCi0JCQlMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCXRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5jYXRlZ29yeVBrZ1BhdGggPSBjYXRlZ29yeVBrZ1BhdGg7Ci0JCXRoaXMuY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yID0gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yOwotCQl0aGlzLnVzZWRDYXRlZ29yaWVzID0gdXNlZENhdGVnb3JpZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJLy8gY2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gd2lsbCBtb2RpZnkgdGhlIGVsZW1lbnQgaW4gb3Bwb3NpdGUgZmVhdHVyZQotCQkvLyB2YWx1ZQotCQkvLwotCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoY2F0ZWdvcnksIGZlYXR1cmUsCi0JCQkJZWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIkFkZCBUbyBDYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBjcmVhdGUgY29udHJpYnV0b3IgZm9yIGNhdGVnb3J5IGlmIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBwbHVnaW4gd2l0aAotCQkvLyB0aGUgZWxlbWVudAotCQkvLwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQlNZXRob2RQbHVnaW4gY2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JCWlmIChjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZihjYXRlZ29yeVBsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCWlmIChjYXRlZ29yeS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCQkiQ291bGQgbm90IGFkZCBlbGVtZW50IHRvIGFuIGV4dGVuZGVkIGNhdGVnb3J5IHRoYXQgaXMgaW4gYSBkaWZmZXJlbnQgcGx1Zy1pbjogIiArIGNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQljYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGVsZW1lbnRQbHVnaW4sCi0JCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY29udHJpYiA9IG51bGw7Ci0JCQlpZiAoY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yKSB7Ci0JCQkJLy8gbG9vayBmb3IgdGhlIGV4aXN0aW5nIGNvbnRyaWJ1dG9yIGZvciB0aGUgY2F0ZWdvcnkKLQkJCQkvLwotCQkJCWNvbnRyaWIgPSBUbmdVdGlsLmZpbmRDb250cmlidXRvcihjYXRlZ29yeVBrZywgY2F0ZWdvcnkpOwotCQkJfQotCi0JCQlpZiAoY29udHJpYiA9PSBudWxsKSB7Ci0JCQkJY3JlYXRlTmV3Q29udHJpYnV0b3IgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VkQ2F0ZWdvcnkgPSBjb250cmliOwotCQkJfQotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCX0KLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChjcmVhdGVOZXdDb250cmlidXRvcikgewotCQkJQ29udGVudENhdGVnb3J5IGNvbnRyaWIgPSAoQ29udGVudENhdGVnb3J5KSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkuY3JlYXRlKGNhdGVnb3J5LmVDbGFzcygpKTsKLQkJCWNvbnRyaWIuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChjYXRlZ29yeSk7Ci0JCQljb250cmliLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQkJY2F0ZWdvcnlQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuYWRkKGNvbnRyaWIpOwotCQkJdXNlZENhdGVnb3J5ID0gY29udHJpYjsKLQkJCWlmICh1c2VkQ2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShVbWFVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKHVzZWRDYXRlZ29yeSkpOwotCQkJCUxpc3QgbGlzdCA9IHJvb3QuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQkJCWxpc3QuYWRkKHVzZWRDYXRlZ29yeSk7Ci0JCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShyb290LCAoQ3VzdG9tQ2F0ZWdvcnkpdXNlZENhdGVnb3J5LCBjYXRlZ29yeS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQl1c2VkQ2F0ZWdvcnkuc2V0TmFtZShjYXRlZ29yeS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0JCW9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlID0gbXJFT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQkJCSgoQ29sbGVjdGlvbikgb2xkT3BwVmFsLmVHZXQoZmVhdHVyZSkpLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJaWYgKG9sZE9wcFZhbC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkT3BwVmFsLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCi0JCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJCWlmICghY29sbGVjdGlvbi5jb250YWlucyhlbGVtZW50KSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWlmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCQkJRU9iamVjdCBvbGRPcHBWYWwgPSAoRU9iamVjdCkgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWU7Ci0JCQkJCW9sZE9wcFZhbC5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQlpZiAob2xkT3BwVmFsLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRPcHBWYWwuZVJlc291cmNlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVzZWRDYXRlZ29yeSAhPSBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSkgewotCQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodXNlZENhdGVnb3J5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAodXNlZENhdGVnb3JpZXMuY29udGFpbnMoY2F0ZWdvcnkpKSB7Ci0JCQl1c2VkQ2F0ZWdvcmllcy5yZW1vdmUoY2F0ZWdvcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdXNlZENhdGVnb3J5LmVHZXQoZmVhdHVyZSk7Ci0JCQljb2xsZWN0aW9uLnJlbW92ZShlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQl9Ci0KLQkJLy8gcmVzdG9yZSBvbGQgdmFsdWUgb2YgdGhlIHNpbmdsZS12YWx1ZSBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vCi0JCWlmICghb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpICYmIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwKLQkJCQkmJiBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSAhPSB1c2VkQ2F0ZWdvcnkpIHsKLQkJCUVPYmplY3Qgb2xkT3BwVmFsID0gKEVPYmplY3QpIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIG9sZE9wcFZhbC5lR2V0KGZlYXR1cmUpKS5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZE9wcFZhbC5lU2V0KGZlYXR1cmUsIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNyZWF0ZU5ld0NvbnRyaWJ1dG9yKSB7Ci0JCQlpZiAoVG5nVXRpbC5pc0VtcHR5KHVzZWRDYXRlZ29yeSkpIHsKLQkJCQlNZXRob2RQbHVnaW4gdXNlZENhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4odXNlZENhdGVnb3J5KTsKLQkJCQlFY29yZVV0aWwucmVtb3ZlKHVzZWRDYXRlZ29yeSk7Ci0JCQkJaWYgKHVzZWRDYXRlZ29yeSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJCVRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KHVzZWRDYXRlZ29yeVBsdWdpbikKLQkJCQkJCQkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLnJlbW92ZSh1c2VkQ2F0ZWdvcnkpOwotCQkJCX0KLQkJCQl1c2VkQ2F0ZWdvcnkgPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmICghdXNlZENhdGVnb3JpZXMuY29udGFpbnMoY2F0ZWdvcnkpKSB7Ci0JCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZWRDYXRlZ29yeSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQ2NjYyCi0JCS8vIEJlbG93IGFkZGluZyBjYXRlZ29yeSdzIHJlc291cmNlIHRvIG1vZGlmaWVkUmVzb3VyY2VzIGlzIG5lZWRlZCwgCi0JCS8vIGJlY2F1c2UgYmVmb3JlIGV4ZWN1dGluZyBjb21tYW5kLCBuZWVkIHRvIHZlcmlmeSBpZiByZXNvdXJjZSBpcyBtdXRhYmxlIG9yIG5vdAotCQkvLyBnZXRNb2RpZmllZFJlc291cmNlcygpIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIGFjdHVhbCBleGVjdXRlKCkgaW4gZmV3IGNhc2VzLgotCQkvLyBVc2VmdWwgaW4gc3BlY2lhbCBjYXNlcyBsaWtlIGlmIHJlc291cmNlIGlzIGluIHZlcnNpb24gY29udHJvbC4KLQkJLy8KLQkJaWYoY2F0ZWdvcnkgIT0gbnVsbCAmJiBjYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJJiYgbW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCl7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQl9Ci0JCQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0FkZFRvU2VjdGlvbkxpc3RDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1ZTUyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBhZGQgYSBuZXcgc2VjdGlvbiB0byB0aGUgc2VjdGlvbiBsaXN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVG9TZWN0aW9uTGlzdENvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBhZGRlZDsKLQotCXB1YmxpYyBBZGRUb1NlY3Rpb25MaXN0Q29tbWFuZChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCVNlY3Rpb24gc2VjdGlvbiwgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3QpIHsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnNlY3Rpb25MaXN0ID0gc2VjdGlvbkxpc3Q7Ci0JCXRoaXMuc2VjdGlvbiA9IHNlY3Rpb247Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJfWVsc2V7Ci0JCQkvLyBUaGlzIGNoZWNrIGlzIGRvbmUgdG8gYnlwYXNzIGFkZGl0aW9uIG9mIHNlY3Rpb24gdG8gbWV0aG9kIGVsZW1lbnQKLQkJCS8vIGZvciBmaXJzdCB0aW1lLCBpZiBwbHVnaW4ueG1pIGZpbGUgY2hlY2tlZC1vdXQgd2l0aCB2ZXJzaW9uIGNvbnRyb2wuIAotCQkJaWYoY29udGVudEVsZW1lbnQuZVJlc291cmNlKCkgIT0gbnVsbCl7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXNlY3Rpb25MaXN0LmFkZChzZWN0aW9uKTsKLQkJYWRkZWQgPSB0cnVlOwotCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGFkZGVkKSB7Ci0JCQlzZWN0aW9uTGlzdC5yZW1vdmUoc2VjdGlvbik7Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJYWRkZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0JhdGNoQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0JhdGNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWYxNjhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9CYXRjaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZmVhdHVyZXMgb2YgbXVsdGlwbGUgb2JqZWN0cyBpbgotICogYSBzaW5nbGUgYmF0Y2guCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmF0Y2hDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIHsKLQlwcml2YXRlIE1hcCBvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXA7Ci0JcHJpdmF0ZSBNYXAgb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwOwotCXByaXZhdGUgYm9vbGVhbiBjbGVhcjsKLQkKLQkvKioKLQkgKiBAcGFyYW0gY2xlYXIgaWYgdHJ1ZSB3aWxsIGNsZWFyIHRoZSBtYW55LXZhbHVlZCBmZWF0dXJlIGJlZm9yZSBhZGRpbmcgbmV3IHZhbHVlcyAKLQkgKi8KLQlwdWJsaWMgQmF0Y2hDb21tYW5kKGJvb2xlYW4gY2xlYXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jbGVhciA9IGNsZWFyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjY2FuRXhlY3V0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJcmV0dXJuIG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCAhPSBudWxsICYmICFvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuaXNFbXB0eSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9PSBudWxsIHx8IG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZW50cnlTZXQoKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCS5nZXRLZXkoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlpZihjbGVhcikgewotCQkJCQkJZU9iai5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJKChMaXN0KSBlT2JqLmVHZXQoZmVhdHVyZSkpLmFkZEFsbCgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBlT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChvbGRWYWx1ZSAhPSBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0JCQkJCQlzYXZlT2xkRmVhdHVyZVZhbHVlKGVPYmosIGZlYXR1cmUpOwotCQkJCQkJZU9iai5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChvYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgIT0gbnVsbCAmJiAhb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkuZ2V0S2V5KCk7Ci0JCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkoKExpc3QpIGVPYmouZUdldChmZWF0dXJlKSkKLQkJCQkJCQkJLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQotCQkvLyByZXN0b3JlIG9sZCB2YWx1ZQotCQkvLwotCQlpZiAob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwgJiYgIW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQllT2JqLmVTZXQoZmVhdHVyZSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWFkZEZlYXR1cmVWYWx1ZShnZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwgb2JqLCBmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdmFsdWVzIHRvIGEgJ21hbnknIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlIHdpdGggbWFueSB2YWx1ZXMKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlcyhFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWFkZEZlYXR1cmVWYWx1ZXMoZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIG9iaiwgZmVhdHVyZSwgdmFsdWVzKTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLQkJCW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZU9sZEZlYXR1cmVWYWx1ZShFT2JqZWN0IGVPYmosCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBlT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoTGlzdCl2YWx1ZSk7Ci0JCX0KLQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBvYmplY3RUb09sZEZlYXR1cmVWYWx1ZXNNYXAuZ2V0KGVPYmopOwotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5wdXQoZU9iaiwgZmVhdHVyZU1hcCk7Ci0JCX0KLQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYob2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwID0gbnVsbDsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwICE9IG51bGwpIHsKLQkJCW9iamVjdFRvT2xkRmVhdHVyZVZhbHVlc01hcC5jbGVhcigpOwotCQkJb2JqZWN0VG9PbGRGZWF0dXJlVmFsdWVzTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGZWF0dXJlVmFsdWUoTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsCi0JCQlFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAuZ2V0KG9iamVjdCk7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcC5wdXQob2JqZWN0LCBmZWF0dXJlTWFwKTsKLQkJfQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZCh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlTWFwLnB1dChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkRmVhdHVyZVZhbHVlcyhNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCUVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJTWFwIGZlYXR1cmVNYXAgPSAoTWFwKSBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLmdldChvYmplY3QpOwotCQlpZiAoZmVhdHVyZU1hcCA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZU1hcCk7Ci0JCX0KLQkJTGlzdCBsaXN0ID0gKExpc3QpIGZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQkJbGlzdC5hZGRBbGwodmFsdWVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjE3NzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0NvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi0vKioKLSAqIExpc3RlbnMgdG8gY2hhbmdlcyB0byBhIGNvbW1lbmQgc3RhY2suCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0FWRUQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhFQ1VURUQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ETyA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkRPX0FMTCA9IDg7Ci0KLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHVibGljIENvbW1hbmRTdGFja0NoYW5nZWRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgdHlwZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NjcyNzI5NDYwNDI5MjkxNkw7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvQ29tbWFuZFN0YXR1c0NoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjRlZjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Db21tYW5kU3RhdHVzQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLS8qKgotICogQ2hlY2tzIHRoZSBzdGF0dXMgb2YgYW4gZXhlY3V0ZWQgY29tbWFuZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjEsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbW1hbmRTdGF0dXNDaGVja2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNSb2xsYmFja0Vycm9yKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXJldHVybiBoYXNFcnJvcihzdGF0dXMsIFNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoYXNTYXZlRXJyb3IoSVN0YXR1cyBzdGF0dXMpIHsKLQkJcmV0dXJuIGhhc0Vycm9yKHN0YXR1cywgU2F2ZVN0YXR1cy5TQVZFX0VSUk9SKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaGFzRXJyb3IoSVN0YXR1cyBzdGF0dXMsIGludCBlcnJDb2RlKSB7Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IHN0YXR1c2VzW2ldOwotCQkJaWYgKGNoaWxkU3RhdHVzIGluc3RhbmNlb2YgU2F2ZVN0YXR1cwotCQkJCQkmJiAoY2hpbGRTdGF0dXMuZ2V0Q29kZSgpICYgZXJyQ29kZSkgPT0gZXJyQ29kZSkgewotCQkJCXJldCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODAwZmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZGVsZXRlIGEgbWV0aG9kIGVsZW1lbnQgcGVybWFuZW50bHkuIFRoaXMgaW52b2x2ZXMKLSAqIGRlbGV0aW5nIHRoZSBzdG9yYWdlIGNvbnRlbnQgYW5kIHJlbW92aW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZFdyYXBwZXIgewotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVmUmVtb3ZlZDsKLQotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY29tbWFuZExpc3RlbmVyczsKLQotCXByaXZhdGUgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlcjsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQ7Ci0KLQlwcm90ZWN0ZWQgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlczsKLQotCS8vIE1hcCBvZiBlbGVtZW50IHRvIE1hcCBvZiBpdHMgcmVmZXJlbmNlciB0byBmZWF0dXJlcyBsaXN0Ci0JLy8KLQlwcm90ZWN0ZWQgTWFwPEVPYmplY3QsIE1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+PiBlbGVtZW50VG9SZW1vdmVkUmVmc01hcDsKLQotCXByaXZhdGUgQmF0Y2hDb21tYW5kIGJhdGNoQ29tbWFuZCA9IG5ldyBCYXRjaENvbW1hbmQodHJ1ZSk7Ci0KLQkvKioKLQkgKiBMaXN0IG9mIFJlZmVyZW5jZSBvYmplY3RzCi0JICogCi0JICogQHNlZSBSZWZlcmVuY2UKLQkgKi8KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IHJlbW92ZWRSZWZlcmVuY2VzOwotCi0JcHVibGljIGJvb2xlYW4gZmFpbGVkOwotCi0JcHJpdmF0ZSBib29sZWFuIGNvbmZpcm1SZW1vdmVSZWZlcmVuY2VzOwotCQotCXByaXZhdGUgQXJyYXlMaXN0PENvbW1hbmQ+IG5lc3RlZENvbW1hbmRzOwotCi0JcHJpdmF0ZSBIYXNoU2V0PERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzOwotCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqZWN0cyB0byBiZSBwZXJtYW5lbnRseSBkZWxldGVkLgotCSAqLwotCXB1YmxpYyBEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZChDb21tYW5kIGNvbW1hbmQsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJdGhpcyhjb21tYW5kLCBlbGVtZW50cywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgQ29sbGVjdGlvbiBlbGVtZW50cywKLQkJCWJvb2xlYW4gY29uZmlybVJlbW92ZVJlZnMpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50cyA9PSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpOwotCQljb21tYW5kTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQljb25maXJtUmVtb3ZlUmVmZXJlbmNlcyA9IGNvbmZpcm1SZW1vdmVSZWZzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJhdGNoQ29tbWFuZC5kaXNwb3NlKCk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQgIT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuY2xlYXIoKTsKLQkJfQotCQlpZiAoZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAgIT0gbnVsbCkgewotCQkJZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlpZiAocmVtb3ZlZFJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMuY2xlYXIoKTsKLQkJfQotCQkvLyBEaXNwb3NlIG5lc3RlZCBjb21tYW5kcy4KLQkJaWYobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCl7Ci0JCQlpZighbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKXsKLQkJCQlmb3IgKENvbW1hbmQgY29tbWFuZCA6IG5lc3RlZENvbW1hbmRzKSB7Ci0JCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihkZXNjcmlwdG9ycyAhPSBudWxsKSB7Ci0JCQlkZXNjcmlwdG9ycy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVByZUV4ZWN1dGUoKSB7Ci0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5wcmVFeGVjdXRlKHRoaXMpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5UHJlVW5kbygpIHsKLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ29tbWFuZExpc3RlbmVyIGNtZExpc3RlbmVyID0gKElDb21tYW5kTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZExpc3RlbmVyLnByZVVuZG8odGhpcyk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVFbGVtZW50cygpIHsKLQkJQXJyYXlMaXN0IG5ld0VsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJUmVtb3ZlQ29tbWFuZCBjbWQgPSBnZXRSZW1vdmVDb21tYW5kKGVsZW1lbnQpOwotCQkJCWlmIChjbWQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCQkJJiYgKChFUmVmZXJlbmNlKSBjbWQuZ2V0RmVhdHVyZSgpKS5pc0NvbnRhaW5tZW50KCkKLQkJCQkJCSYmIGNtZC5nZXRPd25lckxpc3QoKS5jb250YWlucyhlbGVtZW50KSkgewotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcnkgd2lsbCBiZSBkZWxldGVkIHBlcm1hbmVudGx5Ci0JCQkJCS8vIGZpbmQgYWxsIHN1YmNhdGVnb3J5IHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGJ5IGFueSBvdGhlcgotCQkJCQkvLyBjdXN0b20gY2F0ZWdvcnkKLQkJCQkJLy8gaW4gdGhlIHNhbWUgcGx1Z2luIHRvIGRlbGV0ZSB0aGVtIGFzIHdlbGwKLQkJCQkJLy8KLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gVG5nVXRpbAotCQkJCQkJCS5nZXRFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKChDdXN0b21DYXRlZ29yeSkgZWxlbWVudCk7Ci0JCQkJCWlmICghY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IHN1YkNhdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAoIWVsZW1lbnRzLmNvbnRhaW5zKHN1YkNhdCkKLQkJCQkJCQkJCSYmICFuZXdFbGVtZW50cy5jb250YWlucyhzdWJDYXQpKSB7Ci0vLwkJCQkJCQkJY21kLmdldENvbGxlY3Rpb24oKS5hZGQoc3ViQ2F0KTsKLQkJCQkJCQkJQ29sbGVjdGlvbiBjb2wgPSBjbWQuZ2V0Q29sbGVjdGlvbigpOwotCQkJCQkJCQljb2wuYWRkKHN1YkNhdCk7CQkJCQkJCQkKLQkJCQkJCQkJbmV3RWxlbWVudHMuYWRkKHN1YkNhdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsZW1lbnRzLmFkZEFsbChuZXdFbGVtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgUmVtb3ZlQ29tbWFuZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVtb3ZlQ29tbWFuZCBnZXRSZW1vdmVDb21tYW5kKE9iamVjdCBlKSB7Ci0JCWlmIChjb21tYW5kIGluc3RhbmNlb2YgUmVtb3ZlQ29tbWFuZCkgewotCQkJaWYgKCgoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZCkuZ2V0Q29sbGVjdGlvbigpLmNvbnRhaW5zKGUpKSB7Ci0JCQkJcmV0dXJuIChSZW1vdmVDb21tYW5kKSBjb21tYW5kOwotCQkJfQotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29tcG91bmRDb21tYW5kKSBjb21tYW5kKS5nZXRDb21tYW5kTGlzdCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY21kID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNtZCBpbnN0YW5jZW9mIFJlbW92ZUNvbW1hbmQpIHsKLQkJCQkJUmVtb3ZlQ29tbWFuZCByZW1vdmVDb21tYW5kID0gKFJlbW92ZUNvbW1hbmQpIGNtZDsKLQkJCQkJaWYgKHJlbW92ZUNvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlyZXR1cm4gcmVtb3ZlQ29tbWFuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwcmVwYXJlRWxlbWVudHMoKTsKLQotCQlub3RpZnlQcmVFeGVjdXRlKCk7Ci0KLQkJZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQ8RGVzY3JpcHRvcj4oKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQsCi0JCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXByZXBhcmVSZW1vdmluZ1JlZmVyZW5jZXMoKTsKLQkJCX0KLQotCQl9OwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLAotCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgCi0KLQotCQlpZighY29uZmlybVJlbW92aW5nUmVmZXJlbmNlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCVNldCB1bm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBnZXQgdGhlIG93bmVyIHJlc291cmNlcyBiZWZvcmUgdGhlIGVsZW1lbnRzIGdvdCByZW1vdmVkIGZyb20KLQkJLy8gY29udGFpbmVyIGluIHN1cGVyRXhlY3V0ZSgpCi0JCS8vCi0JCWNvbGxlY3RPd25lclJlc291cmNlcyhtb2RpZmllZFJlc291cmNlcywgdW5tb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJc3VwZXJFeGVjdXRlKCk7Ci0JCQotCQlleGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJCi0JCS8vIENvbGxlY3QgdGhlIG5lc3RlZCBjb21tYW5kIG1vZGlmaWVkIHJlc291cmNlcyBmb3Igc2F2aW5nLiAKLQkJY29sbGVjdE5lc3RlZENvbW1hbmRSZXNvdXJjZXMobW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIGdldCByZXNvdXJjZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgdGhpcyBjb21tYW5kCi0JCS8vIHVudGlsIG5vdwotCQkvLwotCQljb2xsZWN0UmVzb3VyY2VzKG1vZGlmaWVkUmVzb3VyY2VzLCBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0KLQkJbW9kaWZpZWRSZXNvdXJjZXMucmVtb3ZlQWxsKHVubW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCWZpbmFsIEV4Y2VwdGlvbltdIGV4Y2VwdGlvbnMgPSBuZXcgRXhjZXB0aW9uWzFdOwotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5XaXRoQnVzeUluZGljYXRvcihuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlyZW1vdmVSZWZlcmVuY2VzKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXhjZXB0aW9uc1swXSA9IGU7Ci0JCQkJfQotCQkJfQotCi0JCX0pOwotCi0JCWlmIChleGNlcHRpb25zWzBdICE9IG51bGwpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRWxlbWVudEVycm9yX21zZywKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlUmVmZXJlbmNlc0Vycm9yX3JlYXNvbiwKLQkJCQkJZXhjZXB0aW9uc1swXSk7Ci0JCQkJCi0JCQl1bmRvKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoZ2V0UmVmZXJlbmNpbmdSZXNvdXJjZXMoKSk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0RlbGV0ZUNvbnRlbnQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQllbGVtZW50c1RvRGVsZXRlQ29udGVudC5hZGRBbGwoZWxlbWVudHMpOwotCQkKLQkJSGFzaFNldDxSZXNvdXJjZT4gZGVsZXRlZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvRGVsZXRlQ29udGVudC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmICghIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSkgewotCQkJCW9iaiA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBvYmo7Ci0JCQkJVW1hVXRpbC5nZXRSZXNvdXJjZXMoZSwgZGVsZXRlZFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGV4Y2x1ZGUgZGVsZXRlZCByZXNvdXJjZXMgZnJvbSB0aGUgc2V0IG9mIG1vZGlmaWVkIHJlc291cmNlcwotCQkvLwotCQltb2RpZmllZFJlc291cmNlcy5yZW1vdmVBbGwoZGVsZXRlZFJlc291cmNlcyk7Ci0JCQotCQkvLyBleGNsdWRlIGFueSByZXNvdXJjZSB0aGF0IGlzIGNvbnRhaW5lZCBieSB0aGUgZGVsZXRlZCByZXNvdXJjZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVsZXRlZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIGRlbGV0ZWRSZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKGdldFBlcnNpc3RlcigpLmlzQ29udGFpbmVkQnkocmVzb3VyY2UsIGRlbGV0ZWRSZXNvdXJjZSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQkKLQkJLy8gY2hlY2sgYWZmZWN0ZWQgcmVzb3VyY2VzIGZvciB1bm1vZGlmaWFibGUKLQkJLy8KLQkJSVN0YXR1cyBzdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkobW9kaWZpZWRSZXNvdXJjZXMsCi0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKSk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcigKLQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRlRGlhbG9nX3RpdGxlLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVFbGVtZW50RXJyb3JfbXNnLCBzdGF0dXMpOwotCi0JCQl1bmRvKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRQZXJzaXN0ZXIoKTsKLQotCQkJCS8vIHNhdmUgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gY2hhbmdlZCBhZnRlciByZWZlcmVuY2VzIHRvIHRoZQotCQkJCS8vIGRlbGV0ZWQgZWxlbWVudHMKLQkJCQkvLyBoYWQgYmVlbiByZW1vdmVkCi0JCQkJLy8KLQkJCQl0cnkgewotCQkJCQltb25pdG9yCi0JCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQlkZWxldGVDb250ZW50KCk7Ci0KLQkJCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJLy8KLQkJCQkJbW9uaXRvci5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmluZ1Jlc291cmNlc19tc2cpOwotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQotCQkJCQlleGVjdXRlZCA9IHRydWU7Ci0KLQkJCQkJcmVtb3ZlQWRhcHRlcnMoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlmYWlsZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgV3JhcHBlZEV4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9OwotCi0JCS8vIGlmICghVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJLy8gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVsZXRpbmdFbGVtZW50c1Rhc2tfbmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkvLyBpZiAoZmFpbGVkKSB7Ci0JCS8vIG5vdGlmeUZhaWx1cmUoKTsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gdW5kbygpOwotCQkvLyB9Ci0JCS8vIHJldHVybjsKLQkJLy8gfQotCi0vLwkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIChTaGVsbCkgbnVsbCk7Ci0JCQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGluZ0VsZW1lbnRzVGFza19uYW1lKTsKLQotCQlpZiAoZXhlY3V0ZWQpIHsKLQkJCXRyeSB7Ci0JCQkJTGlzdCB3YXJuaW5ncyA9IHBlcnNpc3Rlci5nZXRXYXJuaW5ncygpOwotCQkJCWlmICghd2FybmluZ3MuaXNFbXB0eSgpKSB7Ci0JCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZTsKLQkJCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kX3dhcm5pbmdNc2c7Ci0JCQkJCVN0cmluZ0J1ZmZlciByZWFzb24gPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdhcm5pbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJRXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZyBzdHIgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJCWlmICghU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQkJCQlyZWFzb24uYXBwZW5kKHN0cikuYXBwZW5kKCdcbicpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbgotCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCQotCQkJbm90aWZ5RXhlY3V0ZWQoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmYWlsZWQpIHsKLQkJCQlub3RpZnlGYWlsdXJlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXVuZG8oKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtUmVtb3ZpbmdSZWZlcmVuY2VzKCkgewotCQlpZiAoIWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmlzRW1wdHkoKSkgewotCQkJLy8gY29sbGVjdCBzZXQgb2YgcmVmZXJlbmNlcnMKLQkJCUhhc2hTZXQ8RU9iamVjdD4gcmVmZXJlbmNlcnMgPSBuZXcgSGFzaFNldDxFT2JqZWN0PigpOwotCQkJZm9yIChNYXA8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiByZWZlcmVuY2VyVG9GZWF0dXJlc01hcCA6IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnZhbHVlcygpKSB7Ci0JCQkJLy8gY29sbGVjdCBvbmx5IHJlZmVyZW5jZXIgd2l0aCBhbiB1bmlkaXJlY3Rpb25hbCBvciBjb250YWlubWVudAotCQkJCS8vIHJlbGF0aW9uc2hpcAotCQkJCS8vCi0JCQkJZm9yIChNYXAuRW50cnk8RU9iamVjdCwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiBlbnRyeSA6IHJlZmVyZW5jZXJUb0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQkJQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJYm9vbGVhbiBjYW5Db2xsZWN0ID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gaGFzRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJCQljaGVja19yZWY6IGZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGYgOiBmZWF0dXJlcykgewotCQkJCQkJaWYgKCFjYW5Db2xsZWN0ICYmIGYgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgZjsKLQkJCQkJCQlpZiAocmVmLmlzQ29udGFpbm1lbnQoKQotCQkJCQkJCQkJfHwgcmVmLmdldEVPcHBvc2l0ZSgpID09IG51bGwpIHsKLQkJCQkJCQkJY2FuQ29sbGVjdCA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoIWhhc0Rlc2NyaXB0b3IgJiYgKGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpCi0JCQkJCQkJCXx8IGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpCi0JCQkJCQkJCXx8IGYgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJCQkJaGFzRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQlpZihjYW5Db2xsZWN0ICYmIGhhc0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQlicmVhayBjaGVja19yZWY7CQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmIChjYW5Db2xsZWN0KSB7Ci0JCQkJCQlyZWZlcmVuY2Vycy5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJCQl9Ci0JCQkJCWlmKGhhc0Rlc2NyaXB0b3IgJiYgZW50cnkuZ2V0S2V5KCkgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQlkZXNjcmlwdG9ycy5hZGQoKERlc2NyaXB0b3IpIGVudHJ5LmdldEtleSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY29uZmlybSB3aXRoIHVzZXIgYmVmb3JlIHJlbW92aW5nIGlsbGVnYWwgcmVmZXJlbmNlcwotCQkJLy8KLQkJCWlmIChjb25maXJtUmVtb3ZlUmVmZXJlbmNlcykgewkJCQkKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLCAwLAotCQkJCQkJIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJCi0JCQkJaWYoIWRlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCQkvLyBhc2sgdXNlciB0byBkZWxldGUgdGhlIGRlc2NyaXB0b3JzIHRoYXQgYXJlIGFzc29jaWF0ZWQKLQkJCQkJLy8gd2l0aCB0aGUgY29udGVudCBlbGVtZW50IHRvIGJlIGRlbGV0ZWQKLQkJCQkJLy8KLQkJCQkJZm9yIChFT2JqZWN0IGUgOiBkZXNjcmlwdG9ycykgewotCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50VHlwZV90ZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KGUpLCBUbmdVdGlsCi0JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoZSkpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJc3dpdGNoICh1aUhhbmRsZXIKLQkJCQkJCQkJLnNlbGVjdE9uZSgKLQkJCQkJCQkJCQluZXcgaW50W10gewotCQkJCQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTywKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwgfSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl90aXRsZSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jb25maXJtRGVzY3JpcHRvcnNEZWxldGlvbl9tc2csCi0JCQkJCQkJCQkJbXVsdGlTdGF0dXMpKSB7Ci0JCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUw6Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk86Ci0JCQkJCQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZighZGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgZGVzY3JpcHRvcnMgdGhhdCB1c2VyIHdhbnRlZCB0byBkZWxldGUgZnJvbSB0aGUgcmVmZXJlbmNlcnMKLQkJCQkJLy8KLQkJCQkJcmVmZXJlbmNlcnMucmVtb3ZlQWxsKGRlc2NyaXB0b3JzKTsKLQkJCQl9Ci0JCQkJbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwKLQkJCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoRU9iamVjdCBlIDogcmVmZXJlbmNlcnMpIHsKLQkJCQkJLy8gZG9uJ3Qgc2hvdyBwcmVkZWZpbmVkIGVsZW1lbnQKLQkJCQkJLy8KLQkJCQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIGUpKSkgewotCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50VHlwZV90ZXh0LCBUbmdVdGlsLmdldFR5cGVUZXh0KGUpLCBUbmdVdGlsCi0JCQkJCQkJCQkJLmdldExhYmVsV2l0aFBhdGgoZSkpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobXVsdGlTdGF0dXMuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPiAwKSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIKLQkJCQkJCQkuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYgKHVpSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodWlIYW5kbGVyCi0JCQkJCQkJCS5zZWxlY3RPbmUoCi0JCQkJCQkJCQkJbmV3IGludFtdIHsKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwgfSwKLQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWxldGVSZWZlcmVuY2VzRGlhbG9nX3RpdGxlLAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZVJlZmVyZW5jZXNEaWFsb2dfdGV4dCwgbXVsdGlTdGF0dXMpID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUwpIHsKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlmIHRoZSByZWZlcmVuY2VycyBjYW4gYmUgY2hhbmdlZAotCQkJLy8KLQkJCWZvciAoRU9iamVjdCBlIDogcmVmZXJlbmNlcnMpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShlLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkJLnNob3dFcnJvcigKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZURpYWxvZ190aXRsZSwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmRlbGV0ZUVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCQkJCQlzdGF0dXMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgc3RhdGVmdWwgYWRhcHRlcnMsIHRoZW4gcmVtb3ZlcyBhbGwgYWRhcHRlcnMgdGhhdCBhcmUKLQkgKiBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWRhcHRlcnMoRU9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZUFkYXB0ZXJzKCkpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcikgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLQkJCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSVJlZmVyZW5jZXIpIHsKLQkJCQkJCSgoSVJlZmVyZW5jZXIpIGFkYXB0ZXJGYWN0b3J5KS5yZW1vdmUoYWRhcHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudC5lQWRhcHRlcnMoKS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCBzdGF0ZWZ1bCBhZGFwdGVycywgdGhlbiByZW1vdmVzIGFsbCBhZGFwdGVycyB0aGF0IGFyZQotCSAqIGF0dGFjaGVkIHRvIHRoZSBkZWxldGVkIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWRhcHRlcnMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIG9iajsKLQkJCQlpZiAoZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCXJlbW92ZUFkYXB0ZXJzKGUpOwotCQkJCQl9Ci0JCQkJCXJlbW92ZUFkYXB0ZXJzKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnlGYWlsdXJlKCkgewotCQlFdmVudE9iamVjdCBldmVudE9iamVjdCA9IG5ldyBFdmVudE9iamVjdCh0aGlzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyID0gKENvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5ub3RpZnlGYWlsdXJlKGV2ZW50T2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcigpIHsKLQkJaWYgKHBlcnNpc3RlciA9PSBudWxsKSB7Ci0JCQlwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpCi0JCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUV4ZWN1dGVkKCkgewotCQlFdmVudE9iamVjdCBldmVudE9iamVjdCA9IG5ldyBFdmVudE9iamVjdCh0aGlzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0aGlzLmNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vdGlmeUV4ZWN1dGVkKGV2ZW50T2JqZWN0KTsKLQkJfQotCi0JCUxpc3QgY29tbWFuZExpc3RlbmVycyA9IFByb3ZpZGVycwotCQkJCS5nZXRDb21tYW5kTGlzdGVuZXJzKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGNvbW1hbmRMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhY29tbWFuZExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBjbWRMaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQl0cnkgewotCQkJCQljbWRMaXN0ZW5lci5ub3RpZnlFeGVjdXRlZCh0aGlzKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldFJlZmVyZW5jaW5nUmVzb3VyY2VzKCkgewotCQlIYXNoU2V0IHJlZmVycmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcCByZWZlcnJlclRvRmVhdHVyZXNNYXAgPSAoTWFwKSBpdGVyLm5leHQoKTsKLQkJLy8gcmVmZXJyZXJzLmFkZEFsbChyZWZlcnJlclRvRmVhdHVyZXNNYXAua2V5U2V0KCkpOwotCQkvLyB9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZFJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlyZWZlcnJlcnMuYWRkKHJlZi5vd25lcik7Ci0JCX0KLQotCQlIYXNoU2V0IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVycmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgb3duZXIgcmVzb3VyY2VzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkIHRvIHNhdmUgbGF0ZXIuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqLwotCXByaXZhdGUgdm9pZCBjb2xsZWN0T3duZXJSZXNvdXJjZXMoU2V0IHJlc291cmNlcywgU2V0IHVubW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjb250YWluZXIuZVJlc291cmNlKCk7Ci0JCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJaWYgKHBlcnNpc3Rlci5oYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihlbGVtZW50KSkgewotCQkJCQkJdW5tb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0UmVzb3VyY2VzKFNldCByZXNvdXJjZXMsIENvbGxlY3Rpb24gb2JqZWN0cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmogPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAoZU9iai5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlcy5hZGQoZU9iai5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlzdXBlci5yZWRvKCk7Ci0JCXJlbW92ZVJlZmVyZW5jZXMoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUNvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiB0b0RlbGV0ZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZEVsZW1lbnQ+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzVG9EZWxldGVDb250ZW50Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQl0b0RlbGV0ZUxpc3QuYWRkKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlwZXJzaXN0ZXIuZGVsZXRlKHRvRGVsZXRlTGlzdCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkmJiB3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoKEVPYmplY3QpIGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gaWYgZSBpcyBvbmUgb2YgdGhlIGRlbGV0ZWQgZWxlbWVudHMsIG1ha2Ugc3VyZSB0aGF0IGl0IGFjdHVhbGx5IGdvdAotCQkvLyBkZWxldGVkIGJ5IGNoZWNraW5nIGl0cyBjb250YWluZXIKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGUgPT0gb2JqKSB7Ci0JCQkJcmV0dXJuIGUuZUNvbnRhaW5lcigpID09IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgYWxsIG9wcG9zaXRlIGZlYXR1cmVzIG9mIHRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkCi0JICogCi0JICogQHJldHVybiBsaXN0IG9mIGVsZW1lbnRzIHdob3NlIG9wcG9zaXRlIGZlYXR1cmVzIGFyZSBsb2FkZWQKLQkgKi8KLQlwdWJsaWMgTGlzdCBsb2FkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJSGFzaFNldCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBkZWxldGVkR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlBcnJheUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZS5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQlNYXAgb3Bwb3NpdGVGZWF0dXJlTWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsCi0JCQkJCQkJCSYmICFvcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJb3Bwb3NpdGVGZWF0dXJlcwotCQkJCQkJCQkJLmFkZEFsbChvcHBvc2l0ZUZlYXR1cmVNYXAua2V5U2V0KCkpOwotCQkJCQkJCWRlbGV0ZWRHVUlEcy5hZGQoKChNZXRob2RFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxlbWVudHMuYWRkKGUpOwotCQkJCU1hcCBvcHBvc2l0ZUZlYXR1cmVNYXAgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmVNYXAgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlTWFwLmlzRW1wdHkoKSkgewotCQkJCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZEFsbChvcHBvc2l0ZUZlYXR1cmVNYXAua2V5U2V0KCkpOwotCQkJCQlkZWxldGVkR1VJRHMuYWRkKCgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0R3VpZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlsb2FkT3Bwb3NpdGVGZWF0dXJlcyhuZXcgQXJyYXlMaXN0KG9wcG9zaXRlRmVhdHVyZXMpLCBkZWxldGVkR1VJRHMpOwotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWRCeURlbGV0ZWRFbGVtZW50KEVPYmplY3QgZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBkZWxldGVkID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJaWYgKGRlbGV0ZWQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShlLCBkZWxldGVkKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsZWN0cyBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIHJlbW92ZWQgaWYgPGNvZGU+ZWxlbWVudFRvRGVsZXRlPC9jb2RlPgotCSAqIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIDxjb2RlPnJlZmVyZW5jZXM8L2NvZGU+IG9mIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzVG9SZW1vdmUKLQkgKiAgICAgICAgICAgIG91dHB1dAotCSAqIEBwYXJhbSByZWZlcmVuY2VyCi0JICogICAgICAgICAgICBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0byBlbGVtZW50VG9EZWxldGUKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcwotCSAqICAgICAgICAgICAgY29sbGVjdGlvbiBvZiB7QGxpbmsgRVJlZmVyZW5jZX0gdGhhdCBjb250YWlucyBlbGVtZW50VG9EZWxldGUKLQkgKiBAcmV0dXJuIHRydWUgaWYgb25lIG9mIHRoZSBjb2xsZWN0ZWQgb2JqZWN0cyBpcyB0aGUKLQkgKiAgICAgICAgIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+IG9yIHRoZSBjb250YWluZXIgb2YKLQkgKiAgICAgICAgIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwKLQkJCUVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcykgewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlMaXN0IGNvbW1hbmRMaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChjb21tYW5kTGlzdGVuZXJzICE9IG51bGwgJiYgIWNvbW1hbmRMaXN0ZW5lcnMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjbWRMaXN0ZW5lciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjbWRMaXN0ZW5lciBpbnN0YW5jZW9mIElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlib29sZWFuIGIgPSAoKElEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyKSBjbWRMaXN0ZW5lcikKLQkJCQkJCQkJLmNvbGxlY3RPYmplY3RzVG9SZW1vdmUob2JqZWN0c1RvUmVtb3ZlLAotCQkJCQkJCQkJCWVsZW1lbnRUb0RlbGV0ZSwgcmVmZXJlbmNlciwgcmVmZXJlbmNlcyk7Ci0JCQkJCQlpZiAoYikgewotCQkJCQkJCXJldCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKHdpbGxSZW1vdmVFbGVtZW50RnJvbUNvbnRhaW5lcihjb21tYW5kLCBlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb21wb3VuZENvbW1hbmQpIGNvbW1hbmQpLmdldENvbW1hbmRMaXN0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIGl0ZXIubmV4dCgpOwotCQkJCWlmICh3aWxsUmVtb3ZlRWxlbWVudEZyb21Db250YWluZXIoY21kLCBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gd2lsbFJlbW92ZUVsZW1lbnRGcm9tQ29udGFpbmVyKENvbW1hbmQgY21kLAotCQkJRU9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChjbWQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoKFJlbW92ZUNvbW1hbmQpIGNtZCk7Ci0JCQlyZXR1cm4gcmVtb3ZlQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkKLQkJCQkJJiYgcmVtb3ZlQ29tbWFuZC5nZXRPd25lcigpID09IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlUmVtb3ZpbmdSZWZlcmVuY2VzKCkgewotCQlMaXN0IGVsZW1lbnRzID0gbG9hZE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIE1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+PigpOwotCQlIYXNoU2V0IG9iamVjdHNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gcmVmTWFwID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlTWFwKGVsZW1lbnQpOwotCQkJaWYgKCFyZWZNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRU9iamVjdCByZWZlcmVuY2VyID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSAoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJYm9vbGVhbiBiID0gY29sbGVjdE9iamVjdHNUb1JlbW92ZShvYmplY3RzVG9SZW1vdmUsCi0JCQkJCQkJZWxlbWVudCwgcmVmZXJlbmNlciwgcmVmZXJlbmNlcyk7Ci0JCQkJCWlmIChiIHx8IGVsZW1lbnRzLmNvbnRhaW5zKHJlZmVyZW5jZXIpCi0JCQkJCQkJfHwgaXNDb250YWluZWRCeURlbGV0ZWRFbGVtZW50KHJlZmVyZW5jZXIpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXJlZk1hcC5pc0VtcHR5KCkpCi0JCQkJCWVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLnB1dChlbGVtZW50LCByZWZNYXApOwotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIGVudHJpZXMgZm9yIG9iamVjdHNUb1JlbW92ZSB0byBlbGVtZW50VG9SZW1vdmVkUmVmc01hcAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCU1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+IG1hcCA9IGVsZW1lbnRUb1JlbW92ZWRSZWZzTWFwLmdldChvYmopOwotCQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQkJbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5wdXQob2JqLCBtYXApOwotCQkJfQotCQkJRU9iamVjdCBjb250YWluZXIgPSBvYmouZUNvbnRhaW5lcigpOwotCQkJRVJlZmVyZW5jZSBjb250YWlubWVudEZlYXR1cmUgPSBvYmouZUNvbnRhaW5tZW50RmVhdHVyZSgpOwotCQkJQ29sbGVjdGlvbiByZWZzID0gKENvbGxlY3Rpb24pIG1hcC5nZXQoY29udGFpbmVyKTsKLQkJCWlmIChyZWZzID09IG51bGwpIHsKLQkJCQlyZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlZnMuYWRkKGNvbnRhaW5tZW50RmVhdHVyZSk7Ci0JCQkJbWFwLnB1dChjb250YWluZXIsIHJlZnMpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIXJlZnMuY29udGFpbnMoY29udGFpbm1lbnRGZWF0dXJlKSkgewotCQkJCQlyZWZzLmFkZChjb250YWlubWVudEZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBhbGwgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZWxlbWVudDsKLQkJCQlNYXAgb2JqVG9SZWZzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlT2JqZWN0Ci0JCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBlT2JqID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUVSZWZlcmVuY2UgZVJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBmZWF0dXJlSXRlcmF0b3IKLQkJCQkJCQkuZmVhdHVyZSgpOwotCQkJCQlpZiAoZVJlZmVyZW5jZS5nZXRFT3Bwb3NpdGUoKSAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IHJlZnMgPSAoTGlzdCkgb2JqVG9SZWZzTWFwLmdldChlT2JqKTsKLQkJCQkJCWlmIChyZWZzID09IG51bGwpIHsKLQkJCQkJCQlyZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9ialRvUmVmc01hcC5wdXQoZU9iaiwgcmVmcyk7Ci0JCQkJCQl9Ci0JCQkJCQlyZWZzLmFkZChlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlNYXAgbWFwID0gKE1hcCkgZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuZ2V0KGVPYmplY3QpOwotCQkJCWlmIChtYXAgPT0gbnVsbCkgewotCQkJCQllbGVtZW50VG9SZW1vdmVkUmVmc01hcC5wdXQoZU9iamVjdCwgb2JqVG9SZWZzTWFwKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBtZXJnZSBvYmpUb1JlZnNNYXAgdG8gbWFwCi0JCQkJCS8vCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBvYmpUb1JlZnNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCQlDb2xsZWN0aW9uIHJlZnMgPSAoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCUNvbGxlY3Rpb24gZXhpc3RpbmdSZWZzID0gKENvbGxlY3Rpb24pIG1hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChleGlzdGluZ1JlZnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRvcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IHJlZiA9IChPYmplY3QpIGl0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoIWV4aXN0aW5nUmVmcy5jb250YWlucyhyZWYpKSB7Ci0JCQkJCQkJCQlleGlzdGluZ1JlZnMuYWRkKHJlZik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW1hcC5wdXQob2JqLCByZWZzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbGxlY3RlZE9iamVjdHMKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhpcyBjb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoQ29sbGVjdGlvbiBjb2xsZWN0ZWRPYmplY3RzLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIHRoaXMgc3BlY2lhbCBoYW5kbGluZyBpcyBubyBsb25nZXIgbmVlZGVkIHNpbmNlIGFmZmVjdGVkCi0JCS8vIHN1YmNhdGVnb3JpZXMgYXJlIGFkZGVkCi0JCS8vIHRvIHRoZSBsaXN0IG9mIGVsZW1lbnRzIHRvIGJlIGRlbGV0ZWQKLQkJLy8KLQkJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkvLyAvLyBoYXZlIHRvIGhhbmRsZSBDdXN0b21DYXRlZ29yeSBzcGVjaWFsbHkgc2luY2UgZGVsZXRpbmcgYQotCQkvLyAvLyBDdXN0b21DYXRlZ29yeSBtaWdodCB0cmlnZXIgZGVsZXRpbmcKLQkJLy8gLy8gaXRzIHN1YmNhdGVnb3JpZXMgZXZlbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBDdXN0b21DYXRlZ29yeQotCQkvLyBhbmQKLQkJLy8gLy8gaXRzIHN1YmNhdGVnb3JpZXMgaXMKLQkJLy8gLy8gbm9uLWNvbnRhaW5tZW50IHJlZmVyZW5jZQotCQkvLyAvLwotCQkvLyBJdGVyYXRvciBpdGVyMSA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlbGVtZW50LCBmYWxzZSkgewotCQkvLwotCQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNjI4NTk2OTkyMzEzODc4MTQzN0w7Ci0JCS8vIHByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gQ29sbGVjdGlvbiBjYXRFbGVtZW50cyA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkKLQkJLy8gLmdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNhdEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlID0gaXRlcmF0b3IubmV4dCgpOwotCQkvLyBpZiAoZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCS8vIGNoaWxkcmVuLmFkZChlKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIH07Ci0JCS8vIHdoaWxlIChpdGVyMS5oYXNOZXh0KCkpIHsKLQkJLy8gY29sbGVjdGVkT2JqZWN0cy5hZGQoaXRlcjEubmV4dCgpKTsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJTGlzdCBjb21tYW5kTGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQuY2xhc3MpOwotCQlpZiAoY29tbWFuZExpc3RlbmVycyAhPSBudWxsICYmICFjb21tYW5kTGlzdGVuZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY21kTGlzdGVuZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY21kTGlzdGVuZXIgaW5zdGFuY2VvZiBJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgewotCQkJCQl0cnkgewotCQkJCQkJKChJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcikgY21kTGlzdGVuZXIpCi0JCQkJCQkJCS5jb2xsZWN0T2JqZWN0c1RvRGVsZXRlQ29udGVudCgKLQkJCQkJCQkJCQljb2xsZWN0ZWRPYmplY3RzLCBlbGVtZW50KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChyZWZSZW1vdmVkKQotCQkJcmV0dXJuOwotCi0JCWlmIChyZW1vdmVkUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlyZW1vdmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZWRSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvUmVtb3ZlZFJlZnNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kRWxlbWVudCByZWZlcmVuY2VkID0gKE1ldGhvZEVsZW1lbnQpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGNhblJlbW92ZVJlZmVyZW5jZXMocmVmZXJlbmNlZCkpIHsKLQkJCQlNYXAgcmVtb3ZlZFJlZk1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlbW92ZWRSZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJRU9iamVjdCByZWZlcmVuY2VyID0gKEVPYmplY3QpIGVudC5nZXRLZXkoKTsKLQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9IChDb2xsZWN0aW9uKSBlbnQuZ2V0VmFsdWUoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcjEKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKChMaXN0KSByZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSkpOwotCi0JCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKHJlZmVyZW5jZWQpOwotCQkJCQkJCS8vIGxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQkJbGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQobmV3IFJlZmVyZW5jZShyZWZlcmVuY2VyLAotCQkJCQkJCQkJCWZlYXR1cmUsIHJlZmVyZW5jZWQsIGluZGV4KSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkJLnByaW50bG4oIkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLnJlbW92ZVJlZmVyZW5jZXMoKTogaW5kZXg9IiArIGluZGV4ICsgIiwgc2l6ZT0iICsgbGlzdC5zaXplKCkgKyAiLCByZWZlcmVuY2VyPSIgKyByZWZlcmVuY2VyICsgIiwgcmVmZXJlbmNlZD0iICsgcmVmZXJlbmNlZCArICIsIGZlYXR1cmU9IiArIGZlYXR1cmUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCQkJfQotCQkJCQkJCQkvLyB3b3JrLWFyb3VuZDogdHJ5IHRvIGZpbmQgdGhlIHByb3h5IGFuZCByZW1vdmUKLQkJCQkJCQkJLy8gaXQuCi0JCQkJCQkJCS8vIFRPRE86IGtpbmQgb2YgaGFjaywgbmVlZHMgcmV2aXNpdAotCQkJCQkJCQkvLwotCQkJCQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgcmVmZXJlbmNlZCkKLQkJCQkJCQkJCQkuZ2V0R3VpZCgpOwotCQkJCQkJCQlmaW5kX3Byb3h5OiBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJCUludGVybmFsRU9iamVjdCByZWYgPSAoSW50ZXJuYWxFT2JqZWN0KSBsaXN0Ci0JCQkJCQkJCQkJCS5nZXQoaSk7Ci0JCQkJCQkJCQlVUkkgdXJpID0gcmVmLmVQcm94eVVSSSgpOwotCQkJCQkJCQkJaWYgKHVyaSAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIGd1aWQuZXF1YWxzKHVyaS5mcmFnbWVudCgpKSkgewotCQkJCQkJCQkJCWxpc3QucmVtb3ZlKGkpOwotCQkJCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChuZXcgUmVmZXJlbmNlKAotCQkJCQkJCQkJCQkJcmVmZXJlbmNlciwgZmVhdHVyZSwKLQkJCQkJCQkJCQkJCXJlZmVyZW5jZWQsIGkpKTsKLQkJCQkJCQkJCQlicmVhayBmaW5kX3Byb3h5OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZWZlcmVuY2VyLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMuYWRkKG5ldyBSZWZlcmVuY2UocmVmZXJlbmNlciwKLQkJCQkJCQkJCWZlYXR1cmUsIHJlZmVyZW5jZWQsIC0xKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigicmVtb3ZlZFJlZmVyZW5jZXM6IHNpemU9IiArIHJlbW92ZWRSZWZlcmVuY2VzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWJhdGNoQ29tbWFuZC5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKS5jbGVhcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWYuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCkgewotCQkJCWJhdGNoQ29tbWFuZAotCQkJCQkJLmFkZEZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkJcmVmLmdldE93bmVyKCksCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFCi0JCQkJCQkJCQkJLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCQlpZiAocmVmLmdldE93bmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkvLyBGaWxsIGJsYW5rIHByZXNlbnRhdGlvbiBuYW1lIG9mIGV4dGVuZGVkL2xvY2FsbHkKLQkJCQkJLy8gY29udHJpYnV0aW5nIGFjdGl2aXR5IHdpdGggcHJlc2VudGF0aW9uIG5hbWUKLQkJCQkJLy8gZnJvbSBiYXNlIGFjdGl2aXR5IHdoZW4gYmFzZSBpcyBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgcmVmLmdldE93bmVyKCk7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZSB2VHlwZSA9IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQkJaWYgKCh2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyB8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKQotCQkJCQkJCSYmIFN0clV0aWwuaXNOdWxsKGFjdC5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSByZWYuZ2V0VmFsdWUoKTsKLQkJCQkJCWJhdGNoQ29tbWFuZAotCQkJCQkJCQkuYWRkRmVhdHVyZVZhbHVlKAotCQkJCQkJCQkJCWFjdCwKLQkJCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCQkJCQlQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoYmF0Y2hDb21tYW5kLmNhbkV4ZWN1dGUoKSkgewotCQkJYmF0Y2hDb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCi0JCXJlZlJlbW92ZWQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXNvbHZlIGFsbCB0YXJnZXQgZmVhdHVyZXMgc28KLQkgKiBvcHBvc2l0ZSBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBhcmUgZnVsbHkgbG9hZGVkLgotCSAqIAotCSAqIEBwYXJhbSBkZWxldGVkR1VJRHMKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywgU2V0IGRlbGV0ZWRHVUlEcykgewotCQkvLwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCByZXN0b3JlUmVmZXJlbmNlcyhMaXN0IHJlbW92ZWRSZWZlcmVuY2VzKSB7Ci0JCWZvciAoaW50IGkgPSByZW1vdmVkUmVmZXJlbmNlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJUmVmZXJlbmNlIHJlZiA9IChSZWZlcmVuY2UpIHJlbW92ZWRSZWZlcmVuY2VzLmdldChpKTsKLQkJCWlmIChyZWYuZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSByZWYub3duZXIuZUdldChyZWYuZmVhdHVyZSk7Ci0JCQkJaWYgKHJlZi5pbmRleCAhPSAtMSkgewotCQkJCQkvLyBUT0RPOiBuZWVkIHJldmlzaXRzCi0JCQkJCS8vCi0JCQkJCWlmICghbGlzdC5jb250YWlucyhyZWYudmFsdWUpKSB7Ci0JCQkJCQlpZiAocmVmLmluZGV4IDwgbGlzdC5zaXplKCkpIHsKLQkJCQkJCQlsaXN0LmFkZChyZWYuaW5kZXgsIHJlZi52YWx1ZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCQkucHJpbnRsbigiRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQucmVtb3ZlUmVmZXJlbmNlcygpOiBpbmRleD0iICsgcmVmLmluZGV4ICsgIiwgc2l6ZT0iICsgbGlzdC5zaXplKCkgKyAiLCByZWZlcmVuY2VyPSIgKyByZWYub3duZXIgKyAiLCByZWZlcmVuY2VkPSIgKyByZWYudmFsdWUgKyAiLCBmZWF0dXJlPSIgKyByZWYuZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJCX0KLQkJCQkJCQlsaXN0LmFkZChyZWYudmFsdWUpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQucmVtb3ZlUmVmZXJlbmNlcygpOiByZWZlcmVuY2UgYWxyZWFkeSBleGlzdHM6IHJlZmVyZW5jZXI9IiArIHJlZi5vd25lciArICIsIHJlZmVyZW5jZWQ9IiArIHJlZi52YWx1ZSArICIsIGZlYXR1cmU9IiArIHJlZi5mZWF0dXJlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCByZWYudmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVJlZmVyZW5jZXMoKSB7Ci0JCWlmICghcmVmUmVtb3ZlZCkKLQkJCXJldHVybjsKLQotCQliYXRjaENvbW1hbmQudW5kbygpOwotCQlyZXN0b3JlUmVmZXJlbmNlcyhyZW1vdmVkUmVmZXJlbmNlcyk7Ci0KLQkJcmVmUmVtb3ZlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCW5vdGlmeVByZVVuZG8oKTsKLQkJdHJ5IHsKLQkJCXN1cGVyLnVuZG8oKTsKLQkJCXJlc3RvcmVSZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQlub3RpZnlGYWlsdXJlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChleGVjdXRlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb21tYW5kTGlzdGVuZXIoQ29tbWFuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICghY29tbWFuZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCWNvbW1hbmRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbW1hbmRMaXN0ZW5lcihDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY29tbWFuZExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENvbW1hbmRMaXN0ZW5lciB7Ci0JCXZvaWQgbm90aWZ5RXhlY3V0ZWQoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpOwotCi0JCXZvaWQgbm90aWZ5RmFpbHVyZShFdmVudE9iamVjdCBldmVudE9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYgKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYgKCFlbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQluZXN0ZWRDb21tYW5kcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlOZXN0ZWRDb21tYW5kUHJvdmlkZXIgY21kUHJvdmlkZXIgPSAoSU5lc3RlZENvbW1hbmRQcm92aWRlcikgaXRlcgotCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLnJlbW92ZVJlbGF0ZWRPYmplY3RzKGVsZW1lbnRzLAotCQkJCQkJCQl0aGlzKTsKLQkJCQkJCWlmIChjbWQgIT0gbnVsbCAmJiBjbWQuY2FuRXhlY3V0ZSgpKSB7Ci0JCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCQluZXN0ZWRDb21tYW5kcy5hZGQoY21kKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3ROZXN0ZWRDb21tYW5kUmVzb3VyY2VzKFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCi0JCWlmIChuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIHJlc291cmNlcyA9ICgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjbWQpCi0JCQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKHJlc291cmNlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248RGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcnNUb0RlbGV0ZSgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0V4ZWN1dGVkKCkgewotCQlyZXR1cm4gZXhlY3V0ZWQ7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0Z1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0Z1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNjZmExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9GdWxseVJldmVydGlibGVDb21tYW5kU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLlN0cmluZ1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQSBjb21tYW5kIHN0YWNrIHRoYXQgdHJpZXMgaXRzIGJlc3QgdG8gZnVsbHkgcmV2ZXJ0IHRvIGl0cyBpbml0aWFsIHN0YXRlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRnVsbHlSZXZlcnRpYmxlQ29tbWFuZFN0YWNrIGV4dGVuZHMgQmFzaWNDb21tYW5kU3RhY2sgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUVycm9yUmVwb3J0ZXIgewotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgbXNnKTsKLQl9Ci0KLQlwcml2YXRlIElFcnJvclJlcG9ydGVyIGVyclJlcG9ydGVyOwotCi0JcHJpdmF0ZSBBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncjsKLQotCXB1YmxpYyBGdWxseVJldmVydGlibGVDb21tYW5kU3RhY2soQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJdGhpcy5hY3Rpb25NZ3IgPSBhY3Rpb25NZ3I7Ci0JfQotCi0JcHVibGljIEZ1bGx5UmV2ZXJ0aWJsZUNvbW1hbmRTdGFjayhBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUlFcnJvclJlcG9ydGVyIGVyclJlcG9ydGVyKSB7Ci0JCXRoaXMoYWN0aW9uTWdyKTsKLQkJdGhpcy5lcnJSZXBvcnRlciA9IGVyclJlcG9ydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yUmVwb3J0ZXIoSUVycm9yUmVwb3J0ZXIgZXJyUmVwb3J0ZXIpIHsKLQkJdGhpcy5lcnJSZXBvcnRlciA9IGVyclJlcG9ydGVyOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJBc01vZGlmaWVyKENvbW1hbmQgY29tbWFuZCkgewotCQlTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gVG5nVXRpbC5nZXRNb2RpZmllZFJlc291cmNlcyhjb21tYW5kKTsKLQkJaWYoIW1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghKHJlc291cmNlIGluc3RhbmNlb2YgU3RyaW5nUmVzb3VyY2UpKQotCQkJCQlhY3Rpb25NZ3IucmVnaXN0ZXJBc01vZGlmaWVyT2YocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZG9FeGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAoIWNvbW1hbmQuY2FuVW5kbygpKQotCQkJcmV0dXJuIGZhbHNlOyAvLyB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3QKLQkJLy8gZXhlY3V0ZSBjb21tYW5kIHRoYXQgY2Fubm90IGRlIHVuZG9uZSIpOwotCQlzdXBlci5leGVjdXRlKGNvbW1hbmQpOwotCQkKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgQWN0aXZpdHlEcm9wQ29tbWFuZAotCQkvLwotCQkvLyBUT0RPOiBhbGwgY29tbWFuZHMgbXVzdCByZXR1cm4gYSBjb3JyZWN0IHZhbHVlIGluIGdldEFmZmVjdGVkT2JqZWN0KCkKLQkJLy8gaWYgZ2V0QWZmZWN0ZWRPYmplY3QoKSByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbiwgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JCS8vIHdpbGwgbm90IHJlZ2lzdGVyIGl0IGFzIGEgbW9kaWZpZXIgb2YgdGhlIHJlc291cmNlcyByZXR1cm5lZCBieSBnZXRNb2RpZmllZFJlc291cmNlcygpCi0JCS8vIGFuZCB0aGUgZWRpdG9yIG1pZ2h0IG5vdCBiZSBtYXJrZWQgZGlydHkgYXMgdGhlIHJlc3VsdC4KLQkJLy8KLQkJaWYoY29tbWFuZCBpbnN0YW5jZW9mIEJTRHJhZ0FuZERyb3BDb21tYW5kICYmIGNvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQlpZih0b3AgIT0gLTEpIHsKLQkJCQljb21tYW5kTGlzdC5yZW1vdmUodG9wLS0pOwotCQkJCWlmKHRvcCAhPSAtMSkgewotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW1vc3RSZWNlbnRDb21tYW5kID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmV0ID0gZ2V0TW9zdFJlY2VudENvbW1hbmQoKSAhPSBudWxsOwotCQlpZiAocmV0ICYmIGFjdGlvbk1nciAhPSBudWxsKSB7CQkJCi0JCQlyZWdpc3RlckFzTW9kaWZpZXIoY29tbWFuZCk7Ci0JCX0KLQkJbm90aWZ5TGlzdGVuZXJzKG5ldyBDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQodGhpcywKLQkJCQlDb21tYW5kU3RhY2tDaGFuZ2VkRXZlbnQuRVhFQ1VURUQpKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlkb0V4ZWN1dGUoY29tbWFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJc3VwZXIucmVkbygpOwotCQlub3RpZnlMaXN0ZW5lcnMobmV3IENvbW1hbmRTdGFja0NoYW5nZWRFdmVudCh0aGlzLAotCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5FWEVDVVRFRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChjYW5VbmRvKCkpIHsKLQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wLS0pOwotCQkJdHJ5IHsKLQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJLmdldFN0cmluZygiX1VJX0lnbm9yZUV4Y2VwdGlvbl9leGNlcHRpb24iKSwgZXhjZXB0aW9uKS5maWxsSW5TdGFja1RyYWNlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJdG9wKys7Ci0KLQkJCQlpZiAoZXJyUmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQlPYmplY3RbXSBvYmplY3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJCQlvYmplY3RbMF0gPSBjb21tYW5kOwotCQkJCQlvYmplY3RbMV0gPSBleGNlcHRpb247Ci0JCQkJCWVyclJlcG9ydGVyLnNob3dFcnJvcihOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bmRvQ29tbWFuZEVycm9yX21zZywgb2JqZWN0KSk7IAotCQkJCX0KLQkJCX0KLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1bmRvQWxsKCkgewotCQl0cnkgewotCQkJd2hpbGUgKGNhblVuZG8oKSkgewotCQkJCUNvbW1hbmQgY29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQodG9wLS0pOwotCQkJCXRyeSB7Ci0JCQkJCWNvbW1hbmQudW5kbygpOwotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IGNvbW1hbmQ7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmxvZyhuZXcgV3JhcHBlZEV4Y2VwdGlvbigKLQkJCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfSWdub3JlRXhjZXB0aW9uX2V4Y2VwdGlvbiIpLCBleGNlcHRpb24pLmZpbGxJblN0YWNrVHJhY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQltb3N0UmVjZW50Q29tbWFuZCA9IG51bGw7Ci0JCQkJCXRvcCsrOwotCi0JCQkJCWlmIChlcnJSZXBvcnRlciAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlcnJSZXBvcnRlci5zaG93RXJyb3IoIkNhbm5vdCB1bmRvIGNvbW1hbmQ6ICciICsKLQkJCQkJCS8vIGNvbW1hbmQgKyAiJywgZXhjZXB0aW9uOiAiICsgZXhjZXB0aW9uKTsKLQkJCQkJCU9iamVjdFtdIG9iamVjdCA9IG5ldyBPYmplY3RbMV07Ci0JCQkJCQlvYmplY3RbMF0gPSBjb21tYW5kOwotCQkJCQkJb2JqZWN0WzFdID0gZXhjZXB0aW9uOwotCQkJCQkJZXJyUmVwb3J0ZXIKLQkJCQkJCQkJLnNob3dFcnJvcihOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bmRvQ29tbWFuZEVycm9yX21zZywgb2JqZWN0KSk7IAotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJCUNvbW1hbmRTdGFja0NoYW5nZWRFdmVudC5VTkRPX0FMTCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCSgoQ29tbWFuZFN0YWNrTGlzdGVuZXIpIGkubmV4dCgpKS5jb21tYW5kU3RhY2tDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUxpc3RlbmVycygpIHsKLQkJLy8KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQlzdXBlci5zYXZlSXNEb25lKCk7Ci0JCW5vdGlmeUxpc3RlbmVycyhuZXcgQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50KHRoaXMsCi0JCQkJQ29tbWFuZFN0YWNrQ2hhbmdlZEV2ZW50LlNBVkVEKSk7Ci0JCWNvbW1hbmRMaXN0LmNsZWFyKCk7Ci0JCXRvcCA9IC0xOwotCQlzYXZlSW5kZXggPSAtMTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjayNpc1NhdmVOZWVkZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzU2F2ZU5lZWRlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lBY3Rpb25NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmMDdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSUFjdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY2xhc3MgaXMgdXNlZCB0byBzdXBwb3J0IHVuZG8gb3BlcmF0aW9ucyBpbiB0aGUKLSAqIGZvcm0gZWRpdG9ycy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVQgPSBOb3RpZmljYXRpb24uU0VUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREID0gTm90aWZpY2F0aW9uLkFERDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IE5vdGlmaWNhdGlvbi5SRU1PVkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfTUFOWSA9IE5vdGlmaWNhdGlvbi5BRERfTUFOWTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9NQU5ZID0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOwotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGFjdGlvbiBhcyBkZXNjcmliZWQgaW4gcGFyYW1ldGVycwotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25UeXBlCi0JICogICAgICAgICAgICBvbmUgb2YgdGhlIGFib3ZlIGRlZmluZWQgYWN0aW9uIGNvbnN0YW50cwotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gcGVyZm9ybSBhY3Rpb24gdXBvbgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byBiZSBtb2RpZmllZAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGZlYXR1cmUgdmFsdWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHNwZWNpZnkgLTEgaWYgbm8gaW5kZXgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHN1Y2Nlc3NmdWxsLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZQotCSAqLwotCWJvb2xlYW4gZG9BY3Rpb24oaW50IGFjdGlvblR5cGUsIEVPYmplY3Qgb2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBjb21tYW5kCi0JICogCi0JICogQHBhcmFtIGNtZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgc3VjY2Vzc2Z1bGwsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBleGVjdXRlKElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQpOwotCi0Jdm9pZCB1bmRvKCk7Ci0KLQl2b2lkIHJlZG8oKTsKLQotCWJvb2xlYW4gdW5kb0FsbCgpOwotCi0Jdm9pZCBzYXZlSXNEb25lKCk7Ci0KLQlib29sZWFuIGlzU2F2ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogR2V0cyByZXNvdXJjZXMgZmlyc3QgbW9kaWZpZWQgYnkgdGhpcyBhY3Rpb24gbWFuYWdlcgotCSAqLwotCUNvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQotCXZvaWQgZGlzcG9zZSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwNzEyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29tbWFuZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lciBleHRlbmRzIElDb21tYW5kTGlzdGVuZXIgewotCS8qKgotCSAqIENvbGxlY3RzIG9iamVjdHMgd2hvc2UgY29udGVudCBtdXN0IGJlIGRlbGV0ZWQgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgZGVsZXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29sbGVjdGVkT2JqZWN0cwotCSAqIEBwYXJhbSBlbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBkZWxldGVkLgotCSAqLwotCXZvaWQgY29sbGVjdE9iamVjdHNUb0RlbGV0ZUNvbnRlbnQoQ29sbGVjdGlvbiBjb2xsZWN0ZWRPYmplY3RzLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpOwkKLQotCS8qKgotCSAqIENvbGxlY3RzIG9iamVjdHMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZCBpZiA8Y29kZT5lbGVtZW50VG9EZWxldGU8L2NvZGU+IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIAotCSAqIDxjb2RlPnJlZmVyZW5jZXM8L2NvZGU+IG9mIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzVG9SZW1vdmUgb3V0cHV0IAotCSAqIEBwYXJhbSByZWZlcmVuY2VyIGVsZW1lbnQgdGhhdCByZWZlcmVuY2VzIHRvIGVsZW1lbnRUb0RlbGV0ZQotCSAqIEBwYXJhbSByZWZlcmVuY2VzIGNvbGxlY3Rpb24gb2Yge0BsaW5rIEVSZWZlcmVuY2V9IHRoYXQgY29udGFpbnMgZWxlbWVudFRvRGVsZXRlCi0JICogQHJldHVybiB0cnVlIGlmIG9uZSBvZiB0aGUgY29sbGVjdGVkIG9iamVjdHMgaXMgdGhlIDxjb2RlPnJlZmVyZW5jZXI8L2NvZGU+IG9yIGNvbnRhaW5lciBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gY29sbGVjdE9iamVjdHNUb1JlbW92ZShDb2xsZWN0aW9uIG9iamVjdHNUb1JlbW92ZSwgRU9iamVjdCBlbGVtZW50VG9EZWxldGUsIEVPYmplY3QgcmVmZXJlbmNlciwgQ29sbGVjdGlvbiByZWZlcmVuY2VzKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lJbnRlcmFjdGl2ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lJbnRlcmFjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2IxYzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JSW50ZXJhY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAzLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnRlcmFjdGl2ZSB7Ci0Jdm9pZCBzZXRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIGhhbmRsZXIpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lNb2RpZnlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU1vZGlmeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiNDQ5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSU1vZGlmeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNb2RpZnlDb21tYW5kIHsKLQkKLQlDb2xsZWN0aW9uIGdldE1vZGlmaWVkT2JqZWN0cygpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lOZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9JTmVzdGVkQ29tbWFuZFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODk3ODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lOZXN0ZWRDb21tYW5kUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci0KLS8qKgotICogUHJvdmlkZXMgbmVzdGVkIGNvbW1hbmRzIHRvIGV4ZWN1dGUgcmlnaHQgYWZ0ZXIgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgbWFpbiBjb21tYW5kCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTmVzdGVkQ29tbWFuZFByb3ZpZGVyIHsKLQlDb21tYW5kIGNyZWF0ZVJlbGF0ZWRPYmplY3RzKENvbGxlY3Rpb248Pz4gY3JlYXRlZEVsZW1lbnRzLCBDb21tYW5kIGNyZWF0ZUNvbW1hbmQpOwotCUNvbW1hbmQgcmVtb3ZlUmVsYXRlZE9iamVjdHMoQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMsIENvbW1hbmQgZGVsZXRlQ29tbWFuZCk7Ci0JQ29tbWFuZCBjcmVhdGVOZXN0ZWRDb21tYW5kKENvbW1hbmQgY29tbWFuZCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVJlc291cmNlQXdhcmVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVJlc291cmNlQXdhcmVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNTBkNjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lSZXNvdXJjZUF3YXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByZXNvdXJjZSBhd2FyZSBjb21tYW5kLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQgewotCi0JQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5MTk1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gaGFuZGxlIHVzZXIgaW50ZXJhY3Rpb25zIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAzLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgewotCS8qKgotCSAqIERlbGl2ZXJzIG1lc3NhZ2VzIHRvIHVzZXJzCi0JICogCi0JICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjYsIDIwMDYKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSU1lc3NlbmdlciB7Ci0JCS8qKgotCQkgKiBTaG93cyBpbmZvcm1hdGlvbiBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCi0JCS8qKgotCQkgKiBTaG93cyB3YXJuaW5nIG1lc3NhZ2UKLQkJICogCi0JCSAqIEBwYXJhbSB0aXRsZQotCQkgKiBAcGFyYW0gbXNnCi0JCSAqLwotCQl2b2lkIHNob3dXYXJuaW5nKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIHdhcm5pbmcgbWVzc2FnZSB3aXRoIHJlYXNvbgotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHN0cmluZwotCQkgKi8KLQkJdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pOwotCi0JCS8qKgotCQkgKiBTaG93cyBlcnJvciBtZXNzYWdlCi0JCSAqIAotCQkgKiBAcGFyYW0gdGl0bGUKLQkJICogQHBhcmFtIG1zZwotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCQkvKioKLQkJICogU2hvd3MgZXJyb3IgbWVzc2FnZSB3aXRoIHN0YXR1cwotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHN0YXR1cwotCQkgKi8KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBJU3RhdHVzIHN0YXR1cyk7Ci0KLQkJLyoqCi0JCSAqIFNob3dzIGVycm9yIG1lc3NhZ2Ugd2l0aCByZWFzb24gYW5kIGV4Y2VwdGlvbgotCQkgKiAKLQkJICogQHBhcmFtIHRpdGxlCi0JCSAqIEBwYXJhbSBtc2cKLQkJICogQHBhcmFtIHJlYXNvbgotCQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JCSAqLwotCQl2b2lkIHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24sCi0JCQkJRXhjZXB0aW9uIGV4Y2VwdGlvbik7Ci0KLQkJdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywKLQkJCQlFeGNlcHRpb24gZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBY3Rpb24gY29uc3RhbnQgZm9yIHVzZXIgYWNjZXB0YW5jZQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX09LID0gMDsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgdXNlciBjYW5jZWxsYXRpb24KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9DQU5DRUwgPSAxOwotCi0JLyoqCi0JICogQWN0aW9uIGNvbnN0YW50IGZvciByZXRyeQotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX1JFVFJZID0gMjsKLQotCS8qKgotCSAqIEFjdGlvbiBjb25zdGFudCBmb3IgYWJvcnQKLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9BQk9SVCA9IDM7Ci0JCi0Jc3RhdGljIGZpbmFsIGludCBBQ1RJT05fWUVTID0gNDsKLQkKLQlzdGF0aWMgZmluYWwgaW50IEFDVElPTl9OTyA9IDU7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIG9iamVjdHMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3QgPGNvZGU+b2JqZWN0c1RvU2VsZWN0PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0c1RvU2VsZWN0Ci0JICogICAgICAgICAgICBvYmplY3RzIGZvciB1c2VyIHRvIHNlbGVjdAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyCi0JICogICAgICAgICAgICBsYWJlbCBwcm92aWRlciB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIG9iamVjdHMgdG8gdXNlcgotCSAqIEBwYXJhbSBtdWx0aXBsZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb24sIHNpbmdsZQotCSAqICAgICAgICAgICAgc2VsZWN0aW9uIGlmIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIEBwYXJhbSB0aXRsZQotCSAqICAgICAgICAgICAgdGhlIHRpdGxlIG9mIHRoaXMgc2VsZWN0aW9uIGFjdGlvbiB0byBkaXNwbGF5IHRvIHVzZXIKLQkgKiBAcGFyYW0gbXNnCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBkaXNwbGF5IHRvIHVzZXIKLQkgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGVsZW1lbnRzLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlIHNlbGVjdGlvbiB3YXMgY2FuY2VsZWQuCi0JICovCi0JTGlzdCBzZWxlY3QoTGlzdCBvYmplY3RzVG9TZWxlY3QsIElJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkJYm9vbGVhbiBtdWx0aXBsZSwgTGlzdCBpbnRpdGlhbFNlbGVjdGlvbiwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKTsKLQotCS8qKgotCSAqIFNlbGVjdHMgb25seSBvbmUgYWN0aW9uIGZyb20gdGhlIGdpdmVuIGFycmF5IG9mIGFjdGlvbnMuIFRoZSBhY3Rpb25zIG11c3QKLQkgKiBiZSB0aGUgY29uc3RhbnRzIHtAbGluayAjQUNUSU9OX0FCT1JUfSwge0BsaW5rICNBQ1RJT05fQ0FOQ0VMfSwKLQkgKiB7QGxpbmsgI0FDVElPTl9PS30sIHtAbGluayAjQUNUSU9OX1JFVFJZfSwgQUNUSU9OX1hYWAotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25zCi0JICogQHBhcmFtIHRpdGxlCi0JICogQHBhcmFtIG1zZwotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiBAcmV0dXJuCi0JICovCi0JaW50IHNlbGVjdE9uZShpbnRbXSBhY3Rpb25zLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKTsKLQotCS8qKgotCSAqIFJlcXVlc3RzIHVzZXIgaW5wdXRzLgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqIEBwYXJhbSBtc2cKLQkgKiBAcGFyYW0gdXNlcklucHV0cwotCSAqICAgICAgICAgICAgbGlzdCBvZiB7QGxpbmsgVXNlcklucHV0IHVzZXIgaW5wdXRzfSB0aGF0IGhhdmUgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIGFib3V0IGlucHV0IHJlcXVlc3RzIGFuZCByZWZlcmVuY2UgdG8gdGhlIGlucHV0LiBUaGUgaW5wdXQKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBvYmplY3QgdGhhdCB1c2VyIHNwZWNpZmllZCBvcgotCSAqICAgICAgICAgICAgc2VsZWN0ZWQuCi0JICogQHJldHVybiBmYWxzZSBpZiB1c2VyIGNhbmNlbGxlZCB0aGlzIHJlcXVlc3QKLQkgKi8KLQlib29sZWFuIHJlcXVlc3RJbnB1dChTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIExpc3Q8VXNlcklucHV0PiB1c2VySW5wdXRzKTsKLQotCS8qKgotCSAqIEdldHMgVUkgY29udGV4dAotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVJIGNvbnRleHQKLQkgKi8KLQlPYmplY3QgZ2V0VUlDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXNzZW5nZXIKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSU1lc3NlbmdlciBnZXRNZXNzZW5nZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50QWRkQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYzM5YjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRBZGRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2UuTGl0ZXJhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVRleHRSZWZlcmVuY2VSZXBsYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlVuaXF1ZW5lc3NWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gYWRkIGEgbWV0aG9kIGVsZW1lbnQgdG8gYSBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kIGV4dGVuZHMgQ29tbWFuZFdyYXBwZXIgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEVDbGFzcywgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+PiB0eXBlVG9FeGNsdWRlZEZlYXR1cmVzRnJvbUNoZWNrID0gbmV3IEhhc2hNYXA8RUNsYXNzLCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+KCk7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGV4Y2x1ZGVGcm9tQ2hlY2soRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUNvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IHR5cGVUb0V4Y2x1ZGVkRmVhdHVyZXNGcm9tQ2hlY2suZ2V0KHR5cGUpOwotCQlpZihmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlmZWF0dXJlcyA9IG5ldyBIYXNoU2V0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJfQotCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuVW5kbyA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgQWRkQ29tbWFuZCBhZGRDb21tYW5kOwotCi0JLy8gcHJvdGVjdGVkIE1hcCBlbGVtZW50VG9OZXdOYW1lTWFwOwotCXByb3RlY3RlZCBNYXAgZWxlbWVudFRvT2xkUGx1Z2luTWFwOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlWFJlZlJlcXVpcmVkOwotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbjsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgYWRkTGlzdDsKLQotCXByb3RlY3RlZCBNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3M7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXNUb0NoZWNrOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgbmVzdGVkQ29tbWFuZHM7Ci0KLQlwcml2YXRlIEhhc2hTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMoY29tbWFuZCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JCWFkZENvbW1hbmQgPSAoQWRkQ29tbWFuZCkgVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCXNldFJ1bldpdGhQcm9ncmVzcyhydW5XaXRoUHJvZ3Jlc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJ1bldpdGhQcm9ncmVzcyhib29sZWFuIHJ1bldpdGhQcm9ncmVzcykgewotCQl0aGlzLnJ1bldpdGhQcm9ncmVzcyA9IHJ1bldpdGhQcm9ncmVzczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKCkgewotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXJyb3IoSVN0YXR1cyBlcnJvclN0YXR1cykgewotCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKGdldExhYmVsKCksIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNyZWF0ZUVsZW1lbnRFcnJvcl9tc2csIGVycm9yU3RhdHVzKTsKLQkJc3RhdHVzLmFkZChlcnJvclN0YXR1cyk7Ci0JCXN0YXR1cy5hZGRBbGwoZXJyb3JTdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CQotCQkvLyBkaXNwb3NlIHRoZSBuZXN0ZWQgY29tbWFuZHMKLQkJaWYgKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCXRyeSB7Ci0JCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlPYmplY3Qgc2hlbGwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpOwotCQkvLyBDaGVjayB3aGV0aGVyIHRoZSBvd25lciByZXNvdXJjZSBjYW4gYmUgbW9kaWZpZWQuCi0JCS8vCi0JCUNvbGxlY3Rpb24gcmVzb3VyY2VzVG9DaGFuZ2UgPSBnZXRNb2RpZmllZFJlc291cmNlcygpOwotCQlJU3RhdHVzIGV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJcmVzb3VyY2VzVG9DaGFuZ2UsIHNoZWxsKTsKLQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJaGFuZGxlRXJyb3IoZXhlY1N0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZXhlY1N0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0NvbmZpZ3VyYXRpb25zVG9VcGRhdGUoCi0JCQkJYWRkQ29tbWFuZCwgc2hlbGwpOwotCQlpZiAoIWV4ZWNTdGF0dXMuaXNPSygpKSB7Ci0JCQloYW5kbGVFcnJvcihleGVjU3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAod2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpCi0JCQkJJiYgIVVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja091dE9mU3luY2gocmVzb3VyY2VzVG9DaGFuZ2UpKSB7Ci0JCQlzdGF0dXMuYWRkKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmKCFjaGVja0ZvbGRlcihzaGVsbCkpIHsKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLQkJZG9BZGQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlciN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQl1bmRvTmVzdGVkQ29tbWFuZHMoKTsKLQkJc3VwZXIudW5kbygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCWlmIChuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoY21kLmNhblVuZG8oKSkgewotCQkJCQkJY21kLnVuZG8oKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJY21kLmRpc3Bvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tGb2xkZXIoT2JqZWN0IHNoZWxsKSB7Ci0JCS8vIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgdG8gYmUgYWRkZWQgd2lsbCBiZSBzYXZlZCBpbiBpdHMgb3duIGZpbGUKLQkJLy8gY2hlY2sgaWYgdGhlIGZvbGRlciB0byBzYXZlIHRoZSBmaWxlIHRvIGNhbiBiZSBtb2RpZmllZAotCQkvLwotCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIFNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpOwotCQlBcnJheUxpc3QgZm9sZGVyc1RvQ2hlY2sgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJJiYgcGVyc2lzdGVyLmhhc093blJlc291cmNlKGVsZW1lbnQpKSB7Ci0JCQkJU3RyaW5nIGZvbGRlciA9IHBlcnNpc3Rlci5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoCi0JCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZAotCQkJCQkJLmdldE93bmVyKCkpOwotCQkJCVN0cmluZyBiYXNlRm9sZGVyID0gbnVsbDsKLQkJCQlpZiAocGx1Z2luID09IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoYWRkQ29tbWFuZAotCQkJCQkJCS5nZXRPd25lcigpKTsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmFzZUZvbGRlciA9IG5ldyBGaWxlKHBsdWdpbi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCWZvbGRlcnNUb0NoZWNrLmFkZChiYXNlRm9sZGVyICsgRmlsZS5zZXBhcmF0b3IgKyBmb2xkZXIpOwotCQkJfQotCQl9Ci0JCWlmICghZm9sZGVyc1RvQ2hlY2suaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBmb2xkZXJzID0gbmV3IFN0cmluZ1tmb2xkZXJzVG9DaGVjay5zaXplKCldOwotCQkJZm9sZGVyc1RvQ2hlY2sudG9BcnJheShmb2xkZXJzKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU2VydmljZXMuZ2V0RmlsZU1hbmFnZXIoKQotCQkJCQkuY2hlY2tNb2RpZnkoZm9sZGVycywgc2hlbGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJaGFuZGxlRXJyb3Ioc3RhdHVzKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01vdmUoKSB7Ci0JCUNvbW1hbmQgY21kID0gVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCWlmIChjbWQgaW5zdGFuY2VvZiBBZGRDb21tYW5kKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFkZENvbW1hbmQpIGNtZCkuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG93bmVyUGx1Z2luCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMgdGhhdCBrZWVwcyB0aGUgaW5mbyBvZiBpbGxlZ2FsIG91dGdvaW5nCi0JICogICAgICAgICByZWZlcmVuY2VzCi0JICogQHNlZSBSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVmZXJlbmNlPiBnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBFT2JqZWN0IGUsIENvbGxlY3Rpb248UmVmZXJlbmNlPiBpbGxlZ2FsUmVmZXJlbmNlcykgewotCQlpZiAoaWxsZWdhbFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJaWxsZWdhbFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0PFJlZmVyZW5jZT4oKTsKLQkJfQotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjxFT2JqZWN0PiBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yPEVPYmplY3Q+KSBlCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGZlYXR1cmVJdGVyYXRvci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0JCQlpZiAoIWZlYXR1cmUuaXNEZXJpdmVkKCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iamVjdCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YocGx1Z2luLCBvd25lclBsdWdpbikpIHsKLQkJCQkJLy8gaWxsZWdhbCByZWZlcmVuY2UgdG8gYmUgcmVtb3ZlZAotCQkJCQkvLwotCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcwotCQkJCQkJCS5hZGQobmV3IFJlZmVyZW5jZShlLCBmZWF0dXJlLCBlT2JqZWN0LCAtMSkpOwotCQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJCQlmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQkJaWxsZWdhbFJlZmVyZW5jZXMKLQkJCQkJCQkuYWRkKG5ldyBSZWZlcmVuY2UoZSwgZmVhdHVyZSwgZS5lR2V0KGZlYXR1cmUpLCAtMSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbGxlZ2FsUmVmZXJlbmNlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoQ29sbGVjdGlvbjxSZWZlcmVuY2U+IHJlZmVyZW5jZXMpIHsKLQkJZm9yIChSZWZlcmVuY2UgcmVmOiByZWZlcmVuY2VzKSB7Ci0JCQlpZiAocmVmLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlMaXN0PD8+IGxpc3QgPSAoKExpc3Q8Pz4pIHJlZi5vd25lci5lR2V0KHJlZi5mZWF0dXJlKSk7Ci0JCQkJbGlzdC5yZW1vdmUocmVmLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVmZXJlbmNlPiByZW1vdmVJbGxlZ2FsUmVmZXJlbmNlcyhNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sCi0JCQlFT2JqZWN0IGUpIHsKLQkJQ29sbGVjdGlvbjxSZWZlcmVuY2U+IHJlbW92ZVJlZnMgPSBnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKG93bmVyUGx1Z2luLCBlLAotCQkJCW51bGwpOwotCi0JCS8vIHJlbW92ZSBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJLy8KLQkJcmVtb3ZlUmVmZXJlbmNlcyhyZW1vdmVSZWZzKTsKLQotCQlyZXR1cm4gcmVtb3ZlUmVmczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc05leHQoSXRlcmF0b3IgaXRlcikgewotCQl0cnkgewotCQkJcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBleDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbGxlZ2FsUmVmZXJlbmNlKE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwKLQkJCUVPYmplY3QgZSwgQ29sbGVjdGlvbiBtb3ZlTGlzdCkgewotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBoYXNOZXh0KGZlYXR1cmVJdGVyYXRvcik7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQotCQkJLy8gY2hlY2sgaWYgdGhlIHgtcmVmIG9iamVjdCBpcyBpbiB0aGUgbW92ZSBsaXN0Ci0JCQkvLwotCQkJaWYgKCFtb3ZlTGlzdC5jb250YWlucyhlT2JqZWN0KSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlT2JqZWN0KTsKLQkJCQlpZiAocGx1Z2luICE9IG51bGwgJiYgcGx1Z2luICE9IG93bmVyUGx1Z2luCi0JCQkJCQkmJiAhTWlzYy5pc0Jhc2VPZihwbHVnaW4sIG93bmVyUGx1Z2luKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBpcyByZWZlcmVuY2VkIGlsbGVnYWxseSBhZnRlciB0aGUgbW92ZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJQbHVnaW4KLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBtb3ZlTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkSWxsZWdhbGx5KE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbiwKLQkJCU1ldGhvZEVsZW1lbnQgZSwgQ29sbGVjdGlvbiBtb3ZlTGlzdCkgewotCQlDb2xsZWN0aW9uIHJlZmVyZW5jZXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRSZWZlcmVuY2VzKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKGVsZW1lbnQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICghbW92ZUxpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIHBsdWdpbiAhPSBvd25lclBsdWdpbgotCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2Yob3duZXJQbHVnaW4sIHBsdWdpbikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KEVPYmplY3QgZWxlbWVudCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFRuZ1V0aWwuY2hlY2tFZGl0KGVsZW1lbnQsIG51bGwpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXRocm93IG5ldyBNZXNzYWdlRXhjZXB0aW9uKFRuZ1V0aWwuZ2V0TWVzc2FnZShzdGF0dXMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiByZW1vdmVJbGxlZ2FsUmVmZXJlbmNlc1RvKAotCQkJTWV0aG9kUGx1Z2luIG93bmVyUGx1Z2luLCBNZXRob2RFbGVtZW50IGUsIENvbGxlY3Rpb24gbW92ZUxpc3QpIHsKLQkJQXJyYXlMaXN0IGFmZmVjdGVkUmVmZXJlbmNlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gcmVmZXJlbmNlcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlZmVyZW5jZXMoZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW1vdmVMaXN0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCAmJiBwbHVnaW4gIT0gb3duZXJQbHVnaW4KLQkJCQkJCSYmICFNaXNjLmlzQmFzZU9mKG93bmVyUGx1Z2luLCBwbHVnaW4pKSB7Ci0JCQkJCWNoZWNrTW9kaWZ5KGVsZW1lbnQpOwotCQkJCQlyZW1vdmVSZWZlcmVuY2VzKGVsZW1lbnQsIGUpOwotCQkJCQlhZmZlY3RlZFJlZmVyZW5jZXJzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFmZmVjdGVkUmVmZXJlbmNlcnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgY3Jvc3MgcmVmZXJlbmNlcyBvZiA8Y29kZT5yZWZlcmVuY2VyPC9jb2RlPiB0bwotCSAqIDxjb2RlPnJlZmVyZW5jZWQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHJlZmVyZW5jZXIKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZAotCSAqIEBwYXJhbSB4UmVmZXJlbmNlcwotCSAqICAgICAgICAgICAgb3V0cHV0IGNvbGxlY3Rpb24gb2YgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdHMKLQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgRVN0cnVjdHVyYWxGZWF0dXJlIG9iamVjdHMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGdldFhSZWZlcmVuY2VzKEVPYmplY3QgcmVmZXJlbmNlciwKLQkJCUVPYmplY3QgcmVmZXJlbmNlZCwgQ29sbGVjdGlvbiB4UmVmZXJlbmNlcykgewotCQlpZiAoeFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJeFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgcmVmZXJlbmNlcgotCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCQkJLy8gaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJLy8gaWYoKChMaXN0KXJlZmVyZW5jZXIuZUdldChmZWF0dXJlKSkuY29udGFpbnMocmVmZXJlbmNlZCkpIHsKLQkJCS8vIHhSZWZlcmVuY2VzLmFkZChmZWF0dXJlKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCS8vIGVsc2UKLQkJCWlmIChlT2JqZWN0ID09IHJlZmVyZW5jZWQpIHsKLQkJCQl4UmVmZXJlbmNlcy5hZGQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhSZWZlcmVuY2VzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byA8Y29kZT5yZWZlcmVuY2VkPC9jb2RlPiBmcm9tCi0JICogPGNvZGU+cmVmZXJlbmNlcjwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcmVmZXJlbmNlcgotCSAqIEBwYXJhbSByZWZlcmVuY2VkCi0JICogQHJldHVybiBDb2xsZWN0aW9uIG9mIHJlZmVyZW5jZXMgdG8gdGhlIDxjb2RlPnJlZmVyZW5jZWQ8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIHJlbW92ZVJlZmVyZW5jZXMoRU9iamVjdCByZWZlcmVuY2VyLAotCQkJRU9iamVjdCByZWZlcmVuY2VkKSB7Ci0JCUNvbGxlY3Rpb24gcmVtb3ZlUmVmcyA9IGdldFhSZWZlcmVuY2VzKHJlZmVyZW5jZXIsIHJlZmVyZW5jZWQsIG51bGwpOwotCi0JCS8vIHJlbW92ZSBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlUmVmcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgcmVmZXJlbmNlci5lR2V0KGYpKS5yZW1vdmUocmVmZXJlbmNlZCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlZmVyZW5jZXIuZVNldChmLCBudWxsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZW1vdmVSZWZzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNJbGxlZ2FsUmVmZXJlbmNlSW5jbHVkaW5nQWxsQ2hpbGRyZW4oCi0JCQlNZXRob2RQbHVnaW4gb3duZXJQbHVnaW4sIE1ldGhvZEVsZW1lbnQgZSwgQ29sbGVjdGlvbiBtb3ZlTGlzdCkgewotCQlpZiAob3duZXJQbHVnaW4gPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSkpIHsKLQkJCS8vIG1vdmUgd2l0aGluIHRoZSBzYW1lIHBsdWdpbiwgbm8gZnVydGhlciBjaGVjawotCQkJLy8KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZShvd25lclBsdWdpbiwgZSwgbW92ZUxpc3QpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlLmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZShvd25lclBsdWdpbiwgKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKSwKLQkJCQkJbW92ZUxpc3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdXBlckV4ZWN1dGUoKSB7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBnZXRGZWF0dXJlc1RvQ2hlY2soKSB7Ci0JCWlmIChmZWF0dXJlc1RvQ2hlY2sgPT0gbnVsbCkgewotCQkJZmVhdHVyZXNUb0NoZWNrID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCQlmZWF0dXJlc1RvQ2hlY2suYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCi0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzVG9DaGVjazsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0KLQkJaWYoYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKXsKLQkJCXZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZVZhbGlkYXRvcihhZGRDb21tYW5kLmdldE93bmVyKCksIChFUmVmZXJlbmNlKSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSwgKEVDbGFzcyludWxsLCBlLCBmZWF0dXJlKTsKLQkJfQotCi0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQ2hlY2tOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIGdldE9mZlN0cmluZ1RvQ2hlY2tOYW1lKE9iamVjdCBlLCBDb2xsZWN0aW9uIG9iamVjdHNUb0NoZWNrTmFtZSkgewotCQkvLyBpZihhZGRDb21tYW5kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSAmJgotCQkvLyBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSA9PQotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKQotCQkvLyAmJiBlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gKChDb250ZW50UGFja2FnZSllKS5lQWxsQ29udGVudHMoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkvLyBvYmplY3RzVG9DaGVja05hbWUuYWRkKGVsZW1lbnQpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBlbHNlCi0JCWlmIChhZGRDb21tYW5kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZQotCQkJCSYmIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkJCQkmJiBlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UKLQkJCQkmJiAhKGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudHMoKFByb2Nlc3NQYWNrYWdlKSBlLCBvYmplY3RzVG9DaGVja05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQ2hlY2tOYW1lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRQcm9jZXNzQ29tcG9uZW50cyhQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlDb2xsZWN0aW9uIG9iamVjdHNUb0NoZWNrTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkUGtnID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJb2JqZWN0c1RvQ2hlY2tOYW1lLmFkZChjaGlsZFBrZyk7Ci0JCQl9IGVsc2UgaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50cygoUHJvY2Vzc1BhY2thZ2UpIGNoaWxkUGtnLAotCQkJCQkJb2JqZWN0c1RvQ2hlY2tOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja1N0cmluZ1ZhbHVlKE5hbWVkRWxlbWVudCBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gb2JqZWN0c1RvQWRkKSB7Ci0JCUNvbGxlY3Rpb24gZXhjbHVkZWRGZWF0dXJlc1RvQ2hlY2sgPSB0eXBlVG9FeGNsdWRlZEZlYXR1cmVzRnJvbUNoZWNrLmdldChlLmVDbGFzcygpKTsgCi0JCWlmKGV4Y2x1ZGVkRmVhdHVyZXNUb0NoZWNrICE9IG51bGwgJiYgZXhjbHVkZWRGZWF0dXJlc1RvQ2hlY2suY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGNyZWF0ZVZhbGlkYXRvcihlLCBmZWF0dXJlKTsKLQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW5ld05hbWUgPSBjaGVja1N0cmluZ1ZhbHVlKGUsIGZlYXR1cmUsIHZhbGlkYXRvciwgb2JqZWN0c1RvQWRkKTsKLQkJCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCW5ld05hbWUgPSBuZXdOYW1lLnRyaW0oKTsKLQkJCQllLmVTZXQoZmVhdHVyZSwgbmV3TmFtZSk7Ci0JCQkJZmVhdHVyZUNoYW5nZWQoZSwgZmVhdHVyZSwgbmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tTdHJpbmdWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlBcnJheUxpc3Qgb2JqZWN0c1RvQ2hlY2tOYW1lID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpOwotCi0JCS8vIGZlYXR1cmUgdmFsdWUgY2hlY2sKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0c1RvQWRkLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShlLCBmZWF0dXJlLCBvYmplY3RzVG9BZGQpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlnZXRPZmZTdHJpbmdUb0NoZWNrTmFtZShlLCBvYmplY3RzVG9DaGVja05hbWUpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0c1RvQ2hlY2tOYW1lLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShlLCBmLCBvYmplY3RzVG9DaGVja05hbWUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlYWwgd2l0aCBlbGVtZW50IGNoYW5nZSBkdXJpbmcgYWRkCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmZWF0dXJlQ2hhbmdlZChFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgbmV3VmFsdWUpIHsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb0NoZWNrTmFtZShBZGRDb21tYW5kIGFkZENvbW1hbmQpIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkvLyBuZWVkIHRvIGdldCBhbGwgcHJvY2VzcyBjb21wb25lbnRzIGluIHRoaXMgcGFja2FnZSB0byBjaGVjawotCQkJCS8vIG5hbWUKLQkJCQkvLwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnQsIGZhbHNlKSB7Ci0KLQkJCQkJLyoqCi0JCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCSAqLwotCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJCXJldHVybiAoKFByb2Nlc3NQYWNrYWdlKSBvYmplY3QpLmdldENoaWxkUGFja2FnZXMoKQotCQkJCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgcGtnID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJZWxlbWVudHMuYWRkKHBrZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0aGUgbmFtZSBvZiBhbGwgZWxlbWVudHMgdG8gYmUgYWRkZWQuCi0JICogCi0JICogQHBhcmFtIGFkZENvbW1hbmQKLQkgKiBAcmV0dXJuIGEgZWxlbWVudCB0byBuZXcgZmVhdHVyZSBuYW1lIG1hcCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1c2VyCi0JICogICAgICAgICBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGNoZWNrTmFtZShBZGRDb21tYW5kIGFkZENvbW1hbmQpIHsKLQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ2hlY2sgPSBnZXRFbGVtZW50c1RvQ2hlY2tOYW1lKGFkZENvbW1hbmQpOwotCQlIYXNoTWFwIGVsZW1lbnRUb05ld05hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGZlYXR1cmUgdmFsdWUgY2hlY2sKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0NoZWNrLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoYWRkQ29tbWFuZAotCQkJCQkJLmdldE93bmVyKCksIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpLAotCQkJCQkJKENvbnRlbnRFbGVtZW50KSBlLCBuZXcgVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyKGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQkJCWFkZENvbW1hbmQuZ2V0T3duZXIoKSwgZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdOYW1lID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbmV3TmFtZSA9IGNoZWNrU3RyaW5nVmFsdWUoZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCB2YWxpZGF0b3IsIGVsZW1lbnRzVG9DaGVjayk7Ci0JCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKG5ld05hbWUgIT0gbnVsbCkgewotCQkJCS8vIG5ldyBuYW1lIHJlcXVpcmVkLCBjaGVjayBpZiB0aGUgZWxlbWVudCBjYW4gYmUgbW9kaWZpZWQKLQkJCQkvLwotCQkJCUlTdGF0dXMgc3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5KGUsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkpOwotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yRGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ19jYW5ub3RSZW5hbWUsCi0JCQkJCQluZXcgT2JqZWN0W10geyBUbmdVdGlsLmdldFR5cGVUZXh0KGUpLCBlLmdldE5hbWUoKSwKLQkJCQkJCQkJbmV3TmFtZSB9KTsKLQkJCQl3aGlsZSAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTCB9LCB0aXRsZSwKLQkJCQkJCQkJbXNnLCBudWxsKSA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBjYW5jZWwgdGhlIG9wZXJhdGlvbiBpZiB0aGVyZSBpcyBubyB1c2VyIGludGVyYWN0aW9uIGhhbmRsZXIKLQkJCQkJCS8vCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbGVtZW50VG9OZXdOYW1lTWFwLnB1dChlLCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50VG9OZXdOYW1lTWFwOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gb2JqZWN0c1RvQWRkCi0JICogQHJldHVybiBuZXcgZmVhdHVyZSB2YWx1ZSB0aGF0IHVzZXIgaGFzIGNob29zZW4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgIHRoZSBmZWF0dXJlIHZhbHVlIGlzIHZhbGlkCi0JICogQHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrU3RyaW5nVmFsdWUoTmFtZWRFbGVtZW50IGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgSVZhbGlkYXRvciB2YWxpZGF0b3IsCi0JCQlDb2xsZWN0aW9uIG9iamVjdHNUb0FkZCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogVGhlIHZhbGlkYXRvciBpcyBkaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgdGhhdCBpcyB0b28gbG9uZyBmb3IKLQkJLy8gdGhlIGRpYWxvZy4KLQkJLy8gZmVhdHVyZSB2YWx1ZSBjaGVjawotCQlmaW5hbCBTdHJpbmdWYWxpZGF0b3Igc3RyVmFsaWRhdG9yID0gZ2V0U3RyaW5nVmFsaWRhdG9yKCk7Ci0JCXN0clZhbGlkYXRvci5zZXRFbGVtZW50cyhvYmplY3RzVG9BZGQpOwotCQlzdHJWYWxpZGF0b3Iuc2V0RmVhdHVyZShmZWF0dXJlKTsKLQkJc3RyVmFsaWRhdG9yLnNldFZhbGlkYXRvcih2YWxpZGF0b3IpOwotCi0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBlLmVHZXQoZmVhdHVyZSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gc3RyVmFsaWRhdG9yLmlzVmFsaWQoc3RyKTsKLQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCVN0cmluZyBmZWF0dXJlVHh0ID0gVG5nVXRpbC5nZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIGUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZS5lR2V0KGZlYXR1cmUpOwotCi0JCQkJSVZhbGlkYXRvciBpbnB1dFZhbGlkYXRvciA9IG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQotCQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJCWlmIChzdHJWYWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRTaW1wbGVFcnJvck1lc3NhZ2Uoc3RyVmFsaWRhdG9yCi0JCQkJCQkJCQkJCS5pc1ZhbGlkKG5ld1RleHQpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQlpZih1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlVc2VySW5wdXQgaW5wdXQgPSBuZXcgVXNlcklucHV0KCIiLCBVc2VySW5wdXQuVEVYVCwgZmFsc2UsIG51bGwsIG51bGwsIGlucHV0VmFsaWRhdG9yLCBudWxsKTsKLQkJCQkJaW5wdXQuc2V0SW5wdXQoY3VycmVudFZhbHVlKTsKLQkJCQkJTGlzdDxVc2VySW5wdXQ+IHVzZXJJbnB1dHMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGlucHV0KTsKLQkJCQkJaWYodWlIYW5kbGVyLnJlcXVlc3RJbnB1dCh0aXRsZSwgZGxnTXNnLCB1c2VySW5wdXRzKSkgewotCQkJCQkJcmV0dXJuIChTdHJpbmcpIHVzZXJJbnB1dHMuZ2V0KDApLmdldElucHV0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQlpZiAoYWZmZWN0ZWRPYmplY3RzID09IG51bGwpIHsKLQkJCUVPYmplY3Qgb3duZXIgPSBhZGRDb21tYW5kLmdldE93bmVyKCk7Ci0JCQlhZmZlY3RlZE9iamVjdHMgPSBvd25lciA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfU0VUCi0JCQkJCTogQ29sbGVjdGlvbnMuc2luZ2xldG9uKG93bmVyKTsKLQkJfQotCQlyZXR1cm4gYWZmZWN0ZWRPYmplY3RzOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEVsZW1lbnRzVG9DaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soT2JqZWN0IGUpIHsKLQkJLy8gZG9uJ3QgY2hlY2sgb24gUHJvY2Vzc1BhY2thZ2UsIFByb2Nlc3NFbGVtZW50IGZvciBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJLy8gYi9jIHByb2Nlc3MgdmFsaWRhdGlvbiBpcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uLCBub3QgcGx1Z2luCi0JCS8vIHZpc2liaWxpdHkKLQkJLy8KLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSB8fCBlIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gZ2V0RWxlbWVudHNUb0NoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJYWRkTGlzdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCS8vIFN0cmluZyBuZXdOYW1lID0gKFN0cmluZykgZWxlbWVudFRvTmV3TmFtZU1hcC5nZXQoZWxlbWVudCk7Ci0JCQkvLyBpZihuZXdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLQkJCS8vIH0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJYWRkTGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBpbGxlZ2FsIHJlZmVyZW5jZSBpbiB0aGUgbW92ZWQgb2JqZWN0cwotCQkvLwkJCi0JCW93bmVyUGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oYWRkQ29tbWFuZC5nZXRPd25lcigpKTsKLQkJcmVtb3ZlWFJlZlJlcXVpcmVkID0gZmFsc2U7Ci0JCWlmIChvd25lclBsdWdpbiAhPSBudWxsKSB7Ci0JCQlmaW5kX3hQbHVnaW5SZWY6IGZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQotCQkJCWlmIChpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soZWxlbWVudCkpIHsKLQkJCQkJY29udGludWUgZmluZF94UGx1Z2luUmVmOwotCQkJCX0KLQkKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKGhhc0lsbGVnYWxSZWZlcmVuY2VJbmNsdWRpbmdBbGxDaGlsZHJlbihvd25lclBsdWdpbiwKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgYWRkTGlzdCkpIHsKLQkJCQkJCXJlbW92ZVhSZWZSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb247IAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCWlmIChhZGRGZWF0dXJlSXNDb250YWlubWVudCgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJYm9vbGVhbiBzYXZlT3duZXJSZXNvdXJjZSA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFwZXJzaXN0ZXIuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSkpIHsKLQkJCQkJc2F2ZU93bmVyUmVzb3VyY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzYXZlT3duZXJSZXNvdXJjZSkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFkZENvbW1hbmQuZ2V0T3duZXIoKS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQotCQlpZiAobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgY21kKQotCQkJCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCQkJCWlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3aWxsU2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlyZXR1cm4gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldFBlcnNpc3RlcigpOwotCQl0cnkgewotCi0JCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRNb2RpZmllZFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQljYW5VbmRvID0gZmFsc2U7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sIAotCQkJCQkJCXJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UKLQkJCQkJCQkJCS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCkpOwotCQkJCQlzdGF0dXMuYWRkKG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEFmZmVjdGVkT2JqZWN0cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVsZW1lbnRzVG9Db3B5UmVmQ29udGVudHMuYWRkKFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKSk7Ci0JCQkJfQotCi0JCQkJQ29sbGVjdGlvbiBtb2RpZmllZCA9IHJlc01nci5jb3B5UmVmZXJlbmNlZENvbnRlbnRzKAotCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cywgZWxlbWVudFRvT2xkUGx1Z2luTWFwKTsKLQkJCQltb2RpZmllZAotCQkJCQkJLmFkZEFsbChyZXBsYWNlVGV4dFJlZmVyZW5jZXMoZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cykpOwotCQkJCWlmIChtb2RpZmllZCAhPSBudWxsICYmICFtb2RpZmllZC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCQkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZUZpbGVFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQlyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJSVN0YXR1cyBuZXdTdGF0dXMgPSBuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5ST0xMQkFDS19FUlJPUiwgbXNnLnRvU3RyaW5nKCksIGUpOwotCQkJCQlzdGF0dXMuYWRkKG5ld1N0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGV4dHVhbCBkZXNjcmlwdGlvbnMgaW4gdGhlIGNvcGllZCBlbGVtZW50cyBjb250YWluIHJlZmVyZW5jZXMgKFVSTHMpCi0JICogdG8gb3RoZXIgZWxlbWVudHMgd2l0aGluIHRoZSBzYW1lIGNvcGllZCBwcm9jZXNzIHRoZW4gcmVwbGFjZSB0aGVzZQotCSAqIHJlZmVyZW5jZXMgd2l0aCByZWZlcmVuY2VzIHRoYXQgcG9pbnQgdG8gdGhlIG5ldyBlbGVtZW50cyBpbiB0aGUgY29waWVkCi0JICogc3RydWN0dXJlcy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gcmVwbGFjZVRleHRSZWZlcmVuY2VzKAotCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHR4dFJlZlJlcGxhY2VyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXRUZXh0UmVmZXJlbmNlUmVwbGFjZXIoKTsKLQkJaWYgKHR4dFJlZlJlcGxhY2VyID09IG51bGwpCi0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJLy8gZ2V0IG1hcAotCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJaWYgKGVkIGluc3RhbmNlb2YgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQlNYXAgY29weVRvT3JpZ2luYWxNYXAgPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQkJLy8gdGhlIFRleHRSZWZlcmVuY2VSZXBsYWNlciBleHBlY3RzIGEgbWFwIG9mIG9sZC10by1uZXcuIHdlCi0JCQkvLyBoYXZlIGEgbWFwIG9mIG5ldy10by1vbGQsIHNvIGNvbnZlcnQgaXQKLQkJCU1hcCBvbGRUb05ld09iamVjdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIHZhbCAhPSBudWxsKQotCQkJCQlvbGRUb05ld09iamVjdE1hcC5wdXQodmFsLCBrZXkpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgY2hpbGRJdGVyID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgY2hpbGRJdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGNoaWxkSXRlci5uZXh0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgYXR0cmlidXRlcyA9IGNoaWxkLmVDbGFzcygpCi0JCQkJCQkJLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgYXR0cmlidXRlcwotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkKLQkJCQkJCQkJJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKQotCQkJCQkJCQkmJiAoYXR0cmlidXRlLmlzTWFueSgpIHx8IGNoaWxkCi0JCQkJCQkJCQkJLmVJc1NldChhdHRyaWJ1dGUpKQotCQkJCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKQotCQkJCQkJCQkJCS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HCi0JCQkJCQkJCQkJLmdldEluc3RhbmNlQ2xhc3MoKSkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgY2hpbGQuZUdldChhdHRyaWJ1dGUpOwotCQkJCQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIG5ld3RleHQgPSB0eHRSZWZSZXBsYWNlci5yZXBsYWNlKHRleHQsCi0JCQkJCQkJCQkJY2hpbGQsIG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJCQkJCQkJaWYgKCFuZXd0ZXh0LmVxdWFscyh0ZXh0KSkgewotCQkJCQkJCQkJY2hpbGQuZVNldChhdHRyaWJ1dGUsIG5ld3RleHQpOwotCQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNoaWxkLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9BZGQoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBjaGVjayBmZWF0dXJlIHZhbHVlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldEZlYXR1cmVzVG9DaGVjaygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCWlmICghY2hlY2tTdHJpbmdWYWx1ZShmZWF0dXJlKSkgewotCQkJCQkvLyB1c2VyIGNhbmNlbGVkIHRoZSBvcGVyYWlvbgotCQkJCQkvLwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlib29sZWFuIHNob3dXYXJuaW5nID0gZmFsc2U7Ci0JCQlFZGl0aW5nRG9tYWluIGVkID0gYWRkQ29tbWFuZC5nZXREb21haW4oKTsKLQkJCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCU1hcCBjb3B5VG9PcmlnaW5hbE1hcCA9ICgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBlZCkKLQkJCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCi0JCQkJLy8gY2hlY2sgZmlyc3QgZWxlbWVudCBvZiBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCS8vIGlmIGl0J3MgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB3ZSBhcmUgcGFzdGluZyBhbmQKLQkJCQkvLyBtYXkgbmVlZCB0byB3YXJuIHRoZSB1c2VyCi0JCQkJLy8gaWYgaXQncyBub3QgYSBrZXkgaW4gdGhlIENvcHlUb09yaWdpbmFsTWFwLCB0aGVuIHdlIGFyZQotCQkJCS8vIHByb2JhYmx5IGFkZGluZyBhIG5ldyBlbGVtZW50Ci0JCQkJaWYgKGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpICE9IG51bGwKLQkJCQkJCSYmIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnNpemUoKSA+IDAKLQkJCQkJCSYmIGNvcHlUb09yaWdpbmFsTWFwLmNvbnRhaW5zS2V5KGFkZENvbW1hbmQKLQkJCQkJCQkJLmdldENvbGxlY3Rpb24oKS50b0FycmF5KClbMF0pKSB7Ci0JCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5VG9PcmlnaW5hbE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkmJiAhKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBlbnRyeQotCQkJCQkJCQkJCQkuZ2V0VmFsdWUoKSk7Ci0JCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoZW50cnkuZ2V0S2V5KCksCi0JCQkJCQkJCQkJcGx1Z2luKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBwbHVnaW4gPT0gbnVsbCwgb3JpZ2luYWwgZWxlbWVudCB3YXMgcHJvYmFibHkKLQkJCQkJCQkJLy8gZGVsZXRlZAotCQkJCQkJCQlzaG93V2FybmluZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2hvd1dhcm5pbmcpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkuc2hvd1dhcm5pbmcoCi0JCQkJCQkJCWdldExhYmVsKCksCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZyk7Ci0JCQl9Ci0KLQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBtc2dCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBjaGVja0ZvcklsbGVnYWxSZWZlcmVuY2VzKCk7Ci0JCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQkJbXNnQnVmZi5hcHBlbmQobXNnKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfTsKLQotCQkJSVByb2dyZXNzTW9uaXRvciBkZWZhdWx0TW9uaXRvciA9IG51bGw7Ci0JCQlpZiAoIXJ1bldpdGhQcm9ncmVzcykgewotCQkJCWRlZmF1bHRNb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCX0KLQotCQkJaWYgKHJ1bldpdGhQcm9ncmVzcykgewotCQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3Mob3BlcmF0aW9uLAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgCi0JCQl9IGVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCW9wZXJhdGlvbi5ydW4oZGVmYXVsdE1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtc2dCdWZmLmxlbmd0aCgpID4gMCkgewotCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQlpZih1aUhhbmRsZXIgICE9IG51bGwpIHsKLQkJCQkJaW50IHJldCA9IHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHtJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLCBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8gfSwgCi0JCQkJCQkJZ2V0TGFiZWwoKSwgbXNnQnVmZi50b1N0cmluZygpLCBudWxsKTsKLQkJCQkJaWYocmV0ID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTykgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgCi0JCQlvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQlpZiAocmVtb3ZlWFJlZlJlcXVpcmVkKSB7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQlyZW1vdmVJbGxlZ2FsUmVmZXJlbmNlcyhvd25lclBsdWdpbiwgZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gYWRkIHRoZSBlbGVtZW50cwotCQkJCQkvLwotCQkJCQlzdXBlckV4ZWN1dGUoKTsKLQotCQkJCQlleGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQotCQkJCQlpZiAod2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpKSB7Ci0JCQkJCQlJU3RhdHVzIHJlc3VsdCA9IHNhdmVOZXdFbGVtZW50c1dpdGhPd25SZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc3VsdC5pc09LKCkpIHsKLQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lKTsgCi0JCQkJCQkJc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXN0YXR1cy5hZGQocmVzdWx0KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJLy8gRklYTUU6IHRoaXMgY2F1c2VzIGRlYWQtbG9jayBhdAotCQkJCQkJLy8gTGlicmFyeVByb2Nlc3Nvci5ub3RpZnlMaXN0ZW5lcnMoKS4gVGhlIG1ldGhvZAotCQkJCQkJLy8gaXMgc3luY2hyb25pemVkLCB0aGlzIG1pZ2h0IGJlIHRoZSBjYXVzZSBvZiB0aGUKLQkJCQkJCS8vIGRlYWQtbG9jawotCQkJCQkJLy8KLQkJCQkJCXVuZG8oKTsKLQkJCQkJCQotCQkJCQkJaWYoQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbjw/PiBjcmVhdGVkRWxlbWVudHMgPSBjb21tYW5kLmdldFJlc3VsdCgpOwotCQkJCQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCk7Ci0JCQkJCQkJZm9yIChPYmplY3Qgb2JqZWN0IDogY3JlYXRlZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJcGVyc2lzdGVyLmRlbGV0ZSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlpZiAocnVuV2l0aFByb2dyZXNzKSB7Ci0JCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0cnkgewotCQkJCQlvcGVyYXRpb24ucnVuKGRlZmF1bHRNb25pdG9yKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnV2l0aERldGFpbHMsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoZ2V0TGFiZWwoKSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZXJyb3JfbXNnLCBudWxsLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhZGRGZWF0dXJlSXNDb250YWlubWVudCgpIHsKLQkJcmV0dXJuIGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgRVJlZmVyZW5jZQotCQkJCSYmICgoRVJlZmVyZW5jZSkgYWRkQ29tbWFuZC5nZXRGZWF0dXJlKCkpLmlzQ29udGFpbm1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhZGRlZCBlbGVtZW50cyB0aGF0IGFyZSBuZXcgdG8gdGhlIGxpYnJhcnkgYW5kIGNhbiBoYXZlIG93bgotCSAqIHJlc291cmNlIHRoYXQgbm8gb3RoZXIgcmVzb3VyY2UgcmVmZXJzIHRvIChsaWtlIE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyBzYXZlTmV3RWxlbWVudHNXaXRoT3duUmVzb3VyY2UoKSB7Ci0JCWlmIChhZGRGZWF0dXJlSXNDb250YWlubWVudCgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBTZXJ2aWNlcy5nZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJCQkJaWYgKG1lIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQgfHwKLQkJCQkJCW1lIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IAotCQkJCQkJbWUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7CQkJCQkJCi0JCQkJCQlJU3RhdHVzIGlzID0gY2hlY2tGaWxlUGF0aExlbmd0aEJlZm9yZVNhdmUobWUpOwotCQkJCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gaXM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAocGVyc2lzdGVyLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKG1lKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIuc2F2ZShtZSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKQotCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCVN0cmluZyBtc2cgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQkJCQkJbXNnID0gZS50b1N0cmluZygpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0ZpbGVQYXRoTGVuZ3RoQmVmb3JlU2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCX0KLQkJaWYgKCEgTmFtZUNoZWNrZXIuY2hlY2tGaWxlUGF0aExlbmd0aChwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlLCBlbGVtZW50LCBlbGVtZW50LmdldE5hbWUoKSwgCi0JCQkJSVZhbGlkYXRvci5NYXhGaWxlUGF0aE5hbWVMZW5ndGgsIG51bGwpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2csIAotCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihJVmFsaWRhdG9yLk1heEZpbGVQYXRoTmFtZUxlbmd0aCkgfSApOwotCQkJcmV0dXJuIG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlTYXZlU3RhdHVzLlNBVkVfRVJST1IsIG1zZywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCkgewotCQlMaXN0IG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKTsKLQkJaWYgKCFuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLmlzRW1wdHkoKSkgewotCQkJaWYgKCFhZGRMaXN0LmlzRW1wdHkoKSkgewotCQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUNvbW1hbmQgY21kID0gY21kUHJvdmlkZXIuY3JlYXRlUmVsYXRlZE9iamVjdHMoYWRkTGlzdCwKLQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQlpZiAoY21kICE9IG51bGwgJiYgY21kLmNhbkV4ZWN1dGUoKSkgewotCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJbmVzdGVkQ29tbWFuZHMuYWRkKGNtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRhaW5tZW50SW5mbyB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCi0JCWludCBpbmRleDsKLQotCQlDb250YWlubWVudEluZm8oRU9iamVjdCBjb250YWluZXIsIGludCBpbmRleCkgewotCQkJdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciB7Ci0JCXByaXZhdGUgTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbjsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHNUb01vdmU7Ci0KLQkJLyoqCi0JCSAqIGxpc3Qgb2YgUmVmZXJlbmNlIG9iamVjdHMKLQkJICogCi0JCSAqIEBzZWUgUmVmZXJlbmNlCi0JCSAqLwotCQlwcml2YXRlIExpc3QgaWxsZWdhbFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBTZXQgYWZmZWN0ZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXM7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNlYXJjaE91dGdvaW5nUmVmczsKLQotCQlwcml2YXRlIGJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzOwotCi0JCXB1YmxpYyBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcihNZXRob2RQbHVnaW4gdGFyZ2V0UGx1Z2luLAotCQkJCUNvbGxlY3Rpb24gZWxlbWVudHNUb01vdmUsIGJvb2xlYW4gc2VhcmNoT3V0Z29pbmdSZWZzLAotCQkJCWJvb2xlYW4gc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQl0aGlzLnRhcmdldFBsdWdpbiA9IHRhcmdldFBsdWdpbjsKLQkJCXRoaXMuZWxlbWVudHNUb01vdmUgPSBlbGVtZW50c1RvTW92ZTsKLQkJCXRoaXMuc2VhcmNoT3V0Z29pbmdSZWZzID0gc2VhcmNoT3V0Z29pbmdSZWZzOwotCQkJdGhpcy5zZWFyY2hJbmNvbWluZ1JlZnMgPSBzZWFyY2hJbmNvbWluZ1JlZnM7Ci0JCX0KLQotCQlwdWJsaWMgU2V0IGdldEFmZmVjdGVkUmVzb3VyY2VzKCkgewotCQkJaWYgKGFmZmVjdGVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlpbGxlZ2FsUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudHNUb01vdmUuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0KLQkJCQkJCS8vIGdldCBvdXRnb2luZyByZWZlcmVuY2VzCi0JCQkJCQkvLwotCQkJCQkJaWYgKHNlYXJjaE91dGdvaW5nUmVmcwotCQkJCQkJCQkmJiAhaXNFeGNsdWRlZEZyb21PdXRnb2luZ1JlZmVyZW5jZUNoZWNrKG9iaikpIHsKLQkJCQkJCQlnZXRJbGxlZ2FsT3V0Z29pbmdSZWZlcmVuY2VzKHRhcmdldFBsdWdpbiwgZSwKLQkJCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2VzKTsKLQkJCQkJCX0KLQotCQkJCQkJLy8gZ2V0IGluY29taW5nIHJlZmVyZW5jZXMKLQkJCQkJCS8vCi0JCQkJCQlpZiAoc2VhcmNoSW5jb21pbmdSZWZzKSB7Ci0JCQkJCQkJQ29sbGVjdGlvbiByZWZlcmVuY2VzID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkJCS5nZXRSZWZlcmVuY2VzKGUpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIKLQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQlpZiAoIWVsZW1lbnRzVG9Nb3ZlLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkJCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJCQkJCQkJaWYgKHBsdWdpbiAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHBsdWdpbiAhPSB0YXJnZXRQbHVnaW4KLQkJCQkJCQkJCQkJJiYgIU1pc2MuaXNCYXNlT2YodGFyZ2V0UGx1Z2luLAotCQkJCQkJCQkJCQkJCXBsdWdpbikpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uIHhSZWZzID0gZ2V0WFJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQllbGVtZW50LCBlLCBudWxsKTsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0geFJlZnMuaXRlcmF0b3IoKTsgaXRlcjEKLQkJCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcjEKLQkJCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJCQlpbGxlZ2FsUmVmZXJlbmNlcwotCQkJCQkJCQkJCQkJCS5hZGQobmV3IFJlZmVyZW5jZShlbGVtZW50LAotCQkJCQkJCQkJCQkJCQkJZiwgZSkpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGlsbGVnYWxSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlZi5vd25lci5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJCQlhZmZlY3RlZFJlc291cmNlcy5hZGQocmVmLm93bmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZmZlY3RlZFJlc291cmNlczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUlsbGVnYWxSZWZlcmVuY2VzKCkgewotCQkJcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbGxlZ2FsUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZWZlcmVuY2UgcmVmID0gKFJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpKTsKLQkJCQkJLy8gVE9ETzogbmVlZHMgcmV2aXNpdAotCQkJCQkvLyBUaGlzIGNvZGUgdGhyb3dzCi0JCQkJCS8vIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0JEJhc2ljSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgotCQkJCQkvLyBzb21ldGltZXMKLQkJCQkJLy8KLQkJCQkJLy8gaWYocmVmLmluZGV4ICE9IC0xKSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi5pbmRleCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gZWxzZSB7Ci0JCQkJCS8vIGxpc3QucmVtb3ZlKHJlZi52YWx1ZSk7Ci0JCQkJCS8vIH0KLQotCQkJCQlsaXN0LnJlbW92ZShyZWYudmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyZWYuZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkpIHsKLQkJCQkJCS8vU2hvdWxkIHF1ZXJ5IHRoZSBkZWZhdWx0IHZhbHVlIGlmIGV4dGVuZGVkIGZvciBhbnkgYXR0cmlidXRlIGZlYXR1cmUKLQkJCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCBWYXJpYWJpbGl0eVR5cGUuTkEpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVmLm93bmVyLmVTZXQocmVmLmZlYXR1cmUsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChyZWYpOwotCQkJfQotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXN0b3JlUmVtb3ZlZFJlZmVyZW5jZXMoKSB7Ci0JCQlpZiAocmVtb3ZlZFJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSByZW1vdmVkUmVmZXJlbmNlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCVJlZmVyZW5jZSByZWYgPSAoUmVmZXJlbmNlKSByZW1vdmVkUmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQkJaWYgKHJlZi5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCUxpc3QgbGlzdCA9ICgoTGlzdCkgcmVmLm93bmVyLmVHZXQocmVmLmZlYXR1cmUpKTsKLQkJCQkJaWYgKHJlZi5pbmRleCAhPSAtMSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBUT0RPOiBuZWVkIHJldmlzaXRzCi0JCQkJCQkJLy8KLQkJCQkJCQlpZiAoIWxpc3QuY29udGFpbnMocmVmLnZhbHVlKSkgewotCQkJCQkJCQlpZiAocmVmLmluZGV4IDwgbGlzdC5zaXplKCkpIHsKLQkJCQkJCQkJCWxpc3QuYWRkKHJlZi5pbmRleCwgcmVmLnZhbHVlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWxpc3QuYWRkKHJlZi52YWx1ZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJbGlzdC5hZGQocmVmLnZhbHVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlZi5vd25lci5lU2V0KHJlZi5mZWF0dXJlLCByZWYudmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTW92ZU9wZXJhdGlvbiBleHRlbmRzIENvbW1hbmRXcmFwcGVyIHsKLQkJLyoqIENvbnN0YW50cyBmb3Igc3RhdGUgb2YgdGhlIG1vdmUgb3BlcmF0aW9uICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TVEFSVCA9IDA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1NBVkVEX0ZJTEVTID0gODA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX01PVkVEX0ZJTEVTID0gNzA7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NPUElFRF9SRVNPVVJDRVMgPSA5MDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfRU5EID0gMTAwOwotCi0JCS8vIHByaXZhdGUgQ29tbWFuZCBjb21tYW5kOwotCQlwcml2YXRlIEFkZENvbW1hbmQgYWRkQ29tbWFuZDsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gbW92ZUxpc3Q7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHJlbW92ZVhSZWZSZXF1aXJlZCA9IGZhbHNlOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1JlZmVucmVjZWRJbGxlZ2FsbHkgPSBmYWxzZTsKLQotCQlwcml2YXRlIE1ldGhvZFBsdWdpbiBvd25lclBsdWdpbjsKLQotCQlwcml2YXRlIE1hcCBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJcHJpdmF0ZSBNYXAgZWxlbWVudFRvTmV3TmFtZU1hcDsKLQotCQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQotCQlwcml2YXRlIE9iamVjdCBzaGVsbDsKLQotCQlwcml2YXRlIEhhc2hTZXQgbW92ZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBNdWx0aVN0YXR1cyBzdGF0dXM7Ci0KLQkJLyoqCi0JCSAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vdmUgb3BlcmF0aW9uLCBpdCBjYW4gYmUgb25lIG9mIHRoZSBzdGF0ZQotCQkgKiBjb25zdGFudHMKLQkJICovCi0JCXByaXZhdGUgaW50IHN0YXRlOwotCi0JCXByb3RlY3RlZCBTZXQgbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkJcHJpdmF0ZSBJbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciBpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcjsKLQotCQlwcml2YXRlIEhhc2hNYXAgZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwOwotCi0JCXB1YmxpYyBNb3ZlT3BlcmF0aW9uKENvbW1hbmQgY29tbWFuZCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJCU9iamVjdCBzaGVsbCkgewotCQkJc3VwZXIoY29tbWFuZCk7Ci0JCQlhZGRDb21tYW5kID0gKEFkZENvbW1hbmQpIFRuZ1V0aWwudW53cmFwKGNvbW1hbmQpOwotCQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQkJCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJfQotCQkKLQkJcHVibGljIE1hcCBnZXRFbGVtZW50VG9PbGRQbHVnaW5NYXAoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFRvT2xkUGx1Z2luTWFwOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3RhdHVzLgotCQkgKi8KLQkJcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGVja3MgaWYgcmVsb2FkaW5nIGxpYnJhcnkgaXMgbmVlZGVkIGluIGNhc2Ugb2YgbW92ZSBmYWlsdXJlCi0JCSAqIAotCQkgKiBAcmV0dXJuCi0JCSAqIEBzZWUgI2dldFN0YXR1cygpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZWxvYWROZWVkZWQoKSB7Ci0JCQlyZXR1cm4gc3RhdHVzICE9IG51bGwKLQkJCQkJJiYgQ29tbWFuZFN0YXR1c0NoZWNrZXIuaGFzUm9sbGJhY2tFcnJvcihzdGF0dXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCS8vIHVuZG8gbmFtZSBjaGFuZ2UKLQkJCS8vCi0JCQlpZiAoZWxlbWVudFRvTmV3TmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvTmV3TmFtZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGVudHJ5LmdldEtleSgpOwotCQkJCQllLnNldE5hbWUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9PbGRDb250YWluZXJNYXAuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGVudHJ5LmdldEtleSgpOwotCQkJCQlDb250YWlubWVudEluZm8gY29udGFpbm1lbnRJbmZvID0gKENvbnRhaW5tZW50SW5mbykgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBhZGRDb21tYW5kLmdldEZlYXR1cmUoKTsKLQkJCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJCSgoTGlzdCkgY29udGFpbm1lbnRJbmZvLmNvbnRhaW5lci5lR2V0KGYpKS5hZGQoCi0JCQkJCQkJCWNvbnRhaW5tZW50SW5mby5pbmRleCwgZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljb250YWlubWVudEluZm8uY29udGFpbmVyLmVTZXQoZiwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlciAhPSBudWxsKSB7Ci0JCQkJaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIucmVzdG9yZVJlbW92ZWRSZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJcnVuKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXN0YXRlID0gU1RBVEVfU1RBUlQ7Ci0KLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgbnVsbCk7IAotCi0JCQlpZiAoY2hlY2tOYW1lKCkpIHsKLQkJCQkvLyBjaGVjayBpZiB0aGUgY29uZmlndXJhdGlvbnMgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgdGhpcwotCQkJCS8vIGNvbW1hbmQgY2FuIGJlIG1vZGlmaWVkCi0JCQkJLy8KLQkJCQlJU3RhdHVzIGV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCS5jaGVja0NvbmZpZ3VyYXRpb25zVG9VcGRhdGUoYWRkQ29tbWFuZCwgc2hlbGwpOwotCQkJCWlmICghZXhlY1N0YXR1cy5pc09LKCkpIHsKLQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWZpbmFsIFN0cmluZ0J1ZmZlciBtc2dCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCW1vbml0b3IKLQkJCQkJCQkJLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY2hlY2tpbmdSZWZlcmVuY2VzVGFza19uYW1lKTsgCi0JCQkJCQlTdHJpbmcgbXNnID0gY2hlY2tGb3JJbGxlZ2FsUmVmZXJlbmNlcygpOwotCQkJCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQkJbXNnQnVmZmVyLmFwcGVuZChtc2cpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCi0JCQkJSVN0YXR1cyBzdGF0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuSW5Nb2RhbENvbnRleHQocnVubmFibGUsIHRydWUsIG1vbml0b3IsIHNoZWxsKTsKLQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmIChtc2dCdWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJCQkJaWYodWlIYW5kbGVyICAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgcmV0ID0gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10ge0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTyB9LCAKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMubW92ZURpYWxvZ190aXRsZSwgbXNnQnVmZmVyLnRvU3RyaW5nKCksIG51bGwpOwotCQkJCQkJaWYocmV0ID09IElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTykgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIHNhdmUgcmVmZXJlbmNlIHRvIG9sZCByZXNvdXJjZSBvZiBhbGwgZWxlbWVudHMgaW4gdGhlCi0JCQkJLy8gbW92ZUxpc3QKLQkJCQkvLwotCQkJCWZpbmFsIE1hcCBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkvLyBzYXZlIHRoZSByZWZlcmVuY2UgdG8gb2xkIHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAucHV0KGVsZW1lbnQsIGVsZW1lbnQKLQkJCQkJCQkJLmVSZXNvdXJjZSgpKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChyZW1vdmVYUmVmUmVxdWlyZWQgfHwgaXNSZWZlbnJlY2VkSWxsZWdhbGx5KSB7Ci0JCQkJCS8vIGdldCBzZXQgb2YgcmVzb3VyY2VzIHRoYXQgd2lsbCBiZSBtb2RpZmllZCBkdXJpbmcgdGhpcwotCQkJCQkvLyBtb3ZlCi0JCQkJCS8vCi0JCQkJCWlsbGVnYWxSZWZlcmVuY2VSZW1vdmVyID0gbmV3IElsbGVnYWxSZWZlcmVuY2VSZW1vdmVyKAotCQkJCQkJCW93bmVyUGx1Z2luLCBtb3ZlTGlzdCwgcmVtb3ZlWFJlZlJlcXVpcmVkLAotCQkJCQkJCWlzUmVmZW5yZWNlZElsbGVnYWxseSk7Ci0JCQkJCXJ1bm5hYmxlID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5jaGVja0FmZmVjdGVkUmVzb3VyY2VzVGFza19uYW1lKTsgCi0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBpbGxlZ2FsUmVmZXJlbmNlUmVtb3ZlcgotCQkJCQkJCQkJLmdldEFmZmVjdGVkUmVzb3VyY2VzKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfTsKLQkJCQkJc3RhdCA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1bkluTW9kYWxDb250ZXh0KHJ1bm5hYmxlLCB0cnVlLCBtb25pdG9yLCBzaGVsbCk7Ci0JCQkJCWlmKCFzdGF0LmlzT0soKSkgewotCQkJCQkJc3RhdHVzLmFkZChzdGF0KTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCS8vIGNoZWNrIGFmZmVjdGVkIHJlc291cmNlcyBmb3IgdW5tb2RpZmlhYmxlCi0JCQkJCWV4ZWNTdGF0dXMgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnkoCi0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMsIHNoZWxsKTsKLQkJCQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJCQkJTWVzc2VuZ2VyLklOU1RBTkNFLnNob3dFcnJvcihMaWJyYXJ5RWRpdFJlc291cmNlcy5tb3ZlRGlhbG9nX3RpdGxlLCBudWxsLCBleGVjU3RhdHVzKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlbW92aW5nUmVmZXJlbmNlc3Rhc2tfbmFtZSk7IAotCQkJCQkJaWxsZWdhbFJlZmVyZW5jZVJlbW92ZXIucmVtb3ZlSWxsZWdhbFJlZmVyZW5jZXMoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXVuZG8oKTsKLQkJCQkJCVN0cmluZyBtc2cgPSBUbmdVdGlsLnRvU3RhY2tUcmFjZVN0cmluZyhlKTsKLQkJCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJMCwgbXNnLCBlKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvLyBzZXQgbmV3IG5hbWUgaWYgdGhlcmUgaXMgYW55Ci0JCQkJLy8KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50VG9OZXdOYW1lTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCU5hbWVkRWxlbWVudCBlbGVtZW50ID0gKE5hbWVkRWxlbWVudCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWVsZW1lbnQuc2V0TmFtZSgoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpIHsKLQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJCQlDb250ZW50RWxlbWVudCBlID0gKENvbnRlbnRFbGVtZW50KSBlbGVtZW50OwotCQkJCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJCQkJCQltb3ZlZFJlc291cmNlcy5hZGQoZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gbW92ZSBlbGVtZW50cwotCQkJCS8vCi0JCQkJcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQkJCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQkJbW9uaXRvcgotCQkJCQkJCQkuc2V0VGFza05hbWUoTGlicmFyeUVkaXRSZXNvdXJjZXMubW92aW5nVGFza19uYW1lKTsgCi0JCQkJCQlkb01vdmUobW9uaXRvciwgZWxlbWVudFRvT2xkUmVzb3VyY2VNYXAsCi0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJfQotCi0JCQkJfTsKLQkJCQlzdGF0ID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuSW5Nb2RhbENvbnRleHQocnVubmFibGUsIHRydWUsIG1vbml0b3IsIHNoZWxsKTsKLQkJCQlpZighc3RhdC5pc09LKCkpIHsKLQkJCQkJdW5kbygpOwotCQkJCQlzdGF0dXMuYWRkKHN0YXQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0KLQkJCQkvLyBjaGVjayBtb3ZlZCByZXNvdXJjZXMgdGhhdCBhcmUgbm90IGluIG1vZGlmaWFibGUgcmVzb3VyY2VzCi0JCQkJLy8gZm9yIHVubW9kaWZpYWJsZQotCQkJCS8vCi0JCQkJTGlzdCByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KG1vdmVkUmVzb3VyY2VzKTsKLQkJCQlyZXNvdXJjZXMucmVtb3ZlQWxsKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQlleGVjU3RhdHVzID0gVXNlckludGVyYWN0aW9uSGVscGVyCi0JCQkJCQkuY2hlY2tNb2RpZnkocmVzb3VyY2VzLCBzaGVsbCk7Ci0JCQkJaWYgKCFleGVjU3RhdHVzLmlzT0soKSkgewotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0Vycm9yKExpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmVEaWFsb2dfdGl0bGUsIG51bGwsIGV4ZWNTdGF0dXMpOwotCi0JCQkJCXVuZG8oKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHNhdmUgcmVzb3VyY2VzCi0JCQkJLy8KLQkJCQlydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCQkJCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlTdGF0dXMgc2F2ZVN0YXR1cyA9IHNhdmUobW9uaXRvcik7Ci0JCQkJCQkJaWYgKCFzYXZlU3RhdHVzLmlzT0soKSkgewotCQkJCQkJCQlzdGF0dXMuYWRkKHNhdmVTdGF0dXMpOwotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9OwotCQkJCXN0YXQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5Jbk1vZGFsQ29udGV4dChydW5uYWJsZSwgdHJ1ZSwgbW9uaXRvciwgc2hlbGwpOwotCQkJCWlmKCFzdGF0LmlzT0soKSkgewotCQkJCQlzdGF0dXMuYWRkKHN0YXQpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJLy8gcnVuIG5lc3RlZCBjb21tYW5kcwotCQkJCS8vCi0JCQkJTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciBuZXN0ZWRDb21tYW5kRXhjZWN1dG9yID0gbmV3IE5lc3RlZENvbW1hbmRFeGNlY3V0b3IodGhpcyk7Ci0JCQkJdHJ5IHsKLQkJCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJc3RhdGUgPSBTVEFURV9FTkQ7Ci0JCX0KLQotCQkvKioKLQkJICogaW50ZXJhY3RzIHdpdGggdXNlcgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGNoZWNrTmFtZSgpIHsKLQkJCWVsZW1lbnRUb05ld05hbWVNYXAgPSBNZXRob2RFbGVtZW50QWRkQ29tbWFuZC5jaGVja05hbWUoYWRkQ29tbWFuZCk7Ci0JCQlyZXR1cm4gZWxlbWVudFRvTmV3TmFtZU1hcCAhPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIExvbmcgcnVubmluZyBtZXRob2QKLQkJICogCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGNoZWNrRm9ySWxsZWdhbFJlZmVyZW5jZXMoKSB7Ci0JCQllbGVtZW50VG9PbGRQbHVnaW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQltb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkpOwotCQkJbW92ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkJLy8gLy8gc2V0IG5ldyBuYW1lIGlmIHRoZXJlIGlzIGFueQotCQkJCS8vIC8vCi0JCQkJLy8gU3RyaW5nIG5ld05hbWUgPSAoU3RyaW5nKSBlbGVtZW50VG9OZXdOYW1lTWFwLmdldChlbGVtZW50KTsKLQkJCQkvLyBpZihuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkvLyAoKE5hbWVkRWxlbWVudCllbGVtZW50KS5zZXROYW1lKG5ld05hbWUpOwotCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RVbml0KSB7Ci0JCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCS8vIENvbnRlbnRFbGVtZW50IGUgPSAoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJLy8gaWYoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZSkpIHsKLQkJCQkvLyBtb3ZlZFJlc291cmNlcy5hZGQoZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gfQotCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoZWxlbWVudCwgVW1hVXRpbAotCQkJCQkJCS5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkpOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCW1vdmVMaXN0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGlsbGVnYWwgcmVmZXJlbmNlIGluIHRoZSBtb3ZlZCBvYmplY3RzCi0JCQkvLwkJCQotCQkJb3duZXJQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihhZGRDb21tYW5kLmdldE93bmVyKCkpOwotCQkJZmluZF94UGx1Z2luUmVmOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQotCQkJCWlmIChpc0V4Y2x1ZGVkRnJvbU91dGdvaW5nUmVmZXJlbmNlQ2hlY2soZWxlbWVudCkpIHsKLQkJCQkJY29udGludWUgZmluZF94UGx1Z2luUmVmOwotCQkJCX0KLQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoaGFzSWxsZWdhbFJlZmVyZW5jZUluY2x1ZGluZ0FsbENoaWxkcmVuKG93bmVyUGx1Z2luLAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCBtb3ZlTGlzdCkpIHsKLQkJCQkJCXJlbW92ZVhSZWZSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3hQbHVnaW5SZWY7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbmRfaWxsZWdhbFJlZmVyZW5jZXI6IGZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoaXNSZWZlcmVuY2VkSWxsZWdhbGx5KG93bmVyUGx1Z2luLAotCQkJCQkJCShNZXRob2RFbGVtZW50KSBlbGVtZW50LCBtb3ZlTGlzdCkpIHsKLQkJCQkJCWlzUmVmZW5yZWNlZElsbGVnYWxseSA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX2lsbGVnYWxSZWZlcmVuY2VyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZVhSZWZSZXF1aXJlZCB8fCBpc1JlZmVucmVjZWRJbGxlZ2FsbHkpIHsKLQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZFJlZmVyZW5jZXNFcnJvcl9yZWFzb247IAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogTG9uZyBydW5uaW5nIG1ldGhvZAotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGRvTW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCi0JCQkJTWFwIGVsZW1lbnRUb09sZFJlc291cmNlTWFwLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCUVPYmplY3QgY29udGFpbmVyID0gZWxlbWVudC5lQ29udGFpbmVyKCk7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZWxlbWVudC5lQ29udGFpbmluZ0ZlYXR1cmUoKTsKLQkJCQkJaW50IGluZGV4OwotCQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJaW5kZXggPSAoKExpc3QpIGNvbnRhaW5lci5lR2V0KGZlYXR1cmUpKQotCQkJCQkJCQkuaW5kZXhPZihlbGVtZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZGV4ID0gLTE7Ci0JCQkJCX0KLQkJCQkJZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwLnB1dChlbGVtZW50LCBuZXcgQ29udGFpbm1lbnRJbmZvKAotCQkJCQkJCWNvbnRhaW5lciwgaW5kZXgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG1vdmUgdGhlIGVsZW1lbnRzCi0JCQkvLwotCQkJYWRkQ29tbWFuZC5leGVjdXRlKCk7Ci0KLQkJCS8vIGNvbGxlY3QgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gbW9kaWZlZCBhcyByZXN1bHQgb2YgdGhpcyBtb3ZlCi0JCQkvLwotCQkJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSBhZGRDb21tYW5kLmdldE93bmVyKCkuZVJlc291cmNlKCk7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQobmV3UmVzb3VyY2UpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRkQ29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJRU9iamVjdCBvbGRDb250YWluZXIgPSAoKENvbnRhaW5tZW50SW5mbykgZWxlbWVudFRvT2xkQ29udGFpbmVyTWFwCi0JCQkJCQkJLmdldChlbGVtZW50KSkuY29udGFpbmVyOwotCQkJCQlpZiAob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG5ld1Jlc291cmNlCi0JCQkJCQkJJiYgIW9sZENvbnRhaW5lci5lUmVzb3VyY2UoKS5nZXRDb250ZW50cygpCi0JCQkJCQkJCQkuaXNFbXB0eSgpKSB7Ci0JCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob2xkQ29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQkJCVJlc291cmNlIG9sZFJlc291cmNlID0gKFJlc291cmNlKSBlbGVtZW50VG9PbGRSZXNvdXJjZU1hcAotCQkJCQkJCQkuZ2V0KGVsZW1lbnQpOwotCQkJCQkJaWYgKG9sZENvbnRhaW5lci5lUmVzb3VyY2UoKSAhPSBvbGRSZXNvdXJjZSkgewotCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChvbGRSZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlPYmplY3QgcGx1Z2luID0gZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlbGVtZW50KTsKLQkJCQkJaWYgKG93bmVyUGx1Z2luICE9IHBsdWdpbikgewotCQkJCQkJLy8gaXQncyBhIGNyb3NzLXBsdWdpbiBtb3ZlLCBhZGQgdGhlIHJlc291cmNlcyBvZiB0aG9zZQotCQkJCQkJLy8gY2hpbGRyZW4gdGhhdCBoYXZlIGRpcmVjdCByZXNvdXJjZQotCQkJCQkJLy8gdG8gdGhlIG1vdmVSZXNvdXJjZXMgbGlzdAotCQkJCQkJLy8JCQkJCQkKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UoZSkpIHsKLQkJCQkJCQkJbW92ZWRSZXNvdXJjZXMuYWRkKGUuZVJlc291cmNlKCkpOwotCQkJCQkJCQllbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KGUsIHBsdWdpbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50ICYmCi0JCQkJCQkvLyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbigoRGVzY3JpYmFibGVFbGVtZW50KQotCQkJCQkJLy8gZWxlbWVudCkpIHsKLQkJCQkJCS8vIG1vdmVkUmVzb3VyY2VzLmFkZCgoKERlc2NyaWJhYmxlRWxlbWVudCllbGVtZW50KS5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkvLyBlbGVtZW50VG9PbGRQbHVnaW5NYXAucHV0KCgoRGVzY3JpYmFibGVFbGVtZW50KWVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpLAotCQkJCQkJLy8gcGx1Z2luKTsKLQkJCQkJCS8vIH0KLQkJCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVBbGxDb250ZW50cygpOwotCQkJCQkJLy8gaXRlcmF0b3IKLQkJCQkJCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkvLyBPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCS8vIGlmKGUgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQgJiYKLQkJCQkJCS8vIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKChEZXNjcmliYWJsZUVsZW1lbnQpCi0JCQkJCQkvLyBlKSkgewotCQkJCQkJLy8gbW92ZWRSZXNvdXJjZXMuYWRkKCgoRGVzY3JpYmFibGVFbGVtZW50KWUpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCS8vIGVsZW1lbnRUb09sZFBsdWdpbk1hcC5wdXQoKChEZXNjcmliYWJsZUVsZW1lbnQpZSkuZ2V0UHJlc2VudGF0aW9uKCksCi0JCQkJCQkvLyBwbHVnaW4pOwotCQkJCQkJLy8gfQotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJU3RhdHVzIHNhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN5bWJvbGljTmFtZSgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5NZXRob2RFbGVtZW50QWRkQ29tbWFuZF9lcnJvclNhdmluZ0ZpbGVzLAotCQkJCQludWxsKTsgCi0KLQkJCW1vbml0b3Iuc3ViVGFzayhMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZpbmdNb2RpZmllZEZpbGVzVGFza19uYW1lKTsgCi0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMKLQkJCQkJLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXNhdmU6IGRvIHsKLQkJCQl0cnkgewotCi0JCQkJCWlmICghbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLm1vdmluZ0ZpbGVzVGFza19uYW1lKTsgCi0KLQkJCQkJCS8vIG1vdmUgdGhlIG1vdmVkIHJlc291cmNlcwotCQkJCQkJLy8KLQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihtb3ZlZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQkJc3RhdGUgPSBTVEFURV9NT1ZFRF9GSUxFUzsKLQotCQkJCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCQkJLy8KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIG1vbml0b3Iuc3ViVGFzayhNZXNzYWdlRm9ybWF0LmZvcm1hdCgiU2F2aW5nCi0JCQkJCQkJLy8gJyd7MH0nJyIsIHBhdGhBcmdzKSk7Ci0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCi0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnNhdmVGaWxlRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkgPyByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSA6IHJlc291cmNlLnRvU3RyaW5nKCkpOwotCQkJCQkJCXN0YXR1cy5hZGQobmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuU0FWRV9FUlJPUiwgbXNnLCBlKSk7Ci0JCQkJCQkJYnJlYWsgc2F2ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJCXN0YXRlID0gU1RBVEVfU0FWRURfRklMRVM7Ci0KLQkJCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCQltb25pdG9yCi0JCQkJCQkJCS5zdWJUYXNrKExpYnJhcnlFZGl0UmVzb3VyY2VzLmNvcHlpbmdSZXNvdXJjZXNUYXNrX25hbWUpOyAKLQotCQkJCQkJQ29sbGVjdGlvbiBlbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW92ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLmFkZEFsbChyZXNvdXJjZQotCQkJCQkJCQkJLmdldENvbnRlbnRzKCkpOwotCQkJCQkJfQotCi0JCQkJCQllbGVtZW50c1RvQ29weVJlZkNvbnRlbnRzLmFkZEFsbChhZGRDb21tYW5kCi0JCQkJCQkJCS5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0KLQkJCQkJCUNvbGxlY3Rpb24gbW9kaWZpZWQgPSByZXNNZ3IuY29weVJlZmVyZW5jZWRDb250ZW50cygKLQkJCQkJCQkJZWxlbWVudHNUb0NvcHlSZWZDb250ZW50cywKLQkJCQkJCQkJZWxlbWVudFRvT2xkUGx1Z2luTWFwKTsKLQkJCQkJCWlmIChtb2RpZmllZCAhPSBudWxsICYmICFtb2RpZmllZC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJCU9iamVjdFtdIHBhdGhBcmdzID0geyByZXNvdXJjZS5nZXRVUkkoKS5pc0ZpbGUoKSA/IHJlc291cmNlLmdldFVSSSgpCi0JCQkJCQkJCQkJLnRvRmlsZVN0cmluZygpIDogcmVzb3VyY2UudG9TdHJpbmcoKX07Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQltb25pdG9yCi0JCQkJCQkJCQkJCS5zdWJUYXNrKE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2aW5nRmlsZVRhc2tfbmFtZSwKLQkJCQkJCQkJCQkJCQkJCXBhdGhBcmdzKSk7IAotCQkJCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5zYXZlRmlsZUVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQlwYXRoQXJncyk7IAotCQkJCQkJCQkJc3RhdHVzLmFkZChuZXcgU2F2ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2csIGUpKTsKLQkJCQkJCQkJCWJyZWFrIHNhdmU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQlzdGF0ZSA9IFNUQVRFX0NPUElFRF9SRVNPVVJDRVM7Ci0KLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3RyaW5nV3JpdGVyIG1zZyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQlJU3RhdHVzIG5ld1N0YXR1cyA9IG5ldyBTYXZlU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQkJCQkJU2F2ZVN0YXR1cy5TQVZFX0VSUk9SLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3U3RhdHVzKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCVN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKG1zZykpOwotCQkJCQkJCUlTdGF0dXMgbmV3U3RhdHVzID0gbmV3IFNhdmVTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCQkJCVNhdmVTdGF0dXMuUk9MTEJBQ0tfRVJST1IsIG1zZy50b1N0cmluZygpLAotCQkJCQkJCQkJZSk7Ci0JCQkJCQkJc3RhdHVzLmFkZChuZXdTdGF0dXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSB3aGlsZSAoZmFsc2UpOwotCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeUVkaXRSZXNvdXJjZXMuY29tbWFuZF9kb25lKTsgCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUmVzb3VyY2VNYW5hZ2VyIHsKLQotCQkvKioKLQkJICogQ29waWVzIHRoZSBjb250ZW50IHJlc291cmNlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoZSBjb250ZW50IG9mCi0JCSAqIHRoZSBnaXZlbiBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBtb3ZlZC9jb3BpZWQgdG8gbmV3IGxvY2F0aW9uLgotCQkgKiAKLQkJICogQHBhcmFtIGVsZW1lbnRzCi0JCSAqICAgICAgICAgICAgRWxlbWVudHMgdGhhdCBhcmUgbW92ZWQgb3IgY29waWVkLgotCQkgKiBAcmV0dXJuIGNvbGxlY3Rpb24gb2YgbW9kaWZpZWQgcmVzb3VyY2VzIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsLgotCQkgKi8KLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzLAotCQkJCU1hcDxNZXRob2RFbGVtZW50LCBNZXRob2RQbHVnaW4+IGVsZW1lbnRUb09sZFBsdWdpbk1hcCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBCYXNpY1Jlc291cmNlTWFuYWdlciBpbXBsZW1lbnRzIFJlc291cmNlTWFuYWdlciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kLlJlc291cmNlTWFuYWdlciNjb3B5UmVmZXJlbmNlZENvbnRlbnRzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGNvcHlSZWZlcmVuY2VkQ29udGVudHMoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50cywKLQkJCQlNYXA8TWV0aG9kRWxlbWVudCwgTWV0aG9kUGx1Z2luPiBlbGVtZW50VG9PbGRQbHVnaW5NYXApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciByZXNNZ3IpIHsKLQkJTWV0aG9kRWxlbWVudEFkZENvbW1hbmQucmVzTWdyID0gcmVzTWdyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1ZhbGlkYXRvciBnZXRTdHJpbmdWYWxpZGF0b3IoKSB7Ci0JCWlmIChzdHJpbmdWYWxpZGF0b3IgPT0gbnVsbCkgewotCQkJc3RyaW5nVmFsaWRhdG9yID0gbmV3IFN0cmluZ1ZhbGlkYXRvcigpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdWYWxpZGF0b3I7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdWYWxpZGF0b3Igc3RyaW5nVmFsaWRhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQotCQlwcml2YXRlIENvbGxlY3Rpb24gZWxlbWVudHM7Ci0KLQkJcHJpdmF0ZSBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXByaXZhdGUgU3RyaW5nVmFsaWRhdG9yKCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50cyB0byBpbmNsdWRlIGluIHRoZSBjaGVjay4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmdWYWxpZGF0b3IoQ29sbGVjdGlvbiBlbGVtZW50cywgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCX0KLQotCQkvKioKLQkJICogU2V0cyB0aGUgZWxlbWVudHMgdG8gaW5jbHVkZSBpbiB0aGUgY2hlY2suCi0JCSAqIAotCQkgKiBAcGFyYW0gZWxlbWVudHMKLQkJICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gaW5jbHVkZSBpbiB0aGUgY2hlY2suCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQlpZiAodmFsaWRhdG9yIGluc3RhbmNlb2YgVW5pcXVlbmVzc1ZhbGlkYXRvcikgewotCQkJCUVPYmplY3Qgb2JqID0gKChVbmlxdWVuZXNzVmFsaWRhdG9yKSB2YWxpZGF0b3IpLmdldEVPYmplY3QoKTsKLQkJCQlpbnQgY2xhc3NJRCA9IG9iai5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQluZXdUZXh0ID0gbmV3VGV4dC50cmltKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIGUuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKG9iaiAhPSBlICYmIGNsYXNzSUQgPT0gZS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKQotCQkJCQkJCSYmIG5ld1RleHQuZXF1YWxzSWdub3JlQ2FzZShzdHIpKSB7Ci0JCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LAotCQkJCQkJLy8gZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCQkJCW5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQl9Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VmZGNiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkFic3RyYWN0U3RyaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY3JlYXRlIGEgY2hpbGQgbWV0aG9kIGVsZW1lbnQgYW5kIGFkZCBpdCB0byB0aGUKLSAqIGNvbnRhaW5pbmcgbWV0aG9kIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ2hpbGRDb21tYW5kIHsKLQotCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBJVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGNoaWxkLCBpbnQgaW5kZXgsCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiwgSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgaW5kZXgsIHNlbGVjdGlvbiwgaGVscGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJFeGVjdXRlKCkgewotCQlzdXBlci5leGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJaWYodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXZhbGlkYXRvciA9IG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJaWYgKG5ld1RleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCVN0cmluZyBlbGVtZW50VGV4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRfdGV4dDsgCi0JCQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZW1wdHlFbGVtZW50TmFtZUVycm9yX21zZywgZWxlbWVudFRleHQpOyAKLQkJCQkJfQotCQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG93bmVyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmV3VGV4dCkpIHsKLQkJCQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuZXdUZXh0KTsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVN0cmluZyB0aXRsZSA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLm5ld0VsZW1lbnRfdGV4dCwgaGVscGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbikpOyAKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoKTsKLS8vCQlmaW5hbCBTdHJpbmcgbmFtZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5yZXF1ZXN0TmFtZShjaGlsZCwKLS8vCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksIHRpdGxlLCB2YWxpZGF0b3IpOwotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCVVzZXJJbnB1dCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0LCBVc2VySW5wdXQuVEVYVCwgCi0JCQkJZmFsc2UsIG51bGwsIG51bGwsIHZhbGlkYXRvciwgdGhpcyk7CQkKLQkJaWYodWlIYW5kbGVyLnJlcXVlc3RJbnB1dCh0aXRsZSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuU3BlY2lmeU5hbWVUZXh0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVzZXJJbnB1dCkpKSB7IAotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB1c2VySW5wdXQuZ2V0SW5wdXQoKTsKLQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkoKE5hbWVkRWxlbWVudCkgY2hpbGQpLnNldE5hbWUobmFtZSk7Ci0JCQkJc3VwZXJFeGVjdXRlKCk7Ci0JCQkJZXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZCNnZXRBZmZlY3RlZE9iamVjdHMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGV4ZWN1dGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob3duZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQjZ2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCWlmIChleGVjdXRlZCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFJlc3VsdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoKSB7Ci0JCXJldHVybiBjaGlsZDsKLQl9Ci0JCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5OGQzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudFNldFByb3BlcnR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50U2V0UHJvcGVydHlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByb3RlY3RlZCBTdHJpbmcga2V5OwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRWYWx1ZTsKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCi0JcHVibGljIE1ldGhvZEVsZW1lbnRTZXRQcm9wZXJ0eUNvbW1hbmQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQkvLyBjaGVjayBpZiB0aGlzIG9wZXJhdGlvbiB3aWxsIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vIHZhbHVlCi0JCS8vCi0JCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuY2hlY2tNb2RpZnlPcHBvc2l0ZShlbGVtZW50LCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSwKLQkJCQllbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJJiYgbW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChlbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvbGRQcm9wZXJ0eSA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShlbGVtZW50LCBrZXkpOwotCQlpZiAob2xkUHJvcGVydHkgIT0gbnVsbCkgewotCQkJb2xkVmFsdWUgPSBvbGRQcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQl9IGVsc2UgewotCQkJb2xkVmFsdWUgPSBudWxsOwotCQl9Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShlbGVtZW50LCBrZXksIHZhbHVlKTsKLQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KGVsZW1lbnQsIGtleSwgb2xkVmFsdWUpOwotCQl9IGVsc2UgewotCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnJlbW92ZVByb3BlcnR5KGVsZW1lbnQsIGtleSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5DYXRlZ29yeUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2ZThmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ2F0ZWdvcnlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db250ZW50RWxlbWVudE9yZGVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWlzYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVvcmRlciBhIG1ldGhvZCBlbGVtZW50IHdpdGhpbiBhIGNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVJbkNhdGVnb3J5Q29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeTsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHNMaXN0OwotCQotCXByaXZhdGUgQ29udGVudEVsZW1lbnRPcmRlckxpc3QgZWxlbWVudE9yZGVyTGlzdDsKLQotCXByaXZhdGUgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoOwotCi0JcHJpdmF0ZSBDb250ZW50Q2F0ZWdvcnkgdXNlZENhdGVnb3J5ID0gbnVsbDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQlwdWJsaWMgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTGlzdCBlbGVtZW50c0xpc3QsCi0JCQlDb250ZW50RWxlbWVudE9yZGVyTGlzdCBvcmRlckxpc3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoLAotCQkJaW50IGRpcmVjdGlvbikgewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwkJCi0JCXRoaXMuZWxlbWVudE9yZGVyTGlzdCA9IG9yZGVyTGlzdCA7Ci0JCXRoaXMuY2F0ZWdvcnlQa2dQYXRoID0gY2F0ZWdvcnlQa2dQYXRoOwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgTW92ZUluQ2F0ZWdvcnlDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIE1vdmVJbkNhdGVnb3J5Q29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNhdGVnb3J5LmVSZXNvdXJjZSgpKTsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBlbGVtZW50c0xpc3QuZ2V0KDApKTsKLQotCQlpZiAoY2F0ZWdvcnlQbHVnaW4gIT0gZWxlbWVudFBsdWdpbgotCQkJCSYmIE1pc2MuaXNCYXNlT2YoY2F0ZWdvcnlQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQl1c2VkQ2F0ZWdvcnkgPSBUbmdVdGlsLmZpbmRDb250cmlidXRvcihVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkJZWxlbWVudFBsdWdpbiwgY2F0ZWdvcnlQa2dQYXRoKSwgY2F0ZWdvcnkpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCX0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKHVzZWRDYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWludCBpbmRleCA9IGVsZW1lbnRPcmRlckxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCWVsZW1lbnRPcmRlckxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQlpZiAoaW5kZXggPCBlbGVtZW50T3JkZXJMaXN0LnNpemUoKSkKLQkJCQkJCWVsZW1lbnRPcmRlckxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJfQotCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudE9yZGVyTGlzdC5hcHBseSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlpbnQgaW5kZXggPSBlbGVtZW50T3JkZXJMaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCQlpZiAoaW5kZXggPCBlbGVtZW50T3JkZXJMaXN0LnNpemUoKSkKLQkJCQkJCWVsZW1lbnRPcmRlckxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQkJZWxlbWVudE9yZGVyTGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQltb3ZlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbGVtZW50T3JkZXJMaXN0LmFwcGx5KCk7Ci0JCQltb3ZlZCA9IGZhbHNlOwotCQl9Ci0JCWlmIChUbmdVdGlsLmlzRW1wdHkodXNlZENhdGVnb3J5KSkgewotCQkJRWNvcmVVdGlsLnJlbW92ZSh1c2VkQ2F0ZWdvcnkpOwotCQkJdXNlZENhdGVnb3J5ID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPENvbnRlbnRDYXRlZ29yeT4gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VkQ2F0ZWdvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL01vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhODQ0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluQ29uZmlndXJhdGlvbkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gbW92ZSBhIHZpZXcgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotICogQGF1dGhvciBYaWFuZyBEb25nIEh1Ci0gKiBAc2luY2UgMS4yCi0gKiBmaXggZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzM4MjcKLSAqLwotcHVibGljIGNsYXNzIE1vdmVJbkNvbmZpZ3VyYXRpb25Db21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQkKLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgTGlzdCBlbGVtZW50c0xpc3Q7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IFVQID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBEb3duID0gMDsKLQotCXByaXZhdGUgaW50IGRpcmVjdGlvbiA9IC0xOwotCi0JcHJpdmF0ZSBib29sZWFuIG1vdmVkOwotCQotCXB1YmxpYyBNb3ZlSW5Db25maWd1cmF0aW9uQ29tbWFuZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdCBlbGVtZW50c0xpc3QsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGRpcmVjdGlvbikgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5lbGVtZW50c0xpc3QgPSBlbGVtZW50c0xpc3Q7Ci0JCXRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJcmVkbygpOwotCi0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHNMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUVMaXN0IGxpc3QgPSAoRUxpc3QpIGNvbmZpZy5lR2V0KGZlYXR1cmUpOwotCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCWxpc3QubW92ZShpbmRleCAtIDEsIG9iamVjdCk7Ci0JCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCQlpZiAoaW5kZXggPCBsaXN0LnNpemUoKSkKLQkJCQkJCWxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJfQotCQkJCW1vdmVkID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uZmlnLmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbmZpZy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29uZmlnLmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JfQotCQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlFTGlzdCBsaXN0ID0gKEVMaXN0KSBjb25maWcuZUdldChmZWF0dXJlKTsKLQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCWlmIChkaXJlY3Rpb24gPT0gVVApIHsKLQkJCQkJCWlmIChpbmRleCA8IGxpc3Quc2l6ZSgpKQotCQkJCQkJCWxpc3QubW92ZShpbmRleCArIGVsZW1lbnRzTGlzdC5zaXplKCksIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCQkJbGlzdC5tb3ZlKGluZGV4IC0gMSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQltb3ZlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29uZmlnLmVTZXQoZmVhdHVyZSwgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQltb3ZlZCA9IGZhbHNlOwotCQl9Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29uZmlnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9Nb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmNmM1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1pc2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlNlY3Rpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW9yZGVyIGEgc2VjdGlvbiB3aXRoaW4gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZUluU2VjdGlvbkxpc3RDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIFNlY3Rpb25MaXN0IHNlY3Rpb25MaXN0OwotCi0JcHJpdmF0ZSBMaXN0PD8gZXh0ZW5kcyBTZWN0aW9uPiBlbGVtZW50c0xpc3Q7Ci0KLQlwcml2YXRlIENvbnRlbnRFbGVtZW50IHVzZWRDb250ZW50RWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgVVAgPSAxOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IERvd24gPSAwOwotCi0JcHJpdmF0ZSBpbnQgZGlyZWN0aW9uID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbW92ZWQ7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCwKLQkJCUxpc3Q8PyBleHRlbmRzIFNlY3Rpb24+IGVsZW1lbnRzTGlzdCwgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3QsIGludCBkaXJlY3Rpb24pIHsKLQkJdGhpcy5jb250ZW50RWxlbWVudCA9IGNvbnRlbnRFbGVtZW50OwotCQl0aGlzLnNlY3Rpb25MaXN0ID0gc2VjdGlvbkxpc3Q7Ci0JCXRoaXMuZWxlbWVudHNMaXN0ID0gZWxlbWVudHNMaXN0OwotCQl0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIE1vdmVJblNlY3Rpb25MaXN0Q29tbWFuZChTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBNb3ZlSW5TZWN0aW9uTGlzdENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnRFbGVtZW50LmVSZXNvdXJjZSgpKTsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIHRhc2tQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb250ZW50RWxlbWVudCk7Ci0JCU1ldGhvZFBsdWdpbiBlbGVtZW50UGx1Z2luID0gVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRzTGlzdC5nZXQoMCkpOwotCi0JCWlmICh0YXNrUGx1Z2luICE9IGVsZW1lbnRQbHVnaW4KLQkJCQkmJiBNaXNjLmlzQmFzZU9mKHRhc2tQbHVnaW4sIGVsZW1lbnRQbHVnaW4pKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycyhjb250ZW50RWxlbWVudCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmUgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudAotCQkJCQkJJiYgVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4odmUpID09IGVsZW1lbnRQbHVnaW4pIHsKLQkJCQkJdXNlZENvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSB2ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1c2VkQ29udGVudEVsZW1lbnQgPT0gbnVsbCkgewotCQkJdXNlZENvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAodXNlZENvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBzaXplID0gZWxlbWVudHNMaXN0LnNpemUoKTsKLQkJZm9yIChTZWN0aW9uIG9iamVjdCA6IGVsZW1lbnRzTGlzdCkgewotCQkJaW50IGluZGV4ID0gc2VjdGlvbkxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJaWYgKGRpcmVjdGlvbiA9PSBVUCkgewotCQkJCWlmIChpbmRleCA+IDApCi0JCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRG93bikgewotCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJc2VjdGlvbkxpc3QubW92ZShpbmRleCArIHNpemUsIG9iamVjdCk7Ci0JCQl9Ci0JCQltb3ZlZCA9IHRydWU7Ci0JCX0KLQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChtb3ZlZCkgewotCQkJaW50IHNpemUgPSBlbGVtZW50c0xpc3Quc2l6ZSgpOwotCQkJZm9yIChTZWN0aW9uIG9iamVjdCA6IGVsZW1lbnRzTGlzdCkgewotCQkJCWludCBpbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQlpZiAoZGlyZWN0aW9uID09IFVQKSB7Ci0JCQkJCWlmIChpbmRleCA8IHNlY3Rpb25MaXN0LnNpemUoKSkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggKyBzaXplLCBvYmplY3QpOwotCQkJCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERvd24pIHsKLQkJCQkJaWYgKGluZGV4ID4gMCkKLQkJCQkJCXNlY3Rpb25MaXN0Lm1vdmUoaW5kZXggLSAxLCBvYmplY3QpOwotCQkJCX0KLQkJCQltb3ZlZCA9IHRydWU7Ci0JCQl9Ci0JCQlzZWN0aW9uTGlzdC5hcHBseSgpOwotCQkJbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodXNlZENvbnRlbnRFbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9OZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvTmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmM2OTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9OZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciB7Ci0JcHJpdmF0ZSBDb21tYW5kIGNvbW1hbmQ7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29tbWFuZD4gbmVzdGVkQ29tbWFuZHM7Ci0KLQlwdWJsaWMgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0JCi0JcHVibGljIExpc3Q8Q29tbWFuZD4gZ2V0TmVzdGVkQ29tbWFuZHMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzID09IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdDxDb21tYW5kPigpOwotCQl9Ci0JCXJldHVybiBuZXN0ZWRDb21tYW5kczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCUxpc3Q8SU5lc3RlZENvbW1hbmRQcm92aWRlcj4gbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQlpZighbmVzdGVkQ29tbWFuZFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA6IG5lc3RlZENvbW1hbmRQcm92aWRlcnMpIHsKLQkJCQl0cnkgewotCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZU5lc3RlZENvbW1hbmQoY29tbWFuZCk7Ci0JCQkJCWlmKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsJCQkJCQkJCi0JCQkJCQljbWQuZXhlY3V0ZSgpOwotCQkJCQkJZ2V0TmVzdGVkQ29tbWFuZHMoKS5hZGQoY21kKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9CQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG9OZXN0ZWRDb21tYW5kcygpIHsKLQkJaWYobmVzdGVkQ29tbWFuZHMgIT0gbnVsbCAmJiAhbmVzdGVkQ29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IoaW50IGkgPSBuZXN0ZWRDb21tYW5kcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIG5lc3RlZENvbW1hbmRzLmdldChpKTsKLQkJCQl0cnkgewotCQkJCQlpZihjbWQuY2FuVW5kbygpKSB7Ci0JCQkJCQljbWQudW5kbygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7IGNtZC5kaXNwb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQkJfQotCQkJfQotCQkJbmVzdGVkQ29tbWFuZHMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRzICE9IG51bGwgJiYgIW5lc3RlZENvbW1hbmRzLmlzRW1wdHkoKSkgewotCQkJZm9yKGludCBpID0gbmVzdGVkQ29tbWFuZHMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlDb21tYW5kIGNtZCA9IChDb21tYW5kKSBuZXN0ZWRDb21tYW5kcy5nZXQoaSk7Ci0JCQkJdHJ5IHsgY21kLmRpc3Bvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJCX0KLQkJCW5lc3RlZENvbW1hbmRzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQlpZihuZXN0ZWRDb21tYW5kcyAhPSBudWxsICYmICFuZXN0ZWRDb21tYW5kcy5pc0VtcHR5KCkpIHsKLQkJCWZvcihpbnQgaSA9IG5lc3RlZENvbW1hbmRzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJQ29tbWFuZCBjbWQgPSAoQ29tbWFuZCkgbmVzdGVkQ29tbWFuZHMuZ2V0KGkpOwotCQkJCWlmKGNtZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJCQl0cnkgewotCQkJCQkJQ29sbGVjdGlvbiByZXNvdXJjZXMgPSAoKElSZXNvdXJjZUF3YXJlQ29tbWFuZCljbWQpLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCQlpZihyZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzLmlzRW1wdHkoKSA/IENvbGxlY3Rpb25zLkVNUFRZX1NFVCA6IG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmOGQ4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZSB7Ci0JCi0JRU9iamVjdCBvd25lcjsKLQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JT2JqZWN0IHZhbHVlOwotCi0JaW50IGluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVmZXJlbmNlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgb3duZXIuZUdldChmZWF0dXJlKTsKLQkJCWluZGV4ID0gbGlzdC5pbmRleE9mKHZhbHVlKTsKLQkJfQotCX0KLQotCVJlZmVyZW5jZShFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZTEwYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBtZXRob2QgZWxlbWVudCBmcm9tIGEgY2F0ZWdvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IGNhdGVnb3J5OwotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQlwcml2YXRlIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb250ZW50UGtnUGF0aDsKLQotCXByaXZhdGUgQ29udGVudENhdGVnb3J5IHVzZWRDYXRlZ29yeTsKLQotCXByaXZhdGUgaW50IHJlbW92ZWRFbGVtZW50SW5kZXggPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpc3QgdXNlZENhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbUNhdGVnb3J5Q29tbWFuZChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnksCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJU3RyaW5nW10gY29udGVudFBrZ1BhdGgsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLmNvbnRlbnRQa2dQYXRoID0gY29udGVudFBrZ1BhdGg7Ci0JCXRoaXMudXNlZENhdGVnb3JpZXMgPSB1c2VkQ2F0ZWdvcmllczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHVzZWRDYXRlZ29yeSAhPSBudWxsICYmIHVzZWRDYXRlZ29yeS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1c2VkQ2F0ZWdvcnkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQlNZXRob2RQbHVnaW4gZWxlbWVudFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCi0JCWlmIChjYXRlZ29yeVBsdWdpbiAhPSBlbGVtZW50UGx1Z2luCi0JCQkJJiYgTWlzYy5pc0Jhc2VPZihjYXRlZ29yeVBsdWdpbiwgZWxlbWVudFBsdWdpbikpIHsKLQkJCXVzZWRDYXRlZ29yeSA9IFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQllbGVtZW50UGx1Z2luLCBjb250ZW50UGtnUGF0aCksIGNhdGVnb3J5KTsKLQkJfSBlbHNlIHsKLQkJCXVzZWRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmICh1c2VkQ2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIHVzZWRDYXRlZ29yeS5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJCXJlbW92ZWRFbGVtZW50SW5kZXggPSAoKEVMaXN0KSBjb2xsZWN0aW9uKS5pbmRleE9mKGVsZW1lbnQpOwotCQkJfQotCQkJcmVtb3ZlZCA9IGNvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQlyZW1vdmVkID0gdHJ1ZTsKLQkJfQotCQlpZiAocmVtb3ZlZCkgewotCQkJaWYgKCF1c2VkQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLQkJCQl1c2VkQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmIChyZW1vdmVkKSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSB1c2VkQ2F0ZWdvcnkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEVMaXN0ICYmIHJlbW92ZWRFbGVtZW50SW5kZXggIT0gLTEpIHsKLQkJCQkJKChFTGlzdCkgY29sbGVjdGlvbikuYWRkKHJlbW92ZWRFbGVtZW50SW5kZXgsIGVsZW1lbnQpOwotCQkJCX0gZWxzZQotCQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdXNlZENhdGVnb3J5LmVTZXQoZmVhdHVyZSwgZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZW1vdmVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHVzZWRDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotCQkJdXNlZENhdGVnb3JpZXMucmVtb3ZlKGNhdGVnb3J5KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZUZyb21TZWN0aW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjRhZGUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZW1vdmVGcm9tU2VjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TZWN0aW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gYSBzZWN0aW9uIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVGcm9tU2VjdGlvbkxpc3QgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudDsKLQotCXByaXZhdGUgU2VjdGlvbkxpc3Qgc2VjdGlvbkxpc3Q7Ci0KLQlwcml2YXRlIFNlY3Rpb24gc2VjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVkOwotCi0JcHJpdmF0ZSBpbnQgcmVtb3ZlZE9iamVjdEluZGV4ID0gLTE7Ci0KLQlwdWJsaWMgUmVtb3ZlRnJvbVNlY3Rpb25MaXN0KENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50LAotCQkJU2VjdGlvbiBzZWN0aW9uLCBTZWN0aW9uTGlzdCBzZWN0aW9uTGlzdCkgewotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0JCXRoaXMuc2VjdGlvbkxpc3QgPSBzZWN0aW9uTGlzdDsKLQkJdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKLQotCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoY29udGVudEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlbW92ZWRPYmplY3RJbmRleCA9IHNlY3Rpb25MaXN0LmluZGV4T2Yoc2VjdGlvbik7Ci0JCXNlY3Rpb25MaXN0LnJlbW92ZShzZWN0aW9uKTsKLQkJcmVtb3ZlZCA9IHRydWU7Ci0JCXNlY3Rpb25MaXN0LmFwcGx5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKHJlbW92ZWQpIHsKLQkJCWlmIChyZW1vdmVkT2JqZWN0SW5kZXggIT0gLTEpIHsKLQkJCQlzZWN0aW9uTGlzdC5hZGQocmVtb3ZlZE9iamVjdEluZGV4LCBzZWN0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VjdGlvbkxpc3QuYWRkKHNlY3Rpb24pOwotCQkJfQotCQkJc2VjdGlvbkxpc3QuYXBwbHkoKTsKLQkJCXJlbW92ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY29udGVudEVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1JlbW92ZVJlZmVyZW5jZXNDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxODk0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVtb3ZlUmVmZXJlbmNlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gcmVtb3ZlIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcml2YXRlIE1ldGhvZFBsdWdpbiBiYXNlOwotCi0JcHJpdmF0ZSBNYXA8RmVhdHVyZVZhbHVlUGFpciwgT2JqZWN0PiBmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXA7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGNvbW1hbmQgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIGluIDxjb2RlPnBsdWdpbjwvY29kZT4KLQkgKiB0aGF0IGFyZSBlbGVtZW50cyBvZiA8Y29kZT5iYXNlPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gYmFzZQotCSAqLwotCXB1YmxpYyBSZW1vdmVSZWZlcmVuY2VzQ29tbWFuZChNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RQbHVnaW4gYmFzZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjcHJlcGFyZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAgPSBuZXcgSGFzaE1hcDxGZWF0dXJlVmFsdWVQYWlyLCBPYmplY3Q+KCk7Ci0JCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0KLQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgcGx1Z2luCi0JCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBmZWF0dXJlSXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCWlmIChmICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9CYXNlcygpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQobmV3IEZlYXR1cmVWYWx1ZVBhaXIoZiwgcmVmKSwKLQkJCQkJCXBsdWdpbik7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwbHVnaW4uZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCi0JCQkvLyBpZ25vcmUgUHJvY2Vzc0VsZW1lbnQgYi9jIGl0IGNhbiByZWZlcmVuY2VzIGFueXRoaW5nCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBlbGVtZW50Ci0JCQkJCS5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgZmVhdHVyZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCi0JCQkJaWYgKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGZlYXR1cmVJdGVyYXRvci5mZWF0dXJlKCk7Ci0JCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQoCi0JCQkJCQkJbmV3IEZlYXR1cmVWYWx1ZVBhaXIoZiwgcmVmKSwgZWxlbWVudCk7Ci0JCQkJCWlmKGYgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQkJCQkJCWZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5wdXQoCi0JCQkJCQkJCW5ldyBGZWF0dXJlVmFsdWVQYWlyKGZlYXR1cmUsIGVsZW1lbnQuZUdldChmZWF0dXJlKSksIGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCUZlYXR1cmVWYWx1ZVBhaXIgZnZQYWlyID0gKEZlYXR1cmVWYWx1ZVBhaXIpIGVudHJ5LmdldEtleSgpOwotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoZnZQYWlyLmZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIGVsZW1lbnQuZUdldChmdlBhaXIuZmVhdHVyZSkpCi0JCQkJCQkucmVtb3ZlKGZ2UGFpci52YWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWVsZW1lbnQuZVNldChmdlBhaXIuZmVhdHVyZSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGVsZW1lbnQuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVWYWx1ZVBhaXJUb09iamVjdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlGZWF0dXJlVmFsdWVQYWlyIGZ2UGFpciA9IChGZWF0dXJlVmFsdWVQYWlyKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGZ2UGFpci5mZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJKChDb2xsZWN0aW9uKSBlbGVtZW50LmVHZXQoZnZQYWlyLmZlYXR1cmUpKS5hZGQoZnZQYWlyLnZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZWxlbWVudC5lU2V0KGZ2UGFpci5mZWF0dXJlLCBmdlBhaXIudmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJhc2UgPSBwbHVnaW4gPSBudWxsOwotCQlpZihmZWF0dXJlVmFsdWVQYWlyVG9PYmplY3RNYXAgIT0gbnVsbCkgewotCQkJZmVhdHVyZVZhbHVlUGFpclRvT2JqZWN0TWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmVhdHVyZVZhbHVlUGFpciB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCi0JCU9iamVjdCB2YWx1ZTsKLQotCQlGZWF0dXJlVmFsdWVQYWlyKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmLCBPYmplY3QgdikgewotCQkJZmVhdHVyZSA9IGY7Ci0JCQl2YWx1ZSA9IHY7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkYTNlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci0KLS8qKgotICogQSBjb21wb3VuZCBjb21tYW5kIHRoYXQgaXMgcmVzb3VyY2UgYXdhcmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChMaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIExpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkJCUxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIobGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoaW50IHJlc3VsdEluZGV4KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHRJbmRleAotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUF3YXJlQ29tcG91bmRDb21tYW5kKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLAotCQkJTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0SW5kZXgKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZUNvbXBvdW5kQ29tbWFuZChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwKLQkJCVN0cmluZyBkZXNjcmlwdGlvbiwgTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21tYW5kTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIGNtZCkKLQkJCQkJCS5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1Jlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU2MjEyZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5EcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIERyYWdBbmREcm9wQ29tbWFuZCAKLWltcGxlbWVudHMgSVJlc291cmNlQXdhcmVDb21tYW5kCi17Ci0KLQlwcml2YXRlIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGNvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICogQHBhcmFtIG9wdGltaXplCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwKLQkJCWZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgYm9vbGVhbiBvcHRpbWl6ZSkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uLAotCQkJCW9wdGltaXplKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCWlmKGRyb3BDb21tYW5kICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcyA9IFRuZ1V0aWwuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoZHJvcENvbW1hbmQpOwotCQkJfQotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCB8fCBtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzlkMzE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9SZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCBleHRlbmRzCi0JCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIG9wdGltaXplCi0JICovCi0JcHVibGljIFJlc291cmNlQXdhcmVQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLCBpbnQgaW5kZXgsIGJvb2xlYW4gb3B0aW1pemUpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIG9wdGltaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBd2FyZVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIGludCBpbmRleCkgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBmZWF0dXJlLCBpbmRleCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZihvd25lciBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KW93bmVyKS5lUmVzb3VyY2UoKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmQuZ2V0Q29tbWFuZExpc3QoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjbWQgPSBpdGVyLm5leHQoKTsKLQkJCXdoaWxlKCEoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSAmJiBjbWQgaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJCWNtZCA9ICgoQ29tbWFuZFdyYXBwZXIpY21kKS5nZXRDb21tYW5kKCk7Ci0JCQl9Ci0JCQlpZiAoY21kIGluc3RhbmNlb2YgSVJlc291cmNlQXdhcmVDb21tYW5kKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKCgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjbWQpCi0JCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9TYXZlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZjUwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NhdmVTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogVGhlIHN0YXR1cyBvZiBhIHNhdmUgb3BlcmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2F2ZVN0YXR1cyBleHRlbmRzIFN0YXR1cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTQVZFX0VSUk9SID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPTExCQUNLX0VSUk9SID0gMjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHBhcmFtIGNvZGUKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2F2ZVN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBwbHVnaW5JZCwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLAotCQkJVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1NldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0YzY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCBhbiBvcHBvc2l0ZSBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2V0T3Bwb3NpdGVGZWF0dXJlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZTsKLQotCXByaXZhdGUgRU9iamVjdCB2YWx1ZTsKLQotCXByaXZhdGUgRU9iamVjdCBvbGRWYWx1ZTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQoTWV0aG9kRWxlbWVudCBlLAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgRU9iamVjdCB2YWx1ZSkgewotCQl0aGlzLmVsZW1lbnQgPSBlOwotCQl0aGlzLm9wcG9zaXRlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNwcmVwYXJlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrTW9kaWZ5T3Bwb3NpdGUoCi0JCQkJCShNZXRob2RFbGVtZW50KSB2YWx1ZSwgb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwKLQkJCQkJZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJb2xkVmFsdWUgPSAoRU9iamVjdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgb2xkVmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCW9sZFZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAob2xkVmFsdWUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChvbGRWYWx1ZS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIHZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIGVsZW1lbnQpOwotCQkJfQotCQkJaWYgKHZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodmFsdWUuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKS5pc01hbnkoKSkgewotCQkJCSgoQ29sbGVjdGlvbikgdmFsdWUuZUdldChvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpKSkKLQkJCQkJCS5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCXZhbHVlLmVTZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCkuaXNNYW55KCkpIHsKLQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlLmVHZXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSkpCi0JCQkJCQkuYWRkKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlvbGRWYWx1ZS5lU2V0KG9wcG9zaXRlRmVhdHVyZS5nZXRUYXJnZXRGZWF0dXJlKCksIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbW1hbmQvVXNlcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmYzYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL1VzZXJJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotCi0vKioKLSAqIENsYXNzIHRoYXQga2VlcHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCByZXF1ZXN0IGFuZCByZWZlcmVuY2UgdG8gdGhlCi0gKiBpbnB1dCB1c2VyIHNwZWNpZmllZCBvciBzZWxlY3RlZAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXNlcklucHV0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVhUID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTiA9IDE7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgaW50IHR5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbXVsdGlwbGU7Ci0KLQlwcml2YXRlIExpc3QgY2hvaWNlczsKLQotCXByaXZhdGUgT2JqZWN0IGlucHV0OwotCi0JcHJpdmF0ZSBJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JcHVibGljIFVzZXJJbnB1dChTdHJpbmcgbGFiZWwsIGludCB0eXBlLCBib29sZWFuIG11bHRpcGxlLCBMaXN0IGNob2ljZXMsCi0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJdGhpcyhsYWJlbCwgdHlwZSwgbXVsdGlwbGUsIGNob2ljZXMsIGxhYmVsUHJvdmlkZXIsIG51bGwsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIG11bHRpcGxlCi0JICogQHBhcmFtIGNob2ljZXMKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlcgotCSAqICAgICAgICAgICAgdGhlIGxhYmVsIHByb3ZpZGVyIHRvIHJlcHJlc2VudCB0aGUgZWxlbWVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmNob2ljZXM8L2NvZGU+IGxpc3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICB0aGUgdmFsaWRhdG9yIHRvIHZhbGlkYXRlIHRoZSBpbnB1dAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCBvZiB0aGUgdXNlciBpbnB1dCB0aGF0IGlzIGNvbW1hbmQtc3BlY2lmaWMgYW5kIGNhbgotCSAqICAgICAgICAgICAgY29udGFpbiBhZGRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlciBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgVXNlcklucHV0KFN0cmluZyBsYWJlbCwgaW50IHR5cGUsIGJvb2xlYW4gbXVsdGlwbGUsIExpc3QgY2hvaWNlcywKLQkJCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IGNvbnRleHQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLm11bHRpcGxlID0gbXVsdGlwbGU7Ci0JCXRoaXMuY2hvaWNlcyA9IGNob2ljZXM7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgaW5wdXQpIHsKLQkJdGhpcy5pbnB1dCA9IGlucHV0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldENob2ljZXMoKSB7Ci0JCXJldHVybiBjaG9pY2VzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxlKCkgewotCQlyZXR1cm4gbXVsdGlwbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYWJlbCBwcm92aWRlcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxhYmVsIHByb3ZpZGVyCi0JICovCi0JcHVibGljIElJdGVtTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsaWRhdG9yCi0JICogCi0JICogQHJldHVybiB0aGUgdmFsaWRhdG9yCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhpcyB1c2VyIGlucHV0Ci0JICogCi0JICogQHJldHVybiB0aGUgY29udGV4dAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZDdjZTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGNvbW1hbmRzIGZvciBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjM1MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhbiBhY3Rpdml0eSBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5BY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvY2VzczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJT2JqZWN0IHRvcCA9IGdldFRvcEl0ZW0oKTsKLQkJCWlmICh0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQkJcHJvY2VzcyA9IChQcm9jZXNzKSB0b3A7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAgY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUgCi0JCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCSYmICFUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpIGNoaWxkKQotCQkJCSYmIFByb2Nlc3NVdGlsLmFjY2VwdCgoQWN0aXZpdHkpIGNoaWxkLCBnZXRGaWx0ZXIoKSwgZmFsc2UpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyByZW1vdmUgYW55IHN1cHByZXNzZWQgY2hpbGQKLQkJLy8KLQkJUHJvY2VzcyBwcm9jID0gZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBnZXRQcm9jZXNzKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgZ2V0Q2hpbGRyZW4oT2JqZWN0KSBpcyBjYWxsZWQKLQkJCS8vIG9uIGJhc2UgYWN0aXZpdHkgdG8KLQkJCS8vIHJldHJpZXZlIGl0cyBjaGlsZHJlbgotCQkJLy8KLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gU3VwcHJlc3Npb24uZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykgPT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRCkgewotCQkJLy8gcmVmcmVzaCBwYXJlbnQgY29udGVudAotCQkJLy8KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQlnZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdmZDY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGJhc2UgaXRlbSBwcm92aWRlciBhZGFwdGVyIGNsYXNzIGZvciB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBpbgotICogYSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjaGlsZHJlbjsKLQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aDsKLQotCXByb3RlY3RlZCBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgdW5jYXRlZ29yaXplZEZpbHRlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgdW5jYXRlZ29yaXplZExhYmVsOwotCi0JcHJvdGVjdGVkIElGaWx0ZXIgY2F0ZWdvcml6ZWRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHVuY2F0ZWdvcml6ZWRJbWFnZTsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciB1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gbWV0aG9kQ29uZmlnLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCWxhYmVsID0gbmFtZTsKLQkJdGhpcy5jYXRlZ29yeVBrZ1BhdGggPSBjYXRlZ29yeVBrZ1BhdGg7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciBjcmVhdGVVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKCkgewotCQlpZiAodW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl1bmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyID0gbmV3IFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIHVuY2F0ZWdvcml6ZWRGaWx0ZXIsCi0JCQkJCXVuY2F0ZWdvcml6ZWRMYWJlbCwgdW5jYXRlZ29yaXplZEltYWdlKTsKLQkJfQotCQlyZXR1cm4gdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCX0KLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGFyZ2V0OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJCWNhdGVnb3J5UGtnUGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwgLyoKLQkJCQkJCQkgKiAmJgotCQkJCQkJCSAqIG1ldGhvZENvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMocGtnKQotCQkJCQkJCSAqLykgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoY2F0ZWdvcml6ZWRGaWx0ZXIuYWNjZXB0KGVsZW1lbnQpCi0JCQkJCQkJJiYgKGZpbHRlciAhPSBudWxsID8gZmlsdGVyLmFjY2VwdChlbGVtZW50KSA6IHRydWUpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpCi0JCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoCi0JCQkJCQkJaXRlci5uZXh0KCksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBPYmplY3QgYWRhcHRlciA9Ci0JCQkvLyAoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UpLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQoaXRlci5uZXh0KCksCi0JCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJCS8vIFRoaXMgaXMgbmVlZCBmb3JjaW5nIHRvIHNldCB0aGUgSUNvbmZpZ3VyYXRvciB0byBDaGlsZHJlbnMKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodW5jYXRlZ29yaXplZEZpbHRlciAhPSBudWxsKSB7Ci0JCQljaGlsZHJlbi5hZGQoY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyh0YXJnZXQsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhtZXRob2RDb25maWcsIGVkaXRpbmdEb21haW4sCi0JCQkJc2libGluZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGxhYmVsICE9IG51bGwpCi0JCQlyZXR1cm4gbGFiZWw7Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yaXplZEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQljYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkRmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXVuY2F0ZWdvcml6ZWRGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5jYXRlZ29yaXplZExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl1bmNhdGVnb3JpemVkTGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmNhdGVnb3JpemVkSW1hZ2UoT2JqZWN0IGltZykgewotCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBpbWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJdW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9DYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2E2ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ2FwYWJpbGl0eSBQYXR0ZXJucyIgYW5kICJEZWxpdmVyeQotICogUHJvY2Vzc2VzIiBmb2xkZXJzIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlLAotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIHBrZ1BhdGg7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBPYmplY3QgaW1hZ2U7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSwKLQkJCVN0cmluZ1tdIHBrZ1BhdGgpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLnBrZ1BhdGggPSBwa2dQYXRoOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbi5jbGVhcigpOwotCQl9Ci0JCUFycmF5TGlzdCBwcm9jUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGtnUGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwKLQkJCQkJJiYgbWV0aG9kQ29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5jb2xsZWN0Q2hpbGRyZW4oY2hpbGRyZW4sCi0JCQkJCQkJZWxlbWVudCwgZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXByb2NQa2dzLmlzRW1wdHkoKSkgewotCQkJY2hpbGRyZW4uYWRkQWxsKDAsIHByb2NQa2dzKTsKLQotCQkJLy8gVE9ETzogc29ydCBhbHBoYWJldGljYWxseSwgcHJvY2VzcyBwYWNrYWdlcyBiZWZvcmUgcHJvY2Vzc2VzCi0JCX0KLQotCQkvLyBzZXQgcGFyZW50Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzVXRpbC5zZXRQYXJlbnQoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBzdXBlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG1ldGhvZENvbmZpZywgZWRpdGluZ0RvbWFpbiwKLQkJCQlzaWJsaW5nKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0N1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2YWYyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJDdXN0b20gQ2F0ZWdvcmllcyIgZm9sZGVyIGluIHRoZQotICogQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciB7Ci0KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlLCBjYXRlZ29yeVBrZ1BhdGgpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0YXJnZXQ7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCUN1c3RvbUNhdGVnb3J5IHJvb3QgPSBUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiBwa2cgIT0gbnVsbAotCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcm9vdC5nZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIuYWNjZXB0KGVsZW1lbnQpIDogdHJ1ZSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudAotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0Q29uZmlndXJhdGlvblZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KAotCQkJCQkJCWl0ZXIubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5N2QyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRpc2NpcGxpbmUgZ3JvdXBpbmcgaW4gdGhlIENvbmZpZ3VyYXRpb24KLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCURpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lQ2F0ZWdvcnlJdGVtUHJvdmlkZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3J5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JCS8vIFRPRE86IGNvbW1lbnRlZCBvdXQgdW50aWwgSmluaHVhIGZpeGVkIGJ1Z3MgaW4gQ29uZmlndXJhdGlvbkZpbHRlcgotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKG9iamVjdCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbigpOiByZXR1cm5lZCBmcm9tIGNvbmZpZ3VyYXRvcjogIiArIGNoaWxkcmVuKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQkJfQotCi0JCWNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0OwotCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgKChDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSBnZXRQYXJlbnQob2JqZWN0KSkKLQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCVRuZ1V0aWwuYWRkRXh0ZW5kZWRDaGlsZHJlbihncm91cGluZywgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IChUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCgKLQkJCQkJCQlpdGVyLm5leHQoKSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjA5OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjI2YmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGRvbWFpbiBpbiB0aGUgQ29uZmlndXJhdGlvbiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRvbWFpbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBEb21haW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlZDBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGd1aWRhbmNlIGZvbGRlcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIsIElDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBBIG1hcCBvZiBFQ2xhc3MgLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciBlYWNoIHR5cGUgb2YgZ3VpZGFuY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGNoZWNrTGlzdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGNvbmNlcHRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiAoKG9iaiBpbnN0YW5jZW9mIENvbmNlcHQpICYmICghKG9iaiBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBleGFtcGxlRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRXhhbXBsZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHByYWN0aWNlRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUHJhY3RpY2U7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciByZXBvcnRGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSZXBvcnQ7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciByZXVzYWJsZUFzc2V0RmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldDsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHJvYWRtYXBGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBSb2FkbWFwOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgZ3VpZGVsaW5lRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgR3VpZGVsaW5lOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgdGVtcGxhdGVGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUZW1wbGF0ZTsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRlcm1EZWZpbml0aW9uRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb247Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB0b29sTWVudG9yRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgVG9vbE1lbnRvcjsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHdoaXRlUGFwZXJGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXaGl0ZXBhcGVyOwotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMubWV0aG9kQ29uZmlnID0gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJCS8vIGNoZWNrbGlzdAotCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJR3VpZGFuY2VJdGVtUHJvdmlkZXIgY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGNoZWNrTGlzdEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gY29uY2VwdAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvQ29uY2VwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfQ29uY2VwdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoY29uY2VwdEZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJLy8gZXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIGV4YW1wbGUKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0V4YW1wbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX0V4YW1wbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGV4YW1wbGVGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIHByYWN0aWNlCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9QcmFjdGljZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHByYWN0aWNlRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBSZXBvcnQKLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JlcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmVwb3J0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyZXBvcnRGaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFJldXNhYmxlIEFzc2V0Ci0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyZXVzYWJsZUFzc2V0RmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBSZXVzYWJsZSBBc3NldAotCQkJaW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJImZ1bGwvb2JqMTYvUm9hZG1hcHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUm9hZG1hcCIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcihyb2FkbWFwRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBTdXBwb3J0aW5nIE1hdGVyaWFsCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIoc3VwcG9ydGluZ01hdGVyaWFsRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyAvLyBUZWNobmlxdWUKLQkJCS8vIGltYWdlID0KLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKCJmdWxsL29iajE2L1RlY2huaXF1ZXMiKTsKLQkJCS8vIG5hbWUgPQotCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlY2huaXF1ZXMiKTsKLQkJCS8vIGNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkvLyBuYW1lLCBpbWFnZSk7Ci0JCQkvLyBjaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0ZWNobmlxdWVGaWx0ZXIpOwotCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRlbXBsYXRlCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9UZW1wbGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVtcGxhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKHRlbXBsYXRlRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBUZXJtIERlZmluaXRpb24KLQkJCWltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L1Rlcm1EZWZpbml0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19UZXJtRGVmaW5pdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgR3VpZGFuY2VJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywKLQkJCQkJbmFtZSwgaW1hZ2UpOwotCQkJY2hpbGQuc2V0R3VpZGFuY2VGaWx0ZXIodGVybURlZmluaXRpb25GaWx0ZXIpOwotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIFRvb2wgTWVudG9yCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Ub29sTWVudG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Ub29sTWVudG9ycyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih0b29sTWVudG9yRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBXaGl0ZXBhcGVyCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9XaGl0ZXBhcGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19XaGl0ZXBhcGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZCA9IG5ldyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgbWV0aG9kQ29uZmlnLAotCQkJCQluYW1lLCBpbWFnZSk7Ci0JCQljaGlsZC5zZXRHdWlkYW5jZUZpbHRlcih3aGl0ZVBhcGVyRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQkvLyBHdWlkZWxpbmVzCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9HdWlkYW5jZXNfV29ya1Byb2R1Y3RHdWlkZWxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJCW5hbWUsIGltYWdlKTsKLQkJCWNoaWxkLnNldEd1aWRhbmNlRmlsdGVyKGd1aWRlbGluZUZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCQkKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkvLyBTaG91bGQgZmlsdGVyIG9ubHkgY29weSBvbmx5LCBub3Qgb3JnaW5hbCBjYWNoZWQgY2hpbGRyZW4gbGlzdC4KLQkJCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvcHkuYWRkQWxsKGNoaWxkcmVuKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb3B5Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlHdWlkYW5jZUl0ZW1Qcm92aWRlciBvYmogPSAoR3VpZGFuY2VJdGVtUHJvdmlkZXIpIGl0ZXJhdG9yCi0JCQkJCQkubmV4dCgpOwotCQkJCW9iai5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlpZiAob2JqLmdldENoaWxkcmVuKG9iaikuaXNFbXB0eSgpKSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjb3B5OwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQkJCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXIjZ2V0R3JvdXBJdGVtUHJvdmlkZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEdyb3VwSXRlbVByb3ZpZGVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBncm91cEl0ZW1Qcm92aWRlck1hcC5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM5OGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgZ3VpZGFuY2Ugc3BlY2lmaWMgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCUxpc3QgY2hpbGRyZW47Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQotCXByaXZhdGUgSUZpbHRlciBndWlkYW5jZUZpbHRlcjsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwdWJsaWMgY2xhc3MgQ29tcGFyZUJ5TmFtZSBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpIHsKLQkJCVN0cmluZyBuYW1lMSA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMSkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIG5hbWUyID0gKChNZXRob2RFbGVtZW50KSBvYmoyKS5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZTEuY29tcGFyZVRvSWdub3JlQ2FzZShuYW1lMik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJLy8gbWV0aG9kQ29uZmlnLmVBZGFwdGVycygpLmFkZCh0aGlzKTsKLQkJbGFiZWwgPSBuYW1lOwotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgdGFyZ2V0OwotCi0JCUFycmF5TGlzdCBmaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZ3VpZGFuY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQoZ3VpZGFuY2VGaWx0ZXIpOwotCQl9Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQoZmlsdGVyKTsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgZWxlbWVudExpc3QgPSBuZXcgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KAotCQkJCW1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCUxpc3QgZWxlbWVudHMgPSBlbGVtZW50TGlzdC5nZXRMaXN0KCk7Ci0KLQkJLy8gc29ydCBieSBuYW1lCi0JCUNvbGxlY3Rpb25zLnNvcnQoZWxlbWVudHMsIG5ldyBDb21wYXJlQnlOYW1lKCkpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMobWV0aG9kQ29uZmlnLCBlZGl0aW5nRG9tYWluLAotCQkJCXNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3VpZGFuY2VGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJZ3VpZGFuY2VGaWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDg5ZWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50Lk1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZHBsdWdpbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZFBsdWdpbkFkYXB0ZXIoKQotCSAqLwotCS8qCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlhZGFwdGVyLnNldE1vZGVsU3RydWN0dXJlKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0JKi8KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLk1ldGhvZHBsdWdpbkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlciA9IG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZG9tYWluSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJvbGVTZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByYWN0aWNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5MzRlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBLZWVwcyB0cmFjayBvZiBhIGxpc3Qgb2YgbWV0aG9kIGVsZW1lbnRzIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCB7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwotCi0JcHJpdmF0ZSBMaXN0IGZpbHRlckxpc3Q7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTE0Mzg5NzAxMjM5ODU5MDZMOwotCi0JCXByb3RlY3RlZCBFbGVtZW50SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQkJc3VwZXIoY29udGVudFBrZywgZmFsc2UpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTGlzdCBnZXRDaGlsZHJlbkxpc3QoT2JqZWN0IG9iamVjdCkgewotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IHBhY2thZ2VzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJCQkmJiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaikpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGNoZWNrQWNjZXB0YW5jZSgpKSB7Ci0JCQkJCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJCXNpemUgPSBlbGVtZW50cy5zaXplKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbChwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsCi0JCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMuZmlsdGVyTGlzdCA9IGZpbHRlckxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tBY2NlcHRhbmNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJaW50IHNpemUgPSBmaWx0ZXJMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gKElGaWx0ZXIpIGZpbHRlckxpc3QuZ2V0KGkpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KG9iamVjdCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3IgbmV3SXRlcmF0b3IoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKHBrZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEFsbEVsZW1lbnRzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3SXRlcmF0b3IocGtnKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIShlIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKSB7Ci0JCQkJbGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG1ldGhvZENvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJZ2V0QWxsRWxlbWVudHMocGtnLCBsaXN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDU5MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuRGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0c0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUdyb3VwQ29udGFpbmVyLCBJQ29uZmlndXJhYmxlLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBNYXAgZ3JvdXBJdGVtUHJvdmlkZXJNYXA7Ci0KLQkvLyBjaGFuZ2VkIHRvIHByb3RlY3RlZCwgZXh0ZW5kZWQgY2xhc3MgY2FuIHBsYXkgd2l0aCBjaGlsZHJlbiB2YXJpYWJsZS4KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRpc2NpcGxpbmVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgb2JqOwotCQkJLy8gQnJvd3Npbmc6IFdpdGggY2F0ZWdvcmllcywgcmVwbGFjZSBnZW5lcmFsaXphdGlvbgotCQkJLy8gY2F1c2VzIGJvdGggcmVwbGFjZW1lbnQgYW5kIGJhc2UgdG8gYmVjb21lIGludmlzaWJsZSB0byBicm93c2luZwotCQkJcmV0dXJuIERpc2NpcGxpbmVDYXRlZ29yaWVzSXRlbVByb3ZpZGVyLmFjY2VwdChlbGVtZW50KSAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCQkJCQkgKiBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PQotCQkJCQkJCQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIGRvbWFpbkZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgRG9tYWluIC8qCi0JCQkJCQkJCQkJCSAqICYmCi0JCQkJCQkJCQkJCSAqICgoRG9tYWluKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciB3b3JrUHJvZHVjdFR5cGVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoV29ya1Byb2R1Y3RUeXBlKW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciByb2xlU2V0c0ZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkvLyBCcm93c2luZzogV2l0aCBjYXRlZ29yaWVzLCByZXBsYWNlIGdlbmVyYWxpemF0aW9uCi0JCQkvLyBjYXVzZXMgYm90aCByZXBsYWNlbWVudCBhbmQgYmFzZSB0byBiZWNvbWUgaW52aXNpYmxlIHRvIGJyb3dzaW5nCi0JCQlyZXR1cm4gUm9sZVNldHNJdGVtUHJvdmlkZXIuYWNjZXB0KG9iaikgLyoKLQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCSAqICgoVmFyaWFiaWxpdHlFbGVtZW50KW9iaikuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09Ci0JCQkJCQkJCQkJCQkJICogbnVsbAotCQkJCQkJCQkJCQkJCSAqLzsKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJRmlsdGVyIHRvb2xzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sIC8qCi0JCQkJCQkJCQkJICogJiYKLQkJCQkJCQkJCQkgKiAoKFRvb2wpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCQkgKiBudWxsCi0JCQkJCQkJCQkJICovOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpbHRlciBjdXN0b21DYXRlZ29yaWVzRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCS8vIEJyb3dzaW5nOiBXaXRoIGNhdGVnb3JpZXMsIHJlcGxhY2UgZ2VuZXJhbGl6YXRpb24KLQkJCS8vIGNhdXNlcyBib3RoIHJlcGxhY2VtZW50IGFuZCBiYXNlIHRvIGJlY29tZSBpbnZpc2libGUgdG8gYnJvd3NpbmcKLQkJCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkN1c3RvbUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCQkJLmFjY2VwdChvYmopIC8qCi0JCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJICogKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0KLQkJCQkJCQkJCSAqIG51bGwKLQkJCQkJCQkJCSAqLzsKLQkJfQotCi0JfTsKLQkKLQkvLyB1cGNhdGVnb3JpemVkIGZpbHRlcnMgY2FuIGJlIHJlc2V0IGJhc2VkIG9uIGNvbmZpZ3VyYXRvci4KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRhc2tGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFRhc2sKLQkJCQkJJiYgQXNzb2NpYXRpb25IZWxwZXIuZ2V0RGlzY2lwbGluZXMoKFRhc2spIG9iaikuaXNFbXB0eSgpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBJRmlsdGVyIGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QKLQkJCQkJJiYgIUFzc29jaWF0aW9uSGVscGVyLmdldERvbWFpbnMoKFdvcmtQcm9kdWN0KSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB3cFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Ci0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFdvcmtQcm9kdWN0VHlwZXMoKFdvcmtQcm9kdWN0KSBvYmopCi0JCQkJCQkJLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUZpbHRlciB1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgUm9sZQotCQkJCQkmJiBBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0cygoUm9sZSkgb2JqKS5pc0VtcHR5KCk7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZFRvb2xNZW50b3JGaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldFRvb2xzKChUb29sTWVudG9yKSBvYmopLmlzRW1wdHkoKTsKLQkJfQotCi0JfTsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBncm91cEl0ZW1Qcm92aWRlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElEaXNwb3NhYmxlKSB7Ci0JCQkJCSgoSURpc3Bvc2FibGUpIGFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCQljaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCS8vIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3Ci0JCS8vIE9iamVjdExpbmtJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgKE5vdGlmaWVyKSBvYmplY3QpKTsKLQkJLy8gfQotCQkvLyBNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikKLQkJLy8gKChPYmplY3RMaW5rSXRlbVByb3ZpZGVyKSBvYmplY3QpLmdldExpbmtlZE9iamVjdCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmYgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqZWN0OwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTdHJpbmcgbmFtZTsKLQkJCU9iamVjdCB1bmNhdGVnb3JpemVkSW1hZ2U7Ci0JCQlDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGNoaWxkOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LAotCQkJCQljb25mLAotCQkJCQluYW1lLAotCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9UYXNrc19jZnYiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKGRpc2NpcGxpbmVzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9UYXNrc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvVGFza3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRG9tYWlucyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKGRvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcik7Ci0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRJbWFnZSh1bmNhdGVnb3JpemVkSW1hZ2UpOwotCQkJY2hpbGQuc2V0Q2F0ZWdvcml6ZWRGaWx0ZXIoZG9tYWluRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJbmFtZSwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCWNoaWxkLnNldFBhcmVudChjb25mKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRGaWx0ZXIod3BUeXBlVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih3b3JrUHJvZHVjdFR5cGVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKTsKLQkJCWNoaWxkLnNldENhdGVnb3JpemVkRmlsdGVyKHJvbGVTZXRzRmlsdGVyKTsKLQkJCWNoaWxkLnNldFVuY2F0ZWdvcml6ZWRMYWJlbChMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVW5jYXRlZ29yaXplZF9Sb2xlc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQl1bmNhdGVnb3JpemVkSW1hZ2UgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQuc2V0VW5jYXRlZ29yaXplZEltYWdlKHVuY2F0ZWdvcml6ZWRJbWFnZSk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQotCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbmYsIG5hbWUsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rvb2xzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcih0b29sc0ZpbHRlcik7Ci0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkRmlsdGVyKHVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKTsKLQkJCXVuY2F0ZWdvcml6ZWRJbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRVbmNhdGVnb3JpemVkSW1hZ2UodW5jYXRlZ29yaXplZEltYWdlKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBvdGhlckNoaWxkID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCQljaGlsZHJlbi5hZGQob3RoZXJDaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgb3RoZXJDaGlsZCk7Ci0KLQkJCW5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29uZiwgbmFtZSwKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQoY29uZik7Ci0JCQljaGlsZC5zZXRDYXRlZ29yaXplZEZpbHRlcihjdXN0b21DYXRlZ29yaWVzRmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCUd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIgY2hpbGQxID0gbmV3IEd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIoCi0JCQkJCWFkYXB0ZXJGYWN0b3J5LCBjb25mKTsKLQkJCWNoaWxkMS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZDEpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkMSk7Ci0JCX0KLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKG9iamVjdCk7Ci0JLy8gfQotCS8vICAgIAotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkKLQkJaWYgKCAoZmlsdGVyICE9IGNvbmZpZ3VyYXRvcikgJiYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpICkgewotCQkJY29uZmlndXJhdG9yID0gKElDb25maWd1cmF0b3IpIGZpbHRlcjsKLQkJCWlmICggY29uZmlndXJhdG9yICE9IG51bGwgKSB7CQkJCi0JCQkJLy8gY3JlYXRlIHRoZSB1bmNhdGVnb3JpemVkIGZpbHRlcnMuIElmIElDb25maWd1cmF0b3IgaXMgc2V0LCBnZXQgdGhlIGZpbGRlcnMgZnJvbSB0aGVyZS4KLQkJCQkvLyBvdGhlcndpemUsIHVzZSB0aGUgZGVmYXVsdCBvbmUuCi0JCQkJLy8gVGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgZXh0cmEgdW5jYXRlZ29yaXplZCBlbGVtZW50cyBkdWUgdG8gcmVhbGl6YXRpb24gCi0JCQkJLy8gdG8gc2hvdyB1cCBpbiB0aGUgdW4tY2F0ZWdvcml6ZWQgZm9sZGVyLgotCQkJCS8vIEZvciBleGFtcGxlLCBpZiBhIGRpc2NpcGxlIGlzIHJlcGxhY2VkIGJ5IGFub3RoZXIsIHRoZSB0YXNrcyBpbiB0aGUgcmVwbGFjZWQgZGlzY2lwbGllCi0JCQkJLy8gc2hvdWxkIHNob3cgdXAgaW4gdGhlIHVuLWNhdGVnb3JpemVkIHRhc2tzIGZvbGRlcgotCQkJCS8vIDE1NjQzOCAtIFZhcmlhYmlsaXR5IG9mIGRpc2NpcGxpbmVzIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseQotCQkJCQotCQkJCXVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCk7Ci0JCQkJZG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0RmlsdGVyID0gY29uZmlndXJhdG9yLmdldERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpOwotCQkJCXdwVHlwZVVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKTsKLQkJCQl1bmNhdGVnb3JpemVkUm9sZUZpbHRlciA9IGNvbmZpZ3VyYXRvci5nZXRVbmNhdGVnb3JpemVkUm9sZUZpbHRlcigpOwotCQkJCXVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyID0gY29uZmlndXJhdG9yLmdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCk7Ci0JCQkJCi0JCQkJLy8gW0J1ZyAxNjI2MDNdIE5ldzogUmVwbGFjaW5nIGRpc2NpcGxpbmVzIGRvIGFwcGVhciBpbnNpZGUgdGhlaXIgcmVwbGFjZWQgZWxlbWVudHMgZGlzY2lwbGluZSBncm91cGluZ3MgYXMgd2VsbCBhcyBvdXRzaWRlIG9mIHRoZSBkaXNjaXBsaW5lIGdyb3VwaW5nCi0JCQkJLy8gbmVlZCB0byBjdXN0b21pemUgdGhlIGZpbHRlcnMgZm9yIGRpc2NpcGxpbmVzIGFuZCByb2xlc2V0cwotCQkJCWRpc2NpcGxpbmVzRmlsdGVyID0gY29uZmlndXJhdG9yLmdldERpc2NpcGxpbmVzRmlsdGVyKCk7Ci0JCQkJcm9sZVNldHNGaWx0ZXIgPSBjb25maWd1cmF0b3IuZ2V0Um9sZVNldHNGaWx0ZXIoKTsKLQkJCQkKLQkJCX0KLQkJfQotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBwbHVnaW47Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWNvbmZpZ3VyYXRvci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Mjg5NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByYWN0aWNlLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUk9BRE1BUCA9ICJyb2FkbWFwIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBDQVRFR09SSUVTID0gImNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFVOS05PV04gPSAidW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQcmFjdGljZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRNb2RpZmllZENoaWxkcmVuKE9iamVjdCBwYXJlbnRPYmplY3QsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJTGlzdCByZXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJR3JvdXBpbmdIZWxwZXIgZ3JvdXBpbmdIZWxwZXIgPSBuZXcgR3JvdXBpbmdIZWxwZXIodGhpcyk7Ci0JCWdyb3VwaW5nKHBhcmVudE9iamVjdCwgcmV0LCBjaGlsZHJlbiwgZ3JvdXBpbmdIZWxwZXIpOwotCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIExpc3QgcmV0LCBDb2xsZWN0aW9uIGNoaWxkcmVuLCAKLQkJCUdyb3VwaW5nSGVscGVyIGdyb3VwaW5nSGVscGVyKSB7Ci0JCU1hcDxTdHJpbmcsIExpc3Q+IG1hcCA9IGdldFN1Ykdyb3VwTWFwKGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQotCQlib29sZWFuIHRvU29ydCA9IHRydWU7Ci0JCVN0cmluZ1tdIGtleXMgPSBncm91cGluZ0hlbHBlci5nZXRLZXlzSW5PcmRlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBrZXkgPSBrZXlzW2ldOwotCQkJTGlzdCBzdWJncm91cENoaWxkcmVuID0gbWFwLmdldChrZXkpOwotCQkJaWYgKHN1Ymdyb3VwQ2hpbGRyZW4gPT0gbnVsbCB8fCBzdWJncm91cENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGdyb3VwaW5nSGVscGVyLnRvR3JvdXAoa2V5LCBzdWJncm91cENoaWxkcmVuKSkgewotCQkJCXN1Ymdyb3VwQ2hpbGRyZW4gPSBncm91cGluZ0hlbHBlci5uZXN0ZWRHcm91cGluZyhwYXJlbnRPYmplY3QsIGtleSwgc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlciBzdWIgPSBuZXcgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcigKLQkJCQkJCWdldEFkYXB0ZXJGYWN0b3J5KCksIGtleSwgZ2V0SW1hZ2VPYmplY3Qoa2V5KSwgc3ViZ3JvdXBDaGlsZHJlbiwgcGFyZW50T2JqZWN0KTsKLQkJCQlyZXQuYWRkKHN1Yik7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0b1NvcnQpIHsKLQkJCQkJc29ydChzdWJncm91cENoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJcmV0LmFkZEFsbChzdWJncm91cENoaWxkcmVuKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzb3J0KExpc3Qgc3ViZ3JvdXBDaGlsZHJlbikgewotCQlpZiAoc3ViZ3JvdXBDaGlsZHJlbi5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPEZ1bGZpbGxhYmxlRWxlbWVudD5zb3J0KHN1Ymdyb3VwQ2hpbGRyZW4sIGNvbXBhcmF0b3IpOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIExpc3Q+IGdldFN1Ykdyb3VwTWFwKENvbGxlY3Rpb24gY2hpbGRyZW4sIEdyb3VwaW5nSGVscGVyIGdyb3VwaW5nSGVscGVyKSB7Ci0JCSBNYXA8U3RyaW5nLCBMaXN0PiBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIExpc3Q+KCk7IAotCQkKLQkJZm9yIChPYmplY3QgY2hpbGQ6IGNoaWxkcmVuKSB7Ci0JCQlTdHJpbmcga2V5ID0gZ3JvdXBpbmdIZWxwZXIuZ2V0U3ViR3JvdXBOYW1lKGNoaWxkKTsKLQkJCWFkZChtYXAsIGtleSwgY2hpbGQpOwotCQl9CQkJCQotCQkKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0SW1hZ2VPYmplY3QoU3RyaW5nIHN1Ykdyb3VwTmFtZSkgewotCQkKLQkJU3RyaW5nIGltYWdlU3RyID0gImZ1bGwvb2JqMTYvRm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKGZhbHNlKSB7CQkvL05vdCB1c2VkIGZvciBub3cKLQkJCWlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfS2V5X0NvbmNlcHRzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L0NvbmNlcHRzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RzX2dyb3VwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1Rhc2tzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfUm9sZXNfZ3JvdXAiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvUm9sZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9BY3Rpdml0aWVzX2dyb3VwIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1Byb2Nlc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9HdWlkYW5jZUZvbGRlciI7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQkvL0d1aWRhbmNlIHN1YiBncm91cHMKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L0NoZWNrbGlzdHMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvRXhhbXBsZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUHJhY3RpY2VzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1ByYWN0aWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoc3ViR3JvdXBOYW1lLmVxdWFscyhnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19SZXBvcnRzIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZVN0ciA9ICJmdWxsL29iajE2L1JlcG9ydHMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfUmV1c2FibGVBc3NldHMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvUmV1c2FibGVBc3NldHMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWxzIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIGlmIChzdWJHcm91cE5hbWUuZXF1YWxzKGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlbXBsYXRlcyIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2VTdHIgPSAiZnVsbC9vYmoxNi9UZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgaWYgKHN1Ykdyb3VwTmFtZS5lcXVhbHMoZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlU3RyID0gImZ1bGwvb2JqMTYvVG9vbE1lbnRvcnMiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIGltYWdlU3RyID09IG51bGwgPyBudWxsIDogTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoaW1hZ2VTdHIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VUlTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoTWFwPFN0cmluZywgTGlzdD4gbWFwLCBTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJTGlzdCBsaXN0ID0gbWFwLmdldChrZXkpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbWFwLnB1dChrZXksIGxpc3QpOwotCQl9Ci0JCWxpc3QuYWRkKHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5QcmFjdGljZUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBUbmdVdGlsCi0JCQkJLmdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcigoR3VpZGFuY2UpIG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwaW5nSGVscGVyIHsKLQkJCi0JCXByaXZhdGUgT2JqZWN0IGdyb3VwZXI7Ci0JCQotCQlwdWJsaWMgR3JvdXBpbmdIZWxwZXIoT2JqZWN0IGdyb3VwZXIpIHsKLQkJCXRoaXMuZ3JvdXBlciA9IGdyb3VwZXI7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0R3JvdXBlcigpIHsKLQkJCXJldHVybiBncm91cGVyOwotCQl9CQkKLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3ViR3JvdXBOYW1lKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBSb2FkbWFwKSB7Ci0JCQkJcmV0dXJuIFJPQURNQVA7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0tleV9Db25jZXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9UYXNrc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZSkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX1JvbGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0FjdGl2aXRpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7CQkJCi0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsJCQkKLQkJCQlyZXR1cm4gQ0FURUdPUklFUzsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIFVOS05PV047Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRLZXlzSW5PcmRlcigpIHsKLQkJCVN0cmluZ1tdIGtleXMgPSB7Ci0JCQkJCVJPQURNQVAsCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfS2V5X0NvbmNlcHRzIiksCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdHNfZ3JvdXAiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIiksCQkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0FjdGl2aXRpZXNfZ3JvdXAiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX1JvbGVzX2dyb3VwIiksCQkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpLAkJLy8kTk9OLU5MUy0xJAotCQkJCQlDQVRFR09SSUVTLAotCQkJCQlVTktOT1dOCi0JCQl9OwotCQkJCi0JCQlyZXR1cm4ga2V5czsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gdG9Hcm91cChTdHJpbmcga2V5LCBMaXN0IHN1Ymdyb3VwQ2hpbGRyZW4pIHsKLQkJCWlmIChrZXkuZXF1YWxzKFJPQURNQVApIHx8IAotCQkJCWtleS5lcXVhbHMoQ0FURUdPUklFUykgfHwKLQkJCQlrZXkuZXF1YWxzKFVOS05PV04pIHx8Ci0JCQkJc3ViZ3JvdXBDaGlsZHJlbi5zaXplKCkgPCAzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PD8+IG5lc3RlZEdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIFN0cmluZyBrZXksIExpc3Q8Pz4gc3ViZ3JvdXBDaGlsZHJlbikgewotCQkJaWYgKCEga2V5LmVxdWFscyhQcmFjdGljZUl0ZW1Qcm92aWRlci5nZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19ncm91cCIpKSkgewotCQkJCXJldHVybiBzdWJncm91cENoaWxkcmVuOwotCQkJfQotCQkJCi0JCQlMaXN0IHJldCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCi0JCQlHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlciA9IG5ldyBHdWlkYW5jZUdyb3VwaW5nSGVscGVyKGdyb3VwZXIpOwotCQkJZ3JvdXBpbmcocGFyZW50T2JqZWN0LCByZXQsIHN1Ymdyb3VwQ2hpbGRyZW4sIGdyb3VwaW5nSGVscGVyKTsKLQkJCQotCQkJcmV0dXJuIHJldDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgZ3JvdXBpbmcoT2JqZWN0IHBhcmVudE9iamVjdCwgTGlzdCByZXQsCi0JCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiwgR3JvdXBpbmdIZWxwZXIgZ3JvdXBpbmdIZWxwZXIpIHsKLQkJCWlmIChncm91cGVyIGluc3RhbmNlb2YgUHJhY3RpY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKFByYWN0aWNlSXRlbVByb3ZpZGVyKSBncm91cGVyKS5ncm91cGluZyhwYXJlbnRPYmplY3QsIHJldCwKLQkJCQkJCWNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEd1aWRhbmNlR3JvdXBpbmdIZWxwZXIgZXh0ZW5kcyBHcm91cGluZ0hlbHBlciB7Ci0JCXB1YmxpYyBHdWlkYW5jZUdyb3VwaW5nSGVscGVyKE9iamVjdCBncm91cGVyKSB7Ci0JCQlzdXBlcihncm91cGVyKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdWJHcm91cE5hbWUoT2JqZWN0IG9iaikgewotCQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX0NoZWNrbGlzdHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1ByYWN0aWNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmVwb3J0KSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JlcG9ydHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCXJldHVybiBnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1N1cHBvcnRpbmdNYXRlcmlhbHMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQkJcmV0dXJuIGdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1RlbXBsYXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVGVybURlZmluaXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQlyZXR1cm4gZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlyZXR1cm4gVU5LTk9XTjsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0S2V5c0luT3JkZXIoKSB7Ci0JCQlTdHJpbmdbXSBrZXlzID0gewotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19DaGVja2xpc3RzIiksCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfRXhhbXBsZXMiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19QcmFjdGljZXMiKSwJCQkvLyROT04tTkxTLTEkCi0JCQkJCWdldFVJU3RyaW5nKCJfVUlfR3VpZGFuY2VzX1JlcG9ydHMiKSwJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19SZXVzYWJsZUFzc2V0cyIpLAkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfU3VwcG9ydGluZ01hdGVyaWFscyIpLAkJLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRVSVN0cmluZygiX1VJX0d1aWRhbmNlc19UZW1wbGF0ZXMiKSwJCS8vJE5PTi1OTFMtMSQKLQkJCQkJZ2V0VUlTdHJpbmcoIl9VSV9HdWlkYW5jZXNfVG9vbE1lbnRvcnMiKSwJCS8vJE5PTi1OTFMtMSQKLQkJCQkJVU5LTk9XTgkJCQkKLQkJCX07Ci0JCQkKLQkJCXJldHVybiBrZXlzOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB0b0dyb3VwKFN0cmluZyBrZXksIExpc3Qgc3ViZ3JvdXBDaGlsZHJlbikgewotCQkJaWYgKGtleS5lcXVhbHMoVU5LTk9XTikgfHwgCi0JCQkJc3ViZ3JvdXBDaGlsZHJlbi5zaXplKCkgPCAzKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0PD8+IG5lc3RlZEdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIFN0cmluZyBrZXksIExpc3Q8Pz4gc3ViZ3JvdXBDaGlsZHJlbikgewotCQkJcmV0dXJuIHN1Ymdyb3VwQ2hpbGRyZW47Ci0JCX0KLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NmMTRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9QcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci0KLS8qKgotICogVGhlIGJhc2UgaXRlbSBwcm92aWRlciBhZGFwdGVyIGNsYXNzIGZvciB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBpbgotICogYSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQkKLQlwcml2YXRlIExpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQkKLQlwcml2YXRlIFByYWN0aWNlIHByYWN0aWNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCVN0cmluZyBuYW1lLCBPYmplY3QgaW1hZ2UsIExpc3QgY2hpbGRyZW4sIE9iamVjdCBwYXJlbnRPYmplY3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQlsYWJlbCA9IG5hbWU7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCQlpZiAocGFyZW50T2JqZWN0IGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCXByYWN0aWNlID0gKFByYWN0aWNlKSBwYXJlbnRPYmplY3Q7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGlsZHJlbiA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJcmV0dXJuIGxhYmVsOwotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIFByYWN0aWNlIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNjYzYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocGMuZ2V0UHJvY2VzcygpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHBjLmdldFByb2Nlc3MoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5zZXROYW1lKHBjLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNDgwNzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBwYWNrYWdlIGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChQcm9jZXNzIHByb2Nlc3MpIHsKLQkJcmV0dXJuICFUbmdVdGlsLmlzQ29udHJpYnV0b3JPclJlcGxhY2VyKHByb2Nlc3MpCi0JCQkJJiYgIXByb2Nlc3MuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb2xsZWN0Q2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgT2JqZWN0IGVsZW1lbnQsCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgZWxlbWVudCkuZ2V0UHJvY2VzcygpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9ICgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKS5yZXNvbHZlKHByb2Nlc3MpOwotCQkJCQlpZiAoIWNoaWxkcmVuLmNvbnRhaW5zKGNoaWxkKSAmJiBmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KHByb2Nlc3MpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwcm9jZXNzKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb2xsZWN0Q2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgZWxlbWVudCwgZmlsdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWNvbGxlY3RDaGlsZHJlbihjaGlsZHJlbiwgaXRlci5uZXh0KCkpOwotCQl9Ci0KLQkJLy8gc2V0IHBhcmVudCBmb3IgdGhlIGNvbGxlY3RlZCBjaGlsZHJlbgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJUHJvY2Vzc1V0aWwuc2V0UGFyZW50KGNoaWxkLCBvYmplY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCWlmIChjb2xsZWN0Q2hpbGRyZW4oY2hpbGRyZW4sIGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCSgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzY2E5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbiB0aGUgQ29uZmlndXJhdGlvbgotICogdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZzsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG1vZGVsU3RydWN0KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCWlmIChncm91cEl0ZW1Qcm92aWRlck1hcCA9PSBudWxsKSB7Ci0JCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJfQotCi0JCQlmaWx0ZXIgPSBuZXcgSUZpbHRlcigpIHsKLQotCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCQkJCX0KLQotCQkJfTsKLQotCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0SW1hZ2UoCi0JCQkJCSJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JCQlDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBjaGlsZCA9IG5ldyBDYXRlZ29yaXplZFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIG1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsCi0JCQkJCW1vZGVsU3RydWN0LmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQljaGlsZC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQlpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpLmdldEltYWdlKAotCQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hpbGQgPSBuZXcgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCW1ldGhvZENvbmZpZywgbmFtZSwgaW1hZ2UsIG1vZGVsU3RydWN0LmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpOwotCQkJY2hpbGQuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkYmQ3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUgc2V0IGluIHRoZSBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlJvbGVTZXRJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1VuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ZjliNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2NvbmZpZ3VyYXRpb24vVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIHVuY2F0ZWdvcml6ZWQgZm9sZGVycyBhbmQgZWxlbWVudHMgaW4gdGhlCi0gKiBDb25maWd1cmF0aW9uIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJvdGVjdGVkIExpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWc7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0KLQlwcml2YXRlIElGaWx0ZXIgdW5jYXRlZ29yaXplZEZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IGltYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBJRmlsdGVyIGZpbHRlciwgU3RyaW5nIGxhYmVsLAotCQkJT2JqZWN0IGltYWdlKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5tZXRob2RDb25maWcgPSBtZXRob2RDb25maWc7Ci0JCXRoaXMudW5jYXRlZ29yaXplZEZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoCi0JCQlMaXN0IGZpbHRlckxpc3QpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QobWV0aG9kQ29uZmlnLCBmaWx0ZXJMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjcmVhdGVGaWx0ZXJMaXN0KCkgewotCQlBcnJheUxpc3QgZmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHVuY2F0ZWdvcml6ZWRGaWx0ZXIgIT0gbnVsbCkgewotCQkJZmlsdGVyTGlzdC5hZGQodW5jYXRlZ29yaXplZEZpbHRlcik7Ci0JCX0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmaWx0ZXJMaXN0LmFkZChmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJMaXN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdChjcmVhdGVGaWx0ZXJMaXN0KCkpCi0JCQkJLmdldExpc3QoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjaGFzQ2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFsd2F5cyByZXR1cm4gdHJ1ZSB0byBhdm9pZCBleHBlbnNpdmUgY2FsbCB0byBnZXRDaGlsZHJlbigpIHRoYXQgd2FsawotCQkvLyB0aHJ1IHRoZQotCQkvLyB3aG9sZSBsaWJyYXJ5IHRvIGZpbmQgYWxsIHRoZSB0YXNrcyB0aGF0IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkKLQkJLy8gZGlzY2lwbGluZS4KLQkJLy8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpbWFnZSAhPSBudWxsKQotCQkJcmV0dXJuIGltYWdlOwotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9Xb3JrUHJvZHVjdFR5cGVzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzAyNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL1dvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLldyYXBwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJXb3JrIFByb2R1Y3QgS2luZHMiIGZvbGRlciBpbiB0aGUKLSAqIENvbmZpZ3VyYXRpb24gdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlciBleHRlbmRzIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGltYWdlLAotCQkJU3RyaW5nW10gY2F0ZWdvcnlQa2dQYXRoKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsIG5hbWUsIGltYWdlLCBjYXRlZ29yeVBrZ1BhdGgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXIjY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIFVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIgY3JlYXRlVW5jYXRlZ29yaXplZEl0ZW1Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBVbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcsCi0JCQkJdGhpcy51bmNhdGVnb3JpemVkRmlsdGVyLCB0aGlzLnVuY2F0ZWdvcml6ZWRMYWJlbCwKLQkJCQl0aGlzLnVuY2F0ZWdvcml6ZWRJbWFnZSkgewotCQkJZmluYWwgY2xhc3MgRWxlbWVudExpc3QgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QgewotCi0JCQkJLyoqCi0JCQkJICogQHBhcmFtIG1ldGhvZENvbmZpZwotCQkJCSAqIEBwYXJhbSBmaWx0ZXJMaXN0Ci0JCQkJICovCi0JCQkJcHVibGljIEVsZW1lbnRMaXN0KE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLAotCQkJCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCQkJCXN1cGVyKG1ldGhvZENvbmZpZywgZmlsdGVyTGlzdCk7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0I25ld0l0ZXJhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UpCi0JCQkJICovCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIG5ld0l0ZXJhdG9yKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRJdGVyYXRvcihwa2cpIHsKLQkJCQkJCS8qKgotCQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJCSAqLwotCQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjMwNzEzNjMwNzY1NzM1OTI4Mkw7Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCQkgKiAKLQkJCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdC5FbGVtZW50SXRlcmF0b3IjZ2V0Q2hpbGRyZW5MaXN0KGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuTGlzdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJTGlzdCBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuTGlzdChvYmplY3QpOwotCQkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQkJCQljaGlsZHJlbi5hZGRBbGwoKChBcnRpZmFjdCkgb2JqZWN0KQotCQkJCQkJCQkJCS5nZXRDb250YWluZWRBcnRpZmFjdHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5NZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QjY2hlY2tBY2NlcHRhbmNlKCkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0FjY2VwdGFuY2UoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBzdXBlckFjY2VwdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBzdXBlci5hY2NlcHQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9OwotCi0JCQkvLyBrZWVwcyB3cmFwcGVycyBvZiBhcnRpZmFjdHMgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSB3b3JrCi0JCQkvLyBwcm9kdWN0IHR5cGUKLQkJCS8vCi0JCQlwcml2YXRlIFdyYXBwZXJNYW5hZ2VyIHdyYXBwZXJNYW5hZ2VyID0gbmV3IFdyYXBwZXJNYW5hZ2VyKAotCQkJCQlhZGFwdGVyRmFjdG9yeSkgewotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLldyYXBwZXJNYW5hZ2VyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsCi0JCQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkJCQkgKi8KLQkJCQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsCi0JCQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCXJldHVybiBuZXcgRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIodmFsdWUsIG93bmVyLAotCQkJCQkJCW51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJCQkvKgotCQkJCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCQkJICogCi0JCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkJCQkgKi8KLQkJCQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJCQkvLyBTdWItYXJ0aWZhY3QgY2FuIGhhdmUgYSBkaWZmZXJlbnQgc2V0IG9mIHdvcmsKLQkJCQkJCQkvLyBwcm9kdWN0IHR5cGVzIHRoYW4gdGhlIGNvbnRhaW5pbmcgYXJ0aWZhY3QuCi0JCQkJCQkJLy8gRG8gbm90IHNob3cgdGhlIGNvbXBvc2l0aW9uIGhpZXJhcmNoaWVzIGluIHRoZQotCQkJCQkJCS8vIFdvcmsgUHJvZHVjdCBUeXBlIHRyZWUgYnJvd3NlcnMgaW4gTGliLiBOYXYuCi0JCQkJCQkJLy8gYW5kIENvbmZpZy4gRXhwbG9yZXIuIFNob3cgdGhlbSBpbiBmbGF0IGxpc3RzCi0JCQkJCQkJLy8gYWNjb3JkaW5nIHRvIHRoZWlyIGNhdGVnb3JpemF0aW9ucyBpbnN0ZWFkLgotCQkJCQkJCS8vCi0JCQkJCQkJLy8gVGhpcyBpcyBub3QgdHJ1ZSBmb3IgRG9tYWlucywgd2hpY2ggc2hvdWxkIHNob3cKLQkJCQkJCQkvLyB0aGUgYXJ0aWZhY3QgbmVzdGluZyEKLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQkJCX0KLQotCQkJCQkJLyoKLQkJCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJCSAqIAotCQkJCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkJCQkJICovCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlVuY2F0ZWdvcml6ZWRJdGVtUHJvdmlkZXIjY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGphdmEudXRpbC5MaXN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0IGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCgKLQkJCQkJTGlzdCBmaWx0ZXJMaXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBFbGVtZW50TGlzdChtZXRob2RDb25maWcsIGZpbHRlckxpc3QpOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5VbmNhdGVnb3JpemVkSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCQkgKi8KLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlFbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IChFbGVtZW50TGlzdCkgY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0KGNyZWF0ZUZpbHRlckxpc3QoKSk7Ci0JCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGVsZW1lbnRMaXN0LmdldExpc3QoKTsKLQkJCQlBcnJheUxpc3QgYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudExpc3Quc3VwZXJBY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQlhcnRpZmFjdHMuYWRkKGVsZW1lbnQpOwotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdyYXBwZXJNYW5hZ2VyLnVwZGF0ZShhcnRpZmFjdHMpOwotCQkJCWNoaWxkcmVuLmFkZEFsbCh3cmFwcGVyTWFuYWdlci5nZXRXcmFwcGVycygpKTsKLQkJCQlyZXR1cm4gY2hpbGRyZW47Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNkaXNwb3NlKCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl3cmFwcGVyTWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3N2RmYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGNvbmZpZ3VyYXRpb25zLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZjZjYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGFuIGFydGlmYWN0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQXJ0aWZhY3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRGVmYXVsdE5hbWVTZXR0ZXIsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBcnRpZmFjdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCAmJiBhcnRpZmFjdC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCXJldHVybiBUbmdVdGlsLmdldE5hdmlnYXRvclBhcmVudEl0ZW1Qcm92aWRlcihhcnRpZmFjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCi0JCS8vVG5nVXRpbC5zZXREZWZhdWx0TmFtZSh0aGlzLCBub3RpZmljYXRpb24pOwotCQlzZXREZWZhdWx0TmFtZShub3RpZmljYXRpb24pOwotCQkKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaXNjaXBsaW5lLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX05BTUU6Ci0JCQlUbmdVdGlsLnJlZnJlc2hDb250cmlidXRvcnModGhpcywgbm90aWZpY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCVRuZ1V0aWwucmVmcmVzaFdvcmtQcm9kdWN0VHlwZVVuY2F0ZWdvcml6ZWQoVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgdG8gc2V0RGVmYXVsdE5hbWUuIElEZWZhdWx0TmFtZVNldHRlciBjYW5ub3QgYmUgdXNlZCAKLQkgKiBpbiBjYXNlIG9mIFN0YXRlbGVzcyBJdGVtUHJvdmlkZXIuCi0JICogVGhpcyBpcyB3b3JrLWFyb3VuZCBmb3Igbm93LiBJRGVmYXVsdE5hbWVTZXR0ZXIgd2lsbCBiZSBtb2RpZmllZCBsYXRlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCUlEZWZhdWx0TmFtZVNldHRlciBkZWZhdWx0TmFtZVNldHRlciA9IHRoaXM7Ci0JCWlmIChkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChkZWZhdWx0TmFtZVNldHRlcgotCQkJCQkuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBkZWZhdWx0TmFtZVNldHRlci5nZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkpIHsKLQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCQkJc2V0RGVmYXVsdE5hbWUobXNnLmdldE5ld1ZhbHVlKCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCksIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaiwgT2JqZWN0IHBhcmVudCkgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQXJ0aWZhY3QpIHBhcmVudCkKLQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JRGVmYXVsdE5hbWVTZXR0ZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKiBub3QgaW4gdXNlIChmb3Igc3RhdGVsZXNzIGl0ZW1wcm92aWRlcikgc2VlIGFib3ZlIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmosIE9iamVjdCBwYXJlbnQpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19BUlRJRkFDVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKEFydGlmYWN0KSB0YXJnZXQpLmdldENvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyI2dldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIEFydGlmYWN0LmNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3RfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkvLyByZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNvbC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKSB7Ci0JCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzUGFyZW50c0FjY2VwdGVkKE9iamVjdCBjaGlsZCkgewotCS8vIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBnZXRIaWVyYXJjaHlMaXN0KGxpc3QsIGNoaWxkKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkvLyBpZiAoZmlsdGVyLmFjY2VwdChvYmopKQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgYm9vbGVhbiBjaGVja0NoaWxkcmVuc0FjY2VwdGVkKE9iamVjdCBvYmplY3QpIHsKLQkvLyBBcnRpZmFjdCBwYXJlbnRhcnRpZmFjdCA9ICgoQXJ0aWZhY3QpIG9iamVjdCkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkvLyBpZiAocGFyZW50YXJ0aWZhY3QgIT0gbnVsbCkgewotCS8vIGlmIChmaWx0ZXIgIT0gbnVsbCkgewotCS8vIGlmIChmaWx0ZXIuYWNjZXB0KHBhcmVudGFydGlmYWN0KSkKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyBlbHNlIHsKLQkvLyByZXR1cm4gY2hlY2tDaGlsZHJlbnNBY2NlcHRlZChwYXJlbnRhcnRpZmFjdCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGZhbHNlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgdm9pZCBnZXRIaWVyYXJjaHlMaXN0KExpc3QgbGlzdCwgT2JqZWN0IG9iamVjdCkgewotCS8vIEFydGlmYWN0IHBhcmVudCA9ICgoQXJ0aWZhY3QpIG9iamVjdCkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkvLyBpZiAocGFyZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkvLyBsaXN0LmFkZChwYXJlbnQpOwotCS8vIGdldEhpZXJhcmNoeUxpc3QobGlzdCwgcGFyZW50KTsKLQkvLyB9Ci0JLy8gfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDBhODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBjb250ZW50IGRlc2NyaXB0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBBIG1hcCBvZiBFQ2xhc3MgLyBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciBlYWNoIHR5cGUgb2YgQ29udGVudERlc2NyaXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwkKLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QsCi0JCQlPYmplY3QgcHJvcGVydHlJZCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LAotCQkJCXByb3BlcnR5SWQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFZGl0YWJsZVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0RWRpdGFibGVWYWx1ZShvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoKEVPYmplY3QpIG9iamVjdCkuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtUHJvdmlkZXJNYXAKLQkJCQkuZ2V0KGVPYmouZUNsYXNzKCkpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJLmNyZWF0ZUFkYXB0ZXIoZU9iaik7Ci0JCQlpdGVtUHJvdmlkZXJNYXAucHV0KGVPYmouZUNsYXNzKCksIGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjM0ZDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyBDb250ZW50UGFja2FnZXNJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWxlbWVudEl0ZW1Qcm92aWRlciwgSUxpYnJhcnlJdGVtUHJvdmlkZXIsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgUm9sZXNJdGVtUHJvdmlkZXIgcm9sZXM7Ci0KLQlwcm90ZWN0ZWQgVGFza3NJdGVtUHJvdmlkZXIgdGFza3M7Ci0KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0czsKLQotCXByb3RlY3RlZCBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZ3VpZGFuY2VzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsYWJlbDsKLQotCXByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcm9sZXMuCi0JICovCi0JcHVibGljIFJvbGVzSXRlbVByb3ZpZGVyIGdldFJvbGVzKCkgewotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0YXNrcy4KLQkgKi8KLQlwdWJsaWMgVGFza3NJdGVtUHJvdmlkZXIgZ2V0VGFza3MoKSB7Ci0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHdvcmtQcm9kdWN0cy4KLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyIGdldFdvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCS8vIGlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkvLyBjaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JLy8gfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBhbGxDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ2hpbGRyZW5TdG9yZSBzdG9yZSA9IGdldENoaWxkcmVuU3RvcmUob2JqZWN0KTsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RvcmUgPT0gbnVsbCkgewotCQkJc3RvcmUgPSBjcmVhdGVDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0JCQlyZXN1bHQgPSBzdG9yZSAhPSBudWxsID8gbnVsbCA6IG5ldyBBcnJheUxpc3QoKTsKLQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaSA9IGdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KS5pdGVyYXRvcigpOyBpCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpLm5leHQoKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJTGlzdCBjb250ZW50UGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTsgaW5kZXgrKykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gY2kubmV4dCgpOwotCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsIGluZGV4KTsKLQkJCQkJCQkvLyBpZiAoc3RvcmUgIT0gbnVsbCkKLQkJCQkJCQkvLyB7Ci0JCQkJCQkJLy8gc3RvcmUuZ2V0TGlzdChmZWF0dXJlKS5hZGQoY2hpbGQpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQkvLyBlbHNlCi0JCQkJCQkJLy8gewotCQkJCQkJCS8vIHJlc3VsdC5hZGQoY2hpbGQpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQljb250ZW50UGtncy5hZGQoY2hpbGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBjbGVhciBwYXJlbnQgZm9yIGNoaWxkcmVuCi0JCQkJCS8vCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IGNoaWxkID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudChudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHNvcnRpbmcgdGhlIGNvbnRlbnQgcGFja2FnZXMKLQkJCQkJLy8KLQkJCQkJQ29sbGVjdGlvbnMuc29ydChjb250ZW50UGtncywgUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRQotCQkJCQkJCS5nZXRDb21wYXJhdG9yKCkpOwotCi0JCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0JCQkJCQlzdG9yZS5nZXRMaXN0KGZlYXR1cmUpLmFkZEFsbChjb250ZW50UGtncyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXN1bHQuYWRkQWxsKGNvbnRlbnRQa2dzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwKLQkJCQkJCQkJQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCk7Ci0JCQkJCQlpZiAoc3RvcmUgIT0gbnVsbCkgewotCQkJCQkJCXN0b3JlLnNldFZhbHVlKGZlYXR1cmUsIGNoaWxkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmVzdWx0LmFkZChjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYWxsQ2hpbGRyZW4uYWRkQWxsKHN0b3JlICE9IG51bGwgPyBzdG9yZS5nZXRDaGlsZHJlbigpIDogcmVzdWx0KTsKLQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCi0JCS8vIHJlbW92ZSBvbGQgYWRhcHRlcnMgKHJvbGVzLCB0YXNrcywgd29ya3Byb2R1Y3RzKSBmcm9tIHRoZSB0aGUKLQkJLy8gY29udGVudFBrZwotCQkvLwotCQkvLyBFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqZWN0OwotCQlpZiAocm9sZXMgPT0gbnVsbCkgewotCQkJLy8gZU9iai5lQWRhcHRlcnMoKS5yZW1vdmUocm9sZXMpOwotCQkJcm9sZXMgPSBuZXcgUm9sZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCQl9Ci0JCWlmICh0YXNrcyA9PSBudWxsKSB7Ci0JCQkvLyBlT2JqLmVBZGFwdGVycygpLnJlbW92ZSh0YXNrcyk7Ci0JCQl0YXNrcyA9IG5ldyBUYXNrc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JCX0KLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQkvLyBlT2JqLmVBZGFwdGVycygpLnJlbW92ZSh3b3JrUHJvZHVjdHMpOwotCQkJd29ya1Byb2R1Y3RzID0gbmV3IFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJY29udGVudFBrZyk7Ci0JCX0KLQkJaWYgKGd1aWRhbmNlcyA9PSBudWxsKSB7Ci0JCQkvLyBlT2JqLmVBZGFwdGVycygpLnJlbW92ZShndWlkYW5jZXMpOwotCQkJZ3VpZGFuY2VzID0gbmV3IEd1aWRhbmNlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZyk7Ci0JCX0KLQotCQlhbGxDaGlsZHJlbi5hZGQocm9sZXMpOwotCQlhbGxDaGlsZHJlbi5hZGQodGFza3MpOwotCQlhbGxDaGlsZHJlbi5hZGQod29ya1Byb2R1Y3RzKTsKLQkJYWxsQ2hpbGRyZW4uYWRkKGd1aWRhbmNlcyk7Ci0JCXJldHVybiBhbGxDaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkvLyAqLwotCS8vIHB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JLy8gQ2xhc3MgY29tbWFuZENsYXNzLCBDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkvLyAvLyBjb21tYW5kUGFyYW1ldGVyLnNldE93bmVyKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JLy8gQ29tbWFuZCBjbWQgPSBzdXBlci5jcmVhdGVDb21tYW5kKG9iamVjdCwgZG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JLy8gY29tbWFuZFBhcmFtZXRlcik7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjcmVhdGVDb21tYW5kOiAiICsKLQkvLyBjb21tYW5kQ2xhc3MgKyAiLCBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkgKyAiLCBvd25lcjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRPd25lcigpICsgIiwgY29sbGVjdGlvbjogIiArCi0JLy8gY29tbWFuZFBhcmFtZXRlci5nZXRDb2xsZWN0aW9uKCkpOwotCS8vIHJldHVybiBjbWQ7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgdHh0OwotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJdHh0ID0gbGFiZWw7Ci0JCX0gZWxzZSB7Ci0JCQl0eHQgPSBUbmdVdGlsCi0JCQkJCS5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBjaGVjayBpZiB0aGUgb2JqZWN0IGhhcyBpdHMgb3duIHJlc291cmNlIGFuZCBpdCBpcyBtb2RpZmllZCB0byBhZGQKLQkJLy8gdGhlIGRpcnR5IGZsYWcKLQkJLy8KLQkJUmVzb3VyY2UgcmVzID0gKChFT2JqZWN0KSBvYmplY3QpLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwgJiYgcmVzLmdldENvbnRlbnRzKCkuZ2V0KDApID09IG9iamVjdAotCQkJCSYmIHJlcy5pc01vZGlmaWVkKCkpIHsKLQkJCXR4dCA9IHR4dCArICIqIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0eHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIHRhcmdldDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKGNvbnRlbnRQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgImNvbnRlbnRfcGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKGNvbnRlbnRQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKSwKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgIm1ldGhvZF9wYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChtc2csIHRoaXMpOwotCi0JCXN3aXRjaCAobXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCXNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCXNldERlZmF1bHROYW1lKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG1zZyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZ2V0R3VpZGFuY2VzKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLy8gcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKTsKLQkvLyB9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVBZGRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb24gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCUFycmF5TGlzdCBzZWxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhhdCB5b3UgY2Fubm90IGFkZCBNZXRob2RQYWNrYWdlIHRoYXQgaXMgbm90IGEKLQkJCS8vIENvbnRlbnRQYWNrYWdlCi0JCQkvLwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlCi0JCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCgoQWRkQ29tbWFuZCkgc3VwZXIuY3JlYXRlQWRkQ29tbWFuZCgKLQkJCQlkb21haW4sIG93bmVyLCBmZWF0dXJlLCBzZWxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChndWlkYW5jZXMgIT0gbnVsbCkgewotCQkJZ3VpZGFuY2VzLmRpc3Bvc2UoKTsKLQkJCWd1aWRhbmNlcyA9IG51bGw7Ci0JCX0KLQkJaWYgKHJvbGVzICE9IG51bGwpIHsKLQkJCXJvbGVzLmRpc3Bvc2UoKTsKLQkJCXJvbGVzID0gbnVsbDsKLQkJfQotCQlpZiAodGFza3MgIT0gbnVsbCkgewotCQkJdGFza3MuZGlzcG9zZSgpOwotCQkJdGFza3MgPSBudWxsOwotCQl9Ci0JCWlmICh3b3JrUHJvZHVjdHMgIT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RzLmRpc3Bvc2UoKTsKLQkJCXdvcmtQcm9kdWN0cyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliZGI2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBndWlkYW5jZSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQSBtYXAgb2YgRUNsYXNzIC8gSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgZWFjaCB0eXBlIG9mIGd1aWRhbmNlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWl0ZW1Qcm92aWRlck1hcC5jbGVhcigpOwotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuR3VpZGFuY2VJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJSXRlbVByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCwKLQkJCU9iamVjdCBwcm9wZXJ0eUlkKSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsCi0JCQkJcHJvcGVydHlJZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEVkaXRhYmxlVmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcigoRU9iamVjdCkgb2JqZWN0KS5nZXRFZGl0YWJsZVZhbHVlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkd1aWRhbmNlSXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiBnZXRBZGFwdGVyKChFT2JqZWN0KSBvYmplY3QpLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqKSB7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBpdGVtUHJvdmlkZXJNYXAKLQkJCQkuZ2V0KGVPYmouZUNsYXNzKCkpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJLmNyZWF0ZUFkYXB0ZXIoZU9iaik7Ci0JCQlpdGVtUHJvdmlkZXJNYXAucHV0KGVPYmouZUNsYXNzKCksIGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChlT2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoZU9iaiwgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGVPYmo7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5HdWlkYW5jZUl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0JCQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0d1aWRhbmNlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTBkODMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9HdWlkYW5jZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkd1aWRhbmNlIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyB3aWxsIGJlIHJlbmFtZWQgYXMgR3VpZGFuY2VGb2xkZXJJdGVtUHJvdmlkZXIgaW4gRVBGIE01LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBHdWlkYW5jZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0d1aWRhbmNlRm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0YWNobWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNoZWNrbGlzdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUNvbmNlcHQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVFeGFtcGxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlR3VpZGVsaW5lKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVFc3RpbWF0ZSgpKSk7Ci0JCS8vCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSkpOwotCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJLy8gLmNyZWF0ZUVzdGltYXRpbmdNZXRyaWMoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcmFjdGljZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJlcG9ydCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJldXNhYmxlQXNzZXQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVSb2FkbWFwKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCS8vIC5jcmVhdGVUZWNobmlxdWUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVG9vbE1lbnRvcigpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJLy8gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVHJhaW5pbmdDbGFzcygpKSk7Ci0JCS8vCi0JCS8vIG5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkCi0JCS8vIChjcmVhdGVDaGlsZFBhcmFtZXRlcgotCQkvLyAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRyYWluaW5nTW9kdWxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV2hpdGVwYXBlcigpKSk7Ci0KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkvLyAuY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkvLyBFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JLy8gaWYoZU9iaiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpCi0JLy8gVG5nVXRpbC5nZXRBZGFwdGVyKGVPYmosIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkvLyBpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCS8vIHJldHVybiBpdGVtUHJvdmlkZXIuZ2V0R3VpZGFuY2VzKCk7Ci0JLy8gfQotCS8vIHJldHVybiBlT2JqOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DSEVDS0xJU1Q7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfV0hJVEVQQVBFUjsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05DRVBUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0VYQU1QTEU7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1BSQUNUSUNFOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlcG9ydCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUkVQT1JUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPQURNQVA7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfUkVVU0FCTEVfQVNTRVQ7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19TVVBQT1JUSU5HX01BVEVSSUFMOwotCQkJLy8gfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZWNobmlxdWUpIHsKLQkJCS8vIGJhc2VOYW1lID0gIm5ld19UZWNobmlxdWUiOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRlbXBsYXRlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19URU1QTEFURTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbikgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfVEVSTV9ERUZJTklUSU9OOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1RPT0xfTUVOVE9SOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJYmFzZU5hbWUgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5ORVdfR1VJREVMSU5FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19HVUlEQU5DRTsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQlpZiAobXNnLmdldE5ld1ZhbHVlKCkgaW5zdGFuY2VvZiBUb29sTWVudG9yKSB7Ci0JCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJaWYgKG1zZy5nZXRPbGRWYWx1ZSgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCXJlZnJlc2ggPSB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJY2hlY2tfYWRkOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKGl0ZXIubmV4dCgpIGluc3RhbmNlb2YgVG9vbE1lbnRvcikgewotCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQkJYnJlYWsgY2hlY2tfYWRkOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWNoZWNrX3JlbW92ZTogZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWlmIChpdGVyLm5leHQoKSBpbnN0YW5jZW9mIFRvb2xNZW50b3IpIHsKLQkJCQkJcmVmcmVzaCA9IHRydWU7Ci0JCQkJCWJyZWFrIGNoZWNrX3JlbW92ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpZiAocmVmcmVzaCkKLQkJCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlcihVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IG51bGw7Ci0JCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgTGlzdCkgewotCQkJY2hpbGRyZW4gPSAoTGlzdCkgY29sbGVjdGlvbjsKLQkJfSBlbHNlIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjb2xsZWN0aW9uKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldEd1aWRhbmNlVHlwZUNvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9JRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0lFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjc3NzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L0lFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBlbGVtZW50IGl0ZW0gcHJvdmlkZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudEl0ZW1Qcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWU2YjA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcm9sZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUm9sZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGNvbnRlbnRQa2cgPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChjb250ZW50UGtnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGVudFBrZywgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0Um9sZXMoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUm9sZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvUm9sZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk2NDllLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Sb2xlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIlJvbGVzIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSb2xlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0Jc3luY2hyb25pemVkIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVJvbGUoKSkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlpZiAoIXN1cGVyLmFjY2VwdEFzQ2hpbGQob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIFJvbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX1JPTEU7Ci0JCX0KLQkJaWYgKGJhc2VOYW1lICE9IG51bGwpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KQotCQkJCQkuZ2V0Q29udGVudEVsZW1lbnRzKCksIChNZXRob2RFbGVtZW50KSBvYmosIGJhc2VOYW1lKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuZWxlbWVudC5UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciNuZXdDaGlsZEFkZGVkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkUm9sZXNJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTE0ODkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9TZWN0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHNlY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlNlY3Rpb25JdGVtUHJvdmlkZXIgewotCi0JcHVibGljIFNlY3Rpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNjgxYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgdGFzay4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0l0ZW1Qcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVGFza0l0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUYXNrSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGNvbnRlbnRQa2cgPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChjb250ZW50UGtnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGVudFBrZywgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gaXRlbVByb3ZpZGVyICE9IG51bGwgPyBpdGVtUHJvdmlkZXIuZ2V0VGFza3MoKSA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5DbGFzcywKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkgKi8KLQkvLyBwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZG9tYWluLAotCS8vIENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JLy8gLy8gaWYoY29tbWFuZENsYXNzID09IFJlbW92ZUNvbW1hbmQuY2xhc3MpIHsKLQkvLyAvLyBjb21tYW5kUGFyYW1ldGVyLnNldE93bmVyKCgoRU9iamVjdClvYmplY3QpLmVDb250YWluZXIoKSk7Ci0JLy8gLy8gfQotCS8vIENvbW1hbmQgY21kID0gc3VwZXIuY3JlYXRlQ29tbWFuZChvYmplY3QsIGRvbWFpbiwgY29tbWFuZENsYXNzLAotCS8vIGNvbW1hbmRQYXJhbWV0ZXIpOwotCS8vIFN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY3JlYXRlQ29tbWFuZDogIiArCi0JLy8gY29tbWFuZENsYXNzICsgIiwgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpICsgIiwgb3duZXI6ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSArICIsIGNvbGxlY3Rpb246ICIgKwotCS8vIGNvbW1hbmRQYXJhbWV0ZXIuZ2V0Q29sbGVjdGlvbigpKTsKLQkvLyByZXR1cm4gY21kOwotCS8vIH0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfVGFza190eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlRhc2tJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLS8vCQlzd2l0Y2gobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0vLwkJY2FzZSBFdmVudFR5cGVzLk1BS0VfUFJPWFk6Ci0vLwkJCS8vIHJlZnJlc2ggcGFyZW50Ci0vLwkJCS8vCi0vLwkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBnZXRQYXJlbnQobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpLCB0cnVlLCBmYWxzZSkpOwotLy8JCQkKLS8vCQkJLy8gcmVmcmVzaCBpdHNlbGYKLS8vCQkJLy8KLS8vCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0vLwkJCQotLy8JCQlyZXR1cm47Ci0vLwkJfQotCQkKLQkJVG5nVXRpbC5yZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChub3RpZmljYXRpb24sIHRoaXMpOwotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UYXNrc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MjEwNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1Rhc2tzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTGlicmFyeUVkaXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJUYXNrcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGFza3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rhc2tzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Rhc2tzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGFzaygpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBUYXNrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IG51bGw7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19UQVNLOwotCQl9Ci0JCWlmIChiYXNlTmFtZSAhPSBudWxsKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoQ29udGVudFBhY2thZ2UpIHRhcmdldCkKLQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCAoTWV0aG9kRWxlbWVudCkgb2JqLCBiYXNlTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmVsZW1lbnQuVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIjbmV3Q2hpbGRBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRyZW5DaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJLy8gcmVmcmVzaCB0aGUgdW5jYXRlZ29yaXplZCB0YXNrcyBncm91cAotCQkvLwotCQlUbmdVdGlsLnJlZnJlc2hVbmNhdGVnb3JpemVkVGFza3NJdGVtUHJvdmlkZXIoVW1hVXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIHRhcmdldCksIG1zZyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9UcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGRjZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1RyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgc3ViIGZvbGRlcnMgaW4gdGhlCi0gKiBMaWJyYXJ5IHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGluIEVQRiBNNS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNpZW50Q29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBUcmFuc2llbnRDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKG1zZy5nZXROb3RpZmllcigpID09IHRhcmdldCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpOwotCQkJaWYgKGZlYXR1cmVJZCA9PSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJaWYobXNnLmdldE5ld1ZhbHVlKCkgIT0gbXNnLmdldE9sZFZhbHVlKCkpIHsKLQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQkJY2hpbGRyZW5DaGFuZ2VkKG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobXNnKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGlsZHJlbkNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEludGVyZXN0ZWRGZWF0dXJlSUQoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTJlODFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHdvcmsgcHJvZHVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5kZWxlZ2F0ZUl0ZW1Qcm92aWRlciA9IGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUVPYmplY3QgZU9iaiA9IChFT2JqZWN0KSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKGVPYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihlT2JqLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlci5nZXRXb3JrUHJvZHVjdHMoKTsKLQkJfQotCQlyZXR1cm4gZU9iajsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgT3V0Y29tZSkgewotCQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9PdXRjb21lX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlpZiAoKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSAhPSBudWxsKSB7Ci0JCQkJVVJJIGltZ1VyaSA9IFRuZ1V0aWwuZ2V0RnVsbFBhdGhvZk5vZGVvclNoYXBlSWNvblVSSSgKLQkJCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCSgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5vZGVpY29uKCkpOwotCQkJCU9iamVjdCBpbWFnZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U2hhcmVkSW1hZ2UoaW1nVXJpKTsKLQkJCQlpZiAoaW1hZ2UgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJfQotCQl9Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0FydGlmYWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE91dGNvbWUpIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L091dGNvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLldvcmtQcm9kdWN0SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2VsZW1lbnQvV29ya1Byb2R1Y3RzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTkzNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L1dvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiV29yayBQcm9kdWN0cyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2cpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZURlbGl2ZXJhYmxlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlT3V0Y29tZSgpKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI3NldERlZmF1bHROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoT2JqZWN0IG9iaikgewotCQlTdHJpbmcgYmFzZU5hbWUgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCWJhc2VOYW1lID0gTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0FSVElGQUNUOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19ERUxJVkVSQUJMRTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBPdXRjb21lKSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19PVVRDT01FOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQliYXNlTmFtZSA9IExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19XT1JLUFJPRFVDVDsKLQkJfQotCQlpZiAoYmFzZU5hbWUgIT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgoKENvbnRlbnRQYWNrYWdlKSB0YXJnZXQpCi0JCQkJCS5nZXRDb250ZW50RWxlbWVudHMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwgYmFzZU5hbWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5lbGVtZW50LlRyYW5zaWVudENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyI25ld0NoaWxkQWRkZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoaWxkcmVuQ2hhbmdlZChOb3RpZmljYXRpb24gbXNnKSB7Ci0JCVRuZ1V0aWwucmVmcmVzaFVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXJzKFVtYVV0aWwKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChFT2JqZWN0KSB0YXJnZXQpLCBtc2cpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvZWxlbWVudC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZmJmOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9lbGVtZW50L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpc3BsYXkgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgY29yZSBtZXRob2QgZWxlbWVudHMgYW5kIGd1aWRhbmNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvVG5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2ludGVybmFsL1RuZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWE1N2Q4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvVG5nQWRhcHRlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5FeHRlbnNpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgYWRhcHRlciBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG5nQWRhcHRlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgVG5nQWRhcHRlckZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG5nQWRhcHRlckZhY3RvcnkgY3JlYXRlQWRhcHRlckZhY3RvcnlQcm92aWRlcigpIHsKLQkJT2JqZWN0IHByb3ZpZGVyID0gRXh0ZW5zaW9uSGVscGVyLmNyZWF0ZShUbmdBZGFwdGVyRmFjdG9yeS5jbGFzcywgbnVsbCk7Ci0JCXJldHVybiBwcm92aWRlciBpbnN0YW5jZW9mIFRuZ0FkYXB0ZXJGYWN0b3J5ID8gKFRuZ0FkYXB0ZXJGYWN0b3J5KSBwcm92aWRlciA6IG5ldyBUbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLS8vCQlyZXR1cm4gbmV3IFRuZ0FkYXB0ZXJGYWN0b3J5SW1wbCgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0JTX0FEQVBURVJfRkFDVE9SWV9JRCA9ICJ3YnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJQlJBUllfQURBUFRFUl9GQUNUT1JZX0lEID0gImxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSQVRJT05fQURBUFRFUl9GQUNUT1JZX0lEID0gImNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSB3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBvYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gd2JzQWRhcHRlckZhY3RvcmllcyA9IG51bGw7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gb2JzQWRhcHRlckZhY3RvcmllcyA9IG51bGw7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gcGJzQWRhcHRlckZhY3RvcmllcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlbXSBwcm9jQWRhcHRlckZhY3RvcmllcyA9IG51bGw7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBFeHBvc2VkQWRhcHRlckZhY3RvcnkgY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGl0ZW1zRmlsdGVyQWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBwYnNGaWx0ZXJBZGFwYXRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBvYnNGaWx0ZXJBZGFwYXRlckZhY3Rvcnk7Ci0KLQlwcm90ZWN0ZWQgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IHByb2NBZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBUbmdBZGFwdGVyRmFjdG9yeUltcGwoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5UbmdBZGFwdGVyRmFjdG9yeSNnZXRXQlNfQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHdic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJd2JzQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCWdldFdCU19BZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5UbmdBZGFwdGVyRmFjdG9yeSNnZXRPQlNfQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAob2JzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKG9ic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJb2JzQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCWdldE9CU19BZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gb2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5UbmdBZGFwdGVyRmFjdG9yeSNnZXRQQlNfQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocGJzQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHBic0FkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJcGJzQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCWdldFBCU19BZGFwdGVyRmFjdG9yaWVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGJzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIGdldFdCU19BZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAod2JzQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnlGcm9tRXh0ZW5zaW9uKFdCU19BREFQVEVSX0ZBQ1RPUllfSUQpOwotCQkJaWYoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJZmFjdG9yeSA9IG5ldyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJfQotCQkJd2JzQWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCWZhY3RvcnksCi0JCQkJCS8vIG5ldyBCU1Byb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KGZhY3RvcnkpLAotCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJfQotCQlyZXR1cm4gd2JzQWRhcHRlckZhY3RvcmllczsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5W10gZ2V0T0JTX0FkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWlmIChvYnNBZGFwdGVyRmFjdG9yaWVzID09IG51bGwpIHsKLQkJCU9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBuZXcgT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQkJCW9ic0FkYXB0ZXJGYWN0b3JpZXMgPSBuZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQlmYWN0b3J5LAotCQkJCQkvLyBuZXcgQlNQcm9jZXNzdHlwZXNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeShmYWN0b3J5KSwKLQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0JCX0KLQkJcmV0dXJuIG9ic0FkYXB0ZXJGYWN0b3JpZXM7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeVtdIGdldFBCU19BZGFwdGVyRmFjdG9yaWVzKCkgewotCQlpZiAocGJzQWRhcHRlckZhY3RvcmllcyA9PSBudWxsKSB7Ci0JCQlQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlwYnNBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJZmFjdG9yeSwKLQkJCQkJLy8gbmV3IEJTUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoZmFjdG9yeSksCi0JCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQl9Ci0JCXJldHVybiBwYnNBZGFwdGVyRmFjdG9yaWVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gY3JlYXRlQWRhcHRlckZhY3RvcnlGcm9tRXh0ZW5zaW9uKExJQlJBUllfQURBUFRFUl9GQUNUT1JZX0lEKTsKLQkJCQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQkJZmFjdG9yeSA9IG5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQl9Ci0JCQkJCW5hdmlnYXRvckFkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcKLQkJCQkJCQkJCS8vIFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCWZhY3RvcnksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2dldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JLy8gcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0RmlsdGVyVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCS8vIGlmKGZpbHRlckFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkvLyBzeW5jaHJvbml6ZWQodGhpcykgewotCS8vIGlmKGZpbHRlckFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkvLyBmaWx0ZXJBZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAotCS8vIG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCS8vIG5ldyBjb20uaWJtLmxpYnJhcnkuZWRpdC5maWx0ZXIuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkvLyBuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKLQkvLyB9KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gZmlsdGVyQWRhcHRlckZhY3Rvcnk7Ci0JLy8gfQotCS8vICAgIAotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChjb25maWd1cmF0aW9uQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeUZyb21FeHRlbnNpb24oQ09ORklHVVJBVElPTl9BREFQVEVSX0ZBQ1RPUllfSUQpOwotCQkJCQlpZihmYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJCWZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJCX0KLQkJCQkJY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ID0gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQkJCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJZmFjdG9yeSwKLQkJCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjZ2V0TmF2aWdhdG9yVmlld19GaWx0ZXJBZGFwdGVyRmFjdG9yeShjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShJRmlsdGVyIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlckFkYXB0ZXJGYWN0b3J5KAotCQkJCWdldENvbmZpZ3VyYXRpb25WaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEZpbHRlckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIEFkYXB0ZXIsCi0JCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8Q2xhc3M8Pz4+IENMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7Ci0KLQkJc3RhdGljIHsKLQkJCUNMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLmFkZChBY3Rpdml0eS5jbGFzcyk7Ci0JCQlDTEFTU0VTX0VYQ0xVREVEX0ZST01fU09SVElORy5hZGQoQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MpOwotCQkJQ0xBU1NFU19FWENMVURFRF9GUk9NX1NPUlRJTkcuYWRkKFRhc2tEZXNjcmlwdG9yLmNsYXNzKTsKLQkJCUNMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLmFkZChUZWFtUHJvZmlsZS5jbGFzcyk7Ci0JCX0KLQotCQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlcjsKLQotCQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0FkYXB0ZXJDb25maWd1cmFibGU7Ci0KLQkJcHJvdGVjdGVkIEZpbHRlckl0ZW1Qcm92aWRlcihJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIsIElGaWx0ZXIgZmlsdGVyKSB7Ci0JCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb25maWd1cmFibGUpIHsKLQkJCQlpc0FkYXB0ZXJDb25maWd1cmFibGUgPSB0cnVlOwotCQkJCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQl9Ci0KLQkJfQotCQkKLQkJcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0QWRhcHRlcigpIHsKLQkJCXJldHVybiBhZGFwdGVyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlhZGFwdGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNnZXRUYXJnZXQoKQotCQkgKi8KLQkJcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFRhcmdldCgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI3NldFRhcmdldChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFRhcmdldChOb3RpZmllciBuZXdUYXJnZXQpIHsKLQkJCWFkYXB0ZXIuc2V0VGFyZ2V0KG5ld1RhcmdldCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXIjaXNBZGFwdGVyRm9yVHlwZShqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIGFkYXB0ZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG51bGw7Ci0JCQlmYWtlX2xvb3A6IGRvIHsKLQkJCQkKLQkJCQkvLyBPcmRlciBpcyBub3QgaW1wb3J0YW50LCBJZiBhZGFwdGVyIGlzIElMaWJyYXJ5SXRlbVByb3ZpZGVyCi0JCQkJLy8gYW5kIHJlcGxhY2VDaGlsZHJlbiBpcyBmYWxzZSBhbmQgSUNvbmZpZ3VyYWJsZSwgaXQgc2hvdWxkICAKLQkJCQkvLyBnbyB0byBpc0FkYXB0ZXJDb25maWd1cmFibGUsIG5vdCB0byByZWd1bGFyIGl0ZXJhdGlvbi4KLQotCQkJCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yCi0JCQkJCQkmJiBhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyOwotCQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCQlib29sZWFuIHJlcGxhY2VDaGlsZHJlbiA9IGZhbHNlOwotCQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSAoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKQotCQkJCQkJCS5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCUNvbGxlY3Rpb248Pz4gb3RoZXJDaGlsZHJlbiA9IGNvbmZpZ3VyYXRvci5nZXRDaGlsZHJlbigKLQkJCQkJCQkJb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQkJCWlmIChvdGhlckNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJCQlyZXBsYWNlQ2hpbGRyZW4gPSB0cnVlOwotCQkJCQkJCWNoaWxkcmVuLmFkZEFsbChvdGhlckNoaWxkcmVuKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAocmVwbGFjZUNoaWxkcmVuKSB7Ci0JCQkJCQlicmVhayBmYWtlX2xvb3A7Ci0JCQkJCX0KLQkJCQl9IAotCQkJCWlmIChpc0FkYXB0ZXJDb25maWd1cmFibGUpIHsKLQkJCQkJQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pihjb2xsZWN0aW9uKTsKLQkJCQkJYnJlYWsgZmFrZV9sb29wOwotCQkJCX0KLQkJCQkKLQkJCQkvLyByZWd1bGFyIGFkYXB0ZXIKLQkJCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IHdoaWxlIChmYWxzZSk7Ci0KLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgUHJhY3RpY2VJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChQcmFjdGljZUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0TW9kaWZpZWRDaGlsZHJlbihvYmplY3QsIGNoaWxkcmVuKTsKLQkJCX0KLQkJCQotCQkJLy8gYWxwaGFiZXRpY2FsbHkgc29ydCB0aGUgY2hpbGRyZW4KLQkJCS8vCi0JCQlpZiAoIVRuZ1V0aWwuaXNJbnN0YW5jZU9mKENMQVNTRVNfRVhDTFVERURfRlJPTV9TT1JUSU5HLCBUbmdVdGlsCi0JCQkJCS51bndyYXAob2JqZWN0KSkpIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLAotCQkJCQkJQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQl9Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsdGVySXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCkgcmV0dXJuZWQgIiArCi0JCQkvLyBjaGlsZHJlbik7Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXROZXdDaGlsZERlc2NyaXB0b3JzKG9iamVjdCwgZWRpdGluZ0RvbWFpbiwKLQkJCQkJc2libGluZyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcikKLQkJICovCi0JCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwKLQkJCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIENsYXNzIGNvbW1hbmRDbGFzcywKLQkJCQlDb21tYW5kUGFyYW1ldGVyIGNvbW1hbmRQYXJhbWV0ZXIpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBlZGl0aW5nRG9tYWluLCBjb21tYW5kQ2xhc3MsCi0JCQkJCWNvbW1hbmRQYXJhbWV0ZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEVsZW1lbnRzKG9iamVjdCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlciNoYXNDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IKLQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gYWx3YXlzIHJldHVybiB0cnVlIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJCQkvLwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpewotCQkJCXJldHVybiBhZGFwdGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0JCQl9Ci0JCQlpZihUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSNnZXRQcm9wZXJ0eURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIElJdGVtUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0LAotCQkJCU9iamVjdCBwcm9wZXJ0eUlEKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wZXJ0eUlEKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSNnZXRFZGl0YWJsZVZhbHVlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldEVkaXRhYmxlVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RWRpdGFibGVWYWx1ZShvYmplY3QpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEZpbHRlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgQWRhcHRlckZhY3RvcnksCi0JCQlJQ2hhbmdlTm90aWZpZXIsIElEaXNwb3NhYmxlIHsKLQotCQlwcml2YXRlIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQkJcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgRmlsdGVyQWRhcHRlckZhY3RvcnkoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCQlJRmlsdGVyIGZpbHRlcikgewotCQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJKChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KWFkYXB0ZXJGYWN0b3J5KS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCX0KLQkJCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNpc0ZhY3RvcnlGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIHR5cGUpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCBhZGFwdGVyIGluc3RhbmNlb2YgRmlsdGVySXRlbVByb3ZpZGVyCi0JCQkJCXx8ICEoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZpbHRlckl0ZW1Qcm92aWRlcigoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlciwgZmlsdGVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRhcmdldCwgdHlwZSk7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsIHx8IGFkYXB0ZXIgaW5zdGFuY2VvZiBGaWx0ZXJJdGVtUHJvdmlkZXIKLQkJCQkJfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJCXJldHVybiBuZXcgRmlsdGVySXRlbVByb3ZpZGVyKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSNhZGFwdE5ldyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHROZXcoTm90aWZpZXIgdGFyZ2V0LCBPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIGFkYXB0ZXJGYWN0b3J5LmFkYXB0TmV3KHRhcmdldCwgdHlwZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5I2FkYXB0QWxsTmV3KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRhcHRBbGxOZXcoTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0QWxsTmV3KG5vdGlmaWVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyI2ZpcmVOb3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmZpcmVOb3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNhZGRMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklDaGFuZ2VOb3RpZmllciNyZW1vdmVMaXN0ZW5lcihvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JTm90aWZ5Q2hhbmdlZExpc3RlbmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5LnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklEaXNwb3NhYmxlI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZpbHRlciA9IG51bGw7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV0JTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQdWJsaXNoaW5nV0JTQWRhcHRlckZhY3RvcnkoKQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKLQkJCQl9Ci0JCSk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkvLyBuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHVibGlzaGluZ1RCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKQotCQkJCX0KLQkJKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlV1BCU0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfTsKLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlUHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmU3RvcmUgPSBQcm92aWRlcnMuZ2V0QXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChwcmVmU3RvcmUgIT0gbnVsbCkgewotCQkJYWRhcHRlckZhY3Rvcnkuc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoUHJvY2Vzc1V0aWwKLQkJCQkJLnRvQ29sdW1uSW5kZXhUb05hbWVNYXAocHJlZlN0b3JlCi0JCQkJCQkJLmdldFN0cmluZyhMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dCU19DT0xVTU5TKSkpOwotCQl9Ci0JCUFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcyA9IG5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQlhZGFwdGVyRmFjdG9yeSwgbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH07Ci0KLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3Rvcmllcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVMaWJyYXJ5Q29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgY3JlYXRlTGlicmFyeUNvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBjcmVhdGVBZGFwdGVyRmFjdG9yeUZyb21FeHRlbnNpb24oTElCUkFSWV9BREFQVEVSX0ZBQ1RPUllfSUQpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJLy8gbmV3Ci0JCQkJCQkvLyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlmYWN0b3J5LAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCi0JfQotCQotCS8vIFNlY3Rpb24gZm9yIFRORyBGaWx0ZXIgbW9kaWZpY2F0aW9uIHByb2Nlc3MuCi0JLy8gZmlsdGVyIG1vZGlmaWNhdGlvbiBjb2RlLiBTaW1pbGFyIHRvIGdldEZpbHRlclZpZXdfQWRhcHRlckZhY3RvcnkoSUZpbHRlcgotCS8vIGZpbHRlcikKLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeSgKLQkJCQlnZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGZpbHRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRJdGVtc0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAoaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0UEJTRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyQWRhcHRlckZhY3RvcnkoZ2V0UEJTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQlmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFBCU0ZpbHRlcl9Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCWlmIChwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJCQlwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPSBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCQkJCS8vIG5ldyBSZXNvdXJjZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIH0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeSBnZXRPQlNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoSUZpbHRlciBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJBZGFwdGVyRmFjdG9yeShnZXRPQlNGaWx0ZXJfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLAotCQkJCWZpbHRlcik7Ci0JfQotCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0T0JTRmlsdGVyX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKG9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCQkJLy8gbmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyLk9CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBvYnNGaWx0ZXJBZGFwYXRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNnZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JICovCi0JcHVibGljIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChwcm9jQWRhcHRlckZhY3RvcnkgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJaWYgKHByb2NBZGFwdGVyRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpOwotCQkJCQlmaW5hbCBJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmU3RvcmUgPSBQcm92aWRlcnMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJCWlmIChwcmVmU3RvcmUgIT0gbnVsbCkgewotCQkJCQkJYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkJLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJLnRvQ29sdW1uSW5kZXhUb05hbWVNYXAocHJlZlN0b3JlCi0JCQkJCQkJCQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSk7Ci0JCQkJCQlwcmVmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkKLQkJCQkJCS8vIEluaXRpYWxpemUgImF1dG8gaW5oZXJpdCBzdXBwcmVzc2lvbiBzdGF0ZXMiIGZsYWcgZm9yIGNhbGN1bGF0aW5nIHN1cHByZXNzaW9uCi0JCQkJCQkvLyBhbmQgYWRkIGxpc3RlbmVyIHRvIGl0cyBjaGFuZ2UKLQkJCQkJCS8vCi0JCQkJCQlTdXBwcmVzc2lvbi5zZXRBdXRvSW5oZXJpdFN1cHByZXNzaW9uU3RhdGVzKHByZWZTdG9yZS5nZXRCb29sZWFuKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSkpOwotCQkJCQkJcHJlZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigpIHsKLQotCQkJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKElQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlciBldmVudCkgewotCQkJCQkJCQlpZihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0lOSEVSSVRfU1VQUFJFU1NJT05fU1RBVEUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQkJCQkJCQlTdXBwcmVzc2lvbi5zZXRBdXRvSW5oZXJpdFN1cHByZXNzaW9uU3RhdGVzKHByZWZTdG9yZS5nZXRCb29sZWFuKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9KTsKLQkJCQkJfQkJCQkJCi0JCQkJCi0JCQkJCXByb2NBZGFwdGVyRmFjdG9yaWVzID0gbmV3IEFkYXB0ZXJGYWN0b3J5W10gewotCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LAotCQkJCQkJCW5ldyBSZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB9OwotCi0JCQkJCXByb2NBZGFwdGVyRmFjdG9yeSA9IG5ldyBFeHBvc2VkQWRhcHRlckZhY3RvcnkoCi0JCQkJCQkJcHJvY0FkYXB0ZXJGYWN0b3JpZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9jQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCWlmIChuYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQluYXZpZ2F0b3JBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlpdGVtc0ZpbHRlckFkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCWl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAob2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW9ic0ZpbHRlckFkYXBhdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAocGJzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0JCQotCQkKLQkJaWYgKGNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJd2JzQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQl9Ci0KLQkJaWYgKG9ic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW9ic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCW9ic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQlwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAocHJvY0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBhZGFwdGVyIGZhY3RvcnkgYXMgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZyb20KLQkJCS8vIHByZWZlcmVuY2Ugc3RvcmUKLQkJCS8vCi0JCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBwcmVmU3RvcmUgPSBQcm92aWRlcnMuZ2V0QXV0aG9yaW5nUGx1Z2luUHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlpZiAocHJlZlN0b3JlICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2NBZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IHByb2NBZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIpIHsKLQkJCQkJCXByZWZTdG9yZQotCQkJCQkJCQkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKSBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlwcm9jQWRhcHRlckZhY3RvcnkuZGlzcG9zZSgpOwotCQkJcHJvY0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3RvcnkjY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nQ0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCW5ldyBBZGFwdGVyRmFjdG9yeVtdIHsKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZy5DQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJbmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpCi0JCQkJfQotCQkpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeSNjcmVhdGVQdWJsaXNoaW5nV1BCU0FkYXB0ZXJGYWN0b3J5KCkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBjcmVhdGVQdWJsaXNoaW5nV1BCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEV4cG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQluZXcgQWRhcHRlckZhY3RvcnlbXSB7Ci0JCQkJCQluZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmcuV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQluZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkKLQkJCQl9Ci0JCSk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5I2NsZWFuVXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFuVXAoKSB7Ci0JCVN1cHByZXNzaW9uLmNsZWFuVXAoKTsKLQotCQlpZiAobmF2aWdhdG9yQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJbmF2aWdhdG9yQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKGl0ZW1zRmlsdGVyQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJaXRlbXNGaWx0ZXJBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQkJCi0JCWlmIChvYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJb2JzRmlsdGVyQWRhcGF0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCQkKLQkJaWYgKHBic0ZpbHRlckFkYXBhdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYnNGaWx0ZXJBZGFwYXRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0JCQotCQkKLQkJaWYgKGNvbmZpZ1Byb2Nlc3NWaWV3QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJY29uZmlnUHJvY2Vzc1ZpZXdBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAoY29uZmlndXJhdGlvbkFkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25BZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAod2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJd2JzQWRhcHRlckZhY3RvcnkuY2xlYW5VcCgpOwotCQl9Ci0KLQkJaWYgKG9ic0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCW9ic0FkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTsKLQkJfQotCi0JCWlmIChwYnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlwYnNBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQotCQlpZiAocHJvY0FkYXB0ZXJGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXByb2NBZGFwdGVyRmFjdG9yeS5jbGVhblVwKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBZGFwdGVyRmFjdG9yeSBjcmVhdGVBZGFwdGVyRmFjdG9yeUZyb21FeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCS8vIFByb2Nlc3MgdGhlIGNvbnRyaWJ1dG9ycy4KLQkJLy8KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAiYWRhcHRlckZhY3RvcmllcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGZhY3RvcnlJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZihpZC5lcXVhbHMoZmFjdG9yeUlkKSkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJCU9iamVjdCBmYWN0b3J5ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCWlmKGZhY3RvcnkgaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeSkgewotCQkJCQkJCQkJcmV0dXJuIChBZGFwdGVyRmFjdG9yeSkgZmFjdG9yeTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNGZlNjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBkaXNwbGF5IGFuZCBlZGl0aW5nIHN1cHBvcnQgZm9yIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwYTRiNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhbiBhY3Rpdml0eSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWlmKGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKXJldHVybiB0cnVlOwotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzQ2hpbGQoY2hpbGQpOwotCX0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlGaWx0ZXJVdGlsCi0JCQkJLml0ZXJhdGVDb2xsZWN0aW9uKGNvbCwgUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KSk7Ci0JCXJldHVybiBjb2w7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQ2MWYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYWN0aXZpdHkgaW4gdGhlCi0gKiBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGFkZEluaGVyaXRlZChPYmplY3Qgb2JqZWN0LCBMaXN0IG15Q2hpbGRyZW4pIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBzdXBlci5hZGRJbmhlcml0ZWQob2JqZWN0LCBteUNoaWxkcmVuKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxNzUxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNhcGFiaWxpdHkgUGF0dGVybnMiIGFuZCAiRGVsaXZlcnkKLSAqIFByb2Nlc3NlcyIgZm9sZGVycyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlDb25maWd1cmFibGUgewotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCi0JLy8gcHJpdmF0ZSBTdHJpbmdbXSBwa2dQYXRoOwotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIE9iamVjdCBpbWFnZTsKLQotCS8vIHByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQlwcml2YXRlIE1ldGhvZFBhY2thZ2UgcGtnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RQYWNrYWdlIHBrZywgU3RyaW5nIG5hbWUsIE9iamVjdCBpbWFnZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWxhYmVsID0gbmFtZTsKLQkJdGhpcy5pbWFnZSA9IGltYWdlOwotCQl0aGlzLnBrZyA9IHBrZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJT2JqZWN0IGNoaWxkID0gZWxlbWVudDsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWNoaWxkID0gKChQcm9jZXNzQ29tcG9uZW50KSBlbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQl9Ci0JCQlpZiAoZmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlpZiAoIWlzRW1wdHlQYWNrYWdlKGNoaWxkKSkgewotCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNoaWxkUGFja2FnZXMoT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChQcm9jZXNzUGFja2FnZSkgb2JqZWN0KS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCUxpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbmV3TGlzdC5hZGRBbGwoY2hpbGRyZW4pOwotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGl0ZXIubmV4dCgpKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5UGFja2FnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50IHx8IG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3MpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSB0aGlzLmNoaWxkUGFja2FnZXMob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyh0YXJnZXQsIGVkaXRpbmdEb21haW4sIHNpYmxpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmVkY2QxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlRyYW5zaWVudENhdGVnb3J5UGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGNvbnRlbnQgY2F0ZWdvcnkgZm9sZGVycyBpbiB0aGUgbWV0aG9kCi0gKiBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlUcmFuc2llbnRDYXRlZ29yeVBhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCUlGaWx0ZXIgZmlsdGVyOwotCi0JT2JqZWN0IGltYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gcmV0dXJuIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpIHx8IChvYmogaW5zdGFuY2VvZgotCQkvLyBEaXNjaXBsaW5lICYmCi0JCS8vIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVHcm91cHMoKERpc2NpcGxpbmUpb2JqKS5pc0VtcHR5KCkpOwotCQlpZiAoIXRoaXMuZmlsdGVyLmFjY2VwdChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGlzY2lwbGluZQotCQkJCSYmICFBc3NvY2lhdGlvbkhlbHBlci5nZXREaXNjaXBsaW5lR3JvdXBzKChEaXNjaXBsaW5lKSBvYmopCi0JCQkJCQkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUm9sZVNldAotCQkJCSYmICFBc3NvY2lhdGlvbkhlbHBlci5nZXRSb2xlU2V0R3JvdXBzKChSb2xlU2V0KSBvYmopLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBvYmopIHsKLQkJaWYgKCFzdXBlci5hY2NlcHRBc0NoaWxkKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhY2NlcHQob2JqKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgY29udGVudEFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChjb250ZW50QWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgY29udGVudEFkYXB0ZXIpLnNldFBhcmVudChvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuaW1hZ2UgPSBvYmplY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4OWU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGNvbnRlbnQgY2F0ZWdvcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJVHJhbnNpZW50Q2F0ZWdvcnlQYWNrYWdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUNvbmZpZ3VyYWJsZSB7Ci0KLQlJRmlsdGVyIGZpbHRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmaWx0ZXIuYWNjZXB0KG9iaik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBjb250ZW50QWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGNvbnRlbnRBZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBjb250ZW50QWRhcHRlcikuc2V0UGFyZW50KG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdlMDkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgY29udGVudCBlbGVtZW50IGZvbGRlcnMgaW4gdGhlIG1ldGhvZAotICogZWxlbWVudCBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBUcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb25maWd1cmFibGUgewotCi0JSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKi8KLQlwdWJsaWMgQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTm90aWZpZXIgcGFyZW50KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU5vdGlmaWVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbkNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBjaGlsZHJlbkNvbC5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyMS5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKQotCQkJCSgoSUNvbmZpZ3VyYWJsZSkgY2hpbGQpLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQlpdGVyMS5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5Db2w7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCWlmICghc3VwZXIuYWNjZXB0QXNDaGlsZChvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAxN2U2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0NvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGNvbnRlbnQgcGFja2FnZSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9uZXMob2JqZWN0KTsKLQotCQkvLyByZW1vdmUgdGhlIGVtcHR5IHBhY2thZ2VzIGZyb20gdGhlIGNoaWxkcmVuIGxpc3QKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9uZXMoT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlQYWNrYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gdGhpcy5nZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T25lcyhvYmplY3QpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmICghaXNFbXB0eVBhY2thZ2UoaXRlci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0N1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYzkyNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgY3VzdG9tIGNhdGVnb3J5IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIFNldCB0aGUgY2hpbGRyZW5TdG9yZU1hcCB0byBudWxsLCB0byBnZXQgdGhlIHVwZGF0ZWQgY3VzdG9tY2F0ZWdvcmllcwotCQljaGlsZHJlblN0b3JlTWFwID0gbnVsbDsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWlmICh0aGlzLmZpbHRlciAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIG9iaiA9IChGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVyCi0JCQkJCQkubmV4dCgpOwotCQkJCWlmICghdGhpcy5maWx0ZXIuYWNjZXB0KG9iai5nZXRWYWx1ZSgpKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY1ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lIGdyb3VwaW5nIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpKTsKLQkJCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0KLQkJCS8vIFRPRE86IGNvbW1lbnRlZCBvdXQgdW50aWwgSmluaHVhIGZpeGVkIGJ1Z3MgaW4KLQkJCS8vIENvbmZpZ3VyYXRpb25GaWx0ZXIKLQkJCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCWNoaWxkcmVuID0gY29uZmlndXJhdG9yLmdldENoaWxkcmVuKG9iamVjdCwKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfRGlzY2lwbGluZXMoKSk7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJEaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTogcmV0dXJuZWQgZnJvbSBjb25maWd1cmF0b3I6ICIgKyBjaGlsZHJlbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCX0KLQkJCX0KLQotCQkJY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJRGlzY2lwbGluZUdyb3VwaW5nIGdyb3VwaW5nID0gKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0OwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25mID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pICgoQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcikgZ2V0UGFyZW50KG9iamVjdCkpCi0JCQkJCS5nZXRUYXJnZXQoKTsKLQkJCVRuZ1V0aWwuYWRkRXh0ZW5kZWRDaGlsZHJlbihncm91cGluZywgbWV0aG9kQ29uZiwgY2hpbGRyZW4sCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQotCQkJLy8gc2V0IHBhcmVudAotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoaXRlci5uZXh0KCksCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGVsc2UgewotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbkNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbkNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyICE9IG51bGwpCi0JCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuQ29sOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxsaWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxsaWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQkvLyBpZihvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCS8vIE1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRU9iamVjdCkgb2JqZWN0KTsKLQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJLy8gU3RyaW5nW10gcGF0aCA9IHsKLQkJLy8gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkvLyAsVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9TdGFuZGFyZF9DYXRlZ29yaWVzX2dyb3VwIikKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyAsVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gfTsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRJdGVtc0ZpbHRlcl9BZGFwdGVyRmFjdG9yeShmaWx0ZXIpLmFkYXB0KHBsdWdpbiwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJLy8gLy8gSUdyb3VwQ29udGFpbmVyIGdyb3VwcyA9IChJR3JvdXBDb250YWluZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQocGx1Z2luLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBpbnQgaTsKLQkJLy8gLy8gZm9yKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGggLSAxOyBpKyspIHsKLQkJLy8gLy8gZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkvLyAvLyBpZihncm91cHMgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCS8vIC8vIH0KLQkJLy8gLy8gcmV0dXJuIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCS8vIHJldHVybiBUbmdVdGlsLmdldEFkYXB0ZXIocGx1Z2luLCBwYXRoKTsKLQkJLy8gLy9yZXR1cm4gYWRhcHRlcjsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9EaXNjaXBsaW5lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiMjlkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkaXNjaXBsaW5lIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCU9iamVjdCBwYXJlbnQ7Ci0KLQlwdWJsaWMgRGlzY2lwbGluZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2w7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQljb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob2JqZWN0LAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQljb2wgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlGaWx0ZXJVdGlsLml0ZXJhdGVDb2xsZWN0aW9uKGNvbCwgZmlsdGVyKTsKLQkJfQotCi0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIG9iamVjdDsKLQkJaWYgKGRpc2NpcGxpbmUuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRpc2NpcGxpbmUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JCXN1cGVyLnNldFBhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0RvbWFpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmJmOGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkb21haW4gaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uRG9tYWluSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0JT2JqZWN0IHBhcmVudDsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIERvbWFpbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgb2JqZWN0OwotCQlpZiAoZG9tYWluLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBtb2RlbCA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGRvbWFpbik7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2w7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKSB7Ci0JCQljb2wgPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFKQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob2JqZWN0LAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQljb2wgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJLy8gSWYgZmlsdGVyIG5vdCBudWxsIGl0ZXJhdGUgY29sbGVjdGlvbi4KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlGaWx0ZXJVdGlsLml0ZXJhdGVDb2xsZWN0aW9uKGNvbCwgZmlsdGVyKTsKLQkJfQotCi0JCXJldHVybiBjb2w7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJDb25zdGFudHMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVyQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OWIxZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBnbG9iYWwgY29uc3RhbnRzIHVzZWQgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlckNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUklFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jdXN0b21jYXRlZ29yaWVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9fUExVR0lOUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19tZXRob2RwbHVnaW5zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jb250ZW50cGFja2FnZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFU0VUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19yb2xlc2V0c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NJUExJTkVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2Rpc2NpcGxpbmVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS1BST0RVQ1RUWVBFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHR5cGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19kb21haW5zX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdG9vbHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfRUxFTUVOVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfYWxsX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9sZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190YXNrc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktQUk9EVUNUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c193b3JrcHJvZHVjdHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19ndWlkYW5jZV90ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19wcm9jZXNzZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUSUVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2FjdGl2aXRpZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd29ya3Byb2R1Y3RkZXNjcmlwdG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfREVTQ1JJUFRPUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcm9sZWRlc2NyaXB0b3JzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19ERVNDUklQVE9SUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190YXNrZGVzY3JpcHRvcnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkxZX0NPTlRFTlRfRUxFTUVOVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfY29udGVudGVsZW1lbnRzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0NPTlRFTlRfRUxFTUVOVCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19hbGxjb250ZW50ZWxlbWVudHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0FETUFQID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvYWRtYXBfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS0xJU1RTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2NoZWNrbGlzdHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05DRVBUUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19jb25jZXB0c190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSQUNUSUNFUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19wcmFjdGljZXNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JlcG9ydHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVVTQUJMRV9BU1NFVFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfcmV1c2FibGVhc3NldHNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURV9QQVBFUlMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfd2hpdGVwYXBlcnNfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfdGVtcGxhdGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREVMSU5FUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19ndWlkZWxpbmVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQUE9SVElOR19NQVRFUklBTFMgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5GaWx0ZXJDb25zdGFudHNfc3VwcG9ydGluZ21hdGVyaWFsc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTUVOVE9SUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c190b29sbWVudG9yc190ZXh0OyAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQU1QTEVTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX2V4YW1wbGVzX3RleHQ7IAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9TRVRfR1JPVVBJTkdTID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuRmlsdGVyQ29uc3RhbnRzX3JvbGVzZXRncm9wdWluZ3NfdGV4dDsgCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FX0dST1VQSU5HUyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkZpbHRlckNvbnN0YW50c19kaXNjaXBsaW5lZ3JvdXBpbmdzX3RleHQ7IAotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcKLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEdVSURBTkNFX1RZUEVTID0gbmV3IFN0cmluZ1tdewotCS8vIENIRUNLTElTVFMsIENPTkNFUFRTLCBFWEFNUExFUywgUFJBQ1RJQ0VTLCBSRVBPUlRTLCBSRVVTQUJMRV9BU1NFVFMsCi0JLy8gU1VQUE9SVElOR19NQVRFUklBTFMsIFRFTVBMQVRFUywgVE9PTF9NRU5UT1JTLCBXSElURV9QQVBFUlMsCi0JLy8gR1VJREVMSU5FUyxST0FETUFQfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVEVOVF9FTEVNRU5UUyA9IG5ldyBTdHJpbmdbXSB7IFJPTEVTLAotCQkJVEFTS1MsIFdPUktQUk9EVUNUUywgR1VJREFOQ0UsIFNVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJT05MWV9DT05URU5UX0VMRU1FTlRTLCBUT09MX01FTlRPUlMgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVEVOVF9DQVRFR09SSUVTID0gbmV3IFN0cmluZ1tdIHsgUk9MRVNFVFMsCi0JCQlXT1JLUFJPRFVDVFRZUEVTLCBESVNDSVBMSU5FUywgVE9PTFMsIERPTUFJTlMgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQlJFQUtET1dOX0VMRU1FTlRTID0gbmV3IFN0cmluZ1tdIHsKLQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SUywgVEFTS19ERVNDUklQVE9SUywgUk9MRV9ERVNDUklQVE9SUyB9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IGNvbnRlbnRFbGVtZW50U3RycyA9IEFycmF5cwotCQkJLmFzTGlzdChDT05URU5UX0VMRU1FTlRTKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBjYXRlZ29yeVN0cnMgPSBBcnJheXMuYXNMaXN0KENPTlRFTlRfQ0FURUdPUklFUyk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBBcnJheXMKLQkJCS5hc0xpc3QoQlJFQUtET1dOX0VMRU1FTlRTKTsKLQotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCBoYXNoTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBzcGFjZSA9ICItIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVNUSU1BVEVfQ09OU0lERVJBVElPTlMgPSBMaWJyYXJ5RWRpdFBsdWdpbgotCQkJLmdldFBsdWdpbigpLmdldFN0cmluZygiX1VJX0d1aWRhbmNlc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTV9ERUZJTklUSU9OUyA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkuZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VzX1Rlcm1EZWZpbml0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZX1NUUklORyA9ICIqIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZX0NIQVJBQ1RFUiA9ICI/IjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlckhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjlhYzlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyBlbGVtZW50IGZpbHRlcmluZyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlckhlbHBlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQotCXByaXZhdGUgUGF0dGVybiByZWdleDsKLQotCXByaXZhdGUgU3RyaW5nIHRhYlN0cjsKLQotCXByaXZhdGUgT2JqZWN0IGNvbnRlbnRFbGVtZW50OwotCi0JcHJpdmF0ZSBMaXN0IGV4aXN0aW5nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1ByZXNlbnRhdGlvbk5hbWUgPSBmYWxzZTsKLQkKLQkvLyBUaGlzIGlzIHNlcGFyYXRlIGhhbmRsaW5nIGZvciBDb250ZW50Q29udGVnb3J5IAotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRDYXRlZ29yeVRhYlN0cjsKLQotCXB1YmxpYyBGaWx0ZXJIZWxwZXIoT2JqZWN0IGNvbnRlbnRFbGVtZW50LCBTdHJpbmcgdGFiU3RyLCBTdHJpbmcgcGF0dGVybiwKLQotCVN0cmluZyBmaWx0ZXJUeXBlU3RyLCBMaXN0IGFscmVhZHlTZWxlY3RlZExpc3QpIHsKLQotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0KLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQkJdGhpcy50eXBlID0gZmlsdGVyVHlwZVN0cjsKLQotCQl0aGlzLmV4aXN0aW5nRWxlbWVudHMgPSBhbHJlYWR5U2VsZWN0ZWRMaXN0OwotCi0JCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0KLQkJc2hvd1ByZXNlbnRhdGlvbk5hbWUgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCS5pc1Nob3dQcmVzZW50YXRpb25OYW1lcygpOwotCi0KLQl9Ci0JLyoKLQkgKiBtZXRob2QgdG8gc2V0IGNvbnRlbnRDYXRlZ29yeVRhYlN0ciwgdGhpcyAKLQkgKiBzcGVjaWFsIGhhbmRsZSBmb3IgY29udGVudCBjYXRlZ29yeSwgdGFiU3RyIGltcGxlbWVudGF0aW9uIAotCSAqIGRvbm90IHdvcmsgZm9yIHRoaXMuIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRDYXRlZ29yeVRhYlN0cihTdHJpbmcgY29udGVudENhdGVnb3J5VGFiU3RyKXsKLQkJdGhpcy5jb250ZW50Q2F0ZWdvcnlUYWJTdHIgPSBjb250ZW50Q2F0ZWdvcnlUYWJTdHI7Ci0JfQotCS8qCi0JICogbWV0aG9kIHRvIHNldCBjb250ZW50Q2F0ZWdvcnlUYWJTdHIsIHRoaXMgCi0JICogc3BlY2lhbCBoYW5kbGUgZm9yIGNvbnRlbnQgY2F0ZWdvcnksIHRhYlN0ciBpbXBsZW1lbnRhdGlvbiAKLQkgKiBkb25vdCB3b3JrIGZvciB0aGlzLiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRDYXRlZ29yeVRhYlN0cigpewotCQlyZXR1cm4gdGhpcy5jb250ZW50Q2F0ZWdvcnlUYWJTdHI7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpIHsKLQotCQlyZXR1cm4gZXhpc3RpbmdFbGVtZW50czsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFscmVhZHlTZWxlY3RlZExpc3QoTGlzdCBhbHJlYWR5U2VsZWN0ZWRMaXN0KSB7Ci0KLQkJdGhpcy5leGlzdGluZ0VsZW1lbnRzID0gYWxyZWFkeVNlbGVjdGVkTGlzdDsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoUGF0dGVybihPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBtYXRjaChvYmopOwotCX0KLQotCS8qCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IENhdGVnb3JpemVkRWxlbWVudHMgKHRyZWUgdHJhdmVyc2FsKSBvZgotCSAqIEN1c3RvbUNhdGVnb3J5IGhhcyBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyLiBAcGFyYW0gQ3VzdG9tQ2F0ZWdvcnkKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWF0Y2hlZENoaWxkQ3VzdG9tQ2F0ZWdvcnkoQ3VzdG9tQ2F0ZWdvcnkgdG9wQ2F0ZWdvcnkpIHsKLQkJTGlzdCBsaXN0ID0gdG9wQ2F0ZWdvcnkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSA9IChDdXN0b21DYXRlZ29yeSkgb2JqZWN0OwotCQkJCWlmIChtYXRjaGVyKGNhdGVnb3J5KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRDaGlsZEN1c3RvbUNhdGVnb3J5KGNhdGVnb3J5KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IHN1YkFydGlmYWN0cyAodHJlZSB0cmF2ZXJzYWwpIG9mIEFydGlmYWN0Ci0JICogaGFzIGFueSBtYXRjaCB3aXRoIG1hdGNoZXIuIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQotCQlMaXN0IGxpc3QgPSBhcnRpZmFjdC5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCUFydGlmYWN0IHN1YmFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmplY3Q7Ci0JCQkJaWYgKG1hdGNoZXIoc3ViYXJ0aWZhY3QpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZEFydGlmYWN0KHN1YmFydGlmYWN0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIHRvIGNoZWNrIGFueSBzdWJBcnRpZmFjdHMgKHRyZWUgdHJhdmVyc2FsKSBvZiBBcnRpZmFjdAotCSAqIGhhcyBhbnkgbWF0Y2ggd2l0aCAgYWxyZWFkeWV4aXN0aW5nIGVsZW1lbnRzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQXJ0aWZhY3QoQXJ0aWZhY3QgYXJ0aWZhY3QsIExpc3QgZXhpc3RpbmdMaXN0KSB7Ci0KLQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBzdWJhcnRpZmFjdCA9IChBcnRpZmFjdCkgb2JqZWN0OwotCQkJCWlmKCFleGlzdGluZ0xpc3QuY29udGFpbnMoc3ViYXJ0aWZhY3QpKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgQ2hpbGRQYWNrYWdlcyAodHJlZSB0cmF2ZXJzYWwpIG9mIENvbnRlbnQKLQkgKiBQYWNrYWdlIGhhcyBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyLgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQ2hpbGQoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZFBrZyA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBjb250ZW50UGtnID0gKENvbnRlbnRQYWNrYWdlKSBjaGlsZFBrZzsKLQkJCQlpZiAobWF0Y2hlcihjb250ZW50UGtnKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRDaGlsZChjb250ZW50UGtnKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IHN1YkRvbWFpbiAodHJlZSB0cmF2ZXJzYWwpIG9mIERvbWFpbiBoYXMKLQkgKiBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyIDxsaW5rPm1hdGNoZXIoT2JqZWN0IG9iaik8L2xpbms+Ci0JICogCi0JICogQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRTdWJEb21haW5zKERvbWFpbiBkb21haW4pIHsKLQkJTGlzdCBsaXN0ID0gZG9tYWluLmdldFN1YmRvbWFpbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHN1YmRvbWFpbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtYXRjaGVyKHN1YmRvbWFpbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSBpZiAoaGFzTWF0Y2hlZFN1YkRvbWFpbnMoKERvbWFpbikgc3ViZG9tYWluKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKERpc2NpcGxpbmUgZGlzY2lwbGluZSl7Ci0JCUxpc3QgbGlzdCA9IGRpc2NpcGxpbmUuZ2V0U3ViZGlzY2lwbGluZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc3ViZGlzY2lwbGluZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtYXRjaGVyKHN1YmRpc2NpcGxpbmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKChEaXNjaXBsaW5lKSBzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWREaXNjaXBsaW5lcyhEaXNjaXBsaW5lR3JvdXBpbmcgZ3JvdXBpbmcpewotCQlMaXN0IGxpc3QgPSBncm91cGluZy5nZXREaXNjaXBsaW5lcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgc3ViZGlzY2lwbGluZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChtYXRjaGVyKHN1YmRpc2NpcGxpbmUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRTdWJEaXNjaXBsaW5lKChEaXNjaXBsaW5lKSBzdWJkaXNjaXBsaW5lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYW55IGFjdGl2aXR5ICh0cmVlIHRyYXZlcnNhbCkgb2YgYWN0aXZpdHkgaGFzCi0JICogYW55IG1hdGNoIHdpdGggbWF0Y2hlciA8bGluaz5tYXRjaGVyKE9iamVjdCBvYmopPC9saW5rPgotCSAqIAotCSAqIEBwYXJhbSBDdXN0b21DYXRlZ29yeQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaGVkQWN0aXZpdGllcyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlMaXN0IGxpc3QgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAobWF0Y2hlcihlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRBY3Rpdml0aWVzKChBY3Rpdml0eSkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjaGVjayBhbnkgYWN0aXZpdHkgKHRyZWUgdHJhdmVyc2FsKSBvZiBQcm9jZXNzUGFja2FnZSBoYXMKLQkgKiBhbnkgbWF0Y2ggd2l0aCBtYXRjaGVyIDxsaW5rPm1hdGNoZXIoT2JqZWN0IG9iaik8L2xpbms+Ci0JICogCi0JICogQHBhcmFtIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoZWRBY3Rpdml0aWVzKFByb2Nlc3NQYWNrYWdlIHByb2NQYWNrYWdlKSB7Ci0JCUxpc3QgbGlzdCA9IHByb2NQYWNrYWdlLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAobWF0Y2hlcihlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGhhc01hdGNoZWRBY3Rpdml0aWVzKChBY3Rpdml0eSkgZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGNoZWNrIGNoaWxkIHBhY2thZ2VzCi0JCWxpc3QgPSBwcm9jUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChoYXNNYXRjaGVkQWN0aXZpdGllcygoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlclR5cGVTdHIoKSB7Ci0KLQkJLy8gVHJpbSAiLSIoaHlwaGVuKSBmcm9tIHRoZSBzdHJpbmdzICh0eXBlcykuICBPbmx5IGluIGNhc2UgbWV0aG9kcGx1Z2luCi0JCS8vIGRvbid0IHRyaW0gIi0iIGJlY2F1c2UgbWV0aG9kcGx1Zy1pbiBjb250YWluICItIiAoaHlwaGVuKWFuZCB1c2VmdWwuCi0JCXdoaWxlICh0eXBlICE9IG51bGwgJiYgdHlwZS5pbmRleE9mKEZpbHRlckNvbnN0YW50cy5zcGFjZSkgPiAtMQotCQkJCSYmICF0eXBlLmVxdWFscyhGaWx0ZXJDb25zdGFudHMuTUVUSE9fUExVR0lOUykpIHsKLQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyh0eXBlLmluZGV4T2YoRmlsdGVyQ29uc3RhbnRzLnNwYWNlKSArIDEsIHR5cGUKLQkJCQkJLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKSB7Ci0KLQkJcmV0dXJuIHBhdHRlcm47Ci0KLQl9Ci0KLQlwdWJsaWMgUGF0dGVybiBnZXRSZWdleFBhdHRlcm4oKSB7Ci0KLQkJcmV0dXJuIHJlZ2V4OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJTdHIoKSB7Ci0KLQkJcmV0dXJuIHRhYlN0cjsKLQotCX0KLQotCS8qCi0JICogCi0JICogTWV0aG9kIGNoZWNrcyB3aGV0aGVyIGFyYml0cmFyeSBvYmplY3QgcGFzc2VkIGlzCi0JICogCi0JICogZXF1YWwgdG8gY3VycmVudCBjb250ZW50IGVsZW1lbnQncyB2YXJpYWJpbGl0eSBvciBub3QuCi0JICogCi0JICogSWYgdmFyaWFiaWxpdHkgb2YgQ29udGVudEVsZW1lbnQgbWF0Y2hlcyBhcmJpdHJhcnkgb2JqZWN0LAotCSAqIAotCSAqIHJldHVybnMgdHJ1ZS4KLQkgKiAKLQkgKiBAcmV0dW4gYm9vbGVhbi4KLQkgKiAKLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrVmFyaWFiaWxpdHkoT2JqZWN0IG9iaikgewotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCi0JCQlPYmplY3QgdmFyaWFiaWxpdHlPYmplY3QgPSAoKENvbnRlbnRFbGVtZW50KSBjb250ZW50RWxlbWVudCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICh2YXJpYWJpbGl0eU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHModmFyaWFiaWxpdHlPYmplY3QpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRDb250ZW50RWxlbWVudCgpIHsKLQotCQlyZXR1cm4gY29udGVudEVsZW1lbnQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50RWxlbWVudChPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQotCQl0aGlzLmNvbnRlbnRFbGVtZW50ID0gY29udGVudEVsZW1lbnQ7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJUeXBlU3RyKFN0cmluZyBmaWx0ZXJUeXBlU3RyKSB7Ci0KLQkJdGhpcy50eXBlID0gZmlsdGVyVHlwZVN0cjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKLQotCQl0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnZXhQYXR0ZXJuKFBhdHRlcm4gcmVnZXhQYXR0ZXJuKSB7Ci0KLQkJdGhpcy5yZWdleCA9IHJlZ2V4UGF0dGVybjsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYlN0cihTdHJpbmcgdGFiU3RyKSB7Ci0KLQkJdGhpcy50YWJTdHIgPSB0YWJTdHI7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGF0aEJhc2VkT25UYWJTdHJpbmcoU3RyaW5nIHRhYlN0cikgewotCi0JCWlmIChGaWx0ZXJDb25zdGFudHMuY29udGVudEVsZW1lbnRTdHJzLmNvbnRhaW5zKHRhYlN0cikpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUykKLQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ST0xFX1NFVF9HUk9VUElOR1MpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUykKLQkJCQl8fCB0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FX0dST1VQSU5HUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aDsKLQkJfSBlbHNlIGlmICh0YWJTdHIuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5UT09MUykpIHsKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLldPUktQUk9EVUNUVFlQRVMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkRPTUFJTlMpKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoOwotCQl9IGVsc2UgaWYgKHRhYlN0ci5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkNVU1RPTV9DQVRFR09SSUVTKSkgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoOwotCQl9IGVsc2UKLQkJCXJldHVybiBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aDsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIFRoaXMgaXMgY29udmVuaWVudCBtZXRob2QgdG8gY2hlY2sgYWxsIHRoZSBjb25kaXRpb24sIGxpa2UgbWF0Y2hQYXR0ZXJuLAotCSAqIGlmIG9iamVjdCBleGlzdHMgaW4gYWxyZWFkeSBzZWxlY3RlZCBsaXN0LCBjaGVjayB2YXJpYWJpbGl0eSBtYXRjaCwgYW5kCi0JICogaXMgb2JqZWN0IGl0c2VsZiBkb25vdCBkaXNwbGF5LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrT2JqZWN0QWNjZXB0ZWQoT2JqZWN0IG9iaikgewotCi0JCWlmICghbWF0Y2gob2JqKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy8gQ2hlY2sgaWYgYWxyZWFkeSBleGlzdGluZyAoYXNzb2NpYXRlZCBlbGVtZW50cykgZG9uJ3QgZGlzcGxheS4KLQkJaWYgKGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsCi0JCQkJJiYgZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpewotCQkJLy8gc3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciBBcnRpZmFjdCBhbmQgc3ViLWFydGlmYWN0LgotCQkJaWYob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJCWlmKCFoYXNNYXRjaGVkQXJ0aWZhY3QoKEFydGlmYWN0KW9iaixnZXRBbHJlYWR5U2VsZWN0ZWRMaXN0KCkpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9ZWxzZXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY2hlY2tWYXJpYWJpbGl0eShvYmopKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGlmIG9iamVjdCBpdHNlbGYgZG9uJ3QgZGlzcGxheQotCQkvLyBEbyBlcXVhbCBjaGVjayBvbmx5IG9uIGVsZW1lbnRzIG90aGVydGhhbiBtZXRob2QgcGx1Z2luLCBJbiBjYXNlIG9mCi0JCS8vIENvcHlyaWdodChzdXBwb3J0aW5nIG1hdGVyaWFsKSBhc3NvY2lhdGluZyB0byBtZXRob2RwbHVnaW4sIGlmCi0JCS8vIG1ldGhvZHBsdWdpbiAoY29udGVudEVsZW10bikgZXF1YWxzCi0JCS8vIG9iaiwgdGhlbiByZXN1bHRzIGZhbHNlLlBsdWdpbiB3aWxsIGxvc3QgZnJvbSB0cmVlIGluIHRoZSBmaWx0ZXIuIEluCi0JCS8vIHR1cm4gc3VwcG9ydGluZyBtYXRlcmlhbCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHBsdWdpbiB3aWxsIG5vdCBiZQotCQkvLyBkaXNwbGF5ZWQuCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCWlmIChjb250ZW50RWxlbWVudCAhPSBudWxsICYmIG9iai5lcXVhbHMoY29udGVudEVsZW1lbnQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciBjaGVja2luZyBNZXRob2RQbHVnaW4gYWNjZXB0ZWQgb3Igbm90LiBNZXRob2QgbmVlZHMKLQkgKiB0byBpbnZva2VkIG9ubHkgZm9yIE1ldGhvZFBsdWdpbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0TWV0aG9kUGx1Z2luKE9iamVjdCBvYmopIHsKLQkJaWYgKGNvbnRlbnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoY29udGVudEVsZW1lbnQpLmNvbnRhaW5zKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgY2hlY2tpbmcgQ29udGVudCBQYWNrYWdlIGFjY2VwdGVkIG9yIG5vdC4gTWV0aG9kCi0JICogbmVlZHMgdG8gaW52b2tlZCBvbmx5IGZvciBDb250ZW50IFBhY2thZ2Ugb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRDb250ZW50UGFja2FnZShPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKCgoQ29udGVudFBhY2thZ2UpIG9iaikuZ2V0Q2hpbGRQYWNrYWdlcygpLmlzRW1wdHkoKQotCQkJCSYmICgoQ29udGVudFBhY2thZ2UpIG9iaikuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc09iamVjdEluU2VsZWN0ZWRJdGVtcyhPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKGdldEFscmVhZHlTZWxlY3RlZExpc3QoKSAhPSBudWxsCi0JCQkJJiYgZ2V0QWxyZWFkeVNlbGVjdGVkTGlzdCgpLmNvbnRhaW5zKG9iaikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoQ29udGVudEVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBKdXN0IHJldHVybmluZyB0cnVlLCBiZWNhdXNlIGNvbnRyaWJ1dGlvbiBjaGVja2VkIGluIG90aGVyIHBsYWNlLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hQYXR0ZXJuQmFzZWRPblR5cGUoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbWF0Y2gob2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFBhdHRlcm5PblByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbWF0Y2gob2JqKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gc2hvd1ByZXNlbnRhdGlvbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvd1ByZXNlbnRhdGlvbk5hbWUoYm9vbGVhbiBzaG93UHJlc2VudGF0aW9uTmFtZSkgewotCQl0aGlzLnNob3dQcmVzZW50YXRpb25OYW1lID0gc2hvd1ByZXNlbnRhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJpYyBtZXRob2QgdG8gY2hlY2sgbWF0Y2ggb2YgYW4gb2JqZWN0IGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqIGFsc28gYmFzZWQgb24gdHlwZSB0aGF0IHNlbGVjdGVkIGluIHRoZSBkaWFsb2cuCi0JICovCi0KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2goT2JqZWN0IG9iaikgewotCi0JCS8vIERvIG5vdCBkbyBQYXR0ZXJuIG1hdGNoIGlmIHR5cGUgb3IgcGF0dGVybiBzdHJpbmcgaXMgbnVsbC4KLQkJaWYgKHR5cGUgPT0gbnVsbCB8fCBwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5lcXVhbHNJZ25vcmVDYXNlKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gQ2hlY2sgaWYgdHlwZSBpcyBvZiBDb250ZW50IFBhY2thZ2UKLQkJaWYgKHR5cGUuZXF1YWxzKEZpbHRlckNvbnN0YW50cy5DT05URU5UX1BBQ0tBR0VTKSkgewotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQotCQkJCWlmIChtYXRjaGVyKG9iaikgfHwgaGFzTWF0Y2hlZENoaWxkKChDb250ZW50UGFja2FnZSkgb2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCi0JCQkJLy8gZWxzZSBmb3IgYWxsIGNvbnRlbnQgZWxlbWVudHMsIGlmIHRoZWlyIGNvbnRlbnQgcGFrY2FnZQotCQkJCS8vIG1hdGNoZXMgLCByZXR1cm4gdHJ1ZS4KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCQkJT2JqZWN0IGNvbnRhaW5lciA9ICgoQ29udGVudEVsZW1lbnQpIG9iaikuZ2V0Q29udGFpbmVyKCk7Ci0JCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJaWYgKCFtYXRjaGVyKGNvbnRhaW5lcikpCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLk1FVEhPX1BMVUdJTlMpKSB7Ci0JCQkvLyBDaGVjayBpZiB0eXBlIGlzIG9mIE1ldGhvZCBQbHVnaW5zCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJLy8gaWYgaXMgYSBNZXRob2RQbHVnaW4sIHJldHVybiB0cnVlIGlmIG1hdGNoZXMgdGhlIHBhdHRlcm4KLQkJCQlyZXR1cm4gbWF0Y2hlcihvYmopOwotCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoRmlsdGVyQ29uc3RhbnRzLkFDVElWSVRJRVMpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlpZiAobWF0Y2hlcihvYmopKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBoYXNNYXRjaGVkQWN0aXZpdGllcygoQWN0aXZpdHkpb2JqKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIGhhc01hdGNoZWRBY3Rpdml0aWVzKChQcm9jZXNzUGFja2FnZSlvYmopOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0eXBlICE9IG51bGwpIHsKLQotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJfHwgb2JqIGluc3RhbmNlb2YgUHJvY2VzcykgewotCi0JCQkJaWYgKHR5cGUuaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuc3BhY2UpID4gLTEpIHsKLQkJCQkJdHlwZSA9IHR5cGUuc3Vic3RyaW5nKHR5cGUuaW5kZXhPZihGaWx0ZXJDb25zdGFudHMuc3BhY2UpLCB0eXBlLmxlbmd0aCgpKTsKLQkJCQl9Ci0KLQkJCQlDbGFzcyBjbHMgPSBGaWx0ZXJJbml0aWFsaXplci5nZXRJbnN0YW5jZSgpLmdldENsYXNzRm9yVHlwZSgKLQkJCQkJCXR5cGUpOwotCQkJCWlmIChjbHMgIT0gbnVsbCAmJiAhY2xzLmlzSW5zdGFuY2Uob2JqKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAobWF0Y2hlcihvYmopKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0KLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWRDaGlsZEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgb2JqKTsKLQotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkQXJ0aWZhY3QoKEFydGlmYWN0KSBvYmopOwotCQkJCQl9Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkU3ViRG9tYWlucygoRG9tYWluKSBvYmopOwotCQkJCQl9Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lKXsKLQkJCQkJCXJldHVybiBoYXNNYXRjaGVkU3ViRGlzY2lwbGluZSgoRGlzY2lwbGluZSlvYmopOwotCQkJCQl9Ci0JCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEaXNjaXBsaW5lR3JvdXBpbmcpewotCQkJCQkJcmV0dXJuIGhhc01hdGNoZWREaXNjaXBsaW5lcygoRGlzY2lwbGluZUdyb3VwaW5nKW9iaik7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZSB7IC8vIGVsc2UgZm9yIGFsbCBvdGhlciB0eXBlcyBvZiBlbGVtZW50cwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCX0gZWxzZQotCQkJLy8gdGhlIEFsbCBjYXNlCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCB3aGljaCBkb2VzIGFjdHVhbCBtYXRjaGluZyBvZiBnaXZlbiBvYmplY3Qgd2l0aCByZWd1bGFyCi0JICogZXhwcmVzc2lvbi4gQ2hlY2tzIHRvIGRvIHByZXNlbnRhdGlvbm5hbWUgb3IgbmFtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVyKE9iamVjdCBvYmopIHsKLQkJaWYocmVnZXggIT0gbnVsbCl7Ci0JCQlNYXRjaGVyIG0gPSByZWdleC5tYXRjaGVyKCgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXROYW1lKCkpOwotCQkJaWYgKHNob3dQcmVzZW50YXRpb25OYW1lKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudAotCQkJCQkJJiYgKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iaikuZ2V0UHJlc2VudGF0aW9uTmFtZSgpICE9IG51bGwpCi0JCQkJCW0gPSByZWdleC5tYXRjaGVyKCgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbS5tYXRjaGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDZlZTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvRmlsdGVySW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHNldHRpbmcgdXAgdGhlIG5lY2Vzc2FyeSBtYXBzIHVzZWQgZm9yIGVsZW1lbnQgZmlsdGVyaW5nCi0gKiBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsdGVySW5pdGlhbGl6ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsdGVySW5pdGlhbGl6ZXIgaW5pdGlhbGl6ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgbWFwOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVySW5pdGlhbGl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWxvYWRUeXBlQ2xhc3MoKTsKLQl9Ci0KLQkvKgotCSAqIFNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbHRlckluaXRpYWxpemVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5pdGlhbGl6ZXIgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChGaWx0ZXJJbml0aWFsaXplci5jbGFzcykgewotCQkJCWlmIChpbml0aWFsaXplciA9PSBudWxsKSB7Ci0JCQkJCWluaXRpYWxpemVyID0gbmV3IEZpbHRlckluaXRpYWxpemVyKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbml0aWFsaXplcjsKLQl9Ci0KLQkvKgotCSAqIExvYWQgdGhlIEZpbHRlciBUeXBlcyBhbmQgcmVzcGVjdGl2ZSBjbGFzc2VzLiBUaGlzIG5lZWQgaW4gY2FzZSBvZiBpMTE4biAtCi0JICogQ29uc3RhbnRzIHZhbHVlcyBhcmUgZGlmZmVyZW50LgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkVHlwZUNsYXNzKCkgewotCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFRZUEVTLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ET01BSU5TLCBEb21haW4uY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5XT1JLUFJPRFVDVFMsIFdvcmtQcm9kdWN0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RUWVBFUywgV29ya1Byb2R1Y3RUeXBlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuRE9NQUlOUywgRG9tYWluLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuV09SS1BST0RVQ1RTLCBXb3JrUHJvZHVjdC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkRJU0NJUExJTkVfR1JPVVBJTkdTLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ESVNDSVBMSU5FUywgRGlzY2lwbGluZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlRBU0tTLCBUYXNrLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuUk9MRV9TRVRfR1JPVVBJTkdTLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ST0xFU0VUUywgUm9sZVNldC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlJPTEVTLCBSb2xlLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuQ0hFQ0tMSVNUUywgQ2hlY2tsaXN0LmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuQ09OQ0VQVFMsIENvbmNlcHQuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5FU1RJTUFURV9DT05TSURFUkFUSU9OUywKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5FWEFNUExFUywgRXhhbXBsZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkdVSURFTElORVMsIEd1aWRlbGluZS5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlBSQUNUSUNFUywgUHJhY3RpY2UuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5SRVBPUlRTLCBSZXBvcnQuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5SRVVTQUJMRV9BU1NFVFMsIFJldXNhYmxlQXNzZXQuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5ST0FETUFQLCBSb2FkbWFwLmNsYXNzKTsKLQkJbWFwLnB1dChGaWx0ZXJDb25zdGFudHMuU1VQUE9SVElOR19NQVRFUklBTFMsIFN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlRFTVBMQVRFUywgVGVtcGxhdGUuY2xhc3MpOwotCQltYXAucHV0KEZpbHRlckNvbnN0YW50cy5URVJNX0RFRklOSVRJT05TLCBUZXJtRGVmaW5pdGlvbi5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLlRPT0xfTUVOVE9SUywgVG9vbE1lbnRvci5jbGFzcyk7Ci0JCW1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLldISVRFX1BBUEVSUywgV2hpdGVwYXBlci5jbGFzcyk7Ci0JCS8vIG1hcC5wdXQoRmlsdGVyQ29uc3RhbnRzLkdVSURBTkNFLCBHdWlkYW5jZS5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBDbGFzcyBmb3IgYSB0eXBlIGZyb20gdGhlIG1hcC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0Q2xhc3NGb3JUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCU9iamVjdCBvYmogPSBtYXAuZ2V0KHR5cGUpOwotCQlyZXR1cm4gKENsYXNzKSBvYmo7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9GaWx0ZXJVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3NjBjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0ZpbHRlclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIEEgdXRpbGl0eSBjbGFzcyBmb3IgbWFuYWdpbmcgZWxlbWVudCBmaWx0ZXJpbmcgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJVdGlsIHsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgaXRlcmF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbiBjaGlsZHJlbiwgSUZpbHRlciBmaWx0ZXIpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZm9yIGNvbGxlY3RpbmcgdGhlIHBhcmVudHMgY2hhaW4gKHVwd2FyZCkgb2YgYW4gYnJlYWtkb3duZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gQWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gQnJlYWtkb3duRWxlbWVudAotCSAqIEBwYXJhbSBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFBhcmVudHNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50LCBqYXZhLnV0aWwuTGlzdCBhY3Rpdml0eUxpc3QpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlhY3Rpdml0eUxpc3QuYWRkKHBhcmVudCk7Ci0JCQlnZXRQYXJlbnRzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudCwKLQkJCQkJYWN0aXZpdHlMaXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgY2hpbGRyZW4gb2YgdGhlIGFjdGl2aXR5IHJlY3Vyc2l2ZWx5IGRvd253YXJkcy4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGFjdGl2aXR5TGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQWN0aXZpdHkgcGFyZW50LCBMaXN0IGFjdGl2aXR5TGlzdCkgewotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCi0JCU9iamVjdCBvID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQlpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgbzsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJYWN0aXZpdHlMaXN0LmFkZChvYmopOwotCQkJCQlnZXRDaGlsZEFjdGl2aXRpZXNJblNjb3BlKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCQlhY3Rpdml0eUxpc3QpOwotCQkJCX0KLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBvMSA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgb2JqKS5nZXRWYWx1ZSgpOwotCQkJCQlhY3Rpdml0eUxpc3QuYWRkKG8xKTsKLQkJCQkJZ2V0Q2hpbGRBY3Rpdml0aWVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBvMSwKLQkJCQkJCQlhY3Rpdml0eUxpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbnQgbWV0aG9kIGZvciByZXRyaXZpbmcgYWxsIHRoZSBjb250cmlidXRvcnMgb2YKLQkgKiB2YXJpYWJpbGl0eWVsZW1lbnQgaW4gYSBsaXN0LgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDb250cmlidXRvcnMoTGlzdCBsaXN0LCBMaXN0IGdlbmVyYWxpemVycykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0Q29udHJpYnV0b3JzKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlnZW5lcmFsaXplcnMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW50IG1ldGhvZCBmb3IgcmV0cml2aW5nIGFsbCB0aGUgY29udHJpYnV0b3JzIG9mCi0JICogdmFyaWFiaWxpdHllbGVtZW50IGluIGEgbGlzdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0R2VuZXJhbGl6ZXJzKExpc3QgbGlzdCwgTGlzdCBnZW5lcmFsaXplcnMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBUbmdVdGlsLmdldEdlbmVyYWxpemVycygoVmFyaWFiaWxpdHlFbGVtZW50KSBlKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJZ2VuZXJhbGl6ZXJzLmFkZChpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVudCBtZXRob2QgZm9yIHJldHJpdmluZyBhbGwgdGhlIHZhcmlhYmlsaXR5IGJhc2VzIG9mCi0JICogdmFyaWFiaWxpdHllbGVtZW50IGluIGEgbGlzdC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0VmFyaWFiaWxpdHlCYXNlKExpc3QgbGlzdCwgTGlzdCB2YXJpYWJpbGl0eWJhc2VzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCQkJZm9yICg7IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGw7IHZhcmlhYmlsaXR5YmFzZXMKLQkJCQkJCS5hZGQoZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGUKLQkJCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkpCi0JCQkJCTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpIHsKLQkJaWYgKGJyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQkJd2hpbGUgKCEocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJCX0KLQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3ViVHJlZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyLCBBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCUxpc3QgdHJlZUxpc3QpIHsKLQkJRmlsdGVyVXRpbC5nZXRQYXJlbnRzSW5TY29wZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBhY3Rpdml0eSwgdHJlZUxpc3QpOwotCQlGaWx0ZXJVdGlsLmdldENoaWxkQWN0aXZpdGllc0luU2NvcGUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgYWN0aXZpdHksIHRyZWVMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0U3ViVHJlZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyLCBMaXN0IGxpc3QsCi0JCQlMaXN0IHRyZWVMaXN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlnZXRTdWJUcmVlKGFkYXB0ZXIsIChBY3Rpdml0eSkgb2JqLCB0cmVlTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMWQ4MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlIGd1aWRhbmNlIGZvbGRlcnMgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkd1aWRhbmNlR3JvdXBpbmdJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtZXRob2RDb25maWcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRMYWJlbChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChPYmplY3QgcGFyZW50KSB7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IGNvbC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChvYmopKQotCQkJCWl0b3IucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUFsbEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTZlNTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQWxsRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgYWxsIG1ldGhvZCBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uCi0gKiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWxsRmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDYXRlZ29yeUZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ2F0ZWdvcnlGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1ZDIyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDYXRlZ29yeUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGZpbHRlciB0aGF0IGRpc3BsYXlzIG9ubHkgY2F0ZWdvcnkgZWxlbWVudHMgaW4gdGhlIG1ldGhvZCBlbGVtZW50IHNlbGVjdGlvbgotICogZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGVnb3J5RmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci0KLQlTdHJpbmdbXSBnZXRDYXRlZ29yeVBhY2thZ2VQYXRoKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNvbnRlbnRGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUNvbnRlbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhZGVjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDb250ZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgb25seSBjb250ZW50IGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci0KLQlTdHJpbmdbXSBnZXRDb250ZW50UGFja2FnZVBhdGgoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9JQ3VzdG9tRmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDdXN0b21GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1NzExMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lDdXN0b21GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLS8qKgotICogQSBmaWx0ZXIgdGhhdCBkaXNwbGF5cyBvbmx5IGN1c3RvbSBjYXRlZ29yaWVzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDdXN0b21GaWx0ZXIgZXh0ZW5kcyBJRmlsdGVyIHsKLQotCVN0cmluZ1tdIGdldENvbnRlbnRQYWNrYWdlUGF0aCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYThkNjljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotLyoqCi0gKiBBIGdlbmVyaWMgZmlsdGVyIGZvciBmaWx0ZXJpbmcgb3V0IG1ldGhvZCBlbGVtZW50cyBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlciB7Ci0KLQkvKgotCSAqIGdldE9iamVjdCgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3QoKTsKLQotCS8qCi0JICogc2V0SGVscGVyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIZWxwZXIoRmlsdGVySGVscGVyIGhlbHBlcik7Ci0KLQkvKioKLQkgKiBBZGRlZCBmb3IgZnV0aGVyIGZpbHRlcmluZy4gRm9yIGV4YW1wbGUsIHdlIG1heSBzZXQgYSBmaWxlciB0byBwcmV2ZW50Ci0JICogZ2VuZXJhbGl6ZXJzIGFzIGJhc2UgZWxlbWVudCB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JICogCi0JICogQHBhcmFtIGFkZGl0aW9uYWxGaWx0ZXJzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWRkaXRpb25hbEZpbHRlcnMoCi0JCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXJbXSBhZGRpdGlvbmFsRmlsdGVycyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSVByb2Nlc3NGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSVByb2Nlc3NGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjNmQzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0lQcm9jZXNzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi0vKioKLSAqIEEgZmlsdGVyIHRoYXQgZGlzcGxheXMgb25seSBwcm9jZXNzIGVsZW1lbnRzIGluIHRoZSBtZXRob2QgZWxlbWVudCBzZWxlY3Rpb24KLSAqIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9jZXNzRmlsdGVyIGV4dGVuZHMgSUZpbHRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiMjFjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmYWN0b3J5IGZvciB0aGUgbWV0aG9kIGVsZW1lbnQgc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCkgewotCQlpZiAoY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgPSBuZXcgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSBuZXcgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlpZiAoY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnRjYXRlZ29yaWVzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJLy8gaWYoZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID09IG51bGwpewotCQkvLyBkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPSBuZXcKLQkJLy8gRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vIHJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JCXJldHVybiBuZXcgRGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCS8vIGlmKHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciA9PSBudWxsKXsKLQkJLy8gcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCQlyZXR1cm4gbmV3IFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLS8vCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLS8vCQkJZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci0JCQotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERvbWFpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzNDhjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLk1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJY2hpbGRyZW4gPSBudWxsOwotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0KLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlGaWx0ZXJVdGlsLml0ZXJhdGVDb2xsZWN0aW9uKGNvbCwgZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkNTI5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL01ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5GZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgbGlicmFyeSBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhYmxlIHsKLQotCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQ7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzQWRhcHRlckNvbmZpZ3VyYWJsZTsKLQkvLyBwcml2YXRlIEFycmF5TGlzdCBjaGlsZHJlbjsKLQkvLyBwcml2YXRlIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0JLy8gcHJpdmF0ZSBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgY29udGVudEVsZW1lbnQpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRoaXMuY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGNvbnRlbnRFbGVtZW50OwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSUZpbHRlciBmaWx0ZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkvLyBpc0FkYXB0ZXJDb25maWd1cmFibGUgPSB0cnVlOwotCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyRmFjdG9yeSkuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvCi0JICogZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4KLQkgKiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCS8vIHN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyMS5uZXh0KCk7Ci0JCQlpZiAoZmlsdGVyLmFjY2VwdChjaGlsZCkgJiYgY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgcCA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJcC5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJCQlDb2xsZWN0aW9uIGNoaWxkcyA9IHAuZ2V0Q2hpbGRyZW4oY2hpbGQpOwotCQkJCWZvciAoSXRlcmF0b3IgY2hpbGRJdGVyID0gY2hpbGRzLml0ZXJhdG9yKCk7IGNoaWxkSXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkT2JqID0gY2hpbGRJdGVyLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkT2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCQlpZiAoIWNoZWNrQ2hpbGRyZW5zKGNoaWxkT2JqKSkKLQkJCQkJCQljaGlsZEl0ZXIucmVtb3ZlKCk7Ci0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZE9iaikpIHsKLQkJCQkJCQljaGlsZEl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGNoaWxkcy5pc0VtcHR5KCkpCi0JCQkJCWl0ZXIxLnJlbW92ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQlpdGVyMS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrQ2hpbGRyZW5zKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCW9iamVjdCA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkuZ2V0VmFsdWUoKTsKLQkJCWlmICghZmlsdGVyLmFjY2VwdChvYmplY3QpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgewotCQkJQ29sbGVjdGlvbiBjaGlsZE9iakNoaWxkcyA9ICgoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBvYmplY3QpCi0JCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBjaGlsZE9iakl0ZXIgPSBjaGlsZE9iakNoaWxkcy5pdGVyYXRvcigpOyBjaGlsZE9iakl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGRPYmpDaGlsZCA9IGNoaWxkT2JqSXRlci5uZXh0KCk7Ci0JCQkJaWYgKGNoaWxkT2JqQ2hpbGQgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQkJcmV0dXJuIGNoZWNrQ2hpbGRyZW5zKGNoaWxkT2JqQ2hpbGQpOwotCQkJCX0KLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGRPYmpDaGlsZCkpIHsKLQkJCQkJY2hpbGRPYmpJdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjaGlsZE9iakNoaWxkcy5pc0VtcHR5KCkpCi0JCQkJLy8gY2hpbGRJdGVyLnJlbW92ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRGaWx0ZXIoY29tLmlibS5saWJyYXJ5LmVkaXQuSUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZSNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTI4NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBwbHVnLWluIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJQ29uZmlndXJhYmxlIHsKLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgY29sID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ2F0ZWdvcnlGaWx0ZXIpIHsKLQkJCWNvbC5hZGRBbGwoZ2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXIob2JqZWN0KS5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCXJldHVybiBjb2w7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUNvbnRlbnRGaWx0ZXIpIHsKLQkJCXJldHVybiBnZXRDb250ZW50KG9iamVjdCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUFsbEZpbHRlcikgewotCQkJcmV0dXJuIGdldEFsbENvbnRlbnRFbGVtZW50cyhvYmplY3QpOwotCQl9IGVsc2UgaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDdXN0b21GaWx0ZXIpIHsKLQkJCXJldHVybiBnZXRDdXN0b21DYXRlZ29yaWVzKG9iamVjdCk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCS8vIFRPRE86IGZpbHRlcgotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDdXN0b21DYXRlZ29yaWVzKE9iamVjdCBvYmplY3QpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVG5nVXRpbAotCQkJCS5nZXRSb290Q3VzdG9tQ2F0ZWdvcnkoKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChyb290Q3VzdG9tQ2F0ZWdvcnksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCSgoSUNvbmZpZ3VyYWJsZSkgYWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCXJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKHJvb3RDdXN0b21DYXRlZ29yeSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldENhdGVnb3J5SXRlbVByb3ZpZGVyKE9iamVjdCBvYmplY3QpIHsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoKE1ldGhvZFBsdWdpbikgb2JqZWN0LAotCQkJCSgoSUNhdGVnb3J5RmlsdGVyKSBmaWx0ZXIpLmdldENhdGVnb3J5UGFja2FnZVBhdGgoKSk7Ci0JCUNvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlciBjb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBwa2csICIiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWNvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0Q29udGVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKChNZXRob2RQbHVnaW4pIG9iamVjdCwKLQkJCQkoKElDb250ZW50RmlsdGVyKSBmaWx0ZXIpLmdldENvbnRlbnRQYWNrYWdlUGF0aCgpKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBrZywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGtnKTsKLQl9Ci0KLQkvLyBwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0Q29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyKE9iamVjdCBvYmplY3QpCi0JLy8gewotCS8vIENvbnRlbnRQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKChNZXRob2RQbHVnaW4pb2JqZWN0LAotCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkvLyBDb250ZW50RWxlbWVudHNJdGVtUHJvdmlkZXIgY29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyID0gbmV3Ci0JLy8gQ29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBwa2cpOwotCS8vIGNvbnRlbnRFbGVtZW50c0l0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkvLyByZXR1cm4gY29udGVudEVsZW1lbnRzSXRlbVByb3ZpZGVyOwotCS8vIH0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRBbGxDb250ZW50RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJU3RyaW5nW10gY29yZUNvbnRlbnRQYXRoID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGg7Ci0JCUNvbnRlbnRQYWNrYWdlIGNvcmVQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZSgKLQkJCQkoTWV0aG9kUGx1Z2luKSBvYmplY3QsIGNvcmVDb250ZW50UGF0aCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgY29udGVudEFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoY29yZVBrZywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJKChJQ29uZmlndXJhYmxlKSBjb250ZW50QWRhcHRlcikuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCWxpc3QuYWRkQWxsKGNvbnRlbnRBZGFwdGVyLmdldENoaWxkcmVuKGNvcmVQa2cpKTsKLQotCQlTdHJpbmdbXVtdIGNhdGVnb3J5UGF0aHMgPSBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGggfTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3J5UGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIHBhdGggPSBjYXRlZ29yeVBhdGhzW2ldOwotCQkJQ29udGVudFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoCi0JCQkJCShNZXRob2RQbHVnaW4pIG9iamVjdCwgcGF0aCk7Ci0JCQlDb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyIGNvbnRlbnRDYXRlZ29yaWVzR3JvdXBJdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcigKLQkJCQkJYWRhcHRlckZhY3RvcnksIHBrZywgZ2V0TmFtZShwYXRoKSk7Ci0JCQljb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQkJY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlci5zZXRJbWFnZShnZXRJbWFnZShwYXRoKSk7Ci0JCQljb250ZW50Q2F0ZWdvcmllc0dyb3VwSXRlbVByb3ZpZGVyLnNldFBhcmVudChvYmplY3QpOwotCQkJbGlzdC5hZGQoY29udGVudENhdGVnb3JpZXNHcm91cEl0ZW1Qcm92aWRlcik7Ci0JCX0KLQotCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBUbmdVdGlsCi0JCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeSgoTWV0aG9kUGx1Z2luKSBvYmplY3QpOwotCQlpZiAocm9vdEN1c3RvbUNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCWxpc3QuYWRkKHJvb3RDdXN0b21DYXRlZ29yeSk7Ci0JCX0KLQotCQkvLyBTdHJpbmcgbmFtZSA9Ci0JCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCVByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBwcm9jZXNzSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJcHJvY2Vzc0l0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJcHJvY2Vzc0l0ZW1Qcm92aWRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJbGlzdC5hZGQocHJvY2Vzc0l0ZW1Qcm92aWRlcik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyMSA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlcjEubmV4dCgpOwotCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQlpdGVyMS5yZW1vdmUoKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvLyBwcml2YXRlIENvbGxlY3Rpb24gZ2V0UHJvY2Vzc2VzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gLy8gU3RyaW5nIG5hbWUgPQotCS8vIC8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOwotCS8vIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgcHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoCi0JLy8gYWRhcHRlckZhY3RvcnksIChNZXRob2RQbHVnaW4pIG9iamVjdCk7Ci0JLy8gcHJvY2Vzc0l0ZW1Qcm92aWRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkvLyBsaXN0LmFkZChwcm9jZXNzSXRlbVByb3ZpZGVyKTsKLQkvLyByZXR1cm4gbGlzdDsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRJbWFnZShTdHJpbmdbXSBwYXRoKSB7Ci0JCWlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0RvbWFpbnMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lKFN0cmluZ1tdIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0KLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwYXRoID09IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpIHsKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Sb2xlX1NldHNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKHBhdGggPT0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmZWMzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYWN0aXZpdGllcyBpbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHBhZ2Ugb2YgYQotICogUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEVDbGFzc2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjQwNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBicmVhayBkb3duIGVsZW1lbnRzIGluIHRoZSBUZWFtIEFsbG9jYXRpb24gcGFnZQotICogb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyCi0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyCi0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL09CU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA2OWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHByb2Nlc3NlcyBpbiB0aGUgVGVhbSBBbGxvY2F0aW9uIHBhZ2UKLSAqIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwdWJsaWMgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQlzdXBlci5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNjQ2MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYWN0aXZpdGllcyBpbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlCi0gKiBwYWdlIG9mIGEgUHJvY2VzcyBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvLyBJRmlsdGVyIGZpdGxlcjsKLQlwdWJsaWMgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJLy8gVGhpcyBjYWxsIHRvIFBCU0FjdGlpdml0eUl0ZW1Qcm92aWRlcihwcm9jZXNzIHBhY2thZ2UpIGlzIGRvbmUKLQkJLy8gLSBpbiBvcmRlciByZW1vdmUgZHVwbGljYXRlIHN1YmFydGlmYWN0LgotCQljb2wgPSBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY29sLCBmYWxzZSk7Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YTE5MWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBicmVhayBkb3duIGVsZW1lbnRzIGluIHRoZSBXb3JrIFByb2R1Y3QgVXNhZ2UKLSAqIHBhZ2Ugb2YgYSBQcm9jZXNzIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyCi0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyCi0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2JjYzBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBwcm9jZXNzZXMgaW4gdGhlIFdvcmsgUHJvZHVjdCBVc2FnZSBwYWdlCi0gKiBvZiBhIFByb2Nlc3MgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXB1YmxpYyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY29sID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2w7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN1cGVyLnNldEZpbHRlcihmaWx0ZXIpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhjOTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudCBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIElGaWx0ZXIgZmlsdGVyOwotCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWZpbHRlci5hY2NlcHQoY2hpbGQpKQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyYjA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgcHJvY2VzcyBwYWNrYWdlIGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGdldENoaWxkcmVuSW5jbHVkaW5nRW1wdHlPYmplY3RzKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKGlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkluY2x1ZGluZ0VtcHR5T2JqZWN0cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUFycmF5TGlzdCBjb2wgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGNoaWxkID0gZWxlbWVudDsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJY2hpbGQgPSAoKFByb2Nlc3NDb21wb25lbnQpIGVsZW1lbnQpLmdldFByb2Nlc3MoKTsKLQkJCQl9Ci0JCQkJaWYgKCFmaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHlQYWNrYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQl8fCAhKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHRoaXMuZ2V0Q2hpbGRyZW5JbmNsdWRpbmdFbXB0eU9iamVjdHMob2JqZWN0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoIWlzRW1wdHlQYWNrYWdlKGl0ZXIubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gYW55UHJvY2Vzc0NvbXBvbmVudChPYmplY3QgcGFyZW50UHJvY2VzUGFja2FnZSkgewotCS8vIExpc3QgbGlzdCA9ICgoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudFByb2Nlc1BhY2thZ2UpLmdldFByb2Nlc3NFbGVtZW50cygpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCS8vIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JLy8gaWYgKGZpbHRlci5hY2NlcHQob2JqKSkKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJLy90aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1Byb2Nlc3Nlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzMyNGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbiB0aGUgbWV0aG9kIGVsZW1lbnQKLSAqIHNlbGVjdGlvbiBkaWFsb2dzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIgaW1wbGVtZW50cwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElHcm91cENvbnRhaW5lciwKLQkJSUNvbmZpZ3VyYWJsZSB7Ci0KLQlwcml2YXRlIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gTWV0aG9kUGx1Z2luCi0JICogQHBhcmFtIE1vZGVsU3RydWN0dXJlCi0JICogCi0JICogUGx1Z2luIGlzIHJlcXVpcmVkIHRvIHBhc3MsIHVzZWQgaW4gZmluZGluZyBNZXRob2RQYWNrYWdlIGZvciBwYXJ0aWN1bGFyCi0JICogTW9kZWxTdHJ1Y3R1cmUsIE1vZGVsU3RydWN0dXJlIGlzIG9wdGlvbmFsLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuc190ZXh0IiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzZXNfdGV4dCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX1Byb2Nlc3NDb250cmlidXRpb25zX3RleHQiKSB9OyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXVtdIHByb2Nlc3NQYXRocyA9IG5ldyBTdHJpbmdbXVtdIHsKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aCwKLQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCB9OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzUGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cxID0gKFByb2Nlc3NQYWNrYWdlKSBVbWFVdGlsCi0JCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLCBwcm9jZXNzUGF0aHNbaV0pOwotCQkJCWlmIChwa2cxICE9IG51bGwpIHsKLQkJCQkJT2JqZWN0IGltYWdlID0gVW1hRWRpdFBsdWdpbi5nZXRQbHVnaW4oKS5nZXRJbWFnZSgKLQkJCQkJCQkiZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQ2F0ZWdvcml6ZWRQcm9jZXNzZXNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gbmV3IENhdGVnb3JpemVkUHJvY2Vzc2VzSXRlbVByb3ZpZGVyKAotCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBwa2cxLCBuYW1lc1tpXSwgaW1hZ2UpOwotCQkJCQlpdGVtUHJvdmlkZXIuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQkJCWNoaWxkcmVuLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzOWMwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuaXRlbXNmaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLkNhdGVnb3JpZXNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJSb2xlIFNldHMiIGZvbGRlcnMgaW4gdGhlIG1ldGhvZCBlbGVtZW50Ci0gKiBzZWxlY3Rpb24gZGlhbG9ncy4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlDb25maWd1cmFibGUsIElMaWJyYXJ5SXRlbVByb3ZpZGVyLCBJU3RhdGVmdWxJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0cygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW47Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQotCQkJLy8gVE9ETzogY29tbWVudGVkIG91dCB1bnRpbCBKaW5odWEgZml4ZWQgYnVncyBpbgotCQkJLy8gQ29uZmlndXJhdGlvbkZpbHRlcgotCQkJaWYgKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQkJY2hpbGRyZW4gPSBjb25maWd1cmF0b3IuZ2V0Q2hpbGRyZW4ob2JqZWN0LAotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkpOwotCQkJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiUm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKCk6IHJldHVybmVkIGZyb20gY29uZmlndXJhdG9yOiAiICsgY2hpbGRyZW4pOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJCVJvbGVTZXRHcm91cGluZyBncm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpIG9iamVjdDsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZiA9IChNZXRob2RDb25maWd1cmF0aW9uKSAoKENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIGdldFBhcmVudChvYmplY3QpKQotCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQlUbmdVdGlsLmFkZEV4dGVuZGVkQ2hpbGRyZW4oZ3JvdXBpbmcsIG1ldGhvZENvbmYsIGNoaWxkcmVuLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnJvbGVTZXRQYXRoKTsKLQotCQkJLy8gc2V0IHBhcmVudAotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoaXRlci5uZXh0KCksCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHRoaXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9IGVsc2UgewotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbkNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbkNvbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGNvbnRlbnRBZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGNvbnRlbnRBZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChJTGlicmFyeUl0ZW1Qcm92aWRlcikgY29udGVudEFkYXB0ZXIpLnNldFBhcmVudChvYmplY3QpOwotCQkJCX0KLQkJCQlpZiAoZmlsdGVyICE9IG51bGwpCi0JCQkJCWlmICghZmlsdGVyLmFjY2VwdChjaGlsZCkpCi0JCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuQ29sOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldEZpbHRlcihjb20uaWJtLmxpYnJhcnkuZWRpdC5JRmlsdGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0TGFiZWwoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQkJLy8gaWYob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0JCS8vIGlmKHBsdWdpbiAhPSBudWxsKSB7Ci0JCS8vIFN0cmluZ1tdIHBhdGggPSB7Ci0JCS8vIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpCi0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gLFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyB9OwotCQkvLyBPYmplY3QgYWRhcHRlciA9Ci0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldEl0ZW1zRmlsdGVyX0FkYXB0ZXJGYWN0b3J5KGZpbHRlcikuYWRhcHQocGx1Z2luLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyAvLyBJR3JvdXBDb250YWluZXIgZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0SXRlbXNGaWx0ZXJfQWRhcHRlckZhY3RvcnkoZmlsdGVyKS5hZGFwdChwbHVnaW4sCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIC8vIGludCBpOwotCQkvLyAvLyBmb3IoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykgewotCQkvLyAvLyBncm91cHMgPSAoSUdyb3VwQ29udGFpbmVyKSBncm91cHMuZ2V0R3JvdXBJdGVtUHJvdmlkZXIocGF0aFtpXSk7Ci0JCS8vIC8vIGlmKGdyb3VwcyA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJLy8gLy8gfQotCQkvLyAvLyByZXR1cm4gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGdyb3Vwcy5nZXRHcm91cEl0ZW1Qcm92aWRlcihwYXRoW2ldKTsKLQkJLy8gcmV0dXJuIFRuZ1V0aWwuZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQkvLyAvL3JldHVybiBhZGFwdGVyOwotCQkvLyB9Ci0JCS8vIH0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjFlMzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHJvbGUgc2V0IGluIHRoZSBtZXRob2QgZWxlbWVudAotICogc2VsZWN0aW9uIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5Sb2xlU2V0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUNvbmZpZ3VyYWJsZSwgSUxpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVTZXRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjb2wgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KGdldFBhcmVudChvYmplY3QpKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlpZiAoZmlsdGVyICE9IG51bGwpIHsKLQkJCQlGaWx0ZXJVdGlsLml0ZXJhdGVDb2xsZWN0aW9uKGNvbCwgZmlsdGVyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGNvbCA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCQlpZiAoZmlsdGVyIGluc3RhbmNlb2YgSUFsbEZpbHRlcgotCQkJCQl8fCBmaWx0ZXIgaW5zdGFuY2VvZiBJQ2F0ZWdvcnlGaWx0ZXIpIHsKLQkJCQlyZXR1cm4gY29sOwotCQkJfQotCQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0KLQkJCS8vIChJdGVtUHJvdmlkZXJBZGFwdGVyKShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRSkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkKLQkJCS8vIC5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkvLyBjb2wgPSBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGNvbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXN1cGVyLnNldFBhcmVudChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQkJLy8gcmV0dXJuIHN1cGVyLmdldFBhcmVudChvYmplY3QpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvaXRlbXNmaWx0ZXIvVmFyaWFiaWxpdHlCYXNlRWxlbWVudEZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzIyOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9WYXJpYWJpbGl0eUJhc2VFbGVtZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lml0ZW1zZmlsdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGhpcyBpcyBhIGZpbHRlciBmb3IgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IHNlbGVjdGlvbi4gVGhlIGZpbHRlciB3aWxsCi0gKiBjaGVjayBpZiBvYmplY3QgY2FuIGJlIGFjY2VwdGVkIGFzIHRoZSBiYXNlIGVsZW1lbnQgb2YgdGhlIGZpbHRlciBvd25lci4KLSAqIAotICogRmlsdGVyIHJ1bGVzOgotICogCi0gKiAxLiBUaGUgZWxlbWVudCBpdHNlbGYgYW5kIGl0J3MgZ2VuZXJhbGl6ZXJzIChjb250cmlidXRvciwgcmVwbGFjZXIsIG9yCi0gKiBleHRlbmRlcikgc2hvdWxkIGJlIGZpbHRlcmVkIG91dAotICogMi4gQW55IGVsZW1lbnRzIGluIHRoZSBjb250YWlubWVudCBjaGFpbiBvZiB0aGUgYWJvdmUsIHNob3VsZCBiZSBmaWx0ZXJlZAotICogb3V0Ci0gKiAzLiBpZiBhbnkgb2YgdGhlIGJhc2UgZWxlbWVudHMgY2FuJ3QgYmUgc2VsZWN0ZWQsIHRoZW4gdGhpcyBlbGVtZW50IGNhbid0Ci0gKiBiZSBzZWxlY3RlZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIgewotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudDsKLQotCXByaXZhdGUgTGlzdCBiYWRndXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFZhcmlhYmlsaXR5QmFzZUVsZW1lbnRGaWx0ZXIoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQotCQkvLyBmaXJzdCBvZiBhbGwsIHlvdSBjYW4ndCB2YXJ5IHlvdXJzZWxmCi0JCWJhZGd1eXMuYWRkKGVsZW1lbnQpOwotCi0JCS8vIGdldCBhbGwgbXkgZ2VuZXJhbGl6ZXJzCi0JCUl0ZXJhdG9yIGl0ID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoZWxlbWVudCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWJhZGd1eXMuYWRkKHZlKTsKLQotCQkJLy8gdGhlIGNvbnRhaW5tZW50IGNoYWluIG9uIG15IGdlbmVyYWxpemVycyBjYW4ndCBiZSBteSBiYXNlCi0JCQloYW5kbGVDb250YWlubWVudENoYWluKHZlKTsKLQkJfQotCi0JCS8vIGVsZW1lbnQncyBpbiBteSBjaGFpbiBjYW4ndCBiZSBteSBiYXNlCi0JCWhhbmRsZUNvbnRhaW5tZW50Q2hhaW4oZWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNvbnRhaW5tZW50Q2hhaW4oVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJaWYgKCFoYXNDb250YWlubWVudEZlYXR1cmUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJTGlzdCByb290cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxvYWRSb290Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIGUsIHJvb3RzKTsKLQkJCWJhZGd1eXMuYWRkQWxsKHJvb3RzKTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCUxpc3Qgcm9vdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlkZWxpdmVyYWJsZVBhcnRzKChEZWxpdmVyYWJsZSkgZSwgcm9vdHMpOwotCQkJYmFkZ3V5cy5hZGRBbGwocm9vdHMpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgdGhlIGVsZW1lbnQgaGFzIGNvbnRhaW5tZW50IGZlYXR1cmUsCi0JCQkvLyB5b3UgY2FuJ3Qgc2VsZWN0IHRoZSBlbGVtZW50IGluIHRoZSBjb250YWlubWVudCBjaGFpbgotCQkJRU9iamVjdCByb290ID0gZ2V0Q2hhaW5Sb290KGUpOwotCQkJaWYgKCFiYWRndXlzLmNvbnRhaW5zKHJvb3QpKSB7Ci0JCQkJYmFkZ3V5cy5hZGQocm9vdCk7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBob2xkIG9mZiBmb3Igbm93IC8vIGFsc28gb25seSBvbmUgZWxlbWVudCBpbiBhIGNoYWluIGNhbiBiZQotCQkJICogc2VsZWN0ZWQgYXMgYmFzZSAvLyBzbyBnZXQgYWxsIHRoZSBiYXNlIGVsZW1lbnRzIGluIHRoZSBlbGVtZW50Ci0JCQkgKiBjaGFpbiwgYW5kIGJsb2NrIHRoZSBlbGVtZW50IGNoYWluIG9mIHRoZSBiYXNlIGVsZW1lbnRzCi0JCQkgKiBmaWx0ZXJVc2VkQmFzZUNoYWluKChWYXJpYWJpbGl0eUVsZW1lbnQpcm9vdCk7IGZvciAoSXRlcmF0b3IgaXQgPQotCQkJICogcm9vdC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOyApIHsgT2JqZWN0IG8gPSBpdC5uZXh0KCk7IGlmICgKLQkJCSAqIG8uZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpICkgewotCQkJICogZmlsdGVyVXNlZEJhc2VDaGFpbigoVmFyaWFiaWxpdHlFbGVtZW50KW8pOyB9IH0KLQkJCSAqLwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsaXZlcmFibGVQYXJ0cyhEZWxpdmVyYWJsZSBlLCBMaXN0IHJvb3RzKSB7Ci0JCUxpc3QgbGlzdCA9ICgoRGVsaXZlcmFibGUpIGUpLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJvb3RzLmFkZChvYmopOwotCQkJCQlkZWxpdmVyYWJsZVBhcnRzKChEZWxpdmVyYWJsZSkgb2JqLCByb290cyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRSb290Q3VzdG9tQ2F0ZWdvcmllcyhDdXN0b21DYXRlZ29yeSBlLCBMaXN0IHJvb3RzKSB7Ci0JCUxpc3QgY3MgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGUpOwotCQlpZiAoY3MgIT0gbnVsbCAmJiBjcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KGNjKSkgewotCQkJCQlsb2FkUm9vdEN1c3RvbUNhdGVnb3JpZXMoY2MsIHJvb3RzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIXJvb3RzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlyb290cy5hZGQoZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKCFyb290cy5jb250YWlucyhlKSkgewotCQkJcm9vdHMuYWRkKGUpOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSB2b2lkIGZpbHRlclVzZWRCYXNlQ2hhaW4oVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkvLyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCS8vIGlmIChiYXNlICE9IG51bGwpIHsKLQkvLyAvLyBpZiB0aGUgZWxlbWVudCBjaGFpbiBpcyBzZWxlY3RlZCBhcyBiYXNlIGluIHRoZSBjdXJyZW50IGNoYWluLAotCS8vIC8vIG5vIGVsZW1lbnQgaW4gdGhhdCBjaGFpbiBjYW4gYmUgZnV0aGVyIHNlbGVjdGVkCi0JLy8gT2JqZWN0IHJvb3QgPSBnZXRDaGFpblJvb3QoYmFzZSk7Ci0JLy8gaWYgKCFiYWRndXlzLmNvbnRhaW5zKHJvb3QpKSB7Ci0JLy8gYmFkZ3V5cy5hZGQocm9vdCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzQ29udGFpbm1lbnRGZWF0dXJlKCkgewotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkKLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QgfHwgZWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBnZXRDaGFpblJvb3QoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUVPYmplY3Qgcm9vdCA9IGU7Ci0JCU9iamVjdCB0eXBlID0gZWxlbWVudC5nZXRUeXBlKCk7Ci0JCUVPYmplY3QgcGFyZW50ID0gZTsKLQkJd2hpbGUgKChwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpKSAhPSBudWxsCi0JCQkJJiYgKChNZXRob2RFbGVtZW50KSBwYXJlbnQpLmdldFR5cGUoKSA9PSB0eXBlKSB7Ci0JCQlyb290ID0gcGFyZW50OwotCQl9Ci0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQotCQkvLyBhbHdheXMgYWNjZXB0IHBhY2thZ2VzCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5IHx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQl8fCBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIG11c3QgYmUgdmFyaWFiaWxpdHkgZWxlbWVudCBhbmQgY2FuJ3QgYmUgaXRzZWxmCi0JCWlmIChvYmogPT0gZWxlbWVudCB8fCAhKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIG11c3QgYmUgdGhlIHNhbWUgdHlwZQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmo7Ci0JCWlmICh2ZS5nZXRUeXBlKCkgIT0gZWxlbWVudC5nZXRUeXBlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNhbid0IGJlIG15IGFueSBvZiBteSBnZW5lcmFsaXplcnMKLQkJaWYgKGJhZGd1eXMuY29udGFpbnMob2JqKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gaWYgdGhpcyBlbGVtZW50J3MgYmFzZSBjaGFpbiBpcyBhIGJhZGd1eSwgY2FuJ3QgYWNjZXB0LCBvdGhlcndpc2UsIGEKLQkJLy8gY2lyY3VsYXIgbG9jawotCQl3aGlsZSAoKHZlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSAhPSBudWxsKSB7Ci0JCQlpZiAoYmFkZ3V5cy5jb250YWlucyh2ZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8gYW55dGhpbmcgZWxzZSA/Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9pdGVtc2ZpbHRlci9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzMDRjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L2l0ZW1zZmlsdGVyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBmaWx0ZXJpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0Fic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTMwYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5JRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgaXRlbSBwcm92aWRlciBhZGFwdGVyIGNsYXNzIGZvciB0aGUgIlByb2Nlc3NlcyIgZm9sZGVyIGluCi0gKiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSwKLQkJSUVsZW1lbnRJdGVtUHJvdmlkZXIsIElHcm91cENvbnRhaW5lciB7Ci0JcHJvdGVjdGVkIE1hcCBncm91cEl0ZW1Qcm92aWRlck1hcDsKLQotCXByb3RlY3RlZCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdDsKLQotCXByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW47Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gcHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIHByZWZTdG9yZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFic3RyYWN0UHJvY2Vzc2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLm1vZGVsU3RydWN0ID0gbW9kZWxTdHJ1Y3Q7Ci0KLQkJLy8gZmluYWwgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBQcm92aWRlcnMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIGlmIChwcmVmU3RvcmUgIT0gbnVsbCkgewotCQkvLyBwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCA9IHByZWZTdG9yZQotCQkvLyAuZ2V0Qm9vbGVhbihMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTik7Ci0JCS8vIHByZWZTdG9yZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLwotCQkvLyBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpID09Ci0JCS8vIExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfRU5BQkxFX1BST0NFU1NfQ09OVFJJQlVUSU9OKSB7Ci0JCS8vIGJvb2xlYW4gbmV3VmFsdWUgPSBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihldmVudAotCQkvLyAuZ2V0UHJvcGVydHkoKSk7Ci0JCS8vIGlmIChwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCAhPSBuZXdWYWx1ZSkgewotCQkvLyBwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCA9IG5ld1ZhbHVlOwotCQkvLyBmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkvLyBuZXcgTm90aWZpY2F0aW9uSW1wbCgtMSwgLTEsIC0xKSwKLQkJLy8gQWJzdHJhY3RQcm9jZXNzZXNJdGVtUHJvdmlkZXIudGhpcywgdHJ1ZSwKLQkJLy8gZmFsc2UpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8KLQkJLy8gfTsKLQkJLy8gcHJlZlN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZlN0b3JlTGlzdGVuZXIpOwotCQkvLyB9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gUHJvdmlkZXJzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlpZiAocHJlZlN0b3JlICE9IG51bGwgJiYgcHJlZlN0b3JlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJcHJlZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZlN0b3JlTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklHcm91cENvbnRhaW5lciNnZXRHcm91cEl0ZW1Qcm92aWRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0R3JvdXBJdGVtUHJvdmlkZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Byb2Nlc3Nlc19ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3Q2hpbGREZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0LAotCQkJRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLCBPYmplY3Qgc2libGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZmM2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbAotCQkJCS5nZXRMYWJlbChvYmplY3QsIGdldFN0cmluZygiX1VJX0NhcGFiaWxpdHlQYXR0ZXJuX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Db25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNiYzc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIkNvbmZpZ3VyYXRpb25zIiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25zSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IG1ldGhvZExpYnJhcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgbGliLCBuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gIShvYmogaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0NvbmZpZ3VyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUoKChNZXRob2RMaWJyYXJ5KSB0YXJnZXQpCi0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgKE1ldGhvZEVsZW1lbnQpIG9iaiwKLQkJCQkJTGlicmFyeUVkaXRDb25zdGFudHMuTkVXX0NPTkZJR1VSQVRJT04pOyAKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVDbGFzcygpCi0JICovCi0JcHVibGljIENsYXNzIGdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnkuY2xhc3M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50Q3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgKEVPYmplY3QpIHRhcmdldCwKLQkJCQlmZWF0dXJlLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24sIHRoaXMpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDaGlsZENvbW1hbmQjZ2V0VmFsaWRhdG9yKCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihvd25lciwgKE1ldGhvZENvbmZpZ3VyYXRpb24pY2hpbGQpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29udGVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvQ29udGVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNjMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0NvbnRlbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUxpYnJhcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuSUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgIk1ldGhvZCBDb250ZW50IiBmb2xkZXIgaW4gdGhlIExpYnJhcnkKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgd2lsbCBiZSByZW5hbWVkIGFzICJNZXRob2RDb250ZW50SXRlbVByb3ZpZGVyIiBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UsCi0JCUlFbGVtZW50SXRlbVByb3ZpZGVyLCBJR3JvdXBDb250YWluZXIgewotCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbiBwbHVnaW47Ci0KLQlwcm90ZWN0ZWQgTW9kZWxTdHJ1Y3R1cmUgbW9kZWxTdHJ1Y3Q7Ci0KLQlwcm90ZWN0ZWQgTWFwIGdyb3VwSXRlbVByb3ZpZGVyTWFwOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdCBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZzsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBNb2RlbFN0cnVjdHVyZSBtb2RlbFN0cnVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCQl0aGlzLm1vZGVsU3RydWN0ID0gbW9kZWxTdHJ1Y3Q7Ci0JfQotCQotCXB1YmxpYyBDb250ZW50UGFja2FnZSBnZXRDb3JlQ29udGVudFBhY2thZ2UoKSB7Ci0JCXJldHVybiBjb3JlQ29udGVudFBrZzsKLQl9Ci0JCi0JcHVibGljIE5vdGlmaWVyIGdldFRhcmdldCgpIHsKLQkJcmV0dXJuIGNvcmVDb250ZW50UGtnOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU3RyaW5nIG5hbWU7Ci0JCQlJTGlicmFyeUl0ZW1Qcm92aWRlciBjaGlsZDsKLQotCQkJLy8gZmluZCBjb3JlIGNvbnRlbnQgcGFja2FnZQotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkJbW9kZWxTdHJ1Y3QuY29yZUNvbnRlbnRQYXRoKTsKLQkJCWNvcmVDb250ZW50UGtnID0gY29udGVudFBrZzsKLQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9NZXRob2RDb250ZW50X2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljaGlsZCA9IG5ldyBNZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCWNvbnRlbnRQa2csIG5hbWUpOwotCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZXNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBEaXNjaXBsaW5lQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3QuZG9tYWluUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IERvbWFpbnNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIGNvbnRlbnRQa2csCi0JCQkJLy8gbmFtZSk7Ci0JCQkJLy8gY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCQkJCS8vIGNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJLy8gZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQkvLyB9Ci0JCQkJLy8JCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC53b3JrUHJvZHVjdFR5cGVQYXRoKTsKLQkJCQkvLyBpZihjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkvLyBuYW1lID0KLQkJCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIik7Ci0JCQkJLy8gY2hpbGQgPSBuZXcgV29ya1Byb2R1Y3RUeXBlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkvLyBjb250ZW50UGtnLCBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQkJCQkvLwkgICAgICAgIAotCQkJCS8vIGNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJLy8gbW9kZWxTdHJ1Y3Qucm9sZVNldFBhdGgpOwotCQkJCS8vIGlmKGNvbnRlbnRQa2cgIT0gbnVsbCkgewotCQkJCS8vIG5hbWUgPQotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpOwotCQkJCS8vIGNoaWxkID0gbmV3IFJvbGVTZXRzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBjb250ZW50UGtnLAotCQkJCS8vIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCQkJCS8vCSAgICAgICAgCi0JCQkJLy8gY29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkvLyBtb2RlbFN0cnVjdC50b29sUGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfVG9vbHNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBUb29sc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgY29udGVudFBrZywKLQkJCQkvLyBuYW1lKTsKLQkJCQkvLyBjaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkvLyBncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQkJCS8vIH0KLQotCQkJCS8vIGNyZWF0ZSB0aGUgc3RhbmRhcmQgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCQljb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQkJbW9kZWxTdHJ1Y3Quc3RhbmRhcmRDYXRlZ29yeVBhdGgpOwotCQkJCWlmIChjb250ZW50UGtnICE9IG51bGwpIHsKLQkJCQkJbmFtZSA9IExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQljaGlsZCA9IG5ldyBTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkJCQkJY29udGVudFBrZywgbmFtZSk7Ci0JCQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJZ3JvdXBJdGVtUHJvdmlkZXJNYXAucHV0KG5hbWUsIGNoaWxkKTsKLQkJCQl9Ci0KLQkJCQkvLyBjcmVhdGUgdGhlIGN1c3RvbWUgY2F0ZWdvcmllcyBmb2xkZXIKLQkJCQkvLyBjb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCS8vIG1vZGVsU3RydWN0LmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQkJLy8gaWYoY29udGVudFBrZyAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZSA9Ci0JCQkJLy8gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tX0NhdGVnb3JpZXNfZ3JvdXAiKTsKLQkJCQkvLyBjaGlsZCA9IG5ldyBDdXN0b21DYXRlZ29yaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkJCS8vIGNvbnRlbnRQa2csIG5hbWUpOwotCQkJCS8vIGNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJCQkvLyBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0JCQkJLy8gfQotCi0JCQkJQ3VzdG9tQ2F0ZWdvcnkgcm9vdEN1c3RvbUNhdGVnb3J5ID0gVG5nVXRpbAotCQkJCQkJLmdldFJvb3RDdXN0b21DYXRlZ29yeShwbHVnaW4pOwotCQkJCWlmIChyb290Q3VzdG9tQ2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIG5vdGlmeSA9IHJvb3RDdXN0b21DYXRlZ29yeS5lRGVsaXZlcigpOwotCQkJCQl0cnkgewotCQkJCQkJcm9vdEN1c3RvbUNhdGVnb3J5LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJCXJvb3RDdXN0b21DYXRlZ29yeS5zZXROYW1lKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJcm9vdEN1c3RvbUNhdGVnb3J5LmVTZXREZWxpdmVyKG5vdGlmeSk7Ci0JCQkJCX0KLQkJCQkJY2hpbGRyZW4uYWRkKHJvb3RDdXN0b21DYXRlZ29yeSk7Ci0JCQkJfQotCi0JCQkJLy8gSUNvbmZpZ3VyYWJsZSBhZGFwdGVyID0gKElDb25maWd1cmFibGUpCi0JCQkJLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KGNvbnRlbnRQa2csCi0JCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkvLyBhZGFwdGVyLnNldExhYmVsKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX01ldGhvZENvbnRlbnRfZ3JvdXAiKSk7Ci0JCQkJLy8gY2hpbGRyZW4uYWRkKGNvbnRlbnRQa2cpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29udGVudCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSUdyb3VwQ29udGFpbmVyI2dldEdyb3VwSXRlbVByb3ZpZGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRHcm91cEl0ZW1Qcm92aWRlcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ3JvdXBJdGVtUHJvdmlkZXJNYXAgIT0gbnVsbCA/IGdyb3VwSXRlbVByb3ZpZGVyTWFwLmdldChuYW1lKQotCQkJCTogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsCi0JCQlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4sIE9iamVjdCBzaWJsaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGdyb3VwSXRlbVByb3ZpZGVyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdyb3VwSXRlbVByb3ZpZGVyTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkJKChJRGlzcG9zYWJsZSkgYWRhcHRlcikuZGlzcG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwLmNsZWFyKCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcCA9IG51bGw7Ci0JCX0KLQkJaWYoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJfQotCQlwbHVnaW4gPSBudWxsOwotCQljb3JlQ29udGVudFBrZyA9IG51bGw7Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxZmE3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBkZWxpdmVyeSBwcm9jZXNzIGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCi0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM4ZWVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVJlZmVyZW5jZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JU3RhdGVmdWxJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5icmVha2Rvd25lbGVtZW50LkFjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuYnJlYWtkb3duZWxlbWVudC5NaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LkRpc2NpcGxpbmVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Eb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0Q2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5Sb2xlU2V0SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuVG9vbEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LldvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50LkNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5lbGVtZW50Lkd1aWRhbmNlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Sb2xlSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5TZWN0aW9uSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5UYXNrSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuZWxlbWVudC5Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZhY3RvcnkgZm9yIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJUmVmZXJlbmNlciB7Ci0KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RJdGVtUHJvdmlkZXIgbXlBcnRpZmFjdEl0ZW1Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBHdWlkYW5jZUl0ZW1Qcm92aWRlciBndWlkYW5jZUl0ZW1Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciBteU91dGNvbWVJdGVtUHJvdmlkZXI7Ci0KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFJlZmVyZW5jZXMgdG8gc3RhdGVmdWwgYWRhcHRlcnMgY3JlYXRlZCBieSB0aGlzIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXByb3RlY3RlZCBTZXQgZGlzcG9zYWJsZUFkYXB0ZXJzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8vIHByb3RlY3RlZCBDb2xsZWN0aW9uIGFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2FkYXB0KG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQobm90aWZpZXIsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElTdGF0ZWZ1bEl0ZW1Qcm92aWRlcgotCQkJCSYmIG5vdGlmaWVyIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCSYmICgoRU9iamVjdCkgbm90aWZpZXIpLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlkaXNwb3NhYmxlQWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvcmVjb250ZW50QWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlpZiAocm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29yZWNvbnRlbnRBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCWlmICh0YXNrSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tJdGVtUHJvdmlkZXIgPSBuZXcgVGFza0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YXNrSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLldvcmtwcm9kdWN0c0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFydGlmYWN0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlpZiAobXlBcnRpZmFjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteUFydGlmYWN0SXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG15QXJ0aWZhY3RJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RBZGFwdGVyKCkgewotCQlpZiAod29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJd29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLldvcmtwcm9kdWN0c0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJhYmxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlpZiAobXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlci5jcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Xb3JrcHJvZHVjdHNBZGFwdGVyRmFjdG9yeSNjcmVhdGVPdXRjb21lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKSB7Ci0JCWlmIChteU91dGNvbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbXlPdXRjb21lSXRlbVByb3ZpZGVyID0gbmV3IFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBzdXBlci5jcmVhdGVPdXRjb21lQWRhcHRlcigpKTsKLQkJfQotCi0JCXJldHVybiBteU91dGNvbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uQWRhcHRlcigpIHsKLQkJaWYgKG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVNZXRob2RMaWJyYXJ5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpCi0JICovCi0JLyoKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXI7Ci0JfQotCSovCi0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgYWRhcHRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCWFkYXB0ZXIuc2V0TW9kZWxTdHJ1Y3R1cmUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVCk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWV0aG9kbW9kZWxzQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWV0aG9kbW9kZWxzQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVDYXRlZ29yeUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURvbWFpbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCWlmIChkb21haW5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZG9tYWluSXRlbVByb3ZpZGVyID0gbmV3IERvbWFpbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkb21haW5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEdyb3VwaW5nQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFJvbGVTZXRDYXRlZ29yeUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50Y2F0ZWdvcmllc0FkYXB0ZXJGYWN0b3J5I2NyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lQWRhcHRlcigpIHsKLQkJLy8gaWYgKGRpc2NpcGxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkvLyBkaXNjaXBsaW5lSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIH0KLQkJLy8KLQkJLy8gcmV0dXJuIGRpc2NpcGxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudGNhdGVnb3JpZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlU2V0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZVNldEFkYXB0ZXIoKSB7Ci0JCS8vIGlmIChyb2xlU2V0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJLy8gcm9sZVNldEl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiByb2xlU2V0SXRlbVByb3ZpZGVyOwotCi0JCUFkYXB0ZXIgYWRhcHRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQkvLyBhZGFwdGVycy5hZGQoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Db250ZW50Y2F0ZWdvcmllc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRvb2xBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUb29sQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFRvb2xJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCS8vIGFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkNvbnRlbnRjYXRlZ29yaWVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gbmV3IFdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gYWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFBZGFwdGVyRmFjdG9yeSNjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpIHsKLQkJaWYgKGd1aWRhbmNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWd1aWRhbmNlSXRlbVByb3ZpZGVyID0gbmV3IEd1aWRhbmNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBndWlkYW5jZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDb25jZXB0QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uY2VwdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zCi0JICogICAgICBBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW5nTWV0cmljQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVFeGFtcGxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcmFjdGljZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcmFjdGljZUl0ZW1Qcm92aWRlciA9IG5ldyBQcmFjdGljZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCQlyZXR1cm4gcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJlcG9ydEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlY2huaXF1ZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlY2huaXF1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVdvcmtQcm9kdWN0R3VpZGVsaW5lQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZWN0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3Rpb25JdGVtUHJvdmlkZXIgPSBuZXcgU2VjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDdXN0b21DYXRlZ29yeUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQkvLyBpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCS8vIHdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgPSBuZXcgV2hpdGVwYXBlckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQotCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgPSBuZXcgQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVHdWlkYW5jZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlpZiAobWlsZXN0b25lSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1pbGVzdG9uZUl0ZW1Qcm92aWRlciA9IG5ldyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIG1pbGVzdG9uZUl0ZW1Qcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChndWlkYW5jZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlndWlkYW5jZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlndWlkYW5jZUl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKG15QXJ0aWZhY3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbXlBcnRpZmFjdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCQlteUFydGlmYWN0SXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCQlpZiAobXlEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlteURlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCW15RGVsaXZlcmFibGVJdGVtUHJvdmlkZXIgPSBudWxsOwotCQl9Ci0JCWlmIChteU91dGNvbWVJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJbXlPdXRjb21lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCW15T3V0Y29tZUl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKHdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyID0gbnVsbDsKLQkJfQotCi0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoYWRhcHRlcnMpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBPYmplY3QgYWRhcHRlciA9IGl0ZXIubmV4dCgpOwotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJLy8gKChJRGlzcG9zYWJsZSlhZGFwdGVyKS5kaXNwb3NlKCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBhZGFwdGVycy5jbGVhcigpOwotCi0JCWlmICghZGlzcG9zYWJsZUFkYXB0ZXJzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGlzcG9zYWJsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlEaXNwb3NhYmxlIGFkYXB0ZXIgPSAoSURpc3Bvc2FibGUpIGl0ZXIubmV4dCgpOwotCQkJCWFkYXB0ZXIuZGlzcG9zZSgpOwotCQkJfQotCQkJZGlzcG9zYWJsZUFkYXB0ZXJzLmNsZWFyKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHJlZikgewotCQlyZXR1cm4gZGlzcG9zYWJsZUFkYXB0ZXJzLnJlbW92ZShyZWYpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlBcnJheUxpc3QgYWRhcHRlcnNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChkaXNwb3NhYmxlQWRhcHRlcnMpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIKLQkJCQkJJiYgYWRhcHRlci5nZXRUYXJnZXQoKSA9PSBudWxsKSB7Ci0JCQkJYWRhcHRlcnNUb1JlbW92ZS5hZGQoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNsZWFuVXAoKTogbnVtYmVyIG9mIGFkYXB0ZXJzIHRvIHJlbW92ZTogIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBhZGFwdGVyc1RvUmVtb3ZlLnNpemUoKSk7Ci0JCX0KLQkJZGlzcG9zYWJsZUFkYXB0ZXJzLnJlbW92ZUFsbChhZGFwdGVyc1RvUmVtb3ZlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVlNzkwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCUVPYmplY3QgbGliID0gKEVPYmplY3QpIHBhcmVudDsKLQkJCWlmIChsaWIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCU1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJLmdldEFkYXB0ZXIobGliLCBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRDb25maWd1cmF0aW9ucygpCi0JCQkJCTogbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RDb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNWE1NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlciBjb25maWd1cmF0aW9uczsKLQkKLQlwcm90ZWN0ZWQgUGx1Z2luVUlQYWNrYWdlQnVpbGRlciBwbHVnaW5Qa2dCdWlsZGVyOwotCQotCS8vcHJpdmF0ZSBQcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIgcHJvY0ZhbWlsaWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXBsdWdpblBrZ0J1aWxkZXIgPSBuZXcgUGx1Z2luVUlQYWNrYWdlQnVpbGRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWV0aG9kUGx1Z2luKCkpKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3Q8T2JqZWN0PiBjaGlsZHJlbjsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgJiYgIVBsdWdpblVJUGFja2FnZUNvbnRleHQuSU5TVEFOQ0UuaXNGbGF0TGF5b3V0KCkpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQlMaXN0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9IGdldE1ldGhvZFBsdWdpbnMoKE1ldGhvZExpYnJhcnkpb2JqZWN0KTsKLQkJCWFkZENoaWxkcmVuKGNoaWxkcmVuLCBwbHVnaW5zLCBvYmplY3QpOwotCQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJfSBlbHNlIHsgCi0JCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQkJY2hpbGRyZW4gPSAoTGlzdCkgY29sbGVjdGlvbjsKLQkJCX0gZWxzZSB7Ci0JCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oY29sbGVjdGlvbik7Ci0JCQl9Ci0JCQkvLyBzZXQgcGFyZW50cwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChpdGVyLm5leHQoKSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuLCBDb21wYXJhdG9ycy5QTFVHSU5QQUNLQUdFX0NPTVBBUkFUT1IpOwotCQl9Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9ucyA9IG5ldyBDb25maWd1cmF0aW9uc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKE1ldGhvZExpYnJhcnkpIG9iamVjdCwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29uZmlndXJhdGlvbnNfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNoaWxkcmVuLmFkZChjb25maWd1cmF0aW9ucyk7Ci0KLQkJLy8gUmVtb3ZlICdQcm9jZXNzIEZhbWlsaWVzJyB1bnRpbCBpdCBpcyBmdWxseSBpbXBsZW1lbnRlZAotCQkvLwotCQkvLyBpZihwcm9jRmFtaWxpZXMgPT0gbnVsbCkgewotCQkvLyBwcm9jRmFtaWxpZXMgPSBuZXcgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LAotCQkvLyAoTWV0aG9kTGlicmFyeSkgb2JqZWN0LAotCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWxpZXNfdGV4dCIpKTsKLQkJLy8gfQotCQkvLyBjaGlsZHJlbi5hZGQocHJvY0ZhbWlsaWVzKTsKLQkJCi0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlbihDb2xsZWN0aW9uPE9iamVjdD4gY2hpbGRyZW4sIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zLAotCQkJT2JqZWN0IHBhcmVudCkgewotCQlwbHVnaW5Qa2dCdWlsZGVyLmFkZENoaWxkcmVuKGNoaWxkcmVuLCBwbHVnaW5zLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW5zKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlMaXN0PE1ldGhvZFBsdWdpbj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJRUxpc3Q8RU9iamVjdD4gZWxlbWVudHMgPSBsaWJyYXJ5LmVDb250ZW50cygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChFT2JqZWN0IGVsZW1lbnQgOiBlbGVtZW50cykgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCWl0ZW1zLmFkZCgoTWV0aG9kUGx1Z2luKWVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0KLQlwdWJsaWMgT2JqZWN0IGdldENvbmZpZ3VyYXRpb25zKCkgewotCQlyZXR1cm4gY29uZmlndXJhdGlvbnM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9jZXNzRmFtaWxpZXMoKSB7Ci0JCS8vcmV0dXJuIHByb2NGYW1pbGllczsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlQWRkQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLCBpbmRleCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25zICE9IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25zLmRpc3Bvc2UoKTsKLQkJCWNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHBsdWdpblBrZ0J1aWxkZXIgIT0gbnVsbCkgewotCQkJcGx1Z2luUGtnQnVpbGRlci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCS8qCi0JCWlmIChwcm9jRmFtaWxpZXMgIT0gbnVsbCkgewotCQkJcHJvY0ZhbWlsaWVzLmRpc3Bvc2UoKTsKLQkJCXByb2NGYW1pbGllcyA9IG51bGw7Ci0JCX0KLQkJKi8KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybiB0aGUgSXRlbVByb3ZpZGVyQWRhcHRlciBmb3IgdGhlIHBsdWdpbiAtIGVpdGhlciBhIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBvciBhIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuIG51bGwgaWYgbm9uZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJdGVtUHJvdmlkZXJBZGFwdGVyIGdldFBsdWdpbkl0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCVN0cmluZyBwbHVnaW5OYW1lID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJaW50IGRvdElkeCA9IHBsdWdpbk5hbWUKLQkJCQkuaW5kZXhPZihQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLlBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUik7Ci0JCWlmIChkb3RJZHggIT0gLTEpIHsKLQkJCVN0cmluZyBwYWNrYWdlUHJvdmlkZXJOYW1lID0gcGx1Z2luTmFtZS5zdWJzdHJpbmcoMCwgZG90SWR4KTsKLQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5Qa2dCdWlsZGVyCi0JCQkJCS5nZXRQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKHBhY2thZ2VQcm92aWRlck5hbWUpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcikgVG5nVXRpbC5nZXRBZGFwdGVyKHBsdWdpbiwKLQkJCQkJTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzNjQ2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9NZXRob2RQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiQ29udGVudCBQYWNrYWdlcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIHdpbGwgYmUgcmVuYW1lZCBhcyAiQ29udGVudFBhY2thZ2VzSXRlbVByb3ZpZGVyIiBpbiBFUEYgTTUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBhY2thZ2VzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZXNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlOb3RpZmllciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlQ29udGVudFBhY2thZ2UoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAobXNnLmdldE5vdGlmaWVyKCkgPT0gdGFyZ2V0KSB7Ci0JCQlpbnQgZmVhdHVyZUlkID0gbXNnLmdldEZlYXR1cmVJRChDb250ZW50UGFja2FnZS5jbGFzcyk7Ci0JCQlpZiAoZmVhdHVyZUlkID09IFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUykgewotCQkJCWJvb2xlYW4gbm90aWZ5ID0gZmFsc2U7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCQkJT2JqZWN0IG9iaiA9IG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlub3RpZnkgPSBhY2NlcHRBc0NoaWxkKG9iaik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJb2JqID0gbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCW5vdGlmeSA9IGFjY2VwdEFzQ2hpbGQob2JqKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uKSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJZm9yX2NoZWNrOiBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoaXRlci5uZXh0KCkpKSB7Ci0JCQkJCQkJbm90aWZ5ID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmb3JfY2hlY2s7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCWNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCWZvcl9jaGVjazogZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCWlmIChhY2NlcHRBc0NoaWxkKGl0ZXIubmV4dCgpKSkgewotCQkJCQkJCW5vdGlmeSA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZm9yX2NoZWNrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJCWlmIChub3RpZnkpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHRoaXMsIHRydWUsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjc2V0RGVmYXVsdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZSgKLQkJCQkJKChDb250ZW50UGFja2FnZSkgdGFyZ2V0KS5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05URU5UX1BBQ0tBR0UpOyAKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpCi0JICovCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIjZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkKLQkgKi8KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gQ29udGVudFBhY2thZ2UuY2xhc3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIHNvcnRpbmcgdGhlIGNvbnRlbnQgcGFja2FnZXMKLQkJLy8KLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuREVGQVVMVF9DT01QQVJBVE9SKTsKLQotCQkvLyBzZXQgcGFyZW50IGZvciBjaGlsZHJlbgotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChjaGlsZCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUxpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQob2JqZWN0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzY3MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUGx1Z2luVUlQYWNrYWdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlN0cnVjdHVyZWRNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIG1ldGhvZCBwbHVnLWluIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVN0YXRlZnVsSXRlbVByb3ZpZGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQotCXByb3RlY3RlZCBPYmplY3QgcGFyZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIEl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgb2JqZWN0OwotCi0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJU3RyaW5nIG5hbWUgPSBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfQ29udGVudF9ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCQlPYmplY3QgY2hpbGQgPSBuZXcgQ29udGVudEl0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgcGx1Z2luLAotCQkJCQlnZXRNb2RlbFN0cnVjdHVyZSgpKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCi0JCQluYW1lID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc2VzX2dyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoaWxkID0gbmV3IFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihhZGFwdGVyRmFjdG9yeSwgcGx1Z2luLAotCQkJCQlnZXRNb2RlbFN0cnVjdHVyZSgpKTsKLQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQlncm91cEl0ZW1Qcm92aWRlck1hcC5wdXQobmFtZSwgY2hpbGQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNoaWxkcmVuLmNsZWFyKCk7Ci0JCQljaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiAoKChNZXRob2RQbHVnaW4pIG9iamVjdCkuZ2V0VXNlckNoYW5nZWFibGUoKS5ib29sZWFuVmFsdWUoKSkgPyBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldEltYWdlKCJmdWxsL29iajE2L01ldGhvZFBsdWdpbiIpIDogLy8kTk9OLU5MUy0xJAotCQkJCVVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luX2dyZXkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBsdWdpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTkFNRToKLQkJCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCVRuZ1V0aWwucmVmcmVzaFBsdWdpbkV4dGVuZGVycyh0aGlzLCBub3RpZmljYXRpb24sIHRydWUsIHRydWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCQkKLQkJaWYgKChnZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpICYmICFQbHVnaW5VSVBhY2thZ2VDb250ZXh0LklOU1RBTkNFLmlzRmxhdExheW91dCgpKSB7Ci0JCQlTdHJpbmcgZGVsdGFOYW1lID0gUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5nZXROYW1lRGVsdGEoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpZ2V0UGFyZW50KCksIG9iamVjdCk7Ci0JCQlyZXR1cm4gZGVsdGFOYW1lOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQotCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlQnVpbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODg4NTI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JTGlicmFyeUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlBsdWdpblVJUGFja2FnZXNNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luVUlQYWNrYWdlQnVpbGRlciB7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXI+IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4oKTsKLQotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VCdWlsZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0JCi0JcHVibGljIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgZ2V0UGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcihTdHJpbmcgcGx1Z2luUGtnTmFtZSkgewotCQlyZXR1cm4gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChwbHVnaW5Qa2dOYW1lKTsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248T2JqZWN0PiBnZXRDaGlsZHJlbihDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlBcnJheUxpc3Q8T2JqZWN0PiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlhZGRDaGlsZHJlbihjaGlsZHJlbiwgcGx1Z2lucywgbnVsbCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoY2hpbGRyZW4sIENvbXBhcmF0b3JzLlBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXlOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGtleU5hbWUpKSB7Ci0JCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoa2V5TmFtZSk7Ci0JCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJcHJvdmlkZXIuZGlzcG9zZSgpOwotCQkJCX0KLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW4oQ29sbGVjdGlvbjxPYmplY3Q+IGNoaWxkcmVuLCBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucywgT2JqZWN0IHBhcmVudCkgewotCQlQbHVnaW5VSVBhY2thZ2VzTWFwIG1hcCA9IG5ldyBQbHVnaW5VSVBhY2thZ2VzTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gcGx1Z2lucy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQkJaW50IGRvdElkeCA9IHBsdWdpbk5hbWUuaW5kZXhPZihQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyLlBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUik7Ci0JCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQkJbWFwLmFkZChwbHVnaW5OYW1lLnN1YnN0cmluZygwLCBkb3RJZHgpLCBwbHVnaW4pOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBsdWdpbiwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJTGlicmFyeUl0ZW1Qcm92aWRlcikgewotCQkJCQkoKElMaWJyYXJ5SXRlbVByb3ZpZGVyKSBhZGFwdGVyKS5zZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+PiBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVNldDxNZXRob2RQbHVnaW4+IHBsdWdTZXQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQobmFtZSk7Ci0JCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkgewotCQkJCXByb3ZpZGVyID0gbmV3IFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksIG5hbWUsIHBsdWdTZXQpOwotCQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5wdXQobmFtZSwgcHJvdmlkZXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm92aWRlci5zZXRQbHVnaW5zKHBsdWdTZXQpOwotCQkJfQotCQkJZXhpc3RpbmdOYW1lcy5hZGQobmFtZSk7Ci0JCQlwcm92aWRlci5zZXRQYXJlbnQocGFyZW50KTsKLQkJCWNoaWxkcmVuLmFkZChwcm92aWRlcik7Ci0JCX0KLQkJcmV0YWluUGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzKGV4aXN0aW5nTmFtZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgIT0gbnVsbCkgewotCQkJcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmNsZWFyKCk7Ci0JCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmRjZjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1BsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklMaWJyYXJ5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlBsdWdpblVJUGFja2FnZXNNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLk1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBJdGVtIFByb3ZpZGVyIEFkYXB0ZXIgdGhhdCByZXByZXNlbnRzIGEgcGx1Z2luLXBhY2thZ2UuICBUaGlzIGlzIGEgVUkgZm9sZGVyIG9ubHkKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJTGlicmFyeUl0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCQotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2luczsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcj4gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyPigpOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdHJpbmcgcGFja2FnZU5hbWUsIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5uYW1lID0gcGFja2FnZU5hbWU7Ci0JCXRoaXMucGx1Z2lucyA9IHBsdWdpbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBvZiB0aGlzIEl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBuYW1lOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L3BhY2thZ2Vfb2JqIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lRGVsdGEoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciB0b3BPYmplY3QsIE9iamVjdCBib3R0b21PYmplY3QpIHsKLQkJCi0JCVN0cmluZyB0b3BOYW1lPSB0b3BPYmplY3QuZ2V0RnVsbE5hbWUoKTsKLQkJU3RyaW5nIGJvdHRvbU5hbWUgPSBudWxsOwotCQlpZiAoYm90dG9tT2JqZWN0IGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJYm90dG9tTmFtZSA9ICgoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcilib3R0b21PYmplY3QpLmdldEZ1bGxOYW1lKCk7Ci0JCQkKLQkJfSBlbHNlIGlmIChib3R0b21PYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWJvdHRvbU5hbWUgPSAoKE1ldGhvZFBsdWdpbilib3R0b21PYmplY3QpLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYoYm90dG9tTmFtZSA9PSBudWxsIHx8IHRvcE5hbWUuZXF1YWxzKGJvdHRvbU5hbWUpKQotCQkJcmV0dXJuIHRvcE5hbWU7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZGVsdGFuYW1lPSBib3R0b21OYW1lLnN1YnN0cmluZyh0b3BOYW1lLmxlbmd0aCgpKzEpOwotCQkJcmV0dXJuIGRlbHRhbmFtZTsKLQkJfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gYm90dG9tTmFtZTsKLQkJfQotCX0KLQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJcmV0dXJuIGFkZENoaWxkcmVuKHBsdWdpbnMpOwotCX0KLQkKLQlwcml2YXRlIENvbGxlY3Rpb248T2JqZWN0PiBhZGRDaGlsZHJlbihDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gcGx1Z2lucykgewotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlQbHVnaW5VSVBhY2thZ2VzTWFwIG1hcCA9IG5ldyBQbHVnaW5VSVBhY2thZ2VzTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gcGx1Z2lucy5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGRlbHRhTmFtZSA9IGdldE5hbWVEZWx0YSh0aGlzLCBwbHVnaW4pOwotCQkJaW50IGRvdElkeCA9IGRlbHRhTmFtZS5pbmRleE9mKFBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUik7Ci0JCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQkJbWFwLmFkZChkZWx0YU5hbWUuc3Vic3RyaW5nKDAsIGRvdElkeCksIHBsdWdpbik7Ci0JCQl9IGVsc2UgewotCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocGx1Z2luLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElMaWJyYXJ5SXRlbVByb3ZpZGVyKSB7Ci0JCQkJCSgoSUxpYnJhcnlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLnNldFBhcmVudCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU2V0PE1ldGhvZFBsdWdpbj4+PiBpdGVyID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeTxTdHJpbmcsIFNldDxNZXRob2RQbHVnaW4+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVNldDxNZXRob2RQbHVnaW4+IHBsdWdTZXQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5nZXQoZ2V0RnVsbE5hbWUoKSArIFBMVUdJTl9QQUNLQUdFX1NFUEFSQVRPUiArIG5hbWUpOwotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlwcm92aWRlciA9IG5ldyBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKGFkYXB0ZXJGYWN0b3J5LCBuYW1lLCBwbHVnU2V0KTsKLQkJCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAucHV0KGdldEZ1bGxOYW1lKCkgKyBQTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IgKyBuYW1lLCBwcm92aWRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXByb3ZpZGVyLnNldFBsdWdpbnMocGx1Z1NldCk7Ci0JCQl9Ci0JCQlleGlzdGluZ05hbWVzLmFkZChnZXRGdWxsTmFtZSgpICsgUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SICsgbmFtZSk7Ci0JCQlwcm92aWRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQljaGlsZHJlbi5hZGQocHJvdmlkZXIpOwotCQl9Ci0JCXJldGFpblBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVycyhleGlzdGluZ05hbWVzKTsKLQkJQ29sbGVjdGlvbnMuc29ydChjaGlsZHJlbiwgQ29tcGFyYXRvcnMuUExVR0lOUEFDS0FHRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotCQlTdHJpbmcgZnVsbE5hbWUgPSBnZXROYW1lKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQoKTsKLQkJd2hpbGUgKHBhcmVudCBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCWZ1bGxOYW1lID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBhcmVudCkuZ2V0TmFtZSgpICsgUExVR0lOX1BBQ0tBR0VfU0VQQVJBVE9SICsgZnVsbE5hbWU7Ci0JCQlwYXJlbnQgPSAoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpcGFyZW50KS5nZXRQYXJlbnQoKTsKLQkJfQotCQlyZXR1cm4gZnVsbE5hbWU7Ci0JCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJcmV0dXJuIHBhcmVudDsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE1ldGhvZFBsdWdpbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX05BTUU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCB0cnVlKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyByZW1vdmUgdGhpcyBmcm9tIHRoZSBwbHVnaW5zJyBhZGFwdGVyIGxpc3QKLQkJaWYgKHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCAhPSBudWxsKSB7Ci0JCQlwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuY2xlYXIoKTsKLQkJCXBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcCA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmV0YWluUGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzKENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcykgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IHBsdWdpblBhY2thZ2VzSXRlbVByb3ZpZGVyc01hcC5rZXlTZXQoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGtleU5hbWUgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghbmFtZXMuY29udGFpbnMoa2V5TmFtZSkpIHsKLQkJCQlQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gcGx1Z2luUGFja2FnZXNJdGVtUHJvdmlkZXJzTWFwLmdldChrZXlOYW1lKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlwcm92aWRlci5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBnZXRQbHVnaW5zKCkgewotCQlyZXR1cm4gcGx1Z2luczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQbHVnaW5zKENvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBwbHVnaW5zKSB7Ci0JCXRoaXMucGx1Z2lucyA9IHBsdWdpbnM7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuIHRoZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGZvciB0aGUgcGx1Z2luIC0gZWl0aGVyIGEgTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyIG9yIGEgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci4gbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0UGx1Z2luSXRlbVByb3ZpZGVyKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJU3RyaW5nIGRlbHRhTmFtZSA9IGdldE5hbWVEZWx0YSh0aGlzLCBwbHVnaW4pOwotCQlpbnQgZG90SWR4ID0gZGVsdGFOYW1lLmluZGV4T2YoUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlci5QTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IpOwotCQlpZiAoZG90SWR4ICE9IC0xKSB7Ci0JCQlTdHJpbmcgcGFja2FnZVByb3ZpZGVyTmFtZSA9IGRlbHRhTmFtZS5zdWJzdHJpbmcoMCwgZG90SWR4KTsKLQkJCWlmIChwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAgIT0gbnVsbCkgewotCQkJCVBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSBwbHVnaW5QYWNrYWdlc0l0ZW1Qcm92aWRlcnNNYXAuZ2V0KGdldEZ1bGxOYW1lKCkgKyBQTFVHSU5fUEFDS0FHRV9TRVBBUkFUT1IgKyBwYWNrYWdlUHJvdmlkZXJOYW1lKTsKLQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQkJfQotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuIChNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkuZ2V0QWRhcHRlcihwbHVnaW4sIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBpdGVtTmFtZSBuYW1lIG9mIGl0ZW0gdG8gZmluZAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gdGhlIE1ldGhvZFBsdWdpbiBvciBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBvciBudWxsIGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGZpbmRQbHVnaW5JdGVtUHJvdmlkZXIoU3RyaW5nIGl0ZW1OYW1lLCBNZXRob2RMaWJyYXJ5IGxpYikgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQobGliLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIpIHsKLQkJCU1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgbGlicmFyeUFkYXB0ZXIgPSAoTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcilhZGFwdGVyOwotCQkJTGlzdDxNZXRob2RQbHVnaW4+IHBsdWdpbkxpc3QgPSBsaWIuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJZm9yIChNZXRob2RQbHVnaW4gcGx1Z2luIDogcGx1Z2luTGlzdCkgewotCQkJCWlmIChpdGVtTmFtZS5lcXVhbHMocGx1Z2luLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHBsdWdpbjsKLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbjw/PiBjaGlsZHJlbiA9IGxpYnJhcnlBZGFwdGVyLmdldENoaWxkcmVuKGxpYik7Ci0JCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwbHVnaW5UcmVlQWRhcHRlciA9IGxpYnJhcnlBZGFwdGVyLmdldFBsdWdpbkl0ZW1Qcm92aWRlcihwbHVnaW4pOwotCQkJCXdoaWxlIChwbHVnaW5UcmVlQWRhcHRlciBpbnN0YW5jZW9mIFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJaWYgKGl0ZW1OYW1lLmVxdWFscygoKFBsdWdpblVJUGFja2FnZXNJdGVtUHJvdmlkZXIpcGx1Z2luVHJlZUFkYXB0ZXIpLmdldEZ1bGxOYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm4gcGx1Z2luVHJlZUFkYXB0ZXI7Ci0JCQkJCX0KLQkJCQkJY2hpbGRyZW4gPSBwbHVnaW5UcmVlQWRhcHRlci5nZXRDaGlsZHJlbihwbHVnaW5UcmVlQWRhcHRlcik7Ci0JCQkJCXBsdWdpblRyZWVBZGFwdGVyID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKXBsdWdpblRyZWVBZGFwdGVyKS5nZXRQbHVnaW5JdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZjU4NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJhY3RpY2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSURlZmF1bHROYW1lU2V0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRBZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5MaWJyYXJ5RWRpdENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSBwcmFjdGljZS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSURlZmF1bHROYW1lU2V0dGVyIHsKLQotCXB1YmxpYyBQcmFjdGljZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByYWN0aWNlSXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcmFjdGljZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJhY3RpY2VJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgcGFyZW50ID0gVG5nVXRpbAotCQkJCS5nZXROYXZpZ2F0b3JQYXJlbnRJdGVtUHJvdmlkZXIoKEd1aWRhbmNlKSBvYmplY3QpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0LCBnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCWlmICgoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0KS5nZXROb2RlaWNvbigpICE9IG51bGwpIHsKLQkJCQlVUkkgaW1nVXJpID0gVG5nVXRpbC5nZXRGdWxsUGF0aG9mTm9kZW9yU2hhcGVJY29uVVJJKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqZWN0LAotCQkJCQkJKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0Tm9kZWljb24oKSk7Ci0JCQkJT2JqZWN0IGltYWdlID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTaGFyZWRJbWFnZShpbWdVcmkpOwotCQkJCWlmIChpbWFnZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKHRoaXMsIG1zZyk7Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChtc2cpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJUHJhY3RpY2UgcHJhY3RpY2UgPSAoUHJhY3RpY2UpIGdldFBhcmVudChvYmopOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJhY3RpY2UpIHsKLQkJCVRuZ1V0aWwuc2V0RGVmYXVsdE5hbWUocHJhY3RpY2UuZ2V0U3ViUHJhY3RpY2VzKCksCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmosIExpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19QUkFDVElDRSk7IAotCQl9Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnRlcmVzdGVkRmVhdHVyZUlEKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgewotCQlyZXR1cm4gUHJhY3RpY2UuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRBZGRDb21tYW5kKChBZGRDb21tYW5kKSBzdXBlci5jcmVhdGVBZGRDb21tYW5kKAotCQkJCWRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24sIGluZGV4KSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDBmMWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgY29tcG9uZW50IGluIHRoZSBMaWJyYXJ5IHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gaWYoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfQnJlYWtkb3duRWxlbWVudHMoKSk7Ci0JCS8vIC8vCi0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX1dCUygpKTsKLQkJLy8gLy8KLQkJLy8gY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2VfT0JTKCkpOwotCQkvLyAvLwotCQkvLyBjaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9QQlMoKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fTkFNRToKLQkJCVByb2Nlc3NDb21wb25lbnQgcGMgPSAoUHJvY2Vzc0NvbXBvbmVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocGMuZ2V0UHJvY2VzcygpICE9IG51bGwpIHsKLQkJCQlib29sZWFuIG9sZCA9IHBjLmdldFByb2Nlc3MoKS5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCXBjLmdldFByb2Nlc3MoKS5zZXROYW1lKHBjLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKG9sZCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlUbmdVdGlsLnJlZnJlc2hQYXJlbnRJZk5hbWVDaGFuZ2VkKG5vdGlmaWNhdGlvbiwgdGhpcyk7Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmODA1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzRmFtaWxpZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIHRoZSAiUHJvY2VzcyBGYW1pbGllcyIgZm9sZGVyIGluIHRoZSBMaWJyYXJ5Ci0gKiB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyIGV4dGVuZHMgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlsaWVzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJTWV0aG9kTGlicmFyeSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NGYW1pbHkoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBvYmogaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlsaWVzIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlSUQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlciNzZXREZWZhdWx0TmFtZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NGYW1pbHkpCi0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoTWV0aG9kTGlicmFyeSkgdGFyZ2V0KQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19QUk9DRVNTX0ZBTUlMWSk7IAotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlUbmdVdGlsLnNldERlZmF1bHROYW1lKCgoTWV0aG9kTGlicmFyeSkgdGFyZ2V0KQotCQkJCQkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCksIChNZXRob2RFbGVtZW50KSBvYmosCi0JCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLk5FV19DT05GSUdVUkFUSU9OKTsgCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LlRyYW5zaWVudEdyb3VwSXRlbVByb3ZpZGVyI2dldEludGVyZXN0ZWRGZWF0dXJlQ2xhc3MoKQotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRJbnRlcmVzdGVkRmVhdHVyZU93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5LmNsYXNzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkzYmMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvbmF2aWdhdG9yL1Byb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciB0aGUgcHJvY2VzcyBmYW1pbHkgaW4gdGhlIExpYnJhcnkgdmlldy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJRU9iamVjdCBsaWIgPSAoRU9iamVjdCkgc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIobGliLCBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFByb2Nlc3NGYW1pbGllcygpIDogbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0ZhbWlseV90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2MGMzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLlVuZXhlY3V0YWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVN0YXRlZnVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSVByb2Nlc3NJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHByb2Nlc3MgcGFja2FnZSBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciwgSVN0YXRlZnVsSXRlbVByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBFQ2xhc3MgcHJvY2Vzc1R5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQotCXByaXZhdGUgT2JqZWN0IHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1R5cGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NDb21wb25lbnQoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpCi0JCQkJCSYmIChjaGlsZCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCS5hZGFwdChjaGlsZCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAocHJvY2Vzc1R5cGUgIT0gbnVsbCkKLQkJCQkJaXRlbVByb3ZpZGVyLnNldFByb2Nlc3NUeXBlKHByb2Nlc3NUeXBlKTsKLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoKExpc3QpIGNoaWxkcmVuLCBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQYWNrYWdlQ29tcGFyYXRvcigpKTsKLQotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsYWJlbDsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWwob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJRUNsYXNzIHByb2NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJaWYgKHByb2NUeXBlICE9IG51bGwpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbAotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzZXNJdGVtUHJvdmlkZXIpIHsKLQkJCQlpZiAocHJvY1R5cGUKLQkJCQkJCS5lcXVhbHMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSkpCi0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVsc2UgaWYgKHByb2NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzUGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzVHlwZShFQ2xhc3MgcHJvY2Vzc1R5cGUpIHsKLQkJdGhpcy5wcm9jZXNzVHlwZSA9IHByb2Nlc3NUeXBlOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZCgpIik7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiBuZXcgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQoZG9tYWluLCBvd25lciwgZmVhdHVyZSwKLQkJCQkJdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uLCB0aGlzKTsKLQkJfQotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlQ3JlYXRlQ2hpbGRDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLAotCQkvLyBpbmRleCwgY29sbGVjdGlvbik7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudENyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLAotCQkJCXZhbHVlLCBpbmRleCwgY29sbGVjdGlvbiwgdGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJRUNsYXNzIHByb2Nlc3NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJCWlmIChwcm9jZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX3RleHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV90eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJRUNsYXNzIHByb2Nlc3NUeXBlID0gZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJCWlmIChwcm9jZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpKSB7Ci0JCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgaWYgKHByb2Nlc3NUeXBlLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2VzcygpKSkgewotCQkJCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAocHJvY2Vzc1R5cGUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSB7Ci0JCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUFkZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uLCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlQWRkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24sIGludCBpbmRleCkgewotCQlDb2xsZWN0aW9uIHNlbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJLy8gY2hlY2sgdG8gZXhjbHVkZSBhbnkgcGFzdGVkLWluIHBhY2thZ2UgdGhhdCBjb250YWlucwotCQkJCS8vIHByb2Nlc3Mgb2YgZGlmZmVyZW50IHR5cGUgdGhhbiB0aGF0IG9mIHRoaXMgcGFja2FnZQotCQkJCS8vCi0JCQkJaWYgKCFQcm9jZXNzVXRpbC5oYXNQcm9jZXNzTm90T2ZUeXBlKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCXByb2Nlc3NUeXBlKSkgewotCQkJCQlzZWxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0JCX0KLQotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlQWRkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCBjb2xsZWN0aW9uLAotCQkvLyBpbmRleCk7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgc2VsZWN0aW9uLCBpbmRleCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGZlYXR1cmVDaGFuZ2VkKEVPYmplY3Qgb2JqZWN0LAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJCSYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpIHsKLQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkJCQkJaWYgKHByb2MgIT0gbnVsbCkgewotCQkJCQkJcHJvYy5zZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gcGFyZW50OwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCVRuZ1V0aWwucmVmcmVzaFBhcmVudElmTmFtZUNoYW5nZWQobm90aWZpY2F0aW9uLCB0aGlzKTsKLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvUHJvY2Vzc2VzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhZDgxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9Qcm9jZXNzZXNJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgdGhlICJQcm9jZXNzZXMiIGZvbGRlciBpbiB0aGUgTGlicmFyeSB2aWV3LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzZXNJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3Nlc0l0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19DT05UUklCVVRJT05TX0xBQkVMID0gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCS5nZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29udHJpYnV0aW9uc190ZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc0NvbnRyaWJ1dGlvbnNQYWNrYWdlOwotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgY2FwYWJpbGl0eVBhdHRlcm5QYWNrYWdlOwotCXByaXZhdGUgUHJvY2Vzc1BhY2thZ2UgZGVsaXZlcnlQcm9jZXNzUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFByb2Nlc3Nlc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE1vZGVsU3RydWN0dXJlIG1vZGVsU3RydWN0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBtb2RlbFN0cnVjdCk7Ci0JCXRoaXMucGx1Z2luID0gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSBwa2cgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCW1vZGVsU3RydWN0LmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQljYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UgPSBwa2c7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChwa2csCi0JCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJYWRhcHRlci5zZXRQcm9jZXNzVHlwZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJuKCkpOwotCQkJCWFkYXB0ZXIuc2V0TGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybnNfdGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkYXB0ZXIuc2V0UGFyZW50KHRoaXMpOwotCQkJCWNoaWxkcmVuLmFkZChwa2cpOwotCQkJfQotCQkJcGtnID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwKLQkJCQkJLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgbW9kZWxTdHJ1Y3QuZGVsaXZlcnlQcm9jZXNzUGF0aCk7Ci0JCQlkZWxpdmVyeVByb2Nlc3NQYWNrYWdlID0gZGVsaXZlcnlQcm9jZXNzUGFja2FnZTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIFRuZ1V0aWwKLQkJCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLmFkYXB0KHBrZywKLQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlhZGFwdGVyLnNldFByb2Nlc3NUeXBlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzKCkpOwotCQkJCWFkYXB0ZXIuc2V0TGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3Nlc190ZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCQkJYWRhcHRlci5zZXRQYXJlbnQodGhpcyk7Ci0JCQkJY2hpbGRyZW4uYWRkKHBrZyk7Ci0JCQl9Ci0KLQkJCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uRW5hYmxlZCkgewotCQkJCWNoaWxkcmVuLmFkZChnZXRQcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UoKSk7Ci0JCQl9Ci0KLQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCS8vIFN0cmluZyBuYW1lID0KLQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1BsYW5uaW5nVGVtcGxhdGVzX2dyb3VwIik7Ci0JCQkvLyBPYmplY3QgY2hpbGQgPSBuZXcgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIoYWRhcHRlckZhY3RvcnksCi0JCQkvLyBwbHVnaW4sIG5hbWUpOwotCQkJLy8gY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCS8vIGdyb3VwSXRlbVByb3ZpZGVyTWFwLnB1dChuYW1lLCBjaGlsZCk7Ci0KLQkJCS8vIGNvbW1lbnQgb3V0IHRoZSBwbGFubmluZyB0ZW1wbGF0ZXMgZm9yIFRORyByZWxlYXNlIG9uZSBhdAotCQkJLy8gMjAwNS0wNS0wOQotCQkJLy8gcGtnID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UpCi0JCQkvLyBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCS8vIG1vZGVsU3RydWN0LnByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCk7Ci0JCQkvLyBpZihwa2cgPT0gbnVsbCkgewotCQkJLy8gcGtnID0KLQkJCS8vIE1vZGVsU3RydWN0dXJlLmNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGFja2FnZShwbHVnaW4pOwotCQkJLy8gfQotCQkJLy8gYWRhcHRlciA9IChQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcikKLQkJCS8vIFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KS5hZGFwdChwa2csCi0JCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gYWRhcHRlci5zZXRQcm9jZXNzVHlwZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKTsKLQkJCS8vIGFkYXB0ZXIuc2V0TGFiZWwoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdUZW1wbGF0ZXNfdGV4dCIpKTsKLQkJCS8vIGNoaWxkcmVuLmFkZChwa2cpOwotCi0JCX0gZWxzZSB7Ci0JCQlpZiAocHJvY2Vzc0NvbnRyaWJ1dGlvbkVuYWJsZWQpIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBnZXRQcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UoKTsKLQkJCQlpZiAoIWNoaWxkcmVuLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKHBrZyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBnZXRQcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UoKTsKLQkJCQljaGlsZHJlbi5yZW1vdmUocGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3NQYWNrYWdlIGdldFByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSgpIHsKLQkJaWYgKHByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSkgVW1hVXRpbAotCQkJCQkuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQkJCW1vZGVsU3RydWN0LnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJCWlmIChwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UgPT0gbnVsbCkgewotCQkJCXByb2Nlc3NDb250cmlidXRpb25zUGFja2FnZSA9IE1vZGVsU3RydWN0dXJlCi0JCQkJCQkuY3JlYXRlUHJvY2Vzc0NvbnRyaWJ1dGlvblBhY2thZ2UocGx1Z2luKTsKLQkJCX0KLQkJCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCS5hZGFwdChwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2UsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWFkYXB0ZXIuc2V0TGFiZWwoUFJPQ0VTU19DT05UUklCVVRJT05TX0xBQkVMKTsKLQkJCWFkYXB0ZXIuc2V0UGFyZW50KHRoaXMpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzQ29udHJpYnV0aW9uc1BhY2thZ2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBnZXRDYXBhYmlsaXR5UGF0dGVyblBhY2thZ2UoKSB7Ci0JCXJldHVybiBjYXBhYmlsaXR5UGF0dGVyblBhY2thZ2U7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBnZXREZWxpdmVyeVByb2Nlc3NQYWNrYWdlKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzUGFja2FnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L25hdmlnYXRvci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YWUzNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9uYXZpZ2F0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMgaW4gdGhlIExpYnJhcnkgdmlldy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQ2OGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3ZTQxNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci0KLS8qKgotICogSXRlbSBwcm92aWRlciBmb3IgYWN0aXZpdHkgdXNlZCBieSBjb25maWd1cmF0aW9uIHZpZXcgYW5kIGZpbHRlciBkaWFsb2cuIFRoaXMgaXRlbSBwcm92aWRlciByZXR1cm4KLSAqIGNoaWxkcmVuIGxpc3QgdGhhdCBjb250YWluIG9ubHkgaXRzIG93biBhY3Rpdml0aWVzIGFmdGVyIHJlYWxpemF0aW9uIGFnYWluc3Qgc2VsZWN0ZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMzAsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEVDbGFzc2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiBjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2Jhc2ljU2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBiYXNpY1NldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNzZXRSb2xsZWRVcChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYikgewotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9BY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmZDE5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIoQWN0aXZpdHkgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcihBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWN0aXZpdHksIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoZ2V0UmVmcmVzaEVsZW1lbnQobm90aWZpY2F0aW9uKSA9PSBnZXREZWxlZ2F0ZVZhbHVlKCkpIHsKLQkJCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQkJUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJLmFkYXB0KHByb2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCWlmIChpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZCh0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCWJvb2xlYW4gb2xkUm9sbGVkVXAgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCQkJCW9sZFJvbGxlZFVwID0gaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKTsKLQkJCQlpZihpc1JvbGxlZFVwKCkgIT0gb2xkUm9sbGVkVXApIHsKLQkJCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuYmFzaWNTZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGlzUm9sbGVkVXAoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWl0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihpdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCS8vIHJlc3RvcmUgcm9sbGVkLXVwIGZsYWcKLQkJCQkvLwotCQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuYmFzaWNTZXRSb2xsZWRVcChvbGRSb2xsZWRVcCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAob2xkUm9sbGVkVXApOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldERlbGVnYXRpbmdJdGVtUHJvdmlkZXIoKXsKLQkJcmV0dXJuIGRlbGVnYXRlSXRlbVByb3ZpZGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KG9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMzRhNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkFjdGl2aXR5QWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuR3JhcGhpY2FsRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5BY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhY3Rpdml0eSdzIGl0ZW0gcHJvdmlkZXJzIHVzZWQgYnkgdGhlIFByb2Nlc3MgRWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVByb2Nlc3NJdGVtUHJvdmlkZXIsIElCU0l0ZW1Qcm92aWRlciwKLQkJSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIsIElDb25maWd1cmFibGUsIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQlwcml2YXRlIGludCBpZDsKLQotCXByb3RlY3RlZCBPYmplY3QgdG9wSXRlbSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcm9sbGVkVXA7Ci0KLQlwcml2YXRlIEdyYXBoaWNhbERhdGEgZ3JhcGhpY2FsRGF0YTsKLQotCXByaXZhdGUgUHJlZGVjZXNzb3JMaXN0IHByZWRlY2Vzc29yczsKLQotCXByaXZhdGUgQm9vbGVhbiBleHBhbmRlZDsKLQotCXByb3RlY3RlZCBBZGFwdGVyIGJhc2VMaXN0ZW5lcjsKLQotCXByaXZhdGUgSUZpbHRlciBjaGlsZEZpbHRlciA9IG5ldyBJRmlsdGVyKCkgewotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gYWNjZXB0QXNDaGlsZChvYmopOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hBbGxJRHNSZXF1aXJlZDsKLQotCXByaXZhdGUgSUZpbHRlciBmaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZWRDaGlsZHJlbjsKLQotCXByb3RlY3RlZCBMaXN0IGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSBjb250cmlidXRlZFdyYXBwZXJzOwotCi0JcHJpdmF0ZSBWYXJpYWJpbGl0eUluZm8gdmFyaWFiaWxpdHlJbmZvOwotCQotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVWYXJpYWJpbGl0eUluZm8gPSB0cnVlOwotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIHJvbGxlZFVwV3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGJhc2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlFT2JqZWN0IGN1cnJlbnRCYXNlID0gKEVPYmplY3QpIGJhc2VMaXN0ZW5lci5nZXRUYXJnZXQoKTsKLQkJCWlmKGN1cnJlbnRCYXNlICE9IG51bGwpIHsKLQkJCQljdXJyZW50QmFzZS5lQWRhcHRlcnMoKS5yZW1vdmUoYmFzZUxpc3RlbmVyKTsKLQkJCX0KLQkJCWlmIChnZXRUYXJnZXQoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBnZXRUYXJnZXQoKTsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQliYXNlLmVBZGFwdGVycygpLnJlbW92ZShiYXNlTGlzdGVuZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwcmVkZWNlc3NvcnMgIT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzLmRpc3Bvc2UoKTsKLQkJfQotCi0JCWlmKGNhY2hlZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuLmNsZWFyKCk7Ci0JCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmKGNvbnRyaWJ1dGVkV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJY29udHJpYnV0ZWRXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCQljb250cmlidXRlZFdyYXBwZXJzID0gbnVsbDsKLQkJfQotCQkKLQkJaWYocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJCXJvbGxlZFVwV3JhcHBlcnMgPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgY2FuIGJlIGFjY2VwdGVkIGFzIGEgY2hpbGQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmlsdGVyLmFjY2VwdChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgY2FuIGJlIGFjY2VwdGVkIGFzIGEgcm9sbGVkLXVwIGNoaWxkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzUm9sbGVkVXBDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiAhKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJJiYgIShjaGlsZCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSkgewotCQkJcmV0dXJuIGZpbHRlci5hY2NlcHQoY2hpbGQpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0b3IgKGUuZzogYQotCSAqIFRhc2tEZXNjcmlwdG9yIGlzIGFzc29jaWF0ZWQgd2l0aCBhIFRhc2spLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXROZXdDaGlsZERlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QsIEVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJLy8gZGlzYWxsb3cgY3JlYXRpbmcgbmV3IGNoaWxkIGlmIHRoaXMgaXRlbSBwcm92aWRlciBpcyByb2xsZWQgdXAKLQkJLy8KLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldE5ld0NoaWxkRGVzY3JpcHRvcnMob2JqZWN0LCBlZGl0aW5nRG9tYWluLCBzaWJsaW5nKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIGlmKGlzVG9wQWN0aXZpdHkob2JqZWN0KSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCkpKTsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCQkvLyB9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0V4cGFuZGVkKCkKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBpc0V4cGFuZGVkKCkgewotCQlyZXR1cm4gZXhwYW5kZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRFeHBhbmRlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cGFuZGVkKEJvb2xlYW4gYikgewotCQlleHBhbmRlZCA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIGludCBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0VG9wSXRlbSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb3BJdGVtKCkgewotCQlpZiAodG9wSXRlbSA9PSBudWxsKSB7Ci0JCQlpZihQcm9jZXNzVXRpbC5pc1RvcFByb2Nlc3ModGFyZ2V0KSkgewotCQkJCXJldHVybiB0YXJnZXQ7Ci0JCQl9Ci0JCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KHRhcmdldCk7Ci0JCQlpZihwYXJlbnQgIT0gbnVsbCkgewotCQkJCU9iamVjdCBpcCA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZihpcCBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGlwOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgdG9wID0gYWRhcHRlci5nZXRUb3BJdGVtKCk7Ci0JCQkJCQlpZiAodG9wID09IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcwotCQkJCQkJCQkmJiAoKFByb2Nlc3MpIHBhcmVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQkJCXRvcCA9IHBhcmVudDsKLQkJCQkJCQlhZGFwdGVyLnNldFRvcEl0ZW0odG9wKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiB0b3A7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRvcEl0ZW07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRJZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVG9wQWN0aXZpdHkoT2JqZWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqZWN0OwotCQlPYmplY3QgcGFyZW50ID0gZU9iai5lQ29udGFpbmVyKCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gKFByb2Nlc3NDb21wb25lbnQpIHBhcmVudDsKLQkJCXJldHVybiBvYmplY3QgPT0gcGMuZ2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBoYXNDaGlsZERlc2NyaXB0b3IoQWN0aXZpdHkgYWN0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbkZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFBhcmVudEZvcihPYmplY3QgY2hpbGQsIE9iamVjdCBwYXJlbnQpIHsKLQkJUHJvY2Vzc1V0aWwuc2V0UGFyZW50KGNoaWxkLCBwYXJlbnQsIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLS8vCXByaXZhdGUgQ29sbGVjdGlvbiBnZXREaXJlY3RDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0vLwkJTGlzdCBteUNoaWxkcmVuOwotLy8JCUNoaWxkcmVuU3RvcmUgc3RvcmUgPSBnZXRDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0vLwkJaWYgKHN0b3JlICE9IG51bGwpIHsKLS8vCQkJbXlDaGlsZHJlbiA9IHN0b3JlLmdldENoaWxkcmVuKCk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJLy8gc3RvcmUgPSBjcmVhdGVDaGlsZHJlblN0b3JlKG9iamVjdCk7Ci0vLwkJCUxpc3QgcmVzdWx0ID0gc3RvcmUgIT0gbnVsbCA/IG51bGwgOiBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0vLwotLy8JCQlmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCkuaXRlcmF0b3IoKTsgaQotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGkubmV4dCgpOwotLy8JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsJCQkJCQotLy8JCQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgZU9iamVjdC5lR2V0KGZlYXR1cmUpOwotLy8JCQkJCQotLy8vLwkJCQkJLy9DaGFuZ2UgZm9yIEFjdGl2aXR5IFZhcmlhYmlsaXR5LiBUbyBkbyByZWFsaXphdGlvbiBmb3IKLS8vLy8JCQkJCS8vQnJvd3NpbmcgYW5kIFB1Ymxpc2hpbmcuCi0vLy8vCQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotLy8vLwkJCQkJaWYoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcil7Ci0vLy8vCQkJCQkJY2hpbGRyZW4uYWRkQWxsKCgoSUNvbmZpZ3VyYXRvcilmaWx0ZXIpLmdldENoaWxkcmVuKG9iamVjdCwgZmVhdHVyZSkpOwotLy8vLwkJCQkJfQotLy8vLwkJCQkJZWxzZXsKLS8vLy8JCQkJCQljaGlsZHJlbiA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0vLy8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJaW50IGluZGV4ID0gMDsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGNpID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2kuaGFzTmV4dCgpOyBpbmRleCsrKSB7Ci0vLwkJCQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLS8vCQkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0vLwkJCQkJCQljaGlsZCA9IHdyYXAoZU9iamVjdCwgZmVhdHVyZSwgY2hpbGQsIGluZGV4KTsKLS8vCQkJCQkJCXNldFBhcmVudEZvcihjaGlsZCwgb2JqZWN0KTsKLS8vCQkJCQkJCS8vIElCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikKLS8vCQkJCQkJCS8vIGdldEJlc3RBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGNoaWxkLAotLy8JCQkJCQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCQkJCQkJCS8vIGFkYXB0ZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotLy8JCQkJCQkJaWYgKHN0b3JlICE9IG51bGwpIHsKLS8vCQkJCQkJCQlzdG9yZS5nZXRMaXN0KGZlYXR1cmUpLmFkZChjaGlsZCk7Ci0vLwkJCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotLy8JCQkJCQkJfQotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlPYmplY3QgY2hpbGQgPSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0vLwkJCQkJaWYgKGFjY2VwdEFzQ2hpbGQoY2hpbGQpKSB7Ci0vLwkJCQkJCWNoaWxkID0gd3JhcChlT2JqZWN0LCBmZWF0dXJlLCBjaGlsZCwKLS8vCQkJCQkJCQlDb21tYW5kUGFyYW1ldGVyLk5PX0lOREVYKTsKLS8vCQkJCQkJc2V0UGFyZW50Rm9yKGNoaWxkLCBvYmplY3QpOwotLy8JCQkJCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpCi0vLwkJCQkJCS8vIGdldEJlc3RBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGNoaWxkLAotLy8JCQkJCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotLy8JCQkJCQkvLyBhZGFwdGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLS8vCi0vLwkJCQkJCWlmIChzdG9yZSAhPSBudWxsKSB7Ci0vLwkJCQkJCQlzdG9yZS5zZXRWYWx1ZShmZWF0dXJlLCBjaGlsZCk7Ci0vLwkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlteUNoaWxkcmVuID0gc3RvcmUgIT0gbnVsbCA/IHN0b3JlLmdldENoaWxkcmVuKCkgOiByZXN1bHQ7Ci0vLwkJfQotLy8JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBhZGRJbmhlcml0ZWQob2JqZWN0LCBteUNoaWxkcmVuKTsKLS8vCQlyZXR1cm4gY2hpbGRyZW47Ci0vLwl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldEltbWVkaWF0ZUNoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoYWNjZXB0QXNDaGlsZChjaGlsZCkpIHsKLQkJCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCQljaGlsZCA9IGNvbmZpZ3VyYXRvci5yZXNvbHZlKGNoaWxkKTsKLQkJCQl9Ci0JCQkJaWYoY2hpbGQgIT0gbnVsbCAmJiAhY2hpbGRyZW4uY29udGFpbnMoY2hpbGQpKSB7Ci0JCQkJCXNldFBhcmVudEZvcihjaGlsZCwgb2JqZWN0KTsKLQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2hpbGRyZW4gPSBhZGRJbmhlcml0ZWQob2JqZWN0LCAoTGlzdCkgY2hpbGRyZW4pOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSb2xsZWRVcENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlBYnN0cmFjdFRyZWVJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKG9iamVjdCwgZmFsc2UpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzE1OTUzNzYyOTYxOTczNzM2OEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yOwotCQkJCQlib29sZWFuIGIgPSBhZGFwdGVyLmlzUm9sbGVkVXAoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFkYXB0ZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQlpdGVyYXRvciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKGIpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBpdGVyYXRvcjsKLQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkmJiAhKG9iamVjdCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcikpIHsKLQkJCQkJcmV0dXJuICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkKLQkJCQkJCQkuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IG9ubHkgb25lIGRlc2NyaXB0b3IgZm9yIGVhY2ggY29udGVudCBlbGVtZW50IGluIHRoZSByb2xsLXVwIGxpc3QKLQkJLy8KLQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoY2hpbGQpKSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJT2JqZWN0IGRlc2MgPSBmaW5kRGVzY3JpcHRvcihkZXNjcmlwdG9ycywgZSk7Ci0JCQkJCWlmKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJaWYoaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChjaGlsZCkpIHsKLQkJCQkJCQljaGlsZCA9IGNyZWF0ZVJvbGx1cFdyYXBwZXIoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJfQotCQkJCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCQkJCWRlc2NyaXB0b3JzLmFkZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZihpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKGNoaWxkKSkgewotCQkJCQkJCUNvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY29tcG9zZWRXcmFwcGVyID0gUHJvY2Vzc1V0aWwuZ2V0Q29tcG9zZWRXcmFwcGVyKGRlc2MpOwotCQkJCQkJCWlmKGNvbXBvc2VkV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQkJCWNvbXBvc2VkV3JhcHBlci5hZGRFbGVtZW50KGNoaWxkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWRlc2NyaXB0b3JzLmNsZWFyKCk7Ci0JCWRlc2NyaXB0b3JzID0gbnVsbDsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgd3JhcHBpbmcgb2YgdGhlIHNwZWNpZmllZCByb2xsdXAgZWxlbWVudCBpcyBuZWVkZWQuIElmIGl0J3MKLQkgKiBuZWVkZWQsIHRoZSBjYWxsZXIgd2lsbCB1c2UKLQkgKiB7QGxpbmsgI2NyZWF0ZVJvbGx1cFdyYXBwZXIoT2JqZWN0LCBPYmplY3QsIEFkYXB0ZXJGYWN0b3J5KX0gdG8gY3JlYXRlCi0JICogd3JhcHBlciBmb3IgdGhlIHJvbGx1cCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlQ29tcG9zZWRXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSb2xsdXBXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsJCQotCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBjcmVhdGVDb21wb3NlZFdyYXBwZXIob2JqZWN0LCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnJlYWRPbmx5ID0gdHJ1ZTsKLQkJd3JhcHBlci5pc1JvbGx1cENoaWxkID0gdHJ1ZTsKLQkJCi0JCWlmKHJvbGxlZFVwV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycyA9IG5ldyBEaXNwb3NhYmxlKCk7Ci0JCX0KLQkJcm9sbGVkVXBXcmFwcGVycy5hZGQod3JhcHBlcik7Ci0KLQkJcmV0dXJuIHdyYXBwZXI7IAkJCi0JfQkJCi0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRvR2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCXJldHVybiBnZXRSb2xsZWRVcENoaWxkcmVuKG9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0SW1tZWRpYXRlQ2hpbGRyZW4ob2JqZWN0KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQotCQkJLy9UT0RPOiByZW1vdmUgdGhlIGVuYWJsZVZhcmlhYmlsaXR5SW5mb0ZsYWcgYW5kICAKLQkJCS8vIGNyZWF0ZSBhbiBpbnRlcmZhY2Ugb3IgZG8gZGlmZmVyZW50bHkKLQkJCWlmKGVuYWJsZVZhcmlhYmlsaXR5SW5mbykKLQkJCQl2YXJpYWJpbGl0eUluZm8gPSBjb25maWd1cmF0b3IuZ2V0VmFyaWFiaWxpdHlJbmZvKGFjdGl2aXR5KTsKLQkJCWVsc2UgCi0JCQkJdmFyaWFiaWxpdHlJbmZvID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXZhcmlhYmlsaXR5SW5mbyA9IG51bGw7Ci0JCX0KLQkJaWYodmFyaWFiaWxpdHlJbmZvICE9IG51bGwpIHsKLQkJCU9iamVjdCByZXNvbHZlZCA9IHZhcmlhYmlsaXR5SW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5nZXQoMCk7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGlwID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHJlc29sdmVkLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwkJCQotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJCWJvb2xlYW4gYiA9IGlwLmlzUm9sbGVkVXAoKTsKLQkJCXRyeSB7Ci0JCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCWNoaWxkcmVuID0gaXAuZG9HZXRDaGlsZHJlbihyZXNvbHZlZCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpcC5iYXNpY1NldFJvbGxlZFVwKGIpOwotCQkJfQotCQkJaWYoIXZhcmlhYmlsaXR5SW5mby5nZXRDb250cmlidXRvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQlBcnJheUxpc3QgY29udHJpYnV0ZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YXJpYWJpbGl0eUluZm8uZ2V0Q29udHJpYnV0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQkJCU9iamVjdCBhZGFwdGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWlwID0gKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKWFkYXB0ZXIpOwotCQkJCQkJYiA9IGlwLmlzUm9sbGVkVXAoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaXAuYmFzaWNTZXRSb2xsZWRVcChpc1JvbGxlZFVwKCkpOwotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpcC5nZXRJbW1lZGlhdGVDaGlsZHJlbihlKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCWUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGUsIGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQkJCQlpZihlICE9IG51bGwgJiYgIVRuZ1V0aWwuY29udGFpbnMoY2hpbGRyZW4sIGUpKSB7Ci0JCQkJCQkJCQljb250cmlidXRlZENoaWxkcmVuLmFkZChlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWlwLmJhc2ljU2V0Um9sbGVkVXAoYik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIWNvbnRyaWJ1dGVkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbCh3cmFwQ29udHJpYnV0ZWQoYWN0aXZpdHksIGNvbnRyaWJ1dGVkQ2hpbGRyZW4pKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2hpbGRyZW47Ci0JCX0KLQkJcmV0dXJuIGRvR2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgewotLy8JCWlmKGlzUm9sbGVkVXAoKSkgewotLy8JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotLy8JCQl9Ci0vLwkJCWVsc2UgewotLy8JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4uY2xlYXIoKTsKLS8vCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQkJY2FjaGVkQ2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIjZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkgewotCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQlib29sZWFuIG9sZFJvbGxlZFVwID0gcm9sbGVkVXA7Ci0JCQl0cnkgewotCQkJCXJvbGxlZFVwID0gdHJ1ZTsKLQkJCQlnZXRDaGlsZHJlbih0YXJnZXQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcm9sbGVkVXAgPSBvbGRSb2xsZWRVcDsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JfQotCQotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZmluZFdyYXBwZXIoT2JqZWN0IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJLy8gZmluZCBpZiBhIHdyYXBwZXIgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGdpdmVuIHZhbHVlIGFuZCBvd25lcgotCQkvLwotCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHZhbHVlLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBudWxsOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJTGlzdCBsaXN0ZW5lcnMgPSAoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmaW5kX3dyYXBwZXJfbG9vcDogZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQ7Ci0JCQkJCQlpZiAod3JhcHBlci5nZXRWYWx1ZSgpID09IHZhbHVlCi0JCQkJCQkJCSYmIHdyYXBwZXIuZ2V0UGFyZW50KHZhbHVlKSA9PSBvd25lcikgewotCQkJCQkJCWJyZWFrIGZpbmRfd3JhcHBlcl9sb29wOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQl3cmFwcGVyID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQlwcml2YXRlIExpc3Qgd3JhcEluaGVyaXRlZChBY3Rpdml0eSBvd25lciwgQ29sbGVjdGlvbiBicmVha2Rvd25FbGVtZW50cykgewotCQlpZiAod3JhcHBlcnMgPT0gbnVsbCkgewotCQkJd3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQl9CQotCQlyZXR1cm4gd3JhcChvd25lciwgYnJlYWtkb3duRWxlbWVudHMsIHRydWUsIGZhbHNlLCB3cmFwcGVycyk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCB3cmFwQ29udHJpYnV0ZWQoQWN0aXZpdHkgb3duZXIsIENvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMpIHsKLQkJaWYoY29udHJpYnV0ZWRXcmFwcGVycyA9PSBudWxsKSB7Ci0JCQljb250cmlidXRlZFdyYXBwZXJzID0gbmV3IERpc3Bvc2FibGUoKTsKLQkJfQotCQlyZXR1cm4gd3JhcChvd25lciwgYnJlYWtkb3duRWxlbWVudHMsIGZhbHNlLCB0cnVlLCBjb250cmlidXRlZFdyYXBwZXJzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKSB7Ci0JCUlXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnlQcm92aWRlcikgewotCQkJZmFjdG9yeSA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5UHJvdmlkZXIpYWRhcHRlckZhY3RvcnkpLmdldFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5KCk7Ci0JCX0KLQkJaWYoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IHdyYXAoQWN0aXZpdHkgb3duZXIsIENvbGxlY3Rpb24gYnJlYWtkb3duRWxlbWVudHMsIGJvb2xlYW4gaW5oZXJpdGVkLCBib29sZWFuIGNvbnRyaWJ1dGVkLCBEaXNwb3NhYmxlIHdyYXBwZXJzKSB7Ci0JCUFycmF5TGlzdCB3cmFwcGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5IHdyYXBwZXJGYWN0b3J5ID0gZ2V0V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgdW5XcmFwcGVkID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCWlmICh1bldyYXBwZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIHVuV3JhcHBlZDsKLQkJCQlpZiAoIVRuZ1V0aWwuaXNCYXNlKG93bmVyLmdldEJyZWFrZG93bkVsZW1lbnRzKCksIGUpKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9IGdldFdyYXBwZXIob3duZXIsIGUsIHdyYXBwZXJzKTsKLQkJCQkJaWYoY2hpbGQgPT0gbnVsbCkgewotCQkJCQkJY2hpbGQgPSB3cmFwcGVyRmFjdG9yeS5jcmVhdGVXcmFwcGVyKGUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYmVXcmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBjaGlsZDsKLQkJCQkJCQlpZihpbmhlcml0ZWQpIHsKLQkJCQkJCQkJYmVXcmFwcGVyLmlzSW5oZXJpdGVkID0gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZihjb250cmlidXRlZCkgewotCQkJCQkJCQliZVdyYXBwZXIuY29udHJpYnV0ZWQgPSB0cnVlOwotCQkJCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkJCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KS5pc0luaGVyaXRlZCgpKSB7Ci0JCQkJCQkJCQliZVdyYXBwZXIuaXNJbmhlcml0ZWQgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJd3JhcHBlcnMucmVtb3ZlKGNoaWxkKTsKLQkJCQkJfQotCQkJCQl3cmFwcGVyTGlzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl3cmFwcGVycy5kaXNwb3NlKCk7Ci0JCXdyYXBwZXJzLmFkZEFsbCh3cmFwcGVyTGlzdCk7Ci0JCXJldHVybiB3cmFwcGVyTGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFdyYXBwZXIoQWN0aXZpdHkgb3duZXIsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ29sbGVjdGlvbiB3cmFwcGVycykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYod3JhcHBlci5nZXRPd25lcigpID09IG93bmVyICYmIHdyYXBwZXIuZ2V0VmFsdWUoKSA9PSBlKSB7Ci0JCQkJcmV0dXJuIHdyYXBwZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBBZGFwdGVyIGNyZWF0ZUJhc2VMaXN0ZW5lcigpIHsKLQkJaWYgKGJhc2VMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQliYXNlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCQkJLyoKLQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJICogCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJCSAqLwotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoZmluYWwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIudGhpcwotCQkJCQkJCS5nZXRUYXJnZXQoKTsKLQkJCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCQkJaWYgKFByb2Nlc3NVdGlsLmlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGFjdCkpIHsKLQkJCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBhY3QsIGZhbHNlLCB0cnVlKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX05BTUU6Ci0JCQkJCQlpZiAoYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbigKLQkJCQkJCQkJCW5vdGlmaWNhdGlvbiwgYWN0LCBmYWxzZSwgdHJ1ZSkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQUkVTU0VEOgotCQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQkJCWFjdCwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQkJYWN0LCB0cnVlLCB0cnVlKSk7Ci0JCQkJCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQkJCQlicmVhazsKLQotCQkJCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzogewotCQkJCQkJaWYoaGFuZGxlUmVwbGFjZUJyZWFrZG93bkVsZW1lbnQobm90aWZpY2F0aW9uKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJTGlzdCBsaXN0ID0gZ2V0QWZmZWN0ZWRDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCWJvb2xlYW4gdXBkYXRlTGFiZWwgPSByZWZyZXNoQ2hpbGRyZW5EYXRhKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBsaXN0KTsKLQotCQkJCQkJCS8vIGZvcndhcmQgbm90aWZpY2F0aW9uCi0JCQkJCQkJLy8KLQkJCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQkJCQkJbm90aWZpY2F0aW9uLCBhY3QsIHRydWUsIHVwZGF0ZUxhYmVsKSk7Ci0KLQkJCQkJCQkvLyBQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJCS8vIChQcm9jZXNzKSBnZXRUb3BJdGVtKCkpOwotCQkJCQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCQkJCX0KLQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlyZXR1cm4gYmFzZUxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBBY3Rpdml0eSBsaXN0ZW5Ub0Jhc2VBY3Rpdml0eSgpIHsKLQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSB0YXJnZXQ7Ci0JCWlmICghUHJvY2Vzc1V0aWwuaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoYWN0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQWN0aXZpdHkgYmFzZUFjdDsKLQkJaWYodmFyaWFiaWxpdHlJbmZvICE9IG51bGwpIHsKLQkJCWlmKHZhcmlhYmlsaXR5SW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5zaXplKCkgPiAxKSB7Ci0JCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgdmFyaWFiaWxpdHlJbmZvLmdldEluaGVyaXRhbmNlTGlzdCgpLmdldCgxKTsKLQkJCX0JCQkKLQkJCWVsc2UgewotCQkJCWJhc2VBY3QgPSAoQWN0aXZpdHkpIGNvbmZpZ3VyYXRvci5yZXNvbHZlKGFjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYmFzZUFjdCA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfQotCQlpZiAoYmFzZUFjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJY3JlYXRlQmFzZUxpc3RlbmVyKCk7Ci0JCQotCQkvLyByZW1vdmUgYmFzZUxpc3RlbmVyIGZyb20gb2xkIGJhc2UsIGlmIHRoZXJlIGlzIGFueQotCQkvLwotCQlFT2JqZWN0IG9sZEJhc2UgPSAoRU9iamVjdCkgYmFzZUxpc3RlbmVyLmdldFRhcmdldCgpOwotCQlpZihvbGRCYXNlICE9IG51bGwpIHsKLQkJCW9sZEJhc2UuZUFkYXB0ZXJzKCkucmVtb3ZlKGJhc2VMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCWlmICghYmFzZUFjdC5lQWRhcHRlcnMoKS5jb250YWlucyhiYXNlTGlzdGVuZXIpKSB7Ci0JCQliYXNlQWN0LmVBZGFwdGVycygpLmFkZChiYXNlTGlzdGVuZXIpOwotCQl9Ci0KLQkJT2JqZWN0IGlwID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoYmFzZUFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYoaXAgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgaXA7Ci0JCQlhZGFwdGVyLmxpc3RlblRvQmFzZUFjdGl2aXR5KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfQotCQlyZXR1cm4gYmFzZUFjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBhZGRJbmhlcml0ZWQoT2JqZWN0IG9iamVjdCwgTGlzdCBteUNoaWxkcmVuKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCQlBY3Rpdml0eSBiYXNlQWN0ID0gbGlzdGVuVG9CYXNlQWN0aXZpdHkoKTsKLQkJCWlmIChiYXNlQWN0ICE9IG51bGwpIHsKLQkJCQlWYXJpYWJpbGl0eVR5cGUgZXh0ZW5kVHlwZSA9IGFjdC5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlpZiAoZXh0ZW5kVHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCQkJcmV0dXJuIG15Q2hpbGRyZW47Ci0JCQkJfSBlbHNlIGlmIChleHRlbmRUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04KLQkJCQkJCXx8IGV4dGVuZFR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkuYWRhcHQoYmFzZUFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJTGlzdCBhbGxDaGlsZHJlbjsJCQkJCQotCQkJCQlib29sZWFuIG9sZFJvbGxlZFVwID0gYWRhcHRlci5pc1JvbGxlZFVwKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihvbGRSb2xsZWRVcCkgewotCQkJCQkJCWFkYXB0ZXIuYmFzaWNTZXRSb2xsZWRVcChmYWxzZSk7Ci0JCQkJCQl9Ci0JCQkJCQlhbGxDaGlsZHJlbiA9IHdyYXBJbmhlcml0ZWQoYWN0LCBhZGFwdGVyLmdldENoaWxkcmVuKGJhc2VBY3QpKTsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWlmKG9sZFJvbGxlZFVwKSB7Ci0JCQkJCQkJYWRhcHRlci5iYXNpY1NldFJvbGxlZFVwKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0vLwkJCQkJLy8gZ28gdGhydSBvd24gY2hpbGRyZW4gbGlzdCBhbmQgaW5zZXJ0IGl0IHRvIHRoZSBjb21iaW5lZAotLy8JCQkJCS8vIGNoaWxkIGxpc3QgYXQgdGhlIHJpZ2h0IHBsYWNlLgotLy8JCQkJCS8vCi0vLwkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbXlDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIKLS8vCQkJCQkJCQkubmV4dCgpOwotLy8JCQkJCQlUbmdVdGlsLmFkZFRvKGFsbENoaWxkcmVuLCBlbGVtZW50LCBvYmplY3QsIFRuZ1V0aWwKLS8vCQkJCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSk7Ci0vLwkJCQkJfQotCQkJCQlpZihhbGxDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybiBteUNoaWxkcmVuOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJVG5nVXRpbC5hZGRBbGxUbyhhbGxDaGlsZHJlbiwgbXlDaGlsZHJlbik7Ci0JCQkJCQlyZXR1cm4gYWxsQ2hpbGRyZW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG15Q2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0b3IgaW4gPGNvZGU+Y2hpbGRyZW48L2NvZGU+IHJlZmVycmluZyB0bwotCSAqIHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgc3BlY2lmaWVkIGRlc2NyaXB0b3IgPGNvZGU+Y2hpbGQ8L2NvZGU+IGRvZXMuCi0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiB0cnVlIGlmIG5vIGRlc2NyaXB0b3IgaXMgZm91bmQgaW4gdGhlIGNoaWxkcmVuIGxpc3QgdGhhdCByZWZlcnMKLQkgKiAgICAgICAgIHRvIHRoZSBzYW1lIG9iamVjdCBhcyB0aGUgc3BlY2lmaWVkIGNoaWxkIGRvZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiBmaW5kRGVzY3JpcHRvcihjaGlsZHJlbiwgY2hpbGQpID09IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgZmluZERlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBnZXRPYmplY3QoKERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKGNoaWxkKSk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlmb3IgKGludCBpID0gY2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvID0gY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKG9iaiA9PSBnZXRPYmplY3QoKERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKG8pKSkKLQkJCQlyZXR1cm4gbzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmQuSGVscGVyI2dldENyZWF0ZUNoaWxkSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlQ2hpbGRJbWFnZShPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyByZXR1cm4KLQkJLy8gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiZnVsbC9jdG9vbDE2L0NyZWF0ZUFjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5Iik7Ci0JCXJldHVybiBnZXRJbWFnZShjaGlsZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVJlbW92ZUNvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZVJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVSZW1vdmVDb21tYW5kKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0SXRlbVByb3ZpZGVyKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJQlNJdGVtUHJvdmlkZXIgZ2V0SXRlbVByb3ZpZGVyKEVPYmplY3QgZU9iaikgewotCQlyZXR1cm4gKElCU0l0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGVPYmosIElCU0l0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJcGFyZW50ID0gb2JqZWN0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlpZih0YXJnZXQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiAoKEFjdGl2aXR5KXRhcmdldCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIGNoaWxkcmVuIHRoYXQgaGFkIGJlZW4gYWZmZWN0ZWQgYWZ0ZXIgYSBhbiBBREQsIFJFTU9WRSwKLQkgKiBvciBNT1ZFIG9wZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBZmZlY3RlZENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldEFmZmVjdGVkRWxlbWVudHMobm90aWZpY2F0aW9uLCBjaGlsZEZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaENoaWxkcmVuRGF0YShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJTGlzdCBhZmZlY3RlZENoaWxkcmVuKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJTGlzdCBhZmZlY3RlZENoaWxkcmVuKSB7Ci0JCXJlZnJlc2hDaGlsZHJlbkRhdGEobm90aWZpY2F0aW9uLCBhZmZlY3RlZENoaWxkcmVuKTsKLQotCQlQcm9jZXNzIHRvcEFjdCA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKHJvb3RBZGFwdGVyRmFjdG9yeSwgdG9wQWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2hpbGRyZW4oZmluYWwgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCWZpbmFsIExpc3QgbmV3T3JPbGRDaGlsZHJlbikgewotCQlpZiAoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZG9SZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uLCBuZXdPck9sZENoaWxkcmVuKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkocnVubmFibGUsIGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KHJ1bm5hYmxlLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkgewotCi0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXJldHVybiBUbmdVdGlsLmhhbmRsZVByZWRlY2Vzc29yTGlzdENoYW5nZSh0aGlzLCBub3RpZmljYXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVSZXBsYWNlQnJlYWtkb3duRWxlbWVudChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUICYmIG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpICE9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKSB7Ci0JCQlpZihub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYoIUFzc29jaWF0aW9uSGVscGVyLmdldExpbmtUb1N1Y2Nlc3NvcihlKS5pc0VtcHR5KCkpIHsKLQkJCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKGFkYXB0ZXJGYWN0b3J5LCAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJZ2V0VGFyZ2V0KCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlpZiAoaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKG5vdGlmaWNhdGlvbikpCi0JCQlyZXR1cm47Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFjdGl2aXR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWlmKGhhbmRsZVJlcGxhY2VCcmVha2Rvd25FbGVtZW50KG5vdGlmaWNhdGlvbikpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlMaXN0IG5ld09yT2xkQ2hpbGRyZW4gPSBnZXRBZmZlY3RlZENoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCQlpZiAoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IobmV3T3JPbGRDaGlsZHJlbik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCQkvLyByZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uLCBuZXdPck9sZENoaWxkcmVuKTsKLQotCQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19TVVBQUkVTU0VEOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgdHJ1ZSkpOwotCi0JCQkvLyBQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCAoUHJvY2VzcykKLQkJCS8vIGdldFRvcEl0ZW0oKSk7Ci0KLQkJCXJlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdPck9sZENoaWxkcmVuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlT3JNb3ZlUGFja2FnZUZvcihMaXN0PD8+IG5ld0NoaWxkcmVuKSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgKChFT2JqZWN0KSB0YXJnZXQpLmVDb250YWluZXIoKTsKLQkJaWYocGtnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKE9iamVjdCBlbGVtZW50IDogbmV3Q2hpbGRyZW4pIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJaWYgKGFjdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkvLyBjcmVhdGUgbmV3IFByb2Nlc3NQYWNrYWdlIGZvciB0aGUgYWN0aXZpdHkKLQkJCQkJLy8KLQkJCQkJUHJvY2Vzc1BhY2thZ2UgbmV3UGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQkJbmV3UGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG5ld1BrZyk7Ci0JCQkJCW5ld1BrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBDaGVjayBpZiB0aGUgYWN0aXZpdHkncyBQcm9jZXNzUGFja2FnZSBpcyBhdCB0aGUgcmlnaHQKLQkJCQkJLy8gcGxhY2UuCi0JCQkJCS8vIElmIG5vdCwgbW92ZSBpdCB0byB0aGUgcmlnaHQgUHJvY2Vzc0NvbXBvbmVudC4KLQkJCQkJLy8KLQkJCQkJUHJvY2Vzc1BhY2thZ2Ugb2xkUGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpOwotCQkJCQlpZiAob2xkUGtnLmVDb250YWluZXIoKSAhPSBwa2cpIHsKLQkJCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG9sZFBrZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxCcmVha2Rvd25FbGVtZW50cyhTZXQgc2V0LCBCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJYm9vbGVhbiByZXQgPSBzZXQuYWRkKGUpOwotCQlpZiAocmV0ICYmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlKS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoc2V0LCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHByZWRlY2Vzc29yIElEcyBpbiB0aGUgdmlld2VyCi0JICogCi0JICogQHBhcmFtIGFmZmVjdGVkQnJlYWtkb3duRWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFByZWRlY2Vzc29ycyhOb3RpZmljYXRpb24gbXNnLAotCQkJTGlzdCBhZmZlY3RlZEJyZWFrZG93bkVsZW1lbnRzKSB7Ci0KLQkJU2V0IHJlZnJlc2hMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQkJU2V0IGFsbEJyZWFrZG93bkVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWZmZWN0ZWRCcmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCWlmIChtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRQotCQkJCQl8fCBtc2cuZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7Ci0JCQkJc2V0UGFyZW50Rm9yKGUsIG51bGwpOwotCQkJfQotCQkJZ2V0QWxsQnJlYWtkb3duRWxlbWVudHMoYWxsQnJlYWtkb3duRWxlbWVudHMsIGUpOwotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5yZWZyZXNoUHJlZGVjZXNzb3JzKCk6Ci0JCS8vIGFsbEJyZWFrZG93bkVsZW1lbnRzPSIrYWxsQnJlYWtkb3duRWxlbWVudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsQnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0TGlua1RvU3VjY2Vzc29yKAotCQkJCQllbGVtZW50KS5pdGVyYXRvcigpOyBpdGVyYXRvcjEuaGFzTmV4dCgpOykgewotCQkJCVdvcmtPcmRlciB3b3JrT3JkZXIgPSAoV29ya09yZGVyKSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCUJyZWFrZG93bkVsZW1lbnQgc3VjYyA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0U3VjY2Vzc29yKHdvcmtPcmRlcik7Ci0JCQkJaWYgKCFhbGxCcmVha2Rvd25FbGVtZW50cy5jb250YWlucyhzdWNjKSkgewotCQkJCQlyZWZyZXNoTGlzdC5hZGQoc3VjYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLnJlZnJlc2hQcmVkZWNlc3NvcnMoKToKLQkJLy8gcmVmcmVzaExpc3Q9IiArIHJlZnJlc2hMaXN0KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZyZXNoTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIGNoaWxkLCBmYWxzZSwgdHJ1ZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVBhY2thZ2VGb3IoQWN0aXZpdHkgYWN0aXZpdHksIEVPYmplY3QgcGFyZW50QWN0aXZpdHkpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnRBY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCVByb2Nlc3NQYWNrYWdlIG5ld1BrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCW5ld1BrZy5zZXROYW1lKGFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCXBhcmVudC5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG5ld1BrZyk7Ci0JCUFycmF5TGlzdCBicmVha2Rvd25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYnJlYWtkb3duRWxlbWVudHMuYWRkKGFjdGl2aXR5KTsKLQkJYnJlYWtkb3duRWxlbWVudHMuYWRkQWxsKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpOwotCQluZXdQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKGJyZWFrZG93bkVsZW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSAoKElDb2x1bW5Bd2FyZSkgcm9vdEFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQkJCWlmIChjb2x1bW5JbmRleFRvTmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcgSW50ZWdlcigKLQkJCQkJCWNvbHVtbkluZGV4KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBUbmdVdGlsLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0VG9wSXRlbShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcEl0ZW0oT2JqZWN0IHRvcCkgewotCQl0b3BJdGVtID0gdG9wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIHJvbGxlZFVwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQkJcm9sbGVkVXAgPSBiOwotCQlpZiAoIXJvbGxlZFVwKSB7Ci0JCQkvLyB1c2VyIHJvbGwgZG93biB0aGlzIGFjdGl2aXR5LCBzZXQgcm9sbGVkVXAgZmxhZyBvZiBhbGwgaXRzCi0JCQkvLyBvZmZzdHJpbmcgdG8gZmFsc2UKLQkJCS8vCi0JCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHRhcmdldCwgZmFsc2UpIHsKLQotCQkJCS8qKgotCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJICovCi0JCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTc4NDA2ODcyNjQ3NTM2NDAyNTBMOwotCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCXJldHVybiBhZGFwdGVyLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgY2hpbGQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCQkoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBHcmFwaGljYWxEYXRhIGdldEdyYXBoaWNhbERhdGEoKSB7Ci0JCXJldHVybiBncmFwaGljYWxEYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYXBoaWNhbERhdGEoR3JhcGhpY2FsRGF0YSBkYXRhKSB7Ci0JCWdyYXBoaWNhbERhdGEgPSBkYXRhOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHksIHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlBY3Rpdml0eSBlID0gKEFjdGl2aXR5KSBvYmplY3Q7Ci0JCVByb2Nlc3NVdGlsLnNldEF0dHJpYnV0ZShlLCBwcm9wLCB0eHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjcmVhdGVDcmVhdGVDaGlsZENvbW1hbmQob3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW4sCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCwKLQkgKiAgICAgIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCSgoSXRlcmF0aW9uKSB2YWx1ZSkuc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNyZWF0ZUNoaWxkQ29tbWFuZChkb21haW4sIG93bmVyLCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQlpbmRleCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIGNoYW5nZU5vdGlmaWVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzID0gbmV3IFByZWRlY2Vzc29yTGlzdChUbmdVdGlsCi0JCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpLCB0YXJnZXQpOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNGaXJzdEVsZW1lbnQoZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksIHRoaXMsIG9iaik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0xhc3RFbGVtZW50KGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLCB0aGlzLCBvYmopOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZVVwKChBY3Rpdml0eSkgcGFyZW50LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUFkZENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpdml0eUFkZENvbW1hbmQoKEFkZENvbW1hbmQpIHN1cGVyLmNyZWF0ZUFkZENvbW1hbmQoCi0JCQkJZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY29sbGVjdGlvbiwgaW5kZXgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRDaGlsZEZpbHRlcigpIHsKLQkJcmV0dXJuIGNoaWxkRmlsdGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZChib29sZWFuIGIpIHsKLQkJcmVmcmVzaEFsbElEc1JlcXVpcmVkID0gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2hBbGxJRHNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlZnJlc2hBbGxJRHNSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LklDb25maWd1cmFibGUjc2V0RmlsdGVyKGNvbS5pYm0ubGlicmFyeS5lZGl0LklGaWx0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQlpZihmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQljb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcilmaWx0ZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb25maWd1cmF0b3IgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhYmxlI3NldExhYmVsKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNjcmVhdGVEcm9wQ29tbWFuZChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS51dGlsLkxpc3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsCi0JCQlMaXN0IGRyb3BFbGVtZW50cykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYmFzaWNTZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQkJcm9sbGVkVXAgPSBiOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBlbmFibGVWYXJpYWJpbGl0eUluZm8KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZVZhcmlhYmlsaXR5SW5mbygpIHsKLQkJcmV0dXJuIGVuYWJsZVZhcmlhYmlsaXR5SW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZW5hYmxlVmFyaWFiaWxpdHlJbmZvIHRoZSBlbmFibGVWYXJpYWJpbGl0eUluZm8gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlVmFyaWFiaWxpdHlJbmZvKGJvb2xlYW4gZW5hYmxlVmFyaWFiaWxpdHlJbmZvKSB7Ci0JCXRoaXMuZW5hYmxlVmFyaWFiaWxpdHlJbmZvID0gZW5hYmxlVmFyaWFiaWxpdHlJbmZvOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIE1vdmVDb21tYW5kRXggZXh0ZW5kcyBNb3ZlQ29tbWFuZCBpbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQkJcHJpdmF0ZSBTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JCXB1YmxpYyBNb3ZlQ29tbWFuZEV4KEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JCX0JCQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJLy8gdHJhbnNsYXRlIHZpZXcgaW5kZXggdG8gaW5kZXggaW4gYnJlYWtkb3duIGVsZW1lbnRzIGxpc3QKLQkJCS8vCi0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIGdldENoaWxkcmVuKGdldFRhcmdldCgpKTsKLQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuLmdldChpbmRleCk7Ci0JCQlpbmRleCA9IG93bmVyTGlzdC5pbmRleE9mKGNoaWxkKTsKLQkJCWlmKGluZGV4ICE9IC0xKSB7Ci0JCQkJc3VwZXIuZG9FeGVjdXRlKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vVE9ETzogbW92ZSBpbiBiZXR3ZWVuIGdyZWVuIGVsZW1lbnRzCi0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCWlmKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG93bmVyLmVSZXNvdXJjZSgpOwotCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocmVzb3VyY2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZU1vdmVDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNb3ZlQ29tbWFuZEV4KGRvbWFpbiwgb3duZXIsIGZlYXR1cmUsIHZhbHVlLCBpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njg2MGY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5SZXNvdXJjZUF3YXJlRHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIEJhc2UgaXRlbSBwcm92aWRlciBmb3IgYWxsIGJyZWFrZG93biBlbGVtZW50cwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlQcm9jZXNzSXRlbVByb3ZpZGVyLCBJQlNJdGVtUHJvdmlkZXIsIElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLCBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBPYmplY3QgcGFyZW50OwotCi0JcHJpdmF0ZSBpbnQgaWQ7Ci0KLQlwcml2YXRlIE9iamVjdCB0b3BJdGVtOwotCi0JcHJpdmF0ZSBib29sZWFuIHJvbGxlZFVwOwotCi0JcHJpdmF0ZSBCb29sZWFuIGV4cGFuZGVkOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgcHJlZGVjZXNzb3JzOwotCi0JcHJvdGVjdGVkIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JCi0JcHJvdGVjdGVkIExpc3QgY2FjaGVkQ2hpbGRyZW47Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgIT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JzLmRpc3Bvc2UoKTsKLQkJfQotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGRlbGVnYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIGV4cGFuZGVkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0RXhwYW5kZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQkJZXhwYW5kZWQgPSBiOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KE9iamVjdCBvYmopIHsKLQkJcGFyZW50ID0gb2JqOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChCcmVha2Rvd25FbGVtZW50KW9iamVjdCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIGludCBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0SWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRUb3BJdGVtKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQodGFyZ2V0KTsKLQkJaWYgKHRvcEl0ZW0gPT0gbnVsbCAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCU9iamVjdCB0b3AgPSBhZGFwdGVyLmdldFRvcEl0ZW0oKTsKLQkJCQlpZiAodG9wID09IG51bGwgJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2VzcwotCQkJCQkJJiYgKChQcm9jZXNzKSBwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlhZGFwdGVyLnNldFRvcEl0ZW0odG9wKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRvcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdG9wSXRlbTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCQlpZiAocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQlNYXAgY29sdW1uSW5kZXhUb05hbWVNYXAgPSAoKElDb2x1bW5Bd2FyZSkgcm9vdEFkYXB0ZXJGYWN0b3J5KQotCQkJCQkuZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQkJCWlmIChjb2x1bW5JbmRleFRvTmFtZU1hcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcgSW50ZWdlcigKLQkJCQkJCWNvbHVtbkluZGV4KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCS8vIFN0cmluZyBjb2xOYW1lID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCQkvLyBJbnRlZ2VyKGNvbHVtbkluZGV4KSk7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBUbmdVdGlsLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkvLyBTdHJpbmcgY29sTmFtZSA9IChTdHJpbmcpIGNvbHVtbkluZGV4VG9OYW1lTWFwLmdldChuZXcKLQkJLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCQlTdHJpbmcgY29sTmFtZSA9IGdldENvbHVtbk5hbWUoY29sdW1uSW5kZXgpOwotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKG9iamVjdCwgY29sTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbChvYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0VG9wSXRlbShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcEl0ZW0oT2JqZWN0IHRvcCkgewotCQl0b3BJdGVtID0gdG9wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIHJvbGxlZFVwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQkJcm9sbGVkVXAgPSBiOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChqYXZhLnV0aWwuTWFwKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCS8vIGlmIChtYXAgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gY29sdW1uSW5kZXhUb05hbWVNYXAgPSBtYXA7Ci0JLy8gfQotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHksIHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBvYmplY3Q7Ci0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSkgewotCQkJZS5zZXROYW1lKHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWUuc2V0SXNFdmVudERyaXZlbihCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcpIHsKLQkJCWUuc2V0SXNPbmdvaW5nKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSkgewotCQkJZS5zZXRJc1JlcGVhdGFibGUoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGNoYW5nZU5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIGNoYW5nZU5vdGlmaWVyKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0UHJlZGVjZXNzb3JzKCkKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0IGdldFByZWRlY2Vzc29ycygpIHsKLQkJaWYgKHByZWRlY2Vzc29ycyA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvcnMgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KFRuZ1V0aWwKLQkJCQkJLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSksIHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5pc0ZpcnN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQotCQkvLyBPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJLy8gewotCQkvLyBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gTGlzdCBlbGVtZW50cyA9IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoYWN0aXZpdHksIG9iaik7Ci0JCS8vCQkJCi0JCS8vIC8vIGlmIGl0J3MgZmlyc3QgZWxlbWVudCwgcmV0dXJuIHRydWUKLQkJLy8gaWYgKGVsZW1lbnRzLmdldCgwKS5lcXVhbHMob2JqKSkKLQkJLy8gewotCQkvLyByZXR1cm4gdHJ1ZTsKLQkJLy8gfQotCQkvLyBlbHNlIHJldHVybiBmYWxzZTsKLQkJLy8gfQotCQkvLwkJCi0JCS8vIHJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGFzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuaXNMYXN0RWxlbWVudChnZXRSb290QWRhcHRlckZhY3RvcnkoKSwgdGhpcywgb2JqKTsKLQotCQkvLyBPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJLy8gewotCQkvLyBBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJLy8gTGlzdCBlbGVtZW50cyA9IGdldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoYWN0aXZpdHksIG9iaik7Ci0JCS8vCQkJCi0JCS8vIC8vIGlmIGl0J3MgbGFzdCBlbGVtZW50LCByZXR1cm4gdHJ1ZQotCQkvLyBpZiAoZWxlbWVudHMuZ2V0KGVsZW1lbnRzLnNpemUoKSAtIDEpLmVxdWFscyhvYmopKQotCQkvLyB7Ci0JCS8vIHJldHVybiB0cnVlOwotCQkvLyB9Ci0JCS8vIGVsc2UgcmV0dXJuIGZhbHNlOwotCQkvLyB9Ci0JCS8vCQkKLQkJLy8gcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVXAoT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudChvYmopOwotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQlUbmdVdGlsLm1vdmVVcCgoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQkvLyBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5EZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChkZWxlZ2F0ZUl0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVJdGVtUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqZWN0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKFRuZ1V0aWwuaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKHRoaXMsIG5vdGlmaWNhdGlvbikpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDaGlsZHJlbihOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLAotCQkJQ29sbGVjdGlvbiBuZXdPck9sZENoaWxkcmVuKSB7Ci0JCWlmICghbmV3T3JPbGRDaGlsZHJlbi5pc0VtcHR5KCkpIHsKLQkJCS8vIC8vIHJlY2FsY3VsYXRlIHRoZSBJRHMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIGFuZCByZWZyZXNoIHRoZW0KLQkJCS8vIC8vCi0JCQkvLyBBY3Rpdml0eSB0b3BBY3QgPSAoQWN0aXZpdHkpIGdldFRvcEl0ZW0oKTsKLQkJCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIG5ldwotCQkJLy8gQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoYWRhcHRlckZhY3RvcnksIHRvcEFjdCksIHRvcEFjdCk7Ci0KLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGNyZWF0ZURyb3BBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJZ2V0Q2hpbGRyZW4odGFyZ2V0KTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VBd2FyZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0JyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0YWI2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc1JvbGxlZFVwOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QgcHJlZGVjZXNzb3JzOwotCi0JcHJpdmF0ZSBCb29sZWFuIGV4cGFuZGVkOwotCQotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgbnVsbCwgQ29tbWFuZFBhcmFtZXRlci5OT19JTkRFWCwgYWRhcHRlckZhY3RvcnkpOwotCQlpZih2YWx1ZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB2YWx1ZTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJZmVhdHVyZSA9ICgoRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlKS5nZXRGZWF0dXJlKCk7Ci0JCQl9Ci0JCQlzZXRSZWFkT25seSh3cmFwcGVyLmlzUmVhZE9ubHkoKSk7Ci0JCQlzZXRSb2xsZWRVcCh3cmFwcGVyLmlzUm9sbHVwQ2hpbGQoKSk7Ci0JCQlpc0luaGVyaXRlZCA9IHdyYXBwZXIuaXNJbmhlcml0ZWQ7Ci0JCQljb250cmlidXRlZCA9IHdyYXBwZXIuY29udHJpYnV0ZWQ7Ci0JCX0JCQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihCcmVha2Rvd25FbGVtZW50IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRXhwYW5kZWQoKQotCSAqLwotCXB1YmxpYyBCb29sZWFuIGlzRXhwYW5kZWQoKSB7Ci0JCXJldHVybiBleHBhbmRlZDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI3NldEV4cGFuZGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKSB7Ci0JCWV4cGFuZGVkID0gYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzUm9sbGVkVXAoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9sbGVkVXAoKSB7Ci0JCXJldHVybiBpc1JvbGxlZFVwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQkJaXNSb2xsZWRVcCA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSwgdGhpcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHRleHRWYWx1ZSkgewotCQlQcm9jZXNzVXRpbC5zZXRBdHRyaWJ1dGUoKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpLAotCQkJCXByb3BlcnR5LCB0ZXh0VmFsdWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2RvQ3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgZG9DcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuICgoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyKQotCQkJCQkuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCWlmIChwcmVkZWNlc3NvcnMgPT0gbnVsbCkgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKHRoaXMpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJcHJlZGVjZXNzb3JzID0gbmV3IFByZWRlY2Vzc29yTGlzdChUbmdVdGlsCi0JCQkJCQkuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KSwgdGhpcyk7Ci0JCQl9IGVsc2UgewotCQkJCXByZWRlY2Vzc29ycyA9IFByZWRlY2Vzc29yTGlzdC5FTVBUWV9MSVNUOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgamF2YS5sYW5nLkNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBDb21tYW5kIGNyZWF0ZUNvbW1hbmQoT2JqZWN0IG9iamVjdCwgRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlDbGFzcyBjb21tYW5kQ2xhc3MsIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlci5jcmVhdGVDb21tYW5kKCk6Iik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG9iamVjdDogIiArIG9iamVjdCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbW1hbmRDbGFzczogIiArIGNvbW1hbmRDbGFzcyk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbW1hbmRQYXJhbWV0ZXI6ICIgKyBjb21tYW5kUGFyYW1ldGVyKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQob2JqZWN0LCBkb21haW4sIGNvbW1hbmRDbGFzcywKLQkJCQljb21tYW5kUGFyYW1ldGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyI2dldE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE5ld0NoaWxkRGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCwKLQkJCUVkaXRpbmdEb21haW4gZWRpdGluZ0RvbWFpbiwgT2JqZWN0IHNpYmxpbmcpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCi0JfQotCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocHJlZGVjZXNzb3JzICE9IG51bGwpIHsKLQkJCXByZWRlY2Vzc29ycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzk2Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQlwcml2YXRlIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWFkZEVsZW1lbnQodmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChPYmplY3QgZSkgewotCQlnZXRWYWx1ZXMoKS5hZGQoZSk7Ci0JfQotCQotCS8qKgotCSAqIERlY2lkZXMgaWYgdGhlIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgb2YgYWxsIGVsZW1lbnRzIGluIHRoaXMgY29tcG9zZWQgd3JhcHBlciBjYW4gYmUgbWVyZ2VkLgotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5NZXJnZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmKCF2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZihjYW5NZXJnZShwcm9wZXJ0eSkpIHsKLQkJCQlVbmlxdWVFTGlzdCBtb2RlbEluZm9zID0gbmV3IFVuaXF1ZUVMaXN0KCk7CQkJCQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGluZm87Ci0JCQkJCWlmKG8gaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWluZm8gPSAoKElCU0l0ZW1Qcm92aWRlcilvKS5nZXRBdHRyaWJ1dGUobywgcHJvcGVydHkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGlwID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQobywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCWluZm8gPSBpcC5nZXRBdHRyaWJ1dGUobywgcHJvcGVydHkpOwotCQkJCQl9Ci0JCQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoaW5mbykpIHsKLQkJCQkJCW1vZGVsSW5mb3MuYWRkKGluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKCFtb2RlbEluZm9zLmlzRW1wdHkoKSkgewotCQkJCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigoU3RyaW5nKW1vZGVsSW5mb3MuZ2V0KDApKTsKLQkJCQkJaW50IG1heCA9IG1vZGVsSW5mb3Muc2l6ZSgpOwotCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJCQltb2RlbEluZm8uYXBwZW5kKCcsJykuYXBwZW5kKG1vZGVsSW5mb3MuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbW9kZWxJbmZvLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSW5oZXJpdGVkKCkgewotCQlmb3IoaW50IGkgPSB2YWx1ZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvID0gdmFsdWVzLmdldChpKTsKLQkJCWlmKCEobyBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIAotCQkJCQl8fCAhKChEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW8pLmlzSW5oZXJpdGVkKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmE1OTFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiAyMywgMjAwNgotICogQHNpbmNlICA3LjAuMQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIExpc3Qgbm90aWZpZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQlpZih2YWx1ZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcil2YWx1ZSk7Ci0JCQlyZWFkT25seSA9IHdyYXBwZXIuaXNSZWFkT25seSgpOwotCQkJaXNJbmhlcml0ZWQgPSB3cmFwcGVyLmlzSW5oZXJpdGVkOwotCQl9Ci0JCWlzUm9sbHVwQ2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gdGhlIG5vdGlmaWVyIGxpc3Qgb2YgdGhpcyB3cmFwcGVyLiBUaGUgZ2l2ZW4gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkgKiBtdXN0IGJlIGxpbmtlZCB0byB0aGUgc2FtZSB3b3JrIHByb2R1Y3QgYXMgdGhlIGRlbGVnYXRlIHZhbHVlIGlzIAotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIG9yIGl0cyB3cmFwcGVyCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkV29ya1Byb2R1Y3REZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGVnYXRlV3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAoZ2V0RGVsZWdhdGVWYWx1ZSgpKTsKLQkJaWYoZGVsZWdhdGVXcGQgPT0gd3BkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJT2JqZWN0IHdwID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVsZWdhdGVXcGQpOwotCQlpZih3cCA9PSBudWxsIHx8IHdwID09IHdwZC5nZXRXb3JrUHJvZHVjdCgpKSB7Ci0JCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQod3BkLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElDaGFuZ2VOb3RpZmllcikKLQkJCXsKLQkJCQkoKElDaGFuZ2VOb3RpZmllcilpdGVtUHJvdmlkZXIpLmFkZExpc3RlbmVyKHRoaXMpOwotCQkJCWlmKG5vdGlmaWVycyA9PSBudWxsKSB7Ci0JCQkJCW5vdGlmaWVycyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQkJCX0KLQkJCQlub3RpZmllcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQl9Ci0JCX0JCi0JCQotCQlpZihpc0luaGVyaXRlZCAmJiBvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciAmJgotCQkJCSEoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNJbmhlcml0ZWQpIHsKLQkJCXRoaXMuaXNJbmhlcml0ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYobm90aWZpZXJzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5vdGlmaWVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIgPSAoSUNoYW5nZU5vdGlmaWVyKSBpdGVyLm5leHQoKTsKLQkJCQlub3RpZmllci5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCW5vdGlmaWVycy5jbGVhcigpOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmKG5vdGlmaWVycyAhPSBudWxsICYmIG5vdGlmaWVycy5jb250YWlucyhub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkpIHsKLQkJCXN3aXRjaChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WSU5HX0FEQVBURVI6Ci0JCQkJaWYobm90aWZpY2F0aW9uLmdldE9sZFZhbHVlKCkgPT0gdGhpcykgewotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgdGhpcywgZmFsc2UsIHRydWUpKTsJCQkJCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6Ci0JCQkJc3dpdGNoKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzKSkgewotCQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZCh3cmFwTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZihwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8gJiYgZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCVN0cmluZyBpbmZvID0gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsoaW5mbykpIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmZvLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJSGFzaFNldCBpbmZvU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlTdHJpbmdCdWZmZXIgaW5mb3MgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCk7Ci0JCQkJCWlmKGluZm9TZXQuYWRkKHRva2VuKSkgewotCQkJCQkJaW5mb3MuYXBwZW5kKHRva2VuKS5hcHBlbmQoJywnKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpbmZvcy5kZWxldGVDaGFyQXQoaW5mb3MubGVuZ3RoKCkgLSAxKTsKLQkJCQlpbmZvID0gaW5mb3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBpbmZvOwotCQl9Ci0JCWlmKG5vdGlmaWVycyAhPSBudWxsICYmICFub3RpZmllcnMuaXNFbXB0eSgpCi0JCQkJJiYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUgfHwgcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZyBzdHIgPSBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQlzdHJidWYuYXBwZW5kKHN0cik7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBub3RpZmllcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCQkJCXN0ciA9IGl0ZW1Qcm92aWRlci5nZXRBdHRyaWJ1dGUoaXRlbVByb3ZpZGVyLmdldFRhcmdldCgpLCBwcm9wZXJ0eSk7Ci0JCQkJaWYoIVN0clV0aWwuaXNCbGFuayhzdHIpKSB7Ci0JCQkJCWlmKHN0cmJ1Zi5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCXN0cmJ1Zi5hcHBlbmQoJywnKTsKLQkJCQkJfQotCQkJCQlzdHJidWYuYXBwZW5kKHN0cik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN0cmJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYWZhOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuR2VuZXJpY0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk9CU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5HZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkRlc2NyaXB0b3JJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbXBvc2l0ZVJvbGUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCURlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IG5ldyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIHZhbHVlLCBvYmplY3QsIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8gd3JhcHBlci5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCXJldHVybiB3cmFwcGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb21wb3NpdGVSb2xlIGNvbXBvc2l0ZVJvbGUgPSAoQ29tcG9zaXRlUm9sZSkgb2JqZWN0OwotCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JLy8gQ29sbGVjdGlvbiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21wb3NpdGVSb2xlLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gY2hpbGRyZW4uYWRkKG5ldwotCS8vIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoKERlc2NyaWJhYmxlRWxlbWVudCkgaXRlci5uZXh0KCksCi0JLy8gdGhpcywgYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgZmxvYXQsIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9CU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgY3JlYXRlRHJvcEFkYXB0ZXIoKSB7Ci0JCWlmIChkcm9wQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlkcm9wQWRhcHRlciA9IG5ldyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBkcm9wRWxlbWVudCkgewotCQkJCQlpZiAoZHJvcEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlCi0JCQkJCQkJJiYgISgoQ29tcG9zaXRlUm9sZSkgZ2V0VGFyZ2V0KCkpCi0JCQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCkuY29udGFpbnMoZHJvcEVsZW1lbnQpKSB7Ci0JCQkJCQlyZXR1cm4gZHJvcEVsZW1lbnQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCQl9Ci0JCXJldHVybiBkcm9wQWRhcHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Db21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDYyYmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0NvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVSb2xlV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyKENvbXBvc2l0ZVJvbGUgcm9sZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIocm9sZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0RlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIyYjEyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzM4MzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVGFibGVJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0KLS8qKgotICogV3JhcHBlciBpdGVtIHByb3ZpZGVyIGZvciBEZXNjcmlibGVFbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJQlNJdGVtUHJvdmlkZXIsCi0JCUlUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQotCXByaXZhdGUgaW50IGlkOwotCi0JcHJpdmF0ZSBPYmplY3QgdG9wSXRlbTsKLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRPbmx5ID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luaGVyaXRlZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRyaWJ1dGVkID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSb2xsdXBDaGlsZCA9IGZhbHNlOwotCQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKERlc2NyaWJhYmxlRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJdGhpcyh2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBpbmRleAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKERlc2NyaWJhYmxlRWxlbWVudCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0JCi0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhpcyB3cmFwcGVyIGlzIHJlYWQtb25seQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHJlYWRPbmx5Ci0JICogICAgICAgICAgICBUaGUgcmVhZE9ubHkgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwotCX0JCi0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250cmlidXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udHJpYnV0ZWQoKSB7Ci0JCXJldHVybiBjb250cmlidXRlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJcmV0dXJuIGlzSW5oZXJpdGVkOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGx1cENoaWxkKCkgewotCQlyZXR1cm4gaXNSb2xsdXBDaGlsZDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRJZCgpCi0JICovCi0JcHVibGljIGludCBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0SWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRQYXJlbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iaikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0VG9wSXRlbSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb3BJdGVtKCkgewotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG51bGwpOwotCQlpZiAodG9wSXRlbSA9PSBudWxsICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHRvcCA9IGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQkJCWlmICh0b3AgPT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBQcm9jZXNzCi0JCQkJCQkmJiAoKFByb2Nlc3MpIHBhcmVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQl0b3AgPSBwYXJlbnQ7Ci0JCQkJCWFkYXB0ZXIuc2V0VG9wSXRlbSh0b3ApOwotCQkJCX0KLQkJCQlyZXR1cm4gdG9wOwotCQkJfQotCQl9Ci0JCXJldHVybiB0b3BJdGVtOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0VG9wSXRlbShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcEl0ZW0oT2JqZWN0IHRvcCkgewotCQl0b3BJdGVtID0gdG9wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNSb2xsZWRVcCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsZWRVcCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0Um9sbGVkVXAoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsZWRVcChib29sZWFuIGIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2lzRmlyc3RFbGVtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdEVsZW1lbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNpc0xhc3RFbGVtZW50KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldEZpbHRlcmVkQnJlYWtkb3duRWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHlPYmosIE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNtb3ZlVXAoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjbW92ZURvd24oamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXIpCi0JICovCi0JcHVibGljIHZvaWQgbW92ZURvd24oT2JqZWN0IG9iaiwgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNnZXRFQ2xhc3NlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjZ2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlEZXNjcmliYWJsZUVsZW1lbnQgZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCXJldHVybiBlLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lEKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoaWQpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCVN0cmluZyBuYW1lID0gZS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5hbWUpKSB7Ci0JCQkJbmFtZSA9IGUuZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIHRleHRWYWx1ZSkgewotCi0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JLy8gKi8KLQkvLyBwdWJsaWMgdm9pZCBzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChNYXAgbWFwKSB7Ci0JLy8gaWYgKG1hcCAhPSBudWxsKQotCS8vIHsKLQkvLyBjb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQkvLyBjb2x1bW5JbmRleFRvTmFtZU1hcENoYW5nZWQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldFByZWRlY2Vzc29ycygpCi0JICovCi0JcHVibGljIFByZWRlY2Vzc29yTGlzdCBnZXRQcmVkZWNlc3NvcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjaXNFeHBhbmRlZCgpCi0JICovCi0JcHVibGljIEJvb2xlYW4gaXNFeHBhbmRlZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlciNzZXRFeHBhbmRlZChqYXZhLmxhbmcuQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChCb29sZWFuIGIpIHsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5EZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlciNjcmVhdGVXcmFwcGVyKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlXcmFwcGVySXRlbVByb3ZpZGVyIHdpcCA9IGRvQ3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYod2lwIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKERlc2NyaWJhYmxlRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHdpcDsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIERlbGVnYXRpbmdXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJd3JhcHBlci5mZWF0dXJlID0gKChEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcikgdmFsdWUpCi0JCQkJLmdldEZlYXR1cmUoKTsKLQkJCX0KLQkJCXdyYXBwZXIuc2V0UmVhZE9ubHkocmVhZE9ubHkpOwotCQkJd3JhcHBlci5pc1JvbGx1cENoaWxkID0gaXNSb2xsdXBDaGlsZDsKLQkJCXdyYXBwZXIuaXNJbmhlcml0ZWQgPSBpc0luaGVyaXRlZDsKLQkJCXdyYXBwZXIuY29udHJpYnV0ZWQgPSBpc0NvbnRyaWJ1dGVkKCk7Ci0JCX0JCQotCQlyZXR1cm4gd2lwOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgZG9DcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh2YWx1ZSk7Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBuZXcgRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXJldHVybiB3cmFwcGVyOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQlpZiAoZGVsZWdhdGVJdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBJVGFibGVJdGVtTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuICgoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIpIGRlbGVnYXRlSXRlbVByb3ZpZGVyKQotCQkJCQkuZ2V0Q29sdW1uSW1hZ2Uob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQkJaWYgKGNvbHVtbkluZGV4ID09IDAKLQkJCQkmJiBkZWxlZ2F0ZUl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElJdGVtTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuICgoSUl0ZW1MYWJlbFByb3ZpZGVyKSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikuZ2V0SW1hZ2Uob2JqZWN0KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJQWRhcHRlckZhY3Rvcnkgcm9vdEFkYXB0ZXJGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCWlmIChyb290QWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCU1hcCBjb2x1bW5JbmRleFRvTmFtZU1hcCA9ICgoSUNvbHVtbkF3YXJlKSByb290QWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpOwotCQkJaWYgKGNvbHVtbkluZGV4VG9OYW1lTWFwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldyBJbnRlZ2VyKAotCQkJCQkJY29sdW1uSW5kZXgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCS8vIFN0cmluZyBjb2xOYW1lID0gKFN0cmluZykgY29sdW1uSW5kZXhUb05hbWVNYXAuZ2V0KG5ldwotCQkvLyBJbnRlZ2VyKGNvbHVtbkluZGV4KSk7Ci0JCVN0cmluZyBjb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCk7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUob2JqZWN0LCBjb2xOYW1lKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2dldExpc3RlbmVycygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAoY2hhbmdlTm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdCkgY2hhbmdlTm90aWZpZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuSU1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCU9iamVjdCBvID0gVG5nVXRpbC51bndyYXAodGhpcyk7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpICsgIiAod3JhcHBlZCBvYmplY3Q6ICIgKyBvICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyN2YwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCU9iamVjdCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQkJT2JqZWN0IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQkvLyBsb29rIGZvciBleGlzdGluZyBkZXNjcmlwdG9yIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotCQkJCQkvLyBiYXNlIGluIHRoZSBhY3Rpdml0eQotCQkJCQkvLwotCQkJCQlPYmplY3QgcGFyZW50ID0gbnVsbDsKLQkJCQkJZm9yIChwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGwKLQkJCQkJCQkmJiAhKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KTspIHsKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkKLQkJCQkJCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlPYmplY3QgZGVzYyA9IG51bGw7Ci0JCQkJCQlmaW5kX2Rlc2NyaXB0b3JfbG9vcDogZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlcgotCQkJCQkJCQkuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRGVzY3JpcHRvcgotCQkJCQkJCQkJJiYgUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBjaGlsZCkgPT0gYmFzZSkgewotCQkJCQkJCQlkZXNjID0gY2hpbGQ7Ci0JCQkJCQkJCWJyZWFrIGZpbmRfZGVzY3JpcHRvcl9sb29wOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJCQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQkJCQkJc3RyID0gTGlicmFyeUVkaXRSZXNvdXJjZXMucHJvY2Vzc19leHRlbmRzOyAKLQkJCQkJCQl9IGVsc2UgaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCQkJCQlzdHIgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX3JlcGxhY2VzOyAKLQkJCQkJCQl9Ci0JCQkJCQkJU3RyaW5nIG5hbWUgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZGVzYykKLQkJCQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCQkJaWYgKHN0ciAhPSBudWxsKQotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHN0ciwKLQkJCQkJCQkJCQluZXcgT2JqZWN0W10geyBuYW1lIH0pKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCW1vZGVsSW5mby5hcHBlbmQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0vLwkJCQkJUHJvY2Vzc1V0aWwuZ2V0TW9kZWxJbmZvRm9yV29ya1Byb2R1Y3REZXNjcmlwdG9yKG1vZGVsSW5mbywKLS8vCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCk7Ci0JCQkJCVByb2Nlc3NVdGlsLmdldFdQRE1vZGVsSW5mbyhtb2RlbEluZm8sIG9iamVjdCwgdGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOyAKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQlNJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQlNJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2YTFmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUJTSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJlZGVjZXNzb3JMaXN0OwotCi0KLS8qKgotICogVGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2Ugb2YgYWxsIGl0ZW0gcHJvdmlkZXJzIGZvciBicmVha2Rvd24gZWxlbWVudCB1c2VkCi0gKiBieSB0aGUgUHJvY2VzcyBFZGl0b3IuIEl0IGRlZmluZXMgdGhlIGNvbnN0YW50cyBmb3IgY29sdW1uIG5hbWVzIGFuZCBtZXRob2RzCi0gKiB0byBzdXBwb3J0IHJvdyBpbmRleCwgcm9sbC11cCB2aWV3LCBnZXR0aW5nL3NldHRpbmcgYnJlYWtkb3duIGVsZW1lbnQncwotICogYXR0cmlidXRlcywgcHJlZGVjZXNzb3IgbGlzdC4uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCU0l0ZW1Qcm92aWRlciBleHRlbmRzIC8vSUxpYnJhcnlJdGVtUHJvdmlkZXIsCi0JCUlTdGF0ZWZ1bEl0ZW1Qcm92aWRlciB7Ci0KLQkvKiogQ29sdW1uIElEIGNvbnN0YW50cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9QUkVERUNFU1NPUlMgPSAicHJlZGVjZXNzb3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX1JFUEVBVEFCTEUgPSAiaXNfcmVwZWF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JU19PTkdPSU5HID0gImlzX29uZ29pbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSVNfRVZFTlRfRFJJVkVOID0gImlzX2V2ZW50X2RyaXZlbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9FTlRSWV9TVEFURSA9ICJlbnRyeV9zdGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9FWElUX1NUQVRFID0gImV4aXRfc3RhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfVEVBTVMgPSAidGVhbXMiOyAvLyROT04tTkxTLTEkICAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfTU9ERUxfSU5GTyA9ICJtb2RlbF9pbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX1BSRVNFTlRBVElPTl9OQU1FID0gInByZXNlbnRhdGlvbl9uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0RFTElWRVJBQkxFID0gImRlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX09QVElPTkFMID0gImlzX29wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MX0lTX1BMQU5ORUQgPSAiaXNfcGxhbm5lZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSAiaGFzX211bHRpcGxlX29jY3VycmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT0xVTU5TID0geyBDT0xfTkFNRSwgQ09MX1BSRUZJWCwgQ09MX0lELAotCQkJQ09MX1BSRURFQ0VTU09SUywgQ09MX0lTX1JFUEVBVEFCTEUsIENPTF9JU19PTkdPSU5HLAotCQkJQ09MX0lTX0VWRU5UX0RSSVZFTiwgQ09MX0VOVFJZX1NUQVRFLCBDT0xfRVhJVF9TVEFURSwgQ09MX1RFQU1TLAotCQkJQ09MX1RZUEUsIENPTF9NT0RFTF9JTkZPLCBDT0xfUFJFU0VOVEFUSU9OX05BTUUsIENPTF9ERUxJVkVSQUJMRSB9OwotCQotCWludCBnZXRJZCgpOwotCi0Jdm9pZCBzZXRJZChpbnQgaWQpOwotCi0JLy8gSUJTSXRlbVByb3ZpZGVyIGdldEl0ZW1Qcm92aWRlcihFT2JqZWN0IGVPYmopOwotCi0Jdm9pZCBzZXRQYXJlbnQoT2JqZWN0IG9iaik7Ci0KLQlPYmplY3QgZ2V0VG9wSXRlbSgpOwotCi0Jdm9pZCBzZXRUb3BJdGVtKE9iamVjdCB0b3ApOwotCi0JYm9vbGVhbiBpc1JvbGxlZFVwKCk7Ci0KLQl2b2lkIHNldFJvbGxlZFVwKGJvb2xlYW4gYik7Ci0KLQlib29sZWFuIGlzRmlyc3RFbGVtZW50KE9iamVjdCBvYmopOwotCi0JYm9vbGVhbiBpc0xhc3RFbGVtZW50KE9iamVjdCBvYmopOwotCi0JLy8gTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eU9iaiwgT2JqZWN0IG9iaik7Ci0KLQl2b2lkIG1vdmVVcChPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0Jdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpOwotCi0JQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpOwotCi0JLy8gR3JhcGhpY2FsRGF0YSBnZXRHcmFwaGljYWxEYXRhKCk7Ci0KLQkvLyB2b2lkIHNldEdyYXBoaWNhbERhdGEoR3JhcGhpY2FsRGF0YSBkYXRhKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0IGFzIGEgc3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgY29sdW1uIElEIGNvbnN0YW50cyBDT0xfWFhYCi0JICogQHJldHVybiBTdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBjb2x1bW4gSUQgY29uc3RhbnRzIENPTF9YWFgKLQkgKiBAcGFyYW0gdGV4dFZhbHVlCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgdGV4dFZhbHVlKTsKLQotCUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQlQcmVkZWNlc3Nvckxpc3QgZ2V0UHJlZGVjZXNzb3JzKCk7Ci0KLQlCb29sZWFuIGlzRXhwYW5kZWQoKTsKLQotCXZvaWQgc2V0RXhwYW5kZWQoQm9vbGVhbiBiKTsKLQotCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcEVsZW1lbnRzKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTYyZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSVdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5pbnRlcm5hbC5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBJV3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQ29sdW1uQXdhcmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JQ29sdW1uQXdhcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzODIwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvSUNvbHVtbkF3YXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIHBhc3MgdGhlIGNvbHVtbiBpbmRleCAvIG5hbWUgbWFwIGZyb20gdGhlIHVzZXIgaW50ZXJmYWNlIHRvCi0gKiB0aGUgYWRhcHRlciB0aGF0IGltcGxlbWVudHMgaXQgc28gdGhlIGFkYXB0ZXIgY2FuIHByb3ZpZGUgdGhlIGNvcnJlY3QgZGF0YQotICogZm9yIHRoZSBjb2x1bW5zIGV2ZW4gdGhlaXIgaW5kZXggaGF2ZSBjaGFuZ2VkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb2x1bW5Bd2FyZSB7Ci0KLQlNYXAgZ2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoKTsKLQotCXZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Yzg0NjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0lQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMDUyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklTdGF0ZWZ1bEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQ29sdW1uQXdhcmUgewotCi0JcHJpdmF0ZSBNYXAgY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0KLQkvKioKLQkgKiBSZWZlcmVuY2VzIHRvIHN0YXRlZnVsIGFkYXB0ZXJzIGNyZWF0ZWQgYnkgdGhpcyBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIFNldCBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSVRhYmxlSXRlbUxhYmVsUHJvdmlkZXIuY2xhc3MpOwotCQkvLyBjcmVhdGVkQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHN1cGVyLmNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkRlc2NyaXB0b3JzQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IERlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuRGVzY3JpcHRvcnNBZGFwdGVyRmFjdG9yeSNjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwID0gbWFwOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbHVtbkF3YXJlKSB7Ci0JCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlcikKLQkJCQkJLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKGNvbHVtbkluZGV4VG9OYW1lTWFwKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBhZGFwdChOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQobm90aWZpZXIsIHR5cGUpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDb2x1bW5Bd2FyZSkgewotCQkJKChJQ29sdW1uQXdhcmUpIGFkYXB0ZXIpCi0JCQkJCS5zZXRDb2x1bW5JbmRleFRvTmFtZU1hcChjb2x1bW5JbmRleFRvTmFtZU1hcCk7Ci0JCX0KLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3RhdGVmdWxJdGVtUHJvdmlkZXIKLQkJCQkmJiBub3RpZmllciBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIG5vdGlmaWVyKS5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJZGlzcG9zYWJsZUFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Qcm9jZXNzdHlwZXNBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIG5ldyBQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuUHJvY2Vzc3R5cGVzSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3N0eXBlc0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCS8vIHJldHVybiBjcmVhdGVQcm9jZXNzQWRhcHRlcigpOwotCS8vIH0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlUm9sZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlpZiAocm9sZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHJvbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPSBuZXcgV29ya09yZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB3b3JrT3JkZXJJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklDb2x1bW5Bd2FyZSNnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpCi0JICovCi0JcHVibGljIE1hcCBnZXRDb2x1bW5JbmRleFRvTmFtZU1hcCgpIHsKLQkJcmV0dXJuIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoIWRpc3Bvc2FibGVBZGFwdGVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3Bvc2FibGVBZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJRGlzcG9zYWJsZSBhZGFwdGVyID0gKElEaXNwb3NhYmxlKSBpdGVyLm5leHQoKTsKLQkJCQlhZGFwdGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWRpc3Bvc2FibGVBZGFwdGVycy5jbGVhcigpOwotCQl9Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3Y2UxZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL01pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyKE1pbGVzdG9uZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1pbGVzdG9uZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE1pbGVzdG9uZVdyYXBwZXJJdGVtUHJvdmlkZXIoTWlsZXN0b25lIG1pbGVzdG9uZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIobWlsZXN0b25lLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2U0OWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkRpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuT0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogSXRlbSBwcm92aWRlciBmb3IgVGVhbSBBbGxvY2F0aW9uIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBEaXNwb3NhYmxlIHJvbGxlZFVwV3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgb2JqZWN0OwotCQkvLyBpZihoYXNDaGlsZERlc2NyaXB0b3IoYWN0KSkgewotCQkvLyBuZXdDaGlsZERlc2NyaXB0b3JzLmFkZAotCQkvLyAoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIKLQkJLy8gKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksCi0JCS8vIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQkJLy8gICAgCQkKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZWFtUHJvZmlsZSgpKSk7Ci0JCS8vCi0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVBoYXNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVJdGVyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZUFjdGl2aXR5KCkpKTsKLQotCQkvLyBpZihhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCS8vIENPTVBPU0lURSBST0xFIEZFQVRVUkUgSVMgTk9UIEFWQUlMQUJMRSBGT1IgRklSU1QgUkVMRUFTRS4KLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wb3NpdGVSb2xlKCkpKTsKLQkJLy8JCQkJCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVRlYW1Qcm9maWxlKCkpKTsKLQotCQkvLyB9Ci0JCS8vIH0KLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnRuZy5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjYWNjZXB0QXNDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCi0JCWlmIChjaGlsZCBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQl8fCBjaGlsZCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlIHx8IGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKChSb2xlRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0Um9sZSgpOwotCQl9Ci0JCWNhdGNoKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBPQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wRWxlbWVudHMpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkVOVEVSOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlDb21tYW5kIGNtZCA9IG5ldyBPQlNEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLCBvd25lciwgbG9jYXRpb24sCi0JCQkJb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBjYW4gZXhlY3V0ZTogIiArIGNtZC5jYW5FeGVjdXRlKCkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvd25lcjogIiArIG93bmVyKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY29sbGVjdGlvbjogIiArIGNvbGxlY3Rpb24pOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBsb2NhdGlvbjogIiArIGxvY2F0aW9uKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uczogIiArIG9wZXJhdGlvbnMpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBvcGVyYXRpb246ICIgKyBvcGVyYXRpb24pOwotCQkvLyAgICAgICAgCi0JCS8vIFN5c3RlbS5vdXQKLQkJLy8gLnByaW50bG4oIkVYSVQ6Ci0JCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwKLQkJLy8gb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIGNvbGxlY3Rpb24pIik7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNyZWZyZXNoQ2hpbGRyZW4ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uLAotCS8vIGphdmEudXRpbC5MaXN0KQotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sIExpc3QKLQkvLyBuZXdPck9sZENoaWxkcmVuKSB7Ci0JLy8gaWYoIW5ld09yT2xkQ2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JLy8gUHJvY2VzcyB0b3BBY3QgPSAoUHJvY2VzcykgZ2V0VG9wSXRlbSgpOwotCS8vIEFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCS8vCQkJCQkJCi0JLy8gUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0JLy8JCQkKLQkvLyByZXR1cm47Ci0JLy8KLQkvLyB9Ci0JLy8gfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2lzTmV3RGVzY3JpcHRvcihqYXZhLnV0aWwuTGlzdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IoTGlzdCBjaGlsZHJlbiwgT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCS8vIGNvbGxlY3QgYWxsIHJvbGUgZGVzY3JpcHRvcnMgb3IgdGhlaXIgd3JhcHBlcnMgZmlyc3QgZm9yIG1hdGNoaW5nIHdpdGggdGVhbSBwcm9maWxlcwotCQkvLyBhbmQgZWxpbWluYXRlIHRoZSBkdXBsaWNhdGVzIGxhdGVyIGluIGdldENoaWxkcmVuKCkKLQkJLy8KLQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc05ld0Rlc2NyaXB0b3IoY2hpbGRyZW4sIG9iaik7Ci0JfQkJCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoaXNSb2xsZWRVcCgpKSB7Ci0JCQlMaXN0IHRlYW1Qcm9maWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3Qgcm9sZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSGFzaFNldCByb2xlVGVhbVBhaXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcm9sZURlc2NyaXB0b3JzV2l0aG91dExpbmtlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCi0JCQkvLyBjb2xsZWN0IGFsbCB0ZWFtIHByb2ZpbGVzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLQkJCS8vCi0JCQlIYXNoU2V0IHZhbGlkVGVhbVByb2ZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCWlmKHZhbGlkVGVhbVByb2ZpbGVzLmFkZChlKSkgewotCQkJCQkJdGVhbVByb2ZpbGVzLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlSb2xlRGVzY3JpcHRvciBkZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlOwotCQkJCQlMaXN0IGxpc3Q7Ci0JCQkJCUxpc3QgZGVzY3JpcHRvcnMgPSBudWxsOwotCQkJCQlDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlciA9IG51bGw7CQkJCQkKLQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCU9iamVjdCB2YWx1ZSA9ICgoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKWNoaWxkKS5nZXRWYWx1ZSgpOwotCQkJCQkJaWYodmFsdWUgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJY29tcG9zZWRXcmFwcGVyID0gKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHZhbHVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKGNvbXBvc2VkV3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0ID0gbmV3IFVuaXF1ZUVMaXN0KCk7Ci0JCQkJCQlkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wb3NlZFdyYXBwZXIuZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IFRuZ1V0aWwudW53cmFwKG8pOwotCQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQkJCQlMaXN0IHRlYW1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKChSb2xlRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHRlYW1zLml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IHRlYW0gPSBpdG9yLm5leHQoKTsKLQkJCQkJCQkJCWlmKGxpc3QuYWRkKHRlYW0pKSB7Ci0JCQkJCQkJCQkJZGVzY3JpcHRvcnMuYWRkKG8pOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKGRlc2MpOwotCQkJCQl9Ci0JCQkJCWludCBzaXplID0gbGlzdC5zaXplKCk7IAotCQkJCQlpZihzaXplID4gMSkgewotCQkJCQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCQkJCXJvbGxlZFVwV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJCXJlYWRPbmx5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQpCi0JCQkJCQkJLmlzUmVhZE9ubHkoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gc2hvdyBvbmUgZGVzY3JpcHRvciBwZXIgdGVhbQotCQkJCQkJLy8KLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCQkJVGVhbVJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IG5ldyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCQkJCQlkZXNjcmlwdG9ycy5nZXQoaSksIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCWl0ZW1Qcm92aWRlci5yZWFkT25seSA9IHJlYWRPbmx5OwotCQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGxpc3QuZ2V0KGkpOwotCQkJCQkJCQotLy8JCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCS8vCi0vLwkJCQkJCQlpZih2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCWFkZFRlYW1Qcm9maWxlcyhvYmplY3QsIHRlYW1Qcm9maWxlcywgdGVhbSk7Ci0vLwkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJaXRlbVByb3ZpZGVyLnRlYW0gPSB0ZWFtOwotCQkJCQkJCXJvbGxlZFVwV3JhcHBlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCXJvbGVUZWFtUGFpcnMuYWRkKG5ldyBSb2xlVGVhbVBhaXIoKFJvbGUpIGdldE9iamVjdChkZXNjKSwgdGVhbSkpOwotCQkJCQkJfQkJCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJUm9sZSByb2xlID0gKFJvbGUpIGdldE9iamVjdChkZXNjKTsKLQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIChzaXplID09IDEgPyBsaXN0LmdldCgwKSA6IG51bGwpOwotCQkJCQkJaWYocm9sZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYoIXJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJCQkJCi0vLwkJCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWlmKHRlYW0gIT0gbnVsbCAmJiB2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCXJvbGVEZXNjcmlwdG9yc1dpdGhvdXRMaW5rZWRFbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJUm9sZVRlYW1QYWlyIHJvbGVUZWFtUGFpciA9IG5ldyBSb2xlVGVhbVBhaXIocm9sZSwgdGVhbSk7Ci0JCQkJCQkJaWYoIXJvbGVUZWFtUGFpcnMuY29udGFpbnMocm9sZVRlYW1QYWlyKSkgewotCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMuYWRkKGNoaWxkKTsKLQkJCQkJCQkJCi0vLwkJCQkJCQkJLy8gYWRkIHRlYW0gdG8gdGhlIHRlYW0gbGlzdCBvbmx5IGlmIHRoZSB0ZWFtIGlzIHVuZGVyIHRoaXMgYWN0aXZpdHkKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWlmKHRlYW0gIT0gbnVsbCAmJiB2YWxpZFRlYW1Qcm9maWxlcy5jb250YWlucyh0ZWFtKSkgewotLy8JCQkJCQkJCQlhZGRUZWFtUHJvZmlsZXMob2JqZWN0LCB0ZWFtUHJvZmlsZXMsIHRlYW0pOwotLy8JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCXJvbGVUZWFtUGFpcnMuYWRkKHJvbGVUZWFtUGFpcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcm9sZVRlYW1QYWlycy5jbGVhcigpOwotCQkJcm9sZVRlYW1QYWlycyA9IG51bGw7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHRlYW1Qcm9maWxlcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHJvbGVEZXNjcmlwdG9ycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQljaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QodGVhbVByb2ZpbGVzKTsKLQkJCWNoaWxkcmVuLmFkZEFsbChyb2xlRGVzY3JpcHRvcnMpOwotCQkJCi0JCQl1cGRhdGVDYWNoZWRDaGlsZHJlbihjaGlsZHJlbik7Ci0JCQkKLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRlYW1Qcm9maWxlcyhPYmplY3Qgb3duZXIsIENvbGxlY3Rpb24gdGVhbVByb2ZpbGVzLCBUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSkgewotCQlpZiAoIVRuZ1V0aWwuY2hlY2tFeGlzdCh0ZWFtUHJvZmlsZXMsIHRlYW1Qcm9maWxlKSkgewotCQkJVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSBuZXcgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQl0ZWFtUHJvZmlsZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJCQkKLS8vCQkJCQkvLyBkb24ndCBzaG93IHJvbGUgZGVzY3JpcHRvcnMKLS8vCQkJCQkvLwotLy8JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0vLwkJCQkJCWlmKGNoaWxkIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLS8vCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9CQotCQkJCQkKLQkJCQkJcmV0dXJuIGNoaWxkcmVuOwotCQkJCX0KLQkJCQkKLQkJCX07Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdCh0ZWFtUHJvZmlsZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJd3JhcHBlci5yZWFkT25seSA9IChnZXRUb3BJdGVtKCkgIT0gYWRhcHRlci5nZXRUb3BJdGVtKCkpOwotCQkJdGVhbVByb2ZpbGVzLmFkZCh3cmFwcGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCQlSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgewotCQkKLQkJCi0JCXB1YmxpYyBUZWFtUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gdmFsdWUKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCQkgKi8KLQkJcHVibGljIFRlYW1Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihSb2xlRGVzY3JpcHRvciB2YWx1ZSwKLQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXJlYWRPbmx5ID0gZmFsc2U7Ci0JCX0KLQotCQlwcml2YXRlIFRlYW1Qcm9maWxlIHRlYW07Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TICYmIHRlYW0gIT0gbnVsbCkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeSkKLQkJICovCi0JCXByb3RlY3RlZCBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBzdXBlcgotCQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCXdyYXBwZXIucmVhZE9ubHkgPSByZWFkT25seTsKLQkJCXJldHVybiB3cmFwcGVyOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9sZVRlYW1QYWlyIHsKLQkJcHJpdmF0ZSBSb2xlIHJvbGU7Ci0JCXByaXZhdGUgVGVhbVByb2ZpbGUgdGVhbTsKLQotCQlSb2xlVGVhbVBhaXIoUm9sZSByb2xlLCBUZWFtUHJvZmlsZSB0ZWFtKSB7Ci0JCQl0aGlzLnJvbGUgPSByb2xlOwotCQkJdGhpcy50ZWFtID0gdGVhbTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmKG9iaiA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQkJCWlmKG9iaiBpbnN0YW5jZW9mIFJvbGVUZWFtUGFpcikgewotCQkJCVJvbGVUZWFtUGFpciBvdGhlciA9IChSb2xlVGVhbVBhaXIpIG9iajsKLQkJCQlyZXR1cm4gcm9sZSA9PSBvdGhlci5yb2xlICYmICh0ZWFtID09IG90aGVyLnRlYW0gfHwgKHRlYW0gPT0gbnVsbCAmJiBvdGhlci50ZWFtID09IG51bGwpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCVN0cmluZyBzdHIgPSByb2xlLmdldEd1aWQoKTsKLQkJCWlmKHRlYW0gIT0gbnVsbCkgewotCQkJCXN0ciA9IHN0ciArIHRlYW0uZ2V0R3VpZCgpOwotCQkJfQotCQkJcmV0dXJuIHN0ci5oYXNoQ29kZSgpOwkJCQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzV3JhcHBpbmdSb2xsdXBOZWVkZWQoT2JqZWN0IG9iamVjdCkgewotCQlpZihUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1dyYXBwaW5nUm9sbHVwTmVlZGVkKG9iamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSb2xsdXBXcmFwcGVyKE9iamVjdCBvYmplY3QsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXBlci5jcmVhdGVSb2xsdXBXcmFwcGVyKG9iamVjdCwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIod3JhcHBlciwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTQwMGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUl0ZXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpCi0JLy8gKi8KLQkvLyBwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkvLyByZXR1cm4gbmV3IE9CU0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IE9CU01pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVQcm9jZXNzQWRhcHRlcigpCi0JICovCi0JLy8gcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JLy8gcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCS8vIH0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBPQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYWExZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL09CU01pbGVzdG9uZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIE9CU01pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBUbmdVdGlsLmdldEFsbENoaWxkcmVuKChQcm9jZXNzQ29udHJpYnV0aW9uKSBvYmplY3QsCi0JLy8gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwKLQkvLyBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSkpOwotCS8vIH0KLQkvLyAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRFbGVtZW50cyhqYXZhLmxhbmcuT2JqZWN0KQotCS8vICovCi0JLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBzdXBlci5nZXRFbGVtZW50cyhvYmplY3QpOwotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgTGlzdCBnZXRGaWx0ZXJlZEJyZWFrZG93bkVsZW1lbnRzKE9iamVjdCBhY3Rpdml0eSwgT2JqZWN0IG9iaikKLQkvLyB7Ci0JLy8gTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvLyBMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gKChBY3Rpdml0eSlhY3Rpdml0eSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ID0gYnJlYWtkb3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkvLyB7Ci0JLy8gT2JqZWN0IGVsZW1lbnRPYmogPSBpdC5uZXh0KCk7Ci0JLy8gaWYgKChlbGVtZW50T2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHx8IChlbGVtZW50T2JqIGluc3RhbmNlb2YKLQkvLyBUZWFtUHJvZmlsZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB8fCAoZWxlbWVudE9iagotCS8vIGluc3RhbmNlb2YgTWlsZXN0b25lKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkvLyB7Ci0JLy8gZWxlbWVudHMuYWRkKGVsZW1lbnRPYmopOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzMxZTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9PQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBPQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgT0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjE1ZmExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGlzcG9zYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlBCU0RyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5QQlNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIAotaW1wbGVtZW50cyBJQ2FjaGVkQ2hpbGRyZW5JdGVtUHJvdmlkZXIKLXsKLQotCXByaXZhdGUgRGlzcG9zYWJsZSByb2xsZWRVcFdyYXBwZXJzOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQkvLyBBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iamVjdDsKLQkJLy8gaWYoaGFzQ2hpbGREZXNjcmlwdG9yKGFjdCkpIHsKLQkJLy8gbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQKLQkJLy8gKGNyZWF0ZUNoaWxkUGFyYW1ldGVyCi0JCS8vIChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkvLyBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkvLyB9Ci0JCS8vIGVsc2UgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJLy8gaWYoYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0JCS8vIH0KLQotCQkvLyB9Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlTWlsZXN0b25lKCkpKTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS50bmcucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc0NoaWxkKE9iamVjdCBjaGlsZCkgewotCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JCQkJfHwgY2hpbGQgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBzdXBlci5hY2NlcHRBc0NoaWxkKGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHJvbGxlZFVwV3JhcHBlcnMgIT0gbnVsbCkgewotCQkJcm9sbGVkVXBXcmFwcGVycy5kaXNwb3NlKCk7Ci0JCX0KLQotCQlpZiAoaXNSb2xsZWRVcCgpKSB7Ci0JCQlNYXAgd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKGRlc2MpOwotCQkJCQlPYmplY3Qgd3JhcHBlcktleSA9IGRlc2MuZ2V0V29ya1Byb2R1Y3QoKSA9PSBudWxsID8gKE9iamVjdClkZXNjIDogZGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlMaXN0IHdyYXBwZXJzID0gKExpc3QpIHdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC5nZXQod3JhcHBlcktleSk7Ci0JCQkJCWlmIChsaXN0LnNpemUoKSA8IDEpIHsKLQkJCQkJCS8vIGNoZWNrIGlmIHRoZSBkZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzIGluIHRoZQotCQkJCQkJLy8gcm9sbHVwIGxpc3QKLQkJCQkJCS8vCi0JCQkJCQlpZih3cmFwcGVycyA9PSBudWxsKSB7Ci0JCQkJCQkJd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLnB1dCh3cmFwcGVyS2V5LCB3cmFwcGVycyk7Ci0JCQkJCQkJd3JhcHBlcnMuYWRkKG5ldyBDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoY2hpbGQsIG9iamVjdCwgYWRhcHRlckZhY3RvcnkpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWZvciAoaW50IGkgPSB3cmFwcGVycy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQkoKENvbXBvc2VkV1BEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcil3cmFwcGVycy5nZXQoaSkpLmFkZFdvcmtQcm9kdWN0RGVzY3JpcHRvcihjaGlsZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJCWJvb2xlYW4gY2hlY2tFeGlzdCA9IHRydWU7CQkJCQkJCQotCQkJCQkJCWlmKHdyYXBwZXJzID09IG51bGwpIHsKLQkJCQkJCQkJd3JhcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCXdvcmtQcm9kdWN0VG9XcmFwcGVyc01hcC5wdXQod3JhcHBlcktleSwgd3JhcHBlcnMpOwotCQkJCQkJCQljaGVja0V4aXN0ID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGNoZWNrRXhpc3QpIHsKLQkJCQkJCQkJLy8gcmVtb3ZlIGFueSB3cmFwcGVyIHRoYXQgaXMgbm90IG9mIHR5cGUgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZnJvbSB0aGUgd3JhcHBlciBsaXN0Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlPYmplY3Qgd3JhcHBlciA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCWlmKCEod3JhcHBlciBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKSkgewotCQkJCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJCi0JCQkJCQkJCWNoZWNrRXhpc3QgPSB3cmFwcGVycy5zaXplKCkgPiAwOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQkvLyBzaG93IG9uZSBkZXNjcmlwdG9yIHBlciBkZWxpdmVyYWJsZQotCQkJCQkJCS8vCi0JCQkJCQkJYWRkX2Rlc2NyaXB0b3JzOgotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJT2JqZWN0IGRlbGl2ZXJhYmxlRGVzY3JpcHRvciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJaWYoY2hlY2tFeGlzdCkgewotCQkJCQkJCQkJZm9yIChpbnQgaSA9IHdyYXBwZXJzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQkJCQkJRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcikgd3JhcHBlcnMuZ2V0KGkpOwotCQkJCQkJCQkJCWlmKHdyYXBwZXIuZGVsaXZlcmFibGVEZXNjcmlwdG9yID09IGRlbGl2ZXJhYmxlRGVzY3JpcHRvcikgewotCQkJCQkJCQkJCQl3cmFwcGVyLmFkZFdvcmtQcm9kdWN0RGVzY3JpcHRvcihjaGlsZCk7Ci0JCQkJCQkJCQkJCWNvbnRpbnVlIGFkZF9kZXNjcmlwdG9yczsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlEZWxpdmVyYWJsZVdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJCQkJCQkJZGVzYywgb2JqZWN0LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJCWl0ZW1Qcm92aWRlci5kZWxpdmVyYWJsZURlc2NyaXB0b3IgPSBkZWxpdmVyYWJsZURlc2NyaXB0b3I7Ci0JCQkJCQkJCXdyYXBwZXJzLmFkZChpdGVtUHJvdmlkZXIpOwotCQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJTGlzdCByb2xsZWRVcENoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd29ya1Byb2R1Y3RUb1dyYXBwZXJzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCXJvbGxlZFVwQ2hpbGRyZW4uYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQkJCi0JCQl9Ci0JCQlMaXN0IHJlc3VsdCA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihyb2xsZWRVcENoaWxkcmVuLCB0cnVlKTsKLQkJCWlmKHJvbGxlZFVwV3JhcHBlcnMgPT0gbnVsbCkgewotCQkJCXJvbGxlZFVwV3JhcHBlcnMgPSBuZXcgRGlzcG9zYWJsZSgpOwotCQkJfQotCQkJcm9sbGVkVXBXcmFwcGVycy5hZGRBbGwocmVzdWx0KTsKLQkJCQotCQkJLy8gZGlzcG9zZSB3cmFwcGVycyBvZiBzdWJhcnRpZmFjdAotCQkJLy8KLQkJCWZvcihpbnQgaSA9IHJvbGxlZFVwQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKElXcmFwcGVySXRlbVByb3ZpZGVyKSByb2xsZWRVcENoaWxkcmVuLmdldChpKTsKLQkJCQlpZighcm9sbGVkVXBXcmFwcGVycy5jb250YWlucyh3cmFwcGVyKSkgewotCQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJCQotCQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4ocmVzdWx0KTsKLQkJCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSwgZmFsc2UpOwotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQkKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYocm9sbGVkVXBXcmFwcGVycyAhPSBudWxsKSB7Ci0JCQlyb2xsZWRVcFdyYXBwZXJzLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc05ld0Rlc2NyaXB0b3IoamF2YS51dGlsLkxpc3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yKExpc3QgY2hpbGRyZW4sIE9iamVjdCBjaGlsZCkgewotCQkvLyByZXR1cm4gdHJ1ZSB0byBsZXQgb3ZlcnJpZGVuIGdldENoaWxkcmVuKCkgdG8gaGFuZGxlIHRoZSB1bmlxdWVuZXNzIG9mIHRoZSByb2xsdXAgbGlzdAotCQkvLwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVPck1vdmVQYWNrYWdlRm9yKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9yTW92ZVBhY2thZ2VGb3IoTGlzdCBuZXdDaGlsZHJlbikgewotCQlzdXBlci5jcmVhdGVPck1vdmVQYWNrYWdlRm9yKG5ld0NoaWxkcmVuKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXdDaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgYWN0aXZpdHkncyBwYWNrYWdlCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGU7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBwYXJ0ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcmF0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihwYXJ0LCB0aGlzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0T2JqZWN0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE9iamVjdChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRXb3JrUHJvZHVjdCgpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCU9iamVjdCBvd25lciwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLAotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgUEJTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLCBvcGVyYXRpb25zLAotCQkJCW9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjY3JlYXRlRHJvcENvbW1hbmQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY3JlYXRlRHJvcENvbW1hbmQoT2JqZWN0IG93bmVyLAotCQkJTGlzdCBkcm9wRWxlbWVudHMpIHsKLQkJcmV0dXJuIG5ldyBQQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wRWxlbWVudHMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2FjY2VwdEFzUm9sbGVkVXBDaGlsZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEFzUm9sbGVkVXBDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKW9iaikuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmFjY2VwdEFzUm9sbGVkVXBDaGlsZChvYmopOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQkJQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHsKLQotCQlwcml2YXRlIE9iamVjdCBkZWxpdmVyYWJsZURlc2NyaXB0b3I7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB2YWx1ZQotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JCSAqLwotCQlwdWJsaWMgRGVsaXZlcmFibGVXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCQkJcmVhZE9ubHkgPSBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9ERUxJVkVSQUJMRSkgewotCQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZGVsaXZlcmFibGVEZXNjcmlwdG9yKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlMaXN0PD8+IGxpc3QgPSBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCk7Ci0JCWlmKGxpc3Quc2l6ZSgpICE9ICBjaGlsZHJlbi5zaXplKCkpIHsKLQkJCS8vIHBhcmVudCBvZiBkZXNjcmlwdG9ycyBvZiBzdWJhcnRpZmFjdHMgaGFzIGJlZW4gc2V0IHRvIHRoaXMgYWN0aXZpdHkKLQkJCS8vIGl0ZXJhdGUgdGhlIHN1YnRyZWUgb2YgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3JzIGluIGNoaWRyZW4gbGlzdCB0byBjb3JyZWN0IHRoaXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvciljaGlsZCkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWZvcihBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjw/PiBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oYWRhcHRlckZhY3RvcnksIGNoaWxkKTsKLQkJCQkJCWl0ZXIuaGFzTmV4dCgpOyBpdGVyLm5leHQoKSk7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1dyYXBwaW5nUm9sbHVwTmVlZGVkKG9iamVjdCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiZmQxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkJyZWFrZG93bkFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVBoYXNlQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9QQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxODg4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU01pbGVzdG9uZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxDaGlsZHJlbigoUHJvY2Vzc0NvbnRyaWJ1dGlvbikgb2JqZWN0LAotCS8vIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksCi0JLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JLy8gcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9ICgoQWN0aXZpdHkpYWN0aXZpdHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JLy8gewotCS8vIE9iamVjdCBlbGVtZW50T2JqID0gaXQubmV4dCgpOwotCS8vIGlmICgoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgfHwgKGVsZW1lbnRPYmoKLQkvLyBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgfHwgKGVsZW1lbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkpCi0JLy8gewotCS8vIGVsZW1lbnRzLmFkZChlbGVtZW50T2JqKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBlbGVtZW50czsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmMWIwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotCi1wdWJsaWMgY2xhc3MgUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2RmMTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJUHJvY2Vzc0l0ZW1Qcm92aWRlciB7Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9jZXNzTGlzdGVuZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JLy8gcHJpdmF0ZSBJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlcjsKLQkvLyBwcml2YXRlIE9iamVjdCByZWZyZXNoT2JqOwotCS8vCi0JLy8gLyoqCi0JLy8gKgotCS8vICovCi0JLy8gcHVibGljIFByb2Nlc3NMaXN0ZW5lcihJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlciwgT2JqZWN0Ci0JLy8gcmVmcmVzaE9iaikgewotCS8vIHRoaXMuaXRlbVByb3ZpZGVyID0gaXRlbVByb3ZpZGVyOwotCS8vIHRoaXMucmVmcmVzaE9iaiA9IHJlZnJlc2hPYmo7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyAvKiAobm9uLUphdmFkb2MpCi0JLy8gKiBAc2VlCi0JLy8gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbCNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkvLyAqLwotCS8vIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCS8vIHN3aXRjaChtc2cuZ2V0RmVhdHVyZUlEKFByb2Nlc3MuY2xhc3MpKSB7Ci0JLy8gY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkvLyBpdGVtUHJvdmlkZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihtc2csIHJlZnJlc2hPYmosCi0JLy8gdHJ1ZSwgZmFsc2UpKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyB9OwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0NvbXBvbmVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19OQU1FOgotCQkJUHJvY2Vzc0NvbXBvbmVudCBwYyA9IChQcm9jZXNzQ29tcG9uZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCWlmIChwYy5nZXRQcm9jZXNzKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcGMuZ2V0UHJvY2VzcygpLmVEZWxpdmVyKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQkJcGMuZ2V0UHJvY2VzcygpLnNldE5hbWUocGMuZ2V0TmFtZSgpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlwYy5nZXRQcm9jZXNzKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJCQotCQkvLyBhdm9pZCByZWZyZXNoaW5nIHZpZXdlcnMgd2hlbiBuZXcgcHJvY2VzcyBlbGVtZW50IG9yIGRpYWdyYW0gaXMgYWRkZWQgdG8gdGhlIHByb2Nlc3MgY29tcG9uZW50Ci0JCS8vCi0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19ESUFHUkFNUzoKLQkJCXJldHVybjsKLQkJCQotCQl9CQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIFByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudClvYmplY3QpLmdldFByb2Nlc3MoKTsKLQkvLyBpZihwcm9jICE9IG51bGwpIHsKLQkvLyBpZihUbmdVdGlsLmdldEFkYXB0ZXIocHJvYywgUHJvY2Vzc0xpc3RlbmVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JLy8gcHJvYy5lQWRhcHRlcnMoKS5hZGQobmV3IFByb2Nlc3NMaXN0ZW5lcih0aGlzLCBvYmplY3QpKTsKLQkvLyB9Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcHJvYy5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBjaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGNoaWxkcmVuOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCS8vIHB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCS8vIHJldHVybiBzdXBlci5nZXRJbWFnZShvYmplY3QpOwotCS8vIH0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF90eXBlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2Rpc3Bvc2UoKQotCSAqLwotCS8vIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JLy8gLy8gcmVtb3ZlIGFsbCBwcm9jZXNzIGxpc3RlbmVycyBmcm9tIGFsbCB0YXJnZXRzCi0JLy8gLy8KLQkvLyBpZiAodGFyZ2V0ICE9IG51bGwpCi0JLy8gewotCS8vIHRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JLy8gaWYgKHRhcmdldHMgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gZm9yIChJdGVyYXRvciBpID0gdGFyZ2V0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCS8vIHsKLQkvLyBOb3RpZmllciBvdGhlclRhcmdldCA9IChOb3RpZmllcilpLm5leHQoKTsKLQkvLyBvdGhlclRhcmdldC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8KLQkvLyBzdXBlci5kaXNwb3NlKCk7Ci0JLy8gfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTRlZTg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAzMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2NmFhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RUNsYXNzZXMoKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5nZXRPQlNFY2xhc3NlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1JvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk4Mzg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0JCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcihSb2xlRGVzY3JpcHRvciB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFJvbGVEZXNjcmlwdG9yIHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSW5oZXJpdGVkKCkgewotCQlpZihnZXRWYWx1ZSgpIGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuICgoQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilnZXRWYWx1ZSgpKS5pc0luaGVyaXRlZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc0luaGVyaXRlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvUm9sZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGIyMWI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSXRlbVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5Sb2xlSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBSb2xlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGVhYjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFdCU0VjbGFzc2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODRmZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1Rhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHsJCi0KLQlwcm90ZWN0ZWQgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKE9iamVjdCB2YWx1ZSwgT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoVGFza0Rlc2NyaXB0b3IgdmFsdWUsCi0JCQlPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBpbnQgaW5kZXgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmKGdldFZhbHVlKCkgaW5zdGFuY2VvZiBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gKChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWdldFZhbHVlKCkpLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRlZCgpIHsKLQkJaWYoZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXJldHVybiAoKENvbXBvc2VkQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpZ2V0VmFsdWUoKSkuaXNJbmhlcml0ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNJbmhlcml0ZWQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmI2NGU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2VzczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkdlbmVyaWNEcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5PQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgewotCi0JLy8gcHJpdmF0ZSBDb2xsZWN0aW9uIGVDbGFzc2VzOwotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiB0ZWFtUm9sZVdyYXBwZXJzOwotCXByaXZhdGUgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGRyb3BBZGFwdGVyOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJY2hpbGRyZW5GZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kKChUZWFtUHJvZmlsZSkgb3duZXIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLCBkcm9wRWxlbWVudHMsCi0JCQkJZ2V0RHJvcEFkYXB0ZXIob3duZXIpKTsKLQl9Ci0KLQlwcml2YXRlIEdlbmVyaWNEcm9wQ29tbWFuZC5FbGVtZW50QWRhcHRlciBnZXREcm9wQWRhcHRlcihPYmplY3Qgb3duZXIpIHsKLQkJQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBhZGFwdGVyID0gKEJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG93bmVyLCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBhZGFwdGVyLmNyZWF0ZURyb3BBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQkvLyBhZGQgdGVhbSByb2xlcwotCQkvLwotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWJvb2xlYW4gbnVsbEZpbHRlciA9IGZpbHRlciA9PSBudWxsOwotCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSkgb2JqZWN0OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUHJvZmlsZS5nZXRUZWFtUm9sZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCAmJiAobnVsbEZpbHRlciB8fCBmaWx0ZXIuYWNjZXB0KGRlc2MpKSkgewotCQkJCWNoaWxkcmVuLmFkZChkZXNjKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldCBwYXJlbnQgZm9yIHRoZSBjaGlsZHJlbidzIGl0ZW0gcHJvdmlkZXJzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUHJvY2Vzc1V0aWwuc2V0UGFyZW50KGl0ZXIubmV4dCgpLCBvYmplY3QsIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCi0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZGlzcG9zZSgpCi0JICovCi0JLy8gcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUm9sZVdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIElXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCS8vIHdyYXBwZXIuZGlzcG9zZSgpOwotCS8vIH0KLQkvLyB0ZWFtUm9sZVdyYXBwZXJzLmNsZWFyKCk7Ci0JLy8JCQotCS8vIHN1cGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRlYW1Qcm9maWxlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQlpZiAoZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJfHwgZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkgewotCQkJCUxpc3Qgc3ViVGVhbXMgPSBQcm9jZXNzVXRpbC5nZXRBZmZlY3RlZEVsZW1lbnRzKG5vdGlmaWNhdGlvbiwKLQkJCQkJCW51bGwpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1YlRlYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlUZWFtUHJvZmlsZSBzdWJUZWFtID0gKFRlYW1Qcm9maWxlKSBpdGVyLm5leHQoKTsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9Db250YWluZXIoc3ViVGVhbSwgdGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fVEVBTV9ST0xFUzoKLQkJCUxpc3QgZWxlbWVudHMgPSBQcm9jZXNzVXRpbC5nZXRBZmZlY3RlZEVsZW1lbnRzKG5vdGlmaWNhdGlvbiwgbnVsbCk7Ci0JCQlldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQlib29sZWFuIHJlZnJlc2hUZWFtID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGV2ZW50VHlwZSA9PSBOb3RpZmljYXRpb24uQURECi0JCQkJCQl8fCBldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERF9NQU5ZKSB7Ci0JCQkJCVByb2Nlc3NVdGlsLmFkZFRvQ29udGFpbmVyKGUsIHRoaXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJaWYgKGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQlyZWZyZXNoVGVhbSA9IHRydWU7CQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBlLAotCQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWZyZXNoVGVhbSkgewotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtUHJvZmlsZSA9IChUZWFtUHJvZmlsZSkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgdGVhbVByb2ZpbGUsCi0JCQkJCWZhbHNlLCB0cnVlKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUHJvZmlsZS5nZXRUZWFtUm9sZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJcm9sZURlc2NyaXB0b3IsIGZhbHNlLCB0cnVlKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQUFJFU1NFRDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0T0JTRWNsYXNzZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgZmxvYXQsIGludCwgaW50LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlPYmplY3Qgb3duZXIsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwKLQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9CU0RyYWdBbmREcm9wQ29tbWFuZChkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywKLQkJCQlvcGVyYXRpb24sIGNvbGxlY3Rpb24pCi0JCS8vIHsKLQkJLy8gcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQkvLyBDb2xsZWN0aW9uIHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gUm9sZURlc2NyaXB0b3IgZGVzYyA9IChSb2xlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCS8vIHdyYXBwZXJzLmFkZChUbmdVdGlsLmdldFdyYXBwZXIodGVhbVJvbGVXcmFwcGVycywgZGVzYy5nZXRSb2xlKCkpKTsKLQkJLy8gfQotCQkvLyByZXR1cm4gd3JhcHBlcnM7Ci0JCS8vIH0KLQkJLy8gfQotCQk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0b3JFeGlzdHMoT2JqZWN0IHJvbGUpIHsKLQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpIGdldFRhcmdldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0ZWFtUHJvZmlsZS5nZXRUZWFtUm9sZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIGRlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGRlc2MuZ2V0Um9sZSgpID09IHJvbGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIgY3JlYXRlRHJvcEFkYXB0ZXIoKSB7Ci0JCWlmIChkcm9wQWRhcHRlciA9PSBudWxsKSB7Ci0JCQlkcm9wQWRhcHRlciA9IG5ldyBHZW5lcmljRHJvcENvbW1hbmQuRWxlbWVudEFkYXB0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGFkYXB0KE9iamVjdCBkcm9wRWxlbWVudCkgewotCQkJCQlpZiAoZHJvcEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlCi0JCQkJCQkJJiYgIWRlc2NyaXB0b3JFeGlzdHMoZHJvcEVsZW1lbnQpCi0JCQkJCS8vICYmIFRuZ1V0aWwuZ2V0V3JhcHBlcih0ZWFtUm9sZVdyYXBwZXJzLCBkcm9wRWxlbWVudCkgPT0KLQkJCQkJLy8gbnVsbAotCQkJCQkpIHsKLQkJCQkJCXJldHVybiBQcm9jZXNzVXRpbAotCQkJCQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKFJvbGUpIGRyb3BFbGVtZW50KTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGRyb3BBZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKChUZWFtUHJvZmlsZSkgb2JqZWN0KQotCQkJCQkuZ2V0U3VwZXJUZWFtKCkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wZXJ0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpKSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKChUZWFtUHJvZmlsZSkgcGFyZW50KTsKLQkJCUxpc3QgbGlzdCA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQkJaW50IGxvY2F0aW9uID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCWlmIChvYmouZXF1YWxzKGxpc3QuZ2V0KGkpKSkgewotCQkJCQlsb2NhdGlvbiA9IGk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJKChFTGlzdCkgdGVhbS5nZXRTdWJUZWFtKCkpLm1vdmUobG9jYXRpb24sIGxvY2F0aW9uIC0gMSk7Ci0KLQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gdGhpcy5nZXRBY3Rpdml0eShvYmopOwotCQkJVG5nVXRpbC5tb3ZlVXAoYWN0aXZpdHksIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEb3duKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlRG93bigoQWN0aXZpdHkpIHBhcmVudCwgb2JqLCBnZXRFQ2xhc3NlcygpLCBhY3Rpb25NZ3IpOwotCQl9Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIHBhcmVudDsKLQkJCUxpc3QgbGlzdCA9IHRlYW0uZ2V0U3ViVGVhbSgpOwotCQkJaW50IGxvY2F0aW9uID0gMDsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJaWYgKG9iai5lcXVhbHMobGlzdC5nZXQoaSkpKSB7Ci0JCQkJCWxvY2F0aW9uID0gaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkoKEVMaXN0KSB0ZWFtLmdldFN1YlRlYW0oKSkubW92ZShsb2NhdGlvbiwgbG9jYXRpb24gKyAxKTsKLQotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSB0aGlzLmdldEFjdGl2aXR5KG9iaik7Ci0JCQlUbmdVdGlsLm1vdmVEb3duKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoT2JqZWN0IG9iamVjdCkgewotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqZWN0KTsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJcmV0dXJuIChBY3Rpdml0eSkgcGFyZW50OwotCQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdVdGlsCi0JCQkJCS5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpOwotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9UZWFtUHJvZmlsZVdyYXBwZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3YjdiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcihUZWFtUHJvZmlsZSB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyKFRlYW1Qcm9maWxlIHZhbHVlLCBPYmplY3Qgb3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgaW50IGluZGV4LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcih2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyI2dldEF0dHJpYnV0ZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoKChUZWFtUHJvZmlsZSkgVG5nVXRpbAotCQkJCQkudW53cmFwKG9iamVjdCkpLmdldFN1cGVyVGVhbSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QXR0cmlidXRlKG9iamVjdCwgcHJvcGVydHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkNTNhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5XQlNEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhqYXZhLnV0aWwuQ29sbGVjdGlvbiwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoQ29sbGVjdGlvbiBuZXdDaGlsZERlc2NyaXB0b3JzLAotCQkJT2JqZWN0IG9iamVjdCkgewotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcihVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVBY3Rpdml0eSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZU1pbGVzdG9uZSgpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudG5nLnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc0NoaWxkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0QXNDaGlsZChPYmplY3QgY2hpbGQpIHsKLQkJY2hpbGQgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCWlmKGNoaWxkIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgY2hpbGQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcgotCQkJCXx8IGNoaWxkIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNDaGlsZChjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldE9iamVjdChvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRPYmplY3QoRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiAoKFRhc2tEZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRUYXNrKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgY3JlYXRlRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJT2JqZWN0IG93bmVyLCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sCi0JCQlDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJFTlRFUjoKLQkJLy8gY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNjcmVhdGVEcmFnQW5kRHJvcENvbW1hbmQoZG9tYWluLAotCQkvLyBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbikiKTsKLQkJQ29tbWFuZCBjbWQgPSBuZXcgV0JTRHJhZ0FuZERyb3BDb21tYW5kKGRvbWFpbiwgb3duZXIsIGxvY2F0aW9uLAotCQkJCW9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0KLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIgY2FuIGV4ZWN1dGU6ICIgKyBjbWQuY2FuRXhlY3V0ZSgpKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIgb3duZXI6ICIgKyBvd25lcik7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIGNvbGxlY3Rpb246ICIgKyBjb2xsZWN0aW9uKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIgbG9jYXRpb246ICIgKyBsb2NhdGlvbik7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiIG9wZXJhdGlvbnM6ICIgKyBvcGVyYXRpb25zKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIgb3BlcmF0aW9uOiAiICsgb3BlcmF0aW9uKTsKLQkJLy8gICAgICAgIAotCQkvLyBTeXN0ZW0ub3V0Ci0JCS8vIC5wcmludGxuKCJFWElUOgotCQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyYWdBbmREcm9wQ29tbWFuZChkb21haW4sCi0JCS8vIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKSIpOwotCQlyZXR1cm4gY21kOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlQXdhcmVDb21tYW5kIGNyZWF0ZURyb3BDb21tYW5kKE9iamVjdCBvd25lciwKLQkJCUxpc3QgZHJvcEVsZW1lbnRzKSB7Ci0JCXJldHVybiBuZXcgV0JTRHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgZHJvcEVsZW1lbnRzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRBc1JvbGxlZFVwQ2hpbGQoT2JqZWN0IGNoaWxkKSB7Ci0JCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCWlmKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0QXNSb2xsZWRVcENoaWxkKG9iaik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q29sdW1uSW1hZ2UoamF2YS5sYW5nLk9iamVjdCwKLQkvLyBpbnQpCi0JLy8gKi8KLQkvLyBwdWJsaWMgT2JqZWN0IGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCS8vIEJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KW9iamVjdDsKLQkvLyBTdHJpbmcgcHJvcGVydHkgPSAoU3RyaW5nKSBjb2x1bW5JbmRleFRvTmFtZU1hcC5nZXQobmV3Ci0JLy8gSW50ZWdlcihjb2x1bW5JbmRleCkpOwotCS8vIEJvb2xlYW4gYiA9IG51bGw7Ci0JLy8gaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkvLyBiID0gZS5nZXRJc0V2ZW50RHJpdmVuKCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JLy8gYiA9IGUuZ2V0SXNPbmdvaW5nKCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JLy8gYiA9IGUuZ2V0SXNSZXBlYXRhYmxlKCk7Ci0JLy8gfQotCS8vIGlmKGIgIT0gbnVsbCkgewotCS8vIGlmKGIuYm9vbGVhblZhbHVlKCkpIHsKLQkvLyByZXR1cm4gVG5nRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZSgiY2hlY2tlZF9ib3giKTsKLQkvLyB9Ci0JLy8gZWxzZSB7Ci0JLy8gcmV0dXJuIFRuZ0VkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0SW1hZ2UoInVuY2hlY2tlZF9ib3giKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBzdXBlci5nZXRDb2x1bW5JbWFnZShvYmplY3QsIGNvbHVtbkluZGV4KTsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFdCU0VjbGFzc2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjcmVmcmVzaENoaWxkcmVuRGF0YShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24sCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoQ2hpbGRyZW5EYXRhKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlMaXN0IGFmZmVjdGVkQ2hpbGRyZW4pIHsKLQkJLy8gcmVjYWxjdWxhdGUgdGhlIElEcyBvZiBicmVha2Rvd24gZWxlbWVudHMgYW5kIHJlZnJlc2ggdGhlbQotCQkvLwotCQlQcm9jZXNzIHRvcEFjdCA9IChQcm9jZXNzKSBnZXRUb3BJdGVtKCk7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCi0JCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhyb290QWRhcHRlckZhY3RvcnksIHRvcEFjdCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZG9SZWZyZXNoQWZmZWN0ZWRWaWV3ZXJzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKSB7Ci0JCU9iamVjdCBwcm9jID0gZ2V0VG9wSXRlbSgpOwotCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQocHJvYywKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJKChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIpCi0JCQkJCS5zZXRSZWZyZXNoQWxsSURzUmVxdWlyZWQodHJ1ZSk7Ci0JCX0KLQotCQlQcm9jZXNzVXRpbAotCQkJCS5yZWZyZXNoSURzSW5WaWV3ZXJzKChFeHBvc2VkQWRhcHRlckZhY3RvcnkpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCk7Ci0JCXVwZGF0ZUNhY2hlZENoaWxkcmVuKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nUm9sbHVwTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAob2JqZWN0KSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaXNXcmFwcGluZ1JvbGx1cE5lZWRlZChvYmplY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlUm9sbHVwV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwZXIuY3JlYXRlUm9sbHVwV3JhcHBlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXJldHVybiBuZXcgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKHdyYXBwZXIsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZUNvbXBvc2VkV3JhcHBlcihPYmplY3Qgb2JqZWN0LCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcihvYmplY3QsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5NZXJnZShTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gcHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCB8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUwotCQkJCQl8fCBwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk87Ci0JCQl9Ci0JCX07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3MzgyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIHsKLQotCXB1YmxpYyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElUYWJsZUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQnJlYWtkb3duQWRhcHRlckZhY3RvcnkjY3JlYXRlUGhhc2VBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5CcmVha2Rvd25BZGFwdGVyRmFjdG9yeSNjcmVhdGVQaGFzZUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZVByb2Nlc3NBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUV2ZW50V3JhcHBlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShJUHJvcGVydHlDaGFuZ2VFdmVudFdyYXBwZXIgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKExpYnJhcnlFZGl0Q29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpKSB7Ci0JCQlzZXRDb2x1bW5JbmRleFRvTmFtZU1hcChQcm9jZXNzVXRpbAotCQkJCQkudG9Db2x1bW5JbmRleFRvTmFtZU1hcCgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlmMDlhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIHsKLQotCS8vIHByaXZhdGUgQ29sbGVjdGlvbiBlQ2xhc3NlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdCU01pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkvLyByZXR1cm4gVG5nVXRpbC5nZXRBbGxDaGlsZHJlbigoUHJvY2Vzc0NvbnRyaWJ1dGlvbikgb2JqZWN0LAotCS8vIHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCksCi0JLy8gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlckZhY3RvcnkpKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZQotCS8vIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0RWxlbWVudHMoamF2YS5sYW5nLk9iamVjdCkKLQkvLyAqLwotCS8vIHB1YmxpYyBDb2xsZWN0aW9uIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkvLyBDb2xsZWN0aW9uIGVsZW1lbnRzID0gc3VwZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQkvLyByZXR1cm4gZWxlbWVudHM7Ci0JLy8gfQotCi0JLy8gcHVibGljIExpc3QgZ2V0RmlsdGVyZWRCcmVha2Rvd25FbGVtZW50cyhPYmplY3QgYWN0aXZpdHksIE9iamVjdCBvYmopCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gTGlzdCBicmVha2Rvd25FbGVtZW50cyA9ICgoQWN0aXZpdHkpYWN0aXZpdHkpLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JLy8gZm9yIChJdGVyYXRvciBpdCA9IGJyZWFrZG93bkVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspCi0JLy8gewotCS8vIE9iamVjdCBlbGVtZW50T2JqID0gaXQubmV4dCgpOwotCS8vIGlmICgoZWxlbWVudE9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mCi0JLy8gTWlsZXN0b25lKSB8fCAoZWxlbWVudE9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkvLyB7Ci0JLy8gZWxlbWVudHMuYWRkKGVsZW1lbnRPYmopOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGVsZW1lbnRzOwotCS8vIH0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwuZ2V0V0JTRWNsYXNzZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY1N2RiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9XQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciB7Ci0KLQlwcml2YXRlIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0KLQlwdWJsaWMgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCQl0aGlzLmRlbGVnYXRlSXRlbVByb3ZpZGVyID0gZGVsZWdhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkFjdGl2aXR5SXRlbVByb3ZpZGVyI2dldFByb3BlcnR5RGVzY3JpcHRvcnMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkJCQkJLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzkyNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtPcmRlckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuV29ya09yZGVySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8vIC8qIChub24tSmF2YWRvYykKLQkvLyAqIEBzZWUKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkvLyBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcikKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkvLyBFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JLy8gcmV0dXJuIG5ldyBNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kKGRvbWFpbiwgb3duZXIsIGhlbHBlcik7Ci0JLy8gfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLkRlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDkzMTk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi1pbXBsZW1lbnRzIElDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlcgotewotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNhY2hlZENoaWxkcmVuOwotCQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KE9iamVjdCBvYmplY3QpIHsKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KQotCQkJCXJldHVybiAoQWN0aXZpdHkpIHBhcmVudDsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RGVzY3JpcHRvcihBY3Rpdml0eSBhY3Rpdml0eSwgQXJ0aWZhY3QgYXJ0aWZhY3QpIHsKLQkJaWYgKGFjdGl2aXR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBsaXN0ID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBsaXN0LmdldChpKTsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkmJiAoYXJ0aWZhY3QgPT0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iaikKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQlyZXR1cm4gb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW5GZWF0dXJlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuRmVhdHVyZXMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKQotCQkvLyB7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkpOwotCQkvLyB9Ci0JCS8vIHJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgewotLy8JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250YWluZWRBcnRpZmFjdERlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHdwRGVzYyk7Ci0JCWlmKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSB3cERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCUxpc3QgbGlzdCA9IGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCWlmKHNpemUgPiAwKSB7Ci0JCQkJQXJyYXlMaXN0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCQkJT2JqZWN0IGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKGFjdGl2aXR5LCAoQXJ0aWZhY3QpIGxpc3QKLQkJCQkJCQkuZ2V0KGkpKTsKLQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJYXJ0aWZhY3REZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIWFydGlmYWN0RGVzY3JpcHRvcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCUNvbGxlY3Rpb25zLnNvcnQoYXJ0aWZhY3REZXNjcmlwdG9ycywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbChhcnRpZmFjdERlc2NyaXB0b3JzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCQotCQkvLyBkb24ndCBzaG93IHRoZSBjaGlsZHJlbiBvZiB0aGUgbm9uLWRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JCS8vIHRoYXQgaXMgZGVsaXZlcmFibGUgcGFydCBvZiBhIGRlbGl2ZXJhYmxlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yCi0JCS8vCi0JCWlmKCEod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSBUbmdVdGlsLnVud3JhcChnZXRQYXJlbnQob2JqZWN0KSk7Ci0JCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQkJJiYgKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsJCQkJCi0JCQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpOwotCi0JCS8vIGFkZCBkZWxpdmVyYWJsZSBwYXJ0cwotCQkvLwotCQlpZighd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChkZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGRlc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gZ2V0IGRlc2NyaXB0b3JzIG9mIGNvbnRhaW5lZCBhcnRpZmFjdHMKLQkJLy8JCQotCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJYWRkQ29udGFpbmVkQXJ0aWZhY3REZXNjcmlwdG9ycyh3cERlc2MsIGNoaWxkcmVuKTsKLQkJfQotCi0JCS8vIHNldCBwYXJlbnQKLQkJLy8KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBnZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYUZhY3RvcnkuYWRhcHQoaXRlcgotCQkJCQkubmV4dCgpLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJYWRhcHRlci5zZXRQYXJlbnQob2JqZWN0KTsKLQkJfQotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oY2hpbGRyZW4pOwotCQkKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGNoaWxkcmVuIGZyb20gY2FjaGUsIGZpbGwgdGhlIGNoaWxkcmVuIGNhY2hlIGlmIGl0IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotCQkJY2FjaGVkQ2hpbGRyZW4gPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpKSB7Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE86Ci0vLwkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLS8vCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPOgotLy8JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlMaXN0IGVsZW1lbnRzID0gUHJvY2Vzc1V0aWwuZ2V0QWZmZWN0ZWRFbGVtZW50cyhub3RpZmljYXRpb24sIG51bGwpOwotCQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCWJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChldmVudFR5cGUgPT0gTm90aWZpY2F0aW9uLkFERAotCQkJCQkJfHwgZXZlbnRUeXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWSkgewotCQkJCQlQcm9jZXNzVXRpbC5hZGRUb0NvbnRhaW5lcihlLCB0aGlzLCBmYWxzZSk7Ci0JCQkJfQotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpICE9IG51bGwpIHsKLQkJCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGUsCi0JCQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZWZyZXNoID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWZyZXNoKSB7Ci0JCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCX0KLQotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpOwotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIHdwZCwgZmFsc2UsCi0JCQkJCXRydWUpKTsKLQkJCWlmICh3cGQuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZGVzY3JpcHRvciA9IGl0ZXIubmV4dCgpOwotCQkJCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQlkZXNjcmlwdG9yLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEOgotCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlXb3JrUHJvZHVjdCB3cDsKLQkJCWJvb2xlYW4gY29udGVudFJlZnJlc2ggPSBub3RpZmllciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkJCSYmICgod3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcilub3RpZmllcikuZ2V0V29ya1Byb2R1Y3QoKSkgaW5zdGFuY2VvZiBBcnRpZmFjdAotCQkJCQkJfHwgd3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSk7Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBjb250ZW50UmVmcmVzaCwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXIjc2V0QXR0cmlidXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcCwgU3RyaW5nIHR4dCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0OwotCi0JCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpIHsKLQkJCXdwZC5zZXRBY3Rpdml0eUVudHJ5U3RhdGUodHh0KTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJd3BkLnNldEFjdGl2aXR5RXhpdFN0YXRlKHR4dCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdXBlci5zZXRBdHRyaWJ1dGUob2JqZWN0LCBwcm9wLCB0eHQpOwotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzVG9wTGV2ZWxBcnRpZmFjdEluQWN0aXZpdHkoQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdAotCS8vIG9iaikKLQkvLyB7Ci0JLy8gQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyRmFjdG9yeSk7Ci0JLy8gICAgICAgIAotCS8vIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKQotCS8vIGFGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIENvbGxlY3Rpb24gY2hpbGRyZW4gPSBhZGFwdGVyLmdldENoaWxkcmVuKGFjdGl2aXR5KTsKLQkvLyBpZiAoY2hpbGRyZW4uY29udGFpbnMob2JqKSkKLQkvLyB7Ci0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oImNoaWxkIC0gIiArIG9iaik7Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFQ2xhc3NlcygpIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLmdldFBCU0VjbGFzc2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVwKE9iamVjdCBvYmosIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlPYmplY3QgcGFyZW50ID0gdGhpcy5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJVG5nVXRpbC5tb3ZlVXAoKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3A7Ci0JCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQkJV29ya1Byb2R1Y3Qgb2JqV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJCQlpbnQgbG9jYXRpb24gPSAwOwotCQkJCS8vIExpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKG9ialdQLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJKChFTGlzdCkgYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLm1vdmUobG9jYXRpb24sCi0JCQkJCQlsb2NhdGlvbiAtIDEpOwotCQkJfQotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZVVwKGFjdGl2aXR5LCBvYmosIGdldEVDbGFzc2VzKCksIGFjdGlvbk1ncik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlRG93bihPYmplY3Qgb2JqLCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IpIHsKLQkJT2JqZWN0IHBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KG9iaik7Ci0JCWlmICgocGFyZW50ICE9IG51bGwpICYmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCVRuZ1V0aWwubW92ZURvd24oKEFjdGl2aXR5KSBwYXJlbnQsIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAocGFyZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgcGFyZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgd3A7Ci0JCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQkJV29ya1Byb2R1Y3Qgb2JqV1AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJCQlpbnQgbG9jYXRpb24gPSAwOwotCQkJCS8vIExpc3QgbmV3TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKG9ialdQLmVxdWFscyhsaXN0LmdldChpKSkpIHsKLQkJCQkJCWxvY2F0aW9uID0gaTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJKChFTGlzdCkgYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLm1vdmUobG9jYXRpb24sCi0JCQkJCQlsb2NhdGlvbiArIDEpOwotCQkJfQotCi0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IHRoaXMuZ2V0QWN0aXZpdHkob2JqKTsKLQkJCVRuZ1V0aWwubW92ZURvd24oYWN0aXZpdHksIG9iaiwgZ2V0RUNsYXNzZXMoKSwgYWN0aW9uTWdyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVDcmVhdGVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBoZWxwZXIpIHsKLQkJcmV0dXJuIG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZmFjdG9yUmVtb3ZlQ29tbWFuZChvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbiwgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyKQotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGZhY3RvclJlbW92ZUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIENvbW1hbmRQYXJhbWV0ZXIgY29tbWFuZFBhcmFtZXRlcikgewotCQlpZighKGNvbW1hbmRQYXJhbWV0ZXIuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJQWN0aXZpdHkgYWN0ID0gZ2V0QWN0aXZpdHkodGFyZ2V0KTsKLQkJCWlmKGFjdCAhPSBudWxsKSB7Ci0JCQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0LCBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCQkJY29tbWFuZFBhcmFtZXRlci5zZXRPd25lcihhY3QpOwotCQkJCXJldHVybiBhZGFwdGVyLmNyZWF0ZUNvbW1hbmQoYWN0LCBkb21haW4sIFJlbW92ZUNvbW1hbmQuY2xhc3MsIGNvbW1hbmRQYXJhbWV0ZXIpOwkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZmFjdG9yUmVtb3ZlQ29tbWFuZChkb21haW4sIGNvbW1hbmRQYXJhbWV0ZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJLy8gRVBGIGJ1ZyM6IDE0NDgyMCBTb21lIG5lc3RlZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgc2hvdyB3cm9uZyBtb2RlbCBpbmZvIGluIHdvcmsgcHJvZHVjdCB1c2FnZSB2aWV3Ci0JCS8vIGZvciBkZWZlY3QsIG92ZXJyaWRlIHRoZSBtZXRob2QsIHByZXZpb3VzbHkgRGVzY3JpcHRvckl0ZW1Qcm92aWRlLmdldEF0dHJpYnV0ZSB1c2UgdG8gaGF2ZSB0aGlzIGNvZGUsIG1vdmVkIHRvIGhlcmUuIAotCQlpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPKSB7Ci0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLS8vCQkJCQlQcm9jZXNzVXRpbC5nZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLAotLy8JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqZWN0KTsKLQkJCQkJUHJvY2Vzc1V0aWwuZ2V0V1BETW9kZWxJbmZvKG1vZGVsSW5mbywgb2JqZWN0LCB0aGlzKTsKLQkJCQl9Ci0vLwkJCX0KLQkJCXJldHVybiBtb2RlbEluZm8udG9TdHJpbmcoKTsgCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTEwM2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB7Ci0JCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoT2JqZWN0IHZhbHVlLCBPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHZhbHVlLCBvd25lciwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHBhcmFtIG93bmVyCi0JICogQHBhcmFtIGluZGV4Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcigKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB2YWx1ZSwgT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIodmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlBZGRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eUFkZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1NzVhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eUFkZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1lc3NlbmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuZG9tYWluLlRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLQotLyoqCi0gKiBBZGRDb21tYW5kIGZvciBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAxNiwgMjAwNQotICogQHNpbmNlIDEuMAotICogQHNlZSAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5QWRkQ29tbWFuZCBleHRlbmRzIFByb2Nlc3NFbGVtZW50QWRkQ29tbWFuZCB7Ci0JcHJpdmF0ZSBMaXN0IHByb2NQYWNrYWdlczsKLQotCS8qKgotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHVibGljIEFjdGl2aXR5QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgZ2V0Q29weVRvT3JpZ2luYWxNYXAoKSB7Ci0JCUVkaXRpbmdEb21haW4gZWQgPSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQlpZiAoZWQgaW5zdGFuY2VvZiBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCXJldHVybiAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpCi0JCQkJCS5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5UHJvY2Vzc1BhY2thZ2VzKCkgewotCQlpZiAocHJvY1BhY2thZ2VzID09IG51bGwpIHsKLQkJCWlmIChoYXNDb3B5VG9PcmlnaW5hbE1hcCgpKSB7Ci0JCQkJYm9vbGVhbiBzaG93V2FybmluZyA9IGZhbHNlOwotCQkJCXByb2NQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlBcnJheUxpc3Q8QWN0aXZpdHk+IGNvcGllZEFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQkvLyBjaGVjayBmaXJzdCBlbGVtZW50IG9mIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpCi0JCQkJLy8gaWYgaXQncyBhIGtleSBpbiB0aGUgQ29weVRvT3JpZ2luYWxNYXAsIHdlIGFyZSBwYXN0aW5nIGFuZAotCQkJCS8vIG1heSBuZWVkIHRvIHdhcm4gdGhlIHVzZXIKLQkJCQkvLyBpZiBpdCdzIG5vdCBhIGtleSBpbiB0aGUgQ29weVRvT3JpZ2luYWxNYXAsIHRoZW4gd2UgYXJlCi0JCQkJLy8gcHJvYmFibHkgYWRkaW5nIGEgbmV3IGVsZW1lbnQJCQkJCi0JCQkJaWYgKGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpICE9IG51bGwKLQkJCQkJCSYmIGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnNpemUoKSA+IDAKLQkJCQkJCSYmIGdldE9yaWdpbmFsKGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnRvQXJyYXkoKVswXSkgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJQWN0aXZpdHkgb3JpZyA9IChBY3Rpdml0eSkgZ2V0T3JpZ2luYWwoZWxlbWVudCk7Ci0JCQkJCQkJaWYgKG9yaWcgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAob3JpZy5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCQkJCQkJcHJvY1BhY2thZ2VzLmFkZChvcmlnLmVDb250YWluZXIoKSk7Ci0JCQkJCQkJCQljb3BpZWRBY3Rpdml0aWVzLmFkZCgoQWN0aXZpdHkpIGVsZW1lbnQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJc2hvd1dhcm5pbmcgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzaG93V2FybmluZykgewotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0UKLQkJCQkJCQkuc2hvd1dhcm5pbmcoCi0JCQkJCQkJCQlnZXRMYWJlbCgpLAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuQWN0aXZpdHlBZGRDb21tYW5kX29yaWdpbmFsTm90Rm91bmRXYXJuaW5nX21zZyk7Ci0JCQkJfQotCi0JCQkJaWYgKCFwcm9jUGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIGNvcHkgdGhlIFByb2Nlc3NQYWNrYWdlIG9mIHRoZSBvcmlnaW5hbCBBY3Rpdml0eSB0byBhZGQKLQkJCQkJLy8gaXQgdG8gdGhlIFByb2Nlc3NQYWNrYWdlCi0JCQkJCS8vIG9mIHRoZSB0YXJnZXQgQWN0aXZpdHkuCi0JCQkJCS8vCi0JCQkJCS8vIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gbmV3Ci0JCQkJCS8vIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpCi0JCQkJCS8vICwgbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCkpOwotCQkJCQlDb21tYW5kIGNvbW1hbmQgPSBDb3B5Q29tbWFuZC5jcmVhdGUoCi0JCQkJCQkJYWRkQ29tbWFuZC5nZXREb21haW4oKSwgcHJvY1BhY2thZ2VzKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCi0JCQkJCQkvLyBSZWZyZXNoIHRoZSBBZGRDb21tYW5kLmNvbGxlY3Rpb24gd2l0aCBuZXcgYWN0aXZpdHkgY29waWVzLgotCQkJCQkJLy8KLQkJCQkJCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoYWRkQ29tbWFuZC5nZXRDb2xsZWN0aW9uKCkpOwotCQkJCQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpOwkJCQkJCQotCQkJCQkJZWxlbWVudHMuY2xlYXIoKTsJCi0JCQkJCQlDb2xsZWN0aW9uIGNvbCA9IGNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQlBcnJheUxpc3Q8UHJvY2Vzc1BhY2thZ2U+IHByb2NQa2dDb3BpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NQYWNrYWdlPihjb2wpOwotLy8JCQkJCQlBcnJheUxpc3Q8UHJvY2Vzc1BhY2thZ2U+IHByb2NQa2dDb3BpZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3NQYWNrYWdlPihjb21tYW5kLmdldFJlc3VsdCgpKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaW50IGluZGV4ID0gY29waWVkQWN0aXZpdGllcy5pbmRleE9mKGVsZW1lbnQpOwotCQkJCQkJCWlmKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCVByb2Nlc3NQYWNrYWdlIGNvcHkgPSBwcm9jUGtnQ29waWVzLmdldChpbmRleCk7Ci0JCQkJCQkJCWVsZW1lbnQgPSBnZXRBY3Rpdml0eUNvcHkoY29weSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJY29tbWFuZC5kaXNwb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGdldEFjdGl2aXR5Q29weShQcm9jZXNzUGFja2FnZSBjb3B5KSB7Ci0JCWlmIChjb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJQWN0aXZpdHkgYWN0Q29weSA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY29weSkKLQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCS8vIGNvcHkgZGF0YSBmcm9tIFByb2Nlc3NDb21wb25lbnQgdG8gYSBuZXcKLQkJCS8vIFByb2Nlc3NQYWNrYWdlCi0JCQlQcm9jZXNzUGFja2FnZSBwa2dDb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2dDb3B5LnNldE5hbWUoYWN0Q29weS5nZXROYW1lKCkpOwotCQkJcGtnQ29weS5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0Q29weSk7Ci0JCQlwa2dDb3B5LmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJY29weS5nZXRQcm9jZXNzRWxlbWVudHMoKSk7Ci0JCQlwa2dDb3B5LmdldERpYWdyYW1zKCkKLQkJCQkJLmFkZEFsbChjb3B5LmdldERpYWdyYW1zKCkpOwotCQkJcGtnQ29weS5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkQWxsKAotCQkJCQljb3B5LmdldENoaWxkUGFja2FnZXMoKSk7Ci0KLQkJCXJldHVybiBhY3RDb3B5OwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCXJldHVybiAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlwcmVwYXJlQWRkTGlzdCgpOwotCQljb3B5UHJvY2Vzc1BhY2thZ2VzKCk7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZSBpcyBhIGNoaWxkLCBkaXJlY3Qgb3Igb2YgYWN0Ci0JICogCi0JICogQHBhcmFtIGFjdAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZE9mKE9iamVjdCBwYXJlbnQsIE9iamVjdCBlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGUgPT0gY2hpbGQpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChpc0NoaWxkT2YoY2hpbGQsIGUpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBlbHNlIGlmKHBhcmVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkvLyBXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXBhcmVudCkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJLy8gaWYod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkvLyBpZihlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCS8vIGlmKFVtYVV0aWwuaXNDb250YWluZWRCeSgoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpLAotCQkvLyB3cCkpIHsKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZE9mKENvbGxlY3Rpb24gZWxlbWVudHMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJaWYgKGlzQ2hpbGRPZihpdGVyLm5leHQoKSwgZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBoYXNDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJRWRpdGluZ0RvbWFpbiBlZCA9IGFkZENvbW1hbmQuZ2V0RG9tYWluKCk7Ci0JCWlmIChlZCBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSAoKFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWQpOwotCQkJcmV0dXJuIChlZGl0aW5nRG9tYWluLmdldENvcHlUb09yaWdpbmFsTWFwKCkgIT0gbnVsbCAmJgotCQkJCQkhZWRpdGluZ0RvbWFpbi5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpLmlzRW1wdHkoKSkKLQkJCQl8fCAoZWRpdGluZ0RvbWFpbi5nZXRDbGlwYm9hcmRUb09yaWdpbmFsTWFwKCkgIT0gbnVsbCAmJgotCQkJCQkJIWVkaXRpbmdEb21haW4uZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpLmlzRW1wdHkoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIE9iamVjdCBnZXRPcmlnaW5hbChPYmplY3QgY29weSkgewotCQlUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gZWQgPSAoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQlPYmplY3Qgb3JpZ2luYWwgPSBlZC5nZXRDb3B5VG9PcmlnaW5hbE1hcCgpLmdldChjb3B5KTsKLQkJaWYob3JpZ2luYWwgPT0gbnVsbCAmJiBlZC5nZXRDbGlwYm9hcmRUb09yaWdpbmFsTWFwKCkgIT0gbnVsbCkgewotCQkJb3JpZ2luYWwgPSBlZC5nZXRDbGlwYm9hcmRUb09yaWdpbmFsTWFwKCkuZ2V0KGNvcHkpOwotCQl9Ci0JCXJldHVybiBvcmlnaW5hbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlcGFyZUFkZExpc3QoKSB7Ci0JCS8vIGNsZWFudXAgZWxlbWVudCBsaXN0IGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIGFjdGl2aXR5IHRvIGF2b2lkIGFkZGluZwotCQkvLyBlbGVtZW50cyBtdWx0aXBsZSB0aW1lcwotCQkvLwkJCi0JCWlmIChoYXNDb3B5VG9PcmlnaW5hbE1hcCgpKSB7Ci0JCQlBcnJheUxpc3Qgb3JpZ2luYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJTWFwIG9yaWdpbmFsVG9Db3B5TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBvcmlnaW5hbCA9IGdldE9yaWdpbmFsKGVsZW1lbnQpOwotCQkJCWlmIChvcmlnaW5hbCAhPSBudWxsKSB7Ci0JCQkJCW9yaWdpbmFscy5hZGQob3JpZ2luYWwpOwotCQkJCQlvcmlnaW5hbFRvQ29weU1hcC5wdXQob3JpZ2luYWwsIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJQXJyYXlMaXN0IHJlbW92ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkvLyBBcnJheUxpc3QgYWRkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yaWdpbmFscy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChpc0NoaWxkT2Yob3JpZ2luYWxzLCBlbGVtZW50KSkgewotCQkJCQlyZW1vdmVMaXN0LmFkZChvcmlnaW5hbFRvQ29weU1hcC5nZXQoZWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCWFkZENvbW1hbmQuZ2V0Q29sbGVjdGlvbigpLnJlbW92ZUFsbChyZW1vdmVMaXN0KTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RGVlcENvcHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODE0NzRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5RGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZS5MaXRlcmFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uZmlndXJhdGlvblNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29uc3RyYWludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkRlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSURpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogUGh5c2ljYWxseSBjb3BpZXMgYW4gYWN0aXZpdHkgd2l0aCBhbGwgb2YgaXRzIGRpcmVjdCBvciBpbmhlcml0ZWQgc3RydWN0dXJhbCBmZWF0dXJlcyBhbmQgcmVmZXJlbmNlcy4KLSAqICAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGV4dGVuZHMgQ29weUNvbW1hbmQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcyA9IHsKLQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gZGlhZ3JhbVR5cGVzID0gewotCQlJRGlhZ3JhbU1hbmFnZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sCi0JCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNLAotCQlJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBBZGFwdGVyRmFjdG9yeVtdIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yaWVzOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEVkaXRpbmdEb21haW4gZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4gewotCi0JCS8qKgotCQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkJICogQHBhcmFtIGNvbW1hbmRTdGFjawotCQkgKi8KLQkJcHVibGljIEVkaXRpbmdEb21haW4oKSB7Ci0JCQlzdXBlcihUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCBuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluI2NyZWF0ZUNvbW1hbmQoamF2YS5sYW5nLkNsYXNzLCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXIpCi0JCSAqLwotCQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENsYXNzIGNvbW1hbmRDbGFzcywgQ29tbWFuZFBhcmFtZXRlciBjb21tYW5kUGFyYW1ldGVyKSB7Ci0JCQlpZihjb21tYW5kQ2xhc3MgPT0gQ3JlYXRlQ29weUNvbW1hbmQuY2xhc3MpIHsKLQkJCQlyZXR1cm4gbmV3IENyZWF0ZURlZXBDb3B5Q29tbWFuZCh0aGlzLCBjb21tYW5kUGFyYW1ldGVyLmdldEVPd25lcigpLCAoSGVscGVyKSBjb21tYW5kUGFyYW1ldGVyLmdldFZhbHVlKCkpOwotCQkJfQotCQkJaWYoY29tbWFuZENsYXNzID09IEluaXRpYWxpemVDb3B5Q29tbWFuZC5jbGFzcykgewotCQkJCXJldHVybiBuZXcgSW5pdGlhbGl6ZURlZXBDb3B5Q29tbWFuZCh0aGlzLCBjb21tYW5kUGFyYW1ldGVyLmdldEVPd25lcigpLCAoSGVscGVyKSBjb21tYW5kUGFyYW1ldGVyLmdldFZhbHVlKCkpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbW1hbmQoY29tbWFuZENsYXNzLCBjb21tYW5kUGFyYW1ldGVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDcmVhdGVDb3B5Q29tbWFuZHMoQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZCwKLQkJCUVPYmplY3Qgb2JqZWN0KSB7Ci0KLQkJLy8gT3BlcmF0aW9uIHRvIGhhbmRsZSBjb3B5IHJlcGxhY2VycyBvZiB0aGUgY2hpbGQgYWN0aXZpdGllcwotCQkvLyAKLQkJaWYgKGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMgJiYgb2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgb2JqZWN0ICE9IHRoaXMuYWN0aXZpdHkuZUNvbnRhaW5lcigpKSB7CQkJCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2Upb2JqZWN0OwotCQkJYm9vbGVhbiBpc1JlcGxhY2VkID0gZmFsc2U7Ci0JCQlBY3Rpdml0eSByZXBsYWNlciA9IG51bGw7Ci0JCQlBY3Rpdml0eSBvcmlnbmFsQWN0aXZpdHkgPSBudWxsOwotCQkJZm9yKE9iamVjdCBwcm9jZXNFbGVtZW50IDogcGtnLmdldFByb2Nlc3NFbGVtZW50cygpKXsKLQkJCQlpZiAocHJvY2VzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCUFjdGl2aXR5IGNoaWxkQWN0ID0gKEFjdGl2aXR5KSBwcm9jZXNFbGVtZW50OwotCQkJCQlpZihjaGlsZEFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSB0aGlzLmFjdGl2aXR5KSB7Ci0JCQkJCQlyZXBsYWNlciA9IGdldFJlcGxhY2VyKCAoQWN0aXZpdHkpcHJvY2VzRWxlbWVudCApOwotCQkJCQkJaWYgKHJlcGxhY2VyICE9IG51bGwgKSB7Ci0JCQkJCQkJaXNSZXBsYWNlZCA9IHRydWU7Ci0JCQkJCQkJb3JpZ25hbEFjdGl2aXR5ID0gKEFjdGl2aXR5KXByb2Nlc0VsZW1lbnQ7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChpc1JlcGxhY2VkKSB7CQkJCQotCQkJCS8vIHJlc2V0IHRoZSBkZWZlcnJlZEluaXRpYWxpemF0aW9uQ291bnQgc28KLQkJCQkvLyBJbml0aWFsaXplQ29weUNvbW1hbmQgY2FuIGJlIGNyZWF0ZWQgZm9yIHRoZSBmb2xsb3dpbmcKLQkJCQkvLyBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC4gU2VlCi0JCQkJLy8gb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5wcmVwYXJlKCkgZm9yIG1vcmUKLQkJCQkvLyBkZXRhaWxzLgotCQkJCS8vCi0JCQkJY29weUhlbHBlci5kZWNyZW1lbnREZWZlcnJlZEluaXRpYWxpemF0aW9uQ291bnQoKTsKLQkJCQlBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQocmVwbGFjZXIsIChDb3B5SGVscGVyKWNvcHlIZWxwZXIsIGNvbmZpZywgCi0JCQkJCQl0YXJnZXRQcm9jZXNzLCBtb25pdG9yLCBmYWxzZSxhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCQljbWQuZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuZ3VpZExpc3QpOwotCQkJCWNtZC5ndWlkTGlzdC5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0R3VpZExpc3QoQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5hY3Rpdml0eSwgb3JpZ25hbEFjdGl2aXR5KSk7Ci0JCQkJdHJ5IHsKLQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnQ29weSA9IGNtZC5wa2dDb3B5OwkJCQkJCi0JCQkJCS8vYmFzaWMgcHV0OiBvcmlnaW5hbCBwcmMgcGtnIHRvIGNvcGllZCBwa2cgYmFzZWQgb24gcmVwbGFjZWQgcGFja2FnZS4KLQkJCQkJKChDb3B5SGVscGVyKWNvcHlIZWxwZXIpLmJhc2ljUHV0KG9iamVjdCwgcGtnQ29weSk7CQkJCi0JCQkJCS8vYmFzaWMgcHV0IG9yaWdpbmFsIGFjdGl2aXR5IHRvIHRoZSBjb3B5IG9mIHJlcGxhY2VyIGFjdGl2aXR5LgotCQkJCQkoKENvcHlIZWxwZXIpY29weUhlbHBlcikuYmFzaWNQdXQob3JpZ25hbEFjdGl2aXR5LCBjb3B5SGVscGVyLmdldChyZXBsYWNlcikpOwotCQkJCX1maW5hbGx5ewotCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCX0JCi0JCQkJLy8gcmVzdG9yZSB0aGUgZGVmZXJyZWRJbml0aWFsaXphdGlvbkNvdW50IHNvCi0JCQkJLy8gSW5pdGlhbGl6ZUNvcHlDb21tYW5kIGNhbiBiZSBjcmVhdGVkIGZvciB0aGlzCi0JCQkJLy8gQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQKLQkJCQljb3B5SGVscGVyLmluY3JlbWVudERlZmVycmVkSW5pdGlhbGl6YXRpb25Db3VudCgpOwkJCQkKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCXN1cGVyLmFkZENyZWF0ZUNvcHlDb21tYW5kcyhjb21wb3VuZENvbW1hbmQsIG9iamVjdCk7Ci0JCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIHJlcGxhY2VyIG9mIGFjdGl2aXR5IGluIHRoZSBjb3B5IGJhc2VkIGNvbmZpZ3VyYXRpb24uCi0JICogIAotCSAqIEBwYXJhbSBhY3Rpdml0eSB0YXJnZXQgYWN0aXZpdHkKLQkgKiBAcmV0dXJuIHJlcGxjYWNlciBvciBudWxsIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgZ2V0UmVwbGFjZXIoQWN0aXZpdHkgYWN0aXZpdHkpewkJCi0JCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciAhPSBudWxsICkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGNvbmZpZ1NldHRlci5nZXRPbGRDb25maWd1cmF0aW9uKCk7IAotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29weUNvbmZpZyA9IGNvbmZpZyA9PSBudWxsID8gKGN1cnJlbnRDb25maWcgIT0gbnVsbCA/IGN1cnJlbnRDb25maWcKLQkJCQkJCTogdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKQotCQkJCQkJOiBjb25maWc7Ci0JCQkJYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvcHlDb25maWcpOwkJCQkKLQotCQkJCVZhcmlhYmlsaXR5SW5mbyB2YXJpYWJpbGl0eUluZm8gPSBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yLmdldFZhcmlhYmlsaXR5SW5mbyhhY3Rpdml0eSk7Ci0KLQkJCQlpZiAodmFyaWFiaWxpdHlJbmZvICE9IG51bGwgJiYgISB2YXJpYWJpbGl0eUluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuaXNFbXB0eSgpICkgewotCQkJCQlBY3Rpdml0eSByZXBsYWNlciA9IChBY3Rpdml0eSl2YXJpYWJpbGl0eUluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCkuZ2V0KDApOwotCQkJCQlyZXR1cm4gIHJlcGxhY2VyID09IGFjdGl2aXR5ID8gbnVsbCA6IHJlcGxhY2VyOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9IGZpbmFsbHl7Ci0JCQlpZiAoY29uZmlnU2V0dGVyICE9IG51bGwgKSB7Ci0JCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgZm9yIHRoZSBjb250cmlidXRvcnMgb2YgYWN0aXZpdHkgaW4gdGhlIGNvcHkgYmFzZWQgY29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuIGEgbGlzdCBpbmNsdWRpbmcgY29udHJpYnV0b3JzIG9yIGVtcHR5IGxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRDb250cmlidXRvcnMoQWN0aXZpdHkgYWN0aXZpdHkpewotCQlDb25maWd1cmF0aW9uU2V0dGVyIGNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQl0cnkgewotCQkJaWYgKGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgIT0gbnVsbCApIHsKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBjb25maWdTZXR0ZXIuZ2V0T2xkQ29uZmlndXJhdGlvbigpOyAKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvcHlDb25maWcgPSBjb25maWcgPT0gbnVsbCA/IChjdXJyZW50Q29uZmlnICE9IG51bGwgPyBjdXJyZW50Q29uZmlnCi0JCQkJCQk6IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkKLQkJCQkJCTogY29uZmlnOwotCQkJCWFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb3B5Q29uZmlnKTsJCQkJCi0KLQkJCQlWYXJpYWJpbGl0eUluZm8gdmFyaWFiaWxpdHlJbmZvID0gYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5nZXRWYXJpYWJpbGl0eUluZm8oYWN0aXZpdHkpOwotCi0JCQkJaWYgKHZhcmlhYmlsaXR5SW5mbyAhPSBudWxsICkgewotCQkJCQlyZXR1cm4gdmFyaWFiaWxpdHlJbmZvLmdldENvbnRyaWJ1dG9ycygpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9IGZpbmFsbHl7Ci0JCQlpZiAoY29uZmlnU2V0dGVyICE9IG51bGwgKSB7Ci0JCQkJY29uZmlnU2V0dGVyLnJlc3RvcmUoKTsKLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIGNsYXNzIENyZWF0ZURlZXBDb3B5Q29tbWFuZCBleHRlbmRzIENyZWF0ZUNvcHlDb21tYW5kIHsKLQotCQkvKioKLQkJICogQHBhcmFtIGRvbWFpbgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGNvcHlIZWxwZXIKLQkJICovCi0JCXB1YmxpYyBDcmVhdGVEZWVwQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sIEVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCQlzdXBlcihkb21haW4sIG93bmVyLCBjb3B5SGVscGVyKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQjZG9HZXRDaGlsZHJlblRvQ29weSgpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbjw/PiBkb0dldENoaWxkcmVuVG9Db3B5KCkgewotCQkJQ29uZmlndXJhdGlvblNldHRlciBjb25maWdTZXR0ZXIgPSBuZXcgQ29uZmlndXJhdGlvblNldHRlcihnZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCXRyeSB7Ci0JCQkJY29uZmlnU2V0dGVyLnNldChjb25maWcpOwotCQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gY29uZmlnU2V0dGVyLmdldENvbmZpZ3VyYXRvcigpOwotCQkJCQotCQkJCS8vIENyZWF0ZSBjb21tYW5kcyB0byBjcmVhdGUgY29waWVzIG9mIHRoZSBjaGlsZHJlbi4KLQkJCQkvLwotCQkJCUxpc3Q8T2JqZWN0PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEVPYmplY3Q+IGkgPSBvd25lci5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotCQkJCXsKLQkJCQkJT2JqZWN0IG8gPSBpLm5leHQoKTsKLQkJCQkJaWYobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBBY3Rpdml0eSB3aWxsIGJlIGNvcGllZCBmaXJzdAotCQkJCQkJLy8gc28gcmVmZXJlbmNlcyB0byBpdHMgaW5oZXJpdGVkIGVsZW1lbnRzIGNhbiBiZSByZXNvbHZlZAotCQkJCQkJLy8gcHJvcGVybHkKLQkJCQkJCS8vCi0JCQkJCQlpZihjb25maWd1cmF0b3IgPT0gbnVsbCB8fCBjb25maWd1cmF0b3IuYWNjZXB0KG8pKSB7Ci0JCQkJCQkJcmVzdWx0LmFkZCgwLCBvKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3VsdC5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgY2xhc3MgSW5pdGlhbGl6ZURlZXBDb3B5Q29tbWFuZCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQgewotCQkvKioKLQkJICogTGlzdCBvZiBHVUlEcyBvZiBhY3Rpdml0eSBzdGFydGluZyBmcm9tIHRoZSB0b3AgcHJvY2VzcyB0byAKLQkJICovCi0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IGd1aWRMaXN0OwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSBkb21haW4KLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JCSAqLwotCQlwdWJsaWMgSW5pdGlhbGl6ZURlZXBDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgRU9iamVjdCBvd25lciwgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCQkJY29weSA9IChFT2JqZWN0KSBjb3B5SGVscGVyLmdldChvd25lcik7Ci0JCX0KLQkJCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZCNjb3B5UmVmZXJlbmNlcygpCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBjb3B5UmVmZXJlbmNlcygpIHsKLQkJCUFjdGl2aXR5IGJhc2UgPSBudWxsOwotCQkJQWN0aXZpdHkgYmFzZUNvcHkgPSBudWxsOwotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNoaWxkQmFzZUNvcGllcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbnVsbDsKLQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJCWJvb2xlYW4gYmFzZUFjY2VwdGVkID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG93bmVyOwotCQkJCQlpZihQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZyhhY3Rpdml0eSkpIHsKLQkJCQkJCWNvbmZpZ1NldHRlciA9IG5ldyBDb25maWd1cmF0aW9uU2V0dGVyKGdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJCQkJY29uZmlnU2V0dGVyLnNldChjb25maWcpOwotCQkJCQkJY29uZmlndXJhdG9yID0gY29uZmlnU2V0dGVyLmdldENvbmZpZ3VyYXRvcigpOwotCQkJCQkJLy8gY29weSBpbmhlcml0ZWQgZWxlbWVudHMgYnkgZGVlcC1jb3B5aW5nIGJhc2UgYWN0aXZpdHkKLQkJCQkJCS8vCi0JCQkJCQkvLyBkZWVwIGNvcHkgb2YgYmFzZSBhY3Rpdml0eSBhdCB0aGlzIHBvaW50IGlzIGVzc2VudGlhbCBzbyByZWZlcmVuY2VzIHRvIHByZWRlY2Vzc29ycwotCQkJCQkJLy8gd2lsbCBiZSBjb3BpZWQgY29ycmVjdGx5Ci0JCQkJCQkvLwotCQkJCQkJYmFzZSA9IChBY3Rpdml0eSkgYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJYmFzZUFjY2VwdGVkID0gY29uZmlndXJhdG9yID09IG51bGwgfHwgY29uZmlndXJhdG9yLmFjY2VwdChiYXNlKTsKLQkJCQkJCWlmKGJhc2VBY2NlcHRlZCkgewkJCQkJCQkKLQkJCQkJCQlDb3B5SGVscGVyIGhlbHBlciA9IChDb3B5SGVscGVyKWNvcHlIZWxwZXI7Ci0JCQkJCQkJQWN0aXZpdHkgb2xkQmFzZUNvcHkgPSAoQWN0aXZpdHkpIGhlbHBlci5nZXQoYmFzZSk7Ci0JCQkJCQkJLy8gdGhpcyB3aWxsIHJlZGlyZWN0IGFueSByZWZlcmVuY2UgdG8gY29weSBvZiBiYXNlIGluIGRpYWdyYW0gdG8gdGhlIGNvcHkgb2YgdGhlIGFjdGl2aXR5Ci0JCQkJCQkJLy8KLQkJCQkJCQloZWxwZXIucHV0VmFyaWFiaWxpdHlFbGVtZW50KGJhc2UsIGFjdGl2aXR5KTsKLQkJCQkJCQlBcnJheUxpc3QgY2hpbGRCYXNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZihlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlOwotCQkJCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2VFbGVtZW50ID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQkJCQkJaWYoYmFzZUVsZW1lbnQgIT0gbnVsbCAmJgotCQkJCQkJCQkJCQkodmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTiB8fCB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCWhlbHBlci5wdXRWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZUVsZW1lbnQsIHZlKTsKLQkJCQkJCQkJCQljaGlsZEJhc2VzLmFkZChiYXNlRWxlbWVudCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQlBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoYmFzZSwgaGVscGVyLCBjb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsIGZhbHNlLGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpOwotCQkJCQkJCWNtZC5jb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gY29weUV4dGVybmFsVmFyaWF0aW9uczsKLQkJCQkJCQljbWQuZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFjdGl2aXR5RGVlcENvcHlDb21tYW5kLnRoaXMuZ3VpZExpc3QpOwotCQkJCQkJCWNtZC5ndWlkTGlzdC5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0R3VpZExpc3QoQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5hY3Rpdml0eSwgYWN0aXZpdHkpKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQljbWQuZXhlY3V0ZSgpOwotCi0JCQkJCQkJCWJhc2VDb3B5ID0gKEFjdGl2aXR5KSBoZWxwZXIuZ2V0KGJhc2UpOwotCQkJCQkJCQlpZihhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUykgewotCQkJCQkJCQkJLy8ga2VlcCBhY3Rpdml0eSBvbmx5IGFzIGJhY2t1cCBjb3B5IG9mIGJhc2UKLQkJCQkJCQkJCS8vCi0JCQkJCQkJCQloZWxwZXIucmVtb3ZlVmFyaWFiaWxpdHlFbGVtZW50KGJhc2UpOwotCQkJCQkJCQkJaGVscGVyLnB1dEJhY2t1cENvcHkoYmFzZSwgYWN0aXZpdHkpOwotCi0JCQkJCQkJCQkvLyBwdXQgYmFjayBvbGRCYXNlQ29weQotCQkJCQkJCQkJaWYob2xkQmFzZUNvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCWhlbHBlci5iYXNpY1B1dChiYXNlLCBvbGRCYXNlQ29weSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQkvLyByZW1vdmUgdGhlIGNvcGllcyBvZiBhbGwgYmFzZSBzaW5jZSBiYXNlIGNvcGllcyBhcmUgbm90IGFkZGVkIHRvIHRoZSBwcm9jZXNzCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWhlbHBlci5yZW1vdmUoYmFzZSk7Ci0JCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkQmFzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQlFT2JqZWN0IGNoaWxkQmFzZUNvcHkgPSAoRU9iamVjdCkgaGVscGVyLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCQkJCQkJCQlpZihjaGlsZEJhc2VDb3B5ICE9IG51bGwpIHsKLQkJCQkJCQkJCQljaGlsZEJhc2VDb3BpZXMuYWRkKGNoaWxkQmFzZUNvcHkpOwotCQkJCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoY2hpbGRCYXNlQ29weS5lQ29udGFpbmVyKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKEFjdGl2aXR5KSBjb3B5OwotCi0JCQkJCQkJCS8vIHJlbW92ZSB0aGUgY29waWVzIG9mIGJhc2UgZGlhZ3JhbSBpZiB0aGUgYWN0aXZpdHkgYWxyZWFkeSBoYXZlIGRpYWdyYW0gb2YgdGhlIHNhbWUgdHlwZQotCQkJCQkJCQkvLwotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJaW50IHR5cGUgPSBkaWFncmFtVHlwZXNbaV07Ci0JCQkJCQkJCQlpZihkaWFncmFtTWdyLmdldERpYWdyYW0oYWN0aXZpdHksIHR5cGUpICE9IG51bGwpIHsKLQkJCQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBkaWFncmFtTWdyLmdldERpYWdyYW0oYWN0aXZpdHlDb3B5LCB0eXBlKTsKLQkJCQkJCQkJCQlpZihkaWFncmFtICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShkaWFncmFtKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQkvLyBtb3ZlIGNvbnRlbnQgb2YgYmFzZSBwYWNrYWdlIG92ZXIgdG8gdGhlIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJCQkJCQkvLwotCQkJCQkJCQltb3ZlQ29udGVudChjbWQucGtnQ29weSwgYWN0aXZpdHlDb3B5KTsJCi0KLQkJCQkJCQkJLy8gcmVjb3JkIHRoZSBjb3B5IG9mIHRoZSB3cmFwcGVycwotCQkJCQkJCQkvLwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYmFzZUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCWlmKCFjaGlsZEJhc2VDb3BpZXMuY29udGFpbnMoZSkpIHsKLQkJCQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IG9yaWdpbmFsID0gKEJyZWFrZG93bkVsZW1lbnQpIGhlbHBlci5nZXRPcmlnaW5hbChlKTsKLQkJCQkJCQkJCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihjbWQuZ3VpZExpc3QpOwotCQkJCQkJCQkJCWxpc3QuYWRkKG9yaWdpbmFsLmdldEd1aWQoKSk7Ci0JCQkJCQkJCQkJaGVscGVyLnB1dFdyYXBwZXJDb3B5KFByb2Nlc3NVdGlsLnRvR3VpZFBhdGgobGlzdCksIGUpOwkJCQkJCQkJCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3VwZXIuY29weVJlZmVyZW5jZXMoKTsKLQotCQkJCWlmKGJhc2UgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5Q29weSA9ICgoQWN0aXZpdHkpIGNvcHkpOwkJCQkJCi0JCQkJCQotCQkJCQlpZihiYXNlQWNjZXB0ZWQpIHsKLQkJCQkJCS8vIGNvcHkgaW5oZXJpdGVkIGJyZWFrZG93biBlbGVtZW50cyBmcm9tIHRoZSBiYXNlIGFjdGl2aXR5IGluIHRoZSByaWdodCBvcmRlcgotCQkJCQkJLy8KLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGNvbmZpZ1NldHRlci5nZXRPbGRDb25maWd1cmF0aW9uKCk7Ci0KLQkJCQkJCS8vIEFkZCBicmVha2Rvd24gZWxlbWVudHMgZnJvbSBiYXNlIGNvcHkgdG8gdGhlIGFjdGl2aXR5IGNvcHkuIAotCQkJCQkJLy8gRG9uJ3QgYWRkIGNvcHkgb2YgYmFzZSBlbGVtZW50IG9mIHRoZSBleGlzdGluZyBjaGlsZHJlbgotCQkJCQkJLy8KLQkJCQkJCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yPEJyZWFrZG93bkVsZW1lbnQ+IGl0ZXIgPSBiYXNlQ29weS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmKCFjaGlsZEJhc2VDb3BpZXMuY29udGFpbnMoZSkgJiYgKGNvbmZpZ3VyYXRvciA9PSBudWxsIHx8IGNvbmZpZ3VyYXRvci5hY2NlcHQoZSkpKSB7Ci0JCQkJCQkJCWJyZWFrZG93bkVsZW1lbnRzLmFkZChlKTsKLQkJCQkJCQl9CQkJCQkJCi0JCQkJCQl9Ci0JCQkJCQlhY3Rpdml0eUNvcHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwoMCwgYnJlYWtkb3duRWxlbWVudHMpOwotCQkJCQkJYmFzZUNvcHkuc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShiYXNlQ29weSk7Ci0KLQotCQkJCQkJLy8gY29weSBvdGhlciBzdHJpbmcgYXR0cmlidXRlcyBhcyB3ZWxsIGFmdGVyIHJlYWxpemUgdGhlbQotCQkJCQkJLy8KLQkJCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29weUNvbmZpZyA9IGNvbmZpZyA9PSBudWxsID8gKGN1cnJlbnRDb25maWcgIT0gbnVsbCA/IGN1cnJlbnRDb25maWcKLQkJCQkJCQkJOiB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpCi0JCQkJCQkJCTogY29uZmlnOwotCQkJCQkJZm9yIChFQXR0cmlidXRlIGF0dHJpYnV0ZSA6IGdldEF0dHJpYnV0ZXNUb0NvcHkoKSkgewotCQkJCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkgJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKSkgewotCQkJCQkJCQlPYmplY3QgdmFsdWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoYWN0aXZpdHksIGF0dHJpYnV0ZSwgY29weUNvbmZpZyk7Ci0JCQkJCQkJCWFjdGl2aXR5Q29weS5lU2V0KGF0dHJpYnV0ZSwgdmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gYWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCQlmb3IgKEVBdHRyaWJ1dGUgYXR0cmlidXRlIDogY29udGVudC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpKSB7Ci0JCQkJCQkJaWYgKGF0dHJpYnV0ZS5pc0NoYW5nZWFibGUoKSAmJiAhYXR0cmlidXRlLmlzRGVyaXZlZCgpCi0JCQkJCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HLmdldEluc3RhbmNlQ2xhc3MoKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldEF0dHJpYnV0ZShjb250ZW50LCBhY3Rpdml0eSwgYXR0cmlidXRlLCBjb3B5Q29uZmlnKTsKLQkJCQkJCQkJYWN0aXZpdHlDb3B5LmdldFByZXNlbnRhdGlvbigpLmVTZXQoYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gY29weSBwcmVzZW50YXRpb24gbmFtZQotCQkJCQkvLwotCQkJCQlhY3Rpdml0eUNvcHkuc2V0UHJlc2VudGF0aW9uTmFtZShQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGFjdGl2aXR5KSk7CQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gY29weSBjb250cmlidXRvcnMJCQkJCi0JCQkJaWYgKGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMgJiYgb3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiAoY29weUNvbnRyaWJ1dG9ycyB8fCBvd25lciAhPSBBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC50aGlzLmFjdGl2aXR5KSkgewotCQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSlvd25lcjsJCQkJCQotCQkJCQlMaXN0IGNvbnRyaWJ1dG9ycyA9IGdldENvbnRyaWJ1dG9ycyhhY3Rpdml0eSk7Ci0JCQkJCWlmICghY29udHJpYnV0b3JzLmlzRW1wdHkoKSkgewotCQkJCQkJZG9Db3B5Q29udHJpYnV0b3JzKGNvbnRyaWJ1dG9ycyxhY3Rpdml0eSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gY2xlYXIgdGhlIHZhcmlhYmlsaXR5IGRhdGEKLQkJCQkvLwotCQkJCWlmIChjb3B5IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKChBY3Rpdml0eSkgY29weSk7Ci0JCQkJCWFjdGl2aXR5Q29weS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG51bGwpOwotCQkJCQlhY3Rpdml0eUNvcHkuc2V0VmFyaWFiaWxpdHlUeXBlKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKGNvbmZpZ1NldHRlciAhPSBudWxsKSB7Ci0JCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihjb3B5IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3Rpdml0eUNvcHkgPSAoKEFjdGl2aXR5KSBjb3B5KTsJCQkJCQotCi0JCQkJLy8gY2xlYXIgc3VwcHJlc3Npb24gZGF0YQotCQkJCS8vCi0JCQkJQ29uc3RyYWludCBydWxlID0gQ29uc3RyYWludE1hbmFnZXIuZ2V0Q29uc3RyYWludChhY3Rpdml0eUNvcHksIENvbnN0cmFpbnRNYW5hZ2VyLlBST0NFU1NfU1VQUFJFU1NJT04sIGZhbHNlKTsKLQkJCQlpZihydWxlICE9IG51bGwpIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZShydWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQkvKioKLQkJICogQ29weSBjb250cmlidXRvcnMKLQkJICogQHBhcmFtIGNvbnRyaWJ1dG9ycwotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZG9Db3B5Q29udHJpYnV0b3JzKExpc3QgY29udHJpYnV0b3JzLCBBY3Rpdml0eSBvd25lciApIHsKLQkJCUNvbmZpZ3VyYXRpb25TZXR0ZXIgY29uZmlnU2V0dGVyID0gbmV3IENvbmZpZ3VyYXRpb25TZXR0ZXIoZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQl0cnkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGNvbmZpZ1NldHRlci5nZXRPbGRDb25maWd1cmF0aW9uKCk7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb3B5Q29uZmlnID0gY29uZmlnID09IG51bGwgPyAoY3VycmVudENvbmZpZyAhPSBudWxsID8gY3VycmVudENvbmZpZwotCQkJCQkJOiB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpCi0JCQkJCQk6IGNvbmZpZzsKLQkJCQljb25maWdTZXR0ZXIuc2V0KGNvcHlDb25maWcpOwotCQkJCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gY29uZmlnU2V0dGVyLmdldENvbmZpZ3VyYXRvcigpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb250cmlidXRvcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eSBjb250cmlidXRlZEFjdGl2aXR5ID0gKEFjdGl2aXR5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCUNvcHlIZWxwZXIgaGVscGVyID0gKENvcHlIZWxwZXIpY29weUhlbHBlcjsKLQkJCQkJQWN0aXZpdHkgY29udHJpYnV0b3JDb3B5ID0gKEFjdGl2aXR5KSBoZWxwZXIuZ2V0KGNvbnRyaWJ1dGVkQWN0aXZpdHkpOwotCQkJCQlBY3Rpdml0eURlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoY29udHJpYnV0ZWRBY3Rpdml0eSwgaGVscGVyLCAKLQkJCQkJCQljb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsIGZhbHNlLGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpOwotCQkJCQljbWQuY29weUNvbnRyaWJ1dG9ycyA9IGZhbHNlOyAvLyBkb24ndCBjb3B5IGNvbnRyaWJ1dG9yJ3MgY29udHJpYnV0b3JzIHNpbmNlIHRoZXkgYWxyZWFkeSBhcmUgaW5jbHVkZWQgaW4gdGhlIGdpdmVuIGNvbnRyaWJ1dG9ycyBsaXN0Ci0JCQkJCWNtZC5ndWlkTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5ndWlkTGlzdCk7Ci0JCQkJCWNtZC5ndWlkTGlzdC5hZGRBbGwoUHJvY2Vzc1V0aWwuZ2V0R3VpZExpc3QoQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQudGhpcy5hY3Rpdml0eSwgb3duZXIpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0KLQkJCQkJCWNvbnRyaWJ1dG9yQ29weSA9IChBY3Rpdml0eSkgaGVscGVyLmdldChjb250cmlidXRlZEFjdGl2aXR5KTsKLQotCQkJCQkJQWN0aXZpdHkgYWN0aXZpdHlDb3B5ID0gKEFjdGl2aXR5KSBjb3B5OwotCi0JCQkJCQkvLyByZW1vdmUgdGhlIGNvcGllcyBvZiBiYXNlIGRpYWdyYW0gaWYgdGhlIGFjdGl2aXR5IGFscmVhZHkgaGF2ZSBkaWFncmFtIG9mIHRoZSBzYW1lIHR5cGUKLQkJCQkJCS8vCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRpYWdyYW1UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWludCB0eXBlID0gZGlhZ3JhbVR5cGVzW2ldOwotCQkJCQkJCWlmKGRpYWdyYW1NZ3IuZ2V0RGlhZ3JhbShhY3Rpdml0eSwgdHlwZSkgIT0gbnVsbCkgewotCQkJCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBkaWFncmFtTWdyLmdldERpYWdyYW0oYWN0aXZpdHlDb3B5LCB0eXBlKTsKLQkJCQkJCQkJaWYoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlFY29yZVV0aWwucmVtb3ZlKGRpYWdyYW0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQkvLyBtb3ZlIGNvbnRlbnQgb2YgYmFzZSBwYWNrYWdlIG92ZXIgdG8gdGhlIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJCQkJLy8KLQkJCQkJCW1vdmVDb250ZW50KGNtZC5wa2dDb3B5LCBhY3Rpdml0eUNvcHkpOwkKLQotCQkJCQkJTGlzdDxCcmVha2Rvd25FbGVtZW50PiBicmVha2Rvd25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oKTsKLQkJCQkJCWZvciAoSXRlcmF0b3I8QnJlYWtkb3duRWxlbWVudD4gaXRlciA9IGNvbnRyaWJ1dG9yQ29weS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmKGNvbmZpZ3VyYXRvciA9PSBudWxsIHx8IGNvbmZpZ3VyYXRvci5hY2NlcHQoZSkpewotCQkJCQkJCQlicmVha2Rvd25FbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQkJfQkJCQkJCQotCQkJCQkJfQotCQkJCQkJYWN0aXZpdHlDb3B5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKGJyZWFrZG93bkVsZW1lbnRzKTsKLQkJCQkJCWNvbnRyaWJ1dG9yQ29weS5zZXRTdXBlckFjdGl2aXRpZXMobnVsbCk7Ci0JCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNvbnRyaWJ1dG9yQ29weSk7Ci0KLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9ZmluYWxseXsKLQkJCQlpZiAoY29uZmlnU2V0dGVyICE9IG51bGwgKSB7Ci0JCQkJCWNvbmZpZ1NldHRlci5yZXN0b3JlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlIHBrZ0NvcHk7Ci0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByb3RlY3RlZCBJRGlhZ3JhbU1hbmFnZXIgZGlhZ3JhbU1ncjsKLQotCXByb3RlY3RlZCBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBMaW5rZWRMaXN0PFN0cmluZz4gZ3VpZExpc3Q7Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0JCi0JLy91c2VkIHRvIHJldHJpZXZlIHJlcGxhY2VycyBhbmQgY29udHJpYnV0b3JzCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMgPSB0cnVlOwotCQotCXByaXZhdGUgYm9vbGVhbiBjb3B5Q29udHJpYnV0b3JzID0gdHJ1ZTsKLQkKLQlwcml2YXRlIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBDb3B5SGVscGVyIGNvcHlIZWxwZXIsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvY2VzcyB0YXJnZXRQcm9jZXNzLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBib29sZWFuIGluaXRHdWlkTGlzdCxJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpIHsKLQkJc3VwZXIobnVsbCwgYWN0aXZpdHkuZUNvbnRhaW5lcigpLCBjb3B5SGVscGVyKTsKLQkJQXNzZXJ0LmlzVHJ1ZShhY3Rpdml0eS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSwgIkFjdGl2aXR5J3MgY29udGFpbmVyIG11c3QgYmUgYSBQcm9jZXNzUGFja2FnZSIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJZG9tYWluID0gbmV3IEVkaXRpbmdEb21haW4oKTsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMudGFyZ2V0UHJvY2VzcyA9IHRhcmdldFByb2Nlc3M7Ci0JCWRpYWdyYW1NZ3IgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERpYWdyYW1NYW5hZ2VyKCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZGlhZ3JhbU1nciwgIkNvdWxkIG5vdCBsb2FkIGRpYWdyYW0gbWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCWlmKGluaXRHdWlkTGlzdCkgewotCQkJZ3VpZExpc3QgPSBQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdChudWxsLCB0aGlzLmFjdGl2aXR5KTsKLQkJfQotCQl0aGlzLmFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgPSBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCX0KLQkKLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIENvcHlIZWxwZXIgY29weUhlbHBlciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQcm9jZXNzIHRhcmdldFByb2Nlc3MsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcikgewotCQl0aGlzKGFjdGl2aXR5LCBjb3B5SGVscGVyLCBjb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsIHRydWUsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7CQkKLQl9Ci0JCi0JcHVibGljIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKE9iamVjdCBhY3Rpdml0eU9yV3JhcHBlciwgQ29weUhlbHBlciBjb3B5SGVscGVyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IpIHsKLQkJdGhpcygoQWN0aXZpdHkpVG5nVXRpbC51bndyYXAoYWN0aXZpdHlPcldyYXBwZXIpLCBjb3B5SGVscGVyLCBjb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsIAotCQkJCWFjdGl2aXR5T3JXcmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHksYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCWlmKGFjdGl2aXR5T3JXcmFwcGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGFjdGl2aXR5T3JXcmFwcGVyOwotCQkJZ3VpZExpc3QgPSBQcm9jZXNzVXRpbC5nZXRHdWlkTGlzdCh3cmFwcGVyKTsKLQkJfQotCX0JCi0JCi0JcHVibGljIHZvaWQgc2V0Q29weUV4dGVybmFsVmFyaWF0aW9ucyhib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMpIHsKLQkJdGhpcy5jb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gY29weUV4dGVybmFsVmFyaWF0aW9uczsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCW1vbml0b3Iuc3ViVGFzayhOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5jb3B5aW5nQWN0aXZpdGllc19tc2csIFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoYWN0aXZpdHkpKSk7Ci0JCXN1cGVyLmV4ZWN1dGUoKTsKLQkJQ29sbGVjdGlvbjw/PiByZXN1bHQgPSBzdXBlci5nZXRSZXN1bHQoKTsKLQkJaWYoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCXBrZ0NvcHkgPSAoUHJvY2Vzc1BhY2thZ2UpIHJlc3VsdC5pdGVyYXRvcigpLm5leHQoKTsKLQkJCWZpeFByb2Nlc3NDb21wb25lbnQoKTsKLQkJCXJlcGxhY2VUZXh0UmVmZXJlbmNlcygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGZpeCB0aGUgcHJvY2VzcyBjb21wb25lbnQgdG8gbWFrZSBpdCBhIHByb2Nlc3MgcGFja2FnZS4KLQkgKiBUaGlzIG1ldGhvZCBtaWdodCBiZSBvdmVycmlkZW4gYnkgc3ViY2xhc3MgdG8gYWNoaXZlIGRpZmZlcmVuY2UgcmVzdWx0LgotCSAqIEZvciBleGFtcGxlLCAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXhQcm9jZXNzQ29tcG9uZW50KCkgewotCQlpZihwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJLy8gcmVwbGFjZSB0aGUgUHJvY2Vzc0NvbXBvbmVudCB3aXRoIGEgZXF1aXZhbGVudCBQcm9jZXNzUGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdChwa2dDb3B5LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCQlmZWF0dXJlcy5yZXRhaW5BbGwocGtnLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCB2YWx1ZSA9IHBrZ0NvcHkuZUdldChmZWF0dXJlKTsKLQkJCQlwa2cuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpOwotCQkJaWYocHJvYyAhPSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZCgwLCBwcm9jKTsKLQkJCX0KLQkJCXBrZ0NvcHkgPSBwa2c7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBJZiB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBpbiB0aGUgY29waWVkIGVsZW1lbnRzIGNvbnRhaW4gcmVmZXJlbmNlcyAoVVJMcykgdG8gb3RoZXIgZWxlbWVudHMgCi0JICogd2l0aGluIHRoZSBzYW1lIGNvcGllZCBwcm9jZXNzIHRoZW4gcmVwbGFjZSB0aGVzZSByZWZlcmVuY2VzIHdpdGggcmVmZXJlbmNlcyB0aGF0IHBvaW50IHRvIAotCSAqIHRoZSBuZXcgZWxlbWVudHMgaW4gdGhlIGNvcGllZCBzdHJ1Y3R1cmVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2VUZXh0UmVmZXJlbmNlcygpIHsKLQkJSVRleHRSZWZlcmVuY2VSZXBsYWNlciB0eHRSZWZSZXBsYWNlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0VGV4dFJlZmVyZW5jZVJlcGxhY2VyKCk7Ci0JCWlmKHR4dFJlZlJlcGxhY2VyID09IG51bGwpIHJldHVybjsKLQotCQlNYXAgb2xkVG9OZXdPYmplY3RNYXAgPSAoKENvcHlIZWxwZXIpIGNvcHlIZWxwZXIpLmdldE9iamVjdFRvQ29weU1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2dDb3B5LmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgYXR0cmlidXRlcyA9IGVsZW1lbnQuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOyBhdHRyaWJ1dGVzLmhhc05leHQoKTsgKQotCQkJewotCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGUuaXNDaGFuZ2VhYmxlKCkgJiYgIWF0dHJpYnV0ZS5pc0Rlcml2ZWQoKSAmJiAoYXR0cmlidXRlLmlzTWFueSgpIHx8IGVsZW1lbnQuZUlzU2V0KGF0dHJpYnV0ZSkpCi0JCQkJCQkmJiBhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gTGl0ZXJhbHMuU1RSSU5HLmdldEluc3RhbmNlQ2xhc3MoKSkKLQkJCQl7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gKFN0cmluZykgZWxlbWVudC5lR2V0KGF0dHJpYnV0ZSk7Ci0JCQkJCWlmKHRleHQgIT0gbnVsbCkgewotCQkJCQkJdGV4dCA9IHR4dFJlZlJlcGxhY2VyLnJlcGxhY2UodGV4dCwgdGFyZ2V0UHJvY2Vzcywgb2xkVG9OZXdPYmplY3RNYXApOwotCQkJCQkJZWxlbWVudC5lU2V0KGF0dHJpYnV0ZSwgdGV4dCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFJlc3VsdCgpIHsKLQkJaWYocGtnQ29weSAhPSBudWxsKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5maW5kQWN0aXZpdHkocGtnQ29weSk7Ci0JCQlpZihhY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCQotCS8qKgotCSAqIE1vdmVzIGNvbnRlbnQgb2Ygc291cmNlIG9iamVjdCA8Y29kZT5zcmM8L2NvZGU+IG92ZXIgdG8gdGhlIHRhcmdldCBvYmplYyA8Y29kZT50YXJnZXQ8L2NvZGU+Ci0JICogQHBhcmFtIHNyYwotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1vdmVDb250ZW50KFByb2Nlc3NQYWNrYWdlIHNyYywgQWN0aXZpdHkgYWN0KSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHRhcmdldCA9IChQcm9jZXNzUGFja2FnZSkgYWN0LmVDb250YWluZXIoKTsKLQkJLy8gbW92ZSBjb250ZW50IG9mIGJhc2UgcGFja2FnZSBvdmVyIHRvIHRoZSBhY3Rpdml0eSdzIHBhY2thZ2UJCQkJCQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KHNyYy5lQ29udGVudHMoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGUuZUNvbnRhaW5pbmdGZWF0dXJlKCk7CQkJCQkJCi0JCQlpZihmLmlzTWFueSgpKSB7Ci0JCQkJKChMaXN0KXRhcmdldC5lR2V0KGYpKS5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJaWYoc3JjIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBiYXNlQ29weSA9ICgoUHJvY2Vzc0NvbXBvbmVudClzcmMpLmdldFByb2Nlc3MoKTsKLQkJCXRhcmdldC5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYmFzZUNvcHkpOwotCQl9Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQnJlYWtkb3duRWxlbWVudCBnZXRUb3BFbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZihlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUJyZWFrZG93bkVsZW1lbnQgdG9wID0gZTsKLQkJZm9yKEJyZWFrZG93bkVsZW1lbnQgbyA9IGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IG8gIT0gbnVsbDsgbyA9IG8uZ2V0U3VwZXJBY3Rpdml0aWVzKCkpIHsKLQkJCXRvcCA9IG87Ci0JCX0KLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weVN1cHByZXNzaW9uU3RhdGVzKCkgewotCQlDb2xsZWN0aW9uPD8+IHJlc3VsdCA9IGdldFJlc3VsdCgpOwotCQlpZihyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIHdyYXBwZXJQYXRoID0gd3JhcHBlciAhPSBudWxsID8gUHJvY2Vzc1V0aWwudG9HdWlkUGF0aChndWlkTGlzdCkgOiBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkYXB0ZXJGYWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllc1tpXTsKLQkJCWJvb2xlYW4gaXNXQlMgPSBhZGFwdGVyRmFjdG9yeSA9PSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPSBudWxsOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbnVsbDsKLQkJCWlmKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCQljb25maWd1cmF0b3IgPSAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyOwotCQkJCWN1cnJlbnRDb25maWcgPSBjb25maWd1cmF0b3IuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJCWNvbmZpZ3VyYXRvci5zZXRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmZpbmRBY3Rpdml0eSgoUHJvY2Vzc1BhY2thZ2UpIG93bmVyKTsKLQkJCQlQcm9jZXNzVXRpbC5pbml0aWFsaXplSXRlbVByb3ZpZGVyUGF0aChhY3QsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCURlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjw/PiBpdGVyID0gbmV3IERlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KGFkYXB0ZXJGYWN0b3J5LCBwcm9jKTsKLQkJCQlpbnQgZGVwdGhMZXZlbCA9IC0xOwotCQkJCWZpbmRfZGVlcF9jb3BpZWRfYWN0aXZpdHk6Ci0JCQkJCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQotCQkJCQkJLy8gc2V0IGRlcHRoIGxldmVsIGlmIHRoZSBjdXJyZW50IGNoaWxkIGlzIHRoZSBkZWVwLWNvcGllZCBhY3Rpdml0eQotCQkJCQkJLy8KLQkJCQkJCWlmKHdyYXBwZXIgPT0gbnVsbCkgewotCQkJCQkJCWlmKGNoaWxkID09IGFjdGl2aXR5KSB7Ci0JCQkJCQkJCWRlcHRoTGV2ZWwgPSBpdGVyLmdldERlcHRoTGV2ZWwoKTsKLQkJCQkJCQkJYnJlYWsgZmluZF9kZWVwX2NvcGllZF9hY3Rpdml0eTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCVN0cmluZyBwYXRoID0gU3VwcHJlc3Npb24uZ2V0UGF0aFdpdGhvdXRWaWV3VHlwZSgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGNoaWxkKS50b1N0cmluZygpOwotCQkJCQkJCQlpZih3cmFwcGVyUGF0aC5lcXVhbHMocGF0aCkpIHsKLQkJCQkJCQkJCWRlcHRoTGV2ZWwgPSBpdGVyLmdldERlcHRoTGV2ZWwoKTsKLQkJCQkJCQkJCWJyZWFrIGZpbmRfZGVlcF9jb3BpZWRfYWN0aXZpdHk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkKLQkJCQkJfQotCQkJCQotCQkJCS8vIGNvcHkgc3VwcHJlc3Npb24gc3RhdGUgb2YgYWxsIHN1cHByZXNzZWQgZWxlbWVudHMgdW5kZXIgZGVlcC1jb3BpZWQgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUNvcHlIZWxwZXIgaGVscGVyID0gKENvcHlIZWxwZXIpY29weUhlbHBlcjsKLQkJCQlNYXA8PywgPz4gb3JpZ2luYWxUb0NvcHlNYXAgPSBoZWxwZXIuZ2V0T2JqZWN0VG9Db3B5TWFwKCk7Ci0JCQkJTWFwPE9iamVjdCwgT2JqZWN0PiBlbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwID0gbnVsbDsKLQkJCQlpZihpc1dCUykgewotCQkJCQllbGVtZW50T3JXcmFwcGVyVG9Db3B5TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7Ci0JCQkJCUFjdGl2aXR5IGRlZXBDb3B5ID0gKEFjdGl2aXR5KSByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCWVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAucHV0KHdyYXBwZXIgIT0gbnVsbCA/IHdyYXBwZXIgOiBhY3Rpdml0eSwgZGVlcENvcHkpOwotCQkJCX0KLQkJCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoaXRlci5nZXREZXB0aExldmVsKCkgPiBkZXB0aExldmVsKSB7Ci0JCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQkJaWYoIWlzV0JTICYmIGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQkvLyBza2lwIGNvcHlpbmcgc3VwcHJlc3Npb24gc3RhdGUgYW5kIG9yZGVyaW5nCi0JCQkJCQkJCS8vIGJyZWFrZG93biBlbGVtZW50cyBmb3IgYWN0aXZpdHkgaW4gb3RoZXIgdmlldwotCQkJCQkJCQkvLyB0aGFuIFdCUwotCQkJCQkJCQkvLwotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0vLwkJCQkJCQlCcmVha2Rvd25FbGVtZW50IG9yaWdpbmFsID0gKEJyZWFrZG93bkVsZW1lbnQpIGU7Ci0vLwkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGNvcHkgPSAoQnJlYWtkb3duRWxlbWVudCkgb3JpZ2luYWxUb0NvcHlNYXAuZ2V0KG9yaWdpbmFsKTsKLS8vCQkJCQkJCQotLy8JCQkJCQkJaWYoVG5nVXRpbC5ERUJVRykgewotLy8JCQkJCQkJCVN0cmluZyBjb3B5TmFtZSA9IChjb3B5ICE9IG51bGwgPyBjb3B5LmdldE5hbWUoKSA6IG51bGwpOwotLy8JCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgdG9wID0gZ2V0VG9wRWxlbWVudChjb3B5KTsKLS8vCQkJCQkJCQlpZihjb3B5ID09IG51bGwgfHwgIW9yaWdpbmFsLmdldE5hbWUoKS5lcXVhbHMoY29weU5hbWUpIHx8IHRvcCAhPSBkZWVwQ29weSkgewotLy8JCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIm9yaWdpbmFsOiAnIiArIG9yaWdpbmFsLmdldE5hbWUoKSArICInLCBjb3B5OiAnIiArIGNvcHlOYW1lICsgIicsIGNvcHkncyB0b3AgYWN0aXZpdHk6ICIgKyB0b3ApOwotLy8JCQkJCQkJCX0KLS8vCQkJCQkJCX0KLQkJCQkJCQlCcmVha2Rvd25FbGVtZW50IGNvcHkgPSBudWxsOwotCQkJCQkJCWJvb2xlYW4gaXNTdXBwcmVzc2VkID0gc3VwcHJlc3Npb24uaXNTdXBwcmVzc2VkKGNoaWxkKTsKLQkJCQkJCQkKLQkJCQkJCQkvLyBmaW5kIGNvcHkgdG8gc3VwcHJlc3Mgb3IsIGlmIGVsZW1lbnQgaXMgYW4gYWN0aXZpdHksIHRvIHJlb3JkZXIgaXRzIGJyZWFrZG93biBlbGVtZW50cwotCQkJCQkJCS8vCi0JCQkJCQkJaWYoaXNTdXBwcmVzc2VkIHx8IGlzV0JTKSB7Ci0JCQkJCQkJCWlmKGNoaWxkID09IGUpIHsJCi0JCQkJCQkJCQljb3B5ID0gKEJyZWFrZG93bkVsZW1lbnQpIG9yaWdpbmFsVG9Db3B5TWFwLmdldChlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmKGNoaWxkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNoaWxkV3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQ7Ci0JCQkJCQkJCQlpZihjaGlsZFdyYXBwZXIuaXNJbmhlcml0ZWQoKSkgewotCQkJCQkJCQkJCVN0cmluZyBndWlkUGF0aCA9IFN1cHByZXNzaW9uLmdldFBhdGhXaXRob3V0Vmlld1R5cGUoY2hpbGRXcmFwcGVyKS50b1N0cmluZygpOwotCQkJCQkJCQkJCWNvcHkgPSBoZWxwZXIuZ2V0V3JhcHBlckNvcHkoZ3VpZFBhdGgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKGNvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYoaXNTdXBwcmVzc2VkKSB7Ci0JCQkJCQkJCQkJY29weS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4uVFJVRSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZihpc1dCUykgewotCQkJCQkJCQkJCWVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAucHV0KGNoaWxkLCBjb3B5KTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHJlb3JkZXIgYnJlYWtkb3duIGVsZW1lbnRzIG9mIGFjdGl2aXRpZXMKLQkJCQkvLwotCQkJCWlmKGlzV0JTKSB7Ci0JCQkJCWZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IGVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAuZW50cnlTZXQoKSkgewotCQkJCQkJT2JqZWN0IG8gPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCU9iamVjdCBjb3B5ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCWlmKGNvcHkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG8sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJQ29sbGVjdGlvbjw/PiBjaGlsZHJlbiA9IGlwLmdldENoaWxkcmVuKG8pOwotCQkJCQkJCUVMaXN0PD8+IGxpc3QgPSAgKEVMaXN0PD8+KSAoKEFjdGl2aXR5KSBjb3B5KS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQkJCQkJCUxpc3Q8Pz4gY2hpbGRyZW5MaXN0ID0gY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0PD8+ID8gKExpc3Q8Pz4pIGNoaWxkcmVuIDogbmV3IEFycmF5TGlzdDxPYmplY3Q+KGNoaWxkcmVuKTsKLQkJCQkJCQlpbnQgc2l6ZSA9IGNoaWxkcmVuTGlzdC5zaXplKCk7Ci0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW5MaXN0LmdldChqKTsKLQkJCQkJCQkJT2JqZWN0IGNoaWxkQ29weSA9IGVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAuZ2V0KGNoaWxkKTsKLQkJCQkJCQkJaWYoY2hpbGRDb3B5ICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmKGogPCBzaXplIC0gMSkgewotCQkJCQkJCQkJCU9iamVjdCBuZXh0Q2hpbGQgPSBjaGlsZHJlbkxpc3QuZ2V0KGogKyAxKTsKLQkJCQkJCQkJCQlPYmplY3QgbmV4dENoaWxkQ29weSA9IGVsZW1lbnRPcldyYXBwZXJUb0NvcHlNYXAuZ2V0KG5leHRDaGlsZCk7CQotCQkJCQkJCQkJCWlmKG5leHRDaGlsZENvcHkgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlpbnQgc3VjY0lkID0gbGlzdC5pbmRleE9mKG5leHRDaGlsZENvcHkpOwotCQkJCQkJCQkJCQlpZihzdWNjSWQgIT0gLTEpIHsKLQkJCQkJCQkJCQkJCWludCBpZCA9IGxpc3QuaW5kZXhPZihjaGlsZENvcHkpOwotCQkJCQkJCQkJCQkJaWYoaWQgIT0gc3VjY0lkIC0gMSkgewotCQkJCQkJCQkJCQkJCWlmKGlkIDwgc3VjY0lkKSB7Ci0JCQkJCQkJCQkJCQkJCWxpc3QubW92ZShzdWNjSWQgLSAxLCBpZCk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQkJCQlsaXN0Lm1vdmUoaWQsIHN1Y2NJZCk7Ci0JCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9CQkJCQkJCQkJCQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIGlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFbGVtZW50IGRvZXMgbm90IGhhdmUgY29weTogIiArIG5leHRDaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVsZW1lbnQgZG9lcyBub3QgaGF2ZSBjb3B5OiAiICsgY2hpbGQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIENvcHlIZWxwZXIgZ2V0Q29weUhlbHBlcigpIHsKLQkJcmV0dXJuIChDb3B5SGVscGVyKSBjb3B5SGVscGVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eURyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YzFmM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWN0aXZpdHlEcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLklBY3Rpb25UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFjdGl2aXR5SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiBEcm9wIGNvbW1hbmQgZm9yIGFjdGl2aXR5IHRoYXQgc3VwcG9ydHMgZXh0ZW5kLCBjb3B5LCBhbmQgZGVlcCBjb3B5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCi0JcHJpdmF0ZSBPYmplY3Qgdmlld2VyOwotCi0JcHJpdmF0ZSBMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBvbGRQYXR0ZXJuczsKLQotCXByaXZhdGUgTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gcGF0dGVybnM7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyB0YXJnZXRQcm9jZXNzOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVsaXZlcnlQcm9jZXNzOwotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248QWN0aXZpdHk+IGFwcGxpZWRBY3Rpdml0aWVzOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJvdGVjdGVkIEFjdGl2aXR5SGFuZGxlciBhY3Rpdml0eUhhbmRsZXI7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlZDsKLQotCXByb3RlY3RlZCBIYXNoU2V0PD8+IGFkZGVkT2JqZWN0czsKLQkKLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCi0JcHVibGljIEFjdGl2aXR5RHJvcENvbW1hbmQoQWN0aXZpdHkgdGFyZ2V0LCBMaXN0IGFjdGl2aXRpZXMsIE9iamVjdCB2aWV3ZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKHRhcmdldCwgYWN0aXZpdGllcyk7Ci0JCXNldExhYmVsKExpYnJhcnlFZGl0UmVzb3VyY2VzLkFjdGl2aXR5RHJvcENvbW1hbmRfbGFiZWwpOyAKLQkJdGhpcy52aWV3ZXIgPSB2aWV3ZXI7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGFyZ2V0UHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXJnZXQpOwotCQkKLQkJaXNEZWxpdmVyeVByb2Nlc3MgPSB0YXJnZXRQcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzOwotCQlpZiAoaXNEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCW9sZFBhdHRlcm5zID0gbmV3IEFycmF5TGlzdCgoKERlbGl2ZXJ5UHJvY2VzcykgdGFyZ2V0UHJvY2VzcykKLQkJCQkJLmdldEluY2x1ZGVzUGF0dGVybnMoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIEFjdGl2aXR5RHJvcENvbW1hbmQoQWN0aXZpdHkgdGFyZ2V0LCBMaXN0IGFjdGl2aXRpZXMsIE9iamVjdCB2aWV3ZXIsIAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksSUNvbmZpZ3VyYXRvciBkZWVwQ29weUNvbmZpZ3VyYXRvcil7Ci0JCXRoaXModGFyZ2V0LCBhY3Rpdml0aWVzLCB2aWV3ZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJdGhpcy5hY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yID0gZGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByZXBhcmVEcm9wRWxlbWVudHMoKSB7Ci0JCS8vIHJlbW92ZSBhbnkgZHJvcCBlbGVtZW50IHRoYXQgaXMgc3VwcHJlc3MKLQkJLy8KLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50KTsKLQkJCWlmKHByb2MgIT0gbnVsbCkgewotCQkJCVN1cHByZXNzaW9uIHN1cHAgPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQlpZihzdXBwLmlzU3VwcHJlc3NlZChlbGVtZW50KSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXN1cGVyLnByZXBhcmVEcm9wRWxlbWVudHMoKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCWlmKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpIHsKLQkJCXJ1bkFzSm9iID0gdHJ1ZTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NvcHkoKSB7Ci0JCWZvciAoT2JqZWN0IGUgOiBkcm9wRWxlbWVudHMpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaXJjdWxhcigoQWN0aXZpdHkpIGUpOwotCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0V4dGVuZCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQotLy8JCQlpZiAoKFByb2Nlc3NVdGlsLmhhc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcigoQWN0aXZpdHkpIGVsZW1lbnQpKSl7Ci0vLwkJCQljYW5FeHRlbmQgPSBmYWxzZTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0vLwkJCWlmICh0YXJnZXRQcm9jZXNzLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBwcm9jKSB7Ci0vLwkJCQljYW5FeHRlbmQgPSBmYWxzZTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuICYmIHByb2MgIT0gdGFyZ2V0UHJvY2VzcykgewotLy8JCQkJY2FuRXh0ZW5kID0gdHJ1ZTsKLS8vCQkJCWJyZWFrOwotLy8JCQl9Ci0JCQkKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaXRlci5uZXh0KCk7Ci0JCQlQcm9jZXNzIHNyY1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCWlmKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgJiYgc3JjUHJvYyAhPSB0YXJnZXRQcm9jZXNzKSB7Ci0JCQkJLy8gY2Fubm90IGV4dGVuZCBhIGRpZmZlcmVudCBkZWxpdmVyeSBwcm9jZXNzIG9yIGFueSBvZiBpdHMgYWN0aXZpdGllcwotCQkJCS8vCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAwLAotCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY2Fubm90X2NvcHlfb3JfZXh0ZW5kX2RlbGl2ZXJ5X3Byb2Nlc3MsCi0JCQkJCQludWxsKTsKLQkJCX0KLQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaXJjdWxhcihhY3QpOwotCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcml2YXRlIElTdGF0dXMgY2hlY2tDaXJjdWxhcihBY3Rpdml0eSBhY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCWlmIChEZXBlbmRlbmN5Q2hlY2tlci5uZXdDaGVja0FjdCkgewotCQkJcmVzdWx0ID0gRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudAotCQkJCQkJCShhY3Rpdml0eSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhY3QpLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYWN0aXZpdHkpLmlzT0soKTsKLQkJfQotCQlpZighcmVzdWx0KSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnLAotCQkJCQludWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUlBY3Rpb25UeXBlUHJvdmlkZXIgYWN0aW9uVHlwZVByb3ZpZGVyID0gKElBY3Rpb25UeXBlUHJvdmlkZXIpIHZpZXdlcjsKLQkJaWYgKCB2aWV3ZXIgIT0gbnVsbCkgewotCQkJdmlld2VyID0gbnVsbDsKLQkJCWJvb2xlYW4gY2FuQ29weSA9IGNoZWNrQ29weSgpLmlzT0soKTsKLQkJCWJvb2xlYW4gY2FuRXh0ZW5kID0gY2hlY2tFeHRlbmQoKS5pc09LKCk7Ci0JCQlpbnRbXSBjaG9pY2VzID0gbmV3IGludFsxICsgKGNhbkNvcHkgPyAxIDogMCkgKyAoY2FuRXh0ZW5kID8gMSA6IDApXTsKLQkJCWludCBpID0gMDsKLQkJCWlmKGNhbkNvcHkpIHsKLQkJCQljaG9pY2VzW2krK10gPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkNPUFk7Ci0JCQl9Ci0JCQlpZihjYW5FeHRlbmQpIHsKLQkJCQljaG9pY2VzW2krK10gPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORDsKLQkJCX0KLQkJCWNob2ljZXNbaV0gPSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWTsKLQkJCQotCQkJLy8gZGVsZWdhdGUgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNvbW1hbmQKLQkJCS8vCi0JCQlhY3Rpb25UeXBlUHJvdmlkZXIuZXhlY3V0ZSh0aGlzLCBjaG9pY2VzKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYWN0aXZpdHlIYW5kbGVyID0gbmV3IEFjdGl2aXR5SGFuZGxlcigpOwotCQl0cnkgewotCQkJaWYgKHR5cGUgPT0gSUFjdGlvblR5cGVQcm92aWRlci5ERUVQX0NPUFkpIHsKLQkJCQlkb0RlZXBDb3B5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWFjdGl2aXR5SGFuZGxlci5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWN0aXZpdHlEcm9wQ29tbWFuZC5leGVjdXRlKCk6IGRvbmUiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRGVlcENvcHkoKSB7Ci0JCWlmKCFVc2VySW50ZXJhY3Rpb25IZWxwZXIuY29uZmlybURlZXBDb3B5KGRyb3BFbGVtZW50cykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWRlZXBDb3B5Q29uZmlnID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNob29zZURlZXBDb3B5Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnM7Ci0JCXRyeSB7Ci0JCQljb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gVXNlckludGVyYWN0aW9uSGVscGVyLmNvcHlFeHRlcm5hbFZhcmlhdGlvbnNBbGxvd2VkKHRhcmdldFByb2Nlc3MsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfQotCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47CQkJCi0JCX0KLQkJYWN0aXZpdHlIYW5kbGVyLnNldENvcHlFeHRlcm5hbFZhcmlhdGlvbnMoY29weUV4dGVybmFsVmFyaWF0aW9ucyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXREZWVwQ29weUNvbmZpZyhkZWVwQ29weUNvbmZpZyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5zZXRUYXJnZXRQcm9jZXNzKHRhcmdldFByb2Nlc3MpOwotCQkKLQkJLy8gU2V0IGEgY29uZmlndXJhdG9yIHRvIHJlc29sdmUgYW5kIGRlZXAgY29weSBjb250cmlidXRvcnMgYW5kIHJlcGxhY2VycwotCQlhY3Rpdml0eUhhbmRsZXIuc2V0QWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcihhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKTsKLQkJCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJYWN0aXZpdHlIYW5kbGVyLnNldE1vbml0b3IobW9uaXRvcik7Ci0JCQkJcHJlRXhlY3V0ZWQgPSBwcmVFeGVjdXRlKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZ2V0TGFiZWwoKSk7CQkJCi0JCWlmIChwcmVFeGVjdXRlZCkgewotCQkJcmVkbygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBwcm9jZXNzIHRoZSBzZWxlY3RlZCBhY3Rpdml0aWVzIGFuZCBkZWVwLWNvcHkgdGhlIHZhbGlkIG9uZXMKLQkJLy8KLQkJaWYgKGlzRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlwYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+KCk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkKLQkJCS8vICYmIGVsZW1lbnQgIT0gdGFyZ2V0Ci0JCQkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJCi0vLwkJCQlpZih0eXBlID09IElBY3Rpb25UeXBlUHJvdmlkZXIuREVFUF9DT1BZKSB7Ci0vLwkJCQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGFjdCk7Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLS8vCQkJCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuICYmIHByb2MgIT0gdGFyZ2V0UHJvY2VzcykgewotLy8JCQkJCQlpZiAodHlwZSA9PSBJQWN0aW9uVHlwZVByb3ZpZGVyLkVYVEVORCkgewotLy8JCQkJCQkJYWN0aXZpdHlIYW5kbGVyLmV4dGVuZChhY3QpOwotLy8JCQkJCQkJaWYgKHBhdHRlcm5zICE9IG51bGwpCi0vLwkJCQkJCQkJcGF0dGVybnMuYWRkKHByb2MpOwotLy8JCQkJCQl9IGVsc2UgewotLy8JCQkJCQkJYWN0aXZpdHlIYW5kbGVyLmNvcHkoYWN0KTsKLS8vCQkJCQkJfQotLy8JCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCWFjdGl2aXR5SGFuZGxlci5jb3B5KGFjdCk7Ci0vLwkJCQkJfQotLy8JCQkJfQotCQkJCQotCQkJCXN3aXRjaCh0eXBlKSB7Ci0JCQkJY2FzZSBJQWN0aW9uVHlwZVByb3ZpZGVyLkRFRVBfQ09QWToKLQkJCQkJYWN0aXZpdHlIYW5kbGVyLmRlZXBDb3B5KGVsZW1lbnQpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElBY3Rpb25UeXBlUHJvdmlkZXIuRVhURU5EOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuZXh0ZW5kKGFjdCk7Ci0JCQkJCWlmIChwYXR0ZXJucyAhPSBudWxsKSB7Ci0JCQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KTsKLQkJCQkJCWlmKHByb2MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQkJCXBhdHRlcm5zLmFkZCgoQ2FwYWJpbGl0eVBhdHRlcm4pIHByb2MpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUFjdGlvblR5cGVQcm92aWRlci5DT1BZOgotCQkJCQlhY3Rpdml0eUhhbmRsZXIuY29weShhY3QpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlhcHBsaWVkQWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3Q8QWN0aXZpdHk+KGFjdGl2aXR5SGFuZGxlci5nZXRBY3Rpdml0aWVzKCkpOwotCi0JCXJldHVybiAhYXBwbGllZEFjdGl2aXRpZXMuaXNFbXB0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCUl0ZXJhdG9yPEFjdGl2aXR5PiBpdG9yID0gYXBwbGllZEFjdGl2aXRpZXMuaXRlcmF0b3IoKTsKLQotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJd2hpbGUgKGl0b3IuaGFzTmV4dCgpKSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0b3IubmV4dCgpOwotCi0JCQlpZiAoYWN0LmVDb250YWluZXIoKSAhPSBudWxsCi0JCQkJCSYmIGFjdC5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKChNZXRob2RQYWNrYWdlKSBhY3QuZUNvbnRhaW5lcigpKTsKLQkJCX0KLQotCQkJaWYgKHBhdHRlcm5zICE9IG51bGwgJiYgIXBhdHRlcm5zLmlzRW1wdHkoKSkgewotCQkJCURlbGl2ZXJ5UHJvY2VzcyBwcm9jID0gKERlbGl2ZXJ5UHJvY2VzcykgdGFyZ2V0UHJvY2VzczsKLQkJCQlmb3IgKENhcGFiaWxpdHlQYXR0ZXJuIHBhdHRlcm4gOiBwYXR0ZXJucykgewotCQkJCQlpZiAoIXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmNvbnRhaW5zKHBhdHRlcm4pKSB7Ci0JCQkJCQlwcm9jLmdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGQocGF0dGVybik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbG9uZyB0aW1lID0gMDsKLQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKGFwcGxpZWRBY3Rpdml0aWVzKTsKLQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBY3Rpdml0eURyb3BDb21tYW5kLmRvRXhlY3V0ZSgpOiBuZXcgYWN0aXZpdGllcyBhZGRlZC4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLQkJfQotCQlpZighYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKS5pc0VtcHR5KCkpIHsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlwb3N0RGVlcENvcHkoKTsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFjdGl2aXR5RHJvcENvbW1hbmQuZG9FeGVjdXRlKCk6IHBvc3REZWVwQ29weSgpLiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gSGFjayB0byByZWZyZXNoIHByb3ZpZGVycyBmb3JjZWZ1bGx5IGJlZm9yZSBjYWxsaW5nIGZpeER1cGxpY2F0ZU5hbWVzCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0aXZpdHksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpOwotCQkKLQkJLy8gZml4IGR1cGxpY2F0ZSBuYW1lcyBvZiBuZXdseSBhZGRlZCBlbGVtZW50cwotCQlmaXhEdXBsaWNhdGVOYW1lcygpOwotCQkKLQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3N0RGVlcENvcHkoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGF0aW9uIG9mIHRoZSB0YXJnZXQgcHJvY2VzcyBhbnkgbWlzc2luZyBjb250ZW50Ci0JCQkJLy8KLQkJCQlpZihhZGRlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJCQlhZGRlZE9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWRkZWRPYmplY3RzLmNsZWFyKCk7Ci0JCQkJfQotCQkJCWJvb2xlYW4gZGVmYXVsdENvbmZpZ0NoYW5nZWQgPSBmYWxzZTsKLS8vCQkJCS8vIGRpc2FibGUgbm90aWZpY2F0aW9uIG9uIGNoYW5nZSB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgdGFyZ2V0IHByb2Nlc3MgdG8gYXZvaWQgZXhjZXNzaXZlIFVJIHJlZnJlc2hlcwotLy8JCQkJLy8KLS8vCQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVEZWxpdmVyKCk7Ci0vLwkJCQl0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVNldERlbGl2ZXIoZmFsc2UpOwotLy8JCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eUhhbmRsZXIuZ2V0RGVlcENvcGllcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihpdGVyLm5leHQoKSkgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCQkJfQotCi0JCQkJCX07CQkJCQkKLQkJCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlPYmplY3QgZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlKTsKLQkJCQkJCQlpbnQgc2l6ZSA9IGFkZGVkT2JqZWN0cy5zaXplKCk7Ci0JCQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbih0YXJnZXRQcm9jZXNzLCBtZSwgYWRkZWRPYmplY3RzKTsKLQkJCQkJCQlpZighZGVmYXVsdENvbmZpZ0NoYW5nZWQgJiYgKHNpemUgIT0gYWRkZWRPYmplY3RzLnNpemUoKSkpIHsKLQkJCQkJCQkJZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQodGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJZGVmYXVsdENvbmZpZ0NoYW5nZWQgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWZpbmFsbHkgewotLy8JCQkJCXRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lU2V0RGVsaXZlcihvbGROb3RpZnkpOwotLy8JCQkJfQotCQkJfQotCQkJCi0JCX07Ci0JCQotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBnZXRMYWJlbCgpKTsKLQkJCi0JCS8vIHN5bmNocm9uaXplIHRoZSBkZWVwIGNvcGllcyB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgdGFyZ2V0IHByb2Nlc3MJCQkJCi0JCS8vCi0JCWZpbmFsIFN5bmNocm9uaXplQ29tbWFuZCBzeW5jaENtZCA9IG5ldyBTeW5jaHJvbml6ZUNvbW1hbmQoYWN0aXZpdHlIYW5kbGVyLmdldERlZXBDb3BpZXMoKSwgdGFyZ2V0UHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpLCBudWxsLCBmYWxzZSk7Ci0JCXRyeSB7Ci0JCQlydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJc3luY2hDbWQuaW5pdGlsaXplKCk7Ci0JCQkJfQotCQkJCQotCQkJfTsKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlByb2Nlc3NBdXRvU3luY2hyb25pemVBY3Rpb25fcHJlcGFyZSk7Ci0JCQlpZihzeW5jaENtZC5pc0ludGlhbGl6ZWQoKSkgewotCQkJCXN5bmNoQ21kLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXN5bmNoQ21kLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oKSB7Ci0JCXJldHVybiBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbih0YXJnZXRQcm9jZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXhlcyBkdXBsaWNhdGUgbmFtZXMgb2YgbmV3bHkgYWRkZWQgZWxlbWVudHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZml4RHVwbGljYXRlTmFtZXMoKSB7Ci0JCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0U3VwcHJlc3Npb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXBwbGllZEFjdGl2aXRpZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0ZXIubmV4dCgpOwotCQkJZml4RHVwbGljYXRlTmFtZXMoYWN0LCBzdXBwcmVzc2lvbik7Ci0JCQlmaXhUZWFtUHJvZmlsZUR1cGxpY2F0ZU5hbWVzKGFjdCwgc3VwcHJlc3Npb24pOwotCQl9CQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBmaXhEdXBsaWNhdGVOYW1lcyhCcmVha2Rvd25FbGVtZW50IGUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWZpeER1cGxpY2F0ZU5hbWVzKGUsIHN1cHByZXNzaW9uLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZml4RHVwbGljYXRlTmFtZXMoQnJlYWtkb3duRWxlbWVudCBlLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJU3RyaW5nIGJhc2VOYW1lID0gZS5nZXROYW1lKCk7Ci0JCWlmIChQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKGFkYXB0ZXJGYWN0b3J5LCBlLCBiYXNlTmFtZSwgc3VwcHJlc3Npb24pICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAxOyB0cnVlOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGJhc2VOYW1lICsgJ18nICsgaTsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50TmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgbmFtZSwgc3VwcHJlc3Npb24pID09IG51bGwpIHsKLQkJCQkJZS5zZXROYW1lKG5hbWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYmFzZU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGUpOwotCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgYmFzZU5hbWUsIHN1cHByZXNzaW9uKSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMTsgdHJ1ZTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBiYXNlTmFtZSArICdfJyArIGk7Ci0JCQkJaWYgKFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoYWRhcHRlckZhY3RvcnksIGUsIG5hbWUsIHN1cHByZXNzaW9uKSA9PSBudWxsKSB7Ci0JCQkJCWUuc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQkJCi0JCi0JcHJpdmF0ZSB2b2lkIGZpeFRlYW1Qcm9maWxlRHVwbGljYXRlTmFtZXMoQWN0aXZpdHkgYWN0LCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlmb3IgKGludCBpID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KGkpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJZml4RHVwbGljYXRlTmFtZXMoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQsIHN1cHByZXNzaW9uLCBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCX0KLQkJCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJZml4VGVhbVByb2ZpbGVEdXBsaWNhdGVOYW1lcygoQWN0aXZpdHkpIGVsZW1lbnQsIHN1cHByZXNzaW9uKTsKLQkJCX0KLQkJfQotCX0KLQkJCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvVW5kbygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmRvKCkgewotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChhcHBsaWVkQWN0aXZpdGllcyk7Ci0JCWlmIChpc0RlbGl2ZXJ5UHJvY2VzcykgewotCQkJRGVsaXZlcnlQcm9jZXNzIHByb2MgPSAoRGVsaXZlcnlQcm9jZXNzKSB0YXJnZXRQcm9jZXNzOwotCQkJcHJvYy5nZXRJbmNsdWRlc1BhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCXByb2MuZ2V0SW5jbHVkZXNQYXR0ZXJucygpLmFkZEFsbChvbGRQYXR0ZXJucyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZShMaXN0IHNpYmxpbmdzLCBBY3Rpdml0eSBlKSB7Ci0JCVN0cmluZyBiYXNlTmFtZSA9IGUuZ2V0TmFtZSgpOwotCQlpZiAoIWlzTmFtZVRha2VuKHNpYmxpbmdzLCBlLCBiYXNlTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgdHJ1ZTsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGJhc2VOYW1lICsgJ18nICsgaTsKLQkJCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIG5hbWUpKSB7Ci0JCQkJZS5zZXROYW1lKG5hbWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0UHJlc2VudGF0aW9uTmFtZShMaXN0IHNpYmxpbmdzLCBBY3Rpdml0eSBlKSB7Ci0JCS8vIGlmKGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpICE9IG51bGwgJiYKLQkJLy8gZS5nZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgcmV0dXJuOwotCi0JCVN0cmluZyBiYXNlUHJlc2VudGF0aW9uTmFtZSA9IFByb2Nlc3NVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZSk7Ci0JCWlmICghaXNQcmVzZW50YXRpb25OYW1lVGFrZW4oc2libGluZ3MsIGUsIGJhc2VQcmVzZW50YXRpb25OYW1lKSkgewotCQkJLy8gZS5zZXRQcmVzZW50YXRpb25OYW1lKGJhc2VQcmVzZW50YXRpb25OYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMTsgdHJ1ZTsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGJhc2VQcmVzZW50YXRpb25OYW1lICsgJ18nICsgaTsKLQkJCWlmICghaXNQcmVzZW50YXRpb25OYW1lVGFrZW4oc2libGluZ3MsIGUsIG5hbWUpKSB7Ci0JCQkJZS5zZXRQcmVzZW50YXRpb25OYW1lKG5hbWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOYW1lVGFrZW4oTGlzdCBzaWJsaW5ncywgRGVzY3JpYmFibGVFbGVtZW50IGUsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gc2libGluZ3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgc2libGluZyA9IChCcmVha2Rvd25FbGVtZW50KSBzaWJsaW5ncy5nZXQoaSk7Ci0JCQkvLyBpZihzaWJsaW5nICE9IGUgJiYgbmFtZS5lcXVhbHMoc2libGluZy5nZXRQcmVzZW50YXRpb25OYW1lKCkpKSB7Ci0JCQlpZiAoc2libGluZyAhPSBlICYmIG5hbWUuZXF1YWxzKHNpYmxpbmcuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHJlc2VudGF0aW9uTmFtZVRha2VuKExpc3Qgc2libGluZ3MsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IHNpYmxpbmdzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHNpYmxpbmcgPSAoQnJlYWtkb3duRWxlbWVudCkgc2libGluZ3MuZ2V0KGkpOwotCQkJLy8gaWYoc2libGluZyAhPSBlICYmIG5hbWUuZXF1YWxzKHNpYmxpbmcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKSkgewotCQkJaWYgKHNpYmxpbmcgIT0gZQotCQkJCQkmJiBuYW1lLmVxdWFscyhQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHNpYmxpbmcpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZihleGVjdXRlZCkgewotCQkJcmV0dXJuIGFwcGxpZWRBY3Rpdml0aWVzOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPD8+IGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIGdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eUhhbmRsZXIgZ2V0QWN0aXZpdHlIYW5kbGVyKCkgewotCQlyZXR1cm4gYWN0aXZpdHlIYW5kbGVyOwotCX0KLQlwdWJsaWMgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKXsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQlwdWJsaWMgaW50IGdldFR5cGUoKXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcigKLQkJCUlDb25maWd1cmF0b3IgYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcikgewotCQl0aGlzLmFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3IgPSBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yOwotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQ1ZmI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogQ29tbWFuZCB0byBzZXQgdmFyaWFiaWxpdHkgb24gdGhlIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVZhcmlhYmlsaXR5Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgQWN0aXZpdHkgYWN0aXZpdHk7Ci0KLQlwcml2YXRlIFZhcmlhYmlsaXR5RWxlbWVudCB2ZTsKLQotCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlIHR5cGU7Ci0KLQlwcml2YXRlIExpc3QgZWxlbWVudHM7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIEFjdGl2aXR5VmFyaWFiaWxpdHlDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBWYXJpYWJpbGl0eUVsZW1lbnQgdmUsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpKTsKLQotCQl0aGlzLmFjdGl2aXR5ID0gYWN0aXZpdHk7Ci0JCXRoaXMudmUgPSB2ZTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5jb25maWd1cmF0b3IgPSBjb25maWd1cmF0b3I7Ci0KLQkJZWxlbWVudHMgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7IHZlIH0pOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihlbGVtZW50cywgY29uZmlndXJhdG9yKSkKLQkJCXJldHVybjsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZSh0eXBlKTsKLQkJYWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCh2ZSk7Ci0KLQkJCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0JCQlhY3Rpdml0eS5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJCWFjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViNWE3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gYWRkIGd1aWRhbmNlIHRvIGFjdGl2aXR5Ci0gKiAgCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkR3VpZGFuY2VUb0FjdGl2aXR5Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCBndWlkYW5jZXM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHVibGljIEFkZEd1aWRhbmNlVG9BY3Rpdml0eUNvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZ3VpZGFuY2VzKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KSk7Ci0KLQkJdGhpcy5ndWlkYW5jZXMgPSBndWlkYW5jZXM7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZ3VpZGFuY2VzKSkKLQkJCXJldHVybjsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGd1aWRhbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJR3VpZGFuY2UgaXRlbSA9IChHdWlkYW5jZSkgb2JqOwotCi0JCQkJCS8vIGd1aWRhbmNlcyBmb3IgY29udGVudCBlbGVtZW50Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDaGVja2xpc3RzKCkuYWRkKChDaGVja2xpc3QpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb25jZXB0KSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRDb25jZXB0cygpLmFkZCgoQ29uY2VwdCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJCWFjdGl2aXR5LmdldEV4YW1wbGVzKCkuYWRkKChFeGFtcGxlKSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsKSB7Ci0JCQkJCQlhY3Rpdml0eS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuYWRkKChTdXBwb3J0aW5nTWF0ZXJpYWwpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJCWFjdGl2aXR5LmdldEd1aWRlbGluZXMoKS5hZGQoKEd1aWRlbGluZSkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJCWFjdGl2aXR5LmdldFJldXNhYmxlQXNzZXRzKCkuYWRkKChSZXVzYWJsZUFzc2V0KSBpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUm9hZG1hcCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Um9hZG1hcHMoKS5hZGQoKFJvYWRtYXApIGl0ZW0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigiQ2FudCBzZXQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBndWlkYW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIG9iajsKLQotCQkJCQkvLyBndWlkYW5jZXMgZm9yIGNvbnRlbnQgZWxlbWVudAotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Q2hlY2tsaXN0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29uY2VwdCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0Q29uY2VwdHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJCWFjdGl2aXR5LmdldEV4YW1wbGVzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJCWFjdGl2aXR5LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQkJYWN0aXZpdHkuZ2V0R3VpZGVsaW5lcygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmV1c2FibGVBc3NldCkgewotCQkJCQkJYWN0aXZpdHkuZ2V0UmV1c2FibGVBc3NldHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCQkJCWFjdGl2aXR5LmdldFJvYWRtYXBzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigiQ2FudCBzZXQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpICkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChhY3Rpdml0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBhY3Rpdml0eSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkR3VpZGFuY2VUb0JyZWFrZG93bkVsZW1lbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmMTI1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGFkZCBndWlkYW5jZSB0byBicmVha2Rvd24gZWxlbWVudC9hY3Rpdml0eQotICogIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIEFkZEd1aWRhbmNlVG9CcmVha2Rvd25FbGVtZW50Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdDxHdWlkYW5jZT4gZ3VpZGFuY2VzOwotCi0JcHJpdmF0ZSBCcmVha2Rvd25FbGVtZW50IGJyRWxlbWVudDsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXB1YmxpYyBBZGRHdWlkYW5jZVRvQnJlYWtkb3duRWxlbWVudENvbW1hbmQoQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQsIExpc3Q8R3VpZGFuY2U+IGd1aWRhbmNlcykgewotCi0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhickVsZW1lbnQpKTsKLQotCQl0aGlzLmd1aWRhbmNlcyA9IGd1aWRhbmNlczsKLQkJdGhpcy5ickVsZW1lbnQgPSBickVsZW1lbnQ7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKGd1aWRhbmNlcykpCi0JCQlyZXR1cm47Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQlpZiAoIWd1aWRhbmNlcy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBndWlkYW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIG9iajsKLQotCQkJCQkvLyBndWlkYW5jZXMgZm9yIGNvbnRlbnQgZWxlbWVudAotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQkJYnJFbGVtZW50LmdldENoZWNrbGlzdHMoKS5hZGQoKENoZWNrbGlzdCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRDb25jZXB0cygpLmFkZCgoQ29uY2VwdCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEV4YW1wbGUpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRFeGFtcGxlcygpLmFkZCgoRXhhbXBsZSkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgewotCQkJCQkJYnJFbGVtZW50LmdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5hZGQoKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEd1aWRlbGluZSkgewotCQkJCQkJYnJFbGVtZW50LmdldEd1aWRlbGluZXMoKS5hZGQoKEd1aWRlbGluZSkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRSZXVzYWJsZUFzc2V0cygpLmFkZCgoUmV1c2FibGVBc3NldCkgaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCQkJCWlmIChickVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCSgoQWN0aXZpdHkpIGJyRWxlbWVudCkuZ2V0Um9hZG1hcHMoKS5hZGQoKFJvYWRtYXApIGl0ZW0pOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigiQ2FudCBzZXQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghZ3VpZGFuY2VzLmlzRW1wdHkoKSkgewotCQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCQlzdXBlci51bmRvKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBndWlkYW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQkJCUd1aWRhbmNlIGl0ZW0gPSAoR3VpZGFuY2UpIG9iajsKLQotCQkJCQkvLyBndWlkYW5jZXMgZm9yIGNvbnRlbnQgZWxlbWVudAotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENoZWNrbGlzdCkgewotCQkJCQkJYnJFbGVtZW50LmdldENoZWNrbGlzdHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIENvbmNlcHQpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRDb25jZXB0cygpLnJlbW92ZShpdGVtKTsKLQkJCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgRXhhbXBsZSkgewotCQkJCQkJYnJFbGVtZW50LmdldEV4YW1wbGVzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdXBwb3J0aW5nTWF0ZXJpYWwpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBHdWlkZWxpbmUpIHsKLQkJCQkJCWJyRWxlbWVudC5nZXRHdWlkZWxpbmVzKCkucmVtb3ZlKGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KSB7Ci0JCQkJCQlickVsZW1lbnQuZ2V0UmV1c2FibGVBc3NldHMoKS5yZW1vdmUoaXRlbSk7Ci0JCQkJCX0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFJvYWRtYXApIHsKLQkJCQkJCWlmIChickVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCSgoQWN0aXZpdHkpIGJyRWxlbWVudCkuZ2V0Um9hZG1hcHMoKS5yZW1vdmUoKFJvYWRtYXApIGl0ZW0pOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcigiQ2FudCBzZXQgZ3VpZGFuY2UgIiArIGl0ZW0uZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGl0ZW0uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKCFndWlkYW5jZXMuaXNFbXB0eSgpICkgewotCQkJaWYgKGJyRWxlbWVudC5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGJyRWxlbWVudC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFmZmVjdGVkT2JqZWN0cygpIHsKLQkJaWYgKGJyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10geyBickVsZW1lbnQgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZE1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9BZGRNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM2YWNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZE1ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotCi0vKioKLSAqIEJhc2UgQ29tbWFuZCBmb3IgYWRkIG1ldGhvZCBlbGVtZW50cyB0byBkZXNjcmlwdG9yLiAKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByb3RlY3RlZCBMaXN0IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWc7Ci0KLQlwcml2YXRlIEhhc2hTZXQgYWRkZWRPYmplY3RzOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwdWJsaWMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5wcm9jZXNzID0gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgYW5kIGFkZHMgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihMaXN0IGVsZW1lbnRzKQotCXsKLQkJcmV0dXJuIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oZWxlbWVudHMsIG51bGwpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDaGVja3MgYW5kIGFkZHMgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gZmFsc2UgaWYgdXNlciBjYW5jZWxlZCB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihMaXN0IGVsZW1lbnRzLCBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCQlpZiAoZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyA9PSBudWxsKSB7Ci0JCQllbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkKLQkJCQlzd2l0Y2ggKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbigKLQkJCQkJCXByb2Nlc3MsIGVsZW1lbnQsIGNvbmZpZ3VyYXRvcikpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5hZGQoZWxlbWVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgLTE6Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcuaXNFbXB0eSgpKSB7Ci0JCQkJYWRkZWRPYmplY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJUHJvY2Vzc1V0aWwuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jZXNzLCBlbGVtZW50LAotCQkJCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCQkJfQotCQkJCWlmICghYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZCgKLQkJCQkJCQlwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkuZVJlc291cmNlKCkpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYgKGFkZGVkT2JqZWN0cyAhPSBudWxsICYmICFhZGRlZE9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRlZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlkZWZhdWx0Q29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWRlZmF1bHRDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLnJlbW92ZShlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkUm9sZVRvVGVhbUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0FkZFJvbGVUb1RlYW1Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNGQ2YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQWRkUm9sZVRvVGVhbUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhZGQgcm9sZSB0byB0ZWFtIHByb2ZpbGUKLSAqICAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRSb2xlVG9UZWFtQ29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCByb2xlczsKLQotCXByaXZhdGUgTGlzdCByb2xlRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IGV4aXN0aW5nUm9sZURlc2NMaXN0OwotCi0JcHVibGljIEFkZFJvbGVUb1RlYW1Db21tYW5kKFRlYW1Qcm9maWxlIHRlYW0sIExpc3Qgcm9sZXMpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3ModGVhbSkpOwotCi0JCXRoaXMucm9sZXMgPSByb2xlczsKLQkJdGhpcy50ZWFtID0gdGVhbTsKLQotCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBQcm9jZXNzVXRpbC5nZXRQYXJlbnRBY3Rpdml0eU9mVGVhbSh0ZWFtKTsKLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0KLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocm9sZXMpKQotCQkJcmV0dXJuOwotCi0JCXJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IFByb2Nlc3NVdGlsCi0JCQkJCS5jcmVhdGVSb2xlRGVzY3JpcHRvcigoUm9sZSkgaXRvci5uZXh0KCkpOwotCQkJcm9sZURlc2NMaXN0LmFkZChyb2xlRGVzYyk7Ci0JCX0KLQotCQkvLyBhdXRvbWF0aWMgYXNzaWdubWVudAotCQlleGlzdGluZ1JvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUHJvY2Vzc1V0aWwuZ2V0Um9sZURlc2NyaXB0b3IoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgYWN0aXZpdHksCi0JCQkJZXhpc3RpbmdSb2xlRGVzY0xpc3QsIHJvbGVzKTsKLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmICghcm9sZURlc2NMaXN0LmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFleGlzdGluZ1JvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGV4aXN0aW5nUm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLmFkZCgoUm9sZURlc2NyaXB0b3IpIGl0b3IubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoIXJvbGVEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gcm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKChSb2xlRGVzY3JpcHRvcikgaXRvci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmICghZXhpc3RpbmdSb2xlRGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBleGlzdGluZ1JvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlpZiAocm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGVhbS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHRlYW0uZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJvbGVEZXNjTGlzdDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblByaW1hcnlQZXJmb3JtZXJUb1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTlmZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci0KLQotLyoqCi0gKiAKLSAqIENvbW1hbmQgdG8gYXNzaWduIHByaW1hcnkgcGVyZm9ybWVyIHRvIHRhc2sgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcwotCQlBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciBuZXdSb2xlRGVzYyA9IG51bGw7Ci0KLQlwcml2YXRlIFJvbGVEZXNjcmlwdG9yIG9sZFJvbGVEZXNjID0gbnVsbDsKLQotCXByaXZhdGUgUm9sZSByb2xlOwotCi0JcHJpdmF0ZSBMaXN0IHJvbGVzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvLyBwcml2YXRlIGJvb2xlYW4gZGVzY0V4aXN0cyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQXNzaWduUHJpbWFyeVBlcmZvcm1lclRvVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsCi0JCQlSb2xlIHJvbGUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXNrRGVzYykpOwotCi0JCXRoaXMucm9sZSA9IHJvbGU7Ci0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJvbGVzLmFkZChyb2xlKTsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQl0YXNrRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHRhc2tEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihyb2xlcykpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQluZXdSb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoCi0JCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKG5ld1JvbGVEZXNjID09IG51bGwpIHsKLQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQluZXdSb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcihyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQlpZiAobmV3Um9sZURlc2MgPT0gbnVsbCkgewotCi0JCQkJCW5ld1JvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZ2V0IHRlYW0KLQkJCXRlYW0gPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbShhY3Rpdml0eSwgcm9sZSk7Ci0KLQkJCXJlZG8oKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCQl0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpLmFkZChuZXdSb2xlRGVzYyk7Ci0KLQkJaWYgKGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKG5ld1JvbGVEZXNjKTsKLQkJfQotCi0JCWlmICh0ZWFtICE9IG51bGwpIHsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKG5ld1JvbGVEZXNjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJaWYgKCFyb2xlcy5pc0VtcHR5KCkpIHsKLQkJCS8vIHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYWRkZWQKLQkJCXN1cGVyLnVuZG8oKTsKLQotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmUobmV3Um9sZURlc2MpOwotCi0JCQlpZiAoaXNOZXdSb2xlRGVzY3JpcHRvcikgewotCQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKG5ld1JvbGVEZXNjKTsKLQkJCX0KLQkJCWlmICh0ZWFtICE9IG51bGwpIHsKLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZShuZXdSb2xlRGVzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGFza0Rlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWJhMWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQ29tbWFuZCBmb3IgYXNzaWduIHJvbGVzIHRvIHRhc2sgZGVzY3JpcHRvci4gSXQgd2lsbCBhc3NpZ24gcHJpbWFyeSwgYWRkaXRpb25hbAotICogcGVyZm9ybWVycyBhbmQgYXNzaXN0ZWQgYnkgdG8gYSB0YXNrIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnblJvbGVUb1Rhc2tEZXNjcmlwdG9yIGV4dGVuZHMgQWRkTWV0aG9kRWxlbWVudENvbW1hbmQgewotCi0JcHJpdmF0ZSBMaXN0IHJvbGVzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGludCBhY3Rpb247Ci0KLQlMaXN0IGV4aXN0aW5nUm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdSb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCi0JLyoqCi0JICogQXNzaWduIHJvbGUgdG8gdGFzayBkZXNjcmlwdG9yIFVzZWQgZm9yIGJvdGggYWRkaXRpb25hbGx5IHBlcmZvcm1lZCBieQotCSAqIGFuZCBhc3Npc3RlZCBieQotCSAqLwotCXB1YmxpYyBBc3NpZ25Sb2xlVG9UYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciB0YXNrRGVzYywgTGlzdCByb2xlcywKLQkJCWludCBhY3Rpb24sIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0KLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhc2tEZXNjKSk7Ci0KLQkJdGhpcy5yb2xlcyA9IHJvbGVzOwotCQl0aGlzLnRhc2tEZXNjID0gdGFza0Rlc2M7Ci0JCXRoaXMuYWN0aW9uID0gYWN0aW9uOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQotCQlBZGFwdGVyRmFjdG9yeSBhRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhRmFjdG9yeS5hZGFwdCgKLQkJCQl0YXNrRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHRhc2tEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQotCQkvLyBhZGQgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIG5vdCB0aGVyZSBhbHJlYWR5Ci0JCWlmICghc3VwZXIuYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbihyb2xlcykpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHJvbGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCS8vIGJvb2xlYW4gZGVzY0V4aXN0cyA9IGZhbHNlOwotCQkJUm9sZSByb2xlID0gKFJvbGUpIGl0Lm5leHQoKTsKLQotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSBudWxsOwotCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJLy8gY2hlY2sgZm9yIGxvY2FsIGRlc2NyaXB0b3IKLQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihyb2xlLAotCQkJCQlhY3Rpdml0eSwgY29uZmlnKTsKLQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iocm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNOZXdSb2xlRGVzY3JpcHRvcikKLQkJCQluZXdSb2xlRGVzY0xpc3QuYWRkKHJvbGVEZXNjKTsKLQkJCWVsc2UKLQkJCQlleGlzdGluZ1JvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCi0JCQkvLyBnZXQgdGVhbQotCQkJVGVhbVByb2ZpbGUgdGVhbSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRUZWFtKGFjdGl2aXR5LCByb2xlKTsKLQkJCWlmICh0ZWFtICE9IG51bGwpIHsKLQkJCQltYXAucHV0KHJvbGVEZXNjLCB0ZWFtKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUFJJTUFSWV9QRVJGT1JNRVIpIHsKLQkJCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkQWxsKGV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BRERJVElPTkFMX1BFUkZPUk1FUikgewotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoZXhpc3RpbmdSb2xlRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0FTU0lTVEVEX0JZKSB7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkuYWRkQWxsKGV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKS5hZGRBbGwobmV3Um9sZURlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0KLQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQlTZXQga2V5c2V0ID0gbWFwLmtleVNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdG9yID0ga2V5c2V0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBrZXkgPSBpdG9yLm5leHQoKTsKLQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBtYXAuZ2V0KGtleSk7Ci0KLQkJCQkvLyBhZGQgdG8gdGVhbQotCQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKChSb2xlRGVzY3JpcHRvcikga2V5KTsKLQkJCX0KLQkJfQotCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BRERJVElPTkFMX1BFUkZPUk1FUikgewotCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmVBbGwoCi0JCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkucmVtb3ZlQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0gZWxzZQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BRERJVElPTkFMX1BFUkZPUk1FUikgewotCQkJdGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmVBbGwoCi0JCQkJCWV4aXN0aW5nUm9sZURlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkucmVtb3ZlQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9BU1NJU1RFRF9CWSkgewotCQkJdGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpLnJlbW92ZUFsbChleGlzdGluZ1JvbGVEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlQWxsKG5ld1JvbGVEZXNjTGlzdCk7Ci0JCX0KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwobmV3Um9sZURlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIG1hcC5nZXQoa2V5KTsKLQotCQkJCS8vIHJlbW92ZSBpdCBmcm9tIHRlYW0KLQkJCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSgoUm9sZURlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlpZiAocm9sZXMgIT0gbnVsbCAmJiAhcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlpZiAodGFza0Rlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZCh0YXNrRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb0RlbGl2ZXJhYmxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvRGVsaXZlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlNjQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvRGVsaXZlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIAotICogQ29tbWFuZCB0byBhc3NpZ24gZGVsaXZlcmFibGUgcGFydHMgdG8gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFzc2lnbldQVG9EZWxpdmVyYWJsZSBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgTGlzdCB3b3JrUHJvZHVjdHM7Ci0KLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlMaXN0IGV4aXN0aW5nV1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCUxpc3QgbmV3V1BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25XUFRvRGVsaXZlcmFibGUoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYywgTGlzdCB3b3JrUHJvZHVjdHMpIHsKLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHdwRGVzYykpOwotCi0JCXRoaXMud29ya1Byb2R1Y3RzID0gd29ya1Byb2R1Y3RzOwotCQl0aGlzLndwRGVzYyA9IHdwRGVzYzsKLQotCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50QWN0aXZpdHkod3BEZXNjKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQl0aGlzLmFjdGl2aXR5ID0gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCX0KLQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCi0JCUxpc3QgYnJlYWtkb3duRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHdvcmtQcm9kdWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlib29sZWFuIGRlc2NFeGlzdHMgPSBmYWxzZTsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmV3V3BEZXNjID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtkb3duRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgYnJlYWtkb3duRWxlbWVudHMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJV29ya1Byb2R1Y3QgZWxlbWVudFdQID0gbmV3V3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJCWlmICh3cC5lcXVhbHMoZWxlbWVudFdQKSkgewotCQkJCQkJLy8gaWYgZm91bmQgdW5kZXIgdGhlIHBhcmVudCBhY3Rpdml0eSwgcmV0dXJuIHRoYXQKLQkJCQkJCS8vIHdwZGVzY3JpcHRvcgotCQkJCQkJZGVzY0V4aXN0cyA9IHRydWU7Ci0KLQkJCQkJCWV4aXN0aW5nV1BEZXNjTGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAoIWRlc2NFeGlzdHMpIHsKLQkJCQluZXdXUERlc2NMaXN0LmFkZChQcm9jZXNzVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApKTsKLQkJCX0KLQotCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQlpZiAoZGVsaXZlcmFibGUgIT0gbnVsbCkgewotCQkJCW1hcC5wdXQobmV3V3BEZXNjLCBkZWxpdmVyYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCS8vIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQkJLy8gYmFzaWNhbGx5IHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQotCQkvLyBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsICYmICAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHdwRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHdwRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDU2NDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQXNzaWduV1BUb1JvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCB0byBhc3NpZ24gd29yayBwcm9kdWN0cyB0byByb2xlIGRlc2NyaXB0b3JzLiBJdCB3aWxsIHNldCByZXBvbnNpYmxlCi0gKiByb2xlIGZlYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgd29ya1Byb2R1Y3RzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igcm9sZURlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgaW50IGFjdGlvbjsKLQotCUxpc3QgZXhpc3RpbmdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25XUFRvUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MsIExpc3Qgd29ya1Byb2R1Y3RzLAotCQkJaW50IGFjdGlvbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3Mocm9sZURlc2MpKTsKLQotCQl0aGlzLndvcmtQcm9kdWN0cyA9IHdvcmtQcm9kdWN0czsKLQkJdGhpcy5yb2xlRGVzYyA9IHJvbGVEZXNjOwotCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJcm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChyb2xlRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJLy8gYWRkIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBub3QgdGhlcmUgYWxyZWFkeQotCQlpZiAoIXN1cGVyLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24od29ya1Byb2R1Y3RzKSkKLQkJCXJldHVybjsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd29ya1Byb2R1Y3RzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmV3V3BEZXNjID0gbnVsbDsKLQotCQkJYm9vbGVhbiBpc05ld0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkJCS8vIGNoZWNrIGZvciBsb2NhbCBkZXNjcmlwdG9yCi0JCQluZXdXcERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCQkuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcih3cCwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJaWYgKG5ld1dwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCW5ld1dwRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCQkJCWlzTmV3RGVzY3JpcHRvciA9IHRydWU7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNOZXdEZXNjcmlwdG9yKQotCQkJCW5ld1dQRGVzY0xpc3QuYWRkKG5ld1dwRGVzYyk7Ci0JCQllbHNlCi0JCQkJZXhpc3RpbmdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCi0JCQkvLyBnZXQgZGVsaXZlcmFibGUKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCWlmIChkZWxpdmVyYWJsZSAhPSBudWxsKSB7Ci0JCQkJbWFwLnB1dChuZXdXcERlc2MsIGRlbGl2ZXJhYmxlKTsKLQkJCX0KLQkJfQotCi0JCXJlZG8oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQkJaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfUkVTUE9OU0lCTEVfRk9SKSB7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBtYXAKLQkJCQkJCS5nZXQoa2V5KTsKLQotCQkJCS8vIGFkZCB0byBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9SRVNQT05TSUJMRV9GT1IpIHsKLQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQlyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfQotCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gZGVsaXZlcmFibGUKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JCQkJCQkucmVtb3ZlKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsICYmICAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHJvbGVEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocm9sZURlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Bc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9UYXNrRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjM4OWRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Fzc2lnbldQVG9UYXNrRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gYXNzaWduIHdvcmsgcHJvZHVjdHMgdG8gdGFzayBkZXNjcmlwdG9yLiBJdCB3aWxsIHNldCBleHRlcm5hbAotICogaW5wdXRzLCBtYW5kYXRvcnkgaW5wdXRzLCBvcHRpb25hbCBpbnB1dHMgYW5kIG91dHB1dHMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IgZXh0ZW5kcyBBZGRNZXRob2RFbGVtZW50Q29tbWFuZCB7Ci0KLQlwcml2YXRlIExpc3Qgd29ya1Byb2R1Y3RzOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIGludCBhY3Rpb247Ci0KLQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCUxpc3QgZXhpc3RpbmdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBuZXdXUERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBc3NpZ25XUFRvVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MsIExpc3Qgd29ya1Byb2R1Y3RzLAotCQkJaW50IGFjdGlvbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhc2tEZXNjKSk7Ci0KLQkJdGhpcy53b3JrUHJvZHVjdHMgPSB3b3JrUHJvZHVjdHM7Ci0JCXRoaXMudGFza0Rlc2MgPSB0YXNrRGVzYzsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXRhc2tEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQodGFza0Rlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCQl0aGlzLm1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKHdvcmtQcm9kdWN0cykpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHdvcmtQcm9kdWN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXQubmV4dCgpOwotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIG5ld1dwRGVzYyA9IG51bGw7Ci0KLQkJCWJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJbmV3V3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCWlmIChuZXdXcERlc2MgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGZvciBpbmhlcml0ZWQgZGVzY3JpcHRvcgotCQkJCW5ld1dwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCWlmIChuZXdXcERlc2MgPT0gbnVsbCkgewotCQkJCQluZXdXcERlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3ApOwotCQkJCQlpc05ld0Rlc2NyaXB0b3IgPSB0cnVlOwotCi0JCQkJfQotCQkJfQotCQkJaWYgKGlzTmV3RGVzY3JpcHRvcikKLQkJCQluZXdXUERlc2NMaXN0LmFkZChuZXdXcERlc2MpOwotCQkJZWxzZQotCQkJCWV4aXN0aW5nV1BEZXNjTGlzdC5hZGQobmV3V3BEZXNjKTsKLQotCQkJLy8gZ2V0IGRlbGl2ZXJhYmxlCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQlpZiAoZGVsaXZlcmFibGUgIT0gbnVsbCkgewotCQkJCW1hcC5wdXQobmV3V3BEZXNjLCBkZWxpdmVyYWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JCWlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX0VYVEVSTkFMX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkuYWRkQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfTUFOREFUT1JZX0lOUFVUKSB7Ci0JCQl0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PUFRJT05BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX09VVFBVVCkgewotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkuYWRkQWxsKGV4aXN0aW5nV1BEZXNjTGlzdCk7Ci0JCQl0YXNrRGVzYy5nZXRPdXRwdXQoKS5hZGRBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0KLQotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChuZXdXUERlc2NMaXN0KTsKLQotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCVNldCBrZXlzZXQgPSBtYXAua2V5U2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBrZXlzZXQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGtleSA9IGl0b3IubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBtYXAKLQkJCQkJCS5nZXQoa2V5KTsKLQotCQkJCS8vIGFkZCB0byBkZWxpdmVyYWJsZQotCQkJCXdwRGVzYy5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JCS8vIHJlbW92ZSBmcm9tIGNvbmZpZ3VyYXRpb24gaWYgYW55dGhpbmcgd2FzIGFkZGVkCi0JCXN1cGVyLnVuZG8oKTsKLQotCQlpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9FWFRFUk5BTF9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpLnJlbW92ZUFsbChuZXdXUERlc2NMaXN0KTsKLQkJfSBlbHNlIGlmIChhY3Rpb24gPT0gSUFjdGlvblR5cGVDb25zdGFudHMuQUREX01BTkRBVE9SWV9JTlBVVCkgewotCQkJdGFza0Rlc2MuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBJQWN0aW9uVHlwZUNvbnN0YW50cy5BRERfT1BUSU9OQUxfSU5QVVQpIHsKLQkJCXRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmVBbGwoZXhpc3RpbmdXUERlc2NMaXN0KTsKLQkJCXRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmVBbGwobmV3V1BEZXNjTGlzdCk7Ci0JCX0gZWxzZSBpZiAoYWN0aW9uID09IElBY3Rpb25UeXBlQ29uc3RhbnRzLkFERF9PVVRQVVQpIHsKLQkJCXRhc2tEZXNjLmdldE91dHB1dCgpLnJlbW92ZUFsbChleGlzdGluZ1dQRGVzY0xpc3QpOwotCQkJdGFza0Rlc2MuZ2V0T3V0cHV0KCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCQl9Ci0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKG5ld1dQRGVzY0xpc3QpOwotCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJU2V0IGtleXNldCA9IG1hcC5rZXlTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGtleXNldC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qga2V5ID0gaXRvci5uZXh0KCk7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG1hcAotCQkJCQkJLmdldChrZXkpOwotCi0JCQkJLy8gcmVtb3ZlIGl0IGZyb20gZGVsaXZlcmFibGUKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpCi0JCQkJCQkucmVtb3ZlKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGtleSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyAhPSBudWxsICYmICAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKSkgewotCQkJaWYgKGFjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQkJfQotCQkJaWYgKHRhc2tEZXNjLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQodGFza0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2N2VmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuSWRlbnRpdHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotCi0vKioKLSAqIEFic3RyYWN0IGRyYWcgYW5kIGRyb3AgY29tbWFuZCBmb3IgcHJvY2VzcyBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCU0RyYWdBbmREcm9wQ29tbWFuZCBleHRlbmRzIFJlc291cmNlQXdhcmVEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEJTRHJhZ0FuZERyb3BDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBPYmplY3Qgb3duZXIsCi0JCQlmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihkb21haW4sIG93bmVyLCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlRHJvcENvcHlPbigpIHsKLQkJcmV0dXJuIHByZXBhcmVEcm9wTGlua09uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZURyb3BMaW5rT24oKSB7Ci0JCWRyYWdDb21tYW5kID0gSWRlbnRpdHlDb21tYW5kLklOU1RBTkNFOwotCQlkcm9wQ29tbWFuZCA9IFVuZXhlY3V0YWJsZUNvbW1hbmQuSU5TVEFOQ0U7Ci0KLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBhY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJaWYgKFRuZ1V0aWwuaXNMb2NrZWQoKEVPYmplY3QpIG93bmVyKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoYWNjZXB0KGUpKSB7Ci0JCQkJbGlzdC5hZGQoZSk7Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCS8vIC8vIGRpc2FsbG93IGRyb3AgYSBwcm9jZXNzIGFzIGFuIGFjdGl2aXR5Ci0JCQkvLyB9Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgb3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IHRhcmdldCA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJaWYgKERlcGVuZGVuY3lDaGVja2VyLm5ld0NoZWNrQWN0KSB7Ci0JCQkJCWlmICghIERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQKLQkJCQkJCQkodGFyZ2V0LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGUpLCB0cnVlKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9CQkJCQkKLQkJCQl9IGVsc2UgaWYgKCFEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeSgoQWN0aXZpdHkpIGUsIHRhcmdldCkuaXNPSygpKXsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQkKLS8vCQkJCVByb2Nlc3Mgc3JjUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgb2JqKTsKLS8vCQkJCVByb2Nlc3MgdGFyZ2V0UHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh0YXJnZXQpOwotLy8KLS8vCQkJCWlmICghKHNyY1Byb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgJiYgdGFyZ2V0UHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSkgewotLy8JCQkJCWFjdExpc3QuYWRkKG9iaik7Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJLy8gbm8gbW9yZSBjaGVjayB0byBwcmV2ZW50IGFwcGx5aW5nIGFuIGFjdGl2aXR5IG9mIGEgZGVsaXZlcnkgcHJvY2VzcyBvbnRvIGEgY2FwYWJpbGl0eSBwYXR0ZXIKLQkJCQkvLyBzaW5jZSBpbnRyb2R1Y3Rpb24gb2YgZGVlcC1jb3B5LiBEZWVwIGNvcHkgY2FuIGFsd2F5cyBiZSBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2Ygc291cmNlIGFuZCB0YXJnZXQKLQkJCQkvLyBwcm9jZXNzZXMuCi0JCQkJLy8KLQkJCQlhY3RMaXN0LmFkZChvYmopOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiByZXN1bHQ7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSAmJiBhY3RMaXN0LmlzRW1wdHkoKSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlDb21wb3VuZENvbW1hbmQgY21kID0gbmV3IFJlc291cmNlQXdhcmVDb21wb3VuZENvbW1hbmQoKTsKLQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQljbWQuYXBwZW5kKGNyZWF0ZURyb3BDb21tYW5kKG93bmVyLCBsaXN0KSk7Ci0JCQl9Ci0JCQlpZiAoIWFjdExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpCi0JCQkJCWNtZC5hcHBlbmQobmV3IEFjdGl2aXR5RHJvcENvbW1hbmQoKEFjdGl2aXR5KSBvd25lciwgYWN0TGlzdCwKLQkJCQkJCWdldFRhcmdldFZpZXdlcigpLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpKTsKLQkJCX0KLQkJCWRyb3BDb21tYW5kID0gY21kOwotCQkJcmVzdWx0ID0gZHJvcENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRUYXJnZXRWaWV3ZXIoKSB7Ci0JCWlmIChkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkgb3duZXIpOwotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5nZXRWaWV3ZXIoYWRhcHRlckZhY3RvcnksIHByb2MpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuRHJhZ0FuZERyb3BDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gZHJvcENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaik7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0JTRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzZmI5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CU0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdGlvbkFwcGxpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk5lc3RlZENvbW1hbmRFeGNlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgRHJvcENvbW1hbmQgY2xhc3MgZm9yIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCU0Ryb3BDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxFU3RydWN0dXJhbEZlYXR1cmU+IERFRkFVTFRfU1lOQ0hfRkVBVFVSRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8RVN0cnVjdHVyYWxGZWF0dXJlPihBcnJheXMuYXNMaXN0KAotCQkJbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCksCQkJCQotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkJCX0KLQkpKSk7Ci0JCi0JLyoqCi0JICogTWFwIG9mIGxpbmtlZCBlbGVtZW50J3MgZmVhdHVyZSB0byBkZXNjcmlwdG9yJ3MgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlPiBGRUFUVVJFX01BUCA9IG5ldyBIYXNoTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgRVN0cnVjdHVyYWxGZWF0dXJlPigpOwotCXN0YXRpYyB7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSk7Ci0JCUZFQVRVUkVfTUFQLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpKTsKLS8vCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGVkTWV0aG9kRWxlbWVudF9Fc3RpbWF0ZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0ZWRNZXRob2RFbGVtZW50X0VzdGltYXRlKCkpOwotCQlGRUFUVVJFX01BUC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKTsKLQkJRkVBVFVSRV9NQVAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBkcm9wRWxlbWVudHM7Ci0JCi0JcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiB1bndyYXBwZWREcm9wRWxlbWVudHM7Ci0KLQlwcml2YXRlIFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWc7Ci0KLQlwcm90ZWN0ZWQgU2V0PE9iamVjdD4gYWRkZWRPYmplY3RzOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRkZWRUb0RlZmF1bHRDb25maWcgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIHN5bmNocm9uaXplID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFRhc2tEZXNjcmlwdG9yPiB0YXNrRGVzY0xpc3Q7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PERlc2NyaXB0b3I+IHRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlOwotCi0vLwlwcm90ZWN0ZWQgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCi0JLyoqCi0JICogTWFwIG9mIGRlc2NyaXB0b3IgdG8gb2xkIHJlZnJlc2hhYmxlIGZlYXR1cmUgbWFwCi0JICovCi0JcHJpdmF0ZSBNYXA8RGVzY3JpcHRvciwgTWFwPD8sID8+PiBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwOwotCi0JLyoqCi0JICogTWFwIG9mIGRlc2NyaXB0b3IgdG8gbWFwIG9mIGZlYXR1cmUgdG8gbmV3IHZhbHVlcwotCSAqLwotLy8JcHJvdGVjdGVkIE1hcCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwOwotLy8JcHJpdmF0ZSBIYXNoTWFwIGRlc2NyaXB0b3JUb09sZEZlYXR1cmVWYWx1ZXNNYXA7CQotCXByb3RlY3RlZCBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kIGJhdGNoQ29tbWFuZDsKLQotLy8JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvT2xkUmVzcG9uc2libGVSb2xlTWFwOwotCi0JLyoqCi0JICogTWFwIG9mIFRhc2tEZXNjcmlwdG9yIHRvIGxpc3Qgb2YgbmV3bHkgYWRkZWQgc3RlcHMKLQkgKi8KLQlwcml2YXRlIE1hcCB0YXNrRGVzY1RvTmV3U3RlcHNNYXA7Ci0KLQlwcml2YXRlIE1hcCB0YXNrRGVzY1RvT2xkRXN0aW1hdGVNYXA7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuY2VsZWQ7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIFNldCBzeW5jaEZlYXR1cmVzID0gREVGQVVMVF9TWU5DSF9GRUFUVVJFUzsKLQotCXByaXZhdGUgQmF0Y2hDb21tYW5kIHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlZDsKLQotLy8JcHJvdGVjdGVkIE9iamVjdCBVSUNvbnRleHQ7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcnVuQXNKb2I7Ci0JCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0KLQlwcml2YXRlIGludCB3b3JrZWRVbml0czsKLQotCXByaXZhdGUgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciBuZXN0ZWRDb21tYW5kRXhjZWN1dG9yOwotCQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqICAgICAgICAgICAgdGhlIGFjdGl2aXR5IHRoYXQgdGhlIGdpdmVuIGVsZW1lbnRzIGFyZSBkcm9wcGVkIG9uCi0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnRzIHRvIGRyb3Agb24gdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3Q8T2JqZWN0PiBkcm9wRWxlbWVudHMpIHsKLQkJdGhpcyhhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBudWxsLCBudWxsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN5bmNoCi0JICogICAgICAgICAgICBpZiB0cnVlLCB0aGUgY29tbWFuZCB3aWxsIGNsZWFuIHRoZSBjb250ZW50IGFuZCByZWxhdGlvbnNoaXBzCi0JICogICAgICAgICAgICBvZiBleGlzdGluZyBkZXNjcmlwdG9ycyBhbmQgcmVmcmVzaCB0aGVtIHdpdGggdGhlIGxpbmtlZAotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0PE9iamVjdD4gZHJvcEVsZW1lbnRzLCBib29sZWFuIHN5bmNoKSB7Ci0JCXRoaXMoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgbnVsbCwgbnVsbCwgc3luY2gpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBnaXZlbiBjb250ZW50IGVsZW1lbnRzIHRvIGl0cyBUYXNrRGVzY3JpcHRvcnMgaW4gdGhlCi0JICogZ2l2ZW4gYWN0aXZpdHkgdXNpbmcgdGhlIGdpdmVuIE1ldGhvZENvbmZpZ3VyYXRpb24gYW5kIGxpc3Qgb2YKLQkgKiBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcy4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudHMgdG8gc3luY2hyb25pemUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKiAgICAgICAgICAgIHRoZSBzeW5jaHJvbml6YWJsZSBmZWF0dXJlcywgaWYgPGNvZGU+bnVsbDwvY29kZT4gdGhlIERFRkFVTFRfU1lOQ0hfRkVBVFVSRVMgd2lsbCBiZSB1c2VkLgotCSAqLwotCXB1YmxpYyBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0PE9iamVjdD4gZHJvcEVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzKSB7Ci0JCXRoaXMoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgY29uZmlnLCBzeW5jaEZlYXR1cmVzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIEJTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3Q8T2JqZWN0PiBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIGJvb2xlYW4gc3luY2gpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGFjdGl2aXR5KTsKLQkJdGhpcy5zeW5jaHJvbml6ZSA9IHN5bmNoOwotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJaWYgKHN5bmNoRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gREVGQVVMVF9TWU5DSF9GRUFUVVJFUzsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc3luY2hGZWF0dXJlcyA9IHN5bmNoRmVhdHVyZXM7Ci0JCX0KLQkJCi0JCXRoaXMuZHJvcEVsZW1lbnRzID0gZHJvcEVsZW1lbnRzOwotCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yID0gY3JlYXRlTmVzdGVkQ29tbWFuZEV4Y2VjdXRvcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTmVzdGVkQ29tbWFuZEV4Y2VjdXRvciBjcmVhdGVOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZENvbW1hbmRFeGNlY3V0b3IodGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBleGVjdXRlTmVzdGVkQ29tbWFuZHMoKSB7Ci0JCQkJaWYodGFza0Rlc2NMaXN0ICE9IG51bGwgJiYgIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJTGlzdCBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCQkuZ2V0TmVzdGVkQ29tbWFuZFByb3ZpZGVycygpOwotCQkJCQlpZiAoIW5lc3RlZENvbW1hbmRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXN0ZWRDb21tYW5kUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJSU5lc3RlZENvbW1hbmRQcm92aWRlciBjbWRQcm92aWRlciA9IChJTmVzdGVkQ29tbWFuZFByb3ZpZGVyKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlDb21tYW5kIGNtZCA9IGNtZFByb3ZpZGVyLmNyZWF0ZVJlbGF0ZWRPYmplY3RzKAotCQkJCQkJCQkJCXRhc2tEZXNjTGlzdCwgQlNEcm9wQ29tbWFuZC50aGlzKTsKLQkJCQkJCQkJaWYgKGNtZCAhPSBudWxsICYmIGNtZC5jYW5FeGVjdXRlKCkpIHsKLQkJCQkJCQkJCWNtZC5leGVjdXRlKCk7Ci0JCQkJCQkJCQlnZXROZXN0ZWRDb21tYW5kcygpLmFkZChjbWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpCi0JCQkJCQkJCS5sb2dFcnJvcihlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlzdXBlci5leGVjdXRlTmVzdGVkQ29tbWFuZHMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlpZihtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBtb25pdG9yOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRHJvcEVsZW1lbnRzKCkgewkJCi0JCUFycmF5TGlzdDxPYmplY3Q+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJdW53cmFwcGVkRHJvcEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoT2JqZWN0IG8gOiBkcm9wRWxlbWVudHMpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAobyk7Ci0JCQllbGVtZW50ID0gUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlbGVtZW50LCBjb25maWcpOwotCQkJaWYgKCFlbGVtZW50cy5jb250YWlucyhlbGVtZW50KQotCQkJCQkmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0ICYmICgoRU9iamVjdCkgZWxlbWVudCkKLQkJCQkJCQkuZUlzUHJveHkoKSkpIHsJCQkJCi0JCQkJZWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJCXVud3JhcHBlZERyb3BFbGVtZW50cy5hZGQobyk7Ci0JCQl9Ci0JCX0KLQkJZHJvcEVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBTZXRzIFVJIGNvbnRleHQgZm9yIHRoaXMgY29tbWFuZCwgdGhpcyBjYW4gYmUgYSBTaGVsbCBvYmplY3QKLS8vCSAqIEBwYXJhbSBVSUNvbnRleHQKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2V0VUlDb250ZXh0KE9iamVjdCBVSUNvbnRleHQpIHsKLS8vCQl0aGlzLlVJQ29udGV4dCA9IFVJQ29udGV4dDsKLS8vCX0KLQotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQljb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGRyb3BFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlkcm9wRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQlpZih1bndyYXBwZWREcm9wRWxlbWVudHMgIT0gbnVsbCkgewotCQkJdW53cmFwcGVkRHJvcEVsZW1lbnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgIT0gbnVsbCkgewotCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5jbGVhcigpOwotCQl9Ci0JCWlmIChhZGRlZE9iamVjdHMgIT0gbnVsbCkgewotCQkJYWRkZWRPYmplY3RzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmICh0YXNrRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJdGFza0Rlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHRhc2tEZXNjVG9OZXdTdGVwc01hcCAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY1RvTmV3U3RlcHNNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAodGFza0Rlc2NUb09sZEVzdGltYXRlTWFwICE9IG51bGwpIHsKLQkJCXRhc2tEZXNjVG9PbGRFc3RpbWF0ZU1hcC5jbGVhcigpOwotCQl9Ci0JCWlmIChyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCWlmICh0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZSAhPSBudWxsKSB7Ci0JCQl0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZS5jbGVhcigpOwotCQl9Ci0JCWlmKGJhdGNoQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQliYXRjaENvbW1hbmQuZGlzcG9zZSgpOwotCQl9Ci0JCWFjdGl2aXR5ID0gcHJvY2VzcyA9IG51bGw7Ci0JCWlmKG5lc3RlZENvbW1hbmRFeGNlY3V0b3IgIT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzID09IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChhY3Rpdml0eS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChuZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvcgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNsZWFyRGVzY3JpcHRvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJU2V0IGV4Y2x1ZGVTeW5jaEZlYXR1cmVzID0gbmV3IEhhc2hTZXQoREVGQVVMVF9TWU5DSF9GRUFUVVJFUyk7Ci0JCWV4Y2x1ZGVTeW5jaEZlYXR1cmVzLnJlbW92ZUFsbChzeW5jaEZlYXR1cmVzKTsKLQkJU2V0IGV4Y2x1ZGVGZWF0dXJlczsKLQkJaWYgKGV4Y2x1ZGVTeW5jaEZlYXR1cmVzLmlzRW1wdHkoKSkgewotCQkJZXhjbHVkZUZlYXR1cmVzID0gZXhjbHVkZVN5bmNoRmVhdHVyZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlleGNsdWRlRmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXhjbHVkZVN5bmNoRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBnZXREZXNjcmlwdG9yRmVhdHVyZSgoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKSk7Ci0JCQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCWV4Y2x1ZGVGZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNsZWFyRGVzY3JpcHRvcihkZXNjcmlwdG9yLAotCQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCWlmIChyZXQgJiYgZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlpZiAodGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUgPT0gbnVsbCkgewotCQkJCXRhc2tEZXNjcmlwdG9yc1RvVXBkYXRlID0gbmV3IEFycmF5TGlzdDxEZXNjcmlwdG9yPigpOwotCQkJfQotCQkJdGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUuYWRkKGRlc2NyaXB0b3IpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldERlc2NyaXB0b3JGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBsaW5rZWRFbGVtZW50RmVhdHVyZSkgewotCQlyZXR1cm4gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgRkVBVFVSRV9NQVAuZ2V0KGxpbmtlZEVsZW1lbnRGZWF0dXJlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJcHJlcGFyZURyb3BFbGVtZW50cygpOwotCQkKLQkJYm9vbGVhbiBiID0gIWRyb3BFbGVtZW50cy5pc0VtcHR5KCk7Ci0JCWlmIChiKSB7Ci0vLwkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJYmF0Y2hDb21tYW5kID0gbmV3IERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQoZmFsc2UsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZyk7IC8vVE9ETzogd2h5IGNsZWFyIG11c3QgYmUgZmFsc2UgPz8/Ci0KLS8vCQkJaWYgKHN5bmNocm9uaXplKSB7Ci0vLwkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IG5ldyBIYXNoU2V0KCk7Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sbGVjdEVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcoKSB7Ci0JCWlmIChlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnID09IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9BZGRUb0RlZmF1bHRDb25maWcgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRyb3BFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCXN3aXRjaCAoVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKAotCQkJCQkJcHJvY2VzcywgZWxlbWVudCkpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZy5hZGQoZWxlbWVudCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgLTE6Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBlbGVtZW50cyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGRlZmF1bHQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBtb2RpZmllZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmICghYWRkZWRUb0RlZmF1bHRDb25maWcgJiYgZWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZyAhPSBudWxsICYmICFlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLmlzRW1wdHkoKSkgewotCQkJaWYoYWRkZWRPYmplY3RzID09IG51bGwpIHsKLQkJCQlhZGRlZE9iamVjdHMgPSBuZXcgSGFzaFNldCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkZWRPYmplY3RzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50c1RvQWRkVG9EZWZhdWx0Q29uZmlnLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCVByb2Nlc3NVdGlsLmFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvY2VzcywgZWxlbWVudCwKLQkJCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCQlpZiAoIWFkZGVkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQlnZXRNb2RpZmllZFJlc291cmNlcygpLmFkZCgKLQkJCQkJCXByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKS5lUmVzb3VyY2UoKSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlhZGRlZFRvRGVmYXVsdENvbmZpZyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGdldFRvdGFsV29yaygpIHsKLQkJcmV0dXJuIDIwOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB3b3JrZWQoaW50IHVuaXRzT2ZXb3JrKSB7Ci0JCW1vbml0b3Iud29ya2VkKHVuaXRzT2ZXb3JrKTsKLQkJd29ya2VkVW5pdHMgPSB3b3JrZWRVbml0cyArIHVuaXRzT2ZXb3JrOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGdldFJlbWFpbmluZ1dvcmsoKSB7Ci0JCWludCByZW1haW5pbmcgPSBnZXRUb3RhbFdvcmsoKSAtIHdvcmtlZFVuaXRzOwotCQlpZihyZW1haW5pbmcgPCAwKSB7Ci0JCQlyZW1haW5pbmcgPSAwOwotCQl9Ci0JCXJldHVybiByZW1haW5pbmc7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25OZWVkZWQoKSB7Ci0JCXJldHVybiAhc3luY2hyb25pemU7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsJCQotCQkvLyBCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkvLwkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIGNhbmNlbGVkID0gIWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24oKTsKLQkJLy8gfQotCQkvLwkJCQotCQkvLyB9KTsKLQkJLy8JCQotCQkvLyAvL1RPRE86IFRoaXMgY2F1c2VkIE51bGxQb2ludGVyRXhjZXB0aW9uIG9yIFRocmVhZEFjY2Vzc0Vycm9yIHdoZW4KLQkJLy8gc2hvd2luZyBzZWxlY3Rpb24gZGlhbG9nIGlzIG5lZWRlZAotCQkvLyAvLwotCQkvLyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkvLwotCQkvLyBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MKLQkJLy8gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkvLyBjYW5jZWxlZCA9ICFwcmVFeGVjdXRlKCk7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gfTsKLQkJLy8gVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgbnVsbCk7Ci0JCS8vCQkKLQkJLy8gaWYoIWNhbmNlbGVkKSB7Ci0JCS8vIEJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCS8vCQkJCQotCQkvLyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8vIHJlZG8oKTsKLQkJLy8gfQotCQkvLwkJCQkKLQkJLy8gfSk7Ci0JCS8vIH0KLQotLy8JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQlpZiAoKCFzeW5jaHJvbml6ZSAmJiBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCkpICYmIHByZUV4ZWN1dGUoKSkgewotLy8JCQkJCXJlZG8oKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQl9KTsKLQkJCi0JCWlmKHVwZGF0ZURlZmF1bHRDb25maWd1cmF0aW9uTmVlZGVkKCkpIHsKLQkJCWlmKCFjb2xsZWN0RWxlbWVudHNUb0FkZFRvRGVmYXVsdENvbmZpZygpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQlmaW5hbCBTdHJpbmcgdGFza05hbWUgPSAobGFiZWwgPT0gbnVsbCA/ICIiIDogbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2sodGFza05hbWUsIGdldFRvdGFsV29yaygpKTsKLQkJCQkJQlNEcm9wQ29tbWFuZC50aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCQkJCQl3b3JrZWQoZ2V0UmVtYWluaW5nV29yaygpIC8gMyk7Ci0JCQkJCQotCQkJCQkvLyB0aGlzIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBwcmVFeGVjdXRlKCkgdG8gYWRkIHJlcXVpcmVkIGVsZW1lbnRzIHRvIGNvbmZpZ3VyYXRpb24KLQkJCQkJLy8gc28gdGhlIGNvbW1hbmQgY2FuIHJlYWxpemUgZGF0YSBjb3JyZWN0bHkKLQkJCQkJLy8KLQkJCQkJYWRkVG9EZWZhdWx0Q29uZmlndXJhdGlvbigpOwotCQkJCQl3b3JrZWQoZ2V0UmVtYWluaW5nV29yaygpIC8gMyk7Ci0JCQkJCQotCQkJCQlpZiAocHJlRXhlY3V0ZSgpKSB7Ci0JCQkJCQl3b3JrZWQoZ2V0UmVtYWluaW5nV29yaygpIC8gMyk7Ci0JCQkJCQlyZWRvKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9OwotCQlpZihydW5Bc0pvYikgewotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkFzSm9iKHJ1bm5hYmxlLCB0YXNrTmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0vLwkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5JblVJKHJ1bm5hYmxlLCAoU2hlbGwpbnVsbCk7Ci0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIucnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBudWxsKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCXRyeSB7Ci0JCQkvLyBhZGQgZWxlbWVudHMgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQKLQkJCS8vCi0JCQlhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKCk7Ci0JCQkKLQkJCWRvRXhlY3V0ZSgpOwotCQkJdXBkYXRlRGVzY3JpcHRvcnMoKTsKLQkJCQotCQkJbG9uZyB0aW1lID0gMDsKLQkJCWlmKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQl0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQkJaWYoVG5nVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQlNEcm9wQ29tbWFuZC5yZWRvKCk6IGV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpLiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotCQkJfQotCQkJCi0JCQlleGVjdXRlZCA9IHRydWU7Ci0JCX0KLQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGRlc2NyaXB0b3JzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChzeW5jaHJvbml6ZSkgewotCQkJY2xlYXJEZXNjcmlwdG9ycygpOwotCQl9Ci0KLQkJLy8gdXBkYXRlIG5ldyB2YWx1ZXM7Ci0JCS8vCi0JCWJhdGNoQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQotCQl1cGRhdGVUYXNrRGVzY3JpcHRvcnMoKTsKLQotCQlzZXRSZXNwb25zaWJsZVJvbGVzKCk7Ci0JfQotCi0vLwkvKioKLS8vCSAqIEBwYXJhbSBkZXNjCi0vLwkgKiBAcGFyYW0gZmVhdHVyZQotLy8JICogQHBhcmFtIHZhbHVlCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHNhdmVPbGRGZWF0dXJlVmFsdWUoRGVzY3JpcHRvciBkZXNjLAotLy8JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8JCWlmIChkZXNjcmlwdG9yVG9PbGRGZWF0dXJlVmFsdWVzTWFwID09IG51bGwpIHsKLS8vCQkJZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0vLwkJfQotLy8JCU9iamVjdCB2YWx1ZSA9IGRlc2MuZUdldChmZWF0dXJlKTsKLS8vCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0vLwkJCXZhbHVlID0gbmV3IEFycmF5TGlzdCgoTGlzdCl2YWx1ZSk7Ci0vLwkJfQotLy8JCU1hcCBmZWF0dXJlTWFwID0gKE1hcCkgZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcC5nZXQoZGVzYyk7Ci0vLwkJaWYgKGZlYXR1cmVNYXAgPT0gbnVsbCkgewotLy8JCQlmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLS8vCQkJZGVzY3JpcHRvclRvT2xkRmVhdHVyZVZhbHVlc01hcC5wdXQoZGVzYywgZmVhdHVyZU1hcCk7Ci0vLwkJfQotLy8JCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIHZhbHVlKTsKLS8vCX0KLQotCXByb3RlY3RlZCB2b2lkIHVuZG9VcGRhdGVEZXNjcmlwdG9ycygpIHsKLQkJdW5kb1NldFJlc3BvbnNpYmxlUm9sZSgpOwotCi0JCXVuZG9VcGRhdGVUYXNrRGVzY3JpcHRvcnMoKTsKLQotCQkvLyByZXN0b3JlIG9sZCB2YWx1ZXMKLQkJLy8KLQkJYmF0Y2hDb21tYW5kLnVuZG8oKTsKLQotCQkvLyByZXN0b3JlIHZhbHVlIGZvciByZWZyZXNoYWJsZSBmZWF0dXJlcyB0aGF0IGhhZCBiZWVuIGNsZWFyZWQKLQkJLy8KLQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQl1bmRvQ2xlYXJEZXNjcmlwdG9ycygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJaWYgKCFiYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKS5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQljbGVhckRlc2NyaXB0b3IoKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQkJLy8gZGVzY3JpcHRvcnNUb1JlZnJlc2guY2xlYXIoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgYWZmZWN0ZWQgdGFzayBkZXNjcmlwdG9ycyB3aXRoIG5ldyBkYXRhIGZyb20gbWV0aG9kIGNvbnRlbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFza0Rlc2NyaXB0b3JzKCkgewotCQlpZiAodGFza0Rlc2NyaXB0b3JzVG9VcGRhdGUgIT0gbnVsbCkgewotCQkJLy8gcmVmcmVzaCBzdGVwcyBmcm9tIHRoZSBhc3NvY2lhdGVkIHRhc2sKLQkJCS8vCi0JCQlpZihzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKSkpIHsKLQkJCQlpZiAodGFza0Rlc2NUb05ld1N0ZXBzTWFwID09IG51bGwpIHsKLQkJCQkJdGFza0Rlc2NUb05ld1N0ZXBzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQl9Ci0JCQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrRGVzY3JpcHRvcnNUb1VwZGF0ZS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCQlUYXNrIHRhc2sgPSB0YXNrRGVzYy5nZXRUYXNrKCk7Ci0JCQkJCWlmICh0YXNrICE9IG51bGwgJiYgISgoRU9iamVjdCkgdGFzaykuZUlzUHJveHkoKSkgewotCQkJCQkJTGlzdCBzdGVwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh0YXNrCi0JCQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKSwgdGFzaywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLCBjb25maWcpOwotCQkJCQkJCi0JCQkJCQkvLyBhZGQgdGhvc2Ugc3RlcHMgdG8gVGFza0Rlc2NyaXB0b3IgaWYgdGhleSBhcmUgbm90IHRoZXJlCi0JCQkJCQkvLyB5ZXQuCi0JCQkJCQkvLwotCQkJCQkJQXJyYXlMaXN0IG5ld1N0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLnJldGFpbkFsbChzdGVwcyk7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlcjEuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBzdGVwID0gaXRlcjEubmV4dCgpOwotCQkJCQkJCWlmICghdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmNvbnRhaW5zKHN0ZXApKSB7Ci0JCQkJCQkJCW5ld1N0ZXBzLmFkZChzdGVwKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIW5ld1N0ZXBzLmlzRW1wdHkoKSkgewotCQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGRBbGwobmV3U3RlcHMpOwotCQkJCQkJCXRhc2tEZXNjVG9OZXdTdGVwc01hcC5wdXQodGFza0Rlc2MsIG5ld1N0ZXBzKTsKLS8vCQkJCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJCS5wcmludGxuKCJCU0Ryb3BDb21tYW5kLnVwZGF0ZVRhc2tEZXNjcmlwdG9ycygpOiBjaGFuZ2VkIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmRvVXBkYXRlVGFza0Rlc2NyaXB0b3JzKCkgewotCQlpZiAodGFza0Rlc2NUb05ld1N0ZXBzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tEZXNjVG9OZXdTdGVwc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLnJlbW92ZUFsbCgKLQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvIHRocnUgYWxsIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgb2YgdGhpcyBhY3Rpdml0eSBhbmQgc2V0IHRoZQotCSAqIHJlc3BvbnNpYmxlIHJvbGUgZm9yIHRoZW0gaWYgdGhlcmUgaXMgYW55Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFJlc3BvbnNpYmxlUm9sZXMoKSB7Ci0JCWlmKCFzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYocmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQlyZWZyZXNoUmVzcG9uc2libGVGb3JDb21tYW5kID0gbmV3IEJhdGNoQ29tbWFuZCh0cnVlKTsKLSAKLQkJTGlzdCBickVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJTGlzdCB3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJFbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQl3cERlc2NMaXN0LmFkZChvYmopOwotCQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQob2JqKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdG9yLm5leHQoKTsKLQkJCVJvbGUgcm9sZSA9IHJvbGVEZXNjLmdldFJvbGUoKTsKLQkJCWlmIChyb2xlICE9IG51bGwpIHsJCQkJCi0JCQkJTGlzdCByZXNwb25zaWJsZVdvcmtQcm9kdWN0cyA9IChMaXN0KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2Uocm9sZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCBjb25maWcpOwotCQkJCUxpc3QgcmVzcG9uc2libGVXUERMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGogPSB3cERlc2NMaXN0LnNpemUoKSAtIDE7IGogPiAtMTsgai0tKSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB3cERlc2NMaXN0Ci0JCQkJCQkJLmdldChqKTsKLS8vCQkJCQlSb2xlRGVzY3JpcHRvciByZXNwb25zaWJsZVJvbGVEZXNjID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcih3cERlc2MpOwotLy8JCQkJCWlmIChyZXNwb25zaWJsZVdvcmtQcm9kdWN0cy5jb250YWlucyh3cERlc2MKLS8vCQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpKQotLy8JCQkJCQkJJiYgIHJlc3BvbnNpYmxlUm9sZURlc2MgIT0gcm9sZURlc2MpIHsKLS8vCQkJCQkJd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXAucHV0KHdwRGVzYywgcmVzcG9uc2libGVSb2xlRGVzYyk7Ci0vLy8vCQkJCQkJd3BEZXNjLnNldFJlc3BvbnNpYmxlUm9sZShyb2xlRGVzYyk7Ci0vLwkJCQkJCXJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwRGVzYyk7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYocmVzcG9uc2libGVXb3JrUHJvZHVjdHMuY29udGFpbnMod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJCQlyZXNwb25zaWJsZVdQRExpc3QuYWRkKHdwRGVzYyk7Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCWlmKCFyb2xlRGVzYy5nZXRSZXNwb25zaWJsZUZvcigpLmVxdWFscyhyZXNwb25zaWJsZVdQRExpc3QpKSB7Ci0JCQkJCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuYWRkRmVhdHVyZVZhbHVlcyhyb2xlRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgcmVzcG9uc2libGVXUERMaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLnVuZG9OZXN0ZWRDb21tYW5kcygpOwotCQkKLQkJLy8gcmVtb3ZlIGFueSBvYmplY3QgdGhhdCBoYWQgYmVlbiBhZGRlZCB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCWlmIChhZGRlZE9iamVjdHMgIT0gbnVsbCAmJiAhYWRkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRlZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYWRkZWRUb0RlZmF1bHRDb25maWcgPSBmYWxzZTsKLQkJfQotCi0JCXVuZG9VcGRhdGVEZXNjcmlwdG9ycygpOwotCi0JCWRvVW5kbygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB1bmRvQ2xlYXJEZXNjcmlwdG9ycygpIHsKLQkJaWYoZGVzY3JpcHRvclRvT2xkUmVmcmVzaGFibGVGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlNYXAgZmVhdHVyZU1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlkZXNjCi0JCQkJCS5lU2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGVudHJ5LmdldEtleSgpLCBlbnRyeQotCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmRvZXMgdGhlIGNoYW5nZSBtYWRlIGJ5Ci0JICoge0BsaW5rICNzZXRSZXNwb25zaWJsZVJvbGVzKCkgc2V0UmVzcG9uc2libGVSb2xlcygpIH0KLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5kb1NldFJlc3BvbnNpYmxlUm9sZSgpIHsKLS8vCQlpZih3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcCAhPSBudWxsICYmICF3cGRUb09sZFJlc3BvbnNpYmxlUm9sZU1hcC5pc0VtcHR5KCkpIHsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9PbGRSZXNwb25zaWJsZVJvbGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLS8vCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeS5nZXRLZXkoKTsKLS8vCQkJCSgoUm9sZURlc2NyaXB0b3IpIGVudHJ5LmdldFZhbHVlKCkpLmdldFJlc3BvbnNpYmxlRm9yKCkucmVtb3ZlKHdwZCk7Ci0vLwkJCX0KLS8vCQl9Ci0JCWlmKHJlZnJlc2hSZXNwb25zaWJsZUZvckNvbW1hbmQgIT0gbnVsbCkgewotCQkJcmVmcmVzaFJlc3BvbnNpYmxlRm9yQ29tbWFuZC51bmRvKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9FeGVjdXRlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1VuZG8oKTsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIElFeGVjdXRvciB7Ci0JCWJvb2xlYW4gcHJlRXhlY3V0ZSgpOwotCi0JCXZvaWQgZG9FeGNlY3V0ZSgpOwotCi0JCXZvaWQgZG9VbmRvKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4MGUwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgNy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQKLQkJaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU2V0IE5PTkVNUFRZX0FUVFJJQlVURVMgPSBuZXcgSGFzaFNldChBcnJheXMuYXNMaXN0KAotCQkJbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkJCX0KLQkpKTsKLQkKLQotCXByb3RlY3RlZCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JcHJvdGVjdGVkIFNldCBzeW5jaEZlYXR1cmVzOwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIEhhc2hNYXAgZmVhdHVyZU1hcDsKLQotCXB1YmxpYyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQgc3luY2hGZWF0dXJlcywgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJaWYgKHN5bmNoRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gQlNEcm9wQ29tbWFuZC5ERUZBVUxUX1NZTkNIX0ZFQVRVUkVTOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJfQotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmKGRlc2NyaXB0b3IuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZGVzY3JpcHRvci5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlT2xkRmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWZlYXR1cmVNYXAucHV0KGZlYXR1cmUsIGRlc2NyaXB0b3IuZUdldChmZWF0dXJlKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyB1cGRhdGUgdGhlIGxpbmtlZCBlbGVtZW50IGlmIHJlcXVpcmVkCi0JCS8vCi0JCU1ldGhvZEVsZW1lbnQgZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2NyaXB0b3IpOwotCQlPYmplY3QgcmVzb2x2ZWQgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGUsIGNvbmZpZyk7Ci0JCWlmKHJlc29sdmVkICE9IGUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCQkJaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsJCQkJCQotCQkJfQotCQkJZWxzZSBpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpOwkJCQkJCi0JCQl9Ci0JCQllbHNlIGlmKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7CQkJCQkKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZlYXR1cmUgPSBudWxsOwotCQkJfQotCQkJc2F2ZU9sZEZlYXR1cmVWYWx1ZShmZWF0dXJlKTsKLQkJCWUgPSAoTWV0aG9kRWxlbWVudCkgcmVzb2x2ZWQ7Ci0JCQlkZXNjcmlwdG9yLmVTZXQoZmVhdHVyZSwgZSk7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHN5bmNoRmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZiA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZiBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpIHsKLQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBmOyAKLQkJCQlFQXR0cmlidXRlIGRlc2NBdHRyaWIgPSAoRUF0dHJpYnV0ZSkgQlNEcm9wQ29tbWFuZC5GRUFUVVJFX01BUC5nZXQoYXR0cmliKTsKLQkJCQlpZihkZXNjQXR0cmliICE9IG51bGwpIHsKLQkJCQkJaWYoTk9ORU1QVFlfQVRUUklCVVRFUy5jb250YWlucyhhdHRyaWIpKSB7Ci0JCQkJCQkvLyByZWZyZXNoIGF0dHJpYnV0ZSB0aGF0IGNhbiBub3QgYmUgZW1wdHkKLQkJCQkJCS8vCi0JCQkJCQlPYmplY3QgdmFsdWUgPSAgZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCA/IAotCQkJCQkJCQkoU3RyaW5nKSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgYXR0cmliLCBjb25maWcpIAotCQkJCQkJCQk6IGUuZUdldChhdHRyaWIpOwotCQkJCQkJLy8gaWYgYXR0cml1YnV0ZSBpcyBwcmVzZW50YXRpb24gbmFtZSBhbmQgbmV3IHZhbHVlIGlzIGJsYW5rLCBjb3B5IG5hbWUgb3ZlcgotCQkJCQkJaWYgKChkZXNjQXR0cmliLmVxdWFscyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkpICYmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJdmFsdWUgPSBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ID8gCi0JCQkJCQkJCQkoU3RyaW5nKSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRBdHRyaWJ1dGUoKFZhcmlhYmlsaXR5RWxlbWVudCkgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgY29uZmlnKSAKLQkJCQkJCQkJCTogZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQkJT2JqZWN0IGRlc2NWYWx1ZSA9IGRlc2NyaXB0b3IuZUdldChkZXNjQXR0cmliKTsKLQkJCQkJCi0JCQkJCQlpZigodmFsdWUgPT0gbnVsbCAmJiBkZXNjVmFsdWUgIT0gbnVsbCkgfHwgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscyhkZXNjVmFsdWUpKSkgewotCQkJCQkJCXNhdmVPbGRGZWF0dXJlVmFsdWUoZGVzY0F0dHJpYik7Ci0JCQkJCQkJZGVzY3JpcHRvci5lU2V0KGRlc2NBdHRyaWIsIHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIHJlc2V0IGF0dHJpYnV0ZSB0byBpdHMgZGVmYXVsdCB2YWx1ZQotCQkJCQkJLy8KLQkJCQkJCXNhdmVPbGRGZWF0dXJlVmFsdWUoZGVzY0F0dHJpYik7Ci0JCQkJCQlkZXNjcmlwdG9yLmVTZXQoZGVzY0F0dHJpYiwgZGVzY0F0dHJpYi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlleGVjdXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZihmZWF0dXJlTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmZWF0dXJlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZW50cnkKLQkJCQkuZ2V0S2V5KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCQljYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9CQotCQkJZmVhdHVyZU1hcC5jbGVhcigpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZmVhdHVyZU1hcCAhPSBudWxsKSB7Ci0JCQlmZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCQlmZWF0dXJlTWFwID0gbnVsbDsKLQkJfQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Db250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM1Mjc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvbnRyaWJ1dGVUb0FjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udHJpYnV0ZVRvQWN0aXZpdHlDb21tYW5kIGV4dGVuZHMgVmFyeUFjdGl2aXR5Q29tbWFuZCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqLwotCXB1YmxpYyBDb250cmlidXRlVG9BY3Rpdml0eUNvbW1hbmQoCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXN1cGVyKHdyYXBwZXIpOwotCQlzZXRMYWJlbChMaWJyYXJ5RWRpdFJlc291cmNlcy5jb250cmlidXRlVG9BY3Rpdml0eV90ZXh0KTsgCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuVmFyeUFjdGl2aXR5Q29tbWFuZCNkb1ZhcnkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVmFyeSgpIHsKLQkJUHJvY2Vzc1V0aWwuY29udHJpYnV0ZVRvQWN0aXZpdHkod3JhcHBlciwgY3JlYXRlZEFjdGl2aXRpZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ29weUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDk5ZmRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0NvcHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb3B5SGVscGVyIGV4dGVuZHMgQ29weUNvbW1hbmQuSGVscGVyIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyNjQzODkzOTM5NTU2MzkwMDRMOwotCi0JcHJpdmF0ZSBNYXAgY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgTWFwIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBNYXAgYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgTWFwPFN0cmluZywgQnJlYWtkb3duRWxlbWVudD4gd3JhcHBlclBhdGhUb0NvcHlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJyZWFrZG93bkVsZW1lbnQ+KCk7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLkhhc2hNYXAjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewkJCi0JCXN1cGVyLmNsZWFyKCk7Ci0JCWNvcHlUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCWJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcC5jbGVhcigpOwotCQliYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAuY2xlYXIoKTsKLQkJd3JhcHBlclBhdGhUb0NvcHlNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPcmlnaW5hbChPYmplY3QgY29weSkgewotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXAuZ2V0KGNvcHkpOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHB1dFZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXJldHVybiBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAucHV0KGJhc2UsIHZlKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCByZW1vdmVWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJcmV0dXJuIGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5yZW1vdmUoYmFzZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgcHV0QmFja3VwQ29weShWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IGJhY2t1cCkgewotCQlyZXR1cm4gYmFzZVRvQmFja3VwVmFyaWFiaWxpdHlFbGVtZW50TWFwLnB1dChiYXNlLCBiYWNrdXApOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IHB1dChFT2JqZWN0IGtleSwgRU9iamVjdCB2YWx1ZSkgewotCQljb3B5VG9PcmlnaW5hbE1hcC5wdXQodmFsdWUsIGtleSk7Ci0JCXJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgYmFzaWNQdXQoRU9iamVjdCBrZXksIEVPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG9sZCA9IHN1cGVyLnB1dChrZXksIHZhbHVlKTsKLQkJaW5pdGlhbGl6YXRpb25MaXN0LnJlbW92ZShrZXkpOwotCQlyZXR1cm4gb2xkOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlciNnZXRDb3B5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldENvcHkoRU9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlPYmplY3QgdmUgPSBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLCBvYmplY3QpOwotCQkJaWYodmUgIT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci5nZXRDb3B5KChFT2JqZWN0KSB2ZSk7Ci0JCQl9Ci0JCX0KLQkJRU9iamVjdCBjb3B5ID0gc3VwZXIuZ2V0Q29weShvYmplY3QpOwotCQlpZihjb3B5ID09IG51bGwpIHsKLQkJCS8vIGdldCBiYWNrdXAgY29weQotCQkJLy8KLQkJCU9iamVjdCB2ZSA9IGdldFZhcmlhYmlsaXR5RWxlbWVudChiYXNlVG9CYWNrdXBWYXJpYWJpbGl0eUVsZW1lbnRNYXAsIG9iamVjdCk7Ci0JCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENvcHkoKEVPYmplY3QpIHZlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFZhcmlhYmlsaXR5RWxlbWVudChNYXAgYmFzZVRvVmFyaWFiaWxpdHlFbGVtZW50TWFwLCBPYmplY3QgYmFzZSkgewotCQlPYmplY3QgdmUgPSBudWxsOwkJCi0JCWRvIHsKLQkJCWJhc2UgPSBiYXNlVG9WYXJpYWJpbGl0eUVsZW1lbnRNYXAuZ2V0KGJhc2UpOwotCQkJaWYoYmFzZSAhPSBudWxsKSB7Ci0JCQkJdmUgPSBiYXNlOwotCQkJfQotCQl9IHdoaWxlIChiYXNlICE9IG51bGwpOwotCQlyZXR1cm4gdmU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyI2dldENvcHlUYXJnZXQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0Q29weVRhcmdldChFT2JqZWN0IHRhcmdldCwgYm9vbGVhbiBjb3B5UmVxdWlyZWQpIHsKLQkJaWYoY29weVJlcXVpcmVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0Q29weSh0YXJnZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJRU9iamVjdCBjb3BpZWQgPSBnZXRDb3B5KHRhcmdldCk7Ci0JCQlpZiAoY29waWVkID09IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRhcmdldDsKLQkJCX0KLQkJCXJldHVybiBjb3BpZWQ7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE1hcCBnZXRPYmplY3RUb0NvcHlNYXAoKSB7Ci0JCUhhc2hTZXQgb2JqZWN0cyA9IG5ldyBIYXNoU2V0KGJhc2VUb0JhY2t1cFZhcmlhYmlsaXR5RWxlbWVudE1hcC5rZXlTZXQoKSk7Ci0JCW9iamVjdHMuYWRkQWxsKGJhc2VUb1ZhcmlhYmlsaXR5RWxlbWVudE1hcC5rZXlTZXQoKSk7Ci0JCW9iamVjdHMuYWRkQWxsKGtleVNldCgpKTsJCQotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCW1hcC5wdXQob2JqZWN0LCBnZXRDb3B5KChFT2JqZWN0KSBvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0JCQotCi0JcHVibGljIHZvaWQgcHV0V3JhcHBlckNvcHkoU3RyaW5nIGd1aWRQYXRoLCBCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYoZS5nZXROYW1lKCkuZXF1YWxzKCJjbG9zZS1vdXRfcHJvamVjdCIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfQotCQl3cmFwcGVyUGF0aFRvQ29weU1hcCAucHV0KGd1aWRQYXRoLCBlKTsKLQl9Ci0JCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0V3JhcHBlckNvcHkoU3RyaW5nIGd1aWRQYXRoKSB7Ci0JCXJldHVybiB3cmFwcGVyUGF0aFRvQ29weU1hcC5nZXQoZ3VpZFBhdGgpOwotCX0KLQotCXB1YmxpYyBNYXA8U3RyaW5nLCBCcmVha2Rvd25FbGVtZW50PiBnZXRXcmFwcGVyUGF0aFRvQ29weU1hcCgpIHsKLQkJcmV0dXJuIHdyYXBwZXJQYXRoVG9Db3B5TWFwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0ZTQ1Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlVzZXJJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5Qcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuTWVzc2FnZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogRXhlY3V0ZXMgdGhlIENyZWF0ZSBQcm9jZXNzIENvbXBvbmVudCBjb21tYW5kLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudENvbW1hbmQgZXh0ZW5kcyBDcmVhdGVDaGlsZENvbW1hbmQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFQ2xhc3M+IEVDTEFTU0VTID0gbmV3IEhhc2hTZXQ8RUNsYXNzPigpOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHByb2Nlc3M7Ci0KLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0Jc3RhdGljIHsKLQkJRUNMQVNTRVMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb21wYXJlQnlOYW1lIGltcGxlbWVudHMgQ29tcGFyYXRvcjxNZXRob2RFbGVtZW50PiB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE1ldGhvZEVsZW1lbnQgb2JqMSwgTWV0aG9kRWxlbWVudCBvYmoyKSB7Ci0JCQlTdHJpbmcgbmFtZTEgPSAoKE1ldGhvZEVsZW1lbnQpIG9iajEpLmdldE5hbWUoKTsKLQkJCVN0cmluZyBuYW1lMiA9ICgoTWV0aG9kRWxlbWVudCkgb2JqMikuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIG5hbWUxLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZTIpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENvbmZpZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCi0JCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLm5vRGVmYXVsdENvbmZpZ0Vycm9yX21zZzsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENyZWF0ZVByb2Nlc3NDb21wb25lbnRDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBjaGlsZCwgaW50IGluZGV4LAotCQkJQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24sIEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgZmVhdHVyZSwgY2hpbGQsIGluZGV4LCBzZWxlY3Rpb24sIGhlbHBlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuVW5kbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KG93bmVyKTsKLQkJCi0JCU9iamVjdCBzaGVsbCA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCk7Ci0JCQotCQkvLyBUaGUgb3duZXIgbXVzdCBiZSB1cGRhdGFibGUuCi0JCS8vCi0JCXN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShvd25lciwgc2hlbGwpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgY29uZmlncyA9IGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJTGlzdCBtZXRob2RDb25maWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb25maWdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KSkgewotCQkJCW1ldGhvZENvbmZpZ3MuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1ldGhvZENvbmZpZ3MuaXNFbXB0eSgpKSB7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCQkwLCBMaWJyYXJ5RWRpdFJlc291cmNlcy5ub0NvbmZpZ0Vycm9yX21zZywgbnVsbCk7Ci0vLwkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoCi0vLwkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuY3JlYXRlUHJvY2Vzc190ZXh0LAotLy8JCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLm5vQ29uZmlnRXJyb3JfbXNnKTsJCQkKLQkJCXJldHVybjsKLQkJfQotCi0JCVByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIpIGhlbHBlcjsKLQotCQlBcnJheUxpc3QgcHJvY0NsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChhZGFwdGVyLmdldFByb2Nlc3NUeXBlKCkgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkgewotCQkJcHJvY0NsYXNzZXMuYWRkKERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcyk7Ci0JCQlwcm9jQ2xhc3Nlcy5hZGQoQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MpOwotCQl9Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbigoRWxlbWVudCkgb3duZXIpOwkJCi0JCUxpc3QgYmFzZVByb2NMaXN0ID0gVG5nVXRpbC5nZXRBdmFpbGFibGVCYXNlUHJvY2Vzc2VzKHBsdWdpbiwKLQkJCQlwcm9jQ2xhc3Nlcyk7Ci0KLQkJLy8gc29ydCBieSBuYW1lCi0JCUNvbGxlY3Rpb25zLnNvcnQobWV0aG9kQ29uZmlncywgbmV3IENvbXBhcmVCeU5hbWUoKSk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIHByb2NDdHhzID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25bbWV0aG9kQ29uZmlncwotCQkJCS5zaXplKCldOwotCQltZXRob2RDb25maWdzLnRvQXJyYXkocHJvY0N0eHMpOwotCi0JCVByb2Nlc3NbXSBiYXNlUHJvY2Vzc2VzID0gbmV3IFByb2Nlc3NbYmFzZVByb2NMaXN0LnNpemUoKV07Ci0JCWJhc2VQcm9jTGlzdC50b0FycmF5KGJhc2VQcm9jZXNzZXMpOwotCi0JCWZpbmFsIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGQ7Ci0JCUVDbGFzcyBwcm9jVHlwZSA9IGFkYXB0ZXIuZ2V0UHJvY2Vzc1R5cGUoKTsKLQkJcHJvY0NvbXAuc2V0UHJvY2VzcygoUHJvY2VzcykgVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlKHByb2NUeXBlKSk7Ci0JCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCUxpc3QgdXNlcklucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVZhbGlkYXRvciBuYW1lVmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcigKLQkJCQlvd25lciwgcHJvY0NvbXApOwotCQkvLyBuYW1lCi0JCVVzZXJJbnB1dCBuYW1lSW5wdXQgPSBuZXcgVXNlcklucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0LCBVc2VySW5wdXQuVEVYVCwKLQkJCQlmYWxzZSwgbnVsbCwgbnVsbCwgbmFtZVZhbGlkYXRvciwgbnVsbCk7Ci0JCXVzZXJJbnB1dHMuYWRkKG5hbWVJbnB1dCk7Ci0JCQotCQkvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJVXNlcklucHV0IGRlZmF1bHRDb25maWdJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVmYXVsdENvbmZpZ0xhYmVsX3RleHQsIFVzZXJJbnB1dC5TRUxFQ1RJT04sCi0JCQkJZmFsc2UsIG1ldGhvZENvbmZpZ3MsIG5ldyBJdGVtTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0sIG5ldyBDb25maWdWYWxpZGF0b3IoKSwgbnVsbCk7Ci0JCXVzZXJJbnB1dHMuYWRkKGRlZmF1bHRDb25maWdJbnB1dCk7Ci0JCS8vIGJhc2UgcHJvY2VzcwotCQlVc2VySW5wdXQgYmFzZVByb2NJbnB1dCA9IG51bGw7Ci0JCQotCQlpZihwcm9jQ29tcC5nZXRQcm9jZXNzKCkgaW5zdGFuY2VvZiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgewotCQkJYmFzZVByb2NJbnB1dCA9IG5ldyBVc2VySW5wdXQoTGlicmFyeUVkaXRSZXNvdXJjZXMuYmFzZWRPblByb2Nlc3Nlc0xhYmVsX3RleHQsIFVzZXJJbnB1dC5TRUxFQ1RJT04sCi0JCQkJCXRydWUsIGJhc2VQcm9jTGlzdCwgbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpLCAgbnVsbCk7Ci0JCQl1c2VySW5wdXRzLmFkZChiYXNlUHJvY0lucHV0KTsKLQkJfQotCQkKLQkJYm9vbGVhbiBjYW5FeGVjdXRlID0gZmFsc2U7Ci0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5DcmVhdGVQcm9jZXNzQ29tcG9uZW50Q29tbWFuZF9NZXNzYWdlLCAKLQkJCQlUbmdVdGlsLmdldFR5cGVUZXh0KHByb2NUeXBlLmdldE5hbWUoKSkudG9Mb3dlckNhc2UoKSk7Ci0JCQotCQkvLyByZXF1ZXN0IGlucHV0Ci0JCWlmICh1aUhhbmRsZXIucmVxdWVzdElucHV0KExpYnJhcnlFZGl0UmVzb3VyY2VzLm5ld1Byb2Nlc3NDb21wb25lbnREaWFsb2dfdGl0bGUsIAotCQkJCW1zZywgdXNlcklucHV0cykpIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgbmFtZUlucHV0LmdldElucHV0KCk7Ci0JCQlwcm9jQ29tcC5zZXROYW1lKG5hbWUpOwotCQkJcHJvY2VzcyA9IHByb2NDb21wLmdldFByb2Nlc3MoKTsKLQkJCXByb2Nlc3Muc2V0TmFtZShuYW1lKTsKLQkJCXByb2Nlc3Muc2V0UHJlc2VudGF0aW9uTmFtZShuYW1lKTsKLQkJCXByb2Nlc3Muc2V0RGVmYXVsdENvbnRleHQoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGRlZmF1bHRDb25maWdJbnB1dC5nZXRJbnB1dCgpKTsKLQkJCWlmKGJhc2VQcm9jSW5wdXQgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBiYXNlUHJvY0lucHV0LmdldElucHV0KCk7Ci0JCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCSgoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpcHJvY0NvbXApLmdldEJhc2VkT25Qcm9jZXNzZXMoKS5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJY2FuRXhlY3V0ZSA9IHRydWU7Ci0JCX0KLQotCQlpZiAoY2FuRXhlY3V0ZSkgewotCQkJLy8gY3JlYXRlIHByb2Nlc3MgY29tcG9uZW50IG5lZWQgdG8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIHRoYXQKLQkJCS8vIGhhcyBiZWVuIHNlbGVjdGVkIGFzCi0JCQkvLyBkZWZhdWx0IGNvbnRleHQgb2YgaXRzIHByb2Nlc3MuIENoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLQkJCS8vIGlzIHVwZGF0YWJsZQotCQkJLy8KLQkJCXN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShwcm9jQ29tcC5nZXRQcm9jZXNzKCkKLQkJCQkJLmdldERlZmF1bHRDb250ZXh0KCksIHNoZWxsKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCi0JCQlDb21tYW5kIGNtZCA9IGdldENvbW1hbmQoKTsKLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gKChNZXRob2RFbGVtZW50QWRkQ29tbWFuZCkgY21kKS5nZXRTdGF0dXMoKTsKLQkJCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJdGhpcy5zdGF0dXMgPSBzdGF0dXM7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCQotCQkJLy8gbmVlZCB0byBhZGQgdGhlIHBhcmVudCBwYWNrYWdlcyBhbmQgcGx1Z2luIGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCS8vIGFzIHdlbGwKLQkJCS8vIE5ldyBwcm9jZXNzIGluIG5ldyBwbHVnLWluIG5vdCBhdXRvbWF0aWNhbGx5IHZpc2libGUgaW4KLQkJCS8vIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJTGlzdCBwa2dzID0gcHJvY0N0eC5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQlmb3IgKEVPYmplY3Qgb2JqID0gcHJvY0NvbXA7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJcGtncy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcm9jQ3R4LmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQkJCi0JCQlwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpLmFkZChwcm9jQ3R4KTsKLQkJCXByb2Nlc3Muc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jZXNzKSk7Ci0KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJLy8gc2F2ZSB0aGUgcmVzb3VyY2Ugb2YgcGFyZW50IFByb2Nlc3NQYWNrYWdlCi0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKChFT2JqZWN0KSBvd25lcikuZVJlc291cmNlKCk7Ci0JCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKQotCQkJCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gc2F2ZSB0aGUgcmVzb3VyY2Ugb2YgbmV3bHkgY3JlYXRlZAotCQkJCQkJCS8vIFByb2Nlc3NDb21wb25lbnQgYWdhaW4gYWZ0ZXIgY3JlYXRpbmcgcHJvY2VzcydzCi0JCQkJCQkJLy8gcHJlc2VudGF0aW9uCi0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocHJvY0NvbXAuZVJlc291cmNlKCkpOwotCi0JCQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCi0JCQkJCQkJLy8gc2F2ZSB0aGUgcmVzb3VyY2Ugb2YgdGhlIHByb2Nlc3MncyBkZWZhdWx0Ci0JCQkJCQkJLy8gY29udGV4dAotCQkJCQkJCXBlcnNpc3Rlci5zYXZlKHByb2NDdHguZVJlc291cmNlKCkpOwotCi0JCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQkJCQotCQkJCQkJCS8vIGNyZWF0ZSBuZXcgZGlhZ3JhbSBmaWxlCi0JCQkJCQkJLy8KLQkJCQkJCQkKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhleCk7Ci0JCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24oCi0JCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuc2F2ZVByb2Nlc3NFcnJvcl9yZWFzb24sCi0JCQkJCQkJCQkJCQkJcHJvY0NvbXAuZ2V0TmFtZSgpKSwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCi0JCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJLnJ1bldpdGhQcm9ncmVzcygKLQkJCQkJCQlydW5uYWJsZSwKLQkJCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5jcmVhdGluZ1Byb2Nlc3NDb21wb25lbnRUYXNrX25hbWUsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHByb2NDb21wLmdldE5hbWUoKSB9KSk7IAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJc3VwZXIucmVkbygpOwotCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIGNoaWxkOwotCQlNZXRob2RDb25maWd1cmF0aW9uIHByb2NDdHggPSBwcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCWlmIChwcm9jQ3R4IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJKChNZXRob2RDb25maWd1cmF0aW9uKSBwcm9jQ3R4KS5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKAotCQkJCQlwcm9jQ29tcCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gcHJvY0N0eCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKHByb2NDdHggaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkoKE1ldGhvZENvbmZpZ3VyYXRpb24pIHByb2NDdHgpLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5yZW1vdmUoCi0JCQkJCWNoaWxkKTsKLQkJfQotCQlzdXBlci51bmRvKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVJvbGVEZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVSb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODQ3N2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVJvbGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi07Ci0KLS8qKgotICogRGVsZXRlIHJvbGUgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVSb2xlRGVzY3JpcHRvciBleHRlbmRzIFJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igcm9sZURlc2M7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQlwcml2YXRlIExpc3Qgbm90VXNlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5yb2xlRGVzYyA9IHJvbGVEZXNjOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXJvbGVEZXNjLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocm9sZURlc2MpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAocm9sZURlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJvbGVEZXNjLmVSZXNvdXJjZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBEZWxldGVSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciByb2xlRGVzYywKLQkJCWJvb2xlYW4gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzKSB7Ci0JCXRoaXMocm9sZURlc2MpOwotCQl0aGlzLmZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCVNldCByZWZMaXN0ID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBnZXQgUm9sZURlc2NyaXB0b3IgcmVsYXRpb25zaGlwcyByZWZlcmVuY2VzCi0JCUxpc3QgYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYyk7Ci0JCUxpc3QgYWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpOwotCQlMaXN0IHByaW1hcnlUYXNrRGVzY3JpcHRvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKTsKLQkJcmVmTGlzdC5hZGRBbGwoYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMpOwotCQlyZWZMaXN0LmFkZEFsbChhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKTsKLQkJcmVmTGlzdC5hZGRBbGwocHJpbWFyeVRhc2tEZXNjcmlwdG9ycyk7Ci0JCXJlZkxpc3QuYWRkQWxsKHJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHJvbGVEZXNjLAotCQkJCQkJKERlc2NyaXB0b3IpIG9iamVjdCkpIHsKLQkJCQkJaWYgKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY29udGFpbnMob2JqZWN0KSkgLy8gY2hlY2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb2NhbAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlc2NyaXB0b3IKLQkJCQkJCW5vdFVzZWRSZWZlcmVuY2VzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0W10gcmVmVG9CZURlbGV0ZWQgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPyBub3RVc2VkUmVmZXJlbmNlcwotCQkJCQkJLnRvQXJyYXkoKQotCQkJCQkJOiBSZWZlcmVuY2VTZWxlY3Rpb24uZ2V0UmVmZXJlbmNlcyhub3RVc2VkUmVmZXJlbmNlcywKLQkJCQkJCQkJcm9sZURlc2MpOwotCQkJCQkJCi0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgcmVsYXRpb25zaGlwcwotLy8JCWNsZWFyKHJvbGVEZXNjLmdldEFzc2lzdHNJbigpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQl0ZC5nZXRBc3Npc3RlZEJ5KCkucmVtb3ZlKHJvbGVEZXNjKTsKLQkJfQotLy8JCWNsZWFyKHJvbGVEZXNjLmdldFBlcmZvcm1zQWRkaXRpb25hbGx5KCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJdGQuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0vLwkJY2xlYXIocm9sZURlc2MuZ2V0UGVyZm9ybXNBc093bmVyKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmltYXJ5VGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJdGQuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5yZW1vdmUocm9sZURlc2MpOwotCQl9Ci0JCWNsZWFyKHJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCi0JCS8vIGlmIHJvbGUgaXMgcGFydCBvZiBhbnkgdGVhbSwgcGxlYXNlIHJlbW92ZSBpdCBmcm9tIHRlYW0gYXMgd2VsbAotCQlMaXN0IHRlYW1zID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbXMuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBpdG9yLm5leHQoKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkucmVtb3ZlKHJvbGVEZXNjKTsKLQotCQkJLy8gZmluZCBtYXRjaGluZyByb2xlRGVzY3JpcHRvciBpbiB0ZWFtIHJvbGVzCi0JCQlPYmplY3QgdGVhbVJvbGVEZXNjID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmZpbmRSb2xlRGVzY3JpcHRvcih0ZWFtLCByb2xlRGVzYyk7Ci0JCQl0ZWFtLmdldFRlYW1Sb2xlcygpLnJlbW92ZSh0ZWFtUm9sZURlc2MpOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhcihMaXN0IGxpc3QpIHsKLQkJdHJ5IHsKLQkJCWlmICgobGlzdCAhPSBudWxsKSAmJiAobGlzdC5zaXplKCkgPiAwKSkgewotCi0JCQkJbGlzdC5jbGVhcigpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVRhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWE5MzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGFza0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlJlZmVyZW5jZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIERlbGV0ZSBUYXNrIGRlc2NyaXB0b3IKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUYXNrRGVzY3JpcHRvciB0YXNrRGVzYzsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgTGlzdCBub3RVc2VkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRGVsZXRlVGFza0Rlc2NyaXB0b3IoVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhc2tEZXNjID0gdGFza0Rlc2M7Ci0KLQkJQWRhcHRlckZhY3RvcnkgYUZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYUZhY3RvcnkuYWRhcHQoCi0JCQkJdGFza0Rlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudCh0YXNrRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh0YXNrRGVzYy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodGFza0Rlc2MuZVJlc291cmNlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIERlbGV0ZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMpIHsKLQkJdGhpcyh0YXNrRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCS8vIGdldCBUYXNrRGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKSk7Ci0JCXJlZkxpc3QuYWRkKHRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCQlyZWZMaXN0LmFkZEFsbCh0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0T3B0aW9uYWxJbnB1dCgpKTsKLQkJcmVmTGlzdC5hZGRBbGwodGFza0Rlc2MuZ2V0T3V0cHV0KCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0KLQkJCS8vIGNoZWNrIGFsbCBpdCdzIHJlZmVyZW5jZXMKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCFQcm9jZXNzVXRpbC5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKHRhc2tEZXNjLAotCQkJCQkJKERlc2NyaXB0b3IpIG9iamVjdCkpIHsKLQkJCQkJaWYgKGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY29udGFpbnMob2JqZWN0KSkgLy8gY2hlY2sKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBsb2NhbAotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGRlc2NyaXB0b3IKLQkJCQkJCW5vdFVzZWRSZWZlcmVuY2VzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghKG5vdFVzZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkpIHsKLQkJCXRyeSB7Ci0JCQkJT2JqZWN0W10gcmVmVG9CZURlbGV0ZWQgPSBmb3JjZVJlbW92ZVVudXNlZFJlZmVyZW5jZXMgPyBub3RVc2VkUmVmZXJlbmNlcwotCQkJCQkJLnRvQXJyYXkoKQotCQkJCQkJOiBSZWZlcmVuY2VTZWxlY3Rpb24uZ2V0UmVmZXJlbmNlcyhub3RVc2VkUmVmZXJlbmNlcywKLQkJCQkJCQkJdGFza0Rlc2MpOwotCQkJCQkJCi0JCQkJCQlkZWxldGUocmVmVG9CZURlbGV0ZWQpOwotCQkJfQotCQkJY2F0Y2goT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFib3J0ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGFsbCB0YXNrZGVzY3JpcHRvciByZWxhdGlvbnNoaXAKLQkJY2xlYXIodGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldEFzc2lzdGVkQnkoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldE1hbmRhdG9yeUlucHV0KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRPcHRpb25hbElucHV0KCkpOwotCQljbGVhcih0YXNrRGVzYy5nZXRPdXRwdXQoKSk7Ci0JCWNsZWFyKHRhc2tEZXNjLmdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkpOwotCi0JCXJlZG8oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXIoTGlzdCBsaXN0KSB7Ci0JCXRyeSB7Ci0JCQlpZiAoKGxpc3QgIT0gbnVsbCkgJiYgKGxpc3Quc2l6ZSgpID4gMCkpIHsKLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVsZXRlVGVhbVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczOGExNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVUZWFtUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotCi0KLS8qKgotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGV0ZVRlYW1Qcm9maWxlIGV4dGVuZHMgQWJzdHJhY3RDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBUZWFtUHJvZmlsZSB0ZWFtOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlbGV0ZVRlYW1Qcm9maWxlKFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRlYW0gPSB0ZWFtOwotCi0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnRBY3Rpdml0eSh0ZWFtKTsKLQotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXRoaXMuYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHBhcmVudDsKLQkJfQotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCQlpZiAodGVhbS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQodGVhbS5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGdldCBhbGwgc3VidGVhbSByZWN1cnNpdmVseQotCQlMaXN0IHRlYW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRTdWJUZWFtcyh0ZWFtLCB0ZWFtTGlzdCk7Ci0KLQkJdGVhbUxpc3QuYWRkKHRlYW0pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVhbUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRlYW1Qcm9maWxlIHR0ID0gKFRlYW1Qcm9maWxlKSB0ZWFtTGlzdC5nZXQoaSk7Ci0JCQkvLyBjbGVhciB0ZWFtJ3Mgcm9sZWRlc2NyaXB0b3IKLQkJCXR0LmdldFRlYW1Sb2xlcygpLmNsZWFyKCk7Ci0JCX0KLQotCQlyZWRvKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN1YlRlYW1zKFRlYW1Qcm9maWxlIHRlYW0sIExpc3QgdGVhbUxpc3QpIHsKLQkJTGlzdCBsaXN0ID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVGVhbVByb2ZpbGUgdHQgPSAoVGVhbVByb2ZpbGUpIGl0b3IubmV4dCgpOwotCQkJCXRlYW1MaXN0LmFkZCh0dCk7Ci0JCQkJZ2V0U3ViVGVhbXModHQsIHRlYW1MaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIGJyZWFrZG93bmVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gYnJFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldFBhcmVudEFjdGl2aXR5KEJyZWFrZG93bkVsZW1lbnQgYnJFbGVtZW50KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGJyRWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCXdoaWxlICghKHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJYnJFbGVtZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpIHBhcmVudDsKLQkJCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYnJFbGVtZW50LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQoYnJFbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCi0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCi0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjM5NzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21wb3VuZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklJbnRlcmFjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBjbGVhbi11cCB1bnVzZWQgZGVzY3JpcHRvcnMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCAKLWltcGxlbWVudHMgSUludGVyYWN0aXZlCi17Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGVsZW1lbnRzOwotCXByaXZhdGUgTGlzdCBkZXNjcmlwdG9yc1RvRGVsZXRlOwotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlQ2hpbGRyZW47Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRlbGV0ZWREZXNjcmlwdG9yczsKLQlwcml2YXRlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudHMgbGlzdCBvZiBlbGVtZW50cyB0byBjaGVjayBmb3IgdW51c2VkIGRlc2NyaXB0b3JzIHRvIGRlbGV0ZSAKLQkgKiBAcGFyYW0gaW5jbHVkZUNoaWxkcmVuIGlmIDxjb2RlPnRydWU8L2NvZGU+IHdpbGwgY2hlY2sgdGhlIG9mZnN0cmluZyBvZiBhY3Rpdml0aWVzIGluIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoQ29sbGVjdGlvbiBlbGVtZW50cywgYm9vbGVhbiBpbmNsdWRlQ2hpbGRyZW4sIENvbGxlY3Rpb24gZGVsZXRlZERlc2NyaXB0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKLQkJdGhpcy5pbmNsdWRlQ2hpbGRyZW4gPSBpbmNsdWRlQ2hpbGRyZW47Ci0JCXRoaXMuZGVsZXRlZERlc2NyaXB0b3JzID0gZGVsZXRlZERlc2NyaXB0b3JzOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuIFN1YmNsYXNzcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdGhlIGV4ZWN1dGVkIGNvbW1hbmQgdGhhdCBkZWxldGVkIHRoZSBnaXZlbiBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21tYW5kIGRlbGV0ZShMaXN0IGVsZW1lbnRzKTsKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBmaW5kIGFsbCByb2xlIGFuZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgdGhhdCBhcmUgbm90IHVzZWQKLQkJLy8gaW4gYW55IHJlbGF0aW9uc2hpcAotCQkvLyBhbmQgZGVsZXRlIHRoZW0KLQkJLy8KLQkJaWYgKGRlc2NyaXB0b3JzVG9EZWxldGUgPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUl0ZXJhdG9yIGl0ZXI7Ci0JCQlpZihpbmNsdWRlQ2hpbGRyZW4pIHsKLQkJCQlpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGVsZW1lbnRzLCBmYWxzZSkgewotCQkJCQkKLQkJCQkJCi0JCQkJCS8qKgotCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkgKi8KLQkJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDcxODg4OTQwOTQwMzE0MTcwN0w7Ci0JCQkJCQotCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKG9iamVjdCA9PSBlbGVtZW50cykgewotCQkJCQkJCXJldHVybiBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCXJldHVybiAoKEFjdGl2aXR5KSBvYmplY3QpCi0JCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlBcnJheUxpc3QgY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZihkZWxldGVkRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJCS8vIGFkZCBkZWxldGVkIGRlc2NyaXB0b3JzIHRvIHRoZSBsaXN0IGJlZm9yZSBjaGVja2luZyBmb3IgdW51c2VkIGRlc2NyaXB0b3JzCi0JCQkJLy8gdGhvc2UgZGVsZXRlZCBkZXNjcmlwdG9ycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhZnRlciB0aGUgY2hlY2sKLQkJCQkvLwotCQkJCWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmFkZEFsbChkZWxldGVkRGVzY3JpcHRvcnMpOwotCQkJfQotCQkJZm9yICg7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvciB8fCBlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlpZiAoIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQkJCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUsIChEZXNjcmlwdG9yKSBlbGVtZW50KSkgewotCQkJCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUucmVtb3ZlQWxsKGRlbGV0ZWREZXNjcmlwdG9ycyk7Ci0JCQlpZiAoIWN1cnJlbnREZXNjcmlwdG9yc1RvRGVsZXRlLmlzRW1wdHkoKSkgewotCQkJCXNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGUoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCWlmKCFjdXJyZW50RGVzY3JpcHRvcnNUb0RlbGV0ZS5pc0VtcHR5KCkpIHsKLQkJCQkJQ29tbWFuZCBjbWQgPSBkZWxldGUoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQkJCWNvbW1hbmRMaXN0LmFkZChjbWQpOwotCQkJCQkJZGVzY3JpcHRvcnNUb0RlbGV0ZS5hZGRBbGwoY3VycmVudERlc2NyaXB0b3JzVG9EZWxldGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYoIWRlc2NyaXB0b3JzVG9EZWxldGUuaXNFbXB0eSgpKSB7Ci0JCQkJY29tbWFuZExpc3QuY2xlYXIoKTsKLQkJCQlhcHBlbmQoZGVsZXRlKGRlc2NyaXB0b3JzVG9EZWxldGUpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0RGVzY3JpcHRvcnNUb0RlbGV0ZShMaXN0IGRlc2NyaXB0b3JzVG9EZWxldGUpIHsKLQkJaWYodXNlckludGVyYWN0aW9uSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJSXRlbUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudWlfcmVmZXJlbmNlczsKLQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5zZWxlY3REZXNjcmlwdG9yc1RvRGVsZXRlX21zZzsJCQkKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZGVzY3JpcHRvcnNUb0RlbGV0ZSk7Ci0JCQlDb2xsZWN0aW9uIHNlbGVjdGVkID0gdXNlckludGVyYWN0aW9uSGFuZGxlci5zZWxlY3QobGlzdCwgbGFiZWxQcm92aWRlciwgdHJ1ZSwgbGlzdCwgdGl0bGUsIG1zZyk7Ci0JCQlpZihzZWxlY3RlZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlkZXNjcmlwdG9yc1RvRGVsZXRlLnJldGFpbkFsbChzZWxlY3RlZCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUludGVyYWN0aXZlI3NldFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgaGFuZGxlcikgewotCQl1c2VySW50ZXJhY3Rpb25IYW5kbGVyID0gaGFuZGxlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTMyYTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0RlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5SZWZlcmVuY2VTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIERlbGV0ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yIGV4dGVuZHMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kIHsKLQlwcml2YXRlIEFjdGl2aXR5IGFjdGl2aXR5OwotCi0JcHJpdmF0ZSBXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBMaXN0IG5vdFVzZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBEZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYykgewotCQlzdXBlcigpOwotCi0JCXRoaXMud3BEZXNjID0gd3BEZXNjOwotCi0JCUFkYXB0ZXJGYWN0b3J5IGFGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFGYWN0b3J5LmFkYXB0KAotCQkJCXdwRGVzYywgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHdwRGVzYyk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJdGhpcy5hY3Rpdml0eSA9IChBY3Rpdml0eSkgcGFyZW50OwotCQl9Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0JCWlmICh3cERlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHdwRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRGVsZXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsCi0JCQlib29sZWFuIGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcykgewotCQl0aGlzKHdwRGVzYyk7Ci0JCXRoaXMuZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzID0gZm9yY2VSZW1vdmVVbnVzZWRSZWZlcmVuY2VzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJU2V0IHJlZkxpc3QgPSBuZXcgSGFzaFNldCgpOwotCi0JCUxpc3QgbWFuZGF0b3J5SW5wdXRUbyA9IEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBleHRlcm5hbElucHV0VG8gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRFeHRlcm5hbElucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBvcHRpb25hbElucHV0VG8gPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BEZXNjKTsKLQkJTGlzdCBvdXRwdXRGcm9tID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbSh3cERlc2MpOwotCQlMaXN0IHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMod3BEZXNjKTsKLQkJLy8gZ2V0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciByZWxhdGlvbnNoaXBzIHJlZmVyZW5jZXMKLQkJcmVmTGlzdC5hZGRBbGwod3BEZXNjLmdldEltcGFjdGVkQnkoKSk7Ci0JCXJlZkxpc3QuYWRkQWxsKHdwRGVzYy5nZXRJbXBhY3RzKCkpOwotCQlyZWZMaXN0LmFkZEFsbChtYW5kYXRvcnlJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwoZXh0ZXJuYWxJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwob3B0aW9uYWxJbnB1dFRvKTsKLQkJcmVmTGlzdC5hZGRBbGwob3V0cHV0RnJvbSk7Ci0JCXJlZkxpc3QuYWRkKHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0KTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0b3IubmV4dCgpOwotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCWlmICghUHJvY2Vzc1V0aWwuY2hlY2tEZXNjcmlwdG9yUmVmZXJlbmNlcyh3cERlc2MsCi0JCQkJCQkoRGVzY3JpcHRvcikgb2JqZWN0KSkgewotCQkJCQlpZiAoYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5jb250YWlucyhvYmplY3QpKSAvLyBjaGVjawotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZvcgotCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGxvY2FsCi0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVzY3JpcHRvcgotCQkJCQkJbm90VXNlZFJlZmVyZW5jZXMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCEobm90VXNlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSkgewotCQkJdHJ5IHsKLQkJCQlPYmplY3RbXSByZWZUb0JlRGVsZXRlZCA9IGZvcmNlUmVtb3ZlVW51c2VkUmVmZXJlbmNlcyA/IG5vdFVzZWRSZWZlcmVuY2VzCi0JCQkJCQkudG9BcnJheSgpCi0JCQkJCQk6IFJlZmVyZW5jZVNlbGVjdGlvbi5nZXRSZWZlcmVuY2VzKG5vdFVzZWRSZWZlcmVuY2VzLAotCQkJCQkJCQl3cERlc2MpOwotCQkJCQkJZGVsZXRlKHJlZlRvQmVEZWxldGVkKTsKLQkJCX0KLQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlhYm9ydGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIHdoZXRoZXIgd3BkZXNjIGFydGlmYWN0IGhhcyBhbnkgc3ViLWFydGlmYWN0cwotCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJTGlzdCBsaXN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3QgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3Iod3BEZXNjLCAoQXJ0aWZhY3QpIGxpc3QKLQkJCQkJCS5nZXQoaSkpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJY2hpbGRyZW4uYWRkKGRlc2NyaXB0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxpc3Qgb2JqZWN0c1RvQ2xlYXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJb2JqZWN0c1RvQ2xlYXJlZC5hZGQod3BEZXNjKTsKLQkJb2JqZWN0c1RvQ2xlYXJlZC5hZGRBbGwoY2hpbGRyZW4pOwotCi0JCWZvciAoSXRlcmF0b3IgaXRvciA9IG9iamVjdHNUb0NsZWFyZWQuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzY09iaiA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iajsKLQotCQkJCS8vIHdwRGVzY09iai5nZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQkJLy8gd3BEZXNjT2JqLmdldE1hbmRhdG9yeUlucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRFeHRlcm5hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRPcHRpb25hbElucHV0VG8oKS5jbGVhcigpOwotCQkJCS8vIHdwRGVzY09iai5nZXRPdXRwdXRGcm9tKCkuY2xlYXIoKTsKLQkJCQkvLyB3cERlc2NPYmouZ2V0V29ya2VkT25CeSgpLmNsZWFyKCk7Ci0JCQkJY2xlYXIod3BEZXNjT2JqLmdldEltcGFjdGVkQnkoKSk7Ci0JCQkJY2xlYXIod3BEZXNjT2JqLmdldEltcGFjdHMoKSk7Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0RXh0ZXJuYWxJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGV4dGVybmFsSW5wdXRUby5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRkLmdldEV4dGVybmFsSW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0TWFuZGF0b3J5SW5wdXRUbygpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYW5kYXRvcnlJbnB1dFRvLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0TWFuZGF0b3J5SW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0T3B0aW9uYWxJbnB1dFRvKCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9wdGlvbmFsSW5wdXRUby5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXRkLmdldE9wdGlvbmFsSW5wdXQoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0vLwkJCQljbGVhcih3cERlc2NPYmouZ2V0T3V0cHV0RnJvbSgpKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvdXRwdXRGcm9tLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJdGQuZ2V0T3V0cHV0KCkucmVtb3ZlKHdwRGVzY09iaik7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3BvbnNpYmxlUm9sZURlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJcm9sZURlc2MuZ2V0UmVzcG9uc2libGVGb3IoKS5yZW1vdmUod3BEZXNjT2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyB0aGlzLmFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlKHdwRGVzYyk7Ci0KLQkJcmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhcihMaXN0IGxpc3QpIHsKLQkJdHJ5IHsKLQkJCWlmICgobGlzdCAhPSBudWxsKSAmJiAobGlzdC5zaXplKCkgPiAwKSkKLQkJCQlsaXN0LmNsZWFyKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IHBhcmVudERlc2NyaXB0b3IsIEFydGlmYWN0IGFydGlmYWN0KSB7Ci0JCS8vIEFjdGl2aXR5IGFjdGl2aXR5ID0gZ2V0QWN0aXZpdHkocGFyZW50RGVzY3JpcHRvcik7Ci0JCWlmIChhY3Rpdml0eSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgbGlzdCA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikKLQkJCQkJJiYgKGFydGlmYWN0ID09ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmopCi0JCQkJCQkJLmdldFdvcmtQcm9kdWN0KCkpKSB7Ci0JCQkJcmV0dXJuIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1MDk0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9EZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci0KLS8qKgotICogQ29tbWFuZCB0byBzeW5jaHJvbml6ZSBkZXNjcmlwdG9yJ3MgYXR0cmlidXRlcyBhbmQgb3duIHJlZmVyZW5jZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBGZWIgMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JTeW5jaHJvbml6ZUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yU3luY2hyb25pemVDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRlY2MzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0Rlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiA5LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvclVwZGF0ZUJhdGNoQ29tbWFuZCBleHRlbmRzIEJhdGNoQ29tbWFuZCB7Ci0JcHJpdmF0ZSBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2g7Ci0JcHJpdmF0ZSBDb21wb3VuZENvbW1hbmQgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZDsKLQlwcml2YXRlIFNldCBzeW5jaEZlYXR1cmVzOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNsZWFyCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JVcGRhdGVCYXRjaENvbW1hbmQoYm9vbGVhbiBjbGVhciwgU2V0IHN5bmNoRmVhdHVyZXMsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXN1cGVyKGNsZWFyKTsKLQkJdGhpcy5zeW5jaEZlYXR1cmVzID0gc3luY2hGZWF0dXJlczsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCi0JcHVibGljIFNldCBnZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIHsKLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQl9Ci0JCi0Jdm9pZCBzZXREZXNjcmlwdG9yc1RvUmVmcmVzaChTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gpIHsKLQkJdGhpcy5kZXNjcmlwdG9yc1RvUmVmcmVzaCA9IGRlc2NyaXB0b3JzVG9SZWZyZXNoOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guY2xlYXIoKTsKLQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoID0gbnVsbDsKLQkJfQotCQkKLQkJaWYocmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQmF0Y2hDb21tYW5kI2NhbkV4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBzdXBlci5jYW5FeGVjdXRlKCkgfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoLmlzRW1wdHkoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkKLQkJLy8gY3JlYXRlIHJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQKLQkJLy8KLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhZGVzY3JpcHRvcnNUb1JlZnJlc2guaXNFbXB0eSgpCi0JCQkJJiYgcmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCA9PSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVzY3JpcHRvcnNUb1JlZnJlc2guaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuYXBwZW5kKG5ldyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoZGVzYywgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7CQkJCQotCQkJfQotCQl9Ci0KLQkJLy8gcmVmcmVzaCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZihyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kICE9IG51bGwpIHsKLQkJCXJlZnJlc2hEZXNjcmlwdG9yc0NvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYocmVmcmVzaERlc2NyaXB0b3JzQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoRGVzY3JpcHRvcnNDb21tYW5kLnVuZG8oKTsKLQkJfQotCQkKLQkJc3VwZXIudW5kbygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0dlbmVyaWNEcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNjk4ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvR2VuZXJpY0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogRHJvcCBjb21tYW5kIHRvIGRyb3AgYW55IG9iamVjdCBvbiBhIHRhcmdldCB0aGF0IHN1cHBvcnRzIGFkYXB0aW5nIGRyb3AKLSAqIG9iamVjdCB0byBpdHMgb3duIG9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNEcm9wQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZHJvcEVsZW1lbnRzOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmVhdHVyZUVsZW1lbnRzOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIG1vZGlmaWVkUmVzb3VyY2VzOwotCi0JcHJpdmF0ZSBFT2JqZWN0IHRhcmdldDsKLQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwcml2YXRlIEVsZW1lbnRBZGFwdGVyIGRyb3BBZGFwdGVyOwotCi0JcHVibGljIEdlbmVyaWNEcm9wQ29tbWFuZChFT2JqZWN0IHRhcmdldCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlDb2xsZWN0aW9uIGRyb3BFbGVtZW50cywgRWxlbWVudEFkYXB0ZXIgZHJvcEFkYXB0ZXIpIHsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMuZHJvcEVsZW1lbnRzID0gZHJvcEVsZW1lbnRzOwotCQl0aGlzLmRyb3BBZGFwdGVyID0gZHJvcEFkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZFJlc291cmNlczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCS8vIGNvbXBpbGUgdGhlIGZlYXR1cmVFbGVtZW50cyBsaXN0Ci0JCS8vCi0JCWZlYXR1cmVFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQllbGVtZW50ID0gZHJvcEFkYXB0ZXIuYWRhcHQoZWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJZmVhdHVyZUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQkvLyBpZihjcmVhdGVEZXNjcmlwdG9yKSB7Ci0JCQkvLyBmZWF0dXJlRWxlbWVudHMuYWRkKFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKChSb2xlKQotCQkJLy8gZWxlbWVudCkpOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBmZWF0dXJlRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYgKCFmZWF0dXJlRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkoKExpc3QpIHRhcmdldC5lR2V0KGZlYXR1cmUpKS5hZGRBbGwoZmVhdHVyZUVsZW1lbnRzKTsKLQkJCWlmICh0YXJnZXQuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKHRhcmdldC5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJKChMaXN0KSB0YXJnZXQuZUdldChmZWF0dXJlKSkucmVtb3ZlQWxsKGZlYXR1cmVFbGVtZW50cyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlyZXR1cm4gZmVhdHVyZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnRBZGFwdGVyIHsKLQkJLyoqCi0JCSAqIEFkYXB0cyB0aGUgZHJvcCBlbGVtZW50IHRvIHRoZSByaWdodCBlbGVtZW50IGZvciB0aGUgZHJvcCB0YXJnZXQuCi0JCSAqIAotCQkgKiBAcGFyYW0gZHJvcEVsZW1lbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJT2JqZWN0IGFkYXB0KE9iamVjdCBkcm9wRWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9JQWN0aW9uVHlwZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvSUFjdGlvblR5cGVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1OGExYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9JQWN0aW9uVHlwZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLXB1YmxpYyBjbGFzcyBJQWN0aW9uVHlwZUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfUFJJTUFSWV9QRVJGT1JNRVIgPSAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX0FERElUSU9OQUxfUEVSRk9STUVSID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERF9BU1NJU1RFRF9CWSA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfRVhURVJOQUxfSU5QVVQgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX01BTkRBVE9SWV9JTlBVVCA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfT1BUSU9OQUxfSU5QVVQgPSA1OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUREX09VVFBVVCA9IDY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRERfUkVTUE9OU0lCTEVfRk9SID0gNzsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xpbmtNZXRob2RFbGVtZW50Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDRkZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTGlua01ldGhvZEVsZW1lbnRDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQ29tbWFuZCBmb3IgbGlua2luZyBtZXRob2QgZWxlbWVudCB0byBkZXNjcmlwdG9yCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGNsYXNzIExpbmtNZXRob2RFbGVtZW50Q29tbWFuZCBleHRlbmRzIEFkZE1ldGhvZEVsZW1lbnRDb21tYW5kIHsKLQotCXByaXZhdGUgRGVzY3JpcHRvciBkZXNjOwotCi0JcHJpdmF0ZSBPYmplY3Qgb2JqOwotCi0JcHJpdmF0ZSBMaXN0IG9iamVjdHM7Ci0KLQlwcml2YXRlIGludCBmZWF0dXJlSUQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXM7Ci0KLQkvKioKLQkgKiBBc3NpZ24gcm9sZSB0byB0YXNrIGRlc2NyaXB0b3IgVXNlZCBmb3IgYm90aCBhZGRpdGlvbmFsbHkgcGVyZm9ybWVkIGJ5Ci0JICogYW5kIGFzc2lzdGVkIGJ5Ci0JICovCi0JcHVibGljIExpbmtNZXRob2RFbGVtZW50Q29tbWFuZChEZXNjcmlwdG9yIGRlc2MsIE9iamVjdCBvYmosIGludCBmZWF0dXJlSUQpIHsKLQotCQlzdXBlcihUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZGVzYykpOwotCi0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMub2JqID0gb2JqOwotCQl0aGlzLmZlYXR1cmVJRCA9IGZlYXR1cmVJRDsKLQotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCW9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlvYmplY3RzLmFkZChvYmopOwotCQl9Ci0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQotCQlpZiAoZGVzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGFkZCB0byBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgbm90IHRoZXJlIGFscmVhZHkKLQkJaWYgKCFzdXBlci5hZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKG9iamVjdHMpKQotCQkJcmV0dXJuOwotCi0JCWlmICghb2JqZWN0cy5pc0VtcHR5KCkpCi0JCQlyZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNyZWRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWRvKCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJKChUYXNrRGVzY3JpcHRvcikgZGVzYykuc2V0VGFzaygoVGFzaykgb2JqKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJKChSb2xlRGVzY3JpcHRvcikgZGVzYykuc2V0Um9sZSgoUm9sZSkgb2JqKTsKLQkJCWJyZWFrOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCSgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjKS5zZXRXb3JrUHJvZHVjdCgoV29ya1Byb2R1Y3QpIG9iaik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmICghb2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCS8vIGJhc2ljYWxseSByZW1vdmUgZnJvbSBjb25maWd1cmF0aW9uIGlmIGFueXRoaW5nIHdhcyBhZGRlZAotCQkJc3VwZXIudW5kbygpOwotCi0JCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQkoKFRhc2tEZXNjcmlwdG9yKSBkZXNjKS5zZXRUYXNrKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQkoKFJvbGVEZXNjcmlwdG9yKSBkZXNjKS5zZXRSb2xlKG51bGwpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQkJKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2MpLnNldFdvcmtQcm9kdWN0KG51bGwpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWlmIChkZXNjLmVSZXNvdXJjZSgpICE9IG51bGwgJiYgIW9iamVjdHMuaXNFbXB0eSgpKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Mb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcyOTQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL0xvY2FsbHlSZXBsYWNlQW5kRGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQWN0aXZpdHlIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVsIDYsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbGx5UmVwbGFjZUFuZERlZXBDb3B5Q29tbWFuZCBleHRlbmRzIFJlcGxhY2VBY3Rpdml0eUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgTG9jYWxseVJlcGxhY2VBbmREZWVwQ29weUNvbW1hbmQoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlzdXBlcih3cmFwcGVyKTsJCQotCQlzZXRMYWJlbChMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbFJlcGxhY2VtZW50QW5kRGVlcENvcHlfdGV4dCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlJlcGxhY2VBY3Rpdml0eUNvbW1hbmQjZG9WYXJ5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1ZhcnkoKSB7Ci0JCS8vIGRlZXAgY29weSB0aGUgYWN0aXZpdHkKLQkJLy8KLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZighVXNlckludGVyYWN0aW9uSGVscGVyLmNvbmZpcm1EZWVwQ29weShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFjdGl2aXR5KSkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCVByb2Nlc3MgdGFyZ2V0UHJvY2VzcyA9IChQcm9jZXNzKSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlkZWVwQ29weUNvbmZpZyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaG9vc2VEZWVwQ29weUNvbmZpZ3VyYXRpb24odGFyZ2V0UHJvY2Vzcywgd3JhcHBlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQWN0aXZpdHlIYW5kbGVyIGFjdGl2aXR5SGFuZGxlciA9IG5ldyBBY3Rpdml0eUhhbmRsZXIoKTsKLQkJYWN0aXZpdHlIYW5kbGVyLnNldERlZXBDb3B5Q29uZmlnKGRlZXBDb3B5Q29uZmlnKTsKLQkJYWN0aXZpdHlIYW5kbGVyLnNldFRhcmdldFByb2Nlc3ModGFyZ2V0UHJvY2Vzcyk7Ci0JCWFjdGl2aXR5SGFuZGxlci5kZWVwQ29weShhY3Rpdml0eSk7Ci0JCUFjdGl2aXR5IGNvcHkgPSAoQWN0aXZpdHkpIGFjdGl2aXR5SGFuZGxlci5nZXRBY3Rpdml0aWVzKCkuZ2V0KDApOwotCQkKLQkJc3VwZXIuZG9WYXJ5KCk7Ci0JCQotCQkvLyByZXBsYWNlIHRoZSBsb2NhbCByZXBsYWNlbWVudCB3aXRoIGRlZXAgY29weQotCQkvLwotCQlpbnQgcG9zID0gY3JlYXRlZEFjdGl2aXRpZXMuc2l6ZSgpIC0gMTsKLQkJQWN0aXZpdHkgbG9jYWxSZXBsYWNlbWVudCA9IChBY3Rpdml0eSkgY3JlYXRlZEFjdGl2aXRpZXMuZ2V0KHBvcyk7CQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbG9jYWxSZXBsYWNlbWVudC5nZXRPcHBvc2l0ZUZlYXR1cmVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBsb2NhbFJlcGxhY2VtZW50LmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQlpZih2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCWlmKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdCgoKENvbGxlY3Rpb24pdmFsdWUpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewkJCi0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBvLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJbGlzdC5yZW1vdmUobG9jYWxSZXBsYWNlbWVudCk7Ci0JCQkJCQkJbGlzdC5hZGQoY29weSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlvLmVTZXQoZmVhdHVyZSwgY29weSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJaWYoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG8uZUdldChmZWF0dXJlKTsKLQkJCQkJCWxpc3QucmVtb3ZlKGxvY2FsUmVwbGFjZW1lbnQpOwotCQkJCQkJbGlzdC5hZGQoY29weSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvLmVTZXQoZmVhdHVyZSwgY29weSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3JlYXRlZEFjdGl2aXRpZXMuc2V0KHBvcywgY29weSk7Ci0JCWNvcHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChsb2NhbFJlcGxhY2VtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCWNvcHkuc2V0VmFyaWFiaWxpdHlUeXBlKGxvY2FsUmVwbGFjZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpOwotCQljb3B5LnNldFByZXNlbnRlZEFmdGVyKGxvY2FsUmVwbGFjZW1lbnQuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCWNvcHkuc2V0UHJlc2VudGVkQmVmb3JlKGxvY2FsUmVwbGFjZW1lbnQuZ2V0UHJlc2VudGVkQmVmb3JlKCkpOwotCQlBY3Rpdml0eSBzdXBlckFjdCA9IGxvY2FsUmVwbGFjZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCWludCBpZCA9IHN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihsb2NhbFJlcGxhY2VtZW50KTsKLQkJc3VwZXJBY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zZXQoaWQsIGNvcHkpOwotCQkKLQkJLy8gYWRkIGNvcHkgcGFja2FnZSB0byB0aGUgcGFja2FnZSBvZiBzdXBlciBhY3Rpdml0eQotCQkvLwotCQkoKFByb2Nlc3NQYWNrYWdlKXN1cGVyQWN0LmVDb250YWluZXIoKSkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZCgoTWV0aG9kUGFja2FnZSkgY29weS5lQ29udGFpbmVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVEb3duQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OGQyYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvTW92ZURvd25Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIG1vdmUgZG93biBlbGVtZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1vdmVEb3duQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGVsZW1lbnRMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIGludCB0cmFuc2ZlckxvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgT2JqZWN0IGVsZW1lbnRPYmo7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFkamFjZW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTW92ZURvd25Db21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQl0aGlzLmVsZW1lbnRPYmogPSBlbGVtZW50T2JqOwotCQl0aGlzLmVDbGFzc2VzID0gZUNsYXNzZXM7Ci0KLQkJdGhpcy5tb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChhY3Rpdml0eS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQltb2RpZmllZFJlc291cmNlcy5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCUxpc3QgYWxsRWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBhbGxFbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqLmVxdWFscyhlbGVtZW50T2JqKSkgewotCQkJCWVsZW1lbnRMb2NhdGlvbiA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGludCBpID0gZWxlbWVudExvY2F0aW9uICsgMTsgaSA8PSBhbGxFbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3Nlcywgb2JqKSkgewotCQkJCXRyYW5zZmVyTG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQnJlYWtkb3duRWxlbWVudCBuZXh0ID0gIChCcmVha2Rvd25FbGVtZW50KSBhbGxFbGVtZW50cy5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQlpZihlLmdldFByZXNlbnRlZEFmdGVyKCkgPT0gbmV4dCkgewotCQkJYWRqYWNlbnQgPSB0cnVlOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHN3YXAgInByZW5zZW50ZWQtYWZ0ZXIiIGVsZW1lbnQKLQkJCS8vCi0JCQlCcmVha2Rvd25FbGVtZW50IG5leHQgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuZ2V0KHRyYW5zZmVyTG9jYXRpb24pOwotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRPYmo7Ci0JCQllLnNldFByZXNlbnRlZEFmdGVyKG5leHQuZ2V0UHJlc2VudGVkQWZ0ZXIoKSk7Ci0JCQluZXh0LnNldFByZXNlbnRlZEFmdGVyKGUpOwotCQl9Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUodHJhbnNmZXJMb2NhdGlvbiwKLQkJCQllbGVtZW50TG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCSgoRUxpc3QpIGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkpLm1vdmUoZWxlbWVudExvY2F0aW9uLAotCQkJCXRyYW5zZmVyTG9jYXRpb24pOwotCQlpZihhZGphY2VudCkgewotCQkJLy8gcmVzdG9yZSAicHJlbnNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudE9iajsKLQkJCW5leHQuc2V0UHJlc2VudGVkQWZ0ZXIoZS5nZXRQcmVzZW50ZWRBZnRlcigpKTsKLQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIobmV4dCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVVcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL01vdmVVcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyOWRkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Nb3ZlVXBDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIG1vdmUgdXAgdGhlIGVsZW1lbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW92ZVVwQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCXByaXZhdGUgaW50IGVsZW1lbnRMb2NhdGlvbiA9IDA7Ci0KLQlwcml2YXRlIGludCB0cmFuc2ZlckxvY2F0aW9uID0gMDsKLQotCXByaXZhdGUgT2JqZWN0IGVsZW1lbnRPYmo7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZUNsYXNzZXM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFkamFjZW50ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTW92ZVVwQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgT2JqZWN0IGVsZW1lbnRPYmosCi0JCQlDb2xsZWN0aW9uIGVDbGFzc2VzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQkJdGhpcy5lbGVtZW50T2JqID0gZWxlbWVudE9iajsKLQkJdGhpcy5lQ2xhc3NlcyA9IGVDbGFzc2VzOwotCi0JCXRoaXMubW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQlpZiAoYWN0aXZpdHkuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlMaXN0IGFsbEVsZW1lbnRzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gYWxsRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iai5lcXVhbHMoZWxlbWVudE9iaikpIHsKLQkJCQllbGVtZW50TG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSBlbGVtZW50TG9jYXRpb24gLSAxOyBpID49IDA7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IGFsbEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzRUNsYXNzSW5zdGFuY2VPZihlQ2xhc3Nlcywgb2JqKSkgewotCQkJCXRyYW5zZmVyTG9jYXRpb24gPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlCcmVha2Rvd25FbGVtZW50IHByZXYgPSAgKEJyZWFrZG93bkVsZW1lbnQpIGFsbEVsZW1lbnRzLmdldCh0cmFuc2ZlckxvY2F0aW9uKTsJCQotCQlpZihwcmV2LmdldFByZXNlbnRlZEFmdGVyKCkgPT0gZWxlbWVudE9iaikgewotCQkJYWRqYWNlbnQgPSB0cnVlOwotCQl9Ci0KLQkJcmVkbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHN3YXAgInByZXNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7CQkKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihlLmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihwcmV2KTsKLQkJfQotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKHRyYW5zZmVyTG9jYXRpb24sCi0JCQkJZWxlbWVudExvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQkoKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKS5tb3ZlKGVsZW1lbnRMb2NhdGlvbiwKLQkJCQl0cmFuc2ZlckxvY2F0aW9uKTsKLQkJaWYoYWRqYWNlbnQpIHsKLQkJCS8vIHJlc3RvcmUgInByZXNlbnRlZC1hZnRlciIgZWxlbWVudAotCQkJLy8KLQkJCUJyZWFrZG93bkVsZW1lbnQgcHJldiA9ICAoQnJlYWtkb3duRWxlbWVudCkgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQodHJhbnNmZXJMb2NhdGlvbik7CQkKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50T2JqOwotCQkJZS5zZXRQcmVzZW50ZWRBZnRlcihwcmV2LmdldFByZXNlbnRlZEFmdGVyKCkpOwotCQkJcHJldi5zZXRQcmVzZW50ZWRBZnRlcihlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGlmaWVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvT0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY5MTE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuVW5leGVjdXRhYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBkcmFnZ2luZyByb2xlIGludG8gVGVhbSBBbGxvY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT0JTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIE9CU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQlyZXR1cm4gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldFZhbGlkRGVzY3JpcHRvcihvYmosCi0vLwkJCQkJCShBY3Rpdml0eSkgb3duZXIsCi0vLwkJCQkJCSgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0vLwkJCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCQl9IGVsc2UgaWYgKG93bmVyIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnRMaXN0KAotCQkJCQkJKChUZWFtUHJvZmlsZSkgb3duZXIpLmdldFRlYW1Sb2xlcygpKS5jb250YWlucyhvYmopKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYykgewotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIG5ldyBPQlNEcm9wQ29tbWFuZCgoQWN0aXZpdHkpIG93bmVyLCBkcm9wU3JjKTsKLQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkvLyByZXR1cm4gbmV3IEdlbmVyaWNEcm9wQ29tbWFuZCgoVGVhbVByb2ZpbGUpIG93bmVyLAotCQkJLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksIGRyb3BTcmMsCi0JCQkvLyBnZXREcm9wQWRhcHRlcihvd25lcikpOwotCQkJcmV0dXJuIG5ldyBBZGRSb2xlVG9UZWFtQ29tbWFuZCgoVGVhbVByb2ZpbGUpIG93bmVyLCBkcm9wU3JjKTsKLQkJfSBlbHNlIGlmIChvd25lciBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCXJldHVybiBuZXcgR2VuZXJpY0Ryb3BDb21tYW5kKChDb21wb3NpdGVSb2xlKSBvd25lciwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQkJZHJvcFNyYywgZ2V0RHJvcEFkYXB0ZXIob3duZXIpKTsKLQkJfQotCi0JCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCX0KLQotCXByaXZhdGUgR2VuZXJpY0Ryb3BDb21tYW5kLkVsZW1lbnRBZGFwdGVyIGdldERyb3BBZGFwdGVyKE9iamVjdCBvd25lcikgewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9ICgoQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvd25lciwgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQlyZXR1cm4gYWRhcHRlci5jcmVhdGVEcm9wQWRhcHRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9PQlNEcm9wQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFjMzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL09CU0Ryb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lUE5hbWVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGRyYXAgYW5kIGRyb3Agcm9sZXMgdG8gVGVhbSBBbGxvY2F0aW9uIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPQlNEcm9wQ29tbWFuZCBleHRlbmRzIEJTRHJvcENvbW1hbmQgewotCXByaXZhdGUgQXJyYXlMaXN0IHdwRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCByb2xlRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIE1hcDxSb2xlRGVzY3JpcHRvciwgVGVhbVByb2ZpbGU+IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXA7Ci0KLQlwcml2YXRlIE1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM7Ci0KLQlwcml2YXRlIEhhc2hNYXA8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvVGFza0ZlYXR1cmVzTWFwOyAvLyBtYXAgb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHRvCi0KLQkvLyBtYXAgb2YgdGFzayBvdCBmZWF0dXJlIGxpc3QKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWdyYXRvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBuZXdEdXBsaWNhdGVzUmVtb3ZlZDsKLQkKLQlwdWJsaWMgT0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0LCBMaXN0IHJvbGVzKSB7Ci0JCXN1cGVyKGFjdCwgcm9sZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSBkcm9wRWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgT0JTRHJvcENvbW1hbmQoQWN0aXZpdHkgYWN0aXZpdHksIExpc3QgZHJvcEVsZW1lbnRzLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFNldCBzeW5jaEZlYXR1cmVzLAotCQkJSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQkJdGhpcy5jb25maWdyYXRvciA9IGNvbmZpZ3VyYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI3ByZUV4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWN1dGUoKSB7Ci0JCWlmICghc3VwZXIucHJlRXhlY3V0ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3cERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPSBuZXcgSGFzaE1hcCgpOwotCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCA9IHN5bmNocm9uaXplID8gYmF0Y2hDb21tYW5kCi0JCQkJLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkgOiBudWxsOwotCi0JCUxpc3QgYmVzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMpOwotCQkJCQotCQlpbnQgc2l6ZSA9IGRyb3BFbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgZHJvcEVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iocm9sZSkpIHsKLQkJCQlyb2xlID0gKFJvbGUpIFRuZ1V0aWwuZ2V0QmFzZShyb2xlKTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIHJvbGUgZGVzY3JpcHRvciBvZiB0aGUgcm9sZSBleGlzdHMgdW5kZXIgdGhpcwotCQkJLy8gYWN0aXZpdHkKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gbnVsbDsKLQkJCWlmIChzeW5jaHJvbml6ZSkgewotCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJLmdldERlc2NyaXB0b3Iocm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHJvbGUgZGVzY3JpcHRvciBvYmplY3QKLQkJCQlyb2xlRGVzYyA9IFByb2Nlc3NVdGlsLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKHJvbGUpOwotCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUocm9sZURlc2MpOwotCQkJCXJvbGVEZXNjTGlzdC5hZGQocm9sZURlc2MpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBuZWVkIHRvIGNsZWFyIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGV4aXN0aW5nCi0JCQkJLy8gZGVzY3JpcHRvcgotCQkJCS8vCi0JCQkJaWYgKHN5bmNocm9uaXplCi0JCQkJCQkmJiByb2xlRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJYmF0Y2hDb21tYW5kLmdldERlc2NyaXB0b3JzVG9SZWZyZXNoKCkuYWRkKHJvbGVEZXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiBub3QgYSBzeW5jaHJvbml6YXRpb24sIGdldCBhbGwgd29ya3Byb2R1Y3RzIHdoaWNoIGhhdmUgcm9sZSBhcwotCQkvLyByZXNwb25zaWJsZSByb2xlIGZvcgotCQkvLyB3aGljaCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCS8vCi0JCWlmICghc3luY2hyb25pemUpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpIGRyb3BFbGVtZW50cy5nZXQoaSk7Ci0JCQkJTGlzdCB3b3JrUHJvZHVjdHMgPSBQcm9jZXNzVXRpbC5nZXRXb3JrUHJvZHVjdHNGb3JSb2xlKHJvbGUsCi0JCQkJCQljb25maWcpOwotCQkJCWlmICgod29ya1Byb2R1Y3RzICE9IG51bGwpICYmICghKHdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpKSkgewotCQkJCQlIYXNoTWFwIHdwVG9FeGlzdGluZ0Rlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChhY3Rpdml0eQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLQkJCQkJZWxlbWVudHMuYWRkQWxsKHdwRGVzY0xpc3QpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlXb3JrUHJvZHVjdCB3cCA9IChXb3JrUHJvZHVjdCkgaXRlci5uZXh0KCk7CQkJCQkJCi0JCQkJCQlPYmplY3Qgd3BkID0gUHJvY2Vzc1V0aWwuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKHdwRGVzY0xpc3QsIHdwKTsKLQkJCQkJCWlmKHdwZCA9PSBudWxsKSB7Ci0JCQkJCQkJd3BkID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3Iod3AsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJfQotCQkJCQkJaWYgKHdwZCAhPSBudWxsKSB7Ci0JCQkJCQkJd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcC5wdXQod3AsIHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJTGlzdCBzZWxlY3RlZFdvcmtQcm9kdWN0cyA9IG5ldyBBcnJheUxpc3QoCi0JCQkJCQkJd3BUb0V4aXN0aW5nRGVzY3JpcHRvck1hcC5rZXlTZXQoKSk7Ci0JCQkJCXdvcmtQcm9kdWN0cy5yZW1vdmVBbGwoc2VsZWN0ZWRXb3JrUHJvZHVjdHMpOwotCQkJCQkKLQkJCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkV3BzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZpbmFsIExpc3QgZmluYWxXcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmaW5hbFdwcy5hZGRBbGwod29ya1Byb2R1Y3RzKTsKLQkJCQkJCWZpbmFsIFJvbGUgZmluYWxSb2xlID0gcm9sZTsKLQkJCQkJCQotCQkJCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCUxpc3Qgc2VsZWN0ZWQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuc2VsZWN0V29ya1Byb2R1Y3RzKGZpbmFsV3BzLCBmaW5hbFJvbGUpOwotCQkJCQkJCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgewotCQkJCQkJCQkJZmluYWxTZWxlY3RlZFdwcy5hZGRBbGwoc2VsZWN0ZWQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSwgdHJ1ZSk7Ci0JCQkJCX0KLQotCQkJCQlzZWxlY3RlZFdvcmtQcm9kdWN0cy5hZGRBbGwoZmluYWxTZWxlY3RlZFdwcyk7Ci0JCQkJCWlmICghc2VsZWN0ZWRXb3JrUHJvZHVjdHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlIYXNoU2V0IGFsbFNlbGVjdGVkVGFza3MgPSBuZXcgSGFzaFNldCgpOwotCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlbGVjdGVkV29ya1Byb2R1Y3RzLnNpemUoKTsgaisrKSB7Ci0JCQkJCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIHNlbGVjdGVkV29ya1Byb2R1Y3RzCi0JCQkJCQkJCQkuZ2V0KGopOwotCi0JCQkJCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQkJCQkJd3AgPSAoV29ya1Byb2R1Y3QpIFRuZ1V0aWwuZ2V0QmFzZSh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB3cFRvRXhpc3RpbmdEZXNjcmlwdG9yTWFwLmdldCh3cCk7Ci0JCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXdwRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbAotCQkJCQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3AsCi0JCQkJCQkJCQkJCQljb25maWcsCi0JCQkJCQkJCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpOwotCQkJCQkJCQl3cERlc2NMaXN0LmFkZCh3cERlc2MpOwotCi0JCQkJCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIGRlc2NyaXB0b3IgaW4gdGhlIGFjdGl2aXR5J3Mgc2NvcGUgaWYgdGhlcmUKLQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJLy8gYW55Ci0JCQkJCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwKTsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAucHV0KHdwRGVzYywKLQkJCQkJCQkJCQkJZGVzY3JpcHRvcik7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsCi0JCQkJCQkJCQkJJiYgd3BEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JCQkJCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh3cERlc2MpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlCi0JCQkJCQkJCQkJJiYgc3luY2hGZWF0dXJlcwotCQkJCQkJCQkJCQkJLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSkpIHsKLQkJCQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVEZWxpdmVyYWJsZVBhcnRzKAotCQkJCQkJCQkJCQl3cERlc2MsIChEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywKLQkJCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyBnZXQgYWxsIHBvc3NpYmxlIHRhc2tzIGZvciB0aGlzIHdvcmtwcm9kdWN0IGZvcgotCQkJCQkJCS8vIHdoaWNoIHRhc2sgZGVzY3JpcHRvciBuZWVkcyB0byBiZSBjcmVhdGVkCi0JCQkJCQkJTGlzdCB0YXNrcyA9IFByb2Nlc3NVdGlsLmdldFRhc2tzRm9yV29ya1Byb2R1Y3Qod3AsCi0JCQkJCQkJCQljb25maWcpOwotCi0JCQkJCQkJaWYgKCh0YXNrcyAhPSBudWxsKSAmJiAodGFza3Muc2l6ZSgpID4gMCkpIHsKLQkJCQkJCQkJLy8gZXhjbHVkZSBhbnkgdGFzayB0aGF0IGlzIGFscmVhZHkgc2VsZWN0ZWQgb3IgYWxyZWFkeSBleGlzdHMgaW4gYWN0aXZpdHkKLQkJCQkJCQkJLy8KLQkJCQkJCQkJdGFza3MucmVtb3ZlQWxsKGFsbFNlbGVjdGVkVGFza3MpOwotCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXNrcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJCU9iamVjdCB0ZCA9IFByb2Nlc3NVdGlsLmdldFRhc2tEZXNjcmlwdG9yKHRhc2tEZXNjTGlzdCwgdGFzayk7IAotCQkJCQkJCQkJaWYodGQgPT0gbnVsbCkgewotCQkJCQkJCQkJCXRkID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IodGFzaywgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZih0ZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJCWlmICghdGFza3MuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQlmaW5hbCBMaXN0IGZpbmFsVGFza3MgPSB0YXNrczsKLQkJCQkJCQkJCWZpbmFsIFdvcmtQcm9kdWN0IGZpbmFsV3AgPSB3cDsKLQkJCQkJCQkJCWZpbmFsIExpc3QgZmluYWxTZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCUxpc3Qgc2VsZWN0ZWRUYXNrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJCS8vIHNob3cgdGFzayBzZWxlY3Rpb25zIGRpYWxvZwotCQkJCQkJCQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucnVuU2FmZWx5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJCUxpc3Qgc2VsZWN0ZWQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkJLnNlbGVjdFRhc2tzKGZpbmFsVGFza3MsIGZpbmFsV3ApOwotCQkJCQkJCQkJCQlmaW5hbFNlbGVjdGVkLmFkZEFsbChzZWxlY3RlZCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSwgdHJ1ZSk7Ci0JCQkJCQkJCQlzZWxlY3RlZFRhc2tzLmFkZEFsbChmaW5hbFNlbGVjdGVkKTsKLQkJCQkJCQkJCWlmICgoc2VsZWN0ZWRUYXNrcyAhPSBudWxsKQotCQkJCQkJCQkJCQkmJiAoKCFzZWxlY3RlZFRhc2tzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCQkJCQkJYWxsU2VsZWN0ZWRUYXNrcy5hZGRBbGwoc2VsZWN0ZWRUYXNrcyk7Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCS8vIElmIG5vIHRhc2tzIGFyZSBzZWxlY3RlZCwgYWRkCi0JCQkJCQkJCQkJLy8gUmVzcG9uc2libGUgcm9sZSB0byB3cAotCQkJCQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5hZGRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycygKLQkJCQkJCQkJCQkJCXdwRGVzYywgYWN0aXZpdHksIHJvbGVEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCW51bGwsIGNvbmZpZyk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkvLyBJZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gc2hvdywgYWRkCi0JCQkJCQkJCS8vIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYywKLQkJCQkJCQkJCQlhY3Rpdml0eSwgcm9sZURlc2NMaXN0LCBudWxsLCBjb25maWcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY3JlYXRlIHRhc2sgZGVzY3JpcHRvcnMgZm9yIHRoaXMgd29ya3Byb2R1Y3QKLQkJCQkJCWlmICgoYWxsU2VsZWN0ZWRUYXNrcyAhPSBudWxsKQotCQkJCQkJCQkmJiAoIShhbGxTZWxlY3RlZFRhc2tzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYWxsU2VsZWN0ZWRUYXNrcy5pdGVyYXRvcigpOyBpdG9yCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCi0JCQkJCQkJCVRhc2sgdGFzayA9IChUYXNrKSBpdG9yLm5leHQoKTsKLQotCQkJCQkJCQkvLyBjYWxsIHRoaXMgbWV0aG9kIGV2ZW4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoZQotCQkJCQkJCQkvLyBnaXZlbiB0YXNrIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgYWN0aXZpdHkKLQkJCQkJCQkJLy8gdG8gYWRkIGFueSBhZGRpdGlvbmFsIHJlbGF0aW9uc2hpcHMgaW4gY2FzZQotCQkJCQkJCQkvLyBvZgotCQkJCQkJCQkvLyByZWNlbnQgY2hhbmdlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJCQkJCQkJLy8gb2YgdGhlIHByb2Nlc3MuCi0JCQkJCQkJCVBCU0Ryb3BDb21tYW5kCi0JCQkJCQkJCQkJLmFkZFRvRGVzY3JpcHRvckxpc3RzKAotCQkJCQkJCQkJCQkJdGFzaywKLQkJCQkJCQkJCQkJCWFjdGl2aXR5LAotCQkJCQkJCQkJCQkJdGFza0Rlc2NMaXN0LAotCQkJCQkJCQkJCQkJcm9sZURlc2NMaXN0LAotCQkJCQkJCQkJCQkJd3BEZXNjTGlzdCwKLQkJCQkJCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywKLQkJCQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJCQkJCQkJYmF0Y2hDb21tYW5kCi0JCQkJCQkJCQkJCQkJCS5nZXRPYmplY3RUb05ld0ZlYXR1cmVWYWx1ZXNNYXAoKSwKLQkJCQkJCQkJCQkJCWNvbmZpZywgc3luY2hyb25pemUsIHN5bmNoRmVhdHVyZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGVuc3VyZSB1bmlxdWUgbmFtZXMgZm9yIHdwIGRlc2NyaXB0b3JzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3BEZXNjTGlzdC5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QuZ2V0KGkpOwkJCQotCQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQkJdW5pcXVlTmFtZXNIYW5kbGVyLmVuc3VyZVVuaXF1ZSh3cERlc2MpOwkKLQkJCX0KLQkJfQotCQlyZXR1cm4gKCFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpIC8vIHx8ICFyb2xlQXNzb2NpYXRpb25MaXN0LmlzRW1wdHkoKQotCQkJCXx8ICF0YXNrRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgIXdwRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJfHwgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsICYmICF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkJCQkJCS5pc0VtcHR5KCkpIHx8ICF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpCi0JCQkJfHwgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JCQkJCQkuaXNFbXB0eSgpKSB8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXJlbW92ZU5ld0R1cGxpY2F0ZXMoKTsKLQotCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eQotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCi0JCWlmIChyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID09IG51bGwpIHsKLQkJCS8vIHByZXBhcmUgZm9yIGF1dG9tYXRpYyBhc3NpZ25tZW50IG9mIHJvbGUgZGVzY3JpcHRvciB0byB0ZWFtCi0JCQkvLyBwcm9maWxlCi0JCQkvLwotCQkJcm9sZURlc2NUZWFtUHJvZmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gVXNlckludGVyYWN0aW9uSGVscGVyLmdldFRlYW0oCi0JCQkJCQlhY3Rpdml0eSwgcm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJCQlpZiAodGVhbVByb2ZpbGUgIT0gbnVsbCkgewotCQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLnB1dChyb2xlRGVzYywgdGVhbVByb2ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGFkZCByb2xlIGRlc2NyaXB0b3JzIHRvIHRlYW0gcHJvZmlsZXMKLQkJLy8KLQkJZm9yIChNYXAuRW50cnk8Um9sZURlc2NyaXB0b3IsIFRlYW1Qcm9maWxlPiBlbnRyeSA6IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKSkgewotCQkJVGVhbVByb2ZpbGUgdGVhbSA9IChUZWFtUHJvZmlsZSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXRlYW0uZ2V0VGVhbVJvbGVzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJfQotCi0JCS8vIGF1dG9tYXRpY2FsbHkgYWRkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvIGRlbGl2ZXJhYmxlIHBhcnQKLQkJLy8KLQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PFdvcmtQcm9kdWN0RGVzY3JpcHRvciwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPiBlbnRyeSA6Ci0JCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKSkgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gYWRkIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRLZXkoKTsKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbCgKLQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBuZXcgZGVzY3JpcHRvcnMgdG8gYWN0aXZpdHkncyBwYWNrYWdlCi0JCS8vCi0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5hZGQoYWN0aXZpdHkuZVJlc291cmNlKCkpOwotCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBuZXcgZWxlbWVudHMgdGhhdCBhcmUgZHVwbGljYXRlIGIvYyB0aGV5IGFyZSBjcmVhdGVkIGJ5IHRoZQotCSAqIHByZXZpb3VzIFdCU0Ryb3BDb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5ld0R1cGxpY2F0ZXMoKSB7Ci0JCWlmIChzeW5jaHJvbml6ZSkgewotCQkJaWYgKCFuZXdEdXBsaWNhdGVzUmVtb3ZlZCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyCi0JCQkJCQkJLm5leHQoKTsKLQkJCQkJT2JqZWN0IGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcih3cGQKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSwgYWN0aXZpdHksCi0JCQkJCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJCWlmICh3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5yZW1vdmUod3BkKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucmVtb3ZlKHdwZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAod3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLnJlbW92ZSh3cGQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCW5ld0R1cGxpY2F0ZXNSZW1vdmVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9VbmRvKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VuZG8oKSB7Ci0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gYWN0aXZpdHkKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIHRlYW0gcHJvZmlsZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sZURlc2NUZWFtUHJvZmlsZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlUZWFtUHJvZmlsZSB0ZWFtID0gKFRlYW1Qcm9maWxlKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQl9Ci0KLQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgdGFzayBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCS8vIC8vIGRpc2Fzc29jaWF0ZSBuZXcgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIHdpdGggdGFzayBkZXNjcmlwdG9ycwotCQkvLyAvLwotCQkvLyBpZih3cGRUb1Rhc2tGZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvVGFza0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkvLyBNYXAgdGFza0ZlYXR1cmVzID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRhc2tGZWF0dXJlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIE1hcC5FbnRyeSBlbnQgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCS8vIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKQotCQkvLyBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihlbnQuZ2V0S2V5KCksIGFjdGl2aXR5LAotCQkvLyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9ICgoQ29sbGVjdGlvbillbnQuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKTsKLQkJLy8gaXRlcmF0b3IxCi0JCS8vIC5oYXNOZXh0KCk7KSB7Ci0JCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IxLm5leHQoKTsKLQkJLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGRlc2NGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkJLy8gRkVBVFVSRV9NQVAuZ2V0KGYpOwotCQkvLyBpZihkZXNjRmVhdHVyZS5pc01hbnkoKSkgewotCQkvLyAoKExpc3QpdGFza0Rlc2MuZUdldChkZXNjRmVhdHVyZSkpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIHRhc2tEZXNjLmVTZXQoZGVzY0ZlYXR1cmUsIG51bGwpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQotCQkvLyByZW1vdmUgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCS5nZXRLZXkoKTsKLQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZUFsbCgKLQkJCQkJCShDb2xsZWN0aW9uKSBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmcm9tIGRlbGl2ZXJhYmxlIHBhcnQKLQkJLy8KLQkJaWYgKCF3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzIGZyb20gYWN0aXZpdHkncyBwYWNrYWdlCi0JCS8vCi0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwocm9sZURlc2NMaXN0KTsKLQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwod3BEZXNjTGlzdCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwoKENvbGxlY3Rpb24pIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIC8qKgotCS8vICogR2V0IHRhc2sgZGVzY3JpcHRvcnMgbWFwIGZvciBhbiBhY3Rpdml0eQotCS8vICogQHBhcmFtIGFjdGl2aXR5Ci0JLy8gKiBAcmV0dXJuCi0JLy8gKi8KLQkvLyBwcml2YXRlIHN0YXRpYyBIYXNoTWFwIGdldFRhc2tzTWFwRm9yQWN0aXZpdHkoQWN0aXZpdHkgYWN0aXZpdHkpCi0JLy8gewotCS8vIExpc3QgZWxlbWVudHMgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCS8vIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBmb3IgKGludCBpPTA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykKLQkvLyB7Ci0JLy8gT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkvLyBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpCi0JLy8gewotCS8vIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBvYmo7Ci0JLy8gVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCS8vIGlmICh0YXNrICE9IG51bGwpCi0JLy8gewotCS8vIG1hcC5wdXQodGFzaywgdGFza0Rlc2MpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBtYXA7Ci0JLy8gfQotCS8vCQotCS8vCQotCS8vIC8qKgotCS8vICogU2hvdyBSb2xlQXNzb2NpYXRpb24gRGlhbG9nCi0JLy8gKiBAcGFyYW0gdGFza3MKLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIGludCBzaG93Um9sZUFzc29jaWF0aW9uRGlhbG9nKFRhc2sgdGFzaykKLQkvLyB7Ci0JLy8JCQotCS8vIFJvbGVBc3NvY2lhdGlvbkRpYWxvZyByb2xlQXNzb2MgPSBuZXcKLQkvLyBSb2xlQXNzb2NpYXRpb25EaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGFzayk7Ci0JLy8gcm9sZUFzc29jLm9wZW4oKTsKLQkvLwkJCi0JLy8gLy8gc2VsZWN0ZWQgdGFza3M7Ci0JLy8gcmV0dXJuIHJvbGVBc3NvYy5nZXRSb2xlQXNzb2NpYXRpb24oKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZ2V0QWZmZWN0ZWRPYmplY3RzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCWlmIChyb2xlRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJvbGVEZXNjTGlzdDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHJvbGVEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY0xpc3QuY2xlYXIoKTsKLQkJfQotCQlpZiAocm9sZURlc2NUZWFtUHJvZmlsZU1hcCAhPSBudWxsKSB7Ci0JCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJd3BEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmICh3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCkgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjZjU2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9QQlNEcmFnQW5kRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIGZvciBkcm9wcGluZyB3b3JrIHByb2R1Y3RzIGludG8gV1AgVXNhZ2Ugc3RydWN0dXJlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUEJTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFBCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJb2JqID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQotCQlpZihvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiB0cnVlOwotLy8JCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCAoQWN0aXZpdHkpIG93bmVyLAotLy8JCQkJCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYykgewotCQlyZXR1cm4gbmV3IFBCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1BCU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODFiMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUEJTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkJhdGNoQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlVuaXF1ZU5hbWVQTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIENvbW1hbmQgdG8gZHJhZyBhbmQgZHJvcCB3b3JrIHByb2R1Y3RzIHRvIFdvcmsgUHJvZHVjdCBVc2FnZSBicmVha2Rvd24KLSAqIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBCU0Ryb3BDb21tYW5kIGV4dGVuZHMgQlNEcm9wQ29tbWFuZCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3Qgd3BEZXNjTGlzdDsKLQotCXByaXZhdGUgQXJyYXlMaXN0IHJvbGVEZXNjTGlzdDsKLQotCXByaXZhdGUgTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQotCXByaXZhdGUgSGFzaE1hcDxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEJhdGNoQ29tbWFuZCB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kOwotCi0JcHJpdmF0ZSBib29sZWFuIG5ld0R1cGxpY2F0ZXNSZW1vdmVkOwotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGxpbmtlZFRhc2tzOwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwZFRvVGFza0ZlYXR1cmVzTWFwOwotCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHdvcmtQcm9kdWN0cykgewotCQlzdXBlcihhY3Rpdml0eSwgd29ya1Byb2R1Y3RzKTsKLQkJdGhpcy5hY3Rpdml0eSA9IGFjdGl2aXR5OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkcm9wRWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIHN5bmNoCi0JICovCi0JcHVibGljIFBCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBQQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yKSB7Ci0JCXN1cGVyKGFjdGl2aXR5LCBkcm9wRWxlbWVudHMsIGNvbmZpZywgc3luY2hGZWF0dXJlcyk7Ci0JCXRoaXMuY29uZmlndXJhdG9yID0gY29uZmlndXJhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjcHJlRXhlY3V0ZSgpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJaWYgKCFzdXBlci5wcmVFeGVjdXRlKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGFza0Rlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyb2xlRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlpZighc3luY2hyb25pemUgfHwgKHN5bmNocm9uaXplICYmIHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkpKSkgewotCQkJLy8gYWRkIHN1YmFydGlmYWN0cyB0byBkcm9wRWxlbWVudHMgbGlzdCBpZiB0aGVyZSBpcyBhbnkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGRyb3BFbGVtZW50cykuaXRlcmF0b3IoKTsgaXRlcgotCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZWxlbWVudCwgZmFsc2UpIHsKLQkJCQkJCQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNDgyMDQ3Nzg4NzQyNjA4NzI2Mkw7Ci0JCQkJCQkKLQkJCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQkJT2JqZWN0IHN1YkFydGlmYWN0cyA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLQkJCQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCQkJCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJCQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKXN1YkFydGlmYWN0cykuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9OwotCQkJCQkKLQkJCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQkJQXJ0aWZhY3Qgc3ViQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmICghZHJvcEVsZW1lbnRzLmNvbnRhaW5zKHN1YkFydGlmYWN0KSAmJiBwcmVwYXJlQWRkKChXb3JrUHJvZHVjdCkgc3ViQXJ0aWZhY3QpKSAKLQkJCQkJCXsKLQkJCQkJCQlkcm9wRWxlbWVudHMuYWRkKHN1YkFydGlmYWN0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQlTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBzeW5jaHJvbml6ZSA/IGJhdGNoQ29tbWFuZC5nZXREZXNjcmlwdG9yc1RvUmVmcmVzaCgpIDogbnVsbDsKLQkJCi0JCUxpc3QgYmVzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB1bmlxdWVOYW1lc0hhbmRsZXIgPSBuZXcgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihiZXMpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBkcm9wRWxlbWVudHMuZ2V0KGkpOwkJCQotCQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih3cCkpIHsKLQkJCQl3cCA9IChXb3JrUHJvZHVjdCkgVG5nVXRpbC5nZXRCYXNlKHdwKTsKLQkJCX0KLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSBudWxsOwotCQkJaWYgKHN5bmNocm9uaXplKSB7Ci0JCQkJd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsCi0JCQkJCS5nZXREZXNjcmlwdG9yKHdwLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCX0KLQkJCWlmICh3cERlc2MgPT0gbnVsbCkgewotCQkJCXdwRGVzYyA9IFByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3Iod3AsIGNvbmZpZywKLQkJCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyk7Ci0vLwkJCQl1bmlxdWVOYW1lc0hhbmRsZXIuZW5zdXJlVW5pcXVlKHdwRGVzYyk7Ci0JCQkJd3BEZXNjTGlzdC5hZGQod3BEZXNjKTsKLQotCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgaW4KLQkJCQkvLyB0aGUgYWN0aXZpdHkncyBzY29wZSBpZiB0aGVyZSBpcyBhbnkKLQkJCQkvLyB2YWxpZCBvbmUuCi0JCQkJLy8KLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlcgotCQkJCQkJLmdldERlbGl2ZXJhYmxlKGFjdGl2aXR5LCB3cCk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5wdXQod3BEZXNjLCBkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJCQkvLyByZXBsYWNlIHdvcmsgcHJvZHVjdCB3aXRoIGl0cyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpbiB3cGRUb1Rhc2tGZWF0dXJlc01hcAotCQkJCQkvLwotCQkJCQlNYXAgZmVhdHVyZXNNYXAgPSAoTWFwKSB3cGRUb1Rhc2tGZWF0dXJlc01hcC5nZXQod3ApOwotCQkJCQlpZihmZWF0dXJlc01hcCAhPSBudWxsKSB7Ci0JCQkJCQl3cGRUb1Rhc2tGZWF0dXJlc01hcC5yZW1vdmUod3ApOwotCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucHV0KHdwRGVzYywgZmVhdHVyZXNNYXApOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmIHdwRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQod3BEZXNjKTsKLQkJCQl9Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUgJiYgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSkpIHsKLQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BEZXNjLAotCQkJCQkJCShEZWxpdmVyYWJsZSkgd3AsIGNvbmZpZywgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAucmVtb3ZlKHdwKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCi0JCQlpZiAoIXN5bmNocm9uaXplKSB7Ci0JCQkJLy8gZ2V0IGFsbCBwb3NzaWJsZSB0YXNrcyBmb3IgdGhpcyB3b3JrcHJvZHVjdCBmb3IKLQkJCQkvLyB3aGljaCB0YXNrIGRlc2NyaXB0b3IgbmVlZHMgdG8gYmUgY3JlYXRlZAotCQkJCUxpc3QgdGFza3MgPSBQcm9jZXNzVXRpbC5nZXRUYXNrc0ZvcldvcmtQcm9kdWN0KHdwLCBjb25maWcpOwotCi0JCQkJaWYgKCh0YXNrcyAhPSBudWxsKSAmJiAodGFza3Muc2l6ZSgpID4gMCkpIHsKLQkJCQkJLy8gc2hvdyB0YXNrIHNlbGVjdGlvbnMgZGlhbG9nCQkKLQkJCQkJZmluYWwgTGlzdCBmaW5hbFRhc2tzID0gdGFza3M7Ci0JCQkJCWZpbmFsIFdvcmtQcm9kdWN0IGZpbmFsV3AgPSB3cDsKLQkJCQkJZmluYWwgTGlzdCBmaW5hbFNlbGVjdGVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlMaXN0IHNlbGVjdGVkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCS8vIHNob3cgdGFzayBzZWxlY3Rpb25zIGRpYWxvZwotCQkJCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5TYWZlbHkobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUxpc3Qgc2VsZWN0ZWQgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuc2VsZWN0VGFza3MoCi0JCQkJCQkJCQlmaW5hbFRhc2tzLCBmaW5hbFdwKTsJCQkJCQkKLQkJCQkJCQlmaW5hbFNlbGVjdGVkLmFkZEFsbChzZWxlY3RlZCk7Ci0JCQkJCQl9Ci0JCQkJCX0sIHRydWUpOwotCQkJCQlzZWxlY3RlZFRhc2tzLmFkZEFsbChmaW5hbFNlbGVjdGVkKTsKLQkJCQkJCi0JCQkJCS8vIGNyZWF0ZSB0YXNrIGRlc2NyaXB0b3JzIGZvciB0aGlzIHdvcmtwcm9kdWN0Ci0JCQkJCWlmICgoc2VsZWN0ZWRUYXNrcyAhPSBudWxsKSAmJiAoIShzZWxlY3RlZFRhc2tzLmlzRW1wdHkoKSkpKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlbGVjdGVkVGFza3Muc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgc2VsZWN0ZWRUYXNrcy5nZXQoaik7Ci0KLQkJCQkJCQkvLyBjYWxsIHRoaXMgbWV0aG9kIGV2ZW4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoZQotCQkJCQkJCS8vIGdpdmVuIHRhc2sgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBhY3Rpdml0eQotCQkJCQkJCS8vIHRvIGFkZCBhbnkgYWRkaXRpb25hbCByZWxhdGlvbnNoaXBzIGluIGNhc2Ugb2YKLQkJCQkJCQkvLyByZWNlbnQgY2hhbmdlIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkJCQkJCQkvLyBvZiB0aGUgcHJvY2Vzcy4KLQkJCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRUb0Rlc2NyaXB0b3JMaXN0cyh0YXNrLCBhY3Rpdml0eSwKLQkJCQkJCQkJCXRhc2tEZXNjTGlzdCwgcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LAotCQkJCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQkJCQliYXRjaENvbW1hbmQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCksIAotCQkJCQkJCQkJY29uZmlnLCB0cnVlLCBzeW5jaEZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIElmIG5vIHRhc2tzIGFyZSBzZWxlY3RlZCwgYWRkIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJCVByb2Nlc3NDb21tYW5kVXRpbC5hZGRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MsIGFjdGl2aXR5LAotCQkJCQkJCQlyb2xlRGVzY0xpc3QsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBjb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLwlJZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gc2hvdywgYWRkIFJlc3BvbnNpYmxlIHJvbGUgdG8gd3AKLQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmFkZFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwRGVzYywgYWN0aXZpdHksCXJvbGVEZXNjTGlzdCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsIGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotLy8JCQllbHNlIHsKLS8vCQkJCS8vCWluIGNhc2Ugb2Ygc3luY2hyb25pemF0aW9uLCBhZGQgUmVzcG9uc2libGUgcm9sZSB0byB3cAotLy8JCQkJaWYgKHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSkKLS8vCQkJCQlQQlNEcm9wQ29tbWFuZC5hZGRSZXNwb25zaWJsZVJvbGUod3BEZXNjLCBhY3Rpdml0eSwJcm9sZURlc2NMaXN0LCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLS8vCQkJfQkJCQkKLQkJfQotCi0JCWlmKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kID0gbmV3IEJhdGNoQ29tbWFuZCh0cnVlKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IHdwRGVzYyA9IGVudHJ5LmdldEtleSgpOwotCQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZ2V0T2JqZWN0VG9OZXdGZWF0dXJlVmFsdWVzTWFwKCkucHV0KHdwRGVzYywgCi0JCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotCQkJfQotCQl9Ci0JCQotCi0JCS8vIGVuc3VyZSB1bmlxdWUgbmFtZXMgZm9yIHdwIGRlc2NyaXB0b3JzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgd3BEZXNjTGlzdC5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHdwRGVzY0xpc3QKLQkJCQkJLmdldChpKTsKLQkJCWlmICh3cERlc2MgIT0gbnVsbCkgewotCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIXRhc2tEZXNjTGlzdC5pc0VtcHR5KCkKLQkJCQl8fCAhcm9sZURlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICF3cERlc2NMaXN0LmlzRW1wdHkoKQotCQkJCXx8ICh1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwgJiYgdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5jYW5FeGVjdXRlKCkpCi0JCQkJfHwgIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKQotCQkJCXx8IChkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsICYmICFkZXNjcmlwdG9yc1RvUmVmcmVzaAotCQkJCQkJLmlzRW1wdHkoKSkKLQkJCQl8fCBiYXRjaENvbW1hbmQuY2FuRXhlY3V0ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3ViQXJ0aWZhY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByZXBhcmVBZGQoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJaWYgKHN5bmNocm9uaXplKSB7CQotCQkJLy8gZ2V0IGxpbmtlZCB0YXNrcyBvZiB0aGUgdGFzayBkZXNjcmlwdG9ycyBpbiB0aGUgYWN0aXZpdHkgZm9yIHRoZSBjb25maWd1cmF0aW9uCi0JCQkvLwotCQkJTGlzdCB0YXNrcyA9IGdldExpbmtlZFRhc2tzKCk7Ci0JCQkKLQkJCWlmKCF0YXNrcy5pc0VtcHR5KCkpIHsKLQkJCQkvLyBzZWxlY3Qgb25seSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGlucHV0IG9yIG91dHB1dCBvZiBhbiBleGlzdGluZyB0YXNrIGluIHRoZSBhY3Rpdml0eQotCQkJCS8vCQotCQkJCU1hcCBmZWF0dXJlc01hcCA9IFByb2Nlc3NDb21tYW5kVXRpbC5nZXRGZWF0dXJlc01hcCh0YXNrcywgd3AsIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYoIWZlYXR1cmVzTWFwLmlzRW1wdHkoKSkgewotCQkJCQkvLyB1c2UgdGhlIHdwIHRvIHRoZSBrZXkgaW4gdGhlIG1hcCByaWdodCBub3cgYW5kIHJlcGxhY2UgaXQgd2l0aAotCQkJCQkvLyBpdHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgbGF0ZXIKLQkJCQkJLy8KLQkJCQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgPT0gbnVsbCkgewotCQkJCQkJd3BkVG9UYXNrRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCQl9Ci0JCQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLnB1dCh3cCwgZmVhdHVyZXNNYXApOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRMaW5rZWRUYXNrcygpIHsKLQkJaWYobGlua2VkVGFza3MgPT0gbnVsbCkgewotCQkJbGlua2VkVGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCVRhc2sgdGFzayA9ICgoVGFza0Rlc2NyaXB0b3IpZWxlbWVudCkuZ2V0VGFzaygpOwotCQkJCQlpZih0YXNrICE9IG51bGwgJiYgY29uZmlndXJhdG9yLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJbGlua2VkVGFza3MuYWRkKHRhc2spOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rZWRUYXNrczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIG5ldyBlbGVtZW50cyB0aGF0IGFyZSBkdXBsaWNhdGUgYi9jIHRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIHByZXZpb3VzIFdCU0Ryb3BDb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5ld0R1cGxpY2F0ZXMoKSB7Ci0JCWlmKHN5bmNocm9uaXplKSB7Ci0JCQlpZighbmV3RHVwbGljYXRlc1JlbW92ZWQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJT2JqZWN0IGRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihyb2xlRGVzYy5nZXRSb2xlKCksIGFjdGl2aXR5LCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQlpZihkZXNjICE9IG51bGwpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbmV3RHVwbGljYXRlc1JlbW92ZWQgPSB0cnVlOwkJCQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb0V4ZWN1dGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJcmVtb3ZlTmV3RHVwbGljYXRlcygpOwotCQkKLQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkvLwotCQlpZiAoIXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmlzRW1wdHkoKSkgewotCQkJZm9yIChNYXAuRW50cnk8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGVudHJ5IDogCi0JCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKSkgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZWxpdmVyYWJsZSA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQlkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkKGVudHJ5LmdldEtleSgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwod3BEZXNjTGlzdCk7Ci0KLQkJLy8gYWRkIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycwotCQkvLwotCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkKLQkJLy8gYXNzb2NpYXRlIG5ldyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgd2l0aCB0YXNrIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZFRvVGFza0ZlYXR1cmVzTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJTWFwIHRhc2tGZWF0dXJlcyA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRhc2tGZWF0dXJlcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudCA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIFByb2Nlc3NDb21tYW5kVXRpbC5nZXREZXNjcmlwdG9yKGVudC5nZXRLZXkoKSwgYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKSwgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCBmYWxzZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gKChDb2xsZWN0aW9uKWVudC5nZXRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXNjRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIEZFQVRVUkVfTUFQLmdldChmKTsKLQkJCQkJCWlmKGRlc2NGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KXRhc2tEZXNjLmVHZXQoZGVzY0ZlYXR1cmUpKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIFRPRE86IG5lZWQgdG8gYmFjayB1cCBvbGQgdmFsdWUgaGVyZQotCQkJCQkJCS8vCi0JCQkJCQkJdGFza0Rlc2MuZVNldChkZXNjRmVhdHVyZSwgZW50cnkuZ2V0S2V5KCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyB0byBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotLy8JCWdldE1vZGlmaWVkUmVzb3VyY2VzKCkuYWRkKGFjdGl2aXR5LmVSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCN1cGRhdGVEZXNjcmlwdG9ycygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVzY3JpcHRvcnMoKSB7Ci0JCXN1cGVyLnVwZGF0ZURlc2NyaXB0b3JzKCk7Ci0JCQotCQkvLyBhZGQgZGVsaXZlcmFibGUgcGFydHMgdG8gdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycwotCQkvLwotCQlpZih1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kICE9IG51bGwpIHsKLQkJCXVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjdW5kb1VwZGF0ZURlc2NyaXB0b3JzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmRvVXBkYXRlRGVzY3JpcHRvcnMoKSB7Ci0JCS8vIHJlbW92ZSBkZWxpdmVyYWJsZSBwYXJ0cyBvZiB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWlmKHVwZGF0ZURlbGl2ZXJhYmxlUGFydHNDbWQgIT0gbnVsbCkgewotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC51bmRvKCk7Ci0JCX0KLQotCQlzdXBlci51bmRvVXBkYXRlRGVzY3JpcHRvcnMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kI2RvVW5kbygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmRvKCkgewotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHdwRGVzY0xpc3QpOwotCi0JCS8vIHJlbW92ZSByb2xlIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJLy8gcmVtb3ZlIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQotCQkvLyByZW1vdmUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZnJvbSBkZWxpdmVyYWJsZSBwYXJ0Ci0JCS8vCi0JCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5lbnRyeVNldCgpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVsaXZlcmFibGUgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJLmdldFZhbHVlKCk7Ci0JCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJLy8KLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBhY3Rpdml0eS5lQ29udGFpbmVyKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCkgewotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh0YXNrRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCgoQ29sbGVjdGlvbikgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBkaXNhc3NvY2lhdGUgbmV3IHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyB3aXRoIHRhc2sgZGVzY3JpcHRvcnMKLQkJLy8KLQkJaWYod3BkVG9UYXNrRmVhdHVyZXNNYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9UYXNrRmVhdHVyZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlNYXAgdGFza0ZlYXR1cmVzID0gKE1hcCkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza0ZlYXR1cmVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnQgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjID0gKFRhc2tEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0RGVzY3JpcHRvcihlbnQuZ2V0S2V5KCksIGFjdGl2aXR5LCBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMSA9ICgoQ29sbGVjdGlvbillbnQuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBkZXNjRmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIEZFQVRVUkVfTUFQLmdldChmKTsKLQkJCQkJCWlmKGRlc2NGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KXRhc2tEZXNjLmVHZXQoZGVzY0ZlYXR1cmUpKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXRhc2tEZXNjLmVTZXQoZGVzY0ZlYXR1cmUsIG51bGwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd3BEZXNjTGlzdDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXRBZmZlY3RlZE9iamVjdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSB0YXNrRGVzY0xpc3QKLQkgKiBAcGFyYW0gcm9sZURlc2NMaXN0Ci0JICogQHBhcmFtIHdwRGVzY0xpc3QKLQkgKiBAcGFyYW0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzCi0JICogQHBhcmFtIGRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG5ldyBUYXNrRGVzY3JpcHRvciBpcyBjcmVhdGVkIGZvciB0aGUKLQkgKiAgICAgICAgIGdpdmVuIHRhc2ssIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGRUb0Rlc2NyaXB0b3JMaXN0cyhUYXNrIHRhc2ssIEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJTGlzdCB0YXNrRGVzY0xpc3QsIExpc3Qgcm9sZURlc2NMaXN0LCBMaXN0IHdwRGVzY0xpc3QsCi0JCQlNYXAgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBTZXQgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQlNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gdXNlRXhpc3RpbmdEZXNjcmlwdG9yLCBTZXQgc3luY2hGZWF0dXJlcykgewotCQlUYXNrRGVzY3JpcHRvciBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2ssIGFjdGl2aXR5LAotCQkJCXJvbGVEZXNjTGlzdCwgd3BEZXNjTGlzdCwgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBudWxsLAotCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLCBkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCAKLQkJCQljb25maWcsIHVzZUV4aXN0aW5nRGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcyk7Ci0JCWlmICgoZGVzYyAhPSBudWxsKSAmJiAodGFza0Rlc2NMaXN0ICE9IG51bGwpCi0JCQkJJiYgIXRhc2tEZXNjTGlzdC5jb250YWlucyhkZXNjKSkgewotCQkJdGFza0Rlc2NMaXN0LmFkZChkZXNjKTsKLQkJfQotCQlyZXR1cm4gZGVzYyAhPSBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY0xpc3QgIT0gbnVsbCkgewotCQkJd3BEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlpZih3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAhPSBudWxsKSB7Ci0JCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcC5jbGVhcigpOwotCQl9Ci0JCWlmKHdwZFRvVGFza0ZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCXdwZFRvVGFza0ZlYXR1cmVzTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzQ29tbWFuZFV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTBkMWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NDb21tYW5kVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJvdmlkZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE5vdiAyMywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvY2Vzc0NvbW1hbmRVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIERFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCksCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSAKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBUQVNLX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSAKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmVbXSBST0xFX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMgPSB7IAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpIAotCX07Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlW10gV09SS19QUk9EVUNUX1JFRlJFU0hBQkxFX0ZFQVRVUkVTID0gewotLy8KLS8vCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVmcmVzaGFibGUgZmVhdHVyZSBtYXAgZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yLiBBIGRlc2NyaXB0b3IKLQkgKiBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgcmVmcmVzaGFibGUgaWYgdGhlcmUgaXMgYSBzaW1pbGlhciBmZWF0dXJlIGluIGl0cwotCSAqIGxpbmtlZCBNZXRob2RFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlIG1hcCBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBjcmVhdGVSZWZyZXNoYWJsZUZlYXR1cmVNYXAoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCU1hcCBmZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJYWRkVG9GZWF0dXJlTWFwKGRlc2NyaXB0b3IsIERFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMsIGZlYXR1cmVNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCWlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWFkZFRvRmVhdHVyZU1hcChkZXNjcmlwdG9yLCBUQVNLX0RFU0NSSVBUT1JfUkVGUkVTSEFCTEVfRkVBVFVSRVMsCi0JCQkJCWZlYXR1cmVNYXAsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCX0gZWxzZSBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlhZGRUb0ZlYXR1cmVNYXAoZGVzY3JpcHRvciwgUk9MRV9ERVNDUklQVE9SX1JFRlJFU0hBQkxFX0ZFQVRVUkVTLAotCQkJCQlmZWF0dXJlTWFwLCBleGNsdWRlRmVhdHVyZXMpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCQlpZiAod3BkLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSAmJiAhZXhjbHVkZUZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVNYXA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb0ZlYXR1cmVNYXAoRU9iamVjdCBlT2JqZWN0LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMsIE1hcCBmZWF0dXJlTWFwLCBTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQlpZiAoIWV4Y2x1ZGVGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCU9iamVjdCB2YWx1ZSA9IGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQl2YWx1ZSA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCQl9Ci0JCQkJZmVhdHVyZU1hcC5wdXQoZmVhdHVyZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmVmZXJlbmNlKEVPYmplY3QgZSkgewotCS8vIGlmIChlLmVJc1Byb3h5KCkpIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIGlmIChlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IFByb2Nlc3NVdGlsCi0JLy8gLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlKTsKLQkvLyBpZiAoZWxlbWVudCA9PSBudWxsIHx8IGVsZW1lbnQuZUlzUHJveHkoKSkgewotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiB0cnVlOwotCS8vIH0KLQotCS8qKgotCSAqIENsZWFycyBhbGwgYXR0cmlidXRlcy4gRm9yIHJlZmVyZW5jZXMsIHJlbW92ZSBvbmx5IHRob3NlIHRoYXQgYXJlCi0JICogZGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gYW55IGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBjbGVhclJlZnJlc2hhYmxlRmVhdHVyZXMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCU1hcCBmZWF0dXJlTWFwID0gY3JlYXRlUmVmcmVzaGFibGVGZWF0dXJlTWFwKGRlc2NyaXB0b3IsIGV4Y2x1ZGVGZWF0dXJlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSB7Ci0JCQkJZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkvLyB3b3JrIGFyb3VuZCB0byBhdm9pZCBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KLQkJCQkJLy8KLQkJCQkJTGlzdCBsaXN0ID0gKChMaXN0KSBkZXNjcmlwdG9yLmVHZXQoZmVhdHVyZSkpOwotCQkJCQlzd2l0Y2ggKGxpc3Quc2l6ZSgpKSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlsaXN0LnJlbW92ZSgwKTsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJbGlzdC5jbGVhcigpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCX0KLQkJCQkvLyBpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJLy8gTGlzdCBsaXN0ID0gKChMaXN0KWRlc2NyaXB0b3IuZUdldChmZWF0dXJlKSk7Ci0JCQkJLy8gTGlzdCBlbGVtZW50c1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLy8gLmhhc05leHQoKTspIHsKLQkJCQkvLyBFT2JqZWN0IGUgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCS8vIGlmKCFpc1ZhbGlkUmVmZXJlbmNlKGUpKSB7Ci0JCQkJLy8gZWxlbWVudHNUb1JlbW92ZS5hZGQoZSk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBpZighZWxlbWVudHNUb1JlbW92ZS5pc0VtcHR5KCkpIHsKLQkJCQkvLyBsaXN0LnJlbW92ZUFsbChlbGVtZW50c1RvUmVtb3ZlKTsKLQkJCQkvLyBTeXN0ZW0ub3V0Ci0JCQkJLy8gLnByaW50bG4oIlByb2Nlc3NDb21tYW5kVXRpbC5jbGVhclJlZnJlc2hhYmxlRmVhdHVyZXMoKToKLQkJCQkvLyBjaGFuZ2VkIik7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBlbHNlIHsKLQkJCQkvLyBFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBkZXNjcmlwdG9yLmVHZXQoZmVhdHVyZSk7Ci0JCQkJLy8gaWYob2JqICE9IG51bGwgJiYgb2JqICE9IGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkgJiYKLQkJCQkvLyAhaXNWYWxpZFJlZmVyZW5jZShvYmopKSB7Ci0JCQkJLy8gZGVzY3JpcHRvci5lU2V0KGZlYXR1cmUsIGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCS8vIFN5c3RlbS5vdXQKLQkJCQkvLyAucHJpbnRsbigiUHJvY2Vzc0NvbW1hbmRVdGlsLmNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcygpOgotCQkJCS8vIGNoYW5nZWQiKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZlYXR1cmVNYXA7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIGFsbCB0aGUgcmVmcmVzaGFibGUgZmVhdHVyZXMgb2YgdGhlIGdpdmVuIGRlc2NyaXB0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwCi0JICogQHBhcmFtIGV4Y2x1ZGVGZWF0dXJlcyBmZWF0dXJlcyB0byBleGNsdWRlIGZyb20gcmVmcmVzaGluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGVhckRlc2NyaXB0b3IoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJTWFwIGRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAsCi0JCQlTZXQgZXhjbHVkZUZlYXR1cmVzKSB7Ci0JCWlmIChkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwICE9IG51bGwpIHsKLQkJCS8vIG5lZWQgdG8gY2xlYXIgYWxsIHRoZSByZWZyZXNoYWJsZSBmZWF0dXJlcyBvZiB0aGUgZXhpc3RpbmcKLQkJCS8vIGRlc2NyaXB0b3IKLQkJCS8vCi0JCQlpZiAoIWRlc2NyaXB0b3JUb09sZFJlZnJlc2hhYmxlRmVhdHVyZXNNYXAuY29udGFpbnNLZXkoZGVzY3JpcHRvcikpIHsKLQkJCQlkZXNjcmlwdG9yVG9PbGRSZWZyZXNoYWJsZUZlYXR1cmVzTWFwCi0JCQkJCQkucHV0KGRlc2NyaXB0b3IsIGNsZWFyUmVmcmVzaGFibGVGZWF0dXJlcyhkZXNjcmlwdG9yLCBleGNsdWRlRmVhdHVyZXMpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZERlc2NyaXB0b3JPZihPYmplY3QgZWxlbWVudCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE9iamVjdCBkZXNjcmlwdG9yLCBib29sZWFuIGV4Y2x1ZGVTdXBwcmVzc2VkKSB7CQkKLQkJaWYoZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCURlc2NyaXB0b3IgZGVzYyA9ICAoKERlc2NyaXB0b3IpZGVzY3JpcHRvcik7Ci0JCQlpZihleGNsdWRlU3VwcHJlc3NlZCAmJiBkZXNjLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJT2JqZWN0IGVsZW1lbnRPYmogPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudChkZXNjKTsKLQkJCWVsZW1lbnRPYmogPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5yZXNvbHZlKGVsZW1lbnRPYmosIGNvbmZpZyk7Ci0JCQlyZXR1cm4gZWxlbWVudCA9PSBlbGVtZW50T2JqOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5vYmplY3Q8L2NvZGU+IGlzIGEgdmFsaWQgZGVzY3JpcHRvciBvciBkZXNjcmlwdG9yIHdyYXBwZXIgb2YgdGhlIGdpdmVuIDxjb2RlPmVsZW1lbnQ8L2NvZGU+Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWREZXNjcmlwdG9yT3JEZXNjcmlwdG9yV3JhcHBlck9mKE9iamVjdCBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCWlmKHN1cHByZXNzaW9uLmlzSW5TdXBwcmVzc2VkTGlzdCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gaXNWYWxpZERlc2NyaXB0b3JPZihlbGVtZW50LCBjb25maWcsIFRuZ1V0aWwudW53cmFwKG9iamVjdCksIGZhbHNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNWYWxpZERlc2NyaXB0b3JPZihlbGVtZW50LCBjb25maWcsIG9iamVjdCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdW5zdXBwcmVzc2VkIGRlc2NyaXB0b3IgZnJvbSBhIGRlc2NyaXB0b3IgbGlzdC4gVGhlIGRlc2NyaXB0b3IgbGlzdCBpcyB1c3VhbGx5Ci0JICogdGhlIGJyZWFrZG93biBlbGVtZW50cyBvZiBhbiBhY3Rpdml0eS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGRlc2NyaXB0b3JMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgTGlzdCBkZXNjcmlwdG9yTGlzdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3Iob2JqLCBkZXNjcmlwdG9yTGlzdCwgY29uZmlnLCB0cnVlKTsKLQl9Ci0JCi0Jc3RhdGljIE9iamVjdCBnZXREZXNjcmlwdG9yKE9iamVjdCBvYmosIExpc3QgZGVzY3JpcHRvckxpc3QsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGV4Y2x1ZGVTdXBwcmVzc2VkKSB7Ci0JCWludCBzaXplID0gZGVzY3JpcHRvckxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotCQkJLy8gaXRlcmF0ZSB0aHJ1IGxpc3QgdG8gc2VlIHdoZXRoZXIgYSB2YWxpZCBkZXNjcmlwdG9yIGxpbmtlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QKLQkJCS8vIGFscmVhZHkgZXhpc3RzCi0JCQkvLwotCQkJT2JqZWN0IG9iamVjdCA9IGRlc2NyaXB0b3JMaXN0LmdldChqKTsKLQkJCWlmKGlzVmFsaWREZXNjcmlwdG9yT2Yob2JqLCBjb25maWcsIG9iamVjdCwgZXhjbHVkZVN1cHByZXNzZWQpKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsaWQgZGVzY3JpcHRvciwgZWl0aGVyIGxvY2FsIG9yIGluaGVyaXRlZCwgb2YgdGhlIGdpdmVuIG9iamVjdCB1bmRlciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvciBnZXRWYWxpZERlc2NyaXB0b3IoT2JqZWN0IG9iaiwgQWN0aXZpdHkgYWN0aXZpdHksIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3Rpdml0eSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKGFjdGl2aXR5KS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoaXNWYWxpZERlc2NyaXB0b3JPckRlc2NyaXB0b3JXcmFwcGVyT2Yob2JqLCBjb25maWcsIFN1cHByZXNzaW9uLmdldFN1cHByZXNzaW9uKHByb2MpLCBjaGlsZCkpIHsKLQkJCQlyZXR1cm4gKERlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBsb2NhbCB1bnN1cHByZXNzZWQgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gcm9sZSwgdGFzaywgb3Igd29ya1Byb2R1Y3QuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4gVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG9iamVjdCwgb3IgbnVsbCBpZiBub3QgZXhpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVzY3JpcHRvcihPYmplY3Qgb2JqLCBBY3Rpdml0eSBhY3Rpdml0eSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0b3Iob2JqLCBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLCBjb25maWcpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgUm9sZSBEZXNjcmlwdG9ycyBmb3IgdGhlIHJlc3BvbnNpYmxlIHJvbGVzIG9mIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSB3cERlc2MKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gcm9sZURlc2NyaXB0b3JzIG5ld2x5IGNyZWF0ZWQgcm9sZSBkZXNjcmlwdG9ycyB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgbGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjLCBBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCUxpc3Q8Um9sZURlc2NyaXB0b3I+IHJvbGVEZXNjcmlwdG9ycywgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAod3BEZXNjICE9IG51bGwpIHsKLQkJCVdvcmtQcm9kdWN0IHdwID0gd3BEZXNjLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iod3ApKSB7Ci0JCQkJCXdwID0gKFdvcmtQcm9kdWN0KSBUbmdVdGlsLmdldEJhc2Uod3ApOwotCQkJCX0KLQkJCQkvLyBnZXQgcmVzcG9uc2libGUgcm9sZSBmb3Igd29yayBwcm9kdWN0Ci0JCQkJTGlzdCByb2xlcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZXMod3ApOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByb2xlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iocm9sZSkpIHsKLQkJCQkJCXJvbGUgPSAoUm9sZSkgVG5nVXRpbC5nZXRCYXNlKHJvbGUpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gaXNOZXdEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJCS8vIGNoZWNrIGZvciByb2xlZGVzY3JpcHRvciB3aGV0aGVyIGl0J3MgcHJlc2VudCBpbiBhY3Rpdml0eQotCQkJCQkvLyBicmVha2Rvd24gZWxlbWVudHMKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoCi0JCQkJCQkJcm9sZSwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBjaGVjayBmb3Igcm9sZWRlc2NyaXB0b3Igd2hldGhlciBpdCdzIHByZXNlbnQgaW4gYmFzZQotCQkJCQkJLy8gYWN0aXZpdHkuCi0JCQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgUHJvY2Vzc0NvbW1hbmRVdGlsLmdldEluaGVyaXRlZERlc2NyaXB0b3IoCi0JCQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkvLyBjaGVjayBmb3Igcm9sZWRlc2NyaXB0b3Igd2hldGhlciBpdCdzIHByZXNlbnQgaW4KLQkJCQkJCQkvLyBsaXN0IG9mIHJvbGVkZXNjcmlwdG9ycyBwYXNzZWQgaW4KLQkJCQkJCQlyb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcihyb2xlLAotCQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLCBjb25maWcpOwotCQkJCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCXJvbGVEZXNjID0gUHJvY2Vzc1V0aWwuY3JlYXRlUm9sZURlc2NyaXB0b3Iocm9sZSk7Ci0JCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQocm9sZURlc2MpOwotCQkJCQkJCQlpc05ld0Rlc2NyaXB0b3IgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWlzTmV3RGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yc1RvUmVmcmVzaCAhPSBudWxsIAotCQkJCQkJCSYmIHJvbGVEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQocm9sZURlc2MpOwotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIGZvciB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT50YXNrRGVzY3JpcHRvckZlYXR1cmU8L2NvZGU+IGJhc2VkIG9uIHRoZSBjb3JyZXNwb25kaW5nIGZlYXR1cmUKLQkgKiBpbiB0aGUgbGlua2VkIHRhc2sgb2YgdGhlIGdpdmVuIDxjb2RlPnRhc2tEZXNjcmlwdG9yPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIHRoYXQgdGhlIHRhc2sgZGVzY3JpcHRvciBpcyBsaW5rZWQgdG8KLQkgKiBAcGFyYW0gdGFza0Rlc2NyaXB0b3IgdGhlIHRhc2sgZGVzY3JpcHRvciB3aG9zZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgaW4gdGhlIGdpdmVuIDxjb2RlPnRhc2tEZXNjcmlwdG9yRmVhdHVyZTwvY29kZT4KLQkgKiAgICAgICAgd2lsbCBiZSBjb2xsZWN0ZWQKLQkgKiBAcGFyYW0gdGFza0ZlYXR1cmUgdGhlIHRhc2sgZmVhdHVyZSB0aGF0IGlzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhc2sgZGVzY3JpcHRvciBmZWF0dXJlCi0JICogQHBhcmFtIHRhc2tEZXNjcmlwdG9yRmVhdHVyZSB0aGUgZmVhdHVyZSBvZiB0YXNrIGRlc2NyaXB0b3IgdGhhdCBob2xkcyByZWZlcmVuY2VzIHRvIAotCSAqICAgICAgICB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gY29sbGVjdAotCSAqIEBwYXJhbSBhY3Rpdml0eSB0aGUgYWN0aXZpdHkgb2YgZGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gY29uZmlnIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHdwRGVzY3JpcHRvcnMKLQkgKiBAcGFyYW0gd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwCi0JICogQHBhcmFtIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwCi0JICogQHBhcmFtIGRlc2NyaXB0b3JzVG9SZWZyZXNoCi0JICogICAgICAgICAgICBvdXB1dCB0aGF0IGtlZXBzIHRoZSBkZXNjcmlwdG9yIGZlYXR1cmVzIHRoYXQgbmVlZCB0byBiZQotCSAqICAgICAgICAgICAgcmVmcmVzaGVkCi0JICogQHBhcmFtIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAKLQkgKiAgICAgICAgICAgIG91dHB1dCB0aGF0IGtlZXBzIHRoZSBjb2xsZWN0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnMoCi0JCQlUYXNrIHRhc2ssCi0JCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzY3JpcHRvciwgRVJlZmVyZW5jZSB0YXNrRmVhdHVyZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXNrRGVzY3JpcHRvckZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQWN0aXZpdHkgYWN0aXZpdHksIExpc3Qgd3BEZXNjcmlwdG9ycywKLQkJCU1hcCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsIE1hcCB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwKLQkJCVNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgTWFwIGRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApIHsKLQkJTGlzdCB3b3JrUHJvZHVjdHMgPSAoTGlzdCkgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkKLQkJCQkuZ2V0UmVmZXJlbmNlKHRhc2ssIHRhc2tGZWF0dXJlLCBjb25maWcpOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVByb2Nlc3NDb21tYW5kVXRpbC5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JzKHdvcmtQcm9kdWN0cywgbGlzdCwgYWN0aXZpdHksCi0JCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwgY29uZmlnKTsKLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJQmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZXMoZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwgdGFza0Rlc2NyaXB0b3IsCi0JCQkJCXRhc2tEZXNjcmlwdG9yRmVhdHVyZSwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3RzIGZvciB0aGUKLQkgKiBnaXZlbiBhY3Rpdml0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIHRoZW0gYWxyZWFkeQotCSAqIAotCSAqIEBwYXJhbSB3b3JrUHJvZHVjdHMKLQkgKiAgICAgICAgICAgIFdvcmtQcm9kdWN0IGxpc3QKLQkgKiBAcGFyYW0gZmVhdHVyZVZhbHVlCi0JICogICAgICAgICAgICB0YXJnZXQgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGxpc3QgZm9yIHRoZSBnaXZlbiBXb3JrUHJvZHVjdAotCSAqICAgICAgICAgICAgbGlzdAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEBwYXJhbSB3cERlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBuZXdseSBjcmVhdGVkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIChvdXRwdXQpCi0JICovCi0Jc3RhdGljIHZvaWQgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9ycyhMaXN0IHdvcmtQcm9kdWN0cywKLQkJCUxpc3QgZmVhdHVyZVZhbHVlLCBBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCB3cERlc2NyaXB0b3JzLAotCQkJTWFwIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLAotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAod29ya1Byb2R1Y3RzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gd2FzRW1wdHkgPSBmZWF0dXJlVmFsdWUuaXNFbXB0eSgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCB3b3JrUHJvZHVjdHMuc2l6ZSgpOyBqKyspIHsKLQkJCQlXb3JrUHJvZHVjdCB3cE9iaiA9IChXb3JrUHJvZHVjdCkgd29ya1Byb2R1Y3RzLmdldChqKTsKLQkJCQlpZiAod3BPYmogIT0gbnVsbCkgewotCQkJCQlpZiAoVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKHdwT2JqKSkgewotCQkJCQkJd3BPYmogPSAoV29ya1Byb2R1Y3QpIFRuZ1V0aWwuZ2V0QmFzZSh3cE9iaik7Ci0JCQkJCX0KLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldERlc2NyaXB0b3Iod3BPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkKLQkJCQkJCS8vIGdldCBpbmhlcml0ZWQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkJCQl3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwKLQkJCQkJCQkJLmdldEluaGVyaXRlZERlc2NyaXB0b3Iod3BPYmosIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJaWYgKHdwRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcih3cE9iaiwgd3BEZXNjcmlwdG9ycywgY29uZmlnKTsKLQkJCQkJCQlpZiAod3BEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJd3BEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cE9iaiwKLQkJCQkJCQkJCQljb25maWcsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCk7Ci0JCQkJCQkJCXdwRGVzY3JpcHRvcnMuYWRkKHdwRGVzYyk7Ci0JCi0JCQkJCQkJCS8vIGF1dG9tYXRpYyBhZGRpbmcgdG8gdGhlIGV4aXN0aW5nIGRlbGl2ZXJhYmxlCi0JCQkJCQkJCS8vIGRlc2NyaXB0b3IgaW4gdGhlIGFjdGl2aXR5J3Mgc2NvcGUgaWYgdGhlcmUKLQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJLy8gYW55Ci0JCQkJCQkJCS8vIHZhbGlkIG9uZS4KLQkJCQkJCQkJLy8KLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0RGVsaXZlcmFibGUoYWN0aXZpdHksIHdwT2JqKTsKLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAucHV0KHdwRGVzYywKLQkJCQkJCQkJCQkJZGVzY3JpcHRvcik7Ci0JCQkJCQkJCX0KLQkKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCkgewotCQkJCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHdwRGVzYyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKHdwT2JqIGluc3RhbmNlb2YgRGVsaXZlcmFibGUKLQkJCQkJCQkJCQkmJiB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAgIT0gbnVsbCkgewotCQkJCQkJCQkJUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZURlbGl2ZXJhYmxlUGFydHMod3BEZXNjLAotCQkJCQkJCQkJCQkoRGVsaXZlcmFibGUpIHdwT2JqLCBjb25maWcsCi0JCQkJCQkJCQkJCXdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh3YXNFbXB0eSB8fCAhZmVhdHVyZVZhbHVlLmNvbnRhaW5zKHdwRGVzYykpIHsKLQkJCQkJCWZlYXR1cmVWYWx1ZS5hZGQod3BEZXNjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YXNrIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0YXNrIHdpdGhpbiB0aGUgYWN0aXZpdHkgaWYgaXQKLQkgKiBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LCBhbmQgdXBkYXRlIHRoZSByb2xlRGVzY3JpcHRvcnMgYW5kIHdwRGVzY3JpcHRvcnMgbGlzdHMKLQkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBUYXNrIGRlc2NyaXB0b3IuIENhbGxlciBzaG91bGQgYWRkIHRoZSBuZXcgdGFzawotCSAqIGRlc2NyaXB0b3IgYW5kIHRoZSBvdGhlckRlc2NyaXB0b3JzIGludG8gdGhlIGFjdGl2aXR5J3MgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHJvbGVEZXNjcmlwdG9ycwotCSAqICAgICAgICAgICAgTGlzdCB0byBob2xkIHRoZSBjcmVhdGVkIHJvbGUgZGVzY3JpcHRvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkgKiAgICAgICAgICAgIG5ldyB0YXNrIGRlc2NyaXB0b3IsIG5vIHJvbGUgZGVzY3JpcHRvciB3aWxsIGJlIGNyZWF0ZWQgaWYKLQkgKiAgICAgICAgICAgIHJvbGVEZXNjcmlwdG9ycyBpcyBudWxsCi0JICogCi0JICogQHBhcmFtIHdwRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIExpc3QgdG8gaG9sZCB0aGUgY3JlYXRlZCB3b3JrcHJvZHVjdCBkZXNjcmlwdG9ycyBhc3NvY2lhdGVkCi0JICogICAgICAgICAgICB3aXRoIHRoaXMgbmV3IHRhc2sgZGVzY3JpcHRvciwgbm8gd29ya3Byb2R1Y3QgZGVzY3JpcHRvciB3aWxsCi0JICogICAgICAgICAgICBiZSBjcmVhdGVkIGlmIHdwRGVzY3JpcHRvcnMgaXMgbnVsbAotCSAqIAotCSAqIEBwYXJhbSB3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCAKLQkgKiAgICAgICAgICAgIE1hcCB0byBob2xkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFuZCBkZWxpdmVyYWJsZSBkZXNjcmlwdG9yIHRvIGFzc2lnbgotCSAqICAgICAgICAgICAgdGhlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIHRvCi0JICogICAgICAgICAgICAgCi0JICogQHJldHVybiBUYXNrRGVzY3JpcHRvciBvciBudWxsIGlmIHRoZSB0YXNrIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiB0YXNrCi0JICogICAgICAgICBhbHJlYWR5IGV4aXN0cywgYW5kIHVwZGF0ZWQgdGhlIHJvbGVEZXNjcmlwdG9ycyBhbmQgd3BEZXNjcmlwdG9ycwotCSAqICAgICAgICAgbGlzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKFRhc2sgdGFzaywKLQkJCUFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IHJvbGVEZXNjcmlwdG9ycywgTGlzdCB3cERlc2NyaXB0b3JzLAotCQkJTWFwIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwgTWFwIHdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLAotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoLCBNYXAgZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIHVzZUV4aXN0aW5nRGVzY3JpcHRvciwgU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJaWYgKFRuZ1V0aWwuaXNDb250cmlidXRvcih0YXNrKSkgewotCQkJdGFzayA9IChUYXNrKSBUbmdVdGlsLmdldEJhc2UodGFzayk7Ci0JCX0KLQkKLQkJLy8gY3JlYXRlIHRhc2sgZGVzY3JpcHRvciBvYmplY3QKLQkJLy8KLQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSBudWxsOwotCQlpZiAodXNlRXhpc3RpbmdEZXNjcmlwdG9yKQotCQkJdGFza0Rlc2MgPSAJKFRhc2tEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHRhc2ssIGFjdGl2aXR5LCBjb25maWcpOwotCQlib29sZWFuIGlzTmV3VGFza0Rlc2NyaXB0b3IgPSBmYWxzZTsKLQkKLQkJLy8gaWYgKCB0YXNrRGVzYyAhPSBudWxsICkKLQkJLy8gewotCQkvLyByZXR1cm4gdGFza0Rlc2M7Ci0JCS8vIH0KLQkJLy8gdGFza0Rlc2MgPSBjcmVhdGVUYXNrRGVzY3JpcHRvcih0YXNrKTsKLQkKLQkJaWYgKHRhc2tEZXNjID09IG51bGwpIHsKLQkJCXRhc2tEZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2spOwotCQkJaXNOZXdUYXNrRGVzY3JpcHRvciA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiB0YXNrRGVzYy5nZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCWRlc2NyaXB0b3JzVG9SZWZyZXNoLmFkZCh0YXNrRGVzYyk7Ci0JCQl9Ci0JCX0KLQkKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkKLQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IpIHsKLQkJCS8vIGFkZCBhbGwgdGFzayBzdGVwcyB0byBUYXNrRGVzY3JpcHRvciBzdGVwIHNlbGVjdGlvbgotCQkJLy8KLQkJCUxpc3Qgc3RlcHMgPSAoTGlzdCkgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UodGFzawotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCksIHRhc2ssIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSwgY29uZmlnKTsKLQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGRBbGwoc3RlcHMpOwotCQkJCi0JCX0KLQkKLQkJLy8gbW92ZWQgdGhpcyBjb2RlIHRvIEJTRHJvcENvbW1hbmQjZXhlY3V0ZSgpIHRvIHN1cHBvcnQgdW5kbyBhbmQKLQkJLy8gcHJvZ3Jlc3MgbW9uaXRvcgotCQkvLwotCQkvLyBlbHNlIHsKLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCS8vIE9iamVjdCBzdGVwID0gaXRlci5uZXh0KCk7Ci0JCS8vIGlmICghdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmNvbnRhaW5zKHN0ZXApKSB7Ci0JCS8vIHRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5hZGQoc3RlcCk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCi0JCWlmIChyb2xlRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJLy8gZ2V0L2NyZWF0ZSByb2xlIGRlc2NyaXB0b3IgZm9yIHByaW1hcnkgcGVyZm9ybWVycwotCQkJLy8KLQkJCUVSZWZlcmVuY2UgcmVmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCQkJTGlzdCBwcmltYXJ5UGVyZm9ybWVycyA9IHN5bmNoRmVhdHVyZXMuY29udGFpbnMocmVmKSA/IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSh0YXNrLAotCQkJCQlyZWYsIGNvbmZpZykgOiBudWxsOwotCQkJaWYgKHByaW1hcnlQZXJmb3JtZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByaW1hcnlQZXJmb3JtZXJzLnNpemUoKTsgaisrKSB7Ci0JCQkJCVJvbGUgcm9sZSA9IChSb2xlKSBwcmltYXJ5UGVyZm9ybWVycy5nZXQoaik7Ci0JCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJCS8vIGlmIChUbmdVdGlsLmlzQ29udHJpYnV0b3Iocm9sZSkpIHsKLQkJCQkJCS8vIHJvbGUgPSAoUm9sZSkgVG5nVXRpbC5nZXRCYXNlKHJvbGUpOwotCQkJCQkJLy8gfQotCQkJCi0JCQkJCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJCQkJUm9sZURlc2NyaXB0b3IgcHJpbWFyeVJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKAotCQkJCQkJCQlyb2xlLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJCWJvb2xlYW4gaXNOZXdSb2xlRGVzY3JpcHRvciA9IGZhbHNlOwotCQkJCQkJaWYgKHByaW1hcnlSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gY2hlY2sgZm9yIGluaGVyaXRlZCBkZXNjcmlwdG9yCi0JCQkJCQkJcHJpbWFyeVJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcigKLQkJCQkJCQkJCXJvbGUsIGFjdGl2aXR5LCBjb25maWcpOwotCQkJCQkJCWlmIChwcmltYXJ5Um9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCQkvLyBjaGVjayBmb3IgZGVzY3JpcHRvciBpbiBwYXNzZWQgaW4gZGVzY3JpcHRvciBsaXN0Ci0JCQkJCQkJCXByaW1hcnlSb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcihyb2xlLAotCQkJCQkJCQkJCXJvbGVEZXNjcmlwdG9ycywgY29uZmlnKTsKLQkJCQkJCQkJaWYgKHByaW1hcnlSb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkJCQlwcmltYXJ5Um9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlKTsKLQkJCQkJCQkJCWlzTmV3Um9sZURlc2NyaXB0b3IgPSB0cnVlOwotCQkJCQkJCQkJcm9sZURlc2NyaXB0b3JzLmFkZChwcmltYXJ5Um9sZURlc2MpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGRlc2NyaXB0b3JzVG9SZWZyZXNoICE9IG51bGwgJiYgIWlzTmV3Um9sZURlc2NyaXB0b3IKLQkJCQkJCQkJJiYgcHJpbWFyeVJvbGVEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKHByaW1hcnlSb2xlRGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciAmJiBpc05ld1JvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJdGFza0Rlc2MuZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5hZGQocHJpbWFyeVJvbGVEZXNjKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJQmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZShkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwLCB0YXNrRGVzYywKLQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCQkJCQkJcHJpbWFyeVJvbGVEZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkKLQkJCS8vIGdldC9jcmVhdGUgcm9sZSBkZXNjcmlwdG9ycyBmb3IgYWRkaXRpb25hbCBwZXJmb3JtaW5nIHJvbGVzCi0JCQkvLwotCQkJcmVmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwkJCQotCQkJTGlzdCBhZGRpdGlvbmFsUGVyZm9ybWVycyA9IHN5bmNoRmVhdHVyZXMuY29udGFpbnMocmVmKSA/IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZSgKLQkJCQkJdGFzaywgcmVmLCBjb25maWcpIDogbnVsbDsKLQkJCWlmIChhZGRpdGlvbmFsUGVyZm9ybWVycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhZGRpdGlvbmFsUGVyZm9ybWVycy5zaXplKCk7IGorKykgewotCQkJCQlSb2xlIHJvbGVPYmogPSAoUm9sZSkgYWRkaXRpb25hbFBlcmZvcm1lcnMuZ2V0KGopOwotCQkJCQkvLyBjaGVjayBmb3IgbG9jYWwgZGVzY3JpcHRvcgotCQkJCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYyA9IChSb2xlRGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcigKLQkJCQkJCQlyb2xlT2JqLCBhY3Rpdml0eSwgY29uZmlnKTsKLQkJCQkJYm9vbGVhbiBpc05ld1JvbGVEZXNjcmlwdG9yID0gZmFsc2U7Ci0JCQkJCWlmIChyb2xlRGVzYyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBjaGVjayBmb3IgaW5oZXJpdGVkIGRlc2NyaXB0b3IKLQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBQcm9jZXNzQ29tbWFuZFV0aWwuZ2V0SW5oZXJpdGVkRGVzY3JpcHRvcigKLQkJCQkJCQkJcm9sZU9iaiwgYWN0aXZpdHksIGNvbmZpZyk7Ci0JCQkJCQlpZiAocm9sZURlc2MgPT0gbnVsbCkgewotCQkJCQkJCXJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKHJvbGVPYmosCi0JCQkJCQkJCQlyb2xlRGVzY3JpcHRvcnMsIGNvbmZpZyk7Ci0JCQkJCQkJaWYgKHJvbGVEZXNjID09IG51bGwpIHsKLQkJCQkJCQkJcm9sZURlc2MgPSBQcm9jZXNzVXRpbC5jcmVhdGVSb2xlRGVzY3JpcHRvcihyb2xlT2JqKTsKLQkJCQkJCQkJaXNOZXdSb2xlRGVzY3JpcHRvciA9IHRydWU7Ci0JCQkJCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQocm9sZURlc2MpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCAmJiAhaXNOZXdSb2xlRGVzY3JpcHRvcgotCQkJCQkJCSYmIHJvbGVEZXNjLmdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yc1RvUmVmcmVzaC5hZGQocm9sZURlc2MpOwotCQkJCQl9Ci0JCQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yICYmIGlzTmV3Um9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCXRhc2tEZXNjLmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkKHJvbGVEZXNjKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUJhdGNoQ29tbWFuZC5hZGRGZWF0dXJlVmFsdWUoCi0JCQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXAsCi0JCQkJCQkJCXRhc2tEZXNjLAotCQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCQkJCQlyb2xlRGVzYyk7Ci0JCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCi0JCWlmICh3cERlc2NyaXB0b3JzICE9IG51bGwpIHsKLQkJCWlmICghaXNOZXdUYXNrRGVzY3JpcHRvciAmJiAhc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSkpIHsKLQkJCQl3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAgPSBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBjcmVhdGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZm9yIGlucHV0IHdvcmtwcm9kdWN0cwotCQkJLy8KLQkJCWlmIChpc05ld1Rhc2tEZXNjcmlwdG9yIHx8IHN5bmNoRmVhdHVyZXMuY29udGFpbnMoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpKSkgewotCQkJCWNvbGxlY3RXb3JrUHJvZHVjdERlc2NydGlwdG9ycyh0YXNrLCB0YXNrRGVzYywgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgY29uZmlnLCBhY3Rpdml0eSwKLQkJCQkJCXdwRGVzY3JpcHRvcnMsIHdwZFRvRGVsaXZlcmFibGVQYXJ0c01hcCwKLQkJCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCwKLQkJCQkJCWRlc2NyaXB0b3JUb05ld0ZlYXR1cmVWYWx1ZXNNYXApOwotCQkJfQotCQkJaWYgKGlzTmV3VGFza0Rlc2NyaXB0b3IgfHwgc3luY2hGZWF0dXJlcy5jb250YWlucyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSkpIHsKLQkJCQljb2xsZWN0V29ya1Byb2R1Y3REZXNjcnRpcHRvcnModGFzaywgdGFza0Rlc2MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza19PcHRpb25hbElucHV0KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCBjb25maWcsIGFjdGl2aXR5LAotCQkJCQkJd3BEZXNjcmlwdG9ycywgd3BkVG9EZWxpdmVyYWJsZVBhcnRzTWFwLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJZGVzY3JpcHRvclRvTmV3RmVhdHVyZVZhbHVlc01hcCk7Ci0JCQl9Ci0JCi0JCQkvLyBjcmVhdGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZm9yIG91dHB1dCB3b3JrcHJvZHVjdHMKLQkJCS8vCi0JCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvciB8fCBzeW5jaEZlYXR1cmVzLmNvbnRhaW5zKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCkpKSB7Ci0JCQkJY29sbGVjdFdvcmtQcm9kdWN0RGVzY3J0aXB0b3JzKHRhc2ssIHRhc2tEZXNjLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldFRhc2tfT3V0cHV0KCksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIGNvbmZpZywgYWN0aXZpdHksCi0JCQkJCQl3cERlc2NyaXB0b3JzLCB3cGRUb0RlbGl2ZXJhYmxlUGFydHNNYXAsCi0JCQkJCQl3cGRUb0RlbGl2ZXJhYmxlRGVzY3JpcHRvck1hcCwgZGVzY3JpcHRvcnNUb1JlZnJlc2gsCi0JCQkJCQlkZXNjcmlwdG9yVG9OZXdGZWF0dXJlVmFsdWVzTWFwKTsKLQkJCX0KLQkJfQotCQotCQlpZiAoaXNOZXdUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIHRhc2tEZXNjOwotCQl9Ci0JCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKFRhc2sgdGFzaykgewotCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCk7Ci0JCXRhc2tEZXNjLnNldFRhc2sodGFzayk7Ci0JCXRhc2tEZXNjLnNldE5hbWUodGFzay5nZXROYW1lKCkpOwotCQl0YXNrRGVzYy5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwKLQkJCQkuaXNCbGFuayh0YXNrLmdldFByZXNlbnRhdGlvbk5hbWUoKSkgPyB0YXNrLmdldE5hbWUoKSA6IHRhc2sKLQkJCQkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJLy8gdGFza0Rlc2Muc2V0QnJpZWZEZXNjcmlwdGlvbih0YXNrLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCXJldHVybiB0YXNrRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGRlbGl2ZXJhYmxlIHBhcnRzIGZvciB0aGUgZ2l2ZW4gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgZnJvbSB0aGUKLQkgKiBkZWxpdmVyYWJsZSB3b3JrIHByb2R1Y3RzIG9mIHRoZSBnaXZlbiBkZWxpdmVyYWJsZSBhZGQgcHV0IHRoZW0gaW4KLQkgKiA8Y29kZT53cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHdwZAotCSAqIEBwYXJhbSBkZWxpdmVyYWJsZQotCSAqIEBwYXJhbSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMKLQkgKiAgICAgICAgICAgIChvdXRwdXQpIG1hcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byBpdHMgbmV3bHkgY3JlYXRlZAotCSAqICAgICAgICAgICAgZGVsaXZlcmFibGUgcGFydHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkLAotCQkJRGVsaXZlcmFibGUgZGVsaXZlcmFibGUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoKSB7Ci0JCUlDb25maWd1cmF0aW9uQXBwbGljYXRvciBjb25maWdBcHBsaWNhdG9yID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCk7Ci0JCi0JCUxpc3QgZGVsaXZlcmVkV1BzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKGRlbGl2ZXJhYmxlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLAotCQkJCWNvbmZpZyk7Ci0JCUxpc3QgcGFydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh3cGQuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZGVsaXZlcmVkV1BzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCXBhcnRzLmFkZChQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJCQkJKFdvcmtQcm9kdWN0KSBpdGVyLm5leHQoKSwgY29uZmlnLAotCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkZWxpdmVyZWRXUHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd29ya1Byb2R1Y3QgPSAoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpOwotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBkZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZ2V0RGVzY3JpcHRvcih3b3JrUHJvZHVjdCwgd3BkLmdldERlbGl2ZXJhYmxlUGFydHMoKSwgY29uZmlnKTsKLQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCWRlc2MgPSBQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKAotCQkJCQkJCXdvcmtQcm9kdWN0LCBjb25maWcsIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggIT0gbnVsbCkgewotCQkJCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guYWRkKGRlc2MpOwotCQkJCQl9Ci0JCQkJCWlmICh3b3JrUHJvZHVjdCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCQljcmVhdGVEZWxpdmVyYWJsZVBhcnRzKGRlc2MsIChEZWxpdmVyYWJsZSkgd29ya1Byb2R1Y3QsCi0JCQkJCQkJCWNvbmZpZywgd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLCBkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcGFydHMuYWRkKGRlc2MpOwotCQkJfQotCQl9Ci0JCWlmICghcGFydHMuaXNFbXB0eSgpKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMucHV0KHdwZCwgcGFydHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHdvcmsgcHJvZHVjdAotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzCi0JICogICAgICAgICAgICAob3V0cHV0KSBtYXAgb2Ygd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gaXRzIG5ld2x5IGNyZWF0ZWQKLQkgKiAgICAgICAgICAgIGRlbGl2ZXJhYmxlIHBhcnRzCi0JICogQHJldHVybiBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHdvcmsgcHJvZHVjdCBhbHJlYWR5IGV4aXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigKLQkJCVdvcmtQcm9kdWN0IHdwLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCU1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IFByb2Nlc3NVdGlsLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3cCk7Ci0JCWlmICh3cCBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlICYmIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQljcmVhdGVEZWxpdmVyYWJsZVBhcnRzKHdwZCwgKERlbGl2ZXJhYmxlKSB3cCwgY29uZmlnLAotCQkJCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMsIG51bGwpOwotCQl9Ci0JCXJldHVybiB3cGQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGluaGVydGllZCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gcm9sZSwgdGFzayBvciB3b3JrUHJvZHVjdC4gVW5saWtlIGxvY2FsIGRlc2NyaXB0b3IsIGFuIGluaGVyaXRlZCAKLQkgKiBkZXNjcmlwdG9yIHRoYXQgaXMgZXh0ZXJuYWxseSBzdXBwcmVzc2VkIGlzIGNvbnNpZGVyZWQgdmFsaWQuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4gZGVzY3JpcHRvciBvZiB0aGUgb2JqZWN0LCBudWxsIGlmIG5vdCBleGlzdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRJbmhlcml0ZWREZXNjcmlwdG9yKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlmb3IgKFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCXZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyB8fCB2YXJpYWJpbGl0eVR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTjsKLQkJCXZhcmlhYmlsaXR5VHlwZSA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGFjdGl2aXR5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBiYXNlQWN0aXZpdHkgPSAoQWN0aXZpdHkpIGVsZW1lbnQ7Ci0JCQkJT2JqZWN0IGRlc2MgPSBnZXREZXNjcmlwdG9yKG9iaiwgYmFzZUFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCksIGNvbmZpZywgZmFsc2UpOwotCQkJCWlmKGRlc2MgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQl9Ci0JCQkJYWN0aXZpdHkgPSBiYXNlQWN0aXZpdHk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSBtYXAgb2YgdGFzayB0byBmZWF0dXJlcyB0aGF0IGNvbnRhaW4gdGhlIHdvcmsgcHJvZHVjdCAKLQkgKiAoaW5wdXQgb3Igb3V0cHV0IG9mIHRoZSB0YXNrKQotCSAqIAotCSAqIEBwYXJhbSB0YXNrcwotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gTWFwIG9mIHRhc2sgdG8gZmVhdHVyZXMgdGhhdCBjb250YWluIHRoZSB3b3JrIHByb2R1Y3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRGZWF0dXJlc01hcChMaXN0IHRhc2tzLCBXb3JrUHJvZHVjdCB3cCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTWFwIGZlYXR1cmVzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJRVJlZmVyZW5jZVtdIHRhc2tGZWF0dXJlcyA9IHsKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKQotCQl9OwotCQlmb3IgKGludCBpID0gdGFza3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVRhc2sgdGFzayA9IChUYXNrKSB0YXNrcy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHRhc2tGZWF0dXJlcy5sZW5ndGg7IGorKykgewotCQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IHRhc2tGZWF0dXJlc1tqXTsKLQkJCQlPYmplY3QgdmFsdWUgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UodGFzaywgZmVhdHVyZSwgY29uZmlnKTsKLQkJCQlpZigoZmVhdHVyZS5pc01hbnkoKSAmJiAoKExpc3QpdmFsdWUpLmNvbnRhaW5zKHdwKSkgfHwKLQkJCQkJCXZhbHVlID09IHdwKSAKLQkJCQl7Ci0JCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSAoQ29sbGVjdGlvbikgZmVhdHVyZXNNYXAuZ2V0KHRhc2spOwotCQkJCQlpZihmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCQkJCQlmZWF0dXJlc01hcC5wdXQodGFzaywgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NEZWVwQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NEZWVwQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZiZjA0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRGVlcENvcHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLk5lc3RlZENvbW1hbmRFeGNlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLQotLyoqCi0gKiBQaHlzaWNhbGx5IGNvcGllcyBhIHByb2Nlc3Mgd2l0aCBhbGwgb2YgaXRzIGRpcmVjdCBvciBpbmhlcml0ZWQgc3RydWN0dXJhbCBmZWF0dXJlcyBhbmQgcmVmZXJlbmNlcy4KLSAqIEFkZCB0aGUgbmV3bHkgY3JlYXRlZCBwcm9jZXNzIHRvIHRoZSBzcGVjaWZpZWQgcHJvY2VzcyBwYWNrYWdlLgotICogICAgCi0gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIEFjdGl2aXR5RGVlcENvcHlDb21tYW5kIHRvIHJldXNlIG1vc3Qgb2YgaXQncyBmdW5jdGlvbmFsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVlcENvcHlDb21tYW5kIGV4dGVuZHMgQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgewotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSB0YXJnZXRQYWNrYWdlOwotCXByaXZhdGUgUHJvY2Vzc0NvbXBvbmVudCB0ZW1wUGM7Ci0JcHJpdmF0ZSBTdHJpbmcgbmV3UHJvY2Vzc05hbWU7Ci0JcHJpdmF0ZSBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yIG5lc3RlZENvbW1hbmRFeGVjdXRvcjsKLQkKLQlwdWJsaWMgUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcywgU3RyaW5nIG5ld1Byb2Nlc3NOYW1lLAotCQkJQ29weUhlbHBlciBjb3B5SGVscGVyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgUHJvY2Vzc1BhY2thZ2UgdGFyZ2V0UGFja2FnZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcixJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewotCi0JCXN1cGVyKHByb2Nlc3MsIGNvcHlIZWxwZXIsIGNvbmZpZywgbnVsbCwgbW9uaXRvciwgY29uZmlndXJhdG9yKTsKLQotCQl0aGlzLm5ld1Byb2Nlc3NOYW1lID0gbmV3UHJvY2Vzc05hbWU7CQkKLQkJdGhpcy50YXJnZXRQYWNrYWdlID0gdGFyZ2V0UGFja2FnZTsKLQkJY3JlYXRldGFyZ2V0UHJvY2VzcygpOwotCQkvL1RPRE86IGRpc2FibGUgY29weWluZyBkaWFncmFtcyBmb3Igbm93Ci0JCS8vCi0vLwkJbmVzdGVkQ29tbWFuZEV4ZWN1dG9yID0gbmV3IE5lc3RlZENvbW1hbmRFeGNlY3V0b3IodGhpcyk7Ci0JfQkKLQkKLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0JCi0JCi0JcHVibGljIFByb2Nlc3MgZ2V0VGFyZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHRhcmdldFByb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzIGdldFNvdXJjZVByb2Nlc3MoKSB7Ci0JCXJldHVybiAoUHJvY2VzcykgYWN0aXZpdHk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGV0YXJnZXRQcm9jZXNzKCkgewotCQkvLyBjcmVhdGUgYSBwbGFjZWhvbGRlciBmb3IgdGhlIG5ldyBwcm9jZXNzCi0JCS8vIHNpbmNlIHRoZSBjb250ZW50IHByb2Nlc3NvciBuZWVkcyB0byBrbm93IHRoZSB0YXJldCBwcm9jZXNzIGluIG9yZGVyIHRvIGZpeCB0aGUgdXJscwotCQkKLQkJdGVtcFBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQl0YXJnZXRQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKS5hZGQodGVtcFBjKTsKLQkJCi0JCWlmICggc3VwZXIuYWN0aXZpdHkgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MgKSB7Ci0JCQl0YXJnZXRQcm9jZXNzID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRQcm9jZXNzID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsJCQkKLQkJfQotCQl0YXJnZXRQcm9jZXNzLnNldE5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQl0YXJnZXRQcm9jZXNzLnNldFByZXNlbnRhdGlvbk5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQl0ZW1wUGMuc2V0TmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0KLQkJdGVtcFBjLnNldFByb2Nlc3ModGFyZ2V0UHJvY2Vzcyk7CQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYobmVzdGVkQ29tbWFuZEV4ZWN1dG9yICE9IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRFeGVjdXRvci5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CQkJCQotCQlzdXBlci5leGVjdXRlKCk7CQotCQkJCQotCQkvLyBuZXcgY29weSBvZiB0aGUgcHJvY2VzcyBtdXN0IGJlIHNhdmVkIHNvIG90aGVyIG5lc3RlZCBjb21tYW5kcyBsaWtlIGRpYWdyYW0gY29weSBjb21tYW5kIAotCQkvLyBjYW4gYmUgZXhlY3V0ZWQuCi0JCWlmKHBrZ0NvcHkgIT0gbnVsbCAmJiBwa2dDb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzLmdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCXRyeSB7Ci0JCQkJcGVyc2lzdGVyLnNhdmUocGtnQ29weS5lUmVzb3VyY2UoKSk7Ci0JCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKG5lc3RlZENvbW1hbmRFeGVjdXRvciAhPSBudWxsKSB7Ci0JCQluZXN0ZWRDb21tYW5kRXhlY3V0b3IuZXhlY3V0ZU5lc3RlZENvbW1hbmRzKCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYobmVzdGVkQ29tbWFuZEV4ZWN1dG9yICE9IG51bGwpIHsKLQkJCW5lc3RlZENvbW1hbmRFeGVjdXRvci51bmRvTmVzdGVkQ29tbWFuZHMoKTsKLQkJfQotCQlzdXBlci51bmRvKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpeFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCS8vIHJlcGxhY2UgdGhlIHBsYWNlIGhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29waWVkIHByb2Nlc3MKLQkJaWYgKHBrZ0NvcHkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJcGtnQ29weS5zZXROYW1lKG5ld1Byb2Nlc3NOYW1lKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KXBrZ0NvcHkpLmdldFByb2Nlc3MoKTsKLQkJCXByb2Muc2V0TmFtZShuZXdQcm9jZXNzTmFtZSk7Ci0JCQlwcm9jLnNldFByZXNlbnRhdGlvbk5hbWUobmV3UHJvY2Vzc05hbWUpOwotCQkJdGFyZ2V0UHJvY2VzcyA9IHByb2M7Ci0JCQlFY29yZVV0aWwucmVwbGFjZSh0ZW1wUGMsIHBrZ0NvcHkpOwotCQl9Ci0JfQotCQotCS8qIAotCSAqIHJldHVybnMgYSBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIG5ldyBwcm9jZXNzCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2dldFJlc3VsdCgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UmVzdWx0KCkgewotCQlpZihwa2dDb3B5ICE9IG51bGwgJiYgcGtnQ29weSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCAoKFByb2Nlc3NDb21wb25lbnQpcGtnQ29weSkuZ2V0UHJvY2VzcygpKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudEFkZENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNjQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Qcm9jZXNzRWxlbWVudEFkZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAxNiwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnRBZGRDb21tYW5kIGV4dGVuZHMgTWV0aG9kRWxlbWVudEFkZENvbW1hbmQgCi1pbXBsZW1lbnRzIElSZXNvdXJjZUF3YXJlQ29tbWFuZAotewotCi0JcHVibGljIFByb2Nlc3NFbGVtZW50QWRkQ29tbWFuZChDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gZGlzYWJsZSBydW4gd2l0aCBwcm9ncmVzcyBiYXIgd2hlbiBhZGRpbmcgaW4gcHJvY2VzcyBlZGl0b3IKLQkJLy8KLQkJc3VwZXIoY29tbWFuZCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEFkZENvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcykgewotCQlzdXBlcihjb21tYW5kLCBydW5XaXRoUHJvZ3Jlc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNnZXRGZWF0dXJlc1RvQ2hlY2soKQotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldEZlYXR1cmVzVG9DaGVjaygpIHsKLQkJaWYgKGZlYXR1cmVzVG9DaGVjayA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRGZWF0dXJlc1RvQ2hlY2soKS5hZGQoCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gZmVhdHVyZXNUb0NoZWNrOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQjd2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gd2lsbFNhdmVNb2RpZmllZFJlc291cmNlcygpIHsKLQkJLy8gZG9uJ3Qgc2F2ZSB0aGUgcmVzb3VyY2VzIGFmdGVyIGVhY2ggYWRkCi0JCS8vCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQjc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCS8vIGRvbid0IHNhdmUgdGhlIHJlc291cmNlcyBhZnRlciBlYWNoIGFkZAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50QWRkQ29tbWFuZCNjcmVhdGVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHJvdGVjdGVkIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKEVPYmplY3QgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJRWRpdGluZ0RvbWFpbiBkb21haW4gPSBhZGRDb21tYW5kLmdldERvbWFpbigpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQKLQkJCQkmJiBhZGRDb21tYW5kLmdldEZlYXR1cmUoKSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UKLQkJCQkmJiBkb21haW4gaW5zdGFuY2VvZiBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIHsKLQkJCXJldHVybiBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVWYWxpZGF0b3IoYWRkQ29tbWFuZC5nZXRPd25lcigpLCBudWxsLCBlLAotCQkJCQlmZWF0dXJlLCAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKS5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlVmFsaWRhdG9yKGUsIGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1Byb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjg2NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSmFuIDI2LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kIGV4dGVuZHMKLQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgewotCXByaXZhdGUgU2V0IGNvbnRlbnRzVG9SZW1vdmU7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBlbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlczsKLQotCXByaXZhdGUgYm9vbGVhbiBvd25lZEVsZW1lbnRzSW5jbHVkZWQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBQcm9jZXNzRWxlbWVudERlbGV0ZUNvbW1hbmQoQ29tbWFuZCBjb21tYW5kLCBDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCXN1cGVyKGNvbW1hbmQsIGVsZW1lbnRzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlybVJlbW92ZVJlZnMKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKENvbW1hbmQgY29tbWFuZCwgQ29sbGVjdGlvbiBlbGVtZW50cywgYm9vbGVhbiBjb25maXJtUmVtb3ZlUmVmcykgewotCQlzdXBlcihjb21tYW5kLCBlbGVtZW50cywgY29uZmlybVJlbW92ZVJlZnMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQlpZighb3duZWRFbGVtZW50c0luY2x1ZGVkKSB7Ci0JCQlDb2xsZWN0aW9uIG93bmVkRWxlbWVudHMgPSBnZXRPd25lZEVsZW1lbnRzKGVsZW1lbnRzKTsKLQkJCWlmKCFvd25lZEVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJCWluY2x1ZGVFbGVtZW50cyhvd25lZEVsZW1lbnRzKTsKLQkJCX0KLQkJCW93bmVkRWxlbWVudHNJbmNsdWRlZCA9IHRydWU7Ci0JCX0KLQkJCi0JCXN1cGVyLmV4ZWN1dGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0T3duZWRFbGVtZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCUFycmF5TGlzdCBvd25lZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWVsZW1lbnQpOwotCQkJCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlJdGVyYXRvciBpdGVyMSA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcih3cCwgZmFsc2UpIHsKLQotCQkJCQkJLyoqCi0JCQkJCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJCQkJICovCi0JCQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MjIxODE3ODIyNjg4NzgyODlMOwotCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCXJldHVybiAoKEFydGlmYWN0KW9iamVjdCkuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9OwotCQkJCQlIYXNoU2V0IHdvcmtQcm9kdWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCXdoaWxlKGl0ZXIxLmhhc05leHQoKSkgewotCQkJCQkJd29ya1Byb2R1Y3RzLmFkZChpdGVyMS5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSh3cGQpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgYmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoYmUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkJCQkJCQkJJiYgd29ya1Byb2R1Y3RzLmNvbnRhaW5zKCgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBiZSkKLQkJCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKSkpIHsKLQkJCQkJCQlvd25lZEVsZW1lbnRzLmFkZChiZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBvd25lZEVsZW1lbnRzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4Y2x1ZGVFbGVtZW50cyhDb2xsZWN0aW9uIGV4Y2x1ZGVkRWxlbWVudHMpIHsKLQkJZWxlbWVudHMucmVtb3ZlQWxsKGV4Y2x1ZGVkRWxlbWVudHMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBleGNsdWRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVJlbW92ZUNvbW1hbmQgY21kID0gZ2V0UmVtb3ZlQ29tbWFuZChlbGVtZW50KTsKLQkJCWlmKGNtZCAhPSBudWxsKSB7Ci0JCQkJY21kLmdldENvbGxlY3Rpb24oKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5jbHVkZUVsZW1lbnRzKENvbGxlY3Rpb24gaW5jbHVkZWRFbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmNsdWRlZEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKCFlbGVtZW50cy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCWVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQlSZW1vdmVDb21tYW5kIGNtZCA9IGdldFJlbW92ZUNvbW1hbmQoZWxlbWVudCk7Ci0JCQkJaWYoY21kICE9IG51bGwpIHsKLQkJCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gY21kLmdldENvbGxlY3Rpb24oKTsKLQkJCQkJaWYoIWNvbGxlY3Rpb24uY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJCWNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0RWxlbWVudHNUb1JlbW92ZVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChlbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlFT2JqZWN0IHBrZyA9ICgoQWN0aXZpdHkpIGVsZW1lbnQpLmVDb250YWluZXIoKTsKLQkJCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCQllbGVtZW50c1RvUmVtb3ZlUmVmZXJlbmNlcy5hZGQocGtnKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzLmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNhblJlbW92ZVJlZmVyZW5jZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUmVmZXJlbmNlcygpIHsKLQkJY29udGVudHNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCS8vIGhhdmUgdG8gcmVtb3ZlIHRoZSBkZWxldGVkIHByb2Nlc3MgZWxlbWVudHMgZnJvbSBpdHMgY29udGFpbmVyCi0JCS8vIGFuZC9vciByZXNvdXJjZQotCQkvLyBzbyBzdXBlci5yZW1vdmVSZWZlcmVuY2VzKCkgY2FuIHJlbW92ZSB0aGVpciByZWZlcmVuY2VzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG9iajsKLQotCQkJCQkvLyByZW1vdmUgY29udGVudCBvZiB0aGUgYWN0aXZpdHkgZnJvbSBpdHMgcmVzb3VyY2UKLQkJCQkJLy8KLQkJCQkJLy8gcmVtb3ZlQ29udGVudEZyb21SZXNvdXJjZShhY3QsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKGFjdCkpIHsKLQkJCQkJCWNvbnRlbnRzVG9SZW1vdmUuYWRkKGFjdC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQkJCX0KLQotCQkJCQkvLyByZW1vdmUgdGhlIHByb2Nlc3MgcGFja2FnZSBvZiB0aGlzIGFjdGl2aXR5Ci0JCQkJCS8vCi0JCQkJCUVPYmplY3QgY29udGFpbmVyID0gZU9iai5lQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShjb250YWluZXIpOwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhaW5lci5lQWxsQ29udGVudHMoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQkJCWFjdCA9IChBY3Rpdml0eSkgZWxlbWVudDsKLQotCQkJCQkJCQkvLyByZW1vdmUgY29udGVudCBvZiB0aGUgYWN0aXZpdHkgZnJvbSBpdHMKLQkJCQkJCQkJLy8gcmVzb3VyY2UKLQkJCQkJCQkJLy8KLQkJCQkJCQkJLy8gcmVtb3ZlQ29udGVudEZyb21SZXNvdXJjZShhY3QsCi0JCQkJCQkJCS8vIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJCQkJaWYgKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKGFjdCkpIHsKLQkJCQkJCQkJCWNvbnRlbnRzVG9SZW1vdmUuYWRkKGFjdAotCQkJCQkJCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRWNvcmVVdGlsLnJlbW92ZSgoRU9iamVjdCkgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5yZW1vdmVSZWZlcmVuY2VzKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQjZGVsZXRlQ29udGVudCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50c1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRWNvcmVVdGlsLnJlbW92ZSgoRU9iamVjdCkgaXRlci5uZXh0KCkpOwotCQl9Ci0JCWVsZW1lbnRzVG9EZWxldGVDb250ZW50LmFkZEFsbChjb250ZW50c1RvUmVtb3ZlKTsKLQkJc3VwZXIuZGVsZXRlQ29udGVudCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5EZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCNjb2xsZWN0T2JqZWN0c1RvUmVtb3ZlKGphdmEudXRpbC5Db2xsZWN0aW9uLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbGxlY3RPYmplY3RzVG9SZW1vdmUoQ29sbGVjdGlvbiBvYmplY3RzVG9SZW1vdmUsIEVPYmplY3QgZWxlbWVudFRvRGVsZXRlLCBFT2JqZWN0IHJlZmVyZW5jZXIsIENvbGxlY3Rpb24gcmVmZXJlbmNlcykgewotCQlib29sZWFuIHJldCA9IHN1cGVyLmNvbGxlY3RPYmplY3RzVG9SZW1vdmUob2JqZWN0c1RvUmVtb3ZlLCBlbGVtZW50VG9EZWxldGUsCi0JCQkJcmVmZXJlbmNlciwgcmVmZXJlbmNlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBpdGVyLm5leHQoKTsKLQkJCWlmKHJlZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gcmVmZXJlbmNlci5lQ29udGFpbmVyKCk7Ci0JCQkJaWYoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQkJCW9iamVjdHNUb1JlbW92ZS5hZGQoY29udGFpbmVyKTsKLQkJCQkJcmV0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRXcmFwcGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGNvbnRlbnRzVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJY29udGVudHNUb1JlbW92ZS5jbGVhcigpOwotCQl9Ci0JCWlmKGVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWVsZW1lbnRzVG9SZW1vdmVSZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmQ2YzczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTm92IDMwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBUQVNLX0RFU0NSSVBUT1JfX1JFTEFUSU9OU0hJUFMgPSB7Ci0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCQkKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksCi0JCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkKLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gUk9MRV9ERVNDUklQVE9SX19SRUxBVElPTlNISVBTID0gewotCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9Bc3Npc3RzSW5fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpCi0JfTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRUxBVElPTlNISVBTID0gewotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLAotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycywKLQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzLAotCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMKLQl9OwotCQotCXByaXZhdGUgSGFzaFNldCByZW1vdmVkRGVzY3JpcHRvcnM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWJvcnRlZDsgCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQWJvcnRlZCgpIHsKLQkJcmV0dXJuIGFib3J0ZWQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UGFyZW50KERlc2NyaXB0b3Igb2JqKSB7Ci0JCS8vIEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQkvLyBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJLy8gZmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCS8vIGZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJLy8gfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJLy8gZmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyB9Ci0JCS8vCi0JCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgcHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJLy8gZmFjdG9yeS5hZGFwdChvYmosCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIE9iamVjdCBhY3QgPSBwcm92aWRlci5nZXRQYXJlbnQob2JqKTsKLQkJLy8KLQkJLy8gcmV0dXJuIGFjdDsKLQotCQlyZXR1cm4gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShvYmopOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZShPYmplY3RbXSByZWZUb2JlRGVsZXRlZCkgewotCQlpZiAocmVmVG9iZURlbGV0ZWQgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZUb2JlRGVsZXRlZC5sZW5ndGg7IGkrKykgewotCQkJCURlc2NyaXB0b3Igb2JqID0gKERlc2NyaXB0b3IpIHJlZlRvYmVEZWxldGVkW2ldOwotCQkJCS8vIGdldCBwYXJlbnQgYW5kIHJlbW92ZSByZWYgb2JqZWN0Ci0JCQkJT2JqZWN0IGFjdCA9IGdldFBhcmVudChvYmopOwotCQkJCWlmIChhY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoKChBY3Rpdml0eSkgYWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZShvYmopKSB7Ci0JCQkJCQlnZXRSZW1vdmVkRGVzY3JpcHRvcnMoKS5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlbW92ZWREZXNjcmlwdG9ycygpIHsKLQkJaWYgKHJlbW92ZWREZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlyZW1vdmVkRGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCXJldHVybiByZW1vdmVkRGVzY3JpcHRvcnM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZXBsYWNlQWN0aXZpdHlDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9SZXBsYWNlQWN0aXZpdHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiM2Y5MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUmVwbGFjZUFjdGl2aXR5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZCBleHRlbmRzIFZhcnlBY3Rpdml0eUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZUFjdGl2aXR5Q29tbWFuZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXN1cGVyKHdyYXBwZXIpOwotCQlzZXRMYWJlbChMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbFJlcGxhY2VzX3RleHQpOyAKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5WYXJ5QWN0aXZpdHlDb21tYW5kI2RvVmFyeSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9WYXJ5KCkgewotCQlQcm9jZXNzVXRpbC5yZXBsYWNlQWN0aXZpdHlMb2NhbGx5KHdyYXBwZXIsIGNyZWF0ZWRBY3Rpdml0aWVzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlQXNzb2NpYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDg2YTc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1JvbGVBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVBc3NvY2lhdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklNQVJZID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFERElUSU9OQUwgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVNTSVNURUQgPSAyOwotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQotCXByaXZhdGUgUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3I7Ci0KLQlwcml2YXRlIFRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBSb2xlRGVzY3JpcHRvciBvbGRSb2xlRGVzY3JpcHRvcjsKLQotCXB1YmxpYyBSb2xlQXNzb2NpYXRpb24oaW50IHR5cGUsIFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yLAotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5yb2xlRGVzY3JpcHRvciA9IHJvbGVEZXNjcmlwdG9yOwotCQl0aGlzLnRhc2tEZXNjcmlwdG9yID0gdGFza0Rlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGdldE9sZFJvbGVEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gb2xkUm9sZURlc2NyaXB0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2xkUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3Igb2xkUm9sZURlc2NyaXB0b3IpIHsKLQkJdGhpcy5vbGRSb2xlRGVzY3JpcHRvciA9IG9sZFJvbGVEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBSb2xlRGVzY3JpcHRvciBnZXRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBUYXNrRGVzY3JpcHRvciBnZXRUYXNrRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlVGVhbVByb2ZpbGVBc3NvY2lhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvUm9sZVRlYW1Qcm9maWxlQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5MjhmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Sb2xlVGVhbVByb2ZpbGVBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgMjksIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVUZWFtUHJvZmlsZUFzc29jaWF0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvU3luY2hyb25pemVDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5ZTUxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5CYXRjaENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIGZvciBvbmUtd2F5IHN5bmNocm9uaXphdGlvbiBmcm9tIG1ldGhvZCB0byBwcm9jZXNzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE5vdiAyMiwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVDb21tYW5kIGV4dGVuZHMgQ29tcG91bmRDb21tYW5kIGltcGxlbWVudHMKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3I7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhYm9ydGVkOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgZGVsZXRlTGlzdDsKLQotCXByb3RlY3RlZCBib29sZWFuIHByZUV4ZWNTdWNjZXNzZnVsOwotCi0JcHJvdGVjdGVkIExpc3QgZGVsZXRlQ29tbWFuZExpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdWNjZXNzZnVsOwotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByaXZhdGUgU2V0IHN5bmNoRmVhdHVyZXM7Ci0KLQlwcml2YXRlIERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCBkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQ7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGFjdGl2aXRpZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1N1Y2Nlc3NmdWxNc2cgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGludGlhbGl6ZWQ7Ci0JCi0JcHJpdmF0ZSBCYXRjaENvbW1hbmQgYmF0Y2hDb21tYW5kID0gbmV3IEJhdGNoQ29tbWFuZChmYWxzZSk7Ci0JcHJpdmF0ZSBNYXA8VmFyaWFiaWxpdHlFbGVtZW50LCBWYXJpYWJpbGl0eUVsZW1lbnQ+IHJlcGxhY2VyVG9CYXNlTWFwID0gbmV3IEhhc2hNYXA8VmFyaWFiaWxpdHlFbGVtZW50LCBWYXJpYWJpbGl0eUVsZW1lbnQ+KCk7ICAKLQotLy8JcHJpdmF0ZSBPYmplY3QgVUlDb250ZXh0OwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIFN5bmNocm9uaXplQ29tbWFuZCB0aGF0IHVzZSB0aGUgcHJvY2VzcyBkZWZhdWx0Ci0JICogY29uZmlndXJhdGlvbiB0byBzeW5jaHJvbml6ZSBhbGwgdGhlIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogICAgICAgICAgICBhIGxpc3Qgb2YgQnJlYWtkb3duRWxlbWVudCBvYmplY3RzCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplQ29tbWFuZChTdHJpbmcgbGFiZWwsIENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJc3VwZXIobGFiZWwpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBTeW5jaHJvbml6ZUNvbW1hbmQgdGhhdCB1c2UgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gCi0JICogYW5kIGxpc3Qgb2Ygc3luY2hyb25pemFibGUgZmVhdHVyZXMgdG8gc3luY2hyb25pemUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gY29uZmlnIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMgdGhlIHN5bmNocm9uaXphYmxlIGZlYXR1cmVzCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplQ29tbWFuZChDb2xsZWN0aW9uIGVsZW1lbnRzLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMsIGJvb2xlYW4gc2hvd1N1Y2Nlc3NmdWxNc2cpIHsKLQkJc3VwZXIoTGlicmFyeUVkaXRSZXNvdXJjZXMuQXV0b1N5bmNocm9uaXplQ29tbWFuZF9sYWJlbCk7IAotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCQl0aGlzLnNob3dTdWNjZXNzZnVsTXNnID0gc2hvd1N1Y2Nlc3NmdWxNc2c7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpZihjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6YXRpb25GZWF0dXJlcyhTZXQgc3luY2hGZWF0dXJlcykgewotCQl0aGlzLnN5bmNoRmVhdHVyZXMgPSBzeW5jaEZlYXR1cmVzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9Jbml0aWFsaXplKCkgewotCQljb21tYW5kTGlzdC5jbGVhcigpOwotCQkKLQkJaWYgKGVsZW1lbnRzID09IG51bGwgfHwgZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlkZWxldGVDb21tYW5kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZGVsZXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJYWRkVG9EZWxldGVMaXN0KGVsZW1lbnQsIGRlbGV0ZUxpc3QpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJZWxlbWVudHMucmVtb3ZlQWxsKGRlbGV0ZUxpc3QpOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChEZXNjcmlwdG9yKSBvYmplY3Q7Ci0JCQkJaWYgKGRlc2NyaXB0b3IuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkuYm9vbGVhblZhbHVlKCkKLQkJCQkJCSYmICFkZWxldGVMaXN0LmNvbnRhaW5zKGRlc2NyaXB0b3IpKSB7Ci0JCQkJCWlmKGRlc2NyaXB0b3IuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewkJCQkJCQotCQkJCQkJLy8gZGVzY3JpcHRvciBpcyB1c2VkIGJ5IFRlYW1Qcm9maWxlIHRvIHJlcHJlc2VudCBhIHJvbGUgb3IgdXNlZCBieSBhIGRlbGl2ZXJhYmxlIGRlc2NyaXB0b3IgdG8KLQkJCQkJCS8vIHJlcHJlc2VudCBhIGRlbGl2ZXJhYmxlIHBhcnQKLQkJCQkJCS8vCi0JCQkJCQlpZihkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yICYmICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKWRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJCQkJCWFwcGVuZChuZXcgU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZykpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYXBwZW5kKG5ldyBCYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQoZGVzY3JpcHRvciwgc3luY2hGZWF0dXJlcywgY29uZmlnKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlBY3Rpdml0eSBhY3QgPSBkZXNjcmlwdG9yLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJVGFzayB0YXNrID0gKChUYXNrRGVzY3JpcHRvcikgb2JqZWN0KS5nZXRUYXNrKCk7Ci0JCQkJCQkJaWYgKHRhc2sgIT0gbnVsbCkgewotCQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleSh0YXNrKSkgewotCQkJCQkJCQkJdGFzayA9IChUYXNrKSByZXBsYWNlclRvQmFzZU1hcC5nZXQodGFzayk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJYXBwZW5kKG5ldyBXQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJCQkJCQkJLnNpbmdsZXRvbkxpc3QodGFzayksIGNvbmZpZywgc3luY2hGZWF0dXJlcykpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBvYmplY3QpLmdldFJvbGUoKTsKLQkJCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHJvbGUpKSB7Ci0JCQkJCQkJCQlyb2xlID0gKFJvbGUpIHJlcGxhY2VyVG9CYXNlTWFwLmdldChyb2xlKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlhcHBlbmQobmV3IE9CU0Ryb3BDb21tYW5kKGFjdCwgQ29sbGVjdGlvbnMKLQkJCQkJCQkJCQkuc2luZ2xldG9uTGlzdChyb2xlKSwgY29uZmlnLCBzeW5jaEZlYXR1cmVzLCBjb25maWd1cmF0b3IpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCkKLQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCQlpZihyZXBsYWNlclRvQmFzZU1hcC5jb250YWluc0tleSh3cCkpIHsKLQkJCQkJCQkJCXdwID0gKFdvcmtQcm9kdWN0KSByZXBsYWNlclRvQmFzZU1hcC5nZXQod3ApOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWFwcGVuZChuZXcgUEJTRHJvcENvbW1hbmQoYWN0LCBDb2xsZWN0aW9ucwotCQkJCQkJCQkJCS5zaW5nbGV0b25MaXN0KHdwKSwgY29uZmlnLCBzeW5jaEZlYXR1cmVzLCBjb25maWd1cmF0b3IpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYXBwZW5kQ29tbWFuZHMoKEFjdGl2aXR5KSBvYmplY3QpOwotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWFwcGVuZENvbW1hbmRzKChUZWFtUHJvZmlsZSlvYmplY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiAhZGVsZXRlTGlzdC5pc0VtcHR5KCkgfHwgIWNvbW1hbmRMaXN0LmlzRW1wdHkoKSB8fCAhYWN0aXZpdGllcy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5pdGlsaXplKCkgewotCQlib29sZWFuIGIgPSBpc1ByZXBhcmVkOwotCQl0cnkgewotCQkJLy8gc2luY2UgRWNsaXBzZSAzLjMsIENvbXBvdW5kQ29tbWFuZC5hcHBlbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGlzUHJlcGFyZWQgaXMgYWxyZWFkeSBzZXQKLQkJCS8vIGJ1dCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgaXNQcmVwYXJlZCBpcyBzZXQgaW4gY2FuRXhlY3V0ZSgpIGFuZCBpdCBtYWtlcyBtYW55IGNhbGxzIHRvIGFwcGVuZCgpCi0JCQkvLyB3b3JrLWFyb3VuZCBpcyB0byB1bnNldCBpc1ByZXBhcmVkIGF0IGJlZ2lubmluZyBvZiB0aGlzIG1ldGhvZCBhbmQgc2V0IGl0IGJhY2sgdG8gb2xkIHZhbHVlIGF0IG1ldGhvZCBlbmQuCi0JCQkvLwotCQkJaXNQcmVwYXJlZCA9IGZhbHNlOwotCQkJcmV0dXJuIGludGlhbGl6ZWQgPSBkb0luaXRpYWxpemUoKTsJCQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaXNQcmVwYXJlZCA9IGI7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW50aWFsaXplZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW50aWFsaXplZCgpIHsKLQkJcmV0dXJuIGludGlhbGl6ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENvbW1hbmRzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUxpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgcm9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgd29ya1Byb2R1Y3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKCgoRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkJCQkJCS5ib29sZWFuVmFsdWUoKQotCQkJCQkJJiYgIWRlbGV0ZUxpc3QuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQkJVGFzayB0YXNrID0gKChUYXNrRGVzY3JpcHRvcikgZWxlbWVudCkuZ2V0VGFzaygpOwotCQkJCQkJaWYgKHRhc2sgIT0gbnVsbCkgewotCQkJCQkJCWlmKHJlcGxhY2VyVG9CYXNlTWFwLmNvbnRhaW5zS2V5KHRhc2spKSB7Ci0JCQkJCQkJCXRhc2sgPSAoVGFzaykgcmVwbGFjZXJUb0Jhc2VNYXAuZ2V0KHRhc2spOwotCQkJCQkJCX0KLQkJCQkJCQl0YXNrcy5hZGQodGFzayk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCQlSb2xlIHJvbGUgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkocm9sZSkpIHsKLQkJCQkJCQkJcm9sZSA9IChSb2xlKSByZXBsYWNlclRvQmFzZU1hcC5nZXQocm9sZSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJvbGVzLmFkZChyb2xlKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCQlXb3JrUHJvZHVjdCB3cCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KQotCQkJCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYocmVwbGFjZXJUb0Jhc2VNYXAuY29udGFpbnNLZXkod3ApKSB7Ci0JCQkJCQkJCXdwID0gKFdvcmtQcm9kdWN0KSByZXBsYWNlclRvQmFzZU1hcC5nZXQod3ApOwotCQkJCQkJCX0KLQkJCQkJCQl3b3JrUHJvZHVjdHMuYWRkKHdwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWFwcGVuZENvbW1hbmRzKChUZWFtUHJvZmlsZSllbGVtZW50KTsKLQkJCX0KLQkJfQotCQlpZiAoIXRhc2tzLmlzRW1wdHkoKSkgewotCQkJYXBwZW5kKG5ldyBXQlNEcm9wQ29tbWFuZChhY3Rpdml0eSwgdGFza3MsIGNvbmZpZywgc3luY2hGZWF0dXJlcykpOwotCQl9Ci0JCWlmICghcm9sZXMuaXNFbXB0eSgpKSB7Ci0JCQlhcHBlbmQobmV3IE9CU0Ryb3BDb21tYW5kKGFjdGl2aXR5LCByb2xlcywgY29uZmlnLCBzeW5jaEZlYXR1cmVzLCBjb25maWd1cmF0b3IpKTsKLQkJfQotCQlpZiAoIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCkpIHsKLQkJCWFwcGVuZChuZXcgUEJTRHJvcENvbW1hbmQoYWN0aXZpdHksIHdvcmtQcm9kdWN0cywgY29uZmlnLAotCQkJCQlzeW5jaEZlYXR1cmVzLCBjb25maWd1cmF0b3IpKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYXBwZW5kQ29tbWFuZHMoKEFjdGl2aXR5KSBpdGVyLm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENvbW1hbmRzKFRlYW1Qcm9maWxlIHRlYW0pIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcih0ZWFtLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIAotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCQlUZWFtUHJvZmlsZSB0ZWFtID0gKChUZWFtUHJvZmlsZSlvYmplY3QpOwotCQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCh0ZWFtLmdldFN1YlRlYW0oKSk7Ci0JCQkJCWNoaWxkcmVuLmFkZEFsbCh0ZWFtLmdldFRlYW1Sb2xlcygpKTsKLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9OwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCi0JCQkvLyBzeW5jaCBvbmx5IG93biByb2xlIGRlc2NyaXB0b3Igb2YgdGVhbSBwcm9maWxlCi0JCQkvLwotCQkJaWYob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgJiYgKChSb2xlRGVzY3JpcHRvcilvYmopLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQlhcHBlbmQobmV3IEJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCgoRGVzY3JpcHRvcikgb2JqLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJSGFzaFNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCi0JCQlPYmplY3QgY21kID0gaXRlci5uZXh0KCk7Ci0JCQlpZihjbWQgaW5zdGFuY2VvZiBJUmVzb3VyY2VBd2FyZUNvbW1hbmQpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGRBbGwoKChJUmVzb3VyY2VBd2FyZUNvbW1hbmQpY21kKS5nZXRNb2RpZmllZFJlc291cmNlcygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgc2V0VUlDb250ZXh0KE9iamVjdCBVSUNvbnRleHQpIHsKLS8vCQl0aGlzLlVJQ29udGV4dCA9IFVJQ29udGV4dDsKLS8vCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyBkZWxldGUgYWxsIGRlc2NyaXB0b3JzIHdob3NlIGxpbmtlZCBlbGVtZW50IGFyZSBubyBsb25nZXIgaW4gdGhlCi0JCS8vIGNvbmZpZ3VyYXRpb24KLQkJLy8KLQkJaWYgKCFkZWxldGVMaXN0LmlzRW1wdHkoKSkgewotCQkJQ29tbWFuZCBjbWQgPSBkZWxldGUoZGVsZXRlTGlzdCk7Ci0JCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCQlkZWxldGVDb21tYW5kTGlzdC5hZGQoY21kKTsKLQkJCX0KLQkJfQotCQkKLQkJYmF0Y2hDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCi0JCWlmICghYWJvcnRlZCkgewotLy8JCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotLy8KLS8vCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0vLwkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0vLwkJCQkJcHJlRXhlY1N1Y2Nlc3NmdWwgPSBwcmVFeGVjdXRlKCk7Ci0vLwkJCQl9Ci0vLwotLy8JCQl9OwotLy8JCQkJCQkKLS8vCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgZmFsc2UsIG51bGwpOwotLy8KLS8vCQkJaWYgKHByZUV4ZWNTdWNjZXNzZnVsKSB7Ci0vLwkJCQl0cnkgewotLy8JCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQkJCQotLy8JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJCQlzdXBlclJlZG8oKTsKLS8vCQkJCQkJCXN1Y2Nlc3NmdWwgPSB0cnVlOwotLy8JCQkJCQl9Ci0vLwkJCQkJCQotLy8JCQkJCX0pOwotLy8JCQkJfQotLy8JCQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcihnZXRMYWJlbCgpLCBlLnRvU3RyaW5nKCkpOwotLy8JCQkJfQotLy8JCQl9Ci0JCQkKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlwcmVFeGVjU3VjY2Vzc2Z1bCA9IHByZUV4ZWN1dGUoKTsKLQkJCQkJaWYocHJlRXhlY3V0ZSgpKSB7Ci0JCQkJCQlzdXBlclJlZG8oKTsKLQkJCQkJCXN1Y2Nlc3NmdWwgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9OwotCQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bkluVUkocnVubmFibGUsIGdldExhYmVsKCkpOwotCQkJCi0JCQlpZiAoc3VjY2Vzc2Z1bCkgewkJCQkKLQkJCQlpZighYWN0aXZpdGllcy5pc0VtcHR5KCkpIHsKLQkJCQkJaWYoZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kID09IG51bGwpIHsKLQkJCQkJCWRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCA9IG5ldyBEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoZWxlbWVudHMsIHRydWUsIGRlbGV0ZUxpc3QpIHsKLQkJCQkJCQkKLQkJCQkJCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCQkJCQlyZXR1cm4gU3luY2hyb25pemVDb21tYW5kLnRoaXMuZGVsZXRlKGVsZW1lbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQl9OwotCQkJCQkJZGVsZXRlQ29tbWFuZExpc3QuYWRkKGRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCk7Ci0JCQkJCX0KLQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKHNob3dTdWNjZXNzZnVsTXNnKSB7Ci0JCQkJCWlmKCFyZXBsYWNlclRvQmFzZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCXJlZnJlc2hWaWV3ZXIoKTsKLQkJCQkJfQotCQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd0luZm8oCi0JCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5TeW5jaHJvbml6ZUNvbXBsZXRlRGlhbG9nX1RpdGxlLAotCQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuQXV0b1N5bmNocm9uaXplQ29tbWFuZF9zdWNlc3NmdWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VyKCkgewotCQlpZihlbGVtZW50cy5pc0VtcHR5KCkpICByZXR1cm47Ci0JCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlbGVtZW50cy5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWlmKHByb2MgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBUbmdBZGFwdGVyRmFjdG9yeS5wcm9jZXNzQWRhcHRlckZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkucHJvY2Vzc0FkYXB0ZXJGYWN0b3JpZXNbaV07Ci0JCQkJUHJvY2Vzc1V0aWwucmVmcmVzaFZpZXdlcihhZGFwdGVyRmFjdG9yeSwgcHJvYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3VwZXJSZWRvKCkgewotCQlzdXBlci5yZWRvKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Vzc2Z1bCgpIHsKLQkJcmV0dXJuIHN1Y2Nlc3NmdWw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3IgY29tbWFuZHMgPSBjb21tYW5kTGlzdC5saXN0SXRlcmF0b3IoKTsgY29tbWFuZHMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNvbW1hbmQgPSBjb21tYW5kcy5uZXh0KCk7Ci0JCQlpZihjb21tYW5kIGluc3RhbmNlb2YgQlNEcm9wQ29tbWFuZCAmJiAhKChCU0Ryb3BDb21tYW5kKWNvbW1hbmQpLnByZUV4ZWN1dGUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gYmUgcG9saXRlIHRvIG90aGVyIHRocmVhZHMgKG5vIGVmZmVjdCBvbiBzb21lIHBsYXRmb3JtcykKLQkJCS8vCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcmV0dXJuIHRoZSBleGVjdXRlZCBjb21tYW5kIHRoYXQgZGVsZXRlZCB0aGUgZ2l2ZW4gZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQlFZGl0aW5nRG9tYWluIGRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQluZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JCUNvbW1hbmQgY21kID0gbmV3IFByb2Nlc3NFbGVtZW50RGVsZXRlQ29tbWFuZChSZW1vdmVDb21tYW5kLmNyZWF0ZShkb21haW4sCi0JCQkJZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0JCWNtZC5leGVjdXRlKCk7Ci0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGdldENvbmZpZ3VyYXRvcigpIHsKLQkJaWYgKGNvbmZpZ3VyYXRvciA9PSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHRoaXMuY29uZmlnOwotCQkJaWYoY29uZmlnID09IG51bGwpIHsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnRzCi0JCQkJCQkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJCWNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJCX0KLQkJCWNvbmZpZ3VyYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0b3JGYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUNvbmZpZ3VyYXRvcihjb25maWcpOwotCQl9Ci0JCXJldHVybiBjb25maWd1cmF0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZGVsZXRlTGlzdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUb0RlbGV0ZUxpc3QoT2JqZWN0IGVsZW1lbnQsIExpc3QgZGVsZXRlTGlzdCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCWlmICghZ2V0Q29uZmlndXJhdG9yKCkuYWNjZXB0KGVsZW1lbnQpKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwkJCQkKLQkJCQlpZihsaW5rZWRFbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmIFRuZ1V0aWwuaXNSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KSBsaW5rZWRFbGVtZW50KSkgewotCQkJCQkvLyBpZiB0aGUgbGlua2VkIGVsZW1lbnQgb2YgdGhlIGRlc2NyaXB0b3IgaXMgYSByZXBsYWNlciwgZGVsZXRlIHRoZSBkZXNjcmlwdG9yIGluIHRoaXMgc3luY2hyb25pemF0aW9uCi0JCQkJCS8vIG9ubHkgaWYgdGhlIGJhc2Ugb2YgbGlua2VkIGVsZW1lbnQgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQkJCS8vCi0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpbGlua2VkRWxlbWVudCkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQl3aGlsZShiYXNlICE9IG51bGwgJiYgVG5nVXRpbC5pc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihiYXNlKSkgewotCQkJCQkJYmFzZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmKGJhc2UgIT0gbnVsbCkgewotCQkJCQkJaWYoIWdldENvbmZpZ3VyYXRvcigpLmFjY2VwdChiYXNlKSkgewotCQkJCQkJCWRlbGV0ZUxpc3QuYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJYmF0Y2hDb21tYW5kLmFkZEZlYXR1cmVWYWx1ZSgoRU9iamVjdCkgZWxlbWVudCwgCi0JCQkJCQkJCQlQcm9jZXNzVXRpbC5nZXRMaW5rUmVmZXJlbmNlKChEZXNjcmlwdG9yKSBlbGVtZW50KSwgYmFzZSk7Ci0JCQkJCQkJcmVwbGFjZXJUb0Jhc2VNYXAucHV0KChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpbmtlZEVsZW1lbnQsIGJhc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWxldGVMaXN0LmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKEFjdGl2aXR5KSBlbGVtZW50KS5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhZGRUb0RlbGV0ZUxpc3QoaXRlci5uZXh0KCksIGRlbGV0ZUxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN1cGVyVW5kbygpIHsKLQkJc3VwZXIudW5kbygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCN1bmRvKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5ydW5XaXRoQnVzeUluZGljYXRvcihuZXcgUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWRlbGV0ZUNvbW1hbmRMaXN0LmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKExpc3RJdGVyYXRvciBjb21tYW5kcyA9IGRlbGV0ZUNvbW1hbmRMaXN0Ci0JCQkJCQkJLmxpc3RJdGVyYXRvcihkZWxldGVDb21tYW5kTGlzdC5zaXplKCkpOyBjb21tYW5kcwotCQkJCQkJCS5oYXNQcmV2aW91cygpOykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZHMucHJldmlvdXMoKTsKLQkJCQkJCQljb21tYW5kLnVuZG8oKTsKLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCQkJLy8gU2tpcCBvdmVyIHRoZSBjb21tYW5kIHRoYXQgdGhyZXcgdGhlIGV4Y2VwdGlvbi4KLQkJCQkJCQkvLwotCQkJCQkJCWNvbW1hbmRzLm5leHQoKTsKLQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCS8vIEl0ZXJhdGUgZm9yd2FyZCBvdmVyIHRoZSB1bmRvbmUgY29tbWFuZHMgdG8KLQkJCQkJCQkJLy8gcmVkbyB0aGVtLgotCQkJCQkJCQkvLwotCQkJCQkJCQl3aGlsZSAoY29tbWFuZHMuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCQlDb21tYW5kIGNvbW1hbmQgPSAoQ29tbWFuZCkgY29tbWFuZHMubmV4dCgpOwotCQkJCQkJCQkJY29tbWFuZC5yZWRvKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIG5lc3RlZEV4Y2VwdGlvbikgewotCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkubG9nKG5ldyBXcmFwcGVkRXhjZXB0aW9uKAotCQkJCQkJCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9JZ25vcmVFeGNlcHRpb25fZXhjZXB0aW9uIiksIG5lc3RlZEV4Y2VwdGlvbikuZmlsbEluU3RhY2tUcmFjZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQotCQkJCQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCXN1cGVyVW5kbygpOwotCQkJCQotCQkJCWJhdGNoQ29tbWFuZC51bmRvKCk7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmKGFjdGl2aXRpZXMgIT0gbnVsbCkgewotCQkJYWN0aXZpdGllcy5jbGVhcigpOwotCQl9Ci0JCWlmKGRlbGV0ZUNvbW1hbmRMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlbGV0ZUNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIGl0ZXIubmV4dCgpOwotCQkJCWNtZC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJaWYoZGVsZXRlTGlzdCAhPSBudWxsKSB7Ci0JCQlkZWxldGVMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9TeW5jaHJvbml6ZURlbGl2ZXJhYmxlRGVzY3JpcHRvckNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc1ZTdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1N5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIHN5bmNocm9uaXplIGF0dHJpYnV0ZXMgYW5kIGRlbGl2ZXJhYmxlIHBhcnRzIG9mIGEgZGVsaXZlcmFibGUgZGVzY3JpcHRvcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEZlYiA5LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVEZWxpdmVyYWJsZURlc2NyaXB0b3JDb21tYW5kIGV4dGVuZHMKLQkJQmFzaWNTeW5jaHJvbml6ZURlc2NyaXB0b3JDb21tYW5kIHsKLQkKLQlwcml2YXRlIFNldCBkZXNjcmlwdG9yc1RvUmVmcmVzaDsKLQlwcml2YXRlIE1hcCB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHM7Ci0JcHJpdmF0ZSBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kICB1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kOwotCQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIHN5bmNoRmVhdHVyZXMKLQkgKiBAcGFyYW0gY29uZmlnCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplRGVsaXZlcmFibGVEZXNjcmlwdG9yQ29tbWFuZChXb3JrUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLQkJCVNldCBzeW5jaEZlYXR1cmVzLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcihkZXNjcmlwdG9yLCBzeW5jaEZlYXR1cmVzLCBjb25maWcpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJhc2ljU3luY2hyb25pemVEZXNjcmlwdG9yQ29tbWFuZCNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkvLyB1cGRhdGUgbGlua2VkIGVsZW1lbnQgaWYgbmVlZGVkCi0JCS8vIHN5bmNocm9uaXplIGF0dHJpYnV0ZXMKLQkJLy8KLQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkKLQkJaWYoZGVzY3JpcHRvcnNUb1JlZnJlc2ggPT0gbnVsbCkgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2ggPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZGVzY3JpcHRvcnNUb1JlZnJlc2guY2xlYXIoKTsKLQkJfQotCQlpZih3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPT0gbnVsbCkgewotCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQllbHNlIHsKLQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5jbGVhcigpOwotCQl9Ci0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yOwotCQlQcm9jZXNzQ29tbWFuZFV0aWwuY3JlYXRlRGVsaXZlcmFibGVQYXJ0cyh3cGQsIChEZWxpdmVyYWJsZSl3cGQuZ2V0V29ya1Byb2R1Y3QoKSwgY29uZmlnLAotCQkJCXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cywgZGVzY3JpcHRvcnNUb1JlZnJlc2gpOwotCQkKLQkJaWYoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkgfHwgIWRlc2NyaXB0b3JzVG9SZWZyZXNoLmlzRW1wdHkoKSkgewotCQkJaWYodXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCA9PSBudWxsKSB7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCA9IG5ldyBEZXNjcmlwdG9yVXBkYXRlQmF0Y2hDb21tYW5kKHRydWUsIHN5bmNoRmVhdHVyZXMsIGNvbmZpZyk7Ci0JCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5zZXREZXNjcmlwdG9yc1RvUmVmcmVzaChkZXNjcmlwdG9yc1RvUmVmcmVzaCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLmNsZWFyKCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCB3cERlc2MgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLnB1dCh3cERlc2MsIAotCQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksIGVudHJ5LmdldFZhbHVlKCkpKTsKLQkJCX0KLQkJCQotCQkJdXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZC5leGVjdXRlKCk7Ci0JCX0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CYXNpY1N5bmNocm9uaXplRGVzY3JpcHRvckNvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJaWYodXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLnVuZG8oKTsKLQkJfQotCQkKLQkJc3VwZXIudW5kbygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CQkKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQkKLQkJaWYodXBkYXRlRGVsaXZlcmFibGVQYXJ0c0NtZCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVEZWxpdmVyYWJsZVBhcnRzQ21kLmRpc3Bvc2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9VcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc4MzUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1VwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBGZWIgMTAsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCB7Ci0KLQlwcml2YXRlIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCXByaXZhdGUgQ29sbGVjdGlvbiBlbGVtZW50czsKLQlwcml2YXRlIEhhc2hTZXQgaW5oZXJpdGVkRWxlbWVudHM7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIENvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzOwotCXByaXZhdGUgSGFzaE1hcCBvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZUNvbW1hbmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxhYmVsCi0JICovCi0JcHVibGljIFVwZGF0ZVN1cHByZXNzaW9uRnJvbUJhc2VDb21tYW5kKFN0cmluZyBsYWJlbCwgQ29sbGVjdGlvbiBlbGVtZW50cywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCXRoaXMuc3VwcHJlc3Npb24gPSBzdXBwcmVzc2lvbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihhZmZlY3RlZE9iamVjdHMgIT0gbnVsbCkgewotCQkJYWZmZWN0ZWRPYmplY3RzLmNsZWFyKCk7Ci0JCQlhZmZlY3RlZE9iamVjdHMgPSBudWxsOwotCQl9Ci0JCQotCQlpZihpbmhlcml0ZWRFbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlpbmhlcml0ZWRFbGVtZW50cy5jbGVhcigpOwotCQkJaW5oZXJpdGVkRWxlbWVudHMgPSBudWxsOwotCQl9Ci0JCQotCQlpZihvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgIT0gbnVsbCkgewotCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLmNsZWFyKCk7Ci0JCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAgPSBudWxsOwotCQl9Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZCNnZXRNb2RpZmllZFJlc291cmNlcygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gc3VwcHJlc3Npb24uZ2V0UHJvY2VzcygpLmVSZXNvdXJjZSgpOwotCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZXNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZihhZmZlY3RlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIHN1cGVyLmdldEFmZmVjdGVkT2JqZWN0cygpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGFmZmVjdGVkT2JqZWN0czsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWlmKGFmZmVjdGVkT2JqZWN0cyA9PSBudWxsKSB7Ci0JCQlhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZmZlY3RlZE9iamVjdHMuY2xlYXIoKTsKLQkJfQotCQkKLQkJaWYob2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwID09IG51bGwpIHsKLQkJCW9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAuY2xlYXIoKTsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0SW5oZXJpdGVkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpOwotCQkJYm9vbGVhbiB3YXNTdXBwcmVzc2VkID0gc3VwcHJlc3Npb24uaXNJblN1cHByZXNzZWRMaXN0KHdyYXBwZXIpOwotCQkJaWYoc3VwcHJlc3Npb24udXBkYXRlU3VwcHJlc3Npb25Gcm9tQmFzZSh3cmFwcGVyKSkgewotCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQod3JhcHBlcik7Ci0JCQkJb2JqZWN0VG9TdXBwcmVzc2lvblN0YXRlTWFwLnB1dCh3cmFwcGVyLCBCb29sZWFuLnZhbHVlT2Yod2FzU3VwcHJlc3NlZCkpOwotCQkJfQkJCQkJCQkJCQkKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZG8oKSB7CQkKLQkJZXhlY3V0ZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3VuZG8oKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCWlmKG9iamVjdFRvU3VwcHJlc3Npb25TdGF0ZU1hcCAhPSBudWxsICYmICFvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RUb1N1cHByZXNzaW9uU3RhdGVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQlCb29sZWFuIHN1cHByZXNzZWQgPSAoQm9vbGVhbikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZihzdXBwcmVzc2VkLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXN1cHByZXNzaW9uLnN1cHByZXNzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZW50cnkuZ2V0S2V5KCkpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN1cHByZXNzaW9uLnJldmVhbChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVudHJ5LmdldEtleSgpKSk7Ci0JCQkJfQotCQkJfQotCQkJYWZmZWN0ZWRPYmplY3RzLmNsZWFyKCk7Ci0JCQlhZmZlY3RlZE9iamVjdHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRJbmhlcml0ZWRFbGVtZW50cygpIHsKLQkJaWYoaW5oZXJpdGVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJaW5oZXJpdGVkRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIHRyZWVJdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LCBlbGVtZW50KTsgdHJlZUl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZSA9IHRyZWVJdGVyLm5leHQoKTsKLQkJCQkJaWYoUHJvY2Vzc1V0aWwuaXNJbmhlcml0ZWQoZSkpIHsKLQkJCQkJCWluaGVyaXRlZEVsZW1lbnRzLmFkZChlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5oZXJpdGVkRWxlbWVudHM7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1ZhcnlBY3Rpdml0eUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1ZhcnlBY3Rpdml0eUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0M2JlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9WYXJ5QWN0aXZpdHlDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb21tYW5kTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhcnlBY3Rpdml0eUNvbW1hbmQgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cwotCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXI7Ci0KLQlwcml2YXRlIFByb2Nlc3MgcHJvYzsKLQotCXByb3RlY3RlZCBMaXN0IGNyZWF0ZWRBY3Rpdml0aWVzOwotCQotCXB1YmxpYyBBY3Rpdml0eSBzdXBlckFjdGl2aXR5OwotCi0JcHVibGljIFZhcnlBY3Rpdml0eUNvbW1hbmQoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQl0aGlzLndyYXBwZXIgPSB3cmFwcGVyOwotCQlwcm9jID0gKFByb2Nlc3MpIHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCX0KLQotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBnZXRXcmFwcGVyKCkgewotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJaWYgKHByb2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJvYy5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJaWYgKGNyZWF0ZWRBY3Rpdml0aWVzID09IG51bGwpIHsKLQkJCWNyZWF0ZWRBY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9IGVsc2UgewotCQkJY3JlYXRlZEFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJfQotCi0JCWRvVmFyeSgpOwotCi0JCUxpc3QgbGlzdGVuZXJzID0gUHJvdmlkZXJzCi0JCQkJLmdldENvbW1hbmRMaXN0ZW5lcnMoVmFyeUFjdGl2aXR5Q29tbWFuZC5jbGFzcyk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIubm90aWZ5RXhlY3V0ZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1ZhcnkoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy8gZmluZCB0aGUgbmV3IHdyYXBwZXIKLQkJLy8KLQkJT2JqZWN0IG93bmVyID0gd3JhcHBlci5nZXRPd25lcigpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXAgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB3cmFwcGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQob3duZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGlwLmdldENoaWxkcmVuKG93bmVyKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGl0ZXIubmV4dCgpOwkJCi0JCQlpZihjaGlsZCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmCi0JCQkJCSgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpY2hpbGQpLmdldFZhbHVlKCkgPT0gd3JhcHBlci5nZXRWYWx1ZSgpKSB7Ci0JCQkJd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCWV4ZWN1dGUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJTGlzdCBsaXN0ZW5lcnMgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29tbWFuZExpc3RlbmVycyhWYXJ5QWN0aXZpdHlDb21tYW5kLmNsYXNzKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUNvbW1hbmRMaXN0ZW5lciBsaXN0ZW5lciA9IChJQ29tbWFuZExpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCQlsaXN0ZW5lci5wcmVVbmRvKHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjcmVhdGVkQWN0aXZpdGllcy5pc0VtcHR5KCkpIHsKLQkJCXJlc3RvcmVPcmRlcigpOwotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBjcmVhdGVkQWN0aXZpdGllcy5nZXQoMCk7Ci0JCQlzdXBlckFjdGl2aXR5ID0gYWN0LmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJYWN0LnNldFN1cGVyQWN0aXZpdGllcyhudWxsKTsKLQkJCWNyZWF0ZWRBY3Rpdml0aWVzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUlDb21tYW5kTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUNvbW1hbmRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIucG9zdFVuZG8odGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgb3JkZXIgb2YgdGhlIHNpYmxpbmdzIG9mIHRoZSB3cmFwcGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZU9yZGVyKCkgewotCQlBY3Rpdml0eSB2YXJpZWRBY3QgPSAoQWN0aXZpdHkpIGNyZWF0ZWRBY3Rpdml0aWVzLmdldChjcmVhdGVkQWN0aXZpdGllcy5zaXplKCkgLSAxKTsKLQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJQnJlYWtkb3duRWxlbWVudCBwcmV2ID0gdmFyaWVkQWN0LmdldFByZXNlbnRlZEJlZm9yZSgpOwotCQlpZihwcmV2ICE9IG51bGwgJiYgcHJvYyA9PSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MocHJldikpIHsKLQkJCXByZXYuc2V0UHJlc2VudGVkQWZ0ZXIoYmUpOwotCQl9Ci0JCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9IHZhcmllZEFjdC5nZXRQcmVzZW50ZWRBZnRlcigpOwotCQlpZihuZXh0ICE9IG51bGwgJiYgcHJvYyA9PSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MobmV4dCkpIHsKLQkJCW5leHQuc2V0UHJlc2VudGVkQmVmb3JlKGJlKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCNnZXRSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIGNyZWF0ZWRBY3Rpdml0aWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0RyYWdBbmREcm9wQ29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDc4Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJhZ0FuZERyb3BDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci0KLS8qKgotICogRHJhZyBhbmQgZHJvcCBjb21tYW5kIHRvIGRyb3AgdGFza3MgaW4gV0JTIHN0cnVjdHVyZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgV0JTRHJhZ0FuZERyb3BDb21tYW5kIGV4dGVuZHMgQlNEcmFnQW5kRHJvcENvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBvcGVyYXRpb25zCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uCi0JICovCi0JcHVibGljIFdCU0RyYWdBbmREcm9wQ29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwgT2JqZWN0IG93bmVyLAotCQkJZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcmFnQW5kRHJvcENvbW1hbmQjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXQlNEcmFnQW5kRHJvcENvbW1hbmQuYWNjZXB0KCk6IG9iaj0iK29iaik7Ci0KLQkJaWYob2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJaWYob3duZXIgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiB0cnVlOwotLy8JCQkJcmV0dXJuIFByb2Nlc3NDb21tYW5kVXRpbC5nZXRWYWxpZERlc2NyaXB0b3Iob2JqLCAoQWN0aXZpdHkpIG93bmVyLAotLy8JCQkJCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbilkb21haW4pLmdldEFkYXB0ZXJGYWN0b3J5KCkpID09IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJhZ0FuZERyb3BDb21tYW5kI2NyZWF0ZURyb3BDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLnV0aWwuTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVEcm9wQ29tbWFuZChPYmplY3Qgb3duZXIsIExpc3QgZHJvcFNyYykgewotCQlyZXR1cm4gbmV3IFdCU0Ryb3BDb21tYW5kKChBY3Rpdml0eSkgb3duZXIsIGRyb3BTcmMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJvcENvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb21tYW5kL1dCU0Ryb3BDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMjc1ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV0JTRHJvcENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlVuaXF1ZU5hbWVQTmFtZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLQotLyoqCi0gKiBDb21tYW5kIHRvIGRyYXAgYW5kIGRyb3AgdGFza3Mgb250byBhbiBhY3Rpdml0eSBpbiB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTRHJvcENvbW1hbmQgZXh0ZW5kcyBCU0Ryb3BDb21tYW5kIHsKLQlwcml2YXRlIEFycmF5TGlzdCByb2xlRGVzY0xpc3Q7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCB3cERlc2NMaXN0OwotCi0JcHJpdmF0ZSBIYXNoTWFwIHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0czsKLQotCXByaXZhdGUgSGFzaE1hcDxXb3JrUHJvZHVjdERlc2NyaXB0b3IsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXA7Ci0KLQlwcml2YXRlIEhhc2hNYXA8Um9sZURlc2NyaXB0b3IsIFRlYW1Qcm9maWxlPiByb2xlRGVzY1RlYW1Qcm9maWxlTWFwOwotCQotCXByaXZhdGUgSUV4ZWN1dG9yIGV4ZWN1dG9yOwotCi0JcHJpdmF0ZSBjbGFzcyBFeGVjdXRvciBpbXBsZW1lbnRzIElFeGVjdXRvciB7Ci0KLQkJcHVibGljIGJvb2xlYW4gcHJlRXhlY3V0ZSgpIHsKLQkJCXRhc2tEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJvbGVEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdwRGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMgPSBuZXcgSGFzaE1hcCgpOwotCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJU2V0IGRlc2NyaXB0b3JzVG9SZWZyZXNoID0gc3luY2hyb25pemUgPyBiYXRjaENvbW1hbmQuZ2V0RGVzY3JpcHRvcnNUb1JlZnJlc2goKSA6IG51bGw7Ci0KLQkJCUxpc3QgYmVzID0gYWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCVVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIgdW5pcXVlTmFtZXNIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVQTmFtZUhhbmRsZXIoYmVzKTsKLQkJCQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcm9wRWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgZHJvcEVsZW1lbnRzLmdldChpKTsKLQkJCQlUYXNrRGVzY3JpcHRvciBkZXNjID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKHRhc2ssCi0JCQkJCQlhY3Rpdml0eSwgcm9sZURlc2NMaXN0LCB3cERlc2NMaXN0LAotCQkJCQkJd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLAotCQkJCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAsIGRlc2NyaXB0b3JzVG9SZWZyZXNoLAotCQkJCQkJYmF0Y2hDb21tYW5kLmdldE9iamVjdFRvTmV3RmVhdHVyZVZhbHVlc01hcCgpLCAKLQkJCQkJCVdCU0Ryb3BDb21tYW5kLnRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCQkJc3luY2hyb25pemUsCi0JCQkJCQlzeW5jaEZlYXR1cmVzKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUoZGVzYyk7Ci0JCQkJCXRhc2tEZXNjTGlzdC5hZGQoZGVzYyk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBBZGQgdW5pcXVlIG5hbWUgY2hlY2sgZm9yIHJvbGVkZXNjIGFuZCB3cCBkZXNjcmlwdG9ycyBhcyB3ZWxsCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJvbGVEZXNjTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzY0xpc3QuZ2V0KGkpOwkJCQotCQkJCWlmIChyb2xlRGVzYyAhPSBudWxsKSB7Ci0JCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUocm9sZURlc2MpOwkKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdwRGVzY0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgd3BEZXNjTGlzdC5nZXQoaSk7CQkJCi0JCQkJaWYgKHdwRGVzYyAhPSBudWxsKSB7Ci0JCQkJCXVuaXF1ZU5hbWVzSGFuZGxlci5lbnN1cmVVbmlxdWUod3BEZXNjKTsJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuICF0YXNrRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJCXx8ICFyb2xlRGVzY0xpc3QuaXNFbXB0eSgpCi0JCQkJCXx8ICF3cERlc2NMaXN0LmlzRW1wdHkoKQotCQkJCQl8fCAhd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmlzRW1wdHkoKQotCQkJCQl8fCAhd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpCi0JCQkJCXx8IGJhdGNoQ29tbWFuZC5jYW5FeGVjdXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb0V4Y2VjdXRlKCkgewotCQkJLy8gYXV0b21hdGljYWxseSBhZGQgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgdG8gZGVsaXZlcmFibGUgcGFydAotCQkJLy8KLQkJCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChNYXAuRW50cnk8V29ya1Byb2R1Y3REZXNjcmlwdG9yLCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGVudHJ5IDogCi0JCQkJCXdwZFRvRGVsaXZlcmFibGVEZXNjcmlwdG9yTWFwLmVudHJ5U2V0KCkpIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKCFkZWxpdmVyYWJsZS5nZXREZWxpdmVyYWJsZVBhcnRzKCkuY29udGFpbnMoCi0JCQkJCQkJZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWRlbGl2ZXJhYmxlLmdldERlbGl2ZXJhYmxlUGFydHMoKS5hZGQoCi0JCQkJCQkJCQllbnRyeS5nZXRLZXkoKSk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkubG9nKCJXQlNEcm9wQ29tbWFuZDo6ZG9FeGVjdXRlIC0gQWRkaW5nIGRlbGl2ZXJhYmxlIHBhcnQgdG8gZGVsaXZlcmFibGUiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYWRkIHRhc2sgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCi0JCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKHJvbGVEZXNjTGlzdCk7Ci0KLQkJCS8vIGFkZCB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZEFsbCh3cERlc2NMaXN0KTsKLQotCQkJLy8gYWRkIGRlbGl2ZXJhYmxlIHBhcnRzIHRvIHRoZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlpZiAoIXdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVudHJ5Ci0JCQkJCQkJLmdldEtleSgpOwotCQkJCQl3cERlc2MuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmFkZEFsbCgKLQkJCQkJCQkoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID09IG51bGwpIHsKLQkJCQlyb2xlRGVzY1RlYW1Qcm9maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VGVhbSgKLQkJCQkJCQlhY3Rpdml0eSwgcm9sZURlc2MuZ2V0Um9sZSgpKTsKLQkJCQkJaWYgKHRlYW1Qcm9maWxlICE9IG51bGwpIHsKLQkJCQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAucHV0KHJvbGVEZXNjLCB0ZWFtUHJvZmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgcm9sZSBkZXNjcmlwdG9ycyB0byB0ZWFtIHByb2ZpbGVzCi0JCQkvLwotCQkJZm9yIChNYXAuRW50cnk8Um9sZURlc2NyaXB0b3IsIFRlYW1Qcm9maWxlPiBlbnRyeSA6IHJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuZW50cnlTZXQoKSkgewotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5hZGQoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCi0JCQkvLyBhZGQgbmV3IGRlc2NyaXB0b3JzIHRvIGFjdGl2aXR5J3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbCh0YXNrRGVzY0xpc3QpOwotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGRBbGwocm9sZURlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKHdwRGVzY0xpc3QpOwotCQkJfQotCQkJCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb1VuZG8oKSB7Ci0JCQkKLQkJCS8vIHJlbW92ZSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQotCQkJLy8gcmVtb3ZlIHJvbGUgZGVzY3JpcHRvcnMKLQkJCS8vCi0JCQlhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLnJlbW92ZUFsbChyb2xlRGVzY0xpc3QpOwotCi0JCQkvLyByZW1vdmUgdGFzayBkZXNjcmlwdG9ycwotCQkJLy8KLQkJCWFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkucmVtb3ZlQWxsKHRhc2tEZXNjTGlzdCk7Ci0KLQkJCS8vIHJlbW92ZSBkZWxpdmVyYWJsZSBwYXJ0cyB0byB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JCQkvLwotCQkJaWYgKCF3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BEZXNjVG9EZWxpdmVyYWJsZVBhcnRzLmVudHJ5U2V0KCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbnRyeQotCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJd3BEZXNjLmdldERlbGl2ZXJhYmxlUGFydHMoKS5yZW1vdmVBbGwoCi0JCQkJCQkJKENvbGxlY3Rpb24pIGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcmVtb3ZlIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGZyb20gZGVsaXZlcmFibGUgcGFydAotCQkJLy8KLQkJCWlmICghd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuZW50cnlTZXQoKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIGRlbGl2ZXJhYmxlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZW50cnkKLQkJCQkJCQkuZ2V0VmFsdWUoKTsKLQkJCQkJZGVsaXZlcmFibGUuZ2V0RGVsaXZlcmFibGVQYXJ0cygpLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW1vdmUgcm9sZSBkZXNjcmlwdG9ycyBmcm9tIHRlYW0gcHJvZmlsZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByb2xlRGVzY1RlYW1Qcm9maWxlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkJdGVhbS5nZXRUZWFtUm9sZXMoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgZGVzY3JpcHRvcnMgZnJvbSBhY3Rpdml0eSdzIHBhY2thZ2UKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5yZW1vdmVBbGwodGFza0Rlc2NMaXN0KTsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlQWxsKHJvbGVEZXNjTGlzdCk7Ci0JCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZUFsbCh3cERlc2NMaXN0KTsKLQkJCX0KLQkJfQotCi0JfTsKLQotCS8qKgotCSAqIEBwYXJhbSBhY3QKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB0aGF0IHRoZSBnaXZlbiB0YXNrcyBhcmUgZHJvcHBlZCBvbgotCSAqIEBwYXJhbSB0YXNrcwotCSAqICAgICAgICAgICAgdGhlIHRhc2tzIHRvIGRyb3Agb24gdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIFdCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdCwgTGlzdCB0YXNrcykgewotCQlzdXBlcihhY3QsIHRhc2tzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZHJvcEVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrKSkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZHJvcEVsZW1lbnRzCi0JICogQHBhcmFtIHN5bmNoCi0JICovCi0JcHVibGljIFdCU0Ryb3BDb21tYW5kKEFjdGl2aXR5IGFjdGl2aXR5LCBMaXN0IGRyb3BFbGVtZW50cywgYm9vbGVhbiBzeW5jaCkgewotCQlzdXBlcihhY3Rpdml0eSwgZHJvcEVsZW1lbnRzLCBzeW5jaCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGRyb3BFbGVtZW50cwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gc3luY2hGZWF0dXJlcwotCSAqLwotCXB1YmxpYyBXQlNEcm9wQ29tbWFuZChBY3Rpdml0eSBhY3Rpdml0eSwgTGlzdCBkcm9wRWxlbWVudHMsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU2V0IHN5bmNoRmVhdHVyZXMpIHsKLQkJc3VwZXIoYWN0aXZpdHksIGRyb3BFbGVtZW50cywgY29uZmlnLCBzeW5jaEZlYXR1cmVzKTsKLQl9Ci0KLQlwdWJsaWMgSUV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgewotCQlpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotCQkJZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKTsKLQkJfQotCQlyZXR1cm4gZXhlY3V0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNwcmVFeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVFeGVjdXRlKCkgewotCQlpZiAoIXN1cGVyLnByZUV4ZWN1dGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZ2V0RXhlY3V0b3IoKS5wcmVFeGVjdXRlKCk7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkJTRHJvcENvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCWV4ZWN1dG9yLmRvRXhjZWN1dGUoKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWZmZWN0ZWRPYmplY3RzKCkgewotCQlpZiAodGFza0Rlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJldHVybiB0YXNrRGVzY0xpc3Q7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0QWZmZWN0ZWRPYmplY3RzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkb1VuZG8oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvVW5kbygpIHsKLQkJZXhlY3V0b3IuZG9VbmRvKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQlNEcm9wQ29tbWFuZCNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjTGlzdC5jbGVhcigpOwotCQl9Ci0JCWlmIChyb2xlRGVzY1RlYW1Qcm9maWxlTWFwICE9IG51bGwpIHsKLQkJCXJvbGVEZXNjVGVhbVByb2ZpbGVNYXAuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BEZXNjTGlzdCAhPSBudWxsKSB7Ci0JCQl3cERlc2NMaXN0LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKHdwRGVzY1RvRGVsaXZlcmFibGVQYXJ0cyAhPSBudWxsKSB7Ci0JCQl3cERlc2NUb0RlbGl2ZXJhYmxlUGFydHMuY2xlYXIoKTsKLQkJfQotCQlpZiAod3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJd3BkVG9EZWxpdmVyYWJsZURlc2NyaXB0b3JNYXAuY2xlYXIoKTsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzY2ZiZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kLkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMiwgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9yQ3JlYXRlQ29weUNvbW1hbmQgZXh0ZW5kcwotCQlNZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQHBhcmFtIGRvbWFpbgotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSBjb3B5SGVscGVyCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXN1cGVyLmRvRXhlY3V0ZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDb3B5Q29tbWFuZCNkb0dldENoaWxkcmVuVG9Db3B5KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldENoaWxkcmVuVG9Db3B5KCkgewotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gc3VwZXIuZG9HZXRDaGlsZHJlblRvQ29weSgpOwotCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvd25lcjsKLQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJaWYgKHdwIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHdwZC5nZXREZWxpdmVyYWJsZVBhcnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBwYXJ0ID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAocGFydC5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsICYmIHBhcnQgIT0gd3BkKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwYXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKChBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikKLQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJLmFkYXB0KG93bmVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihvd25lcikuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJY2hpbGRyZW4uYWRkKFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kI2RvR2V0UmVzdWx0KCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBkb0dldFJlc3VsdCgpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZChjb3B5KTsKLQotCQkvLyBDaGlsZHJlbiB0aGF0IGFyZSBzaG93biBpbiBCUyBkdWUgdG8gY2hpbGQgcmVsYXRpb25zaGlwIG9mIGl0cyBsaW5rZWQKLQkJLy8gQ29udGVudEVsZW1lbnQKLQkJLy8gYnV0IHRoZXkgYXJlIG5vdCBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlIG93bmVyLiBXZSBuZWVkIHRvIGFkZAotCQkvLyB0aGVpciBjb3BpZXMgdG8gdGhlIHJlc3VsdAotCQkvLyBzbyB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gY2xpcGJvYXJkIGZvciBsYXRlciBwYXN0ZQotCQkvLwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb3duZXI7Ci0JCVdvcmtQcm9kdWN0IHdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlpZiAoZG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSAoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZG9tYWluKQotCQkJCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIHdwZCwgZmFsc2UpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkQ29weSA9IGNvcHlIZWxwZXIuZ2V0KFRuZ1V0aWwudW53cmFwKGl0ZXIKLQkJCQkJCQkubmV4dCgpKSk7Ci0JCQkJCWlmIChjaGlsZENvcHkgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0LmFkZChjaGlsZENvcHkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikKLQkJCSgoVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSBkb21haW4pLmFkZENvcHlJbmZvKHJlc3VsdCwKLQkJCQkJY29weUhlbHBlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29tbWFuZC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDk4NzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbW1hbmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbWFuZHMgZm9yIGVkaXRpbmcgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEgUHJvY2VzcyBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzk3MTRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogQWN0aXZpdHkgaXRlbSBwcm92aWRlciBmb3IgY29uc29saWRhdGVkIHZpZXcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRPYmplY3Qob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0T2JqZWN0KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEVDbGFzc2VzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNkb1JlZnJlc2hBZmZlY3RlZFZpZXdlcnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUmVmcmVzaEFmZmVjdGVkVmlld2VycygpIHsKLQkJT2JqZWN0IHByb2MgPSBnZXRUb3BJdGVtKCk7Ci0JCU9iamVjdCBpdGVtUHJvdmlkZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwcm9jLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChpdGVtUHJvdmlkZXIgaW5zdGFuY2VvZiBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSB7Ci0JCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlcikKLQkJCQkJLnNldFJlZnJlc2hBbGxJRHNSZXF1aXJlZCh0cnVlKTsKLQkJfQotCi0JCVByb2Nlc3NVdGlsCi0JCQkJLnJlZnJlc2hJRHNJblZpZXdlcnMoKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQljaGlsZHJlbiA9IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgZmFsc2UpOwotCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB3cERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJCQotCQkJLy8gZG9uJ3QgcmV0dXJuIHJvbGVkZXNjcmlwdG9yIHdoaWNoIGFyZSBsaW5rZWQgdG8gdGFza2Rlc2NyaXB0b3IKLQkJCS8vIAotCQkJaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSBlOwotCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldFByaW1hcnlUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpKSAKLQkJCQl7Ci0JCQkJCXJvbGVEZXNjcmlwdG9ycy5hZGQob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBkb24ndCByZXR1cm4gd3BkZXNjcmlwdG9yIHdoaWNoIGFyZSBsaW5rZWQgdG8gZWl0aGVyCi0JCQkvLyB0YXNrZGVzY3JpcHRvciBvciByb2xlZGVzY3JpcHRvcgotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldEV4dGVybmFsSW5wdXRUbyh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0TWFuZGF0b3J5SW5wdXRUbyh3cERlc2MpLmlzRW1wdHkoKSAmJgotCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRPdXRwdXRGcm9tKHdwRGVzYykuaXNFbXB0eSgpICYmCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5nZXRSZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyh3cERlc2MpLmlzRW1wdHkoKSkKLQkJCQl7Ci0JCQkJCXdwRGVzY3JpcHRvcnMuYWRkKG9iamVjdCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluZXdDaGlsZHJlbi5hZGQob2JqZWN0KTsKLQkJCX0KLQkJfQotCQotCQluZXdDaGlsZHJlbi5hZGRBbGwocm9sZURlc2NyaXB0b3JzKTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKHdwRGVzY3JpcHRvcnMpOwotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQkKLQkJcmV0dXJuIG5ld0NoaWxkcmVuOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Um9sbHVwQ2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNpc1JvbGxlZFVwKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JvbGxlZFVwKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNDI5OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9JdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFdCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWN0aXZpdHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZWFtUHJvZmlsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGE5ZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogUHJvY2VzcyBpdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCXByaXZhdGUgSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQotCXB1YmxpYyBQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCXRoaXMuZGVsZWdhdGVJdGVtUHJvdmlkZXIgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCQkJCQkuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkvLyBuZWVkIHRvIHVwZGF0ZSB0aGUgbGlicmFyeSB2aWV3Ci0JCQkvLyBidXQgUHJvY2Vzc0NvbXBvbmVudHMgZG9uJ3QgaGF2ZSBhIFByZXNlbnRhdGlvbiBOYW1lLCBzbwotCQkJLy8gY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBwcm9jQ29tcCB0byBpdHNlbGYKLQkJCS8vIHRoaXMgd2lsbCBjYXVzZSBhIHJlZnJlc2gKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcykgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQlpZiAocHJvYy5lQ29udGFpbmVyKCkgIT0gbnVsbCkgewotCQkJCWJvb2xlYW4gb2xkID0gcHJvYy5lQ29udGFpbmVyKCkuZURlbGl2ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwcm9jLmVDb250YWluZXIoKS5lU2V0RGVsaXZlcih0cnVlKTsKLQkJCQkJaWYgKHByb2MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCQkJCSgoUHJvY2Vzc0NvbXBvbmVudClwcm9jLmVDb250YWluZXIoKSkuc2V0TmFtZSgoKFByb2Nlc3NDb21wb25lbnQpcHJvYy5lQ29udGFpbmVyKCkpLmdldE5hbWUoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcHJvYy5lQ29udGFpbmVyKCkuZVNldERlbGl2ZXIob2xkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjdkYTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBSb2xlRGVzY3JpcHRvciBJdGVtIHByb3ZpZGVyIGZvciBjb25zb2xpZGF0ZWQgdmlldwotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2NvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKGphdmEudXRpbC5Db2xsZWN0aW9uLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhDb2xsZWN0aW9uIG5ld0NoaWxkRGVzY3JpcHRvcnMsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKG5ldyBDb21tYW5kUGFyYW1ldGVyKHRhcmdldCwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2UoY2hpbGQpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRDcmVhdGVDaGlsZEltYWdlKG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvYmplY3QsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUm9sZURlc2NyaXB0b3IuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCXJlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJaWYgKFByb2Nlc3NVdGlsLmlzUmVmcmVzaFJlcXVpcmVkKG5vdGlmaWNhdGlvbiwgbnVsbCkpIHsKLQkJCVByb2Nlc3MgdG9wQWN0ID0gKFByb2Nlc3MpIGdldFRvcEl0ZW0oKTsKLQkJCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpOwotCi0JCQlQcm9jZXNzVXRpbC5yZWZyZXNoVmlld2VyKHJvb3RBZGFwdGVyRmFjdG9yeSwgdG9wQWN0KTsKLQkJfQotCQkKLQkJLy8gcmVmcmVzaCBjaGlsZHJlbiBvZiB0aGlzIGl0ZW0gcHJvdmlkZXIsIGl0cyBwYXJlbnQgYWN0aXZpdHkgYW5kCi0JCS8vIGFsbCBleHRlbmRlcnMsIGxvY2FsIGNvbnRyaWJ1dG9ycyBvZiB0aGUgcGFyZW50IGFjdGl2aXR5Ci0JCS8vCi0JCVRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLnJlZnJlc2hDaGlsZHJlbih0aGlzLCBub3RpZmljYXRpb24pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGVkQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbikgewotLy8JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLS8vCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLS8vCQl9Ci0vLwkJZWxzZSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0vLwkJCWNhY2hlZENoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0vLwkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmopIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJTGlzdCBuZXdDaGlsZHJlbjsKLQkKLQkJLy8gSWYgcm9sZXMgaGFzIGFueSBvZiB0YXNrZGVzY3JpcHRvciBsaW5rZWQgdGhlbiBkb24ndCBzaG93IGFueQotCQkvLyBjaGlsZHJlbiBvdGhlcndpc2Ugc2hvdyBpdCdzIGxpbmtlZCB3b3JrcHJvZHVjdCBkZXNjcmlwdG9yCi0JCWlmKCFBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkgfHwKLQkJCQkhQXNzb2NpYXRpb25IZWxwZXIuZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykuaXNFbXB0eSgpIHx8Ci0JCQkJIUFzc29jaWF0aW9uSGVscGVyLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKS5pc0VtcHR5KCkpCi0JCXsKLQkJCW5ld0NoaWxkcmVuID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGdldCBjaGlsZHJlbgotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCQluZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKG9iaik7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCU9iamVjdCBjaGlsZCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKChmaWx0ZXIgIT0gbnVsbCkgJiYgKGZpbHRlci5hY2NlcHQoY2hpbGQpKSkgewotCQkJCQkJbmV3Q2hpbGRyZW4uYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLwkJIHNvcnQgdGhlIGNoaWxkcmVuCi0JCUNvbGxlY3Rpb25zLnNvcnQobmV3Q2hpbGRyZW4sIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotCi0JcHJpdmF0ZSBJRmlsdGVyIGdldEZpbHRlcihPYmplY3Qgb2JqKSB7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChvYmopOwotCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpCi0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJZmlsdGVyID0gKChBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0RmlsdGVyKCk7Ci0JCX0KLQotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2NvbnNvbGlkYXRlZC9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FjNjM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCU0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9zIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY2FjaGVkQ2hpbGRyZW47Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQobmV3IENvbW1hbmRQYXJhbWV0ZXIodGFyZ2V0LAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUm9sZURlc2NyaXB0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCQkKLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZlYXR1cmVzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5GZWF0dXJlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCWNoaWxkcmVuRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNpc1dyYXBwaW5nTmVlZGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXcmFwcGluZ05lZWRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZFRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlVGV4dChmZWF0dXJlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjZ2V0Q3JlYXRlQ2hpbGRJbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGVDaGlsZEltYWdlKE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBpbWcgPSBUbmdVdGlsLmdldEltYWdlKGNoaWxkKTsKLQkJcmV0dXJuIGltZyAhPSBudWxsID8gaW1nIDogc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRJbWFnZShvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2NyZWF0ZVdyYXBwZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVXcmFwcGVyKEVPYmplY3Qgb2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIElCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV3JhcHBlcih2YWx1ZSwgb2JqZWN0LCBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnkpOwotCQl3cmFwcGVyLnNldFJlYWRPbmx5KGZhbHNlKTsKLQkJcmV0dXJuIHdyYXBwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhc2tEZXNjcmlwdG9yLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCXJlZnJlc2hDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQl9Ci0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQkKLQlzdGF0aWMgdm9pZCByZWZyZXNoQ2hpbGRyZW4oSXRlbVByb3ZpZGVyQWRhcHRlciBpcGEsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsJCQotCQlpZiAoUHJvY2Vzc1V0aWwuaXNSZWZyZXNoUmVxdWlyZWQobm90aWZpY2F0aW9uLCBudWxsKSkgewotCQkJaXBhLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0KLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gaXBhLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkKLQkJCWlmKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCS8vIG5lZWQgdG8gcmVmcmVzaCBjaGlsZHJlbiBvZiBwYXJlbnQgYWN0aXZpdHkKLQkJCQkvLwotCQkJCUFjdGl2aXR5IHBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudClub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJT2JqZWN0IGFkYXB0ZXIgPSBhZGFwdGVyRmFjdG9yeS5hZGFwdChwYXJlbnQsCi0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXIpCi0JCQkJCS5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJCQlwYXJlbnQsIHRydWUsIGZhbHNlKSk7Ci0JCQkJfQotCi0JCQkJLy8gcmVmcmVzaCBleHRlbmRlcnMgYW5kIGxvY2FsIGNvbnRyaWJ1dG9ycyBvZiB0aGUgcGFyZW50Ci0JCQkJLy8KLQkJCQlpZihwYXJlbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMocGFyZW50KTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTCi0JCQkJCQkJCXx8IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJCQlhZGFwdGVyID0gVG5nVXRpbC5nZXRBZGFwdGVyQnlUeXBlKHZlLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCQkJCSgoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlcikKLQkJCQkJCQkJLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJCQkJCXZlLCB0cnVlLCBmYWxzZSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaENoaWxkcmVuKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJcmVmcmVzaENoaWxkcmVuKHRoaXMsIG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhY2hlZENoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLS8vCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0vLwkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChjaGlsZHJlbik7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQljYWNoZWRDaGlsZHJlbi5jbGVhcigpOwotLy8JCQljYWNoZWRDaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOwotLy8JCX0KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqKSB7Ci0JCUNvbGxlY3Rpb24gY2hpbGRyZW4gPSBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQlMaXN0IG5ld0NoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHByaW1hcnlQZXJmb3JtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFkZGl0aW9uYWxQZXJmb3JtZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFzc2l0ZWRCeSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtYW5kYXRvcnlJbnB1dCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBleHRlcm5hbElucHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IG9wdGlvbmFsSW5wdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgb3V0cHV0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUlGaWx0ZXIgZmlsdGVyID0gZ2V0RmlsdGVyKG9iaik7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0b3IubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRWYWx1ZSgpOwotCQkJCQotCQkJCQotCQkJCWlmICgoZmlsdGVyICE9IG51bGwpICYmIChmaWx0ZXIuYWNjZXB0KGNoaWxkKSkpIHsKLQkJCQkJaWYgKCgoV3JhcHBlckl0ZW1Qcm92aWRlcikgbykuZ2V0RmVhdHVyZSgpLmVxdWFscygKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkpKSB7Ci0JCQkJCQlwcmltYXJ5UGVyZm9ybWVycy5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKQotCQkJCQkJCS5nZXRGZWF0dXJlKCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpKSB7Ci0JCQkJCQlhZGRpdGlvbmFsUGVyZm9ybWVycy5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkKLQkJCQkJCQkuZXF1YWxzKAotCQkJCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSkpIHsKLQkJCQkJCWFzc2l0ZWRCeS5hZGQobyk7Ci0JCQkJCX0gZWxzZSBpZiAoKChXcmFwcGVySXRlbVByb3ZpZGVyKSBvKS5nZXRGZWF0dXJlKCkuZXF1YWxzKAotCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSkpIHsKLQkJCQkJCW1hbmRhdG9yeUlucHV0LmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCkpKSB7Ci0JCQkJCQlleHRlcm5hbElucHV0LmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpKSB7Ci0JCQkJCQlvcHRpb25hbElucHV0LmFkZChvKTsKLQkJCQkJfSBlbHNlIGlmICgoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIG8pLmdldEZlYXR1cmUoKS5lcXVhbHMoCi0JCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkpKSB7Ci0JCQkJCQlvdXRwdXQuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc29ydCBmb3IgYWxsIGNoaWxkcmVuCi0JCUNvbGxlY3Rpb25zLnNvcnQocHJpbWFyeVBlcmZvcm1lcnMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGFkZGl0aW9uYWxQZXJmb3JtZXJzLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChhc3NpdGVkQnksIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGV4dGVybmFsSW5wdXQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlDb2xsZWN0aW9ucy5zb3J0KG1hbmRhdG9yeUlucHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChvcHRpb25hbElucHV0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJQ29sbGVjdGlvbnMuc29ydChvdXRwdXQsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQkKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKHByaW1hcnlQZXJmb3JtZXJzKTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKGFkZGl0aW9uYWxQZXJmb3JtZXJzKTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKGFzc2l0ZWRCeSk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChleHRlcm5hbElucHV0KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKG1hbmRhdG9yeUlucHV0KTsKLQkJbmV3Q2hpbGRyZW4uYWRkQWxsKG9wdGlvbmFsSW5wdXQpOwotCQluZXdDaGlsZHJlbi5hZGRBbGwob3V0cHV0KTsKLQkJCi0JCW5ld0NoaWxkcmVuID0gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKG5ld0NoaWxkcmVuLCB0cnVlKTsKLQkJdXBkYXRlQ2FjaGVkQ2hpbGRyZW4obmV3Q2hpbGRyZW4pOwotCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXApOwotCX0KLQotCXByaXZhdGUgSUZpbHRlciBnZXRGaWx0ZXIoT2JqZWN0IG9iaikgewotCQlJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnQgPSBnZXRQYXJlbnQob2JqKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXRSb290QWRhcHRlckZhY3RvcnkoKQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCWZpbHRlciA9ICgoQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldEZpbHRlcigpOwotCQl9Ci0KLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDYWNoZWRDaGlsZHJlbkl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbkZyb21DYWNoZSgpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW5Gcm9tQ2FjaGUoKSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWdldENoaWxkcmVuKHRhcmdldCk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNhY2hlZENoaWxkcmVuSXRlbVByb3ZpZGVyI2dldFJvbGx1cENoaWxkcmVuRnJvbUNhY2hlKCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSb2xsdXBDaGlsZHJlbkZyb21DYWNoZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsgCi0JCWlmKGNhY2hlZENoaWxkcmVuICE9IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuLmNsZWFyKCk7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG51bGw7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTk5NWRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0KLS8qKgotICogV29ya1Byb2R1Y3REZXNjcmlwdG9yIEl0ZW0gcHJvdmlkZXIgZm9yIGNvbnNvbGlkYXRlZCB2aWV3Ci0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIjY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoamF2YS51dGlsLkNvbGxlY3Rpb24sCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKENvbGxlY3Rpb24gbmV3Q2hpbGREZXNjcmlwdG9ycywKLQkJCU9iamVjdCBvYmplY3QpIHsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuRmVhdHVyZXMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbkZlYXR1cmVzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2lzV3JhcHBpbmdOZWVkZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1dyYXBwaW5nTmVlZGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyI2dldENyZWF0ZUNoaWxkVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVUZXh0KGZlYXR1cmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlciNnZXRDcmVhdGVDaGlsZEltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0ZUNoaWxkSW1hZ2UoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGltZyA9IFRuZ1V0aWwuZ2V0SW1hZ2UoY2hpbGQpOwotCQlyZXR1cm4gaW1nICE9IG51bGwgPyBpbWcgOiBzdXBlci5nZXRDcmVhdGVDaGlsZEltYWdlKG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXIjY3JlYXRlV3JhcHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgSUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXcmFwcGVyKHZhbHVlLCBvYmplY3QsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCXdyYXBwZXIuc2V0UmVhZE9ubHkoZmFsc2UpOwotCQlyZXR1cm4gd3JhcHBlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciNub3RpZnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQkvLyBzd2l0Y2gobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSb2xlRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJLy8gY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkvLyByZWZyZXNoQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJLy8gfQotCi0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpcHRvckl0ZW1Qcm92aWRlciNnZXRBdHRyaWJ1dGUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZShvYmplY3QsIHByb3BlcnR5KTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmopIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHN1cGVyLmdldENoaWxkcmVuKG9iaik7Ci0JCUxpc3QgbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCW5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7Ci0JCS8vIHNvcnQgdGhlIGNoaWxkcmVuCi0JCUNvbGxlY3Rpb25zLnNvcnQobmV3Q2hpbGRyZW4sIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCi0JCXJldHVybiBuZXdDaGlsZHJlbjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvY29uc29saWRhdGVkL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjJhNzdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9jb25zb2xpZGF0ZWQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaXRlbSBwcm92aWRlcnMgZm9yIGRpc3BsYXlpbmcgYW5kIGVkaXRpbmcgYnJlYWtkb3duIGVsZW1lbnRzIGluIGEgUHJvY2VzcyBlZGl0b3IncyBDb25zb2xpZGF0ZWQgVmlldyBwYWdlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9pbnRlcm5hbC9CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkMDVhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkNvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZWxpdmVyYWJsZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5NaWxlc3RvbmVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuVGVhbVByb2ZpbGVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyRmFjdG9yeSBpbXBsZW1lbnRzCi0JCUlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLmxpYnJhcnkuZWRpdC5wcm9jZXNzLklCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlckZhY3RvcnkjY3JlYXRlV3JhcHBlcihqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElXcmFwcGVySXRlbVByb3ZpZGVyIGNyZWF0ZVdyYXBwZXIoT2JqZWN0IHZhbHVlLAotCQkJT2JqZWN0IG93bmVyLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlyZXR1cm4gY3JlYXRlV3JhcHBlcih2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgY29tLmlibS5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXJGYWN0b3J5I2NyZWF0ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGludCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJV3JhcHBlckl0ZW1Qcm92aWRlciBjcmVhdGVXcmFwcGVyKE9iamVjdCB2YWx1ZSwKLQkJCU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIGludCBpbmRleCwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXZhbHVlID0gVG5nVXRpbC51bndyYXAodmFsdWUpOwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIoKEFjdGl2aXR5KSB2YWx1ZSwgb3duZXIsCi0JCQkJCWZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCXJldHVybiBuZXcgTWlsZXN0b25lV3JhcHBlckl0ZW1Qcm92aWRlcigoTWlsZXN0b25lKSB2YWx1ZSwgb3duZXIsCi0JCQkJCWZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZVJvbGVXcmFwcGVySXRlbVByb3ZpZGVyKChDb21wb3NpdGVSb2xlKSB2YWx1ZSwKLQkJCQkJb3duZXIsIGZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIG5ldyBSb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShSb2xlRGVzY3JpcHRvcikgdmFsdWUsIG93bmVyLCBmZWF0dXJlLCBpbmRleCwKLQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBuZXcgVGFza0Rlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKAotCQkJCQkoVGFza0Rlc2NyaXB0b3IpIHZhbHVlLCBvd25lciwgZmVhdHVyZSwgaW5kZXgsCi0JCQkJCWFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQlyZXR1cm4gbmV3IFRlYW1Qcm9maWxlV3JhcHBlckl0ZW1Qcm92aWRlcigoVGVhbVByb2ZpbGUpIHZhbHVlLAotCQkJCQlvd25lciwgZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHZhbHVlOwotCQkJaWYgKHdwZC5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgRGVsaXZlcmFibGUpIHsKLQkJCQlyZXR1cm4gbmV3IERlbGl2ZXJhYmxlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIod3BkLCBvd25lciwKLQkJCQkJCWZlYXR1cmUsIGluZGV4LCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIod3BkLCBvd25lciwKLQkJCQkJZmVhdHVyZSwgaW5kZXgsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBuZXcgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShCcmVha2Rvd25FbGVtZW50KSB2YWx1ZSwgb3duZXIsIGZlYXR1cmUsIGluZGV4LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ZWE4Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyBhIHByb2Nlc3MuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZmM1NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGFuZCBlZGl0aW5nIGJyZWFrZG93biBlbGVtZW50cyBpbiBhIFByb2Nlc3MgZWRpdG9yLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkwOWYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkFjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIENCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5BY3Rpdml0eUl0ZW1Qcm92aWRlciNyZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oamF2YS51dGlsLkNvbGxlY3Rpb24sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ0YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBDQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIodGhpcywKLQkJCQkoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCQkJLmNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcih0aGlzLAotCQkJCShJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUwYWE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5Qcm9jZXNzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIENCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzSXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBDQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLkFjdGl2aXR5SXRlbVByb3ZpZGVyI3JlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihqYXZhLnV0aWwuQ29sbGVjdGlvbiwgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjYWJhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9DQlNSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29uc29saWRhdGVkLlJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gZGVsZWdhdGVJdGVtUHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQ0JTUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1Rhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YmE4YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbnNvbGlkYXRlZC5UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBDQlNUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgZGVsZWdhdGVJdGVtUHJvdmlkZXIpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGRlbGVnYXRlSXRlbVByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCXJldHVybiBQcm9jZXNzVXRpbC5yZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oY2hpbGRyZW4sIHVud3JhcCwgYWRhcHRlckZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL0NCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDA0MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb25zb2xpZGF0ZWQuV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ0JTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBDQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjQ3NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgT0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFRCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLk9CU0FjdGl2aXR5SXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZmRmMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvVEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJT0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIFRCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSNjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5jcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1RCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiZDEzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9UQlNQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5PQlNQcm9jZXNzSXRlbVByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIE9CU1Byb2Nlc3NJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFRCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5PQlNQcm9jZXNzSXRlbVByb3ZpZGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzI3NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV0JTQWN0aXZpdHlJdGVtUHJvdmlkZXIjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKGlzUm9sbGVkVXAoKSkgewotCQkJaWYoY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZFJvbGx1cENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRSb2xsdXBDaGlsZHJlbjsKLQkJfQotCQllbHNlIHsKLQkJCWlmKGNhY2hlZENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkQ2hpbGRyZW47Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3Yjc3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5XQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwdWJsaWMgV0JTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5I2NyZWF0ZUFjdGl2aXR5QWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFdCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlcih0aGlzLCAoSXRlbVByb3ZpZGVyQWRhcHRlcikgVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeQotCQkJCS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyKHRoaXMsIChJdGVtUHJvdmlkZXJBZGFwdGVyKSBUbmdVdGlsLnVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV0JTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODgwMDkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5wdWJsaXNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXQlNQcm9jZXNzSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFdCU1Byb2Nlc3NJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlpZihpc1JvbGxlZFVwKCkpIHsKLQkJCWlmKGNhY2hlZFJvbGx1cENoaWxkcmVuID09IG51bGwpIHsKLQkJCQljYWNoZWRSb2xsdXBDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Qoc3VwZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2FjaGVkUm9sbHVwQ2hpbGRyZW47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZihjYWNoZWRDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZENoaWxkcmVuOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTYzYTA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE1hciAyMiwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdQQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBleHRlbmRzIFBCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqLwotCXB1YmxpYyBXUEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5QQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCByZW1vdmVTdWJhcnRpZmFjdHNGcm9tQ2hpbGRyZW4oQ29sbGVjdGlvbiBjaGlsZHJlbiwgYm9vbGVhbiB1bndyYXApIHsKLQkJcmV0dXJuIFByb2Nlc3NVdGlsLnJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihjaGlsZHJlbiwgdW53cmFwLCBhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTc2ZDQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlBCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BCU0l0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIFdQQlNJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV1BCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKHRoaXMpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkjY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBXUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMsCi0JCQkJKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkJCS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIodGhpcywgKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ1V0aWwudW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkKLQkJCQkuY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvV1BCU1Byb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IyZjNlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXUEJTUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIFBCU1Byb2Nlc3NJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFdQQlNQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcikgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgZGVsZWdhdGVJdGVtUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoaXNSb2xsZWRVcCgpKSB7Ci0JCQlpZihjYWNoZWRSb2xsdXBDaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJY2FjaGVkUm9sbHVwQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQkJfQotCQkJcmV0dXJuIGNhY2hlZFJvbGx1cENoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCWNhY2hlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdChzdXBlci5nZXRDaGlsZHJlbihvYmplY3QpKTsKLQkJCX0KLQkJCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBMaXN0IHJlbW92ZVN1YmFydGlmYWN0c0Zyb21DaGlsZHJlbihDb2xsZWN0aW9uIGNoaWxkcmVuLCBib29sZWFuIHVud3JhcCkgewotCQlyZXR1cm4gUHJvY2Vzc1V0aWwucmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGNoaWxkcmVuLCB1bndyYXAsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL1dQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQzNzE3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3Byb2Nlc3MvcHVibGlzaGluZy9XUEJTV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MucHVibGlzaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3ZpZGVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gTWFyIDIyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV1BCU1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGRlbGVnYXRlSXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIFdQQlNXb3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGRlbGVnYXRlSXRlbVByb3ZpZGVyKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBkZWxlZ2F0ZUl0ZW1Qcm92aWRlcik7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJaWYoY2FjaGVkQ2hpbGRyZW4gPT0gbnVsbCkgewotCQkJY2FjaGVkQ2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KHN1cGVyLmdldENoaWxkcmVuKG9iamVjdCkpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDaGlsZHJlbjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLldvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciNhZGRDb250YWluZWRBcnRpZmFjdERlc2NyaXB0b3JzKG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yLCBqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250YWluZWRBcnRpZmFjdERlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MsIENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHdwRGVzYyk7Ci0JCWlmKGFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCS8vIGNvbGxlY3QgYWxsIGFydGlmYWN0IGRlc2NyaXB0b3JzIG9yIHRoZWlyIHdyYXBwZXJzIHVuZGVyIHRoZSBzYW1lIGFjdGl2aXR5Ci0JCQkvLwotCQkJTGlzdCBhcnRpZmFjdERlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQ29sbGVjdGlvbiBzaWJsaW5ncyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaWJsaW5ncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0ZXIubmV4dCgpOwotCQkJCWlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgCi0JCQkJCQkmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QKLQkJCQkJCSYmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KGUpKSkgewotCQkJCQlhcnRpZmFjdERlc2NMaXN0LmFkZChlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWNoaWxkcmVuLmFkZEFsbChQcm9jZXNzVXRpbC5nZXRDb250YWluZWRBcnRpZmFjdHNEZXNjcmlwdG9ycyh3cERlc2MsIGFydGlmYWN0RGVzY0xpc3QpKTsJCQkKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC9wcm9jZXNzL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWQ4YzgyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvcHJvY2Vzcy9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGl0ZW0gcHJvdmlkZXJzIGZvciBkaXNwbGF5aW5nIGEgcHJvY2VzcyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSUFjdGlvblR5cGVQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JQWN0aW9uVHlwZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGJiNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9JQWN0aW9uVHlwZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aW9uVHlwZVByb3ZpZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPUFkgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhURU5EID0gMjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUVQX0NPUFkgPSAzOwotCi0Jdm9pZCBzZXRJbnB1dERhdGEoT2JqZWN0IG9iamVjdCk7Ci0KLQl2b2lkIHNldEFjdGlvbk1hbmFnZXIoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKTsKLQotCS8qKgotCSAqIEV4ZWN1dGVzIGdpdmVuIGNvbW1hbmQgYmFzZWQgb24gdGhlIGNob2ljZSB0aGF0IHVzZXIgc2VsZWN0ZWQgZnJvbSBnaXZlbgotCSAqIDxjb2RlPmNob2ljZXM8L2NvZGU+LiBDaG9pY2UgY2FuIGJlIG9uZSBvZiB0aGUgY29uc3RhbnQge0BsaW5rICNDT1BZfSwKLQkgKiB7QGxpbmsgI0VYVEVORH0sIG9yIHtAbGluayAjREVFUF9DT1BZfQotCSAqIAotCSAqIEBwYXJhbSBjbWQKLQkgKiBAcGFyYW0gY2hvaWNlcwotCSAqLwotCXZvaWQgZXhlY3V0ZShDb21tYW5kIGNtZCwgaW50W10gY2hvaWNlcyk7Ci0KLS8vCWludCBnZXRBY3Rpb25UeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSVVJSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL0lVSUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZlZmFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvSVVJSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJTQWN0aXZpdHlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4cG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVJSGVscGVyIHsKLQlwdWJsaWMgdm9pZCBydW5TYWZlbHkoUnVubmFibGUgcnVubmFibGUsIGJvb2xlYW4gc3luY2hyb25vdXMpOwotCQotCXB1YmxpYyB2b2lkIHJ1bldpdGhCdXN5SW5kaWNhdG9yKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBydW5XaXRoUHJvZ3Jlc3MoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBib29sZWFuIGNhbkNhbmNlbCwgU3RyaW5nIG1zZyk7Ci0KLQlwdWJsaWMgSVN0YXR1cyBydW5Bc0pvYihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsIFN0cmluZyB0YXNrTmFtZSwKLQkJCU9iamVjdCBzaGVsbCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBydW5JblVJKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlLCBPYmplY3Qgc2hlbGwpOwotCQotCXB1YmxpYyB2b2lkIHJ1bkluVUkoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJU3RyaW5nIHRhc2tOYW1lKTsKLQotCUlTdGF0dXMgcnVuSW5Nb2RhbENvbnRleHQoSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiwgYm9vbGVhbiBmb3JrLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgdWlDb250ZXh0KTsKLQotCXB1YmxpYyBUZWFtUHJvZmlsZSBnZXRUZWFtKEFjdGl2aXR5IGFjdGl2aXR5LCBSb2xlIHJvbGUsIE9iamVjdCBVSUNvbnRleHQpOwotCi0JLyoqCi0JICogU2VsZWN0IHRhc2tzIHdoaWNoIGhhcyBnaXZlbiB3b3JrcHJvZHVjdCBhcyBvdXRwdXQuCi0JICogCi0JICogQHBhcmFtIHRhc2tMaXN0Ci0JICogQHBhcmFtIHdwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IHNlbGVjdFRhc2tzKExpc3QgdGFza0xpc3QsIFdvcmtQcm9kdWN0IHdwKTsKLQotCS8qKgotCSAqIFNlbGVjdCByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3RzIGZvciB0aGUgZ2l2ZW4gcm9sZQotCSAqIAotCSAqIEBwYXJhbSB3cExpc3QKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTGlzdCBzZWxlY3RXb3JrUHJvZHVjdHMoTGlzdCB3cExpc3QsIFJvbGUgcm9sZSk7Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoTmVlZGVkKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIpOwotCi0JcHVibGljIHZvaWQgcmVmcmVzaFZpZXdlcihBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MpOwotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hBbGxWaWV3ZXJzKGZpbmFsIEV4cG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci0KLQlwdWJsaWMgdm9pZCByZWZyZXNoSURzSW5WaWV3ZXIoRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQkKLQlwdWJsaWMgT2JqZWN0IGdldFZpZXdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgUHJvY2VzcyBwcm9jKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9SZWZlcmVuY2VTZWxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvUmVmZXJlbmNlU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmNkNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9SZWZlcmVuY2VTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVUkgRGlhbG9nIGNsYXNzIHdoaWNoIHdpbGwgZ2l2ZSB1c2VyIHRvIHNlbGVjdCByZWZlcmVuY2VzIHRvIGJlIGRlbGV0ZWQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZmVyZW5jZVNlbGVjdGlvbiB7Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFJlZmVyZW5jZXMoTGlzdCByZWYsIERlc2NyaXB0b3IgZGVzYykgewotCQlyZXR1cm4gZ2V0UmVmZXJlbmNlcyhyZWYsIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZl9kZWxldGUsCi0JCQkJZGVzYy5nZXROYW1lKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG93cyBkaWFsb2cgYm94IGZvciBhbGwgcmVmZXJlbmNlcyB0byBiZSBkZWxldGVkIGZvciB0aGUgZ2l2ZW4KLQkgKiBkZXNjcmlwdG9yLiBUaGVzZSByZWZlcmVuY2VzIGFyZSBub3QgYmVpbmcgdXNlZCBhbnl3aGVyZSBlbHNlLgotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRSZWZlcmVuY2VzKExpc3QgcmVmKSB7Ci0KLQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZfZGVsZXRlMjsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRSZWZlcmVuY2VzKHJlZiwgbWVzc2FnZSk7Ci0JCX0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSXQgc2hvd3Mgc2VsZWN0aW9uIGRpYWxvZyBib3ggd2l0aCBsaXN0IG9mIHJlZmVyZW5jZSAoPGNvZGU+cmVmPC9jb2RlPikKLQkgKiBmb3IgdXNlciB0byBzZWxlY3QuCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqIEByZXR1cm4KLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdXNlciBjYW5jZWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0UmVmZXJlbmNlcyhMaXN0IHJlZiwgU3RyaW5nIG1zZykKLQkJCXRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldwotCQkvLyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcigKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJLy8gLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKSB7Ci0JCS8vIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3Qgb2JqZWN0KSB7Ci0JCS8vIHJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkvLyAuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLwotCQkvLyB0cnkgewotCQkvLyBQcm9jZXNzTGlzdFNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcKLQkJLy8gUHJvY2Vzc0xpc3RTZWxlY3Rpb25EaWFsb2coUGxhdGZvcm1VSQotCQkvLyAuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgcmVmLAotCQkvLyBjb250ZW50UHJvdmlkZXIsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0JCS8vCi0JCS8vIGRsZy5zZXRUaXRsZShMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9yZWZlcmVuY2VzKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkbGcuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCS8vIGlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJLy8gdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCS8vIH0KLQkJLy8gT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJLy8gcmV0dXJuIG9ianM7Ci0JCS8vIH0gZmluYWxseSB7Ci0JCS8vIGNvbnRlbnRQcm92aWRlci5kaXNwb3NlKCk7Ci0JCS8vIGxhYmVsUHJvdmlkZXIuZGlzcG9zZSgpOwotCQkvLyB9Ci0KLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQlpZiAodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlJdGVtTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJLmdldE5hdmlnYXRvclZpZXdfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnVpX3JlZmVyZW5jZXM7Ci0JCQlMaXN0IHNlbGVjdGVkID0gdWlIYW5kbGVyLnNlbGVjdChyZWYsIGxhYmVsUHJvdmlkZXIsIHRydWUsIHJlZiwKLQkJCQkJdGl0bGUsIG1zZyk7Ci0JCQlpZiAoc2VsZWN0ZWQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmV0dXJuIHNlbGVjdGVkLnRvQXJyYXkoKTsKLQkJfQotCi0JCS8vIG5vIHVzZXIgaW50ZXJhY3Rpb24gaGFuZGxlciBhdmFpbGFibGUKLQkJLy8gcmV0dXJuIHRoZSBlbnRpcmUgcmVmZXJlbmNlIGxpc3QKLQkJLy8KLQkJcmV0dXJuIHJlZi50b0FycmF5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Vc2VySW50ZXJhY3Rpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdWkvVXNlckludGVyYWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhY2JmMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9Vc2VySW50ZXJhY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5Qcm92aWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5Vc2VySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIERlZmluZXMgc3RhdGljIG1ldGhvZHMgdGhhdCBpbnRlcmFjdCB3aXRoIHVzZXIgdmlhIGRpYWxvZyBib3hlcyB0byByZXRyaWV2ZQotICogbW9yZSBpbmZvcm1hdGlvbiBvciBjb25maXJtYXRpb24gZnJvbSB0aGUgdXNlcnMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVXNlckludGVyYWN0aW9uSGVscGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGNhbkludGVyYWN0ID0gdHJ1ZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJVUlIZWxwZXIgdWlIZWxwZXIgPSAoSVVJSGVscGVyKSBFeHRlbnNpb25NYW5hZ2VyLmdldEV4dGVuc2lvbigKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAidWlIZWxwZXIiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBVc2VySW50ZXJhY3Rpb25IZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkludGVyYWN0KCkgewotCQlyZXR1cm4gY2FuSW50ZXJhY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGFnYWluc3QgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9mIHRoZSBnaXZlbiBwcm9jZXNzIHdoZXRoZXIgdGhlCi0JICogZ2l2ZW4gKG1ldGhvZCkgb2JqZWN0IGNhbiBiZSB1c2VkIGluIHRoZSBwcm9jZXNzLiBUaGlzIG1ldGhvZCB3aWxsIHByb21wdAotCSAqIHVzZXIgdG8gYWRkIHRoZSBvYmplY3QgYW5kIHRob3NlIGVsZW1lbnRzIHRoYXQgaXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRvCi0JICogdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGRvZXMgbm90IGhhdmUgdGhlbQotCSAqIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYwotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3MKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgbWV0aG9kIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKiAgICAgICAgICAgIDxsaT4xIGlmIHRoZSBwcm9jZXNzJ2VzIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhbHJlYWR5IGhhcyB0aGUKLQkgKiAgICAgICAgICAgIG9iamVjdAotCSAqICAgICAgICAgICAgPGxpPjIgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCB1c2VyCi0JICogICAgICAgICAgICB3YW50cyB0byBhZGQgaXQgbm93Ci0JICogICAgICAgICAgICA8bGk+MCBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgdXNlcgotCSAqICAgICAgICAgICAgZG9uJ3Qgd2FudCB0byBhZGQgaXQKLQkgKiAgICAgICAgICAgIDxsaT4tMSBpZiB1c2VyIGNhbmNlbCB0aGUgcHJvbXB0IHRvIGFkZCB0aGUgb2JqZWN0cyBhbmQKLQkgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgZGVwZW5kZW5jaWVzIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBjaGVja0FnYWluc3REZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCBvYmplY3QsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhZ2FpbnN0IGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvY2VzcyB3aGV0aGVyIHRoZQotCSAqIGdpdmVuIChtZXRob2QpIG9iamVjdCBjYW4gYmUgdXNlZCBpbiB0aGUgcHJvY2Vzcy4gVGhpcyBtZXRob2Qgd2lsbCBwcm9tcHQKLQkgKiB1c2VyIHRvIGFkZCB0aGUgb2JqZWN0IGFuZCB0aG9zZSBlbGVtZW50cyB0aGF0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aCB0bwotCSAqIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZW0KLQkgKiB5ZXQuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiAgICAgICAgICAgIHRoZSBwcm9jZXNzCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICogICAgICAgICAgICA8bGk+MSBpZiB0aGUgcHJvY2VzcydlcyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYWxyZWFkeSBoYXMgdGhlCi0JICogICAgICAgICAgICBvYmplY3QKLQkgKiAgICAgICAgICAgIDxsaT4yIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBjb25maWd1cmF0aW9uLCBidXQgdXNlcgotCSAqICAgICAgICAgICAgd2FudHMgdG8gYWRkIGl0IG5vdwotCSAqICAgICAgICAgICAgPGxpPjAgaWYgdGhlIG9iamVjdCBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHVzZXIKLQkgKiAgICAgICAgICAgIGRvbid0IHdhbnQgdG8gYWRkIGl0Ci0JICogICAgICAgICAgICA8bGk+LTEgaWYgdXNlciBjYW5jZWwgdGhlIHByb21wdCB0byBhZGQgdGhlIG9iamVjdHMgYW5kCi0JICogICAgICAgICAgICBhc3NvY2lhdGVkIGRlcGVuZGVuY2llcyB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY2hlY2tBZ2FpbnN0RGVmYXVsdENvbmZpZ3VyYXRpb24oUHJvY2VzcyBwcm9jLAotCQkJT2JqZWN0IG9iamVjdCwgSUNvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IpIHsKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAoIShlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAoY29uZmlndXJhdG9yID09IG51bGwpCi0JCQljb25maWd1cmF0b3IgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdG9yRmFjdG9yeSgpCi0JCQkJCS5jcmVhdGVDb25maWd1cmF0b3IocHJvYy5nZXREZWZhdWx0Q29udGV4dCgpKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCS8vIGNoZWNrIGFsbCB0aGUgYmFzZSBlbGVtZW50cyBpZiB0aGVyZSBpcyBhbnkKLQkJCS8vCi0JCQlib29sZWFuIGFsbEluID0gdHJ1ZTsKLQkJCWZvciAoVmFyaWFiaWxpdHlFbGVtZW50IGMgPSAoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KTsgYyAhPSBudWxsOyBjID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYwotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJaWYgKCFjb25maWd1cmF0b3IuYWNjZXB0KGMpKSB7Ci0JCQkJCWFsbEluID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhbGxJbikgewotCQkJCXJldHVybiAxOwotCQkJfQotCQl9Ci0JCWlmIChjb25maWd1cmF0b3IuYWNjZXB0KGUpKQotCQkJcmV0dXJuIDE7Ci0KLQkJLy8gb2JqZWN0IGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbgotCQkvLyBhc2sgdXNlciBpZiBoZS9zaGUgd2FudCB0byBhZGQgaXQgdG8gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbgotCQkvLwotCQlTdHJpbmcgbXNnID0gTkxTCi0JCQkJLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51aV9Vc2VySW50ZXJhY3Rpb25IZWxwZXJfZGVmYXVsdGNvbmZpZ2NoZWNrLAotCQkJCQkJKChNZXRob2RFbGVtZW50KSBlKS5nZXROYW1lKCkpOwkJCi0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCWludCByZXQgPSB1aUhhbmRsZXIuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9ZRVMsCi0JCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTywKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTAotCQkJCX0sIExpYnJhcnlFZGl0UmVzb3VyY2VzLmFkZF90b19kZWZhdWx0X2NvbmZpZ19kbGdfdGl0bGUsIG1zZywgbnVsbCk7Ci0JCQlpZiAoVG5nVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiVXNlckludGVyYWN0aW9uSGVscGVyLmNoZWNrQWdhaW5zdERlZmF1bHRDb25maWd1cmF0aW9uKCk6IGVsZW1lbnQ9IiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGUgKyAiLCBwYXRoPSIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTOgotCQkJCUlTdGF0dXMgc3RhdHVzID0gVG5nVXRpbC5jaGVja0VkaXQocHJvYy5nZXREZWZhdWx0Q29udGV4dCgpLCBudWxsKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCXJldHVybiAyOwotCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk86Ci0JCQkJcmV0dXJuIDA7Ci0JCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUw6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCB0YXNrcyB3aGljaCBoYXMgZ2l2ZW4gd29ya3Byb2R1Y3QgYXMgb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB0YXNrTGlzdAotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Qgc2VsZWN0VGFza3MoTGlzdCB0YXNrTGlzdCwgV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIHVpSGVscGVyLnNlbGVjdFRhc2tzKHRhc2tMaXN0LCB3cCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IHJlc3BvbnNpYmxlIHdvcmsgcHJvZHVjdHMgZm9yIHRoZSBnaXZlbiByb2xlCi0JICogCi0JICogQHBhcmFtIHdwTGlzdAotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBzZWxlY3RXb3JrUHJvZHVjdHMoTGlzdCB3cExpc3QsIFJvbGUgcm9sZSkgewotCQlyZXR1cm4gdWlIZWxwZXIuc2VsZWN0V29ya1Byb2R1Y3RzKHdwTGlzdCwgcm9sZSk7Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdHMgbmFtZSBmcm9tIHVzZXIKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIG5hbWVGZWF0dXJlCi0JICogQHJldHVybiB0aGUgcmVxdWVzdGVkIG5hbWUgb2YgbnVsbCBpZiB1c2VyIGNhbmNlbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWVzdE5hbWUoT2JqZWN0IGNoaWxkLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLCBTdHJpbmcgdGl0bGUsCi0JCQlmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlJVmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQlpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGdldFNpbXBsZUVycm9yTWVzc2FnZSh2YWxpZGF0b3IuaXNWYWxpZChuZXdUZXh0KSk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCX07Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGNoaWxkOwotCQkJU3RyaW5nIHN0ciA9IChTdHJpbmcpIGUuZUdldChuYW1lRmVhdHVyZSk7Ci0JCQlpZiAoc3RyICE9IG51bGwpIHsKLQkJCQluYW1lID0gc3RyOwotCQkJfQotCQl9Ci0JCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyIHVpSGFuZGxlciA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKTsKLQkJaWYodWlIYW5kbGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVVzZXJJbnB1dCBpbnB1dCA9IG5ldyBVc2VySW5wdXQoIiIsIFVzZXJJbnB1dC5URVhULCBmYWxzZSwgbnVsbCwgbnVsbCwgaW5wdXRWYWxpZGF0b3IsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LnNldElucHV0KG5hbWUpOwotCQlib29sZWFuIHJldCA9IHVpSGFuZGxlci5yZXF1ZXN0SW5wdXQodGl0bGUsIExpYnJhcnlFZGl0UmVzb3VyY2VzLlVzZXJJbnRlcmFjdGlvbkhlbHBlcl9Qcm9jZXNzUGFja2FnZV9OYW1lLCAKLQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaW5wdXQpKTsKLQkJaWYocmV0KSB7Ci0JCQlyZXR1cm4gaW5wdXQuZ2V0SW5wdXQoKS50b1N0cmluZygpLnRyaW0oKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVFcnJvck1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlpZiAobXNnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgcyA9IG1zZy5pbmRleE9mKCc6Jyk7Ci0KLQkJU3RyaW5nIHByZWZpeCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChzID49IDApIHsKLQkJCXByZWZpeCA9IG1zZy5zdWJzdHJpbmcoMCwgcyk7Ci0KLQkJCVN0cmluZyBlbXB0eUVsZW1lbnROYW1lRXJyb3JNc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnOyAKLQkJCVN0cmluZyBkdXBDb250ZW50RmlsZUVycm9yTXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlQ29udGVudEZpbGVFcnJvcl9tc2c7IAotCQkJU3RyaW5nIGR1cEVsZW1lbnROYW1lRXJyb3JNc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZzsgCi0KLQkJCWlmIChlbXB0eUVsZW1lbnROYW1lRXJyb3JNc2cgIT0gbnVsbAotCQkJCQkmJiBlbXB0eUVsZW1lbnROYW1lRXJyb3JNc2cuc3RhcnRzV2l0aChwcmVmaXgpKQotCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZzsgCi0JCQllbHNlIGlmIChkdXBDb250ZW50RmlsZUVycm9yTXNnICE9IG51bGwKLQkJCQkJJiYgZHVwQ29udGVudEZpbGVFcnJvck1zZy5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3Jfc2ltcGxlX21zZzsgCi0JCQllbHNlIGlmIChkdXBFbGVtZW50TmFtZUVycm9yTXNnICE9IG51bGwKLQkJCQkJJiYgZHVwRWxlbWVudE5hbWVFcnJvck1zZy5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3Jfc2ltcGxlX21zZzsgCi0JCX0KLQotCQlpZiAocyA8IDApCi0JCQlzID0gMDsKLQkJZWxzZQotCQkJcysrOwotCQlpbnQgdCA9IG1zZy5pbmRleE9mKCdcbicpOwotCQlpZiAodCA8IDApCi0JCQl0ID0gbXNnLmxlbmd0aCgpOwotCi0JCXJldHVybiBtc2cuc3Vic3RyaW5nKHMsIHQpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGVhbSBpbiB3aGljaCB1c2VyIHdvdWxkIGF1dG9tYXRpY2FsbHkgYXNzaWduIGEgcm9sZSBpbnRvCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBUZWFtUHJvZmlsZSBnZXRUZWFtKEFjdGl2aXR5IGFjdGl2aXR5LCBSb2xlIHJvbGUpIHsKLQkJcmV0dXJuIGdldFRlYW0oYWN0aXZpdHksIHJvbGUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVhbVByb2ZpbGUgZ2V0VGVhbShBY3Rpdml0eSBhY3Rpdml0eSwgUm9sZSByb2xlLAotCQkJT2JqZWN0IFVJQ29udGV4dCkgewotCQlyZXR1cm4gdWlIZWxwZXIuZ2V0VGVhbShhY3Rpdml0eSwgcm9sZSwgVUlDb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLAotCQkJZmluYWwgU3RyaW5nIG1zZykgewotCQlmaW5hbCBJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlydW5uYWJsZS5ydW4oKTsKLQkJCX0KLQotCQl9OwotCQkKLQkJcmV0dXJuIHJ1bldpdGhQcm9ncmVzcyhvcGVyYXRpb24sIG1zZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHJ1bldpdGhQcm9ncmVzcygKLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgZmluYWwgU3RyaW5nIG1zZykgewotCQlyZXR1cm4gcnVuV2l0aFByb2dyZXNzKHJ1bm5hYmxlLCBmYWxzZSwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuV2l0aFByb2dyZXNzKAotCQkJZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLCBmaW5hbCBib29sZWFuIGNhbkNhbmNlbCwKLQkJCWZpbmFsIFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIHVpSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwgY2FuQ2FuY2VsLCBtc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBydW5Bc0pvYihJUnVubmFibGVXaXRoUHJvZ3Jlc3MgcnVubmFibGUsCi0JCQlTdHJpbmcgdGFza05hbWUpIHsKLQkJT2JqZWN0IHNoZWxsID0gTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKTsKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcnVubmFibGUucnVuKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXRQbHVnaW4oKQotCQkJCQkJLmdldElkKCksIDAsIGUudG9TdHJpbmcoKSwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcnVuQXNKb2IocnVubmFibGUsIHRhc2tOYW1lLCBzaGVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgcnVuQXNKb2IoZmluYWwgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlLAotCQkJZmluYWwgU3RyaW5nIHRhc2tOYW1lLCBPYmplY3Qgc2hlbGwpIHsKLQkJcmV0dXJuIHVpSGVscGVyLnJ1bkFzSm9iKHJ1bm5hYmxlLCB0YXNrTmFtZSwgc2hlbGwpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcnVuSW5VSShmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSwKLQkJCWZpbmFsIFN0cmluZyB0YXNrTmFtZSkgewotCQlyZXR1cm4gcnVuSW5VSShydW5uYWJsZSwgdGFza05hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5JblVJKGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLAotCQkJZmluYWwgU3RyaW5nIHRhc2tOYW1lLCBJU2NoZWR1bGluZ1J1bGUgcnVsZSkgewotCQlPYmplY3Qgc2hlbGwgPSBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCkgewotCQkJcnVubmFibGUucnVuKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uZXIgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX07Ci0JCQlyZXR1cm4gcnVuSW5VSShydW5uZXIsIHJ1bGUsIHNoZWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5JblVJKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCU9iamVjdCBzaGVsbCkgewotCQlyZXR1cm4gcnVuSW5VSShydW5uYWJsZSwgbnVsbCwgc2hlbGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBydW5JblVJKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwKLQkJCUlTY2hlZHVsaW5nUnVsZSBydWxlLCBPYmplY3Qgc2hlbGwpIHsKLQkJcmV0dXJuIHVpSGVscGVyLnJ1bkluVUkocnVubmFibGUsIHJ1bGUsIHNoZWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gRGVsaXZlcmFibGUgaW4gd2hpY2ggdXNlciB3b3VsZCBhdXRvbWF0aWNhbGx5IGFzc2lnbiBhIHdwIGludG8KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZ2V0RGVsaXZlcmFibGUoQWN0aXZpdHkgYWN0aXZpdHksCi0JCQlXb3JrUHJvZHVjdCB3cCkgewotCi0JCS8vIFBMRUFFIERPTidUIENMRUFOIFVQCi0JCS8vIGNvbW1lbnRlZCBvdXQgZm9yIG5vdyBzaW5jZSB3ZSBzaHV0LW9mZiBhdXRvbWF0aWMgYXNzaWdubWVudAotCQkvLyBvZiBkZWxpdmVyYWJsZSBmb3Igbm93Ci0JCS8vIExpc3QgZGVsaXZlcmFibGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCS8vIC5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkvLyAvLyBmaW5kIG91dCBhbGwgZGVsaXZlcmFibGVzIGluIHZpc2libGUgc2NvcGUKLQkJLy8gZ2V0RGVsaXZlcmFibGVzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwgYWN0aXZpdHksIHdwLAotCQkvLyBkZWxpdmVyYWJsZUxpc3QpOwotCQkvLyBpZiAoZGVsaXZlcmFibGVMaXN0LnNpemUoKSA9PSAxKSB7Ci0JCS8vIHJldHVybiAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBkZWxpdmVyYWJsZUxpc3QuZ2V0KDApOwotCQkvLyB9Ci0JCS8vIGlmIChkZWxpdmVyYWJsZUxpc3Quc2l6ZSgpID4gMSkgewotCQkvLyByZXR1cm4gRGVsaXZlcmFibGVTZWxlY3Rpb24uZ2V0U2VsZWN0ZWREZWxpdmVyYWJsZShkZWxpdmVyYWJsZUxpc3QsCi0JCS8vIHdwKTsKLQkJLy8gfQotCQkvLyB0aGVyZSBhcmUgbm8gZGVsaXZlcmFibGUgdG8gYXNzaWduCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFBMRUFTRSBET04nVCBDTEVBTiBVUC4gVGhpcyBtZXRob2QgaXMgY3VycmVudGx5IG5vdCB1c2VkIHNpbmNlIHdlCi0JICogc2h1dC1vZmYgYXV0b21hdGljIGFzc2lnbm1lbnQgb2YgZGVsaXZlcmFibGUuIEdldCBkZWxpdmVyYWJsZSBpbiBzY29wZQotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIEBwYXJhbSBkZWxpdmVyYWJsZUxpc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldERlbGl2ZXJhYmxlc0luU2NvcGUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlCcmVha2Rvd25FbGVtZW50IGUsIFdvcmtQcm9kdWN0IHdwLCBMaXN0IGRlbGl2ZXJhYmxlTGlzdCkgewotCQkvLyBnZXQgY2hpbGRyZW4gZm9yIGFjdGl2aXR5Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKGUpOwotCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmICgob2JqIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKQotCQkJCQkmJiAoUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgb2JqKSBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSkgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmo7Ci0KLQkJCQkvLyBnZXQgZGVsaXZlcmFibGUgcGFydHMgZnJvbSBkZWxpdmVyYWJsZQotCQkJCUxpc3QgcGFydHMgPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudExpc3Qod3BEZXNjCi0JCQkJCQkuZ2V0RGVsaXZlcmFibGVQYXJ0cygpKTsKLQkJCQlpZiAocGFydHMuY29udGFpbnMod3ApKSB7Ci0JCQkJCWRlbGl2ZXJhYmxlTGlzdC5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFyZW50Ci0JCU9iamVjdCBjdXJyZW50UGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlKTsKLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJLy8gZ28gdXAKLQkJCWdldERlbGl2ZXJhYmxlc0luU2NvcGUoYWRhcHRlckZhY3RvcnksCi0JCQkJCShCcmVha2Rvd25FbGVtZW50KSBjdXJyZW50UGFyZW50LCB3cCwgZGVsaXZlcmFibGVMaXN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBjYW4gYmUgbW9kaWZpZWQuIFRoaXMgaW5jbHVkZXMgbG9jayBjaGVjayBhbmQKLQkgKiBlZGl0IGNoZWNrLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHNoZWxsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBjaGVja01vZGlmeShFT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBzaGVsbCkgewotCQlpZiAoVG5nVXRpbC5pc0xvY2tlZChlbGVtZW50KSkgewotCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQKLQkJCQkJLmZvcm1hdCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5Vc2VySW50ZXJhY3Rpb25IZWxwZXJfbG9ja2VkUGx1Z2luLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0TmFtZSgpIH0pOyAKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldElkKCksIDAsIG1zZywgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tFZGl0KChFT2JqZWN0KSBlbGVtZW50LCBzaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciB1bm1vZGlmaWFibGUgcmVzb3VyY2VzLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZFJlc291cmNlcwotCSAqICAgICAgICAgICAgQSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcy4KLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgVGhlIGNvbnRleHQgb2YgdGhpcyBjYWxsLiBGb3IgUkNQLCB0aGlzIGlzIHRoZSBzaGVsbC4KLQkgKiBAcmV0dXJuIEFuIDxjb2RlPklTdGF0dXM8L2NvZGU+IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlcywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSUFjY2Vzc0NvbnRyb2xsZXIgYWMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCk7Ci0JCWlmIChhYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlSZXNvdXJjZVtdIHJlc291cmNlcyA9IG5ldyBSZXNvdXJjZVttb2RpZmllZFJlc291cmNlcy5zaXplKCldOwotCQltb2RpZmllZFJlc291cmNlcy50b0FycmF5KHJlc291cmNlcyk7Ci0JCXJldHVybiBhYy5jaGVja01vZGlmeShyZXNvdXJjZXMsIGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFdvcmtzcGFjZVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmICghcmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlyZXR1cm4gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrT3V0T2ZTeW5jaChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlBcnJheUxpc3Qgb3V0T2ZTeW5jaFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSBnZXRXb3Jrc3BhY2VSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQlpZiAod3NSZXNvdXJjZSAhPSBudWxsCi0JCQkJCSYmICF3c1Jlc291cmNlLmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9aRVJPKSkgewotCQkJCW91dE9mU3luY2hSZXNvdXJjZXMuYWRkKHdzUmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWlmIChvdXRPZlN5bmNoUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygKLQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssCi0JCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb3V0T2ZTeW5jaFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXNvdXJjZSA9IChJUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sCi0JCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCQkJCUlTdGF0dXMuT0ssIHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIG51bGwpOwotCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJfQotCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfdGl0bGU7Ci0JCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXBkYXRlX291dG9mc3luY2hfbXNnOwotCi0JCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQlyZXR1cm4gdWlIYW5kbGVyLnNlbGVjdE9uZShuZXcgaW50W10ge0lVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9PSywKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX0NBTkNFTH0sIHRpdGxlLCBtc2csIG11bHRpU3RhdHVzKSAhPSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgY2hhbmdlIHRvIHRoZSBnaXZlbiBmZWF0dXJlIG9mIHRoZSBnaXZlbiBmZWF0dXJlT3duZXIgd2lsbAotCSAqIG1vZGlmeSB0aGUgZWxlbWVudCBpbiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVPd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrTW9kaWZ5T3Bwb3NpdGUoTWV0aG9kRWxlbWVudCBmZWF0dXJlT3duZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlKGZlYXR1cmUpOwotCQlNdWx0aVJlc291cmNlRU9iamVjdCBtckVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0JCWlmIChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlOYW1lZEVsZW1lbnQgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUgPSAoTmFtZWRFbGVtZW50KSBtckVPYmoKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldChvcHBvc2l0ZUZlYXR1cmUpOwotCQkJaWYgKG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlICE9IG51bGwKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHN0aWxsIGluIHRoZSBsaWJyYXJ5IGFuZCBub3QKLQkJCQkJLy8gZGVsZXRlZCB5ZXQuCi0JCQkJCS8vCi0JCQkJCSYmIChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgfHwgb2xkT3Bwb3NpdGVGZWF0dXJlVmFsdWUKLQkJCQkJCQkuZUNvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJCSYmIG9sZE9wcG9zaXRlRmVhdHVyZVZhbHVlLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkvLyBzaW1wbGUgcmVqZWN0IGZvciA3LjAuMCByZWxlYXNlCi0JCQkJLy8KLQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdAotCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuVXNlckludGVyYWN0aW9uSGVscGVyX2VyclJlbGF0aW9uc2hpcEV4aXN0cywKLQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQllbGVtZW50LmdldE5hbWUoKSwKLQkJCQkJCQkJCQlUbmdVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0TGFiZWxXaXRoUGF0aChvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSksCi0JCQkJCQkJCQkJZmVhdHVyZU93bmVyLmdldE5hbWUoKSB9KTsKLQkJCQlNZXNzZW5nZXIuSU5TVEFOQ0Uuc2hvd1dhcm5pbmcoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5lcnJvckRpYWxvZ190aXRsZSwgbXNnKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkvLyBUT0RPOiB1bmNvbW1lbnQgdG8gdXNlIHRoaXMgY29kZSBmb3IgNy4wLjEgcmVsZWFzZQotCQkJCS8vCi0JCQkJLy8gU3RyaW5nIHRpdGxlID0gIlVwZGF0ZSBSZWxhdGlvbnNoaXAiOwotCQkJCS8vIFN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgiQWRkaW5nICcnezB9JycgdG8gJyd7MX0nJwotCQkJCS8vIHdpbGwgcmVtb3ZlICcnezB9JycgZnJvbSAnJ3syfScnLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8iCi0JCQkJLy8gLCBuZXcgT2JqZWN0W10geyBlbGVtZW50LmdldE5hbWUoKSwgZmVhdHVyZU93bmVyLmdldE5hbWUoKSwKLQkJCQkvLyBvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5nZXROYW1lKCkgfSk7Ci0JCQkJLy8gaWYoIUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlDb25maXJtYXRpb24odGl0bGUsCi0JCQkJLy8gbXNnKSkgewotCQkJCS8vIHJldHVybiBmYWxzZTsKLQkJCQkvLyB9Ci0JCQkJLy8JCQkJCi0JCQkJLy8gSVN0YXR1cyBzdGF0dXMgPQotCQkJCS8vIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShvbGRPcHBvc2l0ZUZlYXR1cmVWYWx1ZSwKLQkJCQkvLyBudWxsKTsKLQkJCQkvLyBpZighc3RhdHVzLmlzT0soKSkgewotCQkJCS8vIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLQkJCQkvLyAiQ2Fubm90IHVwZGF0ZSByZWxhdGlvbnNoaXAiLCBzdGF0dXMpOwotCQkJCS8vIHJldHVybiBmYWxzZTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ29uZmlndXJhdGlvbnNUb1VwZGF0ZShBZGRDb21tYW5kIGFkZENvbW1hbmQsCi0JCQlPYmplY3Qgc2hlbGwpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBhZGRDb21tYW5kLmdldE93bmVyKCk7Ci0JCWlmICghKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGFkZENvbW1hbmQuZ2V0RmVhdHVyZSgpOwotCQlpZiAoIShmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkKLQkJCQl8fCAhKChFUmVmZXJlbmNlKSBmZWF0dXJlKS5pc0NvbnRhaW5tZW50KCkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIHRoaXMgY29tbWFuZAotCQkvLyBjYW4gYmUgbW9kaWZpZWQKLQkJLy8KLQkJQXJyYXlMaXN0IGNvbmZpZ3NUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWV0aG9kUGFja2FnZSBwYXJlbnRQa2cgPSAoTWV0aG9kUGFja2FnZSkgcGFyZW50OwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGRDb21tYW5kLmdldENvbGxlY3Rpb24oKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQlUbmdVdGlsLmdldENvbmZpZ3VyYXRpb25zVG9VcGRhdGUocGFyZW50UGtnLAotCQkJCQkJKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQsIGNvbmZpZ3NUb1VwZGF0ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFjb25maWdzVG9VcGRhdGUuaXNFbXB0eSgpKSB7Ci0JCQlDb2xsZWN0aW9uIHJlc291cmNlc1RvQ2hlY2sgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlnc1RvVXBkYXRlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgY29uZmlnID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCVJlc291cmNlIHJlc291cmNlID0gY29uZmlnLmVSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjaGVjayBhZmZlY3RlZCByZXNvdXJjZXMgZm9yIHVubW9kaWZpYWJsZQotCQkJcmV0dXJuIFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShyZXNvdXJjZXNUb0NoZWNrLCBzaGVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbmZpcm1EZWVwQ29weShDb2xsZWN0aW9uIGFjdGl2aXRpZXMpIHsKLQkJaWYgKFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jYW5JbnRlcmFjdCgpKSB7Ci0JCQkvLyBjaGVja3MgaWYgdGhlIHBhdHRlcm4gb3IgYWN0aXZpdHkgY29udGFpbnMgYW55IGV4dGVuZGluZyBlbGVtZW50cwotCQkJLy8gYW5kIHByb21wdHMgdGhlIHVzZXIgaWYgaGUgcmVhbGx5Ci0JCQkvLyB3YW50cyB0byBkZWVwIGNvcHkgZHluYW1pY2FsbHkgbGlua2VkIGFjdGl2aXRpZXMgd2FybmluZyB0aGUKLQkJCS8vIHByb2Nlc3MgYXV0aG9yIHRoYXQgaGUgd2lsbCBnZXQgYSBjb3B5Ci0JCQkvLyBvZiBhbGwgZHluYW1pY2FsbHkgbGlua2VkIGVsZW1lbnRzIHRoYXQgaGUgbmVlZHMgdG8gbWFpbnRhaW4KLQkJCS8vIHNlcGFyYXRlbHkgZnJvbSBub3cgb24KLQkJCWJvb2xlYW4gcHJvbXB0TmVlZGVkID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eQotCQkJCQkJJiYgUHJvY2Vzc1V0aWwuaGFzSW5oZXJpdGVkKChBY3Rpdml0eSkgZSkpIHsKLQkJCQkJcHJvbXB0TmVlZGVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHByb21wdE5lZWRlZCkgewotCQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmRlZXBDb3B5X3RpdGxlOwotCQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWVwQ29weV9wcm9tcHRNc2c7Ci0JCQkJaW50IHJldCA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKQotCQkJCQkuc2VsZWN0T25lKG5ldyBpbnRbXSB7Ci0JCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywKLQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8KLQkJCQkJfSwgdGl0bGUsIG1zZywgbnVsbCk7Ci0JCQkJaWYgKHJldCA9PSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk8pIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHVzZXIgdG8gY2hvb3NlIGNvbmZpZ3VyYXRpb24gZm9yIGRlZXAgY29weQotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRQcm9jZXNzCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB1c2VyIGNhbmNlbGxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjaG9vc2VEZWVwQ29weUNvbmZpZ3VyYXRpb24oCi0JCQlQcm9jZXNzIHRhcmdldFByb2Nlc3MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZyA9IG51bGw7Ci0JCWlmIChmaWx0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhdG9yKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSAoKElDb25maWd1cmF0b3IpIGZpbHRlcikKLQkJCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmIChjdXJyZW50Q29uZmlnICE9IG51bGwKLQkJCQkJJiYgY3VycmVudENvbmZpZyAhPSB0YXJnZXRQcm9jZXNzLmdldERlZmF1bHRDb250ZXh0KCkpIHsKLQkJCQlpZiAoVXNlckludGVyYWN0aW9uSGVscGVyLmNhbkludGVyYWN0KCkpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLkFjdGl2aXR5RHJvcENvbW1hbmRfZGVlcENvcHlfcHJvbXB0Q29uZmlndXJhdGlvbk1zZzsKLQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQkJCQlpZih1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJaW50IHJldCA9IHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHsKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX1lFUywKLQkJCQkJCQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05PLAotCQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMCi0JCQkJCQkJfSwgTGlicmFyeUVkaXRSZXNvdXJjZXMuZGVlcENvcHlfdGl0bGUsIG1zZywgbnVsbCk7CQkJCQkJCi0JCQkJCQlzd2l0Y2ggKHJldCkgewotCQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTOgotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fTk86Ci0JCQkJCQkJZGVlcENvcHlDb25maWcgPSBjdXJyZW50Q29uZmlnOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMOgotCQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZWVwQ29weUNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnNBbGxvd2VkKFByb2Nlc3MgdGFyZ2V0UHJvY2VzcywgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJLy8gYXNrIHVzZXJzIHRvIGNvcHkgZXh0ZXJuYWwgY29udHJpYnV0aW9uKHMpL3JlcGxhY2VtZW50KHMpIGlmCi0JCS8vIGN1cnJlbnQgY29uZmlnIGlzIG5vdCB0aGUgZGVmYXVsdCBjb25maWcgb2YgdGhlIHRhcmdldCBwcm9jZXNzCi0JCS8vCi0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9ICgoSUNvbmZpZ3VyYXRvcikgZmlsdGVyKQotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJaWYgKGN1cnJlbnRDb25maWcgIT0gbnVsbAotCQkJCQkmJiBjdXJyZW50Q29uZmlnICE9IHRhcmdldFByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKSkgewkJCQkKLQkJCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfZGVlcF9jb3B5X3ZhcmlhYmlsaXR5X3Byb21wdDsKLQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCQkJaWYodWlIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJaW50IHJldCA9IHVpSGFuZGxlci5zZWxlY3RPbmUobmV3IGludFtdIHsKLQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTLAotCQkJCQkJCUlVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9OTywKLQkJCQkJCQlJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fQ0FOQ0VMCi0JCQkJCQl9LCBMaWJyYXJ5RWRpdFJlc291cmNlcy5kZWVwQ29weV90aXRsZSwgbXNnLCBudWxsKTsJCQkJCQkKLQkJCQkJc3dpdGNoIChyZXQpIHsKLQkJCQkJY2FzZSBJVXNlckludGVyYWN0aW9uSGFuZGxlci5BQ1RJT05fWUVTOgotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCWNhc2UgSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuQUNUSU9OX05POgotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQljYXNlIElVc2VySW50ZXJhY3Rpb25IYW5kbGVyLkFDVElPTl9DQU5DRUw6Ci0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJVUlIZWxwZXIgZ2V0VUlIZWxwZXIoKSB7Ci0JCXJldHVybiB1aUhlbHBlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMzNzNkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnRpbmcgZGlhbG9ncyBmb3Igc2VsZWN0aW5nIGFuZCBlZGl0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9BY3Rpdml0eUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyYmE2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5VbmV4ZWN1dGFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuQ29weUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBVc2VkIHRvIGV4dGVuZC9jb3B5IGFjdGl2aXRpZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5SGFuZGxlciB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdDxQcm9jZXNzUGFja2FnZT4gcHJvY1BhY2thZ2VzOwotCQotCS8qKgotCSAqIExpc3Qgb2YgYWN0aXZpdGllcyBvciBhY3Rpdml0eSB3cmFwcGVycyB0byBkZWVwIGNvcHkuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8T2JqZWN0PiBhY3Rpdml0aWVzVG9EZWVwQ29weTsJCi0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnOwkKLQlwcml2YXRlIExpc3QgZGVlcENvcGllczsKLQlwcml2YXRlIE1hcCBkZWVwQ29weVRvT3JpZ2luYWxNYXA7Ci0JcHJpdmF0ZSBBcnJheUxpc3Q8QWN0aXZpdHk+IGFjdGl2aXRpZXM7Ci0KLQlwcml2YXRlIE1hcCBjb3B5VG9PcmlnaW5hbDsKLQkKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCQotCXByaXZhdGUgSGVscGVyIGNvcHlIZWxwZXI7Ci0JCi0JcHJpdmF0ZSBDb3B5SGVscGVyIGRlZXBDb3B5SGVscGVyOwotCi0JcHJpdmF0ZSBQcm9jZXNzIHRhcmdldFByb2Nlc3M7Ci0JCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JCi0JcHJpdmF0ZSBJQ29uZmlndXJhdG9yIGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMgPSB0cnVlOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBBY3Rpdml0eUhhbmRsZXIKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlIYW5kbGVyKCkgewotCQlhY3Rpdml0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhY3Rpdml0aWVzVG9EZWVwQ29weSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlkZWVwQ29waWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljb3B5VG9PcmlnaW5hbCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb2NQYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsJCi0JCWNvcHlIZWxwZXIgPSBuZXcgSGVscGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWFjdGl2aXRpZXMuY2xlYXIoKTsKLQkJYWN0aXZpdGllc1RvRGVlcENvcHkuY2xlYXIoKTsKLQkJY29weVRvT3JpZ2luYWwuY2xlYXIoKTsKLQkJcHJvY1BhY2thZ2VzLmNsZWFyKCk7Ci0JCWNvcHlIZWxwZXIuY2xlYXIoKTsJCQotCQlkZWVwQ29waWVzLmNsZWFyKCk7CQkKLQkJaWYoZGVlcENvcHlIZWxwZXIgIT0gbnVsbCkgewotCQkJZGVlcENvcHlIZWxwZXIuY2xlYXIoKTsKLQkJfQotCQlkZWVwQ29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29weUV4dGVybmFsVmFyaWF0aW9ucyhib29sZWFuIGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMpIHsKLQkJdGhpcy5jb3B5RXh0ZXJuYWxWYXJpYXRpb25zID0gY29weUV4dGVybmFsVmFyaWF0aW9uczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29weShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlwcm9jUGFja2FnZXMuYWRkKChQcm9jZXNzUGFja2FnZSkgYWN0aXZpdHkuZUNvbnRhaW5lcigpKTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0RGVlcENvcHlDb25maWcoKSB7Ci0JCXJldHVybiBkZWVwQ29weUNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWVwQ29weUNvbmZpZyhNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnKSB7Ci0JCXRoaXMuZGVlcENvcHlDb25maWcgPSBkZWVwQ29weUNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIFByb2Nlc3MgZ2V0VGFyZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHRhcmdldFByb2Nlc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYykgewotCQl0YXJnZXRQcm9jZXNzID0gcHJvYzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXREZWVwQ29waWVzKCkgewotCQlyZXR1cm4gZGVlcENvcGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWVwQ29weShPYmplY3QgYWN0aXZpdHlPcldyYXBwZXIpIHsKLQkJT2JqZWN0IHVud3JhcHBlZCA9IFRuZ1V0aWwudW53cmFwKGFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJaWYodW53cmFwcGVkIGluc3RhbmNlb2YgQWN0aXZpdHkgJiYgKChBY3Rpdml0eSl1bndyYXBwZWQpLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlhY3Rpdml0aWVzVG9EZWVwQ29weS5hZGQoYWN0aXZpdHlPcldyYXBwZXIpOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBleHRlbmQoQWN0aXZpdHkgYWN0KSB7Ci0JCUFjdGl2aXR5IGV4dGVuZGVkQWN0ID0gUHJvY2Vzc1V0aWwuZ2VuZXJhbGl6ZShhY3QsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlhY3Rpdml0aWVzLmFkZChleHRlbmRlZEFjdCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0PEFjdGl2aXR5PiBnZXRBY3Rpdml0aWVzKCkgewotCQlpZiAoIXByb2NQYWNrYWdlcy5pc0VtcHR5KCkgfHwgIWFjdGl2aXRpZXNUb0RlZXBDb3B5LmlzRW1wdHkoKSkgewotCQkJZWRpdGluZ0RvbWFpbiA9IG5ldyBUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQkJCWlmKCFwcm9jUGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0JCQkJYWN0aXZpdGllcy5hZGRBbGwoY29weShwcm9jUGFja2FnZXMpKTsKLQkJCX0KLQkJCWlmKCFhY3Rpdml0aWVzVG9EZWVwQ29weS5pc0VtcHR5KCkpIHsKLQkJCQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQl9Ci0JCQkJZm9yIChPYmplY3QgYWN0IDogYWN0aXZpdGllc1RvRGVlcENvcHkpIHsKLQkJCQkJQWN0aXZpdHlEZWVwQ29weUNvbW1hbmQgY21kID0gbmV3IEFjdGl2aXR5RGVlcENvcHlDb21tYW5kKAotCQkJCQkJCWFjdCwgZ2V0RGVlcENvcHlIZWxwZXIoKSwgZGVlcENvcHlDb25maWcsIHRhcmdldFByb2Nlc3MsIG1vbml0b3IsYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcik7Ci0JCQkJCWNtZC5zZXRDb3B5RXh0ZXJuYWxWYXJpYXRpb25zKGNvcHlFeHRlcm5hbFZhcmlhdGlvbnMpOwotCQkJCQl0cnkgewotCQkJCQkJbG9uZyB0aW1lID0gMDsKLQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJfQotCQkJCQkJY21kLmV4ZWN1dGUoKTsKLQkJCQkJCWlmIChUbmdVdGlsLkRFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIkFjdGl2aXR5RGVlcENvcHlDb21tYW5kIGV4ZWN1dGVkOiAiCi0JCQkJCQkJCQkJCSsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkKLQkJCQkJCQkJCQkJKyAiIG1zIik7Ci0JCQkJCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJfQotCQkJCQkJQ29sbGVjdGlvbjw/PiByZXN1bHQgPSBjbWQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQlpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlBY3Rpdml0eSBkZWVwQ29weSA9IChBY3Rpdml0eSkgcmVzdWx0Lml0ZXJhdG9yKCkKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCS5maXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseShkZWVwQ29weSk7Ci0JCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJQcm9jZXNzVXRpbC5maXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseSgpOiAiCi0JCQkJCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpCi0JCQkJCQkJCQkJCQkrICIgbXMiKTsKLQkJCQkJCQkJdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkJCX0KLQkJCQkJCQljbWQuY29weVN1cHByZXNzaW9uU3RhdGVzKCk7Ci0JCQkJCQkJaWYgKFRuZ1V0aWwuREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJBY3Rpdml0eURlZXBDb3B5Q29tbWFuZC5jb3B5U3VwcHJlc3Npb25TdGF0ZXMoKTogIgotCQkJCQkJCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKQotCQkJCQkJCQkJCQkJKyAiIG1zIik7Ci0JCQkJCQkJCXRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZGVlcENvcGllcy5hZGQoZGVlcENvcHkpOwotCQkJCQkJCWRlZXBDb3B5VG9PcmlnaW5hbE1hcC5wdXQoZGVlcENvcHksIGFjdCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQljbWQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYWN0aXZpdGllcy5hZGRBbGwoZGVlcENvcGllcyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVByZWRlY2Vzc29ycyhMaXN0IHdvcmtCcmVha2Rvd25FbGVtZW50cykgewotCQkvLyBnZXQgdGhlIHByZWRlc3NvciBsaXN0cyBvZiBvcmlnaW5hbCB3b3JrIGJyZWFrZG93biBlbGVtZW50cwotCQkvLwotCQlMaXN0IHByZWRlY2Vzc29yTGlzdHMgPSBuZXcgQXJyYXlMaXN0KCk7CQkKLQkJT2JqZWN0IG9yaWdpbmFsID0gY29weVRvT3JpZ2luYWwuZ2V0KHdvcmtCcmVha2Rvd25FbGVtZW50cy5nZXQoMCkpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGVkaXRpbmdEb21haW4uZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob3JpZ2luYWwsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWludCBmaXJzdElEID0gYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKTsgCi0JCXByZWRlY2Vzc29yTGlzdHMuYWRkKGJzSXRlbVByb3ZpZGVyLmdldFByZWRlY2Vzc29ycygpKTsKLQkJLy8gSXRlbSBwcm92aWRlciBvZiBsYXN0IHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gdGhlIHN1YnRyZWUgd2hvc2Ugcm9vdCBpcyBvcmlnaW5hbCBhY3Rpdml0eQotCQlJQlNJdGVtUHJvdmlkZXIgbGFzdFdCSXAgPSBudWxsOwotCQlmb3IoSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihhZGFwdGVyRmFjdG9yeSwgb3JpZ2luYWwsIGZhbHNlKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZihlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlJQlNJdGVtUHJvdmlkZXIgYnNJcCA9IG51bGw7Ci0JCQkJaWYob2JqIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWJzSXAgPSAoKElCU0l0ZW1Qcm92aWRlcilvYmopOwotCQkJCQlwcmVkZWNlc3Nvckxpc3RzLmFkZChic0lwLmdldFByZWRlY2Vzc29ycygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCU9iamVjdCBpcCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJaWYoaXAgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCWJzSXAgPSAoKElCU0l0ZW1Qcm92aWRlcilpcCk7Ci0JCQkJCQlwcmVkZWNlc3Nvckxpc3RzLmFkZChic0lwLmdldFByZWRlY2Vzc29ycygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihic0lwICE9IG51bGwpIHsKLQkJCQkJbGFzdFdCSXAgPSBic0lwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgbGFzdElEID0gbGFzdFdCSXAgIT0gbnVsbCA/IGxhc3RXQklwLmdldElkKCkgOiBmaXJzdElEOwotCQkKLQkJLy8gdXBkYXRlIHByZWRlY2Vzc29ycwotCQkvLwotCQlpbnQgc2l6ZSA9IHdvcmtCcmVha2Rvd25FbGVtZW50cy5zaXplKCk7Ci0JCUFzc2VydC5pc1RydWUoc2l6ZSA9PSBwcmVkZWNlc3Nvckxpc3RzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB3b3JrQnJlYWtkb3duRWxlbWVudHMuZ2V0KGkpOwotCQkJZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQlQcmVkZWNlc3Nvckxpc3QgcHJlZExpc3QgPSAoUHJlZGVjZXNzb3JMaXN0KSBwcmVkZWNlc3Nvckxpc3RzLmdldChpKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcmVkTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaW50IGlkID0gYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKTsKLQkJCQlpZihpZCA+PSBmaXJzdElEICYmIGlkIDw9IGxhc3RJRCkgewotCQkJCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB3b3JrQnJlYWtkb3duRWxlbWVudHMuZ2V0KGlkIC0gZmlyc3RJRCk7Ci0JCQkJCWUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGQoVW1hVXRpbC5jcmVhdGVEZWZhdWx0V29ya09yZGVyKGUsIHByZWQpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHByZWRlY2Vzc29yIGlzIG91dHNpZGUgb2YgdGhlIHN1YnRyZWUsIGRvbid0IHNlbGVjdCBpdCBmb3Igbm93Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjw/PiBjb3B5UHJvY2Vzc1BhY2thZ2VzKENvbGxlY3Rpb248UHJvY2Vzc1BhY2thZ2U+IHByb2NQYWNrYWdlcykgewotCQlDb21tYW5kIGNvbW1hbmQgPSBjcmVhdGVDb3B5Q29tbWFuZChlZGl0aW5nRG9tYWluLCBwcm9jUGFja2FnZXMpOwotCQlpZihjb21tYW5kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQkJcmV0dXJuIGNvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQl9IGZpbmFsbHkgewkJCQotCQkJCWNvbW1hbmQuZGlzcG9zZSgpOwkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkJCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGEgY29tbWFuZCB0aGF0IGNvcGllcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiBvYmplY3RzLiBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBtb3JlIHRoYW4gb25lIG9iamVjdCwKLQkgKiB0aGVuIGEgY29tcG91bmQgY29tbWFuZCB3aWxsIGJlIGNyZWF0ZWQgY29udGFpbmluZyBpbmRpdmlkdWFsIGNvcHkgY29tbWFuZHMgZm9yIGVhY2ggb2JqZWN0LgotCSAqLwotCXByaXZhdGUgQ29tbWFuZCBjcmVhdGVDb3B5Q29tbWFuZChmaW5hbCBFZGl0aW5nRG9tYWluIGRvbWFpbiwgZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKQotCXsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCB8fCBjb2xsZWN0aW9uLmlzRW1wdHkoKSkgCi0JCXsKLQkJCXJldHVybiBVbmV4ZWN1dGFibGVDb21tYW5kLklOU1RBTkNFOwotCQl9Ci0KLQkJQ29tcG91bmRDb21tYW5kIGNvcHlDb21tYW5kID0gbmV3IENvbXBvdW5kQ29tbWFuZChDb21wb3VuZENvbW1hbmQuTUVSR0VfQ09NTUFORF9BTEwpOwotCQlmb3IgKEl0ZXJhdG9yIG9iamVjdHMgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7IG9iamVjdHMuaGFzTmV4dCgpOyApCi0JCXsKLQkJCWNvcHlDb21tYW5kLmFwcGVuZChkb21haW4uY3JlYXRlQ29tbWFuZChDb3B5Q29tbWFuZC5jbGFzcywgbmV3IENvbW1hbmRQYXJhbWV0ZXIob2JqZWN0cy5uZXh0KCksIG51bGwsIGNvcHlIZWxwZXIpKSk7Ci0JCX0KLQotCQlyZXR1cm4gY29weUNvbW1hbmQudW53cmFwKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBwcm9jZXNzIHBhY2thZ2VzCi0JICogCi0JICogQHBhcmFtIGVkaXRpbmdEb21haW4KLQkgKiBAcGFyYW0gcHJvY1BhY2thZ2VzCi0JICogQHJldHVybiBhY3Rpdml0aWVzIG9mIHRoZSBjb3BpZXMKLQkgKi8KLQlwcml2YXRlIExpc3Q8QWN0aXZpdHk+IGNvcHkoTGlzdDxQcm9jZXNzUGFja2FnZT4gcHJvY1BhY2thZ2VzKSB7Ci0JCUNvbGxlY3Rpb248Pz4gY29weVBhY2thZ2VzID0gY29weVByb2Nlc3NQYWNrYWdlcyhwcm9jUGFja2FnZXMpOwotCQlBcnJheUxpc3Q8QWN0aXZpdHk+IGFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0PEFjdGl2aXR5PigpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBjb3B5UGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBjb3B5ID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb3B5IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCUFjdGl2aXR5IGFjdENvcHkgPSAoKFByb2Nlc3NDb21wb25lbnQpIGNvcHkpCi0JCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkvLyBjb3B5IGRhdGEgZnJvbSBQcm9jZXNzQ29tcG9uZW50IHRvIGEgbmV3Ci0JCQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJCQlQcm9jZXNzUGFja2FnZSBwa2dDb3B5ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQlwa2dDb3B5LnNldE5hbWUoYWN0Q29weS5nZXROYW1lKCkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGFjdENvcHkpOwotCQkJCXBrZ0NvcHkuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkJY29weS5nZXRQcm9jZXNzRWxlbWVudHMoKSk7Ci0JCQkJcGtnQ29weS5nZXREaWFncmFtcygpLmFkZEFsbChjb3B5LmdldERpYWdyYW1zKCkpOwotCQkJCXBrZ0NvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJCWNvcHkuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQkJCQkKLQkJCQlhY3Rpdml0aWVzLmFkZChhY3RDb3B5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYWN0aXZpdGllcy5hZGQoUHJvY2Vzc1V0aWwuZmluZEFjdGl2aXR5KGNvcHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYWN0aXZpdGllczsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldERlZXBDb3B5VG9PcmlnaW5hbE1hcCgpIHsKLQkJcmV0dXJuIGRlZXBDb3B5VG9PcmlnaW5hbE1hcDsKLQl9Ci0JCi0JcHVibGljIEhlbHBlciBnZXRDb3B5SGVscGVyKCl7Ci0JCXJldHVybiBjb3B5SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgQ29weUhlbHBlciBnZXREZWVwQ29weUhlbHBlcigpIHsKLQkJaWYoZGVlcENvcHlIZWxwZXIgPT0gbnVsbCkgewotCQkJZGVlcENvcHlIZWxwZXIgPSBuZXcgQ29weUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBkZWVwQ29weUhlbHBlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKAotCQkJSUNvbmZpZ3VyYXRvciBhY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKSB7Ci0JCXRoaXMuYWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvciA9IGFjdGl2aXR5RGVlcENvcHlDb25maWd1cmF0b3I7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FjdGl2aXR5VHJlZUl0ZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlUcmVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkOTFjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWN0aXZpdHlUcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLQotLyoqCi0gKiBJbnRlcmF0b3IgdXNlZCB0byBpdGVyYXRlIHRoZSBicmVha2Rvd24gZWxlbWVudCB0cmVlIG9mIGFuIGFjdGl2aXR5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVRyZWVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY0MDIwMTc3NjgyMDU2NDIwNjhMOwotCi0JcHVibGljIEFjdGl2aXR5VHJlZUl0ZXJhdG9yKEFjdGl2aXR5IGFjdCkgewotCQlzdXBlcihhY3QsIGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0FkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEl0ZW1MYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5SXRlbUxhYmVsUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkgICAgLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCS8vCi0JCUlJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iamVjdCwgSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQotCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iamVjdCkKLQkJCQk6IHN1cGVyLmdldEltYWdlKG9iamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JICAgIC8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQkvLwotCQlJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSAoSUl0ZW1MYWJlbFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmplY3QsIElJdGVtTGFiZWxQcm92aWRlci5jbGFzcyk7Ci0KLQkJcmV0dXJuIGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwgPyBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KG9iamVjdCkKLQkJCQk6IHN1cGVyLmdldFRleHQob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ2F0ZWdvcnlTb3J0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjU4MjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NhdGVnb3J5U29ydEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIHNvcnRpbmcgb2YgQ2F0ZWdvcnkgZWxlbWVudHMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENhdGVnb3J5U29ydEhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEUgPSAiQ2F0ZWdvcnlFbGVtZW50c1NvcnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQSA9ICJBbHBoYWJldGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBID0gIlJldmVyc2VBbHBoYWJldGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NRVRIT0RfVFlQRSA9ICJNZXRob2RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwgPSAiTWFudWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHkgdG8gc3RvcmUgdGhlIENhdGVnb3J5IHNvcnQgdHlwZQotCSAqIEBwYXJhbSBzb3J0VHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVOZXdTb3J0UHJvcGVydHkoU3RyaW5nIHNvcnRUeXBlKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCXByb3Auc2V0TmFtZShLRVlfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRSk7Ci0JCWlmIChzb3J0VHlwZSAhPSBudWxsKSB7Ci0JCQlwcm9wLnNldFZhbHVlKHNvcnRUeXBlKTsKLQkJfQotCQlyZXR1cm4gcHJvcDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGNhdGVnb3J5IHNvcnQgcHJvcGVydHkgZm9yIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICogCQkgcHJvcGVydHkgaWYgZm91bmQsIGVsc2UgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudFByb3BlcnR5IGdldENhdGVnb3J5U29ydFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IHByb3BzID0gZWxlbWVudC5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKEtFWV9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFLmVxdWFscyhwcm9wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvcDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogcmV0dXJuIHRydWUgaWZmIHRoZSBjYXRlZ29yeSBzb3J0LXR5cGUgaXMgc2V0IHRvIG1hbnVhbAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJIHByb3BlcnR5IGlmIGZvdW5kLCBlbHNlIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYW51YWxDYXRlZ29yeVNvcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBzb3J0VHlwZSA9IGdldENhdGVnb3J5U29ydFZhbHVlKGVsZW1lbnQpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzb3J0LXR5cGUgZm9yIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50LgotCSAqIElmIG5vbmUgaXMgc2V0LCB3aWxsIHJldHVybiBBbHBoYWJldGljIHNvcnQgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQSkgYXMgYSBkZWZhdWx0Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gZ2V0Q2F0ZWdvcnlTb3J0UHJvcGVydHkoZWxlbWVudCk7Ci0JCWlmIChwcm9wID09IG51bGwpCi0JCQlyZXR1cm4gVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTDsKLQkJcmV0dXJuIHByb3AuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRDYXRlZ29yeVNvcnRUeXBlcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJldHVybkxpc3QgPSBBcnJheXMuPFN0cmluZz5hc0xpc3QoCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTCwKLQkJCQlWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEsCi0JCQkJVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFKTsKLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U29ydFR5cGVEaXNwbGF5TmFtZShTdHJpbmcgc29ydFR5cGUpIHsKLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9BTFBIQS5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU29ydFR5cGVfQWxwaGFiZXRpYzsKLQkJfQotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX1JFVkVSU0VfQUxQSEEuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX1JldmVyc2VBbHBoYWJldGljOwotCQl9Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUVUSE9EX1RZUEUuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01ldGhvZFR5cGU7Ci0JCX0KLQkJaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9NQU5VQUwuZXF1YWxzKHNvcnRUeXBlKSkgewotCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLlNvcnRUeXBlX01hbnVhbDsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHNvcnRlZCBjYXRlZ29yeSBlbGVtZW50IGxpc3QgYmFzZWQgb24gdGhlIGNhdGVnb3J5J3Mgc29ydCB0eXBlCi0JICogUmVzcGVjdHMgdGhlIE5hbWUvUHJlc05hbWUgdG9nZ2xlCi0JICogQHBhcmFtIGVsZW1lbnQgCi0JICogQHBhcmFtIGVsZW1lbnRzIGFycmF5IHRvIHNvcnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdD4gc29ydENhdGVnb3J5RWxlbWVudHMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPYmplY3RbXSBlbGVtZW50cykgewotCQlyZXR1cm4gc29ydENhdGVnb3J5RWxlbWVudHMoZWxlbWVudCwgZWxlbWVudHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc29ydGVkIGNhdGVnb3J5IGVsZW1lbnQgbGlzdCBiYXNlZCBvbiB0aGUgY2F0ZWdvcnkncyBzb3J0IHR5cGUKLQkgKiBAcGFyYW0gZWxlbWVudCAKLQkgKiBAcGFyYW0gZWxlbWVudHMgYXJyYXkgdG8gc29ydAotCSAqIEBwYXJhbSBmb3JjZVByZXNOYW1lU29ydCB0cnVlIHRvIGFsd2F5cyBzb3J0IGJ5IHByZXNOYW1lLiBmYWxzZSB3aWxsIHJlc3BlY3QgdGhlIHRvZ2dsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0PiBzb3J0Q2F0ZWdvcnlFbGVtZW50cyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9iamVjdFtdIGVsZW1lbnRzLCBib29sZWFuIGZvcmNlUHJlc05hbWVTb3J0KSB7Ci0JCS8qCi0JCSAqIFRPRE86IGNhbid0IHVzZSBnZW5lcmljcyBoZXJlIGJlY2F1c2UgRU1GIGRvZXNuJ3QgdXNlIHRoZW0geWV0IC0gdGhlIGVsZW1lbnRzIHBhcmFtCi0JCSAqIHVzdWFsbHkgY29tZXMgZnJvbSBDb250ZW50RWxlbWVudHNPcmRlckxpc3QgY2xhc3Mgd2hpY2ggZXh0ZW5kcyBFTUYncyBCYXNpY0VMaXN0IGFuZCBzbwotCQkgKiB0aGUgdG9BcnJheSgpIG1ldGhvZCB3aWxsIG9ubHkgcmV0dXJuIE9iamVjdFtdCi0JCSAqLwotCQlMaXN0PE9iamVjdD4gcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihBcnJheXMuPE9iamVjdD5hc0xpc3QoZWxlbWVudHMpKTsKLQkJU3RyaW5nIHNvcnRUeXBlID0gZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoZWxlbWVudCk7Ci0JCWlmIChWX0NBVEVHT1JZX0VMRU1FTlRTX19TT1JUX1RZUEVfTUFOVUFMLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGZpbmRNYW51YWxTb3J0T3JkZXJJbkNvbnRyaWJ1dG9ycygoQ29udGVudENhdGVnb3J5KWVsZW1lbnQsIHJldHVybkxpc3QpOwotCQkJfQotCQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0Q29tcGFyYXRvcigpOwotCQkJaWYgKGZvcmNlUHJlc05hbWVTb3J0KQotCQkJCWNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPE9iamVjdD5zb3J0KHJldHVybkxpc3QsIGNvbXBhcmF0b3IpOwotCQl9IGVsc2UgaWYgKFZfQ0FURUdPUllfRUxFTUVOVFNfX1NPUlRfVFlQRV9SRVZFUlNFX0FMUEhBLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UmV2ZXJzZUNvbXBhcmF0b3IoKTsKLQkJCWlmIChmb3JjZVByZXNOYW1lU29ydCkKLQkJCQljb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZVJldmVyc2VDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48T2JqZWN0PnNvcnQocmV0dXJuTGlzdCwgY29tcGFyYXRvcik7Ci0JCX0gZWxzZSBpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01FVEhPRF9UWVBFLmVxdWFscyhzb3J0VHlwZSkpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFR5cGVDb21wYXJhdG9yKCk7Ci0JCQlpZiAoZm9yY2VQcmVzTmFtZVNvcnQpCi0JCQkJY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVNZXRob2RFbGVtZW50VHlwZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxPYmplY3Q+c29ydChyZXR1cm5MaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gcmV0dXJuTGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxPYmplY3Q+IGZpbmRNYW51YWxTb3J0T3JkZXJJbkNvbnRyaWJ1dG9ycyhDb250ZW50Q2F0ZWdvcnkgY2MsIExpc3Q8T2JqZWN0PiBlbGVtZW50TGlzdCkgewotCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGd1aWRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+KCk7Ci0KLQkJU3RyaW5nIHNvcnRUeXBlID0gZ2V0Q2F0ZWdvcnlTb3J0VmFsdWUoY2MpOwotCQlpZiAoVl9DQVRFR09SWV9FTEVNRU5UU19fU09SVF9UWVBFX01BTlVBTC5lcXVhbHMoc29ydFR5cGUpKSB7Ci0JCQkvLyBzZXQgdXAgR1VJRCBtYXAKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWd1aWRNYXAucHV0KCgoTWV0aG9kRWxlbWVudClvKS5nZXRHdWlkKCksCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpbyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVG5nVXRpbC5nZXRDb250cmlidXRvcnMoY2MpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250cmlidXRvciA9IChDb250ZW50Q2F0ZWdvcnkpb2JqOwotCQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oY29udHJpYnV0b3IsIENvbnRlbnRFbGVtZW50T3JkZXJMaXN0Lk9SREVSX0lORk9fTkFNRSk7Ci0JCQkJCWlmIChvcmRlckluZm8gPT0gbnVsbCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJLy8gZmluZCBsYXRlc3QgT3JkZXJJbmZvIHRoYXQgY29udGFpbnMgYWxsIHRoZXNlIGVsZW1lbnRzCi0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwgfHwgb3JkZXJJbmZvLmdldFRpbWVzdGFtcCgpID4gbGF0ZXN0SW5mby5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQlMaXN0PE9iamVjdD4gcmV0dXJuTGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQkJCS8vIHNvcnQgbGlzdCBhY2NvcmRpbmcgdG8gb3JkZXJJbmZvCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gKFN0cmluZylsYXRlc3RJbmZvLmdldEdVSURzKCkuZ2V0KGkpOwotCQkJCQlPYmplY3QgZWxlbWVudCA9IGd1aWRNYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm5MaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJCWd1aWRNYXAucmVtb3ZlKGd1aWQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgZWxlbWVudCBpbiB0aGUgZ3VpZE1hcCB0aGF0IGhhcyBhIGdlbmVyYWxpemVyIHdpdGggImd1aWQiCi0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gZmluZEVsZW1lbnRJbkdlbmVyYWxpemVyTGlzdChndWlkTWFwLCBndWlkKTsKLQkJCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuTGlzdC5hZGQobWUpOwotCQkJCQkJCWd1aWRNYXAucmVtb3ZlKGd1aWQpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBjb3VsZCBub3QgbG9jYXRlLCB3aWxsIHJldHVybiBvcmlnaW5hbCBsaXN0Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnRMaXN0LnNpemUoKSA9PSByZXR1cm5MaXN0LnNpemUoKSkKLQkJCQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRMaXN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNZXRob2RFbGVtZW50IGZpbmRFbGVtZW50SW5HZW5lcmFsaXplckxpc3QoTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gZ3VpZE1hcCwgU3RyaW5nIGd1aWQpIHsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RFbGVtZW50PiBpdGVyID0gZ3VpZE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCB2YWx1ZSA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJZm9yIChJdGVyYXRvciBnZW5JdGVyID0gVG5nVXRpbC5nZXRHZW5lcmFsaXplcnMoKFZhcmlhYmlsaXR5RWxlbWVudCl2YWx1ZSk7Z2VuSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBnZW5lcmFsaXplciA9IGdlbkl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZ2VuZXJhbGl6ZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlpZiAoKChNZXRob2RFbGVtZW50KWdlbmVyYWxpemVyKS5nZXRHdWlkKCkuZXF1YWxzKGd1aWQpKSB7Ci0JCQkJCQkJcmV0dXJuIChNZXRob2RFbGVtZW50KWdlbmVyYWxpemVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY2MKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmVlZFRvU29ydChNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4gJiYgCi0JCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUb29sICYmIAotCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0VHlwZSAmJiAKLQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbXBhcmF0b3JzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29tcGFyYXRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwN2IyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29tcGFyYXRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5QbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIGNvbXBhcmF0b3JzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb21wYXJhdG9ycyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T2JqZWN0PiBERUZBVUxUX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlPYmplY3QgbzF1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlPYmplY3QgbzJ1bndyYXAgPSBUbmdVdGlsLnVud3JhcChvMik7Ci0JCQlpZiAobzF1bndyYXAgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCSYmIG8ydW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiBjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFJFVkVSU0VfREVGQVVMVF9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCUNvbGxhdG9yIGNvbGxhdG9yID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkJCWlmIChvMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgbzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG9wcG9zaXRlVmFsdWUoY29sbGF0b3IuY29tcGFyZSgoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCksICgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSkpOwotCQkJfQotCQkJT2JqZWN0IG8xdW53cmFwID0gVG5nVXRpbC51bndyYXAobzEpOwotCQkJT2JqZWN0IG8ydW53cmFwID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJaWYgKG8xdW53cmFwIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiBvMnVud3JhcCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gb3Bwb3NpdGVWYWx1ZShjb2xsYXRvci5jb21wYXJlKCgoTWV0aG9kRWxlbWVudCkgbzF1bndyYXApLmdldE5hbWUoKSwgKChNZXRob2RFbGVtZW50KSBvMnVud3JhcCkuZ2V0TmFtZSgpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgb3Bwb3NpdGVWYWx1ZShpbnQgdmFsKSB7Ci0JCWlmICh2YWwgIT0gMCkgewotCQkJdmFsID0gMCAtIHZhbDsKLQkJfQotCQlyZXR1cm4gdmFsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUeXBlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxPYmplY3Q+IGdldERlZmF1bHRDb21wYXJhdG9yKCkgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRPcmRlcklkKE9iamVjdCBvYmopOwotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCWlmIChvMSA9PSBvMikKLQkJCQlyZXR1cm4gMDsKLQkJCWludCByZXQgPSAwOwotCQkJcmV0ID0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzEpIC0gZ2V0T3JkZXJJZCgoRU9iamVjdCkgbzIpOwotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRDb21wYXJhdG9yKCkuY29tcGFyZShvMSwgbzIpOwotCQkJfQotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZTEsIE1ldGhvZEVsZW1lbnQgZTIpIHsKLQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmcgbmFtZTEgPSBlMSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgPyBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KWUxKQotCQkJCTogZTEuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlpZiAobmFtZTEubGVuZ3RoKCkgPCAxKSBuYW1lMSA9IGUxLmdldE5hbWUoKTsKLQkJU3RyaW5nIG5hbWUyID0gZTIgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ID8gUHJvY2Vzc1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZSgoQnJlYWtkb3duRWxlbWVudCllMikKLQkJCQk6IGUyLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJaWYgKG5hbWUyLmxlbmd0aCgpIDwgMSkgbmFtZTIgPSBlMi5nZXROYW1lKCk7Ci0JCXJldHVybiBjb2xsYXRvci5jb21wYXJlKG5hbWUxLCBuYW1lMik7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBUbmdVdGlsLnVud3JhcChvYmopOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkKLQkJCW9iamVjdCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgb2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudClvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZiAobzEgPT0gbzIpCi0JCQkJcmV0dXJuIDA7Ci0JCQlvMSA9IGdldE1ldGhvZEVsZW1lbnQobzEpOwotCQkJaWYgKG8xID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQotCQkJbzIgPSBnZXRNZXRob2RFbGVtZW50KG8yKTsKLQkJCWlmIChvMiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wYXJlUHJlc2VudGF0aW9uTmFtZSgoTWV0aG9kRWxlbWVudCkgbzEsIChNZXRob2RFbGVtZW50KSBvMik7Ci0JCX0KLQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE9iamVjdD4gUkVWRVJTRV9QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJaWYoIShvMSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkpIHsKLQkJCQlvMSA9IFRuZ1V0aWwudW53cmFwKG8xKTsKLQkJCQlpZighKG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZighKG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSkgewotCQkJCW8yID0gVG5nVXRpbC51bndyYXAobzIpOwotCQkJCWlmKCEobzIgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBvcHBvc2l0ZVZhbHVlKGNvbXBhcmVQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG8xLCAoRGVzY3JpYmFibGVFbGVtZW50KSBvMikpOwotCQl9Ci0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIE1FVEhPRF9UWVBFX0NPTVBBUkFUT1IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRDb21wYXJhdG9yKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgaW50IGdldE9yZGVySWQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlpbnQgaWQgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCQkJaWYgKGlkID09IFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OKSB7Ci0JCQkJCWlkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQkJfQotCQkJCXJldHVybiBpZDsKLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQWx3YXlzIHNvcnQgYnkgcHJlc2VudGF0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgTUVUSE9EX1RZUEVfUFJFU19OQU1FX0NPTVBBUkFUT1IgPSBuZXcgVHlwZUNvbXBhcmF0b3IoKSB7Ci0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnMuVHlwZUNvbXBhcmF0b3IjZ2V0RGVmYXVsdENvbXBhcmF0b3IoKQotCQkgKi8KLQkJcHJvdGVjdGVkIENvbXBhcmF0b3IgZ2V0RGVmYXVsdENvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBpbnQgZ2V0T3JkZXJJZChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWludCBpZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKTsKLQkJCQlpZiAoaWQgPT0gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04pIHsKLQkJCQkJaWQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGlkOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxPYmplY3Q+IFBMVUdJTlBBQ0tBR0VfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0JCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xID09IG8yKQotCQkJCXJldHVybiAwOwotCQkJbzEgPSBUbmdVdGlsLnVud3JhcChvMSk7Ci0JCQlvMiA9IFRuZ1V0aWwudW53cmFwKG8yKTsKLQkJCQotCQkJCi0JCQlpZiAobzEgaW5zdGFuY2VvZiBQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyICYmIG8yIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luICYmIG8yIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiAxOwotCQkJfQotCQotCQkJYm9vbGVhbiB1c2VQcmVzTmFtZSA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQkJCVN0cmluZyBzMSA9IG51bGw7Ci0JCQlTdHJpbmcgczIgPSBudWxsOwotCQkJaWYgKHVzZVByZXNOYW1lICYmIG8xIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJczEgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbzEpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJczEgPSAoKE1ldGhvZEVsZW1lbnQpIG8xKS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8xIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXMxID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSBvMSkuZ2V0RnVsbE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlzMSA9IChTdHJpbmcpIG8xOwotCQkJfSAKLQkJCQotCQkJaWYgKHVzZVByZXNOYW1lICYmIG8yIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJczIgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgbzIpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJczIgPSAoKE1ldGhvZEVsZW1lbnQpIG8yKS5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgaWYgKG8yIGluc3RhbmNlb2YgUGx1Z2luVUlQYWNrYWdlc0l0ZW1Qcm92aWRlcikgewotCQkJCXMyID0gKChQbHVnaW5VSVBhY2thZ2VzSXRlbVByb3ZpZGVyKSBvMikuZ2V0RnVsbE5hbWUoKTsKLQkJCX0gZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlzMiA9IChTdHJpbmcpIG8yOwotCQkJfQotCQkJCi0JCQlpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBzMS5jb21wYXJlVG9JZ25vcmVDYXNlKHMyKTsKLQkJfQotCX07Ci0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRhZWJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUNvbmZpZ3VyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotCi0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjYW4gYmUgY29uZmlndXJlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbHRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1bCAyNywgMjAwNQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBleHRlbmRzIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBJRmlsdGVyIGZpbHRlcjsKLQotCS8vIHByaXZhdGUgU2V0IGRpc3Bvc2FibGVBZGFwdGVyczsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvLyBwcml2YXRlIFNldCBnZXREaXNwb3NhYmxlQWRhcHRlcnMoKSB7Ci0JLy8gaWYoZGlzcG9zYWJsZUFkYXB0ZXJzID09IG51bGwpIHsKLQkvLyBkaXNwb3NhYmxlQWRhcHRlcnMgPSBuZXcgSGFzaFNldCgpOwotCS8vIH0KLQkvLyByZXR1cm4gZGlzcG9zYWJsZUFkYXB0ZXJzOwotCS8vIH0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBhZGFwdChPYmplY3Qgb2JqZWN0LCBPYmplY3QgdHlwZSkgewotCQlPYmplY3QgYWRhcHRlciA9IHN1cGVyLmFkYXB0KG9iamVjdCwgdHlwZSk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYWJsZSkgewotCQkJKChJQ29uZmlndXJhYmxlKSBhZGFwdGVyKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCQkvLyBpZihhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJLy8gZ2V0RGlzcG9zYWJsZUFkYXB0ZXJzKCkuYWRkKGFkYXB0ZXIpOwotCQkvLyB9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkjYWRhcHQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXIsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCwgT2JqZWN0IHR5cGUpIHsKLQkJQWRhcHRlciBhZGFwdGVyID0gc3VwZXIuYWRhcHQodGFyZ2V0LCB0eXBlKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ29uZmlndXJhYmxlKSB7Ci0JCQkoKElDb25maWd1cmFibGUpIGFkYXB0ZXIpLnNldEZpbHRlcihmaWx0ZXIpOwotCQl9Ci0JCS8vIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJRGlzcG9zYWJsZSkgewotCQkvLyBnZXREaXNwb3NhYmxlQWRhcHRlcnMoKS5hZGQoYWRhcHRlcik7Ci0JCS8vIH0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLy8gLyogKG5vbi1KYXZhZG9jKQotCS8vICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5I2Rpc3Bvc2UoKQotCS8vICovCi0JLy8gcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkvLyBpZihkaXNwb3NhYmxlQWRhcHRlcnMgIT0gbnVsbCAmJiAhZGlzcG9zYWJsZUFkYXB0ZXJzLmlzRW1wdHkoKSkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGRpc3Bvc2FibGVBZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkvLyBJRGlzcG9zYWJsZSBhZGFwdGVyID0gKElEaXNwb3NhYmxlKSBpdGVyLm5leHQoKTsKLQkvLyBhZGFwdGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0JLy8gfQotCS8vIHN1cGVyLmRpc3Bvc2UoKTsKLQkvLyB9Ci0KLQlwdWJsaWMgSUZpbHRlciBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKElGaWx0ZXIgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSNmaXJlTm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl0cnkgewotCQkJc3VwZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgVmlld2VyTm90aWZpY2F0aW9uKSB7Ci0JCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCi0JCQkJU3RyaW5nV3JpdGVyIHN0cldyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3RyV3JpdGVyKSk7Ci0JCQkJTWVzc2VuZ2VyLklOU1RBTkNFCi0JCQkJCQkuc2hvd0Vycm9yKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX2NvbmZpZ3VyYWJsZWNvbXBvc2VkYWRhcHRlcl9mYXRhbGVyciwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfcmVmZXJzaGluZ3ZpZXdlciwKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9jb25maWd1cmFibGVjb21wb3NlZGFkYXB0ZXJfdW5oYW5kbGVkX2V4Y2VwdGlvbiwKLQkJCQkJCQkJc3RyV3JpdGVyLnRvU3RyaW5nKCksIGUpOyAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uU2V0dGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblNldHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTAzNDQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uU2V0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNldHRlciB7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIElDb25maWd1cmF0b3IgY29uZmlndXJhdG9yOwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBvbGRDb25maWc7Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNldHRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0JCWNvbmZpZ3VyYXRvciA9IGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IgPyAoSUNvbmZpZ3VyYXRvcikgZmlsdGVyIDogbnVsbDsKLQkJaWYoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCW9sZENvbmZpZyA9IGNvbmZpZ3VyYXRvci5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmUoKSB7Ci0JCWlmKGNvbmZpZ3VyYXRvciAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihvbGRDb25maWcpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJQ29uZmlndXJhdG9yIGdldENvbmZpZ3VyYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0T2xkQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIG9sZENvbmZpZzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uZmlndXJhdGlvblV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZiODZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db25maWd1cmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBhZGQvcmVtb3ZlIG9iamVjdHMgZnJvbSBhIE1ldGhvZENvbmZpZ3VyYXRpb24gdXNpbmcgYW4gSUFjdGlvbk1hbmFnZXIKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICoKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25VdGlsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGFjdGlvbk9uQ29sbGVjdGlvbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSwgaW50IGFjdGlvblR5cGUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTGlzdCBsaXN0RmVhdHVyZSkgewotCQlpZiAoY29uZmlnICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuaXNFbXB0eSgpKSB7Ci0JCQlpZiAoYWN0aW9uTWdyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gYWN0aW9uTWdyLmRvQWN0aW9uKGFjdGlvblR5cGUsIGNvbmZpZywgZmVhdHVyZSwgdmFsdWUsCi0JCQkJCQktMSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLkFERF9NQU5ZKSB7Ci0JCQkJCXJldHVybiBsaXN0RmVhdHVyZS5hZGRBbGwodmFsdWUpOwotCQkJCX0gZWxzZSBpZiAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5SRU1PVkVfTUFOWSkgewotCQkJCQlyZXR1cm4gbGlzdEZlYXR1cmUucmVtb3ZlQWxsKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWN0aW9uT25JdGVtKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBPYmplY3QgdmFsdWUsIGludCBhY3Rpb25UeXBlLAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgbGlzdEZlYXR1cmUpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsCi0JCQkJJiYgdmFsdWUgIT0gbnVsbAotCQkJCSYmICgoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5BREQgJiYgIWxpc3RGZWF0dXJlCi0JCQkJCQkuY29udGFpbnModmFsdWUpKSB8fCAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5SRU1PVkUgJiYgbGlzdEZlYXR1cmUKLQkJCQkJCS5jb250YWlucyh2YWx1ZSkpKSkgewotCQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjdGlvbk1nci5kb0FjdGlvbihhY3Rpb25UeXBlLCBjb25maWcsIGZlYXR1cmUsIHZhbHVlLAotCQkJCQkJLTEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYWN0aW9uVHlwZSA9PSBJQWN0aW9uTWFuYWdlci5BREQpIHsKLQkJCQkJcmV0dXJuIGxpc3RGZWF0dXJlLmFkZCh2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmIChhY3Rpb25UeXBlID09IElBY3Rpb25NYW5hZ2VyLlJFTU9WRSkgewotCQkJCQlyZXR1cm4gbGlzdEZlYXR1cmUucmVtb3ZlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGx1Z2lucwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZENvbGxUb01ldGhvZFBsdWdpbkxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBNZXRob2RQbHVnaW4gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBsdWdpbnMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb01ldGhvZFBsdWdpbkxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kUGx1Z2luIHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5BREQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBmcm9tIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBNZXRob2RQbHVnaW5zCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQ29sbEZyb21NZXRob2RQbHVnaW5MaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBNZXRob2RQbHVnaW4gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGx1Z2lucwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZyb21NZXRob2RQbHVnaW5MaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE1ldGhvZFBsdWdpbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIE1ldGhvZFBhY2thZ2VzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQ29sbFRvTWV0aG9kUGFja2FnZUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLCBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gTWV0aG9kUGFja2FnZSB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGFja2FnZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb01ldGhvZFBhY2thZ2VMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIE1ldGhvZFBhY2thZ2UgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkpOwotCX0KLQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGFja2FnZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVDb2xsRnJvbU1ldGhvZFBhY2thZ2VMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIE1ldGhvZFBhY2thZ2UgZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgTWV0aG9kUGFja2FnZXMKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIHVzZSB0aGlzIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiwgaWYgbnVsbCB3aWxsIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbiBkaXJlY3RseS4KLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBmYWxzZSBpZiBhY3Rpb25NYW5hZ2VyIG9yIGxpc3QgbWFuaXB1bGF0aW9uIGZhaWxzLCB0cnVlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVGcm9tTWV0aG9kUGFja2FnZUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTWV0aG9kUGFja2FnZSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwgY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb2xsZWN0aW9uIHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBhZGRlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkQ29sbFRvQWRkZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gQ29udGVudENhdGVnb3J5IHRvIHRoZSBNZXRob2RDb25maWd1cmF0aW9uJ3MgbGlzdCBvZiBzZWxlY3RlZCBhZGRlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9BZGRlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb250ZW50Q2F0ZWdvcnkgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLkFERCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgYWRkZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUNvbGxGcm9tQWRkZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuUkVNT1ZFX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0QWRkZWRDYXRlZ29yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBDb250ZW50Q2F0ZWdvcnkgZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgYWRkZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUZyb21BZGRlZENhdGVnb3J5TGlzdChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBDb250ZW50Q2F0ZWdvcnkgdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uSXRlbShhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRBZGRlZENhdGVnb3J5KCkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gdG8gdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24ncyBsaXN0IG9mIHNlbGVjdGVkIHN1YnRyYWN0ZWQtY2F0ZWdvcmllcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IgdXNlIHRoaXMgSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uLCBpZiBudWxsIHdpbGwgY2hhbmdlIHRoZSBNZXRob2RDb25maWd1cmF0aW9uIGRpcmVjdGx5LgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGFjdGlvbk1hbmFnZXIgb3IgbGlzdCBtYW5pcHVsYXRpb24gZmFpbHMsIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFkZENvbGxUb1N1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29sbGVjdGlvbiB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25Db2xsZWN0aW9uKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQUREX01BTlksIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIENvbnRlbnRDYXRlZ29yeSB0byB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgc3VidHJhY3RlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWRkVG9TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbnRlbnRDYXRlZ29yeSB2YWx1ZSkgewotCQlyZXR1cm4gYWN0aW9uT25JdGVtKGFjdGlvbk1nciwgY29uZmlnLCB2YWx1ZSwgSUFjdGlvbk1hbmFnZXIuQURELCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbGxlY3Rpb24gZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgc3VidHJhY3RlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQ29sbEZyb21TdWJ0cmFjdGVkQ2F0ZWdvcnlMaXN0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIENvbGxlY3Rpb24gdmFsdWUpIHsKLQkJcmV0dXJuIGFjdGlvbk9uQ29sbGVjdGlvbihhY3Rpb25NZ3IsIGNvbmZpZywgdmFsdWUsIElBY3Rpb25NYW5hZ2VyLlJFTU9WRV9NQU5ZLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBDb250ZW50Q2F0ZWdvcnkgZnJvbSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbidzIGxpc3Qgb2Ygc2VsZWN0ZWQgc3VidHJhY3RlZC1jYXRlZ29yaWVzCi0JICogQHBhcmFtIGFjdGlvbk1nciB1c2UgdGhpcyBJQWN0aW9uTWFuYWdlciB0byBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24sIGlmIG51bGwgd2lsbCBjaGFuZ2UgdGhlIE1ldGhvZENvbmZpZ3VyYXRpb24gZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gZmFsc2UgaWYgYWN0aW9uTWFuYWdlciBvciBsaXN0IG1hbmlwdWxhdGlvbiBmYWlscywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlRnJvbVN1YnRyYWN0ZWRDYXRlZ29yeUxpc3QoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgQ29udGVudENhdGVnb3J5IHZhbHVlKSB7Ci0JCXJldHVybiBhY3Rpb25Pbkl0ZW0oYWN0aW9uTWdyLCBjb25maWcsIHZhbHVlLCBJQWN0aW9uTWFuYWdlci5SRU1PVkUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnN0cmFpbnRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uc3RyYWludE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjNjIwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29uc3RyYWludE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQgbWFuYWdlcyB0aGUgdXNlIG9mIENvbnRyYWludCBpbiBsaWJyYXJ5IHRvIHN0b3JlCi0gKiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBkYXRhCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRGVjIDEsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnN0cmFpbnRNYW5hZ2VyIHsKLQkvKiogQ29uc3RhbnRzIGZvciBjb250cmFpbiBuYW1lICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNJVElWWV9ESUFHUkFNID0gImRpYWdyYW0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX1NVUFBSRVNTSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29uc3RyYWludCBnZXRDb25zdHJhaW50KE1ldGhvZEVsZW1lbnQgZSwKLQkJCVN0cmluZyBjb25zdHJhaW50TmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJaWYgKGNvbnN0cmFpbnROYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNvbnN0cmFpbnQgY29uc3RyYWludCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGUuZ2V0T3duZWRSdWxlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29uc3RyYWludCBjID0gKENvbnN0cmFpbnQpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGMuZ2V0TmFtZSgpLmVxdWFscyhjb25zdHJhaW50TmFtZSkpIHsKLQkJCQljb25zdHJhaW50ID0gYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoY29uc3RyYWludCA9PSBudWxsICYmIGNyZWF0ZSkgewotCQkJY29uc3RyYWludCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKTsKLQkJCWNvbnN0cmFpbnQuc2V0TmFtZShjb25zdHJhaW50TmFtZSk7Ci0JCQllLmdldE93bmVkUnVsZXMoKS5hZGQoY29uc3RyYWludCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NGQzOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50SW5oZXJpdGFuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHN0YXRpYyBoZWxwZXIgbWV0aG9kcyB0aGF0IGFyZSByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudAotICogaW5oZXJpdGFuY2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RWxlbWVudEluaGVyaXRhbmNlSGVscGVyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGRlc2NlbmRpbmdTb3J0QnlDcmVhdGlvblRpbWUoTGlzdCB0YXNrcykgewotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTdGVwcyhMaXN0IHN0ZXBzLCBUYXNrIGJhc2UpIHsKLQkvLyBPYmplY3QgZmlyc3QgPSBudWxsOwotCS8vIGlmKCFzdGVwcy5pc0VtcHR5KCkpIHsKLQkvLyBmaXJzdCA9IHN0ZXBzLmdldCgwKTsKLQkvLyB9Ci0JLy8gTGlzdCB0YXNrcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhiYXNlKTsKLQkvLyBpbnQgc2l6ZSA9IHRhc2tzLnNpemUoKTsKLQkvLyBmb3IoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JLy8gVGFzayB0YXNrID0gKFRhc2spIHRhc2tzLmdldChpKTsKLQkvLyBMaXN0IHNlY3Rpb25zID0gdGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCS8vIGludCBudW1PZlNlY3Rpb25zID0gc2VjdGlvbnMuc2l6ZSgpOwotCS8vIFNlY3Rpb24gcHJldiA9IG51bGw7Ci0JLy8gZm9yIChpbnQgaiA9IDA7IGogPCBudW1PZlNlY3Rpb25zOyBqKyspIHsKLQkvLyBTZWN0aW9uIHNlY3Rpb24gPSAoU2VjdGlvbikgc2VjdGlvbnMuZ2V0KGopOwotCS8vIFNlY3Rpb24gcHJlZCA9IHNlY3Rpb24uZ2V0UHJlZGVjZXNzb3IoKTsKLQkvLyBpZihwcmVkID09IG51bGwpIHsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBzdGVwcyBpbiB0aGUgdGFzayB0cmVlIHRoYXQgdGhlIGdpdmVuIHRhc2sgYmVsb25ncyB0bwotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxUYXNrU3RlcHMoVGFzayB0YXNrKSB7Ci0JCVRhc2sgYmFzZSA9IChUYXNrKSBUbmdVdGlsLmdldEJhc2UodGFzayk7Ci0JCUxpc3Qgc3RlcHMgPSBuZXcgQXJyYXlMaXN0KGJhc2UuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKSk7Ci0JCUl0ZXJhdG9yIHRhc2tzID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UsIGZhbHNlKSB7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcygKLQkJCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQlUYXNrIGN1cnJlbnRCYXNlID0gYmFzZTsKLQkJd2hpbGUgKHRhc2tzLmhhc05leHQoKSkgewotCQkJVGFzayB0ID0gKFRhc2spIHRhc2tzLm5leHQoKTsKLQkJCWlmIChjdXJyZW50QmFzZSAhPSB0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCS8vIG5ldyBpbmhlcml0YW5jZSBsZXZlbAotCQkJCS8vCi0JCQkJY3VycmVudEJhc2UgPSAoVGFzaykgdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJU2VjdGlvbiBzID0gKFNlY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJCVNlY3Rpb24gcHJlZCA9IHMuZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCQlpZiAocHJlZCAhPSBudWxsKSB7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0ZXBzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0NvbnRlbnRFbGVtZW50TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGY0MDhjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRlbnRFbGVtZW50TGlzdCB7Ci0KLQlwcml2YXRlIENvbnRlbnRQYWNrYWdlIGNvbnRlbnRQa2c7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRWxlbWVudEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTE0Mzg5NzAxMjM5ODU5MDZMOwotCi0JCXByb3RlY3RlZCBFbGVtZW50SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcihjb250ZW50UGtnLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBMaXN0IGdldENoaWxkcmVuTGlzdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCQkJCWNoaWxkcmVuLmFkZEFsbChwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpKTsKLQkJCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCQkJaWYgKGFjY2VwdChvYmopKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQob2JqKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbjsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW5MaXN0KG9iamVjdCkuaXRlcmF0b3IoKTsKLQkJfQotCQkKLQl9OwotCQotCXB1YmxpYyBDb250ZW50RWxlbWVudExpc3QoQ29udGVudFBhY2thZ2UgY29udGVudFBrZykgewotCQl0aGlzLmNvbnRlbnRQa2cgPSBjb250ZW50UGtnOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKTsKLQotCXByb3RlY3RlZCBJdGVyYXRvciBlbGVtZW50SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEl0ZXJhdG9yKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZXRBbGxFbGVtZW50cyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotLy8JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotLy8JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotLy8JCQlpZiAoYWNjZXB0KG9iaikpIHsKLS8vCQkJCWxpc3QuYWRkKG9iaik7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotLy8JCQlPYmplY3Qgb2JqID0gcGFja2FnZXMuZ2V0KGkpOwotLy8JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLS8vCQkJCWdldEFsbEVsZW1lbnRzKChDb250ZW50UGFja2FnZSkgb2JqLCBsaXN0KTsKLS8vCQkJfQotLy8JCX0KLQkJCi0JCWZvcihJdGVyYXRvciBpdGVyID0gZWxlbWVudEl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmKCEoZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkgewotCQkJCWxpc3QuYWRkKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxFbGVtZW50cyhjb250ZW50UGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvQ29udGVudEVsZW1lbnRPcmRlckxpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudE9yZGVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMGE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Db250ZW50RWxlbWVudE9yZGVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsLlN0cmluZ1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYWxsIHRoZSBsb2dpY3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBhbGwKLSAqIGNvbnRyaWJ1dGVkL2luaGVyaXRlZCBzZWN0aW9ucyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBhcyB3ZWxsIGFzIGFsbG93cwotICogbWFuaXB1bGF0ZSB0aGlzIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgTG9rYW5hdGggSmFnZ2EKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudE9yZGVyTGlzdCBleHRlbmRzIEJhc2ljRUxpc3QgewotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzU3Mjc5NzQ4NzA2OTIzM0w7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9JTkZPX05BTUUgPSAiY29udGVudCBlbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBERUZBVUxUX1NBVkVfT1BUSU9OUyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UX0VMRU1FTlRTX19GT1JfRUxFTUVOVF9PTkxZID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX0FORF9QQVJFTlRTID0gMjsKLQotCXN0YXRpYyB7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsICJBU0NJSSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBDb250ZW50RWxlbWVudCBlZGl0RWxlbWVudDsKLQotCXByaXZhdGUgYm9vbGVhbiBtaXhlZCA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGUpOwotCX0KLQotCXB1YmxpYyBDb250ZW50RWxlbWVudE9yZGVyTGlzdChDb250ZW50RWxlbWVudCBlLCBpbnQgc2NvcGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJaWYgKHNjb3BlID09IENPTlRFTlRfRUxFTUVOVFNfX0ZPUl9FTEVNRU5UX09OTFkpIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoc2NvcGUgPT0gQ09OVEVOVF9FTEVNRU5UU19fRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpIHsKLQkJCWNhbGN1bGF0ZVBhcmVudHNPbmx5KGUpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVQYXJlbnRzT25seShDb250ZW50RWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBpc0V4dGVuZGVkKGUpKSB7Ci0JCQlMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVVtYVV0aWwuZ2V0QWxsU3VwZXJzQm90aChzdXBlcnMsIGUsCi0JCQkJCVZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUywKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkJc3VwZXJzLmFkZChlKTsKLQkJCWl0ZXIgPSBzdXBlcnMuaXRlcmF0b3IoKTsKLQkJfSBlbHNlIHsKLQkJCW1peGVkID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAobWl4ZWQpIHsKLQkJCS8vIGNyZWF0ZSBhIG1hcCBvZiBHVUlEIC8gY29udHJpYnV0b3IgCi0JCQkKLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcCBndWlkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCVNldCBlbGVtZW50cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlPYmplY3QgZUdldCA9ICgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCWlmIChlR2V0IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbCgoTGlzdCkgZUdldCk7Ci0JCQkJCX0KLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRlbnRFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgY2F0ZWdvcml6ZWRFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWd1aWRNYXAucHV0KGNhdGVnb3JpemVkRWxlbWVudC5nZXRHdWlkKCksCi0JCQkJCQkJCWNhdGVnb3JpemVkRWxlbWVudCk7Ci0JCQkJCQllbGVtZW50cy5hZGQoY2F0ZWdvcml6ZWRFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZ3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChlbGVtZW50KTsKLQkJCQkJCWVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChlbGVtZW50cyk7Ci0JCX0KLQl9Ci0KLQkvLyBkZXByZWNhdGUgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBDb250ZW50RWxlbWVudE9yZGVyTGlzdChDb250ZW50RWxlbWVudCBlKSB7Ci0JCWVkaXRFbGVtZW50ID0gZTsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IFRuZ1V0aWwuaGFzQ29udHJpYnV0b3IoZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gVG5nVXRpbC5nZXRCYXNlKGUpOwotCQkJaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihiYXNlKSB7Ci0KLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyYXRvcgotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJfSBlbHNlIGlmIChpc0V4dGVuZGVkKGUpKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBleHRlbmRlZCBpcyB0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlVbWFVdGlsLmdldEFsbFN1cGVycyhzdXBlcnMsIGUsIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJCXN1cGVycy5hZGQoZSk7Ci0JCQlpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0KLQkJaWYgKG1peGVkKSB7Ci0JCQkvLyBjcmVhdGUgYSBtYXAgb2YgR1VJRCAvIGNvbnRyaWJ1dG9yCi0JCQlPcmRlckluZm8gbGF0ZXN0SW5mbyA9IG51bGw7Ci0JCQlNYXAgZ3VpZE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlMaXN0IGVsZW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWd1aWRNYXAucHV0KGVsZW1lbnQuZ2V0R3VpZCgpLCBlbGVtZW50KTsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0KLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oZWxlbWVudCwKLQkJCQkJCU9SREVSX0lORk9fTkFNRSk7Ci0JCQkJaWYgKG9yZGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwKLQkJCQkJCQl8fCBvcmRlckluZm8uZ2V0VGltZXN0YW1wKCkgPiBsYXRlc3RJbmZvCi0JCQkJCQkJCQkuZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQkvLyByZW9yZGVyIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbGF0ZXN0IG9yZGVyIGluZm8KLQkJCQkvLwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gZ3VpZE1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXN1cGVyLmFkZChlbGVtZW50KTsKLQkJCQkJCWVsZW1lbnRzLnJlbW92ZShlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXN1cGVyLmFkZEFsbChlbGVtZW50cyk7Ci0JCX0KLQkJLy8gZWxzZSB7Ci0JCS8vIC8vIGFkZEFsbChlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKTsKLQkJLy8gbWl4ZWQgPSBmYWxzZTsKLQkJLy8gfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRlZChDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJJiYgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUzsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHJlY2VudCBjaGFuZ2VzIGluIHRoZSBsaXN0Ci0JICogCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoKSB7Ci0JCWlmICghbWl4ZWQgfHwgIWNoYW5nZWQpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc2F2ZSB0aGUgb3JkZXIgaW5mbyB0byB0aGUgb3JkZXJpbmdHdWlkZSBvZiB0aGUgZWRpdEVsZW1lbnQKLQkJLy8KLQkJU3RyaW5nIHN0ciA9IGVkaXRFbGVtZW50LmdldE9yZGVyaW5nR3VpZGUoKTsKLQkJT3JkZXJJbmZvQ29sbGVjdGlvbiBvcmRlckluZm9zID0gbnVsbDsKLQkJU3RyaW5nUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlvcmRlckluZm9zID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2Uoc3RyKTsKLQkJCXRyeSB7Ci0JCQkJcmVzLmxvYWQobnVsbCk7Ci0JCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCQlvcmRlckluZm9zID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJCS5jcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb3JkZXJJbmZvcyA9IChPcmRlckluZm9Db2xsZWN0aW9uKSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBmaW5kIHRoZSBvcmRlciBpbmZvciBmb3Igc2VjdGlvbnMKLQkJLy8KLQkJT3JkZXJJbmZvIHNlY3RPcmRlckluZm8gPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSAoT3JkZXJJbmZvKSBpdGVyLm5leHQoKTsKLQkJCWlmIChPUkRFUl9JTkZPX05BTUUuZXF1YWxzSWdub3JlQ2FzZShvcmRlckluZm8uZ2V0TmFtZSgpKSkgewotCQkJCXNlY3RPcmRlckluZm8gPSBvcmRlckluZm87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2VjdE9yZGVySW5mbyA9PSBudWxsKSB7Ci0JCQlzZWN0T3JkZXJJbmZvID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVPcmRlckluZm8oKTsKLQkJCXNlY3RPcmRlckluZm8uc2V0TmFtZShPUkRFUl9JTkZPX05BTUUpOwotCQkJb3JkZXJJbmZvcy5nZXRPcmRlckluZm9zKCkuYWRkKHNlY3RPcmRlckluZm8pOwotCQl9IGVsc2UgewotCQkJc2VjdE9yZGVySW5mby5nZXRHVUlEcygpLmNsZWFyKCk7Ci0JCX0KLQotCQlpbnQgc2l6ZSA9IHNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBzZWN0ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZ2V0KGkpOwotCQkJc2VjdE9yZGVySW5mby5nZXRHVUlEcygpLmFkZChzZWN0LmdldEd1aWQoKSk7Ci0JCX0KLQkJc2VjdE9yZGVySW5mby5zZXRUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlpZiAocmVzID09IG51bGwpIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShudWxsKTsKLQkJCXJlcy5nZXRDb250ZW50cygpLmFkZChvcmRlckluZm9zKTsKLQkJfQotCQl0cnkgewotCQkJcmVzLnNhdmUoREVGQVVMVF9TQVZFX09QVElPTlMpOwotCQkJc3RyID0gcmVzLmdldFN0cmluZygpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTZWN0aW9uTGlzdC5hcHBseSgpOiBuZXcgb3JkZXJpbmcgZ3VpZGUiKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgc3RhcnQgLS0tLS0tIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tIG9yZGVyaW5nR3VpZGUgZW5kIC0tLS0tLSIpOwotCQkJZWRpdEVsZW1lbnQuc2V0T3JkZXJpbmdHdWlkZShzdHIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQpIHsKLQkJaWYgKGVHZXQoKS5jb250YWlucyhjb250ZW50RWxlbWVudCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoIWNhblJlbW92ZSgoQ29udGVudEVsZW1lbnQpIGdldChpbmRleCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJT2JqZWN0IHJlbW92ZWQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJZUdldCgpLnJlbW92ZShyZW1vdmVkKTsKLQkJCXJldHVybiByZW1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCWlmICghY2FuUmVtb3ZlKChDb250ZW50RWxlbWVudCkgbykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChtaXhlZCkgewotCQkJaWYgKHN1cGVyLnJlbW92ZShvKSkgewotCQkJCWVHZXQoKS5yZW1vdmUobyk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGVHZXQoKS5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCUl0ZXJhdG9yIGUgPSBpdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBlLm5leHQoKTsKLQkJCQlpZiAoYy5jb250YWlucyhvKSAmJiBjYW5SZW1vdmUoKENvbnRlbnRFbGVtZW50KSBvKSkgewotCQkJCQllLnJlbW92ZSgpOwotCQkJCQllR2V0KCkucmVtb3ZlKG8pOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5yZW1vdmVBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQllR2V0KCkuYWRkKGVsZW1lbnQpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQllR2V0KCkuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChPYmplY3QgbykgewotCQlib29sZWFuIGIgPSBlR2V0KCkuYWRkKG8pOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGQobyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbiBjKSB7Ci0JCWJvb2xlYW4gYiA9IGVHZXQoKS5hZGRBbGwoYyk7Ci0JCTsKLQkJaWYgKG1peGVkKSB7Ci0JCQliID0gc3VwZXIuYWRkQWxsKGMpOwotCQkJaWYgKGIpCi0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbiBjKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJZUdldCgpLmFkZEFsbChjKTsKLQkJCTsKLQkJCWJvb2xlYW4gYiA9IHN1cGVyLmFkZEFsbChpbmRleCwgYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLmFkZEFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHNldChpbnQgaW5kZXgsIE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZUdldCgpLnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChtaXhlZCkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQllR2V0KCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCBpbmRleCwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXN1cGVyLm1vdmUoaW5kZXgsIG9iamVjdCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCSgoRUxpc3QpIGVHZXQoKSkubW92ZShpbmRleCwgb2JqZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCU9iamVjdCBtb3ZlZCA9IHN1cGVyLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJcmV0dXJuIG1vdmVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0KGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlR2V0KCkuZ2V0KGluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2l6ZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVHZXQoKS5zaXplKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZUdldCgpLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLmNvbnRhaW5zKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGVHZXQoKS5jb250YWlucyhvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JCXJldHVybiBlR2V0KCkuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCWlmIChtaXhlZCkgewotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gZUdldCgpLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheShPYmplY3RbXSBhcnJheSkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIudG9BcnJheShhcnJheSk7Ci0JCXJldHVybiBlR2V0KCkudG9BcnJheShhcnJheSk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuIGVHZXQoKS5pbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci5sYXN0SW5kZXhPZihvYmplY3QpOwotCQlyZXR1cm4gZUdldCgpLmxhc3RJbmRleE9mKG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNaXhlZCgpIHsKLQkJcmV0dXJuIG1peGVkOwotCX0KLQotCXByaXZhdGUgRUxpc3QgZUdldCgpIHsKLQkJRUxpc3QgbGlzdCA9IG51bGw7Ci0JCU9iamVjdCBvYmplY3QgPSAoKENvbnRlbnRDYXRlZ29yeSkgZWRpdEVsZW1lbnQpLmVHZXQoZmVhdHVyZSk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFTGlzdCkgewotCQkJbGlzdCA9IChFTGlzdCkgb2JqZWN0OwotCQl9Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQmFzaWNFTGlzdCgpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZWJ1Z1V0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EZWJ1Z1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2YjVkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVidWdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBkZWJ1ZyBwdXJwb3NlCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVidWdVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIFByaW50U3RyZWFtIG91dHB1dDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJvbXB0ID0gIkxEPiAiOyAJCQkJCS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0KFByaW50U3RyZWFtIG9wKSB7Ci0JCW91dHB1dCA9IG9wOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvbXB0KFN0cmluZyBwdCkgewotCQlwcm9tcHQgPSBwdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gb3V0KCkgewotCQlpZiAob3V0cHV0ICE9IG51bGwpIHsKLQkJCXJldHVybiBvdXRwdXQ7Ci0JCX0KLQkJcmV0dXJuIFN5c3RlbS5vdXQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChTdHJpbmcgYmVnaW5UaXRsZSwgU3RyaW5nIGVuZFRpdGxlLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cywgaW50IGl4KSB7Ci0JCWlmIChiZWdpblRpdGxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBzdHIgPSAiIjsJCQkJLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCQlzdHIgPSAibnVsbCI7CQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJc3RyID0gZWxlbWVudHMudG9TdHJpbmcoKTsKLQkJCX0KLQkJCW91dCgpLnByaW50bG4ocHJvbXB0ICsgYmVnaW5UaXRsZSArIHN0cik7Ci0JCX0KLQkJCi0JCWlmIChlbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlvdXQoKS5wcmludGxuKHByb21wdCArIHRvU3RyaW5nKGVsZW1lbnQsIGl4KSk7Ci0JCX0KLQkJCi0JCWlmIChlbmRUaXRsZSAhPSBudWxsKSB7Ci0JCQlvdXQoKS5wcmludGxuKHByb21wdCArIGVuZFRpdGxlKTsKLQkJfQotCQlvdXQoKS5wcmludGxuKCIiKTsJCQkvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgaW50IGl4KSB7Ci0JCWlmIChpeCA9PSAxKSB7Ci0JCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGVsZW1lbnQpOwotCQl9IAotCQlpZiAoaXggPT0gMikgewotCQkJcmV0dXJuIGVsZW1lbnQuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIiwgIiArICAvLyROT04tTkxTLTEkCi0JCQkJCWVsZW1lbnQuZ2V0R3VpZCgpICsgIiwgIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsvLyROT04tTkxTLTEkIAotCQl9Ci0JCXJldHVybiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjUxOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxFPiBleHRlbmRzCi0JCUFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPEU+IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI1MjcxNzgyNzc2MjAwMDgyMkw7Ci0KLQlwcml2YXRlIGludCBkZXB0aExldmVsOwotCi0JcHVibGljIERlcHRoTGV2ZWxBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBvYmplY3QsIGJvb2xlYW4gaW5jbHVkZVJvb3QpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCwgaW5jbHVkZVJvb3QpOwotCX0KLQotCXB1YmxpYyBEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlFIG9iamVjdCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlkZXB0aExldmVsID0gc2l6ZSgpOwotCQlyZXR1cm4gc3VwZXIubmV4dCgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldERlcHRoTGV2ZWwoKSB7Ci0JCXJldHVybiBkZXB0aExldmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9EaWFncmFtT3B0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RpYWdyYW1PcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MGYxNWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0RpYWdyYW1PcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtT3B0aW9ucyB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUFVCTElTSF9BRCA9ICJwdWJsaXNoX2FkIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BVQkxJU0hfQUREID0gInB1Ymxpc2hfYWRkIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BVQkxJU0hfV1BERCA9ICJwdWJsaXNoX3dwZGQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFB1Ymxpc2hBRChBY3Rpdml0eSBhY3Rpdml0eSwgYm9vbGVhbiBiKXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfQUQsIGIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNQdWJsaXNoQUQoQWN0aXZpdHkgYWN0aXZpdHkpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX0FEKTsKLQkJcmV0dXJuIHByb3AgIT0gbnVsbCA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3AuZ2V0VmFsdWUoKSkgOiB0cnVlOyAKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFB1Ymxpc2hBREQoQWN0aXZpdHkgYWN0aXZpdHksIGJvb2xlYW4gYil7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5zZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX0FERCwgYik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hBREQoQWN0aXZpdHkgYWN0aXZpdHkpewotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShhY3Rpdml0eSwgUFJPUF9QVUJMSVNIX0FERCk7Ci0JCXJldHVybiBwcm9wICE9IG51bGwgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9wLmdldFZhbHVlKCkpIDogdHJ1ZTsgCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQdWJsaXNoV1BERChBY3Rpdml0eSBhY3Rpdml0eSwgYm9vbGVhbiBiKXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLnNldFByb3BlcnR5KGFjdGl2aXR5LCBQUk9QX1BVQkxJU0hfV1BERCwgYik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc1B1Ymxpc2hXUEREKEFjdGl2aXR5IGFjdGl2aXR5KXsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkoYWN0aXZpdHksIFBST1BfUFVCTElTSF9XUEREKTsKLQkJcmV0dXJuIHByb3AgIT0gbnVsbCA/IEJvb2xlYW4ucGFyc2VCb29sZWFuKHByb3AuZ2V0VmFsdWUoKSkgOiB0cnVlOyAKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJhOWU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uSUVkaXRpbmdEb21haW5Qcm92aWRlcjsKLQotLyoqCi0gKiBBIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgdGhhdCBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVkaXRpbmdEb21haW5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMKLQkJQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQlwdWJsaWMgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkoQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3JpZXMpOwotCX0KLQotCXB1YmxpYyBFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRpbmdEb21haW4oRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluKSB7Ci0JCXRoaXMuZWRpdGluZ0RvbWFpbiA9IGVkaXRpbmdEb21haW47Ci0JCWlmIChlZGl0aW5nRG9tYWluIGluc3RhbmNlb2YgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKSB7Ci0JCQkoKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgZWRpdGluZ0RvbWFpbikKLQkJCQkJLnNldEFkYXB0ZXJGYWN0b3J5KHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvRXhwb3NlZEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NjM4ZjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4cG9zZWRBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklSZWZlcmVuY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQ29sdW1uQXdhcmU7Ci0KLQotLyoqCi0gKiBBbiBFZGl0aW5nRG9tYWluQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0aGF0IGV4cG9zZXMgaW50ZXJuYWwgZGF0YQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgRWRpdGluZ0RvbWFpbkNvbXBvc2VkQWRhcHRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJQ29sdW1uQXdhcmUsIElSZWZlcmVuY2VyIHsKLQotCXByaXZhdGUgTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwOwotCi0JLyoqCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5KEFkYXB0ZXJGYWN0b3J5W10gYWRhcHRlckZhY3RvcmllcykgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjaGFuZ2VOb3RpZmllcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI3NldENvbHVtbkluZGV4VG9OYW1lTWFwKGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhUb05hbWVNYXAoTWFwIG1hcCkgewotCQljb2x1bW5JbmRleFRvTmFtZU1hcCA9IG1hcDsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVyRmFjdG9yaWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJQ29sdW1uQXdhcmUpIHsKLQkJCQkoKElDb2x1bW5Bd2FyZSkgYWRhcHRlckZhY3RvcnkpLnNldENvbHVtbkluZGV4VG9OYW1lTWFwKG1hcCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ubGlicmFyeS5lZGl0LnByb2Nlc3MuSUNvbHVtbkF3YXJlI2dldENvbHVtbkluZGV4VG9OYW1lTWFwKCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldENvbHVtbkluZGV4VG9OYW1lTWFwKCkgewotCQlyZXR1cm4gY29sdW1uSW5kZXhUb05hbWVNYXA7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNjbGVhblVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhblVwKCkgewotCQlpbnQgc2l6ZSA9IGFkYXB0ZXJGYWN0b3JpZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcmllcy5nZXQoaSk7Ci0JCQlpZihhZGFwdGVyRmFjdG9yeSBpbnN0YW5jZW9mIElSZWZlcmVuY2VyKSB7Ci0JCQkJKChJUmVmZXJlbmNlcilhZGFwdGVyRmFjdG9yeSkuY2xlYW5VcCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JUmVmZXJlbmNlciNyZW1vdmUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IHJlZikgewotCQlib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLQkJaW50IHNpemUgPSBhZGFwdGVyRmFjdG9yaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBhZGFwdGVyRmFjdG9yeSA9IGFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGkpOwotCQkJaWYoYWRhcHRlckZhY3RvcnkgaW5zdGFuY2VvZiBJUmVmZXJlbmNlcikgewotCQkJCSgoSVJlZmVyZW5jZXIpYWRhcHRlckZhY3RvcnkpLnJlbW92ZShyZWYpOwotCQkJCXJlbW92ZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9FeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMDRmZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0V4dGVuc2lvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JTmVzdGVkQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB3aXRoIG1ldGhvZHMgdG8gcmV0cmlldmUgZXh0ZW5zaW9ucwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbk1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIExpc3Q8SU5lc3RlZENvbW1hbmRQcm92aWRlcj4gbmVzdGVkQ29tbWFuZFByb3ZpZGVyczsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IG9wcG9zaXRlRmVhdHVyZUxvYWRlcnM7Ci0JCi0JcHVibGljIHN0YXRpYyA8VD5MaXN0PFQ+IGdldEV4dGVuc2lvbnMoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGV4dGVuc2lvblBvaW50TmFtZSwgQ2xhc3M8VD4gdHlwZSkgewotCQlMaXN0PFQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0JCXRyeSB7Ci0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZihjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQlPYmplY3QgZXh0ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJCQkJCWlmKHR5cGUuaXNJbnN0YW5jZShleHQpKSB7Ci0JCQkJCQkJCQlsaXN0LmFkZCgoVClleHQpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlpZihsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnROYW1lKSB7Ci0JCXJldHVybiBFeHRlbnNpb25IZWxwZXIuY3JlYXRlRXh0ZW5zaW9uKG5hbWVzcGFjZSwgZXh0ZW5zaW9uUG9pbnROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RXh0ZW5zaW9uKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUpIHsKLQkJcmV0dXJuIEV4dGVuc2lvbkhlbHBlci5nZXRFeHRlbnNpb24obmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVRleHRSZWZlcmVuY2VSZXBsYWNlciBnZXRUZXh0UmVmZXJlbmNlUmVwbGFjZXIoKSB7Ci0JCXJldHVybiAoSVRleHRSZWZlcmVuY2VSZXBsYWNlcikgZ2V0RXh0ZW5zaW9uKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAidGV4dFJlZmVyZW5jZVJlcGxhY2VyIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PElOZXN0ZWRDb21tYW5kUHJvdmlkZXI+IGdldE5lc3RlZENvbW1hbmRQcm92aWRlcnMoKSB7Ci0JCWlmKG5lc3RlZENvbW1hbmRQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJbmVzdGVkQ29tbWFuZFByb3ZpZGVycyA9IGdldEV4dGVuc2lvbnMoTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIAotCQkJCQkibmVzdGVkQ29tbWFuZFByb3ZpZGVycyIsIElOZXN0ZWRDb21tYW5kUHJvdmlkZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5lc3RlZENvbW1hbmRQcm92aWRlcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGlhZ3JhbU1hbmFnZXIgZ2V0RGlhZ3JhbU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSURpYWdyYW1NYW5hZ2VyKSBnZXRFeHRlbnNpb24oTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJkaWFncmFtTWFuYWdlciIpOyAvLyROT04tTkxTLTEkIAotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3Bwb3NpdGVGZWF0dXJlTG9hZGVycygpIHsKLQkJaWYob3Bwb3NpdGVGZWF0dXJlTG9hZGVycyA9PSBudWxsKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzID0gZ2V0RXh0ZW5zaW9ucyhMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgCi0JCQkJCSJvcHBvc2l0ZUZlYXR1cmVMb2FkZXJzIiwgSU5lc3RlZENvbW1hbmRQcm92aWRlci5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTG9hZGVyczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVXNlckludGVyYWN0aW9uSGFuZGxlciBnZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpIHsKLQkJcmV0dXJuIChJVXNlckludGVyYWN0aW9uSGFuZGxlcikgZ2V0RXh0ZW5zaW9uKExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAidXNlckludGVyYWN0aW9uSGFuZGxlciIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9HcmFwaGljYWxEYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvR3JhcGhpY2FsRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjhkMzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9HcmFwaGljYWxEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmF3dC5EaW1lbnNpb247Ci1pbXBvcnQgamF2YS5hd3QuUG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhpY2FsRGF0YSB7Ci0JcHJpdmF0ZSBQb2ludCBsb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQotCXByaXZhdGUgRGltZW5zaW9uIHNpemUgPSBuZXcgRGltZW5zaW9uKC0xLCAtMSk7Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBncmFwaE5vZGU7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JfQotCi0JcHVibGljIEdyYXBoTm9kZSBnZXRHcmFwaE5vZGUoKSB7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhcGhOb2RlKEdyYXBoTm9kZSBncmFwaE5vZGUpIHsKLQkJdGhpcy5ncmFwaE5vZGUgPSBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgUG9pbnQgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIFRoZSBsb2NhdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oUG9pbnQgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2l6ZS4KLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaXplCi0JICogICAgICAgICAgICBUaGUgc2l6ZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2l6ZShEaW1lbnNpb24gc2l6ZSkgewotCQl0aGlzLnNpemUgPSBzaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3Rvcmllcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lCcmVha2Rvd25TdHJ1Y3R1cmVBZGFwdGVyRmFjdG9yaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjYxYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lCcmVha2Rvd25TdHJ1Y3R1cmVBZGFwdGVyRmFjdG9yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcHJvdmlkZXMgYSByZWxhdGVkIHNldCBvZiBhZGFwdGVyIGZhY3RvcmllcyBmb3IgYnJlYWtkb3duCi0gKiBzdHJ1Y3R1cmUgdmlld3MKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXIgMjAsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnJlYWtkb3duU3RydWN0dXJlQWRhcHRlckZhY3RvcmllcyB7Ci0JQWRhcHRlckZhY3RvcnkgZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQotCUFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQlBZGFwdGVyRmFjdG9yeSBnZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQotCUFkYXB0ZXJGYWN0b3J5IGdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSURpYWdyYW1NYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSURpYWdyYW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODY5YzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lEaWFncmFtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci0KLS8qKgotICogTWFuYWdlcyBkaWFncmFtcyBvZiBhY3Rpdml0eQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEp1biAyNywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRGlhZ3JhbU1hbmFnZXIgewotCS8qKiBEaWFncmFtIHR5cGUgY29uc3RhbnRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfRElBR1JBTSA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXT1JLX1BST0RVQ1RfREVQRU5ERU5DWV9ESUFHUkFNID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElWSVRZX0RFVEFJTF9ESUFHUkFNID0gMjsKLQotCS8qKgotCSAqIEdldHMgZGlhZ3JhbSBvZiBnaXZlbiB0eXBlIGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUgY2FuIGJlIG9uZSBvZiB0aGUgY29uc3RhbnRzIHtAbGluayAjQUNUSVZJVFlfRElBR1JBTX0sIHtAbGluayAjQUNUSVZJVFlfREVUQUlMX0RJQUdSQU19LCBvciB7QGxpbmsgI1dPUktfUFJPRFVDVF9ERVBFTkRFTkNZX0RJQUdSQU19Ci0JICogQHJldHVybgotCSAqLwotCURpYWdyYW0gZ2V0RGlhZ3JhbShBY3Rpdml0eSBhY3QsIGludCB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JTGlicmFyeUluc3BlY3Rvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lMaWJyYXJ5SW5zcGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWQ5MjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lMaWJyYXJ5SW5zcGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkZWJ1ZyBwdXJwb3NlCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEF1Z3VzdCAxMSwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeUluc3BlY3RvciB7Ci0JLyoqCi0JICogU2hvdyBhbGwgY29udGVudHMgb2YgdGhlIGxpYnJhcnkKLQkgKi8KLQl2b2lkIHNob3dBbGxDb250ZW50cygpOwotCQotCS8qKgotCSAqIFNob3cgYWxsIGNvbnRlbnRzIG9mIHRoZSBsaWJyYXJ5Ci0JICovCi0Jdm9pZCBzaG93QWxsQ29udGVudHMoTWV0aG9kTGlicmFyeSBsaWIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc4OWVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBPcHBvc2l0ZSBmZWF0dXJlIGxvYWRlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIFNlcCAxNCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIHsKLQkvKioKLQkgKiBMb2FkcyBvcHBvc2l0ZSBmZWF0dXJlcyBmb3IgdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0Jdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhDb2xsZWN0aW9uIGVsZW1lbnRzKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JUnVubmFibGVXaXRoUHJvZ3Jlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkMmFjZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVJ1bm5hYmxlV2l0aFByb2dyZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLSAgICAvKioKLSAgICAgKiBSdW5zIHRoaXMgb3BlcmF0aW9uLiAgUHJvZ3Jlc3Mgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBnaXZlbiBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzdWFsbHkgaW52b2tlZCBieSBhbiA8Y29kZT5JUnVubmFibGVDb250ZXh0PC9jb2RlPidzIDxjb2RlPnJ1bjwvY29kZT4gbWV0aG9kLAotICAgICAqIHdoaWNoIHN1cHBsaWVzIHRoZSBwcm9ncmVzcyBtb25pdG9yLgotICAgICAqIEEgcmVxdWVzdCB0byBjYW5jZWwgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaG9ub3JlZCBhbmQgYWNrbm93bGVkZ2VkIAotICAgICAqIGJ5IHRocm93aW5nIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0gICAgICogICByZXF1ZXN0cyBmb3IgY2FuY2VsYXRpb24KLSAgICAgKiBAZXhjZXB0aW9uIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaWYgdGhlIHJ1biBtZXRob2QgbXVzdCBwcm9wYWdhdGUgYSBjaGVja2VkIGV4Y2VwdGlvbiwKLSAgICAgKiAJaXQgc2hvdWxkIHdyYXAgaXQgaW5zaWRlIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+OyBydW50aW1lIGV4Y2VwdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkKLSAgICAgKiAgd3JhcHBlZCBpbiBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPiBieSB0aGUgY2FsbGluZyBjb250ZXh0Ci0gICAgICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgb3BlcmF0aW9uIGRldGVjdHMgYSByZXF1ZXN0IHRvIGNhbmNlbCwgCi0gICAgICogIHVzaW5nIDxjb2RlPklQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpPC9jb2RlPiwgaXQgc2hvdWxkIGV4aXQgYnkgdGhyb3dpbmcgCi0gICAgICogIDxjb2RlPkludGVycnVwdGVkRXhjZXB0aW9uPC9jb2RlPgotICAgICAqCi0gICAgICogQHNlZSBJUnVubmFibGVDb250ZXh0I3J1bgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotICAgICAgICAgICAgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVRleHRSZWZlcmVuY2VSZXBsYWNlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0lUZXh0UmVmZXJlbmNlUmVwbGFjZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkZjUxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvSVRleHRSZWZlcmVuY2VSZXBsYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2FuIHNjYW4gdGV4dCBhbmQgcmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZQotICogb2xkIG9iamVjdHMgd2l0aCByZWZlcmVuY2VzIHRvIG5ldyBvYmplY3RzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSnVuIDIyLCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWZlcmVuY2VSZXBsYWNlciB7Ci0JLyoqCi0JICogUmVwbGFjZXMgdGV4dHVhbCByZWZlcmVuY2VzIHRvIHRoZSBvbGQgb2JqZWN0cyB3aXRoIHJlZmVyZW5jZXMgdG8gbmV3Ci0JICogb2JqZWN0cyBwcm92aWRlZCBpbiB0aGUgPGNvZGU+b2xkVG9OZXdPYmplY3RNYXA8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgdGV4dAotCSAqIEBwYXJhbSBvbGRUb05ld09iamVjdE1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgcmVwbGFjZShTdHJpbmcgdGV4dCwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9JdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGI4ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElJdGVtTGFiZWxQcm92aWRlciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb2JqZWN0ID09IG51bGwgPyAiIiA6IG9iamVjdC50b1N0cmluZygpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9MaWJyYXJ5RWRpdENvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0xpYnJhcnlFZGl0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MmEwNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL0xpYnJhcnlFZGl0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIGxpYnJhcnkgZWRpdCBwbHVnaW4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgSnVuIDMwLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5RWRpdENvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1RBU0tTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX1Rhc2tzX3RleHQiKSAvLyROT04tTkxTLTEkCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9ET01BSU5fV09SS1BST0RVQ1RTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0RvbWFpbnNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1VuY2F0ZWdvcml6ZWRfdGV4dCIpIC8vJE5PTi1OTFMtMSQJCQkJCi0JfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5DQVRFR09SSVpFRF9XT1JLUFJPRFVDVFRZUEVfV09SS1BST0RVQ1RTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOQ0FURUdPUklaRURfUk9MRVNfUEFUSCA9IHsKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX0NvbnRlbnRfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1JvbGVfU2V0c19ncm91cCIpIC8vJE5PTi1OTFMtMSQKLQkJCSwKLQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX1JvbGVzX3RleHQiKSAvLyROT04tTkxTLTEkCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkNBVEVHT1JJWkVEX1RPT0xNRU5UT1JTX1BBVEggPSB7Ci0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1N0YW5kYXJkX0NhdGVnb3JpZXNfZ3JvdXAiKSAvLyROT04tTkxTLTEkCi0JCQksIExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikgLy8kTk9OLU5MUy0xJAotCQkJLCBMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9VbmNhdGVnb3JpemVkX3RleHQiKSAvLyROT04tTkxTLTEkCQkJCQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QUkVGSVggPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9QUk9DRVNTX0NPTlRSSUJVVElPTiA9IFBSRUZfUFJFRklYCi0JCQkrICJlbmFibGVfcHJvY2Vzc19jb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0VOQUJMRV9IRUFMVEhfQ0hFQ0sgPSBQUkVGX1BSRUZJWAotCQkJKyAiZW5hYmxlX2hlYWx0aF9jaGVjayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfSU5IRVJJVF9TVVBQUkVTU0lPTl9TVEFURSA9IFBSRUZfUFJFRklYCi0JCQkrICJpbmhlcml0X3N1cHByZXNzaW9uX3N0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XQlNfQ09MVU1OUyA9IFBSRUZfUFJFRklYICsgIndic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9UQlNfQ09MVU1OUyA9IFBSRUZfUFJFRklYICsgInRic19jb2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBQUkVGX1BSRUZJWCArICJ3cGJzX2NvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ1VTVE9NX0NBVEVHT1JZID0gIm5ld19jdXN0b21fY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRElTQ0lQTElORSA9ICJuZXdfZGlzY2lwbGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ESVNDSVBMSU5FX0dST1VQSU5HID0gIm5ld19kaXNjaXBsaW5lX2dyb3VwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0RPTUFJTiA9ICJuZXdfZG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1JPTEVfU0VUID0gIm5ld19yb2xlX3NldCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19ST0xFX1NFVF9HUk9VUElORyA9ICJuZXdfcm9sZV9zZXRfZ3JvdXBpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVE9PTCA9ICJuZXdfdG9vbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XT1JLX1BST0RVQ1RfVFlQRSA9ICJuZXdfd29ya19wcm9kdWN0X2tpbmQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9MRSA9ICJuZXdfcm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19UQVNLID0gIm5ld190YXNrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX1dPUktQUk9EVUNUID0gIm5ld193b3JrcHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19BUlRJRkFDVCA9ICJuZXdfYXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfREVMSVZFUkFCTEUgPSAibmV3X2RlbGl2ZXJhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX09VVENPTUUgPSAibmV3X291dGNvbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfQ0hFQ0tMSVNUID0gIm5ld19jaGVja2xpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfV0hJVEVQQVBFUiA9ICJuZXdfd2hpdGVwYXBlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19DT05DRVBUID0gIm5ld19jb25jZXB0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0VTVElNQVRFID0gIm5ld19lc3RpbWF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT04gPSAibmV3X2VzdGltYXRpb25fY29uc2lkZXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVNUSU1BVEFUSU5HX01FVFJJQyA9ICJuZXdfZXN0aW1hdGluZ19tZXRyaWMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfRVhBTVBMRSA9ICJuZXdfZXhhbXBsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19QUkFDVElDRSA9ICJuZXdfcHJhY3RpY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUkVQT1JUID0gIm5ld19yZXBvcnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUk9BRE1BUCA9ICJuZXdfcm9hZG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19SRVVTQUJMRV9BU1NFVCA9ICJuZXdfcmV1c2FibGVfYXNzZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfU1VQUE9SVElOR19NQVRFUklBTCA9ICJuZXdfc3VwcG9ydGluZ19tYXRlcmlhbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19URU1QTEFURSA9ICJuZXdfdGVtcGxhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVEVSTV9ERUZJTklUSU9OID0gIm5ld190ZXJtX2RlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfVE9PTF9NRU5UT1IgPSAibmV3X3Rvb2xtZW50b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfR1VJREVMSU5FID0gIm5ld19ndWlkZWxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfR1VJREFOQ0UgPSAibmV3X2d1aWRhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTlRFTlRfUEFDS0FHRSA9ICJuZXdfY29udGVudF9wYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0NPTkZJR1VSQVRJT04gPSAibmV3X2NvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfUFJPQ0VTU19GQU1JTFkgPSAibmV3X3Byb2Nlc3NfZmFtaWx5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01lc3Nlbmdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01lc3Nlbmdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTA1ZmU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXNzZW5nZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXI7Ci0KLS8qKgotICogRGVmYXVsdCBtZXNzZW5nZXIgdGhhdCB3aWxsIGRlbGl2ZXIgbWVzc2FnZXMgdXNpbmcgdGhlIG1lc3NlbmdlciBvZgotICoge0BsaW5rIEV4dGVuc2lvbk1hbmFnZXIjZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKSBkZWZhdWx0IHVzZXIKLSAqIGludGVyYWN0aW9uIGhhbmRsZXJ9IGlmIG9uZSBleGlzdHMuIE90aGVyd2lzZSwgaXQgd2lsbCBsb2cgdGhlIG1lc3NhZ2VzIHVzaW5nCi0gKiBwbHVnaW4ncyBsb2dnZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI1LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzZW5nZXIgaW1wbGVtZW50cyBJVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1lc3NlbmdlciBJTlNUQU5DRSA9IG5ldyBNZXNzZW5nZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgKLQkJCSJsaW5lLnNlcGFyYXRvciIsICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSU1lc3NlbmdlciBkZWxlZ2F0ZTsKLQotCXByaXZhdGUgTG9nZ2VyIGxvZ2dlciA9IExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQotCXByaXZhdGUgTWVzc2VuZ2VyKCkgewotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCQkJLmdldERlZmF1bHRVc2VySW50ZXJhY3Rpb25IYW5kbGVyKCk7Ci0JCWlmICh1aUhhbmRsZXIgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUgPSB1aUhhbmRsZXIuZ2V0TWVzc2VuZ2VyKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93RXJyb3IodGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyI3Nob3dFcnJvcihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dFcnJvcih0aXRsZSwgbXNnLCBzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0Vycm9yKFN0cmluZyB0aXRsZSwgU3RyaW5nIG1zZywgU3RyaW5nIHJlYXNvbiwKLQkJCUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dFcnJvcih0aXRsZSwgbXNnLCByZWFzb24sIGV4Y2VwdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd1dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2hvd1dhcm5pbmcoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5zaG93V2FybmluZyh0aXRsZSwgbXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKHRpdGxlKTsKLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChtc2cpOwotCQkJfQotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93V2FybmluZyhqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93V2FybmluZyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIFN0cmluZyByZWFzb24pIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dXYXJuaW5nKHRpdGxlLCBtc2csIHJlYXNvbik7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChyZWFzb24pOwotCQkJfQotCQkJbG9nZ2VyLmxvZ1dhcm5pbmcoc3RyQnVmLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklVc2VySW50ZXJhY3Rpb25IYW5kbGVyLklNZXNzZW5nZXIjc2hvd0luZm8oamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93SW5mbyhTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnNob3dJbmZvKHRpdGxlLCBtc2cpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIodGl0bGUpOwotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZChORVdfTElORSkuYXBwZW5kKG1zZyk7Ci0JCQl9Ci0JCQlsb2dnZXIubG9nSW5mbyhzdHJCdWYudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIuSU1lc3NlbmdlciNzaG93RXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLkV4Y2VwdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzaG93RXJyb3IoU3RyaW5nIHRpdGxlLCBTdHJpbmcgbXNnLCBTdHJpbmcgcmVhc29uLCBTdHJpbmcgZGV0YWlscywgRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuc2hvd0luZm8odGl0bGUsIG1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcih0aXRsZSk7Ci0JCQlpZighU3RyVXRpbC5pc0JsYW5rKG1zZykpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKE5FV19MSU5FKS5hcHBlbmQobXNnKTsKLQkJCX0KLQkJCWlmKCFTdHJVdGlsLmlzQmxhbmsocmVhc29uKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChyZWFzb24pOwotCQkJfQotCQkJaWYoIVN0clV0aWwuaXNCbGFuayhkZXRhaWxzKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoTkVXX0xJTkUpLmFwcGVuZChkZXRhaWxzKTsKLQkJCX0KLQkJCWxvZ2dlci5sb2dFcnJvcihzdHJCdWYudG9TdHJpbmcoKSwgZXhjZXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RiODQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfT1JERVJfX1BSRURFQ0VTU09SX1BST0NFU1NfUEFUSCA9ICJwcmVkX3Byb2Nlc3NfcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUFJPUEJMRU1fSElERV9FUlJPUlMgPSAiaGlkZV9lcnJvcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1BST1BCTEVNX0hJREVfV0FSTklOR1MgPSAiaGlkZV93YXJuaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfUFJPUEJMRU1fSElERV9JTkZPUyA9ICJoaWRlX2luZm9zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9DQVRFR09SWV9fSU5DTFVERURfRUxFTUVOVFMgPSAiaW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIGl0ZXIubmV4dCgpOwotCQkJCWlmKHByb3AuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJCXJldHVybiBwcm9wOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldFByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgcHJvcFZhbHVlKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gZ2V0UHJvcGVydHkoZSwgcHJvcE5hbWUpOwotCQlpZiAocHJvcCA9PSBudWxsKSB7Ci0JCQlwcm9wID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQlwcm9wLnNldE5hbWUocHJvcE5hbWUpOwotCQkJZS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5hZGQocHJvcCk7Ci0JCX0KLQkJaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHByb3BWYWx1ZS5lcXVhbHMocHJvcC5nZXRWYWx1ZSgpKSkgcmV0dXJuOwotCQlpZiAocHJvcFZhbHVlID09IG51bGwgJiYgcHJvcC5nZXRWYWx1ZSgpID09IG51bGwpIHJldHVybjsKLQkJcHJvcC5zZXRWYWx1ZShwcm9wVmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBzZXRQcm9wZXJ0eShNZXRob2RFbGVtZW50IGUsIFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiBiKSB7Ci0JCXNldFByb3BlcnR5KGUsIHByb3BOYW1lLCBTdHJpbmcudmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHJlbW92ZVByb3BlcnR5KE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHByb3BOYW1lKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFByb3BlcnR5KGUsIHByb3BOYW1lKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCWUuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkucmVtb3ZlKHByb3BlcnR5KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NZXRob2RFbGVtZW50VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YWExZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL01ldGhvZEVsZW1lbnRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIENsYXNzIHdpdGggc3RhdGljIHV0aWxpdHkgbWV0aG9kcyBmb3IgcXVlcnlpbmcgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50VXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZE1vZGVsKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKChNZXRob2RFbGVtZW50KSBvYmopOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBtb2RlbHMgYXMgc3BlY2lmaWVkLi4gMS4gTWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QgMi4KLQkgKiBSZWZlcmVuY2VkIG1vZGVscyBvZiB0aGUgbWV0aG9kIG1vZGVsIG9mIHRoZSBvYmplY3QgKGUuZy4gcmVmZXJlbmNlCi0JICogcmVsYXRpb25zaGlwKQotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbE1vZGVscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCUxpc3QgYWxsTW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGdldCBtZXRob2QgbW9kZWwgb2YgdGhlIG9iamVjdAotCQlNZXRob2RQbHVnaW4gbW9kZWwgPSBnZXRNZXRob2RNb2RlbChvYmplY3QpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0KLQkJCS8vIGdldCBhbGwgYmFzZSBtb2RlbHMKLQkJCS8vCi0JCQlNaXNjLmdldEFsbEJhc2UobW9kZWwsIGFsbE1vZGVscyk7Ci0KLQkJCWFsbE1vZGVscy5hZGQobW9kZWwpOwotCi0JCX0KLQotCQlyZXR1cm4gYWxsTW9kZWxzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcmVmZXJlbmNlcyBndWlkYW5jZXMgZm9yIHRoZSBnaXZlbiBvYmplY3QKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRTZWxlY3RlZEd1aWRhbmNlcyhFT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUxpc3QgcmVmZXJlbmNlcyA9ICgoRU9iamVjdCkgb2JqZWN0KS5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwgJiYgcmVmZXJlbmNlcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgR3VpZGFuY2UpIHsKLQkJCQkJaXRlbUxpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaXRlbUxpc3QKLQkJCQkuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFByYWN0aWNlcygoQ29udGVudEVsZW1lbnQpIG9iamVjdCkpOwotCi0JCXJldHVybiBpdGVtTGlzdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBidWlsdCBmcm9tIHRoZSBnaXZlbiBlbGVtZW50cy4gVGhlIG1hcCBoYXMgZ3VpZHMgYXMga2V5cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gYnVpbGRNYXAoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PigpOwotCQkKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJCW1hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbWFwOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NaXNjLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTWlzYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2I4MmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9NaXNjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogTWFueSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgaGFkIGJlZW4gbW92ZWQgdG8gb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWwKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1pc2MgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFdvcmtQcm9kdWN0cyhDb250ZW50UGFja2FnZSBwa2csIExpc3QgbGlzdCkgewotCQlMaXN0IGVsZW1lbnRzID0gcGtnLmdldENvbnRlbnRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gZWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJbGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlMaXN0IHBhY2thZ2VzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWNrYWdlcy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCWdldEFsbFdvcmtQcm9kdWN0cygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsV29ya1Byb2R1Y3RzKENvbnRlbnRQYWNrYWdlIHBrZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbFdvcmtQcm9kdWN0cyhwa2csIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGdldEFsbFRhc2tzKENvbnRlbnRQYWNrYWdlIHBrZywgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgVGFzaykgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlnZXRBbGxUYXNrcygoQ29udGVudFBhY2thZ2UpIG9iaiwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsVGFza3MoQ29udGVudFBhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QWxsVGFza3MocGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFVuY2F0ZWdvcml6ZWRUYXNrcyhDb250ZW50UGFja2FnZSBwa2cpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MocGtnLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MoQ29udGVudFBhY2thZ2UgcGtnLCBMaXN0IGxpc3QpIHsKLQkJTGlzdCBlbGVtZW50cyA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrCi0JCQkJCSYmIEFzc29jaWF0aW9uSGVscGVyLmdldERpc2NpcGxpbmVzKChUYXNrKSBvYmopLmlzRW1wdHkoKSkgewotCQkJCWxpc3QuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJTGlzdCBwYWNrYWdlcyA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBwYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlnZXRBbGxVbmNhdGVnb3JpemVkVGFza3MoKENvbnRlbnRQYWNrYWdlKSBvYmosIGxpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihOYW1lZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZChTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkpOwotCQlmb3IgKGUgPSAoTmFtZWRFbGVtZW50KSAoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKTsgZSAhPSBudWxsCi0JCQkJJiYgZSAhPSBwbHVnaW47IGUgPSAoTmFtZWRFbGVtZW50KSAoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKSkgewotCQkJbGlzdC5hZGQoMCwgU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpKTsKLQkJfQotCQlTdHJpbmdbXSBwYXRoID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShwYXRoKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxOYW1lZEVsZW1lbnQ+IGdldE9iamVjdFRyZWVSZWxhdGl2ZVRvUGx1Z2luKE5hbWVkRWxlbWVudCBlKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJQXJyYXlMaXN0PE5hbWVkRWxlbWVudD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZWRFbGVtZW50PigpOwotCQlsaXN0LmFkZChlKTsKLQkJZm9yIChlID0gKE5hbWVkRWxlbWVudCllLmVDb250YWluZXIoKTsgZSAhPSBudWxsCi0JCQkJJiYgZSAhPSBwbHVnaW47IGUgPSAoTmFtZWRFbGVtZW50KWUuZUNvbnRhaW5lcigpKSB7Ci0JCQlsaXN0LmFkZCgwLCBlKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGhSZWxhdGl2ZVRvTGlicmFyeShOYW1lZEVsZW1lbnQgZSkgewotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKQotCQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoZS5nZXROYW1lKCkpOwotCQlTdHJpbmdbXSBhcnIgPSBnZXRQYXRoUmVsYXRpdmVUb1BsdWdpbihlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKLQkJCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGFycltpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBiYXNlIHBsdWdpbnMgb2YgdGhlIGdpdmVuIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbEJhc2UoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWdldEFsbEJhc2UocGx1Z2luLCBsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbEJhc2UoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgYmFzZSA9IHBsdWdpbi5nZXRCYXNlcygpOwotCi0JCS8vIENoZWNrIGlmIHRoZSBiYXNlcyBpbiB0aGUgbGlzdCBhbHJlYWR5LgotCQlpZiAoIWxpc3QuY29udGFpbnNBbGwoYmFzZSkpIHsKLQkJCWxpc3QuYWRkQWxsKGJhc2UpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmFzZS5zaXplKCk7IGkrKykgewotCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgYmFzZS5nZXQoaSk7Ci0JCQlnZXRBbGxCYXNlKHBsdWdpbiwgbGlzdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCYXNlT2YoTWV0aG9kUGx1Z2luIGJhc2UsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfQotCQlMaXN0IGJhc2VzID0gcGx1Z2luLmdldEJhc2VzKCk7Ci0JCWludCBzaXplID0gYmFzZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJaWYgKGJhc2UgPT0gYmFzZXMuZ2V0KGkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaXNCYXNlT2YoYmFzZSwgKE1ldGhvZFBsdWdpbikgYmFzZXMuZ2V0KGkpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvTW9kZWxTdHJ1Y3R1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Nb2RlbFN0cnVjdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2EzNTkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9Nb2RlbFN0cnVjdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGludGVybmFsIHN0cnVjdHVyZSBvZiBhIG1ldGhvZCBwbHVnaW4gd2l0aCBwcmVkZWZpbmVkIHBhY2thZ2VzCi0gKiAgCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxTdHJ1Y3R1cmUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNb2RlbFN0cnVjdHVyZSBERUZBVUxUID0gbmV3IE1vZGVsU3RydWN0dXJlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBISURERU5fUEFDS0FHRV9OQU1FID0gIkhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BBQ0tBR0VfTkFNRSA9ICJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUkVfQ09OVEVOVF9QQUNBS0dFX05BTUUgPSAiQ29yZUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JJRVMgPSAiQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX1NFVF9QQUNLQUdFX05BTUUgPSAiUm9sZVNldHMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0lQTElORV9QQUNLQUdFX05BTUUgPSAiRGlzY2lwbGluZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JZX1BBQ0tBR0VfTkFNRSA9ICJDdXN0b21DYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DT1JFX0NPTlRFTlRfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENPUkVfQ09OVEVOVF9QQUNBS0dFX05BTUUgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUk9MRV9TRVRfUEFDS0FHRV9QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIFJPTEVfU0VUX1BBQ0tBR0VfTkFNRX07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfRElTQ0lQTElORV9ERUZfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsIERJU0NJUExJTkVfUEFDS0FHRV9OQU1FIH07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1RPT0xfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJUb29scyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9TVEFOREFSRF9DQVRFR09SWV9QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIlN0YW5kYXJkQ2F0ZWdvcmllcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9ERUxJVkVSWV9QUk9DRVNTX1BBVEggPSB7ICJEZWxpdmVyeVByb2Nlc3NlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsICJDYXBhYmlsaXR5UGF0dGVybnMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9ET01BSU5fUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJEb21haW5zIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfV09SS19QUk9EVUNUX1RZUEVfUEFUSCA9IHsKLQkJQ09OVEVOVF9QQUNLQUdFX05BTUUsIENBVEVHT1JJRVMsICJXUCBUeXBlcyIgfTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIENVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUV9OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9FU1RJTUFUSU5HX01PREVMU19QQVRIID0gewotCQlDT05URU5UX1BBQ0tBR0VfTkFNRSwgQ0FURUdPUklFUywgIkVzdGltYXRpbmdNb2RlbHMiIH07IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9QUk9DRVNTX0NPTlRSSUJVVElPTl9QQVRIID0geyAiUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIH07IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9QQVRIID0geyAiUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVzIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQUxMX1BSRURFRklORURfUEFUSFMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIFN0cmluZ1tdIGNvcmVDb250ZW50UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSByb2xlU2V0UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBkaXNjaXBsaW5lRGVmaW5pdGlvblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZG9tYWluUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSB0b29sUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBjYXBhYmlsaXR5UGF0dGVyblBhdGg7Ci0KLQlwdWJsaWMgU3RyaW5nW10gZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSB3b3JrUHJvZHVjdFR5cGVQYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIHByb2Nlc3NDb250cmlidXRpb25QYXRoOwotCi0JcHVibGljIFN0cmluZ1tdIGN1c3RvbUNhdGVnb3J5UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBlc3RpbWF0aW5nTW9kZWxQYXRoOwotCQotCXB1YmxpYyBTdHJpbmdbXSBzdGFuZGFyZENhdGVnb3J5UGF0aDsKLQotCXB1YmxpYyBTdHJpbmdbXSBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGg7Ci0KLQkvKioKLQkgKiB0aGlzIGlzIHRoZSBtZXRob2QgdG8gcmV0dXJuIGFsbCB0aGUgc3lzdGVtIGRlZmluZWQgcGFja2FnZSBwYXRoIFBsZWFzZQotCSAqIGFkZCB0aGlzIHRoaXMgYXJyYXkgd2hlbiBldmVyIHlvdSBoYXZlIG5ldyBzeXN0ZW0gcGFja2FnZXMgZGVmaW5lZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW11bXSBnZXRBbGxTeXN0ZW1QYXRocygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXVtdIHsgY29yZUNvbnRlbnRQYXRoLCByb2xlU2V0UGF0aCwKLQkJCQlkaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsIGRvbWFpblBhdGgsIHRvb2xQYXRoLAotCQkJCWNhcGFiaWxpdHlQYXR0ZXJuUGF0aCwgZGVsaXZlcnlQcm9jZXNzUGF0aCwKLQkJCQl3b3JrUHJvZHVjdFR5cGVQYXRoLCBwcm9jZXNzQ29udHJpYnV0aW9uUGF0aCwKLQkJCQljdXN0b21DYXRlZ29yeVBhdGgsIHN0YW5kYXJkQ2F0ZWdvcnlQYXRoLAotCQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGF0aCwgfTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW11bXSBnZXRDYXRlZ29yeVBhdGhzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdW10geyByb2xlU2V0UGF0aCwgZGlzY2lwbGluZURlZmluaXRpb25QYXRoLAotCQkJCWRvbWFpblBhdGgsIHRvb2xQYXRoLCB3b3JrUHJvZHVjdFR5cGVQYXRoLAotCQkJCXN0YW5kYXJkQ2F0ZWdvcnlQYXRoLCBjdXN0b21DYXRlZ29yeVBhdGgsIH07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9MaW5lcyhTdHJpbmdbXSBwYXRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBsaW5lcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG1heCA9IHBhdGgubGVuZ3RoIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJbGluZXMuYXBwZW5kKHBhdGhbaV0pLmFwcGVuZCgnXG4nKTsKLQkJfQotCQlsaW5lcy5hcHBlbmQocGF0aFttYXhdKTsKLQkJcmV0dXJuIGxpbmVzLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9GaWxlUGF0aChTdHJpbmdbXSBwYXRoKSB7Ci0JCVN0cmluZ0J1ZmZlciBsaW5lcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG1heCA9IHBhdGgubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlsaW5lcy5hcHBlbmQocGF0aFtpXSkuYXBwZW5kKCcvJyk7Ci0JCX0KLQkJcmV0dXJuIGxpbmVzLnRvU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIHsKLQkJREVGQVVMVC5jb3JlQ29udGVudFBhdGggPSBERUZBVUxUX0NPUkVfQ09OVEVOVF9QQVRIOwotCQlERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCA9IERFRkFVTFRfRElTQ0lQTElORV9ERUZfUEFUSDsKLQkJREVGQVVMVC5yb2xlU2V0UGF0aCA9IERFRkFVTFRfUk9MRV9TRVRfUEFDS0FHRV9QQVRIOwotCQlERUZBVUxULmRvbWFpblBhdGggPSBERUZBVUxUX0RPTUFJTl9QQVRIOwotCQlERUZBVUxULnRvb2xQYXRoID0gREVGQVVMVF9UT09MX1BBVEg7Ci0JCURFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoID0gREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoID0gREVGQVVMVF9ERUxJVkVSWV9QUk9DRVNTX1BBVEg7Ci0JCURFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCA9IERFRkFVTFRfV09SS19QUk9EVUNUX1RZUEVfUEFUSDsKLQkJREVGQVVMVC5wcm9jZXNzQ29udHJpYnV0aW9uUGF0aCA9IERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSDsKLQkJREVGQVVMVC5zdGFuZGFyZENhdGVnb3J5UGF0aCA9IERFRkFVTFRfU1RBTkRBUkRfQ0FURUdPUllfUEFUSDsKLQkJREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGggPSBERUZBVUxUX0NVU1RPTV9DQVRFR09SWV9QQVRIOwotCQlERUZBVUxULmVzdGltYXRpbmdNb2RlbFBhdGggPSBERUZBVUxUX0VTVElNQVRJTkdfTU9ERUxTX1BBVEg7Ci0JCURFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoID0gREVGQVVMVF9QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX1BBVEg7Ci0KLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5jb3JlQ29udGVudFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5yb2xlU2V0UGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmRvbWFpblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC50b29sUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC53b3JrUHJvZHVjdFR5cGVQYXRoKSk7Ci0JCUFMTF9QUkVERUZJTkVEX1BBVEhTLmFkZCh0b0ZpbGVQYXRoKERFRkFVTFQucHJvY2Vzc0NvbnRyaWJ1dGlvblBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5zdGFuZGFyZENhdGVnb3J5UGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCkpOwotCQlBTExfUFJFREVGSU5FRF9QQVRIUy5hZGQodG9GaWxlUGF0aChERUZBVUxULmVzdGltYXRpbmdNb2RlbFBhdGgpKTsKLQkJQUxMX1BSRURFRklORURfUEFUSFMKLQkJCQkuYWRkKHRvRmlsZVBhdGgoREVGQVVMVC5wcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZVBhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NDb250cmlidXRpb25QYWNrYWdlKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQkvLyBib29sZWFuIG9sZCA9IHBsdWdpbi5lRGVsaXZlcigpOwotCQl0cnkgewotCQkJLy8gY3JlYXRlIFByb2Nlc3NDb250cmlidXRpb25zIHByb2Nlc3MgcGFja2FnZQotCQkJLy8KLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCQlwa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoWzBdKTsKLQotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24KLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIoZmFsc2UpOwotCi0JCQlwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCXJldHVybiBwa2c7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIG9yaWdpbmFsIG5vdGlmYWN0aW9uIHNldHRpbmcKLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NQYWNrYWdlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlUGFja2FnZSgKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJLy8gYm9vbGVhbiBvbGQgPSBwbHVnaW4uZURlbGl2ZXIoKTsKLQkJdHJ5IHsKLQkJCS8vIGNyZWF0ZSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZXMgcHJvY2VzcyBwYWNrYWdlCi0JCQkvLwotCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCXBrZy5zZXROYW1lKE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoWzBdKTsKLQotCQkJLy8gZGlzYWJsZSBub3RpZmljYXRpb24KLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIoZmFsc2UpOwotCi0JCQlwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCXJldHVybiBwa2c7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIG9yaWdpbmFsIG5vdGlmYWN0aW9uIHNldHRpbmcKLQkJCS8vCi0JCQlwbHVnaW4uZVNldERlbGl2ZXIodHJ1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUGx1Z2luVUlQYWNrYWdlc01hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM4NmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9QbHVnaW5VSVBhY2thZ2VzTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogSG9sZHMgYSBtYXAgb2YgUGx1Z2luIFBhY2thZ2UgbmFtZXMgdG8gdGhlIGxpc3Qgb2YgcGx1Z2lucyBjb250YWluZWQgYnkgdGhlbQotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luVUlQYWNrYWdlc01hcCBleHRlbmRzIEhhc2hNYXA8U3RyaW5nLCBTZXQ8TWV0aG9kUGx1Z2luPj4gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgzMjEzNzkwMTU4NzAwOTAyNTZMOwotCi0JcHVibGljIFBsdWdpblVJUGFja2FnZXNNYXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgcGFja2FnZU5hbWUsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJU2V0PE1ldGhvZFBsdWdpbj4gcGx1Z2lucyA9IGdldChwYWNrYWdlTmFtZSk7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpIHsKLQkJCXBsdWdpbnMgPSBuZXcgSGFzaFNldDxNZXRob2RQbHVnaW4+KCk7Ci0JCX0KLQkJcGx1Z2lucy5hZGQocGx1Z2luKTsKLQkJcHV0KHBhY2thZ2VOYW1lLCBwbHVnaW5zKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJlZGVjZXNzb3JMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJlZGVjZXNzb3JMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZGI3NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1ByZWRlY2Vzc29yTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBwcmVkZWNlc3NvciBsaXN0IG9mIGFuIGl0ZW0gcHJvdmlkZXIgZm9yIGEgd29yawotICogYnJlYWtkb3duIGVsZW1lbnQuIEl0IGNhbGN1bGF0ZXMgdGhlIHByZWRlY2Vzc29ycyBiYXNlZCBvbiB0aGUgY3VycmVudGx5Ci0gKiBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGFuZCBhY2NvcmRpbmcgdG8gdmFyaWFiaWxpdHkgcnVsZXMuIEl0IGNhbiByZWZyZXNoCi0gKiBpdHNlbGYgdXBvbiBjaGFuZ2UgaW4gcHJlZGVjZXNzb3IgbGlzdCBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJlZGVjZXNzb3JMaXN0IGV4dGVuZHMgQXJyYXlMaXN0PE9iamVjdD4gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzYxNzg1MzA5MjU3MDQxMjA4Mkw7CQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfVE9fU1RBUlQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19TVEFSVDsgCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTklTSF9UT19GSU5JU0ggPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX0ZJTklTSF9UT19GSU5JU0g7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19TVEFSVCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLldvcmtPcmRlclR5cGVBYmJyZXZpYXRpb25fU1RBUlRfVE9fU1RBUlQ7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UT19GSU5JU0ggPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uX1NUQVJUX1RPX0ZJTklTSDsgCi0JcHJpdmF0ZSBNYXAgbWFwNExpbmtUeXBlID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGVjZXNzb3JMaXN0IEVNUFRZX0xJU1QgPSBuZXcgUHJlZGVjZXNzb3JMaXN0KCkgewotCi0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzkwNDY3NjA5ODIxNzA5NzAxNkw7Ci0KLQkJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGVsZW1lbnQpIHsKLQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gYWRkKE9iamVjdCBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChqYXZhLnV0aWwuQ29sbGVjdGlvbiBjKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIGphdmEudXRpbC5Db2xsZWN0aW9uIGMpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByaXZhdGUgT2JqZWN0IG9iamVjdDsKLQotCXByaXZhdGUgQWRhcHRlciBsaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24gbXNnKSB7Ci0JCQlzd2l0Y2ggKG1zZy5nZXRGZWF0dXJlSUQoQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJCXJlZnJlc2goKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBPYmplY3QgdG9wOwotCi0JcHJpdmF0ZSBQcmVkZWNlc3Nvckxpc3QoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaXN0KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQllLmVBZGFwdGVycygpLmFkZCgwLCBsaXN0ZW5lcik7Ci0JCWlmICghbWFwNExpbmtUeXBlLmlzRW1wdHkoKSkKLQkJCW1hcDRMaW5rVHlwZS5jbGVhcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAoZSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCSgoRU9iamVjdCkgZSkuZUFkYXB0ZXJzKCkucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCQljbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJpZ2h0IHRvcCBpdGVtIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRyZWUgdG8gc2VhcmNoIGZvcgotCSAqIGl0ZW0gcHJvdmlkZXJzIG9mIHByZWRlY2Vzc29ycwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFRvcEl0ZW0oKSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCQlpZiAoaXRlbVByb3ZpZGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCS8vIHRoaXMgcmVwcmVzZW50cyBhbiBpbmhlcml0ZWQgYnJlYWtkb3duIGVsZW1lbnQKLQkJCQkvLwotCQkJCUJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhlKTsKLQotCQkJCU9iamVjdCB0b3AgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJZm9yIChPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCQkJdG9wID0gcGFyZW50OwotCQkJCQlCcmVha2Rvd25FbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbAotCQkJCQkJCS51bndyYXAocGFyZW50KTsKLQkJCQkJUHJvY2VzcyBwYXJlbnRQcm9jID0gVG5nVXRpbAotCQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKHBhcmVudEVsZW1lbnQpOwotCQkJCQlpZiAocGFyZW50UHJvYyAhPSBwcm9jKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJCQlwYXJlbnQgPSAoKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50KQotCQkJCQkJCQkuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChwYXJlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0b3A7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBpdGVtUHJvdmlkZXIuZ2V0VG9wSXRlbSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJb2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0VG9wSXRlbSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciB7Ci0JCXByaXZhdGUgaW50IGRlcHRoTGV2ZWw7Ci0JCXByaXZhdGUgT2JqZWN0IGl0ZW1Qcm92aWRlcjsKLQkJcHJpdmF0ZSBPYmplY3Qgb2JqZWN0OwotCQlwcml2YXRlIE9iamVjdCBlbGVtZW50OwotCQkKLQkJcHJpdmF0ZSBEZXB0aExldmVsSXRlbVByb3ZpZGVyKE9iamVjdCBvYmplY3QsIGludCBkZXB0aExldmVsLCBPYmplY3QgaXRlbVByb3ZpZGVyLCBPYmplY3QgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdGhpcy5kZXB0aExldmVsID0gZGVwdGhMZXZlbDsKLQkJCXRoaXMuaXRlbVByb3ZpZGVyID0gaXRlbVByb3ZpZGVyOwotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJfQkKLQkJCi0JCXB1YmxpYyBPYmplY3QgZ2V0SXRlbVByb3ZpZGVyKCkgewotCQkJcmV0dXJuIGl0ZW1Qcm92aWRlcjsKLQkJfQotCX0KLQkKLQlzdGF0aWMgTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBjcmVhdGVJdGVtUHJvdmlkZXJMaXN0KE9iamVjdCB0b3AsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUxpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGVwdGhMZXZlbEl0ZW1Qcm92aWRlcj4oKTsKLQkJRGVwdGhMZXZlbEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBEZXB0aExldmVsQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PigKLQkJCQlhZGFwdGVyRmFjdG9yeSwgdG9wKSB7Ci0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPE9iamVjdD4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAobyk7IAotCQkJCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKS5pdGVyYXRvcigpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG8pOwotCQkJCQl9CQkJCi0JCX07Ci0JCWZvcig7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaW50IGRlcHRoTGV2ZWwgPSBpdGVyLmdldERlcHRoTGV2ZWwoKTsKLQkJCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWxpc3QuYWRkKG5ldyBEZXB0aExldmVsSXRlbVByb3ZpZGVyKG9iamVjdCwgZGVwdGhMZXZlbCwgaXRlbVByb3ZpZGVyLCBlbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlRWxlbWVudFRvSXRlbVByb3ZpZGVyc01hcChNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCwgT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBpdGVtUHJvdmlkZXIpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGl0ZW1Qcm92aWRlcnMgPSBtYXAuZ2V0KGVsZW1lbnQpOwotCQlpZihpdGVtUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCWl0ZW1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCW1hcC5wdXQoZWxlbWVudCwgaXRlbVByb3ZpZGVycyk7Ci0JCX0KLQkJaXRlbVByb3ZpZGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQlpdGVtUHJvdmlkZXJzID0gbWFwLmdldCh2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpOwotCQkJCWlmKGl0ZW1Qcm92aWRlcnMgPT0gbnVsbCkgewotCQkJCQlpdGVtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJCW1hcC5wdXQodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBpdGVtUHJvdmlkZXJzKTsKLQkJCQl9Ci0JCQkJaXRlbVByb3ZpZGVycy5hZGQoaXRlbVByb3ZpZGVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlNYXA8PywgQ29sbGVjdGlvbjxPYmplY3Q+PiBjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAoTGlzdDxEZXB0aExldmVsSXRlbVByb3ZpZGVyPiBsaXN0KSB7Ci0JCU9iamVjdCB0b3AgPSBnZXRUb3BJdGVtKCk7Ci0JCS8vIGZpbmQgdG9wJ3MgaXRlbSBwcm92aWRlcgotCQkvLwotCQlEZXB0aExldmVsSXRlbVByb3ZpZGVyIHRvcElwID0gbnVsbDsKLQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQlmb3IgKERlcHRoTGV2ZWxJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyIDogbGlzdCkgewotCQkJaWYoaXRlbVByb3ZpZGVyLm9iamVjdCA9PSB0b3ApIHsKLQkJCQl0b3BJcCA9IGl0ZW1Qcm92aWRlcjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0SW5kZXgrKzsKLQkJCX0KLQkJfQotCQlhc3NlcnQgdG9wSXAgIT0gbnVsbCA6ICJDb3VsZCBub3QgZmluZCBpdGVtIHByb3ZpZGVyIG9mIHRvcCBvYmplY3QgaW4gdGhlIGdpdmVuIGl0ZW0gcHJvdmlkZXIgbGlzdC4iOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmQgdGhlIGluZGV4IG9mIGxhc3QgaXRlbSBwcm92aWRlciBpbiB0aGUgc3VidHJlZSBvZiB0b3AKLQkJLy8KLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaW50IGxhc3RJbmRleCA9IHN0YXJ0SW5kZXggKyAxOwotCQlmb3IgKDsgbGFzdEluZGV4IDwgc2l6ZSAmJiBsaXN0LmdldChsYXN0SW5kZXgpLmRlcHRoTGV2ZWwgPiB0b3BJcC5kZXB0aExldmVsOyBsYXN0SW5kZXgrKyk7CQkKLQkJCQotCQkvLyBjb3B5IHRoZSB0cmVlIHRvIGEgbWFwIG9mIGJyZWFrZG93biBlbGVtZW50IC8gaXRlbSBwcm92aWRlciBmb3IKLQkJLy8gcmV1c2UKLQkJLy8KLQkJSGFzaE1hcDxPYmplY3QsIENvbGxlY3Rpb248T2JqZWN0Pj4gbWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+KCk7Ci0JCWZvciAoRGVwdGhMZXZlbEl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgOiBsaXN0LnN1Ykxpc3Qoc3RhcnRJbmRleCwgbGFzdEluZGV4KSkgewotCQkJdXBkYXRlRWxlbWVudFRvSXRlbVByb3ZpZGVyc01hcChtYXAsIGl0ZW1Qcm92aWRlci5lbGVtZW50LCBpdGVtUHJvdmlkZXIuaXRlbVByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQkKLQlzdGF0aWMgTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PiBjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAoT2JqZWN0IHRvcCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yPE9iamVjdD4oCi0JCQkJYWRhcHRlckZhY3RvcnksIHRvcCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxPYmplY3Q+IGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChvKTsgCi0JCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IgfHwgZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKG8pOwotCQkJfQkJCQotCQl9OwotCQkKLQkJLy8gY29weSB0aGUgdHJlZSB0byBhIG1hcCBvZiBicmVha2Rvd24gZWxlbWVudCAvIGl0ZW0gcHJvdmlkZXIgZm9yCi0JCS8vIHJldXNlCi0JCS8vCi0JCUhhc2hNYXA8T2JqZWN0LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgQ29sbGVjdGlvbjxPYmplY3Q+PigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlpZihiZSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGlwID0gKElCU0l0ZW1Qcm92aWRlcikgKG9iaiBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlciA/IG9iaiA6Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKSk7Ci0JCQkJdXBkYXRlRWxlbWVudFRvSXRlbVByb3ZpZGVyc01hcChtYXAsIGJlLCBpcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCU9iamVjdCB1bndyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZiAodW53cmFwcGVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHVud3JhcHBlZDsKLQkJCUxpc3Qgd29ya09yZGVycyA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQkJCWlmICh3b3JrT3JkZXJzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQl0b3AgPSBnZXRUb3BJdGVtKCk7CQotCQkJaW5pdGlhbGl6ZShjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAodG9wLCBhZGFwdGVyRmFjdG9yeSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKE1hcDw/LCBDb2xsZWN0aW9uPE9iamVjdD4+IG1hcCkgewotCi0JCWlmIChUbmdVdGlsLnVud3JhcChvYmplY3QpIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwKLQkJCQkJLnVud3JhcChvYmplY3QpOwotCQkJTGlzdCB3b3JrT3JkZXJzID0gZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQkJaWYgKHdvcmtPcmRlcnMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHRvcEVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHRvcCk7Ci0JCQlTdHJpbmcgdG9wR1VJRCA9IHRvcEVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCi0JCQlpbnQgbiA9IHdvcmtPcmRlcnMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgd29ya09yZGVycy5nZXQoaSk7CQkJCQkKLQotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKHdvcmtPcmRlci5nZXRMaW5rVHlwZSgpLmdldExpdGVyYWwoKSk7Ci0KLQkJCQlCcmVha2Rvd25FbGVtZW50IHByZWQgPSB3b3JrT3JkZXIuZ2V0UHJlZCgpOwotCQkJCUNvbGxlY3Rpb248T2JqZWN0PiBpdGVtUHJvdmlkZXJzID0gbWFwLmdldChwcmVkKTsKLQkJCQlpZihpdGVtUHJvdmlkZXJzICE9IG51bGwgJiYgIWl0ZW1Qcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KHdvcmtPcmRlciwgCi0JCQkJCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLldPUktfT1JERVJfX1BSRURFQ0VTU09SX1BST0NFU1NfUEFUSCk7Ci0JCQkJCWlmKHByb3AgPT0gbnVsbCkgewotCQkJCQkJLy8gcHJlZGVjZXNzb3IgaXMgbG9jYWwgb3IgV29ya09yZGVyIGlzIGNyZWF0ZWQgYmVmb3JlIHN1cHBvcnQgZm9yICdncmVlbicgcHJlZGVjZXNzb3IKLQkJCQkJCS8vIGJ5IHNhdmluZyBpdHMgcHJvY2VzcyBwYXRoIGluIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBvZiB0aGUgd29yayBvcmRlcgotCQkJCQkJLy8KLQkJCQkJCWJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgaXRlbVByb3ZpZGVycy5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBwcm9jUGF0aCA9IHByb3AuZ2V0VmFsdWUoKTsKLQkJCQkJCQotCQkJCQkJLy8gY2FsY3VsYXRlIHRoZSBwYXRoIGluIHRoaXMgcHJvY2VzcwotCQkJCQkJLy8JCQkJCQkKLQkJCQkJCWludCBpbmRleDsKLQkJCQkJCVN0cmluZyBndWlkID0gdG9wR1VJRDsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdG9wRWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCA/ICgoVmFyaWFiaWxpdHlFbGVtZW50KXRvcEVsZW1lbnQpLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA6IG51bGw7Ci0JCQkJCQlmb3IoaW5kZXggPSBwcm9jUGF0aC5pbmRleE9mKGd1aWQpOyBpbmRleCA9PSAtMSAmJiBiYXNlICE9IG51bGw7IGluZGV4ID0gcHJvY1BhdGguaW5kZXhPZihndWlkKSkgewotCQkJCQkJCWlmKGJhc2UgIT0gbnVsbCkgewotCQkJCQkJCQlndWlkID0gYmFzZS5nZXRHdWlkKCk7IAotCQkJCQkJCQliYXNlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoaW5kZXggIT0gLTEpIHsKLQkJCQkJCQlTdHJpbmdCdWZmZXIgc3RyQnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIocHJvY1BhdGguc3Vic3RyaW5nKGluZGV4ICsgZ3VpZC5sZW5ndGgoKSkpOwotCQkJCQkJCU9iamVjdCB0b3BPYmplY3QgPSB0b3A7Ci0JCQkJCQkJZm9yKFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSA9IHRvcEVsZW1lbnQ7IHdiZSAhPSBudWxsOykgewotCQkJCQkJCQlzdHJCdWZmLmluc2VydCgwLCB3YmUuZ2V0R3VpZCgpKTsKLQkJCQkJCQkJc3RyQnVmZi5pbnNlcnQoMCwgJy8nKTsKLQkJCQkJCQkJaWYodG9wT2JqZWN0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJCXRvcE9iamVjdCA9IHdiZSA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnQpdG9wT2JqZWN0KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXRvcE9iamVjdCA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHRvcE9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQkJCXdiZSA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAodG9wT2JqZWN0KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlzdHJCdWZmLmluc2VydCgwLCAiOi8iKS5pbnNlcnQoMCwgU3VwcHJlc3Npb24uV0JTKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBwYXRoID0gc3RyQnVmZi50b1N0cmluZygpOwotCQkJCQkJCWZpbmRfd3JhcHBlcjoKLQkJCQkJCQlmb3IgKE9iamVjdCBpdGVtUHJvdmlkZXIgOiBpdGVtUHJvdmlkZXJzKSB7Ci0JCQkJCQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJCQlTdHJpbmcgcCA9IFN1cHByZXNzaW9uLmdldFBhdGgoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBpdGVtUHJvdmlkZXIpOwotCQkJCQkJCQkJaWYocGF0aC5lcXVhbHMocCkpIHsKLQkJCQkJCQkJCQlic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGl0ZW1Qcm92aWRlcjsKLQkJCQkJCQkJCQlicmVhayBmaW5kX3dyYXBwZXI7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGJzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCWFkZChic0l0ZW1Qcm92aWRlcik7Ci0JCQkJCQltYXA0TGlua1R5cGUucHV0KGJzSXRlbVByb3ZpZGVyLmdldElkKCksIHdvcmtPcmRlci5nZXRMaW5rVHlwZSgpLmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlzdXBlci5jbGVhcigpOwotCQlpZiAoIW1hcDRMaW5rVHlwZS5pc0VtcHR5KCkpCi0JCQltYXA0TGlua1R5cGUuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoKCkgewotCQljbGVhcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCQotCXZvaWQgcmVmcmVzaChMaXN0PERlcHRoTGV2ZWxJdGVtUHJvdmlkZXI+IGxpc3QpIHsKLQkJY2xlYXIoKTsKLQkJaW5pdGlhbGl6ZShjcmVhdGVCcmVha2Rvd25FbGVtZW50VG9JdGVtUHJvdmlkZXJNYXAobGlzdCkpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24jdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0b1VuU3VwcHJlc3NlZFN0cmluZyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvVW5TdXBwcmVzc2VkU3RyaW5nKFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyByZW1vdmUgdGhlIGl0ZW0gcHJvdmlkZXJzIG9mIHRoZSBkZWxldGVkIGVsZW1lbnRzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQllID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKSBlKS5nZXRUYXJnZXQoKTsKLQkJCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJCS8vIG9iamVjdCBkZWxldGVkCi0JCQkJCS8vCi0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KSBlOwotCQkJCUFjdGl2aXR5IHN1cGVyQWN0ID0gYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJaWYgKHN1cGVyQWN0ID09IG51bGwgJiYgVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKSAhPSBiZSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpc0VtcHR5KCkpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbiA9IHNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQoaSk7Ci0JCQlpZiAoKHN1cCA9PSBudWxsKSB8fCAhc3VwLmlzU3VwcHJlc3NlZChic0l0ZW1Qcm92aWRlcikpIHsKLQkJCQlzdHJCdWYuYXBwZW5kKGJzSXRlbVByb3ZpZGVyLmdldElkKCkpLmFwcGVuZCgnLCcpOwkJCQkKLQkJCX0KLQkJfQotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQobik7Ci0JCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJfQotCi0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1VuU3VwcHJlc3NlZFN0cmluZyhTdXBwcmVzc2lvbiBzdXAsIGJvb2xlYW4gaXNMaW5rVHlwZVJlcXVpcmVkKSB7Ci0JCS8vIHJlbW92ZSB0aGUgaXRlbSBwcm92aWRlcnMgb2YgdGhlIGRlbGV0ZWQgZWxlbWVudHMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXIubmV4dCgpKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCWUgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJCWlmIChlID09IG51bGwpIHsKLQkJCQkJLy8gb2JqZWN0IGRlbGV0ZWQKLQkJCQkJLy8KLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIGU7Ci0JCQkJQWN0aXZpdHkgc3VwZXJBY3QgPSBiZS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCQlpZiAoc3VwZXJBY3QgPT0gbnVsbCAmJiBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmUpICE9IGJlKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlzRW1wdHkoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBuID0gc2l6ZSgpIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGdldChpKTsKLQkJCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJCXN0ckJ1Zi5hcHBlbmQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSk7Ci0JCQkgICAgT2JqZWN0IHZhbHVlID0gbWFwNExpbmtUeXBlLmdldChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCSAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBpc0xpbmtUeXBlUmVxdWlyZWQpIHsKLQkJCSAgICAJaW50IHYgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJICAgIAlTdHJpbmcgYWJicmV2ID0gdG9Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uKHYpOwotCQkJICAgIAlpZihhYmJyZXYgIT0gbnVsbCkgewotCQkJICAgIAkJc3RyQnVmLmFwcGVuZChhYmJyZXYpOwotCQkJICAgIAl9Ci0JCQkgICAgfQotCQkJCXN0ckJ1Zi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJfQotCQlJQlNJdGVtUHJvdmlkZXIgYnNJdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBnZXQobik7Ci0JCWlmICgoc3VwID09IG51bGwpIHx8ICFzdXAuaXNTdXBwcmVzc2VkKGJzSXRlbVByb3ZpZGVyKSkgewotCQkJc3RyQnVmLmFwcGVuZChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKG1hcDRMaW5rVHlwZS5nZXQoYnNJdGVtUHJvdmlkZXIuZ2V0SWQoKSkpOwotCQkJT2JqZWN0IHZhbHVlID0gbWFwNExpbmtUeXBlLmdldChic0l0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIGlzTGlua1R5cGVSZXF1aXJlZCkgewotCQkgICAgCWludCB2ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZS50b1N0cmluZygpKTsKLQkJICAgIAlTdHJpbmcgYWJicmV2ID0gdG9Xb3JrT3JkZXJUeXBlQWJicmV2aWF0aW9uKHYpOwotCQkgICAgCWlmKGFiYnJldiAhPSBudWxsKSB7Ci0JCSAgICAJCXN0ckJ1Zi5hcHBlbmQoYWJicmV2KTsKLQkJICAgIAl9Ci0JCSAgICB9Ci0JCX0KLQotCQlyZXR1cm4gc3RyQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmVwYXJlVXBkYXRlUHJlZGVjZXNzb3JzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBXb3JrQnJlYWtkb3duRWxlbWVudCB3YmUsCi0JCQlMaXN0PE9iamVjdD4gcHJlZGVjZXNzb3JzLCBMaXN0PFdvcmtPcmRlcj4gYWRkTGlzdCwgTGlzdDxXb3JrT3JkZXI+IHByZWRUb0JlRGVsZXRlZCkgewotCQlXb3JrT3JkZXIgd28gPSBudWxsOwotCQlpbnQgc2l6ZSA9IHdiZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLnNpemUoKTsKLQkJCi0JCS8vIHJlbW92ZSBXb3JrT3JkZXJzIGZvciBwcmVkZWNlc3NvcnMgdGhhdCBhcmUgbm90IGluIHByZWRlY2Vzc29yIGxpc3QgYW5kIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIKLQkJLy8KLQkJSUZpbHRlciBmaWx0ZXIgPSBQcm9jZXNzVXRpbC5nZXRGaWx0ZXIoYWRhcHRlckZhY3RvcnkpOwotCQlib29sZWFuIG51bGxGaWx0ZXIgPSBmaWx0ZXIgPT0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gd2JlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQl3byA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKChudWxsRmlsdGVyIHx8IGZpbHRlci5hY2NlcHQod28uZ2V0UHJlZCgpKSkpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZmluZF9wcmVkOgkJCQkJCQotCQkJCWZvcihPYmplY3QgcHJlZCA6IHByZWRlY2Vzc29ycykgewotCQkJCQlpZihwcmVkIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCWlmKHdvLmdldFByZWQoKSA9PSBwcmVkKSB7Ci0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCWJyZWFrIGZpbmRfcHJlZDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmKHByZWQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQkJaWYoaXNQcmVkZWNlc3NvcigoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHByZWQsIHdvKSkgewotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIWZvdW5kKSB7Ci0JCQkJCXByZWRUb0JlRGVsZXRlZC5hZGQod28pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXNpemUgPSBwcmVkZWNlc3NvcnMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IHByZWRlY2Vzc29ycy5nZXQoaSk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChvYmopOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyID8gb2JqIDogbnVsbCk7Ci0JCQlTdHJpbmcgcHJvY1BhdGggPSBudWxsOwotCQkJZmluZF9wcmVkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gd2JlCi0JCQkJCS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJd28gPSAoV29ya09yZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKHdvLmdldFByZWQoKSA9PSBlbGVtZW50KSB7Ci0JCQkJCWlmKHdyYXBwZXIgIT0gbnVsbCkgewotCQkJCQkJaWYoaXNQcmVkZWNlc3Nvcih3cmFwcGVyLCB3bykpIHsKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWsgZmluZF9wcmVkOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gdGhlIHByZWRlY2Vzc29yIGlzIGxvY2FsLCBubyBuZWVkIHRvIGxvb2sgZm9yIHdyYXBwZXIKLQkJCQkJCS8vCi0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhayBmaW5kX3ByZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kKSB7CQkJCQkKLQkJCQl3byA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJCXdvLnNldFByZWQoZWxlbWVudCk7Ci0JCQkJaWYod3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJCWlmKHByb2NQYXRoID09IG51bGwpIHsKLQkJCQkJCXByb2NQYXRoID0gU3VwcHJlc3Npb24uZ2V0UGF0aCh3cmFwcGVyKTsKLQkJCQkJfQotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuc2V0UHJvcGVydHkod28sIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5XT1JLX09SREVSX19QUkVERUNFU1NPUl9QUk9DRVNTX1BBVEgsIHByb2NQYXRoKTsKLQkJCQl9Ci0JCQkJYWRkTGlzdC5hZGQod28pOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBQYXJzZXMgYSBjb21tYW5kLXNlcGFyYXRlZCBsaXN0IG9mIHByZWRlY2Vzc29yIGluZGV4ZXMgaW50byBsaXN0cyBvZgotCSAqIHByZWRlY2Vzc29yc3MgdG8gYmUgYWRkZWQgYW5kIGRlbGV0ZWQgZm9yIHVwZGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gd2JlCi0JICogQHBhcmFtIGluZGV4TGlzdAotCSAqICAgICAgICAgICAgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvciBpbmRleGVzCi0JICogQHBhcmFtIGFkZExpc3QKLQkgKiBAcGFyYW0gcHJlZFRvQmVEZWxldGVkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcmVwYXJlVXBkYXRlUHJlZGVjZXNzb3JzKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIFdvcmtCcmVha2Rvd25FbGVtZW50IHdiZSwKLQkJCVN0cmluZyBpbmRleExpc3QsIExpc3Q8V29ya09yZGVyPiBhZGRMaXN0LCBMaXN0PFdvcmtPcmRlcj4gcHJlZFRvQmVEZWxldGVkKSB7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2Vzcyh3YmUpOwotCQlMaXN0PE9iamVjdD4gcHJlZGVjZXNzb3JzID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWlmIChQcm9jZXNzVXRpbC5jaGVja1ByZWRlY2Vzc29yTGlzdCh3YmUsIGluZGV4TGlzdCwgYWRhcHRlckZhY3RvcnksCi0JCQkJcHJvY2VzcywgcHJlZGVjZXNzb3JzKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJlcGFyZVVwZGF0ZVByZWRlY2Vzc29ycyhhZGFwdGVyRmFjdG9yeSwgd2JlLCBwcmVkZWNlc3NvcnMsIGFkZExpc3QsIHByZWRUb0JlRGVsZXRlZCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvV29ya09yZGVyVHlwZUFiYnJldmlhdGlvbihpbnQgd29ya09yZGVyVHlwZSkgewotCQlzd2l0Y2god29ya09yZGVyVHlwZSkgewotCQljYXNlIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSF9WQUxVRToKLQkJCXJldHVybiBGSU5JU0hfVE9fRklOSVNIOwotCQljYXNlIFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIX1ZBTFVFOgotCQkJcmV0dXJuIFNUQVJUX1RPX0ZJTklTSDsKLQkJY2FzZSBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX1NUQVJUX1ZBTFVFOgotCQkJcmV0dXJuIFNUQVJUX1RPX1NUQVJUOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHdyYXBwZXIgaXMgYSBwcmVkZWNlc3NvciBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBXb3JrT3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcGFyYW0gd29ya09yZGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByZWRlY2Vzc29yKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIFdvcmtPcmRlciB3b3JrT3JkZXIpIHsKLQkJTWV0aG9kRWxlbWVudFByb3BlcnR5IHByb3AgPSBNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkod29ya09yZGVyLCAKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuV09SS19PUkRFUl9fUFJFREVDRVNTT1JfUFJPQ0VTU19QQVRIKTsKLQkJaWYocHJvcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgcHJvY1BhdGggPSBwcm9wLmdldFZhbHVlKCk7Ci0JCQlTdHJpbmcgcCA9IFN1cHByZXNzaW9uLmdldFBhdGgod3JhcHBlcik7Ci0JCQlyZXR1cm4gcHJvY1BhdGguZXF1YWxzKHApOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1Byb2Nlc3NVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJvY2Vzc1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5NDljMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvUHJvY2Vzc1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5BZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5XcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByb3ZpZGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5Sb2xlRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLlRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuV29ya1Byb2R1Y3REZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5CU0Ryb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkNvcHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0NvbW1hbmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlByb2Nlc3NEZWVwQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuV0JTRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51aS5Vc2VySW50ZXJhY3Rpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByZWRlY2Vzc29yTGlzdC5EZXB0aExldmVsSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5OYW1lQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBkZWZpbmVzIHN0YXRpYyBtZXRob2RzIGZvciBwcm9jZXNzIGF1dGhvcmluZwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb2Nlc3NVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPEVDbGFzcz4gT0JTRWNsYXNzZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxFQ2xhc3M+IFdCU0VjbGFzc2VzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBQQlNFY2xhc3NlcyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFZhcmlhYmlsaXR5VHlwZT4gZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248VmFyaWFiaWxpdHlUeXBlPiBnZXRFeHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMoKSB7Ci0JCWlmIChleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMgPT0gbnVsbCkgewotCQkJZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzID0gbmV3IEFycmF5TGlzdDxWYXJpYWJpbGl0eVR5cGU+KCk7Ci0JCQlleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMKLQkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQlleHRlbmRBbmRMb2NhbENvbnRyaWJ1dGlvblZhcmlhYmlsaXR5VHlwZXMKLQkJCQkJLmFkZChWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0JyZWFrZG93bkVsZW1lbnROYW1lKAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgbmFtZSwgc3VwcHJlc3Npb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJLy8gbWlnaHQgYWxsb3cgZW1wdHkgcHJlc2VudGF0aW9uIG5hbWUgZm9yIGV4dGVuZGVyIG9yIGNvbnRyaWJ1dG9yLiBUaGUgZWxlbWVudCB3aWxsIGluaGVyaXQKLQkJLy8gdGhlIHByZXNlbnRhdGlvbiBuYW1lIGZyb20gdGhlIGJhc2UgZWxlbWVudC4gQ2hlY2sgd2lsbCBiZSBwZXJmb3JtZWQgb24gdGhlIGluaGVyaXRlZCBuYW1lCi0JCS8vCi0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoaXNFeHRlbmRpbmdPckxvY2FsbHlDb250cmlidXRpbmcoZSkpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCW5hbWUgPSBnZXRQcmVzZW50YXRpb25OYW1lKGJhc2UpOwotCQkJfQotCQl9Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrQnJlYWtkb3duRWxlbWVudFByZXNlbnRhdGlvbk5hbWUoCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgQnJlYWtkb3duRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCi0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Um9vdFByb2Nlc3MoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIsIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iaik7Ci0JCWFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocGFyZW50LAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG9iajsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBnZXRSb290UHJvY2VzcyhhZGFwdGVyRmFjdG9yeSwgYWRhcHRlciwgcGFyZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxFQ2xhc3M+IGdldFdCU0VjbGFzc2VzKCkgewotCQlpZiAoV0JTRWNsYXNzZXMgPT0gbnVsbCkgewotCQkJV0JTRWNsYXNzZXMgPSBuZXcgSGFzaFNldDxFQ2xhc3M+KCk7Ci0JCQlXQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSk7Ci0JCQlXQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKSk7Ci0JCQlXQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCkpOwotCQl9Ci0JCXJldHVybiBXQlNFY2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RUNsYXNzPiBnZXRPQlNFY2xhc3NlcygpIHsKLQkJaWYgKE9CU0VjbGFzc2VzID09IG51bGwpIHsKLQkJCU9CU0VjbGFzc2VzID0gbmV3IEhhc2hTZXQ8RUNsYXNzPigpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJT0JTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpKTsKLQkJCU9CU0VjbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIE9CU0VjbGFzc2VzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxFQ2xhc3M+IGdldFBCU0VjbGFzc2VzKCkgewotCQlpZiAoUEJTRWNsYXNzZXMgPT0gbnVsbCkgewotCQkJUEJTRWNsYXNzZXMgPSBuZXcgSGFzaFNldDxFQ2xhc3M+KCk7Ci0JCQlQQlNFY2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkpOwotCQkJUEJTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCkpOwotCQkJUEJTRWNsYXNzZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpKTsKLQkJfQotCQlyZXR1cm4gUEJTRWNsYXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlyc3RFbGVtZW50KEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKQotCQkJcmV0dXJuIHRydWU7Ci0JCUxpbmtlZExpc3Qgc2libGluZ3MgPSBnZXRTaWJsaW5ncyhhZGFwdGVyRmFjdG9yeSwgaXRlbVByb3ZpZGVyLCBvYmopOwotCQlpZiAoc2libGluZ3MgIT0gbnVsbCAmJiAhc2libGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gc2libGluZ3MuZ2V0Rmlyc3QoKSA9PSBvYmo7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaW5rZWRMaXN0IGdldFNpYmxpbmdzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIsIE9iamVjdCBvYmopIHsKLQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQob2JqKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwYXJlbnRJdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChwYXJlbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBMaW5rZWRMaXN0KHBhcmVudEl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnQpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMYXN0RWxlbWVudChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iaik7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkKLQkJCXJldHVybiB0cnVlOwotCQlMaW5rZWRMaXN0IHNpYmxpbmdzID0gZ2V0U2libGluZ3MoYWRhcHRlckZhY3RvcnksIGl0ZW1Qcm92aWRlciwgb2JqKTsKLQkJaWYgKHNpYmxpbmdzICE9IG51bGwgJiYgIXNpYmxpbmdzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHNpYmxpbmdzLmdldExhc3QoKSA9PSBvYmo7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBhZmZlY3RlZCBhZnRlciB0aGUgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlCi0JICogZ2l2ZW4gbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBZmZlY3RlZEVsZW1lbnRzKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24sCi0JCQlJRmlsdGVyIGZpbHRlcikgewotCQlMaXN0IGFmZmVjdGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCU9iamVjdCBvYmogPSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChvYmopOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCWFmZmVjdGVkRWxlbWVudHMuYWRkKG9iaik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQlhZmZlY3RlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5vdGlmaWNhdGlvbi5NT1ZFOgotCQkJb2JqID0gbm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgb2JqKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChlbGVtZW50KSkgewotCQkJCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmaWx0ZXIgPT0gbnVsbCB8fCBmaWx0ZXIuYWNjZXB0KG9iaikpIHsKLQkJCQkJYWZmZWN0ZWRFbGVtZW50cy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gYWZmZWN0ZWRFbGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZWZyZXNoUmVxdWlyZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbiwKLQkJCUlGaWx0ZXIgZmlsdGVyKSB7Ci0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpKSB7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJT2JqZWN0IG9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQob2JqKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBOb3RpZmljYXRpb24uTU9WRToKLQkJCW9iaiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG9iaikuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5hY2NlcHQoZWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZmlsdGVyID09IG51bGwgfHwgZmlsdGVyLmFjY2VwdChvYmopKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0NvbnRhaW5lcihCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGl0ZW1Qcm92aWRlcikgewotCQlhZGRUb0NvbnRhaW5lcihlLCBpdGVtUHJvdmlkZXIsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIEJyZWFrZG93bkVsZW1lbnQgdG8gYSBuZXcgY29udGFpbmVyIGlmIGl0IGRvZXMgbm90IGhhdmUKLQkgKiBvbmUgb3IgbW92ZXMgaXQgdG8gdGhlIHJpZ2h0IGNvbnRhaW5lciBpZiByZXF1ZXN0ZWQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gaXRlbVByb3ZpZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvQ29udGFpbmVyKEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgaXRlbVByb3ZpZGVyLCBib29sZWFuIG1vdmUpIHsKLQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGNvbnRhaW5lciA9ICgoRU9iamVjdCkgcGFyZW50KS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGNvbnRhaW5lcjsKLQkJCX0KLQkJfQotCi0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJaWYgKGFjdC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCS8vIGNyZWF0ZSBuZXcgUHJvY2Vzc1BhY2thZ2UgZm9yIHRoZSBhY3Rpdml0eQotCQkJCS8vCi0JCQkJUHJvY2Vzc1BhY2thZ2UgbmV3UGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJCW5ld1BrZy5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG5ld1BrZyk7Ci0JCQkJbmV3UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChlKTsKLQkJCX0gZWxzZSBpZiAobW92ZSkgewotCQkJCS8vIENoZWNrIGlmIHRoZSBhY3Rpdml0eSdzIFByb2Nlc3NQYWNrYWdlIGlzIGF0IHRoZSByaWdodCBwbGFjZS4KLQkJCQkvLyBJZiBub3QsIG1vdmUgaXQgdG8gdGhlIHJpZ2h0IFByb2Nlc3NDb21wb25lbnQuCi0JCQkJLy8KLQkJCQlQcm9jZXNzUGFja2FnZSBvbGRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdC5lQ29udGFpbmVyKCk7Ci0JCQkJaWYgKG9sZFBrZy5lQ29udGFpbmVyKCkgIT0gcGtnKSB7Ci0JCQkJCXBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKG9sZFBrZyk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGUpOwotCQkJfSBlbHNlIGlmIChtb3ZlICYmIGUuZUNvbnRhaW5lcigpICE9IHBrZykgewotCQkJCS8vIG1vdmUgdG8gbmV3IFByb2Nlc3NQYWNrYWdlCi0JCQkJLy8KLQkJCQlwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFBhcmVudChPYmplY3QgY2hpbGQsIE9iamVjdCBwYXJlbnQsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlPYmplY3QgYWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGNoaWxkLAotCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuc2V0UGFyZW50KHBhcmVudCk7Ci0JCX0gCi0vLwkJZWxzZSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbihMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2Vycl9zZXRwYXJlbnQgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfY2hpbGRhZGFwdGVyICsgYWRhcHRlcik7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSb2xlRGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUm9sZURlc2NyaXB0b3IgY3JlYXRlUm9sZURlc2NyaXB0b3IoUm9sZSByb2xlKSB7Ci0JCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQkJcm9sZURlc2Muc2V0Um9sZShyb2xlKTsKLQkJU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSByb2xlLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJcm9sZURlc2Muc2V0TmFtZShyb2xlLmdldE5hbWUoKSk7Ci0JCXJvbGVEZXNjLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbC5pc0JsYW5rKHByZXNlbnRhdGlvbk5hbWUpID8gcm9sZQotCQkJCS5nZXROYW1lKCkgOiBwcmVzZW50YXRpb25OYW1lKTsKLQkJLy8gcm9sZURlc2Muc2V0QnJpZWZEZXNjcmlwdGlvbihyb2xlLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCXJldHVybiByb2xlRGVzYzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQlXb3JrUHJvZHVjdCB3cCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BEZXNjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0JCXdwRGVzYy5zZXRXb3JrUHJvZHVjdCh3cCk7Ci0JCXdwRGVzYy5zZXROYW1lKHdwLmdldE5hbWUoKSk7Ci0JCXdwRGVzYwotCQkJCS5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayh3cC5nZXRQcmVzZW50YXRpb25OYW1lKCkpID8gd3AKLQkJCQkJCS5nZXROYW1lKCkKLQkJCQkJCTogd3AuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJLy8gd3BEZXNjLnNldEJyaWVmRGVzY3JpcHRpb24od3AuZ2V0QnJpZWZEZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIHdwRGVzYzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzaE5lZWRlZChBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCXJldHVybiBVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5yZWZyZXNoTmVlZGVkKGFkYXB0ZXJGYWN0b3J5LCBpdGVtUHJvdmlkZXIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFByZWRlY2Nlc3Nvckxpc3RzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIFByb2Nlc3MgcHJvYykgewotCQlMaXN0PERlcHRoTGV2ZWxJdGVtUHJvdmlkZXI+IGxpc3QgPSBQcmVkZWNlc3Nvckxpc3QuY3JlYXRlSXRlbVByb3ZpZGVyTGlzdChwcm9jLCBmYWN0b3J5KTsKLQkJZm9yIChEZXB0aExldmVsSXRlbVByb3ZpZGVyIGlwIDogbGlzdCkgewotCQkJT2JqZWN0IGl0ZW1Qcm92aWRlciA9IGlwLmdldEl0ZW1Qcm92aWRlcigpOwotCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJUHJlZGVjZXNzb3JMaXN0IHByZWRMaXN0ID0gKChJQlNJdGVtUHJvdmlkZXIpaXRlbVByb3ZpZGVyKS5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCQlpZihwcmVkTGlzdCAhPSBudWxsKSB7Ci0JCQkJCXByZWRMaXN0LnJlZnJlc2gobGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgSURzIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzIG9mIHRoZSB2aWV3IG9mIHRoZSBnaXZlbiBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFkYXB0ZXIgZmFjdG9yeSBvZiB0aGUgY3VycmVudCBwcm9jZXNzIHZpZXcgKFdCUywgVEJTLCBXUEJTLAotCSAqICAgICAgICAgICAgQ0JTKQotCSAqIEBwYXJhbSBwcm9jCi0JICogICAgICAgICAgICBtdXN0IGJlIHJlZnJlc2hlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlSURzKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIFByb2Nlc3MgcHJvYykgewotCQlBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I8T2JqZWN0PigKLQkJCQlmYWN0b3J5LCBwcm9jKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPE9iamVjdD4gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKG8pOyAKLQkJCQlpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvciB8fCBlIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRyZW4obyk7Ci0JCQl9CQkJCi0JCX07Ci0KLQkJT2JqZWN0IG9iajsKLQkJZm9yIChpbnQgaWQgPSAwOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCW9iaiA9IGl0ZXIubmV4dCgpOwotCQkJT2JqZWN0IGFkYXB0ZXIgPSBmYWN0b3J5LmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJaWYgKGl0ZW1Qcm92aWRlciAhPSBudWxsCi0JCQkJCQkmJiBUbmdVdGlsLnVud3JhcChvYmopIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJaXRlbVByb3ZpZGVyLnNldElkKGlkKyspOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVmlld2VyKEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIFByb2Nlc3MgcHJvYykgewotCQlVc2VySW50ZXJhY3Rpb25IZWxwZXIuZ2V0VUlIZWxwZXIoKS5yZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgZWxlbWVudCBJRHMgaW4gdGhvc2Ugdmlld2VycyB0aGF0IHJlcXVpcmUgdGhpcy4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaElEc0luVmlld2VycyhmaW5hbCBFeHBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJVXNlckludGVyYWN0aW9uSGVscGVyLmdldFVJSGVscGVyKCkucmVmcmVzaElEc0luVmlld2VyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaEFsbFZpZXdlcnMoZmluYWwgRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJlZnJlc2hBbGxWaWV3ZXJzKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIHRoZSBicmVha2Rvd24gZWxlbWVudCB3aG9zZSBwcmVkZWNlc3NvciBsaXN0IHRvIGJlIGNoZWNrZWQuCi0JICogQHBhcmFtIHByZWRJZExpc3QKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBwcmVkZWNlc3NvciBJRHMgKEludGVnZXIpIGFzIHNob3duIGluIHRoZSBJRCBjb2x1bW4KLQkgKiAgICAgICAgICAgIG9mIHRoZSBlZGl0b3IKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcnMKLQkgKiAgICAgICAgICAgIG91dHB1dCwgdGhlIHByZWRlY2Vzc29yIGxpc3QKLQkgKiBAcmV0dXJuIG51bGwgaWYgcHJlZExpc3QgaXMgdmFsaWQsIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQcmVkZWNlc3Nvckxpc3QoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUxpc3Q8SW50ZWdlcj4gcHJlZElkTGlzdCwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBwcm9jZXNzLAotCQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycykgewotCQkvLyBnZXQgQnJlYWtkb3duRWxlbWVudCBsaXN0IGZyb20gSUQgbGlzdAotCQkvLwotCQlMaXN0PE9iamVjdD4gYmVMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCUxpc3Q8T2JqZWN0PiBhbGxFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcjxPYmplY3Q+KGFkYXB0ZXJGYWN0b3J5LAotCQkJCXByb2Nlc3MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJSW50ZWdlciBpZCA9IG5ldyBJbnRlZ2VyKGl0ZW1Qcm92aWRlci5nZXRJZCgpKTsKLQkJCU9iamVjdCBlbGVtZW50ID0gVG5nVXRpbC51bndyYXAob2JqKTsKLQkJCWFsbEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCWlmIChwcmVkSWRMaXN0LmNvbnRhaW5zKGlkKSkgewotCQkJCWJlTGlzdC5hZGQob2JqKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JCS8vCi0JCWludCBzaXplID0gYmVMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBUbmdVdGlsLnVud3JhcChiZUxpc3QuZ2V0KGkpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9iajsKLQkJCQlpZiAoUHJvY2Vzc1V0aWwuY2hlY2tDaXJjdWxhcihlLCBwcmVkLCBhbGxFbGVtZW50cykpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfYnJlYWtkb3duX2VsZW1lbnQ7IAotCQkJCX0KLQkJCQlpZiAoVG5nVXRpbC5pc1N1YmVsZW1lbnRPZihwcmVkLCBlLCBhZGFwdGVyRmFjdG9yeSkpIHsKLQkJCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3NhbWVfc3ViX2VsZW1lbnQ7IAotCQkJCX0KLQkJCQlpZiAoVG5nVXRpbC5pc1N1cGVyRWxlbWVudE9mKHByZWQsIGUsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF9Qcm9jZXNzVXRpbF9lcnJfY2hpbGRfZWxlbWVudDsgCi0JCQkJfQotCQkJfSBlbHNlCi0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLnV0aWxfUHJvY2Vzc1V0aWxfZXJyX3dyb25nX2VsZW1lbnQ7IAotCQl9Ci0KLQkJaWYgKHByZWRlY2Vzc29ycyAhPSBudWxsKQotCQkJcHJlZGVjZXNzb3JzLmFkZEFsbChiZUxpc3QpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5Ci0JICogCi0JICogQHBhcmFtIHN1Y2Nlc3NvcgotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqIEBwYXJhbSBsaXN0Ci0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiBhbGwgYnJlYWtkb3duIGVsZW1lbnRzIGluIHRoZSBicmVha2Rvd24gc3RydWN0dXJlCi0JICovCi0JIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0NpcmN1bGFyKFdvcmtCcmVha2Rvd25FbGVtZW50IHN1Y2Nlc3NvciwKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRlY2Vzc29yLCBMaXN0IGxpc3QpIHsKLQkJaWYgKHN1Y2Nlc3NvciA9PSBwcmVkZWNlc3NvcikgewotCQkJaWYgKHByZWRlY2Vzc29yLmdldElzUmVwZWF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcHJlZGVjZXNzb3IuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVdvcmtPcmRlciBlbGVtZW50ID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQlXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkID0gZWxlbWVudC5nZXRQcmVkKCk7Ci0JCQlpZiAocHJlZCAhPSBwcmVkZWNlc3NvciAmJiBsaXN0LmNvbnRhaW5zKHByZWQpKSB7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIoc3VjY2Vzc29yLCBwcmVkLCBsaXN0KSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkgCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFByZWRlY2Vzc29yTGlzdChXb3JrQnJlYWtkb3duRWxlbWVudCBwcmVkZWNlc3NvciwKLQkJCUxpc3QgbGlzdCwgTGlzdCBwcmVkTGlzdCkgewotCQlpZiAoIXByZWRMaXN0LmNvbnRhaW5zKHByZWRlY2Vzc29yKSkKLQkJCXByZWRMaXN0LmFkZChwcmVkZWNlc3Nvcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByZWRlY2Vzc29yLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgZWxlbWVudCA9IChXb3JrT3JkZXIpIGl0ZXIubmV4dCgpOwotCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZCA9IChXb3JrQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudAotCQkJCQkuZ2V0UHJlZCgpOwotCQkJaWYgKHByZWQgIT0gcHJlZGVjZXNzb3IgJiYgbGlzdC5jb250YWlucyhwcmVkKSkgewotCQkJCWlmICghcHJlZExpc3QuY29udGFpbnMocHJlZCkpIHsKLQkJCQkJcHJlZExpc3QuYWRkKHByZWQpOwotCQkJCQlnZXRBbGxQcmVkZWNlc3Nvckxpc3QocHJlZCwgbGlzdCwgcHJlZExpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgYnJlYWtkb3duIGVsZW1lbnQgd2hvc2UgcHJlZGVjZXNzb3IgbGlzdCB0byBiZSBjaGVja2VkLgotCSAqIEBwYXJhbSBwcmVkTGlzdAotCSAqICAgICAgICAgICAgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwcmVkZWNlc3NvciBJRHMKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcGFyYW0gdG9wQWN0Ci0JICogQHBhcmFtIHByZWRlY2Vzc29ycwotCSAqICAgICAgICAgICAgb3V0cHV0LCB0aGUgcHJlZGVjZXNzb3IgbGlzdAotCSAqIEBwYXJhbSBhbGxFbGVtZW50cwotCSAqICAgICAgICAgICAgb3V0cHV0LCB0aGUgd2hvbGUgYnJlYWtkb3duIGVsZW1lbnQgbGlzdCBpcyBjb3BpZWQgaW50byB0aGlzCi0JICogICAgICAgICAgICBsaXN0LgotCSAqIEByZXR1cm4gbnVsbCBpZiBwcmVkTGlzdCBpcyB2YWxpZC4gVGhlIHByZWRlY2Vzc29yIGxpc3QgaXMgc2F2ZWQgaW4KLQkgKiAgICAgICAgIHByZWRlY2Vzc29ycyBhbmQgdGhlIHdob2xlIGJyZWFrZG93biBlbGVtZW50IGxpc3QgaXMgc2F2ZWQgaW4KLQkgKiAgICAgICAgIGFsbEVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrUHJlZGVjZXNzb3JMaXN0KFdvcmtCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlTdHJpbmcgcHJlZExpc3QsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgdG9wQWN0LAotCQkJTGlzdDxPYmplY3Q+IHByZWRlY2Vzc29ycykgewotCQlMaXN0PEludGVnZXI+IGlkTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmVkTGlzdCwgIiwiKTsgdG9rZW5zLmhhc01vcmVUb2tlbnMoKTspIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCUludGVnZXIgaWQ7Ci0JCQl0cnkgewotCQkJCWlkID0gbmV3IEludGVnZXIodG9rZW4pOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRQcmVkZWNlc3NvckVycm9yX21zZzsgCi0JCQl9Ci0JCQlpZExpc3QuYWRkKGlkKTsKLQkJfQotCi0JCXJldHVybiBjaGVja1ByZWRlY2Vzc29yTGlzdChlLCBpZExpc3QsIGFkYXB0ZXJGYWN0b3J5LCB0b3BBY3QsCi0JCQkJcHJlZGVjZXNzb3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBvYmplY3QncyBtZXRob2QgcGFja2FnZSBhbmQgcGx1Z2luIHRvIHRoZSBkZWZhdWx0Ci0JICogY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpZiB0aGV5IGFyZSBub3QgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB5ZXQuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGFkZGVkT2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywgRU9iamVjdCBlLAotCQkJU2V0IGFkZGVkT2JqZWN0cykgewotCQkvLyBhZGQgdGhlIGVsZW1lbnQncyBtZXRob2QgcGFja2FnZSB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoZSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWFkZFRhc2tUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChUYXNrKSBlLCBhZGRlZE9iamVjdHMsIHRydWUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGU7Ci0JCQlhZGRXUFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgd3AsIGFkZGVkT2JqZWN0cyk7Ci0JCQlMaXN0IHRhc2tzID0gZ2V0VGFza3NGb3JXb3JrUHJvZHVjdCh3cCwgY29uZmlnKTsKLQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlhZGRUYXNrVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoVGFzaykgaXRlci5uZXh0KCksCi0JCQkJCQkJYWRkZWRPYmplY3RzLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlSb2xlIHJvbGUgPSAoUm9sZSkgZTsKLQkJCWFkZFJvbGVUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIHJvbGUsIGFkZGVkT2JqZWN0cyk7Ci0KLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoQWN0aXZpdHkpIGUsIGFkZGVkT2JqZWN0cyk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIChHdWlkYW5jZSkgZSwgYWRkZWRPYmplY3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFjdGl2aXR5VG9EZWZhdWx0Q29uZmlndXJhdGlvbihQcm9jZXNzIHByb2MsIEFjdGl2aXR5IGFjdGl2aXR5LCBTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlUbmdVdGlsLmFkZFRvKGNvbmZpZywgVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KGFjdGl2aXR5KSwgYWRkZWRPYmplY3RzKTsKLQkJLy8gYWRkIGxpbmtlZCBlbGVtZW50IG9mIGRlc2NyaXB0b3JzCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQlNZXRob2RFbGVtZW50IG8gPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZSk7Ci0JCQkJaWYobyAhPSBudWxsKSB7Ci0JCQkJCWFkZFRvRGVmYXVsdENvbmZpZ3VyYXRpb24ocHJvYywgbywgYWRkZWRPYmplY3RzKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCS8vIHRoaXMgaXMgbmVlZGVkIGZvciBhZGRpbmcgc3ViLWFjdGl2aXRpZXMgZGVzY3JpcHRvcnMgCi0JCQkJYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChBY3Rpdml0eSkgZSwgYWRkZWRPYmplY3RzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCWZvciAoQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0aXZpdHkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOyBiYXNlICE9IG51bGw7IGJhc2UgPSAoQWN0aXZpdHkpIGJhc2UKLQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJYWRkQWN0aXZpdHlUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIGJhc2UsIGFkZGVkT2JqZWN0cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRhc2tUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywgVGFzayB0YXNrLAotCQkJU2V0IGFkZGVkT2JqZWN0cywgYm9vbGVhbiBpbmNsdWRlV29ya1Byb2R1Y3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCi0JCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgdGFzaywgYWRkZWRPYmplY3RzKTsKLQotCQkvLyBhZGQgYWxsIG90aGVyIGRlcGVuZGVuY2llcwotCQkvLwotCi0JCS8vIGFkZCByb2xlcwotCQlBcnJheUxpc3Q8RU9iamVjdD4gZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwotCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHRhc2suZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCWRlcGVuZGVuY2llcy5hZGRBbGwodGFzay5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJZm9yIChFT2JqZWN0IGVPYmplY3QgOiBkZXBlbmRlbmNpZXMpIHsKLQkJCVRuZ1V0aWwuYWRkVG9Db25maWd1cmF0aW9uKGNvbmZpZywgZU9iamVjdCwKLQkJCQkJYWRkZWRPYmplY3RzKTsKLQkJfQotCi0JCS8vIGFkZCB3b3JrIHByb2R1Y3RzCi0JCWlmIChpbmNsdWRlV29ya1Byb2R1Y3RzKSB7Ci0JCQlkZXBlbmRlbmNpZXMuY2xlYXIoKTsKLQkJCWRlcGVuZGVuY2llcy5hZGRBbGwodGFzay5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJZGVwZW5kZW5jaWVzLmFkZEFsbCh0YXNrLmdldE91dHB1dCgpKTsKLQkJCWRlcGVuZGVuY2llcy5hZGRBbGwodGFzay5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWZvciAoRU9iamVjdCBlT2JqZWN0IDogZGVwZW5kZW5jaWVzKSB7Ci0JCQkJYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKHByb2MsIChXb3JrUHJvZHVjdCkgZU9iamVjdCwKLQkJCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKFN0ZXAgc3RlcCA6IHRhc2suZ2V0U3RlcHMoKSkgewotCQkJRU9iamVjdCBiYXNlID0gc3RlcC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCBiYXNlLCBhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJvbGVUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywKLQkJCVJvbGUgcm9sZSwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IHByb2MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJVG5nVXRpbC5hZGRUb0NvbmZpZ3VyYXRpb24oY29uZmlnLCByb2xlLCBhZGRlZE9iamVjdHMpOwotCQkKLQkJLy8gYWRkIHdvcmsgcHJvZHVjdHMKLQkJQXJyYXlMaXN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQkJZGVwZW5kZW5jaWVzLmFkZEFsbChyb2xlLmdldE1vZGlmaWVzKCkpOwotCQlkZXBlbmRlbmNpZXMuYWRkQWxsKHJvbGUuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWFkZFdQVG9EZWZhdWx0Q29uZmlndXJhdGlvbihwcm9jLCAoV29ya1Byb2R1Y3QpIGl0ZXIubmV4dCgpLAotCQkJCQlhZGRlZE9iamVjdHMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkV1BUb0RlZmF1bHRDb25maWd1cmF0aW9uKFByb2Nlc3MgcHJvYywKLQkJCVdvcmtQcm9kdWN0IHdwLCBTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gcHJvYy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIHdwLCBhZGRlZE9iamVjdHMpOwotCQlpZiAod3AgaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChEZWxpdmVyYWJsZSkgd3ApLmdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlUbmdVdGlsLmFkZFRvQ29uZmlndXJhdGlvbihjb25maWcsIChFT2JqZWN0KSBpdGVyLm5leHQoKSwKLQkJCQkJCWFkZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlVGFza0Rlc2NyaXB0b3JTdGVwcyhBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCVRhc2tEZXNjcmlwdG9yIHRhc2tEZXNjKSB7Ci0JCWlmICh0YXNrRGVzYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlUYXNrIHRhc2sgPSB0YXNrRGVzYy5nZXRUYXNrKCk7Ci0KLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0aXZpdHkpCi0JCQkJLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCUxpc3Q8U3RlcD4gc3RlcHMgPSAoTGlzdDxTdGVwPikgY29uZmlnQXBwbGljYXRvci5nZXRSZWZlcmVuY2UodGFzaywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCksIGNvbmZpZyk7Ci0KLQkJLy8gYWRkIHRob3NlIHN0ZXBzIHRvIFRhc2tEZXNjcmlwdG9yIGlmIHRoZXkgYXJlIG5vdCB0aGVyZSB5ZXQuCi0JCS8vCi0JCWZvciAoU3RlcCBzdGVwIDogc3RlcHMpIHsKLQkJCWlmICghdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmNvbnRhaW5zKHN0ZXApKSB7Ci0JCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZChzdGVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIE1ldGhvZEVsZW1lbnQgdGhhdCB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEFzc29jaWF0ZWRFbGVtZW50KERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gKChSb2xlRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0Um9sZSgpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuICgoVGFza0Rlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFRhc2soKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRVJlZmVyZW5jZSBnZXRMaW5rUmVmZXJlbmNlKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZVdyYXBwZXJzKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkoKElXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHRhc2tzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gd29ya3Byb2R1Y3QgaW4gdGhlaXIgb3V0cHV0Ci0JICogaW4gdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUYXNrc0ZvcldvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IHdwLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGNvbmZpZ0FwcGxpY2F0b3IgPSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKTsKLQotCQlMaXN0IHRhc2tzID0gKExpc3QpIGNvbmZpZ0FwcGxpY2F0b3IuZ2V0UmVmZXJlbmNlKHdwLCBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLCBjb25maWcpOwotCi0JCXJldHVybiB0YXNrczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxsIHdvcmtwcm9kdWN0cyB0aGF0IGhhdmUgdGhlIHJvbGUgYXMgcmVzcG9uc2libGUgcm9sZSBpbiB0aGUKLQkgKiBnaXZlbiBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V29ya1Byb2R1Y3RzRm9yUm9sZShSb2xlIHJvbGUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IgY29uZmlnQXBwbGljYXRvciA9IFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCQlMaXN0IHdwcyA9IChMaXN0KSBjb25maWdBcHBsaWNhdG9yLmdldFJlZmVyZW5jZShyb2xlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIGNvbmZpZyk7Ci0JCXJldHVybiB3cHM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgd29ya3Byb2R1Y3RzIHdoaWNoIGFyZSwgZXhjZXB0IHRoZSBjb250cmlidXRvciwgaW4gdGhlIGdpdmVuCi0JICogcGx1Z2luLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEFsbFdvcmtQcm9kdWN0cyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0KLQkJQ29udGVudFBhY2thZ2UgY29yZUNvbnRlbnRQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShwbHVnaW4sCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jb3JlQ29udGVudFBhdGgpOwotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGNvcmVDb250ZW50UGtnLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MzM3NTIwNjYzMjQ4Mzc5MzdMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSkKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iamVjdDsKLQkJCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCi0JCQkJCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KQotCQkJCQkJCSYmICFUbmdVdGlsCi0JCQkJCQkJCQkuaXNDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCUxpc3QgbWV0aG9kRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQltZXRob2RFbGVtZW50cy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRhc2ssIGV4Y2VwdCB0aGUgY29udHJpYnV0b3IsIGluIHRoZSBnaXZlbiBwbHVnaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsVGFza3MoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlDb250ZW50UGFja2FnZSBjb3JlQ29udGVudFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY29yZUNvbnRlbnRQa2csIGZhbHNlKSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzgzMzc1MjA2NjMyNDgzNzkzN0w7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpKQotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJCUNvbnRlbnRQYWNrYWdlIHBrZyA9IChDb250ZW50UGFja2FnZSkgb2JqZWN0OwotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFzawotCQkJCQkJCSYmICFUbmdVdGlsCi0JCQkJCQkJCQkuaXNDb250cmlidXRvcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCUxpc3QgdGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgVGFzaykgewotCQkJCXRhc2tzLmFkZChlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlyZXR1cm4gVG5nVXRpbC5pc0dlbmVyYWxpemVyKGUsCi0JCQkJZ2V0RXh0ZW5kQW5kTG9jYWxDb250cmlidXRpb25WYXJpYWJpbGl0eVR5cGVzKCkpOwotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChlLmdldFByZXNlbnRhdGlvbk5hbWUoKSA9PSBudWxsCi0JCQkJfHwgZS5nZXRQcmVzZW50YXRpb25OYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKGlzRXh0ZW5kaW5nT3JMb2NhbGx5Q29udHJpYnV0aW5nKGUpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBiYXNlID0gKEJyZWFrZG93bkVsZW1lbnQpICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlKQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBlLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbFdpdGhQYXRoKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoZS5nZXROYW1lKCkpOwotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSk7Ci0JCWlmIChwcm9jICE9IG51bGwpIHsKLQkJCXBhdGguYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYyk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlwYXRoLmFwcGVuZChwbHVnaW4uZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCWlmIChlICE9IHByb2MpIHsKLQkJCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChwcm9jLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtb2RlbCBpbmZvIG9mIHRoZSBnaXZlbiBCcmVha2Rvd25FbGVtZW50IGluIHRoZSBnaXZlbgotCSAqIFN0cmluZ0J1ZmZlcgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gbW9kZWxJbmZvCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldE1vZGVsSW5mbyhCcmVha2Rvd25FbGVtZW50IGUsIE9iamVjdCBhZGFwdGVyLAotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbykgewotCQlpZiAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJaWYgKG1vZGVsSW5mby5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbW9kZWxJbmZvLmFwcGVuZCgiOyAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlTdHJpbmcgcGF0dGVybiA9IG51bGw7Ci0JCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2NvbnRyaWJ1dGVzdG87IAotCQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51dGlsX1Byb2Nlc3NVdGlsX2xvY2FsQ29udHJpYnV0ZXN0bzsgCi0JCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQkJCXBhdHRlcm4gPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5wcm9jZXNzX2V4dGVuZHM7IAotCQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfcmVwbGFjZXM7IAotCQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCQkJcGF0dGVybiA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnByb2Nlc3NfbG9jYWxSZXBsYWNlczsgCi0JCQkJfQotCi0JCQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCQkvLyBBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0KLQkJCQkvLyAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpYWRhcHRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQkvLyBPYmplY3QgaXRlbVByb3ZpZGVyID0gZmFjdG9yeS5hZGFwdChiYXNlLAotCQkJCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJLy8gaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJLy8gSUJTSXRlbVByb3ZpZGVyIGJzSXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikKLQkJCQkvLyBpdGVtUHJvdmlkZXI7Ci0JCQkJLy8gUHJvY2VzcyBwcm9jID0gKFByb2Nlc3MpIGJzSXRlbVByb3ZpZGVyLmdldFRvcEl0ZW0oKTsKLQkJCQkvLyBpZihwcm9jICE9IG51bGwpIHsKLQkJCQkvLyBzdHJidWYuYXBwZW5kKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHByb2MpLmdldE5hbWUoKSkuYXBwZW5kKCc6JykKLQkJCQkvLyAuYXBwZW5kKHByb2MuZ2V0TmFtZSgpKS5hcHBlbmQoJzonKTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQotCQkJCS8vIFByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudCkKLQkJCQkvLyBiYXNlKTsKLQkJCQkvLyBpZihwcm9jICE9IG51bGwpIHsKLQkJCQkvLyBNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ocHJvYyk7Ci0JCQkJLy8gaWYocGx1Z2luICE9IG51bGwpIHsKLQkJCQkvLyBtb2RlbEluZm8uYXBwZW5kKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHByb2MpLmdldE5hbWUoKSkuYXBwZW5kKCc6Jyk7Ci0JCQkJLy8gfQotCQkJCS8vIG1vZGVsSW5mby5hcHBlbmQocHJvYy5nZXROYW1lKCkpOwotCQkJCS8vIH0KLQkJCQkvLwkJCQkKLQkJCQkvLyBpZihiYXNlICE9IHByb2MpIHsKLQkJCQkvLyBtb2RlbEluZm8uYXBwZW5kKCc6JykuYXBwZW5kKGJhc2UuZ2V0TmFtZSgpKTsKLQkJCQkvLyB9Ci0JCQkJLy8gbW9kZWxJbmZvLmFwcGVuZCgiJyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhdHRlcm4gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcGF0aCA9IGdldExhYmVsV2l0aFBhdGgoKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UpOwotCQkJCQltb2RlbEluZm8uYXBwZW5kKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHBhdHRlcm4sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcGF0aCB9KSk7Ci0KLQkJCQkJZ2V0TW9kZWxJbmZvKChCcmVha2Rvd25FbGVtZW50KSBiYXNlLCBhZGFwdGVyLCBtb2RlbEluZm8pOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPSAoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQl3cmFwcGVyLmdldE93bmVyKCk7Ci0JCQlpZiAod3JhcHBlci5nZXRGZWF0dXJlKCkgIT0gbnVsbCkgewotCQkJCW1vZGVsSW5mby5hcHBlbmQoVG5nVXRpbC5nZXRGZWF0dXJlVGV4dCh3cmFwcGVyLmdldEZlYXR1cmUoKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod3JhcHBlciBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLS8vCQkJCQlnZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IobW9kZWxJbmZvLAotLy8JCQkJCQkJKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgVG5nVXRpbC51bndyYXAod3JhcHBlcikpOwotCQkJCQkKLQkJCQkJZ2V0V1BETW9kZWxJbmZvKG1vZGVsSW5mbywgd3JhcHBlciwgd3JhcHBlcik7Ci0JCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JRC5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRDsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUzsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTi5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU47Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkc7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEU7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVguZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTy5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVM7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURS5lcXVhbHMocHJvcGVydHkpKSB7Ci0JCQlyZXR1cm4gSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURTsKLQkJfSBlbHNlIGlmIChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFOwotCQl9IGVsc2UgaWYgKElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUw7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCXJldHVybiBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQ7Ci0JCX0gZWxzZSBpZiAoSUJTSXRlbVByb3ZpZGVyLkNPTF9IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJcmV0dXJuIElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgcHJvcGVydHksCi0JCQlPYmplY3QgYWRhcHRlcikgewotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAob2JqZWN0KTsKLQkJaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSUQpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkJJiYgYWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBTdHJpbmcudmFsdWVPZigoKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcikuZ2V0SWQoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElJdGVtTGFiZWxQcm92aWRlcikgewotCQkJCXJldHVybiAoKElJdGVtTGFiZWxQcm92aWRlcikgYWRhcHRlcikuZ2V0VGV4dChlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gZ2V0UHJlc2VudGF0aW9uTmFtZShlKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRURFQ0VTU09SUykgewotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpLmdldFByZWRlY2Vzc29ycygpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc0V2ZW50RHJpdmVuKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBTdHJpbmcKLQkJCQkJCS52YWx1ZU9mKCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIGUpLmdldElzT25nb2luZygpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoKChXb3JrQnJlYWtkb3duRWxlbWVudCkgZSkKLQkJCQkJCS5nZXRJc1JlcGVhdGFibGUoKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocHJvcGVydHkgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCXJldHVybiBlLmdldFByZWZpeCgpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTykgewotCQkJU3RyaW5nQnVmZmVyIG1vZGVsSW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWdldE1vZGVsSW5mbyhlLCBhZGFwdGVyLCBtb2RlbEluZm8pOwotCQkJcmV0dXJuIG1vZGVsSW5mby50b1N0cmluZygpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkKLQkJCQkJCS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVOYW1lID0gd3AuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIkRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkICAKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgPT0gbnVsbCAmJiBlIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCXR5cGVOYW1lID0gKChFT2JqZWN0KSBlKS5lQ2xhc3MoKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAodHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0U3RyaW5nKCJfVUlfIiArIHR5cGVOYW1lICsgIl90eXBlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKCgoVGVhbVByb2ZpbGUpIGUpCi0JCQkJCQkuZ2V0U3VwZXJUZWFtKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilhZGFwdGVyKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCX0KLQkJCQllbHNlIGlmKGFkYXB0ZXIgaW5zdGFuY2VvZiBJdGVtUHJvdmlkZXJBZGFwdGVyKSB7Ci0JCQkJCWFkYXB0ZXJGYWN0b3J5ID0gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBnZXRUZWFtTGlzdFN0cmluZyhnZXRUZWFtUHJvZmlsZXMob2JqZWN0LCAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKWFkYXB0ZXIsIGFkYXB0ZXJGYWN0b3J5KSk7Ci0gCQkJfQotCQl9Ci0JCWlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlOwotCQkJCXJldHVybiBUbmdVdGlsLmNoZWNrTnVsbCh3cGQuZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZTsKLQkJCQlyZXR1cm4gVG5nVXRpbC5jaGVja051bGwod3BkLmdldEFjdGl2aXR5RXhpdFN0YXRlKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJTGlzdCBkZWxpdmVyYWJsZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRvcnMoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJaWYgKGRlbGl2ZXJhYmxlcy5pc0VtcHR5KCkpCi0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IG1heCA9IGRlbGl2ZXJhYmxlcy5zaXplKCkgLSAxOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQkJc3RyQnVmLmFwcGVuZCgKLQkJCQkJCQlUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZGVsaXZlcmFibGVzLmdldChpKSkpCi0JCQkJCQkJLmFwcGVuZCgnLCcpOwotCQkJCX0KLQkJCQlzdHJCdWYuYXBwZW5kKFRuZ1V0aWwKLQkJCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKGRlbGl2ZXJhYmxlcy5nZXQobWF4KSkpOwotCQkJCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwcm9wZXJ0eSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRJc09wdGlvbmFsKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGUuZ2V0SXNQbGFubmVkKCkpOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5ID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSB7Ci0JCQlyZXR1cm4gU3RyaW5nLnZhbHVlT2YoZS5nZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCBwYXJlbnQgYWN0aXZpdHkgZm9yIHRlYW0gcHJvZmlsZSBicmVha2Rvd24gZWxlbWVudAotCSAqIFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkgZG9lc24ndCB3b3JrIGNvcnJlY3RseSBmb3Igc3ViLXRlYW1zCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYnJlYWtkb3duIGVsZW1lbnRzIHVuZGVyIHRlYW1hbGxvY2F0aW9uCi0JICogQHBhcmFtIHRlYW0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0UGFyZW50QWN0aXZpdHlPZlRlYW0oQnJlYWtkb3duRWxlbWVudCBickVsZW1lbnQpCi0JewotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChickVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCU9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChickVsZW1lbnQpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkpIHsKLQkJCWJyRWxlbWVudCA9IChCcmVha2Rvd25FbGVtZW50KSBwYXJlbnQ7Ci0JCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGJyRWxlbWVudCwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KGJyRWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gcGFyZW50OwkKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHJvbGVkZXNjcmlwdG9ycyB1bmRlciBhY3Rpdml0eSB3aGljaCBjb3VsZCBwb3NzaWJsZSBtYXRjaCBmb3IKLQkgKiByb2xlcyB1bmRlciB0aGUgdGVhbXMuIEl0IHdpbGwgcmVjdXJzZSB0aHJ1IGFsbCBjaGlsZCBhY3Rpdml0aWVzIHRvIGZpbmQgCi0JICogcm9sZSBkZXNjcmlwdG9ycwotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gcm9sZURlc2NMaXN0Ci0JICogQHBhcmFtIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldFJvbGVEZXNjcmlwdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQWN0aXZpdHkgcGFyZW50LCAgTGlzdCByb2xlRGVzY0xpc3QsIExpc3Qgcm9sZXMpIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQotCQlPYmplY3QgbyA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7Ci0JCQlMaXN0IGNoaWxkcmVuID0gKExpc3QpIG87Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCWdldFJvbGVEZXNjcmlwdG9yKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIG9iaiwKLQkJCQkJCQlyb2xlRGVzY0xpc3QsIHJvbGVzKTsKLQkJCQl9Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCXsKLQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCQkJaWYgKChyb2xlRGVzYy5nZXRSb2xlKCkhPSBudWxsKSAmJiAKLQkJCQkJCQkocm9sZXMuY29udGFpbnMocm9sZURlc2MuZ2V0Um9sZSgpKSkpCi0JCQkJCQlyb2xlRGVzY0xpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZWFtTGlzdFN0cmluZyhMaXN0IHRlYW1Qcm9maWxlcykgewotCQlpZiAodGVhbVByb2ZpbGVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gdGVhbVByb2ZpbGVzLnNpemUoKSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKHRlYW1Qcm9maWxlcy5nZXQoaSkpKQotCQkJCQkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJc3RyQnVmLmFwcGVuZChUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUodGVhbVByb2ZpbGVzLmdldChtYXgpKSk7Ci0JCXJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIFN0cmluZyBwcm9wLAotCQkJU3RyaW5nIHR4dCkgewotCQlpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpIHsKLQkJCWUuc2V0TmFtZSh0eHQpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVGSVgpIHsKLQkJCWUuc2V0UHJlZml4KHR4dCk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTikgewotCQkJZS5zZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4udmFsdWVPZih0eHQpKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORykgewotCQkJZS5zZXRJc09uZ29pbmcoQm9vbGVhbi52YWx1ZU9mKHR4dCkpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFKSB7Ci0JCQllLnNldElzUmVwZWF0YWJsZShCb29sZWFuLnZhbHVlT2YodHh0KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXR0cmlidXRlKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZSwgU3RyaW5nIHByb3AsIFN0cmluZyB0eHQpIHsKLQkJaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdHh0LCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCkgewotCQkJYWN0aW9uTWdyLmRvQWN0aW9uKElBY3Rpb25NYW5hZ2VyLlNFVCwgZSwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCksIHR4dCwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4pIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksIEJvb2xlYW4KLQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNPbmdvaW5nKCksIEJvb2xlYW4udmFsdWVPZih0eHQpLAotCQkJCQktMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUpIHsKLQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKSwgQm9vbGVhbgotCQkJCQkudmFsdWVPZih0eHQpLCAtMSk7Ci0JCX0gZWxzZSBpZiAocHJvcCA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIHR4dCwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PUFRJT05BTCkgewotCQkJYWN0aW9uTWdyCi0JCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLCBCb29sZWFuCi0JCQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKHByb3AgPT0gSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVEKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc1BsYW5uZWQoKSwgQm9vbGVhbi52YWx1ZU9mKHR4dCksIC0xKTsKLQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTKSB7Ci0JCQlhY3Rpb25NZ3IuZG9BY3Rpb24oSUFjdGlvbk1hbmFnZXIuU0VULCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCksIEJvb2xlYW4KLQkJCQkJLnZhbHVlT2YodHh0KSwgLTEpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCWlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUpIHsKLQkJCQlhY3Rpb25NZ3IKLQkJCQkJCS5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksCi0JCQkJCQkJCXR4dCwgLTEpOwotCQkJfSBlbHNlIGlmIChwcm9wID09IElCU0l0ZW1Qcm92aWRlci5DT0xfRVhJVF9TVEFURSkgewotCQkJCWFjdGlvbk1nci5kb0FjdGlvbihJQWN0aW9uTWFuYWdlci5TRVQsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIHR4dCwgLTEpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGdlbmVyYWxpemUoQWN0aXZpdHkgYmFzZSwgVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsJCQotCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShiYXNlLmVDbGFzcygpKTsKLQkJYWN0LnNldE5hbWUoYmFzZS5nZXROYW1lKCkpOwotCQlpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gZ2V0UHJlc2VudGF0aW9uTmFtZShiYXNlKTsKLQkJCWFjdC5zZXRQcmVzZW50YXRpb25OYW1lKFN0clV0aWwuaXNCbGFuayhwcmVzZW50YXRpb25OYW1lKSA/IGJhc2UKLQkJCQkJLmdldE5hbWUoKSA6IHByZXNlbnRhdGlvbk5hbWUpOwotCQl9Ci0JCWFjdC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQlhY3Quc2V0VmFyaWFiaWxpdHlUeXBlKHR5cGUpOwotCi0JCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQkvLyBpbmhlcml0IGJvb2xlYW4gYXR0cmlidXRlcyBmcm9tIGJhc2UKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBiYXNlLmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEVBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChhdHRyaWJ1dGUuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkgPT0gQm9vbGVhbi5jbGFzcykgewotCQkJCQlhY3QuZVNldChhdHRyaWJ1dGUsIGJhc2UuZUdldChhdHRyaWJ1dGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb3B5IHByZWRlY2Vzc29ycyBsaXN0Ci0JCS8vIFRPRE86IG5lZWQgdG8gY2hlY2sgd2l0aCB2YXJpYWJpbGl0eSBydWxlcy4KLQkJLy8KLQkJQXJyYXlMaXN0IHdvcmtPcmRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3QoYmFzZS5nZXRMaW5rVG9QcmVkZWNlc3NvcigpKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXdvcmtPcmRlcnMuYWRkKFRuZ1V0aWwuY29weSgoV29ya09yZGVyKSBpdGVyLm5leHQoKSkpOwotCQl9Ci0KLQkJYWN0LmdldExpbmtUb1ByZWRlY2Vzc29yKCkuYWRkQWxsKHdvcmtPcmRlcnMpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbGlzdCBvZiBlbGVtZW50cyBzcGVjaWZpZWQgaW4gY2xhc3MgInR5cGUiIGVnLihSb2xlRGVzY3JpcHRvciwKLQkgKiBXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHVudGlsIHRoZSByb290IGxldmVsLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gaXRlbXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEVsZW1lbnRzSW5TY29wZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCwgQ2xhc3MgdHlwZSwgTGlzdCBpdGVtcykgewotCQkvLyBnZXQgY2hpbGRyZW4gZm9yIGFjdGl2aXR5Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlbGVtZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gKChBY3Rpdml0eSkgZWxlbWVudCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQlpZiAodHlwZS5pc0luc3RhbmNlKG9iaikpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJPYmogLSIgKyBvYmopOwotCQkJCQlpZiAoIShpdGVtcy5jb250YWlucyhvYmopKSkgewotCQkJCQkJaXRlbXMuYWRkKG9iaik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgcGFyZW50Ci0JCU9iamVjdCBjdXJyZW50UGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChlbGVtZW50KTsKLQkJaWYgKGN1cnJlbnRQYXJlbnQgIT0gbnVsbCkgewotCQkJLy8gZ28gdXAKLQkJCWdldEVsZW1lbnRzSW5TY29wZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHR5cGUsIGl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgcm9sZXMgZnJvbSByb2xlZGVzY3JpcHRvciBsaXN0Ci0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjTGlzdAotCSAqIEByZXR1cm4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb2xlcyhMaXN0IHJvbGVEZXNjTGlzdCkgewotCQlMaXN0IHJvbGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocm9sZURlc2NMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRvciA9IHJvbGVEZXNjTGlzdC5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCVJvbGUgcm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIG9iaikuZ2V0Um9sZSgpOwotCQkJCQlyb2xlTGlzdC5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByb2xlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYXNzb2NpYXRlZCBtZXRob2QgZWxlbWVudCBsaXN0Ci0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0b3JMaXN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBc3NvY2lhdGVkRWxlbWVudExpc3QoTGlzdCBkZXNjcmlwdG9yTGlzdCkgewotCQlMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoZGVzY3JpcHRvckxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdG9yID0gZGVzY3JpcHRvckxpc3QuaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0b3IubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmopOwotCQkJCQllbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0VG9wQnJlYWtkb3duRWxlbWVudChQcm9jZXNzQ29tcG9uZW50IHBjKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgYmUgPSBwYy5nZXRQcm9jZXNzKCk7Ci0JCWlmIChiZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCBhZGFwdGVyID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpKQotCQkJcmV0dXJuIGJlOwotCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJaWYgKGl0ZW1Qcm92aWRlci5nZXRUb3BJdGVtKCkgPT0gbnVsbCkgewotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQkJaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldE9CU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQoYmUsCi0JCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRUb3BJdGVtKGJlKTsKLQkJCWl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KGJlLAotCQkJCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpdGVtUHJvdmlkZXIuc2V0VG9wSXRlbShiZSk7Ci0JCQlpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChiZSwKLQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaXRlbVByb3ZpZGVyLnNldFRvcEl0ZW0oYmUpOwotCQl9Ci0JCVByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhiZSwgYmUpOwotCQlyZXR1cm4gYmU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVJRHMoRU9iamVjdCB0b3BBY3QsIE9iamVjdCBuZXdPYmopIHsKLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWJvb2xlYW4gdXBkYXRlV2hvbGVQcm9jZXNzID0gdG9wQWN0ID09IG5ld09iagotCQkJCSYmIHRvcEFjdCBpbnN0YW5jZW9mIFByb2Nlc3M7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0KLQkJLy8gTm8gbW9yZSBJRCBjb2x1bW4gaW4gVEJTIGFuZCBXUEJTCi0JCS8vCi0JCS8vIGFkYXB0ZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikKLQkJLy8gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdCh0b3BBY3QsCi0JCS8vIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCS8vIGZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCQkvLyBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHRvcEFjdCk7Ci0JCS8vIFByb2Nlc3NVdGlsLnVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQkvLyBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmdldFBCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBmYWN0b3J5ID0gVG5nVXRpbC5nZXRCZXN0QWRhcHRlckZhY3RvcnkoYWRhcHRlci5nZXRBZGFwdGVyRmFjdG9yeSgpKTsKLQkJLy8gaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihmYWN0b3J5LCB0b3BBY3QpOwotCQkvLyBQcm9jZXNzVXRpbC51cGRhdGVJRHMoZmFjdG9yeSwgaXRlciwgbmV3T2JqKTsKLQotCQlhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQodG9wQWN0LAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJZmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCWlmICh1cGRhdGVXaG9sZVByb2Nlc3MpIHsKLQkJCVByb2Nlc3MgcHJvYyA9IChQcm9jZXNzKSB0b3BBY3Q7Ci0JCQl1cGRhdGVJRHMoZmFjdG9yeSwgcHJvYyk7Ci0JCQlyZWZyZXNoVmlld2VyKGZhY3RvcnksIHByb2MpOwotCQl9IGVsc2UgewotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcigKLQkJCQkJZmFjdG9yeSwgdG9wQWN0KTsKLQkJCXVwZGF0ZUlEcyhmYWN0b3J5LCBpdGVyLCBuZXdPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGl0ZXIKLQkgKiBAcGFyYW0gbmV3T2JqCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUlEcyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LAotCQkJQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgaXRlciwgT2JqZWN0IG5ld09iaikgewotCQlpbnQgaWQgPSAwOwotCQlPYmplY3Qgb2JqOwotCQlNYXAgY2hhbmdlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWl0ZW1Qcm92aWRlci5zZXRJZChpZCsrKTsKLQkJCWNoYW5nZU1hcC5wdXQob2JqLCBpdGVtUHJvdmlkZXIpOwotCQl9Ci0KLQkJLy8gcmVmcmVzaCB0aGUgbGFiZWwKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoYW5nZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlDaGFuZ2VOb3RpZmllciBhZGFwdGVyID0gKElDaGFuZ2VOb3RpZmllcikgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCW9iaiA9IGVudHJ5LmdldEtleSgpOwotCQkJYWRhcHRlci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKAotCQkJCQluZXcgTm90aWZpY2F0aW9uSW1wbChOb3RpZmljYXRpb24uU0VULCBvYmosIG9iaiksIG9iaiwKLQkJCQkJZmFsc2UsIHRydWUpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNjaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKENvbGxlY3Rpb24sIERlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotCQkJRGVzY3JpcHRvciBvYmopIHsKLQkJQ29sbGVjdGlvbiBkZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3IgIT0gbnVsbCA/IENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihkZXNjcmlwdG9yKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJcmV0dXJuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoZGVzY3JpcHRvcnMsIG9iaik7Ci0JfQotCi0JCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlZmVyZW5jZXMgb2YgdGhlIG9iamVjdCAib2JqIi4gSWYgcmVmZXJlbmNlcwotCSAqIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoQ29sbGVjdGlvbiBkZXNjcmlwdG9ycywKLQkJCURlc2NyaXB0b3Igb2JqKSB7Ci0JCWJvb2xlYW4gcmVmZXJlbmNlc0V4aXN0cyA9IGZhbHNlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3IgcmVmT2JqZWN0ID0gKFJvbGVEZXNjcmlwdG9yKSBvYmo7Ci0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRBc3Npc3RlZFRhc2tEZXNjcmlwdG9ycyhyZWZPYmplY3QpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRSZXNwb25zaWJsZUZvcigpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocmVmT2JqZWN0KSk7Ci0JCQlsaXN0LmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHJlZk9iamVjdCkpOwotCQkJbGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKHJlZk9iamVjdCkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIHJlZkl0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IHJlZkl0b3IuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCByZWZJdG9yT2JqZWN0ID0gKE9iamVjdCkgcmVmSXRvci5uZXh0KCk7Ci0JCQkJaWYgKCgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpICYmICFkZXNjcmlwdG9ycwotCQkJCQkJLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKQotCQkJCQkJfHwgKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewkJCi0JCQlyZXR1cm4gY2hlY2tXb3JrUHJvZHVjdERlc2NyaXB0b3JSZWZlcmVuY2VzKGRlc2NyaXB0b3JzLCAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosIGZhbHNlLCAtMSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCVRhc2tEZXNjcmlwdG9yIHJlZk9iamVjdCA9IChUYXNrRGVzY3JpcHRvcikgb2JqOwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldEFzc2lzdGVkQnkoKSk7Ci0JCQlsaXN0LmFkZEFsbChyZWZPYmplY3QuZ2V0RXh0ZXJuYWxJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWxpc3QuYWRkQWxsKHJlZk9iamVjdC5nZXRPcHRpb25hbElucHV0KCkpOwotCQkJbGlzdC5hZGRBbGwocmVmT2JqZWN0LmdldE91dHB1dCgpKTsKLQkJCWxpc3QuYWRkKHJlZk9iamVjdC5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQotCQkJZm9yIChJdGVyYXRvciByZWZJdG9yID0gbGlzdC5pdGVyYXRvcigpOyByZWZJdG9yLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmVmSXRvck9iamVjdCA9IChPYmplY3QpIHJlZkl0b3IubmV4dCgpOwotCQkJCWlmICgocmVmSXRvck9iamVjdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpCi0JCQkJCQkmJiAhZGVzY3JpcHRvcnMuY29udGFpbnMocmVmSXRvck9iamVjdCkpIHsKLQkJCQkJcmVmZXJlbmNlc0V4aXN0cyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWZlcmVuY2VzRXhpc3RzOwotCX0KLQkKLQkvKioKLQkgKiBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVmZXJlbmNlcyBvZiB0aGUgd29ya1Byb2R1Y3RkZXNjcmlwdG9yIG9iamVjdCAicmVmT2JqZWN0LiAKLQkgKiBJZiByZWZlcmVuY2VzIGV4aXN0IGluIGFueSBkZXNjcmlwdG9yIGluIDxjb2RlPmRlc2NyaXB0b3JzPC9jb2RlPiwgaWdub3JlIGl0LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSByZWZPYmplY3QKLQkgKiBAcGFyYW0gcmVtb3ZlUmVsYXRpb24gLSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgd2UncmUgcmVtb3ZpbmcgcmVsYXRpb24KLQkgKiAgICAgQnkgZGVmYXVsdCB0aGlzIHNob3VsZCBiZSBmYWxzZS4gCi0JICogICAgIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGlmIHlvdSBhcmUgY29taW5nIGZyb20gcHJvcGVydGllcyB2aWV3LiAKLQkgKiAgICAgZWcuIHJlbW92aW5nIHJlbGF0aW9uc2hpcCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciB0byB0YXNrIGRlc2NyaXB0b3IgCi0JICogQHBhcmFtIGZlYXR1cmVJRAotCSAqIAkJVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgaWYgInJlbW92ZVJlbGF0aW9uIiBpcyB0cnVlLiBZb3UgbmVlZCB0byBnaXZlIGZlYXR1cmVJRAotCSAqIAkJZm9yIHdoaWNoIHJlbGF0aW9uIHlvdSBhcmUgcmVtb3ZpbmcuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IgcmVmT2JqZWN0LCBib29sZWFuIHJlbW92ZVJlbGF0aW9uLCBpbnQgZmVhdHVyZUlEKSB7Ci0JCQotCQlMaXN0IGFsbE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWFsbE9iamVjdHMuYWRkKHJlZk9iamVjdCk7Ci0KLQkJQWN0aXZpdHkgcGFyZW50QWN0aXZpdHkgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KHJlZk9iamVjdCk7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgcmVmZXJlbmNlIG9iamVjdCBpbnN0YW5jZSBvZiBhcnRpZmFjdAotCQlpZiAocmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJTGlzdCBjb250YWluZWRBcnRpZmFjdHMgPSAoKEFydGlmYWN0KSByZWZPYmplY3QuZ2V0V29ya1Byb2R1Y3QoKSkKLQkJCQkJLmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCi0JCQlMaXN0IGNvbnRhaW5lZFdwRGVzY0xpc3QgPSBnZXRXcERlc2NGb3JBcnRpZmFjdHMoCi0JCQkJCWNvbnRhaW5lZEFydGlmYWN0cywgcGFyZW50QWN0aXZpdHkpOwotCi0JCQlMaXN0IGNvbnRhaW5lckFydGlmYWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKChBcnRpZmFjdCkgcmVmT2JqZWN0LmdldFdvcmtQcm9kdWN0KCkpCi0JCQkJCS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJd2hpbGUgKGFydGlmYWN0ICE9IG51bGwpIHsKLQkJCQljb250YWluZXJBcnRpZmFjdHMuYWRkKGFydGlmYWN0KTsKLQkJCQlhcnRpZmFjdCA9ICgoQXJ0aWZhY3QpIGFydGlmYWN0KS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJfQotCQkJTGlzdCBjb250YWluZXJXcERlc2NMaXN0ID0gZ2V0V3BEZXNjRm9yQXJ0aWZhY3RzKAotCQkJCQljb250YWluZXJBcnRpZmFjdHMsIHBhcmVudEFjdGl2aXR5KTsKLQotCQkJYWxsT2JqZWN0cy5hZGRBbGwoY29udGFpbmVkV3BEZXNjTGlzdCk7Ci0JCQlhbGxPYmplY3RzLmFkZEFsbChjb250YWluZXJXcERlc2NMaXN0KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsT2JqZWN0cy5zaXplKCk7IGkrKykgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwT2JqID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYWxsT2JqZWN0cwotCQkJCQkuZ2V0KGkpOwotCi0JCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXRJbXBhY3RlZEJ5KCkpOwotCQkJbGlzdC5hZGRBbGwod3BPYmouZ2V0SW1wYWN0cygpKTsKLQkJCWxpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKHdwT2JqKSk7Ci0JCQlsaXN0LmFkZEFsbCh3cE9iai5nZXREZWxpdmVyYWJsZVBhcnRzKCkpOwotCi0JCQlMaXN0IGlucHV0TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0RXh0ZXJuYWxJbnB1dFRvKHdwT2JqKSk7Ci0JCQlpbnB1dExpc3QuYWRkQWxsKEFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8od3BPYmopKTsKLQkJCWlucHV0TGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKHdwT2JqKSk7Ci0KLQkJCUxpc3Qgb3V0cHV0TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BPYmopOwotCQkJaWYgKHJlbW92ZVJlbGF0aW9uKQotCQkJewotCQkJCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCQlpZiAob3V0cHV0TGlzdC5jb250YWluc0FsbChkZXNjcmlwdG9ycykpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUIDoJCQkJCi0JCQkJCWlmIChpbnB1dExpc3QuY29udGFpbnNBbGwoZGVzY3JpcHRvcnMpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlsaXN0LmFkZEFsbChpbnB1dExpc3QpOwotCQkJbGlzdC5hZGRBbGwob3V0cHV0TGlzdCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgcmVmSXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgcmVmSXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJlZkl0b3JPYmplY3QgPSAoT2JqZWN0KSByZWZJdG9yLm5leHQoKTsKLQkJCQlpZiAoKHJlZkl0b3JPYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKQotCQkJCQkJJiYgIWRlc2NyaXB0b3JzLmNvbnRhaW5zKHJlZkl0b3JPYmplY3QpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgY29ycmVzcG9uZGluZyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgZm9yIGFydGlmYWN0cwotCSAqIEBwYXJhbSBhcnRpZmFjdHMKLQkgKiBAcGFyYW0gcGFyZW50QWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFdwRGVzY0ZvckFydGlmYWN0cyhMaXN0IGFydGlmYWN0cywKLQkJCUFjdGl2aXR5IHBhcmVudEFjdGl2aXR5KSB7Ci0JCUxpc3Qgd3BEZXNjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBhcnRpZmFjdHMuZ2V0KGkpOwotCQkJaWYgKHBhcmVudEFjdGl2aXR5ICE9IG51bGwpIHsKLQkJCQlMaXN0IGJyRWxlbWVudHMgPSBwYXJlbnRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdG9yID0gYnJFbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGJyT2JqID0gKE9iamVjdCkgaXRvci5uZXh0KCk7Ci0JCQkJCWlmIChick9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGJyT2JqOwotCQkJCQkJaWYgKHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJCQlpZiAod3BEZXNjLmdldFdvcmtQcm9kdWN0KCkuZXF1YWxzKGFydGlmYWN0KSkKLQkJCQkJCQkJd3BEZXNjTGlzdC5hZGQod3BEZXNjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gd3BEZXNjTGlzdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iaikgewotCQlDb21wb3NpdGVSb2xlIGNvbXBSb2xlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCQljb21wUm9sZS5nZXRBZ2dyZWdhdGVkUm9sZXMoKS5hZGRBbGwob2JqLmdldEFnZ3JlZ2F0ZWRSb2xlcygpKTsKLQotCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IG9iai5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWNvbXBSb2xlLnNldE5hbWUob2JqLmdldE5hbWUoKSk7Ci0JCWNvbXBSb2xlLnNldFByZXNlbnRhdGlvbk5hbWUoU3RyVXRpbC5pc0JsYW5rKHByZXNlbnRhdGlvbk5hbWUpID8gb2JqCi0JCQkJLmdldE5hbWUoKSA6IHByZXNlbnRhdGlvbk5hbWUpOwotCQlyZXR1cm4gY29tcFJvbGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRhc2tUb0FjdGl2aXR5KFRhc2sgdGFzaywgQWN0aXZpdHkgYWN0KSB7Ci0JCVdCU0Ryb3BDb21tYW5kIGNtZCA9IG5ldyBXQlNEcm9wQ29tbWFuZChhY3QsIENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbkxpc3QodGFzaykpOwotCQlCU0Ryb3BDb21tYW5kLklFeGVjdXRvciBleGVjdXRvciA9IGNtZC5nZXRFeGVjdXRvcigpOwotCQlpZiAoZXhlY3V0b3IucHJlRXhlY3V0ZSgpKSB7Ci0JCQlleGVjdXRvci5kb0V4Y2VjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJvY2Vzc05vdE9mVHlwZShQcm9jZXNzUGFja2FnZSBwa2csCi0JCQlFQ2xhc3MgcHJvY2Vzc1R5cGUpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyAhPSBudWxsICYmICFwcm9jZXNzVHlwZS5pc0luc3RhbmNlKHByb2MpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkUGtnID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGRQa2cpLmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvYyAhPSBudWxsICYmICFwcm9jZXNzVHlwZS5pc0luc3RhbmNlKHByb2MpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChoYXNQcm9jZXNzTm90T2ZUeXBlKChQcm9jZXNzUGFja2FnZSkgY2hpbGRQa2csIHByb2Nlc3NUeXBlKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZpbmQgY29ycmVzcG9kaW5nIHJvbGVEZXNjcmlwdG9yIGluIHRlYW0gc2luY2Ugd2UgbWFpbnRhaW4gdHdvIHJvbGUKLQkgKiBkZXNjcmlwdG9yIGZvciB0aGUgc2FtZSByb2xlCi0JICogCi0JICogQHBhcmFtIHRlYW0KLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmluZFJvbGVEZXNjcmlwdG9yKFRlYW1Qcm9maWxlIHRlYW0sCi0JCQlSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlMaXN0IHRlYW1Sb2xlcyA9IHRlYW0uZ2V0VGVhbVJvbGVzKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdG9yID0gdGVhbVJvbGVzLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmplY3QgPSBpdG9yLm5leHQoKTsKLQkJCWlmIChyb2xlRGVzYyBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQlpZiAoaXRvck9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpIHsKLQkJCQkJTGlzdCBmaXJzdE9iamVjdEFnZ1JvbGVzID0gKChDb21wb3NpdGVSb2xlKSByb2xlRGVzYykKLQkJCQkJCQkuZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCQkJCUxpc3Qgc2Vjb25kT2JqZWN0QWdnUm9sZXMgPSAoKENvbXBvc2l0ZVJvbGUpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCQkJCQlpZiAoZmlyc3RPYmplY3RBZ2dSb2xlcy5lcXVhbHMoc2Vjb25kT2JqZWN0QWdnUm9sZXMpKSB7Ci0JCQkJCQlyZXR1cm4gaXRvck9iamVjdDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAocm9sZURlc2MgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCWlmICgoaXRvck9iamVjdCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKQotCQkJCQkJJiYgKCEoaXRvck9iamVjdCBpbnN0YW5jZW9mIENvbXBvc2l0ZVJvbGUpKSkgewotCQkJCQlPYmplY3Qgb2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIHJvbGVEZXNjKS5nZXRSb2xlKCk7Ci0JCQkJCU9iamVjdCBpdG9yT2JqUm9sZSA9ICgoUm9sZURlc2NyaXB0b3IpIGl0b3JPYmplY3QpCi0JCQkJCQkJLmdldFJvbGUoKTsKLQkJCQkJaWYgKG9ialJvbGUuZXF1YWxzKGl0b3JPYmpSb2xlKSkgewotCQkJCQkJcmV0dXJuIGl0b3JPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29sdW1uSW5kZXhUb05hbWVNYXAgZnJvbSB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uCi0JICogbmFtZXMKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgdG9Db2x1bW5JbmRleFRvTmFtZU1hcChTdHJpbmcgY29sTmFtZXMpIHsKLQkJTWFwIGNvbHVtbkluZGV4VG9OYW1lTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29sTmFtZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGlkID0gMDsKLQkJd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWNvbHVtbkluZGV4VG9OYW1lTWFwLnB1dChuZXcgSW50ZWdlcihpZCksIGdldENvbHVtbklEKHRva2VuKSk7Ci0JCQlpZCsrOwotCQl9Ci0JCXJldHVybiBjb2x1bW5JbmRleFRvTmFtZU1hcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbHVtbklEKFN0cmluZyBjb2xOYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgSUJTSXRlbVByb3ZpZGVyLkNPTFVNTlMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjb2wgPSBJQlNJdGVtUHJvdmlkZXIuQ09MVU1OU1tpXTsKLQkJCWlmIChjb2wuZXF1YWxzKGNvbE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNvbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYW4gbmV3IGRlc2NyaXB0b3IgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQKLQkvLyB1bmRlciB0aGUgZ2l2ZW4gYWN0aXZpdHksIGNvbnNpZGVyaW5nIGFsbCBpbmhlcml0ZWQgZGVzY3JpcHRvcnMgb2YgdGhlIGFjdGl2aXR5LgotCS8vIEl0IGlzIE5PVCBFRkZJQ0lFTlQgdG8gY29sbGVjdCBhbGwgbGlua2VkIGVsZW1lbnRzIG9mIHRoZSBpbmhlcml0ZWQgZGVzY3JpcHRvcnMgaW50byBhIGxpc3QgYW5kIHRoZW4gY2hlY2sgaWYKLQkvLyB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBpcyBpbiB0aGUgbGlzdC4KLQkvLwotCS8vIFVzZSBQcm9jZXNzQ29tbWFuZFV0aWwjZ2V0VmFsaWREZXNjcmlwdG9yKE9iamVjdCBvYmosIEFjdGl2aXR5IGFjdGl2aXR5KSBpbnN0ZWFkCi0JLy8KLS8vCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRWYXJpYWJpbGl0eUVsZW1lbnQoT2JqZWN0IG93bmVyKSB7Ci0vLwkJTGlzdCBiYXNlRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJaWYgKG93bmVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLS8vCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIG93bmVyOwotLy8JCQl3aGlsZSAoIWFjdGl2aXR5LmdldFZhcmlhYmlsaXR5VHlwZSgpLmVxdWFscygKLS8vCQkJCQlWYXJpYWJpbGl0eVR5cGUuTkEpKSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IGFjdGl2aXR5Ci0vLwkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwotLy8JCQkJaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0vLwkJCQkJQWN0aXZpdHkgYmFzZUFjdGl2aXR5ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotLy8KLS8vCQkJCQlMaXN0IGJyZWFrZG93bkVsZW1lbnRzID0gYmFzZUFjdGl2aXR5Ci0vLwkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLS8vCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBicmVha2Rvd25FbGVtZW50cy5pdGVyYXRvcigpOyBpdG9yCi0vLwkJCQkJCQkuaGFzTmV4dCgpOykgewotLy8JCQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRvci5uZXh0KCk7Ci0vLwkJCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0vLwkJCQkJCQlPYmplY3QgYmFzZU9iaiA9IGdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBvYmplY3QpOwotLy8JCQkJCQkJaWYgKGJhc2VPYmogIT0gbnVsbCkgewotLy8JCQkJCQkJCWJhc2VFbGVtZW50cy5hZGQoYmFzZU9iaik7Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwotLy8JCQkJCWFjdGl2aXR5ID0gYmFzZUFjdGl2aXR5OwotLy8JCQkJfQotLy8JCQkJZWxzZSB7Ci0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBiYXNlRWxlbWVudHM7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgcHJlZGVjZXNzb3IgbGlzdCBvZiBhbGwgaXRlbSBwcm92aWRlcnMgb2YgdGhlIGdpdmVuIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVByZWRlY2Vzc29ycyhBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBQcm9jZXNzIHByb2MsCi0JCQlMaXN0IHJlbW92ZWRFbGVtZW50cykgewotCQlIYXNoU2V0IGVsZW1lbnRzID0gbmV3IEhhc2hTZXQocmVtb3ZlZEVsZW1lbnRzKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGZhY3RvcnksIHByb2MpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCUlCU0l0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBmYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCWlmIChpdGVtUHJvdmlkZXIgIT0gbnVsbAotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChvYmopIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXRlbVByb3ZpZGVyLmdldFByZWRlY2Vzc29ycygpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQkJZSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcikgZSkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRUb0FjdGl2aXR5KEFjdGl2aXR5IGFjdCwgQnJlYWtkb3duRWxlbWVudCBiZSwgT2JqZWN0W10gcHJldkFuZE5leHQpIHsKLQkJT2JqZWN0IG5leHQgPSBwcmV2QW5kTmV4dFsxXTsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlpZihuZXh0ICE9IG51bGwpIHsKLQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YobmV4dCk7Ci0JCQlpZihpZCAhPSAtMSkgeyAKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoaWQsIGJlKTsKLQkJCQlhZGRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYoIWFkZGVkKSB7Ci0JCQlPYmplY3QgcHJldiA9IHByZXZBbmROZXh0WzBdOwotCQkJaWYocHJldiAhPSBudWxsKSB7CQkJCQotCQkJCWludCBpZCA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmluZGV4T2YocHJldik7Ci0JCQkJaWYoaWQgIT0gLTEpIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGlkICsgMSwgYmUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGQoYmUpOwotCQkJfQotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogTG9jYWxseSBjb250cmlidXRlcyB0byB0aGUgaW5oZXJpdGVkIGFjdGl2aXR5IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gY3JlYXRlZEFjdGl2aXRpZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIsIExpc3QgY3JlYXRlZEFjdGl2aXRpZXMpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG51bGwpOwotCQlPYmplY3RbXSBwcmV2QW5kTmV4dCA9IFByb2Nlc3NVdGlsCi0JCQkJLmdldFByZXZpb3VzQW5kTmV4dChhZGFwdGVyKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlwYXJlbnQgPSBjb250cmlidXRlVG9BY3Rpdml0eSgKLQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCWNyZWF0ZWRBY3Rpdml0aWVzKTsKLQkJfQotCQlBY3Rpdml0eSBhY3QgPSBQcm9jZXNzVXRpbC5nZW5lcmlhbGl6ZShhZGFwdGVyLAotCQkJCVZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04sIHByZXZBbmROZXh0KTsKLQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gKChBY3Rpdml0eSkgcGFyZW50KTsKLQkJYWRkVG9BY3Rpdml0eShwYXJlbnRBY3QsIGFjdCwgcHJldkFuZE5leHQpOwotCQljcmVhdGVkQWN0aXZpdGllcy5hZGQoYWN0KTsKLQkJcmV0dXJuIGFjdDsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhbGx5IHJlcGxhY2VzIHRoZSBpbmhlcml0ZWQgYWN0aXZpdHkgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBjcmVhdGVkQWN0aXZpdGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXBsYWNlQWN0aXZpdHlMb2NhbGx5KAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgYWRhcHRlciwgTGlzdCBjcmVhdGVkQWN0aXZpdGllcykgewotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQobnVsbCk7Ci0JCU9iamVjdFtdIHByZXZBbmROZXh0ID0gUHJvY2Vzc1V0aWwKLQkJCQkuZ2V0UHJldmlvdXNBbmROZXh0KGFkYXB0ZXIpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCXBhcmVudCA9IGNvbnRyaWJ1dGVUb0FjdGl2aXR5KAotCQkJCQkoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHBhcmVudCwKLQkJCQkJY3JlYXRlZEFjdGl2aXRpZXMpOwotCQl9Ci0JCUFjdGl2aXR5IGFjdCA9IFByb2Nlc3NVdGlsLmdlbmVyaWFsaXplKGFkYXB0ZXIsCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5ULCBwcmV2QW5kTmV4dCk7Ci0JCUFjdGl2aXR5IHBhcmVudEFjdCA9ICgoQWN0aXZpdHkpIHBhcmVudCk7Ci0JCWFkZFRvQWN0aXZpdHkocGFyZW50QWN0LCBhY3QsIHByZXZBbmROZXh0KTsKLQkJY3JlYXRlZEFjdGl2aXRpZXMuYWRkKGFjdCk7Ci0JfQotCi0Jc3RhdGljIE9iamVjdFtdIGdldFByZXZpb3VzQW5kTmV4dCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG51bGwpOwotCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXIKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgaXRlbVByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCWludCBpZCA9IGNoaWxkcmVuLmluZGV4T2YoYWRhcHRlcikgKyAxOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWlmIChpZCA8IGNoaWxkcmVuLnNpemUoKSkgewotCQkJbmV4dCA9IGNoaWxkcmVuLmdldChpZCk7Ci0JCX0KLQkJT2JqZWN0IHByZXYgPSBudWxsOwotCQlpZCAtPSAyOwotCQlpZiAoaWQgPiAtMSkgewotCQkJcHJldiA9IGNoaWxkcmVuLmdldChpZCk7Ci0JCX0KLQotCQlPYmplY3RbXSBwcmV2QW5kTmV4dCA9IHsgcHJldiwgbmV4dCB9OwotCQlyZXR1cm4gcHJldkFuZE5leHQ7Ci0JfQotCi0Jc3RhdGljIEFjdGl2aXR5IGdlbmVyaWFsaXplKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGFkYXB0ZXIsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgT2JqZWN0W10gcHJldkFuZE5leHQpIHsKLQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdVdGlsLmdldEJlc3RBZGFwdGVyRmFjdG9yeShhZGFwdGVyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCUFjdGl2aXR5IGFjdCA9IGdlbmVyYWxpemUoKEFjdGl2aXR5KSBUbmdVdGlsLnVud3JhcChhZGFwdGVyKSwgdHlwZSk7Ci0JCU9iamVjdCBuZXh0ID0gcHJldkFuZE5leHRbMV07Ci0JCWlmKG5leHQgIT0gbnVsbCkgewotCQkJYWN0LnNldFByZXNlbnRlZEFmdGVyKChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsLnVud3JhcChuZXh0KSk7Ci0JCQlpZihuZXh0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoQnJlYWtkb3duRWxlbWVudCluZXh0KS5zZXRQcmVzZW50ZWRCZWZvcmUoYWN0KTsKLQkJCX0KLQkJfQotCQlPYmplY3QgcHJldiA9IHByZXZBbmROZXh0WzBdOwotCQlpZihwcmV2ICE9IG51bGwpIHsKLQkJCWFjdC5zZXRQcmVzZW50ZWRCZWZvcmUoKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHByZXYpKTsKLQkJCWlmIChwcmV2IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCSgoQnJlYWtkb3duRWxlbWVudClwcmV2KS5zZXRQcmVzZW50ZWRBZnRlcihhY3QpOwotCQkJfQotCQl9Ci0JCUlCU0l0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KGFjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJYnNJdGVtUHJvdmlkZXIuc2V0RXhwYW5kZWQoYWRhcHRlci5pc0V4cGFuZGVkKCkpOwotCQlyZXR1cm4gYWN0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGltbWVkaWF0ZSBiYXNlIHByb2Nlc3Mgb2YgdGhlIGdpdmVuCi0JICogQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgdGhhdCByZXByZXNlbnRzIGFuIGluaGVyaXRlZAotCSAqIGJyZWFrZG93biBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzIGdldEltbWVkaWF0ZUJhc2VQcm9jZXNzKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCUFjdGl2aXR5IGluaGVyaXRvciA9IGdldEluaGVyaXRvcihpdGVtUHJvdmlkZXIpOwotCQlpZiAoaW5oZXJpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGluaGVyaXRvcgotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhY3Rpdml0eSBpbiB0aGUgcHJvY2VzcyBvZiB0aGUgZ2l2ZW4gaXRlbSBwcm92aWRlciB0aGF0IGluaGVyaXRzCi0JICogdGhlIGVsZW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGl0ZW0gcHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gaXRlbVByb3ZpZGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2V0SW5oZXJpdG9yKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyKSB7Ci0JCWlmIChpdGVtUHJvdmlkZXIuaXNSZWFkT25seSgpKSB7Ci0JCQkvLyB0aGlzIHJlcHJlc2VudHMgYW4gaW5oZXJpdGVkIGJyZWFrZG93biBlbGVtZW50Ci0JCQkvLwotCQkJZm9yIChPYmplY3QgcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChpdGVtUHJvdmlkZXIpOyBwYXJlbnQgIT0gbnVsbDspIHsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJcGFyZW50ID0gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgcGFyZW50KQotCQkJCQkJCS5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBwYXJlbnQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgcGFyZW50IGxpc3Qgb2YgPGNvZGU+d3JhcHBlcjwvY29kZT4gZnJvbSA8Y29kZT5mcm9tPC9jb2RlPiwKLQkgKiBleGNsdWRlZCA8Y29kZT5mcm9tPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBmcm9tCi0JICogQHBhcmFtIHdyYXBwZXIKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdW53cmFwcGVkIHBhcmVudCBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoT2JqZWN0IGZyb20sCi0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXJldHVybiBnZXRQYXJlbnRMaXN0KHdyYXBwZXIsIGZyb20sIHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgR1VJRHMgZnJvbSB0aGUgdG9wIGVsZW1lbnQgdG8gdGhlIHdyYXBwZXIgaW5jbHVzaXZlLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxTdHJpbmc+IGdldEd1aWRMaXN0KEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJTGlua2VkTGlzdDxTdHJpbmc+IGd1aWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOwotCQlMaXN0IHBhcmVudExpc3QgPSBQcm9jZXNzVXRpbC5nZXRQYXJlbnRMaXN0KG51bGwsIHdyYXBwZXIpOwotCQlpZiAoIXBhcmVudExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwYXJlbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQkvLyBleGNsdWRlIFRhc2tEZXNjcmlwdG9yIGFuZCBSb2xlRGVzY3JpcHRvciBmcm9tIHRoZSBwYXJlbnQKLQkJCQkvLyBwYXRoIGIvYyB0aG9zZSBkZXNjcmlwdG9ycyBjYW4gYmUKLQkJCQkvLyBwYXJlbnQgb25seSBpbiBDQlMgdmlldwotCQkJCWlmICghKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciB8fCBlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCWd1aWRMaXN0LmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJZ3VpZExpc3QuYWRkKGUuZ2V0R3VpZCgpKTsKLQkJcmV0dXJuIGd1aWRMaXN0OwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaXN0IG9mIEdVSURzIGZyb20gc3RhcnQgdG8gYWN0aXZpdHksIGV4Y2x1ZGVkIHN0YXJ0IGFjdGl2aXR5LgotCSAqIEBwYXJhbSBmcm9tCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlua2VkTGlzdDxTdHJpbmc+IGdldEd1aWRMaXN0KEFjdGl2aXR5IHN0YXJ0LCBBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlMaW5rZWRMaXN0PFN0cmluZz4gZ3VpZExpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCWZvcihBY3Rpdml0eSBwYXJlbnQgPSBhY3Rpdml0eTsgcGFyZW50ICE9IG51bGwgJiYgKHN0YXJ0ID09IG51bGwgfHwgcGFyZW50ICE9IHN0YXJ0KTsgcGFyZW50ID0gcGFyZW50LmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQlndWlkTGlzdC5hZGRGaXJzdChwYXJlbnQuZ2V0R3VpZCgpKTsKLQkJfQotCQlyZXR1cm4gZ3VpZExpc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldEd1aWRMaXN0KE9iamVjdCBhY3Rpdml0eU9yV3JhcHBlcikgewotCQlpZihhY3Rpdml0eU9yV3JhcHBlciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gZ2V0R3VpZExpc3QoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJfQotCQllbHNlIGlmKGFjdGl2aXR5T3JXcmFwcGVyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiBnZXRHdWlkTGlzdChudWxsLCAoQWN0aXZpdHkpIGFjdGl2aXR5T3JXcmFwcGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9HdWlkUGF0aChMaXN0PFN0cmluZz4gZ3VpZExpc3QpIHsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoU3RyaW5nIGd1aWQgOiBndWlkTGlzdCkgewotCQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQoZ3VpZCk7Ci0JCX0KLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBwYXJlbnQgbGlzdCBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+IGZyb20gPGNvZGU+ZnJvbTwvY29kZT4sCi0JICogZXhjbHVkZWQgPGNvZGU+ZnJvbTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGZyb20KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgdW53cmFwcGVkIHBhcmVudCBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGZyb20sIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFycmF5TGlzdCBwYXJlbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKE9iamVjdCBwYXJlbnQgPSBpdGVtUHJvdmlkZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBmcm9tCi0JCQkJJiYgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlPYmplY3Qgb2JqID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCU1ldGhvZEVsZW1lbnQgZTsJCQkKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXI7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCQlwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCWlmKFByb2Nlc3NVdGlsLmlzVG9wUHJvY2VzcyhlKSkgewotCQkJCQlwYXJlbnQgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIG11c3QgYmUgYSBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJLy8KLQkJCQlJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIgPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIG9iaik7Ci0JCQkJZSA9IChNZXRob2RFbGVtZW50KSBhZGFwdGVyLmdldFRhcmdldCgpOwotCQkJCXBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KHBhcmVudCk7Ci0JCQl9Ci0JCQlwYXJlbnRMaXN0LmFkZCgwLCBlKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB3cmFwcGVycyBvZiBhbGwgYnJlYWtkb3duIHN0cnVjdHVyZSAoQlMpIHZpZXdzIGluIHRoZSBmb2xsb3dpbmcKLQkgKiBvcmRlcjogV0JTLCBUQlMsIFdQQlMKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqICAgICAgICAgICAgdGhlIHdyYXBwZXIgb2YgYSBCUyB2aWV3Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXcmFwcGVycyhCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyLCBBZGFwdGVyRmFjdG9yeVtdIGFkYXB0ZXJGYWN0b3JpZXMpIHsKLQkJQXJyYXlMaXN0IHJvbGxlZFVwSXRlbVByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdHJ5IHsKLQkJCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KHdyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JCQlPYmplY3QgcHJvYyA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwkJCQkJCQotCQkJQXJyYXlMaXN0IG9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QocHJvYywKLQkJCQkJd3JhcHBlcikpOwotCQkJQXJyYXlMaXN0IHdyYXBwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yaWVzW2ldOwotCQkJCWlmIChhZGFwdGVyRmFjdG9yeSA9PSByb290QWRhcHRlckZhY3RvcnkpIHsKLQkJCQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQlvYmplY3RzLmFkZChlKTsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gcHJvYzsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyMS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcjEubmV4dCgpOwotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGFjdGl2aXR5IGlzIHJvbGxlZCBkb3duIGJlZm9yZSBsb29raW5nIGludG8gaXRzIGNoaWxkcmVuCi0JCQkJCS8vCi0JCQkJCU9iamVjdCBiZSA9IFRuZ1V0aWwudW53cmFwKG9iamVjdCk7CQkJCQkJCQkKLQkJCQkJaWYoYmUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJaWYoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCQlCU0FjdGl2aXR5SXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChCU0FjdGl2aXR5SXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCQkJCWlmKGl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQkJaXRlbVByb3ZpZGVyLmJhc2ljU2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJSUJTSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXI7Ci0JCQkJCQkJaWYoaXRlbVByb3ZpZGVyLmlzUm9sbGVkVXAoKSkgewotCQkJCQkJCQlpdGVtUHJvdmlkZXIuc2V0Um9sbGVkVXAoZmFsc2UpOwotCQkJCQkJCQlyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuYWRkKGl0ZW1Qcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlmaW5kX2NoaWxkOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWRhcHRlcgotCQkJCQkJCS5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBjaGlsZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50ID09IFRuZ1V0aWwudW53cmFwKGNoaWxkKSkgewotCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCXdyYXBwZXJzLmFkZChvYmplY3QpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJCSJDb3VsZCBub3QgZmluZCB3cmFwcGVyIGZvciAiICsgZSArICIgdXNpbmcgYWRhcHRlciBmYWN0b3J5ICIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB3cmFwcGVyczsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFyb2xsZWRVcEl0ZW1Qcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gcmVzdG9yZSB0aGUgcm9sbGVkVXAgZmxhZwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcm9sbGVkVXBJdGVtUHJvdmlkZXJzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGl0ZXIubmV4dCgpKS5iYXNpY1NldFJvbGxlZFVwKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHZXRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBzcGVjaWZpYyBtb2RlbCBpbmZvIAotCSAqIEBwYXJhbSBtb2RlbEluZm8KLQkgKiBAcGFyYW0gb2JqZWN0IFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvciBpdHMgd3JhcHBlcgotCSAqIEBwYXJhbSBpdGVtUHJvdmlkZXIgaXRlbSBwcm92aWRlciBvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb3IgaXRzIHdyYXBwZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0V1BETW9kZWxJbmZvKFN0cmluZ0J1ZmZlciBtb2RlbEluZm8sIE9iamVjdCBvYmplY3QsIE9iamVjdCBpdGVtUHJvdmlkZXIpIHsKLQkJT2JqZWN0IGVsZW1lbnQgPSBUbmdVdGlsLnVud3JhcChvYmplY3QpOwotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7CQotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZWxlbWVudDsKLQkJCWlmKGl0ZW1Qcm92aWRlciBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCS8vIGNoZWNrIGlmIHRoaXMgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3Igb3Igcm9sZSBkZXNjcmlwdG9yCi0JCQkJLy8KLQkJCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQlhZGFwdGVyRmFjdG9yeSA9ICgoSXRlbVByb3ZpZGVyQWRhcHRlcilpdGVtUHJvdmlkZXIpLmdldEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJYWRhcHRlckZhY3RvcnkgPSAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQkJCQl9Ci0JCQkJaWYoYWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgcGFyZW50RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcilpdGVtUHJvdmlkZXI7Ci0JCQkJCWZpbmRQYXJlbnREZXNjcmlwdG9yOgotCQkJCQkJZm9yKE9iamVjdCBwYXJlbnQgPSBhZGFwdGVyLmdldFBhcmVudChvYmplY3QpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KSkgewotCQkJCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAocGFyZW50KTsKLQkJCQkJCQlpZihlIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJcGFyZW50RGVzY3JpcHRvciA9IGU7Ci0JCQkJCQkJCWJyZWFrIGZpbmRQYXJlbnREZXNjcmlwdG9yOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJCQlicmVhayBmaW5kUGFyZW50RGVzY3JpcHRvcjsKLQkJCQkJCQl9Ci0JCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCX0KLQkJCQkJaWYocGFyZW50RGVzY3JpcHRvciAhPSBudWxsKSB7CQotCQkJCQkJLy8gd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgaXMgc2hvd24gdW5kZXIgYSB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vIHNob3cgb25seSBtb2RlbCBpbmZvIHJlbGF0ZWQgdG8gdGhpcyB0YXNrIGRlc2NyaXB0b3IKLQkJCQkJCS8vCi0JCQkJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRNYW5kYXRvcnlJbnB1dFRvKHdwZCkuY29udGFpbnMocGFyZW50RGVzY3JpcHRvcikpIHsKLQkJCQkJCQlmZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZihBc3NvY2lhdGlvbkhlbHBlci5nZXRPcHRpb25hbElucHV0VG8od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJCWlmKEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dEZyb20od3BkKS5jb250YWlucyhwYXJlbnREZXNjcmlwdG9yKSkgewotCQkJCQkJCWZlYXR1cmVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZighZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCQkJCQkJbW9kZWxJbmZvLmFwcGVuZChUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpKTsKLQkJCQkJCQkJaWYoaSA8IGZlYXR1cmVzLnNpemUoKSAtMSl7Ci0JCQkJCQkJCQltb2RlbEluZm8uYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWdldE1vZGVsSW5mb0ZvcldvcmtQcm9kdWN0RGVzY3JpcHRvcihtb2RlbEluZm8sIHdwZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIE1vZGVsSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gV29ya1Byb2R1Y3REZXNjcmlwdG9yLiBNb2RlbAotCSAqIEluZm9ybWF0aW9uIGlzIGZvciBQQlMgKFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMsIGluY2x1ZGluZyBFeHRlbmRlZAotCSAqIEFjdGl2aXR5J3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ycykuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRNb2RlbEluZm9Gb3JXb3JrUHJvZHVjdERlc2NyaXB0b3IoCi0JCQlTdHJpbmdCdWZmZXIgbW9kZWxJbmZvLCBXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCVN0cmluZyBjb21tYSA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIUFzc29jaWF0aW9uSGVscGVyLmdldE1hbmRhdG9yeUlucHV0VG8ob2JqZWN0KS5pc0VtcHR5KCkpIHsKLQkJCWlmIChtb2RlbEluZm8udG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKLQkJCQltb2RlbEluZm8uYXBwZW5kKGNvbW1hKTsKLQkJCX0KLQkJCW1vZGVsSW5mby5hcHBlbmQoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3B0aW9uYWxJbnB1dFRvKG9iamVjdCkuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobW9kZWxJbmZvLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbW9kZWxJbmZvLmFwcGVuZChjb21tYSk7Ci0JCQl9Ci0JCQltb2RlbEluZm8uYXBwZW5kKFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICghQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3V0cHV0RnJvbShvYmplY3QpLmlzRW1wdHkoKSkgewotCQkJaWYgKG1vZGVsSW5mby50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotCQkJCW1vZGVsSW5mby5hcHBlbmQoY29tbWEpOwotCQkJfQotCQkJbW9kZWxJbmZvLmFwcGVuZChVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCS5nZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9vdXRwdXRfZmVhdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldER1cGxpY2F0ZURlc2NyaXB0b3JzQWZ0ZXJSZXZlYWwoQ29sbGVjdGlvbiBlbGVtZW50c1RvUmV2ZWFsKSB7Ci0JCUNvbGxlY3Rpb24gZHVwbGljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1JldmVhbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBlbGVtZW50OwotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IFByb2Nlc3NVdGlsLmdldEFzc29jaWF0ZWRFbGVtZW50KGRlc2MpOwotCQkJCWlmKGUgIT0gbnVsbCkgewotCQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGRlc2MpOwotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpLmdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQkJCWUgPSAoTWV0aG9kRWxlbWVudCkgUHJvdmlkZXJzLmdldENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yKCkucmVzb2x2ZShlLCBjb25maWcpOwotCQkJCQlPYmplY3QgZHVwbGljYXRlID0gUHJvY2Vzc0NvbW1hbmRVdGlsLmdldERlc2NyaXB0b3IoZSwgYWN0LCBjb25maWcpOwotCQkJCQlpZihkdXBsaWNhdGUgIT0gbnVsbCAmJiAhZHVwbGljYXRlcy5jb250YWlucyhkdXBsaWNhdGUpKSB7CQkJCQkKLQkJCQkJCWR1cGxpY2F0ZXMuYWRkKGR1cGxpY2F0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBkdXBsaWNhdGVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RGVzY3JpcHRvcj4gZ2V0RHVwbGljYXRlRGVzY3JpcHRvcnNBZnRlclN1cHByZXNzKENvbGxlY3Rpb24gZWxlbWVudHNUb1N1cHByZXNzKSB7Ci0JCUNvbGxlY3Rpb248RGVzY3JpcHRvcj4gZHVwbGljYXRlcyA9IG5ldyBBcnJheUxpc3Q8RGVzY3JpcHRvcj4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1N1cHByZXNzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQkJCWlmKGl0ZW0gaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJRGVzY3JpcHRvciBkZXNjID0gKERlc2NyaXB0b3IpIGl0ZW07Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoZGVzYyk7Ci0JCQkJaWYoZSAhPSBudWxsKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9IFVtYVV0aWwuZ2V0UGFyZW50QWN0aXZpdHkoZGVzYyk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlCcmVha2Rvd25FbGVtZW50IGVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYoZWxlbWVudCAhPSBkZXNjICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICYmIGVsZW1lbnQuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gUHJvY2Vzc1V0aWwuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJCWlmKGxpbmtlZEVsZW1lbnQgPT0gZSkgewotCQkJCQkJCQlkdXBsaWNhdGVzLmFkZCgoRGVzY3JpcHRvcikgZWxlbWVudCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZHVwbGljYXRlczsKLQkJCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgcmVwcmVzZW50aW5nIGEgaW5oZXJpdGVkIGVsZW1lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIHRyZWUgb2YgcHJvY2VzcyBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaGVyaXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCSYmICgoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmlzSW5oZXJpdGVkKCk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYWN0aXZpdHkgaGFzIGluaGVyaXRlZCBhbnkgYnJlYWtkb3duIGVsZW1lbnQgdmlhIGV4dGVuc2lvbiBvZiBsb2NhbCBjb250cmlidXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0luaGVyaXRlZChBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGFjdGl2aXR5KSB7Ci0KLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuICgoQWN0aXZpdHkpb2JqZWN0KS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIG87Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCQlpZih0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTikgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRlZChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkmJiAoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKW9iamVjdCkuaXNDb250cmlidXRlZCgpOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFN1YlRlYW1zKFRlYW1Qcm9maWxlIHRlYW0sIExpc3QgdGVhbXMpIHsKLQkJdGVhbXMuYWRkKHRlYW0pOwotCQlMaXN0IHN1YlRlYW1zID0gdGVhbS5nZXRTdWJUZWFtKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRvciA9IHN1YlRlYW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJVGVhbVByb2ZpbGUgc3ViVGVhbSA9IChUZWFtUHJvZmlsZSkgaXRvci5uZXh0KCk7Ci0KLQkJCWdldEFsbFN1YlRlYW1zKHN1YlRlYW0sIHRlYW1zKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGdldFRlYW1Qcm9maWxlcyhPYmplY3Qgb2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIFRuZ1V0aWwudW53cmFwKG9iamVjdCk7Ci0JCUxpc3QgdGVhbXMgPSBuZXcgQXJyYXlMaXN0KEFzc29jaWF0aW9uSGVscGVyLmdldFRlYW1Qcm9maWxlcyhyb2xlRGVzYykpOwotCQkKLQkJLy8gZ2V0IGFsbCB0aGUgdGVhbSBwcm9maWxlcyB0aGF0IGFyZSBpbiBzY29wZSBvZiB0aGUgd3JhcHBlcgotCQkvLwotCQlIYXNoU2V0IHZpc2libGVUZWFtcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoT2JqZWN0IHBhcmVudCA9IGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7IHBhcmVudCAhPSBudWxsOykgewotCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsJCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gVG5nVXRpbC51bndyYXAoaXRlci5uZXh0KCkpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCQkJTGlzdCBhY3Rpdml0eVRlYW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlnZXRBbGxTdWJUZWFtcygoVGVhbVByb2ZpbGUpIGUsIGFjdGl2aXR5VGVhbXMpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBhY3Rpdml0eVRlYW1zLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykJewotCQkJCQkJT2JqZWN0IG8gPSBpdG9yLm5leHQoKTsKLQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSAmJiAoKFRlYW1Qcm9maWxlKW8pLmdldFRlYW1Sb2xlcygpLmNvbnRhaW5zKHJvbGVEZXNjKSkgewotCQkJCQkJCXZpc2libGVUZWFtcy5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlPYmplY3QgbmV3UGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQocGFyZW50KTsKLQkJCWlmKG5ld1BhcmVudCA9PSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJbmV3UGFyZW50ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eSgoQWN0aXZpdHkpcGFyZW50KTsKLQkJCX0KLQkJCXBhcmVudCA9IG5ld1BhcmVudDsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIGFueSB0ZWFtIHByb2ZpbGUgdGhhdCBpcyBub3QgaW4gdGhlIHNjb3BlIG9mIHRoZSB3cmFwcGVyCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRlYW1zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHRlYW0gPSBpdGVyLm5leHQoKTsKLQkJCWlmKCF2aXNpYmxlVGVhbXMuY29udGFpbnModGVhbSkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdGVhbXM7Ci0KLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgbGlzdCBvZiB2aXNpYmxlIHRlYW0gcHJvZmlsZXMgZm9yIHRoZSByb2xlIGRlc2NyaXB0b3IgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHdyYXBwZXIKLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2NXcmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyIHJvbGVEZXNjV3JhcHBlcikgewotCQlyZXR1cm4gZ2V0VGVhbVByb2ZpbGVzKHJvbGVEZXNjV3JhcHBlciwgcm9sZURlc2NXcmFwcGVyLCByb2xlRGVzY1dyYXBwZXIuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUZWFtUHJvZmlsZXMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQocm9sZURlc2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBnZXRUZWFtUHJvZmlsZXMocm9sZURlc2MsIGFkYXB0ZXIsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGxpc3Qgb2YgcmVjdXJzaXZlIGNoaWxkIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gYWN0aXZpdHkgYW5kIGdpdmVuIHR5cGUKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIHR5cGUKLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZXRDaGlsZEVsZW1lbnRzKEFjdGl2aXR5IGFjdCwgQ2xhc3MgdHlwZSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCWZvciAoaW50IGkgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5nZXQoaSk7Ci0JCQlpZih0eXBlLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJCX0KLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCWdldENoaWxkRWxlbWVudHMoKEFjdGl2aXR5KSBlbGVtZW50LCB0eXBlLCBjb2xsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElGaWx0ZXIgZ2V0RmlsdGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUFkYXB0ZXJGYWN0b3J5IHJvb3RBZGFwdGVyRmFjdG9yeSA9IFRuZ1V0aWwuZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYocm9vdEFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgewotCQkJcmV0dXJuICgoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSlyb290QWRhcHRlckZhY3RvcnkpLmdldEZpbHRlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBjYWxjdWxhdGVkIGxpc3Qgb2YgYXJ0aWZhY3QgY29udGFpbmVkIGJ5IHRoZSBnaXZlbiBhcnRpZmFjdCBiYXNlZCBvbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhcnRpZmFjdAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKEFydGlmYWN0IGFydGlmYWN0LCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCUlGaWx0ZXIgZmlsdGVyID0gUHJvY2Vzc1V0aWwuZ2V0RmlsdGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotCQkJY29uZmlnID0gKChJQ29uZmlndXJhdG9yKWZpbHRlcikuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQl9Ci0JCQotCQlpZihjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIChMaXN0KSBQcm92aWRlcnMuZ2V0Q29uZmlndXJhdGlvbkFwcGxpY2F0b3IoKS5nZXRSZWZlcmVuY2UoCi0JCQkJCWFydGlmYWN0LAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQkJY29uZmlnKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDb250YWluZWRBcnRpZmFjdHNEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjLCBMaXN0IGFydGlmYWN0RGVzY3JpcHRvcnMpIHsKLQkJaWYoYXJ0aWZhY3REZXNjcmlwdG9ycy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0JCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBhcnRpZmFjdERlc2MuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCi0JCS8vIGNvbGxlY3Qgb3duIGFuZCBjb250cmlidXRpbmcgc3ViYXJ0aWZhY3QgZGVzY3JpcHRvcnMKLQkJLy8KLQkJQXJyYXlMaXN0IGNvbnRhaW5lZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGkgPSBhcnRpZmFjdERlc2NyaXB0b3JzLnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpYXJ0aWZhY3REZXNjcmlwdG9ycy5nZXQoaSkpOwotCQkJV29ya1Byb2R1Y3QgYSA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJaWYoYSAhPSBudWxsKSB7Ci0JCQkJRU9iamVjdCBjb250YWluZXIgPSBhLmVDb250YWluZXIoKTsKLQkJCQlpZihjb250YWluZXIgPT0gYXJ0aWZhY3QgfHwgCi0JCQkJCQkoY29udGFpbmVyIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgVG5nVXRpbC5pc0NvbnRyaWJ1dG9yT2YoYXJ0aWZhY3QsIChBcnRpZmFjdCkgY29udGFpbmVyKSkpIHsKLQkJCQkJY29udGFpbmVkRGVzY3JpcHRvcnMuYWRkKHdwZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluZWREZXNjcmlwdG9yczsKLQl9Ci0JCi0vLwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeShBcnRpZmFjdCBwYXJlbnQsIEFydGlmYWN0IGNoaWxkLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotLy8JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLS8vCQlJRmlsdGVyIGZpbHRlciA9IFByb2Nlc3NVdGlsLmdldEZpbHRlcihhZGFwdGVyRmFjdG9yeSk7Ci0vLwkJaWYoZmlsdGVyIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRvcikgewotLy8JCQljb25maWcgPSAoKElDb25maWd1cmF0b3IpZmlsdGVyKS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0vLwkJfQotLy8JCQotLy8JCWlmKGNvbmZpZyA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBVbWFVdGlsLmlzQ29udGFpbmVkQnkoY2hpbGQsIHBhcmVudCk7Ci0vLwkJfQotLy8JCQotLy8JCWZpbmFsIE1ldGhvZENvbmZpZ3VyYXRpb24gY2ZnID0gY29uZmlnOwkJCi0vLwkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihwYXJlbnQsIGZhbHNlKSB7Ci0vLwotLy8JCQkvKioKLS8vCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLS8vCQkJICovCi0vLwkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotLy8KLS8vCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQkJCXJldHVybiAoKENvbGxlY3Rpb24pIFByb3ZpZGVycy5nZXRDb25maWd1cmF0aW9uQXBwbGljYXRvcigpLmdldFJlZmVyZW5jZSgKLS8vCQkJCQkJKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0LAotLy8JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLS8vCQkJCQkJY2ZnKSkuaXRlcmF0b3IoKTsKLS8vCQkJfQotLy8JCQkKLS8vCQl9OwotLy8JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCWlmKGNoaWxkID09IGl0ZXIubmV4dCgpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgPGNvZGU+cGFyZW50PC9jb2RlPiBjYW4gcmVwcmVzZW50IHRoZSBwYXJlbnQgb2YgdGhlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCSAqIDxjb2RlPmNoaWxkPC9jb2RlPiBiYXNlZCBvbiB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZWlyIGxpbmtlZCBhcnRpZmFjdCBhbmQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGFydGlmYWN0IGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoV29ya1Byb2R1Y3REZXNjcmlwdG9yIHBhcmVudCwgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNoaWxkLCBmaW5hbCBMaXN0IGFydGlmYWN0RGVzY0xpc3QpIHsKLS8vCQlJdGVyYXRvciBpdGVyID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKHBhcmVudCwgZmFsc2UpIHsKLS8vCQkJCi0vLwkJCS8qKgotLy8JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotLy8JCQkgKi8KLS8vCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0vLwkJCQotLy8JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotLy8JCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0c0Rlc2NyaXB0b3JzKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCwgYXJ0aWZhY3REZXNjTGlzdCkuaXRlcmF0b3IoKTsKLS8vCQkJfQotLy8JCQkKLS8vCQl9OwotLy8JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCWlmKGNoaWxkID09IGl0ZXIubmV4dCgpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQlyZXR1cm4gZmFsc2U7Ci0JCQotCQlyZXR1cm4gVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGNoaWxkLmdldFdvcmtQcm9kdWN0KCksIHBhcmVudC5nZXRXb3JrUHJvZHVjdCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGZpbmFsIENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwKSB7Ci0JCUxpc3QgYXJ0aWZhY3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQotCQkvLyBnZXQgdGhlIGFydGlmYWN0IGxpc3QKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmKHVud3JhcCkgewotCQkJCWNoaWxkID0gVG5nVXRpbC51bndyYXAoY2hpbGQpOwotCQkJfQotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgY2hpbGQpCi0JCQkJCQkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAod3AgaW5zdGFuY2VvZiBBcnRpZmFjdCkgewotCQkJCQlhcnRpZmFjdExpc3QuYWRkKHdwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJLy8gcHJvY2VzcyB0aGUgYXJ0aWZhY3QgbGlzdCB0byBnZXQgdGhlIHRvcC1tb3N0IG9uZXMKLQkJLy8KLQkJU2V0IHRvcE1vc3RBcnRpZmFjdHMgPSBuZXcgSGFzaFNldCgpOwotCQlBcnRpZmFjdCBjYW5kaWRhdGUgPSBudWxsOwotCQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlICghYXJ0aWZhY3RMaXN0LmlzRW1wdHkoKSkgewotCQkJCi0JCQlpZiAoIWZvdW5kKQotCQkJewotCQkJCWNhbmRpZGF0ZSA9IChBcnRpZmFjdCkgYXJ0aWZhY3RMaXN0LmdldCgwKTsKLQkJCQlhcnRpZmFjdExpc3QucmVtb3ZlKDApOwotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpdGVyLm5leHQoKTsKLQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCS8vIGlmKGNhbmRpZGF0ZS5nZXRDb250YWluZWRBcnRpZmFjdHMoKS5jb250YWlucyhhcnRpZmFjdCkpIHsKLQkJCQlpZiAoVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KGFydGlmYWN0LCBjYW5kaWRhdGUpKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKFVtYVV0aWwuaXNDb250YWluZWRCeShjYW5kaWRhdGUsIGFydGlmYWN0KSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQljYW5kaWRhdGUgPSBhcnRpZmFjdDsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kIHx8IGFydGlmYWN0TGlzdC5pc0VtcHR5KCkpCi0JCQkJdG9wTW9zdEFydGlmYWN0cy5hZGQoY2FuZGlkYXRlKTsKLQkJCWVsc2UgaWYgKGFydGlmYWN0TGlzdC5pc0VtcHR5KCkpCi0JCQkJCXRvcE1vc3RBcnRpZmFjdHMuYWRkKGNhbmRpZGF0ZSk7CQkKLQkJfQotCQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCU9iamVjdCBlID0gdW53cmFwID8gVG5nVXRpbC51bndyYXAoY2hpbGQpIDogY2hpbGQ7Ci0JCQlib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAoISh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmICh0b3BNb3N0QXJ0aWZhY3RzLmNvbnRhaW5zKHdwKSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlyZXN1bHQuYWRkKGNoaWxkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGhlbHBzIGJ1aWxkIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yIHRyZWUgY29ycmVjdGx5Ci0JICogCi0JICogQHBhcmFtIGNoaWxkcmVuCi0JICogQHBhcmFtIHVud3JhcAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgcmVtb3ZlU3ViYXJ0aWZhY3RzRnJvbUNoaWxkcmVuKGZpbmFsIENvbGxlY3Rpb24gY2hpbGRyZW4sIGJvb2xlYW4gdW53cmFwLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlMaXN0IGFydGlmYWN0RGVzY0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gZ2V0IHRoZSBhcnRpZmFjdCBsaXN0Ci0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZih1bndyYXApIHsKLQkJCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCX0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGNoaWxkKQotCQkJCQkJLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQkJaWYgKHdwIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJYXJ0aWZhY3REZXNjTGlzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmKGFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZihjaGlsZHJlbiBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlyZXR1cm4gKExpc3QpIGNoaWxkcmVuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUxpc3QoY2hpbGRyZW4pOwotCQkJfQotCQl9Ci0JCQotCQkvLyBwcm9jZXNzIHRoZSBhcnRpZmFjdCBsaXN0IHRvIGdldCB0aGUgdG9wLW1vc3Qgb25lcwotCQkvLwotCQlTZXQgdG9wTW9zdEFydGlmYWN0RGVzY0xpc3QgPSBuZXcgSGFzaFNldCgpOwotCQlMaXN0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KGFydGlmYWN0RGVzY0xpc3QpOwotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgY2FuZGlkYXRlID0gbnVsbDsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoIWFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKSB7Ci0JCQkKLQkJCWlmICghZm91bmQpCi0JCQl7Ci0JCQkJY2FuZGlkYXRlID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgYXJ0aWZhY3REZXNjTGlzdC5nZXQoMCk7Ci0JCQkJYXJ0aWZhY3REZXNjTGlzdC5yZW1vdmUoMCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdERlc2NMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciBhcnRpZmFjdERlc2MgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlmb3VuZCA9IGZhbHNlOwotCQkJCWlmIChQcm9jZXNzVXRpbC5pc0NvbnRhaW5lZEJ5KGNhbmRpZGF0ZSwgYXJ0aWZhY3REZXNjLCBhcnRpZmFjdERlc2NyaXB0b3JzKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChQcm9jZXNzVXRpbC5pc0NvbnRhaW5lZEJ5KGFydGlmYWN0RGVzYywgY2FuZGlkYXRlLCBhcnRpZmFjdERlc2NyaXB0b3JzKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQljYW5kaWRhdGUgPSBhcnRpZmFjdERlc2M7Ci0KLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWZvdW5kIHx8IGFydGlmYWN0RGVzY0xpc3QuaXNFbXB0eSgpKQotCQkJCXRvcE1vc3RBcnRpZmFjdERlc2NMaXN0LmFkZChjYW5kaWRhdGUpOwotCQkJZWxzZSBpZiAoYXJ0aWZhY3REZXNjTGlzdC5pc0VtcHR5KCkpCi0JCQkJCXRvcE1vc3RBcnRpZmFjdERlc2NMaXN0LmFkZChjYW5kaWRhdGUpOwkJCi0JCX0KLQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBjaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGNpLm5leHQoKTsKLQkJCU9iamVjdCBlID0gdW53cmFwID8gVG5nVXRpbC51bndyYXAoY2hpbGQpIDogY2hpbGQ7Ci0JCQlib29sZWFuIHNlbGVjdGVkID0gZmFsc2U7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSk7Ci0JCQkJV29ya1Byb2R1Y3Qgd3AgPSB3cGQuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCQlpZiAoISh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSkgewotCQkJCQlzZWxlY3RlZCA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmICh0b3BNb3N0QXJ0aWZhY3REZXNjTGlzdC5jb250YWlucyh3cGQpKSB7Ci0JCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdGVkID0gdHJ1ZTsKLQkJCX0KLQkJCWlmIChzZWxlY3RlZCkgewotCQkJCXJlc3VsdC5hZGQoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBmaW5kQWN0aXZpdHkoUHJvY2Vzc1BhY2thZ2UgcHJvY1BhY2thZ2UpIHsKLQkJaWYocHJvY1BhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzQ29tcG9uZW50KXByb2NQYWNrYWdlKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2NQYWNrYWdlCi0JCQkJLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiAoKEFjdGl2aXR5KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseShBY3Rpdml0eSBhY3QpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihhY3QpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMzY4MjYxNjg1NjYzMzU0NDc4TDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlBcnJheUxpc3QgYWN0aXZpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSlvYmplY3QpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWFjdGl2aXRpZXMuYWRkKGVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBhY3Rpdml0aWVzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWZpeEJyZWFrZG93bkVsZW1lbnRPcmRlcigoQWN0aXZpdHkpaXRlci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpeEJyZWFrZG93bkVsZW1lbnRPcmRlcihBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlFTGlzdCBsaXN0ID0gKEVMaXN0KSBhY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGxpc3QpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJQnJlYWtkb3duRWxlbWVudCBzdWNjID0gZS5nZXRQcmVzZW50ZWRBZnRlcigpOwotCQkJaWYoc3VjYyAhPSBudWxsICYmIHN1Y2MgIT0gZSkgewotCQkJCWludCBzdWNjSWQgPSBsaXN0LmluZGV4T2Yoc3VjYyk7Ci0JCQkJaWYoc3VjY0lkICE9IC0xKSB7Ci0JCQkJCWludCBpZCA9IGxpc3QuaW5kZXhPZihlKTsKLQkJCQkJaWYoaWQgIT0gc3VjY0lkIC0gMSkgewotCQkJCQkJaWYoaWQgPCBzdWNjSWQpIHsKLQkJCQkJCQlsaXN0Lm1vdmUoc3VjY0lkIC0gMSwgaWQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbGlzdC5tb3ZlKGlkLCBzdWNjSWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWUuc2V0UHJlc2VudGVkQWZ0ZXIobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgaXRlbSBwcm92aWRlciBwYXRoIG9mIHRoZSBnaXZlbiBhY3Rpdml0eSwgdGhlIHBhdGggZnJvbSB0b3AgcHJvY2VzcyB0byB0aGUgYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZUl0ZW1Qcm92aWRlclBhdGgoQWN0aXZpdHkgYWN0aXZpdHksIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpcCA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlJQlNJdGVtUHJvdmlkZXIgYnNJcCA9IChJQlNJdGVtUHJvdmlkZXIpIGlwOwotCQlPYmplY3QgdG9wID0gYnNJcC5nZXRUb3BJdGVtKCk7Ci0JCWlmKCEodG9wIGluc3RhbmNlb2YgUHJvY2VzcykgfHwgISgoKEVPYmplY3QpdG9wKS5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSkgewotCQkJLy8gaXRlbSBwcm92aWRlciB0cmVlIG9mIHRoZSBvd25lcidzIHByb2Nlc3MgaXMgbm90IGluaXRpYWxpemVkIHlldAotCQkJLy8gaW5pdGlhbGl6ZSBpdC4KLQotCQkJLy8gZ2V0IHRoZSBhY3Rpdml0eSBwYXRoCi0JCQkvLwotCQkJQXJyYXlMaXN0IGFjdFBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IoYWN0aXZpdHkgPSBhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKTsgYWN0aXZpdHkgIT0gbnVsbDsgYWN0aXZpdHkgPSBhY3Rpdml0eS5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJCWFjdFBhdGguYWRkKDAsIGFjdGl2aXR5KTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdFBhdGguaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGFjdCA9IGl0ZXIubmV4dCgpOwotCQkJCWlwID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCWlwLmdldENoaWxkcmVuKGFjdCk7Ci0JCQl9Ci0JCX0KLQl9CQkKLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBvciBhbnkgb2YgaXRzIHN1YmFjdGl2aXRpZXMgaXMgYSBjb250cmlidXRvciBvciByZXBsYWNlcgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpdml0eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKEFjdGl2aXR5KW9iamVjdCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJCi0JCXdoaWxlKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZihiYXNlICE9IG51bGwgJiYgKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyB8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpKSB7Ci0vLwkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpIGJhc2UpOwotLy8JCQkJaWYocHJvYyAhPSBwcm9jZXNzKSB7Ci0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCS8qKgotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVG9wUHJvY2VzcyhPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBQcm9jZXNzICYmICgoUHJvY2Vzcyl0YXJnZXQpLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHdwRGVzY0xpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrUHJvZHVjdERlc2NyaXB0b3IgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKENvbGxlY3Rpb24gZWxlbWVudHMsIFdvcmtQcm9kdWN0IHdwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpZSk7Ci0JCQkJaWYod3BkLmdldFdvcmtQcm9kdWN0KCkgPT0gd3ApIHsKLQkJCQkJcmV0dXJuIHdwZDsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFza0Rlc2NMaXN0Ci0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXNrRGVzY3JpcHRvciBnZXRUYXNrRGVzY3JpcHRvcihDb2xsZWN0aW9uIGVsZW1lbnRzLCBUYXNrIHRhc2spIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZSA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGQgPSAoVGFza0Rlc2NyaXB0b3IpIGU7Ci0JCQkJaWYodGQuZ2V0VGFzaygpID09IHRhc2spIHsKLQkJCQkJcmV0dXJuIHRkOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvd25pbmcgd29yayBicmVha2Rvd24gZWxlbWVudCBvZiBhIHdvcmsgb3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqICAgICAgICAgICAgYSB3b3JrIG9yZGVyCi0JICogQHJldHVybiBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBvd25zIHRoZSB3b3JrIG9yZGVyIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya0JyZWFrZG93bkVsZW1lbnQgZ2V0T3duZXIoV29ya09yZGVyIHdvcmtPcmRlcikgewotCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U3VjY2Vzc29yKHdvcmtPcmRlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGdldENvbXBvc2VkV3JhcHBlcihPYmplY3Qgb2JqZWN0KSB7Ci0JCXdoaWxlKCEob2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikKLQkJCQkmJiBvYmplY3QgaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJb2JqZWN0ID0gKChJV3JhcHBlckl0ZW1Qcm92aWRlcilvYmplY3QpLmdldFZhbHVlKCk7Ci0JCX0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJcmV0dXJuIChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGdpdmVuIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29sdW1uIElELiBUaGUKLQkgKiBicmVha2Rvd24gc3RydWN0dXJlIGNvbHVtbiBJRHMgYXJlIGRlZmluZWQgYXMgY29uc3RhbnRzIGluCi0JICoge0BsaW5rIElCU0l0ZW1Qcm92aWRlcn0gdGhhdCBzdGFydCB3aXRoIENPTF8KLQkgKiAKLQkgKiBAcGFyYW0gY29sdW1uTmFtZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBjb2x1bW5zIElEIGNvbnN0YW50cyAoQ09MX1hYWCkgZGVmaW5lZCBpbgotCSAqICAgICAgICAgICAge0BsaW5rIElCU0l0ZW1Qcm92aWRlcn0KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0Q29sdW1uRGlzcGxheU5hbWUoU3RyaW5nIGNvbHVtbklkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJCU19Db2x1bW5fIiArIGNvbHVtbklkKTsgLy8kTk9OLU5MUy0xJCAKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gY29sdW1uSWQ7Ci0JfQotCQotCQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMgdW5kZXIgc2VsZWN0ZWQgYWN0aXZpdGllcwotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFRhc2tEZXNjcmlwdG9ycyhMaXN0IHNlbGVjdGlvbikgewotCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRXhwb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gKEV4cG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJZm9yIChJdGVyYXRvciBpdG9yID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0b3JPYmogPSBpdG9yLm5leHQoKTsKLQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJfHwgaXRvck9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWdldFRhc2tEZXNjcmlwdG9ycyhhZGFwdGVyRmFjdG9yeSwgaXRvck9iaiwgdGFza0Rlc2NyaXB0b3JzKTsKLQkJCX0KLQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkJfHwgaXRvck9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCWlmICghdGFza0Rlc2NyaXB0b3JzLmNvbnRhaW5zKGl0b3JPYmopKQotCQkJCQl0YXNrRGVzY3JpcHRvcnMuYWRkKGl0b3JPYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcnM7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0VGFza0Rlc2NyaXB0b3JzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgYWN0LAotCQkJTGlzdCB0YXNrRGVzY3JpcHRvcnMpIHsKLQkJT2JqZWN0IGxpc3QgPSBudWxsOwotCQlpZiAoYWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoYWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJLy8gZ2V0IGNoaWxkcmVuCi0JCQlsaXN0ID0gYWRhcHRlci5nZXRDaGlsZHJlbihhY3QpOwotCQl9IGVsc2UgaWYgKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJbGlzdCA9ICgoV3JhcHBlckl0ZW1Qcm92aWRlcikgYWN0KS5nZXRDaGlsZHJlbihhY3QpOwotCQl9Ci0JCWlmIChsaXN0ICE9IG51bGwgJiYgbGlzdCBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCUxpc3QgY2hpbGRyZW4gPSAoTGlzdCkgbGlzdDsKLQkJCWZvciAoSXRlcmF0b3IgY2hpbGRJdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgY2hpbGRJdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2hpbGRJdGVyLm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgb2JqIGluc3RhbmNlb2YgQWN0aXZpdHlXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWdldFRhc2tEZXNjcmlwdG9ycyhhZGFwdGVyRmFjdG9yeSwgb2JqLCB0YXNrRGVzY3JpcHRvcnMpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlpZiAoIXRhc2tEZXNjcmlwdG9ycy5jb250YWlucyhvYmopKQotCQkJCQkJdGFza0Rlc2NyaXB0b3JzLmFkZChvYmopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgZGVzY3JpcHRvciBvciBpdHMgd3JhcHBlciBvZiByb2xsZWQtdXAgYWN0aXZpdHkuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUm9sbGVkVXBEZXNjcmlwdG9yKE9iamVjdCBvLAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYoVG5nVXRpbC51bndyYXAobykgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG8sIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQobyk7Ci0JCQlpZihUbmdVdGlsLnVud3JhcChwYXJlbnQpIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlPYmplY3QgcGFyZW50QWRhcHRlciA9IGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQlyZXR1cm4gcGFyZW50QWRhcHRlciBpbnN0YW5jZW9mIElCU0l0ZW1Qcm92aWRlciAKLQkJCQkmJiAoKElCU0l0ZW1Qcm92aWRlcilwYXJlbnRBZGFwdGVyKS5pc1JvbGxlZFVwKCk7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotLy8JLyoqCi0vLwkgKiBDcmVhdGVzIGEgZGVlcCBjb3B5IG9mIGEgcHJvY2VzcyB0byB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgcGFja2FnZS4KLS8vCSAqIAotLy8JICogQHBhcmFtIG1vbml0b3IKLS8vCSAqIEBwYXJhbSBwcm9jZXNzCi0vLwkgKiBAcHJhcm0gbmV3UHJvY2Vzc05hbWUKLS8vCSAqIEBwYXJhbSBkZWVwQ29weUNvbmZpZwotLy8JICogQHBhcmFtIHRhcmdldFBhY2thZ2UKLS8vCSAqIEByZXR1cm4gUHJvY2VzcyB0aGUgbmV3bHkgY3JlYXRlZCBwcm9jZXNzCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGRlZXBDb3B5KAotLy8JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIAotLy8JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcywgCi0vLwkJCVN0cmluZyBuZXdQcm9jZXNzTmFtZSwKLS8vCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWVwQ29weUNvbmZpZywgCi0vLwkJCVByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2UpIHsKLS8vCQlDb3B5SGVscGVyIGhlbHBlciA9IG5ldyBDb3B5SGVscGVyKCk7CQotLy8JCXRyeSB7Ci0vLwkJCXJldHVybiBkZWVwQ29weShtb25pdG9yLCBwcm9jZXNzLCBuZXdQcm9jZXNzTmFtZSwgZGVlcENvcHlDb25maWcsIHRhcmdldFBhY2thZ2UsIGhlbHBlcik7Ci0vLwkJfQotLy8JCWZpbmFsbHkgewotLy8JCQloZWxwZXIuY2xlYXIoKTsKLS8vCQl9Ci0vLwl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBkZWVwQ29weSgKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgCi0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcywgCi0JCQlTdHJpbmcgbmV3UHJvY2Vzc05hbWUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZXBDb3B5Q29uZmlnLCAKLQkJCVByb2Nlc3NQYWNrYWdlIHRhcmdldFBhY2thZ2UsCi0JCQlDb3B5SGVscGVyIGNvcHlIZWxwZXIsCi0JCQlJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvcikgewkJCi0JCS8vIGlmIHRoZSB0YXJnZXRQYWNrYWdlIGlzIG51bGwsIHVzZSB0aGUgc2FtZSBwYWNrYWdlIG9mIHRoZSBzb3VyY2UgcHJvY2VzcwotCQlpZiAoIHRhcmdldFBhY2thZ2UgPT0gbnVsbCApIHsKLQkJCXRhcmdldFBhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpcHJvY2Vzcy5lQ29udGFpbmVyKCkuZUNvbnRhaW5lcigpOwotCQl9Ci0JCQotCQkvLwkJbmV3IGRlZXAtY29waWVkIHByb2Nlc3MncyByZWZlcmVuY2UKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MgPSBudWxsOwotCQotCQlpZihtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0KLQkJUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZCBjbWQgPSBuZXcgUHJvY2Vzc0RlZXBDb3B5Q29tbWFuZChwcm9jZXNzLCBuZXdQcm9jZXNzTmFtZSwgCi0JCQkJY29weUhlbHBlciwgZGVlcENvcHlDb25maWcsIHRhcmdldFBhY2thZ2UsIG1vbml0b3IsY29uZmlndXJhdG9yKTsKLQkJdHJ5IHsKLQkJCWNtZC5leGVjdXRlKCk7Ci0JCQlDb2xsZWN0aW9uIHJlc3VsdCA9IGNtZC5nZXRSZXN1bHQoKTsKLQkJCWlmKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJbmV3UHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHJlc3VsdC50b0FycmF5KClbMF07Ci0JCQkJLy8gZml4IGJyZWFrZG93biBlbGVtZW50IG9yZGVyIG9mIGFsbCBhY3Rpdml0aWVzCi0JCQkJLy8KLQkJCQlmaXhCcmVha2RvbndFbGVtZW50T3JkZXJSZWN1cnNpdmVseShuZXdQcm9jZXNzKTsJCi0JCQkJY21kLmNvcHlTdXBwcmVzc2lvblN0YXRlcygpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJY21kLmRpc3Bvc2UoKTsKLQkJfQotCQkKLQkJcmV0dXJuIG5ld1Byb2Nlc3M7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhY2NlcHQoQWN0aXZpdHkgYWN0LCBJRmlsdGVyIHByb2Nlc3NGaWx0ZXIsIGJvb2xlYW4gY2hlY2tPd25pbmdQcm9jZXNzKSB7Ci0JCWlmKHByb2Nlc3NGaWx0ZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQWN0aXZpdHkgYmFzZSA9IChBY3Rpdml0eSkgYWN0LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWlmIChiYXNlID09IG51bGwpCi0JCXsKLQkJCWlmKGNoZWNrT3duaW5nUHJvY2VzcykgewotCQkJCXJldHVybiBwcm9jZXNzRmlsdGVyLmFjY2VwdChUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYWN0KSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMgfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKQotCQl7Ci0JCQkvLyBjaGVjayBvd25pbmcgcHJvY2VzcyBvZiBiYXNlIGFjdGl2aXR5IG9ubHkgZm9yIGV4dGVuZHMgYW5kIGxvY2FsIGNvbnRyaWJ1dGlvbi9yZXBsYWNlbWVudAotCQkJLy8KLQkJCWJvb2xlYW4gcmV0OwotCQkJZG8gewotCQkJCXJldCA9IHByb2Nlc3NGaWx0ZXIuYWNjZXB0KFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKSk7Ci0JCQkJdHlwZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQkJYmFzZSA9IChBY3Rpdml0eSkgYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQl9IHdoaWxlIChyZXQKLQkJCQkJJiYgYmFzZSAhPSBudWxsCi0JCQkJCSYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTCi0JCQkJCQkJfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgUHJvY2VzcyB0byB3aGljaCBhbiBhY3Rpdml0eSBiZWxvbmdzCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRQcm9jZXNzKEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSBVbWFVdGlsLmdldFByb2Nlc3NDb21wb25lbnQoYWN0aXZpdHkpOwotCQlpZiAocHJvY0NvbXAgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBwcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0JCQlyZXR1cm4gcHJvYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1NlY3Rpb25MaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU2VjdGlvbkxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3NTg3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU2VjdGlvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWwuU3RyaW5nUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyBhbGwgdGhlIGxvZ2ljcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsaXN0IG9mIGFsbAotICogY29udHJpYnV0ZWQvaW5oZXJpdGVkIHNlY3Rpb25zIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFzIHdlbGwgYXMgYWxsb3dzCi0gKiBtYW5pcHVsYXRlIHRoaXMgbGlzdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25MaXN0IGV4dGVuZHMgQmFzaWNFTGlzdDxTZWN0aW9uPiB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU3NTcyNzk3NDg3MDY5MjMzTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9JTkZPX05BTUUgPSAic2VjdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgREVGQVVMVF9TQVZFX09QVElPTlMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RFUFNfRk9SX0VMRU1FTlRfT05MWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUyA9IDI7Ci0KLQlzdGF0aWMgewotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiQVNDSUkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQ29udGVudEVsZW1lbnQgZWRpdEVsZW1lbnQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWl4ZWQgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb250cmlidXRvcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gVG5nVXRpbC5pc0NvbnRyaWJ1dG9yKGUpOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uTGlzdChDb250ZW50RWxlbWVudCBlLCBpbnQgc2NvcGUpIHsKLQkJZWRpdEVsZW1lbnQgPSBlOwotCQlpZiAoc2NvcGUgPT0gU1RFUFNfRk9SX0VMRU1FTlRfT05MWSkgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChzY29wZSA9PSBTVEVQU19GT1JfRUxFTUVOVF9BTkRfUEFSRU5UUykgewotCQkJY2FsY3VsYXRlUGFyZW50c09ubHkoZSk7Ci0JCX0gZWxzZSB7Ci0JCQltaXhlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVBhcmVudHNPbmx5KENvbnRlbnRFbGVtZW50IGUpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG51bGw7Ci0JCS8vIGlmKGlzQ29udHJpYnV0b3IoZSkpIHsKLQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBjb250cmlidXRpbmcgaXMKLQkJLy8gdHJ1ZSIpOwotCQkvLyBMaXN0IHN1cGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQkvLyBzdXBlcnMuYWRkKGUpOwotCQkvLyBpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIH0gZWxzZSBpZihpc0V4dGVuZGVkKGUpKSB7Ci0JCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kaW5nIGlzCi0JCS8vIHRydWUiKTsKLQkJLy8gTGlzdCBzdXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFVtYVV0aWwuZ2V0QWxsU3VwZXJzKHN1cGVycywgZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQkvLyBzdXBlcnMuYWRkKGUpOwotCQkvLyBpdGVyID0gc3VwZXJzLml0ZXJhdG9yKCk7Ci0JCS8vIH0KLQkJaWYgKGlzQ29udHJpYnV0b3IoZSkgfHwgaXNFeHRlbmRlZChlKSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIkJCQgZm9yICIgKyBlLmdldE5hbWUoKSArICIgPSBjb250cmlidXRpbmcgaXMKLQkJCS8vIHRydWUiKTsKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnNCb3RoKHN1cGVycywgZSwKLQkJCQkJVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTLAotCQkJCQlWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJLy8KLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcDxTdHJpbmcsIFNlY3Rpb24+IGd1aWRTZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZWN0aW9uPigpOwotCQkJU2V0IHNlY3RzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlbGVtZW50KSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKQotCQkJCQkJCS5nZXRTZWN0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlndWlkU2VjdGlvbk1hcC5wdXQoc2VjdC5nZXRHdWlkKCksIHNlY3QpOwotCQkJCQkJc2VjdHMuYWRkKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSBUbmdVdGlsLmdldE9yZGVySW5mbyhlbGVtZW50LAotCQkJCQkJT1JERVJfSU5GT19OQU1FKTsKLQkJCQlpZiAob3JkZXJJbmZvICE9IG51bGwpIHsKLQkJCQkJaWYgKGxhdGVzdEluZm8gPT0gbnVsbAotCQkJCQkJCXx8IG9yZGVySW5mby5nZXRUaW1lc3RhbXAoKSA+IGxhdGVzdEluZm8KLQkJCQkJCQkJCS5nZXRUaW1lc3RhbXAoKSkgewotCQkJCQkJbGF0ZXN0SW5mbyA9IG9yZGVySW5mbzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGxhdGVzdEluZm8gIT0gbnVsbCkgewotCQkJCS8vIHJlb3JkZXIgdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBsYXRlc3Qgb3JkZXIgaW5mbwotCQkJCS8vCi0JCQkJaW50IHNpemUgPSBsYXRlc3RJbmZvLmdldEdVSURzKCkuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBndWlkID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLmdldChpKTsKLQkJCQkJU2VjdGlvbiBzZWN0ID0gZ3VpZFNlY3Rpb25NYXAuZ2V0KGd1aWQpOwotCQkJCQlpZiAoc2VjdCAhPSBudWxsKSB7Ci0JCQkJCQlzdXBlci5hZGQoc2VjdCk7Ci0JCQkJCQlzZWN0cy5yZW1vdmUoc2VjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzdXBlci5hZGRBbGwoc2VjdHMpOwotCQl9Ci0JfQotCi0JLy8gZGVwcmVjYXRlIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3IKLQlwdWJsaWMgU2VjdGlvbkxpc3QoQ29udGVudEVsZW1lbnQgZSkgewotCQllZGl0RWxlbWVudCA9IGU7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBudWxsOwotCQlpZiAoaXNDb250cmlidXRvcihlKSB8fCBUbmdVdGlsLmhhc0NvbnRyaWJ1dG9yKGUpKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IFRuZ1V0aWwuZ2V0QmFzZShlKTsKLQkJCWl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYmFzZSkgewotCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkJLmdldEltbWVkaWF0ZVZhcmlldGllcygoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJCQkJCWNoaWxkcmVuLmFkZChlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZXR1cm4gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCX0gZWxzZSBpZiAoaXNFeHRlbmRlZChlKSkgewotCQkJU3lzdGVtLm91dAotCQkJCQkucHJpbnRsbigiJCQkIGZvciAiICsgZS5nZXROYW1lKCkgKyAiID0gZXh0ZW5kZWQgaXMgdHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUxpc3Qgc3VwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJVW1hVXRpbC5nZXRBbGxTdXBlcnMoc3VwZXJzLCBlLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JCQlzdXBlcnMuYWRkKGUpOwotCQkJaXRlciA9IHN1cGVycy5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJbWl4ZWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChtaXhlZCkgewotCQkJLy8gY3JlYXRlIGEgbWFwIG9mIEdVSUQgLyBjb250cmlidXRvcgotCQkJLy8KLQkJCU9yZGVySW5mbyBsYXRlc3RJbmZvID0gbnVsbDsKLQkJCU1hcDxTdHJpbmcsIFNlY3Rpb24+IGd1aWRTZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZWN0aW9uPigpOwotCQkJTGlzdCBzZWN0cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWxlbWVudCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJCQkuZ2V0U2VjdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlTZWN0aW9uIHNlY3QgPSAoU2VjdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJZ3VpZFNlY3Rpb25NYXAucHV0KHNlY3QuZ2V0R3VpZCgpLCBzZWN0KTsKLQkJCQkJCXNlY3RzLmFkZChzZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gVG5nVXRpbC5nZXRPcmRlckluZm8oZWxlbWVudCwKLQkJCQkJCU9SREVSX0lORk9fTkFNRSk7Ci0JCQkJaWYgKG9yZGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCWlmIChsYXRlc3RJbmZvID09IG51bGwKLQkJCQkJCQl8fCBvcmRlckluZm8uZ2V0VGltZXN0YW1wKCkgPiBsYXRlc3RJbmZvCi0JCQkJCQkJCQkuZ2V0VGltZXN0YW1wKCkpIHsKLQkJCQkJCWxhdGVzdEluZm8gPSBvcmRlckluZm87Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChsYXRlc3RJbmZvICE9IG51bGwpIHsKLQkJCQkvLyByZW9yZGVyIHRoZSBzZWN0aW9ucyBiYXNlZCBvbiB0aGUgbGF0ZXN0IG9yZGVyIGluZm8KLQkJCQkvLwotCQkJCWludCBzaXplID0gbGF0ZXN0SW5mby5nZXRHVUlEcygpLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQlPYmplY3QgZ3VpZCA9IGxhdGVzdEluZm8uZ2V0R1VJRHMoKS5nZXQoaSk7Ci0JCQkJCVNlY3Rpb24gc2VjdCA9IGd1aWRTZWN0aW9uTWFwLmdldChndWlkKTsKLQkJCQkJaWYgKHNlY3QgIT0gbnVsbCkgewotCQkJCQkJc3VwZXIuYWRkKHNlY3QpOwotCQkJCQkJc2VjdHMucmVtb3ZlKHNlY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJc3VwZXIuYWRkQWxsKHNlY3RzKTsKLQkJfQotCQkvLyBlbHNlIHsKLQkJLy8gLy8gYWRkQWxsKGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkpOwotCQkvLyBtaXhlZCA9IGZhbHNlOwotCQkvLyB9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZGVkKENvbnRlbnRFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgcmVjZW50IGNoYW5nZXMgaW4gdGhlIGxpc3QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseSgpIHsKLQkJaWYgKCFtaXhlZCB8fCAhY2hhbmdlZCkKLQkJCXJldHVybjsKLQotCQkvLyBzYXZlIHRoZSBvcmRlciBpbmZvIHRvIHRoZSBvcmRlcmluZ0d1aWRlIG9mIHRoZSBlZGl0RWxlbWVudAotCQkvLwotCQlTdHJpbmcgc3RyID0gZWRpdEVsZW1lbnQuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSBudWxsOwotCQlTdHJpbmdSZXNvdXJjZSByZXMgPSBudWxsOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXJlcyA9IG5ldyBTdHJpbmdSZXNvdXJjZShzdHIpOwotCQkJdHJ5IHsKLQkJCQlyZXMubG9hZChudWxsKTsKLQkJCQlpZiAocmVzLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJCW9yZGVySW5mb3MgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkJLmNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlvcmRlckluZm9zID0gKE9yZGVySW5mb0NvbGxlY3Rpb24pIHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGZpbmQgdGhlIG9yZGVyIGluZm9yIGZvciBzZWN0aW9ucwotCQkvLwotCQlPcmRlckluZm8gc2VjdE9yZGVySW5mbyA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT3JkZXJJbmZvIG9yZGVySW5mbyA9IChPcmRlckluZm8pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE9SREVSX0lORk9fTkFNRS5lcXVhbHNJZ25vcmVDYXNlKG9yZGVySW5mby5nZXROYW1lKCkpKSB7Ci0JCQkJc2VjdE9yZGVySW5mbyA9IG9yZGVySW5mbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChzZWN0T3JkZXJJbmZvID09IG51bGwpIHsKLQkJCXNlY3RPcmRlckluZm8gPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU9yZGVySW5mbygpOwotCQkJc2VjdE9yZGVySW5mby5zZXROYW1lKE9SREVSX0lORk9fTkFNRSk7Ci0JCQlvcmRlckluZm9zLmdldE9yZGVySW5mb3MoKS5hZGQoc2VjdE9yZGVySW5mbyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWN0T3JkZXJJbmZvLmdldEdVSURzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWludCBzaXplID0gc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGdldChpKTsKLQkJCXNlY3RPcmRlckluZm8uZ2V0R1VJRHMoKS5hZGQoc2VjdC5nZXRHdWlkKCkpOwotCQl9Ci0JCXNlY3RPcmRlckluZm8uc2V0VGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXMgPSBuZXcgU3RyaW5nUmVzb3VyY2UobnVsbCk7Ci0JCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQob3JkZXJJbmZvcyk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXJlcy5zYXZlKERFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJCXN0ciA9IHJlcy5nZXRTdHJpbmcoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU2VjdGlvbkxpc3QuYXBwbHkoKTogbmV3IG9yZGVyaW5nIGd1aWRlIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIHN0YXJ0IC0tLS0tLSIpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLSBvcmRlcmluZ0d1aWRlIGVuZCAtLS0tLS0iKTsKLQkJCWVkaXRFbGVtZW50LnNldE9yZGVyaW5nR3VpZGUoc3RyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKFNlY3Rpb24gc2VjdGlvbikgewotCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWRpdEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkgPT0gc2VjdGlvbi5lQ29udGFpbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlpZiAoIWNhblJlbW92ZSgoU2VjdGlvbikgZ2V0KGluZGV4KSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTZWN0aW9uIHJlbW92ZWQgPSBzdXBlci5yZW1vdmUoaW5kZXgpOwotCQkJZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUocmVtb3ZlZCk7Ci0JCQlyZXR1cm4gcmVtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShpbmRleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJaWYgKCFjYW5SZW1vdmUoKFNlY3Rpb24pIG8pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobWl4ZWQpIHsKLQkJCWlmIChzdXBlci5yZW1vdmUobykpIHsKLQkJCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLnJlbW92ZShvKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb24gYykgewotCQlpZiAobWl4ZWQpIHsKLQkJCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJCUl0ZXJhdG9yIGUgPSBpdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBlLm5leHQoKTsKLQkJCQlpZiAoYy5jb250YWlucyhvKSAmJiBjYW5SZW1vdmUoKFNlY3Rpb24pIG8pKSB7Ci0JCQkJCWUucmVtb3ZlKCk7Ci0JCQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlKG8pOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG1vZGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkucmVtb3ZlQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgU2VjdGlvbiBlbGVtZW50KSB7Ci0JCWlmIChtaXhlZCkgewotCQkJc3VwZXIuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkKGVsZW1lbnQpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoU2VjdGlvbiBvKSB7Ci0JCWJvb2xlYW4gYiA9IGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuYWRkKG8pOwotCQlpZiAobWl4ZWQpIHsKLQkJCWIgPSBzdXBlci5hZGQobyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gYjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+IGMpIHsKLQkJYm9vbGVhbiBiID0gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoYyk7Ci0JCWlmIChtaXhlZCkgewotCQkJYiA9IHN1cGVyLmFkZEFsbChjKTsKLQkJCWlmIChiKQotCQkJCWNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBiOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+IGMpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQllZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmFkZEFsbChjKTsKLQkJCWJvb2xlYW4gYiA9IHN1cGVyLmFkZEFsbChpbmRleCwgYyk7Ci0JCQlpZiAoYikKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5hZGRBbGwoaW5kZXgsIGMpOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uIHNldChpbnQgaW5kZXgsIFNlY3Rpb24gZWxlbWVudCkgewotCQlpZiAobWl4ZWQpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuc2V0KGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKG1peGVkKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCWVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCBpbmRleCwgU2VjdGlvbiBvYmplY3QpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlzdXBlci5tb3ZlKGluZGV4LCBvYmplY3QpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkoKEVMaXN0KSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKS5tb3ZlKGluZGV4LAotCQkJCQlvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIFNlY3Rpb24gbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCVNlY3Rpb24gbW92ZWQgPSBzdXBlci5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCXJldHVybiBtb3ZlZDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoKEVMaXN0PFNlY3Rpb24+KSBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpKS5tb3ZlKAotCQkJCQl0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIFNlY3Rpb24gZ2V0KGludCBpbmRleCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5nZXQoaW5kZXgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuZ2V0KGluZGV4KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc2l6ZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuc2l6ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci5pdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnMob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gZWRpdEVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0U2VjdGlvbnMoKS5jb250YWlucyhvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JCXJldHVybiBlZGl0RWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpLmNvbnRhaW5zQWxsKAotCQkJCWNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlpZiAobWl4ZWQpIHsKLQkJCXJldHVybiBzdXBlci50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0JCWlmIChtaXhlZCkKLQkJCXJldHVybiBzdXBlci50b0FycmF5KGFycmF5KTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkudG9BcnJheShhcnJheSk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG1peGVkKQotCQkJcmV0dXJuIHN1cGVyLmluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkuaW5kZXhPZihvYmplY3QpOwotCX0KLQotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG9iamVjdCkgewotCQlpZiAobWl4ZWQpCi0JCQlyZXR1cm4gc3VwZXIubGFzdEluZGV4T2Yob2JqZWN0KTsKLQkJcmV0dXJuIGVkaXRFbGVtZW50LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCkubGFzdEluZGV4T2Yob2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01peGVkKCkgewotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL1N0ZXBMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3RlcExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MGVhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3RlcExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBSZW9yZGVyIHN0ZXBzCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwTGlzdCB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc1NjczMjU4NDk4NTg4NzFMOwotCi0JcHJpdmF0ZSBzdGF0aWMgRGVzY3JpYmFibGVFbGVtZW50IGdldERlc2NyaWJhYmxlRWxlbWVudChTZWN0aW9uIHN0ZXApIHsKLQkJcmV0dXJuIChEZXNjcmliYWJsZUVsZW1lbnQpIHN0ZXAuZUNvbnRhaW5lcigpLmVDb250YWluZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFRhc2sgY3VycmVudFRhc2s7Ci0KLQlwcml2YXRlIExpbmtlZExpc3Qgc3RlcExpc3RzOwotCi0JcHVibGljIFN0ZXBMaXN0KFRhc2sgY3VycmVudFRhc2ssIExpc3Qgc3RlcExpc3RzKSB7Ci0JCXRoaXMuY3VycmVudFRhc2sgPSBjdXJyZW50VGFzazsKLQkJdGhpcy5zdGVwTGlzdHMgPSBuZXcgTGlua2VkTGlzdChzdGVwTGlzdHMpOwotCQlyZW9yZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlb3JkZXIoKSB7Ci0JCU1hcCBvd25lclNlY3Rpb25zTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaW50IHNpemUgPSBzdGVwTGlzdHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRWNvcmVFTGlzdCBlTGlzdCA9IChFY29yZUVMaXN0KSBzdGVwTGlzdHMuZ2V0KGkpOwotCQkJb3duZXJTZWN0aW9uc01hcC5wdXQoZUxpc3QuZ2V0Tm90aWZpZXIoKSwgZUxpc3QpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ldyBBcnJheUxpc3Qoc3RlcExpc3RzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUxpc3Qgc3RlcExpc3QgPSAoTGlzdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIXN0ZXBMaXN0LmlzRW1wdHkoKSkgewotCQkJCVNlY3Rpb24gc3RlcCA9IChTZWN0aW9uKSBzdGVwTGlzdC5nZXQoMCk7Ci0JCQkJU2VjdGlvbiBwcmVkID0gc3RlcC5nZXRQcmVkZWNlc3NvcigpOwotCQkJCWlmIChwcmVkID09IG51bGwpIHsKLQkJCQkJTGlzdCBvbGRGaXJzdExpc3QgPSAoTGlzdCkgc3RlcExpc3RzLmdldCgwKTsKLQotCQkJCQkvLyBwdXQgdGhpcyBzdGVwIGxpc3QgYXQgYmVnaW5uaW5nCi0JCQkJCS8vCi0JCQkJCXN0ZXBMaXN0cy5yZW1vdmUoc3RlcExpc3QpOwotCQkJCQlzdGVwTGlzdHMuYWRkKDAsIHN0ZXBMaXN0KTsKLQotCQkJCQkvLyBzZXQgdGhpcyBzdGVwIGxpc3QgdG8gYmUgdGhlIHByZWRlY2Vzc29yIG9mIHRoZSBwcmV2aW91cwotCQkJCQkvLyBmaXJzdCBsaXN0Ci0JCQkJCS8vCi0JCQkJCWlmICghb2xkRmlyc3RMaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJU2VjdGlvbiBvbGRGaXJzdFN0ZXAgPSAoU2VjdGlvbikgb2xkRmlyc3RMaXN0LmdldCgwKTsKLQkJCQkJCWlmIChUbmdVdGlsLmNhblJlZmVyZW5jZSgKLQkJCQkJCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50KG9sZEZpcnN0U3RlcCksCi0JCQkJCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudChzdGVwKSkpIHsKLQkJCQkJCQlvbGRGaXJzdFN0ZXAuc2V0UHJlZGVjZXNzb3Ioc3RlcCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlMaXN0IHByZWRMaXN0ID0gKExpc3QpIG93bmVyU2VjdGlvbnNNYXAuZ2V0KHByZWQKLQkJCQkJCQkuZUNvbnRhaW5lcigpKTsKLQkJCQkJc3RlcExpc3RzLnJlbW92ZShwcmVkTGlzdCk7Ci0JCQkJCWludCBpZCA9IHN0ZXBMaXN0cy5pbmRleE9mKHN0ZXBMaXN0KTsKLQkJCQkJc3RlcExpc3RzLmFkZChpZCwgcHJlZExpc3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgdm9pZCByZWFzc2lnblByZWRlY2Vzc29ycygpIHsKLQkvLwotCS8vIH0KLQotCXB1YmxpYyBMaXN0IGdldFN0ZXBzKCkgewotCQlMaXN0IGFsbFN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbnQgc2l6ZSA9IHN0ZXBMaXN0cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlMaXN0IHN0ZXBzID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQoaSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhbGxTdGVwcy5hZGQoaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhbGxTdGVwczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlVXAoU2VjdGlvbiBzdGVwKSB7Ci0JCUxpc3Qgc3RlcHMgPSBjdXJyZW50VGFzay5nZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCQlpbnQgaWQgPSBzdGVwcy5pbmRleE9mKHN0ZXApOwotCQlpZiAoaWQgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpZCA+IDApIHsKLQkJCWlmIChpZCA9PSAxKSB7Ci0KLQkJCX0KLQkJCS8vIG1vdmUgdGhlIHN0ZXAgd2l0aGluIGl0cyBsaXN0Ci0JCQkvLwotCQkJQ29sbGVjdGlvbnMuc3dhcChzdGVwcywgaWQgLSAxLCBpZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBtb3ZlIHRoZSB3aG9sZSBzdGVwIGxpc3QgdXAKLQkJLy8KLQkJaWQgPSBzdGVwTGlzdHMuaW5kZXhPZihzdGVwcyk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJTGlzdCBwcmVkTGlzdCA9IG51bGw7Ci0JCWludCBwcmVkTGlzdElkID0gaWQgLSAxOwotCQkvLyBsb29rIGZvciBub24tZW1wdHkgcHJlZGVjZXNzb3IgbGlzdAotCQkvLwotCQlmaW5kX3ByZWRMaXN0OiBmb3IgKDsgcHJlZExpc3RJZCA+IC0xOyBwcmVkTGlzdElkLS0pIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBzdGVwTGlzdHMuZ2V0KHByZWRMaXN0SWQpOwotCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCXByZWRMaXN0ID0gbGlzdDsKLQkJCQlicmVhayBmaW5kX3ByZWRMaXN0OwotCQkJfQotCQl9Ci0JCVNlY3Rpb24gb2xkUHJlZCA9ICgoU2VjdGlvbikgc3RlcHMuZ2V0KDApKS5nZXRQcmVkZWNlc3NvcigpOwotCQlMaXN0IG9sZFN1Y2Nlc3NvcnMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRTdWNjZXNzb3JzKChTZWN0aW9uKSBzdGVwcwotCQkJCS5nZXQoc3RlcHMuc2l6ZSgpIC0gMSkpOwotCQlpZiAocHJlZExpc3QgIT0gbnVsbCkgewotCQkJc3RlcExpc3RzLnJlbW92ZShzdGVwcyk7Ci0JCQlzdGVwTGlzdHMuYWRkKHByZWRMaXN0SWQsIHN0ZXBzKTsKLQkJCVNlY3Rpb24gbGFzdCA9IChTZWN0aW9uKSBwcmVkTGlzdC5nZXQocHJlZExpc3Quc2l6ZSgpIC0gMSk7Ci0JCQlMaXN0IG9sZFByZWRTdWNjZXNzb3JzID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0U3VjY2Vzc29ycyhsYXN0KTsKLQkJCWlmIChUbmdVdGlsLmNhblJlZmVyZW5jZShjdXJyZW50VGFzaywgZ2V0RGVzY3JpYmFibGVFbGVtZW50KGxhc3QpKSkgewotCQkJCXN0ZXAuc2V0UHJlZGVjZXNzb3IobGFzdCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkUHJlZFN1Y2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJU2VjdGlvbiBzZWN0ID0gKFNlY3Rpb24pIGl0ZXIubmV4dCgpOwotCQkJCQlzZWN0LnNldFByZWRlY2Vzc29yKHN0ZXApOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0ZXBMaXN0cy5hZGQoMCwgc3RlcHMpOwotCQl9Ci0JCURlc2NyaWJhYmxlRWxlbWVudCBvbGRQcmVkVGFzayA9IGdldERlc2NyaWJhYmxlRWxlbWVudChvbGRQcmVkKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2xkU3VjY2Vzc29ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNlY3Rpb24gc2VjdCA9IChTZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChUbmdVdGlsLmNhblJlZmVyZW5jZShnZXREZXNjcmliYWJsZUVsZW1lbnQoc2VjdCksIG9sZFByZWRUYXNrKSkgewotCQkJCXNlY3Quc2V0UHJlZGVjZXNzb3Iob2xkUHJlZCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlRG93bihTZWN0aW9uIHN0ZXApIHsKLQkJTGlzdCBzdGVwcyA9IGN1cnJlbnRUYXNrLmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JCWludCBpZCA9IHN0ZXBzLmluZGV4T2Yoc3RlcCk7Ci0JCWlmIChpZCA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlkIDwgc3RlcHMuc2l6ZSgpIC0gMSkgewotCQkJLy8gbW92ZSB0aGUgc3RlcCB3aXRoaW4gaXRzIGxpc3QKLQkJCS8vCi0JCQlDb2xsZWN0aW9ucy5zd2FwKHN0ZXBzLCBpZCArIDEsIGlkKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIG1vdmUgdGhlIHdob2xlIHN0ZXAgbGlzdCB1cAotCQkvLwotCQlpZCA9IHN0ZXBMaXN0cy5pbmRleE9mKHN0ZXBzKTsKLQkJaWYgKGlkID09IC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IHN1Y2NMaXN0ID0gbnVsbDsKLQkJaW50IHN1Y2NMaXN0SWQgPSBpZCArIDE7Ci0JCWludCBzaXplID0gc3RlcExpc3RzLnNpemUoKTsKLQotCQkvLyBsb29rIGZvciBub24tZW1wdHkgc3VjY2Vzc29yIGxpc3QKLQkJLy8KLQkJZmluZF9MaXN0OiBmb3IgKDsgc3VjY0xpc3RJZCA8IHNpemU7IHN1Y2NMaXN0SWQrKykgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIHN0ZXBMaXN0cy5nZXQoc3VjY0xpc3RJZCk7Ci0JCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJc3VjY0xpc3QgPSBsaXN0OwotCQkJCWJyZWFrIGZpbmRfTGlzdDsKLQkJCX0KLQkJfQotCQlpZiAoc3VjY0xpc3QgIT0gbnVsbCkgewotCQkJc3RlcExpc3RzLnJlbW92ZShzdWNjTGlzdCk7Ci0JCQlzdGVwTGlzdHMuYWRkKGlkLCBzdWNjTGlzdCk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGVwTGlzdHMuYWRkKHN0ZXBzKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvU3VwcHJlc3Npb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdXBwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWNmMjdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9TdXBwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CU0FjdGl2aXR5SXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYWxjdWxhdGVzIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSwgYm90aCBkaXJlY3QgYW5kIGluZGlyZWN0LCBvZiBhbnkKLSAqIGJyZWFrZG93biBlbGVtZW50IG9yIGl0cyB3cmFwcGVyIGluIHRoZSBzcGVjaWZpZWQgcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1cHByZXNzaW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdCUyA9ICJ3YnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQlMgPSAidGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1BCUyA9ICJ3cGJzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0JTID0gImNicyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcCBwcm9jVG9TdXBwcmVzc2lvbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGF1dG9Jbmhlcml0SW50ZXJtZWRpYXRlU3VwcHJlc3Npb25TdGF0ZSA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgUHJvY2VzcyBwcm9jZXNzOwotCi0JcHJpdmF0ZSBTZXQgc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzOwotCi0JcHJpdmF0ZSBib29sZWFuIG1vZGlmaWVkOwotCi0JcHJpdmF0ZSBTZXQgaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xlYXJDYWNoZWRTdXBwcmVzc2lvbnMoKSB7Ci0JCXByb2NUb1N1cHByZXNzaW9uTWFwLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBzdXBwcmVzc2lvbnMgb2YgaW52YWxpZCBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xlYW5VcCgpIHsKLQkJQXJyYXlMaXN0IGxpc3RUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jVG9TdXBwcmVzc2lvbk1hcC5rZXlTZXQoKSkKLQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJvYy5lSXNQcm94eSgpKSB7Ci0JCQkJbGlzdFRvUmVtb3ZlLmFkZChwcm9jKTsKLQkJCX0KLQkJfQotCQlpbnQgc2l6ZSA9IGxpc3RUb1JlbW92ZS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5yZW1vdmUobGlzdFRvUmVtb3ZlLmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0QXV0b0luaGVyaXRTdXBwcmVzc2lvblN0YXRlcyhib29sZWFuIGIpIHsKLQkJYXV0b0luaGVyaXRJbnRlcm1lZGlhdGVTdXBwcmVzc2lvblN0YXRlID0gYjsKLQl9Ci0KLQlwdWJsaWMgU3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRoaXMucHJvY2VzcyA9IHByb2Nlc3M7Ci0JCXN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9IGxvYWRTdXBwcmVzc2VkRWxlbWVudFBhdGhzKCk7Ci0JfQotCi0JcHVibGljIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHJpdmF0ZSBTZXQgbG9hZFN1cHByZXNzZWRFbGVtZW50UGF0aHMoKSB7Ci0JCUNvbnN0cmFpbnQgcnVsZSA9IENvbnN0cmFpbnRNYW5hZ2VyLmdldENvbnN0cmFpbnQocHJvY2VzcywKLQkJCQlDb25zdHJhaW50TWFuYWdlci5QUk9DRVNTX1NVUFBSRVNTSU9OLCBmYWxzZSk7IC8vIChDb25zdHJhaW50KQotCQkvLyBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5nZXQoMCk7Ci0JCWlmIChydWxlICE9IG51bGwgJiYgcnVsZS5nZXRCb2R5KCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTZXQgcGF0aHMgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihydWxlLmdldEJvZHkoKSk7IHRva2VucwotCQkJCQkuaGFzTW9yZVRva2VucygpOykgewotCQkJCXBhdGhzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJfQotCQkJcmV0dXJuIHBhdGhzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU2V0IGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpIHsKLQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQlzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPSBsb2FkU3VwcHJlc3NlZEVsZW1lbnRQYXRocygpOwotCQkJaWYgKHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyA9PSBudWxsKSB7Ci0JCQkJc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID0gbmV3IEhhc2hTZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9jZXNzCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdXBwcmVzc2VkKENvbGxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKGlzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlpZiAoaXNTdXBwcmVzc2VkKChCcmVha2Rvd25FbGVtZW50KSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc2VsZWN0aW9uIGhhcyBhbnkgZWxlbWVudCB0aGF0IGlzIG5vdCBzdXBwcmVzc2VkIHlldAotCSAqIGluIHRoaXMgc3VwcHJlc3Npb24ncyBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5TdXBwcmVzcyhDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gY2FuRG8oc2VsZWN0aW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHNlbGVjdGlvbiBoYXMgYW55IGVsZW1lbnQgdGhhdCBpcyBzdXBwcmVzc2VkIGluIHRoaXMKLQkgKiBzdXBwcmVzc2lvbidzIHByb2Nlc3MKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJldmVhbChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gY2FuRG8oc2VsZWN0aW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgaXRlbXMgZnJvbSB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHRoYXQgY2FuIGJlIHN1cHByZXNzZWQvcmV2ZWFsZWQKLQkgKiAoZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPiBwYXJhbWV0ZXIpCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqIEBwYXJhbSBzdXBwcmVzc2VkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRBcHBsaWNhYmxlSXRlbXMoQ29sbGVjdGlvbiBzZWxlY3Rpb24sCi0JCQlib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJQXJyYXlMaXN0IGFwcGxpY2FibGVJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCWlmICh3cmFwcGVyLmlzUmVhZE9ubHkoKSkgewotCQkJCQlpZiAoaXNJblN1cHByZXNzZWRMaXN0KHdyYXBwZXIpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWFwcGxpY2FibGVJdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3QgZSA9IFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkJLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJCWFwcGxpY2FibGVJdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJaWYgKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQpIHsKLQkJCQkJYXBwbGljYWJsZUl0ZW1zLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2FibGVJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgdmFsaWQgdG8gc3VwcHJlc3MvcmV2ZWFsIHVwb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChPYmplY3QgZWxlbWVudCkgewotCQkvLyBkb24ndCBzaG93IHN1cHByZXNzL3JldmVhbCBmb3Igcm9sZWRlc2NyaXB0b3IgdW5kZXIgdGVhbSwgd29yawotCQkvLyBwcm9kdWN0IGRlc2NyaXB0b3IgdW5kZXIgZGVsaXZlcmFibGUgd29yayBwcm9kdWN0LAotCQkvLyBhbmQgcm9sbGVkLXVwIGl0ZW0KLQkJLy8KLQkJQnJlYWtkb3duRWxlbWVudCBvYmogPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJaWYgKHdyYXBwZXIuaXNSb2xsdXBDaGlsZCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJb2JqID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQkJb2JqID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCXx8IG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJaWYgKG9iai5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsCi0JCQkJCXx8IG9iai5nZXRTdXBlckFjdGl2aXRpZXMoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBzZWxlY3Rpb24gaGFzIGFueSBpdGVtIHRoYXQgY2FuIGJlCi0JICogc3VwcHJlc3NlZC9yZXZlYWxlZCAoZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5zdXBwcmVzc2VkPC9jb2RlPgotCSAqIHBhcmFtZXRlcikKLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkRvKENvbGxlY3Rpb24gc2VsZWN0aW9uLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1ZhbGlkKGVsZW1lbnQpKSB7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCQlpZiAod3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikgIT0gc3VwcHJlc3NlZCkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmICgoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLmdldFN1cHByZXNzZWQoKQotCQkJCQkJCS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQSBicmVha2Rvd24gZWxlbWVudCBpcyBzdXBwcmVzc2VkIGlmIGl0c2VsZiBvciBhbnkgb2YgaXRzIHBhcmVudCBhY3Rpdml0eQotCSAqIGlzIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gX19pc1N1cHByZXNzZWQoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKGUsIHRydWUsIG51bGwpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RpcmVjdGx5U3VwcHJlc3NlZChNZXRob2RFbGVtZW50IGUpIHsKLQkJQm9vbGVhbiBiID0gZS5nZXRTdXBwcmVzc2VkKCk7Ci0JCWlmIChiICE9IG51bGwgJiYgYi5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTCi0JCQkJCXx8IHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCQlpZiAodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGlzRGlyZWN0bHlTdXBwcmVzc2VkKHZlCi0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiBicmVha2Rvd24KLQkgKiBlbGVtZW50IGJlY29tZSBzdXBwcmVzc2VkLiBUaGlzIG1ldGhvZCB3aWxsIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZQotCSAqIG9mIHRoZSBwYXJlbnQgdXB0byB0aGUgc3BlY2lmaWVkIDxjb2RlPnRvcDwvY29kZT4gb25seSBpZgotCSAqIDxjb2RlPmNoZWNrUGFyZW50PC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSXQgd2lsbCBub3QgY2hlY2sgdGhlCi0JICogc3VwcHJlc3Npb24gc3RhdGUgb2YgPGNvZGU+dG9wPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlib29sZWFuIGNoZWNrUGFyZW50LCBPYmplY3QgdG9wKSB7Ci0JCWlmIChlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQlpZiAoY2hlY2tQYXJlbnQpIHsKLQkJCWZvciAoQnJlYWtkb3duRWxlbWVudCBiZSA9IGU7IGJlICE9IHRvcAotCQkJCQkmJiBiZS5nZXRTdXBlckFjdGl2aXRpZXMoKSAhPSBudWxsOykgewotCQkJCWJlID0gYmUuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQkJaWYgKGJlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlyZXR1cm4gYmU7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBuZXN0ZWQgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgYW5kIGRlbGl2ZXJhYmxlCi0JCQkvLyBwYXJ0cwotCQkJLy8KLQkJCWlmIChlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwRGVzYyA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlKTsKLQkJCQlXb3JrUHJvZHVjdCB3cCA9IHdwRGVzYy5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCWlmICh3cCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCS8vIGxvb2sgZm9yIHBhcmVudCBhcnRpZmFjdCBkZXNjcmlwdG9yIGluIHRoZSBzYW1lIGFjdGl2aXR5Ci0JCQkJCS8vIGFuZCBjaGVjayB0aGVpciBzdXBwcmVzc2lvbiBzdGF0ZQotCQkJCQkvLwotCQkJCQlBY3Rpdml0eSBhY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCQkJCQlpZiAoYWN0ICE9IG51bGwpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50ICE9IGUKLQkJCQkJCQkJCSYmIGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQkJV29ya1Byb2R1Y3Qgb3RoZXJXcCA9IHdwZC5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQkJCQlpZiAob3RoZXJXcCBpbnN0YW5jZW9mIEFydGlmYWN0Ci0JCQkJCQkJCQkJJiYgVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KHdwLCBvdGhlcldwKQotCQkJCQkJCQkJCSYmIHdwZC5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJCQkJCXJldHVybiB3cGQ7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHdwRGVzYyAhPSB0b3AgJiYgd3BEZXNjLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyh3cERlc2MpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPT0gMSkgewotCQkJCQkJLy8gdGhpcyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBpcyBhIGRlbGl2ZXJhYmxlIHBhcnQgb2YKLQkJCQkJCS8vIGEgZGVsaXZlcmFibGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IKLQkJCQkJCS8vIGNoZWNrIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBvZiB0aGUgZGVsaXZlcmFibGUgd29yawotCQkJCQkJLy8gcHJvZHVjdCBkZXNjcmlwdG9yCi0JCQkJCQkvLwotCQkJCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGxpc3QuZ2V0KDApLAotCQkJCQkJCQljaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRlYW0gcHJvZmlsZSBvd24gcm9sZSBkZXNjcmlwdG9yCi0JCQkvLwotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRUZWFtUHJvZmlsZXMoKFJvbGVEZXNjcmlwdG9yKSBlKTsKLQkJCQkJaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLQkJCQkJCVRlYW1Qcm9maWxlIHRlYW0gPSAoVGVhbVByb2ZpbGUpIGxpc3QuZ2V0KDApOwotCQkJCQkJaWYgKHRlYW0gIT0gdG9wICYmIHRlYW0gIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKHRlYW0sIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3Igc3ViIHRlYW0gcHJvZmlsZQotCQkJLy8KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJCWlmIChlLmdldFN1cGVyQWN0aXZpdGllcygpID09IG51bGwpIHsKLQkJCQkJVGVhbVByb2ZpbGUgc3VwZXJUZWFtID0gKChUZWFtUHJvZmlsZSkgZSkuZ2V0U3VwZXJUZWFtKCk7Ci0JCQkJCWlmIChzdXBlclRlYW0gIT0gdG9wICYmIHN1cGVyVGVhbSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZChzdXBlclRlYW0sIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJblN1cHByZXNzZWRMaXN0KAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlpZiAoc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHdyYXBwZXIncyBwYXRoIGlzIGluIHN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocyBzZXQKLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCQlyZXR1cm4gc3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzLmNvbnRhaW5zKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1cHByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBtYWRlIHRoZSBnaXZlbiB3cmFwcGVyIGJlY29tZQotCSAqIHN1cHByZXNzZWQKLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIHdyYXBwZXIgYmVjb21lCi0JICogc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgYm9vbGVhbiBjaGVja0Jhc2UpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgY2hlY2tCYXNlLCB0cnVlLAotCQkJCWF1dG9Jbmhlcml0SW50ZXJtZWRpYXRlU3VwcHJlc3Npb25TdGF0ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3VwcHJlc3NlZCBicmVha2Rvd24gZWxlbWVudCB0aGF0IG1hZGUgdGhlIGdpdmVuIHdyYXBwZXIgYmVjb21lCi0JICogc3VwcHJlc3NlZAotCSAqIAotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQnJlYWtkb3duRWxlbWVudCBnZXRTdXBwcmVzc2VkKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciwgYm9vbGVhbiBjaGVja0Jhc2UsCi0JCQlib29sZWFuIGNoZWNrTG9jYWwsIGJvb2xlYW4gaW5oZXJpdFN1cHByZXNzaW9uU3RhdGUpIHsKLQkJcmV0dXJuIGdldFN1cHByZXNzZWQod3JhcHBlciwgY2hlY2tCYXNlLCBjaGVja0xvY2FsLAotCQkJCWluaGVyaXRTdXBwcmVzc2lvblN0YXRlLCB0cnVlLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEJyZWFrZG93bkVsZW1lbnQgZ2V0U3VwcHJlc3NlZCgKLQkJCUJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIsIGJvb2xlYW4gY2hlY2tCYXNlLAotCQkJYm9vbGVhbiBjaGVja0xvY2FsLCBib29sZWFuIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlLAotCQkJYm9vbGVhbiBjaGVja1BhcmVudCwgT2JqZWN0IHRvcCkgewotCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCWlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCS8vIHRoaXMgaXMgYSB3cmFwcGVyIG9mIGxvY2FsIGVsZW1lbnQKLQkJCS8vCi0JCQlyZXR1cm4gZ2V0U3VwcHJlc3NlZChlLCBjaGVja1BhcmVudCwgdG9wKTsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHRoZSBiYXNlIGJyZWFrZG93biBlbGVtZW50IGlzIHN1cHByZXNzZWQsIGRpcmVjdGx5IG9yCi0JCS8vIGluZGlyZWN0bHksIGluIGl0cyBvd24gcHJvY2VzcwotCQkvLwotCQlpZiAoY2hlY2tCYXNlKSB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IHN1cHByZXNzZWQgPSBnZXRTdXBwcmVzc2VkKGUsIGNoZWNrUGFyZW50LCB0b3ApOwotCQkJaWYgKHN1cHByZXNzZWQgIT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBwcmVzc2VkOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChjaGVja0xvY2FsKSB7Ci0JCQkvLyBjaGVjayBpZiB0aGUgd3JhcHBlciBpcyBzdXBwcmVzc2VkIGluIHRoaXMgcHJvY2VzcwotCQkJLy8KLQkJCWlmIChpc0luU3VwcHJlc3NlZExpc3Qod3JhcHBlcikpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQotCQkJLy8gY2hlY2sgaWYgdGhlIGFueSBsb2NhbCBwYXJlbnQgaXMgc3VwcHJlc3NlZAotCQkJLy8KLQkJCWlmIChjaGVja1BhcmVudCkgewotCQkJCXBhcmVudCA9IHdyYXBwZXIuZ2V0UGFyZW50KHdyYXBwZXIpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICYmIHBhcmVudCAhPSB0b3ApIHsKLQkJCQkJQnJlYWtkb3duRWxlbWVudCBzdXBwcmVzc2VkID0gZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgcGFyZW50LCBjaGVja1BhcmVudCwgdG9wKTsKLQkJCQkJaWYgKHN1cHByZXNzZWQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHN1cHByZXNzZWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBpZiB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgc3VwcHJlc3NlZCBpbiBvbmUgb2YgdGhlIGltbWVkaWF0ZQotCQkvLyBiYXNlIHByb2Nlc3MKLQkJLy8KLQkJaWYgKGluaGVyaXRTdXBwcmVzc2lvblN0YXRlKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSk7Ci0JCQlBY3Rpdml0eSBpbmhlcml0b3IgPSBQcm9jZXNzVXRpbC5nZXRJbmhlcml0b3Iod3JhcHBlcik7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGJhc2UgPSAoQnJlYWtkb3duRWxlbWVudCkgaW5oZXJpdG9yCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJUHJvY2VzcyBpbW1lZGlhdGVCYXNlUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKTsKLQkJCQlpZiAocHJvYyAhPSBpbW1lZGlhdGVCYXNlUHJvYykgewotCQkJCQkvLyBmaW5kIHRoZSBvYmplY3QgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgb2YgdGhlCi0JCQkJCS8vIGltbWVkaWF0ZQotCQkJCQkvLyBiYXNlIHByb2Nlc3MgdGhhdCByZXByZXNlbnRzIHRoZSBzYW1lIGJyZWFrZG93biBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCU9iamVjdCBvYmplY3QgPSBpbmhlcml0b3IuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlBcnJheUxpc3Qgb2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoUHJvY2Vzc1V0aWwKLQkJCQkJCQkuZ2V0UGFyZW50TGlzdChpbmhlcml0b3IsIHdyYXBwZXIpKTsKLQkJCQkJb2JqZWN0cy5hZGQoZSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB3cmFwcGVyCi0JCQkJCQkJCS5nZXRBZGFwdGVyRmFjdG9yeSgpLmFkYXB0KG9iamVjdCwKLQkJCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJZmluZF9jaGlsZDogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkYXB0ZXIKLQkJCQkJCQkJLmdldENoaWxkcmVuKG9iamVjdCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgY2hpbGQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQgPT0gVG5nVXRpbC51bndyYXAoY2hpbGQpKSB7Ci0JCQkJCQkJCW9iamVjdCA9IGNoaWxkOwotCQkJCQkJCQlicmVhayBmaW5kX2NoaWxkOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uID0gZ2V0U3VwcHJlc3Npb24oaW1tZWRpYXRlQmFzZVByb2MpOwotCQkJCQkJQnJlYWtkb3duRWxlbWVudCBlbGVtZW50ID0gc3VwcHJlc3Npb24uZ2V0U3VwcHJlc3NlZCgKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBvYmplY3QsCi0JCQkJCQkJCWZhbHNlLCB0cnVlLCBpbmhlcml0U3VwcHJlc3Npb25TdGF0ZSwKLQkJCQkJCQkJY2hlY2tQYXJlbnQsIFRuZ1V0aWwudW53cmFwKG9iamVjdCkpOwotCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBlbGVtZW50OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGFueSBpbmhlcml0ZWQgcGFyZW50IGlzIHN1cHByZXNzZWQKLQkJLy8KLQkJaWYgKGNoZWNrUGFyZW50KSB7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlwYXJlbnQgPSB3cmFwcGVyLmdldFBhcmVudCh3cmFwcGVyKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcgotCQkJCQkmJiBUbmdVdGlsLnVud3JhcChwYXJlbnQpICE9IHRvcCkgewotCQkJCXJldHVybiBnZXRTdXBwcmVzc2VkKAotCQkJCQkJKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBwYXJlbnQsCi0JCQkJCQljaGVja0Jhc2UsIHRydWUsIGluaGVyaXRTdXBwcmVzc2lvblN0YXRlLCBjaGVja1BhcmVudCwKLQkJCQkJCXRvcCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjYWNoZWQgc3VwcHJlc3Npb24gZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlmIG9uZSBleGlzdHMgb3IKLQkgKiBjcmVhdGVzIG5ldyBvbmUKLQkgKiAKLQkgKiBAcGFyYW0gaW1tZWRpYXRlQmFzZVByb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdXBwcmVzc2lvbiBnZXRTdXBwcmVzc2lvbihQcm9jZXNzIHByb2MpIHsKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSAoU3VwcHJlc3Npb24pIHByb2NUb1N1cHByZXNzaW9uTWFwLmdldChwcm9jKTsKLQkJaWYgKHN1cHByZXNzaW9uID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAocHJvY1RvU3VwcHJlc3Npb25NYXApIHsKLQkJCQlzdXBwcmVzc2lvbiA9IChTdXBwcmVzc2lvbikgcHJvY1RvU3VwcHJlc3Npb25NYXAuZ2V0KHByb2MpOwotCQkJCWlmIChzdXBwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQkJCXN1cHByZXNzaW9uID0gbmV3IFN1cHByZXNzaW9uKHByb2MpOwotCQkJCQlwcm9jVG9TdXBwcmVzc2lvbk1hcC5wdXQocHJvYywgc3VwcHJlc3Npb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcHJlc3Npb247Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdXBwcmVzc2lvbihTdXBwcmVzc2lvbiBzdXApIHsKLQkJcHJvY1RvU3VwcHJlc3Npb25NYXAucHV0KHN1cC5nZXRQcm9jZXNzKCksIHN1cCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCXJldHVybiBnZXRTdXBwcmVzc2VkKHdyYXBwZXIpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZVRvTW9kZWwoKSB7Ci0JCWlmIChzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIHBhdGhzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGlzVmFsaWQocGF0aCkpIHsKLQkJCQlwYXRocy5hcHBlbmQocGF0aCkuYXBwZW5kKCcgJyk7Ci0JCQl9Ci0JCX0KLQotCQlDb25zdHJhaW50IHJ1bGUgPSBDb25zdHJhaW50TWFuYWdlci5nZXRDb25zdHJhaW50KHByb2Nlc3MsCi0JCQkJQ29uc3RyYWludE1hbmFnZXIuUFJPQ0VTU19TVVBQUkVTU0lPTiwgdHJ1ZSk7Ci0JCS8vIGlmKHByb2Nlc3MuZ2V0T3duZWRSdWxlcygpLmlzRW1wdHkoKSkgewotCQkvLyBydWxlID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpOwotCQkvLyBwcm9jZXNzLmdldE93bmVkUnVsZXMoKS5hZGQocnVsZSk7Ci0JCS8vIH0KLQkJLy8gZWxzZSB7Ci0JCS8vIHJ1bGUgPSAoQ29uc3RyYWludCkgcHJvY2Vzcy5nZXRPd25lZFJ1bGVzKCkuZ2V0KDApOwotCQkvLyB9Ci0JCS8vCQkKLQkJcnVsZS5zZXRCb2R5KHBhdGhzLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyB2YWxpZCBpbiBwcm9jZXNzCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHBhdGgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkocGF0aCk7Ci0JCVN0cmluZyB0eXBlID0gdXJpLnNjaGVtZSgpOwotCQlDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkJaWYgKFdCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKFRCUy5lcXVhbHModHlwZSkpIHsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXRPQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQl9IGVsc2UgaWYgKFdQQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIGlmIChDQlMuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHVzZSBwcm9jZXNzJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIHZhbGlkYXRlCi0JCS8vCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IG51bGw7Ci0JCUlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJSUZpbHRlciBmaWx0ZXIgPSBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciBpbnN0YW5jZW9mIElDb25maWd1cmF0b3IpIHsKLQkJCWNvbmZpZ3VyYXRvciA9IChJQ29uZmlndXJhdG9yKSBhZGFwdGVyRmFjdG9yeS5nZXRGaWx0ZXIoKTsKLQkJCWN1cnJlbnRDb25maWcgPSBjb25maWd1cmF0b3IuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY29uZmlndXJhdG9yLnNldE1ldGhvZENvbmZpZ3VyYXRpb24ocHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpKTsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGd1aWQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCQlpZiAoIXByb2Nlc3MuZ2V0R3VpZCgpLmVxdWFscyhndWlkKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCU9iamVjdCBvYmplY3QgPSBwcm9jZXNzOwotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQob2JqZWN0LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmkuc2VnbWVudENvdW50KCk7IGkrKykgewotCQkJCWd1aWQgPSB1cmkuc2VnbWVudChpKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gYWRhcHRlci5nZXRDaGlsZHJlbihvYmplY3QpLml0ZXJhdG9yKCk7Ci0JCQkJYWRhcHRlciA9IG51bGw7Ci0JCQkJZmluZF9hZGFwdGVyOiB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCW9iamVjdCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCWlmIChndWlkLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0R3VpZCgpKSkgewotCQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJCQkJCQlhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgY2hpbGQ7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCQkJCQkJLmFkYXB0KGNoaWxkLAotCQkJCQkJCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWsgZmluZF9hZGFwdGVyOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbXVzdCBiZSBhbiBJdGVtUHJvdmlkZXJBZGFwdGVyCi0JCQkJCQkvLwotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBpdGVtUHJvdmlkZXIgPSAoSXRlbVByb3ZpZGVyQWRhcHRlcikgb2JqZWN0OwotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZW1Qcm92aWRlcgotCQkJCQkJCQkuZ2V0VGFyZ2V0KCk7Ci0JCQkJCQlpZiAoZ3VpZC5lcXVhbHMoZS5nZXRHdWlkKCkpKSB7Ci0JCQkJCQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGl0ZW1Qcm92aWRlcjsKLQkJCQkJCQlicmVhayBmaW5kX2FkYXB0ZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIGNvbmZpZ3VyYXRpb24KLQkJCS8vCi0JCQlpZiAoY29uZmlndXJhdG9yICE9IG51bGwpIHsKLQkJCQljb25maWd1cmF0b3Iuc2V0TWV0aG9kQ29uZmlndXJhdGlvbihjdXJyZW50Q29uZmlnKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgYm9vbGVhbiByZXZlYWwoTGlzdCBzZWxlY3Rpb24sIENvbGxlY3Rpb24gcmV2ZWFsZWREZXNjcmlwdG9ycykgewotCS8vIGJvb2xlYW4gcmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQgPSBmYWxzZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkvLyBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9Ci0JLy8gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCS8vIE1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkvLyBpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7IC8vIHdyYXBwZXIgb2YgbG9jYWwgZWxlbWVudAotCS8vIGUuc2V0U3VwcHJlc3NlZChCb29sZWFuLkZBTFNFKTsKLQkvLyBpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHJldmVhbGVkRGVzY3JpcHRvcnMuYWRkKGUpOwotCS8vIH0KLQkvLyB9IGVsc2UgeyAvLyB3YXMgc3VwcHJlc3NlZCBieSB0aGlzIHByb2Nlc3MKLQkvLwotCS8vIC8vIHJlbW92ZSB0aGUgcGF0aCBvZiBzdXBwcmVzc2VkIGVsZW1lbnQgZnJvbSB0aGUgbGlzdAotCS8vIC8vCi0JLy8gU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCS8vIGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLnJlbW92ZShwYXRoKTsKLQkvLyByZWFkT25seUVsZW1lbnRBZmZlY3RlZCA9IHRydWU7Ci0JLy8gfQotCS8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkvLyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldFN1cHByZXNzZWQoQm9vbGVhbi5GQUxTRSk7Ci0JLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkvLyByZXZlYWxlZERlc2NyaXB0b3JzLmFkZChlbGVtZW50KTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBtb2RpZmllZCA9IHRydWU7Ci0JLy8gcmV0dXJuIHJlYWRPbmx5RWxlbWVudEFmZmVjdGVkOwotCS8vIH0KLQotCS8vIC8qKgotCS8vICogQHBhcmFtIHNlbGVjdGlvbgotCS8vICogQHJldHVybiB0cnVlIGlmIHRoaXMgY2FsbCByZXZlYWxlZCBhbnkgcmVhZC1vbmx5IGVsZW1lbnQKLQkvLyAqLwotCS8vIHB1YmxpYyBib29sZWFuIHJldmVhbChMaXN0IHNlbGVjdGlvbikgewotCS8vIEFycmF5TGlzdCByZXZlYWxlZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGJvb2xlYW4gcmV0ID0gcmV2ZWFsKHNlbGVjdGlvbiwgcmV2ZWFsZWREZXNjcmlwdG9ycyk7Ci0JLy8gTGlzdCBkZXNjcmlwdG9yc1RvUmV2ZWFsID0gZ2V0T3duUmVsYXRlZEVsZW1lbnRzKHJldmVhbGVkRGVzY3JpcHRvcnMsCi0JLy8gZmFsc2UpOwotCS8vIGlmKGRlc2NyaXB0b3JzVG9SZXZlYWwgIT0gbnVsbCkgewotCS8vIGJvb2xlYW4gcmV0MiA9IHJldmVhbChkZXNjcmlwdG9yc1RvUmV2ZWFsLCByZXZlYWxlZERlc2NyaXB0b3JzKTsKLQkvLyByZXR1cm4gcmV0IHx8IHJldDI7Ci0JLy8gfQotCS8vIHJldHVybiByZXQ7Ci0JLy8gfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgbmVlZCB0byB1c2Uge0BsaW5rIFN1cHByZXNzaW9uQ29tbWFuZH0gaW5zdGVhZAotCSAqLwotCXB1YmxpYyB2b2lkIHJldmVhbChMaXN0IHNlbGVjdGlvbikgewotCQlkb1NldFN1cHByZXNzZWQoc2VsZWN0aW9uLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFZpZXdUeXBlKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQkvLyBubyBuZWVkIHRvIHN0b3JlIHNlcGFyYXRlIHBhdGggZm9yIENCUywgcmV1c2UgV0JTL1RCUy9XUEJTIHBhdGhzCi0JCS8vCQkKLQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcCh3cmFwcGVyKTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIFdCUzsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUgfHwgZSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlyZXR1cm4gVEJTOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBXUEJTOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcm9jZXNzIEdVSUQgaW4gdGhlIGdpdmVuIEdVSUQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBndWlkUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAc2VlICNnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2Nlc3NHVUlEKFN0cmluZyBndWlkUGF0aCkgewotCQlpbnQgaWQgPSBndWlkUGF0aC5pbmRleE9mKCI6Ly8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWQgIT0gLTEpIHsKLQkJCWludCBiZWdpbkluZGV4ID0gaWQgKyAzOwotCQkJaWYgKGJlZ2luSW5kZXggPCBndWlkUGF0aC5sZW5ndGgoKSkgewotCQkJCWludCBlbmRJbmRleCA9IGd1aWRQYXRoLmluZGV4T2YoJy8nLCBiZWdpbkluZGV4KTsKLQkJCQlpZiAoZW5kSW5kZXggIT0gLTEpIHsKLQkJCQkJcmV0dXJuIGd1aWRQYXRoLnN1YnN0cmluZyhiZWdpbkluZGV4LCBlbmRJbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB3cmFwcGVyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IGdldFBhdGhXaXRob3V0Vmlld1R5cGUod3JhcHBlcik7Ci0JCVN0cmluZyB2aWV3VHlwZSA9IGdldFZpZXdUeXBlKHdyYXBwZXIpOwotCQlwYXRoLmluc2VydCgwLCAiOi8iKS5pbnNlcnQoMCwgdmlld1R5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGdldFBhdGhXaXRob3V0Vmlld1R5cGUoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsgCi0JCUxpc3QgcGFyZW50TGlzdCA9IFByb2Nlc3NVdGlsLmdldFBhcmVudExpc3QobnVsbCwgd3JhcHBlcik7Ci0JCWlmICghcGFyZW50TGlzdC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCS8vIGV4Y2x1ZGUgVGFza0Rlc2NyaXB0b3IgYW5kIFJvbGVEZXNjcmlwdG9yIGZyb20gdGhlIHBhcmVudAotCQkJCS8vIHBhdGggYi9jIHRob3NlIGRlc2NyaXB0b3JzIGNhbiBiZQotCQkJCS8vIHBhcmVudCBvbmx5IGluIENCUyB2aWV3Ci0JCQkJaWYgKCEoZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yIHx8IGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJcGF0aC5hcHBlbmQoJy8nKS5hcHBlbmQoZS5nZXRHdWlkKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgVG5nVXRpbC51bndyYXAod3JhcHBlcik7Ci0JCXBhdGguYXBwZW5kKCcvJykuYXBwZW5kKGUuZ2V0R3VpZCgpKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0T3duUmVsYXRlZEVsZW1lbnRzKENvbGxlY3Rpb24gY2hhbmdlZERlc2NyaXB0b3JzLAotCQkJYm9vbGVhbiBzdXBwcmVzc2VkKSB7Ci0JCWlmICghY2hhbmdlZERlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJQXJyYXlMaXN0IGRlc2NyaXB0b3JzVG9DaGFuZ2UgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGNoYW5nZWREZXNjcmlwdG9ycykuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3RbXSByZWxhdGlvbnNoaXBzID0gbnVsbDsKLQkJCQlpZiAoZGVzYyBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQkJCXJlbGF0aW9uc2hpcHMgPSBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuVEFTS19ERVNDUklQVE9SX19SRUxBVElPTlNISVBTOwotCQkJCX0gZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJCXJlbGF0aW9uc2hpcHMgPSBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQuUk9MRV9ERVNDUklQVE9SX19SRUxBVElPTlNISVBTOwotCQkJCX0gZWxzZSBpZiAoZGVzYyBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJCQlyZWxhdGlvbnNoaXBzID0gUmVtb3ZlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRUxBVElPTlNISVBTOwotCQkJCX0KLQkJCQlpZiAocmVsYXRpb25zaGlwcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRpb25zaGlwcy5sZW5ndGg7IGkrKykgewotCQkJCQkJT2JqZWN0IGZlYXR1cmUgPSByZWxhdGlvbnNoaXBzW2ldOwotCQkJCQkJYm9vbGVhbiBpc01hbnk7Ci0JCQkJCQlPYmplY3QgdmFsdWU7Ci0JCQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZSkgewotCQkJCQkJCU9wcG9zaXRlRmVhdHVyZSBmID0gKE9wcG9zaXRlRmVhdHVyZSkgZmVhdHVyZTsKLQkJCQkJCQlpc01hbnkgPSBmLmlzTWFueSgpOwotCQkJCQkJCXZhbHVlID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZGVzYykKLQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShmKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlOwotCQkJCQkJCWlzTWFueSA9IGYuaXNNYW55KCk7Ci0JCQkJCQkJdmFsdWUgPSBkZXNjLmVHZXQoZik7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoaXNNYW55KSB7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgdmFsdWUpCi0JCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQlEZXNjcmlwdG9yIHJlZiA9IChEZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCWlmIChyZWYuZ2V0U3VwcHJlc3NlZCgpLmJvb2xlYW5WYWx1ZSgpICE9IHN1cHByZXNzZWQKLQkJCQkJCQkJCQkmJiAhUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJCS5jaGVja0Rlc2NyaXB0b3JSZWZlcmVuY2VzKAotCQkJCQkJCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMsIHJlZikpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9DaGFuZ2UuYWRkKHJlZik7Ci0JCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMuYWRkKHJlZik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCURlc2NyaXB0b3IgcmVmID0gKERlc2NyaXB0b3IpIHZhbHVlOwotCQkJCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAocmVmLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkCi0JCQkJCQkJCQkJJiYgIVByb2Nlc3NVdGlsLmNoZWNrRGVzY3JpcHRvclJlZmVyZW5jZXMoCi0JCQkJCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMsIHJlZikpIHsKLQkJCQkJCQkJCWRlc2NyaXB0b3JzVG9DaGFuZ2UuYWRkKHJlZik7Ci0JCQkJCQkJCQljaGFuZ2VkRGVzY3JpcHRvcnMuYWRkKHJlZik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGVzY3JpcHRvcnNUb0NoYW5nZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzc2VzIG9yIHJldmVhbHMgdGhlIGdpdmVuIHNlbGVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqIEByZXR1cm4ge0BsaW5rIFJlc3VsdH0gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwKLQkgKi8KLQlwcml2YXRlIFJlc3VsdCBzZXRTdXBwcmVzc2VkKExpc3Qgc2VsZWN0aW9uLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJUmVzdWx0IHJlc3VsdCA9IGRvU2V0U3VwcHJlc3NlZChzZWxlY3Rpb24sIHN1cHByZXNzZWQpOwotCi0JCS8vIGlmIGRlc2NyaXB0b3JzIGhhZCBiZWVuIHN1cHByZXNzZWQsIHJlbGF0ZWQgZWxlbWVudHMgdGhhdCBhcmUgbm90Ci0JCS8vIHVzZWQgYW55d2hlcmUgZWxzZSBhbHNvIG5lZWQgdG8gYmUgc3VwcHJlc3NlZCAoanVzdCBsaWtlIGRlbGV0ZSkKLQkJLy8JCi0JCWlmICghcmVzdWx0LmRlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJTGlzdCBkZXNjcmlwdG9yc1RvU3VwcHJlc3MgPSBnZXRPd25SZWxhdGVkRWxlbWVudHMoCi0JCQkJCXJlc3VsdC5kZXNjcmlwdG9ycywgc3VwcHJlc3NlZCk7Ci0JCQlpZiAoZGVzY3JpcHRvcnNUb1N1cHByZXNzICE9IG51bGwpIHsKLQkJCQlSZXN1bHQgcmVzdWx0MiA9IGRvU2V0U3VwcHJlc3NlZChkZXNjcmlwdG9yc1RvU3VwcHJlc3MsCi0JCQkJCQlzdXBwcmVzc2VkKTsKLQotCQkJCS8vIG1lcmdlIHJlc3VsdHMKLQkJCQkvLwotCQkJCXJlc3VsdC5lbGVtZW50cy5hZGRBbGwocmVzdWx0Mi5lbGVtZW50cyk7Ci0JCQkJcmVzdWx0LmRlc2NyaXB0b3JzLmFkZEFsbChyZXN1bHQyLmRlc2NyaXB0b3JzKTsKLQkJCQlyZXN1bHQucGF0aHMuYWRkQWxsKHJlc3VsdDIucGF0aHMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBuZWVkIHRvIHVzZSB7QGxpbmsgU3VwcHJlc3Npb25Db21tYW5kfSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHZvaWQgc3VwcHJlc3MoTGlzdCBzZWxlY3Rpb24pIHsKLQkJZG9TZXRTdXBwcmVzc2VkKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JfQotCi0JLy8gcHVibGljIGJvb2xlYW4gc3VwcHJlc3MoTGlzdCBzZWxlY3Rpb24pIHsKLQkvLyBBcnJheUxpc3Qgc3VwcHJlc3NlZERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGJvb2xlYW4gcmV0ID0gc3VwcHJlc3Moc2VsZWN0aW9uLCBzdXBwcmVzc2VkRGVzY3JpcHRvcnMpOwotCS8vCQkKLQkvLyAvLyBpZiBkZXNjcmlwdG9ycyBoYWQgYmVlbiBzdXBwcmVzc2VkLCByZWxhdGVkIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB1c2VkCi0JLy8gYW55d2hlcmUgZWxzZSBhbHNvIG5lZWQgdG8gYmUgc3VwcHJlc3NlZCAoanVzdCBsaWtlIGRlbGV0ZSkKLQkvLyAvLwotCS8vIExpc3QgZGVzY3JpcHRvcnNUb1N1cHByZXNzID0gZ2V0T3duUmVsYXRlZEVsZW1lbnRzKHN1cHByZXNzZWREZXNjcmlwdG9ycywKLQkvLyB0cnVlKTsKLQkvLyBpZihkZXNjcmlwdG9yc1RvU3VwcHJlc3MgIT0gbnVsbCkgewotCS8vIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JLy8gYm9vbGVhbiByZXQyID0gc3VwcHJlc3MoZGVzY3JpcHRvcnNUb1N1cHByZXNzLCBvdXQpOwotCS8vIGlmKG91dC5zaXplKCkgIT0gZGVzY3JpcHRvcnNUb1N1cHByZXNzLnNpemUoKSkgewotCS8vIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigiU3VwcHJlc3Npb24uc3VwcHJlc3MoTGlzdCkKLQkvLyBpcyBidWdneS4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIH0KLQkvLyByZXR1cm4gcmV0IHx8IHJldDI7Ci0JLy8gfQotCS8vIHJldHVybiByZXQ7Ci0JLy8gfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzdWx0IHsKLQkJLyoqIEVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHN1cHByZXNzZWQgb3IgcmV2ZWFsZWQgKi8KLQkJQ29sbGVjdGlvbiBlbGVtZW50czsKLQotCQkvKiogRGVzY3JpcHRvcnMgdGhhdCBoYXZlIGJlZW4gc3VwcHJlc3NlZCBvciByZXZlYWxlZCAqLwotCQlDb2xsZWN0aW9uIGRlc2NyaXB0b3JzOwotCi0JCS8qKgotCQkgKiBQYXRocyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byBvciByZW1vdmVkIGZyb20KLQkJICogPGNvZGU+c3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzPC9jb2RlPgotCQkgKi8KLQkJQ29sbGVjdGlvbiBwYXRoczsKLQotCQlSZXN1bHQoKSB7Ci0JCQllbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gZWxlbWVudHMuaXNFbXB0eSgpICYmIHBhdGhzLmlzRW1wdHkoKTsKLQkJfQotCi0JCXZvaWQgY2xlYXIoKSB7Ci0JCQllbGVtZW50cy5jbGVhcigpOwotCQkJZGVzY3JpcHRvcnMuY2xlYXIoKTsKLQkJCXBhdGhzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzc2VzIG9yIHJldmVhbHMgdGhlIGdpdmVuIHNlbGVjdGlvbiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mCi0JICogPGNvZGU+c3VwcHJlc3NlZDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICogQHBhcmFtIHN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBSZXN1bHQgZG9TZXRTdXBwcmVzc2VkKExpc3Qgc2VsZWN0aW9uLCBib29sZWFuIHN1cHByZXNzZWQpIHsKLQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50OwotCQkJCS8vIGlmICghaXNTdXBwcmVzc2VkKHdyYXBwZXIpKSB7Ci0JCQkJQnJlYWtkb3duRWxlbWVudCBlID0gKEJyZWFrZG93bkVsZW1lbnQpIFRuZ1V0aWwudW53cmFwKHdyYXBwZXIpOwotCQkJCWlmICghd3JhcHBlci5pc1JlYWRPbmx5KCkpIHsKLQkJCQkJLy8gd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCWlmIChlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSAhPSBzdXBwcmVzc2VkKSB7Ci0JCQkJCQllLnNldFN1cHByZXNzZWQoQm9vbGVhbi52YWx1ZU9mKHN1cHByZXNzZWQpKTsKLQkJCQkJCXJlc3VsdC5lbGVtZW50cy5hZGQoZSk7Ci0JCQkJCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMuYWRkKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gYWRkIHRoZSBwYXRocyBvZiBzdXBwcmVzc2VkIGVsZW1lbnQgdG8gdGhlIG1hcAotCQkJCQkvLwotCQkJCQlTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JCQkJCWJvb2xlYW4gYjsKLQkJCQkJaWYgKHN1cHByZXNzZWQpIHsKLQkJCQkJCWIgPSBnZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKS5hZGQocGF0aCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQliID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkucmVtb3ZlKHBhdGgpOwotCQkJCQl9Ci0JCQkJCWlmIChiKSB7Ci0JCQkJCQlyZXN1bHQucGF0aHMuYWRkKHBhdGgpOwotCQkJCQl9Ci0JCQkJCS8vIH0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLQkJCQlpZiAoZS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkgIT0gc3VwcHJlc3NlZCkgewotCQkJCQllLnNldFN1cHByZXNzZWQoQm9vbGVhbi52YWx1ZU9mKHN1cHByZXNzZWQpKTsKLQkJCQkJcmVzdWx0LmVsZW1lbnRzLmFkZChlKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQlyZXN1bHQuZGVzY3JpcHRvcnMuYWRkKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1vZGlmaWVkID0gIXJlc3VsdC5pc0VtcHR5KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzKExpc3Qgc2VsZWN0aW9uLCBDb2xsZWN0aW9uCi0JLy8gc3VwcHJlc3NlZERlc2NyaXB0b3JzKSB7Ci0JLy8gYm9vbGVhbiByZWFkT25seUVsZW1lbnRTdXBwcmVzc2VkID0gZmFsc2U7Ci0JLy8gZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCS8vIE9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCS8vIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIgPQotCS8vIChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgZWxlbWVudDsKLQkvLyBpZiAoIWlzU3VwcHJlc3NlZCh3cmFwcGVyKSkgewotCS8vIEJyZWFrZG93bkVsZW1lbnQgZSA9IChCcmVha2Rvd25FbGVtZW50KSBUbmdVdGlsCi0JLy8gLnVud3JhcCh3cmFwcGVyKTsKLQkvLyBpZiAoIXdyYXBwZXIuaXNSZWFkT25seSgpKSB7Ci0JLy8gLy8gd3JhcHBlciBvZiBsb2NhbCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBlLnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkvLyBpZihlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHN1cHByZXNzZWREZXNjcmlwdG9ycy5hZGQoZSk7Ci0JLy8gfQotCS8vIH0gZWxzZSB7Ci0JLy8gLy8gYWRkIHRoZSBwYXRocyBvZiBzdXBwcmVzc2VkIGVsZW1lbnQgdG8gdGhlIG1hcAotCS8vIC8vCi0JLy8gU3RyaW5nIHBhdGggPSBnZXRQYXRoKHdyYXBwZXIpOwotCS8vIGdldFN1cHByZXNzZWRFeHRlcm5hbEVsZW1lbnRQYXRocygpLmFkZChwYXRoKTsKLQkvLyByZWFkT25seUVsZW1lbnRTdXBwcmVzc2VkID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkvLyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldFN1cHByZXNzZWQoQm9vbGVhbi5UUlVFKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotCS8vIHN1cHByZXNzZWREZXNjcmlwdG9ycy5hZGQoZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gbW9kaWZpZWQgPSB0cnVlOwotCS8vIHJldHVybiByZWFkT25seUVsZW1lbnRTdXBwcmVzc2VkOwotCS8vIH0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVW5zdXBwcmVzc2VkKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQkJaWYgKCFpc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSBlbGVtZW50KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJaWYgKCFpc1N1cHByZXNzZWQoKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlSXNEb25lKCkgewotCQltb2RpZmllZCA9IGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBfX2lzU3VwcHJlc3NlZChDb21wb3NlZEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIGNvbXBvc2VkV3JhcHBlcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb21wb3NlZFdyYXBwZXIuZ2V0VmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoIWlzU3VwcHJlc3NlZChlbGVtZW50KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCwgb3IgdGhlIGl0ZW0gcHJvdmlkZXIgb3IgYWRhcHRvciBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZWxlbWVudCBpcyBzdXBwcmVzc2VkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IG9yIGFuIGFzc29jaWF0ZWQgd3JhcHBlciwgYWRhcHRvciwgb3IgaXRlbQotCSAqICAgICAgICAgICAgcHJvdmlkZXIsIGV0Yy4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHByZXNzZWQoT2JqZWN0IGUpIHsKLQkJLy8gbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCXRyeSB7Ci0KLQkJCWlmIChlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJQ29tcG9zZWRCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBjb21wb3NlZFdyYXBwZXIgPSBQcm9jZXNzVXRpbC5nZXRDb21wb3NlZFdyYXBwZXIoZSk7Ci0JCQlpZihjb21wb3NlZFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZChjb21wb3NlZFdyYXBwZXIpOwotCQkJfQotCi0JCQlpZiAoaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5jb250YWlucyhlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBfX2lzU3VwcHJlc3NlZCgoQnJlYWtkb3duRWxlbWVudCkgZSk7Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdCB0YXJnZXRPYmogPSBudWxsOwotCQkJCWlmIChlIGluc3RhbmNlb2YgV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJCQl0YXJnZXRPYmogPSAoKFdyYXBwZXJJdGVtUHJvdmlkZXIpIGUpLmdldFZhbHVlKCk7Ci0JCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJCQl0YXJnZXRPYmogPSAoKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIGUpLmdldFRhcmdldCgpOwotCQkJCX0KLQotCQkJCWlmICh0YXJnZXRPYmogIT0gbnVsbCAmJiB0YXJnZXRPYmogIT0gZSkgewotCQkJCQlyZXR1cm4gaXNTdXBwcmVzc2VkKHRhcmdldE9iaik7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGxvbmcgdGltZSA9IChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKLQkJCS8vIGlmKHRpbWUgPiAxMDAwKSB7Ci0JCQkvLyBCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpVG5nVXRpbC51bndyYXAoZSk7Ci0JCQkvLyBTdHJpbmcgbXNnID0gIlN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZCgpOiB0aW1lIHRha2VuIChtcykgIiArCi0JCQkvLyB0aW1lICsKLQkJCS8vICJcbiBwcm9jZXNzOiAiICsgKGUgaW5zdGFuY2VvZgotCQkJLy8gQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgPwotCQkJLy8gKChCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcillKS5nZXRUb3BJdGVtKCkgOgotCQkJLy8gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKGJlKSkgKwotCQkJLy8gIlxuIGVsZW1lbnQ6ICIgKyBQcm9jZXNzVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGJlKTsKLQkJCS8vCQkJCQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkvLyBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtc2cpOwotCQkJLy8gfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3VwcHJlc3Npb24gc3RhdGUgb2YgdGhlIGdpdmVuIDxjb2RlPndyYXBwZXI8L2NvZGU+IGZyb20KLQkgKiBpdHMgYmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjYWxsIG1vZGlmaWVkIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZQotCSAqICAgICAgICAgb2YgdGhlIGdpdmVuIHdyYXBwZXIsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTdXBwcmVzc2lvbkZyb21CYXNlKAotCQkJQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikgewotCQlTdHJpbmcgcGF0aCA9IGdldFBhdGgod3JhcHBlcik7Ci0JCWJvb2xlYW4gcmV0OwotCQlCcmVha2Rvd25FbGVtZW50IGUgPSBnZXRTdXBwcmVzc2VkKHdyYXBwZXIsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwKLQkJCQludWxsKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJcmV0ID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkuYWRkKHBhdGgpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkucmVtb3ZlKHBhdGgpOwotCQl9Ci0JCWlmIChyZXQpIHsKLQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEV4Y2x1ZGVzIHRoZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBzYW1lIGxpbmtlZCBlbGVtZW50IGZyb20gdGhlIGNoZWNrCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvblRvUmV2ZWFsCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2hlY2tEdXBsaWNhdGVOYW1lQWZ0ZXJSZXZlYWwoCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGlvblRvUmV2ZWFsT3JTdXBwcmVzcywKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUNvbGxlY3Rpb24gZWxlbWVudHNUb1JldmVhbCA9IGdldEFwcGxpY2FibGVJdGVtcygKLQkJCQlzZWxlY3Rpb25Ub1JldmVhbE9yU3VwcHJlc3MsIGZhbHNlKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHNUb1JldmVhbC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJU3RyaW5nIG1zZyA9IFByb2Nlc3NVdGlsLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQkJCQlhZGFwdGVyRmFjdG9yeSwgYmUsIGJlLmdldE5hbWUoKSwgdGhpcyk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5TdXBwcmVzc2lvbl9uYW1lRHVwbGljYXRpb247IAotCQkJCX0KLQkJCQltc2cgPSBQcm9jZXNzVXRpbC5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLCBiZS5nZXRQcmVzZW50YXRpb25OYW1lKCksIHRoaXMpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uOyAKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCU9iamVjdCB1bndyYXBwZWQgPSBUbmdVdGlsLnVud3JhcChlbGVtZW50KTsKLQkJCQlpZiAodW53cmFwcGVkIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCQkJT2JqZWN0IHBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZWxlbWVudCk7Ci0JCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQkJCQlpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJQ29sbGVjdGlvbiBzaWJsaW5ncyA9IGl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJCQkJT2JqZWN0IGxpbmtlZEVsZW1lbnQgPSBudWxsOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJbGlua2VkRWxlbWVudCA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkuZ2V0QXNzb2NpYXRlZEVsZW1lbnQoKERlc2NyaXB0b3IpIGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpbnRlcm5hbFVuc3VwcHJlc3NlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQluYW1lQ2hlY2tMb29wOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2libGluZ3MKLQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCBzaWJsaW5nID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlpZiAoc2libGluZyBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgc2libGluZzsKLQkJCQkJCQkJCS8vIHNraXAgY2hlY2tpbmcgb24gc3VwcHJlc3NlZCBlbGVtZW50Ci0JCQkJCQkJCQkvLwotCQkJCQkJCQkJaWYgKGJlLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJCQkJCWNvbnRpbnVlIG5hbWVDaGVja0xvb3A7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIHNpYmxpbmcgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJCQkJLy8gc2tpcCBjaGVja2luZyBvbiBkZXNjcmlwdG9ycyB3aXRoIHRoZQotCQkJCQkJCQkJCS8vIHNhbWUgbGlua2VkIGVsZW1lbnQKLQkJCQkJCQkJCQkvLwotCQkJCQkJCQkJCU9iamVjdCBvdGhlckxpbmtlZEVsZW1lbnQgPSBQcm9jZXNzVXRpbAotCQkJCQkJCQkJCQkJLmdldEFzc29jaWF0ZWRFbGVtZW50KChEZXNjcmlwdG9yKSBlbGVtZW50KTsKLQkJCQkJCQkJCQlpZiAob3RoZXJMaW5rZWRFbGVtZW50ID09IGxpbmtlZEVsZW1lbnQpIHsKLQkJCQkJCQkJCQkJY29udGludWUgbmFtZUNoZWNrTG9vcDsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlTdHJpbmcgbXNnID0gUHJvY2Vzc1V0aWwKLQkJCQkJCQkJCQkJLmNoZWNrQnJlYWtkb3duRWxlbWVudE5hbWUoCi0JCQkJCQkJCQkJCQkJYWRhcHRlckZhY3RvcnksIGJlLCBiZQotCQkJCQkJCQkJCQkJCQkJLmdldE5hbWUoKSwgdGhpcyk7Ci0JCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fbmFtZUR1cGxpY2F0aW9uOyAKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW1zZyA9IFByb2Nlc3NVdGlsCi0JCQkJCQkJCQkJCS5jaGVja0JyZWFrZG93bkVsZW1lbnRQcmVzZW50YXRpb25OYW1lKAotCQkJCQkJCQkJCQkJCWFkYXB0ZXJGYWN0b3J5LCBiZSwKLQkJCQkJCQkJCQkJCQliZS5nZXRQcmVzZW50YXRpb25OYW1lKCksCi0JCQkJCQkJCQkJCQkJdGhpcyk7Ci0JCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCQlyZXR1cm4gTGlicmFyeUVkaXRSZXNvdXJjZXMuU3VwcHJlc3Npb25fcHJlc2VudGF0aW9uTmFtZUR1cGxpY2F0aW9uOyAKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaW50ZXJuYWxVbnN1cHByZXNzZWRFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRPYmplY3RCeVBhdGgoU3RyaW5nW10gZ3VpZFBhdGgsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoZ3VpZFBhdGgubGVuZ3RoID09IDAgfHwgYWRhcHRlckZhY3RvcnkgPT0gbnVsbAotCQkJCXx8ICFndWlkUGF0aFswXS5lcXVhbHMocHJvY2Vzcy5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU9iamVjdCBvYmplY3QgPSBwcm9jZXNzOwotCQlpbnQgbGVuID0gZ3VpZFBhdGgubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChvYmplY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLQkJCS8vIGlmIGN1cnJlbnQgb2JqZWN0IGlzIGFuIGFjdGl2aXR5LCBtYWtlIHN1cmUgaXQgaXMgcm9sbGVkIGRvd24KLQkJCS8vIGJlZm9yZSBsb29raW5nIGludG8gaXRzIGNoaWxkcmVuCi0JCQkvLwotCQkJSUJTSXRlbVByb3ZpZGVyIHJvbGxlZFVwQWRhcHRlciA9IG51bGw7Ci0JCQlJdGVyYXRvciBpdGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaWYgKFRuZ1V0aWwudW53cmFwKG9iamVjdCkgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIHsKLQkJCQkJCUJTQWN0aXZpdHlJdGVtUHJvdmlkZXIgYWN0aXZpdHlJdGVtUHJvdmlkZXIgPSAoQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCkpIHsKLQkJCQkJCQlhY3Rpdml0eUl0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQlyb2xsZWRVcEFkYXB0ZXIgPSBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIGlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlJQlNJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlcjsKLQkJCQkJCWlmIChpdGVtUHJvdmlkZXIuaXNSb2xsZWRVcCgpKSB7Ci0JCQkJCQkJaXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCQkJCQlyb2xsZWRVcEFkYXB0ZXIgPSBpdGVtUHJvdmlkZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KS5pdGVyYXRvcigpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocm9sbGVkVXBBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJcm9sbGVkVXBBZGFwdGVyLnNldFJvbGxlZFVwKHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJZmluZF9jaGlsZDogd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0IGUgPSBUbmdVdGlsLnVud3JhcChjaGlsZCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkmJiAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldEd1aWQoKS5lcXVhbHMoZ3VpZFBhdGhbaV0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJb2JqZWN0ID0gY2hpbGQ7Ci0JCQkJCWJyZWFrIGZpbmRfY2hpbGQ7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWZvdW5kKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGJyZWFrZG93biBlbGVtZW50IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuCi0JICogPGNvZGU+Z3VpZFBhdGg8L2NvZGU+IGlzIHN1cHByZXNzZWQgaW4gdGhlIHByb2Nlc3Mgb2YgdGhpcyBTdXBwcmVzc2lvbgotCSAqIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSBndWlkUGF0aAotCSAqIEByZXR1cm4KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBjb3VsZCBub3QgYmUgZm91bmQgdXNpbmcKLQkgKiAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKFN0cmluZ1tdIGd1aWRQYXRoLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkKLQkJCXRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqZWN0ID0gZ2V0T2JqZWN0QnlQYXRoKGd1aWRQYXRoLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIkNvdWxkIG5vdCBmaW5kIG9iamVjdCB3aXRoIHBhdGggJyIgKyBndWlkUGF0aCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBpc1N1cHByZXNzZWQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzZXQgb2Ygc3VwcHJlc3NlZCBpdGVtIG9mIHRoZSBnaXZlbiBwcm9jZXNzZXMuCi0JICogCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcmllcwotCSAqICAgICAgICAgICAgdGhlIGFkYXB0ZXIgZmFjdG9yaWVzIGZvciBXQlMsIFRCUywgV1BCUywgYW5kIENCUyB2aWV3cwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRTdXBwcmVzc2VkSXRlbXMoUHJvY2VzcyBwcm9jLAotCQkJQWRhcHRlckZhY3RvcnlbXSBhZGFwdGVyRmFjdG9yaWVzKSB7Ci0JCVNldCBzdXBwcmVzc2VkSXRlbXMgPSBuZXcgSGFzaFNldCgpOwotCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiA9IG5ldyBTdXBwcmVzc2lvbihwcm9jKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGFwdGVyRmFjdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IoCi0JCQkJCWFkYXB0ZXJGYWN0b3JpZXNbaV0sIHByb2MpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgaXRlbSA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoaXRlbSkpIHsKLQkJCQkJc3VwcHJlc3NlZEl0ZW1zLmFkZChpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cHByZXNzZWRJdGVtczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN1cHByZXNzaW9uQ29tbWFuZCBleHRlbmRzIEFic3RyYWN0Q29tbWFuZCBpbXBsZW1lbnRzCi0JCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBtb2RpZmllZFJlc291cmNlczsKLQotCQlwcm90ZWN0ZWQgTGlzdCBjb2xsZWN0aW9uOwotCi0JCXByb3RlY3RlZCBSZXN1bHQgcmVzdWx0OwotCi0JCXByb3RlY3RlZCBib29sZWFuIHN1cHByZXNzZWQ7Ci0KLQkJcHJvdGVjdGVkIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uOwotCi0JCXB1YmxpYyBTdXBwcmVzc2lvbkNvbW1hbmQoU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIExpc3Qgc2VsZWN0aW9uLAotCQkJCWJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQkJdGhpcy5zdXBwcmVzc2lvbiA9IHN1cHByZXNzaW9uOwotCQkJY29sbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCXRoaXMuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQjZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdXBwcmVzc2lvbgotCQkJCQkJLmdldFByb2Nlc3MoKS5lUmVzb3VyY2UoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI2V4ZWN1dGUoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXJlc3VsdCA9IHN1cHByZXNzaW9uLnNldFN1cHByZXNzZWQoY29sbGVjdGlvbiwgc3VwcHJlc3NlZCk7Ci0JCQlkaWRFeGVjdXRlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBkaWRFeGVjdXRlKCkgewotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kI3JlZG8oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVkbygpIHsKLQkJCWV4ZWN1dGUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkFic3RyYWN0Q29tbWFuZCN1bmRvKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQlpZiAoIXJlc3VsdC5lbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzdWx0LmVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkJZS5zZXRTdXBwcmVzc2VkKEJvb2xlYW4udmFsdWVPZighc3VwcHJlc3NlZCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghcmVzdWx0LnBhdGhzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXN1bHQucGF0aHMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPYmplY3QgcGF0aCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJaWYgKHN1cHByZXNzZWQpIHsKLQkJCQkJCQlzdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2VkRXh0ZXJuYWxFbGVtZW50UGF0aHMoKQotCQkJCQkJCQkJLnJlbW92ZShwYXRoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJc3VwcHJlc3Npb24uZ2V0U3VwcHJlc3NlZEV4dGVybmFsRWxlbWVudFBhdGhzKCkKLQkJCQkJCQkJCS5hZGQocGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZGlkVW5kbygpOwotCQkJCXJlc3VsdC5jbGVhcigpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgZGlkVW5kbygpIHsKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI3ByZXBhcmUoKQotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldFJlc3VsdCgpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCQlpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJCX0KLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQWJzdHJhY3RDb21tYW5kI2dldEFmZmVjdGVkT2JqZWN0cygpCi0JCSAqLwotCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZmZlY3RlZE9iamVjdHMoKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHlFbGVtZW50QWZmZWN0ZWQoKSB7Ci0JCQlyZXR1cm4gIXJlc3VsdC5wYXRocy5pc0VtcHR5KCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuIHBoeXNpY2FsIHN0YXRlIG9mIHRoZSBwcm9jZXNzRWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXRzZWxmU3VwcHJlc3NlZChPYmplY3Qgb2JqKXsKLQkJaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpewotCQkJcmV0dXJuICgoUHJvY2Vzc0VsZW1lbnQpb2JqKS5nZXRTdXBwcmVzc2VkKCk7Ci0JCX0KLQkJCi0JCWlmKG9iaiBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyICYmIFByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iaikpewotCQkJcmV0dXJuIGlzSW5TdXBwcmVzc2VkTGlzdCgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqKTsKLQkJfQotCQkKLQkJaWYob2JqIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgJiYgIVByb2Nlc3NVdGlsLmlzSW5oZXJpdGVkKG9iaikpewotCQkJT2JqZWN0IG9iamVjdCA9IFRuZ1V0aWwudW53cmFwKG9iaik7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KW9iamVjdCkuZ2V0U3VwcHJlc3NlZCgpOwotCQl9Ci0JCQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKE9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBpc1N1cHByZXNzZWQob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9UbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvVG5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjZmNjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9UbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbC5Db3BpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5QYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQXR0cmlidXRlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRmVhdHVyZU1hcEVudHJ5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklEZWZhdWx0TmFtZVNldHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JR3JvdXBDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jYXRlZ29yeS5EaXNjaXBsaW5lSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY2F0ZWdvcnkuUm9sZVNldEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNhdGVnb3J5LlN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklSZXNvdXJjZUF3YXJlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmVsZW1lbnQuQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5uYXZpZ2F0b3IuQ29udGVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5hdmlnYXRvci5NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuTW92ZURvd25Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLk1vdmVVcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwudXRpbC5TdHJpbmdSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5VbmlxdWVOYW1lSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLk1lc3NhZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgZm9yIG1ldGhvZCBhdXRob3JpbmcKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUbmdVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgdW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkgPSBuZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExpYnJhcnlFZGl0UGx1Z2luLmdldFBsdWdpbigpCi0JCQkuaXNEZWJ1Z2dpbmcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SID0gInwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1JfU1BMSVRURVIgPSAiXFx8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFfU0VQQVJBVE9SID0gIiwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BX1NFUEFSQVRPUl9TUExJVFRFUiA9ICJcXCwiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DQVRFR09SWV9QUk9QRVJUWSA9ICJQVUJMSVNIX0NBVEVHT1JZIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGFkYXB0ZXJzIHRoYXQgYXJlIGluc3RhbmNlIG9mIHRoZSBnaXZlbiBjbGFzcyBmcm9tIHRoZSBnaXZlbgotCSAqIEVPYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVPYmoKLQkgKiBAcGFyYW0gY2xzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFkYXB0ZXJzKEVPYmplY3QgZU9iaiwgQ2xhc3MgY2xzKSB7Ci0JCWZvciAoSXRlcmF0b3IgYWRhcHRlcnMgPSBlT2JqLmVBZGFwdGVycygpLml0ZXJhdG9yKCk7IGFkYXB0ZXJzCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUFkYXB0ZXIgYWRhcHRlciA9IChBZGFwdGVyKSBhZGFwdGVycy5uZXh0KCk7Ci0JCQlpZiAoY2xzLmlzSW5zdGFuY2UoYWRhcHRlcikpIHsKLQkJCQlhZGFwdGVycy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqLCBDbGFzcyBjbHMpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IGVPYmouZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBhZGFwdChBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBOb3RpZmllciBub3RpZmllciwKLQkJCU9iamVjdCB0eXBlLCBDbGFzcyB2aWV3VHlwZSkgewotCQlmb3IgKEl0ZXJhdG9yIGFkYXB0ZXJzID0gbm90aWZpZXIuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkgJiYgdmlld1R5cGUuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5LmFkYXB0TmV3KG5vdGlmaWVyLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuYW1lLmluZGV4T2YoJy8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJ1xcJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJzonKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyonKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPycpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignIicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc8JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCc+JykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJ3wnKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJzsnKSAhPSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBzdHJpbmcgZm9yIGEgcGx1Z2luIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUGx1Z2luTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoaXNWYWxpZEZpbGVOYW1lKG5hbWUpID09IGZhbHNlICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkvLyBuZWVkIHRvIHJlbW92ZSB0aGVzZSBjaGFyYWN0ZXJzIHNpbmNlIHRoZXkgY2F1c2VkIHByb2JsZW0gd2l0aCBlbGVtZW50IHVybCBlbmNvZGluZywgYm9va21hcmsgaXNzdWUsIAotCQkvLyBhbmQgamF2YXNjcmlwdCBzdHJpbmcgbGl0ZXJuYWwgZXNjYXBpbmcgaXNzdWUKLQkJLy8gc2VlIDE1Njk0NiAtIHBsdWdpbiBuYW1lIHNob3VsZCBub3QgYWxsb3cgJSwgIywgYW5kICcKLQkJaWYgKG5hbWUuaW5kZXhPZignJScpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignIycpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCdcJycpICE9IC0xICkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBuYW1lIGlzIHZhbGlkIGZvciB0aGUgZ2l2ZW4gRU9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGVDbGFzc2VzCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uIG9mIEVDbGFzcyBvYmplY3RzLiBUaGUgRU9iamVjdCBpbnN0YW5jZXMgb2YgdGhlc2UKLQkgKiAgICAgICAgICAgIEVDbGFzcyBvYmplY3RzIHdpbGwgYmUgc2F2ZWQgaW4gdGhlaXIgb3duIGRpcmVjdG9yeS4KLQkgKiBAcmV0dXJuIG51bGwgaWYgc3VjY2Vzc2Z1bCwgZXJyb3IgbWVzc2FnZSBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKE5hbWVkRWxlbWVudCBlLCBTdHJpbmcgbmFtZSwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMpIHsKLQkJcmV0dXJuIGNoZWNrTmFtZSgoKEVPYmplY3QpIGUpLmVDb250YWluZXIoKSwgZSwgbmFtZSwgVG5nVXRpbAotCQkJCS5nZXRUeXBlVGV4dChlKSwgZUNsYXNzZXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShFT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUsIFN0cmluZyBuYW1lLAotCQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCwgQ29sbGVjdGlvbiBlQ2xhc3NlcykgewotCQlTdHJpbmcgbXNnID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBlbGVtZW50VHlwZVRleHQpOwotCQlpZiAobXNnICE9IG51bGwpCi0JCQlyZXR1cm4gbXNnOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5lQ29udGVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKGNoaWxkICE9IGUgJiYgaXNFQ2xhc3NJbnN0YW5jZU9mKGVDbGFzc2VzLCBjaGlsZCkKLQkJCQkJJiYgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5hbWUoKSkpIHsKLQkJCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEVPYmplY3QgcGFyZW50LCBOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsCi0JCQlTdHJpbmcgZWxlbWVudFR5cGVUZXh0LCBJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCVN0cmluZyBtc2cgPSBjaGVja0VsZW1lbnROYW1lKG5hbWUsIGVsZW1lbnRUeXBlVGV4dCk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlMaXN0IGNoaWxkcmVuID0gcGFyZW50LmVDb250ZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlOYW1lZEVsZW1lbnQgY2hpbGQgPSAoTmFtZWRFbGVtZW50KSBjaGlsZHJlbi5nZXQoaSk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBjaGlsZEZpbHRlci5hY2NlcHQoY2hpbGQpCi0JCQkJCSYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROYW1lKCkpKSB7Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVFbGVtZW50TmFtZUVycm9yX21zZywgbmFtZSk7IAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbmFtZSBjYW4gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoZSBtZXRob2QKLQkgKiBhc3N1bWUgdGhhdCB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGJlIHNhdmVkIHVuZGVyIHRoZSBnaXZlbiBkaXJlY3RvcnkKLQkgKiB1c2luZyB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBEaXJlY3Rvcnkgd2hlcmUgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBiZSBzYXZlZCBpbiBhIGZpbGUgb3IgYQotCSAqICAgICAgICAgICAgZGlyZWN0b3J5IGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgaXNEaXIKLQkgKiBAcGFyYW0gc2libGluZ3MKLQkgKiAgICAgICAgICAgIGV4aXNpdGluZyBzaWJsaW5ncyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPgotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBpdHMgbmFtZSB0byBiZSBjaGVja2VkLgotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgc3VnZ2VzdGVkIG5ldyBuYW1lIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPgotCSAqIEBwYXJhbSB0eXBlTGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHR5cGUgbGFiZWwuCi0JICogQHBhcmFtIGlzRGlyCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGJlIHNhdmVkIGEKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gbnVsbCBpZiB0aGUgZ2l2ZW4gbmFtZSBjYW4gYmUgdXNlZCwgYW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgbmFtZQotCSAqICAgICAgICAgaXMgYWxyZWFkeSB0YWtlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRmlsZSBkaXIsIENvbGxlY3Rpb24gc2libGluZ3MsCi0JCQlOYW1lZEVsZW1lbnQgZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBlbGVtZW50VHlwZVRleHQsIGJvb2xlYW4gaXNEaXIpIHsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRWxlbWVudE5hbWUobmFtZSwgZWxlbWVudFR5cGVUZXh0KTsKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJU3RyaW5nIGZpbGVOYW1lID0gbmFtZTsKLQkJaWYgKCFpc0RpcikgewotCQkJZmlsZU5hbWUgPSBmaWxlTmFtZSArICgoSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpU2VydmljZXMuZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKSkuZ2V0RmlsZUV4dGVuc2lvbihlKTsKLQkJfQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGZpbGVOYW1lKTsKLQkJRmlsZSBjdXJyZW50RmlsZSA9IG51bGw7Ci0JCWlmIChlICE9IG51bGwgJiYgZS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQljdXJyZW50RmlsZSA9IG5ldyBGaWxlKGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJaWYgKGlzRGlyKSB7Ci0JCQkJY3VycmVudEZpbGUgPSBjdXJyZW50RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJYm9vbGVhbiBiID0gZmlsZS5leGlzdHMoKTsKLQkJaWYgKGIgJiYgIWZpbGUuZXF1YWxzKGN1cnJlbnRGaWxlKSkgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOwotCQkJLyogVE9ETzogaXMgdGhpcyBuZWVkZWQ/IEFmdGVyIGNhbGxpbmcgTkxTLmJpbmQsIHRoZXJlIHdpbGwJbm90IGJlIGFueSBwbGFjZWhvbGRlcnMgbGVmdCBmb3IgcGFyYW1zLgotCQkJT2JqZWN0W10gcGFyYW1zID0gbmV3IE9iamVjdFsyXTsKLQkJCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJcGFyYW1zWzBdID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZV90ZXh0OyAKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyYW1zWzBdID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZGlyZWN0b3J5X3RleHQ7IAotCQkJfQotCQkJcGFyYW1zWzFdID0gZmlsZTsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtc2csIHBhcmFtcykudG9TdHJpbmcoKTsKLQkJCSovCi0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpYmxpbmdzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTmFtZWRFbGVtZW50IGNoaWxkID0gKE5hbWVkRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgIT0gZSAmJiBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGQuZ2V0TmFtZSgpKSkgewotCQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csIG5hbWUpOyAKLQkJCX0KLQkJfQotCQkvLyAKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0VsZW1lbnROYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgZWxlbWVudFR5cGVUZXh0KSB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLCBTdHJVdGlsLnRvTG93ZXIoZWxlbWVudFR5cGVUZXh0KSk7IAotCQlpZiAobmFtZS5zdGFydHNXaXRoKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjFfbXNnLCBuYW1lKTsgCi0JCWlmIChuYW1lLmVuZHNXaXRoKCIuIikpIC8vJE5PTi1OTFMtMSQKLQkJCS8vCQlyZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjJfbXNnLCBuYW1lKTsgCQkKLQkJaWYgKCFpc1ZhbGlkRmlsZU5hbWUobmFtZSkpCi0JCQkvLwkJcmV0dXJuIEkxOG5VdGlsLmZvcm1hdFN0cmluZyhSRVNPVVJDRV9CVU5ETEUsIGtleSwgZGF0YSk7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnROYW1lRXJyb3IzX21zZywgbmFtZSk7IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1BsdWdpbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkKLQkJU3RyaW5nIGVycm9yID0gY2hlY2tFbGVtZW50TmFtZShuYW1lLCBUbmdVdGlsLmdldFR5cGVUZXh0KCJNZXRob2RQbHVnaW4iKSApOyAvLyROT04tTkxTLTEkCi0JCWlmICggZXJyb3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQotCQkKLQkJLy8gMTU2OTQ2IC0gcGx1Z2luIG5hbWUgc2hvdWxkIG5vdCBhbGxvdyAlLCAjLCBhbmQgJwotCQlpZiAoIWlzVmFsaWRQbHVnaW5OYW1lKG5hbWUpICkgewotCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmludmFsaWRQbHVnaW5OYW1lRXJyb3JfbXNnLCBuYW1lKTsgCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tBY3Rpdml0eU5hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGlmKCFpc1ZhbGlkRmlsZU5hbWUobmFtZSkpIHJldHVybiAiSW52YWxpZCBuYW1lOiAnIiArIG5hbWUgKyAiJy4gVGhlCi0JCS8vIG5hbWUgY2Fubm90IGNvbnRhaW4gZm9sbG93aW5nIGNoYXJhY3RlcnM6IFxcIC8gOiAqID8gXCIgPCA+IHwiOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCAoQnJlYWtkb3duRWxlbWVudCkgb2JqZWN0LCBBY3Rpdml0eS5jbGFzcywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpLCBuYW1lLCBzdXBwcmVzc2lvbik7Ci0JfQotCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dCU0FjdGl2aXR5TmFtZShPYmplY3QgYWN0LCBTdHJpbmcgbmFtZSkgewotLy8JCXJldHVybiBjaGVja0FjdGl2aXR5TmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotLy8JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIGFjdCwgbmFtZSk7Ci0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dCU0FjdGl2aXR5UHJlc2VudGF0aW9uTmFtZShPYmplY3QgYWN0LAotCQkJU3RyaW5nIG5hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCWlmICghKGFjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gTmFtZUNoZWNrZXIuY2hlY2tOYW1lKFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmdldFdCU19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCksIChCcmVha2Rvd25FbGVtZW50KSBhY3QsIEFjdGl2aXR5LmNsYXNzLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCW5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dvcmtCcmVha2Rvd25FbGVtZW50UHJlc2VudGF0aW9uTmFtZShPYmplY3QgZSwKLQkJCVN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShlIGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0V0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1dvcmtQcm9kdWN0RGVzY3JpcHRvclByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUsCi0JCQlTdHJpbmcgbmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc3Npb24pIHsKLQkJaWYgKCEoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRQQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpLCAoQnJlYWtkb3duRWxlbWVudCkgZSwKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIG5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja1JvbGVEZXNjcmlwdG9yUHJlc2VudGF0aW9uTmFtZShPYmplY3QgZSwKLQkJCVN0cmluZyBuYW1lLCBTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbikgewotCQlpZiAoIShlIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBOYW1lQ2hlY2tlci5jaGVja05hbWUoVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwgKEJyZWFrZG93bkVsZW1lbnQpIGUsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLAotCQkJCW5hbWUsIHN1cHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFQ2xhc3NJbnN0YW5jZU9mKENvbGxlY3Rpb24gZUNsYXNzZXMsIE9iamVjdCBvYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZUNsYXNzZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNsYXNzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5zdGFuY2VPZihDb2xsZWN0aW9uIGNsYXNzZXMsIE9iamVjdCBvYmopIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChjbGF6ei5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWRhcHRlckZhY3RvcnkgZ2V0QmVzdEFkYXB0ZXJGYWN0b3J5KAotCQkJQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlb2YgQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgewotCQkJcmV0dXJuICgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhYmVsKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldExhYmVsKG9iamVjdCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIGdldExhYmVsKCgoQ29udGVudERlc2NyaXB0aW9uKSBvYmplY3QpLmVDb250YWluZXIoKSwgYWx0ZXJuYXRpdmVMYWJlbCk7Ci0JCX0KLQkJCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlFT2JqZWN0IGVPYmogPSAoRU9iamVjdCkgb2JqZWN0OwotCQkJaWYgKGVPYmouZUlzUHJveHkoKSkgewotCQkJCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIHVyaSA9IGVPYmouZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKQotCQkJCQkJCS5ub3JtYWxpemUoKChJbnRlcm5hbEVPYmplY3QpIGVPYmopLmVQcm94eVVSSSgpKTsKLQkJCQkJcGF0aCA9IHVyaS5pc0ZpbGUoKSA/IHVyaS50b0ZpbGVTdHJpbmcoKSA6IHVyaS50b1N0cmluZygpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfQotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJcGF0aCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCSIgJyd7MH0nJyIsIG5ldyBPYmplY3RbXSB7IHBhdGggfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlwYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8JCXJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy51bnJlc29sdmVkX3RleHQsIHBhdGgpOyAKLQkJCX0KLQkJfQotCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQlib29sZWFuIHNob3dQcmVzZW50YXRpb25OYW1lcyA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKTsKLQkJaWYgKHNob3dQcmVzZW50YXRpb25OYW1lcyAmJiBvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCkuZ2V0UHJvY2VzcygpCi0JCQkJCS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWVsc2UgaWYgKHNob3dQcmVzZW50YXRpb25OYW1lcyAmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KQotCQkJbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCQlpZiAobGFiZWwgPT0gbnVsbCB8fCBsYWJlbC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCWxhYmVsID0gKChOYW1lZEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC50cmltKCkubGVuZ3RoKCkgPT0gMCA/IGFsdGVybmF0aXZlTGFiZWwgOiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0LAotCQkJU3RyaW5nIGFsdGVybmF0aXZlTGFiZWwsIGJvb2xlYW4gcHJlZmVyQmFzZSkgewotCQlTdHJpbmcgbGFiZWwgPSBUbmdVdGlsLmdldExhYmVsKG9iamVjdCwgYWx0ZXJuYXRpdmVMYWJlbCk7Ci0JCWlmIChwcmVmZXJCYXNlICYmIG9iamVjdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBvYmplY3QuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlTdHJpbmcgdmFyaWFiaWxpdHlUeHQgPSBudWxsOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5jb250cmlidXRlc1RvX3RleHQ7IAotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pIHsKLQkJCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5sb2NhbENvbnRyaWJ1dGVzVG9fdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmV4dGVuZHNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSB7Ci0JCQkJdmFyaWFiaWxpdHlUeHQgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXBsYWNlc190ZXh0OyAKLQkJCX0gZWxzZSBpZiAodHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpIHsKLQkJCQl2YXJpYWJpbGl0eVR4dCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmxvY2FsUmVwbGFjZXNfdGV4dDsgCi0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpewotCQkJCXZhcmlhYmlsaXR5VHh0ID0gTGlicmFyeUVkaXRSZXNvdXJjZXMuZXh0ZW5kc19yZXBsYWNlc190ZXh0OwotCQkJfQotCQkJaWYgKHZhcmlhYmlsaXR5VHh0ICE9IG51bGwpIHsKLQkJCQlNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKG9iamVjdAotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSk7Ci0JCQkJaWYgKGJhc2VQbHVnaW4gIT0gbnVsbCkgewotCQkJCQlsYWJlbCA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLlV0aWxfbGFiZWxwYXRoX3ZhcmlhYmlsaXR5d2l0aHBsdWdpbl9pbmZvLCAobmV3IFN0cmluZ1tdIHsKLQkJCQkJbGFiZWwsCi0JCQkJCXZhcmlhYmlsaXR5VHh0LAotCQkJCQlUbmdVdGlsCi0JCQkJCQkJLmdldExhYmVsKAotCQkJCQkJCQkJb2JqZWN0Ci0JCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJCQkJCQlhbHRlcm5hdGl2ZUxhYmVsKSwKLQkJCQkJYmFzZVBsdWdpbi5nZXROYW1lKCkgfSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxhYmVsID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuVXRpbF9sYWJlbHBhdGhfdmFyaWFiaWxpdHlfaW5mbywgKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCWxhYmVsLAotCQkJCQl2YXJpYWJpbGl0eVR4dCwKLQkJCQkJVG5nVXRpbC5nZXRMYWJlbChvYmplY3QKLQkJCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLAotCQkJCQkJCWFsdGVybmF0aXZlTGFiZWwpIH0pKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgYSBuZXdseSBjcmVhdGVkIFByb2Nlc3NDb21wb25lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9uZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgY29tcG9uZW50LAotCQkJRUNsYXNzIHR5cGUpIHsKLQkJLy8gY3JlYXRlIG5ldyBwcm9jZXNzIGZvciB0aGUgcHJvY2VzcyBjb21wb25lbnQKLQkJLy8KLQkJUHJvY2VzcyBwcm9jID0gY29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJaWYgKHByb2MgPT0gbnVsbCkgewotCQkJcHJvYyA9IChQcm9jZXNzKSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUodHlwZSk7Ci0JCQljb21wb25lbnQuc2V0UHJvY2Vzcyhwcm9jKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0b3AgYWN0aXZpdHkKLQkJLy8KLQkJLy8gaWYocHJvYy5nZXRUb3BMZXZlbEJyZWFrZG93bkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCS8vIEFjdGl2aXR5IGFjdCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5KCk7Ci0JCS8vIHByb2Muc2V0VG9wTGV2ZWxCcmVha2Rvd25FbGVtZW50KGFjdCk7Ci0JCS8vIGNvbXBvbmVudC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmFkZChhY3QpOwotCQkvLyB9Ci0KLQkJLy8gY3JlYXRlIFdCUywgT0JTLCBhbmQgUEJTCi0JCS8vCi0JCS8vIGlmKGNvbXBvbmVudC5nZXRXQlMoKSA9PSBudWxsKQotCQkvLyBjb21wb25lbnQuc2V0V0JTKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdCUygpKTsKLQkJLy8gaWYoY29tcG9uZW50LmdldFRCUygpID09IG51bGwpCi0JCS8vIGNvbXBvbmVudC5zZXRUQlMoVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVEJTKCkpOwotCQkvLyBpZihjb21wb25lbnQuZ2V0V1BCUygpID09IG51bGwpCi0JCS8vIGNvbXBvbmVudC5zZXRXUEJTKFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdQQlMoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBCcmVha2Rvd25FbGVtZW50IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGJlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTnVsbChTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiAoc3RyID09IG51bGwgPyAiIiA6IHN0cik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVzY3JpcHRvckV4aXN0cyhSb2xlIHJvbGUsIExpc3Qgcm9sZURlc2NyaXB0b3JMaXN0KSB7Ci0JCWZvciAoaW50IGkgPSByb2xlRGVzY3JpcHRvckxpc3Quc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjID0gKFJvbGVEZXNjcmlwdG9yKSByb2xlRGVzY3JpcHRvckxpc3QKLQkJCQkJLmdldChpKTsKLQkJCWlmIChyb2xlRGVzYy5nZXRSb2xlKCkgPT0gcm9sZSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGNvcHkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNvcGllciBjb3BpZXIgPSBuZXcgQ29waWVyKCkgewotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU3ODQ2NTc2MDMzOTA0NjkxTDsKLQotCQkJLyoqCi0JCQkgKiBDYWxsZWQgdG8gaGFuZGxlIHRoZSBjb3B5aW5nIG9mIGEgY3Jvc3MgcmVmZXJlbmNlOyB0aGlzIGFkZHMKLQkJCSAqIHZhbHVlcyBvciBzZXRzIGEgc2luZ2xlIHZhbHVlIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgbXVsdGlwbGljaXR5Ci0JCQkgKiB3aGlsZSBvbWl0dGluZyBhbnkgYmlkaXJlY3Rpb25hbCByZWZlcmVuY2Ugb3Igc2luZ2xlIG9wcG9zaXRlCi0JCQkgKiBmZWF0dXJlJ3MgcmVmZXJlbmNlIHRoYXQgaXNuJ3QgaW4gdGhlIGNvcHkgbWFwLgotCQkJICogCi0JCQkgKiBAcGFyYW0gZVJlZmVyZW5jZQotCQkJICogICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHRvIGNvcHkuCi0JCQkgKiBAcGFyYW0gZU9iamVjdAotCQkJICogICAgICAgICAgICB0aGUgb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weS4KLQkJCSAqIEBwYXJhbSBjb3B5RU9iamVjdAotCQkJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIGNvcHkgdG8uCi0JCQkgKi8KLQkJCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2UoRVJlZmVyZW5jZSBlUmVmZXJlbmNlLAotCQkJCQlFT2JqZWN0IGVPYmplY3QsIEVPYmplY3QgY29weUVPYmplY3QpIHsKLQkJCQlpZiAoZU9iamVjdC5lSXNTZXQoZVJlZmVyZW5jZSkpIHsKLQkJCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IE9wcG9zaXRlRmVhdHVyZS5nZXRPcHBvc2l0ZUZlYXR1cmUoZVJlZmVyZW5jZSk7Ci0JCQkJCQotCQkJCQkvLyAibWFueSIgb3Bwb3NpdGUgZmVhdHVyZSBkb2VzIG5vdCByZXF1aXJlIGNvcGllZCB0YXJnZXQsIGl0IGlzCi0JCQkJCS8vIHRyZWF0ZWQgYXMgYSByZWd1bGFyIG5vbi1jb250YWlubWVudCByZWZlcmVuY2UKLQkJCQkJLy8gVE9ETzogYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGFyZSBub3QgYXV0b21hdGljYWxseSBjb3BpZWQgaW4KLQkJCQkJLy8gRU1GIGltcGxlbWVudGF0aW9uCi0JCQkJCS8vCi0JCQkJCWJvb2xlYW4gY29waWVkVGFyZ2V0UmVxdWlyZWQgPSBlUmVmZXJlbmNlLmdldEVPcHBvc2l0ZSgpICE9IG51bGwKLQkJCQkJCQl8fCAob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwgJiYgIW9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSk7Ci0JCQkJCQkJCQkJCi0JCQkJCWlmIChlUmVmZXJlbmNlLmlzTWFueSgpKSB7Ci0JCQkJCQlMaXN0IHNvdXJjZSA9IChMaXN0KSBlT2JqZWN0LmVHZXQoZVJlZmVyZW5jZSk7Ci0JCQkJCQlJbnRlcm5hbEVMaXN0IHRhcmdldCA9IChJbnRlcm5hbEVMaXN0KSBjb3B5RU9iamVjdAotCQkJCQkJCQkuZUdldChnZXRUYXJnZXQoZVJlZmVyZW5jZSkpOwotCQkJCQkJaWYgKHNvdXJjZS5pc0VtcHR5KCkpIHsKLQkJCQkJCQl0YXJnZXQuY2xlYXIoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGsgPSBzb3VyY2UuaXRlcmF0b3IoKTsgay5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU9iamVjdCByZWZlcmVuY2VkRU9iamVjdCA9IGsubmV4dCgpOwotCQkJCQkJCQlPYmplY3QgY29weVJlZmVyZW5jZWRFT2JqZWN0ID0gZ2V0KHJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJaWYgKGNvcHlSZWZlcmVuY2VkRU9iamVjdCA9PSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAoIWNvcGllZFRhcmdldFJlcXVpcmVkKSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwKLQkJCQkJCQkJCQkJCXJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQkJCQkrK2luZGV4OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJaWYgKGNvcGllZFRhcmdldFJlcXVpcmVkKSB7Ci0JCQkJCQkJCQkJaW50IHBvc2l0aW9uID0gdGFyZ2V0Ci0JCQkJCQkJCQkJCQkuaW5kZXhPZihjb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCWlmIChwb3NpdGlvbiA9PSAtMSkgewotCQkJCQkJCQkJCQl0YXJnZXQuYWRkVW5pcXVlKGluZGV4LAotCQkJCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQkJfSBlbHNlIGlmIChpbmRleCAhPSBwb3NpdGlvbikgewotCQkJCQkJCQkJCQl0YXJnZXQubW92ZShpbmRleCwKLQkJCQkJCQkJCQkJCQljb3B5UmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LmFkZFVuaXF1ZShpbmRleCwKLQkJCQkJCQkJCQkJCWNvcHlSZWZlcmVuY2VkRU9iamVjdCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkrK2luZGV4OwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJT2JqZWN0IHJlZmVyZW5jZWRFT2JqZWN0ID0gZU9iamVjdC5lR2V0KGVSZWZlcmVuY2UpOwotCQkJCQkJaWYgKHJlZmVyZW5jZWRFT2JqZWN0ID09IG51bGwpIHsKLQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwgbnVsbCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCU9iamVjdCBjb3B5UmVmZXJlbmNlZEVPYmplY3QgPSBnZXQocmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCWlmIChjb3B5UmVmZXJlbmNlZEVPYmplY3QgPT0gbnVsbCkgewotCQkJCQkJCQlpZiAoIWNvcGllZFRhcmdldFJlcXVpcmVkKSB7Ci0JCQkJCQkJCQljb3B5RU9iamVjdC5lU2V0KGdldFRhcmdldChlUmVmZXJlbmNlKSwKLQkJCQkJCQkJCQkJcmVmZXJlbmNlZEVPYmplY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJY29weUVPYmplY3QuZVNldChnZXRUYXJnZXQoZVJlZmVyZW5jZSksCi0JCQkJCQkJCQkJY29weVJlZmVyZW5jZWRFT2JqZWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCU1ldGhvZEVsZW1lbnQgY29weSA9IChNZXRob2RFbGVtZW50KSBjb3BpZXIuY29weShlbGVtZW50KTsKLQkJY29waWVyLmNvcHlSZWZlcmVuY2VzKCk7Ci0KLQkJLy8gdW5zZXQgdGhlIEdVSUQgb2YgdGhlIGNvcHkgYW5kIGl0cyBvZmZzdHJpbmcKLQkJLy8KLQkJY29weS5zZXRHdWlkKG51bGwpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb3B5LmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIGUpLnNldEd1aWQobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eUVsZW1lbnQgZ2V0QmFzZShWYXJpYWJpbGl0eUVsZW1lbnQgYykgewotCQlmb3IgKDsgYy5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgIT0gbnVsbDsgYyA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGMKLQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKQotCQkJOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRDYXRlZ29yeSBmaW5kSW5oZXJpdGVkKENvbGxlY3Rpb24gaW5oZXJpdGVkTGlzdCwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpbmhlcml0ZWRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGVsZW1lbnQgPSAoQ29udGVudENhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCSYmIChlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBjYXRlZ29yeSB8fCBlbGVtZW50Ci0JCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBjYXRlZ29yeQotCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudENhdGVnb3J5IHJlbW92ZUluaGVyaXRlZChMaXN0IGluaGVyaXRlZExpc3QsCi0JCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaW5oZXJpdGVkTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBlbGVtZW50ID0gKENvbnRlbnRDYXRlZ29yeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gY2F0ZWdvcnkpIHsKLQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCXJldHVybiBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbnRlbnRJdGVtUHJvdmlkZXIgZ2V0Q29udGVudEl0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCU1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBtZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKWdldEFkYXB0ZXIoCi0JCQkJcGx1Z2luLAlNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuY2xhc3MpOwotCQltZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGx1Z2luKTsKLQkJSUdyb3VwQ29udGFpbmVyIGdyb3VwQ29udGFpbmVyID0gKElHcm91cENvbnRhaW5lcikgVG5nVXRpbC5nZXRBZGFwdGVyKAotCQkJCShFT2JqZWN0KSBwbHVnaW4sIElHcm91cENvbnRhaW5lci5jbGFzcyk7Ci0JCWlmIChncm91cENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKENvbnRlbnRJdGVtUHJvdmlkZXIpIGdyb3VwQ29udGFpbmVyCi0JCQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCS5nZXRTdHJpbmcoIl9VSV9Db250ZW50X2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUNvbnRlbnRJdGVtUHJvdmlkZXIgY29udGVudEl0ZW1Qcm92aWRlciA9IGdldENvbnRlbnRJdGVtUHJvdmlkZXIocGx1Z2luKTsKLQkJY29udGVudEl0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihjb250ZW50SXRlbVByb3ZpZGVyKTsKLQkJaWYgKGNvbnRlbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIChTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpY29udGVudEl0ZW1Qcm92aWRlci5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfU3RhbmRhcmRfQ2F0ZWdvcmllc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGlzY2lwbGluZUNhdGVnb3JpZXNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RG9tYWluc0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciA9IGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihtb2RlbCk7Ci0JCXN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpOwotCQlpZiAoc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfRG9tYWluc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFdvcmtQcm9kdWN0VHlwZXNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZXNfZ3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRSb2xlU2V0c0l0ZW1Qcm92aWRlcihNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJU3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyIHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciA9IGdldFN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlcihtb2RlbCk7Ci0JCXN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlci5nZXRDaGlsZHJlbihzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIpOwotCQlpZiAoc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIKLQkJCS5nZXRHcm91cEl0ZW1Qcm92aWRlcihMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0U3RyaW5nKCJfVUlfUm9sZV9TZXRzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VG9vbHNJdGVtUHJvdmlkZXIoTWV0aG9kUGx1Z2luIG1vZGVsKSB7Ci0JCVN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciBzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIgPSBnZXRTdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIobW9kZWwpOwotCQlzdGFuZGFyZENhdGVnb3JpZXNJdGVtUHJvdmlkZXIuZ2V0Q2hpbGRyZW4oc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyKTsKLQkJaWYgKHN0YW5kYXJkQ2F0ZWdvcmllc0l0ZW1Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRDYXRlZ29yaWVzSXRlbVByb3ZpZGVyCi0JCQkuZ2V0R3JvdXBJdGVtUHJvdmlkZXIoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN0cmluZygiX1VJX1Rvb2xzX2dyb3VwIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIG5leHQgYXZhaWxhYmxlIG5hbWUgdGhhdCBpcyBub3QgYWxyZWFkeSB0YWtlbiBieSBhbnkgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBiYXNlTmFtZQotCSAqIEByZXR1cm4gYmFzZU5hbWUgb2YgYmFzZU5hbWVfWCB3aGVyZSBpcyBpcyB0aGUgbnVtYmVyIHN0YXJ0aW5nIGZyb20gMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVOYW1lKExpc3Q8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzLCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJaWYoaXNOYW1lVGFrZW4oZWxlbWVudHMsIG51bGwsIGJhc2VOYW1lKSkgewotCQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJCWlmICghaXNOYW1lVGFrZW4oZWxlbWVudHMsIG51bGwsIG5hbWUpKSB7Ci0JCQkJCXJldHVybiBuYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZU5hbWU7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoTGlzdDw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gc2libGluZ3MsIE1ldGhvZEVsZW1lbnQgZSwKLQkJCVN0cmluZyBiYXNlTmFtZSkgewotCQlpZiAoZS5nZXROYW1lKCkgIT0gbnVsbCAmJiBlLmdldE5hbWUoKS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNOYW1lVGFrZW4oc2libGluZ3MsIGUsIGJhc2VOYW1lKSkgewotCQkJZS5zZXROYW1lKGJhc2VOYW1lKTsKLQkJCXNldFByZXNlbnRhdGlvbk5hbWUoZSwgYmFzZU5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAyOyB0cnVlOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gYmFzZU5hbWUgKyAnXycgKyBpOwotCQkJaWYgKCFpc05hbWVUYWtlbihzaWJsaW5ncywgZSwgbmFtZSkpIHsKLQkJCQllLnNldE5hbWUobmFtZSk7Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZShlLCBuYW1lKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TmFtZShDdXN0b21DYXRlZ29yeSBwYXJlbnQsIEN1c3RvbUNhdGVnb3J5IGNjLCBTdHJpbmcgYmFzZU5hbWUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBhcmVudCk7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IHBsdWdpbiA9PSBudWxsID8gbnVsbCA6IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJVG5nVXRpbC5zZXREZWZhdWx0TmFtZShwYXJlbnQuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLCBjYywgYmFzZU5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlVbmlxdWVOYW1lSGFuZGxlciBoYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVIYW5kbGVyKCk7Ci0JCWhhbmRsZXIucmVnaXN0ZXJOYW1lcyhwa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkpOwotCQlTdHJpbmcgbmFtZSA9IGhhbmRsZXIuZ2V0VW5pcXVlTmFtZShiYXNlTmFtZSk7Ci0JCWNjLnNldE5hbWUobmFtZSk7Ci0JCWNjLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlOwotCi0JCQlTdHJpbmdCdWZmZXIgcHJlc05hbWVCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJhc2VOYW1lLCAiXyIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGFXb3JkID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJcHJlc05hbWVCdWYuYXBwZW5kKGFXb3JkLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCi0JCQkJCQkrIGFXb3JkLnN1YnN0cmluZygxKSArICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZGUuc2V0UHJlc2VudGF0aW9uTmFtZShwcmVzTmFtZUJ1Zi50b1N0cmluZygpLnRyaW0oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTmFtZVRha2VuKExpc3Q8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IHNpYmxpbmdzLCBNZXRob2RFbGVtZW50IGUsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gc2libGluZ3Muc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU1ldGhvZEVsZW1lbnQgc2libGluZyA9IChNZXRob2RFbGVtZW50KSBzaWJsaW5ncy5nZXQoaSk7Ci0JCQlpZiAoc2libGluZyAhPSBlICYmIG5hbWUuZXF1YWxzSWdub3JlQ2FzZShzaWJsaW5nLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGV4dHJhY3QoQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBDbGFzcyBjbHMpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gZXh0cmFjdFR5cGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgT2JqZWN0PiBjb2xsZWN0aW9uLCBDbGFzczxUPiBjbHMpIHsKLQkJQXJyYXlMaXN0PFQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE9iamVjdD4gaXRlciA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJbGlzdC5hZGQoKFQpZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdE5hbWUoSURlZmF1bHROYW1lU2V0dGVyIGRlZmF1bHROYW1lU2V0dGVyLAotCQkJTm90aWZpY2F0aW9uIG1zZykgewotCQlpZiAoZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVPd25lckNsYXNzKCkgIT0gbnVsbCkgewotCQkJaW50IGZlYXR1cmVJZCA9IG1zZy5nZXRGZWF0dXJlSUQoZGVmYXVsdE5hbWVTZXR0ZXIKLQkJCQkJLmdldEludGVyZXN0ZWRGZWF0dXJlT3duZXJDbGFzcygpKTsKLQkJCWlmIChmZWF0dXJlSWQgPT0gZGVmYXVsdE5hbWVTZXR0ZXIuZ2V0SW50ZXJlc3RlZEZlYXR1cmVJRCgpKSB7Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWRlZmF1bHROYW1lU2V0dGVyLnNldERlZmF1bHROYW1lKG1zZy5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJZGVmYXVsdE5hbWVTZXR0ZXIuc2V0RGVmYXVsdE5hbWUoaXRlci5uZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlQ2F0ZWdvcnkKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZgotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeHRlbmRlZENoaWxkcmVuKENvbnRlbnRDYXRlZ29yeSBiYXNlQ2F0ZWdvcnksCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmYsIENvbGxlY3Rpb24gY2hpbGRyZW4sCi0JCQlTdHJpbmdbXSBjYXRlZ29yeVBrZ1BhdGgpIHsKLQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihiYXNlQ2F0ZWdvcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtZXRob2RDb25mLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKE1pc2MuaXNCYXNlT2YoYmFzZVBsdWdpbiwgcGx1Z2luKSkgewotCQkJCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQlpZiAoY2F0ZWdvcnlQa2cgIT0gbnVsbAotCQkJCQkJJiYgbWV0aG9kQ29uZi5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuY29udGFpbnMoCi0JCQkJCQkJCWNhdGVnb3J5UGtnKSkgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkgPSBmaW5kSW5oZXJpdGVkKGNhdGVnb3J5UGtnCi0JCQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpLCBiYXNlQ2F0ZWdvcnkpOwotCQkJCQlpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKQotCQkJCQkJCQkuYWRhcHQoY2F0ZWdvcnksIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkJLnByaW50bG4oIkRpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5hZGRFeHRlbmRlZENoaWxkcmVuKCk6IGNvdWxkIG5vdCBmaW5kIGFkYXB0ZXIgZm9yICIgKyBjYXRlZ29yeSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhZGFwdGVyLmdldENoaWxkcmVuKGNhdGVnb3J5KQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCU9iamVjdCBjaGlsZCA9IChPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQlDb250ZW50RWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCQkJCQllbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KSBjaGlsZDsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbAotCQkJCQkJCQkJJiYgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQkJCQkvLyB0aGlzIGlzIGFuIG93biBjaGlsZCBvZiBhbiBleHRlbmRlZCBjYXRlZ29yeQotCQkJCQkJCQkvLyBpdCBtdXN0IGJlIGFkZGVkIHRvIHRoZSBjaGlsZCBsaXN0IG9mIHRoZQotCQkJCQkJCQkvLyBiYXNlIGNhdGVnb3J5IGluIHRoZSBjb25maWd1cmF0aW9uLgotCQkJCQkJCQkvLwotCQkJCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gY29sbGVjdCB0aGUgb3duIGNoaWxkcmVuIG9mIHRoZSBleHRlbmRlZCBjYXRlZ29yaWVzCi0JCQkJCQkvLyBvZiB0aGlzIGNhdGVnb3J5IGRvd24gdGhlIGluaGVyaXRhbmNlIHRyZWUKLQkJCQkJCS8vCi0JCQkJCQlhZGRFeHRlbmRlZENoaWxkcmVuKGNhdGVnb3J5LCBtZXRob2RDb25mLCBjaGlsZHJlbiwKLQkJCQkJCQkJY2F0ZWdvcnlQa2dQYXRoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQWxsVG8oTGlzdCBhbGxDaGlsZHJlbiwgTGlzdCBuZXdDaGlsZHJlbikgewotCQlpbnQgaWQ7Ci0JCUJyZWFrZG93bkVsZW1lbnQgY2hpbGQsIG5leHQsIGxhc3Q7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSghbmV3Q2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0JCQljaGlsZCA9IChCcmVha2Rvd25FbGVtZW50KSBuZXdDaGlsZHJlbi5yZW1vdmUoMCk7Ci0JCQlsaXN0LmNsZWFyKCk7Ci0JCQlsaXN0LmFkZChjaGlsZCk7Ci0JCQlsYXN0ID0gbnVsbDsKLQkJCQotCQkJLy8gZmluZCB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBjaGFpbiBpbiBuZXcgY2hpbGRyZW4gbGlzdAotCQkJLy8KLQkJCWZpbmRfbGFzdDoKLQkJCWZvcihuZXh0ID0gY2hpbGQuZ2V0UHJlc2VudGVkQWZ0ZXIoKTsgbmV4dCAhPSBudWxsOyBuZXh0ID0gbmV4dC5nZXRQcmVzZW50ZWRBZnRlcigpKSB7Ci0JCQkJbGFzdCA9IG5leHQ7Ci0JCQkJaWQgPSBpbmRleE9mTmV4dEVsZW1lbnQobmV3Q2hpbGRyZW4sIG5leHQpOwotCQkJCWlmKGlkID09IC0xKSB7Ci0JCQkJCWJyZWFrIGZpbmRfbGFzdDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxpc3QuYWRkKG5ld0NoaWxkcmVuLnJlbW92ZShpZCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKGxhc3QgIT0gbnVsbCkgewotCQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBsYXN0KTsKLQkJCQlpZihpZCA9PSAtMSkgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwobGlzdCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlhbGxDaGlsZHJlbi5hZGRBbGwoaWQsIGxpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWFsbENoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjaGlsZCB0byB0aGUgYWxsQ2hpbGRyZW4gbGlzdCBiYXNlZCBvbiB0aGUgcHJlc2VudGVkQmVmb3JlCi0JICogb2YgY2hpbGQuCi0JICogCi0JICogQHBhcmFtIGFsbENoaWxkcmVuCi0JICogQHBhcmFtIGNoaWxkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFRvKExpc3QgYWxsQ2hpbGRyZW4sIEJyZWFrZG93bkVsZW1lbnQgY2hpbGQsCi0JCQlPYmplY3Qgb3duZXIsIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCUJyZWFrZG93bkVsZW1lbnQgbmV4dCA9IGNoaWxkLmdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCWludCBpZDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJaWQgPSAtMTsKLQkJfSBlbHNlIHsKLQkJCWlkID0gaW5kZXhPZk5leHRFbGVtZW50KGFsbENoaWxkcmVuLCBuZXh0KTsKLQkJCS8vIGlmKGlkID09IC0xKSB7Ci0JCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlRuZ1V0aWwuYWRkVG8oKTogaW52YWxpZCBwcmVzZW50ZWRCZWZvcmUKLQkJCS8vIG9mICIgKyBjaGlsZCk7Ci0JCQkvLyBCcmVha2Rvd25FbGVtZW50IHByZXYgPSBjaGlsZC5nZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJCS8vIGlmKHByZXYgPT0gbnVsbCkgewotCQkJLy8gaWQgPSAwOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IGluZGV4T2YoYWxsQ2hpbGRyZW4sIHByZXYpOwotCQkJLy8gaWYoaWQgPiAtMSkgewotCQkJLy8gaWYoaWQgPCBhbGxDaGlsZHJlbi5zaXplKCkgLSAxKSB7Ci0JCQkvLyBpZCsrOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBpZCA9IC0xOwotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JCWlmIChpZCA9PSAtMSkgewotCQkJYWxsQ2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfSBlbHNlIHsKLQkJCWFsbENoaWxkcmVuLmFkZChpZCwgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5kZXggb2YgbmV4dCBlbGVtZW50IG9mIHRoZSBicmVha2Rvd24gZWxlbWVudCB3aG9zZSBwcmVzZW50ZWQtYWZ0ZXIgZWxlbWVudCBpcyB0aGUgZ2l2ZW4gCi0JICogYnJlYWsgZG93biBlbGVtZW50Ci0JICogQHBhcmFtIG1peGVkTGlzdAotCSAqICAgICAgICAgICAgbWl4ZWQgbGlzdCBvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciBhbmQKLQkgKiAgICAgICAgICAgIEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0cwotCSAqIEBwYXJhbSBwcmVzZW50ZWRBZnRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZk5leHRFbGVtZW50KExpc3QgbWl4ZWRMaXN0LCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyKSB7Ci0JCWludCBzaXplID0gbWl4ZWRMaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU9iamVjdCBvID0gdW53cmFwKG1peGVkTGlzdC5nZXQoaSkpOwotCQkJaWYgKG8gPT0gcHJlc2VudGVkQWZ0ZXIKLQkJCQkJfHwgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgJiYgKChWYXJpYWJpbGl0eUVsZW1lbnQpbykuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IHByZXNlbnRlZEFmdGVyKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEF2YWlsYWJsZUJhc2VQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUxpc3QgcHJvY2Vzc0NsYXNzZXMpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWxsQmFzZVBsdWdpbnMgPSBNaXNjLmdldEFsbEJhc2UocGx1Z2luKTsKLQkJYWxsQmFzZVBsdWdpbnMuYWRkKDAsIHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbEJhc2VQbHVnaW5zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGJhc2VQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUNvbGxlY3Rpb24gcGFja2FnZXMgPSBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKGJhc2VQbHVnaW4sCi0JCQkJCXByb2Nlc3NDbGFzc2VzKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwYWNrYWdlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkUGtnID0gKE9iamVjdCkgaXRlcmF0b3IxLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCWlmIChpc0luc3RhbmNlT2YocHJvY2Vzc0NsYXNzZXMsIHByb2MpKSB7Ci0JCQkJCQkJcHJvY2Vzc2VzLmFkZChwcm9jKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoQ2xhc3MgcHJvY0NsYXNzKSB7Ci0JCWlmIChwcm9jQ2xhc3MgPT0gRGVsaXZlcnlQcm9jZXNzLmNsYXNzKSB7Ci0JCQlyZXR1cm4gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBDYXBhYmlsaXR5UGF0dGVybi5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQl9IGVsc2UgaWYgKHByb2NDbGFzcyA9PSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcykgewotCQkJcmV0dXJuIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVQYXRoOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRSb290UHJvY2Vzc1BhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sCi0JCQlDb2xsZWN0aW9uIHByb2NDbGFzc2VzKSB7Ci0JCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb2NDbGFzc2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQ2xhc3MgY2xhenogPSAoQ2xhc3MpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nW10gcGF0aCA9IGdldFJvb3RQcm9jZXNzUGFja2FnZVBhdGgoY2xhenopOwotCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sIHBhdGgpOwotCQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlwYWNrYWdlcy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBwbHVnaW4gaGFzIGFueSBDb250ZW50Q2F0ZWdvcnkgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDYXRlZ29yaWVzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxDb250ZW50UGFja2FnZT4gY29uUGFja3MgPSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRQYWNrYWdlPiBjb25QYWNrc0l0ZXIgPSBjb25QYWNrcy5pdGVyYXRvcigpO2NvblBhY2tzSXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50UGFja2FnZSBjb25QYWNrID0gY29uUGFja3NJdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3IgY29uUGFja0l0ZXIgPSBjb25QYWNrLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7Y29uUGFja0l0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gY29uUGFja0l0ZXIubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkJCi0KLQlwdWJsaWMgc3RhdGljIExpc3Q8UHJvY2Vzcz4gZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+KCk7Ci0JCWZvciAoTWV0aG9kUGFja2FnZSBwa2cgOiBwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKSkgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKHBrZywgcHJvY2Vzc2VzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0PFByb2Nlc3M+IGdldEFsbFByb2Nlc3NlcyhNZXRob2RQYWNrYWdlIHBrZykgewotCQlMaXN0PFByb2Nlc3M+ICBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PFByb2Nlc3M+ICgpOwotCQlfaXRlcmF0ZVBhY2thZ2VGb3JQcm9jZXNzZXMocGtnLCBwcm9jZXNzZXMpOwotCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKE1ldGhvZFBhY2thZ2UgcGtnLAotCQkJTGlzdCBwcm9jZXNzZXMpIHsKLQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCVByb2Nlc3MgcCA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgcGtnKS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocCAhPSBudWxsICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkpIHsKLQkJCQlwcm9jZXNzZXMuYWRkKHApOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJX2l0ZXJhdGVQYWNrYWdlRm9yUHJvY2Vzc2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHByb2Nlc3Nlcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgZSBpcyBhIHN1YmVsZW1lbnQgb2YgcGFyZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1YmVsZW1lbnRPZihPYmplY3QgcGFyZW50LCBPYmplY3QgZSwKLQkJCUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChwYXJlbnQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChwYXJlbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ocGFyZW50KS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCA9PSBlKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3ViZWxlbWVudE9mKGVsZW1lbnQsIGUsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1cGVyRWxlbWVudE9mKE9iamVjdCBjaGlsZCwgT2JqZWN0IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAoY2hpbGQgPT0gZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGFkYXB0ZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBhZGFwdGVyLmdldENoaWxkcmVuKGUpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50ID09IGNoaWxkKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGlzU3VwZXJFbGVtZW50T2YoY2hpbGQsIGVsZW1lbnQsIGFkYXB0ZXJGYWN0b3J5KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHVud3JhcChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG9iaikuZ2V0VmFsdWUoKTsKLQkJCX0gd2hpbGUgKG9iaiBpbnN0YW5jZW9mIElXcmFwcGVySXRlbVByb3ZpZGVyKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJZG8gewotCQkJCW9iaiA9ICgoQ29tbWFuZFdyYXBwZXIpIG9iaikuZ2V0Q29tbWFuZCgpOwotCQkJfSB3aGlsZSAob2JqIGluc3RhbmNlb2YgQ29tbWFuZFdyYXBwZXIpOwotCQl9Ci0KLQkJcmV0dXJuIG9iajsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBib29sZWFuIHZhbHVlIGJhc2VkIG9uIHdoZXRoZXIgb2JqZWN0IGlzIHdyYXBwZXIgb2JqZWN0IG9yIG5vdAotCSAqIEBwYXJhbSBvYmoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV3JhcHBlZChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJV3JhcHBlckl0ZW1Qcm92aWRlciB8fCBvYmogaW5zdGFuY2VvZiBDb21tYW5kV3JhcHBlcikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCB1bndyYXAoQ29tbWFuZCBjbWQpIHsKLQkJd2hpbGUgKGNtZCBpbnN0YW5jZW9mIENvbW1hbmRXcmFwcGVyKSB7Ci0JCQljbWQgPSAoKENvbW1hbmRXcmFwcGVyKSBjbWQpLmdldENvbW1hbmQoKTsKLQkJfQotCi0JCXJldHVybiBjbWQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBlbGVtZW50IG9mIGFueQotCSAqIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmFzZShMaXN0IGVsZW1lbnRzLCBPYmplY3QgYmFzZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCWlmIChiYXNlID09ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbk5hbWUoT2JqZWN0IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCWUgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgZSkuZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCQotCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCW5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIGUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCWlmIChTdHJVdGlsLmlzQmxhbmsobmFtZSkpIAl7Ci0JCQkJbmFtZSA9ICgoTWV0aG9kRWxlbWVudCkgZSkuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzIGdldE93bmluZ1Byb2Nlc3MoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyOwotCQlmb3IgKGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOyBjb250YWluZXIgIT0gbnVsbAotCQkJCSYmICEoY29udGFpbmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5lQ29udGFpbmVyKCkpCi0JCQk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgY29udGFpbmVyKS5nZXRQcm9jZXNzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyIHdyYXBwZXIpIHsKLQkJT2JqZWN0IHRvcCA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQlpZih0b3AgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoUHJvY2VzcykgdG9wOwotCQkJaWYocHJvYy5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJcmV0dXJuIHByb2M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2VzcyBnZXRPd25pbmdQcm9jZXNzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIGdldE93bmluZ1Byb2Nlc3MoKEJyZWFrZG93bkVsZW1lbnQpb2JqZWN0KTsKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gZ2V0T3duaW5nUHJvY2VzcygoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgc291cmNlLAotCQkJTWV0aG9kRWxlbWVudCB0YXJnZXQpIHsKLQkJTWV0aG9kUGx1Z2luIHRhcmdldFBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHRhcmdldCk7Ci0JCU1ldGhvZFBsdWdpbiBzb3VyY2VQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihzb3VyY2UpOwotCQlpZiAoc291cmNlUGx1Z2luID09IHRhcmdldFBsdWdpbikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gTWlzYy5pc0Jhc2VPZih0YXJnZXRQbHVnaW4sIHNvdXJjZVBsdWdpbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPcmRlckluZm8gZ2V0T3JkZXJJbmZvKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIG9yZGVySW5mb05hbWUpIHsKLQkJU3RyaW5nIHN0ciA9IGUuZ2V0T3JkZXJpbmdHdWlkZSgpOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbmV3IFN0cmluZ1Jlc291cmNlKHN0cik7Ci0JCXRyeSB7Ci0JCQlyZXMubG9hZChudWxsKTsKLQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb3MgPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgcmVzCi0JCQkJCS5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9yZGVySW5mb3MuZ2V0T3JkZXJJbmZvcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPcmRlckluZm8gb3JkZXJJbmZvID0gKE9yZGVySW5mbykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9yZGVySW5mb05hbWUuZXF1YWxzSWdub3JlQ2FzZShvcmRlckluZm8uZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gb3JkZXJJbmZvOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm92aWRlcgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaENvbnRyaWJ1dG9ycyhJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIsCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBib29sZWFuIGNvbnRlbnRSZWZyZXNoLAotCQkJYm9vbGVhbiBsYWJlbFVwZGF0ZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRDb250cmlidXRvcnMoKFZhcmlhYmlsaXR5RWxlbWVudCkgbm90aWZpY2F0aW9uCi0JCQkJLmdldE5vdGlmaWVyKCkpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlub3RpZmllci5maXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwKLQkJCQkJZWxlbWVudCwgY29udGVudFJlZnJlc2gsIGxhYmVsVXBkYXRlKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVXNlZCB0byByZWZyZXNoIHBsdWdpbnMgdGhhdCBleHRlbmQgYW5vdGhlcgotCSAqIEBwYXJhbSBub3RpZmllcgotCSAqIEBwYXJhbSBub3RpZmljYXRpb24KLQkgKiBAcGFyYW0gY29udGVudFJlZnJlc2gKLQkgKiBAcGFyYW0gbGFiZWxVcGRhdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFBsdWdpbkV4dGVuZGVycyhJQ2hhbmdlTm90aWZpZXIgbm90aWZpZXIsCi0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBib29sZWFuIGNvbnRlbnRSZWZyZXNoLAotCQkJYm9vbGVhbiBsYWJlbFVwZGF0ZSkgewotCQlPYmplY3Qgb2JqID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IEFzc29jaWF0aW9uSGVscGVyLmdldFBsdWdpbkRpcmVjdEV4dGVuc2lvbnMoCi0JCQkJCSgoTWV0aG9kUGx1Z2luKSBvYmopKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCW5vdGlmaWVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLAotCQkJCQkJZWxlbWVudCwgY29udGVudFJlZnJlc2gsIGxhYmVsVXBkYXRlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGhhc0dlbmVyYWxpemVyKGUsIENvbGxlY3Rpb25zCi0JCQkJLnNpbmdsZXRvbihWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzR2VuZXJhbGl6ZXIoVmFyaWFiaWxpdHlFbGVtZW50IGUsCi0JCQlDb2xsZWN0aW9uIHZhcmlhYmlsaXR5VHlwZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh2YXJpYWJpbGl0eVR5cGVzLmNvbnRhaW5zKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtLCBWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlMaXN0IHNlbGVjdGVkVmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGFsbFZlcyA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtKTsKLQkJZm9yIChpbnQgaT0wOyBpPGFsbFZlcy5zaXplKCk7IGkrKykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYWxsVmVzLmdldChpKTsKLQkJCWlmICh0eXBlID09IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpKSB7Ci0JCQkJc2VsZWN0ZWRWZXMuYWRkKHZlKTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRWZXMuaXRlcmF0b3IoKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0R2VuZXJhbGl6ZXJzKFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJZmluYWwgVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihlLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM5NzgxNDU0Mzk0NDkyOTg0ODNMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCQkuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlcmF0b3IKLQkJCQkJCQkubmV4dCgpOwotCQkJCQlpZiAoKHR5cGUgPT0gbnVsbCkgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgZ2VlbnJhbGl6ZXJzIG9mIGFsbCB0eXBlcywgcmVjdXJzaXZlbHkKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yIGdldEdlbmVyYWxpemVycyhWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0R2VuZXJhbGl6ZXJzKGUsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0Q29udHJpYnV0b3JzKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRHZW5lcmFsaXplcnMoZSwgVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZW1Qcm92aWRlckFkYXB0ZXIgZ2V0QWRhcHRlcihNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlJR3JvdXBDb250YWluZXIgZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkuYWRhcHQocGx1Z2luLAotCQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBwYXRoLmxlbmd0aCAtIDE7IGkrKykgewotCQkJZ3JvdXBzID0gKElHcm91cENvbnRhaW5lcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCQkJaWYgKGdyb3VwcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSXRlbVByb3ZpZGVyQWRhcHRlcikgZ3JvdXBzLmdldEdyb3VwSXRlbVByb3ZpZGVyKHBhdGhbaV0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVmcmVzaEFkYXB0ZXIoTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nW10gcGF0aCwKLQkJCU5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihwbHVnaW4sIHBhdGgpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obXNnLCBhZGFwdGVyLAotCQkJCQl0cnVlLCBmYWxzZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hBZGFwdGVyKFN0cmluZ1tdIHBhdGgsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJRU9iamVjdCBlT2JqID0gbnVsbDsKLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJZU9iaiA9IChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCWVPYmogPSAoRU9iamVjdCkgbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROZXdWYWx1ZSgpKS5nZXQoMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJZU9iaiA9IChFT2JqZWN0KSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCWJyZWFrOwotCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCWVPYmogPSAoRU9iamVjdCkgbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXRPbGRWYWx1ZSgpKS5nZXQoMCk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoZU9iaiAhPSBudWxsKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZU9iaik7Ci0JCQlUbmdVdGlsLnJlZnJlc2hBZGFwdGVyKHBsdWdpbiwgcGF0aCwgbm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoVW5jYXRlZ29yaXplZFRhc2tzSXRlbVByb3ZpZGVyKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQkvLyByZWZyZXNoIHRoZSB1bmNhdGVnb3JpemVkIHRhc2tzIGdyb3VwCi0JCS8vCi0KLQkJcmVmcmVzaEFkYXB0ZXIocGx1Z2luLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1RBU0tTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXIoCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luLCBOb3RpZmljYXRpb24gbXNnKSB7Ci0JCXJlZnJlc2hBZGFwdGVyKHBsdWdpbiwKLQkJCQlMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX0RPTUFJTl9XT1JLUFJPRFVDVFNfUEFUSCwKLQkJCQltc2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoV29ya1Byb2R1Y3RUeXBlVW5jYXRlZ29yaXplZChNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoQWRhcHRlcigKLQkJCQlwbHVnaW4sCi0JCQkJTGlicmFyeUVkaXRDb25zdGFudHMuVU5DQVRFR09SSVpFRF9XT1JLUFJPRFVDVFRZUEVfV09SS1BST0RVQ1RTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdHNJdGVtUHJvdmlkZXJzKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiwgTm90aWZpY2F0aW9uIG1zZykgewotCQlyZWZyZXNoRG9tYWluVW5jYXRlZ29yaXplZFdvcmtQcm9kdWN0c0l0ZW1Qcm92aWRlcihwbHVnaW4sIG1zZyk7Ci0JCXJlZnJlc2hXb3JrUHJvZHVjdFR5cGVVbmNhdGVnb3JpemVkKHBsdWdpbiwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRSb2xlc0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIocGx1Z2luLCBMaWJyYXJ5RWRpdENvbnN0YW50cy5VTkNBVEVHT1JJWkVEX1JPTEVTX1BBVEgsCi0JCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmcmVzaFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yc0l0ZW1Qcm92aWRlcigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIE5vdGlmaWNhdGlvbiBtc2cpIHsKLQkJcmVmcmVzaEFkYXB0ZXIocGx1Z2luLAotCQkJCUxpYnJhcnlFZGl0Q29uc3RhbnRzLlVOQ0FURUdPUklaRURfVE9PTE1FTlRPUlNfUEFUSCwgbXNnKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVdyYXBwZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4KSB7Ci0JCWlmIChGZWF0dXJlTWFwVXRpbC5pc0ZlYXR1cmVNYXAoZmVhdHVyZSkpIHsKLQkJCXZhbHVlID0gbmV3IEZlYXR1cmVNYXBFbnRyeVdyYXBwZXJJdGVtUHJvdmlkZXIoCi0JCQkJCShGZWF0dXJlTWFwLkVudHJ5KSB2YWx1ZSwgb2JqZWN0LCAoRUF0dHJpYnV0ZSkgZmVhdHVyZSwKLQkJCQkJaW5kZXgsIGFkYXB0ZXJGYWN0b3J5LCBudWxsKTsKLQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJdmFsdWUgPSBuZXcgQXR0cmlidXRlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyKHZhbHVlLCBvYmplY3QsCi0JCQkJCShFQXR0cmlidXRlKSBmZWF0dXJlLCBpbmRleCwgYWRhcHRlckZhY3RvcnksIG51bGwpOwotCQl9IGVsc2UgaWYgKCEoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzQ29udGFpbm1lbnQoKSkgewotCQkJdmFsdWUgPSBuZXcgRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcihmZWF0dXJlLCB2YWx1ZSwgb2JqZWN0LAotCQkJCQlhZGFwdGVyRmFjdG9yeSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKEd1aWRhbmNlIGd1aWRhbmNlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZ3VpZGFuY2UuZUNvbnRhaW5lcigpOwotCQlpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgaXRlbVByb3ZpZGVyID0gKENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyKSBUbmdVdGlsCi0JCQkJLmdldEFkYXB0ZXIoY29udGFpbmVyLCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5jbGFzcyk7Ci0JCXJldHVybiBpdGVtUHJvdmlkZXIgIT0gbnVsbCA/IGl0ZW1Qcm92aWRlci5nZXRHdWlkYW5jZXMoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TmF2aWdhdG9yUGFyZW50SXRlbVByb3ZpZGVyKFdvcmtQcm9kdWN0IG9iamVjdCkgewotCQlFT2JqZWN0IGNvbnRlbnRQa2cgPSBvYmplY3QuZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGVudFBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyIGl0ZW1Qcm92aWRlciA9IChDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcikgVG5nVXRpbAotCQkJCS5nZXRBZGFwdGVyKGNvbnRlbnRQa2csIENvbnRlbnRQYWNrYWdlSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJcmV0dXJuIGl0ZW1Qcm92aWRlciAhPSBudWxsID8gaXRlbVByb3ZpZGVyLmdldFdvcmtQcm9kdWN0cygpIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlPYmplY3QgYWRhcHRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhZGFwdGVyID0gdW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuYWRhcHQob2JqZWN0LAotCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSXRlbUxhYmVsUHJvdmlkZXIpIHsKLQkJCQlyZXR1cm4gKChJSXRlbUxhYmVsUHJvdmlkZXIpIGFkYXB0ZXIpLmdldEltYWdlKG9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihhZGFwdGVyICE9IG9iamVjdCAmJiBhZGFwdGVyIGluc3RhbmNlb2YgSURpc3Bvc2FibGUpIHsKLQkJCQkoKElEaXNwb3NhYmxlKWFkYXB0ZXIpLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgY29sTmFtZSkgewotCQkvLyBpZihjb2xOYW1lID09IElCU0l0ZW1Qcm92aWRlci5DT0xfVFlQRSkKLQkJLy8gaWYoY29sTmFtZSA9PSBJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUpCi0JCWlmIChjb2xOYW1lID09IElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCXJldHVybiBnZXRJbWFnZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE1vdmUgZWxlbWVudCB1cCB3aXRoaW5nIHRoZSBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZWxlbWVudE9iagotCSAqIEBwYXJhbSBlQ2xhc3NlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbW92ZVVwKEFjdGl2aXR5IGFjdGl2aXR5LCBPYmplY3QgZWxlbWVudE9iaiwKLQkJCUNvbGxlY3Rpb24gZUNsYXNzZXMsIElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlNb3ZlVXBDb21tYW5kIGNtZCA9IG5ldyBNb3ZlVXBDb21tYW5kKGFjdGl2aXR5LCBlbGVtZW50T2JqLCBlQ2xhc3Nlcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50IGRvd24gd2l0aGluIHRoZSBwYXJlbnQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiBAcGFyYW0gZWxlbWVudE9iagotCSAqIEBwYXJhbSBlQ2xhc3NlcwotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbW92ZURvd24oQWN0aXZpdHkgYWN0aXZpdHksIE9iamVjdCBlbGVtZW50T2JqLAotCQkJQ29sbGVjdGlvbiBlQ2xhc3NlcywgSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyKSB7Ci0JCU1vdmVEb3duQ29tbWFuZCBjbWQgPSBuZXcgTW92ZURvd25Db21tYW5kKGFjdGl2aXR5LCBlbGVtZW50T2JqLAotCQkJCWVDbGFzc2VzKTsKLQkJYWN0aW9uTWdyLmV4ZWN1dGUoY21kKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEN1c3RvbUNhdGVnb3J5IGNyZWF0ZVJvb3RDdXN0b21DYXRlZ29yeSgKLQkJCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnKSB7Ci0JCS8vIGNyZWF0ZSByb290IGN1c3RvbSBjYXRlZ29yeQotCQkvLwotCQlDdXN0b21DYXRlZ29yeSByb290Q3VzdG9tQ2F0ZWdvcnkgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpOwotCQlyb290Q3VzdG9tQ2F0ZWdvcnkuc2V0TmFtZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCS5nZXRTdHJpbmcoIl9VSV9DdXN0b21fQ2F0ZWdvcmllc19ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQlDb250ZW50UGFja2FnZSBoaWRkZW5Qa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShjdXN0b21DYXRlZ29yeVBrZwotCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCksIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQlpZiAoaGlkZGVuUGtnID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBoaWRkZW4gcGFja2FnZSB0byBzdG9yZSB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkKLQkJCS8vCi0JCQloaWRkZW5Qa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJaGlkZGVuUGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCQljdXN0b21DYXRlZ29yeVBrZy5nZXRDaGlsZFBhY2thZ2VzKCkuYWRkKGhpZGRlblBrZyk7Ci0JCX0KLQkJaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmFkZChyb290Q3VzdG9tQ2F0ZWdvcnkpOwotCi0JCXJldHVybiByb290Q3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDdXN0b21DYXRlZ29yeSBnZXRSb290Q3VzdG9tQ2F0ZWdvcnkoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlDb250ZW50UGFja2FnZSBjdXN0b21DYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCWlmIChjdXN0b21DYXRlZ29yeVBrZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGN1c3RvbUNhdGVnb3J5UGtnCi0JCQkJLmdldENoaWxkUGFja2FnZXMoKSwgTW9kZWxTdHJ1Y3R1cmUuSElEREVOX1BBQ0tBR0VfTkFNRSk7Ci0JCWlmIChoaWRkZW5Qa2cgIT0gbnVsbCAmJiAhaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgaGlkZGVuUGtnLmdldENvbnRlbnRFbGVtZW50cygpLmdldCgwKTsKLQkJfQotCQlDdXN0b21DYXRlZ29yeSByb290ID0gY3JlYXRlUm9vdEN1c3RvbUNhdGVnb3J5KGN1c3RvbUNhdGVnb3J5UGtnKTsKLQkJLy8gY29kZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eTogYWRkIGFsbCB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgdW5kZXIKLQkJLy8gY3VzdG9tQ2F0ZWdvcnlQa2cKLQkJLy8gdG8gdGhlIGNvbnRlbnQgZWxlbWVudCByZWZlcmVuY2UgbGlzdCBvZiB0aGUgcm9vdCBjdXN0b20gY2F0ZWdvcnkgc28KLQkJLy8gdGhleSBjYW4gYmUgdmlzaWJsZQotCQkvLyBpbiB0aGUgbmV3IFVJCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGN1c3RvbUNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyb290LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGQoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUm9vdEN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCUVPYmplY3QgcGtnID0gY2F0ZWdvcnkuZUNvbnRhaW5lcigpOwotCQlpZiAocGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkmJiBNb2RlbFN0cnVjdHVyZS5ISURERU5fUEFDS0FHRV9OQU1FCi0JCQkJCQkuZXF1YWxzKCgoQ29udGVudFBhY2thZ2UpIHBrZykuZ2V0TmFtZSgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Jvb3RDdXRvbUNhdGVnb3J5UGFja2FnZShNZXRob2RQYWNrYWdlIHBrZykgewotCQlpZiAoICEocGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHx8Ci0JCQkJIU1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUKLQkJCQkJCS5lcXVhbHMocGtnLmdldE5hbWUoKSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIHRoZSBwbHVnaW4gYW5kIG1ha2Ugc3VyZSBpdCdzIHRoZSBvYmplY3QsIFRPRE8KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlcyByZXNvdXJjZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCdzIGNvbnRhaW5lciBpZiB0aGlzIGhhcyBiZWVuIG1vZGlmaWVkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUNvbnRhaW5lclJlc291cmNlKEVPYmplY3QgZWxlbWVudCwKLQkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlcikgewotCQkvLyBzYXZlIGNvbnRhaW5lcidzIHJlc291cmNlCi0JCWlmIChlbGVtZW50LmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGVyc2lzdGVyLnNhdmUocmVzb3VyY2UpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRDYXRlZ29yeSBmaW5kQ29udHJpYnV0b3IoQ29udGVudFBhY2thZ2UgY2F0ZWdvcnlQa2csCi0JCQlDb250ZW50Q2F0ZWdvcnkgYmFzZUNhdGVnb3J5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNhdGVnb3J5UGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNhdCA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGNhdC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gYmFzZUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIGNhdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJaWYgKCFjYXRlZ29yeS5nZXRDb25jZXB0c0FuZFBhcGVycygpLmlzRW1wdHkoKQotCQkJCXx8ICFjYXRlZ29yeS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiAoKERpc2NpcGxpbmUpIGNhdGVnb3J5KS5nZXRUYXNrcygpLmlzRW1wdHkoKTsKLQkJfSBlbHNlIGlmIChjYXRlZ29yeSBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuICgoRG9tYWluKSBjYXRlZ29yeSkuZ2V0V29ya1Byb2R1Y3RzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgUm9sZVNldCkgewotCQkJcmV0dXJuICgoUm9sZVNldCkgY2F0ZWdvcnkpLmdldFJvbGVzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgVG9vbCkgewotCQkJcmV0dXJuICgoVG9vbCkgY2F0ZWdvcnkpLmdldFRvb2xNZW50b3JzKCkuaXNFbXB0eSgpOwotCQl9IGVsc2UgaWYgKGNhdGVnb3J5IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQlyZXR1cm4gKChXb3JrUHJvZHVjdFR5cGUpIGNhdGVnb3J5KS5nZXRXb3JrUHJvZHVjdHMoKS5pc0VtcHR5KCk7Ci0JCX0gZWxzZSBpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgdXNlckRlZmluZWRDYXRlZ29yeSA9ICgoQ3VzdG9tQ2F0ZWdvcnkpIGNhdGVnb3J5KTsKLQkJCXJldHVybiB1c2VyRGVmaW5lZENhdGVnb3J5LmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5pc0VtcHR5KCkKLQkJCS8vICYmIHVzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2V0U3ViQ2F0ZWdvcmllcygpLmlzRW1wdHkoKQotCQkJOwotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjYXRlZ29yeTogIiArIGNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvcmRlcgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9QYWNrYWdlKFdvcmtPcmRlciBvcmRlciwgQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0JCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZChvcmRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3JkZXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUZyb21QYWNrYWdlKFdvcmtPcmRlciBvcmRlciwgQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0JCWlmKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkoKFByb2Nlc3NQYWNrYWdlKSBjb250YWluZXIpLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZShvcmRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlUHJlZGVjZXNzb3JMaXN0Q2hhbmdlKAotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCWlmIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCWFkZFRvUGFja2FnZSgoV29ya09yZGVyKSBub3RpZmljYXRpb24uZ2V0TmV3VmFsdWUoKSwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlhZGRUb1BhY2thZ2UoKFdvcmtPcmRlcikgaXRlci5uZXh0KCksCi0JCQkJCQkJCShCcmVha2Rvd25FbGVtZW50KSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlyZW1vdmVGcm9tUGFja2FnZSgoV29ya09yZGVyKSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKSwKLQkJCQkJCQkoQnJlYWtkb3duRWxlbWVudCkgbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWToKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0T2xkVmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlyZW1vdmVGcm9tUGFja2FnZSgoV29ya09yZGVyKSBpdGVyLm5leHQoKSwKLQkJCQkJCQkJKEJyZWFrZG93bkVsZW1lbnQpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQotCQkJCX0KLQotCQkJCWFkYXB0ZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sCi0JCQkJCQlub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGFsbCB0aGUgZ2xvYmFsIHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgZ2xvYmFsIHBhY2thZ2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PENvbnRlbnRQYWNrYWdlPiBnZXRHbG9iYWxQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUFycmF5TGlzdDxDb250ZW50UGFja2FnZT4gcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRQYWNrYWdlPigpOwotCQlTdHJpbmdbXVtdIGNhdGVnb3J5UGF0aHMgPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmdldENhdGVnb3J5UGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeVBhdGhzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBwYXRoID0gY2F0ZWdvcnlQYXRoc1tpXTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCQlwYXRoKTsKLQkJCWlmIChjYXRlZ29yeVBrZyAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZXMuYWRkKGNhdGVnb3J5UGtnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYWNrYWdlczsKLQl9Ci0KLQkKLQkvKioKLQkgKiByZXR1cm4gYWxsIHRoZSBjb250ZW50IGNhdGVnb3J5IHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbi4gCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBnbG9iYWwgcGFja2FnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8Q29udGVudFBhY2thZ2U+IGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIGdldEdsb2JhbFBhY2thZ2VzKHBsdWdpbik7Ci0JfQotCQotCQotCS8qKgotCSAqIHJldHVybiBhbGwgdGhlIHN5c3RlbSBkZWZpbmVkIHBhY2thZ2VzIGZvciB0aGUgbWV0aG9kIHBsdWdpbgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgYWxsIHN5c3RlbSBwYWNrYWdlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxTeXN0ZW1QYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUFycmF5TGlzdCBwYWNrYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nW11bXSBwYXRocyA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZ2V0QWxsU3lzdGVtUGF0aHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gcGF0aCA9IHBhdGhzW2ldOwotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwgcGF0aCk7Ci0JCQlpZiAocGtnICE9IG51bGwgJiYgIXBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQlwYWNrYWdlcy5hZGQocGtnKTsKLQkJCQlFT2JqZWN0IG8gPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCXdoaWxlICgobyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpICYmICFwYWNrYWdlcy5jb250YWlucyhvKSkgewotCQkJCQlwYWNrYWdlcy5hZGQobyk7Ci0JCQkJCW8gPSBvLmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbHNvIGFkZCB0aGUgaGlkZGVuIGNvc3RvbSBjYXRlZ29yeSBwYWNrYWdlCi0JCUNvbnRlbnRQYWNrYWdlIGN1c3RvbUNhdGVnb3J5UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UocGx1Z2luLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5UGtnICE9IG51bGwpIHsKLQkJCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQljdXN0b21DYXRlZ29yeVBrZy5nZXRDaGlsZFBhY2thZ2VzKCksCi0JCQkJCU1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJaWYgKGhpZGRlblBrZyAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZXMuYWRkKGhpZGRlblBrZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJlZGVmaW5lZChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeQotCQkJCSYmIGlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJU3RyaW5nIHBhdGggPSBNb2RlbFN0cnVjdHVyZQotCQkJCS50b0ZpbGVQYXRoKE1pc2MuZ2V0UGF0aFJlbGF0aXZlVG9QbHVnaW4oZSkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBNb2RlbFN0cnVjdHVyZS5BTExfUFJFREVGSU5FRF9QQVRIUy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwcmVkZWZpbmVQYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocHJlZGVmaW5lUGF0aC5zdGFydHNXaXRoKHBhdGgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RQYWNrYWdlIGdldE1ldGhvZFBhY2thZ2UoRU9iamVjdCBlKSB7Ci0JCWZvciAoOyAhKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAmJiBlICE9IG51bGw7IGUgPSBlLmVDb250YWluZXIoKSkKLQkJCTsKLQkJcmV0dXJuIChNZXRob2RQYWNrYWdlKSBlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZ2V0UGFyZW50TWV0aG9kUGFja2FnZShFT2JqZWN0IGUpIHsKLQkJRU9iamVjdCBlb2JqID0gZTsKLQkJd2hpbGUoZW9iaiAhPSBudWxsKSB7Ci0JCQllb2JqID0gZW9iai5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoZW9iaiA9PSBudWxsICkgewotCQkJCXJldHVybiBudWxsOwotCQkJfSBlbHNlIGlmIChlb2JqIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCXJldHVybiAoTWV0aG9kUGFja2FnZSkgZW9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1nciBpZiBub3QgbnVsbCwgd2lsbCB1c2UgdGhlIGdpdmVuIElBY3Rpb25NYW5hZ2VyIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiwgb3RoZXJ3aXNlIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBjaGFuZ2VkIGRpcmVjdGx5Ci0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSk7Ci0JCUxpc3QgcGtnU2VscyA9IG5ldyBBcnJheUxpc3QoY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zVG9BZGQgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJTGlzdDxNZXRob2RQYWNrYWdlPiBwYWNrYWdlc1RvQWRkID0gbmV3IEFycmF5TGlzdDxNZXRob2RQYWNrYWdlPigpOwotCi0JCS8vIG1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgcGFja2FnZXMgYXJlIHNlbGVjdGVkLgotCQkvLyBpZiBhIHBhY2thZ2UgaXMgc2VsZWN0ZWQsIGFsbCB0aGUgcGFyZW50IHBhY2thZ2VzIG11c3QgYmUgc2VsZWN0ZWQuCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChwa2dTZWxzKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSlpdC5uZXh0KCk7Ci0JCQlFT2JqZWN0IGMgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJd2hpbGUgKCAoKGMgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB8fCAoYyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIAotCQkJCQkmJiAhcGtnU2Vscy5jb250YWlucyhjKSAmJiAhcGx1Z2lucy5jb250YWlucyhjKSApIHsKLQkJCQlpZiAoYyBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlwbHVnaW5zLmFkZChjKTsKLQkJCQkJcGx1Z2luc1RvQWRkLmFkZCgoTWV0aG9kUGx1Z2luKWMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBrZ1NlbHMuYWRkKGMpOwotCQkJCQlwYWNrYWdlc1RvQWRkLmFkZCgoTWV0aG9kUGFja2FnZSljKTsKLQkJCQl9Ci0JCQkJCi0JCQkJYyA9IGMuZUNvbnRhaW5lcigpOwotCQkJfQkKLQkJCQotCQkJLy8gaWYgdGhlIHBhY2thZ2UgaXMgYSBQcm9jZXNzQ29tcG9uZW50LCBzZWxlY3QgYWxsIHRoZSBjaGlsZCBwYWNrYWdlcwotCQkJaWYgKCBwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ICkgewotCQkJCUxpc3Qgb2xkUGtnU2VscyA9IG5ldyBBcnJheUxpc3QocGtnU2Vscyk7Ci0JCQkJZ2V0QWxsQ2hpbGRQYWNrYWdlcyhwa2csIHBrZ1NlbHMpOwotCQkJCXBrZ1NlbHMucmVtb3ZlQWxsKG9sZFBrZ1NlbHMpOwotCQkJCXBhY2thZ2VzVG9BZGQuYWRkQWxsKHBrZ1NlbHMpOwotCQkJfQotCQl9Ci0JCUNvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBsdWdpbkxpc3QoYWN0aW9uTWdyLCBjb25maWcsIHBsdWdpbnNUb0FkZCk7Ci0JCUNvbmZpZ3VyYXRpb25VdGlsLmFkZENvbGxUb01ldGhvZFBhY2thZ2VMaXN0KGFjdGlvbk1nciwgY29uZmlnLCBwYWNrYWdlc1RvQWRkKTsKLQkJcGtnU2VscyA9IG5ldyBBcnJheUxpc3QoY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gbWFrZSBzdXJlIGFsbCBzeXN0ZW0gcGFja2FnZXMgYXJlIHNlbGVjdGVkCi0JCUxpc3Q8TWV0aG9kUGFja2FnZT4gc3lzUGFja2FnZXNUb0FkZCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGFja2FnZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdHAgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRwLm5leHQoKTsKLQkJCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcGtnID0gaXQubmV4dCgpOwotCQkJCWlmICghcGtnU2Vscy5jb250YWlucyhwa2cpICYmIHBrZyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJcGtnU2Vscy5hZGQocGtnKTsKLQkJCQkJc3lzUGFja2FnZXNUb0FkZC5hZGQoKE1ldGhvZFBhY2thZ2UpcGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQ29uZmlndXJhdGlvblV0aWwuYWRkQ29sbFRvTWV0aG9kUGFja2FnZUxpc3QoYWN0aW9uTWdyLCBjb25maWcsIHN5c1BhY2thZ2VzVG9BZGQpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIGNoaWxkIHBhY2thZ2VzIG9mIHRoZSBnaXZlbiBNZXRob2RQYWNrYWdlIGFuZCBhZGQgdG8gdGhlIGxpc3QKLQkgKiBAcGFyYW0gcGtnIE1ldGhvZFBhY2thZ2UKLQkgKiBAcGFyYW0gcmVzdWx0IExpc3QgdGhlIHBhY2thZ2VzIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBbGxDaGlsZFBhY2thZ2VzKE1ldGhvZFBhY2thZ2UgcGtnLCBMaXN0IHJlc3VsdCkgewotCQlMaXN0IHBrZ3MgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQkKLQkJLy8gb25seSBhZGQgdW5pcXVlIGl0ZW1zCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IHAgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoICFyZXN1bHQuY29udGFpbnMocCkgKSB7Ci0JCQkJcmVzdWx0LmFkZChwKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWdldEFsbENoaWxkUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGl0Lm5leHQoKSwgcmVzdWx0KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBvYmplY3QncyBtZXRob2QgcGFja2FnZSBhbmQgcGx1Z2luIHRvIHRoZSBnaXZlbgotCSAqIGNvbmZpZ3VyYXRpb24gaWYgdGhleSBhcmUgbm90IGluIHRoZSBjb25maWd1cmF0aW9uIHlldC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHBhcmFtIG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUbyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRU9iamVjdCBvYmplY3QsCi0JCQlTZXQgYWRkZWRPYmplY3RzKSB7Ci0JCU1ldGhvZFBhY2thZ2UgcGtnID0gZ2V0TWV0aG9kUGFja2FnZShvYmplY3QpOwotCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCWlmICghY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jb250YWlucyhwa2cpKSB7Ci0JCQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJCQlhZGRlZE9iamVjdHMuYWRkKHBrZyk7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCQkJCi0JCQkJLy8gMTUwNTUyIC0gUHJvY2Vzc2VzOiBJZiBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQgYnkgaXRzZWxmIGR1ZSB0byBhY3Rpb25zIGxpa2UgQ1AgZXh0ZW5kaWluZyBvciBkZWVwIGNvcHksIAotCQkJCS8vIHRoZXJlIGlzIGEgcmVmcmVzaCBpc3N1ZS4KLQkJCQkvLyBtaXNzaW5nIHRoZSAiISIgaGVyZSEKLQkJCQlpZiAoIWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJCQkJYWRkZWRPYmplY3RzLmFkZChwbHVnaW4pOwotCQkJCQotCQkJCQkvLyBuZWVkIHRvIHZhbGlkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBtYWtlIHN1cmUgYWxsIHJlbGF0ZWQgc3lzdGVtIHBhY2thZ2VzIGFyZSBzZWxlY3RlZC4KLQkJCQkJLy8gb3RoZXJ3aXNlIHRoZSBjb25maWd1cmF0aW9uIGV4cGxvcmVyIHdpbGwgbm90IHdvcmsKLQkJCQkJLy8gMTUwNTUyIC0gUHJvY2Vzc2VzOiBJZiBjb25maWd1cmF0aW9uIGlzIHVwZGF0ZWQgYnkgaXRzZWxmIGR1ZSB0byBhY3Rpb25zIGxpa2UgQ1AgZXh0ZW5kaWluZyBvciBkZWVwIGNvcHksIHRoZXJlIGlzIGEgcmVmcmVzaCBpc3N1ZS4JCQotCQkJCQl2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24obnVsbCwgY29uZmlnKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhZGRUb0NvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlFT2JqZWN0IG9iamVjdCwgU2V0IGFkZGVkT2JqZWN0cykgewotCQlpbnQgc2l6ZSA9IGFkZGVkT2JqZWN0cy5zaXplKCk7Ci0JCWFkZFRvKGNvbmZpZywgb2JqZWN0LCBhZGRlZE9iamVjdHMpOwotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCS8vIGFkZCBhbGwgdGhlIGJhc2UgZWxlbWVudHMgaWYgdGhlcmUgaXMgYW55Ci0JCQlmb3IgKFZhcmlhYmlsaXR5RWxlbWVudCBjID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iamVjdCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsgYyAhPSBudWxsOyBjID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgYwotCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSB7Ci0JCQkJYWRkVG8oY29uZmlnLCBjLCBhZGRlZE9iamVjdHMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFkZGVkT2JqZWN0cy5zaXplKCkgPiBzaXplOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZQotCSAqICAgICAgICAgICAgdXNlZCB0byBwYXJlbnQgYW55IGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRvIGF2b2lkIGFueSBkaXJlY3QgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrRWRpdChFT2JqZWN0IGVPYmosIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmICgoKEludGVybmFsRU9iamVjdCkgZU9iaikuZVByb3h5VVJJKCkgIT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyBhIHVucmVzb2x2ZWQgcHJveHksIGRpc2FsbG93IGVkaXRpbmcgaXQKLQkJCS8vCi0JCQlFT2JqZWN0IHByb3h5ID0gZU9iajsKLQkJCVN0cmluZyB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJveHkpLmVQcm94eVVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJIGNvbnRhaW5lclVSSSA9IHByb3h5LmVDb250YWluZXIoKSAhPSBudWxsID8gcHJveHkKLQkJCQkJLmVDb250YWluZXIoKS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQk6IG51bGw7Ci0JCQlTdHJpbmcgbG9jYXRpb247Ci0JCQlpZiAoY29udGFpbmVyVVJJICE9IG51bGwpIHsKLQkJCQlsb2NhdGlvbiA9IGNvbnRhaW5lclVSSSAhPSBudWxsICYmIGNvbnRhaW5lclVSSS5pc0ZpbGUoKSA/IGNvbnRhaW5lclVSSS50b0ZpbGVTdHJpbmcoKQotCQkJCQkJOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChsb2NhdGlvbi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCWxvY2F0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJIiBpbiAnJ3swfScnIiwgbmV3IE9iamVjdFtdIHsgbG9jYXRpb24gfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChMaWJyYXJ5RWRpdFJlc291cmNlcy51bnJlc29sdmVkT2JqZWN0RXJyb3JfcmVhc29uCi0JCQkJCSwgbmV3IE9iamVjdFtdIHsgcHJveHkuZUNsYXNzKCkuZ2V0TmFtZSgpLCB1cmksIGxvY2F0aW9uIH0pOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCAwLCBtc2csIG51bGwpOwotCQl9CQkJCQotCQkKLQkJSUFjY2Vzc0NvbnRyb2xsZXIgYWMgPSBTZXJ2aWNlcy5nZXRBY2Nlc3NDb250cm9sbGVyKCk7Ci0JCWlmKGFjID09IG51bGwpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBhYy5jaGVja01vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVPYmopLCBjb250ZXh0KTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2sgdGhlIGdpdmVuIGVsZW1lbnQgZm9yIG1vZGlmaWFibGUKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEB0aHJvd3MgTWVzc2FnZUV4Y2VwdGlvbiBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tNb2RpZnkoRU9iamVjdCBlKSB7Ci0JCUlBY2Nlc3NDb250cm9sbGVyIGFjID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpOwotCQlpZihhYyAhPSBudWxsKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGFjLmNoZWNrTW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZSksIG51bGwpOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFVtYVV0aWwuZ2V0TWVzc2FnZShzdGF0dXMpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQlPYmplY3Qgb2JqOwotCQkJCQlpZihlLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCQlvYmogPSBlLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb2JqID0gZTsgCi0JCQkJCX0KLQkJCQkJbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoVW1hUmVzb3VyY2VzLmVycl9jYW5ub3RNb2RpZnkwLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IG9iaiB9KTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IE1lc3NhZ2VFeGNlcHRpb24obXNnKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1zZyA9IHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcihtc2cpOwotCQkJSVN0YXR1cyBzdGF0dXNlc1tdID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1c2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQoc3RhdHVzZXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCW1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCB8fCBtc2cubGVuZ3RoKCkgPT0gMCkgewotCQkJbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudXRpbF90bmd1dGlsX2Nhbm5vdF9lZGl0X3Jlc291cmNlOyAKLQkJfQotCQlyZXR1cm4gbXNnOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlcGxhY2VyKFZhcmlhYmlsaXR5RWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRyaWJ1dG9yT3JSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZSkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXJldHVybiBiYXNlICE9IG51bGwgJiYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTIHx8IHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHZW5lcmFsaXplcihPYmplY3Qgb2JqLCBDb2xsZWN0aW9uIHR5cGVzKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIG9iajsKLQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodHlwZXMgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gdHlwZXMuY29udGFpbnModmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVUZXh0KFN0cmluZyB0eXBlS2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV8iICsgdHlwZUtleSArICJfdHlwZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTdHJpbmcoIl9VSV9Vbmtub3duX3R5cGUiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIHVzZXIgZnJpZW5kbHkgdHlwZSBuYW1lIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVUZXh0KEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0VHlwZVRleHQoZWxlbWVudC5lQ2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSB1c2VyLWZyaWVuZGx5IHR5cGUgbmFtZSBmb3IgYSBnaXZlbiB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFR5cGVUZXh0KEVDbGFzcyB0eXBlKSB7Ci0JCXJldHVybiBnZXRUeXBlVGV4dCh0eXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBsb29rcyB1cCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVhdHVyZVRleHQoT2JqZWN0IGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCXJldHVybiBnZXRGZWF0dXJlVGV4dCgoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiVW5rbm93biI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGxvY2tlZC4gQW4gb2JqZWN0IGlzIGNvbnNpZGVyZWQgbG9ja2VkIGlmCi0JICogaXRzIE1ldGhvZFBsdWdpbiBoYXMgdGhlIGF0dHJpYnV0ZSB1c2VyQ2hhbmdlYWJsZSBzZXQgdG8gZmFsc2UuIFRoZQotCSAqICdsb2NrZWQnIHN0YXR1cyBvZiBhbiBvYmplY3QgaXMgaW5kZXBlbmRlbnQgZnJvbSAncmVhZC1vbmx5JyBzdGF0dXMgb2YKLQkgKiBpdHMgcmVzb3VyY2UgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvY2tlZChFT2JqZWN0IG9iamVjdCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4ob2JqZWN0KTsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gIXBsdWdpbi5nZXRVc2VyQ2hhbmdlYWJsZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0V4aXN0KENvbGxlY3Rpb24gd3JhcHBlcnMsIE9iamVjdCBlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB3cmFwcGVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IHVud3JhcChpdGVyYXRvci5uZXh0KCkpOwotCQkJaWYgKGVsZW1lbnQgPT0gZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgaW5kZXggb2YgZWxlbWVudCBvciBpdHMgd3JhcHBlciBpbiB0aGUgZ2l2ZW4gbGlzdAotCSAqIEBwYXJhbSBsaXN0IGEgbWl4ZWQgbGlzdCBvZiBlbGVtZW50IGFuZCB3cmFwcGVyCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIC0xIGlmIHRoZSBlbGVtZW50IG9yIGl0cyB3cmFwcGVyIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEluZGV4T2YoTGlzdCBsaXN0LCBPYmplY3QgZSkgewotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSB1bndyYXAobGlzdC5nZXQoaSkpOwotCQkJaWYoZWxlbWVudCA9PSBlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRhaW5pbmdGZWF0dXJlKE9iamVjdCBvYmplY3QsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iamVjdCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgcGFyZW50ID0gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQkJaWYgKCEocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJYWRhcHRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KHBhcmVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIpIHsKLQkJCUVPYmplY3QgcGFyZW50RU9iaiA9IChFT2JqZWN0KSBwYXJlbnQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpCi0JCQkJCS5nZXRDaGlsZHJlbkZlYXR1cmVzKHBhcmVudCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoZi5pc01hbnkoKSkgewotCQkJCQlpZiAoKChDb2xsZWN0aW9uKSBwYXJlbnRFT2JqLmVHZXQoZikpLmNvbnRhaW5zKG9iamVjdCkpIHsKLQkJCQkJCXJldHVybiBmOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHBhcmVudEVPYmouZUdldChmKSA9PSBvYmplY3QpIHsKLQkJCQkJCXJldHVybiBmOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgdXNlci1mcmllbmRseSBuYW1lIGZvciBhIGdpdmVuIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVhdHVyZVRleHQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3dpdGNoIChmZWF0dXJlLmdldEZlYXR1cmVJRCgpKSB7Ci0JCS8vIGNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCS8vIHJldHVybiAiUHJpbWFyeSBQZXJmb3JtZXIiOwotCQkvLyBjYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkvLyByZXR1cm4gIlNlY29uZGFyeSBQZXJmb3JtZXIiOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCXJldHVybiBMaWJyYXJ5RWRpdFJlc291cmNlcy5hc3Npc3RzX3RleHQ7IAotCQl9Ci0KLQkJU3RyaW5nIGZlYXR1cmVLZXk7Ci0JCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgRVN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlOwotCQkJZmVhdHVyZUtleSA9IGVGZWF0dXJlLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXROYW1lKCkKLQkJCQkJKyAiXyIgKyBlRmVhdHVyZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVLZXkgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy51bmtub3duX3RleHQ7IAotCQl9Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJLmdldFN0cmluZygiX1VJXyIgKyBmZWF0dXJlS2V5ICsgIl9mZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlicmFyeSByb290IHBhdGggZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBhc3N1bWluZyB0aGUgZWxlbWVudCBhbmQKLQkgKiBpdCdzIHBhcmVudHMgYXJlIGxvYWRlZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBGaWxlIHRoZSByb290IHBhdGggb2YgdGhlIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0TGlicmFyeVJvb3RQYXRoKEVPYmplY3QgZWxlbWVudCkgewotCQlFT2JqZWN0IHBhcmVudCA9IGVsZW1lbnQ7Ci0JCXdoaWxlICgocGFyZW50ICE9IG51bGwpICYmICEocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXBhcmVudCA9IHBhcmVudC5lQ29udGFpbmVyKCk7Ci0JCX0KLQotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgdXJpID0gcGFyZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJU3RyaW5nIHBhdGggPSB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXJldHVybiBmLmdldFBhcmVudEZpbGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZ1bGwgcGF0aCBVUkkgYnkgYXBwZW5kaW5nIHRoZSByZWxhdGl2ZSBwYXRoIFVSSSB0byB0aGUgb2JqZWN0J3MKLQkgKiBsaWJyYXJ5IHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqICAgICAgICAgICAgRU9iamVjdCB0aGUgb2JqZWN0IHRvIGZpbmQgdGhlIE1ldGhvZExpYnJhcnksIGNhbiBiZSBhbnkKLQkgKiAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkgdG8gYmUgZml4ZWQKLQkgKiBAcmV0dXJuIFVSSSB0aGUgZnVsbCBwYXRoIHVyaQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIGdldEZ1bGxQYXRoVVJJKEVPYmplY3QgbywgVVJJIHVyaSkgewotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXJldHVybiB1cmk7Ci0JCX0KLQotCQkvLyB0cnkgaWYgdGhpcyBpcyBhIHZhbGlkIFVSTCBvciBub3QKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSB1cmkudG9VUkwoKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCXJldHVybiB1cmk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJOyAvLyBub3QgYSB2YWxpZCB1cmwsIG1heWJlIGEgcmVsYXRpdmUgcGF0aAotCQl9Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQncyByZXNvdXJjZSBwYXRoCi0JCUZpbGUgZiA9IGdldExpYnJhcnlSb290UGF0aChvKTsKLQkJaWYgKGYgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBGaWxlKGYsIE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJpLnRvU3RyaW5nKCkpKS50b1VSSSgpOwotCQl9Ci0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBUbyBnZXQgdGhlIG5vZGUgaWNvbi9zaGFwZSBpY29uIGZ1bGwgcGF0aCBVUkkgYnkgYXBwZW5kaW5nIHRoZSByZWxhdGl2ZSBwYXRoIFVSSSB0byB0aGUgb2JqZWN0J3MKLQkgKiBsaWJyYXJ5IHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gbwotCSAqICAgICAgICAgICAgRU9iamVjdCB0aGUgb2JqZWN0IHRvIGZpbmQgdGhlIE1ldGhvZExpYnJhcnksIGNhbiBiZSBhbnkKLQkgKiAgICAgICAgICAgIG9iamVjdCBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIFRoZSB1cmkgdG8gYmUgZml4ZWQKLQkgKiBAcmV0dXJuIFVSSSB0aGUgZnVsbCBwYXRoIHVyaQotCSAqLwotCS8vRklYTUU6IG1ha2Ugc3RvcmFnZSBpbmRlcGVuZGVudAotCXB1YmxpYyBzdGF0aWMgVVJJIGdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoRU9iamVjdCBvLCBVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgewotCQkJcmV0dXJuIHVyaTsKLQkJfQotCi0JCS8vIHRyeSBpZiB0aGlzIGlzIGEgdmFsaWQgVVJMIG9yIG5vdAotCQl0cnkgewotCQkJVVJMIHVybCA9IHVyaS50b1VSTCgpOwotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHVyaTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQk7IC8vIG5vdCBhIHZhbGlkIHVybCwgbWF5YmUgYSByZWxhdGl2ZSBwYXRoCi0JCX0KLQotCQkvLyBuZWVkIHRvIGdldCB0aGUgZWxlbWVudCdzIHJlc291cmNlIHBhdGgKLQkJRmlsZSBmID0gZ2V0TGlicmFyeVJvb3RQYXRoKG8pOwotCQlTdHJpbmcgcGF0aCA9IHVyaS5nZXRQYXRoKCk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihvKTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsICYmIFVtYVV0aWwuaGFzRGlyZWN0UmVzb3VyY2UocGx1Z2luKSkgewotCQkJRmlsZSBwbHVnaW5EaXIgPSBuZXcgRmlsZShwbHVnaW4uZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChwYXRoLmluZGV4T2YocGx1Z2luLmdldE5hbWUoKSkgPiAtMSkgewotCQkJCXJldHVybiBuZXcgRmlsZShmLCBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSkKLQkJCQkJCS50b1VSSSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IEZpbGUocGx1Z2luRGlyLCBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSkudG9VUkkoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdGFja1RyYWNlU3RyaW5nKFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZ1dyaXRlciBzdHJXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWUucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpKTsKLQkJcmV0dXJuIHN0cldyaXRlci50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMYWJlbFdpdGhQYXRoKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRMYWJlbFdpdGhQYXRoKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpOwotCQl9Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJcmV0dXJuIGdldExhYmVsV2l0aFBhdGgoKChDb250ZW50RGVzY3JpcHRpb24pIG9iamVjdCkuZUNvbnRhaW5lcigpKTsKLQkJfQotCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgb2JqZWN0OwotCQkJQ29sbGVjdGlvbjxOYW1lZEVsZW1lbnQ+IGl0ZW1QYXRoID0gTWlzYy5nZXRPYmplY3RUcmVlUmVsYXRpdmVUb1BsdWdpbihtZSk7Ci0JCQlTdHJpbmdCdWZmZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0TGFiZWwob2JqZWN0LCBtZS5nZXRHdWlkKCkpKTsKLQkJCWlmIChNZXRob2RFbGVtZW50VXRpbC5nZXRNZXRob2RNb2RlbChvYmplY3QpICE9IG51bGwpIHsKLQkJCQlwYXRoCi0JCQkJLmFwcGVuZCgiLCAiKS5hcHBlbmQoTWV0aG9kRWxlbWVudFV0aWwuZ2V0TWV0aG9kTW9kZWwob2JqZWN0KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChJdGVyYXRvcjxOYW1lZEVsZW1lbnQ+IGl0ZXIgPSBpdGVtUGF0aC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlOYW1lZEVsZW1lbnQgZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlTdHJpbmcgcyA9IFN0cmluZy52YWx1ZU9mKGUuZ2V0TmFtZSgpKTsKLQotCQkJCQlpZiAoTW9kZWxTdHJ1Y3R1cmUuQ09SRV9DT05URU5UX1BBQ0FLR0VfTkFNRS5lcXVhbHMocykgfHwgTW9kZWxTdHJ1Y3R1cmUuQ09OVEVOVF9QQUNLQUdFX05BTUUuZXF1YWxzSWdub3JlQ2FzZShzKQotCQkJCQkJCXx8ICgoKE5hbWVkRWxlbWVudCkgb2JqZWN0KS5lcXVhbHMoZSkpKSB7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwYXRoLmFwcGVuZCgnLycpLmFwcGVuZChzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBFT2JqZWN0IGdldE93bmVyKENvbW1hbmQgY29tbWFuZCkgewotCQljb21tYW5kID0gVG5nVXRpbC51bndyYXAoY29tbWFuZCk7Ci0JCUVPYmplY3Qgb3duZXIgPSBudWxsOwotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCW93bmVyID0gKChBZGRDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQl9IGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQlvd25lciA9ICgoUmVtb3ZlQ29tbWFuZCkgY29tbWFuZCkuZ2V0T3duZXIoKTsKLQkJfSBlbHNlIGlmIChjb21tYW5kIGluc3RhbmNlb2YgU2V0Q29tbWFuZCkgewotCQkJb3duZXIgPSAoKFNldENvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIE1vdmVDb21tYW5kKSB7Ci0JCQlvd25lciA9ICgoTW92ZUNvbW1hbmQpIGNvbW1hbmQpLmdldE93bmVyKCk7Ci0JCX0gZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQpIHsKLQkJCU9iamVjdCBvID0gKChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKSBjb21tYW5kKS5nZXRPd25lcigpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJb3duZXIgPSAoRU9iamVjdCkgbzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb3duZXI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU2V0PFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcyhDb21tYW5kIGNtZCkgewotCQlTZXQ8UmVzb3VyY2U+IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCWNvbGxlY3RNb2RpZmllZFJlc291cmNlcyhjbWQsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdE1vZGlmaWVkUmVzb3VyY2VzKENvbW1hbmQgY29tbWFuZCwgU2V0PFJlc291cmNlPiBtb2RpZmllZFJlc291cmNlcykgewotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIElSZXNvdXJjZUF3YXJlQ29tbWFuZCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkQWxsKCgoSVJlc291cmNlQXdhcmVDb21tYW5kKSBjb21tYW5kKQotCQkJCQkuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCX0gCi0JCWVsc2UgaWYoY29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCl7Ci0JCQlMaXN0IGNvbW1hbmRMaXN0ID0gKChDb21wb3VuZENvbW1hbmQpY29tbWFuZCkuZ2V0Q29tbWFuZExpc3QoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbW1hbmRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWNvbGxlY3RNb2RpZmllZFJlc291cmNlcygoQ29tbWFuZCkgaXRlci5uZXh0KCksIG1vZGlmaWVkUmVzb3VyY2VzKTsJCQkJCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFT2JqZWN0IG1vZGlmaWVkID0gVG5nVXRpbC5nZXRPd25lcihjb21tYW5kKTsKLQkJCWlmKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1vZGlmaWVkLmVSZXNvdXJjZSgpOwotCQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcpIHsKLQkJQXJyYXlMaXN0IGF0dGFjaG1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoYXR0YWNobWVudFN0cmluZyA9PSBudWxsKQotCQkJYXR0YWNobWVudFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBmaWxlc1tdID0gYXR0YWNobWVudFN0cmluZwotCQkJCS5zcGxpdChHVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUl9TUExJVFRFUik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS50cmltKCkubGVuZ3RoKCkgPiAwKQotCQkJCWF0dGFjaG1lbnRzLmFkZChmaWxlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGF0dGFjaG1lbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9TdHJpbmcoTGlzdCBhdHRhY2htZW50TGlzdCkgewotCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgYXR0YWNobWVudCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGkrKyA+IDApCi0JCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcKLQkJCQkJCS5jb25jYXQoR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1IpOwotCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcuY29uY2F0KGF0dGFjaG1lbnQpOwotCQl9Ci0JCXJldHVybiBhdHRhY2htZW50U3RyaW5nOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBjb252ZXJ0U3RyaW5nc1RvTGlzdChTdHJpbmcgc3RyaW5nKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHN0ckxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKHN0cmluZyA9PSBudWxsKQotCQkJc3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0cmluZ3NbXSA9IHN0cmluZwotCQkJCS5zcGxpdChDT01NQV9TRVBBUkFUT1JfU1BMSVRURVIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzdHJpbmdzW2ldLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJc3RyTGlzdC5hZGQoc3RyaW5nc1tpXS50cmltKCkpOwotCQl9Ci0JCXJldHVybiBzdHJMaXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRMaXN0VG9TdHJpbmcoTGlzdDxTdHJpbmc+IHN0ckxpc3QpIHsKLQkJU3RyaW5nIHN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCBpID0gMDsKLQkJaWYgKHN0ckxpc3QgIT0gbnVsbCkgewotCQkJZm9yIChTdHJpbmcgYVN0cmluZzogc3RyTGlzdCkgewotCQkJCWlmIChpKysgPiAwKQotCQkJCQlzdHJpbmcgPSBzdHJpbmcKLQkJCQkJCQkuY29uY2F0KENPTU1BX1NFUEFSQVRPUik7Ci0JCQkJc3RyaW5nID0gc3RyaW5nLmNvbmNhdChhU3RyaW5nKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiB0cnVlIGlmZiB0aGUgTWV0aG9kRWxlbWVudCBpcyBhbGxvd2VkIGFuIGF0dGFjaG1lbnQuICBDdXJyZW50bHksIG9ubHkKLQkgKiBFeGFtcGxlLCBSZXN1YWJsZUFzc2V0LCBUZW1wbGF0ZSwgIFdoaXRlcGFwZXIgYXJlIGFsbG93ZWQgYXR0YWNobWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbGxvd2VkQXR0YWNobWVudHMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZSBpbnN0YW5jZW9mIEV4YW1wbGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0KQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgVGVtcGxhdGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gPGNvZGU+ZWxlbWVudHM8L2NvZGU+IGNvbnRhaW5zIDxjb2RlPmU8L2NvZGU+IG9yIGhhcyBhIHdyYXBwZXIgb2YgPGNvZGU+ZTwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoQ29sbGVjdGlvbiBlbGVtZW50cywgT2JqZWN0IGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYoZWxlbWVudCA9PSBlIHx8IGUgPT0gdW53cmFwKGVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIEN1c3RvbUNhdGVnb3J5IGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBEZXNjaWJhYmxlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHtAbGluayBEZXBlbmRlbmN5Q2hlY2tlciNpc0FuY2Vzc29yT2YoQ3VzdG9tQ2F0ZWdvcnksIERlc2NyaWJhYmxlRWxlbWVudCl9Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQW5jZXNzb3JPZihDdXN0b21DYXRlZ29yeSBjYywgRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJcmV0dXJuIERlcGVuZGVuY3lDaGVja2VyLmlzQW5jZXNzb3JPZihjYywgZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoUGFyZW50SWZOYW1lQ2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uLCBJdGVtUHJvdmlkZXJBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJaWYobm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCkgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcykpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOgotCQkJCWlmKFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuaXNTaG93UHJlc2VudGF0aW9uTmFtZXMoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCWlmKCFQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmlzU2hvd1ByZXNlbnRhdGlvbk5hbWVzKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKE5hbWVkRWxlbWVudC5jbGFzcykgIT0gVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FICl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gbmFtZSBjaGFuZ2UgbWlnaHQgY2hhbmdlIHRoZSBlbGVtZW50J3Mgb3JkZXIgaW4gdGhlIHNvcnRlZCBsaXN0Ci0JCS8vIHJlZnJlc2ggdGhlIHBhcmVudCBjb250ZW50IHRvIHJlc29ydCB0aGUgZWxlbWVudCBsaXN0Ci0JCS8vCi0JCWFkYXB0ZXIuZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIGFkYXB0ZXIuZ2V0UGFyZW50KG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpKSwgdHJ1ZSwgZmFsc2UpKTsKLQl9CQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZWxlbWVudCA8Y29kZT5lPC9jb2RlPiBpcyBhIGNvbnRyaWJ1dG9yIG9mIHRoZSBnaXZlbiA8Y29kZT5iYXNlPC9jb2RlPgotCSAqIEBwYXJhbSBiYXNlCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3JPZihPYmplY3QgYmFzZSwgVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJZm9yKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGU7Ci0JCXZlICE9IG51bGwgJiYgdmUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTICYmIHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsOwotCQl2ZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSkgewotCQkJaWYodmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IGJhc2UpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0vLwkvKioKLS8vCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRhaW5zIHRoZSBnaXZlbiBjaGlsZCwgZWl0aGVyIHZpYSBjb250YWlubWVudCBvciBjb250cmlidXRpb24KLS8vCSAqIEBwYXJhbSBwYXJlbnQKLS8vCSAqIEBwYXJhbSBjaGlsZAotLy8JICogQHJldHVybgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWluZWRCeShBcnRpZmFjdCBwYXJlbnQsIEFydGlmYWN0IGNoaWxkKSB7Ci0vLwkJRU9iamVjdCBjb250YWluZXIgPSBjaGlsZC5lQ29udGFpbmVyKCk7Ci0vLwkJaWYoY29udGFpbmVyIGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLS8vCQkJQXJ0aWZhY3QgY3VycmVudFBhcmVudCA9IChBcnRpZmFjdCljb250YWluZXI7Ci0vLwkJCWlmKGNvbnRhaW5lciA9PSBwYXJlbnQgfHwgaXNDb250cmlidXRvck9mKHBhcmVudCwgY3VycmVudFBhcmVudCkpIHsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocGFyZW50LCBmYWxzZSkgewotLy8JCQkJCi0vLwkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLS8vCQkJCQotLy8JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLS8vCQkJCQlyZXR1cm4gKChBcnRpZmFjdClvYmplY3QpLmdldENvbnRhaW5lZEFydGlmYWN0cygpLml0ZXJhdG9yKCk7Ci0vLwkJCQl9Ci0vLwkJCQkKLS8vCQkJfTsKLS8vCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLS8vCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0vLwkJCQlpZihvID09IGN1cnJlbnRQYXJlbnQgfHwgaXNDb250cmlidXRvck9mKG8sIGN1cnJlbnRQYXJlbnQpKSB7Ci0vLwkJCQkJcmV0dXJuIHRydWU7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJcmV0dXJuIFVtYVV0aWwuaXNDb250YWluZWRCeShjaGlsZCwgcGFyZW50KTsKLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldENvbmZpZ3VyYXRpb25zVG9VcGRhdGUoTWV0aG9kUGFja2FnZSBwYXJlbnQsIE1ldGhvZFBhY2thZ2UgcGtnLCBDb2xsZWN0aW9uIGNvbmZpZ3NUb1VwZGF0ZSkgewotCQlPYmplY3QgY29uZmlncyA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBhcmVudCkKLQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMpOwotCQlpZiAoY29uZmlncyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRjb25maWcgPSAoKExpc3QpIGNvbmZpZ3MpLml0ZXJhdG9yKCk7IGl0Y29uZmlnCi0JCQkuaGFzTmV4dCgpOykgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Y29uZmlnCi0JCQkJLm5leHQoKTsKLQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCWlmICghcGtncy5jb250YWlucyhwa2cpKSB7Ci0JCQkJCWNvbmZpZ3NUb1VwZGF0ZS5hZGQoY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgY2FuIGJlIGVzdGltYXRlZAotCSAqIAotCSAqIEBwYXJhbSBvCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5Fc3RpbWF0ZShPYmplY3QgbykgewotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIFRhc2sgfHwgbyBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50OwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWdTaG93QWxsKCkgewotCQlJTGlicmFyeUluc3BlY3RvciBpbnNwZWN0b3IgPSBnZXRMaWJyYXJ5SW5zcGVjdG9yKCk7Ci0JCWlmIChpbnNwZWN0b3IgIT0gbnVsbCkgewotCQkJaW5zcGVjdG9yLnNob3dBbGxDb250ZW50cygpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Z1Nob3dBbGwoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJSUxpYnJhcnlJbnNwZWN0b3IgaW5zcGVjdG9yID0gZ2V0TGlicmFyeUluc3BlY3RvcigpOwotCQlpZiAoaW5zcGVjdG9yICE9IG51bGwpIHsKLQkJCWluc3BlY3Rvci5zaG93QWxsQ29udGVudHMobGliKTsKLQkJfQotCX0KLQkKLQkvL1VzZWQgZm9yIGRlYnVnIG9ubHkKLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5SW5zcGVjdG9yIGdldExpYnJhcnlJbnNwZWN0b3IoKSB7Ci0JCXJldHVybiAoSUxpYnJhcnlJbnNwZWN0b3IpIEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9uKCJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0IiwgImxpYnJhcnlJbnNwZWN0b3IiKTsgCQkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luUGx1Z2luV2l0aExlc3NUaGFuT25lU3VwZXJDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBjYywgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZihVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYykgIT0gcGx1Z2luKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYyk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCkgJiYgY291bnQgPCAyOykgewotCQkJQ3VzdG9tQ2F0ZWdvcnkgY2F0ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCWlmKFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNhdCkgPT0gcGx1Z2luKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0JCQkJCQkKLQkJfQotCQlyZXR1cm4gY291bnQgPCAyOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBnaXZlbiB3cmFwcGVyIGlzIHVuZGVyIGEgY3VzdG9tIGNhdGVnb3J5IHRyZWUKLQkgKiAKLQkgKiBAcGFyYW0gaXRlbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNVbmRlckN1c3RvbUNhdGVnb3J5VHJlZShJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyKSB7Ci0JCWRvIHsKLQkJCU9iamVjdCBvd25lciA9IHdyYXBwZXIuZ2V0T3duZXIoKTsKLQkJCWlmKHVud3JhcChvd25lcikgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJd3JhcHBlciA9IG93bmVyIGluc3RhbmNlb2YgSVdyYXBwZXJJdGVtUHJvdmlkZXIgPyAoSVdyYXBwZXJJdGVtUHJvdmlkZXIpIG93bmVyIDogbnVsbDsKLQkJfSB3aGlsZSh3cmFwcGVyICE9IG51bGwpOwotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0RXhjbHVzaXZlU3ViQ3VzdG9tQ2F0ZWdvcmllcyhDdXN0b21DYXRlZ29yeSBjYykgewotCQlBcnJheUxpc3QgY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29sbGVjdEV4Y2x1c2l2ZVN1YkN1c3RvbUNhdGVnb3JpZXMoY29sbGVjdGlvbiwgY2MsIFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNjKSk7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbGxlY3RFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKENvbGxlY3Rpb24gY29sbGVjdGlvbiwgQ3VzdG9tQ2F0ZWdvcnkgY2MsIE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2MuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGUgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IHN1YiA9IChDdXN0b21DYXRlZ29yeSkgZTsKLQkJCQlpZihpc0luUGx1Z2luV2l0aExlc3NUaGFuT25lU3VwZXJDdXN0b21DYXRlZ29yeShzdWIsIHBsdWdpbikpIHsKLQkJCQkJY29sbGVjdGlvbi5hZGQoZSk7Ci0JCQkJCWNvbGxlY3RFeGNsdXNpdmVTdWJDdXN0b21DYXRlZ29yaWVzKGNvbGxlY3Rpb24sIHN1YiwgcGx1Z2luKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QWRhcHRlckJ5VHlwZShOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbm90aWZpZXIuZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBZGFwdGVyIGFkYXB0ZXIgPSAoQWRhcHRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZihhZGFwdGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbWFwIGNvbnRhaW5pbmcgdGhlIHJlbW92ZWQgcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIHJlbW92ZVJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBUbmdVdGlsLnJlbW92ZVJlZmVyZW5jZXMoZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZmVyZW5jZXMgdG8gYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBtYXAgb2YgbWV0aG9kIGVsZW1lbnRzIHdob3NlIHJlZmVyZW5jZXMgdG8gdGhlIGdpdmVuIGVsZW1lbnQKLQkgKiAgICAgICAgIGFyZSBqdXN0IHJlbW92ZWQsIGFuZCB0aGVpciBmZWF0dXJlcyB0aGF0IGhvbGQgdGhlIHJlZmVyZW5jZXMgdG8KLQkgKiAgICAgICAgIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgcmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlib29sZWFuIGNoZWNrTW9kaWZ5KSB7Ci0JCS8vIExpc3QgcmVmZXJlbmNlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU1hcCBvYmplY3RGZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IGVPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQ7Ci0JCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkKLQkJCXJldHVybiBvYmplY3RGZWF0dXJlc01hcDsKLQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIGVudHJ5LmdldEtleSgpKTsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQkJCQljaGVja01vZGlmeShvYmopOwotCQkJCQkJfQotCQkJCQkJKChMaXN0KSBvYmouZUdldChmZWF0dXJlKSkucmVtb3ZlKGVsZW1lbnQpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQkoKExpc3QpIG9iai5lR2V0KGZlYXR1cmUpKS5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJCQlMaXN0IGZlYXR1cmVzID0gKExpc3QpIG9iamVjdEZlYXR1cmVzTWFwLmdldChvYmopOwotCQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQlvYmplY3RGZWF0dXJlc01hcC5wdXQob2JqLCBmZWF0dXJlcyk7Ci0JCQkJCQl9Ci0JCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5ldyBBcnJheUxpc3QoKENvbGxlY3Rpb24pIGVPYmoKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKSkKLQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGNoZWNrTW9kaWZ5KSB7Ci0JCQkJCQkJY2hlY2tNb2RpZnkob2JqKTsKLQkJCQkJCX0KLQkJCQkJCW9iai5lU2V0KGZlYXR1cmUsIG51bGwpOwotCQkJCQkJTGlzdCBmZWF0dXJlcyA9IChMaXN0KSBvYmplY3RGZWF0dXJlc01hcC5nZXQob2JqKTsKLQkJCQkJCWlmIChmZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJb2JqZWN0RmVhdHVyZXNNYXAucHV0KG9iaiwgZmVhdHVyZXMpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZU9iagotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJCWlmIChjaGVja01vZGlmeSkgewotCQkJCQkJCWNoZWNrTW9kaWZ5KG9iaik7Ci0JCQkJCQl9Ci0JCQkJCQlvYmouZVNldChmZWF0dXJlLCBudWxsKTsKLQkJCQkJCUxpc3QgZmVhdHVyZXMgPSAoTGlzdCkgb2JqZWN0RmVhdHVyZXNNYXAuZ2V0KG9iaik7Ci0JCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCW9iamVjdEZlYXR1cmVzTWFwLnB1dChvYmosIGZlYXR1cmVzKTsKLQkJCQkJCX0KLQkJCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RGZWF0dXJlc01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCS8vIGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJLy8gcmVmZXJlbmNlcnMuYWRkKG5ldyBSZWZlcmVuY2VyKChFT2JqZWN0KWVudHJ5LmdldEtleSgpLAotCQkvLyAoTGlzdCllbnRyeS5nZXRWYWx1ZSgpKSk7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIHJlZmVyZW5jZXJzOwotCQlyZXR1cm4gb2JqZWN0RmVhdHVyZXNNYXA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBwdWJsaXNoaW5nIGNhdGVnb3J5IHByb3BlcnR5IGZvciBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybgotCSAqIAkJIHByb3BlcnR5IGlmIGZvdW5kLCBlbHNlIG51bGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBnZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBwcm9wcyA9IGVsZW1lbnQuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCWlmIChwcm9wcyA9PSBudWxsIHx8IHByb3BzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9wcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IChNZXRob2RFbGVtZW50UHJvcGVydHkpIGl0Lm5leHQoKTsKLQkJCWlmIChQVUJMSVNIX0NBVEVHT1JZX1BST1BFUlRZLmVxdWFscyhwcm9wLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvcDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQlSb2xlU2V0SXRlbVByb3ZpZGVyIGFkYXB0ZXIgPSAoUm9sZVNldEl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQob2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCURpc2NpcGxpbmVJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChEaXNjaXBsaW5lSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlyZXR1cm4gYWRhcHRlci5nZXROb3RpZnlDaGFuZ2VkTGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd3JhcHBlciBmb3IgdGhlIGdpdmVuIHZhbHVlIGluIHRoZSBnaXZlbiB3cmFwcGVycy4KLQkgKiAKLQkgKiBAcGFyYW0gd3JhcHBlcnMKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyIGdldFdyYXBwZXIoQ29sbGVjdGlvbiB3cmFwcGVycywgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh3cmFwcGVycyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGxpc3RlbmVyID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihsaXN0ZW5lciBpbnN0YW5jZW9mIEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIKLQkJCQkJJiYgdW53cmFwKGxpc3RlbmVyKSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiAoRmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlcikgbGlzdGVuZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmVhdHVyZVZhbHVlV3JhcHBlckl0ZW1Qcm92aWRlckZvckNDKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBDdXN0b21DYXRlZ29yeSBjYykgewotCQkvLyBnZXQgSVRyZWVDb250ZW50UHJvdmlkZXIgYWRhcGF0ZXIKLQkJQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChDdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoY2MsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Tm90aWZ5Q2hhbmdlZExpc3RlbmVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBGZWF0dXJlVmFsdWVXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCSYmIHVud3JhcChsaXN0ZW5lcikgPT0gY2MpIHsKLQkJCQlyZXR1cm4gKEZlYXR1cmVWYWx1ZVdyYXBwZXJJdGVtUHJvdmlkZXIpbGlzdGVuZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvV3JhcHBlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjAyNWI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9XcmFwcGVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuRGVsZWdhdGluZ1dyYXBwZXJJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVdyYXBwZXJJdGVtUHJvdmlkZXI7Ci0KLS8qKgotICogTWFuYWdlcyB3cmFwcGVycyBvZiBhbiBpdGVtIHByb3ZpZGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gRmViIDE1LCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgV3JhcHBlck1hbmFnZXIgaW1wbGVtZW50cyBJRGlzcG9zYWJsZSB7Ci0KLQlwcml2YXRlIEhhc2hNYXAgdmFsdWVUb1dyYXBwZXJNYXA7Ci0JcHJpdmF0ZSBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBXcmFwcGVyTWFuYWdlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlcihPYmplY3QgdmFsdWUpIHsKLQkJaWYodmFsdWVUb1dyYXBwZXJNYXAgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlVG9XcmFwcGVyTWFwLmdldCh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFdyYXBwZXJzKCkgewotCQlpZih2YWx1ZVRvV3JhcHBlck1hcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdmFsdWVUb1dyYXBwZXJNYXAudmFsdWVzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgd3JhcHBlciBmb3IgdGhlIGdpdmVuIHZhbHVlLCBvd25lciwgYW5kIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVdyYXBwZXJJdGVtUHJvdmlkZXIgY3JlYXRlV3JhcHBlcihPYmplY3QgdmFsdWUsIE9iamVjdCBvd25lciwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBEZWxlZ2F0aW5nV3JhcHBlckl0ZW1Qcm92aWRlcih2YWx1ZSwgb3duZXIsIG51bGwsIENvbW1hbmRQYXJhbWV0ZXIuTk9fSU5ERVgsIGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoQ29sbGVjdGlvbiBkZWxlZ2F0ZVZhbHVlcykgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJU2V0IG9sZERlbGVnYXRlVmFsdWVzID0gZGVsZWdhdGVWYWx1ZXMgIT0gbnVsbCA/IG5ldyBIYXNoU2V0KGRlbGVnYXRlVmFsdWVzKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJCi0JCWlmICh2YWx1ZVRvV3JhcHBlck1hcCA9PSBudWxsICYmICFkZWxlZ2F0ZVZhbHVlcy5pc0VtcHR5KCkpCi0JCXsKLQkJCXZhbHVlVG9XcmFwcGVyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQkJLy8gV3JhcCBhbnkgbmV3IGNoaWxkcmVuIGFuZCBhZGQgdGhlbSB0byB0aGUgbWFwLiBSZW1vdmUgZWFjaCBjdXJyZW50IGNoaWxkIGZyb20gdGhlIHNldCBvZiBvbGQgY2hpbGRyZW4uCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9iamVjdCBjaGlsZCA9IGkubmV4dCgpOwotCQkJCi0JCQlpZiAoIXZhbHVlVG9XcmFwcGVyTWFwLmNvbnRhaW5zS2V5KGNoaWxkKSkKLQkJCXsKLQkJCQlJV3JhcHBlckl0ZW1Qcm92aWRlciB3cmFwcGVyID0gY3JlYXRlV3JhcHBlcihjaGlsZCwgdGhpcywgYWRhcHRlckZhY3RvcnkpOwotCQkJCXZhbHVlVG9XcmFwcGVyTWFwLnB1dChjaGlsZCwgd3JhcHBlcik7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQl9Ci0JCQlvbGREZWxlZ2F0ZVZhbHVlcy5yZW1vdmUoY2hpbGQpOwotCQl9Ci0JCQotCQkvLyBSZW1vdmUgYW5kIGRpc3Bvc2UgYW55IHdyYXBwZXJzIGZvciByZW1haW5pbmcgb2xkIGNoaWxkcmVuLgotCQkvLwotCQlpZiAoIW9sZERlbGVnYXRlVmFsdWVzLmlzRW1wdHkoKSkKLQkJewotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaSA9IG9sZERlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JCQl7Ci0JCQkJT2JqZWN0IGNoaWxkID0gaS5uZXh0KCk7Ci0JCQkJCi0JCQkJSVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChJV3JhcHBlckl0ZW1Qcm92aWRlcil2YWx1ZVRvV3JhcHBlck1hcC5yZW1vdmUoY2hpbGQpOwotCQkJCWlmICh3cmFwcGVyICE9IG51bGwpCi0JCQkJewotCQkJCQl3cmFwcGVyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIElmIGFueSBjaGlsZHJlbiB3ZXJlIGFkZGVkIG9yIHJlbW92ZWQsIHJlc2V0IHRoZSBpbmRpY2VzLgotCQlpZiAoY2hhbmdlZCkKLQkJewotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRlbGVnYXRlVmFsdWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyBpbmRleCsrKQotCQkJewotCQkJCSgoSVdyYXBwZXJJdGVtUHJvdmlkZXIpdmFsdWVUb1dyYXBwZXJNYXAuZ2V0KGkubmV4dCgpKSkuc2V0SW5kZXgoaW5kZXgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGUjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkgICAgaWYgKHZhbHVlVG9XcmFwcGVyTWFwICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB2YWx1ZVRvV3JhcHBlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JICAgICAgewotCSAgICAgICAgKChJRGlzcG9zYWJsZSlpLm5leHQoKSkuZGlzcG9zZSgpOwotCSAgICAgIH0KLQkgICAgICB2YWx1ZVRvV3JhcHBlck1hcC5jbGVhcigpOwotCSAgICAgIHZhbHVlVG9XcmFwcGVyTWFwID0gbnVsbDsKLQkgICAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDRmZTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgcHJvdmlkZXMgYQotICogY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsRmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxGYWN0b3J5SW1wbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3JkZXIgSW5mbzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3JkZXJJbmZvIGNyZWF0ZU9yZGVySW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVySW5mb0NvbGxlY3Rpb24gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTW9kZWxQYWNrYWdlIGdldE1vZGVsUGFja2FnZSgpOwotCi19IC8vIE1vZGVsRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL01vZGVsUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRhNWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9Nb2RlbFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgY29udGFpbnMKLSAqIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbEZhY3RvcnkKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNb2RlbFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTkFNRSA9ICJtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC50bmcudXRpbC5tb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1vZGVsUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5Nb2RlbFBhY2thZ2VJbXBsCi0JCQkuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsIDxlbT5PcmRlciBJbmZvPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk9yZGVySW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsLk1vZGVsUGFja2FnZUltcGwjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk8gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R1VJIERzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fR1VJX0RTID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19fVElNRVNUQU1QID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbzwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1JERVJfSU5GT19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwgPGVtPk9yZGVyIEluZm8gQ29sbGVjdGlvbjwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGwuTW9kZWxQYWNrYWdlSW1wbCNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9SREVSX0lORk9fQ09MTEVDVElPTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgSW5mb3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPUkRFUl9JTkZPX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIDxlbT5PcmRlciBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE9yZGVySW5mb19OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcyA8ZW0+R1VJIERzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R1VJIERzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRHVUlEcygpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fR1VJRHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbyNnZXRUaW1lc3RhbXAgPGVtPlRpbWVzdGFtcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UaW1lc3RhbXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvI2dldFRpbWVzdGFtcCgpCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPcmRlckluZm9fVGltZXN0YW1wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uI2dldE9yZGVySW5mb3MgPGVtPk9yZGVyIEluZm9zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3JkZXIgSW5mb3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiNnZXRPcmRlckluZm9zKCkKLQkgKiBAc2VlICNnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPcmRlckluZm9Db2xsZWN0aW9uX09yZGVySW5mb3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNb2RlbEZhY3RvcnkgZ2V0TW9kZWxGYWN0b3J5KCk7Ci0KLX0gLy8gTW9kZWxQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvT3JkZXJJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMmU0Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9yZGVySW5mbyBleHRlbmRzIEVPYmplY3QgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFOVUFMID0gIm1hbnVhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqLwotCUVMaXN0IGdldEdVSURzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lc3RhbXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRpbWVzdGFtcDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lc3RhbXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRpbWVzdGFtcChsb25nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNnZXRPcmRlckluZm9fVGltZXN0YW1wKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JbG9uZyBnZXRUaW1lc3RhbXAoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8jZ2V0VGltZXN0YW1wIDxlbT5UaW1lc3RhbXA8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXN0YW1wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUaW1lc3RhbXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVzdGFtcChsb25nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9PcmRlckluZm9Db2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZThkZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL09yZGVySW5mb0NvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIG9yZGVyIGluZm9ybWF0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckluZm9Db2xsZWN0aW9uIGV4dGVuZHMgRU9iamVjdCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICogQG1vZGVsIHR5cGU9ImNvbS5pYm0ubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvIgotCSAqICAgICAgICBjb250YWluZW1lbnQ9InRydWUiCi0JICovCi0JRUxpc3QgZ2V0T3JkZXJJbmZvcygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvZWRpdHV0aWwuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODc2M2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ibW9kZWwiCi0gICAgbnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEvZWRpdC90bmcvdXRpbC9tb2RlbC5lY29yZSIgbnNQcmVmaXg9ImNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWwiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mbyI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibWFudWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdVSURzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aW1lc3RhbXAiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VMb25nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik9yZGVySW5mb0NvbGxlY3Rpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcmRlckluZm9zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL09yZGVySW5mbyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2VkaXR1dGlsLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGNhNjQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9lZGl0dXRpbC5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXQudG5nL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS51bWEucmVzb3VyY2VtYW5hZ2VyLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9jb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJjb20uaWJtLnVtYS5lZGl0LnRuZyIgcnVudGltZUphcj0idHJ1ZSIgbW9kZWxOYW1lPSJlZGl0dXRpbCIgZWRpdFBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJvdmlkZXIuZWRpdHV0aWxFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJjb20uaWJtLnVtYS5yZXNvdXJjZW1hbmFnZXIucHJlc2VudGF0aW9uLmVkaXR1dGlsRWRpdG9yUGx1Z2luIgotICAgIHJ1bnRpbWVDb21wYXRpYmlsaXR5PSJmYWxzZSI+Ci0gIDxmb3JlaWduTW9kZWw+QG1vZGVsPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9Ik1vZGVsIiBiYXNlUGFja2FnZT0iY29tLmlibS51bWEuZWRpdC50bmcudXRpbCIgZWNvcmVQYWNrYWdlPSJlZGl0dXRpbC5lY29yZSMvIj4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlZGl0dXRpbC5lY29yZSMvL09yZGVySW5mbyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm8vbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvL2dVSURzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVkaXR1dGlsLmVjb3JlIy8vT3JkZXJJbmZvQ29sbGVjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWRpdHV0aWwuZWNvcmUjLy9PcmRlckluZm9Db2xsZWN0aW9uL29yZGVySW5mb3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGJmMTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uIDwhLS0KLSAqIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1vZGVsRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbmQgaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPOgotCQkJcmV0dXJuIGNyZWF0ZU9yZGVySW5mbygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT046Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbigpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm8gY3JlYXRlT3JkZXJJbmZvKCkgewotCQlPcmRlckluZm9JbXBsIG9yZGVySW5mbyA9IG5ldyBPcmRlckluZm9JbXBsKCk7Ci0JCXJldHVybiBvcmRlckluZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcmRlckluZm9Db2xsZWN0aW9uIGNyZWF0ZU9yZGVySW5mb0NvbGxlY3Rpb24oKSB7Ci0JCU9yZGVySW5mb0NvbGxlY3Rpb25JbXBsIG9yZGVySW5mb0NvbGxlY3Rpb24gPSBuZXcgT3JkZXJJbmZvQ29sbGVjdGlvbkltcGwoKTsKLQkJcmV0dXJuIG9yZGVySW5mb0NvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFBhY2thZ2UgZ2V0TW9kZWxQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1vZGVsUGFja2FnZSkgZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1vZGVsUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTW9kZWxQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy8gTW9kZWxGYWN0b3J5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvTW9kZWxQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODgzZTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL01vZGVsUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4gPCEtLQotICogZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgTW9kZWxQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3JkZXJJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUKLQkgKiBwYWNrYWdlIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPgotCSAqIE5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMgZmFjdG9yeQotCSAqIG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcyBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkgKiBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTW9kZWxQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgTW9kZWxGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwKLQkgKiBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiBTaW1wbGUgZGVwZW5kZW5jaWVzIGFyZQotCSAqIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbCBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nCi0JICogYW55dGhpbmcgZWxzZS4gVGhpcyBtZXRob2QgZHJpdmVzIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudAotCSAqIHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbCB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPgotCSAqIE9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QKLQkgKiB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQuCi0JICogVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczogbWV0YS1tb2RlbCBvYmplY3RzIGZvcgotCSAqIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueSBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZQotCSAqIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+Ci0JICogSW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZSBhbHJlYWR5Ci0JICogYmVlbiBpbml0aWFsaXplZC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTW9kZWxQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoTW9kZWxQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRQotCQkJCQkuZ2V0RVBhY2thZ2UoTW9kZWxQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJTW9kZWxQYWNrYWdlSW1wbCB0aGVNb2RlbFBhY2thZ2UgPSAoTW9kZWxQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgTW9kZWxQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgTW9kZWxQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlTW9kZWxQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlTW9kZWxQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZU1vZGVsUGFja2FnZS5mcmVlemUoKTsKLQotCQlyZXR1cm4gdGhlTW9kZWxQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE9yZGVySW5mbygpIHsKLQkJcmV0dXJuIG9yZGVySW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX05hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgb3JkZXJJbmZvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE9yZGVySW5mb19HVUlEcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3JkZXJJbmZvX1RpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBvcmRlckluZm9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPcmRlckluZm9Db2xsZWN0aW9uKCkgewotCQlyZXR1cm4gb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1vZGVsRmFjdG9yeSBnZXRNb2RlbEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoTW9kZWxGYWN0b3J5KSBnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuIFRoaXMgbWV0aG9kIGlzIGd1YXJkZWQgdG8KLQkgKiBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpCi0JCQlyZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCW9yZGVySW5mb0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG9yZGVySW5mb0VDbGFzcywgT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShvcmRlckluZm9FQ2xhc3MsIE9SREVSX0lORk9fX1RJTUVTVEFNUCk7Ci0KLQkJb3JkZXJJbmZvQ29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhPUkRFUl9JTkZPX0NPTExFQ1RJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG9yZGVySW5mb0NvbGxlY3Rpb25FQ2xhc3MsCi0JCQkJT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKAotCQkJCW9yZGVySW5mb0VDbGFzcywKLQkJCQlPcmRlckluZm8uY2xhc3MsCi0JCQkJIk9yZGVySW5mbyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRPcmRlckluZm9fTmFtZSgpLAotCQkJCWVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksCi0JCQkJIm5hbWUiLCBudWxsLCAwLCAxLCBPcmRlckluZm8uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0T3JkZXJJbmZvX0dVSURzKCksCi0JCQkJZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwKLQkJCQkiZ1VJRHMiLCBudWxsLCAwLCAtMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE9yZGVySW5mb19UaW1lc3RhbXAoKSwKLQkJCQllY29yZVBhY2thZ2UuZ2V0RUxvbmcoKSwKLQkJCQkidGltZXN0YW1wIiwgbnVsbCwgMCwgMSwgT3JkZXJJbmZvLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlvcmRlckluZm9Db2xsZWN0aW9uRUNsYXNzLAotCQkJCU9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsCi0JCQkJIk9yZGVySW5mb0NvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0T3JkZXJJbmZvQ29sbGVjdGlvbl9PcmRlckluZm9zKCksCi0JCQkJdGhpcy5nZXRPcmRlckluZm8oKSwKLQkJCQludWxsLAotCQkJCSJvcmRlckluZm9zIiwgbnVsbCwgMCwgLTEsIE9yZGVySW5mb0NvbGxlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vIE1vZGVsUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9PcmRlckluZm9Db2xsZWN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTg1MDFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0NvbGxlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5Nb2RlbFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PcmRlciBJbmZvIENvbGxlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9Db2xsZWN0aW9uSW1wbCNnZXRPcmRlckluZm9zIDxlbT5PcmRlciBJbmZvczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMKLQkJT3JkZXJJbmZvQ29sbGVjdGlvbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJJbmZvcygpIDxlbT5PcmRlciBJbmZvczwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T3JkZXJJbmZvcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG9yZGVySW5mb3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9Db2xsZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFLmdldE9yZGVySW5mb0NvbGxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldE9yZGVySW5mb3MoKSB7Ci0JCWlmIChvcmRlckluZm9zID09IG51bGwpIHsKLQkJCW9yZGVySW5mb3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoT3JkZXJJbmZvLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUyk7Ci0JCX0KLQkJcmV0dXJuIG9yZGVySW5mb3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fQ09MTEVDVElPTl9fT1JERVJfSU5GT1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0T3JkZXJJbmZvcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJCW1zZ3MpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIGdldE9yZGVySW5mb3MoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJZ2V0T3JkZXJJbmZvcygpLmNsZWFyKCk7Ci0JCQlnZXRPcmRlckluZm9zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OX19PUkRFUl9JTkZPUzoKLQkJCWdldE9yZGVySW5mb3MoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX0NPTExFQ1RJT05fX09SREVSX0lORk9TOgotCQkJcmV0dXJuIG9yZGVySW5mb3MgIT0gbnVsbCAmJiAhb3JkZXJJbmZvcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBPcmRlckluZm9Db2xsZWN0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvT3JkZXJJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmNmMjU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9pbXBsL09yZGVySW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk9yZGVyIEluZm88L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldEdVSURzIDxlbT5HVUkgRHM8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuaW1wbC5PcmRlckluZm9JbXBsI2dldFRpbWVzdGFtcCA8ZW0+VGltZXN0YW1wPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9yZGVySW5mb0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE9yZGVySW5mbyB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdVSURzKCkgPGVtPkdVSSBEczwvZW0+fScgYXR0cmlidXRlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0R1VJRHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBnVUlEcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVTVEFNUF9FREVGQVVMVCA9IDBMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZXN0YW1wKCkgPGVtPlRpbWVzdGFtcDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFRpbWVzdGFtcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGxvbmcgdGltZXN0YW1wID0gVElNRVNUQU1QX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPcmRlckluZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1vZGVsUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3JkZXJJbmZvKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEdVSURzKCkgewotCQlpZiAoZ1VJRHMgPT0gbnVsbCkgewotCQkJZ1VJRHMgPSBuZXcgRURhdGFUeXBlVW5pcXVlRUxpc3QoU3RyaW5nLmNsYXNzLCB0aGlzLAotCQkJCQlNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTKTsKLQkJfQotCQlyZXR1cm4gZ1VJRHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRpbWVzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZXN0YW1wKGxvbmcgbmV3VGltZXN0YW1wKSB7Ci0JCWxvbmcgb2xkVGltZXN0YW1wID0gdGltZXN0YW1wOwotCQl0aW1lc3RhbXAgPSBuZXdUaW1lc3RhbXA7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCU1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVAsIG9sZFRpbWVzdGFtcCwgdGltZXN0YW1wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX0dVSV9EUzoKLQkJCXJldHVybiBnZXRHVUlEcygpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gbmV3IExvbmcoZ2V0VGltZXN0YW1wKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk9fX05BTUU6Ci0JCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJZ2V0R1VJRHMoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fVElNRVNUQU1QOgotCQkJc2V0VGltZXN0YW1wKCgoTG9uZykgbmV3VmFsdWUpLmxvbmdWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19OQU1FOgotCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fR1VJX0RTOgotCQkJZ2V0R1VJRHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlzZXRUaW1lc3RhbXAoVElNRVNUQU1QX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19fTkFNRToKLQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKG5hbWUpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19HVUlfRFM6Ci0JCQlyZXR1cm4gZ1VJRHMgIT0gbnVsbCAmJiAhZ1VJRHMuaXNFbXB0eSgpOwotCQljYXNlIE1vZGVsUGFja2FnZS5PUkRFUl9JTkZPX19USU1FU1RBTVA6Ci0JCQlyZXR1cm4gdGltZXN0YW1wICE9IFRJTUVTVEFNUF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBnVUlEczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChnVUlEcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGltZXN0YW1wOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRpbWVzdGFtcCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBPcmRlckluZm9JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvaW1wbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODJhYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBvcmRlcmluZyBjb250ZW50IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjIzYmIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTkxMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvTW9kZWxBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk9yZGVySW5mb0NvbGxlY3Rpb247Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLiBJdAotICogcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUKLSAqIG1vZGVsLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbEFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1vZGVsUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YKLQkgKiB0aGUgbW9kZWwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNb2RlbFN3aXRjaCBtb2RlbFN3aXRjaCA9IG5ldyBNb2RlbFN3aXRjaCgpIHsKLQkJcHVibGljIE9iamVjdCBjYXNlT3JkZXJJbmZvKE9yZGVySW5mbyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVPcmRlckluZm9BZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlT3JkZXJJbmZvQ29sbGVjdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIDxjb2RlPnRhcmdldDwvY29kZT4uIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8gPGVtPk9yZGVyIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdAotCSAqIHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOyBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2UKLQkgKiB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3JkZXJJbmZvQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbiA8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQKLQkgKiB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsgaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlCi0JICogd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvQ29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPcmRlckluZm9Db2xsZWN0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGlzCi0JICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9Nb2RlbFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDkxNmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdXRpbC9tb2RlbC91dGlsL01vZGVsU3dpdGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuT3JkZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5tb2RlbC5PcmRlckluZm9Db2xsZWN0aW9uOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlCi0gKiBoaWVyYXJjaHkuIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KLSAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKLSAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0IGFuZCBwcm9jZWVkaW5nIHVwIHRoZQotICogaW5oZXJpdGFuY2UgaGllcmFyY2h5IHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLCB3aGljaCBpcyB0aGUKLSAqIHJlc3VsdCBvZiB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwubW9kZWwuTW9kZWxQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1vZGVsUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNb2RlbFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBNb2RlbFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZQotCSAqIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPgotCSAqICAgICAgICAgY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBkb1N3aXRjaChFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVPYmplY3QuZUNsYXNzKCksIHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4gZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8gZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOiBkb1N3aXRjaCgKLQkJCQkJKEVDbGFzcykgZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUKLQkgKiByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4KLQkgKiAgICAgICAgIGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLk9SREVSX0lORk86IHsKLQkJCU9yZGVySW5mbyBvcmRlckluZm8gPSAoT3JkZXJJbmZvKSB0aGVFT2JqZWN0OwotCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VPcmRlckluZm8ob3JkZXJJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBNb2RlbFBhY2thZ2UuT1JERVJfSU5GT19DT0xMRUNUSU9OOiB7Ci0JCQlPcmRlckluZm9Db2xsZWN0aW9uIG9yZGVySW5mb0NvbGxlY3Rpb24gPSAoT3JkZXJJbmZvQ29sbGVjdGlvbikgdGhlRU9iamVjdDsKLQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3JkZXJJbmZvQ29sbGVjdGlvbihvcmRlckluZm9Db2xsZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk9yZGVyIEluZm88L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU9yZGVySW5mbyhPcmRlckluZm8gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PcmRlciBJbmZvIENvbGxlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7IHJldHVybmluZyBhCi0JICogbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiAgICAgICAgICAgIHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3JkZXIgSW5mbyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VPcmRlckluZm9Db2xsZWN0aW9uKE9yZGVySW5mb0NvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOyByZXR1cm5pbmcgYQotCSAqIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlCi0JICogYW55d2F5LiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vIE1vZGVsU3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvU3RyaW5nUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1ZGU0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9TdHJpbmdSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLm1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdCdWZmZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogUmVzb3VyY2UgdG8gc3RvcmUgc3RyaW5nCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nUmVzb3VyY2UgZXh0ZW5kcyBYTUlSZXNvdXJjZUltcGwgewotCXByaXZhdGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dDsKLQotCXByaXZhdGUgU3RyaW5nIHN0cjsKLQotCXB1YmxpYyBTdHJpbmdSZXNvdXJjZShTdHJpbmcgc3RyKSB7Ci0JCXRoaXMuc3RyID0gc3RyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXNhdmUob3V0LCBvcHRpb25zKTsKLQkJfSBmaW5hbGx5IHsKLQkJCW91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChvdXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG91dC50b1N0cmluZygpOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gb3V0LnRvU3RyaW5nKGVuY29kaW5nKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghaXNMb2FkZWQpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IFN0cmluZ0J1ZmZlcklucHV0U3RyZWFtKHN0cik7Ci0JCQl0cnkgewotCQkJCWxvYWQoaW5wdXRTdHJlYW0sIG9wdGlvbnMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvbW9kZWwvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MWFhZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL21vZGVsL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3Igb3JkZXJpbmcgY29udGVudCBlbGVtZW50cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4Yjc0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhbmQgcXVlcnlpbmcgc3VwcG9ydCBmb3IgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0Fic3RyYWN0U3RyaW5nVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmMjY4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgbXNnID0gaXNWYWxpZCgoU3RyaW5nKXZhbHVlKTsKLQkJCWlmKG1zZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLQkJCQkJCTAsIG1zZywgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGMwZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRvZXMgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIHsKLQkJCi0JcHJpdmF0ZSBEZXBlbmRlbmN5SW5mb01nciBkZXBJbmZvTWdyOwotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHZlSW5mbzsKLQlwcml2YXRlIGJvb2xlYW4gbW92ZSA9IGZhbHNlOwotCQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhEZXBlbmRlbmN5SW5mb01nciBtZ3IsIFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwKLQkJCQkJCQkJYm9vbGVhbiBmaWx0ZXIsIGJvb2xlYW4gbW92ZSkgewotCQlkZXBJbmZvTWdyID0gbWdyOwotCQl2ZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KHZlLCBmaWx0ZXIsIGZhbHNlKTsKLQkJdGhpcy5tb3ZlID0gbW92ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlcGVuZGVuY3lJbmZvTWdyIGdldERlcEluZm9NZ3IoKSB7Ci0JCXJldHVybiBkZXBJbmZvTWdyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIGdldFZlSW5mbygpIHsKLQkJcmV0dXJuIHZlSW5mbzsKLQl9Ci0JCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0KLQkJaWYgKHJlYWNoYWJsZShvYmosIHRydWUsIHRydWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChtb3ZlKSB7Ci0JCQlpZighKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkpIHJldHVybiB0cnVlOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG9ialZlQmFzZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmopLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChvYmpWZUJhc2UgIT0gbnVsbCkgewotCQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gZGVwSW5mb01nci5yZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudChvYmpWZUJhc2UsIGZhbHNlLCBmYWxzZSk7CQotCQkJCWlmIChpbmZvLnJlYWNoYWJsZUJ5KHZlSW5mbykpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlYWNoYWJsZShPYmplY3Qgb2JqLCBib29sZWFuIGNoZWNrUmVhY2hhYmxlQnlPYmosIGJvb2xlYW4gY2hlY2tSZWFjaGFibGVUb09iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSB2ZUluZm8uZ2V0RWxlbWVudCgpOwotCQlpZiAodmUgPT0gb2JqKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJCQkKLQkJfQotCi0JCUlEZXBlbmRlbmN5SW5mbyBvYmpWZUluZm8gPSBkZXBJbmZvTWdyLnJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KCAoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBtb3ZlKTsJCQotCQkKLQkJaWYgKGNoZWNrUmVhY2hhYmxlQnlPYmogJiYgdmVJbmZvLnJlYWNoYWJsZUJ5KG9ialZlSW5mbykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tSZWFjaGFibGVUb09iaiAmJiBvYmpWZUluZm8ucmVhY2hhYmxlQnkodmVJbmZvKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gcmVhY2hhYmxlQnkoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gcmVhY2hhYmxlKG9iaiwgdHJ1ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVUbyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiByZWFjaGFibGUob2JqLCBmYWxzZSwgdHJ1ZSk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9DaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzUzYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIGZpbHRlciBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyIGV4dGVuZHMgQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgaW1wbGVtZW50cyBJRmlsdGVyIHsJCi0JCi0JcHJpdmF0ZSBNYXAgYW5jZXN0b3JNYXA7Ci0JCi0JCi0JcHVibGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXN1cGVyKG1nciwgdmUsIHRydWUsIGZhbHNlKTsKLQkJCi0JCQotCQkKLQl9CQkJCi0JCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQkKLS8qCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBWZVRvQ2hlY2soT2JqZWN0IG9iaikgewotCQlyZXR1cm4gCW9iaiBpbnN0YW5jZW9mIERvbWFpbiB8fCAJCQkJLy9nZXRTdWJkb21haW5zCi0JCQkJb2JqIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkgfHwgCQkvL2dldFN1YkNhdGVnb3JpZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCAJCQkJLy9nZXRDb250YWluZWRBcnRpZmFjdHMKLQkJCQlvYmogaW5zdGFuY2VvZiBQcmFjdGljZSB8fCAJCQkJLy9nZXRTdWJQcmFjdGljZXMKLQkJCQlvYmogaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSB8fAkJCS8vZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzCi0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7CQkJCS8vZ2V0QnJlYWtkb3duRWxlbWVudHMKLQl9Ki8KLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5Q2hlY2tlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmN2UwYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFzIHN0YXRpYyBtZXRob2RzIHRoYXQgY2hlY2sgZm9yIGN5Y2xlcyBpbiB0aGUgZWxlbWVudCBkZXBlbmRlbmN5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBlbmRlbmN5Q2hlY2tlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBFUlJPUl9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQlMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMCwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrIAkJPSB0cnVlOwkJCS8vdGVtcCBmbGFnLCB3aWxsIGJlIHJlbW92ZWQhCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5ld0NoZWNrQWN0IAk9IHRydWU7CQkJLy90ZW1wIGZsYWcsIHdpbGwgYmUgcmVtb3ZlZCEKLQotCS8qKgotCSAqIENoZWNrcyBmb3IgdGhlIGN5Y2xlcyBpbiB0aGUgZGVwZW5kZW5jeSBncmFwaCBvZiB0aGUgZ2l2ZW4gZmVhdHVyZSBpZiB0aGUKLQkgKiBnaXZlbiB2YWx1ZSBpcyBhZGRlZC9hc3NpZ25lZCB0byBpdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvd25lciBvZiB0aGUgZmVhdHVyZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB0byBjaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIGFkZGVkL2Fzc2lnbmVkIHRvIHRoZSBmZWF0dXJlCi0JICogQHJldHVybiBjaGVjayBzdGF0dXMsIE9LIGlmIG5vIGN5Y2xlLCBFUlJPUiBpZiB0aGVyZSB3aWxsIGJlIGNpcmN1bGFyCi0JICogICAgICAgICBkZXBlbmRlbmN5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KEVPYmplY3Qgb3duZXIsCi0JCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUykgewotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgb3duZXI7Ci0JCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUgPSBhY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0aXZpdHksIChBY3Rpdml0eSkgdmFsdWUsIHR5cGUpOwotCQkJfQotCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKSB7Ci0JCQlpZiAoaXNDaXJjdWxhckRlcGVuZGVuY3koKFZhcmlhYmlsaXR5RWxlbWVudCkgb3duZXIsCi0JCQkJCShWYXJpYWJpbGl0eUVsZW1lbnQpIHZhbHVlKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUykgewotCQkJaWYgKCFjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSl2YWx1ZSwgKERlbGl2ZXJhYmxlKW93bmVyKSkgewotCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IodmFsdWUpIHsKLQotCQkJCQkvKioKLQkJCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkJICovCi0JCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMOwotCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2Uob2JqZWN0KSkgewotCQkJCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBvYmplY3Q7Ci0JCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVPYmplY3QuZUdldChmZWF0dXJlKTsKLQkJCQkJCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQlpZiAoZmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoCi0JCQkJCQkJCQkJCWVsZW1lbnQpKSB7Ci0JCQkJCQkJCQkJY2hpbGRyZW4uYWRkKGVsZW1lbnQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0KLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJaWYgKGl0ZXIubmV4dCgpID09IG93bmVyKSB7Ci0JCQkJCQlyZXR1cm4gRVJST1JfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKLQkJCQkJRU9iamVjdCB2ID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQlkbyB7Ci0JCQkJCQlpZiAodiA9PSBvd25lcikgewotCQkJCQkJCXJldHVybiBFUlJPUl9TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCQlPYmplY3QgbyA9IHYuZUdldChmZWF0dXJlKTsKLQkJCQkJCWlmIChmZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShvKSkgewotCQkJCQkJCXYgPSAoRU9iamVjdCkgbzsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdiA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0gd2hpbGUgKHYgIT0gbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciBjaXJjdWxhciBkZXBlbmRlbmN5IGlmIHRoZSBnaXZlbiBhY3Rpdml0eSBpcyBhcHBsaWVkIHRvIHRoZQotCSAqIGdpdmVuIHRhcmdldCBhY3Rpdml0eSB2aWEgZXh0ZW5kIG9yIGNvcHkuCi0JICogCi0JICogQHBhcmFtIGFjdGl2aXR5IGFjdGl2aXR5IHRvIGFwcGx5Ci0JICogQHBhcmFtIHRhcmdldCB0YXJnZXQgYWN0aXZpdHkgdG8gYWRkIGV4dGVuc2lvbiBvciBjb3B5IG9mIHRoZSBnaXZlbiBhY3Rpdml0eQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoaXMgY2hlY2sKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0aXZpdHksIEFjdGl2aXR5IHRhcmdldCkgewotCQlpZiAoaXNQYXJlbnQoYWN0aXZpdHksIHRhcmdldCkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IHRhcmdldC5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzEsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJUHJvY2VzcyBwcm9jZXNzID0gVG5nVXRpbC5nZXRPd25pbmdQcm9jZXNzKHRhcmdldCk7Ci0JCWlmKCFuZXdDaGVja0FjdCAmJiBoYXNDeWNsaWNEZXBlbmRlbmN5KGFjdGl2aXR5LCBwcm9jZXNzKSB8fAotCQkJCW5ld0NoZWNrQWN0ICYmIHNvdXJjZVJlYWNoYWJsZUJ5VGFyZ2V0KGFjdGl2aXR5LCB0YXJnZXQpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3Rpdml0eS5nZXROYW1lKCksIHByb2Nlc3MuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFwcGx5X3BhdHRlcm5fZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYoUHJvY2Vzc1V0aWwuaGFzQ29udHJpYnV0b3JPclJlcGxhY2VyKGFjdGl2aXR5KSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0aXZpdHkuZ2V0TmFtZSgpLCBwcm9jZXNzLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYXBwbHlfcGF0dGVybl9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCi0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQ3ljbGljRGVwZW5kZW5jeShBY3Rpdml0eSBhY3Rpdml0eSwgUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoYWN0aXZpdHkpIHsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICovCi0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gKChBY3Rpdml0eSkgb2JqZWN0KQotCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJCQljaGlsZHJlbi5hZGQoZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgdlR5cGUgPSB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmIChiYXNlICE9IG51bGwgJiYgKHZUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSkgewotCQkJCVByb2Nlc3MgcHJvYyA9IFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBiYXNlKTsKLQkJCQlpZiAocHJvYyA9PSBwcm9jZXNzKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHBhcmVudCBpcyBhIHN1cGVyIGFjdGl2aXR5IG9mIGNoaWxkLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFyZW50KEFjdGl2aXR5IHBhcmVudCwgQnJlYWtkb3duRWxlbWVudCBjaGlsZCkgewotCQlmb3IgKEFjdGl2aXR5IGFjdCA9IGNoaWxkLmdldFN1cGVyQWN0aXZpdGllcygpOyBhY3QgIT0gbnVsbDsgYWN0ID0gYWN0Ci0JCQkJLmdldFN1cGVyQWN0aXZpdGllcygpKSB7Ci0JCQlpZiAoYWN0ID09IHBhcmVudCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgZm9yIGN5Y2xlcyBpbiBkZXBlbmRlbmN5IHBhdGggb2YgdGhlIGdpdmVuIGFjdGl2aXR5Ci0JICogPGNvZGU+YWN0PC9jb2RlPiBpZiA8Y29kZT5iYXNlPC9jb2RlPiBpcyB0aGUgYmFzZSBhY3Rpdml0eSBvZgotCSAqIDxjb2RlPmFjdDwvY29kZT4gZm9yIGdpdmVuIHZhcmlhYmlsaXR5IHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gYWN0Ci0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koQWN0aXZpdHkgYWN0LCBBY3Rpdml0eSBiYXNlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSwgdHlwZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSkgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckRlcGVuZGVuY3koYWN0LCBiYXNlLCB0eXBlLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kZW5jeShBY3Rpdml0eSBhY3QsIEFjdGl2aXR5IGJhc2UsCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSwgYm9vbGVhbiBmaWx0ZXJpbmcpIHsKLQkJaWYoKGJhc2UgaW5zdGFuY2VvZiBQcm9jZXNzKQotCQkJCSYmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgJiYgIShhY3QgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2czOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChpc1BhcmVudChiYXNlLCBhY3QpKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cxLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9IAotCQllbHNlIGlmIChuZXdDaGVja0FjdCAmJiBmaWx0ZXJpbmcpIHsKLQkJCUlGaWx0ZXIgZmlsdGVyID0gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2tGaWx0ZXIoYWN0KTsKLQkJCWlmICghIGZpbHRlci5hY2NlcHQoYmFzZSkpIHsKLQkJCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCQkuYmluZCgKLQkJCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnMiwKLQkJCQkJCQkJYXJncyk7Ci0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWVsc2UgaWYgKGlzQ2lyY3VsYXJEZXBlbmRlbmN5KGFjdCwgYmFzZSkpIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IGFjdC5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUwotCQkJCQkuYmluZCgKLQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5hY3Rpdml0eV92YXJpYWJpbGl0eV9lcnJvcl9tc2cyLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCS8vIGJsb2NrIGZvciBjaGlsZHJlbgotCQllbHNlIGlmIChQcm9jZXNzVXRpbC5oYXNDb250cmlidXRvck9yUmVwbGFjZXIoYmFzZSkKLQkJCQkmJiB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKSB7Ci0JCQlPYmplY3RbXSBhcmdzID0geyBhY3QuZ2V0TmFtZSgpLCBiYXNlLmdldE5hbWUoKSB9OwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuYWN0aXZpdHlfdmFyaWFiaWxpdHlfZXJyb3JfbXNnLAotCQkJCQkJCWFyZ3MpOwotCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQlpZihwcm9jZXNzICE9IG51bGwgJiYgaGFzQ3ljbGljRGVwZW5kZW5jeShiYXNlLCBwcm9jZXNzKSkgewotCQkJT2JqZWN0W10gYXJncyA9IHsgYWN0LmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmFjdGl2aXR5X3ZhcmlhYmlsaXR5X2Vycm9yX21zZzIsCi0JCQkJCQkJYXJncyk7Ci0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgaWYgPGNvZGU+YmFzZTwvY29kZT4gaXMgdGhlIGJhc2UgZWxlbWVudAotCSAqIG9mIHRoZSBnaXZlbiA8Y29kZT5lbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgYmFzZSBlbGVtZW50Ci0JICogQHJldHVybiBzdGF0dXMgd2hpY2ggaW5kaWNhdGVzIGNpcmN1bGFyIGRlcGVuZWRlbmN5IGlzIGRldGVjdGVkIG9yIG5vdAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaXJjdWxhckRlcGVuZGVuY3koVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSkgewotCQkvLyBzdGFuZGFyZCBjaGVjawotCQkvLwotCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGJhc2UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCXdoaWxlICh0eXBlICE9IFZhcmlhYmlsaXR5VHlwZS5OQSkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gYmFzZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAodmUgIT0gbnVsbCAmJiB2ZSA9PSBlbGVtZW50KQotCQkJCXJldHVybiB0cnVlOwotCQkJYmFzZSA9IHZlOwotCQkJdHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciBnaXZlbiBkZWxpdmVyYWJsZXMgbGVhZHMgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeQotCSAqIAotCSAqIEBwYXJhbSB0b0JlUGFydAotCSAqIEBwYXJhbSBkZWxpdmVyYWJsZQotCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlIHdoZXRoZXIgY2lyY3VsYXIgZGVwZW5kZW5jeSBpcwotCSAqICAgICAgICAgZGV0ZWN0ZWQsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIGNpcmN1bGFyIGRlcGVuZGVuY3kKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckRlbGl2ZXJhYmxlcyhEZWxpdmVyYWJsZSB0b0JlUGFydCwKLQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlKSB7Ci0JCWlmIChuZXdDaGVjaykgewotCQkJcmV0dXJuICEgc291cmNlUmVhY2hhYmxlQnlUYXJnZXQodG9CZVBhcnQsIGRlbGl2ZXJhYmxlKTsKLQkJfQotCQkKLQkJaWYgKHRvQmVQYXJ0ID09IGRlbGl2ZXJhYmxlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJamF2YS51dGlsLkxpc3QgZGVsaXZlcmFibGVzID0gdG9CZVBhcnQuZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCWlmIChkZWxpdmVyYWJsZXMgIT0gbnVsbCAmJiBkZWxpdmVyYWJsZXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKGRlbGl2ZXJhYmxlcy5jb250YWlucyhkZWxpdmVyYWJsZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRlbGl2ZXJhYmxlcy5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBjaGVja0NpcmN1bGFyRGVsaXZlcmFibGVzKChEZWxpdmVyYWJsZSkgb2JqLAotCQkJCQkJCWRlbGl2ZXJhYmxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBDdXN0b21DYXRlZ29yeSBpcyBhbiBhbmNlc3RvciBvZiB0aGUgZ2l2ZW4KLQkgKiBEZXNjaWJhYmxlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYwotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FuY2Vzc29yT2YoQ3VzdG9tQ2F0ZWdvcnkgY2MsIERlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IoY2MsIGZhbHNlKSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQkJcmV0dXJuICgoQ3VzdG9tQ2F0ZWdvcnkpIG9iamVjdCkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlci5uZXh0KCkgPT0gZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hlbiBtb3ZpbmcgYSBjb2xsZWN0aW9uIG9mIGFydGlmYWN0IG9iamVjdHMKLQkgKiBpbiAic291cmNlRWxlbWVudHMiIHVuZGVyICJkZXN0aW5hdGlvbiIKLQkgKiAKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiBAcGFyYW0gc291cmNlRWxlbWVudHMKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm8gY2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzKSB7Ci0JCUhhc2hTZXQgdmFyaWFudFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWNvbGxlY3RWYXJpYW50U2V0KGRlc3RpbmF0aW9uLCB2YXJpYW50U2V0LCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQljb2xsZWN0VmFyaWFudFNldChkZXN0aW5hdGlvbiwgdmFyaWFudFNldCwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpOwotCQlpZiAoISBjaGVja0NpcmN1bGFyRm9yQXJ0aWZhY3RzMShkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIHZhcmlhbnRTZXQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKGRlc3RpbmF0aW9uLCBzb3VyY2VFbGVtZW50cyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoQXJ0aWZhY3QgZGVzdGluYXRpb24sCi0JCQlDb2xsZWN0aW9uIHNvdXJjZUVsZW1lbnRzLCBIYXNoU2V0IHZhcmlhbnRTZXQpIHsKLQkJaWYgKHNvdXJjZUVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvdXJjZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJaWYob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QpewotCQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBvYmo7Ci0JCQkJaWYgKHZhcmlhbnRTZXQuY29udGFpbnMoYXJ0aWZhY3QpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKCEgY2hlY2tDaXJjdWxhckZvckFydGlmYWN0czEoZGVzdGluYXRpb24sIGFydGlmYWN0LmdldENvbnRhaW5lZEFydGlmYWN0cygpLCB2YXJpYW50U2V0KSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JBcnRpZmFjdHMyKEFydGlmYWN0IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzb3VyY2VFbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZSgoQXJ0aWZhY3QpIG9iaiwgZGVzdGluYXRpb24pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNvdXJjZUlzT3JBYm92ZU1lKEFydGlmYWN0IHNvdXJjZSwgQXJ0aWZhY3QgbWUpIHsKLQkJaWYgKHNvdXJjZSA9PSBtZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJT2JqZWN0IG9iaiA9IG1lLmdldENvbnRhaW5lckFydGlmYWN0KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBBcnRpZmFjdCAmJiBzb3VyY2VJc09yQWJvdmVNZShzb3VyY2UsIChBcnRpZmFjdCkgb2JqKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJb2JqID0gbWUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQlpZiAob2JqIGluc3RhbmNlb2YgQXJ0aWZhY3QgJiYgc291cmNlSXNPckFib3ZlTWUoc291cmNlLCAoQXJ0aWZhY3QpIG9iaikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vQ29sbGVjdCBhbGwgdmFyaWFudHMgb2YgImEiIGFuZCAiYSJzIGFuY2VzdHJvciBBcnRpZmFjdCBvYmplY3RzCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb2xsZWN0VmFyaWFudFNldChBcnRpZmFjdCBhLCBIYXNoU2V0IHZhcmlhbnRTZXQsIFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCXdoaWxlIChhICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGEsIHR5cGUpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQl2YXJpYW50U2V0LmFkZChpdGVyLm5leHQoKSk7Ci0JCQl9Ci0JCQlhID0gYS5nZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQl9Ci0JfQkJCQotCQotCXByaXZhdGUgc3RhdGljIENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQkJCWJvb2xlYW4gZmlsdGVyLCBib29sZWFuIG1vdmUsIGJvb2xlYW4gZG5kKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hVXRpbC5nZXRNZXRob2RMaWJyYXJ5KHZlKTsJCQkJCQkKLQkJRGVwZW5kZW5jeUluZm9NZ3IgZGVwSW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCQlkZXBJbmZvTWdyLnNldERuZEJpdChkbmQpOwotCQlyZXR1cm4gbmV3IENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrKGRlcEluZm9NZ3IsIHZlLCBmaWx0ZXIsIG1vdmUgfHwgZG5kKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzb3VyY2VSZWFjaGFibGVCeVRhcmdldChWYXJpYWJpbGl0eUVsZW1lbnQgc291cmNlLCBWYXJpYWJpbGl0eUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXJldHVybiBnZXRDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhzb3VyY2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLnJlYWNoYWJsZUJ5KHRhcmdldCk7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2sgZmlsdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsdGVyIGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeSh2ZSk7CQkJCQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGRlcEluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3IobGliKTsKLQkJcmV0dXJuIG5ldyBDaXJjdWxhckRlcGVuZGVuY3lDaGVja0ZpbHRlcihkZXBJbmZvTWdyLCB2ZSk7Ci0JfQkKLQkKLQkvL1JldHVybiB0cnVlIGlmIG5vIGNpcmN1bGFyIGRldGVjdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cykgewotCQlyZXR1cm4gY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChkZXN0aW5hdGlvbiwgc291cmNlRWxlbWVudHMsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQ2lyY3VsYXJGb3JNb3ZpbmdWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IGRlc3RpbmF0aW9uLAotCQkJQ29sbGVjdGlvbiBzb3VyY2VFbGVtZW50cywgYm9vbGVhbiBkbmQpIHsKLQkJaWYgKCEgRGVwZW5kZW5jeUluZm9NZ3IuVmVUb0NoZWNrKGRlc3RpbmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUNpcmN1bGFyRGVwZW5kZW5jeUNoZWNrIGNoZWNrID0gZ2V0Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2soZGVzdGluYXRpb24sIGZhbHNlLCB0cnVlLCBkbmQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc291cmNlRWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJaWYgKCEgY2hlY2suYWNjZXB0KGl0Lm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckZvckFwcGx5aW5nVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBib29sZWFuIGRuZCkgewotCQlib29sZWFuIG9rID0gY2hlY2tDaXJjdWxhckZvck1vdmluZ1ZhcmlhYmlsaXR5RWxlbWVudChiYXNlLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHZlKSwgdHJ1ZSk7Ci0JCWlmICghb2spIHsKLQkJCU9iamVjdFtdIGFyZ3MgPSB7IHZlLmdldE5hbWUoKSwgYmFzZS5nZXROYW1lKCkgfTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTCi0JCQkJCS5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLnZhcmlhYmlsaXR5X2Vycm9yX21zZywKLQkJCQkJCQlhcmdzKTsJCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5RWRpdFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldElkKCksIDAsIG1lc3NhZ2UsIG51bGwpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZGVuY3lBZnRlckZpbHRlclNlbGVjdGlvbihWYXJpYWJpbGl0eUVsZW1lbnQgdmUsIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCQlJRmlsdGVyIGZpbHRlciA9IGdldENpcmN1bGFyRGVwZW5kZW5jeUNoZWNrRmlsdGVyKHZlKTsKLQkJCWlmICghIGZpbHRlci5hY2NlcHQoYmFzZSkpIHsKLQkJCQlPYmplY3RbXSBhcmdzID0geyB2ZS5nZXROYW1lKCksIGJhc2UuZ2V0TmFtZSgpIH07Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMKLQkJCQkJCS5iaW5kKAotCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lcnJvcl9tc2csCi0JCQkJCQkJCWFyZ3MpOwkJLy9Ob3QgcmlnaHQgbWVzc2FnZSwgbmVlZCB0byBhZGQgYSBuZXcgcmVzb3VjZSBzdHJpbmcgbGF0ZXIhCi0JCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0SWQoKSwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lJbmZvTWdyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzZDY5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vRGVwZW5kZW5jeUluZm9NZ3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBjaXJjdWxhciBkZXBlbmRlbmN5IGluZm8uCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUluZm9NZ3IgewotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNYXAgcmVhY2hhYmxlSW5mb01hcDsJLy97Z3VpZCwgdXB3YXJkUmVhY2hhYmxlSW5mb30KLQlwcml2YXRlIE1hcCByZXBsYWNlck1hcDsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGZpbHRlckVsZW1lbnQ7Ci0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IG1vdmVFbGVtZW50OwotCXByaXZhdGUgTGlzdCBjaXJjdWxhckxpc3Q7Ci0JcHJpdmF0ZSBib29sZWFuIGRuZEJpdCA9IGZhbHNlOwotCQotCXB1YmxpYyBEZXBlbmRlbmN5SW5mb01ncihNZXRob2RMaWJyYXJ5IGxpYikgewotCQl0aGlzLmxpYiA9IGxpYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9nQ2lyY3VsYXJEZXBlbmRlbmN5KFN0YWNrIHRyYWNlKSB7Ci0JCWlmIChjaXJjdWxhckxpc3QgPT0gbnVsbCkgewotCQkJY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWNpcmN1bGFyTGlzdC5hZGRBbGwodHJhY2UpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgZ2V0QW5kQ2xlYXJDaXJjdWxhckxpc3QoKSB7Ci0JCUxpc3QgcmV0ID0gY2lyY3VsYXJMaXN0OwotCQljaXJjdWxhckxpc3QgPSBudWxsOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlckVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBmaWx0ZXJFbGVtZW50ID09IGVsZW07Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbSkgewotCQlyZXR1cm4gbW92ZUVsZW1lbnQgPT0gZWxlbTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXR1cyBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeShWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB2ZTogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aCh2ZSkpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gcmVnaXN0ZXJWYXJpYWJpbGl0eUVsZW1lbnQodmUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCWJvb2xlYW4gbG9vcCA9IGNpckxpc3QgIT0gbnVsbCAmJiAhY2lyTGlzdC5pc0VtcHR5KCk7Ci0JCWJvb2xlYW4gcmVwbGFjaW5nQW5jZXN0b3IgPSBpbmZvLmluaGVyaXRBbmNlc3RvcihWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQlib29sZWFuIGFjdEluaGVyZW50aW5nQW5jZXN0b3IgPSBnZXRBY3RJbmVyZW50aW5nQW5jZXN0b3IodmUpOwotCQkKLQkJTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoTGlicmFyeUVkaXRQbHVnaW4uUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxvb3ApIHsKLQkJCWxvZygiRXJyb3I+IENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQ6ICIpOwkJLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJRGVwZW5kZW5jeUluZm8gbG9vcEluZm8gPSAoSURlcGVuZGVuY3lJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBsb29wSW5mby5nZXRFbGVtZW50KCk7CQkJCQkJCQotCQkJCWxvZygiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBnZW5FcnJvck1zZyhjaXJMaXN0KSwgdmUsIG51bGwpKTsJCQkKLQkJfQotCQlpZiAocmVwbGFjaW5nQW5jZXN0b3IpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8uZ2V0RWxlbWVudCgpOwotCQkJbG9nKCJFcnJvcj4gIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSArICIgaXMgcmVwbGFjaW5nIGFuIGFuY2VzdG9yLiIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgTGlicmFyeUVkaXRSZXNvdXJjZXMucmVwbGFjaW5nX2FuY2VzdG9yX2Vycm9yX21zZywgdmUsIG51bGwpKTsJCQkJCQkJCi0JCX0KLQkJaWYgKGFjdEluaGVyZW50aW5nQW5jZXN0b3IpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGluZm8uZ2V0RWxlbWVudCgpOwotCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIExpYnJhcnlFZGl0UmVzb3VyY2VzLmNpcmN1bGFyX2RlcGVuZGVuY3lfZXJyb3JfbXNnLCB2ZSwgbnVsbCkpOwkJCQkJCQkKLQkJfQotCi0JCQotCQkKLQkJcmV0dXJuIG11bHRpU3RhdHVzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXRBY3RJbmVyZW50aW5nQW5jZXN0b3IoVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCWlmICh2ZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSAhPSBudWxsKSB7Ci0JCQkJZm9yIChBY3Rpdml0eSBhY3QgPSAoKEFjdGl2aXR5KSB2ZSkuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IAotCQkJCQkJCQkJYWN0ICE9IG51bGw7IGFjdCA9IGFjdC5nZXRTdXBlckFjdGl2aXRpZXMoKSkgewotCQkJCQlpZiAoYWN0ID09IGJhc2UpIHsKLQkJCQkJCXJldHVybiB0cnVlOwkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkVycm9yTXNnKExpc3QgY2lyTGlzdCkgewotCQlTdHJpbmcgbXNnID0gTGlicmFyeUVkaXRSZXNvdXJjZXMudmFyaWFiaWxpdHlfZWxlbWVudF9jaXJjdWxhcl9sb29wX2Vycm9yX21zZzsKLQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBsb29wSW5mbyA9IChJRGVwZW5kZW5jeUluZm8pIGNpckxpc3QuZ2V0KGkpOwotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwdWJsaWMgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50KSB7Ci0JCXJldHVybiByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCh2ZSwgaXNGaWx0ZXJFbGVtZW50LCBpc01vdmVFbGVtZW50LCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgSURlcGVuZGVuY3lJbmZvIHJlZ2lzdGVyVmFyaWFiaWxpdHlFbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgCi0JCQlib29sZWFuCWlzRmlsdGVyRWxlbWVudCwgYm9vbGVhbiBpc01vdmVFbGVtZW50LCBib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGlzRmlsdGVyRWxlbWVudCkgewotCQkJZmlsdGVyRWxlbWVudCA9IHZlOwotCQl9Ci0JCWlmIChpc01vdmVFbGVtZW50KSB7Ci0JCQltb3ZlRWxlbWVudCA9IHZlOwotCQl9CQkKLQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSAgZ2V0UHJvY2Vzc2VkSW5mbyh2ZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsJCQotCQkJaW5mbyA9IG5ld0RlcGVuZGVuY3lJbmZvKHRoaXMsIHZlKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2VkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEZXBlbmRlbmN5SW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkID09IG51bGwgPyBudWxsIDogKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkLmdldChlbGVtZW50LmdldEd1aWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUHJvY2Vzc2VkKElEZXBlbmRlbmN5SW5mbyBpbmZvKSB7Ci0JCWlmIChwcm9jZXNzZWQgPT0gbnVsbCkgewotCQkJcHJvY2Vzc2VkID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlwcm9jZXNzZWQucHV0KGluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgaW5mbyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUmVwbGFjZXJNYXAoSURlcGVuZGVuY3lJbmZvIHJlcGxhY2VySW5mbykgewotCQlpZiAocmVwbGFjZXJNYXAgPT0gbnVsbCkgewotCQkJcmVwbGFjZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXJlcGxhY2VyTWFwLnB1dChyZXBsYWNlckluZm8uZ2V0RWxlbWVudCgpLmdldEd1aWQoKSwgcmVwbGFjZXJJbmZvKTsKLQl9CQotCQkKLQlwcml2YXRlIElEZXBlbmRlbmN5SW5mbyBhZGRUb1JlYWNoYWJsZUluZm9NYXAoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChyZWFjaGFibGVJbmZvTWFwID09IG51bGwpIHsKLQkJCXJlYWNoYWJsZUluZm9NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgcmVhY2hhYmxlSW5mb01hcC5nZXQoZWxlbS5nZXRHdWlkKCkpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7CQkKLQkJCWluZm8gPSBuZXdEZXBlbmRlbmN5SW5mbyh0aGlzLCBlbGVtKTsKLQkJCXJlYWNoYWJsZUluZm9NYXAucHV0KGVsZW0uZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQkJCi0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qCi0JICogRGV0ZWN0IGNpcmN1bGFyIGRlcGVuZGVuY3kgZm9yIHRoZSB3aG9sZSBsaWJyYXJ5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2lyY3VsYXJEZXBlbmRlbmN5KCkgIHsKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwKCk7Ci0JCQotCQlib29sZWFuIHJlcGxhY2luZ0FjZXN0b3IgPSBmYWxzZTsKLQkJaWYgKHJlcGxhY2VyTWFwICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBsYWNlck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKSkgewotCQkJCQlyZXBsYWNpbmdBY2VzdG9yID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnICYmIGNpcmN1bGFyTGlzdCAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDaXJjdWxhciBsb29wcyBkZXRlY3RlZDogIik7CS8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaXJjdWxhckxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0YWNrIHN0YWNrID0gKFN0YWNrKSBpdC5uZXh0KCk7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN0YWNrLnNpemUoKTsgaSsrKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICIgKyAoaSkgKyAiOiAiICsgc3RhY2suZ2V0KGkpKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmVwbGFjaW5nQWNlc3RvciB8fCBudW1DaXJjdWxhckRlcGVuZGVuY3koKSA+IDA7Ci0JfQotCQotCXByaXZhdGUgaW50IG51bUNpcmN1bGFyRGVwZW5kZW5jeSgpIHsKLQkJcmV0dXJuIGNpcmN1bGFyTGlzdCA9PSBudWxsID8gMCA6IGNpcmN1bGFyTGlzdC5zaXplKCk7Ci0JfQotCQotCS8vdG8gYmUgc3BlY2lhbGl6ZWQgYnkgc3ViIGNsYXNzZXMKLQlwcm90ZWN0ZWQgSURlcGVuZGVuY3lJbmZvIG5ld0RlcGVuZGVuY3lJbmZvKERlcGVuZGVuY3lJbmZvTWdyIG1nciwgTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiAgbmV3IFVwd2FyZFJlYWNoYWJsZUluZm8odGhpcywgZWxlbSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWNoYWJsZUluZm9NYXAoKSB7Ci0JCWxvbmcgdXNlZE1lbTAgPSAwOwotCQlSdW50aW1lIHJ0ID0gUnVudGltZS5nZXRSdW50aW1lKCk7IAotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGliLmVBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaXQubmV4dCgpOwotCQkJfQotCQkJUHJvZmlsaW5nVXRpbC5mdWxsR0MoKTsKLQkJCXVzZWRNZW0wID0gcnQudG90YWxNZW1vcnkoKSAtIHJ0LmZyZWVNZW1vcnkoKTsKLQkJfQotCQkKLQkJYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFjaGFibGVJbmZvTWFwXygpIHsKLQkJcmVhY2hhYmxlSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBsdWdpbnMuZ2V0KGkpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKFZlVG9DaGVjayhvYmopKSB7Ci0JCQkJCWFkZFRvUmVhY2hhYmxlSW5mb01hcCgoTWV0aG9kRWxlbWVudCkgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWFjaGFibGVJbmZvTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaXQubmV4dCgpOwotCQkJaWYgKCEgcHJvY2Vzc2VkKGluZm8uZ2V0RWxlbWVudCgpKSkgewotCQkJCWluZm8uYnVpbGQodHJ1ZSk7Ci0JCQl9Ci0JCX0JCi0KLQl9CQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFZlVG9DaGVjayhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiAJb2JqIGluc3RhbmNlb2YgRG9tYWluIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIEFydGlmYWN0IHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIFByYWN0aWNlIHx8IAotCQkJCW9iaiBpbnN0YW5jZW9mIERlbGl2ZXJhYmxlIHx8Ci0JCQkJb2JqIGluc3RhbmNlb2YgQWN0aXZpdHk7Ci0JfQotCQotCS8qCi0JICogQ2hlY2sgY2lyY3VsYXIgZGVwZW5kZW5jeSBmb3IgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIpIHsKLQkJbG9uZyB1c2VkTWVtMCA9IDA7Ci0JCVJ1bnRpbWUgcnQgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsgCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpdC5uZXh0KCk7Ci0JCQl9Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJdXNlZE1lbTAgPSBydC50b3RhbE1lbW9yeSgpIC0gcnQuZnJlZU1lbW9yeSgpOwotCQl9Ci0KLQkJQ2hlY2tSZXN1bHQgcmVzdWx0ID0gY2hlY2tDaXJjdWxhckRlcGVuZG5lY3lfKHRyYWNlcik7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlcikgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUhhc2hTZXQgc2VlbiA9IG5ldyBIYXNoU2V0KCk7Ci0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGlpdCA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaWl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaWl0Lm5leHQoKTsKLQkJCQlpZiAoc2Vlbi5jb250YWlucyhvYmopKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlzZWVuLmFkZChvYmopOwkJCQkKLQkJCQlpZiAoVmVUb0NoZWNrKG9iaikpIHsKLQkJCQkJSURlcGVuZGVuY3lJbmZvIGluZm8gPSByZWdpc3RlclZhcmlhYmlsaXR5RWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmosIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJCUxpc3QgY2lyTGlzdCA9IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCk7Ci0JCQkJCQotCQkJCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQkJCQlib29sZWFuIHJlcGxhY2luZ0FuY2VzdG9yID0gaW5mby5pbmhlcml0QW5jZXN0b3IoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQkJCQkJCi0JCQkJCWlmIChsb29wKSB7Ci0JCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiBDaXJjdWxhciBkZXBlbmRlbmN5IGRldGVjdGVkOiAiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGk9MDsgaTxjaXJMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJSURlcGVuZGVuY3lJbmZvIGxvb3BJbmZvID0gKElEZXBlbmRlbmN5SW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0RWxlbWVudCgpOwkJCQkJCQkKLQkJCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJcmVzdWx0LmNpcmN1bGFyTGlzdC5hZGQoY2lyTGlzdCk7Ci0JCQkJCX0KLQkJCQkJaWYgKHJlcGxhY2luZ0FuY2VzdG9yKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGVsZW0gPSBpbmZvLmdldEVsZW1lbnQoKTsKLQkJCQkJCXRyYWNlci50cmFjZSgiRXJyb3I+ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkgKyAiIGlzIHJlcGxhY2luZyBhbiBhbmNlc3Rvci4iKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXJlc3VsdC5yZXBsYWNpbmdBbmNlc3Rvckxpc3QuYWRkKGluZm8pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9CQkJCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrUmVzdWx0IHsKLQkJcHVibGljIExpc3QgY2lyY3VsYXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlwdWJsaWMgTGlzdCByZXBsYWNpbmdBbmNlc3Rvckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlwdWJsaWMgaW50IGdldEVycm9yQ291bnQoKSB7Ci0JCQlyZXR1cm4gY2lyY3VsYXJMaXN0LnNpemUoKSArIHJlcGxhY2luZ0FuY2VzdG9yTGlzdC5zaXplKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKSB7Ci0JCQlpbnQgY291bnQgPSByZXBsYWNpbmdBbmNlc3Rvckxpc3Quc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0wOyBpPGNpcmN1bGFyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBjaXJjdWxhckxpc3QuZ2V0KGkpOwotCQkJCWludCBzeiA9IGxpc3QgPT0gbnVsbCA/IDAgOiBsaXN0LnNpemUoKTsKLQkJCQljb3VudCArPSBzejsKLQkJCX0KLQkJCXJldHVybiBjb3VudDsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RuZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCXJldHVybiBkbmRCaXQgJiYgbW92ZUVsZW1lbnQgPT0gZWxlbTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG5kQml0KGJvb2xlYW4gYikgewotCQlkbmRCaXQgPSBiOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9EZXBlbmRlbmN5VmFsaWRhdGlvbk1nci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lWYWxpZGF0aW9uTWdyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NDJjYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0RlcGVuZGVuY3lWYWxpZGF0aW9uTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGFsbCBkZXBlbmRlbmN5IGNoZWNrcyBmb3IgdmFsaWRhdGlvbgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyIHsKLQkKLQlwcml2YXRlIERlcGVuZGVuY3lJbmZvTWdyIHZlRGVwSW5mb01ncjsKLQlwcml2YXRlIFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyIHBsdWdpbkRlcEluZm9NZ3I7Ci0JCi0JcHVibGljIERlcGVuZGVuY3lWYWxpZGF0aW9uTWdyKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXZlRGVwSW5mb01nciA9IG5ldyBEZXBlbmRlbmN5SW5mb01ncihsaWIpOwotCQlwbHVnaW5EZXBJbmZvTWdyID0gbmV3IFBsdWdpbkRlcGVuZGVuY3lJbmZvTWdyKGxpYik7Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlyZXR1cm4gdmVEZXBJbmZvTWdyLmNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQpOwotCQl9Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJcmV0dXJuIHBsdWdpbkRlcEluZm9NZ3IuY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koKE1ldGhvZFBsdWdpbikgZWxlbWVudCk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSURlcGVuZGVuY3lJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDkyZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lEZXBlbmRlbmN5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBkZXBlbmRlbmN5IGluZm8gdXNlZCBpbiBjaXJjdWxhciBkZXBlbmRlbmN5IGNoZWNraW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEZXBlbmRlbmN5SW5mbyB7Ci0JCi0Jdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpOwotCQotCWJvb2xlYW4gaXNDb21wbGV0ZSgpOwotCQotCWJvb2xlYW4gcmVhY2hhYmxlQnkoSURlcGVuZGVuY3lJbmZvIGluZm8pOwotCQotCWJvb2xlYW4gaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZSB0eXBlKTsKLQkKLQlNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vSU5hbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDQ2Mjg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JTmFtZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgbmFtZSBmb3IgYSBzcGVjaWZpZWQgb2JqZWN0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSmFuIDMxLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOYW1lUHJvdmlkZXIgewotCVN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMjUzOTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgdmFsaWRhdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxLCAyMDA1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRvciB7Ci0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiBzdHJpbmcuIFJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IGlmIHRoZQotCSAqIG5ldyB0ZXh0IGlzIGludmFsaWQuIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZXJyb3IuCi0JICogTm90ZSB0aGF0IHRoZSBlbXB0eSBzdHJpbmcgaXMgbm90IHRyZWF0ZWQgdGhlIHNhbWUgYXMgPGNvZGU+bnVsbDwvY29kZT47Ci0JICogaXQgaW5kaWNhdGVzIGFuIGVycm9yIHN0YXRlIGJ1dCB3aXRoIG5vIG1lc3NhZ2UgdG8gZGlzcGxheS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgdG8gY2hlY2sgZm9yIHZhbGlkaXR5Ci0JICogCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9yCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KTsKLQkKLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIG9iamVjdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHZhbGlkYXRlCi0JICogQHJldHVybiBhIHN0YXR1cwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKTsKLQkKLQlwdWJsaWMgaW50IE1heEZpbGVQYXRoTmFtZUxlbmd0aCA9IDI1NTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9JVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWYwYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL0lWYWxpZGF0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb247Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZSB0byBjcmVhdGUgdmFyaW91cyB2YWxpZGF0b3JzIHRvIHZhbGlkYXRlIHN0cmluZyB2YWx1ZSBvZgotICogc3BlY2lmaWVkIG9iamVjdCBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0b3JGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElWYWxpZGF0b3JGYWN0b3J5IElOU1RBTkNFID0gVmFsaWRhdG9yRmFjdG9yeQotCQkJLmNyZWF0ZVZhbGlkYXRvckZhY3RvcnkoKTsKLQotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihOYW1lZEVsZW1lbnQgZSwgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYSBjb250ZW50IGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgQ29udGVudEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIG5hbWUgdmFsaWRhdG9yIGZvciBhIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgTmFtZWRFbGVtZW50IGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBuYW1lIHZhbGlkYXRvciBmb3IgYW4gZWxlbWVudCBvZiBuZXdUeXBlIHdpdGggbmFtZSBvZiBlLmdldE5hbWUoKQotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCUlWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBOYW1lZEVsZW1lbnQgZSwgRUNsYXNzIG5ld1R5cGUpOwotCi0JSVZhbGlkYXRvciBjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LiBUaGUgb2JqZWN0Ci0JICogaXMgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gcGFyZW50IHZpYSB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIHJlZmVyZW5jZSAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHRvIHZhbGlkYXRlIGl0cyB2YWx1ZQotCSAqIEBwYXJhbSBlQ2xhc3MKLQkgKiAgICAgICAgICAgIHRoZSBFQ2xhc3Mgb2YgdGhlIG9iamVjdCB0byB2YWxpZGF0ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgICAgbm90IGFwcGxpY2FibGUKLQkgKiBAcmV0dXJuCi0JICovCi0JSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJRUNsYXNzIGVDbGFzcywgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKLQkKLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyLCBFT2JqZWN0IG9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpOwkKLQkKLQlJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBFQ2xhc3MgZUNsYXNzLCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vTmFtZUNoZWNrZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9OYW1lQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ5MmQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9OYW1lQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHZhcmlvdXMgc3RhdGljIG1ldGhvZHMgdG8gdmFsaWRhdGUgbmFtZSBvZiBzcGVjaWZpZWQKLSAqIG9iamVjdAotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTmFtZUNoZWNrZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVEVYVCA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLmVsZW1lbnRfdGV4dDsgCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSU5hbWVQcm92aWRlciBwcmVzZW50YXRpb25OYW1lUHJvdmlkZXIgPSBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpOwotCQkJfQotCQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChEZXNjcmliYWJsZUVsZW1lbnQpb2JqZWN0KS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgZmluYWwgQ2xhc3MgdHlwZSwKLQkJCUlOYW1lUHJvdmlkZXIgbmFtZVByb3ZpZGVyLCBTdHJpbmcgbmV3TmFtZSwgU3VwcHJlc3Npb24gc3VwcHJlc2lvbiwKLQkJCWJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgewotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJcmV0dXJuIHR5cGUuaXNJbnN0YW5jZShvYmopOwotCQkJfQotCi0JCX07Ci0KLQkJcmV0dXJuIGNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwgcGFyZW50LCBlLCBjaGlsZEZpbHRlciwgbmFtZVByb3ZpZGVyLAotCQkJCW5ld05hbWUsIHN1cHByZXNpb24sIGlnbm9yZVN1cHByZXNzZWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlPYmplY3QgcGFyZW50LCBPYmplY3QgZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBuYW1lRmVhdHVyZSwgU3RyaW5nIG5ld05hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSB7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgY2hpbGRGaWx0ZXIsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCU9iamVjdCBwYXJlbnQsIE9iamVjdCBlLCBJRmlsdGVyIGNoaWxkRmlsdGVyLAotCQkJSU5hbWVQcm92aWRlciBuYW1lUHJvdmlkZXIsIFN0cmluZyBuZXdOYW1lLAotCQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24sIGJvb2xlYW4gaWdub3JlU3VwcHJlc3NlZCkgCi0JewotCQlpZiAoaWdub3JlU3VwcHJlc3NlZCkKLQkJCWlmIChzdXBwcmVzc2lvbiAhPSBudWxsICYmIHN1cHByZXNzaW9uLmlzU3VwcHJlc3NlZChlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBhZGFwdGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCi0JCS8vIGdldCBjaGlsZHJlbiBvZiB0aGUgcm9sbGVkLWRvd24gZGFwdGVyCi0JCS8vCi0JCWJvb2xlYW4gd2FzUm9sbGVkVXAgPSBmYWxzZTsKLQkJQlNBY3Rpdml0eUl0ZW1Qcm92aWRlciBic0l0ZW1Qcm92aWRlciA9IG51bGw7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgQlNBY3Rpdml0eUl0ZW1Qcm92aWRlcikgewotCQkJYnNJdGVtUHJvdmlkZXIgPSAoKEJTQWN0aXZpdHlJdGVtUHJvdmlkZXIpIGFkYXB0ZXIpOwotCQkJd2FzUm9sbGVkVXAgPSBic0l0ZW1Qcm92aWRlci5pc1JvbGxlZFVwKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmICh3YXNSb2xsZWRVcCkgewotCQkJCWJzSXRlbVByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJCX0KLQkJCWNoaWxkcmVuID0gYWRhcHRlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgZXg7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2FzUm9sbGVkVXApIHsKLQkJCQlic0l0ZW1Qcm92aWRlci5iYXNpY1NldFJvbGxlZFVwKHdhc1JvbGxlZFVwKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGUgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGl0ZW0gPSBpdGVyLm5leHQoKTsKLQotCQkJLy8gc2tpcCBjaGVja2luZyBvbiBzdXBwcmVzc2VkIGVsZW1lbnQKLQkJCS8vCi0vKjE3MDA1OAlpZiAoc3VwcHJlc3Npb24gIT0gbnVsbCAmJiBzdXBwcmVzc2lvbi5pc1N1cHByZXNzZWQoaXRlbSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0qLwotCi0JCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVtKTsKLQkJCWlmIChjaGlsZCAhPSBlICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IG5hbWVQcm92aWRlci5nZXROYW1lKGNoaWxkKTsKLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5ld05hbWUpKSB7Ci0JCQkJCS8vIHJldHVybiBJMThuVXRpbC5mb3JtYXRTdHJpbmcoUkVTT1VSQ0VfQlVORExFLCBrZXksIGRhdGEpOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQkJTGlicmFyeUVkaXRSZXNvdXJjZXMuZHVwbGljYXRlRWxlbWVudE5hbWVFcnJvcl9tc2csCi0JCQkJCQkJbmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElOYW1lUHJvdmlkZXIgY3JlYXRlTmFtZVByb3ZpZGVyKAotCQkJZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlKSB7Ci0JCWlmKG5hbWVGZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWVQcm92aWRlcjsgCi0JCX0KLQkJCi0JCXJldHVybiBuZXcgSU5hbWVQcm92aWRlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQlyZXR1cm4gKFN0cmluZykgKChFT2JqZWN0KSBvYmplY3QpLmVHZXQobmFtZUZlYXR1cmUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSAKLQl7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIG51bGwsIGUsIHR5cGUsIG5hbWVGZWF0dXJlLCBuZXdOYW1lLAotCQkJCXN1cHByZXNzaW9uLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwgT2JqZWN0IHBhcmVudCwKLQkJCWZpbmFsIEJyZWFrZG93bkVsZW1lbnQgZSwgQ2xhc3MgdHlwZSwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWVGZWF0dXJlLAotCQkJU3RyaW5nIG5ld05hbWUsIFN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIAotCXsKLQkJU3RyaW5nIG1zZyA9IGNoZWNrRW1wdHkoZSwgbmV3TmFtZSk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0KLQkJaWYodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gY2hvb3NlVHlwZShlKTsKLQkJfQotCQkKLQkJaWYocGFyZW50ID09IG51bGwpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQoZSwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCXBhcmVudCA9IGl0ZW1Qcm92aWRlci5nZXRQYXJlbnQoZSk7Ci0JCQlpZihwYXJlbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gYmFzaWMgY2hlY2sKLQkJLy8KLQkJbXNnID0gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIHR5cGUsCi0JCQkJY3JlYXRlTmFtZVByb3ZpZGVyKG5hbWVGZWF0dXJlKSwgbmV3TmFtZSwgc3VwcHJlc3Npb24sCi0JCQkJaWdub3JlU3VwcHJlc3NlZCk7Ci0KLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJcmV0dXJuIG1zZzsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIGRvbid0IGFsbG93IHRlYW0gd2l0aCB0aGUgc2FtZSBuYW1lIHdpdGhpbiB0aGUgc2FtZSBzY29wZQotCQkJLy8KLQkJCWNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBUZWFtUHJvZmlsZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLy8gUExFQVNFIERPTidUIENMRUFOIFVQLgotCQkvLyBDb21tZW50ZWQgb3V0IGZvciBub3csIHNpbmNlIHdlIGNoYW5nZSBzY29wZSBvZiBEZWxpdmVyYWJsZS4KLQkJLy8gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlKSB7Ci0JCS8vIGNoaWxkRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0JCS8vCQotCQkvLyBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkvLyByZXR1cm4gZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcgotCQkvLyAmJiAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgZSkuZ2V0V29ya1Byb2R1Y3QoKSBpbnN0YW5jZW9mCi0JCS8vIERlbGl2ZXJhYmxlOwotCQkvLyB9Ci0JCS8vIH07Ci0JCS8vIH0KLQotCQlpZiAoY2hpbGRGaWx0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNoZWNrTmFtZUluU2NvcGUoYWRhcHRlckZhY3RvcnksIHBhcmVudCwgZSwgbmFtZUZlYXR1cmUsIG5ld05hbWUsCi0JCQkJCWNoaWxkRmlsdGVyLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrRW1wdHkoT2JqZWN0IGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCS8vIHNraXAgY2hlY2tpbmcgb24gYWN0aXZpdHkgdGhhdCBpcyBhIGV4dGVuZGVyIG9yIGxvY2FsIGNvbnRyaWJ1dG9yCi0JCS8vCi0JCWlmKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBQcm9jZXNzVXRpbC5pc0V4dGVuZGluZ09yTG9jYWxseUNvbnRyaWJ1dGluZygoQnJlYWtkb3duRWxlbWVudCkgZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmcgZWxlbWVudFR5cGU7Ci0JCWlmIChlIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQllbGVtZW50VHlwZSA9IFRuZ1V0aWwuZ2V0VHlwZVRleHQoKE5hbWVkRWxlbWVudCkgZSk7Ci0JCX0gZWxzZSB7Ci0JCQllbGVtZW50VHlwZSA9IEVMRU1FTlRfVEVYVDsKLQkJfQotCQlpZiAobmV3TmFtZSA9PSBudWxsIHx8IG5ld05hbWUudHJpbSgpLmxlbmd0aCgpID09IDApIHsJCQkKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQlTdHJVdGlsLnRvTG93ZXIoZWxlbWVudFR5cGUpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5Ci0JICoge0BsaW5rICNjaGVja05hbWUoQWRhcHRlckZhY3RvcnksIEJyZWFrZG93bkVsZW1lbnQsIEVTdHJ1Y3R1cmFsRmVhdHVyZSwgU3RyaW5nLCBTdXBwcmVzc2lvbiwgYm9vbGVhbikgY2hlY2tOYW1lKCl9Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY2hvb3NlVHlwZShCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJcmV0dXJuIEFjdGl2aXR5LmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFRhc2tEZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJcmV0dXJuIFJvbGVEZXNjcmlwdG9yLmNsYXNzOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXJldHVybiBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3M7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZS5nZXRDbGFzcygpOwotCQl9Ci0JCS8vIHJldHVybiBCcmVha2Rvd25FbGVtZW50LmNsYXNzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWVJblNjb3BlKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJT2JqZWN0IGN1cnJlbnRQYXJlbnQsIEJyZWFrZG93bkVsZW1lbnQgZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uLCBib29sZWFuIGlnbm9yZVN1cHByZXNzZWQpIHsKLQkJLy8gY2hlY2sgdXAKLQkJZm9yIChPYmplY3QgcGFyZW50ID0gY3VycmVudFBhcmVudDsgcGFyZW50ICE9IG51bGw7KSB7Ci0JCQlTdHJpbmcgbXNnID0gY2hlY2tOYW1lKGFkYXB0ZXJGYWN0b3J5LCBwYXJlbnQsIGUsIGNoaWxkRmlsdGVyLAotCQkJCQlmZWF0dXJlLCBuYW1lLCBzdXBwcmVzc2lvbiwgaWdub3JlU3VwcHJlc3NlZCk7Ci0JCQlpZiAobXNnICE9IG51bGwpCi0JCQkJcmV0dXJuIG1zZzsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCQkuYWRhcHQocGFyZW50LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJcGFyZW50ID0gaXRlbVByb3ZpZGVyLmdldFBhcmVudChwYXJlbnQpOwotCQl9Ci0KLQkJLy8gY2hlY2sgZG93bgotCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKGFkYXB0ZXJGYWN0b3J5LAotCQkJCQljdXJyZW50UGFyZW50LCBmYWxzZSk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgY2hpbGQgPSBUbmdVdGlsLnVud3JhcChpdGVyLm5leHQoKSk7Ci0JCQkJaWYgKGNoaWxkICE9IGUgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCQlTdHJpbmcgY2hpbGROYW1lID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZE5hbWUpKSB7Ci0JCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LAotCQkJCQkJLy8gZGF0YSk7Ci0JCQkJCQlyZXR1cm4gTkxTCi0JCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCQkJCW5hbWUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja05hbWUoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uKSB7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIGUsIGZlYXR1cmUsIG5hbWUsIHN1cHByZXNzaW9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSBuYW1lIG9yIHByZXNlbnRhdGlvbiBuYW1lIG9mIGEgYnJlYWtkb3duIGVsZW1lbnQgdGhhdCBpcwotCSAqIGFscmVhZHkgcGFydCBvZiBhIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHN1cHByZXNzaW9uCi0JICogQHBhcmFtIGlnbm9yZVN1cHByZXNzZWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJZmluYWwgQnJlYWtkb3duRWxlbWVudCBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUsCi0JCQlTdXBwcmVzc2lvbiBzdXBwcmVzc2lvbiwgYm9vbGVhbiBpZ25vcmVTdXBwcmVzc2VkKSAKLQl7Ci0JCXJldHVybiBjaGVja05hbWUoYWRhcHRlckZhY3RvcnksIChPYmplY3QpbnVsbCwgZSwgKENsYXNzKW51bGwsIGZlYXR1cmUsIG5hbWUsIHN1cHByZXNzaW9uLCBpZ25vcmVTdXBwcmVzc2VkKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhbkhhdmVFbXB0eVByZXNlbnRhdGlvbk5hbWUoRGVzY3JpYmFibGVFbGVtZW50IGUpIHsKLQkJaWYoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHZUeXBlID0gKChWYXJpYWJpbGl0eUVsZW1lbnQpZSkuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlyZXR1cm4gdlR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMKLQkJCQl8fCB2VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OOwkJCQotCQl9Ci0JCXJldHVybiBmYWxzZTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0ZpbGVQYXRoTGVuZ3RoKAotCQkJTWV0aG9kRWxlbWVudCBwYXJlbnRFbGVtZW50V2l0aFJlc291cmNlLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgbWF4TGVuZ3RoLAotCQkJU3RyaW5nW10gZmlsZVBhdGhOYW1lKSB7Ci0JCVJlc291cmNlIHJlcyA9IHBhcmVudEVsZW1lbnRXaXRoUmVzb3VyY2UuZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSByZXMuZ2V0VVJJKCk7Ci0JCWlmIChmaWxlUGF0aE5hbWUgIT0gbnVsbCAmJiBmaWxlUGF0aE5hbWUubGVuZ3RoID49IDEpIHsKLQkJCS8vVG8gZG86IGNhbGN1bGF0ZSBwYXRoCi0JCQkvL2ZpbGVQYXRoTmFtZVswXSA9ID8/Ci0JCX0JCQotCQkKLQkJaW50IHBhcmVudFJlc0xlbiA9IHVyaS50b0ZpbGVTdHJpbmcoKS5sZW5ndGgoKTsJCQotCQlpbnQgbG9jYWxHcm91cExlbiA9IDIwOwotCQlpZiAocGFyZW50RWxlbWVudFdpdGhSZXNvdXJjZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCWxvY2FsR3JvdXBMZW4gPSAwOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlsb2NhbEdyb3VwTGVuID0gNTsJCS8vInJvbGVzIgotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJbG9jYWxHcm91cExlbiA9IDE4OwkJLy8iY2FwYWJpbGl0eXBhdHRlcm5zIgotCQl9Ci0JCS8vTW9yZSBlbHNlIGlmIGhlcmUKLQkJCi0JCWludCB0b3RhbExlbiA9IHBhcmVudFJlc0xlbiArIGxvY2FsR3JvdXBMZW4gKyBuYW1lLmxlbmd0aCgpOwkJCi0JCXJldHVybiB0b3RhbExlbiA8PSBtYXhMZW5ndGg7CQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjhjNjk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhhbmRsZXMgcGx1Z2luIGRlcGVuZGVuY3kgaW5mbyBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jeSBjaGVjawotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkRlcEluZm8gewotCi0JcHJpdmF0ZSBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciBtZ3I7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFBsdWdpbkRlcEluZm8oUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCXRoaXMubWdyID0gbWdyOwotCQl0aGlzLnBsdWdpbiA9IHBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZChib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBidWlsZDogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcihjaGVja0NpcmN1bGFyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSW5uZXIoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCU9iamVjdCBpbmZvID0gbWdyLmdldFByb2Nlc3NlZEluZm8oZ2V0UGx1Z2luKCkpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0UGx1Z2luKCkuZ2V0QmFzZXMoKTsKLQkJaW50IHN6ID0gcGFyZW50cyA9PSBudWxsID8gMCA6IHBhcmVudHMuc2l6ZSgpOwotCQlpZiAoc3ogPT0gMCkgewotCQkJY29tcGxldGUgPSB0cnVlOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlwYXJlbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IHByb2Nlc3NlZFBhcmVudHMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaTwgc3o7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIHBhcmVudEVsZW0gPSAoTWV0aG9kUGx1Z2luKSBwYXJlbnRzLmdldChpKTsKLQkJCVBsdWdpbkRlcEluZm8gcGluZm8gPSAoUGx1Z2luRGVwSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgUGx1Z2luRGVwSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKFBsdWdpbkRlcEluZm8pIHByb2Nlc3NlZFBhcmVudHMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8pICB7Ci0JCWlmICghIChpbmZvIGluc3RhbmNlb2YgUGx1Z2luRGVwSW5mbykpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRyeSByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CS8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlYWNoYWJsZUJ5KChQbHVnaW5EZXBJbmZvKSBpbmZvLCBuZXcgU3RhY2soKSwgbmV3IEhhc2hNYXAoKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeShQbHVnaW5EZXBJbmZvIGluZm8sIFN0YWNrIHN0YWNrLCBNYXAgc2VlbikgIHsKLQkJc3RhY2sucHVzaChpbmZvKTsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogdGhpcyAtPiAiICsgdGhpcyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZWFjaGFibGVCeTogaW5mbyAtPiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiByZXQgPSAgcmVhY2hhYmxlQnlfKGluZm8sIHN0YWNrLCBzZWVuKTsKLQkJc3RhY2sucG9wKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiByZWFjaGFibGVCeV8oUGx1Z2luRGVwSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCU1hcCB0ZXN0TWFwID0gaW5mby5wYXJlbnRNYXA7CQkKLQkJaWYgKHRlc3RNYXAgPT0gbnVsbCB8fCB0ZXN0TWFwLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAodGVzdE1hcC5jb250YWluc0tleShnZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCQotCQlzZWVuLnB1dChpbmZvLmdldFBsdWdpbigpLmdldEd1aWQoKSwgaW5mbyk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGVzdE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQbHVnaW5EZXBJbmZvIHBhcmVudEluZm8gPSAoUGx1Z2luRGVwSW5mbykgaXQubmV4dCgpOwotCQkJaWYgKHBhcmVudEluZm8uY29udGFpbmVkSW4oc3RhY2spKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGNvbnRhaW5lZEluIHN0YWNrOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQkJfQotCQkJCXN0YWNrLnB1c2gocGFyZW50SW5mbyk7Ci0JCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJCXN0YWNrLnBvcCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgIChyZWFjaGFibGVCeShwYXJlbnRJbmZvLCBzdGFjaywgc2VlbikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQkJCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgocGx1Z2luKTsKLQl9Ci0JCi0JLy9UaGlzIHdvdWxkIHNjYWxlIHVwIGZvciBwZXJmb3JtYW5jZSB3aGVuIGluZm9MaXN0IGdldHMgbGFyZ2UKLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbmVkSW4oTGlzdCBpbmZvTGlzdCkgewotCQlpbnQgc3ogPSBpbmZvTGlzdCA9PSBudWxsID8gMCA6IGluZm9MaXN0LnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZ3VpZCA9IGdldFBsdWdpbigpLmdldEd1aWQoKTsKLQkJaWYgKHN6ID09IDEpIHsKLQkJCXJldHVybiBndWlkLmVxdWFscygoKFBsdWdpbkRlcEluZm8pIGluZm9MaXN0LmdldCgwKSkuZ2V0UGx1Z2luKCkuZ2V0R3VpZCgpKTsKLQkJfQotCQlNYXAgbGlzdE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlQbHVnaW5EZXBJbmZvIGluZm8gPSAoUGx1Z2luRGVwSW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdE1hcC5jb250YWluc0tleShndWlkKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGViYTg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9QbHVnaW5EZXBlbmRlbmN5SW5mb01nci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlByb2ZpbGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW5mbyBmb3IgcGx1Z2lucy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5EZXBlbmRlbmN5SW5mb01nciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9maWxpbmcgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGxpYjsKLQlwcml2YXRlIE1hcCBwcm9jZXNzZWQ7Ci0JcHJpdmF0ZSBMaXN0IGNpcmN1bGFyTGlzdDsKLQkKLQlwdWJsaWMgUGx1Z2luRGVwZW5kZW5jeUluZm9NZ3IoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdGhpcy5saWIgPSBsaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvZ0NpcmN1bGFyRGVwZW5kZW5jeShTdGFjayB0cmFjZSkgewotCQlpZiAoY2lyY3VsYXJMaXN0ID09IG51bGwpIHsKLQkJCWNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQljaXJjdWxhckxpc3QuYWRkQWxsKHRyYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldEFuZENsZWFyQ2lyY3VsYXJMaXN0KCkgewotCQlMaXN0IHJldCA9IGNpcmN1bGFyTGlzdDsKLQkJY2lyY3VsYXJMaXN0ID0gbnVsbDsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCX0KLQkKLQlwcml2YXRlIFBsdWdpbkRlcEluZm8gcmVnaXN0ZXJQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbiwgYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7CQkKLQkJUGx1Z2luRGVwSW5mbyBpbmZvID0gIGdldFByb2Nlc3NlZEluZm8ocGx1Z2luKTsKLQkJaWYgKGluZm8gPT0gbnVsbCkgewkJCi0JCQlpbmZvID0gbmV3IFBsdWdpbkRlcEluZm8odGhpcywgcGx1Z2luKTsKLQkJfQotCQlpZiAoISBpbmZvLmlzQ29tcGxldGUoKSkgewotCQkJaW5mby5idWlsZChjaGVja0NpcmN1bGFyKTsKLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgY2hlY2tDaXJjdWxhckRlcGVuZG5lY3koTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHBsdWdpbjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChwbHVnaW4pKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlQbHVnaW5EZXBJbmZvIGluZm8gPSByZWdpc3RlclBsdWdpbihwbHVnaW4sIHRydWUpOwotCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwotCQlib29sZWFuIGxvb3AgPSBjaXJMaXN0ICE9IG51bGwgJiYgIWNpckxpc3QuaXNFbXB0eSgpOwotCQlpZiAobG9vcCkgewotCQkJbG9nKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJCVBsdWdpbkRlcEluZm8gbG9vcEluZm8gPSAoUGx1Z2luRGVwSW5mbykgY2lyTGlzdC5nZXQoaSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCWxvZygiRXJyb3I+ICIgKyBpICsgIjogIiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkJbG9nKCIiKTsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBnZW5FcnJvck1zZyhjaXJMaXN0KSwgcGx1Z2luLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuRXJyb3JNc2coTGlzdCBjaXJMaXN0KSB7Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy52YXJpYWJpbGl0eV9lbGVtZW50X2NpcmN1bGFyX2xvb3BfZXJyb3JfbXNnOwotCQlmb3IgKGludCBpPTA7IGk8Y2lyTGlzdC5zaXplKCk7IGkrKykgewotCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IGxvb3BJbmZvLmdldFBsdWdpbigpOwkKLQkJCWlmIChpID4gMCkgewotCQkJCW1zZyArPSAiOiAiOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQkJbXNnICs9IFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtKTsJCi0JCX0KLQkJcmV0dXJuIG1zZzsKLQl9Ci0JCQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzZWQoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlyZXR1cm4gcHJvY2Vzc2VkICE9IG51bGwgJiYgcHJvY2Vzc2VkLmNvbnRhaW5zS2V5KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGx1Z2luRGVwSW5mbyBnZXRQcm9jZXNzZWRJbmZvKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIHByb2Nlc3NlZCA9PSBudWxsID8gbnVsbCA6IChQbHVnaW5EZXBJbmZvKSBwcm9jZXNzZWQuZ2V0KHBsdWdpbi5nZXRHdWlkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1Byb2Nlc3NlZChQbHVnaW5EZXBJbmZvIGluZm8pIHsKLQkJaWYgKHByb2Nlc3NlZCA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzZWQgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCXByb2Nlc3NlZC5wdXQoaW5mby5nZXRQbHVnaW4oKS5nZXRHdWlkKCksIGluZm8pOwotCX0KLQkKLQkvKgotCSAqIENoZWNrIGNpcmN1bGFyIGRlcGVuZGVuY3kgYW1vbmcgdGhlIHBsdWdpbnMgb2YgdGhlIGxpYnJhcnkuCi0JICovCi0JcHVibGljIENoZWNrUmVzdWx0IGNoZWNrQ2lyY3VsYXJEZXBlbmRuZWN5KFRyYWNlciB0cmFjZXIsIGJvb2xlYW4gYWNjdW1FcnJvcnMpIHsKLQkJaWYgKHRyYWNlciA9PSBudWxsKSB7Ci0JCQl0cmFjZXIgPSBuZXcgVHJhY2VyKCkgewotCQkJCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7fQotCQkJfTsKLQkJfQotCQlsb25nIHVzZWRNZW0wID0gMDsKLQkJUnVudGltZSBydCA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOyAKLQkJaWYgKHByb2ZpbGluZykgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWl0Lm5leHQoKTsKLQkJCX0KLQkJCVByb2ZpbGluZ1V0aWwuZnVsbEdDKCk7Ci0JCQl1c2VkTWVtMCA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCX0KLQotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8odHJhY2VyLCBhY2N1bUVycm9ycyk7Ci0JCQotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlQcm9maWxpbmdVdGlsLmZ1bGxHQygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gdXNlZE1lbTA6ICIgKyB1c2VkTWVtMC8xMDAwICsgIiBrIGJ5dGVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJbG9uZyB1c2VkTWVtMSA9IHJ0LnRvdGFsTWVtb3J5KCkgLSBydC5mcmVlTWVtb3J5KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1c2VkTWVtMTogIiArIHVzZWRNZW0xLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBkaWZmTWVtOiAiICsgKHVzZWRNZW0xIC0gdXNlZE1lbTApLzEwMDAgKyAiIGsgYnl0ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja1Jlc3VsdCBjaGVja0NpcmN1bGFyRGVwZW5kbmVjeV8oVHJhY2VyIHRyYWNlciwgYm9vbGVhbiBhY2N1bUVycm9ycykgewotCQlDaGVja1Jlc3VsdCByZXN1bHQgPSBuZXcgQ2hlY2tSZXN1bHQoKTsKLQkJCi0JCUxpc3QgcGx1Z2lucyA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkKLQkJCVBsdWdpbkRlcEluZm8gaW5mbyA9IHJlZ2lzdGVyUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7Ci0JCQlMaXN0IGNpckxpc3QgPSBnZXRBbmRDbGVhckNpcmN1bGFyTGlzdCgpOwkJCQotCQkJYm9vbGVhbiBsb29wID0gY2lyTGlzdCAhPSBudWxsICYmICFjaXJMaXN0LmlzRW1wdHkoKTsKLQkJCWlmIChsb29wKSB7Ci0JCQkJdHJhY2VyLnRyYWNlKCJFcnJvcj4gQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZDogIik7CQkvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaT0wOyBpPGNpckxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQkJUGx1Z2luRGVwSW5mbyBsb29wSW5mbyA9IChQbHVnaW5EZXBJbmZvKSBjaXJMaXN0LmdldChpKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gbG9vcEluZm8uZ2V0UGx1Z2luKCk7CQkJCQkJCQotCQkJCQl0cmFjZXIudHJhY2UoIkVycm9yPiAiICsgaSArICI6ICIgKyBUbmdVdGlsLmdldExhYmVsV2l0aFBhdGgoZWxlbSkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlyZXN1bHQuY2lyY3VsYXJMaXN0LmFkZChjaXJMaXN0KTsKLQkJCQlpZiAoISBhY2N1bUVycm9ycykgewotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQkJCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja1Jlc3VsdCB7Ci0JCXB1YmxpYyBMaXN0IGNpcmN1bGFyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJCXJldHVybiBjaXJjdWxhckxpc3Quc2l6ZSgpOwotCQl9CQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVHJhY2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YTQxM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1RyYWNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBUcmFjZXIgewotCXZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3ZTRhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVW5pcXVlTmFtZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgbWV0aG9kIGVsZW1lbnQgdW5pcXVlIG5hbWUgaGFuZGxpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkKLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBVbmlxdWVOYW1lSGFuZGxlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJOYW1lcyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcmVnaXN0ZXIoZWxlbWVudC5nZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCXJlZ2lzdGVyKGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyBuYW1lKSB7Ci0JCW5hbWVzLmFkZChuYW1lLnRvVXBwZXJDYXNlKCkpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKFN0cmluZyBvbGROYW1lKSB7CQkKLQkJU3RyaW5nIG5hbWUgPSBvbGROYW1lOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlKG5hbWVzLmNvbnRhaW5zKG5hbWUudG9VcHBlckNhc2UoKSkpIHsKLQkJCWkrKzsKLQkJCW5hbWUgPSBvbGROYW1lICsgIl8iICsgaTsJCS8vJE5PTi1OTFMtMSQgCi0JCX0JCQkKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCQotCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VbmlxdWVOYW1lUE5hbWVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDBmNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1VuaXF1ZU5hbWVQTmFtZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGhlbHBlciBjbGFzcyBmb3IgdW5pcXVlIG5hbWUgYW5kIHByZXNlbnRhdGlvbiBuYW1lIGhhbmRsaW5nCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgVW5pcXVlTmFtZVBOYW1lSGFuZGxlciB7Ci0JcHJpdmF0ZSBVbmlxdWVOYW1lSGFuZGxlciBuYW1lSGFuZGxlciA9IG5ldyBVbmlxdWVOYW1lSGFuZGxlcigpOwotCXByaXZhdGUgVW5pcXVlTmFtZUhhbmRsZXIgcG5hbWVIYW5kbGVyID0gbmV3IFVuaXF1ZU5hbWVIYW5kbGVyKCk7Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVW5pcXVlTmFtZVBOYW1lSGFuZGxlcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQluYW1lSGFuZGxlci5yZWdpc3Rlck5hbWVzKGVsZW1lbnRzKTsKLQkJcG5hbWVIYW5kbGVyLnJlZ2lzdGVyUHJlc2VudGF0aW9uTmFtZXMoZWxlbWVudHMpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgZW5zdXJlVW5pcXVlKERlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gbmFtZUhhbmRsZXIuZ2V0VW5pcXVlTmFtZShlbGVtZW50LmdldE5hbWUoKSk7Ci0JCWlmICghIG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgewotCQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwkJCi0JCX0KLQkJbmFtZUhhbmRsZXIucmVnaXN0ZXIobmFtZSk7Ci0JCQotCQlTdHJpbmcgcG5hbWUgPSBwbmFtZUhhbmRsZXIuZ2V0VW5pcXVlTmFtZShlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCWlmICghIHBuYW1lLmVxdWFscyhlbGVtZW50LmdldFByZXNlbnRhdGlvbk5hbWUoKSkpIHsKLQkJCWVsZW1lbnQuc2V0UHJlc2VudGF0aW9uTmFtZShwbmFtZSk7CQkKLQkJfQotCQlwbmFtZUhhbmRsZXIucmVnaXN0ZXIocG5hbWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vVXB3YXJkUmVhY2hhYmxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjE1YWZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9VcHdhcmRSZWFjaGFibGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyB1cHdhcmQgcmVhY2hhYmxlIGluZm8gZm9yIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2hlY2tpbmcKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBVcHdhcmRSZWFjaGFibGVJbmZvIGltcGxlbWVudHMgSURlcGVuZGVuY3lJbmZvIHsKLQotCXByaXZhdGUgRGVwZW5kZW5jeUluZm9NZ3IgbWdyOwotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCXByaXZhdGUgSGFzaE1hcCBwYXJlbnRNYXA7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gZmFsc2U7Ci0JCi0JcHJvdGVjdGVkIFVwd2FyZFJlYWNoYWJsZUluZm8oRGVwZW5kZW5jeUluZm9NZ3IgbWdyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5tZ3IgPSBtZ3I7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7Ci0JCXJldHVybiBjb21wbGV0ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYnVpbGQoYm9vbGVhbiBjaGVja0NpcmN1bGFyKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGQ6ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1aWxkSW5uZXIoY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyKGJvb2xlYW4gY2hlY2tDaXJjdWxhcikgewotCQlPYmplY3QgaW5mbyA9IG1nci5nZXRQcm9jZXNzZWRJbmZvKGVsZW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoaW5mbyA9PSB0aGlzICYmIGNvbXBsZXRlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVybmFsIGVycm9yIGluIGJ1aWxkSW5uZXI6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZ3IuYWRkVG9Qcm9jZXNzZWQodGhpcyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYnVpbGRJbm5lcjogIiArIHRoaXMpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJYnVpbGRJbm5lcl8oY2hlY2tDaXJjdWxhcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZElubmVyXyhib29sZWFuIGNoZWNrQ2lyY3VsYXIpIHsKLQkJTGlzdCBwYXJlbnRzID0gZ2V0TWl4ZWRQYXJlbnRMaXN0KCk7Ci0JCWludCBzeiA9IHBhcmVudHMgPT0gbnVsbCA/IDAgOiBwYXJlbnRzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJcGFyZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJTGlzdCBwcm9jZXNzZWRQYXJlbnRzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGk8IHN6OyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50RWxlbSA9IChNZXRob2RFbGVtZW50KSBwYXJlbnRzLmdldChpKTsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGluZm8gPSAoVXB3YXJkUmVhY2hhYmxlSW5mbykgbWdyLmdldFByb2Nlc3NlZEluZm8ocGFyZW50RWxlbSk7Ci0JCQlpZiAocGluZm8gPT0gbnVsbCl7Ci0JCQkJcGluZm8gPSBuZXcgVXB3YXJkUmVhY2hhYmxlSW5mbyhtZ3IsIHBhcmVudEVsZW0pOwotCQkJCXBhcmVudE1hcC5wdXQocGFyZW50RWxlbS5nZXRHdWlkKCksIHBpbmZvKTsKLQkJCQlwaW5mby5idWlsZElubmVyKGNoZWNrQ2lyY3VsYXIpOwotCQkJfSBlbHNlIHsKLQkJCQlwYXJlbnRNYXAucHV0KHBhcmVudEVsZW0uZ2V0R3VpZCgpLCBwaW5mbyk7Ci0JCQkJaWYgKGNoZWNrQ2lyY3VsYXIpIHsKLQkJCQkJaWYgKHByb2Nlc3NlZFBhcmVudHMgPT0gbnVsbCkgewotCQkJCQkJcHJvY2Vzc2VkUGFyZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlwcm9jZXNzZWRQYXJlbnRzLmFkZChwaW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbXBsZXRlID0gdHJ1ZTsKLQkJCQotCQlpZiAoY2hlY2tDaXJjdWxhciAmJiBwcm9jZXNzZWRQYXJlbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGk9MDsgaTxwcm9jZXNzZWRQYXJlbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJcmVhY2hhYmxlQnkoKElEZXBlbmRlbmN5SW5mbykgcHJvY2Vzc2VkUGFyZW50cy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlYWNoYWJsZUJ5KElEZXBlbmRlbmN5SW5mbyBpbmZvKSAgewotCQlpZiAoISAoaW5mbyBpbnN0YW5jZW9mIFVwd2FyZFJlYWNoYWJsZUluZm8pKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IEVudHJ5IHJlYWNoYWJsZUJ5OiB0aGlzIC0+ICIgKyB0aGlzKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRW50cnkgcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZWFjaGFibGVCeSgoVXB3YXJkUmVhY2hhYmxlSW5mbykgaW5mbywgbmV3IFN0YWNrKCksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnkoVXB3YXJkUmVhY2hhYmxlSW5mbyBpbmZvLCBTdGFjayBzdGFjaywgTWFwIHNlZW4pICB7Ci0JCXN0YWNrLnB1c2goaW5mbyk7Ci0JCWlmIChkZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IHRoaXMgLT4gIiArIHRoaXMpOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVhY2hhYmxlQnk6IGluZm8gLT4gIiArIGluZm8pOwkJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gcmV0ID0gIHJlYWNoYWJsZUJ5XyhpbmZvLCBzdGFjaywgc2Vlbik7Ci0JCXN0YWNrLnBvcCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcmVhY2hhYmxlQnlfKFVwd2FyZFJlYWNoYWJsZUluZm8gaW5mbywgU3RhY2sgc3RhY2ssIE1hcCBzZWVuKSAgewotCQlNYXAgdGVzdE1hcCA9IGluZm8ucGFyZW50TWFwOwkJCi0JCWlmICh0ZXN0TWFwID09IG51bGwgfHwgdGVzdE1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHRlc3RNYXAuY29udGFpbnNLZXkoZWxlbWVudC5nZXRHdWlkKCkpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBDb250YWluZWQgaW4gcGFyZW50TWFwIG9mOiAiICsgaW5mbyk7CQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCi0JCQl9Ci0JCQlzdGFjay5wdXNoKHRoaXMpOwotCQkJbWdyLmxvZ0NpcmN1bGFyRGVwZW5kZW5jeSgoU3RhY2spIHN0YWNrLmNsb25lKCkpOwotCQkJc3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKHNlZW4uY29udGFpbnNLZXkoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQkKLQkJc2Vlbi5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSB0ZXN0TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVVwd2FyZFJlYWNoYWJsZUluZm8gcGFyZW50SW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBpdC5uZXh0KCk7Ci0JCQlpZiAocGFyZW50SW5mby5jb250YWluZWRJbihzdGFjaykpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gY29udGFpbmVkSW4gc3RhY2s6ICIgKyBpbmZvKTsJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkKLQkJCQl9Ci0JCQkJc3RhY2sucHVzaChwYXJlbnRJbmZvKTsKLQkJCQltZ3IubG9nQ2lyY3VsYXJEZXBlbmRlbmN5KChTdGFjaykgc3RhY2suY2xvbmUoKSk7Ci0JCQkJc3RhY2sucG9wKCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlpZiAgKHJlYWNoYWJsZUJ5KHBhcmVudEluZm8sIHN0YWNrLCBzZWVuKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9CQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0IGdldE1peGVkUGFyZW50TGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQljb2xsZWN0UGFyZW50TGlzdChlbGVtZW50LCBsaXN0KTsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJY29sbGVjdFBhcmVudExpc3RCeVZhcmlhbnRQYXRocyh2ZSwgbGlzdCk7Ci0JCWlmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMgKSB7Ci0JCQltZ3IuYWRkVG9SZXBsYWNlck1hcCh0aGlzKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0KE1ldGhvZEVsZW1lbnQgZWxlbSwgTGlzdCBsaXN0KSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IGdldFBhcmVudExpc3QoZWxlbSk7Ci0JCQotCQlpbnQgc3ogPSBwYXJlbnRMaXN0ID09IG51bGwgPyAwIDogcGFyZW50TGlzdC5zaXplKCk7Ci0JCWlmIChtZ3IuaXNNb3ZlRWxlbWVudChlbGVtKSkgewotCQkJaWYgKHN6ID4gMSAmJiAhKGVsZW0gaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsJCi0JCQl9Ci0JCX0gZWxzZSBpZiAoc3ogPiAwKSB7Ci0JCQlsaXN0LmFkZEFsbChwYXJlbnRMaXN0KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFBhcmVudExpc3QoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCUxpc3QgcGFyZW50TGlzdCA9IG51bGw7Ci0JCQotCQlpZiAoZWxlbSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQlwYXJlbnRMaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcygoQ3VzdG9tQ2F0ZWdvcnkpIGVsZW0pOwotCQl9IGVsc2UgaWYgKGVsZW0gaW5zdGFuY2VvZiBEZWxpdmVyYWJsZSkgewotCQkJcGFyZW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldERlbGl2ZXJhYmxlcygoRGVsaXZlcmFibGUpIGVsZW0pOwkJCQotCQl9IGVsc2UgewkKLQkJCU9iamVjdCBwYXJlbnQgPSBnZXRTYW1lVHlwZVBhcmVudChlbGVtKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJcGFyZW50TGlzdC5hZGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFyZW50TGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQYXJlbnRMaXN0QnlWYXJpYW50UGF0aHMoVmFyaWFiaWxpdHlFbGVtZW50IHZlLCBMaXN0IGxpc3QpIHsKLQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudCh2ZSkpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gcGFyZW50VmUgPT0gbnVsbCA/IG51bGwgOiB2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCWlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyB8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCWxpc3QuYWRkKHBhcmVudFZlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtZ3IuaXNEbmRFbGVtZW50KHZlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBUbmdVdGlsLmdldEltbWVkaWF0ZVZhcmlldGllcyh2ZSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpIDsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGV4dGVuZGVyID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKCEgbWdyLmlzRmlsdGVyRWxlbWVudChleHRlbmRlcikpIHsKLQkJCQlsaXN0LmFkZChleHRlbmRlcik7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0U2FtZVR5cGVQYXJlbnQoTWV0aG9kRWxlbWVudCBlbGVtKSB7Ci0JCWlmIChlbGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCXJldHVybiAoKEFjdGl2aXR5KSBlbGVtKS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJfQotCQkJCi0JCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVsZW0uZUNvbnRhaW5lcigpOwotCQlyZXR1cm4gcGFyZW50LmdldFR5cGUoKSA9PSBlbGVtLmdldFR5cGUoKSA/IHBhcmVudCA6IG51bGw7Ci0JfQkJCi0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaW5oZXJpdEFuY2VzdG9yKFZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBwYXJlbnRWZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmIChwYXJlbnRWZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCgoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50KS5nZXRWYXJpYWJpbGl0eVR5cGUoKSAhPSB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQXJyYXlMaXN0IG1peFBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CQotCQljb2xsZWN0UGFyZW50TGlzdChlbGVtZW50LCBtaXhQYXJlbnRMaXN0KTsKLQkJaWYgKG1peFBhcmVudExpc3QgIT0gbnVsbCAmJiBtaXhQYXJlbnRMaXN0LmNvbnRhaW5zKHBhcmVudFZlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlVcHdhcmRSZWFjaGFibGVJbmZvIHBhcmVudFZlSW5mbyA9IChVcHdhcmRSZWFjaGFibGVJbmZvKSBwYXJlbnRNYXAuZ2V0KHBhcmVudFZlLmdldEd1aWQoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwYXJlbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVXB3YXJkUmVhY2hhYmxlSW5mbyBwYXJlbnRJbmZvID0gKFVwd2FyZFJlYWNoYWJsZUluZm8pIGl0Lm5leHQoKTsKLQkJCWlmICAocGFyZW50VmVJbmZvID09IHBhcmVudEluZm8pIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChwYXJlbnRWZUluZm8ucmVhY2hhYmxlQnkocGFyZW50SW5mbykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vVGhpcyB3b3VsZCBzY2FsZSB1cCBmb3IgcGVyZm9ybWFuY2Ugd2hlbiBpbmZvTGlzdCBnZXRzIGxhcmdlCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5lZEluKExpc3QgaW5mb0xpc3QpIHsKLQkJaW50IHN6ID0gaW5mb0xpc3QgPT0gbnVsbCA/IDAgOiBpbmZvTGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGd1aWQgPSBnZXRFbGVtZW50KCkuZ2V0R3VpZCgpOwotCQlpZiAoc3ogPT0gMSkgewotCQkJcmV0dXJuIGd1aWQuZXF1YWxzKCgoSURlcGVuZGVuY3lJbmZvKSBpbmZvTGlzdC5nZXQoMCkpLmdldEVsZW1lbnQoKS5nZXRHdWlkKCkpOwotCQl9Ci0JCU1hcCBsaXN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUlEZXBlbmRlbmN5SW5mbyBpbmZvID0gKElEZXBlbmRlbmN5SW5mbykgaW5mb0xpc3QuZ2V0KGkpOwotCQkJbGlzdE1hcC5wdXQoaW5mby5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLCBpbmZvKTsKLQkJfQotCQkKLQkJcmV0dXJuIGxpc3RNYXAuY29udGFpbnNLZXkoZ3VpZCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9WYWxpZGF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOTYyZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL1ZhbGlkYXRpb25TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbjsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uU3RhdHVzIGV4dGVuZHMgU3RhdHVzIHsKLQotCXByaXZhdGUgT2JqZWN0IGNoZWNrZWRPYmplY3Q7Ci0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCS8qKgotCSAqIEBwYXJhbSBzZXZlcml0eQotCSAqIEBwYXJhbSBjb2RlCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2hlY2tlZE9iamVjdAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKGludCBzZXZlcml0eSwgaW50IGNvZGUsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QgY2hlY2tlZE9iamVjdCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoc2V2ZXJpdHksIExpYnJhcnlFZGl0UGx1Z2luLlBMVUdJTl9JRCwgY29kZSwgbWVzc2FnZSwgbnVsbCk7Ci0JCXRoaXMuY2hlY2tlZE9iamVjdCA9IGNoZWNrZWRPYmplY3Q7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0aW9uU3RhdHVzKFN0cmluZyBwbHVnaW5JZCwgaW50IHNldmVyaXR5LCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBjaGVja2VkT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIG51bGwpOwotCQl0aGlzLmNoZWNrZWRPYmplY3QgPSBjaGVja2VkT2JqZWN0OwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hlY2tlZE9iamVjdCgpIHsKLQkJcmV0dXJuIGNoZWNrZWRPYmplY3Q7Ci0JfQotCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNzdmZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0NvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIE5hbWUgdmFsaWRhdG9yIGZvciBDb250ZW50RWxlbWVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yIGV4dGVuZHMgVW5pcXVlbmVzc1ZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoRU9iamVjdCBjb250YWluZXIsIENvbnRlbnRFbGVtZW50IGUsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyKSB7Ci0JCXN1cGVyKGNvbnRhaW5lciwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCksIGNoaWxkRmlsdGVyLCBlLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgQ29udGVudEVsZW1lbnQgZSwKLQkJCUlGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBjb250YWluaW5nRmVhdHVyZSwgY2hpbGRGaWx0ZXIsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlVuaXF1ZW5lc3NWYWxpZGF0b3IjaXNWYWxpZChTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCUNvbnRlbnRFbGVtZW50IGUgPSAoQ29udGVudEVsZW1lbnQpIG9iamVjdDsKLQotCQkvLyAxNTY5NDUgLSBFbGVtZW50IG5hbWUgbmVlZCB0byBhbGxvdyBtb3JlIHNwZWNpYWwgY2hhcmFjdGVycyBzdWNoIGFzID8gCi0JCS8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGdlbmVyYXRlIGEgcmVzb3VyY2UgZmlsZQotCQlpZiAoIGUgaW5zdGFuY2VvZiBTZWN0aW9uICkgewotCQkJcmV0dXJuIG5ld1RleHQ7Ci0JCX0KLQkJCi0JCVN0cmluZyBtc2cgPSBUbmdVdGlsLmNoZWNrRWxlbWVudE5hbWUobmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChlKSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkKLQkJCXJldHVybiBtc2c7Ci0JCQotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjb250YWluZXIpOwotCQkKLQkJCUludGVnZXIgbWF4ID0gbmV3IEludGVnZXIoTWF4RmlsZVBhdGhOYW1lTGVuZ3RoKTsKLQkJCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgocGx1Z2luLCBlLCBuZXdUZXh0LCBtYXguaW50VmFsdWUoKSwgbnVsbCkpIHsKLQkJCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCQluZXcgT2JqZWN0W10geyBtYXggfSApOwotCQkJCXJldHVybiBtc2c7Ci0JCQl9Ci0JCX0KLQotCQkvLyBDaGVjayB3aGV0aGVyIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnRhaW5lcik7Ci0JCQlpZihwbHVnaW4gPT0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSkpIHsKLQkJCQlVUkkgdXJpID0gcGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCWlmKHVyaS5pc0ZpbGUoKSkgewotCQkJCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKHVyaS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKTsJCQkKLQkJCQkJU3RyaW5nIGZvbGRlclBhdGggPSBwZXJzaXN0ZXIuZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQkJCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcihwbHVnaW5EaXIuZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZCgKLQkJCQkJCQlGaWxlLnNlcGFyYXRvcikuYXBwZW5kKGZvbGRlclBhdGgpLnRvU3RyaW5nKCk7Ci0JCQkJCVN0cmluZyBmaWxlTmFtZSA9IG5ld1RleHQgKyBwZXJzaXN0ZXIuZ2V0RmlsZUV4dGVuc2lvbihlKTsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlTmFtZSk7Ci0JCQkJCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQkJCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IGUuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50LmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUoY29udGVudC5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJY3VycmVudEZpbGUgPSBmaWxlOwotCQkJCQl9Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpICYmICFuZXdUZXh0LmVxdWFscyhlLmdldE5hbWUoKSkgJiYgIWZpbGUuZXF1YWxzKGN1cnJlbnRGaWxlKSkgewotCQkJCQkJcmV0dXJuIE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUNvbnRlbnRGaWxlRXJyb3JfbXNnLCBmaWxlKTsgCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuaXNWYWxpZChuZXdUZXh0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMTBmZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0N1c3RvbUNhdGVnb3J5TmFtZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0KLS8qKgotICogTmFtZSB2YWxpZGF0b3IgZm9yIEN1c3RvbUNhdGVnb3J5LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ2F0ZWdvcnlOYW1lVmFsaWRhdG9yIGV4dGVuZHMgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBjaGlsZEZpbHRlcgotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeU5hbWVWYWxpZGF0b3IoQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50LCBDdXN0b21DYXRlZ29yeSBlLAotCQkJSUZpbHRlciBjaGlsZEZpbHRlcikgewotCQlzdXBlcihwYXJlbnQsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywgZSwgY2hpbGRGaWx0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL0RvTm90aGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTUyYmIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9Eb05vdGhpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVmFsaWRhdG9yIHRoYXQgdmFsaWRhdGVzIG5vdGhpbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDQsIDIwMDUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERvTm90aGluZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG9Ob3RoaW5nVmFsaWRhdG9yIElOU1RBTkNFID0gbmV3IERvTm90aGluZ1ZhbGlkYXRvcigpOwotCi0JcHJpdmF0ZSBEb05vdGhpbmdWYWxpZGF0b3IoKSB7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYmY1ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL01ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotLyoqCi0gKiBOYW1lIHZhbGlkYXRvciBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBNYXkgMTIsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTc3OTczCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uTmFtZVZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0U3RyaW5nVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCXByaXZhdGUgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbk5hbWVWYWxpZGF0b3IoTWV0aG9kTGlicmFyeSBsaWIsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWxpYnJhcnkgPSBsaWI7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCW5ld1RleHQgPSBuZXdUZXh0LnRyaW0oKTsgLy9maXggaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3Nzk3MwotCQlJbnRlZ2VyIG1heCA9IG5ldyBJbnRlZ2VyKE1heEZpbGVQYXRoTmFtZUxlbmd0aCk7Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgobGlicmFyeSwgY29uZmlnLCBuZXdUZXh0LCBtYXguaW50VmFsdWUoKSwgbnVsbCkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgCi0JCQkJCW5ldyBPYmplY3RbXSB7IG1heCB9ICk7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCVN0cmluZyBjb25maWdGb2xkZXIgPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKSAKLQkJCS5nZXRGb2xkZXJSZWxhdGl2ZVBhdGgoY29uZmlnKTsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudCgpLCBjb25maWdGb2xkZXIpOwotCQlyZXR1cm4gVG5nVXRpbC5jaGVja05hbWUoZGlyLCBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLCBjb25maWcsCi0JCQkJbmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChjb25maWcpLCBmYWxzZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGRlNjczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9NZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsaWI7Ci0JcHJpdmF0ZSBNZXRob2RQbHVnaW4gcGx1Z2luOwkKLQotCS8qKgotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGx1Z2luTmFtZVZhbGlkYXRvcihNZXRob2RMaWJyYXJ5IGxpYiwgTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpYiA9IGxpYjsKLQkJdGhpcy5wbHVnaW4gPSBwbHVnaW47Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlTdHJpbmcgbXNnID0gVG5nVXRpbC5jaGVja1BsdWdpbk5hbWUobmV3VGV4dCk7Ci0JCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbXNnOwotCQl9Ci0JCQotCQlJbnRlZ2VyIG1heCA9IG5ldyBJbnRlZ2VyKE1heEZpbGVQYXRoTmFtZUxlbmd0aCk7Ci0JCWlmICghIE5hbWVDaGVja2VyLmNoZWNrRmlsZVBhdGhMZW5ndGgobGliLCBwbHVnaW4sIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJbXNnID0gTkxTLmJpbmQoTGlicmFyeUVkaXRSZXNvdXJjZXMuZmlsZVBhdGhOYW1lVG9vTG9uZ19tc2csIAotCQkJCQluZXcgT2JqZWN0W10geyBtYXggfSApOwotCQkJcmV0dXJuIG1zZzsKLQkJfQotCQkKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZShsaWIuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJLmdldFBhcmVudEZpbGUoKTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlVGV4dCA9IChwbHVnaW4gIT0gbnVsbCkgPyBUbmdVdGlsLmdldFR5cGVUZXh0KHBsdWdpbikKLQkJCQk6IFRuZ1V0aWwuZ2V0VHlwZVRleHQoIk1ldGhvZFBsdWdpbiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBUbmdVdGlsLmNoZWNrTmFtZShkaXIsIGxpYi5nZXRNZXRob2RQbHVnaW5zKCksIHBsdWdpbiwgbmV3VGV4dCwKLQkJCQllbGVtZW50VHlwZVRleHQsIHRydWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1Byb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkOGQyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvUHJvY2Vzc0NvbXBvbmVudE5hbWVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uTmFtZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0KLS8qKgotICogVmFsaWRhdGVzIHRoZSBuYW1lIG9mIGEgcHJvY2VzcyBjb21wb25lbnQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmdWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBQcm9jZXNzUGFja2FnZSBwYXJlbnQ7Ci0KLQlwcml2YXRlIFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvcihQcm9jZXNzUGFja2FnZSBwYXJlbnQsCi0JCQlQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wKSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl0aGlzLnByb2NDb21wID0gcHJvY0NvbXA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvciNpc1ZhbGlkKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSAoKElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKVNlcnZpY2VzLmdldExpYnJhcnlQZXJzaXN0ZXIoU2VydmljZXMuWE1JX1BFUlNJU1RFTkNFX1RZUEUpKQotCQkJLmdldEZvbGRlclJlbGF0aXZlUGF0aChwcm9jQ29tcCk7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihwYXJlbnQpOwotCQkKLQkJSW50ZWdlciBtYXggPSBuZXcgSW50ZWdlcihNYXhGaWxlUGF0aE5hbWVMZW5ndGgpOwotCQlpZiAoISBOYW1lQ2hlY2tlci5jaGVja0ZpbGVQYXRoTGVuZ3RoKHBsdWdpbiwgcHJvY0NvbXAsIG5ld1RleHQsIG1heC5pbnRWYWx1ZSgpLCBudWxsKSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKExpYnJhcnlFZGl0UmVzb3VyY2VzLmZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnLCAKLQkJCQkJbmV3IE9iamVjdFtdIHsgbWF4IH0gKTsKLQkJCXJldHVybiBtc2c7Ci0JCX0KLQkJCi0JCUZpbGUgZGlyID0gbmV3IEZpbGUoCi0JCQkJbmV3IEZpbGUocGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKQotCQkJCQkJLmdldFBhcmVudCgpCi0JCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgcmVsYXRpdmVQYXRoKTsKLQkJaWYgKCEgbmV3VGV4dC5lcXVhbHMoU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZShuZXdUZXh0KSkpIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5pbnZhbGlkRWxlbWVudE5hbWVFcnJvcjNfbXNnLCBuZXdUZXh0KTsgCi0JCX0KLQkJcmV0dXJuIFRuZ1V0aWwuY2hlY2tOYW1lKGRpciwgcGFyZW50LmdldENoaWxkUGFja2FnZXMoKSwgcHJvY0NvbXAsCi0JCQkJbmV3VGV4dCwgVG5nVXRpbC5nZXRUeXBlVGV4dChwcm9jQ29tcCksIHRydWUpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVW5pcXVlbmVzc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDExNjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9VbmlxdWVuZXNzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVmFsaWRhdGVzIHRoZSB1bmlxdWVuZXNzIG9mIGFuIG9iamVjdCB3aXRoaW4gYSBnaXZlbiBmZWF0dXJlIHRoYXQgY29udGFpbnMgaXQuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmlxdWVuZXNzVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JcHJvdGVjdGVkIEVPYmplY3Qgb2JqZWN0OwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTsKLQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVOYW1lOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmU7Ci0KLQlwcml2YXRlIElGaWx0ZXIgY2hpbGRGaWx0ZXI7Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBjb250YWluZXI7Ci0KLQlwdWJsaWMgVW5pcXVlbmVzc1ZhbGlkYXRvcihFT2JqZWN0IGNvbnRhaW5lciwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250YWluaW5nRmVhdHVyZSwgSUZpbHRlciBjaGlsZEZpbHRlciwKLQkJCUVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQl0aGlzKGNvbnRhaW5lciwgY29udGFpbmluZ0ZlYXR1cmUsIGNoaWxkRmlsdGVyLCBvYmosIGZlYXR1cmUsIFN0clV0aWwKLQkJCQkudG9Mb3dlcihUbmdVdGlsLmdldEZlYXR1cmVUZXh0KGZlYXR1cmUpKSk7Ci0JfQotCi0JcHVibGljIFVuaXF1ZW5lc3NWYWxpZGF0b3IoRU9iamVjdCBjb250YWluZXIsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUsIElGaWx0ZXIgY2hpbGRGaWx0ZXIsCi0JCQlFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQkJb2JqZWN0ID0gb2JqOwotCQl0aGlzLmNvbnRhaW5pbmdGZWF0dXJlID0gY29udGFpbmluZ0ZlYXR1cmU7Ci0JCXRoaXMuY2hpbGRGaWx0ZXIgPSBjaGlsZEZpbHRlcjsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy5mZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lOwotCX0KLQkKLQl2b2lkIHNldENoaWxkRmlsdGVyKElGaWx0ZXIgY2hpbGRGaWx0ZXIpIHsKLQkJdGhpcy5jaGlsZEZpbHRlciA9IGNoaWxkRmlsdGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQlpZiAoY29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbmV3VGV4dCA9IG5ld1RleHQudHJpbSgpOwotCQlpZiAoU3RyVXRpbC5pc0JsYW5rKG5ld1RleHQpKSB7Ci0JCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbXB0eUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQlmZWF0dXJlTmFtZSk7Ci0JCX0KLQkJQ29sbGVjdGlvbiBjaGlsZHJlbjsKLQkJaWYgKGNvbnRhaW5pbmdGZWF0dXJlID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gY29udGFpbmVyLmVDb250ZW50cygpOwotCQl9IGVsc2UgewotCQkJY2hpbGRyZW4gPSAoQ29sbGVjdGlvbikgY29udGFpbmVyLmVHZXQoY29udGFpbmluZ0ZlYXR1cmUpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY2hpbGQgIT0gb2JqZWN0ICYmIGNoaWxkRmlsdGVyLmFjY2VwdChjaGlsZCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpICgoRU9iamVjdCkgY2hpbGQpLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShuZXdUZXh0KSkgewotCQkJCQkvLyByZXR1cm4gSTE4blV0aWwuZm9ybWF0U3RyaW5nKFJFU09VUkNFX0JVTkRMRSwga2V5LCBkYXRhKTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmR1cGxpY2F0ZUVsZW1lbnROYW1lRXJyb3JfbXNnLAotCQkJCQkJCW5ld1RleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3IjaXNWYWxpZChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGlzVmFsaWQoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlDb2xsZWN0aW9uIGNoaWxkcmVuOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgPT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPSBjb250YWluZXIuZUNvbnRlbnRzKCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGlsZHJlbiA9IChDb2xsZWN0aW9uKSBjb250YWluZXIuZUdldChjb250YWluaW5nRmVhdHVyZSk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgY2hpbGQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCAhPSBvYmplY3QgJiYgY2hpbGRGaWx0ZXIuYWNjZXB0KGNoaWxkKSkgewotCQkJCVN0cmluZyBvID0gKFN0cmluZykgKChFT2JqZWN0KSBjaGlsZCkuZUdldChmZWF0dXJlKTsKLQkJCQlpZiAoby5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJMCwKLQkJCQkJCQlOTFMKLQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5kdXBsaWNhdGVGZWF0dXJlVmFsdWUsCi0JCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCQkJCQkJVG5nVXRpbC5nZXRMYWJlbChjb250YWluZXIpLAotCQkJCQkJCQkJCQkJCWZlYXR1cmVOYW1lCi0JCQkJCQkJCQkJCX0pLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdCgpIHsKLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0Njk3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5BYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLk5hbWVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgSVZhbGlkYXRvckZhY3RvcnkuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JGYWN0b3J5IGltcGxlbWVudHMgSVZhbGlkYXRvckZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIExpc3QgY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBJVmFsaWRhdG9yRmFjdG9yeSBpbnN0YW5jZTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZU5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVOYW1lVmFsaWRhdG9yKE9iamVjdCBwYXJlbnQsIENvbnRlbnRFbGVtZW50IGUpIHsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICYmIGUgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCBlLAotCQkJCQluZXcgVHlwZUZpbHRlcihlKSk7Ci0JCX0KLQkJRU9iamVjdCBjb250YWluZXIgPSBudWxsOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJY29udGFpbmVyID0gKEVPYmplY3QpIHBhcmVudDsKLQkJfQotCQlyZXR1cm4gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihjb250YWluZXIsIGUsIG5ldyBUeXBlRmlsdGVyKGUpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQpCi0JICogICAgICBDaGFuZ2VkIGZyb20gQ29udGVudEVsZW1lbnQgdG8gRGVzY3JpYmFibGVFbGVtZW50LCBiZWNhdXNlCi0JICogICAgICBQcmVzZW50YXRpb25OYW1lIGF0dHJpYnV0ZSBpcyBhdmFpbGFibGUgaW4gRGVzY3JpYmFibGVFbGVtZW50LgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVByZXNlbnRhdGlvbk5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgYXJyWzBdOwotCQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IChJRmlsdGVyKSBhcnJbMV07Ci0JCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGRGaWx0ZXIgPT0gbnVsbCkgewotCQkJCQljaGlsZEZpbHRlciA9IG5ldyBUeXBlRmlsdGVyKGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoKEVPYmplY3QpIHBhcmVudCwgcmVmZXJlbmNlLAotCQkJCQkJY2hpbGRGaWx0ZXIsIGUsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5VbmlxdWVuZXNzVmFsaWRhdG9yI2lzVmFsaWQoamF2YS5sYW5nLlN0cmluZykKLQkJCQkJICovCi0JCQkJCXB1YmxpYyBTdHJpbmcgaXNWYWxpZChTdHJpbmcgbmV3VGV4dCkgewotCQkJCQkJaWYgKFN0clV0aWwuaXNCbGFuayhuZXdUZXh0KQotCQkJCQkJCQkmJiBOYW1lQ2hlY2tlcgotCQkJCQkJCQkJCS5jYW5IYXZlRW1wdHlQcmVzZW50YXRpb25OYW1lKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCkpIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBzdXBlci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JCXByaXZhdGUgaW50IGNsYXNzSUQ7Ci0KLQkJcHJpdmF0ZSBFQ2xhc3MgZUNsYXNzOwotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBUeXBlRmlsdGVyKEVPYmplY3Qgb2JqKSB7Ci0JCQljbGFzc0lEID0gb2JqLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVGaWx0ZXIoRUNsYXNzIGVDbGFzcykgewotCQkJdGhpcy5lQ2xhc3MgPSBlQ2xhc3M7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJaWYgKGVDbGFzcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVDbGFzcy5pc0luc3RhbmNlKG9iaik7Ci0JCQl9Ci0KLQkJCXJldHVybiBvYmogaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIGNsYXNzSUQgPT0gKChFT2JqZWN0KSBvYmopLmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElGaWx0ZXIgbm9uRmlsdGVyID0gbmV3IElGaWx0ZXIoKSB7Ci0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W10gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIoT2JqZWN0IHBhcmVudCwKLQkJCU9iamVjdCBjaGlsZCkgewotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IG51bGw7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBudWxsOwotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCSYmIGNoaWxkIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM7Ci0JCQkJY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcigKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzsKLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZWZlcmVuY2UgPSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJcmVmZXJlbmNlID0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzsKLQkJCQljaGlsZEZpbHRlciA9IG5vbkZpbHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciB9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZU5hbWVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlTmFtZVZhbGlkYXRvcihPYmplY3QgcGFyZW50LCBmaW5hbCBOYW1lZEVsZW1lbnQgZSkgewotCQlmaW5hbCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRTsKLQkJT2JqZWN0W10gYXJyID0gZ2V0Q2hpbGRSZWZlcmVuY2VBbmRGaWx0ZXIocGFyZW50LCBlKTsKLQkJRVJlZmVyZW5jZSByZWZlcmVuY2UgPSAoRVJlZmVyZW5jZSkgYXJyWzBdOwotCQlJRmlsdGVyIGNoaWxkRmlsdGVyID0gKElGaWx0ZXIpIGFyclsxXTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKAotCQkJCShNZXRob2RMaWJyYXJ5KSBwYXJlbnQsIChNZXRob2RDb25maWd1cmF0aW9uKSBlKTsKLQkJfQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoT2JqZWN0IHBhcmVudCwgZmluYWwgTmFtZWRFbGVtZW50IGUsIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCWZpbmFsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FOwotCQlPYmplY3RbXSBhcnIgPSBnZXRDaGlsZFJlZmVyZW5jZUFuZEZpbHRlcihwYXJlbnQsIGUpOwotCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSBhcnJbMF07Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBuZXcgVHlwZUZpbHRlcihuZXdUeXBlKTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwgY2hpbGRGaWx0ZXIsIGUsCi0JCQkJCWZlYXR1cmUpOwotCQl9Ci0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3RvcnkjY3JlYXRlTmFtZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5KQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZU5hbWVWYWxpZGF0b3IoTmFtZWRFbGVtZW50IGUsCi0JCQlBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgY29udGFpbmluZ0ZlYXR1cmUgPSBUbmdVdGlsLmdldENvbnRhaW5pbmdGZWF0dXJlKGUsCi0JCQkJYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoY29udGFpbmluZ0ZlYXR1cmUgIT0gbnVsbCkgewotCQkJRU9iamVjdCBwYXJlbnQgPSAoRU9iamVjdCkgKChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChlLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpKS5nZXRQYXJlbnQoZSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3IocGFyZW50LAotCQkJCQkJY29udGFpbmluZ0ZlYXR1cmUsIChDb250ZW50RWxlbWVudCkgZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQKLQkJCQkJJiYgcGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gbmV3IFByb2Nlc3NDb21wb25lbnROYW1lVmFsaWRhdG9yKAotCQkJCQkJKFByb2Nlc3NQYWNrYWdlKSBwYXJlbnQsIChQcm9jZXNzQ29tcG9uZW50KSBlKTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbgotCQkJCQkmJiBwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJcmV0dXJuIG5ldyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKAotCQkJCQkJKE1ldGhvZExpYnJhcnkpIHBhcmVudCwgKE1ldGhvZFBsdWdpbikgZSk7Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKAotCQkJCQkJKE1ldGhvZExpYnJhcnkpIHBhcmVudCwgKE1ldGhvZENvbmZpZ3VyYXRpb24pIGUpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LCBjb250YWluaW5nRmVhdHVyZSwKLQkJCQkJCW5ldyBUeXBlRmlsdGVyKGUpLCBlLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU5hbWVWYWxpZGF0b3IoZS5lQ29udGFpbmVyKCksIGUpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeSNjcmVhdGVWYWxpZGF0b3Iob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoRU9iamVjdCBwYXJlbnQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQkJRUNsYXNzIGVDbGFzcywgZmluYWwgRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlGaWx0ZXIgY2hpbGRGaWx0ZXIgPSBlQ2xhc3MgIT0gbnVsbCA/IG5ldyBUeXBlRmlsdGVyKGVDbGFzcykgOiBudWxsOwotCQlyZXR1cm4gY3JlYXRlVmFsaWRhdG9yKHBhcmVudCwgcmVmZXJlbmNlLCBjaGlsZEZpbHRlciwgb2JqZWN0LCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElWYWxpZGF0b3JGYWN0b3J5IGNyZWF0ZVZhbGlkYXRvckZhY3RvcnkoKSB7Ci0JCWlmIChjb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQljb250cmlidXRlZFZhbGlkYXRvckZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtCi0JCQkJCS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkJLmdldEV4dGVuc2lvblBvaW50KExpYnJhcnlFZGl0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLAotCQkJCQkJCSJ2YWxpZGF0aW9uU3VwcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCQkJCQkJT2JqZWN0IGV4dCA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKQotCQkJCQkJCQkJCS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCQlib29sZWFuIHJlcGxhY2UgPSBuZXcgQm9vbGVhbihjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgicmVwbGFjZSIpKS5ib29sZWFuVmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAocmVwbGFjZSkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuY2xlYXIoKTsKLQkJCQkJCQkJCWluc3RhbmNlID0gKElWYWxpZGF0b3JGYWN0b3J5KSBleHQ7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQkJCQkJY29udHJpYnV0ZWRWYWxpZGF0b3JGYWN0b3JpZXMuYWRkKGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBWYWxpZGF0b3JGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5I2NyZWF0ZVZhbGlkYXRvcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLAotCSAqICAgICAgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3RvcnkpCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgY3JlYXRlVmFsaWRhdG9yKGZpbmFsIE9iamVjdCBwYXJlbnQsIEVDbGFzcyBlQ2xhc3MsCi0JCQlmaW5hbCBFT2JqZWN0IG9iamVjdCwgZmluYWwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlmaW5hbCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FCi0JCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpIHsKLQkJCQlmaW5hbCBCcmVha2Rvd25FbGVtZW50IGJlID0gKEJyZWFrZG93bkVsZW1lbnQpIG9iamVjdDsKLQkJCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MocGFyZW50KTsKLQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCWZpbmFsIFN1cHByZXNzaW9uIHN1cHAgPSBTdXBwcmVzc2lvbi5nZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkJCQkJcmV0dXJuIG5ldyBBYnN0cmFjdFN0cmluZ1ZhbGlkYXRvcigpIHsKLQotCQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQkJcmV0dXJuIE5hbWVDaGVja2VyLmNoZWNrTmFtZShhZGFwdGVyRmFjdG9yeSwKLQkJCQkJCQkJCXBhcmVudCwgYmUsIG51bGwsIGZlYXR1cmUsIG5ld1RleHQsIHN1cHAsCi0JCQkJCQkJCQl0cnVlKTsKLQkJCQkJCX0KLQotCQkJCQl9OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBEb05vdGhpbmdWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbHRlciBnZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIsIEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gZmlsdGVyICE9IG51bGwgPyBmaWx0ZXIgOiAoZU9iamVjdCAhPSBudWxsID8gbmV3IFR5cGVGaWx0ZXIoCi0JCQkJZU9iamVjdCkgOiBub25GaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihFT2JqZWN0IHBhcmVudCwgRVJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCQlJRmlsdGVyIGNoaWxkRmlsdGVyLCBmaW5hbCBFT2JqZWN0IG9iamVjdCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSkgewotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQkJaWYgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyAmJiBvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQkJdmFsaWRhdG9yID0gbmV3IENvbnRlbnRFbGVtZW50TmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCQkJcmVmZXJlbmNlLCAoQ29udGVudEVsZW1lbnQpIG9iamVjdCwgZ2V0RmlsdGVyKAotCQkJCQkJCQkJY2hpbGRGaWx0ZXIsIG9iamVjdCkpOwotCi0JCQkJfSBlbHNlIGlmICgocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpCi0JCQkJCQl8fCAocmVmZXJlbmNlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUykpIHsKLQkJCQkJLy8gRGlzY2lwbGluZSBhbmQgRGlzY2lwbGluZUdyb3VwaW5nLCBSb2xlU2V0IGFuZAotCQkJCQkvLyBSb2xlU2V0R3JvdXBpbmcKLQkJCQkJLy8gaGFuZGxpbmcKLQkJCQkJLy8gbmVjZXNzYXJ5IGluIG9yZGVyIHRvIG1haW50YWluIHVuaXF1ZW5lc3MgYWNyb3NzIHBsdWdpbi4KLQkJCQkJdmFsaWRhdG9yID0gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IocGFyZW50LmVDb250YWluZXIoKSwKLQkJCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkJLmdldENvbnRlbnRQYWNrYWdlX0NvbnRlbnRFbGVtZW50cygpLAotCQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCQl9IGVsc2UgaWYgKChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUykKLQkJCQkJCXx8IChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FKQotCQkJCQkJfHwgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTKQotCQkJCQkJfHwgKHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOUykKLQkJCQkJCSkgewotCQkJCQl2YWxpZGF0b3IgPSBuZXcgQ29udGVudEVsZW1lbnROYW1lVmFsaWRhdG9yKHBhcmVudCwKLQkJCQkJCQlyZWZlcmVuY2UsIChDb250ZW50RWxlbWVudCkgb2JqZWN0LCBnZXRGaWx0ZXIoCi0JCQkJCQkJCQljaGlsZEZpbHRlciwgb2JqZWN0KSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50Ci0JCQkJCSYmIHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCSYmIHJlZmVyZW5jZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSkgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgcGFyZW50OwotCQkJCWlmIChwa2cuZVJlc291cmNlKCkuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQkJcmV0dXJuIG5ldyBQcm9jZXNzQ29tcG9uZW50TmFtZVZhbGlkYXRvcigKLQkJCQkJCQkoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudCwgKFByb2Nlc3NDb21wb25lbnQpIG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG5ldyBVbmlxdWVuZXNzVmFsaWRhdG9yKChFT2JqZWN0KSBwYXJlbnQsIHJlZmVyZW5jZSwKLQkJCQkJCQlnZXRGaWx0ZXIoY2hpbGRGaWx0ZXIsIG9iamVjdCksIG9iamVjdCwgZmVhdHVyZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGFyZW50OwotCQkJCWlmIChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpIHsKLQkJCQkJaWYgKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJCQkJcmV0dXJuIG5ldyBNZXRob2RQbHVnaW5OYW1lVmFsaWRhdG9yKGxpYiwKLQkJCQkJCQkJKE1ldGhvZFBsdWdpbikgb2JqZWN0KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcigKLQkJCQkJCQkJbGliLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQkJCQkJbm9uRmlsdGVyLCBvYmplY3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZWZlcmVuY2UgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUykgewotCQkJCQlpZiAobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25OYW1lVmFsaWRhdG9yKGxpYiwKLQkJCQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iamVjdCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFVuaXF1ZW5lc3NWYWxpZGF0b3IoCi0JCQkJCQkJCWxpYiwKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUywKLQkJCQkJCQkJbm9uRmlsdGVyLCBvYmplY3QsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2YWxpZGF0b3IgPSBuZXcgVW5pcXVlbmVzc1ZhbGlkYXRvcihwYXJlbnQsIHJlZmVyZW5jZSwKLQkJCQkJCWdldEZpbHRlcihjaGlsZEZpbHRlciwgb2JqZWN0KSwgb2JqZWN0LCBmZWF0dXJlKTsKLQkJCX0KLQotCQkJcmV0dXJuIHZhbGlkYXRvcjsKLQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJlc2VudGF0aW9uTmFtZVZhbGlkYXRvcihwYXJlbnQsCi0JCQkJCShEZXNjcmliYWJsZUVsZW1lbnQpIG9iamVjdCk7Ci0JCX0KLQotCQlyZXR1cm4gRG9Ob3RoaW5nVmFsaWRhdG9yLklOU1RBTkNFOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9lZGl0L3ZhbGlkYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2UxODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHZhbGlkYXRpbmcgbWV0aG9kIGxpYnJhcnkgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2VkaXQvdmFsaWRhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzNkMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZWRpdC92YWxpZGF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB2YWxpZGF0aW5nIG1ldGhvZCBsaWJyYXJ5IGVsZW1lbnRzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzYjhlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgQ29tbW9uIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL2RlYnVnPXRydWUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzE4Y2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRmOGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb247dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLndvcmtzcGFjZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2gsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLAotIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWwKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjY2E3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbWlncmF0aW9uLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL21pZ3JhdG9ycy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvbWlncmF0aW9uL21pZ3JhdG9ycy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc5ZTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi9taWdyYXRvcnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaHR0cFw6Ly8vY29tL2libS91bWEuZWNvcmU9b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcgotb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvcj1odHRwXDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUKLWh0dHBcOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZT1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyCi1vcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yMTAyPWh0dHBcOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWExLjAuMl8xLjAuMy5lY29yZTJlY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWExLjAuMl8xLjAuMy5lY29yZTJlY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyZTc0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMS4wLjJfMS4wLjMuZWNvcmUyZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmUyZWNvcmU6RWNvcmUyRWNvcmVNYXBwaW5nUm9vdCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlMmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDA0L0Vjb3JlMkVjb3JlIiB0b3BUb0JvdHRvbT0idHJ1ZSI+Ci0gIDxpbnB1dHMgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUjLyIvPgotICA8b3V0cHV0cyBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5lY29yZSMvIi8+Ci08L2Vjb3JlMmVjb3JlOkVjb3JlMkVjb3JlTWFwcGluZ1Jvb3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWE3ZjQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBMaWJyYXJ5IFBlcnNpc3RlbmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLVBlcnNpc3RlbmNlTWFya2VyVHlwZU5hbWU9WE1JIFJlZmVyZW5jZSBQcm9ibGVtcwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlYjE2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtaWdyYXRvcnMiIG5hbWU9Ik1pZ3JhdG9ycyIgc2NoZW1hPSJzY2hlbWEvbWlncmF0b3JzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InJlc291cmNlU2V0RmFjdG9yaWVzIiBuYW1lPSJMaWJyYXJ5IFJlc291cmNlIFNldCBGYWN0b3JpZXMiIHNjaGVtYT0ic2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QiLz4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgotICAgIDxwYWNrYWdlIAotICAgICAgIHVyaSA9ICJodHRwOi8vL2NvbS9pYm0vdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgCi0gICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlIiAvPgotICAgIDxwYWNrYWdlCi0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSIKLSAgICAgICAgICB1cmk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyI+Ci0gICAgIDxtaWdyYXRvcgotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbC5NaWdyYXRvciIKLSAgICAgICAgICAgbGliTnNVUkk9Imh0dHA6Ly8vY29tL2libS91bWEuZWNvcmUiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5zZXJ2aWNlUHJvdmlkZXJzIj4KLSAgICAgPGFjY2Vzc0NvbnRyb2xsZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLmludGVybmFsLkFjY2Vzc0NvbnRyb2xsZXIiLz4KLSAgICAgPGxpYnJhcnlQZXJzaXN0ZXIKLSAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5YTUlMaWJyYXJ5UGVyc2lzdGVyIgotICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIKLSAgICAgICAgICAgdHlwZT0ieG1pIi8+Ci0gICAgIDxmaWxlTWFuYWdlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLkRlbGVnYXRlRmlsZU1hbmFnZXIiLz4KLSAgPC9leHRlbnNpb24+Ci0gIDxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnJlc291cmNlU2V0RmFjdG9yaWVzIj4KLSAgICAgPHJlc291cmNlU2V0RmFjdG9yeQotICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlhNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiCi0gICAgICAgICAgIHR5cGU9InhtaSIvPgotICA8L2V4dGVuc2lvbj4KLSAgPGV4dGVuc2lvbgotICAgICAgICBpZD0idW5yZXNvbHZlZFByb3h5TWFya2VyIgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIgbmFtZT0iJVBlcnNpc3RlbmNlTWFya2VyVHlwZU5hbWUiPgotICAgICA8cGVyc2lzdGVudAotICAgICAgICAgICB2YWx1ZT0iZmFsc2UiPgotICAgICA8L3BlcnNpc3RlbnQ+Ci0gICAgIDxzdXBlcgotICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9ibGVtbWFya2VyIj4KLSAgICAgPC9zdXBlcj4KLSAgICAgPGF0dHJpYnV0ZQotICAgICAgICAgICBuYW1lPSJwcm94eVVSSSI+Ci0gICAgIDwvYXR0cmlidXRlPgotICAgICA8YXR0cmlidXRlCi0gICAgICAgICAgIG5hbWU9Im93bmVyR1VJRCI+Ci0gICAgIDwvYXR0cmlidXRlPgotICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zY2hlbWEvbWlncmF0b3JzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGEwZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL21pZ3JhdG9ycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZSIgaWQ9Im1pZ3JhdG9ycyIgbmFtZT0iTWlncmF0b3JzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIE1pZ3JhdG9yIG1pZ3JhdGVzIG1ldGhvZCBsaWJyYXJ5IGZyb20gb25lIHZlcnNpb24gdG8gYW5vdGhlcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtaWdyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJtaWdyYXRvciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIG1pZ3JhdG9yLiBUaGlzIGNsYXNzIG11c3QgYmUgYSBwdWJsaWMgaW1wbGVtZW50YXRpb24gb2YgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvciZsdDsvY29kZSZndDsgd2l0aCBhIHB1YmxpYyAwLWFyZ3VtZW50IGNvbnN0cnVjdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxpYk5zVVJJIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIHNwYWNlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB0aGlzIG1pZ3JhdG9yIGNhbiBtaWdyYXRlcwotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyZxdW90OyZndDsKLSAgICAgJmx0O21pZ3JhdG9yCi0gICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3ImcXVvdDsKLSAgICAgICAgICAgbGliTnNVUkk9JnF1b3Q7aHR0cDovLy9jb20vaWJtL3VtYS5lY29yZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklNaWdyYXRvcgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsLk1pZ3JhdG9yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NjaGVtYS9yZXNvdXJjZVNldEZhY3Rvcmllcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmQ3YjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc2NoZW1hL3Jlc291cmNlU2V0RmFjdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiBpZD0icmVzb3VyY2VTZXRGYWN0b3JpZXMiIG5hbWU9IkxpYnJhcnkgUmVzb3VyY2UgU2V0IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gY29udHJpYnV0ZSBmYWN0b3JpZXMgZm9yIGNyZWF0aW9uIG9mIGxpYnJhcnkgcmVzb3VyY2Ugc2V0LiBUaGUgZmFjdG9yaWVzIG11c3QgaW1wbGVtZW50IGludGVyZmFjZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBhbmQgbXVzdCBoYXZlIGEgcHVibGljIG5vbi1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icmVzb3VyY2VTZXRGYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJlc291cmNlU2V0RmFjdG9yeSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0idHlwZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWRjYTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2UgZXh0ZW5kcyBSZXNvdXJjZSB7Ci0JLyoqCi0JICogR2V0cyBsb2FkIHN0YW1wLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlsb25nIGdldExvYWRTdGFtcCgpOwotCQotCS8qKgotCSAqIEdldHMgcHJveHkgVVJJIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybgotCSAqLwotCVVSSSBnZXRQcm94eVVSSShFT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5ZGI1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvSUxpYnJhcnlSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklVbWFSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEEgcmVzb3VyY2Ugc2V0IHRoYXQgbWFuYWdlcyBhIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlc291cmNlfQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5UmVzb3VyY2VTZXQgZXh0ZW5kcyBJVW1hUmVzb3VyY2VTZXQgewotCS8qKgotCSAqIEdldHMgdGhlIHBlcnNpc3RlbmNlIHR5cGUgdGhpcyByZXNvdXJjZSBzZXQgc3VwcG9ydHMKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICogQHNlZSBTZXJ2aWNlcyNnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpCi0JICogQHNlZSBTZXJ2aWNlcyNYTUlfUEVSU0lTVEVOQ0VfVFlQRQotCSAqLwotCVN0cmluZyBnZXRQZXJzaXN0ZW5jZVR5cGUoKTsKLQotCS8qKgotCSAqIExvYWRzIG1ldGhvZCBsaWJyYXJpZXMgaW50byB0aGlzIHJlc291cmNlIHNldCBmcm9tIHRoZSBnaXZlbiBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhcmFtZXRlcnMKLQkgKiBAcmV0dXJuCi0JICovCi0Jdm9pZCBsb2FkTWV0aG9kTGlicmFyaWVzKFVSSSB1cmksIE1hcDw/LCA/PiBwYXJhbWV0ZXJzKQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgbWV0aG9kIGxpYnJhcmllcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgaW50byB0aGlzCi0JICogcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlMaXN0PE1ldGhvZExpYnJhcnk+IGdldE1ldGhvZExpYnJhcmllcygpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3QgbG9hZGVkIG1ldGhvZCBsaWJyYXJ5IG9mIHRoaXMgcmVzb3VyY2Ugc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBsaWJyYXJ5IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIG5vdCBsb2FkZWQKLQkgKiAgICAgICAgIHlldC4KLQkgKiBAc2VlICNsb2FkTGlicmFyeShVUkksIE1hcCkKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBHVUlEIChHbG9iYWxseSBVbmlxdWUgSWRlbnRpZmllcikKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqIEByZXR1cm4KLQkgKi8KLQlFT2JqZWN0IGdldEVPYmplY3QoU3RyaW5nIGd1aWQpOwotCi0JTWFwPD8sID8+IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmVzIG9mIGFsbCBsb2FkZWQgb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlCi0JICogc2V0LgotCSAqIAotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmVzCi0JICovCi0Jdm9pZCBsb2FkT3Bwb3NpdGVGZWF0dXJlcyhMaXN0PE9wcG9zaXRlRmVhdHVyZT4gb3Bwb3NpdGVGZWF0dXJlcyk7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgZ2l2ZW4gb3Bwb3NpdGUgZmVhdHVyZXMgb2YgdGhvc2Ugb2JqZWN0cyBpbiB0aGlzIHJlc291cmNlIHNldAotCSAqIHdob3NlIEdVSURzIGFyZSBzcGVjaWZpZWQgaW4gPGNvZGU+R1VJRHM8L2NvZGU+IHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3Bwb3NpdGVGZWF0dXJlcwotCSAqIEBwYXJhbSBHVUlEcwotCSAqLwotCXZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdDxPcHBvc2l0ZUZlYXR1cmU+IG9wcG9zaXRlRmVhdHVyZXMsIFNldDxTdHJpbmc+IEdVSURzKTsKLQotCS8qKgotCSAqIFNhdmVzIHRoaXMgcmVzb3VyY2Ugc2V0IHdpdGggdGhlIGdpdmVuIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgc2F2ZSBvcHRpb25zCi0JICogQHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24KLQkgKi8KLQl2b2lkIHNhdmUoTWFwPD8sID8+IG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBnaXZlbiBvYmplY3QgaW4gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBvYmplY3Qgd2FzIHVubG9hZGVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkKLQkgKi8KLQlib29sZWFuIHVubG9hZChFT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugb2YgdGhpcyByZXNvdXJjZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIFRPRE8KLQkgKi8KLQlib29sZWFuIHVubG9hZChSZXNvdXJjZSByZXNvdXJjZSwgTWFwPD8sID8+IG9wdGlvbnMpOwotCi0JLyoqCi0JICogUmVsb2FkcyB0aGUgZ2l2ZW4gcmVzb3VyY2VzCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqIEByZXR1cm4gcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gcmVsb2FkZWQKLQkgKi8KLQlDb2xsZWN0aW9uPFJlc291cmNlPiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKTsKLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHBlcnNpc3RlZCBvYmplY3RzLgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3RzCi0JICogQHJldHVybiBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIHJlbG9hZGVkCi0JICovCi0JQ29sbGVjdGlvbjxFT2JqZWN0PiByZWxvYWRPYmplY3RzKENvbGxlY3Rpb248RU9iamVjdD4gb2JqZWN0cyk7Ci0KLQkvKioKLQkgKiBVbmxvYWRzIHRoaXMgcmVzb3VyY2Ugc2V0LiBUaGlzIHdpbGwgdW5sb2FkIGV2ZXJ5IHJlc291cmNlIGluIHRoaXMKLQkgKiByZXNvdXJjZSBzZXQgYW5kIHJlc2V0IHRoZSByZXNvdXJjZSBzZXQgdG8gdGhlIHN0YXRlIGJlZm9yZSBsb2FkaW5nIHRoZQotCSAqIGxpYnJhcnkuCi0JICogCi0JICovCi0Jdm9pZCB1bmxvYWQoKTsKLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGVyZSBpcyBhbnkgdW5yZXNvbHZlZCBwcm94eSBkZXRlY3RlZCBpbiB0aGUgbGlicmFyeQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpOwotCi0JLyoqCi0JICogU3Vic2NyaWJlcyB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIGxpc3RlbiB0byByZWZyZXNoIGV2ZW50cyBicm9hZGNhc3RlZAotCSAqIHdoZW5ldmVyIHJlc291cmNlcyBvciBvYmplY3RzIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IGlzIHJlZnJlc2hlZC9yZWxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiBAc2VlICNyZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbikKLQkgKi8KLQl2b2lkIGFkZFJlZnJlc2hMaXN0ZW5lcihJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyKTsKLQkKLQkvKioKLQkgKiBVbnN1YnNjcmliZXMgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIGxpc3RlbmluZyB0byByZWZyZXNoIGV2ZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQlJTGlicmFyeVBlcnNpc3RlciBnZXRQZXJzaXN0ZXIoKTsKLQotCXZvaWQgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KQotCQkJdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLQotCUlTdGF0dXMgY2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxFT2JqZWN0PiBlT2JqZWN0cywgT2JqZWN0IGNvbnRleHQpOwotCQotCUNvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWROZXdSZXNvdXJjZXMoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTczYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSUxpYnJhcnlSZXNvdXJjZVNldH0gaW5zdGFuY2Ugb2YgdGhlIHBhcnRpY3VsYXIKLSAqIHBlcnNpc3RlbmNlIHR5cGUKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjYsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwZXJzaXN0ZW5jZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBzZXQgY3JlYXRlZCBieSB0aGlzIGZhY3RvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB0eXBlCi0JICovCi0JU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaWJyYXJ5IHJlc291cmNlIHNldAotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgbGlicmFyeSByZXNvdXJjZSBzZXQKLQkgKi8KLQlJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZUxpYnJhcnlSZXNvdXJjZVNldCgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lSZWZyZXNoSW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL0lSZWZyZXNoSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWE3YjBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9JUmVmcmVzaEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMywgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEluZm8gewotCS8qKgotCSAqIEdldHMgZXhpc3RpbmcgcmVzb3VyY2VzIHRoYXQgcmVhcHBlYXJzIGluIHdvcmtzcGFjZQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFkZGVkUmVzb3VyY2VzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBHZXRzIG5ld2x5IGFkZGVkIHdvcmtzcGFjZSByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0QWRkZWRXb3Jrc3BhY2VSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNoYW5nZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlbW92ZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVtb3ZlZFJlc291cmNlcygpOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgbWFuYWdlciB0aGF0IHRoZSBnaXZlbiByZXNvdXJjZSBqdXN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlU2F2ZWQoUmVzb3VyY2UgcmVzb3VyY2UpOwkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9MaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQwYjAxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvTGlicmFyeVJlc291cmNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAyLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODI3MjU4NzM0NDY3ODY3NjgyOEw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqIEBwYXJhbSBjYXVzZQotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLQkJc3VwZXIoY2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjYwZGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VTZXJ2aWNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVNlcnZpY2UgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VTZXJ2aWNlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgRmFjdG9yeURlZj4gdHlwZVRvRmFjdG9yeURlZk1hcDsKLQotCXByaXZhdGUgUGVyc2lzdGVuY2VTZXJ2aWNlKCkgewotCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBSZXNvdXJjZVNldCBmb3IgdGhlIGdpdmVuIHBlcnNpc3RlbmNlIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVSZXNvdXJjZVNldChTdHJpbmcgdHlwZSkgewotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSh0eXBlKTsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZTogIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5RGVmIHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQotCQlTdHJpbmcgdHlwZTsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQkKLQkJaW50IHZlcnNpb247Ci0JCQotCQlJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSBpbnN0YW5jZTsKLQotCQkvKioKLQkJICogQHBhcmFtIGJ1bmRsZQotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JCSAqIEBwYXJhbSBpbnN0YW5jZQotCQkgKi8KLQkJcHJpdmF0ZSBGYWN0b3J5RGVmKEJ1bmRsZSBidW5kbGUsIFN0cmluZyB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lLCBpbnQgdmVyc2lvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJfQotCQkJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGdldEZhY3RvcnkoU3RyaW5nIHBlcnNpc3RlbmNlVHlwZSkgewotCQlpZiAodHlwZVRvRmFjdG9yeURlZk1hcCA9PSBudWxsKSB7Ci0JCQl0eXBlVG9GYWN0b3J5RGVmTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGYWN0b3J5RGVmPigpOwotCQkJLy8gUHJvY2VzcyB0aGUgIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyIKLQkJCS8vIGV4dGVuc2lvbiBwb2ludAotCQkJLy8gY29udHJpYnV0b3JzLgotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJCQkJIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlIiwgInJlc291cmNlU2V0RmFjdG9yaWVzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIHR5cGUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwKLQkJCQkJCQkJCSYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCQkmJiB0eXBlICE9IG51bGwKLQkJCQkJCQkJCSYmIHR5cGUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpbnQgdmVyc2lvbiA9IFNlcnZpY2VzLnBhcnNlVmVyc2lvbihjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgidmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlGYWN0b3J5RGVmIGZhY3RvcnlEZWYgPSB0eXBlVG9GYWN0b3J5RGVmTWFwLmdldCh0eXBlKTsJCQkJCQkJCQotCQkJCQkJCQlpZihmYWN0b3J5RGVmID09IG51bGwgfHwgZmFjdG9yeURlZi52ZXJzaW9uIDwgdmVyc2lvbikgewotCQkJCQkJCQkJdHlwZVRvRmFjdG9yeURlZk1hcC5wdXQodHlwZSwgbmV3IEZhY3RvcnlEZWYoYnVuZGxlLAotCQkJCQkJCQkJCQl0eXBlLCBjbGFzc05hbWUsIHZlcnNpb24pKTsJCQkJCQkJCQkKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlGYWN0b3J5RGVmIGZhY3RvcnkgPSAoRmFjdG9yeURlZikgdHlwZVRvRmFjdG9yeURlZk1hcC5nZXQocGVyc2lzdGVuY2VUeXBlKTsKLQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJaWYgKGZhY3RvcnkuaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IHJlc291cmNlU2V0RmFjdG9yeSA9IChJTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeSkgZmFjdG9yeS5idW5kbGUubG9hZENsYXNzKAotCQkJCQkJCWZhY3RvcnkuY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCQlpZihwZXJzaXN0ZW5jZVR5cGUuZXF1YWxzKHJlc291cmNlU2V0RmFjdG9yeS5nZXRQZXJzaXN0ZW5jZVR5cGUoKSkpIHsKLQkJCQkJCWZhY3RvcnkuaW5zdGFuY2UgPSByZXNvdXJjZVNldEZhY3Rvcnk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZmFjdG9yeS5jbGFzc05hbWUgKwotCQkJCQkJCQkiIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgd3JvbmcgcGVyc2lzdGVuY2UgdHlwZSAnIiArIHBlcnNpc3RlbmNlVHlwZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJIicuIFRoZSBjb3JyZWN0IHR5cGUgbXVzdCBiZSAnIiArIHJlc291cmNlU2V0RmFjdG9yeS5nZXRQZXJzaXN0ZW5jZVR5cGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQlpZihERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWN0b3J5Lmluc3RhbmNlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS9pbnRlcm5hbC9BY2Nlc3NDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzJiOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0FjY2Vzc0NvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NDb250cm9sbGVyIGltcGxlbWVudHMgSUFjY2Vzc0NvbnRyb2xsZXIgewotCi0JcHVibGljIEFjY2Vzc0NvbnRyb2xsZXIoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklBY2Nlc3NDb250cm9sbGVyI2NoZWNrTW9kaWZ5KGphdmEudXRpbC5Db2xsZWN0aW9uLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb24gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmKGVPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZVNldCkgewotCQkJCXJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlU2V0LmNoZWNrTW9kaWZ5KGVPYmplY3RzLCBjb250ZXh0KTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUFjY2Vzc0NvbnRyb2xsZXIjY2hlY2tNb2RpZnkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlW10sIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoUmVzb3VyY2VbXSByZXNvdXJjZXMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCWlmKHJlc291cmNlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOwotCQkJU3RyaW5nIHBhdGggPSBGaWxlTWFuYWdlci50b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJaWYocGF0aCAhPSBudWxsKSB7Ci0JCQkJcGF0aHMuYWRkKHBhdGgpOwotCQkJfQotCQl9Ci0JCWlmKCFwYXRocy5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ1tdIGFyciA9IG5ldyBTdHJpbmdbcGF0aHMuc2l6ZSgpXTsKLQkJCXBhdGhzLnRvQXJyYXkoYXJyKTsKLQkJCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNoZWNrTW9kaWZ5KGFyciwgY29udGV4dCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CQotCQkKLS8vCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwKLS8vCQkJCUlTdGF0dXMuT0ssIFBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vZGlmeUZpbGVzRXJyb3JfbXNnLAotLy8JCQkJbnVsbCk7Ci0vLwotLy8JCUhhc2hNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgU2V0PFJlc291cmNlPj4gcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcCA9IG5ldyBIYXNoTWFwPElMaWJyYXJ5UmVzb3VyY2VTZXQsIFNldDxSZXNvdXJjZT4+KCk7Ci0vLwkJU2V0PFJlc291cmNlPiByZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID0gbnVsbDsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotLy8JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLS8vCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLS8vCQkJCVNldCBzZXQgPSByZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwLmdldChyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLS8vCQkJCWlmKHNldCA9PSBudWxsKSB7Ci0vLwkJCQkJc2V0ID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0vLwkJCQkJcmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5wdXQoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCksIHNldCk7Ci0vLwkJCQl9Ci0vLwkJCQlzZXQuYWRkKHJlc291cmNlKTsJCQkJCi0vLwkJCX0KLS8vCQkJZWxzZSB7Ci0vLwkJCQlpZihyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID09IG51bGwpIHsKLS8vCQkJCQlyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0ID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0vLwkJCQl9Ci0vLwkJCQlyZXNvdXJjZXNXaXRob3V0TGlicmFyeVJlc291cmNlU2V0LmFkZChyZXNvdXJjZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJaWYoIXJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuaXNFbXB0eSgpKSB7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0vLwkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCU1hcC5FbnRyeTxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PiBlbnRyeSA9IChFbnRyeTxJTGlicmFyeVJlc291cmNlU2V0LCBTZXQ8UmVzb3VyY2U+PikgaXRlci5uZXh0KCk7Ci0vLwkJCQlSZXNvdXJjZVtdIGFyciA9IG5ldyBSZXNvdXJjZVtlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKV07Ci0vLwkJCQllbnRyeS5nZXRWYWx1ZSgpLnRvQXJyYXkoYXJyKTsKLS8vCQkJCWVudHJ5LmdldEtleSgpLmNoZWNrTW9kaWZ5KGFyciwgY29udGV4dCk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL2ludGVybmFsL0lGYWlsU2FmZVNhdmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3MWNhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvaW50ZXJuYWwvSUZhaWxTYWZlU2F2YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGEgcmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgdG8gc3VwcG9ydCBmYWlsLXNhZmUgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZhaWxTYWZlU2F2YWJsZSB7Ci0Jdm9pZCBjb21taXQoKTsKLQkKLQlib29sZWFuIHJlc3RvcmUoKTsKLQkKLQl2b2lkIHNldFR4SUQoU3RyaW5nIHR4SUQpOwotCQotCWJvb2xlYW4gaGFzVGVtcFVSSSgpOwotCQotCXZvaWQgdHhGaW5pc2hlZChib29sZWFuIHN1Y2Nlc3NmdWwpOwotCQotCXZvaWQgZGVsZXRlQmFja3VwKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvSVN5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3N5bmNoL0lTeW5jaHJvbml6YXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ2YWYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvSVN5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guaW50ZXJuYWwuU3luY2hyb25pemF0aW9uSGVscGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3luY2hyb25pemF0aW9uSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTeW5jaHJvbml6YXRpb25IZWxwZXIgSU5TVEFOQ0UgPSBuZXcgU3luY2hyb25pemF0aW9uSGVscGVyKCk7Ci0JCi0JbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcChSZXNvdXJjZSByZXNvdXJjZSk7Ci0JCi0JYm9vbGVhbiBpc1N5bmNocm9uaXplZChSZXNvdXJjZSByZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvaW50ZXJuYWwvU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2Uvc3luY2gvaW50ZXJuYWwvU3luY2hyb25pemF0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzYwNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3N5bmNoL2ludGVybmFsL1N5bmNocm9uaXphdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UudXRpbC5Xb3Jrc3BhY2VTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guSVN5bmNocm9uaXphdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLklGaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXphdGlvbkhlbHBlciBpbXBsZW1lbnRzIElTeW5jaHJvbml6YXRpb25IZWxwZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uuc3luY2guSVN5bmNocm9uaXphdGlvbkhlbHBlciNnZXRNb2RpZmljYXRpb25TdGFtcChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCUlGaWxlSW5mbyBpbmZvID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRGaWxlSW5mbyhyZXNvdXJjZSk7Ci0JCQlyZXR1cm4gaW5mbyAhPSBudWxsID8gaW5mby5nZXRNb2RpZmljYXRpb25TdGFtcCgpIDogSVJlc291cmNlLk5VTExfU1RBTVA7Ci0JCX0KLQkJcmV0dXJuIElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnN5bmNoLklTeW5jaHJvbml6YXRpb25IZWxwZXIjaXNTeW5jaHJvbml6ZWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmlzU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKHJlc291cmNlKTsKLQkJaWYoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcGVyc2lzdGVuY2UvdXRpbC9FeHRlbmRlZFJlc291cmNlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMTk0YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlVubm9ybWFsaXplZFVSSUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBMaXN0PFJlc291cmNlU2V0PiByZWZlcmVuY2VkUmVzb3VyY2VTZXRzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZVNldD4oKTsKLQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gYWRkKFJlc291cmNlU2V0IHJlZmVyZW5jZWRSZXNvdXJjZVNldCkgewotCQlpZighcmVmZXJlbmNlZFJlc291cmNlU2V0cy5jb250YWlucyhyZWZlcmVuY2VkUmVzb3VyY2VTZXQpKSB7Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZFJlc291cmNlU2V0cy5hZGQocmVmZXJlbmNlZFJlc291cmNlU2V0KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJCWlmKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9iamVjdDsKLQkJCX0KLQkJfQotCQlpZih1cmlUeXBlID09IFVSSV9UWVBFX1VOS05PV04gfHwgdXJpVHlwZSA9PSBVUklfVFlQRV9FWFRFUk5BTCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVmZXJlbmNlZFJlc291cmNlU2V0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChSZXNvdXJjZVNldCkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJb2JqZWN0ID0gcmVzb3VyY2VTZXQuZ2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQkJCWlmKG9iamVjdCAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gb2JqZWN0OwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXggPSBlOwotCQkJCX0KLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXRyeXsKLQkJCQlyZXNvdXJjZS51bmxvYWQoKTsJCQkKLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCQlyZWZlcmVuY2VkUmVzb3VyY2VTZXRzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRmlsZVN5bmNocm9uaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BlcnNpc3RlbmNlL3V0aWwvRmlsZVN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTI1ZjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wZXJzaXN0ZW5jZS91dGlsL0ZpbGVTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU3luY2hyb25pemVzIHRoZSBkb2N1bWVudCB3aXRoIGV4dGVybmFsIHJlc291cmNlIGNoYW5nZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRmlsZVN5bmNocm9uaXplciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEJ1bmRsZSBvZiBhbGwgcmVxdWlyZWQgaW5mb3JtYXRpb24gdG8gYWxsb3cgZmlsZXMgYXMgdW5kZXJseWluZyBkb2N1bWVudCByZXNvdXJjZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyAvL2V4dGVuZHMgU3RvcmFnZUluZm8gCi0JewotCQkvKiogVGhlIHRpbWUgc3RhbXAgYXQgd2hpY2ggdGhpcyBwcm92aWRlciBjaGFuZ2VkIHRoZSBmaWxlLiAqLwotCQlwdWJsaWMgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCQlwdWJsaWMgYm9vbGVhbiBmQ2FuQmVTYXZlZDsKLQkJcHVibGljIElGaWxlIGZGaWxlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGZpbGUgaW5mby4KLQkJICoKLQkJICogQHBhcmFtIGRvY3VtZW50IHRoZSBkb2N1bWVudAotCQkgKiBAcGFyYW0gbW9kZWwgdGhlIGFubm90YXRpb24gbW9kZWwKLQkJICogQHBhcmFtIGZpbGVTeW5jaHJvbml6ZXIgdGhlIGZpbGUgc3luY2hyb25pemVyCi0JCSAqLwotCQlwdWJsaWMgRmlsZUluZm8oSUZpbGUgZmlsZSkgewotCQkJZkZpbGUgPSBmaWxlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHN5bmNocm9uaXplciBpcyBpbnN0YWxsZWQgb3Igbm90LgotCSAqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkKLQkvKiogRWxlbWVudCBpbmZvcm1hdGlvbiBvZiBhbGwgY29ubmVjdGVkIGVsZW1lbnRzICovCi0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBGaWxlSW5mbz4gZkZpbGVJbmZvTWFwPSBuZXcgSGFzaE1hcDxPYmplY3QsIEZpbGVJbmZvPigpOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGZpbGUgc3luY2hyb25pemVyLiBJcyBub3QgeWV0IGluc3RhbGxlZCBvbiBhIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBGaWxlU3luY2hyb25pemVyKCkgewotCQlpbnN0YWxsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZJc0luc3RhbGxlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdXBkYXRlTW9kaWZpY2F0aW9uU3RhbXAoSUZpbGUgZmlsZSkgewotCQlGaWxlSW5mbyBpbmZvID0gZ2V0RmlsZUluZm8oZmlsZSk7Ci0JCWlmKGluZm8gIT0gbnVsbCkgewotCQkJaW5mby5mTW9kaWZpY2F0aW9uU3RhbXAgPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBpbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGVsZW1lbnQgaW5mbyBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgRmlsZUluZm8gZ2V0RmlsZUluZm8oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChGaWxlSW5mbykgZkZpbGVJbmZvTWFwLmdldChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxscyB0aGUgc3luY2hyb25pemVyIG9uIHRoZSBpbnB1dCdzIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbCgpIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQlmSXNJbnN0YWxsZWQ9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVW5pbnN0YWxscyB0aGUgc3luY2hyb25pemVyIGZyb20gdGhlIGlucHV0J3MgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGUpIHsKLQkJSVJlc291cmNlRGVsdGEgZGVsdGE9IGUuZ2V0RGVsdGEoKTsKLQkJdHJ5IHsKLQkJCWlmIChkZWx0YSAhPSBudWxsICYmIGZJc0luc3RhbGxlZCkgewotCQkJCVJlc291cmNlRGVsdGFWaXNpc3RvciB2aXNpdG9yID0gbmV3IFJlc291cmNlRGVsdGFWaXNpc3RvcigpOwotCQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IHZpc2l0b3IuZ2V0UnVubmFibGUoKTsKLQkJCQlpZihydW5uYWJsZSAhPSBudWxsKSB7Ci0JCQkJCXVwZGF0ZShydW5uYWJsZSk7Ci0JCQkJfQotCQkJfSAKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQloYW5kbGVDb3JlRXhjZXB0aW9uKHgsICJFcnJvciBoYW5kbGluZyByZXNvdXJjZSBjaGFuZ2UgZXZlbnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERlZmluZXMgdGhlIHN0YW5kYXJkIHByb2NlZHVyZSB0byBoYW5kbGUgPGNvZGU+Q29yZUV4Y2VwdGlvbnM8L2NvZGU+LiBFeGNlcHRpb25zCi0JICogYXJlIHdyaXR0ZW4gdG8gdGhlIHBsdWctaW4gbG9nLgotCSAqCi0JICogQHBhcmFtIGV4Y2VwdGlvbiB0aGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNvcmVFeGNlcHRpb24oQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0KLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSk7Ci0JCUlMb2cgbG9nPSBQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKTsKLQotCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJbG9nLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQkJZWxzZQotCQkJbG9nLmxvZyhleGNlcHRpb24uZ2V0U3RhdHVzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaW5pdGlhbCBtb2RpZmljYXRpb24gc3RhbXAgZm9yIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSByZXNvdXJjZSB0aGUgcmVzb3VyY2UKLQkgKiBAcmV0dXJuIHRoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkZBVEFMIEVSUk9SOiByZXNvdXJjZSBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gMDsKLQkJfQotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wPSByZXNvdXJjZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCi0JCUlQYXRoIHBhdGg9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXA7Ci0KLQkJbW9kaWZpY2F0aW9uU3RhbXA9IHBhdGgudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZURlbHRhVmlzaXN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGNoYW5nZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCXByaXZhdGUgTWFwPElGaWxlLCBJUGF0aD4gbW92ZWRGaWxlVG9OZXdQYXRoTWFwID0gbmV3IEhhc2hNYXA8SUZpbGUsIElQYXRoPigpOwotCQlwcml2YXRlIENvbGxlY3Rpb248SUZpbGU+IGRlbGV0ZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxJRmlsZT4gYWRkZWRGaWxlcyA9IG5ldyBBcnJheUxpc3Q8SUZpbGU+KCk7Ci0KLQkJLyoKLQkJICogQHNlZSBJUmVzb3VyY2VEZWx0YVZpc2l0b3IjdmlzaXQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGEpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKChkZWx0YS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTUFSS0VSUykgIT0gSVJlc291cmNlRGVsdGEuTUFSS0VSUwotCQkJCQkmJiBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEOgotCQkJCQlGaWxlSW5mbyBpbmZvID0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmZDYW5CZVNhdmVkKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQgPSBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoZmlsZSkgPT0gaW5mby5mTW9kaWZpY2F0aW9uU3RhbXA7Ci0JCQkJCWlmICgoKElSZXNvdXJjZURlbHRhLkVOQ09ESU5HICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCAmJiBpc1N5bmNocm9uaXplZCkKLQkJCQkJCQl8fCAoKElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwICYmICFpc1N5bmNocm9uaXplZCkpIHsKLQkJCQkJCWNoYW5nZWRGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQ6Ci0JCQkJCWlmICgoSVJlc291cmNlRGVsdGEuTU9WRURfVE8gJiBkZWx0YS5nZXRGbGFncygpKSAhPSAwKSB7Ci0JCQkJCQlpbmZvID0gKEZpbGVJbmZvKSBnZXRGaWxlSW5mbyhkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlmaW5hbCBJUGF0aCBwYXRoID0gZGVsdGEuZ2V0TW92ZWRUb1BhdGgoKTsKLQkJCQkJCW1vdmVkRmlsZVRvTmV3UGF0aE1hcC5wdXQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpLAotCQkJCQkJCQlwYXRoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWluZm8gPSAoRmlsZUluZm8pIGdldEZpbGVJbmZvKGRlbHRhLmdldFJlc291cmNlKCkpOwotCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiAhaW5mby5mQ2FuQmVTYXZlZCkgewotCQkJCQkJCWRlbGV0ZWRGaWxlcy5hZGQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCQlmaWxlID0gKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCQlpZihhY2NlcHQoZmlsZSkpIHsKLQkJCQkJCWFkZGVkRmlsZXMuYWRkKGZpbGUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIFJ1bm5hYmxlIGdldFJ1bm5hYmxlKCkgewotCQkJLy8gY29uc2lkZXIgdGhlIGZpbGUgaXMgbmV3bHkgYWRkZWQgaWYgaXQgaXMgYWNjZXB0ZWQgYW5kIG5vdCBhIG1vdmVkIGZpbGUKLQkJCS8vCi0JCQlpZiAoIWFkZGVkRmlsZXMuaXNFbXB0eSgpICYmICFtb3ZlZEZpbGVUb05ld1BhdGhNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvcjxJRmlsZT4gaXRlciA9IGFkZGVkRmlsZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSUZpbGUgZmlsZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZiAobW92ZWRGaWxlVG9OZXdQYXRoTWFwLmNvbnRhaW5zVmFsdWUoZmlsZSkpIHsKLQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihjaGFuZ2VkRmlsZXMuaXNFbXB0eSgpICYmIG1vdmVkRmlsZVRvTmV3UGF0aE1hcC5pc0VtcHR5KCkgJiYgZGVsZXRlZEZpbGVzLmlzRW1wdHkoKSAmJiBhZGRlZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQloYW5kbGVDaGFuZ2VkKFJlc291cmNlRGVsdGFWaXNpc3Rvci50aGlzKTsKLQkJCQl9Ci0JCQkJCi0JCQl9OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUG9zdHMgdGhlIHVwZGF0ZSBjb2RlICJiZWhpbmQiIHRoZSBydW5uaW5nIG9wZXJhdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSB0aGUgdXBkYXRlIGNvZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoUnVubmFibGUgcnVubmFibGUpIHsKLQkJcnVubmFibGUucnVuKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vbml0b3IoSUZpbGUgZmlsZSkgewotCQlGaWxlSW5mbyBpbmZvPSAoRmlsZUluZm8pIGZGaWxlSW5mb01hcC5nZXQoZmlsZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsKLQkJCWluZm8gPSBuZXcgRmlsZUluZm8oZmlsZSk7Ci0JCQlpbmZvLmZNb2RpZmljYXRpb25TdGFtcCA9IGNvbXB1dGVNb2RpZmljYXRpb25TdGFtcChmaWxlKTsKLQkJCWZGaWxlSW5mb01hcC5wdXQoZmlsZSwgaW5mbyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5tb25pdG9yKElGaWxlIGZpbGUpIHsKLQkJZkZpbGVJbmZvTWFwLnJlbW92ZShmaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW5tb25pdG9yQWxsKCkgewotCQlmRmlsZUluZm9NYXAuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZChSZXNvdXJjZURlbHRhVmlzaXN0b3IgdmlzaXRvcikgewotCQlpZighdmlzaXRvci5jaGFuZ2VkRmlsZXMuaXNFbXB0eSgpKSB7Ci0JCQloYW5kbGVDaGFuZ2VkRmlsZXModmlzaXRvci5jaGFuZ2VkRmlsZXMpOwotCQl9Ci0JCWlmKCF2aXNpdG9yLm1vdmVkRmlsZVRvTmV3UGF0aE1hcC5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZU1vdmVkRmlsZXModmlzaXRvci5tb3ZlZEZpbGVUb05ld1BhdGhNYXApOwotCQl9Ci0JCWlmKCF2aXNpdG9yLmRlbGV0ZWRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZURlbGV0ZWRGaWxlcyh2aXNpdG9yLmRlbGV0ZWRGaWxlcyk7Ci0JCX0KLQkJaWYoIXZpc2l0b3IuYWRkZWRGaWxlcy5pc0VtcHR5KCkpIHsKLQkJCWhhbmRsZUFkZGVkRmlsZXModmlzaXRvci5hZGRlZEZpbGVzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVEZWxldGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gZGVsZXRlZEZpbGVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJRmlsZT4gaGFuZGxlTW92ZWRGaWxlcyhNYXA8SUZpbGUsIElQYXRoPiBtb3ZlZEZpbGVUb05ld1BhdGhNYXApIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPElGaWxlPiBoYW5kbGVDaGFuZ2VkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gY2hhbmdlZEZpbGVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUZpbGU+IGhhbmRsZUFkZGVkRmlsZXMoQ29sbGVjdGlvbjxJRmlsZT4gYWRkZWRGaWxlcykgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0RlbGVnYXRlRmlsZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FiYmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRGVsZWdhdGVGaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCAxMCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGVnYXRlRmlsZU1hbmFnZXIgaW1wbGVtZW50cyBJRmlsZU1hbmFnZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZyBwYXRoLCBPYmplY3QgY29udGV4dCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRoLCBjb250ZXh0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI2NoZWNrTW9kaWZ5KGphdmEubGFuZy5TdHJpbmdbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjZGVsZXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGVsZXRlKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShwYXRoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVNYW5hZ2VyI21vdmUoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtb3ZlKFN0cmluZyBvbGRQYXRoLCBTdHJpbmcgbmV3UGF0aCkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5tb3ZlKG9sZFBhdGgsIG5ld1BhdGgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZU1hbmFnZXIjcmVuYW1lKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0V4dGVuZGVkUmVzb3VyY2VTZXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc2MWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRXh0ZW5kZWRSZXNvdXJjZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiBBIGV4dGVuZGVkIHJlc291cmNlIHNldCB3aG9zZSBvYmplY3RzIGNhbiByZWZlcmVuY2VzIG9iamVjdHMgb2Ygb3RoZXIgcmVzb3VyY2Ugc2V0Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gQXVnIDksIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlU2V0IGV4dGVuZHMgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9VTktOT1dOID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUklfVFlQRV9MT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVJJX1RZUEVfRVhURVJOQUwgPSAyOwotCQotCXByb3RlY3RlZCBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVmZXJlbmNlZFJlc291cmNlU2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB7QGxpbmsgRXh0ZW5kZWRSZXNvdXJjZVNldH0gdGhhdCBjYW4gaGF2ZSByZWZlcmVuY2UgdG8gb2JqZWN0cyBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2Ugc2V0IAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZFJlc291cmNlU2V0KE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZWZlcmVuY2VkUmVzb3VyY2VTZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZWZlcmVuY2VkUmVzb3VyY2VTZXQgPSByZWZlcmVuY2VkUmVzb3VyY2VTZXQ7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBvbmUgb2YgVVJJIHR5cGUgY29uc3RhbnRzOiB7QGxpbmsgI1VSSV9UWVBFX0VYVEVSTkFMfSwge0BsaW5rICNVUklfVFlQRV9MT0NBTH0sIHtAbGluayAjVVJJX1RZUEVfVU5LTk9XTn0KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFVSSVR5cGUoVVJJIHVyaSkgewotCQlyZXR1cm4gVVJJX1RZUEVfVU5LTk9XTjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRFT2JqZWN0KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJRU9iamVjdCBvYmplY3QgPSBudWxsOwotCQlVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZXggPSBudWxsOwotCQlpbnQgdXJpVHlwZSA9IGdldFVSSVR5cGUodXJpKTsKLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfTE9DQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gc3VwZXIuZ2V0RU9iamVjdChyZXNvbHZlciwgdXJpLCBsb2FkT25EZW1hbmQpOwotCQkJfSBjYXRjaCAoVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGUpIHsKLQkJCQlleCA9IGU7Ci0JCQl9Ci0JCQlpZihvYmplY3QgIT0gbnVsbCkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJaWYodXJpVHlwZSA9PSBVUklfVFlQRV9VTktOT1dOIHx8IHVyaVR5cGUgPT0gVVJJX1RZUEVfRVhURVJOQUwpIHsKLQkJCXRyeSB7Ci0JCQkJb2JqZWN0ID0gcmVmZXJlbmNlZFJlc291cmNlU2V0LmdldEVPYmplY3QocmVzb2x2ZXIsIHVyaSwKLQkJCQkJCWxvYWRPbkRlbWFuZCk7Ci0JCQl9IGNhdGNoIChVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24gZSkgewotCQkJCWV4ID0gZTsKLQkJCX0KLQkJfSAKLQkJCi0JCWlmKGV4ICE9IG51bGwpIHsKLQkJCXRocm93IGV4OwotCQl9Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GYWlsU2FmZVBlcnNpc3RlbmNlSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlMjVjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICoKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIgewotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCXByaXZhdGUgVVJJIG9sZFVSSTsKLQlwcml2YXRlIFN0cmluZyBjdXJyZW50VHhJRDsKLQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCXByaXZhdGUgVVJJIHRlbXBVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQlwcml2YXRlIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JCi0JcHVibGljIEZhaWxTYWZlUGVyc2lzdGVuY2VIZWxwZXIoUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBpZCkgewotCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7IAotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuY29udmVydGVyID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSAhPSBudWxsID8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldENvbW1pdEVtcHR5UmVzb3VyY2UoYm9vbGVhbiBjb21taXRFbXB0eVJlc291cmNlKSB7Ci0JCXRoaXMuY29tbWl0RW1wdHlSZXNvdXJjZSA9IGNvbW1pdEVtcHR5UmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcG9yYXJ5IFVSSSB0byBzYXZlIHRoaXMgcmVzb3VyY2UgdG8gYW5kIGl0IHdpbGwgYmUgcmVuYW1lZCB0bwotCSAqIHRoZSBvcmlnaW5hbCBVUkkgd2hlbiBzYXZpbmcgaXMgZG9uZQotCSAqLwotCXB1YmxpYyBVUkkgc2V0VGVtcFVSSShTdHJpbmcgdHhJRCkgewotCQlpZiAoZmluYWxVUkkgPT0gbnVsbCkgewotCQkJZmluYWxVUkkgPSBvbGRVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCWN1cnJlbnRUeElEID0gdHhJRDsKLQotCQkJdGVtcFVSSSA9IGNyZWF0ZVRlbXBVUkkoKTsKLQkJCXJlc291cmNlLnNldFVSSSh0ZW1wVVJJKTsKLQkJfQotCQlyZXR1cm4gdGVtcFVSSTsKLQl9Ci0JCi0JcHJpdmF0ZSBVUkkgY3JlYXRlVGVtcFVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgibmV3IikuYXBwZW5kKGlkKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJhY2t1cEZpbGVQYXRoKCkgewotCQlTdHJpbmcgYmFja3VwRmlsZSA9IG5ldyBTdHJpbmdCdWZmZXIoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmdldFRlbXBEaXIoKSkKLQkJCQkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgib2xkIikuYXBwZW5kKGlkKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBiYWNrdXBGaWxlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSkgewotCQlyZXR1cm4gRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHVyaSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCAmJiAoY29tbWl0RW1wdHlSZXNvdXJjZSB8fCAhcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpKSB7Ci0JCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhmaW5hbFVSSSkpOwotCQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gYmFjayB1cCB0aGUgZmlsZQotCQkJCS8vCi0JCQkJU3RyaW5nIGJhY2t1cCA9IGdldEJhY2t1cEZpbGVQYXRoKCk7Ci0JCQkJRmlsZSBiYWtGaWxlID0gbmV3IEZpbGUoYmFja3VwKTsKLQotCQkJCS8vIHRyeWluZyB0byBkZWxldGUgdGhlIG9sZCBiYWNrdXAgZmlsZSBpZiBpdCBleGlzdHMKLQkJCQkvLwotCQkJCWlmIChiYWtGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWJha0ZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGZpbmFsRmlsZS5leGlzdHMoKSkgewotCQkJCQkvLyBzb21lIENNIHByb3ZpZGVyIGxpa2UgQ2xlYXJDYXNlIHJlbmFtZWQgdGhlIHZlcnNpb25lZAotCQkJCQkvLyBmaWxlIGl0IGl0cyByZXBvc2l0b3J5IGFzIHNvb24gYXMgdXNlciByZW5hbWVkIHRoZSBmaWxlCi0JCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJCS8vIHJvdXRpbmUgb2YgamF2YS5pby5GaWxlIGluc3RlYWQgb2YgSVJlc291cmNlIHJvdXRpbmUKLQkJCQkJLy8KLQkJCQkJaWYgKEZpbGVVdGlsLm1vdmVGaWxlKGZpbmFsRmlsZSwgYmFrRmlsZSkpIHsKLQkJCQkJCWJhY2t1cEZpbGUgPSBiYWNrdXA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCQkJZmluYWxGaWxlLCBiYWNrdXApOwotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlbmFtZSB0aGUgcmVzb3VyY2UgZmlsZSB0byB0aGUgb3JpZ2luYWwgbmFtZQotCQkJLy8KLQkJCUZpbGUgY3VycmVudEZpbGUgPSBuZXcgRmlsZSh3YXNNb3ZlID8gdG9GaWxlU3RyaW5nKG9sZFVSSSkKLQkJCQkJOiB0b0ZpbGVTdHJpbmcocmVzb3VyY2UuZ2V0VVJJKCkpKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZShyZXNvdXJjZSwgY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkIGZpbGUgaXQKLQkJCQkvLyBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCS8vCi0JCQkJc3VjY2VzcyA9IEZpbGVVdGlsLm1vdmVGaWxlKGN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJfQotCQkJaWYgKCFzdWNjZXNzKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlbmFtZUVycm9yX21zZywKLQkJCQkJCWN1cnJlbnRGaWxlLCBmaW5hbEZpbGUpOwotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FzTW92ZSkgewotCQkJCQlkaWRNb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgdG8gb3ZlcnJpZGUgdG8gaGFuZGxlIHBvc3QgbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpZE1vdmUoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlQmFja3VwKCkgewotCQlpZiAoYmFja3VwRmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuZGVsZXRlKGJhY2t1cEZpbGUpOwotCQkJCW5ldyBGaWxlKGJhY2t1cEZpbGUpLmRlbGV0ZSgpOwotCQkJCWJhY2t1cEZpbGUgPSBudWxsOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNUZW1wVVJJKCkgewotCQlpZiAoY3VycmVudFR4SUQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNyZWF0ZVRlbXBVUkkoKS5lcXVhbHMocmVzb3VyY2UuZ2V0VVJJKCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEZpbmFsVVJJKCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbmFsVVJJOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZS5nZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlGaWxlIHNyYyA9IG51bGwsIGRlc3QgPSBudWxsOwotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXNyYyA9IG5ldyBGaWxlKGJhY2t1cEZpbGUpOwotCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb3ZlZCA9IG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJCWlmIChtb3ZlZCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSk7Ci0JCQkJZGVzdCA9IG5ldyBGaWxlKHRvRmlsZVN0cmluZyhvbGRVUkkpKTsKLQkJCQltb3ZlZCA9IGZpbGUuZXhpc3RzKCkgJiYgIWRlc3QuZXhpc3RzKCk7Ci0JCQkJaWYgKG1vdmVkKSB7Ci0JCQkJCXNyYyA9IGZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShkZXN0LG5ldyBGaWxlKHRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSkpKTsKLQkJCX0KLQkJCWJvb2xlYW4gc3VjY2VzczsKLQkJCWlmIChtb3ZlZCkgewotCQkJCXN1Y2Nlc3MgPSBNdWx0aUZpbGVTYXZlVXRpbC5tb3ZlKHJlc291cmNlLCBzcmMsIGRlc3QpOwotCQkJCS8vIGlmKHN1Y2Nlc3MpIHsKLQkJCQkvLyBNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBudWxsKTsKLQkJCQkvLyB9Ci0JCQl9IGVsc2UgewotCQkJCXN1Y2Nlc3MgPSBGaWxlVXRpbC5tb3ZlRmlsZShzcmMsZGVzdCk7Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZXN0b3JlUmVzb3VyY2VFcnJvcl9tc2csIHRoaXMpKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0eEZpbmlzaGVkKGJvb2xlYW4gc3VjY2Vzc2Z1bCkgewotLy8JCWJvb2xlYW4gd2FzTW92ZSA9ICFvbGRVUkkuZXF1YWxzKGZpbmFsVVJJKTsKLQkJaWYgKHN1Y2Nlc3NmdWwpIHsKLQkJCXJlc291cmNlLnNldFVSSShmaW5hbFVSSSk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0vLwkJCXVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0vLwkJCWlmKCF3YXNNb3ZlKSB7Ci0vLwkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotLy8JCQkJaWYocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotLy8JCQkJCXJlc291cmNlU2V0LmdldFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIoKS52YWxpZGF0ZU1hcmtlcnModGhpcyk7Ci0vLwkJCQl9Ci0vLwkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3RvcmVVUkkoKTsKLS8vCQkJaWYgKHdhc01vdmUpIHsKLS8vCQkJCS8vIHJlc3RvcmUgdXJpIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzIHJlc291cmNlCi0vLwkJCQkvLwotLy8JCQkJTXVsdGlGaWxlU2F2ZVV0aWwudXBkYXRlVVJJTWFwcGluZ3ModGhpcywgb2xkVVJJLCBudWxsLCB0cnVlKTsKLS8vCQkJfQotCQl9Ci0vLwkJaWYgKG9sZFVSSSAhPSBudWxsKSB7Ci0vLwkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGdldFJlc291cmNlU2V0KCk7Ci0vLwkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0vLwkJCQlyZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLS8vCQkJfQotLy8JCQlvbGRVUkkgPSBudWxsOwotLy8JCX0KLQkJY3VycmVudFR4SUQgPSBudWxsOwotCQlmaW5hbFVSSSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlc291cmNlIFVSSSB0byB0aGUgb3JpZ2luYWwgb25lLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGwKLQkgKiBhZnRlciBzYXZpbmcgcmVnYXJsZXNzIG9mIGl0cyBzdWNjZXNzLgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlVVJJKCkgewotCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCXJlc291cmNlLnNldFVSSShvbGRVUkkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzRiN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9GaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnJlc291cmNlcy5SZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLnV0aWxzLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IHN1bi5zZWN1cml0eS5hY3Rpb24uR2V0UHJvcGVydHlBY3Rpb247Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIElGaWxlTWFuYWdlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVNYW5hZ2VyIGltcGxlbWVudHMgSUZpbGVNYW5hZ2VyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEZpbGVNYW5hZ2VyLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIEZpbGVNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0bXBkaXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZW1wRGlyKCkgewotCQlpZiAodG1wZGlyID09IG51bGwpIHsKLQkJCUdldFByb3BlcnR5QWN0aW9uIGEgPSBuZXcgR2V0UHJvcGVydHlBY3Rpb24oImphdmEuaW8udG1wZGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRtcGRpciA9ICgoU3RyaW5nKSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChhKSk7Ci0JCX0KLQkJcmV0dXJuIHRtcGRpcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVFZGl0SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKEZpbGVNYW5hZ2VyLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgRmlsZU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGVNYW5hZ2VyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlIGdldFJlc291cmNlRm9yTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJSVJlc291cmNlIHJlc291cmNlOwotCQlpZiAoZmlsZS5pc0ZpbGUoKSkgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGVGb3JMb2NhdGlvbihwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwYXJlbnRSZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVmcmVzaChJUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKCFyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJQXJyYXlMaXN0IGZvbGRlcnNUb1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQkJCWZvciAoY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7ICFjb250YWluZXIuZXhpc3RzKCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCQkuZ2V0UGFyZW50KCkpIHsKLQkJCQlmb2xkZXJzVG9SZWZyZXNoLmFkZCgwLCBjb250YWluZXIpOwotCQkJfQotCQkJaWYgKGNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJCWNvbnRhaW5lci5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQl9Ci0JCQlpZiAoIWZvbGRlcnNUb1JlZnJlc2guaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZm9sZGVyc1RvUmVmcmVzaC5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGZvbGRlci5leGlzdHMoKSkgewotCQkJCQkJZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXNvdXJjZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlZnJlc2hlcyBmaWxlIG9yIGRpcmVjdG9yeSB3aXRoIGdpdmVuIGxvY2FsIGZpbGUgc3lzdGVtCi0JICogPGNvZGU+cGF0aDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgbG9jYWwgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHJlZnJlc2goU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiByZWZyZXNoKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmcmVzaChSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHJlZnJlc2godG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotLy8JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbW92ZShTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpIHsKLQkJcmV0dXJuIG1vdmUob2xkUGF0aCwgbmV3UGF0aCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1vdmUoU3RyaW5nIG9sZFBhdGgsIFN0cmluZyBuZXdQYXRoLAotCQkJYm9vbGVhbiBmb3JjZVJlbW92ZVNvdXJjZSkgewotCQl0cnkgewotCQkJcmVmcmVzaChvbGRQYXRoKTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCUlXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkKLQkJCQkJLmdldFJvb3QoKTsKLQotCQkJLy8gY3JlYXRlIHRoZSBmb2xkZXJzIG9mIHRoZSBkZXN0aW5hdGlvbiBpZiB0aGV5IGRpZCBub3QgZXhpc3QKLQkJCUlQYXRoIGRlc3RQYXRoID0gbmV3IFBhdGgobmV3UGF0aCk7Ci0JCQlpZiAobmV3IEZpbGUob2xkUGF0aCkuaXNGaWxlKCkpIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRDb250YWluZXJGb3JMb2NhdGlvbihkZXN0UGF0aCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsJCQkJCi0JCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKGRlc3RQYXRoKTsKLQkJCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24oZGVzdFBhdGgpOwotCQkJCX0KLQkJCX0JCi0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCXJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCWlmKHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVFcnJvcl9tc2csIG9sZFBhdGgsIG5ld1BhdGgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlBcnJheUxpc3QgZm9sZGVyc1RvQ3JlYXRlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCUlDb250YWluZXIgY29udGFpbmVyOwotCQkJCWZvciAoY29udGFpbmVyID0gcmVzb3VyY2UuZ2V0UGFyZW50KCk7ICFjb250YWluZXIuZXhpc3RzKCk7IGNvbnRhaW5lciA9IGNvbnRhaW5lcgotCQkJCS5nZXRQYXJlbnQoKSkgewotCQkJCQlmb2xkZXJzVG9DcmVhdGUuYWRkKDAsIGNvbnRhaW5lcik7Ci0JCQkJfQotCQkJCWlmICghZm9sZGVyc1RvQ3JlYXRlLmlzRW1wdHkoKSkgewotCQkJCQljb250YWluZXIucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9PTkUsIG51bGwpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmb2xkZXJzVG9DcmVhdGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZm9sZGVyLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlkZXN0UGF0aCA9IHJlc291cmNlLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCQllbHNlIGlmKFBsYXRmb3JtLmdldExvY2F0aW9uKCkuaXNQcmVmaXhPZihkZXN0UGF0aCkpIHsKLQkJCQlkZXN0UGF0aCA9IG5ldyBQYXRoKGRlc3RQYXRoLnRvT1NTdHJpbmcoKS5zdWJzdHJpbmcoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkubGVuZ3RoKCkpKTsJCQkJCQkKLQkJCX0KLQkJCQotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG9sZFBhdGgpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Q29udGFpbmVyRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQl9Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLm1vdmUoZGVzdFBhdGgsIHRydWUsIG51bGwpOwotCQkJCX0gY2F0Y2ggKFJlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQkJCi0JCQkJCWlmIChmb3JjZVJlbW92ZVNvdXJjZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCi0JCQkJCWJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0KLQkJCQkJLy8gaGFuZGxlIHNpdHVhdGlvbiB3aGVuIEVjbGlwc2UgbW92ZXMgZmlsZS9kaXJlY3RvcnkgYnkKLQkJCQkJLy8gY29weWluZyBpdCB0byBkZXN0aW5hdGlvbiB0aGVuIGRlbGV0aW5nIHRoZSBzb3VyY2UKLQkJCQkJLy8gYnV0IGRlbGV0aW9uIGZhaWxlZAotCQkJCQlJU3RhdHVzW10gc3RhdHVzZXMgPSBlLmdldFN0YXR1cygpLmdldENoaWxkcmVuKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RhdHVzZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gc3RhdHVzZXNbaV07Ci0JCQkJCQlpZiAoc3RhdHVzLmdldENvZGUoKSA9PSBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX0RFTEVURV9MT0NBTAotCQkJCQkJCQkmJiBzdGF0dXMuZ2V0TWVzc2FnZSgpID09IE1lc3NhZ2VzLmxvY2Fsc3RvcmVfZGVsZXRlUHJvYmxlbSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJCQkuZm9ybWF0KAotCQkJCQkJCQkJCQkiV2FybmluZyB3aGlsZSBtb3ZpbmcgJyd7MH0nJyB0byAnJ3sxfScnOiB7Mn0iLCBuZXcgT2JqZWN0W10geyBvbGRQYXRoLCBuZXdQYXRoLCBzdGF0dXMuZ2V0TWVzc2FnZSgpIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ1dhcm5pbmcobXNnKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZmFpbGVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoZmFpbGVkIHx8ICFuZXcgRmlsZShuZXdQYXRoKS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlyZXR1cm4gbW92ZShvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVSZXNvdXJjZShTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBubyBuZWVkIHRvIHJlZnJlc2ggdGhlIHdob2xlIHRyZWUgZnJvbSBzcGVjaWZpZWQgcGF0aAotCQkvLyBnZXRSZXNvdXJjZUZvckxvY2F0aW9uKCkgcmVmcmVzaGVzIHJlc291cmNlIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5Ci0JCS8vCi0JCS8vIElXb3Jrc3BhY2VSb290IHdvcmtzcGFjZVJvb3QgPQotCQkvLyBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyB0cnkgewotCQkvLyB3b3Jrc3BhY2VSb290LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkvLyB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCS8vIGUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLyB9Ci0KLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCXJlc291cmNlLmRlbGV0ZSh0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlbGV0ZShTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJZGVsZXRlUmVzb3VyY2UocGF0aCwgbnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmcm9tQ0MoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIHBsdWdpbklkID0gc3RhdHVzLmdldFBsdWdpbigpOwotCQlyZXR1cm4gcGx1Z2luSWQgIT0gbnVsbAotCQkJCSYmIHBsdWdpbklkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiY2xlYXJjYXNlIikgIT0gLTE7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmdbXSBwYXRocywgT2JqZWN0IGNvbnRleHQpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSUZpbGVbXSBmaWxlcyA9IG5ldyBJRmlsZVtwYXRocy5sZW5ndGhdOwotCQlBcnJheUxpc3Q8U3RyaW5nPiBub3RGb3VuZEZpbGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQl0cnkgewotCQkJCXJlZnJlc2gocGF0aCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJCW5vdEZvdW5kRmlsZXMuYWRkKHBhdGgpOwotCQkJfSBlbHNlIHsKLQkJCQlmaWxlc1tpXSA9IGZpbGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFub3RGb3VuZEZpbGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIElTdGF0dXMuV0FSTklORywgTkxTCi0JCQkJCS5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpbGVOb3RGb3VuZEVycm9yX21zZywKLQkJCQkJCQlub3RGb3VuZEZpbGVzKSwgbnVsbCk7Ci0JCX0KLQotCQlpZiAoIXZhbGlkYXRlRWRpdEluaXRpYWxpemVkKSB7Ci0JCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCXZhbGlkYXRlRWRpdEluaXRpYWxpemVkID0gdHJ1ZTsKLQkJCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQkJLy8gZG91YmxlLWNoZWNrIGFmdGVyIGluaXRpYWxpemF0aW9uCi0JCQkJLy8KLQkJCQlzdGF0dXMgPSB3b3Jrc3BhY2UudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHdvcmtzcGFjZS52YWxpZGF0ZUVkaXQoZmlsZXMsIGNvbnRleHQpOwotCQl9Ci0KLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwKLQkJCQkJSVN0YXR1cy5PSywgUGVyc2lzdGVuY2VSZXNvdXJjZXMubW9kaWZ5RmlsZXNFcnJvcl9tc2csCi0JCQkJCW51bGwpOwotCi0JCQkvLyBzb21lIHZlcnNpb24gY29udHJvbCBwcm92aWRlciBzdGlsbCByZXR1cm5zIE9LIHN0YXR1cyBldmVuIHRob3VnaAotCQkJLy8gdXNlciBjYW5jZWxsZWQgdGhlIGNoZWNrIG91dAotCQkJLy8gZG91YmxlLWNoZWNrIGhlcmUgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIG5vdCByZWFkLW9ubHkKLQkJCS8vCQkJCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJCXRyeSB7Ci0JCQkJCWZpbGUucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9aRVJPLCBudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQkJaWYgKGZpbGUuaXNSZWFkT25seSgpKSB7Ci0JCQkJCVN0cmluZyBsb2NhbFBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuRmlsZU1hbmFnZXJfZmlsZVJlYWRPbmx5LAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IGxvY2FsUGF0aCB9KTsKLQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBSZXNvdXJjZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBmaWxlCi0JCQkJCQkJLmdldEZ1bGxQYXRoKCksIG1zZywgbnVsbCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmKCFtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBoYWNrIGZvciBjbGVhcmNhc2UKLQkJCWlmIChmcm9tQ0Moc3RhdHVzKSkgewotCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlc0Vycm9yX21zZzsKLQkJCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhQTFVHSU5fSUQsIHN0YXR1cwotCQkJCQkJLmdldENvZGUoKSwgbXNnLCBudWxsKTsKLQkJCQltdWx0aVN0YXR1cy5hZGQoc3RhdHVzKTsKLQkJCQlyZXR1cm4gbXVsdGlTdGF0dXM7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjb252ZXJ0IHdvcmtzcGFjZSBwYXRoIHRvIGxvY2FsIGZpbGUgc3lzdGVtIHBhdGgKLQkJaWYgKHN0YXR1cyBpbnN0YW5jZW9mIE11bHRpU3RhdHVzKSB7Ci0JCQlNdWx0aVN0YXR1cyBtcyA9IChNdWx0aVN0YXR1cykgc3RhdHVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtcy5nZXRDaGlsZHJlbigpLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVN0YXR1cyBjaGlsZFN0YXR1cyA9IG1zLmdldENoaWxkcmVuKClbaV07Ci0JCQkJbXMuZ2V0Q2hpbGRyZW4oKVtpXSA9IHRvU3RhdHVzV2l0aExvY2FsUGF0aChjaGlsZFN0YXR1cyk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdGF0dXMgPSB0b1N0YXR1c1dpdGhMb2NhbFBhdGgoc3RhdHVzKTsKLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgdG9TdGF0dXNXaXRoTG9jYWxQYXRoKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMgaW5zdGFuY2VvZiBJUmVzb3VyY2VTdGF0dXMKLQkJCQkmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElSZXNvdXJjZVN0YXR1cy5SRUFEX09OTFlfTE9DQUwpIHsKLQkJCUlSZXNvdXJjZVN0YXR1cyByZXNvdXJjZVN0YXR1cyA9ICgoSVJlc291cmNlU3RhdHVzKSBzdGF0dXMpOwotCQkJSVBhdGggcGF0aCA9IHJlc291cmNlU3RhdHVzLmdldFBhdGgoKTsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpCi0JCQkJCS5nZXRGaWxlKHBhdGgpOwotCQkJU3RyaW5nIGxvY2FsUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQlTdHJpbmcgbXNnID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLkZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seSwKLQkJCQkJbmV3IE9iamVjdFtdIHsgbG9jYWxQYXRoIH0pOyAKLQkJCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0dXMoc3RhdHVzCi0JCQkJCS5nZXRTZXZlcml0eSgpLCBzdGF0dXMuZ2V0Q29kZSgpLAotCQkJCQlyZXNvdXJjZVN0YXR1cy5nZXRQYXRoKCksIG1zZywgc3RhdHVzCi0JCQkJCQkJLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlTWFuYWdlciNjaGVja01vZGlmeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBjaGVja01vZGlmeShTdHJpbmcgcGF0aCwgT2JqZWN0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNoZWNrTW9kaWZ5KG5ldyBTdHJpbmdbXSB7IHBhdGggfSwgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBwYXRoIGlzIHRlYW0tcHJpdmF0ZSBmaWxlIG9yIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVGVhbVByaXZhdGUoU3RyaW5nIHBhdGgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihwYXRoKTsKLQkJcmV0dXJuIHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuaXNUZWFtUHJpdmF0ZU1lbWJlcigpOwotCX0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIHRoZSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBVUkksIHVzaW5nIGEgVVJJIGNvbnZlcnRlcgotICAgICAqIGlmIG5lY2Vzc2FyeSAoYW5kIHByb3ZpZGVkKSB0byBub3JtYWxpemUgaXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSBhIFVSSQotICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgYW4gb3B0aW9uYWwgVVJJIGNvbnZlcnRlciAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGZpbGUsIGlmIGF2YWlsYWJsZSBpbiB0aGUgd29ya3NwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKFVSSSB1cmksIFVSSUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLSAgICAgICAgSUZpbGUgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgCi0gICAgICAgIGlmICgicGxhdGZvcm0iLmVxdWFscyh1cmkuc2NoZW1lKCkpICYmICh1cmkuc2VnbWVudENvdW50KCkgPiAyKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAoInJlc291cmNlIi5lcXVhbHModXJpLnNlZ21lbnQoMCkpKSB7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBJUGF0aCBwYXRoID0gbmV3IFBhdGgoVVJJLmRlY29kZSh1cmkucGF0aCgpKSkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodXJpLmlzRmlsZSgpICYmICF1cmkuaXNSZWxhdGl2ZSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLSAgICAgICAgICAgICAgICBuZXcgUGF0aCh1cmkudG9GaWxlU3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgdG8gc2VlIHdoZXRoZXIgbWF5IHdlIGNhbiByZXNvbHZlIGl0IHRoaXMgdGltZQotICAgICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgVVJJIG5vcm1hbGl6ZWQgPSBjb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKCF1cmkuZXF1YWxzKG5vcm1hbGl6ZWQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2Ugb24gdGhlIG5ldyBVUkkKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0RmlsZShub3JtYWxpemVkLCBjb252ZXJ0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0ZpbGVTdHJpbmcoVVJJIHVyaSwgVVJJQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlpZih1cmkuaXNGaWxlKCkpIHsKLQkJCXJldHVybiB1cmkudG9GaWxlU3RyaW5nKCk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUodXJpLCBjb252ZXJ0ZXIpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSA6IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhVUkkgdXJpKSB7Ci0JCXJldHVybiB0b0ZpbGVTdHJpbmcodXJpLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyBpbXBsZW1lbnRzIElGaWxlSW5mbyB7Ci0JCQotCQlwcml2YXRlIElGaWxlIGZpbGU7Ci0KLQkJcHJpdmF0ZSBGaWxlSW5mbyhJRmlsZSBmaWxlKSB7Ci0JCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl9Ci0KLQkJcHVibGljIGxvbmcgZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCQlyZXR1cm4gZmlsZS5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQkJSVBhdGggbG9jID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCQkJcmV0dXJuIGxvYyAhPSBudWxsID8gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpIDogbnVsbDsKLQkJfQotCQkKLQl9Ci0JCi0JcHVibGljIElGaWxlSW5mbyBnZXRGaWxlSW5mbyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJRmlsZSBmaWxlID0gV29ya3NwYWNlU3luY2hyb25pemVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlyZXR1cm4gZmlsZSAhPSBudWxsID8gbmV3IEZpbGVJbmZvKGZpbGUpIDogbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0ZpbGVQYXRoUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRlZmRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvRmlsZVBhdGhQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogRmlsZS1iYXNlZCBVUkkgcHJvdmlkZXIKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVQYXRoUHJvdmlkZXIgaW1wbGVtZW50cyBJVVJJUHJvdmlkZXIgewotCXByb3RlY3RlZCBGaWxlUGF0aFByb3ZpZGVyKCkgewotCQkKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuSVVSSVByb3ZpZGVyI2dldFVSSShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFVSSShFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuY3JlYXRlRmlsZVVSSSgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lGaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkwNjEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSUZpbGVJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5lIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlSW5mbyB7Ci0JRmlsZSBnZXRGaWxlKCk7Ci0JCi0JbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpOwotCQotCWJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL0lVUklQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmVjZjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvSVVSSVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIEludGVyZmFjZSB0byBwcm92aWRlIFVSSSBmb3IgYW4gRU9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBBdWcgOCwgMjAwNgotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVVJJUHJvdmlkZXIgewotCQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBmb3IgdGhlIGdpdmVuIG9iamVjdCBpZiB0aGlzIG9iamVjdCBoYXMgb3Igc2hvdWxkIGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiB0aGUgVVJJIG9yIG51bGwgaWYgdGhlIGdpdmVuIG9iamVjdCBkb2VzL3dpbGwgbm90IGhhdmUgYSBkaXJlY3QgcmVzb3VyY2UKLQkgKi8KLQlVUkkgZ2V0VVJJKEVPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTg4ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NZXRob2RMaWJyYXJ5UGVyc2lzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5JRmFpbFNhZmVTYXZhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEZpbGUtYmFzZWQgaW1wbGVtZW50YXRpb24gZm9yIElNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9sZGVySW5mbyB7Ci0KLQkJRUNsYXNzIGVDbGF6ejsKLQotCQlib29sZWFuIHNoYXJlZDsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gY2xhenoKLQkJICogQHBhcmFtIHNoYXJlZAotCQkgKi8KLQkJcHVibGljIEZvbGRlckluZm8oRUNsYXNzIGNsYXp6LCBib29sZWFuIHNoYXJlZCkgewotCQkJc3VwZXIoKTsKLQkJCWVDbGF6eiA9IGNsYXp6OwotCQkJdGhpcy5zaGFyZWQgPSBzaGFyZWQ7Ci0JCQl0aGlzLm5hbWUgPSBsb3dlckFuZFBsdXJhbGl6ZShjbGF6ei5nZXROYW1lKCkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgSU5TVEFOQ0UgPSBuZXcgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpOwotCi0JLy8gbmVlZCB0byBleHBvc2UgdGhpcywganhpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSID0gInJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3QgZm9sZGVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlzdGF0aWMgewotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKSwKLQkJCQlmYWxzZSkpOwotCQlmb2xkZXJJbmZvcy5hZGQobmV3IEZvbGRlckluZm8oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQl0cnVlKSk7Ci0JCWZvbGRlckluZm9zCi0JCQkJLmFkZChuZXcgRm9sZGVySW5mbyhVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLCB0cnVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Qgd2FybmluZ3M7Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeVBlcnNpc3RlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IHBhdGggKHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4pIG9mIHRoZSBmaWxlIG9mIHRoZQotCSAqIGdpdmVuIGNvbnRlbnQgZGVzY3JpcHRpb24gb3IgbnVsbCBpZiB0aGUgZ2l2ZW4gY29udGVudCBkb2VzIG5vdCBiZSBsb25nCi0JICogdG8gYW55IHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb3JyZWN0UGF0aChDb250ZW50RGVzY3JpcHRpb24gY29udGVudCkgewotCQlyZXR1cm4gZ2V0Q29ycmVjdFBhdGgoKERlc2NyaWJhYmxlRWxlbWVudCkgY29udGVudC5lQ29udGFpbmVyKCksCi0JCQkJY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvcnJlY3RQYXRoKERlc2NyaWJhYmxlRWxlbWVudCBlLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBwbHVnaW4uZVJlc291cmNlKCk7Ci0JCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShyZXNvdXJjZSk7Ci0JCUZpbGUgcGx1Z2luRGlyID0gbmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gc3RhdGljR2V0Rm9sZGVyUGF0aChlLmVDbGFzcygpKTsKLQkJU3RyaW5nIGRpciA9IG5ldyBTdHJpbmdCdWZmZXIocGx1Z2luRGlyLmdldEFic29sdXRlUGF0aCgpKS5hcHBlbmQoCi0JCQkJRmlsZS5zZXBhcmF0b3IpLmFwcGVuZChmb2xkZXJQYXRoKS5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpCi0JCQkJLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUsIGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgbmV4dCBhdmFpbGFibGUgZmlsZSBuYW1lIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIE11bHRpUmVzb3VyY2VFT2JqZWN0fSBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IDxjb2RlPmRpcjwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgcGF0aCB0aGF0IG11c3QgaGF2ZSBhIGZpbGUgc2VwYXJhdG9yIGF0IHRoZSBlbmQKLQkgKiBAcGFyYW0gcmVxdWVzdGVkTmFtZQotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLCBTdHJpbmcgcmVxdWVzdGVkTmFtZSwKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IGUpIHsKLQkJU3RyaW5nIGN1cnJlbnRGaWxlbmFtZSA9IG51bGw7Ci0JCUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlCi0JCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8ga2VlcCBleGlzdGluZyBmaWxlIG5hbWUgZHVyaW5nIG1vdmUgaWYgaXQgaXMgbm90IHRha2VuIHlldC4gRG9uJ3QKLQkJCS8vIHRyeSB0byBtYXRjaCB0aGUgZWxlbWVudCdzIG5hbWUKLQkJCS8vCi0JCQlTdHJpbmcgcGF0aCA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBlLmVSZXNvdXJjZSgpKQotCQkJCQkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCWN1cnJlbnRGaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQljdXJyZW50RmlsZW5hbWUgPSBjdXJyZW50RmlsZS5nZXROYW1lKCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIGN1cnJlbnRGaWxlbmFtZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkvLyB0aGUgZWxlbWVudCBpcyBiZWluZyBtb3ZlZAotCQkJCS8vCi0JCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBlbGVtZW50IHdpdGhvdXQgYSByZXNvdXJjZSBvciBwYXRoIGlzIGFscmVhZHkgdGFrZW4KLQkJLy8KLQkJU3RyaW5nIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0ZJTEVfRVhURU5TSU9OKS50b1N0cmluZygpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYoZmlsZS5lcXVhbHMoY3VycmVudEZpbGUpKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCQlpZiAoKGN1cnJlbnRGaWxlbmFtZSAhPSBudWxsICYmIGN1cnJlbnRGaWxlbmFtZS5lcXVhbHMocmVxdWVzdGVkTmFtZSkpCi0JCQkJfHwgZmlsZS5leGlzdHMoKSkgewotCQkJZm9yIChpbnQgaSA9IDI7IHRydWU7IGkrKykgewotCQkJCXBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKGRpcikuYXBwZW5kKHJlcXVlc3RlZE5hbWUpLmFwcGVuZCgnICcpCi0JCQkJCQkuYXBwZW5kKGkpLmFwcGVuZCgKLQkJCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTikKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmICghbmV3IEZpbGUocGF0aCkuZXhpc3RzKCkpIHsKLQkJCQkJcmV0dXJuIHBhdGg7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShTdHJpbmcgZGlyLAotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIChEZXNjcmliYWJsZUVsZW1lbnQpIGNvbnRlbnQKLQkJCQkuZUNvbnRhaW5lcigpLCBjb250ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKFN0cmluZyBkaXIsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSwgQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQpIHsKLQkJcmV0dXJuIGdldE5leHRBdmFpbGFibGVGaWxlTmFtZShkaXIsIGUuZ2V0TmFtZSgpLAotCQkJCShNdWx0aVJlc291cmNlRU9iamVjdCkgY29udGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN0YXRpY0dldEZvbGRlclBhdGgoRUNsYXNzIGVDbGF6eikgewotCQlpbnQgc2l6ZSA9IGZvbGRlckluZm9zLnNpemUoKTsKLQkJRm9sZGVySW5mbyBpbmZvID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUZvbGRlckluZm8gZm9sZGVySW5mbyA9IChGb2xkZXJJbmZvKSBmb2xkZXJJbmZvcy5nZXQoaSk7Ci0JCQlpZiAoZm9sZGVySW5mby5lQ2xhenouaXNTdXBlclR5cGVPZihlQ2xhenopKSB7Ci0JCQkJaW5mbyA9IGZvbGRlckluZm87Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJaWYgKGluZm8uZUNsYXp6ID09IGVDbGF6eiB8fCBpbmZvLnNoYXJlZCkgewotCQkJCXJldHVybiBpbmZvLm5hbWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBuZXcgU3RyaW5nQnVmZmVyKGluZm8ubmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikKLQkJCQkJCS5hcHBlbmQobG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbG93ZXJBbmRQbHVyYWxpemUoZUNsYXp6LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb3dlckFuZFBsdXJhbGl6ZShTdHJpbmcgbmFtZSkgewotCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQlpZiAobmFtZS5lbmRzV2l0aCgiY2hpbGRyZW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJjaGlsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lICsgInJlbiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJkYXRhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiZGF0dW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImEiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgiYnkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoInkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpICsgImllcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMikgKyAiaWNlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJ4IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWUgKyAiZXMiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgidXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpICsgImkiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobmFtZS5lbmRzV2l0aCgic3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmFtZSArICJlcyI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbmFtZSArICJzIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybgotCSAqIEBzZWUgI2dldEVsZW1lbnRWaXJ0dWFsUGF0aChNZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VSZXNvdXJjZVZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEVsZW1lbnRWaXJ0dWFsUGF0aChlKTsKLQkJaWYgKGZvbGRlclBhdGggPT0gbnVsbCB8fCBmb2xkZXJQYXRoLmxlbmd0aCgpID09IDApCi0JCXsKLQkJCXJldHVybiBSRVNPVVJDRV9GT0xERVI7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmb2xkZXJQYXRoKTsKLQkJCWlmICggIWZvbGRlclBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpICkgewotCQkJCWJ1ZmZlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQkJfSAKLQkJCQotCQkJYnVmZmVyLmFwcGVuZChSRVNPVVJDRV9GT0xERVIpOwkJCQkKLQkJCQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmlydHVhbCBwYXRoIHRvIHRoZSBmb2xkZXIgb2YgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LiBUaGlzIHBhdGggd2lsbCBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCSAqIDxwbHVnaW5fbmFtZT5cZm9sZGVyX3JlbGF0aXZlX3BhdGhcCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFZpcnR1YWxQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKCEoZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gfHwgZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQkJLy8gZXJyb3I6IHBsdWdpbiBlbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBwbHVnaW4gc2V0LiBUaGlzCi0JCQkJLy8gcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4KLQkJCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUsCi0JCQkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gbGljayBvbiBhIGNhcGFiaWxpdHkgcGF0dGVybiBpbgotCQkJCS8vIENvbmZpZ3VyYXRpb24gRXhwbG9yZXIKLQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkucHJpbnRsbigiZXJyb3IgaW4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aCgpOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luLiBUaGlzIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlTdHJpbmcgZm9sZGVyUGF0aCA9IGdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpOwotCQlyZXR1cm4gKGZvbGRlclBhdGgubGVuZ3RoKCkgPT0gMCA/IHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciA6IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJcGx1Z2luTmFtZSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcikuYXBwZW5kKGZvbGRlclBhdGgpCi0JCQkJLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QgZGlyZWN0b3J5IHRvIHRoZQotCSAqIGZvbGRlciBvZiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICovCQotCXByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlRWxlbWVudFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZyBmb2xkZXJQYXRoID0gZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKGUpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCkgewotCQkJaWYgKChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbiB8fCBlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCQlyZXR1cm4gZm9sZGVyUGF0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVycm9yOiBwbHVnaW4gZWxlbWVudCB3aXRob3V0IGEgdmFsaWQgcGx1Z2luIHNldC4gVGhpcwotCQkJCS8vIHByb2JsZW0gbmVlZHMgdG8gYmUgZml4ZWQuCi0JCQkJLy8gc3RpbGwgc2VlIGl0IGZyb20gdGltZSB0byB0aW1lLAotCQkJCS8vIGZvciBleGFtcGxlLCB3aGVuIGxpY2sgb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaW4KLQkJCQkvLyBDb25maWd1cmF0aW9uIEV4cGxvcmVyCi0JCQkJU3lzdGVtLmVycgotCQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIGVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIHBsdWdpbi4gVGhpcyBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlpZiAocGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBlcnJvcjogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZQotCQkJLy8gZml4ZWQuCi0JCQkvLyBzdGlsbCBzZWUgaXQgZnJvbSB0aW1lIHRvIHRpbWUKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oImVycm9yIGluIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0RWxlbWVudFBhdGgoKTogcGx1Z2luIHdpdGhvdXQgbGlicmFyeSBzZXQuIFRoaXMgcHJvYmxlbSBuZWVkcyB0byBiZSBmaXhlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgcmVsUGx1Z2luUGF0aDsKLQkJaWYgKHBsdWdpbi5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSBsaWJSZXMgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkocGx1Z2luKS5lUmVzb3VyY2UoKTsKLQkJCWlmIChsaWJSZXMgPT0gcGx1Z2luLmVSZXNvdXJjZSgpKSB7Ci0JCQkJLy8gdGhlIHBsdWdpbiBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHBsdWdpbi5nZXROYW1lKCk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShwbHVnaW4uZVJlc291cmNlKCkpOwotCQkJCVVSSSBsaWJVcmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShsaWJSZXMpOwotCQkJCVVSSSByZWxVcmkgPSB1cmkuZGVyZXNvbHZlKGxpYlVyaSk7Ci0JCQkJcmVsUGx1Z2luUGF0aCA9IHJlbFVyaS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgbGlicmFyeSBpcyBub3Qgc2F2ZWQgeWV0Ci0JCQlyZWxQbHVnaW5QYXRoID0gcGx1Z2luLmdldE5hbWUoKTsKLQkJfQotCi0JCXJldHVybiAoZm9sZGVyUGF0aC5sZW5ndGgoKSA9PSAwID8gcmVsUGx1Z2luUGF0aCArIEZpbGUuc2VwYXJhdG9yOiBuZXcgU3RyaW5nQnVmZmVyKAotCQkJCXJlbFBsdWdpblBhdGgpLmFwcGVuZChGaWxlLnNlcGFyYXRvckNoYXIpLmFwcGVuZChmb2xkZXJQYXRoKQotCQkJCS5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCUVDbGFzcyBlQ2xzID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVDbHMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIHNhdmUgYWxsIHRoZSByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBjaGFuZ2VkIGFzIHRoZSByZXN1bHQgb2YgdGhpcyBhZGp1c3RtZW50Ci0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkvLyBzYXZlIHRoZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCXJlc291cmNlU2V0LnNhdmUoKFJlc291cmNlKSBpdGVyLm5leHQoKSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlRmlsZXMoTWV0aG9kRWxlbWVudCBlLCBTdHJpbmcgcGF0aCwKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCWlmIChuZXcgRmlsZShwYXRoKS5pc0RpcmVjdG9yeSgpICYmICFlLmVJc1Byb3h5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChtZSAhPSBudWxsICYmIFVtYVV0aWwuaXNDb250YWluZWRCeShtZSwgZSkpIHsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZVJlc291cmNlKHBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlKE1ldGhvZEVsZW1lbnQgZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCWlmICghVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQkvLyBEb24ndCBkZWxldGUgdGhpcyByZXNvdXJjZSdzIGZpbGUgaWYgaXQgc3RpbGwgY29udGFpbnMgb3RoZXIKLQkJLy8gTWV0aG9kRWxlbWVudAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBlbGVtZW50ICE9IGUpIHsKLQkJCQlyZXNvdXJjZVNldC5yZW1vdmVVUklNYXBwaW5ncyhlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZSk7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgcGF0aDsKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLmhhc093bkZvbGRlcihlKSkgewotCQkJLy8gcGF0aCBpcyB0aGUgZGlyZWN0b3J5IG9mIHRoZSBNZXRob2RQbHVnaW4vUHJvY2Vzc0NvbXBvbmVudAotCQkJLy8KLQkJCXBhdGggPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQotCQkJLy8gdW5sb2FkL3JlbW92ZSBhbGwgcmVzb3VyY2VzIHVuZGVyIHRoZSBmb2xkZXIKLQkJCS8vCi0JCQlDb2xsZWN0aW9uIHVubG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZG8gewotCQkJCXVubG9hZGVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQkJLy8gY29sbGVjdCBhbGwgcmVzb3VyY2VzIHdob3NlIHJvb3QgZWxlbWVudCBpcyBjb250YWluZWQgYnkgdGhlCi0JCQkJLy8gZ2l2ZW4gZWxlbWVudAotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlcy5pc0xvYWRlZCgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJCQlpZiAobWUgIT0gbnVsbCAmJiBVbWFVdGlsLmlzQ29udGFpbmVkQnkobWUsIGUpKSB7Ci0JCQkJCQkJdW5sb2FkZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdW5sb2FkZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJcmVzLnVubG9hZCgpOwotCQkJCX0KLQkJCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5yZW1vdmVBbGwodW5sb2FkZWRSZXNvdXJjZXMpOwotCQkJfSB3aGlsZSAoIXVubG9hZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXRoID0gcmVzb3VyY2UuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXNvdXJjZVNldC5jbGVhblVwKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlMSk7Ci0JCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0T2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMoRU9iamVjdCBlLAotCQkJQ29sbGVjdGlvbiBvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcykgewotCQlpZiAoVW1hVXRpbC5oYXNEaXJlY3RSZXNvdXJjZShlKSkgewotCQkJb2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMuYWRkKGUpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcygoRU9iamVjdCkgaXRlci5uZXh0KCksCi0JCQkJCQlvYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJLy8gY29sbGVjdCBhbGwgZWxlbWVudHMgd2l0aCBkaXJlY3QgcmVzb3VyY2VzIHRoYXQgYXJlIHRoZSBnaXZlbiBlbGVtZW50Ci0JCS8vIG9yIGl0cyBvZmZzdHJpbmcKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRPYmplY3RzV2l0aERpcmVjdFJlc291cmNlcyhlLCBlbGVtZW50cyk7Ci0JCWRlbGV0ZUFuZFNhdmUoZWxlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVBbmRTYXZlKEFycmF5TGlzdCBlbGVtZW50cykgewotCQlpZiAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWRlbGV0ZSgoTWV0aG9kRWxlbWVudCkgaXRlci5uZXh0KCksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2RpZmllZFJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSBmb2xkZXIgdGhhdCBjYW4gc3RvcmUgdGhlIGNvbnRlbnQgb2YgdGhlCi0JICogZ2l2ZW4gTWV0aG9kRWxlbWVudC4gVGhlIHBhdGggaXMgcmVsYXRpdmUgdG8gaXRzIHBsdWdpbiBmb2xkZXIgb3IgbGlicmFyeQotCSAqIGZvbGRlciBpZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgc3RvcmVkIGluIGEgcGx1Z2luLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJQYXRoKGUuZUNsYXNzKCkpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUU7Ci0JCX0KLQotCQlNZXRob2RVbml0IHVuaXQgPSBVbWFVdGlsLmdldE1ldGhvZFVuaXQoZSk7Ci0KLQkJaWYgKHVuaXQgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIHVuaXQpLmdldFByb2Nlc3MoKTsKLQkJCWlmIChwcm9jIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuQ0FQQUJJTElUWV9QQVRURVJOX1BBVEg7Ci0JCQl9IGVsc2UgaWYgKHByb2MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfQotCQl9IGVsc2UgaWYgKHVuaXQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiBzdGF0aWNHZXRGb2xkZXJSZWxhdGl2ZVBhdGgoKE1ldGhvZEVsZW1lbnQpIHVuaXQKLQkJCQkJLmVDb250YWluZXIoKSk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbGRlclJlbGF0aXZlUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIHN0YXRpY0dldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCWlmICh3YXJuaW5ncyA9PSBudWxsKSB7Ci0JCQl3YXJuaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gd2FybmluZ3M7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZhaWxTYWZlUGVyc2lzdGVyIGV4dGVuZHMgTWV0aG9kTGlicmFyeVBlcnNpc3RlciBpbXBsZW1lbnRzCi0JCQlGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgewotCi0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zOwotCi0JCXByaXZhdGUgVHhSZWNvcmQgdHhSZWNvcmQgPSBuZXcgVHhSZWNvcmQoKSB7Ci0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICogCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5UeFJlY29yZCNjbGVhcigpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkJCWlmICh3YXJuaW5ncyAhPSBudWxsICYmICF3YXJuaW5ncy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gY29weSB0aGUgd2FybmluZyB0byBwZXJzaXN0ZXIKLQkJCQkJLy8KLQkJCQkJRmFpbFNhZmVQZXJzaXN0ZXIudGhpcy53YXJuaW5ncyA9IENvbGxlY3Rpb25zCi0JCQkJCQkJLnVubW9kaWZpYWJsZUxpc3Qod2FybmluZ3MpOwotCQkJCX0KLQkJCQlzdXBlci5jbGVhcigpOwotCQkJfQotCQl9OwotCi0JCXByaXZhdGUgTWFwIGVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzOwotCi0JCXB1YmxpYyBGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJCXNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoCi0JCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCQl0eFJlY29yZCA9IG5ldyBUeFJlY29yZCgpOwotCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwgdHhSZWNvcmQpOwotCQkJZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJCWlmICh0eFJlY29yZC5nZXRUeElEKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBzdXBlci5nZXRXYXJuaW5ncygpOwotCQkJfQotCQkJcmV0dXJuIHR4UmVjb3JkLmdldFdhcm5pbmdzKCk7Ci0JCX0KLQotCQlwdWJsaWMgTWFwIGdldFNhdmVPcHRpb25zKCkgewotCQkJcmV0dXJuIHNhdmVPcHRpb25zOwotCQl9Ci0KLQkJdm9pZCBjaGVja01vdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCS8vIGRpc2FsbG93IG5ldyBvcGVyYXRpb24gb24gcmVzb3VyY2Ugd2hpY2ggaGFzIHN0YXJ0ZWQgb3BlcmF0aW9uCi0JCQkvLyB0aGF0IGlzIG5vdCBjb21taXR0ZWQKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCBtZlJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2U7Ci0JCQlpZiAobWZSZXNvdXJjZS50eFN0YXJ0ZWQoKSkgewotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1vdmVSZXNvdXJjZUVycm9yX21zZywgcmVzb3VyY2UpKTsKLQkJCX0JCQkKLQkJfQkJCQkKLQkJCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQkJaWYocmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCAmJgotCQkJCQlyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJaWYgKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIHVwZGF0ZSB2ZXJzaW9uIGluZm8gaW4gbGlicmFyeSByZXNvdXJjZSBpZiBuZWVkZWQKLQkJCQkvLwotCQkJCVJlc291cmNlIGxpYlJlc291cmNlVG9TYXZlID0gbnVsbDsKLQkJCQlNZXRob2RFbGVtZW50IG1lID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJCWlmKG1lICE9IG51bGwpIHsKLQkJCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkobWUpOwotCQkJCQlpZihsaWIgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2UgbGliUmVzb3VyY2UgPSBsaWIuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihsaWJSZXNvdXJjZSAhPSBudWxsIAotCQkJCQkJCQkmJiBsaWJSZXNvdXJjZSAhPSByZXNvdXJjZQotCQkJCQkJCQkmJiBQZXJzaXN0ZW5jZVV0aWwuY2hlY2tUb29sVmVyc2lvbihsaWJSZXNvdXJjZSkgIT0gMCkgewotCQkJCQkJCWxpYlJlc291cmNlVG9TYXZlID0gbGliUmVzb3VyY2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChzYXZlT3B0aW9ucykpIHsKLQkJCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzOwotCQkJCQlpZihsaWJSZXNvdXJjZVRvU2F2ZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQkJCQkJcmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCQlyZXNvdXJjZXMuYWRkKGxpYlJlc291cmNlVG9TYXZlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc291cmNlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlcyk7Ci0JCQkJCQotCQkJCQkvLyBjaGVjayBvdXQtb2Ytc3luYwotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0JCQkJCQotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja0ZpbGVQYXRoTGVuZ3RoKHJlc291cmNlcyk7Ci0JCQkJfQotCi0JCQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgc2F2ZU9wdGlvbnMpOwotCQkJCWlmKGxpYlJlc291cmNlVG9TYXZlICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VTZXQuc2F2ZShsaWJSZXNvdXJjZVRvU2F2ZSwgc2F2ZU9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmFpbFNhZmVTYXZhYmxlKSB7Ci0JCQkJSUZhaWxTYWZlU2F2YWJsZSBmYWlsU2FmZVNhdmFibGUgPSAoSUZhaWxTYWZlU2F2YWJsZSkgcmVzb3VyY2U7Ci0JCQkJZmFpbFNhZmVTYXZhYmxlLnNldFR4SUQodHhSZWNvcmQuZ2V0VHhJRCgpKTsKLQkJCQlyZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKLQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbigiUmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJCWNoZWNrTW92ZShyZXNvdXJjZSk7Ci0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLnByZXBhcmVBZGp1c3RMb2NhdGlvbigKLQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCXR4UmVjb3JkLmdldFJlc291cmNlc1RvQ29tbWl0KCkuYWRkKHJlc291cmNlKTsKLQkJCQkKLQkJCQlIYXNoU2V0IHJlc291cmNlc1RvQ2hlY2sgPSBuZXcgSGFzaFNldChtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJcmVzb3VyY2VzVG9DaGVjay5hZGRBbGwocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkocmVzb3VyY2VzVG9DaGVjayk7Ci0JCQkJCi0JCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsJCQotCQkJCQkKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tPdXRPZlN5bmNoKG1vZGlmaWVkUmVzb3VyY2VzLCBzYXZlT3B0aW9ucyk7Ci0KLQkJCQkJLy8gc2F2ZSB0aGUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljb21taXQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCQlpZiAocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWNoZWNrTW92ZSgoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJCUhhc2hTZXQgcmVzb3VyY2VzVG9DaGVjayA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwucHJlcGFyZUFkanVzdExvY2F0aW9uKAotCQkJCQkJKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsIG1vZGlmaWVkUmVzb3VyY2VzKSkgewotCQkJCQl0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXJlc291cmNlc1RvQ2hlY2suYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJlc291cmNlc1RvQ2hlY2suYWRkQWxsKG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCWlmKCFyZXNvdXJjZXNUb0NoZWNrLmlzRW1wdHkoKSkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmNoZWNrTW9kaWZ5KHJlc291cmNlc1RvQ2hlY2spOwotCQkJfQkJCQotCQkJaWYgKCFtb2RpZmllZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gobW9kaWZpZWRSZXNvdXJjZXMsIHNhdmVPcHRpb25zKTsKLQotCQkJCS8vIHNhdmUgdGhlIG1vZGlmaWVkIHJlc291cmNlcwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKChSZXNvdXJjZSkgaXRlci5uZXh0KCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY29tbWl0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnBlcnNpc3RlbmNlLk1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlRmlsZXMob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50LAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCkKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCS8vIGtlZXAgdGhlIGluZm8gdG8gcmVhbGx5IGRlbGV0ZSB0aGUgZmlsZXMgaW4gY29tbWl0KCkKLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLnB1dChlLCBuZXcgT2JqZWN0W10geyBwYXRoLAotCQkJCQlyZXNvdXJjZVNldCB9KTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzdXBlckRlbGV0ZUZpbGVzKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIHBhdGgsCi0JCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJCXN1cGVyLmRlbGV0ZUZpbGVzKGUsIHBhdGgsIHJlc291cmNlU2V0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjY29tbWl0KCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQkJCS8vIHNhdmUgaXMgZG9uZQotCQkJLy8gY2FsbCBzYXZlSXNEb25lKCkgb24gZXZlcnkgc2F2ZWQgZmlsZSB0byByZW5hbWUgaXQgdG8gdGhlIGNvcnJlY3QKLQkJCS8vIG5hbWUKLQkJCWludCBzaXplID0gdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuY29tbWl0KCk7Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGRvbmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJKChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpCi0JCQkJCQkuZ2V0KGkpKS50eEZpbmlzaGVkKHRydWUpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgYmFja3VwCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQuZ2V0UmVzb3VyY2VzVG9Db21taXQoKQotCQkJCQkJLmdldChpKSkuZGVsZXRlQmFja3VwKCk7Ci0JCQl9Ci0KLQkJCXR4UmVjb3JkLmNsZWFyKCk7Ci0KLQkJCS8vIGRlbGV0ZSBmaWxlcyBvZiBkZWxldGVkIGVsZW1lbnRzCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudFRvSW5mb01hcFRvRGVsZXRlRmlsZXMuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJT2JqZWN0W10gaW5mbyA9IChPYmplY3RbXSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGluZm9bMF07Ci0JCQkJdHJ5IHsKLQkJCQkJc3VwZXJEZWxldGVGaWxlcygoTWV0aG9kRWxlbWVudCkgZW50cnkuZ2V0S2V5KCksIHBhdGgsCi0JCQkJCQkJKFJlc291cmNlU2V0KSBpbmZvWzFdKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQkJCWUgPSAoKFdyYXBwZWRFeGNlcHRpb24pIGUpLmV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBtc2cgPSBQZXJzaXN0ZW5jZVJlc291cmNlcy5FcnJNc2dfQ291bGROb3REZWxldGU7Ci0JCQkJCVN0cmluZyBvdGhlck1zZyA9IG51bGw7Ci0JCQkJCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJCQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJCQkJb3RoZXJNc2cgPSBVbWFVdGlsLmdldE1lc3NhZ2Uoc3RhdHVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJNc2cgPT0gbnVsbCkgewotCQkJCQkJb3RoZXJNc2cgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCW1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1zZywgbmV3IE9iamVjdFtdIHsgcGF0aCwKLQkJCQkJCQlvdGhlck1zZyB9KTsKLQkJCQkJZSA9IG5ldyBFeGNlcHRpb24obXNnLCBlKTsKLQkJCQkJZ2V0V2FybmluZ3MoKS5hZGQoZSk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsZW1lbnRUb0luZm9NYXBUb0RlbGV0ZUZpbGVzLmNsZWFyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJaWYgKCF0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLmlzRW1wdHkoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWludCBtYXggPSB0eFJlY29yZC5nZXRSZXNvdXJjZXNUb0NvbW1pdCgpLnNpemUoKSAtIDE7Ci0JCQkJCUFycmF5TGlzdCByZXN0b3JlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJCQkvLyBTb21ldGhpbmcgd2VudCB3cm9uZywgcmVzdG9yZSBmcm9tIGJhY2t1cAotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJSUZhaWxTYWZlU2F2YWJsZSByZXNvdXJjZSA9IChJRmFpbFNhZmVTYXZhYmxlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAocmVzb3VyY2UucmVzdG9yZSgpKSB7Ci0JCQkJCQkJcmVzdG9yZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc3RvcmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIKLQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCXJlc291cmNlLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQl9Ci0KLQkJCQkJLy8gZGVsZXRlIHRlbXAgZmlsZXMKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSB0eFJlY29yZAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKS5nZXQoaSk7Ci0JCQkJCQlpZiAoKChJRmFpbFNhZmVTYXZhYmxlKXJlc291cmNlKS5oYXNUZW1wVVJJKCkpIHsKLQkJCQkJCQkvLyB1cmkga2VlcHMgdGhlIHBhdGggdG8gdGVtcCBmaWxlCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbmV3IEZpbGUocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpCi0JCQkJCQkJCQkJLmRlbGV0ZSgpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vdGlmeSBhbGwgY29tbWl0ZWQgcmVzb3VyY2VzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzCi0JCQkJCS8vIGRvbmUKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCSgoSUZhaWxTYWZlU2F2YWJsZSkgdHhSZWNvcmQKLQkJCQkJCQkJLmdldFJlc291cmNlc1RvQ29tbWl0KCkuZ2V0KGkpKQotCQkJCQkJCQkudHhGaW5pc2hlZChmYWxzZSk7Ci0JCQkJCX0KLQotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJdGhyb3cgZTsKLQkJCQl9Ci0JCQl9Ci0JCQl0eFJlY29yZC5jbGVhcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkJICovCi0JCXB1YmxpYyBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIjZ2V0Q3VycmVudFR4SUQoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRDdXJyZW50VHhJRCgpIHsKLQkJCXJldHVybiB0eFJlY29yZC5nZXRUeElEKCk7Ci0JCX0KLQotCX0KLQotCUZhaWxTYWZlUGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKE1hcCBvcHRpb25zKSB7Ci0JCUZhaWxTYWZlUGVyc2lzdGVyIHBlcnNpc3RlciA9IG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0QWxsKG9wdGlvbnMpOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGF0IFRYX1JFQ09SRCBzdGlsbCBrZWVwcyB0aGUgY29ycmVjdCB2YWx1ZQotCQlwZXJzaXN0ZXIuc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCwKLQkJCQlwZXJzaXN0ZXIudHhSZWNvcmQpOwotCi0JCXJldHVybiBwZXJzaXN0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5oYXNPd25Gb2xkZXIoZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duUmVzb3VyY2UoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuaGFzT3duUmVzb3VyY2UoZSwKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGYWlsU2FmZVBlcnNpc3RlcigpCi0JICovCi0JcHVibGljIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBnZXRGYWlsU2FmZVBlcnNpc3RlcigpIHsKLQkJcmV0dXJuIG5ldyBGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uRmFpbFNhZmVQZXJzaXN0ZXIgZXh0ZW5kcyBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQlpbXBsZW1lbnRzIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciB7Ci0JCXByaXZhdGUgTWFwIHNhdmVPcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2NvbW1pdCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjb21taXQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI3JvbGxiYWNrKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJvbGxiYWNrKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciNnZXRDdXJyZW50VHhJRCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRUeElEKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyI2FkanVzdExvY2F0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhZGp1c3RMb2NhdGlvbigoUmVzb3VyY2UpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBub25GYWlsU2FmZVBlcnNpc3RlciA9IG5ldyBOb25GYWlsU2FmZVBlcnNpc3RlcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjZ2V0RmlsZUV4dGVuc2lvbihqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjc2F2ZShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlpZighaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJTWFwIG9wdGlvbnMgPSByZXNvdXJjZVNldC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsgCi0JCVJlc291cmNlIHJlcyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVsZW1lbnQpLmVEaXJlY3RSZXNvdXJjZSgpOwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2U7Ci0JCWlmKHJlcyBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXM7Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHJlc291cmNlLCBvcHRpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkoZWxlbWVudCwgcmVzb3VyY2VTZXQpOwotCQkJcmVzb3VyY2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlU2V0LCBlbGVtZW50LCB1cmksIG9wdGlvbnMsIGZhbHNlKTsKLQkJfQotCQlyZXNvdXJjZS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQotCQlTdHJpbmcgc3RyID0gKFN0cmluZykgb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgQm9vbGVhbi52YWx1ZU9mKHN0cikuYm9vbGVhblZhbHVlKCkpIHsKLQkJCS8vIG5vdGlmeSBSZWZyZXNoSm9iIHRoZSB0aGlzIHJlc291cmNlIGlzIHNhdmVkIHNvIGl0IHdpbGwgbm90IGJlCi0JCQkvLyByZWxvYWRlZCBhZnRlciByZWZyZXNoaW5nIGl0Ci0JCQkvLwotCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnJlc291cmNlU2F2ZWQocmVzb3VyY2UpOwotCi0JCQkvLyByZWZyZXNoIHRoZSBuZXdseSBjcmVhdGVkIHJlc291cmNlIHNvIGl0IGlzIGluIHN5bmNoIHdpdGggdGhlCi0JCQkvLyB3b3Jrc3BhY2UKLQkJCS8vCi0JCQlGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZnJlc2gocmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBGaWxlIGNyZWF0ZU1ldGhvZFBsdWdpbkZvbGRlcihTdHJpbmcgcGx1Z2luTmFtZSwgTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUZpbGUgbGliRGlyID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQlGaWxlIHBsdWdpbkRpciA9IG5ldyBGaWxlKGxpYkRpciwgcGx1Z2luTmFtZSk7Ci0JCWlmKCFwbHVnaW5EaXIuZXhpc3RzKCkpIHsKLQkJCWlmKCFwbHVnaW5EaXIubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2Fubm90X2NyZWF0ZV9kaXJfbXNnLCBwbHVnaW5EaXIpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsdWdpbkRpcjsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobGliRGlyLCBNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCWlmKCFjb25maWdEaXIuZXhpc3RzKCkpIHsKLQkJCWlmKCFjb25maWdEaXIubWtkaXJzKCkpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2Fubm90X2NyZWF0ZV9kaXJfbXNnLCBjb25maWdEaXIpKTsJCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZ0RpcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnksIEZpbGUgZmlsZSkgewotCQkvLyBub3QgYWxsb3dlZAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29udGFpbmVkQnkoUmVzb3VyY2UgcmVzb3VyY2UsIFJlc291cmNlIGNvbnRhaW5lclJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KGNvbnRhaW5lclJlc291cmNlKTsKLQkJaWYoaGFzT3duRm9sZGVyKGUpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhyZXNvdXJjZS5nZXRVUkkoKSk7Ci0JCQlTdHJpbmcgY29udGFpbmVyUGF0aCA9IEZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhjb250YWluZXJSZXNvdXJjZS5nZXRVUkkoKSk7CQkKLQkJCWlmKHBhdGggPT0gbnVsbCB8fCBjb250YWluZXJQYXRoID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFBhdGgoY29udGFpbmVyUGF0aCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmlzUHJlZml4T2YobmV3IFBhdGgocGF0aCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlRm9sZGVyUGF0aChNZXRob2RFbGVtZW50IGUpIHsKLQkJU3RyaW5nIGZvbGRlclBhdGggPSBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZSk7Ci0JCXJldHVybiBmb2xkZXJQYXRoICE9IG51bGwgPyBuZXcgRmlsZShmb2xkZXJQYXRoLCBSRVNPVVJDRV9GT0xERVIpLmdldEFic29sdXRlUGF0aCgpIDogUkVTT1VSQ0VfRk9MREVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSk7Ci0JCUZpbGUgbGliRGlyID0gbmV3IEZpbGUoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkobGlicmFyeS5lUmVzb3VyY2UoKSkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudEZpbGUoKTsKLQkJcmV0dXJuIG5ldyBGaWxlKGxpYkRpciwgZ2V0UmVsYXRpdmVFbGVtZW50UGF0aChlKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlciNkZWxldGUoamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbXMpIHsKLQkJQXJyYXlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0T2JqZWN0c1dpdGhEaXJlY3RSZXNvdXJjZXMoaXQubmV4dCgpLCBlbGVtZW50cyk7Ci0JCX0KLQkJZGVsZXRlQW5kU2F2ZShlbGVtZW50cyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVJT0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2MyNzk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlSU9FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBCYXNlIGV4Y2VwdGlvbiBmb3IgZmlsZS1iYXNlZCBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlSU9FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTc4NTMxOTg3MjIzNDczMjFMOwotCi0JcHJpdmF0ZSBPYmplY3QgdHJvdWJsZU9iamVjdDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZUlPRXhjZXB0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihTdHJpbmcgbXNnLCBPYmplY3QgdHJvdWJsZU9iaikgewotCQlzdXBlcihtc2cpOwotCQl0cm91YmxlT2JqZWN0ID0gdHJvdWJsZU9iajsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRyb3VibGVPYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUcm91YmxlT2JqZWN0KCkgewotCQlyZXR1cm4gdHJvdWJsZU9iamVjdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVJlc291cmNlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmI5MTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEluZm9JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLkxpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5pbnRlcm5hbC5SZWZyZXNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRXZlbnRUeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5EYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgZXh0ZW5kcyBSZXNvdXJjZVNldEltcGwgaW1wbGVtZW50cwotCQlJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIsIElVbWFSZXNvdXJjZVNldCwgSUxpYnJhcnlSZXNvdXJjZVNldCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCA9IHsgIkRlbGl2ZXJ5UHJvY2Vzc2VzIiB9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX0NBUEFCSUxJVFlfUEFUVEVSTl9QQVRIID0gewotCQkJIkNvbnRlbnQiLCAiQ2FwYWJpbGl0eVBhdHRlcm5zIiB9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCA9IHsgIlByb2Nlc3NDb250cmlidXRpb25zIiB9OyAvLyROT04tTkxTLTEkCQkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW11bXSBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMgPSB7Ci0JCQlERUZBVUxUX0RFTElWRVJZX1BST0NFU1NfUEFUSCwgREVGQVVMVF9DQVBBQklMSVRZX1BBVFRFUk5fUEFUSCwKLQkJCURFRkFVTFRfUFJPQ0VTU19DT05UUklCVVRJT05fUEFUSCB9OwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIFJFUE9SVF9FUlJPUiA9IHRydWU7Ci0KLQlzdGF0aWMgZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBERUZBVUxUX1NBVkVfT1BUSU9OUyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCi0Jc3RhdGljIGZpbmFsIFNldCBERUZBVUxUX1NBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQgPSBuZXcgSGFzaFNldCgpOwotCi0Jc3RhdGljIHsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW4oKSk7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpKTsKLQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VULmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCS8vIGVDbGFzc2VzLmFkZChSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZU1hbmFnZXIoKSk7Ci0JCURFRkFVTFRfU0FWRV9TRVBBUkFURUxZX0NMQVNTX1NFVC5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQotCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gY3JlYXRlU2F2ZVhNTE1hcCgpOwotCi0JCUhhc2hTZXQgc2F2ZVRvZ2V0aGVyID0gbmV3IEhhc2hTZXQoKTsKLQkJc2F2ZVRvZ2V0aGVyLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSk7Ci0KLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KAotCQkJCU11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQsCi0JCQkJREVGQVVMVF9TQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUKTsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfQUxMLCAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuU0FWRV9UT0dFVEhFUl9DTEFTU19TRVQsCi0JCQkJc2F2ZVRvZ2V0aGVyKTsKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlJFRlJFU0hfTkVXX1JFU09VUkNFLAotCQkJCSJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVGQVVMVF9TQVZFX09QVElPTlMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkNIRUNLX01PRElGWSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1BST0NFU1NfREFOR0xJTkdfSFJFRiwKLQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUFJPQ0VTU19EQU5HTElOR19IUkVGX0RJU0NBUkQpOwotCQlERUZBVUxUX1NBVkVfT1BUSU9OUy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1hNTF9NQVAsIHhtbE1hcCk7Ci0JCURFRkFVTFRfU0FWRV9PUFRJT05TLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fQ09ORklHVVJBVElPTl9DQUNIRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlBc3NvY2lhdGlvbkhlbHBlci5pbml0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTTUdSX1hNSSA9ICJyZXNtZ3IueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBkZWZhdWx0U2F2ZU9wdGlvbnM7Ci0KLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBFT2JqZWN0PiBndWlkVG9NZXRob2RFbGVtZW50TWFwOwotCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRpbmc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWU7Ci0KLQlwcml2YXRlIE1hcCBVUklUb1RlbXBVUklNYXA7Ci0KLQlwcml2YXRlIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIgbWFya2VyTWFuYW5nZXI7Ci0KLQlwcml2YXRlIFVuaXF1ZUVMaXN0PElSZWZyZXNoTGlzdGVuZXI+IHJlZnJlc2hMaXN0ZW5lcnM7Ci0KLQlwcm90ZWN0ZWQgSVVSSVByb3ZpZGVyIHVyaVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBQYXRoIGNvbmZpZ0ZvbGRlclBhdGg7Ci0KLQlwcml2YXRlIFBhdGggbGliRm9sZGVyUGF0aDsKLQotCXByaXZhdGUgc3RhdGljIFhNTFJlc291cmNlLlhNTE1hcCBjcmVhdGVMb2FkWE1MTWFwKCkgewotCQlYTUxSZXNvdXJjZS5YTUxNYXAgeG1sTWFwID0gbmV3IFhNTE1hcEltcGwoKTsKLQkJU2V0IGV4Y2x1ZGVkQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpOwotCQlleGNsdWRlZEF0dHJpYnV0ZXMuYWRkKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSAoRUNsYXNzaWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVDbGFzc2lmaWVyOwotCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVDbGFzcy5nZXRFQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmICghZXhjbHVkZWRBdHRyaWJ1dGVzLmNvbnRhaW5zKGF0dHJpYikpIHsKLQkJCQkJCVhNTFJlc291cmNlLlhNTEluZm8geG1sSW5mbyA9IG5ldyBYTUxJbmZvSW1wbCgpOwotCQkJCQkJeG1sSW5mby5zZXROYW1lKGF0dHJpYi5nZXROYW1lKCkpOwotCQkJCQkJeG1sSW5mbwotCQkJCQkJCQkuc2V0WE1MUmVwcmVzZW50YXRpb24oWE1MUmVzb3VyY2UuWE1MSW5mby5FTEVNRU5UKTsKLQkJCQkJCXhtbE1hcC5hZGQoYXR0cmliLCB4bWxJbmZvKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB4bWxNYXA7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzYXZlQXR0cmlidXRlQXNFbGVtZW50KEVDbGFzcyBlQ2xhc3MsCi0JCQlDb2xsZWN0aW9uIHNlbGVjdGVkRUNsYXNzZXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0ZWRFQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBiYXNlID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoYmFzZS5pc1N1cGVyVHlwZU9mKGVDbGFzcykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MUmVzb3VyY2UuWE1MTWFwIGNyZWF0ZVNhdmVYTUxNYXAoKSB7Ci0JCVhNTFJlc291cmNlLlhNTE1hcCB4bWxNYXAgPSBuZXcgWE1MTWFwSW1wbCgpOwotCQlTZXQgZXhjbHVkZWRBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZXhjbHVkZWRBdHRyaWJ1dGVzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKSk7Ci0JCWV4Y2x1ZGVkQXR0cmlidXRlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0KLQkJLy8gc2VsZWN0IG9ubHkgQ29udGVudERlc2NyaXB0aW9uIGFuZCBTZWN0aW9uCi0JCVNldCBzZWxlY3RlZEVDbGFzc2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJc2VsZWN0ZWRFQ2xhc3Nlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlzZWxlY3RlZEVDbGFzc2VzLmFkZChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uKCkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSAoRUNsYXNzaWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGVDbGFzcyA9IChFQ2xhc3MpIGVDbGFzc2lmaWVyOwotCi0JCQkJaWYgKHNhdmVBdHRyaWJ1dGVBc0VsZW1lbnQoZUNsYXNzLCBzZWxlY3RlZEVDbGFzc2VzKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKCFleGNsdWRlZEF0dHJpYnV0ZXMuY29udGFpbnMoYXR0cmliKSkgewotCQkJCQkJCVhNTFJlc291cmNlLlhNTEluZm8geG1sSW5mbyA9IG5ldyBYTUxJbmZvSW1wbCgpOwotCQkJCQkJCXhtbEluZm8uc2V0TmFtZShhdHRyaWIuZ2V0TmFtZSgpKTsKLQkJCQkJCQl4bWxJbmZvCi0JCQkJCQkJCQkuc2V0WE1MUmVwcmVzZW50YXRpb24oWE1MUmVzb3VyY2UuWE1MSW5mby5FTEVNRU5UKTsKLQkJCQkJCQl4bWxNYXAuYWRkKGF0dHJpYiwgeG1sSW5mbyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4geG1sTWFwOwotCX0KLQotCXB1YmxpYyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW1hcmtlck1hbmFuZ2VyID0gbmV3IFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChib29sZWFuIHJlcG9ydEVycm9yKSB7Ci0JCXRoaXMoKTsKLQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChyZXBvcnRFcnJvcik7Ci0JfQotCi0JcHVibGljIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIgZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyOwkJCi0JfQotCQotCXByb3RlY3RlZCBJVVJJUHJvdmlkZXIgZ2V0VVJJUHJvdmlkZXIoKSB7Ci0JCWlmKHVyaVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXVyaVByb3ZpZGVyID0gbmV3IEZpbGVQYXRoUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gdXJpUHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVSZXNvdXJjZUNoYW5nZShJUmVzb3VyY2Ugd3NSZXMpIHsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuaGFuZGxlUmVzb3VyY2VDaGFuZ2UoKTogIiArIHdzUmVzLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZ2V0UmVzb3VyY2UoCi0JCQkJVVJJLmNyZWF0ZUZpbGVVUkkod3NSZXMuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKSwgZmFsc2UpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlBcnJheUxpc3QgcHJveGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlyZXNvdXJjZS5yZWxvYWQocHJveGllcyk7Ci0KLQkJCQkvLyBub3RpZnkgTUFLRV9QUk9YWSBldmVudCBmb3IgYWxsIHByb3hpZXMKLQkJCQkvLwotCQkJCU5vdGlmaWNhdGlvbiBtc2cgPSBuZXcgTm90aWZpY2F0aW9uSW1wbChFdmVudFR5cGVzLk1BS0VfUFJPWFksCi0JCQkJCQlmYWxzZSwgdHJ1ZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJveGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlvLmVOb3RpZnkobXNnKTsKLQkJCQl9Ci0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgTWFwPE9iamVjdCwgT2JqZWN0PiBnZXRMb2FkT3B0aW9ucygpIHsKLQkJTWFwPE9iamVjdCwgT2JqZWN0PiBvcHRpb25zID0gc3VwZXIuZ2V0TG9hZE9wdGlvbnMoKTsKLQkJb3B0aW9ucy5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQlvcHRpb25zLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fWE1MX01BUCwgY3JlYXRlTG9hZFhNTE1hcCgpKTsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JcHVibGljIE1hcDxPYmplY3QsIE9iamVjdD4gZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkgewotCQlpZiAoZGVmYXVsdFNhdmVPcHRpb25zID09IG51bGwpIHsKLQkJCWRlZmF1bHRTYXZlT3B0aW9ucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQkJZGVmYXVsdFNhdmVPcHRpb25zLnB1dEFsbChERUZBVUxUX1NBVkVfT1BUSU9OUyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVmYXVsdFNhdmVPcHRpb25zOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2UgZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoUmVzb3VyY2UpIGdldFJlc291cmNlcygpLmdldCgwKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiAoTWV0aG9kTGlicmFyeSkgUGVyc2lzdGVuY2VVdGlsCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRNZXRob2RMaWJyYXJ5UmVzb3VyY2UoKTsKLQkJcmV0dXJuIHJlc291cmNlID09IG51bGwgPyBudWxsIDogTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNnZXRVUklDb252ZXJ0ZXIoKQotCSAqLwotCXB1YmxpYyBVUklDb252ZXJ0ZXIgZ2V0VVJJQ29udmVydGVyKCkgewotCQlpZiAodXJpQ29udmVydGVyID09IG51bGwpIHsKLQkJCXVyaUNvbnZlcnRlciA9IG5ldyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHVyaUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICogQHJldHVybiBudWxsIGlmIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbiBVUkkgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmkpIHsKLQkJaWYgKGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlcyA9PSBudWxsKSB7Ci0JCQkJTWFwIG1hcCA9IGdldFVSSVJlc291cmNlTWFwKCk7Ci0JCQkJcmVzID0gY3JlYXRlUmVzb3VyY2UodXJpKTsKLQotCQkJCXRyeSB7Ci0JCQkJCWRlbWFuZExvYWRIZWxwZXIocmVzKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gcmVtb3ZlIHRoZSByZXNvdXJjZSBmcm9tIHJlc291cmNlIHNldCBpZiBpdCBjb3VsZCBub3QgYmUKLQkJCQkJLy8gbG9hZGVkCi0JCQkJCS8vCi0JCQkJCWdldFJlc291cmNlcygpLnJlbW92ZShyZXMpOwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQotCQkJCWlmIChtYXAgIT0gbnVsbCkgewotCQkJCQltYXAucHV0KHVyaSwgcmVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZXhjZXB0aW9uKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsI2RlbWFuZExvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRlbWFuZExvYWQoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCi0JCS8vIHJlZnJlc2ggd29ya3NwYWNlIHJlc291cmNlIG9mIHRoaXMgcmVzb3VyY2UgdG8gbWFrZSB0aGVtIHN5bmNocm9uaXplZAotCQkvLwotCQlib29sZWFuIHJldCA9IEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZighcmV0KSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuZGVtYW5kTG9hZCgpOiBjb3VsZCBub3QgcmVmcmVzaCByZXNvdXJjZSAiICsgcmVzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVzb2x2ZXMgY29udGFpbmVyIG9mIHRoZSBNZXRob2RFbGVtZW50IGluIHRoZSBnaXZlbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZUNvbnRhaW5lcihSZXNvdXJjZSByZXMpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmKGxvYWRpbmcgJiYgbGliID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlbGVtZW50OwotCQkJCWlmKGUgIT0gbGliICYmIGUuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJLy8gdGhlIG1ldGhvZCBlbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBsb2FkZWQgYmVmb3JlIGl0cyBjb250YWluZXIgYWNjZXNzZWQgaXQKLQkJCQkJLy8KLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzKTsKLQkJCQkJaWYocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZSBjb250YWluZXJSZXNvdXJjZSA9IHJlc0Rlc2MuZVJlc291cmNlKCk7Ci0JCQkJCQlpZihjb250YWluZXJSZXNvdXJjZSBpbnN0YW5jZW9mIFhNTFJlc291cmNlSW1wbCkgewotCQkJCQkJCU9iamVjdCBwcm94eSA9ICgoWE1MUmVzb3VyY2VJbXBsKWNvbnRhaW5lclJlc291cmNlKS5nZXRJRFRvRU9iamVjdE1hcCgpLmdldChlLmdldEd1aWQoKSk7Ci0JCQkJCQkJaWYocHJveHkgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJCQkJCUVPYmplY3QgcHJveHlFT2JqZWN0ID0gKChFT2JqZWN0KXByb3h5KTsgCi0JCQkJCQkJCUVSZWZlcmVuY2UgcmVmID0gcHJveHlFT2JqZWN0LmVDb250YWlubWVudEZlYXR1cmUoKTsKLQkJCQkJCQkJRU9iamVjdCBjb250YWluZXIgPSBwcm94eUVPYmplY3QuZUNvbnRhaW5lcigpOwotCQkJCQkJCQlpZihjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJCQkJCQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIGNvbnRhaW5lci5lR2V0KHJlZik7Ci0JCQkJCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyBpdGVyCi0JCQkJCQkJCQkJLm5leHQoKSkKLQkJCQkJCQkJCQkJOwotCQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCQljb250YWluZXIuZUdldChyZWYpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJcmVzb2x2ZUNvbnRhaW5lcihjb250YWluZXJSZXNvdXJjZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbCNnZXRSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJaWYgKGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlcyA9IHN1cGVyLmdldFJlc291cmNlKHVyaSwgbG9hZE9uRGVtYW5kKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCWlmIChlLmdldE1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCW1zZyA9IE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlRXJyb3JXaXRoUmVhc29uX21zZywKLQkJCQkJCShuZXcgT2JqZWN0W10geyB1cmksIGUuZ2V0TWVzc2FnZSgpIH0pKTsKLQkJCWVsc2UKLQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VFcnJvcl9tc2csIHVyaSk7Ci0JCQloYW5kbGVFeGNlcHRpb24obXNnKTsKLQkJCXRocm93IGU7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZyZXNoTGlzdGVuZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzID0gbmV3IFVuaXF1ZUVMaXN0PElSZWZyZXNoTGlzdGVuZXI+KCk7Ci0JCX0KLQkJcmVmcmVzaExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZnJlc2hMaXN0ZW50ZXIoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmVmcmVzaExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlyZWZyZXNoTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbm90aWZ5UmVmcmVzaExpc3RlbmVycyhJUmVmcmVzaEV2ZW50IGV2ZW50KSB7Ci0JCWlmKHJlZnJlc2hMaXN0ZW5lcnMgIT0gbnVsbCAmJiAhcmVmcmVzaExpc3RlbmVycy5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSVJlZnJlc2hMaXN0ZW5lciBsaXN0ZW5lciA6IHJlZnJlc2hMaXN0ZW5lcnMpIHsKLQkJCQl0cnkgewotCQkJCQlsaXN0ZW5lci5ub3RpZnlSZWZyZXNoZWQoZXZlbnQpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiByZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogQHJldHVybiByZXNvdXJjZXMgdGhhdCBoYWQgYmVlbiByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbiByZWxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXMpIHsJCQotCQkvLyBzYXZlIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoZSByZXNvdXJjZXMgdG8gY3JlYXRlIFVSSSBmb3IgdGhlaXIKLQkJLy8gcHJveGllcyBhZnRlciB1bmxvYWQKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgaXRlcgotCQkJCQkubmV4dCgpOwotCQkJCi0JCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwucmVsb2FkUmVzb3VyY2VzKCk6IHJlc291cmNlPSIgKyByZXNvdXJjZSArICIsIGVsZW1lbnQ9IiArIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCXJlc291cmNlLnNldFJlc291cmNlRGVzY3JpcHRvcihyZXNEZXNjKTsKLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCByZWxvYWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSGFzaFNldCBwcm94aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJQXJyYXlMaXN0IHJlc291cmNlTGlzdCA9IG5ldyBBcnJheUxpc3QocmVzb3VyY2VzKTsKLQotCQlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IGdldE1ldGhvZExpYnJhcnlSZXNvdXJjZSgpOwotCQlib29sZWFuIHJlbG9hZEFsbENvbmZpZ3MgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlTGlzdC5yZW1vdmUobGliUmVzb3VyY2UpKSB7Ci0JCQkvLyBNZXRob2RMaWJyYXJ5IHJlc291cmNlIGlzIHRvIHJlbG9hZCwgaXQgbXVzdCBiZSByZWxvYWRlZCBmaXJzdAotCQkJLy8JCQkKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGxpYlJlc291cmNlOwotCi0JCQkvLyBjbGVhciBtYXJrZXJzIGZvciB0aGlzIHJlc291cmNlCi0JCQkvLwotCQkJbWFya2VyTWFuYW5nZXIuY2xlYXJNYXJrZXJzKHJlc291cmNlKTsKLQotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UucmVsb2FkKHByb3hpZXMpKSB7Ci0JCQkJCXJlbG9hZGVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0KLQkJCQkJLy8gcmVzZXQgdGhlIHJlc291cmNlIG1hbmFnZXIgcmVmZXJlbmNlIGluIFVSSUNvbnZlcnRlciBvZgotCQkJCQkvLyB0aGlzIHJlc291cmNlIHNldAotCQkJCQkvLyBzaW5jZSB0aGUgcmVzb3VyY2UgbWFuYWdlciBpcyByZWxvYWRlZAotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJCXVyaUNvbnZlcnRlci5yZXNNZ3IgPSBudWxsOwotCQkJCQkKLQkJCQkJcmVsb2FkQWxsQ29uZmlncyA9IHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQl9Ci0KLQkJfQotCQkvLyByZWxvYWQgdGhlIHJlc291cmNlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZUxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0KLQkJCS8vIGNsZWFyIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLQkJCS8vCi0JCQltYXJrZXJNYW5hbmdlci5jbGVhck1hcmtlcnMocmVzb3VyY2UpOwotCi0JCQl0cnkgewotCQkJCWlmIChyZXNvdXJjZS5yZWxvYWQocHJveGllcykpIHsKLQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCWlmICghcmVsb2FkZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkvLyByZWluaXRpYWxpemUgdGhlIHJlc291cmNlIHNldAotCQkJLy8KLQkJCWluaXRpYWxpemUocmVsb2FkQWxsQ29uZmlncyk7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgbGlzdGVuZXJzCi0JCQkvLwotCQkJaWYgKHJlZnJlc2hMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCUlSZWZyZXNoRXZlbnQgZXZlbnQgPSBuZXcgUmVmcmVzaEV2ZW50KHJlbG9hZGVkUmVzb3VyY2VzLAotCQkJCQkJcHJveGllcyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChyZWZyZXNoTGlzdGVuZXJzKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQlJUmVmcmVzaExpc3RlbmVyIGxpc3RlbmVyID0gKElSZWZyZXNoTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlsaXN0ZW5lci5ub3RpZnlSZWZyZXNoZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZWxvYWRlZFJlc291cmNlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKGJvb2xlYW4gbG9hZENvbmZpZ3VyYXRpb25zKSB7Ci0JCS8vIGxvYWQgdGhlIFJlc291cmNlTWFuYWdlciB0cmVlIGFuZCBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlsb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpOwotCi0JCXNldENvbnRhaW5lcnNPZkxvYWRlZEVsZW1lbnRzKCk7Ci0JCQotCQlpZihsb2FkQ29uZmlndXJhdGlvbnMpIHsKLQkJCWxvYWRDb25maWd1cmF0aW9ucygpOwotCQl9Ci0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMoKTsKLQotCQkvLyByZXNldCB0aGUgcmVzb3VyY2UgbWFuYWdlciByZWZlcmVuY2UgaW4gVVJJQ29udmVydGVyIG9mIHRoaXMgcmVzb3VyY2UKLQkJLy8gc2V0Ci0JCS8vCi0JCU11bHRpRmlsZVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTXVsdGlGaWxlVVJJQ29udmVydGVyKSBnZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnJlc01nciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRDb250YWluZXJzT2ZMb2FkZWRFbGVtZW50cygpIHsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCi0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxNzI2OTEwMTc5ODc3MDI1MDZMOwotCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3Q7Ci0JCQkJQ29sbGVjdGlvbiBHVUlEcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJTGlzdCBzdWJNZ3JzID0gbmV3IEFycmF5TGlzdChyZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3ViTWdycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUludGVybmFsRU9iamVjdCBzdWJNZ3IgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyCi0JCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQlpZiAoc3ViTWdyICE9IG51bGwgJiYgIXN1Yk1nci5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChzdWJNZ3IuZVJlc291cmNlKCkpOwotCQkJCQkJCUdVSURzLmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc01nci5lUmVzb3VyY2UoKTsKLQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCi0JCQkJCS8vIHJlc29sdmUgdGhlIHByb3h5IG9mIHRoaXMgZWxlbWVudCBpbiB0aGUgcGFyZW50Ci0JCQkJCS8vCi0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlc29sdmVQcm94aWVzKEdVSURzLCBwYXJlbnQpOwotCQkJCX0KLQotCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHdvcmtzcGFjZSByZXNvdXJjZSByZXByZXNlbnRzIGEgbGlicmFyeSByZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSB3c1Jlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlicmFyeVJlc291cmNlKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCXJldHVybiBsaWJGb2xkZXJQYXRoICE9IG51bGwgJiYgbGliRm9sZGVyUGF0aC5pc1ByZWZpeE9mKHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gd29ya3NwYWNlIHJlc291cmNlIGlzIGEgbmV3IHJlc291cmNlIHRoYXQgY2FuIGJlIGxvYWRlZCAKLQkgKiB1c2luZyB7QGxpbmsgI2xvYWROZXdSZXNvdXJjZXMoQ29sbGVjdGlvbil9Ci0JICogIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Jlc291cmNlVG9Mb2FkKElSZXNvdXJjZSB3c1Jlc291cmNlKSB7Ci0JCUlQYXRoIGxvYyA9IHdzUmVzb3VyY2UuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIChsb2MgIT0gbnVsbCAmJiBjb25maWdGb2xkZXJQYXRoICE9IG51bGwgCi0JCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkmJiBjb25maWdGb2xkZXJQYXRoLmlzUHJlZml4T2YobG9jKQotCQkJCSYmICFGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmlzVGVhbVByaXZhdGUobG9jLnRvU3RyaW5nKCkpKTsKLQotCX0KLQkKLQkvKioKLQkgKiBMb2FkcyBuZXcgcmVzb3VyY2VzIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBvZiB7QGxpbmsgSVJlc291cmNlIHdvcmsgc3BhY2UgcmVzb3VyY2VzfQotCSAqIGludG8gdGhpcyByZXNvdXJjZSBzZXQKLQkgKiBUT0RPOiBtZXJnZSB0aGlzIGNvZGUgdG8ge0BsaW5rICNnZXRSZXNvdXJjZShVUkksIGJvb2xlYW4pfQotCSAqIEBwYXJhbSB3c1Jlc291cmNlcyBjb2xsZWN0aW9uIG9mIHtAbGluayBJUmVzb3VyY2V9IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkTmV3UmVzb3VyY2VzKENvbGxlY3Rpb248SVJlc291cmNlPiB3c1Jlc291cmNlcykgewotCQlBcnJheUxpc3QgbmV3Q29uZmlnRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdzUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHdzUmVzb3VyY2UgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKHdzUmVzb3VyY2UgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSAoSVJlc291cmNlKSB3c1Jlc291cmNlOwotCQkJCUlQYXRoIGxvYyA9IHdzUmVzLmdldExvY2F0aW9uKCk7Ci0JCQkJU3RyaW5nIGNvbmZpZ0ZpbGU7Ci0JCQkJaWYobG9jICE9IG51bGwgJiYgY29uZmlnRm9sZGVyUGF0aCAhPSBudWxsIAotCQkJCQkJJiYgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9GSUxFX0VYVEVOU0lPTi5lcXVhbHNJZ25vcmVDYXNlKCIuIiArIGxvYy5nZXRGaWxlRXh0ZW5zaW9uKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSYmIGNvbmZpZ0ZvbGRlclBhdGguaXNQcmVmaXhPZihsb2MpCi0JCQkJCQkmJiAhRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc1RlYW1Qcml2YXRlKGNvbmZpZ0ZpbGUgPSBsb2MudG9TdHJpbmcoKSkpIHsKLQkJCQkJbmV3Q29uZmlnRmlsZXMuYWRkKGNvbmZpZ0ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbG9hZCBuZXcgY29uZmlndXJhdGlvbnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3Q29uZmlnRmlsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgY29uZmlnRmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJbG9hZENvbmZpZ3VyYXRpb24obmV3IEZpbGUoY29uZmlnRmlsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBoYW5kbGluZyBmb3IgTWV0aG9kQ29uZmlndXJhdGlvbiBzaW5jZSBNZXRob2RMaWJyYXJ5IHdpbGwgbm8KLQkgKiBsb25nZXIga2VlcHMgdGhlIHJlZmVyZW5jZXMgdG8gTWV0aG9kQ29uZmlndXJhdGlvbnMgYW5kIHRoZWlyIGZpbGVzLiBBbnkKLQkgKiBYTUkgZmlsZSB1bmRlciBmb2xkZXIgLi9jb25maWd1cmF0aW9ucyBhbmQgaXRzIHN1YmZvbGRlcnMgd2lsbCBiZSB0cmVhdGVkCi0JICogYXMgYSBjb25maWd1cmF0aW9uIGZpbGUuIFRoZXkgd2lsbCBiZSBsb2FkZWQgYW5kIGFkZGVkIHRvIE1ldGhvZExpYnJhcnkKLQkgKiBhcyBpdHMgY29uZmlndXJhdGlvbnMuCi0JICogQHJldHVybiBUT0RPCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRDb25maWd1cmF0aW9ucygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUZpbGUgY29uZmlnRGlyID0gbmV3IEZpbGUobmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpCi0JCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSwKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSk7Ci0JCXJldHVybiBsb2FkQ29uZmlndXJhdGlvbnMoY29uZmlnRGlyKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9hZHMgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0RpcgotCSAqIEByZXR1cm4gVE9ETwotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkQ29uZmlndXJhdGlvbnMoRmlsZSBjb25maWdEaXIpIHsKLQkJQXJyYXlMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCQlJdGVyYXRvciBkaXJJdGVyID0gTXVsdGlGaWxlU2F2ZVV0aWwubGlzdENvbmZpZ0ZpbGVzKGNvbmZpZ0Rpcik7Ci0JCUhhc2hTZXQ8RmlsZT4gY29uZmlnRmlsZXMgPSBuZXcgSGFzaFNldDxGaWxlPigpOwotCQl3aGlsZSAoZGlySXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgY29uZmlnRmlsZSA9IChGaWxlKSBkaXJJdGVyLm5leHQoKTsKLQkJCWlmKGNvbmZpZ0ZpbGUuaXNGaWxlKCkpIHsKLQkJCQljb25maWdGaWxlcy5hZGQoY29uZmlnRmlsZSk7Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZXIubmV4dCgpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoY29uZmlnLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWlmIChjb25maWdGaWxlcy5jb250YWlucyhmaWxlKSkgewotCQkJCWNvbmZpZ0ZpbGVzLnJlbW92ZShmaWxlKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNvbmZpZ0ZpbGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmlsZSBmaWxlID0gKEZpbGUpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBsb2FkQ29uZmlndXJhdGlvbihmaWxlKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZSBsb2FkQ29uZmlndXJhdGlvbihGaWxlIGNvbmZpZ0ZpbGUpIHsKLQkJdHJ5IHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGNvbmZpZ0ZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCWlmKFBlcnNpc3RlbmNlVXRpbC5oYXNEdXBsaWNhdGVHVUlEKGUsIGxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSkpIHsKLQkJCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJCQkJTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZENvbmZpZ3VyYXRpb25fY291bGROb3RMb2FkX2xvZ01zZywgY29uZmlnRmlsZSkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZCgoTWV0aG9kQ29uZmlndXJhdGlvbikgZSk7Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkJTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZENvbmZpZ3VyYXRpb25fbm90Q29uZmlnRmlsZV9sb2dNc2csIGNvbmZpZ0ZpbGUpCi0JCQkJCQkJKTsKLQkJCQl9Ci0JCQkJcmVzb3VyY2UudW5sb2FkKCk7Ci0JCQkJZ2V0UmVzb3VyY2VzKCkucmVtb3ZlKHJlc291cmNlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKE9iamVjdCBlcnIpIHsKLQkJaWYgKGVyciBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKChFeGNlcHRpb24pZXJyKTsKLQkJfSBlbHNlIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlcnIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCWlmIChlcnIgaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQkoKEV4Y2VwdGlvbikgZXJyKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGVyci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQlpZiAodXJpQ29udmVydGVyIGluc3RhbmNlb2YgTXVsdGlGaWxlVVJJQ29udmVydGVyKSB7Ci0JCQkoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgdXJpQ29udmVydGVyKS5kaXNwb3NlKCk7Ci0JCX0KLQkJdXJpQ29udmVydGVyID0gbnVsbDsKLQkJYm9vbGVhbiBub3RpZnkgPSBlRGVsaXZlcigpOwotCQlib29sZWFuIHJlcG9ydEVycm9yID0gUkVQT1JUX0VSUk9SOwotCQlib29sZWFuIHJlZnJlc2ggPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCWJvb2xlYW4gb2xkTWFya2VyTWFuYWdlckVuYWJsZWQgPSBtYXJrZXJNYW5hbmdlci5pc0VuYWJsZWQoKTsKLQotCQl0cnkgewotCQkJaWYoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzZXQoKTsKLQkJCX0KLQkJCWVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCVJFUE9SVF9FUlJPUiA9IGZhbHNlOwotCQkJbWFya2VyTWFuYW5nZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltYXJrZXJNYW5hbmdlci5jbGVhckFsbCgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBuZXcgQXJyYXlMaXN0KGdldFJlc291cmNlcygpKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgdW5sb2FkaW5nIHJlc291cmNlOiAiICsKLQkJCQkJLy8gcmVzb3VyY2UuZ2V0VVJJKCkpOwotCQkJCQkvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJY2xlYXJFcnJvcnMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVTZXREZWxpdmVyKG5vdGlmeSk7Ci0JCQlSRVBPUlRfRVJST1IgPSByZXBvcnRFcnJvcjsKLQkJCW1hcmtlck1hbmFuZ2VyLnNldEVuYWJsZWQob2xkTWFya2VyTWFuYWdlckVuYWJsZWQpOwotCQkJaWYoUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlU2V0KCkgPT0gdGhpcykgewotCQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKHJlZnJlc2gpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgIT0gbnVsbCkgewotCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5jbGVhcigpOwotCQl9Ci0KLQkJZ2V0UmVzb3VyY2VzKCkuY2xlYXIoKTsKLQotCQlpZiAoVVJJVG9UZW1wVVJJTWFwICE9IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcC5jbGVhcigpOwotCQl9Ci0KLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmNsZWFyRGV0YWNoZWRFT2JqZWN0VG9JRE1hcCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckVycm9ycygpIHsKLQkJLy8gY2xlYXIgYWxsIG1hcmtlcnMKLQkJbWFya2VyTWFuYW5nZXIuY2xlYXJBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShTdHJpbmcgcGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvbmcgYmVnaW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlyZXNldCgpOwotCi0JCWxvbmcgYWZ0ZXJSZXNldCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlc2V0IHRpbWU6ICIgKyAoYWZ0ZXJSZXNldCAtIGJlZ2luKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCU1ldGhvZExpYnJhcnkgbGliID0gbG9hZExpYnJhcnlXaXRob3V0UmVzZXQocGF0aCk7Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJMb2FkIHRpbWU6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWdpbikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCS8vIGNoZWNrIGlmIGFueSByZXNvdXJjZSBpcyBtYXJrZWQgYXMgbW9kaWZpZWQgYWZ0ZXIgbG9hZGluZwotCQkJLy8KLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTW9kaWZpZWQgcmVzb3VyY2VzIGFmdGVyIGxvYWRpbmc6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiICAiICsgcmVzb3VyY2UuZ2V0VVJJKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGxvYWRMaWJyYXJ5UmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKHBhdGgpOwotCQlSZXNvdXJjZSByZXMgPSBzdXBlci5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQlpZiAoIXJlcy5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzdHJCdWYuYXBwZW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5RXJyb3JfbXNnKTsKLQkJCWZvciAoSXRlcmF0b3I8Pz4gaXRlciA9IHJlcy5nZXRFcnJvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZS5EaWFnbm9zdGljIGVycm9yID0gKFJlc291cmNlLkRpYWdub3N0aWMpIGl0ZXIKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJc3RyQnVmLmFwcGVuZChOTFMuYmluZCgKLQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRMaWJyYXJ5RXJyb3JfZGV0YWlscywKLQkJCQkJCShuZXcgT2JqZWN0W10geyBTdHJpbmcudmFsdWVPZihlcnJvci5nZXRMaW5lKCkpLAotCQkJCQkJCQlTdHJpbmcudmFsdWVPZihlcnJvci5nZXRDb2x1bW4oKSksCi0JCQkJCQkJCWVycm9yLmdldE1lc3NhZ2UoKSB9KSkpOwotCQkJfQotCQkJU3RyaW5nIG1zZyA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obXNnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRMaWJyYXJ5V2l0aG91dFJlc2V0KFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9hZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gcmVmcmVzaCBkdXJpbmcgbG9hZAotCQkvLwotCQlib29sZWFuIGIgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuaXNFbmFibGVkKCk7Ci0JCWlmKFJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5nZXRSZXNvdXJjZVNldCgpID09IHRoaXMpIHsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCQl9Ci0JCQotCQkvLyBkZWZlciBhZGRpbmcgbWFya2VycyBkdXJpbmcgbG9hZAotCQkvLwotCQlib29sZWFuIGF1dG9TY2hlZHVsZWQgPSBtYXJrZXJNYW5hbmdlci5pc0F1dG9TY2hlZHVsZWQoKTsKLQkJbWFya2VyTWFuYW5nZXIuc2V0QXV0b1NjaGVkdWxlZChmYWxzZSk7Ci0JCXRyeSB7CQkKLQkJCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKHBhdGgpOwotCQkJY29uZmlnRm9sZGVyUGF0aCA9IG5ldyBQYXRoKG5ldyBGaWxlKGxpYkZpbGUuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5NRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJCWxpYkZvbGRlclBhdGggPSBuZXcgUGF0aChsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJUmVzb3VyY2UgcmVzID0gbG9hZExpYnJhcnlSZXNvdXJjZShsaWJGaWxlLmdldENhbm9uaWNhbFBhdGgoKSk7IAotCQkJdHJ5IHsKLQkJCQlpbml0aWFsaXplKHRydWUpOwotCQkJCQotCQkJCS8vIFNldCBtb2RpZmllZCBmbGFnIG9mIGxpYnJhcnkgcmVzb3VyY2UgdG8gZmFsc2UgaW4gY2FzZSBpdCBoYWQgYmVlbiBtb2RpZmllZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KLQkJCQkvLwotCQkJCWlmKHJlcyAhPSBudWxsKSB7Ci0JCQkJCXJlcy5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuaW52YWxpZExpYnJhcnlGaWxlRXJyb3JfbXNnLCBwYXRoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZihSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSA9PSB0aGlzKSB7Ci0JCQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldEVuYWJsZWQoYik7Ci0JCQl9Ci0JCQkJCQotCQkJbWFya2VyTWFuYW5nZXIuc2V0QXV0b1NjaGVkdWxlZChhdXRvU2NoZWR1bGVkKTsKLQkJCW1hcmtlck1hbmFuZ2VyLnN0YXJ0KCk7Ci0JCQkKLQkJCWxvYWRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWRzIG9wcG9zaXRlIGZlYXR1cmVzIGZvciBhbGwgbG9hZGVkIG9iamVjdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCUFycmF5TGlzdCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJbG9hZE9wcG9zaXRlRmVhdHVyZXMob3Bwb3NpdGVGZWF0dXJlcyk7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgUmVzb3VyY2VNYW5hZ2VyIHRyZWUgb2YgdGhlIG9wZW4gbGlicmFyeSBhbmQgY29ubmVjdCBhbnkgbG9hZGVkCi0JICogTWV0aG9kVW5pdCB0byB0aGUgbGlicmFyeSB0cmVlIGFzIHdlbGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRSZXNvdXJjZU1hbmFnZXJUcmVlKCkgewotCQlsb25nIGJlZ2luID0gMDsKLQkJCi0JCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQliZWdpbiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0KLQkJLy8gZGlzYWJsZSBsb2dnaW5nIHVucmVzb2x2ZWQgcHJveGllcyBkdXJpbmcgbG9hZGluZyByZXNvdXJjZSBtYW5hZ2VyCi0JCS8vIHRyZWUKLQkJLy8KLQkJYm9vbGVhbiBvbGRNYXJrZXJNYW5hZ2VyRW5hYmxlZCA9IG1hcmtlck1hbmFuZ2VyLmlzRW5hYmxlZCgpOwotCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyB0aGlzIHByZXZlbnRzIHVyaUNvbnZlcnRlciBmcm9tIGxvYWRpbmcgcmVzb3VyY2VzIHdoaWxlCi0JCQkvLyBub3JtYWxpemluZyBVUkkKLQkJCS8vCi0JCQl1cmlDb252ZXJ0ZXIuc2V0UmVzb2x2ZVByb3h5KGZhbHNlKTsKLQotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCUl0ZXJhdG9yPD8+IGl0ZXJhdG9yID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPE9iamVjdD4ocmVzTWdyLCBmYWxzZSkgewotCi0JCQkJLyoqCi0JCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCQkgKi8KLQkJCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMTcyNjkxMDE3OTg3NzAyNTA2TDsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjw/PiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3Q7Ci0JCQkJCXJldHVybiByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5pdGVyYXRvcigpOwotCQkJCX0KLQotCQkJfTsKLQkJCWxvYWRpbmdSZXNvdXJjZU1hbmFnZXJUcmVlID0gdHJ1ZTsKLQkJCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCQk7Ci0JCX0gZmluYWxseSB7Ci0JCQltYXJrZXJNYW5hbmdlci5zZXRFbmFibGVkKG9sZE1hcmtlck1hbmFnZXJFbmFibGVkKTsKLQkJCXVyaUNvbnZlcnRlci5zZXRSZXNvbHZlUHJveHkodHJ1ZSk7Ci0JCQlsb2FkaW5nUmVzb3VyY2VNYW5hZ2VyVHJlZSA9IGZhbHNlOwotCi0JCQkvLyBSZXBvcnRpbmcgb2YgdW5ub3JtYWxpemVkIFVSSXMgd2FzIGRpc2FibGVkIHdoaWxlIGxvYWRpbmcKLQkJCS8vIHJlc291cmNlIG1hbmFnZXIgdHJlZS4gTm93IHdlIG5lZWQKLQkJCS8vIHRvIGdvIHRocnUgYWxsIHRoZSBsb2FkZWQgb2JqZWN0cyB0byBmaW5kIHByb3hpZXMgd2l0aAotCQkJLy8gdW5ub3JtYWxpemVkIFVSSXMgYW5kIHJlcG9ydCB0aGVtCi0JCQkvLwotCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKQotCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoby5lSXNQcm94eSgpICYmIG8uZUNvbnRhaW5lcigpICE9IG51bGwpIHsKLQkJCQkJCVVSSSB1cmkgPSBvLmVQcm94eVVSSSgpOwotCQkJCQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJCQkJCWlmIChub3JtYWxpemVkVVJJID09IG51bGwpIHsKLQkJCQkJCQkvLyB0aGlzIGNhbGwgd2lsbCBsb2cgZXJyb3IgYWJvdXQgdW5yZXNvbHZlZCBwcm94eQotCQkJCQkJCS8vCi0JCQkJCQkJKChJbnRlcm5hbEVPYmplY3QpIG8uZUNvbnRhaW5lcigpKS5lUmVzb2x2ZVByb3h5KG8pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQkKLQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5sb2FkUmVzb3VyY2VNYW5hZ2VyVHJlZSgpOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gYmVnaW4pKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpLmdldFJlc291cmNlTWFuYWdlcigpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIGZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhnZXRSZXNvdXJjZU1hbmFnZXIoKSwgaWQpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwKLQkJCVN0cmluZyBpZCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLCBmYWxzZSk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCAhcmVzb3VyY2UuaXNMb2FkZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlID0gc3VwZXIuZ2V0UmVzb3VyY2UoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLwotCQkJCX0KLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSByZXNvdXJjZS5nZXRFT2JqZWN0KGlkKTsKLQkJCQkJaWYgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVPYmplY3QgPSBmaW5kRU9iamVjdEluVW5sb2FkZWRSZXNvdXJjZXMoCi0JCQkJCShSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpLCBpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsKQotCQkJCXJldHVybiBlT2JqZWN0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGlkCi0JICovCi0JcHVibGljIEVPYmplY3QgZ2V0RU9iamVjdChTdHJpbmcgaWQpIHsKLQkJLy8gZmlyc3QsIHRyeSB0byBnZXQgdGhlIG9iamVjdCBmcm9tIHRoZSBjYWNoZSBndWlkVG9NZXRob2RFbGVtZW50Ci0JCS8vCi0JCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGlkKTsKLQkJaWYgKGVPYmplY3QgIT0gbnVsbCkKLQkJCXJldHVybiBlT2JqZWN0OwotCi0JCVVSSSB1cmkgPSBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuY3JlYXRlVVJJKGlkKS5hcHBlbmRGcmFnbWVudChpZCk7Ci0JCVVSSSBub3JtYWxpemVkID0gZ2V0VVJJQ29udmVydGVyKCkubm9ybWFsaXplKHVyaSk7Ci0JCWlmIChub3JtYWxpemVkID09IG51bGwpIHsKLQkJCS8vIHRoZSBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gaWQgbWlnaHQgbm90IGhhdmUgZGlyZWN0IHJlc291cmNlLAotCQkJLy8gaGVuY2UsIGl0IGRvZXMgbm90IGhhdmUKLQkJCS8vIGl0cyBvd24gUmVzb3VyY2VEZXNjcmlwdG9yIGluIFJlc291cmNlTWFuYWdlciB0cmVlLgotCQkJLy8gZ28gdGhydSBhbGwgdW5sb2FkZWQgcmVzb3VyY2VzLCBsb2FkIHRoZW0sIGFuZCB0cnkgdG8gZmluZCB0aGUKLQkJCS8vIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkJCS8vCi0JCQllT2JqZWN0ID0gZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKGlkKTsKLQkJCWlmIChlT2JqZWN0ID09IG51bGwgJiYgUkVQT1JUX0VSUk9SKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uKE5MUy5iaW5kKAotCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMub2JqTm90Rm91bmRFcnJvcl9tc2csIGlkKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RU9iamVjdCh1cmksIHRydWUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQjZ2V0RU9iamVjdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLAotCSAqICAgICAgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCXJldHVybiBnZXRFT2JqZWN0KG51bGwsIHVyaSwgbG9hZE9uRGVtYW5kKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldCNjcmVhdGVSZXNvdXJjZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCVJlc291cmNlIHJlc3VsdCA9IGRvQ3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJcmVzdWx0LnNldFRyYWNraW5nTW9kaWZpY2F0aW9uKHRydWUpOwotCQlnZXRSZXNvdXJjZXMoKS5hZGQocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlIGRvQ3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCh1cmkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYmFja3VwUmVxdWlyZWQoTWFwIG9wdGlvbnMpIHsKLQkJQm9vbGVhbiBiYWNrdXAgPSAoQm9vbGVhbikgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQkFDS19VUF9CRUZPUkVfU0FWRSk7Ci0JCXJldHVybiBiYWNrdXAgIT0gbnVsbCAmJiBiYWNrdXAuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhY2t1cChSZXNvdXJjZSByZXMpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuOwotCQkJT2JqZWN0IG9iamVjdCA9IHJlcy5nZXRDb250ZW50cygpLmdldCgwKTsKLQkJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkKLQkJCQkJfHwgb2JqZWN0IGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyIHx8IG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpCi0JCQkJcmV0dXJuOwotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCQlTdHJpbmcgYmFja3VwRGlyID0gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyAiLmJhayI7IC8vJE5PTi1OTFMtMSQKLQkJCVNpbXBsZURhdGVGb3JtYXQgZGF0ZUZvcm1hdHRlciA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KAotCQkJCQkieXlNTWRkSEhtbXNzLlMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlcyA9PSBsaWJyYXJ5LmVSZXNvdXJjZSgpKSB7Ci0JCQkJRGF0ZUZvcm1hdC5nZXRJbnN0YW5jZSgpLmZvcm1hdCgKLQkJCQkJCUNhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZSgpKTsKLQkJCQlGaWxlIGJhY2t1cEZpbGUgPSBuZXcgRmlsZShiYWNrdXBEaXIsCi0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUKLQkJCQkJCQkJKyAnXycKLQkJCQkJCQkJKyBkYXRlRm9ybWF0dGVyLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCQkJLmdldFRpbWUoKSkpOwotCQkJCWlmICghYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJYmFja3VwRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJfQotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSksIGJhY2t1cEZpbGUpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgcmVsYXRpdmVQYXRoID0gcmVzLmdldFVSSSgpLmRlcmVzb2x2ZSgKLQkJCQkJCWxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCkpLnRvRmlsZVN0cmluZygpOwotCQkJCUZpbGUgYmFja3VwRmlsZSA9IG5ldyBGaWxlKGJhY2t1cERpciwgcmVsYXRpdmVQYXRoCi0JCQkJCQkrICdfJwotCQkJCQkJKyBkYXRlRm9ybWF0dGVyCi0JCQkJCQkJCS5mb3JtYXQoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lKCkpKTsKLQkJCQlpZiAoIWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWJhY2t1cEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCX0KLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShuZXcgRmlsZShyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLCBiYWNrdXBGaWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCWhhbmRsZUV4Y2VwdGlvbihOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5iYWNrdXBFcnJvcl9tc2csIHJlcykpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVVUklNYXBwaW5ncyhFT2JqZWN0IGVPYmosIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0UmVzb3VyY2VNYW5hZ2VyKGVPYmoKLQkJCQkuZVJlc291cmNlKCkpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgcmVzTWdyLmVDb250YWluZXIoKSAhPSBudWxsKSB7Ci0JCQlFY29yZVV0aWwucmVtb3ZlKHJlc01ncik7Ci0JCX0KLQkJcmVzTWdyID0gZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQlpZihyZXNNZ3IgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJCQlyZXNNZ3IsIE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZU9iaiksCi0JCQkJCW51bGwsIHRydWUpOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsICYmIGRlc2MuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQoZGVzYy5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGVzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2xlYW5VcChyZW1vdmVkUmVzb3VyY2UsIG51bGwpOwotCX0KLQotCS8vIHByb3RlY3RlZCB2b2lkIGNsZWFuVXAoRU9iamVjdCBvYmosIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCS8vIHRyeSB7Ci0JLy8gLy8gcmVtb3ZlIGFsbCB0aGUgVVJJIG1hcHBpbmdzCi0JLy8gLy8KLQkvLyByZW1vdmVVUklNYXBwaW5ncyhvYmosIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkvLyB9Ci0JLy8gZmluYWxseSB7Ci0JLy8gUmVzb3VyY2UgcmVzb3VyY2UgPSBvYmouZVJlc291cmNlKCk7Ci0JLy8gaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRDb250ZW50cygpLmNvbnRhaW5zKG9iaikpIHsKLQkvLyByZXNvdXJjZS51bmxvYWQoKTsKLQkvLyBnZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVzb3VyY2UpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0Jdm9pZCBjbGVhblVwKFJlc291cmNlIHJlbW92ZWRSZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCS8vCi0JCQlpZiAocmVtb3ZlZFJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQkJcmVtb3ZlZFJlc291cmNlLnVubG9hZCgpOwotCQkJCXRyeSB7Ci0JCQkJCXJlbW92ZWRSZXNvdXJjZS5sb2FkKG51bGwpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHRoZSBmaWxlIG1pZ2h0IGFscmVhZHkgYmUgZGVsZXRlZCwgbW92ZWQgb3IgbmV2ZXIKLQkJCQkJLy8gY3JlYXJlZC4KLQkJCQkJLy8KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJRU9iamVjdCBvYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZW1vdmVkUmVzb3VyY2UpOwotCi0JCQkvLyBpZihvYmogPT0gbnVsbCkgcmV0dXJuOwotCQkJLy8gYm9vbGVhbiBjbGVhbkZvbGRlcjsKLQkJCS8vIGlmKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJLy8gY2xlYW5Gb2xkZXIgPSB0cnVlOwotCQkJLy8gfQotCQkJLy8gZWxzZSB7Ci0JCQkvLyBjbGVhbkZvbGRlciA9IGZhbHNlOwotCQkJLy8gfQotCi0JCQkvLyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdW1hVXJpQ29udmVydGVyID0KLQkJCS8vICgoTXVsdGlGaWxlVVJJQ29udmVydGVyKWdldFVSSUNvbnZlcnRlcigpKTsKLQkJCS8vIHVtYVVyaUNvbnZlcnRlci5nZXRSZXNvdXJjZU1hbmFnZXIoKS5yZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IocmVtb3ZlZFJlc291cmNlLmdldFVSSSgpLAotCQkJLy8gY2xlYW5Gb2xkZXIpOwotCi0JCQkvLyByZW1vdmUgYWxsIHRoZSBVUkkgbWFwcGluZ3MKLQkJCS8vCi0JCQlyZW1vdmVVUklNYXBwaW5ncyhvYmosIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQotCQkJLy8gaWYob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCS8vIGNsZWFuVXBSZXNvdXJjZURlc2NyaXB0b3JzKChQcm9jZXNzUGFja2FnZSlvYmopOwotCQkJLy8gfQotCi0JCQlyZW1vdmVkUmVzb3VyY2UudW5sb2FkKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlnZXRSZXNvdXJjZXMoKS5yZW1vdmUocmVtb3ZlZFJlc291cmNlKTsKLQkJCVVSSSBvbGRVUkkgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVtb3ZlZFJlc291cmNlKQotCQkJCQkuZ2V0T2xkVVJJKCk7Ci0JCQlpZiAob2xkVVJJICE9IG51bGwpIHsKLQkJCQlnZXRVUklUb1RlbXBVUklNYXAoKS5yZW1vdmUob2xkVVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhblVwKFByb2Nlc3NQYWNrYWdlIHByb2NQa2cpIHsKLQkJLy8gcmVtb3ZlIENvbnRlbnREZXNjcmlwdGlvbiBvZiBhbGwgUHJvY2Vzc0VsZW1lbnRzIGluIHRoaXMKLQkJLy8gUHJvY2Vzc1BhY2thZ2UKLQkJLy8KLQkJcmVtb3ZlQ29udGVudERlc2NyaXB0aW9ucyhwcm9jUGtnKTsKLQotCQlFY29yZVV0aWwucmVtb3ZlKHByb2NQa2cpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9jUGtnCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnRlbnREZXNjcmlwdGlvbnMoUHJvY2Vzc1BhY2thZ2UgcHJvY1BrZykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9jUGtnLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJUHJvY2Vzc0VsZW1lbnQgZWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5oYXNQcmVzZW50YXRpb24oZWxlbWVudCkKLQkJCQkJJiYgZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlUHJlc2VudGF0aW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY1BrZy5nZXRDaGlsZFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGtnID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZW1vdmVDb250ZW50RGVzY3JpcHRpb25zKChQcm9jZXNzUGFja2FnZSkgcGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByZXNlbnRhdGlvbihQcm9jZXNzRWxlbWVudCBlbGVtZW50KSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKS5lUmVzb3VyY2UoKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUoZWxlbWVudC5nZXRQcmVzZW50YXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhdmUoQ29sbGVjdGlvbiByZXNvdXJjZXMsIE1hcCBvcHRpb25zLCBib29sZWFuIHByZXBhcmVTYXZlKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zID09IG51bGwpIHsKLQkJCW9wdGlvbnMgPSBnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQlzYXZlKHJlcywgb3B0aW9ucywgcHJlcGFyZVNhdmUpOwotCQkJfQotCQkJc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcHRpb25zLnJlbW92ZShNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCQl9Ci0JfQotCi0JYm9vbGVhbiBzYXZlKFJlc291cmNlIHJlcywgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcHJlcGFyZVNhdmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJVHhSZWNvcmQgdHhSZWNvcmQgPSAoVHhSZWNvcmQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCk7Ci0JCUxpc3QgcmVzb3VyY2VzVG9Db21taXQgPSB0eFJlY29yZCAhPSBudWxsID8gdHhSZWNvcmQKLQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKSA6IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCU1ldGhvZEVsZW1lbnQgZU9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQlpZiAoZU9iaiAhPSBudWxsKSB7Ci0JCQkJaWYgKHByZXBhcmVTYXZlKSB7Ci0JCQkJCWlmIChlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jQ29tcCA9IChQcm9jZXNzQ29tcG9uZW50KSBlT2JqOwotCQkJCQkJUmVzb3VyY2UgY29udGVudCA9IHByb2NDb21wLmdldFByb2Nlc3MoKSAhPSBudWxsCi0JCQkJCQkJCSYmIENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCQkJCQkuaGFzUHJlc2VudGF0aW9uKHByb2NDb21wLmdldFByb2Nlc3MoKSkgPyBwcm9jQ29tcAotCQkJCQkJCQkuZ2V0UHJvY2VzcygpLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpCi0JCQkJCQkJCTogbnVsbDsKLQkJCQkJCWJvb2xlYW4gYWxyZWFkeU1vZGlmaWVkID0gY29udGVudCAhPSBudWxsCi0JCQkJCQkJCSYmIGNvbnRlbnQuaXNNb2RpZmllZCgpOwotCQkJCQkJcHJlcGFyZVNhdmUocHJvY0NvbXApOwotCQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCAmJiBjb250ZW50LmlzTW9kaWZpZWQoKQotCQkJCQkJCQkmJiAhYWxyZWFkeU1vZGlmaWVkKSB7Ci0JCQkJCQkJLy8gY29udGVudCBpcyBtb2RpZmllZCBhcyByZXN1bHQgb2YgcHJlcGFyZVNhdmUoKSwKLQkJCQkJCQkvLyBpdCBuZWVkcyB0byBiZSBzYXZlZCBhZnRlciBtb2RlbCBpcyBzYXZlZAotCQkJCQkJCS8vCi0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKGNvbnRlbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLmFkZFJlc291cmNlTWFuYWdlcihyZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChyZXMuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLT4gU3RhcnQgc2F2aW5nICIgKyByZXMpOwotCQkJCQlib29sZWFuIGJhY2t1cFJlcXVpcmVkID0gYmFja3VwUmVxdWlyZWQob3B0aW9ucyk7Ci0JCQkJCWlmIChiYWNrdXBSZXF1aXJlZCkgewotCQkJCQkJLy8gYmFjayB1cCByZXNvdXJjZSBiZWZvcmUgc2F2aW5nCi0JCQkJCQkvLwotCQkJCQkJYmFja3VwKHJlcyk7Ci0JCQkJCX0KLQotCQkJCQlpZiAocmVzb3VyY2VzVG9Db21taXQgIT0gbnVsbCkgewotCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlcykuc2V0VGVtcFVSSSh0eFJlY29yZAotCQkJCQkJCQkuZ2V0VHhJRCgpKTsKLQkJCQkJCXJlc291cmNlc1RvQ29tbWl0LmFkZChyZXMpOwotCQkJCQl9Ci0KLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuc2F2ZShyZXMsIG9wdGlvbnMpOwotCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPC0tLS0gU2F2ZWQgcmVzb3VyY2U6ICIgKyByZXMpOwotCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJaGFuZGxlRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSBhIHJlc291cmNlIG9mIHRoaXMgcmVzb3VyY2Ugc2V0IHdpdGggdGhlIGdpdmVuIHNhdmUgb3B0aW9ucwotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYXQgbGVhc3QgYSByZXNvdXJjZSBoYXMgYmVlbiBzYXZlZCBpbiB0aGlzIGNhbGwKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhdmUoUmVzb3VyY2UgcmVzLCBNYXAgb3B0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJLy8gY2xlYXIgYWxsIGVycm9yIG1hcmtlcnMgZm9yIHRoaXMgcmVzb3VyY2UKLS8vCQkvLwotLy8JCW1hcmtlck1hbmFuZ2VyLmNsZWFyTWFya2VycyhyZXMpOwotCi0JCWlmIChyZXMgPT0gbnVsbCB8fCByZXMuZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IGdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJYm9vbGVhbiBub3RGYWlsU2FmZSA9IG9wdGlvbnMuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCkgPT0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb24gc2F2ZWRSZXNvdXJjZXMgPSBudWxsOwotCQkJaWYobm90RmFpbFNhZmUpIHsKLQkJCQlzYXZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCX0KLQkJCWJvb2xlYW4gcmV0ID0gc2F2ZShyZXMsIG9wdGlvbnMsIHRydWUpOwotCQkJaWYocmV0ICYmIG5vdEZhaWxTYWZlKSB7Ci0JCQkJc2F2ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQlpZighY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJCWlmKG5vdEZhaWxTYWZlKSB7Ci0JCQkJCXNhdmVkUmVzb3VyY2VzLmFkZEFsbChjb2xsZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKG5vdEZhaWxTYWZlICYmIHJldCkgewotCQkJCS8vIHVwZGF0ZSByZXNvdXJjZSBjYWNoZWQgdGltZXN0YW1wcwotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCByZXNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCQkJfQotCQkJCX0JCQkJCQkJCQotCQkJfQotCQkJCi0JCQlyZXR1cm4gcmV0OwotCQl9IGZpbmFsbHkgewotCQkJb3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIG9ubHkgdGhlIG1vZGlmaWVkIHJlc291cmNlcyBpbiB0aGlzIHJlc291cmNlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQl0cnkgewotCQkJc2F2ZShvcHRpb25zLCBmYWxzZSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKWU7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcmV0dXJuIHJlc291cmNlcyB0aGF0IGhhZCBiZWVuIHNhdmVkIGJ5IHRoaXMgY2FsbAotCSAqIEB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIAotCSAqLwotCUNvbGxlY3Rpb24gc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gKFNldCkgb3B0aW9ucwotCQkJCS5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJVHhSZWNvcmQgdHhSZWNvcmQgPSAoVHhSZWNvcmQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlRYX1JFQ09SRCk7Ci0JCUxpc3QgcmVzb3VyY2VzVG9Db21taXQgPSB0eFJlY29yZCAhPSBudWxsID8gdHhSZWNvcmQKLQkJCQkuZ2V0UmVzb3VyY2VzVG9Db21taXQoKSA6IG51bGw7Ci0JCWlmIChtb2RpZmllZFJlc291cmNlcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJYm9vbGVhbiBjaGVja01vZGlmeSA9IE11bHRpRmlsZVhNSVNhdmVJbXBsLmNoZWNrTW9kaWZ5UmVxdWlyZWQob3B0aW9ucyk7Ci0JCUNvbGxlY3Rpb24gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0PFJlc291cmNlPiByZXNvdXJjZXNUb1NhdmUgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQlpZiAoY2hlY2tNb2RpZnkpIHsKLQkJCQljaGVja01vZGlmeShyZXNvdXJjZXNUb1NhdmUpOwotCQkJCWlmKHJlc291cmNlc1RvQ29tbWl0ICE9IG51bGwpIHsKLQkJCQkJLy8gY2hlY2sgZm9yIG91dC1vZi1zeW5jaCBvbmx5IGluIGZhaWwtc2FmZSBzYXZpbmcgZm9yIG5vdwotCQkJCQkvLwotCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5jaGVja091dE9mU3luY2gocmVzb3VyY2VzVG9TYXZlLCBvcHRpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlc1RvU2F2ZS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gaWYocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJaWYgKGJhY2t1cFJlcXVpcmVkKSB7Ci0JCQkJCS8vIGJhY2sgdXAgcmVzb3VyY2UgYmVmb3JlIHNhdmluZwotCQkJCQkvLwotCQkJCQliYWNrdXAocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmIChyZXNvdXJjZXNUb0NvbW1pdCAhPSBudWxsKSB7Ci0JCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSkuc2V0VGVtcFVSSSh0eFJlY29yZAotCQkJCQkJCS5nZXRUeElEKCkpOwotCQkJCQlyZXNvdXJjZXNUb0NvbW1pdC5hZGQocmVzb3VyY2UpOwotCQkJCX0KLQotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpKSB7Ci0JCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2F2ZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiBAcGFyYW0gc2F2ZUFsbAotCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZm9yY2Ugc2F2aW5nIGFsbCB0aGUgcmVzb3VyY2VzIGV2ZW4gaWYgdGhleSBhcmUgbm90Ci0JICogICAgICAgICAgICBtb2RpZmllZC4KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoTWFwIG9wdGlvbnMsIGJvb2xlYW4gc2F2ZUFsbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNhdmUob3B0aW9ucywgc2F2ZUFsbCwgZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzYXZlKE1hcCBvcHRpb25zLCBib29sZWFuIHNhdmVBbGwsIGJvb2xlYW4gZmFpbFNhZmUpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IG5ldyBIYXNoTWFwKGdldERlZmF1bHRTYXZlT3B0aW9ucygpKTsKLQkJfQotCi0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJTXVsdGlGaWxlU2F2ZVV0aWwuc2V0R3VpZChsaWJyYXJ5KTsKLQotCQlwcmVwYXJlU2F2ZShsaWJyYXJ5KTsKLQotCQkvLyBkbyBjbGVhbi11cCB0aGlzIHJlc291cmNlIHNldCBiZWZvcmUgc2F2aW5nCi0JCS8vCi0JCWNsZWFuVXAoKTsKLQotCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdW1hVXJpQ29udmVydGVyID0gKChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpKTsKLQkJdW1hVXJpQ29udmVydGVyLnNldExpYnJhcnlVUklzKGxpYnJhcnkpOwotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCW9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVQZXJzaXN0ZXIgcGVyc2lzdGVyID0gbnVsbDsKLQkJaWYgKGZhaWxTYWZlKSB7Ci0JCQlwZXJzaXN0ZXIgPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFCi0JCQkJCS5nZXRGYWlsU2FmZVBlcnNpc3RlcihvcHRpb25zKTsKLQkJCW9wdGlvbnMgPSBwZXJzaXN0ZXIuZ2V0U2F2ZU9wdGlvbnMoKTsKLQkJfQotCQl0cnkgewotCQkJTGlzdCBsaXN0ID0gZ2V0UmVzb3VyY2VzKCk7Ci0JCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGFydCBzYXZpbmcgIiArIHNpemUgKyAiIGxvYWRlZCByZXNvdXJjZXM6ICIKLQkJCS8vICsgbGlzdCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCWJvb2xlYW4gYmFja3VwUmVxdWlyZWQgPSBiYWNrdXBSZXF1aXJlZChvcHRpb25zKTsKLQkJCUxpc3Qgc2F2ZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUxpc3QgbW92ZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBsaXN0LmdldChpKTsKLQotCQkJCSBpZiAocmVzLmlzTW9kaWZpZWQoKSAmJiAKLQkJCQkJCSBNdWx0aUZpbGVTYXZlVXRpbC5hZGp1c3RMb2NhdGlvblJlcXVpcmVkKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlcykpIHsKLQkJCQkJIG1vdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJIH0KLQotCQkJCU1ldGhvZEVsZW1lbnQgZU9iaiA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCQkJaWYgKGVPYmogIT0gbnVsbCAmJiBlT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlpZiAoc2F2ZUFsbCB8fCByZXMuaXNNb2RpZmllZCgpKSB7Ci0vLwkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLT4gU3RhcnQgc2F2aW5nICIgKyByZXMpOwotLy8JCQkJCQlpZiAoZmFpbFNhZmUpIHsKLS8vCQkJCQkJCXNhdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0vLwkJCQkJCX0gZWxzZSB7Ci0vLwkJCQkJCQlpZiAoYmFja3VwUmVxdWlyZWQpIHsKLS8vCQkJCQkJCQkvLyBiYWNrIHVwIHJlc291cmNlIGJlZm9yZSBzYXZpbmcKLS8vCQkJCQkJCQkvLwotLy8JCQkJCQkJCWJhY2t1cChyZXMpOwotLy8JCQkJCQkJfQotLy8KLS8vCQkJCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzLCBvcHRpb25zKSkgewotLy8JCQkJCQkJCXNhdmVkUmVzb3VyY2VzLmFkZChyZXMpOwotLy8JCQkJCQkJCWlmKHJlcyBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotLy8JCQkJCQkJCQkoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXMpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLS8vCQkJCQkJCQl9Ci0vLwkJCQkJCQl9Ci0vLwkJCQkJCX0KLS8vCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCI8LS0tLSBTYXZlZCByZXNvdXJjZTogIiArIHJlcyk7Ci0JCQkJCQkKLQkJCQkJCXNhdmVSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKCFzYXZlUmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJCVJlc291cmNlIGxpYlJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCQkJaWYoIXNhdmVSZXNvdXJjZXMuY29udGFpbnMobGliUmVzb3VyY2UpICYmIFBlcnNpc3RlbmNlVXRpbC5jaGVja1Rvb2xWZXJzaW9uKGxpYlJlc291cmNlKSAhPSAwKSB7Ci0JCQkJCXNhdmVSZXNvdXJjZXMuYWRkKGxpYlJlc291cmNlKTsKLQkJCQl9Ci0JCQkJaWYoTXVsdGlGaWxlWE1JU2F2ZUltcGwuY2hlY2tNb2RpZnlSZXF1aXJlZChvcHRpb25zKSkgewotCQkJCQljaGVja01vZGlmeShzYXZlUmVzb3VyY2VzKTsKLQkJCQl9Ci0JCQkJaWYgKGZhaWxTYWZlKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlzYXZlKHNhdmVSZXNvdXJjZXMsIG9wdGlvbnMsIGZhbHNlKTsKLQkJCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkJCXBlcnNpc3Rlci5hZGp1c3RMb2NhdGlvbihtb3ZlUmVzb3VyY2VzKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJCQkJdGhyb3cgZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhdmVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKHJlc291cmNlLCBvcHRpb25zKSkgewotCQkJCQkJCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQkJCQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51cGRhdGVUaW1lU3RhbXBzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG1vdmVSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5hZGp1c3RMb2NhdGlvbihyZXNvdXJjZSwKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJCQl9Ci0JCQkJCUNvbGxlY3Rpb24gc2F2ZWQgPSBzYXZlTW9kaWZpZWRSZXNvdXJjZXMob3B0aW9ucyk7Ci0JCQkJCWlmIChzYXZlZCAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlZC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQkJCQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJdGhyb3cgZXhjZXB0aW9uOwotCQl9IGZpbmFsbHkgewotCQkJb3B0aW9ucy5yZW1vdmUoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBvcGVuIGxpYnJhcnkgdW5kZXIgYSBuZXcgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9jYXRpb24KLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgdG8KLQkgKiBAcGFyYW0gaWYKLQkgKiAgICAgICAgICAgIHRydWUsIHJlZ2VuZXJhdGVHVUlEIHJlZ2VuZXJhdGUgR1VJRCBmb3IgYWxsIE1ldGhvZEVsZW1lbnRzIGluCi0JICogICAgICAgICAgICB0aGUgb3BlbiBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUFzKFN0cmluZyBuZXdMb2NhdGlvbiwgYm9vbGVhbiByZWdlbmVyYXRlR1VJRCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbG9hZCBhbGwgdGhlIHJlc291cmNlcyBpbiBtZW1vcnkKLQkJLy8KLQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlc1Rhc2tfbmFtZSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnZW5lcmF0ZUdVSUQgJiYgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGFuZ2UgVVJJIG9mIGFsbCBsb2FkZWQgcmVzb3VyY2VzIGZvciBuZXcgbG9jYXRpb24KLQkJLy8KLQkJVVJJIG9sZERpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKQotCQkJCS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkKLQkJCQkrIEZpbGUuc2VwYXJhdG9yKTsKLQkJVVJJIG5ld0RpciA9IFVSSS5jcmVhdGVGaWxlVVJJKG5ld0xvY2F0aW9uICsgRmlsZS5zZXBhcmF0b3IpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlc291cmNlLnNldFVSSShyZXNvdXJjZS5nZXRVUkkoKS5yZXBsYWNlUHJlZml4KG9sZERpciwgbmV3RGlyKSk7Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgUmVzb3VyY2VNYW5hZ2VyCi0JCS8vCi0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpCi0JCQkJLmdldFJlc291cmNlTWFuYWdlcigpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJfQotCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnNldFRhc2tOYW1lKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJc2F2ZShudWxsLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdW5sb2FkV2l0aG91dFJlbW92ZShNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlyZXNvdXJjZS51bmxvYWRXaXRob3V0UmVtb3ZlKCk7Ci0JCWlmKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWlmKGxpYiAhPSBudWxsKSB7Ci0JCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLnJlbW92ZShlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCUxpc3QgcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IGxpc3QgPSBnZXRSZXNvdXJjZXMoKTsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVJlc291cmNlIHJlcyA9IChSZXNvdXJjZSkgbGlzdC5nZXQoaSk7Ci0JCQlib29sZWFuIHJlbW92ZSA9IGZhbHNlOwotCQkJaWYgKHJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiBlbXB0eSByZXNvdXJjZTogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlNZXRob2RFbGVtZW50IGVPYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXMpOwotCQkJCWlmIChlT2JqID09IG51bGwKLQkJCQkJCXx8IChlT2JqICE9IGxpYnJhcnkgJiYgZU9iai5lQ29udGFpbmVyKCkgPT0gbnVsbCkpIHsKLQkJCQkJaWYgKGVPYmogPT0gbnVsbCkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLmNsZWFuVXAoKTogcmVzb3VyY2Ugd2l0aG91dCBhbnkgTWV0aG9kRWxlbWVudDogIiArIHJlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJlbW92ZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJLy8gc29tZSByZXNvdXJjZXMgbWlnaHQgYmUgbG9hZGVkIGRpcmVjdGx5LCBub3QgdGhydSBpdHMKLQkJCQkJLy8gY29udGFpbmVyLiBUaGVyZWZvcmUsIHdlIGNhbm5vdCBhc3N1bWUKLQkJCQkJLy8gdGhhdCBhIG9iamVjdCB3aXRob3V0IGEgY29udGFpbmVyIGluIGEgbG9hZGVkIHJlc291cmNlIGlzCi0JCQkJCS8vIGEgcmVtb3ZlZCBvYmplY3QuCi0JCQkJCS8vCi0JCQkJCWVsc2UgaWYgKGVPYmogIT0gbGlicmFyeSAmJiBlT2JqLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuY2xlYW5VcCgpOiByZXNvdXJjZSB3aXRob3V0IGEgY29udGFpbmVyOiAiICsgcmVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbW92ZSkgewotCQkJCS8vIFRoaXMgaXMgYSByZW1vdmVkIG9iamVjdC4gQWRkIGl0cyBwYXRoIHRvIHRoZSBsaXN0IGZvcgotCQkJCS8vIHJlbW92aW5nIGl0cyBmaWxlcyBsYXRlci4KLQkJCQkvLwotCQkJCXJlbW92ZWRSZXNvdXJjZXMuYWRkKHJlcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBkbyBjbGVhbi11cAotCQkvLwotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIk11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5jbGVhblVwKCk6IHJlbW92ZWQgcmVzb3VyY2VzOiAiICsgcmVtb3ZlZFJlc291cmNlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZW1vdmVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyByZW1vdmUgUmVzb3VyY2VEZXNjcmlwdG9yIG9mIHRoZSByZW1vdmVkIHJlc291cmNlCi0JCQkJLy8KLQkJCQljbGVhblVwKHJlcyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCS8vIGdldFJlc291cmNlcygpLnJlbW92ZUFsbChyZW1vdmVkUmVzb3VyY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJlcGFyZXMgdGhlIGxpYnJhcnkgZm9yIHNhdmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGxpYnJhcnkgYWxyZWFkeSBoYXMgYSBSZXNvdXJjZU1hbmFnZXIKLQkJLy8gaWYgbm90LCBjcmVhdGUgUmVzb3VyY2VNYW5hZ2VyIGZvciBpdAotCQkvLwotCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWJyYXJ5Ci0JCQkJLmVSZXNvdXJjZSgpOwotCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwuYWRkUmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYobGliUmVzTWdyICE9IG51bGwpIHsKLQkJCU11bHRpRmlsZVNhdmVVdGlsLnJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihsaWJSZXNNZ3IsIGxpYnJhcnksCi0JCQkJCXJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQl9Ci0KLQkJTGlzdCBtb2RlbHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaW50IHNpemUgPSBtb2RlbHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcHJlcGFyZVNhdmUoKE1ldGhvZFBsdWdpbikgbW9kZWxzLmdldChpKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJY2xlYW5VcCgoTWV0aG9kUGx1Z2luKSBtb2RlbHMuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcChNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UoCi0JCQkJCXBsdWdpbiwgUFJPQ0VTU19QQUNLQUdFX1BBVEhTW2ldKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWNsZWFuVXBQcm9jZXNzZXMocGtnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlU2F2ZShNZXRob2RQbHVnaW4gbW9kZWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBQUk9DRVNTX1BBQ0tBR0VfUEFUSFMubGVuZ3RoOyBpKyspIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZSgKLQkJCQkJbW9kZWwsIFBST0NFU1NfUEFDS0FHRV9QQVRIU1tpXSk7Ci0JCQlpZiAocGtnICE9IG51bGwpIHsKLQkJCQlwcmVwYXJlU2F2ZShwa2cpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBwcm9jZXNzIHBhY2thZ2VzIG9mIHVudXNlZCBhY3Rpdml0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBwa2cKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBQcm9jZXNzZXMoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXAgPSAoUHJvY2Vzc0NvbXBvbmVudCkgb2JqOwotCQkJCUxpc3QgcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvY0NvbXAuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJCWdldFJlbW92ZWRQYWNrYWdlcygoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIHBhY2thZ2VzKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFja2FnZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRSZW1vdmVkUGFja2FnZXMoUHJvY2Vzc1BhY2thZ2UgcGtnLAotCQkJTGlzdCByZW1vdmVkUGFja2FnZXMpIHsKLQkJLy8gZmluZCBhY3Rpdml0eQotCQkvLwotCQlBY3Rpdml0eSBhY3QgPSBnZXRBY3Rpdml0eShwa2cpOwotCi0JCWlmIChhY3QgPT0gbnVsbCB8fCBnZXRQYXJlbnQoYWN0KSA9PSBudWxsKSB7Ci0JCQkvLyBJbnZhbGlkIHByb2Nlc3MgcGFja2FnZS4gSXQgZG9lcyBub3QgY29udGFpbiBhbnkgYWN0aXZpdHkuCi0JCQkvLyBBZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZC4KLQkJCS8vCi0JCQlyZW1vdmVkUGFja2FnZXMuYWRkKHBrZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0UmVtb3ZlZFBhY2thZ2VzKChQcm9jZXNzUGFja2FnZSkgZWxlbWVudCwKLQkJCQkJCQlyZW1vdmVkUGFja2FnZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQkvLyBmaW5kIGFjdGl2aXR5Ci0JCS8vCi0JCUFjdGl2aXR5IGFjdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJYWN0ID0gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBhY3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldFBhcmVudChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJLy8gSXRlbVByb3ZpZGVyQWRhcHRlciBhZGFwdGVyID0gKEl0ZW1Qcm92aWRlckFkYXB0ZXIpCi0JCS8vIFRuZ1V0aWwuZ2V0QWRhcHRlcihlLCBJQlNJdGVtUHJvdmlkZXIuY2xhc3MpOwotCQkvLyByZXR1cm4gYWRhcHRlciA9PSBudWxsID8gbnVsbCA6IGFkYXB0ZXIuZ2V0UGFyZW50KGUpOwotCi0JCXJldHVybiBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgcHJvY2VzcyBwYWNrYWdlIGZvciB0aG9zZSBhY3Rpdml0aWVzIHRoYXQgc3RpbGwgZG9uJ3QgYmVsb25nIHRvCi0JICogYW55IHByb2Nlc3MgcGFja2FnZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJlcGFyZVNhdmUoUHJvY2Vzc1BhY2thZ2UgcGtnKSB7Ci0JCUxpc3QgbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gbGlzdC5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCXByZXBhcmVTYXZlKChQcm9jZXNzQ29tcG9uZW50KSBvYmopOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVTYXZlKFByb2Nlc3NDb21wb25lbnQgcHJvY0NvbXApIHsKLQkJUHJvY2VzcyBwcm9jID0gcHJvY0NvbXAuZ2V0UHJvY2VzcygpOwotCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycyhwcm9jKTsKLQkJCXByZXBhcmVTYXZlKHByb2MpOwotCi0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwcm9jQ29tcCk7Ci0KLQkJCUxpc3QgZGFuZ2xpbmdQa2dzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdChwcm9jQ29tcC5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IChPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBlbGVtZW50OwotCQkJCQlyZW9yZ2FuaXplKHBrZywgZGFuZ2xpbmdQa2dzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNsZWFuIHVwIGRhbmdsaW5nIFByb2Nlc3NQYWNrYWdlcwotCQkJLy8KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGRhbmdsaW5nUGtncy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQljbGVhblVwKChQcm9jZXNzUGFja2FnZSkgaXRlci5uZXh0KCkpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAvKioKLQkvLyAqIEBwYXJhbSBhY3Rpdml0eQotCS8vICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NvY2lhdGVBbGxBZGFwdGVycyhBY3Rpdml0eSBhY3Rpdml0eSkgewotCS8vIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0KLQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCS8vIEl0ZW1Qcm92aWRlckFkYXB0ZXIgYWRhcHRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKQotCS8vIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KGFjdGl2aXR5LCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXIuZ2V0Q2hpbGRyZW4oYWN0aXZpdHkpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkvLyBpZihlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkvLyBhc3NvY2lhdGVBbGxBZGFwdGVycygoQWN0aXZpdHkpIGVsZW1lbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmVwYXJlU2F2ZShBY3Rpdml0eSBhY3Rpdml0eSkgewotCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGFjdGl2aXR5LmVDb250YWluZXIoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0KLQkJLy8gYWRkIG5ldyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgbm9uLWFjdGl2aXR5IGJyZWFrZG93biBlbGVtZW50cyBvZiB0aGUKLQkJLy8gYWN0aXZpdHkgdG8gaXRzIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgJiYgZWxlbWVudC5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCXBhcmVudFBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoKFByb2Nlc3NFbGVtZW50KSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBuZXcgV29ya09yZGVyIG9iamVjdHMgb3IgcmVtb3ZlIHVudXNlZCBXb3JrT3JkZXIgb2JqZWN0cyBvZiB0aGlzCi0JCS8vIGFjdGl2aXR5Ci0JCS8vCi0JCWZvciAoV29ya09yZGVyIHdvcmtPcmRlciA6IGFjdGl2aXR5LmdldExpbmtUb1ByZWRlY2Vzc29yKCkpIHsKLQkJCWlmICh3b3JrT3JkZXIuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQlpZiAod29ya09yZGVyLmdldFByZWQoKSAhPSBudWxsCi0JCQkJCQkmJiBnZXRQYXJlbnQod29ya09yZGVyLmdldFByZWQoKSkgIT0gbnVsbCkgewotCQkJCQlwYXJlbnRQa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKHdvcmtPcmRlcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAod29ya09yZGVyLmdldFByZWQoKSA9PSBudWxsCi0JCQkJCQl8fCBnZXRQYXJlbnQod29ya09yZGVyLmdldFByZWQoKSkgPT0gbnVsbCkgewotCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiSW52YWxpZCBXb3JrT3JkZXI6ICIgKyB3b3JrT3JkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcGFyZW50UGtnLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZSh3b3JrT3JkZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZWQgdW51c2VkIGRpYWdyYW1zCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBhcmVudFBrZy5nZXREaWFncmFtcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIGl0ZXIubmV4dCgpOwotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBkaWFncmFtLmdldFNlbWFudGljTW9kZWwoKTsKLQkJCWlmIChicmlkZ2UgaW5zdGFuY2VvZiBVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSBicmlkZ2UpCi0JCQkJCQkuZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkKLQkJCQkJCSYmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSAmJiBnZXRQYXJlbnQoKEFjdGl2aXR5KSBlbGVtZW50KSA9PSBudWxsKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBzaXplID0gZWxlbWVudHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJT2JqZWN0IGUgPSBlbGVtZW50cy5nZXQoaSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBlOwotCQkJCWlmIChhY3QuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCQkuY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQkJCQkJcGtnLnNldE5hbWUoYWN0LmdldE5hbWUoKSk7Ci0JCQkJCXBrZy5nZXRQcm9jZXNzRWxlbWVudHMoKS5hZGQoYWN0KTsKLQkJCQkJTGlzdCBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhY3QuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5zaXplKCk7IGorKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGFjdC5nZXRCcmVha2Rvd25FbGVtZW50cygpLmdldChqKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJZGVzY3JpcHRvcnMuYWRkKG9iaik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLmFkZEFsbChkZXNjcmlwdG9ycyk7Ci0KLQkJCQkJcGFyZW50UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzIHBhY2thZ2UgY3JlYXRlZCBmb3IgYWN0aXZpdHk6Ci0JCQkJCS8vICciICsgYWN0LmdldE5hbWUoKSArICInIik7Ci0JCQkJfQotCQkJCXByZXBhcmVTYXZlKGFjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNsZWFuVXBEYW5nbGluZ0Rlc2NyaXB0b3JzKFByb2Nlc3NQYWNrYWdlIHBrZykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwa2cuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50Ci0JCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudCkgZWxlbWVudCkuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkgewotCQkJCWJvb2xlYW4gcmVtb3ZlID0gZmFsc2U7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlpZiAoQXNzb2NpYXRpb25IZWxwZXIuZ2V0VGVhbVByb2ZpbGVzKAotCQkJCQkJCShSb2xlRGVzY3JpcHRvcikgZWxlbWVudCkuaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQkJCWlmIChBc3NvY2lhdGlvbkhlbHBlci5nZXREZWxpdmVyYWJsZURlc2NyaXB0b3JzKAotCQkJCQkJCShXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmlzRW1wdHkoKSkgewotCQkJCQkJcmVtb3ZlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRlYW1Qcm9maWxlKSB7Ci0JCQkJCWlmICgoKFRlYW1Qcm9maWxlKSBlbGVtZW50KS5nZXRTdXBlclRlYW0oKSA9PSBudWxsKSB7Ci0JCQkJCQlyZW1vdmUgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAocmVtb3ZlKSB7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTW92ZXMgdGhlIHByb2Nlc3MgcGFja2FnZXMgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uIGluIHRoZSB0cmVlIGlmIG5lZWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGtnCi0JICogQHBhcmFtIGRhbmdsaW5nUGtncwotCSAqLwotCXByaXZhdGUgdm9pZCByZW9yZ2FuaXplKFByb2Nlc3NQYWNrYWdlIHBrZywgTGlzdCBkYW5nbGluZ1BrZ3MpIHsKLQkJQWN0aXZpdHkgYWN0ID0gZ2V0QWN0aXZpdHkocGtnKTsKLQkJaWYgKGFjdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFja2FnZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgYWN0aXZpdHkncyBuYW1lCi0JCS8vCi0JCWlmICghcGtnLmdldE5hbWUoKS5lcXVhbHMoYWN0LmdldE5hbWUoKSkpIHsKLQkJCXBrZy5zZXROYW1lKGFjdC5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBvZiBwa2cgaXMgYWN0dWFsbHkgaG9sZGluZyB0aGUgcGFyZW50IGFjdGl2aXR5Ci0JCS8vIG9mIGFjdAotCQkvLwotCQlFT2JqZWN0IHBhcmVudEFjdCA9IChFT2JqZWN0KSBnZXRQYXJlbnQoYWN0KTsKLQotCQlpZiAocGFyZW50QWN0ID09IG51bGwpIHsKLQkJCS8vIGNsZWFuVXBSZXNvdXJjZURlc2NyaXB0b3JzKHBrZyk7Ci0JCQkvLyBjbGVhblVwKHBrZyk7Ci0JCQkvLyByZXR1cm47Ci0JCQlkYW5nbGluZ1BrZ3MuYWRkKHBrZyk7Ci0JCX0gZWxzZSBpZiAocGFyZW50QWN0ICE9IGdldEFjdGl2aXR5KChQcm9jZXNzUGFja2FnZSkgcGtnLmVDb250YWluZXIoKSkpIHsKLQkJCS8vIG1vdmUgdGhlIHBhY2thZ2UgdG8gdGhlIHJpZ2h0IGxvY2F0aW9uLCB1bmRlciB0aGUgcHJvY2VzcyBwYWNrYWdlCi0JCQkvLyBvZiBwYXJlbnRBY3QKLQkJCS8vCi0JCQlQcm9jZXNzUGFja2FnZSBwYXJlbnRQa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIHBhcmVudEFjdC5lQ29udGFpbmVyKCk7Ci0JCQlwYXJlbnRQa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwa2cpOwotCQl9Ci0KLQkJaWYgKHBhcmVudEFjdCAhPSBudWxsKSB7Ci0JCQljbGVhblVwRGFuZ2xpbmdEZXNjcmlwdG9ycyhwa2cpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJcmVvcmdhbml6ZSgoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQsIGRhbmdsaW5nUGtncyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTWFwPFN0cmluZywgRU9iamVjdD4gZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpIHsKLQkJaWYgKGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgRU9iamVjdD4oKTsKLQkJfQotCQlyZXR1cm4gZ3VpZFRvTWV0aG9kRWxlbWVudE1hcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwjZU5vdGlmeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5lTm90aWZ5KG5vdGlmaWNhdGlvbik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFCi0JCQkJCS5sb2coIkVSUk9SIG5vdGlmeWluZyBjaGFuZ2VzOiByZXNvdXJjZVNldD0iICsgdGhpcyArICIsIG5vdGlmaWNhdGlvbj0iICsgbm90aWZpY2F0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1hcmtlcihFeGNlcHRpb24gZSkgewotCQl0cnkgewotCQkJLy8gaW5zZXJ0IHByb2JsZW0gbWFya2VyCi0JCQkvLwotCQkJbWFya2VyTWFuYW5nZXIubm90aWZ5RXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCWlmIChNdWx0aUZpbGVTYXZlVXRpbC5ERUJVRykgewotCQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9hZGluZyhib29sZWFuIGIpIHsKLQkJbG9hZGluZyA9IGI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklFeGNlcHRpb25Db2xsZWN0b3IjY29sbGVjdChqYXZhLmxhbmcuRXhjZXB0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUV4Y2VwdGlvbihFeGNlcHRpb24gZSkgewotCQlpZiAobG9hZGluZ1Jlc291cmNlTWFuYWdlclRyZWUpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgUmVzb2x2ZUV4Y2VwdGlvbikgewotCQkJCWlmICgoKFJlc29sdmVFeGNlcHRpb24pIGUpLmV4Y2VwdGlvbigpIGluc3RhbmNlb2YgTXVsdGlGaWxlSU9FeGNlcHRpb24pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0cnkgewotCQkJYWRkTWFya2VyKGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vCi0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCkgewotCQlpZihyZXNvbHZlZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChyZXNvbHZlZCk7Ci0JCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnB1dChndWlkLCAoRU9iamVjdCkgcmVzb2x2ZWQpOwotCQkJfQotCQl9Ci0JCW1hcmtlck1hbmFuZ2VyLnByb3h5UmVzb2x2ZWQocHJveHksIHJlc29sdmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0QnlHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoRU9iamVjdCkgZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLmdldChndWlkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSVVtYVJlc291cmNlU2V0I2dldEVPYmplY3Qob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldEVPYmplY3QoRU9iamVjdCByZXNvbHZlciwgVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJLy8gbG9uZyBzdGFydDsKLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuUFJPRklMRSkgewotCQkvLyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyB9Ci0KLQkJVVJJIG5vcm1hbGl6ZWQgPSAoKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpLm5vcm1hbGl6ZSgKLQkJCQl1cmksIHJlc29sdmVyKTsKLQkJaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCkgewotCQkJLy8gd29yay1hcm91bmQgdG8gbG9vayB1cCBmb3Igb2JqZWN0IGJ5IGl0cyBHVUlEIGluIGNhc2UgaXQgaGFkIGJlZW4KLQkJCS8vIG1vdmVkIHRvIG90aGVyIHJlc291cmNlCi0JCQkvLwotCQkJU3RyaW5nIGd1aWQgPSB1cmkuZnJhZ21lbnQoKTsKLQkJCUVPYmplY3QgZU9iamVjdCA9IGdldEVPYmplY3RCeUdVSUQoZ3VpZCk7Ci0JCQlpZiAoZU9iamVjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQl9Ci0KLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5ub3JtYWxpemVVUklFcnJvcl9tc2csCi0JCQkJCXVyaSk7Ci0JCQl0aHJvdyBuZXcgVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uKHVyaSwgbXNnKTsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKG5vcm1hbGl6ZWQudHJpbUZyYWdtZW50KCksIGxvYWRPbkRlbWFuZCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZnJhZ21lbnQgPSBub3JtYWxpemVkLmZyYWdtZW50KCk7Ci0JCQlpZiAoZnJhZ21lbnQgPT0gbnVsbCB8fCBmcmFnbWVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCX0KLQkJCUVPYmplY3QgZU9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QoZnJhZ21lbnQpOwotCQkJaWYgKGVPYmplY3QgPT0gbnVsbCAmJiAhZnJhZ21lbnQuZXF1YWxzKHVyaS5hdXRob3JpdHkoKSkpIHsKLQkJCQkvLyB3b3JrLWFyb3VuZCB0byBsb29rIHVwIGZvciBvYmplY3QgYnkgaXRzIEdVSUQgaW4gY2FzZSBpdCBoYWQKLQkJCQkvLyBiZWVuIG1vdmVkCi0JCQkJLy8KLQkJCQlyZXR1cm4gZ2V0RU9iamVjdEJ5R1VJRChmcmFnbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuUFJPRklMRSkgewotCQkvLwkJCQotCQkvLyB9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4Y2VwdGlvbnMuCi0JLy8gKi8KLQkvLyBwdWJsaWMgTGlzdCBnZXRFeGNlcHRpb25zKCkgewotCS8vIHJldHVybiBleGNlcHRpb25zOwotCS8vIH0KLQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcykgewotCQlpbnQgbWF4ID0gb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgLSAxOwotCQlpZiAobWF4IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKTsKLQkJSGFzaFNldCBsb2FkZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJZm9yIChpbnQgaSA9IG1heDsgaSA+IC0xOyBpLS0pIHsKLQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBvcHBvc2l0ZUZlYXR1cmVzCi0JCQkJCQkJCS5nZXQoaSkpLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCQkJCWlmIChlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQkJCQlpZiAoZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIGVsZW1lbnQKLQkJCQkJCQkJCQkuZUdldChlRmVhdHVyZSk7Ci0JCQkJCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJZWxlbWVudC5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKExpc3Qgb3Bwb3NpdGVGZWF0dXJlcywgU2V0IGRlbGV0ZWRHVUlEcykgewotCQlpbnQgbWF4ID0gb3Bwb3NpdGVGZWF0dXJlcy5zaXplKCkgLSAxOwotCQlpZiAobWF4IDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnZhbHVlcygpKTsKLQkJSGFzaFNldCBsb2FkZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXdoaWxlICghZWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXJFT2JqZWN0ID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCk7Ci0JCQkJCWZvciAoaW50IGkgPSBtYXg7IGkgPiAtMTsgaS0tKSB7Ci0JCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKChPcHBvc2l0ZUZlYXR1cmUpIG9wcG9zaXRlRmVhdHVyZXMKLQkJCQkJCQkJLmdldChpKSk7Ci0JCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJCQkJaWYgKGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJCQkJCWlmIChlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgZWxlbWVudAotCQkJCQkJCQkJCS5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgewotCQkJCQkJCQkJYm9vbGVhbiByZXNvbHZlID0gZmFsc2U7Ci0JCQkJCQkJCQljaGVja19yZXNvbHZlOiBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkuYmFzaWNJdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgaXRlcmF0b3IKLQkJCQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJCQkJaWYgKGUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkKLQkJCQkJCQkJCQkJCQkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQkJcmVzb2x2ZSA9IHRydWU7Ci0JCQkJCQkJCQkJCQlicmVhayBjaGVja19yZXNvbHZlOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc29sdmUpIHsKLQkJCQkJCQkJCQlDb2xsZWN0aW9uPE9iamVjdD4gZGVsZXRlZEVsZW1lbnRzID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Ci0JCQkJCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCQlPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCQkJCQkJaWYobyBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgZGVsZXRlZEdVSURzLmNvbnRhaW5zKCgoTWV0aG9kRWxlbWVudCkgbykuZ2V0R3VpZCgpKSkgewotCQkJCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlmb3IgKE9iamVjdCBlIDogZGVsZXRlZEVsZW1lbnRzKSB7Ci0JCQkJCQkJCQkJCWlmKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0Lm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgZSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9CQkJCQkJCQkJCQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlLCBmYWxzZSk7Ci0JCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCQkJCQkJSW50ZXJuYWxFT2JqZWN0IGUgPSAoSW50ZXJuYWxFT2JqZWN0KSB2YWx1ZTsKLQkJCQkJCQkJCWlmIChlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJCQlTdHJpbmcgZ3VpZCA9IGUuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCQkJCQlpZiAoZGVsZXRlZEdVSURzLmNvbnRhaW5zKGd1aWQpKSB7Ci0JCQkJCQkJCQkJCU9iamVjdCBvID0gZWxlbWVudC5lR2V0KGVGZWF0dXJlKTsKLQkJCQkJCQkJCQkJaWYob3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3Qub3Bwb3NpdGVBZGQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQob3Bwb3NpdGVGZWF0dXJlLCBvKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGdldHMgdGhlIG5ld2x5IGxvYWRlZCBlbGVtZW50cyB0byBsb2FkIHRoZWlyIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkvLwotCQkJbG9hZGVkRWxlbWVudHMuYWRkQWxsKGVsZW1lbnRzKTsKLQkJCWVsZW1lbnRzID0gbmV3IEFycmF5TGlzdChnZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkudmFsdWVzKCkpOwotCQkJZWxlbWVudHMucmVtb3ZlQWxsKGxvYWRlZEVsZW1lbnRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJcmV0dXJuIG1hcmtlck1hbmFuZ2VyLmhhc1VucmVzb2x2ZWRQcm94eSgpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0VVJJVG9UZW1wVVJJTWFwKCkgewotCQlpZiAoVVJJVG9UZW1wVVJJTWFwID09IG51bGwpIHsKLQkJCVVSSVRvVGVtcFVSSU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQotCQlyZXR1cm4gVVJJVG9UZW1wVVJJTWFwOwotCX0KLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyIGdldE1hcmtlck1hbmFuZ2VyKCkgewotCQlyZXR1cm4gbWFya2VyTWFuYW5nZXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQlpZighcmVzb3VyY2VzLmlzRW1wdHkoKSkgewotCQkJUmVzb3VyY2VbXSByZXNvdXJjZUFycmF5ID0gbmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldOwotCQkJcmVzb3VyY2VzLnRvQXJyYXkocmVzb3VyY2VBcnJheSk7Ci0JCQljaGVja01vZGlmeShyZXNvdXJjZUFycmF5LCBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLypNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCkqLyk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2NoZWNrTW9kaWZ5KG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VbXSwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeShSZXNvdXJjZVtdIHJlc291cmNlcywgT2JqZWN0IGNvbnRleHQpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewkJCi0JCU11bHRpRmlsZVNhdmVVdGlsLmRvQ2hlY2tNb2RpZnkoQXJyYXlzLmFzTGlzdChyZXNvdXJjZXMpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I2NoZWNrTW9kaWZ5KGphdmEudXRpbC5Db2xsZWN0aW9uPEVPYmplY3Q+LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb248RU9iamVjdD4gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KSB7Ci0JCUhhc2hTZXQgcGF0aFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVPYmplY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBvLmVSZXNvdXJjZSgpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpID09IHRoaXMpIHsKLQkJCQlNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgbWZSZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlOwotCQkJCWlmKCFtZlJlc291cmNlLmhhc1RlbXBVUkkoKSkgewotCQkJCQlTdHJpbmcgcGF0aCA9IG1mUmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQkJCXBhdGhTZXQuYWRkKHBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZihwYXRoU2V0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW3BhdGhTZXQuc2l6ZSgpXTsKLQkJcGF0aFNldC50b0FycmF5KHBhdGhzKTsKLQkJcmV0dXJuIEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2hlY2tNb2RpZnkocGF0aHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0UGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0UGVyc2lzdGVyKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3VubG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIGJvb2xlYW4gdW5sb2FkKFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0aW9ucykgewotCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJcmV0dXJuIHVubG9hZFdpdGhvdXRSZW1vdmUoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0I3VubG9hZCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5sb2FkKCkgewotCQlyZXNldCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0Rmlyc3RNZXRob2RMaWJyYXJ5KCkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRGaXJzdE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNnZXRNZXRob2RMaWJyYXJpZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1ldGhvZExpYnJhcmllcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChsaWIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjbG9hZE1ldGhvZExpYnJhcmllcyhvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRNZXRob2RMaWJyYXJpZXMoVVJJIHVyaSwgTWFwPD8sID8+IHBhcmFtZXRlcnMpIHRocm93cyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gewotCQl0cnkgewotCQkJbG9hZExpYnJhcnkodXJpLnRvRmlsZVN0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmKGUgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pZTsKLQkJCX0KLQkJCXRocm93IG5ldyBMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24oZSk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQjdW5sb2FkKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVubG9hZChFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJaWYocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHsKLQkJCSgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS51bmxvYWRlZCgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldCNyZWxvYWRPYmplY3RzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHJlbG9hZE9iamVjdHMoQ29sbGVjdGlvbiBvYmplY3RzKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKElSZXNvdXJjZSB3c1JlcykgewotCQlJUGF0aCBwYXRoID0gd3NSZXMuZ2V0TG9jYXRpb24oKTsKLQkJcmV0dXJuIHBhdGggIT0gbnVsbCA/IFBlcnNpc3RlbmNlVXRpbC5nZXRSZXNvdXJjZShwYXRoLCB0aGlzKSA6IG51bGw7Ci0JfQotCi0vLwlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q29udGFpbmVkUmVzb3VyY2VzKElSZXNvdXJjZSB3c1JlcykgewotLy8JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwkJCi0vLwl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWROZXdSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBsb2FkQ29uZmlndXJhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaGFuZGxlTGlicmFyeU1vdmVkKFN0cmluZyBuZXdGb2xkZXIpIHsKLQkJUGVyc2lzdGVuY2VVdGlsLnJlcGxhY2VVUklQcmVmaXgobmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oZ2V0UmVzb3VyY2VzKCkpLCBsaWJGb2xkZXJQYXRoLnRvT1NTdHJpbmcoKSwgbmV3Rm9sZGVyKTsKLQkJCi0JCS8vIGNsZWFyIGNhY2hlZCByZXNvbHZlZCBVUkkgaW4gYWxsIFJlc291cmNlRGVzY3JpcHRvcnMKLQkJLy8KLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3IocmVzTWdyLCBmYWxzZSkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IChSZXNvdXJjZU1hbmFnZXIpIG9iamVjdDsKLQkJCQlyZXR1cm4gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsKLQkJCX0KLQotCQl9OwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yKFJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjIDogbWdyLmdldFJlc291cmNlRGVzY3JpcHRvcnMoKSkgewotCQkJCXJlc0Rlc2MuY2xlYXJSZXNvbHZlZFVSSSgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlU2F2ZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4NjMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVNhdmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuTGlicmFyeVJlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyByb3V0aW5lcyBmb3IgWE1JIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTXVsdGlGaWxlU2F2ZVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NT0RFTF9GSUxFTkFNRSA9ICJtb2RlbC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QTFVHSU5fRVhQT1JUX0ZJTEVOQU1FID0gImV4cG9ydC54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BMVUdJTl9NT0RFTF9GSUxFTkFNRSA9ICJwbHVnaW4ueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9GSUxFX0VYVEVOU0lPTiA9ICIueG1pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9GSUxFX0VYVEVOU0lPTiA9ICJ1bWEiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5fUEFUSCA9ICJjYXBhYmlsaXR5cGF0dGVybnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTX1BBVEggPSAiZGVsaXZlcnlwcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRSSUJVVElPTl9QQVRIID0gInByb2Nlc3Njb250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTkZJR1VSQVRJT05fRk9MREVSX05BTUUgPSAiY29uZmlndXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJPRklMRSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBkYXRlRm9ybWF0dGVyID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCi0JCQkieXlNTWRkSEhtbXNzLlMiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmFtZS5pbmRleE9mKCcvJykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCdcXCcpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCc6JykgIT0gLTEgfHwgbmFtZS5pbmRleE9mKCcqJykgIT0gLTEKLQkJCQl8fCBuYW1lLmluZGV4T2YoJz8nKSAhPSAtMSB8fCBuYW1lLmluZGV4T2YoJyInKSAhPSAtMQotCQkJCXx8IG5hbWUuaW5kZXhPZignPCcpICE9IC0xIHx8IG5hbWUuaW5kZXhPZignPicpICE9IC0xCi0JCQkJfHwgbmFtZS5pbmRleE9mKCd8JykgIT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWZmID0gbmV3IFN0cmluZ0J1ZmZlcihTdHJpbmcudmFsdWVPZihlLmdldE5hbWUoKSkpOwotCQlmb3IgKGUgPSAoTWV0aG9kRWxlbWVudCkgKChFT2JqZWN0KSBlKS5lQ29udGFpbmVyKCk7IGUgIT0gbnVsbDsgZSA9IChNZXRob2RFbGVtZW50KSAoKEVPYmplY3QpIGUpCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJc3RyQnVmZi5pbnNlcnQoMCwgU3RyaW5nLnZhbHVlT2YoZS5nZXROYW1lKCkpICsgIiA+ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0ckJ1ZmYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVEaXJOYW1lKE1ldGhvZEVsZW1lbnQgb2JqKSB7Ci0JCVN0cmluZyBuYW1lID0gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJaWYgKGlzVmFsaWRGaWxlTmFtZShuYW1lKSkKLQkJCXJldHVybiBuYW1lOwotCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoCi0JCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMuaW52YWxpZE5hbWVFcnJvcl9tc2csIG5hbWUpLCBvYmopOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRU9iamVjdCByZXNvbHZlKEVPYmplY3QgcHJveHkpIHsKLQkJaWYgKCEocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpKQotCQkJcmV0dXJuIHByb3h5OwotCQlJbnRlcm5hbEVPYmplY3Qgb2JqID0gKEludGVybmFsRU9iamVjdCkgcHJveHk7Ci0JCWlmIChvYmouZVByb3h5VVJJKCkgPT0gbnVsbCkKLQkJCXJldHVybiBwcm94eTsKLQkJWE1JUmVzb3VyY2VJbXBsIHJlcyA9IG5ldyBYTUlSZXNvdXJjZUltcGwob2JqLmVQcm94eVVSSSgpKTsKLQkJdHJ5IHsKLQkJCXJlcy5sb2FkKG51bGwpOwotCQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlcyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHByb3h5OwotCX0KLQotCXN0YXRpYyBSZXNvdXJjZSBzYXZlKEVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBvLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IHNhdmUocmVzb3VyY2VTZXQsIG8sIHVyaSwgb3B0aW9ucyk7Ci0KLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCkKLQkJCQkJLmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCVN0cmluZyBzdHIgPSAoU3RyaW5nKSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2Yoc3RyKS5ib29sZWFuVmFsdWUoKSkgewotCQkJLy8gbm90aWZ5IFJlZnJlc2hKb2IgdGhlIHRoaXMgcmVzb3VyY2UgaXMgc2F2ZWQgc28gaXQgd2lsbCBub3QgYmUKLQkJCS8vIHJlbG9hZGVkIGFmdGVyIHJlZnJlc2hpbmcgaXQKLQkJCS8vCi0JCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb3VyY2VTYXZlZChyZXNvdXJjZSk7Ci0KLQkJCS8vIHJlZnJlc2ggdGhlIG5ld2x5IGNyZWF0ZWQgcmVzb3VyY2Ugc28gaXQgaXMgaW4gc3luY2ggd2l0aCB0aGUKLQkJCS8vIHdvcmtzcGFjZQotCQkJLy8KLQkJCUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVmcmVzaChyZXNvdXJjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblNhdmVUb2dldGhlcihNYXAgb3B0aW9ucywgT2JqZWN0IG9iaikgewotCQlTZXQgc2F2ZVRvZ2V0aGVyQ2xhc3NlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUKTsKLQkJaWYgKHNhdmVUb2dldGhlckNsYXNzZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2F2ZVRvZ2V0aGVyQ2xhc3Nlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVDbGFzcyBlQ2xzID0gKEVDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZUNscy5pc0luc3RhbmNlKG9iaikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIG9iamVjdCB0byB0aGUgZ2l2ZW4gcmVzb3VyY2Ugd2hpbGUgc3RpbGwgcHJlc2VydmluZwotCSAqIG9iamVjdCdzIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFRvKFJlc291cmNlIHJlc291cmNlLCBNdWx0aVJlc291cmNlRU9iamVjdCBvKSB7Ci0JCUJhc2ljRUxpc3QgY29udGVudHMgPSAoKEJhc2ljRUxpc3QpIHJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQlpZiAoY29udGVudHMuaXNFbXB0eSgpKSB7Ci0JCQkvLyB0aGlzIHdpbGwgZmxhZyByZXNvdXJjZSBhcyBsb2FkZWQKLQkJCS8vCi0JCQljb250ZW50cy5jbGVhcigpOwotCi0JCQljb250ZW50cy5zZXREYXRhKDEsIG5ldyBPYmplY3RbXSB7IG8gfSk7Ci0JCX0gZWxzZSB7Ci0JCQlPYmplY3RbXSBkYXRhID0gY29udGVudHMudG9BcnJheSgpOwotCQkJT2JqZWN0W10gbmV3RGF0YSA9IG5ldyBPYmplY3RbZGF0YS5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotCQkJbmV3RGF0YVtkYXRhLmxlbmd0aF0gPSBvOwotCQkJY29udGVudHMuc2V0RGF0YShuZXdEYXRhLmxlbmd0aCwgbmV3RGF0YSk7Ci0JCX0KLQkJby5lU2V0UmVzb3VyY2UoKFJlc291cmNlLkludGVybmFsKSByZXNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYSBuZXcgY29udGFpbmVkIEVPYmplY3QgaW4gaXRzIG93biBuZXcgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgc2F2ZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCUVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMpIHsKLQkJcmV0dXJuIHNhdmUocmVzb3VyY2VTZXQsIG8sIHVyaSwgb3B0aW9ucywgdHJ1ZSk7Ci0JfQotCQotCXN0YXRpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgc2F2ZShSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCUVPYmplY3QgbywgVVJJIHVyaSwgTWFwIG9wdGlvbnMsIGJvb2xlYW4gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCS8vIERldGFjaCB0aGUgb2JqZWN0IGZyb20gY29udGFpbmVyIHJlc291cmNlCi0JCS8vCi0JCU11bHRpUmVzb3VyY2VFT2JqZWN0IG1yRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbzsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIGN1cnJlbnRSZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG8KLQkJCQkuZVJlc291cmNlKCk7Ci0KLQkJaWYgKGN1cnJlbnRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQljdXJyZW50UmVzb3VyY2UuZGV0YWNoZWQobyk7Ci0JCX0KLQotCQlMaXN0IG5ld1Jlc291cmNlRGVzY3JpcHRvcnMgPSBudWxsOwotCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMgPSAoU2V0KSBvcHRpb25zCi0JCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5NT0RJRklFRF9SRVNPVVJDRV9TRVQpOwotCi0JCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSBudWxsOwotCQlpZiAoY2FuU2F2ZVRvZ2V0aGVyKG9wdGlvbnMsIG8pKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgbWZSZXNvdXJjZVNldCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSByZXNvdXJjZVNldCk7Ci0KLQkJCS8vIGlmIHRoZSB1cmkgaGFzIGEgdGVtcG9yYXJ5IFVSSSwgdXNlIGl0IGluc3RlYWQgdG8gbG9jYXRlIHRoZQotCQkJLy8gcmVzb3VyY2UgdGhhdCBpcyBpbiBwcm9jZXNzIG9mIHNhdmluZwotCQkJLy8KLQkJCVVSSSB0ZW1wVVJJID0gKFVSSSkgbWZSZXNvdXJjZVNldC5nZXRVUklUb1RlbXBVUklNYXAoKS5nZXQodXJpKTsKLQkJCWlmICh0ZW1wVVJJICE9IG51bGwpIHsKLQkJCQl1cmkgPSB0ZW1wVVJJOwotCQkJfQotCi0JCQlyZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBtZlJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlpZiAoIXJlcy5nZXRDb250ZW50cygpLmNvbnRhaW5zKG8pKSB7Ci0JCQkJCWlmIChyZXMuZ2V0RmluYWxVUkkoKSA9PSByZXMuZ2V0VVJJKCkpIHsKLQkJCQkJCWlmIChNdWx0aUZpbGVYTUlTYXZlSW1wbC5jaGVja01vZGlmeVJlcXVpcmVkKG9wdGlvbnMpKSB7Ci0JCQkJCQkJLy8gbm90IGEgdGVtcCBmaWxlIG9mIGZhaWwtc2FmZSBwZXJzaXN0ZW5jZQotCQkJCQkJCS8vIHRyYW5zYWN0aW9uCi0JCQkJCQkJLy8gY2hlY2sgZm9yIHdyaXRlYWJsZQotCQkJCQkJCS8vCi0JCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuY2hlY2tNb2RpZnkocmVzKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWFkZFRvKHJlcywgbXJFT2JqKTsKLQotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihyZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCQkJCQkvLyByZWdpc3RlciB0aGlzIG5ldyBvYmplY3Qgd2l0aCBSZXNvdXJjZU1hbmFnZXIKLQkJCQkJCQkvLwotCQkJCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXJGb3IobywKLQkJCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJCQkJCQlkZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwgbywgcmVzCi0JCQkJCQkJCQkuZ2V0RmluYWxVUkkoKSk7Ci0JCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCAmJiBtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZVJlc291cmNlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJcmVzLnNldE1vZGlmaWVkKHRydWUpOwotCQkJCQkJbWZSZXNvdXJjZVNldC5zYXZlKHJlcywgb3B0aW9ucywgZmFsc2UpOwotCi0JCQkJCQlyZXMuYXR0YWNoZWRBbGwobyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyByb2xsYmFjawotCQkJCQkJLy8KLQotCQkJCQkJLy8gcmVtb3ZlIHRoaXMgb2JqZWN0IGZyb20gdGhlIHJlc291cmNlCi0JCQkJCQlyZXMuZ2V0Q29udGVudHMoKS5yZW1vdmUobXJFT2JqKTsKLQkJCQkJCW1yRU9iai5lU2V0UmVzb3VyY2UoKFJlc291cmNlLkludGVybmFsKSBudWxsKTsKLQotCQkJCQkJLy8gcmVtb3ZlIHRoZSBjcmVhdGVkIFJlc291cmNlRGVzY3JpcHRvcgotCQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUoZGVzYyk7Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIHJlLWF0dGFjaCB0byBjb250YWluZXIgcmVzb3VyY2UKLQkJCQkJCWlmIChjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCWN1cnJlbnRSZXNvdXJjZS5hdHRhY2hlZChvKTsKLQkJCQkJCX0KLQotCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzOwotCQkJfQotCQl9Ci0KLQkJcmVzID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQkJYWRkVG8ocmVzLCBtckVPYmopOwotCQlpZihtckVPYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCWFkZFJlc291cmNlTWFuYWdlcihyZXMpOwotCQl9Ci0KLQkJTWFwIG9ialRvQ29udGFpbmVyTWFwID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmKHJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcikgewotCQkJCW5ld1Jlc291cmNlRGVzY3JpcHRvcnMgPSByZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzLAotCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQl9Ci0KLQkJCS8vIGJhY2sgdXAgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGFuZCBzZXQgY29udGVudCBvYmplY3QncwotCQkJLy8gY29udGFpbmVyIHRvIG51bGwKLQkJCS8vCi0JCQlvYmpUb0NvbnRhaW5lck1hcCA9IHJlbW92ZUNvbnRhaW5lcnMocmVzKTsKLQotCQkJcmVzLnNhdmUob3B0aW9ucyk7Ci0KLQkJCXJlcy5hdHRhY2hlZEFsbChvKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0KLQkJCS8vIHJvbGxiYWNrCi0JCQkvLwotCi0JCQkvLyByZW1vdmUgdGhlIGZhaWxlZCByZW91c3JjZSBmcm9tIHRoZSByZXNvdXJjZSBzZXQKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXMpOwotCQkJbXJFT2JqLmVTZXRSZXNvdXJjZSgoUmVzb3VyY2UuSW50ZXJuYWwpIG51bGwpOwotCi0JCQkvLyByZW1vdmUgdGhlIGNyZWF0ZWQgUmVzb3VyY2VEZXNjcmlwdG9ycwotCQkJaWYobmV3UmVzb3VyY2VEZXNjcmlwdG9ycyAhPSBudWxsICYmICFuZXdSZXNvdXJjZURlc2NyaXB0b3JzLmlzRW1wdHkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG5ld1Jlc291cmNlRGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUoKEVPYmplY3QpIGl0ZXIubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlLWF0dGFjaCB0byBjb250YWluZXIgcmVzb3VyY2UKLQkJCWlmIChjdXJyZW50UmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRSZXNvdXJjZS5hdHRhY2hlZChvKTsKLQkJCX0KLQotCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIHJlc3RvcmUgdGhlIGNvbnRhaW5lciByZWZlcmVuY2VzIGZvciB0aGUgY29udGVudCBvYmplY3RzCi0JCQkvLwotCQkJcmVzdG9yZUNvbnRhaW5lcnMocmVzLCBvYmpUb0NvbnRhaW5lck1hcCk7Ci0JCX0KLQotCQlpZihyZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIpIHsKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBhZGROZXdSZXNvdXJjZU1hbmFnZXIocmVzKTsKLQkJCWlmIChyZXNNZ3IgPT0gbnVsbCkgewotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJCS8vIGNyZWF0ZSBuZXcgUmVzb3VyY2VNYW5hZ2VyIGZvciBuZXcgTWV0aG9kUGx1Z2luCi0JCQkJCS8vCi0JCQkJCXJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihvLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lQ29udGFpbmVyKCkuZVJlc291cmNlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmVzLnVwZGF0ZVRpbWVTdGFtcHMoKTsKLQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCByZW1vdmVDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWludCBzaXplID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCk7Ci0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNdWx0aVJlc291cmNlRU9iamVjdCBtdWx0aVJlc0VPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc291cmNlCi0JCQkJCS5nZXRDb250ZW50cygpLmdldChpKTsKLQkJCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSBtdWx0aVJlc0VPYmoKLQkJCQkJLmVDb250YWluZXIoKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW9ialRvQ29udGFpbmVyTWFwLnB1dChtdWx0aVJlc0VPYmosIGNvbnRhaW5lcik7Ci0JCQkJbXVsdGlSZXNFT2JqLmVCYXNpY1NldENvbnRhaW5lcihudWxsLCBtdWx0aVJlc0VPYmoKLQkJCQkJCS5lQ29udGFpbmVyRmVhdHVyZUlEKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmpUb0NvbnRhaW5lck1hcDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWluZXJzIG9mIG9iamVjdHMgaW4gcmVzb3VyY2UncyBjb250ZW50cwotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gbWFwIG9mIG9iamVjdCB0byBjb250YWluZXIgZW50cmllcwotCSAqLwotCXN0YXRpYyBNYXAgZ2V0Q29udGFpbmVycyhSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpbnQgc2l6ZSA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpOwotCQlNYXAgb2JqVG9Db250YWluZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXVsdGlSZXNFT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvdXJjZQotCQkJCQkuZ2V0Q29udGVudHMoKS5nZXQoaSk7Ci0JCQlJbnRlcm5hbEVPYmplY3QgY29udGFpbmVyID0gKEludGVybmFsRU9iamVjdCkgbXVsdGlSZXNFT2JqCi0JCQkJCS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlvYmpUb0NvbnRhaW5lck1hcC5wdXQobXVsdGlSZXNFT2JqLCBjb250YWluZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvYmpUb0NvbnRhaW5lck1hcDsKLQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBjb250YWluZXJzIG9mIHRoZSBvYmplY3RzIGluIHJlc291cmNlJ3MgY29udGVudHMgdGhhdAotCSAqIHByZXZpb3VzbHkgc2F2ZWQgaW4gYSBtYXAgcmV0dXJuZWQgZnJvbSBnZXRDb250YWluZXJzKFJlc291cmNlIHJlc291cmNlKQotCSAqIG9yIHJlbW92ZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UpCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG9ialRvQ29udGFpbmVyTWFwCi0JICogQHNlZSAjZ2V0Q29udGFpbmVycyhSZXNvdXJjZSkKLQkgKiBAc2VlICNyZW1vdmVDb250YWluZXJzKFJlc291cmNlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVzdG9yZUNvbnRhaW5lcnMoUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQlNYXAgb2JqVG9Db250YWluZXJNYXApIHsKLQkJaW50IHNpemUgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzRU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb3VyY2UKLQkJCQkJLmdldENvbnRlbnRzKCkuZ2V0KGkpOwotCQkJSW50ZXJuYWxFT2JqZWN0IGNvbnRhaW5lciA9IChJbnRlcm5hbEVPYmplY3QpIG9ialRvQ29udGFpbmVyTWFwCi0JCQkJCS5nZXQobXVsdGlSZXNFT2JqKTsKLQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCW11bHRpUmVzRU9iai5lQmFzaWNTZXRDb250YWluZXIoY29udGFpbmVyLCBtdWx0aVJlc0VPYmoKLQkJCQkJCS5lQ29udGFpbmVyRmVhdHVyZUlEKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrTW9kaWZ5KFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWNoZWNrTW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZXNvdXJjZSkpOwotCX0KLQotCXN0YXRpYyB2b2lkIGRvQ2hlY2tNb2RpZnkoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHBhdGhMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCS8vIHNraXAgY2hlY2tpbmcgb24gcmVzb3VyY2UgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgc2F2ZWQgdG8gYSB0ZW1wb3JhcnkKLQkJCS8vIGZpbGUKLQkJCS8vCi0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCAmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwYXRoTGlzdC5hZGQoRmlsZU1hbmFnZXIudG9GaWxlU3RyaW5nKHJlc291cmNlLmdldFVSSSgpKSk7Ci0JCX0KLQkJaWYoIXBhdGhMaXN0LmlzRW1wdHkoKSkgewotCQkJU3RyaW5nW10gcGF0aHMgPSBuZXcgU3RyaW5nW3BhdGhMaXN0LnNpemUoKV07Ci0JCQlwYXRoTGlzdC50b0FycmF5KHBhdGhzKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jaGVja01vZGlmeShwYXRocywKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKS8qTXNnQm94LmdldERlZmF1bHRTaGVsbCgpKi8pOwotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFVtYVV0aWwuZ2V0TWVzc2FnZShzdGF0dXMpOwotCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQltc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5tb2RpZnlGaWxlRXJyb3JfbXNnLCBBcnJheXMKLQkJCQkJCQkuYXNMaXN0KHBhdGhzKSk7Ci0JCQkJfQotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja01vZGlmeShDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJTWFwPElMaWJyYXJ5UmVzb3VyY2VTZXQsIENvbGxlY3Rpb248UmVzb3VyY2U+PiBsaWJSZXNvdXJjZVNldFRvUmVzb3VyY2VzTWFwID0gbmV3IEhhc2hNYXA8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+KCk7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IG90aGVyUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29sbGVjdGlvbiA9IGxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZ2V0KHJlc291cmNlU2V0KTsKLQkJCQlpZihjb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCQkJY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJCWxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAucHV0KChJTGlicmFyeVJlc291cmNlU2V0KSByZXNvdXJjZVNldCwgY29sbGVjdGlvbik7CQkJCQkKLQkJCQl9Ci0JCQkJY29sbGVjdGlvbi5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3RoZXJSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlpZighbGliUmVzb3VyY2VTZXRUb1Jlc291cmNlc01hcC5pc0VtcHR5KCkpIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PElMaWJyYXJ5UmVzb3VyY2VTZXQsIENvbGxlY3Rpb248UmVzb3VyY2U+Pj4gaXRlciA9IGxpYlJlc291cmNlU2V0VG9SZXNvdXJjZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnk8SUxpYnJhcnlSZXNvdXJjZVNldCwgQ29sbGVjdGlvbjxSZXNvdXJjZT4+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGVudHJ5LmdldEtleSgpOwkJCQotCQkJCVJlc291cmNlW10gcmVzb3VyY2VBcnJheSA9IG5ldyBSZXNvdXJjZVtlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKV07Ci0JCQkJZW50cnkuZ2V0VmFsdWUoKS50b0FycmF5KHJlc291cmNlQXJyYXkpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlU2V0LmNoZWNrTW9kaWZ5KHJlc291cmNlQXJyYXksIFBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb250ZXh0KCkvKk1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKSovKTsKLQkJCQl9IGNhdGNoIChMaWJyYXJ5UmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighb3RoZXJSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlkb0NoZWNrTW9kaWZ5KG90aGVyUmVzb3VyY2VzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tPdXRPZlN5bmNoKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcywgTWFwIHNhdmVPcHRpb25zKSB7Ci0JCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoOwotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBvdmVyd3JpdGFibGVSZXNvdXJjZXMgPSAoQ29sbGVjdGlvbjxSZXNvdXJjZT4pIHNhdmVPcHRpb25zLmdldCgKLQkJCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuT1BUSU9OU19PVkVSV1JJVEFCTEVfUkVTT1VSQ0VTKTsJCQkJCi0JCWlmKG92ZXJ3cml0YWJsZVJlc291cmNlcyAhPSBudWxsICYmICFvdmVyd3JpdGFibGVSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KHJlc291cmNlcyk7Ci0JCQlyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaC5yZW1vdmVBbGwob3ZlcndyaXRhYmxlUmVzb3VyY2VzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc291cmNlc1RvQ2hlY2tPdXRPZlN5bmNoID0gcmVzb3VyY2VzOwotCQl9Ci0JCWlmKCFyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaC5pc0VtcHR5KCkpIHsKLQkJCWNoZWNrT3V0T2ZTeW5jaChyZXNvdXJjZXNUb0NoZWNrT3V0T2ZTeW5jaCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3V0T2ZTeW5jaChDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQkvLyBjaGVjayBmb3Igb3V0LW9mLXN5bmNoCi0JCS8vCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXMgPSAoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBpdGVyCi0JCQkJCS5uZXh0KCk7Ci0JCQlpZihyZXMuaXNMb2FkZWQoKSAmJiAhcmVzLmhhc1RlbXBVUkkoKSkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJaWYoZmlsZS5leGlzdHMoKSkgewotLy8JCQkJCWxvbmcgbGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLS8vCQkJCQlpZiAocmVzLmdldEZpbGVMYXN0TW9kaWZpZWQoKSAhPSBsYXN0TW9kaWZpZWQgJiYgIXNhbWUobGFzdE1vZGlmaWVkLCByZXMuZ2V0RmlsZUxhc3RNb2RpZmllZCgpKSkgewotLy8JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0vLwkJCQkJCQkJUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzb3VyY2VPdXRPZlN5bmNoX21zZywgcmVzCi0vLwkJCQkJCQkJLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLS8vCQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0vLwkJCQkJfQotCQkJCQkKLQkJCQkJaWYoIXJlcy5pc1N5bmNocm9uaXplZCgpKSB7Ci0JCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoCi0JCQkJCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlc291cmNlT3V0T2ZTeW5jaF9tc2csCi0JCQkJCQkJCXJlcy5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24obXNnKTsJCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBleGlzdGluZyBvd24gcmVzb3VyY2Ugb2YgYSBjb250YWluZWQgRU9iamVjdC4gQWRkcyByZXNvdXJjZXMKLQkgKiB0aGF0IGhhdmUgYmVlbiBtb2RpZmVkIGFmdGVyIHRoaXMgY2FsbCB0byB0aGUgTU9ESUZJRURfUkVTT1VSQ0VfU0VUIG9mCi0JICogdGhlIHNhdmUgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gcmVzb3VyY2UgaGFzIGJlZW4gc2F2ZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2F2ZShSZXNvdXJjZSByZXNvdXJjZSwgTWFwIG9wdGlvbnMpIHsKLQkJaWYgKHJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVNldCBtb2RpZmllZFJlc291cmNlcyA9IChTZXQpIG9wdGlvbnMKLQkJCQkuZ2V0KE11bHRpRmlsZVhNSVNhdmVJbXBsLk1PRElGSUVEX1JFU09VUkNFX1NFVCk7Ci0KLQkJLy8gc2hvdWxkIG5vdCBjaGFuZ2UgcmVzb3VyY2UgbG9jYXRpb24gYXV0b21hdGljYWxseSB3aXRob3V0IGxldHRpbmcKLQkJLy8gdXNlciBrbm93IGFib3V0IGl0Ci0JCS8vCi0JCS8vIGFkanVzdExvY2F0aW9uKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0KLQkJLy8gYmFjayB1cCB0aGUgY29udGFpbmVyIHJlZmVyZW5jZXMgYW5kIHNldCBjb250ZW50IG9iamVjdCdzIGNvbnRhaW5lcgotCQkvLyB0byBudWxsCi0JCS8vCi0JCU1hcCBvYmpUb0NvbnRhaW5lck1hcCA9IHJlbW92ZUNvbnRhaW5lcnMocmVzb3VyY2UpOwotCQl0cnkgewotCQkJcmVzb3VyY2Uuc2F2ZShvcHRpb25zKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyByZXN0b3JlIHRoZSBjb250YWluZXIgcmVmZXJlbmNlcyBmb3IgdGhlIGNvbnRlbnQgb2JqZWN0cwotCQkJLy8KLQkJCXJlc3RvcmVDb250YWluZXJzKHJlc291cmNlLCBvYmpUb0NvbnRhaW5lck1hcCk7Ci0JCX0KLQotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gYWRkTmV3UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYgKHJlc01nciAhPSBudWxsICYmIG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChyZXNNZ3IuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybiBSZXNvdXJjZU1hbmFnZXIgdGhhdCBpcyBqdXN0IGFkZGVkIHRvIHRoZSByZXNvdXJjZSBtYW5hZ2VyIHRyZWUKLQkgKiAgICAgICAgIG9yIG51bGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGFkZE5ld1Jlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQlpZiAocmVzTWdyICE9IG51bGwgJiYgY29udGFpbmVyICE9IG51bGwgJiYgcmVzTWdyLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkvLyBuZXcgUmVzb3VyY2VNYW5hZ2VyIGlzIGFkZGVkIHRvIHRoZSByZXNvdXJjZQotCQkJLy8KLQkJCVJlc291cmNlTWFuYWdlciBwYXJlbnRSZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyCi0JCQkJCS5lUmVzb3VyY2UoKSk7Ci0KLQkJCS8vIGNoZWNrIGlmIHJlc01nciBpcyBhbHJlYWR5IGEgc3ViIG1hbmFnZXIgb2YgcGFyZW50UmVzTWdyIGJlZm9yZQotCQkJLy8gYWRkaW5nIGl0Ci0JCQkvLwotCQkJaWYgKCFwYXJlbnRSZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKS5jb250YWlucyhyZXNNZ3IpKSB7Ci0JCQkJcGFyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuYWRkKHJlc01ncik7CQkJCQotCQkJCXJlZ2lzdGVyV2l0aFJlc291cmNlTWFuYWdlcihwYXJlbnRSZXNNZ3IsIGUsIE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKHJlc291cmNlKSk7Ci0JCQkJcmV0dXJuIHJlc01ncjsKLQkJCX0KLQotCQkJLy8gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHBhcmVudFJlc01nciwgcmVzTWdyLAotCQkJLy8gcmVzTWdyLmVSZXNvdXJjZSgpLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KHJlc01nci5nZXRHdWlkKCkpKTsKLQkJCS8vIHJldHVybiByZXNNZ3I7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvRmlsZVN0cmluZyhFT2JqZWN0IGVPYmopIHsKLQkJcmV0dXJuIGVPYmouZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUoCi0JCQkJZU9iai5lUmVzb3VyY2UoKS5nZXRVUkkoKSkudG9GaWxlU3RyaW5nKCk7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCXN0YXRpYyBib29sZWFuIGhhc093blJlc291cmNlKE9iamVjdCBvYmosIENvbGxlY3Rpb24gc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kVW5pdCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzYXZlU2VwYXJhdGVseUNsYXNzU2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRUNsYXNzIGVDbHMgPSAoRUNsYXNzKSBpdGVyLm5leHQoKTsKLQkJCWlmIChlQ2xzLmlzSW5zdGFuY2Uob2JqKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIFVSSSBjcmVhdGVGaWxlVVJJKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKTsKLQotCQkvLyBIYW5kbGUgUHJvY2Vzc0NvbXBvbmVudCBzcGVjaWFsbHkuIFByb2Nlc3NDb21wb25lbnQgb2JqZWN0cyBhcmUKLQkJLy8gc3RvcmVkIGFzIGZvbGxvd2luZyBpbiB0aGUgbWV0aG9kIGxpYnJhcnk6Ci0JCS8vIDxNZXRob2QgTGlicmFyeT4KLQkJLy8gfF8gPE1ldGhvZCBQbHVnaW4+Ci0JCS8vIHxfcHJvY2Vzc2VzCi0JCS8vIHxfY2FwYWJpbGl0eV9wYXR0ZXJucwotCQkvLyB8X2RlbGl2ZXJ5X3Byb2Nlc3NlcwotCQkvLyB8X3Byb2Nlc3NfY29udHJpYnV0aW9ucwotCQkvLwotCQlpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCWlmKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IHBsdWdpbi5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQl9Ci0JCQlTdHJpbmcgcGx1Z2luRGlyID0gbnVsbDsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlwbHVnaW5EaXIgPSBuZXcgRmlsZShnZXRGaW5hbFVSSShyZXNvdXJjZSkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTWV0aG9kTGlicmFyeSBsaWIgPSAoTWV0aG9kTGlicmFyeSkgcGx1Z2luLmVDb250YWluZXIoKTsKLQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxpYkRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBsaWIKLQkJCQkJCQkuZVJlc291cmNlKCkpLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpOwotCQkJCQlwbHVnaW5EaXIgPSBsaWJEaXIgKyBGaWxlLnNlcGFyYXRvciArIHBsdWdpbi5nZXROYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYocGx1Z2luRGlyID09IG51bGwpIHsKLQkJCQkvLyBwbHVnaW4gaXMgYWxyZWFkeSBkZWxldGVkCi0JCQkJLy8KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHJlbGF0aXZlRGlyOwotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSAoKFByb2Nlc3NDb21wb25lbnQpIGUpCi0JCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJcmVsYXRpdmVEaXIgPSBDQVBBQklMSVRZX1BBVFRFUk5fUEFUSDsKLQkJCX0gZWxzZSBpZiAocHJvYyBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJCXJlbGF0aXZlRGlyID0gREVMSVZFUllfUFJPQ0VTU19QQVRIOwotCQkJfSBlbHNlIHsKLQkJCQlyZWxhdGl2ZURpciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVN0cmluZyBwYXRoID0gcGx1Z2luRGlyICsgRmlsZS5zZXBhcmF0b3IgKyByZWxhdGl2ZURpcgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgZS5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfTU9ERUxfRklMRU5BTUU7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbikgewotCQkJU3RyaW5nIGRpciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRpciA9IG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBVbWFVdGlsCi0JCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudChlKS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKQotCQkJCQkJLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKTsKLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShkaXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIERFRkFVTFRfQ09OVEVOVF9GSUxFTkFNRSk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJVVJJIHVyaTsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRDb3JyZWN0UGF0aChjb250ZW50KTsKLQkJCWlmIChwYXRoID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZGlyID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUuZVJlc291cmNlKCkpCi0JCQkJCQkuZ2V0RmluYWxVUkkoKS50cmltU2VnbWVudHMoMSkudG9GaWxlU3RyaW5nKCkKLQkJCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCQkJcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuZ2V0TmV4dEF2YWlsYWJsZUZpbGVOYW1lKGRpciwKLQkJCQkJCWNvbnRlbnQpOwotCQkJfQotCQkJdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aCk7Ci0JCQlyZXR1cm4gdXJpOwotCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7CQkJCi0JCQlTdHJpbmcgZGlyID0gbmV3IFN0cmluZ0J1ZmZlcigoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCQkuZUNvbnRhaW5lcigpLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpLnRyaW1TZWdtZW50cygxKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpLmFwcGVuZChGaWxlLnNlcGFyYXRvcikuYXBwZW5kKAotCQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9GT0xERVJfTkFNRSkuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKQotCQkJCQkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZGlyLAotCQkJCQlTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKGUuZ2V0TmFtZSgpKSwKLQkJCQkJKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKTsKLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlFT2JqZWN0IGxhc3RDb250YWluZXIgPSBudWxsOwotCQlmb3IgKE1ldGhvZEVsZW1lbnQgb2JqID0gKE1ldGhvZEVsZW1lbnQpIGUuZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gKE1ldGhvZEVsZW1lbnQpIG9iagotCQkJCS5lQ29udGFpbmVyKCkpIHsKLQkJCWxhc3RDb250YWluZXIgPSBvYmo7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKCgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSBvYmoKLQkJCQkJCS5lUmVzb3VyY2UoKSkuZ2V0RmluYWxVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkJCS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlwYXRoLmluc2VydCgwLCBvYmouZ2V0TmFtZSgpKS5pbnNlcnQoMCwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJCX0KLQkJfQotCQlpZiAobGFzdENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZS5lUmVzb3VyY2UoKSAhPSBudWxsID8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpKS5nZXRGaW5hbFVSSSgpIDogbnVsbDsKLQkJfQotCQlpZiAoIShsYXN0Q29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCXBhdGguaW5zZXJ0KDAsIG5ldyBGaWxlKHRvRmlsZVN0cmluZyhsYXN0Q29udGFpbmVyKSkKLQkJCQkJLmdldFBhcmVudEZpbGUoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0KLQkJU3RyaW5nIG1vZGVsRmlsZU5hbWU7Ci0JCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gREVGQVVMVF9QTFVHSU5fTU9ERUxfRklMRU5BTUU7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlbEZpbGVOYW1lID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRTsKLQkJfQotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aC50b1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrIE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZURpck5hbWUoZSkgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgbW9kZWxGaWxlTmFtZSk7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUpIHsKLQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlkZWxldGUoZmlsZXNbaV0pOwotCQkJfQotCQl9Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gdXJpCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGUKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJdXJpQ29udmVydGVyLnNldFVSSU1hcHBpbmcoZSwgdXJpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsCi0JICovCi0Jc3RhdGljIHZvaWQgdXBkYXRlVVJJTWFwcGluZ3MoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlLAotCQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiByZXNvdXJjZVNldCBoYXMgdGhlIGxvYWRlZCByZXNvdXJjZSB3aXRoIHRoZSBnaXZlbgotCSAqIHVyaQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaGFzTG9hZGVkUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQsIFVSSSB1cmkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVzb3VyY2UuaXNMb2FkZWQoKSAmJiByZXNvdXJjZS5nZXRVUkkoKS5lcXVhbHModXJpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIFVSSU1hcHBpbmdzIHdpdGggdGhlIGZpbmFsIFVSSSBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlzdGF0aWMgdm9pZCB1cGRhdGVVUklNYXBwaW5ncyhNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMsIGJvb2xlYW4gYWZ0ZXJNb3ZlKSB7Ci0JCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpLCBtb2RpZmllZFJlc291cmNlcywKLQkJCQlhZnRlck1vdmUpOwotCX0KLQotCXN0YXRpYyB2b2lkIHVwZGF0ZVVSSU1hcHBpbmdzKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwgVVJJIHVyaSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcywgYm9vbGVhbiBhZnRlck1vdmUpIHsKLQkJLy8gdGhlIHJlc291cmNlIFVSSSBoYXMgYmVlbiBjaGFuZ2VkLCByZXNldCBhbGwgdGhlIGNhY2hlZCByZXNvbHZlZCBVUkkKLQkJLy8gaW4gYWxsIG9mZnN0cmluZyByZXNvdXJjZSBkZXNjcmlwdG9ycwotCQkvLyBvZiBpdHMgbWFuYWdlciwgaWYgaXQgaGFzIG9uZS4KLQkJLy8KLQkJSGFzaE1hcCBvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG51bGw7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCW9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc01nci5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZURlc2NyaXB0b3IpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoKFJlc291cmNlRGVzY3JpcHRvcikgb2JqKTsKLQkJCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSwKLQkJCQkJCQlkZXNjKTsKLQkJCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXJlc291cmNlLmdldENvbnRlbnRzKCkuaXNFbXB0eSgpKSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCksCi0JCQkvLyBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQlNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyID0gKE11bHRpRmlsZVVSSUNvbnZlcnRlcikgcmVzb3VyY2UKLQkJCQkJLmdldFJlc291cmNlU2V0KCkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQl1cmlDb252ZXJ0ZXIuc2V0VVJJTWFwcGluZyhlbGVtZW50LCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzLAotCQkJCQlhZnRlck1vdmUpOwotCQl9Ci0KLQkJLy8gZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkvLyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkvLyBzZXRVUklNYXBwaW5nKGVsZW1lbnQsIHJlc291cmNlLmdldFVSSSgpLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCS8vIH0KLQotCQlpZiAob2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJLy8gZ28gdGhydSB0aGUgbGlzdCBvZiBsb2FkZWQgcmVzb3VyY2VzIGluIHJlc291cmNlIHNldCB0byB1cGRhdGUKLQkJCS8vIHRoZSBVUkkKLQkJCS8vCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAKLQkJCQkJCS5nZXQocmVzLmdldFVSSSgpKTsKLQkJCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJCWlmIChhZnRlck1vdmUpIHsKLQkJCQkJCXJlcy5zZXRVUkkoZGVzYy5nZXRSZXNvbHZlZFVSSSgpKTsKLQkJCQkJfSBlbHNlIGlmIChyZXMuaXNMb2FkZWQoKSkgewotCQkJCQkJZGVzYy5jbGVhclJlc29sdmVkVVJJKCk7Ci0JCQkJCQlyZXMuc2V0VVJJKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzTWdyCi0JICogQHBhcmFtIG8KLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JLy8gcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRVcmkoUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgTWV0aG9kRWxlbWVudCBlLCBVUkkKLQkvLyB1cmkpIHsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkvLyBpZihyZXNEZXNjLmdldElkKCkuZXF1YWxzKGUuZ2V0R3VpZCgpKSkgewotCS8vIC8vIGNoYW5nZSBvdGhlciBVUklzIHRoYXQgYXJlIGNoYW5nZWQgYXMgcmVzdWx0IG9mIHRoaXMgVVJJIGNoYW5nZQotCS8vIC8vCi0JLy8gaWYodXJpLmZyYWdtZW50KCkgPT0gbnVsbCkgewotCS8vIFVSSSBvbGREaXIgPSBVUkkuY3JlYXRlRmlsZVVSSShuZXcKLQkvLyBGaWxlKHJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCkgKwotCS8vIEZpbGUuc2VwYXJhdG9yKTsKLQkvLyBVUkkgbmV3RGlyID0gVVJJLmNyZWF0ZUZpbGVVUkkobmV3IEZpbGUodXJpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnQoKSArCi0JLy8gRmlsZS5zZXBhcmF0b3IpOwotCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7Ci0JLy8gaXRlcmF0b3IKLQkvLyAuaGFzTmV4dCgpOykgewotCS8vIFJlc291cmNlRGVzY3JpcHRvciBlbGVtZW50ID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlcmF0b3IubmV4dCgpOwotCS8vIFVSSSBjdXJyZW50VXJpID0gZWxlbWVudC5nZXRSZXNvbHZlZFVSSSgpOwotCS8vIFVSSSBuZXdVcmkgPSBjdXJyZW50VXJpLnJlcGxhY2VQcmVmaXgob2xkRGlyLCBuZXdEaXIpOwotCS8vIGlmKG5ld1VyaSAhPSBudWxsKSB7Ci0JLy8gZWxlbWVudC5zZXRSZXNvbHZlZFVSSShuZXdVcmkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIHJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkvLyByZXR1cm47Ci0JLy8gfQotCS8vIH0KLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgcmVzRGVzYyA9Ci0JLy8gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JLy8gcmVzRGVzYy5zZXRJZChlLmdldEd1aWQoKSk7Ci0JLy8gcmVzRGVzYy5zZXRSZXNvbHZlZFVSSSh1cmkpOwotCS8vIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCS8vIH0KLQkvKioKLQkgKiBHZXRzIHRoZSByaWdodCBSZXNvdXJjZU1hbmFnZXIgZm9yIHRoZSBnaXZlbiBFT2JqZWN0LCBjcmVhdGVzIG5ldwotCSAqIFJlc291cmNlTWFuYWdlciBpZiBpdCBkb2VzIG5vdCBleGlzdCB5ZXQuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkUmVzb3VyY2VzCi0JICogICAgICAgICAgICBvdXRwdXQgb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCXN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKEVPYmplY3QgZU9iaiwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVPYmouZUNvbnRhaW5lcigpICE9IG51bGwgPyBlT2JqLmVDb250YWluZXIoKQotCQkJCS5lUmVzb3VyY2UoKSA6IGVPYmouZVJlc291cmNlKCk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIocmVzb3VyY2UpOwotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCi0JCQkvLyBhZGQgdG8gYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzCi0JCQkvLwotCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoMCwgcmVzTWdyKTsKLQotCQkJaWYgKG1vZGlmaWVkUmVzb3VyY2VzICE9IG51bGwpIHsKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJRU9iamVjdCBjb250YWluZXIgPSBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoKEludGVybmFsRU9iamVjdCkgZU9iaik7Ci0JCQlpZiAoY29udGFpbmVyICE9IG51bGwgJiYgY29udGFpbmVyLmVSZXNvdXJjZSgpICE9IHJlc291cmNlKSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHBhcmVudFJlc01nciA9IGdldFJlc291cmNlTWFuYWdlckZvcihjb250YWluZXIsCi0JCQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJaWYgKHBhcmVudFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudFJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChyZXNNZ3IpOwotCQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHBhcmVudFJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzTWdyOwotCi0JfQotCi0Jc3RhdGljIExpc3QgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSwKLQkJCVNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyRm9yKAotCQkJCVBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKSwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCUxpc3QgcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwKLQkJCQkJCWVsZW1lbnQsIHJlc291cmNlLmdldEZpbmFsVVJJKCkpOwotCQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VEZXNjcmlwdG9ycy5hZGQocmVzRGVzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghcmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCkgJiYgbW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKAotCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciwgT2JqZWN0IGVsZW1lbnQsIFVSSSB1cmkpIHsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKGVsZW1lbnQpOwotCQlpZiAocmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZ3VpZCwgdXJpKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBDcmVhdGVzIGEgbmV3IFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgYW5kIGFkZCBpdAotCS8vIHRvIHRoZSBnaXZlbiBSZXNvdXJjZU1hbmFnZXIKLQkvLyAqCi0JLy8gKiBAcGFyYW0gZQotCS8vICogQHJldHVybiBuZXdseSBhZGRlZCBSZXNvdXJjZURlc2NyaXB0b3IKLQkvLyAqLwotCS8vIHByaXZhdGUgc3RhdGljIFJlc291cmNlRGVzY3JpcHRvcgotCS8vIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkvLyByZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCksIGNyZWF0ZUZpbGVVUkkoZSkpOwotCS8vIH0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgUmVzb3VyY2VEZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIGlkIGFuZCByZXNvbHZlZFVSSSwgdGhlbgotCSAqIGFkZHMgaXQgdG8gdGhlIGdpdmVuIHJlc01ncgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gcmVzb2x2ZWRVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvcigKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IsIFN0cmluZyBpZCwgVVJJIHJlc29sdmVkVVJJKSB7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yKCk7Ci0JCXJlc0Rlc2Muc2V0SWQoaWQpOwotCQlyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZChyZXNEZXNjKTsKLQkJcmVzRGVzYy5zZXRSZXNvbHZlZFVSSShyZXNvbHZlZFVSSSk7Ci0JCXJldHVybiByZXNEZXNjOwotCX0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSkgewotCS8vIHNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSwgZmFsc2UpOwotCS8vIH0KLQotCS8vIHN0YXRpYyB2b2lkIHNldFVyaShNdWx0aUZpbGVVUklDb252ZXJ0ZXIgdXJpQ29udmVydGVyLCBNZXRob2RFbGVtZW50IGUsCi0JLy8gVVJJIHVyaSwgYm9vbGVhbiBzYXZlTm93KSB7Ci0JLy8gUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IHVyaUNvbnZlcnRlci5nZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQkvLyBpZihyZXNNZ3IgPT0gbnVsbCkgewotCS8vIHJlc01nciA9IFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCS8vIHVyaUNvbnZlcnRlci5zZXRSZXNvdXJjZU1hbmFnZXIocmVzTWdyKTsKLQkvLyB9Ci0JLy8gc2V0VXJpKHJlc01nciwgZSwgdXJpKTsKLQkvLyByZXNNZ3IuZVJlc291cmNlKCk7Ci0JLy8gfQotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3VpZChNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUuZ2V0R3VpZCgpID09IG51bGwgfHwgZS5nZXRHdWlkKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaW4gaXRzIG93biBmaWxlIHdoaWxlIHN0aWxsIHByZXNlcnZpbmcgdGhlCi0JICogZXhpc3RpbmcgY29udGFpbm1lbnQgYXNzb2NpYXRpb24gaWYgdGhlcmUgaXMgYW55Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAdGhyb3dzIExpYnJhcnlSZXNvdXJjZUV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGUsIE1hcCBvcHRpb25zKSB0aHJvd3MgTGlicmFyeVJlc291cmNlRXhjZXB0aW9uIHsKLQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgZQotCQkJCS5lUmVzb3VyY2UoKTsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UKLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQl9Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZS5lQ29udGFpbmVyKCk7Ci0KLQkJU2V0IG1vZGlmaWVkUmVzb3VyY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTU9ESUZJRURfUkVTT1VSQ0VfU0VULAotCQkJCW1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJdHJ5IHsKLQkJCVVSSSB1cmkgPSBNdWx0aUZpbGVTYXZlVXRpbC5jcmVhdGVVUkkoZSwgcmVzb3VyY2VTZXQpOwotCQkJYm9vbGVhbiBjcmVhdGVSZXNvdXJjZSA9IHJlc291cmNlID09IG51bGwKLQkJCQkJfHwgKGNvbnRhaW5lciAhPSBudWxsICYmIHJlc291cmNlID09IGNvbnRhaW5lci5lUmVzb3VyY2UoKSk7Ci0JCQlpZiAoY3JlYXRlUmVzb3VyY2UpIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5zYXZlKGUsIHVyaSwgb3B0aW9ucyk7Ci0JCQl9IGVsc2UgewotCQkJCVVSSSBvbGRVcmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCQlpZiAoIW9sZFVyaS5lcXVhbHModXJpKSkgewotCi0JCQkJCS8vIHJlc291cmNlJ3MgbG9jYXRpb24gaXMgY2hhbmdlZC4KLQkJCQkJLy8gbW92ZSB0aGUgcmVzb3VyY2UsIHRoZW4gY2hhbmdlIGl0cyBVUkkgaWYgdGhlIHJlc291cmNlCi0JCQkJCS8vIG1vdmUgaXMgc3VjY2Vzc2Z1bC4KLQkJCQkJLy8gICAKLQkJCQkJaWYgKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkubW92ZShvbGRVcmkudG9GaWxlU3RyaW5nKCksCi0JCQkJCQkJdXJpLnRvRmlsZVN0cmluZygpKSkgewotCQkJCQkJLy8gTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9Ci0JCQkJCQkvLyAoTXVsdGlGaWxlVVJJQ29udmVydGVyKQotCQkJCQkJLy8gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCS8vIE11bHRpRmlsZVNhdmVVdGlsLnNldFVyaSh1cmlDb252ZXJ0ZXIsIGUsIHVyaSk7Ci0JCQkJCQlyZXNvdXJjZS5zZXRVUkkodXJpKTsKLQkJCQkJCXVwZGF0ZVVSSU1hcHBpbmdzKHJlc291cmNlLCBtb2RpZmllZFJlc291cmNlcyk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAocmVzb3VyY2UuaXNNb2RpZmllZCgpKSB7Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLnNhdmUocmVzb3VyY2UsIG9wdGlvbnMpOwotCQkJCX0KLQkJCX0KLQotCQkJcmVzb3VyY2VTZXQuc2F2ZU1vZGlmaWVkUmVzb3VyY2VzKG9wdGlvbnMpOwotCQl9IGZpbmFsbHkgewotCi0JCX0KLQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoTWV0aG9kRWxlbWVudCBlLCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlVUkkgdXJpID0gbnVsbDsKLQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCUlVUklQcm92aWRlciB1cmlQcm92aWRlciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRVUklQcm92aWRlcigpOwotCQkJaWYodXJpUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXVyaSA9IHVyaVByb3ZpZGVyLmdldFVSSShlKTsKLQkJCX0KLQkJfQotCQlpZih1cmkgPT0gbnVsbCkgewotCQkJdXJpID0gY3JlYXRlRmlsZVVSSShlKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKFJlc291cmNlU2V0IHJlc291cmNlU2V0LCBNZXRob2RFbGVtZW50IGUsCi0JCQlNYXAgb3B0aW9ucykgewotCQlVUkkgdXJpID0gY3JlYXRlVVJJKGUsIHJlc291cmNlU2V0KTsKLQkJc2F2ZShyZXNvdXJjZVNldCwgZSwgdXJpLCBvcHRpb25zKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgU2V0IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVVUkkoZSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwgJiYgYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UsIG5ld0ZpbGUpKSB7Ci0JCQlyZXNvdXJjZS5zZXRVUkkobmV3RmlsZSk7Ci0JCQl1cGRhdGVVUklNYXBwaW5ncygoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSByZXNvdXJjZSwKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMpOwotCQl9Ci0JfQotCi0Jc3RhdGljIFVSSSBnZXROZXdVUkkoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHJlc291cmNlKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVVJJIG5ld0ZpbGUgPSBjcmVhdGVVUkkoZSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCWlmIChuZXdGaWxlICE9IG51bGwgJiYgYWRqdXN0TG9jYXRpb25SZXF1aXJlZChyZXNvdXJjZSwgbmV3RmlsZSkpIHsKLQkJCXJldHVybiBuZXdGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXN0YXRpYyBib29sZWFuIHByZXBhcmVBZGp1c3RMb2NhdGlvbihNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIHsKLQkJVVJJIG5ld0ZpbGUgPSBnZXROZXdVUkkocmVzb3VyY2UpOwotCQlpZiAobmV3RmlsZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS5iYWNrVXBVUkkoKTsKLQkJCXJlc291cmNlLnNldEZpbmFsVVJJKG5ld0ZpbGUpOwotCQkJdXBkYXRlVVJJTWFwcGluZ3MoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UsCi0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLCBmYWxzZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZChPYmplY3QgZSkgewotCQlpZihlIGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgbyA9IChJbnRlcm5hbEVPYmplY3QpIGU7Ci0JCQlpZihvLmVJc1Byb3h5KCkpIHsKLQkJCQlVUkkgdXJpID0gby5lUHJveHlVUkkoKTsKLQkJCQlpZih1cmkgIT0gbnVsbCAmJiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuU0NIRU1FLmVxdWFscyh1cmkuc2NoZW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBndWlkID0gdXJpLmZyYWdtZW50KCk7Ci0JCQkJCWlmKGd1aWQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGd1aWQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBlKS5nZXRHdWlkKCk7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJcmV0dXJuICgoUmVzb3VyY2VNYW5hZ2VyKSBlKS5nZXRHdWlkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gYWRqdXN0TG9jYXRpb25SZXF1aXJlZChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwgcmVzb3VyY2UsCi0JCQlVUkkgbmV3VVJJKSB7Ci0JCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShuZXdVUkkudG9GaWxlU3RyaW5nKCkpOwotCQlyZXR1cm4gIW9sZEZpbGUuZXF1YWxzKG5ld0ZpbGUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcmVzb3VyY2UncyBVUkkgaGFzIGJlZW4gY2hhbmdlZCBhbmQgYWRqdXN0IHRoZSByZXNvdXJjZSdzCi0JICogbG9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIG9sZFVyaQotCSAqIEBwYXJhbSBuZXdVcmkKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGp1c3RMb2NhdGlvbihSZXNvdXJjZSByZXNvdXJjZSwgVVJJIG5ld1VyaSkgewotCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKG5ld1VyaS50b0ZpbGVTdHJpbmcoKSk7Ci0JCWlmIChvbGRGaWxlLmVxdWFscyhuZXdGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBtb3ZlKHJlc291cmNlLCBvbGRGaWxlLCBuZXdGaWxlKTsKLQl9Ci0KLQlzdGF0aWMgYm9vbGVhbiBtb3ZlKFJlc291cmNlIHJlc291cmNlLCBGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCWlmIChvbGRGaWxlLmVxdWFscyhuZXdGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCU9iamVjdCBvYmogPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCWlmIChoYXNPd25Gb2xkZXIob2JqKSkgewotCQkJU3RyaW5nIG9sZERpciA9IG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLnRvU3RyaW5nKCk7Ci0JCQlpZiAoIW9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhuZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpIHsKLQkJCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZS5nZXRQYXJlbnRGaWxlKCksCi0JCQkJCQluZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpIHsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJEaXJlY3RvcnkgJyIgKyBvbGREaXIgKyAiJyBpcyBzdWNjZXNzZnVsbHkgbW92ZWQgdG8gJyIgKyBuZXdGaWxlLmdldFBhcmVudEZpbGUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb3VsZCBub3QgbW92ZSBkaXJlY3RvcnkgJyIgKyBvbGREaXIgKyAiJyB0byAnIiArIG5ld0ZpbGUuZ2V0UGFyZW50RmlsZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmICghb2xkRmlsZS5nZXROYW1lKCkuZXF1YWxzKG5ld0ZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCW9sZEZpbGUgPSBuZXcgRmlsZShuZXdGaWxlLmdldFBhcmVudEZpbGUoKSwgb2xkRmlsZS5nZXROYW1lKCkpOwotCQkJCWlmIChGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbmFtZShvbGRGaWxlLCBuZXdGaWxlKSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkZpbGUgJyIgKyBvbGRGaWxlICsgIicgaXMgc3VjY2Vzc2Z1bGx5IG1vdmVkIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXQgPSBmYWxzZTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb3VsZCBub3QgbW92ZSBmaWxlICciICsgb2xkRmlsZSArICInIHRvICciICsgbmV3RmlsZSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmV0OwotCQl9IGVsc2UgaWYgKG9sZEZpbGUuZXhpc3RzKCkpIC8qIGlmKG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhuZXdGaWxlLmdldFBhcmVudEZpbGUoKSkpICovewotCQkJU3RyaW5nIG9sZEZpbGVTdHIgPSBvbGRGaWxlLnRvU3RyaW5nKCk7Ci0JCQlpZiAoRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZW5hbWUob2xkRmlsZSwgbmV3RmlsZSkpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCJGaWxlICciICsgb2xkRmlsZVN0ciArICInIGlzIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiQ291bGQgbm90IG1vdmUgZmlsZSAnIiArIG9sZEZpbGVTdHIgKyAiJyB0byAnIiArIG5ld0ZpbGUgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc01ncgotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIGV4Y2x1ZGVkUmVzTWFuYWdlcnMKLQkgKiAgICAgICAgICAgIFJlc291cmNlTWFuYWdlciB0aGF0IGFyZSBleGNsdWRlZCBmcm9tIHRoaXMgc2VhcmNoCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGZpbmRSZXNvdXJjZURlc2NyaXB0b3IoCi0JCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyLCBTdHJpbmcgZ3VpZCwKLQkJCUNvbGxlY3Rpb24gZXhjbHVkZWRSZXNNYW5hZ2VycywgYm9vbGVhbiByZXNvbHZlUHJveHkpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKTsKLQkJCWlmIChkZXNjICE9IG51bGwpCi0JCQkJcmV0dXJuIGRlc2M7Ci0JCQkvLyBUT0RPOiAoUGhvbmcpIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG5lZWRlZCB0byBhdm9pZCBsb2FkaW5nCi0JCQkvLyByZXNvdXJjZXMgZXhjZXNzaXZlbHkKLQkJCS8vCi0JCQlJdGVyYXRvciBpdGVyOwotCQkJaWYgKHJlc29sdmVQcm94eSkgewotCQkJCWl0ZXIgPSBuZXcgQXJyYXlMaXN0KHJlc01nci5nZXRTdWJNYW5hZ2VycygpKS5pdGVyYXRvcigpOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVyID0gKChJbnRlcm5hbEVMaXN0KSByZXNNZ3IuZ2V0U3ViTWFuYWdlcnMoKSkKLQkJCQkJCS5iYXNpY0l0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG1nciAhPSBudWxsCi0JCQkJCQkmJiAhbWdyLmVJc1Byb3h5KCkKLQkJCQkJCSYmIChleGNsdWRlZFJlc01hbmFnZXJzID09IG51bGwgfHwgIWV4Y2x1ZGVkUmVzTWFuYWdlcnMKLQkJCQkJCQkJLmNvbnRhaW5zKG1ncikpKSB7Ci0JCQkJCWRlc2MgPSBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKG1nciwgZ3VpZCwKLQkJCQkJCQlleGNsdWRlZFJlc01hbmFnZXJzLCByZXNvbHZlUHJveHkpOwotCQkJCQlpZiAoZGVzYyAhPSBudWxsKQotCQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNNZ3IKLQkgKiBAcmV0dXJuIGhvdyBtYW55IFJlc291cmNlRGVzY3JpcHRvcnMgYXJlIGluIHRoZSByZXNNZ3IgYW5kIGl0cwotCSAqICAgICAgICAgU3ViTWFuYWdlcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRDb3VudFJlc291cmNlRGVzY3JpcHRvcnMoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCQlpbnQgY291bnQgPSByZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLnNpemUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQljb3VudCArPSBnZXRDb3VudFJlc291cmNlRGVzY3JpcHRvcnMobWdyKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VEZXNjcmlwdG9yIGdldFJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgY29udGFpbmVyUmVzTWdyID0gbnVsbDsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihyZXNvdXJjZSk7Ci0JCQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gcmVzTWdyCi0JCQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcigoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJLy8gaGFjayB0byBhZGQgbWlzc2luZyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIGxpYnJhcnkncwotCQkJCQkvLyByZXNvdXJjZQotCQkJCQkvLwotCQkJCQlpZiAoZGVzYyA9PSBudWxsKSB7Ci0JCQkJCQlkZXNjID0gcmVnaXN0ZXJXaXRoUmVzb3VyY2VNYW5hZ2VyKHJlc01nciwgZWxlbWVudCwKLQkJCQkJCQkJKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKQotCQkJCQkJCQkJCS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gZGVzYzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWUgPT0gbnVsbCAmJiBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW1lID0gKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAoY29udGFpbmVyUmVzTWdyID09IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnQpOwotCQkJCWlmIChjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQljb250YWluZXJSZXNNZ3IgPSBnZXRSZXNvdXJjZU1hbmFnZXIoY29udGFpbmVyLmVSZXNvdXJjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWUgIT0gbnVsbCAmJiBjb250YWluZXJSZXNNZ3IgIT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYobWUgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRhaW5lclJlc01nciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lclJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKChNZXRob2RFbGVtZW50KSBtZSkKLQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJfQotCQkJZWxzZSBpZihtZS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgZWxlbWVudCBoYXMgYmVlbiBsb2FkZWQgYmVmb3JlIGl0cyBjb250YWluZXIgYWNjZXNzZWQgaXQKLQkJCQkvLyB0cnkgdG8gZmluZCBpdHMgcmVzb3VyY2UgZGVzY3JpcHRvciB1c2luZyByb290IHJlc291cmNlIG1hbmFnZXIKLQkJCQkvLwotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCQlSZXNvdXJjZU1hbmFnZXIgcm9vdFJlc01nciA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRSb290UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQkJCUl0ZXJhdG9yIGl0ZXIgPSBuZXcgQWJzdHJhY3RUcmVlSXRlcmF0b3Iocm9vdFJlc01ncikgewotCi0JCQkJCQkvKioKLQkJCQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkJCQkgKi8KLQkJCQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIFJlc291cmNlTWFuYWdlcikgewotCQkJCQkJCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKW9iamVjdDsgCi0JCQkJCQkJCWNoaWxkcmVuLmFkZEFsbChyZXNNZ3IuZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpKTsKLQkJCQkJCQkJY2hpbGRyZW4uYWRkQWxsKHJlc01nci5nZXRTdWJNYW5hZ2VycygpKTsKLQkJCQkJCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJfTsKLQkJCQkJVVJJIHVyaSA9IGdldEZpbmFsVVJJKHJlc291cmNlKTsKLQkJCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZihvIGluc3RhbmNlb2YgUmVzb3VyY2VEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBvOwotCQkJCQkJCWlmKHVyaS5lcXVhbHMocmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpKSkgewotCQkJCQkJCQlyZXR1cm4gcmVzRGVzYzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcihNZXRob2RFbGVtZW50IGUpCi0JLy8gewotCS8vIFJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCS8vIGlmKGUuZVJlc291cmNlKCkgIT0gbnVsbCkgewotCS8vIHJlc01nciA9IGdldFJlc291cmNlTWFuYWdlcihlLmVSZXNvdXJjZSgpKTsKLQkvLyB9Ci0JLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSBudWxsOwotCS8vIENvbGxlY3Rpb24gZXhjbHVkZWRSZXNNZ3JzID0gbnVsbDsKLQkvLyBpZihyZXNNZ3IgIT0gbnVsbCkgewotCS8vIGRlc2MgPSBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCkpOwotCS8vIGlmKGRlc2MgIT0gbnVsbCkgcmV0dXJuIGRlc2M7Ci0JLy8gZXhjbHVkZWRSZXNNZ3JzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZXNNZ3IpOwotCS8vIH0KLQkvLwkJCi0JLy8gTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZSk7Ci0JLy8gcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKGxpYi5lUmVzb3VyY2UoKSk7Ci0JLy8JCQotCS8vIHJldHVybiBmaW5kUmVzb3VyY2VEZXNjcmlwdG9yKHJlc01nciwgZS5nZXRHdWlkKCksIGV4Y2x1ZGVkUmVzTWdycyk7Ci0JLy8gfQotCi0JLyoqCi0JICogR2V0cyB0aGUgUmVzb3VyY2VNYW5hZ2VyIGluIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJcmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgZWxlbWVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXNNZ3I7Ci0JfQotCi0Jc3RhdGljIEludGVybmFsRU9iamVjdCBnZXRDb250YWluZXJXaXRoRGlyZWN0UmVzb3VyY2UoSW50ZXJuYWxFT2JqZWN0IG9iaikgewotCQlpZiAob2JqLmVDb250YWluZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVybmFsRU9iamVjdCBjb250YWluZXIgPSAoSW50ZXJuYWxFT2JqZWN0KSAoKEludGVybmFsRU9iamVjdCkgb2JqCi0JCQkJLmVDb250YWluZXIoKSk7Ci0JCWlmIChjb250YWluZXIuZURpcmVjdFJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJfQotCQlyZXR1cm4gZ2V0Q29udGFpbmVyV2l0aERpcmVjdFJlc291cmNlKGNvbnRhaW5lcik7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRIUkVGKFJlc291cmNlIHJlc291cmNlLCBPYmplY3Qgb2JqKSB7Ci0JCU1ldGhvZEVsZW1lbnQgb3duZXIgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCXJldHVybiBNdWx0aUZpbGVVUklDb252ZXJ0ZXIuY3JlYXRlVVJJKG93bmVyLmdldEd1aWQoKSkuYXBwZW5kRnJhZ21lbnQoCi0JCQkJZ2V0R3VpZChvYmopKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhY2t1cEZpbGVTdWZmaXgoKSB7Ci0JCXJldHVybiAiXyIgKyBkYXRlRm9ybWF0dGVyLmZvcm1hdChDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBwcm94eSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiA8Y29kZT5ndWlkPC9jb2RlPiB3aXRob3V0Ci0JICogbG9hZGluZyBhbGwgb3RoZXIgcHJveGllcyBpbiA8Y29kZT5wYXJlbnQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGd1aWQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlUHJveGllcyhDb2xsZWN0aW9uIEdVSURzLCBFT2JqZWN0IHBhcmVudCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyZW50LmVDbGFzcygpLmdldEVBbGxDb250YWlubWVudHMoKQotCQkJCS5pdGVyYXRvcigpOyAhR1VJRHMuaXNFbXB0eSgpICYmIGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgcGFyZW50LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIxID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7ICFHVUlEcy5pc0VtcHR5KCkKLQkJCQkJCSYmIGl0ZXIxLmhhc05leHQoKTsgaW5kZXgrKykgewotCQkJCQlJbnRlcm5hbEVPYmplY3QgY2hpbGQgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZC5lSXNQcm94eSgpKSB7Ci0JCQkJCQlTdHJpbmcgZ3VpZCA9IGNoaWxkLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQlpZiAoR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkvLyB0aGlzIHdpbGwgcmVzb2x2ZSB0aGUgb2JqZWN0IHdpdGggZ3VpZAotCQkJCQkJCS8vCi0JCQkJCQkJbGlzdC5nZXQoaW5kZXgpOwotCQkJCQkJCUdVSURzLnJlbW92ZShndWlkKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlc29sdmVQcm94aWVzKEdVSURzLCBjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUludGVybmFsRU9iamVjdCBjaGlsZCA9IChJbnRlcm5hbEVPYmplY3QpIHBhcmVudC5lR2V0KGZlYXR1cmUsCi0JCQkJCQlmYWxzZSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJaWYgKGNoaWxkLmVJc1Byb3h5KCkpIHsKLQkJCQkJCVN0cmluZyBndWlkID0gY2hpbGQuZVByb3h5VVJJKCkuZnJhZ21lbnQoKTsKLQkJCQkJCWlmIChHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCS8vIHRoaXMgd2lsbCByZXNvbHZlIHRoZSBvYmplY3Qgd2l0aCBndWlkCi0JCQkJCQkJLy8KLQkJCQkJCQlwYXJlbnQuZUdldChmZWF0dXJlKTsKLQkJCQkJCQlHVUlEcy5yZW1vdmUoZ3VpZCk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXNvbHZlUHJveGllcyhHVUlEcywgY2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0RmluYWxVUkkoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsID8gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIHJlc291cmNlKQotCQkJCS5nZXRGaW5hbFVSSSgpCi0JCQkJOiByZXNvdXJjZS5nZXRVUkkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW1wbAotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhZGp1c3RMb2NhdGlvblJlcXVpcmVkKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSkgewotCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7CQkKLQkJaWYoZSAhPSBudWxsICYmIGhhc093bkZvbGRlcihlKSkgewotCQkJVVJJIG5ld1VSSSA9IGNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmKGFkanVzdExvY2F0aW9uUmVxdWlyZWQocmVzb3VyY2UsIG5ld1VSSSkgJiYgIW5ldyBGaWxlKG5ld1VSSS50b0ZpbGVTdHJpbmcoKSkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgaXMgY3VycmVudGx5IHN5bmNocm9uaXplZCB3aXRoIGl0cyBkYXRhIHN0b3JlCi0JICogCi0JICogQHJldHVybiA8bGk+IC0xIGRvbid0IGtub3cKLQkgKiAgICAgICAgIDxsaT4gMCBubwotCSAqICAgICAgICAgPGxpPiAxIHllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNoZWNrU3luY2hyb25pemVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpcmVzb3VyY2UpLmNoZWNrU3luY2hyb25pemVkKCk7Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFNvbWUgdGVhbSBwcm92aWRlcnMgY2hhbmdlZCB0aGUgdGltZXN0YW1wIG9mIGxhc3QgZmlsZSBtb2RpZmljYXRpb24gYnkgcmVtb3Zpbmcgc2Vjb25kIGZyYWN0aW9uCi0JICogZXZlbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQuIFRoaXMgbWV0aG9kIGNoZWNrIHRoZSBjdXJyZW50IGFuZCBvbGQgdGltZSBzdGFtcHMgZm9yIHRoaXMuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnRUaW1lU3RhbXAKLQkgKiBAcGFyYW0gbGFzdFRpbWVTdGFtcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FtZShsb25nIGN1cnJlbnRUaW1lU3RhbXAsIGxvbmcgbGFzdFRpbWVTdGFtcCkgewotCQlyZXR1cm4gY3VycmVudFRpbWVTdGFtcCA8IGxhc3RUaW1lU3RhbXAgJiYgKGN1cnJlbnRUaW1lU3RhbXAgJiA3KSA9PSAwICYmIChsYXN0VGltZVN0YW1wIC0gY3VycmVudFRpbWVTdGFtcCkgPCAxMDAwOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gZW1wdHkgcmVzb3VyY2UgbWFuYWdlciBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5ldyByZXNvdXJjZSBtYW5hZ2VyIGlzIGFkZGVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgUmVzb3VyY2VNYW5hZ2VyIGFkZFJlc291cmNlTWFuYWdlcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlKTsKLQkJaWYgKHJlc01nciA9PSBudWxsKSB7Ci0JCQlyZXNNZ3IgPSBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZU1hbmFnZXIoKTsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKDAsIHJlc01ncik7Ci0JCQlyZXR1cm4gcmVzTWdyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBjaGVja0ZpbGVQYXRoTGVuZ3RoKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBwYXRoTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlpZihyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCAmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbClyZXNvdXJjZSkuaGFzVGVtcFVSSSgpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwYXRoTGlzdC5hZGQocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlpZighcGF0aExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbcGF0aExpc3Quc2l6ZSgpXTsKLQkJCXBhdGhMaXN0LnRvQXJyYXkocGF0aHMpOwotCi0JCQlmb3IgKGludCBpPTA7IGkgPCBwYXRocy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBwYXRoID0gcGF0aHNbaV07Ci0JCQkJaWYgKHBhdGhzW2ldLmxlbmd0aCgpID4gMjU1KSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChQZXJzaXN0ZW5jZVJlc291cmNlcy5maWxlUGF0aE5hbWVUb29Mb25nX21zZywgQXJyYXlzCi0JCQkJCQkJCS5hc0xpc3QocGF0aHMpKTsKLQkJCQkJdGhyb3cgbmV3IE11bHRpRmlsZUlPRXhjZXB0aW9uKG1zZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdHMgYWxsIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgPGNvZGU+Y29uZmlnRGlyPC9jb2RlPiBhbmQgaXRzIHN1YiBkaXJlY3Rvcmllcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnRGlyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgbGlzdENvbmZpZ0ZpbGVzKEZpbGUgY29uZmlnRGlyKSB7Ci0JCXJldHVybiBsaXN0TGlicmFyeUZpbGVzKGNvbmZpZ0Rpcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gbGlzdExpYnJhcnlGaWxlcyhGaWxlIGRpcikgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yPEZpbGU+KGRpciwgZmFsc2UpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjc1ODQzNjE5MzAwMDY0MDkwN0w7Ci0KLQkJCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCQlyZXR1cm4gIUZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNUZWFtUHJpdmF0ZShwYXRobmFtZS5nZXRBYnNvbHV0ZVBhdGgoKSkgJiYKLQkJCQkJCQkocGF0aG5hbWUuaXNEaXJlY3RvcnkoKQotCQkJCQkJCXx8IHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgKLQkJCQkJCQkJCU11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfRklMRV9FWFRFTlNJT04pKTsKLQkJCQl9Ci0KLQkJCX07Ci0KLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxGaWxlPiBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJRmlsZVtdIGZpbGVzID0gKChGaWxlKSBvYmplY3QpLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoZmlsZXMpLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlVVJJQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjQyOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVVUklDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVVJJIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGEgZmlsZS1iYXNlZCBVUkkgdG8gYSBVTUEtYmFzZWQgVVJJIGFuZCB2aWNlCi0gKiB2ZXJzYSB1c2luZyB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gUmVzb3VyY2VEZXNjcmlwdG9ycyBvZgotICogUmVzb3VyY2VNYW5hZ2VyLiBBIFVNQS1iYXNlZCBVUkkgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotICogdW1hOi8vR1VJRDEjR1VJRDIgd2hlcmUgR1VJRDEgaXMgdGhlIEdVSUQgb2YgdGhlIGZpbGUgYW5kIEdVSUQyIGlzIHRoZQotICogb2JqZWN0J3MgR1VJRC4gCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRSA9ICJ1bWEiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoU2V0IGxvY2tlZEdVSURzID0gbmV3IEhhc2hTZXQoKTsKLQotCXByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXIgcmVzTWdyOwotCi0JcHJpdmF0ZSBVUkkgbGlicmFyeVVSSTsKLQotCXByaXZhdGUgVVJJIGxpYnJhcnlVbWFVUkk7Ci0KLQlwcml2YXRlIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgTXVsdGlGaWxlVVJJQ29udmVydGVyKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCkgewotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0JfQotCi0Jdm9pZCBzZXRSZXNvbHZlUHJveHkoYm9vbGVhbiByZXNvbHZlUHJveHkpIHsKLQkJdGhpcy5yZXNvbHZlUHJveHkgPSByZXNvbHZlUHJveHk7Ci0JfQotCi0Jdm9pZCBzZXRMaWJyYXJ5VVJJcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJbGlicmFyeVVSSSA9IGxpYnJhcnkuZVJlc291cmNlKCkuZ2V0VVJJKCk7Ci0JCWxpYnJhcnlVbWFVUkkgPSBVUkkuY3JlYXRlVVJJKG5ldyBTdHJpbmdCdWZmZXIoU0NIRU1FKQotCQkJCS5hcHBlbmQoIjovLyIpLmFwcGVuZChsaWJyYXJ5LmdldEd1aWQoKSkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvY2tHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCWxvY2tlZEdVSURzLmFkZChndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NrZWRHVUlEKFN0cmluZyBndWlkKSB7Ci0JCXN5bmNocm9uaXplZCAobG9ja2VkR1VJRHMpIHsKLQkJCXJldHVybiBsb2NrZWRHVUlEcy5jb250YWlucyhndWlkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdW5sb2NrR1VJRChTdHJpbmcgZ3VpZCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tlZEdVSURzKSB7Ci0JCQlyZXR1cm4gbG9ja2VkR1VJRHMucmVtb3ZlKGd1aWQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5VUklDb252ZXJ0ZXJJbXBsI25vcm1hbGl6ZShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmkpIHsKLQkJcmV0dXJuIG5vcm1hbGl6ZSh1cmksIG51bGwpOwotCX0KLQotCXB1YmxpYyBVUkkgbm9ybWFsaXplKFVSSSB1cmksIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJaWYgKFNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaS5zY2hlbWUoKSkpIHsKLQkJCVN0cmluZyBndWlkID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYgKGlzTG9ja2VkR1VJRChndWlkKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlsb2NrR1VJRChndWlkKTsKLQotCQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gbnVsbDsKLQkJCQlIYXNoU2V0IGV4Y2x1ZGVkUmVzTWFuYWdlcnMgPSBudWxsOwotCQkJCWlmIChyZXNvbHZlciAhPSBudWxsICYmIHJlc29sdmVyLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihyZXNvbHZlci5lUmVzb3VyY2UoKSk7Ci0JCQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCQkJZGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IocmVzTWdyLAotCQkJCQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCQkJCQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJCQkJCS8vIGFkZCB0aGlzIFJlc291cmNlTWFuYWdlciBhbmQgaXRzIHN1Ym1hbmFnZXJzIHRvCi0JCQkJCQkJLy8gZXhjbHVkZWRSZXNNYW5hZ2VycwotCQkJCQkJCS8vIHNvIHRoZSBuZXh0IHNlYXJjaCBmb3IgUmVzb3VyY2VEZXNjcmlwdG9yIHdpbGwKLQkJCQkJCQkvLyBpZ25vcmUgdGhlbQotCQkJCQkJCS8vCi0JCQkJCQkJZXhjbHVkZWRSZXNNYW5hZ2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCQkJSXRlcmF0b3IgaXRlciA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihyZXNNZ3IpIHsKLQotCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQkJCQkJcmV0dXJuICgoUmVzb3VyY2VNYW5hZ2VyKSBvYmplY3QpCi0JCQkJCQkJCQkJCS5nZXRTdWJNYW5hZ2VycygpLml0ZXJhdG9yKCk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCX07Ci0JCQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJCWV4Y2x1ZGVkUmVzTWFuYWdlcnMuYWRkKGl0ZXIubmV4dCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlc2MgPT0gbnVsbCAmJiBnZXRSZXNvdXJjZU1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJCWRlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbC5maW5kUmVzb3VyY2VEZXNjcmlwdG9yKAotCQkJCQkJCWdldFJlc291cmNlTWFuYWdlcigpLCBndWlkLCBleGNsdWRlZFJlc01hbmFnZXJzLAotCQkJCQkJCXJlc29sdmVQcm94eSk7Ci0JCQkJfQotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJVVJJIG5vcm1hbGl6ZWQgPSBkZXNjLmdldFJlc29sdmVkVVJJKCk7Ci0KLQkJCQkJLy8gY2hlY2sgaWYgdGhlIHJlc291cmNlIHdpdGggdGhpcyBub3JtYWxpemVkIFVSSSBoYXMKLQkJCQkJLy8gdGVtcG9yYXJ5IFVSSQotCQkJCQkvLwotCQkJCQlVUkkgdGVtcFVSSSA9IChVUkkpIHJlc291cmNlU2V0LmdldFVSSVRvVGVtcFVSSU1hcCgpLmdldCgKLQkJCQkJCQlub3JtYWxpemVkKTsKLQkJCQkJaWYgKHRlbXBVUkkgIT0gbnVsbCkgewotCQkJCQkJbm9ybWFsaXplZCA9IHRlbXBVUkk7Ci0JCQkJCX0KLQotCQkJCQlpZiAodXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQkJCW5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBub3JtYWxpemVkOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdW5sb2NrR1VJRChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdXBlci5ub3JtYWxpemUodXJpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGwjY3JlYXRlSW5wdXRTdHJlYW0ob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gY3JlYXRlSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbnB1dFN0cmVhbSh1cmkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShuZXcgU3RyaW5nQnVmZmVyKFNDSEVNRSkKLQkJCQkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQoZ3VpZCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSSSBjcmVhdGVVUkkoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKGNyZWF0ZVVyaVN0cmluZyhlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVXJpU3RyaW5nKE9iamVjdCBlKSB7Ci0JCUludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdCkgZTsKLQotCQlVUkkgb2JqZWN0VVJJID0gby5lUHJveHlVUkkoKTsKLQkJaWYgKG9iamVjdFVSSSAhPSBudWxsICYmIFNDSEVNRS5lcXVhbHMob2JqZWN0VVJJLnNjaGVtZSgpKSkgewotCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQl9Ci0KLQkJU3RyaW5nIGd1aWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGUpOwotCQlpZiAoZ3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcihTQ0hFTUUpLmFwcGVuZCgiOi8vIikuYXBwZW5kKGd1aWQpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBwdWJsaWMgVVJJIHRvVW1hVXJpKFVSSSB1cmkpIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpRmlsZVVSSUNvbnZlcnRlci50b1VtYVVyaSgpOiB1cmk9Iit1cmkpOwotCS8vIGlmKHVyaS5zY2hlbWUoKS5lcXVhbHMoInVtYSIpIHx8IHVyaURlc2NNYXAgPT0gbnVsbCkgcmV0dXJuIHVyaTsKLQkvLyBpZihsaWJyYXJ5VVJJLmVxdWFscyh1cmkpKSByZXR1cm4gbGlicmFyeVVtYVVSSTsKLQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpCi0JLy8gdXJpRGVzY01hcC5nZXQodXJpLnRyaW1GcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCS8vIHJldHVybiBkZXNjID09IG51bGwgPyB1cmkgOiBVUkkuY3JlYXRlVVJJKCJ1bWE6Ly8iICsKLQkvLyBkZXNjLmdldElkKCkpLmFwcGVuZEZyYWdtZW50KHVyaS5mcmFnbWVudCgpKTsKLQkvLyB9Ci0KLQkvLyBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCS8vIHRoaXMucmVzTWdyID0gcmVzTWdyOwotCS8vIH0KLQotCXB1YmxpYyBSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgewotCQlpZiAocmVzTWdyID09IG51bGwpIHsKLQkJCXJlc01nciA9IHJlc291cmNlU2V0LmdldFJvb3RSZXNvdXJjZU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVzTWdyOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIEdVSUQgZnJvbSByb290IFJlc291cmNlTWFuYWdlcgotCSAqIAotCSAqIEBwYXJhbSBndWlkCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZURlc2NyaXB0b3IgZmluZFJlc291cmNlRGVzY3JpcHRvcihTdHJpbmcgZ3VpZCkgewotCQlyZXR1cm4gTXVsdGlGaWxlU2F2ZVV0aWwuZmluZFJlc291cmNlRGVzY3JpcHRvcihnZXRSZXNvdXJjZU1hbmFnZXIoKSwKLQkJCQlndWlkLCBudWxsLCByZXNvbHZlUHJveHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJcmVzTWdyLmRpc3Bvc2UoKTsKLQkJCXJlc01nciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcGFyYW0gbW9kaWZpZWRSZXNvdXJjZXMKLQkgKiAgICAgICAgICAgIG91dHB1dCBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBhZnRlciB0aGlzIGNhbGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQlzZXRVUklNYXBwaW5nKGUsIHVyaSwgbW9kaWZpZWRSZXNvdXJjZXMsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSSU1hcHBpbmcoRU9iamVjdCBlLCBVUkkgdXJpLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMsCi0JCQlib29sZWFuIGFmdGVyTW92ZSkgewotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQoZSk7Ci0JCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRSZXNvdXJjZU1hbmFnZXJGb3IoZSwKLQkJCQltb2RpZmllZFJlc291cmNlcyk7Ci0JCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihndWlkKTsKLQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCXJlc0Rlc2Muc2V0UmVzb2x2ZWRVUkkodXJpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJcmVzRGVzYy5nZXRSZXNvbHZlZFVSSSgpOwotCQkJCS8vIHNldCBuZXcgVVJJIHN0cmluZyBmb3IgdGhlIHVwY29taW5nIG1vdmUKLQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKAotCQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzRGVzYy5lUmVzb3VyY2UoKSkpCi0JCQkJCQkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzRGVzYy5lUmVzb3VyY2UoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBmaW5kIHRoZSBSZXNvdXJjZURlc2NyaXB0b3IgaW4gb3RoZXIgUmVzb3VyY2VNYW5hZ2VycwotCQkJLy8KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGUKLQkJCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgbGliUmVzTWdyID0gcmVzb3VyY2VTZXQuZ2V0Um9vdFJlc291cmNlTWFuYWdlcigpOwotCQkJcmVzRGVzYyA9IE11bHRpRmlsZVNhdmVVdGlsLmZpbmRSZXNvdXJjZURlc2NyaXB0b3IobGliUmVzTWdyLCBndWlkLAotCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlc01nciksIHJlc29sdmVQcm94eSk7Ci0JCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJLy8gUmVzb3VyY2VEZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzCi0JCQkJLy8gY2hhbmdlIGl0cyB1cmksIG1vdmUgaXQgYW5kIGl0cyBzdWIgbWFuYWdlciwgaWYgdGhlcmUgaXMgYW55LAotCQkJCS8vIHRvIG5ldyBSZXNvdXJjZU1hbmFnZXIKLQkJCQkvLwotCi0JCQkJLy8gZmluZCBzdWIgbWFuYWdlcgotCQkJCVJlc291cmNlTWFuYWdlciBjdXJyZW50UmVzTWdyID0gKFJlc291cmNlTWFuYWdlcikgcmVzRGVzYwotCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQlSZXNvdXJjZU1hbmFnZXIgc3ViTWdyID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjdXJyZW50UmVzTWdyLmdldFN1Yk1hbmFnZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2VNYW5hZ2VyIG1nciA9IChSZXNvdXJjZU1hbmFnZXIpIGl0ZXIubmV4dCgpOwotCQkJCQlVUkkgbWdyVVJJID0gKChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG1nci5lUmVzb3VyY2UoKSkKLQkJCQkJCQkuZ2V0RmluYWxVUkkoKTsKLQkJCQkJaWYgKG1nclVSSS5lcXVhbHModXJpKSkgewotCQkJCQkJc3ViTWdyID0gbWdyOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBtb3ZlIFJlc291cmNlRGVzY3JpcHRvcgotCQkJCXJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuYWRkKHJlc0Rlc2MpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKSB7Ci0JCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZChjdXJyZW50UmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc01nci5lUmVzb3VyY2UoKSk7Ci0JCQkJfQotCi0JCQkJLy8gbW92ZSBzdWIgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJaWYgKHN1Yk1nciAhPSBudWxsKSB7Ci0JCQkJCXJlc01nci5nZXRTdWJNYW5hZ2VycygpLmFkZChzdWJNZ3IpOwotCQkJCX0KLQotCQkJCS8vIHNldCBuZXcgVVJJCi0JCQkJaWYgKGFmdGVyTW92ZSkgewotCQkJCQlyZXNEZXNjLnNldFJlc29sdmVkVVJJKHVyaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcHJlc2VydmUgdGhlIGN1cnJlbnQgcmVzb2x2ZWQgVVJJCi0JCQkJCXJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQkJLy8gc2V0IG5ldyBVUkkgc3RyaW5nIGZvciB0aGUgdXBjb21pbmcgbW92ZQotCQkJCQlyZXNEZXNjLnNldFVyaSh1cmkuZGVyZXNvbHZlKHJlc0Rlc2MuZVJlc291cmNlKCkuZ2V0VVJJKCkpCi0JCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCQlpZiAobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkKLQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc0Rlc2MuZVJlc291cmNlKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIocmVzTWdyLCBlLCB1cmkpOwotCQkJCWlmIChtb2RpZmllZFJlc291cmNlcyAhPSBudWxsKQotCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQocmVzTWdyLmVSZXNvdXJjZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVVJJIHVyaSA9IFVSSQotCQkJCS5jcmVhdGVVUkkoInVtYTovL19MUHpkQUdaN0VkbUFtX3hTWDJFZFVBIy8vQGJyZWFrZG93bkVsZW1lbnRzLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4odXJpKTsKLQkJU3lzdGVtLm91dAotCQkJCS5wcmludGxuKCJkZXJlc29sdmVkIFVSSTogIiArIHVyaS5kZXJlc29sdmUoVVJJLmNyZWF0ZVVSSSgidW1hOi8vX0xQemRBR1o3RWRtQW1feFNYMkVkVUEiKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUhlbHBlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhhMDhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JSGVscGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVuaXF1ZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIFhNTEhlbHBlciBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSUhlbHBlckltcGwgZXh0ZW5kcyBYTUlIZWxwZXJJbXBsIHsKLQotCS8qKgotCSAqIFBsYXRmb3JtLXNwZWNpZmljIGxpbmUgc2VwYXJhdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9nRXJyb3IgPSB0cnVlOwotCi0JcHJvdGVjdGVkIExpc3Qgc2FtZURvY1JlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGlzY2FyZFVucmVzb2x2ZWRSZWY7Ci0JCi0JLyoqCi0JICogQSB0ZW1wb3JhcnkgZmxhZyB0byBoYXZlIGEgcXVpY2sgZml4IGZvciBnZXRWYWx1ZSBtZXRob2QgY2FsbCB3aXRob3V0IG1vZGlmeWluZyB0aGUgcGFzc2VkCi0JICogb2JqZWN0LiBTaG91bGQgYmUgcmVtb3ZlZCB3aXRoIGZ1dHVyZSByZWZhY3RvcmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdW5tb2RpZmllZEdldFZhbHVlID0gZmFsc2U7CQkKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpRmlsZVhNSUhlbHBlckltcGwoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIHhtaVJlcykgewotCQlzdXBlcih4bWlSZXMpOwotCQlzYW1lRG9jUmVmZXJlbmNlcyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHhtaVJlcwotCQkJCS5nZXRSZXNvdXJjZVNldCgpKS5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5nZXQoCi0JCQkJTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlkaXNjYXJkVW5yZXNvbHZlZFJlZiA9IGIgIT0gbnVsbCA/IGIuYm9vbGVhblZhbHVlKCkgOiBmYWxzZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjc2V0UmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZShYTUxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlzdXBlci5zZXRSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKSB7Ci0JCQlyZXNvdXJjZVVSSSA9ICgoTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKXJlc291cmNlKS5nZXRGaW5hbFVSSSgpOwotCQkJZGVyZXNvbHZlID0gcmVzb3VyY2VVUkkgIT0gbnVsbCAmJiAhcmVzb3VyY2VVUkkuaXNSZWxhdGl2ZSgpICYmIHJlc291cmNlVVJJLmlzSGllcmFyY2hpY2FsKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxIZWxwZXJJbXBsI2dldEhSRUYob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIUkVGKEVPYmplY3Qgb2JqKSB7Ci0JCWlmIChkaXNjYXJkVW5yZXNvbHZlZFJlZikgewotCQkJLy8gcmVtb3ZlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcwotCQkJLy8KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdAotCQkJCQkmJiAhKChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqKS5pc1ZhbGlkKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBvYmo7Ci0KLQkJCVVSSSBvYmplY3RVUkkgPSBvLmVQcm94eVVSSSgpOwotCQkJaWYgKG9iamVjdFVSSSA9PSBudWxsKSB7Ci0JCQkJUmVzb3VyY2Ugb3RoZXJSZXNvdXJjZSA9IG9iai5lUmVzb3VyY2UoKTsKLQkJCQlpZiAob3RoZXJSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCW9iamVjdFVSSSA9IGhhbmRsZURhbmdsaW5nSFJFRihvYmopOwotCQkJCQlpZiAob2JqZWN0VVJJID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXNvdXJjZSA9PSBvdGhlclJlc291cmNlKSB7Ci0JCQkJCXJldHVybiAiIyIgKyByZXNvdXJjZS5nZXRVUklGcmFnbWVudChvYmopOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQkJCS8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIE1ldGhvZENvbmZpZ3VyYXRpb24uCi0JCQkJCQkvLyBTZWUKLQkJCQkJCS8vIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwubG9hZENvbmZpZ3VyYXRpb25zKCkKLQkJCQkJCS8vCi0JCQkJCQlFT2JqZWN0IGxpYiA9IG9iai5lQ29udGFpbmVyKCk7Ci0JCQkJCQlpZiAobGliICE9IG51bGwpIHsKLQkJCQkJCQlvdGhlclJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAob3RoZXJSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG90aGVyUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJCWlmKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIAotCQkJCQkJCQkmJiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJCQkJCW9iamVjdFVSSSA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEZpbmFsVVJJKG90aGVyUmVzb3VyY2UpLmFwcGVuZEZyYWdtZW50KGdldFVSSUZyYWdtZW50KG90aGVyUmVzb3VyY2UsIG9iaikpOwotCQkJCQkJCXJldHVybiBkZXJlc29sdmUob2JqZWN0VVJJKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc0Rlc2MgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKG90aGVyUmVzb3VyY2UpOwotCQkJCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQkJCW9iamVjdFVSSSA9IE11bHRpRmlsZVVSSUNvbnZlcnRlci5jcmVhdGVVUkkoCi0JCQkJCQkJCQlyZXNEZXNjLmdldElkKCkpLmFwcGVuZEZyYWdtZW50KAotCQkJCQkJCQkJZ2V0VVJJRnJhZ21lbnQob3RoZXJSZXNvdXJjZSwgb2JqKSk7Ci0JCQkJCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCFvYmplY3RVUkkuc2NoZW1lKCkuZXF1YWxzKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUpKSB7Ci0JCQkJCVN0cmluZyBmcmFnbWVudCA9IG9iamVjdFVSSS5mcmFnbWVudCgpOwotCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwKLQkJCQkJCQkmJiAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpCi0JCQkJCQkJCQkuZ2V0RU9iamVjdEJ5SUQoZnJhZ21lbnQpICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiAiIyIgKyBmcmFnbWVudDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9IGVsc2UgewotCQkJCQkJb2JqZWN0VVJJID0gZGVyZXNvbHZlKG9iamVjdFVSSSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG9iamVjdFVSSS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEhSRUYob2JqKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByb3h5UmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBJbnRlcm5hbEVPYmplY3Qgb3duZXI7Ci0KLQkJcHJpdmF0ZSBFUmVmZXJlbmNlIHJlZmVyZW5jZTsKLQotCQlwcml2YXRlIEludGVybmFsRU9iamVjdCBwcm94eTsKLQotCQkvKioKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqIEBwYXJhbSByZWZlcmVuY2UKLQkJICogQHBhcmFtIHByb3h5Ci0JCSAqLwotCQlwdWJsaWMgUHJveHlSZWZlcmVuY2UoSW50ZXJuYWxFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCQlJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKLQkJCXRoaXMucHJveHkgPSBwcm94eTsKLQkJfQotCi0JCXB1YmxpYyBJbnRlcm5hbEVPYmplY3QgZ2V0T3duZXIoKSB7Ci0JCQlyZXR1cm4gb3duZXI7Ci0JCX0KLQotCQlwdWJsaWMgSW50ZXJuYWxFT2JqZWN0IGdldFByb3h5KCkgewotCQkJcmV0dXJuIHByb3h5OwotCQl9Ci0KLQkJcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKCkgewotCQkJcmV0dXJuIHJlZmVyZW5jZTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBvYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLAotCQkJT2JqZWN0IHZhbHVlLCBpbnQgcG9zaXRpb24pIHsKLQotCQlpbnQga2luZCA9IGdldEZlYXR1cmVLaW5kKGZlYXR1cmUpOwotCi0JCXRyeSB7Ci0JCQkvLyBUT0RPOiB0ZW1wb3JhcnkgZml4IHRvIGF2b2lkIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwKLQkJCS8vIG5lZWRzIHJldmlzaXQKLQkJCS8vCi0JCQlpZiAoa2luZCA9PSBJU19NQU5ZX01PVkUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgb2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKHBvc2l0aW9uID4gLTEgJiYgbGlzdC5pbmRleE9mKHZhbHVlKSA9PSAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQlzdXBlci5zZXRWYWx1ZShvYmplY3QsIGZlYXR1cmUsIHZhbHVlLCBwb3NpdGlvbik7Ci0KLQkJCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJU19NQU5ZX0FERDoKLQkJCWNhc2UgSVNfTUFOWV9NT1ZFOgotCQkJCUludGVybmFsRUxpc3QgbGlzdCA9IChJbnRlcm5hbEVMaXN0KSBvYmplY3QuZUdldChmZWF0dXJlKTsKLQotCQkJCS8vIHNhdmUgc2FtZSBkb2N1bWVudCBmb3J3YXJkICh1bmlkaXJlY3Rpb25hbCkgcmVmZXJlbmNlcyB0bwotCQkJCS8vIHJlc29sdmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudCBwYXJzaW5nCi0JCQkJLy8JCQkJCi0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBFUmVmZXJlbmNlKSB7Ci0JCQkJCUVSZWZlcmVuY2UgcmVmID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJCWlmIChyZWYuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG93bmVyID0gKEludGVybmFsRU9iamVjdCkgb2JqZWN0OwotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0JCQkJCQkJaWYgKGVsZW1lbnQuZUlzUHJveHkoKQotCQkJCQkJCQkJJiYgZWxlbWVudC5lUHJveHlVUkkoKS50cmltRnJhZ21lbnQoKQotCQkJCQkJCQkJCQkuZXF1YWxzKHJlc291cmNlVVJJKSkgewotCQkJCQkJCQlzYW1lRG9jUmVmZXJlbmNlcy5hZGQobmV3IFByb3h5UmVmZXJlbmNlKG93bmVyLAotCQkJCQkJCQkJCXJlZiwgZWxlbWVudCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWJyZWFrOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChsb2dFcnJvcikgewotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJU3RyaW5nIGVyck1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoCi0JCQkJCQkiTXVsdGlGaWxlWE1JSGVscGVySW1wbC5zZXRWYWx1ZSgpOiBFUlJPUiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBvYmplY3Q6ICIpLmFwcGVuZChvYmplY3QpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBmZWF0dXJlOiAiKS5hcHBlbmQoZmVhdHVyZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiXG4gIHZhbHVlOiAiKS5hcHBlbmQodmFsdWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIlxuICBwb3NpdGlvbjogIikuYXBwZW5kKHBvc2l0aW9uKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKCJcbiAga2luZDogIikuYXBwZW5kKGtpbmQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS50b1N0cmluZygpOwotCQkJCWlmKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJNc2cpOwotCQkJCX0KLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGVyck1zZyk7Ci0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTEhlbHBlckltcGwjZ2V0VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZShFT2JqZWN0IG9iaiwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJT2JqZWN0IHZhbHVlID0gc3VwZXIuZ2V0VmFsdWUob2JqLCBmKTsKLQkJCi0JCWlmICh1bm1vZGlmaWVkR2V0VmFsdWUpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCQkKLQkJLy8gcmVtb3ZlIGFueSB2YWx1ZSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byBhbnkgcmVzb3VyY2UKLQkJLy8KLQkJaWYoZiBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCWlmKGYuaXNNYW55KCkpIHsKLQkJCQlpZihmLmlzQ2hhbmdlYWJsZSgpICYmIHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQlJbnRlcm5hbEVMaXN0IGxpc3QgPSAoSW50ZXJuYWxFTGlzdCkgdmFsdWU7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCQlpZighby5lSXNQcm94eSgpICYmIG8uZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgdmFsdWU7Ci0JCQkJaWYoIW8uZUlzUHJveHkoKSAmJiBvLmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSUxvYWRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YWViMzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlMb2FkSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlNBWFhNSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSUxvYWRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogWE1MTG9hZCBpbXBsZW1lbnRhdGlvbiBmb3IgbGlicmFyeSBYTUkgcGVyc2lzdGVuY2UKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE11bHRpRmlsZVhNSUxvYWRJbXBsIGV4dGVuZHMgWE1JTG9hZEltcGwgewotCi0JcHVibGljIE11bHRpRmlsZVhNSUxvYWRJbXBsKFhNTEhlbHBlciBoZWxwZXIpIHsKLQkJc3VwZXIoaGVscGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVmYXVsdEhhbmRsZXIgbWFrZURlZmF1bHRIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3IFNBWFhNSUhhbmRsZXIocmVzb3VyY2UsIGhlbHBlciwgb3B0aW9ucykgewotCQkJICAKLQkJCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0RmVhdHVyZShFT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNFbGVtZW50KSB7Ci0JCQkJaWYgKEVQRlZlcnNpb25zLlRPT0xfSUQuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci5nZXRGZWF0dXJlKG9iamVjdCwgcHJlZml4LCBuYW1lLCBpc0VsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duRmVhdHVyZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0VsZW1lbnQsIEVPYmplY3QgcGVla09iamVjdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKEVQRlZlcnNpb25zLlRPT0xfSUQuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlzdXBlci5oYW5kbGVVbmtub3duRmVhdHVyZShwcmVmaXgsIG5hbWUsIGlzRWxlbWVudCwgcGVla09iamVjdCwgdmFsdWUpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBlbmREb2N1bWVudCgpIHsKLQkJCQlzdXBlci5lbmREb2N1bWVudCgpOwotCi0JCQkJaWYgKGhlbHBlciBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSUhlbHBlckltcGwpIHsKLQkJCQkJTGlzdCBzYW1lRG9jUmVmZXJlbmNlcyA9ICgoTXVsdGlGaWxlWE1JSGVscGVySW1wbCkgaGVscGVyKS5zYW1lRG9jUmVmZXJlbmNlczsKLQkJCQkJaWYgKCFzYW1lRG9jUmVmZXJlbmNlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNhbWVEb2NSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNdWx0aUZpbGVYTUlIZWxwZXJJbXBsLlByb3h5UmVmZXJlbmNlIHByb3h5UmVmID0gKE11bHRpRmlsZVhNSUhlbHBlckltcGwuUHJveHlSZWZlcmVuY2UpIGl0ZXIKLQkJCQkJCQkJCS5uZXh0KCk7Ci0KLQkJCQkJCQkvLyB0aGlzIHdpbGwgbWVyZ2UgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwcyBhcyB3ZWxsCi0JCQkJCQkJRU9iamVjdCByZXNvbHZlZCA9IHByb3h5UmVmLmdldE93bmVyKCkKLQkJCQkJCQkJCS5lUmVzb2x2ZVByb3h5KHByb3h5UmVmLmdldFByb3h5KCkpOwotCi0JCQkJCQkJSW50ZXJuYWxFTGlzdCB2YWx1ZXMgPSAoSW50ZXJuYWxFTGlzdCkgcHJveHlSZWYKLQkJCQkJCQkJCS5nZXRPd25lcigpLmVHZXQocHJveHlSZWYuZ2V0UmVmZXJlbmNlKCkpOwotCQkJCQkJCWludCBpbmRleCA9IHZhbHVlcy5iYXNpY0xpc3QoKS5pbmRleE9mKAotCQkJCQkJCQkJcHJveHlSZWYuZ2V0UHJveHkoKSk7Ci0JCQkJCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJCXZhbHVlcy5zZXRVbmlxdWUoaW5kZXgsIHJlc29sdmVkKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MTG9hZEltcGwjbG9hZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSwgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkKFhNTFJlc291cmNlIHJlc291cmNlLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgTWFwIG9wdGlvbnMpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gc3RyaXAgb2ZmIHRoZSBVVEYtOCBCT00gYnl0ZXMgaWYgdGhleSBhcmUgc3RpbGwgdGhlcmUKLQkJCS8vCi0JCQlQdXNoYmFja0lucHV0U3RyZWFtIHBiaXMgPSBuZXcgUHVzaGJhY2tJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgMyk7Ci0JCQlieXRlIGJvbVtdID0gbmV3IGJ5dGVbM107Ci0JCQlpZiAocGJpcy5yZWFkKGJvbSkgPT0gMykgewotCQkJCWlmIChib21bMF0gIT0gKGJ5dGUpIDB4RUYgfHwgYm9tWzFdICE9IChieXRlKSAweEJCCi0JCQkJCQl8fCBib21bMl0gIT0gKGJ5dGUpIDB4QkYpIHsKLQkJCQkJcGJpcy51bnJlYWQoYm9tKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXN1cGVyLmxvYWQocmVzb3VyY2UsIHBiaXMsIG9wdGlvbnMpOwotCQl9IGNhdGNoIChSZXNvdXJjZS5JT1dyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJaWYgKCFyZXNvdXJjZS5nZXRFcnJvcnMoKS5pc0VtcHR5KCkgJiYgaGVscGVyID09IG51bGwpIHsKLQkJCQkvLyB1bmtub3duIGZlYXR1cmVzIGRldGVjdGVkLCBsb2cgdGhlIHdhcm5pbmcgYW5kIGlnbm9yZSB0aGVtCi0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RXJyb3JzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRXhjZXB0aW9uIGV4ID0gKEV4Y2VwdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZXguZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZWM1ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9NdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MTG9hZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuaW50ZXJuYWwuSUZhaWxTYWZlU2F2YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5SZWZyZXNoSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFJlc291cmNlIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIAotaW1wbGVtZW50cyBJTGlicmFyeVJlc291cmNlLCBJRmFpbFNhZmVTYXZhYmxlCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcERpcjsKLQotCXByaXZhdGUgVVJJIGZpbmFsVVJJOwotCi0JcHJpdmF0ZSBVUkkgb2xkVVJJOwotCi0JcHJpdmF0ZSBTdHJpbmcgYmFja3VwRmlsZTsKLQotCXByaXZhdGUgU3RyaW5nIGN1cnJlbnRUeElEOwotCi0JcHJpdmF0ZSBsb25nIGxhc3RMb2FkVGltZVN0YW1wOwotCi0JcHJpdmF0ZSBSZXNvdXJjZURlc2NyaXB0b3IgcmVzb3VyY2VEZXNjcmlwdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5sb2FkaW5nOwotCi0JLyoqIENhY2hlZCBtb2RpZmljYXRpb24gc3RhbXAgb2YgdGhlIHJlc291cmNlIGZpbGUgKi8KLQlwcml2YXRlIGxvbmcgbW9kaWZpY2F0aW9uU3RhbXA7Ci0KLQlwcml2YXRlIElGaWxlSW5mbyBmaWxlSW5mbzsKLQotCXB1YmxpYyBNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwoVVJJIHVyaSkgewotCQlzdXBlcih1cmkpOwotCQlzZXRJbnRyaW5zaWNJRFRvRU9iamVjdE1hcChuZXcgSGFzaE1hcCgpKTsJCQotCX0KLQotCXByb3RlY3RlZCBYTUxMb2FkIGNyZWF0ZVhNTExvYWQoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlWE1JTG9hZEltcGwoY3JlYXRlWE1MSGVscGVyKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNjcmVhdGVYTUxTYXZlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGwjY3JlYXRlWE1MSGVscGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpIHsKLQkJcmV0dXJuIG5ldyBNdWx0aUZpbGVYTUlIZWxwZXJJbXBsKHRoaXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSNnZXRJRChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElEKEVPYmplY3QgZU9iamVjdCkgewotCQlTdHJpbmcgaWQgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRHdWlkKGVPYmplY3QpOwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXJldHVybiBpZDsKLQkJcmV0dXJuIHN1cGVyLmdldElEKGVPYmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNzZXRJRChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoRU9iamVjdCBlT2JqZWN0LCBTdHJpbmcgaWQpIHsKLQkJT2JqZWN0IG9sZElEID0gaWQgIT0gbnVsbCA/IGdldEVPYmplY3RUb0lETWFwKCkucHV0KGVPYmplY3QsIGlkKQotCQkJCTogZ2V0RU9iamVjdFRvSURNYXAoKS5yZW1vdmUoZU9iamVjdCk7Ci0KLQkJaWYoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJfQotCQlNYXAgZ3VpZFRvTWV0aG9kRWxlbWVudE1hcCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpKQotCQkJCS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCk7Ci0KLQkJaWYgKG9sZElEICE9IG51bGwpIHsKLQkJCWdldElEVG9FT2JqZWN0TWFwKCkucmVtb3ZlKG9sZElEKTsKLQkJCQotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJLy8gcmVtb3ZlIG9iamVjdCBmcm9tIGd1aWRUb01ldGhvZEVsZW1lbnRNYXAgb25seSBpZiBpdCBpcyBhIHByb3h5Ci0JCQkJLy8KLQkJCQlpZihlT2JqZWN0LmVJc1Byb3h5KCkpIHsKLQkJCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5nZXQoaWQpOwotCQkJCQlpZihvYmogIT0gbnVsbCAmJiBvYmouZUlzUHJveHkoKSkgewotCQkJCQkJZ3VpZFRvTWV0aG9kRWxlbWVudE1hcC5yZW1vdmUoaWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlndWlkVG9NZXRob2RFbGVtZW50TWFwLnJlbW92ZShpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCWdldElEVG9FT2JqZWN0TWFwKCkucHV0KGlkLCBlT2JqZWN0KTsKLQkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWd1aWRUb01ldGhvZEVsZW1lbnRNYXAucHV0KGlkLCBlT2JqZWN0KTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBlT2JqZWN0OwotCQkJCWlmICghZS5nZXRHdWlkKCkuZXF1YWxzKGlkKSkgewotCQkJCQllLnNldEd1aWQoaWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCN1c2VVVUlEcygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlVVVJRHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlI2dldFVSSUZyYWdtZW50KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJRnJhZ21lbnQoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRJRChlT2JqZWN0KTsKLQotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gaWQ7Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgdXJpRnJhZ21lbnRQYXRoID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoRU9iamVjdCBjb250YWluZXIgPSBlT2JqZWN0LmVDb250YWluZXIoKTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkJCSYmIGNvbnRhaW5lci5lUmVzb3VyY2UoKSA9PSB0aGlzOyBjb250YWluZXIgPSBlT2JqZWN0Ci0JCQkJCQkuZUNvbnRhaW5lcigpKSB7Ci0JCQkJCXVyaUZyYWdtZW50UGF0aC5hZGQoKChJbnRlcm5hbEVPYmplY3QpIGNvbnRhaW5lcikKLQkJCQkJCQkuZVVSSUZyYWdtZW50U2VnbWVudChlT2JqZWN0LmVDb250YWluaW5nRmVhdHVyZSgpLAotCQkJCQkJCQkJZU9iamVjdCkpOwotCQkJCQllT2JqZWN0ID0gY29udGFpbmVyOwotCQkJCX0KLQotCQkJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKGdldFVSSUZyYWdtZW50Um9vdFNlZ21lbnQoZU9iamVjdCkpOwotCi0JCQkJZm9yIChMaXN0SXRlcmF0b3IgaSA9IHVyaUZyYWdtZW50UGF0aAotCQkJCQkJLmxpc3RJdGVyYXRvcih1cmlGcmFnbWVudFBhdGguc2l6ZSgpKTsgaS5oYXNQcmV2aW91cygpOykgewotCQkJCQlyZXN1bHQuYXBwZW5kKCcvJyk7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoKFN0cmluZykgaS5wcmV2aW91cygpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgZ2V0dGluZyBVUkkgZnJhZ21lbnQgZm9yICIgKyBlT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFJlc291cmNlSW1wbCNhdHRhY2hlZEhlbHBlcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdHRhY2hlZEhlbHBlcihFT2JqZWN0IGVPYmplY3QpIHsKLQkJc3VwZXIuYXR0YWNoZWRIZWxwZXIoZU9iamVjdCk7Ci0KLQkJaWYgKHVzZUlEcygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRJRChlT2JqZWN0KTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJLy8gdXBkYXRlIHRoZSBlT2JqZWN0VG9JRE1hcAotCQkJCS8vCi0JCQkJZ2V0RU9iamVjdFRvSURNYXAoKS5wdXQoZU9iamVjdCwgaWQpOwotCQkJCQotCQkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKSkKLQkJCQkJCQkuZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnB1dChpZCwgZU9iamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGlzVHJhY2tpbmdNb2RpZmljYXRpb24oKSAmJiBlT2JqZWN0LmVSZXNvdXJjZSgpICE9IHRoaXMpIHsKLQkJCS8vIHJlbW92ZSB0aGUgbW9kaWZpY2F0aW9uIHRyYWNraW5nIGFkYXB0ZXIgZnJvbSB0aGUgZU9iamVjdAotCQkJLy8KLQkJCWVPYmplY3QuZUFkYXB0ZXJzKCkucmVtb3ZlKG1vZGlmaWNhdGlvblRyYWNraW5nQWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXR0YWNoZWRBbGxXaXRoSURzKEVPYmplY3QgZU9iaikgewotCQkvLyBhdHRhY2hlZEhlbHBlcihlT2JqKTsKLQkJLy8gTGlzdCBsaXN0ID0gZU9iai5lQ29udGVudHMoKTsKLQkJLy8gaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJLy8gRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkvLyBpZiAoby5lUmVzb3VyY2UoKSA9PSB0aGlzKSB7Ci0JCS8vIGF0dGFjaGVkQWxsV2l0aElEcyhvKTsKLQkJLy8gfQotCQkvLyB9Ci0KLQkJSXRlcmF0b3IgYWxsQ29udGVudHMgPSBuZXcgQ29udGVudFRyZWVJdGVyYXRvcihlT2JqKTsKLQotCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQlhdHRhY2hlZEhlbHBlcigoRU9iamVjdCkgYWxsQ29udGVudHMubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0F0dGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQllT2JqLmVBZGFwdGVycygpLmFkZChtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQlMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gdGhpcykgewotCQkJCWJhc2ljQXR0YWNoZWRBbGwobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyBvbiBhbiBvYmplY3QgYW5kIGFsbCBvZiBpdHMgb2Zmc3RyaW5nIG9iamVjdHMgdGhhdCBhcmUgaW4gdGhlIHNhbWUKLQkgKiByZXNvdXJjZSBhcyB0aGUgb2JqZWN0IHdoZW4gdGhlIG9iamVjdCBpcyBhdHRhY2hlZCB0byB0aGlzIHJlc291cmNlLiBUaGlzCi0JICogbWV0aG9kIGlzIGV4cGVuc2l2ZSwgc28gdXNlIGl0IHdpdGggY2F1dGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqLwotCXB1YmxpYyB2b2lkIGF0dGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQlpZiAodXNlSURzKCkpIHsKLQkJCWF0dGFjaGVkQWxsV2l0aElEcyhlT2JqKTsKLQkJfSBlbHNlIHsKLQkJCWJhc2ljQXR0YWNoZWRBbGwoZU9iaik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbCNhdHRhY2hlZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhdHRhY2hlZChFT2JqZWN0IGVPYmplY3QpIHsKLQkJYXR0YWNoZWRBbGwoZU9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRldGFjaGVkQWxsV2l0aElEcyhFT2JqZWN0IGVPYmopIHsKLQkJSXRlcmF0b3IgYWxsQ29udGVudHMgPSBuZXcgQ29udGVudFRyZWVJdGVyYXRvcihlT2JqKTsKLQotCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQlkZXRhY2hlZEhlbHBlcigoRU9iamVjdCkgYWxsQ29udGVudHMubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBiYXNpY0RldGFjaGVkQWxsKEVPYmplY3QgZU9iaikgewotCQllT2JqLmVBZGFwdGVycygpLnJlbW92ZShtb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIpOwotCQlMaXN0IGxpc3QgPSBlT2JqLmVDb250ZW50cygpOwotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJRU9iamVjdCBvID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKG8uZVJlc291cmNlKCkgPT0gdGhpcykgewotCQkJCWJhc2ljRGV0YWNoZWRBbGwobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGwjZ2V0RU9iamVjdEJ5SUQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXRFT2JqZWN0QnlJRChTdHJpbmcgaWQpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChlbGVtZW50KTsKLQkJCWlmIChndWlkICE9IG51bGwgJiYgZ3VpZC5lcXVhbHMoaWQpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJLy8gcmV0dXJuIHN1cGVyLmdldEVPYmplY3RCeUlEKGlkKTsKLQotCQlpZiAoaWRUb0VPYmplY3RNYXAgIT0gbnVsbCkgewotCQkJSW50ZXJuYWxFT2JqZWN0IGVPYmplY3QgPSAoSW50ZXJuYWxFT2JqZWN0KSBpZFRvRU9iamVjdE1hcC5nZXQoaWQpOwotCQkJaWYgKGVPYmplY3QgIT0gbnVsbCAmJiAhZU9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQkJcmV0dXJuIGVPYmplY3Q7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZUluZm8gZ2V0RmlsZUluZm8oKSB7Ci0JCWlmKGZpbGVJbmZvID09IG51bGwgfHwgIW5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5lcXVhbHMoZmlsZUluZm8uZ2V0RmlsZSgpKSkgewotCQkJZmlsZUluZm8gPSBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEZpbGVJbmZvKHRoaXMpOyAKLQkJfQotCQlyZXR1cm4gZmlsZUluZm87Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjbG9hZChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1VubG9hZGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIG9sZCA9IERlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0UuaXNVc2VTdGF0aWMoKTsKLQkJdHJ5IHsKLQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0VXNlU3RhdGljKHRydWUpOwotCQkJc3VwZXIubG9hZChvcHRpb25zKTsJCQotCQkJdXBkYXRlVGltZVN0YW1wcygpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJRGVmYXVsdFZhbHVlTWFuYWdlci5JTlNUQU5DRS5zZXRVc2VTdGF0aWMob2xkKTsKLQkJfQotCQkKLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZiAoZ2V0VVJJKCkudG9TdHJpbmcoKS5lcXVhbHModGVzdFJlc291cmNlVVJJU3RyKSkgewotCQkJCXRlc3RSZXNvdXJjZUxvYWRlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHRlc3RSZXNvdXJjZUxvYWRlZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0UmVzb3VyY2VVUklTdHIgPSAiZmlsZTovQzovdGVtcC9uZXdsaWIvbGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIG1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQkKLQkvKioKLQkgKiBSZWxvYWRzIHRoaXMgcmVzb3VyY2UuIE9sZCBvYmplY3RzIHdpbGwgYmVjb21lIHByb3hpZXMgYW5kIHRoZXkgd2lsbCBiZQotCSAqIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiA8Y29kZT5wcm94aWVzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwcm94aWVzCi0JICovCi0Jc3luY2hyb25pemVkIGJvb2xlYW4gcmVsb2FkKENvbGxlY3Rpb24gcHJveGllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzTG9hZGVkKSB7Ci0JCQlOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uID0gc2V0TG9hZGVkKGZhbHNlKTsKLQkJCWRvVW5sb2FkKHByb3hpZXMsIGZhbHNlKTsKLQkJCS8vIGRvVW5sb2FkKCkgbWlnaHQgaGF2ZSBzZXQgdGhpcyByZXNvdXJjZSBsb2FkZWQgYWdhaW4KLQkJCS8vIHNldCBpc0xvYWRlZCB0byBmYWxzZSBhbmQgY29udGVudHMgdG8gbnVsbCB0byBtYWtlIHN1cmUKLQkJCS8vCi0JCQlpc0xvYWRlZCA9IGZhbHNlOwotCQkJY29udGVudHMgPSBudWxsOwotCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQkJbG9hZChnZXRSZXNvdXJjZVNldCgpLmdldExvYWRPcHRpb25zKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JZmluYWwgdm9pZCB1bmxvYWRXaXRob3V0UmVtb3ZlKCkgewotCQlpZiAoaXNMb2FkZWQpIHsKLQkJCS8vIHNhdmUgdGhlIFJlc291cmNlRGVzY3JpcHRvciBwZiB0aGlzIHJlc291cmNlIGZvciBsYXRlciB1c2UgdG8KLQkJCS8vIGNyZWF0ZSBVUkkgZm9yIHRoZSBwcm94aWVzIGFmdGVyIHVubG9hZAotCQkJLy8KLQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJLmdldFJlc291cmNlRGVzY3JpcHRvcih0aGlzKTsKLQkJCWlmIChyZXNEZXNjICE9IG51bGwpIHsKLQkJCQlzZXRSZXNvdXJjZURlc2NyaXB0b3IocmVzRGVzYyk7Ci0JCQl9Ci0KLQkJCU5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24gPSBzZXRMb2FkZWQoZmFsc2UpOwotCQkJZG9VbmxvYWQobnVsbCwgZmFsc2UpOwotCQkJaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7Ci0JCQkJZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRG9lcyBhbGwgdGhlIHdvcmsgb2YgdW5sb2FkaW5nIHRoZSByZXNvdXJjZS4gSXQgY2FsbHMKLQkgKiB7QGxpbmsgI3VubG9hZGVkIHVubG9hZGVkfSBmb3IgZWFjaCBvYmplY3QgaXQgdGhlIGNvbnRlbnQKLQkgKiB7QGxpbmsgI2dldEFsbENvbnRlbnRzIHRyZWV9LCBhbmQgY2xlYXJzIHRoZQotCSAqIHtAbGluayAjZ2V0Q29udGVudHMgY29udGVudHN9LCB7QGxpbmsgI2dldEVycm9ycyBlcnJvcnN9LCBhbmQKLQkgKiB7QGxpbmsgI2dldFdhcm5pbmdzIHdhcm5pbmdzfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1VubG9hZCgpIHsKLQkJZG9VbmxvYWQobnVsbCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdWwgMTcsIDIwMDYKLQkgKiBAc2luY2UgMS4wCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250ZW50VHJlZUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqLwotCQlwcml2YXRlIENvbnRlbnRUcmVlSXRlcmF0b3IoT2JqZWN0IG9iamVjdCkgewotCQkJc3VwZXIob2JqZWN0KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlFQ29udGVudHNFTGlzdCBjb250ZW50cyA9IG5ldyBFQ29udGVudHNFTGlzdCgoRU9iamVjdCkgb2JqZWN0KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3QjcmVzb2x2ZSgpCi0JCQkJCSAqLwotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvbHZlKCkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZW50cy5iYXNpY0l0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChvLmVSZXNvdXJjZSgpID09IE11bHRpRmlsZVhNSVJlc291cmNlSW1wbC50aGlzCi0JCQkJCQkJfHwgby5lSXNQcm94eSgpKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQobyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVW5sb2FkcyB0aGlzIHJlc291cmNlLiBPbGQgb2JqZWN0cyB3aWxsIGJlIGNvbWUgcHJveGllcyBhbmQgd2lsbCBiZSBhZGRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiA8Y29kZT5wcm94aWVzPC9jb2RlPgotCSAqIAotCSAqIEBwYXJhbSBwcm94aWVzCi0JICogQHBhcmFtIHJlbW92ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gd2lsbCByZW1vdmUgYWxsIHRoZSB1bmxvYWRlZCBvYmplY3RzIGluCi0JICogICAgICAgICAgICB0aGUgcmVzb3VyY2UgZnJvbSB0aGVpciBjb250YWluZXJzIGFuZCBhbGwgb3Bwb3NpdGUgZmVhdHVyZQotCSAqICAgICAgICAgICAgZGF0YSBvZiB0aGUgdW5sb2FkZWQgb2JqZWN0cyB3aWxsIGJlIGNsZWFyZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9VbmxvYWQoQ29sbGVjdGlvbiBwcm94aWVzLCBib29sZWFuIHJlbW92ZSkgewotCQlpc1VubG9hZGluZyA9IHRydWU7Ci0KLQkJdHJ5IHsKLQkJCS8vIGZyb20gUmVzb3VyY2VJbXBsCi0JCQkvLwotCi0JCQlJdGVyYXRvciBhbGxDb250ZW50cyA9IGdldEFsbFByb3BlckNvbnRlbnRzKG5ldyBBcnJheUxpc3QoCi0JCQkJCWdldENvbnRlbnRzKCkpKTsKLQotCQkJLy8gVGhpcyBndWFyZCBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgY2xlYXIgZG9lc24ndCBtYWtlIHRoZQotCQkJLy8gcmVzb3VyY2UKLQkJCS8vIGJlY29tZSBsb2FkZWQuCi0JCQkvLwotCQkJaWYgKCFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCWlmIChyZW1vdmUpIHsKLQkJCQkJZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGRvbid0IGNhbGwgZ2V0Q29udGVudHMoKS5jbGVhcigpIHRvIGtlZXAgdGhlIHJlZmVyZW5jZXMKLQkJCQkJLy8gdG8gZWxlbWVudHMKLQkJCQkJLy8gdGhhdCBqdXN0IGJlY2FtZSBwcm94aWVzIGFmdGVyIHVubG9hZAotCQkJCQkvLwotCQkJCQljb250ZW50cyA9IG51bGw7Ci0JCQkJfQotCi0JCQl9Ci0JCQlnZXRFcnJvcnMoKS5jbGVhcigpOwotCQkJZ2V0V2FybmluZ3MoKS5jbGVhcigpOwotCi0JCQlBcnJheUxpc3Q8RU9iamVjdD4gdW5sb2FkZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdDxFT2JqZWN0PigpOwotCQkJCi0JCQlBcnJheUxpc3QgYWxsQ29udGVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAoYWxsQ29udGVudHMuaGFzTmV4dCgpKSB7Ci0JCQkJYWxsQ29udGVudExpc3QuYWRkKGFsbENvbnRlbnRzLm5leHQoKSk7Ci0JCQl9Ci0JCQlJdGVyYXRvciBpdCA9IGFsbENvbnRlbnRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQl0cnkgewotCQkJCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBpdAotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJdW5sb2FkZWQobywgcmVtb3ZlKTsKLQkJCQkJCXVubG9hZGVkT2JqZWN0cy5hZGQobyk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJfQotCQkJaWYgKHByb3hpZXMgIT0gbnVsbCAmJiAhdW5sb2FkZWRPYmplY3RzLmlzRW1wdHkoKSkgewotCQkJCXByb3hpZXMuYWRkQWxsKHVubG9hZGVkT2JqZWN0cyk7Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlKSB7Ci0JCQkJLy8gcmVtb3ZlIHRoZSB1bmxvYWRlZCBvYmplY3RzIGZyb20gaXRzIGNvbnRhaW5lciB0byBwcmV2ZW50IHRoZQotCQkJCS8vIHdob2xlIGxpYnJhcnkgZnJvbSBzdGF5aW5nCi0JCQkJLy8gaW4gbWVtb3J5IGlmIG9ubHkgb25lIG9mIGl0cyBlbGVtZW50IGlzIGxlYWtlZAotCQkJCS8vIAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHVubG9hZGVkT2JqZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQkJCUVjb3JlVXRpbC5yZW1vdmUob2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGZyb20gWE1MUmVzb3VyY2VJbWwKLQkJCS8vCQkKLQotCQkJaWYgKGlkVG9FT2JqZWN0TWFwICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBpZFRvRU9iamVjdE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKSkKLQkJCQkJCQkuZ2V0R3VpZFRvTWV0aG9kRWxlbWVudE1hcCgpLnJlbW92ZShpdGVyLm5leHQoKSk7Ci0JCQkJfQotCQkJCWlkVG9FT2JqZWN0TWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChlT2JqZWN0VG9JRE1hcCAhPSBudWxsKSB7Ci0JCQkJZU9iamVjdFRvSURNYXAuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGVPYmplY3RUb0V4dGVuc2lvbk1hcCAhPSBudWxsKSB7Ci0JCQkJZU9iamVjdFRvRXh0ZW5zaW9uTWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCWlmIChpbnRyaW5zaWNJRFRvRU9iamVjdE1hcCAhPSBudWxsKSB7Ci0JCQkJaW50cmluc2ljSURUb0VPYmplY3RNYXAuY2xlYXIoKTsKLQkJCX0KLQkJCQotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBJUmVzb3VyY2UuTlVMTF9TVEFNUDsKLQkJCQotCQl9IGZpbmFsbHkgewotCQkJaXNVbmxvYWRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVubG9hZGVkKEludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QpIHsKLQkJdW5sb2FkZWQoaW50ZXJuYWxFT2JqZWN0LCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGludGVybmFsRU9iamVjdAotCSAqIEBwYXJhbSBjbGVhcgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gYWxsIG9wcG9zaXRlIGZlYXR1cmUgZGF0YSBvZiB0aGUKLQkgKiAgICAgICAgICAgIHVubG9hZGVkIG9iamVjdHMgd2lsbCBiZSBjbGVhcmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCB1bmxvYWRlZChJbnRlcm5hbEVPYmplY3QgaW50ZXJuYWxFT2JqZWN0LCBib29sZWFuIGNsZWFyKSB7Ci0JCVN0cmluZyBndWlkID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0R3VpZChpbnRlcm5hbEVPYmplY3QpOwotCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQlVUkkgdXJpID0gcmVzb3VyY2VEZXNjcmlwdG9yICE9IG51bGwgPyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIKLQkJCQkJLmNyZWF0ZVVSSShyZXNvdXJjZURlc2NyaXB0b3IuZ2V0SWQoKSkgOiBnZXRVUkkoKTsKLQkJCWludGVybmFsRU9iamVjdC5lU2V0UHJveHlVUkkodXJpLmFwcGVuZEZyYWdtZW50KGd1aWQpKTsKLQkJfQotCQlpbnRlcm5hbEVPYmplY3QuZUFkYXB0ZXJzKCkuY2xlYXIoKTsKLQotCQlpZiAoaW50ZXJuYWxFT2JqZWN0IGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QgJiYgY2xlYXIpIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG11bHRpUmVzb3VyY2VFT2JqZWN0ID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgaW50ZXJuYWxFT2JqZWN0KTsKLQotCQkJLy8gY2xlYXIgb3duIG9wcG9zaXRlIGZlYXR1cmUgbWFwCi0JCQkvLwkJCQotCQkJTWFwIG9wcG9zaXRlRmVhdHVyZU1hcCA9IG11bHRpUmVzb3VyY2VFT2JqZWN0Ci0JCQkJCS5iYXNpY0dldE9wcG9zaXRlRmVhdHVyZU1hcCgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZU1hcCAhPSBudWxsKSB7Ci0JCQkJb3Bwb3NpdGVGZWF0dXJlTWFwLmNsZWFyKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlbW92ZSBpdHNlbGYgZnJvbSBhbGwgb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCS8vIAotCQkJbXVsdGlSZXNvdXJjZUVPYmplY3QucmVtb3ZlRnJvbUFsbE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJfQotCQkKLQkJaWYoaW50ZXJuYWxFT2JqZWN0IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uIHx8IGludGVybmFsRU9iamVjdCBpbnN0YW5jZW9mIFNlY3Rpb24pIHsKLQkJCS8vIHNldCBhbGwgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gTlVMTCB0byByZWxlYXNlIG1lbW9yeQotCQkJLy8KLQkJCWZvciAoRUF0dHJpYnV0ZSBhdHRyIDogaW50ZXJuYWxFT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCQlpZihhdHRyICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpICYmIAotCQkJCQkJYXR0ci5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKFN0cmluZy5jbGFzcykpIHsKLQkJCQkJaW50ZXJuYWxFT2JqZWN0LmVTZXQoYXR0ciwgYXR0ci5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihpbnRlcm5hbEVPYmplY3QuZURpcmVjdFJlc291cmNlKCkgIT0gbnVsbCAmJiBpbnRlcm5hbEVPYmplY3QgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpaW50ZXJuYWxFT2JqZWN0KS5lU2V0UmVzb3VyY2UobnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXRhY2hlZEFsbChFT2JqZWN0IGVPYmopIHsKLQkJaWYgKHVzZUlEcygpKSB7Ci0JCQlkZXRhY2hlZEFsbFdpdGhJRHMoZU9iaik7Ci0JCX0gZWxzZSB7Ci0JCQliYXNpY0RldGFjaGVkQWxsKGVPYmopOwotCQl9Ci0JfQkJCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5JbnRlcm5hbCNkZXRhY2hlZChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXRhY2hlZChFT2JqZWN0IGVPYmplY3QpIHsKLQkJZGV0YWNoZWRBbGwoZU9iamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwjY3JlYXRlTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBjcmVhdGVNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyKCkgewotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUltcGwuTW9kaWZpY2F0aW9uVHJhY2tpbmdBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJCQkvLyBkb24ndCBoYW5kbGUgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uIGIvYyBpdCBkb2VzIG5vdAotCQkJCS8vIHJlYWxseSBtb2RpZnkgdGhpcyByZXNvdXJjZQotCQkJCS8vCi0JCQkJaWYgKG5vdGlmaWNhdGlvbiBpbnN0YW5jZW9mIE9wcG9zaXRlRmVhdHVyZU5vdGlmaWNhdGlvbikgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlSW1wbCNzZXRNb2RpZmllZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVkKGJvb2xlYW4gaXNNb2RpZmllZCkgewotCQkvLyBib29sZWFuIHdhc01vZGlmaWVkID0gaXNNb2RpZmllZCgpOwotCQlzdXBlci5zZXRNb2RpZmllZChpc01vZGlmaWVkKTsKLQkJLy8gaWYoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKSBpbnN0YW5jZW9mCi0JCS8vIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwuc2V0TW9kaWZpZWQoKTogIiArCi0JCS8vIHRoaXMpOwotCQkvLyB9Ci0JCS8vIHRoaXMgY29kZSBpcyBuZWVkZWQgdG8gc2V0IGRpcnR5IGZsYWcgdG8gdGhlIGl0ZW0gcHJvdmlkZXIncyBsYWJlbAotCQkvLwotCQkvLyBpZih3YXNNb2RpZmllZCAhPSBpc01vZGlmaWVkICYmICFnZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkvLyAvLyByZWZyZXNoIHRoZSBsYWJlbCBvZiB0aGUgcmVzb3VyY2UncyBvYmplY3QKLQkJLy8gLy8KLQkJLy8gRU9iamVjdCBvYmogPSAoRU9iamVjdCkgZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IG9iai5lQWRhcHRlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IGFkYXB0ZXIgPSBpdGVyLm5leHQoKTsKLQkJLy8gaWYoYWRhcHRlciBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJLy8gKChJdGVtUHJvdmlkZXJBZGFwdGVyKWFkYXB0ZXIpLmZpcmVOb3RpZnlDaGFuZ2VkKG5ldwotCQkvLyBWaWV3ZXJOb3RpZmljYXRpb24obmV3IE5vdGlmaWNhdGlvbkltcGwoTm90aWZpY2F0aW9uLlNFVCwgb2JqLCBvYmopLAotCQkvLyBvYmosIGZhbHNlLCB0cnVlKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0KLQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQlpZiAodGVzdFJlc291cmNlTG9hZGVkCi0JCQkJCSYmIGdldFVSSSgpLnRvU3RyaW5nKCkuZXF1YWxzKHRlc3RSZXNvdXJjZVVSSVN0cikpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImlzTW9kaWZpZWQ9IiArIGlzTW9kaWZpZWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpZXJJbXBsI2VEZWxpdmVyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlRGVsaXZlcigpIHsKLQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBnZXRSZXNvdXJjZVNldCgpOwotCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCAmJiAhcmVzb3VyY2VTZXQuZURlbGl2ZXIoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gc3VwZXIuZURlbGl2ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIG9sZCA9IERlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0UuaXNVc2VTdGF0aWMoKTsKLQkJdHJ5IHsKLQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0VXNlU3RhdGljKHRydWUpOwotCQkJCi0JCQlpZiAob3B0aW9ucyA9PSBudWxsKSB7Ci0JCQkJb3B0aW9ucyA9IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5ERUZBVUxUX1NBVkVfT1BUSU9OUzsKLQkJCX0KLQotCQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQotCQkJLy8gU3BlY2lhbCBoYW5kbGluZyBmb3Igc2F2aW5nIE1ldGhvZExpYnJhcnkgdG8gcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvCi0JCQkvLyBNZXRob2RDb25maWd1cmF0aW9ucyBmcm9tIGxpYnJhcnkgZmlsZS4KLQkJCS8vCi0JCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIGU7Ci0JCQkJLy8gcmVtb3ZlIFJlc291cmNlRGVzY3JpcHRvcnMgb2YgY29uZmlndXJhdGlvbiBmaWxlcwotCQkJCS8vCi0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcih0aGlzKTsKLQkJCQlpZiAocmVzTWdyICE9IG51bGwpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXRlcgotCQkJCQkJLm5leHQoKTsKLQkJCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gcmVzTWdyCi0JCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKGNvbmZpZy5nZXRHdWlkKCkpOwotCQkJCQkJaWYgKHJlc0Rlc2MgIT0gbnVsbCkgewotCQkJCQkJCUVjb3JlVXRpbC5yZW1vdmUocmVzRGVzYyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJTGlzdCBjb25maWdzID0gbmV3IEFycmF5TGlzdChsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQkJCWJvb2xlYW4gb2xkRGVsaXZlciA9IGxpYi5lRGVsaXZlcigpOwotCQkJCXRyeSB7Ci0JCQkJCWxpYi5lU2V0RGVsaXZlcihmYWxzZSk7Ci0JCQkJCWxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKS5jbGVhcigpOwotCi0JCQkJCS8vIFNhdmUgbGlicmFyeSBmaWxlIGFnYWluIHRvIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBjb25maWd1cmF0aW9ucy4KLQkJCQkJLy8gVGhlIHByZXZpb3VzIHNhdmUgaXMgc3RpbGwgbmVlZGVkIHRvIHNhdmUgbmV3IGNvbmZpZ3VyYXRpb24gaW4gaXRzIG93biBmaWxlCi0JCQkJCS8vCi0JCQkJCXN1cGVyLnNhdmUob3B0aW9ucyk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbGliLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZEFsbChjb25maWdzKTsKLQkJCQkJbGliLmVTZXREZWxpdmVyKG9sZERlbGl2ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCURlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0Uuc2V0VXNlU3RhdGljKG9sZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEZpbmFsVVJJKCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbmFsVVJJOwotCQl9Ci0JCXJldHVybiBnZXRVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaW5hbFVSSShVUkkgdXJpKSB7Ci0JCWZpbmFsVVJJID0gdXJpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJhY2tVcFVSSSgpIHsKLQkJb2xkVVJJID0gZ2V0VVJJKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVGVtcFVSSSgpIHsKLQkJaWYgKGN1cnJlbnRUeElEICE9IG51bGwpIHsKLQkJCXJldHVybiBjcmVhdGVUZW1wVVJJKCkuZXF1YWxzKGdldFVSSSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBVUkkgY3JlYXRlVGVtcFVSSSgpIHsKLQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQodGhpcyk7Ci0JCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSShuZXcgU3RyaW5nQnVmZmVyKGdldFRlbXBEaXIoKSkuYXBwZW5kKAotCQkJCUZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoY3VycmVudFR4SUQpCi0JCQkJLmFwcGVuZCgibmV3IikuYXBwZW5kKGUuZ2V0R3VpZCgpKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBTdHJpbmcgZ2V0VGVtcERpcigpIHsKLQkJaWYgKHRlbXBEaXIgPT0gbnVsbCkgewotCQkJdGVtcERpciA9IG5ldyBGaWxlKEZpbGVNYW5hZ2VyLmdldFRlbXBEaXIoKSwgIkVQRiIpLmdldEFic29sdXRlUGF0aCgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRlbXBEaXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGVtcG9yYXJ5IFVSSSB0byBzYXZlIHRoaXMgcmVzb3VyY2UgdG8gYW5kIGl0IHdpbGwgYmUgcmVuYW1lZCB0bwotCSAqIHRoZSBvcmlnaW5hbCBVUkkgd2hlbiBzYXZpbmcgaXMgZG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlbXBVUkkoU3RyaW5nIHR4SUQpIHsKLQkJaWYgKGZpbmFsVVJJID09IG51bGwpIHsKLQkJCWZpbmFsVVJJID0gb2xkVVJJID0gZ2V0VVJJKCk7Ci0JCQljdXJyZW50VHhJRCA9IHR4SUQ7Ci0KLQkJCVVSSSB0ZW1wVVJJID0gY3JlYXRlVGVtcFVSSSgpOwotCQkJc2V0VVJJKHRlbXBVUkkpOwotCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJcmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkucHV0KG9sZFVSSSwgdGVtcFVSSSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmVzb3VyY2UgVVJJIHRvIHRoZSBvcmlnaW5hbCBvbmUuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbAotCSAqIGFmdGVyIHNhdmluZyByZWdhcmxlc3Mgb2YgaXRzIHN1Y2Nlc3MuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVVUkkoKSB7Ci0JCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJc2V0VVJJKG9sZFVSSSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eFN0YXJ0ZWQoKSB7Ci0JCXJldHVybiBtb3ZlU3RhcnRlZCgpIHx8IHNhdmVTdGFydGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGltZVN0YW1wcygpIHsKLQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHRoaXMpOwotCQlsYXN0TG9hZFRpbWVTdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlJRmlsZUluZm8gaW5mbyA9IGdldEZpbGVJbmZvKCk7Ci0JCWlmKGluZm8gIT0gbnVsbCkgewotCQkJbW9kaWZpY2F0aW9uU3RhbXAgPSBpbmZvLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoaXMgcmVzb3VyY2UgaXMgY3VycmVudGx5IHN5bmNocm9uaXplZCB3aXRoIGl0cyBkYXRhIHN0b3JlCi0JICogCi0JICogQHJldHVybiA8bGk+IC0xIGRvbid0IGtub3cKLQkgKiAgICAgICAgIDxsaT4gMCBubwotCSAqICAgICAgICAgPGxpPiAxIHllcwotCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2lzU3luY2hyb25pemVkKCl9IGluc3RlYWQKLQkgKi8KLQlwdWJsaWMgaW50IGNoZWNrU3luY2hyb25pemVkKCkgewotLy8JCWxvbmcgY3VycmVudFRpbWUgPSBuZXcgRmlsZShnZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkubGFzdE1vZGlmaWVkKCk7Ci0vLwkJaWYoTXVsdGlGaWxlU2F2ZVV0aWwuc2FtZShjdXJyZW50VGltZSwgZmlsZUxhc3RNb2RpZmllZCkpIHsKLS8vCQkJLy8gc29tZSB0ZWFtIHByb3ZpZGVycyBjaGFuZ2VkIHRoZSB0aW1lc3RhbXAgb2YgbGFzdCBmaWxlIG1vZGlmaWNhdGlvbiBieSByZW1vdmluZyBzZWNvbmQgZnJhY3Rpb24KLS8vCQkJLy8gZXZlbiB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQKLS8vCQkJLy8KLS8vCQkJcmV0dXJuIDE7Ci0vLwkJfQotLy8JCXJldHVybiAtMTsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkKCkgPyAxIDogMDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWQoKSB7Ci0JCUlGaWxlSW5mbyBmaWxlSW5mbyA9IGdldEZpbGVJbmZvKCk7Ci0JCWlmIChmaWxlSW5mbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbW9kaWZpY2F0aW9uU3RhbXAgPT0gZmlsZUluZm8uZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHhGaW5pc2hlZChib29sZWFuIHN1Y2Nlc3NmdWwpIHsKLQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQlpZiAoc3VjY2Vzc2Z1bCkgewotCQkJc2V0VVJJKGZpbmFsVVJJKTsKLQkJCWlmKCF3YXNNb3ZlKSB7Ci0JCQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkJfQotCQkJRmlsZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5yZWZyZXNoKHRoaXMpOwotCQkJdXBkYXRlVGltZVN0YW1wcygpOwotCQkJaWYoIXdhc01vdmUpIHsKLQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRSZXNvdXJjZVNldCgpOwotCQkJCWlmKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJcmVzb3VyY2VTZXQuZ2V0VW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlcigpLnZhbGlkYXRlTWFya2Vycyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXN0b3JlVVJJKCk7Ci0JCQlpZiAod2FzTW92ZSkgewotCQkJCS8vIGZpbmFsVVJJIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVzdG9yaW5nIFVSSSBvZiBpdHMgY2hpbGQKLQkJCQkvLyByZXNvdXJjZXMgc28gdGhlIFVSSSBvZiBpdHMgY2hpbGQgcmVzb3VyY2VzIGNhbiBiZSByZXNvbHZlZAotCQkJCS8vIGNvcnJlY3RseS4gU2VlIFJlc291cmNlRGVzY3JpcHRvckltcGwuZ2V0UmVzb2x2ZWRVUkkoKQotCQkJCS8vCi0JCQkJZmluYWxVUkkgPSBudWxsOwotCQkJCQotCQkJCS8vIHJlc3RvcmUgdXJpIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzIHJlc291cmNlCi0JCQkJLy8KLQkJCQlNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBvbGRVUkksIG51bGwsIHRydWUpOwotCQkJfQotCQl9Ci0JCWlmIChvbGRVUkkgIT0gbnVsbCkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCWlmIChyZXNvdXJjZVNldCAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VTZXQuZ2V0VVJJVG9UZW1wVVJJTWFwKCkucmVtb3ZlKG9sZFVSSSk7Ci0JCQl9Ci0JCQlvbGRVUkkgPSBudWxsOwotCQl9Ci0JCWN1cnJlbnRUeElEID0gbnVsbDsKLQkJZmluYWxVUkkgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZUJhY2t1cCgpIHsKLQkJaWYgKGJhY2t1cEZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBGaWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmRlbGV0ZShiYWNrdXBGaWxlKTsKLQkJCQluZXcgRmlsZShiYWNrdXBGaWxlKS5kZWxldGUoKTsKLQkJCQliYWNrdXBGaWxlID0gbnVsbDsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXN0b3JlKCkgewotCQlGaWxlIHNyYyA9IG51bGwsIGRlc3QgPSBudWxsOwotCQlib29sZWFuIG1vdmVkID0gZmFsc2U7Ci0JCWlmIChiYWNrdXBGaWxlICE9IG51bGwpIHsKLQkJCXNyYyA9IG5ldyBGaWxlKGJhY2t1cEZpbGUpOwotCQkJZGVzdCA9IG5ldyBGaWxlKGdldEZpbmFsVVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJbW92ZWQgPSBvbGRVUkkgIT0gbnVsbCAmJiAhb2xkVVJJLmVxdWFscyhmaW5hbFVSSSk7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRGaW5hbFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlkZXN0ID0gbmV3IEZpbGUob2xkVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQltb3ZlZCA9IGZpbGUuZXhpc3RzKCkgJiYgIWRlc3QuZXhpc3RzKCk7Ci0JCQkJaWYgKG1vdmVkKSB7Ci0JCQkJCXNyYyA9IGZpbGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzcmMgIT0gbnVsbCkgewotCQkJaWYgKGRlc3QuZXhpc3RzKCkpIHsKLQkJCQlGaWxlVXRpbC5tb3ZlRmlsZShkZXN0LG5ldyBGaWxlKGdldFVSSSgpLnRvRmlsZVN0cmluZygpKSk7Ci0JCQl9Ci0JCQlib29sZWFuIHN1Y2Nlc3M7Ci0JCQlpZiAobW92ZWQpIHsKLQkJCQlzdWNjZXNzID0gTXVsdGlGaWxlU2F2ZVV0aWwubW92ZSh0aGlzLCBzcmMsIGRlc3QpOwotCQkJCS8vIGlmKHN1Y2Nlc3MpIHsKLQkJCQkvLyBNdWx0aUZpbGVTYXZlVXRpbC51cGRhdGVVUklNYXBwaW5ncyh0aGlzLCBudWxsKTsKLQkJCQkvLyB9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGRvbid0IHJlc3RvcmUgZmlsZSBpZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgdGhlIHNhbWUKLQkJCQkvLwotCQkJCXN1Y2Nlc3MgPSBzcmMubGFzdE1vZGlmaWVkKCkgPT0gZGVzdC5sYXN0TW9kaWZpZWQoKSAmJiBGaWxlVXRpbC5nZXRTaXplKHNyYykgPT0gRmlsZVV0aWwuZ2V0U2l6ZShkZXN0KTsKLQkJCQlpZighc3VjY2VzcykgewotCQkJCQlzdWNjZXNzID0gRmlsZVV0aWwubW92ZUZpbGUoc3JjLCBkZXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQl0aHJvdyBuZXcgTXVsdGlGaWxlSU9FeGNlcHRpb24oTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVzdG9yZVJlc291cmNlRXJyb3JfbXNnLCAKLQkJCQkJCUZpbGVNYW5hZ2VyLnRvRmlsZVN0cmluZyhnZXRGaW5hbFVSSSgpKSkpOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCVVSSSBnZXRPbGRVUkkoKSB7Ci0JCXJldHVybiBvbGRVUkk7Ci0JfQotCi0JYm9vbGVhbiBtb3ZlU3RhcnRlZCgpIHsKLQkJcmV0dXJuIG9sZFVSSSAhPSBudWxsICYmICFvbGRVUkkuZXF1YWxzKGdldEZpbmFsVVJJKCkpOwotCX0KLQotCWJvb2xlYW4gc2F2ZVN0YXJ0ZWQoKSB7Ci0JCXJldHVybiBjdXJyZW50VHhJRCAhPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVmcmVzaFVSSU9mQ2hpbGRSZXNvdXJjZXMoKSB7Ci0JCS8vIHJlZnJlc2ggcmVzb2x2ZSBVUklzIGluIFJlc291cmNlRGVzY3JpcHRvcnMgb2YgdGhlIGNoaWxkCi0JCS8vIHJlc291cmNlcyBvZiB0aGlzIHJlc291cmNlCi0JCS8vCi0JCUhhc2hNYXA8VVJJLCBSZXNvdXJjZURlc2NyaXB0b3I+IG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID0gbnVsbDsKLQkJUmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IE11bHRpRmlsZVNhdmVVdGlsCi0JCQkJLmdldFJlc291cmNlTWFuYWdlcih0aGlzKTsKLQkJaWYgKHJlc01nciAhPSBudWxsKSB7Ci0JCQlvbGRVUklUb1Jlc291cmNlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwPFVSSSwgUmVzb3VyY2VEZXNjcmlwdG9yPigpOwotCQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcmVzTWdyLmVBbGxDb250ZW50cygpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBSZXNvdXJjZURlc2NyaXB0b3IpIHsKLQkJCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoKFJlc291cmNlRGVzY3JpcHRvcikgb2JqKTsKLQkJCQkJb2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAucHV0KGRlc2MKLQkJCQkJCQkuZ2V0UmVzb2x2ZWRVUkkoKSwgZGVzYyk7Ci0JCQkJCWRlc2MuY2xlYXJSZXNvbHZlZFVSSSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlZnJlc2ggVVJJIG9mIGxvYWRlZCBjaGlsZCByZXNvdXJjZXMgb2YgdGhpcyByZXNvdXJjZQotCQkvLwotCQlpZiAob2xkVVJJVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgIT0gbnVsbCkgewotCQkJLy8gZ28gdGhydSB0aGUgbGlzdCBvZiBsb2FkZWQgcmVzb3VyY2VzIGluIHJlc291cmNlIHNldAotCQkJLy8gdG8gdXBkYXRlIHRoZSBVUkkKLQkJCS8vCi0JCQlmb3IgKFJlc291cmNlIHJlcyA6IGdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkpIHsKLQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIG9sZFVSSVRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwCi0JCQkJCQkuZ2V0KHJlcy5nZXRVUkkoKSk7Ci0JCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQlyZXMuc2V0VVJJKGRlc2MuZ2V0UmVzb2x2ZWRVUkkoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29tbWl0KCkgewotCQlpZiAoZmluYWxVUkkgIT0gbnVsbCAmJiAhZ2V0Q29udGVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCUZpbGUgZmluYWxGaWxlID0gbmV3IEZpbGUoZmluYWxVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJYm9vbGVhbiB3YXNNb3ZlID0gIW9sZFVSSS5lcXVhbHMoZmluYWxVUkkpOwotCQkJaWYgKHdhc01vdmUpIHsKLQkJCQlPYmplY3QgZSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHRoaXMpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCS8vIG5hbWUgZm9yIGZpbmFsRmlsZSBpcyBhbHJlYWR5IHRha2VuCi0JCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBuYW1lCi0JCQkJCQkvLwotCQkJCQkJZmluYWxVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSShNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JCQkJCQkJCS5nZXROZXh0QXZhaWxhYmxlRmlsZU5hbWUoZmluYWxGaWxlLmdldFBhcmVudCgpCi0JCQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvciwKLQkJCQkJCQkJCQkoQ29udGVudERlc2NyaXB0aW9uKSBlKSk7Ci0JCQkJCQlmaW5hbEZpbGUgPSBuZXcgRmlsZShmaW5hbFVSSS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIGJhY2sgdXAgdGhlIGZpbGUKLQkJCQkvLwotCQkJCVN0cmluZyBiYWNrdXAgPSBnZXRCYWNrdXBGaWxlUGF0aCgpOwotCQkJCUZpbGUgYmFrRmlsZSA9IG5ldyBGaWxlKGJhY2t1cCk7Ci0KLQkJCQkvLyB0cnlpbmcgdG8gZGVsZXRlIHRoZSBvbGQgYmFja3VwIGZpbGUgaWYgaXQgZXhpc3RzCi0JCQkJLy8KLQkJCQlpZiAoYmFrRmlsZS5leGlzdHMoKSkgewotCQkJCQliYWtGaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQotCQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJLy8gc29tZSBDTSBwcm92aWRlciBsaWtlIENsZWFyQ2FzZSByZW5hbWVkIHRoZSB2ZXJzaW9uZWQKLQkJCQkJLy8gZmlsZSBpdCBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCQkvLyBpbiB0aGUgd29ya3NwYWNlLiBUbyBhdm9pZCB0aGlzLCB1c2Ugb25seSByZWd1bGFyIHJlbmFtZQotCQkJCQkvLyByb3V0aW5lIG9mIGphdmEuaW8uRmlsZSBpbnN0ZWFkIG9mIElSZXNvdXJjZSByb3V0aW5lCi0JCQkJCS8vCi0JCQkJCWlmIChGaWxlVXRpbC5tb3ZlRmlsZShmaW5hbEZpbGUsIGJha0ZpbGUpKSB7Ci0JCQkJCQliYWNrdXBGaWxlID0gYmFja3VwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKAotCQkJCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZW5hbWVFcnJvcl9tc2csCi0JCQkJCQkJCWZpbmFsRmlsZSwgYmFja3VwKTsKLQkJCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZW5hbWUgdGhlIHJlc291cmNlIGZpbGUgdG8gdGhlIG9yaWdpbmFsIG5hbWUKLQkJCS8vCi0JCQlGaWxlIGN1cnJlbnRGaWxlID0gbmV3IEZpbGUod2FzTW92ZSA/IG9sZFVSSS50b0ZpbGVTdHJpbmcoKQotCQkJCQk6IGdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKLQkJCWlmICh3YXNNb3ZlKSB7Ci0JCQkJc3VjY2VzcyA9IE11bHRpRmlsZVNhdmVVdGlsLm1vdmUodGhpcywgY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHNvbWUgQ00gcHJvdmlkZXIgbGlrZSBDbGVhckNhc2UgcmVuYW1lZCB0aGUgdmVyc2lvbmVkIGZpbGUgaW4KLQkJCQkvLyBpdHMgcmVwb3NpdG9yeSBhcyBzb29uIGFzIHVzZXIgcmVuYW1lZCB0aGUgZmlsZQotCQkJCS8vIGluIHRoZSB3b3Jrc3BhY2UuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IHJlZ3VsYXIgcmVuYW1lCi0JCQkJLy8gcm91dGluZSBvZiBqYXZhLmlvLkZpbGUgaW5zdGVhZCBvZiBJUmVzb3VyY2Ugcm91dGluZQotCQkJCS8vCi0JCQkJdHJ5IHsKLQkJCQkJRmlsZVV0aWwuZG9Nb3ZlRmlsZShjdXJyZW50RmlsZSwgZmluYWxGaWxlKTsKLQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJfQotCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWV4ID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXN1Y2Nlc3MpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoUGVyc2lzdGVuY2VSZXNvdXJjZXMucmVuYW1lRXJyb3JfbXNnLAotCQkJCQkJY3VycmVudEZpbGUsIGZpbmFsRmlsZSk7Ci0JCQkJaWYoZXggIT0gbnVsbCkgewotCQkJCQltc2cgPSBtc2cgKyAiOiAiICArIChleC5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGV4LmdldE1lc3NhZ2UoKSA6IGV4LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXRocm93IG5ldyBNdWx0aUZpbGVJT0V4Y2VwdGlvbihtc2cpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAod2FzTW92ZSkgewotCQkJCQkvLyByZWZyZXNoIHJlc29sdmUgVVJJIG9mIFJlc291cmNlRGVzY3JpcHRvciBvZiB0aGlzCi0JCQkJCS8vIHJlc291cmNlCi0JCQkJCS8vCi0JCQkJCVJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkuZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKHRoaXMpOwotCQkJCQlpZiAocmVzRGVzYyAhPSBudWxsKSB7Ci0JCQkJCQlyZXNEZXNjLmNsZWFyUmVzb2x2ZWRVUkkoKTsKLQkJCQkJCXJlc0Rlc2MuZ2V0UmVzb2x2ZWRVUkkoKTsKLQkJCQkJfSAKLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJCQlNZXRob2RFbGVtZW50IGUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHRoaXMpOwotCQkJCQkJCWlmIChlICE9IG51bGwKLQkJCQkJCQkJCSYmICFnZXRMaWJyYXJ5UGVyc2lzdGVyKCkKLQkJCQkJCQkJCQkJLmhhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGUpKSB7Ci0JCQkJCQkJCVN0cmluZyBtc2cgPSAiRkFUQUwgRVJST1I6IG5vIFJlc291cmNlRGVzY3JpcHRvciBmb3VuZCBpbiBwYXJlbnQgcmVzb3VyY2UgZm9yICIgKyB0aGlzOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2cobXNnKTsKLQkJCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKG1zZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmVmcmVzaFVSSU9mQ2hpbGRSZXNvdXJjZXMoKTsKLQkJCQl9Ci0KLQkJCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb3VyY2VTYXZlZCh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja3VwRmlsZVBhdGgoKSB7Ci0JCVN0cmluZyBiYWNrdXBGaWxlID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUZW1wRGlyKCkpCi0JCQkJLmFwcGVuZChGaWxlLnNlcGFyYXRvcikKLQkJCQkuYXBwZW5kKGN1cnJlbnRUeElEKQotCQkJCS5hcHBlbmQoIm9sZCIpLmFwcGVuZChQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudCh0aGlzKS5nZXRHdWlkKCkpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJhY2t1cEZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbGFzdExvYWRUaW1lU3RhbXAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRMYXN0TG9hZFRpbWVTdGFtcCgpIHsKLQkJcmV0dXJuIGxhc3RMb2FkVGltZVN0YW1wOwotCX0KLQotCXN0YXRpYyB2b2lkIGNsZWFyRGV0YWNoZWRFT2JqZWN0VG9JRE1hcCgpIHsKLQkJREVUQUNIRURfRU9CSkVDVF9UT19JRF9NQVAuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzRGVzYwotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlRGVzY3JpcHRvciByZXNEZXNjKSB7Ci0JCXJlc291cmNlRGVzY3JpcHRvciA9IHJlc0Rlc2M7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZSNnZXRMb2FkU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldExvYWRTdGFtcCgpIHsKLQkJcmV0dXJuIGdldExhc3RMb2FkVGltZVN0YW1wKCk7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRQcm94eVVSSShFT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgZ3VpZCA9IE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQob2JqZWN0KTsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc291cmNlRGVzY3JpcHRvciA9IHRoaXMucmVzb3VyY2VEZXNjcmlwdG9yICE9IG51bGwgPyB0aGlzLnJlc291cmNlRGVzY3JpcHRvciA6Ci0JCQkJCU11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlRGVzY3JpcHRvcih0aGlzKTsKLQkJCVVSSSB1cmkgPSByZXNvdXJjZURlc2NyaXB0b3IgIT0gbnVsbCA/IE11bHRpRmlsZVVSSUNvbnZlcnRlcgotCQkJCQkuY3JlYXRlVVJJKHJlc291cmNlRGVzY3JpcHRvci5nZXRJZCgpKSA6IGdldFVSSSgpOwotCQkJcmV0dXJuIHVyaS5hcHBlbmRGcmFnbWVudChndWlkKTsKLQkJfQotCQlyZXR1cm4gZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQoZ2V0SUQob2JqZWN0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHhJRChTdHJpbmcgdHhJRCkgewotCQlzZXRUZW1wVVJJKHR4SUQpOwotCX0KLQkKLQlwcml2YXRlIElMaWJyYXJ5UGVyc2lzdGVyIGdldExpYnJhcnlQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0UGVyc2lzdGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvTXVsdGlGaWxlWE1JU2F2ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5ODQ3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL011bHRpRmlsZVhNSVNhdmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVNhdmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBYTUxTYXZlIGltcGxlbWVudGF0aW9uIGZvciBsaWJyYXJ5IFhNSSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlGaWxlWE1JU2F2ZUltcGwgZXh0ZW5kcyBYTUlTYXZlSW1wbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX1NFUEFSQVRFTFlfQ0xBU1NfU0VUID0gIlNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbnMgdG8gZm9yY2Ugc2F2aW5nIGFsbCByZXNvdXJjZXMgaW4gdGhlIHJlc291cmNlIHNldCwgd2hldGhlcgotCSAqIHRoZXkgaGF2ZSBiZWVuIG1vZGlmaWVkIG9yIHVuY2hhbmdlZC4gSXRzIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiCi0JICogb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfQUxMID0gIlNBVkVfQUxMIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gc2F2ZSBvYmplY3RzIG9mIHRoZSBzYXZlIHR5cGUgdG9nZXRoZXIgaW4gdGhlIHNhbWUgZmlsZSBpZgotCSAqIE11bHRpRmlsZVV0aWwuY3JlYXRlRmlsZVVSSSgpIHJldHVybnMgdGhlIHNhbWUgVVJJIGZvciB0aGVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUID0gIlNBVkVfVE9HRVRIRVJfQ0xBU1NfU0VUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS19VUF9CRUZPUkVfU0FWRSA9ICJCQUNLX1VQX0JFRk9SRV9TQVZFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIE1PRElGSUVEX1JFU09VUkNFX1NFVCA9ICJNT0RJRklFRF9SRVNPVVJDRV9TRVQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlIG9wdGlvbiB0byBzcGVjaWZ5IGEgVHhSZWNvcmQgdG8gbG9nIHRoZSB0cmFuc2FjdGlvbmFsIGRhdGEgZm9yCi0JICogZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyCi0JICogQHNlZSBUeFJlY29yZAotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFhfUkVDT1JEID0gIlRYX1JFQ09SRCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJX0ZJTEUgPSAiTVVMVElfRklMRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNhdmUgb3B0aW9uIHRvIHJlZnJlc2ggdGhlIHdvcmtzcGFjZSB3aGVuIG5ldyByZXNvdXJjZSBpcyBjcmVhdGVkIGFuZAotCSAqIHNhdmVkLiBJdHMgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyAidHJ1ZSIgb3IgImZhbHNlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfTkVXX1JFU09VUkNFID0gIlJFRlJFU0hfTkVXX1JFU09VUkNFIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZSBvcHRpb24gdG8gY2hlY2sgdGhlIHJlc291cmNlIGZvciBtb2RpZmlhYmxlIGJlZm9yZSBzYXZpbmcgaXQuIEl0cwotCSAqIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgInRydWUiIG9yICJmYWxzZSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19NT0RJRlkgPSAiQ0hFQ0tfTU9ESUZZIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQlwcml2YXRlIFNldCBzYXZlU2VwYXJhdGVseUNsYXNzU2V0OwotCi0JcHJpdmF0ZSBNYXAgb3B0aW9uczsKLQotCS8qKgotCSAqIEBwYXJhbSBoZWxwZXIKLQkgKi8KLQlwdWJsaWMgTXVsdGlGaWxlWE1JU2F2ZUltcGwoWE1MSGVscGVyIGhlbHBlcikgewotCQlzdXBlcihoZWxwZXIpOwotCX0KLQotCVhNTEhlbHBlciBnZXRYTUxIZWxwZXIoKSB7Ci0JCXJldHVybiBoZWxwZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjaW5pdChvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlLAotCSAqICAgICAgamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KFhNTFJlc291cmNlIHJlc291cmNlLCBNYXAgb3B0cykgewotCQlzdXBlci5pbml0KHJlc291cmNlLCBvcHRzKTsKLQotLy8JCWlmIChlc2NhcGUgIT0gbnVsbCkgewotLy8JCQkvLyB1c2UgTXlFc2NhcGUgdG8gbm90IGVzY2FwZSB3aGl0ZXNwYWNlcwotLy8JCQkvLwotLy8JCQllc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLS8vCQl9Ci0KLQkJc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCA9IChTZXQpIG9wdHMuZ2V0KFNBVkVfU0VQQVJBVEVMWV9DTEFTU19TRVQpOwotCQlvcHRpb25zID0gb3B0czsKLQotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlib29sZWFuIGNhblNhdmVTZXBhcmF0ZWx5KE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIE11bHRpRmlsZVNhdmVVdGlsLmhhc093blJlc291cmNlKG9iaiwgc2F2ZVNlcGFyYXRlbHlDbGFzc1NldCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW1hSFJFRihSZXNvdXJjZSByZXNvdXJjZSwgSW50ZXJuYWxFT2JqZWN0IG8pIHsKLQkJaWYgKG8uZUlzUHJveHkoKQotCQkJCSYmIG8uZVByb3h5VVJJKCkuc2NoZW1lKCkuZXF1YWxzKE11bHRpRmlsZVVSSUNvbnZlcnRlci5TQ0hFTUUpKSB7Ci0JCQlyZXR1cm4gby5lUHJveHlVUkkoKS50b1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyBocmVmID0gbnVsbDsKLQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlocmVmID0gaGVscGVyLmdldEhSRUYobyk7Ci0JCX0KLQkJaWYgKGhyZWYgPT0gbnVsbCkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKCJDb3VsZCBub3QgZmluZCByZXNvdXJjZSBkZXNjcmlwdG9yIGZvciByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiXG4gIG9iamVjdDogIiArIG8pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBNdWx0aUZpbGVTYXZlVXRpbC5nZXRIUkVGKHJlc291cmNlLCBvKTsKLQkJfQotCQlyZXR1cm4gaHJlZjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxTYXZlSW1wbCNzYXZlSHJlZihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZUhyZWYoRU9iamVjdCByZW1vdGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCWlmIChmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSAmJiAoKEVSZWZlcmVuY2UpIGYpLmlzQ29udGFpbm1lbnQoKQotCQkJCSYmICF0b0RPTSkgewotCQkJLy8gaWYgdGhpcyBIUkVGIGlzIGEgY29udGFpbmVkIGVsZW1lbnQsIHNhdmUgaXRzIElEIGF0dHJpYnV0ZSBzbyB0aGUKLQkJCS8vIHByb3h5IGNhbiBiZSBjYWNoZWQgaW4gdGhlCi0JCQkvLyBHVUlEVG9FbGVtZW50TWFwIGZvciB0ZW1wb3JhcnkgdXNlIGJlZm9yZSBpdCBjYW4gYmUgcmVzb2x2ZWQuCi0JCQkvLyBUaGlzIGhlbHBzIGltcHJvdmUgbG9hZGluZyB0aW1lLgotCQkJLy8KLQkJCVN0cmluZyBocmVmID0gaGVscGVyLmdldEhSRUYocmVtb3RlKTsKLQkJCWlmIChocmVmICE9IG51bGwpIHsKLQkJCQlpZiAoZXNjYXBlVVJJICE9IG51bGwpIHsKLQkJCQkJaHJlZiA9IGVzY2FwZVVSSS5jb252ZXJ0KGhyZWYpOwotCQkJCX0KLQkJCQlTdHJpbmcgbmFtZSA9IGhlbHBlci5nZXRRTmFtZShmKTsKLQkJCQlkb2Muc3RhcnRFbGVtZW50KG5hbWUpOwotCQkJCUVDbGFzcyBlQ2xhc3MgPSByZW1vdGUuZUNsYXNzKCk7Ci0JCQkJRUNsYXNzIGV4cGVjdGVkVHlwZSA9IChFQ2xhc3MpIGYuZ2V0RVR5cGUoKTsKLQkJCQlpZiAoc2F2ZVR5cGVJbmZvID8geG1sVHlwZUluZm8uc2hvdWxkU2F2ZVR5cGUoZUNsYXNzLAotCQkJCQkJZXhwZWN0ZWRUeXBlLCBmKSA6IGVDbGFzcyAhPSBleHBlY3RlZFR5cGUKLQkJCQkJCSYmIGV4cGVjdGVkVHlwZS5pc0Fic3RyYWN0KCkpIHsKLQkJCQkJc2F2ZVR5cGVBdHRyaWJ1dGUoZUNsYXNzKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGlkID0gaGVscGVyLmdldElEKHJlbW90ZSk7Ci0JCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQkJZG9jLmFkZEF0dHJpYnV0ZShpZEF0dHJpYnV0ZU5hbWUsIGlkKTsKLQkJCQl9Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZShYTUxSZXNvdXJjZS5IUkVGLCBocmVmKTsKLQkJCQlpZiAoZU9iamVjdFRvRXh0ZW5zaW9uTWFwICE9IG51bGwpIHsKLQkJCQkJcHJvY2Vzc0F0dHJpYnV0ZUV4dGVuc2lvbnMocmVtb3RlKTsKLQkJCQkJaWYgKHByb2Nlc3NFbGVtZW50RXh0ZW5zaW9ucyhyZW1vdGUpKSB7Ci0JCQkJCQlkb2MuZW5kRWxlbWVudCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZG9jLmVuZEVtcHR5RWxlbWVudCgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCXN1cGVyLnNhdmVIcmVmKHJlbW90ZSwgZik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MU2F2ZUltcGwjc2F2ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNhdmVGZWF0dXJlcyhFT2JqZWN0IG8pIHsKLQkJdHJ5IHsKLQkJCU11bHRpRmlsZVhNSVJlc291cmNlSW1wbCByZXNvdXJjZSA9IChNdWx0aUZpbGVYTUlSZXNvdXJjZUltcGwpIG8KLQkJCQkJLmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlFT2JqZWN0IGNvbnRhaW5lciA9IG8uZUNvbnRhaW5lcigpOwotCQkJCUludGVybmFsRU9iamVjdCBpbnRlcm5hbEVPYmplY3QgPSAoKEludGVybmFsRU9iamVjdCkgbyk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGNhblNhdmVTZXBhcmF0ZWx5KG8pCi0JCQkJCQkmJiBjb250YWluZXIgIT0gbnVsbCkgewotCQkJCQlib29sZWFuIGNvbnRhaW5zTmV3RmVhdHVyZSA9IChyZXNvdXJjZSA9PSBjb250YWluZXIKLQkJCQkJCQkuZVJlc291cmNlKCkpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgbzsKLQkJCQkJVVJJIHVyaSA9IE11bHRpRmlsZVNhdmVVdGlsLmNyZWF0ZVVSSShlLCByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQkJaWYgKGNvbnRhaW5zTmV3RmVhdHVyZSkgewotCQkJCQkJaWYgKCFpbnRlcm5hbEVPYmplY3QuZUlzUHJveHkoKSkgewotCQkJCQkJCXJlc291cmNlID0gKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJCS5zYXZlKG8sIHVyaSwgb3B0aW9ucyk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB0aGVyZSBpcyBhIFJlc291cmNlRGVzY3JpcHRvciBmb3IgdGhpcwotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWVkZWQKLQkJCQkJCS8vCi0JCQkJCQlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gTXVsdGlGaWxlU2F2ZVV0aWwKLQkJCQkJCQkJLmdldFJlc291cmNlTWFuYWdlcihjb250YWluZXIuZVJlc291cmNlKCkpOwotCQkJCQkJaWYgKHJlc01nciAhPSBudWxsCi0JCQkJCQkJCSYmIHJlc01nci5nZXRSZXNvdXJjZURlc2NyaXB0b3IoZS5nZXRHdWlkKCkpID09IG51bGwpIHsKLQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCBubyBvdGhlciBSZXNvdXJjZU1hbmFnZXIgaGFzIGEKLQkJCQkJCQkvLyBSZXNvdXJjZURlc2NyaXB0b3IgZm9yIHRoaXMgZWxlbWVudAotCQkJCQkJCS8vCi0JCQkJCQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIHJlc291cmNlCi0JCQkJCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKS5nZXRVUklDb252ZXJ0ZXIoKTsKLQkJCQkJCQlpZiAodXJpQ29udmVydGVyCi0JCQkJCQkJCQkuZmluZFJlc291cmNlRGVzY3JpcHRvcihlLmdldEd1aWQoKSkgPT0gbnVsbCkgewotCQkJCQkJCQlNdWx0aUZpbGVTYXZlVXRpbC5yZWdpc3RlcldpdGhSZXNvdXJjZU1hbmFnZXIoCi0JCQkJCQkJCQkJcmVzTWdyLCBlLCByZXNvdXJjZS5nZXRGaW5hbFVSSSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyCi0JCQkJCQkmJiBoZWxwZXIuZ2V0UmVzb3VyY2UoKSAhPSByZXNvdXJjZSkgewotCQkJCQlTdHJpbmcgaHJlZiA9IGdldFVtYUhSRUYocmVzb3VyY2UsIGludGVybmFsRU9iamVjdCk7Ci0JCQkJCWRvYy5hZGRBdHRyaWJ1dGUoWE1MUmVzb3VyY2UuSFJFRiwgaHJlZik7Ci0JCQkJCWVuZFNhdmVGZWF0dXJlcyhvLCAwLCBudWxsKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLnNhdmVGZWF0dXJlcyhvKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJaWYgKE11bHRpRmlsZVNhdmVVdGlsLkRFQlVHKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SIHNhdmluZyBmZWF0dXJlOiAiICsgbyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgRmVhdHVyZSByZXNvdXJjZTogIiArIG8uZVJlc291cmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlTYXZlSW1wbCNhZGROYW1lc3BhY2VEZWNsYXJhdGlvbnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZURlY2xhcmF0aW9ucygpIHsKLQkJc3VwZXIuYWRkTmFtZXNwYWNlRGVjbGFyYXRpb25zKCk7Ci0JCQotCQlpZiAoIXRvRE9NKSB7Ci0JCQkvLyBzYXZlIHRvb2wgdmVyc2lvbiBpbmZvCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIHRvb2xJRCA9IChTdHJpbmcpaXRlci5uZXh0KCk7Ci0JCQkJRVBGVmVyc2lvbnMgZXBmVmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5nZXRWZXJzaW9ucyh0b29sSUQpOwotCQkJCVN0cmluZyBuc1VyaSA9IGVwZlZlcnNpb25zLmdldE5zVVJJKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZShFeHRlbmRlZE1ldGFEYXRhLlhNTE5TX1BSRUZJWCArICI6IiArIHRvb2xJRCwgbnNVcmkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRvb2xWZXJzaW9uID0gZXBmVmVyc2lvbnMuZ2V0TWluVG9vbFZlcnNpb25Gb3JDdXJyZW50TGlicmFyeVZlcnNpb24oKS5nZXRUb29sVmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJZG9jLmFkZEF0dHJpYnV0ZSh0b29sSUQgKyAiOnZlcnNpb24iLCB0b29sVmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15RXNjYXBlIGV4dGVuZHMgRXNjYXBlIHsKLQkJLy8gRU1GIDIuMiBpbXByb3ZlZCBFc2NhcGUgYSBsb3Qgc28gdGhlIG92ZXJyaWRlIHRoaXMgY2xhc3MgdG8gYWRkIG91ciBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQKLQkJLy8gZXhjZXB0IHRvIG1ha2UgaXQgcHVibGljCi0JCQotCQlwdWJsaWMgTXlFc2NhcGUoKSB7Ci0JCQlzZXRNYXBwaW5nTGltaXQoMHgxMEZGRkYpOwotCQl9Ci0JfQotCi0JLy8gVE9ETzogbmVlZHMgdG8gcmV2aXNpdCB0aGlzIGNsYXNzIHBlcmlvZGljYWxseSBzaW5jZSBpdHMgYmFzZSBjbGFzcyBtaWdodCBiZSB1cGRhdGVkIGEKLQkvLyBsb3QgaW4gRU1GLgotLy8JcHVibGljIHN0YXRpYyBjbGFzcyBNeUVzY2FwZSBleHRlbmRzIEVzY2FwZSB7Ci0vLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9VVEZfTUFQUEFCTEVfQ09ERVBPSU5UID0gMHgxMEZGRkY7Ci0vLwotLy8JCXByb3RlY3RlZCBmaW5hbCBjaGFyW10gQkxBTksgPSB7fTsKLS8vCQkKLS8vCQlwcml2YXRlIGJvb2xlYW4gYWxsb3dDb250cm9sQ2hhcmFjdGVyczsKLS8vCi0vLwkJcHVibGljIE15RXNjYXBlKCkgewotLy8JCQlzdXBlcigpOwotLy8JCX0KLS8vCQkKLS8vCQlAT3ZlcnJpZGUKLS8vCQlwdWJsaWMgdm9pZCBzZXRBbGxvd0NvbnRyb2xDaGFyYWN0ZXJzKGJvb2xlYW4gYWxsb3dDb250cm9sQ2hhcmFjdGVycykgewotLy8JCQl0aGlzLmFsbG93Q29udHJvbENoYXJhY3RlcnMgPSBhbGxvd0NvbnRyb2xDaGFyYWN0ZXJzOwotLy8JCX0KLS8vCQkKLS8vCSAgICAvKgotLy8JICAgICAqICBDb252ZXJ0IGF0dHJpYnV0ZSB2YWx1ZXM6Ci0vLwkgICAgICogICYgdG8gJmFtcDsKLS8vCSAgICAgKiAgPCB0byAmbHQ7Ci0vLwkgICAgICogICIgdG8gJnF1b3Q7Ci0vLwkgICAgICogIFx0IHRvICYjeDk7Ci0vLwkgICAgICogIFxuIHRvICYjeEE7Ci0vLwkgICAgICogIFxyIHRvICYjeEQ7Ci0vLwkgICAgICogIAotLy8JICAgICAqICA+IHRvICZndDsgKHRoaXMgaXMgdXNlZCBmb3IgWExJRkYncykKLS8vCSAgICAgKi8KLS8vCSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnQoU3RyaW5nIGlucHV0KQotLy8JICAgIHsKLS8vCSAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotLy8JICAgICAgaW50IGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoKCk7Ci0vLwkgICAgICBncm93KGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgIGludCBvdXRwdXRQb3MgPSAwOwotLy8JICAgICAgaW50IGlucHV0UG9zID0gMDsKLS8vCSAgICAgIGNoYXIgY2ggPSAwOwotLy8JICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgewotLy8JICAgICAgICBjaCA9IGlucHV0LmNoYXJBdChpbnB1dFBvcysrKTsgLy8gdmFsdWVbb3V0cHV0UG9zXTsKLS8vCSAgICAgICAgc3dpdGNoIChjaCkKLS8vCSAgICAgICAgewotLy8JICAgICAgICAgIGNhc2UgMHgxOgotLy8JICAgICAgICAgIGNhc2UgMHgyOgotLy8JICAgICAgICAgIGNhc2UgMHgzOgotLy8JICAgICAgICAgIGNhc2UgMHg0OgotLy8JICAgICAgICAgIGNhc2UgMHg1OgotLy8JICAgICAgICAgIGNhc2UgMHg2OgotLy8JICAgICAgICAgIGNhc2UgMHg3OgotLy8JICAgICAgICAgIGNhc2UgMHg4OgotLy8JICAgICAgICAgIGNhc2UgMHhCOgotLy8JICAgICAgICAgIGNhc2UgMHhDOgotLy8JICAgICAgICAgIGNhc2UgMHhFOgotLy8JICAgICAgICAgIGNhc2UgMHhGOgotLy8JICAgICAgICAgIGNhc2UgMHgxMDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTE6Ci0vLwkgICAgICAgICAgY2FzZSAweDEyOgotLy8JICAgICAgICAgIGNhc2UgMHgxMzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDE1OgotLy8JICAgICAgICAgIGNhc2UgMHgxNjoKLS8vCSAgICAgICAgICBjYXNlIDB4MTc6Ci0vLwkgICAgICAgICAgY2FzZSAweDE4OgotLy8JICAgICAgICAgIGNhc2UgMHgxOToKLS8vCSAgICAgICAgICBjYXNlIDB4MUE6Ci0vLwkgICAgICAgICAgY2FzZSAweDFCOgotLy8JICAgICAgICAgIGNhc2UgMHgxQzoKLS8vCSAgICAgICAgICBjYXNlIDB4MUQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDFFOgotLy8JICAgICAgICAgIGNhc2UgMHgxRjoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoYWxsb3dDb250cm9sQ2hhcmFjdGVycykKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIENPTlRST0xfQ0hBUkFDVEVSU1tjaF0sIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgZWxzZQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnJic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQU1QLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICc8JzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBMRVNTLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICAvLyBiZWdpbiBuZXcgY29kZQotLy8JICAgICAgICAgIGNhc2UgJz4nOgotLy8JICAgICAgICAgIHsKLS8vCQkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0vLwkJICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkJICAgICAgICAgICAgYnJlYWs7ICAKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgLy8gZW5kIG5ldyBjb2RlCSAgICAgICAgICAKLS8vCSAgICAgICAgICBjYXNlICciJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBRVU9URSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnXG4nOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIExGLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICdccic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQ1IsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJ1x0JzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBUQUIsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGRlZmF1bHQ6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWQoY2gpKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgY2hhciBoaWdoID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgaWYgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAKLS8vCSAgICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTG93U3Vycm9nYXRlKGNoKSkKLS8vCSAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBhYmxlTGltaXQgPT0gTUFYX1VURl9NQVBQQUJMRV9DT0RFUE9JTlQpCi0vLwkgICAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBjb2RlcG9pbnQgaXMgc3VwcG9ydGVkISAKLS8vCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvdXRwdXRQb3MrK10gPSBoaWdoOwotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgYXMgYW4gZW50aXR5Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgKCImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhYTUxDaGFyLnN1cHBsZW1lbnRhbChoaWdoLCBjaCkpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBsb3cgc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIHVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgLy8gTm9ybWFsIChCTVApIHVuaWNvZGUgY29kZXBvaW50LiBTZWUgaWYgd2Uga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIGVuY29kaW5nIHN1cHBvcnRzIGl0OgotLy8JICAgICAgICAgICAgICBpZiAoY2ggPD0gbWFwcGFibGVMaW1pdCkKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIC8vIFdlIG5vdCBzdXJlIHRoZSBlbmNvZGluZyBzdXBwb3J0cyB0aGlzIGNvZGVwb2ludCwgc28gd2Ugd3JpdGUgaXQgYXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLS8vCSAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICI7IikudG9DaGFyQXJyYXkoKSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgIH0KLS8vCSAgICAgIH0KLS8vCSAgICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgb3V0cHV0UG9zKSA6IGlucHV0OwotLy8JICAgIH0KLS8vCi0vLwkgICAgLyoKLS8vCSAgICAgKiAgQ29udmVydCBlbGVtZW50IHZhbHVlczoKLS8vCSAgICAgKiAgJiB0byAmYW1wOwotLy8JICAgICAqICA8IHRvICZsdDsKLS8vCSAgICAgKiAgIiB0byAmcXVvdDsKLS8vCSAgICAgKiAgXG4gdG8gbGluZSBzZXBhcmF0b3IKLS8vCSAgICAgKiAgCi0vLwkgICAgICogIFxyIHRvIGJsYW5rOwotLy8JICAgICAqICA+IHRvICZndDsgKHRoaXMgaXMgdXNlZCBmb3IgWExJRkYncykKLS8vCSAgICAgKi8KLS8vCSAgICBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUZXh0KFN0cmluZyBpbnB1dCkKLS8vCSAgICB7Ci0vLwkgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLS8vCSAgICAgIGludCBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCgpOwotLy8JICAgICAgZ3JvdyhpbnB1dExlbmd0aCk7Ci0vLwkgICAgICBpbnQgb3V0cHV0UG9zID0gMDsKLS8vCSAgICAgIGludCBpbnB1dFBvcyA9IDA7Ci0vLwkgICAgICBjaGFyIGNoOwotLy8JICAgICAgd2hpbGUgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgewotLy8JICAgICAgICBjaCA9IGlucHV0LmNoYXJBdChpbnB1dFBvcysrKTsgLy8gdmFsdWVbb3V0cHV0UG9zXTsKLS8vCSAgICAgICAgc3dpdGNoIChjaCkKLS8vCSAgICAgICAgewotLy8JICAgICAgICAgIGNhc2UgMHgxOgotLy8JICAgICAgICAgIGNhc2UgMHgyOgotLy8JICAgICAgICAgIGNhc2UgMHgzOgotLy8JICAgICAgICAgIGNhc2UgMHg0OgotLy8JICAgICAgICAgIGNhc2UgMHg1OgotLy8JICAgICAgICAgIGNhc2UgMHg2OgotLy8JICAgICAgICAgIGNhc2UgMHg3OgotLy8JICAgICAgICAgIGNhc2UgMHg4OgotLy8JICAgICAgICAgIGNhc2UgMHhCOgotLy8JICAgICAgICAgIGNhc2UgMHhDOgotLy8JICAgICAgICAgIGNhc2UgMHhFOgotLy8JICAgICAgICAgIGNhc2UgMHhGOgotLy8JICAgICAgICAgIGNhc2UgMHgxMDoKLS8vCSAgICAgICAgICBjYXNlIDB4MTE6Ci0vLwkgICAgICAgICAgY2FzZSAweDEyOgotLy8JICAgICAgICAgIGNhc2UgMHgxMzoKLS8vCSAgICAgICAgICBjYXNlIDB4MTQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDE1OgotLy8JICAgICAgICAgIGNhc2UgMHgxNjoKLS8vCSAgICAgICAgICBjYXNlIDB4MTc6Ci0vLwkgICAgICAgICAgY2FzZSAweDE4OgotLy8JICAgICAgICAgIGNhc2UgMHgxOToKLS8vCSAgICAgICAgICBjYXNlIDB4MUE6Ci0vLwkgICAgICAgICAgY2FzZSAweDFCOgotLy8JICAgICAgICAgIGNhc2UgMHgxQzoKLS8vCSAgICAgICAgICBjYXNlIDB4MUQ6Ci0vLwkgICAgICAgICAgY2FzZSAweDFFOgotLy8JICAgICAgICAgIGNhc2UgMHgxRjoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBpZiAoYWxsb3dDb250cm9sQ2hhcmFjdGVycykKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgQ09OVFJPTF9DSEFSQUNURVJTW2NoXSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIGludmFsaWQgWE1MIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJyYnOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEFNUCwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnPCc6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgTEVTUywgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgICAgY2FzZSAnIic6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgUVVPVEUsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIGNhc2UgJ1xuJzoKLS8vCSAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBMSU5FX0ZFRUQsIGlucHV0TGVuZ3RoKTsKLS8vCSAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JICAgICAgICAgIC8vIGJlZ2luIG1vZGlmaWVkCi0vLwkgICAgICAgICAgY2FzZSAnXHInOgotLy8JICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgIG91dHB1dFBvcyA9IHJlcGxhY2VDaGFycyhvdXRwdXRQb3MsIEJMQU5LLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgIGJyZWFrOwotLy8JICAgICAgICAgIH0KLS8vCSAgICAgICAgICBjYXNlICc+JzoKLS8vCSAgICAgICAgICB7Ci0vLy8vCSAgICAgICAgICAgIGlmIChpbnB1dFBvcyA+PSAzICYmIGlucHV0LmNoYXJBdChpbnB1dFBvcyAtIDIpID09ICddJyAmJiBpbnB1dC5jaGFyQXQoaW5wdXRQb3MgLSAzKSA9PSAnXScpCi0vLy8vCSAgICAgICAgICAgIHsKLS8vLy8JICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCBHUkVBVEVSLCBpbnB1dExlbmd0aCk7Ci0vLy8vCSAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLy8vCSAgICAgICAgICAgICAgYnJlYWs7Ci0vLy8vCSAgICAgICAgICAgIH0KLS8vLy8JICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCBkZWZhdWx0IHByb2Nlc3NpbmcKLS8vCSAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgR1JFQVRFUiwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLS8vCSAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgfQotLy8JCSAgICAgIC8vIGVuZCBtb2RpZmllZAotLy8JICAgICAgICAgIGRlZmF1bHQ6Ci0vLwkgICAgICAgICAgewotLy8JICAgICAgICAgICAgaWYgKCFYTUxDaGFyLmlzVmFsaWQoY2gpKQotLy8JICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICBpZiAoWE1MQ2hhci5pc0hpZ2hTdXJyb2dhdGUoY2gpKQotLy8JICAgICAgICAgICAgICB7Ci0vLwkgICAgICAgICAgICAgICAgY2hhciBoaWdoID0gY2g7Ci0vLwkgICAgICAgICAgICAgICAgaWYgKGlucHV0TGVuZ3RoLS0gPiAwKQotLy8JICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KGlucHV0UG9zKyspOyAKLS8vCSAgICAgICAgICAgICAgICAgIGlmIChYTUxDaGFyLmlzTG93U3Vycm9nYXRlKGNoKSkKLS8vCSAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBhYmxlTGltaXQgPT0gTUFYX1VURl9NQVBQQUJMRV9DT0RFUE9JTlQpCi0vLwkgICAgICAgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBjb2RlcG9pbnQgaXMgc3VwcG9ydGVkISAKLS8vCSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtvdXRwdXRQb3MrK10gPSBoaWdoOwotLy8JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y2UgdGhlIHN1cHBsZW1lbnRhbCBjaGFyYWN0ZXIgYXMgYW4gZW50aXR5Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9zID0gcmVwbGFjZUNoYXJzKG91dHB1dFBvcywgKCImI3giICsgSW50ZWdlci50b0hleFN0cmluZyhYTUxDaGFyLnN1cHBsZW1lbnRhbChoaWdoLCBjaCkpICsgIjsiKS50b0NoYXJBcnJheSgpLCBpbnB1dExlbmd0aCk7Ci0vLwkgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0vLwkgICAgICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0vLwkgICAgICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBsb3cgc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIHVucGFpcmVkIGhpZ2ggc3Vycm9nYXRlIGNoYXJhY3RlciAoVW5pY29kZTogMHgiICsgSW50ZWdlci50b0hleFN0cmluZyhjaCkgKyAiKSB3YXMgZm91bmQgaW4gdGhlIGVsZW1lbnQgY29udGVudDoiICsgaW5wdXQpOwotLy8JICAgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgICAgfQotLy8JICAgICAgICAgICAgICBlbHNlCi0vLwkgICAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQW4gaW52YWxpZCBYTUwgY2hhcmFjdGVyIChVbmljb2RlOiAweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICIpIHdhcyBmb3VuZCBpbiB0aGUgZWxlbWVudCBjb250ZW50OiIgKyBpbnB1dCk7Ci0vLwkgICAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIH0KLS8vCSAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgIHsKLS8vCSAgICAgICAgICAgICAgLy8gTm9ybWFsIChCTVApIHVuaWNvZGUgY29kZXBvaW50LiBTZWUgaWYgd2Uga25vdyBmb3IgYSBmYWN0IHRoYXQgdGhlIGVuY29kaW5nIHN1cHBvcnRzIGl0OgotLy8JICAgICAgICAgICAgICBpZiAoY2ggPD0gbWFwcGFibGVMaW1pdCkKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIHZhbHVlW291dHB1dFBvcysrXSA9IGNoOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICAgIGVsc2UKLS8vCSAgICAgICAgICAgICAgewotLy8JICAgICAgICAgICAgICAgIC8vIFdlIG5vdCBzdXJlIHRoZSBlbmNvZGluZyBzdXBwb3J0cyB0aGlzIGNvZGVwb2ludCwgc28gd2Ugd3JpdGUgaXQgYXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZS4KLS8vCSAgICAgICAgICAgICAgICBvdXRwdXRQb3MgPSByZXBsYWNlQ2hhcnMob3V0cHV0UG9zLCAoIiYjeCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKSArICI7IikudG9DaGFyQXJyYXkoKSwgaW5wdXRMZW5ndGgpOwotLy8JICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOwotLy8JICAgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICB9Ci0vLwkgICAgICAgICAgICBicmVhazsKLS8vCSAgICAgICAgICB9Ci0vLwkgICAgICAgIH0KLS8vCSAgICAgIH0KLS8vCSAgICAgIHJldHVybiBjaGFuZ2VkID8gbmV3IFN0cmluZyh2YWx1ZSwgMCwgb3V0cHV0UG9zKSA6IGlucHV0OwotLy8JICAgIH0KLS8vCi0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tNb2RpZnlSZXF1aXJlZChNYXAgb3B0aW9ucykgewotCQlPYmplY3Qgb3B0ID0gb3B0aW9ucy5nZXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuQ0hFQ0tfTU9ESUZZKTsKLQkJcmV0dXJuIG9wdCAhPSBudWxsID8gQm9vbGVhbi52YWx1ZU9mKG9wdC50b1N0cmluZygpKS5ib29sZWFuVmFsdWUoKQotCQkJCTogZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4ZjY2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgZm9yIHRoZSBMaWJyYXJ5IFBlcnNpc3RlbmNlIHBsdWctaW4uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyc2lzdGVuY2VQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9UeFJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWMwZWFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvVHhSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBrZWVwIHRoZSB0cmFuc2FjdGlvbiBkYXRhIHRvIHN1cHBvcnQgZmFpbC1zYWZlIHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLWNsYXNzIFR4UmVjb3JkIHsKLQotCXByaXZhdGUgU3RyaW5nIHR4SUQ7Ci0KLQlwcml2YXRlIExpc3QgcmVzb3VyY2VzVG9Db21taXQ7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB3YXJuaW5nczsKLQotCS8qKgotCSAqIEBwYXJhbSB0eGlkCi0JICogQHBhcmFtIGNvbW1pdAotCSAqLwotCXB1YmxpYyBUeFJlY29yZCgpIHsKLQkJc3VwZXIoKTsKLQkJcmVzb3VyY2VzVG9Db21taXQgPSBuZXcgVW5pcXVlRUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR4SUQoKSB7Ci0JCWlmICh0eElEID09IG51bGwpIHsKLQkJCXR4SUQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCQl9Ci0JCXJldHVybiB0eElEOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFJlc291cmNlc1RvQ29tbWl0KCkgewotCQlyZXR1cm4gcmVzb3VyY2VzVG9Db21taXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgd2FybmluZ3MKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRXYXJuaW5ncygpIHsKLQkJaWYgKHdhcm5pbmdzID09IG51bGwpIHsKLQkJCXdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB3YXJuaW5nczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdHhJRCA9IG51bGw7Ci0JCXJlc291cmNlc1RvQ29tbWl0LmNsZWFyKCk7Ci0JCWlmICh3YXJuaW5ncyAhPSBudWxsKSB7Ci0JCQl3YXJuaW5ncy5jbGVhcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9Vbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzM2EwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1Vubm9ybWFsaXplZFVSSUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotLyoqCi0gKiBFeGNlcHRpb24gZm9yIFVSSSB0aGF0IGNhbm5vdCBiZSBub3JtYWxpemVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5ub3JtYWxpemVkVVJJRXhjZXB0aW9uIGV4dGVuZHMgTXVsdGlGaWxlSU9FeGNlcHRpb24gewotCi0JcHJpdmF0ZSBVUkkgdXJpOwotCi0JLyoqCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBVbm5vcm1hbGl6ZWRVUklFeGNlcHRpb24oVVJJIHVyaSwgU3RyaW5nIG1zZykgewotCQlzdXBlcihtc2cpOwotCQl0aGlzLnVyaSA9IHVyaTsKLQl9Ci0JCi0JcHVibGljIFVSSSBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MTI5MzE2MjEwNzU1MzM3ODE2TDsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9YTUlMaWJyYXJ5UGVyc2lzdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkNjEzMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMTAsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGltcGxlbWVudHMgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgewotCQotCS8qKgotCSAqIENvbnRydWN0cyBhIG5ldyBYTUlMaWJyYXJ5UGVyc2lzdGVyIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBYTUlMaWJyYXJ5UGVyc2lzdGVyKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciNnZXRGaWxlRXh0ZW5zaW9uKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZpbGVFeHRlbnNpb24oZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyI2dldEZvbGRlclJlbGF0aXZlUGF0aChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZvbGRlclJlbGF0aXZlUGF0aChlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIjaGFzT3duRm9sZGVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duRm9sZGVyKE9iamVjdCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmhhc093bkZvbGRlcihlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuSUxpYnJhcnlQZXJzaXN0ZXIjYWRqdXN0TG9jYXRpb24ob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdExvY2F0aW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuYWRqdXN0TG9jYXRpb24ocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNkZWxldGUob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShNZXRob2RFbGVtZW50IGUpIHsKLQkJTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5kZWxldGUoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2dldEZhaWxTYWZlUGVyc2lzdGVyKCkKLQkgKi8KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKCkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNnZXRXYXJuaW5ncygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldFdhcm5pbmdzKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2UoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2UoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI2hhc093blJlc291cmNlV2l0aG91dFJlZmVycmVyKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoT2JqZWN0IGUpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaGFzT3duUmVzb3VyY2VXaXRob3V0UmVmZXJyZXIoZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklMaWJyYXJ5UGVyc2lzdGVyI3NhdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLnNhdmUocmVzb3VyY2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5JTGlicmFyeVBlcnNpc3RlciNzYXZlKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2F2ZShlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBjcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIoU3RyaW5nIHBsdWdpbk5hbWUsIE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW5Gb2xkZXIocGx1Z2luTmFtZSwgbGlicmFyeSk7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKGxpYnJhcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRNZXRob2RDb25maWd1cmF0aW9uRm9sZGVyKE1ldGhvZExpYnJhcnkgbGlicmFyeSwgRmlsZSBmaWxlKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0Uuc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIobGlicmFyeSwgZmlsZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb250YWluZWRCeShSZXNvdXJjZSByZXNvdXJjZSwgUmVzb3VyY2UgY29udGFpbmVyUmVzb3VyY2UpIHsKLQkJcmV0dXJuIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuaXNDb250YWluZWRCeShyZXNvdXJjZSwgY29udGFpbmVyUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZXRSZXNvdXJjZUZvbGRlclBhdGgoZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEZvbGRlckFic29sdXRlUGF0aChlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIjZGVsZXRlKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZGVsZXRlKGVsZW1lbnRzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL1hNSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJhZjk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvWE1JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgMjcsIDIwMDYKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UmVzb3VyY2VTZXRGYWN0b3J5IGltcGxlbWVudHMgSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkjY3JlYXRlTGlicmFyeVJlc291cmNlU2V0KCkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZVNldCBjcmVhdGVMaWJyYXJ5UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiBuZXcgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldEZhY3RvcnkjZ2V0UGVyc2lzdGVuY2VUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vSU1pZ3JhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkODAyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9JTWlncmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogTWlncmF0ZXMgb25lIHZlcnNpb24gb2YgVU1BIGxpYnJhcnkgdG8gYW5vdGhlcgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNaWdyYXRvciB7Ci0KLQl2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsKLQl2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbjsKLQl2b2lkIG1pZ3JhdGVYbWxJbXBvcnRlZExpYihNZXRob2RMaWJyYXJ5IGxpYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NYXBwaW5nVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWFwcGluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlMDVlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NYXBwaW5nVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIHBlcmZvcm0gbGlicmFyeSB1cGdyYWRlIGZyb20KLSAqIG9sZGVyIHZlcnNpb24uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBwaW5nVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNaWdyYXRvciB7Ci0JCUJ1bmRsZSBidW5kbGU7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQotCQlTdHJpbmcgbGliTnNVUkk7Ci0KLQkJSU1pZ3JhdG9yIGluc3RhbmNlOwotCi0JCS8qKgotCQkgKiBAcGFyYW0gYnVuZGxlCi0JCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkJICogQHBhcmFtIGxpYk5zVVJJCi0JCSAqLwotCQlwdWJsaWMgTWlncmF0b3IoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGxpYk5zVVJJKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJCXRoaXMubGliTnNVUkkgPSBsaWJOc1VSSTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIE1hcCBtaWdyYXRvcnM7Ci0JcHJpdmF0ZSBzdGF0aWMgU2V0IG9sZE5zVXJpcyA9IG5ldyBIYXNoU2V0KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhZGp1c3RlZExpYk5zVVJJTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSU1pZ3JhdG9yIGdldE1pZ3JhdG9yKFN0cmluZyBsaWJOc1VSSSkgewotCQlpZiAobWlncmF0b3JzID09IG51bGwpIHsKLQkJCW1pZ3JhdG9ycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubWlncmF0b3JzIgotCQkJLy8gZXh0ZW5zaW9uIHBvaW50Ci0JCQkvLyBjb250cmlidXRvcnMuCi0JCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybQotCQkJCQkuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5Ci0JCQkJCS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQkJCQkib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UiLCAibWlncmF0b3JzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG5zVVJJID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgibGliTnNVUkkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbAotCQkJCQkJCQkJJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJCSYmIG5zVVJJICE9IG51bGwKLQkJCQkJCQkJCSYmIG5zVVJJLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJbWlncmF0b3JzLnB1dChuc1VSSSwgbmV3IE1pZ3JhdG9yKGJ1bmRsZSwKLQkJCQkJCQkJCQljbGFzc05hbWUsIG5zVVJJKSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCU1pZ3JhdG9yIG1pZ3JhdG9yID0gKE1pZ3JhdG9yKSBtaWdyYXRvcnMuZ2V0KGxpYk5zVVJJKTsKLQkJaWYgKG1pZ3JhdG9yICE9IG51bGwpIHsKLQkJCWlmIChtaWdyYXRvci5pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbWlncmF0b3IuaW5zdGFuY2UgPSAoSU1pZ3JhdG9yKSBtaWdyYXRvci5idW5kbGUubG9hZENsYXNzKAotCQkJCQkJCW1pZ3JhdG9yLmNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBtaWdyYXRvci5pbnN0YW5jZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGNvbnZlcnNpb25SZXF1aXJlZChTdHJpbmcgbGliUGF0aCwKLQkJCVZlcnNpb25VdGlsLlZlcnNpb25DaGVja0luZm8gaW5mbykgewotCQlTdHJpbmcgY3VycmVudE5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKCk7Ci0JCVN0cmluZyBsaWJOc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSShsaWJQYXRoKTsKLQkJbGliTnNVUkkgPSBnZXRBZGp1c3RlZExpYk5zVVJJKGxpYk5zVVJJLCBpbmZvKTsKLQotCQlpZiAob2xkTnNVcmlzLmNvbnRhaW5zKGxpYk5zVVJJKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGN1cnJlbnROc1VSSS5lcXVhbHMobGliTnNVUkkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYm9vbGVhbiByZXQgPSBnZXRNaWdyYXRvcihsaWJOc1VSSSkgIT0gbnVsbDsKLQkJaWYgKHJldCkgewotCQkJb2xkTnNVcmlzLmFkZChsaWJOc1VSSSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JLy9UaGlzIGlzIGFuIHVnbHkgcGllY2UsIGJ1dCB3ZSBuZWVkIGl0IGZvciBtaWdyYXRpbmcgRVBGIDEuMS4wCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFkanVzdGVkTGliTnNVUkkoU3RyaW5nIGxpYk5zVVJJLCBWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJU3RyaW5nIHJldCA9IGdldEFkanVzdGVkTGliTnNVUklfKGxpYk5zVVJJLCBpbmZvKTsKLQkJaWYgKHJldCAhPSBsaWJOc1VSSSkgewotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBsaWJOc1VSSTogIiArIGxpYk5zVVJJKTsJLy8kTk9OLU5MUy0xJCAKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhZGp1c3RlZExpYk5zVVJJOiAiICsgcmV0KTsJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYWRqdXN0ZWRMaWJOc1VSSU1hcC5wdXQobGliTnNVUkksIHJldCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFkanVzdGVkTGliTnNVUklfKFN0cmluZyBsaWJOc1VSSSwgVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBjdXJyZW50TnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkoKTsKLQkJaWYgKCEgY3VycmVudE5zVVJJLmVxdWFscyhsaWJOc1VSSSkpIHsKLQkJCXJldHVybiBsaWJOc1VSSTsKLQkJfSBlbHNlIGlmICghIGxpYk5zVVJJLmVxdWFscygiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQlyZXR1cm4gbGliTnNVUkk7Ci0JCX0KLQkJaWYgKGluZm8udG9vbFZlcnNpb24uZXF1YWxzKGluZm8uY3VycmVudE1pblRvb2xWZXJzaW9uKSkgewotCQkJcmV0dXJuIGxpYk5zVVJJOwotCQl9Ci0JCXJldHVybiAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSI7CS8vJE5PTi1OTFMtMSQgCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlJTWlncmF0b3IgbWlncmF0b3IgPSBnZXRNaWdyYXRvckJ5TGliUGF0aChsaWJQYXRoKTsKLQkJaWYgKG1pZ3JhdG9yICE9IG51bGwpIHsKLQkJCW1pZ3JhdG9yLm1pZ3JhdGUobGliUGF0aCwgbW9uaXRvciwgaW5mbyk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWlncmF0b3IgZ2V0TWlncmF0b3JCeUxpYlBhdGgoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIG5zVVJJID0gUGVyc2lzdGVuY2VVdGlsLmdldFVNQU5zVVJJKGxpYlBhdGgpOwotCQlTdHJpbmcgYWRqdXN0ZWRMaWJOc1VSSSA9IGFkanVzdGVkTGliTnNVUklNYXAuZ2V0KG5zVVJJKTsKLQkJaWYgKGFkanVzdGVkTGliTnNVUkkgIT0gbnVsbCkgewotCQkJbnNVUkkgPSBhZGp1c3RlZExpYk5zVVJJOwotCQl9Ci0JCXJldHVybiBnZXRNaWdyYXRvcihuc1VSSSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgbGliUGF0aCA9IGFyZ3NbMF07Ci0JCVN5c3RlbS5vdXQKLQkJCQkucHJpbnRsbigiU3RhcnQgbWlncmF0aW5nIG1ldGhvZCBsaWJyYXJ5IGF0ICciICsgbGliUGF0aCArICInLi4uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0cnkgewotCQkJbWlncmF0ZShsaWJQYXRoLCBudWxsLCBudWxsKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJNaWdyYXRpb24gc3VjY2Vzc2Z1bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTWlncmF0aW9uIGZhaWxlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmMzOGYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdGlvblJlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLkJhc2ljUmVzb3VyY2VIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlOwotCi0vKioKLSAqIFJlc291cmNlIGhhbmRsZXIgZm9yIG1pZ3JhdGluZyBVTUEgbGlicmFyeSBmcm9tIG9uZSB2ZXJzaW9uIHRvIGFub3RoZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgZXh0ZW5kcyBCYXNpY1Jlc291cmNlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsKLQotCXB1YmxpYyBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuQmFzaWNSZXNvdXJjZUhhbmRsZXIjcG9zdExvYWQob3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZSwKLQkgKiAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0sIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgcG9zdExvYWQoWE1MUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAotCQkJTWFwIG9wdGlvbnMpIHsKLQkJaWYgKCFyZXNvdXJjZS5nZXRFT2JqZWN0VG9FeHRlbnNpb25NYXAoKS5pc0VtcHR5KCkpIHsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIucG9zdExvYWQoKTogIiArIHJlc291cmNlLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLSBTdGFydCB1bmtub3duIGZlYXR1cmVzIC0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2UuZ2V0RU9iamVjdFRvRXh0ZW5zaW9uTWFwKCkuZW50cnlTZXQoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVudHJ5LmdldEtleSgpIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkvLyBoYW5kbGUgbW92ZWQgZGF0YQotCQkJCQkvLwotCQkJCQloYW5kbGVVbmtub3duRGF0YSgoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCksIChBbnlUeXBlKWVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0gRW5kIHVua25vd24gZmVhdHVyZXMgLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUZXh0KEFueVR5cGUgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChGZWF0dXJlTWFwLkVudHJ5KSB2YWx1ZS5nZXRNaXhlZCgpLmdldCgwKTsKLQkJCXJldHVybiAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVBdHRyaWJ1dGUgZ2V0RUF0dHJpYnV0ZShFQ2xhc3MgZUNsYXNzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZUNsYXNzLmdldEVBbGxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGF0dHJpYi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSkgewotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCWVPYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIHZhbHVlcyA9IChDb2xsZWN0aW9uKSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJdmFsdWVzLmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZXMuYWRkKHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhbmRsZVVua25vd25GZWF0dXJlKEVPYmplY3Qgb3duZXIsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpOwotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVVua25vd25GZWF0dXJlcyhFT2JqZWN0IG93bmVyLCBGZWF0dXJlTWFwIGZlYXR1cmVNYXApIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRmVhdHVyZU1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZiA9IGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJaWYoaGFuZGxlVW5rbm93bkZlYXR1cmUob3duZXIsIGYsIGVudHJ5LmdldFZhbHVlKCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duRGF0YShFT2JqZWN0IGUsIEFueVR5cGUgdW5rbm93bkRhdGEpIHsKLQkJaGFuZGxlVW5rbm93bkZlYXR1cmVzKGUsIHVua25vd25EYXRhLmdldE1peGVkKCkpOwotCQloYW5kbGVVbmtub3duRmVhdHVyZXMoZSwgdW5rbm93bkRhdGEuZ2V0QW55QXR0cmlidXRlKCkpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2luZ2xlVmFsdWUoRmVhdHVyZU1hcCBmZWF0dXJlTWFwLAotCQkJU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgQ29sbGVjdGlvbiBnZXRWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlTWFwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZU1hcC5FbnRyeSBlbnRyeSA9IChFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscyhmZWF0dXJlTmFtZSkpIHsKLQkJCQlsaXN0LmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL01pZ3JhdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZmYzOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vTWlncmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdG9uIGZvciBJTWlncmF0b3IKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiAKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9ySW1wbCBpbXBsZW1lbnRzIElNaWdyYXRvciB7Ci0JCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHRocm93cyBFeGNlcHRpb24gewkJCi0JfQotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGVYbWxJbXBvcnRlZExpYihNZXRob2RMaWJyYXJ5IGxpYiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVU1BMlVNQVJlc291cmNlSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVU1BMlVNQVJlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDI1ZDFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlOwotCi0vKioKLSAqIFJlc291cmNlIGhhbmRsZXIgZm9yIG1pZ3JhdGluZyBVTUEgbGlicmFyeSBmcm9tIG9uZSB2ZXJzaW9uIHRvIGFub3RoZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyIGV4dGVuZHMgTWlncmF0aW9uUmVzb3VyY2VIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOwotCi0JcHJpdmF0ZSBMaXN0IG1vdmVJbmZvczsKLQotCXB1YmxpYyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyKCkgewotCQltb3ZlSW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBFQXR0cmlidXRlIGdldEVBdHRyaWJ1dGUoRUNsYXNzIGVDbGFzcywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVDbGFzcy5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhdHRyaWIuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBhdHRyaWI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSBydWxlcyB0byBtb3ZlIGRhdGEKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIKLQkgKiBAcGFyYW0gZmVhdHVyZU5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXROZXdGZWF0dXJlKEVPYmplY3Qgb3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHJ1bGVzIHRvIG1vdmUgZGF0YQotCSAqIAotCSAqIEBwYXJhbSBvbGRPd25lcgotCSAqIEBwYXJhbSBmZWF0dXJlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgRU9iamVjdCBnZXROZXdPd25lcihFT2JqZWN0IG9sZE93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXROZXdWYWx1ZShFT2JqZWN0IG9sZE93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUsCi0JCQlBbnlUeXBlIHZhbHVlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVEYXRhKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb3ZlSW5mb3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNb3ZlSW5mbyBpbmZvID0gKE1vdmVJbmZvKSBpdGVyLm5leHQoKTsKLQkJCUVPYmplY3QgbmV3T3duZXIgPSBnZXROZXdPd25lcihpbmZvLm9sZE93bmVyLCBpbmZvLm9sZEZlYXR1cmVOYW1lKTsKLQkJCWlmIChuZXdPd25lciAhPSBudWxsKSB7Ci0JCQkJc2V0VmFsdWUobmV3T3duZXIsIGluZm8ubmV3RmVhdHVyZSwgaW5mby52YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBlT2JqZWN0LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCB2YWx1ZSkgewotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCWVPYmplY3QuZVNldChmZWF0dXJlLCB2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlDb2xsZWN0aW9uIHZhbHVlcyA9IChDb2xsZWN0aW9uKSBlT2JqZWN0LmVHZXQoZmVhdHVyZSk7Ci0JCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJdmFsdWVzLmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQl2YWx1ZXMuYWRkKHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW92ZUluZm8gewotCQlFT2JqZWN0IG9sZE93bmVyOwotCi0JCVN0cmluZyBvbGRGZWF0dXJlTmFtZTsKLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgbmV3RmVhdHVyZTsKLQotCQlPYmplY3QgdmFsdWU7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcigpCi0JCQkJCS5hcHBlbmQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpCi0JCQkJCS5hcHBlbmQoIihcbiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZCgiICBvbGRGZWF0dXJlTmFtZTogIikuYXBwZW5kKG9sZEZlYXR1cmVOYW1lKS5hcHBlbmQoJ1xuJykgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCIgIG5ld0ZlYXR1cmU6ICIpLmFwcGVuZChuZXdGZWF0dXJlKS5hcHBlbmQoJ1xuJykgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCIgIHZhbHVlOiAiKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgnXG4nKSAvLyROT04tTkxTLTEkCi0JCQkJCS5hcHBlbmQoIikiKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTaW5nbGVWYWx1ZShGZWF0dXJlTWFwIGZlYXR1cmVNYXAsCi0JCQlTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZU1hcC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZlYXR1cmVNYXAuRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoZmVhdHVyZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBDb2xsZWN0aW9uIGdldFZhbHVlKEZlYXR1cmVNYXAgZmVhdHVyZU1hcCwKLQkJCVN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlDb2xsZWN0aW9uIGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVNYXAuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlTWFwLkVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKGZlYXR1cmVOYW1lKSkgewotCQkJCWxpc3QuYWRkKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyTW92ZUluZm9zKCkgewotCQltb3ZlSW5mb3MuY2xlYXIoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIjaGFuZGxlVW5rbm93bkZlYXR1cmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFuZGxlVW5rbm93bkZlYXR1cmUoRU9iamVjdCBvd25lciwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlTdHJpbmcgZmVhdHVyZU5hbWUgPSBmZWF0dXJlLmdldE5hbWUoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIG5ld0ZlYXR1cmUgPSBnZXROZXdGZWF0dXJlKG93bmVyLCBmZWF0dXJlTmFtZSk7Ci0JCWlmIChuZXdGZWF0dXJlICE9IG51bGwpIHsKLQkJCU1vdmVJbmZvIG1vdmVJbmZvID0gbmV3IE1vdmVJbmZvKCk7Ci0JCQltb3ZlSW5mby5vbGRPd25lciA9IG93bmVyOwotCQkJbW92ZUluZm8ub2xkRmVhdHVyZU5hbWUgPSBmZWF0dXJlTmFtZTsKLQkJCW1vdmVJbmZvLm5ld0ZlYXR1cmUgPSBuZXdGZWF0dXJlOwotCQkJbW92ZUluZm8udmFsdWUgPSB2YWx1ZSBpbnN0YW5jZW9mIEFueVR5cGUgPyBnZXROZXdWYWx1ZSgKLQkJCQkJb3duZXIsIGZlYXR1cmVOYW1lLCAoQW55VHlwZSkgdmFsdWUpCi0JCQkJCTogdmFsdWU7Ci0JCQltb3ZlSW5mb3MuYWRkKG1vdmVJbmZvKTsKLQkJCWlmIChERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtb3ZlSW5mbyk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VcGdyYWRlQ2FsbGVySW5mby5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vVXBncmFkZUNhbGxlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZTY3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9VcGdyYWRlQ2FsbGVySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIENsYXNzIHJlcHJlc2VudGluZyBjYWxsZXIgaW5mbyBmb3IgY2FsbGluZyBsaWJyYXJ5IHVwZ3JhZGUgY29kZS4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZ3JhZGVDYWxsZXJJbmZvIHsKLQkKLQlwdWJsaWMgc3RhdGljIGludCB1cGdyYWRlTGlicmFyeSA9IDA7Ci0JcHVibGljIHN0YXRpYyBpbnQgdXBncmFkZUltcG9ydFBsdWdpbiA9IDE7Ci0JcHVibGljIHN0YXRpYyBpbnQgdXBncmFkZUltcG9ydENvbmZpZyA9IDI7Ci0JCi0JcHJpdmF0ZSBpbnQgY2FsbGVyVHlwZSA9IHVwZ3JhZGVMaWJyYXJ5OwotCXByaXZhdGUgU3RyaW5nIGVycm9yTXNnOwotCUZpbGUgbGliRmlsZTsKLQlGaWxlIGNvcGllZExpYkZpbGU7Ci0JCi0JcHVibGljIFVwZ3JhZGVDYWxsZXJJbmZvKGludCBjYWxsZXJUeXBlLCBGaWxlIGxpYkZpbGUpIHsKLQkJdGhpcy5jYWxsZXJUeXBlID0gY2FsbGVyVHlwZTsKLQkJdGhpcy5saWJGaWxlID0gbGliRmlsZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBncmFkZUxpYnJhcnkoVXBncmFkZUNhbGxlckluZm8gaW5mbykgewotCQlyZXR1cm4gaW5mbyA9PSBudWxsIHx8IGluZm8uaXNVcGdyYWRlTGlicmFyeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VwZ3JhZGVMaWJyYXJ5KCkgewotCQlyZXR1cm4gY2FsbGVyVHlwZSA9PSB1cGdyYWRlTGlicmFyeTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpIHsKLQkJcmV0dXJuIGNhbGxlclR5cGUgPT0gdXBncmFkZUltcG9ydFBsdWdpbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RXJyb3JNc2coU3RyaW5nIG1zZykgewotCQllcnJvck1zZyA9IG1zZzsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1zZygpIHsKLQkJcmV0dXJuIGVycm9yTXNnOwotCX0JCQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRDb3BpZWRMaWJGaWxlKEZpbGUgZmlsZSkgewotCQljb3BpZWRMaWJGaWxlID0gZmlsZTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0Q29waWVkTGliRmlsZSgpIHsKLQkJcmV0dXJuIGNvcGllZExpYkZpbGU7Ci0JfQotCQotCXByb3RlY3RlZCBGaWxlIGdldExpYkZpbGUoKSB7Ci0JCXJldHVybiBsaWJGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvcHlMaWJyYXJ5KCkgewotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDb3BpZWRMaWJyYXJ5KCkgewotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL01pZ3JhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9pbnRlcm5hbC9NaWdyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzg1YWEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL01pZ3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRXh0ZW5kZWRNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLklsbGVnYWxWYWx1ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLkVjb3JlMlhNTFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm1hcHBpbmcuZWNvcmUyeG1sLkVjb3JlMlhNTFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5tYXBwaW5nLmVjb3JlMnhtbC5pbXBsLkVjb3JlMlhNTFJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYubWFwcGluZy5lY29yZTJ4bWwudXRpbC5FY29yZTJYTUxFeHRlbmRlZE1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uVU1BMlVNQVJlc291cmNlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Db250ZW50RGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIE1pZ3JhdGVzIG9uZSB2ZXJzaW9uIG9mIFVNQSBsaWJyYXJ5IHRvIGFub3RoZXIgdXNpbmcgdGhlIHByb3ZpZGVkIEVjb3JlMlhNTAotICogbWFwcGluZyBmaWxlcyBhbmQgVU1BMlVNQVJlc291cmNlSGFuZGxlci4gVGhlIEVjb3JlMlhNTCBtYXBwaW5nIGZpbGVzCi0gKiBzcGVjaWZpZXMgdGhlIG5hbWUgY2hhbmdlcyBvZiBjbGFzc2VzL2F0dHJpYnV0ZXMgd2hpbGUgVU1BMlVNQVJlc291cmNlSGFuZGxlcgotICogaGFuZGxlcyB0aGUgZGF0YSBtb3ZpbmcuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTlNfVVJJcyA9IHsgTWlncmF0b3IuT0xEX1VNQV9OU19VUkksCi0JCQlNaWdyYXRvci5PTERfVU1BX05TX1VSSSwgTWlncmF0b3IuVU1BX05TX1VSSSB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJW10gRUNPUkUyWE1MX1VSSXMgPSB7Ci0JCQlVUkkKLQkJCQkJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3BsdWdpbi9jb20uaWJtLnJwbS5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWEuZWNvcmUyeG1sIikgLy8kTk9OLU5MUy0xJAotCQkJLAotCQkJVVJJCi0JCQkJCS5jcmVhdGVVUkkoInBsYXRmb3JtOi9wbHVnaW4vY29tLmlibS5ycG0ubGlicmFyeS5wZXJzaXN0ZW5jZS9taWdyYXRpb24vdW1hMi5lY29yZTJ4bWwiKSAvLyROT04tTkxTLTEkCi0JCQksCi0JCQlVUkkKLQkJCQkJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3BsdWdpbi9jb20uaWJtLnJwbS5saWJyYXJ5LnBlcnNpc3RlbmNlL21pZ3JhdGlvbi91bWEzLmVjb3JlMnhtbCIpIC8vJE5PTi1OTFMtMSQKLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX1VNQV9OU19VUkkgPSAiaHR0cDovLy9jb20vaWJtL3VtYS5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNQV9OU19VUkkgPSAiaHR0cDovL3d3dy5pYm0uY29tL3VtYS8xLjAuMi91bWEuZWNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4dGVuZGVkTWV0YURhdGFbXSBleHRlbmRlZE1ldGFEYXRhczsKLQotCXByaXZhdGUgVU1BMlVNQVJlc291cmNlSGFuZGxlcjAgcmVzb3VyY2VIYW5kbGVyOwotCi0JcHVibGljIEhhc2hNYXAgb2xkUGF0aFRvTmV3VVJJTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBDb2xsZWN0aW9uIGFueVR5cGVGZWF0dXJlVmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5kZWRNZXRhRGF0YSBnZXRFeHRlbmRlZE1ldGFEYXRhKFN0cmluZyBvbGROc1VSSSwKLQkJCVVSSSBlY29yZTJYTUxVUkkpIHsKLQkJRVBhY2thZ2UuUmVnaXN0cnkgZVBhY2thZ2VSZWdpc3RyeSA9IG5ldyBFUGFja2FnZVJlZ2lzdHJ5SW1wbCgKLQkJCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSk7Ci0JCWVQYWNrYWdlUmVnaXN0cnkucHV0KG9sZE5zVVJJLCBVbWFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJRWNvcmUyWE1MUmVnaXN0cnkgZWNvcmUyeG1sUmVnaXN0cnkgPSBuZXcgRWNvcmUyWE1MUmVnaXN0cnlJbXBsKAotCQkJCUVjb3JlMlhNTFJlZ2lzdHJ5LklOU1RBTkNFKTsKLQotCQllY29yZTJ4bWxSZWdpc3RyeQotCQkJCS5wdXQob2xkTnNVUkksIEVjb3JlVXRpbC5nZXRPYmplY3RCeVR5cGUobmV3IFJlc291cmNlU2V0SW1wbCgpCi0JCQkJCQkuZ2V0UmVzb3VyY2UoZWNvcmUyWE1MVVJJLCB0cnVlKS5nZXRDb250ZW50cygpLAotCQkJCQkJRWNvcmUyWE1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WE1MTWFwKCkpKTsKLQotCQlyZXR1cm4gbmV3IEVjb3JlMlhNTEV4dGVuZGVkTWV0YURhdGEoZVBhY2thZ2VSZWdpc3RyeSwKLQkJCQllY29yZTJ4bWxSZWdpc3RyeSkgewotCQkJcHVibGljIEVDbGFzc2lmaWVyIGdldFR5cGUoRVBhY2thZ2UgZVBhY2thZ2UsIFN0cmluZyBuYW1lKSB7Ci0JCQkJRUNsYXNzaWZpZXIgdHlwZSA9IHN1cGVyLmdldFR5cGUoZVBhY2thZ2UsIG5hbWUpOwotCi0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQkvLyB0cnkgdG8gZ2V0IHR5cGUgZnJvbSB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lCi0JCQkJCS8vCi0JCQkJCUxpc3QgZUNsYXNzaWZpZXJzID0gZVBhY2thZ2UuZ2V0RUNsYXNzaWZpZXJzKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwLCBzaXplID0gZUNsYXNzaWZpZXJzLnNpemUoKTsgaSA8IHNpemU7ICsraSkgewotCQkJCQkJRUNsYXNzaWZpZXIgZUNsYXNzaWZpZXIgPSAoRUNsYXNzaWZpZXIpIGVDbGFzc2lmaWVycwotCQkJCQkJCQkuZ2V0KGkpOwotCQkJCQkJaWYgKG5hbWUuZXF1YWxzKGVDbGFzc2lmaWVyLmdldE5hbWUoKSkpIHsKLQkJCQkJCQlyZXR1cm4gZUNsYXNzaWZpZXI7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQotCQkJCXJldHVybiB0eXBlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBNaWdyYXRvcigpIHsKLQkJdGhpcyhOU19VUklzLCBFQ09SRTJYTUxfVVJJcyk7Ci0JfQotCi0JcHVibGljIE1pZ3JhdG9yKFN0cmluZ1tdIG5zVVJJcywgVVJJW10gZWNvcmUyWE1MVVJJcykgewotCQlpbnQgc2l6ZSA9IGVjb3JlMlhNTFVSSXMubGVuZ3RoOwotCQlleHRlbmRlZE1ldGFEYXRhcyA9IG5ldyBFeHRlbmRlZE1ldGFEYXRhW3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVjb3JlMlhNTFVSSXMubGVuZ3RoOyBpKyspIHsKLQkJCWV4dGVuZGVkTWV0YURhdGFzW2ldID0gZ2V0RXh0ZW5kZWRNZXRhRGF0YShuc1VSSXNbaV0sCi0JCQkJCWVjb3JlMlhNTFVSSXNbaV0pOwotCQl9Ci0JCXRoaXMucmVzb3VyY2VIYW5kbGVyID0gbmV3IFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIwKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUobXNnKTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQW55VHlwZUZlYXR1cmVWYWx1ZSB7Ci0JCVN0cmluZyBvd25lcklkOwotCi0JCUVPYmplY3Qgb3duZXI7Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0KLQkJU3RyaW5nIHZhbHVlSWQ7Ci0KLQkJQW55VHlwZSB2YWx1ZTsKLQotCQlpbnQgaW5kZXg7Ci0JfQotCi0JY2xhc3MgTWlncmF0b3JVUklDb252ZXJ0ZXIgZXh0ZW5kcyBNdWx0aUZpbGVVUklDb252ZXJ0ZXIgewotCQlwcml2YXRlIFJlc291cmNlTWFuYWdlciBvbGRSZXNNZ3I7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCQkgKi8KLQkJcHVibGljIE1pZ3JhdG9yVVJJQ29udmVydGVyKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCkgewotCQkJc3VwZXIocmVzb3VyY2VTZXQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXIjbm9ybWFsaXplKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCi0JCSAqLwotCQlwdWJsaWMgVVJJIG5vcm1hbGl6ZShVUkkgdXJpKSB7Ci0JCQlVUkkgbm9ybWFsaXplZCA9IHN1cGVyLm5vcm1hbGl6ZSh1cmkpOwotCQkJaWYgKG5vcm1hbGl6ZWQgPT0gbnVsbCAmJiBTQ0hFTUUuZXF1YWxzSWdub3JlQ2FzZSh1cmkuc2NoZW1lKCkpKSB7Ci0JCQkJaWYgKG9sZFJlc01nciAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBpZCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJCQkJbm9ybWFsaXplZCA9IGdldFVSSUZyb21PbGRSZXNvdXJjZU1hbmFnZXIoaWQpOwotCQkJCQlpZiAobm9ybWFsaXplZCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAodXJpLmhhc0ZyYWdtZW50KCkpIHsKLQkJCQkJCQlub3JtYWxpemVkID0gbm9ybWFsaXplZC5hcHBlbmRGcmFnbWVudCh1cmkKLQkJCQkJCQkJCS5mcmFnbWVudCgpKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuYXBwZW5kRnJhZ21lbnQoaWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQlyZXR1cm4gbm9ybWFsaXplZDsKLQkJfQotCi0JCXB1YmxpYyBVUkkgZ2V0VVJJRnJvbU9sZFJlc291cmNlTWFuYWdlcihTdHJpbmcgaWQpIHsKLQkJCWlmIChvbGRSZXNNZ3IgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gb2xkUmVzTWdyLmdldFJlc291cmNlRGVzY3JpcHRvcihpZCk7Ci0JCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQkJVVJJIG5vcm1hbGl6ZWQgPSBkZXNjLmdldFJlc29sdmVkVVJJKCk7Ci0JCQkJVVJJIG5ld1VSSSA9IChVUkkpIG9sZFBhdGhUb05ld1VSSU1hcC5nZXQobm9ybWFsaXplZAotCQkJCQkJLnRvRmlsZVN0cmluZygpKTsKLQkJCQlpZiAobmV3VVJJICE9IG51bGwpIHsKLQkJCQkJbm9ybWFsaXplZCA9IG5ld1VSSTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5vcm1hbGl6ZWQ7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlVVJJQ29udmVydGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWlmIChvbGRSZXNNZ3IgIT0gbnVsbCkgewotCQkJCW9sZFJlc01nci5kaXNwb3NlKCk7Ci0JCQkJb2xkUmVzTWdyID0gbnVsbDsKLQkJCX0KLQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSByZXNNZ3IyCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRPbGRSZXNvdXJjZU1hbmFnZXIoUmVzb3VyY2VNYW5hZ2VyIHJlc01ncikgewotCQkJb2xkUmVzTWdyID0gcmVzTWdyOwotCQl9Ci0KLQkJcHVibGljIFJlc291cmNlTWFuYWdlciBnZXRPbGRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCQlyZXR1cm4gb2xkUmVzTWdyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVVUklDb252ZXJ0ZXIjc2V0VVJJTWFwcGluZyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwKLQkJICogICAgICBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLCBqYXZhLnV0aWwuU2V0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VVJJTWFwcGluZyhFT2JqZWN0IGUsIFVSSSB1cmksIFNldCBtb2RpZmllZFJlc291cmNlcykgewotCQkJLy8gY29kZSB0byBzdXBwb3J0IG1pZ3JhdGlvbiBmcm9tIG9sZGVyIHZlcnNpb24KLQkJCS8vCi0JCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlNaWdyYXRvclVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSAoTWlncmF0b3JVUklDb252ZXJ0ZXIpICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlCi0JCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0VVJJQ29udmVydGVyKCk7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIG9sZFJlc01nciA9IHVyaUNvbnZlcnRlcgotCQkJCQkJLmdldE9sZFJlc291cmNlTWFuYWdlcigpOwotCQkJCWlmIChvbGRSZXNNZ3IgIT0gbnVsbCkgewotCQkJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IG9sZFJlc01ncgotCQkJCQkJCS5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKChNZXRob2RFbGVtZW50KSBlKQotCQkJCQkJCQkJLmdldEd1aWQoKSk7Ci0JCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCW9sZFBhdGhUb05ld1VSSU1hcC5wdXQoZGVzYy5nZXRSZXNvbHZlZFVSSSgpCi0JCQkJCQkJCS50b0ZpbGVTdHJpbmcoKSwgdXJpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJc3VwZXIuc2V0VVJJTWFwcGluZyhlLCB1cmksIG1vZGlmaWVkUmVzb3VyY2VzKTsKLQkJfQotCX0KLQotCWNsYXNzIE1pZ3JhdG9yUmVzb3VyY2VTZXQgZXh0ZW5kcyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIGNvbS5pYm0udW1hLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbCNnZXRVUklDb252ZXJ0ZXIoKQotCQkgKi8KLQkJcHVibGljIFVSSUNvbnZlcnRlciBnZXRVUklDb252ZXJ0ZXIoKSB7Ci0JCQlpZiAodXJpQ29udmVydGVyID09IG51bGwpIHsKLQkJCQl1cmlDb252ZXJ0ZXIgPSBuZXcgTWlncmF0b3JVUklDb252ZXJ0ZXIodGhpcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gdXJpQ29udmVydGVyOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGxvYWRPbGRSZXNvdXJjZU1hbmFnZXIoU3RyaW5nIGxpYlBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvLyB0cnlpbmcgdG8gbG9hZCB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvcnMgZmlsZQotCQkJLy8KLQkJCVN0cmluZyBsaWJEaXIgPSBuZXcgRmlsZShsaWJQYXRoKS5nZXRQYXJlbnQoKSArIEZpbGUuc2VwYXJhdG9yOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobGliRGlyLCBSRVNNR1JfWE1JKTsKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBudWxsOwotCQkJTXVsdGlGaWxlVVJJQ29udmVydGVyIG11bHRpRmlsZVVSSUNvbnZlcnRlciA9IChNdWx0aUZpbGVVUklDb252ZXJ0ZXIpIGdldFVSSUNvbnZlcnRlcigpOwotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlSZXNvdXJjZSByZXNNZ3JSZXMgPSBuZXcgWE1JUmVzb3VyY2VJbXBsKFVSSS5jcmVhdGVGaWxlVVJJKGZpbGUKLQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSkpOyAvLyBzdXBlci5nZXRSZXNvdXJjZShVUkkuY3JlYXRlRmlsZVVSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKSwKLQkJCQkvLyB0cnVlKTsKLQkJCQlyZXNNZ3JSZXMubG9hZChudWxsKTsKLQkJCQlpZiAoIXJlc01nclJlcy5nZXRDb250ZW50cygpLmlzRW1wdHkoKSkgewotCQkJCQlPYmplY3Qgb2JqID0gcmVzTWdyUmVzLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgUmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCQkJCQlyZXNNZ3IgPSAoUmVzb3VyY2VNYW5hZ2VyKSBvYmo7Ci0JCQkJCQkvLyByZXNNZ3IucmVzb2x2ZSgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkucHJpbnRsbigiSW52YWxpZCBSZXNvdXJjZU1hbmFnZXIgZmlsZTogIiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkoKE1pZ3JhdG9yVVJJQ29udmVydGVyKSBtdWx0aUZpbGVVUklDb252ZXJ0ZXIpCi0JCQkJCS5zZXRPbGRSZXNvdXJjZU1hbmFnZXIocmVzTWdyKTsKLQkJfQotCi0JCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGxvYWRMaWJyYXJ5KFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCWxvYWRPbGRSZXNvdXJjZU1hbmFnZXIocGF0aCk7Ci0KLQkJCXJldHVybiBsb2FkTGlicmFyeVdpdGhvdXRSZXNldChwYXRoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgY29tLmlibS51bWEucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsI2ZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHJvdGVjdGVkIEVPYmplY3QgZmluZEVPYmplY3RJblVubG9hZGVkUmVzb3VyY2VzKFN0cmluZyBpZCkgewotCQkJT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQlpZiAoZ2V0UmVzb3VyY2VNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCW9iamVjdCA9IHN1cGVyLmZpbmRFT2JqZWN0SW5VbmxvYWRlZFJlc291cmNlcyhpZCk7Ci0JCQl9Ci0JCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCQlVUkkgdXJpID0gKChNaWdyYXRvclVSSUNvbnZlcnRlcikgZ2V0VVJJQ29udmVydGVyKCkpCi0JCQkJCQkuZ2V0VVJJRnJvbU9sZFJlc291cmNlTWFuYWdlcihpZCk7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBzdXBlci5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCXJldHVybiByZXNvdXJjZS5nZXRFT2JqZWN0KGlkKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwjZ2V0RU9iamVjdChvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KFVSSSB1cmksIGJvb2xlYW4gbG9hZE9uRGVtYW5kKSB7Ci0JCQkvLyBFT2JqZWN0IGVPYmogPSBzdXBlckdldEVPYmplY3QodXJpLCBsb2FkT25EZW1hbmQpOwotCQkJRU9iamVjdCBlT2JqID0gc3VwZXIuZ2V0RU9iamVjdCh1cmksIGxvYWRPbkRlbWFuZCk7Ci0JCQlpZiAoZU9iaiA9PSBudWxsCi0JCQkJCSYmIE1pZ3JhdG9yVVJJQ29udmVydGVyLlNDSEVNRS5lcXVhbHNJZ25vcmVDYXNlKHVyaQotCQkJCQkJCS5zY2hlbWUoKSkgJiYgIXVyaS5oYXNGcmFnbWVudCgpKSB7Ci0JCQkJZU9iaiA9IHN1cGVyLmdldEVPYmplY3QodXJpLmF1dGhvcml0eSgpKTsKLQkJCX0KLQkJCS8vIGlmKHVyaS5hdXRob3JpdHkoKS5lcXVhbHMoInsxMUI2MEE0Qi1BMEM3LTRENUMtODkxQS0zNDZFODY1MkE0RUJ9IikpCi0JCQkvLyB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1pZ3JhdG9yUmVzb3VyY2VTZXQuZ2V0RU9iamVjdCgpOiBlT2JqID0gIiArCi0JCQkvLyBlT2JqKTsKLQkJCS8vIH0KLQkJCWlmIChlT2JqID09IG51bGwgfHwgZU9iai5lSXNQcm94eSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0JCQkJCQkiQ291bGQgbm90IGxvYWQgb2JqZWN0IHdpdGggVVJJICciICsgdXJpICsgIicgKG5vcm1hbGl6ZWQgVVJJOiAnIiArIGdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh1cmkpICsgIicpLlxuUGxlYXNlIHNlZSBsb2cgZmlsZSBmb3IgbW9yZSBkZXRhaWxzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJcmV0dXJuIGVPYmo7Ci0JCX0KLQotCQlwdWJsaWMgRU9iamVjdCBzdXBlckdldEVPYmplY3QoVVJJIHVyaSwgYm9vbGVhbiBsb2FkT25EZW1hbmQpIHsKLQkJCXRyeSB7Ci0JCQkJVVJJIG5vcm1hbGl6ZWQgPSBnZXRVUklDb252ZXJ0ZXIoKS5ub3JtYWxpemUodXJpKTsKLQkJCQlpZiAobm9ybWFsaXplZCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShub3JtYWxpemVkLnRyaW1GcmFnbWVudCgpLCBsb2FkT25EZW1hbmQpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBmcmFnbWVudCA9IG5vcm1hbGl6ZWQuZnJhZ21lbnQoKTsKLQkJCQkJaWYgKGZyYWdtZW50ID09IG51bGwgfHwgZnJhZ21lbnQubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIHJlc291cmNlLmdldEVPYmplY3QoZnJhZ21lbnQpOwotCQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBjb20uaWJtLnVtYS5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGwjY3JlYXRlUmVzb3VyY2Uob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSkKLQkJICovCi0JCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCQlSZXNvdXJjZSByZXN1bHQgPSBuZXcgTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsKHVyaSkgewotCQkJCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IE11bHRpRmlsZVhNSUhlbHBlckltcGwodGhpcykgewotCQkJCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoRU9iamVjdCBvYmplY3QsCi0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsCi0JCQkJCQkJCWludCBwb3NpdGlvbikgewotCQkJCQkJCWJvb2xlYW4gb2xkID0gbG9nRXJyb3I7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJbG9nRXJyb3IgPSBmYWxzZTsKLQkJCQkJCQkJc3VwZXIKLQkJCQkJCQkJCQkuc2V0VmFsdWUob2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQkJCQkJCXBvc2l0aW9uKTsKLQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQW55VHlwZQotCQkJCQkJCQkJCSYmIG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQkJLy8gJiYgb2JqZWN0IGluc3RhbmNlb2YgV29ya0JyZWFrZG93bkVsZW1lbnQKLQkJCQkJCQkJLy8gJiYgZmVhdHVyZSA9PQotCQkJCQkJCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpCi0JCQkJCQkJCSkgewotCQkJCQkJCQkJQW55VHlwZUZlYXR1cmVWYWx1ZSBmdmFsdWUgPSBuZXcgQW55VHlwZUZlYXR1cmVWYWx1ZSgpOwotCQkJCQkJCQkJLy8gZnZhbHVlLm93bmVyID0gb2JqZWN0OwotCQkJCQkJCQkJZnZhbHVlLm93bmVySWQgPSAoKE1ldGhvZEVsZW1lbnQpIG9iamVjdCkKLQkJCQkJCQkJCQkJLmdldEd1aWQoKTsKLQkJCQkJCQkJCWZ2YWx1ZS5mZWF0dXJlID0gZmVhdHVyZTsKLQkJCQkJCQkJCS8vIGZ2YWx1ZS52YWx1ZSA9IChBbnlUeXBlKSB2YWx1ZTsKLQkJCQkJCQkJCWZ2YWx1ZS52YWx1ZUlkID0gKFN0cmluZykgVU1BMlVNQVJlc291cmNlSGFuZGxlcgotCQkJCQkJCQkJCQkuZ2V0U2luZ2xlVmFsdWUoKChBbnlUeXBlKSB2YWx1ZSkKLQkJCQkJCQkJCQkJCQkuZ2V0QW55QXR0cmlidXRlKCksICJndWlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWZ2YWx1ZS5pbmRleCA9IHBvc2l0aW9uOwotCQkJCQkJCQkJYW55VHlwZUZlYXR1cmVWYWx1ZXMuYWRkKGZ2YWx1ZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQl0aHJvdyBlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQkJbG9nRXJyb3IgPSBvbGQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgTGlzdCBzZXRNYW55UmVmZXJlbmNlKAotCQkJCQkJCQlvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTEhlbHBlci5NYW55UmVmZXJlbmNlIHJlZmVyZW5jZSwKLQkJCQkJCQkJU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCQkJCQkJTGlzdCBleGNlcHRpb25zID0gc3VwZXIuc2V0TWFueVJlZmVyZW5jZShyZWZlcmVuY2UsCi0JCQkJCQkJCQlsb2NhdGlvbik7Ci0JCQkJCQkJaWYgKGV4Y2VwdGlvbnMgPT0gbnVsbCkKLQkJCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXhjZXB0aW9ucy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJCQlPYmplY3QgZXggPSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJaWYgKGV4IGluc3RhbmNlb2YgSWxsZWdhbFZhbHVlRXhjZXB0aW9uKSB7Ci0JCQkJCQkJCQlJbGxlZ2FsVmFsdWVFeGNlcHRpb24gaXZlID0gKElsbGVnYWxWYWx1ZUV4Y2VwdGlvbikgZXg7Ci0JCQkJCQkJCQlpZiAoaXZlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBBbnlUeXBlCi0JCQkJCQkJCQkJCSYmIGl2ZS5nZXRPYmplY3QoKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJCQkJCQlBbnlUeXBlRmVhdHVyZVZhbHVlIGZ2YWx1ZSA9IG5ldyBBbnlUeXBlRmVhdHVyZVZhbHVlKCk7Ci0JCQkJCQkJCQkJZnZhbHVlLm93bmVySWQgPSAoKE1ldGhvZEVsZW1lbnQpIGl2ZQotCQkJCQkJCQkJCQkJLmdldE9iamVjdCgpKS5nZXRHdWlkKCk7Ci0JCQkJCQkJCQkJZnZhbHVlLmZlYXR1cmUgPSBpdmUuZ2V0RmVhdHVyZSgpOwotCQkJCQkJCQkJCWZ2YWx1ZS52YWx1ZUlkID0gKFN0cmluZykgVU1BMlVNQVJlc291cmNlSGFuZGxlcgotCQkJCQkJCQkJCQkJLmdldFNpbmdsZVZhbHVlKCgoQW55VHlwZSkgaXZlCi0JCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKQotCQkJCQkJCQkJCQkJCQkuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCQkJCQkJCQkJCSJndWlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlmdmFsdWUuaW5kZXggPSAtMTsKLQkJCQkJCQkJCQlhbnlUeXBlRmVhdHVyZVZhbHVlcy5hZGQoZnZhbHVlKTsKLQkJCQkJCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIGV4Y2VwdGlvbnM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJfTsKLQkJCXJlc3VsdC5zZXRUcmFja2luZ01vZGlmaWNhdGlvbih0cnVlKTsKLQkJCWdldFJlc291cmNlcygpLmFkZChyZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlTZXQgY2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWNsYXNzTmFtZXMuYWRkKCJUZWNobmlxdWUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IG5ldyBNaWdyYXRvclJlc291cmNlU2V0KCk7Ci0JCS8vIFJlc291cmNlTWFuYWdlciBvbGRSZXNNZ3IgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuZGVkTWV0YURhdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlpZiAoaSA8IDIpIHsKLQkJCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJCVhNTFJlc291cmNlLk9QVElPTl9SRVNPVVJDRV9IQU5ETEVSLCByZXNvdXJjZUhhbmRsZXIpOwotCQkJfQotCQkJcmVzb3VyY2VTZXQuZ2V0TG9hZE9wdGlvbnMoKQotCQkJCQkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsCi0JCQkJCQkJZXh0ZW5kZWRNZXRhRGF0YXNbaV0pOwotCi0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJcmVzb3VyY2VIYW5kbGVyLnNhdmVQcmVzZW50YXRpb25VUklGb3IoY2xhc3NOYW1lcyk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlSGFuZGxlci5zYXZlUHJlc2VudGF0aW9uVVJJRm9yKG51bGwpOwotCQkJfQotCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCi0JCQkvLyBpZihvbGRSZXNNZ3IgIT0gbnVsbCkgewotCQkJLy8gKChNaWdyYXRvclVSSUNvbnZlcnRlcilyZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKSkuc2V0T2xkUmVzb3VyY2VNYW5hZ2VyKG9sZFJlc01ncik7Ci0JCQkvLyByZXNvdXJjZVNldC5sb2FkTGlicmFyeVdpdGhvdXRSZXNldChsaWJQYXRoKTsKLQkJCS8vIH0KLQkJCS8vIGVsc2UgewotCQkJcmVzb3VyY2VTZXQubG9hZExpYnJhcnkobGliUGF0aCk7Ci0JCQkvLyB9Ci0KLQkJCU1ldGhvZExpYnJhcnkgbGliID0gcmVzb3VyY2VTZXQuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJaWYgKGxpYiA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJLy8gbG9hZCBhbGwgdGhlIHJlc291cmNlcyBpbiBtZW1vcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZFJlc291cmNlc1Rhc2tfbmFtZSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgR3VpZGVsaW5lICYmIGkgPiAwKSB7Ci0JCQkJCS8vIGhhY2sgdG8gcmVzdG9yZSB0aGUgcmlnaHQgcHJlc2VudGF0aW9uIGZvciBvbGQgVGVjaG5pcXVlCi0JCQkJCS8vCi0JCQkJCUd1aWRlbGluZSBndWlkZWxpbmUgPSAoR3VpZGVsaW5lKSBlbGVtZW50OwotCQkJCQlVUkkgdXJpID0gcmVzb3VyY2VIYW5kbGVyLmdldFByZXNlbnRhdGlvblVSSShndWlkZWxpbmUKLQkJCQkJCQkuZ2V0R3VpZCgpKTsKLQkJCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCQlDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uID0gKENvbnRlbnREZXNjcmlwdGlvbikgcmVzb3VyY2VTZXQKLQkJCQkJCQkJLmdldEVPYmplY3QodXJpLCB0cnVlKTsKLQkJCQkJCWd1aWRlbGluZS5zZXRQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCQlTeXN0ZW0uZXJyCi0JCQkJCQkJCS5wcmludGxuKCJFcnJvciBpdGVyYXRlIHRocnUgY3Jvc3MgcmVmZXJlbmNlcyBvZiBlbGVtZW50OiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGkgPT0gMCkgewotCQkJCS8vIG9sZFJlc01nciA9Ci0JCQkJLy8gKChNaWdyYXRvclVSSUNvbnZlcnRlcilyZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKSkuZ2V0T2xkUmVzb3VyY2VNYW5hZ2VyKCk7Ci0KLQkJCQltaWdyYXRlUHJvY2Vzc0NvbnRlbnREZXNjcmlwdGlvbnMobW9uaXRvciwgbGliKTsKLQotCQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5tb3ZlRGF0YVRhc2tfbmFtZSk7Ci0KLQkJCX0KLQotCQkJaWYgKGkgPCAyKSB7Ci0JCQkJcmVzb3VyY2VIYW5kbGVyLm1vdmVEYXRhKCk7Ci0JCQkJcmVzb3VyY2VIYW5kbGVyLmNsZWFyTW92ZUluZm9zKCk7Ci0JCQl9Ci0KLQkJCWlmIChpID09IGV4dGVuZGVkTWV0YURhdGFzLmxlbmd0aCAtIDEpIHsKLQkJCQltaWdyYXRlUHJvY2Vzc2VzKG1vbml0b3IsIGxpYik7Ci0KLQkJCQlyZXN0b3JlUmVmZXJlbmNlcyhyZXNvdXJjZVNldCk7Ci0KLQkJCX0KLQotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQotCQkJcmVzb3VyY2VTZXQuc2F2ZShudWxsLCB0cnVlKTsKLQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0KLQkJfQotCi0JCS8vIGRlbGV0ZSBvbGQgcmVzbWdyLnhtaQotCQkvLwotCQl0cnkgewotCQkJRmlsZSByZXNNZ3JGaWxlID0gbmV3IEZpbGUobmV3IEZpbGUobGliUGF0aCkuZ2V0UGFyZW50RmlsZSgpLAotCQkJCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVTTUdSX1hNSSk7Ci0JCQlpZiAocmVzTWdyRmlsZS5leGlzdHMoKSkgewotCQkJCXJlc01nckZpbGUuZGVsZXRlKCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzdG9yZVJlZmVyZW5jZXMoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFueVR5cGVGZWF0dXJlVmFsdWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQW55VHlwZUZlYXR1cmVWYWx1ZSBlbGVtZW50ID0gKEFueVR5cGVGZWF0dXJlVmFsdWUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQub3duZXJJZCAhPSBudWxsICYmIGVsZW1lbnQudmFsdWVJZCAhPSBudWxsKSB7Ci0JCQkJRU9iamVjdCBvd25lciA9IHJlc291cmNlU2V0LmdldEVPYmplY3QoZWxlbWVudC5vd25lcklkKTsKLQkJCQlPYmplY3QgdmFsdWUgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KGVsZW1lbnQudmFsdWVJZCk7Ci0JCQkJVU1BMlVNQVJlc291cmNlSGFuZGxlci5zZXRWYWx1ZShvd25lciwgZWxlbWVudC5mZWF0dXJlLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJYW55VHlwZUZlYXR1cmVWYWx1ZXMuY2xlYXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1pZ3JhdGVQcm9jZXNzZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWUpOwotCi0JCVN0cmluZ1tdW10gcHJvY1BrZ1BhdGhzID0gTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLlBST0NFU1NfUEFDS0FHRV9QQVRIUzsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUFycmF5TGlzdCBwcm9jUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvY1BrZ1BhdGhzLmxlbmd0aDsgaisrKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKHBsdWdpbiwKLQkJCQkJCXByb2NQa2dQYXRoc1tqXSk7Ci0JCQkJaWYgKHBrZyAhPSBudWxsKSB7Ci0JCQkJCXByb2NQa2dzLmFkZChwa2cpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9jUGtncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGtnID0gKFByb2Nlc3NQYWNrYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMQotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBjaGlsZFBrZyA9IChFT2JqZWN0KSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQlpZiAoY2hpbGRQa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvYyA9ICgoUHJvY2Vzc0NvbXBvbmVudCkgY2hpbGRQa2cpCi0JCQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJZml4UHJlc2VudGF0aW9uTmFtZShwcm9jKTsKLQkJCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJdGhyb3cgZTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBtc2cgPSBNaWdyYXRvci5jbGFzcy5nZXROYW1lKCkKLQkJCQkJCQkJCSsgIjogaW52YWxpZCBQcm9jZXNzQ29tcG9uZW50ICh3aXRoIG5vIFByb2Nlc3MpOiAiICsgY2hpbGRQa2cgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXG4gIFByb2Nlc3NDb21wb25lbnQncyByZXNvdXJjZSBVUkk6ICIgKyAoY2hpbGRQa2cuZVJlc291cmNlKCkgIT0gbnVsbCA/IGNoaWxkUGtnLmVSZXNvdXJjZSgpLmdldFVSSSgpIDogbnVsbCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXG4gIFBhcmVudCBwYWNrYWdlOiAiICsgcGtnIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlxuICBQYXJlbnQgcGFja2FnZSdzIHJlc291cmNlIFVSSTogIiArIChwa2cuZVJlc291cmNlKCkgIT0gbnVsbCA/IHBrZy5lUmVzb3VyY2UoKS5nZXRVUkkoKSA6IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQk7Ci0JCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhtc2cpOwotCQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihtc2cpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBtaWdyYXRlUHJvY2Vzc0NvbnRlbnREZXNjcmlwdGlvbnMoCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXVwZGF0ZVN0YXR1cyhtb25pdG9yLAotCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLm1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb25zVGFza19uYW1lKTsKLQotCQlTdHJpbmdbXVtdIHByb2NQa2dQYXRocyA9IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbC5QUk9DRVNTX1BBQ0tBR0VfUEFUSFM7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlBcnJheUxpc3QgcHJvY1BrZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHByb2NQa2dQYXRocy5sZW5ndGg7IGorKykgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShwbHVnaW4sCi0JCQkJCQlwcm9jUGtnUGF0aHNbal0pOwotCQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCQlwcm9jUGtncy5hZGQocGtnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvY1BrZ3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IxID0gcGtnLmdldENoaWxkUGFja2FnZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcjEKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBjaGlsZFBrZyA9IChPYmplY3QpIGl0ZXJhdG9yMS5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZFBrZyBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBjaGlsZFBrZykKLQkJCQkJCQkJLmdldFByb2Nlc3MoKTsKLQkJCQkJCW1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb24ocHJvYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG1pZ3JhdGVDb250ZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihlKSkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSBlLmdldFByZXNlbnRhdGlvbigpOwotCQkJRUNsYXNzIGVDbHMgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25FQ2xhc3MoZSk7Ci0JCQlpZiAoZUNscyAhPSBjb250ZW50KSB7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIG5ld0NvbnRlbnQgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0JCQkJCQkuY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKGUpOwotCQkJCW5ld0NvbnRlbnQuc2V0TWFpbkRlc2NyaXB0aW9uKGNvbnRlbnQuZ2V0TWFpbkRlc2NyaXB0aW9uKCkpOwotCQkJCW5ld0NvbnRlbnQuc2V0S2V5Q29uc2lkZXJhdGlvbnMoY29udGVudC5nZXRLZXlDb25zaWRlcmF0aW9ucygpKTsKLQkJCQluZXdDb250ZW50LmdldFNlY3Rpb25zKCkuYWRkQWxsKGNvbnRlbnQuZ2V0U2VjdGlvbnMoKSk7Ci0JCQkJZS5zZXRQcmVzZW50YXRpb24obmV3Q29udGVudCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChBY3Rpdml0eSkgZSkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJbWlncmF0ZUNvbnRlbnREZXNjcmlwdGlvbigoQnJlYWtkb3duRWxlbWVudCkgaXRlci5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaXhQcmVzZW50YXRpb25OYW1lKEJyZWFrZG93bkVsZW1lbnQgZSkgewotCQlpZiAoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gbnVsbAotCQkJCXx8IGUuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllLnNldFByZXNlbnRhdGlvbk5hbWUoZS5nZXROYW1lKCkpOwotCQl9Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQWN0aXZpdHkpIGUpLmdldEJyZWFrZG93bkVsZW1lbnRzKCkKLQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWZpeFByZXNlbnRhdGlvbk5hbWUoKEJyZWFrZG93bkVsZW1lbnQpIGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvVU1BMlVNQVJlc291cmNlSGFuZGxlcjAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL1VNQTJVTUFSZXNvdXJjZUhhbmRsZXIwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjMxNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvVU1BMlVNQVJlc291cmNlSGFuZGxlcjAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkFueVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyMCBleHRlbmRzIFVNQTJVTUFSZXNvdXJjZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBTZXQgcHJvY01vdmVkRmVhdHVyZU5hbWVzOwotCi0JcHJpdmF0ZSBNYXAgZ3VpZFRvUHJlc2VudGF0aW9uTWFwOwotCi0JcHJpdmF0ZSBTZXQgY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSTsKLQotCXB1YmxpYyBVTUEyVU1BUmVzb3VyY2VIYW5kbGVyMCgpIHsKLQkJc3VwZXIoKTsKLQotCQlndWlkVG9QcmVzZW50YXRpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByb2NNb3ZlZEZlYXR1cmVOYW1lcyA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKLQkJCQkicHVycG9zZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgImtleUNvbnNpZGVyYXRpb25zIiAvLyROT04tTkxTLTEkCi0JCQkJLCAiYWx0ZXJuYXRpdmVzIiAvLyROT04tTkxTLTEkCi0JCQkJLCAiaG93dG9TdGFmZiIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInVzYWdlR3VpZGFuY2UiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJleHRlcm5hbElkIiAvLyROT04tTkxTLTEkCi0JCQkJLCAic2NvcGUiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJ1c2FnZU5vdGVzIiAvLyROT04tTkxTLTEkCi0JCQkJLCAic2NhbGUiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiAvLyROT04tTkxTLTEkCi0JCQkJLCAicmlza0xldmVsIiAvLyROT04tTkxTLTEkCi0JCQkJLCAiZXN0aW1hdGluZ1RlY2huaXF1ZSIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInByb2plY3RNZW1iZXJFeHBlcnRpc2UiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJ0eXBlT2ZDb250cmFjdCIgLy8kTk9OLU5MUy0xJAotCQkJCSwgInRlY2huaXF1ZXMiIC8vJE5PTi1OTFMtMSQKLQkJCQksICJtYWluRGVzY3JpcHRpb24iIC8vJE5PTi1OTFMtMSQKLQkJfSkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VTUEyVU1BUmVzb3VyY2VIYW5kbGVyI2dldE5ld0ZlYXR1cmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0TmV3RmVhdHVyZShFT2JqZWN0IG93bmVyLCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKLQkJaWYgKCJwcmVzZW50YXRpb25OYW1lIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG93bmVyIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJaWYgKHByb2NNb3ZlZEZlYXR1cmVOYW1lcy5jb250YWlucyhmZWF0dXJlTmFtZSkpIHsKLQkJCWlmIChvd25lciBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoKFByb2Nlc3NFbGVtZW50KSBvd25lcikKLQkJCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IGdldEVBdHRyaWJ1dGUoY29udGVudC5lQ2xhc3MoKSwgZmVhdHVyZU5hbWUpOwotCQkJCWlmIChhdHRyaWIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gYXR0cmliOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIldvcmtPcmRlciIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvd25lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKTsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXROZXdGZWF0dXJlKG93bmVyLCBmZWF0dXJlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXIjZ2V0TmV3T3duZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBFT2JqZWN0IGdldE5ld093bmVyKEVPYmplY3Qgb2xkT3duZXIsIFN0cmluZyBmZWF0dXJlTmFtZSkgewotCQlpZiAoInByZXNlbnRhdGlvbk5hbWUiLmVxdWFscyhmZWF0dXJlTmFtZSkgJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsgLy8kTk9OLU5MUy0xJAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIG9sZE93bmVyLmVDb250YWluZXIoKSk7Ci0JCQlpZiAoZGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIGRlOwotCQl9Ci0JCWlmIChwcm9jTW92ZWRGZWF0dXJlTmFtZXMuY29udGFpbnMoZmVhdHVyZU5hbWUpCi0JCQkJJiYgb2xkT3duZXIgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VsZW1lbnQpIG9sZE93bmVyKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJfQotCQlpZiAoIldvcmtPcmRlciIuZXF1YWxzKGZlYXR1cmVOYW1lKSAmJiBvbGRPd25lciBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBvbGRPd25lcjsKLQkJfQotCi0JCXJldHVybiBzdXBlci5nZXROZXdPd25lcihvbGRPd25lciwgZmVhdHVyZU5hbWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVNQTJVTUFSZXNvdXJjZUhhbmRsZXIjZ2V0TmV3VmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5BbnlUeXBlKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZ2V0TmV3VmFsdWUoRU9iamVjdCBvbGRPd25lciwgU3RyaW5nIGZlYXR1cmVOYW1lLCBBbnlUeXBlIHZhbHVlKSB7Ci0JCWlmICgiV29ya09yZGVyIi5lcXVhbHMoZmVhdHVyZU5hbWUpICYmIG9sZE93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsgLy8kTk9OLU5MUy0xJAotCQkJV29ya09yZGVyIHdvcmtPcmRlciA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtPcmRlcigpOwotCQkJd29ya09yZGVyLnNldEd1aWQoKFN0cmluZykgZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0QW55QXR0cmlidXRlKCksCi0JCQkJCSJndWlkIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcHJlZEd1aWQgPSAoU3RyaW5nKSBnZXRTaW5nbGVWYWx1ZSh2YWx1ZS5nZXRBbnlBdHRyaWJ1dGUoKSwKLQkJCQkJInByZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByZWRHdWlkID09IG51bGwpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3Qgb2JqID0gKEludGVybmFsRU9iamVjdCkgZ2V0U2luZ2xlVmFsdWUodmFsdWUKLQkJCQkJCS5nZXRNaXhlZCgpLCAicHJlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJcHJlZEd1aWQgPSBvYmouZVByb3h5VVJJKCkuYXV0aG9yaXR5KCk7Ci0JCQl9Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBvbGRPd25lcgotCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpIHJlc291cmNlU2V0Ci0JCQkJCS5nZXRFT2JqZWN0KHByZWRHdWlkKTsKLQkJCXdvcmtPcmRlci5zZXRQcmVkKHByZWQpOwotCQkJd29ya09yZGVyLnNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSCk7Ci0JCQlyZXR1cm4gd29ya09yZGVyOwotCQl9Ci0JCXJldHVybiBnZXRUZXh0KHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlUHJlc2VudGF0aW9uVVJJRm9yKFNldCBjbGFzc05hbWVzKSB7Ci0JCWNsYXNzTmFtZXNUb1NhdmVQcmVzZW50YXRpb25VUkkgPSBjbGFzc05hbWVzOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0UHJlc2VudGF0aW9uVVJJKFN0cmluZyBndWlkKSB7Ci0JCXJldHVybiAoVVJJKSBndWlkVG9QcmVzZW50YXRpb25NYXAuZ2V0KGd1aWQpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1pZ3JhdGlvblJlc291cmNlSGFuZGxlciNoYW5kbGVVbmtub3duRGF0YShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVVbmtub3duRGF0YShFT2JqZWN0IGUsIEFueVR5cGUgdW5rbm93bkRhdGEpIHsKLQkJc3VwZXIuaGFuZGxlVW5rbm93bkRhdGEoZSwgdW5rbm93bkRhdGEpOwotCQkKLQkJaWYgKGNsYXNzTmFtZXNUb1NhdmVQcmVzZW50YXRpb25VUkkgIT0gbnVsbAotCQkJCSYmIGUgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0VmFsdWUodW5rbm93bkRhdGEuZ2V0TWl4ZWQoKSwgImNvbnRlbnRFbGVtZW50cyIpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeyAvLyROT04tTkxTLTEkCi0JCQkJQW55VHlwZSB2YWx1ZSA9IChBbnlUeXBlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbAotCQkJCQkJJiYgY2xhc3NOYW1lc1RvU2F2ZVByZXNlbnRhdGlvblVSSS5jb250YWlucyh2YWx1ZQotCQkJCQkJCQkuZUNsYXNzKCkuZ2V0TmFtZSgpKSkgewotCQkJCQlPYmplY3QgcHJlc2VudGF0aW9uID0gZ2V0U2luZ2xlVmFsdWUodmFsdWUuZ2V0TWl4ZWQoKSwKLQkJCQkJCQkicHJlc2VudGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHByZXNlbnRhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlPYmplY3QgZ3VpZCA9IGdldFNpbmdsZVZhbHVlKHZhbHVlLmdldEFueUF0dHJpYnV0ZSgpLAotCQkJCQkJCQkiZ3VpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbikuZVByb3h5VVJJKCk7Ci0JCQkJCQlndWlkVG9QcmVzZW50YXRpb25NYXAucHV0KGd1aWQsIHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9taWdyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNlMDFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1udGF0aW9uIGZvciB1cGdyYWRpbmcgYSBtZXRob2QgbGlicmFyeSB0byBhIG5ld2VyIFVNQSB2ZXJzaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvbWlncmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmMDZkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL21pZ3JhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgdXBncmFkaW5nIGEgbWV0aG9kIGxpYnJhcnkgdG8gYSBuZXdlciBVTUEgdmVyc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmIwN2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciBwZXJzaXN0aW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoRXZlbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNTZjOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBwcm92aWRlcyBkYXRhIGFib3V0IGEgcmVmcmVzaCBldmVudC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVmcmVzaEV2ZW50IHsKLQotCS8qKgotCSAqIEdldHMgcmVzb3VyY2VzIHRoYXQgaGFkIGJlZW4gcmVmcmVzaGVkLgotCSAqIAotCSAqIEByZXR1cm4gcmVmcmVzaGVkIHJlc291cmNlcwotCSAqLwotCUNvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlZnJlc2hlZFJlc291cmNlcygpOwotCQotCUNvbGxlY3Rpb248UmVzb3VyY2U+IGdldFVubG9hZGVkUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIG9iamVjdHMgdGhhdCBoYWQgYmVlbiB1bmxvYWRlZCBhbmQgYmVjb21lIHByb3hpZXMgYWZ0ZXIgcmVmcmVzaAotCSAqIAotCSAqIEByZXR1cm4gdW5sb2FkZWQgb2JqZWN0cwotCSAqLwotCUNvbGxlY3Rpb248RU9iamVjdD4gZ2V0VW5sb2FkZWRPYmplY3RzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIG9iamVjdHMgdGhhdCBoYWQgYmVlbiByZWZyZXNoZWQuCi0JICogCi0JICogQHJldHVybiByZWZyZXNoZWQgb2JqZWN0cwotCSAqLwotCUNvbGxlY3Rpb248RU9iamVjdD4gZ2V0UmVmcmVzaGVkT2JqZWN0cygpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoSGFuZGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDliYmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9JUmVmcmVzaEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB3aWxsIGJlIG5vdGlmeSBhYm91dCBjaGFuZ2VzIGluIHJlc291cmNlcyBzbyBpdCBjYW4KLSAqIHJlYWN0IGFjY29yZGluZ2x5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZnJlc2hIYW5kbGVyIHsKLQotCXZvaWQgcmVmcmVzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL0lSZWZyZXNoTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQxMzQxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvSVJlZnJlc2hMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLS8qKgotICogSW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgaWYgbGlzdGVuaW5nIHRvIHJlZnJlc2ggZXZlbnQsIHdpbGwgZ2V0IG5vdGlmaWVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWZyZXNoTGlzdGVuZXIgewotCi0Jdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9SZWZyZXNoSm9iLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvUmVmcmVzaEpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjliYmY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9SZWZyZXNoSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uQ29tbW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VbmlxdWVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5MaWJyYXJ5U2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogQmFja2dyb3VuZCBqb2IgdGhhdCBrZWVwcyBub3RpZnlpbmcgcmVmcmVzaCBoYW5kbGVycyBhYm91dCBjaGFuZ2VzIGluCi0gKiByZXNvdXJjZXMKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZnJlc2hKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ERUxBWSA9IDIwMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVR19QUkVGSVggPSAiRVBGIEF1dG8tcmVmcmVzaDoiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBhZGRlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdDxSZXNvdXJjZT4oKTsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVtb3ZlZFJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdDxSZXNvdXJjZT4oKTsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IG1vdmVkUmVzb3VyY2VzID0gbmV3IFVuaXF1ZUVMaXN0PFJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBVbmlxdWVFTGlzdDxSZXNvdXJjZT4gc2F2ZWRSZXNvdXJjZXMgPSBuZXcgVW5pcXVlRUxpc3Q8UmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JcHJpdmF0ZSBJUmVmcmVzaEhhbmRsZXIgcmVmcmVzaEhhbmRsZXI7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SVJlc291cmNlPiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcyA9IG5ldyBVbmlxdWVFTGlzdDxJUmVzb3VyY2U+KCk7Ci0KLQlwcml2YXRlIFJlZnJlc2hKb2IoKSB7Ci0JCXN1cGVyKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlc291cmNlQXV0b1JlZnJlc2hKb2JfbmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGIpIHsKLQkJZW5hYmxlZCA9IGI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiAgICAgICAgICAgIFRoZSByZXNvdXJjZVNldCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VTZXQoUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IHJlc291cmNlU2V0OwotCX0KLQkKLQlwdWJsaWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoKSB7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoSGFuZGxlcihJUmVmcmVzaEhhbmRsZXIgaGFuZGxlcikgewotCQlyZWZyZXNoSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBleGlzdGluZyByZXNvdXJjZXMgdGhhdCByZWFwcGVhciBpbiB3b3Jrc3BhY2VzCi0JICogCi0JICogQHJldHVybiB0aGUgYWRkZWRSZXNvdXJjZXMKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0QWRkZWRSZXNvdXJjZXMoKSB7Ci0JCXJlbW92ZVJlc291cmNlcyhhZGRlZFJlc291cmNlcywgc2F2ZWRSZXNvdXJjZXMpOwotCQlyZXR1cm4gYWRkZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248SVJlc291cmNlPiBnZXRBZGRlZFdvcmtzcGFjZVJlc291cmNlcygpIHsKLQkJcmV0dXJuIGFkZGVkV29ya3NwYWNlUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2hhbmdlZFJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q2hhbmdlZFJlc291cmNlcygpIHsKLQkJcmVtb3ZlUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIHNhdmVkUmVzb3VyY2VzKTsKLQkJcmVtb3ZlUmVzb3VyY2VzKGNoYW5nZWRSZXNvdXJjZXMsIGxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMpOwotCQlyZXR1cm4gY2hhbmdlZFJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIDxjb2RlPnJlc291cmNlc1RvUmVtb3ZlPC9jb2RlPiBmcm9tIDxjb2RlPnJlc291cmNlczwvY29kZT4gaWYKLQkgKiB0aGUgcmVzb3VyY2VzIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGVpciBzdG9yYWdlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXNUb1JlbW92ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcywKLQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlc1RvUmVtb3ZlKSB7Ci0JCXN5bmNocm9uaXplZCAocmVzb3VyY2VzVG9SZW1vdmUpIHsKLQkJCWlmICghcmVzb3VyY2VzVG9SZW1vdmUuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChJdGVyYXRvcjxSZXNvdXJjZT4gaXRlciA9IHJlc291cmNlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCByZXNvdXJjZSA9IGl0ZXIubmV4dCgpOwotCQkJCQlib29sZWFuIGNhblJlbW92ZSA9IHRydWU7Ci0JCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgewotCQkJCQkJTXVsdGlGaWxlWE1JUmVzb3VyY2VJbXBsIG1mUmVzb3VyY2UgPSAoKE11bHRpRmlsZVhNSVJlc291cmNlSW1wbCkgcmVzb3VyY2UpOwotCQkJCQkJY2FuUmVtb3ZlID0gbWZSZXNvdXJjZS5pc1N5bmNocm9uaXplZCgpOwotCQkJCQl9Ci0JCQkJCWlmIChjYW5SZW1vdmUpIHsKLQkJCQkJCWlmIChyZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlKSkgewotCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlbW92ZWRSZXNvdXJjZXMuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlbW92ZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZW1vdmVkUmVzb3VyY2VzOwotCX0KLQkKLQkvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vdmVkUmVzb3VyY2VzLiAKLQkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0TW92ZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBtb3ZlZFJlc291cmNlczsgICAgICAgICAgICAgCi0JfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQlwdWJsaWMgdm9pZCByZXNvdXJjZVNhdmVkKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmKHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgPT0gcmVzb3VyY2VTZXQpIHsKLQkJCXN5bmNocm9uaXplZCAoc2F2ZWRSZXNvdXJjZXMpIHsKLQkJCQlzYXZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcwotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiBsb2FkZWRCZWZvcmVSZWZyZXNoUmVzb3VyY2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQljaGFuZ2VkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCXJlbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJbW92ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJc2F2ZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJbG9hZGVkQmVmb3JlUmVmcmVzaFJlc291cmNlcy5jbGVhcigpOwotCQlhZGRlZFJlc291cmNlcy5jbGVhcigpOwotCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5jbGVhcigpOwotCX0KLQkKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzY2hlZHVsZVJlZnJlc2goKSB7CQkKLQkJaWYgKGdldFN0YXRlKCkgPT0gSm9iLk5PTkUpIHsKLQkJCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJaWYobGliICE9IG51bGwpIHsKLQkJCQlzZXRSdWxlKG5ldyBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUobGliKSk7Ci0JCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCX0KLQkJfQotCX0JCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIFdvcmtzcGFjZUpvYiNydW5JbldvcmtzcGFjZQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVmcmVzaEhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJVGhyb3dhYmxlIGVycm9yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oREVCVUdfUFJFRklYICsgIiBzdGFydGluZyByZWZyZXNoIGpvYiIpOyAvLyROT04tTkxTLTEkCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlyZWZyZXNoSGFuZGxlci5yZWZyZXNoKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQllcnJvciA9IGU7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbihERUJVR19QUkVGSVgKLQkJCQkJCQkJKyAiIGZpbmlzaGVkIHJlZnJlc2ggam9iIGluOiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChlcnJvciAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRmlsZU1hbmFnZXIuUExVR0lOX0lELCAwLAotCQkJCQkiUmVmcmVzaCBlcnJvciIsIGVycm9yKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNzaG91bGRSdW4oKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCXJldHVybiBzaG91bGRSZWZyZXNoKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFJlZnJlc2goKSB7Ci0JCXJldHVybiAhcmVtb3ZlZFJlc291cmNlcy5pc0VtcHR5KCkgfHwgIWNoYW5nZWRSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJfHwgIWFkZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCAhbW92ZWRSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJfHwgIWxvYWRlZEJlZm9yZVJlZnJlc2hSZXNvdXJjZXMuaXNFbXB0eSgpCi0JCQkJfHwgIWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIHJlZnJlc2ggam9iCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWZyZXNoSm9iLnN0YXJ0KCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFN0b3BzIHRoZSByZWZyZXNoIGpvYgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWZyZXNoSm9iLnN0b3AoKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWNhbmNlbCgpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShJUmVzb3VyY2Ugd3NSZXMpIHsKLQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCXJldHVybiAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbClyZXNvdXJjZVNldCkuZ2V0UmVzb3VyY2Uod3NSZXMpOwotCQl9Ci0JCUlQYXRoIHBhdGggPSB3c1Jlcy5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gcGF0aCAhPSBudWxsID8gUGVyc2lzdGVuY2VVdGlsLmdldFJlc291cmNlKHBhdGgsIHJlc291cmNlU2V0KSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiByZXNvdXJjZSBjYW4gYmUgYWNjZXB0ZWQgYXMgYSBuZXcgcmVzb3VyY2Ugb2YKLQkgKiByZXNvdXJjZSBzZXQgb2YgdGhpcyByZWZyZXNoIGpvYiB0aGF0IG5lZWRzIHRvIGJlIGxvYWRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFjY2VwdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSB7Ci0JCQlyZXR1cm4gKChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHJlc291cmNlU2V0KQotCQkJCQkuaXNOZXdSZXNvdXJjZVRvTG9hZChyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIWlzRW5hYmxlZCgpIHx8IHJlc291cmNlU2V0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQlyZXR1cm47CQkKLQkJdHJ5IHsKLQkJCWNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGNoYW5nZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQkJCQkKLQkJCQlwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IG1vdmVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLQotCQkJCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gYWRkZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotCi0JCQkJcHJpdmF0ZSBBcnJheUxpc3Q8SVJlc291cmNlPiBhZGRlZFdvcmtzcGFjZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlPigpOwotCQkJCQotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlOwotCQkJCQlpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSAhPSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTCi0JCQkJCQkJJiYgZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEOgotCQkJCQkJCS8vIGhhbmRsZSBhZGRlZCByZXNvdXJjZQotCQkJCQkJCS8vCi0JCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoIXJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCQkJCS8vIHRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBidXQgbm90Ci0JCQkJCQkJCQkvLyBsb2FkZWQgYi9jIHRoZSB3b3Jrc3BhY2UgcmVzb3VyY2UKLQkJCQkJCQkJCS8vIHdhcyBub3QgYWRkZWQgdG8gdGhlIHdvcmtzcGFjZSBhdCB0aGUKLQkJCQkJCQkJCS8vIHRpbWUgb2YgbG9hZGluZwotCQkJCQkJCQkJLy8KLQkJCQkJCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSBQZXJzaXN0ZW5jZVV0aWwKLQkJCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJCQkJCWlmICghKG1lIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSkgewotCQkJCQkJCQkJCS8vIG5vIGF1dG8tcmVsb2FkIGZvciBjb250ZW50Ci0JCQkJCQkJCQkJLy8gZGVzY3JpcHRpb24KLQkJCQkJCQkJCQkvLyBNZXRob2RFbGVtZW50RWRpdG9yIHdpbGwgZGV0ZWN0Ci0JCQkJCQkJCQkJLy8gdGhlIGNoYW5nZSBhbmQgbG9hZCBpdAotCQkJCQkJCQkJCS8vIHdoZW4gYWN0aXZhdGVkLgotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJYWRkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAoYWNjZXB0KGRlbHRhLmdldFJlc291cmNlKCkpKSB7Ci0JCQkJCQkJCWFkZGVkV29ya3NwYWNlUmVzb3VyY2VzLmFkZChkZWx0YQotCQkJCQkJCQkJCS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJCi0JCQkJCQkJLy8gaGFuZGxlIGZpbGUgbW92ZQotCQkJCQkJCS8vCi0JCQkJCQkJaWYgKChJUmVzb3VyY2VEZWx0YS5NT1ZFRF9GUk9NICYgZGVsdGEuZ2V0RmxhZ3MoKSkgIT0gMCkgewotLy8JCQkJCQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2UoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7ICAgICAgICAgIAotLy8JCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0vLwkJCQkJCQkJCW1vdmVkUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7ICAgICAgICAgICAgICAgICAKLS8vCQkJCQkJCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCQkvLwotCQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJCUlQYXRoIG1vdmVkRnJvbVBhdGggPSBkZWx0YS5nZXRSZXNvdXJjZSgpCi0JCQkJCQkJCQkJCS5nZXRMb2NhdGlvbigpOwotCQkJCQkJCQkJSVBhdGggbW92ZWRUb1BhdGggPSBkZWx0YS5nZXRNb3ZlZFRvUGF0aCgpOwotCQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCQkucHJpbnRsbigiUmVzb3VyY2UgbW92ZWQgZnJvbSAnIiArIG1vdmVkRnJvbVBhdGggKyAiJyB0byAnIiArIG1vdmVkVG9QYXRoICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCQkJfQotCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEOgotCQkJCQkJCXJlc291cmNlID0gZ2V0UmVzb3VyY2UoZGVsdGEuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRDoKLQkJCQkJCQlib29sZWFuIGVuY29kaW5nQ2hhbmdlZCA9ICgoSVJlc291cmNlRGVsdGEuRU5DT0RJTkcgJiBkZWx0YQotCQkJCQkJCQkJLmdldEZsYWdzKCkpICE9IDApOwotCQkJCQkJCWJvb2xlYW4gY29udGVudENoYW5nZWQgPSAoKElSZXNvdXJjZURlbHRhLkNPTlRFTlQgJiBkZWx0YQotCQkJCQkJCQkJLmdldEZsYWdzKCkpICE9IDApOwotCQkJCQkJCWlmIChlbmNvZGluZ0NoYW5nZWQgfHwgY29udGVudENoYW5nZWQpIHsKLQkJCQkJCQkJcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwKLQkJCQkJCQkJCQkmJiBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkJCQkJCS5jaGVja1N5bmNocm9uaXplZChyZXNvdXJjZSkgIT0gMSkgewotCQkJCQkJCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLQkJCVJlc291cmNlRGVsdGFWaXNpdG9yIHZpc2l0b3IgPSBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQkJCWRlbHRhLmFjY2VwdCh2aXNpdG9yKTsKLQotCQkJcmVtb3ZlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5yZW1vdmVkUmVzb3VyY2VzKTsKLQkJCW1vdmVkUmVzb3VyY2VzLmFkZEFsbCh2aXNpdG9yLm1vdmVkUmVzb3VyY2VzKTsKLQkJCWNoYW5nZWRSZXNvdXJjZXMuYWRkQWxsKHZpc2l0b3IuY2hhbmdlZFJlc291cmNlcyk7Ci0JCQlhZGRlZFJlc291cmNlcy5hZGRBbGwodmlzaXRvci5hZGRlZFJlc291cmNlcyk7Ci0JCQlhZGRlZFdvcmtzcGFjZVJlc291cmNlcy5hZGRBbGwodmlzaXRvci5hZGRlZFdvcmtzcGFjZVJlc291cmNlcyk7Ci0KLQkJCWlmIChzaG91bGRSZWZyZXNoKCkpIHsKLQkJCQlzY2hlZHVsZVJlZnJlc2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIHByb3h5IGFuZCBpdHMgY29udGFpbmVycwotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCByZXNvbHZlKEVPYmplY3QgcHJveHkpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlVXRpbC5yZXNvbHZlKHByb3h5LCByZXNvdXJjZVNldCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZWZyZXNoSm9iIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUmVmcmVzaEpvYiBpbnN0YW5jZSA9IG5ldyBSZWZyZXNoSm9iKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvUmVmcmVzaEV2ZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvaW50ZXJuYWwvUmVmcmVzaEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZGY2MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL1JlZnJlc2hFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiBJUmVmcmVzaEV2ZW50Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWZyZXNoRXZlbnQgaW1wbGVtZW50cyBJUmVmcmVzaEV2ZW50IHsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVmcmVzaGVkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiB1bmxvYWRlZFJlc291cmNlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEVPYmplY3Q+IHVubG9hZGVkT2JqZWN0cyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxFT2JqZWN0PiByZWZyZXNoZWRPYmplY3RzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCi0JcHVibGljIFJlZnJlc2hFdmVudChDb2xsZWN0aW9uPFJlc291cmNlPiB1bmxvYWRlZFJlc291cmNlcykgewotCQl0aGlzLnVubG9hZGVkUmVzb3VyY2VzID0gdW5sb2FkZWRSZXNvdXJjZXM7Ci0JfQotCi0JcHVibGljIFJlZnJlc2hFdmVudChDb2xsZWN0aW9uPFJlc291cmNlPiByZWZyZXNoZWRSZXNvdXJjZXMsCi0JCQlDb2xsZWN0aW9uPEVPYmplY3Q+IHVubG9hZGVkT2JqZWN0cykgewotCQl0aGlzKHJlZnJlc2hlZFJlc291cmNlcywgdW5sb2FkZWRPYmplY3RzLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQl9CQotCi0JLyoqCi0JICogQHBhcmFtIHJlZnJlc2hlZFJlc291cmNlcwotCSAqIEBwYXJhbSB1bmxvYWRlZE9iamVjdHMKLQkgKiBAcGFyYW0gcmVmcmVzaGVkT2JqZWN0cwotCSAqLwotCXB1YmxpYyBSZWZyZXNoRXZlbnQoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVmcmVzaGVkUmVzb3VyY2VzLCBDb2xsZWN0aW9uPEVPYmplY3Q+IHVubG9hZGVkT2JqZWN0cywgQ29sbGVjdGlvbjxFT2JqZWN0PiByZWZyZXNoZWRPYmplY3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVmcmVzaGVkUmVzb3VyY2VzID0gcmVmcmVzaGVkUmVzb3VyY2VzOwotCQl0aGlzLnVubG9hZGVkT2JqZWN0cyA9IHVubG9hZGVkT2JqZWN0czsKLQkJdGhpcy5yZWZyZXNoZWRPYmplY3RzID0gcmVmcmVzaGVkT2JqZWN0czsKLQl9Ci0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudCNnZXRSZWZyZXNoZWRSZXNvdXJjZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRSZWZyZXNoZWRSZXNvdXJjZXMoKSB7Ci0JCXJldHVybiByZWZyZXNoZWRSZXNvdXJjZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50I2dldFVubG9hZGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248RU9iamVjdD4gZ2V0VW5sb2FkZWRPYmplY3RzKCkgewotCQlyZXR1cm4gdW5sb2FkZWRPYmplY3RzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoRXZlbnQjZ2V0UmVmcmVzaGVkT2JqZWN0cygpCi0JICovCi0JcHVibGljIENvbGxlY3Rpb248RU9iamVjdD4gZ2V0UmVmcmVzaGVkT2JqZWN0cygpIHsKLQkJcmV0dXJuIHJlZnJlc2hlZE9iamVjdHM7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFVubG9hZGVkUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gdW5sb2FkZWRSZXNvdXJjZXM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDdiNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS9yZWZyZXNoL2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgbWFuYWdpbmcgbWV0aG9kIGxpYnJhcnkgcmVmcmVzaGVzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3JlZnJlc2gvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWI3YzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvcmVmcmVzaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgbWFuYWdpbmcgbWV0aG9kIGxpYnJhcnkgcmVmcmVzaGVzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9MaWJyYXJ5U2NoZWR1bGluZ1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViYWQ3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvTGlicmFyeVNjaGVkdWxpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuTXVsdGlSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBTY2hlZHVsaW5nIHJ1bGUgdXNlZCB0byBsb2NrIGEgbGlicmFyeSBkdXJpbmcgYSBvcGVyYXRpb24gYW5kIGRlZmVyIHRoZQotICogYnJvYWRjYXN0aW5nIG9mIHJlc291cmNlIGNoYW5nZSBldmVudCB1bnRpbCB0aGUgb3BlcmF0aW9uIGlzIGZpbmlzaGVkLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIEF1ZyAxNSwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNjaGVkdWxpbmdSdWxlIGltcGxlbWVudHMgSVNjaGVkdWxpbmdSdWxlIHsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8qKgotCSAqIEBwYXJhbSBsaWIKLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNjaGVkdWxpbmdSdWxlKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXRoaXMubGlicmFyeSA9IGxpYjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZSNjb250YWlucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJaWYgKHRoaXMgPT0gcnVsZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBMaWJyYXJ5U2NoZWR1bGluZ1J1bGUpIHsKLQkJCXJldHVybiAoKExpYnJhcnlTY2hlZHVsaW5nUnVsZSkgcnVsZSkubGlicmFyeSA9PSBsaWJyYXJ5OwotCQl9Ci0JCWlmIChydWxlIGluc3RhbmNlb2YgTXVsdGlSdWxlKSB7Ci0JCQlNdWx0aVJ1bGUgbXJ1bGUgPSAoTXVsdGlSdWxlKSBydWxlOwotCQkJSVNjaGVkdWxpbmdSdWxlW10gY2hpbGRSdWxlcyA9IG1ydWxlLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRSdWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghIChjaGlsZFJ1bGVzW2ldIGluc3RhbmNlb2YgSVJlc291cmNlKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBhbGxvdyBhbnkgSVJlc291cmNlIHJ1bGUgdG8gbmVzdCB3aXRoaW4gdGhlIHNhbWUgdGhyZWFkCi0JCS8vCi0JCXJldHVybiBydWxlIGluc3RhbmNlb2YgSVJlc291cmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlI2lzQ29uZmxpY3Rpbmcob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmxpY3RpbmcoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJcmV0dXJuIGVxdWFscyhydWxlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHRoaXMgPT0gb2JqCi0JCQkJfHwgKG9iaiBpbnN0YW5jZW9mIExpYnJhcnlTY2hlZHVsaW5nUnVsZSAmJiAoKExpYnJhcnlTY2hlZHVsaW5nUnVsZSkgb2JqKS5saWJyYXJ5ID09IGxpYnJhcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBsaWJyYXJ5Lmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BhdHRlcm5Db25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ2ZTYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QYXR0ZXJuQ29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3Mgd2l0aCBzdGF0aWMgbWV0aG9kcyB0byBjcmVhdGUgc2VhcmNoIHBhdHRlcm4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBhdHRlcm5Db25zdHJ1Y3RvciB7Ci0KLQlwcml2YXRlIFBhdHRlcm5Db25zdHJ1Y3RvcigpIHsKLQkJLy8gZG9uJ3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgcGF0dGVybiwKLQkJCWJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBib29sZWFuIGlzUmVnZXgpCi0JCQl0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVQYXR0ZXJuKHBhdHRlcm4sIGlzUmVnZXgsIHRydWUsIGlzQ2FzZVNlbnNpdGl2ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwYXR0ZXJuIGVsZW1lbnQgZnJvbSB0aGUgcGF0dGVybiBzdHJpbmcgd2hpY2ggaXMgZWl0aGVyIGEKLQkgKiByZWctZXggZXhwcmVzc2lvbiBvciBpbiBvdXIgb2xkICdTdHJpbmdNYXRjaGVyJyBmb3JtYXQuCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIFRoZSBzZWFyY2ggcGF0dGVybgotCSAqIEBwYXJhbSBpc1JlZ2V4Ci0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGFzc2VkIHN0cmluZyBhbHJlYWR5IGlzIGEgcmVnLWV4Ci0JICogICAgICAgICAgICBwYXR0ZXJuCi0JICogQHBhcmFtIGlzU3RyaW5nTWF0Y2hlcgotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBhc3NlZCBzdHJpbmcgaXMgaW4gdGhlCi0JICogICAgICAgICAgICBTdHJpbmdNYXRjaGVyIGZvcm1hdC4KLQkgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlCi0JICogICAgICAgICAgICBTZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY3JlYXRlIGEgY2FzZSBpbnNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgcGF0dGVybgotCSAqIEBwYXJhbSBpc1dob2xlV29yZAotCSAqICAgICAgICAgICAgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gY3JlYXRlIGEgcGF0dGVybiB0aGF0IHJlcXVpcmVzIGEgd29yZAotCSAqICAgICAgICAgICAgYm91bmRhcnkgYXQgdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZC4KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHBhdHRlcm4KLQkgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBhdHRlcm4gY3JlYXRlUGF0dGVybihTdHJpbmcgcGF0dGVybiwgYm9vbGVhbiBpc1JlZ2V4LAotCQkJYm9vbGVhbiBpc1N0cmluZ01hdGNoZXIsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLAotCQkJYm9vbGVhbiBpc1dob2xlV29yZCkgdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24gewotCQlpZiAoaXNSZWdleCkgewotCQkJaWYgKGlzV2hvbGVXb3JkKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocGF0dGVybi5sZW5ndGgoKSArIDEwKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcXGIoPzoiKS5hcHBlbmQocGF0dGVybikuYXBwZW5kKCIpXFxiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXBhdHRlcm4gPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWludCBsZW4gPSBwYXR0ZXJuLmxlbmd0aCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuICsgMTApOwotCQkJLy8gZG9uJ3QgYWRkIGEgd29yZCBib3VuZGFyeSBpZiB0aGUgc2VhcmNoIHRleHQgZG9lcyBub3Qgc3RhcnQgd2l0aAotCQkJLy8gYSB3b3JkIGNoYXIuICh0aGlzIHdvcmtzIGFyb3VuZCBhIHVzZXIgaW5wdXQgZXJyb3IpLgotCQkJaWYgKGlzV2hvbGVXb3JkICYmIGxlbiA+IDAgJiYgaXNXb3JkQ2hhcihwYXR0ZXJuLmNoYXJBdCgwKSkpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCJcXGIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYXBwZW5kQXNSZWdFeChpc1N0cmluZ01hdGNoZXIsIHBhdHRlcm4sIGJ1ZmZlcik7Ci0JCQlpZiAoaXNXaG9sZVdvcmQgJiYgbGVuID4gMCAmJiBpc1dvcmRDaGFyKHBhdHRlcm4uY2hhckF0KGxlbiAtIDEpKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIlxcYiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwYXR0ZXJuID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpbnQgcmVnZXhPcHRpb25zID0gUGF0dGVybi5NVUxUSUxJTkU7Ci0JCWlmICghaXNDYXNlU2Vuc2l0aXZlKSB7Ci0JCQlyZWdleE9wdGlvbnMgfD0gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5VTklDT0RFX0NBU0U7Ci0JCX0KLQkJcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLCByZWdleE9wdGlvbnMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXb3JkQ2hhcihjaGFyIGMpIHsKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHBhdHRlcm4gZWxlbWVudCBmcm9tIGFuIGFycmF5IG9mIHBhdHRlcm5zIGluIHRoZSBvbGQKLQkgKiAnU3RyaW5nTWF0Y2hlcicgZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBwYXR0ZXJucwotCSAqICAgICAgICAgICAgVGhlIHNlYXJjaCBwYXR0ZXJucwotCSAqIEBwYXJhbSBpc0Nhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiB0byBjcmVhdGUgYSBjYXNlIGluc2Vuc2l0aXZlCi0JICogICAgICAgICAgICBwYXR0ZXJuCi0JICogQHJldHVybiBUaGUgY3JlYXRlZCBwYXR0ZXJuCi0JICogQHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQYXR0ZXJuIGNyZWF0ZVBhdHRlcm4oU3RyaW5nW10gcGF0dGVybnMsCi0JCQlib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSkgdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgcGF0dGVybiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJLy8gbm90ZSB0aGF0IHRoaXMgd29ya3Mgb25seSBhcyB3ZSBrbm93IHRoYXQgdGhlIG9wZXJhbmRzIG9mIHRoZQotCQkJCS8vIG9yIGV4cHJlc3Npb24gd2lsbCBiZSBzaW1wbGUgYW5kIG5lZWQgbm8gYnJhY2tldHMuCi0JCQkJcGF0dGVybi5hcHBlbmQoJ3wnKTsKLQkJCX0KLQkJCWFwcGVuZEFzUmVnRXgodHJ1ZSwgcGF0dGVybnNbaV0sIHBhdHRlcm4pOwotCQl9Ci0JCXJldHVybiBjcmVhdGVQYXR0ZXJuKHBhdHRlcm4udG9TdHJpbmcoKSwgdHJ1ZSwgdHJ1ZSwgaXNDYXNlU2Vuc2l0aXZlLAotCQkJCWZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBhcHBlbmRBc1JlZ0V4KGJvb2xlYW4gaXNTdHJpbmdNYXRjaGVyLAotCQkJU3RyaW5nIHBhdHRlcm4sIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJYm9vbGVhbiBpc0VzY2FwZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgYyA9IHBhdHRlcm4uY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkvLyB0aGUgYmFja3NsYXNoCi0JCQljYXNlICdcXCc6Ci0JCQkJLy8gdGhlIGJhY2tzbGFzaCBpcyBlc2NhcGUgY2hhciBpbiBzdHJpbmcgbWF0Y2hlcgotCQkJCWlmIChpc1N0cmluZ01hdGNoZXIgJiYgIWlzRXNjYXBlZCkgewotCQkJCQlpc0VzY2FwZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkvLyBjaGFyYWN0ZXJzIHRoYXQgbmVlZCB0byBiZSBlc2NhcGVkIGluIHRoZSByZWdleC4KLQkJCWNhc2UgJygnOgotCQkJY2FzZSAnKSc6Ci0JCQljYXNlICd7JzoKLQkJCWNhc2UgJ30nOgotCQkJY2FzZSAnLic6Ci0JCQljYXNlICdbJzoKLQkJCWNhc2UgJ10nOgotCQkJY2FzZSAnJCc6Ci0JCQljYXNlICdeJzoKLQkJCWNhc2UgJysnOgotCQkJY2FzZSAnfCc6Ci0JCQkJaWYgKGlzRXNjYXBlZCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCJcXFxcIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJ1ZmZlci5hcHBlbmQoJ1xcJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz8nOgotCQkJCWlmIChpc1N0cmluZ01hdGNoZXIgJiYgIWlzRXNjYXBlZCkgewotCQkJCQlidWZmZXIuYXBwZW5kKCcuJyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgnXFwnKTsKLQkJCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAnKic6Ci0JCQkJaWYgKGlzU3RyaW5nTWF0Y2hlciAmJiAhaXNFc2NhcGVkKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlidWZmZXIuYXBwZW5kKCdcXCcpOwotCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQlpc0VzY2FwZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWlmIChpc0VzY2FwZWQpIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlzRXNjYXBlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpc0VzY2FwZWQpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaXNFc2NhcGVkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjODBhYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBNZXNzYWdlIGJ1bmRsZSBjbGFzcyBmb3IgbGlicmFyeSBwZXJzaXN0ZW5jZQotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUGVyc2lzdGVuY2VSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gUGVyc2lzdGVuY2VSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90X2NyZWF0ZV9kaXJfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvYmpOb3RGb3VuZEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRMaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVmcmVzaExpYnJhcnlGaWxlc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc291cmNlQXV0b1JlZnJlc2hKb2JfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RvcmVSZXNvdXJjZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVyck1zZ19Db3VsZE5vdERlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbmFtZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcmtlcl9lcnJfY2Fubm90UmVzb2x2ZVByb3h5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZ5RmlsZUVycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlUGF0aE5hbWVUb29Mb25nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTGlicmFyeUZpbGVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlTm90Rm91bmRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVVUklFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZ5UmVhZE9ubHlGaWxlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW92ZVJlc291cmNlRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbW9kaWZ5RmlsZXNFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvdXJjZU91dE9mU3luY2hfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZExpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtb3ZlRGF0YVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVMaWJyYXJ5VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc1Rhc2tfbmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWdyYXRpbmdEaWFncmFtX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeFByZXNlbnRhdGlvbk5hbWVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnJlc29sdmVkUHJveHlMb2dnZXJKb2JfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHk7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkQ29uZmlndXJhdGlvbl9jb3VsZE5vdExvYWRfbG9nTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZENvbmZpZ3VyYXRpb25fbm90Q29uZmlnRmlsZV9sb2dNc2c7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1BlcnNpc3RlbmNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDYzY2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9QZXJzaXN0ZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuRmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uaW50ZXJuYWwuTWlncmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guaW50ZXJuYWwuUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIGhlbHBlciBtZXRob2RzIGZvciBsaWJyYXJ5IHBlcnNpc3RlbmNlCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVV0aWwgewotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBuYW1lc3BhY2UgVVJJIG9mIFVNQS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVTUFOc1VSSSgpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuZU5TX1VSSTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVTUFOc1VSSShTdHJpbmcgbGliUGF0aCkgewotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkKLQkJCQkJLm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShuZXcgRmlsZShsaWJQYXRoKSk7Ci0JCQlFbGVtZW50IHJvb3QgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgbnNVUkkgPSByb290LmdldEF0dHJpYnV0ZSgieG1sbnM6Y29tLmlibS51bWEiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5zVVJJID09IG51bGwgfHwgbnNVUkkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbnNVUkkgPSByb290LmdldEF0dHJpYnV0ZSgieG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAobnNVUkkgPT0gbnVsbCB8fCBuc1VSSS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQluc1VSSSA9IHJvb3QuZ2V0QXR0cmlidXRlKCJ4bWxuczp1bWEiKSArICIvdW1hLmVjb3JlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gbnNVUkk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb252ZXJzaW9uUmVxdWlyZWQoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIGN1cnJlbnROc1VSSSA9IFBlcnNpc3RlbmNlVXRpbC5nZXRVTUFOc1VSSSgpOwotCQlTdHJpbmcgbGliTnNVUkkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0VU1BTnNVUkkobGliUGF0aCk7Ci0JCWlmIChjdXJyZW50TnNVUkkuZXF1YWxzKGxpYk5zVVJJKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKE1pZ3JhdG9yLk9MRF9VTUFfTlNfVVJJLmVxdWFscyhsaWJOc1VSSSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVJlc291cmNlIGdldFdvcmtzcGFjZVJlc291cmNlKE9iamVjdCBvYmopIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCQlpZiAob2JqIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIG9iajsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gZS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCXJlc291cmNlID0gY29udGVudC5lUmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQkJfQotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJlc291cmNlID0gKChFT2JqZWN0KSBvYmopLmVSZXNvdXJjZSgpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJlc291cmNlKSB7Ci0JCQlyZXNvdXJjZSA9IChSZXNvdXJjZSkgb2JqOwotCQl9Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKQotCQkJCQkudG9GaWxlU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFT2JqZWN0PiBnZXRQcm94aWVzKEVPYmplY3Qgb2JqKSB7Ci0JCUNvbGxlY3Rpb248RU9iamVjdD4gcHJveGllcyA9IG5ldyBBcnJheUxpc3Q8RU9iamVjdD4oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gb2JqLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChvLmVJc1Byb3h5KCkpIHsKLQkJCQlwcm94aWVzLmFkZChvKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJveGllczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIHByaW1hcnkgdG9vbCB2ZXJzaW9uIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIDxsaT4gPCAwIGlmIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcmltYXJ5IHRvb2wgc3RvcmVkIGluIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBtaXNzaW5nIG9yIG9sZGVyIHRoYW4gY3VycmVudAotCSAqICAgICAgICAgPGxpPiAwIGlmIHRoZSBwcmltYXJ5IHRvb2wgdmVyc2lvbiBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgbWF0Y2hlcyB0aGUgY3VycmVudCB2ZXJzaW9uCi0JICogICAgICAgICA8bGk+ID4gMCBpZiAgdGhlIHByaW1hcnkgdG9vbCB2ZXJzaW9uIGluIHRoZSBnaXZlbiByZXNvdXJjZSBpcyBuZXdlciB0aGFuIHRoZSBjdXJyZW50IHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjaGVja1Rvb2xWZXJzaW9uKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJTWFwIGZpbGVWZXJzaW9uTWFwID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoZmlsZSk7Ci0JCWlmKGZpbGVWZXJzaW9uTWFwICE9IG51bGwpIHsKLQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgZmlsZVZlcnNpb25NYXAuZ2V0KFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSk7Ci0JCQlpZih2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKFZlcnNpb25VdGlsLmdldFByaW1hcnlUb29sSUQoKSk7Ci0JCQkJcmV0dXJuIHZlcnNpb25zLmdldEN1cnJlbnRWZXJzaW9uKCkuY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24odmVyc2lvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmaXJzdCBtZXRob2QgZWxlbWVudCBpbiBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCi0JICogIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChSZXNvdXJjZSByZXNvdXJjZSkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIHByb3h5IGFuZCBpdHMgY29udGFpbmVycwotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgcmVzb2x2ZShFT2JqZWN0IHByb3h5LCBSZXNvdXJjZVNldCByZXNvdXJjZVNldCkgewotCQlFT2JqZWN0IHJlc29sdmVkOwotCQl0cnkgewotCQkJcmVzb2x2ZWQgPSBFY29yZVV0aWwucmVzb2x2ZShwcm94eSwgcmVzb3VyY2VTZXQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzb2x2ZWQgPSBwcm94eTsKLQkJfQotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHByb3h5LmVDb250YWluZXIoKTsKLQkJaWYgKHJlc29sdmVkLmVDb250YWluZXIoKSA9PSBudWxsICYmIGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGFpbmVyLmVJc1Byb3h5KCkpIHsKLQkJCQljb250YWluZXIgPSByZXNvbHZlKGNvbnRhaW5lciwgcmVzb3VyY2VTZXQpOwotCQkJfQotCQkJRVJlZmVyZW5jZSByZWYgPSBwcm94eS5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQlpZiAocmVmLmlzTWFueSgpKSB7Ci0JCQkJTGlzdCB2YWx1ZXMgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQocmVmKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7IGl0ZXIKLQkJCQkJCS5uZXh0KCkpCi0JCQkJCTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29udGFpbmVyLmVHZXQocmVmKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVBhdGggcGF0aCwgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlKHBhdGgudG9PU1N0cmluZygpLCByZXNvdXJjZVNldCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoU3RyaW5nIHBhdGgsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShwYXRoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4ocmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkpCi0JCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJaWYgKHVyaS5lcXVhbHMoTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzb3VyY2UpKSkgewotCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQotCX0KLQkKLQkvKioKLQkgKiBSZXNvbHZlcyBjb250YWluZXIgb2YgdGhlIE1ldGhvZEVsZW1lbnQgaW4gdGhlIGdpdmVuIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlQ29udGFpbmVyKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5yZXNvbHZlQ29udGFpbmVyKHJlc291cmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KElSZXNvdXJjZSBpUmVzb3VyY2UsIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShpUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7CQkKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsgCi0JCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5yZXNvbHZlQ29udGFpbmVyKHJlc291cmNlKTsKLQkJCX0KLQkJCWVsZW1lbnQgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0TWV0aG9kRWxlbWVudChyZXNvdXJjZSk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCUVPYmplY3QgY29udGFpbmVyID0gKChDb250ZW50RGVzY3JpcHRpb24pZWxlbWVudCkuZUNvbnRhaW5lcigpOwotCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCljb250YWluZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEFsbExpYnJhcnlSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUb3BBdHRyaWJ1dGUoRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkvLyBDcmVhdGUgdGhlIFNBWCBwYXJzZXIgZmFjdG9yeS4KLQkJU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBTQVggcGFyc2VyLgotCQl0cnkgewotCQkJU0FYUGFyc2VyIHNheFBhcnNlciA9IHNwZi5uZXdTQVhQYXJzZXIoKTsKLQkJCWZpbmFsIFN0cmluZ1tdIHZhbHVlSG9sZGVyID0gbmV3IFN0cmluZ1sxXTsKLQkJCXRyeSB7Ci0JCQlzYXhQYXJzZXIucGFyc2UoZmlsZSwgbmV3IERlZmF1bHRIYW5kbGVyKCkgewkKLQkJCQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZDsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlpZihzdGFydGVkKSB7Ci0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJfQotLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidXJpOiAiICsgdXJpKTsKLS8vCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsTmFtZTogIiArIGxvY2FsTmFtZSk7Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJxTmFtZTogIiArIHFOYW1lKTsKLQkJCQkJdmFsdWVIb2xkZXJbMF0gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQlzdGFydGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9KTsKLQkJCX0KLQkJCWNhdGNoKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLwotCQkJfQotCQkJcmV0dXJuIHZhbHVlSG9sZGVyWzBdOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyB2b2lkIHVubG9hZChDb2xsZWN0aW9uPFJlc291cmNlPiByZW1vdmVkUmVzb3VyY2VzKSB7Ci0JCU1hcDxNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwsIENvbGxlY3Rpb248UmVzb3VyY2U+PiByZXNvdXJjZVNldFRvVW5sb2FkZWRSZXNvdXJjZXNNYXAgPSBuZXcgSGFzaE1hcDxNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwsIENvbGxlY3Rpb248UmVzb3VyY2U+PigpOwotCQlmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVtb3ZlZFJlc291cmNlcykgewotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJYm9vbGVhbiB1bmxvYWRlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCQkJaWYoKChJTGlicmFyeVJlc291cmNlU2V0KXJlc291cmNlU2V0KS51bmxvYWQocmVzb3VyY2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCkpIHsKLQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCQl1bmxvYWRlZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmKHJlc291cmNlLmlzTG9hZGVkKCkpIHsKLQkJCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCQkJdW5sb2FkZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0JCi0JCQlpZih1bmxvYWRlZCAmJiByZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJCUNvbGxlY3Rpb248UmVzb3VyY2U+IHVubG9hZGVkUmVzb3VyY2VzID0gcmVzb3VyY2VTZXRUb1VubG9hZGVkUmVzb3VyY2VzTWFwLmdldChyZXNvdXJjZVNldCk7Ci0JCQkJaWYodW5sb2FkZWRSZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCQl1bmxvYWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCQkJCXJlc291cmNlU2V0VG9VbmxvYWRlZFJlc291cmNlc01hcC5wdXQoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2VTZXQsIHVubG9hZGVkUmVzb3VyY2VzKTsKLQkJCQl9Ci0JCQkJdW5sb2FkZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlmb3IgKE1hcC5FbnRyeTxNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwsIENvbGxlY3Rpb248UmVzb3VyY2U+PiBlbnRyeSA6IHJlc291cmNlU2V0VG9VbmxvYWRlZFJlc291cmNlc01hcC5lbnRyeVNldCgpKSB7Ci0JCQllbnRyeS5nZXRLZXkoKS5ub3RpZnlSZWZyZXNoTGlzdGVuZXJzKG5ldyBSZWZyZXNoRXZlbnQoZW50cnkuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgaGFzIGEgR1VJRCB0aGF0IGlzIHRoZSBzYW1lIGFzIEdVSUQgb2YKLQkgKiBvbmUgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgaGFzIGR1cGxpY2F0ZSBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0R1cGxpY2F0ZUdVSUQoTWV0aG9kRWxlbWVudCBlLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RFbGVtZW50PiBlbGVtZW50cykgewotCQlmb3IgKE1ldGhvZEVsZW1lbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0JCQlpZihlLmdldEd1aWQoKS5lcXVhbHMoZWxlbWVudC5nZXRHdWlkKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9QcmVmaXgoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gcGF0aCA6IHBhdGggKyBGaWxlLnNlcGFyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlcGxhY2VVUklQcmVmaXgoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzLCBTdHJpbmcgb2xkUHJlZml4LCBTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVVSSSBvbGRQcmVmaXhVUkkgPSBVUkkuY3JlYXRlRmlsZVVSSSh0b1ByZWZpeChvbGRQcmVmaXgpKTsKLQkJVVJJIG5ld1ByZWZpeFVSSSA9IFVSSS5jcmVhdGVGaWxlVVJJKHRvUHJlZml4KG5ld1ByZWZpeCkpOwotCQlmb3IoUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZXMpIHsKLQkJCVVSSSB1cmkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCVVSSSBuZXdVUkkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQluZXdVUkkgPSB1cmkucmVwbGFjZVByZWZpeChvbGRQcmVmaXhVUkksIG5ld1ByZWZpeFVSSSk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQotCQkJfQotCQkJaWYobmV3VVJJICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZS5zZXRVUkkobmV3VVJJKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSSSBnZXRQcm94eVVSSShFT2JqZWN0IG9iamVjdCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG9iamVjdC5lUmVzb3VyY2UoKTsKLQkJVVJJIHVyaSA9IG51bGw7Ci0JCWlmKHJlc291cmNlIGluc3RhbmNlb2YgSUxpYnJhcnlSZXNvdXJjZSkgewotCQkJSUxpYnJhcnlSZXNvdXJjZSBsaWJSZXNvdXJjZSA9IChJTGlicmFyeVJlc291cmNlKSByZXNvdXJjZTsKLQkJCXVyaSA9IGxpYlJlc291cmNlLmdldFByb3h5VVJJKG9iamVjdCk7CQkJCi0JCX0KLQkJZWxzZSB7Ci0JCQl1cmkgPSByZXNvdXJjZS5nZXRVUkkoKS5hcHBlbmRGcmFnbWVudChyZXNvdXJjZS5nZXRVUklGcmFnbWVudChvYmplY3QpKTsKLQkJfQotCQlyZXR1cm4gdXJpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCBnZXRJbXBvcnRQbHVnaW5SZXNvdXJjZVNldCgpIHsKLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0OwotCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRlbWFuZExvYWQoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkJaWYgKCEgc2tpcERlbWFuZExvYWQocmVzb3VyY2UpKSB7Ci0JCQkJCXN1cGVyLmRlbWFuZExvYWQocmVzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgYm9vbGVhbiBza2lwRGVtYW5kTG9hZChSZXNvdXJjZSByZXMpIHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZXMuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJCWlmICghIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXROYW1lKCkuZXF1YWxzKE11bHRpRmlsZVNhdmVVdGlsLkRFRkFVTFRfUExVR0lOX01PREVMX0ZJTEVOQU1FKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgYXR0cmliID0gZ2V0VG9wQXR0cmlidXRlKG5ldyBGaWxlKGFyZ3NbMF0pLCBhcmdzWzFdKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGF0dHJpYik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkwM2UwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkTmFtZUVycm9yX21zZz1UaGUgbmFtZSAnJ3swfScnIGlzIGludmFsaWQuIEEgbWV0aG9kIGVsZW1lbnQgbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAvIDogKiA/ICIgPCA+IHwKLW9iak5vdEZvdW5kRXJyb3JfbXNnPUNvdWxkIG5vdCBmaW5kIG9iamVjdCB3aXRoIGlkICcnezB9JycKLWxvYWRMaWJyYXJ5RXJyb3JfbXNnPUVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBsb2FkaW5nIG1ldGhvZCBsaWJyYXJ5OgotbG9hZExpYnJhcnlFcnJvcl9kZXRhaWxzPVwgXCBsaW5lOiB7MH0sIGNvbHVtbjogezF9LCBtc2c6IHsyfQotcmVzdG9yZVJlc291cmNlRXJyb3JfbXNnPUNvdWxkIG5vdCByZXN0b3JlIHJlc291cmNlICcnezB9JycKLUZpbGVNYW5hZ2VyX2ZpbGVSZWFkT25seT1GaWxlICcnezB9JycgaXMgcmVhZC1vbmx5Ci1FcnJNc2dfQ291bGROb3REZWxldGU9Q291bGQgbm90IGRlbGV0ZSB7MH0uIHsxfQotcmVuYW1lRXJyb3JfbXNnPUNvdWxkIG5vdCByZW5hbWUgJyd7MH0nJyB0byAnJ3sxfScnCi1iYWNrdXBFcnJvcl9tc2c9Q291bGQgbm90IGJhY2t1cCB1cCByZXNvdXJjZSAnJ3swfScnCi1tYXJrZXJfZXJyX2Nhbm5vdFJlc29sdmVQcm94eT1Db3VsZCBub3QgcmVzb2x2ZSBwcm94eSB7MH0KLW1vZGlmeUZpbGVFcnJvcl9tc2c9Q2Fubm90IG1vZGlmeSBmaWxlICcnezB9JycKLWZpbGVQYXRoTmFtZVRvb0xvbmdfbXNnPUNhbm5vdCBzYXZlIHJlc291cmNlLiBGaWxlIHBhdGggbmFtZSB0b28gbG9uZyAoZXhjZWVkaW5nIDI1NSkgJyd7MH0nJwotbG9hZFJlc291cmNlRXJyb3JfbXNnPUNvdWxkIG5vdCBsb2FkIHJlc291cmNlICcnezB9JycKLWxvYWRSZXNvdXJjZUVycm9yV2l0aFJlYXNvbl9tc2c9Q291bGQgbm90IGxvYWQgcmVzb3VyY2UgJyd7MH0nJy4gUmVhc29uOiB7MX0KLWludmFsaWRMaWJyYXJ5RmlsZUVycm9yX21zZz1JbnZhbGlkIG1ldGhvZCBsaWJyYXJ5IGZpbGU6Ci1maWxlTm90Rm91bmRFcnJvcl9tc2c9Q291bGQgbm90IGxvY2F0ZSBhbnkgbWV0aG9kIGxpYnJhcnkgZmlsZSBpbiB3b3Jrc3BhY2UgJyd7MH0nJwotbm9ybWFsaXplVVJJRXJyb3JfbXNnPUNvdWxkIG5vdCBmaW5kIHRoZSBub3JtYWxpemVkIFVSSSBmb3IgJyd7MH0nJwotbW92ZUVycm9yX21zZz1Db3VsZCBub3QgbW92ZSAnJ3swfScnIHRvICcnezF9JycuIFRoZSBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cy4KLW1vZGlmeVJlYWRPbmx5RmlsZUVycm9yX21zZz1DYW5ub3QgbW9kaWZ5IHJlYWQtb25seSBmaWxlKHMpOiB7MH0KLW1vdmVSZXNvdXJjZUVycm9yX21zZz1SZXNvdXJjZSAnJ3swfScnIGlzIGludm9sdmVkIGluIGEgcGVyc2lzdGVuY2Ugb3BlcmF0aW9uIHRoYXQgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZC4KLW1vZGlmeUZpbGVzRXJyb3JfbXNnPUNvdWxkIG5vdCBtb2RpZnkgb25lIG9yIG1vcmUgZmlsZXMKLXJlc291cmNlT3V0T2ZTeW5jaF9tc2c9UmVzb3VyY2UgaXMgb3V0IG9mIHN5bmNoIGFuZCBuZWVkcyB0byBiZSByZWxvYWRlZDogezB9Ci1yZXNvdXJjZUF1dG9SZWZyZXNoSm9iX25hbWU9UmVzb3VyY2UgQXV0by1SZWZyZXNoCi1sb2FkQ29uZmlndXJhdGlvbl9jb3VsZE5vdExvYWRfbG9nTXNnPUNvdWxkIG5vdCBsb2FkIGZpbGU6IHswfS4gVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoaXMgZmlsZSBoYXMgZHVwbGljYXRlIEdVSUQuCi1sb2FkQ29uZmlndXJhdGlvbl9ub3RDb25maWdGaWxlX2xvZ01zZz1Ob3QgYSBtZXRob2QgY29uZmlndXJhdGlvbiBmaWxlOiB7MH0KLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotbG9hZExpYnJhcnlUYXNrX25hbWU9TG9hZGluZyBtZXRob2QgbGlicmFyeS4uLgotbW92ZURhdGFUYXNrX25hbWU9TW92aW5nIHRoZSBkYXRhLi4uCi1zYXZlTGlicmFyeVRhc2tfbmFtZT1TYXZpbmcgbWV0aG9kIGxpYnJhcnkuLi4KLWxvYWRSZXNvdXJjZXNUYXNrX25hbWU9TG9hZGluZyBhbGwgcmVzb3VyY2VzIGludG8gbWVtb3J5Li4uCi1taWdyYXRpbmdEaWFncmFtX25hbWU9TWlncmF0aW5nIGRpYWdyYW1zLi4uCi1taWdyYXRlQ29udGVudERlc2NyaXB0aW9uc1Rhc2tfbmFtZT1NaWdyYXRpbmcgcHJvY2VzcyBjb250ZW50IGRlc2NyaXB0aW9ucy4uLgotZml4UHJlc2VudGF0aW9uTmFtZVRhc2tfbmFtZT1GaXhpbmcgZW1wdHkgcHJlc2VudGF0aW9uIG5hbWVzLi4uCi1VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyX2NvdWxkTm90UmVzb2x2ZVByb3h5PUNvdWxkIG5vdCByZXNvbHZlIHByb3h5ICcnezB9JycKLXJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWU9UmVmcmVzaGluZyBsaWJyYXJ5IGZpbGVzIGluIHdvcmtzcGFjZQotY2Fubm90X2NyZWF0ZV9kaXJfbXNnPUNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICcnezB9JycuCi11bnJlc29sdmVkUHJveHlMb2dnZXJKb2JfbmFtZT1VbnJlc29sdmVkIFByb3h5IExvZ2dlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcGVyc2lzdGVuY2UvdXRpbC9VbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTJjMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL1VucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRXh0ZW5zaW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSU1hcmtlckF0dHJpYnV0ZUNvbnRyaWJ1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIEJhY2tncm91bmQgam9iIHRoYXQgbWFuYWdlIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgcHJveGllcwotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlciBleHRlbmRzIFdvcmtzcGFjZUpvYiBpbXBsZW1lbnRzIElQcm94eVJlc29sdXRpb25MaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFTEFZID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGlnbm9yZU1hcmtlclN0YXJ0RW5kQXR0cyA9IHRydWU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS0VSX0lEID0gUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCkgKyAiLnVucmVzb2x2ZWRQcm94eU1hcmtlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9VUkkgPSAicHJveHlVUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1dORVJfR1VJRCA9ICJvd25lckdVSUQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmFsaWRPYmplY3QgewotCQlib29sZWFuIHZhbGlkOwotCQlPYmplY3Qgb2JqZWN0OwotCQkKLQkJLyoqCi0JCSAqIEBwYXJhbSB2YWxpZAotCQkgKiBAcGFyYW0gb2JqZWN0Ci0JCSAqLwotCQlwdWJsaWMgVmFsaWRPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQkJdmFsaWQgPSB0cnVlOwkJCQotCQl9Ci0JCQkJCi0JfQotCQotCXByaXZhdGUgTWFwIHVyaVRvRXhjZXB0aW9uc01hcDsKLQlwcml2YXRlIExpc3QgZXhjZXB0aW9uczsKLQlwcml2YXRlIE1hcCByZXNvdXJjZUdVSVRvTWFya2Vyc01hcDsKLQlwcml2YXRlIE1hcCBlbGVtZW50R1VJVG9NYXJrZXJzTWFwOwotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQ7Ci0JcHJpdmF0ZSBMaXN0IHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzOwotCXByaXZhdGUgYm9vbGVhbiBhdXRvU2NoZWR1bGVkID0gdHJ1ZTsKLQotCXB1YmxpYyBVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyKFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXN1cGVyKFBlcnNpc3RlbmNlUmVzb3VyY2VzLnVucmVzb2x2ZWRQcm94eUxvZ2dlckpvYl9uYW1lKTsJCQotCQl0aGlzLnJlc291cmNlU2V0ID0gcmVzb3VyY2VTZXQ7Ci0vLwkJdW5yZXNvbHZlZFJlc291cmNlR1VJRFRvTWFya2Vyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXVyaVRvRXhjZXB0aW9uc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWV4Y2VwdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7IAotCQlyZXNvdXJjZUdVSVRvTWFya2Vyc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWVsZW1lbnRHVUlUb01hcmtlcnNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycyA9IG5ldyBVbmlxdWVFTGlzdCgpOwotCX0KLQotCXB1YmxpYyBJTWFya2VyIGZpbmRNYXJrZXIoSUZpbGUgZmlsZSwgU3RyaW5nIHByb3h5VVJJLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1hcmtlcltdIG1hcmtlcnMgPSBmaWxlLmZpbmRNYXJrZXJzKE1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJcmV0dXJuIGZpbmRNYXJrZXIobWFya2VycywgcHJveHlVUkksIHN0YXJ0LCBlbmQpOwotCX0KLQkKLQlwcml2YXRlIElNYXJrZXIgZmluZE1hcmtlcihJTWFya2VyW10gbWFya2VycywgU3RyaW5nIHByb3h5VVJJLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQlpZihwcm94eVVSSS5lcXVhbHMobWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpKQotCQkJCQkmJiBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgLTEpID09IHN0YXJ0Ci0JCQkJCSYmIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX0VORCwgLTEpID09IGVuZCkgCi0JCQl7Ci0JCQkJcmV0dXJuIG1hcmtlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJTWFya2VyIGZpbmRNYXJrZXIoQ29sbGVjdGlvbjxJTWFya2VyPiBtYXJrZXJzLCBpbnQgc3RhcnQsIGludCBlbmQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpIHsKLQkJCWlmKG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCAtMSkgPT0gc3RhcnQKLQkJCQkJJiYgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCAtMSkgPT0gZW5kKSAKLQkJCXsKLQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGFkZEV4Y2VwdGlvbihSZXNvbHZlRXhjZXB0aW9uIHJlKSB7Ci0JCXN5bmNocm9uaXplZChleGNlcHRpb25zKSB7Ci0JCQlVUkkgdXJpID0gKChJbnRlcm5hbEVPYmplY3QpcmUuZ2V0UHJveHkoKSkuZVByb3h5VVJJKCk7Ci0JCQlTZXQgZXhjZXB0aW9ucyA9IChTZXQpIHVyaVRvRXhjZXB0aW9uc01hcC5nZXQodXJpKTsJCQotCQkJaWYoZXhjZXB0aW9ucyA9PSBudWxsKSB7Ci0JCQkJZXhjZXB0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJdXJpVG9FeGNlcHRpb25zTWFwLnB1dCh1cmksIGV4Y2VwdGlvbnMpOwotCQkJfQotCQkJaWYoZXhjZXB0aW9ucy5hZGQocmUpKSB7Ci0JCQkJdGhpcy5leGNlcHRpb25zLmFkZChyZSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRG9jdW1lbnQgYmFzZWQgY2hhcmFjdGVyIHNlcXVlbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIERvY3VtZW50Q2hhclNlcXVlbmNlIGltcGxlbWVudHMgQ2hhclNlcXVlbmNlIHsKLQotCQkvKiogRG9jdW1lbnQgKi8KLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JCS8qKgotCQkgKiBJbml0aWFsaXplIHdpdGggdGhlIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuCi0JCSAqIGRvY3VtZW50LgotCQkgKgotCQkgKiBAcGFyYW0gZG9jdW1lbnQgdGhlIGRvY3VtZW50Ci0JCSAqLwotCQlwdWJsaWMgRG9jdW1lbnRDaGFyU2VxdWVuY2UoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQlmRG9jdW1lbnQ9IGRvY3VtZW50OwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGxlbmd0aCgpIHsKLQkJCXJldHVybiBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkJICovCi0JCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRDaGFyKGluZGV4KTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbih4LmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZkRvY3VtZW50LmdldChzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKHguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXJrZXJzQW5kTG9jYXRpb25zIHsKLQkJQ29sbGVjdGlvbjxJTWFya2VyPiBtYXJrZXJzOwotCQlDb2xsZWN0aW9uPGludFtdPiBsb2NhdGlvbnM7CQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlTWFya2VyKElNYXJrZXJbXSBtYXJrZXJzLCBSZXNvdXJjZSByZXNvdXJjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVVSSSBjb250YWluZXJVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkpOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGNvbnRhaW5lclVSSSAhPSBudWxsID8gY29udGFpbmVyVVJJCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCXRyeSB7Ci0JCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX1pFUk8sIG51bGwpOwotCQkJCQotCQkJCU1hcDxTdHJpbmcsIE1hcmtlcnNBbmRMb2NhdGlvbnM+IHByb3h5VVJJVG9NYXJrZXJzQW5kTG9jYXRpb25zTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXJrZXJzQW5kTG9jYXRpb25zPigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCU9iamVjdCBwcm94eVVSSSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQkJCQkJaWYocHJveHlVUkkgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHByb3h5VVJJU3RyID0gcHJveHlVUkkudG9TdHJpbmcoKTsKLQkJCQkJCU1hcmtlcnNBbmRMb2NhdGlvbnMgbWFya2Vyc0FuZExvY2F0aW9ucyA9IHByb3h5VVJJVG9NYXJrZXJzQW5kTG9jYXRpb25zTWFwLmdldChwcm94eVVSSVN0cik7Ci0JCQkJCQlpZihtYXJrZXJzQW5kTG9jYXRpb25zID09IG51bGwpIHsKLQkJCQkJCQltYXJrZXJzQW5kTG9jYXRpb25zID0gbmV3IE1hcmtlcnNBbmRMb2NhdGlvbnMoKTsKLQkJCQkJCQltYXJrZXJzQW5kTG9jYXRpb25zLm1hcmtlcnMgPSBuZXcgSGFzaFNldDxJTWFya2VyPigpOwotCQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubG9jYXRpb25zID0gbmV3IEhhc2hTZXQ8aW50W10+KCk7Ci0JCQkJCQkJcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAucHV0KHByb3h5VVJJU3RyLCBtYXJrZXJzQW5kTG9jYXRpb25zKTsKLQkJCQkJCX0KLQkJCQkJCW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5hZGQobWFya2VyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvLyBsb2NhdGUgdGhlIHRleHQgb2YgdW5yZXNvbHZlZCBVUkkgaW4gZmlsZQotCQkJCS8vCi0JCQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBtYW5hZ2VyPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQltYW5hZ2VyLmNvbm5lY3QocGF0aCwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OLCBtb25pdG9yKTsKLQkJCQkJSVRleHRGaWxlQnVmZmVyIGZpbGVCdWZmZXI9IG1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIocGF0aCwgTG9jYXRpb25LaW5kLkxPQ0FUSU9OKTsKLQkJCQkJZmlsZUJ1ZmZlci5yZXF1ZXN0U3luY2hyb25pemF0aW9uQ29udGV4dCgpOwotCQkJCQlmaWxlQnVmZmVyLmdldERvY3VtZW50KCk7Ci0JCQkJCUlEb2N1bWVudCBkb2MgPSBmaWxlQnVmZmVyLmdldERvY3VtZW50KCk7Ci0JCQkJCWlmKGRvYyAhPSBudWxsKSB7Ci0JCQkJCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcmtlcnNBbmRMb2NhdGlvbnM+IGVudHJ5IDogcHJveHlVUklUb01hcmtlcnNBbmRMb2NhdGlvbnNNYXAuZW50cnlTZXQoKSkgewotCQkJCQkJCVN0cmluZyBwcm94eVVSSSA9IGVudHJ5LmdldEtleSgpOwotCQkJCQkJCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm5Db25zdHJ1Y3Rvci5jcmVhdGVQYXR0ZXJuKHByb3h5VVJJLCB0cnVlLCBmYWxzZSk7Ci0JCQkJCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG5ldyBEb2N1bWVudENoYXJTZXF1ZW5jZShkb2MpKTsKLQkJCQkJCQl3aGlsZShtYXRjaGVyLmZpbmQoKSkgewotCQkJCQkJCQlpbnQgc3RhcnQgPSBtYXRjaGVyLnN0YXJ0KCk7Ci0JCQkJCQkJCWludCBlbmQgPSBtYXRjaGVyLmVuZCgpOwotCQkJCQkJCQlpZihzdGFydCAhPSBlbmQpIHsKLQkJCQkJCQkJCWVudHJ5LmdldFZhbHVlKCkubG9jYXRpb25zLmFkZChuZXcgaW50W10geyBzdGFydCwgZW5kIH0pOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbGVCdWZmZXIucmVsZWFzZVN5bmNocm9uaXphdGlvbkNvbnRleHQoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG1vbml0b3IpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBtYWtlIHN1cmUgdGhhdCByZXNvbHZlciBpcyBzdGlsbCBpbiB0aGUgb3BlbiBsaWJyYXJ5IGJ5IGNoZWNraW5nIHdoZXRoZXIgaXRzIHJlc291cmNlCi0JCQkJLy8gc3RpbGwgYmVsb25ncyB0byBhIHJlc291cmNlIHNldAotCQkJCS8vCi0JCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQkJZm9yIChNYXJrZXJzQW5kTG9jYXRpb25zIG1hcmtlcnNBbmRMb2NhdGlvbnMgOiBwcm94eVVSSVRvTWFya2Vyc0FuZExvY2F0aW9uc01hcC52YWx1ZXMoKSkgewotCQkJCQkJcHJvY2Vzc19lbnRyeToKLQkJCQkJCWZvciAoSXRlcmF0b3I8aW50W10+IGl0ZXJhdG9yID0gbWFya2Vyc0FuZExvY2F0aW9ucy5sb2NhdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJCWlmKG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJYnJlYWsgcHJvY2Vzc19lbnRyeTsKLQkJCQkJCQl9Ci0JCQkJCQkJaW50W10gbG9jID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCWludCBzdGFydCA9IGxvY1swXTsKLQkJCQkJCQlpbnQgZW5kID0gbG9jWzFdOwotCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gZmluZE1hcmtlcihtYXJrZXJzQW5kTG9jYXRpb25zLm1hcmtlcnMsIHN0YXJ0LCBlbmQpOwotCQkJCQkJCWlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJCQkJCUl0ZXJhdG9yPElNYXJrZXI+IGl0ZXIgPSBtYXJrZXJzQW5kTG9jYXRpb25zLm1hcmtlcnMuaXRlcmF0b3IoKTsKLQkJCQkJCQkJbWFya2VyID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5DSEFSX1NUQVJULCBzdGFydCk7CQotCQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9FTkQsIGVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQltYXJrZXJzQW5kTG9jYXRpb25zLm1hcmtlcnMucmVtb3ZlKG1hcmtlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYoIW1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkvLyBpbnZhbGlkIG1hcmtlcnMsIG11c3QgYmUgZGVsZXRlZAotCQkJCQkJCS8vCi0JCQkJCQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnNBbmRMb2NhdGlvbnMubWFya2VycykgewotCQkJCQkJCQlpZihtYXJrZXIuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRNYXJrZXIoUmVzb2x2ZUV4Y2VwdGlvbiByZSwgUmVzb3VyY2UgcmVzb3VyY2UsIFVSSSBwcm94eVVSSSwgU3RyaW5nIGVyck1zZywgU3RyaW5nIG93bmVyR1VJRCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVVSSSBjb250YWluZXJVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkpOwotCQlJRmlsZSBmaWxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGNvbnRhaW5lclVSSSAhPSBudWxsID8gY29udGFpbmVyVVJJCi0JCQkJCS50b0ZpbGVTdHJpbmcoKSA6ICIiOyAvLyROT04tTkxTLTEkCQkJCQkKLQkJCQotCQkJdHJ5IHsKLQkJCQlmaWxlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCi0JCQkJaWYgKGlnbm9yZU1hcmtlclN0YXJ0RW5kQXR0cykgewotCQkJCQljcmVhdGVNYXJrZXIocmUsIHByb3h5VVJJLAotCQkJCQkJCWVyck1zZywgb3duZXJHVUlELCBmaWxlLAotCQkJCQkJCWxvY2F0aW9uLCBwcm94eVVSSS50b1N0cmluZygpLCAwLAotCQkJCQkJCTApOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCS8vIGxvY2F0ZSB0aGUgdGV4dCBvZiB1bnJlc29sdmVkIFVSSSBpbiBmaWxlCi0JCQkJLy8KLQkJCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIG1hbmFnZXI9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCW1hbmFnZXIuY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG1vbml0b3IpOwotCQkJCQlJVGV4dEZpbGVCdWZmZXIgZmlsZUJ1ZmZlcj0gbWFuYWdlci5nZXRUZXh0RmlsZUJ1ZmZlcihwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04pOwotCQkJCQlmaWxlQnVmZmVyLnJlcXVlc3RTeW5jaHJvbml6YXRpb25Db250ZXh0KCk7Ci0JCQkJCWZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGZpbGVCdWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYoZG9jICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBwcm94eVVSSVN0ciA9IHByb3h5VVJJLnRvU3RyaW5nKCk7Ci0JCQkJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuQ29uc3RydWN0b3IuY3JlYXRlUGF0dGVybihwcm94eVVSSVN0ciwgdHJ1ZSwgZmFsc2UpOwotCQkJCQkJTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKG5ldyBEb2N1bWVudENoYXJTZXF1ZW5jZShkb2MpKTsKLQkJCQkJCXdoaWxlKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCQkJaW50IHN0YXJ0ID0gbWF0Y2hlci5zdGFydCgpOwotCQkJCQkJCWludCBlbmQgPSBtYXRjaGVyLmVuZCgpOwotCQkJCQkJCWlmKHN0YXJ0ICE9IGVuZCkgewotCQkJCQkJCQkvLyBtYWtlIHN1cmUgdGhhdCByZXNvbHZlciBpcyBzdGlsbCBpbiB0aGUgb3BlbiBsaWJyYXJ5IGJ5IGNoZWNraW5nIHdoZXRoZXIgaXRzIHJlc291cmNlCi0JCQkJCQkJCS8vIHN0aWxsIGJlbG9uZ3MgdG8gYSByZXNvdXJjZSBzZXQKLQkJCQkJCQkJLy8KLQkJCQkJCQkJaWYocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpICE9IG51bGwpIHsKLQkJCQkJCQkJCS8vIGNyZWF0ZSBwcm9ibGVtIG1hcmtlciBmb3IgZmlsZQotCQkJCQkJCQkJSU1hcmtlciBtYXJrZXIgPSBmaW5kTWFya2VyKGZpbGUsIHByb3h5VVJJU3RyLCBzdGFydCwgZW5kKTsKLQkJCQkJCQkJCWlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJbWFya2VyID0gY3JlYXRlTWFya2VyKHJlLCBwcm94eVVSSSwKLQkJCQkJCQkJCQkJCWVyck1zZywgb3duZXJHVUlELCBmaWxlLAotCQkJCQkJCQkJCQkJbG9jYXRpb24sIHByb3h5VVJJU3RyLCBzdGFydCwKLQkJCQkJCQkJCQkJCWVuZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkvLyB1cGRhdGUgb3duZXIgR1VJRAotCQkJCQkJCQkJCS8vCi0JCQkJCQkJCQkJbWFya2VyLnNldEF0dHJpYnV0ZShPV05FUl9HVUlELCBvd25lckdVSUQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbGVCdWZmZXIucmVsZWFzZVN5bmNocm9uaXphdGlvbkNvbnRleHQoKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1hbmFnZXIuZGlzY29ubmVjdChwYXRoLCBMb2NhdGlvbktpbmQuTE9DQVRJT04sIG1vbml0b3IpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGV4KTsKLQkJCQlpZiAoTXVsdGlGaWxlU2F2ZVV0aWwuREVCVUcpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTWFya2VyIGNyZWF0ZU1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBVUkkgcHJveHlVUkksCi0JCQlTdHJpbmcgZXJyTXNnLCBTdHJpbmcgb3duZXJHVUlELCBJRmlsZSBmaWxlLCBTdHJpbmcgbG9jYXRpb24sCi0JCQlTdHJpbmcgcHJveHlVUklTdHIsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyIG1hcmtlcjsKLQkJbWFya2VyID0gZmlsZS5jcmVhdGVNYXJrZXIoTUFSS0VSX0lEKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLAotCQkJCUlNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgZXJyTXNnKTsKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCBsb2NhdGlvbik7Ci0JCW1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5UUkFOU0lFTlQsIHRydWUpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuQ0hBUl9TVEFSVCwgc3RhcnQpOwkKLQkJbWFya2VyLnNldEF0dHJpYnV0ZShJTWFya2VyLkNIQVJfRU5ELCBlbmQpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKFBST1hZX1VSSSwgcHJveHlVUklTdHIpOwotCQltYXJrZXIuc2V0QXR0cmlidXRlKE9XTkVSX0dVSUQsIG93bmVyR1VJRCk7Ci0JCQotCQlJTWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIgYXR0QWRkZXIgPSBFeHRlbnNpb25IZWxwZXIuZ2V0TWFya2VyQXR0cmlidXRlQ29udHJpYnV0ZXIoKTsKLQkJaWYgKGF0dEFkZGVyICE9IG51bGwpIHsKLQkJCWF0dEFkZGVyLmFkZEFkZHRpb25hbEF0dHJpYnV0ZXMobWFya2VyLCByZSk7Ci0JCX0KLQotCQkvLyBjYWNoZSBtYXJrZXIgdG8gaXQgY2FuIGJlIGZvdW5kIGVhc2lseSBhbmQgZGVsZXRlZAotCQkvLwotCQljYWNoZU1hcmtlcihtYXJrZXIsIHByb3h5VVJJKTsKLQkJcmV0dXJuIG1hcmtlcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcmtlcihSZXNvbHZlRXhjZXB0aW9uIHJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSW50ZXJuYWxFT2JqZWN0IHByb3h5ID0gKEludGVybmFsRU9iamVjdCkgcmUuZ2V0UHJveHkoKTsKLQkJVVJJIGNvbnRhaW5lclVSSSA9IG51bGw7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYocmUuZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IHJlLmdldFJlc29sdmVyKCkuZVJlc291cmNlKCk7Ci0JCQkKLQkJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlc29sdmVyIGlzIHN0aWxsIGluIHRoZSBvcGVuIGxpYnJhcnkgYnkgY2hlY2tpbmcgd2hldGhlciBpdHMgcmVzb3VyY2UKLQkJCS8vIHN0aWxsIGJlbG9uZ3MgdG8gYSByZXNvdXJjZSBzZXQKLQkJCS8vCi0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5yZXNvbHZlZFByb3h5TWFya2VyTWFuYWdlci5hZGRNYXJrZXIoKTogcmVzb3VyY2VTZXQ9IiArIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkuaGFzaENvZGUoKSk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkgIT0gbnVsbCkgewkJCQkKLQkJCQljb250YWluZXJVUkkgPSByZXNvdXJjZS5nZXRVUkkoKTsKLQkJCX0KLQkJfQkJCQkKLQkJaWYgKGNvbnRhaW5lclVSSSAhPSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChjb250YWluZXJVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBlcnJNc2c7Ci0JCQkJaWYgKHJlLmV4Y2VwdGlvbigpICE9IG51bGwgJiYgcmUuZXhjZXB0aW9uKCkuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICE9IG51bGwgJiYgCi0JCQkJCQlyZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJNc2cgPSByZS5leGNlcHRpb24oKS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllcnJNc2cgPSByZS5nZXRNZXNzYWdlKCkgPT0gbnVsbCA/IE5MUy5iaW5kKFBlcnNpc3RlbmNlUmVzb3VyY2VzLlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXJfY291bGROb3RSZXNvbHZlUHJveHksIHByb3h5LmVQcm94eVVSSSgpKSA6IHJlCi0JCQkJCQkJCS5nZXRNZXNzYWdlKCk7Ci0JCQkJfQotCQkJCWFkZE1hcmtlcihyZSwgcmVzb3VyY2UsIHByb3h5LmVQcm94eVVSSSgpLCBlcnJNc2csIE11bHRpRmlsZVNhdmVVdGlsLmdldEd1aWQocmUuZ2V0UmVzb2x2ZXIoKSksIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1hcmtlcgotCSAqIEBwYXJhbSB1cmkgcHJveHkgdXJpIAotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZU1hcmtlcihJTWFya2VyIG1hcmtlciwgVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQoZWxlbWVudEdVSVRvTWFya2Vyc01hcCkgewotCQkJU3RyaW5nIHJlc291cmNlR1VJRCA9IHVyaS5hdXRob3JpdHkoKTsKLQkJCWlmKHJlc291cmNlR1VJRCAhPSBudWxsKSB7Ci0JCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIHJlc291cmNlR1VJVG9NYXJrZXJzTWFwLmdldChyZXNvdXJjZUdVSUQpOwotCQkJCWlmKHZvID09IG51bGwpIHsKLQkJCQkJdm8gPSBuZXcgVmFsaWRPYmplY3QobmV3IEhhc2hTZXQoKSk7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLnB1dChyZXNvdXJjZUdVSUQsIHZvKTsKLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIHZvLm9iamVjdDsKLQkJCQltYXJrZXJzLmFkZChtYXJrZXIpOwotCQkJfQotCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7Ci0JCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgZWxlbWVudEdVSVRvTWFya2Vyc01hcC5nZXQoZWxlbWVudEdVSUQpOwotCQkJaWYobWFya2VycyA9PSBudWxsKSB7Ci0JCQkJbWFya2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5wdXQoZWxlbWVudEdVSUQsIG1hcmtlcnMpOwotCQkJfQotCQkJbWFya2Vycy5hZGQobmV3IFZhbGlkT2JqZWN0KG1hcmtlcikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJBbGwoKSB7Ci0JCWJvb2xlYW4gb2xkRW5hYmxlZCA9IGVuYWJsZWQ7Ci0JCXRyeSB7Ci0JCQllbmFibGVkID0gZmFsc2U7Ci0JCQljYW5jZWwoKTsKLQotCQkJc3luY2hyb25pemVkIChleGNlcHRpb25zKSB7Ci0JCQkJdXJpVG9FeGNlcHRpb25zTWFwLmNsZWFyKCk7Ci0JCQkJZXhjZXB0aW9ucy5jbGVhcigpOwotCQkJfQotCQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCQlpZighZWxlbWVudEdVSVRvTWFya2Vyc01hcC5pc0VtcHR5KCkpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudEdVSVRvTWFya2Vyc01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBpdGVyLm5leHQoKTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlcjEubmV4dCgpOwotCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHZvLm9iamVjdDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZihtYXJrZXIuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCW1hcmtlcnMuY2xlYXIoKTsKLQkJCQkJfQotCQkJCQllbGVtZW50R1VJVG9NYXJrZXJzTWFwLmNsZWFyKCk7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLmNsZWFyKCk7Ci0JCQkJfQkKLQkJCX0KLQkJCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJCXJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbmFibGVkID0gb2xkRW5hYmxlZDsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbnJlc29sdmVkUHJveHlNYXJrZXJNYW5hZ2VyLmNsZWFyQWxsKCk6IGVuZCIpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVW5yZXNvbHZlZFByb3h5KCkgewotCQlyZXR1cm4gIWVsZW1lbnRHVUlUb01hcmtlcnNNYXAuaXNFbXB0eSgpOwotCX0KLQkKLQlwcml2YXRlIFJlc29sdmVFeGNlcHRpb24gbmV4dEV4Y2VwdGlvbigpIHsKLQkJc3luY2hyb25pemVkKGV4Y2VwdGlvbnMpIHsJCQkKLQkJCS8vIHN5bmNocm9uaXplZDogaW4gb3JkZXIgdG8gYXRvbWljYWxseSBvYnRhaW4gYW5kIGNsZWFyIHJlcXVlc3RzCi0JCQlpZihleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUmVzb2x2ZUV4Y2VwdGlvbiBlID0gKFJlc29sdmVFeGNlcHRpb24pIHRoaXMuZXhjZXB0aW9ucy5yZW1vdmUoMCk7Ci0JCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KWUuZ2V0UHJveHkoKSkuZVByb3h5VVJJKCk7Ci0JCQkJQ29sbGVjdGlvbiBleGNlcHRpb25zID0gKENvbGxlY3Rpb24pIHVyaVRvRXhjZXB0aW9uc01hcC5nZXQodXJpKTsKLQkJCQlpZihleGNlcHRpb25zICE9IG51bGwpIHsKLQkJCQkJZXhjZXB0aW9ucy5yZW1vdmUoZSk7Ci0JCQkJCWlmKGV4Y2VwdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSBuZXh0UmVzb3VyY2VUb1ZhbGlkYXRlTWFya2VycygpIHsKLQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQlpZihyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiAoUmVzb3VyY2UpIHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLnJlbW92ZSgwKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgeWllbGQoKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMTApOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYiNydW5JbldvcmtzcGFjZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIucnVuSW5Xb3Jrc3BhY2UoKTogYmVnaW4iKTsKLQkJdHJ5IHsKLQkJaWYoIWVuYWJsZWQpIHJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCXRyeSB7Ci0JCQkvLyBhZGQgbWFya2VycwotCQkJLy8KLQkJCVJlc29sdmVFeGNlcHRpb24gcmU7Ci0JCQl3aGlsZSghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgKHJlID0gbmV4dEV4Y2VwdGlvbigpKSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYWRkTWFya2VyKHJlLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0JCi0JCQkJeWllbGQoKTsKLQkJCX0KLQkJCQotCQkJaWYobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJLy8gcmVtb3ZlIGludmFsaWQgbWFya2VycwotCQkJLy8KLQkJCXJlbW92ZU1hcmtlcnMobW9uaXRvcik7Ci0JCQl5aWVsZCgpOwotCQkJCi0JCQkvLyB2YWxpZGF0ZSByZXNvdXJjZSBtYXJrZXJzCi0JCQkvLwotCQkJUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCQl3aGlsZSghbW9uaXRvci5pc0NhbmNlbGVkKCkgJiYgKHJlc291cmNlID0gbmV4dFJlc291cmNlVG9WYWxpZGF0ZU1hcmtlcnMoKSkgIT0gbnVsbCkgewotCQkJCWRvVmFsaWRhdGVNYXJrZXJzKHJlc291cmNlKTsKLQkJCQl5aWVsZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pIHsKLQkJCQl0aHJvdyAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24pIGU7Ci0JCQl9Ci0JCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWZpbmFsbHkgewotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVucmVzb2x2ZWRQcm94eU1hcmtlck1hbmFnZXIucnVuSW5Xb3Jrc3BhY2UoKTogZW5kIik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAoU3RyaW5nIHByb3h5VVJJLCBJTWFya2VyIG1hcmtlcikgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwcm94eVVSSSk7Ci0JCVN0cmluZyByZXNvdXJjZUdVSUQgPSB1cmkuYXV0aG9yaXR5KCk7Ci0JCWlmKHJlc291cmNlR1VJRCAhPSBudWxsKSB7Ci0JCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQlpZih2byAhPSBudWxsKSB7Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKChDb2xsZWN0aW9uKXZvLm9iamVjdCk7Ci0JCQkJYm9vbGVhbiByZXQgPSBtYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotCQkJCWlmKG1hcmtlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJCXJlc291cmNlR1VJVG9NYXJrZXJzTWFwLnJlbW92ZShyZXNvdXJjZUdVSUQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChTdHJpbmcgcHJveHlVUkksIElNYXJrZXIgbWFya2VyKSB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJKTsKLQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7Ci0JCWlmKGVsZW1lbnRHVUlEICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gdmFsaWRPYmplY3RzID0gKENvbGxlY3Rpb24pIGVsZW1lbnRHVUlUb01hcmtlcnNNYXAuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCWlmKHZhbGlkT2JqZWN0cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvcjEgPSB2YWxpZE9iamVjdHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IxCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCQkJVmFsaWRPYmplY3Qgdm8xID0gKFZhbGlkT2JqZWN0KSBpdGVyYXRvcjEubmV4dCgpOwotCQkJCQlpZih2bzEub2JqZWN0ID09IG1hcmtlcikgewotCQkJCQkJaXRlcmF0b3IxLnJlbW92ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKHZhbGlkT2JqZWN0cy5pc0VtcHR5KCkpIHsKLQkJCQkJZWxlbWVudEdVSVRvTWFya2Vyc01hcC5yZW1vdmUoZWxlbWVudEdVSUQpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU1hcmtlcnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZighdm8udmFsaWQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIHZvLm9iamVjdDsKLQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCVN0cmluZyBwcm94eVVSSSA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQotCQkJCQkJCW1hcmtlci5kZWxldGUoKTsKLQotCQkJCQkJCS8vIHJlbW92ZSB0aGlzIG1hcmtlciBmcm9tIHJlc291cmNlR1VJVG9NYXJrZXJzTWFwCi0JCQkJCQkJLy8KLQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJfQotCQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZighdm8udmFsaWQpIHsKLQkJCQl2by52YWxpZCA9IHRydWU7Ci0JCQkJQ29sbGVjdGlvbiBtYXJrZXJzID0gKENvbGxlY3Rpb24pIHZvLm9iamVjdDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2Vycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyOwotCQkJCQl0cnkgewotCQkJCQkJbWFya2VyID0gKElNYXJrZXIpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCVN0cmluZyBwcm94eVVSSVN0ciA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoUFJPWFlfVVJJKTsKLQkJCQkJCQlVUkkgcHJveHlVUkkgPSBVUkkuY3JlYXRlVVJJKHByb3h5VVJJU3RyKTsKLQotCQkJCQkJCS8vIHByb3h5IGlzIGluIHRoZSBzYW1lIHJlc291cmNlIHRoYXQgaXMganVzdCBsb2FkZWQgCi0JCQkJCQkJLy8gdHJ5IHRvIGdldCB0aGUgb2JqZWN0IHdpdGggdGhpcyBwcm94eSBVUkkgd2l0aG91dCBsb2FkaW5nIG5ldyByZXNvdXJjZQotCQkJCQkJCS8vCi0vLwkJCQkJCQlFT2JqZWN0IG8gPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHByb3h5VVJJLCBmYWxzZSk7Ci0JCQkJCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gcHJveHlVUkkuZnJhZ21lbnQoKTsJCQkJCQkJCi0JCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCQkJCQlpZihvICE9IG51bGwgJiYgIW8uZUlzUHJveHkoKSkgewotCQkJCQkJCQltYXJrZXIuZGVsZXRlKCk7Ci0JCQkJCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwkKLQotCQkJCQkJCQkvLyByZW1vdmUgdGhpcyBtYXJrZXIgZnJvbSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwCi0JCQkJCQkJCS8vCi0JCQkJCQkJCXJlbW92ZUZyb21FbGVtZW50R1VJRFRvTWFya2Vyc01hcChwcm94eVVSSVN0ciwgbWFya2VyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZihtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlpdGVyLnJlbW92ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGVuYWJsZWQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIjbm90aWZ5RXhjZXB0aW9uKGphdmEubGFuZy5FeGNlcHRpb24pCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCWlmKCFlbmFibGVkKSByZXR1cm47Ci0JCQotCQlpZihlIGluc3RhbmNlb2YgUmVzb2x2ZUV4Y2VwdGlvbikgewotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZSA9IChSZXNvbHZlRXhjZXB0aW9uKSBlOwotCQkJCi0vLwkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClyZS5nZXRQcm94eSgpKS5lUHJveHlVUkkoKTsKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQlpZihhZGRFeGNlcHRpb24ocmUpICYmIGF1dG9TY2hlZHVsZWQpIHsJCQkKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QXV0b1NjaGVkdWxlZChib29sZWFuIGIpIHsKLQkJYXV0b1NjaGVkdWxlZCA9IGI7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQXV0b1NjaGVkdWxlZCgpIHsKLQkJcmV0dXJuIGF1dG9TY2hlZHVsZWQ7Ci0JfQotCQotCS8qKgotCSAqIFNjaGVkdWxlcyB0aGlzIGpvYiBpZiBleGNlcHRpb25zIGFyZSBhdmFpbGFibGUgdG8gbG9nCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3RhcnQoKSB7Ci0JCWlmKCFlbmFibGVkKSByZXR1cm4gZmFsc2U7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCWlmKCFleGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJCXNjaGVkdWxlKERFTEFZKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklQcm94eVJlc29sdXRpb25MaXN0ZW5lciNwcm94eVJlc29sdmVkKGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCkgewotCQlpZighZW5hYmxlZCkgcmV0dXJuOwotCQkKLQkJaWYocHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdClwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQkKLS8vCQkJaWYoIl8ySjRZb1BUREVkbWtwWUFSTk40NjhBIi5lcXVhbHModXJpLmZyYWdtZW50KCkpKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLS8vCQkJfQotCQkJCi0JCQkvLyByZW1vdmUgYWxsIGV4Y2VwdGlvbnMgZm9yIHRoaXMgVVJJCi0JCQkvLwotCQkJcmVtb3ZlRXhjZXB0aW9ucyh1cmkpOwotCQkJCi0JCQkvLyBpbnZhbGlkYXRlIGFsbCBtYXJrZXJzIGZvciB0aGlzIFVSSQotCQkJLy8KLQkJCWlmKGludmFsaWRhdGVNYXJrZXJzKHVyaSkpIHsKLQkJCQlzY2hlZHVsZShERUxBWSk7Ci0JCQl9CQkJCQkJCi0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGludmFsaWRhdGVNYXJrZXJzKFVSSSB1cmkpIHsKLQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCQlTdHJpbmcgcmVzb3VyY2VHVUlEID0gdXJpLmF1dGhvcml0eSgpOwotCQkJaWYocmVzb3VyY2VHVUlEICE9IG51bGwpIHsKLQkJCQlWYWxpZE9iamVjdCB2byA9IChWYWxpZE9iamVjdCkgcmVzb3VyY2VHVUlUb01hcmtlcnNNYXAuZ2V0KHJlc291cmNlR1VJRCk7Ci0JCQkJaWYodm8gIT0gbnVsbCkgewotCQkJCQl2by52YWxpZCA9IGZhbHNlOwotCQkJCQlyZXQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50R1VJRCA9IHVyaS5mcmFnbWVudCgpOwotCQkJaWYoZWxlbWVudEdVSUQgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gbWFya2VycyA9IChDb2xsZWN0aW9uKSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLmdldChlbGVtZW50R1VJRCk7Ci0JCQkJaWYobWFya2VycyAhPSBudWxsICYmICFtYXJrZXJzLmlzRW1wdHkoKSkgewotCQkJCQlyZXQgPSB0cnVlOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJVmFsaWRPYmplY3Qgdm8gPSAoVmFsaWRPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJdm8udmFsaWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUV4Y2VwdGlvbnMoVVJJIHVyaSkgewotCQlzeW5jaHJvbml6ZWQgKGV4Y2VwdGlvbnMpIHsKLQkJCUNvbGxlY3Rpb24gZXhjZXB0aW9ucyA9IChDb2xsZWN0aW9uKSB1cmlUb0V4Y2VwdGlvbnNNYXAuZ2V0KHVyaSk7Ci0JCQlpZihleGNlcHRpb25zID09IG51bGwgfHwgZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHJldHVybjsKLQkJCXRoaXMuZXhjZXB0aW9ucy5yZW1vdmVBbGwoZXhjZXB0aW9ucyk7Ci0JCQl1cmlUb0V4Y2VwdGlvbnNNYXAucmVtb3ZlKHVyaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgbWFya2VycyBmb3IgdW5yZXNvbHZlZCBwcm94aWVzIG9mIHRoZSBnaXZlbiByZXNvdXJjZQotCSAqICAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhck1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZSBmaWxlID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihyZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSk7Ci0JCQlpZihmaWxlIGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCQlJTWFya2VyW10gbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMoTUFSS0VSX0lELCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0JCQkJCXJlbW92ZU1hcmtlcihtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZU1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgcHJveHlVUkkgPSBudWxsOwotCQl0cnkgewotCQkJaWYobWFya2VyLmV4aXN0cygpKSB7Ci0JCQkJcHJveHlVUkkgPSAoU3RyaW5nKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFBST1hZX1VSSSk7Ci0JCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUGVyc2lzdGVuY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCWlmKHByb3h5VVJJICE9IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChlbGVtZW50R1VJVG9NYXJrZXJzTWFwKSB7Ci0JCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCXJlbW92ZUZyb21SZXNvdXJjZUdVSURUb01hcmtlcnNNYXAocHJveHlVUkksIG1hcmtlcik7Ci0JCQl9Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1hcmtlckluZm8gewotCQlTdHJpbmcgcHJveHlVUkk7Ci0JCVN0cmluZyBvd25lckdVSUQ7Ci0JCVN0cmluZyBtZXNzYWdlOwotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYob2JqIGluc3RhbmNlb2YgTWFya2VySW5mbykgewotCQkJCU1hcmtlckluZm8gaW5mbyA9IChNYXJrZXJJbmZvKSBvYmo7Ci0JCQkJaWYocHJveHlVUkkgIT0gbnVsbCAmJiBvd25lckdVSUQgIT0gbnVsbCAmJiBwcm94eVVSSS5lcXVhbHMoaW5mby5wcm94eVVSSSkgJiYgb3duZXJHVUlELmVxdWFscyhpbmZvLm93bmVyR1VJRCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCWludCByZXN1bHQgPSBwcm94eVVSSS5oYXNoQ29kZSgpOwotCQkJcmVzdWx0IF49IG93bmVyR1VJRC5oYXNoQ29kZSgpOwotCQkJcmVzdWx0IF49IG1lc3NhZ2UuaGFzaENvZGUoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIG1hcmtlcnMgZm9yIHVucmVzb2x2ZWQgcHJveGllcyBvZiB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZU1hcmtlcnMoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJYm9vbGVhbiBuZXdseUFkZGVkID0gZmFsc2U7Ci0JCXN5bmNocm9uaXplZChyZXNvdXJjZXNUb1ZhbGlkYXRlTWFya2VycykgewotCQkJbmV3bHlBZGRlZCA9IHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzLmFkZChyZXNvdXJjZSk7Ci0JCX0KLQkJaWYobmV3bHlBZGRlZCkgewotCQkJc2NoZWR1bGUoREVMQVkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVBbGxNYXJrZXJzKCkgewotCQlib29sZWFuIG5ld2x5QWRkZWQgPSBmYWxzZTsKLQkJc3luY2hyb25pemVkKHJlc291cmNlc1RvVmFsaWRhdGVNYXJrZXJzKSB7Ci0JCQlpZighZWxlbWVudEdVSVRvTWFya2Vyc01hcC5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50R1VJVG9NYXJrZXJzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlDb2xsZWN0aW9uIG1hcmtlcnMgPSAoQ29sbGVjdGlvbikgaXRlci5uZXh0KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcjEgPSBtYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKLQkJCQkJCVZhbGlkT2JqZWN0IHZvID0gKFZhbGlkT2JqZWN0KSBpdGVyMS5uZXh0KCk7Ci0JCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKSB2by5vYmplY3Q7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OKTsKLQkJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkobG9jYXRpb24pOwotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQkJCQluZXdseUFkZGVkID0gcmVzb3VyY2VzVG9WYWxpZGF0ZU1hcmtlcnMuYWRkKHJlc291cmNlKSB8IG5ld2x5QWRkZWQ7Ci0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYobmV3bHlBZGRlZCkgewotCQkJc2NoZWR1bGUoREVMQVkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvVmFsaWRhdGVNYXJrZXJzKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlJUmVzb3VyY2UgZmlsZSA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotCQkJaWYoZmlsZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBmaWxlLmZpbmRNYXJrZXJzKE1BUktFUl9JRCwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQlIYXNoU2V0PElNYXJrZXI+IG1hcmtlcnNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0PElNYXJrZXI+KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQkJCQkJU3RyaW5nIHByb3h5VVJJID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShQUk9YWV9VUkkpOwotCQkJCQlpZihwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShwcm94eVVSSSk7Ci0JCQkJCQkvLyB0cnkgdG8gZ2V0IHRoZSBvYmplY3Qgd2l0aCB0aGlzIHByb3h5IFVSSSB3aXRob3V0IGxvYWRpbmcgbmV3IHJlc291cmNlCi0JCQkJCQkvLwotCQkJCQkJU3RyaW5nIGVsZW1lbnRHVUlEID0gdXJpLmZyYWdtZW50KCk7CQkJCQkJCQotCQkJCQkJRU9iamVjdCBvID0gKEVPYmplY3QpICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKXJlc291cmNlU2V0KS5nZXRHdWlkVG9NZXRob2RFbGVtZW50TWFwKCkuZ2V0KGVsZW1lbnRHVUlEKTsKLQkJCQkJCWlmKG8gPT0gbnVsbCB8fCBvLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkvLyBtYXJrZXIgc3RpbGwgY2FuIGV4aXN0LCBuZWVkIHRvIHVwZGF0ZSBpdAotCQkJCQkJCS8vCi0JCQkJCQkJbWFya2Vyc1RvVXBkYXRlLmFkZChtYXJrZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gb2JqZWN0IGlzIHJlc29sdmVkLCBtdXN0IGRlbGV0ZSBtYXJrZXIKLQkJCQkJCQkvLwotCQkJCQkJCWlmKG1hcmtlci5leGlzdHMoKSkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJbWFya2VyLmRlbGV0ZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlQZXJzaXN0ZW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7CQkJCQkJCQkJCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJc3luY2hyb25pemVkKGVsZW1lbnRHVUlUb01hcmtlcnNNYXApIHsKLQkJCQkJCQkJcmVtb3ZlRnJvbUVsZW1lbnRHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJCQlyZW1vdmVGcm9tUmVzb3VyY2VHVUlEVG9NYXJrZXJzTWFwKHByb3h5VVJJLCBtYXJrZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZighbWFya2Vyc1RvVXBkYXRlLmlzRW1wdHkoKSkgewotCQkJCQlJTWFya2VyW10gbWFya2VyQXJyYXkgPSBuZXcgSU1hcmtlclttYXJrZXJzVG9VcGRhdGUuc2l6ZSgpXTsKLQkJCQkJbWFya2Vyc1RvVXBkYXRlLnRvQXJyYXkobWFya2VyQXJyYXkpOwotCQkJCQl1cGRhdGVNYXJrZXIobWFya2VyQXJyYXksIHJlc291cmNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCVBlcnNpc3RlbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsJCQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9wZXJzaXN0ZW5jZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzZmEwOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3BlcnNpc3RlbmNlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgcGVyc2lzdGluZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGMyMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRGVzY3JpcHRvciBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI2dldElkIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotICAgICAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLSAgICAgKiA8L3A+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcmkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBTdHJpbmcgZ2V0VXJpKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICB2b2lkIHNldFVyaShTdHJpbmcgdmFsdWUpOwotCi0gICAgVVJJIGdldFJlc29sdmVkVVJJKCk7Ci0gICAgCi0gICAgdm9pZCBzZXRSZXNvbHZlZFVSSShVUkkgdXJpKTsKLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJlc29sdmVkIFVSSSB0aGF0IGhhcyBiZWVuIGNhY2hlZCBpbiBwcmV2aW91cyBjYWxsZWQgb2YgZ2V0UmVzb2x2ZWRVUkkoKQotCSAqIHNvIHRoZSBuZXh0IGNhbGwgdG8gZ2V0UmVzb2x2ZWRVUkkoKSB3aWxsIHVwZGF0ZSB0aGUgcmVzb2x2ZWRVUkkuCi0JICoKLQkgKi8KLQl2b2lkIGNsZWFyUmVzb2x2ZWRVUkkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkZjUzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIE1hbmFnZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0VXJpQmFzZSA8ZW0+VXJpIEJhc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFN1Yk1hbmFnZXJzIDxlbT5TdWIgTWFuYWdlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFJlc291cmNlRGVzY3JpcHRvcnMgPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2UjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLSAqIEBtb2RlbAotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1hbmFnZXIgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHdWlkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HdWlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHdWlkKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcmkgQmFzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXJpIEJhc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaUJhc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVyaUJhc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcmkgQmFzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VXJpQmFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXJpQmFzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIE1hbmFnZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmVzb3VyY2VNYW5hZ2VyPiBnZXRTdWJNYW5hZ2VycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLSAgICAgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0gICAgICogPC9wPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlI2dldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgTGlzdDxSZXNvdXJjZURlc2NyaXB0b3I+IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2V0cyBkaXJlY3QgUmVzb3VyY2VEZXNjcmlwdG9yIHdob3NlIGlkIGlzIHRoZSBnaXZlbiBndWlkCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZURlc2NyaXB0b3IgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKFN0cmluZyBndWlkKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIFJlc291cmNlRGVzY3JpcHRvciBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiB1cmkuIElmIGNsZWFyRm9sZGVyIGlzIHRydWUsIHRoaXMgY2FsbCB3aWxsIHJlbW92ZQotICAgICAqIGFsbCBvdGhlciBSZXNvdXJjZURlc2NyaXB0b3JzIHdob3NlIFVSSSBzaGFyZXMgdGhlIHNhbWUgZm9sZGVyIG9mIHRoZSBnaXZlbiB1cmkuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaQotICAgICAqIEBwYXJhbSBjbGVhckZvbGRlcgotICAgICAqIEByZXR1cm4gbGlzdCBvZiBSZXNvdXJjZURlc2NyaXB0b3JzIHRoYXQgaGFkIGJlZW4gcmVtb3ZlZAotICAgICAqLwotICAgIExpc3Q8UmVzb3VyY2VEZXNjcmlwdG9yPiByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoVVJJIHVyaSwgYm9vbGVhbiBjbGVhckZvbGRlcik7Ci0KLQl2b2lkIGRpc3Bvc2UoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4NmNhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9SZXNvdXJjZW1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlbWFuYWdlckZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFJlc291cmNlRGVzY3JpcHRvciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VNYW5hZ2VyIGNyZWF0ZVJlc291cmNlTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFJlc291cmNlbWFuYWdlclBhY2thZ2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UxOWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlbWFuYWdlclBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewotCQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOQU1FID0gInJlc291cmNlbWFuYWdlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIGludCBSRVNPVVJDRV9ERVNDUklQVE9SX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgaW50IFJFU09VUkNFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsIDxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX01BTkFHRVJfX0dVSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVyaSBCYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBNYW5hZ2VyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZSBEZXNjcmlwdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBpbnQgUkVTT1VSQ0VfTUFOQUdFUl9GRUFUVVJFX0NPVU5UID0gNDsKLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IgPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRJZCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3IjZ2V0VXJpIDxlbT5Vcmk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vcmk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVcmkoKQotCSAqIEBzZWUgI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yX1VyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIEVDbGFzcyBnZXRSZXNvdXJjZU1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkd1aWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRHdWlkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9HdWlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyI2dldFVyaUJhc2UgPGVtPlVyaSBCYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXJpIEJhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNnZXRVcmlCYXNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0U3ViTWFuYWdlcnMgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIE1hbmFnZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0U3ViTWFuYWdlcnMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlTWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycyA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJlc291cmNlIERlc2NyaXB0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VNYW5hZ2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBnZXRSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnRlcmZhY2UgTGl0ZXJhbHMgIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VEZXNjcmlwdG9ySW1wbCA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlRGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJlc291cmNlRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRVNPVVJDRV9ERVNDUklQVE9SX19JRCA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSSA9IGVJTlNUQU5DRS5nZXRSZXNvdXJjZURlc2NyaXB0b3JfVXJpKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCA8ZW0+UmVzb3VyY2UgTWFuYWdlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZU1hbmFnZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsI2dldFJlc291cmNlTWFuYWdlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVNPVVJDRV9NQU5BR0VSID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJFU09VUkNFX01BTkFHRVJfX0dVSUQgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVyaSBCYXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUkVTT1VSQ0VfTUFOQUdFUl9fVVJJX0JBU0UgPSBlSU5TVEFOQ0UuZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBNYW5hZ2VyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9TdWJNYW5hZ2VycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTID0gZUlOU1RBTkNFLmdldFJlc291cmNlTWFuYWdlcl9SZXNvdXJjZURlc2NyaXB0b3JzKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1N2I4OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuaW1wbC5SZXNvdXJjZURlc2NyaXB0b3JJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlRGVzY3JpcHRvckltcGwjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZURlc2NyaXB0b3JJbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBSZXNvdXJjZURlc2NyaXB0b3IgewotCQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NjcyNTA4MjY2MjM4NTQ2Mkw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgdXJpID0gVVJJX0VERUZBVUxUOwotCi0JcHJvdGVjdGVkIFVSSSByZXNvbHZlZFVSSTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZURlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotICAKLSAvL1VNQS0tPgotIAkJcmVhc3NpZ25EZWZhdWx0VmFsdWVzKCk7Ci0gLy9VTUE8LS0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFJlc291cmNlbWFuYWdlclBhY2thZ2UuTGl0ZXJhbHMuUkVTT1VSQ0VfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgewotCQlpZihyZXNvbHZlZFVSSSAhPSBudWxsICYmICh1cmkgPT0gbnVsbCB8fCB1cmkuc3RhcnRzV2l0aCgiLi4vIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXVyaSA9IHJlc29sdmVkVVJJLmRlcmVzb2x2ZShNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSkpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIG5ld1VyaSkgewotCQlTdHJpbmcgb2xkVXJpID0gdXJpOwotCQl1cmkgPSBuZXdVcmk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJLCBvbGRVcmksIHVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlyZXR1cm4gZ2V0SWQoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19VUkk6Ci0JCQkJcmV0dXJuIGdldFVyaSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlzZXRVcmkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1JfX1VSSToKLQkJCQlyZXR1cm4gVVJJX0VERUZBVUxUID09IG51bGwgPyB1cmkgIT0gbnVsbCA6ICFVUklfRURFRkFVTFQuZXF1YWxzKHVyaSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHVyaSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNnZXRVUkkoKQotCSAqLwotCXB1YmxpYyBVUkkgZ2V0UmVzb2x2ZWRVUkkoKSB7Ci0JCWlmKHJlc29sdmVkVVJJID09IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJVVJJIGJhc2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSk7Ci0JCQkJcmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGdldFVyaSgpKS5yZXNvbHZlKGJhc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGdldFVyaSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yI3NldFVSSShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc29sdmVkVVJJKFVSSSB1cmkpIHsJCQotCQlyZXNvbHZlZFVSSSA9IHVyaTsKLQkJU3RyaW5nIG5ld1VyaSA9IG51bGw7Ci0JCWlmKHJlc29sdmVkVVJJICE9IG51bGwpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7CQotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVVSSSBiYXNlVVJJID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkocmVzb3VyY2UpOwotCQkJCW5ld1VyaSA9IHJlc29sdmVkVVJJLmRlcmVzb2x2ZShiYXNlVVJJKS50b1N0cmluZygpOwotCQkJfQotCQl9Ci0JCXNldFVyaShuZXdVcmkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlRGVzY3JpcHRvciNjbGVhclJlc29sdmVkVVJJKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhclJlc29sdmVkVVJJKCkgewotCQlyZXNvbHZlZFVSSSA9IG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvaW1wbC9SZXNvdXJjZU1hbmFnZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwNjJmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBNYW5hZ2VyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLmltcGwuUmVzb3VyY2VNYW5hZ2VySW1wbCNnZXRVcmlCYXNlIDxlbT5VcmkgQmFzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0U3ViTWFuYWdlcnMgPGVtPlN1YiBNYW5hZ2VyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsLlJlc291cmNlTWFuYWdlckltcGwjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycyA8ZW0+UmVzb3VyY2UgRGVzY3JpcHRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1hbmFnZXJJbXBsIGV4dGVuZHMgTXVsdGlSZXNvdXJjZUVPYmplY3QgaW1wbGVtZW50cyBSZXNvdXJjZU1hbmFnZXIgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01MTY0NDcxNDc1NTA5MTY5MjA0TDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHdWlkKCkgPGVtPkd1aWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGd1aWQgPSBHVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaUJhc2UoKSA8ZW0+VXJpIEJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaUJhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVSSV9CQVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVyaUJhc2UoKSA8ZW0+VXJpIEJhc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVyaUJhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXJpQmFzZSA9IFVSSV9CQVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViTWFuYWdlcnMoKSA8ZW0+U3ViIE1hbmFnZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1Yk1hbmFnZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Qgc3ViTWFuYWdlcnMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgRUxpc3QgcmVzb3VyY2VEZXNjcmlwdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZU1hbmFnZXJJbXBsKCkgewotCQlzdXBlcigpOwotCQkKLQkJZ3VpZCA9IFVtYVV0aWwuZ2VuZXJhdGVHVUlEKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLkxpdGVyYWxzLlJFU09VUkNFX01BTkFHRVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHdWlkKFN0cmluZyBuZXdHdWlkKSB7Ci0JCVN0cmluZyBvbGRHdWlkID0gZ3VpZDsKLQkJZ3VpZCA9IG5ld0d1aWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRCwgb2xkR3VpZCwgZ3VpZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJpQmFzZSgpIHsKLQkJcmV0dXJuIHVyaUJhc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXJpQmFzZShTdHJpbmcgbmV3VXJpQmFzZSkgewotCQlTdHJpbmcgb2xkVXJpQmFzZSA9IHVyaUJhc2U7Ci0JCXVyaUJhc2UgPSBuZXdVcmlCYXNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFLCBvbGRVcmlCYXNlLCB1cmlCYXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3QgZ2V0U3ViTWFuYWdlcnMoKSB7Ci0JCWlmIChzdWJNYW5hZ2VycyA9PSBudWxsKSB7Ci0JCQlzdWJNYW5hZ2VycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmcoUmVzb3VyY2VNYW5hZ2VyLmNsYXNzLCB0aGlzLCBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyk7Ci0JCX0KLQkJcmV0dXJuIHN1Yk1hbmFnZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBMaXN0IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCWlmIChyZXNvdXJjZURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXJlc291cmNlRGVzY3JpcHRvcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nKFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgdGhpcywgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGd1aWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3VpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXJpQmFzZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmlCYXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZQotCS8vCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnVtYWYuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpCi0JICovCi0JcHVibGljIEVPYmplY3QgZVJlc29sdmVQcm94eShJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKLQkJcmV0dXJuIHN1cGVyLmVSZXNvbHZlUHJveHkocHJveHkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjcmVzb2x2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZSgpIHsKLQkJVVJJIGJhc2UgPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRGaW5hbFVSSShlUmVzb3VyY2UoKSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvckltcGwgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3JJbXBsKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGRlc2MucmVzb2x2ZWRVUkkgPSBVUkkuY3JlYXRlVVJJKGRlc2MuZ2V0VXJpKCkpLnJlc29sdmUoYmFzZSk7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIjZGVyZXNvbHZlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZXJlc29sdmUoKSB7Ci0JCVVSSSBiYXNlID0gTXVsdGlGaWxlU2F2ZVV0aWwuZ2V0RmluYWxVUkkoZVJlc291cmNlKCkpOwotICAgICAgICAvLyBjb252ZXJ0IHBhdGggaW4gYWxsIGRlc2NyaXB0b3JzIHRvIHJlbGF0aXZlCi0gICAgICAgIC8vCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGdldFJlc291cmNlRGVzY3JpcHRvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFJlc291cmNlRGVzY3JpcHRvciBkZXNjID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICBkZXNjLnNldFVyaShkZXNjLmdldFJlc29sdmVkVVJJKCkuZGVyZXNvbHZlKGJhc2UpLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNyZW1vdmVSZXNvdXJjZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTGlzdCByZW1vdmVSZXNvdXJjZURlc2NyaXB0b3IoVVJJIHVyaSwgYm9vbGVhbiBjbGVhckZvbGRlcikgewotCQlBcnJheUxpc3QgcmVtb3ZlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlbW92ZWREZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmKHVyaS5lcXVhbHMoZGVzYy5nZXRSZXNvbHZlZFVSSSgpLnRyaW1GcmFnbWVudCgpKSkgewotICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0vLyAgICAgICAgICAgICAgICByZW1vdmVkRGVzY3JpcHRvciA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0vLyAgICAgICAgaWYocmVtb3ZlZERlc2NyaXB0b3IgIT0gbnVsbCkgeyAgICAgICAgCQotICAgICAgICAJaWYoY2xlYXJGb2xkZXIpIHsKLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGNoaWxkIGRlc2NyaXB0b3JzIG9mIHRoZSByZW1vdmVkIGRlc2NyaXB0b3IKLSAgICAgICAgCQkvLwotICAgICAgICAJCVN0cmluZyBvbGREaXIgPSBuZXcgRmlsZSh1cmkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3I7Ci0gICAgICAgIAkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAJCQlSZXNvdXJjZURlc2NyaXB0b3IgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpOwotICAgICAgICAJCQlpZihkZXNjLmdldFJlc29sdmVkVVJJKCkudG9GaWxlU3RyaW5nKCkuc3RhcnRzV2l0aChvbGREaXIpKSB7Ci0gICAgICAgIAkJCQlpdGVyLnJlbW92ZSgpOwotICAgICAgICAJCQkJcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotICAgICAgICAJCQl9Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotLy8gICAgICAgIAllbHNlIHsKLS8vICAgICAgICAJCS8vIHJlbW92ZSBhbGwgdGhlIGRlc2NyaXB0b3JzIG9mIHRoZSBzYW1lIHJlc291cmNlCi0vLyAgICAgICAgCQkvLwotLy8gICAgICAgIAkJVVJJIHJlc1VyaSA9IHJlbW92ZWREZXNjcmlwdG9yLmdldFJlc29sdmVkVVJJKCkudHJpbUZyYWdtZW50KCk7Ci0vLyAgICAgICAgCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLyAgICAgICAgCQkJUmVzb3VyY2VEZXNjcmlwdG9yIGRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLS8vICAgICAgICAJCQlpZihkZXNjLmdldFJlc29sdmVkVVJJKCkudHJpbUZyYWdtZW50KCkuZXF1YWxzKHJlc1VyaSkpIHsKLS8vICAgICAgICAJCQkJaXRlci5yZW1vdmUoKTsKLS8vICAgICAgICAJCQkJcmVtb3ZlZExpc3QuYWRkKGRlc2MpOwotLy8gICAgICAgIAkJCX0KLS8vICAgICAgICAJCX0gICAgICAgIAkJCi0vLyAgICAgICAgCX0KLS8vICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZW1vdmVkTGlzdDsKLQl9CQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VEZXNjcmlwdG9yIGdldFJlc291cmNlRGVzY3JpcHRvcihTdHJpbmcgZ3VpZCkgewotCQlpZihpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwID09IG51bGwpIHsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJCi0JCQllQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgewotCQkgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkgICAgICAgICAgICBSZXNvdXJjZURlc2NyaXB0b3IgZGVzYzsKLQkJICAgICAgICAgICAgc3dpdGNoKG1zZy5nZXRGZWF0dXJlSUQoUmVzb3VyY2VNYW5hZ2VyLmNsYXNzKSkgewotCQkgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1JFU09VUkNFX0RFU0NSSVBUT1JTOgotCQkgICAgICAgICAgICAgICAgICAgIHN3aXRjaChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IChSZXNvdXJjZURlc2NyaXB0b3IpbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQkJCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbiltc2cuZ2V0TmV3VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgewotCQkJCQkJCQkJCWRlc2MgPSAoUmVzb3VyY2VEZXNjcmlwdG9yKSBpdGVyLm5leHQoKTsKLQkJCQkJCQkJCQlpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCQkgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwLnJlbW92ZSgoKFJlc291cmNlRGVzY3JpcHRvciltc2cuZ2V0T2xkVmFsdWUoKSkuZ2V0SWQoKSk7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKW1zZy5nZXRPbGRWYWx1ZSgpKS5pdGVyYXRvcigpOyBpdGVyCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNOZXh0KCk7KSB7Ci0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5yZW1vdmUoKChSZXNvdXJjZURlc2NyaXB0b3IpIGl0ZXIubmV4dCgpKS5nZXRJZCgpKTsKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQkJICAgICAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICB9Ci0KLQkJCX0pOwotCQkJCi0JCQkvLyBwb3B1bGF0ZSB0aGUgbWFwCi0JCQkvLwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVJlc291cmNlRGVzY3JpcHRvciBlbGVtZW50ID0gKFJlc291cmNlRGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJaWRUb1Jlc291cmNlRGVzY3JpcHRvck1hcC5wdXQoZWxlbWVudC5nZXRJZCgpLCBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIChSZXNvdXJjZURlc2NyaXB0b3IpIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAuZ2V0KGd1aWQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRTdWJNYW5hZ2VycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJcmV0dXJuIGdldEd1aWQoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlyZXR1cm4gZ2V0VXJpQmFzZSgpOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUzoKLQkJCQlyZXR1cm4gZ2V0U3ViTWFuYWdlcnMoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fR1VJRDoKLQkJCQlzZXRHdWlkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlzZXRVcmlCYXNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJZ2V0U3ViTWFuYWdlcnMoKS5jbGVhcigpOwotCQkJCWdldFN1Yk1hbmFnZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2VEZXNjcmlwdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19HVUlEOgotCQkJCXNldEd1aWQoR1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFOgotCQkJCXNldFVyaUJhc2UoVVJJX0JBU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19TVUJfTUFOQUdFUlM6Ci0JCQkJZ2V0U3ViTWFuYWdlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUzoKLQkJCQlnZXRSZXNvdXJjZURlc2NyaXB0b3JzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLS8vVU1BLS0+Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZVdpdGhPdmVycmlkZW5EZWZhdWx0VmFsdWUoZmVhdHVyZUlEKTsKLQkJaWYoZmVhdHVyZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldChmZWF0dXJlKTsKLQkJfQotLy9VTUE8LS0JCQotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX01BTkFHRVJfX0dVSUQ6Ci0JCQkJcmV0dXJuIEdVSURfRURFRkFVTFQgPT0gbnVsbCA/IGd1aWQgIT0gbnVsbCA6ICFHVUlEX0VERUZBVUxULmVxdWFscyhndWlkKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSX19VUklfQkFTRToKLQkJCQlyZXR1cm4gVVJJX0JBU0VfRURFRkFVTFQgPT0gbnVsbCA/IHVyaUJhc2UgIT0gbnVsbCA6ICFVUklfQkFTRV9FREVGQVVMVC5lcXVhbHModXJpQmFzZSk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fU1VCX01BTkFHRVJTOgotCQkJCXJldHVybiBzdWJNYW5hZ2VycyAhPSBudWxsICYmICFzdWJNYW5hZ2Vycy5pc0VtcHR5KCk7Ci0JCQljYXNlIFJlc291cmNlbWFuYWdlclBhY2thZ2UuUkVTT1VSQ0VfTUFOQUdFUl9fUkVTT1VSQ0VfREVTQ1JJUFRPUlM6Ci0JCQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcnMgIT0gbnVsbCAmJiAhcmVzb3VyY2VEZXNjcmlwdG9ycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlTWFuYWdlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZihpZFRvUmVzb3VyY2VEZXNjcmlwdG9yTWFwICE9IG51bGwpIHsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAuY2xlYXIoKTsKLQkJCWlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXAgPSBudWxsOwotCQl9Ci0JCQotCQllQWRhcHRlcnMoKS5jbGVhcigpOwkJCi0JCQotCQkvLyBkaXNwb3NlIHRoZSBzdWIgbWFuYWdlcnMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChJbnRlcm5hbEVMaXN0KWdldFN1Yk1hbmFnZXJzKCkpLmJhc2ljSXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZU1hbmFnZXIgc3ViTWdyID0gKFJlc291cmNlTWFuYWdlcikgaXRlci5uZXh0KCk7Ci0JCQlpZighKChJbnRlcm5hbEVPYmplY3Qpc3ViTWdyKS5lSXNQcm94eSgpKSB7Ci0JCQkJc3ViTWdyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgTWFwIGlkVG9SZXNvdXJjZURlc2NyaXB0b3JNYXA7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmNWRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlbWFuYWdlckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlbWFuYWdlckZhY3RvcnkgewotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlbWFuYWdlckZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCVJlc291cmNlbWFuYWdlckZhY3RvcnkgdGhlUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSA9IChSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVJlc291cmNlbWFuYWdlckZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLlJFU09VUkNFX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIFJlc291cmNlRGVzY3JpcHRvciBjcmVhdGVSZXNvdXJjZURlc2NyaXB0b3IoKSB7Ci0JCVJlc291cmNlRGVzY3JpcHRvckltcGwgcmVzb3VyY2VEZXNjcmlwdG9yID0gbmV3IFJlc291cmNlRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyIGNyZWF0ZVJlc291cmNlTWFuYWdlcigpIHsKLQkJUmVzb3VyY2VNYW5hZ2VySW1wbCByZXNvdXJjZU1hbmFnZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VySW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2VNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFJlc291cmNlbWFuYWdlclBhY2thZ2UoKSB7Ci0JCXJldHVybiAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1YjcyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL1Jlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLlJlc291cmNlbWFuYWdlclBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlIHsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIEVDbGFzcyByZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBFQ2xhc3MgcmVzb3VyY2VNYW5hZ2VyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKGVOU19VUkksIFJlc291cmNlbWFuYWdlckZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMKLQkgKiBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gIFNpbXBsZQotCSAqIGRlcGVuZGVuY2llcyBhcmUgc2F0aXNmaWVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2Qgb24gYWxsCi0JICogZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLiAgVGhpcyBtZXRob2QgZHJpdmVzCi0JICogaW5pdGlhbGl6YXRpb24gZm9yIGludGVyZGVwZW5kZW50IHBhY2thZ2VzIGRpcmVjdGx5LCBpbiBwYXJhbGxlbAotCSAqIHdpdGggdGhpcyBwYWNrYWdlLCBpdHNlbGYuCi0JICogPHA+T2YgdGhpcyBwYWNrYWdlIGFuZCBpdHMgaW50ZXJkZXBlbmRlbmNpZXMsIGFsbCBwYWNrYWdlcyB3aGljaAotCSAqIGhhdmUgbm90IHlldCBiZWVuIHJlZ2lzdGVyZWQgYnkgdGhlaXIgVVJJIHZhbHVlcyBhcmUgZmlyc3QgY3JlYXRlZAotCSAqIGFuZCByZWdpc3RlcmVkLiAgVGhlIHBhY2thZ2VzIGFyZSB0aGVuIGluaXRpYWxpemVkIGluIHR3byBzdGVwczoKLQkgKiBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIGFsbCBvZiB0aGUgcGFja2FnZXMgYXJlIGNyZWF0ZWQgYmVmb3JlIGFueQotCSAqIGFyZSBpbml0aWFsaXplZCwgc2luY2Ugb25lIHBhY2thZ2UncyBtZXRhLW1vZGVsIG9iamVjdHMgbWF5IHJlZmVyIHRvCi0JICogdGhvc2Ugb2YgYW5vdGhlci4KLQkgKiA8cD5JbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBhbnkgcGFja2FnZXMgdGhhdCBoYXZlCi0JICogYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSBpbml0KCkgewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJUmVzb3VyY2VtYW5hZ2VyUGFja2FnZUltcGwgdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZSA9IChSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIDogbmV3IFJlc291cmNlbWFuYWdlclBhY2thZ2VJbXBsKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVSZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQ2xhc3MgZ2V0UmVzb3VyY2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9JZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1hbmFnZXJfR3VpZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJlc291cmNlTWFuYWdlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlTWFuYWdlcl9VcmlCYXNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcmVzb3VyY2VNYW5hZ2VyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VNYW5hZ2VyX1Jlc291cmNlRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VtYW5hZ2VyRmFjdG9yeSBnZXRSZXNvdXJjZW1hbmFnZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKFJlc291cmNlbWFuYWdlckZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKSB7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJcmVzb3VyY2VEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFU09VUkNFX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRGVzY3JpcHRvckVDbGFzcywgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJlc291cmNlRGVzY3JpcHRvckVDbGFzcywgUkVTT1VSQ0VfREVTQ1JJUFRPUl9fVVJJKTsKLQotCQlyZXNvdXJjZU1hbmFnZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVTT1VSQ0VfTUFOQUdFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19HVUlEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX1VSSV9CQVNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZXNvdXJjZU1hbmFnZXJFQ2xhc3MsIFJFU09VUkNFX01BTkFHRVJfX1NVQl9NQU5BR0VSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSRVNPVVJDRV9NQU5BR0VSX19SRVNPVVJDRV9ERVNDUklQVE9SUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyhyZXNvdXJjZURlc2NyaXB0b3JFQ2xhc3MsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIlJlc291cmNlRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXRSZXNvdXJjZURlc2NyaXB0b3JfSWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgUmVzb3VyY2VEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldFJlc291cmNlRGVzY3JpcHRvcl9VcmkoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaSIsIG51bGwsIDAsIDEsIFJlc291cmNlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MocmVzb3VyY2VNYW5hZ2VyRUNsYXNzLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICJSZXNvdXJjZU1hbmFnZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VNYW5hZ2VyX0d1aWQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImd1aWQiLCBudWxsLCAwLCAxLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UmVzb3VyY2VNYW5hZ2VyX1VyaUJhc2UoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInVyaUJhc2UiLCBudWxsLCAwLCAxLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UmVzb3VyY2VNYW5hZ2VyX1N1Yk1hbmFnZXJzKCksIHRoaXMuZ2V0UmVzb3VyY2VNYW5hZ2VyKCksIG51bGwsICJzdWJNYW5hZ2VycyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXRSZXNvdXJjZU1hbmFnZXJfUmVzb3VyY2VEZXNjcmlwdG9ycygpLCB0aGlzLmdldFJlc291cmNlRGVzY3JpcHRvcigpLCBudWxsLCAicmVzb3VyY2VEZXNjcmlwdG9ycyIsIG51bGwsIDAsIC0xLCBSZXNvdXJjZU1hbmFnZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCUVPcGVyYXRpb24gb3AgPSBhZGRFT3BlcmF0aW9uKHJlc291cmNlTWFuYWdlckVDbGFzcywgdGhpcy5nZXRSZXNvdXJjZURlc2NyaXB0b3IoKSwgImdldFJlc291cmNlRGVzY3JpcHRvciIsIDAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVQYXJhbWV0ZXIob3AsIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJndWlkIiwgMCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIwZDM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFmYzUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtYW5hZ2luZyBYTUkgcmVzb3VyY2VzIGluIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDFjOGI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InJlc291cmNlbWFuYWdlciIKLSAgICBuc1VSST0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZURlc2NyaXB0b3IiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VNYW5hZ2VyIj4KLSAgICA8ZU9wZXJhdGlvbnMgbmFtZT0iZ2V0UmVzb3VyY2VEZXNjcmlwdG9yIiBlVHlwZT0iIy8vUmVzb3VyY2VEZXNjcmlwdG9yIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2V0cyBkaXJlY3QgUmVzb3VyY2VEZXNjcmlwdG9yIHdob3NlIGlkIGlzIHRoZSBnaXZlbiBndWlkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlUGFyYW1ldGVycyBuYW1lPSJndWlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPC9lT3BlcmF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cmlCYXNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1Yk1hbmFnZXJzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlTWFuYWdlciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzb3VyY2VEZXNjcmlwdG9ycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZURlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3Jlc291cmNlbWFuYWdlci5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiNzljNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci9yZXNvdXJjZW1hbmFnZXIuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iUmVzb3VyY2VtYW5hZ2VyIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIucHJvdmlkZXIuUmVzb3VyY2VtYW5hZ2VyRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5wcmVzZW50YXRpb24uUmVzb3VyY2VtYW5hZ2VyRWRpdG9yUGx1Z2luIgotICAgIG5vbk5MU01hcmtlcnM9InRydWUiIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0IgotICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdCIgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIKLSAgICBzdXBwcmVzc0VNRlR5cGVzPSJ0cnVlIiBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb250YWlubWVudFByb3hpZXM9InRydWUiPgotICA8Zm9yZWlnbk1vZGVsPkM6XENDX1ZpZXdzXHBsZV9UTkdfQXV0aG9yaW5nXHRuZ19hdXRob3JpbmdcVE5HIFVNTCBNb2RlbHNccmVzb3VyY2VtYW5hZ2VyLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJSZXNvdXJjZW1hbmFnZXIiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGVjb3JlUGFja2FnZT0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8iPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VEZXNjcmlwdG9yL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VEZXNjcmlwdG9yL3VyaSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9ndWlkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL3VyaUJhc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL3N1Yk1hbmFnZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHJlc291cmNlbWFuYWdlci5lY29yZSMvL1Jlc291cmNlTWFuYWdlci9yZXNvdXJjZURlc2NyaXB0b3JzIi8+Ci0gICAgICA8Z2VuT3BlcmF0aW9ucyBlY29yZU9wZXJhdGlvbj0icmVzb3VyY2VtYW5hZ2VyLmVjb3JlIy8vUmVzb3VyY2VNYW5hZ2VyL2dldFJlc291cmNlRGVzY3JpcHRvciI+Ci0gICAgICAgIDxnZW5QYXJhbWV0ZXJzIGVjb3JlUGFyYW1ldGVyPSJyZXNvdXJjZW1hbmFnZXIuZWNvcmUjLy9SZXNvdXJjZU1hbmFnZXIvZ2V0UmVzb3VyY2VEZXNjcmlwdG9yL2d1aWQiLz4KLSAgICAgIDwvZ2VuT3BlcmF0aW9ucz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzMwZDVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkFkYXB0ZXIgRmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGFuIGFkYXB0ZXIgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgewotCQotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBSZXNvdXJjZW1hbmFnZXJQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoZSBzd2l0Y2ggdGhlIGRlbGVnYXRlcyB0byB0aGUgPGNvZGU+Y3JlYXRlWFhYPC9jb2RlPiBtZXRob2RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBSZXNvdXJjZW1hbmFnZXJTd2l0Y2ggbW9kZWxTd2l0Y2ggPQotCQluZXcgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoKCkgewotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VEZXNjcmlwdG9yKFJlc291cmNlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VEZXNjcmlwdG9yQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VNYW5hZ2VyKFJlc291cmNlTWFuYWdlciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VNYW5hZ2VyQWRhcHRlcigpOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKW1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yIDxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLSAgICAgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlc291cmNlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIgPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotICAgICAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVzb3VyY2VNYW5hZ2VyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KLSAgICAgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmVzb3VyY2VtYW5hZ2VyL3V0aWwvUmVzb3VyY2VtYW5hZ2VyU3dpdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYTQ3YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9SZXNvdXJjZW1hbmFnZXJTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmVzb3VyY2VtYW5hZ2VyLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJlc291cmNlbWFuYWdlci5SZXNvdXJjZW1hbmFnZXJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VtYW5hZ2VyUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VtYW5hZ2VyU3dpdGNoIHsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJlc291cmNlbWFuYWdlclBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBSZXNvdXJjZW1hbmFnZXJTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9ERVNDUklQVE9SOiB7Ci0JCQkJUmVzb3VyY2VEZXNjcmlwdG9yIHJlc291cmNlRGVzY3JpcHRvciA9IChSZXNvdXJjZURlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlRGVzY3JpcHRvcihyZXNvdXJjZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgUmVzb3VyY2VtYW5hZ2VyUGFja2FnZS5SRVNPVVJDRV9NQU5BR0VSOiB7Ci0JCQkJUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciA9IChSZXNvdXJjZU1hbmFnZXIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVJlc291cmNlTWFuYWdlcihyZXNvdXJjZU1hbmFnZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlRGVzY3JpcHRvcihSZXNvdXJjZURlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXNvdXJjZSBNYW5hZ2VyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0gICAgICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlIE1hbmFnZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIHB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlTWFuYWdlcihSZXNvdXJjZU1hbmFnZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0gICAgICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotICAgICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2Uvc3JjL29yZy9lY2xpcHNlL2VwZi9yZXNvdXJjZW1hbmFnZXIvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4N2Q2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3Jlc291cmNlbWFuYWdlci91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIG1hbmFnaW5nIFhNSSByZXNvdXJjZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2NiM2RjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNWFhZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5YTUlMaWJyYXJ5VUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYudWksCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEyNmNhOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFhNSSBMaWJyYXJ5IFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLW5ld1hNSUxpYnJhcnlXaXphcmRQYWdlVGl0bGU9Q3JlYXRlIGEgbmV3IFhNSSBtZXRob2QgbGlicmFyeS4KLW5ld1hNSUxpYnJhcnlXaXphcmRQYWdlRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgbG9jYXRpb24gZm9yIHRoZSBtZXRob2QgbGlicmFyeS4gVGhlIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgd2lsbCBiZSBzdG9yZWQgaW4gYSBmb2xkZXIsIG5hbWVkIGFmdGVyIHRoZSBsaWJyYXJ5LCBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotb3BlblhNSUxpYnJhcnlXaXphcmRQYWdlVGl0bGU9T3BlbiBhIFhNSSBtZXRob2QgbGlicmFyeS4KLW9wZW5YTUlMaWJyYXJ5V2l6YXJkUGFnZURlc2NyaXB0aW9uPVNwZWNpZnkgdGhlIGxvY2F0aW9uIGZvciB0aGUgbWV0aG9kIGxpYnJhcnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiZWU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmV3TGlicmFyeVdpemFyZFBhZ2VzIj4KLSAgICAgIDxuZXdMaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5OZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZSIKLSAgICAgICAgICAgIHR5cGU9InhtaSIKLSAgICAgICAgICAgIHRpdGxlPSIlbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlbmV3WE1JTGlicmFyeVdpemFyZFBhZ2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8L25ld0xpYnJhcnlXaXphcmRQYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZFBhZ2VzIj4KLSAgICAgIDxvcGVuTGlicmFyeVdpemFyZFBhZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlIgotICAgICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgICAgdGl0bGU9IiVvcGVuWE1JTGlicmFyeVdpemFyZFBhZ2VUaXRsZSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlb3BlblhNSUxpYnJhcnlXaXphcmRQYWdlRGVzY3JpcHRpb24iPgotICAgICAgPC9vcGVuTGlicmFyeVdpemFyZFBhZ2U+Ci0gICA8L2V4dGVuc2lvbj4gICAKLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm1pZ3JhdG9ycyI+Ci0gICAgICA8bWlncmF0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uLk1pZ3JhdG9yMTAyXzEwMyIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIvPgotICAgICAgPG1pZ3JhdG9yCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbi5NaWdyYXRvcjEwMyIKLSAgICAgICAgICAgIGxpYk5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL05ld1hNSUxpYnJhcnlXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNjAwOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvTmV3WE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTmV3TGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5wcmVmZXJlbmNlcy5YTUlMaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIGZvciBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdYTUlMaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIE5ld0xpYnJhcnlXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQotCXByaXZhdGUgQ29tYm8gbG9jYXRpb25Db21ibzsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld1hNSUxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJc3VwZXIocGFnZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJTGFiZWwgbmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCW5hbWVMYWJlbC5zZXRUZXh0KFhNSUxpYnJhcnlVSVJlc291cmNlcy5uYW1lTGFiZWxfdGV4dCk7Ci0KLQkJbmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmFtZVRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCi0JCUxhYmVsIGxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uTGFiZWwuc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMubG9jYXRpb25MYWJlbF90ZXh0KTsKLQotCQlsb2NhdGlvbkNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWxvY2F0aW9uQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlsb2NhdGlvbkNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWZpbmFsIEJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuYnJvd3NlQnV0dG9uX3RleHQpOwotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCWxvY2F0aW9uQ29tYm8uYWRkKHNlbGVjdGVkRGlyLCAwKTsKLQkJCQkJCWxvY2F0aW9uQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCWZpbmFsIEJ1dHRvbiBkZWZhdWx0UGF0aENoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWRlZmF1bHRQYXRoQ2hlY2tib3gKLQkJCQkuc2V0VGV4dChYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuZGVmYXVsdFBhdGhDaGVja2JveExhYmVsX3RleHQpOwotCQlkZWZhdWx0UGF0aENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZGVmYXVsdFBhdGhDaGVja2JveC5nZXRTZWxlY3Rpb24oKSkgewotCQkJCQlsb2NhdGlvbkNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCQkJbG9jYXRpb25Db21iby5zZXRUZXh0KFhNSUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCQkJCS5nZXREZWZhdWx0TGlicmFyeVBhdGgoKSk7Ci0JCQkJCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJCQlsb2NhdGlvbkNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbG9jYXRpb25Db21iby5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2Ujb25FbnRlclBhZ2UoT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIG9uRW50ZXJQYWdlKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIGxpYnJhcnlOYW1lID0gKFN0cmluZykgb2JqOwotCQkJbmFtZVRleHQuc2V0VGV4dChsaWJyYXJ5TmFtZSk7Ci0JCX0KLQotCQlpZiAoZ2V0TGlicmFyeVBhdGgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlsb2NhdGlvbkNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJCWxvY2F0aW9uQ29tYm8KLQkJCQkJLnNldFRleHQoWE1JTGlicmFyeVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQkJCWxvY2F0aW9uQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc0NvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5UGF0aCgpLmxlbmd0aCgpID4gMCAmJiBnZXRMaWJyYXJ5TmFtZSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2dldE5leHRQYWdlKCkKLQkgKi8KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0TmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlyZXR1cm4gbmFtZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaWJyYXJ5IHNwZWNpZmljIHVzZXIgc2VsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFNlbGVjdGlvbnMoKSB7Ci0JCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKGdldExpYnJhcnlQYXRoKCksIGdldExpYnJhcnlOYW1lKCkpOwotCQlvcHRpb25zLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBsaWJyYXJ5UGF0aAotCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBvcHRpb25zOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1NmVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9PcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkucHJlZmVyZW5jZXMuWE1JTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwYXRoIGZvciBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuWE1JTGlicmFyeVdpemFyZFBhZ2UgZXh0ZW5kcyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBDb21ibyBsb2NhdGlvbkNvbWJvOwotCi0JcHJpdmF0ZSBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQpIHsKLQkJc3VwZXIocGFnZUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMubG9jYXRpb25MYWJlbF90ZXh0KTsKLQotCQlsb2NhdGlvbkNvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlKTsKLQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWxvY2F0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZpbmFsIFNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJZmluYWwgQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IGNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsCi0JCQkJWE1JTGlicmFyeVVJUmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGdldExpYnJhcnlQYXRoKCkpOwotCQkJCQlTdHJpbmcgc2VsZWN0ZWREaXIgPSBkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQkJbG9jYXRpb25Db21iby5hZGQoc2VsZWN0ZWREaXIsIDApOwotCQkJCQkJbG9jYXRpb25Db21iby5zZXRUZXh0KHNlbGVjdGVkRGlyKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChnZXRMaWJyYXJ5UGF0aCgpLmxlbmd0aCgpID09IDApIHsKLQkJCWxvY2F0aW9uQ29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJbG9jYXRpb25Db21ibwotCQkJCQkuc2V0VGV4dChYTUlMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCQkJbG9jYXRpb25Db21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlQYXRoKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBsb2NhdGlvbkNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBzcGVjaWZpYyB1c2VyIHNlbGVjdGlvbnMuCi0JICovCi0JcHVibGljIE1hcCBnZXRTZWxlY3Rpb25zKCkgewotCQlNYXAgb3B0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShnZXRMaWJyYXJ5UGF0aCgpKTsKLQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzM1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikKLW5hbWVMYWJlbF90ZXh0PU5hbWU6Ci1sb2NhdGlvbkxhYmVsX3RleHQ9TG9jYXRpb246Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLWRlZmF1bHRQYXRoQ2hlY2tib3hMYWJlbF90ZXh0PVVzZSB0aGUgZGVmYXVsdCBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9YTUlMaWJyYXJ5VUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFlMzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGZvciB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pPC9jb2RlPgotICogcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBYTUlMaWJyYXJ5VUlQbHVnaW4uY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFhNSUxpYnJhcnlVSVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgWE1JTGlicmFyeVVJUGx1Z2luKCkgewotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1JTGlicmFyeVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9YTUlMaWJyYXJ5VUlSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWJmMGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL1hNSUxpYnJhcnlVSVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFhNSUxpYnJhcnlVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUxhYmVsX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFBhdGhDaGVja2JveExhYmVsX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUlMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4NTMzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLmh0bWwuSFRNTEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuVGV4dFJlZmVyZW5jZVJlcGxhY2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBoZWxwIG1pZ3JhdGUgYW5kIGZvcm1hdCB0aGUgaHRtbCBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIEpJbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25VdGlsIHsKLQkKLQlwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGNkYXRhRmVhdHVyZU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXN0YXRpYyB7Ci0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWx0ZXJuYXRpdmVzIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJtYWluRGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImhvd1RvU3RhZmYiKTsgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImtleUNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJwdXJwb3NlIik7IC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY29wZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInVzYWdlTm90ZXMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgic2tpbGxzIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYXNzaWdubWVudEFwcHJvYWNoZXMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzeW5vbnltcyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInNlY3Rpb25EZXNjcmlwdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImltcGFjdE9mTm90SGF2aW5nIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicmVhc29uc0Zvck5vdE5lZWRpbmciKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJicmllZk91dGxpbmUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyZXByZXNlbnRhdGlvbk9wdGlvbnMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJ1c2FnZUd1aWRhbmNlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicmVmaW5lZERlc2NyaXB0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWN0aXZpdHlFbnRyeVN0YXRlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiYWN0aXZpdHlFeGl0U3RhdGUiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJleHRlcm5hbERlc2NyaXB0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicGFja2FnaW5nR3VpZGFuY2UiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhZGRpdGlvbmFsSW5mbyIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInByb2JsZW0iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJiYWNrZ3JvdW5kIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgiZ29hbHMiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJhcHBsaWNhdGlvbiIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImxldmVsc09mQWRvcHRpb24iKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJzY2FsZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInByb2plY3RDaGFyYWN0ZXJpc3RpY3MiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJyaXNrTGV2ZWwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJlc3RpbWF0aW5nVGVjaG5pcXVlIik7ICAvLyROT04tTkxTLTEkCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgicHJvamVjdE1lbWJlckV4cGVydGlzZSIpOyAgLy8kTk9OLU5MUy0xJAotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInR5cGVPZkNvbnRyYWN0Iik7ICAvLyROT04tTkxTLTEkCi0JCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0bWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmKSB7Ci0JCXJldHVybiBjZGF0YUZlYXR1cmVOYW1lcy5jb250YWlucyhmLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZvcm1hdFZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCi0JCQlIVE1MRm9ybWF0dGVyIGZvcm1hdGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQkJCQotCQkJaWYgKFJlc291cmNlSGVscGVyLmdldERlZmF1bHRSZXNvdXJjZU1ncigpID09IG51bGwpIHsKLQkJCQlSZXNvdXJjZUhlbHBlci5zZXREZWZhdWx0UmVzb3VyY2VNZ3IobmV3IFhNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIoKSk7Ci0JCQl9Ci0JCQkKLQkJCWJvb2xlYW4gc2VlbiA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVByb3BlcnR5IHByb3BlcnR5ID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBwcm9wZXJ0eQotCQkJCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCQkKLS8vCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMKLS8vCQkJCQkJCS5nZXQoaSk7Ci0vLwkKLQkJCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJCQlPYmplY3QgbmV3VmFsdWUgPSB2YWx1ZTsKLQkJCQkJaWYgKGlzSHRtbEZlYXR1cmUoZmVhdHVyZSkgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJCWlmICghIHNlZW4gJiYgbG9jYWxEZWJ1ZykgewkJCQkJCQkKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBlbGVtZW50OiAiICsgZWxlbWVudC5lQ2xhc3MoKS5nZXROYW1lKCkpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzZWVuID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJdHJ5IHsKLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgc3RyMCA9IHZhbGlkYXRlR3VpZEF0dHJpYnV0ZSgoU3RyaW5nKSB2YWx1ZSk7CQkJCQkJCQotCQkJCQkJCVN0cmluZyBzdHIxID0gUmVzb3VyY2VIZWxwZXIudmFsaWRhdGVDb250ZW50KGVsZW1lbnQsIHN0cjApOwotCQkJCQkJCQotCQkJCQkJCW5ld1ZhbHVlID0gZm9ybWF0ZXIuZm9ybWF0SFRNTCgoU3RyaW5nKSBzdHIxKTsKLQotCQkJCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZlYXR1cmU6ICIgKyBmZWF0dXJlLmdldE5hbWUoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdHIwOiAiICsgdmFsdWUpOwkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmICghIHN0cjEuZXF1YWxzKHN0cjApKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzdHIxOiAiICsgc3RyMSk7CQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghIG5ld1ZhbHVlLmVxdWFscyhzdHIxKSkgewotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3VmFsdWU6ICIgKyBuZXdWYWx1ZSk7CQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotLy8JCQkJCQkJbmV3VmFsdWUgPSBzdHIyOwotCQkJCQkJCQotCQkJCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gTm90IGNoYW5nZSB2YWx1ZSBpZiBpdCBjYW5ub3QgYmUgZm9ybWF0dGVkCi0JCQkJCQkJLy8gU2hvdWxkIGFsc28gd3JpdGUgdG8gbG9nIGZvciB1c2VyIGF0dGVudGlvbgotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB2YWxpZGF0ZUd1aWRBdHRyaWJ1dGUoU3RyaW5nIHNvdXJjZSkgewotCQlTdHJpbmcgc3RyID0gdmFsaWRhdGVHdWlkQXR0cmlidXRlKHNvdXJjZSwgIFJlc291cmNlSGVscGVyLnBfbGlua19yZWYpOwotCQlzdHIgPSB2YWxpZGF0ZUd1aWRBdHRyaWJ1dGUoc3RyLCBSZXNvdXJjZUhlbHBlci5wX2FyZWFfcmVmKTsKLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlR3VpZEF0dHJpYnV0ZShTdHJpbmcgc291cmNlLCBQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlNYXRjaGVyIG0gPSBwYXR0ZXJuLm1hdGNoZXIoc291cmNlKTsKLQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwotCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dDsJCQkKLQkJCQotCQkJTWFwIGF0dHJpYnV0ZU1hcCA9IFJlc291cmNlSGVscGVyLmdldEF0dHJpYnV0ZXNGcm9tTGluayhwYXR0ZXJuLCB0ZXh0KTsKLQkJCQotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB0ZXh0OiAgICAgICIgKyB0ZXh0KTsJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdHRyaWJ1dGVNYXA6ICIgKyBhdHRyaWJ1dGVNYXApOwkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlTdHJpbmcgZ3VpZCA9IGF0dHJpYnV0ZU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfR1VJRCk7Ci0JCQlTdHJpbmcgaHJlZiA9IGF0dHJpYnV0ZU1hcCA9PSBudWxsID8gbnVsbCA6IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfSFJFRik7Ci0KLQkJCWludCBpeDAgPSAtMTsKLQkJCWludCBpeDEgPSAtMTsKLQkJCWlmIChndWlkID09IG51bGwgJiYgaHJlZiAhPSBudWxsKSB7Ci0JCQkJaXgwID0gaHJlZi5sYXN0SW5kZXhPZigiLCIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJCQlpeDEgPSBocmVmLmxhc3RJbmRleE9mKCIuaHRtbCIpOwkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCWlmIChpeDAgPj0gMCAmJiBpeDEgPiBpeDApIHsKLQkJCQkKLQkJCQlndWlkID0gaHJlZi5zdWJzdHJpbmcoaXgwICsgMSwgaXgxKTsKLQkJCQkvL1RvIGRvOiB2YWxpZGF0ZSBpZiBndWlkIGlzIHZhbGlkIGhlcmUsIG90aGVyd2lzZSwgbm8gcmVwbGFjZW1lbnQKLQkJCQkKLQkJCQlTdHJpbmcgcmVwbGFjZWQgPSBocmVmICsgIlwiIjsgIC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcmVwbGFjaW5nID0gaHJlZiArICJcIiBndWlkPVwiIitndWlkICsgIlwiIjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLy9yZXBsYWNlbWVudCA9IFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwucmVwbGFjZUFsbCh0ZXh0LCByZXBsYWNlZCwgcmVwbGFjaW5nKTsKLQkJCQlyZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZShyZXBsYWNlZCwgcmVwbGFjaW5nKTsKLQotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICByZXBsYWNlZDogIiArIHJlcGxhY2VkKTsJLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiByZXBsYWNpbmc6ICIgKyByZXBsYWNpbmcpOwkvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7CQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQkJCQotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgTWF0Y2hlci5xdW90ZVJlcGxhY2VtZW50KHJlcGxhY2VtZW50KSk7CQkJCQotCQl9Ci0JCW0uYXBwZW5kVGFpbChzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODVjZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRUNvbnRlbnRzRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MaW5rSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRpb25SZXNvdXJjZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBKdW4gMTIsIDIwMDYKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdG9yMTAyIGV4dGVuZHMgTWlncmF0b3JJbXBsIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHByb3hpZXNUb1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgTWFwIHByb3h5VG9GaWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgbm90Rm91bmRQcm94aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliOwotCi0JcHJpdmF0ZSBNaWdyYXRpb25SZXNvdXJjZUhhbmRsZXIgcmVzb3VyY2VIYW5kbGVyID0gbmV3IE1pZ3JhdGlvblJlc291cmNlSGFuZGxlcigpIHsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBoYW5kbGVVbmtub3duRmVhdHVyZShFT2JqZWN0IG93bmVyLAotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCS8vIE9yZGVyIGdyYXBoIG5vZGVzIG9mIHRhc2sgZGVzY3JpcHRvcnMgaW4gQUREIGJhc2VkIG9uIHRoZWlyIG9yZGVyCi0JCQkvLyBpbiB0aGUgdGFzayBkZXNjcmlwdG9yIGxpc3Qgb2YgdGhlIHJvbGUgZGVzY3JpcHRvcgotCQkJLy8gb2xkIGZlYXR1cmU6IFJvbGVEZXNjcmlwdG9yLnBlcmZvcm1zQXNPd25lcgotCQkJLy8KLQkJCWlmKG93bmVyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IKLQkJCQkJJiYgInBlcmZvcm1zQXNPd25lciIuZXF1YWxzKGZlYXR1cmUuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJCSYmIHZhbHVlICE9IG51bGwpCi0JCQl7Ci0JCQkJQXJyYXlMaXN0IEdVSURzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCUdVSURzLmFkZCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQlpZihHVUlEcy5zaXplKCkgPiAxKSB7Ci0JCQkJCUFjdGl2aXR5IGFjdCA9ICgoUm9sZURlc2NyaXB0b3Ipb3duZXIpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCQlEaWFncmFtIGFkZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VU1BRGlhZ3JhbShhY3QsIEdyYXBoaWNhbERhdGFIZWxwZXIuQUNUSVZJVFlfREVUQUlMX0RJQUdSQU0sIGZhbHNlKTsKLQkJCQkJaWYoYWRkICE9IG51bGwpIHsKLQkJCQkJCU1hcCB0ZEd1aWRUb0dyYXBoTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCQlpbnQgc2l6ZSA9IGFkZC5nZXRDb250YWluZWQoKS5zaXplKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJCU9iamVjdCBlbGVtZW50ID0gYWRkLmdldENvbnRhaW5lZCgpLmdldChpKTsKLQkJCQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgR3JhcGhOb2RlKSB7Ci0JCQkJCQkJCUdyYXBoTm9kZSBncmFwaE5vZGUgPSAoKEdyYXBoTm9kZSllbGVtZW50KTsKLQkJCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBicmlkZ2UgPSBncmFwaE5vZGUuZ2V0U2VtYW50aWNNb2RlbCgpOwotCQkJCQkJCQlpZiAoYnJpZGdlIGluc3RhbmNlb2YgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgewotCQkJCQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9ICgoVU1BU2VtYW50aWNNb2RlbEJyaWRnZSkgYnJpZGdlKS5nZXRFbGVtZW50KCk7CQkJCQkJCQkKLQkJCQkJCQkJCWlmKG1lIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQkJCQkJCQlMaXN0IGxpc3QgPSBncmFwaE5vZGUuZ2V0TGlzdChVbWFQYWNrYWdlLkdSQVBIX05PREVfX1BST1BFUlRZKTsKLQkJCQkJCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShsaXN0LAotCQkJCQkJCQkJCQkJR3JhcGhpY2FsRGF0YUhlbHBlci5QUk9QX1dPUktfUFJPRFVDVF9DT01QT1NJVEVfVFlQRSk7Ci0JCQkJCQkJCQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQkJCQkJLy8gdGhpcyBpcyBub3QgYSBHcmFwaE5vZGUgZm9yIFdvcmtQcm9kdWN0Q29tcG9zaXRlCi0JCQkJCQkJCQkJCS8vIGl0IG11c3QgYmUgYSBHcmFwaE5vZGUgZm9yIGEgVGFza0Rlc2NyaXB0b3IKLQkJCQkJCQkJCQkJLy8KLQkJCQkJCQkJCQkJdGRHdWlkVG9HcmFwaE5vZGVNYXAucHV0KG1lLmdldEd1aWQoKSwgZ3JhcGhOb2RlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIHJlb3JkZXIgdGhlIGdyYXBoIG5vZGVzIHRvIG1hdGNoIG9yZGVyIG9mIHRoZWlyIGxpbmtlZCB0YXNrIGRlc2NyaXB0b3JzCi0JCQkJCQkvLwotCQkJCQkJQXJyYXlMaXN0IGdyYXBoTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgR1VJRHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQlPYmplY3QgZ3JhcGhOb2RlID0gdGRHdWlkVG9HcmFwaE5vZGVNYXAuZ2V0KEdVSURzLmdldChpKSk7Ci0JCQkJCQkJaWYoZ3JhcGhOb2RlICE9IG51bGwpIHsKLQkJCQkJCQkJZ3JhcGhOb2Rlcy5hZGQoZ3JhcGhOb2RlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlhZGQuZ2V0Q29udGFpbmVkKCkucmVtb3ZlQWxsKGdyYXBoTm9kZXMpOwotCQkJCQkJYWRkLmdldENvbnRhaW5lZCgpLmFkZEFsbChncmFwaE5vZGVzKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QQVRIID0gWE1JTGlicmFyeVJlc291cmNlcy5maWxlUGF0aDsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWlncmF0ZShsaWJQYXRoLCBtb25pdG9yLCBudWxsKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5JTWlncmF0b3IjbWlncmF0ZShqYXZhLmxhbmcuU3RyaW5nLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbykKLQkgKi8KLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdE1pZ3JhdGUoKTsKLQkJCi0JCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKGxpYlBhdGgpOwotCi0JCWJvb2xlYW4gdG9WZXJpZnkgPSB0cnVlOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQl0b1ZlcmlmeSA9IGZhbHNlOwotCQl9Ci0JCQotCQlSZXNvdXJjZVV0aWwub3BlbihsaWJGaWxlLmdldFBhcmVudCgpLCBtb25pdG9yKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0IDEuMC4yIGRlZmF1bHQgdmFsdWVzIHNvIGRhdGEgY2FuIGJlIGNvcnJlY3RseSBsb2FkZWQKLQkJCS8vCi0JCQlzZXRPbGREZWZhdWx0VmFsdWVzKCk7Ci0KLQkJCS8vIGxvYWQgdGhlIGxpYnJhcnkKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCi0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlyZXNvdXJjZVNldCA9IG5ldyBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwoZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXNvdXJjZVNldCA9IFBlcnNpc3RlbmNlVXRpbC5nZXRJbXBvcnRQbHVnaW5SZXNvdXJjZVNldCgpOwotCQkJfQotCQkJCQkJCi0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFQ09SRF9VTktOT1dOX0ZFQVRVUkUsIEJvb2xlYW4uVFJVRSk7Ci0JCQlyZXNvdXJjZVNldC5nZXRMb2FkT3B0aW9ucygpLnB1dCgKLQkJCQkJWE1MUmVzb3VyY2UuT1BUSU9OX1JFU09VUkNFX0hBTkRMRVIsIHJlc291cmNlSGFuZGxlcik7Ci0JCQlsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQotCQkJcmVtb3ZlUHJvY2Vzc0NvbnRyaWJ1dGlvbnMobW9uaXRvcik7Ci0KLQkJCS8vIHZlcmlmeSB0aGUgbGlicmFyeQotCQkJLy8KLQkJCS8vIFRPRE86IHVuY29tbWVudCBhZnRlciBleHRlcm5hbGl6ZSB0aGUgdGV4dAotCQkJLy8gdXBkYXRlU3RhdHVzKG1vbml0b3IsICJWZXJpZnlpbmcuLi4iKTsKLQotCQkJaWYgKHRvVmVyaWZ5KSB7Ci0JCQkJRGlzcGxheSBkaXMgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCQlpZiAoZGlzID09IG51bGwgfHwgZGlzLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKLQkJCQkJdmVyaWZ5KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGlzLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl2ZXJpZnkoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCXJlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2VzKG1vbml0b3IpOwotCQkJfQotCQkJCQkJCi0JCQlpZiAodGhpcyBpbnN0YW5jZW9mIE1pZ3JhdG9yMTAyXzEwMykgewotCQkJCUxpbmtJbmZvLnNldExpYnJhcnkobGliKTsKLQkJCX0KLQkJCS8vIGxvYWQgYWxsIGVsZW1lbnRzIGluIG1lbW9yeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkUmVzb3VyY2VzVGFza19uYW1lKTsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQl0cnkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCWlmIChERUJVRykgewotCQkJCQkJCVN5c3RlbS5lcnIKLQkJCQkJCQkJCS5wcmludGxuKCJFcnJvciBpdGVyYXRlIHRocnUgY3Jvc3MgcmVmZXJlbmNlcyBvZiBlbGVtZW50OiAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl1cGRhdGUoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQotCQkJCi0JCQkKLQkJCXJlbW92ZU9sZERlZmF1bHRWYWx1ZXMoKTsKLQotCQkJLy8gY2hlY2sgbW9kaWZpZWQgcmVzb3VyY2VzIGZvciB3cml0YWJsZSBiZWZvcmUgc2F2aW5nIHRoZW0KLQkJCS8vCi0JCQlEaXNwbGF5IGRpcyA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJaWYgKGRpcyA9PSBudWxsIHx8IGRpcy5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkJY2hlY2tNb2RpZmllZFJlc291cmNlcygpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXMuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljaGVja01vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBhbGwgZmlsZXMKLQkJCS8vCi0JCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMuc2F2ZUxpYnJhcnlUYXNrX25hbWUpOwotCQkJTWFwIHNhdmVPcHRpb25zID0gcmVzb3VyY2VTZXQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCk7Ci0JCQlpZiAodG9WZXJpZnkpIHsKLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJCUJvb2xlYW4uVFJVRSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCB0cnVlKTsKLQotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsCi0JCQkJCVBlcnNpc3RlbmNlUmVzb3VyY2VzLnJlZnJlc2hMaWJyYXJ5RmlsZXNUYXNrX25hbWUpOwotCQkJUmVzb3VyY2VVdGlsLnJlZnJlc2hSZXNvdXJjZXMobGliLCBtb25pdG9yKTsKLQkJCW1pZ3JhdGVEaWFncmFtKG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBNaWdyYXRvcjEwMl8xMDMpIHsKLQkJCQlMaW5rSW5mby5zZXRMaWJyYXJ5KG51bGwpOwotCQkJfQotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZVNldC5yZXNldCgpOwotCQkJCXJlc291cmNlU2V0ID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgcHJvY2VzcyBjb250cmlidXRpb25zIGZyb20gYWxsIHBsdWdpbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvY2Vzc0NvbnRyaWJ1dGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlNZXRob2RQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UocGx1Z2luLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnByb2Nlc3NDb250cmlidXRpb25QYXRoKTsKLQkJCWlmIChwa2cgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgQXJyYXlMaXN0KHBrZy5nZXRDaGlsZFBhY2thZ2VzKCkpCi0JCQkJCQkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RQYWNrYWdlIGNoaWxkUGtnID0gKE1ldGhvZFBhY2thZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKEludGVybmFsRU9iamVjdCkgY2hpbGRQa2cpCi0JCQkJCQkJLmVEaXJlY3RSZXNvdXJjZSgpOwotCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmRlbGV0ZShwa2cpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLnJlbW92ZShyZXNvdXJjZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcGtnLmdldENoaWxkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTW9kaWZpZWRSZXNvdXJjZXMoKSB7Ci0JCWRvIHsKLQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbGliLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCQlBcnJheUxpc3QgcmVhZE9ubHlSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlTdHJpbmcgcGx1Z2luSWQgPSBYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpOwotCQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklkLCAwLAotCQkJCQlYTUlMaWJyYXJ5UmVzb3VyY2VzLmNhbm5vdFdyaXRlVG9GaWxlcywgbnVsbCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSAmJiAhZmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJCXJlYWRPbmx5UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7Ci0JCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBwbHVnaW5JZCwgMCwgZmlsZQotCQkJCQkJCS50b1N0cmluZygpLCBudWxsKSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gWE1JTGlicmFyeVJlc291cmNlcy5yZWFkT25seUZpbGVzX3RpdGxlOwotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnJlYWRPbmx5RmlsZXNfbXNnOwotCQkJCUVycm9yRGlhbG9nIGVyckRsZyA9IG5ldyBFcnJvckRpYWxvZyhNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksCi0JCQkJCQl0aXRsZSwgbXNnLCBzdGF0dXMsIElTdGF0dXMuT0sgfCBJU3RhdHVzLklORk8KLQkJCQkJCQkJfCBJU3RhdHVzLldBUk5JTkcgfCBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkJICogCi0JCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJCQkJICovCi0JCQkJCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCQkJLy8gY3JlYXRlIFJldHJ5LCBDYW5jZWwgYW5kIERldGFpbHMgYnV0dG9ucwotCQkJCQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5SRVRSWV9MQUJFTCwgdHJ1ZSk7Ci0KLQkJCQkJCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCQkJCQljcmVhdGVEZXRhaWxzQnV0dG9uKHBhcmVudCk7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiAobm9uLUphdmFkb2MpCi0JCQkJCSAqIAotCQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2cjb3BlbigpCi0JCQkJCSAqLwotCQkJCQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCQkJCQlzaG93RGV0YWlsc0FyZWEoKTsKLQkJCQkJCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JCQkJCX0KLQotCQkJCX07Ci0JCQkJaWYgKGVyckRsZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gd2hpbGUgKHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVVucmVzb2x2ZWRSZWZlcmVuY2VzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocHJveGllc1RvUmVtb3ZlLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJLy8gVE9ETzogdW5jb21tZW50IGFmdGVyIGV4dGVybmFsaXplIHRoZSB0ZXh0Ci0JCS8vIHVwZGF0ZVN0YXR1cyhtb25pdG9yLCAiUmVtb3ZpbmcgdW5yZXNvbHZlZCByZWZlcmVuY2VzIik7Ci0JCUhhc2hTZXQgR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm94aWVzVG9SZW1vdmUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCUdVSURzLmFkZChwcm94eS5lUHJveHlVUkkoKS5mcmFnbWVudCgpKTsKLQkJCUVjb3JlVXRpbC5yZW1vdmUocHJveHkpOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBpdGVyYXRvciA9IChGZWF0dXJlSXRlcmF0b3IpIGVsZW1lbnQKLQkJCQkJLmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG9iaiA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqLmVJc1Byb3h5KCkKLQkJCQkJCSYmIEdVSURzLmNvbnRhaW5zKG9iai5lUHJveHlVUkkoKS5mcmFnbWVudCgpKSkgewotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWZlYXR1cmUuaXNEZXJpdmVkKCkpIHsKLQkJCQkJCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJKChMaXN0KSBlbGVtZW50LmVHZXQoZmVhdHVyZSkpLnJlbW92ZShvYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQllbGVtZW50LmVTZXQoZmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGliCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeSgpIHsKLQkJbm90Rm91bmRQcm94aWVzLmNsZWFyKCk7Ci0JCXByb3hpZXNUb1JlbW92ZS5jbGVhcigpOwotCQlwcm94eVRvRmlsZU1hcC5jbGVhcigpOwotCQlwcm94eVRvRmlsZVdpdGhMb2FkRXJyb3JNYXAuY2xlYXIoKTsKLQkJcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkuY2xlYXIoKTsKLQotCQlDb2xsZWN0aW9uPEVPYmplY3Q+IHByb3hpZXMgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0UHJveGllcyhsaWIpOwotCQlpZiAoIXByb3hpZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJVVJJQ29udmVydGVyIHVyaUNvbnZlcnRlciA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJveGllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgcHJveHkgPSAoSW50ZXJuYWxFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQlVUkkgdXJpID0gcHJveHkuZVByb3h5VVJJKCk7Ci0JCQkJVVJJIG5vcm1hbGl6ZWRVUkkgPSB1cmlDb252ZXJ0ZXIubm9ybWFsaXplKHVyaSk7Ci0JCQkJaWYgKG5vcm1hbGl6ZWRVUkkgPT0gbnVsbCkgewotCQkJCQlwcm94aWVzV2l0aFVubm9ybWFsaXplZFVSSS5hZGQocHJveHkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5vcm1hbGl6ZWRVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCXByb3h5VG9GaWxlTWFwLnB1dChwcm94eSwgZmlsZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UoCi0JCQkJCQkJCQlub3JtYWxpemVkVVJJLnRyaW1GcmFnbWVudCgpLCB0cnVlKTsKLQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0RU9iamVjdChub3JtYWxpemVkVVJJLmZyYWdtZW50KCkpID09IG51bGwpIHsKLQkJCQkJCQkJbm90Rm91bmRQcm94aWVzLmFkZChwcm94eSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlTdHJpbmcgZXJyTXNnID0gZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUKLQkJCQkJCQkJCS5nZXRNZXNzYWdlKCkgOiBlLnRvU3RyaW5nKCk7Ci0JCQkJCQkJcHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLnB1dChwcm94eSwKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IGZpbGUsIGVyck1zZyB9KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJveHlUb0ZpbGVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkvLyBwcm9tcCB1c2VyIHRvIHJlc29sdmUgbWlzc2luZyBmaWxlcwotCQkJLy8KLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVNYXAua2V5U2V0KCkpOwotCQkJZmluYWwgU3RyaW5nIEVMRU1FTlRfUEFUSCA9IFhNSUxpYnJhcnlSZXNvdXJjZXMuZWxlbWVudFBhdGg7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldFRleHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQkJCQlGaWxlIGZpbGUgPSAoRmlsZSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpCi0JCQkJCQkJKyAiICgiICsgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIChub24tSmF2YWRvYykKLQkJCQkgKiAKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciNnZXRDb2x1bW5UZXh0KGphdmEubGFuZy5PYmplY3QsCi0JCQkJICogICAgICBpbnQpCi0JCQkJICovCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXJldHVybiBwcm94eVRvRmlsZU1hcC5nZXQob2JqZWN0KS50b1N0cmluZygpOwotCQkJCQljYXNlIDE6Ci0JCQkJCQlyZXR1cm4gVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKG9iamVjdCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c7Ci0JCQkJU2VsZWN0aW9uRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3Rpb25EaWFsb2coTXNnQm94Ci0JCQkJCQkuZ2V0RGVmYXVsdFNoZWxsKCksIGxpc3QsIGxhYmVsUHJvdmlkZXIsIG1zZyk7Ci0KLQkJCQlkbGcuc2V0VGl0bGUoWE1JTGlicmFyeVJlc291cmNlcy5taXNzaW5nRmlsZXNfdGl0bGUpOwotCQkJCWRsZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCQlkbGcuc2V0SW5pdGlhbEVsZW1lbnRTZWxlY3Rpb25zKGxpc3QpOwotCQkJCWRsZwotCQkJCQkJLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILAotCQkJCQkJCQlFTEVNRU5UX1BBVEggfSk7Ci0JCQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJT2JqZWN0IG9ianNbXSA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqcyA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlwcm94aWVzVG9SZW1vdmUuYWRkKGl0ZXIubmV4dCgpKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHByb21wdCB1c2VyIHRvIHJlc29sdmUgZmlsZXMgdGhhdCBjYW4gbm90IGJlIGxvYWRlZAotCQkvLwotCQlpZiAoIXByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5pc0VtcHR5KCkpIHsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QocHJveHlUb0ZpbGVXaXRoTG9hZEVycm9yTWFwLmtleVNldCgpKTsKLQkJCWZpbmFsIFN0cmluZyBMT0FEX0VSUk9SID0gWE1JTGlicmFyeVJlc291cmNlcy5sb2FkRXJyb3I7Ci0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQotCQkJCS8qCi0JCQkJICogKG5vbi1KYXZhZG9jKQotCQkJCSAqIAotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJCQkgKiAgICAgIGludCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCU9iamVjdFtdIGFyciA9IChPYmplY3RbXSkgcHJveHlUb0ZpbGVNYXAuZ2V0KG9iamVjdCk7Ci0JCQkJCWlmIChjb2x1bW5JbmRleCA8IDIpIHsKLQkJCQkJCXJldHVybiBhcnJbY29sdW1uSW5kZXhdLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQl9OwotCi0JCQl0cnkgewotCQkJCVN0cmluZyBtc2cgPSBYTUlMaWJyYXJ5UmVzb3VyY2VzLnByb21wdFJlbW92ZVJlZmVyZW5jZXNUb0ZpbGVzV2l0aExvYWRFcnJvcnNfbXNnOwotCQkJCVNlbGVjdGlvbkRpYWxvZyBkbGcgPSBuZXcgU2VsZWN0aW9uRGlhbG9nKE1zZ0JveAotCQkJCQkJLmdldERlZmF1bHRTaGVsbCgpLCBsaXN0LCBsYWJlbFByb3ZpZGVyLCBtc2cpOwotCi0JCQkJZGxnLnNldFRpdGxlKFhNSUxpYnJhcnlSZXNvdXJjZXMuZmlsZXNXaXRoTG9hZEVycm9yc190aXRsZSk7Ci0JCQkJZGxnLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJCWRsZy5zZXRJbml0aWFsRWxlbWVudFNlbGVjdGlvbnMobGlzdCk7Ci0JCQkJZGxnLnNldENvbHVtblByb3BlcnRpZXMobmV3IFN0cmluZ1tdIHsgRklMRV9QQVRILCBMT0FEX0VSUk9SIH0pOwotCQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCU9iamVjdCBvYmpzW10gPSBkbGcuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYgKG9ianMgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcHJveGllc1RvUmVtb3ZlLmFkZChpdGVyLm5leHQoKSk7Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbGFiZWxQcm92aWRlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlBcnJheUxpc3QgcHJveGllc1RvUmV0YWluID0gbmV3IEFycmF5TGlzdCgpOwotCQlwcm94aWVzLmFkZEFsbChwcm94eVRvRmlsZU1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMuYWRkQWxsKHByb3h5VG9GaWxlV2l0aExvYWRFcnJvck1hcC5rZXlTZXQoKSk7Ci0JCXByb3hpZXMucmVtb3ZlQWxsKHByb3hpZXNUb1JlbW92ZSk7Ci0KLQkJaWYgKHByb3hpZXNUb1JldGFpbi5pc0VtcHR5KCkpIHsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwobm90Rm91bmRQcm94aWVzKTsKLQkJCXByb3hpZXNUb1JlbW92ZS5hZGRBbGwocHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkkpOwotCQl9Ci0KLQkJU3RyaW5nIG1zZyA9ICJTdW1tYXJ5IG9mIHVucmVzb2x2ZWQgcHJveGllczoiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIE5vdCBmb3VuZCBwcm94aWVzOiAiICsgbm90Rm91bmRQcm94aWVzOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSAiXG4gIFByb3hpZXMgd2l0aCB1bm5vcm1hbGl6ZWQgVVJJOiAiICsgcHJveGllc1dpdGhVbm5vcm1hbGl6ZWRVUkk7IC8vJE5PTi1OTFMtMSQKLQkJWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nSW5mbyhtc2cpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVPbGREZWZhdWx0VmFsdWVzKCkgewotCQlNdWx0aVJlc291cmNlRU9iamVjdC5yZW1vdmVEZWZhdWx0VmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkanVzdFRvTmV3RGVmYXVsdFZhbHVlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJCS5yZW1vdmVGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0T2xkRGVmYXVsdFZhbHVlcygpIHsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3Quc2V0RGVmYXVsdFZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoTWV0aG9kRWxlbWVudCBlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRqdXN0VG9OZXdEZWZhdWx0VmFsdWVzKGUpOwotCi0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgZTsKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gYWN0LmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJYWN0Ci0JCQkJCQkuc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pOwotCQkJfSBlbHNlIGlmICh0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykgewotCQkJCWFjdAotCQkJCQkJLnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuTE9DQUxfUkVQTEFDRU1FTlQpOwotCQkJfQotCQl9Ci0JCWlmICghICh0aGlzIGluc3RhbmNlb2YgTWlncmF0b3IxMDJfMTAzKSkgewotCQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGlhZ3JhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMl8xMDMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmNzk2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3IxMDJfMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gTWFyIDIwLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMl8xMDMgZXh0ZW5kcyBNaWdyYXRvcjEwMiB7Ci0KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGRpYWdyYW1FbGVtTWFwOyAKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWlncmF0ZSgpIHsKLQkJZGlhZ3JhbUVsZW1NYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZShNZXRob2RFbGVtZW50IGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnVwZGF0ZShlLCBtb25pdG9yKTsKLQkJTWlncmF0b3IxMDMudXBkYXRlRWxlbWVudChlLCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWlncmF0ZURpYWdyYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWlncmF0b3IxMDMuZGlhZ3JhbU1pZ3JhdGUoZGlhZ3JhbUVsZW1NYXAsIG1vbml0b3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvcjEwMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzY1YTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL01pZ3JhdG9yMTAzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLmludGVybmFsLm1pZ3JhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuTmV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLlVwZ3JhZGVDYWxsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBXZWlwaW5nIEx1IC0gRmViIDEyLCAyMDA3Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRvcjEwMyBleHRlbmRzIE1pZ3JhdG9yQmFzZSB7Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcDsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHhtbE1pZ3JhdGUgPSBmYWxzZTsKLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQltaWdyYXRlKGxpYlBhdGgsIG1vbml0b3IsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtaWdyYXRlKFN0cmluZyBsaWJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFVwZ3JhZGVDYWxsZXJJbmZvIGluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShsaWJQYXRoKTsKLQkJCi0JCWJvb2xlYW4gdG9WZXJpZnkgPSB0cnVlOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0SXNFeHBvcnRlZFBsdWdpbkxpYigpKSB7Ci0JCQl0b1ZlcmlmeSA9IGZhbHNlOwotCQl9Ci0JCXhtbE1pZ3JhdGUgPSBmYWxzZTsKLQkJUmVzb3VyY2VVdGlsLm9wZW4obGliRmlsZS5nZXRQYXJlbnQoKSwgbW9uaXRvcik7Ci0KLQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gbnVsbDsKLQkJCi0JCWRpYWdyYW1FbGVtTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBQcm9jZXNzPigpOwotCQl0cnkgewotCQkJLy8gbG9hZCB0aGUgbGlicmFyeQotCQkJLy8KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLCBQZXJzaXN0ZW5jZVJlc291cmNlcy5sb2FkTGlicmFyeVRhc2tfbmFtZSk7Ci0KLQkJCWlmICh0b1ZlcmlmeSkgewotCQkJCXJlc291cmNlU2V0ID0gbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbChmYWxzZSk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc291cmNlU2V0ID0gUGVyc2lzdGVuY2VVdGlsLmdldEltcG9ydFBsdWdpblJlc291cmNlU2V0KCk7Ci0JCQl9Ci0JCQkJCQkKLQkJCXJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkucHV0KAotCQkJCQlYTUxSZXNvdXJjZS5PUFRJT05fUkVDT1JEX1VOS05PV05fRkVBVFVSRSwgQm9vbGVhbi5UUlVFKTsKLQotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSByZXNvdXJjZVNldC5sb2FkTGlicmFyeShsaWJQYXRoKTsKLQkJCQkJCQotCQkJTGlua0luZm8uc2V0TGlicmFyeShsaWIpOwotCQkJLy8gbG9hZCBhbGwgZWxlbWVudHMgaW4gbWVtb3J5Ci0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLmxvYWRSZXNvdXJjZXNUYXNrX25hbWUpOwotCQkJCi0JCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwkJCQkJCi0JCQkKLQkJCS8vIHNhdmUgYWxsIGZpbGVzCi0JCQkvLwotCQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFBlcnNpc3RlbmNlUmVzb3VyY2VzLnNhdmVMaWJyYXJ5VGFza19uYW1lKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJcmVzb3VyY2VTZXQuc2F2ZShzYXZlT3B0aW9ucywgdHJ1ZSk7Ci0KLQkJCXVwZGF0ZVN0YXR1cyhtb25pdG9yLAotCQkJCQlQZXJzaXN0ZW5jZVJlc291cmNlcy5yZWZyZXNoTGlicmFyeUZpbGVzVGFza19uYW1lKTsKLQkJCQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCQlkaWFncmFtTWlncmF0ZShkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7CQotCQkJCi0JCQlSZXNvdXJjZVV0aWwucmVmcmVzaFJlc291cmNlcyhsaWIsIG1vbml0b3IpOwotCQkJCi0JCX0gZmluYWxseSB7Ci0JCQlMaW5rSW5mby5zZXRMaWJyYXJ5KG51bGwpOwotCQkJCi0JCQlpZiAocmVzb3VyY2VTZXQgIT0gbnVsbCkgewotCQkJCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCQkJcmVzb3VyY2VTZXQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGlhZ3JhbU1pZ3JhdGUoTWFwPFN0cmluZywgUHJvY2Vzcz4gZGlhZ3JhbUVsZW1NYXAsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBDb252ZXJ0IGRpYWdyYW1zIAotCQl1cGRhdGVTdGF0dXMobW9uaXRvciwgUGVyc2lzdGVuY2VSZXNvdXJjZXMubWlncmF0aW5nRGlhZ3JhbV9uYW1lKTsKLQkJCi0JCUlEaWFncmFtTWlncmF0aW9uIGlkbSA9IChJRGlhZ3JhbU1pZ3JhdGlvbikgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSIsICJkaWFncmFtTWlncmF0aW9uIik7IAkJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoaWRtICE9IG51bGwgJiYgIWRpYWdyYW1FbGVtTWFwLmlzRW1wdHkoKSkgewotCQkJdHJ5IHsKLQkJCQlpZG0ubWlncmF0ZShkaWFncmFtRWxlbU1hcC52YWx1ZXMoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdXBkYXRlRWxlbWVudChlbGVtZW50LCBkaWFncmFtRWxlbU1hcCwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHVwZGF0ZUVsZW1lbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNYXA8U3RyaW5nLCBQcm9jZXNzPiBkaWFncmFtRWxlbU1hcCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGRpYWdyYW1FbGVtTWFwICE9IG51bGwpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gfHwKLQkJCQllbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzID0gKFByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJaWYgKHByb2Nlc3MuZUNvbnRhaW5lcigpIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCQlTdHJpbmcgZ3VpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQkJCQlQcm9jZXNzIHByb2MgPSBkaWFncmFtRWxlbU1hcC5nZXQoZ3VpZCk7Ci0JCQkJCWlmIChwcm9jID09IG51bGwpIHsKLQkJCQkJCWRpYWdyYW1FbGVtTWFwLnB1dChlbGVtZW50LmdldEd1aWQoKSwgKFByb2Nlc3MpIGVsZW1lbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYXNzZXJ0KHByb2MgPT0gZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTWlncmF0aW9uVXRpbC5mb3JtYXRWYWx1ZShlbGVtZW50KTsKLQkJaGFuZGxlVHlwZUNvbnZlcnQoZWxlbWVudCk7Ci0JCWlmICghIHhtbE1pZ3JhdGUpIHsKLQkJCWhhbmRsZVNoYXBlQW5kTm9kZUljb25zKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlVHlwZUNvbnZlcnQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKAllbGVtZW50IGluc3RhbmNlb2YgRXhhbXBsZSAJCQl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBSZXVzYWJsZUFzc2V0IAl8fAotCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBXaGl0ZXBhcGVyKSB7CQkJCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBwcmVzID0gY29udmVydChndWlkYW5jZS5nZXRQcmVzZW50YXRpb24oKSk7Ci0JCQlpZiAocHJlcyAhPSBudWxsKSB7Ci0JCQkJZ3VpZGFuY2Uuc2V0UHJlc2VudGF0aW9uKHByZXMpOwotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEd1aWRhbmNlRGVzY3JpcHRpb24gY29udmVydChDb250ZW50RGVzY3JpcHRpb24gb2xkT2JqKSB7Ci0JCWlmIChvbGRPYmogPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJR3VpZGFuY2VEZXNjcmlwdGlvbiBuZXdPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7CQkKLQkJUmVzb3VyY2UgcmVzID0gb2xkT2JqLmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlcy5nZXRDb250ZW50cygpLnJlbW92ZShvbGRPYmopOwotCQkJcmVzLmdldENvbnRlbnRzKCkuYWRkKG5ld09iaik7Ci0JCX0KLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhvbGRPYmopOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IG9sZE9iai5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsJCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IG9sZE9iai5lR2V0KGZlYXR1cmUpOwotCQkJCW5ld09iai5lU2V0KGZlYXR1cmUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkJCQotCQlyZXR1cm4gbmV3T2JqOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZVNoYXBlQW5kTm9kZUljb25zKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7CQkJCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudDsKLQkJCVVSSSBmaXhlZFVSSSA9IGZpeEljb25VUkkoZGVzY3JpYmFibGVFbGVtZW50LCBkZXNjcmliYWJsZUVsZW1lbnQuZ2V0U2hhcGVpY29uKCkpOwotCQkJaWYgKGZpeGVkVVJJICE9IG51bGwpIHsKLQkJCQlkZXNjcmliYWJsZUVsZW1lbnQuc2V0U2hhcGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJCWZpeGVkVVJJID0gZml4SWNvblVSSShkZXNjcmliYWJsZUVsZW1lbnQsIGRlc2NyaWJhYmxlRWxlbWVudC5nZXROb2RlaWNvbigpKTsKLQkJCWlmIChmaXhlZFVSSSAhPSBudWxsKSB7Ci0JCQkJZGVzY3JpYmFibGVFbGVtZW50LnNldE5vZGVpY29uKGZpeGVkVVJJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFVSSSBmaXhJY29uVVJJKERlc2NyaWJhYmxlRWxlbWVudCBlLCBVUkkgdXJpKSB7Ci0JCWlmICh1cmkgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlGaWxlIHBhdGggPSBuZXcgRmlsZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHVyaS50b1N0cmluZygpKSk7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSBuZXcgU3RhY2s8U3RyaW5nPigpOwotCQlGaWxlIHRlbXAgPSBwYXRoOwotCQlTdHJpbmcgcmVzdWx0UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCXN0YWNrLnB1c2godGVtcC5nZXROYW1lKCkpOwotCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCWlmICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkvLyBub3cgc2tpcCBmaXJzdCBzdGFjayBlbnRyeSBhbmQgcmVjb25zdHJ1Y3QgcGF0aAotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBzdGFjay5wb3AoKTsKLQkJCXdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJaWYgKHJlc3VsdFBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlc3VsdFBhdGggKz0gJy8nOwotCQkJCX0KLQkJCQlyZXN1bHRQYXRoID0gcmVzdWx0UGF0aCArIChTdHJpbmcpc3RhY2sucG9wKCk7Ci0JCQl9Ci0KLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlKTsKLQkJCXRyeSB7Ci0JCQkJVVJJIHJlc3VsdFVSSSA9IG5ldyBVUkkocmVzdWx0UGF0aCk7Ci0JCQkJaWYgKCFwbHVnaW5OYW1lLmVxdWFscyhwbHVnaW4uZ2V0TmFtZSgpKSkgewotCQkJCQkvLyB1cmkgd2FzIHJlZmVyaW5nIGEgZmlsZSBpbiBhbm90aGVyIHBsdWdpbgotCQkJCQlGaWxlIGxpYlJvb3QgPSBUbmdVdGlsLmdldExpYnJhcnlSb290UGF0aChlKTsKLQkJCQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUobGliUm9vdCwgTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSkpOwotCQkJCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShsaWJSb290LCBwbHVnaW4uZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHJlc3VsdFVSSS50b1N0cmluZygpKSk7Ci0JCQkJCWlmICghbmV3RmlsZS5leGlzdHMoKSkgewotCSAgICAgIAkJCQkJRmlsZVV0aWwuY29weUZpbGUob2xkRmlsZSwgbmV3RmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdFVSSTsKLQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotCQkJCVhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgbWlncmF0ZVhtbEltcG9ydGVkTGliKE1ldGhvZExpYnJhcnkgbGliLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQl4bWxNaWdyYXRlID0gdHJ1ZTsKLQkJdXBkYXRlU3RhdHVzKG1vbml0b3IsIFhNSUxpYnJhcnlSZXNvdXJjZXMubWlncmF0ZVhNTExpYnJhcnlfdGFza05hbWUpOwotCQl1cGRhdGVBbGxDb250ZW50cyhtb25pdG9yLCBsaWIpOwotCQlMaWJyYXJ5VXRpbC5zYXZlTGlicmFyeShsaWIsIGZhbHNlLCBmYWxzZSk7Ci0JCXhtbE1pZ3JhdGUgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9NaWdyYXRvckJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhMTZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vTWlncmF0b3JCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuaW50ZXJuYWwubWlncmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5NaWdyYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gZm9yIG1pZ3JhdG9ycwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgLSBGZWIgMTIsIDIwMDcKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1pZ3JhdG9yQmFzZSBleHRlbmRzIE1pZ3JhdG9ySW1wbCB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gWE1JTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc0RlYnVnZ2luZygpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCB1cGRhdGVTdGF0dXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgbXNnKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCW1vbml0b3Iuc3ViVGFzayhtc2cpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgxMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFsbENvbnRlbnRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWIuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUNvbW1vblBsdWdpbi5JTlNUQU5DRS5sb2coZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLmVycgotCQkJCQkJCQkucHJpbnRsbigiRXJyb3IgaXRlcmF0ZSB0aHJ1IGNyb3NzIHJlZmVyZW5jZXMgb2YgZWxlbWVudDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJdXBkYXRlRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCwgbW9uaXRvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdXBkYXRlRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbjsJCi0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbWlncmF0ZShTdHJpbmcgbGliUGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG1pZ3JhdGUoU3RyaW5nIGxpYlBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVXBncmFkZUNhbGxlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL1NlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGI3OGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkveG1pL2ludGVybmFsL21pZ3JhdGlvbi9TZWxlY3Rpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5pbnRlcm5hbC5taWdyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IGxpc3RzIG1pc3NpbmcgZmlsZXMgaW4gYSBtZXRob2QgbGlicmFyeSB0byBiZSB1cGdyYWRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkRpYWxvZyBleHRlbmRzIExpc3RTZWxlY3Rpb25EaWFsb2cgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgaW5wdXQsCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0JCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgaW5wdXQsIGNvbnRlbnRQcm92aWRlciwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IGlucHV0LAotCQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGlucHV0LCBuZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkJCXJldHVybiAoKExpc3QpIG9iamVjdCkudG9BcnJheSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LAotCQkJCQlPYmplY3QgbmV3SW5wdXQpIHsKLQkJCX0KLQkJfSwgbGFiZWxQcm92aWRlciwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uUHJvcGVydGllcyhTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuY29sdW1uUHJvcGVydGllcyA9IGNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3RTZWxlY3Rpb25EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgY3RybCA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgY29sdW1ucwotCQkvLwotCQlUYWJsZSB0YWJsZSA9IGdldFZpZXdlcigpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTEVGVCk7Ci0JCQljb2wuc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbC5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQljb2wuc2V0V2lkdGgoMjAwKTsKLQkJfQotCQlnZXRWaWV3ZXIoKS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCQlnZXRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0KLQkJcmV0dXJuIGN0cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS94bWkvaW50ZXJuYWwvbWlncmF0aW9uL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3YzNkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3htaS9pbnRlcm5hbC9taWdyYXRpb24vcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbWlncmF0aW9uIHN1cHBvcnQgZm9yIHVwZ3JhZGluZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxZGVlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgTGlicmFyeSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RlMWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiOTdiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWksCi0gb3JnLmVjbGlwc2UuZXBmLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UudWkuaWRlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWksCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWksCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByb3ZpZGVycywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMWVkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMKLSAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9PcGVuTGlicmFyeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9PcGVuTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvT3BlbkxpYnJhcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFByb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvaWNvbnMvZnVsbC93aXpiYW4vRXhwb3J0UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9pY29ucy9mdWxsL3dpemJhbi9PcGVuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL2ljb25zL2Z1bGwvd2l6YmFuL09wZW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNlZDllNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBBY3Rpb24gCi1hY3Rpb25TZXRMYWJlbD1NZXRob2QgQXV0aG9yaW5nCi1maWxlT3Blbk1lbnVMYWJlbD1PJnBlbgotb3BlbkxpYnJhcnlBY3Rpb25sYWJlbD1NZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlBY3Rpb25Ub29sdGlwPU9wZW4gYSBtZXRob2QgbGlicmFyeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODYxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPiAgICAgICAgICAgCi0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiCi0gICAgICAgICBuYW1lPSJFUEYgTmV3IE1ldGhvZCBMaWJyYXJ5IFdpemFyZCBQYWdlcyIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIgotICAgICAgICAgbmFtZT0iRVBGIE9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIFBhZ2VzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvT3BlbkxpYnJhcnlXaXphcmRQYWdlcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJvcGVuTGlicmFyeVdpemFyZCIKLSAgICAgICAgIG5hbWU9Ik9wZW4gTWV0aG9kIExpYnJhcnkgV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkLmV4c2QiIC8+Ci0gICAgICAgICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlYWN0aW9uU2V0TGFiZWwiCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubWVudS5maWxlT3Blbk1lbnUiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWZpbGVPcGVuTWVudUxhYmVsIgotICAgICAgICAgICAgICAgcGF0aD0iZmlsZS9uZXcuZXh0Ij4KLSAgICAgICAgICAgIDxzZXBhcmF0b3IgbmFtZT0iZ3JvdXBtMSIvPgotICAgICAgICAgICAgPHNlcGFyYXRvciBuYW1lPSJncm91cG0yIi8+Ci0gICAgICAgICA8L21lbnU+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9ucy5PcGVuTGlicmFyeUFjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9ImZpbGVfb3Blbl9saWJyYXJ5X2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuT3BlbkxpYnJhcnlBY3Rpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJW9wZW5MaWJyYXJ5QWN0aW9ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iZmlsZS9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5tZW51LmZpbGVPcGVuTWVudS9ncm91cG0xIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJW9wZW5MaWJyYXJ5QWN0aW9uVG9vbHRpcCIvPgotICAgICAgPC9hY3Rpb25TZXQ+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvTmV3TGlicmFyeVdpemFyZFBhZ2VzLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvTmV3TGlicmFyeVdpemFyZFBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWM0NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL05ld0xpYnJhcnlXaXphcmRQYWdlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSIgaWQ9Im5ld0xpYnJhcnlXaXphcmRQYWdlcyIgbmFtZT0iRVBGIE5ldyBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE5ldyBNZXRob2QgTGlicmFyeSB3aXphcmQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5ld0xpYnJhcnlXaXphcmRQYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibmV3TGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5ld0xpYnJhcnlXaXphcmRQYWdlcyZxdW90OyZndDsKLSAgICAgICZsdDthZGRMaWJyYXJ5V2l6YXJkUGFnZQotICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLk5ld1hNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7Q3JlYXRlcyBhIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsKLSAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O1NwZWNpZnkgdGhlIGxvY2F0aW9uIGZvciB0aGUgWE1JIG1ldGhvZCBsaWJyYXJ5LiZxdW90OyZndDsKLSAgICAgICZsdDsvYWRkTGlicmFyeVdpemFyZFBhZ2UmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3ODFhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zY2hlbWEvT3BlbkxpYnJhcnlXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkiIGlkPSJleHBvcnRNU1BXaXphcmQiIG5hbWU9IkV4cG9ydCBNaWNyb3NvZnQgUHJvamVjdCBXaXphcmQgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGV4dGVuZCB0aGUgT3BlbiBNZXRob2QgTGlicmFyeSB3aXphcmQgYnkgcmVwbGFjaW5nIGV4aXN0aW5nIHdpemFyZCBwYWdlcyBvciBhZGRpbmcgbmV3IG9uZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZEV4dGVuZGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZEV4dGVuZGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0id2l6YXJkUGFnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4yCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZAotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5NeU9wZW5MaWJyYXJ5V2l6YXJkJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTXlPcGVuTGlicmFyeU1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLk9wZW5MaWJyYXJ5TWFpblBhZ2UmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O3dpemFyZFBhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuTXlPcGVuTGlicmFyeU9wdGlvblBhZ2UmcXVvdDsKLSAgICAgICAgICAgICAgIHR5cGU9JnF1b3Q7bmV3JnF1b3Q7Ci0gICAgICAgICAgICAgICB0YXJnZXQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeU1haW5QYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgICAgICAgIAotICAgICAgJmx0Oy93aXphcmQmZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NjaGVtYS9PcGVuTGlicmFyeVdpemFyZFBhZ2VzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMGU0MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc2NoZW1hL09wZW5MaWJyYXJ5V2l6YXJkUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkiIGlkPSJvcGVuTGlicmFyeVdpemFyZFBhZ2VzIiBuYW1lPSJFUEYgT3BlbiBNZXRob2QgTGlicmFyeSBXaXphcmQgUGFnZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhIG1ldGhvZCBsaWJyYXJ5IHR5cGUgc3BlY2lmaWMgd2l6YXJkIHBhZ2UgdG8gdGhlIE9wZW4gTWV0aG9kIExpYnJhcnkgd2l6YXJkLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJvcGVuTGlicmFyeVdpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSB3aXphcmQgcGFnZS4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5BZGRMaWJyYXJ5V2l6YXJkUGFnZSZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaWRlbnRpZmllciBvZiBhIHNwZWNpZmljIG1ldGhvZCBsaWJyYXJ5IHR5cGUgKGRhdGFiYXNlLCB4bWksIGV0Yy4pLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRpdGxlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0aXRsZSBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHdpemFyZCBwYWdlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGEgTGlicmFyeSBNYW5hZ2VyIGV4dGVuc2lvbiBwb2ludDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi5saWJycmF5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7b3BlbkxpYnJhcnlXaXphcmRQYWdlCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkuT3BlblhNSUxpYnJhcnlXaXphcmRQYWdlJnF1b3Q7Ci0gICAgICAgICB0eXBlPSZxdW90O3htaSZxdW90OwotICAgICAgICAgdGl0bGU9JnF1b3Q7T3BlbnMgYSBYTUkgbWV0aG9kIGxpYnJhcnkuJnF1b3Q7Ci0gICAgICAgICBkZXNjcmlwdGlvbj0mcXVvdDtTcGVjaWZ5IHRoZSBsb2NhdGlvbiBmb3IgdGhlIFhNSSBtZXRob2QgbGlicmFyeS4mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L29wZW5MaWJyYXJ5V2l6YXJkUGFnZSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSU1ldGhvZEVsZW1lbnRQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0lNZXRob2RFbGVtZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiODQxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvSU1ldGhvZEVsZW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBtZXRob2QgZWxlbWVudCBwcm92aWRlci4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElNZXRob2RFbGVtZW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudCgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YTExY2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSUltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGNhY2hlZCBjb3B5IG9mIGNvbW1vbmx5IHJlZmVyZW5jZWQgaW1hZ2VzIGluIHRoZSBsaWJyYXJ5IFVJLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSUltYWdlcyB7Ci0KLQkvKioKLQkgKiBUaGUgaW1hZ2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWV0aG9kIExpYnJhcnkgZWxlbWVudHMuCi0JICogPHA+Ci0JICogVGhlc2UgaW1hZ2VzIGFyZSBjYWNoZWQgYW5kIHNob3VsZCBub3QgYmUgZGlzcG9zZWQgYnkgdGhlIHVzZXIhCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUNUSVZJVFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQWN0aXZpdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQVJUSUZBQ1QgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ0FQQUJJTElUWV9QQVRURVJOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NIRUNLTElTVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DaGVja2xpc3QiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09NUE9TSVRFX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DT05DRVBUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbmNlcHQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ09OVEVOVF9QQUNLQUdFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NVU1RPTV9DQVRFR09SWSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSQUJMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ERUxJVkVSWV9QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ESVNDSVBMSU5FID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0Rpc2NpcGxpbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRElTQ0lQTElORV9HUk9VUElORyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRE9NQUlOID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L0RvbWFpbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19FU1RJTUFUSU5HX01FVFJJQyA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0VYQU1QTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvRXhhbXBsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19HVUlERUxJTkUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvR3VpZGVsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0lURVJBVElPTiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9JdGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9DT05GSUdVUkFUT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfTElCQVJBUlkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19NRVRIT0RfUEFDS0FHRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01FVEhPRF9QTFVHSU4gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX01JTEVTVE9ORSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9NaWxlc3RvbmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUQ09NRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9PdXRjb21lIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BIQVNFID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1BoYXNlIik7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUkFDVElDRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9QcmFjdGljZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BST0NFU1NfQ09OVFJJQlVUSU9OID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUFJPQ0VTU19GQU1JTFkgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc0ZhbWlseSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QUk9DRVNTX1BBQ0tBR0UgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUkVQT1JUID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JlcG9ydCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0FETUFQID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvYWRtYXAiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfUk9MRV9ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEUgPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvUm9sZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19ST0xFX1NFVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Sb2xlU2V0Iik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1JPTEVfU0VUX0dST1VQSU5HID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBQT1JUSU5HX01BVEVSSUFMID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19UQVNLID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2siKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVEFTS19ERVNDUklQVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RFQU1fUFJPRklMRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZWFtUHJvZmlsZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URU1QTEFURSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9UZW1wbGF0ZSIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19URVJNX0RFRklOSVRJT04gPSBnZXRFbGVtZW50SW1hZ2UoImZ1bGwvb2JqMTYvVGVybURlZmluaXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVE9PTCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Ub29sIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RPT0xfTUVOVE9SID0gZ2V0RWxlbWVudEltYWdlKCJmdWxsL29iajE2L1Rvb2xNZW50b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfV0hJVEVQQVBFUiA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9XaGl0ZXBhcGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1dPUktfUFJPRFVDVCA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19XT1JLX1BST0RVQ1RfVFlQRSA9IGdldEVsZW1lbnRJbWFnZSgiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZ2l2ZW4gdGhlIHJlbGF0aXZlIHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgcGF0aCByZWxhdGl2ZSB0byAiaWNvbnMiIGZvbGRlciBpbiB0aGUgdGhlIFVNQSBFZGl0IHBsdWctaW4KLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkltYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGdldEVsZW1lbnRJbWFnZShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoCi0JCQkJVW1hRWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRJbWFnZShwYXRoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1ZDBiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpLlVzZXJJbnRlcmFjdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnMuQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9ncy5Db3B5TGlicmFyeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkxpYnJhcnlCYWNrdXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWFwcGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5NZXNzYWdlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IExpYnJhcnkgVUkgTWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogQSBMaWJyYXJ5IE1hbmFnZXIgcHJvdmlkZXMgdGhlIHVzZXIgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbmQgb3BlbmluZyBhCi0gKiBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJTWFuYWdlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9PTEJBUl9DT05GSUdfQ09OVFJJQlVUSU9OX0lEID0gInRvb2xiYXIuY29uZmlnLmNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfVklFV19JRCA9ICJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbmZpZ3VyYXRpb25WaWV3IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfRURJVE9SX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Qcm9jZXNzRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBpbnN0YW5jZSA9IG51bGw7Ci0JCi0JLy8gVGhlIFVSSSBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIG9wZW5lZCByZWdhcmRsZXNzIG9mIHRoZQotCS8vIHNhdmVkIGxpYnJhcnkgcHJlZmVyZW5jZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkkgbGlicmFyeVVSSTsKLQotCS8vIFRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2lsbCBiZSBvcGVuZWQgb25seSBpZiB0aGVyZSBhcmUKLQkvLyBubyBzYXZlZCBsaWJyYXJ5IHByZWZlcmVuY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJOwotCXByb3RlY3RlZCBzdGF0aWMgVVJJIGRlZmF1bHRMaWJyYXJ5VVJJX05MOwotCXByaXZhdGUgYm9vbGVhbiBsaWJyYXJ5SW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gY29uZmlnQ29tYm8gPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVVJTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeVVJTWFuYWdlci5jbGFzcykgewotCQkJCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQkJCWluc3RhbmNlID0gbmV3IExpYnJhcnlVSU1hbmFnZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZwotCSAqIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIExpYnJhcnlVSU1hbmFnZXIoKSB7Ci0JCS8vIE1vbml0b3IgcGVyc3BlY3RpdmUgY2hhbmdlcyB0byBkaXNwbGF5L2hpZGUgdGhlIGNvbmZpZ3VyYXRpb24gY29tYm8uCi0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQl3aW5kb3cuYWRkUGVyc3BlY3RpdmVMaXN0ZW5lcihuZXcgSVBlcnNwZWN0aXZlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYykgewotCQkJCQljaGVja0NvbmZpZ3VyYXRpb25Db250cmlidXRpb24oKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQkJCUlQZXJzcGVjdGl2ZURlc2NyaXB0b3IgZGVzYywgU3RyaW5nIGlkKSB7Ci0JCQkJCWNoZWNrQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgb3BlbnMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgY3JlYXRlZCBhbmQgb3BlbmVkCi0JICogICAgICAgICBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVMaWJyYXJ5KFN0cmluZyBwYXRoKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCQlpZiAoIWxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQkJbGlicmFyeVBhdGgubWtkaXJzKCk7Ci0JCQl9Ci0JCQlYTUlMaWJyYXJ5VXRpbC5jcmVhdGVNZXRob2RMaWJyYXJ5KGxpYnJhcnlQYXRoLmdldE5hbWUoKSwgcGF0aCk7Ci0JCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKHBhdGgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogT3BlbnMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgZ2l2ZW4gdGhlIGRlZmF1bHQgbGlicmFyeSBwYXRoIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVVJJIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IGlzIG9wZW5lZCBzdWNjZXNzZnVsbHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuRGVmYXVsdExpYnJhcnkoZmluYWwgVVJJIHVyaSkgewotCQl0cnkgewotCQkJRmlsZSBkZWZhdWx0TGlicmFyeVBhdGhGaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShkZWZhdWx0TGlicmFyeVBhdGhGaWxlLCBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSk7Ci0JCQlpZiAoIWxpYnJhcnlYTUlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQl0cnkgewotCQkJCQkJVVJJIGxpYlVyaSA9IHVyaTsKLQkJCQkJCVN0cmluZyBuZXdQYXRoID0gaGFuZGxlTGlicmFyeU9uUmVhZE9ubHlJbnN0YWxsUGF0aChsaWJVcmkpOwotCQkJCQkJaWYgKG5ld1BhdGggIT0gbnVsbCkgewotCQkJCQkJCWxpYlVyaSA9IFN0clV0aWwudG9VUkkobmV3UGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCVN0cmluZyB0YXNrTmFtZSA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCAyKTsKLQkJCQkJCW1vbml0b3Iuc2V0VGFza05hbWUodGFza05hbWUpOwotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkub3Blbk1ldGhvZExpYnJhcnkoInhtaSIsIGxpYlVyaSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaGVsbCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJCQkJc2hlbGwuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBvcGVyYXRpb24pOwotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsOwotCQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBkb24ndCBkbyBhbnl0aGluZwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgbGFzdCBvcGVuZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFVSSSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gb3Blbkxhc3RPcGVuZWRMaWJyYXJ5KCkgewotCQl0cnkgewotCQkJCi0JCQkvLyBmaXJzdCBjaGVjayBmb3Igc2F2ZWQgbGliIGluIHByZWZlcmVuY2UKLQkJCS8vIHNvIHRoYXQgd2UgZG9uJ3Qgc2hvdyBwcm9ncmVzcyBtb25pdG9yIGlmIHRoZXJlJ3Mgbm8gbGliCi0JCQlTdHJpbmcgc2F2ZWRNZXRob2RMaWJyYXJ5VVJJID0gTGlicmFyeVByZWZlcmVuY2VzCi0JCQkJLmdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpOwotCQkJVVJJIHVyaSA9IG5ldyBVUkkoc2F2ZWRNZXRob2RMaWJyYXJ5VVJJKTsKLQkJCWlmICh1cmkuZ2V0UGF0aCgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCVdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uKCkgewotCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgdGFza05hbWUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbmluZ0xpYnJhcnlUYXNrX25hbWU7Ci0JCQkJCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgMik7Ci0JCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKHRhc2tOYW1lKTsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLm9wZW5MYXN0T3BlbmVkTWV0aG9kTGlicmFyeSgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKSB7Ci0JCQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJCQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQkJCQlzaGVsbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JCQkJfQotCQkJfTsKLQkJCWRpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGw7Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvbid0IGRvIGFueXRoaW5nCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkgZ2l2ZW4gdGhlIGxpYnJhcnkgcGF0aCBVUkkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIFVSSSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkxpYnJhcnkoZmluYWwgVVJJIHVyaSkgewotCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJYXJncy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbmV3IEZpbGUodXJpKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXJldHVybiBvcGVuTGlicmFyeShYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkgZ2l2ZW4gdGhlIGxpYnJhcnkgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgb3BlbmVkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIG9wZW5MaWJyYXJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gYXJncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlhcmdzLnB1dChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRILCBwYXRoKTsKLQkJcmV0dXJuIG9wZW5MaWJyYXJ5KFhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfVFlQRSwgYXJncyk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBpcyBvcGVuZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkxpYnJhcnkoZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXJncykgewotCQlmaW5hbCBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGFyZ3MKLQkJCQkuZ2V0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgpOwotCi0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotCQlmaW5hbCBMaXN0PEV4Y2VwdGlvbj4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDxFeGNlcHRpb24+KCk7Ci0KLQkJLy8gRG8gdGhlIHdvcmsgd2l0aGluIGFuIG9wZXJhdGlvbiBiZWNhdXNlIHRoaXMgaXMgYSBsb25nIHJ1bm5pbmcKLQkJLy8gYWN0aXZpdHkgdGhhdCBtb2RpZmllcyB0aGUgd29ya3NwYWNlLgotCQlXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJU3RyaW5nIHRhc2tOYW1lID0gTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5pbmdMaWJyYXJ5VGFza19uYW1lOwotCQkJCW1vbml0b3IuYmVnaW5UYXNrKHRhc2tOYW1lLCAyKTsKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLnNldFRhc2tOYW1lKHRhc2tOYW1lKTsKLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLm9wZW5NZXRob2RMaWJyYXJ5KHR5cGUsIGFyZ3MpOwotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KAotCQkJCQkJCWxpYnJhcnkpOwotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5zZXRTYXZlZExpYnJhcnlQYXRoKHBhdGgpOwotCi0JCQkJCS8vIFNob3cgUHJvYmxlbXMgVmlldyBpZiBuZWNlc3NhcnkuCi0JCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIExpYnJhcnlTZXJ2aWNlCi0JCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkpOwotCQkJCQlpZiAocmVzb3VyY2VTZXQuaGFzVW5yZXNvbHZlZFByb3h5KCkpIHsKLQkJCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJUGxhdGZvcm1VSQotCQkJCQkJCQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkJCQkJCS5nZXRBY3RpdmVQYWdlKCkKLQkJCQkJCQkJCQkJLnNob3dWaWV3KAotCQkJCQkJCQkJCQkJCSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIsIG51bGwsIElXb3JrYmVuY2hQYWdlLlZJRVdfVklTSUJMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkKLQkJCQkJCQkJCQkJLmxvZ0Vycm9yKGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoIShlIGluc3RhbmNlb2YgSU9FeGNlcHRpb24gJiYgZS5nZXRNZXNzYWdlKCkKLQkJCQkJCQkuc3RhcnRzV2l0aCgiIyMjIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQkJZXJyb3JzLmFkZChlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBkaWFsb2cgPSBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHNoZWxsKSB7Ci0JCQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJCQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQkJCQlzaGVsbC5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JCQkJfQotCQkJfTsKLQkJCWRpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQlpZiAoZXJyb3JzLmlzRW1wdHkoKSkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJCQkJYWN0aXZlUGFnZS5jbG9zZUFsbEVkaXRvcnMoZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlJdGVyYXRvcjxFeGNlcHRpb24+IGl0ZXIgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJRXhjZXB0aW9uIGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCQkJCWlmIChtZXNzYWdlLnN0YXJ0c1dpdGgoIiMjIyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgcHJvamVjdEZpbGVOYW1lID0gbWVzc2FnZS5zdWJzdHJpbmcoMyk7Ci0KLQkJCQkJCQlTdHJpbmcgcHJvbXB0ID0gTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dCwKLQkJCQkJCQkJCQkJcHJvamVjdEZpbGVOYW1lKTsKLQkJCQkJCQlTdHJpbmdbXSBidXR0b25MYWJlbHMgPSB7Ci0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMucmV0cnlCdXR0b25fdGV4dCwKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5jYW5jZWxCdXR0b25fdGV4dCB9OwotCQkJCQkJCU1lc3NhZ2VEaWFsb2cgbXNnQm94ID0gbmV3IE1lc3NhZ2VEaWFsb2coRGlzcGxheQotCQkJCQkJCQkJLmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLAotCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJCQkJbnVsbCwgcHJvbXB0LCBNZXNzYWdlRGlhbG9nLldBUk5JTkcsCi0JCQkJCQkJCQlidXR0b25MYWJlbHMsIDApOwotCQkJCQkJCWlmIChtc2dCb3gub3BlbigpID09IDApIHsKLQkJCQkJCQkJcmV0dXJuIG9wZW5MaWJyYXJ5KHBhdGgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVRocm93YWJsZSBleCA9IGU7Ci0JCQkJCQlmb3IgKGV4ID0gZTsgZXggIT0gbnVsbAotCQkJCQkJCQkmJiAhKGV4IGluc3RhbmNlb2YgTWVzc2FnZUV4Y2VwdGlvbik7IGV4ID0gZXgKLQkJCQkJCQkJLmdldENhdXNlKCkpCi0JCQkJCQkJOwotCQkJCQkJU3RyaW5nIG1zZyA9IGV4ICE9IG51bGwgJiYgZXguZ2V0TWVzc2FnZSgpICE9IG51bGwgPyBleAotCQkJCQkJCQkuZ2V0TWVzc2FnZSgpIDogZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGUKLQkJCQkJCQkJLmdldE1lc3NhZ2UoKSA6IGUudG9TdHJpbmcoKTsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCQltc2csIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBVcGdyYWRlcyBhIG1ldGhvZCBsaWJyYXJ5IHRvIGEgbmV3IG1ldGEtbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGxpYlBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeSBmb2xkZXIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBtZXRob2QgbGlicmFyeSBpcyBzdWNlc3NmdWxseQotCSAqICAgICAgICAgdXBncmFkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdXBncmFkZUxpYnJhcnkoZmluYWwgU3RyaW5nIGxpYlBhdGgsCi0JCQlmaW5hbCBVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJaWYgKFVwZ3JhZGVDYWxsZXJJbmZvLmlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCUxpYnJhcnlCYWNrdXBVdGlsLnByb21wdEJhY2t1cExpYnJhcnkoc2hlbGwsIG5ldyBGaWxlKGxpYlBhdGgpKTsKLQkJfQotCi0JCVN0cmluZyBsaWJYbWkgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUU7Ci0JCWlmIChjYWxsZXJJbmZvICE9IG51bGwgJiYgY2FsbGVySW5mby5nZXRJc0V4cG9ydGVkUGx1Z2luTGliKCkpIHsKLQkJCWxpYlhtaSA9IFhNSUxpYnJhcnlNYW5hZ2VyLmV4cG9ydEZpbGU7Ci0JCX0KLQkJcmV0dXJuIHVwZ3JhZGVMaWJyYXJ5KG5ldyBGaWxlKGxpYlBhdGgsIGxpYlhtaSksIGNhbGxlckluZm8pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1cGdyYWRlTGlicmFyeShmaW5hbCBGaWxlIGxpYkZpbGUsCi0JCQlmaW5hbCBVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCWZpbmFsIFN0cmluZ0J1ZmZlciBlcnJNc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZpbmFsIGJvb2xlYW5bXSBjYW5jZWxGbGFnSG9sZGVyID0geyBmYWxzZSB9OwotCi0JCS8vIERvIHRoZSB3b3JrIHdpdGhpbiBhbiBvcGVyYXRpb24gYmVjYXVzZSB0aGlzIGlzIGEgbG9uZyBydW5uaW5nCi0JCS8vIGFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgdGhlIHdvcmtiZW5jaC4KLQkJV29ya3NwYWNlTW9kaWZ5T3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBXb3Jrc3BhY2VNb2RpZnlPcGVyYXRpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKExpYnJhcnlVSVJlc291cmNlcy51cGdyYWRpbmdMaWJyYXJ5VGFza19uYW1lLAotCQkJCQkJMTApOwotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCXRyeSB7Ci0JCQkJCU1hcHBpbmdVdGlsLm1pZ3JhdGUobGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgbW9uaXRvciwKLQkJCQkJCQljYWxsZXJJbmZvKTsKLQkJCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWNhbmNlbEZsYWdIb2xkZXJbMF0gPSB0cnVlOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgbXNnID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCWlmIChtc2cgPT0gbnVsbCkgewotCQkJCQkJbXNnID0gTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RXJyb3JfbXNnOwotCQkJCQl9Ci0JCQkJCWVyck1zZy5hcHBlbmQobXNnKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCS8vIFJ1biB0aGUgb3BlcmF0aW9uIGFuZCBkaXNwbGF5IHRoZSBwcm9ncmVzcy4KLQkJCVByb2dyZXNzTW9uaXRvckRpYWxvZyBwbURpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coRGlzcGxheQotCQkJCQkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpIHsKLQkJCQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCQkJCVBvaW50IGNhbGN1bGF0ZWRTaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKLQkJCQkJaWYgKGNhbGN1bGF0ZWRTaXplLnggPCA2NzUpIHsKLQkJCQkJCWNhbGN1bGF0ZWRTaXplLnggPSA2NzU7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNhbGN1bGF0ZWRTaXplOwotCQkJCX0KLQkJCX07Ci0JCQlwbURpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wZXJhdGlvbik7Ci0JCQlpZiAoY2FuY2VsRmxhZ0hvbGRlclswXSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0gZWxzZSBpZiAoZXJyTXNnLmxlbmd0aCgpID4gMCkgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJTGlicmFyeVVJUGx1Z2luLlBMVUdJTl9JRCwgMCwgIiIsIG51bGwpIHsvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyBJU3RhdHVzW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQkJCQlJU3RhdHVzW10gcmV0ID0gbmV3IFN0YXR1c1sxXTsKLQkJCQkJCUlTdGF0dXMgY3MgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5QTFVHSU5fSUQsIDAsCi0JCQkJCQkJCWVyck1zZy50b1N0cmluZygpLCBudWxsKTsKLQkJCQkJCXJldFswXSA9IGNzOwotCQkJCQkJcmV0dXJuIHJldDsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX07Ci0KLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy51cGdyYWRlTGlicmFyeUVycm9yX21zZywgc3RhdHVzKTsKLQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCWlmIChERUJVRykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlLAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlFcnJvcl9tc2cpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgcGF0aCBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIG9wZW5lZCBvbmx5IGlmIHRoZXJlIGFyZQotCSAqIG5vIHNhdmVkIGxpYnJhcnkgcHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tbWFuZExpbmVEZWZhdWx0TGlicmFyeShTdHJpbmcgbGlicmFyeVBhdGgpIHsKLQkJaWYgKGxpYnJhcnlQYXRoICE9IG51bGwgJiYgbGlicmFyeVBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJUGF0aCBwYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcobGlicmFyeVBhdGgpOwotCQkJdHJ5IHsKLQkJCQlkZWZhdWx0TGlicmFyeVVSSSA9IHBhdGgudG9GaWxlKCkudG9VUkkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZGVmYXVsdExpYnJhcnlVUkkgPSBudWxsOwotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGF0aCBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgdGhhdCB3aWxsIGJlIG9wZW5lZCByZWdhcmRsZXNzIG9mIHRoZQotCSAqIHNhdmVkIGxpYnJhcnkgcHJlZmVyZW5jZXMuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoCi0JICogICAgICAgICAgICBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29tbWFuZExpbmVMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5UGF0aCkgewotCQlpZiAobGlicmFyeVBhdGggIT0gbnVsbCAmJiBsaWJyYXJ5UGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCUlQYXRoIHBhdGggPSBQYXRoLmZyb21PU1N0cmluZyhsaWJyYXJ5UGF0aCk7Ci0JCQl0cnkgewotCQkJCWxpYnJhcnlVUkkgPSBwYXRoLnRvRmlsZSgpLnRvVVJJKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWxpYnJhcnlVUkkgPSBudWxsOwotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCi0JICogc3lzdGVtIHRvb2xiYXIuCi0JICogPHA+Ci0JICogVGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94IGxpc3RzIGFsbCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluCi0JICogdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKElXb3JrYmVuY2hXaW5kb3cpIHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwgJiYgd2luZG93IGluc3RhbmNlb2YgQXBwbGljYXRpb25XaW5kb3cpIHsKLQkJCQlJQ29vbEJhck1hbmFnZXIgY29vbEJhck1nciA9ICgoQXBwbGljYXRpb25XaW5kb3cpIHdpbmRvdykKLQkJCQkJCS5nZXRDb29sQmFyTWFuYWdlcigpOwotCQkJCXRyeSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlpZiAoZm91bmRDb25maWdWaWV3KGFjdGl2ZVBhZ2UpCi0JCQkJCQkJfHwgZm91bmRQcm9jZXNzRWRpdG9yKGFjdGl2ZVBhZ2UpKSB7Ci0JCQkJCQlzaG93Q29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbihjb29sQmFyTWdyKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWhpZGVDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKGNvb2xCYXJNZ3IpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIENvbmZpZ3VyYXRpb24gdmlldyBpbiB0aGUgYWN0aXZlIHdvcmtiZW5jaAotCSAqIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZvdW5kQ29uZmlnVmlldyhJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlKSB7Ci0JCWlmIChhY3RpdmVQYWdlID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGFjdGl2ZVBhZ2UuZmluZFZpZXcoQ09ORklHX1ZJRVdfSUQpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBQcm9jZXNzIGVkaXRvciBpbiB0aGUgYWN0aXZlIHdvcmtiZW5jaC4KLQkgKiBwYWdlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmb3VuZFByb2Nlc3NFZGl0b3IoSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSkgewotCQlpZiAoYWN0aXZlUGFnZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gYWN0aXZlUGFnZS5maW5kRWRpdG9ycyhudWxsLAotCQkJCVBST0NFU1NfRURJVE9SX0lELCBJV29ya2JlbmNoUGFnZS5NQVRDSF9JRCk7Ci0JCXJldHVybiBlZGl0b3JSZWZzICE9IG51bGwgJiYgZWRpdG9yUmVmcy5sZW5ndGggPiAwOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCBpbiB0aGUgc3lzdGVtIHRvb2xiYXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNob3dDb25maWd1cmF0aW9uQ29udHJpYnV0aW9uKElDb29sQmFyTWFuYWdlciBjb29sQmFyTWdyKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIENoZWNrIGZvciB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhci4KLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29uZmlnVG9vbEJhciA9IGNvb2xCYXJNZ3IKLQkJCQkuZmluZChUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQpOwotCi0JCWlmIChjb25maWdUb29sQmFyICE9IG51bGwpIHsKLQkJCS8vIE1ha2Ugc3VyZSB0aGUgdG9vbGJhciBoYXMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGNvbWJvYm94Ci0JCQkvLyBjb250cmlidXRpb24uCi0JCQlpZiAoY29uZmlnVG9vbEJhciBpbnN0YW5jZW9mIFRvb2xCYXJDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IgPSAoKFRvb2xCYXJDb250cmlidXRpb25JdGVtKSBjb25maWdUb29sQmFyKQotCQkJCQkJLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQkJaWYgKHRvb2xCYXJNZ3IgIT0gbnVsbCkgewotCQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIHRvb2xCYXJJdGVtcyA9IHRvb2xCYXJNZ3IuZ2V0SXRlbXMoKTsKLQkJCQkJaWYgKHRvb2xCYXJJdGVtcyAhPSBudWxsICYmIHRvb2xCYXJJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xCYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCXRvb2xCYXJJdGVtc1tpXS5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJfQotCQkJCQkJY29uZmlnVG9vbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQkJdXBkYXRlU3lzdGVtVG9vbEJhcihjb29sQmFyTWdyKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCB0b29sYmFyIGhhcyBiZWVuIHJlc3RvcmVkCi0JCQkJLy8gdmlhIGEgc2F2ZWQgcGVyc3BlY3RpdmUsIGFkZCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkJCQkvLyBjb21ib2JveCBjb250cmlidXRpb24uCi0JCQkJY29uZmlnQ29tYm8gPSBuZXcgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oCi0JCQkJCQludWxsKTsKLQkJCQl0b29sQmFyTWdyLmFkZChjb25maWdDb21ibyk7Ci0JCQkJY29uZmlnVG9vbEJhci5zZXRWaXNpYmxlKHRydWUpOwotCQkJCXVwZGF0ZVN5c3RlbVRvb2xCYXIoY29vbEJhck1ncik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IgPSBuZXcgVG9vbEJhck1hbmFnZXIoU1dULkZMQVQgfCBTV1QuTEVGVCk7Ci0JCWNvbmZpZ0NvbWJvID0gbmV3IENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtKAotCQkJCW51bGwpOwotCQl0b29sQmFyTWdyLmFkZChjb25maWdDb21ibyk7Ci0JCVRvb2xCYXJDb250cmlidXRpb25JdGVtIGNvbmZpZ0NvbWJvVG9vbEJhciA9IG5ldyBUb29sQmFyQ29udHJpYnV0aW9uSXRlbSgKLQkJCQl0b29sQmFyTWdyLCBUT09MQkFSX0NPTkZJR19DT05UUklCVVRJT05fSUQpOwotCQljb29sQmFyTWdyLmFkZChjb25maWdDb21ib1Rvb2xCYXIpOwotCX0KLQotCS8qKgotCSAqIEhpZGVzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCBmcm9tIHRoZSBzeXN0ZW0gdG9vbGJhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGlkZUNvbmZpZ3VyYXRpb25Db250cmlidXRpb24oSUNvb2xCYXJNYW5hZ2VyIGNvb2xCYXJNZ3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gQ2hlY2sgZm9yIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib2JveCB0b29sYmFyLgotCQlJQ29udHJpYnV0aW9uSXRlbSBjb25maWdUb29sQmFyID0gY29vbEJhck1ncgotCQkJCS5maW5kKFRPT0xCQVJfQ09ORklHX0NPTlRSSUJVVElPTl9JRCk7Ci0KLQkJaWYgKGNvbmZpZ1Rvb2xCYXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gSGlkZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggY29udHJpYnV0aW9uIGZyb20gdGhlIHRvb2xiYXIuCi0JCWlmIChjb25maWdUb29sQmFyIGluc3RhbmNlb2YgVG9vbEJhckNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCUlUb29sQmFyTWFuYWdlciB0b29sQmFyTWdyID0gKChUb29sQmFyQ29udHJpYnV0aW9uSXRlbSkgY29uZmlnVG9vbEJhcikKLQkJCQkJLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQlJQ29udHJpYnV0aW9uSXRlbVtdIHRvb2xCYXJJdGVtcyA9IHRvb2xCYXJNZ3IuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG9vbEJhckl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdG9vbEJhckl0ZW1zW2ldLnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gSGlkZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29tYm9ib3ggdG9vbGJhciBjb250cmlidXRpb24uCi0JCWNvbmZpZ1Rvb2xCYXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJLy8gVXBkYXRlIHRoZSB0aGUgc3lzdGVtIHRvb2wgYmFyLgotCQl1cGRhdGVTeXN0ZW1Ub29sQmFyKGNvb2xCYXJNZ3IpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHN5c3RlbSB0b29sIGJhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3lzdGVtVG9vbEJhcihJQ29vbEJhck1hbmFnZXIgY29vbEJhck1ncikgewotCQlpZiAoY29vbEJhck1nciBpbnN0YW5jZW9mIENvb2xCYXJNYW5hZ2VyKSB7Ci0JCQkoKENvb2xCYXJNYW5hZ2VyKSBjb29sQmFyTWdyKS51cGRhdGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgcGFydCBsaXN0ZW5lciBzbyB0aGUgbGlicmFyeSB3aWxsIG9wZW4gdXBvbiAic3RhcnR1cCIKLQkgKiAic3RhcnR1cCIgbWVhbnMgd2hlbiB0aGUgdmlldyB3aXRoIHRoZSBzcGVjaWZpZWQgaWQgaXMgZmlyc3QKLQkgKiB2aXNpYmxlCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kVmlld1BhcnRMaXN0ZW5lcihmaW5hbCBTdHJpbmcgaWQpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQlpZiAod29ya2JlbmNoICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gKElXb3JrYmVuY2hXaW5kb3cpIHdvcmtiZW5jaAotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQlpZiAod2luZG93ICE9IG51bGwgJiYgd2luZG93IGluc3RhbmNlb2YgQXBwbGljYXRpb25XaW5kb3cpIHsKLQkJCQl0cnkgewotCQkJCQlmaW5hbCBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJYWN0aXZlUGFnZS5hZGRQYXJ0TGlzdGVuZXIobmV3IElQYXJ0TGlzdGVuZXIyKCkgewotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0QWN0aXZhdGVkKAotCQkJCQkJCQlJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoCi0JCQkJCQkJCUlXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZCgKLQkJCQkJCQkJSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0SGlkZGVuKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydElucHV0Q2hhbmdlZCgKLQkJCQkJCQkJSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIHZvaWQgcGFydFZpc2libGUoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJCQkJCWlmIChwYXJ0UmVmLmdldElkKCkuZXF1YWxzKGlkKSkgewotCQkJCQkJCQlhY3RpdmVQYWdlLnJlbW92ZVBhcnRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCQkJc3RhcnR1cE9wZW5MaWJyYXJ5KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJCi0JCQkJCX0pOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCQotCQotCS8qKgotCSAqIE9wZW5zIHRoZSBsaWJyYXJ5IHVwb24gc3RhcnR1cAotCSAqIDEuICBGaXJzdCB0cmllcyB0byBvcGVuIHRoZSBsaWJyYXJ5IHNwZWNpZmllZCBieSAtbGlicmFyeQotCSAqIDIuICBUaGVuIHRyaWVzIHRvIG9wZW4gdGhlIGxhc3Qgb3BlbmVkIGxpYnJhcnkKLQkgKiAzLiAgRmluYWxseSwgdHJpZXMgdG8gb3BlbiB0aGUgbGlicmFyeSBzcGVjaWZpZWQgYnkgLWRlZmF1bHRsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc3RhcnR1cE9wZW5MaWJyYXJ5KCkgewotCQlpZiAobGlicmFyeUluaXRpYWxpemVkID09IHRydWUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlsaWJyYXJ5SW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl0cnkgewotCQkJU3RyaW5nIHNhdmVkTWV0aG9kTGlicmFyeVVSSSA9IExpYnJhcnlQcmVmZXJlbmNlcwotCQkJLmdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpOwotCQkJYm9vbGVhbiBoYXNTYXZlZFVyaSA9IHNhdmVkTWV0aG9kTGlicmFyeVVSSSAhPSBudWxsICYmIHNhdmVkTWV0aG9kTGlicmFyeVVSSS5sZW5ndGgoKSA+IDA7Ci0JCQkKLQkJCVN0cmluZyBsYXN0U2F2ZWRDb25maWdOYW1lID0gUHJlZmVyZW5jZVV0aWwuZ2V0U2F2ZWRMYXN0Q29uZmlnKCk7Ci0JCQlpZiAobGlicmFyeVVSSSAhPSBudWxsICYmIG9wZW5MaWJyYXJ5KGxpYnJhcnlVUkkpKSB7Ci0JCQl9IGVsc2UgaWYgKG9wZW5MYXN0T3BlbmVkTGlicmFyeSgpKSB7Ci0JCQl9IGVsc2UgaWYgKGRlZmF1bHRMaWJyYXJ5VVJJICE9IG51bGwgJiYgIWhhc1NhdmVkVXJpKSB7Ci0JCQkJLy8gVHJ5IGxvYWRpbmcgdGhlIE5MIGxpYnJhcnkgZmlyc3QuCi0JCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQkJU3RyaW5nIGRlZmF1bHRMaWJyYXJ5U3RyID0gbmV3IEZpbGUoZGVmYXVsdExpYnJhcnlVUkkpCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJU3RyaW5nIGxvY2FsaXplZExpYlBhdGggPSBJMThuVXRpbC5nZXRMb2NhbGl6ZWRGaWxlKAotCQkJCQkJRmlsZVV0aWwucmVtb3ZlQWxsU2VwYXJhdG9yKGRlZmF1bHRMaWJyYXJ5U3RyKSwKLQkJCQkJCWxvY2FsZSk7Ci0JCQkJaWYgKGxvY2FsaXplZExpYlBhdGggIT0gbnVsbCkgewotCQkJCQlkZWZhdWx0TGlicmFyeVVSSV9OTCA9IFN0clV0aWwudG9VUkkobG9jYWxpemVkTGliUGF0aCk7Ci0JCQkJfQotCQkJCWlmIChkZWZhdWx0TGlicmFyeVVSSV9OTCAhPSBudWxsICYmIG9wZW5EZWZhdWx0TGlicmFyeShkZWZhdWx0TGlicmFyeVVSSV9OTCkpIHsKLQkJCQl9IGVsc2UgewotCQkJCQlvcGVuRGVmYXVsdExpYnJhcnkoZGVmYXVsdExpYnJhcnlVUkkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbCkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gc2F2ZWRDb25maWcgPSBMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBsYXN0U2F2ZWRDb25maWdOYW1lKTsKLQkJCQlpZiAoc2F2ZWRDb25maWcgIT0gbnVsbCkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKHNhdmVkQ29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiBudWxsIGlmIHBhdGggaXMgbm90IG9uIGluc3RhbGwgcGF0aCBvciBub3QgcmVhZC1vbmx5IG9yIGlmIHVzZXIgCi0JICogZGVjbGluZXMgdG8gY29weSB0aGUgbGlicmFyeSB0byBhIHdyaXRhYmxlIGxvY2F0aW9uLiBSZXR1cm5zCi0JICogYSBuZXcgcGF0aCBpZiB0aGUgdXNlciB3aXNoZXMgdG8gb3BlbiB0aGUgbGlicmFyeSBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGhhbmRsZUxpYnJhcnlPblJlYWRPbmx5SW5zdGFsbFBhdGgoVVJJIGxpYlVSSSkgewotCQl0cnkgewotCQkJYm9vbGVhbiByZWFkT25seSA9IGZhbHNlOwotCQkJCi0JCQkvLyBkZXRlcm1pbmUgaWYgcGF0aCBpcyBpbiBJbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0JCQlGaWxlIGxpYlBhdGhGaWxlID0gbmV3IEZpbGUobGliVVJJKTsKLQkJCWlmICghbGliUGF0aEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUxvY2F0aW9uIGluc3RhbGxMb2NhdGlvbiA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQkJVVJMIGluc3RhbGxMb2NhdGlvblVSTCA9IGluc3RhbGxMb2NhdGlvbi5nZXRVUkwoKTsKLQkJCVVSSSBpbnN0YWxsTG9jYXRpb25VUkkgPSBuZXcgVVJJKE5ldFV0aWwuZW5jb2RlRmlsZVVSTChpbnN0YWxsTG9jYXRpb25VUkwudG9FeHRlcm5hbEZvcm0oKSkpOwotCQkJRmlsZSBpbnN0YWxsTG9jRmlsZSA9IG5ldyBGaWxlKGluc3RhbGxMb2NhdGlvblVSSSk7Ci0JCQlTdHJpbmcgY2Fub25pY2FsTGliUGF0aCA9IGxpYlBhdGhGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCVN0cmluZyBjYW5vbmljYWxJbnN0YWxsUGF0aCA9IGluc3RhbGxMb2NGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCWlmICghY2Fub25pY2FsTGliUGF0aC5zdGFydHNXaXRoKGNhbm9uaWNhbEluc3RhbGxQYXRoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBkZXRlcm1pbmUgaWYgT1MgaXMgbm90IHZpc3RhIG9yIGxpbnV4Ci0JCQlTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwbGF0Zm9ybU9TID0gUGxhdGZvcm0uZ2V0T1MoKTsKLQkJCWlmICgob3NOYW1lLmluZGV4T2YoIlZpc3RhIikgPiAtMSkgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBwbGF0Zm9ybU9TLmVxdWFscyhQbGF0Zm9ybS5PU19MSU5VWCkpIHsKLQkJCQlyZWFkT25seSA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShsaWJQYXRoRmlsZSwgWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9YTUkpOwotCi0JCQkvLyBkbyBub3QgYWxsb3cgYSByZWFkLW9ubHkgZGVmYXVsdCBsaWJyYXJ5Ci0JCQlpZiAoIWxpYlBhdGhGaWxlLmNhbldyaXRlKCkgfHwgIWxpYnJhcnlYTUlGaWxlLmNhbldyaXRlKCkpIHsKLQkJCQlyZWFkT25seSA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCWlmICghcmVhZE9ubHkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gc2hvdyBkaWFsb2csIGFsbG93IGNvcHkgdG8gbmV3IHBhdGgKLQotCQkJZmluYWwgU3RyaW5nIGRlZmF1bHRDb3B5UGF0aCA9IG5ldyBGaWxlKG5ldyBGaWxlKExpYnJhcnlVSVByZWZlcmVuY2VzLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKS5nZXRQYXJlbnQoKSwgbGliUGF0aEZpbGUuZ2V0TmFtZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJZmluYWwgU3RyaW5nQnVmZmVyIG5ld1BhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkKLQkJCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5nZXRVSUhlbHBlcigpLnJ1blNhZmVseShuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29weUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvcHlMaWJyYXJ5RGlhbG9nX3RleHRfcmVhZE9ubHlMaWI7Ci0JCQkJCUNvcHlMaWJyYXJ5RGlhbG9nIGRsZyA9IG5ldyBDb3B5TGlicmFyeURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCB0aXRsZSwKLQkJCQkJCQltZXNzYWdlLCBkZWZhdWx0Q29weVBhdGgpOwotCi0JCQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5PSykgewotCQkJCQkJbmV3UGF0aC5hcHBlbmQoZGxnLmdldFBhdGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9LCBmYWxzZSk7Ci0JCQlpZiAobmV3UGF0aC5sZW5ndGgoKSA+IDApIHsKLQkJCQljb3B5TGlicmFyeShsaWJQYXRoRmlsZSwgbmV3IEZpbGUobmV3UGF0aC50b1N0cmluZygpKSk7Ci0JCQkJcmV0dXJuIG5ld1BhdGgudG9TdHJpbmcoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIHVyaUV4KSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKHVyaUV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4KSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGlvRXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQmFjayB1cCBsaWJyYXJ5IAotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29weUxpYnJhcnkoZmluYWwgRmlsZSBzb3VyY2UsIGZpbmFsIEZpbGUgZGVzdCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQkvLyBleGN1ZGUgdGhlIG5vbi1saWJyYXJ5IGZpbGVzIHRoYXQgbWlnaHQgYmUgbG9ja2VkIGJ5IHJtYy4KLQkJCQkJLy8gdGhlc2UgZmlsZXMgbWF5IGNhdXNlIGJhY2t1cCB0byBmYWlsIGR1ZSB0byBmaWxlIGxvY2suCi0JCQkJCVN0cmluZyBleGNsdWRlcyA9ICIubG9jayI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoc291cmNlLCBkZXN0LCAiKioiLCBleGNsdWRlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJVXNlckludGVyYWN0aW9uSGVscGVyLnJ1bldpdGhQcm9ncmVzcyhydW5uYWJsZSwKLQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY29weUxpYnJhcnlUYXNrX25hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgTWV0aG9kQ29uZmlndXJhdGlvbiBkcm9wZG93biBib3gKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gZ2V0Q29uZmlnQ29tYm8oKSB7Ci0JCXJldHVybiBjb25maWdDb21ibzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWNmZGI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQnJvd3NpbmdMYXlvdXRTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmZXJlbmNlcy5MaWJyYXJ5UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgVUkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IExpYnJhcnlVSVBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlVSVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlIHRoZSBwdWJsaXNoaW5nL2Jyb3dzaW5nIGxheW91dCBzZXR0aW5ncy4KLQkgKiBDYWxsIHRoaXMgbWV0aG9kIHdoZW4gZXZlciBwdWJsaXNoaW5nL2Jyb3dzaW5nIHJlbGF0ZWQgcHJlZmVyZW5jZXMgYXJlIGNoYW5nZWQuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVMYXlvdXRTZXR0aW5ncygpIAotCXsKLQkJLy8gZ2V0IHRoZSBza2luIHNldHRpbmcgZnJvbSBwcmVmZXJlbmNlCi0JCWJvb2xlYW4gcHVibGlzaFVub3BlbkFjdGl2aXR5ZGQgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwkKLQkJYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IExpYnJhcnlVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCk7Ci0JCWJvb2xlYW4gdXNlTmV3RXh0ZW5kcyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCk7Ci0JCQotCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKTsKLQkJQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5zZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCk7Ci0JCUJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0VXNlTmV3RXh0ZW5kU2VtYW50aWNzKHVzZU5ld0V4dGVuZHMpOwotCQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDMyMmE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9MaWJyYXJ5VUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgVUkgcmVzb3VyY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzc1MDAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0l0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2l0ZVJvbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnRlbnRQYWNrYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjdXN0b21DYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb21haW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRhbmNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0ZXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29uZmlndXJhdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kQ29udGVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kTGlicmFyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kUGx1Z2luX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWxlc3RvbmVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGNvbWVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG92ZXJyaWRlQ3VycmVudExpYnJhcnlFcnJvcl9tc2cwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGhhc2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByYWN0aWNlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQ29udHJpYnV0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzRmFtaWx5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXVzYWJsZUFzc2V0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGFuZGFyZENhdGVnb3J5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGVwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tEZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZWFtUHJvZmlsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlcm1EZWZpbml0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sTWVudG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdEVsZW1lbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tJdGVtX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcG9zaXRlUm9sZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmNlcHRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlzY2lwbGluZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NpcGxpbmVHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvbWFpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXN0aW1hdGluZ01ldHJpY190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkYW5jZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1aWRlbGluZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl0ZXJhdGlvbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RDb250ZW50X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZFBhY2thZ2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtZXRob2RQbHVnaW5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaWxlc3RvbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRjb21lX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGhhc2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb3J0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmV1c2FibGVBc3NldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvYWRtYXBfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlU2V0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZVNldEdyb3VwaW5nX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhbmRhcmRDYXRlZ29yeV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ZXBfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0Rlc2NyaXB0b3JfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRlbXBsYXRlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybURlZmluaXRpb25fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9vbE1lbnRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdoaXRlcGFwZXJfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGxpY2F0aW9uX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlXaXphcmRfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZV8yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVyaUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlUeXBlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpYnJhcnlMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnJvd3NlQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRGb3JMaWJyYXJ5Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuaW5nTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5MaWJyYXJ5RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlJbnRlcm5sRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24yOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9yZWFzb240OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3BlbkxpYnJhcnlFcnJvcl9hZHZpY2U7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTGlicmFyeVBhdGhfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldHJ5QnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5jZWxCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGVMaWJyYXJ5RGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaENvbmZpZ0RpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3VycmVudENvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb25maWdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRmlsZXNDb25maXJtYXRpb25fbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRmlsZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVQYXRoRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFBhdGhfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3VwTGlicmFyeURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2t1cExpYnJhcnlEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXRoU2VsZWN0aW9uRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2tCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNraXBCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFsd2F5c0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmV2ZXJCdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdEJ1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlua1RvVVJMX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaW5rVG9GaWxlX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50TGlua19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudExpbmtXaXRoVHlwZV9uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eURpYWxvZ190aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRBY3Rpdml0eURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmVyc2lvbk1pc21hdGNoRGlhbG9nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0UHJvY2Vzc1dpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvY2Vzc2VzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb25MYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9PcGVuTGlicmFyeVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uX2RlbGV0ZWNvbmZpcm1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maXJtRGVsZXRlRGlhbG9nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpcm1EZWxldGVEaWFsb2dfbXNnV2l0aFJlZmVyZW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlTGlicmFyeUVycm9yX21zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlEaWFsb2dfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUxpYnJhcnlEaWFsb2dfdGV4dF9yZWFkT25seUxpYjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5TGlicmFyeVRhc2tfbmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5TGlicmFyeURpYWxvZ19jb3B5QnV0dG9uX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBMaWJyYXJ5VUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2FsaXplZCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2Uga2V5IGFuZCBmb3JtYXR0ZWQKLQkgKiB3aXRoIGEgZ2l2ZW4gb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIEEgcmVzb3VyY2Uga2V5LgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBBbiBvYmplY3QuCi0JICogQHJldHVybiBBIGZvcm1hdHRlZCBsb2NhbGl6ZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKGtleSwgbmV3IE9iamVjdFtdIHsgZGF0YSB9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVGV4dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY1ZDg1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNoZWNrbGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25jZXB0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2FkbWFwSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGw7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGNhY2hlZCBjb3B5IG9mIGNvbW1vbmx5IHJlZmVyZW5jZWQgdGV4dCBpbiB0aGUgbGlicmFyeSBVSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VUlUZXh0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQUNUSVZJVFkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYWN0aXZpdHlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQVJUSUZBQ1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYXJ0aWZhY3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0FQQUJJTElUWV9QQVRURVJOID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLTElTVCA9IExpYnJhcnlVSVJlc291cmNlcy5jaGVja2xpc3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hFQ0tfSVRFTSA9IExpYnJhcnlVSVJlc291cmNlcy5jaGVja0l0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09NUE9TSVRFX1JPTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY29tcG9zaXRlUm9sZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT05DRVBUID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbmNlcHRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ09OVEVOVF9QQUNLQUdFID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbnRlbnRQYWNrYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NVU1RPTV9DQVRFR09SWSA9IExpYnJhcnlVSVJlc291cmNlcy5jdXN0b21DYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSQUJMRSA9IExpYnJhcnlVSVJlc291cmNlcy5kZWxpdmVyYWJsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSWV9QUk9DRVNTID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERVNDUklQVE9SID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRElTQ0lQTElORSA9IExpYnJhcnlVSVJlc291cmNlcy5kaXNjaXBsaW5lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RJU0NJUExJTkVfR1JPVVBJTkcgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RPTUFJTiA9IExpYnJhcnlVSVJlc291cmNlcy5kb21haW5fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXhhbXBsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU5HX01FVFJJQyA9IExpYnJhcnlVSVJlc291cmNlcy5lc3RpbWF0aW5nTWV0cmljX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VYQU1QTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZXhhbXBsZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlEQU5DRSA9IExpYnJhcnlVSVJlc291cmNlcy5ndWlkYW5jZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9HVUlERUxJTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZ3VpZGVsaW5lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0lURVJBVElPTiA9IExpYnJhcnlVSVJlc291cmNlcy5pdGVyYXRpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTiA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb25maWd1cmF0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FVEhPRF9DT05URU5UID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZENvbnRlbnRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0xJQkFSQVJZID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZExpYnJhcnlfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BBQ0tBR0UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfUExVR0lOID0gTGlicmFyeVVJUmVzb3VyY2VzLm1ldGhvZFBsdWdpbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NSUxFU1RPTkUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWlsZXN0b25lX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX09VVENPTUUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3V0Y29tZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QSEFTRSA9IExpYnJhcnlVSVJlc291cmNlcy5waGFzZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUkFDVElDRSA9IExpYnJhcnlVSVJlc291cmNlcy5wcmFjdGljZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19DT05UUklCVVRJT04gPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0ZBTUlMWSA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzRmFtaWx5X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUEFDS0FHRSA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzUGFja2FnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9SRVBPUlQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucmVwb3J0X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFVVNBQkxFX0FTU0VUID0gTGlicmFyeVVJUmVzb3VyY2VzLnJldXNhYmxlQXNzZXRfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9BRE1BUCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2FkbWFwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JPTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZURlc2NyaXB0b3JfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVQgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX1NFVF9HUk9VUElORyA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlU2V0R3JvdXBpbmdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RBTkRBUkRfQ0FURUdPUlkgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuc3RhbmRhcmRDYXRlZ29yeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TVEVQID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0ZXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1VQUE9SVElOR19NQVRFUklBTCA9IExpYnJhcnlVSVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEFTSyA9IExpYnJhcnlVSVJlc291cmNlcy50YXNrX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RBU0tfREVTQ1JJUFRPUiA9IExpYnJhcnlVSVJlc291cmNlcy50YXNrRGVzY3JpcHRvcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9URUFNX1BST0ZJTEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVhbVByb2ZpbGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVNUExBVEUgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGVtcGxhdGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVSTV9ERUZJTklUSU9OID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlcm1EZWZpbml0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1RPT0wgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MX01FTlRPUiA9IExpYnJhcnlVSVJlc291cmNlcy50b29sTWVudG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dISVRFUEFQRVIgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud2hpdGVwYXBlcl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1QgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3RfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1dPUktfUFJPRFVDVF9FTEVNRU5UID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RWxlbWVudF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9XT1JLX1BST0RVQ1RfVFlQRSA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdFR5cGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQUNUSVZJVFlfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmFjdGl2aXR5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9BUlRJRkFDVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYXJ0aWZhY3RfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2FwYWJpbGl0eVBhdHRlcm5fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NIRUNLTElTVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuY2hlY2tsaXN0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DSEVDS19JVEVNX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jaGVja0l0ZW1fdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0NPTVBPU0lURV9ST0xFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb21wb3NpdGVSb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT05DRVBUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5jb25jZXB0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DT05URU5UX1BBQ0tBR0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbnRlbnRQYWNrYWdlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9DVVNUT01fQ0FURUdPUllfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmN1c3RvbUNhdGVnb3J5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ERUxJVkVSQUJMRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0RFTElWRVJZX1BST0NFU1NfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfREVTQ1JJUFRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRElTQ0lQTElORV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRElTQ0lQTElORV9HUk9VUElOR19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuZGlzY2lwbGluZUdyb3VwaW5nX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ET01BSU5fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmRvbWFpbl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRVNUSU1BVEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VTVElNQVRJTkdfTUVUUklDX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5lc3RpbWF0aW5nTWV0cmljX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0VYQU1QTEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLmV4YW1wbGVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0dVSURBTkNFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5ndWlkYW5jZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfR1VJREVMSU5FX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5ndWlkZWxpbmVfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX0lURVJBVElPTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuaXRlcmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RDb25maWd1cmF0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfQ09OVEVOVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kQ29udGVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX0xJQkFSQVJZX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5tZXRob2RMaWJyYXJ5X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NRVRIT0RfUEFDS0FHRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfTUVUSE9EX1BMVUdJTl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMubWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9NSUxFU1RPTkVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLm1pbGVzdG9uZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfT1VUQ09NRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMub3V0Y29tZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUEhBU0VfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnBoYXNlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUkFDVElDRV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJhY3RpY2VfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3NfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1BST0NFU1NfQ09OVFJJQlVUSU9OX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzQ29udHJpYnV0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QUk9DRVNTX0ZBTUlMWV9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucHJvY2Vzc0ZhbWlseV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUFJPQ0VTU19QQUNLQUdFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5wcm9jZXNzUGFja2FnZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQT1JUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXBvcnRfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFVVNBQkxFX0FTU0VUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yZXVzYWJsZUFzc2V0X3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0FETUFQX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2FkbWFwX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy5yb2xlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVEZXNjcmlwdG9yX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9ST0xFX1NFVF9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucm9sZVNldF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkdfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfU1RBTkRBUkRfQ0FURUdPUllfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NURVBfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnN0ZXBfdGV4dF9wbHVyYWw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NVUFBPUlRJTkdfTUFURVJJQUxfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEFTS19QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudGFza190ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEFTS19ERVNDUklQVE9SX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVBTV9QUk9GSUxFX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfVEVNUExBVEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlbXBsYXRlX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9URVJNX0RFRklOSVRJT05fUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLnRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy50b29sX3RleHRfcGx1cmFsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UT09MX01FTlRPUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMudG9vbE1lbnRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV0hJVEVQQVBFUl9QTFVSQUwgPSBMaWJyYXJ5VUlSZXNvdXJjZXMud2hpdGVwYXBlcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1BMVVJBTCA9IExpYnJhcnlVSVJlc291cmNlcy53b3JrUHJvZHVjdF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RGVzY3JpcHRvcl90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX0VMRU1FTlRfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0RWxlbWVudF90ZXh0X3BsdXJhbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfV09SS19QUk9EVUNUX1RZUEVfUExVUkFMID0gTGlicmFyeVVJUmVzb3VyY2VzLndvcmtQcm9kdWN0VHlwZV90ZXh0X3BsdXJhbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzcywgU3RyaW5nPiBFTEVNRU5UX1RFWFQgPSBuZXcgSGFzaE1hcDxDbGFzcywgU3RyaW5nPigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLCBTdHJpbmc+IEVMRU1FTlRfVEVYVF9QTFVSQUwgPSBuZXcgSGFzaE1hcDxDbGFzcywgU3RyaW5nPigpOwotCi0Jc3RhdGljIHsKLQkJRUxFTUVOVF9URVhULnB1dChBY3Rpdml0eUltcGwuY2xhc3MsIFRFWFRfQUNUSVZJVFkpOwotCQlFTEVNRU5UX1RFWFQucHV0KEFydGlmYWN0SW1wbC5jbGFzcywgVEVYVF9BUlRJRkFDVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmNsYXNzLCBURVhUX0NBUEFCSUxJVFlfUEFUVEVSTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoQ2hlY2tsaXN0SW1wbC5jbGFzcywgVEVYVF9DSEVDS0xJU1QpOwotCQlFTEVNRU5UX1RFWFQucHV0KENvbXBvc2l0ZVJvbGVJbXBsLmNsYXNzLCBURVhUX0NPTVBPU0lURV9ST0xFKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb25jZXB0SW1wbC5jbGFzcywgVEVYVF9DT05DRVBUKTsKLQkJRUxFTUVOVF9URVhULnB1dChDb250ZW50UGFja2FnZUltcGwuY2xhc3MsIFRFWFRfQ09OVEVOVF9QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChDdXN0b21DYXRlZ29yeUltcGwuY2xhc3MsIFRFWFRfQ1VTVE9NX0NBVEVHT1JZKTsKLQkJRUxFTUVOVF9URVhULnB1dChEZWxpdmVyYWJsZUltcGwuY2xhc3MsIFRFWFRfREVMSVZFUkFCTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KERlbGl2ZXJ5UHJvY2Vzc0ltcGwuY2xhc3MsIFRFWFRfREVMSVZFUllfUFJPQ0VTUyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRGlzY2lwbGluZUltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORSk7Ci0JCUVMRU1FTlRfVEVYVAotCQkJCS5wdXQoRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5jbGFzcywgVEVYVF9ESVNDSVBMSU5FX0dST1VQSU5HKTsKLQkJRUxFTUVOVF9URVhULnB1dChEb21haW5JbXBsLmNsYXNzLCBURVhUX0RPTUFJTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5jbGFzcywKLQkJCQlURVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQlFTEVNRU5UX1RFWFQucHV0KEV4YW1wbGVJbXBsLmNsYXNzLCBURVhUX0VYQU1QTEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KEd1aWRlbGluZUltcGwuY2xhc3MsIFRFWFRfR1VJREVMSU5FKTsKLQkJRUxFTUVOVF9URVhULnB1dChJdGVyYXRpb25JbXBsLmNsYXNzLCBURVhUX0lURVJBVElPTik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RMaWJyYXJ5SW1wbC5jbGFzcywgVEVYVF9NRVRIT0RfTElCQVJBUlkpOwotCQlFTEVNRU5UX1RFWFQucHV0KE1ldGhvZFBhY2thZ2VJbXBsLmNsYXNzLCBURVhUX01FVEhPRF9QQUNLQUdFKTsKLQkJRUxFTUVOVF9URVhULnB1dChNZXRob2RQbHVnaW5JbXBsLmNsYXNzLCBURVhUX01FVEhPRF9QTFVHSU4pOwotCQlFTEVNRU5UX1RFWFQucHV0KE1pbGVzdG9uZUltcGwuY2xhc3MsIFRFWFRfTUlMRVNUT05FKTsKLQkJRUxFTUVOVF9URVhULnB1dChPdXRjb21lSW1wbC5jbGFzcywgVEVYVF9PVVRDT01FKTsKLQkJRUxFTUVOVF9URVhULnB1dChQaGFzZUltcGwuY2xhc3MsIFRFWFRfUEhBU0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByYWN0aWNlSW1wbC5jbGFzcywgVEVYVF9QUkFDVElDRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUHJvY2Vzc0ZhbWlseUltcGwuY2xhc3MsIFRFWFRfUFJPQ0VTU19GQU1JTFkpOwotCQlFTEVNRU5UX1RFWFQucHV0KFByb2Nlc3NQYWNrYWdlSW1wbC5jbGFzcywgVEVYVF9QUk9DRVNTX1BBQ0tBR0UpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJlcG9ydEltcGwuY2xhc3MsIFRFWFRfUkVQT1JUKTsKLQkJRUxFTUVOVF9URVhULnB1dChSZXVzYWJsZUFzc2V0SW1wbC5jbGFzcywgVEVYVF9SRVVTQUJMRV9BU1NFVCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9hZG1hcEltcGwuY2xhc3MsIFRFWFRfUk9BRE1BUCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9sZUltcGwuY2xhc3MsIFRFWFRfUk9MRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9sZURlc2NyaXB0b3JJbXBsLmNsYXNzLCBURVhUX1JPTEVfREVTQ1JJUFRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoUm9sZVNldEltcGwuY2xhc3MsIFRFWFRfUk9MRV9TRVQpOwotCQlFTEVNRU5UX1RFWFQucHV0KFJvbGVTZXRHcm91cGluZ0ltcGwuY2xhc3MsIFRFWFRfUk9MRV9TRVRfR1JPVVBJTkcpOwotCQlFTEVNRU5UX1RFWFQucHV0KFN0ZXBJbXBsLmNsYXNzLCBURVhUX1NURVApOwotCQlFTEVNRU5UX1RFWFQKLQkJCQkucHV0KFN1cHBvcnRpbmdNYXRlcmlhbEltcGwuY2xhc3MsIFRFWFRfU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGFza0ltcGwuY2xhc3MsIFRFWFRfVEFTSyk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGFza0Rlc2NyaXB0b3JJbXBsLmNsYXNzLCBURVhUX1RBU0tfREVTQ1JJUFRPUik7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVhbVByb2ZpbGVJbXBsLmNsYXNzLCBURVhUX1RFQU1fUFJPRklMRSk7Ci0JCUVMRU1FTlRfVEVYVC5wdXQoVGVtcGxhdGVJbXBsLmNsYXNzLCBURVhUX1RFTVBMQVRFKTsKLQkJRUxFTUVOVF9URVhULnB1dChUZXJtRGVmaW5pdGlvbkltcGwuY2xhc3MsIFRFWFRfVEVSTV9ERUZJTklUSU9OKTsKLQkJRUxFTUVOVF9URVhULnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEUpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRvb2xJbXBsLmNsYXNzLCBURVhUX1RPT0wpOwotCQlFTEVNRU5UX1RFWFQucHV0KFRvb2xNZW50b3JJbXBsLmNsYXNzLCBURVhUX1RPT0xfTUVOVE9SKTsKLQkJRUxFTUVOVF9URVhULnB1dChXaGl0ZXBhcGVySW1wbC5jbGFzcywgVEVYVF9XSElURVBBUEVSKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdEltcGwuY2xhc3MsIFRFWFRfV09SS19QUk9EVUNUKTsKLQkJRUxFTUVOVF9URVhULnB1dChXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1IpOwotCQlFTEVNRU5UX1RFWFQucHV0KFdvcmtQcm9kdWN0VHlwZUltcGwuY2xhc3MsIFRFWFRfV09SS19QUk9EVUNUX1RZUEUpOwotCi0JCS8vIHBsdXJhbAotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChBY3Rpdml0eUltcGwuY2xhc3MsIFRFWFRfQUNUSVZJVFlfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQXJ0aWZhY3RJbXBsLmNsYXNzLCBURVhUX0FSVElGQUNUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENhcGFiaWxpdHlQYXR0ZXJuSW1wbC5jbGFzcywKLQkJCQlURVhUX0NBUEFCSUxJVFlfUEFUVEVSTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDaGVja2xpc3RJbXBsLmNsYXNzLCBURVhUX0NIRUNLTElTVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChDb21wb3NpdGVSb2xlSW1wbC5jbGFzcywKLQkJCQlURVhUX0NPTVBPU0lURV9ST0xFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KENvbmNlcHRJbXBsLmNsYXNzLCBURVhUX0NPTkNFUFRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoQ29udGVudFBhY2thZ2VJbXBsLmNsYXNzLAotCQkJCVRFWFRfQ09OVEVOVF9QQUNLQUdFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEN1c3RvbUNhdGVnb3J5SW1wbC5jbGFzcywKLQkJCQlURVhUX0NVU1RPTV9DQVRFR09SWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChEZWxpdmVyYWJsZUltcGwuY2xhc3MsIFRFWFRfREVMSVZFUkFCTEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGVsaXZlcnlQcm9jZXNzSW1wbC5jbGFzcywKLQkJCQlURVhUX0RFTElWRVJZX1BST0NFU1NfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoRGlzY2lwbGluZUltcGwuY2xhc3MsIFRFWFRfRElTQ0lQTElORV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChEaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmNsYXNzLAotCQkJCVRFWFRfRElTQ0lQTElORV9HUk9VUElOR19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChEb21haW5JbXBsLmNsYXNzLCBURVhUX0RPTUFJTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmNsYXNzLAotCQkJCVRFWFRfRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChFeGFtcGxlSW1wbC5jbGFzcywgVEVYVF9FWEFNUExFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEd1aWRlbGluZUltcGwuY2xhc3MsIFRFWFRfR1VJREVMSU5FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KEl0ZXJhdGlvbkltcGwuY2xhc3MsIFRFWFRfSVRFUkFUSU9OX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfTUVUSE9EX0NPTkZJR1VSQVRPTl9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RMaWJyYXJ5SW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9MSUJBUkFSWV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChNZXRob2RQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX01FVEhPRF9QQUNLQUdFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE1ldGhvZFBsdWdpbkltcGwuY2xhc3MsCi0JCQkJVEVYVF9NRVRIT0RfUExVR0lOX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE1pbGVzdG9uZUltcGwuY2xhc3MsIFRFWFRfTUlMRVNUT05FX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KE91dGNvbWVJbXBsLmNsYXNzLCBURVhUX09VVENPTUVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUGhhc2VJbXBsLmNsYXNzLCBURVhUX1BIQVNFX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFByYWN0aWNlSW1wbC5jbGFzcywgVEVYVF9QUkFDVElDRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChQcm9jZXNzRmFtaWx5SW1wbC5jbGFzcywKLQkJCQlURVhUX1BST0NFU1NfRkFNSUxZX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFByb2Nlc3NQYWNrYWdlSW1wbC5jbGFzcywKLQkJCQlURVhUX1BST0NFU1NfUEFDS0FHRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSZXBvcnRJbXBsLmNsYXNzLCBURVhUX1JFUE9SVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSZXVzYWJsZUFzc2V0SW1wbC5jbGFzcywKLQkJCQlURVhUX1JFVVNBQkxFX0FTU0VUX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFJvYWRtYXBJbXBsLmNsYXNzLCBURVhUX1JPQURNQVBfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZUltcGwuY2xhc3MsIFRFWFRfUk9MRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChSb2xlRGVzY3JpcHRvckltcGwuY2xhc3MsCi0JCQkJVEVYVF9ST0xFX0RFU0NSSVBUT1JfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZVNldEltcGwuY2xhc3MsIFRFWFRfUk9MRV9TRVRfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoUm9sZVNldEdyb3VwaW5nSW1wbC5jbGFzcywKLQkJCQlURVhUX1JPTEVfU0VUX0dST1VQSU5HX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFN0ZXBJbXBsLmNsYXNzLCBURVhUX1NURVBfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5jbGFzcywKLQkJCQlURVhUX1NVUFBPUlRJTkdfTUFURVJJQUxfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGFza0ltcGwuY2xhc3MsIFRFWFRfVEFTS19QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUYXNrRGVzY3JpcHRvckltcGwuY2xhc3MsCi0JCQkJVEVYVF9UQVNLX0RFU0NSSVBUT1JfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTAotCQkJCS5wdXQoVGVhbVByb2ZpbGVJbXBsLmNsYXNzLCBURVhUX1RFQU1fUFJPRklMRV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUZW1wbGF0ZUltcGwuY2xhc3MsIFRFWFRfVEVNUExBVEVfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoVGVybURlZmluaXRpb25JbXBsLmNsYXNzLAotCQkJCVRFWFRfVEVSTV9ERUZJTklUSU9OX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRlbXBsYXRlSW1wbC5jbGFzcywgVEVYVF9URU1QTEFURV9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChUb29sSW1wbC5jbGFzcywgVEVYVF9UT09MX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFRvb2xNZW50b3JJbXBsLmNsYXNzLCBURVhUX1RPT0xfTUVOVE9SX1BMVVJBTCk7Ci0JCUVMRU1FTlRfVEVYVF9QTFVSQUwucHV0KFdoaXRlcGFwZXJJbXBsLmNsYXNzLCBURVhUX1dISVRFUEFQRVJfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTAotCQkJCS5wdXQoV29ya1Byb2R1Y3RJbXBsLmNsYXNzLCBURVhUX1dPUktfUFJPRFVDVF9QTFVSQUwpOwotCQlFTEVNRU5UX1RFWFRfUExVUkFMLnB1dChXb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmNsYXNzLAotCQkJCVRFWFRfV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfUExVUkFMKTsKLQkJRUxFTUVOVF9URVhUX1BMVVJBTC5wdXQoV29ya1Byb2R1Y3RUeXBlSW1wbC5jbGFzcywKLQkJCQlURVhUX1dPUktfUFJPRFVDVF9UWVBFX1BMVVJBTCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIGZvciBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIHBsdXJhbAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJldHVybiB0aGUgcGx1cmFsIGZvcm0gb2YgdGhlIGRpc3BsYXkKLQkgKiAgICAgICAgICAgIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVSVRleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIHBsdXJhbCkgewotCQlpZiAocGx1cmFsKSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFRfUExVUkFMLmdldChlbGVtZW50LmdldENsYXNzKCkpOwotCQkJcmV0dXJuIChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSAoU3RyaW5nKSBFTEVNRU5UX1RFWFQuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlyZXR1cm4gKGxhYmVsID09IG51bGwpID8gZWxlbWVudC5nZXROYW1lKCkgOiBsYWJlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldFVJVGV4dChlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIGZvciBhIG1ldGhvZCBlbGVtZW50IGluIGxvd2VyIGNhc2UuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgZG9lcyBub3QgYXBwbGllcyB0byB0aGUgR2VybWFuIGxhbmd1YWdlIHNpbmNlIGl0IGhhcyBubwotCSAqIGRpc3RpbmN0aW9uIGJldHdlZW4gYSB1cHBlciBjYXNlIGFuZCBsb3dlciBjYXNlIG5vdW4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gcGx1cmFsCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcmV0dXJuIHRoZSBwbHVyYWwgZm9ybSBvZiB0aGUgZGlzcGxheQotCSAqICAgICAgICAgICAgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVJVGV4dExvd2VyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBwbHVyYWwpIHsKLQkJU3RyaW5nIGxhYmVsOwotCQlpZiAocGx1cmFsKSB7Ci0JCQlsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVF9QTFVSQUwuZ2V0KGVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQlsYWJlbCA9IChsYWJlbCA9PSBudWxsKSA/IGVsZW1lbnQuZ2V0TmFtZSgpIDogbGFiZWw7Ci0JCX0gZWxzZSB7Ci0JCQlsYWJlbCA9IChTdHJpbmcpIEVMRU1FTlRfVEVYVC5nZXQoZWxlbWVudC5nZXRDbGFzcygpKTsKLQkJCWxhYmVsID0gKGxhYmVsID09IG51bGwpID8gZWxlbWVudC5nZXROYW1lKCkgOiBsYWJlbDsKLQkJfQotCi0JCXJldHVybiBTdHJVdGlsLnRvTG93ZXIobGFiZWwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBmb3IgYSBtZXRob2QgZWxlbWVudCBpbiBsb3dlciBjYXNlLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGRvZXMgbm90IGFwcGxpZXMgdG8gdGhlIEdlcm1hbiBsYW5ndWFnZSBzaW5jZSBpdCBoYXMgbm8KLQkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIGEgdXBwZXIgY2FzZSBhbmQgbG93ZXIgY2FzZSBub3VuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VUlUZXh0TG93ZXIoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRVSVRleHRMb3dlcihlbGVtZW50LCBmYWxzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL0xpYnJhcnlVSVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlNGQ0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvTGlicmFyeVVJVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuRVBGVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLmRpYWxvZ3MuUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciBpbXBsZW1lbnRpbmcgbWV0aG9kIGxpYnJhcnkgVUkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVVJVXRpbCB7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhcHBsaWNhdGlvbiBzaGVsbCB0aXRsZSB0byBkaXNwbGF5IHRoZSBhcHBsaWNhdGlvbiBuYW1lIGFuZAotCSAqIHRoZSBkZWZhdWx0IG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVNoZWxsVGl0bGUoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IHdpbmRvdy5nZXRTaGVsbCgpOwotCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbGliUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQkJCWxpYlBhdGggPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCk7Ci0JCQkJCWlmIChsaWJQYXRoID09IG51bGwpIHsKLQkJCQkJCWxpYlBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlTdHJpbmcgYXBwTmFtZSA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCk7Ci0JCQkJU3RyaW5nIGFwcFRpdGxlID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYXBwbGljYXRpb25fdGl0bGUsIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQkJCWFwcE5hbWUsIGxpYlBhdGggfSk7Ci0JCQkJc2hlbGwuc2V0VGV4dChhcHBUaXRsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyBhIGRpYWxvZyB0byBwcm9tcHRzIHRoZSB1c2VyIHRvIHNhdmUgdGhlIG9wZW4gbGlicmFyeSBpZiBpdCBoYXMKLQkgKiBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+U1dULllFUzwvY29kZT4sIDxjb2RlPlNXVC5OTzwvY29kZT4gb3IKLQkgKiAgICAgICAgIDxjb2RlPlNXVC5DQU5DRUw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlzcGxheVNhdmVEaXJ0eUVkaXRvcnNEaWFsb2coKSB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCAmJiBtYW5hZ2VyLmlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCkpIHsKLQkJCWludCByZXQgPSBNc2dCb3gucHJvbXB0KExpYnJhcnlVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNhdmVMaWJyYXJ5RGlhbG9nX3RleHQsIFNXVC5ZRVMgfCBTV1QuTk8KLQkJCQkJCQl8IFNXVC5DQU5DRUwpOwotCQkJc3dpdGNoIChyZXQpIHsKLQkJCWNhc2UgU1dULllFUzoKLQkJCQl0cnkgewotCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCU1zZ0RpYWxvZyBkaWFsb2cgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCQlkaWFsb2cuZGlzcGxheUVycm9yKAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5zYXZlTGlicmFyeURpYWxvZ190aXRsZSwKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc2F2ZUxpYnJhcnlFcnJvcl9tc2csCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmVycm9yX3JlYXNvbiwgZSk7Ci0JCQkJfQotCQkJCXJldHVybiBTV1QuWUVTOwotCQkJY2FzZSBTV1QuTk86Ci0JCQkJLy8gRGlzY2FyZCBhbGwgY2hhbmdlcyBieSByZXNldHRpbmcgYWxsIHJlc291cmNlcyBhcyB1bmNoYW5nZWQuCi0JCQkJbWFuYWdlci5kaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMoKTsKLQkJCQlyZXR1cm4gU1dULk5POwotCQkJY2FzZSBTV1QuQ0FOQ0VMOgotCQkJCXJldHVybiBTV1QuQ0FOQ0VMOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFNXVC5DQU5DRUw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBmaWxlIFVSTCBmb3IgYW4gYXR0YWNobWVudAotCSAqIAotCSAqIEBwYXJhbSBhdHRhY2htZW50Ci0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBhdHRhY2gKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIE1ldGhvZEVsZW1lbnQgcmVmZXJlbmNpbmcgdGhlIGZpbGUKLQkgKiBAcGFyYW0gY29weUZpbGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHdpbGwgY29weSB0aGUgZmlsZSAoaWYgaXQgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgcGx1Z2luCi0JICogICAgICAgICAgICBwYXRoKQotCSAqIEByZXR1cm4gVVJMIG9mIHRoZSBmb3JtIC4vLi4vJmx0O3JvbGVzJmd0Oy9yZXNvdXJjZXMvJmx0O2ZpbGVuYW1lIG9mCi0JICogICAgICAgICBhdHRhY2htZW50Jmd0OwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVUkxGb3JBdHRhY2htZW50KFNoZWxsIHNoZWxsLCBGaWxlIGF0dGFjaG1lbnQsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY29weUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwbHVnaW5EaXIgPSBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3IobmV3IEZpbGUoVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCkKLQkJCQkuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpLmdldFBhcmVudCgpKTsKLQkJRmlsZSBmb3JtYXRGaWxlID0gbnVsbDsKLQkJU3RyaW5nIHJlc291cmNlTG9jID0gUmVzb3VyY2VIZWxwZXIuZ2V0QWJzb2x1dGVFbGVtZW50UmVzb3VyY2VQYXRoKGVsZW1lbnQpOwotCQkvLyBGaWxlIHJlc291cmNlRGlyID0gbmV3IEZpbGUocmVzb3VyY2VMb2MpOwotCQlmb3JtYXRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2VMb2MgKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgYXR0YWNobWVudC5nZXROYW1lKCkpOwotCQlpZiAoY29weUZpbGUpIHsKLQkJCUZpbGUgbmV3RmlsZSA9IGNvcHlSZXNvdXJjZVRvTGliKHNoZWxsLCBhdHRhY2htZW50LCBlbGVtZW50KTsKLQkJCWlmIChuZXdGaWxlICE9IG51bGwpIHsKLQkJCQlmb3JtYXRGaWxlID0gbmV3IEZpbGUocmVzb3VyY2VMb2MgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJKyBuZXdGaWxlLmdldE5hbWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHVzZXIgaGl0IGNhbmNlbAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJSVJlc291cmNlIHdzUmVzb3VyY2UgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZvcm1hdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYod3NSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZU1hbmFnZXIucmVmcmVzaCh3c1Jlc291cmNlKTsKLQkJCQl9Ci0JCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldFJlbGF0aXZlUGF0aFRvRmlsZUZyb21FbGVtZW50KGVsZW1lbnQsCi0JCQkJZm9ybWF0RmlsZSk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBnaXZlbiBmaWxlIGludG8gdGhlIG1ldGhvZEVsZW1lbnQncyByZXNvdXJjZSBmb2xkZXIuCi0JICogUmVzb2x2ZXMgZmlsZW5hbWUgY29uZmxpY3QgYnkgcHJvbXB0aW5nIHVzZXIgdG8gb3ZlcndyaXRlIG9yIHJlbmFtZQotCSAqIEBwYXJhbSBzaGVsbCBpZiBudWxsLCB3aWxsIG92ZXJ3cml0ZSBmaWxlIHdpdGhvdXQgcHJvbXB0aW5nCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBGaWxlIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIGZpbmFsIGNob2ljZSBvZiBsaWJyYXJ5IHJlc291cmNlIGZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29weVJlc291cmNlVG9MaWIoU2hlbGwgc2hlbGwsIEZpbGUgcmVzb3VyY2UsIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCkgewotCQlTdHJpbmcgcmVzb3VyY2VMb2MgPSBSZXNvdXJjZUhlbHBlci5nZXRBYnNvbHV0ZUVsZW1lbnRSZXNvdXJjZVBhdGgobWV0aG9kRWxlbWVudCk7Ci0KLQkJRmlsZSBsaWJGaWxlID0gbmV3IEZpbGUocmVzb3VyY2VMb2MsIHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCWlmIChyZXNvdXJjZS5lcXVhbHMobGliRmlsZSkpIHsKLQkJCS8vIHNvdXJjZSBmaWxlIGlzIGFscmVhZHkgaW4gcmVzb3VyY2VzIGRpcgotCQkJcmV0dXJuIGxpYkZpbGU7Ci0JCX0KLQkJCi0JCS8vIGlmIG5vIHNoZWxsLCB3aWxsIGp1c3Qgb3ZlcndyaXRlCi0JCWlmIChsaWJGaWxlLmV4aXN0cygpICYmIHNoZWxsICE9IG51bGwpIHsKLQkJCVJlbmFtZUZpbGVDb25mbGljdERpYWxvZyBkaWFsb2cgPSBuZXcgUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nKHNoZWxsKTsKLQkJCWRpYWxvZy5zZXRNZXNzYWdlU3RyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCQkJRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfbXNnLCAKLQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHJlc291cmNlLmdldE5hbWUoKSwgcmVzb3VyY2VMb2MgfSkpOwotCQkJZGlhbG9nLnNldERlc3RpbmF0aW9uKHJlc291cmNlTG9jKTsKLQkJCWRpYWxvZy5zZXRGaWxlUGF0aChyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJbGliRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlTG9jLCBkaWFsb2cuZ2V0RmlsZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlVXRpbC5jb3B5RmlsZShyZXNvdXJjZSwgbGliRmlsZSk7Ci0JCQotCQlJUmVzb3VyY2Ugd3NSZXNvdXJjZSA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24obGliRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmKHdzUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlGaWxlTWFuYWdlci5yZWZyZXNoKHdzUmVzb3VyY2UpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIGxpYkZpbGU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI0MzI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChTaW5ndWxhcikKLWFjdGl2aXR5X3RleHQ9QWN0aXZpdHkKLWFydGlmYWN0X3RleHQ9QXJ0aWZhY3QKLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHQ9Q2FwYWJpbGl0eSBQYXR0ZXJuCi1jaGVja2xpc3RfdGV4dD1DaGVja2xpc3QKLWNoZWNrSXRlbV90ZXh0PUNoZWNrIEl0ZW0KLWNvbXBvc2l0ZVJvbGVfdGV4dD1Db21wb3NpdGUgUm9sZQotY29uY2VwdF90ZXh0PUNvbmNlcHQKLWNvbnRlbnRQYWNrYWdlX3RleHQ9Q29udGVudCBQYWNrYWdlCi1jdXN0b21DYXRlZ29yeV90ZXh0PUN1c3RvbSBDYXRlZ29yeQotZGVsaXZlcmFibGVfdGV4dD1EZWxpdmVyYWJsZQotZGVsaXZlcnlQcm9jZXNzX3RleHQ9RGVsaXZlcnkgUHJvY2VzcwotZGVzY3JpcHRvcl90ZXh0PURlc2NyaXB0b3IKLWRpc2NpcGxpbmVfdGV4dD1EaXNjaXBsaW5lCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dD1EaXNjaXBsaW5lIEdyb3VwaW5nCi1kb21haW5fdGV4dD1Eb21haW4KLWVzdGltYXRlX3RleHQ9RXN0aW1hdGUKLWVzdGltYXRpbmdNZXRyaWNfdGV4dD1Fc3RpbWF0aW5nIE1ldHJpYwotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3RleHQ9RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotZXhhbXBsZV90ZXh0PUV4YW1wbGUKLWd1aWRhbmNlX3RleHQ9R3VpZGFuY2UKLWd1aWRlbGluZV90ZXh0PUd1aWRlbGluZQotaXRlcmF0aW9uX3RleHQ9SXRlcmF0aW9uCi1tZXRob2RDb25maWd1cmF0aW9uX3RleHQ9TWV0aG9kIENvbmZpZ3VyYXRpb24KLW1ldGhvZENvbnRlbnRfdGV4dD1NZXRob2QgQ29udGVudAotbWV0aG9kTGlicmFyeV90ZXh0PU1ldGhvZCBMaWJyYXJ5Ci1tZXRob2RQYWNrYWdlX3RleHQ9TWV0aG9kIFBhY2thZ2UKLW1ldGhvZFBsdWdpbl90ZXh0PU1ldGhvZCBQbHVnLWluCi1taWxlc3RvbmVfdGV4dD1NaWxlc3RvbmUKLW91dGNvbWVfdGV4dD1PdXRjb21lCi1waGFzZV90ZXh0PVBoYXNlCi1wcmFjdGljZV90ZXh0PVByYWN0aWNlCi1wcm9jZXNzX3RleHQ9UHJvY2VzcwotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0PURpZmZlcmVudGlhbCBQcm9jZXNzCi1wcm9jZXNzRmFtaWx5X3RleHQ9UHJvY2VzcyBGYW1pbHkKLXByb2Nlc3NQYWNrYWdlX3RleHQ9UHJvY2VzcyBQYWNrYWdlCi1yZXBvcnRfdGV4dD1SZXBvcnQKLXJldXNhYmxlQXNzZXRfdGV4dD1SZXVzYWJsZSBBc3NldAotcm9hZG1hcF90ZXh0PVJvYWRtYXAKLXJvbGVEZXNjcmlwdG9yX3RleHQ9Um9sZSBEZXNjcmlwdG9yCi1yb2xlX3RleHQ9Um9sZQotcm9sZVNldF90ZXh0PVJvbGUgU2V0Ci1yb2xlU2V0R3JvdXBpbmdfdGV4dD1Sb2xlIFNldCBHcm91cGluZwotc3RhbmRhcmRDYXRlZ29yeV90ZXh0PVN0YW5kYXJkIENhdGVnb3J5Ci1zdGVwX3RleHQ9U3RlcAotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3VwcG9ydGluZyBNYXRlcmlhbAotdGFza190ZXh0PVRhc2sKLXRhc2tEZXNjcmlwdG9yX3RleHQ9VGFzayBEZXNjcmlwdG9yCi10ZWFtUHJvZmlsZV90ZXh0PVRlYW0gUHJvZmlsZQotdGVtcGxhdGVfdGV4dD1UZW1wbGF0ZQotdGVybURlZmluaXRpb25fdGV4dD1UZXJtIERlZmluaXRpb24KLXRvb2xfdGV4dD1Ub29sCi10b29sTWVudG9yX3RleHQ9VG9vbCBNZW50b3IKLXdoaXRlcGFwZXJfdGV4dD1XaGl0ZXBhcGVyCi13b3JrUHJvZHVjdF90ZXh0PVdvcmsgUHJvZHVjdAotd29ya1Byb2R1Y3REZXNjcmlwdG9yX3RleHQ9V29yayBQcm9kdWN0IERlc2NyaXB0b3IKLXdvcmtQcm9kdWN0RWxlbWVudF90ZXh0PVdvcmsgUHJvZHVjdCBFbGVtZW50Ci13b3JrUHJvZHVjdFR5cGVfdGV4dD1Xb3JrIFByb2R1Y3QgS2luZAotCi0jIE1ldGhvZCBFbGVtZW50IE5hbWVzIChQbHVyYWwpCi1hY3Rpdml0eV90ZXh0X3BsdXJhbD1BY3Rpdml0aWVzCi1hcnRpZmFjdF90ZXh0X3BsdXJhbD1BcnRpZmFjdHMKLWNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsPUNhcGFiaWxpdHkgUGF0dGVybnMKLWNoZWNrbGlzdF90ZXh0X3BsdXJhbD1DaGVja2xpc3RzCi1jaGVja0l0ZW1fdGV4dF9wbHVyYWw9Q2hlY2sgSXRlbXMKLWNvbXBvc2l0ZVJvbGVfdGV4dF9wbHVyYWw9Q29tcG9zaXRlIFJvbGVzCi1jb25jZXB0X3RleHRfcGx1cmFsPUNvbmNlcHRzCi1jb250ZW50UGFja2FnZV90ZXh0X3BsdXJhbD1Db250ZW50IFBhY2thZ2VzCi1jdXN0b21DYXRlZ29yeV90ZXh0X3BsdXJhbD1DdXN0b20gQ2F0ZWdvcmllcwotZGVsaXZlcmFibGVfdGV4dF9wbHVyYWw9RGVsaXZlcmFibGVzCi1kZWxpdmVyeVByb2Nlc3NfdGV4dF9wbHVyYWw9RGVsaXZlcnkgUHJvY2Vzc2VzCi1kZXNjcmlwdG9yX3RleHRfcGx1cmFsPURlc2NyaXB0b3JzCi1kaXNjaXBsaW5lX3RleHRfcGx1cmFsPURpc2NpcGxpbmVzCi1kaXNjaXBsaW5lR3JvdXBpbmdfdGV4dF9wbHVyYWw9RGlzY2lwbGluZSBHcm91cGluZ3MKLWRvbWFpbl90ZXh0X3BsdXJhbD1Eb21haW5zCi1lc3RpbWF0ZV90ZXh0X3BsdXJhbD1Fc3RpbWF0ZXMKLWVzdGltYXRpbmdNZXRyaWNfdGV4dF9wbHVyYWw9RXN0aW1hdGluZyBNZXRyaWNzCi1lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dF9wbHVyYWw9RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotZXhhbXBsZV90ZXh0X3BsdXJhbD1FeGFtcGxlcwotZ3VpZGFuY2VfdGV4dF9wbHVyYWw9R3VpZGFuY2VzCi1ndWlkZWxpbmVfdGV4dF9wbHVyYWw9R3VpZGVsaW5lcwotaXRlcmF0aW9uX3RleHRfcGx1cmFsPUl0ZXJhdGlvbnMKLW1ldGhvZENvbmZpZ3VyYXRpb25fdGV4dF9wbHVyYWw9TWV0aG9kIENvbmZpZ3VyYXRpb25zCi1tZXRob2RDb250ZW50X3RleHRfcGx1cmFsPU1ldGhvZCBDb250ZW50cwotbWV0aG9kTGlicmFyeV90ZXh0X3BsdXJhbD1NZXRob2QgTGlicmFyaWVzCi1tZXRob2RQYWNrYWdlX3RleHRfcGx1cmFsPU1ldGhvZCBQYWNrYWdlcwotbWV0aG9kUGx1Z2luX3RleHRfcGx1cmFsPU1ldGhvZCBQbHVnLWlucwotbWlsZXN0b25lX3RleHRfcGx1cmFsPU1pbGVzdG9uZXMKLW91dGNvbWVfdGV4dF9wbHVyYWw9T3V0Y29tZXMKLXBoYXNlX3RleHRfcGx1cmFsPVBoYXNlcwotcHJhY3RpY2VfdGV4dF9wbHVyYWw9UHJhY3RpY2VzCi1wcm9jZXNzX3RleHRfcGx1cmFsPVByb2Nlc3NlcwotcHJvY2Vzc0NvbnRyaWJ1dGlvbl90ZXh0X3BsdXJhbD1EaWZmZXJlbnRpYWwgUHJvY2Vzc2VzCi1wcm9jZXNzRmFtaWx5X3RleHRfcGx1cmFsPVByb2Nlc3MgRmFtaWxpZXMKLXByb2Nlc3NQYWNrYWdlX3RleHRfcGx1cmFsPVByb2Nlc3MgUGFja2FnZXMKLXJlcG9ydF90ZXh0X3BsdXJhbD1SZXBvcnRzCi1yZXVzYWJsZUFzc2V0X3RleHRfcGx1cmFsPVJldXNhYmxlIEFzc2V0cwotcm9hZG1hcF90ZXh0X3BsdXJhbD1Sb2FkbWFwcwotcm9sZURlc2NyaXB0b3JfdGV4dF9wbHVyYWw9Um9sZSBEZXNjcmlwdG9ycwotcm9sZV90ZXh0X3BsdXJhbD1Sb2xlcwotcm9sZVNldF90ZXh0X3BsdXJhbD1Sb2xlIFNldHMKLXJvbGVTZXRHcm91cGluZ190ZXh0X3BsdXJhbD1Sb2xlIFNldCBHcm91cGluZ3MKLXN0YW5kYXJkQ2F0ZWdvcnlfdGV4dF9wbHVyYWw9U3RhbmRhcmQgQ2F0ZWdvcmllcwotc3RlcF90ZXh0X3BsdXJhbD1TdGVwcwotc3VwcG9ydGluZ01hdGVyaWFsX3RleHRfcGx1cmFsPVN1cHBvcnRpbmcgTWF0ZXJpYWxzCi10YXNrX3RleHRfcGx1cmFsPVRhc2tzCi10YXNrRGVzY3JpcHRvcl90ZXh0X3BsdXJhbD1UYXNrIERlc2NyaXB0b3JzCi10ZWFtUHJvZmlsZV90ZXh0X3BsdXJhbD1UZWFtIFByb2ZpbGVzCi10ZW1wbGF0ZV90ZXh0X3BsdXJhbD1UZW1wbGF0ZXMKLXRlcm1EZWZpbml0aW9uX3RleHRfcGx1cmFsPVRlcm0gRGVmaW5pdGlvbnMKLXRvb2xfdGV4dF9wbHVyYWw9VG9vbHMKLXRvb2xNZW50b3JfdGV4dF9wbHVyYWw9VG9vbCBNZW50b3JzCi13aGl0ZXBhcGVyX3RleHRfcGx1cmFsPVdoaXRlcGFwZXJzCi13b3JrUHJvZHVjdF90ZXh0X3BsdXJhbD1Xb3JrIFByb2R1Y3RzCi13b3JrUHJvZHVjdERlc2NyaXB0b3JfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0IERlc2NyaXB0b3JzCi13b3JrUHJvZHVjdEVsZW1lbnRfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0IEVsZW1lbnRzCi13b3JrUHJvZHVjdFR5cGVfdGV4dF9wbHVyYWw9V29yayBQcm9kdWN0IEtpbmRzCi0KLSMgQXBwbGljYXRpb24gdGl0bGUuCi1hcHBsaWNhdGlvbl90aXRsZT17MH0gLSB7MX0KLQotIyBPcGVuIE1ldGhvZCBMaWJyYXJ5IFdpemFyZAotb3BlbkxpYnJhcnlXaXphcmRfdGl0bGU9T3BlbiBNZXRob2QgTGlicmFyeQotb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZT1TcGVjaWZ5IGEgcGF0aCBjb250YWluaW5nIGEgbWV0aG9kIGxpYnJhcnkKLW9wZW5MaWJyYXJ5TWFpbldpemFyZFBhZ2VfdGl0bGVfMj1TZWxlY3QgYSBtZXRob2QgbGlicmFyeQotb3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90ZXh0PXswfSBzdG9yZXMgbWV0aG9kcyBhbmQgcHJvY2Vzc2VzIGluIGEgZm9sZGVyIGNhbGxlZCBcbmEgbWV0aG9kIGxpYnJhcnkuIFNlbGVjdCBhIG1ldGhvZCBsaWJyYXJ5IGZvbGRlciB0byB1c2UgZm9yIHRoaXMgc2Vzc2lvbi4KLXBhdGhMYWJlbF90ZXh0PVBhdGg6Ci1uYW1lTGFiZWxfdGV4dD1OYW1lOgotdXJpTGFiZWxfdGV4dD1VUkk6Ci1vcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3hfdGV4dD1PcGVuIGEgbWV0aG9kIGxpYnJhcnkgdGhhdCBpcyBub3QgbGlzdGVkIGFib3ZlCi1saWJyYXJ5VHlwZUxhYmVsX3RleHQ9VHlwZToKLWxpYnJhcnlMYWJlbF90ZXh0PUxpYnJhcnk6Ci1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLXByb21wdEZvckxpYnJhcnlDaGVja2JveF90ZXh0PVVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGFuZCBkbyBub3QgYXNrIGFnYWluLgotb3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0PU5vIG1ldGhvZCBsaWJyYXJ5IGV4aXN0cyBhdCAnJ3swfScnLlxuQSBuZXcgbWV0aG9kIGxpYnJhcnkgd2lsbCBiZSBjcmVhdGVkIGFuZCBvcGVuZWQgZm9yIHlvdSBhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS5cblxuQ2xpY2sgT0sgdG8gcHJvY2VlZCBvciBDYW5jZWwgdG8gc3BlY2lmeSBhbm90aGVyIG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0KLSMgU2VsZWN0IE1ldGhvZCBMaWJyYXJ5IEZvbGRlciBEaWFsb2cKLXNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGU9U2VsZWN0IE1ldGhvZCBMaWJyYXJ5Ci1zZWxlY3RMaWJyYXJ5Rm9sZGVyRGlhbG9nX3RleHQ9U2VsZWN0IGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyLgotCi0jIE9wZW4gTGlicmFyeSBQcm9ncmVzcyBNZXNzYWdlCi1vcGVuaW5nTGlicmFyeVRhc2tfbmFtZT1PcGVuaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi0KLSMgT3BlbiBNZXRob2QgTGlicmFyeSBFcnJvciBEaWFsb2cKLW9wZW5MaWJyYXJ5RXJyb3JfbXNnPUlVUEwwMzAxRTogVW5hYmxlIHRvIGNyZWF0ZSB0aGUgbWV0aG9kIGxpYnJhcnkuCi1vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb249QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24xPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgcGF0aCAnJ3swfScnIGlzIGludmFsaWQuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjI9QSBtZXRob2QgbGlicmFyeSBhbHJlYWR5IGV4aXN0cyBpbiAnJ3swfScnLgotb3BlbkxpYnJhcnlFcnJvcl9yZWFzb24zPVRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyICcnezB9JycgY2Fubm90IGJlIGNyZWF0ZWQuCi1vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQ9VGhlIHNwZWNpZmllZCBtZXRob2QgbGlicmFyeSBmb2xkZXIgaXMgYSBwbHVnLWluIG9yIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbiBleHBvcnQgZm9sZGVyLgotb3BlbkxpYnJhcnlFcnJvcl9hZHZpY2U9U2VsZWN0IE9LIHRvIHNwZWNpZnkgYW5vdGhlciBtZXRob2QgbGlicmFyeSBwYXRoLgotCi0jIE9wZW4gTWV0aG9kIExpYnJhcnkgRXJyb3IgTWVzc2FnZXMKLWludmFsaWRMaWJyYXJ5UGF0aF9tc2c9SVVQTDAzMDJFOiBVbmFibGUgdG8gb3BlbiB0aGUgc3BlY2lmaWVkIG1ldGhvZCBsaWJyYXJ5LgotaW52YWxpZExpYnJhcnlQYXRoX3JlYXNvbj1UaGUgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkgZm9sZGVyIGlzIGludmFsaWQsIGRvZXMgbm90IGV4aXN0LCBvciB5b3UgZG8gbm90IGhhdmUgdGhlIHByb3BlciBwZXJtaXNzaW9uIHRvIGFjY2VzcyBpdC5cblxuQ2xpY2sgT0sgdG8gc2VsZWN0IGFub3RoZXIgbGlicmFyeSBmb2xkZXIuCi0KLSMgUmVhZC1vbmx5IFByb2plY3QgRmlsZSBFcnJvciBEaWFsb2cKLXJlYWRPbmx5UHJvamVjdEZpbGVfdGV4dD1JVVBMMDMwNEU6ICcnezB9JycgaXMgcmVhZC1vbmx5LiBNYWtlIGl0IHdyaXRhYmxlIGJlZm9yZSBjb250aW51aW5nLgotcmV0cnlCdXR0b25fdGV4dD1SZXRyeQotY2FuY2VsQnV0dG9uX3RleHQ9Q2FuY2VsCi0KLSMgVmVyc2lvbiBNaXNtYXRjaCBEaWFsb2cKLXZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0PUlVUEwzMDVFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byB2ZXJzaW9uIHsxfSBvciBoaWdoZXIgaW4gb3JkZXIgdG8gb3BlbiB0aGlzIGxpYnJhcnkuCi12ZXJzaW9uTWlzbWF0Y2hEaWFsb2dfdGV4dF91bmtub3duPUlVUEwzMDZFOiBUaGUgc2VsZWN0ZWQgbGlicmFyeSBjYW5ub3QgYmUgb3BlbmVkLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byBhIGhpZ2hlciB2ZXJzaW9uIGluIG9yZGVyIHRvIG9wZW4gdGhpcyBsaWJyYXJ5LgotCi0jIFVwZ3JhZGUgTWV0aG9kIExpYnJhcnkgRGlhbG9nCi11cGdyYWRlTGlicmFyeURpYWxvZ190aXRsZT1VcGdyYWRlIE1ldGhvZCBMaWJyYXJ5Ci11cGdyYWRlTGlicmFyeURpYWxvZ190ZXh0PVRoZSBsaWJyYXJ5IHlvdSBoYXZlIHNlbGVjdGVkIG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIHRoZSBuZXcgbGlicmFyeSBzdHJ1Y3R1cmUuXG5cbkRvIHlvdSB3YW50IHRvIHByb2NlZWQgd2l0aCB0aGUgdXBncmFkZT8KLXVwZ3JhZGluZ0xpYnJhcnlUYXNrX25hbWU9VXBncmFkaW5nIG1ldGhvZCBsaWJyYXJ5Li4uCi0KLSMgVXBncmFkZSBMaWJyYXJ5IEVycm9yIERpYWxvZwotdXBncmFkZUxpYnJhcnlFcnJvcl9tc2c9SVVQTDAzMDZFOiBGYWlsZWQgdG8gdXBncmFkZSB0aGUgbWV0aG9kIGxpYnJhcnkuIFBsZWFzZSBzZWUgdGhlIGxvZyBmaWxlIGZvciBtb3JlIGRldGFpbHMuCi0KLSMgU3dpdGNoIENvbmZpZ3VyYXRpb24gRGlhbG9nCi1zd2l0Y2hDb25maWdEaWFsb2dfdGl0bGU9U3dpdGNoIENvbmZpZ3VyYXRpb24KLXN3aXRjaENvbmZpZ0RpYWxvZ190ZXh0PURvIHlvdSB3YW50IHRvIHN3aXRjaCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sICcnezB9JycsIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VsZWN0ZWQgcHJvY2Vzcz8KLQkKLSMgQ29uZmlndXJhdGlvbiBDb21ibwotY3VycmVudENvbmZpZ0xhYmVsX3RleHQ9Q3VycmVudCBjb25maWd1cmF0aW9uOgotc2VsZWN0Q29uZmlnTGFiZWxfdGV4dD1TZWxlY3QgYSBjb25maWd1cmF0aW9uCi0KLSMgRGVsZXRlIEZpbGVzIENvbmZpcm1hdGlvbiBNZXNzYWdlCi1kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2c9VGhlIHNwZWNpZmllZCBwYXRoICcnezB9JycgYWxyZWFkeSBleGlzdHMuIEFsbCBmaWxlcyBpbiB0aGUgZm9sZGVyIHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLQotIyBQYXRocy9GaWxlcyBFcnJvciBNZXNzYWdlcwotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249VGhlIHBhdGggJyd7MH0nJyBjb250YWlucyBvbmUgb3IgbW9yZSBmaWxlcyB0aGF0IGNhbm5vdCBiZSBkZWxldGVkLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1jcmVhdGVQYXRoRXJyb3JfcmVhc29uPVVuYWJsZSB0byBjcmVhdGUgcGF0aCAnJ3swfScnLlxuXG5TZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi1pbnZhbGlkUGF0aF9tc2c9VGhlIHNwZWNpZmllZCBwYXRoIGlzIG5vdCB2YWxpZC4KLW92ZXJyaWRlQ3VycmVudExpYnJhcnlFcnJvcl9tc2cwPVlvdSBjYW5ub3QgZXhwb3J0IHRvIGEgcGF0aCBjb250YWluaW5nIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnksIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBwYXRoIGFuZCB0cnkgYWdhaW4uCi0KLSMgQmFja3VwIExpYnJhcnkgRGlhbG9nCi1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RpdGxlPUJhY2t1cCBMaWJyYXJ5Ci1iYWNrdXBMaWJyYXJ5RGlhbG9nX3RleHQ9SXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgYmFjayB1cCB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBiZWZvcmUgcHJvY2VlZGluZy5cblxuQ2xpY2sgT0sgdG8gY3JlYXRlIGEgYmFja3VwIGNvcHkgb2YgdGhlIGxpYnJhcnkgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuIENsaWNrIFNraXAgdG8gY29udGludWUgd2l0aG91dCBjcmVhdGluZyB0aGUgYmFja3VwLgotYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZT1CYWNraW5nIHVwIGxpYnJhcnkgZmlsZXMgLi4uCi0KLSMgQ29weSBMaWJyYXJ5IERpYWxvZwotY29weUxpYnJhcnlEaWFsb2dfdGl0bGU9Q29weSBMaWJyYXJ5Ci1jb3B5TGlicmFyeURpYWxvZ190ZXh0X3JlYWRPbmx5TGliPVRoZSBsaWJyYXJ5IGlzIG5vdCB3cml0YWJsZS4gQ2xpY2sgQ29weSB0byBjcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBsaWJyYXJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LiBDbGljayBTa2lwIHRvIGNvbnRpbnVlIHdpdGhvdXQgY3JlYXRpbmcgdGhlIGNvcHkuCi1jb3B5TGlicmFyeVRhc2tfbmFtZT1NYWtpbmcgYSBjb3B5IG9mIHRoZSBsaWJyYXJ5IGZpbGVzIC4uLgotY29weUxpYnJhcnlEaWFsb2dfY29weUJ1dHRvbl90ZXh0PUNvcHkKLQotIyBQYXRoIFNlbGVjdGlvbiBEaWFsb2cKLXBhdGhTZWxlY3Rpb25FcnJvcl9tc2c9VW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkKLW9rQnV0dG9uX3RleHQ9T0sKLXNraXBCdXR0b25fdGV4dD1Ta2lwCi0KLSMgUHJvY2VzcyBFZGl0b3IgcHJlZmVyZW5jZXMKLWFsd2F5c0J1dHRvbl90ZXh0PUFsd2F5cwotbmV2ZXJCdXR0b25fdGV4dD1OZXZlcgotcHJvbXB0QnV0dG9uX3RleHQ9UHJvbXB0Ci0KLSMgQWRkIExpbmsgRGlhbG9nCi1saW5rVG9VUkxfbmFtZT1VUkwKLWxpbmtUb0ZpbGVfbmFtZT1GaWxlCi1lbGVtZW50TGlua19uYW1lPU1ldGhvZCBlbGVtZW50Ci1lbGVtZW50TGlua1dpdGhUeXBlX25hbWU9TWV0aG9kIGVsZW1lbnQgd2l0aCB0eXBlIHByZWZpeAotZWxlbWVudExpbmtXaXRoVXNlclRleHRfbmFtZT1NZXRob2QgZWxlbWVudCB3aXRoIGN1c3RvbSB0ZXh0Ci0KLSMgQ29udmVydCBBY3Rpdml0eSBUeXBlIERpYWxvZwotY29udmVydEFjdGl2aXR5RGlhbG9nX3RpdGxlPUNvbnZlcnQgQWN0aXZpdHkgVHlwZQotY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQ9U2VsZWN0IHRoZSB0YXJnZXQgYWN0aXZpdHkgdHlwZS4KLXVuc3VwcG9ydGVkQWN0aXZpdHlUeXBlX21zZz1JVVBMMDMwN0U6IFRoaXMgYWN0aXZpdHkgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbm90aGVyIHR5cGUuCi11bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9yZWFzb249VGhlcmUgaXMgbm8gY29tcGF0aWJsZSBhY3Rpdml0eSB0eXBlIGZvciB7MH0uCi0KLSMgU2VsZWN0IFByb2Nlc3MgV2l6YXJkIFBhZ2UKLXNlbGVjdFByb2Nlc3NXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBwcm9jZXNzCi1zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzIHRvIGV4cG9ydC4KLXByb2Nlc3Nlc0xhYmVsX3RleHQ9UHJvY2Vzc2VzOgotYnJpZWZEZXNjcmlwdGlvbkxhYmVsX3RleHQ9QnJpZWYgZGVzY3JpcHRpb246Ci0KLSMgRXhwb3J0IFByb2Nlc3MgV2l6YXJkIEVycm9yIE1lc3NhZ2UuCi1ub09wZW5MaWJyYXJ5V2FybmluZ19tc2c9SVVQTDAzMDhFOiBObyBtZXRob2QgbGlicmFyeSBpcyBjdXJyZW50bHkgb3BlbmVkLiBDbGljayBDYW5jZWwsIG9wZW4gYSBtZXRob2QgbGlicmFyeSBvciBjcmVhdGUgYSBuZXcgb25lLCBhbmQgcnVuIHRoaXMgd2l6YXJkIGFnYWluLiAKLQotIyBNb3ZlZCBmcm9tIEF1dGhvcmluZyBVSSBwbHVnLWluIHRvIGF2b2lkIEF1dGhvcmluZyBVSSBkZXBlbmRlbmN5Ci1lcnJvckRpYWxvZ190aXRsZT1FcnJvcgotTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnPwotY29uZmlybURlbGV0ZURpYWxvZ190aXRsZT1Db25maXJtIERlbGV0aW9uCi1jb25maXJtRGVsZXRlRGlhbG9nX21zZz1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICcnezB9Jyc/Ci1jb25maXJtRGVsZXRlRGlhbG9nX21zZ1dpdGhSZWZlcmVuY2U9QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAnJ3swfScnP1xuXG5UaGUgZm9sbG93aW5nIGVsZW1lbnQocykgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBpdGVtKHMpIHRvIGJlIGRlbGV0ZWQ6IHsxfQotUHJvY2Vzc0RlbGV0ZUFjdGlvbl9kZWxldGVjb2Zpcm1fdGV4dD1UaGlzIHdpbGwgc2F2ZSB0aGUgY3VycmVudCBlZGl0b3IgYW5kIHRoZSBjaGFuZ2Ugd2lsbCBiZSBwZXJtYW5lbnQuIEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJyd7MH0nJz8KLQotIyBTYXZlIE1ldGhvZCBMaWJyYXJ5IERpYWxvZwotc2F2ZUxpYnJhcnlEaWFsb2dfdGl0bGU9U2F2ZSBNZXRob2QgTGlicmFyeQotc2F2ZUxpYnJhcnlEaWFsb2dfdGV4dD1UaGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBtb2RpZmllZC4gRG8geW91IHdhbnQgdG8gc2F2ZSB0aGUgY2hhbmdlcz8KLQotIyBTYXZlIE1ldGhvZCBMaWJyYXJ5IEVycm9yIE1lc3NhZ2VzCi1zYXZlTGlicmFyeUVycm9yX21zZz1JVVBMMDMwOEU6IFRoZSBtZXRob2QgbGlicmFyeSBjYW5ub3QgYmUgc2F2ZWQuCi1lcnJvcl9yZWFzb249QW4gZXJyb3IgaGFzIG9jY3VycmVkLlxuXG5DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Db25maWd1cmF0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQ2MDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0NvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLlByZWZlcmVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogQ29udHJpYnV0ZXMgYSBtZXRob2QgY29uZmlndXJhdGlvbiBjb21ib3hib3ggdG8gdGhlIHN5c3RlbSB0b29sYmFyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBjb25maWdDb21ibzsKLQotCXByaXZhdGUgc3RhdGljIENvbWJvVmlld2VyIGNvbmZpZ0NvbWJvVmlld2VyOwotCi0JcHJvdGVjdGVkIFRvb2xJdGVtIGl0ZW07Ci0KLQlwcm90ZWN0ZWQgQ29vbEl0ZW0gY29vbEl0ZW07Ci0KLQlwcm90ZWN0ZWQgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgbGliU3ZjTGlzdGVuZXI7Ci0KLQkvLyBUaGUgY29udGVudCBwcm92aWRlci4KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JLy8gVGhlIGxhYmVsIHByb3ZpZGVyLgotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCQotCXByb3RlY3RlZCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCXBlcmZvcm1TZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oSUFjdGlvbiBhY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZmlsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGwoVG9vbEJhciBwYXJlbnQsIGludCBpbmRleCkgewotCQlpdGVtID0gbmV3IFRvb2xJdGVtKHBhcmVudCwgU1dULlNFUEFSQVRPUik7Ci0JCUNvbnRyb2wgYm94ID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQlpdGVtLnNldENvbnRyb2woYm94KTsKLQkJaXRlbS5zZXRXaWR0aCgyNDApOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb29sQmFyIGNvb2xCYXIsIGludCBpbmRleCkgewotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2woY29vbEJhcik7Ci0KLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04sIGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBiYWNrIHJlZmVyZW5jZS4KLQkJY29vbEl0ZW0uc2V0RGF0YSh0aGlzKTsKLQotCQkvLyBBZGQgdGhlIHRvb2xiYXIgdG8gdGhlIENvb2xJdGVtIHdpZGdldC4KLQkJY29vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCi0JCS8vIElmIHRoZSB0b29sYmFyIGl0ZW0gZXhpc3RzIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb29sIGl0ZW0uCi0JCVBvaW50IHRvb2xCYXJTaXplID0gYm94LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJLy8gU2V0IHRoZSBwcmVmZXJyZWQgc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdG9vbGJhciBwbHVzIHRyaW0uCi0JCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFNpemUodG9vbEJhclNpemUpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQljb25maWdDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5EUk9QX0RPV04gfCBTV1QuUkVBRF9PTkxZKTsKLQkJY29uZmlnQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudCgxMCk7Ci0JCWNvbmZpZ0NvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbmZpZ0NvbWJvKTsKLQotCQljb250ZW50UHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIoCi0JCQkJVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJCQlMaXN0PE9iamVjdD4gY29uZmlnc0xpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCQljb25maWdzTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChMaWJyYXJ5U2VydmljZVV0aWwKLQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9ucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSkpOwotCQkJCUNvbGxlY3Rpb25zLnNvcnQoY29uZmlnc0xpc3QsIENvbXBhcmF0b3JzLkRFRkFVTFRfQ09NUEFSQVRPUik7Ci0JCQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpID09IG51bGwpIHsKLQkJCQkJY29uZmlnc0xpc3QuYWRkKDAsCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gY29uZmlnc0xpc3QudG9BcnJheSgpOwotCQkJfQotCQl9OwotCi0JCWxhYmVsUHJvdmlkZXIgPSBuZXcgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyKAotCQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuZ2V0TmF2aWdhdG9yVmlld19Db21wb3NlZEFkYXB0ZXJGYWN0b3J5KCkpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQlyZXR1cm4gKFN0cmluZykgb2JqZWN0OwotCQkJCX0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIG9iamVjdC50b1N0cmluZygpOwotCQkJfQotCQl9OwotCi0JCWNvbmZpZ0NvbWJvVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCi0JCVN0cmluZyBzYXZlZENvbmZpZ05hbWUgPSBQcmVmZXJlbmNlVXRpbC5nZXRTYXZlZExhc3RDb25maWcoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBzYXZlZENvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpLCBzYXZlZENvbmZpZ05hbWUpOwotCQkKLQkJaWYgKHNhdmVkQ29uZmlnICE9IG51bGwpIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJCS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oc2F2ZWRDb25maWcpKTsKLQkJfSBlbHNlIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ0xhYmVsX3RleHQpKTsKLQkJfQotCi0JCWNvbmZpZ0NvbWJvVmlld2VyCi0JCQkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihwb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKTsKLQotCQljb25maWdDb21ib1ZpZXdlci5nZXRDb250cm9sKCkuYWRkRGlzcG9zZUxpc3RlbmVyKAotCQkJCW5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCQkJZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQotCQlsaWJTdmNMaXN0ZW5lciA9IG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCXNlbGVjdENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobGlicmFyeSk7Ci0JCQkJc2VsZWN0Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeU9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oCi0JCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnTGFiZWxfdGV4dCksIHRydWUpOwotCQkJCXJlZnJlc2goKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCWlmIChsaWJyYXJ5ICE9IGNvbmZpZ0NvbWJvVmlld2VyLmdldElucHV0KCkpIHsKLQkJCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0SW5wdXQobGlicmFyeSk7Ci0JCQkJCXJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlTZXQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJaWYgKGxpYnJhcnkgIT0gY29uZmlnQ29tYm9WaWV3ZXIuZ2V0SW5wdXQoKSkgewotCQkJCQljb25maWdDb21ib1ZpZXdlci5zZXRJbnB1dChsaWJyYXJ5KTsKLQkJCQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJCQkJc2VsZWN0Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKGxpYlN2Y0xpc3RlbmVyKTsKLQotCQlyZXR1cm4gY29uZmlnQ29tYm87Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI3ZvaWQgc2V0VmlzaWJpbGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmlsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKHZpc2libGUpIHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuYWRkTGlzdGVuZXIobGliU3ZjTGlzdGVuZXIpOwotCQl9IGVsc2UgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCX0KLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldFNlbGVjdGVkQ29uZmlnKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGNvbmZpZ0NvbWJvVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJcmV0dXJuIChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEN1cnJlbnRTZWxlY3RlZENvbmZpZ05hbWUoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgY29uZmlnQ29tYm9WaWV3ZXIKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBvYmplY3QgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvYmplY3QgIT0gbnVsbCAmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKQotCQkJcmV0dXJuIChTdHJpbmcpIG9iamVjdDsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldFNlbGVjdGVkQ29uZmlnKCk7Ci0JCQlpZiAoY29uZmlnICE9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmdldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKCkpIHsKLQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnNldEN1cnJlbnRNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQl9Ci0JCQlQcmVmZXJlbmNlVXRpbC5zYXZlU2VsZWN0ZWRDb25maWdJbnRvUGVyc2lzdGVuY2UoZ2V0Q3VycmVudFNlbGVjdGVkQ29uZmlnTmFtZSgpKTsKLQkJCXJlZnJlc2goKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAobGliU3ZjTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW1vdmVMaXN0ZW5lcihsaWJTdmNMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCWlmIChjb25maWdDb21ib1ZpZXdlciAhPSBudWxsKSB7Ci0JCQljb25maWdDb21ib1ZpZXdlcgotCQkJLnJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIocG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoZXMgdGhlIGNvbmZpZ3VyYXRpb24gY29tYm8uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCWNvbmZpZ0NvbWJvVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSBjb25maWd1cmF0aW9uIGluIGNvbmZpZ3VyYXRpb24gY29tYm8gYm94LgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNlbGVjdENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJLy9OYW1lQ2FjaGUuZ2V0SW5zdGFuY2UoKS5jbGVhcigpOwotCQlpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnID09IGdldFNlbGVjdGVkQ29uZmlnKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCWNvbmZpZ0NvbWJvVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjb25maWcpKTsKLQkJfSBlbHNlIHsKLQkJCS8vIFBlcmZvcm0gYSByZWZyZXNoIHRvIGFkZCB0aGUgIlNlbGVjdCBhIGNvbmZpZ3VyYXRpb24iCi0JCQkvLyBzdHJpbmcgdG8gdGhlIGNvbWJvLgotCQkJcmVmcmVzaCgpOwotCQkJY29uZmlnQ29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKAotCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0Q29uZmlnTGFiZWxfdGV4dCksIHRydWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJY29uZmlnQ29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL0lMaWJyYXJ5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDM3YWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvSUxpYnJhcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIExpYnJhcnkgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5QWN0aW9uIGV4dGVuZHMgSUFjdGlvbiB7Ci0vLwl2b2lkIG5vdGlmeVByb3BlcnR5Q2hhbmdlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwKLS8vCQkJT2JqZWN0IG5ld1ZhbHVlKTsKLQkKLQl2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1ZjhkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9MaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLkxpYnJhcnlTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotCi0vKioKLSAqIFJ1bnMgb3BlcmF0aW9uIHRoYXQgbG9ja3MgdGhlIGxpYnJhcnkgZm9yIHRoZSBkdXJhdGlvbiBvZiBpdHMgZXhlY3V0aW9uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIgaW1wbGVtZW50cyBJUnVubmFibGVDb250ZXh0IHsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0JCi0JcHVibGljIExpYnJhcnlMb2NraW5nT3BlcmF0aW9uUnVubmVyKCkgewotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGRvUnVuKGZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSwgZmluYWwgYm9vbGVhbiB3b3JrVW5rbm93bikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb25bXSBpdGVIb2xkZXIgPSBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvblsxXTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElXb3Jrc3BhY2VSdW5uYWJsZSB3b3Jrc3BhY2VSdW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdvcmtVbmtub3duKSB7Ci0gICAgICAgIAkJCQkJcG0uYmVnaW5UYXNrKCIiLCAyKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJCQkJCXBtLndvcmtlZCgxKTsKLSAgICAgICAgCQkJCQl0cnkgewotICAgICAgICAJCQkJCQlydW5uYWJsZS5ydW4ocG0pOwotICAgICAgICAJCQkJCQlwbS53b3JrZWQoMik7Ci0gICAgICAgIAkJCQkJfQotICAgICAgICAJCQkJCWZpbmFsbHkgewotICAgICAgICAJCQkJCQlwbS5kb25lKCk7Ci0gICAgICAgIAkJCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJcnVubmFibGUucnVuKHBtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIGl0IG91dHNpZGUgdGhlIHdvcmtzcGFjZSBydW5uYWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgaXRlSG9sZGVyWzBdID0gZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtdGhyb3cgYXMgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24sIHdoaWNoIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhdWdodCBhbmQgcmUtdGhyb3duIGFzIEludGVycnVwdGVkRXhjZXB0aW9uIGJlbG93LgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBDb3JlRXhjZXB0aW9uIGFuZCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBhcmUgcHJvcGFnYXRlZAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHdvcmtzcGFjZVJ1bm5hYmxlLAotICAgICAgICAgICAgCQluZXcgTGlicmFyeVNjaGVkdWxpbmdSdWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSksCi0gICAgICAgICAgICAJCUlXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gUmUtdGhyb3cgdGhlIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIGlmIGFueSBvY2N1cnJlZAotICAgICAgICBpZiAoaXRlSG9sZGVyWzBdICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IGl0ZUhvbGRlclswXTsKLSAgICAgICAgfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVDb250ZXh0I3J1bihib29sZWFuLCBib29sZWFuLCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihib29sZWFuIGZvcmssIGJvb2xlYW4gY2FuY2VsYWJsZSwKLQkJCWZpbmFsIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0JCQlJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWRvUnVuKHJ1bm5hYmxlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElSdW5uYWJsZVdpdGhQcm9ncmVzcyBydW5uYWJsZSkgewotCQl0cnkgewotCQkJZG9SdW4ocnVubmFibGUsIHRydWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSBjYXVzZSA9IGUuZ2V0Q2F1c2UoKTsKLQkJCWlmKGNhdXNlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKWNhdXNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYoY2F1c2UgPT0gbnVsbCkgewotCQkJCQljYXVzZSA9IGU7Ci0JCQkJfQotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoY2F1c2UpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBjYXVzZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCA/IGNhdXNlLmdldE1lc3NhZ2UoKSA6IGNhdXNlLnRvU3RyaW5nKCk7IAotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcihMaWJyYXJ5VUlSZXNvdXJjZXMuZXJyb3JEaWFsb2dfdGl0bGUsIG1zZywgY2F1c2UpOwotCQkJCX0KLQkJCQljYXRjaChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCi0JCQkJfQkJCQkKLQkJCX0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKHByb2dyZXNzTW9uaXRvciA9PSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBwcm9ncmVzc01vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciB0aGUgcHJvZ3Jlc3NNb25pdG9yIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgewotCQl0aGlzLnByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9NZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlODdmMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLQotCi0vKioKLSAqIEFjdGlvbiB0byBkZWxldGUgbWV0aG9kIGVsZW1lbnQKLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24gZXh0ZW5kcyBEZWxldGVBY3Rpb24gaW1wbGVtZW50cyBJTGlicmFyeUFjdGlvbiB7Ci0JcHJvdGVjdGVkIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uID0gbnVsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm0gPSB0cnVlOwotCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcjsKLQotCS8qKgotCSAqIERlbGV0ZXMgbWV0aG9kIGVsZW1lbnQKLQkgKgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uKEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXN1cGVyKGRvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIGNvbmZpcm0KLQkgKiAgICAgICAgICAgIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdXNlciBjb25maXJtYXRpb24gaXMgcmVxdWlyZWQuIElmCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGV4ZWN1dGluZyB0aGlzIGNvbW1hbmQgd2lsbCBub3QKLQkgKiAgICAgICAgICAgIGludGVyYWN0IHdpdGggdXNlciBhbmQgdGhlIGRlZmF1bHQgYmVoYXZpb3Igd2lsbCBhcHBseS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbiwgYm9vbGVhbiBjb25maXJtKSB7Ci0JCXRoaXMoZG9tYWluKTsKLQkJdGhpcy5jb25maXJtID0gY29uZmlybTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLmFjdGlvbi5EZWxldGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgQ29tbWFuZCBjcmVhdGVDb21tYW5kKENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNtZCA9IGNyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCk7Ci0JCWNtZAotCQkJCS5hZGRDb21tYW5kTGlzdGVuZXIobmV3IERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLkNvbW1hbmRMaXN0ZW5lcigpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBub3RpZnlFeGVjdXRlZChFdmVudE9iamVjdCBldmVudE9iamVjdCkgewotCQkJCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY21kID0gKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSBldmVudE9iamVjdAotCQkJCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJCQlkaWREZWxldGUoY21kLmdldFJlc3VsdCgpKTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUZhaWx1cmUoRXZlbnRPYmplY3QgZXZlbnRPYmplY3QpIHsKLQkJCQkJCWRlbGV0ZUZhaWxlZCgpOwotCQkJCQl9Ci0KLQkJCQl9KTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVGYWlsZWQoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgY29tbWFuZCB0byBkZWxldGUgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY3JlYXRlTWV0aG9kRWxlbWVudERlbGV0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQoc3VwZXIuY3JlYXRlQ29tbWFuZChzZWxlY3Rpb24pLAotCQkJCXNlbGVjdGlvbiwgY29uZmlybSkgewotCQkJcHJvdGVjdGVkIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLAotCQkJCQlTZXQgZGVsZXRlZEdVSURzKSB7Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBMaWJyYXJ5U2VydmljZQotCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKS5lUmVzb3VyY2UoKQotCQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQkJcmVzb3VyY2VTZXQKLQkJCQkJCS5sb2FkT3Bwb3NpdGVGZWF0dXJlcyhvcHBvc2l0ZUZlYXR1cmVzLCBkZWxldGVkR1VJRHMpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpZERlbGV0ZShDb2xsZWN0aW9uPD8+IGRlbGV0ZWRFbGVtZW50cykgewotCi0JfQotCi0JLyoqCi0JICogR2V0IGNvbmZpcm1hdGlvbiBtZXNzYWdlIHRvIGRlbGV0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlbGV0ZUNvbmZpcm1hdGlvbk1lc3NhZ2UoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VUlSZXNvdXJjZXMuTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbl9kZWxldGVjb25maXJtX3RleHQ7IAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1EZWxldGUoKSB7Ci0JCWlmICghY29uZmlybSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaSA9IDA7Ci0JCVN0cmluZ0J1ZmZlciBlbGVtZW50U3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoSXRlcmF0b3I8Pz4gaXQgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IFRuZ1V0aWwudW53cmFwKGl0Lm5leHQoKSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCWlmIChpID4gMCkgewotCQkJCQllbGVtZW50U3RyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbGVtZW50U3RyLmFwcGVuZChnZXREaXNwbGF5U3RyaW5nKChNZXRob2RFbGVtZW50KW9iaikpOwotCi0JCQkJaSsrOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0W10gYXJncyA9IHsgZWxlbWVudFN0ci50b1N0cmluZygpIH07Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZChMaWJyYXJ5VUlSZXNvdXJjZXMuY29uZmlybURlbGV0ZURpYWxvZ19tc2csIGFyZ3MpOyAvLyBOT04tTkxTLTEkCi0KLQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeVVJUmVzb3VyY2VzLmNvbmZpcm1EZWxldGVEaWFsb2dfdGl0bGU7IAotCQlib29sZWFuIGRlbGV0ZU9rID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKQotCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKHRpdGxlLCBtc2cpOwotCQlyZXR1cm4gZGVsZXRlT2s7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKE1ldGhvZEVsZW1lbnQgZWxlbWVudCl7Ci0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuSUxpYnJhcnlBY3Rpb24jc2V0UHJvZ3Jlc3NNb25pdG9yKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBwcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKHByb2dyZXNzTW9uaXRvciA9PSBudWxsKSB7Ci0JCQlwcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBwcm9ncmVzc01vbml0b3I7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlMaWJyYXJ5TG9ja2luZ09wZXJhdGlvblJ1bm5lciBydW5uZXIgPSBuZXcgTGlicmFyeUxvY2tpbmdPcGVyYXRpb25SdW5uZXIoKTsKLQkJcnVubmVyLnNldFByb2dyZXNzTW9uaXRvcihnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJ1bm5lci5ydW4obmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlwZXJmb3JtRGVsZXRlKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIGRlbGV0ZQotCSAqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJc3VwZXIucnVuKCk7CQkKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvT3BlbkxpYnJhcnlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9hY3Rpb25zL09wZW5MaWJyYXJ5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTc1NTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvT3BlbkxpYnJhcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBPcGVuIExpYnJhcnkgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5QWN0aW9uIGltcGxlbWVudHMgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNpbml0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzLndpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNydW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaW50IGRpcnR5Q291bnQgPSAwOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gbGlzdCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpCi0JCQkJLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobGlzdFtpXS5pc0RpcnR5KCkpIHsKLQkJCQlkaXJ0eUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGlydHlDb3VudCA9PSAxKSB7Ci0JCQlib29sZWFuIHJjID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlQWxsRWRpdG9ycyh0cnVlKTsKLQkJCWlmICghcmMpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZGlydHlDb3VudCA+IDEpIHsKLQkJCXN3aXRjaCAoTGlicmFyeVVJVXRpbC5kaXNwbGF5U2F2ZURpcnR5RWRpdG9yc0RpYWxvZygpKSB7Ci0JCQljYXNlIFNXVC5ZRVM6Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUFsbEVkaXRvcnModHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5OTzoKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmNsb3NlQWxsRWRpdG9ycyhmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXVC5DQU5DRUw6Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJT3BlbkxpYnJhcnlXaXphcmQgd2l6YXJkID0gbmV3IE9wZW5MaWJyYXJ5V2l6YXJkKCk7Ci0JCXdpemFyZC5pbml0KHdpbmRvdy5nZXRXb3JrYmVuY2goKSwgbnVsbCk7Ci0JCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Qcm9jZXNzRGVsZXRlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9Qcm9jZXNzRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNzE4MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvUHJvY2Vzc0RlbGV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLkRlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuY29tbWFuZC5EZWxldGVXb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLmNvbW1hbmQuUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5jb21tYW5kLlJlbW92ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBkZWxldGUgYWN0aW9uIGZvciB0aGUgcHJvY2VzcyBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVsZXRlQWN0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudERlbGV0ZUFjdGlvbiB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVsZXRpb25Db25maXJtZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgSGFzaFNldDxEZXNjcmlwdG9yPiByZW1vdmVkRGVzY3JpcHRvcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlCi0JICovCi0JcHVibGljIFByb2Nlc3NEZWxldGVBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIHRoZSBlZGl0aW5nIGRvbWFpbgotCSAqLwotCXB1YmxpYyBQcm9jZXNzRGVsZXRlQWN0aW9uKEVkaXRpbmdEb21haW4gZG9tYWluKSB7Ci0JCXN1cGVyKGRvbWFpbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZQotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIHRoZSBlZGl0aW5nIGRvbWFpbgotCSAqIEBwYXJhbSBjb25maXJtCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGlzcGxheXMgYSBwcm9tcHQgdG8gYXNrIGZvciB1c2VyCi0JICogICAgICAgICAgICBjb25maXJtYXRpb24KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0RlbGV0ZUFjdGlvbihFZGl0aW5nRG9tYWluIGRvbWFpbiwgYm9vbGVhbiBjb25maXJtKSB7Ci0JCXN1cGVyKGRvbWFpbiwgY29uZmlybSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI2NyZWF0ZU1ldGhvZEVsZW1lbnREZWxldGVDb21tYW5kKCkKLQkgKi8KLQlwdWJsaWMgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY3JlYXRlTWV0aG9kRWxlbWVudERlbGV0ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgUHJvY2Vzc0VsZW1lbnREZWxldGVDb21tYW5kKFJlbW92ZUNvbW1hbmQuY3JlYXRlKGRvbWFpbiwKLQkJCQlzZWxlY3Rpb24pLCBzZWxlY3Rpb24sIGNvbmZpcm0pOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIGRlbGV0ZSBhY3Rpb24gZ2l2ZW4gdGhlIGFjdGlvbiBtYW5hZ2VyCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1ncikgewotCQlpZiAoY29uZmlybURlbGV0ZSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8gcmVtb3ZlIHJlZmVyZW5jZXMKLQkJCQlyZW1vdmVSZWZlcmVuY2VzKGFjdGlvbk1nciwgaXRvci5uZXh0KCkpOwotCQkJfQotCi0JCQkvLyBkZWxldGUgZWxlbWVudAotCQkJZG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlQ3VycmVudEVkaXRvcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jZ2V0RGVsZXRlQ29uZmlybWF0aW9uTWVzc2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWxldGVDb25maXJtYXRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gTGlicmFyeVVJUmVzb3VyY2VzLlByb2Nlc3NEZWxldGVBY3Rpb25fZGVsZXRlY29maXJtX3RleHQ7IAotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZURlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZChDb2xsZWN0aW9uPERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzLCBDb2xsZWN0aW9uPD8+IGRlbGV0ZWRFbGVtZW50cykgewotCQlyZXR1cm4gbmV3IERlbGV0ZVVudXNlZERlc2NyaXB0b3JzQ29tbWFuZCgKLQkJCQlkZXNjcmlwdG9ycywgZmFsc2UsIGRlbGV0ZWRFbGVtZW50cykgewotCi0JCQlwcm90ZWN0ZWQgQ29tbWFuZCBkZWxldGUoTGlzdCBlbGVtZW50cykgewotCQkJCXJldHVybiBQcm9jZXNzRGVsZXRlQWN0aW9uLmRlbGV0ZShlbGVtZW50cyk7Ci0JCQl9Ci0KLQkJCS8vIHByb3RlY3RlZCB2b2lkIHNlbGVjdERlc2NyaXB0b3JzVG9EZWxldGUoTGlzdAotCQkJLy8gZGVzY3JpcHRvcnNUb0RlbGV0ZSkgewotCQkJLy8gU3RyaW5nIG1zZyA9Ci0JCQkvLyBBdXRob3JpbmdVSVJlc291cmNlcy5Qcm9jZXNzRGVsZXRlQWN0aW9uX3NlbGVjdERlc2NyaXB0b3JzVG9EZWxldGU7Ci0JCQkvLyBPYmplY3RbXSBkZXNjcmlwdG9ycyA9Ci0JCQkvLyBSZWZlcmVuY2VTZWxlY3Rpb24uZ2V0UmVmZXJlbmNlcyhkZXNjcmlwdG9yc1RvRGVsZXRlLAotCQkJLy8gbXNnKTsKLQkJCS8vIGRlc2NyaXB0b3JzVG9EZWxldGUucmV0YWluQWxsKEFycmF5cy5hc0xpc3QoZGVzY3JpcHRvcnMpKTsKLQkJCS8vIH0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBNZXRob2RFbGVtZW50RGVsZXRlQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoY29uZmlybURlbGV0ZSgpKSB7Ci0JCQkvLyBjb2xsZWN0aW9uIHRoZSByZWxhdGVkIGRlc2NyaXB0b3JzIGJlZm9yZSB0aGUgZWxlbWVudHMgZ290Ci0JCQkvLyBkZWxldGVkCi0JCQkvLwotCQkJQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0PERlc2NyaXB0b3I+KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQlhZGRSZWxhdGVkRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMsIGVsZW1lbnQpOwotCQkJfQotCi0JCQlDb21tYW5kIGNtZCA9IGNvbW1hbmQ7Ci0KLQkJCS8vIGRlbGV0ZSBlbGVtZW50cwotCQkJLy8KLQkJCWNtZC5leGVjdXRlKCk7Ci0KLQkJCS8vIENoZWNrIHJlZmVyZW5jZSBjb25maXJtYXRpb24gYW5kIGlmIGNvbmZpcm1lZCBzZXQKLQkJCS8vIGRlbGV0aW9uY29uZmlybWVkIHRvIHRydWUKLQkJCS8vIElmIGFueSBkZWxldGlvbiBoYXBwZW5zIGluIHNlcXVlbmNlLCB3aWxsIGNoZWNrIGZvcgotCQkJLy8gZGVsZXRpb25jb25maXJtZWQgdmFyaWFibGUKLQkJCS8vIGFuZCBwcm9jZWVkcyByZW1haW5pbmcgZGVsZXRpb24gc2VxdWVuY2UuIChlZzoKLQkJCS8vIEFic3RyYWN0RGlhZ3JhbUVkaXRvciAtIERlbGV0ZUFjdGlvbigpKS4KLQkJCWlmICgoKERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kKSBjbWQpLmV4ZWN1dGVkKSB7Ci0JCQkJZGVsZXRpb25Db25maXJtZWQgPSB0cnVlOwotCi0JCQkJQ29sbGVjdGlvbjw/PiBkZWxldGVkRWxlbWVudHMgPSBjbWQuZ2V0UmVzdWx0KCk7Ci0JCQkJQ29tbWFuZCBkZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQgPSBjcmVhdGVEZWxldGVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQoZGVzY3JpcHRvcnMsIGRlbGV0ZWRFbGVtZW50cyk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCQl9IGNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZGVsZXRlVW51c2VkRGVzY3JpcHRvcnNDb21tYW5kLmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHNhdmUgdGhlIGN1cnJlbnQgZWRpdG9yCi0JCQkvLwotCQkJc2F2ZUN1cnJlbnRFZGl0b3IoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVsYXRlZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycywgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2MgPSAoVGFza0Rlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0QXNzaXN0ZWRCeSgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRNYW5kYXRvcnlJbnB1dCgpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbCh0YXNrRGVzYy5nZXRFeHRlcm5hbElucHV0KCkpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHRhc2tEZXNjLmdldE9wdGlvbmFsSW5wdXQoKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwodGFza0Rlc2MuZ2V0T3V0cHV0KCkpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQ7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldEFzc2lzdGVkVGFza0Rlc2NyaXB0b3JzKHJvbGVEZXNjKSk7Ci0JCQlkZXNjcmlwdG9ycy5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIKLQkJCQkJLmdldEFkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMocm9sZURlc2MpKTsKLQkJCWRlc2NyaXB0b3JzLmFkZEFsbChBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkuZ2V0UHJpbWFyeVRhc2tEZXNjcmlwdG9ycyhyb2xlRGVzYykpOwotCQkJZGVzY3JpcHRvcnMuYWRkQWxsKHJvbGVEZXNjLmdldFJlc3BvbnNpYmxlRm9yKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJlZmVyZW5jZXMoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBPYmplY3Qgb2JqKSB7Ci0JCUlSZXNvdXJjZUF3YXJlQ29tbWFuZCBjbWQgPSBudWxsOwotCQlib29sZWFuIGZvcmNlID0gIWNvbmZpcm07Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJY21kID0gbmV3IERlbGV0ZVRhc2tEZXNjcmlwdG9yKChUYXNrRGVzY3JpcHRvcikgb2JqLCBmb3JjZSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWNtZCA9IG5ldyBEZWxldGVSb2xlRGVzY3JpcHRvcigoUm9sZURlc2NyaXB0b3IpIG9iaiwgZm9yY2UpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJY21kID0gbmV3IERlbGV0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBvYmosCi0JCQkJCWZvcmNlKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUZWFtUHJvZmlsZSkgewotCQkJY21kID0gbmV3IERlbGV0ZVRlYW1Qcm9maWxlKChUZWFtUHJvZmlsZSkgb2JqKTsKLQkJfQotCQlpZiAoY21kICE9IG51bGwpIHsKLQkJCWlmIChhY3Rpb25NZ3IgIT0gbnVsbCkgewotCQkJCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJY21kLmV4ZWN1dGUoKTsKLQkJCX0KLQkJCWlmIChjbWQgaW5zdGFuY2VvZiBSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQpIHsKLQkJCQlyZW1vdmVkRGVzY3JpcHRvcnMKLQkJCQkJCS5hZGRBbGwoKChSZW1vdmVVbnVzZWREZXNjcmlwdG9yc0NvbW1hbmQpIGNtZCkKLQkJCQkJCQkJLmdldFJlbW92ZWREZXNjcmlwdG9ycygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkuYWN0aW9uLkNvbW1hbmRBY3Rpb25IYW5kbGVyI3VwZGF0ZVNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByZXQgPSBzdXBlci51cGRhdGVTZWxlY3Rpb24oZmlsdGVyU2VsZWN0aW9uKHNlbGVjdGlvbikpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIEZpbHRlcnMgc2VsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiBAcmV0dXJuIE5ldyBTZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZpbHRlclNlbGVjdGlvbigKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlBcnJheUxpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCSYmICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpIGVsZW1lbnQpCi0JCQkJCQkJLmlzUmVhZE9ubHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihsaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBkZWxldGlvbiBjb25maXJtZWQsIHNldCBjb25maXJtYXRpb24gYW5kIGNoaWxkIHByb2Nlc3MgY2FuIHVzZSB0aGUKLQkgKiBjb25maXJtYXRpb24gdG8gcHJvY2VlZCBmb3IgdGhlIGRlbGV0aW9uIG9mIHJlbWFpbmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0aW9uQ29uZmlybWVkKCkgewotCQlyZXR1cm4gZGVsZXRpb25Db25maXJtZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGNvbW1hbmQKLQkgKiAKLQkgKiBAcmV0dXJuIGNtZAotCSAqLwotCXByb3RlY3RlZCBDb21tYW5kIGdldENvbW1hbmQoKSB7Ci0JCXJldHVybiBjb21tYW5kOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBkZWxldGUgcHJvY2VzcyBlbGVtZW50cyB3aXRob3V0IFVJIGFjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEByZXR1cm4gdGhlIGV4ZWN1dGVkIGRlbGV0ZSBjb21tYW5kIGlmIHNvbWUgb2YgdGhlIGdpdmVuIGVsZW1lbnRzIGhhdmUKLQkgKiAgICAgICAgIGJlZW4gc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQsIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB1c2VyIGNhbmNlbGVkIHRoaXMgZGVsZXRpb24gb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21tYW5kIGRlbGV0ZShDb2xsZWN0aW9uIGVsZW1lbnRzKSB7Ci0JCVByb2Nlc3NEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uID0gbmV3IFByb2Nlc3NEZWxldGVBY3Rpb24obnVsbCwgZmFsc2UpIHsKLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5hY3Rpb25zLk1ldGhvZEVsZW1lbnREZWxldGVBY3Rpb24jY3JlYXRlQ29tbWFuZChqYXZhLnV0aWwuQ29sbGVjdGlvbikKLQkJCSAqLwotCQkJcHVibGljIENvbW1hbmQgY3JlYXRlQ29tbWFuZChDb2xsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJCWRvbWFpbiA9IG5ldyBBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4oCi0JCQkJCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCQkJCQkuZ2V0UHJvY2Vzc0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCW5ldyBCYXNpY0NvbW1hbmRTdGFjaygpKTsKLQotCQkJCXJldHVybiBzdXBlci5jcmVhdGVDb21tYW5kKHNlbGVjdGlvbik7Ci0JCQl9Ci0KLQkJfTsKLQkJaWYgKGRlbGV0ZUFjdGlvbi51cGRhdGVTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obmV3IEFycmF5TGlzdCgKLQkJCQllbGVtZW50cykpKSkgewotCQkJZGVsZXRlQWN0aW9uLnJ1bigpOwotCQkJaWYgKCFkZWxldGVBY3Rpb24uaXNEZWxldGlvbkNvbmZpcm1lZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVsZXRlQWN0aW9uLmdldENvbW1hbmQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTRjOWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgYWN0aW9ucyBmb3IgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9CYXNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGNkNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBMaWJyYXJ5IFVJIGRpYWxvZ3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmFzZURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0KLQkvKioKLQkgKiBUaGUgT0sgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgQ2FuY2VsIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHBhcmVudCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgQmFzZURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCW9rQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljYW5jZWxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29udmVydEFjdGl2aXR5RGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Db252ZXJ0QWN0aXZpdHlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzNGYwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9Db252ZXJ0QWN0aXZpdHlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWwuVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvbnZlcnRBY3Rpdml0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci0KLS8qKgotICogRGlhbG9nIHRvIGNvbnZlcnQgYWN0aXZpdHkgdHlwZSAKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0QWN0aXZpdHlEaWFsb2cgewotCi0JLyoqCi0JICogUXVlcnkgdXNlciBhbmQgY29udmVydCB0aGUgb2xkIGFjdGl2aXR5IGludG8gbmV3IG9uZQotCSAqIAotCSAqIEBwYXJhbSBvbGRBY3Rpdml0eQotCSAqIEBwYXJhbSBzaGVsbAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICogCi0JICogQHJldHVybiBOZXdseSBjb252ZXJ0ZWQgYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IHF1ZXJ5VXNlckFuZENvbnZlcnQoQWN0aXZpdHkgb2xkQWN0aXZpdHksIFNoZWxsIHNoZWxsLAotCQkJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCkgewotCQkKLQkJaWYgKHNoZWxsID09IG51bGwpCi0JCQlzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JCUxpc3REaWFsb2cgZGxnID0gbmV3IExpc3REaWFsb2coc2hlbGwpOwotCQlkbGcuc2V0SGVpZ2h0SW5DaGFycyg1KTsKLQkJZGxnLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWRsZy5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJc3dpdGNoICgoKEludGVnZXIpIGVsZW1lbnQpLmludFZhbHVlKCkpIHsKLQkJCQkvLyBUT0RPOiByZWZhY3RvciB0aGVzZSBzdHJpbmdzIChhbmQgdGhpcyB3aG9sZSBkaWFsb2cpIGludG8KLQkJCQkvLyBsaWJyYXJ5LnVpCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOgotCQkJCQlyZXR1cm4gTGlicmFyeVVJVGV4dC5URVhUX0FDVElWSVRZOwotCQkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046Ci0JCQkJCXJldHVybiBMaWJyYXJ5VUlUZXh0LlRFWFRfSVRFUkFUSU9OOwotCQkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRToKLQkJCQkJcmV0dXJuIExpYnJhcnlVSVRleHQuVEVYVF9QSEFTRTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy51bmtub3duR3VpZGFuY2VfdGV4dDsgCi0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCQlMaXN0IG5ld0FjdGl2aXR5VHlwZUxpc3QgPSBnZXRWYWxpZE5ld0FjdGl2aXR5VHlwZXMob2xkQWN0aXZpdHkpOwotCQlpZiAobmV3QWN0aXZpdHlUeXBlTGlzdCA9PSBudWxsKSB7Ci0JCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLCAKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudW5zdXBwb3J0ZWRBY3Rpdml0eVR5cGVfbXNnLAotCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5iaW5kKExpYnJhcnlVSVJlc291cmNlcy51bnN1cHBvcnRlZEFjdGl2aXR5VHlwZV9yZWFzb24sIFN0clV0aWwudG9Mb3dlcihUbmdVdGlsLmdldFR5cGVUZXh0KG9sZEFjdGl2aXR5KSkpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWRsZy5zZXRJbnB1dChuZXdBY3Rpdml0eVR5cGVMaXN0KTsKLQkJZGxnLnNldFRpdGxlKExpYnJhcnlVSVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlEaWFsb2dfdGl0bGUpOwotCQlkbGcuc2V0TWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RGlhbG9nX3RleHQpOwotCQlpZiAoZGxnLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJT2JqZWN0W10gc2VsZWN0aW9uUmVzdWx0ID0gZGxnLmdldFJlc3VsdCgpOwotCQlpZiAoc2VsZWN0aW9uUmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGNob3NlbkFjdGl2aXR5ID0gKChJbnRlZ2VyKSBzZWxlY3Rpb25SZXN1bHRbMF0pLmludFZhbHVlKCk7Ci0JCQotLy8JCXJldHVybiBDb252ZXJ0QWN0aXZpdHlUeXBlLmNvbnZlcnRBY3Rpdml0eShvbGRBY3Rpdml0eSwgY2hvc2VuQWN0aXZpdHksIGNvbW1hbmQpOwotCQkKLQkJcmV0dXJuIFR5cGVDb252ZXJ0ZXIuY29udmVydEFjdGl2aXR5KG9sZEFjdGl2aXR5LCBUeXBlQ29udmVydGVyLmdldEFjdGl2aXR5VHlwZShjaG9zZW5BY3Rpdml0eSkpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIGxpc3Qgb2YgdmFsaWQgbmV3IGFjdGl2aXR5IHR5cGVzIGJhc2VkIG9uIG9sZCBhY3Rpdml0eSB0eXBlCi0JICogCi0JICogQHBhcmFtIG9sZEFjdGl2aXR5Ci0JICogCi0JICogQHJldHVybiBsaXN0IG9mIHZhbGlkIGFjdGl2aXR5IHR5cGVzCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFZhbGlkTmV3QWN0aXZpdHlUeXBlcyhBY3Rpdml0eSBvbGRBY3Rpdml0eSkgewotCQlpZiAob2xkQWN0aXZpdHkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlZ2VyIG9sZEFjdGl2aXR5Q2xhc3NJRCA9IG5ldyBJbnRlZ2VyKG9sZEFjdGl2aXR5LmVDbGFzcygpCi0JCQkJLmdldENsYXNzaWZpZXJJRCgpKTsKLQkJaWYgKCFDb252ZXJ0QWN0aXZpdHlUeXBlLmNvbXBhdGlibGVBY3Rpdml0aWVzTGlzdC5jb250YWlucyhvbGRBY3Rpdml0eUNsYXNzSUQpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgYWN0aXZpdHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBDb252ZXJ0QWN0aXZpdHlUeXBlLmNvbXBhdGlibGVBY3Rpdml0aWVzTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUludGVnZXIgY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQgPSAoSW50ZWdlcilpdGVyLm5leHQoKTsKLQkJCWlmICghb2xkQWN0aXZpdHlDbGFzc0lELmVxdWFscyhjb21wYXRpYmxlQWN0aXZpdHlUeXBlQ2xhc3NJRCkgJiYKLQkJCQkJY29tcGF0aWJsZUFjdGl2aXR5VHlwZUNsYXNzSUQuaW50VmFsdWUoKSAhPSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTiAmJgotCQkJCQljb21wYXRpYmxlQWN0aXZpdHlUeXBlQ2xhc3NJRC5pbnRWYWx1ZSgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUykKLQkJCQlhY3Rpdml0eUxpc3QuYWRkKGNvbXBhdGlibGVBY3Rpdml0eVR5cGVDbGFzc0lEKTsKLQkJfQotCQlyZXR1cm4gYWN0aXZpdHlMaXN0OwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29weUxpYnJhcnlEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0NvcHlMaWJyYXJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyOTQxOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvQ29weUxpYnJhcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRGlhbG9nIHRvIHByb21wdCB0aGUgdXNlciB0byBjb3B5IGEgbGlicmFyeSB0byBhbm90aGVyIGxvY2F0aW9uCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5TGlicmFyeURpYWxvZyBleHRlbmRzIFBhdGhTZWxlY3Rpb25EaWFsb2cgewotCQotCXB1YmxpYyBDb3B5TGlicmFyeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIFN0cmluZyBkZWZhdWx0UGF0aCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ01lc3NhZ2UsIGRlZmF1bHRQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b24ob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGlkLCBTdHJpbmcgbGFiZWwsCi0JCQlib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJQnV0dG9uIGIgPSBzdXBlci5jcmVhdGVCdXR0b24ocGFyZW50LCBpZCwgbGFiZWwsIGRlZmF1bHRCdXR0b24pOwotCQlpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJYi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5jb3B5TGlicmFyeURpYWxvZ19jb3B5QnV0dG9uX3RleHQpOwotCi0JCX0gZWxzZSBpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCWIuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuc2tpcEJ1dHRvbl90ZXh0KTsKLQkJfQotCi0JCXJldHVybiBiOwotCX0KLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvTGlicmFyeUJhY2t1cERpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvTGlicmFyeUJhY2t1cERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWI1YmJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL0xpYnJhcnlCYWNrdXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBiYWNrIHVwIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5QmFja3VwRGlhbG9nIGV4dGVuZHMgUGF0aFNlbGVjdGlvbkRpYWxvZyB7Ci0KLQlwdWJsaWMgTGlicmFyeUJhY2t1cERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIFN0cmluZyBkZWZhdWx0UGF0aCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ01lc3NhZ2UsIGRlZmF1bHRQYXRoKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUJ1dHRvbihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsIGludCwgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaWQsIFN0cmluZyBsYWJlbCwKLQkJCWJvb2xlYW4gZGVmYXVsdEJ1dHRvbikgewotCQlCdXR0b24gYiA9IHN1cGVyLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGlkLCBsYWJlbCwgZGVmYXVsdEJ1dHRvbik7Ci0JCWlmIChpZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQliLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9rQnV0dG9uX3RleHQpOwotCi0JCX0gZWxzZSBpZiAoaWQgPT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpIHsKLQkJCWIuc2V0VGV4dChMaWJyYXJ5VUlSZXNvdXJjZXMuc2tpcEJ1dHRvbl90ZXh0KTsKLQkJfQotCi0JCXJldHVybiBiOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1BhdGhTZWxlY3Rpb25EaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1BhdGhTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjYWUyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9QYXRoU2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzLkRpcmVjdG9yeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2VsZWN0IGEgcGF0aAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXRoU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByb3RlY3RlZCBUZXh0IGN0cmxfcGF0aDsKLQotCXByb3RlY3RlZCBCdXR0b24gY3RybF9icm93c2VfYnV0dG9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQlwdWJsaWMgUGF0aFNlbGVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLAotCQkJU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIFN0cmluZyBkZWZhdWx0UGF0aCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLQkJdGl0bGUgPSBkaWFsb2dUaXRsZTsKLQkJbWVzc2FnZSA9IGRpYWxvZ01lc3NhZ2U7Ci0JCXZhbHVlID0gZGVmYXVsdFBhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNidXR0b25QcmVzc2VkKGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJdmFsdWUgPSBjdHJsX3BhdGguZ2V0VGV4dCgpOwotCi0JCQkvLyBtYWtlIHN1cmUgdGhlIHBhdGggaXMgdmFsaWQKLQkJCVN0cmluZyBtc2cgPSBMaWJyYXJ5VUlSZXNvdXJjZXMucGF0aFNlbGVjdGlvbkVycm9yX21zZzsKLQkJCWlmIChEaXJlY3RvcnlWYWxpZGF0b3IuY2hlY2tBbmRDcmVhdGVEaXIodmFsdWUsIHRpdGxlLCBtc2cpID09IGZhbHNlKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCWlmICh0aXRsZSAhPSBudWxsKQotCQkJc2hlbGwuc2V0VGV4dCh0aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIE9LIGFuZCBDYW5jZWwgYnV0dG9ucyBieSBkZWZhdWx0Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQotCQkvLyBkbyB0aGlzIGhlcmUgYmVjYXVzZSBzZXR0aW5nIHRoZSB0ZXh0IHdpbGwgc2V0IGVuYWJsZW1lbnQgb24gdGhlIG9rCi0JCS8vIGJ1dHRvbgotCQljdHJsX3BhdGguc2V0Rm9jdXMoKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWN0cmxfcGF0aC5zZXRUZXh0KHZhbHVlKTsKLQkJCWN0cmxfcGF0aC5zZWxlY3RBbGwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJLy8gY3JlYXRlIG1lc3NhZ2UKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlsYWJlbC5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKTsKLQkJCWRhdGEud2lkdGhIaW50ID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5NSU5JTVVNX01FU1NBR0VfQVJFQV9XSURUSCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJbGFiZWwuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsKLQkJfQotCQljdHJsX3BhdGggPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJY3RybF9wYXRoLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTAotCQkJCXwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJY3RybF9icm93c2VfYnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJY3RybF9icm93c2VfYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKSk7Ci0JCWN0cmxfYnJvd3NlX2J1dHRvbi5zZXRUZXh0KExpYnJhcnlVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0JCWN0cmxfYnJvd3NlX2J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlvcGVuRGlyZWN0b3J5RGlhbG9nKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIE9wZW4gZGlyZWN0b3J5IGRpYWxvZwotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG9wZW5EaXJlY3RvcnlEaWFsb2coKSB7Ci0JCXRyeSB7Ci0JCQkvLyBUZXh0IGN0cmxfcGF0aCA9IHN1cGVyLmdldFRleHQoKTsKLQkJCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2codGhpcy5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCQlkZC5zZXRGaWx0ZXJQYXRoKGN0cmxfcGF0aC5nZXRUZXh0KCkpOwotCi0JCQlTdHJpbmcgZGVzdGluYXRpb24gPSBkZC5vcGVuKCk7Ci0JCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJCWN0cmxfcGF0aC5zZXRUZXh0KGRlc3RpbmF0aW9uKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHBhdGgKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9TZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9TZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Y2E3ZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvU2VsZWN0TGlicmFyeURpcmVjdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQcm9tcHMgdGhlIHVzZXIgdG8gc2VsZWN0IGEgbWV0aG9kIGxpYnJhcnkgZm9sZGVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2cgewotCi0JcHJpdmF0ZSBEaXJlY3RvcnlEaWFsb2cgZGlhbG9nOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IHNoZWxsLgotCSAqLwotCXB1YmxpYyBTZWxlY3RMaWJyYXJ5RGlyZWN0b3J5RGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgU1dULk5PTkUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBzaGVsbC4KLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIFRoZSBkaWFsb2cgc3R5bGUuCi0JICovCi0JcHVibGljIFNlbGVjdExpYnJhcnlEaXJlY3RvcnlEaWFsb2coU2hlbGwgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhwYXJlbnQsIHN0eWxlKTsKLQkJZGlhbG9nLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnNlbGVjdExpYnJhcnlGb2xkZXJEaWFsb2dfdGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShMaWJyYXJ5VUlSZXNvdXJjZXMuc2VsZWN0TGlicmFyeUZvbGRlckRpYWxvZ190ZXh0KTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgoTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpbHRlciBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBUaGUgZmlsdGVyIHBhdGguCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyUGF0aChTdHJpbmcgcGF0aCkgewotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBNYWtlcyB0aGUgZGlhbG9nIHZpc2libGUgYW5kIGJyaW5ncyBpdCB0byB0aGUgZnJvbnQgb2YgdGhlIGRpc3BsYXkuCi0JICovCi0JcHVibGljIFN0cmluZyBvcGVuKCkgewotCQlyZXR1cm4gZGlhbG9nLm9wZW4oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmM2FjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvZGlhbG9ncy9VbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0U2VsZWN0aW9uRGlhbG9nOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGV4dGVuZHMgamZhY2UgTGlzdFNlbGVjdGlvbkRpYWxvZyBhbmQgcmVtb3ZlcyBjYW5jZWwgYnV0dG9uCi0gICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMQotICoKLSAqLwotcHVibGljIGNsYXNzIFVuY2FuY2VsYWJsZUxpc3RTZWxlY3Rpb25EaWFsb2cgZXh0ZW5kcyBMaXN0U2VsZWN0aW9uRGlhbG9nIHsKLQotCXB1YmxpYyBVbmNhbmNlbGFibGVMaXN0U2VsZWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBPYmplY3QgaW5wdXQsCi0gICAgICAgICAgICBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsCi0gICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBTdHJpbmcgbWVzc2FnZSkKLQl7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBpbnB1dCwgY29udGVudFByb3ZpZGVyLCBsYWJlbFByb3ZpZGVyLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVXNlcklucHV0c0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvVXNlcklucHV0c0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBmNjVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL1VzZXJJbnB1dHNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlVzZXJJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnMuRGVsZWdhdGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGFjdHMgYXMgYSBpbnB1dCBkaWFsb2cgZHVyaW5nIGNvbW1hbmQgZXhlY3V0aW9uIGJhc2VkIG9uIHVzZXIKLSAqIGlucHV0IGFuZCBpbnB1dFR5cGUgZGlhbG9nIGJlaGF2aW91ciBjaGFuZ2VzLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVzZXJJbnB1dHNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCi0JSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZ2xvYmFsRXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7Ci0KLQlwcml2YXRlIExpc3QgdXNlcklucHV0czsKLQotCXByaXZhdGUgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCUxhYmVsIG1lc3NhZ2VBcmVhOwotCi0JTGFiZWwgZXJyb3JBcmVhOwotCi0JSGFzaE1hcDxPYmplY3QsT2JqZWN0PiBvbGRJbmZvRm9yQ2FuY2VsOwotCQotCXByaXZhdGUgQ29sb3IgcmVkQ29sb3I7Ci0JCi0JcHVibGljIFVzZXJJbnB1dHNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIExpc3QgdXNlcklucHV0cywgU3RyaW5nIHRpdGxlLAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXRoaXMudXNlcklucHV0cyA9IHVzZXJJbnB1dHM7Ci0JCW9sZEluZm9Gb3JDYW5jZWwgPSBuZXcgSGFzaE1hcDxPYmplY3QsT2JqZWN0PigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0aXRsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBUcmVlIFZpZXdlci4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFVzZXJJbnB1dCB1c2VySW5wdXQpIHsKLQkJVHJlZVZpZXdlciB2aWV3ZXI7Ci0JCWlmICghdXNlcklucHV0LmlzTXVsdGlwbGUoKSkgewotCQkJdmlld2VyID0gbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMCi0JCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCX0gZWxzZSB7Ci0JCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTAotCQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl9Ci0KLQkJR3JpZERhdGEgc3BlYyA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl7Ci0JCQlzcGVjLndpZHRoSGludCA9IDIwMDsKLQkJCXNwZWMuaGVpZ2h0SGludCA9IDIwMDsKLQkJCXNwZWMuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHNwZWMpOwotCQl9Ci0JCXZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCQl2aWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQotCQkJdmlld2VyLnNldElucHV0KHVzZXJJbnB1dC5nZXRDaG9pY2VzKCkpOwotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJLy8gVE9ETzogdHJlZVZpZXdlciBTb3J0ZXIgYW5kIEV4cGFuZC9Db2xsYXBzZQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFRhYmxlVmlld2VyCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgVXNlcklucHV0IHVzZXJJbnB1dCkgewotCQlUYWJsZVZpZXdlciB2aWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIFRleHQgY29udHJvbAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gdXNlcklucHV0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBVc2VySW5wdXQgdXNlcklucHV0KSB7Ci0JCWZpbmFsIFVzZXJJbnB1dCBsb2NhbGlucHV0ID0gdXNlcklucHV0OwotCQlmaW5hbCBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IHVzZXJJbnB1dC5nZXRWYWxpZGF0b3IoKTsKLQkJZmluYWwgVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCWlmICh1c2VySW5wdXQuZ2V0SW5wdXQoKSAhPSBudWxsKSB7Ci0JCQl0ZXh0LnNldFRleHQoKFN0cmluZykgdXNlcklucHV0LmdldElucHV0KCkpOwotCQl9Ci0JCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKHRydWUpOwotCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBlcnJvclR4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCWVycm9yVHh0ID0gdmFsaWRhdG9yLmlzVmFsaWQodGV4dC5nZXRUZXh0KCkpOwotCQkJCQlpZiAoZXJyb3JUeHQgIT0gbnVsbCAmJiBlcnJvclR4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkJCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7CQkJCQkKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWdsb2JhbEVycm9yVHh0ID0gZXJyb3JUeHQ7Ci0JCQkJfQotCQkJCWlmIChlcnJvclR4dCA9PSBudWxsIHx8IGVycm9yVHh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCQkJbG9jYWxpbnB1dC5zZXRJbnB1dCh0ZXh0LmdldFRleHQoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCQllcnJvclR4dCA9IHZhbGlkYXRvci5pc1ZhbGlkKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChlcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwkJCQkJCi0JCQkJCX0gZWxzZSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlnbG9iYWxFcnJvclR4dCA9IGVycm9yVHh0OwotCQkJCX0KLQkJCQlpZiAoZXJyb3JUeHQgPT0gbnVsbCB8fCBlcnJvclR4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWxvY2FsaW5wdXQuc2V0SW5wdXQodGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHRvIHNldElucHV0LCBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgaXQuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5wdXQoVXNlcklucHV0IGlucHV0LCBPYmplY3Qgb2JqKSB7Ci0JCWlucHV0LnNldElucHV0KG9iaik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIENvbWJvdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdXNlcklucHV0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgVXNlcklucHV0IHVzZXJJbnB1dCkgewotCQlmaW5hbCBVc2VySW5wdXQgbG9jYWxJbnB1dCA9IHVzZXJJbnB1dDsKLQkJZmluYWwgSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB1c2VySW5wdXQuZ2V0VmFsaWRhdG9yKCk7Ci0JCWZpbmFsIENvbWJvVmlld2VyIHZpZXdlciA9IG5ldyBDb21ib1ZpZXdlcihjb21wb3NpdGUpOwotCQl2aWV3ZXIuZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKAotCQkJCW5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWlmICh1c2VySW5wdXQuZ2V0TGFiZWxQcm92aWRlcigpICE9IG51bGwpIHsKLQkJCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIodXNlcklucHV0LmdldExhYmVsUHJvdmlkZXIoKSkpOwotCQl9Ci0JCUxpc3QgY2hvaWNlcyA9IHVzZXJJbnB1dC5nZXRDaG9pY2VzKCk7Ci0JCXZpZXdlci5zZXRJbnB1dChjaG9pY2VzKTsKLQkJaWYgKGNob2ljZXMgIT0gbnVsbCAmJiBjaG9pY2VzLnNpemUoKSA+IDApIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oY2hvaWNlcy5nZXQoMCkpKTsKLQkJCWxvY2FsSW5wdXQuc2V0SW5wdXQoY2hvaWNlcy5nZXQoMCkpOwotCQl9Ci0JCXZpZXdlci5nZXRDb21ibygpLmFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlTdHJpbmcgZXJyb3JUeHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGVkID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB2aWV3ZXIKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAodmFsaWRhdG9yID09IG51bGwgfHwgc2VsZWN0ZWQgPT0gbnVsbCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmlzVmFsaWQoc2VsZWN0ZWQuZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJCWVycm9yVHh0ID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGVycm9yVHh0ICE9IG51bGwgJiYgZXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkJCQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGlmIChnbG9iYWxFcnJvclR4dCAhPSBudWxsICYmIGdsb2JhbEVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQllcnJvckFyZWEuc2V0VGV4dChnbG9iYWxFcnJvclR4dCk7Ci0JCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJZXJyb3JBcmVhLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQllcnJvckFyZWEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlPYmplY3Qgb2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCVN0cmluZyBlcnJvclR4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdG9yLmlzVmFsaWQob2JqKTsKLQkJCQkJaWYgKHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCQkJZXJyb3JUeHQgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJZXJyb3JBcmVhLnNldFRleHQoZXJyb3JUeHQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGdsb2JhbEVycm9yVHh0ICE9IG51bGwgJiYgZ2xvYmFsRXJyb3JUeHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQllcnJvckFyZWEuc2V0VGV4dChnbG9iYWxFcnJvclR4dCk7Ci0JCQkJCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWVycm9yQXJlYS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoZXJyb3JUeHQgPT0gbnVsbCB8fCBlcnJvclR4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWxvY2FsSW5wdXQuc2V0SW5wdXQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBMYWJlbCBhbmQgVGV4dCBmb3IgbWVzc2FnZSBhcmVhLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQ29tcG9zaXRlIG1lc3NhZ2VBcmVhQ29tcCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCW1lc3NhZ2VBcmVhQ29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCW1lc3NhZ2VBcmVhQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCW1lc3NhZ2VBcmVhID0gbmV3IExhYmVsKG1lc3NhZ2VBcmVhQ29tcCwgU1dULldSQVApOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlQXJlYS5zZXRUZXh0KG1lc3NhZ2UpOwotCQl9Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLm1pbmltdW1XaWR0aCA9IDQwMDsKLQkJbWVzc2FnZUFyZWEuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWFwcGx5RGlhbG9nRm9udChtZXNzYWdlQXJlYSk7Ci0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChtZXNzYWdlQXJlYUNvbXAsIFNXVC5IT1JJWk9OVEFMIHwgU1dULlNFUEFSQVRPUik7Ci0JCUdyaWREYXRhIGdkMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZDEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShnZDEpOwotCQlyZXR1cm4gbWVzc2FnZUFyZWE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29tcG9zaXRlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQotCQkvLyBjcmVhdGUgbWVzc2FnZSBhcmVhCi0JCWNyZWF0ZU1lc3NhZ2VBcmVhKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIGRpYWxvZyBhcmVhCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBkaWFsb2dMYXlvdXQgPSBuZXcgR3JpZExheW91dCgyLCBmYWxzZSk7Ci0JCWRpYWxvZ0xheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJZGlhbG9nQXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGlhbG9nQXJlYS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCS8vIENyZWF0ZSBjb250cm9scyBiYXNlZCBvbiBVc2VySW5wdXRzCi0JCWlmICh1c2VySW5wdXRzICE9IG51bGwgJiYgdXNlcklucHV0cy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdXNlcklucHV0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVXNlcklucHV0KSB7Ci0JCQkJCVVzZXJJbnB1dCB1c2VySW5wdXQgPSAoVXNlcklucHV0KSBvYmplY3Q7Ci0KLQkJCQkJLy8gU3RvcmUgdGhlIHVzZXJJbnB1dCBpbiB0aGUgaGFzaG1hcCBmb3IgY2FuY2VsIGFjdGlvbi4KLQkJCQkJb2xkSW5mb0ZvckNhbmNlbC5wdXQodXNlcklucHV0LCB1c2VySW5wdXQuZ2V0SW5wdXQoKSk7Ci0KLQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQkJCQlsYWJlbC5zZXRUZXh0KHVzZXJJbnB1dC5nZXRMYWJlbCgpKTsKLQkJCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HKTsKLQkJCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJCQkJaWYgKHVzZXJJbnB1dC5nZXRUeXBlKCkgPT0gVXNlcklucHV0LlRFWFQpIHsKLQkJCQkJCWNyZWF0ZVRleHQoZGlhbG9nQXJlYSwgdXNlcklucHV0KTsKLQkJCQkJfSBlbHNlIGlmICh1c2VySW5wdXQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5TRUxFQ1RJT04pIHsKLQkJCQkJCWNyZWF0ZUNvbWJvVmlld2VyKGRpYWxvZ0FyZWEsIHVzZXJJbnB1dCk7Ci0JCQkJCX0KLQkJCQkJLy8gY3JlYXRlRW1wdHlMYWJlbChkaWFsb2dBcmVhLCAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3JlYXRlRXJyb3JBcmVhKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIEVycm9yIEFyZWEuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFcnJvckFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewkKLQkJQ29tcG9zaXRlIGVycm9yQXJlYUNvbXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJZXJyb3JBcmVhQ29tcC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZXJyb3JBcmVhQ29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCS8vIGNyZWF0ZSBibGFuayBsYWJlbAotLy8JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQotCQllcnJvckFyZWEgPSBuZXcgTGFiZWwoZXJyb3JBcmVhQ29tcCwgU1dULldSQVApOwotCQlyZWRDb2xvciA9IG5ldyBDb2xvcihudWxsLCBuZXcgUkdCKDI1NSwgMCwgMCkpOwotCQlpZihyZWRDb2xvciAhPSBudWxsKXsKLQkJCWVycm9yQXJlYS5zZXRGb3JlZ3JvdW5kKHJlZENvbG9yKTsKLQkJfQotCQkKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA4MDsKLQkJZXJyb3JBcmVhLnNldExheW91dERhdGEoZ2QpOwotCQlhcHBseURpYWxvZ0ZvbnQoZXJyb3JBcmVhKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY29uZmlndXJlU2hlbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQlpZiAodGhpcy50aXRsZSAhPSBudWxsKSB7Ci0JCQluZXdTaGVsbC5zZXRUZXh0KHRoaXMudGl0bGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJcmVzdWx0ID0gdHJ1ZTsJCQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NhbmNlbFByZXNzZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNhbmNlbFByZXNzZWQoKSB7Ci0JCWlmICh1c2VySW5wdXRzICE9IG51bGwgJiYgdXNlcklucHV0cy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdXNlcklucHV0cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVXNlcklucHV0KSB7Ci0JCQkJCVVzZXJJbnB1dCB1c2VySW5wdXQgPSAoVXNlcklucHV0KSBvYmplY3Q7Ci0JCQkJCXVzZXJJbnB1dC5zZXRJbnB1dChvbGRJbmZvRm9yQ2FuY2VsLmdldCh1c2VySW5wdXQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuY2FuY2VsUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdHMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYocmVkQ29sb3IgIT0gbnVsbCl7Ci0JCQlyZWRDb2xvci5kaXNwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZSBhIGVtcHR5IGxhYmVsLgotCSAqIAotCSAqIEBwYXJhbSBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3BhbgotCSAqLwotCS8vIHByaXZhdGUgdm9pZCBjcmVhdGVFbXB0eUxhYmVsKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBzcGFuKXsKLQkvLyBMYWJlbCBlbXB0eUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCS8vIGVtcHR5TGFiZWwuc2V0QmFja2dyb3VuZChDb2xvcnMuSU5IRVJJVEVEX0VMRU1FTlRfTEFCRUwpOwotCS8vIEdyaWREYXRhIGVtcHR5RGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCS8vIGVtcHR5TGFiZWwuc2V0VGV4dCgiIik7Ci0JLy8gZW1wdHlEYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JLy8gZW1wdHlEYXRhLmhvcml6b250YWxTcGFuID1zcGFuOwotCS8vIGVtcHR5RGF0YS5oZWlnaHRIaW50ID0gMzsKLQkvLyBlbXB0eUxhYmVsLnNldExheW91dERhdGEoZW1wdHlEYXRhKTsKLQkvLyB9Ci0JLyoqCi0JICogdmFsaWRhdGVzIHRoZSBpbnB1dCB3aXRoIGdpdmVuIFZhbGlkYXRvciBpbiBVc2VySW5wdXQuCi0JICovCi0JLy8gcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlKCkgewotCS8vIGZvciAoSXRlcmF0b3IgaXRlciA9IHVzZXJJbnB1dHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JLy8gVXNlcklucHV0IGVsZW1lbnQgPSAoVXNlcklucHV0KSBpdGVyLm5leHQoKTsKLQkvLyBJVmFsaWRhdG9yIHZhbGlkYXRvciA9IGVsZW1lbnQuZ2V0VmFsaWRhdG9yKCk7Ci0JLy8gaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JLy8gaWYgKGVsZW1lbnQuZ2V0VHlwZSgpID09IFVzZXJJbnB1dC5URVhUKSB7Ci0JLy8gZXJyb3JUeHQgKz0gdmFsaWRhdG9yCi0JLy8gLmlzVmFsaWQoZWxlbWVudC5nZXRJbnB1dCgpLnRvU3RyaW5nKCkpOwotCS8vIH0gZWxzZSB7Ci0JLy8gZXJyb3JUeHQgKz0gdmFsaWRhdG9yLmlzVmFsaWQoZWxlbWVudC5nZXRJbnB1dCgpKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyBlcnJvclR4dCA9ICJTeXN0ZW0gb3V0IHRlc3RpbmciOwotCS8vIGlmIChlcnJvclR4dCAhPSBudWxsICYmIGVycm9yVHh0Lmxlbmd0aCgpID4gMCkgewotCS8vIGVycm9yQXJlYS5zZXRUZXh0KGVycm9yVHh0KTsKLQkvLyBlcnJvckFyZWEuc2V0Rm9yZWdyb3VuZChDb2xvckNvbnN0YW50cy5yZWQpOwotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gcmV0dXJuIHRydWU7Ci0JLy8gfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2RpYWxvZ3MvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDAwNzZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9kaWFsb2dzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGRpYWxvZ3MgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MTM2YTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1vZGVscyB0aGUgPG5ld0xpYnJhcnlXaXphcmRQYWdlPiBlbGVtZW50IGluIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5saWJycmF5LnVpLm5ld0xpYnJhcnlXaXphcmRQYWdlcyIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCS8vIFRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLQkvLyBUaGUgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZUlkOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRpdGxlLgotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24oQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwKLQkJCVN0cmluZyB0eXBlSWQsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy50eXBlSWQgPSB0eXBlSWQ7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gdGhhdCBjb250cmlidXRlZCB0aGlzIHByb3ZpZGVyLgotCSAqLwotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIGNsYXNzIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUlkKCkgewotCQlyZXR1cm4gdHlwZUlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpemFyZCBwYWdlIHRpdGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlMi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZTIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlOWZiYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeU1haW5QYWdlMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuUmVjZW50bHlPcGVuZWRMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRoZSBuYW1lLCBicmllZiBkZXNjcmlwdGlvbiBhbmQKLSAqIHR5cGUgZm9yIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeU1haW5QYWdlMiBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgcGFnZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IE9wZW5MaWJyYXJ5TWFpblBhZ2UyLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSUQgPSAidHlwZUlkIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByb3RlY3RlZCBDb21ibyBuYW1lQ29tYm87Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmlUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvcGVuVW5saXN0ZWRMaWJyYXJ5ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uW10gcmFkaW9CdXR0b25zOwotCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlY2VudGx5T3BlbmVkTGlicmFyeT4gcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlY2VudGx5T3BlbmVkTGlicmFyeT4oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5TWFpblBhZ2UyKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlNYWluV2l6YXJkUGFnZV90aXRsZV8yKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9STUFMKTsKLQkJbmFtZUxhYmVsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm5hbWVMYWJlbF90ZXh0KTsKLQotCQluYW1lQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCW5hbWVDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkvLyBTZXQgdGhlIGNvbmZpZ3VyYXRpb24gbGlzdC4KLQkJTGlzdCBsaWJyYXJ5TGlzdCA9IGdldFJlY2VudGx5T3BlbmVkTGlicmFyaWVzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5TGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZWNlbnRseU9wZW5lZExpYnJhcnkgbGlicmFyeSA9IChSZWNlbnRseU9wZW5lZExpYnJhcnkpIGl0Lm5leHQoKTsKLQkJCXJlY2VudGx5T3BlbmVkTGlicmFyaWVzLnB1dChsaWJyYXJ5LmdldE5hbWUoKSwgbGlicmFyeSk7Ci0JCX0KLQkJU3RyaW5nW10gbGlicmFyeU5hbWVzID0gbmV3IFN0cmluZ1tyZWNlbnRseU9wZW5lZExpYnJhcmllcy5zaXplKCldOwotCQlyZWNlbnRseU9wZW5lZExpYnJhcmllcy5rZXlTZXQoKS50b0FycmF5KGxpYnJhcnlOYW1lcyk7Ci0JCW5hbWVDb21iby5zZXRJdGVtcyhsaWJyYXJ5TmFtZXMpOwotCi0JCUxhYmVsIHVyaUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCXVyaUxhYmVsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLnVyaUxhYmVsX3RleHQpOwotCi0JCXVyaVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl1cmlUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl1cmlUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94Ci0JCQkJLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveF90ZXh0KTsKLQkJb3BlblVubGlzdGVkTGlicmFyeUNoZWNrYm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWREYXRhKSBvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3guZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgbGlicmFyeVR5cGVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT1JNQUwpOwotCQlsaWJyYXJ5VHlwZUxhYmVsLnNldFRleHQoTGlicmFyeVVJUmVzb3VyY2VzLmxpYnJhcnlUeXBlTGFiZWxfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIHR5cGVDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PUk1BTCk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXR5cGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTWFwIHR5cGVzID0gTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeVR5cGVzKCk7Ci0JCXJhZGlvQnV0dG9ucyA9IG5ldyBCdXR0b25bdHlwZXMuc2l6ZSgpXTsKLQkJaW50IHJhZGlvQnV0dG9uSW5kZXggPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdHlwZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHR5cGVJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IChTdHJpbmcpIHR5cGVzLmdldCh0eXBlSWQpOwotCQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbih0eXBlQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQkJcmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyYWRpb0J1dHRvbi5zZXRUZXh0KHR5cGVOYW1lKTsKLQkJCXJhZGlvQnV0dG9uLnNldERhdGEoVFlQRV9JRCwgdHlwZUlkKTsKLQkJCXJhZGlvQnV0dG9uc1tyYWRpb0J1dHRvbkluZGV4KytdID0gcmFkaW9CdXR0b247Ci0JCX0KLQotCQlpZiAocmFkaW9CdXR0b25zLmxlbmd0aCA+IDApIHsKLQkJCXJhZGlvQnV0dG9uc1swXS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjZ2V0TmV4dFBhZ2UoKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZSgpIHsKLQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5Ci0JCQkJLmdldEluc3RhbmNlKCkuZ2V0V2l6YXJkUGFnZShnZXRMaWJyYXJ5VHlwZSgpKTsKLQkJaWYgKHdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJd2l6YXJkUGFnZS5vbkVudGVyUGFnZShnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJfQotCQlpZiAoIW9wZW5Vbmxpc3RlZExpYnJhcnkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB3aXphcmRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU5hbWUoKS5sZW5ndGgoKSA+IDAgfHwgb3BlblVubGlzdGVkTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGxpc3RlbmVycyB0byB0aGUgd2l6YXJkIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCW5hbWVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCi0JCW9wZW5Vbmxpc3RlZExpYnJhcnlDaGVja2JveAotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCW9wZW5Vbmxpc3RlZExpYnJhcnkgPSBvcGVuVW5saXN0ZWRMaWJyYXJ5Q2hlY2tib3gKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBtZXRob2QgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VVJJKCkgewotCQlSZWNlbnRseU9wZW5lZExpYnJhcnkgbGlicmFyeSA9IChSZWNlbnRseU9wZW5lZExpYnJhcnkpIHJlY2VudGx5T3BlbmVkTGlicmFyaWVzCi0JCQkJLmdldChnZXRMaWJyYXJ5TmFtZSgpKTsKLQkJcmV0dXJuIGxpYnJhcnkuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXRoIG9mIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCVJlY2VudGx5T3BlbmVkTGlicmFyeSBsaWJyYXJ5ID0gKFJlY2VudGx5T3BlbmVkTGlicmFyeSkgcmVjZW50bHlPcGVuZWRMaWJyYXJpZXMKLQkJCQkuZ2V0KGdldExpYnJhcnlOYW1lKCkpOwotCQlyZXR1cm4gbGlicmFyeS5nZXRQYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgb3BlbiB1bmxpc3RlZCBtZXRob2QgbGlicnJheSBvcHRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcGVuVW5saXN0ZWRMaWJyYXJ5KCkgewotCQlyZXR1cm4gb3BlblVubGlzdGVkTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1c2VyIHNlbGVjdGVkIG1ldGhvZCBsaWJyYXJ5IHR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaWJyYXJ5VHlwZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYWRpb0J1dHRvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1dHRvbiByYWRpb0J1dHRvbiA9IHJhZGlvQnV0dG9uc1tpXTsKLQkJCWlmIChyYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbi5nZXREYXRhKFRZUEVfSUQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nKSByYWRpb0J1dHRvbnNbMF0uZ2V0RGF0YShUWVBFX0lEKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgbGlzdCBvZiByZWNlbnRseSBvcGVuZWQgbWV0aG9kIGxpYnJhcmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5SZWNlbnRseU9wZW5lZExpYnJhcnk8L2NvZGU+IG9iamVjdHMKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3QgZ2V0UmVjZW50bHlPcGVuZWRMaWJyYXJpZXMoKSB7Ci0JCUxpc3QgbGlicmFyeVVSSXMgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRPcGVuTGlicmFyeVVSSXNMaXN0KCk7Ci0JCUxpc3Q8UmVjZW50bHlPcGVuZWRMaWJyYXJ5PiBsaWJyYXJpZXMgPSBuZXcgQXJyYXlMaXN0PFJlY2VudGx5T3BlbmVkTGlicmFyeT4oKTsKLQkJaWYgKGxpYnJhcnlVUklzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5VVJJcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGxpYnJhcnlVUkkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJbGlicmFyaWVzLmFkZChuZXcgUmVjZW50bHlPcGVuZWRMaWJyYXJ5KGxpYnJhcnlVUkkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlicmFyaWVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzZTFkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHMuT3BlbkxpYnJhcnlXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQSB3aXphcmQgdGhhdCBndWlkZXMgdGhlIHVzZXIgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeVdpemFyZDIgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8qKgotCSAqIFRoZSB3aXphcmQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0lEID0gT3BlbkxpYnJhcnlXaXphcmQyLmNsYXNzLmdldE5hbWUoKTsKLQotCS8vIFRoZSBtYWluIHdpemFyZCBwYWdlLgotCXByaXZhdGUgT3BlbkxpYnJhcnlNYWluUGFnZTIgbWFpblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZDIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZXRXaW5kb3dUaXRsZShMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCW1haW5QYWdlID0gbmV3IE9wZW5MaWJyYXJ5TWFpblBhZ2UyKCk7Ci0JCWFkZFBhZ2UobWFpblBhZ2UpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRMaWJyYXJ5VHlwZXMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcGVyc2lzdGVuY2VJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBwYWdlSWQgPSBwZXJzaXN0ZW5jZUlkICsgIlBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCQlPcGVuTGlicmFyeVdpemFyZFBhZ2UgcGFnZSA9IE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkKLQkJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlV2l6YXJkUGFnZShwYWdlSWQsIHBlcnNpc3RlbmNlSWQpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCXBhZ2Uuc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoImZ1bGwvd2l6YmFuL09wZW4uZ2lmIikpOyAvLyROT04tTkxTLTEkCQkJCQkKLQkJCQlhZGRQYWdlKHBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQkJcGFnZUNvbnRhaW5lci5nZXRTaGVsbCgpLnNldEltYWdlKAotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoCi0JCQkJCQkiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5LmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjYW5GaW5pc2goKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJaWYgKG1haW5QYWdlLmlzUGFnZUNvbXBsZXRlKCkgJiYgIW1haW5QYWdlLmlzT3BlblVubGlzdGVkTGlicmFyeSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlJV2l6YXJkUGFnZVtdIHBhZ2VzID0gZ2V0UGFnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFwYWdlc1tpXS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpICE9IG1haW5QYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlTdHJpbmcgdHlwZSA9IG1haW5QYWdlLmdldExpYnJhcnlUeXBlKCk7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSBwYWdlID0gT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFdpemFyZFBhZ2UodHlwZSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCQlpZiAobWFpblBhZ2UuaXNPcGVuVW5saXN0ZWRMaWJyYXJ5KCkpIHsKLQkJCQlNYXAgb3B0aW9ucyA9IHBhZ2UuZ2V0U2VsZWN0aW9ucygpOwotCQkJCXBhdGggPSAoU3RyaW5nKSBvcHRpb25zLmdldChYTUlMaWJyYXJ5TWFuYWdlci5BUkdfTElCUkFSWV9QQVRIKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGF0aCA9IG1haW5QYWdlLmdldExpYnJhcnlQYXRoKCk7Ci0JCQl9Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KHBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQkJaWYgKCFoYW5kbGVUb29sVmVyc2lvbihwYXRoLCBudWxsKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmIChMaWJyYXJ5VUlNYW5hZ2VyLmdldEluc3RhbmNlKCkub3BlbkxpYnJhcnkocGF0aCkpIHsKLQkJCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJCQkuY29udGFpbnNQbHVnaW5PckNvbmZpZ1NwZWNFeHBvcnRGaWxlKHBhdGgpKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0JCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfcmVhc29uNCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTXNnRGlhbG9nIG1zZ0RpYWxvZyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCk7Ci0JCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCQkJCU5MUwotCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlEaWFsb2dfbmV3TGlicmFyeV90ZXh0LAotCQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCQkJCQlpZiAoIXJjKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUxpYnJhcnkocGF0aCkpIHsKLQkJCQkJCWFkZFJlY2VudGx5T3BlbmVkTGlicmFyeSgpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmV3bHkgb3BlbmVkIG9yIGNyZWF0ZWQgbWV0aG9kIGxpYnJhcnkgdG8gdGhlIHJlY2VudGx5IG9wZW5lZAotCSAqIG1ldGhvZCBsaWJyYXJpZXMgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWNlbnRseU9wZW5lZExpYnJhcnkoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxpYnJhcnlVUkkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCQlsaWJyYXJ5KS5nZXRNZXRob2RMaWJyYXJ5VVJJKCkudG9TdHJpbmcoKTsKLQkJCUxpYnJhcnlVSVByZWZlcmVuY2VzLmFkZE9wZW5MaWJyYXJ5VVJJKGxpYnJhcnlVUkkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgYW5kIGhhbmRsZSB0b29sIHZlcnNpb24gZGlmZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlVG9vbFZlcnNpb24oU3RyaW5nIHBhdGgsCi0JCQlVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCVN0cmluZyBsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSTsKLQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCAmJiBjYWxsZXJJbmZvLmdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSkgewotCQkJbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJfQotCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbAotCQkJCS5jaGVja0xpYnJhcnlWZXJzaW9uKG5ldyBGaWxlKHBhdGgsIGxpYlhtaSkpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSwKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiB9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpIH0pOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5zZXRFcnJvck1zZyhtZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGgsIGxpYlhtaSwgaW5mbykpIHsKLQkJCWlmIChpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pCi0JCQkJCSYmICFMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCQljYWxsZXJJbmZvLmNvcHlMaWJyYXJ5KCk7Ci0JCQkJaWYgKGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJcGF0aCA9IGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKQotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIUxpYnJhcnlVSU1hbmFnZXIudXBncmFkZUxpYnJhcnkocGF0aCwgY2FsbGVySW5mbykpIHsKLQkJCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCS8vIGNhbGxlckluZm8uc2V0RXJyb3JNc2coInVwZ3JhZGVMaWJyYXJ5IEZhaWxlZCEiKTsgLy9uZWVkCi0JCQkJCS8vIG5ldyByZXNvdXJjZSBzdHJpbmcKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VwZ3JhZGVMaWJyYXJ5KFVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsKLQkJcmV0dXJuIFVwZ3JhZGVDYWxsZXJJbmZvLmlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvaW50ZXJuYWwvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzlmYmM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogTW9kZWxzIHRoZSA8b3BlbkxpYnJhcnlXaXphcmRQYWdlPiBlbGVtZW50IGluIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5saWJycmF5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCS8vIFRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvLyBUaGUgd2l6YXJkIHBhZ2UgY2xhc3MgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0KLQkvLyBUaGUgbGlicmFyeSB0eXBlIGlkZW50aWZpZXIuCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZUlkOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIHRpdGxlLgotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLy8gVGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uLgotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCXRoaXMudHlwZUlkID0gdHlwZUlkOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhpcyBwcm92aWRlci4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpIHsKLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aXphcmQgcGFnZSB0aXRsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2l6YXJkIHBhZ2UgZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL2ludGVybmFsL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjQ0NTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9pbnRlcm5hbC93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkcy5PcGVuTGlicmFyeVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBPcGVuIExpYnJhcnkgd2l6YXJkIHBhZ2VzIGRlZmluZWQgdmlhIHRoZQotICogIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gIm9wZW5MaWJyYXJ5V2l6YXJkUGFnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgaW5zdGFuY2UgPSBuZXcgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSgpOwotCi0JLy8gQSBtYXAgb2Ygd2l6YXJkIHBhZ2UgcHJvdmlkZXJzLgotCXByaXZhdGUgTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uPiB3aXphcmRQYWdlUHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24+KCk7Ci0KLQkvLyBBIGxpc3Qgb2Ygd2l6YXJkIHBhZ2UgaW5zdGFuY2VzLgotCXByaXZhdGUgTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlPiB3aXphcmRQYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT3BlbkxpYnJhcnlXaXphcmRQYWdlPigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcGVuTGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgdHlwZUlkID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHRpdGxlID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCQkJCSYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlpZiAoIXdpemFyZFBhZ2VQcm92aWRlcnMuY29udGFpbnNLZXkodHlwZUlkKSkgewotCQkJCQkJCQlPcGVuTGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSBuZXcgT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJCQkJCQkJCWJ1bmRsZSwgY2xhc3NOYW1lLCB0eXBlSWQsIHRpdGxlLAotCQkJCQkJCQkJCWRlc2NyaXB0aW9uKTsKLQkJCQkJCQkJd2l6YXJkUGFnZVByb3ZpZGVycy5wdXQodHlwZUlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+T3BlbkxpYnJhcnlXaXphcmRQYWdlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgY3JlYXRlV2l6YXJkUGFnZShTdHJpbmcgcGFnZUlkLCBTdHJpbmcgdHlwZUlkKSB7Ci0JCU9wZW5MaWJyYXJ5V2l6YXJkUGFnZSB3aXphcmRQYWdlID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRQYWdlOwotCQl9Ci0KLQkJT3BlbkxpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uIHByb3ZpZGVyID0gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbikgd2l6YXJkUGFnZVByb3ZpZGVycwotCQkJCS5nZXQodHlwZUlkKTsKLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBwcm92aWRlci5nZXRCdW5kbGUoKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBwcm92aWRlci5nZXRDbGFzc05hbWUoKTsKLQkJCUNsYXNzIHdpemFyZFBhZ2VDbGFzczsKLQkJCUNsYXNzW10gYXJnQ2xhc3MgPSBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcyB9OwotCQkJT2JqZWN0W10gYXJnVmFsdWUgPSBuZXcgT2JqZWN0W10geyBwYWdlSWQgfTsKLQkJCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yOwotCQkJdHJ5IHsKLQkJCQl3aXphcmRQYWdlQ2xhc3MgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJY29uc3RydWN0b3IgPSB3aXphcmRQYWdlQ2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJnQ2xhc3MpOwotCQkJCXdpemFyZFBhZ2UgPSAoT3BlbkxpYnJhcnlXaXphcmRQYWdlKSBjb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKGFyZ1ZhbHVlKTsKLQkJCQl3aXphcmRQYWdlLnNldFRpdGxlKHByb3ZpZGVyLmdldFRpdGxlKCkpOwotCQkJCXdpemFyZFBhZ2Uuc2V0RGVzY3JpcHRpb24ocHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJd2l6YXJkUGFnZXMucHV0KHR5cGVJZCwgd2l6YXJkUGFnZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvciBjYWNoZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT3BlbkxpYnJhcnlXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoU3RyaW5nIHR5cGVJZCkgewotCQlyZXR1cm4gKE9wZW5MaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMuZ2V0KHR5cGVJZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzMmRlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIFVJIHN1cHBwb3J0IGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9MaWJyYXJ5VUlQcmVmZXJlbmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlVSVByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjA2YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL0xpYnJhcnlVSVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuRGVmYXVsdFZhbHVlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBMaWJyYXJ5IFVJIHByZWZlcmVuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlVSVByZWZlcmVuY2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfUEFUSCA9ICJkZWZhdWx0TGlicmFyeVBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTElCUkFSWV9QQVRIID0gInNhdmVkTGlicmFyeVBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQgPSAicHVibGlzaFVub3BlbkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NXSVRDSF9DT05GSUcgPSAic3dpdGNoQ29uZmlndXJhdGlvbk9uUHJvY2Vzc0FjdGl2YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiA9ICJwdWJsaXNoQWN0aXZpdHlEaWFncmFtZm9yQWN0aXZpdHlFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fU0hPUlRfTkFNRSA9ICJhcHBuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19MSUJSQVJZX1BBVEhTID0gIm5ld0xpYnJhcnlQYXRocyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0xJQlJBUllfUEFUSFMgPSAib3BlbkxpYnJhcnlQYXRocyI7IC8vJE5PTi1OTFMtMSQJCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fTElCUkFSWV9VUklTID0gIm9wZW5MaWJyYXJ5VVJJcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwgPSAid29ya19icmVha2Rvd25lbGVtZW50X29wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9NVUxUSVBMRV9PQ0NVUlJBTkNFUyA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfbXVsdGlwbGVfb2NjdXJyYW5jZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19CUkVBS0RPV05FTEVNRU5UX1BMQU5ORUQgPSAid29ya19icmVha2Rvd25lbGVtZW50X3BsYW5uZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19CUkVBS0RPV05FTEVNRU5UX0VWRU5UX0RSSVZFTiA9ICJ3b3JrX2JyZWFrZG93bmVsZW1lbnRfZXZlbnRfZHJpdmVuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9PTkdPSU5HID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9tdWx0aXBsZV9vbmdvaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfQlJFQUtET1dORUxFTUVOVF9SRVBFQVRBQkxFID0gIndvcmtfYnJlYWtkb3duZWxlbWVudF9yZXBlYXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfT1BUSU9OQUwgPSAiZGVzY3JpcHRvcl9vcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX01VTFRJUExFX09DQ1VSUkFOQ0VTID0gImRlc2NyaXB0b3JfbXVsdGlwbGVfb2NjdXJyYW5jZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRPUl9QTEFOTkVEID0gImRlc2NyaXB0b3JfcGxhbm5lZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX0VWRU5UX0RSSVZFTiA9ICJkZXNjcmlwdG9yX2V2ZW50X2RyaXZlbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX09OR09JTkcgPSAiZGVzY3JpcHRvcl9tdWx0aXBsZV9vbmdvaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfUkVQRUFUQUJMRSA9ICJkZXNjcmlwdG9yX3JlcGVhdGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MSUJSQVJZX0ZPTERFUl9OQU1FID0gIk1ldGhvZCBMaWJyYXJpZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdExpYnJhcnlQYXRoID0gbnVsbDsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERUZBVUxUX0xJQlJBUllfUEFUSCwKLQkJCQlnZXRJbml0aWFsRGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFNBVkVEX0xJQlJBUllfUEFUSCwgIiIpOyAvLyROT04tTkxTLTEkCQotCQlwcmVmU3RvcmUKLQkJCQkuc2V0RGVmYXVsdChQUkVGX1NXSVRDSF9DT05GSUcsIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KE5FV19MSUJSQVJZX1BBVEhTLCAiIik7IC8vJE5PTi1OTFMtMSQJCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KE9QRU5fTElCUkFSWV9QQVRIUywgIiIpOyAvLyROT04tTkxTLTEkCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KE9QRU5fTElCUkFSWV9VUklTLCAiIik7IC8vJE5PTi1OTFMtMSQJCi0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFdPUktfQlJFQUtET1dORUxFTUVOVF9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUExBTk5FRCwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4sIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX09OR09JTkcsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV09SS19CUkVBS0RPV05FTEVNRU5UX1JFUEVBVEFCTEUsIGZhbHNlKTsKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX09QVElPTkFMLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfTVVMVElQTEVfT0NDVVJSQU5DRVMsIGZhbHNlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVTQ1JJUFRPUl9QTEFOTkVELCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfRVZFTlRfRFJJVkVOLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERFU0NSSVBUT1JfT05HT0lORywgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChERVNDUklQVE9SX1JFUEVBVEFCTEUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbml0aWFsIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluaXRpYWxEZWZhdWx0TGlicmFyeVBhdGgoKSB7Ci0JCWlmIChkZWZhdWx0TGlicmFyeVBhdGggPT0gbnVsbCkgewotCQkJZGVmYXVsdExpYnJhcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX0xJQlJBUllfRk9MREVSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRMaWJyYXJ5UGF0aCA9IGRlZmF1bHRMaWJyYXJ5UGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfTElCUkFSWV9GT0xERVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdExpYnJhcnlQYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoREVGQVVMVF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgbWV0aG9kIGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0TGlicmFyeVBhdGgoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERUZBVUxUX0xJQlJBUllfUEFUSCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChib29sZWFuIGVuYWJsZWQpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCBlbmFibGVkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCk7Ci0JfQotCi0JLyoqCi0JICogU2V0dGVyIG1ldGhvZCBmb3IgUHVibGlzaCBBY3Rpdml0eSBEaWFncmFtIGZvciBBY3Rpdml0eSBFeHRlbnNpb24sCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04sIGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIGdldHRlciBtZXRob2QgZm9yIFB1Ymxpc2ggQWN0aXZpdHkgRGlhZ3JhbSBmb3IgQWN0aXZpdHkgRXh0ZW5zaW9uIGZsYWcKLQkgKiBmcm9tIHByZWZlcmVuY2Ugc3RvcmUsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9BRF9GT1JfQUNUSVZJVFlfRVhURU5TSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIHN0b3JlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gY291bGQgYmUgQUxXQVlTLCBORVZFUiwgUFJPTVBUCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3dpdGNoQ29uZmlnKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQUkVGX1NXSVRDSF9DT05GSUcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHN3aXRjaCBjb25maWd1cmF0aW9uIHZhbHVlIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFZhbHVlIGNvdWxkIGJlIEFMV0FZUywgTkVWRVIsIFBST01QVAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTd2l0Y2hDb25maWcoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQUkVGX1NXSVRDSF9DT05GSUcsIHZhbHVlKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHN3aXRjaCBjb25maWd1cmF0aW9uIHByZWZlcmVuY2Uga2V5Ci0JICogQHJldHVybiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTd2l0Y2hDb25maWdQcmVmZXJlbmNlS2V5KCkJewotCQlyZXR1cm4gUFJFRl9TV0lUQ0hfQ09ORklHOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIE1ldGhvZCBMaWJyYXJ5IHBhdGggdGhhdCB3YXMgc2F2ZWQgaW4gYSBwcmV2aW91cyBzZXNzaW9uLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHNhdmVkIGxpYnJhcnkgcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTYXZlZExpYnJhcnlQYXRoKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhTQVZFRF9MSUJSQVJZX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGEgTWV0aG9kIExpYnJhcnkgcGF0aCB0byB0aGUgTGlicmFyeSBVSSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBsaWJQYXRoCi0JICogICAgICAgICAgICBQYXRoIHRvIGEgTWV0aG9kIExpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNhdmVkTGlicmFyeVBhdGgoU3RyaW5nIGxpYlBhdGgpIHsKLQkJU3RyaW5nIHBhdGggPSBsaWJQYXRoOwotCQlpZiAocGF0aC5lbmRzV2l0aChNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUUpKSB7Ci0JCQlwYXRoID0gRmlsZVV0aWwuZ2V0UGFyZW50RGlyZWN0b3J5KHBhdGgpOwotCQl9Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHNob3J0IG5hbWUgcGFzc2VkIGluIHRoZSBtYWluIGZlYXR1cmUncwotCSAqIHBsdWdpbl9jdXN0b21pemF0aW9uLmluaS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwYXNzZWQtaW4gYXBwbGljYXRpb24gc2hvcnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQVBQTElDQVRJT05fU0hPUlRfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXROZXdMaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBORVdfTElCUkFSWV9QQVRIUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV3IGxpYnJhcnkgcGF0aHMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgbGlicmFyeSBwYXRocwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE5ld0xpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtZXRob2QgbGlicmFyeSBwYXRoIHRvIHRoZSBuZXcgbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkTmV3TGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgTkVXX0xJQlJBUllfUEFUSFMsIHBhdGgsCi0JCQkJZ2V0RGVmYXVsdExpYnJhcnlQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGxpYnJhcnkgcGF0aHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5UGF0aHMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRTdHJpbmdWYWx1ZXMocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfUEFUSFMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wZW4gbGlicmFyeSBwYXRocyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IHBhdGhzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0T3BlbkxpYnJhcnlQYXRoc0xpc3QoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlVXRpbC5nZXRMaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWV0aG9kIGxpYnJhcnkgcGF0aCB0byB0aGUgb3BlbiBsaWJyYXJ5IHBhdGhzIHByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJUHJlZmVyZW5jZVV0aWwuYWRkVG9MaXN0KHByZWZTdG9yZSwgT1BFTl9MSUJSQVJZX1BBVEhTLCBwYXRoLAotCQkJCWdldERlZmF1bHRMaWJyYXJ5UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE9wZW5MaWJyYXJ5VVJJcygpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldFN0cmluZ1ZhbHVlcyhwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcGVuIGxpYnJhcnkgVVJJcyBwcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG1ldGhvZCBsaWJyYXJ5IFVSSXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3BlbkxpYnJhcnlVUklzTGlzdCgpIHsKLQkJcmV0dXJuIFByZWZlcmVuY2VVdGlsLmdldExpc3QocHJlZlN0b3JlLCBPUEVOX0xJQlJBUllfVVJJUyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGhvZCBsaWJyYXJ5IFVSSSB0byB0aGUgb3BlbiBsaWJyYXJ5IFVSSXMgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRPcGVuTGlicmFyeVVSSShTdHJpbmcgdXJpKSB7Ci0JCVByZWZlcmVuY2VVdGlsLmFkZFRvTGlzdChwcmVmU3RvcmUsIE9QRU5fTElCUkFSWV9VUklTLCB1cmkpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgYWxsIHByZWZlcmVuY2VzCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE9wdGlvbmFsKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oV09SS19CUkVBS0RPV05FTEVNRU5UX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShXT1JLX0JSRUFLRE9XTkVMRU1FTlRfT1BUSU9OQUwsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG11bHRpcGxlIG9jY3VycmFuY2VzIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbgotCSAqIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfTVVMVElQTEVfT0NDVVJSQU5DRVMpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBNdWx0aXBsZSBPY2N1cnJhbmNlcyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX01VTFRJUExFX09DQ1VSUkFOQ0VTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwbGFubmVkIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRXb3JrQnJlYWtEb3duRWxlbWVudFBsYW5uZWQoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihXT1JLX0JSRUFLRE9XTkVMRU1FTlRfUExBTk5FRCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdmFsdWUgZm9yIFBsYW5uZWQgZmVhdHVyZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya0JyZWFrZG93bkVsZW1lbnRQbGFubmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4pOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBFdmVudERyaXZlbiBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudEV2ZW50RHJpdmVuKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFdPUktfQlJFQUtET1dORUxFTUVOVF9FVkVOVF9EUklWRU4sIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIE9uZ29pbmcgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50T25nb2luZygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudE9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX09OR09JTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFJlcGVhdGFibGUgZmVhdHVyZSB2YWx1ZSBvZiB3b3JrIGJyZWFrZG93biBlbGVtZW50IGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFdPUktfQlJFQUtET1dORUxFTUVOVF9SRVBFQVRBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUmVwZWF0YWJsZSBmZWF0dXJlIG9mIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQgaW4KLQkgKiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXb3JrQnJlYWtkb3duRWxlbWVudFJlcGVhdGFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoV09SS19CUkVBS0RPV05FTEVNRU5UX1JFUEVBVEFCTEUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIGZlYXR1cmUgdmFsdWUgb2Ygd29yayBicmVha2Rvd24gZWxlbWVudCBpbiBwcmVmZXJlbmNlCi0JICogc3RvcmUKLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIC0gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZXNjcmlwdG9yT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX09QVElPTkFMKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT3B0aW9uYWwgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JPcHRpb25hbChib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX09QVElPTkFMLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBtdWx0aXBsZSBvY2N1cnJhbmNlcyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX01VTFRJUExFX09DQ1VSUkFOQ0VTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgTXVsdGlwbGUgT2NjdXJyYW5jZXMgZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2UKLQkgKiBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck11bHRpcGxlT2NjdXJyYW5jZXMoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9NVUxUSVBMRV9PQ0NVUlJBTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgcGxhbm5lZCBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JQbGFubmVkKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9QTEFOTkVEKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgUGxhbm5lZCBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvclBsYW5uZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9QTEFOTkVELCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBFdmVudERyaXZlbiBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JFdmVudERyaXZlbigpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKERFU0NSSVBUT1JfRVZFTlRfRFJJVkVOKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgRXZlbnREcml2ZW4gZmVhdHVyZSBvZiBkZXNjcmlwdG9yIGluIHByZWZlcmVuY2Ugc3RvcmUKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgYm9vbGVhbiB0cnVlL2ZhbHNlCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0b3JFdmVudERyaXZlbihib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX0VWRU5UX0RSSVZFTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgT25nb2luZyBmZWF0dXJlIHZhbHVlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgLSBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldERlc2NyaXB0b3JPbmdvaW5nKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oREVTQ1JJUFRPUl9PTkdPSU5HKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB2YWx1ZSBmb3IgT25nb2luZyBmZWF0dXJlIG9mIGRlc2NyaXB0b3IgaW4gcHJlZmVyZW5jZSBzdG9yZQotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZSAtCi0JICogICAgICAgICAgICBib29sZWFuIHRydWUvZmFsc2UKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRvck9uZ29pbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoREVTQ1JJUFRPUl9PTkdPSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBSZXBlYXRhYmxlIGZlYXR1cmUgdmFsdWUgb2YgZGVzY3JpcHRvciBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHJldHVybiB2YWx1ZSAtIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RGVzY3JpcHRvclJlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihERVNDUklQVE9SX1JFUEVBVEFCTEUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHZhbHVlIGZvciBSZXBlYXRhYmxlIGZlYXR1cmUgb2YgZGVzY3JpcHRvciBpbiBwcmVmZXJlbmNlIHN0b3JlCi0JICogCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIGJvb2xlYW4gdHJ1ZS9mYWxzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXNjcmlwdG9yUmVwZWF0YWJsZShib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShERVNDUklQVE9SX1JFUEVBVEFCTEUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlEZWZhdWx0VmFsdWVzRm9yQnJlYWtkb3duRWxlbWVudEF0dHJpYnV0ZXMoKSB7Ci0JCU9iamVjdFtdIG5vbkRlc2NyaXB0b3JEZWZhdWx0VmFsdWVEZWZzID0gewotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudEV2ZW50RHJpdmVuKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRNdWx0aXBsZU9jY3VycmFuY2VzKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0V29ya0JyZWFrRG93bkVsZW1lbnRPbmdvaW5nKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtEb3duRWxlbWVudE9wdGlvbmFsKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50UGxhbm5lZCgpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldFdvcmtCcmVha0Rvd25FbGVtZW50UmVwZWF0YWJsZSgpKSB9IH07Ci0JCUVDbGFzc1tdIG5vbkRlc2NyaXB0b3JUeXBlcyA9IHsgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhhc2UoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpIH07Ci0KLQkJT2JqZWN0W10gZGVzY3JpcHRvckRlZmF1bHRWYWx1ZURlZnMgPSB7Ci0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JFdmVudERyaXZlbigpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JNdWx0aXBsZU9jY3VycmFuY2VzKCkpIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwKLQkJCQkJCUJvb2xlYW4udmFsdWVPZihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCQkJCQkuZ2V0RGVzY3JpcHRvck9uZ29pbmcoKSkgfSwKLQkJCQluZXcgT2JqZWN0W10gewotCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JPcHRpb25hbCgpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLAotCQkJCQkJQm9vbGVhbi52YWx1ZU9mKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkJCS5nZXREZXNjcmlwdG9yUGxhbm5lZCgpKSB9LAotCQkJCW5ldyBPYmplY3RbXSB7Ci0JCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJCQlCb29sZWFuLnZhbHVlT2YoTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJCQkJLmdldERlc2NyaXB0b3JSZXBlYXRhYmxlKCkpIH0gfTsKLQkJRUNsYXNzW10gZGVzY3JpcHRvclR5cGVzID0geyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkgfTsKLQotCQlPYmplY3RbXSBkZWZhdWx0VmFsdWVEZWZzID0gewotCQkJCW5ldyBPYmplY3RbXSB7IG5vbkRlc2NyaXB0b3JUeXBlcywKLQkJCQkJCW5vbkRlc2NyaXB0b3JEZWZhdWx0VmFsdWVEZWZzIH0sCi0JCQkJbmV3IE9iamVjdFtdIHsgZGVzY3JpcHRvclR5cGVzLCBkZXNjcmlwdG9yRGVmYXVsdFZhbHVlRGVmcyB9IH07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0VmFsdWVEZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPYmplY3RbXSBkZWZhdWx0VmFsdWVEZWYgPSAoT2JqZWN0W10pIGRlZmF1bHRWYWx1ZURlZnNbaV07Ci0JCQlFQ2xhc3NbXSB0eXBlcyA9IChFQ2xhc3NbXSkgZGVmYXVsdFZhbHVlRGVmWzBdOwotCQkJT2JqZWN0W10gZmVhdHVyZURlZmF1bHRWYWx1ZURlZnMgPSAoT2JqZWN0W10pIGRlZmF1bHRWYWx1ZURlZlsxXTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZmVhdHVyZURlZmF1bHRWYWx1ZURlZnMubGVuZ3RoOyBrKyspIHsKLQkJCQlPYmplY3RbXSBmZWF0dXJlRGVmYXVsdFZhbHVlID0gKE9iamVjdFtdKSBmZWF0dXJlRGVmYXVsdFZhbHVlRGVmc1trXTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVEZWZhdWx0VmFsdWVbMF07Ci0JCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IGZlYXR1cmVEZWZhdWx0VmFsdWVbMV07Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlcy5sZW5ndGg7IGorKykgewotCQkJCQlFQ2xhc3MgdHlwZSA9IHR5cGVzW2pdOwotCQkJCQlEZWZhdWx0VmFsdWVNYW5hZ2VyLklOU1RBTkNFLnNldERlZmF1bHRWYWx1ZSh0eXBlLCBmZWF0dXJlLAotCQkJCQkJCWRlZmF1bHRWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL1JlY2VudGx5T3BlbmVkTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL1JlY2VudGx5T3BlbmVkTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWVhMzE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcmVmZXJlbmNlcy9SZWNlbnRseU9wZW5lZExpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci0KLS8qKgotICogTW9kZWxzIGEgcmVjZW50bHkgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5IHByZWZlcmVuY2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICovCi1wdWJsaWMgY2xhc3MgUmVjZW50bHlPcGVuZWRMaWJyYXJ5IHsKLQotCXByaXZhdGUgVVJJIHVyaTsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgU3RyaW5nIHBhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSZWNlbnRseU9wZW5lZExpYnJhcnkoU3RyaW5nIHVyaSkgewotCQl0cnkgewotCQkJdGhpcy51cmkgPSBuZXcgVVJJKHVyaSk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLnVyaSk7Ci0JCQl0aGlzLm5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJCXRoaXMucGF0aCA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgVVJJLgotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VVJJKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gcGF0aDsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4NThhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciBtYW5hZ2luZyBhIG1ldGhvZCBsaWJyYXJ5LgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvcHJvdmlkZXJzL0RlbGVnYXRlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDBmYjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS9wcm92aWRlcnMvRGVsZWdhdGVMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQlwcml2YXRlIElJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlcjsKLQotCXB1YmxpYyBEZWxlZ2F0ZUxhYmVsUHJvdmlkZXIoSUl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBpdGVtTGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGl0ZW1MYWJlbFByb3ZpZGVyLmdldEltYWdlKGVsZW1lbnQpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9Db252ZXJ0R3VpZGFuY2VUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9Db252ZXJ0R3VpZGFuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmU2NjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvQ29udmVydEd1aWRhbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LkxpYnJhcnlFZGl0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5pbnRlcm5hbC5Db250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JSW5wdXRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JbnB1dERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkxpc3REaWFsb2c7Ci0KLS8qKgotICogY2xhc3MgdG8gY29udmVydCBndWlkYW5jZSB0eXBlcwotICogCi0gKiBAYXV0aG9yID8/PwotICogQHNpY25lIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRHdWlkYW5jZVR5cGUgewotCi0Jc3RhdGljIElWYWxpZGF0b3IgdmFsaWRhdG9yOwotCXByaXZhdGUgc3RhdGljIGludFtdIGNvbXBhdGlibGVHdWlkYW5jZXMgPSB7IFVtYVBhY2thZ2UuQ09OQ0VQVCwKLQkvLyBVbWFQYWNrYWdlLkNIRUNLTElTVCwKLQkJCS8vIFVtYVBhY2thZ2UuRVhBTVBMRSwKLQkJCVVtYVBhY2thZ2UuR1VJREVMSU5FLAotCQkJLy8gVW1hUGFja2FnZS5FU1RJTUFURSwKLQkJCS8vIFVtYVBhY2thZ2UuRVNUSU1BVElOR19NRVRSSUMsCi0JCQkvLyBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlMsCi0JCQkvLyBVbWFQYWNrYWdlLlJFUE9SVCwKLQkJCS8vIFVtYVBhY2thZ2UuVEVNUExBVEUsCi0JCQlVbWFQYWNrYWdlLlNVUFBPUlRJTkdfTUFURVJJQUwsCi0JLy8gVW1hUGFja2FnZS5UT09MX01FTlRPUiwKLQkvLyBVbWFQYWNrYWdlLldISVRFUEFQRVIsCi0JLy8gVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT04sCi0JLy8gVW1hUGFja2FnZS5QUkFDVElDRSwKLQkvLyBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIExpc3QgY29tcGF0aWJsZUd1aWRhbmNlc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wYXRpYmxlR3VpZGFuY2VzLmxlbmd0aDsgaSsrKQotCQkJY29tcGF0aWJsZUd1aWRhbmNlc0xpc3QuYWRkKG5ldyBJbnRlZ2VyKGNvbXBhdGlibGVHdWlkYW5jZXNbaV0pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEd1aWRhbmNlIGNvbnZlcnRHdWlkYW5jZShHdWlkYW5jZSBvbGRHdWlkYW5jZSwgU2hlbGwgc2hlbGwsCi0JCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBjb252ZXJ0R3VpZGFuY2Uob2xkR3VpZGFuY2UsIHNoZWxsLCBjb21tYW5kLCBudWxsKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgR3VpZGFuY2UgY29udmVydEd1aWRhbmNlKEd1aWRhbmNlIG9sZEd1aWRhbmNlLCBTaGVsbCBzaGVsbCwKLQkJCQlEZWxldGVNZXRob2RFbGVtZW50Q29tbWFuZCBjb21tYW5kLCBFQ2xhc3MgbmV3VHlwZSkgewotCQlpZiAobmV3VHlwZSA9PSBudWxsKSB7Ci0JCWlmIChzaGVsbCA9PSBudWxsKQotCQkJc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlMaXN0RGlhbG9nIGRsZyA9IG5ldyBMaXN0RGlhbG9nKHNoZWxsKTsKLQkJZGxnLnNldEhlaWdodEluQ2hhcnMoNSk7Ci0JCWRsZy5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlkbGcuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXN3aXRjaCAoKChJbnRlZ2VyKSBlbGVtZW50KS5pbnRWYWx1ZSgpKSB7Ci0JCQkJLy8gVE9ETzogcmVmYWN0b3IgdGhlc2Ugc3RyaW5ncyAoYW5kIHRoaXMgd2hvbGUgZGlhbG9nKSBpbnRvCi0JCQkJLy8gbGlicmFyeS51aQotCQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5jb25jZXB0X3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmNoZWNrbGlzdF90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMuZXhhbXBsZV90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5ndWlkZWxpbmVfdGV4dDsgCi0JCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLmVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnJlcG9ydF90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnRlbXBsYXRlX3RleHQ7IAotCQkJCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5zdXBwb3J0aW5nTWF0ZXJpYWxfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnRvb2xNZW50b3JfdGV4dDsKLQkJCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMud2hpdGVwYXBlcl90ZXh0OwotCQkJCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnRlcm1EZWZpbml0aW9uX3RleHQ7Ci0JCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy5wcmFjdGljZV90ZXh0OyAKLQkJCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJCXJldHVybiBMaWJyYXJ5UmVzb3VyY2VzLnJldXNhYmxlQXNzZXRfdGV4dDsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gTGlicmFyeVJlc291cmNlcy51bmtub3duR3VpZGFuY2VfdGV4dDsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0JCUxpc3QgbmV3R3VpZGFuY2VUeXBlTGlzdCA9IGdldFZhbGlkTmV3R3VpZGFuY2VUeXBlcyhvbGRHdWlkYW5jZSk7Ci0JCWlmIChuZXdHdWlkYW5jZVR5cGVMaXN0ID09IG51bGwpIHsKLQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkuZGlzcGxheUVycm9yKAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGUsCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy51bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZywKLQkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLnVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfcmVhc29uLCBTdHJVdGlsLnRvTG93ZXIoVG5nVXRpbC5nZXRUeXBlVGV4dChvbGRHdWlkYW5jZSkpKSk7IAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZGxnLnNldElucHV0KG5ld0d1aWRhbmNlVHlwZUxpc3QpOwotCQlkbGcuc2V0VGl0bGUoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGUpOwotCQlkbGcuc2V0TWVzc2FnZShMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRHdWlkYW5jZURpYWxvZ190ZXh0KTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gRGlhbG9nLkNBTkNFTCkKLQkJCXJldHVybiBudWxsOwotCi0JCU9iamVjdFtdIHNlbGVjdGlvblJlc3VsdCA9IGRsZy5nZXRSZXN1bHQoKTsKLQkJaWYgKHNlbGVjdGlvblJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjaG9zZW5HdWlkYW5jZSA9ICgoSW50ZWdlcikgc2VsZWN0aW9uUmVzdWx0WzBdKS5pbnRWYWx1ZSgpOwotCQkKLS8vCQlHdWlkYW5jZSBuZXdHdWlkYW5jZSA9IGRvQ29udmVydChvbGRHdWlkYW5jZSwgY2hvc2VuR3VpZGFuY2UsIGNvbW1hbmQpOwotCQkKLQkJbmV3VHlwZSA9IGdldEd1aWRhbmNlVHlwZShjaG9zZW5HdWlkYW5jZSk7Ci0JCX0KLQkJCi0JCWlmKG5ld1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVHlwZUNvbnZlcnRlci5UeXBlQ29udmVyc2lvbkNvbW1hbmQgY21kID0gVHlwZUNvbnZlcnRlci5jcmVhdGVUeXBlQ29udmVyc2lvbkNvbW1hbmQob2xkR3VpZGFuY2UsIG5ld1R5cGUsIG51bGwsIG51bGwsIHRydWUsIHRydWUpOwotCQl0cnkgewotCQkJaWYoIWNtZC5nZXRJbGxlZ2FsUmVmZXJlbmNlcnMoKS5pc0VtcHR5KCkpIHsKLQkJCQkvLyB0eXBlIGNvbnZlcnNpb24gd2lsbCByZW1vdmUgc29tZSBpbGxlZ2FsIHJlZmVyZW5jZXMKLQkJCQkvLyBjb25maXJtIHdpdGggdXNlciBiZWZvcmUgY29udGludWUKLQkJCQkvLwotCQkJCU11bHRpU3RhdHVzIG11bHRpU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKAotCQkJCQkJTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UuZ2V0U3ltYm9saWNOYW1lKCksIDAsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGNtZC5nZXRJbGxlZ2FsUmVmZXJlbmNlcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0ZXIubmV4dCgpOwotCQkJCQkvLyBkb24ndCBzaG93IHByZWRlZmluZWQgZWxlbWVudAotCQkJCQkvLwotCQkJCQlpZighVG5nVXRpbC5pc1ByZWRlZmluZWQoZSkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChMaWJyYXJ5RWRpdFJlc291cmNlcy5lbGVtZW50VHlwZV90ZXh0LCBlLmVDbGFzcygpLmdldE5hbWUoKSwgVG5nVXRpbC5nZXRMYWJlbFdpdGhQYXRoKGUpKTsgCi0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLAotCQkJCQkJCQlMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRS5nZXRTeW1ib2xpY05hbWUoKSwgMCwgbXNnLAotCQkJCQkJCQludWxsKTsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChzdGF0dXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChtdWx0aVN0YXR1cy5nZXRDaGlsZHJlbigpLmxlbmd0aCA+IDAgJiYKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCUxpYnJhcnlFZGl0UmVzb3VyY2VzLmNvbmZpcm1fcmVtb3ZlX3JlZmVyZW5jZXNfdGV4dCwKLQkJCQkJCQkJbXVsdGlTdGF0dXMpID09IERpYWxvZy5DQU5DRUwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCQlJU3RhdHVzIHN0YXR1cyA9IFVzZXJJbnRlcmFjdGlvbkhlbHBlci5jaGVja01vZGlmeShjbWQuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSwgc2hlbGwpOwotCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXkoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGUsIHN0YXR1cyk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljbWQuZXhlY3V0ZSgpOwotCQkJR3VpZGFuY2UgbmV3R3VpZGFuY2UgPSAoR3VpZGFuY2UpIGNtZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkJLy8gc2F2ZSBtb2RpZmllZCByZXNvdXJjZXMKLQkJCS8vCi0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjbWQuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCQlwZXJzaXN0ZXIuc2F2ZShyZXNvdXJjZSk7Ci0JCQkJfQotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQkKLQkJCQlpZihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Lmhhc1ByZXNlbnRhdGlvbihuZXdHdWlkYW5jZSkpIHsKLQkJCQkJcGVyc2lzdGVyLmFkanVzdExvY2F0aW9uKG5ld0d1aWRhbmNlLmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpKTsKLQkJCQl9CQkJCQotCi0JCQkJY21kLmNvcHlSZXNvdXJjZXMoKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEd1aWRhbmNlRXJyb3JfdGl0bGUsCi0JCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLnNhdmVDb252ZXJ0ZWRHdWlkYW5jZUVycm9yX21zZywKLQkJCQkJCQkJbmV3R3VpZGFuY2UuZ2V0TmFtZSgpKSwKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sIGUpOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3R3VpZGFuY2U7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZihjbWQgIT0gbnVsbCkgewotCQkJCXRyeSB7IGNtZC5kaXNwb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkR3VpZGFuY2UKLQkgKiBAcGFyYW0gbmV3R3VpZGFuY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoZWNrTmFtZShHdWlkYW5jZSBvbGRHdWlkYW5jZSwgR3VpZGFuY2UgbmV3R3VpZGFuY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQkJCi0JCXZhbGlkYXRvciA9IG5ldyBDb250ZW50RWxlbWVudE5hbWVWYWxpZGF0b3Iob2xkR3VpZGFuY2UuZUNvbnRhaW5lcigpCi0JCQkJLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJCQkoQ29udGVudEVsZW1lbnQpIG5ld0d1aWRhbmNlLCBuZXcgVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyKG5ld0d1aWRhbmNlKSk7Ci0JCQotCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQobmV3R3VpZGFuY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZlYXR1cmVUeHQgPSBUbmdVdGlsLmdldEZlYXR1cmVUZXh0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCVN0cmluZyB0aXRsZSA9IExpYnJhcnlFZGl0UmVzb3VyY2VzLnJlc29sdmVOYW1lQ29uZmxpY3REaWFsb2dfdGl0bGU7IAotCQkJU3RyaW5nIGRsZ01zZyA9IE5MUy5iaW5kKAotCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCVN0clV0aWwudG9Mb3dlcihmZWF0dXJlVHh0KSwgbmV3R3VpZGFuY2UuZ2V0TmFtZSgpKTsKLQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSAoU3RyaW5nKSBuZXdHdWlkYW5jZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQotCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGlzVmFsaWQoU3RyaW5nIG5ld1RleHQpIHsKLQkJCQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKG5ld1RleHQpOwotCQkJCX0KLQkJCX07Ci0KLQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQlNc2dCb3guZ2V0RGVmYXVsdFNoZWxsKCksIHRpdGxlLCBkbGdNc2csIGN1cnJlbnRWYWx1ZSwKLQkJCQkJaW5wdXRWYWxpZGF0b3IpOwotCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRUNsYXNzIGdldEd1aWRhbmNlVHlwZShpbnQgbmV3R3VpZGFuY2VUeXBlKSB7Ci0JCXN3aXRjaCAobmV3R3VpZGFuY2VUeXBlKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OQ0VQVDsKLQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNIRUNLTElTVDsKLQkJY2FzZSBVbWFQYWNrYWdlLkVYQU1QTEU6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FWEFNUExFOwotCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREVMSU5FOwotCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVBPUlQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfTUVOVE9SOwotCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldISVRFUEFQRVI7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVJNX0RFRklOSVRJT046Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVVTQUJMRV9BU1NFVDsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgR3VpZGFuY2UgY3JlYXRlTmV3R3VpZGFuY2UoaW50IG5ld0d1aWRhbmNlVHlwZSkgewotCQlzd2l0Y2ggKG5ld0d1aWRhbmNlVHlwZSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OQ0VQVDoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4YW1wbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURFTElORToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkZWxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRvb2xNZW50b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOgotCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRToKLQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFsaWROZXdHdWlkYW5jZVR5cGVzKEd1aWRhbmNlIG9sZEd1aWRhbmNlKSB7Ci0JCWlmIChvbGRHdWlkYW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUludGVnZXIgb2xkR3VpZGFuY2VDbGFzc0lEID0gbmV3IEludGVnZXIob2xkR3VpZGFuY2UuZUNsYXNzKCkKLQkJCQkuZ2V0Q2xhc3NpZmllcklEKCkpOwotCQlpZiAoIWNvbXBhdGlibGVHdWlkYW5jZXNMaXN0LmNvbnRhaW5zKG9sZEd1aWRhbmNlQ2xhc3NJRCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTGlzdCBndWlkYW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUd1aWRhbmNlcy5sZW5ndGg7IGkrKykgewotCQkJSW50ZWdlciBjb21wYXRpYmxlR3VpZGFuY2VUeXBlQ2xhc3NJRCA9IG5ldyBJbnRlZ2VyKAotCQkJCQljb21wYXRpYmxlR3VpZGFuY2VzW2ldKTsKLQkJCWlmICghb2xkR3VpZGFuY2VDbGFzc0lELmVxdWFscyhjb21wYXRpYmxlR3VpZGFuY2VUeXBlQ2xhc3NJRCkpCi0JCQkJZ3VpZGFuY2VMaXN0LmFkZChjb21wYXRpYmxlR3VpZGFuY2VUeXBlQ2xhc3NJRCk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRhbmNlTGlzdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9UeXBlQ29udmVydGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdXRpbC9UeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTRhYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3V0aWwvVHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlNldENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLk1zZ0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5OZXN0ZWRDb21tYW5kRXhjZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXNzZW5nZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLklWYWxpZGF0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvbnRlbnRSZXNvdXJjZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UudXRpbC5QZXJzaXN0ZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklJbnB1dFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklucHV0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFR5cGVDb252ZXJ0ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgYWN0aXZpdHlGZWF0dXJlQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJCWlmKGFyZzAgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUykgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCQotCX07Ci0JCi0JLyoqCi0JICogQ29udmVydHMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYSBvYmplY3Qgb2YgbmV3IHR5cGUgc3BlY2lmaWVkIGJ5IDxjb2RlPm5ld1R5cGU8L2NvZGU+IHdoaWxlIHN0aWxsCi0JICogcHJlc2VydmluZyBhcyBtYW55IGF0dHJpYnV0ZXMgYW5kIHJlbGF0aW9uc2hpcHMgYXMgcG9zc2libGUKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIG5ld1R5cGUKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCBtYXAgb2YgZmVhdHVyZSBvZiA8Y29kZT5vYmplY3Q8L2NvZGU+IHRvIGZlYXR1cmUgb2YgPGNvZGU+bmV3VHlwZTwvY29kZT4KLQkgKiBAcmV0dXJuIG5ldyBvYmplY3Qgb2YgdHlwZSA8Y29kZT5uZXdUeXBlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU9iamVjdCBjb252ZXJ0KEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSwKLQkJCU1hcCBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwLCBDb21wYXJhdG9yIGZlYXR1cmVDb21wYXJhdG9yLCBTZXQgbW9kaWZpZWRSZXNvdXJjZXMpIAotCXsKLQkJVHlwZUNvbnZlcnNpb25Db21tYW5kIGNtZCA9IGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChvYmplY3QsIG5ld1R5cGUsIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIGZlYXR1cmVDb21wYXJhdG9yKTsKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzID0gY21kLmdldE1vZGlmaWVkUmVzb3VyY2VzKCk7Ci0JCWlmKCFyZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlSZXNvdXJjZVtdIHJlc291cmNlQXJyYXkgPSBuZXcgUmVzb3VyY2VbcmVzb3VyY2VzLnNpemUoKV07Ci0JCQlyZXNvdXJjZXMudG9BcnJheShyZXNvdXJjZUFycmF5KTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU2VydmljZXMuZ2V0QWNjZXNzQ29udHJvbGxlcigpLmNoZWNrTW9kaWZ5KHJlc291cmNlQXJyYXksIEV4dGVuc2lvbk1hbmFnZXIuZ2V0RGVmYXVsdFVzZXJJbnRlcmFjdGlvbkhhbmRsZXIoKS5nZXRVSUNvbnRleHQoKSk7Ci0JCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCU1lc3Nlbmdlci5JTlNUQU5DRS5zaG93RXJyb3IoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwgbnVsbCwgc3RhdHVzKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJY21kLmV4ZWN1dGUoKTsKLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChjbWQuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKSk7Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNtZC5nZXRSZXN1bHQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWNtZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb3VyY2VDb3B5VGFzayB7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lcjsKLQkJTWV0aG9kRWxlbWVudCBvd25lcjsKLQkJU3RyaW5nIGNvbnRlbnQ7Ci0JCVN0cmluZyBjb250ZW50UGF0aDsKLQkJCi0JCS8qKgotCQkgKiBAcGFyYW0gc2Nhbm5lcgotCQkgKiBAcGFyYW0gb3duZXIKLQkJICogQHBhcmFtIGNvbnRlbnQKLQkJICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JCSAqLwotCQlwdWJsaWMgUmVzb3VyY2VDb3B5VGFzayhDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIsIE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNjYW5uZXIgPSBzY2FubmVyOwotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5jb250ZW50ID0gY29udGVudDsKLQkJCXRoaXMuY29udGVudFBhdGggPSBjb250ZW50UGF0aDsKLQkJfQkKLQkJCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlQ29udmVyc2lvbkNvbW1hbmQgZXh0ZW5kcyBDb21wb3VuZENvbW1hbmQgaW1wbGVtZW50cyBJUmVzb3VyY2VBd2FyZUNvbW1hbmQgewotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjw/PiByZXN1bHQ7Ci0JCXByaXZhdGUgRU9iamVjdCBvYmplY3Q7Ci0JCXByaXZhdGUgSGFzaFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCXByaXZhdGUgYm9vbGVhbiBnb3RNb2RpZmllZFJlc291cmNlczsKLQkJcHJpdmF0ZSBMaXN0PFJlc291cmNlQ29weVRhc2s+IHJlc291cmNlQ29weVRhc2tzOwotCQlwcml2YXRlIFJlc291cmNlIHJlc291cmNlOwotCQlwcml2YXRlIENvbGxlY3Rpb24gaWxsZWdhbFJlZmVyZW5jZXJzOwotCQlwcml2YXRlIE5lc3RlZENvbW1hbmRFeGNlY3V0b3IgbmVzdGVkQ29tbWFuZEV4Y2VjdXRvcjsKLQotCQkvKioKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKi8KLQkJcHVibGljIFR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCkgewotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQltb2RpZmllZFJlc291cmNlcyA9IG5ldyBIYXNoU2V0PFJlc291cmNlPigpOwotCQkJcmVzb3VyY2UgPSBvYmplY3QuZVJlc291cmNlKCk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJCXJlc291cmNlQ29weVRhc2tzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUNvcHlUYXNrPigpOwotCQkJbmVzdGVkQ29tbWFuZEV4Y2VjdXRvciA9IG5ldyBOZXN0ZWRDb21tYW5kRXhjZWN1dG9yKHRoaXMpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZihpbGxlZ2FsUmVmZXJlbmNlcnMgIT0gbnVsbCkgewotCQkJCWlsbGVnYWxSZWZlcmVuY2Vycy5jbGVhcigpOwotCQkJfQotCQkJaWYobW9kaWZpZWRSZXNvdXJjZXMgIT0gbnVsbCkgewotCQkJCW1vZGlmaWVkUmVzb3VyY2VzLmNsZWFyKCk7Ci0JCQl9Ci0JCQlpZihyZXNvdXJjZUNvcHlUYXNrcyAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2VDb3B5VGFza3MuY2xlYXIoKTsKLQkJCX0KLQkJCWlmKG5lc3RlZENvbW1hbmRFeGNlY3V0b3IgIT0gbnVsbCkgewotCQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IuZGlzcG9zZSgpOwotCQkJfQotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQl9Ci0JCQkJCi0JCS8qKgotCQkgKiBHZXRzIHJlZmVyZW5jZXJzIHRoYXQgYmVjb21lIGlsbGVnYWwgYWZ0ZXIgdGhlIHR5cGUgY29udmVyc2lvbgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb24gZ2V0SWxsZWdhbFJlZmVyZW5jZXJzKCkgewotCQkJaWYoaWxsZWdhbFJlZmVyZW5jZXJzID09IG51bGwpIHsKLQkJCQlnZXRNb2RpZmllZFJlc291cmNlcygpOwotCQkJfQotCQkJcmV0dXJuIGlsbGVnYWxSZWZlcmVuY2VyczsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29weVJlc291cmNlcygpIHsKLQkJCWlmKCFyZXNvdXJjZUNvcHlUYXNrcy5pc0VtcHR5KCkpIHsKLQkJCQlmb3IgKFJlc291cmNlQ29weVRhc2sgdCA6IHJlc291cmNlQ29weVRhc2tzKSB7Ci0JCQkJCUZpbGUgbmV3UmVzb3VyY2VQYXRoID0gbmV3IEZpbGUoUmVzb3VyY2VIZWxwZXIuZ2V0QWJzb2x1dGVFbGVtZW50UmVzb3VyY2VQYXRoKHQub3duZXIpKTsKLQkJCQkJdC5zY2FubmVyLnNldFRhcmdldFJvb3RQYXRoKG5ld1Jlc291cmNlUGF0aCk7Ci0JCQkJCWlmKHQuY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCQl0LnNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyh0Lm93bmVyLCB0LmNvbnRlbnQsIHQuY29udGVudFBhdGgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChFQXR0cmlidXRlIGF0dHJpYnV0ZSA6IHQub3duZXIuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKSkgewotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IHQub3duZXIuZUdldChhdHRyaWJ1dGUpOwotCQkJCQkJCWlmKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQkJCXQuc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKHQub3duZXIsIChTdHJpbmcpIHZhbHVlLCB0LmNvbnRlbnRQYXRoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSVJlc291cmNlQXdhcmVDb21tYW5kI2dldE1vZGlmaWVkUmVzb3VyY2VzKCkKLQkJICovCi0JCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRNb2RpZmllZFJlc291cmNlcygpIHsKLQkJCWlmKCFnb3RNb2RpZmllZFJlc291cmNlcykgewotCQkJCWlsbGVnYWxSZWZlcmVuY2VycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29tbWFuZExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUNvbW1hbmQgY21kID0gKENvbW1hbmQpIGl0ZXIubmV4dCgpOwotCQkJCQlpZihjbWQgaW5zdGFuY2VvZiBSZW1vdmVDb21tYW5kKSB7Ci0JCQkJCQlSZW1vdmVDb21tYW5kIHJlbW92ZUNvbW1hbmQgPSAoUmVtb3ZlQ29tbWFuZCkgY21kOwotCQkJCQkJRU9iamVjdCBvd25lciA9IHJlbW92ZUNvbW1hbmQuZ2V0T3duZXIoKTsKLQkJCQkJCVJlc291cmNlIG93bmVyUmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lclJlc291cmNlICE9IHJlc291cmNlKSB7Ci0JCQkJCQkJbW9kaWZpZWRSZXNvdXJjZXMuYWRkKG93bmVyUmVzb3VyY2UpOwotCQkJCQkJfQotCQkJCQkJaWYob3duZXJSZXNvdXJjZSAhPSBudWxsICYmIG93bmVyICE9IG9iamVjdCAmJiAhVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KG93bmVyLCBvYmplY3QpKSB7Ci0JCQkJCQkJaWxsZWdhbFJlZmVyZW5jZXJzLmFkZChvd25lcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihjbWQgaW5zdGFuY2VvZiBTZXRDb21tYW5kKSB7Ci0JCQkJCQlTZXRDb21tYW5kIHNldENvbW1hbmQgPSAoU2V0Q29tbWFuZCkgY21kOwotCQkJCQkJRU9iamVjdCBvd25lciA9IHNldENvbW1hbmQuZ2V0T3duZXIoKTsKLQkJCQkJCVJlc291cmNlIG93bmVyUmVzb3VyY2UgPSBvd25lci5lUmVzb3VyY2UoKTsKLQkJCQkJCWlmKG93bmVyUmVzb3VyY2UgIT0gbnVsbCAmJiBvd25lclJlc291cmNlICE9IHJlc291cmNlICYmIHNldENvbW1hbmQuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQlFT2JqZWN0IHZhbHVlID0gKEVPYmplY3QpIHNldENvbW1hbmQuZ2V0VmFsdWUoKTsKLQkJCQkJCQlpZih2YWx1ZSAhPSBvYmplY3QgfHwgIVVtYVV0aWwuaXNDb250YWluZWRCeSh2YWx1ZSwgb2JqZWN0KSkgewotCQkJCQkJCQltb2RpZmllZFJlc291cmNlcy5hZGQob3duZXJSZXNvdXJjZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYob3duZXJSZXNvdXJjZSAhPSBudWxsICYmIG93bmVyICE9IG9iamVjdCAmJiAhVW1hVXRpbC5pc0NvbnRhaW5lZEJ5KG93bmVyLCBvYmplY3QpCi0JCQkJCQkJCSYmIHNldENvbW1hbmQuZ2V0VmFsdWUoKSA9PSBzZXRDb21tYW5kLmdldEZlYXR1cmUoKS5nZXREZWZhdWx0VmFsdWUoKSkgewotCQkJCQkJCWlsbGVnYWxSZWZlcmVuY2Vycy5hZGQob3duZXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCWdvdE1vZGlmaWVkUmVzb3VyY2VzID0gdHJ1ZTsKLQkJCX0KLQkJCW1vZGlmaWVkUmVzb3VyY2VzLmFkZEFsbChuZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmdldE1vZGlmaWVkUmVzb3VyY2VzKCkpOwkJCi0JCQlyZXR1cm4gbW9kaWZpZWRSZXNvdXJjZXM7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBzZXRSZXN1bHQoQ29sbGVjdGlvbjw/PiByZXN1bHQpIHsKLQkJCXRoaXMucmVzdWx0ID0gcmVzdWx0OwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZCNnZXRSZXN1bHQoKQotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Pz4gZ2V0UmVzdWx0KCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlzdXBlci5leGVjdXRlKCk7CQkJCi0JCQluZXN0ZWRDb21tYW5kRXhjZWN1dG9yLmV4ZWN1dGVOZXN0ZWRDb21tYW5kcygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdW5kbygpIHsKLQkJCW5lc3RlZENvbW1hbmRFeGNlY3V0b3IudW5kb05lc3RlZENvbW1hbmRzKCk7Ci0JCQlzdXBlci51bmRvKCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgTGlzdDxDb21tYW5kPiBjb21tYW5kTGlzdCgpIHsKLQkJCXJldHVybiBjb21tYW5kTGlzdDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IEVPYmplY3QKLQkgKiBAcGFyYW0gbmV3VHlwZSBFQ2xhc3MKLQkgKiBAcGFyYW0gb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCBNYXAKLQkgKiBAcGFyYW0gZmVhdHVyZUNvbXBhcmF0b3IgQ29tcGFyYXRvcgotCSAqIEByZXR1cm4gVHlwZUNvbnZlcnNpb25Db21tYW5kCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlQ29udmVyc2lvbkNvbW1hbmQgY3JlYXRlVHlwZUNvbnZlcnNpb25Db21tYW5kKEVPYmplY3Qgb2JqZWN0LCBFQ2xhc3MgbmV3VHlwZSwgCi0JCQlNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwgQ29tcGFyYXRvciBmZWF0dXJlQ29tcGFyYXRvcikgewotCQlyZXR1cm4gY3JlYXRlVHlwZUNvbnZlcnNpb25Db21tYW5kKG9iamVjdCwgbmV3VHlwZSwgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwgZmVhdHVyZUNvbXBhcmF0b3IsIGZhbHNlLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBvYmplY3QgRU9iamVjdAotCSAqIEBwYXJhbSBuZXdUeXBlIEVDbGFzcwotCSAqIEBwYXJhbSBvbGRGZWF0dXJlVG9OZXdGZWF0dXJlTWFwIE1hcAotCSAqIEBwYXJhbSBmZWF0dXJlQ29tcGFyYXRvciBDb21wYXJhdG9yCi0JICogQHBhcmFtIHJlbW92ZUluY29taW5nUmVmZXJlbmNlcyBib29sZWFuCi0JICogQHBhcmFtIHJlbW92ZVZhcmlhYmlsaXR5IGJvb2xlYW4KLQkgKiBAcmV0dXJuIFR5cGVDb252ZXJzaW9uQ29tbWFuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUNvbnZlcnNpb25Db21tYW5kIGNyZWF0ZVR5cGVDb252ZXJzaW9uQ29tbWFuZChFT2JqZWN0IG9iamVjdCwgRUNsYXNzIG5ld1R5cGUsIAotCQkJTWFwIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIENvbXBhcmF0b3IgZmVhdHVyZUNvbXBhcmF0b3IsIAotCQkJYm9vbGVhbiByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMsIGJvb2xlYW4gcmVtb3ZlVmFyaWFiaWxpdHkpIHsKLQkJVHlwZUNvbnZlcnNpb25Db21tYW5kIGNtZCA9IG5ldyBUeXBlQ29udmVyc2lvbkNvbW1hbmQob2JqZWN0KTsKLQkJRU9iamVjdCBuZXdPYmplY3QgPSBwcmVwYXJlQ29udmVydChvYmplY3QsIG5ld1R5cGUsIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAsIGZlYXR1cmVDb21wYXJhdG9yLCByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMsIHJlbW92ZVZhcmlhYmlsaXR5LCBjbWQpOwotCQkKLQkJLy8gcmVwbGFjZSBvYmplY3Qgd2l0aCBuZXdPYmplY3QgaW4gdGhlIG9iamVjdCdzIGNvbnRhaW5lcgotCQkvLwotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG9iamVjdC5lQ29udGFpbmVyKCk7Ci0JCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlFUmVmZXJlbmNlIHJlZiA9IG9iamVjdC5lQ29udGFpbm1lbnRGZWF0dXJlKCk7Ci0JCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgY29udGFpbmVyLmVHZXQocmVmKTsKLQkJCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2JqZWN0KTsKLQkJCQljbWQuY29tbWFuZExpc3QoKS5hZGQoMCwgbmV3IFNldENvbW1hbmQobnVsbCwgY29udGFpbmVyLCByZWYsIG5ld09iamVjdCwgaW5kZXgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNtZC5jb21tYW5kTGlzdCgpLmFkZCgwLCBuZXcgU2V0Q29tbWFuZChudWxsLCBjb250YWluZXIsIHJlZiwgbmV3T2JqZWN0KSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWNtZC5zZXRSZXN1bHQoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXdPYmplY3QpKTsKLQkJCi0JCXJldHVybiBjbWQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgY3JlYXRlU2Nhbm5lcihFT2JqZWN0IG9iamVjdCkgewotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gJiYgIShvYmplY3QgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pKSB7CQkJCi0JCQlGaWxlIG9sZFJlc291cmNlUGF0aCA9IG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldEZvbGRlckFic29sdXRlUGF0aCgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KSk7Ci0JCQlTdHJpbmcgcm9vdENvbnRlbnRwYXRoID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudFBhdGgoKE1ldGhvZEVsZW1lbnQpb2JqZWN0KTsKLQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKG9sZFJlc291cmNlUGF0aCwgbnVsbCwgcm9vdENvbnRlbnRwYXRoLCBudWxsKTsKLQkJCXJldHVybiBzY2FubmVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JLyoqCi0JICogUHJlcGFyZXMgYSBjb21wb3VuZCBjb21tYW5kIHRvIGRvIGEgdHlwZSBjb252ZXJzaW9uCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBuZXdUeXBlCi0JICogQHBhcmFtIG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAKLQkgKiBAcGFyYW0gZmVhdHVyZUNvbXBhcmF0b3IgdXNlZCB0byBzb3J0IHRoZSBmZWF0dXJlIGxpc3Qgb2Ygb2JqZWN0IHRvIGNvbnZlcnQgYmVmb3JlIGNvcHlpbmcvbW92aW5nCi0JICogICAgICAgIGZlYXR1cmUgdmFsdWVzIHRvIG5ldyBvYmplY3QuCi0JICogQHBhcmFtIHJlbW92ZUluY29taW5nUmVmZXJlbmNlcyBpZiB0cnVlIHdpbGwgcmVtb3ZlIGFsbCBpbmNvbWluZyByZWZlcmVuY2VzIAotCSAqIEBwYXJhbSBjb21wb3VuZENvbW1hbmQKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVPYmplY3QgcHJlcGFyZUNvbnZlcnQoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlLCBNYXAgb2xkRmVhdHVyZVRvTmV3RmVhdHVyZU1hcCwKLQkJCUNvbXBhcmF0b3IgZmVhdHVyZUNvbXBhcmF0b3IsIGJvb2xlYW4gcmVtb3ZlSW5jb21pbmdSZWZlcmVuY2VzLCBib29sZWFuIHJlbW92ZVZhcmlhYmlsaXR5LAotCQkJVHlwZUNvbnZlcnNpb25Db21tYW5kIGNvbXBvdW5kQ29tbWFuZCkgewotCQlFT2JqZWN0IG5ld09iamVjdCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShuZXdUeXBlKTsKLQkJCi0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCS8vIEhhbmRsZSBpbmNvbWluZyByZWZlcmVuY2VzLgotCQkJLy8gSWYgcmVtb3ZlSW5jb21taW5nUmVmZXJlbmNlcyBpcyBmYWxzZSwgcmVkaXJlY3QgYWxsIGluY29taW5nIHJlZmVyZW5jZXMgb2Ygb2JqZWN0IHRvIG5ld09iamVjdAotCQkJLy8gSWYgcmVtb3ZlSW5jb21taW5nUmVmZXJlbmNlcyBpcyB0cnVlLCByZW1vdmUgYWxsIG9mIHRoZW0uCi0JCQkvLwkJCQotCi0JCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIG9iamVjdDsKLQkJCUNvbGxlY3Rpb24gb3Bwb3NpdGVGZWF0dXJlcyA9IG1lLmdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJCWlmKCFvcHBvc2l0ZUZlYXR1cmVzLmlzRW1wdHkoKSkgewkJCQkKLQkJCQkKLQkJCQkvLyBsb2FkIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQkJLy8KLQkJCQlDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG9iamVjdCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gRXh0ZW5zaW9uTWFuYWdlci5nZXRPcHBvc2l0ZUZlYXR1cmVMb2FkZXJzKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJSU9wcG9zaXRlRmVhdHVyZUxvYWRlciBsb2FkZXIgPSAoSU9wcG9zaXRlRmVhdHVyZUxvYWRlcikgaXRlci5uZXh0KCk7Ci0JCQkJCWxvYWRlci5sb2FkT3Bwb3NpdGVGZWF0dXJlcyhjb2xsZWN0aW9uKTsKLQkJCQl9Ci0JCQkJCi0JCQkJTWFwIHJlZmVyZW5jZXJUb0ZlYXR1cmVMaXN0TWFwID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVmZXJlbmNlTWFwKG1lKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZWZlcmVuY2VyVG9GZWF0dXJlTGlzdE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlFT2JqZWN0IHJlZmVyZW5jZXIgPSAoRU9iamVjdCkgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pZW50cnkuZ2V0VmFsdWUoKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKCFyZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMgJiYgZmVhdHVyZS5nZXRFVHlwZSgpLmlzSW5zdGFuY2UobmV3T2JqZWN0KSkgewotCQkJCQkJCS8vIG5ldyB0eXBlIGlzIGNvbXBhdGlibGUsIHJlZmVyZW5jZSBjYW4gYmUgcHJlc2VydmVkCi0JCQkJCQkJLy8KLQkJCQkJCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQkJCQkJCUxpc3QgbGlzdCA9IChMaXN0KSByZWZlcmVuY2VyLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIHJlZmVyZW5jZXIsIGZlYXR1cmUsIG5ld09iamVjdCwgaW5kZXgpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgcmVmZXJlbmNlciwgZmVhdHVyZSwgbmV3T2JqZWN0KSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gbmV3IHR5cGUgaXMgbm90IGNvbXBhdGlibGUsIHJlZmVyZW5jZSBtdXN0IGJlIHJlbW92ZWQKLQkJCQkJCQkvLwotCQkJCQkJCWlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgUmVtb3ZlQ29tbWFuZChudWxsLCByZWZlcmVuY2VyLCBmZWF0dXJlLCBvYmplY3QpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgcmVmZXJlbmNlciwgZmVhdHVyZSwgZmVhdHVyZS5nZXREZWZhdWx0VmFsdWUoKSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gY29weSBhbGwgdGhlIGZlYXR1cmVzCi0JCS8vCi0JCUxpc3QgbmV3T2JqZWN0RmVhdHVyZXMgPSBuZXdUeXBlLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJTGlzdCBvYmplY3RGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Qob2JqZWN0LmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSk7Ci0JCWlmKHJlbW92ZVZhcmlhYmlsaXR5KSB7Ci0JCQlvYmplY3RGZWF0dXJlcy5yZW1vdmUoVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJCW9iamVjdEZlYXR1cmVzLnJlbW92ZShVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUpOwotCQl9Ci0JCWlmKGZlYXR1cmVDb21wYXJhdG9yICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb25zLnNvcnQob2JqZWN0RmVhdHVyZXMsIGZlYXR1cmVDb21wYXJhdG9yKTsKLQkJfQotCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBjcmVhdGVTY2FubmVyKG9iamVjdCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iamVjdEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCWlmKCFuZXdPYmplY3RGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJCWlmKG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgZiA9IG9sZEZlYXR1cmVUb05ld0ZlYXR1cmVNYXAuZ2V0KGZlYXR1cmUpOwotCQkJCQlpZihmICE9IG51bGwgJiYgbmV3T2JqZWN0RmVhdHVyZXMuY29udGFpbnMoZikpIHsKLQkJCQkJCWZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZmVhdHVyZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZlYXR1cmUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlLmlzQ2hhbmdlYWJsZSgpKSB7CQkJCQotCQkJCWJvb2xlYW4gZmVhdHVyZUhhbmRsZWQgPSBmYWxzZTsKLQkJCQlpZihmZWF0dXJlIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgewotCQkJCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSBmZWF0dXJlOwotCQkJCQlpZihyZWYgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pIHsKLQkJCQkJCWlmKENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuaGFzUHJlc2VudGF0aW9uKChNZXRob2RFbGVtZW50KSBvYmplY3QpKSB7Ci0JCQkJCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBvYmplY3QuZUdldChyZWYpOwotCQkJCQkJCUVDbGFzcyBjb250ZW50RGVzY1R5cGUgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmdldENvbnRlbnREZXNjcmlwdGlvblR5cGUobmV3VHlwZSk7Ci0JCQkJCQkJaWYoY29udGVudERlc2NUeXBlICE9IG51bGwgJiYgY29udGVudERlc2NUeXBlICE9IGNvbnRlbnQuZUNsYXNzKCkpIHsKLQkJCQkJCQkJRU9iamVjdCBuZXdDb250ZW50ID0gcHJlcGFyZUNvbnZlcnQoY29udGVudCwgY29udGVudERlc2NUeXBlLCBudWxsLCBudWxsLCByZW1vdmVJbmNvbWluZ1JlZmVyZW5jZXMsIHJlbW92ZVZhcmlhYmlsaXR5LCBjb21wb3VuZENvbW1hbmQpOwotCQkJCQkJCQkKLQkJCQkJCQkJLy8gcmVtb3ZlIG9sZCBjb250ZW50Ci0JCQkJCQkJCS8vCi0JCQkJCQkJCUVPYmplY3QgY29udGFpbmVyID0gY29udGVudC5lQ29udGFpbmVyKCk7Ci0JCQkJCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG9iamVjdCwgcmVmLCBudWxsKSk7Ci0JCQkJCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNvbnRlbnQuZVJlc291cmNlKCk7Ci0JCQkJCQkJCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJY29tcG91bmRDb21tYW5kLm1vZGlmaWVkUmVzb3VyY2VzLmFkZChjb250ZW50LmVSZXNvdXJjZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQkKLQkJCQkJCQkJY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIG5ld0NvbnRlbnQ7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQljb21wb3VuZENvbW1hbmQucmVzb3VyY2VDb3B5VGFza3MuYWRkKG5ldyBSZXNvdXJjZUNvcHlUYXNrKGNyZWF0ZVNjYW5uZXIoY29udGVudCksIGNvbnRlbnQsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBuZXdPYmplY3QsIHJlZiwgY29udGVudCkpOwotCQkJCQkJfQotCQkJCQkJZmVhdHVyZUhhbmRsZWQgPSB0cnVlOwotCQkJCQl9CQkJCQkKLQkJCQkJZWxzZSBpZighcmVmLmlzQ29udGFpbm1lbnQoKSAmJiByZWYuZ2V0RU9wcG9zaXRlKCkgIT0gbnVsbCkgewotCQkJCQkJLy8gUmVmZXJlbmNlIGlzIGJpLWRpcmVjdGlvbmFsLiBJZiBvcHBvc2l0ZSByZWZlcmVuY2UgaXMgYSBsaXN0LCByZXBsYWNlIG9iamVjdAotCQkJCQkJLy8gd2l0aCBuZXcgb2JqZWN0IGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHRoZSBsaXN0LgotCQkJCQkJLy8KLQkJCQkJCUVSZWZlcmVuY2Ugb3Bwb3NpdGVSZWYgPSByZWYuZ2V0RU9wcG9zaXRlKCk7CQkJCQkJCi0JCQkJCQlpZihvcHBvc2l0ZVJlZi5pc01hbnkoKSkgewotCQkJCQkJCU9iamVjdCB2YWx1ZSA9IG9iamVjdC5lR2V0KHJlZik7Ci0JCQkJCQkJaWYodmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pdmFsdWUpCi0JCQkJCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCQkJRU9iamVjdCBvdGhlckVuZCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG90aGVyRW5kLmVHZXQob3Bwb3NpdGVSZWYpOwotCQkJCQkJCQkJCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihvYmplY3QpOwotCQkJCQkJCQkJCWNvbXBvdW5kQ29tbWFuZC5hcHBlbmQobmV3IFNldENvbW1hbmQobnVsbCwgb3RoZXJFbmQsIG9wcG9zaXRlUmVmLCBuZXdPYmplY3QsIGluZGV4KSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlFT2JqZWN0IG90aGVyRW5kID0gKEVPYmplY3QpIHZhbHVlOwotCQkJCQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIG90aGVyRW5kLmVHZXQob3Bwb3NpdGVSZWYpOwotCQkJCQkJCQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9iamVjdCk7Ci0JCQkJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKG5ldyBTZXRDb21tYW5kKG51bGwsIG90aGVyRW5kLCBvcHBvc2l0ZVJlZiwgbmV3T2JqZWN0LCBpbmRleCkpOwkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmZWF0dXJlSGFuZGxlZCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYoIWZlYXR1cmVIYW5kbGVkKSB7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG9iamVjdC5lR2V0KGZlYXR1cmUpOwotCQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpIHsKLQkJCQkJCS8vIHZhbGlkYXRlIG5hbWUKLQkJCQkJCVN0cmluZyBuZXdOYW1lID0gY2hlY2tOYW1lKG9iamVjdCwgbmV3VHlwZSk7Ci0JCQkJCQlpZiAobmV3TmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJdmFsdWUgPSBuZXdOYW1lOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmKHNjYW5uZXIgIT0gbnVsbCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAmJiBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJCQlpZighU3RyVXRpbC5pc0JsYW5rKHN0cikpIHsKLQkJCQkJCQljb21wb3VuZENvbW1hbmQucmVzb3VyY2VDb3B5VGFza3MuYWRkKG5ldyBSZXNvdXJjZUNvcHlUYXNrKHNjYW5uZXIsIChNZXRob2RFbGVtZW50KW9iamVjdCwgc3RyLCAiIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChuZXcgU2V0Q29tbWFuZChudWxsLCBuZXdPYmplY3QsIGZlYXR1cmUsIHZhbHVlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCQkKLQkJcmV0dXJuIG5ld09iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhbiBhY3Rpdml0eSB0byBuZXcgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkQWN0aXZpdHkgQWN0aXZpdHkKLQkgKiBAcGFyYW0gbmV3VHlwZSBFQ2xhc3MKLQkgKiBAcmV0dXJuIEFjdGl2aXR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBjb252ZXJ0QWN0aXZpdHkoQWN0aXZpdHkgb2xkQWN0aXZpdHksIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCS8vIGFjdGl2aXR5IGlzIGFscmVhZHkgdGhpcyB0eXBlCi0JCS8vCi0JCWlmIChuZXdUeXBlID09IG9sZEFjdGl2aXR5LmVDbGFzcygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSGFzaFNldDxSZXNvdXJjZT4gbW9kaWZpZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQkJQWN0aXZpdHkgbmV3QWN0aXZpdHkgPSAoQWN0aXZpdHkpIFR5cGVDb252ZXJ0ZXIuY29udmVydChvbGRBY3Rpdml0eSwgbmV3VHlwZSwgbnVsbCwgYWN0aXZpdHlGZWF0dXJlQ29tcGFyYXRvciwgbW9kaWZpZWRSZXNvdXJjZXMpOwotCi0JCS8vIG1ha2Ugb2xkQWN0aXZpdHkgYSBwcm94eSBzbyByZWZlcmVuY2UgdG8gaXQgY2FuIGJlIHJlc29sdmVkIHRvIG5ld0FjdGl2aXR5Ci0JCS8vCi0JCVVSSSB1cmkgPSBQZXJzaXN0ZW5jZVV0aWwuZ2V0UHJveHlVUkkobmV3QWN0aXZpdHkpOwotCQkoKEludGVybmFsRU9iamVjdClvbGRBY3Rpdml0eSkuZVNldFByb3h5VVJJKHVyaSk7Ci0JCQkJCi0JCS8vIHNhdmUgbW9kaWZpZWQgcmVzb3VyY2VzCi0JCS8vCi0JCWlmICghbW9kaWZpZWRSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKFJlc291cmNlIHJlcyA6IG1vZGlmaWVkUmVzb3VyY2VzKSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQkJfQotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZSwKLQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZywKLQkJCQkJCQkJCQkJCW5ld0FjdGl2aXR5LmdldE5hbWUoKSksCi0JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLCBlKTsKLQotCQkJCXBlcnNpc3Rlci5yb2xsYmFjaygpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbmV3QWN0aXZpdHk7Ci0JfQkJCi0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHR5cGVJRCBpbnQKLQkgKiBAcmV0dXJuIEVDbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUNsYXNzIGdldEFjdGl2aXR5VHlwZShpbnQgdHlwZUlEKSB7Ci0JCXN3aXRjaCAodHlwZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZOwotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuSVRFUkFUSU9OOwotCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6Ci0JCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QSEFTRTsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogQHBhcmFtIG9sZEd1aWRhbmNlCi0JICogQHBhcmFtIG5ld0d1aWRhbmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjaGVja05hbWUoRU9iamVjdCBvYmplY3QsIEVDbGFzcyBuZXdUeXBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KW9iamVjdDsKLQkJCWZpbmFsIElWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlTmFtZVZhbGlkYXRvcihlLmVDb250YWluZXIoKSwgZSwgbmV3VHlwZSk7Ci0JCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZS5nZXROYW1lKCkpOwotCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZmVhdHVyZVR4dCA9IFRuZ1V0aWwuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RpdGxlOyAKLQkJCQlTdHJpbmcgZGxnTXNnID0gTkxTLmJpbmQoCi0JCQkJCQlMaWJyYXJ5RWRpdFJlc291cmNlcy5yZXNvbHZlTmFtZUNvbmZsaWN0RGlhbG9nX3RleHQsCi0JCQkJCQlTdHJVdGlsLnRvTG93ZXIoZmVhdHVyZVR4dCksIGUuZ2V0TmFtZSgpKTsKLQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gKFN0cmluZykgZS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0TmFtZWRFbGVtZW50X05hbWUoKSk7Ci0JCi0JCQkJSUlucHV0VmFsaWRhdG9yIGlucHV0VmFsaWRhdG9yID0gbmV3IElJbnB1dFZhbGlkYXRvcigpIHsKLQkJCQkJcHVibGljIFN0cmluZyBpc1ZhbGlkKFN0cmluZyBuZXdUZXh0KSB7Ci0JCQkJCQlyZXR1cm4gdmFsaWRhdG9yLmlzVmFsaWQobmV3VGV4dCk7Ci0JCQkJCX0KLQkJCQl9OwotCQotCQkJCUlucHV0RGlhbG9nIGlucHV0RGxnID0gbmV3IElucHV0RGlhbG9nKAotCQkJCQkJTXNnQm94LmdldERlZmF1bHRTaGVsbCgpLCB0aXRsZSwgZGxnTXNnLCBjdXJyZW50VmFsdWUsCi0JCQkJCQlpbnB1dFZhbGlkYXRvcik7Ci0JCQkJaWYgKGlucHV0RGxnLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gaW5wdXREbGcuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE3MmUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkV4dGVuZGVkSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5MaWJyYXJ5RWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci0KLS8qKgotICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGEgcHJvY2VzcyB0cmVlLgotICogPHA+Ci0gKiBEaXNwbGF5cyB0aGUgdHJlZSBpbiB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeToKLSAqIDx1bD4KLSAqIDxsaT5tZXRob2RfcGx1Z2luXzE8L2xpPgotICogPHVsPgotICogPGxpPiJDYXBhYmlsaXR5IFBhdHRlcm5zIiBVSSBmb2xkZXI8L2xpPgotICogPHVsPgotICogPGxpPmNhcGFiaWxpdHlfcGF0dGVybl8xPC9saT4KLSAqIDxsaT5jYXBhYmlsaXR5X3BhdHRlcm5fMjwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDxsaT4iRGVsaXZlcnkgUHJvY2Vzc2VzIiBVSSBmb2xkZXI8L2xpPgotICogPHVsPgotICogPGxpPmRlbGl2ZXJ5X3Byb2Nlc3NfMTwvbGk+Ci0gKiA8bGk+ZGVsaXZlcnlfcHJvY2Vzc18yPC9saT4KLSAqIDwvdWw+Ci0gKiA8L2xpPgotICogPC91bD4KLSAqIDwvbGk+Ci0gKiA8bGk+bWV0aG9kX3BsdWdpbl8yPC9saT4KLSAqIDx1bD4KLSAqIDxsaT4iQ2FwYWJpbGl0eSBQYXR0ZXJucyIgVUkgZm9sZGVyPC9saT4KLSAqIDwvbGk+Ci0gKiA8bGk+IkRlbGl2ZXJ5IFByb2Nlc3NlcyIgVUkgZm9sZGVyPC9saT4KLSAqIDwvbGk+Ci0gKiA8L3VsPgotICogPC9saT4KLSAqIDwvdWw+Ci0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5TID0gTGlicmFyeVVJUmVzb3VyY2VzLmNhcGFiaWxpdHlQYXR0ZXJuX3RleHRfcGx1cmFsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTU0VTID0gTGlicmFyeVVJUmVzb3VyY2VzLmRlbGl2ZXJ5UHJvY2Vzc190ZXh0X3BsdXJhbDsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQlwcm90ZWN0ZWQgTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4gY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcnMgPSBuZXcgSGFzaE1hcDxNZXRob2RQbHVnaW4sIFByb2Nlc3NUcmVlVUlGb2xkZXI+KCk7Ci0KLQlwcm90ZWN0ZWQgTWFwPE1ldGhvZFBsdWdpbiwgUHJvY2Vzc1RyZWVVSUZvbGRlcj4gZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXJzID0gbmV3IEhhc2hNYXA8TWV0aG9kUGx1Z2luLCBQcm9jZXNzVHJlZVVJRm9sZGVyPigpOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQlMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gKChNZXRob2RMaWJyYXJ5KSBwYXJlbnRFbGVtZW50KQotCQkJCQkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IGl0Lm5leHQoKTsKLQkJCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IFRuZ1V0aWwuZ2V0QWxsUHJvY2Vzc2VzKHBsdWdpbik7Ci0JCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChwbHVnaW4pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCX0gZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHBhcmVudEVsZW1lbnQ7Ci0KLQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlciA9IGNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzCi0JCQkJCS5nZXQocGx1Z2luKTsKLQkJCWlmIChjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyID09IG51bGwpIHsKLQkJCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyID0gbmV3IFByb2Nlc3NUcmVlVUlGb2xkZXIoCi0JCQkJCQlDQVBBQklMSVRZX1BBVFRFUk5TLAotCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJucyIpKSwgcGFyZW50RWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5wdXQocGx1Z2luLAotCQkJCQkJY2FwYWJpbGl0eVBhdHRlcm5VSUZvbGRlcik7Ci0JCQl9Ci0KLQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgZGVsaXZlcnlQcm9jZXNzVUlGb2xkZXIgPSBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcnMKLQkJCQkJLmdldChwbHVnaW4pOwotCQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVyID09IG51bGwpIHsKLQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciA9IG5ldyBQcm9jZXNzVHJlZVVJRm9sZGVyKAotCQkJCQkJREVMSVZFUllfUFJPQ0VTU0VTLAotCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzc2VzIikpLCBwYXJlbnRFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJCWRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycy5wdXQocGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NVSUZvbGRlcik7Ci0JCQl9Ci0KLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVyLAotCQkJCQlkZWxpdmVyeVByb2Nlc3NVSUZvbGRlciB9OwotCQl9IGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzVHJlZVVJRm9sZGVyKSB7Ci0JCQlQcm9jZXNzVHJlZVVJRm9sZGVyIHVpRm9sZGVyID0gKFByb2Nlc3NUcmVlVUlGb2xkZXIpIHBhcmVudEVsZW1lbnQ7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgdWlGb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCQlpZiAodWlGb2xkZXIuZ2V0TmFtZSgpID09IENBUEFCSUxJVFlfUEFUVEVSTlMpIHsKLQkJCQlyZXR1cm4gTGlicmFyeVNlcnZpY2VVdGlsLmdldENhcGFiaWxpdHlQYXR0ZXJucyhwbHVnaW4pCi0JCQkJCQkudG9BcnJheSgpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gTGlicmFyeVNlcnZpY2VVdGlsLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKHBsdWdpbikKLQkJCQkJCS50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzVHJlZVVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzVHJlZVVJRm9sZGVyKSBlbGVtZW50KS5nZXRQYXJlbnQoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsCi0JCQkJCS5nZXRNZXRob2RQbHVnaW4oKENhcGFiaWxpdHlQYXR0ZXJuKSBlbGVtZW50KTsKLQkJCXJldHVybiBjYXBhYmlsaXR5UGF0dGVyblVJRm9sZGVycy5nZXQocGx1Z2luKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbAotCQkJCQkuZ2V0TWV0aG9kUGx1Z2luKChEZWxpdmVyeVByb2Nlc3MpIGVsZW1lbnQpOwotCQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycy5nZXQocGx1Z2luKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXIjaGFzQ2hpbGRyZW4oT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuVUlGb2xkZXJzLmNsZWFyKCk7Ci0JCWRlbGl2ZXJ5UHJvY2Vzc1VJRm9sZGVycy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWExNjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGUgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBwcm9jZXNzIHRyZWUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoCi0JCQluZXcgVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzVHJlZVVJRm9sZGVyKSB7Ci0JCQlyZXR1cm4gKChQcm9jZXNzVHJlZVVJRm9sZGVyKSBvYmopLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRUZXh0KG9iaik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJcmV0dXJuICgoUHJvY2Vzc1RyZWVVSUZvbGRlcikgb2JqKS5nZXRJbWFnZSgpOwotCQl9Ci0JCXJldHVybiBsYWJlbFByb3ZpZGVyLmdldEltYWdlKG9iaik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVVSUZvbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NUcmVlVUlGb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5MmU0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVVSUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIE1vZGVscyBhIFVJIGZvbGRlciBpbiB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZVVJRm9sZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfSU1BR0UgPSBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZSggCi0JCUxpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1RyZWVVSUZvbGRlcihTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIFByb2Nlc3NUcmVlVUlGb2xkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBwYXJlbnQpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgYW4gaW1hZ2UgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVVJRm9sZGVyKFN0cmluZyBuYW1lLCBJbWFnZSBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciBhIFVJIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBmb3IgdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvdmlld3MvUHJvY2Vzc1RyZWVWaWV3ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmEwMjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGlzcGxheXMgYSB0cmVlIHZpZXcgdGhhdCBhbGxvd3MgYSB1c2VyIHRvIHNlbGVjdCBhIGNhcGFiaWxpdHkgcGF0dGVybiBvcgotICogZGVsaXZlcnkgcHJvY2Vzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVHJlZVZpZXdlciBleHRlbmRzIFRyZWVWaWV3ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXB1YmxpYyBQcm9jZXNzVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IFByb2Nlc3NUcmVlTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS92aWV3cy9Qcm9jZXNzVmlldy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NTQ2MmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3ZpZXdzL1Byb2Nlc3NWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3M7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzVmlldyB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL0RpcmVjdG9yeVZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNmNjYWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvRGlyZWN0b3J5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciB2YWxpZGF0aW5nIGFuZCBjcmVhdGluZyBhIGRpcmVjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MjE1MwotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzUwMAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE4MjA1NgotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5VmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhbmQgY3JlYXRlcyBhIGdpdmVuIGRpcmVjdG9yeS4KLQkgKiA8cD4KLQkgKiBEaXNwbGF5cyBhbiBlcnJvciBkaWFsb2cgaWYgdGhlIGRpcmVjdG9yeSBwYXRoIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyCi0JICogICAgICAgICAgICBUaGUgcGF0aCB0byBiZSB2YWxpZGF0ZWQgYW5kIGNyZWF0ZWQuCi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBUaGUgZGlhbG9nIHRpdGxlLgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgVGhlIGVycm9yIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBlcnJvciBkaWFsb2cuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyLCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgZXJyb3JNc2cpIHsJCQotCQlib29sZWFuIGFuc3dlciA9IGZhbHNlOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJRmlsZVtdIGZpbGVzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsICYmIGZpbGVzLmxlbmd0aCA+IDApIHsKLQkJCQlhbnN3ZXIgPSBMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCXRpdGxlLAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0NvbmZpcm1hdGlvbl9tc2csCi0JCQkJCQkJCQkJCQlkaXIpKTsKLQkJCQlpZiAoYW5zd2VyID09IHRydWUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFuc3dlciA9IEZpbGVVdGlsCi0JCQkJCQkJCS5kZWxldGVBbGxGaWxlcyhmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWlmIChhbnN3ZXIgPT0gZmFsc2UpIHsKLQkJCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJCWVycm9yTXNnLAotCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVVJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJdGl0bGUsCi0JCQkJCQkJCQkJZXJyb3JNc2csCi0JCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJCWFuc3dlciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlhbnN3ZXIgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotLy8JCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKSB7Ci0vLwkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcih0aXRsZSwKLS8vCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLmludmFsaWRQYXRoX21zZyk7Ci0vLwkJCQlhbnN3ZXIgPSBmYWxzZTsKLS8vCQkJfSBlbHNlIHsKLQotCQkJCXRyeSB7Ci0JCQkJCWlmIChmaWxlLm1rZGlycygpID09IGZhbHNlKSB7Ci0JCQkJCQlMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQl0aXRsZSwKLQkJCQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuY3JlYXRlUGF0aEVycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJZGlyKSk7Ci0JCQkJCQlhbnN3ZXIgPSBmYWxzZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFuc3dlciA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCQl0aXRsZSwKLQkJCQkJCQllcnJvck1zZywKLQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5jcmVhdGVQYXRoRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJZGlyKSwgZSk7Ci0JCQkJCWFuc3dlciA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLS8vCQl9Ci0KLQkJcmV0dXJuIGFuc3dlcjsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIGFuZCBjcmVhdGVzIGEgZ2l2ZW4gZGlyZWN0b3J5LgotCSAqIDxwPgotCSAqIERpc3BsYXlzIGFuIGVycm9yIGRpYWxvZyBpZiB0aGUgZGlyZWN0b3J5IHBhdGggaXMgbm90IHZhbGlkLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXRoIHRvIGJlIHZhbGlkYXRlZCBhbmQgY3JlYXRlZC4KLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIFRoZSBkaWFsb2cgdGl0bGUuCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICBUaGUgZXJyb3IgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGVycm9yIGRpYWxvZy4KLQkgKiBAcGFyYW0gYWxsb3dDdXJyZW50TGliUGF0aAotCSAqIAkJCSAgQWxsb3cgcGF0aHMgY29udGFpbmluZyBjdXJyZW50IGxpYnJhcnkgb3Igbm90Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBwYXRoIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0FuZENyZWF0ZURpcihTdHJpbmcgZGlyLCBTdHJpbmcgdGl0bGUsCi0JCQlTdHJpbmcgZXJyb3JNc2csIGJvb2xlYW4gYWxsb3dDdXJyZW50TGliUGF0aCkgewotCQlpZighYWxsb3dDdXJyZW50TGliUGF0aCl7Ci0JCQlTdHJpbmcgY3VycmVudExpYlBhdGggPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQkJCWlmIChjdXJyZW50TGliUGF0aCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHRhcmdldFBhdGhGaWxlU3RyID0gbmV3IEZpbGUoZGlyKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQlTdHJpbmcgbGliUGF0aEZpbGVTdHIgPSBuZXcgRmlsZShjdXJyZW50TGliUGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJaWYgKGxpYlBhdGhGaWxlU3RyLmVxdWFscyh0YXJnZXRQYXRoRmlsZVN0cikpIHsKLS8vCQkJCWlmKGRpci5zdGFydHNXaXRoKGN1cnJlbnRMaWJQYXRoKSB8fCBjdXJyZW50TGliUGF0aC5zdGFydHNXaXRoKGRpcikpewotCQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLgotCQkJCQlkaXNwbGF5RXJyb3IodGl0bGUsIExpYnJhcnlVSVJlc291cmNlcy5vdmVycmlkZUN1cnJlbnRMaWJyYXJ5RXJyb3JfbXNnMCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNoZWNrQW5kQ3JlYXRlRGlyKGRpciwgdGl0bGUsIGVycm9yTXNnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9MaWJyYXJ5QmFja3VwVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTGlicmFyeUJhY2t1cFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxMzVjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9MaWJyYXJ5QmFja3VwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dCb3g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVXNlckludGVyYWN0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5kaWFsb2dzLkxpYnJhcnlCYWNrdXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGJhY2sgdXAgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUJhY2t1cFV0aWwgewotCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aCA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRvIGJhY2t1cCB0aGUgY3VycmVudCBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByb21wdEJhY2t1cEN1cnJlbnRMaWJyYXJ5KFNoZWxsIHNoZWxsLCBJTGlicmFyeVNlcnZpY2Ugc2VydmljZSkgewotCQlTdHJpbmcgbGliUGF0aFN0ciA9IHNlcnZpY2UuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQlGaWxlIGxpYlBhdGggPSBuZXcgRmlsZShsaWJQYXRoU3RyKTsKLQkJbmV3IExpYnJhcnlCYWNrdXBVdGlsKCkuZG9CYWNrdXAoc2hlbGwsIGxpYlBhdGgsIHNlcnZpY2UpOwotCX0KLQkKLQkvKioKLQkgKiBQcm9tcHRzIHRvIGJhY2t1cCBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHNoZWxsCi0JICogQHBhcmFtIGxpYlBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvbXB0QmFja3VwTGlicmFyeShTaGVsbCBzaGVsbCwgRmlsZSBsaWJQYXRoKSB7Ci0JCW5ldyBMaWJyYXJ5QmFja3VwVXRpbCgpLmRvQmFja3VwKHNoZWxsLCBsaWJQYXRoLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9CYWNrdXAoZmluYWwgU2hlbGwgc2hlbGwsIGZpbmFsIEZpbGUgbGliUGF0aCwgSUxpYnJhcnlTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJcGF0aCA9IG51bGw7Ci0JCWZpbmFsIElMaWJyYXJ5U2VydmljZSBmc2VydmljZSA9IHNlcnZpY2U7Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU2hlbGwgcyA9IHNoZWxsOwotCQkJCWlmIChzID09IG51bGwpIHsKLQkJCQkJcyA9IE1zZ0JveC5nZXREZWZhdWx0U2hlbGwoKTsKLQkJCQl9Ci0KLQkJCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJCXMgPSBuZXcgU2hlbGwoTXNnQm94LmdldERpc3BsYXkoKSk7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHRpdGxlID0gTGlicmFyeVVJUmVzb3VyY2VzLmJhY2t1cExpYnJhcnlEaWFsb2dfdGl0bGU7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5VUlSZXNvdXJjZXMuYmFja3VwTGlicmFyeURpYWxvZ190ZXh0OwotCQkJCVN0cmluZyBiYWNrdXBQYXRoID0gbGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSArICIuYmFja3VwIjsgLy8kTk9OLU5MUy0xJAkKLQotCQkJCUxpYnJhcnlCYWNrdXBEaWFsb2cgZGxnID0gbmV3IExpYnJhcnlCYWNrdXBEaWFsb2cocywgdGl0bGUsCi0JCQkJCQltZXNzYWdlLCBiYWNrdXBQYXRoKTsKLQotCQkJCWlmIChkbGcub3BlbigpID09IERpYWxvZy5PSykgewotCQkJCQlwYXRoID0gZGxnLmdldFBhdGgoKTsKLQkJCQl9Ci0JCQkJCi0JCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIHBtRGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzKTsKLQkJCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMuYmFja2luZ1VwTGlicmFyeVRhc2tfbmFtZSwKLQkJCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoZnNlcnZpY2UgPT0gbnVsbCkgewotCQkJCQkJCQliYWNrdXAobGliUGF0aCwgbmV3IEZpbGUocGF0aCkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWZzZXJ2aWNlLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpLmJhY2t1cE1ldGhvZExpYnJhcnkocGF0aCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQlwbURpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCX0KLQotCS8qKgotCSAqIEJhY2sgdXAgbGlicmFyeSAKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmFja3VwKGZpbmFsIEZpbGUgc291cmNlLCBmaW5hbCBGaWxlIGRlc3QpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gZXhjdWRlIHRoZSBub24tbGlicmFyeSBmaWxlcyB0aGF0IG1pZ2h0IGJlIGxvY2tlZCBieSBybWMuCi0JCQkJCS8vIHRoZXNlIGZpbGVzIG1heSBjYXVzZSBiYWNrdXAgdG8gZmFpbCBkdWUgdG8gZmlsZSBsb2NrLgotCQkJCQlTdHJpbmcgZXhjbHVkZXMgPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JCQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHNvdXJjZSwgZGVzdCwgIioqIiwgZXhjbHVkZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCVVzZXJJbnRlcmFjdGlvbkhlbHBlci5ydW5XaXRoUHJvZ3Jlc3MocnVubmFibGUsCi0JCQkJTGlicmFyeVVJUmVzb3VyY2VzLmJhY2tpbmdVcExpYnJhcnlUYXNrX25hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTA2MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvTmV3TGlicmFyeVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGNsYXNzIGZvciBhIE5ldyBNZXRob2QgTGlicmFyeSB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0xpYnJhcnlXaXphcmRQYWdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpYnJhcnkgc3BlY2lmaWMgdXNlciBzZWxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBNYXAgZ2V0U2VsZWN0aW9ucygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9OZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzkwOTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL05ld0xpYnJhcnlXaXphcmRQYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIE5ldyBMaWJyYXJ5IHdpemFyZCBwYWdlcyBkZWZpbmVkIHZpYSB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5uZXdMaWJyYXJ5V2l6YXJkUGFnZXMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJuZXdMaWJyYXJ5V2l6YXJkUGFnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBJZiB0cnVlLCBkZWJ1ZyB0cmFjaW5nIGlzIGVuYWJsZWQuCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIHdpemFyZCBwYWdlIHByb3ZpZGVycy4KLQlwcml2YXRlIE1hcDxTdHJpbmcsIE5ld0xpYnJhcnlXaXphcmRQYWdlQ29udHJpYnV0aW9uPiB3aXphcmRQYWdlUHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4oKTsKLQotCS8vIEEgbGlzdCBvZiB3aXphcmQgcGFnZSBpbnN0YW5jZXMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBOZXdMaWJyYXJ5V2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE5ld0xpYnJhcnlXaXphcmRQYWdlPigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmV3TGlicmFyeVdpemFyZFBhZ2VGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5V2l6YXJkUGFnZUZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaW5pdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoCi0JCQkJRVhURU5TSU9OX1BPSU5UX05BTUVTUEFDRSwgRVhURU5TSU9OX1BPSU5UX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnRWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3RyaW5nIHR5cGVJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyB0aXRsZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImluaXQiLCAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJImNvbmZpZ0VsZW1lbnQsIGNsYXNzPSIgKyBjbGFzc05hbWUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSIsIHR5cGU9IiArIHR5cGVJZCArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIiwgdGl0bGU9IiArIHRpdGxlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiLCBkZXNjcmlwdGlvbj0iICsgZGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJfQotCQkJCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsICYmIGNsYXNzTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHR5cGVJZCAhPSBudWxsICYmIHR5cGVJZC50cmltKCkubGVuZ3RoKCkgPiAwCi0JCQkJCQkJCSYmIHRpdGxlICE9IG51bGwgJiYgdGl0bGUudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCQkJCQkmJiBkZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCQkJCSYmIGRlc2NyaXB0aW9uLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQlpZiAoIXdpemFyZFBhZ2VQcm92aWRlcnMuY29udGFpbnNLZXkodHlwZUlkKSkgewotCQkJCQkJCQlOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBwcm92aWRlciA9IG5ldyBOZXdMaWJyYXJ5V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCQkJCQkJCQlidW5kbGUsIGNsYXNzTmFtZSwgdHlwZUlkLCB0aXRsZSwKLQkJCQkJCQkJCQlkZXNjcmlwdGlvbik7Ci0JCQkJCQkJCXdpemFyZFBhZ2VQcm92aWRlcnMucHV0KHR5cGVJZCwgcHJvdmlkZXIpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBOZXdMaWJyYXJ5V2l6YXJkUGFnZSBjcmVhdGVXaXphcmRQYWdlKFN0cmluZyBwYWdlSWQsIFN0cmluZyB0eXBlSWQpIHsKLQkJTmV3TGlicmFyeVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChOZXdMaWJyYXJ5V2l6YXJkUGFnZSkgd2l6YXJkUGFnZXMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmICh3aXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRQYWdlOwotCQl9Ci0KLQkJTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24gcHJvdmlkZXIgPSAoTmV3TGlicmFyeVdpemFyZFBhZ2VDb250cmlidXRpb24pIHdpemFyZFBhZ2VQcm92aWRlcnMKLQkJCQkuZ2V0KHR5cGVJZCk7Ci0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gcHJvdmlkZXIuZ2V0QnVuZGxlKCk7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gcHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCk7Ci0JCQlDbGFzcyB3aXphcmRQYWdlQ2xhc3M7Ci0JCQlDbGFzc1tdIGFyZ0NsYXNzID0gbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MgfTsKLQkJCU9iamVjdFtdIGFyZ1ZhbHVlID0gbmV3IE9iamVjdFtdIHsgcGFnZUlkIH07Ci0JCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKLQkJCXRyeSB7Ci0JCQkJd2l6YXJkUGFnZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCWNvbnN0cnVjdG9yID0gd2l6YXJkUGFnZUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ0NsYXNzKTsKLQkJCQl3aXphcmRQYWdlID0gKE5ld0xpYnJhcnlXaXphcmRQYWdlKSBjb25zdHJ1Y3RvcgotCQkJCQkJLm5ld0luc3RhbmNlKGFyZ1ZhbHVlKTsKLQkJCQl3aXphcmRQYWdlLnNldFRpdGxlKHByb3ZpZGVyLmdldFRpdGxlKCkpOwotCQkJCXdpemFyZFBhZ2Uuc2V0RGVzY3JpcHRpb24ocHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkJd2l6YXJkUGFnZXMucHV0KHR5cGVJZCwgd2l6YXJkUGFnZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHdpemFyZFBhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvciBjYWNoZWQgd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPk5ld0xpYnJhcnlXaXphcmRQYWdlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgTmV3TGlicmFyeVdpemFyZFBhZ2UgZ2V0V2l6YXJkUGFnZShTdHJpbmcgdHlwZUlkKSB7Ci0JCXJldHVybiAoTmV3TGlicmFyeVdpemFyZFBhZ2UpIHdpemFyZFBhZ2VzLmdldCh0eXBlSWQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlNYWluUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjViMzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5TWFpblBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHBhdGggdG8gb3BlbiBhIG1ldGhvZAotICogbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuTGlicmFyeU1haW5QYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gT3BlbkxpYnJhcnlNYWluUGFnZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lEID0gInR5cGVJZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcm90ZWN0ZWQgU2hlbGwgc2hlbGw7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMYWJlbCBwYXRoTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgQ29tYm8gbGlicmFyeVBhdGhDb21ibzsKLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsaWJyYXJ5VHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhZ2VOYW1lCi0JICogICAgICAgICAgICB0aGUgd2l6YXJkIHBhZ2UgbmFtZQotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeU1haW5QYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeU1haW5XaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9PcGVuLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5TWFpblBhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDMpOwotCi0JCXBhdGhMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTGlicmFyeVVJUmVzb3VyY2VzLnBhdGhMYWJlbF90ZXh0KTsKLQotCQlsaWJyYXJ5UGF0aENvbWJvID0gY3JlYXRlQ29tYm9ib3goY29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oY29tcG9zaXRlLAotCQkJCUxpYnJhcnlVSVJlc291cmNlcy5icm93c2VCdXR0b25fdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlMaXN0PFN0cmluZz4gb3BlbkxpYnJhcnlQYXRoc0xpc3QgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRPcGVuTGlicmFyeVBhdGhzTGlzdCgpOwkJCi0JCWlmIChvcGVuTGlicmFyeVBhdGhzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBvcGVuTGlicmFyeVBhdGhzID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJLmdldE9wZW5MaWJyYXJ5UGF0aHMoKTsKLQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0SXRlbXMob3BlbkxpYnJhcnlQYXRocyk7Ci0JCQlpZiAob3BlbkxpYnJhcnlQYXRocy5sZW5ndGggPiAwKSB7Ci0JCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG9wZW5MaWJyYXJ5UGF0aHNbMF0pOwotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJU3RyaW5nIGxpYnJhcnlQYXRoID0gTGlicmFyeVVJUHJlZmVyZW5jZXMKLQkJCQkJLmdldERlZmF1bHRMaWJyYXJ5UGF0aCgpICsgRmlsZVV0aWwuRklMRV9TRVAgKyAiTGlicmFyeTEiOyAvLyROT04tTkxTLTEkCi0JCQlvcGVuTGlicmFyeVBhdGhzTGlzdC5hZGQoMCwgbGlicmFyeVBhdGgpOwotCQkJU3RyaW5nW10gb3BlbkxpYnJhcnlQYXRocyA9IG5ldyBTdHJpbmdbb3BlbkxpYnJhcnlQYXRoc0xpc3Quc2l6ZSgpXTsKLQkJCW9wZW5MaWJyYXJ5UGF0aHNMaXN0LnRvQXJyYXkob3BlbkxpYnJhcnlQYXRocyk7Ci0JCQlsaWJyYXJ5UGF0aENvbWJvLnNldEl0ZW1zKG9wZW5MaWJyYXJ5UGF0aHMpOwotCQkJbGlicmFyeVBhdGhDb21iby5zZXRUZXh0KG9wZW5MaWJyYXJ5UGF0aHNbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBsaXN0ZW5lcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJbGlicmFyeVBhdGhDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlsaWJyYXJ5UGF0aENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJfQotCQl9KTsKLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZ2V0TGlicmFyeVBhdGgoKSk7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoc2VsZWN0ZWREaXIgIT0gbnVsbCkgewotCQkJCQlsaWJyYXJ5UGF0aENvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCWxpYnJhcnlQYXRoQ29tYm8uc2V0VGV4dChzZWxlY3RlZERpcik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIGdldExpYnJhcnlOYW1lKCkubGVuZ3RoKCkgPiAwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlOYW1lKCkgewotCQlTdHJpbmcgbGliUGF0aCA9IGdldExpYnJhcnlQYXRoKCk7Ci0JCVN0cmluZyBsaWJOYW1lID0gbmV3IEZpbGUobGliUGF0aCkuZ2V0TmFtZSgpOwotCQlpZiAoIWxpYlBhdGguZXF1YWxzKGxpYk5hbWUpKSB7Ci0JCQlyZXR1cm4gbGliTmFtZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UGF0aENvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpYnJhcnlUeXBlKCkgewotCQlyZXR1cm4gbGlicmFyeVR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvT3BlbkxpYnJhcnlXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzNWU4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5Nc2dEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnByZWZlcmVuY2VzLkxpYnJhcnlVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLm1pZ3JhdGlvbi5VcGdyYWRlQ2FsbGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBBIHdpemFyZCB0aGF0IGd1aWRlcyB0aGUgdXNlciB0byBvcGVuIGEgbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wZW5MaWJyYXJ5V2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBPcGVuTGlicmFyeVdpemFyZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgT3BlbiBMaWJyYXJ5IHdpemFyZCBleHRlbnNpb24gcG9pbnQgSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX0VYVEVOU0lPTl9QT0lOVF9JRCA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5vcGVuTGlicmFyeVdpemFyZCI7IC8vJE5PTi1OTFMtMSQJCi0KLQkvLyBUaGUgbWFpbiB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgT3BlbkxpYnJhcnlNYWluUGFnZSBtYWluUGFnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE9wZW5MaWJyYXJ5V2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkI2dldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKSB7Ci0JCXJldHVybiBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNhZGRQYWdlcygpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciA9PSBudWxsKSB7Ci0JCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQlzdXBlci5hZGRQYWdlKG1haW5QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShPcGVuTGlicmFyeU1haW5QYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQltYWluUGFnZSA9IGNyZWF0ZU1haW5QYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKG1haW5QYWdlKTsKLQkJCX0KLQotCQkJc3VwZXIuZ2V0TmV3V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd2l6YXJkUGFnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGl0Lm5leHQoKTsKLQkJCQlzdXBlci5hZGRQYWdlKHdpemFyZFBhZ2UpOwotCQkJfQotCi0JCQl3aXphcmRFeHRlbmRlci5pbml0V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtYWluIHdpemFyZCBwYWdlCi0JICovCi0JcHJvdGVjdGVkIE9wZW5MaWJyYXJ5TWFpblBhZ2UgY3JlYXRlTWFpblBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgT3BlbkxpYnJhcnlNYWluUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhZ2VDb250cm9scyhDb21wb3NpdGUgcGFnZUNvbnRhaW5lcikgewotCQlzdXBlci5jcmVhdGVQYWdlQ29udHJvbHMocGFnZUNvbnRhaW5lcik7Ci0JCXBhZ2VDb250YWluZXIuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRFeHRlbmRlci5kb0ZpbmlzaCgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG9wZW5NZXRob2RMaWJyYXJ5KG1haW5QYWdlLmdldExpYnJhcnlQYXRoKCksICJ4bWkiKTsgLy8kTk9OLU5MUy0xJAkKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtZXRob2QgbGlicmFyeSBhdCB0aGUgdXNlciBzcGVjaWZpZWQgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHBhdGgKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCwgU3RyaW5nIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCU1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotCQkJb3B0aW9ucy5wdXQoWE1JTGlicmFyeU1hbmFnZXIuQVJHX0xJQlJBUllfUEFUSCwgbGlicmFyeVBhdGgKLQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkJaWYgKFhNSUxpYnJhcnlVdGlsLmlzVmFsaWRMaWJyYXJ5KHBhdGgsIHRydWUpID09IFN0YXR1cy5PS19TVEFUVVMpIHsKLQkJCQlpZiAoIWhhbmRsZVRvb2xWZXJzaW9uKHBhdGgsIG51bGwpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJaWYgKExpYnJhcnlVSU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5vcGVuTGlicmFyeShwYXRoKSkgewotCQkJCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcy5hZGRPcGVuTGlicmFyeVBhdGgobGlicmFyeVBhdGgKLQkJCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFhNSUxpYnJhcnlVdGlsCi0JCQkJCS5jb250YWluc1BsdWdpbk9yQ29uZmlnU3BlY0V4cG9ydEZpbGUocGF0aCkpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX3JlYXNvbjQpOwotCQkJfSBlbHNlIHsKLQkJCQlNc2dEaWFsb2cgbXNnRGlhbG9nID0gTGlicmFyeVVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpOwotCQkJCWJvb2xlYW4gcmMgPSBtc2dEaWFsb2cKLQkJCQkJCS5kaXNwbGF5Q29uZmlybWF0aW9uKAotCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCU5MUwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RGlhbG9nX25ld0xpYnJhcnlfdGV4dCwKLQkJCQkJCQkJCQkJCW5ldyBPYmplY3RbXSB7IHBhdGggfSkpOwotCQkJCWlmICghcmMpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoTGlicmFyeVVJTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUxpYnJhcnkocGF0aCkpIHsKLQkJCQkJTGlicmFyeVVJUHJlZmVyZW5jZXMuYWRkT3BlbkxpYnJhcnlQYXRoKGxpYnJhcnlQYXRoCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyByZWFzb24gPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChyZWFzb24gPT0gbnVsbCkgewotCQkJCXJlYXNvbiA9IExpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUludGVybmxFcnJvcl9yZWFzb247Ci0JCQl9Ci0JCQlyZWFzb24gKz0gIlxuXG4iICsgTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfYWR2aWNlOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZS5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5RXJyb3JfbXNnLCByZWFzb24pOwotCQkJfSBlbHNlIHsKLQkJCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeVdpemFyZF90aXRsZSwKLQkJCQkJCUxpYnJhcnlVSVJlc291cmNlcy5vcGVuTGlicmFyeUVycm9yX21zZywgcmVhc29uLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgYW5kIGhhbmRsZSB0b29sIHZlcnNpb24gZGlmZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFuZGxlVG9vbFZlcnNpb24oU3RyaW5nIHBhdGgsCi0JCQlVcGdyYWRlQ2FsbGVySW5mbyBjYWxsZXJJbmZvKSB7Ci0JCVN0cmluZyBsaWJYbWkgPSBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSTsKLQkJaWYgKGNhbGxlckluZm8gIT0gbnVsbCAmJiBjYWxsZXJJbmZvLmdldElzRXhwb3J0ZWRQbHVnaW5MaWIoKSkgewotCQkJbGliWG1pID0gWE1JTGlicmFyeU1hbmFnZXIuZXhwb3J0RmlsZTsKLQkJfQotCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8gPSBWZXJzaW9uVXRpbAotCQkJCS5jaGVja0xpYnJhcnlWZXJzaW9uKG5ldyBGaWxlKHBhdGgsIGxpYlhtaSkpOwotCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ucmVzdWx0ID4gMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0LAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSwKLQkJCQkJCQkJaW5mby50b29sVmVyc2lvbiB9KTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLnZlcnNpb25NaXNtYXRjaERpYWxvZ190ZXh0X3Vua25vd24sCi0JCQkJCQluZXcgT2JqZWN0W10geyBQbGF0Zm9ybS5nZXRQcm9kdWN0KCkuZ2V0TmFtZSgpIH0pOwotCQkJfQotCQkJaWYgKCFpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pKSB7Ci0JCQkJY2FsbGVySW5mby5zZXRFcnJvck1zZyhtZXNzYWdlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaWJyYXJ5VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJTGlicmFyeVVJUmVzb3VyY2VzLm9wZW5MaWJyYXJ5V2l6YXJkX3RpdGxlLCBtZXNzYWdlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoWE1JTGlicmFyeVV0aWwuaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKHBhdGgsIGxpYlhtaSwgaW5mbykpIHsKLQkJCWlmIChpc1VwZ3JhZGVMaWJyYXJ5KGNhbGxlckluZm8pCi0JCQkJCSYmICFMaWJyYXJ5VUlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJLmRpc3BsYXlDb25maXJtYXRpb24oCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMub3BlbkxpYnJhcnlXaXphcmRfdGl0bGUsCi0JCQkJCQkJCQlMaWJyYXJ5VUlSZXNvdXJjZXMudXBncmFkZUxpYnJhcnlEaWFsb2dfdGV4dCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoIWlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbykpIHsKLQkJCQljYWxsZXJJbmZvLmNvcHlMaWJyYXJ5KCk7Ci0JCQkJaWYgKGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpICE9IG51bGwpIHsKLQkJCQkJcGF0aCA9IGNhbGxlckluZm8uZ2V0Q29waWVkTGliRmlsZSgpLmdldFBhcmVudEZpbGUoKQotCQkJCQkJCS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIUxpYnJhcnlVSU1hbmFnZXIudXBncmFkZUxpYnJhcnkocGF0aCwgY2FsbGVySW5mbykpIHsKLQkJCQlpZiAoY2FsbGVySW5mbyAhPSBudWxsKSB7Ci0JCQkJCS8vIGNhbGxlckluZm8uc2V0RXJyb3JNc2coInVwZ3JhZGVMaWJyYXJ5IEZhaWxlZCEiKTsgLy9uZWVkCi0JCQkJCS8vIG5ldyByZXNvdXJjZSBzdHJpbmcKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VwZ3JhZGVMaWJyYXJ5KFVwZ3JhZGVDYWxsZXJJbmZvIGNhbGxlckluZm8pIHsKLQkJcmV0dXJuIFVwZ3JhZGVDYWxsZXJJbmZvLmlzVXBncmFkZUxpYnJhcnkoY2FsbGVySW5mbyk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9PcGVuTGlicmFyeVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmEyOTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL09wZW5MaWJyYXJ5V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgY2xhc3MgZm9yIGEgT3BlbiBNZXRob2QgTGlicmFyeSB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVuTGlicmFyeVdpemFyZFBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPcGVuTGlicmFyeVdpemFyZFBhZ2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlicmFyeSBzcGVjaWZpYyB1c2VyIHNlbGVjdGlvbnMuCi0JICovCi0JcHVibGljIGFic3RyYWN0IE1hcCBnZXRTZWxlY3Rpb25zKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL1NlbGVjdFByb2Nlc3NQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdWkvd2l6YXJkcy9TZWxlY3RQcm9jZXNzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZhZWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL1NlbGVjdFByb2Nlc3NQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgYSBwcm9jZXNzIHRvIGV4cG9ydC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgNy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RQcm9jZXNzUGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfTkFNRSA9IFNlbGVjdFByb2Nlc3NQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgUHJvY2Vzc1RyZWVWaWV3ZXIgcHJvY2Vzc1RyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIFRleHQgYnJpZWZEZXNjVGV4dDsKLQotCXByaXZhdGUgUHJvY2VzcyBwcm9jZXNzOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHJvY2Vzc1BhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKExpYnJhcnlVSVJlc291cmNlcy5zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKExpYnJhcnlVSVJlc291cmNlcy5zZWxlY3RQcm9jZXNzV2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9FeHBvcnRQcm9jZXNzLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTGlicmFyeVVJUmVzb3VyY2VzLnByb2Nlc3Nlc0xhYmVsX3RleHQpOwotCi0JCXByb2Nlc3NUcmVlVmlld2VyID0gbmV3IFByb2Nlc3NUcmVlVmlld2VyKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USAotCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDI1MDsKLQkJcHJvY2Vzc1RyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgTGlicmFyeVVJUmVzb3VyY2VzLmJyaWVmRGVzY3JpcHRpb25MYWJlbF90ZXh0KTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb21wb3NpdGUsICIiLCAxMDAsIDcwLCAxKTsgLy8kTk9OLU5MUy0xJAkKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCXByb2Nlc3NUcmVlVmlld2VyLnNldElucHV0KExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCXByb2Nlc3NUcmVlVmlld2VyLmV4cGFuZEFsbCgpOwotCi0JCWFkZExpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJcHJvY2Vzc1RyZWVWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJT2JqZWN0IHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFRyZWVTZWxlY3Rpb24pIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9ICgoVHJlZVNlbGVjdGlvbikgc2VsZWN0aW9uKQotCQkJCQkJCQkJLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJCQlwcm9jZXNzID0gKFByb2Nlc3MpIGVsZW1lbnQ7Ci0JCQkJCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChwcm9jZXNzCi0JCQkJCQkJCQkJLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcHJvY2VzcyA9IG51bGw7Ci0JCQkJCQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIGdldFByb2Nlc3MoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2UjZ2V0TmV4dFBhZ2VEYXRhKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5leHRQYWdlRGF0YSgpIHsKLQkJcmV0dXJuIGdldFByb2Nlc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNlbGVjdGVkIHByb2Nlc3MuCi0JICovCi0JcHVibGljIFByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3VpL3dpemFyZHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjY2MDBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHdpemFyZHMgZm9yIG1hbmFnaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiNzc4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFhNSSBMaWJyYXJ5IHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzI1M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYwMzk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gU2VwIDExIDEyOjMxOjU3IFBEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvUmVzb3VyY2VzLnByb3BlcnRpZXM9ODg1OV8xCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNmY1YzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVBsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkucHJlZmVyZW5jZXMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiMmZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyZWM3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFhNSSBMaWJyYXJ5Ci1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTY5ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImRpYWdyYW1NaWdyYXRpb24iIG5hbWU9IkRpYWdyYW0gTWlncmF0aW9uIiBzY2hlbWE9InNjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiPgotICAgICAgPGxpYnJhcnlNYW5hZ2VyCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlNYW5hZ2VyIiAgICAgICAJCQotICAgICAgICAgICAgdHlwZT0ieG1pIgotICAgICAgICAgICAgdHlwZU5hbWU9IlhNSSI+Ci0gICAgICA8L2xpYnJhcnlNYW5hZ2VyPiAgICAgCi0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm9wcG9zaXRlRmVhdHVyZUxvYWRlcnMiPgotICAgICAgPG9wcG9zaXRlRmVhdHVyZUxvYWRlciBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsLlhNSU9wcG9zaXRlRmVhdHVyZUxvYWRlciIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NjaGVtYS9JRGlhZ3JhbU1pZ3JhdGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTViZTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zY2hlbWEvSURpYWdyYW1NaWdyYXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSIgaWQ9IklEaWFncmFtTWlncmF0aW9uIiBuYW1lPSJEaWFncmFtIE1pZ3JhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBQcm92aWRlIGRpYWdyYW0gbWlncmF0aW9uIEFQSS4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImRpYWdyYW1NaWdyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkaWFncmFtTWlncmF0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLklEaWFncmFtTWlncmF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL0lEaWFncmFtTWlncmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9JRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmZjNzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL0lEaWFncmFtTWlncmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGRpZ3JhbSBtaWdyYXRpb24gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIE1hcmNoIDE5LCAyMDA3Ci0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaWFncmFtTWlncmF0aW9uIHsKLQotCXZvaWQgbWlncmF0ZShDb2xsZWN0aW9uPFByb2Nlc3M+IHByb2Nlc3NlcykgdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODBjZjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotZmlsZVBhdGg9RmlsZSBwYXRoCi1jYW5ub3RXcml0ZVRvRmlsZXM9Q2Fubm90IHdyaXRlIHRvIGZpbGUocykKLXJlYWRPbmx5RmlsZXNfdGl0bGU9UmVhZC1vbmx5IGZpbGUocykKLXJlYWRPbmx5RmlsZXNfbXNnPVRoZSBmaWxlcyBsaXN0ZWQgaW4gRGV0YWlscyBhcmUgcmVhZC1vbmx5LiBNYWtlIHRoZW0gd3JpdGFibGUgYW5kIGNsaWNrIG9uIFJldHJ5IHRvIGNvbnRpbnVlLgotZWxlbWVudFBhdGg9RWxlbWVudCBwYXRoCi1wcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9NaXNzaW5nRmlsZXNfbXNnPVRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIG1pc3NpbmcuIENsaWNrIE9LIGlmIHlvdSB3YW50IHRvIHJlbW92ZSBldmVyeSByZWZlcmVuY2UgdG8gdGhlIHNlbGVjdGVkIGZpbGVzIGluIHRoZSBsaWJyYXJ5Ci1taXNzaW5nRmlsZXNfdGl0bGU9TWlzc2luZyBmaWxlKHMpCi1sb2FkRXJyb3I9TG9hZCBlcnJvcgotcHJvbXB0UmVtb3ZlUmVmZXJlbmNlc1RvRmlsZXNXaXRoTG9hZEVycm9yc19tc2c9VGhlIGZvbGxvd2luZyBmaWxlKHMpIGNvdWxkIG5vdCBiZSBsb2FkZWQuIENsaWNrIE9LIGlmIHlvdSB3YW50IHRvIHJlbW92ZSBldmVyeSByZWZlcmVuY2UgdG8gdGhlIHNlbGVjdGVkIGZpbGVzIGluIHRoZSBsaWJyYXJ5Ci1maWxlc1dpdGhMb2FkRXJyb3JzX3RpdGxlPUZpbGUocykgd2l0aCBsb2FkIGVycm9yCi1taWdyYXRlWE1MTGlicmFyeV90YXNrTmFtZT1NaWdyYXRpbmcgWE1MIGltcG9ydGVkIGxpYnJhcnkKLQotIyBFcnJvciBNZXNzYWdlcwotbGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2c9QSBtZXRob2QgbGlicmFyeSBhbHJlYWR5IGV4aXN0cyBpbiAnJ3swfScnLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBmZTBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5EZWJ1Z1RyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkFic3RyYWN0TGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5taWdyYXRpb24uTWFwcGluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5TZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgWE1JIExpYnJhcnkgTWFuYWdlciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeU1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdExpYnJhcnlNYW5hZ2VyIHsKLQkvKioKLQkgKiBUaGUgc3VwcG9ydGVkIGxpYnJhcnkgdHlwZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1RZUEUgPSBTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBsaWJyYXJ5IFhNSSBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9YTUkgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgcGx1Z2luIGFuZCBjb25maWcgc3BlYyBleHBvcnQgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGV4cG9ydEZpbGUgPSBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX1BMVUdJTl9FWFBPUlRfRklMRU5BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19MSUJSQVJZX1BBVEggPSAibGlicmFyeS5wYXRoIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJvdGVjdGVkIFN0cmluZyBwYXRoOwotCQotCXByaXZhdGUgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNZ3I7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVnaXN0ZXJUeXBlID0gIkRlZmF1bHQiOwkJLy8kTk9OLU5MUy0xJCAKLQkKLQlwdWJsaWMgWE1JTGlicmFyeU1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlc291cmNlTWdyID0gbmV3IFhNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJZmluYWwgTWV0aG9kTGlicmFyeVtdIHJlc3VsdEhvbGRlciA9IG5ldyBNZXRob2RMaWJyYXJ5WzFdOwotCQlmaW5hbCBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbltdIGV4Y2VwdGlvbkhvbGRlciA9IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvblsxXTsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIGFjdGlvbiA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHRIb2xkZXJbMF0gPSBkb0NyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwgYXJncyk7Ci0JCQkJfQotCQkJCWNhdGNoKExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZXhjZXB0aW9uSG9sZGVyWzBdID0gZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfTsKLQkJdHJ5IHsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJd29ya3NwYWNlLnJ1bihhY3Rpb24sIHdvcmtzcGFjZS5nZXRSdWxlRmFjdG9yeSgpLmNyZWF0ZVJ1bGUod29ya3NwYWNlLmdldFJvb3QoKSksIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBudWxsKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlYTUlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJaWYoZXhjZXB0aW9uSG9sZGVyWzBdICE9IG51bGwpIHsKLQkJCXRocm93IGV4Y2VwdGlvbkhvbGRlclswXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0SG9sZGVyWzBdOwotCX0KLQkJCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGRvQ3JlYXRlTWV0aG9kTGlicmFyeShTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKQotCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiY3JlYXRlTWV0aG9kTGlicmFyeSIsICJuYW1lPSIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCB8fCBhcmdzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCVN0cmluZyBwYXRoID0gKFN0cmluZykgYXJncy5nZXQoQVJHX0xJQlJBUllfUEFUSCk7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlGaWxlIGxpYnJhcnlQYXRoID0gbmV3IEZpbGUocGF0aCk7Ci0JCUZpbGUgbGlicmFyeVhNSUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5UGF0aCwgTElCUkFSWV9YTUkpOwotCQlpZiAobGlicmFyeVhNSUZpbGUuZXhpc3RzKCkpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZCgKLQkJCQkJWE1JTGlicmFyeVJlc291cmNlcy5saWJyYXJ5QWxyZWFkeUV4aXN0c0Vycm9yX21zZywKLQkJCQkJbGlicmFyeVBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJdGhyb3cgbmV3IExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKG1zZyk7Ci0JCX0KLQotCQlpZiAoIWxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQlsaWJyYXJ5UGF0aC5ta2RpcnMoKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQkJCVN0cmluZyByZWdUeXBlID0gKFN0cmluZykgYXJncy5nZXQoQVJHX0xJQlJBUllfUkVHSVNURVJfVFlQRSk7Ci0JCQlpZiAocmVnVHlwZSAhPSBudWxsICYmIHJlZ1R5cGUuZXF1YWxzKCJDb25maWdFeHBvcnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRpbWUgPSBMb25nLnRvSGV4U3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCkpOwotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0Lm9wZW5Qcm9qZWN0KGxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpLCAiRXhwb3J0TGliIiArIHRpbWUsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW51bGwpOwkJCi0JCQl9IGVsc2UgeyAJCQkJCi0JCQkJLy8gT3BlbiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmaWxlLgotCQkJCXByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5vcGVuUHJvamVjdChsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJCW51bGwpOwotCQkJfQotCQkJLy8gQ3JlYXRlIHRoZSByZXNvdXJjZSBzZXQuCi0JCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0KLQkJCS8vIENyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkJCU1vZGVsU3RvcmFnZS5uZXdMaWJyYXJ5KHJlc291cmNlU2V0LCBuYW1lLCBsaWJyYXJ5UGF0aAotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCksIHRydWUpOwotCQkJbGlicmFyeSA9IHJlc291cmNlU2V0LmdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCi0JCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBtb25pdG9yIGxpYnJhcnkgcmVzb3VyY2UgY2hhbmdlcy4KLQkJCWFkZFJlc291cmNlQ2hhbmdlZExpc3RlbmVycygpOwotCi0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCQkiY3JlYXRlTWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IGZhbHNlOwotCi0JCQkvLyAvLyBldmVudCBwcm9jZXNzZWQgaW4gTGlicmFyeVNlcnZpY2UKLQkJCS8vIG5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVELCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeSBVUkkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShqYXZhLm5ldC5VUkkgdXJpKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJvcGVuTWV0aG9kTGlicmFyeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAodXJpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmkpOwotCQkJbGlicmFyeSA9IG9wZW5NZXRob2RMaWJyYXJ5KGZpbGUpOwotCQl9IAotCQljYXRjaChMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbGlicmFyeSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIGEgPGNvZGU+TWV0aG9kTGlicmFyeTwvY29kZT4uCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoRmlsZSBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJRmlsZSBsaWJyYXJ5WE1JRmlsZSA9IG5ldyBGaWxlKHBhdGgsIExJQlJBUllfWE1JKTsKLQkJaWYgKCFsaWJyYXJ5WE1JRmlsZS5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvID0gVmVyc2lvblV0aWwuY2hlY2tMaWJyYXJ5VmVyc2lvbihsaWJyYXJ5WE1JRmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gWE1JTGlicmFyeVV0aWwuY2hlY2tWZXJzaW9uKGxpYnJhcnlYTUlGaWxlLCBpbmZvKTsKLQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQllbHNlIGlmKE1hcHBpbmdVdGlsLmNvbnZlcnNpb25SZXF1aXJlZChsaWJyYXJ5WE1JRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaW5mbykpIHsKLQkJCXRocm93IG5ldyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihMaWJyYXJ5UmVzb3VyY2VzLmxpYlVwZ3JhZGVSZXF1aXJlZF9lcnJfbXNnKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXNraXBFdmVudFByb2Nlc3NpbmcgPSB0cnVlOwotCi0JCQkvLyBPcGVuIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGZpbGUuCi0JCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSwgbnVsbCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgcmVzb3VyY2Ugc2V0LgotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0KLQkJCS8vIExvYWQgdGhlIG1ldGhvZCBsaWJyYXJ5LgotCQkJcmVzb3VyY2VTZXQubG9hZE1ldGhvZExpYnJhcmllcyhVUkkuY3JlYXRlRmlsZVVSSShsaWJyYXJ5WE1JRmlsZQotCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCkpLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJbGlicmFyeSA9IHJlc291cmNlU2V0LmdldEZpcnN0TWV0aG9kTGlicmFyeSgpOwotCi0JCQkvLyBBZGQgYSBsaXN0ZW5lciB0byBtb25pdG9yIGxpYnJhcnkgcmVzb3VyY2UgY2hhbmdlcy4KLQkJCWFkZFJlc291cmNlQ2hhbmdlZExpc3RlbmVycygpOwotCi0JCQlTeXN0ZW0uZ2MoKTsKLQkJCQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KGUpOwotCQkJfQotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKGxpYnJhcnksIFBST1BfRElSVFkpOwotCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoTWFwIGFyZ3MpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm9wZW5NZXRob2RMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChhcmdzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCVN0cmluZyBwYXRoID0gKFN0cmluZykgYXJncy5nZXQoQVJHX0xJQlJBUllfUEFUSCk7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlsaWJyYXJ5ID0gb3Blbk1ldGhvZExpYnJhcnkobmV3IEZpbGUocGF0aCkpOwotCi0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAib3Blbk1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVucyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5NZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJyZW9wZW5NZXRob2RMaWJyYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWxpYnJhcnkgPSBvcGVuTWV0aG9kTGlicmFyeShuZXcgRmlsZShnZXRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKSkpOwotCi0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicmVvcGVuTWV0aG9kTGlicmFyeSIsICJsaWJyYXJ5PSIgKyBsaWJyYXJ5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlyZXR1cm4gbGlicmFyeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkFic3RyYWN0TGlicmFyeU1hbmFnZXIjZ2V0TGlicmFyeVBlcnNpc3RlclR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlicmFyeVBlcnNpc3RlclR5cGUoKSB7Ci0JCXJldHVybiBTZXJ2aWNlcy5YTUlfUEVSU0lTVEVOQ0VfVFlQRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkFic3RyYWN0TGlicmFyeU1hbmFnZXIjY3JlYXRlUmVzb3VyY2VTZXQoKQotCSAqLwotCXByb3RlY3RlZCBJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VTZXJ2aWNlLklOU1RBTkNFCi0JCQkJLmNyZWF0ZVJlc291cmNlU2V0KFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEZvciBkaXN0cmlidXRlZCBsaWJyYXJ5LCB0aGlzIGlzIHRoZSBsaWJyYXJ5J3Mgd29ya3NwYWNlIHBhdGguCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdldE1ldGhvZExpYnJhcnlQYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWphdmEubmV0LlVSSSBsaWJyYXJ5VVJJID0gZ2V0TWV0aG9kTGlicmFyeVVSSSgpOwotCQlpZiAobGlicmFyeVVSSSAhPSBudWxsKSB7Ci0JCQlGaWxlIGxpYnJhcnlYTUlGaWxlID0gbmV3IEZpbGUobGlicmFyeVVSSSk7Ci0JCQlpZiAobGlicmFyeVhNSUZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTElCUkFSWV9YTUkpKSB7Ci0JCQkJbGlicmFyeVhNSUZpbGUgPSBsaWJyYXJ5WE1JRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbGlicmFyeVhNSUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIHByb2plY3Qgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0TWV0aG9kTGlicmFyeVByb2plY3QoKSB7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVMaWJyYXJ5TW92ZWQoKSB7Ci0JCWlmKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBsb2NhdGlvbiA9IGdldE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCQlpZighcHJvamVjdC5pc09wZW4oKSB8fCBwcm9qZWN0LmdldExvY2F0aW9uKCkuZXF1YWxzKG5ldyBQYXRoKGxvY2F0aW9uKSkpIHsKLQkJCS8vIG5vdCBtb3ZlZAotCQkJLy8KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gdXBkYXRlIFVSSSBvZiBhbGwgbGlicmFyeSByZXNvdXJjZXMKLQkJLy8KLQkJUmVzb3VyY2UgbGliUmVzb3VyY2UgPSBsaWJyYXJ5LmVSZXNvdXJjZSgpOwotCQlpZihsaWJSZXNvdXJjZSA9PSBudWxsIHx8IGxpYlJlc291cmNlLmdldFJlc291cmNlU2V0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBuZXdMb2NhdGlvbiA9IHByb2plY3QuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCWlmKGxpYlJlc291cmNlLmdldFJlc291cmNlU2V0KCkgaW5zdGFuY2VvZiBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIHsKLQkJCSgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKWxpYlJlc291cmNlLmdldFJlc291cmNlU2V0KCkpLmhhbmRsZUxpYnJhcnlNb3ZlZChuZXdMb2NhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQZXJzaXN0ZW5jZVV0aWwucmVwbGFjZVVSSVByZWZpeChuZXcgQXJyYXlMaXN0PFJlc291cmNlPihsaWJSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpKSwgCi0JCQkJCWxvY2F0aW9uLCBuZXdMb2NhdGlvbik7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBnZXQgdGhlIHJlc291cmNlIG1hbmFnZXIgZm9yIHRoZSBsaWJyYXJ5Ci0JICogQHJldHVybiBJTGlicmFyeVJlc291cmNlTWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JCXJldHVybiByZXNvdXJjZU1ncjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyI2JhY2t1cE1ldGhvZExpYnJhcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBiYWNrdXBNZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyBsaWJQYXRoU3RyID0gZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCUZpbGUgbGliUGF0aCA9IG5ldyBGaWxlKGxpYlBhdGhTdHIpOwotCQkvLyBleGN1ZGUgdGhlIG5vbi1saWJyYXJ5IGZpbGVzIHRoYXQgbWlnaHQgYmUgbG9ja2VkIGJ5IHJtYy4KLQkJLy8gdGhlc2UgZmlsZXMgbWF5IGNhdXNlIGJhY2t1cCB0byBmYWlsIGR1ZSB0byBmaWxlIGxvY2suCi0JCVN0cmluZyBleGNsdWRlcyA9ICIubG9jayI7IC8vJE5PTi1OTFMtMSQKLQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIobGliUGF0aCwgbmV3IEZpbGUocGF0aCksICIqKiIsIGV4Y2x1ZGVzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlZ2lzdGVyVHlwZSgpIHsKLQkJcmV0dXJuIHJlZ2lzdGVyVHlwZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVnaXN0ZXJUeXBlKFN0cmluZyByZWdpc3RlclR5cGUpIHsKLQkJdGhpcy5yZWdpc3RlclR5cGUgPSByZWdpc3RlclR5cGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlciNyZWdpc3Rlck1ldGhvZExpYnJhcnkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5LCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlZ1R5cGUgPSAoU3RyaW5nKSBwYXJhbXMuZ2V0KEFSR19MSUJSQVJZX1JFR0lTVEVSX1RZUEUpOwotCQlpZiAocmVnVHlwZSAhPSBudWxsKSB7Ci0JCQlzZXRSZWdpc3RlclR5cGUocmVnVHlwZSk7Ci0JCX0KLQkJcmVnVHlwZSA9IGdldFJlZ2lzdGVyVHlwZSgpOwotCQlpZiAocmVnVHlwZS5lcXVhbHMoIkNvbmZpZ0V4cG9ydCIpKSB7Ly8kTk9OLU5MUy0xJCAKLQkJCS8vRm9yIG5vdywgc3RpbGwgc2ltcGx5IHdyYXBpbmcgdXAgb2xkIGltcGxlbWVudGF0aW9uIChjb3BpZWQgZnJvbSBDb25maWd1cmF0aW9uRXhwb3J0U2VydmljZSkgZm9yIHNtb290aGVyIGNoYW5nZTsgd2lsbCBkZWZpbmV0bHkgY2hhbmdlIGxhdGVyCi0JCQkvL3NvIHRoYXQgY3JlYXRpbmcgYSBuZXcgbGliIHdvdWxkIG5vdCBiZSBuZWVkZWQJCQotCQkJU3RyaW5nIG5hbWUgPSAibGlicmFyeS54bWkiOwkvLyROT04tTkxTLTEkOwkKLQkJCWNyZWF0ZU1ldGhvZExpYnJhcnkobmFtZSwgcGFyYW1zKTsKLQkJCXNldE1ldGhvZExpYnJhcnkobGliKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy9NaW5pbXVtIGltcGxlbWVudGF0aW9uIGZvciBkZWZhdWwgcmVnaXN0ZXIgdHlwZSwgdG8gbWluaW1pemUgY2FsbGVyIGNvZGUgY2hhbmdlCi0JCXRoaXMubGlicmFyeSA9IGxpYjsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyI3VuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1blJlZ2lzdGVyTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChnZXRSZWdpc3RlclR5cGUoKS5lcXVhbHMoIkNvbmZpZ0V4cG9ydCIpKSB7Ly8kTk9OLU5MUy0xJCAKLQkJCWNsb3NlTWV0aG9kTGlicmFyeSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vTWluaW11bSBpbXBsZW1lbnRhdGlvbiBmb3IgZGVmYXVsIHJlZ2lzdGVyIHR5cGUsIHRvIG1pbmltaXplIGNhbGxlciBjb2RlIGNoYW5nZQotCQl0aGlzLmxpYnJhcnkgPSBudWxsOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UGx1Z2luLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTZiOWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBYTUkgTGlicmFyeSBwbHVnLWluIGFjdGl2YXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RBY3RpdmF0b3IgewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFhNSUxpYnJhcnlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgWE1JTGlicmFyeVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgWE1JTGlicmFyeVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjY0ZTI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotCi0vKioKLSAqIFhNSSBsaWJyYXJ5IHJlc291cmNlIG1hbWFnZXIKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGltcGxlbWVudHMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgewotCi0JcHVibGljIFhNSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIoKSB7Ci0JfQotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHBhdGggb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnksCi0JICogdGhlIHBhdGggc2hvdWxkIHN0YXJ0IHdpdGggdGhlIHBsdWdpbiBuYW1lLiAKLQkgKiBpLmUuIDxwbHVnaW4gbmFtZT4vcGF0aC90by9lbGVtZW50Ci0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHNob3VsZCBlbmNhcHN1bGF0ZSB0aGUgcGh5c2ljYWwgc3RvcmFnZSAKLQkgKiBvZiB0aGUgcmVzb3VyY2UgYW5kIHJldHVybiB0aGUgcGF0aCBvZiB0aGUgZWxlbWVudCBzdGFydCB3aXRoIGl0J3MgcGx1Z2luIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJU3RyaW5nIHBhdGggPSBNZXRob2RMaWJyYXJ5UGVyc2lzdGVyLklOU1RBTkNFLmdldEVsZW1lbnRWaXJ0dWFsUGF0aChlbGVtZW50KTsKLQkJCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIldhcm5pbmchIE5vIFBhdGggZm9yIEVsZW1lbnQgWyIgKyBlbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkgKyAiOiAiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIGZpeFBhdGgocGF0aCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQncyBiYWNrIHBhdGggb2YgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGxvZ2ljYWwgcGF0aCwgZm9yIGV4YW1wbGUsCi0JICogIk9wZW5VUFxndWlkYW5jZVxjb25jZXB0XGMxLnhtbCIsIHRoZSBiYWNrIHBhdGggaXMgIi4vLi4vLi4vLi4vIgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja1BhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIExpbnV4OiBCcm93c2luZyBhbmQgcHJldmlldyBzaG93cyBvbmx5IHBsYWluIHRleHQuCi0JCS8vIFRoZXJlIGFyZSBubyBpbWFnZXMvc2VjdGlvbnMKLQkJLy8gZWxlbWVudCBwYXRoIHNob3VsZCBjaGVjayBGaWxlLnNlcGFyYXRvckNoYXIgaW5zdGVhZCBvZiAiXCIKLQkJU3RyaW5nIGJhY2tQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHBhdGggPSBnZXRMb2dpY2FsUGF0aChlbGVtZW50KTsKLQkJaWYgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmxlbmd0aCgpID4gMCkgewotCQkJYmFja1BhdGggPSBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpLnJlcGxhY2VBbGwoCi0JCQkJCSIuKj8vIiwgIlxcLlxcLi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuICIuLyIgKyBiYWNrUGF0aDsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBmaXggdGhlIHBhdGggYnkgYXBwZW5kaW5nIGEgRmlsZS5zZXBlcmF0b3IgdG8gdGhlIGVuZCBvZiBpdAotCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZml4UGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICghcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXJldHVybiBwYXRoICsgRmlsZS5zZXBhcmF0b3I7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCByZXNvdXJjZSBwYXRoIG9mIHRoZSBlbGVtZW50IGluIHRoZQotCSAqIGxpYnJhcnkuIHRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gCi0JICogaS5lLiA8cGx1Z2luIG5hbWU+L3BhdGgvdG8vZWxlbWVudC9yZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxSZXNvdXJjZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBwYXRoID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5JTlNUQU5DRS5nZVJlc291cmNlVmlydHVhbFBhdGgoZWxlbWVudCk7Ci0JCXJldHVybiBmaXhQYXRoKHBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwaHlzaWNhbCBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBoeXNpY2FsIHBhdGggb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBoeXNpY2FsUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gZ2V0RmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcihlbGVtZW50KTsKLQkJcmV0dXJuIHBlcnNpc3RlciAhPSBudWxsID8gZml4UGF0aChwZXJzaXN0ZXIuZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKGVsZW1lbnQpKSA6IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gdGhlIHBoeXNpY2FsIHJlc291cmNlIHBhdGggb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBoeXNpY2FsUmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gcGVyc2lzdGVyICE9IG51bGwgPyBmaXhQYXRoKHBlcnNpc3Rlci5nZXRSZXNvdXJjZUZvbGRlclBhdGgoZWxlbWVudCkpIDogbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlciBnZXRGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVsZW1lbnQuZVJlc291cmNlKCk7Ci0JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRQZXJzaXN0ZXJGb3IocmVzb3VyY2UpOwotCQkJaWYocGVyc2lzdGVyIGluc3RhbmNlb2YgSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIpIHsKLQkJCQlyZXR1cm4gKChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcilwZXJzaXN0ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcGF0aCBvZiB0aGUgcGx1Z2luIAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxQbHVnaW5QYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIHBsdWdpbi5nZXROYW1lKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJfSAKLQkJCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHBoeXNpY2FsIHBhdGggb2YgdGhlIHBsdWdpbiBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaHlzaWNhbFBsdWdpblBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UGh5c2ljYWxQYXRoKHBsdWdpbik7Ci0JCX0gCi0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHBoeXNpY2FsIHBhdGggYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBsb2dpY2FsIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50IGFuIGVsZW1lbnQgaW4gdGhlIGxpYnJhcnkgdG8gYWNjZXNzIHRoZSBsaWJyYXJ5IHJlc291cmNlCi0JICogdXN1YWxseSB0aGlzIGlzIHRoZSBvd25lciBlbGVtZW50IHRoYXQgcmVmZXJlbmNlcyB0aGUgbG9naWNhbFBhdGgKLQkgKiBAcGFyYW0gbG9naWNhbFBhdGggU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHBoeXNpY2FsIHBhdGggcmVzb2x2ZWQgZnJvbSB0aGUgbG9naWNhbCBwYXRoCi0JICoKLQkgKiBmb3IgZXhhbXBsZSwgZWxlbWVudCB0YXNrMSwgbG9naWNhbCBwYXRoIGlzICJwbHVnaW4gMS90YXNrcy90YXNrMS5odG1sIgotCSAqIHRoZSByZXR1cm5lZCBwaHlzaWNhbCBwYXRoIGlzIDxwbHVnaW4gbG9jYXRpb24+L3BhdGgvdG8vZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IAotCSAqIEBwYXJhbSBsb2dpY2FsUGF0aCB0aGUgbG9naWNhbCBwYXRoIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbG9naWNhbFBhdGgpIHsKLQotCQkvLyB1c2UgdGhlIHBsdWdpbiBuYW1lIGluIHRoZSBsb2dpY2FsIHBhdGgKLQkJLy8gZmluZCB0aGUgTWV0aG9kUGx1Z2luIG9iamVjdAotCQkvLyBmaW5kIHRoZSBwbHVnaW5QYXRoCi0JCQkJCi0JCS8vIHN0cmlwIG9mZiB0aGUgZmlyc3QgZm9sZGVyIGluIHRoZSByZWxwYXRoIHNpbmNlIHRoaXMgaXMgdGhlIHBsdWdpbiBuYW1lCi0JCWxvZ2ljYWxQYXRoID0gbG9naWNhbFBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCWludCBpID0gbG9naWNhbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlpZiAoIGkgPiAwICkgewotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBsb2dpY2FsUGF0aC5zdWJzdHJpbmcoMCwgaSk7Ci0JCQlTdHJpbmcgcGx1Z2luUGF0aCA9IG51bGw7IAotCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlbGVtZW50KTsKLQkJCUxpc3QgcGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGliKTsKLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbilpdC5uZXh0KCk7Ci0JCQkJaWYgKCBwbHVnaW4uZ2V0TmFtZSgpLmVxdWFscyhwbHVnaW5OYW1lKSApIHsKLQkJCQkJcGx1Z2luUGF0aCA9IGdldFBoeXNpY2FsUGx1Z2luUGF0aChwbHVnaW4pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICggcGx1Z2luUGF0aCAhPSBudWxsICkgewotCQkJCXJldHVybiBwbHVnaW5QYXRoICsgbG9naWNhbFBhdGguc3Vic3RyaW5nKGkrMSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9YTUlMaWJyYXJ5UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MWRiMWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgWE1JIExpYnJhcnkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlMaWJyYXJ5UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFhNSUxpYnJhcnlSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fubm90V3JpdGVUb0ZpbGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFBhdGg7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlUGF0aDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVzV2l0aExvYWRFcnJvcnNfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkRXJyb3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nRmlsZXNfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9tcHRSZW1vdmVSZWZlcmVuY2VzVG9GaWxlc1dpdGhMb2FkRXJyb3JzX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb21wdFJlbW92ZVJlZmVyZW5jZXNUb01pc3NpbmdGaWxlc19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkT25seUZpbGVzX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRPbmx5RmlsZXNfdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlicmFyeUFscmVhZHlFeGlzdHNFcnJvcl9tc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlncmF0ZVhNTExpYnJhcnlfdGFza05hbWU7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUlMaWJyYXJ5UmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNSUxpYnJhcnlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL1hNSUxpYnJhcnlVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTY5YWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvWE1JTGlicmFyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVNhdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIGFjY2Vzc2luZyBhIFhNSSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX01FVEhPRF9MSUJSQVJZX1BBVEhfTVNHID0gTGlicmFyeVJlc291cmNlcy5lbXB0eUxpYnJhcnlQYXRoRXJyb3JfcmVhc29uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JU1NJTkdfTElCUkFSWV9GSUxFX01TRyA9IExpYnJhcnlSZXNvdXJjZXMubWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPVUxEX05PVF9MT0NLX0xJQlJBUllfTVNHID0gTGlicmFyeVJlc291cmNlcy5jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVN0YXR1cyBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUyA9IG5ldyBTdGF0dXMoCi0JCQlTdGF0dXMuRVJST1IsIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksIDEsCi0JCQlFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX01TRywgbnVsbCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgTUlTU0lOR19MSUJSQVJZX0ZJTEVfU1RBVFVTID0gbmV3IFN0YXR1cygKLQkJCVN0YXR1cy5FUlJPUiwgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwKLQkJCU1JU1NJTkdfTElCUkFSWV9GSUxFX01TRywgbnVsbCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElTdGF0dXMgQ09VTERfTk9UX0xPQ0tfTElCUkFSWV9TVEFUVVMgPSBuZXcgU3RhdHVzKAotCQkJU3RhdHVzLkVSUk9SLCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAxLAotCQkJQ09VTERfTk9UX0xPQ0tfTElCUkFSWV9NU0csIG51bGwpOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IFRoaXMgY2FsbCBpcyBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGVyc2lzdGVuY2UgbGF5ZXIKLQkJCS8vIHRvIGF2b2lkIGEgbnVsbCBwb2ludGVyIGV4Y2VwdGlvbiBpbgotCQkJLy8gUGVyc2lzdGVuY2VVdGlsLmNvbnZlcnNpb25SZXF1aXJlZCgpLiBBIGJldHRlciBzb2x1dGlvbiBpcwotCQkJLy8gbmVlZGVkLgotCQkJbmV3IE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGxpYnJhcnkgZXhpc3RzIG9uIGEgZ2l2ZW4gcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGF0aCBjb250YWlucyBhIHZhbGlkIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKSB7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUZpbGUgbGlicmFyeURpciA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoIWxpYnJhcnlEaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUZpbGUgbGlicmFyeUZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5RGlyLCBYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1hNSSk7Ci0JCWlmICghbGlicmFyeUZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeSBtb2RlbCAobGlicmFyeS54bWkpIGZpbGUuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm50IGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeSBtb2RlbCBmaWxlIChpZiBvbmUgZXhpc3RzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlNb2RlbEZpbGUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCFTdHJVdGlsLmlzQmxhbmsocGF0aCkpIHsKLQkJCVN0cmluZyBsaWJQYXRoID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlTdHJpbmcgc3VmZml4ID0gRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0xJQlJBUllfTU9ERUxfRklMRU5BTUU7Ci0JCQlpZiAobGliUGF0aC5lbmRzV2l0aChzdWZmaXgpKSB7Ci0JCQkJcmV0dXJuIGxpYlBhdGg7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBsaWJQYXRoICsgc3VmZml4OwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyBhIG1ldGhvZCBsaWJyYXJ5IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB2YWxpZGF0ZU1vZGVsRmlsZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHZhbGlkYXRlIHRoYXQgdGhlIGxpYnJhcnkueG1pIGZpbGUKLQkgKiAgICAgICAgICAgIGFsc28gZXhpc3RzLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIHBhdGggaXMgYSB2YWxpZCBtZXRob2QgbGlicmFyeQotCSAqICAgICAgICAgZm9sZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGlzVmFsaWRMaWJyYXJ5KFN0cmluZyBwYXRoLCBib29sZWFuIHZhbGlkYXRlTW9kZWxGaWxlKSB7Ci0JCWlmIChwYXRoID09IG51bGwgfHwgcGF0aC50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX01FVEhPRF9MSUJSQVJZX1BBVEhfU1RBVFVTOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlTW9kZWxGaWxlKSB7Ci0JCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShnZXRMaWJyYXJ5TW9kZWxGaWxlKHBhdGgpKTsKLQkJCWlmICghbGliRmlsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBNSVNTSU5HX0xJQlJBUllfRklMRV9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGxpYlBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKHBhdGguZW5kc1dpdGgoTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKSkgewotCQkJbGliUGF0aCA9IGxpYlBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJU3RyaW5nIGxpYkZ1bGxQYXRoID0gbGliUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQlpZiAobGliRnVsbFBhdGguc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyB0aGUgZmlyc3QgcGFydCBtdXN0IGJlIGEgbWFjaGluZSBuYW1lLCBhbmQgeW91IG11c3Qgc3BlY2lmeSBhCi0JCQkvLyBmb2xkZXIKLQotCQkJYm9vbGVhbiBpc1ZhbGlkID0gdHJ1ZTsKLQkJCVN0cmluZyB1bmNQYXRoOwotCQkJaW50IGluZGV4ID0gbGliRnVsbFBhdGguaW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIsIDIpOwotCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCWlzVmFsaWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCWlmICh1bmNQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCQkJLy8gbXVzdCBzcGVjaWZ5IGEgdmFsaWQgcGF0aAotCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gdGhlIHRvcCBsZXZlbCBwYXRoIG11c3QgYmUgdmFsaWQKLQkJCQkJaW5kZXggPSBsaWJGdWxsUGF0aC5pbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhciwgaW5kZXggKyAxKTsKLQkJCQkJaWYgKGluZGV4IDwgMCkgewotCQkJCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdW5jUGF0aCA9IGxpYkZ1bGxQYXRoLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCX0KLQotCQkJCQlGaWxlIGYgPSBuZXcgRmlsZSh1bmNQYXRoKTsKLQkJCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghaXNWYWxpZCkgewotCQkJCS8vIG5vIG5ldyByZXNvdXJjZSBzdHJpbmcsIHdhaXQgbGF0ZXIKLQkJCQkvLyByZXR1cm4gbmV3IFN0YXR1cyhTdGF0dXMuRVJST1IsCi0JCQkJLy8gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SWQoKSwgMSwgIkludmFsaWQgcGF0aCIsIG51bGwpOwotCQkJCXJldHVybiBFTVBUWV9NRVRIT0RfTElCUkFSWV9QQVRIX1NUQVRVUzsKLQkJCX0KLQkJfQotCi0JCS8vIENoZWNrIGZvciBwcmVzZW5jZSBvZiBhIC5wcm9qZWN0IGZpbGUuCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJZGVzY3JpcHRpb24gPSBSZXNvdXJjZXNQbHVnaW4KLQkJCQkJLmdldFdvcmtzcGFjZSgpCi0JCQkJCS5sb2FkUHJvamVjdERlc2NyaXB0aW9uKAotCQkJCQkJCW5ldyBQYXRoKGxpYkZ1bGxQYXRoICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkJCSsgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpKTsKLQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJLy8gSWYgYSAucHJvamVjdCBmaWxlIGRvZXMgbm90IGV4aXN0cywgdXNlIGl0IHRvIHZhbGlkYXRlIHRoZSBwYXRoLgotCQkvLyBvbmx5IGNhbGwgdmFsaWRhdGVQcm9qZWN0TG9jYXRpb24gaWYgcGF0aCBpcyBub3Qgb24gd29ya3NwYWNlCi0JCS8vIGZvciBzb21lIHJlYXNvbiwgdmFsaWRhdGVQcm9qZWN0TG9jYXRpb24gb25seSB3b3JrcyBvbiBwYXRocyBub3Qgb24KLQkJLy8gdGhlIHdvcmtzcGFjZQotCQlpZiAoUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKG5ldyBQYXRoKGxpYkZ1bGxQYXRoKSkpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZVV0aWwuZmluZFByb2plY3QobGliRnVsbFBhdGgpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQlsaWJQYXRoLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlUHJvamVjdExvY2F0aW9uKHByb2plY3QsCi0JCQkJbmV3IFBhdGgobGliRnVsbFBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgYSBtZXRob2QgbGlicmFyeSBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBwYXRoIGlzIGEgdmFsaWQgbWV0aG9kIGxpYnJhcnkKLQkgKiAgICAgICAgIGZvbGRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpc1ZhbGlkTGlicmFyeShTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaXNWYWxpZExpYnJhcnkocGF0aCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGxpYnJhcnkgbmVlZHMgdG8gYmUgdXBncmFkZWQgdG8gYSBuZXcgZm9ybWF0LgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgbGlicmFyeSBuZWVkcyB0byBiZSB1cGdyYWRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlVcGdyYWRlUmVxdWlyZWQoU3RyaW5nIHBhdGgsCi0JCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJcmV0dXJuIGlzTWV0aG9kTGlicmFyeVVwZ3JhZGVSZXF1aXJlZChwYXRoLAotCQkJCVhNSUxpYnJhcnlNYW5hZ2VyLkxJQlJBUllfWE1JLCBpbmZvKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5VXBncmFkZVJlcXVpcmVkKFN0cmluZyBwYXRoLAotCQkJU3RyaW5nIGxpYlhtaSwgVmVyc2lvblV0aWwuVmVyc2lvbkNoZWNrSW5mbyBpbmZvKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UubWlncmF0aW9uLk1hcHBpbmdVdGlsCi0JCQkJLmNvbnZlcnNpb25SZXF1aXJlZChwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBsaWJYbWksIGluZm8pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgWE1JIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsCi0JCQkJWE1JTGlicmFyeU1hbmFnZXIuTElCUkFSWV9UWVBFLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyBwYXRoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWFyZ3MucHV0KFhNSUxpYnJhcnlNYW5hZ2VyLkFSR19MSUJSQVJZX1BBVEgsIHBhdGgpOwotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5vcGVuTWV0aG9kTGlicmFyeSgKLQkJCQlYTUlMaWJyYXJ5TWFuYWdlci5MSUJSQVJZX1RZUEUsIGFyZ3MpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuTWV0aG9kTGlicmFyeVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwgJiYgbGlicmFyeS5lUmVzb3VyY2UoKSAhPSBudWxsCi0JCQkJJiYgbGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS5pc0ZpbGUoKSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlVXRpbC5maW5kUHJvamVjdChsaWJyYXJ5KTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQl0cnkgewotCQkJCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgc3BlY2lmaWVkIHBhdGggY29udGFpbnMgYSBwbHVnaW4gb3IKLQkgKiBjb25maWcgc3BlYyBleHBvcnQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zUGx1Z2luT3JDb25maWdTcGVjRXhwb3J0RmlsZShTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwYXRoID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBYTUlMaWJyYXJ5TWFuYWdlci5leHBvcnRGaWxlOwotCQlGaWxlIGV4cG9ydEZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJcmV0dXJuIGV4cG9ydEZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrVmVyc2lvbihGaWxlIGZpbGUsCi0JCQlWZXJzaW9uVXRpbC5WZXJzaW9uQ2hlY2tJbmZvIGluZm8pIHsKLQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnJlc3VsdCA+IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlOwotCQkJaWYgKGluZm8udG9vbElELmVxdWFscyhWZXJzaW9uVXRpbC5nZXRQcmltYXJ5VG9vbElEKCkpKSB7Ci0JCQkJbWVzc2FnZSA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMub2xkVG9vbFZlcnNpb25fZXJyX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IFBsYXRmb3JtLmdldFByb2R1Y3QoKS5nZXROYW1lKCksCi0JCQkJCQkJCWluZm8udG9vbFZlcnNpb24sIGZpbGUgfSk7Ci0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMudG9vbFZlcnNpb25NaXNtYXRjaF9lcnJfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKSB9KTsKLQkJCX0KLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRJZCgpLCAwLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9MaWJyYXJ5UHJvY2Vzc29yLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL0xpYnJhcnlQcm9jZXNzb3IudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI0MWE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL0xpYnJhcnlQcm9jZXNzb3IudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTI0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5CYXNpY0NvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklOb3RpZnlDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLnJlc291cmNlLlJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5pdGVtc2ZpbHRlci5GaWx0ZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlZlcnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTW9kZWxTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTWV0aG9kTGlicmFyeVBlcnNpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLklSZWZyZXNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guUmVmcmVzaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLklNZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotCi0vKioKLSAqIE1hbmFnZXMgYSBNZXRob2QgTGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlQcm9jZXNzb3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUF9ESVJUWSA9IDE7Ci0KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlQcm9jZXNzb3IgaW5zdGFuY2UgPSBudWxsOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluOwotCi0JLy8gbWFpbnRhaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjb25maWd1cmF0aW9uCi0JLy8gdXNlciBzaG91bGQgY2FsbCBzZXQvZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSBtZXRob2RzCi0JLy8gcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50Q29uZmlnTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIE1hcCBzYXZlT3B0aW9uczsKLQotCS8vIHByaXZhdGUgTWFwIHNhdmVBc09wdGlvbnM7Ci0JLy8gcHJpdmF0ZSBTZXQgZUNsYXNzZXM7Ci0KLQlwcml2YXRlIExpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8ga2VlcCB0aGUgbGlzdGVuZXJzIHRvIGJlIGRlbGV0ZWQsIGRvIHRoZSBkZWxldGUgYmVmb3JlIGVhY2ggbm90aWZpY2F0aW9uCi0JLy8gYW5kIGVtcHR5IHRoaXMgbGlzdC4KLQkvLyBkb24ndCBkZWxldGUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8KLQkvLyBjaGFuZ2UgdGhlIGxpc3RlbmVyIGxpc3QgYXQgdGhpcyB0aW1lCi0JcHJpdmF0ZSBMaXN0IHRtcF9saXN0ZW5lcnNfdG9iZV9kZWxldGVkID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGlzTXVsdGlwbGVGaWxlcyA9IGZhbHNlOwotCi0JLy8gcHJpdmF0ZSBib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0KLQlib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGluT3BlcmF0aW9uID0gZmFsc2U7Ci0KLQlwcml2YXRlIFZlcnNpb25NYW5hZ2VyIHZlcnNpb25NZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3IgPSBudWxsOzsKLQotCS8vIFJBVExDMDAzODQ1OTggLSBFeHBvcnQ6IEluZmluaXRlIGxvb3AgTnVsbHBvaW50ZXJFeGNlcHRpb24gYWZ0ZXIKLQkvLyBleHBvcnRpbmcgYW5kIHVuY2hlY2tpbmcgcnVwIHBsdWdpbiBpbiBjb25maWd1cmF0aW9uCi0JLy8gYWRkIHRoaXMgZmxhZyB0byB0cmVhdCB0aGUgaW5zdGFuY2UgYXMgc2luZ2xldG9uIGluc3RhY25lIG9yIG5vdAotCS8vIG9ubHkgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBjYW4gZGlzcG9zZSBzaGFyZWQgb2JqZWN0cy4KLQlwcml2YXRlIGJvb2xlYW4gaXNTaW5nbGV0b25JbnN0YW5jZSA9IGZhbHNlOwotCi0JLy8gdGhlIGxvY2sgb24gdGhlIGxpYnJhcnkncyAucHJvamVjdCBmaWxlCi0JcHJpdmF0ZSBGaWxlTG9jayBsb2NrOwotCi0JLy9UT0RPOiBmaW5kIGEgYmV0dGVyIHdheSB0byBub3RpZnkgdGhlIGNoYW5nZSBpbiBsaWJyYXJ5IGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgY29tbWFuZCBzdGFjayBsaXN0ZW5lcgotCXByaXZhdGUgQ29tbWFuZFN0YWNrTGlzdGVuZXIgY29tbWFuZFN0YWNrTGlzdGVuZXIgPSBuZXcgQ29tbWFuZFN0YWNrTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGNvbW1hbmRTdGFja0NoYW5nZWQoZmluYWwgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJCWlmICghaW5PcGVyYXRpb24pIHsKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkvLyBUcnkgdG8gc2VsZWN0IHRoZSBhZmZlY3RlZCBvYmplY3RzLgotCQkJCQkJLy8KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCQkudW53cmFwKCgoQ29tbWFuZFN0YWNrKSBldmVudC5nZXRTb3VyY2UoKSkKLQkJCQkJCQkJCQkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKSk7Ci0KLQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgQWRkQ29tbWFuZCkgewotCQkJCQkJCQlBZGRDb21tYW5kIGNtZCA9IChBZGRDb21tYW5kKSBtb3N0UmVjZW50Q29tbWFuZDsKLQkJCQkJCQkJRU9iamVjdCBvd25lciA9IGNtZC5nZXRPd25lcigpOwotCQkJCQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCQlvYmpzLmFkZChvd25lcik7Ci0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbW9zdFJlY2VudENvbW1hbmQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCQlvYmpzKTsKLQkJCQkJCQkJCQotCQkJCQkJCQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIHNlbGVjdGlvbiBpZiB0aGUKLQkJCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlCi0JCQkJCQkJCQkvLwotCQkJCQkJCQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQkJCQkJCW9ianMgPSBMaWJyYXJ5VXRpbC5nZXRDb250YWluZWRFbGVtZW50cyhvd25lciwgb2Jqcyk7Ci0JCQkJCQkJCQkJaWYoIW9ianMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJCQkJCWFkZE5ld1BhY2thZ2VzVG9Db25maWd1cmF0aW9uKG9ianMpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCi0JCQkJCQkJfSAKLQkJCQkJCQllbHNlIGlmKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBtb3N0UmVjZW50Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELCBvYmpzKTsJCi0JCQkJCQkJCVBhc3RlRnJvbUNsaXBib2FyZENvbW1hbmQgY21kID0gKChQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kKW1vc3RSZWNlbnRDb21tYW5kKTsKLQkJCQkJCQkJCi0JCQkJCQkJCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlCi0JCQkJCQkJCS8vCi0JCQkJCQkJCWlmIChjbWQuZ2V0T3duZXIoKSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQkJCW9ianMgPSBMaWJyYXJ5VXRpbC5nZXRDb250YWluZWRFbGVtZW50cyhjbWQuZ2V0T3duZXIoKSwgb2Jqcyk7Ci0JCQkJCQkJCQlpZighb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbHNlIGlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIENyZWF0ZUNoaWxkQ29tbWFuZCkgewotCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0gZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoCi0JCQkJCQkJCQkJSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJCQltb3N0UmVjZW50Q29tbWFuZC5nZXRBZmZlY3RlZE9iamVjdHMoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogYWRkIHRoZSBuZXcgcGFja2FnZXMgaW50byB0aGUgY29uZmlndXJhdGlvbnMgaWYgdGhlIHBhcmVudCBpcyBpbiB0aGUKLQkgKiBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIG5ld29ianMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24oQ29sbGVjdGlvbiBuZXdvYmpzKSB7Ci0JCWlmIChuZXdvYmpzID09IG51bGwgfHwgbmV3b2Jqcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpOwotCi0JCXRyeSB7Ci0JCQlFT2JqZWN0IGUsIHBhcmVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBuZXdvYmpzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKQotCQkJCQkJJiYgKChwYXJlbnQgPSBlLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkJCSYmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJCQlPYmplY3QgY29uZmlncyA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBhcmVudCkKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCQkJCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGNvbmZpZwotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQkvLyBwa2dzLmFkZChlKTsKLQkJCQkJCQkJaGVscGVyCi0JCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQkJCQkJCQkJCWUsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWhlbHBlci5zYXZlKCk7Ci0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWhlbHBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyID0gbmV3IElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKCFpbk9wZXJhdGlvbikgewotCQkJCWludCBldmVudFR5cGUgPSBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCk7Ci0JCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6IHsKLQkJCQkJLy8gb25seSBmb3IgYWRkIE1ldGhvZFBsdWdpbiwgb3IgbWF5YmUgc29tZSBvdGhlciBtaXNzaW5nCi0JCQkJCS8vIHN0dWZmIChpZiBhbnkpIHRoYXQgYXJlIG5vdCBjcmVhdGVkIGJ5IGEgY29tbWFuZC4KLQkJCQkJLy8gYW55dGhpbmcgY3JlYXRlZCBieSBhIGNvbW1hbmQgYXJlIGhhbmRsZWQgYnkgdGhlCi0JCQkJCS8vIGNvbW1hbmRTdGFja0xpc3RlbmVyCi0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3QgdiA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAoKG5vdGlmaWVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQkJCQkmJiAodiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZCh2KTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5TRVQ6IHsKLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCWlmIChub3RpZmllciAhPSBudWxsKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQobm90aWZpZXIpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJLy8gbm90ZTogdGhpcyBpcyB0aGUgcmVtb3ZlIG9mIGVsZW1lbnRzIGZyb20gdGhlIHBhcmVudCwKLQkJCQkvLyBpdCBtaWdodCBiZSBhIGRlbGV0ZSBhY3Rpb24sIG9yIG1pZ2h0IGJlIGp1c3QgYSByZW1vdmUgb2YKLQkJCQkvLyByZWZlcmVuY2VzCi0JCQkJLy8gZm9yIGRlbGV0ZSBhY3Rpb24sIHRoZSBkZWxldGVkIGVsZW1lbnQgaGFzIG5vIGNvbnRhaW5lcgotCQkJCS8vIGZvciByZW1vdmVkIHJlZmVyZW5jZSwgdGhlIHJlbW92ZWQgZWxlbWVudCBzdGlsbCBoYXZlIGl0J3MKLQkJCQkvLyBwYXJlbnQKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6IHsKLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCU9iamVjdCBvbGRWYWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXRPbGRWYWx1ZSgpOwotCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgRU9iamVjdAotCQkJCQkJCSYmICgoRU9iamVjdCkgb2xkVmFsdWUpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyB0aGUgZWxlbWVudCBpcyBkZWxldGVkLCBzZW50IGEgZGVsZXRlIGV2ZW50Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG9sZFZhbHVlKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gb3RoZXJ3aXNlLCBpdCdzIGp1c3QgYSByZW1vdmUgb2YgcmVmZXJlbmNlcywgdGhlCi0JCQkJCQkvLyBub3RpZmllciBpcyB0aGUgY2hhbmdlZCBlbGVtZW50Ci0JCQkJCQlhZmZlY3RlZE9iamVjdHMuYWRkKG5vdGlmaWVyKTsKLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkVfTUFOWTogewotCQkJCQlMaXN0IG9sZFZhbHVlID0gbmV3IEFycmF5TGlzdCgoQ29sbGVjdGlvbikgbm90aWZpY2F0aW9uCi0JCQkJCQkJLmdldE9sZFZhbHVlKCkpOwotCQkJCQlBcnJheUxpc3QgZGVsZXRlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlBcnJheUxpc3QgcmVtb3ZlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmICghb2xkVmFsdWUuaXNFbXB0eSgpKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRWYWx1ZS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCQkJCQkJaWYgKCgoRU9iamVjdCkgZWxlbWVudCkuZUNvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlyZW1vdmVkUmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFkZWxldGVkRWxlbWVudHMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyB0aGUgZWxlbWVudCBpcyBkZWxldGVkLCBzZW50IGEgZGVsZXRlIGV2ZW50Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzKTsKLQkJCQkJfQotCQkJCQlpZiAoIXJlbW92ZWRSZWZlcmVuY2VzLmlzRW1wdHkoKSkgewotCQkJCQkJLy8gb3RoZXJ3aXNlLCBpdCdzIGp1c3QgYSByZW1vdmUgb2YgcmVmZXJlbmNlcywgdGhlCi0JCQkJCQkvLyBub3RpZmllciBpcyB0aGUgY2hhbmdlZCBlbGVtZW50Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyQWRkZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgQWRhcHRlciBsaWJDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RmVhdHVyZUlEKE1ldGhvZExpYnJhcnkuY2xhc3MpKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW47Ci0JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKAotCQkJCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQlwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBtc2cuZ2V0T2xkVmFsdWUoKTsKLQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZSgKLQkJCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCXBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZSgKLQkJCQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci0KLQlwcml2YXRlIEFkYXB0ZXIgcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVECi0JCQkJCSYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJLy8gZGlydHkgPSB0cnVlOwotCQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShtc2cuZ2V0Tm90aWZpZXIoKSwgUFJPUF9ESVJUWSk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcHJvcENoYW5nZUxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQotCXByaXZhdGUgSVJlZnJlc2hMaXN0ZW5lciByZWZyZXNoTGlzdGVuZXIgPSBuZXcgSVJlZnJlc2hMaXN0ZW5lcigpIHsKLQotCQlwdWJsaWMgdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQkJaGFuZGxlUmVmcmVzaEV2ZW50KGV2ZW50KTsKLQkJfQotCQkKLQl9OwotCi0JcHVibGljIHN0YXRpYyBMaWJyYXJ5UHJvY2Vzc29yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChMaWJyYXJ5UHJvY2Vzc29yLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeVByb2Nlc3NvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWZyZXNoRXZlbnQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQlpZihMb2cuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGlicmFyeVByb2Nlc3Nvci5oYW5kbGVSZWZyZXNoRXZlbnQoKSIpOyAvLyROT04tTkxTLU4kCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgcmVmcmVzaGVkIHJlc291cmNlczogIiArIGV2ZW50LmdldFJlZnJlc2hlZFJlc291cmNlcygpKTsKLQkJfQotCQlpZighZXZlbnQuZ2V0VW5sb2FkZWRPYmplY3RzKCkuaXNFbXB0eSgpKSB7Ci0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5jbGVhblVwKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpYnJhcnlQcm9jZXNzb3IoKSB7Ci0JCWluaXQoKTsKLQotCQkvLyB0aGlzIGlzIHRoZSBtYWluIGluc3RhbmNlLCB3aWxsIGJlIHRyZWF0ZWQgYXMgc2luZ2xldG9uCi0JCWlzU2luZ2xldG9uSW5zdGFuY2UgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBMaWJyYXJ5UHJvY2Vzc29yKFJlc291cmNlIHJlcykgewotCQl0aGlzKCk7Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJc2V0UmVzb3VyY2UocmVzKTsKLQkJfQotCi0JCWlzU2luZ2xldG9uSW5zdGFuY2UgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGNvbnN0cnVjdCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgaWYgeW91IHdhbnQgdG8gbWFpbnRhaW4geW91ciBvd24KLQkgKiBMaWJyYXJ5UHJvY2Vzc29yLCBzdWNoIGFzIHdoZW4gZm9yIGxpYnJhcnkgaW1wb3J0aW5nIG9yIGV4cG9ydGluZy4KLQkgKiBPdGhlcndpc2UsIGNhbGwgdGhlIHN0YXRpYyBnZXRJbnN0YW5jZSgpIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUgc2luZ2xldG9uCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoCi0JICovCi0JcHVibGljIExpYnJhcnlQcm9jZXNzb3IoU3RyaW5nIGxpYnJhcnlQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcygpOwotCQlvcGVuTGlicmFyeShsaWJyYXJ5UGF0aCk7Ci0KLQkJaXNTaW5nbGV0b25JbnN0YW5jZSA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGwpIHsKLQkJcHJvcENoYW5nZUxpc3RlbmVycy5hZGQobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsKSB7Ci0JCXByb3BDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGwpOwotCX0KLQotCS8qKgotCSAqIEZpcmVzIGEgcHJvcGVydHkgY2hhbmdlZCBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlJZAotCSAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoZmluYWwgT2JqZWN0IHNvdXJjZSwgZmluYWwgaW50IHByb3BlcnR5SWQpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBwcm9wQ2hhbmdlTGlzdGVuZXJzLmdldExpc3RlbmVycygpOwotCQlmb3IgKGludCBuWCA9IDA7IG5YIDwgYXJyYXkubGVuZ3RoOyBuWCsrKSB7Ci0JCQlmaW5hbCBJUHJvcGVydHlMaXN0ZW5lciBsID0gKElQcm9wZXJ0eUxpc3RlbmVyKSBhcnJheVtuWF07Ci0KLQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJCi0JCQkvLyB0aHJlYWQKLQkJCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0JCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbC5wcm9wZXJ0eUNoYW5nZWQoc291cmNlLCBwcm9wZXJ0eUlkKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaWJyYXJ5TGlzdGVuZXJzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0KLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCB8fCBsaWJyYXJ5LmVSZXNvdXJjZSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGlmKCFsaWJyYXJ5LmVBZGFwdGVycygpLmNvbnRhaW5zKGxpYkNoYW5nZWRMaXN0ZW5lcikpIHsKLQkJLy8gbGlicmFyeS5lQWRhcHRlcnMoKS5hZGQobGliQ2hhbmdlZExpc3RlbmVyKTsKLQkJLy8gfQotCQlpZiAoIWxpYnJhcnkuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuY29udGFpbnMocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5jb250YWlucygKLQkJCQkJcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTGlicmFyeUxpc3RlbmVycygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCi0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBsaWJyYXJ5LmVBZGFwdGVycygpLnJlbW92ZShsaWJDaGFuZ2VkTGlzdGVuZXIpOwotCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7Ci0JCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkICh0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZCkgewotCQkJLy8gZGVsYXkgdGhlIHJlbW92ZSB0aWxsIGEgbm90aWZpY2F0aW9uIGlzIHJlcXVlc3RlZAotCQkJaWYgKCF0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQl0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgaW50IG9wdGlvbiwKLQkJCWZpbmFsIENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlsb2FkZWQgPSB0cnVlOwotCi0JCXRyeSB7Ci0JCQkvLyByZW1vdmUgdGhlIGxpc3RlbmVycyB0byBiZSBkZWxldGVkCi0JCQlpZiAodG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuc2l6ZSgpID4gMCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB0bXBfbGlzdGVuZXJzX3RvYmVfZGVsZXRlZC5pdGVyYXRvcigpOyBpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGwgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobCkpIHsKLQkJCQkJCWxpc3RlbmVycy5yZW1vdmUobCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdG1wX2xpc3RlbmVyc190b2JlX2RlbGV0ZWQuY2xlYXIoKTsKLQkJCX0KLQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycywKLQkJCS8vIG5vdGUsIHRoZSBzaXplIG1heSBjaGFuZ2Ugc2luY2Ugbm90aWZ5IGEgbGlzdGVuZXIgbWF5IGNhdXNlZCBuZXcKLQkJCS8vIGxpc3RlbmVycyBiZWluZyBhZGRlZAotCQkJLy8gdGhvc2UgbmV3IGxpc3RlbmVycyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gd2UKLQkJCS8vIGFyZSBvawotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBsaXN0ZW5lcnMuc2l6ZSgpKSB7Ci0JCQkJZmluYWwgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChJTGlicmFyeUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcnMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJLy8gc2luY2UgdGhpcyB3aWxsIGNhdXNlIFVJIHVwZGF0ZSwgd2hpY2ggbXVzdCBiZSBleGVjdXRlZAotCQkJCQkvLyBpbiB0aGUgVUkgdGhyZWFkCi0JCQkJCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0KLQkJCQkJLy8gZXhlY3V0ZSBpdCBpbiBzeW5jIG1vZGUsIG90aGVyd2lzZSBtYXkgY2F1c2UgcHJvYmxlbQotCQkJCQkvLyBzaW5jZSB0aGUgbm90aWZpY2F0aW9uIG1pZ2h0IGJlIGV4ZWN1dGVkIHRvbyBsYXRlLgotCQkJCQkvLyBmb3IgZXhhbXBsZSwgYWZ0ZXIgdGhlIGxpc3RlbmVyIG9iamVjdCBpcyBkaXNwb3NlZAotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJbGlzdGVuZXIubGlicmFyeUNoYW5nZWQob3B0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQkJaSsrOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luT3BlcmF0aW9uKCkgewotCQlpbk9wZXJhdGlvbiA9IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZE9wZXJhdGlvbigpIHsKLQkJaW5PcGVyYXRpb24gPSBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgdmFsaWQgaW4gdGhlIGN1cnJlbnQgcmVzb3VyY2Ugc2V0Ci0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmKG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lSXNQcm94eSgpKSB7Ci0JCQlFT2JqZWN0IGUgPSBSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkucmVzb2x2ZShvYmplY3QpOwotCQkJcmV0dXJuIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudAotCQkJCQkmJiAhZS5lSXNQcm94eSgpCi0JCQkJCSYmIFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShlKSA9PSBnZXRMaWJyYXJ5KCkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgbGlicmFyeSdzIHByb2plY3QgaXMgc3RpbGwgb3Blbi4gSWYgbm90LCBvcGVuIGl0Ci0JICovCi0JLyoKLQlwdWJsaWMgYm9vbGVhbiBlbnN1cmVMaWJyYXJ5UHJvamVjdE9wZW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0TGlicmFyeSgpOwotCQlpZihsaWIgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJqID0gUmVzb3VyY2VVdGlsLmZpbmRQcm9qZWN0KGxpYik7Ci0JCQlpZihwcmogIT0gbnVsbCAmJiAhcHJqLmlzT3BlbigpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJqLm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkqLwotCQotCXB1YmxpYyB2b2lkIG9wZW5MaWJyYXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvcGVuTGlicmFyeSA9IGdldExpYnJhcnlSb290UGF0aCgpLmdldEFic29sdXRlUGF0aCgpCi0JCQkJKyBGaWxlLnNlcGFyYXRvciArICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9wZW5MaWJyYXJ5ICE9IG51bGwgJiYgIW9wZW5MaWJyYXJ5LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb3BlbkxpYnJhcnkob3BlbkxpYnJhcnkpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgb3BlbkxpYnJhcnkoU3RyaW5nIGxpYnJhcnlQYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWJlZ2luT3BlcmF0aW9uKCk7Ci0JCQkKLQkJCS8vIG9wZW4gdGhlIG1ldGhvZCBsaWJyYXJ5IGFzIGEgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlIHNvIGl0IHdpbGwKLQkJCS8vIHNob3cgdXAgaW4gdGhlIFJlc291cmNlIHZpZXcuCi0JCQkvLwotCQkJRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShsaWJyYXJ5UGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJCi0JCQkvLyBvbmx5IGNsb3NlIHByZXZpb3VzIGxpYnJhcnkgaWYgdGhlIG5ldyBsaWJyYXJ5J3MgcHJvamVjdCB3YXMKLQkJCS8vIG9wZW5lZCBzdWNjZXNzZnVsbHkKLQkJCS8vIGNsb3NlIHByZXZpb3VzIGxpYnJhcnkncyBwcm9qZWN0IG9ubHkgaWYgaXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlCi0JCQkvLyBuZXcgb25lCi0JCQljbG9zZU9wZW5lZExpYnJhcnkoKTsKLQotCQkJLy8gbG9jayB0aGUgbGlicmFyeQotCQkJLy8KLQkJCWxvY2tMaWJyYXJ5KGxpYkRpcik7Ci0KLQkJCVJlc291cmNlVXRpbC5vcGVuKGxpYkRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgbnVsbCk7Ci0KLQkJCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9ICgoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWFzc2lnbkxpYnJhcnkocmVzb3VyY2VTZXQubG9hZExpYnJhcnkobGlicmFyeVBhdGgpKTsKLQotCQkJSVN0YXR1cyBzdGF0dXM7Ci0JCQlpZiAoIXJlc291cmNlU2V0Lmhhc1VucmVzb2x2ZWRQcm94eSgpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IExpYnJhcnlSZXNvdXJjZXMKLQkJCQkJCS5nZXRTdHJpbmcoIkxpYnJhcnkudW5yZXNvbHZlZFByb3h5RXJyb3IucmVhc29uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRJZCgpLCAwLCBtc2csIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCi0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVELCBudWxsKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gZmluYWxseSB7Ci0JCQllbmRPcGVyYXRpb24oKTsKLQotCQkJLy8gZGlydHkgPSBmYWxzZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZShnZXRMaWJyYXJ5KCksIFBST1BfRElSVFkpOwotCi0JCQkvLyBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihudWxsKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQXNzaWducyBsaWJyYXJ5IHRvIGEgbmV3IHZhbHVlIGFuZCBhdHRhY2ggdGhlIGNoYW5nZSBsaXN0ZW5lcnMgdG8gaXQuCi0JICogCi0JICogQHBhcmFtIGxpYgotCSAqLwotCXByaXZhdGUgdm9pZCBhc3NpZ25MaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXJlbW92ZUxpYnJhcnlMaXN0ZW5lcnMoKTsKLQkJYWRkTGlicmFyeUxpc3RlbmVycygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld0xpYnJhcnkoU3RyaW5nIGxpYnJhcnlOYW1lLCBTdHJpbmcgbGlicmFyeVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJY2xvc2VPcGVuZWRMaWJyYXJ5KCk7Ci0KLQkJCS8vIGlzTXVsdGlwbGVGaWxlcyA9IGJNdWx0aXBsZTsKLQkJCWJlZ2luT3BlcmF0aW9uKCk7Ci0KLQkJCUZpbGUgbGliX3BhdGggPSBuZXcgRmlsZShsaWJyYXJ5UGF0aCk7Ci0JCQlsaWJyYXJ5UGF0aCA9IGxpYl9wYXRoLmdldEFic29sdXRlUGF0aCgpOwotCi0JCQkvLyBvcGVuIHRoZSBtZXRob2QgbGlicmFyeSBhcyBhIHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZSBzbyBpdCB3aWxsCi0JCQkvLyBzaG93IHVwIGluIHRoZSBSZXNvdXJjZSB2aWV3LgotCQkJUmVzb3VyY2VVdGlsLm9wZW4obGlicmFyeVBhdGgsIG51bGwpOwotCi0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJTW9kZWxTdG9yYWdlLm5ld0xpYnJhcnkocmVzb3VyY2VTZXQsIGxpYnJhcnlOYW1lLCBsaWJyYXJ5UGF0aCwgdHJ1ZSk7Ci0JCQlhc3NpZ25MaWJyYXJ5KHJlc291cmNlU2V0LmdldE1ldGhvZExpYnJhcnkoKSk7Ci0KLQkJCS8vIGxvY2sgdGhlIGxpYnJhcnkKLQkJCWxvY2tMaWJyYXJ5KGxpYl9wYXRoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuZE9wZXJhdGlvbigpOwotCQkJLy8gc2V0RGlydHkodHJ1ZSk7Ci0JCQkvLyBzZXRDdXJyZW50Q29uZmlndXJhdGlvbihudWxsKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DUkVBVEVELCBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBnaXZlbiByZXNvdXJjZSBpZiBpdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBvcGVuIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJaWYgKHJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmNvbnRhaW5zKHJlc291cmNlKSkgewotCQkJcmVzb3VyY2VTZXQuc2F2ZShyZXNvdXJjZSwgc2F2ZU9wdGlvbnMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZUxpYnJhcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlkb1NhdmUoc2F2ZU9wdGlvbnMpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlKGxpYnJhcnksIFBST1BfRElSVFkpOwotCi0JCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fU0FWRUQsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG9wZW4gbGlicmFyeSB1bmRlciBhIG5ldyBsb2NhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuZXdEaXIKLQkgKiAgICAgICAgICAgIGRpcmVjdG9yeSB0byBzYXZlIHRoZSBvcGVuIGxpYnJhcnkgdG8KLQkgKiBAcGFyYW0gcmVnZW5lcmF0ZUdVSUQKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIHJlZ2VuZXJhdGUgR1VJRCBmb3IgYWxsIE1ldGhvZEVsZW1lbnRzIGluIHRoZSBvcGVuCi0JICogICAgICAgICAgICBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2F2ZUxpYnJhcnlBcyhTdHJpbmcgbmV3RGlyLCBib29sZWFuIHJlZ2VuZXJhdGVHVUlELAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG9sZExpYkRpciA9IGdldExpYnJhcnlSb290UGF0aCgpCi0JCQkJLmdldEFic29sdXRlUGF0aCgpOwotCi0JCS8vIGNyZWF0ZSBuZXcgSVByb2plY3QKLQkJUmVzb3VyY2VVdGlsLm9wZW4obmV3RGlyLCBtb25pdG9yKTsKLQotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBnZXRMaWJyYXJ5KCkKLQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZUFzKG5ld0RpciwgcmVnZW5lcmF0ZUdVSUQsIG1vbml0b3IpOwotCi0JCS8vIGhhbmRsZSBhdHRhY2htZW50cyBoZXJlCi0JCUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uY29weUF0dGFjaG1lbnRzTGlicmFyeShvbGRMaWJEaXIsIG5ld0RpciwKLQkJCQludWxsLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeVBhdGgKLQkgKiBAcGFyYW0gYk11bHRpcGxlCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVMaWJyYXJ5QXMoU3RyaW5nIGxpYnJhcnlQYXRoLCBib29sZWFuIGJNdWx0aXBsZSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXNvdXJjZSByZXMgPQotCQkvLyAoKFJlc291cmNlKWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOwotCQkvLyByZXMuc2V0VVJJKFVSSS5jcmVhdGVGaWxlVVJJKGxpYnJhcnlQYXRoKSk7Ci0JCS8vIHJlcy5zZXRNb2RpZmllZCh0cnVlKTsKLQkJLy8KLQkJLy8gc2V0U2F2ZUFzTXVsdGlwbGVGb2xkZXIoYk11bHRpcGxlKTsKLQkJLy8gICAgICAgIAkKLQkJLy8gZG9TYXZlKHNhdmVBc09wdGlvbnMpOwotCQkvLyBzZXREaXJ0eShmYWxzZSk7Ci0JCS8vIGlzTXVsdGlwbGVGaWxlcyA9IGJNdWx0aXBsZTsKLQkJLy8gICAgICAgIAotCQkvLyBub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fU0FWRUQsIG51bGwpOwotCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSZXNvdXJjZShSZXNvdXJjZSByZXMpIHsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKSBlZGl0aW5nRG9tYWluCi0JCQkJCS5nZXRSZXNvdXJjZVNldCgpOwotCQkJcmVzb3VyY2VTZXQucmVzZXQoKTsKLQkJCXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmFkZChyZXMpOwotCQkJYXNzaWduTGlicmFyeShyZXNvdXJjZVNldC5nZXRNZXRob2RMaWJyYXJ5KCkpOwotCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXNvdXJjZSBnZXRMaWJyYXJ5UmVzb3VyY2UoKSB7Ci0JCUxpc3QgcmVzID0gZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0JCWlmIChyZXMuc2l6ZSgpID4gMCkgewotCQkJcmV0dXJuIChSZXNvdXJjZSkgcmVzLmdldCgwKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldExpYnJhcnkoKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gZ2V0TGlicmFyeVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldENvbnRlbnRzKCkuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQlyZXR1cm4gKE1ldGhvZExpYnJhcnkpIG87Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRMaWJyYXJ5VVJJKCkgewotCQlSZXNvdXJjZSBzYXZlZFJlc291cmNlID0gZ2V0TGlicmFyeVJlc291cmNlKCk7Ci0JCWlmIChzYXZlZFJlc291cmNlICE9IG51bGwpIHsKLQkJCXJldHVybiBzYXZlZFJlc291cmNlLmdldFVSSSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRSZWxhdGl2ZVVSSShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJVVJJIGxpYlVSSSA9IGdldExpYnJhcnlVUkkoKTsKLQkJVVJJIGVsZW1ldG5VUkkgPSBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQlVUkkgcmVsVXJpID0gZWxlbWV0blVSSS5kZXJlc29sdmUobGliVVJJKTsKLQotCQlyZXR1cm4gcmVsVXJpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWFuYWdlcigpIHsKLQkJLy8gbm8gRWxlbWVudExheW91dE1hbmFnZXIgaWQgbGlicmFyeSBpcyBub3QgbG9hZGVkCi0JCWlmIChsYXlvdXRNZ3IgPT0gbnVsbCkgewotCQkJaWYgKGdldExpYnJhcnkoKSAhPSBudWxsKSB7Ci0JCQkJbGF5b3V0TWdyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGF5b3V0TWdyOwotCX0KLQotCS8qCi0JcHVibGljIFZlcnNpb25NYW5hZ2VyIGdldFZlcnNpb25NYW5hZ2VyKCkgewotCQlpZiAodmVyc2lvbk1nciA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAodmVyc2lvbk1nciA9PSBudWxsKSB7Ci0JCQkJCXZlcnNpb25NZ3IgPSBuZXcgVmVyc2lvbk1hbmFnZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZlcnNpb25NZ3I7Ci0JfQotCSovCi0KLQlwdWJsaWMgdm9pZCBzZXRMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbmV3TGliKSB7Ci0JCWFzc2lnbkxpYnJhcnkobmV3TGliKTsKLQkJUmVzb3VyY2UgcmVzID0gKFJlc291cmNlKSBnZXRFZGl0aW5nRG9tYWluKCkuZ2V0UmVzb3VyY2VTZXQoKQotCQkJCS5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCXJlcy5nZXRDb250ZW50cygpLmFkZChuZXdMaWIpOwotCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTE9BREVELCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0KCkgewotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFKSkgewotCQkJCQkJCXNhdmVPcHRpb25zLnB1dCgKLQkJCQkJCQkJCU11bHRpRmlsZVhNSVNhdmVJbXBsLkJBQ0tfVVBfQkVGT1JFX1NBVkUsCi0JCQkJCQkJCQlldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCX0gZWxzZSBpZiAoZXZlbnQKLQkJCQkJCQkJLmdldFByb3BlcnR5KCkKLQkJCQkJCQkJLmVxdWFscygKLQkJCQkJCQkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpKSB7Ci0JCQkJCQkJc2F2ZU9wdGlvbnMKLQkJCQkJCQkJCS5wdXQoCi0JCQkJCQkJCQkJCU11bHRpRmlsZVhNSVNhdmVJbXBsLkRJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCQkJCQkJCQlldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBkZWZhdWx0IGVkaXRpbmcgZG9tYWluIGZvciBsaWJyYXJ5IG9wZXJhdGlvbgotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgUmVmbGVjdGl2ZUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBuZXcgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgKLQkJCQlmYWN0b3JpZXMpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tbWFuZCBzdGFjayB0aGF0IHdpbGwgbm90aWZ5IHRoaXMgZWRpdG9yIGFzIGNvbW1hbmRzIGFyZQotCQkvLyBleGVjdXRlZC4KLQkJQmFzaWNDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrID0gbmV3IEJhc2ljQ29tbWFuZFN0YWNrKCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBlZGl0aW5nIGRvbWFpbiB3aXRoIGEgc3BlY2lhbCBjb21tYW5kIHN0YWNrLgotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBuZXcgTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQotCQlyZXNvdXJjZVNldC5hZGRSZWZyZXNoTGlzdGVuZXIocmVmcmVzaExpc3RlbmVyKTsKLQkJUmVmcmVzaEpvYi5nZXRJbnN0YW5jZSgpLnNldFJlc291cmNlU2V0KHJlc291cmNlU2V0KTsKLQotCQlzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQlib29sZWFuIGIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9CQUNLX1VQX0JFRk9SRV9TQVZFKTsKLQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkJBQ0tfVVBfQkVGT1JFX1NBVkUsIEJvb2xlYW4KLQkJCQkudmFsdWVPZihiKSk7Ci0JCWIgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKAotCQkJCVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQlCb29sZWFuLnZhbHVlT2YoYikpOwotCi0JCWVkaXRpbmdEb21haW4gPSBuZXcgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKGFkYXB0ZXJGYWN0b3J5LAotCQkJCWNvbW1hbmRTdGFjaywgcmVzb3VyY2VTZXQpOwotCi0JCS8vIENyZWF0ZSBuZXcgSUNvbnRlbnREZXNjcmlwdGlvblBlcnNpc3RlciBhbmQgc2V0IGl0IHRvIHRoZQotCQkvLyBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5IGZvciB1c2UuCi0JCS8vCi0JCUlNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGNvbnRlbnREZXNjUGVyc2lzdGVyID0gbmV3IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKTsKLQkJQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCS5zZXRNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKGNvbnRlbnREZXNjUGVyc2lzdGVyKTsKLQotCQlDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LnNldEZpbGVNYW5hZ2VyKEZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpOwotCi0JCXJlZ2lzdGVyRWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1NhdmUoTWFwIG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoTG9nLkRFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNhdmUgb3B0aW9uczogIiArIG9wdGlvbnMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBMaXN0IHJlbW92ZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gRmlsZSBsaWJEaXIgPSBuZXcKLQkJLy8gRmlsZSgoKFJlc291cmNlKWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0KLQkJdHJ5IHsKLQkJCWJlZ2luT3BlcmF0aW9uKCk7Ci0JCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSAoKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgZWRpdGluZ0RvbWFpbgotCQkJCQkuZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkvLyBTYXZlIHRoZSByZXNvdXJjZShzKQotCQkJLy8KLQkJCXJlc291cmNlU2V0LnNhdmUob3B0aW9ucyk7Ci0KLQkJCSgoQmFzaWNDb21tYW5kU3RhY2spIGVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpLnNhdmVJc0RvbmUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgZXhjZXB0aW9uOwotCQl9IGZpbmFsbHkgewotCQkJZW5kT3BlcmF0aW9uKCk7Ci0KLQkJfQotCX0KLQotCS8qCi0JcHVibGljIHZvaWQgZGlzY2FyZENoYW5nZXMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKQotCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCXJlc291cmNlLnNldE1vZGlmaWVkKGZhbHNlKTsKLQkJfQotCX0KLQkqLwotCi0JcHVibGljIGJvb2xlYW4gaXNMaWJyYXJ5TG9hZGVkKCkgewotCQlyZXR1cm4gbG9hZGVkOwotCX0KLQotCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGdldEVkaXRpbmdEb21haW4oKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRNZXRob2RNb2RlbHMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IGdldExpYnJhcnkoKTsKLQkJcmV0dXJuIChsaWJyYXJ5ID09IG51bGwpID8gbmV3IEFycmF5TGlzdCgpIDogbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JfQotCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oU3RyaW5nIGd1aWQpIHsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRNZXRob2RNb2RlbHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIHAgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGd1aWQuZXF1YWxzKHAuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gcDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgcHJvY2VzcyBmYW1pbHkgYnkgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBQcm9jZXNzRmFtaWx5Ci0JICovCi0JcHVibGljIFByb2Nlc3NGYW1pbHkgZ2V0UHJvY2Vzc0ZhbWlseShTdHJpbmcgbmFtZSkgewotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gZ2V0TGlicmFyeSgpOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlMaXN0IGNvbmZpZ3MgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChjb25maWcgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KQotCQkJCQkJJiYgY29uZmlnLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIChQcm9jZXNzRmFtaWx5KSBjb25maWc7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmVnaXN0ZXIgZWR0aW5nIGRvbWFpbiB3aXRoIHRoaXMgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQkvKioKLQkJICogdGhpcyBub3RpZnlzIGFsbCBjaGFuZ2VzLCBub3QganVzdCB0aGUgY29udGVudCBjaGFuZ2UsIG9ubHkgcGljayB0aGUKLQkJICogb25lcyBmb3IgZWxlbWVudCB1cGRhdGVzLiBUaGUgb3RoZXIgb3BlcmF0aW9ucyBhcmUgY29sdmVyZWQgYnkgdGhlCi0JCSAqIENvbW1hbmQgZXZlbnRzCi0JCSAqLwotCQkoKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGRvbWFpbi5nZXRBZGFwdGVyRmFjdG9yeSgpKQotCQkJCS5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCi0JCS8vIEFkZCBhIGxpc3RlbmVyIHRvIHNldCB0aGUgbW9zdCByZWNlbnQgY29tbWFuZCdzIGFmZmVjdGVkIG9iamVjdHMgdG8KLQkJLy8gYmUgdGhlIHNlbGVjdGlvbiBvZiB0aGUgdmlld2VyIHdpdGggZm9jdXMuCi0JCWRvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0ZW5UbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWFkYXB0ZXJGYWN0b3J5LmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0ZW5UbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWNvbW1hbmRTdGFjay5hZGRDb21tYW5kU3RhY2tMaXN0ZW5lcihjb21tYW5kU3RhY2tMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJY29tbWFuZFN0YWNrLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNhdmVPcHRpb25zLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0U2F2ZU9wdGlvbnMoKSB7Ci0JCXJldHVybiBzYXZlT3B0aW9uczsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRMaWJyYXJ5Um9vdFBhdGgoKSB7Ci0JCVVSSSB1cmkgPSB0aGlzLmdldExpYnJhcnlVUkkoKTsKLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHBhdGgpOwotCQkJcmV0dXJuIGYuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kUGx1Z2luKGZpbmFsIE1ldGhvZFBsdWdpbiBtb2RlbCkgewotCi0JCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJCi0JCS8vIHRocmVhZAotCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQlmaW5hbCBFeGNlcHRpb25bXSBleGNlcHRpb25zID0gbmV3IEV4Y2VwdGlvblsxXTsKLQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0TGlicmFyeSgpLmdldE1ldGhvZFBsdWdpbnMoKS5hZGQobW9kZWwpOwotCi0JCQkJSU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IENvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkKLQkJCQkJCS5nZXRNZXRob2RMaWJyYXJ5UGVyc2lzdGVyKCkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIuc2F2ZShnZXRMaWJyYXJ5KCkuZVJlc291cmNlKCkpOwotCQkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCWV4Y2VwdGlvbnNbMF0gPSBlOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJbW9kZWwuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGV4Y2VwdGlvbnNbMF0gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFdyYXBwZWRFeGNlcHRpb24oZXhjZXB0aW9uc1swXSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzL2Rpc2FibGVzIG5vdGlmaWNhdGlvbiBlbnRpcmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkVuYWJsZWQoYm9vbGVhbiBiKSB7Ci0JCWVkaXRpbmdEb21haW4uZ2V0UmVzb3VyY2VTZXQoKS5lU2V0RGVsaXZlcihiKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKSB7Ci0JCXJldHVybiBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCkuZURlbGl2ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGN1cnJlbnQgbGlicmFyeSBpcyB0byBiZSBjbG9zZWQuIGZvciBleGFtcGxlLAotCSAqIHdoZW4geW91IHRyeSB0byBvcGVuIGEgbm90aGVyIGxpYnJhcnkgZm9yIGNyZWF0ZSBhIG5ldyBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgY2xvc2VPcGVuZWRMaWJyYXJ5KCkgewotCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTElCUkFSWV9DTE9TRUQsIG51bGwpOwotCi0JCWlmIChMb2cuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlVzZWQgbWVtb3J5IGJlZm9yZSBjbG9zaW5nIGxpYnJhcnk6ICIgKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gUkFUTEMwMDM4NDU5OCAtIEV4cG9ydDogSW5maW5pdGUgbG9vcCBOdWxscG9pbnRlckV4Y2VwdGlvbiBhZnRlcgotCQkvLyBleHBvcnRpbmcgYW5kIHVuY2hlY2tpbmcgcnVwIHBsdWdpbiBpbiBjb25maWd1cmF0aW9uCi0JCS8vIHNvIGRvbid0IGRpc3Bvc2UgaXQgaWYgbm90IHRoZSBtYWluIHNpbmdsZXRvbiBpbnN0YW5jZQotCQlpZiAoaXNTaW5nbGV0b25JbnN0YW5jZSkgewotCQkJLy8gZGlzcG9zZSBhbGwgaXRlbSBwcm92aWRlcnMKLQkJCS8vCi0JCQlUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5yZXNldCgpOwotCi0JCQkvLyBjbGVhciBmaWx0ZXIgY29uc3RhbnRzIGhhc2hNYXAKLQkJCWlmIChGaWx0ZXJDb25zdGFudHMuaGFzaE1hcCAhPSBudWxsKSB7Ci0JCQkJRmlsdGVyQ29uc3RhbnRzLmhhc2hNYXAuY2xlYXIoKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0aGlzLmxheW91dE1nciAhPSBudWxsKSB7Ci0JCQl0aGlzLmxheW91dE1nci5jbGVhcigpOwotCQl9Ci0KLQotCQkvLyBjbGVhciB0aGUgdGVtcCBsYXlvdXQgCi0JCUxheW91dFJlc291cmNlcy5jbGVhcigpOwotCi0JCS8qCi0JCSAqIGlmICggdGhpcy5kZXBNZ3IgIT0gbnVsbCApIHsgdGhpcy5kZXBNZ3IuY2xlYXIoKTsgfSB0aGlzLmRlcE1nciA9Ci0JCSAqIG51bGw7Ci0JCSAqLwotCi0JCXRoaXMubGF5b3V0TWdyID0gbnVsbDsKLQotCQkvLyB0aGlzLmludmFsaWRHdWlkcy5jbGVhcigpOwotCi0JCU11bHRpRmlsZVJlc291cmNlU2V0SW1wbCByZXNvdXJjZVNldCA9IChNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwpIGVkaXRpbmdEb21haW4KLQkJCQkuZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQlyZXNvdXJjZVNldC5jbGVhckVycm9ycygpOwotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBnZXRMaWJyYXJ5KCk7Ci0KLQkJdW5sb2NrTGlicmFyeSgpOwotCi0JCXJlc291cmNlU2V0LnJlc2V0KCk7Ci0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCi0JCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0JCWlmIChMb2cuREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIlVzZWQgbWVtb3J5IGFmdGVyIGNsb3NpbmcgbGlicmFyeTogIiArIChSdW50aW1lLmdldFJ1bnRpbWUoKS50b3RhbE1lbW9yeSgpIC0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVubG9ja0xpYnJhcnkoKSB7Ci0JCS8vIHJlbGVhc2UgbG9jayBvbiBvbGQgbGliJ3MgcHJvamVjdAotCQl0cnkgewotCQkJaWYgKGxvY2sgIT0gbnVsbCkgewotCQkJCWxvY2sucmVsZWFzZSgpOwotCQkJCWxvY2suY2hhbm5lbCgpLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvY2tzIHRoZSAubG9jayBmaWxlIGluIHRoZSBnaXZlbiBwYXRoLiBDcmVhdGVzIGEgLmxvY2sgZmlsZSBpZiBvbmUgZG9lcwotCSAqIG5vdCBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBwYXRoIHRvIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2NrTGlicmFyeShGaWxlIGxpYkRpckZpbGUpIHsKLQkJRmlsZSBsb2NrRmlsZSA9IG5ldyBGaWxlKGxpYkRpckZpbGUsIFJlc291cmNlVXRpbC5MT0NLX0ZJTEVOQU1FKTsKLQkJbG9jayA9IEZpbGVVdGlsLmxvY2tGaWxlKGxvY2tGaWxlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9YTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL1hNSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I3YjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL1hNSU9wcG9zaXRlRmVhdHVyZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGxvYWRpbmcgb2Ygb3Bwb3NpdGUgZmVhdHVyZXMgZm9yIGEgWE1JLWJhc2VkIG1ldGhvZCBsaWJyYXJ5LgotICogIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUlPcHBvc2l0ZUZlYXR1cmVMb2FkZXIgaW1wbGVtZW50cyBJT3Bwb3NpdGVGZWF0dXJlTG9hZGVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JT3Bwb3NpdGVGZWF0dXJlTG9hZGVyI2xvYWRPcHBvc2l0ZUZlYXR1cmVzKGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKENvbGxlY3Rpb24gZWxlbWVudHMpIHsKLQkJSGFzaFNldCBvcHBvc2l0ZUZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSGFzaFNldCBkZWxldGVkR1VJRHMgPSBuZXcgSGFzaFNldCgpOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwgcmVzb3VyY2VTZXQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gKE9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlpZihvIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvOwotCQkJCWlmKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQkJCQlSZXNvdXJjZVNldCByc2V0OwotCQkJCQlpZihyZXNvdXJjZSA9PSBudWxsIHx8ICEoKHJzZXQgPSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKSBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcnNldDsKLQkJCQl9Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGUuZUFsbENvbnRlbnRzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJQ29sbGVjdGlvbiBmZWF0dXJlcyA9ICgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJCQkJCWlmIChmZWF0dXJlcyAhPSBudWxsCi0JCQkJCQkJCSYmICFmZWF0dXJlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmVzCi0JCQkJCQkJCQkuYWRkQWxsKGZlYXR1cmVzKTsKLQkJCQkJCQlkZWxldGVkR1VJRHMuYWRkKCgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCkKLQkJCQkJCQkJCS5nZXRHdWlkKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBlLmdldE9wcG9zaXRlRmVhdHVyZXMoKTsKLQkJCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCAmJiAhZmVhdHVyZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkQWxsKGZlYXR1cmVzKTsKLQkJCQkJZGVsZXRlZEdVSURzLmFkZChlLmdldEd1aWQoKSk7Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQkKLQkJcmVzb3VyY2VTZXQubG9hZE9wcG9zaXRlRmVhdHVyZXMobmV3IEFycmF5TGlzdChvcHBvc2l0ZUZlYXR1cmVzKSwgZGVsZXRlZEdVSURzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL2ludGVybmFsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3NzY4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBtYW5hZ2luZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNWRlMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS94bWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyBhIFhNSS1iYXNlZCBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3htaS9wcmVmZXJlbmNlcy9YTUlMaWJyYXJ5UHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3ByZWZlcmVuY2VzL1hNSUxpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc2NWRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkveG1pL3ByZWZlcmVuY2VzL1hNSUxpYnJhcnlQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5YTUlMaWJyYXJ5UGx1Z2luOwotCi0vKioKLSAqIFRoZSBYTUwgTWV0aG9kIExpYnJhcnkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1JTGlicmFyeVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0xJQlJBUllfUEFUSCA9ICJkZWZhdWx0TGlicmFyeVBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlTdHJpbmcgZGVmYXVsdExpYnJhcnlQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSAvLyROT04tTkxTLTEkCi0JCQkJLy8gRklYTUUhIEF2b2lkIHVzaW5nIGhhcmQgY29kZWQgY29uc3RhbnQKLQkJCQkrIEZpbGVVdGlsLkZJTEVfU0VQICsgIkVQRiIgLy8kTk9OLU5MUy0xJAotCQkJCSsgRmlsZVV0aWwuRklMRV9TRVAgKyAiTWV0aG9kIExpYnJhcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChERUZBVUxUX0xJQlJBUllfUEFUSCwgZGVmYXVsdExpYnJhcnlQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGxpYnJhcnkgcGF0aCBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRMaWJyYXJ5UGF0aCgpIHsKLQkJcmV0dXJuIFhNSUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygKLQkJCQlERUZBVUxUX0xJQlJBUllfUEFUSCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvLm9wdGlvbnMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2OWQzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgTGlicmFyeSBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTAwMzhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczM2YzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWJyYXJ5LmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmV2ZW50cywKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmRpYWdyYW0sCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQ7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2U7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmFwYWNoZS5hbnQsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmU0MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXNvdXJjZS5saWJyYXJ5LmphciA9IHNyYy8KLW91dHB1dC5saWJyYXJ5LmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGxpYnJhcnkuamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgbGF5b3V0LyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2ljb25zL1JvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvaWNvbnMvUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvaWNvbnMvUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvY3NzL2RlZmF1bHQuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2Nzcy9kZWZhdWx0LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY2OGMwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvY3NzL2RlZmF1bHQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2U6IG5vbmU7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWgxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0KLWgyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTUwJTsKLX0KLQotaDMgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci19Ci0KLWg0LCBoNSwgaDYgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi1hOmxpbmsgewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYTphY3RpdmUgewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hOnZpc2l0ZWQgewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYVtocmVmXTpob3ZlciB7Ci0JY29sb3I6ICNmZjAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLW9sIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlsaXN0LXN0eWxlLXR5cGU6IGRlY2ltYWw7Ci0JbWFyZ2luLWxlZnQ6IDMwcHg7Ci19Ci0KLW9sIGxpIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi11bCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLX0KLQotdWwgbGkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRhYmxlIHsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQ6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7CQotfQotCi10Ym9keSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdmFsaWduOiBiYXNlbGluZTsKLX0KLQotdGggewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotdGQgdWwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbi1ib3R0b206IDBweDsKLQltYXJnaW4tbGVmdDogMzBweDsKLX0KLQotLnBhZ2VUaXRsZSB7Ci0JYmFja2dyb3VuZDogIzk5OTljYzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5wYWdlVGl0bGVTZXBhcmF0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0JcGFkZGluZzogMHB4OwotfQotCi0udGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNWM4MWE3OwotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uYWN0aXZlVGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYzhkN2UzOwotCWNvbG9yOiAjMjkzZDZiOwkKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6bGluaywgYS50YWI6YWN0aXZlLCBhLnRhYjp2aXNpdGVkIHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwkKLX0KLQotLm92ZXJ2aWV3IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctYm90dG9tOiAxMHB4OwotCXBhZGRpbmctbGVmdDogMjBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci19Ci0KLS5vdmVydmlld1RhYmxlIHsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCXdpZHRoOiAxMDAlOwkKLX0KLQotLm92ZXJ2aWV3VGFibGUgdGQgewotCXBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsKLX0KLQotLm92ZXJ2aWV3U2VwYXJhdG9yIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotCXBhZGRpbmc6IDBweDsKLX0KLQotLmV4cGFuZENvbGxhcHNlVGV4dCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCXBhZGRpbmctbGVmdDogNXB4OwotCXBhZGRpbmctcmlnaHQ6IDVweDsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluayB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbms6aG92ZXIgewotCWNvbG9yOiAjMDAwMGZmOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rOnZpc2l0ZWQgewotCWNvbG9yOiAjMzMzMzMzOwotfQotCi0uc2VjdGlvbkhlYWRpbmcgewotCWJhY2tncm91bmQtY29sb3I6ICM5OGIxYzQ7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JY3Vyc29yOiBoYW5kOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zZWN0aW9uQ29udGVudCB7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uc2VjdGlvblRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wLWNvbG9yOiAjY2NjOwotCQotCS8qZG9uJ3QgZGVmaW5lIHBhZGRpbmcgaW4gdGFibGUsIHRoZSBiZWhhdmlvciBpcyBkaWZmZXJlbnQgaW4gSUUgYW5kIGZpcmVmb3guIAotCSBJbiBJRSwgdGhlIHBhZGRpbmcgaXMgYXBwbGllZCBiZWZvcmUgdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGNvbG9yIGlzIGVuZm9yY2VkLgotCSBpbiBmaXJlZm94LCB0aGUgcGFkZGluZyBpcyBhcHBsaWVkIGZpcnN0LCBzbyBsZWF2ZSB0aGUgdGFibGUncyBiYWNrZ3JvdW5kIGludGhlIHBhZGRpbmcgYXJlYS4KLQkgRGVmaW5lIHRoZSBwYWRkaW5nIGluIHRoZSB0YWJsZSBjZWxsIGluc3RlYWQsIHRoaXMgd29ya3MgaW4gYm90aCBJRSBhbmQgbW96aWxsYQotCSAqLwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsJCi0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zZWN0aW9uVGFibGVIZWFkaW5nIHsKLQliYWNrZ3JvdW5kOiAjZWVlOwotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCWNvbG9yOiAjMzMzMzMzOwotCWhlaWdodDogMjA7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMjAlOwotCXBhZGRpbmc6IDEwcHggMTBweCAxMHB4IDEwcHg7CQotCi19Ci0KLS5zZWN0aW9uVGFibGVDZWxsSGVhZGluZyB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCWZvbnQtY29sb3I6ICM2NjY2NjY7Ci0JcGFkZGluZzogMTBweCAxMHB4IDEwcHggMTBweDsKLQotfQotCi0uc2VjdGlvblRhYmxlQ2VsbCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZzogMTBweCAxMHB4IDEwcHggMTBweDsKLQotfQotCi0uc2VjdGlvblRhYmxlU2luZ2xlQ2VsbCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZzogMTBweCAxMHB4IDEwcHggMTBweDsKLX0KLQotLmJyZWFrZG93blRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDFweDsKLQlwYWRkaW5nOiAwcHggMHB4IDBweCAwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB0aCB7Ci0JYmFja2dyb3VuZDogI2VlZTsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLQljb2xvcjogIzMzMzMzMzsKLQloZWlnaHQ6IDIwOwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB0ZCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5kZWZhdWx0VGFibGUgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmc6IDBweCAwcHggMHB4IDBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmRlZmF1bHRUYWJsZSB0ZCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnN1YlNlY3Rpb25IZWFkaW5nIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zdWJTZWN0aW9uQ29udGVudCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWYsIGthbmppMjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLnN0ZXBIZWFkaW5nIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotCWNvbG9yOiAjMjkzZDZiOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zdGVwQ29udGVudCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi0uc3RlcFRhYmxlIHsKLQlib3JkZXItYm90dG9tOiAjOTk5OTk5IHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogIzk5OTk5OSBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjOTk5OTk5IHNvbGlkIDBweDsKLQlib3JkZXItdG9wOiAjOTk5OTk5IHNvbGlkIDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMjBweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMTBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLnN0ZXBUYWJsZSB0ZCB7Ci0JYm9yZGVyOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLnN0ZXBTZXBhcmF0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JcGFkZGluZzogMHB4OwotfQotCi0uYmFja1RvVG9wTGluayB7Ci0JY29sb3I6ICNmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsJCi0JbWFyZ2luOiAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JdGV4dC1hbGlnbjogbWlkZGxlOwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rOmhvdmVyIHsKLQljb2xvcjogIzk2OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJhY2tUb1RvcExpbms6dmlzaXRlZCB7Ci0JY29sb3I6ICM1YzgxYTc7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM3MDgwYjA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogMjVweDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXdpZHRoOiAxMDAlOwotfQotCi0udmVyc2lvbkluZm8gewotCWNvbG9yOiAjNzA4MGIwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDI1cHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnF1b3RlIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5jb2RlU2FtcGxlIHsKLQlmb250LWZhbWlseTogY291cmllcjsKLQlmb250LXNpemU6IDEwcHQ7CQkKLX0KLQotLmVsZW1lbnRMaW5rIHsKLQljb2xvcjogIzAwMDBmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZiwga2FuamkyOwotCWZvbnQtc2l6ZTogMTBwdDsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFR5cGUgewotCWNvbG9yOiAjMDAwMGZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi0uZWxlbWVudExpbmtXaXRoVXNlclRleHQgewotCWNvbG9yOiAjMDAwMGZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmLCBrYW5qaTI7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi0jcmVzdWx0cyB7Ci0gCWJvcmRlci10b3A6IHRoaW4gc29saWQgYmxhY2s7Ci0JbWFyZ2luOiAxMHB4IGF1dG8gMTBweCBhdXRvOwotCW1heC13aWR0aDogNTkwcHg7Ci0JcGFkZGluZzogMTBweDsKLSAgCXBvc2l0aW9uOiByZWxhdGl2ZTsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXdpZHRoOiBleHByZXNzaW9uKChkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLTMwKSsncHgnKTsKLX0KLQotLyoKLS5jb250ZW50VG9vbGJhckljb24gewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQltYXJnaW46IDBweDsKLQlwYWRkaW5nOiAwcHg7CQotfQotCi0uY29udGVudFRvb2xiYXJJY29uIGltZyB7Ci0JY3Vyc29yOiBwb2ludGVyOwotCW1hcmdpbjogMHB4OwotCXBhZGRpbmc6IDBweDsKLQlib3JkZXI6IDBweDsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6bGluayB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS5jb250ZW50VG9vbGJhckljb24gYTphY3RpdmUgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0uY29udGVudFRvb2xiYXJJY29uIGE6dmlzaXRlZCB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS5jb250ZW50VG9vbGJhckljb24gYTpob3ZlciB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uY29udGVudFRvb2xiYXJJY29uIGFbaHJlZl06aG92ZXIgewotCWNvbG9yOiAjZmZmZmZmOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLSovCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9BcnRpZmFjdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzkxMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL0FydGlmYWN0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9EZWxpdmVyYWJsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGZlNjJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9EZWxpdmVyYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvT3V0Y29tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvT3V0Y29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzM4ODIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1JvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZhNGM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9Sb2xlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxODNhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvUm9sZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvVGFzay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvVGFzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzQ2MTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ljb25zL1Rhc2suanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWFjMmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9UYXNrLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9wcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pY29ucy9wcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaWNvbnMvcHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hY3Rpdml0eV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hY3Rpdml0eV9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM5M2U2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYWN0aXZpdHlfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfYWNscy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FjbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzBiNTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfYWNscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2FuYW1kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfYW5hbWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjY2NmU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfYW5hbWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9jbGFzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2NsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4MzUyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZGVzbWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kZXNtZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MGNjOTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kZXNtZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RvYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjlkNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kb2MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kcGtnLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBrZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjZhYTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9kcGtnLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBsbW9kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHBsbW9kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmNThlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2RwbG1vZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2Rzc3ViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHNzdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzdhNmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfZHNzdWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9ldmVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2V2ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5ZjY1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2V2ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW1wbWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9pbXBtZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDA2YWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9pbXBtZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FyX2ludGZjLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW50ZmMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODMxYmExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfaW50ZmMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9wb2MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9wb2MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODA3ZmQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfcG9jLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJfc2lnbmEuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9zaWduYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjAzMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcl9zaWduYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFlNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcnRpZmFjdF9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9hcnRpZmFjdF9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFlNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYXJ0aWZhY3RfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYmFjay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NkZmFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2JhY2tfdG9fdG9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYmFja190b190b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTZkOTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvYmFja190b190b3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ib29rbWFyay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Jvb2ttYXJrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZkNTM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Jvb2ttYXJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2hlY2tsaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY2hlY2tsaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzYWEzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NoZWNrbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9jbG9zZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9jbG9zZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZGQ5NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfY2xvc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jaXJjbGVfb3Blbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9vcGVuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxOGUyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NpcmNsZV9vcGVuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29sbGFwc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb2xsYXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNjU0MWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb2xsYXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjcwMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb21wb3NpdGVyb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29tcG9zaXRlcm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZmE0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb21wb3NpdGVyb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU5NWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYzA4MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2VfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvY29udGVudF9wYWNrYWdlX21lZGl1bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYzA4MWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9jb250ZW50X3BhY2thZ2VfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGlzcGxheV92aWV3cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXNwbGF5X3ZpZXdzX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXZpZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZGl2aWRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOWU3ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kaXZpZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDIwMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZiODE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNmM5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjkwNGVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2MzViMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjdkNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsX3JpZ2h0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG93bl9hcnJvdy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhjNDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZG93bl9hcnJvdy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2VzdGltYXRpb25jb25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDRjM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leGFtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzEwYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZXhwYW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwZmU4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExOGEzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9mYWxzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I2NjVkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZhbHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZm9yd2FyZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2ZvcndhcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVhMWFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZm9yd2FyZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2d1aWRhbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkYW5jZV9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGFuY2VfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvZ3VpZGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOTFlNWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ndWlkbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMDAzYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9pbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9sZWZ0bmF2X21vY2t1cC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2xlZnRuYXZfbW9ja3VwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIxNjU0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL2xlZnRuYXZfbW9ja3VwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWV0aG9kX3BsdWdpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZjMjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWV0aG9kX3BsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL21ldGhvZF9wbHVnaW5fbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWV0aG9kX3BsdWdpbl9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDZjMjc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWV0aG9kX3BsdWdpbl9tZWRpdW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9taWxlc3RvbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9taWxlc3RvbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZmZjk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbmVlZF9pY29uLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvbmVlZF9pY29uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFkMTFjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25lZWRfaWNvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25vX3J1cC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL25vX3J1cC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNmM0MDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ub19ydXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcmFjdGljZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjNDM2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcHJpbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcmludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDIwOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcmludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9wcm9jZXNzX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3NfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY5YTA4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Byb2Nlc3NfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmVwb3J0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcmVwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhMjMxMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JlcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yZXVzYWJsZWFzc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5Nzg4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JldXNhYmxlYXNzZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2FkbWFwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9hZG1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzUxM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2FkbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZhNGM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3JvbGVfbWVkaXVtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZV9tZWRpdW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZhNGM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZV9tZWRpdW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcm9sZWRlc19sZ19kZ20zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjIyZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9yb2xlZGVzX2xnX2RnbTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0MDIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvcnVwMS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDFfYS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3J1cDFfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MjQwMjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9ydXAxX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zYW1wbGVfc2VjdGlvbmhlYWQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zYW1wbGVfc2VjdGlvbmhlYWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTJlODIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2FtcGxlX3NlY3Rpb25oZWFkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3NoaW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWJhNzkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc2hpbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3N0ZXBfc2FtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3RlcF9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y0MDk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3RlcF9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFlNGZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvc3VwcG9ydGluZ21hdGVyaWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1hLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX2VuZC1hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjYzVlNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtaS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9lbmQtaS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTQ0N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfZW5kLWkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWFfaS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtYV9pLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3OTU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtYV9pLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2EuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfYS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTg2N2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfbWlkZGxlLWlfYS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9taWRkbGUtaV9pLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2kuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTg3YjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX21pZGRsZS1pX2kuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YWJfc3BhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE5OGRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RhYl9zcGFjZV9taWRkbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE5YmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFiX3NwYWNlX21pZGRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNDYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90YXNrX21lZGl1bS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tfbWVkaXVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNDYxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tfbWVkaXVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rhc2tkZXNfbGdfZGdtMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmVkNDcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGFza2Rlc19sZ19kZ20zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RlYW1wcm9maWxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmJkN2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVhbXByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWNobmlxdWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZWNobmlxdWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTkxZTViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVjaG5pcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2E3ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90ZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rlcm1kZWZpbml0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVybWRlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGM5ZjI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGVybWRlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlY2EwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19sZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiODljMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RpdGxlYmFja19yaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2xtZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b29sbWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM1NWEyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3Rvb2xtZW50b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3AuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVhY2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wX3NtLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdG9wX3NtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3ZmJhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcF9zbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcGJhcl9tb2NrdXAuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90b3BiYXJfbW9ja3VwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2NjY0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3RvcGJhcl9tb2NrdXAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90cnVlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdHJ1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NGRhMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy90cnVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdV9ib2xkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdV9ib2xkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZjZDVhMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VfYm9sZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3VwX2Fycm93LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdXBfYXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU1Y2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvdXBfYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy93aGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZTQ4ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L2ltYWdlcy93aGl0ZXBhcGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd29ya2Rlc19sZ19kZ20zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvaW1hZ2VzL3dvcmtkZXNfbGdfZGdtMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDRlNWRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9pbWFnZXMvd29ya2Rlc19sZ19kZ20zMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTkwOGM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsODY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1mdW5jdGlvbiBBY3Rpdml0eVRyZWVUYWJsZSgvKlByb2Nlc3NFbGVtZW50UGFnZSovcGFyZW50KSB7Ci10aGlzLnBhcmVudCA9IHBhcmVudDsKLXRoaXMudHJlZV9ub2RlX2NsYXNzICA9ICJ0cmVlTm9kZSI7CS8vICEhISBkb24ndCB0cmFuc2xhdGUgdGhpcyAhISEKLXRoaXMuZXhwYW5kSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUltYWdlID0gbnVsbDsKLXRoaXMuc2hpbUltYWdlID0gbnVsbDsKLXRoaXMud2JzSXRlbUh0bWwgPSBudWxsOwotdGhpcy5pbWFnZVBhdGggPSBudWxsOwotdGhpcy5OT0RFX0NPTExBUFNFRCA9IDA7Ci10aGlzLk5PREVfRVhQQU5ERUQgPSAxOwotdGhpcy5ERUZBVUxUX0VYUEFORF9MRVZFTCA9IDA7IC8vIDAgLSBjb2xsYXBzZSBhbGwsIDEgLSBleHBhbmQgdGhlIGZpcnN0IGxldmVsLCAuLi4sIDk5OTkgLSBpZiB5b3UgaGF2ZSB0aGlzIG1hbnkKLQotfTsKLQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgdHJlZSB0YWJsZQotLy8gdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgaHRtbCBzb3VyY2UgYXJlIGFzIGZvbGxvd3M6Ci0vLyBlYWNoIDxUUiB0YWcgaGFzIGEgdWlucXVlIGlkIGFuZCBhIHBhcmVudElkLgotLyoKLTxoZWFkPgotPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPGxpbmsgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4vY3NzL2RlZmF1bHQuY3NzIiByZWw9IlN0eWxlU2hlZXQiPgotPHNjcmlwdCBzcmM9Ii4vdHJlZXRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLTwvaGVhZD4KLTxib2R5IG9ubG9hZD0iY3JlYXRlVHJlZSgndGQnLCAndHJlZU5vZGUnLCAnLi9pbWFnZXMvJyk7IiA+Ci08dGFibGUgYm9yZGVyPSIxIj4KLTx0ciBpZD0iMSIgcGFyZW50SWQ9IjAiPgotPHRkIGNsYXNzPSJ0cmVlTm9kZSI+Y29sIDEtMTwvdGQ+PHRkPmNvbCAxLTI8L3RkPgotPC90cj4KLQotPHRyIGlkPSIyIiBwYXJlbnRJZD0iMSI+Ci08dGQgY2xhc3M9InRyZWVOb2RlIj5jb2wgMS0xPC90ZD48dGQ+Y29sIDItMjwvdGQ+Ci08L3RyPgotCi08dHIgaWQ9IjMiIHBhcmVudElkPSIxIj4KLTx0ZCBjbGFzcz0idHJlZU5vZGUiPmNvbCAxLTE8L3RkPjx0ZD5jb2wgMi0yPC90ZD4KLTwvdHI+Ci0KLTx0ciBpZD0iNCIgcGFyZW50SWQ9IjAiPgotPHRkIGNsYXNzPSJ0cmVlTm9kZSI+Y29sIDItMTwvdGQ+PHRkPmNvbCAyLTI8L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2JvZHk+Ci0qLwotQVRUUl9ST1dfREFUQV9JTkRFWCA9ICJkYXRhSW5kZXgiOwotQVRUUl9DSElMRF9MT0FERUQgPSAiY2hpbGRMb2FkZWQiOwotQVRUUl9JTkRFTlRfU0laRSA9ICJpbmRlbnRTaXplIjsKLUFUVFJfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKGltZ1BhdGgpCi17Ci0JdGhpcy5pbWFnZVBhdGggPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGgpOwotCXRoaXMuZXhwYW5kSW1hZ2UgPSB0aGlzLmltYWdlUGF0aCArICdleHBhbmQuZ2lmJzsJCi0JdGhpcy5jb2xsYXBzZUltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnY29sbGFwc2UuZ2lmJzsKLQkvL2V4cGFuZEFsbEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnZXhwYW5kX2FsbC5naWYnOwkKLQkvL2NvbGxhcHNlQWxsSW1hZ2UgPSB0aGlzLmltYWdlUGF0aCArICdjb2xsYXBzZV9hbGwuZ2lmJzsKLQkvL2JhY2tUb1RvcEltYWdlID0gdGhpcy5pbWFnZVBhdGggKyAnYmFja190b190b3AuZ2lmJzsKLQl0aGlzLnNoaW1JbWFnZSA9IHRoaXMuaW1hZ2VQYXRoICsgJ2luZGVudC5naWYnOwotCXRoaXMud2JzSXRlbUh0bWwgPSBuZXcgV0JTSXRlbUh0bWwodGhpcywgdGhpcy5pbWFnZVBhdGgpOwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmNyZWF0ZVRyZWUgPSBmdW5jdGlvbih0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7Ci0KLQkvLyBjcmVhdGUgdGhlIHRyZWUgdGFibGUgZmlyc3QKLQl0aGlzLmNyZWF0ZVRhYmxlKCk7Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5jcmVhdGVUYWJsZSA9IGZ1bmN0aW9uKCkgewotCi0JdmFyIGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0cmVlQ29udGVudCIpOwotCWlmICggZGl2ID09IG51bGwgKSByZXR1cm47Ci0JCi0JLy8gY3JlYXRlIHRhYmxlCi0JdmFyIHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVEFCTEUiKTsKLQl0YWJsZS5pZCA9ICJBY3Rpdml0eVRyZWVUYWJsZSI7Ci0JdGFibGUudGl0bGUgPSB0aGlzLmRhdGEudGl0bGU7Ci0JdGFibGUuc3VtbWFyeSA9IHRoaXMuZGF0YS5zdW1tYXJ5OwotCXRhYmxlLmNlbGxzcGFjaW5nID0gIjBweCI7Ci0JdGFibGUuY2VsbHBhZGRpbmcgPSAiMHB4IjsKLQl0YWJsZS5ib3JkZXI9IjBweCI7Ci0JdGFibGUud2lkdGg9IjEwMCUiOwotCXRhYmxlLmJvcmRlcmNvbG9yID0gIiM5OTk5OTkiOwotCXRhYmxlLmNsYXNzTmFtZSA9ICJicmVha2Rvd25UYWJsZSI7Ci0JCi0JLy8gY3JlYXRlIHRhYmxlIGhlYWQKLQkvL3ZhciB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRSIik7Ci0JdmFyIHRyID0gdGFibGUuaW5zZXJ0Um93KHRhYmxlLnJvd3MubGVuZ3RoKTsKLQkKLQl0ci5zZXRBdHRyaWJ1dGUoInZhbGlnbiIsICJ0b3AiKTsKLQkKLQl2YXIgbGVuID0gdGhpcy5kYXRhLmNvbHVtbnMubGVuZ3RoOwotCWZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0JCXZhciBjb2wgPSB0aGlzLmRhdGEuY29sdW1uc1tpXTsKLQkJdmFyIGlkID0gQlNfSURfUFJFRklYICsgY29sWzBdOwotCQl2YXIgYWJiciA9IGNvbFsxXTsKLQkJCi0JCXZhciB0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIlRIIik7CQkKLQkJdGguaWQgPSBpZDsKLQkJdGguYWJiciA9IGFiYnI7Ci0JCXRoLmlubmVySFRNTCA9ICI8c3BhbiBzdHlsZT0nd2hpdGUtc3BhY2U6bm93cmFwOyc+IiArIGNvbFsxXSArICI8L3NwYW4+IjsKLQkJdHIuYXBwZW5kQ2hpbGQodGgpOwotCX0JCQkKLQkKLQkKLQkvL3RhYmxlLmFwcGVuZENoaWxkKHRyKTsKLQlkaXYuYXBwZW5kQ2hpbGQodGFibGUpOwotCQotCS8vIGNyZWF0ZSB0aGUgdG9wIHJvd3MKLQl0aGlzLmNyZWF0ZVRvcGxldmVsUm93cygpOwotCQkKLQkvLyBmb3IgSUUgbmVlZCB0byByZXNldCB0byBmcmVzaCB0aGUgbGF5b3V0Ci0JLy9kaXYuaW5uZXJIVE1MID0gIiIgKyBkaXYuaW5uZXJIVE1MICsgIiI7Ci19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUucHJvY2Vzc1RSID0gZnVuY3Rpb24odHJFbGVtZW50KSB7Ci0KLQl2YXIgaW5kZW50U2l6ZSA9IDA7Ci0JdmFyIHBhcmVudElkID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKTsKLQl2YXIgcGFyZW50VFIgID0gbnVsbDsKLQlpZiAoIHBhcmVudElkICE9ICIiKQotCXsKLQotCQkvLyBjYWNoZSBpdCB0byBiZSBmYXN0ZXIKLQkJcGFyZW50VFIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwYXJlbnRJZCk7Ci0JCS8vcGFyZW50VFIgPSBjcmVhdGVkTm9kZXNbcGFyZW50SWRdOwotCQlpZiAoIHBhcmVudFRSICE9IG51bGwgJiYgcGFyZW50VFIgIT0gdW5kZWZpbmVkICkKLQkJewotCQkJaW5kZW50U2l6ZSA9IHBhcnNlSW50KHBhcmVudFRSLmdldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFKSkgKyAxOwotCQl9Ci0JfQotCi0JdmFyIGV4cGFuZGVkID0gdGhpcy5nZXREZWZhdWx0RXhwYW5kU3RhdGUoaW5kZW50U2l6ZSk7Ci0KLQl0ckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfSU5ERU5UX1NJWkUsIGluZGVudFNpemUpOwotCXRyRWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9FWFBBTkRFRCwgZXhwYW5kZWQpOwotCi0JLy9hbGVydCgiY3JlYXRlVHJlZU5vZGUgZm9yIGlkLCBwYXJlbnRJZCwgaW5kZW50ID0iICsgdHJFbGVtZW50LmlkICsgIiwgIiArIHBhcmVudElkICsgIiwgIGluZGVudFNpemU9IiArIGluZGVudFNpemUpOwotCS8vY3JlYXRlVHJlZU5vZGUoZWxlbWVudCwgaW5kZW50U2l6ZSk7Ci0KLQkvL3NhdmUgdGhlIGNyZWF0ZWQgb25lcyBzbyB3ZSBjYW4gcmVmZXJlY25lIGl0Ci0JLy9jcmVhdGVkTm9kZXNbdHJFbGVtZW50LmlkXSA9IHRyRWxlbWVudDsKLQotCi0JaWYgKCAocGFyZW50VFIgIT0gbnVsbCkgJiYgdGhpcy5pc05vZGVTdXBwcmVzc2VkKHBhcmVudFRSKSApCi0JewotCQl0aGlzLnNldE5vZGVTdXBwcmVzc2VkKHRyRWxlbWVudCwgdHJ1ZSk7Ci0JCS8vYWxlcnQoInBhcmVudCBzdXBwcmVzc2VkIik7Ci0JfQotCi0JaWYgKCB0aGlzLmlzTm9kZVN1cHByZXNzZWQodHJFbGVtZW50KSA9PSB0cnVlIHx8IChwYXJlbnRUUiAhPSBudWxsICYmIHBhcmVudFRSLmdldEF0dHJpYnV0ZShBVFRSX0VYUEFOREVEKSA9PSB0aGlzLk5PREVfQ09MTEFQU0VEKSApCi0JewotCQl0ckVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJLy9hbGVydCgic3VwcHJlc3NlZCIpOwotCX0KLQkJCQkKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXRUcmVlVGFibGUgPSBmdW5jdGlvbigpIHsKLQlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIkFjdGl2aXR5VHJlZVRhYmxlIik7Ci19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuY3JlYXRlVG9wbGV2ZWxSb3dzID0gZnVuY3Rpb24oKSB7Ci0KLQl2YXIgdGFibGUgPSB0aGlzLmdldFRyZWVUYWJsZSgpOwotCWlmICggdGFibGUgPT0gbnVsbCApIHJldHVybjsKLQotCXZhciByb3dzID0gdGhpcy5kYXRhLnJvd3M7Ci0JdmFyIGxlbiA9IHJvd3MubGVuZ3RoOwotCXZhciBzdXBwcmVzc2VkUm93cyA9IG5ldyBBcnJheSgpOwotCS8vdmFyIHBhcmVudElkID0gIiI7Ci0JCi0JZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0JCi0JCXZhciByb3cgPSByb3dzW2ldOwotCQlpZiAoIHJvdyA9PSBudWxsICkgY29udGludWU7Ci0JCQotCQkvL3BhcmVudElkID0gIiI7Ci0JCQotCQkvLyBkb24ndCBjcmVhdGUgdGhlIHJvdyBpZiB0aGUgcm93IGlzIHN1cHByZXNzZWQgb3IgaWYgdGhlIHBhcmVudCBpcyBzdXBwcmVzc2VkCi0JCWlmICggdGhpcy5pc1Jvd1N1cHByZXNzZWQocm93KSApIHsKLQkJCS8vc3VwcHJlc3NlZFJvd3MucHVzaChyb3cuaWQpOwotCQkJLy9wYXJlbnRJZCA9IHJvdy5pZDsKLQkJCQotCQkJLy8gY2xlYXIgdGhlIHN1cHByZXNzZWQgcm93cwotCQkJcm93c1tpXSA9IG51bGw7Ci0JCQkKLQkJCS8vYWxlcnQoInN1cHByZXNzZWQgIiArIGkpOwotCQkJY29udGludWU7Ci0JCX0KLQkJCi0JCS8qCQkKLQkJd2hpbGUgKCAocm93LnBhcmVudElkICE9IHBhcmVudElkKSAmJiAoc3VwcHJlc3NlZFJvd3MubGVuZ3RoID4gMCkgKSB7Ci0JCQlwYXJlbnRJZCA9IHN1cHByZXNzZWRSb3dzLnBvcCgpOwotCQl9Ci0JCQotCQlpZiAoIChyb3cucGFyZW50SWQgIT0gIiIpICYmIChyb3cucGFyZW50SWQgPT0gcGFyZW50SWQpICkgewotCQkJc3VwcHJlc3NlZFJvd3MucHVzaChyb3cuaWQpOwotCQkJCi0JCQkvLyBjbGVhciB0aGUgc3VwcHJlc3NlZCByb3dzCi0JCQlyb3dzW2ldID0gbnVsbDsKLQotCQkJLy9hbGVydCgic3VwcHJlc3NlZCAiICsgaSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkqLwotCQkKLQkJCi0JCWlmICggcm93LnBhcmVudElkID09IG51bGwgfHwgcm93LnBhcmVudElkID09ICIiKSB7Ci0JCQl0aGlzLndic0l0ZW1IdG1sLnBhcnNlUm93KHJvdyk7Ci0JCQkKLQkJCXZhciB0ciA9IHRhYmxlLmluc2VydFJvdyh0YWJsZS5yb3dzLmxlbmd0aCk7Ci0JCQl0ci5zZXRBdHRyaWJ1dGUoQVRUUl9ST1dfREFUQV9JTkRFWCwgaSk7Ci0JCQl0aGlzLndic0l0ZW1IdG1sLmxvYWRSb3codHIpOwotCQkJCi0JCQkvL3RhYmxlLmFwcGVuZENoaWxkKHRyKTsKLQkJCQotCQkJdGhpcy5wcm9jZXNzVFIodHIpOwotCQl9Ci0JfQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuY3JlYXRlQ2hpbGRSb3dzID0gZnVuY3Rpb24odHJFbGVtZW50KSB7Ci0KLQl2YXIgbG9hZGVkID0gdHJFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NISUxEX0xPQURFRCk7Ci0JaWYgKCBsb2FkZWQgPT0gInRydWUiICkgewotCQlyZXR1cm47Ci0JfQotCi0KLQl2YXIgdGFibGUgPSB0aGlzLmdldFRyZWVUYWJsZSgpOwotCS8vdmFyIGluc2VydEJlZm9yZSA9IHRyRWxlbWVudC5nZXROZXh0U2libGluZzsKLQl2YXIgcm93SW5kZXggPSAgcGFyc2VJbnQodHJFbGVtZW50LnJvd0luZGV4KTsKLQkKLQkvLyBtYWtlIHN1cmUgdGhlIHZhbHVlIGlzIGEgbnVtYmVyIG90aGVyd2lzZSBGaXJlIGZveCB3aWxsIHRyZWF0IGl0IGFzIGEgc3RyaW5nCi0JdmFyIGRhdGFJbmRleCA9ICBwYXJzZUludCh0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfUk9XX0RBVEFfSU5ERVgpKTsKLQkKLQlmb3IgKCB2YXIgaSA9IGRhdGFJbmRleCsxOyBpIDwgdGhpcy5kYXRhLnJvd3MubGVuZ3RoOyBpKysgKSB7Ci0JCXZhciByb3cgPSB0aGlzLmRhdGEucm93c1tpXTsKLQkJaWYgKCByb3cgPT0gbnVsbCApIGNvbnRpbnVlOwotCQlpZiAoIHJvdy5wYXJlbnRJZCAhPSB0ckVsZW1lbnQuaWQgKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCQkKLQkJdGhpcy53YnNJdGVtSHRtbC5wYXJzZVJvdyhyb3cpOwotCi0JCXJvd0luZGV4Kys7Ci0JCXZhciB0ciA9IHRhYmxlLmluc2VydFJvdyhyb3dJbmRleCk7Ci0JCXRyLnNldEF0dHJpYnV0ZShBVFRSX1JPV19EQVRBX0lOREVYLCBpKTsKLQkJdGhpcy53YnNJdGVtSHRtbC5sb2FkUm93KHRyKTsKLQotCQl0aGlzLnByb2Nlc3NUUih0cik7Ci0JCQotCX0JCi0JCi0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0NISUxEX0xPQURFRCwgInRydWUiKTsKLQkKLX07Ci0KLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZ2V0RGVmYXVsdEV4cGFuZFN0YXRlID0gZnVuY3Rpb24obGV2ZWwpCi17Ci0KLQlpZiAobGV2ZWwgPj0gdGhpcy5ERUZBVUxUX0VYUEFORF9MRVZFTCApIHsKLQkJcmV0dXJuIHRoaXMuTk9ERV9DT0xMQVBTRUQ7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHRoaXMuTk9ERV9FWFBBTkRFRDsKLQl9Ci0KLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXRUcmVlTm9kZVNyYyA9IGZ1bmN0aW9uKGxldmVsKQotewotCWlmICggdGhpcy5nZXREZWZhdWx0RXhwYW5kU3RhdGUobGV2ZWwpID09IHRoaXMuTk9ERV9DT0xMQVBTRUQgKSB7Ci0JCXJldHVybiB0aGlzLmV4cGFuZEltYWdlOwotCX0KLQllbHNlIHsKLQkJcmV0dXJuIHRoaXMuY29sbGFwc2VJbWFnZTsKLQl9Ci19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5nZXRUUiA9IGZ1bmN0aW9uKGVsZW1lbnQpCi17Ci0JLy8gdGhlIGhlbWwgc3RydWN0dXJlIGlzCi0JLy8gPHRyIGlkPSIyIiBwYXJlbnRJZD0iMSI+Ci0JLy8gPHRkIGNsYXNzPSJ0cmVlTm9kZSI+Y29sIDEtMTwvdGQ+PHRkPmNvbCAyLTI8L3RkPgotCS8vIDwvdHI+Ci0JdmFyIGUgPSBlbGVtZW50OwotCXdoaWxlICggZSAhPSBudWxsICYmIGUudGFnTmFtZSAhPSAiVFIiIHx8IGUuY2xhc3NOYW1lICE9IHRoaXMudHJlZV9ub2RlX2NsYXNzKQotCXsJCi0JCWUgPSBlLnBhcmVudE5vZGU7Ci0JCS8vYWxlcnQoZS50YWdOYW1lKTsKLQl9Ci0JCi0JcmV0dXJuIGU7Ci19OwotCi0KLS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuZXhwYW5kQ29sbGFwc2VUcmVlTm9kZSA9IGZ1bmN0aW9uKGV2dEVsZW1lbnQpIHsKLQotCS8vYWxlcnQoZXZ0RWxlbWVudC50YWdOYW1lKTsKLQotCXZhciB0ckVsZW1lbnQgPSB0aGlzLmdldFRSKGV2dEVsZW1lbnQpOwotCQotCS8vIG1ha2Ugc3VyZSB0aGUgY2hpbGQgcm93cyBhcmUgY3JlYXRlZAotCXRoaXMuY3JlYXRlQ2hpbGRSb3dzKHRyRWxlbWVudCk7Ci0JCi0JLy8gaWYgdGhlcmUgaXMgbm8gY2hpbGQsIHJlbW92ZSB0aGUgdHJlZSBub2RlIGltYWdlCi0JaWYgKCAhdGhpcy5faGFzQ2hpbGRyZW4odHJFbGVtZW50KSApCi0JewotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuc2hpbUltYWdlOwotCQlldnRFbGVtZW50Lm9uY2xpY2sgPSBudWxsOwotCQlldnRFbGVtZW50LnN0eWxlLmN1cnNvciA9ICJkZWZhdWx0IjsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQl2YXIgZXhwYW5kZWQgPSB0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfRVhQQU5ERUQpOwotCi0JaWYgKGV4cGFuZGVkID09IHRoaXMuTk9ERV9FWFBBTkRFRCkgewotCQl0aGlzLmhpZGVDaGlsZHJlbih0ckVsZW1lbnQpOwotCQlldnRFbGVtZW50LnNyYyA9IHRoaXMuZXhwYW5kSW1hZ2U7Ci0JCWV4cGFuZGVkID0gdGhpcy5OT0RFX0NPTExBUFNFRDsKLQkJZXZ0RWxlbWVudC5hbHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJZXZ0RWxlbWVudC50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCX0KLQllbHNlIHsKLQkJdGhpcy5zaG93SGlkZUNoaWxkcmVuKHRyRWxlbWVudCwgdHJ1ZSk7Ci0JCWV2dEVsZW1lbnQuc3JjID0gdGhpcy5jb2xsYXBzZUltYWdlOwotCQlleHBhbmRlZCA9IHRoaXMuTk9ERV9FWFBBTkRFRDsKLQkJZXZ0RWxlbWVudC5hbHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwotCQlldnRFbGVtZW50LnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCQotCX0KLQkKLQl0ckVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRVhQQU5ERUQsIGV4cGFuZGVkKTsKLQkKLQkvKgotCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCX0KLQkqLwotCQotCXJldHVybiBmYWxzZTsKLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmhpZGVDaGlsZHJlbiA9IGZ1bmN0aW9uKHBhcmVudCkKLXsJCi0JLy8gbWFrZSBzdXJlIGl0J3MgdGhlIFRSIGVsZW1lbnQKLQlwYXJlbnQgPSB0aGlzLmdldFRSKHBhcmVudCk7Ci0JLy92YXIgcGFyZW50SWQgPSBwYXJlbnQuaWQ7Ci0JdmFyIGluZGVudFNpemUgPSBwYXJzZUludChwYXJlbnQuZ2V0QXR0cmlidXRlKEFUVFJfSU5ERU5UX1NJWkUpKTsKLQkKLQl2YXIgbmV4dFRSID0gcGFyZW50OwotCXdoaWxlICggKG5leHRUUj10aGlzLmdldE5leHRTaWJsaW5nKG5leHRUUikpICE9IG51bGwgJiYgbmV4dFRSLmdldEF0dHJpYnV0ZShBVFRSX0lOREVOVF9TSVpFKSA+IGluZGVudFNpemUgKQotCXsJCQotCQluZXh0VFIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsJCQotCX0KLQkJCi19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5zaG93SGlkZUNoaWxkcmVuID0gZnVuY3Rpb24ocGFyZW50LCBzaG93KQotewkJCi0JLy8gbWFrZSBzdXJlIGl0J3MgdGhlIFRSIGVsZW1lbnQKLQlwYXJlbnQgPSB0aGlzLmdldFRSKHBhcmVudCk7Ci0JCi0JLy92YXIgaW5kZW50U2l6ZSA9IHBhcmVudC5pbmRlbnRTaXplOwotCXZhciBuZXh0VFIgPSB0aGlzLmdldE5leHRTaWJsaW5nKHBhcmVudCk7Ci0Jd2hpbGUgKCBuZXh0VFIgIT0gbnVsbCAmJiBuZXh0VFIuZ2V0QXR0cmlidXRlKCJwYXJlbnRJZCIpID09IHBhcmVudC5pZCApCi0JewotCQlpZiAoIHNob3cgJiYgKHRoaXMuaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpID09IGZhbHNlKSApCi0JCXsKLQkJCW5leHRUUi5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkKLQkJCW5leHRUUi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQl9Ci0JCQotCQluZXh0VFIgPSB0aGlzLnNob3dIaWRlQ2hpbGRyZW4obmV4dFRSLCAoc2hvdz09dHJ1ZSkmJihuZXh0VFIuZ2V0QXR0cmlidXRlKEFUVFJfRVhQQU5ERUQpPT10aGlzLk5PREVfRVhQQU5ERUQpICk7Ci0JfQotCQotCXJldHVybiBuZXh0VFI7Ci0JCi19OwotCi0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5faGFzQ2hpbGRyZW4gPSBmdW5jdGlvbihwYXJlbnQpCi17Ci0KLQkvLyBtYWtlIHN1cmUgaXQncyB0aGUgVFIgZWxlbWVudAotCXBhcmVudCA9IHRoaXMuZ2V0VFIocGFyZW50KTsKLQotCXZhciBuZXh0VFIgPSB0aGlzLmdldE5leHRTaWJsaW5nKHBhcmVudCk7Ci0JCi0vL2FsZXJ0KCJwYXJlbnQuaWQ9IiArIHBhcmVudC5pZCArICIsIG5leHRUUi5wYXJlbnRJZD0iICsgbmV4dFRSLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKSArICIsIGlzU3VwcHJlc3NlZD0iICsgaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpKTsKLQotCWlmICggbmV4dFRSICE9IG51bGwgJiYgbmV4dFRSLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKSA9PSBwYXJlbnQuaWQpIAotCXsKLQkJaWYgKHRoaXMuaXNOb2RlU3VwcHJlc3NlZChuZXh0VFIpID09IGZhbHNlKQotCQl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCW5leHRUUi5uZXh0U2libGluZzsKLQkJCXdoaWxlIChuZXh0VFIgIT0gbnVsbCkKLQkJCXsKLQkJCQlpZiAodGhpcy5pc05vZGVTdXBwcmVzc2VkKG5leHRUUikgPT0gZmFsc2UpCi0JCQkJewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJbmV4dFRSID0gbmV4dFRSLm5leHRTaWJsaW5nOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXJldHVybiBmYWxzZTsKLX07Ci0KLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldE5leHRTaWJsaW5nID0gZnVuY3Rpb24oZWxlbWVudCkKLXsKLQotCXZhciBuZXh0RWxlbWVudCA9IGVsZW1lbnQubmV4dFNpYmxpbmc7Ci0Jd2hpbGUgKG5leHRFbGVtZW50ICE9IG51bGwgJiYgbmV4dEVsZW1lbnQudGFnTmFtZSAhPSBlbGVtZW50LnRhZ05hbWUgKQotCXsKLQkJbmV4dEVsZW1lbnQgPSBuZXh0RWxlbWVudC5uZXh0U2libGluZzsKLQl9Ci0JCi0JcmV0dXJuIG5leHRFbGVtZW50OwotfTsKLQotQWN0aXZpdHlUcmVlVGFibGUucHJvdG90eXBlLmdldEZpcnN0Q2hpbGQgPSBmdW5jdGlvbih0ckVsZW1lbnQsIHRhZ05hbWUsIGNsYXNzTmFtZSkKLXsKLQl2YXIgZSA9IHRyRWxlbWVudC5maXJzdENoaWxkOwotCXdoaWxlIChlICE9IG51bGwpCi0JewotCQkvL2FsZXJ0KGUudGFnTmFtZSk7Ci0JCWlmICggKHRhZ05hbWUgPT0gbnVsbCB8fCBlLnRhZ05hbWUgPT0gdGFnTmFtZSkgJiYgKGNsYXNzTmFtZSA9PSBudWxsIHx8IGUuY2xhc3NOYW1lID09IGNsYXNzTmFtZSkgKQotCQl7Ci0JCQlyZXR1cm4gZTsKLQkJfQotCQkKLQkJZSA9IGUubmV4dFNpYmxpbmc7Ci0JfQotCQotCXJldHVybiBudWxsOwotCQkKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5pc05vZGVTdXBwcmVzc2VkID0gZnVuY3Rpb24odHJFbGVtZW50KQotewotCS8vIGlmIGlzU3VwcmVzc2VkIGF0dHJpYnV0ZSBpcyBkZWZpbmVkLCBhbHdheXMgdXNlIGl0Ci0JLy8gb25seSBicm93c2lnbiBtb2RlbCBzZXQgdGhpcyBhdHRyaWJ1dGUKLQkvLyBpZiBub3QgZGVmaW5lZCwgaXQncyBpbiBwdWJsaXNoZWQgc2l0ZSwgbG9vayB1cCB0aGUgZmxhZyBmcm9tIHRoZSBnZW5lcmF0ZWQgbWFwCi0JdmFyIGF0dHJfc3VwcHJlc3NlZCA9IHRyRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlzU3VwcmVzc2VkIik7Ci0JdmFyIHJlbFBhdGggPSB0ckVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyZWxQcm9jZXNzUGF0aCIpOwotCQotCXZhciBmbGFnID0gdGhpcy5pc1N1cHByZXNzZWQoYXR0cl9zdXBwcmVzc2VkLCByZWxQYXRoKTsKLQkKLQlpZiAoIGF0dHJfc3VwcHJlc3NlZCA9PSBudWxsIHx8IGF0dHJfc3VwcHJlc3NlZCA9PSAiIiB8fCBhdHRyX3N1cHByZXNzZWQgPT0gdW5kZWZpbmVkICkKLQl7CQkKLQkJdGhpcy5zZXROb2RlU3VwcHJlc3NlZCh0ckVsZW1lbnQsIGZsYWcpOwotCX0KLQkKLQlyZXR1cm4gZmxhZzsKLX07Ci0KLUFjdGl2aXR5VHJlZVRhYmxlLnByb3RvdHlwZS5pc1Jvd1N1cHByZXNzZWQgPSBmdW5jdGlvbihyb3cpCi17Ci0JaWYgKCByb3cgPT0gbnVsbCApIHJldHVybiB0cnVlOwotCQotCXJldHVybiB0aGlzLmlzU3VwcHJlc3NlZChyb3cuaXNTdXBwcmVzc2VkLCByb3cucmVsUGF0aCk7Ci0JCi19OwotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuaXNTdXBwcmVzc2VkID0gZnVuY3Rpb24oYXR0cl9zdXBwcmVzc2VkLCByZWxQYXRoKQotewkKLQkvLyBpZiBpc1N1cHJlc3NlZCBhdHRyaWJ1dGUgaXMgZGVmaW5lZCwgYWx3YXlzIHVzZSBpdAotCS8vIG9ubHkgYnJvd3NpZ24gbW9kZWwgc2V0IHRoaXMgYXR0cmlidXRlCi0JLy8gaWYgbm90IGRlZmluZWQsIGl0J3MgaW4gcHVibGlzaGVkIHNpdGUsIGxvb2sgdXAgdGhlIGZsYWcgZnJvbSB0aGUgZ2VuZXJhdGVkIG1hcAotCQotCS8vYWxlcnQoYXR0cl9zdXBwcmVzc2VkICsgIj0iICsgcmVsUGF0aCk7Ci0JdmFyIGZsYWcgPSBmYWxzZTsKLQkKLQlpZiAoIGF0dHJfc3VwcHJlc3NlZCA9PSBudWxsIHx8IGF0dHJfc3VwcHJlc3NlZCA9PSAiIiB8fCBhdHRyX3N1cHByZXNzZWQgPT0gInVuZGVmaW5lZCIgKQotCXsKLQkJLy8gdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbiBhY3Rpdml0eWxheW91dC5qcwotCQlpZiAoIHJlbFBhdGggIT0gbnVsbCAmJiByZWxQYXRoICE9ICIiICYmIHJlbFBhdGggIT0gInVuZGVmaW5lZCIgKQotCQl7Ci0JCQlmbGFnID0gdGhpcy5wYXJlbnQuaXNTdXBwcmVzc2VkKGNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnBhcl9wcm9jLCBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcGF0aCArIHJlbFBhdGgpOwotCQl9Ci0JCS8vYWxlcnQoIngxLCBmbGFnPSIgKyBmbGFnKTsKLQl9Ci0JZWxzZQotCXsKLQkJZmxhZyA9IChhdHRyX3N1cHByZXNzZWQgPT0gInRydWUiKTsKLQl9Ci0JCi0JLy9hbGVydChmbGFnICsgIiA9ICIgKyBhdHRyX3N1cHByZXNzZWQgKyByZWxQYXRoKTsKLQlyZXR1cm4gZmxhZzsKLQotfTsKLQotCi1BY3Rpdml0eVRyZWVUYWJsZS5wcm90b3R5cGUuc2V0Tm9kZVN1cHByZXNzZWQgPSBmdW5jdGlvbih0ckVsZW1lbnQsIGZsYWcpCi17Ci0JdHJFbGVtZW50LnNldEF0dHJpYnV0ZSgiaXNTdXByZXNzZWQiLCBmbGFnID8gInRydWUiIDogImZhbHNlIik7Ci0JCQotfTsKLQotCi0KLQotLy8gZGVmaW5lIHRoZSBicmVhayBkb3duIHN0cnVjdHVyZSBjb2x1bW5zIGlkcyBoZXJlCi1CU19DT0xfSU5ERVggPSAiaWQiOwotQlNfQ09MX05BTUUgPSAibmFtZSI7Ci1CU19DT0xfUFJFRklYID0gInByZWZpeCI7Ci1CU19DT0xfUFJFREVDRVNTT1JTID0gInByZWRlY2Vzc29ycyI7Ci1CU19DT0xfSVNfUkVQRUFUQUJMRSA9ICJpc19yZXBlYXRhYmxlIjsKLUJTX0NPTF9JU19PTkdPSU5HID0gImlzX29uZ29pbmciOwotQlNfQ09MX0lTX0VWRU5UX0RSSVZFTiA9ICJpc19ldmVudF9kcml2ZW4iOwotQlNfQ09MX0VOVFJZX1NUQVRFID0gImVudHJ5X3N0YXRlIjsKLUJTX0NPTF9FWElUX1NUQVRFID0gImV4aXRfc3RhdGUiOwotQlNfQ09MX1RFQU1TID0gInRlYW1zIjsKLUJTX0NPTF9UWVBFID0gInR5cGUiOwotQlNfQ09MX01PREVMX0lORk8gPSAibW9kZWxfaW5mbyI7Ci1CU19DT0xfUFJFU0VOVEFUSU9OX05BTUUgPSAicHJlc2VudGF0aW9uX25hbWUiOyAKLUJTX0NPTF9TVEVQUyA9ICJzdGVwcyI7Ci1CU19DT0xfREVMSVZFUkFCTEUgPSAiZGVsaXZlcmFibGUiOyAKLUJTX0NPTF9JU19PUFRJT05BTCA9ICJpc19vcHRpb25hbCI7IAotQlNfQ09MX0lTX1BMQU5ORUQgPSAiaXNfcGxhbm5lZCI7Ci1CU19DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gImhhc19tdWx0aXBsZV9vY2N1cnJlbmNlcyI7Ci0KLS8vIGlkIHByZWZpeAotQlNfSURfUFJFRklYID0gIkJTX0NPTF8iOwotU1RFUF9HUk9VUF9TSVpFID0gNTsKLQotZnVuY3Rpb24gV0JTSXRlbUh0bWwoLypBY3Rpdml0eVRyZWVUYWJsZSovcGFyZW50KQotewotdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0vL3RoaXMuaW1hZ2VQYXRoID0gaW1nUGF0aDsKLQotdGhpcy5leHRlbmRWYXJpYWJpbGl0eSA9ICJleHRlbmQiOyAvLyAhISEgZG9uJ3QgdHJhbnNsYXRlIHRoaXMgISEhCi10aGlzLmxvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHkgPSAibG9jYWxDb250cmlidXRpb24iOwkvLyAhISEgZG9uJ3QgdHJhbnNsYXRlIHRoaXMgISEhCi10aGlzLmxvY2FsUmVwbGFjZW1lbnRWYXJpYWJpbGl0eSA9ICJsb2NhbFJlcGxhY2VtZW50IjsJLy8gISEhIGRvbid0IHRyYW5zbGF0ZSB0aGlzICEhIQotCi0vL3RoaXMuc291cmNlX2h0bWwgPSBuZXcgQXJyYXkoKTsKLS8vdGhpcy5jb2x1bW5zID0gW107Ci10aGlzLmZpZWxkcyA9IFtdOwotdGhpcy5pbmRlbnRTaXplID0gMDsKLXRoaXMuaGFzQ2hpbGRyZW4gPSBmYWxzZTsKLXRoaXMuaWQgPSAiIjsKLXRoaXMucGFyZW50SWQgPSAiIjsKLXRoaXMucmVsUGF0aCA9IG51bGw7Ci10aGlzLmlzU3VwcmVzc2VkID0gZmFsc2U7Ci10aGlzLnVybCA9ICIiOwotCi0KLX07Ci0KLQotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUuZ2V0VHJlZU5vZGVUYWJsZUh0bWwgPSBmdW5jdGlvbihpbmRlbnRTaXplLCBoYXNDaGlsZHJlbiwgdGl0bGUsIHVybCwgcmVsUGF0aCkKLXsKLQotLy8gdGVzdAotLy8gdGhlIHVybCBpcyBwYXNzZWQgaW4gdG8gYSBzdHJpbmcgdG8gY29uc3RydWN0IGEgc3RyaW5nIGxpdGVyYWwKLS8vIG5lZWQgdG8gZXNjYXBlIHRoZSBxdW90ZXMKLXVybCA9IHVybC5yZXBsYWNlKC8oXCd8XCIpL2csICJcXCQxIik7Ci0KLXVybCA9IGNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmdldEFjdGl2aXR5SXRlbVVybCh1cmwsIGNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnBhcl9wcm9jLCBjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5wYXJfcGF0aCwgcmVsUGF0aCk7Ci0KLXZhciBzcmMgPSBbCi0iPHRhYmxlIGJnY29sb3I9XCIjMDAwMDAwXCIgY2VsbHBhZGRpbmc9XCIwXCIgY2VsbHNwYWNpbmc9XCIwXCIgYm9yZGVyPVwiMFwiIGNsYXNzPVwiZGVmYXVsdFRhYmxlXCI+PHRyPjx0ZCBub3dyYXA9XCJub3dyYXBcIj4iIF07Ci1zcmMgPSBzcmMuY29uY2F0KHRoaXMuZ2V0VHJlZU5vZGVIdG1sKGluZGVudFNpemUsIGhhc0NoaWxkcmVuKSk7IAotc3JjID0gc3JjLmNvbmNhdChbCi0iPC90ZD48dGQgd2lkdGg9XCIxMDAlXCIgbm93cmFwPVwibm93cmFwXCI+IiAsIAotIjxhIGhyZWY9XCIiICwgdXJsICwgIlwiPiIgLCB0aXRsZSAsICI8L2E+IiAsIAotIjwvdGQ+PC90cj48L3RhYmxlPiJdKTsKLQotCXJldHVybiBzcmM7Ci19OwotCi0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5nZXRUcmVlTm9kZUh0bWwgPSBmdW5jdGlvbihpbmRlbnRTaXplLCBoYXNDaGlsZHJlbikKLXsKLQl2YXIgd2lkdGggPSAxNyppbmRlbnRTaXplOwotCi0JdmFyIHN0ciA9IFsiPGRpdiBjbGFzcz1cInRyZWVOb2RlXCI+PHNwYW4+Il07Ci0JdmFyIHNsZW4gPSAxOwotCWlmICggaW5kZW50U2l6ZSA+IDAgKQotCXsKLQkJc3RyW3NsZW5dID0gIjxpbWcgYWx0PVwiXCIgd2lkdGg9XCIiIDsKLQkJc3RyW3NsZW4gKyAxXSA9IHdpZHRoIDsKLQkJc3RyW3NsZW4gKyAyXSA9ICJcIiBoZWlnaHQ9XCIxNVwiIGJvcmRlcj1cIjBcIiBzcmM9XCIiIDsKLQkJc3RyW3NsZW4gKyAzXSA9IHRoaXMucGFyZW50LnNoaW1JbWFnZSA7Ci0JCXN0cltzbGVuICsgNF0gPSAiXCIvPiI7Ci0JCXNsZW4gKz0gNTsKLQl9Ci0KLQotCXZhciBpbWdTcmM7Ci0JCi0JaWYgKCAhaGFzQ2hpbGRyZW4gKQotCXsKLQkJc3RyW3NsZW5dPSAiPGltZyBhbHQ9XCJcIiB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTVcIiBib3JkZXI9XCIwXCIgYWxpZ249XCJhYnNtaWRkbGVcIiBzcmM9XCIiIDsKLQkJc3RyW3NsZW4gKyAxXSA9IHRoaXMucGFyZW50LnNoaW1JbWFnZSA7Ci0JCXN0cltzbGVuICsgMl0gPSAiXCI+IjsKLQkJc2xlbiArPSAzOwotCi0JfQotCWVsc2UgCi0JewotCQl2YXIgaW1hZ2VTcmMgPSB0aGlzLnBhcmVudC5nZXRUcmVlTm9kZVNyYyhpbmRlbnRTaXplKTsKLQkJc3RyW3NsZW5dID0gIjxpbWcgYWx0PVwiIiA7Ci0JCXN0cltzbGVuICsgMV0gPSAgY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQgOwotCQlzdHJbc2xlbiArIDJdID0gICJcIiB0aXRsZT1cIiIgOwotCQlzdHJbc2xlbiArIDNdID0gIGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0IDsKLQkJc3RyW3NsZW4gKyA0XSA9ICAiXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE1XCIgYm9yZGVyPVwiMFwiIGFsaWduPVwiYWJzbWlkZGxlXCIgc3JjPVwiIiA7Ci0JCXN0cltzbGVuICsgNV0gPSAgaW1hZ2VTcmMgOwotCQlzdHJbc2xlbiArIDZdID0gICJcIiIgOwotCQlzdHJbc2xlbiArIDddID0gICIgc3R5bGU9XCJjdXJzb3I6aGFuZFwiIG9uY2xpY2s9XCJjb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUuZXhwYW5kQ29sbGFwc2VUcmVlTm9kZSh0aGlzKTtyZXR1cm4gZmFsc2U7XCIgLz4iOwotCQlzbGVuICs9IDg7Ci0JfQotCQotCQotCXN0cltzbGVuXSA9ICI8L3NwYW4+JiMxNjA7JiMxNjA7PC9kaXY+IjsKLQotCXJldHVybiBzdHI7CQotfTsKLQotCi1XQlNJdGVtSHRtbC5wcm90b3R5cGUucGFyc2VSb3cgPSBmdW5jdGlvbihyb3cpIHsKLQkvKgotCXZhciBfaWQgPSByb3cuaWQ7Ci0JdmFyIF9wYXJlbnRJZCA9IHJvdy5wYXJlbnRJZDsKLQl2YXIgX3JlbFBhdGggPSByb3cucmVsUGF0aDsKLQl2YXIgX2lzU3VwcmVzc2VkID0gcm93LmlzU3VwcHJlc3NlZDsKLQl2YXIgX2luZGVudFNpemUgPSByb3cuaW5kZW50U2l6ZTsKLQl2YXIgX2hhc0NoaWxkcmVuID0gcm93Lmhhc0NoaWxkcmVuOyAKLQl2YXIgX2luZGV4ID0gcm93LmluZGV4OwotCXZhciBfcHJlZml4PSByb3cucHJlZml4OwotCW5hbWUsIHRpdGxlLCB1cmwsIHN0ZXBzLCBwcmVkZWNlc3NvcnMsIGluZm8sIHR5cGUsIAotCXJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIG9uZ29pbmcsIGV2ZW50RHJpdmVuLCAKLQl0ZWFtLCBlbnRyeVN0YXRlLCBleGl0U3RhdGUsIGRlbGl2ZXJhYmxlLCB2YXJpYWJpbGl0eVR5cGU7Ci0JKi8KLQkKLQl0aGlzLmluaXRSb3cocm93LmlkLCByb3cucGFyZW50SWQsIHJvdy5yZWxQYXRoLCByb3cuaXNTdXByZXNzZWQsIHJvdy5pbmRlbnRTaXplLCByb3cuaGFzQ2hpbGRyZW4sIAotCQlyb3cuaW5kZXgsIHJvdy5wcmVmaXgsIHJvdy5uYW1lLCByb3cudGl0bGUsIHJvdy51cmwsICIiLCByb3cucHJlZGVjZXNzb3JzLCByb3cuaW5mbywgcm93LnR5cGUsIAotCQlyb3cucmVwZWF0YWJsZSwgcm93Lm11bHRpT2NjdXJlbmNlcywgcm93Lm9wdGlvbmFsLCByb3cucGxhbm5lZCwgcm93Lm9uZ29pbmcsIHJvdy5ldmVudERyaXZlbiwgCi0JCXJvdy50ZWFtLCByb3cuZW50cnlTdGF0ZSwgcm93LmV4aXRTdGF0ZSwgcm93LmRlbGl2ZXJhYmxlLCByb3cudmFyaWFiaWxpdHlUeXBlKTsKLQkKLQlpZiAoIHJvdy5zdGVwcyAhPSBudWxsICkgewotCQl2YXIgbGVuID0gcm93LnN0ZXBzLmxlbmd0aDsKLQkJdmFyIGJyayA9IGZhbHNlOwotCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKLQkJCWJyayA9ICgoaSsxKSVTVEVQX0dST1VQX1NJWkUgPT0gMCApOwotCQkJdGhpcy5hZGRTdGVwKHJvdy5zdGVwc1tpXSwgYnJrKTsKLQkJfQotCX0KLX07Ci0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5sb2FkUm93ID0gZnVuY3Rpb24oLypET00qL3RyKQotewotCS8vdmFyIHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVFIiKTsKLQl0ci5pZCA9IHRoaXMuaWQ7Ci0JdHIuY2xhc3NOYW1lID0gInRyZWVOb2RlIjsKLQl0ci5zZXRBdHRyaWJ1dGUoInBhcmVudElkIiwgdGhpcy5wYXJlbnRJZCk7Ci0JdHIuc2V0QXR0cmlidXRlKCJyZWxQcm9jZXNzUGF0aCIsIHRoaXMucmVsUGF0aCk7Ci0KLQkvLyBpcyBzdXBwcmVzc2VkIGZsYWcgaXMgc2V0IG9ubHkgd2hlbiBpbiBicm93c2luZyBtb2RlbCwgaXQncyBub3Qgc2V0IGluIHB1Ymxpc2hpbmcgbW9kZWwKLQlpZiAoIHRoaXMuaXNTdXByZXNzZWQgIT0gbnVsbCAmJiB0aGlzLmlzU3VwcmVzc2VkICE9ICIiICYmIHRoaXMuaXNTdXByZXNzZWQgIT0gdW5kZWZpbmVkKSB7Ci0JCXRyLnNldEF0dHJpYnV0ZSgiaXNTdXByZXNzZWQiLCB0aGlzLmlzU3VwcmVzc2VkKTsKLQl9Ci0JCi0JLy8gZ2V0IHRoZSBjZWxsIHNvdXJjZQotCXZhciBzcmMgPSBbXTsKLQl2YXIgbGVuID0gdGhpcy5wYXJlbnQuZGF0YS5jb2x1bW5zLmxlbmd0aDsKLQlmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkgewotCQl2YXIgdGQgPSB0ci5pbnNlcnRDZWxsKHRyLmNlbGxzLmxlbmd0aCk7Ci0JCXRoaXMubG9hZENlbGwodGQsIGkpOwotCQkvL3RyLmFwcGVuZENoaWxkKHRkKTsKLQkJCi0JfQotCQotCXJldHVybiB0cjsJCQkJCi19OwotCi0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLmluaXRSb3cgPSBmdW5jdGlvbihpZCwgcGFyZW50SWQsIHJlbFBhdGgsIGlzU3VwcmVzc2VkLCBpbmRlbnRTaXplLCBoYXNDaGlsZHJlbiwgCi0JaW5kZXgsIHByZWZpeCwgbmFtZSwgdGl0bGUsIHVybCwgc3RlcHMsIHByZWRlY2Vzc29ycywgaW5mbywgdHlwZSwgCi0JcmVwZWF0YWJsZSwgbXVsdGlPY2N1cmVuY2VzLCBvcHRpb25hbCwgcGxhbm5lZCwgb25nb2luZywgZXZlbnREcml2ZW4sIAotCXRlYW0sIGVudHJ5U3RhdGUsIGV4aXRTdGF0ZSwgZGVsaXZlcmFibGUsIHZhcmlhYmlsaXR5VHlwZSkKLXsKLQl0aGlzLmluZGVudFNpemUgPSBpbmRlbnRTaXplOwotCXRoaXMuaGFzQ2hpbGRyZW4gPSBoYXNDaGlsZHJlbjsKLQl0aGlzLmlkID0gaWQ7Ci0JdGhpcy5wYXJlbnRJZCA9IHBhcmVudElkOwotCXRoaXMucmVsUGF0aCA9IHJlbFBhdGg7Ci0JdGhpcy5pc1N1cHJlc3NlZCA9IGlzU3VwcmVzc2VkOwotCQotCXRoaXMuZmllbGRzW0JTX0NPTF9JTkRFWF0gPSBpbmRleDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfUFJFRklYXSA9IHByZWZpeDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfTkFNRV0gPSBuYW1lOwotCXRoaXMuZmllbGRzW0JTX0NPTF9QUkVTRU5UQVRJT05fTkFNRV0gPSB0aXRsZTsKLQl0aGlzLnVybCA9IHVybDsKLQl0aGlzLmZpZWxkc1tCU19DT0xfU1RFUFNdID0gc3RlcHM7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX1BSRURFQ0VTU09SU10gPSBwcmVkZWNlc3NvcnM7Ci0JaWYgKHZhcmlhYmlsaXR5VHlwZS5pbmRleE9mKHRoaXMuZXh0ZW5kVmFyaWFiaWxpdHkpICE9IC0xIHx8IAotCQl2YXJpYWJpbGl0eVR5cGUuaW5kZXhPZih0aGlzLmxvY2FsQ29udHJpYnV0aW9uVmFyaWFiaWxpdHkpICE9IC0xIHx8IAotCQl2YXJpYWJpbGl0eVR5cGUuaW5kZXhPZih0aGlzLmxvY2FsUmVwbGFjZW1lbnRWYXJpYWJpbGl0eSkgIT0gLTEgKQotCXsKLQkJdGhpcy5maWVsZHNbQlNfQ09MX01PREVMX0lORk9dID0gIiI7Ci0JfQotCWVsc2UKLQl7Ci0JCXRoaXMuZmllbGRzW0JTX0NPTF9NT0RFTF9JTkZPXSA9IGluZm87Ci0JfQkKLQl0aGlzLmZpZWxkc1tCU19DT0xfVFlQRV0gPSB0eXBlOwotCi0JdGhpcy5maWVsZHNbQlNfQ09MX1RFQU1TXSA9IHRlYW07Ci0KLQl0aGlzLmZpZWxkc1tCU19DT0xfRU5UUllfU1RBVEVdID0gZW50cnlTdGF0ZTsKLQl0aGlzLmZpZWxkc1tCU19DT0xfRVhJVF9TVEFURV0gPSBleGl0U3RhdGU7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0RFTElWRVJBQkxFXSA9IGRlbGl2ZXJhYmxlOwotCQotCXRoaXMuc2V0U3RhdGVzKHJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIG9uZ29pbmcsIGV2ZW50RHJpdmVuKTsKLQkKLQkKLX07Ci0KLVdCU0l0ZW1IdG1sLnByb3RvdHlwZS5hZGRTdGVwID0gZnVuY3Rpb24oc2VsZWN0ZWQsIGxpbmVCcmVhaykKLXsKLQl2YXIgaW1nX3NyYzsKLQlpZiAoIHNlbGVjdGVkICkgewotCQlpbWdfc3JjID0gdGhpcy5wYXJlbnQuaW1hZ2VQYXRoICsgImNpcmNsZV9jbG9zZS5naWYiOwotCX0gZWxzZSB7Ci0JCWltZ19zcmMgPSB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAiY2lyY2xlX29wZW4uZ2lmIjsJCi0JfQotCQotCXZhciBzdGVwcyA9IHRoaXMuZmllbGRzW0JTX0NPTF9TVEVQU107Ci0Jc3RlcHMgKz0gIjxpbWcgd2lkdGg9XCIxMFwiIGhlaWdodD1cIjlcIiBhbHQ9XCJcIiBzcmM9XCIiICsgaW1nX3NyYyArICJcIiAvPiI7Ci0JaWYgKGxpbmVCcmVhaykKLQl7Ci0JCXN0ZXBzICs9ICI8YnIvPiI7Ci0JfQotCQotCXRoaXMuZmllbGRzW0JTX0NPTF9TVEVQU10gPSBzdGVwczsKLX07Ci0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLnNldFN0YXRlcyA9IGZ1bmN0aW9uKHJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIG9uZ29pbmcsIGV2ZW50RHJpdmVuKQotewotCWlmICggcmVwZWF0YWJsZSA9PSAidHJ1ZSIpIHsKLQkJcmVwZWF0YWJsZSA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgaGVpZ2h0PVwiMTVcIiB3aWR0aD1cIjIwXCIgc3JjPVwiIiArIHRoaXMucGFyZW50LmltYWdlUGF0aCArICJ0cnVlLmdpZlwiPiI7Ci0JfSBlbHNlIHsKLQkJcmVwZWF0YWJsZSA9ICImbmJzcDsiOwotCX0KLQkKLQlpZiAoIG11bHRpT2NjdXJlbmNlcyA9PSAidHJ1ZSIpIHsKLQkJbXVsdGlPY2N1cmVuY2VzID0gIjxpbWcgYWx0PVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiB0aXRsZT1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgaGVpZ2h0PVwiMTVcIiB3aWR0aD1cIjIwXCIgc3JjPVwiIiArIHRoaXMucGFyZW50LmltYWdlUGF0aCArICJ0cnVlLmdpZlwiPiI7Ci0JfSBlbHNlIHsKLQkJbXVsdGlPY2N1cmVuY2VzID0gIiZuYnNwOyI7Ci0JfQotCQotCWlmICggb3B0aW9uYWwgPT0gInRydWUiKSB7Ci0JCW9wdGlvbmFsID0gIjxpbWcgYWx0PVwiIiArIGNvbnRlbnRQYWdlLnJlcy5jaGVja2VkQWx0VGV4dCArICJcIiB0aXRsZT1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgaGVpZ2h0PVwiMTVcIiB3aWR0aD1cIjIwXCIgc3JjPVwiIiArIHRoaXMucGFyZW50LmltYWdlUGF0aCArICJ0cnVlLmdpZlwiPiI7Ci0JfSBlbHNlIHsKLQkJb3B0aW9uYWwgPSAiJm5ic3A7IjsKLQl9Ci0KLQlpZiAoIHBsYW5uZWQgPT0idHJ1ZSIpIHsKLQkJcGxhbm5lZCA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCXBsYW5uZWQgPSAiJm5ic3A7IjsKLQl9Ci0KLQlpZiAoIG9uZ29pbmcgPT0idHJ1ZSIpIHsKLQkJb25nb2luZyA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCW9uZ29pbmcgPSAiJm5ic3A7IjsKLQl9Ci0JCi0JaWYgKCBldmVudERyaXZlbiA9PSJ0cnVlIikgewotCQlldmVudERyaXZlbiA9ICI8aW1nIGFsdD1cIiIgKyBjb250ZW50UGFnZS5yZXMuY2hlY2tlZEFsdFRleHQgKyAiXCIgdGl0bGU9XCIiICsgY29udGVudFBhZ2UucmVzLmNoZWNrZWRBbHRUZXh0ICsgIlwiIGhlaWdodD1cIjE1XCIgd2lkdGg9XCIyMFwiIHNyYz1cIiIgKyB0aGlzLnBhcmVudC5pbWFnZVBhdGggKyAidHJ1ZS5naWZcIj4iOwotCX0gZWxzZSB7Ci0JCWV2ZW50RHJpdmVuID0gIiZuYnNwOyI7Ci0JfQotCQotCQotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19SRVBFQVRBQkxFXSA9IHJlcGVhdGFibGU7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU10gPSBtdWx0aU9jY3VyZW5jZXM7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0lTX09QVElPTkFMXSA9IG9wdGlvbmFsOwotCXRoaXMuZmllbGRzW0JTX0NPTF9JU19QTEFOTkVEXSA9IHBsYW5uZWQ7Ci0JdGhpcy5maWVsZHNbQlNfQ09MX0lTX09OR09JTkddID0gb25nb2luZzsKLQl0aGlzLmZpZWxkc1tCU19DT0xfSVNfRVZFTlRfRFJJVkVOXSA9IGV2ZW50RHJpdmVuOwotCi19OwotCi0KLQotV0JTSXRlbUh0bWwucHJvdG90eXBlLmxvYWRDZWxsID0gZnVuY3Rpb24oLypET00qL3RkRWwsIGNvbHVtbkNvdW50KSB7Ci0KLQl2YXIgY29sID0gdGhpcy5wYXJlbnQuZGF0YS5jb2x1bW5zW2NvbHVtbkNvdW50XTsKLQl2YXIgY29sX2lkID0gY29sWzBdOwotCXZhciB0ZXh0ID0gdGhpcy5maWVsZHNbY29sX2lkXTsKLQlpZiAoIHRleHQgPT0gIiIgKSB7Ci0JCXRleHQgPSAiJm5ic3A7IjsKLQl9Ci0JCi0JdmFyIGlkID0gQlNfSURfUFJFRklYICsgY29sX2lkOwotCQotCS8vdmFyIHRkRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJURCIpOwkKLQl0ZEVsLmlkID0gaWQ7Ci0JdGRFbC5oZWFkZXJzID0gIiI7Ci0JCi0JdmFyIHN0ciA9ICIiOwotCXZhciBzbGVuID0gMzsKLQlpZiAoIGNvbHVtbkNvdW50ICUgMiAhPSAwICkgewotCQl0ZEVsLnN0eWxlLmJhY2tncm91bmQgPSAiI2NjY2NjYyI7Ci0JfQotCQotCWlmICggY29sX2lkLmluZGV4T2YoImlzXyIpID49MCB8fCBjb2xfaWQuaW5kZXhPZigiaGFzXyIpID49MCApIHsJCi0JCXRkRWwuYWxpZ24gPSAiY2VudGVyIjsKLQl9Ci0JCi0JaWYgKCBjb2xfaWQgPT0gQlNfQ09MX1RZUEUgfHwgY29sX2lkID09IEJTX0NPTF9TVEVQUyApIHsKLQkJLy90ZEVsLm5vd3JhcCA9IHRydWU7Ci0JCXRleHQgPSAiPHNwYW4gc3R5bGU9J3doaXRlLXNwYWNlOm5vd3JhcDsnPiIgKyB0ZXh0ICsgIjwvc3Bhbj4iOwotCX0KLQkKLQlpZiAoIGNvbF9pZCA9PSBCU19DT0xfUFJFU0VOVEFUSU9OX05BTUUgKSB7Ci0JCXRkRWwud2lkdGg9IjEwMCUiOwotCQl0ZXh0ID0gdGhpcy5nZXRUcmVlTm9kZVRhYmxlSHRtbCgKLQkJCXRoaXMuaW5kZW50U2l6ZSwgdGhpcy5oYXNDaGlsZHJlbiwgCi0JCQl0ZXh0LCB0aGlzLnVybCwgdGhpcy5yZWxQYXRoKS5qb2luKCIiKTsKLQkJCi0JfSAKLQkKLQotCXRkRWwuaW5uZXJIVE1MID0gdGV4dDsKLQlyZXR1cm4gdGRFbDsKLQotfTsKLQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWQwYWVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyogcmVzb3VyY2UgZmlsZXMgZm9yIGNvbnRlbnQgcGFnZSBqYXZhc2NyaXB0IAotICogdGhpcyBmaWxlIHNob3VsZCBiZSBsb2NhbGl6ZWQKLSovCi1Db250ZW50UGFnZVJlc291cmNlID0gZnVuY3Rpb24oKSB7Ci0KLQotdGhpcy5leHBhbmRBbGxUZXh0ID0gIkV4cGFuZCBBbGwgU2VjdGlvbnMiOwotdGhpcy5jb2xsYXBzZUFsbFRleHQgPSAiQ29sbGFwc2UgQWxsIFNlY3Rpb25zIjsKLXRoaXMuYmFja1RvVG9wVGV4dCA9ICJCYWNrIHRvIHRvcCI7Ci0KLXRoaXMuZXhwYW5kQWxsU3ViU2VjdGlvbnNUZXh0ID0gIkV4cGFuZCBBbGwgU3RlcHMiOwotdGhpcy5jb2xsYXBzZUFsbFN1YlNlY3Rpb25zVGV4dCA9ICJDb2xsYXBzZSBBbGwgU3RlcHMiOwotCi10aGlzLnRvb2xiYXJfYm9va21hcmsgPSAiQm9va21hcmsgdGhpcyBwYWdlIjsKLXRoaXMudG9vbGJhcl9iYWNrID0gIkJhY2siOwotdGhpcy50b29sYmFyX2ZvcndhcmQgPSAiRm9yd2FyZCI7Ci10aGlzLnRvb2xiYXJfZXhwYW5kX2FsbCA9ICJFeHBhbmQgYWxsIjsKLXRoaXMudG9vbGJhcl9jb2xsYXBzZV9hbGwgPSAiQ29sbGFwc2UgYWxsIjsKLXRoaXMudG9vbGJhcl9wcmludCA9ICJQcmludCI7Ci0KLXRoaXMuZXhwYW5kVGV4dCA9ICJFeHBhbmQiCi10aGlzLmNvbGxhcHNlVGV4dCA9ICJDb2xsYXBzZSIKLXRoaXMuY2hlY2tlZEFsdFRleHQgPSAiWWVzIgkKLQotfTsKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1NTkxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvbnRlbnRQYWdlU2VjdGlvbiA9IGZ1bmN0aW9uKCl7Ci0KLXRoaXMuY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCA9IGZhbHNlOwotdGhpcy5maXJzdFNlY3Rpb24gPSBudWxsOwotdGhpcy5leHBhbmRJbWFnZSA9IG51bGw7Ci10aGlzLmNvbGxhcHNlSW1hZ2UgPSBudWxsOwotdGhpcy5leHBhbmRBbGxJbWFnZSA9IG51bGw7Ci10aGlzLmNvbGxhcHNlQWxsSW1hZ2UgPSBudWxsOwotdGhpcy5iYWNrVG9Ub3BJbWFnZSA9IG51bGw7Ci10aGlzLnNoaW1JbWFnZSA9IG51bGw7Ci10aGlzLnNlY3Rpb25Db2xsYXBzZURpdnMgPSBudWxsOwotdGhpcy5zZWN0aW9uQ29sbGFwc2VMaW5rcyA9IG51bGw7Ci0KLS8vIHRlc3QgbWVzc2FnZSwgCi10aGlzLmJhY2tUb1RvcFRleHQgPSBudWxsOwotdGhpcy5leHBhbmRBbGxUZXh0ID0gbnVsbDsKLXRoaXMuY29sbGFwc2VBbGxUZXh0ID0gbnVsbDsKLX07Ci0KLUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGltZ1BhdGgpIHsKLQotCXRoaXMuYmFja1RvVG9wVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5iYWNrVG9Ub3BUZXh0OwotCXRoaXMuZXhwYW5kQWxsVGV4dCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRBbGxUZXh0OwotCXRoaXMuY29sbGFwc2VBbGxUZXh0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlQWxsVGV4dDsKLQotCXRoaXMuZXhwYW5kSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZXhwYW5kLmdpZicpOwkJCi0JdGhpcy5jb2xsYXBzZUltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2NvbGxhcHNlLmdpZicpOwotCXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnZXhwYW5kX2FsbC5naWYnKTsJCi0JdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2NvbGxhcHNlX2FsbC5naWYnKTsKLQl0aGlzLmJhY2tUb1RvcEltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2JhY2tfdG9fdG9wLmdpZicpOwotCXRoaXMuc2hpbUltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ3NoaW0uZ2lmJyk7Ci19OwotCi0vLyBDcmVhdGVzIHRoZSBjb2xsYXBzaWJsZSBzZWN0aW9uIGxpbmtzLgotQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVTZWN0aW9uTGlua3MgPSBmdW5jdGlvbih0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7Ci0KLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7Ci0JCXZhciBzZWN0aW9uRWxlbWVudHMgPSBuZXcgQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsKLQkJdmFyIHRvdGFsTGlua3MgPSAwOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCi0JCQkvLyBzYXZlIHRoZSBlbGVtZW50IGZvciBhdXRvIHdyYXAKLQkJCWlmICggZWxlbWVudC5nZXRBdHRyaWJ1dGUoImF1dG9XcmFwIikgPT0gInRydWUiICkgewotCQkJCWNvbnRlbnRQYWdlLmFkZEF1dG9XcmFwRWxlbWVudChlbGVtZW50KTsKLQkJCX0KLQkJCQotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsKLQkJCQlzZWN0aW9uRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7CQkJCQotCQkJfQotCQl9Ci0JCXNlY3Rpb25FbGVtZW50cy5sZW5ndGggPSB0b3RhbExpbmtzOwotCQl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnMgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7Ci0JCXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3MgPSBuZXcgQXJyYXkodG90YWxMaW5rcyk7Ci0JCXRoaXMuZmlyc3RTZWN0aW9uID0gc2VjdGlvbkVsZW1lbnRzWzBdOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHNlY3Rpb25FbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaV07Ci0JCQl2YXIgc2libGluZ0NvbnRhaW5lcjsKLQkJCWlmIChkb2N1bWVudC5jcmVhdGVFbGVtZW50ICYmIChzaWJsaW5nQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpICYmIHNpYmxpbmdDb250YWluZXIuc3R5bGUpIHsJCi0JCQkJdmFyIG5leHRTaWJsaW5nID0gZWxlbWVudC5uZXh0U2libGluZzsKLQkJCQllbGVtZW50LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNpYmxpbmdDb250YWluZXIsIG5leHRTaWJsaW5nKTsKLQkJCQl2YXIgbmV4dEVsZW1lbnQgPSBzZWN0aW9uRWxlbWVudHNbaSArIDFdOwotCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBuZXh0RWxlbWVudCAmJiBuZXh0U2libGluZyAhPSBudWxsICYmIG5leHRTaWJsaW5nLmNsYXNzTmFtZSAhPSAnY29weXJpZ2h0JykgewotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7Ci0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMuY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgewotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0gICAgCQkJfQotICAgIAkJCXRoaXMuc2VjdGlvbkNvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7Ci0gICAgCQkJdGhpcy5jcmVhdGVDb2xsYXBzaWJsZVNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCi0JCXRoaXMuY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzKHNlY3Rpb25FbGVtZW50c1swXSk7Ci0JfQotfTsKLQotLy8gQ3JlYXRlcyBhIGNvbGxhcHNpYmxlIHNlY3Rpb24uCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUNvbGxhcHNpYmxlU2VjdGlvbiA9IGZ1bmN0aW9uKGVsZW1lbnQsIHNpYmxpbmdDb250YWluZXIsIGluZGV4KSB7Ci0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsKLQkJLy8gQWRkIGEgc3BhY2luZyBiZXR3ZWVuIHRoZSBzZWN0aW9ucy4KLQkJdmFyIHNlY3Rpb25TZXBhcmF0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJc2VjdGlvblNlcGFyYXRvci5zcmMgPSB0aGlzLnNoaW1JbWFnZTsKLQkJc2VjdGlvblNlcGFyYXRvci5hbHQgPSAnJzsKLQkJc2VjdGlvblNlcGFyYXRvci50aXRsZSA9ICcnOwotCQlzZWN0aW9uU2VwYXJhdG9yLmhlaWdodCA9ICczJzsKLQkJc2VjdGlvblNlcGFyYXRvci5ib3JkZXIgPSAnMCc7Ci0JCXNlY3Rpb25TZXBhcmF0b3IuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWN0aW9uU2VwYXJhdG9yLCBlbGVtZW50KTsKLQkJCi0JCS8vIEFkZCBhIGV4cGFuZC9jb2xsYXBzZSBsaW5rIHRvIHRoZSBzZWN0aW9uIGhlYWRpbmcuCi0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jb2xsYXBzZURpdiA9IHNpYmxpbmdDb250YWluZXI7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaWYgKHRoaXMuY29sbGFwc2VTZWN0aW9uc0J5RGVmYXVsdCkgewotCQkJaW1hZ2Uuc3JjID0gdGhpcy5leHBhbmRJbWFnZTsKLQkJCWltYWdlLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJaW1hZ2UudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJfQotCQllbHNlIHsKLQkJCWltYWdlLnNyYyA9IHRoaXMuY29sbGFwc2VJbWFnZTsKLQkJCWltYWdlLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7Ci0JCQlpbWFnZS50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5jb2xsYXBzZVRleHQ7CQkJCi0JCX0KLQkJCQkKLQkJaW1hZ2Uud2lkdGggPSAnMTcnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTUnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCWxpbmsub25jbGljayA9IGZ1bmN0aW9uKGV2dCkgewotCQkJLy8gaGVyZSAidGhpcyIgaXMgdGhlIHRhcmhldCBlbGVtZW50LCBpLmUuIHRoZSBJTUcKLQkJCS8vIEV4cGFuZHMgb3IgY29sbGFwc2VzIGEgc2VjdGlvbiBiYXNlZCBvbiB0aGUgcmVjZWl2ZWQgZXZlbnQuCi0JCQlpZiAodGhpcy5jb2xsYXBzZURpdi5zdHlsZS5kaXNwbGF5ID09ICcnKSB7Ci0JCQkJdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUubmV4dFNpYmxpbmcuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5leHBhbmRJbWFnZTsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQuYWx0ID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmV4cGFuZFRleHQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCQkJdGhpcy5maXJzdENoaWxkLnNyYyA9IHNlbGYuY29sbGFwc2VJbWFnZTsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQuYWx0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsKLQkJCQl0aGlzLmZpcnN0Q2hpbGQudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwkJCQkKLQkJCX0KLQkJCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX07Ci0KLQkJdGhpcy5zZWN0aW9uQ29sbGFwc2VMaW5rc1tpbmRleF0gPSBsaW5rOwotCQlzcGFuLmFwcGVuZENoaWxkKGxpbmspOwotCQllbGVtZW50Lmluc2VydEJlZm9yZShzcGFuLCBlbGVtZW50LmZpcnN0Q2hpbGQpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQllbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotICAgIAkKLQkJLy8gQWRkIGEgQmFjayBUbyBUb3AgbGluayBpbiB0aGUgc2VjdGlvbiBoZWFkaW5nLgotCQl0aGlzLmNyZWF0ZUJhY2tUb1RvcExpbmsoc2libGluZ0NvbnRhaW5lcik7Ci0JfQotfTsKLQotLy8gQ3JlYXRlcyBhIEJhY2sgdG8gdG9wIGxpbmsuCi1Db250ZW50UGFnZVNlY3Rpb24ucHJvdG90eXBlLmNyZWF0ZUJhY2tUb1RvcExpbmsgPSBmdW5jdGlvbihlbGVtZW50KSB7Ci0JdmFyIGRpdjsKLQkKLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7Ci0JCWRpdi5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7Ci0JCWRpdi5hbGlnbiA9ICdyaWdodCc7Ci0JCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5hbHQgPSB0aGlzLmJhY2tUb1RvcFRleHQ7Ci0JCWltYWdlLnRpdGxlID0gdGhpcy5iYWNrVG9Ub3BUZXh0OwotCQlpbWFnZS5zcmMgPSB0aGlzLmJhY2tUb1RvcEltYWdlOwotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsJCQotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jbGFzc05hbWUgPSAnYmFja1RvVG9wTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcjJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCXZhciBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwotCQlzcGFuLmNsYXNzTmFtZSA9ICdiYWNrVG9Ub3BMaW5rJzsKLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmJhY2tUb1RvcFRleHQpKTsJCQotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCWVsZW1lbnQuYXBwZW5kQ2hpbGQoZGl2KTsKLQl9Ci19OwotCi0KLS8vIENyZWF0ZXMgdGhlIEV4cGFuZCBBbGwgYW5kIENvbGxhcHNlIEFsbCBTZWN0aW9ucyBsaW5rcy4KLUNvbnRlbnRQYWdlU2VjdGlvbi5wcm90b3R5cGUuY3JlYXRlRXhwYW5kQ29sbGFwc2VBbGxTZWN0aW9uc0xpbmtzID0gZnVuY3Rpb24oZmlyc3RFbGVtZW50KSB7Ci0KLQl2YXIgZGl2OwotCXZhciBzZWxmID0gdGhpczsKLQkKLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7Ci0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsKLQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCWltYWdlLnNyYyA9IHRoaXMuZXhwYW5kQWxsSW1hZ2U7Ci0JCWltYWdlLmFsdCA9IHRoaXMuZXhwYW5kQWxsVGV4dDsKLQkJaW1hZ2UudGl0bGUgPSB0aGlzLmV4cGFuZEFsbFRleHQ7Ci0JCWltYWdlLndpZHRoID0gJzE2JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwkJCi0JCXZhciBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwotCQlsaW5rLmNsYXNzTmFtZSA9ICdleHBhbmRDb2xsYXBzZUxpbmsnOwotCQlsaW5rLmhyZWYgPSAnJzsKLQkJbGluay5hcHBlbmRDaGlsZChpbWFnZSk7Ci0JCWxpbmsub25jbGljayA9IC8qdGhpcy5leHBhbmRBbGw7Ki8gZnVuY3Rpb24oZXZ0KSB7Ci0JCQkvKgotCQkJIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgCXNlbGYuc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCQkgCXNlbGYuc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkgfQotCQkJICovCi0JCQkgc2VsZi5leHBhbmRBbGwoKTsKLQkJCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJIAlldnQucHJldmVudERlZmF1bHQoKTsKLQkJCSB9Ci0JCQkgcmV0dXJuIGZhbHNlOwotCQl9OwotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsKLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmV4cGFuZEFsbFRleHQpKTsKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JCWRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkJZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSkpOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7CQkJCQkJCi0JCQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlQWxsSW1hZ2U7Ci0JCWltYWdlLmFsdCA9IHRoaXMuY29sbGFwc2VBbGxUZXh0OwotCQlpbWFnZS50aXRsZSA9IHRoaXMuY29sbGFwc2VBbGxUZXh0OwotCQlpbWFnZS53aWR0aCA9ICcxNic7Ci0JCWltYWdlLmhlaWdodCA9ICcxNic7Ci0JCWltYWdlLmJvcmRlciA9ICcwJzsKLQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJbGluay5ocmVmID0gJyMnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJbGluay5vbmNsaWNrID0gLyp0aGlzLmNvbGxhcHNlQWxsOyovZnVuY3Rpb24oZXZ0KSB7Ci0JCQkvKgotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxmLnNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsKLQkJCQlzZWxmLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJCQlzZWxmLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5leHBhbmRJbWFnZTsKLQkJCX0KLQkJCSovCi0JCQlzZWxmLmNvbGxhcHNlQWxsKCk7Ci0JCQkKLQkJCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkJZXZ0LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX07Ci0JCXNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCXNwYW4uY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlVGV4dCc7Ci0JCXNwYW4uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5jb2xsYXBzZUFsbFRleHQpKTsJCQkJCi0JCWxpbmsuYXBwZW5kQ2hpbGQoc3Bhbik7Ci0JCWRpdi5hcHBlbmRDaGlsZChsaW5rKTsKLQkJCi0JCS8qCi0JCXZhciBvdmVydmlld1NlcGFyYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdmVydmlld1NlcGFyYXRvciIpOwotCQlvdmVydmlld1NlcGFyYXRvci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkaXYsIG92ZXJ2aWV3U2VwYXJhdG9yKTsKLQkJKi8KLQkJaWYgKHRoaXMuZmlyc3RTZWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyc3RTZWN0aW9uLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRpdiwgdGhpcy5maXJzdFNlY3Rpb24pOwotCQl9Ci0JCQotCQlpZiAoIGNvbnRlbnRQYWdlLmdldEFwcCgpICE9IG51bGwgKSB7Ci0JCQlkaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKLQkJfQotCX07Ci0JCi0JQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5leHBhbmRBbGwgPSBmdW5jdGlvbigpIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWN0aW9uQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkgCXRoaXMuc2VjdGlvbkNvbGxhcHNlRGl2c1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCQkgCXRoaXMuc2VjdGlvbkNvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC5zcmMgPSB0aGlzLmNvbGxhcHNlSW1hZ2U7Ci0JCQkgfQotCX07Ci0JCi0JQ29udGVudFBhZ2VTZWN0aW9uLnByb3RvdHlwZS5jb2xsYXBzZUFsbCA9IGZ1bmN0aW9uKCkgewotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0aGlzLnNlY3Rpb25Db2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKLQkJCQl0aGlzLnNlY3Rpb25Db2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gdGhpcy5leHBhbmRJbWFnZTsKLQkJCX0KLQl9OwotfTsKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjY5MGUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcworKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8gQ2hyaXMgQWxkZXJ0b24sIElCTSBTb2Z0d2FyZSBTZXJ2aWNlcyBBdXN0cmFsaWEsIE1hcmNoIDIwMDgKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGRlZmluZSB0aGUgY2xhc3MgaGVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIGxvYWQgdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbnMgCi1Db250ZW50UGFnZVN1YlNlY3Rpb24gPSBmdW5jdGlvbigpIHsKLQotCXRoaXMucGFyZW50ID0gY29udGVudFBhZ2U7Ci0JLy8gYnkgZGVmYXVsdCwgd2UgcmV1c2UgdGhlIGltYWdlcyBmcm9tIHNlY3Rpb24KLQl0aGlzLmV4cGFuZEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5leHBhbmRJbWFnZTsJCQotCXRoaXMuY29sbGFwc2VJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uY29sbGFwc2VJbWFnZTsKLQl0aGlzLmV4cGFuZEFsbEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5leHBhbmRBbGxJbWFnZTsJCi0JdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gdGhpcy5wYXJlbnQuc2VjdGlvbi5jb2xsYXBzZUFsbEltYWdlOwotCi0JdGhpcy5pbmRlbnRJbWFnZSA9IHRoaXMucGFyZW50LnNlY3Rpb24uc2hpbUltYWdlOwkJLy8gYWRkZWQgYnkgQ2hyaXMgQWxkZXJ0b24KLQotCS8vIGFuZCB1c2UgdGhlIGRlZmF1bHQgdGVzdCwgb3ZlcnJpZGUgdGhpcyBhcyBuZWVkZWQKLQl0aGlzLmV4cGFuZEFsbFRleHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kQWxsU3ViU2VjdGlvbnNUZXh0OwotCXRoaXMuY29sbGFwc2VBbGxUZXh0ID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlQWxsU3ViU2VjdGlvbnNUZXh0OwkKLQotCS8vIGVuc3VyZXMgdGhhdCBzdGVwcyBhcmUgZXhwYW5kZWQgb24gZGlzcGxheQotCXRoaXMuY29sbGFwc2VTdGVwc0J5RGVmYXVsdCA9IHRydWU7Ci0JdGhpcy5maXJzdFN0ZXBTZWN0aW9uID0gbnVsbDsKLQotCXRoaXMuc3RlcENvbGxhcHNlRGl2cyA9IG51bGw7Ci0JdGhpcy5zdGVwQ29sbGFwc2VMaW5rcyA9IG51bGw7Ci0JCQotfTsKLQotLy8gQ3JlYXRlcyB0aGUgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uIGxpbmtzLgotQ29udGVudFBhZ2VTdWJTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVTdGVwTGlua3MgPSBmdW5jdGlvbih0YWdOYW1lLCBjbGFzc1NlbGVjdG9yKSB7Ci0JCi0JaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKSB7Ci0JCXZhciBlbGVtZW50cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDApIHJldHVybjsKLQkJdmFyIHN0ZXBFbGVtZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOwotCi0JCXZhciBleGlzdFN0ZXBDb250ZW50cyA9IG5ldyBBcnJheShlbGVtZW50cy5sZW5ndGgpOwkvLyBhZGRlZCBieSBDaHJpcyBBbGRlcnRvbgotCQl2YXIgdG90YWxMaW5rcyA9IDA7Ci0JCXZhciBrLCBsLCBtOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJaWYgKGVsZW1lbnQuY2xhc3NOYW1lID09IGNsYXNzU2VsZWN0b3IpIHsKLQkJCQkKLQkJCQlrPXRvdGFsTGlua3M7CQkJCS8vIGFkZGVkIGJ5IENocmlzIEFsZGVydG9uCi0KLQkJCQlzdGVwRWxlbWVudHNbdG90YWxMaW5rcysrXSA9IGVsZW1lbnQ7Ci0JCQl9Ci0JCQkvLyBsb29raW5nIGZvciBlbXB0eSBzdGVwcwotCQkJaWYoZWxlbWVudC5jbGFzc05hbWUgPT0gInN0ZXBDb250ZW50IikgewotCQkJCXZhciBleGlzdCA9IGZhbHNlOwotCQkJCXZhciBuZXh0SW5kZXg7Ci0JCQkJZG8gewotCQkJCQlsID0gZWxlbWVudC5pbm5lckhUTUwudG9VcHBlckNhc2UoKS5pbmRleE9mKCI8VEQ+IikrNDsKLQkJCQkJbSA9IGVsZW1lbnQuaW5uZXJIVE1MLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiPC9URD4iKTsKLQkJCQkJaWYgKGVsZW1lbnQuaW5uZXJIVE1MLnN1YnN0cihsLG0tbCkhPScnP3RydWU6ZmFsc2UpCi0JCQkJCXsKLQkJCQkJCWV4aXN0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCW5leHRJbmRleCA9IGVsZW1lbnQuaW5uZXJIVE1MLnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiPFREPiIsbCk7Ci0JCQkJfXdoaWxlIChuZXh0SW5kZXg+LTEpOwotCQkJCWV4aXN0U3RlcENvbnRlbnRzW2tdID0gZXhpc3Q7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRvdGFsTGlua3MgPT0gMCkgcmV0dXJuOwotCQlzdGVwRWxlbWVudHMubGVuZ3RoID0gdG90YWxMaW5rczsKLQkJdGhpcy5zdGVwQ29sbGFwc2VEaXZzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLnN0ZXBDb2xsYXBzZUxpbmtzID0gbmV3IEFycmF5KHRvdGFsTGlua3MpOwotCQl0aGlzLmZpcnN0U3RlcFNlY3Rpb24gPSBzdGVwRWxlbWVudHNbMF07Ci0JCWZvciAodmFyIGkgPSAwOyBpIDwgc3RlcEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IHN0ZXBFbGVtZW50c1tpXTsKLQkJCXZhciBzaWJsaW5nQ29udGFpbmVyOwotCQkJaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgJiYgKHNpYmxpbmdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkgJiYgc2libGluZ0NvbnRhaW5lci5zdHlsZSkgewotCQkJCXZhciBuZXh0U2libGluZyA9IGVsZW1lbnQubmV4dFNpYmxpbmc7Ci0JCQkJZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzaWJsaW5nQ29udGFpbmVyLCBuZXh0U2libGluZyk7Ci0JCQkJdmFyIG5leHRFbGVtZW50ID0gc3RlcEVsZW1lbnRzW2kgKyAxXTsKLQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbmV4dEVsZW1lbnQgJiYgbmV4dFNpYmxpbmcgIT0gbnVsbCkgewotCQkJCQl2YXIgdG9Nb3ZlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCW5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmcubmV4dFNpYmxpbmc7Ci0JCQkJCXNpYmxpbmdDb250YWluZXIuYXBwZW5kQ2hpbGQodG9Nb3ZlKTsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMuY29sbGFwc2VTdGVwc0J5RGVmYXVsdCkgewotICAgIAkJCQlzaWJsaW5nQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0gICAgCQkJfQotICAgIAkJCXRoaXMuc3RlcENvbGxhcHNlRGl2c1tpXSA9IHNpYmxpbmdDb250YWluZXI7Ci0JCQkJLy8gZXh0cmEgcGFyYW1ldGVyIGFkZGVkIC0gZXhpc3RTdGVwQ29udGVudHNbaV0KLSAgICAJCQl0aGlzLmNyZWF0ZUNvbGxhcHNpYmxlU3RlcFNlY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaSwgZXhpc3RTdGVwQ29udGVudHNbaV0pOwotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhpcy5jcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3Moc3RlcEVsZW1lbnRzWzBdKTsKLQl9Ci19OwotCi0vLyBDcmVhdGVzIGEgY29sbGFwc2libGUgc3RlcCBzZWN0aW9uLgotLy8gZXh0cmEgcGFyYW1ldGVyIGFkZGVkIC0gY29udGVudAotQ29udGVudFBhZ2VTdWJTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVDb2xsYXBzaWJsZVN0ZXBTZWN0aW9uID0gZnVuY3Rpb24oZWxlbWVudCwgc2libGluZ0NvbnRhaW5lciwgaW5kZXgsIGV4aXN0Q29udGVudCkgewotCi0JaWYgKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpIHsKLQkJdmFyIHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7Ci0JCWlmKGV4aXN0Q29udGVudCkgewotCQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCQlsaW5rLmNvbGxhcHNlRGl2ID0gc2libGluZ0NvbnRhaW5lcjsKLQkJCWxpbmsuaHJlZiA9ICcnOwotCQkJdmFyIGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7Ci0JCQlpZiAodGhpcy5jb2xsYXBzZVN0ZXBzQnlEZWZhdWx0KSB7Ci0JCQkJaW1hZ2Uuc3JjID0gdGhpcy5leHBhbmRJbWFnZTsKLQkJCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsKLQkJCQlpbWFnZS50aXRsZSA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwkKLQkJCX0KLQkJCWVsc2UgewotCQkJCWltYWdlLnNyYyA9IHRoaXMuY29sbGFwc2VJbWFnZTsKLQkJCQlpbWFnZS5hbHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwotCQkJCWltYWdlLnRpdGxlID0gY29udGVudFBhZ2UucmVzLmNvbGxhcHNlVGV4dDsJCi0JCQl9Ci0JCQlpbWFnZS53aWR0aCA9ICcxNyc7Ci0JCQlpbWFnZS5oZWlnaHQgPSAnMTUnOwotCQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQkKLQkJCXZhciBzZWxmID0gdGhpczsKLQkJCWxpbmsub25jbGljayA9IC8qdGhpcy5leHBhbmRDb2xsYXBzZVN0ZXBTZWN0aW9uOyovZnVuY3Rpb24oZXZ0KSB7Ci0JCQkJaWYgKHRoaXMuY29sbGFwc2VEaXYuc3R5bGUuZGlzcGxheSA9PSAnJykgewotCQkJCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwotCQkJCQl0aGlzLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5leHBhbmRJbWFnZTsKLQkJCQkJdGhpcy5maXJzdENoaWxkLmFsdCA9IGNvbnRlbnRQYWdlLnJlcy5leHBhbmRUZXh0OwotCQkJCQl0aGlzLmZpcnN0Q2hpbGQudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuZXhwYW5kVGV4dDsJCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLnBhcmVudE5vZGUucGFyZW50Tm9kZS5uZXh0U2libGluZy5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCQkJCXRoaXMuZmlyc3RDaGlsZC5zcmMgPSBzZWxmLmNvbGxhcHNlSW1hZ2U7Ci0JCQkJCXRoaXMuZmlyc3RDaGlsZC5hbHQgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwotCQkJCQl0aGlzLmZpcnN0Q2hpbGQudGl0bGUgPSBjb250ZW50UGFnZS5yZXMuY29sbGFwc2VUZXh0OwkJCQkJCi0JCQkJfQotCQkJCWlmIChldnQgJiYgZXZ0LnByZXZlbnREZWZhdWx0KSB7Ci0JCQkJCWV2dC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCSAgICB9Ci0JICAgIGVsc2Ugey8vIHJlbW92ZXMgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbiB3aGVyZSBzdGVwIGhhcyBub3QgY29udGVudAotCQkJdmFyIGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJCWltYWdlLnNyYyA9IHRoaXMuaW5kZW50SW1hZ2U7Ci0JCQlpbWFnZS5hbHQgPSAnJzsKLQkJCWltYWdlLnRpdGxlID0gJyc7Ci0JCQlpbWFnZS53aWR0aCA9ICcxNyc7Ci0JCQlpbWFnZS5oZWlnaHQgPSAnMTUnOwotCQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQkJaW1hZ2UuYWxpZ24gPSAnYWJzbWlkZGxlJzsKLQkJCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCSAgICB9Ci0JICAgIHRoaXMuc3RlcENvbGxhcHNlTGlua3NbaW5kZXhdID0gbGluazsKLQkgICAgc3Bhbi5hcHBlbmRDaGlsZChsaW5rKTsKLQkgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUoc3BhbiwgZWxlbWVudC5maXJzdENoaWxkKTsKLQkgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQkgICAgZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcuZnJvbUNoYXJDb2RlKDE2MCkpKTsKLQl9Ci19OwotCi0JCQkJCQotLy8gQ3JlYXRlcyB0aGUgRXhwYW5kIEFsbCBhbmQgQ29sbGFwc2UgQWxsIFN0ZXBzIGxpbmtzLgotQ29udGVudFBhZ2VTdWJTZWN0aW9uLnByb3RvdHlwZS5jcmVhdGVFeHBhbmRDb2xsYXBzZUFsbFN0ZXBzTGlua3MgPSBmdW5jdGlvbihmaXJzdEVsZW1lbnQpIHsKLQl2YXIgZGl2OwotCXZhciBzZWxmID0gdGhpczsKLQkKLQlpZiAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiAoZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpKSB7Ci0JCWRpdi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJZGl2LmFsaWduID0gJ3JpZ2h0JzsJCQotCQl2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTsKLQkJaW1hZ2Uuc3JjID0gdGhpcy5leHBhbmRBbGxJbWFnZTsKLQkJaW1hZ2UuYWx0ID0gdGhpcy5leHBhbmRBbGxUZXh0Ci0JCWltYWdlLnRpdGxlID0gdGhpcy5leHBhbmRBbGxUZXh0Ci0JCWltYWdlLndpZHRoID0gJzE2JzsKLQkJaW1hZ2UuaGVpZ2h0ID0gJzE2JzsKLQkJaW1hZ2UuYm9yZGVyID0gJzAnOwotCQlpbWFnZS5hbGlnbiA9ICdhYnNtaWRkbGUnOwotCQl2YXIgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKLQkJbGluay5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VMaW5rJzsKLQkJbGluay5ocmVmID0gJyc7Ci0JCWxpbmsuYXBwZW5kQ2hpbGQoaW1hZ2UpOwotCQlsaW5rLm9uY2xpY2sgPSAvKnRoaXMuZXhwYW5kQWxsU3RlcHM7Ki9mdW5jdGlvbihldnQpIHsKLQkJCSBmb3IgKHZhciBpID0gMDsgaSA8IHNlbGYuc3RlcENvbGxhcHNlRGl2cy5sZW5ndGg7IGkrKykgewotCQkJIAlzZWxmLnN0ZXBDb2xsYXBzZURpdnNbaV0uc3R5bGUuZGlzcGxheSA9ICcnOwotCQkJCQkvL3N0b3BzIGNvbGxhcHNlIGJ1dHRvbiBiZWluZyBhZGRlZCB3aGVyZSBzdGVwIGhhcyBubyBjb250ZW50IGV4cGFuZEFsbCBidXR0b24gaXMgY2xpY2tlZAotCQkJICAgICAJaWYgKHNlbGYuc3RlcENvbGxhcHNlTGlua3NbaV0uZmlyc3RDaGlsZC50aXRsZSAhPSAnJykgewotCQkJCQlzZWxmLnN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQuc3JjID0gc2VsZi5jb2xsYXBzZUltYWdlOwotCQkJICAgICAJfQotCQkJIH0KLQkJCSBpZiAoZXZ0ICYmIGV2dC5wcmV2ZW50RGVmYXVsdCkgewotCQkJIAlldnQucHJldmVudERlZmF1bHQoKTsKLQkJCSB9Ci0JCQkgcmV0dXJuIGZhbHNlOwotCQl9OwotCQl2YXIgc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsKLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmV4cGFuZEFsbFRleHQpKTsKLQkJbGluay5hcHBlbmRDaGlsZChzcGFuKTsKLQkJZGl2LmFwcGVuZENoaWxkKGxpbmspOwotCQlkaXYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApKSk7Ci0JCQotCQlpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOwotCQlpbWFnZS5zcmMgPSB0aGlzLmNvbGxhcHNlQWxsSW1hZ2U7Ci0JCWltYWdlLmFsdCA9IHRoaXMuY29sbGFwc2VBbGxUZXh0Ci0JCWltYWdlLnRpdGxlID0gdGhpcy5jb2xsYXBzZUFsbFRleHQKLQkJaW1hZ2Uud2lkdGggPSAnMTYnOwotCQlpbWFnZS5oZWlnaHQgPSAnMTYnOwotCQlpbWFnZS5ib3JkZXIgPSAnMCc7Ci0JCWltYWdlLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCWxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7Ci0JCWxpbmsuY2xhc3NOYW1lID0gJ2V4cGFuZENvbGxhcHNlTGluayc7Ci0JCWxpbmsuaHJlZiA9ICcnOwotCQlsaW5rLmFwcGVuZENoaWxkKGltYWdlKTsKLQkJbGluay5vbmNsaWNrID0gLyp0aGlzLmNvbGxhcHNlQWxsU3RlcHM7Ki9mdW5jdGlvbihldnQpIHsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zdGVwQ29sbGFwc2VEaXZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2VsZi5zdGVwQ29sbGFwc2VEaXZzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCQkJLy9zdG9wcyBleHBhbmQgYnV0dG9uIGJlaW5nIGFkZGVkIHdoZXJlIHN0ZXAgaGFzIG5vIGNvbnRlbnQgd2hlbiBjb2xsYXBzZUFsbCBidXR0b24gaXMgY2xpY2tlZAotCQkJCWlmIChzZWxmLnN0ZXBDb2xsYXBzZUxpbmtzW2ldLmZpcnN0Q2hpbGQudGl0bGUgIT0gJycpIHsKLQkJCQkJc2VsZi5zdGVwQ29sbGFwc2VMaW5rc1tpXS5maXJzdENoaWxkLnNyYyA9IHNlbGYuZXhwYW5kSW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGV2dCAmJiBldnQucHJldmVudERlZmF1bHQpIHsKLQkJCQlldnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfTsKLQkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKLQkJc3Bhbi5jbGFzc05hbWUgPSAnZXhwYW5kQ29sbGFwc2VUZXh0JzsKLQkJc3Bhbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLmNvbGxhcHNlQWxsVGV4dCkpOwotCQlsaW5rLmFwcGVuZENoaWxkKHNwYW4pOwotCQlkaXYuYXBwZW5kQ2hpbGQobGluayk7Ci0JCQotCQlpZiAodGhpcy5maXJzdFN0ZXBTZWN0aW9uKSB7Ci0JCQl0aGlzLmZpcnN0U3RlcFNlY3Rpb24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZGl2LCB0aGlzLmZpcnN0U3RlcFNlY3Rpb24pOwotCQl9Ci0JfQotfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMTQ3ZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLUNvbnRlbnRQYWdlVG9vbGJhciA9IGZ1bmN0aW9uKCl7Ci0KLXRoaXMuZXhwYW5kQWxsSW1hZ2UgPSBudWxsOwotdGhpcy5jb2xsYXBzZUFsbEltYWdlID0gbnVsbDsKLXRoaXMuYm9va21hcmtJbWFnZSA9IG51bGw7Ci10aGlzLnByaW50SW1hZ2UgPSBudWxsOwotdGhpcy5iYWNrSW1hZ2UgPSBudWxsOwotdGhpcy5mb3J3YXJkSW1hZ2UgPSBudWxsOwotdGhpcy5kaXZpZGVySW1hZ2UgPSBudWxsOwotCi0vLyBob2xkIHRoZSB0b29sYmFyIGl0ZW0gaWRzCi10aGlzLnRvb2xiYXJJdGVtcyA9IFtdOwotCi10aGlzLmJhckl0ZW1JZFByZWZpeCA9ICJjb250ZW50YmFyXyI7Ci0KLX0KLQotQ29udGVudFBhZ2VUb29sYmFyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oaW1nUGF0aCkgewotCi0JdGhpcy5leHBhbmRBbGxJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdleHBhbmRfYWxsLmdpZicpOwkKLQl0aGlzLmNvbGxhcHNlQWxsSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnY29sbGFwc2VfYWxsLmdpZicpOwotCXRoaXMuYm9va21hcmtJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdib29rbWFyay5naWYnKTsKLQl0aGlzLnByaW50SW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAncHJpbnQuZ2lmJyk7Ci0JdGhpcy5iYWNrSW1hZ2UgPSBjb250ZW50UGFnZS5yZXNvbHZlVXJsKGltZ1BhdGggKyAnYmFjay5naWYnKTsKLQl0aGlzLmZvcndhcmRJbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdmb3J3YXJkLmdpZicpOwotCXRoaXMuZGl2aWRlckltYWdlID0gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdQYXRoICsgJ2RpdmlkZXIuZ2lmJyk7Ci0JLy90aGlzLnNoaW1JbWFnZSA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwoaW1nUGF0aCArICdzaGltLmdpZicpOwotCQotCXRoaXMuX2NyZWF0ZVRvb2xiYXIoKTsKLX07Ci0KLUNvbnRlbnRQYWdlVG9vbGJhci5wcm90b3R5cGUuX2NyZWF0ZVRvb2xiYXIgPSBmdW5jdGlvbigpIHsKLQl2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRlbnRQYWdlVG9vbGJhciIpOwotCQkKLQlpZiAoIGNvbnRhaW5lciA9PSBudWxsICkgewotCQlyZXR1cm47Ci0JfQotCQotCXZhciBodG1sID0gWyI8dGFibGUgYm9yZGVyPScwJyBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzAnID4iLCAiPHRyPiJdOwotCQkKLQkJLy8gbG9jYWwgZmlsZSBjYW4ndCBiZSBhZGRlZCBhcyBib29rbWFyawotCQlpZiAoICFjb250ZW50UGFnZS5pc0ZpbGVVcmwobG9jYXRpb24uaHJlZikgKSB7Ci0JCQlodG1sID0gaHRtbC5jb25jYXQodGhpcy5fZ2V0VG9vbGJhckl0ZW1IdG1sKHRoaXMuYm9va21hcmtJbWFnZSwgY29udGVudFBhZ2UucmVzLnRvb2xiYXJfYm9va21hcmspKTsKLQkJfQotCQkKLQkJaHRtbCA9IGh0bWwuY29uY2F0KHRoaXMuX2dldFRvb2xiYXJJdGVtSHRtbCh0aGlzLmJhY2tJbWFnZSwgY29udGVudFBhZ2UucmVzLnRvb2xiYXJfYmFjaykpOwotCQlodG1sID0gaHRtbC5jb25jYXQodGhpcy5fZ2V0VG9vbGJhckl0ZW1IdG1sKHRoaXMuZm9yd2FyZEltYWdlLCBjb250ZW50UGFnZS5yZXMudG9vbGJhcl9mb3J3YXJkKSk7Ci0JCWh0bWwgPSBodG1sLmNvbmNhdCh0aGlzLl9nZXRUb29sYmFySXRlbUh0bWwodGhpcy5leHBhbmRBbGxJbWFnZSAsIGNvbnRlbnRQYWdlLnJlcy50b29sYmFyX2V4cGFuZF9hbGwpKTsKLQkJaHRtbCA9IGh0bWwuY29uY2F0KHRoaXMuX2dldFRvb2xiYXJJdGVtSHRtbCh0aGlzLmNvbGxhcHNlQWxsSW1hZ2UsIGNvbnRlbnRQYWdlLnJlcy50b29sYmFyX2NvbGxhcHNlX2FsbCkpOwotCQlodG1sID0gaHRtbC5jb25jYXQoWyI8dGQgd2lkdGg9JzEwcHgnPjxpbWcgYWx0PScnIHNyYz0nIiwgdGhpcy5kaXZpZGVySW1hZ2UsICInIHRpdGxlPScnLz48L3RkPiJdKTsKLQkJaHRtbCA9IGh0bWwuY29uY2F0KHRoaXMuX2dldFRvb2xiYXJJdGVtSHRtbCh0aGlzLnByaW50SW1hZ2UsIGNvbnRlbnRQYWdlLnJlcy50b29sYmFyX3ByaW50KSk7Ci0JCWh0bWwgPSBodG1sLmNvbmNhdChbIjwvdHI+IiwgIjwvdGFibGU+Il0pOwotCQkKLQljb250YWluZXIuaW5uZXJIVE1MID0gaHRtbC5qb2luKCIiKTsKLQotCS8vIGF0dGFjaCBldmVudHMKLQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMudG9vbGJhckl0ZW1zLmxlbmd0aDsgaSsrICkgewotCQl2YXIgaWQgPSB0aGlzLnRvb2xiYXJJdGVtc1tpXTsKLQkJdmFyIGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKLQkJLy9hbGVydChiYXIudGFnTmFtZSk7Ci0JCQotCQkvLyBub3RlOiBhbGwgaGFuZGxlciBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBmYWxzZSB0byBhdm9pZCB0aGUgdXJsIGFjdGlvbgotCQl2YXIgaGFuZGxlciA9IG51bGw7Ci0JCWlmICggaWQuaW5kZXhPZih0aGlzLmJvb2ttYXJrSW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQljb250ZW50UGFnZS5zYXZlQXNCb29rbWFyaygpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5iYWNrSW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQkvL2FsZXJ0KCJiYWNrIik7Ci0JCQkJdmFyIGFwcCA9IGNvbnRlbnRQYWdlLmdldEFwcCgpOwotCQkJCWlmICggYXBwICE9IG51bGwgKSB7Ci0JCQkJCWFwcC5icm93c2VyLmJhY2soKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkJfSBlbHNlIGlmICggaWQuaW5kZXhPZih0aGlzLmZvcndhcmRJbWFnZSkgPj0gMCApIHsKLQkJCWhhbmRsZXIgPSAgZnVuY3Rpb24oKSB7IAotCQkJCXZhciBhcHAgPSBjb250ZW50UGFnZS5nZXRBcHAoKTsKLQkJCQlpZiAoIGFwcCAhPSBudWxsICkgewotCQkJCQlhcHAuYnJvd3Nlci5mb3J3YXJkKCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCX0gZWxzZSBpZiAoIGlkLmluZGV4T2YodGhpcy5leHBhbmRBbGxJbWFnZSkgPj0gMCApIHsKLQkJCWhhbmRsZXIgPSAgZnVuY3Rpb24oKSB7IAotCQkJCWNvbnRlbnRQYWdlLnNlY3Rpb24uZXhwYW5kQWxsKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkJfSBlbHNlIGlmICggaWQuaW5kZXhPZih0aGlzLmNvbGxhcHNlQWxsSW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQljb250ZW50UGFnZS5zZWN0aW9uLmNvbGxhcHNlQWxsKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfTsKLQkJfSBlbHNlIGlmICggaWQuaW5kZXhPZih0aGlzLnByaW50SW1hZ2UpID49IDAgKSB7Ci0JCQloYW5kbGVyID0gIGZ1bmN0aW9uKCkgeyAKLQkJCQl3aW5kb3cucHJpbnQoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCQl9IAotCQkKLQkJaWYgKCBoYW5kbGVyICE9IG51bGwgKSB7Ci0JCQliYXIub25jbGljayA9IGhhbmRsZXI7CQkJCi0JCX0KLQkJCi0JCS8vIGhhbmRsZSB0aGUga2V5IHN0cm9rZQotCQkKLQl9Ci0KLQkKLQkvKgotCXZhciB0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRhYmxlIik7Ci0JdGFibGUuYm9yZGVyID0gIjIiOwotCXRhYmxlLmNlbGxzcGFjaW5nID0gIjAiOwotCXRhYmxlLmNlbGxwYWRkaW5nID0gIjAiOwotCWNvbnRhaW5lci5hcHBlbmRDaGlsZCh0YWJsZSk7Ci0JCi0JdmFyIHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKLQl0YWJsZS5hcHBlbmRDaGlsZCh0cik7Ci0JKi8KLQkvLyBjcmVhdGUgdGhlIGJhciBpdGVtcwotCS8vdHIuYXBwZW5kQ2hpbGQodGhpcy5fY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5ib29rbWFya0ltYWdlLCAiQm9va21hcmsgdGhpcyBwYWdlIiwgIjIwcHgiKSk7Ci0JLyoKLQl0ci5hcHBlbmRDaGlsZCh0aGlzLmNyZWF0ZVRvb2xiYXJJdGVtKHRoaXMuYmFja0ltYWdlLCAiYmFjayIsICIyMHB4IikpOwotCXRyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5mb3J3YXJkSW1hZ2UsICJmb3J3YXJkIiwgIjIwcHgiKSk7Ci0JdHIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUb29sYmFySXRlbSh0aGlzLmV4cGFuZEFsbEltYWdlLCAiZXhwYW5kIEFsbCIsICIyMHB4IikpOwotCXRyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5jb2xsYXBzZUFsbEltYWdlLCAiY29sbGFwc2UgQWxsIiwgIjIwcHgiKSk7Ci0JdHIuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVUb29sYmFySXRlbSh0aGlzLmRpdmlkZXJJbWFnZSwgIiIsICIxMHB4IikpOwotCXRyLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlVG9vbGJhckl0ZW0odGhpcy5wcmludEltYWdlLCAiUHJpbnQiLCAiMjBweCIpKTsKLQkqLwotCQotfTsKLQotQ29udGVudFBhZ2VUb29sYmFyLnByb3RvdHlwZS5fZ2V0VG9vbGJhckl0ZW1IdG1sID0gZnVuY3Rpb24oaW1nU3JjLCB0ZXh0KSB7Ci0JCi0JdmFyIGluZGV4ID0gdGhpcy50b29sYmFySXRlbXMubGVuZ3RoOwotCXZhciBpZCA9IHRoaXMuYmFySXRlbUlkUHJlZml4ICsgaW1nU3JjOwotCXRoaXMudG9vbGJhckl0ZW1zW2luZGV4XSA9IGlkOwotCQotCXZhciBodG1sID0gWyI8dGQgd2lkdGg9JzIwcHgnIGNsYXNzPSdjb250ZW50VG9vbGJhckljb24nPjxhIGhyZWY9JycgaWQ9JyIsIGlkLCAiJz4iLCAgCi0JCSI8aW1nIGFsdD0nIiwgdGV4dCwgIicgc3JjPSciLCBpbWdTcmMsICInIHRpdGxlPSciLCB0ZXh0LCAiJy8+PC9hPiIsICI8L3RkPiJdOwotCi0JcmV0dXJuIGh0bWw7CQotfTsKLQotQ29udGVudFBhZ2VUb29sYmFyLnByb3RvdHlwZS5fY3JlYXRlVG9vbGJhckl0ZW0gPSBmdW5jdGlvbihpbWdTcmMsIHRleHQsIHdpZHRoKSB7Ci0JdmFyIHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKLQl0ZC53aWR0aCA9IHdpZHRoOwotCQotCXZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKTsKLQlpbWcuaWQgPSB0aGlzLmJhckl0ZW1JZFByZWZpeCArIGltZ1NyYzsKLQkKLQlpbWcuc3JjID0gaW1nU3JjOwotCWltZy50aXRsZSA9IHRleHQ7Ci0JaW1nLmFsdCA9IHRleHQ7Ci0JaW1nLndpZHRoID0gJzE2JzsKLQlpbWcuaGVpZ2h0ID0gJzE2JzsKLQlpbWcuYm9yZGVyID0gJzAnOwotCS8vaW1nLmFsaWduID0gJ2Fic21pZGRsZSc7Ci0JCi0JdGQuYXBwZW5kQ2hpbGQoaW1nKTsKLQkKLQkvL2FsZXJ0KCJ0ZDogIiArIHRkKTsKLQkKLQlyZXR1cm4gdGQ7Ci19OwotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliOGRhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzkgKzAsMCBAQAotCi0vLyBkZWZpbmUgdGhlIGNsYXNzIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBsb2FkIHRoZSBkZXRhaWwgaW1wbGVtZW50YXRpb25zIAotZnVuY3Rpb24gUHJvY2Vzc0VsZW1lbnRQYWdlKCkgewotCi0JdGhpcy5wYXJfcHJvYyA9IG51bGw7Ci0JdGhpcy5wYXJfcGF0aCA9IG51bGw7Ci0KLQkvLyBpbWFnZXMgZm9yIHRoZSBhY3Rpdml0eSwgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IHdoZW4gcHVibGlzaGluZwotCXRoaXMuaW1hZ2VGaWxlcyA9IFtdOwotCQotCS8vIHN1cHByZXNzZWQgaXRlbXMgZm9yIHRoZSBhY3Rpdml0eSwgZ2VuZXJhdGVkIGR5bmFtaWNhbGx5IHdoZW4gcHVibGlzaGluZwotCXRoaXMuc3VwcHJlc3NlZEl0ZW1zID0gW107Ci0JCi0JLy8gZWxlbWVudCB1cmxzIGZvciB0aGUgYWN0aXZpdHksIGdlbmVyYXRlZCBkeW5hbWljYWxseSB3aGVuIHB1Ymxpc2hpbmcKLQl0aGlzLmVsZW1lbnRVcmxzID0gW107Ci0JCQotCXRoaXMudHJlZVRhYmxlID0gbnVsbDsKLQkKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uKGhhc1RyZWUpIHsKLQotCXZhciBwYXJhbWV0ZXJzID0gY29udGVudFBhZ2UuZ2V0VXJsUGFyYW1ldGVycyhjb250ZW50UGFnZS5xdWVyeVN0ci5zdWJzdHJpbmcoMSkpOwotCXRoaXMucGFyX3Byb2MgPSBwYXJhbWV0ZXJzWyJwcm9jIl07Ci0JdGhpcy5wYXJfcGF0aCA9IHBhcmFtZXRlcnNbInBhdGgiXTsKLQkKLQlpZiAoIHRoaXMucGFyX3Byb2MgPT0gbnVsbCB8fCB0aGlzLnBhcl9wYXRoID09IG51bGwgKSB7Ci0JCXBhcmFtZXRlcnMgPSBjb250ZW50UGFnZS5nZXRVcmxQYXJhbWV0ZXJzKGNvbnRlbnRQYWdlLmRlZmF1bHRRdWVyeVN0ci5zdWJzdHJpbmcoMSkpOwotCQl0aGlzLnBhcl9wcm9jID0gcGFyYW1ldGVyc1sicHJvYyJdOwotCQl0aGlzLnBhcl9wYXRoID0gcGFyYW1ldGVyc1sicGF0aCJdOwotCX0JCi0JCi0JaWYgKCBoYXNUcmVlKSB7Ci0JCXRoaXMuY3JlYXRlVHJlZShjb250ZW50UGFnZS5pbWdQYXRoKTsKLQl9Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewotCXRoaXMuZml4TWFwVXJscygpOwotCXRoaXMuZml4VGFiVXJscygpOwotCWlmICggdGhpcy50cmVlVGFibGUgIT0gbnVsbCAmJiB0aGlzLnRyZWVUYWJsZS5jcmVhdGVUcmVlKSB7Ci0JCXRoaXMudHJlZVRhYmxlLmNyZWF0ZVRyZWUoJ2RpdicsICd0cmVlTm9kZScpOwotCX0KLQkKLX07Ci0KLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5jcmVhdGVUcmVlID0gZnVuY3Rpb24oaW1nUGF0aCkgewotCXRoaXMudHJlZVRhYmxlID0gbmV3IEFjdGl2aXR5VHJlZVRhYmxlKHRoaXMpOwotCXRoaXMudHJlZVRhYmxlLmluaXRpYWxpemUoaW1nUGF0aCk7Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmZpeFRhYlVybHMgPSBmdW5jdGlvbigpIHsKLQotCXZhciBhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIlRBQl9EZXNjcmlwdGlvbiIpOwotCWlmICggYSAhPSBudWxsICkgewotCQl0aGlzLmZpeFRhYlVybChhKTsKLQl9Ci0JCi0JYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJUQUJfV0JTIik7Ci0JaWYgKCBhICE9IG51bGwgKSB7Ci0JCXRoaXMuZml4VGFiVXJsKGEpOwotCX0KLQotCWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiVEFCX1dQQlMiKTsKLQlpZiAoIGEgIT0gbnVsbCApIHsKLQkJdGhpcy5maXhUYWJVcmwoYSk7Ci0JfQotCi0JYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJUQUJfVEJTIik7Ci0JaWYgKCBhICE9IG51bGwgKSB7Ci0JCXRoaXMuZml4VGFiVXJsKGEpOwotCX0KLX07Ci0KLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5maXhUYWJVcmwgPSBmdW5jdGlvbihhKSB7Ci0JaWYgKGEgPT0gbnVsbCB8fCAgY29udGVudFBhZ2UucXVlcnlTdHIgPT0gbnVsbCApIHJldHVybjsKLQl2YXIgdXJsID0gYS5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKLQlpZiAoIHVybCAhPSBudWxsICkgewotCQlhLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHVybCArIGNvbnRlbnRQYWdlLnF1ZXJ5U3RyKTsKLQl9Ci19Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZml4TWFwVXJscyA9IGZ1bmN0aW9uKCkgewotCi0JLy8gZml4IHRoZSBtYXAgYXJlYSB1cmwKLQlpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUpIHsKLQkJdmFyIGVsZW1lbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFSRUEiKTsKLQkJaWYgKCBlbGVtZW50cyAhPSBudWxsICkgewotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJdmFyIHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ci0JCQkJdmFyIHJlbFBhdGggPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgicmVsUGF0aCIpOwotCQkJCWlmICggdXJsICE9IG51bGwgJiYgcmVsUGF0aCAhPSBudWxsICkgewotCQkJCQl1cmwgPSB0aGlzLmdldEFjdGl2aXR5SXRlbVVybCh1cmwsIHRoaXMucGFyX3Byb2MsIHRoaXMucGFyX3BhdGgsIHJlbFBhdGgpOwotCQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiaHJlZiIsIHVybCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvLyBmaXggdGhlIGRpYWdyYW0gaW1nIHVybHMKLQl2YXIgZGlhZ3JhbVR5cGUgPSAiQWN0aXZpdHkiOyAvLyBubyB0cmFuc3RhdGlvbiEKLQl2YXIgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkaWFncmFtXyIgKyBkaWFncmFtVHlwZSk7Ci0JaWYgKCBlICE9IG51bGwgKSB7Ci0JCXZhciB1cmwgPSB0aGlzLmdldERpYWdyYW1JbWFnZVVybCh0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoLCBkaWFncmFtVHlwZSk7Ci0JCWlmICggdXJsICE9IG51bGwgKSB7Ci0JCQllLnNyYyA9IHVybDsKLQkJfQotCX0KLQkKLQlkaWFncmFtVHlwZSA9ICJBY3Rpdml0eURldGFpbCI7IC8vIG5vIHRyYW5zdGF0aW9uIQotCWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZGlhZ3JhbV8iICsgZGlhZ3JhbVR5cGUpOwotCQlpZiAoIGUgIT0gbnVsbCApIHsKLQkJCXZhciB1cmwgPSB0aGlzLmdldERpYWdyYW1JbWFnZVVybCh0aGlzLnBhcl9wcm9jLCB0aGlzLnBhcl9wYXRoLCBkaWFncmFtVHlwZSk7Ci0JCQlpZiAoIHVybCAhPSBudWxsICkgewotCQkJCWUuc3JjID0gdXJsOwotCQkJfQotCX0KLX0KLQotCi0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZ2V0QWN0aXZpdHlJdGVtVXJsID0gZnVuY3Rpb24odXJsLCBwcm9jZXNzLCBlbGVtZW50UHJvY2Vzc1BhdGgsIHJlbFByb2Nlc3NQYXRoKQotewotCXZhciBxdWVyeVN0cmluZyA9ICI/cHJvYz0iICsgcHJvY2VzcyArICImcGF0aD0iICsgZWxlbWVudFByb2Nlc3NQYXRoICsgcmVsUHJvY2Vzc1BhdGg7Ci0JcmV0dXJuIGNvbnRlbnRQYWdlLnJlc29sdmVVcmwodXJsKSArIHF1ZXJ5U3RyaW5nOwotCQotfTsKLQotUHJvY2Vzc0VsZW1lbnRQYWdlLnByb3RvdHlwZS5nZXREaWFncmFtSW1hZ2VVcmwgPSBmdW5jdGlvbihwcm9jZXNzLCBlbGVtZW50UHJvY2Vzc1BhdGgsIGRpYWdyYW1UeXBlKQotewotCS8vIGdldCB0aGUgZGlhZ3JhbSBpbWFnZSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcGF0aCBhbmQgcHJvY2VzcwotCS8vIHJldHV0bnMgbnVsbCBpZiBub3RpbmcKLQkvLyBkaWFncmFtIHR5cGUgaXMgQWN0aXZpdHksIEFjdGl2aXR5RGV0YWlsLCAKLQl2YXIgaW1nVXJsID0gdGhpcy5pbWFnZUZpbGVzW2VsZW1lbnRQcm9jZXNzUGF0aCtkaWFncmFtVHlwZV07Ci0JLy9hbGVydCgiZ2V0ICIgKyBkaWFncmFtVHlwZSArICIgZGlhZ3JhbSBmb3IgIiArIGVsZW1lbnRQcm9jZXNzUGF0aCArICIgPSAiICsgaW1nVXJsKTsKLQotCWlmICggaW1nVXJsICE9IG51bGwgJiYgaW1nVXJsICE9ICJ1bmRlZmluZWQiICkgewotCQlyZXR1cm4gY29udGVudFBhZ2UucmVzb2x2ZVVybChpbWdVcmwpOwotCX0gCi0JCi0JcmV0dXJuIG51bGw7Ci19OwotCi0vKnRoaXMgbWV0aG9kIGZpeCB0aGUgdXJsIGZvciBkZXNjcmlwdG9yIGxpbmtzIHdpdGhpbiBkZXNjcmlwdG9yKi8KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZ2V0RGVzY3JpcHRvckl0ZW1VcmwgPSBmdW5jdGlvbih1cmwsIHJlbFByb2Nlc3NQYXRoKQotewotCXZhciBwYXRoID0gIiI7Ci0JdmFyIGkgPSAgdGhpcy5wYXJfcGF0aC5pbmRleE9mKHJlbFByb2Nlc3NQYXRoKTsKLQlpZiAoIGkgPiAwICkgewotCQlwYXRoID0gdGhpcy5wYXJfcGF0aC5zdWJzdHJpbmcoMCwgaSArIHJlbFByb2Nlc3NQYXRoLmxlbmd0aCk7Ci0JfSBlbHNlIHsKLQkJLy8gcmVtb3ZlIHRoZSBsYXN0IGd1aWQKLQkJaSA9IHRoaXMucGFyX3BhdGgubGFzdEluZGV4T2YoIiwiKTsKLQkJcGF0aCA9IHRoaXMucGFyX3BhdGguc3Vic3RyaW5nKDAsIGkrMSkgKyByZWxQcm9jZXNzUGF0aDsKLQl9Ci0JCi0JdmFyIHF1ZXJ5U3RyaW5nID0gIj9wcm9jPSIgKyB0aGlzLnBhcl9wcm9jICsgIiZwYXRoPSIgKyBwYXRoOwotCXVybCA9IGNvbnRlbnRQYWdlLnJlc29sdmVVcmwodXJsKSArIHF1ZXJ5U3RyaW5nOwotCQkKLQlyZXR1cm4gdXJsOwotCQotfTsKLQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmZpeERlc2NyaXB0b3JMaW5rcyA9IGZ1bmN0aW9uKCkKLXsKLQl2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQSIpOwotCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQotCQl2YXIgZ3VpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJndWlkIik7Ci0JCXZhciB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaHJlZiIpOwotCi0JCWlmICggZ3VpZCAhPSBudWxsICYmIGd1aWQgIT0gIiIgKSB7Ci0JCQl1cmwgPSB0aGlzLmdldERlc2NyaXB0b3JJdGVtVXJsKHVybCwgZ3VpZCk7Ci0JCQllbGVtZW50LnNldEF0dHJpYnV0ZSgiaHJlZiIsIHVybCk7Ci0JCX0KLQl9Ci19OwotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmlzU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHByb2Nlc3MsIGVsZW1lbnRQcm9jZXNzUGF0aCkKLXsKLQl2YXIgZmxhZyA9ICh0aGlzLnN1cHByZXNzZWRJdGVtc1tlbGVtZW50UHJvY2Vzc1BhdGhdID09IHRydWUpOwotCS8vaWYgKCBmbGFnICkgYWxlcnQoImdvdCBvbmU6ICIgKyBlbGVtZW50UHJvY2Vzc1BhdGgpOwotCQkKLQlyZXR1cm4gZmxhZzsKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuYnVpbGRUZWFtVHJlZSA9IGZ1bmN0aW9uKHRlYW1UcmVlKSB7CQotCQotCXZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZWFtVHJlZSIpOwotCWlmICggZWwgPT0gbnVsbCApIHJldHVybjsKLQkKLQlpZiAoIHRlYW1UcmVlID09IG51bGwgfHwgdGVhbVRyZWUubGVuZ3RoID09IDAgKSB7Ci0JCXJldHVybjsKLQl9Ci0JCi0JdGVhbVRyZWVbMF1bMF0gPSB0ZWFtVHJlZVswXVswXS5yZXBsYWNlKC8oXCd8XCIpL2csICJcXCQxIik7Ci0KLQl2YXIgdGVhbUJ1ZmZlciA9IFtdOwotCXZhciBsZW4gPSB0ZWFtVHJlZS5sZW5ndGg7Ci0JZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0KLQkJaWYgKCAhdGhpcy5pc1RlYW1TdXBwcmVzc2VkKHRlYW1UcmVlW2ldKSApIHsKLQkJCXRlYW1CdWZmZXJbdGVhbUJ1ZmZlci5sZW5ndGhdID0gIjxkaXYgY2xhc3M9XCJ0ZWFtU3RydWN0dXJlXCIgYWxpZ249XCJsZWZ0XCI+IjsKLQkJCXRlYW1CdWZmZXIgPSB0ZWFtQnVmZmVyLmNvbmNhdCh0aGlzLmdldFRlYW1UcmVlSHRtbCh0ZWFtVHJlZVtpXSkpOwotCQkJdGVhbUJ1ZmZlclt0ZWFtQnVmZmVyLmxlbmd0aF0gPSAiPC9kaXY+PGJyLz4iOwotCQl9Ci0KLQl9Ci0JCi0JLy9hbGVydCh0ZWFtQnVmZmVyKTsKLQkvL2RvY3VtZW50LndyaXRlKHRlYW1CdWZmZXIpOwotCWVsLmlubmVySFRNTCA9IHRlYW1CdWZmZXIuam9pbigiIik7Ci19OwotCi0KLS8vIGZvcm1hdCBpcyBbdXJsLCB0aXRsZSwgcmVsUGF0aCwgc3VwcHJlc3NlZF0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuZ2V0VGVhbVRyZWVIdG1sID0gZnVuY3Rpb24odGVhbVRyZWUpIHsKLQotCWlmICggdGVhbVRyZWUgPT0gbnVsbCB8fCB0ZWFtVHJlZS5sZW5ndGggPCA0KSB7Ci0JCXJldHVybiBbXTsKLQl9Ci0KLQl2YXIgdXJsID0gdGVhbVRyZWVbMF07Ci0JdmFyIHRpdGxlID0gdGVhbVRyZWVbMV07Ci0JdmFyIHJlbFBhdGggPSB0ZWFtVHJlZVsyXTsKLQkKLQl1cmwgPSB0aGlzLmdldEFjdGl2aXR5SXRlbVVybCh1cmwsIHRoaXMucGFyX3Byb2MsIHRoaXMucGFyX3BhdGgsIHJlbFBhdGgpOwotCQotCXZhciB0ZWFtQnVmZmVyID0gWyI8YSBocmVmPVwiIiwgdXJsLCAiXCI+IiwgdGl0bGUsICI8L2E+Il07Ci0JdmFyIHNsZW4gPSA1OwotCQotCWlmICggdGVhbVRyZWUubGVuZ3RoID4gNCAmJiB0ZWFtVHJlZVs0XSAhPSBudWxsICYmIHRlYW1UcmVlWzRdICE9ICIiICYmIHRlYW1UcmVlWzRdICE9IHVuZGVmaW5lZCApIHsKLQkJdGVhbUJ1ZmZlcltzbGVuKytdID0gIjx1bD4iOwotCQlmb3IgKCB2YXIgaSA9IDQ7IGkgPCB0ZWFtVHJlZS5sZW5ndGg7IGkrKyApIHsKLQkJCWlmICh0eXBlb2YgdGVhbVRyZWVbaV0gPT0gIm9iamVjdCIgJiYgIXRoaXMuaXNUZWFtU3VwcHJlc3NlZCh0ZWFtVHJlZVtpXSkgKSB7Ci0KLQkJCQl0ZWFtQnVmZmVyW3NsZW4rK10gPSAiPGxpPiI7Ci0JCQkJdGVhbUJ1ZmZlciA9IHRlYW1CdWZmZXIuY29uY2F0KHRoaXMuZ2V0VGVhbVRyZWVIdG1sKHRlYW1UcmVlW2ldKSk7Ci0JCQkJc2xlbiA9IHRlYW1CdWZmZXIubGVuZ3RoOwotCQkJCXRlYW1CdWZmZXJbc2xlbisrXSA9ICI8L2xpPiI7Ci0JCQl9Ci0JCX0KLQkJdGVhbUJ1ZmZlcltzbGVuKytdID0gIjwvdWw+IjsKLQl9Ci0KLQlyZXR1cm4gdGVhbUJ1ZmZlcjsKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuaXNUZWFtU3VwcHJlc3NlZCA9IGZ1bmN0aW9uKHRlYW1UcmVlKSB7Ci0KLQlpZiAoIHRlYW1UcmVlID09IG51bGwgfHwgdGVhbVRyZWUubGVuZ3RoIDwgNCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JdmFyIHJlbFBhdGggPSB0ZWFtVHJlZVsyXTsKLQl2YXIgc3VwID0gdGVhbVRyZWVbM107Ci0KLQlpZiAoIHN1cCA9PSAiIiApIHsKLQkJcmV0dXJuIHRoaXMuaXNTdXBwcmVzc2VkKHRoaXMucGFyX3Byb2MsIHRoaXMucGFyX3BhdGggKyByZWxQYXRoKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKHN1cCA9PSAidHJ1ZSIpOwotCX0KLQkKLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuYnVpbGRQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIgPSBmdW5jdGlvbih1cmwpIHsKLQotCXZhciBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnJlYWRjcnVtYnMiKTsKLQlpZiAoIGRpdiA9PSBudWxsICkgcmV0dXJuOwotCi0JdmFyIHZpZXdGcmFtZSA9IGNvbnRlbnRQYWdlLmdldFZpZXdGcmFtZSgpOwotCWlmICggdmlld0ZyYW1lID09IG51bGwgKSB7Ci0JCXJldHVybjsKLQl9Ci0JCQotCXZhciBwYXRocyA9IHRoaXMucGFyX3BhdGguc3BsaXQoIiwiKTsKLQkKLQl2YXIgaGFzQXBwID0gKGNvbnRlbnRQYWdlLmdldEFwcCgpICE9IG51bGwpOwkKLQl2YXIgbm9kZUluZm8gPSBudWxsOwotCQotCWlmICggaGFzQXBwICkgewotCQkvLyB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgcHJvY2VzcyBndWlkCi0JCS8vIGhvd2V2ZXIsIHRoZSB0cmVlIG5vZGUgbWlnaHQgYmUgYW4gYWN0aXZpdHkgd2l0aG91dCBoYXZpbmcgYSBwcm9jZXNzIG5vZGUKLQkJLy8gZm9yIGV4YW1wbGUsIGEgZGlzY2lwbGluZSBjYW4gaGF2ZSBhbiBhY3Rpdml0eSBhcyBhIHJlZmVyZW5jZWQgd29yayBmbG93Ci0JCS8vIHNvIGNoZWNrIGFsbCAKLQkJZm9yICh2YXIgeCA9IDA7IHggPCBwYXRocy5sZW5ndGg7IHgrKyApIHsKLQkJCXZhciBpZCA9IHBhdGhzW3hdOwotCQkJbm9kZUluZm8gPSB2aWV3RnJhbWUuZ2V0Tm9kZUluZm8oaWQpOwotCQkJaWYgKCBub2RlSW5mbyAhPSBudWxsICkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiB0aGUgcHJvY2VzcyBpcyBub3QgaW4gdGhlIHRyZWUsIHRoZXJlIGlzIG5vIG5vZGVpbmZvCi0JCS8vIGluIHN1Y2ggY2FzZSwgdXNlIHRoZSBub2RlIGluZm8gb2YgdGhlIGVsZW1lbnQKLQkJaWYgKCBub2RlSW5mbyA9PSBudWxsICkgewotCQkJbm9kZUluZm8gPSBjb250ZW50UGFnZS5ub2RlSW5mbzsKLQkJfQotCQkKLQkJaWYgKCBub2RlSW5mbyAhPSBudWxsICkgewotCQkJLy8gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IHNpbmNlIGl0J3MgdGhlIHZpZXcgbm9kZQotCQkJcGF0aHMuc2hpZnQoKTsKLQkKLQkJCXZhciBzZWxmID0gdGhpczsKLQkJCXZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKGJjcykgewotCQkJCXNlbGYuX3Nob3dQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIoZGl2LCBiY3MsIHVybCk7Ci0JCQl9OwotCQkJdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzQnlQYXRoKG5vZGVJbmZvLCBwYXRocywgY2FsbGJhY2spOwotCQl9IGVsc2UgewotCQkJLy8gaWYgY2FuJ3QgZmluZCB0aGUgdHJlZSBub2RlLCBqdXN0IHNob3cgdGhlIHByb2Nlc3MgYnJlYWRjcnVtYnMKLQkJCXZhciBiY3MgPSBbXTsKLQkJCXRoaXMuX3Nob3dQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIoZGl2LCBiY3MsIHVybCk7Ci0JCX0KLQl9IGVsc2UgewotCQl2YXIgYmNzID0gbnVsbDsKLQkJd2hpbGUgKHBhdGhzLmxlbmd0aCA+IDAgKSB7Ci0JCQliY3MgPSB2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnNCeVBhdGgocGF0aHMpOwotCQkJaWYgKCBiY3MgIT0gbnVsbCAmJiBiY3MubGVuZ3RoID4gMCApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJcGF0aHMuc2hpZnQoKTsKLQkJfQotCQkKLQkJaWYgKCBiY3MgPT0gbnVsbCB8fCBiY3MubGVuZ3RoID09IDAgKSB7Ci0JCQliY3MgID0gdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzKHVybCk7Ci0JCX0KLQkJCi0JCS8vYWxlcnQoYmNzKTsKLQkJdGhpcy5fc2hvd1Byb2Nlc3NFbGVtZW50QnJlYWRDcnVtYihkaXYsIGJjcywgdXJsKTsKLQl9Ci0JCi0KLX07Ci0KLVByb2Nlc3NFbGVtZW50UGFnZS5wcm90b3R5cGUuX3Nob3dQcm9jZXNzRWxlbWVudEJyZWFkQ3J1bWIgPSBmdW5jdGlvbihkaXYsIGJjcywgdXJsKSB7Ci0JdmFyIHZpZXdGcmFtZSA9IGNvbnRlbnRQYWdlLmdldFZpZXdGcmFtZSgpOwotCWlmICh2aWV3RnJhbWUgPT0gbnVsbCB8fCAhdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzICkgewotCQlyZXR1cm47Ci0JfQotCQotCXZhciBsb2NhbEJjcyA9IFtdOwotCXZhciBjb3VudCA9IDA7Ci0JdmFyIGxpbmtzVGV4dCA9ICIiOwotCXZhciBwYXRocyA9IHRoaXMucGFyX3BhdGguc3BsaXQoIiwiKTsKLQl2YXIgcGF0aCA9IHRoaXMucGFyX3BhdGg7Ci0JCi0JdmFyIGhhc0FwcCA9IChjb250ZW50UGFnZS5nZXRBcHAoKSAhPSBudWxsKTsKLQkvL2FsZXJ0KCJhcHA6IiArIGhhc0FwcCk7Ci0JdmFyIGJhc2VVcmwgPSBudWxsOwotCWlmICggaGFzQXBwICkgewotCQliYXNlVXJsID0gY29udGVudFBhZ2UuZ2V0QXBwKCkuZ2V0QmFzZVVybCgpOwotCX0gZWxzZSB7CQotCQliYXNlVXJsID0gdmlld0ZyYW1lLmdldEJhc2VVcmwoKTsKLQl9Ci0JCi0JdmFyIGxhc3RCY3NJZCA9IG51bGw7Ci0JaWYgKCBiY3MgPT0gbnVsbCApIHsKLQkJYmNzID0gW107Ci0JfSBlbHNlIGlmICggYmNzLmxlbmd0aCA+IDAgKSB7Ci0JCWxhc3RCY3NJZCA9IGJjc1tiY3MubGVuZ3RoLTFdLmlkOwotCX0KLQkKLQkKLQlmb3IgKHZhciBpID0gcGF0aHMubGVuZ3RoLTE7IGkgPj0wOyBpLS0pIHsKLQkJdmFyIGd1aWQgPSBwYXRoc1tpXTsKLQotCQl2YXIgaXRlbV90ZXh0ID0gIiI7Ci0JCXZhciBpdGVtX3VybCA9ICIiOwotCQkKLQkJdmFyIGl0ZW0gPSB0aGlzLmVsZW1lbnRVcmxzW2d1aWRdOwotCQlpZiAoIGl0ZW0gIT0gbnVsbCApIHsKLQkJCWl0ZW1fdGV4dCA9IGl0ZW1bMF07Ci0JCQlpdGVtX3VybCA9IGJhc2VVcmwgKyBpdGVtWzFdOwotCi0JCQkvLyBnZXQgdGhlIHVybCB3aXRoIG5vIGJhY2sgcGF0aCwgdGhlbiBjb252ZXIgdG8gYSBmdWxsIHVybAkJCQotCQkJaXRlbV91cmwgPSB0aGlzLmdldEFjdGl2aXR5SXRlbVVybChpdGVtX3VybCwgdGhpcy5wYXJfcHJvYywgcGF0aCwgJycpOwotCQkJLy8gZ2V0IHRoZSBsYXN0IHRyZWUtbm9kZSBicmVhZGNydW1icwotCQkJLy8gcHJvY2VzcyB0aGlzIGJlZm9yZSB0aGUgaXRlbV91cmwgaXMgc2V0Ci0JCQkvL2FsZXJ0KCJ2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnM6ICIgKyB2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnMpOwotCQkJaWYgKCBndWlkID09IGxhc3RCY3NJZCApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCQotCQkJbG9jYWxCY3NbY291bnQrK10gPSB7aWQ6IGd1aWQsIHVybDogaXRlbV91cmwsIHRpdGxlOiBpdGVtX3RleHR9OwkJCQotCQl9Ci0JCQotCQkvLyB0cmltIHRoZSBwYXRoCi0JCXZhciB4ID0gcGF0aC5pbmRleE9mKCIsIiArIGd1aWQpOwotCQlpZiAoIHggPiAwICkgewotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHgpOwotCQl9Ci0JfQotCi0JaWYgKCBsb2NhbEJjcy5sZW5ndGggPiAwICkgewotCQkvLyBvcmRlciBpdCByaWdodAotCQlsb2NhbEJjcyA9IGxvY2FsQmNzLnJldmVyc2UoKTsKLQkJaWYgKCBiY3MgPT0gbnVsbCApICBiY3MgPSBbXTsJCQotCQl2YXIgY291bnQgPSBiY3MubGVuZ3RoOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGxvY2FsQmNzLmxlbmd0aDsgaSsrKSB7Ci0JCQliY3NbY291bnQraV0gPSBsb2NhbEJjc1tpXTsKLQkJfQotCX0KLQkKLQlpZiAoIGJjcyAhPSBudWxsICYmIGJjcy5sZW5ndGggPiAwICkgewotCQljb250ZW50UGFnZS5zaG93QnJlYWRjcnVtbnMoZGl2LCBiY3MpOwotCX0KLQkKLX07Ci0KLQotCi1Qcm9jZXNzRWxlbWVudFBhZ2UucHJvdG90eXBlLmdldFByb2Nlc3NFbGVtZW50TGlua0h0bWxGcm9tSWQgPSBmdW5jdGlvbihndWlkLCBlbGVtZW50UGF0aCwgYmFja1BhdGgpIHsKLQotCXZhciBzdHIgPSBbXTsKLQl2YXIgaXRlbSA9IHRoaXMuZWxlbWVudFVybHNbZ3VpZF07Ci0JaWYgKCBpdGVtICE9IG51bGwgKSB7Ci0JCXZhciB0ZXh0ID0gaXRlbVswXTsKLQkJdmFyIHVybCA9IGJhY2tQYXRoICsgaXRlbVsxXTsKLQkJdXJsID0gdGhpcy5nZXRBY3Rpdml0eUl0ZW1VcmwodXJsLCB0aGlzLnBhcl9wcm9jLCBlbGVtZW50UGF0aCwgJycpOwotCQkKLQkJLy8gZXNjYXBlIHRoZSBxdW90ZXMKLQkJdXJsID0gdXJsLnJlcGxhY2UoLycvZywgIlxcJyIpOwotCQl1cmwgPSB1cmwucmVwbGFjZSgvXCIvZywgIlxcXCIiKTsKLQkJCQotCQkJCi0JCXN0ciA9IFsiPGEgaHJlZj1cIiIsIHVybCwgIlwiPiIsIHRleHQsICI8L2E+Il07Ci0JfQotCi0JCi0JcmV0dXJuIHN0ci5qb2luKCIiKTsKLX07Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvY29udGVudFBhZ2UuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2Q4NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3NjcmlwdHMvY29udGVudFBhZ2UuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoaXMgdGVtcG9yYXJ5IGZ1bmN0aW9uIGhlbHBzIHRvIHJlc29sdmUgSmF2YXNjcmlwdCBlcnJvcnMgaW4gdGhlIG1pZ3JhdGVkIFJVUAotLy8gY29udGVudCBwYWdlcy4gSXQgd2lsbCBiZSByZW1vdmVkIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgLmpzIGZpbGVzIGFyZSBiZWluZwotLy8gbWlncmF0ZWQgYWxvbmcgd2l0aCB0aGUgSFRNTCBjb250ZW50IHBhZ2VzLgotZnVuY3Rpb24gUmVmZXJlbmNlSGVscFRvcGljICh0b3BpY05hbWUsIGJvb2sgLCBmaWxlTmFtZSkgewotICAgLy9kb2N1bWVudC53cml0ZSgiPGk+IisgdG9waWNOYW1lICsgIjxcL2k+Iik7Ci19OwotCi0KLXZhciBjb250ZW50UGFnZSA9IHsKLQotCWJhY2tQYXRoOiBudWxsLAotCWltZ1BhdGg6IG51bGwsCi0JZGVmYXVsdFF1ZXJ5U3RyOiBudWxsLAotCXF1ZXJ5U3RyOiBudWxsLAotCWlzUHJvY2Vzc1BhZ2U6IGZhbHNlLAotCW5vZGVJbmZvOiBudWxsLAotCQotCS8vIGRlZmluZSByZXNvdXJjZSBmaWxlCi0JcmVzIDogbmV3IENvbnRlbnRQYWdlUmVzb3VyY2UoKSwKLQkKLQkvLyBkZWZpbmUgYWN0aXZpdHkgbGF5b3V0LCBuZWVkIHRvIGNyZWF0ZSB0aGlzIGFzIGEgcGxhY2UgaG9sZGVyIAotCS8vIHNvIHRoYXQgdGhlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBkYXRhIGNhbiBiZSBsb2FkZWQKLQlwcm9jZXNzUGFnZTogKCB0eXBlb2YgUHJvY2Vzc0VsZW1lbnRQYWdlID09ICJ1bmRlZmluZWQiICkgPyBudWxsIDogbmV3IFByb2Nlc3NFbGVtZW50UGFnZSgpLAotCQotCS8vIGRlZmluZSBzZWN0aW9uCi0Jc2VjdGlvbjogbmV3IENvbnRlbnRQYWdlU2VjdGlvbigpLAotCQotCS8vIGRlZmluZSBzdWItc2VjdGlvbgotCXN1YlNlY3Rpb246IG51bGwsCi0JCi0JdG9vbGJhcjogbnVsbCwKLQkKLQkvLyBhdXRvIHdyYXAgZWxlbWVudHMKLQlhdXRvV3JhcEVsZW1lbnRzOiBbXSwKLQkKLQkvLyBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSB0aGUgcGFnZSBpcyBsb2FkZWQKLQkvLyB0aGlzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBwYWdlIGNvbnRlbnQgaXMgcHJvY2Vzc2VkCi0JLy8gZm9yIGV4YW1wbGUsIGlmIHRoZSBjb250ZW50IG5lZWRzIHRvIHVzZSBzb21lIHBhcmFtZXRlcnMgaW5zaWRlIHRoZSBjb250ZW50Ci0JLy8gdGhpcyBhcHByb2FjaCBpcyBub3QgcmVjb21tZW50ZWQgYnV0IGtlZXAgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCXByZWxvYWQ6IGZ1bmN0aW9uKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBoYXNTdWJTZWN0aW9uLCBpc1Byb2Nlc3NQYWdlLCBoYXNUcmVlKSB7Ci0KLQkJdGhpcy5pc1Byb2Nlc3NQYWdlID0gaXNQcm9jZXNzUGFnZSB8fCBoYXNUcmVlOwotCQl0aGlzLmltZ1BhdGggPSBpbWdQYXRoOwotCQl0aGlzLmJhY2tQYXRoID0gYmFja1BhdGg7Ci0JCXRoaXMubm9kZUluZm8gPSBub2RlSW5mbzsKLQkJdGhpcy5kZWZhdWx0UXVlcnlTdHIgPSBkZWZhdWx0UXVlcnlTdHI7Ci0JCXRoaXMucXVlcnlTdHIgPSBsb2NhdGlvbi5zZWFyY2g7Ci0JCQotCQkvLyBjb252ZXJ0IHRoZSBpbWFnZSBwYXRoIHRvIGFic29sdXRlIHBhdGgKLQkJLy8gb3RoZXJ3aXNlIHRoZSBwYWdlIHdpbGwgcmVzb2x2ZSB0byB3cm9uZyBhYnNvbHV0ZSBwYXRoIGlmIHRoZSBicm93c2VyIGNhc2hlZCB0aGUgcGFnZXMKLQkJdmFyIGJhc2UgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKLQkJdmFyIGkgPSBiYXNlLmxhc3RJbmRleE9mKCIvIik7Ci0JCXRoaXMuaW1nUGF0aCA9IGJhc2Uuc3Vic3RyaW5nKDAsIGkrMSkgKyB0aGlzLmltZ1BhdGg7Ci0JCS8vYWxlcnQodGhpcy5pbWdQYXRoKTsKLQotCi0JCWlmICggdGhpcy5xdWVyeVN0ciA9PSBudWxsIHx8IHRoaXMucXVlcnlTdHIgPT0gIiIgKQotCQl7Ci0JCQl0aGlzLnF1ZXJ5U3RyID0gdGhpcy5kZWZhdWx0UXVlcnlTdHI7Ci0JCX0KLQkJCQkKLQkJdGhpcy5zZWN0aW9uLmluaXQodGhpcy5pbWdQYXRoKTsKLQkJCQkKLQkJaWYgKCBoYXNTdWJTZWN0aW9uICkgewotCQkJdGhpcy5zdWJTZWN0aW9uID0gbmV3IENvbnRlbnRQYWdlU3ViU2VjdGlvbigpOwotCQl9Ci0JCQotCQlpZiAoIHRoaXMucHJvY2Vzc1BhZ2UgJiYgKGlzUHJvY2Vzc1BhZ2UgfHwgaGFzVHJlZSkgKSB7Ci0JCQl0aGlzLnByb2Nlc3NQYWdlLmluaXQoaGFzVHJlZSk7Ci0JCX0KLQkJCQkKLQl9LAotCQotCQotCS8vIGNhbGwgdGhpcyBtZXRob2Qgd2hlbiBwYWdlIGlzIGxvYWRlZAotCW9ubG9hZDogZnVuY3Rpb24oKSB7Ci0JCXRoaXMuc2VjdGlvbi5jcmVhdGVTZWN0aW9uTGlua3MoJ2RpdicsICdzZWN0aW9uSGVhZGluZycsIHRoaXMuaW1nUGF0aCk7Ci0JCWlmICggdGhpcy5zdWJTZWN0aW9uICE9IG51bGwgKSB7Ci0JCQl0aGlzLnN1YlNlY3Rpb24uY3JlYXRlU3RlcExpbmtzKCdkaXYnLCAnc3RlcEhlYWRpbmcnKTsKLQkJfQotCQkJCi0JCXZhciBzZWxmID0gdGhpczsKLQkJdmFyIGFwcCA9IHRoaXMuZ2V0QXBwKCk7Ci0JCQotCQlpZiAoIGFwcCAhPSBudWxsICkgewotCQkJdGhpcy50b29sYmFyID0gbmV3IENvbnRlbnRQYWdlVG9vbGJhcigpOwotCQkJdGhpcy50b29sYmFyLmluaXQodGhpcy5pbWdQYXRoKTsKLQkJfQkJCi0JCQotCQkvLyByZWdpc3RlciBhdXRvIHdyYXAgZWxlbWVudAotCQlpZiAoIHRoaXMuYXV0b1dyYXBFbGVtZW50cy5sZW5ndGggPiAwICkgewotCQkJd2luZG93Lm9ucmVzaXplID0gZnVuY3Rpb24oZSkgewotCQkJCWNvbnRlbnRQYWdlLnJlc2l6ZUJsb2NrVGV4dCgpOwotCQkJfQkJCi0JCQl0aGlzLnJlc2l6ZUJsb2NrVGV4dCgpOwotCQl9Ci0JCQotCQkvL2FsZXJ0KCJjb250ZW50IG9uIGxvYWQ6ICIgKyBsb2NhdGlvbi5ocmVmKTsKLQkJCi0JCWlmICggdGhpcy5wcm9jZXNzUGFnZSApIHsKLQkJCXRoaXMucHJvY2Vzc1BhZ2Uub25sb2FkKCk7Ci0JCX0gCi0JCQotCQlpZiAoIGFwcCAhPSBudWxsICkgewotCQkJaWYgKCAhYXBwLmlzSW5pdGlhbGl6ZWQoKSApIHsKLQkJCQl2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpIHsKLQkJCQkvL2FsZXJ0KCJjb250ZW50IG9uIGxvYWQ6IGluIGNhbGxiYWNrIik7Ci0JCQkJCWFwcC5vbkNvbnRlbnRMb2FkZWQobG9jYXRpb24uaHJlZik7Ci0JCQkJCXNlbGYuYnVpbGRCcmVhZGNydW1ucygpOwotCQkJCX07Ci0JCQkJYXBwLmFkZFBvc3RJbml0Q2FsbGJhY2soY2FsbGJhY2spOwotCQkJCQotCQkJfSBlbHNlIHsKLQkJCQkvL2FsZXJ0KCJjb250ZW50IG9uIGxvYWQ6IGNhbGxpbmcgYnJlYWRCcmVhZGNydW1icyIpOwkKLQkJCQlhcHAub25Db250ZW50TG9hZGVkKGxvY2F0aW9uLmhyZWYpOwotCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBzZWxmLmJ1aWxkQnJlYWRjcnVtbnMoKTsgfSwgMTApOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5idWlsZEJyZWFkY3J1bW5zKCk7Ci0JCX0KLQkJCi0JCS8vYWxlcnQoImNvbnRlbnQgcGFnZSBsb2FkZWQiKTsKLQkJCi0JCS8vIHVzZXIgY2FuIGFkZCBjdXN0b21pemF0aW9uIGNvZGUgaGVyZQotCQkvLyB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBwYWdlIGlzIGxvYWRlZAotCQkvLyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gaW5zZXJ0aW5nIGphdmFzY3JpcHQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSA8L2h0bWw+IHRhZwotCQkKLQl9LAotCQotCWJ1aWxkQnJlYWRjcnVtbnMgOiBmdW5jdGlvbigpIHsKLQkJaWYgKCB0aGlzLnByb2Nlc3NQYWdlICkgewotCQkJdGhpcy5wcm9jZXNzUGFnZS5idWlsZFByb2Nlc3NFbGVtZW50QnJlYWRDcnVtYihsb2NhdGlvbi5ocmVmKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuX2J1aWxkQnJlYWRjcnVtbnMobG9jYXRpb24uaHJlZik7Ci0JCX0gCi0JfSwKLQkKLQlyZXNpemVCbG9ja1RleHQ6IGZ1bmN0aW9uKCkgewotCQl2YXIgbmV3V2lkdGggPSB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aCAtIDIwOwotCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmF1dG9XcmFwRWxlbWVudHMubGVuZ3RoOyBpKysgKSB7Ci0JCQl2YXIgZWxlbSA9IHRoaXMuYXV0b1dyYXBFbGVtZW50c1tpXTsKLQkJCWVsZW0uc3R5bGUud2lkdGg9bmV3V2lkdGggKyAicHgiOyAvLyBmaXJlZm94IGRvZXMgbm90IHdvcmsgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSB1bml0Ci0JCX0KLQl9LAotCQotCQotCWFkZEF1dG9XcmFwRWxlbWVudDogZnVuY3Rpb24oZWxlbSkgewotCQl0aGlzLmF1dG9XcmFwRWxlbWVudHMucHVzaChlbGVtKTsKLQl9LAotCQotCS8vIHV0aWxpdHkgbWV0aG9kcwotCWdldFVybFBhcmFtZXRlcnM6IGZ1bmN0aW9uKHF1ZXJ5U3RyKQotCXsKLQkJdmFyIGFyciA9IG5ldyBBcnJheSgpOwkKLQkJdmFyIHBhaXJzID0gcXVlcnlTdHIuc3BsaXQoIiYiKTsKLQkgICAJZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykgewotCSAgICAgCQl2YXIgcG9zID0gcGFpcnNbaV0uaW5kZXhPZignPScpOwotCSAgICAgCQlpZiAocG9zID09IC0xKSBjb250aW51ZTsKLQkgICAgIAkJdmFyIGFyZ25hbWUgPSBwYWlyc1tpXS5zdWJzdHJpbmcoMCxwb3MpOwotCSAgICAgCQl2YXIgdmFsdWUgPSBwYWlyc1tpXS5zdWJzdHJpbmcocG9zKzEpOyAgICAJCi0JICAgICAJCWFyclthcmduYW1lXSA9IHZhbHVlOwotCQl9Ci0JCQotCQlyZXR1cm4gYXJyOwotCX0sCi0KLQlnZXRBcHAgOiBmdW5jdGlvbigpIHsKLQkJaWYoIHR5cGVvZiB0aGVBcHAgIT0gInVuZGVmaW5lZCIpIHsKLQkJCXJldHVybiB0aGVBcHA7Ci0JCX0gZWxzZSBpZiAoIHdpbmRvdy5wYXJlbnQgJiYgdHlwZW9mIHdpbmRvdy5wYXJlbnQudGhlQXBwICE9ICJ1bmRlZmluZWQiKSB7Ci0JCQlyZXR1cm4gd2luZG93LnBhcmVudC50aGVBcHA7Ci0JCX0KLQkKLQkJcmV0dXJuIG51bGw7Ci0JfSwKLQkKLQlnZXRWaWV3RnJhbWU6IGZ1bmN0aW9uKCkgewotCQotCQl2YXIgYXBwID0gdGhpcy5nZXRBcHAoKTsKLQkJaWYgKCBhcHAgIT0gbnVsbCApIHsKLQkJCi0JCQkvLyBtYWtlIHN1cmUgdGhlIGFwcCBpcyBpbml0aWFsaXplZAotCQkJaWYgKCBhcHAuaXNJbml0aWFsaXplZCgpICkgewotCQkJCXJldHVybiBhcHAubmF2OwotCQkJfSBlbHNlIHsgCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJdmFyIHZpZXdGcmFtZSA9IG51bGw7Ci0JCWZvciAoIHZhciBpID0gMDsgaSA8IHdpbmRvdy5wYXJlbnQuZnJhbWVzLmxlbmd0aDsgaSsrICkgewotCQkJaWYgKCB3aW5kb3cucGFyZW50LmZyYW1lc1tpXS5uYW1lID09ICdvcnlfdG9jX2ZyYW1lJyApIHsKLQkJCQl2YXIgdG9jRnJhbWUgPSB3aW5kb3cucGFyZW50LmZyYW1lc1tpXTsKLQkJCQkvL2FsZXJ0KHRvY0ZyYW1lKTsKLQkJCQlpZiAodG9jRnJhbWUuZnJhbWVzLmxlbmd0aCA+IDAgKSB7Ci0JCQkJCWZvciAoIHZhciB4ID0gMDsgeCA8IHRvY0ZyYW1lLmZyYW1lcy5sZW5ndGg7IHgrKyApIHsKLQkJCQkJCWlmICh0b2NGcmFtZS5mcmFtZXNbeF0ubmFtZSA9PSAnb3J5X3RvYycgKSB7Ci0JCQkJCQkJdmlld0ZyYW1lID0gdG9jRnJhbWUuZnJhbWVzW3hdOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiB2aWV3RnJhbWU7Ci0JfSwKLQotCV9idWlsZEJyZWFkY3J1bW5zOiBmdW5jdGlvbih1cmwpIHsKLQkJdmFyIHZpZXdGcmFtZSA9IHRoaXMuZ2V0Vmlld0ZyYW1lKCk7Ci0JCWlmICggdmlld0ZyYW1lID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl2YXIgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJyZWFkY3J1bWJzIik7Ci0JCWlmIChkaXYgIT0gbnVsbCAmJiB2aWV3RnJhbWUgIT0gbnVsbCAmJiB2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnMgKSB7Ci0JCQlpZiAoIHRoaXMuZ2V0QXBwKCkgPT0gbnVsbCApIHsKLQkJCQkvLyBkb24ndCBicmVhayBvbGQgY29kZQotCQkJCXZhciBiY3MgPSB2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnModXJsKTsKLQkJCQlpZiAoIGJjcyAhPSBudWxsICYmIGJjcy5sZW5ndGggPiAwICkgewotCQkJCQl0aGlzLnNob3dCcmVhZGNydW1ucyhkaXYsIGJjcyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2YXIgc2VsZiA9IHRoaXM7Ci0JCQkJdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oYmNzKSB7Ci0JCQkJCWlmICggYmNzICE9IG51bGwgJiYgYmNzLmxlbmd0aCA+IDAgKSB7Ci0JCQkJCQlzZWxmLnNob3dCcmVhZGNydW1ucyhkaXYsIGJjcyk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCQkKLQkJCQlpZiAoY29udGVudFBhZ2Uubm9kZUluZm8gIT0gbnVsbCAmJiBjb250ZW50UGFnZS5ub2RlSW5mby5sZW5ndGggPiAwICkgewotCQkJCQl2aWV3RnJhbWUuZ2V0QnJlYWRjcnVtYnNCeVBhdGgoY29udGVudFBhZ2Uubm9kZUluZm8sIG51bGwsIGNhbGxiYWNrKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCS8vdmlld0ZyYW1lLmdldEJyZWFkY3J1bWJzKHVybCwgY2FsbGJhY2spOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCQotCQl9Ci0JCi0JfSwKLQotCi0Jc2hvd0JyZWFkY3J1bW5zOiBmdW5jdGlvbihkaXYsIC8qYXJyYXkqL2JjcykgewotCQlpZiAoZGl2ID09IG51bGwgfHwgYmNzID09IG51bGwgfHwgYmNzLmxlbmd0aCA9PSAwICApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdmFyIGh0bWwgPSBbXTsKLQkJdmFyIHNsZW4gPSAwOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGJjcy5sZW5ndGg7IGkrKyApIHsKLQkJCXZhciBiYyA9IGJjc1tpXTsgLy8ge3VybDp1cmwsIHRpdGxlOnRpdGxlfQotCQkJaWYgKCBpID4gMCApIHsKLQkJCQlodG1sW3NsZW4rK10gPSAiPHNwYW4+Jm5ic3A7PiZuYnNwOzwvc3Bhbj4iOwotCQkJfQotCi0JCQkvLyBlc2NhcGUgdGhlIHF1b3RlcwotCQkJdmFyIHVybCA9IGJjLnVybDsKLQkJCXVybCA9IHVybC5yZXBsYWNlKC8nL2csICJcXCciKTsKLQkJCXVybCA9IHVybC5yZXBsYWNlKC9cIi9nLCAiXFxcIiIpOwotCi0JCQlodG1sID0gaHRtbC5jb25jYXQoWyI8YSBocmVmPVwiIiwgdXJsLCAiXCI+IiwgYmMudGl0bGUsICI8L2E+Il0pIDsKLQkJCXNsZW4gPSBodG1sLmxlbmd0aDsKLQkJfQotCi0JCXZhciBzdHIgPSBbIjx0YWJsZSBib3JkZXI9XCIwXCIgY2VsbHBhZGRpbmc9XCIwXCIgY2VsbHNwYWNpbmc9XCIwXCIgd2lkdGg9XCIxMDAlXCI+IiwKLQkJCSI8dHI+PHRkIGFsaWduPVwibGVmdFwiPiJdOwotCQlzdHIgPSBzdHIuY29uY2F0KGh0bWwpOwotCQlzdHIgPSBzdHIuY29uY2F0KFsiPC90ZD48dHI+IiwgIjwvdGFibGU+Il0pOwotCQlkaXYuaW5uZXJIVE1MID0gc3RyLmpvaW4oIiIpOwotCX0sCi0JCi0JCi0JcmVzb2x2ZVVybDogZnVuY3Rpb24odXJsKSB7Ci0KLQkJLy8gbm90ZTogZG9uJ3QgY2FsbCB0aGUgYXBwLnJlc29sdmVDb250ZW50dXJsKCkgc2luY2UgdGhlIGNvbnRlbnQgdXJsIG1pZ2h0IG5vdCBiZSBzZXQgeWV0Ci0JCS8vIHVzZSB0aGUgd2luZG93J3MgdXJsIGRpcmVjdGx5Ci0JCWlmICggdXJsLmluZGV4T2YoIi4vIikgPT0gMCApIHsJCQkKLQkJCQl2YXIgYmFzZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwotCQkJCS8vYWxlcnQoImJhc2U6IiArIGJhc2UpOwotCQkJCXZhciBpID0gYmFzZS5sYXN0SW5kZXhPZigiLyIpOwotCQkJCXVybCA9IGJhc2Uuc3Vic3RyaW5nKDAsIGkpICsgdXJsLnN1YnN0cmluZygxKTsKLQkJfSAKLQkJCi0JCXJldHVybiB1cmw7Ci0JfSwKLQkKLQkvKiBnZXQgdGhlIHBhZ2UgZ3VpZCwgaXQncyB0aGUgZ3VpZCBvZiB0aGUgZWxlbWVudCBvciBwYWdlKi8KLQlnZXRQYWdlSWQgOiBmdW5jdGlvbigpIHsKLQkJdmFyIGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicGFnZS1ndWlkIik7Ci0JCWlmICggZSAhPSBudWxsICkgewotCQkJcmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9LAotCQotCXNhdmVBc0Jvb2ttYXJrOiBmdW5jdGlvbigpIHsKLQkKLSAgICAgICAgIC8vIGZvciBJRSwgZG9lcyBub3Qgd29yayBmb3IgbG9jYWwgZmlsZSBicm93c2luZwotICAgICAgICAgLy8gb25seSBvbiBzZXJ2ZXIKLQotCQkvL3ZhciBhcHAgPSB0aGlzLmdldEFwcCgpOwotCQl2YXIgdXJsID0gbG9jYXRpb24uaHJlZjsKLQkJdmFyIHRpdGxlID0gZG9jdW1lbnQudGl0bGU7CQkJCi0gCQlpZiAod2luZG93LnNpZGViYXIpIHsgCi0gICAgICAgICAgICAvLyBmb3IgTW96aWxsYSBGaXJlZm94Ci0gICAgICAgICAgICB3aW5kb3cuc2lkZWJhci5hZGRQYW5lbCh0aXRsZSwgdXJsLCAiIik7Ci0gICAgICAgIH0gZWxzZSBpZiggd2luZG93LmV4dGVybmFsICkgeyAKLSAgICAgICAgICAgIHdpbmRvdy5leHRlcm5hbC5BZGRGYXZvcml0ZSh1cmwsIHRpdGxlKTsKLSAgICAgICAgfSBlbHNlIGlmKHdpbmRvdy5vcGVyYSAmJiB3aW5kb3cucHJpbnQpIHsgCi0gICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gCX0sCi0JCi0JaXNGaWxlVXJsOiBmdW5jdGlvbih1cmwpIHsKLQkJcmV0dXJuICh1cmwgIT0gbnVsbCkgJiYgKHVybC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImZpbGU6Ly8iKSA9PSAwKTsKLQl9Ci0JLy8gaGVscGVyIG1ldGhvZHMKLQotfTsKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC9zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmZmI2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQvc2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHByb2Nlc3MgbGF5b3V0IHJlbGF0ZWQgZGF0YSBmcm9tIFJNQyBwdWJsaXNoaW5nIHNlcnZpY2UgCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI2NmRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHkueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFwcGluZy54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIHF1ZXJ5U3RyID0gbG9jYXRpb24uc2VhcmNoOwotCQkJCQlkb2N1bWVudC53cml0ZSgiJmx0O21ldGEgaHR0cC1lcXVpdj1cInJlZnJlc2hcIiBjb250ZW50PVwiMDt1cmw9PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBkZWZhdWx0VGFiVXJsIi8+IiArIHF1ZXJ5U3RyICsgIlwiJmd0OyIpOwotCQkJCTwvc2NyaXB0PgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPiAKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCTwvaGVhZD4JCQkKLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV9kZXNjLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfZGVzYy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2I1MGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV9kZXNjLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImFjdGl2aXR5X2hlbHBlci54c2wiLz4JCi0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ii8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiLz4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCQk8ZGl2IGlkPSJicmVhZGNydW1icyIvPgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlbmVyYWxUZXh0RmllbGRTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHNjb3BlVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdzY29wZSddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcHVycG9zZVRleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncHVycG9zZSddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyeVByb2Nlc3MnICI+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9qZWN0U3BlY2lmaWNzU2VjdGlvbiI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJJbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZW5lcmFsVGV4dEZpZWxkU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRzdGFmZmluZ1RleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0naG93dG9TdGFmZiddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIka2V5Q29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2tleUNvbnNpZGVyYXRpb25zJ10iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZW5lcmFsVGV4dEZpZWxkU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRhbHRlcm5hdGl2ZXNUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2FsdGVybmF0aXZlcyddIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJPHRyIHZhbGlnbj0ibWlkZGxlIj4KLQkJCQk8dGQgd2lkdGg9IjEwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWFfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV0JTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1RCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdUQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV1BCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXUEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjIiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iSWxsdXN0cmF0aW9uc1NlY3Rpb24iPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvYWRtYXBzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdleGFtcGxlcyddL0VsZW1lbnQpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbGx1c3RyYXRpb25zVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHJvYWRtYXBUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2FkbWFwcyddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGV4YW1wbGVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZXhhbXBsZXMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvamVjdFNwZWNpZmljc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd0eXBlT2ZDb250cmFjdCddICE9ICcnIG9yICRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Byb2plY3RNZW1iZXJFeHBlcnRpc2UnXSAhPSAnJyBvciAkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmlza0xldmVsJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3NjYWxlJ10gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvamVjdFNwZWNpZmljc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkdHlwZW9mQ29udHJhY3RUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd0eXBlT2ZDb250cmFjdCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRlc3RpbWF0aW5nVGVjaG5pcXVlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nZXN0aW1hdGluZ1RlY2huaXF1ZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcmlza0xldmVsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmlza0xldmVsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRzY2FsZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3NjYWxlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8eHNsOmlmIHRlc3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10gIT0gJycgb3IgJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlTm90ZXMnXSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZVRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHVzYWdlTm90ZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZU5vdGVzJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J3ZhbGlkQ29udGV4dCddL0VsZW1lbnQpICsgY291bnQocmVmZXJlbmNlW0BuYW1lPSdzdXBlckFjdGl2aXRpZXMnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2luY2x1ZGVzUGF0dGVybnMnXS9FbGVtZW50KSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0ndmFsaWRDb250ZXh0J10vRWxlbWVudCkgPiAwIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkY29udGV4dHMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY29udGV4dFRleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ndmFsaWRDb250ZXh0J10vRWxlbWVudCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZGNvbnRleHRzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNvbnRleHRUZXh0Ii8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nZGVmYXVsdENvbnRleHQnXS9FbGVtZW50Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcGFyZW50QWN0aXZpdGllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0nc3VwZXJBY3Rpdml0aWVzJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkaW5jbHVkZWRQYXR0ZXJuc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2luY2x1ZGVzUGF0dGVybnMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+Ci0JCTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiID4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdW1tYXJ5Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC94c2w6YXR0cmlidXRlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRldmVudERyaXZlblRleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb25nb2luZ1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5pbmdEYXRhVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRyZXBlYXRhYmxlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZ2VuZXJhbFRleHRGaWVsZFNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJmaWVsZFRleHQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkZmllbGRUZXh0ICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpZWxkTGFiZWwiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZmllbGRUZXh0Ii8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQocmVmZXJlbmNlTGlzdFtAbmFtZT0nY29uY2VwdHMnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2NoZWNrbGlzdHMnXS9FbGVtZW50KSArIGNvdW50KHJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbW11bmljYXRpb25zTWF0ZXJpYWxzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdndWlkZWxpbmVzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdXBwb3J0aW5nTWF0ZXJpYWxzJ10vRWxlbWVudCkgKyBjb3VudChyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXVzYWJsZUFzc2V0cyddL0VsZW1lbnQpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NoZWNrbGlzdHMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMnXSI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNvbW11bmljYXRpb25zTWF0ZXJpYWxzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbW11bmljYXRpb25zTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZWR1Y2F0aW9uTWF0ZXJpYWxzJ10iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRlZHVjYXRpb25NYXRlcmlhbHNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZWR1Y2F0aW9uTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2d1aWRlbGluZXMnXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXVzYWJsZUFzc2V0cyddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdXBwb3J0aW5nTWF0ZXJpYWxzJ10vRWxlbWVudCIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkY29udGV4dHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlZk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZWZFbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iJHJlZkVsZW1lbnQiPgotCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVmRWxlbWVudCk+MCI+Ci0JCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVmTmFtZSIvPgotCQkJCQk8L3RoPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVmRWxlbWVudCI+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmlmPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfaGVscGVyLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfaGVscGVyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1NjkwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X2hlbHBlci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhYlVybEF0dHJpYnV0ZSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idXJsIi8+Ci0JCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXJsIi8+PC94c2w6YXR0cmlidXRlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5RGlhZ3JhbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGlhZ3JhbSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNpbmdsZS1xdW90ZSI+JzwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNwZWNpYWwtcXVvdGUiPmA8L3hzbDp2YXJpYWJsZT4KLQkJPHAvPgotCQk8aW1nIGJvcmRlcj0iMCIgZGlhZ3JhbVR5cGU9InskZGlhZ3JhbS9AbmFtZX0iPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPmRpYWdyYW1fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaWFncmFtL0BuYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpYWdyYW0vbWFwL0BzcmMiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbHQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0cmFuc2xhdGUoJGRpYWdyYW0vQGFsdCwkc2luZ2xlLXF1b3RlLCRzcGVjaWFsLXF1b3RlKSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InRpdGxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRkaWFncmFtL0BhbHQsJHNpbmdsZS1xdW90ZSwkc3BlY2lhbC1xdW90ZSkiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ1c2VtYXAiPiM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpYWdyYW0vbWFwL0BuYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQk8L2ltZz4KLQkJPG1hcCBuYW1lPSJ7JGRpYWdyYW0vbWFwL0BuYW1lfSI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpYWdyYW0vbWFwL2FyZWEiPgotCQkJCTxhcmVhPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGhyZWYiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InJlbFBhdGgiPiw8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImFsdCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbHQiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InRpdGxlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGFsdCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29vcmRzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvb3JkcyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic2hhcGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hhcGUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9hcmVhPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwvbWFwPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV90YnMueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV90YnMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjhjNTMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfdGJzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImFjdGl2aXR5X2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZXNjYXBlLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IkBTaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgIGRlZmF1bHRRdWVyeVN0ciwgZmFsc2UsIHRydWUsIHRydWUpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQk8ZGl2IGF1dG9XcmFwPSJ0cnVlIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L2Rpdj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhY3Rpdml0eVRhYnMiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJPHRyIHZhbGlnbj0ibWlkZGxlIj4KLQkJCQk8dGQgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV0JTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2EuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJPC9zcGFuPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWFfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV1BCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXUEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjQiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZV9taWRkbGUuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjMiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudChicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL0VsZW1lbnRbQFR5cGU9J1RlYW1Qcm9maWxlJ10pID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZWFtU3RydWN0dXJlVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8cCBhbGlnbj0ibGVmdCI+Ci0JCQk8ZGl2IGlkPSJ0ZWFtVHJlZSIgPjwvZGl2PgotCQkJPC9wPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCXZhciB0ZWFtVHJlZSA9IFsKLQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZScgYW5kIEBoYXNTdXBlclRlYW0gPSAnZmFsc2UnIF0iPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlYW1TdHJ1Y3R1cmUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCV07Ci0JY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UuYnVpbGRUZWFtVHJlZSh0ZWFtVHJlZSk7Ci0JCQkJCTwvc2NyaXB0PgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZWFtU3RydWN0dXJlIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCAKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50W0BUeXBlPSdUZWFtUHJvZmlsZSddKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnRbQFR5cGU9J1RlYW1Qcm9maWxlJ10iPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZWFtU3RydWN0dXJlIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JCV0sCi0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRic1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29sU2l6ZSIgc2VsZWN0PSJjb3VudChicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uKSIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQk8ZGl2IGlkPSJ0cmVlQ29udGVudCI+PC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS5kYXRhID0gewotdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPiIsIHN1bW1hcnk6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPiIsIAotY29sdW1uczogWzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1RlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uIj4KLVsiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhYmVsIi8+Il08eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gJGNvbFNpemUiPiw8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+XSwKLXJvd3M6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9FbGVtZW50Ij4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIwIi8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIgc2VsZWN0PSIgJycgIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLV19OwotCQkJCTwvc2NyaXB0PgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImluZGVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlIi8+CQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaGFzQ2hpbGRyZW4iPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+dHJ1ZTwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+ZmFsc2U8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCTwveHNsOnZhcmlhYmxlPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InR5cGVOYW1lIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ3RydWUnIj4KLQkJCQkJPHhzbDpjaG9vc2U+CQkJCQkJCQkJCQotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza1RleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlVGV4dCIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3REZXNjcmlwdG9yJyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGVOYW1lIi8+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4JCQkJCQkJCQkKLQkJCQk8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGVOYW1lIi8+Ci0JCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVzY2FwZWREaXNwbGF5TmFtZSI+Ci0gICAgICAgIAk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZXNjYXBlIj4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9IiRlbGVtZW50L0BEaXNwbGF5TmFtZSIvPgotCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzZWFyY2giIHNlbGVjdD0iJyZxdW90OyciLz4KLQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwbGFjZSIgc2VsZWN0PSInJmFtcDtxdW90OyciLz4KLQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgCTwveHNsOnZhcmlhYmxlPgotCi17aWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsIHBhcmVudElkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCByZWxQYXRoOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsIGlzU3VwcHJlc3NlZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCBpbmRlbnRTaXplOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgaGFzQ2hpbGRyZW46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgCi0JaW5kZXg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgcHJlZml4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCBuYW1lOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+IiwgdXJsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgCi0JcHJlZGVjZXNzb3JzOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCBpbmZvOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCB0eXBlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsIAotCXJlcGVhdGFibGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsIG11bHRpT2NjdXJlbmNlczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsIG9wdGlvbmFsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgcGxhbm5lZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgIG9uZ29pbmc6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsIGV2ZW50RHJpdmVuOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgCi0JdGVhbTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVGVhbSIvPiIsIGVudHJ5U3RhdGU6ICIiLCBleGl0U3RhdGU6ICIiLCBkZWxpdmVyYWJsZTogIiIsIHZhcmlhYmlsaXR5VHlwZTogIiJ9LAotCQotPCEtLQotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLmluaXRSb3coIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFyZW50Tm9kZUlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AcmVsUHJvY2Vzc1BhdGgiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bpc1N1cHJlc3NlZCIvPiIsIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+LCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhhc0NoaWxkcmVuIi8+LCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BJbmRleCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlc2NhcGVkRGlzcGxheU5hbWUiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgIiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFByZWRlY2Vzc29ycyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE1vZGVsSW5mbyIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHR5cGVOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4iLCAgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzRXZlbnREcml2ZW4nXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFRlYW0iLz4iLCAiIiwgIiIsICIiLCAiIiwgIiIpOwotY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UudHJlZVRhYmxlLndic0l0ZW1IdG1sLndyaXRlUm93KCk7CQotLS0+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGVsZW1lbnQvRWxlbWVudCkgPiAwIj4KLQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9FbGVtZW50Ij4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImluZGVudCIgc2VsZWN0PSIkaW5kZW50KzEiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQk8L3hzbDpmb3ItZWFjaD4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dicy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FjdGl2aXR5X3dicy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMjc1ODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93YnMueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0iYWN0aXZpdHlfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBkZWZhdWx0UXVlcnlTdHIgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRxdWVyeVN0cmluZyIvPic7Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCB0cnVlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGRpdiBhdXRvV3JhcD0idHJ1ZSI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC9kaXY+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFjdGl2aXR5VGFicyIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3b3JrZmxvd1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfYS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQk8L3NwYW4+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1hX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1RCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdUQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV1BCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdXUEJTJ10vQHVybCkiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8c3BhbiBzdHlsZT0id2hpdGUtc3BhY2U6bm93cmFwOyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3cGJzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9lbmQtaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iNTAlIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZV9taWRkbGUuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZD4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXRhYl9zcGFjZS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIyIiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIGNvbHNwYW49IjUiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQgY29sc3Bhbj0iMTAiIGNsYXNzPSJhY3RpdmVUYWIiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGhlaWdodD0iNSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC90YWJsZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya2Zsb3dTZWN0aW9uIj4KLQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIG9yIGRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J0FjdGl2aXR5RGV0YWlsJ10gb3IgZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5J10gb3IgZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J0FjdGl2aXR5RGV0YWlsJ10iPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya2Zsb3dUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSI+Ci0JCQkJCQkJPHRyPgotCQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSIvPgotCQkJCQkJCQk8L3RkPgotCQkJCQkJCTwvdHI+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eSddIj4KLQkJCQkJCQkJPHRyPgotCQkJCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIiBjb2xzcGFuPSIyIiBhbGlnbj0ibGVmdCI+Ci0JCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXlEaWFncmFtIj4KLQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRpYWdyYW0iIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nQWN0aXZpdHknXSIvPgotCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQk8L3RkPgotCQkJCQkJCQk8L3RyPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIj4KLQkJCQkJCQk8dHI+Ci0JCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCIgY29sc3Bhbj0iMiIgYWxpZ249ImxlZnQiPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIi8+Ci0JCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPC90cj4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImRpYWdyYW1zL2RpYWdyYW1bQG5hbWU9J0FjdGl2aXR5RGV0YWlsJ10iPgotCQkJCQkJCQk8dHI+Ci0JCQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ3JhbSIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdBY3Rpdml0eURldGFpbCddIi8+Ci0JCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJCTwvdHI+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3YnNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbFNpemUiIHNlbGVjdD0iY291bnQoYnJlYWtkb3duW0BuYW1lPSdXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbikiLz4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrQnJlYWtkb3duVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQk8ZGl2IGlkPSJ0cmVlQ29udGVudCI+PC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS5kYXRhID0gewotdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtCcmVha2Rvd25UZXh0Ii8+Iiwgc3VtbWFyeTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya0JyZWFrZG93blRleHQiLz4iLCAKLWNvbHVtbnM6IFs8eHNsOmZvci1lYWNoIHNlbGVjdD0iYnJlYWtkb3duW0BuYW1lPSdXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUnXS9jb2x1bW5zL2NvbHVtbiI+Ci1bIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYWJlbCIvPiJdPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9ICRjb2xTaXplIj4sPC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPl0sCi1yb3dzOiBbPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImJyZWFrZG93bltAbmFtZT0nV29yayBCcmVha2Rvd24gU3RydWN0dXJlJ10vRWxlbWVudCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iMCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXJlbnROb2RlSWQiIHNlbGVjdD0iICcnICIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci1dfTsKLQkJCQk8L3NjcmlwdD4KLQkKLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8IS0tIHdyaXRlIHRoZSB3YnMgdHIgaHRtbCAtLT4KLQk8IS0tIGluaXQoaWQsIHBhcmVudElkLCByZWxQYXRoLCBpc1N1cHJlc3NlZCwgaW5kZW50U2l6ZSwgaGFzQ2hpbGRyZW4sIGluZGV4LCBwcmVmaXgsIHRpdGxlLCB1cmwsIHN0ZXBzLCBwcmVkZWNlc3NvcnMsIGluZm8sIHJlcGVhdGFibGUsIG11bHRpT2NjdXJlbmNlcywgb3B0aW9uYWwsIHBsYW5uZWQsIHR5cGUpIC0tPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0id2JzSXRlbSI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InBhcmVudE5vZGVJZCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImluZGVudCIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imhhc0NoaWxkcmVuIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPnRydWU8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPmZhbHNlPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0eXBlTmFtZSI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICd0cnVlJyI+Ci0JCQkJCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCQkJCi0JCQkJPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+Ci17aWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQG5vZGVJZCIvPiIsIHBhcmVudElkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCByZWxQYXRoOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsIGlzU3VwcHJlc3NlZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AaXNTdXByZXNzZWQiLz4iLCBpbmRlbnRTaXplOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluZGVudCIvPiwgaGFzQ2hpbGRyZW46PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRoYXNDaGlsZHJlbiIvPiwgCi0JaW5kZXg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgcHJlZml4OiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4iLCBuYW1lOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BOYW1lIi8+IiwgdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+IiwgdXJsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICRlbGVtZW50L0BVcmwpIi8+IiwgCi0JcHJlZGVjZXNzb3JzOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCBpbmZvOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCB0eXBlOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsIAotCXJlcGVhdGFibGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsIG11bHRpT2NjdXJlbmNlczogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPiIsIG9wdGlvbmFsOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgcGxhbm5lZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgIG9uZ29pbmc6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsIGV2ZW50RHJpdmVuOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+IiwgCi0JdGVhbTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVGVhbSIvPiIsIGVudHJ5U3RhdGU6ICIiLCBleGl0U3RhdGU6ICIiLCBkZWxpdmVyYWJsZTogIiIsIHZhcmlhYmlsaXR5VHlwZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+IiwKLQlzdGVwczogWzx4c2w6dmFyaWFibGUgbmFtZT0ic3RlcFNpemUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb3VudCgkZWxlbWVudC9TdGVwcy9TdGVwKSIvPjwveHNsOnZhcmlhYmxlPgotCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZWxlbWVudC9TdGVwcy9TdGVwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHNlbGVjdGVkIi8+Ci0JPHhzbDppZiB0ZXN0PSJwb3NpdGlvbigpICE9ICRzdGVwU2l6ZSI+LDwveHNsOmlmPjwveHNsOmZvci1lYWNoPl19LAotPHhzbDppZiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbGVtZW50L0VsZW1lbnQiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IiRpbmRlbnQrMSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+CQkJCQkKLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93cGJzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYWN0aXZpdHlfd3Bicy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZjUxM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hY3Rpdml0eV93cGJzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9ImFjdGl2aXR5X2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icXVlcnlTdHJpbmciIHNlbGVjdD0iQHF1ZXJ5U3RyaW5nIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVsUHJvY2Vzc1BhdGgiIHNlbGVjdD0iQHJlbFByb2Nlc3NQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IkBTaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxkaXYgYXV0b1dyYXA9InRydWUiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2Rpdj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ3cGJzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWN0aXZpdHlUYWJzIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQkJPHRkIHdpZHRoPSIxMCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIG5vd3JhcD0ibm93cmFwIiBjbGFzcz0idGFiIj4KLQkJCQkJPGEgY2xhc3M9InRhYiIgaWQ9IlRBQl9EZXNjcmlwdGlvbiI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdEZXNjcmlwdGlvbiddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfaS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9InRhYiI+Ci0JCQkJCTxhIGNsYXNzPSJ0YWIiIGlkPSJUQUJfV0JTIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWJVcmxBdHRyaWJ1dGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ1cmwiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgdGFicy90YWJbQG5hbWU9J1dCUyddL0B1cmwpIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHNwYW4gc3R5bGU9IndoaXRlLXNwYWNlOm5vd3JhcDsiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2JzVGV4dCIvPgotCQkJCQkJPC9zcGFuPgotCQkJCQk8L2E+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjEiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9dGFiX21pZGRsZS1pX2kuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsaWduPSJhYnNtaWRkbGUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgbm93cmFwPSJub3dyYXAiIGNsYXNzPSJ0YWIiPgotCQkJCQk8YSBjbGFzcz0idGFiIiBpZD0iVEFCX1RCUyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFiVXJsQXR0cmlidXRlIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idXJsIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsIHRhYnMvdGFiW0BuYW1lPSdUQlMnXS9AdXJsKSIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRic1RleHQiLz4KLQkJCQkJCTwvc3Bhbj4KLQkJCQkJPC9hPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfbWlkZGxlLWlfYS5naWYiIHdpZHRoPSIyMSIgaGVpZ2h0PSIxNyIgYWxpZ249ImFic21pZGRsZSIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxzcGFuIHN0eWxlPSJ3aGl0ZS1zcGFjZTpub3dyYXA7Ij4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd3Bic1RleHQiLz4KLQkJCQkJPC9zcGFuPgotCQkJCTwvdGQ+Ci0JCQkJPHRkIHdpZHRoPSIyMSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfZW5kLWEuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMTciIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgd2lkdGg9IjUwJSI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjE3IiBhbHQ9IiIgdGl0bGU9IiIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQkJPHRyPgotCQkJCTx0ZCBjb2xzcGFuPSI2Ij4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2VfbWlkZGxlLmdpZiIgd2lkdGg9IjIxIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQgY2xhc3M9ImFjdGl2ZVRhYiI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH10YWJfc3BhY2UuZ2lmIiB3aWR0aD0iMjEiIGhlaWdodD0iMiIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQk8L3RkPgotCQkJCTx0ZCBjb2xzcGFuPSIxIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjIiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNvbHNwYW49IjEwIiBjbGFzcz0iYWN0aXZlVGFiIj4KLQkJCQkJPGltZyBzcmM9InskaW1hZ2VQYXRofXNoaW0uZ2lmIiBoZWlnaHQ9IjUiIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtmbG93U2VjdGlvbiI+Ci0JCTx4c2w6aWYgdGVzdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10gb3IgZGlhZ3JhbXMvdXNlcmRpYWdyYW1bQG5hbWU9J1dQRGVwZW5kZW5jeSddICI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTwhLS0KLQkJCTxwIGFsaWduPSJjZW50ZXIiPgotCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSIvPgotCQkJPC9wPgotCi0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXlEaWFncmFtIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRpYWdyYW0iIHNlbGVjdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCS0tPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CQkJCi0JCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImRpYWdyYW1zL3VzZXJkaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSI+Ci0JCQkJCQkJPHRyPgotCQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtcy91c2VyZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iLz4KLQkJCQkJCQkJPC90ZD4KLQkJCQkJCQk8L3RyPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTx4c2w6aWYgdGVzdD0iZGlhZ3JhbXMvZGlhZ3JhbVtAbmFtZT0nV1BEZXBlbmRlbmN5J10iPgotCQkJCQkJCQk8dHI+Ci0JCQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheURpYWdyYW0iPgotCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGlhZ3JhbSIgc2VsZWN0PSJkaWFncmFtcy9kaWFncmFtW0BuYW1lPSdXUERlcGVuZGVuY3knXSIvPgotCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQk8L3RkPgotCQkJCQkJCQk8L3RyPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJPC90YWJsZT4JCi0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndwYnNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbFNpemUiIHNlbGVjdD0iY291bnQoYnJlYWtkb3duW0BuYW1lPSdXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSddL2NvbHVtbnMvY29sdW1uKSIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dCIvPgotCQk8L2Rpdj4KLQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQk8ZGl2IGlkPSJ0cmVlQ29udGVudCI+PC9kaXY+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS5kYXRhID0gewotdGl0bGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dCIvPiIsIHN1bW1hcnk6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dCIvPiIsIAotY29sdW1uczogWzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1dvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlJ10vY29sdW1ucy9jb2x1bW4iPgotWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFiZWwiLz4iXTx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSAhPSAkY29sU2l6ZSI+LDwveHNsOmlmPgotCQkJCQk8L3hzbDpmb3ItZWFjaD5dLAotcm93czogWzx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJicmVha2Rvd25bQG5hbWU9J1dvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlJ10vRWxlbWVudCI+Ci0JCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIvPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iaW5kZW50IiBzZWxlY3Q9IjAiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiAnJyAiLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotXX07Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3YnNJdGVtIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iaW5kZW50Ii8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnQvQFR5cGUiLz4JCQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imhhc0NoaWxkcmVuIj4KLQkJCTx4c2w6Y2hvb3NlPgotCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZWxlbWVudC9FbGVtZW50KSA+IDAiPnRydWU8L3hzbDp3aGVuPgotCQkJCTx4c2w6b3RoZXJ3aXNlPmZhbHNlPC94c2w6b3RoZXJ3aXNlPgotCQkJPC94c2w6Y2hvb3NlPgotCQk8L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0eXBlTmFtZSI+Ci0JCQk8eHNsOmNob29zZT4KLQkJCQk8eHNsOndoZW4gdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICd0cnVlJyI+Ci0JCQkJCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVRleHQiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd29ya1Byb2R1Y3RUZXh0Ii8+Ci0JCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQk8L3hzbDpjaG9vc2U+CQkJCQkJCQkJCi0JCQkJPC94c2w6d2hlbj4KLQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BUeXBlTmFtZSIvPgotCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCTwveHNsOmNob29zZT4KLQkJPC94c2w6dmFyaWFibGU+CQkKLXtpZDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9Abm9kZUlkIi8+IiwgcGFyZW50SWQ6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhcmVudE5vZGVJZCIvPiIsIHJlbFBhdGg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQHJlbFByb2Nlc3NQYXRoIi8+IiwgaXNTdXBwcmVzc2VkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bpc1N1cHJlc3NlZCIvPiIsIGluZGVudFNpemU6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZW50Ii8+LCBoYXNDaGlsZHJlbjo8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGhhc0NoaWxkcmVuIi8+LCAKLQlpbmRleDogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ASW5kZXgiLz4iLCBwcmVmaXg6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdwcmVmaXgnXSIvPiIsIG5hbWU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE5hbWUiLz4iLCB0aXRsZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4iLCB1cmw6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJGVsZW1lbnQvQFVybCkiLz4iLCAKLQlwcmVkZWNlc3NvcnM6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQFByZWRlY2Vzc29ycyIvPiIsIGluZm86ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQE1vZGVsSW5mbyIvPiIsIHR5cGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHR5cGVOYW1lIi8+IiwgCi0JcmVwZWF0YWJsZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+IiwgbXVsdGlPY2N1cmVuY2VzOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Iiwgb3B0aW9uYWw6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4iLCBwbGFubmVkOiAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4iLCAgb25nb2luZzogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzT25nb2luZyddIi8+IiwgZXZlbnREcml2ZW46ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4iLCAKLQl0ZWFtOiAiIiwgZW50cnlTdGF0ZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARW50cnlTdGF0ZSIvPiIsIGV4aXRTdGF0ZTogIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARXhpdFN0YXRlIi8+IiwgZGVsaXZlcmFibGU6ICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERlbGl2ZXJhYmxlIi8+IiwgdmFyaWFiaWxpdHlUeXBlOiAiIn0sCi08IS0tCi1jb250ZW50UGFnZS5wcm9jZXNzUGFnZS50cmVlVGFibGUud2JzSXRlbUh0bWwuaW5pdFJvdygiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYXJlbnROb2RlSWQiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0ByZWxQcm9jZXNzUGF0aCIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQGlzU3VwcmVzc2VkIi8+IiwgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmRlbnQiLz4sIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaGFzQ2hpbGRyZW4iLz4sICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEluZGV4Ii8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3ByZWZpeCddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ATmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAkZWxlbWVudC9AVXJsKSIvPiIsICIiLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BQcmVkZWNlc3NvcnMiLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L0BNb2RlbEluZm8iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0eXBlTmFtZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc1JlcGVhdGFibGUnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4iLCAiPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIi8+IiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+IiwgICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4iLCAiIiwgIjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9ARW50cnlTdGF0ZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQEV4aXRTdGF0ZSIvPiIsICI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnQvQERlbGl2ZXJhYmxlIi8+IiwgIiIsICIiKTsKLWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLnRyZWVUYWJsZS53YnNJdGVtSHRtbC53cml0ZVJvdygpOwkKLS0tPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRlbGVtZW50L0VsZW1lbnQpID4gMCI+Ci0JCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVsZW1lbnQvRWxlbWVudCI+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Indic0l0ZW0iPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJpbmRlbnQiIHNlbGVjdD0iJGluZGVudCsxIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50Tm9kZUlkIiBzZWxlY3Q9IiRlbGVtZW50L0Bub2RlSWQiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9hcnRpZmFjdC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxY2ExMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXJ0aWZhY3REZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0FydGlmYWN0RGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0SWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRhcnRpZmFjdERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYnJpZWZPdXRsaW5lIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JyaWVmT3V0bGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J21haW5EZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVwcmVzZW50YXRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im5vdGF0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J25vdGF0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIG9yICRtYWluRGVzY3JpcHRpb24gIT0gJycgb3IgJHJlcHJlc2VudGF0aW9uICE9ICcnIG9yICRub3RhdGlvbiAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4JCQkKLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJyaWVmT3V0bGluZVRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYnJpZWZPdXRsaW5lIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iJG5vdGF0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vdGF0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRub3RhdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcmVwcmVzZW50YXRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwcmVzZW50YXRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHJlcHJlc2VudGF0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYXJ0aWZhY3RfZGVzY3JpcHRvci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2FydGlmYWN0X2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzk4NWI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvYXJ0aWZhY3RfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwdXJwb3NlLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJ0YWlsb3JpbmcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0X2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgkJCQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvciIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Jlc3BvbnNpYmxlUm9sZSddL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRvclJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRlbGl2ZXJhYmxlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQotCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2JyaWVmT3V0bGluZSddICE9JycgIj4KLQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkKLQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+CQotCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0SWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0YWlsb3JpbmdTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQkJY29udGVudFBhZ2UucHJvY2Vzc1BhZ2UuZml4RGVzY3JpcHRvckxpbmtzKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZk91dGxpbmUiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYnJpZWZPdXRsaW5lJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVmaW5lZERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIG9yICRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVzY3JpcHRpb25UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+CQkJCi0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYnJpZWZPdXRsaW5lICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJyaWVmT3V0bGluZVRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkYnJpZWZPdXRsaW5lIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdhY3Rpdml0eUVudHJ5U3RhdGUnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkYWN0aXZpdHlFbnRyeVN0YXRlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RW50cnlTdGF0ZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RXhpdFN0YXRlJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGFjdGl2aXR5RXhpdFN0YXRlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2FjdGl2aXR5RXhpdFN0YXRlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmVkVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUGxhbm5lZCddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHVzYWdlR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRvclJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmdWxmaWxsaW5nV29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+PC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZnVsZmlsbGVkU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZnVsZmlsbHMnXS9FbGVtZW50Ij48L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1dvcmtQcm9kdWN0J10vRWxlbWVudFtAVHlwZT0nQXJ0aWZhY3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVsaXZlcmFibGVQYXJ0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbXBhY3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2ltcGFjdHMnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdERlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltcGFjdGVkQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0naW1wYWN0ZWRCeSddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nVGFza0Rlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4dGVybmFsSW5wdXRUbyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvcHRpb25hbElucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMnXS9FbGVtZW50W0BUeXBlPSdUYXNrRGVzY3JpcHRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1cGVyQWN0aXZpdGllcyddL0VsZW1lbnRbQFR5cGU9J0FjdGl2aXR5J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzJ10vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtlZE9uQnkiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya2VkT25CeSddL0VsZW1lbnQiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzKSArIGNvdW50KCRmdWxmaWxsZWRTbG90cykgKyBjb3VudCgkcmVzcG9uc2libGVSb2xlKSArIGNvdW50KCR3b3JrZWRPbkJ5KSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSArIGNvdW50KCRvcHRpb25hbElucHV0VG8pICsgY291bnQoJGV4dGVybmFsSW5wdXRUbykgKyBjb3VudCgkb3V0cHV0RnJvbSkgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpICsgY291bnQoJG91dHB1dEZyb21UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzKSArIGNvdW50KCRpbXBhY3RzKSArIGNvdW50KCRpbXBhY3RlZEJ5KT4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGluZ1dvcmtQcm9kdWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGZ1bGZpbGxlZFNsb3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGVkU2xvdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdWxmaWxsZWRTbG90cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQotCQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkaW1wYWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlcGVuZGVudFRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGltcGFjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRpbXBhY3RlZEJ5KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1wYWN0aW5nVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkaW1wYWN0ZWRCeSI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlKSArIGNvdW50KCR3b3JrZWRPbkJ5KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4JCQkJCQkJCQkKLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vZGlmaWVkQnlUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtlZE9uQnkpID4gMCI+CQkJCQkJCQkKLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtlZE9uQnkiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgkJCQkJCQkJCQkKLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG8pICsgY291bnQoJG9wdGlvbmFsSW5wdXRUbykgKyBjb3VudCgkZXh0ZXJuYWxJbnB1dFRvKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0VG9UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYW5kYXRvcnlUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvIj4JCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQkJCi0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkKLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIj4JCQotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkJCQkJCQkJCi0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgkJCQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3B0aW9uYWxUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRvcHRpb25hbElucHV0VG8pICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0VG8iPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCi0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvcHRpb25hbElucHV0VG9UYXNrRGVzY3JpcHRvcnNfZnJvbVNsb3RzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwvdWw+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+CQkJCQkJCQkJCi0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkZXh0ZXJuYWxJbnB1dFRvKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXh0ZXJuYWxJbnB1dFRvIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCTwveHNsOndoZW4+CQkJCQotCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5vbmVUZXh0Ii8+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwvdWw+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+CQkJCQkJCQkJCi0JCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8L3RkPgkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tKSAgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dEZyb21UZXh0Ii8+PC90aD4JCQkJCQkJCi0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tKSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dEZyb20iPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4JCQkJCQkJCi0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkZWxpdmVyYWJsZVNlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdleHRlcm5hbERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZGVsaXZlcmFibGVQYXJ0cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdwYWNrYWdpbmdHdWlkYW5jZSddIi8+Ci0JCQotCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uICE9ICcnIG9yIGNvdW50KCRkZWxpdmVyZWRXb3JrUHJvZHVjdHMpID4gMCBvciAkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmFibGVQcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGV4dGVybmFsRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvblRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGVsaXZlcmVkV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcmVkUGFydHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkZWxpdmVyZWRXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcGFja2FnaW5nR3VpZGFuY2UgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRwYWNrYWdpbmdHdWlkYW5jZSIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY2hlY2tsaXN0LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY2hlY2tsaXN0LnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMxZjU4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NoZWNrbGlzdC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+CQkKLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQotICAgIAk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQkJCi0JCQkJCS8vb3ZlcnJpZGUgdGhlIHN1YnNlY3Rpb24gdGV4dAotCQkJCQljb250ZW50UGFnZS5zdWJTZWN0aW9uLmV4cGFuZEFsbFRleHQgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHBhbmRBbGxUZXh0Ii8+JzsKLQkJCQkJY29udGVudFBhZ2Uuc3ViU2VjdGlvbi5jb2xsYXBzZUFsbFRleHQgPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xsYXBzZUFsbFRleHQiLz4nOwkJCQkJCi0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNoZWNrSXRlbXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iY2hlY2tJdGVtc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2VjdGlvbnMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL3JlZmVyZW5jZUxpc3RbQG5hbWU9J3NlY3Rpb25zJ10vRWxlbWVudFtAVHlwZT0nU2VjdGlvbiddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHNlY3Rpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2hlY2tJdGVtc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc2VjdGlvbnMiPgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nbmFtZSddIi8+PC9kaXY+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBDb250ZW50Ij4KLQkJCQkJCQkJCTx0YWJsZSBjbGFzcz0ic3RlcFRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJPHRkPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nc2VjdGlvbkRlc2NyaXB0aW9uJ10iLz4KLQkJCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCQk8L3RyPgotCQkJCQkJCQkJPC90YWJsZT4KLQkJCQkJCQkJPC9kaXY+CQkJCQkJCi0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbW1vbi54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2NvbW1vbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MzY2ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21tb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQk8bWV0YSBuYW1lPSJ1bWEudHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJPG1ldGEgbmFtZT0idW1hLm5hbWUiIGNvbnRlbnQ9InskZWxlbWVudE5hbWV9Ii8+Ci0JCTxtZXRhIG5hbWU9InVtYS5wcmVzZW50YXRpb25OYW1lIiBjb250ZW50PSJ7JGVsZW1lbnRQcmVzZW50YXRpb25OYW1lfSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icm9sZU1ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFza01ldGFJbmZvIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdBcnRpZmFjdCcgb3IgJGVsZW1lbnRUeXBlID0gJ0RlbGl2ZXJhYmxlJyBvciAkZWxlbWVudFR5cGUgPSAnT3V0Y29tZSciPgotCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0TWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0b29sTWVudG9yTWV0YUluZm8iLz4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0TWV0YUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRvbWFpbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZG9tYWlucyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3dvcmtQcm9kdWN0VHlwZXMnXS9FbGVtZW50W0BUeXBlPSdXb3JrUHJvZHVjdFR5cGUnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkb21haW5zIj4KLQkJCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9IkBUeXBlOkBOYW1lOkBEaXNwbGF5TmFtZSIvPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdFR5cGVzKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFR5cGVzIj4KLQkJCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9Inskd29ya1Byb2R1Y3RUeXBlcy9AVHlwZX06eyR3b3JrUHJvZHVjdFR5cGVzL0BOYW1lfTp7JHdvcmtQcm9kdWN0VHlwZXMvQERpc3BsYXlOYW1lfSIvPgotCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0YXNrTWV0YUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rpc2NpcGxpbmVzJ10vRWxlbWVudFtAVHlwZT0nRGlzY2lwbGluZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRkaXNjaXBsaW5lcyI+Ci0JCQkJPG1ldGEgbmFtZT0idW1hLmNhdGVnb3J5IiBjb250ZW50PSJ7JGRpc2NpcGxpbmVzL0BUeXBlfTp7JGRpc2NpcGxpbmVzL0BOYW1lfTp7JGRpc2NpcGxpbmVzL0BEaXNwbGF5TmFtZX0iLz4KLQkJCTwveHNsOmZvci1lYWNoPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icm9sZU1ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlU2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlU2V0cyddL0VsZW1lbnRbQFR5cGU9J1JvbGVTZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRyb2xlU2V0cy9ATmFtZSAhPSAnJyI+Ci0JCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9Inskcm9sZVNldHMvQFR5cGV9Onskcm9sZVNldHMvQE5hbWV9Onskcm9sZVNldHMvQERpc3BsYXlOYW1lfSIvPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idG9vbE1lbnRvck1ldGFJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkdG9vbC9ATmFtZSAhPSAnJyI+Ci0JCQk8bWV0YSBuYW1lPSJ1bWEuY2F0ZWdvcnkiIGNvbnRlbnQ9InskdG9vbC9AVHlwZX06eyR0b29sL0BOYW1lfTp7JHRvb2wvQERpc3BsYXlOYW1lfSIvPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVmTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9InJlZkVsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSIkcmVmRWxlbWVudCI+Ci0JCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZWZFbGVtZW50KT4wIj4KLQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWZOYW1lIi8+Ci0JCQkJCTwvdGg+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQk8dWw+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZWZFbGVtZW50Ij4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdWw+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwveHNsOmlmPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50Ii8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50L0BVcmwgIT0gJycgIj4KLQkJCQk8YT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudC9AVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGVsZW1lbnQvQERpc3BsYXlOYW1lIi8+Ci0JCQkJPC9hPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZWxlbWVudC9ARGlzcGxheU5hbWUiLz4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgkKLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb3B5cmlnaHQiLz4KLQkJPHRhYmxlIGNsYXNzPSJjb3B5cmlnaHQiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9ImNvcHlyaWdodCI+Ci0JCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwvdGFibGU+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21wb3NpdGVyb2xlLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29tcG9zaXRlcm9sZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYTBhN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb21wb3NpdGVyb2xlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG11bHRpcGxlT2NjdXJyZW5jZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdoYXNNdWx0aXBsZU9jY3VycmVuY2VzJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWdncmVnYXRlZFJvbGVzJ10vRWxlbWVudCIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVGb3IiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVzcG9uc2libGVGb3InXS9FbGVtZW50Ii8+CQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGFnZ3JlZ2F0ZWRSb2xlcykgKyBjb3VudCgkcmVzcG9uc2libGVGb3IpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFnZ3JlZ2F0ZWRSb2xlcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFnZ3JlZ2F0ZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjMiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZ2dyZWdhdGVkUm9sZXMiPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVGb3IpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZUZvclRleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9jb250ZW50Y2F0ZWdvcnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFhNDljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvY29udGVudGNhdGVnb3J5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJOYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lX3RlbXAiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0ncHJlc2VudGF0aW9uTmFtZSddIiAvPgotICAgIAk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiPgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IiRwcmVzZW50YXRpb25OYW1lX3RlbXAgIT0gJycgIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZXNlbnRhdGlvbk5hbWVfdGVtcCIvPjwveHNsOndoZW4+Ci0JCQkJPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiROYW1lIi8+PC94c2w6b3RoZXJ3aXNlPgkJCQkKLQkJCTwveHNsOmNob29zZT4KLSAgICAJPC94c2w6dmFyaWFibGU+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiddIi8+CSAgICAKLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIj4JCQkJCi0JCQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz48L3RpdGxlPgotCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPiAKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgIT0gJ0N1c3RvbUNhdGVnb3J5JyI+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJpZWZEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdjb25jZXB0c0FuZFBhcGVycyddIi8+Ci0KLQkJPHhzbDpjaG9vc2U+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyI+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb3JlSW5mb1RleHQiLz48L2Rpdj4KLQkJCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGFibGU+Ci0JCQkJCTwvZGl2PgotCQkJCTwveHNsOmlmPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd0Rpc2NpcGxlIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lR3JvdXBpbmcnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93RGlzY2lwbGVHcm91cGluZyIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRG9tYWluJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd0RvbWFpbiIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnV29ya1Byb2R1Y3RUeXBlJyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd1dvcmtQcm9kdWN0VHlwZSIvPgotCQk8L3hzbDppZj4JCQotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlU2V0R3JvdXBpbmcnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldEdyb3VwaW5nIi8+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlU2V0JyI+Ci0JCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic2hvd1JvbGVTZXQiLz4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2wnIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93VG9vbCIvPgotCQk8L3hzbDppZj4KLQkJPHhzbDppZiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIj4KLQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzaG93Q3VzdG9tQ2F0ZWdvcnkiLz4KLQkJPC94c2w6aWY+CQkKLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd0Rpc2NpcGxlIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncmVmZXJlbmNlV29ya2Zsb3dzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRhc2tzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Rhc2tzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1YmRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3N1YmRpc2NpcGxpbmUnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZWZlcmVuY2VXb3JrZmxvd3MpICsgY291bnQoJHRhc2tzKSArIGNvdW50KCRzdWJkaXNjaXBsaW5lcyk+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHJlZmVyZW5jZVdvcmtmbG93cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlZmVyZW5jZVdvcmtmbG93c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkcmVmZXJlbmNlV29ya2Zsb3dzIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0YXNrcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRhc2tzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0YXNrcyI+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1YmRpc2NpcGxpbmVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3ViZGlzY2lwbGluZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YmRpc2NpcGxpbmVzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCQkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd0Rpc2NpcGxlR3JvdXBpbmciPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRpc2NpcGxpbmVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rpc2NpcGxpbmVzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGlzY2lwbGluZXMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaXNjaXBsaW5lc1RleHQiLz48L3RoPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGlzY2lwbGluZXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd0RvbWFpbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3ViZG9tYWlucyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdzdWJkb21haW5zJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd3b3JrUHJvZHVjdHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgkJCQkJCQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzdWJkb21haW5zKSArIGNvdW50KCR3b3JrUHJvZHVjdHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViZG9tYWlucykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1YmRvbWFpbnNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YmRvbWFpbnMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0cyI+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQkJCQkJCQkJCQkKLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93V29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya1Byb2R1Y3RzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNhdGVnb3JpZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdHNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0cyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVTZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3JvbGVTZXRzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcm9sZVNldHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVTZXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyb2xlU2V0cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi0gICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzaG93Um9sZVNldCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyb2xlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVzIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic2hvd1Rvb2wiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Rvb2xNZW50b3JzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbE1lbnRvcnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xNZW50b3JzVGV4dCIvPjwvdGg+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0b29sTWVudG9ycyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0gICAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InNob3dDdXN0b21DYXRlZ29yeSI+Ci0gIAkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NhdGVnb3JpemVkRWxlbWVudHMnXS9FbGVtZW50Ii8+Ci0gICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2F0ZWdvcmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzJ10vRWxlbWVudCIvPgotICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRjYXRlZ29yaXplZEVsZW1lbnRzKSA+IDAiPgotICAgICAgICAJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLSAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLSAgICAgICAgICAgIAk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICAgICAgICAgICAJCTx0ciB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICAgICAgICAgCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGVudHNUZXh0Ii8+PC90aD4KLSAgICAgICAgICAgICAgICAgICAJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0gICAgICAgICAgICAgICAgICAgICAgIAkJPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNhdGVnb3JpemVkRWxlbWVudHMiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJPGxpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCTxhPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCTwvYT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC9saT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJPC94c2w6Zm9yLWVhY2g+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAJPC91bD4KLSAgICAgICAgICAgICAgICAgICAgIAk8L3RkPgotICAgICAgICAgICAgICAgICAgIAk8L3RyPgotICAgICAgICAgICAgCTwvdGFibGU+Ci0gICAgICAgICAJPC9kaXY+Ci0gICAgCTwveHNsOmlmPgotICAgIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZWxpdmVyYWJsZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2RlbGl2ZXJhYmxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwM2ZhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2RlbGl2ZXJhYmxlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9Indvcmtwcm9kdWN0LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgkKLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVsaXZlcmFibGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4gCi0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYXBwaW5nIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPCEtLSA8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+IC0tPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZS9ARGlzcGxheU5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0SWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVsaXZlcmFibGVTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZWxpdmVyYWJsZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImRlbGl2ZXJhYmxlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2V4dGVybmFsRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZWxpdmVyZWRXb3JrUHJvZHVjdHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnaW5nR3VpZGFuY2UiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncGFja2FnaW5nR3VpZGFuY2UnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSAnJyBvciBjb3VudCgkZGVsaXZlcmVkV29ya1Byb2R1Y3RzKSA+IDAgb3IgJHBhY2thZ2luZ0d1aWRhbmNlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbERlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGV4dGVybmFsRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRlbGl2ZXJlZFdvcmtQcm9kdWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJlZFBhcnRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZGVsaXZlcmVkV29ya1Byb2R1Y3RzIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHBhY2thZ2luZ0d1aWRhbmNlICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBhY2thZ2luZ0luc3RydWN0aW9uc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcGFja2FnaW5nR3VpZGFuY2UiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3IueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWNkN2QwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwcm9wZXJ0eS54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVmaW5lZERlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkcmVmaW5lZERlc2NyaXB0aW9uICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvblRleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+CQotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9kZXNjcmlwdG9yX2hlbHBlci54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3JfaGVscGVyLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBjYjlhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2Rlc2NyaXB0b3JfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRGVzY3JpcHRvcnMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29sc3BhbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSJAU2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+CQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZGVzY3JpcHRvcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcHJvY2Vzc1VzYWdlVGV4dCIvPgkJCQotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29sc3BhbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xzcGFuIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRlc2NyaXB0b3JzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTwhLS0gYWRkIHRoZSBwYXJlbnQgbGluayAtLT4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IkVsZW1lbnQiPgotCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQkmIzE2MDsmZ3Q7JiMxNjA7Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9lc2NhcGUueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9lc2NhcGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGNhMTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZXNjYXBlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZXNjYXBlIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzdHJpbmciLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2giLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJyZXBsYWNlIi8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9ImNvbnRhaW5zKCRzdHJpbmcsICRzZWFyY2gpIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KHN1YnN0cmluZy1iZWZvcmUoJHN0cmluZywgJHNlYXJjaCksICRyZXBsYWNlKSIvPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJlc2NhcGUiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3RyaW5nIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc3RyaW5nLCAkc2VhcmNoKSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2VhcmNoIiBzZWxlY3Q9IiRzZWFyY2giLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlcGxhY2UiIHNlbGVjdD0iJHJlcGxhY2UiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3RyaW5nIi8+Ci0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCTwveHNsOmNob29zZT4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZ3VpZGFuY2UueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4M2MwODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJyZXNvdXJjZXMueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImNvbW1vbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFwcGluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ib3ZlcnZpZXcueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1haW5fZGVzY3JpcHRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Rvb2wnXS9FbGVtZW50W0BUeXBlPSdUb29sJ10iLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8eHNsOmlmIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJCTxtZXRhIG5hbWU9InRvb2wiIGNvbnRlbnQ9InskdG9vbC9ARGlzcGxheU5hbWV9Ii8+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZlcmVuY2VMaXN0IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RWxlbWVudHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nY29udGVudEVsZW1lbnRzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY29udGVudEVsZW1lbnRzKSArIGNvdW50KCRjYXRlZ29yaWVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz4KLQkJCTwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHJlbGF0ZWRFbGVtZW50c1RleHQiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGNvbnRlbnRFbGVtZW50cyIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8IS0tIHVzZSB0aGUgc3BlY2lmaWMgbmFtZWQgbGlzdCwgIG90aGVyd2lzZSwgdGhlIHZhcmlhYmlsaXR5IGJhc2UgZWxlbWVudCB3aWxsIGJlIGluY2x1ZGVkLCBidWcgMTYzODg1IC0tPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NoZWNrbGlzdHMnXS9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjb25jZXB0c0FuZFBhcGVycyddL0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2d1aWRlbGluZXMnXS9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J3N1cHBvcnRpbmdNYXRlcmlhbHMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSAhPSdjb250ZW50RWxlbWVudHMnXS9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY29uY2VwdHNBbmRQYXBlcnMnXS9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nZXhhbXBsZXMnXS9FbGVtZW50W0BUeXBlPSdFeGFtcGxlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nYXNzZXRzJ10vRWxlbWVudFtAVHlwZT0nUmV1c2FibGVBc3NldCddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJHJldXNhYmxlQXNzZXRzKSArIGNvdW50KCRleGFtcGxlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSIkZXhhbXBsZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSIkcmV1c2FibGVBc3NldHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV9oZWxwZXIueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTU5ZWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvZ3VpZGFuY2VfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaGVja2xpc3RzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjaGVja2xpc3RzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb25jZXB0cyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjb25jZXB0cykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb25jZXB0c1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY29uY2VwdHMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJleGFtcGxlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRleGFtcGxlcykgPiAwIj4KLQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleGFtcGxlc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXhhbXBsZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRndWlkZWxpbmVzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGd1aWRlbGluZXNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGd1aWRlbGluZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmVwb3J0cyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0cyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXBvcnRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcG9ydHNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlcG9ydHMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJldXNhYmxlQXNzZXRzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJldXNhYmxlQXNzZXRzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFsc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUZWNobmlxdWVzIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJ0ZWNobmlxdWVzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlY2huaXF1ZXMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVjaG5pcXVlc1RleHQiLz4KLQkJCQk8L3RoPgotCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCTx1bD4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGVjaG5pcXVlcyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUZW1wbGF0ZXMiPgotCQk8eHNsOnBhcmFtIG5hbWU9InRlbXBsYXRlcyIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0ZW1wbGF0ZXMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVtcGxhdGVzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR0ZW1wbGF0ZXMiPgotCQkJCQkJCTxsaT4KLQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPC9saT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3VsPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQk8eHNsOnBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdoaXRlcGFwZXJzVGV4dCIvPgotCQkJCTwvdGg+Ci0JCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJPHVsPgotCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3aGl0ZVBhcGVycyI+Ci0JCQkJCQkJPGxpPgotCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8L2xpPgotCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCTwvdWw+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdG9vbE1lbnRvcnMpID4gMCI+Ci0JCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG9vbE1lbnRvcnNUZXh0Ii8+Ci0JCQkJPC90aD4KLQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQk8dWw+Ci0JCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRvb2xNZW50b3JzIj4KLQkJCQkJCQk8bGk+Ci0JCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTwvbGk+Ci0JCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJPC91bD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2d1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGEwMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im1hcHBpbmcueHNsIi8+CQotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJlc2NhcGUueHNsIi8+CQotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdyZXNwb25zaWJsZVJvbGUnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndG9vbCddL0VsZW1lbnRbQFR5cGU9J1Rvb2wnXSIvPgotCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTx4c2w6aWYgdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2xNZW50b3InIj4KLQkJCQkJPG1ldGEgbmFtZT0idG9vbCIgY29udGVudD0ieyR0b29sL0BEaXNwbGF5TmFtZX0iLz4KLQkJCQk8L3hzbDppZj4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bWV0YSBuYW1lPSJyb2xlIj4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXNwb25zaWJsZVJvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmZXJlbmNlTGlzdCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudEVsZW1lbnRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2NvbnRlbnRFbGVtZW50cyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRlbnRFbGVtZW50cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRlZEVsZW1lbnRzVGV4dCIvPgotCQkJCQkJPC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbnRlbnRFbGVtZW50cyI+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9ImRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nbWFpbkRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImF0dGFjaG1lbnRzIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2F0dGFjaG1lbnRzJ10iLz4JCQkJCi0KLQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIG9yICRhdHRhY2htZW50cyAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkZXNjcmlwdGlvblRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4JCQkKLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9IiRhdHRhY2htZW50cyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhdHRhY2hlZEZpbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8VUw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2F0dGFjaGVkRmlsZSddIj4KLQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJPGEgaHJlZj0ie0B1cmx9IiB0YXJnZXQ9Il9ibGFuayI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBmaWxlTmFtZSIvPjwvYT4KLQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC9VTD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTwhLS0gdXNlIHRoZSBzcGVjaWZpYyBuYW1lZCBsaXN0LCAgb3RoZXJ3aXNlLCB0aGUgdmFyaWFiaWxpdHkgYmFzZSBlbGVtZW50IHdpbGwgYmUgaW5jbHVkZWQsIGJ1ZyAxNjM4ODUgLS0+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nY2hlY2tsaXN0cyddL0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZSA9J2NvbmNlcHRzQW5kUGFwZXJzJ10vRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nZ3VpZGVsaW5lcyddL0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lID0nc3VwcG9ydGluZ01hdGVyaWFscyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lICE9J2NvbnRlbnRFbGVtZW50cyddL0VsZW1lbnRbQFR5cGU9J1Rvb2xNZW50b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdjb25jZXB0c0FuZFBhcGVycyddL0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdleGFtcGxlcyddL0VsZW1lbnRbQFR5cGU9J0V4YW1wbGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWUgPSdhc3NldHMnXS9FbGVtZW50W0BUeXBlPSdSZXVzYWJsZUFzc2V0J10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkcmV1c2FibGVBc3NldHMpICsgY291bnQoJGV4YW1wbGVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVG9vbE1lbnRvcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9IiR0b29sTWVudG9ycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2lsbHVzdHJhdGlvbi54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2lsbHVzdHJhdGlvbi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDhmODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9pbGx1c3RyYXRpb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXhhbXBsZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFeGFtcGxlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1JldXNhYmxlQXNzZXQnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRleGFtcGxlcykgKyBjb3VudCgkcmV1c2FibGVBc3NldHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbGx1c3RyYXRpb25zVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEV4YW1wbGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJleGFtcGxlcyIgc2VsZWN0PSIkZXhhbXBsZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJldXNhYmxlQXNzZXRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgc2VsZWN0PSIkcmV1c2FibGVBc3NldHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9rZXlfY29uc2lkZXJhdGlvbi54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2tleV9jb25zaWRlcmF0aW9uLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMmYzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL2tleV9jb25zaWRlcmF0aW9uLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J2tleUNvbnNpZGVyYXRpb25zJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIka2V5Q29uc2lkZXJhdGlvbnMgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIka2V5Q29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGtleUNvbnNpZGVyYXRpb25zIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21haW5fZGVzY3JpcHRpb24ueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9tYWluX2Rlc2NyaXB0aW9uLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhMDc2OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21haW5fZGVzY3JpcHRpb24ueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRtYWluRGVzY3JpcHRpb24gIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFpbkRlc2NyaXB0aW9uVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb24iLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWFwcGluZy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21hcHBpbmcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA2NDBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvbWFwcGluZy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1hcHBpbmciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6Y2hvb3NlPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidhY3Rpdml0eSciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iid0b29sX21lbnRvciciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdPdXRjb21lJyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidhcnRpZmFjdCciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyYWJsZSciPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInYXJ0aWZhY3QnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQWN0aXZpdHknIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3dvcmtmbG93X2RldGFpbCciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDb25jZXB0JyI+Ci0JCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29udGVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iidjb25jZXB0JyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0V4YW1wbGUnIj4KLQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ2V4YW1wbGUnIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInb3RoZXInIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPC94c2w6b3RoZXJ3aXNlPgotCQk8L3hzbDpjaG9vc2U+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21pbGVzdG9uZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL21pbGVzdG9uZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YWFiZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9taWxlc3RvbmUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHJvcGVydHkueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Imd1aWRhbmNlX2hlbHBlci54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J01pbGVzdG9uZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWlsZXN0b25lRGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdNaWxlc3RvbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+CQkJCQotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQWN0aXZpdHlUcmVlVGFibGUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvUHJvY2Vzc0VsZW1lbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9wcm9jZXNzRWxlbWVudERhdGEuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2FnZVNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ij4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHByZWRlY2Vzc29yVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J1BsYW5uaW5nRGF0YSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRwbGFubmluZ0RhdGFUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkbXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2hhc011bHRpcGxlT2NjdXJyZW5jZXMnXSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJGV2ZW50RHJpdmVuVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNFdmVudERyaXZlbiddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9uZ29pbmdUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPbmdvaW5nJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJPHhzbDppZiB0ZXN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRyZXBlYXRhYmxlVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzUmVwZWF0YWJsZSddIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+CQkJCQotCQkJPC90YWJsZT4KLQkJPC9kaXY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InVzYWdlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJGNvbnRlbnREZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3VzYWdlR3VpZGFuY2UnXSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0JCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL291dGNvbWUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDNhMzBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3V0Y29tZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJ3b3JrcHJvZHVjdC54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFwcGluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4JCi0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3V0Y29tZURlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3REZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0KLQkJPGh0bWw+CQotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+IAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0ieyRiYWNrUGF0aH1jc3MvZGVmYXVsdC5jc3MiIHR5cGU9InRleHQvY3NzIi8+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVN1YlNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkb3V0Y29tZURlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJG91dGNvbWVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRhaWxvcmluZ1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJG91dGNvbWVEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQljb250ZW50UGFnZS5vbmxvYWQoKTsKLQkJCTwvc2NyaXB0PgotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL292ZXJ2aWV3LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3ZlcnZpZXcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMwZGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvb3ZlcnZpZXcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNjA0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImJhY2tQYXRoIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlZml4IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ncHJlZml4J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3lub255bXMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdzeW5vbnltcyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxJZCIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2V4dGVybmFsSWQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50IiBzZWxlY3Q9IkBTaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPGRpdiBpZD0icGFnZS1ndWlkIj4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InZhbHVlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdndWlkJ10iLz48L3hzbDphdHRyaWJ1dGU+Ci0JCTwvZGl2PgotCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZSIgbm93cmFwPSJ0cnVlIj4KLQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyBvciAkZWxlbWVudFR5cGUgPSAnU3VwcG9ydGluZ01hdGVyaWFsJyBvciAkZWxlbWVudFR5cGUgPSAnU3VtbWFyeSciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50ID0gJ3RydWUnIj4KLQkJCQkJCQkJCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2tEZXNjcmlwdG9yJyI+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza1RleHQiLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZURlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlVGV4dCIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdERlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJCTwhLS0KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJCQktLT4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImVsZW1lbnRUeXBlVGV4dCI+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPC94c2w6Y2hvb3NlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCQk8IS0tCi0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCQkJLS0+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJlbGVtZW50VHlwZVRleHQiPgotCQkJCQkJCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJHByZWZpeCAhPSAnJyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByZWZpeCIvPiAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+CQkJCQkJCi0JCQkJCTwveHNsOmNob29zZT4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkZXh0ZXJuYWxJZCAhPSAnJyI+Ci0JCQkJCQkoPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlcm5hbElkIi8+KQotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RkPgotCQkJCTx0ZCB3aWR0aD0iMTAwJSI+Ci0JCQkJCTxkaXYgYWxpZ249InJpZ2h0IiBpZD0iY29udGVudFBhZ2VUb29sYmFyIi8+Ci0JCQkJPC90ZD4KLQkJCQk8eHNsOmlmIHRlc3Q9IiRzaG93VHJlZUJyb3dzZXIiPgotCQkJCQk8dGQgd2lkdGg9IjEwMCUiIGNsYXNzPSJleHBhbmRDb2xsYXBzZUxpbmsiIGFsaWduPSJyaWdodCI+Ci0JCQkJCQk8YSBuYW1lPSJtYWluSW5kZXgiIGhyZWY9InskYmFja1BhdGh9aW5kZXguaHRtIi8+Ci0JCQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3RyZWVicm93c2VyLmpzIi8+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZVNlcGFyYXRvciI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgYWx0PSIiIHRpdGxlPSIiIGhlaWdodD0iMSIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCQk8eHNsOmNob29zZT4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ3VzdG9tQ2F0ZWdvcnknIGFuZCAkYnJpZWZEZXNjcmlwdGlvbiA9ICcnIj4KLQkJCQk8YnIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCTxkaXYgY2xhc3M9Im92ZXJ2aWV3Ij4KLQkJCQkJPHRhYmxlIHdpZHRoPSI5NyUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCTx0cj4KLQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiRicmllZkRlc2NyaXB0aW9uICE9ICcnIj4KLQkJCQkJCQkJPHRkIHdpZHRoPSI1MCI+Ci0JCQkJCQkJCQk8aW1nIHNyYz0ieyRlbGVtZW50SWNvbn0iIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPHRkPgotCQkJCQkJCQk8dGFibGUgY2xhc3M9Im92ZXJ2aWV3VGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQkJCTx0cj4KLQkJCQkJCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGJyaWVmRGVzY3JpcHRpb24iLz4KLQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJPC90cj4KLQkJCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9sZSciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icm9sZUtleUluZm8iLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFzayciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFza0tleUluZm8iLz4KLQkJCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQXJ0aWZhY3QnIG9yICRlbGVtZW50VHlwZSA9ICdEZWxpdmVyYWJsZScgb3IgJGVsZW1lbnRUeXBlID0gJ091dGNvbWUnIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0S2V5SW5mbyIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUb29sTWVudG9yJyI+Ci0JCQkJCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0b29sTWVudG9yS2V5SW5mbyIvPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUYXNrRGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGFza0Rlc2NyaXB0b3JLZXlJbmZvIj4KLQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlRGVzY3JpcHRvciciPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icm9sZURlc2NyaXB0b3JLZXlJbmZvIj4KLQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiIHNlbGVjdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQkJCQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXb3JrUHJvZHVjdERlc2NyaXB0b3InIj4KLQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvcktleUluZm8iPgotCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIgc2VsZWN0PSIkc2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCQkJCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50Ii8+Ci0JCQkJCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ndmFyaWFiaWxpdHlUeXBlJ10iLz4KLQkJCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZUVsZW1lbnQpID4gMCI+Ci0JCQkJCQkJCQkJCQk8dHI+Ci0JCQkJCQkJCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ3JlcGxhY2VzJyI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcGxhY2VzVGV4dCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnY29udHJpYnV0ZXMnICI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyAiPgotCQkJCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleHRlbmRzUmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQkJCQkJCTwhLS0gZGlzcGxheSBsb2NhbENPbnRyaWJ1dGlvbiBhbmQgbG9jYWxSZXBsYWNlbWVudCBhcyBleHRlbmRzIGZvciBub3cgLS0+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzJyBvciAkdmFyaWFiaWxpdHlUeXBlID0gJ2xvY2FsQ29udHJpYnV0aW9uJyBvciAkdmFyaWFiaWxpdHlUeXBlID0gJ2xvY2FsUmVwbGFjZW1lbnQnICI+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNUZXh0Ii8+Ci0JCQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYmFzZUVsZW1lbnQiPgotCQkJCQkJCQkJCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJCQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQkJPC90YWJsZT4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC90YWJsZT4KLQkJCQk8L2Rpdj4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJlbGVtZW50VHlwZVRleHQiPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIi8+Ci0JCTx4c2w6Y2hvb3NlPgkJCQkJCQkJCQkKLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQWN0aXZpdHknIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhY3Rpdml0eVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0FydGlmYWN0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXJ0aWZhY3RUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDYXBhYmlsaXR5UGF0dGVybiciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhcGFiaWxpdHlQYXR0ZXJuVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ2hlY2tsaXN0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY2hlY2tsaXN0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnQ29tcG9zaXRlUm9sZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbXBvc2l0ZVJvbGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdDb25jZXB0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29uY2VwdFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0N1c3RvbUNhdGVnb3J5JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY3VzdG9tQ2F0ZWdvcnlUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEZWxpdmVyYWJsZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlbGl2ZXJhYmxlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRGVsaXZlcnlQcm9jZXNzJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGVsaXZlcnlQcm9jZXNzVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnRGlzY2lwbGluZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRpc2NpcGxpbmVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEaXNjaXBsaW5lR3JvdXBpbmcnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkaXNjaXBsaW5lR3JvdXBpbmdUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdEb21haW4nIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRkb21haW5UZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJCi0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVzdGltYXRpb25Db25zaWRlcmF0aW9uc1RleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ0V4YW1wbGUnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRleGFtcGxlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnR3VpZGVsaW5lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ3VpZGVsaW5lVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnSXRlcmF0aW9uJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaXRlcmF0aW9uVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnTWlsZXN0b25lJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlsZXN0b25lVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnT3V0Y29tZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dGNvbWVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdQaGFzZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBoYXNlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUHJhY3RpY2UnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmFjdGljZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JlcG9ydCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcG9ydFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JldXNhYmxlQXNzZXQnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0VGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnUm9hZG1hcCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvYWRtYXBUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVEZXNjcmlwdG9yJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZURlc2NyaXB0b3JUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdSb2xlU2V0JyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1JvbGVTZXRHcm91cGluZyciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJvbGVTZXRHcm91cGluZ1RleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1N1cHBvcnRpbmdNYXRlcmlhbCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rhc2snIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGFza0Rlc2NyaXB0b3InIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1RlYW1Qcm9maWxlJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVByb2ZpbGVUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdUZW1wbGF0ZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRlbXBsYXRlVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVGVybURlZmluaXRpb24nIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXJtRGVmaW5pdGlvblRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1Rvb2wnIj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0b29sVGV4dCIvPgotCQkJPC94c2w6d2hlbj4KLQkJCTx4c2w6d2hlbiB0ZXN0PSIkZWxlbWVudFR5cGUgPSAnVG9vbE1lbnRvciciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xNZW50b3JUZXh0Ii8+Ci0JCQk8L3hzbDp3aGVuPgotCQkJPHhzbDp3aGVuIHRlc3Q9IiRlbGVtZW50VHlwZSA9ICdXaGl0ZXBhcGVyJyI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkd2hpdGVwYXBlclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0RGVzY3JpcHRvciciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0RGVzY3JpcHRvclRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0VHlwZSciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0VHlwZVRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOndoZW4gdGVzdD0iJGVsZW1lbnRUeXBlID0gJ1dvcmtQcm9kdWN0U2xvdCciPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHdvcmtQcm9kdWN0U2xvdFRleHQiLz4KLQkJCTwveHNsOndoZW4+Ci0JCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCTwveHNsOm90aGVyd2lzZT4KLQkJPC94c2w6Y2hvb3NlPgkKLQk8L3hzbDp0ZW1wbGF0ZT4KLQkKLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJvbGVLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQnXS9FbGVtZW50W0BUeXBlPSdSb2xlJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyb2xlU2V0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyb2xlU2V0cyddL0VsZW1lbnRbQFR5cGU9J1JvbGVTZXQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHN5bm9ueW1zICE9ICcnIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3lub255bXNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHN5bm9ueW1zIi8+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlUm9sZSkgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgkJCQkJCQotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlUm9sZSI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHJvbGVTZXRzKSA+IDAiPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaXplIiBzZWxlY3Q9ImNvdW50KCRyb2xlU2V0cykiLz4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZVNldHNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJvbGVTZXRzIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9InBvc2l0aW9uKCkgIT0gJHNpemUiPiwmIzE2MDs8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyb2xlRGVzY3JpcHRvcktleUluZm8iPgotCQk8eHNsOnBhcmFtIG5hbWU9InNob3dGdWxsTWV0aG9kQ29udGVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNvdXJjZVJvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHNob3dGdWxsTWV0aG9kQ29udGVudCA9ICdmYWxzZScgYW5kIGNvdW50KCRzb3VyY2VSb2xlKSA+IDAiPgotCQkJPHRyPgotCQkJCTx0ZD4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYXNlZE9uTWV0aG9kUm9sZVRleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc291cmNlUm9sZSI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhc2tLZXlJbmZvIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJkaXNjaXBsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkaXNjaXBsaW5lcyddL0VsZW1lbnRbQFR5cGU9J0Rpc2NpcGxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhc2VUYXNrIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSd2YXJpYWJpbGl0eVR5cGUnXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGlzY2lwbGluZXNUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRpc2NpcGxpbmVzIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkaXNjaXBsaW5lcykgPiBwb3NpdGlvbigpIj4sJiMxNjA7PC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRiYXNlVGFzaykgPiAwIj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRpc2NpcGxpbmVzKSA+IDAiPgotCQkJCQkJCTxici8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVwbGFjZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdjb250cmlidXRlcyciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udHJpYnV0ZXNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdleHRlbmRzUmVwbGFjZXMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNUZXh0Ii8+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYmFzZVRhc2siPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InRhc2tEZXNjcmlwdG9yS2V5SW5mbyI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0ic2hvd0Z1bGxNZXRob2RDb250ZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic291cmNlVGFzayIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1Rhc2snXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4JCQotCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAnZmFsc2UnIGFuZCBjb3VudCgkc291cmNlVGFzaykgPiAwIj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFzZWRPbk1ldGhvZFRhc2tUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHNvdXJjZVRhc2siPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3JLZXlJbmZvIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJzaG93RnVsbE1ldGhvZENvbnRlbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzb3VyY2VXb3JrUHJvZHVjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J1dvcmtQcm9kdWN0J10vRWxlbWVudCIvPgotCQk8eHNsOmlmIHRlc3Q9IiRzaG93RnVsbE1ldGhvZENvbnRlbnQgPSAnZmFsc2UnIGFuZCBjb3VudCgkc291cmNlV29ya1Byb2R1Y3QpID4gMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc291cmNlV29ya1Byb2R1Y3QiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC90ZD4KLQkJCTwvdHI+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ3b3JrUHJvZHVjdEtleUluZm8iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRvbWFpbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZG9tYWlucyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYXNlV29ya1Byb2R1Y3QiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0VHlwZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nd29ya1Byb2R1Y3RUeXBlcyddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0VHlwZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0ndmFyaWFiaWxpdHlUeXBlJ10iLz4KLQkJPHRyPgotCQkJPHRkPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRvbWFpbnMpID4gMCI+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZG9tYWluc1RleHQiLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZG9tYWlucyI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkZG9tYWlucykgPiBwb3NpdGlvbigpIj4sJiMxNjA7PC94c2w6aWY+Ci0JCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0VHlwZXMpID4gMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGRvbWFpbnMpID4gMCI+Ci0JCQkJCQk8YnIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JrUHJvZHVjdFR5cGVzVGV4dCIvPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbG9uX3dpdGhfc3BhY2UiLz4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFR5cGVzIj4KLQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFbGVtZW50V2l0aExpbmsiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR3b3JrUHJvZHVjdFR5cGVzKSA+IHBvc2l0aW9uKCkiPiwmIzE2MDs8L3hzbDppZj4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZVdvcmtQcm9kdWN0KSA+IDAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRkb21haW5zKSArIGNvdW50KCR3b3JrUHJvZHVjdFR5cGVzKSA+IDAiPgotCQkJCQkJPGJyLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlV29ya1Byb2R1Y3QiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RkPgotCQk8L3RyPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0b29sTWVudG9yS2V5SW5mbyI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3Rvb2wnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFzZUVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSddIi8+Ci0JCTx0cj4KLQkJCTx0ZD4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCR0b29sKSA+IDAiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRvb2xUZXh0Ii8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHRvb2wiPgotCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVsZW1lbnRXaXRoTGluayI+Ci0JCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnQiIHNlbGVjdD0iLiIvPgotCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJPC94c2w6aWY+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkYmFzZUVsZW1lbnQpID4gMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHRvb2wpICA+IDAiPgotCQkJCQkJPGJyLz4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJHZhcmlhYmlsaXR5VHlwZSA9ICdyZXBsYWNlcyciPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2NvbnRyaWJ1dGVzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRyaWJ1dGVzVGV4dCIvPgotCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiR2YXJpYWJpbGl0eVR5cGUgPSAnZXh0ZW5kc1JlcGxhY2VzJyI+Ci0JCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkdmFyaWFiaWxpdHlUeXBlID0gJ2V4dGVuZHMnIj4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZW5kc1RleHQiLz4KLQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRiYXNlRWxlbWVudCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudCIgc2VsZWN0PSIuIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3U2VwYXJhdG9yIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8dGFibGUgaWQ9Im92ZXJ2aWV3U2VwYXJhdG9yIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgotCQkJPHRyPgotCQkJCTx0ZCBjbGFzcz0ib3ZlcnZpZXdTZXBhcmF0b3IiPgotCQkJCQk8aW1nIHNyYz0ieyRpbWFnZVBhdGh9c2hpbS5naWYiIGFsdD0iIiB0aXRsZT0iIiBoZWlnaHQ9IjEiLz4KLQkJCQk8L3RkPgotCQkJPC90cj4KLQkJCTx0cj4KLQkJCQk8dGQ+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgYWx0PSIiIHRpdGxlPSIiIGhlaWdodD0iNSIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wYWdlX25vdF9pbnN0YWxsZWQueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wYWdlX25vdF9pbnN0YWxsZWQueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmE5MzlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcGFnZV9ub3RfaW5zdGFsbGVkLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgkJCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwYWdlTm90SW5zdGFsbGVkVGV4dCIvPjwvdGl0bGU+Ci0JCQk8L2hlYWQ+CQkKLQkJCTxib2R5PgotCQkJPHhzbDpjaG9vc2U+Ci0JCQkJPHhzbDp3aGVuIHRlc3Q9IkBpbnZhbGlkTGluayI+Ci0JCQkJCTxiPjxoMz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnREb2VzTm90RXhpc3RUZXh0Ii8+PC9oMz48L2I+Ci0JCQkJCTxwLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpc05vdFZhbGlkVGV4dCIvPgotCQkJCQk8YnIvPgkKLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0Ii8+Ci0JCQkJCTxwLz4KLQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwbGVhc2VGaXhMaW5rVGV4dCIvPgkJCQkJCQkJCQkKLQkJCQk8L3hzbDp3aGVuPgotCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJPGI+PGgzPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ0VsZW1lbnRUZXh0Ii8+PC9oMz48L2I+Ci0JCQkJPHAvPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm90QXZhaWxhYmxlVGV4dCIvPgkJCQkJCQkJCi0JCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQk8L3hzbDpjaG9vc2U+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJhY3RpY2UueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcmFjdGljZS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTYyOWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcmFjdGljZS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZS54c2wiLz4JCi0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgkJCi0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncmVzcG9uc2libGVSb2xlJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0KLSAgICAJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVzcG9uc2libGVSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uMiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24yIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWJQcmFjdGljZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3ViUHJhY3RpY2VzJ10vRWxlbWVudCIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250ZW50UmVmZXJlbmNlcyddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWN0aXZpdHlSZWZlcmVuY2VzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY29udGVudFJlZmVyZW5jZXMpICsgY291bnQoJHN1YlByYWN0aWNlcykgKyBjb3VudCgkYWN0aXZpdHlSZWZlcmVuY2VzKSArIGNvdW50KCRjYXRlZ29yaWVzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkY2F0ZWdvcmllc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjYXRlZ29yaWVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRzdWJQcmFjdGljZXNUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkc3ViUHJhY3RpY2VzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRSZWZlcmVuY2VzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjb250ZW50UmVmZXJlbmNlc1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRjb250ZW50UmVmZXJlbmNlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkYWN0aXZpdHlSZWZlcmVuY2VzVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0iJGFjdGl2aXR5UmVmZXJlbmNlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCQkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLSAgICA8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iZGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdtYWluRGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByb2JsZW0iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncHJvYmxlbSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja2dyb3VuZCIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdiYWNrZ3JvdW5kJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJnb2FscyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdnb2FscyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYXBwbGljYXRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYXBwbGljYXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nbGV2ZWxzT2ZBZG9wdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWRkaXRpb25hbEluZm8iIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYWRkaXRpb25hbEluZm8nXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSIkbWFpbkRlc2NyaXB0aW9uICE9ICcnIG9yICRwcm9ibGVtICE9ICcnIG9yICRiYWNrZ3JvdW5kICE9ICcnIG9yICRnb2FscyAhPSAnJyBvciAkYXBwbGljYXRpb24gIT0gJycgb3IgJGxldmVsc09mQWRvcHRpb24gIT0gJycgb3IgJGFkZGl0aW9uYWxJbmZvICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGRlc2NyaXB0aW9uVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgkJCQotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJG1haW5EZXNjcmlwdGlvbiAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluRGVzY3JpcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJG1haW5EZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkcHJvYmxlbSAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9ibGVtVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRwcm9ibGVtIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRiYWNrZ3JvdW5kICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tncm91bmRUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGJhY2tncm91bmQiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGdvYWxzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGdvYWxzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRnb2FscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXBwbGljYXRpb24gIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXBwbGljYXRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFwcGxpY2F0aW9uIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRsZXZlbHNPZkFkb3B0aW9uICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxldmVsc09mQWRvcHRpb25UZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGxldmVsc09mQWRvcHRpb24iLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGFkZGl0aW9uYWxJbmZvICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFkZGl0aW9uYWxJbmZvVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhZGRpdGlvbmFsSW5mbyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPiAgICAKLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcHJvcGVydHkueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcm9wZXJ0eS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTU1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wcm9wZXJ0eS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJPHhzbDpwYXJhbSBuYW1lPSJmaWVsZExhYmVsIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZmllbGRUZXh0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpZCI+cHJvcGVydHlfPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWVsZExhYmVsIi8+PC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6aWYgdGVzdD0iJGZpZWxkVGV4dCAhPSAnJyAiPgotCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpZCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWJiciI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmaWVsZExhYmVsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZpZWxkTGFiZWwiLz4KLQkJCQk8L3RoPgotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJGZpZWxkVGV4dCA9ICd0cnVlJyBvciAkZmllbGRUZXh0ID0gJ2ZhbHNlJyI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJoZWFkZXJzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iJGZpZWxkVGV4dCA9ICd0cnVlJyI+Ci0JCQkJCQkJCQk8aW1nIHdpZHRoPSIyMCIgaGVpZ2h0PSIxNSIgYWx0PSJZZXMiIHRpdGxlPSJZZXMiPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InNyYyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz50cnVlLmdpZjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCTwvaW1nPgotCQkJCQkJCQk8L3hzbDp3aGVuPgotCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTxpbWcgd2lkdGg9IjIwIiBoZWlnaHQ9IjE1IiBhbHQ9IiIgdGl0bGU9IiI+Ci0JCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPmluZGVudC5naWY8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8L2ltZz4KLQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTwveHNsOmNob29zZT4KLQkJCQkJCQk8IS0tCi0JCQkJCQkJPGxhYmVsIGZvcj0iY2JveDEiLz4KLQkJCQkJCQk8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVhZG9ubHkiPnRydWU8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iJGZpZWxkVGV4dCA9ICd0cnVlJyI+Ci0JCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjaGVja2VkIj5jaGVja2VkPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPmNib3gxPC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSI+Y2JveDE8L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9Im9uY2xpY2siPjx4c2w6Y2hvb3NlPjx4c2w6d2hlbiB0ZXN0PSIkZmllbGRUZXh0ID0gJ3RydWUnIj4KLQkgCQkJCQkJCQl0aGlzLmNoZWNrZWQ9dHJ1ZTsKLSAJCQkJCQkJCTwveHNsOndoZW4+PHhzbDpvdGhlcndpc2U+Ci0gCQkJCQkJCQkJdGhpcy5jaGVja2VkPWZhbHNlOwotIAkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPjwveHNsOmNob29zZT48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJPC9pbnB1dD4KLQkJCQkJCQktLT4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJoZWFkZXJzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlkIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkZmllbGRUZXh0Ii8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJPC94c2w6Y2hvb3NlPgotCQkJPC90cj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3B1cnBvc2UueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9wdXJwb3NlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYTZjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3B1cnBvc2UueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwdXJwb3NlIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9hdHRyaWJ1dGVbQG5hbWU9J3B1cnBvc2UnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRwdXJwb3NlICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1cnBvc2VUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHB1cnBvc2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ2NzJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4KLQotIwotIyBiZWdpbiBlbGVtZW50IHR5cGUgdGV4dCBzZWN0aW9uCi0jIHVzZXIgY2FuIGN1c3RvbWl6ZSB0aGUgdHlwZSB0ZXh0IGJlZm9yZSBwdWJsaXNoaW5nCi0jCi1hY3Rpdml0eVRleHQ9QWN0aXZpdHkKLWFydGlmYWN0VGV4dD1BcnRpZmFjdAotY2FwYWJpbGl0eVBhdHRlcm5UZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotY2hlY2tsaXN0VGV4dD1DaGVja2xpc3QKLWNvbXBvc2l0ZVJvbGVUZXh0PUNvbXBvc2l0ZSBSb2xlCi1jb25jZXB0VGV4dD1Db25jZXB0Ci1jdXN0b21DYXRlZ29yeVRleHQ9Q3VzdG9tIENhdGVnb3J5Ci1kZWxpdmVyYWJsZVRleHQ9RGVsaXZlcmFibGUKLWRlbGl2ZXJ5UHJvY2Vzc1RleHQ9RGVsaXZlcnkgUHJvY2VzcwotZGlzY2lwbGluZVRleHQ9RGlzY2lwbGluZQotZGlzY2lwbGluZUdyb3VwaW5nVGV4dD1EaXNjaXBsaW5lIEdyb3VwaW5nCi1kb21haW5UZXh0PURvbWFpbgotZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zVGV4dD1Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1leGFtcGxlVGV4dD1FeGFtcGxlCi1ndWlkZWxpbmVUZXh0PUd1aWRlbGluZQotaXRlcmF0aW9uVGV4dD1JdGVyYXRpb24KLW1pbGVzdG9uZVRleHQ9TWlsZXN0b25lCi1vdXRjb21lVGV4dD1PdXRjb21lCi1waGFzZVRleHQ9UGhhc2UKLXByYWN0aWNlVGV4dD1QcmFjdGljZQotcmVwb3J0VGV4dD1SZXBvcnQKLXJldXNhYmxlQXNzZXRUZXh0PVJldXNhYmxlIEFzc2V0Ci1yb2FkbWFwVGV4dD1Sb2FkbWFwCi1yb2xlVGV4dD1Sb2xlCi1yb2xlRGVzY3JpcHRvclRleHQ9Um9sZSBEZXNjcmlwdG9yCi1yb2xlU2V0VGV4dD1Sb2xlIFNldAotcm9sZVNldEdyb3VwaW5nVGV4dD1Sb2xlIFNldCBHcm91cGluZwotc3VwcG9ydGluZ01hdGVyaWFsVGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFsCi10YXNrVGV4dD1UYXNrCi10YXNrRGVzY3JpcHRvclRleHQ9VGFzayBEZXNjcmlwdG9yCi10ZWFtUHJvZmlsZVRleHQ9VGVhbSBQcm9maWxlCi10ZW1wbGF0ZVRleHQ9VGVtcGxhdGUKLXRlcm1EZWZpbml0aW9uVGV4dD1UZXJtIERlZmluaXRpb24KLXRvb2xUZXh0PVRvb2wKLXRvb2xNZW50b3JUZXh0PVRvb2wgTWVudG9yCi13aGl0ZXBhcGVyVGV4dD1XaGl0ZXBhcGVyCi13b3JrUHJvZHVjdERlc2NyaXB0b3JUZXh0PVdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yCi13b3JrUHJvZHVjdFR5cGVUZXh0PVdvcmsgUHJvZHVjdCBLaW5kCi13b3JrUHJvZHVjdFNsb3RUZXh0PVdvcmsgUHJvZHVjdCBTbG90Ci0KLSMKLSMgZW5kIGVsZW1lbnQgdHlwZSB0ZXh0IHNlY3Rpb24KLSMKLQotIwotIyBvdGhlciBsYXlvdXQgdGV4dCBiZWxvdwotIwotYWRkaXRpb25hbEluZm9UZXh0PUFkZGl0aW9uYWwgSW5mb3JtYXRpb24KLWFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0PUFkZGl0aW9uYWwgUGVyZm9ybWVycwotYWdncmVnYXRlc1RleHQ9QWdncmVnYXRlcwotYWx0ZXJuYXRpdmVzVGV4dD1BbHRlcm5hdGl2ZXMKLWFwcGxpY2F0aW9uVGV4dD1BcHBsaWNhdGlvbgotCi1hc3NldHNUZXh0PUFzc2V0cwotYXNzaWdubWVudEFwcHJvYWNoZXNUZXh0PUFzc2lnbm1lbnQgQXBwcm9hY2hlcwotYXNzaXN0aW5nVGV4dD1Bc3Npc3RpbmcKLWF0dGFjaGVkRmlsZXNUZXh0PUF0dGFjaGVkIEZpbGVzCi1iYWNrZ3JvdW5kVGV4dD1CYWNrZ3JvdW5kCi1icmllZk91dGxpbmVUZXh0PUJyaWVmIE91dGxpbmUKLWNhdGVnb3JpZXNUZXh0PUNhdGVnb3JpZXMKLWNoZWNrSXRlbXNUZXh0PUNoZWNrIEl0ZW1zCi1jaGVja2xpc3RzVGV4dD1DaGVja2xpc3RzCi1jb2xsYXBzZUFsbFRleHQ9Q29sbGFwc2UgQWxsIENoZWNrIEl0ZW1zCi0KLWNvbmNlcHRzVGV4dD1Db25jZXB0cwotY29udGFpbmVkQXJ0aWZhY3RzVGV4dD1Db250YWluZWQgQXJ0aWZhY3RzCi1jb250YWluZXJBcnRpZmFjdFRleHQ9Q29udGFpbmVyIEFydGlmYWN0Ci1jb250ZW50RWxlbWVudHNUZXh0PUNhdGVnb3JpemVkIEVsZW1lbnRzCi1jb250ZW50UmVmZXJlbmNlc1RleHQ9Q29udGVudCBSZWZlcmVuY2VzCi0KLWRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQ9RGVsaXZlcmFibGUgUHJvcGVydGllcwotZGVsaXZlcmVkUGFydHNUZXh0PURlbGl2ZXJhYmxlIFBhcnRzCi1kZWxpdmVyZWRXb3JrUHJvZHVjdHNUZXh0PURlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzCi1kZXBlbmRlbnRUZXh0PURlcGVuZGVudCBXb3JrIFByb2R1Y3RzCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcHRpb24KLWRlc2NyaXB0b3JzVGV4dD1EZXNjcmlwdG9ycwotCi1kaXNjaXBsaW5lc1RleHQ9RGlzY2lwbGluZXMKLXN1YmRpc2NpcGxpbmVzVGV4dD1TdWJkaXNjaXBsaW5lcwotCi1kb21haW5zVGV4dD1Eb21haW5zCi1leGFtcGxlc1RleHQ9RXhhbXBsZXMKLWV4cGFuZEFsbFRleHQ9RXhwYW5kIEFsbCBDaGVjayBJdGVtcwotZXh0ZW5kc1RleHQ9RXh0ZW5kcwotZXh0ZXJuYWxUZXh0PUV4dGVybmFsCi1leHRlcm5hbERlc2NyaXB0aW9uVGV4dD1FeHRlcm5hbCBEZXNjcmlwdGlvbgotZ29hbHNUZXh0PUdvYWxzCi1ndWlkZWxpbmVzVGV4dD1HdWlkZWxpbmVzCi1pbGx1c3RyYXRpb25zVGV4dD1JbGx1c3RyYXRpb25zCQotaW1wYWN0T2ZOb3RIYXZpbmdUZXh0PUltcGFjdCBvZiBub3QgaGF2aW5nCi1pbXBhY3RpbmdUZXh0PUltcGFjdGluZyBXb3JrIFByb2R1Y3RzCi1pbnB1dHNUZXh0PUlucHV0cwotaW5wdXRUb1RleHQ9SW5wdXQgVG8KLWl0ZW1zVGV4dD1JdGVtcwota2V5Q29uc2lkZXJhdGlvbnNUZXh0PUtleSBDb25zaWRlcmF0aW9ucwotbGV2ZWxzT2ZBZG9wdGlvblRleHQ9TGV2ZWxzIG9mIEFkb3B0aW9uCi1tYW5kYXRvcnlUZXh0PU1hbmRhdG9yeQotbWFpblRleHQ9TWFpbgotbWFpbkRlc2NyaXB0aW9uVGV4dD1NYWluIERlc2NyaXB0aW9uCi1tYWluUmVzcG9uc2libGVUZXh0PU1haW4gUmVzcG9uc2libGUKLW1ldGhvZFRleHQ9TWV0aG9kIFdvcmsgUHJvZHVjdAotbW9kaWZpZWRCeVRleHQ9TW9kaWZpZWQgQnkKLW1vcmVJbmZvVGV4dD1Nb3JlIEluZm9ybWF0aW9uCi1ub3RhdGlvblRleHQ9Tm90YXRpb24KLW9wdGlvbmFsVGV4dD1PcHRpb25hbAotCi1vdXRwdXRGcm9tVGV4dD1PdXRwdXQgRnJvbQotb3V0cHV0c1RleHQ9T3V0cHV0cwotcGFja2FnaW5nSW5zdHJ1Y3Rpb25zVGV4dD1QYWNrYWdpbmcgSW5zdHJ1Y3Rpb25zCi1wYWNrYWdpbmdHdWlkYW5jZVRleHQ9UGFja2FnaW5nIEd1aWRhbmNlCi1wZXJmb3JtaW5nUm9sZXNUZXh0PVBlcmZvcm1pbmcgUm9sZXMKLXByaW1hcnlQZXJmb3JtZXJUZXh0PVByaW1hcnkgUGVyZm9ybWVyCi1wcm9ibGVtVGV4dD1Qcm9ibGVtCi1wcm9wZXJ0aWVzVGV4dD1Qcm9wZXJ0aWVzCi1wdXJwb3NlVGV4dD1QdXJwb3NlCi1yZWFzb25zRm9yTm90TmVlZGluZ1RleHQ9UmVhc29ucyBmb3Igbm90IG5lZWRpbmcKLXJlZmVyZW5jZVdvcmtmbG93c1RleHQ9UmVmZXJlbmNlIFdvcmtmbG93cwotcmVsYXRlZEVsZW1lbnRzVGV4dD1SZWxhdGVkIEVsZW1lbnRzCi1yZWxhdGlvbnNoaXBzVGV4dD1SZWxhdGlvbnNoaXBzCi1yZXBvcnRzVGV4dD1SZXBvcnRzCi1yZXByZXNlbnRhdGlvbk9wdGlvbnNUZXh0PVJlcHJlc2VudGF0aW9uIE9wdGlvbnMKLXJlc3BvbnNpYmxlVGV4dD1SZXNwb25zaWJsZQotcmVzcG9uc2libGVGb3JUZXh0PVJlc3BvbnNpYmxlIGZvcgotcmV1c2FibGVBc3NldHNUZXh0PVJldXNhYmxlIEFzc2V0cwotCi1yb2xlc1RleHQ9Um9sZXMKLXJvbGVTZXRzVGV4dD1Sb2xlIFNldHMKLXNraWxsc1RleHQ9U2tpbGxzCi1zdGFmZmluZ1RleHQ9U3RhZmZpbmcKLXN0ZXBzVGV4dD1TdGVwcwotc3ViY2F0ZWdvcmllc1RleHQ9U3ViLUNhdGVnb3JpZXMJCi1zdWJkb21haW5zVGV4dD1TdWJkb21haW5zCi1zdWJQcmFjdGljZXNUZXh0PVN1Yi1QcmFjdGljZXMKLXN1cGVyVGVhbVRleHQ9U3VwZXItVGVhbSBQcm9maWxlCi1zdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dD1TdXBwb3J0aW5nIE1hdGVyaWFscwotc3VidGVhbXNUZXh0PVN1Yi1UZWFtcyBQcm9maWxlcwotc3lub255bXNUZXh0PVN5bm9ueW1zCi10YWlsb3JpbmdUZXh0PVRhaWxvcmluZwotCi10YXNrc1RleHQ9VGFza3MKLXRic1RleHQ9VGVhbSBBbGxvY2F0aW9uCi0KLXRlYW1Sb2xlc1RleHQ9VGVhbSBQcm9maWxlIFJvbGVzCi10ZWNobmlxdWVzVGV4dD1HdWlkZWxpbmVzCi10ZW1wbGF0ZXNUZXh0PVRlbXBsYXRlcwotdG9vbE1lbnRvcnNUZXh0PVRvb2wgTWVudG9ycwotCi11c2FnZVRleHQ9VXNhZ2UKLXdic1RleHQ9V29yayBCcmVha2Rvd24gU3RydWN0dXJlCi13aGl0ZXBhcGVyc1RleHQ9V2hpdGVwYXBlcnMKLXdvcmtQcm9kdWN0c1RleHQ9V29yayBQcm9kdWN0cwotd29ya1Byb2R1Y3RUeXBlc1RleHQ9V29yayBQcm9kdWN0IEtpbmRzCi13cGJzVGV4dD1Xb3JrIFByb2R1Y3QgVXNhZ2UKLXdvcmtCcmVha2Rvd25UZXh0PVdvcmsgQnJlYWtkb3duCi13b3JrZmxvd1RleHQ9V29ya2Zsb3cKLXdvcmtQcm9kdWN0QnJlYWtkb3duVGV4dD1Xb3JrIFByb2R1Y3QgQnJlYWtkb3duCi13b3JrUHJvZHVjdERlcGVuZGVuY2llc1RleHQ9V29yayBQcm9kdWN0IERlcGVuZGVuY2llcwotdGVhbVByb2ZpbGVCcmVha2Rvd25UZXh0PVRlYW0gQnJlYWtkb3duCi10ZWFtU3RydWN0dXJlVGV4dD1UZWFtIFN0cnVjdHVyZQotcGFnZU5vdEluc3RhbGxlZFRleHQ9UGFnZSBOb3QgSW5zdGFsbGVkCi1lbGVtZW50RG9lc05vdEV4aXN0VGV4dD1FbGVtZW50IERvZXMgTm90IEV4aXN0Ci1pc05vdFZhbGlkVGV4dD1UaGUgcmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgbGlicmFyeS4KLWVsZW1lbnRNaWdodEJlRGVsZXRlZFRleHQ9VGhlIGVsZW1lbnQgbWF5IGhhdmUgYmVlbiBkZWxldGVkIGZyb20gdGhlIGxpYnJhcnkuCi1wbGVhc2VGaXhMaW5rVGV4dD1QbGVhc2UgY2hlY2sgeW91ciBjb250ZW50IGxpYnJhcnkgYW5kIGZpeCB0aGUgbGluay4KLWluZm9BYm91dE1pc3NpbmdFbGVtZW50VGV4dD1JbmZvcm1hdGlvbiBhYm91dCB0aGUgbWlzc2luZyBlbGVtZW50OgotZWxlbWVudE5hbWVUZXh0PUVsZW1lbnQgTmFtZToKLWd1aWRUZXh0PUdVSUQ6Ci1taXNzaW5nRWxlbWVudFRleHQ9UmVmZXJlbmNlZCBwYWdlIGlzIG5vdCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24KLW5vdEF2YWlsYWJsZVRleHQ9VGhlIHJlZmVyZW5jZWQgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIFRoaXMgcGFnZSBtYXkgYmUgYXZhaWxhYmxlIGluIGFub3RoZXIgcHJvY2VzcyBjb25maWd1cmF0aW9uLgotZWxlbWVudFR5cGVUZXh0PUVsZW1lbnQgVHlwZToKLXBsdWdpbk5hbWVUZXh0PVBsdWctaW4gTmFtZToKLXByZWRlY2Vzc29yVGV4dD1QcmVkZWNlc3NvcgotcGxhbm5pbmdEYXRhVGV4dD1QbGFubmluZyBEYXRhCi1tdWx0aXBsZU9jY3VycmVuY2VzVGV4dD1NdWx0aXBsZSBPY2N1cnJlbmNlcwotZXZlbnREcml2ZW5UZXh0PUV2ZW50IERyaXZlbgotb25nb2luZ1RleHQ9T25nb2luZwotcGxhbm5lZFRleHQ9UGxhbm5lZAotcmVwZWF0YWJsZVRleHQ9UmVwZWF0YWJsZQotdXNhZ2VHdWlkYW5jZVRleHQ9VXNhZ2UgR3VpZGFuY2UKLWFjdGl2aXR5RW50cnlTdGF0ZVRleHQ9QWN0aXZpdHkgRW50cnkgU3RhdGUKLWFjdGl2aXR5RXhpdFN0YXRlVGV4dD1BY3Rpdml0eSBFeGl0IFN0YXRlCi1wcmVmaXhUZXh0PVByZWZpeAotZXh0ZXJuYWxJZFRleHQ9RXh0ZXJuYWwgSWQKLXNjb3BlVGV4dD1TY29wZQotCi10eXBlb2ZDb250cmFjdFRleHQ9VHlwZSBvZiBDb250cmFjdAotcHJvamVjdENoYXJhY3RlcmlzdGljc1RleHQ9UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3MKLXByb2plY3RNZW1iZXJFeHBlcnRpc2VUZXh0PVByb2plY3QgTWVtYmVyIEV4cGVydGlzZQotcmlza0xldmVsVGV4dD1SaXNrIExldmVsCi1zY2FsZVRleHQ9U2NhbGUKLXVzYWdlTm90ZXNUZXh0PVVzYWdlIE5vdGVzCi1jb250ZXh0VGV4dD1Db250ZXh0Ci1wYXJlbnRBY3Rpdml0aWVzVGV4dD1QYXJlbnQgQWN0aXZpdGllcwotaW5jbHVkZWRQYXR0ZXJuc1RleHQ9SW5jbHVkZWQgUGF0dGVybnMKLQotY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0PUNvbW11bmljYXRpb25zIE1hdGVyaWFscwotZWR1Y2F0aW9uTWF0ZXJpYWxzVGV4dD1FZHVjYXRpb24gTWF0ZXJpYWxzCi1lc3RpbWF0aW5nVGVjaG5pcXVlVGV4dD1Fc3RpbWF0aW5nIFRlY2huaXF1ZQotYWRkaXRpb25hbFRleHQ9QWRkaXRpb25hbAotbW9kaWZpZXNUZXh0PU1vZGlmaWVzCi1hZGRpdGlvbmFsbHlQZXJmb3Jtc1RleHQ9QWRkaXRpb25hbGx5IFBlcmZvcm1zCi1pbmRleFRleHQ9SW5kZXgKLWJyZWFrZG93bkVsZW1lbnRUZXh0PUJyZWFrZG93biBFbGVtZW50Ci1wcmVkZWNlc3NvcnNUZXh0PVByZWRlY2Vzc29ycwotdHlwZVRleHQ9VHlwZQotCi1tb2RlbEluZm9UZXh0PU1vZGVsIEluZm8KLWVudHJ5U3RhdGVUZXh0PUVudHJ5IFN0YXRlCi1leGl0U3RhdGVUZXh0PUV4aXQgU3RhdGUKLXRlYW1UZXh0PVRlYW0KLXBhcmVudFBhY2thZ2VUZXh0PVBhcmVudCBQYWNrYWdlCi1jb250YWluZWRQYWNrYWdlc1RleHQ9Q29udGFpbmVkIFBhY2thZ2VzCi1jb250ZW50c1RleHQ9Q29udGVudHMKLWJhc2VkT25NZXRob2RSb2xlVGV4dD1CYXNlZCBvbiBNZXRob2QgUm9sZQotYmFzZWRPbk1ldGhvZFRhc2tUZXh0PUJhc2VkIG9uIE1ldGhvZCBUYXNrCi1iYXNlZE9uTWV0aG9kV29ya1Byb2R1Y3RUZXh0PUJhc2VkIG9uIE1ldGhvZCBXb3JrIFByb2R1Y3QKLXN1bW1hcnlUZXh0PVN1bW1hcnkKLXBlcmZvcm1zVGV4dD1QZXJmb3JtcwotcmVwbGFjZXNUZXh0PVJlcGxhY2VzCi1jb250cmlidXRlc1RleHQ9Q29udHJpYnV0ZXMKLW5vbmVUZXh0PU5vbmUKLQotYWN0aXZpdHlSZWZlcmVuY2VzVGV4dD1BY3Rpdml0eSBSZWZlcmVuY2VzCi1uYW1lVGV4dD1OYW1lCi1wcmVzZW50YXRpb25OYW1lVGV4dD1QcmVzZW50YXRpb24gTmFtZQotcmVwcmVzZW50YXRpb25UZXh0PVNlbGVjdGVkIFJlcHJlc2VudGF0aW9uCi1wcm9qZWN0U3BlY2lmaWNzVGV4dD1Qcm9qZWN0IFNwZWNpZmljcwotZXh0ZW5kc1JlcGxhY2VzVGV4dD1FeHRlbmRzIGFuZCBSZXBsYWNlcwotd29ya1Byb2R1Y3RUZXh0PVdvcmsgUHJvZHVjdAotcHJvY2Vzc1VzYWdlVGV4dD1Qcm9jZXNzIFVzYWdlCi0KLWZ1bGZpbGxlZFNsb3RzVGV4dD1GdWxmaWxsZWQgU2xvdHMKLWZ1bGZpbGxpbmdXb3JrUHJvZHVjdHNUZXh0PUZ1bGZpbGxpbmcgV29yayBQcm9kdWN0cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcmVzb3VyY2VzLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4MjI4Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Jlc291cmNlcy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCQotCQotPCEtLSB0aGUgZWxlbWVudCB0eXBlIHRleHQgLS0+Ci08eHNsOnBhcmFtIG5hbWU9ImFjdGl2aXR5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJhcnRpZmFjdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY2FwYWJpbGl0eVBhdHRlcm5UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29tcG9zaXRlUm9sZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY29uY2VwdFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iY3VzdG9tQ2F0ZWdvcnlUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJhYmxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJkZWxpdmVyeVByb2Nlc3NUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRpc2NpcGxpbmVHcm91cGluZ1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZG9tYWluVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImV4YW1wbGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Imd1aWRlbGluZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iaXRlcmF0aW9uVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaWxlc3RvbmVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im91dGNvbWVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBoYXNlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwcmFjdGljZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2FkbWFwVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJyb2xlRGVzY3JpcHRvclRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldEdyb3VwaW5nVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRhc2tUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRhc2tEZXNjcmlwdG9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0ZWFtUHJvZmlsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0idGVtcGxhdGVUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InRlcm1EZWZpbml0aW9uVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0b29sVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ0b29sTWVudG9yVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ3aGl0ZXBhcGVyVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdERlc2NyaXB0b3JUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0VHlwZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RTbG90VGV4dCIvPgotCi08IS0tIG90aGVyIHRleHQgdmFyaWFibGVzIC0tPgotCTx4c2w6cGFyYW0gbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZGRpdGlvbmFsSW5mb1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWRkaXRpb25hbFBlcmZvcm1lclRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFkZGl0aW9uYWxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhZ2dyZWdhdGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYWx0ZXJuYXRpdmVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYXBwbGljYXRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhc3NldHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImFzc2lzdGluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImF0dGFjaGVkRmlsZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJiYWNrZ3JvdW5kVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iYmFzZWRPbk1ldGhvZFJvbGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJiYXNlZE9uTWV0aG9kVGFza1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJhc2VkT25NZXRob2RXb3JrUHJvZHVjdFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJicmllZk91dGxpbmVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjYXRlZ29yaWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY2hlY2tJdGVtc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNoZWNrbGlzdHNUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbGxhcHNlQWxsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb25jZXB0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudEVsZW1lbnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudFJlZmVyZW5jZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRleHRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJjb250cmlidXRlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJhYmxlUHJvcGVydGllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImRlbGl2ZXJlZFBhcnRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVwZW5kZW50VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdG9yc1RleHQiLz4JCi0JPHhzbDpwYXJhbSBuYW1lPSJkaXNjaXBsaW5lc1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0iZG9tYWluc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnREb2VzTm90RXhpc3RUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50TWlnaHRCZURlbGV0ZWRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50TmFtZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZW50cnlTdGF0ZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJldmVudERyaXZlblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4YW1wbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXhpdFN0YXRlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXhwYW5kQWxsVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZW5kc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJleHRlcm5hbElkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iZXh0ZXJuYWxUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJnb2Fsc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Imd1aWRlbGluZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJndWlkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaWxsdXN0cmF0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImltcGFjdGluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5jbHVkZWRQYXR0ZXJuc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImluZGV4VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaW5mb0Fib3V0TWlzc2luZ0VsZW1lbnRUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbnB1dHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJpbnB1dFRvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iaXNOb3RWYWxpZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1haW5EZXNjcmlwdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1haW5SZXNwb25zaWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1haW5UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtYW5kYXRvcnlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nRWxlbWVudFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vZGVsSW5mb1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vZGlmaWVkQnlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJtb2RpZmllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im1vcmVJbmZvVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ibXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im5vbmVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJub3RhdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im5vdEF2YWlsYWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im9uZ29pbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJvcHRpb25hbFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9Im91dHB1dEZyb21UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJvdXRwdXRzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGFja2FnaW5nR3VpZGFuY2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdpbmdJbnN0cnVjdGlvbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwYWdlTm90SW5zdGFsbGVkVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGFyZW50QWN0aXZpdGllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBlcmZvcm1pbmdSb2xlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBlcmZvcm1zVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icGxhbm5lZFRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBsYW5uaW5nRGF0YVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InBsZWFzZUZpeExpbmtUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwbHVnaW5OYW1lVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJlZGVjZXNzb3JzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJlZGVjZXNzb3JUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmVmaXhUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcmltYXJ5UGVyZm9ybWVyVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvYmxlbVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3NUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icHJvamVjdFNwZWNpZmljc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InByb3BlcnRpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwdXJwb3NlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3NUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWxhdGVkRWxlbWVudHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZWxhdGlvbnNoaXBzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwZWF0YWJsZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlcGxhY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVwb3J0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJlc3BvbnNpYmxlRm9yVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0icmVzcG9uc2libGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXVzYWJsZUFzc2V0c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InJpc2tMZXZlbFRleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0icm9sZVNldHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyb2xlc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InNjYWxlVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic2NvcGVUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJza2lsbHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdGFmZmluZ1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN0ZXBzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViY2F0ZWdvcmllc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1YmRvbWFpbnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJQcmFjdGljZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdWJUZWFtc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InN1bW1hcnlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3lub255bXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0YWlsb3JpbmdUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0YXNrc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRic1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1Qcm9maWxlQnJlYWtkb3duVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVhbVJvbGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVhbVN0cnVjdHVyZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InRlYW1UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0ZWNobmlxdWVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idGVtcGxhdGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idG9vbE1lbnRvcnNUZXh0Ii8+Ci0KLQk8eHNsOnBhcmFtIG5hbWU9InR5cGVvZkNvbnRyYWN0VGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idHlwZVRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9InVzYWdlR3VpZGFuY2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ1c2FnZU5vdGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0idXNhZ2VUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3YnNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3aGl0ZXBhcGVyc1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtCcmVha2Rvd25UZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrZmxvd1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9IndvcmtQcm9kdWN0QnJlYWtkb3duVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3REZXBlbmRlbmNpZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdHNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0id3Bic1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzVGV4dCIvPgotCTx4c2w6cGFyYW0gbmFtZT0iY29sb25fd2l0aF9zcGFjZSIvPgotCTx4c2w6cGFyYW0gbmFtZT0ic3ViZGlzY2lwbGluZXNUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJyZXByZXNlbnRhdGlvblRleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImV4dGVuZHNSZXBsYWNlc1RleHQiLz4KLQotCTx4c2w6cGFyYW0gbmFtZT0id29ya1Byb2R1Y3RUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJwcm9jZXNzVXNhZ2VUZXh0Ii8+Ci0JCi0JPHhzbDpwYXJhbSBuYW1lPSJmdWxmaWxsZWRTbG90c1RleHQiLz4KLQk8eHNsOnBhcmFtIG5hbWU9ImZ1bGZpbGxpbmdXb3JrUHJvZHVjdHNUZXh0Ii8+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGUueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9yb2xlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY4NzZlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGUueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOmluY2x1ZGUgaHJlZj0icmVzb3VyY2VzLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJjb21tb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9Im92ZXJ2aWV3LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYWluX2Rlc2NyaXB0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJpbGx1c3RyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImtleV9jb25zaWRlcmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImRlc2NyaXB0b3JfaGVscGVyLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icm9sZVNldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0ncm9sZVNldHMnXS9FbGVtZW50W0BUeXBlPSdSb2xlU2V0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQotCQk8aHRtbD4JCi0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiIGNvbnRlbnQ9InskZWxlbWVudFByZXNlbnRhdGlvbk5hbWV9Ii8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICAnJywgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4JCi0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGFmZmluZ1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRyb2xlRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nYWRkaXRpb25hbGx5UGVyZm9ybXMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RNb2RpZmllcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtb2RpZmllcyddL0VsZW1lbnRbQFR5cGUhPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0U2xvdE1vZGlmaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21vZGlmaWVzJ10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RTbG90J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjYXRlZ29yaWVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0NvbnRlbnRFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMnXS9FbGVtZW50Ii8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZVNpbmdsZUNlbGwiIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPgkKLQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJkaWFncmFtIi8+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZOYW1lIiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSIkY2F0ZWdvcmllcyIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJyZWZFbGVtZW50IiBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtcyIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RNb2RpZmllcykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90TW9kaWZpZXMpID4gMCI+Ci0JCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kaWZpZXNUZXh0Ii8+PC90aD4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RNb2RpZmllcyI+Ci0JCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCTxsaT4KLQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPC9hPgotCQkJCQkJCQk8L2xpPgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RTbG90TW9kaWZpZXMiPgotCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyddL0VsZW1lbnQiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L2xpPgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGREZXNjcmlwdG9ycyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbHNwYW4iIHNlbGVjdD0iJzEnIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lsbHMiIHNlbGVjdD0icmVmZXJlbmNlL0VsZW1lbnQvYXR0cmlidXRlW0BuYW1lPSdza2lsbHMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nYXNzaWdubWVudEFwcHJvYWNoZXMnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN5bm9ueW1zIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc3lub255bXMnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIG9yICRhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSAnJyBvciAkc3lub255bXMgIT0gJycgIiA+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGFmZmluZ1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRza2lsbHMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tpbGxzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRza2lsbHMiLz4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSIkc3lub255bXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3lub255bXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHN5bm9ueW1zIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvcm9sZV9kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmODhiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3JvbGVfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iQFR5cGUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iQFR5cGVOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iQE5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSJAQmFja1BhdGgiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNoYXBlSW1hZ2UiIHNlbGVjdD0iY29uY2F0KCRiYWNrUGF0aCxAU2hhcGVpY29uVXJsKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudERlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJvbGVEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1JvbGVEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJxdWVyeVN0cmluZyIgc2VsZWN0PSJAcXVlcnlTdHJpbmciLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJyZWxQcm9jZXNzUGF0aCIgc2VsZWN0PSJAcmVsUHJvY2Vzc1BhdGgiLz4KLQkJPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPGhlYWQ+Ci0JCQkJPHRpdGxlPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSIgY29udGVudD0ieyRlbGVtZW50VHlwZX0iLz4KLQkJCQk8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iLz4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIGZhbHNlLCB0cnVlLCBmYWxzZSk7Ci0JCQkJPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keT4KLQkJCTxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48L2Rpdj4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLQkJCQkJPHRyPgotCQkJCQkJPHRkIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8YSBuYW1lPSJUb3AiLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ib3ZlcnZpZXciPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZU5hbWUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50SWNvbiIgc2VsZWN0PSIkc2hhcGVJbWFnZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iJGJhY2tQYXRoIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iJHNob3dUcmVlQnJvd3NlciIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlZmluZWREZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RhZmZpbmdTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkZGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCWNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmZpeERlc2NyaXB0b3JMaW5rcygpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+Ci0JCTwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ij4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFJlZmVyZW5jZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZk5hbWUiIHNlbGVjdD0iJHByZWRlY2Vzc29yVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJlZkVsZW1lbnQiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbGlua1RvUHJlZGVjZXNzb3InXS9FbGVtZW50Ii8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC94c2w6aWY+Ci0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkdXNhZ2VHdWlkYW5jZSAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiR1c2FnZUd1aWRhbmNlIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3Jlc3BvbnNpYmxlRm9yJ10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J1JvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibW9kaWZpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbW9kaWZpZXMnXS9FbGVtZW50Ii8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVsYXRpb25zaGlwc1RleHQiLz4KLQkJPC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPjxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwZXJmb3Jtc1RleHQiLz46PC9zcGFuPjwvYj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1zKSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRwZXJmb3JtcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCTwvdGQ+Ci0JCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPGI+PHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yVGV4dCIvPjo8L3NwYW4+PC9iPgotCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVGb3IpID4gMCI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlc3BvbnNpYmxlRm9yIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQk8L3hzbDppZj4KLQkJCQkJPC90ZD4KLQkJCQk8L3RyPgotCQkJCTx0cj4KLQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB2YWxpZ249InRvcCI+Ci0JCQkJCQk8Yj48c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybXNUZXh0Ii8+Ojwvc3Bhbj48L2I+Ci0JCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtcykgPiAwIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkYWRkaXRpb25hbGx5UGVyZm9ybXMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCTwveHNsOmlmPgotCQkJCQk8L3RkPgotCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHZhbGlnbj0idG9wIj4KLQkJCQkJCTxiPjxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtb2RpZmllc1RleHQiLz46PC9zcGFuPjwvYj4KLQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1vZGlmaWVzKSA+IDAiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtb2RpZmllcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJPC94c2w6aWY+Ci0JCQkJCTwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDaGVja2xpc3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ29uY2VwdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPgotCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ2hlY2tsaXN0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSIkY2hlY2tsaXN0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkQ29uY2VwdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbmNlcHRzIiBzZWxlY3Q9IiRjb25jZXB0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkR3VpZGVsaW5lcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSIkZ3VpZGVsaW5lcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkU3VwcG9ydGluZ01hdGVyaWFscyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSIkc3VwcG9ydGluZ01hdGVyaWFscyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkV2hpdGVQYXBlcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9IiR3aGl0ZVBhcGVycyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InN0YWZmaW5nU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2tpbGxzIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nc2tpbGxzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhc3NpZ25tZW50QXBwcm9hY2hlcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J2Fzc2lnbm1lbnRBcHByb2FjaGVzJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIG9yICRhc3NpZ25tZW50QXBwcm9hY2hlcyAhPSAnJyBvciAkc3lub255bXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0YWZmaW5nVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkc2tpbGxzICE9ICcnIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRza2lsbHNUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHNraWxscyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFzc2lnbm1lbnRBcHByb2FjaGVzVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSIkc3lub255bXMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN5bm9ueW1zVGV4dCIvPgotCQkJCQkJCTwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRzeW5vbnltcyIvPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvc3VtbWFyeS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OTMwZDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC9zdW1tYXJ5LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXNlbnRhdGlvbiIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3ByZXNlbnRhdGlvbiddIi8+PHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+OiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+PC90aXRsZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idW1hTWV0YVRhZ3MiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSIkZWxlbWVudE5hbWUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJ7JGVsZW1lbnRUeXBlfSIvPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgkJCQkKLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlVG9vbGJhci5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9jb250ZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgICcnLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPGEgbmFtZT0iVG9wIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1bW1hcnlPdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlZmVyZW5jZUxpc3QiPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCI+Ci0JCQkJCQkJCQk8aDIgY2xhc3M9ImJhbm5lciI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iRWxlbWVudCI+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBUeXBlTmFtZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29sb25fd2l0aF9zcGFjZSIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPHAvPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3VtbWFyeU92ZXJ2aWV3Ij4KLQkJPHhzbDpwYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIvPgotCQk8eHNsOnBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZWxlbWVudEljb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzeW5vbnltcyIgc2VsZWN0PSJyZWZlcmVuY2UvRWxlbWVudC9hdHRyaWJ1dGVbQG5hbWU9J3N5bm9ueW1zJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJleHRlcm5hbElkIiBzZWxlY3Q9InJlZmVyZW5jZS9FbGVtZW50L2F0dHJpYnV0ZVtAbmFtZT0nZXh0ZXJuYWxJZCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJCi0JCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQk8dHI+Ci0JCQkJPHRkIGNsYXNzPSJwYWdlVGl0bGUiPgotCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN1bW1hcnlUZXh0Ii8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb2xvbl93aXRoX3NwYWNlIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRleHRlcm5hbElkICE9ICcnIj4KLQkJCQkJCSg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGV4dGVybmFsSWQiLz4pCi0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgotCQk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KLQkJCTx0cj4KLQkJCQk8dGQgY2xhc3M9InBhZ2VUaXRsZVNlcGFyYXRvciI+Ci0JCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zaGltLmdpZiIgYWx0PSIiIHRpdGxlPSIiIGhlaWdodD0iMSIvPgotCQkJCTwvdGQ+Ci0JCQk8L3RyPgotCQk8L3RhYmxlPgkJCi0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YWlsb3JpbmcueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YWlsb3JpbmcueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODcxY2Y5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFpbG9yaW5nLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idGFpbG9yaW5nU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdpbXBhY3RPZk5vdEhhdmluZyddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ncmVhc29uc0Zvck5vdE5lZWRpbmcnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdyZXByZXNlbnRhdGlvbk9wdGlvbnMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRpbXBhY3RPZk5vdEhhdmluZyAhPSAnJyBvciAkcmVhc29uc0Zvck5vdE5lZWRpbmcgIT0gJycgb3IgJHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSAnJyI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0YWlsb3JpbmdUZXh0Ii8+Ci0JCQk8L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRpbXBhY3RPZk5vdEhhdmluZyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1wYWN0T2ZOb3RIYXZpbmdUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGltcGFjdE9mTm90SGF2aW5nIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRyZWFzb25zRm9yTm90TmVlZGluZyAhPSAnJyI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmVhc29uc0Zvck5vdE5lZWRpbmdUZXh0Ii8+Ci0JCQkJCQkJPC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHJlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQk8eHNsOmlmIHRlc3Q9IiRyZXByZXNlbnRhdGlvbk9wdGlvbnMgIT0gJyciPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPgotCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlcHJlc2VudGF0aW9uT3B0aW9uc1RleHQiLz4KLQkJCQkJCQk8L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSIkcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90YXNrLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MjFlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2sueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkJCi0JCQkJCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJtYXBwaW5nLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHVycG9zZS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iaWxsdXN0cmF0aW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJrZXlfY29uc2lkZXJhdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yX2hlbHBlci54c2wiLz4KLQkKLQkJCi0JPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL0VsZW1lbnQiPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRhc2tEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J1Rhc2tEZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9ImNvcHlyaWdodCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSJAc2hvd1RyZWVCcm93c2VyIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icGVyZm9ybWluZ1JvbGUiIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwZXJmb3JtZWRCeSddL0VsZW1lbnRbQFR5cGU9J1JvbGUnXSIvPgotCQkJCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9ImVsZW1lbnRfdHlwZSI+IAotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFwcGluZyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGUiIHNlbGVjdD0iJGVsZW1lbnRUeXBlIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC9tZXRhPgotCQkJCTxtZXRhIG5hbWU9ImZpbGV0eXBlIiBjb250ZW50PSJkZXNjcmlwdGlvbiIvPgotCQkJCTxtZXRhIG5hbWU9InJvbGUiPgotCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHBlcmZvcm1pbmdSb2xlL0BEaXNwbGF5TmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQk8L21ldGE+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJCXZhciBiYWNrUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhY2tQYXRoIi8+JzsKLQkJCQkJdmFyIGltZ1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbWFnZVBhdGgiLz4nOwotCQkJCQl2YXIgbm9kZUluZm89bnVsbDsKLQkJCQkJY29udGVudFBhZ2UucHJlbG9hZChpbWdQYXRoLCBiYWNrUGF0aCwgbm9kZUluZm8sICcnLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im92ZXJ2aWV3Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwdXJwb3NlU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkdGFza0Rlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icmVsYXRpb25zaGlwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkdGFza0Rlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3RlcHNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiR0YXNrRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJtb3JlSW5mb1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY29weXJpZ2h0Ij4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSIkY29weXJpZ2h0Ii8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCTwvdGQ+CQkJCQkJCi0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvYm9keT4KLQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci0JCQk8L3NjcmlwdD4KLQotCQk8L2h0bWw+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdwZXJmb3JtZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3b3JrUHJvZHVjdE1hbmRhdG9yeUlucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dCddL0VsZW1lbnRbQFR5cGUhPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0U2xvdE1hbmRhdG9yeUlucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dCddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RPcHRpb25hbElucHV0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdvcHRpb25hbElucHV0J10vRWxlbWVudFtAVHlwZSE9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RTbG90T3B0aW9uYWxJbnB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dCddL0VsZW1lbnRbQFR5cGU9J1dvcmtQcm9kdWN0U2xvdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id29ya1Byb2R1Y3RPdXRwdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J291dHB1dCddL0VsZW1lbnRbQFR5cGUhPSdXb3JrUHJvZHVjdFNsb3QnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndvcmtQcm9kdWN0U2xvdE91dHB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0J10vRWxlbWVudFtAVHlwZT0nV29ya1Byb2R1Y3RTbG90J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpbWFnZVBhdGgiIHNlbGVjdD0iY29uY2F0KC9FbGVtZW50L0BCYWNrUGF0aCwgJ2ltYWdlcy8nKSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRCeSkgKyBjb3VudCgkY2F0ZWdvcmllcykgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpICsgY291bnQoJHdvcmtQcm9kdWN0TWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCR3b3JrUHJvZHVjdFNsb3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE9wdGlvbmFsSW5wdXRzKSArIGNvdW50KCR3b3JrUHJvZHVjdE91dHB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE91dHB1dHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNhdGVnb3JpZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjYXRlZ29yaWVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIyIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkY2F0ZWdvcmllcyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRCeSkgKyBjb3VudCgkYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjQyJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByaW1hcnlQZXJmb3JtZXJUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHBlcmZvcm1lZEJ5KSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHBlcmZvcm1lZEJ5Ij4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFkZGl0aW9uYWxQZXJmb3JtZXJUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ij4KLQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0TWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCR3b3JrUHJvZHVjdFNsb3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5wdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iNDIlIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWFuZGF0b3J5VGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb3VudCgkd29ya1Byb2R1Y3RNYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE1hbmRhdG9yeUlucHV0cykgPiAwIj4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdE1hbmRhdG9yeUlucHV0cyI+CQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkJCQotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiR3b3JrUHJvZHVjdFNsb3RNYW5kYXRvcnlJbnB1dHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyddL0VsZW1lbnQiPgotCQkJCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMpICsgY291bnQoJHdvcmtQcm9kdWN0U2xvdE9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0T3B0aW9uYWxJbnB1dHMiPgkJCQkKLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4JCQkJCQkKLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+CQkJCQkJCQotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RTbG90T3B0aW9uYWxJbnB1dHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyddL0VsZW1lbnQiPgotCQkJCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+CQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJHdvcmtQcm9kdWN0T3V0cHV0cykgKyBjb3VudCgkd29ya1Byb2R1Y3RTbG90T3V0cHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91dHB1dHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkd29ya1Byb2R1Y3RPdXRwdXRzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHdvcmtQcm9kdWN0U2xvdE91dHB1dHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz4KLQkJCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCQotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRGVzY3JpcHRvcnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Rlc2NyaXB0b3JzJ10vRWxlbWVudCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbHNwYW4iIHNlbGVjdD0iJzInIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4JCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnXSIvPgotCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR0b29sTWVudG9ycykgKyBjb3VudCgkd2hpdGVQYXBlcnMpICsgY291bnQoJGVzdGltYXRpb25Db25zaWRlcmF0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDaGVja2xpc3RzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9IiRjaGVja2xpc3RzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRDb25jZXB0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0iJGNvbmNlcHRzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRHdWlkZWxpbmVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJndWlkZWxpbmVzIiBzZWxlY3Q9IiRndWlkZWxpbmVzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBzZWxlY3Q9IiRzdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRUb29sTWVudG9ycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0iJHRvb2xNZW50b3JzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRXaGl0ZVBhcGVycyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0iJHdoaXRlUGFwZXJzIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgc2VsZWN0PSIkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ic3RlcHNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNlY3Rpb25zIiBzZWxlY3Q9IiRkZXNjcmlwdGlvbi9yZWZlcmVuY2VMaXN0W0BuYW1lPSdzZWN0aW9ucyddL0VsZW1lbnRbQFR5cGU9J1NlY3Rpb24nXSIvPgotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRzZWN0aW9ucykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHN0ZXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzZWN0aW9ucyI+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBIZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSduYW1lJ10iLz48L2Rpdj4KLQkJCQkJCQkJPGRpdiBjbGFzcz0ic3RlcENvbnRlbnQiPgotCQkJCQkJCQkJPHRhYmxlIGNsYXNzPSJzdGVwVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCQkJCQk8dGQ+Ci0JCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdzZWN0aW9uRGVzY3JpcHRpb24nXSIvPgotCQkJCQkJCQkJCQk8L3RkPgotCQkJCQkJCQkJCTwvdHI+Ci0JCQkJCQkJCQk8L3RhYmxlPgotCQkJCQkJCQk8L2Rpdj4JCQkJCQkKLQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0iYWx0ZXJuYXRpdmVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhbHRlcm5hdGl2ZXMiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0nYWx0ZXJuYXRpdmVzJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSIkYWx0ZXJuYXRpdmVzICE9ICcnICI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhbHRlcm5hdGl2ZXNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlU2luZ2xlQ2VsbCI+Ci0JCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRhbHRlcm5hdGl2ZXMiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFza19kZXNjcmlwdG9yLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvdGFza19kZXNjcmlwdG9yLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1YjVlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3Rhc2tfZGVzY3JpcHRvci54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJwdXJwb3NlLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudElkIiBzZWxlY3Q9IkBJZCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IkBUeXBlIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFR5cGVOYW1lIiBzZWxlY3Q9IkBUeXBlTmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IkBOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iYmFja1BhdGgiIHNlbGVjdD0iQEJhY2tQYXRoIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQkgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzaGFwZUltYWdlIiBzZWxlY3Q9ImNvbmNhdCgkYmFja1BhdGgsQFNoYXBlaWNvblVybCkiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwcmVzZW50YXRpb24iIHNlbGVjdD0icmVmZXJlbmNlW0BuYW1lPSdwcmVzZW50YXRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiddIi8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iY29weXJpZ2h0Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IkBzaG93VHJlZUJyb3dzZXIiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtaW5nUm9sZSIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J3BlcmZvcm1lZFByaW1hcmlseUJ5J10vRWxlbWVudFtAVHlwZT0nUm9sZURlc2NyaXB0b3InXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgkJCi0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVsZW1lbnRUeXBlTmFtZSIvPjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPjwvdGl0bGU+Ci0JCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVtYU1ldGFUYWdzIj4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlIiBzZWxlY3Q9IiRlbGVtZW50VHlwZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudE5hbWUiIHNlbGVjdD0iJGVsZW1lbnROYW1lIi8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTxtZXRhIG5hbWU9InVtYS5ndWlkIiBjb250ZW50PSJ7JGVsZW1lbnRJZH0iLz4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPG1ldGEgbmFtZT0icm9sZSI+Ci0JCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImNvbnRlbnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGVyZm9ybWluZ1JvbGUvQERpc3BsYXlOYW1lIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCTwvbWV0YT4KLQkJCQk8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9InskYmFja1BhdGh9Y3NzL2RlZmF1bHQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIvPgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VSZXNvdXJjZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVNlY3Rpb24uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTdWJTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0FjdGl2aXR5VHJlZVRhYmxlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL1Byb2Nlc3NFbGVtZW50UGFnZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Db250ZW50UGFnZVRvb2xiYXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotCQkJCQl2YXIgZGVmYXVsdFF1ZXJ5U3RyID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcXVlcnlTdHJpbmciLz4nOwotCQkJCQl2YXIgYmFja1BhdGggPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRiYWNrUGF0aCIvPic7Ci0JCQkJCXZhciBpbWdQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW1hZ2VQYXRoIi8+JzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCBkZWZhdWx0UXVlcnlTdHIsIHRydWUsIHRydWUsIGZhbHNlKTsKLQkJCQk8L3NjcmlwdD4KLQkJCTwvaGVhZD4KLQkJCTxib2R5PgotCQkJPGRpdiBpZD0iYnJlYWRjcnVtYnMiPjwvZGl2PgotCQkJCTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+CQkJCQkJCQkKLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IiRlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudEljb24iIHNlbGVjdD0iJHNoYXBlSW1hZ2UiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IiRiYWNrUGF0aCIvPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0ic2hvd1RyZWVCcm93c2VyIiBzZWxlY3Q9IiRzaG93VHJlZUJyb3dzZXIiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InB1cnBvc2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb25TZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iLz4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRkZXNjcmlwdG9yRGVzY3JpcHRpb24iLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbGx1c3RyYXRpb25zU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJrZXlDb25zaWRlcmF0aW9uc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFsdGVybmF0aXZlc1NlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGRlc2NyaXB0b3JEZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjb3B5cmlnaHQiPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29weXJpZ2h0IiBzZWxlY3Q9IiRjb3B5cmlnaHQiLz4KLQkJCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQkJPC90ZD4JCQkJCQkKLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9ib2R5PgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJCQljb250ZW50UGFnZS5wcm9jZXNzUGFnZS5maXhEZXNjcmlwdG9yTGlua3MoKTsKLQkJCQk8L3NjcmlwdD4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0aWVzU2VjdGlvbiI+Ci0JCTx4c2w6cGFyYW0gbmFtZT0iY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHByb3BlcnRpZXNUZXh0Ii8+PC9kaXY+Ci0JCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkgICAgPHhzbDppZiB0ZXN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVmZXJlbmNlcyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmTmFtZSIgc2VsZWN0PSIkcHJlZGVjZXNzb3JUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVmRWxlbWVudCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdsaW5rVG9QcmVkZWNlc3NvciddL0VsZW1lbnQiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0nUGxhbm5pbmdEYXRhJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uaW5nRGF0YVRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdQbGFubmluZ0RhdGEnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkZXZlbnREcml2ZW5UZXh0Ii8+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc0V2ZW50RHJpdmVuJ10iLz4KLQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkb25nb2luZ1RleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09uZ29pbmcnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJG9wdGlvbmFsVGV4dCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkVGV4dCIgc2VsZWN0PSJhdHRyaWJ1dGVbQG5hbWU9J2lzT3B0aW9uYWwnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgotCQkJCTx4c2w6aWYgdGVzdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSIkcGxhbm5lZFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc1BsYW5uZWQnXSIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwveHNsOmlmPgkJCQkKLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHJlcGVhdGFibGVUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNSZXBlYXRhYmxlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4JCQkJCi0JCQk8L3RhYmxlPgotCQk8L2Rpdj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHNlbGVjdD0iJGRlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iJHVzYWdlR3VpZGFuY2UgIT0gJyciPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdXNhZ2VHdWlkYW5jZVRleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJHVzYWdlR3VpZGFuY2UiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4JCi0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdwZXJmb3JtZWRQcmltYXJpbHlCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSddL0VsZW1lbnQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJhc3Npc3RlZEJ5IiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J2Fzc2lzdGVkQnknXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J21hbmRhdG9yeUlucHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im9wdGlvbmFsSW5wdXRzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXQnXS9FbGVtZW50Ii8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdleHRlcm5hbElucHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoL0VsZW1lbnQvQEJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcGVyZm9ybWVkUHJpbWFyaWx5QnkpICsgY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSArIGNvdW50KCRhc3Npc3RlZEJ5KSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRzKSArIGNvdW50KCRleHRlcm5hbElucHV0KSsgY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyZWxhdGlvbnNoaXBzVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcGVyZm9ybWVkUHJpbWFyaWx5QnkpICsgY291bnQoJGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KSArIGNvdW50KCRhc3Npc3RlZEJ5KSA+IDAiPgkJCQotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcm9sZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtYWluVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRwZXJmb3JtZWRQcmltYXJpbHlCeSkgPiAwIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRwZXJmb3JtZWRQcmltYXJpbHlCeSI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIAlzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiB3aWR0aD0iMzAlIj4JCi0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+CQkJCQkJCQotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhZGRpdGlvbmFsVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSkgPiAwIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIAlzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYXNzaXN0aW5nVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRhc3Npc3RlZEJ5KSA+IDAiPgkJCQkJCQkJCQotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGFzc2lzdGVkQnkiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiAJc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4JCQkKLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRzKSArIGNvdW50KCRleHRlcm5hbElucHV0KSArIGNvdW50KCRvcHRpb25hbElucHV0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGlucHV0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjMwJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1hbmRhdG9yeVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0cykgPiAwIj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSIzMCUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRzKSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6d2hlbj4JCQkJCi0JCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbm9uZVRleHQiLz4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC91bD4JCQkJCQkJCQkKLQkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4JCQkJCQkJCQkKLQkJCQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXh0ZXJuYWxUZXh0Ii8+OgotCQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KCRleHRlcm5hbElucHV0KSA+IDAiPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZXh0ZXJuYWxJbnB1dCI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDp3aGVuPgkJCQkKLQkJCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCQkJPHVsPgotCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25lVGV4dCIvPgotCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQk8L3VsPgkJCQkJCQkJCQotCQkJCQkJCQkJPC94c2w6b3RoZXJ3aXNlPgkJCQkJCQkJCQotCQkJCQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJCQkJPC90ZD4JCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dHMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG91dHB1dHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdGVwc1NlY3Rpb24iPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNlY3Rpb25zIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J3NlbGVjdGVkU3RlcHMnXS9FbGVtZW50W0BUeXBlPSdTZWN0aW9uJ10iLz4KLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc2VjdGlvbnMpID4gMCI+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdGVwc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkc2VjdGlvbnMiPgotCQkJCQkJCQk8ZGl2IGNsYXNzPSJzdGVwSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nbmFtZSddIi8+PC9kaXY+Ci0JCQkJCQkJCTxkaXYgY2xhc3M9InN0ZXBDb250ZW50Ij4KLQkJCQkJCQkJCTx0YWJsZSBjbGFzcz0ic3RlcFRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQkJCQkJPHRkPgotCQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0nc2VjdGlvbkRlc2NyaXB0aW9uJ10iLz4KLQkJCQkJCQkJCQkJPC90ZD4KLQkJCQkJCQkJCQk8L3RyPgotCQkJCQkJCQkJPC90YWJsZT4KLQkJCQkJCQkJPC9kaXY+CQkJCQkJCi0JCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY2hlY2tsaXN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NoZWNrbGlzdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uY2VwdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdDb25jZXB0J10iLz4JCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZ3VpZGVsaW5lcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0d1aWRlbGluZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1N1cHBvcnRpbmdNYXRlcmlhbCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idG9vbE1lbnRvcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdUb29sTWVudG9yJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J1doaXRlcGFwZXInXSIvPgkJCi0JCTx4c2w6dmFyaWFibGUgbmFtZT0iaW1hZ2VQYXRoIiBzZWxlY3Q9ImNvbmNhdCgvRWxlbWVudC9AQmFja1BhdGgsICdpbWFnZXMvJykiLz4KLQotCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRjaGVja2xpc3RzKSArIGNvdW50KCRjb25jZXB0cykgKyBjb3VudCgkZ3VpZGVsaW5lcykgKyBjb3VudCgkc3VwcG9ydGluZ01hdGVyaWFscykgKyBjb3VudCgkdG9vbE1lbnRvcnMpICsgY291bnQoJHdoaXRlUGFwZXJzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhbHRlcm5hdGl2ZXNTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImFsdGVybmF0aXZlcyIgc2VsZWN0PSIkZGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSdhbHRlcm5hdGl2ZXMnXSIvPgotCQk8eHNsOmlmIHRlc3Q9IiRhbHRlcm5hdGl2ZXMgIT0gJycgIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGFsdGVybmF0aXZlc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVTaW5nbGVDZWxsIj4KLQkJCQkJCQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iJGFsdGVybmF0aXZlcyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC90ZWFtcHJvZmlsZS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYzYzNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3RlYW1wcm9maWxlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ibWFpbl9kZXNjcmlwdGlvbi54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InByb3BlcnR5LnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJndWlkYW5jZV9oZWxwZXIueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9ImlsbHVzdHJhdGlvbi54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9FbGVtZW50Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSJAVHlwZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSJAVHlwZU5hbWUiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbGVtZW50TmFtZSIgc2VsZWN0PSJATmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVsZW1lbnRQcmVzZW50YXRpb25OYW1lIiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJhY2tQYXRoIiBzZWxlY3Q9IkBCYWNrUGF0aCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLCAnaW1hZ2VzLycpIi8+Ci0JICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2hhcGVJbWFnZSIgc2VsZWN0PSJjb25jYXQoJGJhY2tQYXRoLEBTaGFwZWljb25VcmwpIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icHJlc2VudGF0aW9uIiBzZWxlY3Q9InJlZmVyZW5jZVtAbmFtZT0ncHJlc2VudGF0aW9uJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iIHNlbGVjdD0iJHByZXNlbnRhdGlvbi9FbGVtZW50W0BUeXBlPSdCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24nXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkcHJlc2VudGF0aW9uL0VsZW1lbnRbQFR5cGU9J0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZGVzY3JpcHRvckRlc2NyaXB0aW9uIiBzZWxlY3Q9IiRwcmVzZW50YXRpb24vRWxlbWVudFtAVHlwZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJ10iLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvcHlyaWdodCIgc2VsZWN0PSJjb3B5cmlnaHQiLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93VHJlZUJyb3dzZXIiIHNlbGVjdD0iQHNob3dUcmVlQnJvd3NlciIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InF1ZXJ5U3RyaW5nIiBzZWxlY3Q9IkBxdWVyeVN0cmluZyIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlbFByb2Nlc3NQYXRoIiBzZWxlY3Q9IkByZWxQcm9jZXNzUGF0aCIvPgotCi0JCTxodG1sPgkKLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbGVtZW50VHlwZU5hbWUiLz46IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz48L3RpdGxlPgotCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1bWFNZXRhVGFncyI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnROYW1lIiBzZWxlY3Q9IiRlbGVtZW50TmFtZSIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiIHNlbGVjdD0iJGVsZW1lbnRQcmVzZW50YXRpb25OYW1lIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8bWV0YSBuYW1lPSJlbGVtZW50X3R5cGUiIGNvbnRlbnQ9InskZWxlbWVudFR5cGV9Ii8+Ci0JCQkJPG1ldGEgbmFtZT0iZmlsZXR5cGUiIGNvbnRlbnQ9ImRlc2NyaXB0aW9uIi8+Ci0JCQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSJ7JGJhY2tQYXRofWNzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlUmVzb3VyY2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL0NvbnRlbnRQYWdlU3ViU2VjdGlvbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9BY3Rpdml0eVRyZWVUYWJsZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCBzcmM9InskYmFja1BhdGh9c2NyaXB0cy9Qcm9jZXNzRWxlbWVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotCQkJCTxzY3JpcHQgc3JjPSJ7JGJhY2tQYXRofXNjcmlwdHMvQ29udGVudFBhZ2VUb29sYmFyLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL2NvbnRlbnRQYWdlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLQkJCQk8c2NyaXB0IHNyYz0ieyRiYWNrUGF0aH1zY3JpcHRzL3Byb2Nlc3NFbGVtZW50RGF0YS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJdmFyIGRlZmF1bHRRdWVyeVN0ciA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHF1ZXJ5U3RyaW5nIi8+JzsKLQkJCQkJdmFyIGJhY2tQYXRoID0gJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFja1BhdGgiLz4nOwotCQkJCQl2YXIgaW1nUGF0aCA9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGltYWdlUGF0aCIvPic7Ci0JCQkJCXZhciBub2RlSW5mbz1udWxsOwotCQkJCQljb250ZW50UGFnZS5wcmVsb2FkKGltZ1BhdGgsIGJhY2tQYXRoLCBub2RlSW5mbywgZGVmYXVsdFF1ZXJ5U3RyLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotCQkJPC9oZWFkPgotCQkJPGJvZHk+Ci0JCQk8ZGl2IGlkPSJicmVhZGNydW1icyI+PC9kaXY+Ci0JCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCB2YWxpZ249InRvcCI+CQotCQkJCQkJCTxhIG5hbWU9IlRvcCIvPgotCQkJCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJvdmVydmlldyI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50VHlwZSIgc2VsZWN0PSIkZWxlbWVudFR5cGUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRUeXBlTmFtZSIgc2VsZWN0PSIkZWxlbWVudFR5cGVOYW1lIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50UHJlc2VudGF0aW9uTmFtZSIgc2VsZWN0PSIkZWxlbWVudFByZXNlbnRhdGlvbk5hbWUiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImVsZW1lbnRJY29uIiBzZWxlY3Q9IiRzaGFwZUltYWdlIi8+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJiYWNrUGF0aCIgc2VsZWN0PSIkYmFja1BhdGgiLz4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3dUcmVlQnJvd3NlciIgc2VsZWN0PSIkc2hvd1RyZWVCcm93c2VyIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIi8+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvblNlY3Rpb24iPgotCQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZGVzY3JpcHRpb24iIHNlbGVjdD0iJGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnRpZXNTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkY29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkKLQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaWxsdXN0cmF0aW9uc1NlY3Rpb24iLz4JCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zU2VjdGlvbiI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdGlvbiIgc2VsZWN0PSIkYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIi8+Ci0JCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4JCQkJCQkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9Im1vcmVJbmZvU2VjdGlvbiIvPgkJCi0JCQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNvcHlyaWdodCI+Ci0JCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb3B5cmlnaHQiIHNlbGVjdD0iJGNvcHlyaWdodCIvPgotCQkJCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJCQk8L3RkPgkJCQkJCQotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotCQkJCWNvbnRlbnRQYWdlLm9ubG9hZCgpOwotCQkJPC9zY3JpcHQ+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvcGVydGllc1NlY3Rpb24iPgotCQk8eHNsOnBhcmFtIG5hbWU9ImNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcm9wZXJ0aWVzVGV4dCIvPjwvZGl2PgotCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRtdWx0aXBsZU9jY3VycmVuY2VzVGV4dCIvPgotCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyddIi8+Ci0JCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNPcHRpb25hbCddIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InByb3BlcnR5Ij4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZExhYmVsIiBzZWxlY3Q9IiRvcHRpb25hbFRleHQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJmaWVsZFRleHQiIHNlbGVjdD0iYXR0cmlidXRlW0BuYW1lPSdpc09wdGlvbmFsJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCQk8eHNsOmlmIHRlc3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvcGVydHkiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImZpZWxkTGFiZWwiIHNlbGVjdD0iJHBsYW5uZWRUZXh0Ii8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9ImF0dHJpYnV0ZVtAbmFtZT0naXNQbGFubmVkJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3hzbDppZj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOnRlbXBsYXRlPgotCi0JPHhzbDp0ZW1wbGF0ZSBuYW1lPSJyZWxhdGlvbnNoaXBzU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ic3ViVGVhbXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nc3ViVGVhbSddL0VsZW1lbnQiLz4JCQotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRlYW1Sb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSd0ZWFtUm9sZXMnXS9FbGVtZW50Ii8+Ci0JCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViVGVhbXMpICsgY291bnQoJHRlYW1Sb2xlcykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkc3ViVGVhbXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzdWJUZWFtc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMyI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHN1YlRlYW1zIj4KLQkJCQkJCQkJCTx4c2w6c29ydCBkYXRhLXR5cGU9InRleHQiIHNlbGVjdD0iQERpc3BsYXlOYW1lIiBvcmRlcj0iYXNjZW5kaW5nIiAvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkdGVhbVJvbGVzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVhbVJvbGVzVGV4dCIvPjwvdGg+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIiBjb2xzcGFuPSIzIj4KLQkJCQkJCQk8dWw+Ci0JCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkdGVhbVJvbGVzIj4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0idXNhZ2VTZWN0aW9uIj4KLQkJPHhzbDpwYXJhbSBuYW1lPSJjb250ZW50RGVzY3JpcHRpb24iLz4KLQkJPHhzbDppZiB0ZXN0PSIkY29udGVudERlc2NyaXB0aW9uL2F0dHJpYnV0ZVtAbmFtZT0ndXNhZ2VHdWlkYW5jZSddICE9ICcnIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHVzYWdlVGV4dCIvPjwvZGl2PgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkNvbnRlbnQiPgotCQkJCTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+Ci0JCQkJCTx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwcm9wZXJ0eSI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRMYWJlbCIgc2VsZWN0PSInVXNhZ2UgR3VpZGFuY2UnIi8+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZmllbGRUZXh0IiBzZWxlY3Q9IiRjb250ZW50RGVzY3JpcHRpb24vYXR0cmlidXRlW0BuYW1lPSd1c2FnZUd1aWRhbmNlJ10iLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9IndoaXRlUGFwZXJzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nV2hpdGVwYXBlciddIi8+Ci0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGNoZWNrbGlzdHMpICsgY291bnQoJGNvbmNlcHRzKSArIGNvdW50KCRndWlkZWxpbmVzKSArIGNvdW50KCRzdXBwb3J0aW5nTWF0ZXJpYWxzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1vcmVJbmZvVGV4dCIvPgotCQkJPC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9sYXlvdXQveHNsL3dvcmtwcm9kdWN0LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3QueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGEwNTJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3QueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi0JPHhzbDppbmNsdWRlIGhyZWY9InJlc291cmNlcy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0iY29tbW9uLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJvdmVydmlldy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0icHVycG9zZS54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0ia2V5X2NvbnNpZGVyYXRpb24ueHNsIi8+Ci0JPHhzbDppbmNsdWRlIGhyZWY9InRhaWxvcmluZy54c2wiLz4KLQk8eHNsOmluY2x1ZGUgaHJlZj0id29ya3Byb2R1Y3RfaGVscGVyLnhzbCIvPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdF9oZWxwZXIueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvbGF5b3V0L3hzbC93b3JrcHJvZHVjdF9oZWxwZXIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjg4ZDIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L2xheW91dC94c2wvd29ya3Byb2R1Y3RfaGVscGVyLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiCi0JeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLQk8eHNsOmluY2x1ZGUgaHJlZj0iZ3VpZGFuY2VfaGVscGVyLnhzbCIvPgotCTx4c2w6aW5jbHVkZSBocmVmPSJkZXNjcmlwdG9yX2hlbHBlci54c2wiLz4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0id29ya1Byb2R1Y3RJbGx1c3RyYXRpb25zU2VjdGlvbiI+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0idGVtcGxhdGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nVGVtcGxhdGUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InJlcG9ydHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdSZXBvcnQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nRXhhbXBsZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmV1c2FibGVBc3NldHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdSZXVzYWJsZUFzc2V0J10iLz4JCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJHRlbXBsYXRlcykgKyBjb3VudCgkcmVwb3J0cykgKyBjb3VudCgkZXhhbXBsZXMpICsgY291bnQoJHJldXNhYmxlQXNzZXRzKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaWxsdXN0cmF0aW9uc1RleHQiLz48L2Rpdj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25Db250ZW50Ij4KLQkJCQk8dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkVGVtcGxhdGVzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0ZW1wbGF0ZXMiIHNlbGVjdD0iJHRlbXBsYXRlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmVwb3J0cyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icmVwb3J0cyIgc2VsZWN0PSIkcmVwb3J0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRXhhbXBsZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImV4YW1wbGVzIiBzZWxlY3Q9IiRleGFtcGxlcyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkUmV1c2FibGVBc3NldHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InJldXNhYmxlQXNzZXRzIiBzZWxlY3Q9IiRyZXVzYWJsZUFzc2V0cyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCTwvdGFibGU+Ci0JCQk8L2Rpdj4KLQkJPC94c2w6aWY+Ci0JPC94c2w6dGVtcGxhdGU+Ci0KLQk8eHNsOnRlbXBsYXRlIG5hbWU9InJlbGF0aW9uc2hpcHNTZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmdWxmaWxsaW5nV29ya1Byb2R1Y3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J0Z1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzJ10vRWxlbWVudCI+PC94c2w6dmFyaWFibGU+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0iZnVsZmlsbGVkU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nZnVsZmlsbHMnXS9FbGVtZW50Ij48L3hzbDp2YXJpYWJsZT4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgc2VsZWN0PSJyZWZlcmVuY2VbQG5hbWU9J2NvbnRhaW5lckFydGlmYWN0J10vRWxlbWVudCIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdjb250YWluZWRBcnRpZmFjdHMnXS9FbGVtZW50W0BUeXBlPSdBcnRpZmFjdCddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0icmVzcG9uc2libGVSb2xlcyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdyZXNwb25zaWJsZVJvbGVzJ10vRWxlbWVudFtAVHlwZT0nUm9sZSddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibW9kaWZ5Um9sZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbW9kaWZ5Um9sZXMnXS9FbGVtZW50Ii8+CQkKLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nbWFuZGF0b3J5SW5wdXRUb1Rhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3B0aW9uYWxJbnB1dFRvVGFza3MnXS9FbGVtZW50W0BUeXBlPSdUYXNrJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJvdXRwdXRGcm9tVGFza3MiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ibWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzJ10vRWxlbWVudFtAVHlwZT0nVGFzayddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0ib3B0aW9uYWxJbnB1dFRvVGFza3NfZnJvbVNsb3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3RbQG5hbWU9J29wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Im91dHB1dEZyb21UYXNrc19mcm9tU2xvdHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nb3V0cHV0RnJvbVRhc2tzX2Zyb21TbG90cyddL0VsZW1lbnRbQFR5cGU9J1Rhc2snXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImNhdGVnb3JpZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdFtAbmFtZT0nQ29udGVudEVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcyddL0VsZW1lbnQiLz4KLQkJCi0JCTx4c2w6aWYgdGVzdD0iY291bnQoJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHMpICsgY291bnQoJGZ1bGZpbGxlZFNsb3RzKSArIGNvdW50KCRjYXRlZ29yaWVzKSArIGNvdW50KCRyZXNwb25zaWJsZVJvbGVzKSArIGNvdW50KCRjb250YWluZXJBcnRpZmFjdCkgKyBjb3VudCgkY29udGFpbmVkQXJ0aWZhY3RzKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza3MpICsgY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgKyBjb3VudCgkb3V0cHV0RnJvbVRhc2tzX2Zyb21TbG90cykgPiAwIj4KLQkJCTxkaXYgY2xhc3M9InNlY3Rpb25IZWFkaW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlbGF0aW9uc2hpcHNUZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQotCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRmdWxmaWxsaW5nV29ya1Byb2R1Y3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGluZ1dvcmtQcm9kdWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZ1bGZpbGxpbmdXb3JrUHJvZHVjdHMiPgotCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgotCQkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPC9hPgotCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJPC91bD4KLQkJCQkJCQk8L3RkPgotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+CQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGZ1bGZpbGxlZFNsb3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZnVsZmlsbGVkU2xvdHNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdWxmaWxsZWRTbG90cyI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQotCQkJCQkKLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2F0ZWdvcmllcykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNhdGVnb3JpZXNUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjYXRlZ29yaWVzIj4KLQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJPGE+Ci0JCQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCTwvYT4KLQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJCTwvdWw+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgkJCQkKLQkJCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRhaW5lckFydGlmYWN0KSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkY29udGFpbmVyQXJ0aWZhY3RUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIGNvbHNwYW49IjIiPgotCQkJCQkJCTx1bD4KLQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb250YWluZXJBcnRpZmFjdCI+Ci0JCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCTxhPgotCQkJCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4JCQkJCi0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJGNvbnRhaW5lZEFydGlmYWN0cykgPiAwIj4KLQkJCQkJCTx0ciB2YWxpZ249InRvcCI+Ci0JCQkJCQkJPHRoIGNsYXNzPSJzZWN0aW9uVGFibGVIZWFkaW5nIiBzY29wZT0icm93Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbnRhaW5lZEFydGlmYWN0c1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgY29sc3Bhbj0iMiI+Ci0JCQkJCQkJPHVsPgotCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGNvbnRhaW5lZEFydGlmYWN0cyI+Ci0JCQkJCQkJCQk8eHNsOnNvcnQgZGF0YS10eXBlPSJ0ZXh0IiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIgb3JkZXI9ImFzY2VuZGluZyIgLz4KLQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQk8YT4KLQkJCQkJCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPgkJCQkJCQkJCQkJCi0JCQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQk8L2E+Ci0JCQkJCQkJCQk8L2xpPgotCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQk8L3VsPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQk8L3RyPgotCQkJCQk8L3hzbDppZj4KLQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkcmVzcG9uc2libGVSb2xlcykgKyBjb3VudCgkbW9kaWZ5Um9sZXMpID4gMCI+Ci0JCQkJCQk8dHIgdmFsaWduPSJ0b3AiPgotCQkJCQkJCTx0aCBjbGFzcz0ic2VjdGlvblRhYmxlSGVhZGluZyIgc2NvcGU9InJvdyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyb2xlc1RleHQiLz48L3RoPgotCQkJCQkJCTx0ZCBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbCIgd2lkdGg9IjQyJSI+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsSGVhZGluZyI+Ci0JCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJlc3BvbnNpYmxlVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRyZXNwb25zaWJsZVJvbGVzKSA+IDAiPgotCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJHJlc3BvbnNpYmxlUm9sZXMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYWRkRWxlbWVudFdpdGhMaW5rIj4KLQkJCQkJCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJlbGVtZW50IiBzZWxlY3Q9Ii4iLz4KLQkJCQkJCQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+Ci0JCQkJCQkJPHRkIGNsYXNzPSJzZWN0aW9uVGFibGVDZWxsIj4KLQkJCQkJCQkJPHNwYW4gY2xhc3M9InNlY3Rpb25UYWJsZUNlbGxIZWFkaW5nIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9kaWZpZWRCeVRleHQiLz46Ci0JCQkJCQkJCTwvc3Bhbj4KLQkJCQkJCQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkbW9kaWZ5Um9sZXMpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCTx1bD4KLQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbW9kaWZ5Um9sZXMiPgotCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCTwvdGQ+CQkJCQkJCQotCQkJCQkJPC90cj4KLQkJCQkJPC94c2w6aWY+Ci0JCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrcykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3MpICsgY291bnQoJG91dHB1dEZyb21UYXNrcykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSArIGNvdW50KCRvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzKSA+IDAiPgotCQkJCQkJPHRyIHZhbGlnbj0idG9wIj4KLQkJCQkJCQk8dGggY2xhc3M9InNlY3Rpb25UYWJsZUhlYWRpbmciIHNjb3BlPSJyb3ciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGFza3NUZXh0Ii8+PC90aD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiIHdpZHRoPSI0MiUiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnB1dFRvVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpICsgY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSArIGNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMpID4gMCI+Ci0JCQkJCQkJCSAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+Ci0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRtYW5kYXRvcnlJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzKSA+IDAiPgotCQkJCQkJCQkJICA8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3MpID4gMCI+PGJyLz48L3hzbDppZj4KLQkJCQkJCQkJCTx1bD4JCQotCQkJCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkb3B0aW9uYWxJbnB1dFRvVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4JCQkJCQkJCQkJCi0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzKSA+IDAiPgotCQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG1hbmRhdG9yeUlucHV0VG9UYXNrcykgKyBjb3VudCgkb3B0aW9uYWxJbnB1dFRvVGFza3MpID4gMCI+PGJyLz48L3hzbDppZj4KLQkJCQkJCQkJCTx1bD4KLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG1hbmRhdG9yeUlucHV0VG9UYXNrc19mcm9tU2xvdHMiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cykgPiAwIj4KLQkJCQkJCQkJCSAgPHhzbDppZiB0ZXN0PSJjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzKSArIGNvdW50KCRvcHRpb25hbElucHV0VG9UYXNrcykgKyBjb3VudCgkbWFuZGF0b3J5SW5wdXRUb1Rhc2tzX2Zyb21TbG90cyk+IDAiPjxici8+PC94c2w6aWY+Ci0JCQkJCQkJCQk8dWw+CQkKLQkJCQkJCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG9wdGlvbmFsSW5wdXRUb1Rhc2tzX2Zyb21TbG90cyI+Ci0JCQkJCQkJCQkJPHhzbDpzb3J0IHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+Ci0JCQkJCQkJCQkJCTxsaT4KLQkJCQkJCQkJCQkJCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIvRWxlbWVudC9AQmFja1BhdGgiLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQFVybCIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQERpc3BsYXlOYW1lIi8+PC9hPgotCQkJCQkJCQkJCQk8L2xpPgotCQkJCQkJCQkJCTwveHNsOmZvci1lYWNoPgkJCQkJCQkJCQkKLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQkJPC94c2w6aWY+Ci0JCQkJCQkJPC90ZD4KLQkJCQkJCQk8dGQgY2xhc3M9InNlY3Rpb25UYWJsZUNlbGwiPgotCQkJCQkJCQk8c3BhbiBjbGFzcz0ic2VjdGlvblRhYmxlQ2VsbEhlYWRpbmciPgotCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvdXRwdXRGcm9tVGV4dCIvPjoKLQkJCQkJCQkJPC9zcGFuPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tVGFza3MpID4gMCI+CQkJCQkJCQkJCi0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvdXRwdXRGcm9tVGFza3MiPgotCQkJCQkJCQkJCTx4c2w6c29ydCBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPgotCQkJCQkJCQkJCQk8bGk+Ci0JCQkJCQkJCQkJCQk8YT48eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iL0VsZW1lbnQvQEJhY2tQYXRoIi8+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBVcmwiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBEaXNwbGF5TmFtZSIvPjwvYT4KLQkJCQkJCQkJCQkJPC9saT4KLQkJCQkJCQkJCQk8L3hzbDpmb3ItZWFjaD4KLQkJCQkJCQkJCTwvdWw+Ci0JCQkJCQkJCTwveHNsOmlmPgotCQkJCQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KCRvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzKSA+IDAiPgkKLQkJCQkJCQkJCTx4c2w6aWYgdGVzdD0iY291bnQoJG91dHB1dEZyb21UYXNrcykgPiAwIj48YnIvPjwveHNsOmlmPgkJCQkJCQkJCi0JCQkJCQkJCQk8dWw+Ci0JCQkJCQkJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzIj4KLQkJCQkJCQkJCQk8eHNsOnNvcnQgc2VsZWN0PSJARGlzcGxheU5hbWUiLz4KLQkJCQkJCQkJCQkJPGxpPgotCQkJCQkJCQkJCQkJPGE+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii9FbGVtZW50L0BCYWNrUGF0aCIvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAVXJsIi8+PC94c2w6YXR0cmlidXRlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJARGlzcGxheU5hbWUiLz48L2E+Ci0JCQkJCQkJCQkJCTwvbGk+Ci0JCQkJCQkJCQkJPC94c2w6Zm9yLWVhY2g+Ci0JCQkJCQkJCQk8L3VsPgotCQkJCQkJCQk8L3hzbDppZj4KLQkJCQkJCQk8L3RkPgkJCQkJCQkKLQkJCQkJCTwvdHI+Ci0JCQkJCTwveHNsOmlmPgotCQkJCQkKLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZERlc2NyaXB0b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJkZXNjcmlwdG9ycyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0W0BuYW1lPSdkZXNjcmlwdG9ycyddL0VsZW1lbnQiLz4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb2xzcGFuIiBzZWxlY3Q9IicyJyIvPgotCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCi0JCQkJPC90YWJsZT4KLQkJCTwvZGl2PgotCQk8L3hzbDppZj4KLQk8L3hzbDp0ZW1wbGF0ZT4KLQotCTx4c2w6dGVtcGxhdGUgbmFtZT0ibW9yZUluZm9TZWN0aW9uIj4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjaGVja2xpc3RzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nQ2hlY2tsaXN0J10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSJyZWZlcmVuY2VMaXN0L0VsZW1lbnRbQFR5cGU9J0NvbmNlcHQnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdHdWlkZWxpbmUnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdTdXBwb3J0aW5nTWF0ZXJpYWwnXSIvPgotCQk8eHNsOnZhcmlhYmxlIG5hbWU9InRvb2xNZW50b3JzIiBzZWxlY3Q9InJlZmVyZW5jZUxpc3QvRWxlbWVudFtAVHlwZT0nVG9vbE1lbnRvciddIi8+Ci0JCTx4c2w6dmFyaWFibGUgbmFtZT0id2hpdGVQYXBlcnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdXaGl0ZXBhcGVyJ10iLz4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHNlbGVjdD0icmVmZXJlbmNlTGlzdC9FbGVtZW50W0BUeXBlPSdFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMnXSIvPgotCQkKLQkJPHhzbDppZiB0ZXN0PSJjb3VudCgkY2hlY2tsaXN0cykgKyBjb3VudCgkY29uY2VwdHMpICsgY291bnQoJGd1aWRlbGluZXMpICsgY291bnQoJHN1cHBvcnRpbmdNYXRlcmlhbHMpICsgY291bnQoJHRvb2xNZW50b3JzKSArIGNvdW50KCR3aGl0ZVBhcGVycykgKyBjb3VudCgkZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSA+IDAiPgotCQkJPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbW9yZUluZm9UZXh0Ii8+PC9kaXY+Ci0JCQk8ZGl2IGNsYXNzPSJzZWN0aW9uQ29udGVudCI+Ci0JCQkJPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENoZWNrbGlzdHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNoZWNrbGlzdHMiIHNlbGVjdD0iJGNoZWNrbGlzdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZENvbmNlcHRzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb25jZXB0cyIgc2VsZWN0PSIkY29uY2VwdHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEd1aWRlbGluZXMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Imd1aWRlbGluZXMiIHNlbGVjdD0iJGd1aWRlbGluZXMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFN1cHBvcnRpbmdNYXRlcmlhbHMiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHNlbGVjdD0iJHN1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFRvb2xNZW50b3JzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0b29sTWVudG9ycyIgc2VsZWN0PSIkdG9vbE1lbnRvcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZFdoaXRlUGFwZXJzIj4KLQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3aGl0ZVBhcGVycyIgc2VsZWN0PSIkd2hpdGVQYXBlcnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQkJPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBzZWxlY3Q9IiRlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLQkJCQkJPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLQkJCQk8L3RhYmxlPgotCQkJPC9kaXY+Ci0JCTwveHNsOmlmPgotCTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiYjA1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgTGlicmFyeQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgdG8gYW5hYmxlIHRoZSBleHRlZC1yZXBsYWNlIGZlYXR1cmUKLSNFbmFibGVFeHRlbmRSZXBsYWNlPXRydWUKLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxZmNiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5uYXR1cmVzIgotICAgICAgICAgaWQ9InByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUiCi0gICAgICAgICBuYW1lPSJNZXRob2QgTGlicmFyeSBQcm9qZWN0IE5hdHVyZSI+Ci0gICAgICA8cnVudGltZT4KLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUiPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L3J1bnRpbWU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9ImxpYnJhcnlNYW5hZ2VycyIKLSAgICAgICAgIG5hbWU9Ik1ldGhvZCBMaWJyYXJ5IE1hbmFnZXJzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvTGlicmFyeU1hbmFnZXJzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImVsZW1lbnRMYXlvdXRFeHRlbnNpb25zIiBuYW1lPSJFbGVtZW50IGxheW91dCBFeHRlbnNpb25zIiBzY2hlbWE9InNjaGVtYS9lbGVtZW50TGF5b3V0RXh0ZW5zaW9ucy5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbGVtZW50UmVhbGl6ZXJGYWN0b3J5IiBuYW1lPSJFbGVtZW50UmVhbGl6ZXIgRmFjdG9yeSIgc2NoZW1hPSJzY2hlbWEvZWxlbWVudFJlYWxpemVyRmFjdG9yeS5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjb25maWdIZWxwZXJEZWxlZ2F0ZUV4dCIgbmFtZT0iQ29uZmlnSGVscGVyRGVsZWdhdGVFeHQiIHNjaGVtYT0ic2NoZW1hL2NvbmZpZ0hlbHBlckRlbGVnYXRlRXh0LmV4c2QiLz4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnRleHRSZWZlcmVuY2VSZXBsYWNlciI+Ci0gICAgICA8dGV4dFJlZmVyZW5jZVJlcGxhY2VyIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwiLz4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotICAgCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9MaWJyYXJ5TWFuYWdlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NjaGVtYS9MaWJyYXJ5TWFuYWdlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzMGZhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvTGlicmFyeU1hbmFnZXJzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IiBpZD0ibGlicmFyeU1hbmFnZXJzIiBuYW1lPSJNZXRob2QgTGlicmFyeSBNYW5hZ2VyIENvbnRyaWJ1dG9ycyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byByZWdpc3RlciBhIHNwZWNpZmljIExpYnJhcnkgTWFuYWdlciBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBMaWJyYXJ5IFNlcnZpY2UuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlNYW5hZ2VyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGlicmFyeU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBMaWJyYXJ5IE1hbmFnZXIuIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHB1YmxpYyBpbXBsZW1lbnRhdGlvbiBvZiAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXImbHQ7L2NvZGUmZ3Q7IHdpdGggYSBwdWJsaWMgMC1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBpZGVudGlmaWVyIG9mIGEgc3BlY2lmaWMgbWV0aG9kIGxpYnJhcnkgdHlwZSAoZGF0YWJhc2UsIHhtaSwgZXRjLikuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZU5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgZGlzcGxheSBuYW1lIGZvciB0aGUgbGlicmFyeSB0eXBlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBsaWJyYXJ5IG1hbmFnZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYSBMaWJyYXJ5IE1hbmFnZXIgZXh0ZW5zaW9uIHBvaW50OiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2xpYnJhcnlNYW5hZ2VyCi0gICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeU1hbmFnZXImcXVvdDsKLSAgICAgICAgIHR5cGU9JnF1b3Q7eG1pJnF1b3Q7Ci0gICAgICAgICB0eXBlTmFtZT0mcXVvdDtYTUkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L2xpYnJhcnlNYW5hZ2VyJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OyAKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2NvbmZpZ0hlbHBlckRlbGVnYXRlRXh0LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvY29uZmlnSGVscGVyRGVsZWdhdGVFeHQuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzOTgwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvY29uZmlnSGVscGVyRGVsZWdhdGVFeHQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiIGlkPSJjb25maWdIZWxwZXJEZWxlZ2F0ZUV4dCIgbmFtZT0iQ29uZmlnSGVscGVyRGVsZWdhdGVFeHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXh0ZW50aW9uIHBvaW50IGZvciBwcm92aWRpbmcgZXh0ZW5kZWQgaW1wbGVtZW50YXRpb24gZm9yIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0hlbHBlckRlbGVnYXRlCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbmZpZ0hlbHBlckRlbGVnYXRlRXh0Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuNQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnSGVscGVyRGVsZWdhdGUKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRMYXlvdXRFeHRlbnNpb25zLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudExheW91dEV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxZjg1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudExheW91dEV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiIGlkPSJlbGVtZW50TGF5b3V0RXh0ZW5zaW9ucyIgbmFtZT0iRWxlbWVudCBsYXlvdXQgRXh0ZW5zaW9ucyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBhbGxvdyBtb2RpZnkgdGhlIGVsZW1lbnQgbGF5b3V0IGJlaGF2aW9yIGJ5IHByb3ZpZGluZyBsYXlvdXQgZXh0ZW5zaW9ucy4gCi0KLVRoZSBsYXlvdXQgZXh0ZW5zaW9uIGlzIENvbmZpZ3VyYXRpb24gc3BlY2lmaWMgYnkgc3BlY2lmeWluZyBhIGFuIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBrZXkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCBtYXRjaGVzIHdpdGggdGhlIGlkIGF0dHJpYnV0ZSBvZiBlYWNoIExheW91dEV4dGVuc2lvbi4KLQotaS5lLiwgaWYgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGEgTWV0aG9kRWxlbWVudFByb3BlcnR5IGtleSB0aGF0IG1hdGNoZXMgd2l0aCBhbiBMYXlvdXRFeHRlbnNpb24sIHRoYXQgZXh0ZW5zaW9uIHdpbGwgYmUgdXNlZC4KLQotSXQgaXMgdGhlIHVzZXImYXBvcztzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGUga2V5IGlzIHVuaXF1ZS4KLQotdGhlIGV4dGVuc2lvbiBjbGFzcyBzaG91bGQgZXh0ZW5kcyB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEV4dGVuc2lvbiBjbGFzcwotCi0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iTGF5b3V0RXh0ZW5zaW9uIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IkxheW91dEV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudFJlYWxpemVyRmFjdG9yeS5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc2NoZW1hL2VsZW1lbnRSZWFsaXplckZhY3RvcnkuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3MmMzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zY2hlbWEvZWxlbWVudFJlYWxpemVyRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeSIgaWQ9ImVsZW1lbnRSZWFsaXplckZhY3RvcnkiIG5hbWU9IkVsZW1lbnRSZWFsaXplciBGYWN0b3J5Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5JRWxlbWVudFJlYWxpemVyRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgQVBJIGluZm9ybWF0aW9uIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0Fic3RyYWN0TGlicmFyeU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9BYnN0cmFjdExpYnJhcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTcyNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0Fic3RyYWN0TGlicmFyeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkJhc2ljQ29tbWFuZFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5kb21haW4uQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5SZWZsZWN0aXZlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIucmVzb3VyY2UuUmVzb3VyY2VJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ucHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuRGVidWdUcmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlNb2RpZmljYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnJlZnJlc2guSVJlZnJlc2hFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UucmVmcmVzaC5JUmVmcmVzaExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5yZWZyZXNoLlJlZnJlc2hKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuTGlicmFyeVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS51dGlsLlBlcnNpc3RlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBMaWJyYXJ5IE1hbmFnZXIuIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mCi0gKiBJTGlicmFyeU1hbmFnZXIgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlicmFyeU1hbmFnZXIgaW1wbGVtZW50cyBJTGlicmFyeU1hbmFnZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPUF9ESVJUWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbGlicmFyeSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19MSUJSQVJZX05BTUUgPSAibGlicmFyeS5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX0xJQlJBUllfUkVHSVNURVJfVFlQRSA9ICJsaWJyYXJ5UmVnaXN0ZXJUeXBlIjsgCS8vJE5PTi1OTFMtMSQKLQkKLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIFRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsJCi0KLQkvLyBUaGUgZGVmYXVsdCBlZGl0aW5nIGRvbWFpbiBmb3IgdGhlIG1hbmFnZWQgbGlicmFyeS4KLQlwcm90ZWN0ZWQgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW47Ci0KLQkvLyBBIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgbW9uaXRvciBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJpdmF0ZSBMaXN0IGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVtb3ZlIHRoaXMgb25lIHNpbmNlIHRoaXMgbWF5IGNhdXNlIHBvdGVudGlhbCBtZW1vcnkgbGVhawotCS8vIEEgbGlzdCBvZiBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgbWFuYWdlZCBsaWJyYXJ5LgotCS8vcHJpdmF0ZSBMaXN0IGRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBBIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0KLQkvLyBUaGUgc2F2ZSBsaWJyYXJ5IG9wdGlvbnMuCi0JcHJpdmF0ZSBNYXAgc2F2ZU9wdGlvbnM7Ci0KLQkvLyBJZiB0cnVlLCBza2lwIGFsbCBldmVudCBwcm9jZXNzaW5nLgotCXByb3RlY3RlZCBib29sZWFuIHNraXBFdmVudFByb2Nlc3NpbmcgPSBmYWxzZTsKLQotCS8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgd2F5IHRvIG5vdGlmeSB0aGUgY2hhbmdlIGluIGxpYnJhcnkgaW5zdGVhZCBvZgotCS8vIHJlbHlpbmcgb24gdGhlIGNvbW1hbmQgc3RhY2sgbGlzdGVuZXIKLQlwcml2YXRlIENvbW1hbmRTdGFja0xpc3RlbmVyIGNvbW1hbmRTdGFja0xpc3RlbmVyID0gbmV3IENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKGZpbmFsIEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJjb21tYW5kU3RhY2tDaGFuZ2VkIiwgImV2ZW50PSIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKCFza2lwRXZlbnRQcm9jZXNzaW5nKSB7Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJLy8gVHJ5IHRvIHNlbGVjdCB0aGUgYWZmZWN0ZWQgb2JqZWN0cy4KLQkJCQkJCUNvbW1hbmQgbW9zdFJlY2VudENvbW1hbmQgPSBMaWJyYXJ5VXRpbAotCQkJCQkJCQkudW53cmFwKCgoQ29tbWFuZFN0YWNrKSBldmVudC5nZXRTb3VyY2UoKSkKLQkJCQkJCQkJCQkuZ2V0TW9zdFJlY2VudENvbW1hbmQoKSk7Ci0JCQkJCQlpZiAobW9zdFJlY2VudENvbW1hbmQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChtb3N0UmVjZW50Q29tbWFuZCBpbnN0YW5jZW9mIEFkZENvbW1hbmQpIHsKLQkJCQkJCQkJQWRkQ29tbWFuZCBjbWQgPSAoQWRkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQ7Ci0JCQkJCQkJCUVPYmplY3Qgb3duZXIgPSBjbWQuZ2V0T3duZXIoKTsKLQotCQkJCQkJCQkvLyBuZWVkIHRvIHNlbmQgb3duZXIgY2hhbmdlZCBub3RpZmljYXRpb24gZm9yCi0JCQkJCQkJCS8vIGFsbCBlbGVtZW50IHR5cGVzCi0JCQkJCQkJCS8vIAotCQkJCQkJCQkvLyAxNTYwMjggLSBSZWZlcmVuY2UgZnJvbSBXUCBhbmQgR3VpZGVuY2Ugd2FzCi0JCQkJCQkJCS8vIG5vdCBkZXRlY3RlZAotCQkJCQkJCQkvLyB3aGVuIGRlc2VsZWN0IHRoZSByZWxhdGVkIGVsZW1lbnQgZnJvbQotCQkJCQkJCQkvLyBjb25maWd1cmF0aW9uCi0KLQkJCQkJCQkJQ29sbGVjdGlvbiBvYmpzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJCQlvYmpzLmFkZChvd25lcik7Ci0JCQkJCQkJCW5vdGlmeUxpc3RlbmVycygKLQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VELAotCQkJCQkJCQkJCW9ianMpOwotCi0JCQkJCQkJCWlmICghKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQotCQkJCQkJCQkJb2JqcyA9IG1vc3RSZWNlbnRDb21tYW5kLmdldFJlc3VsdCgpOwotCi0JCQkJCQkJCQkvLyBVcGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gc2VsZWN0aW9uIGlmIHRoZQotCQkJCQkJCQkJLy8gb2JqZWN0IGlzIGEgbmV3bHkgYWRkZWQgbWV0aG9kIHBhY2thZ2UuCi0JCQkJCQkJCQlpZiAob3duZXIgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQkJb2JqcyA9IExpYnJhcnlVdGlsCi0JCQkJCQkJCQkJCQkuZ2V0Q29udGFpbmVkRWxlbWVudHMob3duZXIsCi0JCQkJCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQkJCWlmICghb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQkJYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24ob2Jqcyk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCQlJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ORVdDSElMRCwKLQkJCQkJCQkJCQkJb2Jqcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kIGluc3RhbmNlb2YgUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgewotCQkJCQkJCQlDb2xsZWN0aW9uIG9ianMgPSBtb3N0UmVjZW50Q29tbWFuZC5nZXRSZXN1bHQoKTsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW9ianMpOwotCQkJCQkJCQlQYXN0ZUZyb21DbGlwYm9hcmRDb21tYW5kIGNtZCA9ICgoUGFzdGVGcm9tQ2xpcGJvYXJkQ29tbWFuZCkgbW9zdFJlY2VudENvbW1hbmQpOwotCi0JCQkJCQkJCS8vIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBzZWxlY3Rpb24gaWYgdGhlCi0JCQkJCQkJCS8vIG9iamVjdCBpcyBhIG5ld2x5IGFkZGVkIG1ldGhvZCBwYWNrYWdlLgotCQkJCQkJCQlpZiAoY21kLmdldE93bmVyKCkgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCQkJCQlvYmpzID0gTGlicmFyeVV0aWwuZ2V0Q29udGFpbmVkRWxlbWVudHMoY21kCi0JCQkJCQkJCQkJCS5nZXRPd25lcigpLCBvYmpzKTsKLQkJCQkJCQkJCWlmICghb2Jqcy5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCQlhZGROZXdQYWNrYWdlc1RvQ29uZmlndXJhdGlvbihvYmpzKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSBpZiAobW9zdFJlY2VudENvbW1hbmQgaW5zdGFuY2VvZiBDcmVhdGVDaGlsZENvbW1hbmQpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQkJCW1vc3RSZWNlbnRDb21tYW5kLmdldEFmZmVjdGVkT2JqZWN0cygpKTsKLQkJCQkJCQl9IGVsc2UgaWYgKG1vc3RSZWNlbnRDb21tYW5kICE9IG51bGwpIHsKLQkJCQkJCQkJbm90aWZ5TGlzdGVuZXJzKAotCQkJCQkJCQkJCUlMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCQkJbW9zdFJlY2VudENvbW1hbmQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfTsKLQotCS8vIExpc3RlbiB0byBjaGFuZ2VzIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCXByaXZhdGUgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lciBub3RpZnlDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCQkibm90aWZ5Q2hhbmdlZCIsICJub3RpZmljYXRpb249IiArIG5vdGlmaWNhdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKCFza2lwRXZlbnRQcm9jZXNzaW5nKSB7Ci0JCQkJaW50IGV2ZW50VHlwZSA9IG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKTsKLQkJCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDogewotCQkJCQkvLyBBIG1ldGhvZCBlbGVtZW50LCB0eXBpY2FsbHkgYSBtZXRob2QgcGx1Zy1pbiwgaGFzIGJlZW4KLQkJCQkJLy8gYWRkZWQgdG8gdGhlIG1hbmFnZWQgbGlicmFyeSB3aXRob3V0IHVzaW5nIGFuIGVkaXRpbmcKLQkJCQkJLy8gY29tbWFuZC4KLQkJCQkJT2JqZWN0IG5vdGlmaWVyID0gbm90aWZpY2F0aW9uLmdldE5vdGlmaWVyKCk7Ci0JCQkJCU9iamVjdCB2YWx1ZSA9IG5vdGlmaWNhdGlvbi5nZXROZXdWYWx1ZSgpOwotCQkJCQlpZiAoKG5vdGlmaWVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkKLQkJCQkJCQkmJiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pKSB7Ci0JCQkJCQlDb2xsZWN0aW9uIGFmZmVjdGVkT2JqZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQodmFsdWUpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX05FV0NISUxELAotCQkJCQkJCQlhZmZlY3RlZE9iamVjdHMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDogewotCQkJCQlPYmplY3Qgbm90aWZpZXIgPSBub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKTsKLQkJCQkJaWYgKG5vdGlmaWVyICE9IG51bGwpIHsKLQkJCQkJCUNvbGxlY3Rpb24gYWZmZWN0ZWRPYmplY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChub3RpZmllcik7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIE5vdGlmaWNhdGlvbi5SRU1PVkU6IHsKLQkJCQkJLy8gRWl0aGVyIGEgbWV0aG9kIGVsZW1lbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZQotCQkJCQkvLyBjb250YWluaW5nIGVsZW1lbnQsIG9yIGEgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlIGhhcwotCQkJCQkvLyBiZWVuIGRlbGV0ZWQuCi0JCQkJCU9iamVjdCBub3RpZmllciA9IG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpOwotCQkJCQlPYmplY3Qgb2xkVmFsdWUgPSBub3RpZmljYXRpb24uZ2V0T2xkVmFsdWUoKTsKLQkJCQkJQ29sbGVjdGlvbiBhZmZlY3RlZE9iamVjdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCWlmIChvbGRWYWx1ZSBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkJCQkmJiAoKEVPYmplY3QpIG9sZFZhbHVlKS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJLy8gQSBtZXRob2QgZWxlbWVudCBoYXMgYmVlbiBkZWxldGVkLgotCQkJCQkJYWZmZWN0ZWRPYmplY3RzLmFkZChvbGRWYWx1ZSk7Ci0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fREVMRVRFRCwKLQkJCQkJCQkJYWZmZWN0ZWRPYmplY3RzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIEEgbWV0aG9kIGVsZW1lbnQgcmVmZXJlbmNlIGhhcyBiZWVuIGRlbGV0ZWQsIG5vdGlmeQotCQkJCQkJLy8gdGhlIGxpc3RlbmVycyB0aGF0IHRoZSBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50IGhhcwotCQkJCQkJLy8gY2hhbmdlZC4KLQkJCQkJCWFmZmVjdGVkT2JqZWN0cy5hZGQobm90aWZpZXIpOwotCQkJCQkJbm90aWZ5TGlzdGVuZXJzKElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NIQU5HRUQsCi0JCQkJCQkJCWFmZmVjdGVkT2JqZWN0cyk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6IHsKLQkJCQkJLy8gVHdvIG9yIG1vcmUgbWV0aG9kIGVsZW1lbnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20KLQkJCQkJLy8gdGhlIGNvbnRhaW5pbmcgZWxlbWVudCwgb3IgdHcgb3IgbW9yZSBtZXRob2QgZWxlbWVudAotCQkJCQkvLyByZWZlcmVuY2UgaGF2ZSBiZWVuIGRlbGV0ZWQuCi0JCQkJCUxpc3Qgb2xkVmFsdWUgPSBuZXcgQXJyYXlMaXN0KChDb2xsZWN0aW9uKSBub3RpZmljYXRpb24KLQkJCQkJCQkuZ2V0T2xkVmFsdWUoKSk7Ci0JCQkJCUFycmF5TGlzdCBkZWxldGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUFycmF5TGlzdCByZW1vdmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaWYgKCFvbGRWYWx1ZS5pc0VtcHR5KCkpIHsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZFZhbHVlLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCQkJCQlpZiAoKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkJCQkJZGVsZXRlZEVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCXJlbW92ZWRSZWZlcmVuY2VzLmFkZChlbGVtZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWRlbGV0ZWRFbGVtZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJCS8vIFR3byBvciBtb3JlIG1ldGhvZCBlbGVtZW50cyBoYXZlIGJlZW4gZGVsZXRlZC4KLQkJCQkJCW5vdGlmeUxpc3RlbmVycyhJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9ERUxFVEVELAotCQkJCQkJCQlkZWxldGVkRWxlbWVudHMpOwotCQkJCQl9Ci0JCQkJCWlmICghcmVtb3ZlZFJlZmVyZW5jZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQkvLyBUd28gb3IgbW9yZSBtZXRob2QgZWxlbWVudCByZWZlcmVuY2UgaGFzIGJlZW4KLQkJCQkJCS8vIGRlbGV0ZWQuCi0JCQkJCQlub3RpZnlMaXN0ZW5lcnMoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ0hBTkdFRCwKLQkJCQkJCQkJcmVtb3ZlZFJlZmVyZW5jZXMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLy8gTGlzdGVuIHRvIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgcmVzb3VyY2UgY2hhbmdlcy4KLQlwcml2YXRlIEFkYXB0ZXIgcmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5Q2hhbmdlZCIsICJtc2c9IiArIG1zZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQobnVsbCkgPT0gUmVzb3VyY2UuUkVTT1VSQ0VfX0lTX01PRElGSUVECi0JCQkJCSYmIG1zZy5nZXRFdmVudFR5cGUoKSA9PSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24uU0VUKSB7Ci0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKG1zZy5nZXROb3RpZmllcigpLCBQUk9QX0RJUlRZKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBMaXN0ZW4gdG8gcGVyc2lzdGVuY2UgcmVmcmVzaCBldmVudHMuCi0JcHJpdmF0ZSBJUmVmcmVzaExpc3RlbmVyIHJlZnJlc2hMaXN0ZW5lciA9IG5ldyBJUmVmcmVzaExpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBub3RpZnlSZWZyZXNoZWQoSVJlZnJlc2hFdmVudCBldmVudCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAibm90aWZ5UmVmcmVzaGVkIiwgImV2ZW50PSIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaGFuZGxlUmVmcmVzaEV2ZW50KGV2ZW50KTsKLQkJfQotCX07Ci0KLQkvLyBMaXN0ZW4gdG8gcHJlZmVyZW5jZSBzdG9yZSBjaGFuZ2VzLgotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIHByZWZlcmVuY2VTdG9yZUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigpIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoSVByb3BlcnR5Q2hhbmdlRXZlbnRXcmFwcGVyIGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoCi0JCQkJCUxpYnJhcnlQcmVmZXJlbmNlcy5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUykpIHsKLQkJCQlzYXZlT3B0aW9ucy5wdXQoCi0JCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywKLQkJCQkJCWV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFic3RyYWN0TGlicmFyeU1hbmFnZXIoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaW5pdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKQotCQkJCS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VTdG9yZUNoYW5nZUxpc3RlbmVyKTsKLQotCQkvLyBDcmVhdGUgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkJTGlzdCBmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlc291cmNlSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkoKSk7Ci0JCWZhY3Rvcmllcy5hZGQobmV3IFJlZmxlY3RpdmVJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpKTsKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IG5ldyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KAotCQkJCWZhY3Rvcmllcyk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBjb21tYW5kIHN0YWNrLgotCQlCYXNpY0NvbW1hbmRTdGFjayBjb21tYW5kU3RhY2sgPSBuZXcgQmFzaWNDb21tYW5kU3RhY2soKTsKLQotCQkvLyBDcmVhdGUgdGhlIHJlc291cmNlIHNldC4KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGNyZWF0ZVJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LmFkZFJlZnJlc2hMaXN0ZW5lcihyZWZyZXNoTGlzdGVuZXIpOwotCQlSZWZyZXNoSm9iLmdldEluc3RhbmNlKCkuc2V0UmVzb3VyY2VTZXQocmVzb3VyY2VTZXQpOwotCi0JCS8vIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgc2F2ZSBvcHRpb25zLgotCQlzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMsCi0JCQkJTGlicmFyeVByZWZlcmVuY2VzLmdldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcygpKTsKLQotCQkvLyBDcmVhdGUgdGhlIGVkaXRpbmcgZG9tYWluLgotCQllZGl0aW5nRG9tYWluID0gbmV3IEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihhZGFwdGVyRmFjdG9yeSwKLQkJCQljb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQotCQkvLyBSZWdpc3RlciB0aGUgZWRpdGluZyBkb21haW4uCi0JCXJlZ2lzdGVyRWRpdGluZ0RvbWFpbihlZGl0aW5nRG9tYWluKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAic2F2ZU1ldGhvZExpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gdHJ1ZTsKLQotCQkJCUlMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGVkaXRpbmdEb21haW4KLQkJCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zKTsKLQotCQkJCSgoQmFzaWNDb21tYW5kU3RhY2spIGVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkpCi0JCQkJCQkuc2F2ZUlzRG9uZSgpOwotCi0JCQkJc2tpcEV2ZW50UHJvY2Vzc2luZyA9IGZhbHNlOwotCi0JCQkJZmlyZVByb3BlcnR5Q2hhbmdlKGxpYnJhcnksIFBST1BfRElSVFkpOwotCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlza2lwRXZlbnRQcm9jZXNzaW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjYXJkcyBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJkaXNjYXJkTWV0aG9kTGlicmFyeUNoYW5nZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGdldEVkaXRpbmdEb21haW4oKS5nZXRSZXNvdXJjZVNldCgpLmdldFJlc291cmNlcygpCi0JCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdC5uZXh0KCk7Ci0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2VNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTdHJpbmcgbXNnID0gImxpYnJhcnk9IiArIGxpYnJhcnkgKyAiLCBtZW1vcnkgb24gZW50cnk9IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAoUnVudGltZS5nZXRSdW50aW1lKCkudG90YWxNZW1vcnkoKSAtIFJ1bnRpbWUKLQkJCQkJCQkuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKSk7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJjbG9zZU1ldGhvZExpYnJhcnkiLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBTdHJpbmcgbGliUGF0aCA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLy8gLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5UGF0aCgpOwotCQlGaWxlIGxpYkZpbGUgPSBuZXcgRmlsZShsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJU3RyaW5nIGxpYlBhdGggPSBsaWJGaWxlLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkvLyByZW1vdmUgdGhlIGNvbmZpZ3VyYXRpb24gbWFuYWdlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGlicmFyeQotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLnJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VycyhsaWJyYXJ5KTsKLQotCQlyZW1vdmVSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKTsKLQotCQkvLyBDbGVhciB0aGUgdGVtcCBsYXlvdXQgcmVzb3VyY2VzLgotCQlMYXlvdXRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJCi0JCVN1cHByZXNzaW9uLmNsZWFyQ2FjaGVkU3VwcHJlc3Npb25zKCk7Ci0KLQkJVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBlZGl0aW5nRG9tYWluCi0JCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCXJlc291cmNlU2V0LnVubG9hZCgpOwotCi0JCXRyeSB7Ci0JCQkvLyBDbG9zZSB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmaWxlLgotCQkJTWV0aG9kTGlicmFyeVByb2plY3QuY2xvc2VQcm9qZWN0KGxpYlBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9IAotCi0JCVJlZnJlc2hKb2IuZ2V0SW5zdGFuY2UoKS5yZXNldCgpOwotCi0JCS8vIEFjdGl2YXRlcyB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuCi0JCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTdHJpbmcgbXNnID0gImxpYnJhcnk9IiArIGxpYnJhcnkgKyAiLCBtZW1vcnkgb24gZXhpdD0iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIChSdW50aW1lLmdldFJ1bnRpbWUoKS50b3RhbE1lbW9yeSgpIC0gUnVudGltZQotCQkJCQkJCS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpKTsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImNsb3NlTWV0aG9kTGlicmFyeSIsIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRNZXRob2RMaWJyYXJ5IiwgImxpYnJhcnk9IiArIGxpYnJhcnkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInNldE1ldGhvZExpYnJhcnkiLCAibGlicmFyeT0iICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKHRoaXMubGlicmFyeSAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgdGhpcy5saWJyYXJ5LmVSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmNsZWFyKCk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQobGlicmFyeSk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmxpYnJhcnkgPSBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRBZGFwdGVyRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gKENvbXBvc2VkQWRhcHRlckZhY3RvcnkpIGdldEVkaXRpbmdEb21haW4oKS5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVkaXRpbmcgZG9tYWluIGZvciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVkaXRpbmcgZG9tYWluCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBnZXRFZGl0aW5nRG9tYWluKCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJImdldEVkaXRpbmdEb21haW4iLCAiZWRpdGluZ0RvbWFpbj0iICsgZWRpdGluZ0RvbWFpbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGVkaXRpbmcgZG9tYWluIHdpdGggdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGRvbWFpbgotCSAqICAgICAgICAgICAgYW4gZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlckVkaXRpbmdEb21haW4oQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGRvbWFpbikgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInJlZ2lzdGVyRWRpdGluZ0RvbWFpbiIsICJkb21haW49IiArIGRvbWFpbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBsaWJyYXJ5IGNoYW5nZXMgbWFkZSBpbiB0aGUgZ2l2ZW4gZWRpdGluZwotCQkvLyBkb21haW4uCi0JCSgoQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgZG9tYWluLmdldEFkYXB0ZXJGYWN0b3J5KCkpCi0JCQkJLmFkZExpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0KLQkJLy8gQWRkIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBjaGFuZ2VzIG1hZGUgdG8gdGhlIGNvbW1hbmQgc3RhY2suCi0JCS8vIFRoaXMgaXMgdXNlZCB0byBzZWxlY3QgdGhlIG1vc3QgcmVjZW50bHkgYWZmZWN0ZWQgb2JqZWN0cyBpbiB0aGUKLQkJLy8gdmlld2VyLgotCQlkb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoY29tbWFuZFN0YWNrTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIGNoYW5nZXMgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJhZGRMaXN0ZW5lciIsICJsaXN0ZW5lcj0iICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJaWYgKCFsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIHRoYXQgd2FzIGFkZGVkIHRvIG1vbml0b3IgY2hhbmdlcyB0byB0aGUgbWFuYWdlZAotCSAqIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZQotCQkJCQkucHJpbnQodGhpcywgInJlbW92ZUxpc3RlbmVyIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLS8vCQkJLy8gQ2FjaGUgdGhlIGxpc3RlbmVyIGFuZCByZW1vdmUgaXQganVzdCBiZWZvcmUgZGlzcGF0Y2hpbmcgdGhlCi0vLwkJCS8vIGxpYnJhcnkgY2hhbmdlZCBldmVudHMuCi0vLwkJCWlmICghZGV0YWNoZWRMaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLS8vCQkJCWRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLS8vCQkJfQotCQkKLQkJaWYobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChsaWJyYXJ5Q2hhbmdlZExpc3RlbmVycykgewotCQkJCWxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJhZGRQcm9wZXJ0eUxpc3RlbmVyIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZQotCSAqIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5TGlzdGVuZXIoSVByb3BlcnR5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJyZW1vdmVQcm9wZXJ0eUxpc3RlbmVyIiwgImxpc3RlbmVyPSIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNvbW1hbmQgcHJvY2Vzc2luZyBvbiBhIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb21tYW5kU3RhY2sgY29tbWFuZFN0YWNrKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkic3RhcnRMaXN0ZW5pbmdUbyIsICJjb21tYW5kU3RhY2s9IiArIGNvbW1hbmRTdGFjayk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJY29tbWFuZFN0YWNrLmFkZENvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY29tbWFuZCBwcm9jZXNzaW5nIG9uIGEgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wTGlzdGVuaW5nVG8oQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJInN0b3BMaXN0ZW5pbmdUbyIsICJjb21tYW5kU3RhY2s9IiArIGNvbW1hbmRTdGFjayk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJY29tbWFuZFN0YWNrLnJlbW92ZUNvbW1hbmRTdGFja0xpc3RlbmVyKGNvbW1hbmRTdGFja0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgbGlzdGVuaW5nIHRvIGNoYW5nZSBub3RpZmljYXRpb25zIHNlbnQgZnJvbSBhbiBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZ1RvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsCi0JCQkJCSJzdGFydExpc3RlbmluZ1RvIiwgImFkYXB0ZXJGYWN0b3J5PSIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJYWRhcHRlckZhY3RvcnkuYWRkTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyBsaXN0ZW5pbmcgdG8gY2hhbmdlIG5vdGlmaWNhdGlvbnMgc2VudCBmcm9tIGFuIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLAotCQkJCQkic3RvcExpc3RlbmluZ1RvIiwgImFkYXB0ZXJGYWN0b3J5PSIgKyBhZGFwdGVyRmFjdG9yeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJYWRhcHRlckZhY3RvcnkucmVtb3ZlTGlzdGVuZXIobm90aWZ5Q2hhbmdlZExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgbWV0aG9kIGVsZW1lbnQgZnJvbSB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBlbGVtZW50J3MgR1VJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGVsZW1lbnQgb2YgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0vLyB0aGlzIHByaW50ZWQgb3V0IHRvbyBtdWNoIHVzZWxlc3MgaW5mb3JtYXRpb24sIGNvbW1lbnQgb3V0Ci0vLwkJaWYgKGRlYnVnKSB7Ci0vLwkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImdldE1ldGhvZEVsZW1lbnQiLCAiZ3VpZD0iICsgZ3VpZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotLy8JCX0KLQotCQl0cnkgewotCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBsaWJyYXJ5Ci0JCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIHJlc291cmNlU2V0LmdldEVPYmplY3QoZ3VpZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFRocm93YWJsZSB0aCkgewotCQkJLy8gTG9nIGVycm9yIGhlcmUKLQkJCXRoLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJlbGF0aXZlIFVSSSBvZiBhIG1ldGhvZCBlbGVtZW50IGluIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIHJlbGF0aXZlIFVSSQotCSAqLwotCXB1YmxpYyBVUkkgZ2V0RWxlbWVudFJlbGF0aXZlVVJJKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJImdldEVsZW1lbnRSZWxhdGl2ZVVSSSIsICJlbGVtZW50PSIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGxpYnJhcnkuZVJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCVVSSSBsaWJyYXJ5VVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQkJVVJJIGVsZW1lbnRVUkkgPSBlbGVtZW50LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQkJCXJldHVybiBlbGVtZW50VVJJLmRlcmVzb2x2ZShsaWJyYXJ5VVJJKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBpcyByZWFkIG9ubHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgcmVhZCBvbmx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJVVJJIGxpYnJhcnlVUkkgPSBsaWJyYXJ5LmVSZXNvdXJjZSgpLmdldFVSSSgpOwotCQlpZiAobGlicmFyeVVSSS5pc0ZpbGUoKSkgewotCQkJRmlsZSBsaWJyYXJ5WE1JRmlsZSA9IG5ldyBGaWxlKGxpYnJhcnlVUkkudG9GaWxlU3RyaW5nKCkpOwotCQkJcmV0dXJuIGxpYnJhcnlYTUlGaWxlLmV4aXN0cygpICYmICFsaWJyYXJ5WE1JRmlsZS5jYW5Xcml0ZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgY29udGVudCBoYXMKLQkgKiAgICAgICAgIGJlZW4gbW9kaWZpZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZExpYnJhcnlNb2RpZmllZCgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJpc01ldGhvZExpYnJhcnlNb2RpZmllZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuZ2V0UmVzb3VyY2VzKCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXNvdXJjZS5pc01vZGlmaWVkKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaGFzIGFueSB1bnJlc29sdmVkIHByb3h5LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkgaGFzIGFuCi0JICogICAgICAgICB1bnJlc29sdmVkIHByb3h5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1VucmVzb2x2ZWRQcm94eSgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJoYXNVbnJlc29sdmVkUHJveHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9ICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgZWRpdGluZ0RvbWFpbgotCQkJCS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJcmV0dXJuIHJlc291cmNlU2V0Lmhhc1VucmVzb2x2ZWRQcm94eSgpOwotCX0KLQotCS8qKgotCSAqIFJlbG9hZHMgdGhlIGdpdmVuIHJlc291cmNlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgaGF2ZSByZWxvYWRlZAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHJlbG9hZFJlc291cmNlcyhmaW5hbCBDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIkFic3RyYWN0TGlicmFyeU1hbmFnZXIucmVsb2FkUmVzb3VyY2VzKCk6IFNUQVJUIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0cnkgewotCQkJZmluYWwgQXJyYXlMaXN0IHJlbG9hZGVkUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJcmVsb2FkZWRSZXNvdXJjZXMuYWRkQWxsKGRvUmVsb2FkUmVzb3VyY2VzKHJlc291cmNlcykpOwotCi0JCQkJfQotCi0JCQl9OwotCQkJdHJ5IHsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLAotCQkJCQkJbmV3IExpYnJhcnlTY2hlZHVsaW5nUnVsZShsaWJyYXJ5KSwKLQkJCQkJCUlXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVsb2FkZWRSZXNvdXJjZXM7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiQWJzdHJhY3RMaWJyYXJ5TWFuYWdlci5kb1JlbG9hZFJlc291cmNlcygpOiBFTkQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRvUmVsb2FkUmVzb3VyY2VzKENvbGxlY3Rpb24gcmVzb3VyY2VzKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAicmVsb2FkUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIHJlc291cmNlcyB0byByZWxvYWQgY29udGFpbnMgYW55IGVsZW1lbnRzIGNhY2hlZCBpbgotCQkvLyBMaWJyYXJ5U2VydmljZQotCQkvLyB0byB1cGRhdGUgdGhlbQotCQkvLwotCQlMaWJyYXJ5U2VydmljZSBsaWJTdmMgPSAoTGlicmFyeVNlcnZpY2UpIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JCVJlc291cmNlIGN1cnJlbnRMaWJSZXNvdXJjZSA9IG51bGw7Ci0JCUlMaWJyYXJ5TWFuYWdlciBjdXJyZW50TGliTWdyID0gbnVsbDsKLQkJUmVzb3VyY2UgY3VycmVudENvbmZpZ1Jlc291cmNlID0gbnVsbDsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbnVsbDsKLQkJTGlzdCBjb25maWdSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgY29uZmlncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsLmdldE1ldGhvZEVsZW1lbnQocmVzb3VyY2UpOwotCQkJaWYgKGUgPT0gbGliU3ZjLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpIHsKLQkJCQljdXJyZW50TGliTWdyID0gbGliU3ZjLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCWN1cnJlbnRMaWJSZXNvdXJjZSA9IHJlc291cmNlOwotCQkJfSBlbHNlIGlmIChlID09IGxpYlN2Yy5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpKSB7Ci0JCQkJY3VycmVudENvbmZpZ1Jlc291cmNlID0gcmVzb3VyY2U7Ci0JCQkJY3VycmVudENvbmZpZyA9IGxpYlN2Yy5nZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCWNvbmZpZ1Jlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJCWNvbmZpZ3MuYWRkKGUpOwotCQkJfQotCQl9Ci0KLQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBsaWJyYXJ5Ci0JCQkJLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0JCUNvbGxlY3Rpb24gcmVsb2FkZWRSZXNvdXJjZXMgPSByZXNvdXJjZVNldC5yZWxvYWRSZXNvdXJjZXMocmVzb3VyY2VzKTsKLQkJaWYgKCFyZWxvYWRlZFJlc291cmNlcy5pc0VtcHR5KCkpIHsKLQkJCWlmIChjdXJyZW50TGliUmVzb3VyY2UgIT0gbnVsbCB8fCBjdXJyZW50Q29uZmlnUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCS8vIHVwZGF0ZSBjYWNoZWQgZWxlbWVudHMgaW4gTGlicmFyeVNlcnZpY2UgYW5kIHRoaXMgbGlicmFyeQotCQkJCS8vIG1hbmFnZXIKLQkJCQkvLwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlbG9hZGVkUmVzb3VyY2VzLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKHJlc291cmNlID09IGN1cnJlbnRMaWJSZXNvdXJjZSkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCQkJCU1ldGhvZExpYnJhcnkgbmV3TGliID0gKE1ldGhvZExpYnJhcnkpIGU7Ci0JCQkJCQkJbGliU3ZjLnNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KG5ld0xpYik7Ci0JCQkJCQkJaWYgKGN1cnJlbnRMaWJNZ3IgaW5zdGFuY2VvZiBBYnN0cmFjdExpYnJhcnlNYW5hZ2VyKSB7Ci0JCQkJCQkJCWxpYlN2Yy5yZW1vdmVMaWJyYXJ5TWFuYWdlcihjdXJyZW50TGliTWdyKTsKLQkJCQkJCQkJKChBYnN0cmFjdExpYnJhcnlNYW5hZ2VyKSBjdXJyZW50TGliTWdyKQotCQkJCQkJCQkJCS51cGRhdGVNZXRob2RMaWJyYXJ5KG5ld0xpYik7Ci0JCQkJCQkJCWxpYlN2Yy5zZXRMaWJyYXJ5TWFuYWdlcihjdXJyZW50TGliTWdyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJlc291cmNlID09IGN1cnJlbnRDb25maWdSZXNvdXJjZSkgewotCQkJCQkJTWV0aG9kRWxlbWVudCBlID0gUGVyc2lzdGVuY2VVdGlsCi0JCQkJCQkJCS5nZXRNZXRob2RFbGVtZW50KHJlc291cmNlKTsKLQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCQkJCS8vIHJlbW92ZSBjb25maWcgbWFuYWdlciBvZiBvbGQgY3VycmVudCBjb25maWcKLQkJCQkJCQkvLwotCQkJCQkJCWxpYlN2Yy5yZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcihjdXJyZW50Q29uZmlnKTsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlOwotCQkJCQkJCWxpYlN2Yy5zZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKCFjb25maWdSZXNvdXJjZXMuaXNFbXB0eSgpKSB7Ci0JCQkJCQlpbnQgaWQgPSBjb25maWdSZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSk7Ci0JCQkJCQlpZiAoaWQgIT0gLTEpIHsKLQkJCQkJCQkvLyByZW1vdmUgY29uZmlnIG1hbmFnZXIgb2Ygb2xkIGNvbmZpZwotCQkJCQkJCS8vCi0JCQkJCQkJbGliU3ZjCi0JCQkJCQkJCQkucmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXIoKE1ldGhvZENvbmZpZ3VyYXRpb24pIGNvbmZpZ3MKLQkJCQkJCQkJCQkJLmdldChpZCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUT0RPOiBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0JCQlTdXBwcmVzc2lvbi5jbGVhblVwKCk7Ci0JCX0KLQkJcmV0dXJuIHJlbG9hZGVkUmVzb3VyY2VzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdMaWIKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG5ld0xpYikgewotCQlsaWJyYXJ5ID0gbmV3TGliOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wdGlvbnMgdXNlZCBmb3Igc2F2aW5nIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgc2F2ZSBvcHRpb25zCi0JICovCi0JcHVibGljIE1hcCBnZXRTYXZlT3B0aW9ucygpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJnZXRTYXZlT3B0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gc2F2ZU9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBtZXRob2QgcGx1Zy1pbiB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWV0aG9kUGx1Z2luKGZpbmFsIE1ldGhvZFBsdWdpbiBwbHVnaW4pCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgImFkZE1ldGhvZFBsdWdpbiIsICJwbHVnaW49IiArIHBsdWdpbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gVGhpcyBvcGVyYXRpb24gd2lsbCBjYXVzZSBhbiBVSSB1cGRhdGUuIEl0IG11c3QgYmUgZXhlY3V0ZWQgaW4KLQkJLy8gdGhlIG1haW4gVUkgdG8gYW9pZCBhbiBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uLgotCQlmaW5hbCBFeGNlcHRpb25bXSBleGNlcHRpb25zID0gbmV3IEV4Y2VwdGlvblsxXTsKLQotCQl0cnkgewotCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbik7Ci0KLQkJCQkJSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IFNlcnZpY2VzCi0JCQkJCQkJLmdldExpYnJhcnlQZXJzaXN0ZXIoZ2V0TGlicmFyeVBlcnNpc3RlclR5cGUoKSkKLQkJCQkJCQkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBlcnNpc3Rlci5zYXZlKGxpYnJhcnkuZVJlc291cmNlKCkpOwotCQkJCQkJcGVyc2lzdGVyLmNvbW1pdCgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0JCQkJCQlleGNlcHRpb25zWzBdID0gZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5hZGQocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQkJCX0KLQkJCX0pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQkJaWYgKGV4Y2VwdGlvbnNbMF0gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGV4Y2VwdGlvbnNbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBsaWJyYXJ5IG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHByZWZlcmVuY2VTdG9yZUNoYW5nZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHByZWZTdG9yZVdyYXBwZXIgPSBMaWJyYXJ5UGx1Z2luCi0JCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCi0JCQlpZihwcmVmU3RvcmVXcmFwcGVyICE9IG51bGwpIHsKLQkJCQlwcmVmU3RvcmVXcmFwcGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZmVyZW5jZVN0b3JlQ2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkJCWxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLmNsZWFyKCk7Ci0JCX0KLQotLy8JCWlmIChkZXRhY2hlZExpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLS8vCQkJZGV0YWNoZWRMaWJyYXJ5Q2hhbmdlZExpc3RlbmVycy5jbGVhcigpOwotLy8JCX0KLQotCQlpZiAocmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotCQkJcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuY2xlYXIoKTsKLQkJfQotCi0JCWVkaXRpbmdEb21haW4gPSBudWxsOwotCQlsaWJyYXJ5ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIGFyZ3VtZW50cyB1c2VkIGZvciBjcmVhdGluZyBhIG5ldyBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGFpbmluZ0VsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQvY29udGFpbmluZyBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgbWV0aG9kIGVsZW1lbnQKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tFbGVtZW50Q3JlYXRpb25Bcmd1bWVudHMoCi0JCQlNZXRob2RFbGVtZW50IGNvbnRhaW5pbmdFbGVtZW50LCBTdHJpbmcgbmFtZSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250YWluaW5nRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXRocm93IG5ldyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oKTsKLQkJfQotCQkvLyBUT0RPOiBDaGVjayBmb3IgaWxsZWdhbCBjaGFyYWN0ZXJzLgotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgYSBwZXJzaXN0ZW5jZSByZWZyZXNoIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgYSByZWZyZXNoIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVmcmVzaEV2ZW50KElSZWZyZXNoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJoYW5kbGVSZWZyZXNoRXZlbnQiLCAicmVmcmVzaGVkUmVzb3VyY2VzPSIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSsgZXZlbnQuZ2V0UmVmcmVzaGVkUmVzb3VyY2VzKCkpOwotCQl9Ci0KLQkJaWYgKCFldmVudC5nZXRVbmxvYWRlZE9iamVjdHMoKS5pc0VtcHR5KCkpIHsKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFLmNsZWFuVXAoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCBsaWJyYXJ5IGNoYW5nZWQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGNoYW5nZSB0aGF0IGhhcyBvY2N1cnJlZAotCSAqIEBwYXJhbSBjaGFuZ2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgZWxlbWVudHMgdGhhdCBoYXZlIGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIGludCBvcHRpb24sCi0JCQlmaW5hbCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQotCQkvLyBzZW5kIG5vdGlmaWNhdGlvbiBtaWdodCBiZSBjYXVzaW5nIGxpc3RlbmVycyBhZGRlZCBvciByZW1vdmVkCi0JCS8vIHRvIGF2b2lkIGNvbmN1cnJlbnQgdXBkYXRlIG9mIHRoZSBsaXN0ZW5lciBsaXN0LCAKLQkJLy8gd2Uga2VlcCB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMgcHJvY2Vzc2VkCi0JCS8vIGFuZCBjaGVjayB0aGUgbGlzdGVuZXIgbGlzdCByZXBlYXRlZGx5Ci0JCUhhc2hTZXQgcHJvY2Vzc2VkID0gbmV3IEhhc2hTZXQoKTsJCi0JCXdoaWxlIChfZG9Ob3RpZnlMaXN0ZW5lcnMob3B0aW9uLCBjb2xsZWN0aW9uLCBwcm9jZXNzZWQpICkgewotCQkJOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIGFsbCBsaWJyYXJ5IGNoYW5nZWQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSBtYW5hZ2VkIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGNoYW5nZSB0aGF0IGhhcyBvY2N1cnJlZAotCSAqIEBwYXJhbSBjaGFuZ2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgZWxlbWVudHMgdGhhdCBoYXZlIGNoYW5nZWQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhbnkgbGlzdGVuZXIgaXMgcHJvY2Vzc2VkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIF9kb05vdGlmeUxpc3RlbmVycyhmaW5hbCBpbnQgb3B0aW9uLAotCQkJZmluYWwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uLCBmaW5hbCBDb2xsZWN0aW9uIHByb2Nlc3NlZCkgewotCQlpZiAoZGVidWcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgIm5vdGlmeUxpc3RlbmVycyIsICJvcHRpb249IiArIG9wdGlvbik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCQotCQl0cnkgewotLy8JCQkvLyBSZW1vdmUgdGhlIGNoYW5nZWQgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGRldHRhY2hlZC4KLS8vCQkJaWYgKGRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuc2l6ZSgpID4gMCkgewotLy8JCQkJZm9yIChJdGVyYXRvciBpdCA9IGRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXQKLS8vCQkJCQkJLmhhc05leHQoKTspIHsKLS8vCQkJCQlPYmplY3QgbCA9IGl0Lm5leHQoKTsKLS8vCQkJCQlpZiAobGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY29udGFpbnMobCkpIHsKLS8vCQkJCQkJbGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMucmVtb3ZlKGwpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWRldGFjaGVkTGlicmFyeUNoYW5nZWRMaXN0ZW5lcnMuY2xlYXIoKTsKLS8vCQkJfQotCi0JCQkvLyBOb3RpZnkgdGhlIGNoYW5nZWQgbGlzdGVuZXJzLgotCQkJLy8gTm90ZTogbW9yZSBjaGFuZ2VkIGxpc3RlbmVycyBtYXkgYmUgYWRkZWQgd2hpbGUgZWFjaCBsaXN0ZW5lciBpcwotCQkJLy8gYmVpbmcgbm90aWZpZWQuIEhvd2V2ZXIsCi0JCQkvLyB0aGV5IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCB3aGljaCBkb2VzIG5vIGhhcm0uCi0JCQkKLQkJCQotCQkJZm9yICggSXRlcmF0b3IgaXQgPSBuZXcgQXJyYXlMaXN0KGxpYnJhcnlDaGFuZ2VkTGlzdGVuZXJzKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCWZpbmFsIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSAoSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcikgaXQubmV4dCgpOwotCi0JCQkJaWYgKCAobGlzdGVuZXIgIT0gbnVsbCkgJiYgIXByb2Nlc3NlZC5jb250YWlucyhsaXN0ZW5lcikgKSB7Ci0JCi0JCQkJCS8vIGtlZXAgdGhlIHByb2Nlc3NlZCBvbmVzCi0JCQkJCXByb2Nlc3NlZC5hZGQobGlzdGVuZXIpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQkJCi0JCQkJCS8vIFNpbmNlIHRoaXMgbWF5IHRyaWdnZXIgYW4gdXBkYXRlIHRvIHRoZSBVSSwgdGhlCi0JCQkJCS8vIG5vdGlmaWNhdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSSB0aHJlYWQgdG8gYXZvaWQKLQkJCQkJLy8gZ2V0dGluZyBhbiBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uLiBUaGUKLQkJCQkJLy8gbm90aWZpY2F0aW9uIG11c3QgYWxzbyBiZSBleGVjdXRlZCBpbiBzeW5jIG1vZGUgdG8KLQkJCQkJLy8gZ3VyYW50ZWUgZGVsaXZlcnkgb2YgdGhlIGV2ZW50IGJlZm9yZSBhIGxpc3RlbmVyIGlzCi0JCQkJCS8vIGRpc3Bvc2VkLgotCQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCURlYnVnVHJhY2UKLQkJCQkJCQkJCQkucHJpbnQoCi0JCQkJCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJCQkJIm5vdGlmeUxpc3RlbmVycyIsICJsaXN0ZW5lcj0iICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJbGlzdGVuZXIubGlicmFyeUNoYW5nZWQob3B0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJub3RpZnlMaXN0ZW5lcnMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY2hhbmdlZDsKLQkJCi0JfQotCi0JLyoqCi0JICogRmlyZXMgYSBwcm9wZXJ0eSBjaGFuZ2VkIGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eUlkCi0JICogICAgICAgICAgICB0aGUgaWQgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2UoZmluYWwgT2JqZWN0IHNvdXJjZSwgZmluYWwgaW50IHByb3BlcnR5SWQpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJmaXJlUHJvcGVydHlDaGFuZ2UiLCAic291cmNlPSIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCU9iamVjdFtdIGFycmF5ID0gcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWZpbmFsIElQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyID0gKElQcm9wZXJ0eUxpc3RlbmVyKSBhcnJheVtpXTsKLQotCQkJLy8gVGhpcyBvcGVyYXRpb24gd2lsbCBjYXVzZSBhbiBVSSB1cGRhdGUuIEl0IG11c3QgYmUgZXhlY3V0ZWQgaW4KLQkJCS8vIHRoZSBtYWluIFVJIHRvIGFvaWQgYW4gSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbi4KLQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywKLQkJCQkJCQkJImZpcmVQcm9wZXJ0eUNoYW5nZSIsICJsaXN0ZW5lcj0iICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoc291cmNlLCBwcm9wZXJ0eUlkKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSByZXNvdXJjZSBjaGFuZ2VkIGxpc3RlbmVyIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IHJlc291cmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcnMoKSB7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwgfHwgbGlicmFyeS5lUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIWxpYnJhcnkuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuY29udGFpbnMocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpKSB7Ci0JCQlsaWJyYXJ5LmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmFkZChyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCWlmICghcGx1Z2luLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKAotCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcikpIHsKLQkJCQlwbHVnaW4uZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsaWJyYXJ5LmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWlmICghY29uZmlnLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLmNvbnRhaW5zKAotCQkJCQlyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcikpIHsKLQkJCQljb25maWcuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkuYWRkKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHJlc291cmNlIGNoYW5nZWQgbGlzdGVuZXIgdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkKLQkgKiByZXNvdXJjZSBhbmQgbWV0aG9kIHBsdWctaW5zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlQ2hhbmdlZExpc3RlbmVycygpIHsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCB8fCBsaWJyYXJ5LmVSZXNvdXJjZSgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWxpYnJhcnkuZVJlc291cmNlKCkuZUFkYXB0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ2hhbmdlZExpc3RlbmVyKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKS5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCXBsdWdpbi5lUmVzb3VyY2UoKS5lQWRhcHRlcnMoKS5yZW1vdmUocmVzb3VyY2VDaGFuZ2VkTGlzdGVuZXIpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYnJhcnkuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgaXQubmV4dCgpOwotCQkJY29uZmlnLmVSZXNvdXJjZSgpLmVBZGFwdGVycygpLnJlbW92ZShyZXNvdXJjZUNoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeSByZXNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCkgewotCQlyZXR1cm4gbGlicmFyeSAhPSBudWxsID8gbGlicmFyeS5lUmVzb3VyY2UoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgVVJJIG9mIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5qYXZhLm5ldC5VUkk8L2NvZGU+Ci0JICovCi0JcHVibGljIGphdmEubmV0LlVSSSBnZXRNZXRob2RMaWJyYXJ5VVJJKCkgewotCQlSZXNvdXJjZSBzYXZlZFJlc291cmNlID0gZ2V0TWV0aG9kTGlicmFyeVJlc291cmNlKCk7Ci0JCWlmIChzYXZlZFJlc291cmNlICE9IG51bGwpIHsKLQkJCVVSSSByZXNvdXJjZVVSSSA9IHNhdmVkUmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQl0cnkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHJlc291cmNlVVJJLnRvRmlsZVN0cmluZygpKTsKLQkJCQlyZXR1cm4gZmlsZS5nZXRQYXJlbnRGaWxlKCkudG9VUkkoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmV3IHBhY2thZ2VzIGludG8gdGhlIGNvbmZpZ3VyYXRpb25zIGlmIHRoZSBwYXJlbnQgaXMgaW4gdGhlCi0JICogY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTmV3UGFja2FnZXNUb0NvbmZpZ3VyYXRpb24oQ29sbGVjdGlvbiBuZXdvYmpzKSB7Ci0JCWlmIChuZXdvYmpzID09IG51bGwgfHwgbmV3b2Jqcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpOwotCi0JCXRyeSB7Ci0JCQlFT2JqZWN0IGUsIHBhcmVudDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBuZXdvYmpzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKQotCQkJCQkJJiYgKChwYXJlbnQgPSBlLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkJCSYmIChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSkgewotCQkJCQlPYmplY3QgY29uZmlncyA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBhcmVudCkKLQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoQXNzb2NpYXRpb25IZWxwZXIuTWV0aG9kUGFja2FnZV9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCQkJCWlmIChjb25maWdzIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdGNvbmZpZyA9ICgoTGlzdCkgY29uZmlncykuaXRlcmF0b3IoKTsgaXRjb25maWcKLQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpdGNvbmZpZwotCQkJCQkJCQkJLm5leHQoKTsKLQkJCQkJCQlMaXN0IHBrZ3MgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCQkJCWlmICghcGtncy5jb250YWlucyhlKSkgewotCQkJCQkJCQkvLyBwa2dzLmFkZChlKTsKLQkJCQkJCQkJaGVscGVyCi0JCQkJCQkJCQkJLmdldEFjdGlvbk1hbmFnZXIoKQotCQkJCQkJCQkJCS5kb0FjdGlvbigKLQkJCQkJCQkJCQkJCUlBY3Rpb25NYW5hZ2VyLkFERCwKLQkJCQkJCQkJCQkJCWNvbmZpZywKLQkJCQkJCQkJCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSwKLQkJCQkJCQkJCQkJCWUsIC0xKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWhlbHBlci5zYXZlKCk7Ci0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWhlbHBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0eXBlIG9mIGxpYnJhcnkgcGVyc2lzdGVyIHRvIGJlIHVzZWQgaW4gdGhpcyBsaWJyYXJ5IG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaWJyYXJ5IHBlcnNpc3RlciB0eXBlCi0JICogQHNlZSBTZXJ2aWNlcyNYTUlfUEVSU0lTVEVOQ0VfVFlQRQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGlicmFyeVBlcnNpc3RlclR5cGUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJTGlicmFyeVJlc291cmNlU2V0IGNyZWF0ZVJlc291cmNlU2V0KCk7CQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ0hlbHBlckRlbGVnYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlnSGVscGVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyMjBjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlnSGVscGVyRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5wcm9jZXNzLkFjdGl2aXR5V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5TdW1tYXJ5UGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotCi0vKioKLSAqIERlbGVnYXRlIGNsYXNzIHVzZWQgaW4gQ29uZmlndXJhdGlvbkhlbHBlcgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUgCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdIZWxwZXJEZWxlZ2F0ZSB7Ci0KLQkKLQkvKioKLQkgKiBUZXN0IGlmIHBrZyBpcyBhIHN5c3RlbSBwYWNrYWdlIG9mIHBsdWdpbgotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiBAcGFyYW0gcGtnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3lzdGVtUGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RQYWNrYWdlIHBrZykgewotCQlyZXR1cm4gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pLmNvbnRhaW5zKHBrZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGxvYWRPcHBvc2l0ZUZlYXR1cmVzKElMaWJyYXJ5UmVzb3VyY2VTZXQgcmVzb3VjZVNldCwKLQkJCUxpc3Q8T3Bwb3NpdGVGZWF0dXJlPiBvcHBvc2l0ZUZlYXR1cmVzLCAgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVNldDxTdHJpbmc+IEdVSURzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlHVUlEcy5hZGQoZWxlbWVudC5nZXRHdWlkKCkpOwotCQlyZXNvdWNlU2V0LmxvYWRPcHBvc2l0ZUZlYXR1cmVzKG9wcG9zaXRlRmVhdHVyZXMsIEdVSURzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZVV0aWwuZ2V0TWV0aG9kTGlicmFyeShjb25maWcpOwotCQlJTGlicmFyeU1hbmFnZXIgbGlicmFyeU1hbmFnZXIgPSBsaWJyYXJ5ID09IG51bGw/IG51bGwgOiBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZiAobGlicmFyeU1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uTWFuYWdlcihjb25maWcpCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25EYXRhKCkKLQkJCQkJCQkJLmlzT3duZXJTZWxlY3RlZChlbGVtZW50LCBjaGVja1N1YnRyYWN0ZWQpOwotCQl9Ci0JCQkJCi0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChjb25maWcgPT0gbnVsbCB8fCBDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIHNpbmNlIFVNQSAxLjAuNCwgY29uZmlndXJhdGlvbiBjYW4gaGF2ZSBhZGRlZCBjYXRlZ29yaWVzIAotCQkvLyBhbmQgc3VidHJhY3RlZCBjYXRlZ29yaWVzLiBUaGUgb3JkZXIgb2YgZmlsdGVyaW5nIGlzOgotCQkvLyAxLiBhbnkgZWxlbWVudCBpbiB0aGUgc3VidHJhY3RlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBleGNsdWRlZAotCQkvLyAyLiBhbnkgZWxlbWVudCBpbiB0aGUgYWRkZWQgY2F0ZWdvcmllcyBzaG91bGQgYmUgaW5jbHVkZWQKLQkJLy8gMy4gYW55IGVsZW1lbnQgbm90IGluIHRoZSBzZWxlY3RlZCBwYWNrYWdlIG9yIHBsdWdpbiBzaG91bGQgYmUgZXhjbHVkZWQuCi0JCQotCQlpZiAoIGNoZWNrU3VidHJhY3RlZCApIHsKLQkJCS8vIGZpcnN0IGNoZWNrIHN1YnRyYWN0ZWQgZWxlbWVudHMKLQkJCUxpc3Qgc3VidHJhY3RlZENhdGVnb3JpZXMgPSBjb25maWcuZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0JCQlpZiAoIHN1YnRyYWN0ZWRDYXRlZ29yaWVzLnNpemUoKSA+IDAgKSB7Ci0JCQkJZm9yICggSXRlcmF0b3IgaXQgPSBzdWJ0cmFjdGVkQ2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSAoQ29udGVudENhdGVnb3J5KWl0Lm5leHQoKTsKLQkJCQkJaWYgKCBjYyA9PSBlbGVtZW50ICkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyBuZWVkIHRvIGNoZWNrIGFsbCBjb250ZW50IGNhdGVnb3J5IHR5cGVzIGFuZCBzdWItY2F0ZWdvcmllcwotCQkJCQkvLyB3ZSBuZWVkIHRvIGhhdmUgYW4gZWZmaWNpZW50IGFsZ29yaXRobSBmb3IgdGhpcyBjaGVja2luZy4KLQkJCQkJLy8gZm9yIG5vdywgb25seSBjaGVjayB0aGUgY3VzdG9tIGNhdGVnb3J5J3MgY2F0ZWdvcmlzZWQgZWxlbWVudHMKLQkJCQkJLy8gVE9ETy4gSmluaHVhIFhpLCAxMS8yNy8yMDA2Ci0JCQkJCWlmICggY2MgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSApIHsKLQkJCQkJCWlmICggKChDdXN0b21DYXRlZ29yeSljYykuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLmNvbnRhaW5zKGVsZW1lbnQpICkgewotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFRPRE8sIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVE9ETywgaXNPd25lclNlbGVjdGVkOiBub3QgaW1wbGVtZW50ZWQgeWV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gdGhlbiBjaGVjayBhZGRlZCBjYXRlZ29yaWVzCi0JCS8vIFRPRE8KLQkJCi0JCS8vIGVsZW1lbnRzIGJleW9uZCBjb25maWd1cmF0aW9uIHNjb3BlIHNob3VsZCBiZSBhbHdheXMgdmlzaWJsZQotCQlpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KQotCQkJCXx8IChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCUxpc3QgcGx1Z2lucyA9IGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJCXJldHVybiAocGx1Z2lucyAhPSBudWxsKSAmJiBwbHVnaW5zLmNvbnRhaW5zKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgdGhlIG93bmVycHJvY2VzcyBjYW4ndCBzaG93LCBjYW4ndCBhY2NlcHQKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KSAoKEFjdGl2aXR5KSBlbGVtZW50KQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoYmFzZSAhPSBudWxsICYmIGJhc2UgIT0gZWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG93bmluZ1Byb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoYmFzZSk7Ci0JCQkJCWlmICggb3duaW5nUHJvYyAhPSBudWxsICYmIG93bmluZ1Byb2MgIT0gZWxlbWVudCAKLQkJCQkJCQkmJiAhQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhvd25pbmdQcm9jLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJRU9iamVjdCBwa2cgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKGVsZW1lbnQpOwotCi0JCQkvLyBhY2NlcHQgZ2xvYmFsIHBhY2thZ2UgaWYgdGhlIHBsdWdpbiBpcyBpbiB0aGUgY29uZmlndXJhdGlvbgotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc0dsb2JhbFBhY2thZ2UoKE1ldGhvZFBhY2thZ2UpIHBrZykpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcocGx1Z2luLCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCQl9Ci0KLQkJCUxpc3QgcGtncyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0JCQlpZiAocGtncyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBwZXIgUGhvbmcncyByZXF1ZXN0LCBmb3IgUHJvY2Vzc1BhY2thZ2UsIGNoZWNrIHRoZQotCQkJLy8gUHJvY2Vzc0NvbXBvbmVudCBwYXJlbnQgaW5zdGVhZAotCQkJaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJd2hpbGUgKChwa2cgIT0gbnVsbCkgJiYgIShwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkJJiYgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgcGFja2FnZSBub3Qgc2VsZWN0ZWQsIHJldHVybiBmYWxzZQotCQkJaWYgKChwa2cgPT0gbnVsbCkgfHwgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZE9wcG9zaXRlRmVhdHVyZXMoTWFwIG1hcCwgTGlzdCBvcHBvc2l0ZUZlYXR1cmVzLCBTZXQgZGVsZXRlZEdVSURzKSB7Ci0JCWludCBtYXggPSBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSAtIDE7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29sbGVjdGlvbiBlbGVtZW50cyA9IG5ldyBIYXNoU2V0KG1hcC52YWx1ZXMoKSk7Ci0JCUhhc2hTZXQgbG9hZGVkRWxlbWVudHMgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAoIWVsZW1lbnRzLmlzRW1wdHkoKSkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG1yRU9iamVjdCA9ICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGVsZW1lbnQpOwotCQkJCQlmb3IgKGludCBpID0gbWF4OyBpID4gLTE7IGktLSkgewotCQkJCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSA9ICgoT3Bwb3NpdGVGZWF0dXJlKSBvcHBvc2l0ZUZlYXR1cmVzCi0JCQkJCQkJCS5nZXQoaSkpOwotCQkJCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlID0gb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCQkJCWlmIChlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpLmlzSW5zdGFuY2UoZWxlbWVudCkpIHsKLQkJCQkJCQlpZiAoZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJSW50ZXJuYWxFTGlzdCBsaXN0ID0gKEludGVybmFsRUxpc3QpIGVsZW1lbnQKLQkJCQkJCQkJCQkuZUdldChlRmVhdHVyZSk7Ci0JCQkJCQkJCWlmICghbGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJCQkJCWJvb2xlYW4gcmVzb2x2ZSA9IGZhbHNlOwotCQkJCQkJCQkJY2hlY2tfcmVzb2x2ZTogZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QKLQkJCQkJCQkJCQkJLmJhc2ljSXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQlJbnRlcm5hbEVPYmplY3QgZSA9IChJbnRlcm5hbEVPYmplY3QpIGl0ZXJhdG9yCi0JCQkJCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJCQkJCWlmIChlLmVJc1Byb3h5KCkpIHsKLQkJCQkJCQkJCQkJU3RyaW5nIGd1aWQgPSBlLmVQcm94eVVSSSgpCi0JCQkJCQkJCQkJCQkJLmZyYWdtZW50KCk7Ci0JCQkJCQkJCQkJCWlmIChkZWxldGVkR1VJRHMuY29udGFpbnMoZ3VpZCkpIHsKLQkJCQkJCQkJCQkJCXJlc29sdmUgPSB0cnVlOwotCQkJCQkJCQkJCQkJYnJlYWsgY2hlY2tfcmVzb2x2ZTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChyZXNvbHZlKSB7Ci0JCQkJCQkJCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGRlbGV0ZWRFbGVtZW50cyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdAotCQkJCQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCQkJCQkJT2JqZWN0IG8gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQkJCQkJCWlmKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIGRlbGV0ZWRHVUlEcy5jb250YWlucygoKE1ldGhvZEVsZW1lbnQpIG8pLmdldEd1aWQoKSkpIHsKLQkJCQkJCQkJCQkJCWRlbGV0ZWRFbGVtZW50cy5hZGQobyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZm9yIChPYmplY3QgZSA6IGRlbGV0ZWRFbGVtZW50cykgewotCQkJCQkJCQkJCQlpZihvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCQkJCW1yRU9iamVjdC5vcHBvc2l0ZUFkZChvcHBvc2l0ZUZlYXR1cmUsIGUpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0LmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIGUpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQkJCQkJCQkJCQkKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChlRmVhdHVyZSwgZmFsc2UpOwotCQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJCQkJCUludGVybmFsRU9iamVjdCBlID0gKEludGVybmFsRU9iamVjdCkgdmFsdWU7Ci0JCQkJCQkJCQlpZiAoZS5lSXNQcm94eSgpKSB7Ci0JCQkJCQkJCQkJU3RyaW5nIGd1aWQgPSBlLmVQcm94eVVSSSgpLmZyYWdtZW50KCk7Ci0JCQkJCQkJCQkJaWYgKGRlbGV0ZWRHVUlEcy5jb250YWlucyhndWlkKSkgewotCQkJCQkJCQkJCQlPYmplY3QgbyA9IGVsZW1lbnQuZUdldChlRmVhdHVyZSk7Ci0JCQkJCQkJCQkJCWlmKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQkJCQkJbXJFT2JqZWN0Lm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgbyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJCQltckVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KG9wcG9zaXRlRmVhdHVyZSwgbyk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBnZXRzIHRoZSBuZXdseSBsb2FkZWQgZWxlbWVudHMgdG8gbG9hZCB0aGVpciBvcHBvc2l0ZSBmZWF0dXJlcwotCQkJLy8KLQkJCWxvYWRlZEVsZW1lbnRzLmFkZEFsbChlbGVtZW50cyk7Ci0JCQllbGVtZW50cyA9IG5ldyBIYXNoU2V0KG1hcC52YWx1ZXMoKSk7Ci0JCQllbGVtZW50cy5yZW1vdmVBbGwobG9hZGVkRWxlbWVudHMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVIdG1sKE9iamVjdCByYXdfZWxlbWVudCwgSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXIpIHsKLQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKLQkJU3RyaW5nIGZpbGVfdXJsID0gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCQlPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcChyYXdfZWxlbWVudCk7Ci0JCWlmICggcmF3X2VsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgKSB7Ci0JCQlBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlciA9IChBY3Rpdml0eVdyYXBwZXJJdGVtUHJvdmlkZXIpcmF3X2VsZW1lbnQ7Ci0JCQlPYmplY3QgcHJvYyA9IHdyYXBwZXIuZ2V0VG9wSXRlbSgpOwotCQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBwcm9jIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzICkgewotCQkJCVN0cmluZyBwYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRQYXRoKHdyYXBwZXIpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKHRvcEl0ZW0pOwotCQkJCWxheW91dCA9IGh0bWxCdWlsZGVyLmdldExheW91dE1hbmFnZXIoKQotCQkJCQkuY3JlYXRlTGF5b3V0KChNZXRob2RFbGVtZW50KWVsZW1lbnQsIAotCQkJCQkJCShvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpcHJvYywgcGF0aCk7Ci0JCQkJZmlsZV91cmwgPSBodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChyYXdfZWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCVByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgcmF3X2VsZW1lbnQ7Ci0JCQlsYXlvdXQgPSBuZXcgU3VtbWFyeVBhZ2VMYXlvdXQoaHRtbEJ1aWxkZXIuZ2V0TGF5b3V0TWFuYWdlcigpLAotCQkJCQlwcm92aWRlci5nZXRQcmFjdGljZSgpLCBwcm92aWRlci5nZXRUZXh0KG51bGwpLAotCQkJCQlwcm92aWRlci5nZXRUZXh0KG51bGwpLCAoTGlzdCkgcHJvdmlkZXIuZ2V0Q2hpbGRyZW4obnVsbCksCi0JCQkJCXByb3ZpZGVyLmdldFRleHQobnVsbCkpOwotCQkJKChTdW1tYXJ5UGFnZUxheW91dCkgbGF5b3V0KS5zZXRIdG1sQnVpbGRlcihodG1sQnVpbGRlcik7Ci0JCQlmaWxlX3VybCA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJZmlsZV91cmwgPSBodG1sQnVpbGRlci5nZW5lcmF0ZUh0bWwoKE1ldGhvZEVsZW1lbnQpZWxlbWVudCk7Ci0JCX0KLQkJCi0JCWlmICggZmlsZV91cmwgPT0gbnVsbCApIHsKLQkJCWZpbGVfdXJsID0gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vIG9uIGxpbnV4LCB0aGUgZmlsZSBwYXRoIG5lZWQgdG8gYmUgc3BlY2lmaWVkIGFzIGZpbGUsIG90aGVyd2lzZSBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgdXJsCi0JCS8vIGFuZCBjYXN1aWduIGVuY29kaW5nL2RlY29kaW5nIGlzc3VlCi0JCS8vIExpbnV4OiBDb25maWd1cmF0aW9uIG5hbWVzIGNvbnRhaW5pbmcgYWNjZW50ZWQgY2hhcmFjdGVycyBjYW5ub3QgYmUgYnJvd3NlZC4KLQkJZWxzZSB7CQkJCi0JCQlpZiAoIVNXVC5nZXRQbGF0Zm9ybSgpLmVxdWFscygid2luMzIiKSAmJiAhZmlsZV91cmwuc3RhcnRzV2l0aCgiZmlsZTovLyIpICYmIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSFmaWxlX3VybC5lcXVhbHMoImFib3V0OmJsYW5rIikpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlmaWxlX3VybCA9ICJmaWxlOi8vIiArIGZpbGVfdXJsOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCS8vIEJ1ZyAyMDEzMzUgLSBSZWZyZXNoIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IGZvciBwcm9jZXNzIHBhZ2VzIGluIGJyb3dzaW5nIG1vZGUKLQkJCS8vIG5lZWQgdG8gYXBwZW5kIHRoZSBxdWVyeSBzdHJpbmcKLQkJCWlmICggbGF5b3V0IGluc3RhbmNlb2YgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCApIHsKLQkJCQlmaWxlX3VybCArPSAoKEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpbGF5b3V0KS5nZXRRdWVyeVN0cmluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlX3VybDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGVidWdEdW1wKFN0cmluZyBtc2cpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIiArIGdldENsYXNzKCkgKyAiLmRlYnVnRHVtcDogIiArIG1zZyk7CS8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkYmQ0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbkFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIE1ldGhvZCBDb25maWd1cmF0aW9uIGFscmVhZHkgZXhpc3RzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uIGV4dGVuZHMKLQkJTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlCi0JICogZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywKLQkJCVRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTAxZmMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9Db25maWd1cmF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlLkNvbmZpZ3VyYXRpb25DbG9zdXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5EZXBlbmRlbmN5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBNYW5hZ2VzIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hbmFnZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWFuYWdlZCBtZXRob2QgY29uZmlndXJhaXRvbi4KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCi0JLy8gVGhlIG1hbmFnZWQgY29uZmlndXJhaXRvbiBkYXRhLgotCXByaXZhdGUgQ29uZmlndXJhdGlvbkRhdGEgY29uZmlnRGF0YTsKLQkKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIGNvbmZpZ1Byb3BzOwotCi0JLy8gVGhlIGNvbnRhaW5pbmcgbWV0aG9kIGxpYnJhcnkgZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQkvLyBUaGUgbGlicmFyeSBtYW5hZ2VyIGZvciB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeS4KLQlwcm90ZWN0ZWQgSUxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyOwotCi0JLy8gVGhlIGRlcGVuZGVuY3kgbWFuYWdlci4KLQlwcm90ZWN0ZWQgRGVwZW5kZW5jeU1hbmFnZXIgZGVwZW5kZW5jeU1hbmFnZXI7Ci0KLQkvLyBUaGUgbGF5b3V0IG1hbmFnZXIuCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXI7Ci0KLQkvLyBUaGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCXByb3RlY3RlZCBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlOwotCi0JcHJvdGVjdGVkIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGFmY3A7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbk1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCWNvbmZpZ0RhdGEgPSBDb25maWd1cmF0aW9uRGF0YS5uZXdDb25maWd1cmF0aW9uRGF0YShjb25maWcpOwotCQkKLQkJY29uZmlnUHJvcHMgPSBuZXcgQ29uZmlndXJhdGlvblByb3BlcnRpZXMoY29uZmlnKTsgCi0KLQkJbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RMaWJyYXJ5KGNvbmZpZyk7Ci0KLQkJbGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlhZmNwID0gbmV3IEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyKGxpYnJhcnlNYW5hZ2VyCi0JCQkJLmdldEFkYXB0ZXJGYWN0b3J5KCkpOwotCi0JCWRlcGVuZGVuY3lNYW5hZ2VyID0gbmV3IERlcGVuZGVuY3lNYW5hZ2VyKGxpYnJhcnkpOwotCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJbGF5b3V0TWFuYWdlciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcigpOwotCQl9IGVsc2UgewotCQkJbGF5b3V0TWFuYWdlciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcihjb25maWcpOwotCQkJLy8gY2xvc3VyZSA9IG5ldyBDb25maWd1cmF0aW9uQ2xvc3VyZSh0aGlzLCBjb25maWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbWFuYWdlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uTWFuYWdlciNnZXRDb25maWd1cmF0aW9uRGF0YSgpCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25EYXRhIGdldENvbmZpZ3VyYXRpb25EYXRhKCkgewotCQlyZXR1cm4gY29uZmlnRGF0YTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeSBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbGlicmFyeU1hbmFnZXIuZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkgY29udGVudCBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBjb250ZW50IHByb3ZpZGVyCi0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIGFmY3A7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVwZW5kZW5jeSBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYSBkZXBlbmRlbmN5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIgZ2V0RGVwZW5kZW5jeU1hbmFnZXIoKSB7Ci0JCXJldHVybiBkZXBlbmRlbmN5TWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGxheW91dCBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWxlbWVudCBsYXlvdXQgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRFbGVtZW50TGF5b3V0TWFuYWdlcigpIHsKLQkJcmV0dXJuIGxheW91dE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb25maWd1cmF0aW9uIGNsb3N1cmUKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q29uZmlndXJhdGlvbkNsb3N1cmUoKSB7Ci0JCXJldHVybiBjbG9zdXJlOwotCX0KLQotCS8qKgotCSAqIE1ha2VzIGEgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VDb25maWd1cmF0aW9uQ2xvc3VyZSgpIHsKLQkJaWYgKGNsb3N1cmUgIT0gbnVsbCkgewotCQkJY2xvc3VyZS5maXhFcnJvcnMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucyBpbiB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RQbHVnaW5zKCkgewotCQlyZXR1cm4gbGlicmFyeS5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY29uZmlnRGF0YS5kaXNwb3NlKCk7Ci0JCWNvbmZpZ0RhdGEgPSBudWxsOwotCQljb25maWcgPSBudWxsOwotCQlsaWJyYXJ5ID0gbnVsbDsKLQkJbGlicmFyeU1hbmFnZXIgPSBudWxsOwotCQlkZXBlbmRlbmN5TWFuYWdlciA9IG51bGw7Ci0JCWxheW91dE1hbmFnZXIgPSBudWxsOwotCQljbG9zdXJlID0gbnVsbDsKLQkJY29uZmlnUHJvcHMgPSBudWxsOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0aW9uUHJvcGVydGllcyBnZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIGNvbmZpZ1Byb3BzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0NyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhMGQxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIExpYnJhcnkgTWFuYWdlciBpbnN0YW5jZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBleHRlbmRzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UgYW5kIHRoZSByb290IGNhdXNlIG9mIHRoZQotCSAqIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUNvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzMxZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uQ2xvc3VyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRWxlbWVudERlcGVuZGVuY3lFcnJvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24gQ2xvc3VyZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25DbG9zdXJlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbk1hbmFnZXIgZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRhaW5pbmluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHNlbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudHMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMKLQkgKi8KLQkvL3B1YmxpYyB2b2lkIHNldFNlbGVjdGlvbnMoT2JqZWN0W10gZWxlbWVudHMpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtZXRob2QgcGx1Zy1pbiBvciBwYWNrYWdlIGlzIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGVsZW1lbnQgaXMgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKE9iamVjdCBpbnB1dCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbGVtZW50IGRlcGVuZGVuY3kgZXJyb3IgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQGVsZW1lbnQgQSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+Ci0JICovCi0JcHVibGljIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0RXJyb3IoT2JqZWN0IGVsZW1lbnQpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNsb3N1cmUgaGFzIGFueSBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjbG9zdXJlIGhhcyBvbmUgb3IgbW9yZSBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcigpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNsb3N1cmUgaGFzIGFueSBwcm9ibGVtLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNsb3N1cmUgaGFzIG9uZSBvciBtb3JlIHByb2JsZW1zLlwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIDxjb2RlPkVycm9ySW5mbzwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBbGxFcnJvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBkZXBlbmRlbmN5IGVycm9ycy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5RXJyb3I8L2NvZGU+Ci0JICovCi0JcHVibGljIE9iamVjdFtdIGdldERlcGVuZGVuY3lFcnJvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBpbnZhbGlkIGVsZW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGludmFsaWQgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRJbnZhbGlkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBjaGFuZ2VkIGVsZW1lbnRzLiBUaGVzZSBhcmUgZWxlbWVudHMgd2hvc2UgY2hlY2sgc3RhdGVzCi0JICogaGF2ZSBjaGFuZ2VkIG9yIHdob3NlIGltYWdlIGhhdmUgY2hhbmdlZCBkdWUgdG8gZXJyb3IuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY2hhbmdlZCBtZXRob2QgZWxlbWVudHMKLQkgKi8KLQkvL3B1YmxpYyBMaXN0IGdldENoYW5nZWRFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcyBzZWxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldFNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogZml4IHRoZSBlcnJvcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgZml4RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiBGaXhlcyBhbGwgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUgY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQcm9ibGVtcygpOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqLwotCS8vcHVibGljIHZvaWQgc2F2ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFBhY2thZ2VzIHRoZSBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24uCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyB3aWxsIGNoYW5nZSB0aGUgY3VycmVudCBsaWJyYXJ5LiBCZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZCwgYQotCSAqIGNvcHkgb2YgdGhlIGN1cnJlbnQgbGlicmFyeSBzaG91bGQgYmUgY3JlYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0JICogMS4gQ3JlYXRlIGEgbmV3IDxjb2RlPkNvbmZpZ3VyYXRpb25NYW5hZ2VyPC9jb2RlPiB3aXRoIGEgY29weSBvZiB0aGUKLQkgKiBvcmlnaW5hbCBsaWJyYXJ5LCAyLiBSZWJ1aWxkIHRoZSBkZXBlbmRlbmN5LCAzLiBDcmVhdGUgYQotCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb25DbG9zdXJlPC9jb2RlPiB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHJlbW92ZUJyb2tlblJlZmVyZW5jZXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZW1vdmUgYWxsIGJyb2tlbiByZWZlcmVuY2VzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcGFja2FnZUxpYnJhcnkoYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIERpc3Bvc2VzIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lDb25maWd1cmF0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjVhYjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JQ29uZmlndXJhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5Db25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmUuRGVwZW5kZW5jeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBNZXRob2QgQ29uZmlndXJhdGlvbiBNYW5hZ2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJhdGlvbk1hbmFnZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbWFuYWdlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCi0JLyoqCi0JICogR2V0cyBDb25maWd1cmF0aW9uRGF0YSBvYmplY3QgbWFuYWdlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29uZmlndXJhdGlvbkRhdGEgb2JqZWN0Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25EYXRhIGdldENvbmZpZ3VyYXRpb25EYXRhKCk7Ci0JCi0JLyoqCi0JICogR2V0cyBDb25maWd1cmF0aW9uUHJvcGVydGllcyBvYmplY3QgbWFuYWdlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgb2JqZWN0Ci0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIGdldENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5IGZvciB0aGUgbWFuYWdlZCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBjb250ZW50IHByb3ZpZGVyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGNvbnRlbnQgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZXBlbmRlbmN5IG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBhIGRlcGVuZGVuY3kgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBEZXBlbmRlbmN5TWFuYWdlciBnZXREZXBlbmRlbmN5TWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWxlbWVudCBsYXlvdXQgbWFuYWdlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0RWxlbWVudExheW91dE1hbmFnZXIoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25DbG9zdXJlIGdldENvbmZpZ3VyYXRpb25DbG9zdXJlKCk7Ci0KLQkvKioKLQkgKiBNYWtlcyBhIGNvbmZpZ3VyYXRpb24gY2xvc3VyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYWtlQ29uZmlndXJhdGlvbkNsb3N1cmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIG1ldGhvZCBwbHVnLWlucyBpbiB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RQbHVnaW5zKCk7Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MGRkZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0lMaWJyYXJ5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5BZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHMuSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQcm9wZXJ0eUxpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgTGlicmFyeSBNYW5hZ2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeU1hbmFnZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZ3MpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeSBVUkkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShqYXZhLm5ldC5VUkkgdXJpKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogT3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYXJncwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoTWFwPFN0cmluZywgT2JqZWN0PiBhcmdzKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVvcGVucyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5NZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBEaXNjYXJkcyBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2NhcmRNZXRob2RMaWJyYXJ5Q2hhbmdlcygpOwotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEdldHMgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIEdldHMgdGhlIFVSSSBvZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+b3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgamF2YS5uZXQuVVJJIGdldE1ldGhvZExpYnJhcnlVUkkoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuIEZvciBkaXN0cmlidXRlZAotCSAqIGxpYnJhcnksIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB3b3Jrc3BhY2UgcGF0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2RMaWJyYXJ5TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhbiBhZGFwdGVyIGZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBnZXRBZGFwdGVyRmFjdG9yeSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZWRpdGluZyBkb21haW4gZm9yIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWRpdGluZyBkb21haW4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGdldEVkaXRpbmdEb21haW4oKTsKLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBlZGl0aW5nIGRvbWFpbiB3aXRoIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIGFuIGVkaXRpbmcgZG9tYWluCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbiBkb21haW4pOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIG1vbml0b3IgY2hhbmdlcyB0byB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIGNoYW5nZXMgdG8gdGhlIG1hbmFnZWQKLQkgKiBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgbGlicmFyeSBjaGFuZ2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIHJlc291cmNlIGNoYW5nZXMgaW4gdGhlIG1hbmFnZWQgbWV0aG9kCi0JICogbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlMaXN0ZW5lcihJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciByZXNvdXJjZSBjaGFuZ2VzIGluIHRoZSBtYW5hZ2VkIG1ldGhvZAotCSAqIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKElQcm9wZXJ0eUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFN0YXJ0cyBsaXN0ZW5pbmcgdG8gY29tbWFuZCBwcm9jZXNzaW5nIG9uIGEgY29tbWFuZCBzdGFjay4KLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydExpc3RlbmluZ1RvKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spOwotCi0JLyoqCi0JICogU3RvcHMgbGlzdGVuaW5nIHRvIGNvbW1hbmQgcHJvY2Vzc2luZyBvbiBhIGNvbW1hbmQgc3RhY2suCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spOwotCi0JLyoqCi0JICogU3RhcnRzIGxpc3RlbmluZyB0byBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBzZW50IGZyb20gYW4gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc3RhcnRMaXN0ZW5pbmdUbyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KTsKLQotCS8qKgotCSAqIFN0b3BzIGxpc3RlbmluZyB0byBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBzZW50IGZyb20gYW4gYWRhcHRlciBmYWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5Ci0JICovCi0JcHVibGljIHZvaWQgc3RvcExpc3RlbmluZ1RvKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpOwotCi0JLyoqCi0JICogR2V0cyBhIG1ldGhvZCBlbGVtZW50IGZyb20gdGhlIG1hbmFnZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGd1aWQKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgZWxlbWVudCdzIEdVSUQuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBlbGVtZW50IG9mIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChTdHJpbmcgZ3VpZCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBpcyByZWFkIG9ubHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgaXMgcmVhZCBvbmx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5IGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBjb250ZW50IGhhcwotCSAqICAgICAgICAgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kTGlicmFyeU1vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBoYXMgYW55IHVucmVzb2x2ZWQgcHJveHkuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeSBoYXMgYW4KLQkgKiAgICAgICAgIHVucmVzb2x2ZWQgcHJveHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzVW5yZXNvbHZlZFByb3h5KCk7Ci0KLQkvKioKLQkgKiBSZWxvYWRzIHRoZSBnaXZlbiByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlcwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcwotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0aGF0IGhhdmUgcmVsb2FkZWQKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVsb2FkUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcyk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHRpb25zIHVzZWQgZm9yIHNhdmluZyB0aGUgbWFuYWdlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIHNhdmUgb3B0aW9ucwotCSAqLwotCXB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFNhdmVPcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IG1ldGhvZCBwbHVnLWluIHRvIHRoZSBtYW5hZ2VkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIHBsdWdpbikKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIERpc3Bvc2VzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHRoaXMgbGlicmFyeSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHJlc291cmNlIG1hbmFnZXIgZm9yIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBtYW5hZ2VyIGZvciB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCi0JLyoqCi0JICogQmFja3VwIG1ldGhvZCBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAJCWJhY2t1cCBmb2xlciBmaWxlIHBhdGgJCi0JICovCi0JcHVibGljIHZvaWQgYmFja3VwTWV0aG9kTGlicmFyeShTdHJpbmcgcGF0aCk7Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgYSBsb2FkZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBnaXZlbiBsb2FkZWQgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcGFyYW0gcGFyYW1zCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIsIAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBVbnJlZ2lzdGVyIGEgcmVnaXN0ZXJlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1blJlZ2lzdGVyTWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVJlc291cmNlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDEyMjc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVJlc291cmNlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogaW50ZXJmYWNlIHRvIG1hbmFnZSBsaWJyYXJ5IHJlc291cmNlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVJlc291cmNlTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxvZ2ljYWwgcGF0aCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeSwKLQkgKiB0aGUgcGF0aCBzaG91bGQgc3RhcnQgd2l0aCB0aGUgcGx1Z2luIG5hbWUuIAotCSAqIGkuZS4gPHBsdWdpbiBuYW1lPi9wYXRoL3RvL2VsZW1lbnQKLQkgKiAKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3Mgc2hvdWxkIGVuY2Fwc3VsYXRlIHRoZSBwaHlzaWNhbCBzdG9yYWdlIAotCSAqIG9mIHRoZSByZXNvdXJjZSBhbmQgcmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBlbGVtZW50IHN0YXJ0IHdpdGggaXQncyBwbHVnaW4gbmFtZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9naWNhbFBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIGJhY2sgcGF0aCBvZiB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgbG9naWNhbCBwYXRoLCBmb3IgZXhhbXBsZSwKLQkgKiAiT3BlblVQXGd1aWRhbmNlXGNvbmNlcHRcYzEueG1sIiwgdGhlIGJhY2sgcGF0aCBpcyAiLi8uLi8uLi8uLi8iCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCQotCS8qKgotCSAqIGdldCB0aGUgbG9naWNhbCByZXNvdXJjZSBwYXRoIG9mIHRoZSBlbGVtZW50IGluIHRoZQotCSAqIGxpYnJhcnkuIHRoZSBwYXRoIHNob3VsZCBzdGFydCB3aXRoIHRoZSBwbHVnaW4gbmFtZS4gCi0JICogaS5lLiA8cGx1Z2luIG5hbWU+L3BhdGgvdG8vZWxlbWVudC9yZXNvdXJjZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvZ2ljYWxSZXNvdXJjZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBwaHlzaWNhbCBwYXRoIG9mIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBoeXNpY2FsIHBhdGggb2YgdGhlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBoeXNpY2FsUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgZm9sZGVyIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiB0aGUgcGh5c2ljYWwgcmVzb3VyY2UgcGF0aCBvZiB0aGUgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGh5c2ljYWxSZXNvdXJjZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdldCB0aGUgcGh5c2ljYWwgcGF0aCBvZiB0aGUgcGx1Z2luIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBoeXNpY2FsUGx1Z2luUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBsb2dpY2FsIHBhdGggb2YgdGhlIHBsdWdpbiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dpY2FsUGx1Z2luUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpOwotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBwaHlzaWNhbCBwYXRoIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbG9naWNhbCBwYXRoCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCBhbiBlbGVtZW50IGluIHRoZSBsaWJyYXJ5IHRvIGFjY2VzcyB0aGUgbGlicmFyeSByZXNvdXJjZQotCSAqIHVzdWFsbHkgdGhpcyBpcyB0aGUgb3duZXIgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhlIGxvZ2ljYWxQYXRoCi0JICogQHBhcmFtIGxvZ2ljYWxQYXRoIFN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBwaHlzaWNhbCBwYXRoIHJlc29sdmVkIGZyb20gdGhlIGxvZ2ljYWwgcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBsb2dpY2FsUGF0aCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg5Mjk1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgU2VydmljZSBBUEkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTGlicmFyeVNlcnZpY2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSBVUkkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTWV0aG9kTGlicmFyeShTdHJpbmcgdHlwZSwKLQkJCVVSSSB1cmkpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyB0eXBlLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIE9wZW5zIHRoZSBsYXN0IG9wZW5lZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBvcGVuTGFzdE9wZW5lZE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJlb3BlbnMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IHJlb3Blbk1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVvcGVucyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTYXZlcyBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2xvc2VzIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogPHA+Ci0JICogVGhpcyBhdXRvbWF0aWNhbGx5IGRpc3Bvc2VzIGl0cyBsaWJyYXJ5IG1hbmFnZXIgYW5kIHRoZSBjb25maWd1cmF0aW9uCi0JICogbWFuYWdlcnMgdGhhdCBtYW5hZ2UgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbiB0aGUgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTGlicmFyeQotCSAqICAgICAgICAgICAgdGhlIG9sZCBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBuZXdMaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgbmV3IG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZU1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBvbGRMaWJyYXJ5LAotCQkJTWV0aG9kTGlicmFyeSBuZXdMaWJyYXJ5KTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0aGF0IHdhcyBhZGRlZCB0byBtb25pdG9yIExpYnJhcnkgU2VydmljZSBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBhIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBsb2NhdGlvbiBwYXRoLgotCSAqIDxwPgotCSAqIE5vdGU6IEEgZmlsZS1iYXNlZCBtZXRob2QgbGlicmFyeSBtYXkgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlicmFyeSBtYW5hZ2VyIGZvciBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0TGlicmFyeU1hbmFnZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCXB1YmxpYyB2b2lkIHNldExpYnJhcnlNYW5hZ2VyKElMaWJyYXJ5TWFuYWdlciBsaWJNZ3IpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlicmFyeU1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIGxpYk1ncik7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsaWJyYXJ5IG1hbmFnZXIgZm9yIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaWJyYXJ5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlNYW5hZ2VyIGdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgbmV3IG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBjb250YWluaW5nIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbihTdHJpbmcgbmFtZSwKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VycyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VyIGZvciB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1hbmFnZXIoKTsKLQkKLQkvKioKLQkgKiBSZWdpc3RlciBhIGxvYWRlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGxvYWRlZCBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSBwYXJhbXMKLQkgKiAgICAgICAgICAgIG1ldGhvZCBsaWJyYXJ5IHNwZWNpZmljIGFyZ3VtZW50cwotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkICByZWdpc3Rlck1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyB0eXBlLAotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBVbnJlZ2lzdGVyIGEgcmVnaXN0ZXJlZCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIHJlZ2lzdGVyZWQgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB1blJlZ2lzdGVyTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYikgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJmZWM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBMaWJyYXJ5IFNlcnZpY2UgbGlzdGVuZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHdoZW4gYSBtZXRob2QgbGlicmFyeSBoYXMgYmVlbiBvcGVuZWQuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIHJlb3BlbmVkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeVJlb3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBsaWJyYXJ5IGhhcyBiZWVuIGNsb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KTsKLQotCS8qKgotCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiB3aGVuIGEgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gc2V0IGFzIHRoZSBjdXJyZW50Ci0JICogbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSk7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gd2hlbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uIGhhcyBiZWVuIHNldCBhcyB0aGUKLQkgKiBjdXJyZW50IG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uU2V0KE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0ludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0ludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzNmNmFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9JbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5OwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIG1ldGhvZCBlbGVtZW50IG5hbWUgaXMgaW52YWxpZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24gZXh0ZW5kcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEludmFsaWRNZXRob2RFbGVtZW50TmFtZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihyb290Q2F1c2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBJbnZhbGlkTWV0aG9kRWxlbWVudE5hbWVFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSW52YWxpZE1ldGhvZEVsZW1lbnROYW1lRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywKLQkJCVRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTcxMTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5QWxyZWFkeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgTWV0aG9kIExpYnJhcnkgYWxyZWFkeSBleGlzdHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24gZXh0ZW5kcyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlBbHJlYWR5RXhpc3RzRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlIGFuZCB0aGUgcm9vdCBjYXVzZSBvZiB0aGUKLQkgKiBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeUFscmVhZHlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnLCBUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKGVycm9yTXNnLCByb290Q2F1c2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlNYW5hZ2VyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlNYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmRlMDczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5TWFuYWdlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmludGVybmFsLkxpYnJhcnlNYW5hZ2VyRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuU2VydmljZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBjcmVhdGlvbiBvZiBMaWJyYXJ5IE1hbmFnZXIgaW5zdGFuY2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlNYW5hZ2VyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWVzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FID0gImxpYnJhcnlNYW5hZ2VycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQl9OQU1FID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICJ0eXBlIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQl9OQU1FID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgInR5cGVOYW1lIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUVfQVRUUklCX05BTUUgPSAidHlwZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9BVFRSSUJfTkFNRSA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5TWFuYWdlckZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCi0JLy8gQSBtYXAgb2YgbGlicmFyeSBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaWJyYXJ5TWFuYWdlckVsZW1lbnQ+IGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpYnJhcnlNYW5hZ2VyRWxlbWVudD4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpYnJhcnlNYW5hZ2VyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeU1hbmFnZXJGYWN0b3J5LmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeU1hbmFnZXJGYWN0b3J5KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTGlicmFyeU1hbmFnZXJGYWN0b3J5KCkgewotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkvLyBQcm9jZXNzIHRoZSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIiBleHRlbnNpb24gcG9pbnQKLQkJLy8gY29udHJpYnV0b3JzLgotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludCgKLQkJCQlFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShDTEFTU19BVFRSSUJfTkFNRSk7Ci0JCQkJCQlTdHJpbmcgdHlwZUlkID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKFRZUEVfQVRUUklCX05BTUUpOwotCQkJCQkJU3RyaW5nIHR5cGVOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKFRZUEVfTkFNRV9BVFRSSUJfTkFNRSk7Ci0JCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgdHlwZUlkICE9IG51bGwgJiYgdHlwZUlkLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgdHlwZU5hbWUgIT0gbnVsbAotCQkJCQkJCQkmJiB0eXBlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7CQkJCQkJCQotCQkJCQkJCWludCB2ZXJzaW9uID0gU2VydmljZXMucGFyc2VWZXJzaW9uKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKFZFUlNJT05fQVRUUklCX05BTUUpKTsKLQkJCQkJCQlMaWJyYXJ5TWFuYWdlckVsZW1lbnQgcHJvdmlkZXIgPSBsaWJyYXJ5TWFuYWdlckVsZW1lbnRzLmdldCh0eXBlSWQpOwotCQkJCQkJCWlmKHByb3ZpZGVyID09IG51bGwgfHwgcHJvdmlkZXIuZ2V0VmVyc2lvbigpIDwgdmVyc2lvbikgewotCQkJCQkJCQlwcm92aWRlciA9IG5ldyBMaWJyYXJ5TWFuYWdlckVsZW1lbnQoCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIHR5cGVJZCwgdHlwZU5hbWUsIHZlcnNpb24pOwotCQkJCQkJCQlsaWJyYXJ5TWFuYWdlckVsZW1lbnRzLnB1dCh0eXBlSWQsIHByb3ZpZGVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlicmFyeSBtYW5hZ2VyIGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEByZXR1cm4gYSBsaWJyYXJ5IG1hbmFnZXIKLQkgKiBAdGhyb3cgPGNvZGU+Q3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycwotCSAqICAgICAgICB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlNYW5hZ2VyIGNyZWF0ZUxpYnJhcnlNYW5hZ2VyKFN0cmluZyB0eXBlKQotCQkJdGhyb3dzIENyZWF0ZUxpYnJhcnlNYW5hZ2VyRXhjZXB0aW9uIHsKLQkJTGlicmFyeU1hbmFnZXJFbGVtZW50IHByb3ZpZGVyID0gKExpYnJhcnlNYW5hZ2VyRWxlbWVudCkgbGlicmFyeU1hbmFnZXJFbGVtZW50cwotCQkJCS5nZXQodHlwZSk7Ci0JCWlmIChwcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0cnkgewotCQkJQ2xhc3MgY2xhenogPSBwcm92aWRlci5nZXRCdW5kbGUoKS5sb2FkQ2xhc3MoCi0JCQkJCXByb3ZpZGVyLmdldENsYXNzTmFtZSgpKTsKLQkJCXJldHVybiAoSUxpYnJhcnlNYW5hZ2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl0aHJvdyBuZXcgQ3JlYXRlTGlicmFyeU1hbmFnZXJFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgbGlicmFyeSB0eXBlcyByZWdpc3RlcmVkIHZpYSB0aGUKLQkgKiAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGlicmFyeU1hbmFnZXJzIiBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBsaWJyYXJ5IHR5cGVzCi0JICovCi0JcHVibGljIE1hcCBnZXRMaWJyYXJ5VHlwZXMoKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gdHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpYnJhcnlNYW5hZ2VyRWxlbWVudHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHR5cGVJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyB0eXBlTmFtZSA9ICgoTGlicmFyeU1hbmFnZXJFbGVtZW50KSBsaWJyYXJ5TWFuYWdlckVsZW1lbnRzCi0JCQkJCS5nZXQodHlwZUlkKSkuZ2V0VHlwZU5hbWUoKTsKLQkJCXR5cGVzLnB1dCh0eXBlSWQsIHR5cGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhODlmMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgTWV0aG9kIExpYnJhcnkgY2Fubm90IGJlIGxvY2F0ZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5Tm90Rm91bmRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlCi0JICogZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2csIFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIoZXJyb3JNc2csIHJvb3RDYXVzZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJhY2QwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLkFic3RyYWN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIExpYnJhcnkgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RBY3RpdmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9QQVRIID0gImxheW91dC8iOyAvLyROT04tTkxTLTEkOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX1hTTF9QQVRIID0gImxheW91dC94c2wvIjsgLy8kTk9OLU5MUy0xJDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0NTU19QQVRIID0gImxheW91dC9jc3MvIjsgLy8kTk9OLU5MUy0xJDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9TQ1JJUFRTX0ZPTERFUiA9ICJzY3JpcHRzIjsgLy8kTk9OLU5MUy0xJDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9TQ1JJUFRTX1BBVEggPSAibGF5b3V0L3NjcmlwdHMvIjsgLy8kTk9OLU5MUy0xJDsKLQotCS8vIFRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5UGx1Z2luIHBsdWdpbjsKLQotCXByaXZhdGUgU3RyaW5nIGxheW91dFBhdGgsIGxheW91dFhzbFBhdGgsIGxheW91dENzc1BhdGg7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoc3VwZXIuZ2V0SW5zdGFsbFVSTCgpLCBMQVlPVVRfUEFUSCk7Ci0JCQlsYXlvdXRQYXRoID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQotCQkJdXJsID0gbmV3IFVSTChzdXBlci5nZXRJbnN0YWxsVVJMKCksIExBWU9VVF9YU0xfUEFUSCk7Ci0JCQlsYXlvdXRYc2xQYXRoID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQotCQkJdXJsID0gbmV3IFVSTChzdXBlci5nZXRJbnN0YWxsVVJMKCksIExBWU9VVF9DU1NfUEFUSCk7Ci0JCQlsYXlvdXRDc3NQYXRoID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCi0JCUxheW91dFJlc291cmNlcy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF5b3V0UGF0aCgpIHsKLQkJcmV0dXJuIGxheW91dFBhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXlvdXRYc2xQYXRoKCkgewotCQlyZXR1cm4gbGF5b3V0WHNsUGF0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExheW91dENzc1BhdGgoKSB7Ci0JCXJldHVybiBsYXlvdXRDc3NQYXRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkN2QzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5UmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlicmFyeVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGliVXBncmFkZVJlcXVpcmVkX2Vycl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb2xkVG9vbFZlcnNpb25fZXJyX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b29sVmVyc2lvbk1pc21hdGNoX2Vycl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5rbm93bl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVtcHR5TGlicmFyeVBhdGhFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0xpYnJhcnlGaWxlRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucmVzb2x2ZWRQcm94eUVycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdDbG9zdXJlV2FybmluZ19tc2cxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc3VwcG9ydGVkR3VpZGFuY2VUeXBlRXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRHdWlkYW5jZUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXZlQ29udmVydGVkR3VpZGFuY2VFcnJvcl9tc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEFjdGl2aXR5RXJyb3JfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhdmVDb252ZXJ0ZWRBY3Rpdml0eUVycm9yX21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zdXBwb3J0ZWRHdWlkYW5jZVR5cGVFcnJvcl9yZWFzb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZExpYnJhcnlQYXRoRXJyb3JfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdWxkTm90TG9ja0xpYnJhcnlfcmVhc29uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlpbmdBdHRhY2htZW50c1Rhc2tfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEd1aWRhbmNlRGlhbG9nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tsaXN0X3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2VwdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4YW1wbGVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBndWlkZWxpbmVfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzdGltYXRpbmdNZXRyaWNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvcnRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0ZW1wbGF0ZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cHBvcnRpbmdNYXRlcmlhbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvb2xNZW50b3JfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aGl0ZXBhcGVyX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGVybURlZmluaXRpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmFjdGljZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldXNhYmxlQXNzZXRfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUxheW91dF9wcmltYXJ5VGFza3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkUmVzb3VyY2VzRXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9hZFJlc291cmNlc0Vycm9yX3JlYXNvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByb2xlRGlhZ3JhbVBlcmZvcm1zX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0c0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW1wb3J0RXhwb3J0VXRpbF9NU0c4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEltcG9ydEV4cG9ydFV0aWxfTVNHOTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmtub3duR3VpZGFuY2VfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb3B5QXR0YWNobWVudHNUb05ld0xvY2F0aW9uX2xvZ19ub0NvbnRlbnRQYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpYnJhcnlNb2RpZmljYXRpb25IZWxwZXJfY2Fubm90VXBkYXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdhcm5pbmdEbGdfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEbGdfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JEbGdfc2F2ZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX2phOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX2phOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX2tvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX2tvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3poOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX3poOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3poX1RXOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX3poX1RXOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtRm9udF9zaXplX3dpbjMyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVEaWFncmFtX3hNYXJnaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1feFNwYWNpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm9sZURpYWdyYW1feVNwYWNpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aXZpdHlEaWFncmFtTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhY3Rpdml0eURldGFpbERpYWdyYW1OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdwRGVwZW5kZW5jeURpYWdyYW1OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbG9uX3dpdGhfc3BhY2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX21pc3NpbmdfZWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfY29udHJpYnV0b3JfbWlzc2luZ19iYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9leHRlbmRlcl9taXNzaW5nX2Jhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX3JlcGxhY2VyX21pc3NpbmdfYmFzZTsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX21pc3NpbmdfcHJpbWFyeV9wZXJmb3JtZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudEVycm9yX21pc3NpbmdfbWFuZGF0b3J5X2lucHV0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRFcnJvcl9taXNzaW5nX291dHB1dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbGVtZW50RXJyb3JfbWlzc2luZ19yZXNwb25zaWJsZV9mb3Jfd29ya1Byb2R1Y3Q7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya1Byb2R1Y3RTbG90X3RleHQ7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTGlicmFyeVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNzk3ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS51dGlscy5Db21tYW5kTGluZVJ1blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IExpYnJhcnkgU2VydmljZSBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2UgaW1wbGVtZW50cyBJTGlicmFyeVNlcnZpY2UgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfQ1JFQVRFX0xJQlJBUlkgPSAxOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfT1BFTl9MSUJSQVJZID0gMjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1JFT1BFTl9MSUJSQVJZID0gMzsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEVWRU5UX0NMT1NFX0xJQlJBUlkgPSA0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfU0VUX0NVUlJFTlRfTElCUkFSWSA9IDU7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFVkVOVF9TRVRfQ1VSUkVOVF9DT05GSUdVUkFUSU9OID0gNjsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJvdGVjdGVkIHN0YXRpYyBJTGlicmFyeVNlcnZpY2UgaW5zdGFuY2U7Ci0KLQkvLyBBIG1hcCBvZiBtZXRob2QgbGlicmFyaWVzIHRvIGxpYnJhcnkgbWFuYWdlcnMuCi0JcHJvdGVjdGVkIE1hcDxNZXRob2RMaWJyYXJ5LCBJTGlicmFyeU1hbmFnZXI+IGxpYnJhcnlNYW5hZ2VycyA9IG5ldyBIYXNoTWFwPE1ldGhvZExpYnJhcnksIElMaWJyYXJ5TWFuYWdlcj4oKTsKLQotCS8vIEEgbWFwIG9mIG1ldGhvZCBjb25maWd1cmF0aW9ucyB0byBjb25maWd1cmF0aW9uIG1hbmFnZXJzLgotCXByb3RlY3RlZCBNYXA8TWV0aG9kQ29uZmlndXJhdGlvbiwgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyPiBjb25maWdNYW5hZ2VycyA9IG5ldyBIYXNoTWFwPE1ldGhvZENvbmZpZ3VyYXRpb24sIElDb25maWd1cmF0aW9uTWFuYWdlcj4oKTsKLQotCS8vIFRoZSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXJzLgotCXByb3RlY3RlZCBMaXN0PElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPigpOwotCi0JLy8gVGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgY3VycmVudExpYnJhcnk7Ci0KLQkvLyBUaGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnOwotCi0JLy8gSWYgdHJ1ZSwgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaXMgYmVpbmcgY2xvc2VkLgotCXByaXZhdGUgYm9vbGVhbiBjbG9zaW5nQ3VycmVudExpYnJhcnk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJTGlicmFyeVNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKExpYnJhcnlTZXJ2aWNlLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgTGlicmFyeVNlcnZpY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBMaWJyYXJ5U2VydmljZSgpIHsKLQkJaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gSW5pdGlhbGl6ZSB0aGUgbGlicmFyeSBtYW5hZ2VyIGZhY3RvcnkgdG8gcHJlLXByb2Nlc3MgdGhlCi0JCS8vICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludC4KLQkJTGlicmFyeU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0KLQkJaWYgKENvbW1hbmRMaW5lUnVuVXRpbC5nZXRJbnN0YW5jZSgpLmlzTmVlZFRvUnVuKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGxpYnJhcnkgdHlwZQotCSAqIEBwYXJhbSBhcmdzCi0JICogICAgICAgICAgICBtZXRob2QgbGlicmFyeSBzcGVjaWZpYyBhcmd1bWVudHMKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwKLQkJCU1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsIHx8IHR5cGUgPT0gbnVsbCB8fCBwYXJhbXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJYm9vbGVhbiByZW9wZW5MaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpICE9IG51bGw7Ci0KLQkJdHJ5IHsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCi0JCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5jcmVhdGVMaWJyYXJ5TWFuYWdlcih0eXBlKTsKLQkJCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IG1hbmFnZXIuY3JlYXRlTWV0aG9kTGlicmFyeShuYW1lLCBwYXJhbXMpOwotCQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJCS8vIG9wZW4gbmV3bHkgY3JlYXRlZCBtZXRob2QgbGlicmFyeSB3aXRob3V0IHNlbmRpbmcgb3V0IG5vdGlmaWNhdGlvbgotCQkJCS8vCi0JCQkJbGlicmFyeSA9IG1hbmFnZXIub3Blbk1ldGhvZExpYnJhcnkobWFuYWdlci5nZXRNZXRob2RMaWJyYXJ5VVJJKCkpOwotCi0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5aW5nIHRoZSBsaWJyYXJ5Ci0JCQkJLy8gbGlzdGVuZXJzLgotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJCQlzYXZlTWV0aG9kTGlicmFyeVByZWZlcmVuY2VzKG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLAotCQkJCQkJdHlwZSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfQ1JFQVRFX0xJQlJBUlkpOwkJCQkJCQkJCi0JCQl9Ci0KLQkJCXJlb3BlbkxpYnJhcnkgPSBmYWxzZTsKLQotCQkJcmV0dXJuIGxpYnJhcnk7Ci0JCX0gY2F0Y2ggKExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVvcGVuTGlicmFyeSkgewotCQkJCW9wZW5MYXN0T3BlbmVkTWV0aG9kTGlicmFyeSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5NZXRob2RMaWJyYXJ5KFN0cmluZyB0eXBlLCBVUkkgdXJpKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTGlicmFyeU1hbmFnZXIodHlwZSk7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBtYW5hZ2VyLm9wZW5NZXRob2RMaWJyYXJ5KHVyaSk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5aW5nIHRoZSBsaWJyYXJ5Ci0JCQkJLy8gbGlzdGVuZXJzLgotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJCQlzYXZlTWV0aG9kTGlicmFyeVByZWZlcmVuY2VzKG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLAotCQkJCQkJdHlwZSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfT1BFTl9MSUJSQVJZKTsKLQkJCX0KLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYW4gZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgbGlicmFyeSB0eXBlCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgbWV0aG9kIGxpYnJhcnkgc3BlY2lmaWMgYXJndW1lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgb3Blbk1ldGhvZExpYnJhcnkoU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKHBhcmFtcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKQotCQkJCQkuY3JlYXRlTGlicmFyeU1hbmFnZXIodHlwZSk7Ci0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBtYW5hZ2VyLm9wZW5NZXRob2RMaWJyYXJ5KHBhcmFtcyk7Ci0JCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCQkvLyBTZXQgdGhlIGN1cnJlbnQgbGlicmFyeSwgZG8gdGhpcyBiZWZvcmUgbm90aWZ5aW5nIHRoZSBsaWJyYXJ5Ci0JCQkJLy8gbGlzdGVuZXJzLgotCQkJCXNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KGxpYnJhcnkpOwotCi0JCQkJLy8gU2F2ZSB0aGUgbGlicmFyeSBVUkkgYW5kIHR5cGUgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkJCQlzYXZlTWV0aG9kTGlicmFyeVByZWZlcmVuY2VzKG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeVVSSSgpLAotCQkJCQkJdHlwZSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfT1BFTl9MSUJSQVJZKTsKLQkJCX0KLQkJCXJldHVybiBsaWJyYXJ5OwotCQl9IGNhdGNoIChDcmVhdGVMaWJyYXJ5TWFuYWdlckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIGxhc3Qgb3BlbmVkIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IG9wZW5MYXN0T3BlbmVkTWV0aG9kTGlicmFyeSgpIHsKLQkJU3RyaW5nIHNhdmVkTWV0aG9kTGlicmFyeVVSSSA9IExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoKTsKLQkJdHJ5IHsKLQkJCVVSSSB1cmkgPSBuZXcgVVJJKHNhdmVkTWV0aG9kTGlicmFyeVVSSSk7Ci0JCQlpZiAodXJpLmdldFBhdGgoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyB0eXBlID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUoKTsKLQkJCWlmICh0eXBlID09IG51bGwgfHwgdHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBvcGVuTWV0aG9kTGlicmFyeSh0eXBlLCB1cmkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nV2FybmluZygKLQkJCQkJIlVuYWJsZSB0byBvcGVuIHRoZSBsYXN0IG9wZW5lZCBtZXRob2QgbGlicmFyeSAnIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBzYXZlZE1ldGhvZExpYnJhcnlVUkkgKyAiJy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlicmFyeVByZWZlcmVuY2VzLnNldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW9wZW5zIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5NZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVtb3ZlTGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0JCQkJbGlicmFyeSA9IG1hbmFnZXIucmVvcGVuTWV0aG9kTGlicmFyeSgpOwotCi0JCQkJLy8gUmUtcmVnaXN0ZXIgdGhlIGxpYnJhcnkgbWFuYWdlciBzaW5jZSB0aGUgbGlicmFyeSBpbnN0YW5jZQotCQkJCS8vIHdpbGwgYmUgY2hhbmdlZC4KLQkJCQlzZXRMaWJyYXJ5TWFuYWdlcihtYW5hZ2VyKTsKLQotCQkJCS8vIFNldCB0aGUgY3VycmVudCBsaWJyYXJ5LCBkbyB0aGlzIGJlZm9yZSBub3RpZnlpbmcgdGhlIGxpYnJhcnkKLQkJCQkvLyBsaXN0ZW5lcnMuCi0JCQkJc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0KLQkJCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfUkVPUEVOX0xJQlJBUlkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmVvcGVucyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAdGhyb3cgPGNvZGU+TGlicmFyeVNlcnZpY2VFeGNlcHRpb248L2NvZGU+IGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZQotCSAqICAgICAgICBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSByZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gcmVvcGVuTWV0aG9kTGlicmFyeShjdXJyZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TGlicmFyeU1hbmFnZXIobGlicmFyeSk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuc2F2ZU1ldGhvZExpYnJhcnkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVDdXJyZW50TWV0aG9kTGlicmFyeSgpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCXNhdmVNZXRob2RMaWJyYXJ5KGN1cnJlbnRMaWJyYXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeS4KLQkgKiA8cD4KLQkgKiBUaGlzIGF1dG9tYXRpY2FsbHkgZGlzcG9zZXMgaXRzIGxpYnJhcnkgbWFuYWdlciBhbmQgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBtYW5hZ2VycyB0aGF0IG1hbmFnZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIGluIHRoZSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYnJhcnkpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQlub3RpZnlMaXN0ZW5lcnMobGlicmFyeSwgRVZFTlRfQ0xPU0VfTElCUkFSWSk7Ci0JCQltYW5hZ2VyLmNsb3NlTWV0aG9kTGlicmFyeSgpOwotCQkJaWYgKGN1cnJlbnRMaWJyYXJ5ID09IGxpYnJhcnkpIHsKLQkJCQlzZXRDdXJyZW50TWV0aG9kTGlicmFyeShudWxsKTsKLQkJCQlzZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbihudWxsKTsKLQkJCX0KLQkJCXJlbW92ZUxpYnJhcnlNYW5hZ2VyKG1hbmFnZXIpOwotCQkJbWFuYWdlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHRocm93IDxjb2RlPkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uPC9jb2RlPiBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUKLQkgKiAgICAgICAgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKQotCQkJdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJaWYgKGNsb3NpbmdDdXJyZW50TGlicmFyeSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWNsb3NpbmdDdXJyZW50TGlicmFyeSA9IHRydWU7Ci0JCQlpZiAoY3VycmVudExpYnJhcnkgIT0gbnVsbCkgewotCQkJCWNsb3NlTWV0aG9kTGlicmFyeShjdXJyZW50TGlicmFyeSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQljbG9zaW5nQ3VycmVudExpYnJhcnkgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VzIGEgdGhlIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBvbGRMaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgb2xkIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG5ld0xpYnJhcnkKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBsYWNlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG9sZExpYnJhcnksCi0JCQlNZXRob2RMaWJyYXJ5IG5ld0xpYnJhcnkpIHsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRMaWJyYXJ5TWFuYWdlcihvbGRMaWJyYXJ5KTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmVtb3ZlTGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0KLQkJCS8vIFNldCB0aGUgbmV3IGxpYnJhcnkgaW5zdGFuY2UgdG8gcHJldmVudCB0aGUgbGlicmFyeSBtYW5hZ2VyIGZyb20KLQkJCS8vIHJlZmVyZW5jaW5nIHRoZSBvbGQgbGlicmFyeSBpbnN0YW5jZS4KLQkJCW1hbmFnZXIuc2V0TWV0aG9kTGlicmFyeShuZXdMaWJyYXJ5KTsKLQotCQkJc2V0TGlicmFyeU1hbmFnZXIobWFuYWdlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gbW9uaXRvciBMaWJyYXJ5IFNlcnZpY2UgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgdGhhdCB3YXMgYWRkZWQgdG8gbW9uaXRvciBMaWJyYXJ5IFNlcnZpY2UgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgYSBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gY3VycmVudExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQljdXJyZW50TGlicmFyeSA9IGxpYnJhcnk7Ci0JCW5vdGlmeUxpc3RlbmVycyhsaWJyYXJ5LCBFVkVOVF9TRVRfQ1VSUkVOVF9MSUJSQVJZKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5IGxvY2F0aW9uIHBhdGguCi0JICogPHA+Ci0JICogTm90ZTogQSBmaWxlLWJhc2VkIG1ldGhvZCBsaWJyYXJ5IG1heSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdXJyZW50TWV0aG9kTGlicmFyeUxvY2F0aW9uKCkgewotCQlJTGlicmFyeU1hbmFnZXIgbWFuYWdlciA9IGdldExpYnJhcnlNYW5hZ2VyKGN1cnJlbnRMaWJyYXJ5KTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeUxvY2F0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBsaWJyYXJ5IG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgSUxpYnJhcnlNYW5hZ2VyIGdldExpYnJhcnlNYW5hZ2VyKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gKElMaWJyYXJ5TWFuYWdlcikgbGlicmFyeU1hbmFnZXJzLmdldChsaWJyYXJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaWJyYXJ5TWFuYWdlcihJTGlicmFyeU1hbmFnZXIgbGliTWdyKSB7Ci0JCWlmIChsaWJNZ3IgIT0gbnVsbCkgewotCQkJTWV0aG9kTGlicmFyeSBsaWIgPSBsaWJNZ3IuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJaWYgKGxpYiAhPSBudWxsKSB7Ci0JCQkJcmVtb3ZlQ29uZmlndXJhdGlvbk1hbmFnZXJzKGxpYik7Ci0JCQkJbGlicmFyeU1hbmFnZXJzLnJlbW92ZShsaWIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeU1hbmFnZXIoSUxpYnJhcnlNYW5hZ2VyIGxpYk1ncikgewotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IGxpYk1nci5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgIT0gbnVsbCkgewotCQkJbGlicmFyeU1hbmFnZXJzLnB1dChsaWIsIGxpYk1ncik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgbWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBhIGxpYnJhcnkgbWFuYWdlcgotCSAqLwotCXB1YmxpYyBJTGlicmFyeU1hbmFnZXIgZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCkgewotCQlyZXR1cm4gZ2V0TGlicmFyeU1hbmFnZXIoY3VycmVudExpYnJhcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqIEB0aHJvdyA8Y29kZT5MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbjwvY29kZT4gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlCi0JICogICAgICAgIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oU3RyaW5nIG5hbWUsCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwgfHwgbGlicmFyeSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChuYW1lLmVxdWFscyhjb25maWcuZ2V0TmFtZSgpKSkgewotCQkJCXRocm93IG5ldyBDb25maWd1cmF0aW9uQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0KLQkJY29uZmlnID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQljb25maWcuc2V0TmFtZShuYW1lKTsKLQkJY29uZmlncy5hZGQoY29uZmlnKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JCi0JLyoqCi0JICogR2V0cyB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50TWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbnRDb25maWc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY3VycmVudENvbmZpZyA9IGNvbmZpZzsKLQkJbm90aWZ5TGlzdGVuZXJzKGNvbmZpZywgRVZFTlRfU0VUX0NVUlJFTlRfQ09ORklHVVJBVElPTik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VyIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDb25maWd1cmF0aW9uTWFuYWdlcigKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUlDb25maWd1cmF0aW9uTWFuYWdlciBtYW5hZ2VyID0gKElDb25maWd1cmF0aW9uTWFuYWdlcikgY29uZmlnTWFuYWdlcnMKLQkJCQkuZ2V0KGNvbmZpZyk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpIHsKLQkJCW1hbmFnZXIgPSBuZXcgQ29uZmlndXJhdGlvbk1hbmFnZXIoY29uZmlnKTsKLQkJCWNvbmZpZ01hbmFnZXJzLnB1dChjb25maWcsIG1hbmFnZXIpOwotCQl9Ci0JCXJldHVybiBtYW5hZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIG1nciA9IChJQ29uZmlndXJhdGlvbk1hbmFnZXIpIGNvbmZpZ01hbmFnZXJzCi0JCQkJLnJlbW92ZShjb25maWcpOwotCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCW1nci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmF0aW9uTWFuYWdlcnMoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKGxpYnJhcnkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCXJlbW92ZUNvbmZpZ3VyYXRpb25NYW5hZ2VyKGNvbmZpZ3NbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBtYW5hZ2VyIGZvciB0aGUgY3VycmVudCBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJhdGlvbiBtYW5hZ2VyCi0JICovCi0JcHVibGljIElDb25maWd1cmF0aW9uTWFuYWdlciBnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChjdXJyZW50Q29uZmlnICE9IG51bGwpIHsKLQkJCXJldHVybiBnZXRDb25maWd1cmF0aW9uTWFuYWdlcihjdXJyZW50Q29uZmlnKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZW5kcyBhIG1ldGhvZCBsaWJyYXJ5IHJlbGF0ZWQgZXZlbnQgdG8gYWxsIGxpYnJhcnkgc2VydmljZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGZpbmFsIE1ldGhvZExpYnJhcnkgbGlicmFyeSwgaW50IGV2ZW50SWQpIHsKLQkJZm9yIChJdGVyYXRvcjxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4gaXQgPSBuZXcgQXJyYXlMaXN0PElMaWJyYXJ5U2VydmljZUxpc3RlbmVyPigKLQkJCQlsaXN0ZW5lcnMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWZpbmFsIElMaWJyYXJ5U2VydmljZUxpc3RlbmVyIGxpc3RlbmVyID0gaXQubmV4dCgpOwotCQkJc3dpdGNoIChldmVudElkKSB7Ci0JCQljYXNlIEVWRU5UX0NSRUFURV9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlDcmVhdGVkKGxpYnJhcnkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVWRU5UX09QRU5fTElCUkFSWToKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0ZW5lci5saWJyYXJ5T3BlbmVkKGxpYnJhcnkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVWRU5UX1JFT1BFTl9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlSZW9wZW5lZChsaWJyYXJ5KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVkVOVF9DTE9TRV9MSUJSQVJZOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWxpc3RlbmVyLmxpYnJhcnlDbG9zZWQobGlicmFyeSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVZFTlRfU0VUX0NVUlJFTlRfTElCUkFSWToKLQkJCQlTYWZlVXBkYXRlQ29udHJvbGxlci5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsaXN0ZW5lci5saWJyYXJ5U2V0KGxpYnJhcnkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZW5kcyBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHJlbGF0ZWQgZXZlbnQgdG8gYWxsIGxpYnJhcnkgc2VydmljZQotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGludCBldmVudElkKSB7Ci0JCWZvciAoSXRlcmF0b3I8SUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXI+IGl0ID0gbmV3IEFycmF5TGlzdDxJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcj4oCi0JCQkJbGlzdGVuZXJzKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlmaW5hbCBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lciA9IGl0Lm5leHQoKTsKLQkJCXN3aXRjaCAoZXZlbnRJZCkgewotCQkJY2FzZSBFVkVOVF9TRVRfQ1VSUkVOVF9DT05GSUdVUkFUSU9OOgotCQkJCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbGlzdGVuZXIuY29uZmlndXJhdGlvblNldChjb25maWcpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbWV0aG9kIGxpYnJhcnkgVVJJIGFuZCB0eXBlIHRvIHByZWZlcmVuY2Ugc3RvcmUuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgdGhlIG1ldGhvZCBsaWJyYXJ5IFVSSQotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgbWVudGhvZCBsaWJyYXJ5IHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlTWV0aG9kTGlicmFyeVByZWZlcmVuY2VzKFVSSSB1cmksIFN0cmluZyB0eXBlKSB7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcy5zZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkodXJpLnRvU3RyaW5nKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0U2F2ZWRNZXRob2RMaWJyYXJ5VHlwZSh0eXBlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlI3JlZ2lzdGVyTWV0aG9kTGlicmFyeShvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnksIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIHZvaWQgIHJlZ2lzdGVyTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHR5cGUsCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJLy9Gb3Igbm93LCBzdGlsbCBzaW1wbHkgd3JhcGluZyB1cCBvbGQgaW1wbGVtZW50YXRpb24gKGNvcGllZCBmcm9tIENvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlKSBmb3Igc21vb3RoZXIgY2hhbmdlOyB3aWxsIGRlZmluZXRseSBjaGFuZ2UgbGF0ZXIKLQkJLy9zbyB0aGF0IGNyZWF0aW5nIGEgbmV3IGxpYiB3b3VsZCBub3QgYmUgbmVlZGVkCQkKLQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IExpYnJhcnlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgpCi0JCQkuY3JlYXRlTGlicmFyeU1hbmFnZXIodHlwZSk7Ci0JCWxpYk1nci5yZWdpc3Rlck1ldGhvZExpYnJhcnkobGliLCBwYXJhbXMpOwotCQkvL2xpYk1nci5jcmVhdGVNZXRob2RMaWJyYXJ5KG5hbWUsIHBhcmFtcyk7Ci0JCS8vbGliTWdyLnNldE1ldGhvZExpYnJhcnkobGliKTsKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRMaWJyYXJ5TWFuYWdlcihsaWJNZ3IpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2UjdW5SZWdpc3Rlck1ldGhvZExpYnJhcnkob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIHVuUmVnaXN0ZXJNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQkvL0ZvciBub3csIHN0aWxsIHNpbXBseSB3cmFwaW5nIHVwIG9sZCBpbXBsZW1lbnRhdGlvbiAoY29waWVkIGZyb20gQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UpIGZvciBzbW9vdGhlciBjaGFuZ2UKLQkJSUxpYnJhcnlNYW5hZ2VyIGxpYk1nciA9IGdldExpYnJhcnlNYW5hZ2VyKGxpYik7Ci0JCWlmIChsaWJNZ3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXJlbW92ZUxpYnJhcnlNYW5hZ2VyKGxpYk1ncik7Ci0JCS8vbGliTWdyLmNsb3NlTWV0aG9kTGlicmFyeSgpOwotCQlsaWJNZ3IudW5SZWdpc3Rlck1ldGhvZExpYnJhcnkoKTsKLQkJbGliTWdyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhOTMyMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBMaWJyYXJ5IFNlcnZpY2Ugb3BlcmF0aW9uIGhhcyBmYWlsZWQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihlcnJvck1zZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZSBhbmQgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlCi0JICogZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZywgVGhyb3dhYmxlIHJvb3RDYXVzZSkgewotCQlzdXBlcihlcnJvck1zZywgcm9vdENhdXNlKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkMjJiYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvTGlicmFyeVNlcnZpY2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEEgZGVmYXVsdCBsaWJyYXJ5IHNlcnZpY2UgbGlzdGVuZXIuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgaW1wbGVtZW50cyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2NvbmZpZ3VyYXRpb25TZXQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyI2xpYnJhcnlDbG9zZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5KQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5Q3JlYXRlZChvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkpCi0JICovCi0JcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5T3BlbmVkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5T3BlbmVkKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIjbGlicmFyeVJlb3BlbmVkKG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lciNsaWJyYXJ5U2V0KG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlVXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L0xpYnJhcnlTZXJ2aWNlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzRjYzY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9MaWJyYXJ5U2VydmljZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uTWV0aG9kQ29uZmlndXJhdGlvbkVsZW1lbnRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIGFjY2Vzc2luZyBhbmQgbWFuYWdpbmcgYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZVV0aWwgewotCi0JLy8gQSBjaGVja2xpc3QgZmlsdGVyLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWx0ZXIgQ0hFQ0tMSVNUX0ZJTFRFUiA9IG5ldyBJRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENoZWNrbGlzdDsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGxpYnJhcnkKLQkgKiBAcmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kTGlicmFyeVBhdGgoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVJlc291cmNlIHJlc291cmNlID0gbGlicmFyeS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCVVSSSByZXNvdXJjZVVSSSA9IHJlc291cmNlLmdldFVSSSgpOwotCQkJaWYgKHJlc291cmNlVVJJICE9IG51bGwgJiYgcmVzb3VyY2VVUkkuaXNGaWxlKCkpIHsKLQkJCQlTdHJpbmcgcGF0aCA9IHJlc291cmNlVVJJLnRvRmlsZVN0cmluZygpOwotCQkJCXJldHVybiBuZXcgRmlsZShwYXRoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYW4gYWJzb2x1dGUgcGF0aCB0byB0aGUgbWV0aG9kIGxpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSB7Ci0JCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5UGF0aChMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBtZXRob2QgbGlicmFyeSBvZiBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1ldGhvZCBsaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZvciAoRU9iamVjdCBvYmogPSBlbGVtZW50OyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZExpYnJhcnkpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3BlY2lmaWMgbWV0aG9kIGNvbmZpZ3VyYXRpb24gaW4gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gbmFtZQotCSAqIEByZXR1cm4gYSBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKAotCQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5LCBTdHJpbmcgbmFtZSkgewotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29uZmlncyA9IGxpYnJhcnkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpOwotCQkJZm9yIChJdGVyYXRvcjxNZXRob2RDb25maWd1cmF0aW9uPiBpdCA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaXQKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQljb25maWcgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCEoY29uZmlnIGluc3RhbmNlb2YgUHJvY2Vzc0ZhbWlseSkKLQkJCQkJCSYmIGNvbmZpZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBjb25maWc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbnMgaW4gYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgYSBtZXRob2QgbGlicmFyeQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWV0aG9kIGNvbmZpZ3VyYXRpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RDb25maWd1cmF0aW9uW10gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoCi0JCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzOwotCQlpZiAobGlicmFyeSAhPSBudWxsKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkJCWNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KGxpYnJhcnkKLQkJCQkJLmdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kQ29uZmlndXJhdGlvbj4gaSA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IGkubmV4dCgpOwotCQkJCWlmIChjb25maWcgPT0gbnVsbCB8fCBjb25maWcgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KSB7Ci0JCQkJCWkucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJY29uZmlncyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbltdIHJlc3VsdCA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uW2NvbmZpZ3Muc2l6ZSgpXTsKLQkJY29uZmlncy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmFtZXMgb2YgYWxsIG1ldGhvZCBjb25maWd1cmF0aW9ucyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbk5hbWVzKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlMaXN0PFN0cmluZz4gY29uZmlnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaWYgKGxpYnJhcnkgIT0gbnVsbCkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbmZpZ3MgPSBsaWJyYXJ5Ci0JCQkJCS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kQ29uZmlndXJhdGlvbj4gaSA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCWNvbmZpZyA9IChNZXRob2RDb25maWd1cmF0aW9uKSBpLm5leHQoKTsKLQkJCQlpZiAoIShjb25maWcgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KSkgewotCQkJCQljb25maWdOYW1lcy5hZGQoY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY29uZmlnTmFtZXMuc2l6ZSgpXTsKLQkJY29uZmlnTmFtZXMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBwcm9jZXNzZXMgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4gYW5kCi0JICogICAgICAgIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcDxTdHJpbmcsIFByb2Nlc3M+IHJlc3VsdCA9IG5ldyBUcmVlTWFwPFN0cmluZywgUHJvY2Vzcz4oKTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbAotCQkJCS5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gaS5uZXh0KCk7Ci0JCQlTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5QYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGg7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKAotCQkJCQltZXRob2RQbHVnaW4sIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSkgbWV0aG9kUGFja2FnZSwKLQkJCQkJCQlyZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBkZWxpdmVyeVByb2Nlc3NQYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQlkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIGNhcGFiaWxpdHkgcGF0dGVybnMgaW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFByb2Nlc3M+IGdldENhcGFiaWxpdHlQYXR0ZXJucygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcDxTdHJpbmcsIFByb2Nlc3M+IHJlc3VsdCA9IG5ldyBUcmVlTWFwPFN0cmluZywgUHJvY2Vzcz4oKTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBsdWdpbj4gaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gaS5uZXh0KCk7Ci0JCQlTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5QYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGg7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKAotCQkJCQltZXRob2RQbHVnaW4sIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJucyBpbiBhIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dW4gYSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKAotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbikgewotCQlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBjYXBhYmlsaXR5UGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPigpOwotCQlMaXN0PFByb2Nlc3M+IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzPiBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvY2VzcyA9IGl0Lm5leHQoKTsKLQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4pIHsKLQkJCQljYXBhYmlsaXR5UGF0dGVybnMuYWRkKChDYXBhYmlsaXR5UGF0dGVybikgcHJvY2Vzcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgUHJvY2Vzcz4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXA8U3RyaW5nLCBQcm9jZXNzPiByZXN1bHQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFByb2Nlc3M+KCk7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IGkubmV4dCgpOwotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKAotCQkJCQltZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGluIGEgbWV0aG9kIHBsdWctaW4uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1biBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxEZWxpdmVyeVByb2Nlc3M+IGdldERlbGl2ZXJ5UHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJTGlzdDxEZWxpdmVyeVByb2Nlc3M+IGRlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdDxEZWxpdmVyeVByb2Nlc3M+KCk7Ci0JCUxpc3Q8UHJvY2Vzcz4gaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3M+IGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUHJvY2VzcyBwcm9jZXNzID0gaXQubmV4dCgpOwotCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQlkZWxpdmVyeVByb2Nlc3Nlcy5hZGQoKERlbGl2ZXJ5UHJvY2VzcykgcHJvY2Vzcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc2VzOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSBjYXBhYmlsaXR5IHBhdHRlcm5zIGluIGEgcHJvY2VzcyBwYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzUGFja2FnZQotCSAqICAgICAgICAgICAgYSBwcm9jZXNzIHBhY2thZ2UKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogICAgICAgICAgICBhIG1hcAotCSAqIEByZXR1cm4gYW4gdXBkYXRlZCBtYXAgY29udGFpbmluZyBhIGNvbGxlY3Rpb24gb2YKLQkgKiAgICAgICAgIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXRDYXBhYmlsaXR5UGF0dGVybnMoUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UsCi0JCQlNYXA8U3RyaW5nLCBQcm9jZXNzPiByZXN1bHQpIHsKLQkJTGlzdDxNZXRob2RQYWNrYWdlPiBjaGlsZFBhY2thZ2VzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBhY2thZ2U+IGkgPSBjaGlsZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBpLm5leHQoKTsKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHBrZzsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcyA9IHByb2Nlc3NDb21wb25lbnQKLQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKSBwa2csIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIGluIGEgcHJvY2VzcyBwYWNrYWdlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzUGFja2FnZQotCSAqICAgICAgICAgICAgYSBwcm9jZXNzIHBhY2thZ2UKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogICAgICAgICAgICBhIG1hcAotCSAqIEByZXR1cm4gYW4gdXBkYXRlZCBtYXAgY29udGFpbmluZyBhIGNvbGxlY3Rpb24gb2YKLQkgKiAgICAgICAgIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UsCi0JCQlNYXA8U3RyaW5nLCBQcm9jZXNzPiByZXN1bHQpIHsKLQkJTGlzdDxNZXRob2RQYWNrYWdlPiBjaGlsZFBhY2thZ2VzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZFBhY2thZ2U+IGkgPSBjaGlsZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGFja2FnZSBwa2cgPSBpLm5leHQoKTsKLQkJCWlmIChwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHBrZzsKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcHJvY2VzcyA9IHByb2Nlc3NDb21wb25lbnQKLQkJCQkJCS5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzLmdldE5hbWUoKTsKLQkJCQkJcmVzdWx0LnB1dChuYW1lLCBwcm9jZXNzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKSBwa2csIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lcyBvZiBhbGwgcHJvY2VzcyBmYW1pbGllcyBpbiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBwcm9jZXNzIGZhbWlseSBuYW1lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UHJvY2Vzc0ZhbWlseU5hbWVzKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlMaXN0PFN0cmluZz4gcHJvY2Vzc0ZhbWlseU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlmIChsaWJyYXJ5ICE9IG51bGwpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kQ29uZmlndXJhdGlvbj4gaSA9IGNvbmZpZ3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGkubmV4dCgpOwotCQkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBQcm9jZXNzRmFtaWx5KSB7Ci0JCQkJCXByb2Nlc3NGYW1pbHlOYW1lcy5hZGQoY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1twcm9jZXNzRmFtaWx5TmFtZXMuc2l6ZSgpXTsKLQkJcHJvY2Vzc0ZhbWlseU5hbWVzLnRvQXJyYXkocmVzdWx0KTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCBjb250ZXh0cyAobWV0aG9kIGNvbmZpZ3VyYXRpb25zKSBhc3NpZ25lZCB0byBhCi0JICogcHJvY2Vzcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGV4dCAobWV0aG9kIGNvbmZpZ3VyYXRpb24pIG5hbWVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb250ZXh0cyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbnRleHROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7Ci0JCQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kQ29uZmlndXJhdGlvbj4gaXQgPSBjb250ZXh0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gaXQubmV4dCgpOwotCQkJCWNvbnRleHROYW1lcy5hZGQoY29udGV4dC5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY29udGV4dE5hbWVzLnNpemUoKV07Ci0JCWNvbnRleHROYW1lcy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyBhc3NpZ25lZCB0byBhIHByb2Nlc3MuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3MKLQkgKiAgICAgICAgICAgIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5NZXRob2RDb25maWd1cmF0aW9uPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTWV0aG9kQ29uZmlndXJhdGlvbj4gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbnMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwPFN0cmluZywgTWV0aG9kQ29uZmlndXJhdGlvbj4gcmVzdWx0ID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBNZXRob2RDb25maWd1cmF0aW9uPigpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoZGVmYXVsdENvbnRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnB1dChkZWZhdWx0Q29udGV4dC5nZXROYW1lKCksIGRlZmF1bHRDb250ZXh0KTsKLQkJfQotCi0JCUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gY29udGV4dHMgPSBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZENvbmZpZ3VyYXRpb24+IGkgPSBjb250ZXh0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29udGV4dCA9IGkubmV4dCgpOwotCQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5wdXQoY29udGV4dC5nZXROYW1lKCksIGNvbnRleHQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgY2hlY2tsaXN0cyBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiA8Y29kZT5DaGVja2xpc3Q8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBDaGVja2xpc3Q+IGdldENoZWNrbGlzdHMoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwPFN0cmluZywgQ2hlY2tsaXN0PiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENoZWNrbGlzdD4oKTsKLQotCQlBcnJheUxpc3Q8SUZpbHRlcj4gZmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SUZpbHRlcj4oKTsKLQkJZmlsdGVyTGlzdC5hZGQoQ0hFQ0tMSVNUX0ZJTFRFUik7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25FbGVtZW50TGlzdCBlbGVtZW50TGlzdCA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uRWxlbWVudExpc3QoCi0JCQkJY29uZmlnLCBmaWx0ZXJMaXN0KTsKLQkJTGlzdCBlbGVtZW50cyA9IGVsZW1lbnRMaXN0LmdldExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ2hlY2tsaXN0KSB7Ci0JCQkJQ2hlY2tsaXN0IGNoZWNrbGlzdCA9IChDaGVja2xpc3QpIG9iajsKLQkJCQlyZXN1bHQucHV0KGNoZWNrbGlzdC5nZXROYW1lKCksIGNoZWNrbGlzdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEdVSUQgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHVUlEKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZ3VpZCA9IGVsZW1lbnQuZ2V0R3VpZCgpOwotCQlpZiAoZ3VpZCA9PSBudWxsIHx8IGd1aWQubGVuZ3RoKCkgPT0gMCkgewotCQkJZ3VpZCA9IEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKTsKLQkJCWJvb2xlYW4gb2xkTm90aWZ5ID0gZWxlbWVudC5lRGVsaXZlcigpOwotCQkJdHJ5IHsKLQkJCQllbGVtZW50LmVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQllbGVtZW50LnNldEd1aWQoZ3VpZCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWVsZW1lbnQuZVNldERlbGl2ZXIob2xkTm90aWZ5KTsKLQkJCX0KLQkJfQotCi0JCUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCAmJiBjaGlsZHJlbi5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBjaGlsZCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCXNldEdVSUQoKE1ldGhvZEVsZW1lbnQpIGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWJ1ZyBzdHJpbmcgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1ldGhvZCBlbGVtZW50IGNsYXNzIG5hbWUsIG5hbWUgYW5kIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWJ1Z1N0cmluZyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltuYW1lOiAiICsgZWxlbWVudC5nZXROYW1lKCkgLy8kTk9OLU5MUy0xJAotCQkJCSsgIiwgZ3VpZD0iICsgZWxlbWVudC5nZXRHdWlkKCkgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJTGlicmFyeVBlcnNpc3RlciBnZXRDdXJyZW50UGVyc2lzdGVyKCkgewotCQl0cnkgewotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKS5nZXRFZGl0aW5nRG9tYWluKCkKLQkJCQkJLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJTGlicmFyeVJlc291cmNlU2V0KSB7Ci0JCQkJcmV0dXJuICgoSUxpYnJhcnlSZXNvdXJjZVNldCkgcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlcigpOwotCQkJfQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyIGZvciBhIGdpdmVuIHJlc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gYSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlckZvcihSZXNvdXJjZSByZXNvdXJjZSkgewotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCXJldHVybiAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpIHJlc291cmNlU2V0KS5nZXRQZXJzaXN0ZXIoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBuZXcgcGx1Zy1pbgotCSAqIEBwYXJhbSBicmllZkRlc2MKLQkgKiAgICAgICAgICAgIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoZSBuZXcgcGx1Zy1pbgotCSAqIEBwYXJhbSBhdXRob3JzCi0JICogICAgICAgICAgICB0aGUgYXV0aG9ycyBvZiB0aGUgbmV3IHBsdWctaW4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlZFBsdWdpbnMKLQkgKiAgICAgICAgICAgIHRoZSBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoZSBuZXcgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGNyZWF0ZU1ldGhvZFBsdWdpbihTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBicmllZkRlc2MsIFN0cmluZyBhdXRob3JzLCBPYmplY3RbXSByZWZlcmVuY2VkUGx1Z2lucykKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCi0JCXBsdWdpbi5zZXROYW1lKFN0clV0aWwubWFrZVZhbGlkRmlsZU5hbWUobmFtZSkpOwotCQlpZiAoYnJpZWZEZXNjICE9IG51bGwpIHsKLQkJCXBsdWdpbi5zZXRCcmllZkRlc2NyaXB0aW9uKGJyaWVmRGVzYyk7Ci0JCX0KLQkJaWYgKGF1dGhvcnMgIT0gbnVsbCkgewotCQkJcGx1Z2luLnNldEF1dGhvcnMoYXV0aG9ycyk7Ci0JCX0KLQkJaWYgKHJlZmVyZW5jZWRQbHVnaW5zICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlZFBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlNZXRob2RQbHVnaW4gcmVmZXJlbmNlZFBsdWdpbiA9IChNZXRob2RQbHVnaW4pIHJlZmVyZW5jZWRQbHVnaW5zW2ldOwotCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQlwbHVnaW4uZ2V0QmFzZXMoKS5hZGQocmVmZXJlbmNlZFBsdWdpbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJTW9kZWxTdG9yYWdlLmluaXRpYWxpemUocGx1Z2luKTsKLQotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWViN2NmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCRUdJTiBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBSb2xlIGRpYWdyYW0gZm9udHMgYW5kIGxheW91dAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWU9QXJpYWwKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX2phPVx1MzBjMFx1MzBhNFx1MzBhMlx1MzBlZFx1MzBiMAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfa289XHViMzAwXHVkNjU0IFx1YzBjMVx1Yzc5MAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfemg9XHU1YmY5XHU4YmRkXHU2ODQ2Ci0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV96aF9UVz1EaWFsb2cKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyPUFyaWFsCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl9qYT1NUyBHb3RoaWMKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX2tvPVx1YWQ3NFx1YjliY1x1Y2NiNAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1Gb250X25hbWVfd2luMzJfemg9XHU5ZWQxXHU0ZjUzCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMl96aF9UVz1cdTdkMzBcdTY2MGVcdTlhZDQKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtRm9udF9zaXplPTEwCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbUZvbnRfc2l6ZV93aW4zMj0xMAotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotcm9sZURpYWdyYW1feE1hcmdpbj0yMDAKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXJvbGVEaWFncmFtX3hTcGFjaW5nPTcwCi0jICEhIERPIE5PVCBUUkFOU0xBVEUgVEhFIEZPTExPV0lORyBMSU5FICEhCi1yb2xlRGlhZ3JhbV95U3BhY2luZz0zMAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBFTkQgTk8gVFJBTlNMQVRJT04KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXVua25vd25fdGV4dD1Vbmtub3duCi0KLSMgRXJyb3IgUmVhc29ucwotZW1wdHlMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1UaGUgbWV0aG9kIGxpYnJhcnkgcGF0aCBpcyBlbXB0eS4KLW1pc3NpbmdMaWJyYXJ5RmlsZUVycm9yX3JlYXNvbj1UaGUgbWV0aG9kIGxpYnJhcnkgbW9kZWwgZmlsZSBpcyBtaXNzaW5nLgotdW5yZXNvbHZlZFByb3h5RXJyb3JfcmVhc29uPVRoZSBzZWxlY3RlZCBtZXRob2QgbGlicmFyeSBjb250YWlucyB1bnJlc29sdmVkIGVsZW1lbnQgcmVmZXJlbmNlcy4gVGhpcyBpcyB1c3VhbGx5IGNhdXNlZCBieSBtaXNzaW5nIG9yIGRpc3BsYWNlZCBYTUkgZmlsZXMgaW4gdGhlIGxpYnJhcnkgZm9sZGVyLlxuXG5DbG9zZSB0aGlzIGRpYWxvZyBhbmQgYnJpbmcgdXAgdGhlIFByb2JsZW1zIHZpZXcgdG8gaGVscCBpZGVudGlmeSB0aGUgdW5yZXNvbHZlZCByZWZlcmVuY2VzLiBUbyBhdm9pZCBjb3JydXB0aW5nIHRoZSBsaWJyYXJ5LCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3UgcmVzb2x2ZSB0aGVzZSByZWZlcmVuY2VzIGZpcnN0IGJlZm9yZSBhZGRpbmcgbW9yZSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5LgotCi0jIFdhcm5pbmcgTWVzc2FnZXMKLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE9SVVQTDAwMDdXOiBPbmUgb3IgbW9yZSBjaGlsZCBlbGVtZW50cyBjb250YWluIG1pc3NpbmcgcmVmZXJlbmNlcwotY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMj1JVVBMMDAwOFc6IFRoaXMgZWxlbWVudCBzaG91bGQgYmUgc2VsZWN0ZWQgdG8gcmVzb2x2ZSBvbmUgb3IgbW9yZSBtaXNzaW5nIHJlZmVyZW5jZXMKLWNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzM9SVVQTDAwMDlXOiBUaGlzIGVsZW1lbnQgcmVmZXJlbmNlcyBvbmUgb3IgbW9yZSBlbGVtZW50cyBpbiBhbiB1bnNlbGVjdGVkIHBhY2thZ2UKLQotRWxlbWVudEVycm9yX21pc3NpbmdfZWxlbWVudD0nJ3swfScnIHJlZmVyZW5jZXMgdW5zZWxlY3RlZCBlbGVtZW50ICcnezF9JycKLUVsZW1lbnRFcnJvcl9jb250cmlidXRvcl9taXNzaW5nX2Jhc2U9Jyd7MH0nJyBjb250cmlidXRlcyB0byB1bnNlbGVjdGVkIGVsZW1lbnQgJyd7MX0nJwotRWxlbWVudEVycm9yX2V4dGVuZGVyX21pc3NpbmdfYmFzZT0nJ3swfScnIGV4dGVuZHMgdW5zZWxlY3RlZCBlbGVtZW50ICcnezF9JycKLUVsZW1lbnRFcnJvcl9yZXBsYWNlcl9taXNzaW5nX2Jhc2U9Jyd7MH0nJyByZXBsYWNlcyB1bnNlbGVjdGVkIGVsZW1lbnQgJyd7MX0nJwotRWxlbWVudEVycm9yX21pc3NpbmdfcHJpbWFyeV9wZXJmb3JtZXI9Jyd7MH0nJyBtaXNzaW5nIHByaW1hcnkgcGVyZm9ybWVyICcnezF9JycKLUVsZW1lbnRFcnJvcl9taXNzaW5nX21hbmRhdG9yeV9pbnB1dD0nJ3swfScnIG1pc3NpbmcgbWFuZGF0b3J5IGlucHV0ICcnezF9JycKLUVsZW1lbnRFcnJvcl9taXNzaW5nX291dHB1dD0nJ3swfScnIG1pc3Npbmcgb3V0cHV0ICcnezF9JycKLUVsZW1lbnRFcnJvcl9taXNzaW5nX3Jlc3BvbnNpYmxlX2Zvcl93b3JrUHJvZHVjdD0nJ3swfScnIG1pc3NpbmcgcmVzcG9uc2libGUgZm9yIHdvcmsgcHJvZHVjdCAnJ3sxfScnCi0KLSMgRXJyb3IgTWVzc2FnZXMKLWxvYWRSZXNvdXJjZXNFcnJvcl9tc2c9SVVQTDAwMDBFOiBUaGUgbWV0aG9kIGxpYnJhcnkgaGFzIGJlZW4gbG9hZGVkIGJ1dCBzb21lIGVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQuCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX21zZz1JVVBMMDAwMUU6IFRoaXMgZ3VpZGFuY2UgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbm90aGVyIHR5cGUuCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl9tc2c9SVVQTDAwMDJFOiBUaGlzIGd1aWRhbmNlIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHRhcmdldCB0eXBlLgotc2F2ZUNvbnZlcnRlZEd1aWRhbmNlRXJyb3JfbXNnPUlVUEwwMDAzRTogVGhlIGNvbnZlcnRlZCBndWlkYW5jZSAnJ3swfScnIGNhbm5vdCBiZSBzYXZlZC4KLQotIyBDb252ZXJ0IGFjdGl2aXR5Ci1jb252ZXJ0QWN0aXZpdHlFcnJvcl90aXRsZT1Db252ZXJ0IEFjdGl2aXR5IFR5cGUgRXJyb3IKLWNvbnZlcnRBY3Rpdml0eUVycm9yX21zZz1JVVBMMDAwNkU6IFRoaXMgYWN0aXZpdHkgY2Fubm90IGJlIGNvbnZlcnRlZCB0byB0aGUgdGFyZ2V0IHR5cGUuCi1zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2c9SVVQTDAwMDdFOiBUaGUgY29udmVydGVkIGFjdGl2aXR5ICcnezB9JycgY2Fubm90IGJlIHNhdmVkLgotCi0jIEVycm9yIFJlYXNvbnMKLWVycm9yX3JlYXNvbj1JVVBMMDAwNEU6IEFuIGVycm9yIGhhcyBvY2N1cnJlZC4gQ2xpY2sgT0sgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi11bnN1cHBvcnRlZEd1aWRhbmNlVHlwZUVycm9yX3JlYXNvbj1UaGVyZSBpcyBubyBjb21wYXRpYmxlIGd1aWRhbmNlIHR5cGUgZm9yIHswfS4KLWludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbj1JbnZhbGlkIGxpYnJhcnkgcGF0aC4gVGhlIC5wcm9qZWN0IGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQuCi1jb3VsZE5vdExvY2tMaWJyYXJ5X3JlYXNvbj1Db3VsZCBub3QgbG9jayBsaWJyYXJ5LgotCi0jIFByb2dyZXNzIE1lc3NhZ2VzCi1jb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWU9Q29weWluZyBhdHRhY2htZW50cy4uLgotCi0jIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGl0bGU9Q29udmVydCBHdWlkYW5jZSBUeXBlCi1jb252ZXJ0R3VpZGFuY2VEaWFsb2dfdGV4dD1TZWxlY3QgdGhlIHRhcmdldCBndWlkYW5jZSB0eXBlLgotCi0jIEd1aWRhbmNlIHR5cGUgbmFtZXMgZm9yIENvbnZlcnQgR3VpZGFuY2UgRGlhbG9nCi1jaGVja2xpc3RfdGV4dD1DaGVja2xpc3QKLWNvbmNlcHRfdGV4dD1Db25jZXB0Ci1leGFtcGxlX3RleHQ9RXhhbXBsZQotZ3VpZGVsaW5lX3RleHQ9R3VpZGVsaW5lCi1lc3RpbWF0ZV90ZXh0PUVzdGltYXRlCi1lc3RpbWF0aW5nTWV0cmljX3RleHQ9RXN0aW1hdGluZyBNZXRyaWMKLWVzdGltYXRpb25Db25zaWRlcmF0aW9uc190ZXh0PUVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLXJlcG9ydF90ZXh0PVJlcG9ydAotdGVtcGxhdGVfdGV4dD1UZW1wbGF0ZQotc3VwcG9ydGluZ01hdGVyaWFsX3RleHQ9U3VwcG9ydGluZyBNYXRlcmlhbAotdG9vbE1lbnRvcl90ZXh0PVRvb2wgTWVudG9yCi13aGl0ZXBhcGVyX3RleHQ9V2hpdGVwYXBlcgotdGVybURlZmluaXRpb25fdGV4dD1UZXJtIERlZmluaXRpb24KLXByYWN0aWNlX3RleHQ9UHJhY3RpY2UKLXJldXNhYmxlQXNzZXRfdGV4dD1SZXVzYWJsZSBBc3NldAotCi0jYWN0aXZpdHkgYnJlYWtkb3duIGluZm8gc3RyaW5ncwotQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQ9UGVyZm9ybXMgYXMgT3duZXIKLUFjdGl2aXR5TGF5b3V0X2FkZGl0aW9uYWxUYXNrc190ZXh0PVBlcmZvcm1zIGFzIEFkZGl0aW9uYWwKLQotIyBDb252ZXJ0IEd1aWRhbmNlIEVycm9yIE1lc3NhZ2VzCi1jb252ZXJ0R3VpZGFuY2VFcnJvcl90aXRsZT1Db252ZXJ0IEd1aWRhbmNlIFR5cGUgRXJyb3IKLQotIyBMb2FkIFJlc291cmNlcyBFcnJvciBEaWFsb2cKLWxvYWRSZXNvdXJjZXNFcnJvcl90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yCi1sb2FkUmVzb3VyY2VzRXJyb3JfcmVhc29uPVNvbWUgbGlicmFyeSByZXNvdXJjZXMgY291bGQgbm90IGJlIGxvYWRlZC5cblxuQ2xpY2sgRGV0YWlscyB0byByZXZpZXcgdGhlIGVycm9ycyBhbmQgcmVzb2x2ZSB0aGVtIGJlZm9yZSBhZGRpbmcgbW9yZSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJ5LgotCi0jIFJvbGUgRGlhZ3JhbXMKLXJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dD1wZXJmb3Jtcwotcm9sZURpYWdyYW1SZXNwb25zaWJsZUZvcl90ZXh0PXJlc3BvbnNpYmxlIGZvcgotCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cwPVJlZmVyZW5jZWQgZWxlbWVudDogezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxPUluZm86IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHND1XYXJuaW5nOiB7MH0KLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzc9RXJyb3I6IHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTA9TWlzc2luZyByZWZlcmVuY2VkIGVsZW1lbnQgezB9Ci1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxMT1VbmFibGUgdG8gZmluZCBlbGVtZW50IGZvciBndWlkIHswfQotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTI9RmlsZSAnJ3swfScnIHJlZmVyZW5jZXMgbWlzc2luZyByZXNvdXJjZSAnJ3sxfScnCi1EZWZhdWx0Q29udGVudFZhbGlkYXRvcl9NU0cxNT1taXNzaW5nIHJlc291cmNlIGZpbGUgJyd7MH0nJwotRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTc9VW5hYmxlIHRvIGNvbm5lY3QgdG8gVVJMICcnezB9JycKLURlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzE5PVVuYWJsZSB0byBjb25uZWN0IHRvIFVSTCAnJ3swfScnOiB7MX0KLUltcG9ydEV4cG9ydFV0aWxfTVNHOD1Db3VsZCBub3QgZmluZCBmaWxlICcnezB9JycuCi1JbXBvcnRFeHBvcnRVdGlsX01TRzk9Q291bGQgbm90IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5ICcnezB9JycuCi11bmtub3duR3VpZGFuY2VfdGV4dD1Vbmtub3duCi0KLUNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGg9Q29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5IYW5kbGVBdHRhY2htZW50c1BsdWdpbjogbm8gY29udGVudFBhdGggZm9yIHswfQotTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcl9jYW5ub3RVcGRhdGU9SVVQTDAwMDZXOiBDYW5ub3QgdXBkYXRlIHswfSB7MX0KLXdhcm5pbmdEbGdfdGl0bGU9V2FybmluZwotZXJyb3JEbGdfdGl0bGU9RXJyb3IKLWVycm9yRGxnX3NhdmVFcnJvcj1JVVBMMDAwNUU6IEVycm9yIHNhdmluZyBjaGFuZ2VzIHRvIGZpbGUgJyd7MH0nJwotCi0jIGFjdGl2aXR5IGRpYWdyYW0gbmFtZXMKLWFjdGl2aXR5RGlhZ3JhbU5hbWU9QWN0aXZpdHkgZGlhZ3JhbTogezB9Ci1hY3Rpdml0eURldGFpbERpYWdyYW1OYW1lPUFjdGl2aXR5IGRldGFpbCBkaWFncmFtOiB7MH0KLXdwRGVwZW5kZW5jeURpYWdyYW1OYW1lPVdvcmsgcHJvZHVjdCBkZXBlbmRlbmN5IGRpYWdyYW06IHswfQotCi0jIGxvY2FsaXplIHRoZSB2YWx1ZSBiYXNlZCBvbiBsb2NhbGUuICBmb3IgZXhhbXBsZSwgCi0jIGZvciBFbmdsaXNoLCB0aGUgdmFsdWUgaXMgIi4gIgotI2NvbG9uX3dpdGhfc3BhY2U9OiAKLSMgZm9yIEZyZW5jaCwgdGhlIHZhbHVlIGlzICIgLiAiLCB5b3UgbmVlZCB0byB1c2UgYSBcIHRvIHByZXNlcnZlIHRoZSBsZWFkaW5nIHNwYWNlCi0jY29sb25fd2l0aF9zcGFjZT1cIDogCi0jIGZvciBDaGluZXNlLCB0aGUgY29sb24gc2hvdWxkIGJlIGRvdWJsZSBieXRlcwotIyBEb24ndCB0cmltIHRoZSBzcGFjZXMgYWZ0ZXIgdGhlIGNvbG9uLgotY29sb25fd2l0aF9zcGFjZT06IAotCi1vbGRUb29sVmVyc2lvbl9lcnJfbXNnPVRoaXMgdmVyc2lvbiBvZiB7MH0gaXMgbm90IGNvbXBhdGlibGUgd2l0aCB5b3VyIGxpYnJhcnkgZmlsZSAnJ3syfScnLiBZb3UgbXVzdCB1cGdyYWRlIHswfSB0byB2ZXJzaW9uIHsxfSBvciBoaWdoZXIgaW4gb3JkZXIgdG8gb3BlbiBpdC4KLXRvb2xWZXJzaW9uTWlzbWF0Y2hfZXJyX21zZz1UaGlzIHZlcnNpb24gb2YgezB9IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggeW91ciBsaWJyYXJ5IGZpbGUgJyd7Mn0nJy4gWW91IG11c3QgdXBncmFkZSB7MH0gdG8gYSBoaWdoZXIgdmVyc2lvbiBpbiBvcmRlciB0byBvcGVuIGl0LgotbGliVXBncmFkZVJlcXVpcmVkX2Vycl9tc2c9VGhlIHNwZWNpZmllZCBsaWJyYXJ5IG5lZWRzIHRvIGJlIHVwZ3JhZGVkIHRvIHRoZSBuZXcgbGlicmFyeSBzdHJ1Y3R1cmUuIE9wZW4gdGhlIGxpYnJhcnkgdG8gdXBncmFkZSBpdCBhbmQgdHJ5IGFnYWluLgotCi1Xb3JrUHJvZHVjdFNsb3RfdGV4dD1Xb3JrIFByb2R1Y3QgU2xvdAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9BY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9BY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZmQwYTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5WYXJpYWJpbGl0eUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBBIGNvbmZpZ3VyYXRvciB1c2VkIGJ5IGFjdGl2aXR5IGRlZXAgY29weSBjb21tYW5kIHRvIHJlc292bGUgYW5kIGRlZXAgY29weSBjb250cmlidXRvcnMgYW5kCi0gKiByZXBsYWNlcnMgb2YgYWN0aXZpdHkgaW4gYSBtZXRvaGQgY29uZmlndXJhdGlvbi4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkZpbHRlcnsKLQotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZyBhIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+Ci0JICogQHBhcmFtIHZpZXdlciBhIDxjb2RlPlZpZXdlcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZWVwQ29weUNvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIHdpdGggbnVsbCBtZXRob2RDb25maWcgd2hpY2ggY291bGQgYmUgc2V0IGxhdGVyLgotCSAqLwotCXB1YmxpYyBBY3Rpdml0eURlZXBDb3B5Q29uZmlndXJhdG9yKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQkKLQotCUBPdmVycmlkZQotCXB1YmxpYyBWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSkgewotCi0JCS8vIGNhbGN1bGF0ZSB0aGUgZWxlbWVudCBmaXJzdAotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcsIGZhbHNlLCB0cnVlKXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gY2FuU2hvdyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQkKLQkJfTsKLQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5SW5mbyh2ZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZXMgdGhlIHN1cGVyIG1ldGhvZCBmb3Igbm90IHJlc29sdmluZyB0aGUgYmFzZSB0byBpbmNsdWRlIGFkZGl0aW9uYWwgY29udHJpYnV0b3JzLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlRWxlbWVudFZhcmlhYmlsaXR5TGlzdChWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5SW5mbyBpbmZvLCBib29sZWFuIGluY2x1ZGVCYXNlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQotCQlpZiAobWV0aG9kQ29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCS8vcmVzb2x2ZSB0byBpbmNsdWRlIGNvbnRyaWJ1dG9ycwotCQlyZXNvbHZlRWxlbWVudENvbnRyaWJ1dG9ycyhlbGVtZW50LGluZm8scmVhbGl6ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQXR0cmlidXRlRmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MGVkYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQXR0cmlidXRlRmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiBmb3IgYSBnaXZlbiBtZXRob2QgZWxlbWVudCBhbmQgYXR0cmlidXRlIGZlYXR1cmUsIAotICogcmVhbGl6ZWQgdGhlIGZlYXR1cmUgdmFsdWUgYmFzZWQgb24gdGhlIGdpdmVuIHJlYWxpemVyLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZSBleHRlbmRzIEZlYXR1cmVWYWx1ZSB7Ci0KLQkvLyBtYXAgb2YgZWxlbWVudCBhbmQgdGhlIHZhbHVlCi0JTGlua2VkSGFzaE1hcCB2YWx1ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBjb25zdHJjdG9yCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB3aG9zZSBmZWF0dXJlIHZhbHVlIGlzIHRvIGJlIHJlYWxpemVkCi0JICogQHBhcmFtIG93bmVyRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSBvd25lciBlbGVtZW50IG9mIHRoaXMgZWxlbWVudCwgdGhpcyBpcyBuZWVkZWQgZm9yIGhhbmRsZSB0aGUgc3BhY2lhbCBjYXNlcyAKLQkgKiB3aGVyZSB0aGUgZWxlbWVudCdzIGVDb250YWluZXIgaXMgbm90IHByb3Blcmx5IHNldCB5ZXQuIEZvciBleGFtcGxlLCB3aGVuIGEgbmV3IENvbnRlbnREZXNjcml0aW9uIG9iamVjdCBpcyBjcmVhdGVkLCAKLQkgKiBpdCdzIG93bmVyIGlzIG5vdCBzZXQgdW50aWwgdGhlIGNvbnRlbnQgaXMgc2F2ZWQuCi0JICogQHBhcmFtIGZlYXR1cmUgT2JqZWN0IFRoZSBmZWF0dWUgb3Igb3Bwb3NpdGUgZmVhdHVyZSB3aG9zZSB2YWx1ZSBpcyB0byBiZSByZWFsaXplZAotCSAqIEBwYXJhbSByZWFsaXplciBFbGVtZW50UmVhbGl6ZXIgdGhlIHJlYWxpemVyIHVzZWQgdG8gcmVhbGl6ZSB0aGUgZmVhdHVyZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIG1ldGhvZCB0byBhZGQgYSBmZWF0dXJlIHZhbHVlIHRvIHRoZSB2YWx1ZSBsaXN0LiBUaGlzIHZhbHVlIGNvdWxkIGJlIHRoZSBlbGVtZW50J3Mgb3duIGZlYXR1cmUgdmFsdWUsIAotCSAqIG9yIHRoZSBmZWF0dXJlIHZhbHVlIG9mIGFub3RoZXIgdmFyaWFiaWxpdHkgZWxlbWVudCwgc3VjaCBhcyBhIGNvbnRyaWJ1dG9yLiAKLQkgKiBTbyB0aGUgb3duZXIgaXMgcGFzc2VkIGluIHRvIGluZGljYXRlIHRoZSBvcmlnaW5hdGlvbiBvZiB0aGUgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIG93bmVyIFZhcmlhYmlsaXR5RWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHByb3ZpZGUgdGhlIHZhbHVlIGR1ZSB0byB2YXJpYWJpbGl0eSByZWFsaXphdGlvbgotCSAqIEBwYXJhbSB2YWx1ZSBPYmplY3QgdGhlIGZlYXR1cmUgdmFsdWUgZnJvbSB0aGUgb3duZXIgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoICh2YWx1ZSA9PSBudWxsKSB8fCAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJJiYgdmFsdWUudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBub3RlOiBvd25lciBjYW4gYmUgbnVsbCwgdGhpcyBpcyBmaW5lCi0JCXZhbHVlTWFwLnB1dChvd25lciwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmVhdHVyZSB2YWx1ZSBsaXN0LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdmFsdWVNYXAuc2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUuCi0JICogQHJldHVybiBPYmplY3QgdGhlIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHZhbHVlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpZW50cnkuZ2V0S2V5KCk7Ci0JCQlPYmplY3QgdiA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkKLQkJCWlmICh2ID09IG51bGwgfHwgdi50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKCBpc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IFN0clV0aWwuZ2V0UGxhaW5UZXh0KHYudG9TdHJpbmcoKSkudHJpbSgpOwotCQkJCWlmICggaXNCbGFua0luZGljYXRvcihzdHIpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSkgewotCQkJCWlmIChzaXplKCkgPiAxKSB7Ci0JCQkJCS8vIHNvbWV0aGluZyB3cm9uZyBoZXJlLCB3aWxsIG5vdCBoYXBwZW4gYnV0IHB1dCB0ZXN0Ci0JCQkJCS8vIG1lc3NhZ2UgaGVyZSBqdXN0IGluIGNhc2UKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJBdHRyaWJ1dGVGZWF0dXJlVmFsdWU6IFByZXNlbnRhdGlvbiBOYW1lIGdldCBtb3JlIHRoZW4gb25lIGVudHJ5OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0KLQkJCWlmIChidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpOyAKLQkJCX0KLQotCQkJaWYgKChlID09IGVsZW1lbnQpICYmICEoZSBpbnN0YW5jZW9mIFNlY3Rpb24pIHx8IGUgPT0gbnVsbCApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHYpOwotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJLmdldEVsZW1lbnRQYXRoKChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAKLQkJCQkJCQkJPyAoTWV0aG9kRWxlbWVudCkgZS5lQ29udGFpbmVyKCkKLQkJCQkJCQkJOiBlKTsKLQotCQkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCQkuZ2V0QmFja1BhdGgoKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIAotCQkJCQkJCQk/ICgob3duZXJFbGVtZW50ICE9IG51bGwpID8gb3duZXJFbGVtZW50Ci0JCQkJCQkJCTogKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQuZUNvbnRhaW5lcigpKQotCQkJCQkJCQk6IGVsZW1lbnQpOwotCi0JCQkJYnVmZmVyLmFwcGVuZChSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aCh2LnRvU3RyaW5nKCksCi0JCQkJCQljb250ZW50UGF0aCwgYmFja1BhdGgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25BcHBsaWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGJhOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkFwcGxpY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0aW9uQXBwbGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25BcHBsaWNhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb25maWd1cmF0aW9uQXBwbGljYXRvciBJTlNUQU5DRSA9IG5ldyBDb25maWd1cmF0aW9uQXBwbGljYXRvcigpOwotCi0JcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoVmFyaWFiaWxpdHlFbGVtZW50IGUsIEVBdHRyaWJ1dGUgYXR0cmlidXRlLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgcHJlc2VudGF0aW9uIG5hbWUgb2YgYnJlYWtkb3duIGVsZW1lbnQKLQkJLy8KLQkJaWYoYXR0cmlidXRlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpKSB7Ci0JCQlpZihlIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJCXJldHVybiBQcm9jZXNzVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKChCcmVha2Rvd25FbGVtZW50KSBlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmdldFByZXNlbnRhdGlvbk5hbWUoZSwgY29uZmlnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGUsIGF0dHJpYnV0ZSwKLQkJCQljb25maWcpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKFZhcmlhYmlsaXR5RWxlbWVudCBlLCBFUmVmZXJlbmNlIHJlZiwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzMG5GZWF0dXJlKHJlZikpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlLCByZWYsCi0JCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZykpOwotCQl9IGVsc2UgaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXMwMUZlYXR1cmUocmVmKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGUsIHJlZiwKLQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWZlcmVuY2UoQ29udGVudERlc2NyaXB0aW9uIGRlc2MsCi0JCQlEZXNjcmliYWJsZUVsZW1lbnQgb3duZXIsIEVSZWZlcmVuY2UgcmVmLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCi0JCUxpc3QgdmFsdWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZGVzYywgb3duZXIsIHJlZiwKLQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpKTsKLQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJcmV0dXJuIHZhbHVlczsKLQkJfQotCQlpZiAodmFsdWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHZhbHVlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKSk7Ci0KLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlc29sdmUoT2JqZWN0IG9iamVjdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU9iamVjdCByZXNvbHZlZCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCShNZXRob2RFbGVtZW50KSBvYmplY3QsIGNvbmZpZyk7Ci0JCQlpZiAocmVzb2x2ZWQgPT0gbnVsbCkgewotCQkJCXJldHVybiBvYmplY3Q7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiByZXNvbHZlZDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJldHVybiBvYmplY3Q7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShDb250ZW50RGVzY3JpcHRpb24gZGVzYywKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBvd25lciwgRUF0dHJpYnV0ZSBhdHRyLAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShkZXNjLCBvd25lciwgYXR0ciwKLQkJCQljb25maWcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkRhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25EYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MjhjYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5EZWJ1Z1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqICBDbGFzcyBtYW5hZ2luZyBjb25maWd1cmF0aW9uIGRhdGEgY2FsY3VsYXRpb24gYW5kIGNhY2hlCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIE1hciAyMCwgMjAwNwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25EYXRhIHsKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQkvLyBtYWtlIHN1cmUgdGhlIG1hcCBpcyBjcmVhdGVkLgotCXByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gc3Vic3RyYWN0ZWRFbGVtTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kRWxlbWVudD4gYWRkZWRFbGVtTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2RFbGVtZW50PigpOwotCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRVcGRhdGVDaGFuZ2VzID0gdHJ1ZTsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gb3JpZ2luYWxTdWJzdHJhY3RlZDsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gb3JpZ25hbEFkZGVkOwotCXByaXZhdGUgSUxpYnJhcnlNYW5hZ2VyIGxpYnJhcnlNYW5hZ2VyOyAKLQlwcml2YXRlIEFkYXB0ZXIgY29uZmlnTGlzdGVuZXI7Ci0JcHJpdmF0ZSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyIGxpYkxpc3RlbmVyOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVVcGRhdGUgPSB0cnVlOwotCQotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbkRhdGEgbmV3Q29uZmlndXJhdGlvbkRhdGEoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJT2JqZWN0IG9iaiA9IEV4dGVuc2lvbkhlbHBlci5jcmVhdGUoQ29uZmlndXJhdGlvbkRhdGEuY2xhc3MsIGNvbmZpZyk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uRGF0YSkgewotCQkJcmV0dXJuIChDb25maWd1cmF0aW9uRGF0YSkgb2JqOwotCQl9CQkKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uRGF0YShjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvbkRhdGEoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCQotCQljb25maWdMaXN0ZW5lciA9IG5ldyBBZGFwdGVySW1wbCgpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJCWlmIChpc05lZWRVcGRhdGVDaGFuZ2VzKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpbnQgdHlwZSA9IG1zZy5nZXRFdmVudFR5cGUoKTsKLQkJCQlpZiAoCQl0eXBlID09IE5vdGlmaWNhdGlvbi5BREQKLQkJCQkJCXx8IAl0eXBlID09IE5vdGlmaWNhdGlvbi5BRERfTUFOWQotCQkJCQkJfHwgCXR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRQotCQkJCQkJfHwgIHR5cGUgPT0gTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZKSB7CQkJCQkKLQkJCQkJc2V0TmVlZFVwZGF0ZUNoYW5nZXModHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQljb25maWcuZUFkYXB0ZXJzKCkuYWRkKGNvbmZpZ0xpc3RlbmVyKTsKLQkJCQkKLQkJbGliTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBsaWJyYXJ5Q2hhbmdlZCwgb3B0aW9uOiAiICsgb3B0aW9uICsgIiwgIiArIGNoYW5nZWRJdGVtcyk7Ly8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQl9CQkJCQotCQkJCWhhbmRsZUxpYnJhcnlDaGFuZ2Uob3B0aW9uLCBjaGFuZ2VkSXRlbXMpOwotCQkJfQotCQl9OwotCQkKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldE1ldGhvZExpYnJhcnkoY29uZmlnKTsKLQkJbGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKGxpYnJhcnkpOwotCQlpZihsaWJyYXJ5TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlsaWJyYXJ5TWFuYWdlci5hZGRMaXN0ZW5lcihsaWJMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlTGlicmFyeUNoYW5nZShpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNoYW5nZWRJdGVtcykgewotCQlpZiAoaXNOZWVkVXBkYXRlQ2hhbmdlcygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGNoYW5nZWRJdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQkJc2V0TmVlZFVwZGF0ZUNoYW5nZXModHJ1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFVwZGF0aW5nQ2hhbmdlcygpIHsKLQkJcmV0dXJuIG9yaWdpbmFsU3Vic3RyYWN0ZWQgIT0gbnVsbCAmJiBvcmlnbmFsQWRkZWQgIT0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNoYW5nZXMoKSB7Ci0JCWlmICghIGlzRW5hYmxlVXBkYXRlKCkpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCWlmICghIGlzTmVlZFVwZGF0ZUNoYW5nZXMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRVcGRhdGluZ0NoYW5nZXMoKSkgewotCQkJcmV0dXJuOwkJCQotCQl9Ci0JCQotCQlsb25nIHQgPSAwOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIC0+ICIpOwkvLyROT04tTkxTLTEkCi0JCQl0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJdXBkYXRlQ2hhbmdlc18oKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJdCA9ICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQ7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiB1cGRhdGVDaGFuZ2VzXygpIDwtIHRpbWU6ICIgKyB0KTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hhbmdlc18oKSB7Ci0JCXN1YnN0cmFjdGVkRWxlbU1hcC5jbGVhcigpOwotCQlhZGRlZEVsZW1NYXAuY2xlYXIoKTsKLQkJCi0JCUxpc3Qgc3ViTGlzdCA9IGNvbmZpZy5nZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJTGlzdCBhZGRMaXN0ID0gY29uZmlnLmdldEFkZGVkQ2F0ZWdvcnkoKTsKLQkJaWYgKHN1Ykxpc3QuaXNFbXB0eSgpICYmIGFkZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHN1Ykxpc3QvYWRkTGlzdCBhcmUgZW1wdHkuIik7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkKLQkJb3JpZ2luYWxTdWJzdHJhY3RlZCA9IGNvbnZlcnRUb01hcChzdWJMaXN0KTsKLQkJb3JpZ25hbEFkZGVkID0gY29udmVydFRvTWFwKGFkZExpc3QpOwotCQkKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCURlYnVnVXRpbC5wcmludCgib3JpZ2luYWxTdWJzdHJhY3RlZDogIiwgbnVsbCwgb3JpZ2luYWxTdWJzdHJhY3RlZC52YWx1ZXMoKSwgMik7CS8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVXRpbC5wcmludCgib3JpZ25hbEFkZGVkOiAiLCBudWxsLCBvcmlnbmFsQWRkZWQudmFsdWVzKCksIDIpOwkJCQkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlib29sZWFuIGNoYW5nZWQgPSByZW1vdmUob3JpZ2luYWxTdWJzdHJhY3RlZCwgb3JpZ25hbEFkZGVkKTsKLQkJaWYgKGNoYW5nZWQgJiYgbG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJvcmlnbmFsQWRkZWQgYWZ0ZXIgcmVtb3ZlOiAiLCBudWxsLCBvcmlnbmFsQWRkZWQudmFsdWVzKCksIDIpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGNhbFN1YnN0cmFjdGVkID0gKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pIAotCQkJCQkJCSgoSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4pb3JpZ2luYWxTdWJzdHJhY3RlZCkuY2xvbmUoKTsKLQkJTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBjYWxBZGRlZCA9IChNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KSAKLQkJCQkJCQkoKEhhc2hNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+KW9yaWduYWxBZGRlZCkuY2xvbmUoKTsKLQkJCQkJCi0JCWNoYW5nZWQgPSBoYW5kbGVDb250cmlidXRvcnMoY2FsU3Vic3RyYWN0ZWQsIHRydWUpOwotCQlpZiAoY2hhbmdlZCAmJiBsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoImNhbFN1YnN0cmFjdGVkIGFmdGVyIGhhbmRsZUNvbnRyaWJ1dG9yczogIiwgbnVsbCwgY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIDIpOy8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCQotCQljYWxTdWJzdHJhY3RlZCA9IGhhbmRsZVJlcGxhY2VycyhjYWxTdWJzdHJhY3RlZCwgdHJ1ZSk7Ci0JCWNhbEFkZGVkID0gaGFuZGxlUmVwbGFjZXJzKGNhbEFkZGVkLCBmYWxzZSk7Ci0JCQotCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJjYWxTdWJzdHJhY3RlZDogIiwgbnVsbCwgY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIDIpOy8vJE5PTi1OTFMtMSQKLQkJCURlYnVnVXRpbC5wcmludCgiY2FsQWRkZWQ6ICIsIG51bGwsIGNhbEFkZGVkLnZhbHVlcygpLCAyKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWNoYW5nZWQgPSByZW1vdmUoY2FsU3Vic3RyYWN0ZWQsIGNhbEFkZGVkKTsKLQkJaWYgKGNoYW5nZWQgJiYgbG9jYWxEZWJ1ZykgewotCQkJRGVidWdVdGlsLnByaW50KCJjYWxBZGRlZCBhZnRlciByZW1vdmU6ICIsIG51bGwsIG9yaWduYWxBZGRlZC52YWx1ZXMoKSwgMik7Ly8kTk9OLU5MUy0xJAotCQl9CQkJCQotCQkKLQkJaWYgKGNhbFN1YnN0cmFjdGVkICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVsZW1lbnRNYXAoY2FsU3Vic3RyYWN0ZWQudmFsdWVzKCksIHN1YnN0cmFjdGVkRWxlbU1hcCk7Ci0JCX0KLQkJaWYgKGNhbEFkZGVkICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVsZW1lbnRNYXAoY2FsQWRkZWQudmFsdWVzKCksIGFkZGVkRWxlbU1hcCk7Ci0JCX0KLQkJCi0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlEZWJ1Z1V0aWwucHJpbnQoInN1YnN0cmFjdGVkRWxlbU1hcDogIiwgbnVsbCwgc3Vic3RyYWN0ZWRFbGVtTWFwLnZhbHVlcygpLCAyKTsJLy8kTk9OLU5MUy0xJAotCQkJRGVidWdVdGlsLnByaW50KCJhZGRlZEVsZW1NYXA6ICIsIG51bGwsIGFkZGVkRWxlbU1hcC52YWx1ZXMoKSwgMik7CQkJCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXNldE5lZWRVcGRhdGVDaGFuZ2VzKGZhbHNlKTsJCQotCQkKLQkJb3JpZ2luYWxTdWJzdHJhY3RlZCA9IG51bGw7CQkvL25vdCBuZWVkZWQgYWZ0ZXIgdXBkYXRlCi0JCW9yaWduYWxBZGRlZCA9IG51bGw7CQkJLy9ub3QgbmVlZGVkIGFmdGVyIHVwZGF0ZQotCX0KLQkKLQkvL3JldHVybiB0cnVlIGlmIHNvbWV0aGluZyBnZXRzIHJlbW92ZWQsIG90aGVyd2lzZSBmYWxzZQotCXByaXZhdGUgYm9vbGVhbiByZW1vdmUoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiBzb3VyY2VNYXAsIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gdGFyZ2V0TWFwKSB7Ci0JCWlmIChzb3VyY2VNYXAgPT0gbnVsbCB8fCBzb3VyY2VNYXAuaXNFbXB0eSgpIHx8Ci0JCQl0YXJnZXRNYXAgPT0gbnVsbCB8fCB0YXJnZXRNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7CQkJCQotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBzb3VyY2VNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gdGFyZ2V0TWFwLnJlbW92ZShpdC5uZXh0KCkpOwotCQkJaWYgKGNjICE9IG51bGwpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQkKLQkvL3JldHVybiB0cnVlIGlmIGFueSBjaGFuZ2UKLQlwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ29udHJpYnV0b3JzKE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gbWFwLCAgYm9vbGVhbiBzdWJzdHJhY3RlZCkgewotCQlpZiAobWFwID09IG51bGwgfHwgISBzdWJzdHJhY3RlZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRlZExpc3QgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJCQkKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gbWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IGl0Lm5leHQoKTsKLQkJCUxpc3Q8Q29udGVudENhdGVnb3J5PiBjb250cmlidXRlcnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhjYywgY29uZmlnKTsKLQkJCWFkZGVkTGlzdC5hZGRBbGwoY29udHJpYnV0ZXJzKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPENvbnRlbnRDYXRlZ29yeT4gaXQgPSBhZGRlZExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJbWFwLnB1dChjYy5nZXRHdWlkKCksIGNjKTsKLQkJfQotCQkKLQkJcmV0dXJuICEgYWRkZWRMaXN0LmlzRW1wdHkoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IGhhbmRsZVJlcGxhY2VycyhNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IG9yaWdpbmFscywgYm9vbGVhbiBzdWJzdHJhY3RlZCkgewotCQlpZiAob3JpZ2luYWxzID09IG51bGwgfHwgb3JpZ2luYWxzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG9yaWdpbmFsczsKLQkJfQotCQkKLQkJTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IG9yaWdpbmFscy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgcmVwbGFjZXIgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKGNjLCBjb25maWcpOwotCQkJYm9vbGVhbiB0b0tlZXAgPSB0cnVlOwotCQkJaWYgKHJlcGxhY2VyICE9IG51bGwpIHsKLQkJCQl0b0tlZXAgPSBmYWxzZTsKLQkJCQkKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmVzdGVkUmVwbGFjZXIgPSByZXBsYWNlcjsKLQkJCQl3aGlsZSAobmVzdGVkUmVwbGFjZXIgIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlciA9IG5lc3RlZFJlcGxhY2VyOwotCQkJCQluZXN0ZWRSZXBsYWNlciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UmVwbGFjZXIobmVzdGVkUmVwbGFjZXIsIGNvbmZpZyk7Ci0JCQkJfQotCQkJCWlmIChzdWJzdHJhY3RlZCkgewotCQkJCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShyZXBsYWNlci5nZXRHdWlkKCkpKSB7Ci0JCQkJCQl0b0tlZXAgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRvS2VlcCkgewotCQkJCXJldC5wdXQoY2MuZ2V0R3VpZCgpLCBjYyk7Ci0JCQl9CQkJCi0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0JCQkKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gY29udmVydFRvTWFwKENvbGxlY3Rpb248Q29udGVudENhdGVnb3J5PiBjb2xsZWN0aW9uKSB7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwgfHwgY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJfQotCQlNYXA8U3RyaW5nLCBDb250ZW50Q2F0ZWdvcnk+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgQ29udGVudENhdGVnb3J5PigpOwkJCi0JCWZpbGxNYXAoY29sbGVjdGlvbiwgbWFwKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxNYXAoQ29sbGVjdGlvbjxDb250ZW50Q2F0ZWdvcnk+IGNvbGxlY3Rpb24sIE1hcDxTdHJpbmcsIENvbnRlbnRDYXRlZ29yeT4gbWFwKSB7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNvbGxlY3Rpb24uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJQ29udGVudENhdGVnb3J5IGNjID0gaXQubmV4dCgpOwotCQkJaWYgKCEgbWFwLmNvbnRhaW5zS2V5KGNjLmdldEd1aWQoKSkpIHsKLQkJCQltYXAucHV0KGNjLmdldEd1aWQoKSwgY2MpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4gZ2V0Q2hpbGRDQyhDb250ZW50Q2F0ZWdvcnkgY2MpIHsKLQkJaWYgKGNjIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCXJldHVybiAoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0U3ViQ2F0ZWdvcmllcygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCXJldHVybiAoKERpc2NpcGxpbmUpIGNjKS5nZXRTdWJkaXNjaXBsaW5lKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKSB7Ci0JCQlyZXR1cm4gKChEaXNjaXBsaW5lR3JvdXBpbmcpIGNjKS5nZXREaXNjaXBsaW5lcygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIERvbWFpbikgewotCQkJcmV0dXJuICgoRG9tYWluKSBjYykuZ2V0U3ViZG9tYWlucygpOwotCQl9Ci0JCWlmIChjYyBpbnN0YW5jZW9mIFJvbGVTZXQpIHsKLQkJfQotCQlpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCXJldHVybiAoKFJvbGVTZXRHcm91cGluZykgY2MpLmdldFJvbGVTZXRzKCk7Ci0JCX0KLQkJaWYgKGNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlRWxlbWVudE1hcCgJQ29sbGVjdGlvbjxDb250ZW50Q2F0ZWdvcnk+IGNjTGlzdCwKLQkJCQkJCQkJCU1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRNYXApIHsKLQkJaWYgKGNjTGlzdCA9PSBudWxsIHx8IGNjTGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU2V0PFN0cmluZz4gc2VlbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWZvciAoSXRlcmF0b3I8Q29udGVudENhdGVnb3J5PiBpdCA9IGNjTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY2MgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoISBzZWVucy5jb250YWlucyhjYy5nZXRHdWlkKCkpKSB7Ci0JCQkJYWRkVG9FbGVtZW50TWFwKGNjLCBlbGVtZW50TWFwKTsKLQkJCQkvL2VsZW1lbnRNYXAucHV0KGNjLmdldEd1aWQoKSwgY2MpOwotCQkJfQotCQkJc2VlbnMuYWRkKGNjLmdldEd1aWQoKSk7Ci0JCX0KLQl9CQkJCi0KLQkvL05vIGR1cGxpY2F0ZXMgaW4gdGhlIHJldHVybmVkIGVsZW1lbnRzCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGdldEVsZW1lbnRzKENvbnRlbnRDYXRlZ29yeSBjYykgewotCQlDb2xsZWN0aW9uPE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxNZXRob2RFbGVtZW50PigpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0QXNzZXRzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0Q2hlY2tsaXN0cygpKTsKLQkJZWxlbWVudHMuYWRkQWxsKGNjLmdldENvbmNlcHRzQW5kUGFwZXJzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0RXhhbXBsZXMoKSk7Ci0JCWVsZW1lbnRzLmFkZEFsbChjYy5nZXRHdWlkZWxpbmVzKCkpOwotCQllbGVtZW50cy5hZGRBbGwoY2MuZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpKTsJCQotCQkKLQkJaWYgKGNjIGluc3RhbmNlb2YgQ3VzdG9tQ2F0ZWdvcnkpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0U3ViQ2F0ZWdvcmllcygpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKEN1c3RvbUNhdGVnb3J5KSBjYykuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmUpIGNjKS5nZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEaXNjaXBsaW5lKSBjYykuZ2V0U3ViZGlzY2lwbGluZSgpKTsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERpc2NpcGxpbmUpIGNjKS5nZXRUYXNrcygpKTsKLQkJfQotCQllbHNlIGlmIChjYyBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZykgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoRGlzY2lwbGluZUdyb3VwaW5nKSBjYykuZ2V0RGlzY2lwbGluZXMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKERvbWFpbikgY2MpLmdldFN1YmRvbWFpbnMoKSk7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChEb21haW4pIGNjKS5nZXRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0KSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChSb2xlU2V0KSBjYykuZ2V0Um9sZXMoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY2MgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpIHsKLQkJCWVsZW1lbnRzLmFkZEFsbCgoKFJvbGVTZXRHcm91cGluZykgY2MpLmdldFJvbGVTZXRzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgVG9vbCkgewotCQkJZWxlbWVudHMuYWRkQWxsKCgoVG9vbCkgY2MpLmdldFRvb2xNZW50b3JzKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNjIGluc3RhbmNlb2YgV29ya1Byb2R1Y3RUeXBlKSB7Ci0JCQllbGVtZW50cy5hZGRBbGwoKChXb3JrUHJvZHVjdFR5cGUpIGNjKS5nZXRXb3JrUHJvZHVjdHMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0VW5pcXVlQ29sbGVjdGlvbihlbGVtZW50cyk7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBnZXRVbmlxdWVDb2xsZWN0aW9uKENvbGxlY3Rpb248TWV0aG9kRWxlbWVudD4gZWxlbWVudHMpIHsKLQkJQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiByZXQgPSBuZXcgTGlua2VkSGFzaFNldDxNZXRob2RFbGVtZW50PigpOwotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJaWYgKCEgcmV0LmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0JCQkJcmV0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJYm9vbGVhbiByZXQgPSBpc093bmVyU2VsZWN0ZWRfKGVsZW1lbnQsIGNoZWNrU3VidHJhY3RlZCk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBpc093bmVyU2VsZWN0ZWQ6ICIgKyByZXQgKyAiLCAiICsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlEZWJ1Z1V0aWwudG9TdHJpbmcoZWxlbWVudCwgMikpOwkKLQkJfQkJCQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPd25lclNlbGVjdGVkXyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKGdldFVwZGF0aW5nQ2hhbmdlcygpKSB7Ci0JCQlpZiAob3JpZ2luYWxTdWJzdHJhY3RlZC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkgfHwgCi0JCQkJb3JpZ25hbEFkZGVkLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQkJCQotCQl9IGVsc2UgewotCQkJdXBkYXRlQ2hhbmdlcygpOwotCQkJCQkJCi0JCQkvLzE4MjgzMQotLyoJCQlpZiAoYWN0aXZlICYmIGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCQkJaWYgKGNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jb250YWlucyhwbHVnaW4pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0qLwotCQkJCi0JCQkvLyBzaW5jZSBVTUEgMS4wLjQsIGNvbmZpZ3VyYXRpb24gY2FuIGhhdmUgYWRkZWQgY2F0ZWdvcmllcyAKLQkJCS8vIGFuZCBzdWJ0cmFjdGVkIGNhdGVnb3JpZXMuIFRoZSBvcmRlciBvZiBmaWx0ZXJpbmcgaXM6Ci0JCQkvLyAxLiBhbnkgZWxlbWVudCBpbiB0aGUgc3VidHJhY3RlZCBjYXRlZ29yaWVzIHNob3VsZCBiZSBleGNsdWRlZAotCQkJLy8gMi4gYW55IGVsZW1lbnQgaW4gdGhlIGFkZGVkIGNhdGVnb3JpZXMgc2hvdWxkIGJlIGluY2x1ZGVkCi0JCQkvLyAzLiBhbnkgZWxlbWVudCBub3QgaW4gdGhlIHNlbGVjdGVkIHBhY2thZ2Ugb3IgcGx1Z2luIHNob3VsZCBiZSBleGNsdWRlZC4JCQotCQkJaWYgKCBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KXsKLQkJCQkJaWYgKGNvbnRyaWJ1dGVkQmFzZUluU3Vic3RyYWN0ZWQoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGFkZGVkRWxlbU1hcC5jb250YWluc0tleShlbGVtZW50LmdldEd1aWQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQl9IAotCQkKLQkJLy8gZWxlbWVudHMgYmV5b25kIGNvbmZpZ3VyYXRpb24gc2NvcGUgc2hvdWxkIGJlIGFsd2F5cyB2aXNpYmxlCi0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpCi0JCQkJfHwgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJcmV0dXJuIChwbHVnaW5zICE9IG51bGwpICYmIHBsdWdpbnMuY29udGFpbnMoZWxlbWVudCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB0aGUgb3duZXJwcm9jZXNzIGNhbid0IHNob3csIGNhbid0IGFjY2VwdAotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpICgoQWN0aXZpdHkpIGVsZW1lbnQpCi0JCQkJCQkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCWlmIChiYXNlICE9IG51bGwgJiYgYmFzZSAhPSBlbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb3duaW5nUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhiYXNlKTsKLQkJCQkJaWYgKCBvd25pbmdQcm9jICE9IG51bGwgJiYgb3duaW5nUHJvYyAhPSBlbGVtZW50IAotCQkJCQkJCSYmICFDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKG93bmluZ1Byb2MsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlFT2JqZWN0IHBrZyA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0KLQkJCS8vIGFjY2VwdCBnbG9iYWwgcGFja2FnZSBpZiB0aGUgcGx1Z2luIGlzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQlpZiAocGtnIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZQotCQkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGtnKSkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhwbHVnaW4sIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKTsKLQkJCX0KLQotCQkJTGlzdCBwa2dzID0gY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQkJCWlmIChwa2dzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIHBlciBQaG9uZydzIHJlcXVlc3QsIGZvciBQcm9jZXNzUGFja2FnZSwgY2hlY2sgdGhlCi0JCQkvLyBQcm9jZXNzQ29tcG9uZW50IHBhcmVudCBpbnN0ZWFkCi0JCQlpZiAocGtnIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlFT2JqZWN0IHBrZ19vbGQgPSBwa2c7Ci0JCQkJd2hpbGUgKChwa2cgIT0gbnVsbCkgJiYgIShwa2cgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KQotCQkJCQkJJiYgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCQlwa2cgPSBwa2cuZUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBpZiBubyBQcm9jZXNzQ29tcG9uZW50LCB0aGlzIGlzIGEgcmVhbCBwYWNrYWdlLCB1c2UgaXQKLQkJCQlpZiAoIHBrZyA9PSBudWxsICkgewotCQkJCQlwa2cgPSBwa2dfb2xkOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaWYgcGFja2FnZSBub3Qgc2VsZWN0ZWQsIHJldHVybiBmYWxzZQotCQkJaWYgKChwa2cgPT0gbnVsbCkgfHwgIXBrZ3MuY29udGFpbnMocGtnKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udHJpYnV0ZWRCYXNlSW5TdWJzdHJhY3RlZChWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQkJaWYgKHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpICE9IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGJhc2UuZ2V0R3VpZCgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGJhc2UsIGNvbmZpZywgdHJ1ZSkpIHsKLQkJCXJldHVybiBjb250cmlidXRlZEJhc2VJblN1YnN0cmFjdGVkKGJhc2UpOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRvRWxlbWVudE1hcChDb250ZW50Q2F0ZWdvcnkgY2MsIE1hcDxTdHJpbmcsIE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRNYXApIHsKLQkJQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtZW50TGlzdCA9IGdldEVsZW1lbnRzKGNjKTsJCQotCQlmb3IgKEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gZWxlbWVudExpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJZWxlbWVudE1hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWNvbmZpZy5lQWRhcHRlcnMoKS5yZW1vdmUoY29uZmlnTGlzdGVuZXIpOwotCQlsaWJyYXJ5TWFuYWdlci5yZW1vdmVMaXN0ZW5lcihsaWJMaXN0ZW5lcik7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lZWRVcGRhdGVDaGFuZ2VzKCkgewotCQlyZXR1cm4gbmVlZFVwZGF0ZUNoYW5nZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmVlZFVwZGF0ZUNoYW5nZXMoYm9vbGVhbiBuZWVkVXBkYXRlQ2hhbmdlcykgewotCQl0aGlzLm5lZWRVcGRhdGVDaGFuZ2VzID0gbmVlZFVwZGF0ZUNoYW5nZXM7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBzZXROZWVkVXBkYXRlQ2hhbmdlczogIiArIG5lZWRVcGRhdGVDaGFuZ2VzKTsJLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlVXBkYXRlKCkgewotCQlyZXR1cm4gZW5hYmxlVXBkYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZVVwZGF0ZShib29sZWFuIGVuYWJsZVVwZGF0ZSkgewotCQl0aGlzLmVuYWJsZVVwZGF0ZSA9IGVuYWJsZVVwZGF0ZTsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHNldEVuYWJsZVVwZGF0ZTogIiArIGVuYWJsZVVwZGF0ZSk7CS8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBnZXRBZGRlZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gYWRkZWRFbGVtTWFwLnZhbHVlcygpOwotCX0KLQkKLQlwdWJsaWMgQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBnZXRTdWJ0cmFjdGVkRWxlbWVudHMoKSB7Ci0JCXJldHVybiBzdWJzdHJhY3RlZEVsZW1NYXAudmFsdWVzKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudEluU3VidHJhY3RlZENhdGVnb3J5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gc3Vic3RyYWN0ZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbGVtZW50SW5BZGRlZENhdGVnb3J5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gYWRkZWRFbGVtTWFwLmNvbnRhaW5zS2V5KGVsZW1lbnQuZ2V0R3VpZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmFjdG9yeS50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uRmFjdG9yeS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2I4ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZhY3RvcnkudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkRlcGVuZGVuY3lNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2ljZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25GYWN0b3J5IHsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBhZmNwID0gbnVsbDsKLQotCS8vIG1hcCBvZiBNZXRob2RDb25maWd1cmF0aW9uIG5hbWUgdG8gQ29uaWd1cmF0aW9uIG9iamVjdAotCXByaXZhdGUgTWFwIGNvbmZpZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIExpYnJhcnlQcm9jZXNzb3IgbGlicmFyeVByb2MgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudENvbmZpZ05hbWUgPSBudWxsOwotCi0JLy8gbWFwIG9mIGNvbmZpZyBuYW1lIHRvIGxheW91dCBtYW5hZ2VyCi0JLy8gZWFjaCBjb25maWcgaGFzIGl0J3Mgb3duIGxheW91dCBtYW5hZ2VyCi0JcHJpdmF0ZSBNYXAgbGF5b3V0TWdyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRGVwZW5kZW5jeU1hbmFnZXIgZGVwTWdyID0gbnVsbDsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uRmFjdG9yeShMaWJyYXJ5UHJvY2Vzc29yIGxpYnJhcnlQcm9jKSB7Ci0KLQkJdGhpcy5saWJyYXJ5UHJvYyA9IGxpYnJhcnlQcm9jOwotCi0JCWFmY3AgPSBuZXcgQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIobGlicmFyeVByb2MKLQkJCQkuZ2V0QWRhcHRlckZhY3RvcnkoKSk7Ci0KLQkJbGlicmFyeVByb2MuYWRkTGlzdGVuZXIobmV3IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q2hhbmdlZChpbnQgb3B0aW9uLCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0NSRUFURUQKLQkJCQkJCXx8IG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9MT0FERUQpIHsKLQkJCQkJY2xlYXIoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJY3VycmVudENvbmZpZ05hbWUgPSBudWxsOwotCQlpZiAoY29uZmlnTWFwLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjb25maWdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCSgoQ29uZmlndXJhdGlvbkNsb3N1cmUpIGl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JCWNvbmZpZ01hcC5jbGVhcigpOwotCi0JCWlmIChsYXlvdXRNZ3JNYXAuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGxheW91dE1nck1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJKChFbGVtZW50TGF5b3V0TWFuYWdlcikgaXQubmV4dCgpKS5jbGVhcigpOwotCQkJfQotCQl9Ci0KLQkJbGF5b3V0TWdyTWFwLmNsZWFyKCk7Ci0KLQkJaWYgKGRlcE1nciAhPSBudWxsKSB7Ci0JCQlkZXBNZ3IuY2xlYXIoKTsKLQkJCWRlcE1nciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBnZXRMaWJyYXJ5KCkgewotCQlyZXR1cm4gbGlicmFyeVByb2MuZ2V0TGlicmFyeSgpOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TGlicmFyeVVyaSgpIHsKLQkJcmV0dXJuIGxpYnJhcnlQcm9jLmdldExpYnJhcnlVUkkoKTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0QWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5UHJvYy5nZXRBZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBhZmNwOwotCX0KLQotCXB1YmxpYyBEZXBlbmRlbmN5TWFuYWdlciBnZXREZXBlbmRlbmN5TWFuYWdlcigpIHsKLQkJLy8gcmV0dXJuIGxpYnJhcnlQcm9jLmdldERlcGVuZGVuY3lNYW5hZ2VyKCk7Ci0JCWlmICh0aGlzLmRlcE1nciA9PSBudWxsKSB7Ci0JCQlkZXBNZ3IgPSBuZXcgRGVwZW5kZW5jeU1hbmFnZXIobGlicmFyeVByb2MpOwotCQl9Ci0KLQkJcmV0dXJuIGRlcE1ncjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRNZXRob2RQbHVnaW5zKCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlFTGlzdCBlbGVtZW50cyA9IGxpYnJhcnlQcm9jLmdldExpYnJhcnkoKS5lQ29udGVudHMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCQlpdGVtcy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRDb25maWd1cmF0aW9uKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCXRoaXMuY3VycmVudENvbmZpZ05hbWUgPSBjb25maWdOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBjdXJyZW50Q29uZmlnTmFtZTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIgZ2V0TGF5b3V0TWFuYWdlcigpIHsKLQkJcmV0dXJuIGdldExheW91dE1hbmFnZXIodGhpcy5jdXJyZW50Q29uZmlnTmFtZSk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJRWxlbWVudExheW91dE1hbmFnZXIgbWdyID0gbnVsbDsKLQkJaWYgKGNvbmZpZ05hbWUgPT0gbnVsbCkgewotCQkJbWdyID0gbGlicmFyeVByb2MuZ2V0TGF5b3V0TWFuYWdlcigpOwotCQl9IGVsc2UgewotCQkJbWdyID0gKEVsZW1lbnRMYXlvdXRNYW5hZ2VyKSBsYXlvdXRNZ3JNYXAuZ2V0KGNvbmZpZ05hbWUpOwotCQkJaWYgKG1nciA9PSBudWxsKSB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBsaWJyYXJ5UHJvYwotCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZSk7Ci0JCQkJbWdyID0gbmV3IEVsZW1lbnRMYXlvdXRNYW5hZ2VyKGNvbmZpZyk7Ci0JCQkJbGF5b3V0TWdyTWFwLnB1dChjb25maWdOYW1lLCBtZ3IpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1ncjsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUgZ2V0Q2xvc3VyZSgpIHsKLQkJcmV0dXJuIGdldENsb3N1cmUoY3VycmVudENvbmZpZ05hbWUpOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0aW9uQ2xvc3VyZSBnZXRDbG9zdXJlKFN0cmluZyBjb25maWdOYW1lKSB7Ci0JCUNvbmZpZ3VyYXRpb25DbG9zdXJlIGNvbmZpZyA9IG51bGw7Ci0JCWlmIChjb25maWdOYW1lICE9IG51bGwpIHsKLQkJCWNvbmZpZyA9IChDb25maWd1cmF0aW9uQ2xvc3VyZSkgY29uZmlnTWFwLmdldChjb25maWdOYW1lKTsKLQkJCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbW9kZWxDb25maWcgPSBsaWJyYXJ5UHJvYwotCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oY29uZmlnTmFtZSk7Ci0JCQkJY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb25DbG9zdXJlKHRoaXMsIG1vZGVsQ29uZmlnKTsKLQkJCQljb25maWdNYXAucHV0KGNvbmZpZ05hbWUsIGNvbmZpZyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlnOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VDbG9zdXJlKCkgewotCQlDb25maWd1cmF0aW9uQ2xvc3VyZSBjID0gZ2V0Q2xvc3VyZShjdXJyZW50Q29uZmlnTmFtZSk7Ci0JCWlmIChjICE9IG51bGwpIHsKLQkJCWMubWFrZUNsb3N1cmUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2ZmMjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25GaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogQSBtZXRob2QgY29uZmlndXJhdGlvbiBmaWx0ZXIgdG8gYWxsb3cgZmlsdGVyaW5nIGVsZW1lbnQgCi0gKiBhbmQgcmVhbGl6ZSB0aGUgZWxlbWVudCBmZWF0dXJlIHZhbHVlcyB3aXRoaW4gYSBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25GaWx0ZXIgZXh0ZW5kcyBBZGFwdGVySW1wbCBpbXBsZW1lbnRzIElDb25maWd1cmF0b3IgewotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnOwkKLQkvL3ByaXZhdGUgVmlld2VyIHZpZXdlcjsKLQkKLQkvLyBzZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGNvbmZpZ3VyYXRpb24gdmlldyB0byB0cnVlLCBpLmUuIGNvbnRyaWJ1dG9ycyBhcmUgZGlzY2FyZGVkLgotCXByaXZhdGUgYm9vbGVhbiBkaXNjYXJkQ29udHJpYnV0b3JzID0gdHJ1ZTsKLQkKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZyBhIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+Ci0JICogQHBhcmFtIHZpZXdlciBhIDxjb2RlPlZpZXdlcjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQl0aGlzLm1ldGhvZENvbmZpZyA9IG1ldGhvZENvbmZpZzsKLQkJLy90aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkZpbHRlcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZywgYm9vbGVhbiBkaXNjYXJkQ29udHJpYnV0b3JzKSB7Ci0JCXRoaXMobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy5kaXNjYXJkQ29udHJpYnV0b3JzID0gZGlzY2FyZENvbnRyaWJ1dG9yczsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXIjYWNjZXB0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJb2JqID0gTGlicmFyeVV0aWwudW53cmFwKG9iaik7Ci0KLQkJaWYgKCAoRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSB8fCAgCi0JCQkJKG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc0V4dGVuZFJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpb2JqKSApCi0JCQkJJiYgRmVhdHVyZVZhbHVlLmlzQmxhbmtJbmRpY2F0b3Iob2JqKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCXJldHVybiBtZXRob2RDb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKG9iaik7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FuU2hvdygoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQltZXRob2RDb25maWcpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEl0ZW1Qcm92aWRlckFkYXB0ZXIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKExvZy5ERUJVRykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJPYmplY3QgZmlsdGVyZWQ6ICIgKyAob2JqID09IG51bGwgPyBudWxsIDogb2JqLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBnZXQgdGhlIHJlYWxpemVkIGNoaWxkcmVuIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIG9iaiBPYmplY3QKLQkgKiBAcGFyYW0gY2hpbGRGZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIAotCSAqIEByZXR1cm4gQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpIHsKLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKTsKLQkJLy8gZGlzY2FyZCB0aGUgY29udHJpYnV0b3JzCi0JCXJlYWxpemVyLnNldERpc2NhcmRDb250cmlidXRvcih0aGlzLmRpc2NhcmRDb250cmlidXRvcnMpOwotCi0JCWlmIChjaGlsZEZlYXR1cmUgIT0gbnVsbCAmJiBjaGlsZEZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJTGlzdCB2YWx1ZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJKE1ldGhvZEVsZW1lbnQpIG9iaiwgY2hpbGRGZWF0dXJlLCByZWFsaXplcik7Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uKQotCSAqLwotLy8JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChmaW5hbCBOb3RpZmljYXRpb24gbXNnKSB7Ci0vLwkJaWYgKHZpZXdlciA9PSBudWxsKSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotLy8JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJcHVibGljIHZvaWQgcnVuKCkgewotLy8JCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLS8vCQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotLy8JCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0vLwkJCQkJdmlld2VyLnJlZnJlc2goKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0pOwotLy8KLS8vCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBtZXRob2RDb25maWc7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklDb25maWd1cmF0b3Ijc2V0TWV0aG9kQ29uZmlndXJhdGlvbihvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQltZXRob2RDb25maWcgPSBjb25maWc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUluZm8gaW5mbywgYm9vbGVhbiBpbmNsdWRlQmFzZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJaWYgKG1ldGhvZENvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vcmVzb2x2ZSB0byBpbmNsdWRlIGNvbnRyaWJ1dG9ycwotCQlyZXNvbHZlRWxlbWVudENvbnRyaWJ1dG9ycyhlbGVtZW50LGluZm8scmVhbGl6ZXIpOwotCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGFuIGV4dGVuZGVkIGVsZW1lbnQsIGdldCB0aGUgYmFzZSBlbGVtZW50J3MKLQkJLy8gY29udHJpYnV0b3JzCi0JCS8vIE5PVEU6IHRoZSBiYXNlIGVsZW1lbnQgaXRzZWxmIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgc2luY2UgaXQncwotCQkvLyBhbHJlYWR5IGhhbmRsZWQKLQkJLy8gaW4gdGhlIGFjdGl2aXR5IHJlYWxpenRpb24gaW4gSXRlbVByb3ZpZGVycy4KLQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNFeHRlbmRlcihlbGVtZW50KSkgewotCQkJTWV0aG9kRWxlbWVudCBiYXNlID0gZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KGJhc2UsIHJlYWxpemVyKTsKLQotCQkJLy8gaWYgaW5jbHVkZWJhc2UgaXMgdHJ1ZSwgYWRkIHRoZSBlbGVtZW50IHRvIHRoZSBpbmhlcml0YW5jZSBsaXN0Ci0JCQlpZiAoaW5jbHVkZUJhc2UpIHsKLQkJCQlMaXN0IHZhbHVlcyA9IGluZm8uZ2V0SW5oZXJpdGFuY2VMaXN0KCk7Ci0JCQkJaWYgKCF2YWx1ZXMuY29udGFpbnMoZSkpIHsKLQkJCQkJdmFsdWVzLmFkZChlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHJlc29sdmUgdGhlIGJhc2UgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGNvbnRyaWJ1dG9ycyBhbmQvb3IgYmFzZQotCQkJcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoZSwgaW5mbywgaW5jbHVkZUJhc2UsIHJlYWxpemVyKTsKLQotCQl9Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUVsZW1lbnRDb250cmlidXRvcnMoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQsCi0JCQlWYXJpYWJpbGl0eUluZm8gaW5mbywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKXsKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaGFzIGNvbnRyaWJ1dG9ycyBpbiB0aGUgY29uZmlndXJhdGlvbiwgZ2V0IHRoZQotCQkvLyByZWZlcmVuY2UgcHJvcGVydGllcwotCQkvLyBpZiBhIGNvbnRyaWJ1dG9yIGhhcyByZXBsYWNlciwgaXQncyByZXBsYWNlciBpcyB1c2VkCi0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvbnRyaWJ1dG9ycyhlbGVtZW50LCBtZXRob2RDb25maWcpOwotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJCUxpc3QgdmFsdWVzID0gaW5mby5nZXRDb250cmlidXRvcnMoKTsKLQkJCQlpZiAoIXZhbHVlcy5jb250YWlucyhlKSkgewotCQkJCQl2YWx1ZXMuYWRkKGUpOwotCQkJCX0KLQkJCQlyZXNvbHZlRWxlbWVudFZhcmlhYmlsaXR5TGlzdChlLCBpbmZvLCBmYWxzZSwgcmVhbGl6ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiByZXNvbHZlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgZWxlbWVudCBhbmQgZ2V0IGEgbGlzdCBvZiBjb250cmlidXRvcnMuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgcmVhbGl6aW5nIGFjdGl0aXZ5IGJyZWFrZG93biBlbGVtZW50cyBpbiB0aGUKLQkgKiBpdGVtUHJvdmlkZXJzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JQ29uZmlndXJhdG9yI2dldFZhcmlhYmlsaXR5SW5mbyhvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCkKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlJbmZvIGdldFZhcmlhYmlsaXR5SW5mbyhWYXJpYWJpbGl0eUVsZW1lbnQgdmUpIHsKLQotCQkvLyBjYWxjdWxhdGUgdGhlIGVsZW1lbnQgZmlyc3QKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnLCB0cnVlLCB0cnVlKTsKLQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5SW5mbyh2ZSwgcmVhbGl6ZXIpOwotCX0KLQotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUluZm8gZ2V0VmFyaWFiaWxpdHlJbmZvKFZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0KLQkJLy8gY2FsY3VsYXRlIHRoZSBlbGVtZW50IGZpcnN0Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh2ZSwgcmVhbGl6ZXIpOwotCi0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVmFyaWFiaWxpdHlJbmZvIGluZm8gPSBuZXcgVmFyaWFiaWxpdHlJbmZvKHZlKTsKLQkJaW5mby5nZXRJbmhlcml0YW5jZUxpc3QoKS5hZGQoZSk7Ci0KLQkJcmVzb2x2ZUVsZW1lbnRWYXJpYWJpbGl0eUxpc3QoZSwgaW5mbywgdHJ1ZSwgcmVhbGl6ZXIpOwotCi0JCXJldHVybiBpbmZvOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IHJlc29sdmUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZywgdHJ1ZSwgdHJ1ZSk7Ci0JCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQsIHJlYWxpemVyKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCB0YXNrcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUYXNrRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgZGlzY2lwbGluZSBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSBkaXNjaXBsaW5lCi0JCQkJcmV0dXJuICggb2JqIGluc3RhbmNlb2YgVGFzayApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoVGFzaylvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLlRhc2tfRGlzY2lwbGluZXMsIAotCQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB3b3JrcHJvZHVjdHMgd2l0aG91dCBhIGRvbWFpbgotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldERvbWFpblVuY2F0ZWdvcml6ZWRXb3JrUHJvZHVjdEZpbHRlcigpewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgZG9tYWluIGNvbnRyaWJ1dG9ycyAKLQkJCQkvLyBpbnN0ZWFkIHNob3VsZCByZWFsaXplIHRvIHRoZSBiYXNlIGRvbWFpbgotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0ICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShXb3JrUHJvZHVjdClvYmosIAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnMsIAotCQkJCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKG1ldGhvZENvbmZpZykpLmlzRW1wdHkoKTsJCQkJCQotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB3b3JrcHJvZHVjdHMgd2l0aG91dCBhIFdQIFR5cGUKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXRXcFR5cGVVbmNhdGVnb3JpemVkV29ya1Byb2R1Y3RGaWx0ZXIoKXsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCQkJCS8vIHNob3VsZCB1c2UgdGhlIGRlZmF1bHQgcmVhbGl6ZXIKLQkJCQkvLyB3ZSBzaG91bGQgbm90IGRpc2NhcmQgdGhlIFdQVHlwZSBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSAKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCApICYmIAotCQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCQkoV29ya1Byb2R1Y3Qpb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGZpbHRlciBmb3IgdW5jYXRlZ29yaXplZCByb2xlcwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRSb2xlRmlsdGVyKCl7Ci0JCXJldHVybiBuZXcgSUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQkJLy8gMTU4OTI0IC0gd3JvbmcgY2F0ZWdvcmllcyBpbiBjb25maWd1cmF0aW9uIHZpZXcKLQkJCQkvLyBzaG91bGQgdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyCi0JCQkJLy8gd2Ugc2hvdWxkIG5vdCBkaXNjYXJkIHRoZSByb2xlc2V0IGNvbnRyaWJ1dG9ycyAKLQkJCQkvLyBpbnN0ZWFkIHNob3VsZCByZWFsaXplIHRvIHRoZSBiYXNlIAotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFJvbGUgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKFJvbGUpb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVTZXRzLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgZmlsdGVyIGZvciB1bmNhdGVnb3JpemVkIHRvb2wgbWVudG9ycwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFVuY2F0ZWdvcml6ZWRUb29sTWVudG9yRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIDE1ODkyNCAtIHdyb25nIGNhdGVnb3JpZXMgaW4gY29uZmlndXJhdGlvbiB2aWV3Ci0JCQkJLy8gc2hvdWxkIHVzZSB0aGUgZGVmYXVsdCByZWFsaXplcgotCQkJCS8vIHdlIHNob3VsZCBub3QgZGlzY2FyZCB0aGUgdG9vbCBjb250cmlidXRvcnMgCi0JCQkJLy8gaW5zdGVhZCBzaG91bGQgcmVhbGl6ZSB0byB0aGUgYmFzZSAKLQkJCQlyZXR1cm4gKCBvYmogaW5zdGFuY2VvZiBUb29sTWVudG9yICkgJiYgCi0JCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQkJCShUb29sTWVudG9yKW9iaiwgCi0JCQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9Ub29scywgCi0JCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIGRpc2NpcGxpbmVzIGFuZCBkaXNwbGluZSBncm91cGluZ3MKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgSUZpbHRlciBnZXREaXNjaXBsaW5lc0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmopIHsKLQkJCQkvLyBbQnVnIDE2MjYwM10gTmV3OiBSZXBsYWNpbmcgZGlzY2lwbGluZXMgZG8gYXBwZWFyIGluc2lkZSB0aGVpciByZXBsYWNlZCBlbGVtZW50cyBkaXNjaXBsaW5lIGdyb3VwaW5ncyAKLQkJCQkvLyBhcyB3ZWxsIGFzIG91dHNpZGUgb2YgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmcKLQkJCQlpZiAoIG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmVHcm91cGluZyApIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIERpc2NpcGxpbmUgKSAmJiAKLQkJCQlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJCShNZXRob2RFbGVtZW50KW9iaiwgCi0JCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5EaXNjaXBsaW5lX0Rpc2NpcGxpbmVHcm91cGluZ3MsIAotCQkJCQkJRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIobWV0aG9kQ29uZmlnKSkuaXNFbXB0eSgpOwkJCQkJCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIGdldCBmaWx0ZXIgZm9yIHJvbGVzZXRzIGFuZCByb2xlc2V0IGdyb3VwaW5ncwotCSAqIAotCSAqIEByZXR1cm4gSUZpbHRlcgotCSAqLwotCXB1YmxpYyBJRmlsdGVyIGdldFJvbGVTZXRzRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IElGaWx0ZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCS8vIFtCdWcgMTYyNjAzXSBOZXc6IFJlcGxhY2luZyBkaXNjaXBsaW5lcyBkbyBhcHBlYXIgaW5zaWRlIHRoZWlyIHJlcGxhY2VkIGVsZW1lbnRzIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIAotCQkJCS8vIGFzIHdlbGwgYXMgb3V0c2lkZSBvZiB0aGUgZGlzY2lwbGluZSBncm91cGluZwotCQkJCS8vIHNhbWUgZm9yIHJvbGVzZXQgZ3JvdXBpbmcKLQkJCQlpZiAoIG9iaiBpbnN0YW5jZW9mIFJvbGVTZXRHcm91cGluZyApIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCQotCQkJCXJldHVybiAoIG9iaiBpbnN0YW5jZW9mIFJvbGVTZXQgKSAmJiAKLQkJCQkJQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpb2JqLCAKLQkJCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlU2V0X1JvbGVTZXRHcm91cHBpbmdzLCAKLQkJCQkJCQlEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihtZXRob2RDb25maWcpKS5pc0VtcHR5KCk7CQkJCQkKLQkJCX0KLQkJfTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhlbHBlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDRhMDA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkV4dGVuc2lvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuQ29uZmlnSGVscGVyRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlByZXNlbnRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNhdGVnb3J5U29ydEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU2VjdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkhlbHBlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlnSGVscGVyRGVsZWdhdGUgZGVsZWdhdGU7Ci0KLQlzdGF0aWMgewotCQlDb25maWdIZWxwZXJEZWxlZ2F0ZSBleHRlbmRlZERlbGVnYXRlID0gKENvbmZpZ0hlbHBlckRlbGVnYXRlKSBFeHRlbnNpb25IZWxwZXIKLQkJCQkuZ2V0RXh0ZW5zaW9uKExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkiY29uZmlnSGVscGVyRGVsZWdhdGVFeHQiKTsvLyROT04tTkxTLTEkCi0JCWlmIChleHRlbmRlZERlbGVnYXRlID09IG51bGwpIHsKLQkJCWRlbGVnYXRlID0gbmV3IENvbmZpZ0hlbHBlckRlbGVnYXRlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZWxlZ2F0ZSA9IGV4dGVuZGVkRGVsZWdhdGU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb25maWdIZWxwZXJEZWxlZ2F0ZSBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGluaGVyaXRpbmdTbG90RmVhdHVyZXMgPSBmYWxzZTsgCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiA9ICI8cC8+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhIENvbnRlbnREZXNjcmlwdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Rlc2NyaXB0aW9uRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbiB8fCBlbGVtZW50LmVDb250YWluZXIoKSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgbWV0aG9kIHBhY2o9a2FnZSBpcyBhIGdsb2JhbCBwYWNrYWdlCi0JICogCi0JICogQHBhcmFtIHBrZyB7QGxpbmsgTWV0aG9kUGFja2FnZX0KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHbG9iYWxQYWNrYWdlKE1ldGhvZFBhY2thZ2UgcGtnKSB7Ci0JCWlmIChwa2cgPT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkNvbmZpZ3VyYXRpb25IZWxwZXIuaXNHbG9iYWxQYWNrYWdlOiBtZXRob2QgcGFja2FnZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCU1ldGhvZFBsdWdpbiBwID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCWlmIChwID09IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZTogVW5hYmxlIHRvIGZpbmQgbWV0aG9kIHBsdWctaW4gZm9yICIgKyBwa2cuZ2V0TmFtZSgpICsgIjogIiArIHBrZy5nZXRHdWlkKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBnZXREZWxlZ2F0ZSgpLmlzU3lzdGVtUGFja2FnZShwLCBwa2cpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbkNvbmZpZyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gaW5Db25maWcoZWxlbWVudCwgY29uZmlnLCB0cnVlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluQ29uZmlnKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCkgewotCQlyZXR1cm4gaW5Db25maWcoZWxlbWVudCwgY29uZmlnLCBjaGVja1N1YnRyYWN0ZWQsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5Db25maWcoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGJvb2xlYW4gY2hlY2tTdWJ0cmFjdGVkLCBib29sZWFuIGNoZWNrQmFzZSkgewotCQlpZiAoIWlzT3duZXJTZWxlY3RlZChlbGVtZW50LCBjb25maWcsIGNoZWNrU3VidHJhY3RlZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vQnVnIDIwNzQyOSAtIENvbmZpZ3JhdGlvbjogV2FycmluZyBpbmZvIHNob3VsZCBzaG93biB3aGVuIGRlc2VsZWN0IHRoZSByZXBsYWNlZCBlbGVtZW50Ci0JCS8vIGZvciBjb25maWd1cmF0aW9uIGNsb3N1cmUgY2hlY2tpbmcsIHRoZSBtaXNzaW5nIGJhc2Ugc2hvdWxkIGJlIHJlcG9ydGVkIAotCQkvLyBzbyB0aGUgZWxlbWVudCBiZWVuIGNoZWNrZWQgc3RpbGwgdHJlYXRlZCBhcyBpbiBjb25maWcKLQkJLy8gYWRkZWQgdGhlIGNoZWNrQmFzZSBmbGFnIHRvIGlnbm9yZSB0aGUgYmFzZSBjaGVja2luZwotCQkvLyBmb3IgY29uZmlndXJhdGlvbiByZWFsaXphdGlvbiwgdGhpcyBmbGFnIHNob3VsZCBiZSBzZXQgdG8gdHJ1ZQotCQkvLyBzbyB0aGUgcmVwbGFjZXIgbWlzc2luZyBiYXNlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgY29uZmlnLgotCQkKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSByZXBhbGNlciwgYW5kIGl0J3MgYmFzZSBlbGVtZW50IGhhcyBtb3JlIHRoYW4gb25lCi0JCS8vIHJlcGxhY2VyCi0JCS8vIG5vbmUgb2YgdGhlIHJlcGxhY2VycyBzaG91bGQgYmUgaW5jbHVkZWQgaW50byB0aGUgY29uZmlndXJhdGlvbgotCQlpZiAoY2hlY2tCYXNlICYmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSApIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlpZiAoaXNSZXBsYWNlcih2ZSkpIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoaW5Db25maWcoYmFzZSwgY29uZmlnKSkgewotCQkJCQkKLS8vCQkJCQkvLyBJbnZhbGlkIGhvdHNwb3QgY3JlYXRlZCBmb3IgbG9jYWxseSByZXBsYWNlZCBhY3Rpdml0eSBpbiBhY3Rpdml0eSBkaWFncmFtCi0vLwkJCQkJLy8gdGhpcyBpcyBiZWNhdXNlIHRoZSBhY3Rpdml0eSBoYXMgbW9yZSB0aGFuIG9uZSBsb2NhbCByZXBsYWNlcnMKLS8vCQkJCQkvLyBpbiB2ZXJzaW9uIDcuMCwgbG9jYWwgcmVwbGFjZW1lbnQgaXMgbW9kZWxlZCB0aGUgc2FtZSB3YXkgYXMgbm9tYWwgcmVwbGFjZW1lbnQKLS8vCQkJCQkvLyB3ZSBuZWVkIHRvIGlnbm9yZSB0aGlzIGNoZWNraW5nIGZvciBhY3Rpdml0eQotLy8JCQkJCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5ICkgewotLy8JCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCQl9Ci0JCQkJCQotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKAotCQkJCQkJCWJhc2UpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQkJaWYgKChlICE9IGVsZW1lbnQpCi0JCQkJCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUykKLQkJCQkJCQkJJiYgaXNPd25lclNlbGVjdGVkKGUsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKSkgewotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkJLnByaW50bG4oIkNvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWc6IElnbm9yaW5nIHJlcGxhY2luZyBlbGVtZW50ICciICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiJyBzaW5jZSBpdHMgYmFzZSBlbGVtZW50IGhhcyBtb3JlIHRoYW4gb25lIHJlcGxhY2VyIGluIHRoZSBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBiYXNlIG11c3QgYmUgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzT3duZXJTZWxlY3RlZChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiBjaGVja1N1YnRyYWN0ZWQpIHsKLQkJcmV0dXJuIGdldERlbGVnYXRlKCkuaXNPd25lclNlbGVjdGVkKGVsZW1lbnQsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIGNvbnRyaWJ1dG9yPwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udHJpYnV0b3IoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUzsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhIHJlcGxhY2VyPwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFUzsKLQl9Ci0JCi0JLyoqCi0JICogaXMgImIiIGFuIGFuY2VzdG9yIG9mICJhIiB0aHJvdWdoIGEgImNvbnRyaWJ1dGUgY2hhaW4iIHJlbGF0aW9uc2hpcAotCSAqIEBwYXJhbSBhCi0JICogQHBhcmFtIGIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRydWJ1dGVDaGFpbihWYXJpYWJpbGl0eUVsZW1lbnQgYSwgVmFyaWFiaWxpdHlFbGVtZW50IGIpIHsJCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50ID0gYTsKLQkJd2hpbGUgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgIT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxlbWVudCA9IGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChlbGVtZW50ID09IGIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGlzIHRoZSBlbGVtZW50IGEgZXh0ZW5kLXJlcGxhY2VyPwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0ZW5kUmVwbGFjZXIoVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCBlbGVtZW50LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiBlbGVtZW50LmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTOwotCX0KLQkKLQkvKioKLQkgKiBpcyB0aGUgZWxlbWVudCBhbiBleHRlbmRlcj8KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVuZGVyKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gZWxlbWVudC5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUzsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlcGxhY2VyIG9mIHRoZSBlbGVtZW50IGluIHRoZSBjb25maWd1cmF0aW9uLiBPbmx5IG9uZSByZXBsYWNlcgotCSAqIGlzIGFsbG93ZWQuIElmIG1vcmUgdGhhbiBvbmUgcmVwbGFjZXIgaXMgZm91bmQsIHRoZW4gbm9uZSBvZiB0aGVtIHdpbGwgYmUKLQkgKiByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgVmFyaWFiaWxpdHlFbGVtZW50IHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVmFyaWFiaWxpdHlFbGVtZW50IHRoZSByZXBsYWNlciBpZiB0aGVyZSBpcyBvbmUgYW5kIE9OTFkgb25lLAotCSAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRSZXBsYWNlcihWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IG51bGw7Ci0KLQkJLy8gdGhpcyB3aWxsIGdldCBhbGwgcmVwbGFjZXJzIHJlY3Vyc2l2ZWx5LiB3ZSBvbmx5IG5lZWQgdGhlIGltbWVkaWF0ZQotCQkvLyBvbmVzCi0JCS8vIGZvcihJdGVyYXRvciBpdGVyYXRvciA9IFRuZ1V0aWwuZ2V0R2VuZXJhbGl6ZXJzKGVsZW1lbnQsCi0JCS8vIFZhcmlhYmlsaXR5VHlwZS5SRVBMQUNFU19MSVRFUkFMKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLQkJZm9yIChJdGVyYXRvciBpdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtZW50KQotCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCWlmICggZSA9PSBudWxsIHx8ICFpbkNvbmZpZyhlLCBjb25maWcpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlWYXJpYWJpbGl0eVR5cGUgdHlwZSA9IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCQlpZiAoIHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTIAotCQkJCQl8fCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKSB7Ci0JCQkJaWYgKHZlICE9IG51bGwpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyOiBSZXBsYWNlciBpZ25vcmVkIGZvciBlbGVtZW50ICciICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgKyAiJyBzaW5jZSBpdCBoYXMgbW9yZSB0aGFuIG9uZSByZXBsYWNlcmluIHRoZSBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOyAvLyBpZiBtb3JlIHRoYW4gb25lIHJlcGxhY2VyLCByZXR1cm4gbnVsbAotCQkJCX0KLQotCQkJCXZlID0gZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGltbWVkaWF0ZSBjb250cmlidXRvcnMgb2YgdGhlIGVsZW1lbnQgd2l0aGluIHRoZSBjb25maWd1cmF0aW9uLgotCSAqIElmIGEgY29udHJpYnV0b3IgaGFzIGltbWVkaWF0ZSByZXBsYWNlciwgaXQgaXMgcmVwYWxjZWQgd2l0aCB0aGUgcmVwbGFjZXIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldENvbnRyaWJ1dG9ycyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gaXRlbXM7Ci0JCX0KLQkJCi0JCS8vIFRoaXMgbWV0aG9kIGdldCBhbGwgY29udHJpYnV0b3JzIHJlY3Vyc2l2ZWx5LAotCQkvLyB3ZSBvbmx5IG5lZWQgdGhlIGZpcnN0IGxldmVsCi0JCS8vIGZvciAoSXRlcmF0b3IgaXQgPSBUbmdVdGlsLmdldENvbnRyaWJ1dG9ycyhlbGVtZW50KTsgaXQuaGFzTmV4dCgpOyApCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZWxlbWVudCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoKGUgIT0gbnVsbCkKLQkJCQkJJiYgKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkNPTlRSSUJVVEVTKQotCQkJCQkmJiBpbkNvbmZpZyhlLCBjb25maWcpKSB7Ci0JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcGxhY2VyID0gZ2V0UmVwbGFjZXIoZSwgY29uZmlnKTsKLQkJCQlpZiAocmVwbGFjZXIgIT0gbnVsbCkgewotCQkJCQlpdGVtcy5hZGQocmVwbGFjZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWl0ZW1zLmFkZChlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEV4dGVuZGVycyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gaXRlbXM7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoZWxlbWVudCkKLQkJCQkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoKGUgIT0gbnVsbCkKLQkJCQkJJiYgKGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMpCi0JCQkJCSYmIGluQ29uZmlnKGUsIGNvbmZpZykpIHsKLQkJCQkJaXRlbXMuYWRkKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuU2hvdyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlyZXR1cm4gY2FuU2hvdyhlbGVtZW50LGNvbmZpZywgdHJ1ZSk7Ci0JfQotCQotCi0JLyoqCi0JICogZWxlbWVudCBjYW4ndCBzaG93IGluIHRoZSBjb25maWd1cmF0aW9uIHRyZWUgaWYgMS4gdGhlIGVsZW1lbnQgaXMgbm90IGluCi0JICogdGhlIGNvbmZpZ3VyYXRpb24gMi4gdGhlIGVsZW1lbnQgaXMgYSBjb250cmlidXRpb24gdG8gYW5vdGhlciBlbGVtZW50IDMuCi0JICogaWYgdGhlIGVsZW1lbnQgaXMgYSByZXBsYWNlciB0byBhIDMuIHRoZSBlbGVtZW50IGhhcyBhIHJlcGxhY2VtZW50Ci0JICogZWxlbWVudCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5TaG93KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBib29sZWFuIGNoZWNrU3VidHJhY3RlZCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoIWluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgY2hlY2tTdWJ0cmFjdGVkKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLS8vCQkvLyBpZiBpdDtzIGFuIGFjdGl2aXR5LCByZXR1cm4gc2luY2UgY29udHJpYnV0b3JzIGFyZSBsb2NhbCBjb250cmlidXRpb24gYW5kIG5lZWRzIHRvIGJlIHNob3duCi0vLwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9Ci0KLS8vCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLwkJLy8gdGhpcyBpcyBub3QgbmVlZGVkIGFueSBtb3JlIHNpbmNlIHRoZSBzdXBwcmVzc2lvbiBzdGF0ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhY3Rpdml0eSBhZGFwdG9yIGZhY3RvcnkKLS8vCQkvLyBqdXN0IGxlYXZlIGl0IGhlcmUgZm9yIG5vdyBzaW5jZSBpdCBkb2VzIG5vdCBodXJ0LiB0YWtlIGl0IGF3YXkgaW4gbmV4dCByZWxlYXNlCi0JCS8vIAotCQkvLyBOTywgd2Ugc3RpbGwgbmVlZCB0byBrZWVwIHRoaXMgdG8gY2hlY2sgdGhlIHN1cHByZXNzaW9uIG9mIGRlc2NyaXB0b3JzIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBkZXNjcmlwdG9yLiAKLQkJLy8gZm9yIGV4YW1wbGUsIHdoZW4gZGlzcGxheWluZyBhIFREIHBhZ2UsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXBwcmVzc2lvbiBvZiB0aGUgcmVmZXJlbmNlZCBXUERzIGFuZCBSRHMuIAotCQkvLyAwMDM5NTI3OCAtIEJyb3dzaW5nIFREIHdpdGggc3VwcHJlc3NlZCBSRC9XUEQgdW5kZXIgaXQgIC0tIHN1cHByZXNzZWQgb25lcyBzdGlsbCBzaG93aW5nCi0JCS8vIE5vdGU6IHRoaXMgZG9lcyBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIGRlc2NyaXB0b3IgaXMgd2l0aCBhbiBpbmhlcml0ZWQgYWN0aXZpdHkuIAotCQkvLyBpbiB0aGF0IGNhc2UsIHRoZSBzdXBwcmVzc2lvbiBuZWVkIHRvIGJlIGRldGVybWluZWQgYnkgdGhlIGFjdGl2aXR5IHBhdGguIFRPRE8KLQkJQm9vbGVhbiBzdXByZXNzZWQgPSBlbGVtZW50LmdldFN1cHByZXNzZWQoKTsKLQkJaWYgKHN1cHJlc3NlZCAhPSBudWxsICYmIHN1cHJlc3NlZC5ib29sZWFuVmFsdWUoKSA9PSB0cnVlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLS8vCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCWlmICggIWNhblNob3dCeUNoZWNraW5nVkUoKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudCxjb25maWcpICkgewotCQkJCXJldHVybiAgZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5TaG93QnlDaGVja2luZ1ZFKFZhcmlhYmlsaXR5RWxlbWVudCBlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyl7CQkKLQotCQkvLyBpZiB0aGlzIGlzIGFuIGV4dGVuZGVyLCBhbHdheXMgc2hvdywgZXZlbiB0aG91Z2ggaXQgZXh0ZW5kcyBhCi0JCS8vIGNvbnRyaWJ1dG9yCi0JCWlmIChpc0V4dGVuZGVyKGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmIChpc0NvbnRyaWJ1dG9yKGUpIHx8IGdldFJlcGxhY2VyKGUsIGNvbmZpZykgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gZm9yIGFjdGl2aXR5LCBkb24ndCBzaG93IHRoZSBvbmVzIHRoYXQgY29udGFpbnMgY29udHJpYnV0b3JzIAotCQkvLyB0aGUgcmVzYW9uIGZvciB0aGlzIGlzIHRvIHNpbXBsaWZ5IHRoZSBsb2dpYy4KLQkJLy8gYXNzdW1pbmcgdGhhdCB1c2VyIHVzZXMgdGhpcyBhY3Rpdml0eSB0byBjb250cmlidXRlIHRvIG90aGVyIGFjdGl2aXRpZXMKLQkJLy8gc28gdGhhdCBwYXJ0IHNob3VsZCBub3QgYmUgaW52b2x2ZWQgaW4gdGhlIG5hdmlnYXRpb24KLQkJLy8gCi0JCS8vIEppbmh1YSBYaSwgMDcvMTQvMDYsIAotCQlpZiAoIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpICYmIGhhc0NvbnRyaWJ1dG9yKChBY3Rpdml0eSllKSApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXdoaWxlICgoZSAhPSBudWxsKSAmJiBpc1JlcGxhY2VyKGUpKSB7Ci0JCQllID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoaXNDb250cmlidXRvcihlKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGluIHRoZSBjb25maWd1cmF0aW9uLiAxLiBpZiBpdCdzIGEKLQkgKiBjb250cmlidXRvciwgc2hvdyB0aGUgbmFtZSBvZiB0aGUgYmFzZSBlbGVtZW50IDIuIGlmIGl0IGhhcyBhCi0JICogcmVwbGFjZW1lbmV0LCBzaG93IHRoZSBuYW1lIG9mIHRoZSByZXBsYWNlbWVudCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQlpZiAoaXNDb250cmlidXRvcihlKSkgewotCQkJCXJldHVybiBnZXROYW1lKGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBjb25maWcpOwotCQkJfSBlbHNlIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgcmVwID0gZ2V0UmVwbGFjZXIoZSwgY29uZmlnKTsKLQkJCQlpZiAocmVwICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGdldE5hbWUocmVwLCBjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHByZXNlbnRhdGlvbiBuYW1lIGZvciBhbiBlbGVtZW50IGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCQotCQkvLyBbQnVnIDE5NjM5OV0gUC1uYW1lIGlzIG5vdCBpbmhlcml0ZWQgZnJvbSBpdHMgYmFzZSBlbGVtZW50IGluIGFuIGV4dGVuZGluZyBlbGVtZW50Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQotCQluYW1lID0gZWxlbWVudC5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWlmICggU3RyVXRpbC5pc0JsYW5rKG5hbWUpICYmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSApIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCUVsZW1lbnRSZWFsaXplciByID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsJCi0JCQlNZXRob2RFbGVtZW50IG1lID0gZWxlbWVudDsKLQotCQkJU2V0PE1ldGhvZEVsZW1lbnQ+IHNlZW5zID0gbmV3IEhhc2hTZXQ8TWV0aG9kRWxlbWVudD4oKTsKLQkJCWRvIHsKLQkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgb2xkTWUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBtZTsKLQkJCQltZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUobWUsIGYsIHIpOwotCQkJCWlmICggbWUgPT0gbnVsbCApIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIGlmIChvbGRNZSA9PSBtZSkgewotCQkJCQltZSA9IG9sZE1lLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsJCQkJCQkKLQkJCQl9CQkJCQkKLQkJCQluYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpbWUpLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQlpZiAoc2VlbnMuY29udGFpbnMobWUpKSB7CS8vdG8gcHJldmVudCBsb29wIGluIGNhc2Ugc3VjaCBhcwkJCQkJCQkJCQkJCi0JCQkJCWJyZWFrOwkJCQkJLy9ib3RoIGV4dGVuZC1yZXBsYWNlciBhbmQgYmFzZSBoYXZlIGVtcHR5IHByZXMgbmFtZQotCQkJCX0KLQkJCQlzZWVucy5hZGQobWUpOwotCQkJfSB3aGlsZSAoIFN0clV0aWwuaXNCbGFuayhuYW1lKSApOwotCQl9Ci0JCQotCQlpZiAoIFN0clV0aWwuaXNCbGFuayhuYW1lKSApIHsKLQkJCW5hbWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHZhcmlhYmlsaXR5IGVsZW1lbnQgb3duZXIuIElmIHRoZSBlbGVtZW50IGlzIGEKLQkgKiBWYXJpYWJpbGl0eUVsZW1lbnQsIHJldHVybiBpdHNlbGYgb3RoZXJ3aXNlLCBmaW5kIGl0J3Mgb3duZXIuIEZvcgotCSAqIGV4YW1wbGUsIGEgQ29udGVudERlc2NyaW90aW9uIG9iamVjdCBpcyBvd25lcmVkIGJ5IGEgVmFyaWFiaWxpdHlFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFZhcmlhYmlsaXR5RWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmxlT3duZXIoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKFZhcmlhYmlsaXR5RWxlbWVudCkgZTsKLQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSB7Ci0JCQkvLyByZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuZ2V0T3duZXIoIChDb250ZW50RGVzY3JpcHRpb24pZSApOwotCQkJRU9iamVjdCBlT2JqID0gZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoZU9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCXJldHVybiAoVmFyaWFiaWxpdHlFbGVtZW50KSBlT2JqOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGZlYXR1cmUgdmFsdWUgaXMgbWVyZ2FibGUgb3Igbm90Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXJnYWJsZUF0dHJpYnV0ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoIWZlYXR1cmUuZ2V0RVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpLmVxdWFscygKLQkJCQkiamF2YS5sYW5nLlN0cmluZyIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGZlYXR1cmUgaWQgaXMgbm90IGdsb2JhbGx5IHVuaXF1ZSwgY2FuJ3QgZG8gYSBzd2l0Y2ggaGVyZQotCQkvLyBjb21wYXJlIHRoZSBhY3R1cmUgZmVhdHJ1ZSBpbnN0ZWFkCi0JCS8qCi0JCSAqIHN3aXRjaCAoIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgKSB7IGNhc2UKLQkJICogVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDogY2FzZQotCQkgKiBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19OQU1FOgotCQkgKiBDb250cmlidXRpbmcgYSBVbmlxdWUgSUQgZm9yIHdvcmsgcHJvZHVjdCByZW5kZXJzCi0JCSAqIGJhZCBodG1sIC8vIGRvbid0IG1lcmdlIFVuaXF1ZSBJRDogY2FzZQotCQkgKiBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6IHJldHVybiBmYWxzZTsgfQotCQkgKi8KLQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0d1aWQoKQotCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZWRFbGVtZW50X05hbWUoKQotCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpIAotCQkJCXx8IGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGlzIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlPwotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQXR0cmlidXRlRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpOwotCX0KLQkKLQkvKioKLQkgKiBpcyB0aGlzIGEgdG8tb25lIGZlYXR1cmU/Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMwMUZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIChmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpICYmICFmZWF0dXJlLmlzTWFueSgpOwotCX0KLQotCS8qKgotCSAqIGlzIHRoaXMgYSB0by1tYW55IGZlYXR1cmU/Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMwbkZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIChmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpICYmIGZlYXR1cmUuaXNNYW55KCk7Ci0JfQotCi0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiAgICAgICAgICAgIFRoZSBMaXN0IG9mIHZhbHVlcyBvZiB0aGUgZmVhdHVyZS4gaWYgdGhlIGZlYXR1cmUgaXMgYSAwLi4xCi0JICogICAgICAgICAgICBhc3NvY2lhdGlvbiwgdGhlIExpc3QgaG9sZHMgYSBzaW5nbGUgdmFsdWUgaWYgYW55IGZvcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZSwgaXQncyBhIGxpc3Qgb2YgcmVmZXJlbmNlcyBmb3IKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZSBmZWF0dXJlLCBpdCdzIGEgbGlzdCBvZiBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlCi0JICogICAgICAgICAgICBtZXJnZXJlZCBmb3IgMC4uMSBhc3NvY2lhdGlvbiwgdGhlIGxpc3QgbWF5IGNvbnRhaW4gMSB2YWx1ZS4KLQkgKi8KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlRmVhdHVyZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0vLwkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLS8vCQkJTGlzdCB2YWx1ZXMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotLy8JCWNhbGN1bGF0ZUZlYXR1cmUoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsKLS8vCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlRmVhdHVyZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IE93bmVyRWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRmVhdHVyZVZhbHVlIHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBhIHZhbGlkIGZlYXR1cmUgCi0JCS8vIGZvciBleGFtcGxlLCBpZiBhbiBhY3Rpdml0eSBjb250cmlidXRlcyB0byBhIENhcGFiaWxpdHkgUGF0dGVybiwKLQkJLy8gc29tZSBDYXBhYmlsaXR5UGF0dGVybiBzcGVjaWZpYyBmZWF0dXJlIG1heSBub3QgYmUgYSB2YWxpZCBmZWF0dXJlIGZvciB0aGUgQWN0aXZpdHkKLS8vCQlMaXN0IGZlYXR1cmVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLQkJaWYgKCAhZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIEVDbGFzc2lmaWVyIHR5cGUgPSBmZWF0dXJlLmdldEVUeXBlKCk7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGdldFZhcmlhYmxlT3duZXIoKE93bmVyRWxlbWVudCA9PSBudWxsKSA/IGVsZW1lbnQKLQkJCQk6IE93bmVyRWxlbWVudCk7Ci0KLQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCi0JCXZhbHVlcy5hZGQodmUsIHZhbHVlKTsKLQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHJlYWxpemUgdGhlIHZhcmlhYmlsaXR5IHJlbGF0aW9uc2hpcAotCQlpZiAodmUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBhY2NvcmRpbmcgdG8gUGV0ZXIsIHRoZSByZWFsaXphdGlvbiBzaG91bGQgYmUgYWx3YXlzIHRvcCBkb3duLgotCQkvLyBpLmUgcmVhbGl6ZSB0aGUgYmFzZSBmaXJzdCwgdGhlbiBpbmNsdWRlIHRoZSBjb250cmlidXRpb25zCi0JCV9fbWVyZ2VCYXNlKGVsZW1lbnQsIHZlLCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwotCQkKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBGdWxmaWxsYWJsZUVsZW1lbnQpIHsKLQkJCWlmIChmZWF0dXJlICE9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSkgewotCQkJCW1lcmdlU2xvdEZlYXR1cmVWYWx1ZXMoKEZ1bGZpbGxhYmxlRWxlbWVudCkgZWxlbWVudCwgZmVhdHVyZSwKLQkJCQkJCWNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoT3duZXJFbGVtZW50IGluc3RhbmNlb2YgRnVsZmlsbGFibGVFbGVtZW50KSB7Ci0JCQltZXJnZVNsb3RGZWF0dXJlVmFsdWVzKGVsZW1lbnQsIChGdWxmaWxsYWJsZUVsZW1lbnQpIE93bmVyRWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgY29uZmlnLCB2YWx1ZXMsIHJlYWxpemVyKTsJCi0JCX0KLQkJCi0JCWlmIChyZWFsaXplciAhPSBudWxsKSB7Ci0JCQlyZWFsaXplci5hZGRFeHRyYUZlYXR1cmVWYWx1ZXMoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzKTsKLQkJfQotCQkKLQkJaWYgKCFpczAxRmVhdHVyZShmZWF0dXJlKSB8fCAodmFsdWVzLnNpemUoKSA9PSAwKSApIHsKLQkJCV9fbWVyZ2VDb250cmlidXRvcnMoZWxlbWVudCwgdmUsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyhGdWxmaWxsYWJsZUVsZW1lbnQgZWxlbWVudCwKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHJlc3VsdExpc3QgPSBuZXcgQXJyYXlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oKTsKLQotCQlPYmplY3QgZnVsbGZpbGxzT2JqID0gY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLCBjb25maWcpOwotCQkKLQkJaWYgKCEgKGZ1bGxmaWxsc09iaiBpbnN0YW5jZW9mIExpc3QpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0TGlzdDsKLQkJfQotCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCk7Ci0JCWZvciAoRnVsZmlsbGFibGVFbGVtZW50IHNsb3QgOiAoTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KSBmdWxsZmlsbHNPYmopIHsKLQkJCXNsb3QgPSAoRnVsZmlsbGFibGVFbGVtZW50KSBnZXRDYWxjdWxhdGVkRWxlbWVudChzbG90LCBjb25maWcpOwotCQkJaWYgKHNsb3RNYXRjaGluZyhzbG90LCBlbGVtZW50LCByZWFsaXplcikpIHsKLQkJCQlyZXN1bHRMaXN0LmFkZChzbG90KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJlc3VsdExpc3Quc2l6ZSgpID4gMSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxGdWxmaWxsYWJsZUVsZW1lbnQ+c29ydChyZXN1bHRMaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdExpc3Q7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWVyZ2VTbG90RmVhdHVyZVZhbHVlcyhGdWxmaWxsYWJsZUVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCUZlYXR1cmVWYWx1ZSB2YWx1ZXMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoIWluaGVyaXRpbmdTbG90RmVhdHVyZXMpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCkpIHsJCQkKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBzbG90cyA9IGNhbGNGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoZWxlbWVudCwgY29uZmlnKTsKLQotCQlmb3IgKEZ1bGZpbGxhYmxlRWxlbWVudCBzbG90IDogc2xvdHMpIHsKLQkJCWlmIChzbG90IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlzbG90ID0gKEZ1bGZpbGxhYmxlRWxlbWVudCkgZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoc2xvdCwgY29uZmlnKTsKLQkJCQljYWxjdWxhdGVGZWF0dXJlKHNsb3QsIG51bGwsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLAotCQkJCQkJcmVhbGl6ZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWVyZ2VTbG90RmVhdHVyZVZhbHVlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEZ1bGZpbGxhYmxlRWxlbWVudCBPd25lckVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlGZWF0dXJlVmFsdWUgdmFsdWVzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKCFpbmhlcml0aW5nU2xvdEZlYXR1cmVzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghIChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIShPd25lckVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHNsb3RzID0gY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyhPd25lckVsZW1lbnQsIGNvbmZpZyk7Ci0KLQkJZm9yIChGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCA6IHNsb3RzKSB7Ci0JCQlpZiAoc2xvdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSB7Ci0JCQkJc2xvdCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIGdldENhbGN1bGF0ZWRFbGVtZW50KHNsb3QsIGNvbmZpZyk7Ci0JCQkJQ29udGVudERlc2NyaXB0aW9uIHNsb3RPd25lZEVsZW1lbnQgPSBzbG90LmdldFByZXNlbnRhdGlvbigpOwkJCQkKLQkJCQljYWxjdWxhdGVGZWF0dXJlKHNsb3RPd25lZEVsZW1lbnQsIHNsb3QsIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLAotCQkJCQkJcmVhbGl6ZXIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWVyZ2VTbG90T3Bwb3NpdGVGZWF0dXJlVmFsdWVzKEZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQkJRmVhdHVyZVZhbHVlIHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCWlmICghaW5oZXJpdGluZ1Nsb3RGZWF0dXJlcykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBzbG90cyA9IGNhbGNGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoZWxlbWVudCwgY29uZmlnKTsKLQotCQlmb3IgKEZ1bGZpbGxhYmxlRWxlbWVudCBzbG90IDogc2xvdHMpIHsKLQkJCXNsb3QgPSAoRnVsZmlsbGFibGVFbGVtZW50KSBnZXRDYWxjdWxhdGVkRWxlbWVudChzbG90LCBjb25maWcpOwotCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKHNsb3QsIGZlYXR1cmUsIHJlYWxpemVyLCB2YWx1ZXMpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQoCi0JCQlGdWxmaWxsYWJsZUVsZW1lbnQgc2xvdCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHJlc3VsdExpc3QgPSBuZXcgQXJyYXlMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oKTsKLQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyCi0JCQkJLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCi0JCUxpc3QgZnVsZmlsbGluZ0xpc3QgPSBjYWxjMG5GZWF0dXJlVmFsdWUoc2xvdCwgQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMsIHJlYWxpemVyKTsKLQotCQlmb3IgKEZ1bGZpbGxhYmxlRWxlbWVudCBlbGVtZW50IDogKExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PikgZnVsZmlsbGluZ0xpc3QpIHsKLQkJCWVsZW1lbnQgPSAoRnVsZmlsbGFibGVFbGVtZW50KSBnZXRDYWxjdWxhdGVkRWxlbWVudChlbGVtZW50LCBjb25maWcpOwotCQkJaWYgKHNsb3RNYXRjaGluZyhzbG90LCBlbGVtZW50LCByZWFsaXplcikpIHsKLQkJCQlyZXN1bHRMaXN0LmFkZChlbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJlc3VsdExpc3Quc2l6ZSgpID4gMSkgewotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gUHJlc2VudGF0aW9uQ29udGV4dC5JTlNUQU5DRS5nZXRQcmVzTmFtZUNvbXBhcmF0b3IoKTsKLQkJCUNvbGxlY3Rpb25zLjxGdWxmaWxsYWJsZUVsZW1lbnQ+c29ydChyZXN1bHRMaXN0LCBjb21wYXJhdG9yKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdExpc3Q7Ci0JfQkJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzbG90TWF0Y2hpbmcoRnVsZmlsbGFibGVFbGVtZW50IHNsb3QsCi0JCQlGdWxmaWxsYWJsZUVsZW1lbnQgZWxlbWVudCwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCWlmIChzbG90ID09IG51bGwgfHwgIXNsb3QuZ2V0SXNBYnN0cmFjdCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCQotCi0JCWlmIChyZWFsaXplciAhPSBudWxsKSB7CQotCQkJcmV0dXJuIHJlYWxpemVyLnNsb3RNYXRjaGluZyhzbG90LCBlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIF9fbWVyZ2VCYXNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRmVhdHVyZVZhbHVlIHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCi0JCS8vIGlmIHRoZSBlbGVtZW50IGlzIGFuIGV4dGVuZGVkIGVsZW1lbnQsIGdldCB0aGUgYmFzZSBlbGVtZW50J3MKLQkJLy8gcHJvcGVydGllcyBpZiBuZWVkZWQKLQkJYm9vbGVhbiBleHRlbmRSZXBsYWNlID0gaXNFeHRlbmRSZXBsYWNlcih2ZSkgfHwgCi0JCQkJRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSAmJiBpc1JlcGxhY2VyKHZlKTsKLQkJYm9vbGVhbiBpc0V4dGVuZGVyID0gaXNFeHRlbmRlcih2ZSk7Ci0JCQotCQlpZiAoaXNFeHRlbmRlciB8fCBleHRlbmRSZXBsYWNlKSB7Ci0JCQlib29sZWFuIG1lcmdlYmFzZSA9IGZhbHNlOwotCQkJaWYgKGlzMG5GZWF0dXJlKGZlYXR1cmUpKSB7Ci0JCQkJbWVyZ2ViYXNlID0gdHJ1ZTsKLQkJCQlpZiAoIGV4dGVuZFJlcGxhY2UgCi0JCQkJCQl8fCBpc0V4dGVuZGVyICYmIEVsZW1lbnRSZWFsaXplci5pZ25vcmVCYXNlVG9NYW55QXNzb2NpYXRpb25zKCkpIHsKLQkJCQkJbWVyZ2ViYXNlID0gKHZhbHVlcy5zaXplKCkgPT0gMCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpczAxRmVhdHVyZShmZWF0dXJlKSkgewotCQkJCW1lcmdlYmFzZSA9ICh2YWx1ZXMuc2l6ZSgpID09IDApOwotCQkJfSBlbHNlIHsKLQkJCQltZXJnZWJhc2UgPSAoaXNNZXJnYWJsZUF0dHJpYnV0ZShmZWF0dXJlKSAmJiAodmFsdWVzLnNpemUoKSA9PSAwKSk7Ci0JCQl9Ci0KLQkJCWlmIChtZXJnZWJhc2UpIHsKLQkJCQkvLyBBdXRob3Jpbmc6IEV4dGVuZGluZyBhIGJhc2UgdGhhdCBoYXMgYmVlbgotCQkJCS8vIHJlcGxhY2VkLCBkb2VzIG5vdCBleHRlbmQgdGhlIHJlcGxhY2VtZW50Ci0JCQkJLy8gbmVlZCB0byBnZXQgdGhlIHJlYWxpemVkIGVsZW1lbnQsCi0JCQkJLy8gdGhlIGJhc2UgZWxlbWVudCBtaWdodCBiZSByZXBsYWNlZCBieSBhbm90aGVyIG9uZSwKLQkJCQkvLyBvciBtaWdodCBiZSBhIGNvbnRyaWJ1dG9yIHRvIGFub3RoZXIgYmFzZQotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCQlpZiAoICFleHRlbmRSZXBsYWNlICkgewotCQkJCQllPSBnZXRDYWxjdWxhdGVkRWxlbWVudChlLCBjb25maWcpOwotCQkJCX0JCQkJCQotCQkJCU1ldGhvZEVsZW1lbnQgbyA9IGU7Ci0KLQkJCQkvLyBpZiBpdCdzIGEgY29udGFpbm1lbnQgZmVhdHVyZSwgc3VjaCBhcyBzdWItYXJ0aWZhY3RzCi0JCQkJLy8gdGhlIGJhc2Ugc2hvdWxkIG5vdCBiZSB0aGUgY29udGFpbmVyCi0JCQkJLy8gMTYyMTU0IC0gQ2hlY2sgY2lyY3VsYXIgcmVmZXJlbmNlcyB3aXRoIHBhcmVudC0vc3ViLWFydGlmYWN0cyBhbmQgcHJhY3RpY2VzL3N1Yi1wcmFjdGljZXMJCQkJCi0JCQkJaWYgKCBpc0NvbnRhaW5tZW50RmVhdHVyZShmZWF0dXJlKSApIHsKLQkJCQkJTGlzdCBjb250YWluZXJzID0gZ2V0Q29udGFpbmVycyh2ZSwgY29uZmlnKTsKLQkJCQkJaWYgKGNvbnRhaW5lcnMuY29udGFpbnMoZSkgKSB7Ci0JCQkJCQltZXJnZWJhc2UgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChtZXJnZWJhc2UgJiYgKHZlICE9IGUpICYmIGluQ29uZmlnKGUsIGNvbmZpZykpIHsKLQkJCQkJLy8gaWYgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIGRlc2NyaXB0aW9uLAotCQkJCQkvLyBnZXQgdGhlIHRoZSBkZXNjcmlwdGlvbiBvYmplY3Qgb2YgdGhlIGJhc2UKLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJY2FsY3VsYXRlRmVhdHVyZShlLCBvLCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwotCi0JCQkJCS8vIGZvciBleHRlbmRlciwgd2UgbmVlZCB0byByZS1zb3J0IHRoZSBzdGVwcyBiYXNlZCBvbiB0aGUKLQkJCQkJLy8gZXh0ZW5kZXIgZGVmaW5lZCBvcmRlcgotCQkJCQlpZiAoKHZlIGluc3RhbmNlb2YgQ29udGVudEVsZW1lbnQpCi0JCQkJCQkJJiYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSkpIHsKLQkJCQkJCW9yZGVyU2VjdGlvbnMoKENvbnRlbnRFbGVtZW50KSB2ZSwgKExpc3QpdmFsdWVzLmdldFZhbHVlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBfX21lcmdlQ29udHJpYnV0b3JzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgRmVhdHVyZVZhbHVlIHZhbHVlcywgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCWJvb2xlYW4gbWVyZ2VhYmxlID0gdHJ1ZTsKLQkJaWYgKCBpc0F0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZSkgJiYgIWlzTWVyZ2FibGVBdHRyaWJ1dGUoZmVhdHVyZSkgKSB7Ci0JCQltZXJnZWFibGUgPSBmYWxzZTsKLQkJfSAKLQkJCi0JCWlmICggbWVyZ2VhYmxlICkgewotCQkJLy8gaWYgdGhlIGVsZW1lbnQgaGFzIGNvbnRyaWJ1dG9ycyBpbiB0aGUgY29uZmlndXJhdGlvbiwgZ2V0IHRoZQotCQkJLy8gcmVmZXJlbmNlIHByb3BlcnRpZXMKLQkJCS8vIGlmIGEgY29udHJpYnV0b3IgaGFzIHJlcGxhY2VyLCBpdCdzIHJlcGxhY2VyIGlzIHVzZWQKLQkJCUxpc3QgaXRlbXMgPSBnZXRDb250cmlidXRvcnModmUsIGNvbmZpZyk7Ci0JCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBvID0gZTsgIC8vIHRoZSBvd25lcgotCi0JCQkJCS8vIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgaXMgYSBkZXNjcmlwdGlvbiwKLQkJCQkJLy8gZ2V0IHRoZSB0aGUgZGVzY3JpcHRpb24gb2JqZWN0IG9mIHRoZSBjb250cmlidXRvcgotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCQkJZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCQkJfQotCQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG8sIGZlYXR1cmUsIGNvbmZpZywgdmFsdWVzLCByZWFsaXplcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHJlZmxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgT3Bwb3NpdGVGZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgT3Bwb3NpdGVGZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyIEVsZW1lbnRSZWFsaXplcgotCSAqIEBwYXJhbSB2YWx1ZXMKLQkgKiAgICAgICAgICAgIFRoZSBMaXN0IG9mIHZhbHVlcyBvZiB0aGUgZmVhdHVyZS4gZm9yIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUsCi0JICogICAgICAgICAgICBpdCdzIGEgbGlzdCBvZiByZWZlcmVuY2VzIGZvciBhdHRyaWJ1dGUgZmVhdHVyZSwgaXQncyBhIGxpc3QKLQkgKiAgICAgICAgICAgIG9mIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgbWVyZ2VyZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyLCBGZWF0dXJlVmFsdWUgdmFsdWVzKSB7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBmZWF0dXJlLCB0cnVlLCBmYWxzZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0JfQotCQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgcmVmbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCBPcHBvc2l0ZUZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBPcHBvc2l0ZUZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIgRWxlbWVudFJlYWxpemVyCi0JICogQHBhcmFtIHZhbHVlcwotCSAqICAgICAgICAgICAgVGhlIExpc3Qgb2YgdmFsdWVzIG9mIHRoZSBmZWF0dXJlLiBmb3IgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZSwKLQkgKiAgICAgICAgICAgIGl0J3MgYSBsaXN0IG9mIHJlZmVyZW5jZXMgZm9yIGF0dHJpYnV0ZSBmZWF0dXJlLCBpdCdzIGEgbGlzdAotCSAqICAgICAgICAgICAgb2YgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBtZXJnZXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIG1lcmdlUmVwbGFjZXJCYXNlLCBib29sZWFuIG1lcmdlRXh0ZW5kZXJCYXNlLCAKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplciwgRmVhdHVyZVZhbHVlIHZhbHVlcykgewotCQkvLyBtdXN0IGJlIGEgTXVsdGlSZXNvdXJjZUVPYmplY3QKLQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCk7Ci0KLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gZ2V0VmFyaWFibGVPd25lcihlbGVtZW50KTsKLQotCQlPYmplY3QgdmFsdWUgPSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShmZWF0dXJlKTsKLQkJdmFsdWVzLmFkZCh2ZSwgdmFsdWUpOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICYmIGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgY2UgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBoYXMgY29udHJpYnV0b3JzIGluIHRoZSBjb25maWd1cmF0aW9uLCBnZXQgdGhlCi0JCQkvLyByZWZlcmVuY2UgcHJvcGVydGllcwotCQkJTGlzdCBpdGVtcyA9IGdldENvbnRyaWJ1dG9ycyhjZSwgY29uZmlnKTsKLQkJCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZSwgZmVhdHVyZSwgbWVyZ2VSZXBsYWNlckJhc2UsIG1lcmdlRXh0ZW5kZXJCYXNlLCByZWFsaXplciwgdmFsdWVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwbGFjZXIgb2YgYSBiYXNlIGVsZW1lbnQsIAotCQkJLy8gZ2V0IHRoZSBiYXNlIGVsZW1lbnQncyBwcm9wZXJ0aWVzCi0JCQkvLyBvbmx5IGNvdmVyIDAxIG9yIDBtIHJlZmVyZW5jZXMKLQkJCS8vIGF0dHJpYnV0ZXMgY2FuJ3QgYmUgb3Bwb3NpdGUgZmVhdHVyZQotCi0JCQkvLyByZXBsYWNlZCBlbGVtZW50IGRvZXMgbm90IHNob3cgaW5jb21pbmcKLQkJCS8vIHJlbGF0aW9uc2hpcHMKLQkJCS8vIGltY29taW5nIHJlbGF0aW9uc2hpcHMgYXJlIHJlcHJlc2VudGVkIGJ5IG9wcG9zaXRlIGZlYXR1cmUKLQkJCS8vIHNvIGtlZXAgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGJhc2UgZWxlbWVudAotCQkJCi0JCQkvLyBJbmNvbnNpc3RlbmN5IGJldHdlZW4gUHVibGlzaGVkIFdvcmsgUHJvZHVjdDogV29ya2xvYWQgQW5hbHlzaXMgUGFnZSBhbmQgUmVmZXJlbmNlZCBQYWdlcwotCQkJLy8gdGhpcyBpcyBmcm9tIHRoZSBiYXNlIG9mIHRoZSBleHRlbmRlci4gCi0JCQkvLyBpbmNvbWluZyBhc3NvY2lhdGlvbnMgZnJvbSB0aGUgYmFzZSBzaG91bGQgYmUgZGlzY2FyZGVkIGZvciBleHRlbmRlcnMKLQkJCWJvb2xlYW4gbWVyZ2ViYXNlID0gZmFsc2U7Ci0JCQlib29sZWFuIGlzRXh0ZW5kZXIgPSBpc0V4dGVuZGVyKGNlKTsKLQkJCWJvb2xlYW4gaXNSZXBsYWNlciA9IGlzUmVwbGFjZXIoY2UpOwotCQkJYm9vbGVhbiBpc0V4dGVuZFJlcGxhY2VyID0gaXNFeHRlbmRSZXBsYWNlcihjZSkgfHwgCi0JCQkJRWxlbWVudFJlYWxpemVyLmlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSAmJiBpc1JlcGxhY2VyOwotCQkJCi0vLwkJCS8vVGhpcyBpcyBhIGNvbnNlcnZhdGl2ZSBmaXggZm9yICJFeHRlbmRzLXJlcGxhY2UgZGlzcGxpbmUgcmVuZGVyZWQgd3JvbmcgaW4gY29uZiB0cmVlIHZpZXciCi0vLwkJCWlmIChpc0V4dGVuZFJlcGxhY2VyKGNlKSAmJiAgcmVhbGl6ZXIuZ2V0Q2xhc3MoKSA9PSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLmNsYXNzKSB7Ci0vLwkJCQlpZiAoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5EaXNjaXBsaW5lX0Rpc2NpcGxpbmVHcm91cGluZ3MpIHsKLS8vCQkJCQlpc1JlcGxhY2VyID0gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJCWlmIChmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MpIHsKLS8vCQkJCQlpc1JlcGxhY2VyID0gdHJ1ZTsKLS8vCQkJCX0JCQkJCi0vLwkJCX0KLQkJCQotCQkJLy8gZXh0ZW5kZXJSZXBsYWNlciBiZWhhdmVzIGxpa2UgcmVwbGFjZXIgd2hlbiByZWFsaXppbmcgaW5jb21pbmcgYXNzb2NpYXRpb25zCi0JCQkvLyBCdWcgMTk5Njk0IC0gRXh0ZW5kcy1SZXBsYWNlIGlnbm9yZXMgaW5jb21pbmcgcmVsYXRpb25zaGlwcyBvZiBjb250cmlidXRlcgotCQkJaWYgKCBpc0V4dGVuZFJlcGxhY2VyICkgewotCQkJCWlzUmVwbGFjZXIgPSB0cnVlOwotCQkJfQotCQkJCi0JCQlpZiAoaXNSZXBsYWNlcikgewotCQkJCW1lcmdlYmFzZSA9IG1lcmdlUmVwbGFjZXJCYXNlICYmICgodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB8fCAodmFsdWVzLnNpemUoKSA9PSAwKSk7Ci0JCQl9IGVsc2UgaWYgKGlzRXh0ZW5kZXIpIHsKLQkJCQltZXJnZWJhc2UgPSBtZXJnZUV4dGVuZGVyQmFzZTsKLQkJCX0KLQotCQkJaWYgKG1lcmdlYmFzZSkgewotCQkJCS8vIHJlc29sdmUgdGhlIGJhc2UgY29udHJpYnV0b3IgdG8gdGhlIGJhc2UgaWYgaSBhbSBub3QgYQotCQkJCS8vIHJlcGxhY2VyCi0JCQkJLy8gZG9uJ3QgcmVzb2x2ZSB0aGUgY29udHJpYnV0b3JzIHRvIHRoZSBiYXNlIGlmIGkgYW0gYQotCQkJCS8vIHJlcGxhY2VyLAotCQkJCS8vIHRoZSBjYWxsIGlzIGNvbWluZyBmcm9tIHRoZSBiYXNlLiBTbyBpZiByZXNvbHZlIHRvIGJhc2UgYWdhaW4KLQkJCQkvLyB3aWxsIGNhdXNlIGRlYWRsb2NrLgotCQkJCS8vIGRvbid0IHJlc29sdmUgdG8gdGhlIHJlcGxhY2VyIHNpbmNlIHdlIG5lZWQgdG8gY2FycnkgZG93biBhbGwKLQkJCQkvLyB0aGUgaW5jb21pbmcgMG4gYXNzb2NpYXRpb25zIGZyb20gYmFzZQotCQkJCS8vIGFjdHVhbGx5IHNob3VsZCByZXNvbHZlIHRvIHJlcGxhY2VyIGlmIGkgYW0gbm90IGEgcmVwbGFjZXIKLQkJCQkvLyAoaS5lLiBpIGFtIGFuIGVudGVuZGVyKQotCQkJCS8vIHRoaXMgaGFuZGxlcyB0aGUgc2VuYXJpbzogRzIgcmVwbGFjZXMgRzEgYW5kIEczIGV4dGVuZHMgRzEKLQkJCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIyID0gCi0JCQkJCURlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZywgKCFpc1JlcGxhY2VyKSwgKCFpc1JlcGxhY2VyKSk7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGUgPSBnZXRDYWxjdWxhdGVkRWxlbWVudChjZQotCQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgcmVhbGl6ZXIyKTsKLQkJCQkKLQkJCQkvLyBpZiB0aGUgYmFzZSBlbGVtZW50IHJlc29sdmVkIHRvIG51bGwsIAotCQkJCS8vIHRoaXMgaXMgYmVjYXVzZSBjYW5TaG93KCkgZG9uJ3QgYWxsb3cgcmVwbGFjZWQgZWxlbWVudCB0byBzaG93LgotCQkJCS8vIHdlIGRvbid0IHdhbnQgdG8gdGFrZSB0aGUgcmlzayB0byBmaXggRWxlbWVudFJlYWxpemVyCi0JCQkJLy8gc28gZml4IGhlcmUgc2luY2UgNy4wLjFfaWZpeDEsIAotCQkJCS8vIEppbmh1YSBYaSwgNC8xNy8wNgotCQkJCWlmICggZSA9PSBudWxsICkgewotCQkJCQllID0gY2UuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoKGUgIT0gY2UpICYmIGluQ29uZmlnKGUsIGNvbmZpZykpIHsKLQkJCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGUsIGZlYXR1cmUsIG1lcmdlUmVwbGFjZXJCYXNlLCBtZXJnZUV4dGVuZGVyQmFzZSwgcmVhbGl6ZXIsIHZhbHVlcyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEZ1bGZpbGxhYmxlRWxlbWVudCkgewotCQkJCW1lcmdlU2xvdE9wcG9zaXRlRmVhdHVyZVZhbHVlcygoRnVsZmlsbGFibGVFbGVtZW50KSBlbGVtZW50LCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywgcmVhbGl6ZXIpOwotCQkJfQotCQkJCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0LCBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHVuaXF1ZQotCSAqIGVsZW1lbnRzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnRzCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYWxjdWxhdGVkRWxlbWVudHMoTGlzdCBlbGVtZW50cywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBnZXRDYWxjdWxhdGVkRWxlbWVudHMoZWxlbWVudHMsIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZykgKTsKLQl9Ci0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdCwgYW5kIHJldHVybnMgYSBuZXcgbGlzdCBvZiB1bmlxdWUKLQkgKiBlbGVtZW50cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqIEBwYXJhbSByZWFsaXplciBFbGVtZW50UmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2FsY3VsYXRlZEVsZW1lbnRzKExpc3QgZWxlbWVudHMsIEVsZW1lbnRSZWFsaXplciByZWFsaXplciApIHsKLQkJLy8gY2FsY3VsYXRlIGVhY2ggZWxlbWVudCBpbiB0aGUgbGlzdCBhbmQgcmV0dXJuIGEgbmV3IGxpc3Qgb2YgZWxlbWVudHMKLQkJTGlzdCB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCQkJaWYgKChlICE9IG51bGwpICYmICghdmFsdWVzLmNvbnRhaW5zKGUpKSkgewotCQkJCXZhbHVlcy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgZWxlbWVudCBiYXNlZCBvbiB0bGUgY29uZmlndXJhdGlvbi4gSWYgbm90aGluZyBjYW4gYmUKLQkgKiBzaG93biwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRDYWxjdWxhdGVkRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcsIHRydWUsIHRydWUpOwotCi0JCXJldHVybiBnZXRDYWxjdWxhdGVkRWxlbWVudChlbGVtZW50LCByZWFsaXplcik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRDYWxjdWxhdGVkRWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQotCQlNZXRob2RFbGVtZW50IGUgPSBlbGVtZW50OwotCQlNZXRob2RFbGVtZW50IGUyOwotCQl3aGlsZSAoKGUyID0gcmVhbGl6ZXIucmVhbGl6ZShlKSkgIT0gZSkgewotCQkJZSA9IGUyOwotCQl9Ci0JCXJldHVybiBlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi4xIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUKLQkgKiAKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgY2FsYzAxRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJcmV0dXJuIGNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi4xIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50IGFuZAotCSAqIGZlYXR1cmUKLQkgKiAKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgY2FsYzAxRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQkvLyBwcmVzZW50YXRpb24gb2JqZWN0IGZlYXR1cmUgc2hvdWxkIG5ldmVyIGJlIHJlYWxpemVkLiBhbHdheXMga2VlcAotCQkvLyBpdCdzIG93biB2YWx1ZQotCQlPYmplY3QgdiA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJaWYgKHYgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgdjsKLQkJfQotCi0JCVRvT25lRmVhdHVyZVZhbHVlIHZhbHVlcyA9IG5ldyBUb09uZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJY2FsY3VsYXRlRmVhdHVyZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSwgdmFsdWVzLCByZWFsaXplcik7Ci0vLwkJaWYgKHZhbHVlcy5zaXplKCkgPiAwKSB7Ci0vLwkJCXYgPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldCgwKTsKLS8vCQkJaWYgKHYgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0vLwkJCQlyZXR1cm4gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoKE1ldGhvZEVsZW1lbnQpIHYsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0vLwkJCX0KLS8vCQl9Ci0KLQkJcmV0dXJuIChNZXRob2RFbGVtZW50KXZhbHVlcy5nZXRWYWx1ZSgpOwotCX0KLQotCi0JLyoqCi0JICogaXMgdGhpcyBmZWF0dXJlIGZvciBjb250YWluZCBjaGlsZHJlbj8gc3VjaCBhcyBhcnRpZmFjdCdzIGNvbnRhaW5lZCBhcnRpZmFjdC4KLQkgKiBAcGFyYW0gZmVhdHVyZSAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWlubWVudEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkKLQkJCQl8fCBmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlX1N1YlByYWN0aWNlcygpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGFsbG93IGNvbnRhaW5lZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250YWlubWVudEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBBcnRpZmFjdCB8fCBlbGVtZW50IGluc3RhbmNlb2YgUHJhY3RpY2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRDb250YWluZXJzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJRU9iamVjdCBvID0gZWxlbWVudDsKLQkJd2hpbGUgKChvICE9IG51bGwpICYmICgobyA9IG8uZUNvbnRhaW5lcigpKSAhPSBudWxsKQotCQkJCSYmIG8uZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCW8gPSBnZXRDYWxjdWxhdGVkRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBvLCBjb25maWcpOwotCQkJfQotCi0JCQlpZiAoKG8gIT0gbnVsbCkgJiYgIWl0ZW1zLmNvbnRhaW5zKG8pKSB7Ci0JCQkJaXRlbXMuYWRkKG8pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgMDEgb3Bwb3NpdGUgZmVhdHVyZSAoaWYgYW55KSBmb3IgdGhlIGdpdmVuIGZlYXR1cmUuIHJldHVybnMgbnVsbAotCSAqIGlmIG5vIHN1Y2ggZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAcmV0dXJuIE9wcG9zaXRlRmVhdHVyZSB0aGUgMDEgb3Bwb3NpdGUgZmVhdHVyZSBvZiB0aGUgZ2l2ZW4gZmVhdHVyZSwKLQkgKiAgICAgICAgIG51bGwgaWYgbm8gc3VjaCB0aGluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3Bwb3NpdGVGZWF0dXJlIGdldDAxT3Bwb3NpdGVGZWF0dXJlKAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCi0JCS8vIHNpbmNlIDEuMG00LCB0aGVzZSBhcmUgbm90IDAxIGZlYXR1cmUgYW55IG1vcmUKLS8vCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCkpIHsKLS8vCQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLlRhc2tfRGlzY2lwbGluZTsKLS8vCQl9IGVsc2UgaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSB7Ci0vLwkJCXJldHVybiBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGU7Ci0vLwkJfQotCQkKLS8vCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpICkgewotLy8JCQlyZXR1cm4gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWluczsKLS8vCQl9IAotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBnZXQgdGhlIHRhcmdldCBmZWF0dXJlIGZvciB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBpZiB0aGUgdGFyZ2V0IGZlYXR1cmUgaXMgYSB0by1PbmUgZmVhdHVyZSwgCi0JICogb3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KLQkgKiBAcGFyYW0gb0ZlYXR1cmUKLQkgKiBAcmV0dXJuIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldDAxRmVhdHVyZShPcHBvc2l0ZUZlYXR1cmUgb0ZlYXR1cmUpIHsJCQotLyoJCWlmICggb0ZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9QcmltYXJ5X1Rhc2tzIAotCQkJCXx8IG9GZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQlyZXR1cm4gb0ZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQl9Ki8KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgMC4ubiBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCwgaXQncwotCSAqIG93bmVyIGVsZW1lbnQgYW5kIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2Yge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSAKLQl7Ci0JCXJldHVybiBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgMC4ubiBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlLiBpZiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBvbiB0aGUgb3RoZXIgZW5kIGlzIGEgdG8tb25lIGZlYXR1cmUsCi0JICogdGhlIGZlYXR1cmUgdmFsdWUgaXRlbSBjYW4ndCBiZSBpbiB0aGUgdmFsdWUgbGlzdCB1bmxlc3MgaXQncyBvcHBvc2l0ZQotCSAqIGZlYXR1cmUgdmFsdWUgaXMgdGhlIGN1cnJlbnQgZWxlbWVudC4gRm9yIGV4YW1wbGUsIGZvciBkaXNjaXBsaW5lX3Rhc2tzLAotCSAqIHRoZSB0YXNrcyBjYW4gYmUgc2VsZWN0ZWQgaWYgYW5kIE9OTFkgaWYgdGhlIHRhc2sncyB0YXNrX2Rpc2NpcGxpbmUKLQkgKiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGlzIHRoZSBjdXJyZW50IGRpc2NpcGxpbmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgRVN0cnVjdHVyYWxGZWF0dXJlfQotCSAqIEBwYXJhbSByZWFsaXplciB7QGxpbmsgRWxlbWVudFJlYWxpemVyfQotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2Yge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGMwbkZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJCQkKLQkJTGlzdCB2ID0gbnVsbDsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQotCQkvLyBXcm9uZyAibW9kaWZpZXMiIGluZm9ybWF0aW9uIHB1Ymxpc2hlZCBpbiB0ZWFtIGFsbG9jYXRpb24gdmlldyBmb3Igc21hbGwgY29uZmlndXJhdGlvbgotCQkvLyBuZWVkIHRvIG1hbnVhbGx5IGNhbGN1bGF0ZSB0aGUgbW9kaWZ5IGZlYXR1cmVzCi0JCS8vIGNhbid0IHJlbHkgb24gdGhlIHVtYSBtb2RlbCBzaW5jZSB0aGF0IGlzIG5vdCBjb25maWd1cmF0aW9uIHNwZWNpZmljLgotCQkvLyByb2xlIG1vZGlmaWVzIHByb2R1Y3QgbWVhbnM6Ci0JCS8vIHJvbGUgcGVyZm9ybXMgb24gdGFza3MsIGFuZCB0YXNrcyBwcm9kdWNlIHdvcmtwcm9kdWN0cyBhcyBvdXRwdXQKLQkJLy8gc28gaGFuZGxlIHRoZXNlIHNjZW5hcmlvcyBhcyBzcGVjaWFsIGNhc2VzCi0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUgJiYgZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCkgKSB7Ci0vLwkJCUxpc3QgdjIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MsIHJlYWxpemVyLCB2Mik7Ci0vLwkJCWlmICggdjIuc2l6ZSgpID4gMCApIHsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2Mi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLS8vCQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG93bmVyRWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSwgY29uZmlnLCB2LCByZWFsaXplcik7CQkJCQkKLS8vCQkJCX0KLS8vCQkJfQkKLQkJCXYgPSBjYWxjTW9kaWZpZWRXb3JrUHJvZHVjdHMoKFJvbGUpZWxlbWVudCwgb3duZXJFbGVtZW50LCByZWFsaXplcik7Ci0JCX1lbHNlIGlmICggZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICYmIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSApIHsKLS8vCQkJTGlzdCB2MiA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJY2FsY3VsYXRlT3Bwb3NpdGVGZWF0dXJlKGVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMsIHJlYWxpemVyLCB2Mik7Ci0vLwkJCWlmICggdjIuc2l6ZSgpID4gMCApIHsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2Mi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLS8vCQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG93bmVyRWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIGNvbmZpZywgdiwgcmVhbGl6ZXIpOwkJCQkJCi0vLwkJCQl9Ci0vLwkJCX0KLQkJCXYgPSBjYWxjTW9kaWZpZWRXb3JrUHJvZHVjdERlc2NyaXB0b3JzKChSb2xlRGVzY3JpcHRvcillbGVtZW50LCBvd25lckVsZW1lbnQsIHJlYWxpemVyKTsKLQkJfSBlbHNlIHsKLQkJCVRvTWFueUZlYXR1cmVWYWx1ZSBmdiA9IG5ldyBUb01hbnlGZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCQljYWxjdWxhdGVGZWF0dXJlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgY29uZmlnLCBmdiwgcmVhbGl6ZXIpOwotCQkJdiA9IChMaXN0KWZ2LmdldFZhbHVlKCk7Ci0JCX0KLQkJCi0JCUxpc3QgdmFsdWVzID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnRzKHYsIHJlYWxpemVyKTsKLQkJaWYgKHZhbHVlcy5jb250YWlucyhlbGVtZW50KSkgewotCQkJdmFsdWVzLnJlbW92ZShlbGVtZW50KTsKLQkJfQotCi0JCS8vICogaWYgdGhlIG9wcG9zaXRlIGZlYXR1cmUgb24gdGhlIG90aGVyIGVuZCBpcyBhIHRvLW9uZSBmZWF0dXJlLAotCQkvLyAqIHRoZSBmZWF0dXJlIHZhbHVlIGl0ZW0gY2FuJ3QgYmUgaW4gdGhlIHZhbHVlIGxpc3QgdW5sZXNzIGl0J3MKLQkJLy8gb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBpcyB0aGUgY3VycmVudCBlbGVtZW50LgotCQkvLyAqIEZvciBleGFtcGxlLCBmb3IgZGlzY2lwbGluZV90YXNrcywgdGhlIHRhc2tzIGNhbiBiZSBzZWxlY3RlZAotCQkvLyAqIGlmIGFuZCBPTkxZIGlmIHRoZSB0YXNrJ3MgdGFza19kaXNjaXBsaW5lIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaXMKLQkJLy8gdGhlIGN1cnJlbnQgZGlzY2lwbGluZQotCQlPcHBvc2l0ZUZlYXR1cmUgb2YgPSBnZXQwMU9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJaWYgKG9mICE9IG51bGwpIHsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdmFsdWVzLnNpemUoKSkgewotCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotCi0JCQkJLy8gY2FsY3VsYXRlIGl0J3Mgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSwgdGhlIHZhbHVlIG11c3QgYmUgdGhlCi0JCQkJLy8gZ2l2ZW4gZWxlbWVudAotCQkJCS8vIG90aGVyd2lzZSwgcmVtb3ZlIGl0Ci0JCQkJLy8gbm90ZTogZG9uJ3QgdXNlIHRoZSBjdXJyZW50IHJlYWxpemVyCi0JCQkJLy8gdXNlIHRoZSBkZWZhdWx0IHJlYWxpemVyIHNpbmNlIHdlIG5lZWQgdG8gcmVhbGl6ZSB0aGUgZWxlbWVudCBpbiB0aGUgZGVmYXVsdCB3YXkKLQkJCQkvLyAxNTg5MjQgLSB3cm9uZyBjYXRlZ29yaWVzIGluIGNvbmZpZ3VyYXRpb24gdmlldwotCi0JCQkJCi0JCQkJLy8gd29ya2Fyb3VuZCB0byBhbGxvdyBzaG93L2hpZGUgc3VidHJhY3RlZCBlbGVtZW50cwotCQkJCUVsZW1lbnRSZWFsaXplciByID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCQlyLnNldFNob3dTdWJ0cmFjdGVkKHJlYWxpemVyLnNob3dTdWJ0cmFjdGVkKCkpOwotCQkJCQotCQkJCU1ldGhvZEVsZW1lbnQgb28gPSBjYWxjMDFGZWF0dXJlVmFsdWUobywgb2YsIHIpOwotCQkJCWlmIChvbyAhPSBlbGVtZW50KSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNvbnRhaW5tZW50IGZlYXR1cmUgdmFsdWUgc2hvdWxkIG5vdCBjb250YWluIHRoZSBvd25lciBlbGVtZW50IG9yIGl0cwotCQkvLyBwYXJlbnRzCi0JCS8vIGZvciBleGFtcGxlLCBhcnRpZmFjdF9jb250YWluZWRBcnRpZmFjdHMgc2hvdWxkIG5vdCBiZSB0aGUgYXJ0aWZhY3QKLQkJLy8gaXRzZWxmIG9yIGl0cyBwYXJlbnRzCi0JCWlmIChpc0NvbnRhaW5tZW50RmVhdHVyZShmZWF0dXJlKSkgewotCQkJTGlzdCBjb250YWluZXJzID0gZ2V0Q29udGFpbmVycyhlbGVtZW50LCBjb25maWcpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJT2JqZWN0IG8gPSAoT2JqZWN0KSB2YWx1ZXMuZ2V0KGkpOwotCQkJCWlmIChvID09IGVsZW1lbnQgfHwgY29udGFpbmVycy5jb250YWlucyhvKSkgewotCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUxpc3QgcmV0dXJuTGlzdCA9IHJlYWxpemVyLnJlYWxpemUoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzKTsKLQkJaWYgKENhdGVnb3J5U29ydEhlbHBlci5uZWVkVG9Tb3J0KGVsZW1lbnQsIGZlYXR1cmUpKSB7Ci0JCQlyZXR1cm5MaXN0ID0gQ2F0ZWdvcnlTb3J0SGVscGVyLnNvcnRDYXRlZ29yeUVsZW1lbnRzKGVsZW1lbnQsIHJldHVybkxpc3QudG9BcnJheSgpLCB0cnVlKTsKLQkJfQotCi0JCS8vIHRoZSBmb2xsb3dpbmcgcGFydCBtaWdodCBub3QgYmUgZ2VuZXJhbCB0byBhbGwgY2FzZXMKLQkJLy8gc28gcHV0IGl0IGludG8gdGhlIHJlYWxpemVyCi0JCXJldHVybiByZXR1cm5MaXN0OwotCQkKLS8vCQkvLyBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBjb250YWlubWVudCBlbGVtZW50IHN1Y2ggYXMgYXJ0aWZhY3QKLS8vCQkvLyB0aGUgY2hpbGQgZWxlbWVudCBjYW4ndCBzaG93IGlmIGFueSBvZiB0aGUgcGFyZW50KHMpIGFyZSBpbiB0aGUgbGlzdAotLy8JCS8vIFB1Ymxpc2hlZCBzaXRlOiBEaXNwbGF5IG9mIFdQcyB1bmRlciByZXNwb25zaWJsZSByb2xlCi0vLwkJaWYgKGZlYXR1cmUuaXNNYW55KCkgJiYgdmFsdWVzLnNpemUoKSA+IDAKLS8vCQkJCSYmIGlzQ29udGFpbm1lbnRFbGVtZW50KHZhbHVlcy5nZXQoMCkpKSB7Ci0vLwkJCWludCBpID0gMDsKLS8vCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0vLwkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldChpKTsKLS8vCi0vLwkJCQkvLyBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBlbGVtZW50IGlzIGluIHRoZSBsaXN0LCByZW1vdmUgdGhpcwotLy8JCQkJLy8gZWxlbWVudCBmcm9tIHRoZSBsaXN0Ci0vLwkJCQlpZiAoaXNDb250YWluZXJJbkxpc3QobywgdmFsdWVzLCBjb25maWcpKSB7Ci0vLwkJCQkJdmFsdWVzLnJlbW92ZShpKTsKLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJaSsrOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBuZWVkIHRvIHNvcnQgdGhlIGNvbmNlcHQgYW5kIHBhcGVycyBieSB0eXBlCi0vLwkJaWYgKChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0vLwkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkKLS8vCQkJCSYmICh2YWx1ZXMuc2l6ZSgpID4gMCkpIHsKLS8vCQkJTGlzdCBwYXBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWludCBpID0gMDsKLS8vCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0vLwkJCQlPYmplY3QgbyA9IHZhbHVlcy5nZXQoaSk7Ci0vLwkJCQlpZiAobyBpbnN0YW5jZW9mIFdoaXRlcGFwZXIpIHsKLS8vCQkJCQlwYXBlcnMuYWRkKG8pOwotLy8JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWkrKzsKLS8vCQkJCX0KLS8vCQkJfQotLy8KLS8vCQkJaWYgKHBhcGVycy5zaXplKCkgPiAwKSB7Ci0vLwkJCQl2YWx1ZXMuYWRkQWxsKHBhcGVycyk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGNvbnRhaW5lciBvZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgbGlzdCBvciBub3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBpdGVtcwotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVySW5MaXN0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTGlzdCBpdGVtcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUVPYmplY3QgbyA9IGVsZW1lbnQ7Ci0JCXdoaWxlICgobyAhPSBudWxsKSAmJiAoKG8gPSBvLmVDb250YWluZXIoKSkgIT0gbnVsbCkKLQkJCQkmJiBvLmdldENsYXNzKCkuaXNJbnN0YW5jZShlbGVtZW50KSkgewotCQkJaWYgKGl0ZW1zLmNvbnRhaW5zKG8pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChvIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50KSB7Ci0JCQkJbyA9IGdldENhbGN1bGF0ZWRFbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG8sIGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCWlmICgobyAhPSBudWxsKSAmJiBpdGVtcy5jb250YWlucyhvKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCBhdHRyaWJ1dGUgZmVhdHVyZSB2YWx1ZSBvZiB0aGUgc3BlY2lwaWVkIGVsZW1lbnQgYW5kCi0JICogZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIGNvbmZpZyB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXJldHVybiBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjYWxjdWxhdGVkIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIEVTdHJ1Y3R1cmFsRmVhdHVyZX0KLQkgKiBAcGFyYW0gY29uZmlnIHtAbGluayBNZXRob2RDb25maWd1cmF0aW9ufQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZiAoaXNNZXJnYWJsZUF0dHJpYnV0ZShmZWF0dXJlKSkgewotCQkJLy8gbWVyZ2UgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQlBdHRyaWJ1dGVGZWF0dXJlVmFsdWUgdmFsdWVzID0gbmV3IEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCWNhbGN1bGF0ZUZlYXR1cmUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCBjb25maWcsIHZhbHVlcywKLQkJCQkJCXJlYWxpemVyKTsKLQotLy8JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJCUZlYXR1cmVWYWx1ZSBhdiA9IChGZWF0dXJlVmFsdWUpIGl0Lm5leHQoKTsKLS8vCQkJCWlmIChhdi50ZXh0ID09IG51bGwgfHwgYXYudGV4dC50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotLy8JCQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkpIHsKLS8vCQkJCQlpZiAodmFsdWVzLnNpemUoKSA+IDEpIHsKLS8vCQkJCQkJLy8gc29tZXRoaW5nIHdyb25nIGhlcmUsIHdpbGwgbm90IGhhcHBlbiBidXQgcHV0IHRlc3QKLS8vCQkJCQkJLy8gbWVzc2FnZSBoZXJlIGp1c3QgaW4gY2FzZQotLy8JCQkJCQlpZiAoZGVidWcpIHsKLS8vCQkJCQkJCVN5c3RlbS5vdXQKLS8vCQkJCQkJCQkJLnByaW50bG4oIkNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZTogUHJlc2VudGF0aW9uIE5hbWUgZ2V0IG1vcmUgdGhlbiBvbmUgZW50cnk6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQlyZXR1cm4gYXYudGV4dDsKLS8vCQkJCX0KLS8vCi0vLwkJCQlpZiAoYnVmZmVyLmxlbmd0aCgpID4gMCkgewotLy8JCQkJCWJ1ZmZlci5hcHBlbmQoQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUik7IAotLy8JCQkJfQotLy8KLS8vCQkJCWlmIChhdi5lbGVtZW50ID09IGVsZW1lbnQpIHsKLS8vCQkJCQlidWZmZXIuYXBwZW5kKGF2LnRleHQpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlcgotLy8JCQkJCQkJLmdldEVsZW1lbnRQYXRoKChhdi5lbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSA/IChNZXRob2RFbGVtZW50KSBhdi5lbGVtZW50Ci0vLwkJCQkJCQkJCS5lQ29udGFpbmVyKCkKLS8vCQkJCQkJCQkJOiBhdi5lbGVtZW50KTsKLS8vCi0vLwkJCQkJU3RyaW5nIGJhY2tQYXRoID0gUmVzb3VyY2VIZWxwZXIKLS8vCQkJCQkJCS5nZXRCYWNrUGF0aCgoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgPyAoKG93bmVyRWxlbWVudCAhPSBudWxsKSA/IG93bmVyRWxlbWVudAotLy8JCQkJCQkJCQk6IChNZXRob2RFbGVtZW50KSBlbGVtZW50LmVDb250YWluZXIoKSkKLS8vCQkJCQkJCQkJOiBlbGVtZW50KTsKLS8vCi0vLwkJCQkJYnVmZmVyLmFwcGVuZChSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChhdi50ZXh0LAotLy8JCQkJCQkJY29udGVudFBhdGgsIGJhY2tQYXRoKSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCi0vLwkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJCQotCQkJcmV0dXJuIHZhbHVlcy5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgMC4ubiBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudAotCSAqIGFuZCBvcHBvc2l0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIHtAbGluayBFU3RydWN0dXJhbEZlYXR1cmV9Ci0JICogQHBhcmFtIHJlYWxpemVyIHtAbGluayBFbGVtZW50UmVhbGl6ZXJ9Ci0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJcmV0dXJuIGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCB0cnVlLCBmYWxzZSwgcmVhbGl6ZXIpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2FsY3VsYXRlZCAwLi5uIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgb2YgdGhlIHNwZWNpcGllZCBlbGVtZW50Ci0JICogYW5kIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCB7QGxpbmsgTWV0aG9kRWxlbWVudH0KLQkgKiBAcGFyYW0gZmVhdHVyZSB7QGxpbmsgT3Bwb3NpdGVGZWF0dXJlfQotCSAqIEBwYXJhbSBtZXJnZVJlcGxhY2VyQmFzZSBib29sZWFuCi0JICogQHBhcmFtIG1lcmdlRXh0ZW5kZXJCYXNlIGJvb2xlYW4KLQkgKiBAcGFyYW0gcmVhbGl6ZXIge0BsaW5rIEVsZW1lbnRSZWFsaXplcn0KLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIHtAbGluayBNZXRob2RFbGVtZW50fQotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gbWVyZ2VSZXBsYWNlckJhc2UsIGJvb2xlYW4gbWVyZ2VFeHRlbmRlckJhc2UsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZSB2YWx1ZXMgPSBuZXcgVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgZmVhdHVyZSwgbWVyZ2VSZXBsYWNlckJhc2UsIG1lcmdlRXh0ZW5kZXJCYXNlLCByZWFsaXplciwgdmFsdWVzKTsKLQkJcmV0dXJuIChMaXN0KXZhbHVlcy5nZXRWYWx1ZSgpOwotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBnZXQgdGhlIGNhbGN1bGF0ZWQgMC4uMSBmZWF0dXJlIHZhbHVlIG9mIHRoZSBzcGVjaXBpZWQgZWxlbWVudCBhbmQKLQkgKiBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGZlYXR1cmUge0BsaW5rIE9wcG9zaXRlRmVhdHVyZX0KLQkgKiBAcGFyYW0gcmVhbGl6ZXIge0BsaW5rIEVsZW1lbnRSZWFsaXplcn0KLQkgKiAKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgY2FsYzAxRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZSB2YWx1ZXMgPSBuZXcgVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWNhbGN1bGF0ZU9wcG9zaXRlRmVhdHVyZShlbGVtZW50LCBmZWF0dXJlLCByZWFsaXplciwgdmFsdWVzKTsKLS8vCQlpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLS8vCQkJcmV0dXJuIGdldENhbGN1bGF0ZWRFbGVtZW50KChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KDApLCByZWFsaXplcik7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiAoTWV0aG9kRWxlbWVudCl2YWx1ZXMuZ2V0VmFsdWUoKTsKLQkJCi0JfQotCi0JLyoqCi0JICogb3JkZXIgdGhlIHNlY3Rpb25zCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIENvbnRlbnRFbGVtZW50fQotCSAqIEBwYXJhbSB2YWx1ZXMge0BsaW5rIExpc3R9IAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBvcmRlclNlY3Rpb25zKENvbnRlbnRFbGVtZW50IGVsZW1lbnQsIExpc3QgdmFsdWVzKSB7Ci0JCVN0cmluZyBvcmRlcmluZ0d1aWRlID0gZWxlbWVudC5nZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCWlmIChvcmRlcmluZ0d1aWRlID09IG51bGwgfHwgb3JkZXJpbmdHdWlkZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVNlY3Rpb25MaXN0IHNsaXN0ID0gbmV3IFNlY3Rpb25MaXN0KGVsZW1lbnQsCi0JCQkJU2VjdGlvbkxpc3QuU1RFUFNfRk9SX0VMRU1FTlRfQU5EX1BBUkVOVFMpOwotCi0JCWlmIChpc1NhbWVMaXN0KHZhbHVlcywgc2xpc3QpKSB7Ci0JCQl2YWx1ZXMuY2xlYXIoKTsKLQkJCXZhbHVlcy5hZGRBbGwoc2xpc3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gb3RoZXJ3aXNlLCBuZWVkIHRvIHJlb3JkZXIgdGhlIGxpc3QKLQkJT3JkZXJlZExpc3RDb21wYXJhdG9yIGNvbXAgPSBuZXcgT3JkZXJlZExpc3RDb21wYXJhdG9yKG5ldyBBcnJheUxpc3QoCi0JCQkJdmFsdWVzKSwgc2xpc3QpOwotCQlUcmVlU2V0IHMgPSBuZXcgVHJlZVNldChjb21wKTsKLQkJcy5hZGRBbGwodmFsdWVzKTsKLQotCQl2YWx1ZXMuY2xlYXIoKTsKLQkJdmFsdWVzLmFkZEFsbChzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FtZUxpc3QoTGlzdCBsMSwgTGlzdCBsMikgewotCQlpZiAobDEuc2l6ZSgpICE9IGwyLnNpemUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGwxLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCFsMi5jb250YWlucyhvKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgY29weXJpZ2h0IG9mIHRoZSBlbGVtZW50IGludCBoZSBjb25maWd1cmF0aW9uLiBSdWxlOiAxLgotCSAqIGNvbnRyaWJ1dG9ycycgY29weXJpZ2h0IHN0YXRtZW50IHNob3VsZCBiZSBtZXJnZWQgdG8gdGhlIGJhc2UgMi4gZXh0ZW5kZWQKLQkgKiBlbGVtZW50IGluaGVyaXRlcyB0aGUgY29weXJpZ2h0cyBmcm9tIHRoZSBiYXNlIDMuIHJlcGxhY2VyIGRvbid0IGluaGVyaXRlCi0JICogdGhlIGNvcHlyaWdodHMgZnJvbSB0aGUgYmFzZSA0LiBjb3B5cmlnaHQgZWxlbWVudHMgc2hvdWxkIGJlIHVuaXF1ZSwgbm8KLQkgKiBkdXBsaWNhdGUgZW50cnkKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdmFsdWVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYWxjdWxhdGVDb3B5cmlnaHQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIExpc3QgdmFsdWVzKSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHQgPSAoU3VwcG9ydGluZ01hdGVyaWFsKSBnZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQlMaWJyYXJ5VXRpbC5nZXRDb3B5cmlnaHQoZWxlbWVudCksIGNvbmZpZyk7Ci0JCWlmIChjb3B5cmlnaHQgIT0gbnVsbCAmJiAhdmFsdWVzLmNvbnRhaW5zKGNvcHlyaWdodCkpIHsKLQkJCXZhbHVlcy5hZGQoY29weXJpZ2h0KTsKLQkJfQotCi0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9IGdldFZhcmlhYmxlT3duZXIoZWxlbWVudCk7Ci0JCWlmICh2ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoY29uZmlnID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG1lcmdlIGNvcHlyaWdodHMgb2YgY29udHJpYnV0b3JzCi0JCUxpc3QgaXRlbXMgPSBnZXRDb250cmlidXRvcnModmUsIGNvbmZpZyk7Ci0JCWlmIChpdGVtcyAhPSBudWxsICYmIGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQljYWxjdWxhdGVDb3B5cmlnaHQoZSwgY29uZmlnLCB2YWx1ZXMpOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYW4gZXh0ZW5kZWQgZWxlbWVudCwgZ2V0IHRoZSBiYXNlIGVsZW1lbnQncwotCQkvLyBjb3B5cmlnaHQKLQkJLy8gdGhlIGJhc2UgZWxlbWVudCdzIGNvcHlyaWdodCBzaG91bGQgYXBwZWFyIGZpcnN0Ci0JCWlmIChpc0V4dGVuZGVyKHZlKSkgewotCQkJLy8gcmVhbGl6ZSB0aGUgYmFzZSBlbGVtZW50IGZpcnN0LgotCQkJTWV0aG9kRWxlbWVudCBlID0gZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodmUKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgY29uZmlnKTsKLQkJCWlmICgodmUgIT0gZSkgJiYgaW5Db25maWcoZSwgY29uZmlnKSkgewotCQkJCUxpc3QgYmFzZUl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWNhbGN1bGF0ZUNvcHlyaWdodChlLCBjb25maWcsIGJhc2VJdGVtcyk7Ci0KLQkJCQkvLyBhZGQgdGhlIGJhc2UgaXRlbXMgdG8gdGhlIGJlZ2luaW5nCi0JCQkJaWYgKGJhc2VJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJCS8vIEF1dGhvcmluZzogRHVwbGljYXRlIGNvcHlyaWdodHMgd2hlbiAyCi0JCQkJCS8vIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgY295cmlnaHQgYXJlIGV4dGVuZGluZyBlYWNoIG90aGVyCi0JCQkJCS8vIHJlbW92ZSB0aGUgZHVwbGljYXRlIG9uZXMKLQkJCQkJaW50IGkgPSAwOwotCQkJCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQkJCWlmIChiYXNlSXRlbXMuY29udGFpbnModmFsdWVzLmdldChpKSkpIHsKLQkJCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQl2YWx1ZXMuYWRkQWxsKDAsIGJhc2VJdGVtcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNvcHlyaWdodCB0ZXh0Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQge0BsaW5rIE1ldGhvZEVsZW1lbnR9Ci0JICogQHBhcmFtIGNvbmZpZyB7QGxpbmsgTWV0aG9kQ29uZmlndXJhdGlvbn0KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvcHlyaWdodFRleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJU3RyaW5nQnVmZmVyIGNvcHlyaWdodHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY3VsYXRlQ29weXJpZ2h0KGVsZW1lbnQsIGNvbmZpZywgaXRlbXMpOwotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodDsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJY29weXJpZ2h0ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXQubmV4dCgpOwotCi0JCQkJLy8gQ29udHJpYnV0aW5nIHN1cHBvcnQgbWF0ZXJpYWwgZG9lcyBub3Qgc2hvdwotCQkJCS8vIHVwIGluIGNvcHkgcmlnaHQKLQkJCQkvLyBuZWVkIHRvIHJlc29sdmUgdGhlIGZlYXR1cmUgdmFsdWUuIGNhbid0IGp1c3QgZ2V0IHRoZSB2YWx1ZSwKLQkJCQkvLyBpdCBtYXkgaGF2ZSBjb250cmlidXRvcnMKLQkJCQkvLyBTdHJpbmcgc3RhdGVtZW50ID0KLQkJCQkvLyBjb3B5cmlnaHQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQkJLy8JCQkJCQkJCQkJCQotCQkJCVN0cmluZyBzdGF0ZW1lbnQgPSAoU3RyaW5nKSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvcHlyaWdodAotCQkJCQkJLmdldFByZXNlbnRhdGlvbigpLCBjb3B5cmlnaHQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCBjb25maWcpOwotCQkJCWlmIChzdGF0ZW1lbnQgIT0gbnVsbCAmJiBzdGF0ZW1lbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCS8vIG5lZWQgdG8gZml4IHRoZSBjb250ZW50IGZvciByZWxhdGl2ZSBsaW5rcy4KLQkJCQkJLy8gc2luY2UgdGhlIGxpbmsgaXMgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZQotCQkJCQkvLyBTdXBwb3J0aW5nTWF0ZXJpYWwgbG9jYXRpb24sCi0JCQkJCS8vIG5lZWQgdG8gY29udmVydCB0byByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBlbGVtZW50Ci0JCQkJCS8vIHNvIHJlLWNhbGN1YXRlIHRoZSBiYWNrIHBhdGgKLQkJCQkJLy8ganhpLCAwNi8yOC8wNQotCQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJCS5nZXRFbGVtZW50UGF0aChjb3B5cmlnaHQpOwotCQkJCQlTdHJpbmcgYmFja1BhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlbGVtZW50KTsKLQkJCQkJc3RhdGVtZW50ID0gUmVzb3VyY2VIZWxwZXIuZml4Q29udGVudFVybFBhdGgoc3RhdGVtZW50LAotCQkJCQkJCWNvbnRlbnRQYXRoLCBiYWNrUGF0aCk7Ci0KLQkJCQkJaWYgKGNvcHlyaWdodHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQljb3B5cmlnaHRzLmFwcGVuZCgiPHAvPiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29weXJpZ2h0cy5hcHBlbmQoc3RhdGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29weXJpZ2h0cy50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgU3RyaW5nIGF0dHJpYnV0ZSB2YWx1ZXMgb2YgYW4gYWN0aXZpdHkKLQkgKiAKLQkgKiBAcGFyYW0gZSBBY3Rpdml0eSBvciBpdCdzIENvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBhdHRyaWIKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBY3Rpdml0eVN0cmluZ0F0dHJpYnV0ZShNZXRob2RFbGVtZW50IGUsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCAKLQkJCUVBdHRyaWJ1dGUgYXR0cmliLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlpZighU3RyaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYXR0cmliLmdldEVBdHRyaWJ1dGVUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzcygpKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMgbm90IG9mIHR5cGUgU3RyaW5nOiAiICsgYXR0cmliKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlPYmplY3Qgc3RyID0gbnVsbDsKLQkJYm9vbGVhbiBpc0Rlc2M7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCB2ZTsKLQkJaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uICkKLQkJewotCQkJdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlLmVDb250YWluZXIoKTsKLQkJCWlmICggdmUgPT0gbnVsbCApIHsKLQkJCQl2ZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpb3duZXJFbGVtZW50OwotCQkJfQotCQkJaXNEZXNjID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICggZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkKLQkJewotCQkJdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KWU7Ci0JCQlpc0Rlc2MgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXN0ciA9IGUuZUdldChhdHRyaWIpOwotCQkJcmV0dXJuIChzdHI9PW51bGwpID8gIiIgOiBzdHIudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkKLQkJaWYoYXR0cmliID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3VpZCgpIHx8IGF0dHJpYiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZyllLmVHZXQoYXR0cmliKTsKLQkJfQkJCi0JCQkJCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQlpZiggYmFzZSAhPSBudWxsICYmIHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OKSB7Ci0JCQkvLyBmb3IgbG9jYWwgY29udHJpYnV0aW9uLCBhcHBlbmQgdGhlIHRleHQgdG8gdGhlIGJhc2UKLQkJCU9iamVjdCBzdHJCYXNlOwotCQkJaWYgKCBpc0Rlc2MgKSB7Ci0JCQkJc3RyID0gKChEZXNjcmliYWJsZUVsZW1lbnQpdmUpLmdldFByZXNlbnRhdGlvbigpLmVHZXQoYXR0cmliKTsKLQkJCQlzdHJCYXNlID0gY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSggKChEZXNjcmliYWJsZUVsZW1lbnQpYmFzZSkuZ2V0UHJlc2VudGF0aW9uKCksIGJhc2UsIGF0dHJpYiwgY29uZmlnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3RyID0gdmUuZUdldChhdHRyaWIpOwotCQkJCXN0ckJhc2UgPSBjYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGJhc2UsIG51bGwsIGF0dHJpYiwgY29uZmlnKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWlmICggc3RyQmFzZSAhPSBudWxsICYmIHN0ckJhc2UudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDAgKSB7Ci0JCQkJaWYgKCBzdHIgIT0gbnVsbCAmJiBzdHIudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDAgKSB7Ci0JCQkJCXN0ciA9IHN0ckJhc2UgKyBBVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SICsgc3RyOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0ciA9IHN0ckJhc2U7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3RyID0gY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShlLCB2ZSwgYXR0cmliLCBjb25maWcpOwotCQl9Ci0KLQkJcmV0dXJuIChzdHI9PW51bGwpID8gIiIgOiBzdHIudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkKLS8vCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZTsKLS8vCQlWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlOwkKLS8vCQlib29sZWFuIGNvbmNhdCA9IGF0dHJpYiAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLS8vCQl3aGlsZSh0cnVlKSB7Ci0vLwkJCWJhc2UgPSB2ZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwkJCWlmKGJhc2UgPT0gbnVsbCkgewotLy8JCQkJT2JqZWN0IHN0cjsKLS8vCQkJCWlmICggaXNEZXNjICkgewotLy8JCQkJCXN0ciA9ICgoRGVzY3JpYmFibGVFbGVtZW50KXZlKS5nZXRQcmVzZW50YXRpb24oKS5lR2V0KGF0dHJpYik7IAotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlzdHIgPSAgdmUuZUdldChhdHRyaWIpOyAKLS8vCQkJCX0KLS8vCQkJCWlmKHN0ciA9PSBudWxsIHx8IHN0ci50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsKLS8vCQkJCQlpZih2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0vLwkJCQkJCXZhbHVlcy5hZGQoc3RyKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIHsKLS8vCQkJCQl2YWx1ZXMuYWRkKDAsIHN0cik7Ci0vLwkJCQl9Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQllbHNlIGlmKGJhc2UgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotLy8JCQkJT2JqZWN0IHN0cjsKLS8vCQkJCWlmICggaXNEZXNjICkgewotLy8JCQkJCXN0ciA9ICgoRGVzY3JpYmFibGVFbGVtZW50KXZlKS5nZXRQcmVzZW50YXRpb24oKS5lR2V0KGF0dHJpYik7IAotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQlzdHIgPSB2ZS5lR2V0KGF0dHJpYik7IAotLy8JCQkJfQotLy8KLS8vCQkJCXZhcmlhYmlsaXR5VHlwZSA9IHZlLmdldFZhcmlhYmlsaXR5VHlwZSgpOwotLy8JCQkJaWYodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX0xJVEVSQUwpIHsKLS8vCQkJCQlpZihzdHIgPT0gbnVsbCB8fCBzdHIudG9TdHJpbmcoKS5sZW5ndGgoKSA9PSAwKSB7Ci0vLwkJCQkJCS8vIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGJhc2UKLS8vCQkJCQkJLy8KLS8vCQkJCQkJdmUgPSBiYXNlOwotLy8JCQkJCX0KLS8vCQkJCQllbHNlIHsKLS8vCQkJCQkJdmFsdWVzLmFkZCgwLCBzdHIpOwotLy8JCQkJCQlicmVhazsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCQllbHNlIGlmKHZhcmlhYmlsaXR5VHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuTE9DQUxfQ09OVFJJQlVUSU9OX0xJVEVSQUwpIHsJCQkJCQotLy8JCQkJCWlmKHN0ciAhPSBudWxsICYmIHN0ci50b1N0cmluZygpLmxlbmd0aCgpID4gMCkgewotLy8JCQkJCQkvLyBhZGQgdG8gdGhlIGxpc3QKLS8vCQkJCQkJLy8KLS8vCQkJCQkJdmFsdWVzLmFkZCgwLCBzdHIpOwotLy8JCQkJCQlpZighY29uY2F0KSB7Ci0vLwkJCQkJCQlicmVhazsKLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCQkvLyBnbyB0byB0aGUgYmFzZQotLy8JCQkJCXZlID0gYmFzZTsKLS8vCQkJCX0KLS8vCQkJCWVsc2UgaWYodmFyaWFiaWxpdHlUeXBlID09IFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVF9MSVRFUkFMKSB7Ci0vLwkJCQkJdmFsdWVzLmFkZCgwLCBzdHIpOwotLy8JCQkJCWJyZWFrOwotLy8JCQkJfQotLy8JCQkJLy9UT0RPOiBoYW5kbGUgQ09OVFJJQlVURVMgQU5EIFJFUExBQ0VTCi0vLwkJCX0KLS8vCQl9Ci0vLwkJCi0vLwkJaWYgKCB2YWx1ZXMuc2l6ZSgpID09IDAgKSB7Ci0vLwkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQllbHNlIGlmICggdmFsdWVzLnNpemUoKSA9PTEgKSB7Ci0vLwkJCXJldHVybiAoU3RyaW5nKXZhbHVlcy5nZXQoMCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdmFsdWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0vLwkJCQlpZiAoIGJ1ZmZlci5sZW5ndGgoKSA+IDAgKSB7Ci0vLwkJCQkJYnVmZmVyLmFwcGVuZChBVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKTsKLS8vCQkJCX0KLS8vCQkJCWJ1ZmZlci5hcHBlbmQoaXQubmV4dCgpKTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CQkJCi0vLwkJfQotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIHByb2Nlc3NlcyBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHBsdWdpbnMgPSBjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlMaXN0IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMoKE1ldGhvZFBsdWdpbilpdC5uZXh0KCkpOwotCQkJZm9yICggSXRlcmF0b3IgaXRwID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKWl0cC5uZXh0KCk7Ci0JCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBwbHVnaW4gYW5kIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsUHJvY2Vzc2VzKE1ldGhvZFBsdWdpbiBwbHVnaW4sIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3QgcHJvY2Vzc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGl0ZW1zID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJZm9yICggSXRlcmF0b3IgaXRwID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRwLmhhc05leHQoKTsgKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgcCA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpaXRwLm5leHQoKTsKLQkJCWlmICggY2FuU2hvdyhwLCBjb25maWcpICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkgKSB7Ci0JCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCX0KLQkJfQotCQotCQlyZXR1cm4gcHJvY2Vzc2VzOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIGRlbGl2ZXJ5IHByb2Nlc3NlcyBpbiB0aGUgcGx1Z2luIGFuZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHBsdWdpbgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWxsRGVsaXZlcnlQcm9jZXNzZXMoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcylpdHAubmV4dCgpOwotCQkJaWYgKCBwIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzICkgewotCQkJCWlmICggY2FuU2hvdyhwLCBjb25maWcpICYmICFwcm9jZXNzZXMuY29udGFpbnMocCkgKSB7Ci0JCQkJCXByb2Nlc3Nlcy5hZGQocCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCi0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhbGwgQ2FwYWJpbGl0eVBhdHRlcm5zIGluIHRoZSBwbHVnaW4gYW5kIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxDYXBhYmlsaXR5UGF0dGVybnMoTWV0aG9kUGx1Z2luIHBsdWdpbiwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCBwcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaXRlbXMgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKCBJdGVyYXRvciBpdHAgPSBpdGVtcy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOyApIHsKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBwID0gKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcylpdHAubmV4dCgpOwotCQkJaWYgKCBwIGluc3RhbmNlb2YgQ2FwYWJpbGl0eVBhdHRlcm4gKSB7Ci0JCQkJaWYgKCBjYW5TaG93KHAsIGNvbmZpZykgJiYgIXByb2Nlc3Nlcy5jb250YWlucyhwKSApIHsKLQkJCQkJcHJvY2Vzc2VzLmFkZChwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJcmV0dXJuIHByb2Nlc3NlczsKLQl9Ci0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSB3b3JrIHByb2R1Y3RzIG1vZGlmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgcm9sZSwgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBSb2xlCi0JICogQHBhcmFtIG93bmVyRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSBvd25lciB0byBhY2NlcHQgdGhlIGNhbGN1bGF0ZWQgdmFsdWUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZSByb2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0cyhSb2xlIGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJTGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3M7Ci0JCVRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlIGZ2MiA9IG5ldyBUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgb2ZlYXR1cmUsIHJlYWxpemVyLCBmdjIpOwotCQlpZiAoIGZ2Mi5zaXplKCkgPiAwICkgewotCQkJTGlzdCB2MiA9IChMaXN0KWZ2Mi5nZXRWYWx1ZSgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHYyLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXQubmV4dCgpOwotCQkJCVRvTWFueUZlYXR1cmVWYWx1ZSBmdiA9IG5ldyBUb01hbnlGZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCQkJKChMaXN0KWZ2LmdldFZhbHVlKCkpLmFkZEFsbCh2KTsKLQkJCQkKLQkJCQljYWxjdWxhdGVGZWF0dXJlKGUsIG93bmVyRWxlbWVudCwgCi0JCQkJCQlmZWF0dXJlLCAKLQkJCQkJCXJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSwgZnYsIHJlYWxpemVyKTsJCi0JCQkJdiA9IChMaXN0KWZ2LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0JCi0JCQotCQlyZXR1cm4gdjsKLQl9Ci0JCQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzIG1vZGlmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgcm9sZSBkZXNjcmlwdG9yLCBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IFJvbGVEZXNjcmlwdG9yCi0JICogQHBhcmFtIG93bmVyRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSBvd25lciB0byBhY2NlcHQgdGhlIGNhbGN1bGF0ZWQgdmFsdWUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QgbGlzdCBvZiB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIHJvbGUgZGVzY3JpcHRvcgotCSAqIEBkZXByZWNhdGVkIHVzZSB0aGUgUm9sZURlc2NyaXB0b3JMYXlvdXQgdG8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGNNb2RpZmllZFdvcmtQcm9kdWN0RGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3IgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnM7Ci0JCVRvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlIGZ2MiA9IG5ldyBUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZShlbGVtZW50LCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQljYWxjdWxhdGVPcHBvc2l0ZUZlYXR1cmUoZWxlbWVudCwgb2ZlYXR1cmUsIHJlYWxpemVyLCBmdjIpOwotCQlpZiAoIGZ2Mi5zaXplKCkgPiAwICkgewotCQkJTGlzdCB2MiA9IChMaXN0KWZ2Mi5nZXRWYWx1ZSgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2Mi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQkKLQkJCQlUb01hbnlGZWF0dXJlVmFsdWUgZnYgPSBuZXcgVG9NYW55RmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJCSgoTGlzdClmdi5nZXRWYWx1ZSgpKS5hZGRBbGwodik7Ci0JCQkJCi0JCQkJY2FsY3VsYXRlRmVhdHVyZShlLCBvd25lckVsZW1lbnQsIAotCQkJCQkJZmVhdHVyZSwgCi0JCQkJCQlyZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCksIGZ2LCByZWFsaXplcik7CQotCQkJCXYgPSAoTGlzdClmdi5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdjsKLQl9Ci0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHRoZSByb2xlcyB0aGF0IG1vZGlmaWVzIHRoZSBzcGVjaWZpZWQgd29yayBwcm9kdWN0IGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQgV29ya1Byb2R1Y3QKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIExpc3QgdGhlIHJvbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGNNb2RpZnlSb2xlcyhXb3JrUHJvZHVjdCBlbGVtZW50LCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJTGlzdCB0YXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCWVsZW1lbnQsIAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsIAotCQkJCXJlYWxpemVyKTsKLQkJTGlzdCBtb2RpZnlSb2xlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRhc2tzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlUYXNrIHQgPSAoVGFzaylpdC5uZXh0KCk7Ci0JCQlSb2xlIHIgPSAoUm9sZSlDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSgKLQkJCQkJdCwgCi0JCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgCi0JCQkJCXJlYWxpemVyKTsKLQkJCWlmICggKHIgIT0gbnVsbCkgJiYgIW1vZGlmeVJvbGVzLmNvbnRhaW5zKHIpICkgewotCQkJCW1vZGlmeVJvbGVzLmFkZChyKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG1vZGlmeVJvbGVzOwotCX0KLQkKLQkvKioKLQkgKiBjYWxjdWxhdGUgdGhlIHJvbGUgZGVzY3JpcHRvcnMgdGhhdCBtb2RpZmllcyB0aGUgc3BlY2lmaWVkIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQgV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICogQHJldHVybiBMaXN0IHRoZSByb2xlIGRlc2NyaXB0b3JzCi0JICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JsYXlvdXQgdG8gY2FsY3VsYXRlIHRoZSBmZWF0dXJlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGNhbGNNb2RpZnlSb2xlRGVzY3JpcHRvcnMoV29ya1Byb2R1Y3REZXNjcmlwdG9yIGVsZW1lbnQsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlMaXN0IHRhc2tEZXNjcmlwdG9ycyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCWVsZW1lbnQsIAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycywgCi0JCQkJcmVhbGl6ZXIpOwotCQlMaXN0IG1vZGlmeVJvbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ID0gKFRhc2tEZXNjcmlwdG9yKWl0Lm5leHQoKTsKLQkJCVJvbGVEZXNjcmlwdG9yIHIgPSAoUm9sZURlc2NyaXB0b3IpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoCi0JCQkJCXQsIAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCAKLQkJCQkJcmVhbGl6ZXIpOwotCQkJaWYgKCAociAhPSBudWxsKSAmJiAhbW9kaWZ5Um9sZXMuY29udGFpbnMocikgKSB7Ci0JCQkJbW9kaWZ5Um9sZXMuYWRkKHIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbW9kaWZ5Um9sZXM7Ci0JfQotCQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBhY3Rpdml0eSBpcyBhIGNvbnRyaWJ1dG9yIAotCSAqIG9yIGNvbnRhaW5zIGFueSBzdWItYWN0aXZpdGllcyB0aGF0IGFyZSBjb250cmlidXRvcnMKLQkgKiBAcGFyYW0gZWxlbWVudCBBY3Rpdml0eQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDb250cmlidXRvcihBY3Rpdml0eSBlbGVtZW50KSB7Ci0JCWlmICggaXNDb250cmlidXRvcihlbGVtZW50KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmb3IgKCBJdGVyYXRvciBpdCA9IGVsZW1lbnQuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoICEobyBpbnN0YW5jZW9mIEFjdGl2aXR5KSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaWYgKCBoYXNDb250cmlidXRvciggKEFjdGl2aXR5KW8gKSApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGJhc2UgcHJvY2Vzc2VzIGZvciBhbiB7QGxpbmsgQWN0aXZpdHl9IGluIHRoZSBDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldEJhc2VQcm9jZXNzZXMoQWN0aXZpdHkgZWxlbWVudCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdCB2YWx1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0QmFzZVByb2Nlc3NlcyhlbGVtZW50LCBjb25maWcsIHZhbHVlKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYWxsIGJhc2UgcHJvY2Vzc2VzIGZvciBhbiBhY3Rpdml0eSBpbiB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSB2YWx1ZSBMaXN0IHRoZSBiYXNlcyBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QmFzZVByb2Nlc3NlcyhBY3Rpdml0eSBlbGVtZW50LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgTGlzdCB2YWx1ZSkgewotCQkKLQkJLy8gZ2V0IGl0J3Mgb3duIGJhc2UKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kZXIoZWxlbWVudCkgKSB7Ci0JCQlBY3Rpdml0eSBiYXNlID0gKEFjdGl2aXR5KWVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJaWYgKCBiYXNlICE9IG51bGwgCi0JCQkJCSYmICF2YWx1ZS5jb250YWlucyhiYXNlKSAKLQkJCQkJJiYgKGJhc2UgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpICkgewotCQkJCWlmICggY2FuU2hvdyhiYXNlLCBjb25maWcpICkgewotCQkJCQl2YWx1ZS5hZGQoYmFzZSk7Ci0JCQkJfQotCQkJCWdldEJhc2VQcm9jZXNzZXMoYmFzZSwgY29uZmlnLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGlmIHRoZSBzdWItYWN0aXZpdGllcyBoYXZlIGJhc2UsIHByb2Nlc3MgaXQKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBlbGVtZW50LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKCBvIGluc3RhbmNlb2YgQWN0aXZpdHkgKSB7Ci0JCQkJZ2V0QmFzZVByb2Nlc3NlcygoQWN0aXZpdHkpbywgY29uZmlnLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0SW5oZXJpdGluZ1VyaShEZXNjcmliYWJsZUVsZW1lbnQgb2JqLCBVUkkgdXJpLAotCQkJVmFyaWFiaWxpdHlFbGVtZW50W10gdXJpSW5oZXJpdGluZ0Jhc2VzLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgaW50IHVyaVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IHZlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbAotCQkJCSYmICh2ZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyB8fCB2ZQotCQkJCQkJLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTX1JFUExBQ0VTKSkgewotCQkJYmFzZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoYmFzZSwgY29uZmlnKTsKLQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQlpZiAodXJpVHlwZSA9PSAwKSB7Ci0JCQkJCXVyaSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBiYXNlKS5nZXROb2RlaWNvbigpOwotCQkJCX0gZWxzZSBpZiAodXJpVHlwZSA9PSAxKSB7Ci0JCQkJCXVyaSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBiYXNlKS5nZXRTaGFwZWljb24oKTsKLQkJCQl9Ci0JCQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQkJCXVyaUluaGVyaXRpbmdCYXNlc1swXSA9IGJhc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmYxN2NkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwODcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZS5JQ29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotCi0vKioKLSAqICBDbGFzcyBtYW5hZ2luZyBjYWNoZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIE1hciAxOSwgMjAwOAotICogQHNpbmNlIDEuNQotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblByb3BlcnRpZXMgewotCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIGJvb2xlYW4gaGlkZVdhcm5pbmdzID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGhpZGVFcnJvcnMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaGlkZUluZm9zID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIG5vdGlmeWluZ0xpc3RlbmVycyA9IHRydWU7Ci0JcHJpdmF0ZSBMaXN0ZW5lckxpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyTGlzdCgpOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uUHJvcGVydGllcyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJbG9hZEZyb21Db25maWd1cmF0aW9uKCk7Ci0JfQotCQkJCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRIaWRlUHJvcFN0cmluZ3MoKSB7Ci0JCVN0cmluZ1tdIGhpZGVQcm9wcyA9IHsgTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0VSUk9SUywKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHlIZWxwZXIuQ09ORklHX1BST1BCTEVNX0hJREVfV0FSTklOR1MsCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0lORk9TfTsKLQkJcmV0dXJuIGhpZGVQcm9wczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZEZyb21Db25maWd1cmF0aW9uKCkgewotCQlTdHJpbmdbXSBoaWRlUHJvcHMgPSBnZXRIaWRlUHJvcFN0cmluZ3MoKTsKLQkJCi0JCWJvb2xlYW4gb2xkTm90aWZ5aW5nTGlzdGVuZXJzID0gc2V0Tm90aWZ5TGlzdGVuZXJzKGZhbHNlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoaWRlUHJvcHMubGVuZ3RoOyBpKyspIHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5KGNvbmZpZywgaGlkZVByb3BzW2ldKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHByb3AgPT0gbnVsbCA/IEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSA6IHByb3AuZ2V0VmFsdWUoKTsKLQkJCWJvb2xlYW4gYiA9IEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFscyh2YWx1ZSk7Ci0JCQlpZiAoaSA9PSAwKSB7Ci0JCQkJc2V0SGlkZUVycm9ycyhiKTsKLQkJCX0gZWxzZSBpZiAoaSA9PSAxKSB7Ci0JCQkJc2V0SGlkZVdhcm5pbmdzKGIpOwotCQkJfSBlbHNlIGlmIChpID09IDIpIHsKLQkJCQlzZXRIaWRlSW5mb3MoYik7Ci0JCQl9Ci0JCX0KLQkJc2V0Tm90aWZ5TGlzdGVuZXJzKG9sZE5vdGlmeWluZ0xpc3RlbmVycyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHRvSGlkZShJQ29uZmlndXJhdGlvbkVycm9yIGVycm9yKSB7Ci0JCWlmIChlcnJvci5pc0Vycm9yKCkpIHsKLQkJCXJldHVybiBpc0hpZGVFcnJvcnMoKTsKLQkJfSBlbHNlIGlmIChlcnJvci5pc1dhcm5pbmcoKSkgewotCQkJcmV0dXJuIGlzSGlkZVdhcm5pbmdzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gaXNIaWRlSW5mb3MoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSGlkZVdhcm5pbmdzKCkgewotCQlyZXR1cm4gaGlkZVdhcm5pbmdzOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRIaWRlV2FybmluZ3MoU3RyaW5nIHZhbHVlKSB7Ci0JCXNldEhpZGVXYXJuaW5ncyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHModmFsdWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SGlkZVdhcm5pbmdzKGJvb2xlYW4gaGlkZVdhcm5pbmdzKSB7Ci0JCWlmICh0aGlzLmhpZGVXYXJuaW5ncyAhPSBoaWRlV2FybmluZ3MpIHsKLQkJCXRoaXMuaGlkZVdhcm5pbmdzID0gaGlkZVdhcm5pbmdzOwotCQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlRXJyb3JzKCkgewotCQlyZXR1cm4gaGlkZUVycm9yczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SGlkZUVycm9ycyhTdHJpbmcgdmFsdWUpIHsKLQkJc2V0SGlkZUVycm9ycyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHModmFsdWUpKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SGlkZUVycm9ycyhib29sZWFuIGhpZGVFcnJvcnMpIHsKLQkJaWYgKHRoaXMuaGlkZUVycm9ycyAhPSBoaWRlRXJyb3JzKSB7Ci0JCQl0aGlzLmhpZGVFcnJvcnMgPSBoaWRlRXJyb3JzOwotCQkJbm90aWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0hpZGVJbmZvcygpIHsKLQkJcmV0dXJuIGhpZGVJbmZvczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SGlkZUluZm9zKFN0cmluZyB2YWx1ZSkgewotCQlzZXRIaWRlSW5mb3MoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzKHZhbHVlKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEhpZGVJbmZvcyhib29sZWFuIGhpZGVJbmZvcykgewotCQlpZiAodGhpcy5oaWRlSW5mb3MgIT0gaGlkZUluZm9zKSB7Ci0JCQl0aGlzLmhpZGVJbmZvcyA9IGhpZGVJbmZvczsKLQkJCW5vdGlmeUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXJzKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVycyhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKCkgewotCQlpZiAoISBnZXROb3RpZnlpbmdMaXN0ZW5lcnMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoT2JqZWN0IG8gOiBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgTGlzdGVuZXIpCi0JCQkJKChMaXN0ZW5lcilvKS5maXJlRXZlbnQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZmlyZUV2ZW50KCkgewkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXROb3RpZnlpbmdMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBub3RpZnlpbmdMaXN0ZW5lcnM7Ci0JfQotCQotCS8vcmV0dXJuIG9sZCB2YWx1ZQotCXB1YmxpYyBib29sZWFuIHNldE5vdGlmeUxpc3RlbmVycyhib29sZWFuIGIpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IG5vdGlmeWluZ0xpc3RlbmVyczsKLQkJbm90aWZ5aW5nTGlzdGVuZXJzID0gYjsKLQkJcmV0dXJuIG9sZFZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGtleS5lcXVhbHMoTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX0VSUk9SUykpIHsKLQkJCXNldEhpZGVFcnJvcnModmFsdWUpOwotCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNPTkZJR19QUk9QQkxFTV9ISURFX1dBUk5JTkdTKSkgewotCQkJc2V0SGlkZVdhcm5pbmdzKHZhbHVlKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5DT05GSUdfUFJPUEJMRU1fSElERV9JTkZPUykpIHsKLQkJCXNldEhpZGVJbmZvcyh2YWx1ZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9EZWZhdWx0RWxlbWVudFJlYWxpemVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9EZWZhdWx0RWxlbWVudFJlYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTkyYjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vRGVmYXVsdEVsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWFsaXplci4KLSAqIFJlYWxpemVzIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIGFuZCByZWFsaXplIG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RWxlbWVudFJlYWxpemVyIGV4dGVuZHMgRWxlbWVudFJlYWxpemVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEZWZhdWx0RWxlbWVudFJlYWxpemVyX1R5cGUgPSAiRGVmYXVsdEVsZW1lbnRSZWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyX1R5cGUgPSAiUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcl9UeXBlID0gIlByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVsZW1lbnRSZWFsaXplciBjcmVhdGVFbGVtZW50UmVhbGl6ZXJFeHRlbnNpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0eXBlKSB7Ci0JCU9iamVjdCBleHQgPSBFeHRlbnNpb25NYW5hZ2VyLmNyZWF0ZUV4dGVuc2lvbihMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAiZWxlbWVudFJlYWxpemVyRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBleHQgaW5zdGFuY2VvZiBJRWxlbWVudFJlYWxpemVyRmFjdG9yeSA/Ci0JCQkoKElFbGVtZW50UmVhbGl6ZXJGYWN0b3J5KSBleHQpLmNyZWF0ZVJlYWxpemVyKGNvbmZpZywgdHlwZSkgOiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVsZW1lbnRSZWFsaXplciBuZXdFbGVtZW50UmVhbGl6ZXIoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IsCi0JCQlib29sZWFuIHJlc29sdmVSZXBsYWNlcikgewotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBjcmVhdGVFbGVtZW50UmVhbGl6ZXJFeHRlbnNpb24oY29uZmlnLCBEZWZhdWx0RWxlbWVudFJlYWxpemVyX1R5cGUpOwotCQlpZiAocmVhbGl6ZXIgPT0gbnVsbCkgewotCQkJcmVhbGl6ZXIgPSBuZXcgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQl9Ci0JCXJlYWxpemVyLnNldFJlc29sdmVDb250cmlidXRvcihyZXNvbHZlQ29udHJpYnV0b3IpOwotCQlyZWFsaXplci5zZXRSZXNvbHZlUmVwbGFjZXIocmVzb2x2ZVJlcGxhY2VyKTsKLQkJcmV0dXJuIHJlYWxpemVyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVsZW1lbnRSZWFsaXplciBuZXdFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJcmV0dXJuIG5ld0VsZW1lbnRSZWFsaXplcihjb25maWcsIHRydWUsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZSBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBhbmQgYWRkaXRpb25hbCByZWFsaXphdGlvbiBvcHRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSByZXNvbHZlQ29udHJpYnV0b3IgYm9vbGVhbiBpZiB0cnVlLCBjb250cnVidXRvcnMgZnJvbSBmZWF0dXJlIHZhbHVlIGxpc3Qgd2lsbCBiZSByZXNvbHZlZC4gZGVmYXVsdCB0byBmYWxzZS4KLQkgKiBAcGFyYW0gcmVzb2x2ZVJlcGxhY2VyIGJvb2xlYW4gaWYgdHVyZSwgZWxlbWVudCB3aXRoIGEgcmVwbGFjZXIgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgcmVwbGFjZXIuIGRlZmF1bHQgdG8gdHJ1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVmYXVsdEVsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCWJvb2xlYW4gcmVzb2x2ZUNvbnRyaWJ1dG9yLCBib29sZWFuIHJlc29sdmVSZXBsYWNlcikgewotCQlzdXBlcihjb25maWcsIHJlc29sdmVDb250cmlidXRvciwgcmVzb2x2ZVJlcGxhY2VyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBFbGVtZW50UmVhbGl6ZXIucmVhbGl6ZQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBzdXBlci5yZWFsaXplKGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBsaXN0IG9mIGZlYXR1cmUgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdmFsdWVzCi0JICogVGhlIG5ldyBtaWdodCBiZSBhIHJlLXNvcnRpbmcgb2YgdGhlIG9yaWdpbmFsIGxpc3QgCi0JICogb3Igc29tZSBvZiB0aGUgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQsIGRlcGVuZGluZyBvbiB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9uCi0JICogTm90ZTogdGhlIGxpc3QgdmFsdWUgcGFzc2VkIGluIG1pZ2h0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcyBMaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgcmVhbGl6ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKQotCXsKLQkJaWYgKCB2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCQotCQkvLyBXcm9uZyAibW9kaWZpZXMiIGluZm9ybWF0aW9uIHB1Ymxpc2hlZCBpbiB0ZWFtIGFsbG9jYXRpb24gdmlldyBmb3Igc21hbGwgY29uZmlndXJhdGlvbgotCQkvLyBhZGRlZCBmaWx0ZXIgdG8gY2xlYW4gdXAgdW4td2FudGVkIGl0ZW1zCi0JCWlmICggc3VwZXIuZmlsdGVyICE9IG51bGwgKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLQkJCQlNZXRob2RFbGVtZW50IG8gPSAoTWV0aG9kRWxlbWVudCkgdmFsdWVzLmdldChpKTsKLQotCQkJCWlmICggIWZpbHRlci5hY2NlcHQobykgKSB7Ci0JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQkvLyBpZiB0aGUgZmVhdHVyZSB2YWx1ZSBpcyBjb250YWlubWVudCBlbGVtZW50IHN1Y2ggYXMgYXJ0aWZhY3QKLQkJLy8gdGhlIGNoaWxkIGVsZW1lbnQgY2FuJ3Qgc2hvdyBpZiBhbnkgb2YgdGhlIHBhcmVudChzKSBhcmUgaW4gdGhlIGxpc3QKLQkJLy8gMDAzODQ2MTkgLSBQdWJsaXNoZWQgc2l0ZTogRGlzcGxheSBvZiBXUHMgdW5kZXIgcmVzcG9uc2libGUgcm9sZQotCQkKLQkJLy8gdGhpcyBpcyBub3QgYSBnZW5lcmFsIHJ1bGUuIG9ubHkgYXBwbHkgdG8gdGhlIHB1Ymxpc2hlZCBuYXZpZ2F0aW9uIHRyZWUuCi0JCS8vIHNvIG1vdmUgdGhpcyBsb2dpYyB0byB0aGUgdHJlZSBnZW5lcmF0aW9uIGNvZGUgaW4gcHVibGlzaGluZwotCQkvLyBnZWVucmFsbHksIHNob3cgYWxsIGVsZW1lbnRzLCBzZWUgYnVnCi0JCS8vIDAwMzg2NzY1IC0gUm9sZSByZXNwb25zaWJpbGl0aWVzIG5lZWQgdG8gc2hvdyAoY29udHJpYnV0ZWQpIHN1Yi1hcnRpZmFjdHMJCi0vLwkJaWYgKGZlYXR1cmUuaXNNYW55KCkgJiYgdmFsdWVzLnNpemUoKSA+IDAKLS8vCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250YWlubWVudEVsZW1lbnQodmFsdWVzLmdldCgwKSkpIHsKLS8vCQkJaW50IGkgPSAwOwotLy8JCQl3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKLS8vCQkJCU1ldGhvZEVsZW1lbnQgbyA9IChNZXRob2RFbGVtZW50KSB2YWx1ZXMuZ2V0KGkpOwotLy8KLS8vCQkJCS8vIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxpc3QsIHJlbW92ZSB0aGlzCi0vLwkJCQkvLyBlbGVtZW50IGZyb20gdGhlIGxpc3QKLS8vCQkJCWlmIChDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udGFpbmVySW5MaXN0KG8sIHZhbHVlcywgY29uZmlnKSkgewotLy8JCQkJCXZhbHVlcy5yZW1vdmUoaSk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCWkrKzsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQotCQkvLyBuZWVkIHRvIHNvcnQgdGhlIGNvbmNlcHQgYW5kIHBhcGVycyBieSB0eXBlCi0JCWlmICgoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKQotCQkJCSYmICh2YWx1ZXMuc2l6ZSgpID4gMCkpIHsKLQkJCUxpc3QgcGFwZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB2YWx1ZXMuc2l6ZSgpKSB7Ci0JCQkJT2JqZWN0IG8gPSB2YWx1ZXMuZ2V0KGkpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgV2hpdGVwYXBlcikgewotCQkJCQlwYXBlcnMuYWRkKG8pOwotCQkJCQl2YWx1ZXMucmVtb3ZlKGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChwYXBlcnMuc2l6ZSgpID4gMCkgewotCQkJCXZhbHVlcy5hZGRBbGwocGFwZXJzKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZhbHVlczsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9FbGVtZW50UmVhbGl6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0VsZW1lbnRSZWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGMyZjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5QcmVzZW50YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Ccm93c2luZ0xheW91dFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFJlYWxpemVzIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBjb25maWd1cmF0aW9uIGFuZCByZWFsaXplIG9wdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVsZW1lbnRSZWFsaXplciB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQkvLyBub3RlOiBkaXNjYXJkIGNvbnRyaWJ1dG9yIHRha2VzIGhpZ2hlciBwcmlvcml0eSwgaWYgc2V0IHRvIHRydWUsCi0JLy8gcmVzb2x2ZUNvbnRyaWJ1dG9yIHdpbGwgYmUgaWdub3JlZAotCXByaXZhdGUgYm9vbGVhbiBkaXNjYXJkQ29udHJpYnV0b3IgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVSZXBsYWNlciA9IHRydWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1N1YnRyYWN0ZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwotCQotCS8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgc2V0dGluZyBiYXNlZCBvbiB0aGUgcHJlZmVyZW5jZSBzZXR0aW5nCi0JLy8gc3ViY2xhc3Mgc2hvdWxkIGltcGxlbWVudCB0aGVpciBvd24gbWV0aG9kIHRoZSBnZXQgdGhlIHZhbHVlCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWZhdWx0RW5hYmxlRXh0ZW5kUmVwbGFjZSA9IGZhbHNlOwotCQotCQotCS8vcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWZhdWx0SWdub3JlQmFzZVRvTWFueUFzc29jaWF0aW9ucyA9IGZhbHNlOwotCi0Jc3RhdGljIHsKLQkJU3RyaW5nIHN0ciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0cmluZygiRW5hYmxlRXh0ZW5kUmVwbGFjZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggc3RyICE9IG51bGwgJiYgc3RyLnRyaW0oKS5lcXVhbHMoInRydWUiKSApIHsgLy8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdEVuYWJsZUV4dGVuZFJlcGxhY2UgPSB0cnVlOwotCQl9Ci0JCQotCQkvLyAxNzE4ODIgLSBFeHRlbmRzLVJlcGxhY2UgVmFyaWFiaWxpdHkKLQkJLy9kZWZhdWx0SWdub3JlQmFzZVRvTWFueUFzc29jaWF0aW9ucyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCk7CQkKLQl9Ci0JCi0JLyoqCi0JICogY29uc3RydWN0IGFuIGluc3RhbmNlIHdpdGggdGhlIGdpdmUgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcyhjb25maWcsIHRydWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGFuZCBhZGRpdGlvbmFsIHJlYWxpemF0aW9uIG9wdGlvbnMuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHJlc29sdmVDb250cmlidXRvciBib29sZWFuIGlmIHRydWUsIGNvbnRydWJ1dG9ycyBmcm9tIGZlYXR1cmUgdmFsdWUgbGlzdCB3aWxsIGJlIHJlc29sdmVkLiBkZWZhdWx0IHRvIGZhbHNlLgotCSAqIEBwYXJhbSByZXNvbHZlUmVwbGFjZXIgYm9vbGVhbiBpZiB0dXJlLCBlbGVtZW50IHdpdGggYSByZXBsYWNlciB3aWxsIGJlIHJlc29sdmVkIHRvIHRoZSByZXBsYWNlci4gZGVmYXVsdCB0byB0cnVlLgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlib29sZWFuIHJlc29sdmVDb250cmlidXRvciwgYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCXRoaXMucmVzb2x2ZUNvbnRyaWJ1dG9yID0gcmVzb2x2ZUNvbnRyaWJ1dG9yOwotCQl0aGlzLnJlc29sdmVSZXBsYWNlciA9IHJlc29sdmVSZXBsYWNlcjsKLQkJCi0JfQotCi0JLyoqCi0JICogaXMgZXh0ZW5kLXJlcGxhY2UgZW5hYmxlZCBmb3IgcmVwbGFjZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRFbmFibGVFeHRlbmRSZXBsYWNlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGdsb2JhbCBzZXR0aW5nIGZvciB0aGUgZXh0ZW5kIHNlbWFudGljcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaWdub3JlQmFzZVRvTWFueUFzc29jaWF0aW9ucygpIHsKLQkJcmV0dXJuIEJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0UuaXNVc2VOZXdFeHRlbmRTZW1hbnRpY3MoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogc2V0IHRoZSBmbGFnLiBpZiB0cnVlLCB0aGUgY29udHJpYnV0b3JzIGZyb20gYSByZWFsaXplZCBmZWF0dXJlIGxpc3Qgd2lsbCBiZSBkaXNjYXJkZWQKLQkgKiAKLQkgKiBAcGFyYW0gZGlzY2FyZENvbnRyaWJ1dG9yIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkQ29udHJpYnV0b3IoYm9vbGVhbiBkaXNjYXJkQ29udHJpYnV0b3IpIHsKLQkJdGhpcy5kaXNjYXJkQ29udHJpYnV0b3IgPSBkaXNjYXJkQ29udHJpYnV0b3I7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBmbGFnLiBpZiB0cnVlIHRoZSBjb250cmlidXRvcnMgd2lsbCBiZSByZXNvbHZlZC4KLQkgKiBAcGFyYW0gcmVzb2x2ZUNvbnRyaWJ1dG9yIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlQ29udHJpYnV0b3IoYm9vbGVhbiByZXNvbHZlQ29udHJpYnV0b3IpIHsKLQkJdGhpcy5yZXNvbHZlQ29udHJpYnV0b3IgPSByZXNvbHZlQ29udHJpYnV0b3I7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBmbGFnLiBpZiB0cnVlIHRoZSBlbGVtZW50IHdpdGggYSByZXBsYWNlciB3aWxsIGJlIHJlc29sdmVkIHRvIHRoZSByZXBsYWNlci4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb2x2ZVJlcGxhY2VyIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlUmVwbGFjZXIoYm9vbGVhbiByZXNvbHZlUmVwbGFjZXIpIHsKLQkJdGhpcy5yZXNvbHZlUmVwbGFjZXIgPSByZXNvbHZlUmVwbGFjZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvd1N1YnRyYWN0ZWQoKSB7Ci0JCXJldHVybiBzaG93U3VidHJhY3RlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd1N1YnRyYWN0ZWQoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMuc2hvd1N1YnRyYWN0ZWQgPSBmbGFnOwotCX0KLQkKLQotCS8qKgotCSAqIHNldCBhIGZpbHRlciBmb3IgdGhpcyByZWFsaXplcgotCSAqIEBwYXJhbSBmaWx0ZXIgSUZpbHRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihJRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHR5aGUgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8ICFpbkNvbmZpZyhlbGVtZW50KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBXb3JrIHByb2R1Y3QgZGVzY3JpcHRvcnMgdGhhdCBwb2ludCB0byB3b3JrIHByb2R1Y3RzCi0JCS8vIG91dHNpZGUgdGhlIGNvbmZpZ3VyYXRpb24gYXJlIHN0aWxsIHB1Ymxpc2hlZAotCQkvLyBsaW5rZWQgZWxlbWVudCBtdXN0IGJlIGluIGNvbmZpZyBhcyB3ZWxsCi0JCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRUYXNrKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRXb3JrUHJvZHVjdCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoUm9sZURlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFJvbGUoKTsKLQkJfQotCi0JCWlmICgobGlua2VkRWxlbWVudCAhPSBudWxsKQotCQkJCSYmICFpbkNvbmZpZyhsaW5rZWRFbGVtZW50KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBpZiBubyBjb25maWd1cmF0aW9uIGlzIHNwZWNpZmllZCwgZG9uJ3QgY2FsY3VsYXRlCi0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZWxlbWVudDsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlOwotCi0JCQkvLyBpZiBkaXNjYXJkQ29udHJpYnV0b3Igc2V0IHRvIHRydWUsIGRpc2NhcmQgdGhlIGNvbnRyaWJ1dG9yIGFuZAotCQkJLy8gcmV0dXJuIG51bGwKLQkJCWlmIChkaXNjYXJkQ29udHJpYnV0b3IgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRyaWJ1dG9yKHZlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlpZiAocmVzb2x2ZUNvbnRyaWJ1dG9yKSB7Ci0JCQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBjb250cmlidXRvciwgcmVzb3ZsZSB0byBpdCdzIGJhc2UKLQkJCQl3aGlsZSAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRyaWJ1dG9yKHZlKSkgewotCQkJCQllID0gdmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJCQlpZiAoaW5Db25maWcoZSkpIHsKLQkJCQkJCXZlID0gZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGlmIHRoZSBiYXNlIGlzIG5vdCBpbiB0aGUgY29uZmlndXJhdGlvbiwgaXQncyBhbgotCQkJCQkJLy8gZXJyb3IKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIkNvbmZpZ3VyYXRpb24gY2xvc3VyZSBlcnJvcjogQmFzZSBlbGVtZW50ICciICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUodmUpICsgIicgbm90IGluIGNvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlc29sdmVSZXBsYWNlcikgewotCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldFJlcGxhY2VyKHZlLCBjb25maWcpOwotCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGU7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICghaW5Db25maWcodmUpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGEgcmVwbGFjZXIsIGFuZCB0aGUgYmFzZSBpcyBhIGNvbnRyaWJ1dG9yLCAKLQkJCS8vIG5lZWQgdG8gcmVzb2x2ZSB0aGUgZWxlbWVudCB0byB0aGUgYmFzZSBpZiByZXNvbHZlQ29udHJpYnV0b3IgaXMgdHJ1ZQotCQkJLy8gMTUyMjMwIC0gQnJvd3Npbmc6IFJvbGU8LS0+V1AgcmVsYXRpb25zaGlwIHNob3dzIGluY29uc2lzdGFuY3kKLQkJCWUgPSB2ZTsKLQkJCXdoaWxlICgoZSAhPSBudWxsKSAmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzUmVwbGFjZXIoZSkpIHsKLQkJCQllID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcihlKSkgewotCQkJCQlyZXR1cm4gcmVhbGl6ZShlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGNhbid0IHJldHVybiBoZXJlLCBuZWVkIHRvIGNoZWNrIGNhblNob3cKLQkJCS8vIHJldHVybiB2ZTsKLQkJCWlmIChjYW5TaG93KHZlKSkgewotCQkJCXJldHVybiB2ZTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoY2FuU2hvdyhlbGVtZW50KSkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZWFsaXplIHRoZSBsaXN0IG9mIGZlYXR1cmUgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdmFsdWVzCi0JICogVGhlIG5ldyBtaWdodCBiZSBhIHJlLXNvcnRpbmcgb2YgdGhlIG9yaWdpbmFsIGxpc3QgCi0JICogb3Igc29tZSBvZiB0aGUgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQsIGRlcGVuZGluZyBvbiB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9uCi0JICogTm90ZTogdGhlIGxpc3QgdmFsdWUgcGFzc2VkIGluIG1pZ2h0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcyBMaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3QgcmVhbGl6ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgTGlzdCB2YWx1ZXMpOwotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5Db25maWcoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGVsZW1lbnQsIGNvbmZpZywgIXNob3dTdWJ0cmFjdGVkKCkpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblNob3coTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3coZWxlbWVudCwgY29uZmlnLCAhc2hvd1N1YnRyYWN0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0cmFGZWF0dXJlVmFsdWVzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlGZWF0dXJlVmFsdWUgdmFsdWVzKSB7Ci0JCWlmICghRWxlbWVudFJlYWxpemVyLnRvQWRkRXh0cmFGZWF0dXJlVmFsdWVzKGVsZW1lbnQsIGZlYXR1cmUsIHZhbHVlcywKLQkJCQlnZXRDb25maWd1cmF0aW9uKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSBlbGVtZW50OwotCi0JCUNvbGxlY3Rpb248Pz4gcmVzdWx0ID0gTGlicmFyeVV0aWwuZ2V0SW5jbHVkZWRFbGVtZW50cyhjYywgZ2V0Q29uZmlndXJhdGlvbigpKTsKLQotCQlpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVG9NYW55RmVhdHVyZVZhbHVlIG1hbnlWYWx1ZXMgPSB2YWx1ZXMgaW5zdGFuY2VvZiBUb01hbnlGZWF0dXJlVmFsdWUgPwotCQkJCShUb01hbnlGZWF0dXJlVmFsdWUpIHZhbHVlcyA6IG51bGw7Ci0JCQkJCi0JCUxpc3Qgb2xkVmFsdWVzID0gbWFueVZhbHVlcyA9PSBudWxsID8gbnVsbCA6IChMaXN0KSBtYW55VmFsdWVzLmdldFZhbHVlKCk7Ci0KLQkJSGFzaFNldDxEZXNjcmliYWJsZUVsZW1lbnQ+IHNlZW5TZXQgPSBtYW55VmFsdWVzID09IG51bGwgPwotCQkJCW5ldyBIYXNoU2V0PERlc2NyaWJhYmxlRWxlbWVudD4oKSA6IG5ldyBIYXNoU2V0PERlc2NyaWJhYmxlRWxlbWVudD4ob2xkVmFsdWVzKTsJCi0JCXNlZW5TZXQuYWRkKGNjKTsKLQkJTGlzdCBjY0xpc3QgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRDdXN0b21DYXRlZ29yaWVzKGNjKTsKLQkJc2VlblNldC5hZGRBbGwoY2NMaXN0KTsJCQkJCQotCQkJCQotCQlMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4gbGlzdCA9IGNhbGN1bGF0ZUxpc3QocmVzdWx0LCBzZWVuU2V0KTsKLQkJdmFsdWVzLmFkZChjYywgbGlzdCk7Ci0JCQotCX0KLQotCXB1YmxpYyBMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4gY2FsY3VsYXRlTGlzdChDb2xsZWN0aW9uPD8+IHJlc3VsdCwKLQkJCVNldDxEZXNjcmliYWJsZUVsZW1lbnQ+IHNlZW5TZXQpIHsKLQkJTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4oKTsKLQkJZm9yIChJdGVyYXRvcjw/PiBpdGVyID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGNvbnRFbGVtID0gKERlc2NyaWJhYmxlRWxlbWVudCkgbzsKLQkJCQljb250RWxlbSA9IChEZXNjcmliYWJsZUVsZW1lbnQpIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudChjb250RWxlbSwgdGhpcyk7Ci0JCQkJaWYgKGNvbnRFbGVtICE9IG51bGwpIHsKLQkJCQkJaWYgKHNlZW5TZXQuYWRkKGNvbnRFbGVtKSkgewotCQkJCQkJbGlzdC5hZGQoY29udEVsZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAobGlzdC5zaXplKCkgPiAxKSB7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBQcmVzZW50YXRpb25Db250ZXh0LklOU1RBTkNFLmdldFByZXNOYW1lQ29tcGFyYXRvcigpOwotCQkJQ29sbGVjdGlvbnMuPERlc2NyaWJhYmxlRWxlbWVudD5zb3J0KGxpc3QsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2xvdE1hdGNoaW5nKEZ1bGZpbGxhYmxlRWxlbWVudCBzbG90LCBGdWxmaWxsYWJsZUVsZW1lbnQgZWxlbWVudCkgewkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB0b0FkZEV4dHJhRmVhdHVyZVZhbHVlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgRmVhdHVyZVZhbHVlIHZhbHVlcywKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCEodmFsdWVzIGluc3RhbmNlb2YgVG9NYW55RmVhdHVyZVZhbHVlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9GZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0ZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGEzNmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0ZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGlkZW50aWZ5IHRoZSBmZWF0dXJlIHZhbHVlIGFuZCB0aGUgb3duaW5nIGVsZW1lbnQuIAotICogdGhpcyBoZWxwcyB0byBpZGVudGlmeSB3aGVyZSB0aGUgdmFsdWUgaXMgY29taW5nIGZyb20uIAotICogRm9yIGV4YW1wbGUsIHRoZSByZWFsaXplZCB2YWx1ZSBjYW4gYmUgZnJvbSB0aGUgYmFzZSBlbGVtZW50IGFzIHdlbGwgYXMgY29udHJpYnV0b3JzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmVhdHVyZVZhbHVlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX05VTExfID0gIl9OVUxMXyI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGVsZW1lbnQ7ICAvLyB0aGUgZWxlbWVudAotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudDsgIC8vIHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQKLQlwcm90ZWN0ZWQgT2JqZWN0IGZlYXR1cmU7IC8vIEVTdHJ1Y3RydWFsRmVhdHVyZSBvciBPcHBvc2l0ZWZlYXR1cmUKLQlwcm90ZWN0ZWQgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JLyoqCi0JICogY29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRoYXQgdGhlIHZhbHVlIGlzIGNhbGN1YXRlZCBmb3IuIAotCSAqIEBwYXJhbSBvd25lckVsZW1lbnQgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IG93bnMgdGhlIHZhbHVlCi0JICogQHBhcmFtIGZlYXR1cmUgT2JqZWN0IGVpdGhlciBFU3RydWN0dXJhbEZlYXR1cmUgb3IgT3Bwb3NpdGVGZWF0dXJlLgotCSAqIEBwYXJhbSByZWFsaXplciBFbGVtZW50UmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIE9iamVjdCBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMucmVhbGl6ZXIgPSByZWFsaXplcjsKLQl9Ci0KLQlhYnN0cmFjdCBwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpOwotCWFic3RyYWN0IHB1YmxpYyBpbnQgc2l6ZSgpOwotCWFic3RyYWN0IHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0T3duZXJFbGVtZW50KCkgewotCQlyZXR1cm4gb3duZXJFbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIEVTdHJ1Y3R1cmFsRmVhdHVyZS4gcmV0dXJuIG51bGwgaWYgaXQncyBub3QgYSBFU3RydWN0dXJhbEZlYXR1cmUKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCWlmICggZmVhdHVyZSBpbnN0YW5jZW9mIEVTdHJ1Y3R1cmFsRmVhdHVyZSApIHsKLQkJCXJldHVybiAoRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIE9wcG9zaXRlRmVhdHVyZSwgcmV0dXJuIG51bGwgaWYgdGhpcyBpcyBub3QgYW4gT3Bwb3NpdGVGZWF0dXJlCi0JICogQHJldHVybiBPcHBvc2l0ZUZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlIGdldE9wcG9zaXRlRmVhdHVyZSgpIHsKLQkJaWYgKCBmZWF0dXJlIGluc3RhbmNlb2YgT3Bwb3NpdGVGZWF0dXJlICkgewotCQkJcmV0dXJuIChPcHBvc2l0ZUZlYXR1cmUpZmVhdHVyZTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcmVhbGl6ZXIKLQkgKiBAcmV0dXJuIEVsZW1lbnRSZWFsaXplcgotCSAqLwotCXB1YmxpYyBFbGVtZW50UmVhbGl6ZXIgZ2V0UmVhbGl6ZXIoKSB7Ci0JCXJldHVybiByZWFsaXplcjsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpIHsKLQkJaWYgKCBFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlNZXRob2RFbGVtZW50IGUgPSBlbGVtZW50OwotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCWUgPSAoTWV0aG9kRWxlbWVudCkoKENvbnRlbnREZXNjcmlwdGlvbillbGVtZW50KS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAoIGUgPT0gbnVsbCApIHsKLQkJCQllID0gb3duZXJFbGVtZW50OwotCQkJfQotCQl9Ci0KLQkJaWYgKCAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgJiYgQ29uZmlndXJhdGlvbkhlbHBlci5pc0V4dGVuZFJlcGxhY2VyKChWYXJpYWJpbGl0eUVsZW1lbnQpZSkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQmxhbmtJbmRpY2F0b3IoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXJldHVybiBfTlVMTF8uZXF1YWxzKHZhbHVlLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBfTlVMTF8uZXF1YWxzKCgoTWV0aG9kRWxlbWVudCl2YWx1ZSkuZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0lFbGVtZW50UmVhbGl6ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9JRWxlbWVudFJlYWxpemVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOThlMGVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL0lFbGVtZW50UmVhbGl6ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnRSZWFsaXplckZhY3RvcnkgewotCUVsZW1lbnRSZWFsaXplciBjcmVhdGVSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vT3JkZXJlZExpc3RDb21wYXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9PcmRlcmVkTGlzdENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JjOWQ3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9PcmRlcmVkTGlzdENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBhIGNvbXBhcmF0b3IgdG8gc29ydCBhbiBlbGVtZW50IGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgT3JkZXJlZExpc3RDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0KLQkvLyBzb3J0IHRoZSBiYXNlbGlzdCBhY2NvcmRpbmcgdG8gdGhlIHNvcnRlZCBsaXN0Ci0JLy8gYW55IGl0ZW0gaW4gc29ydGVkIGxpc3QgYnV0IG5vdCBpbiBiYXNlIGxpc3QgYXJlIGlnbm9yZWQKLQkvLyBhbnkgaXRlbSBpbiBiYXNlIGxpc3QgYnV0IG5vdCBpbiBzb3J0ZWQgbGlzdCBrZWVwcyB0aGUgb3JpZ2luYWwgb3JkZXIKLQlMaXN0IGJhc2VMaXN0OwotCi0JTGlzdCBzb3J0ZWRMaXN0OwotCi0JT3JkZXJlZExpc3RDb21wYXJhdG9yKExpc3QgYmFzZUxpc3QsIExpc3Qgc29ydGVkTGlzdCkgewotCQl0aGlzLmJhc2VMaXN0ID0gYmFzZUxpc3Q7Ci0JCXRoaXMuc29ydGVkTGlzdCA9IHNvcnRlZExpc3Q7Ci0JfQotCi0JLyoqCi0JICogY29tcGFyZSB0byBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQlpbnQgaTEsIGkyOwotCQlpZiAoc29ydGVkTGlzdCAhPSBudWxsKSB7Ci0JCQlpMSA9IHNvcnRlZExpc3QubGFzdEluZGV4T2YoZTEpOwotCQkJaTIgPSBzb3J0ZWRMaXN0Lmxhc3RJbmRleE9mKGUyKTsKLQkJCWlmIChpMSA+PSAwIHx8IGkyID49IDApIHsKLQkJCQkvLyBpZiBub3QgaW4gdGhlIHNvcnRlZCBsaXN0LCBmaW5kIHRoZSBpbW1lZGlhdGUgcHJlZGljZXNzb3IKLQkJCQkvLyB0aGF0IGlzIGluIHRoZSBsaXN0IGFuZCBjb21wYXJlIHRvIGl0LgotCQkJCS8vIGlmIG5vIHN1Y2ggZWxlbWVudCwgY29tcGFyZSB0byB0aGUgb3JpZ2luYWwgbGlzdAotCQkJCWlmIChpMSA8IDApIHsKLQkJCQkJaTEgPSBmaW5kQ29tcGFyYWJsZUluZGV4KGUxKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaTIgPCAwKSB7Ci0JCQkJCWkyID0gZmluZENvbXBhcmFibGVJbmRleChlMik7Ci0JCQkJfQotCi0JCQkJaWYgKGkxID49IDAgJiYgaTIgPj0gMCAmJiBpMSAhPSBpMikgewotCQkJCQlyZXR1cm4gaTEgLSBpMjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3JpZ2luYWxPcmRlcihlMSwgZTIpOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRDb21wYXJhYmxlSW5kZXgoT2JqZWN0IGUpIHsKLQkJaW50IGkyID0gLTE7Ci0JCWZvciAoaW50IGkgPSBiYXNlTGlzdC5sYXN0SW5kZXhPZihlKTsgaSA+PSAwOyBpLS0pIHsKLQkJCU9iamVjdCBvID0gYmFzZUxpc3QuZ2V0KGkpOwotCQkJaTIgPSBzb3J0ZWRMaXN0Lmxhc3RJbmRleE9mKG8pOwotCQkJaWYgKGkyID49IDApIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpMjsKLQl9Ci0KLQlwcml2YXRlIGludCBvcmlnaW5hbE9yZGVyKE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCWludCBpMSwgaTI7Ci0JCWlmIChiYXNlTGlzdCAhPSBudWxsKSB7Ci0JCQlpMSA9IGJhc2VMaXN0Lmxhc3RJbmRleE9mKGUxKTsKLQkJCWkyID0gYmFzZUxpc3QubGFzdEluZGV4T2YoZTIpOwotCi0JCQlyZXR1cm4gaTEgLSBpMjsKLQkJfQotCi0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE4ODdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmaWx0ZXIgdGhhdCBzdGlsbCBzaG93cyBjZXJ0YWluIGVsZW1lbnRzIGR1cmluZyBwcm9jZXNzIGF1dGhvcmluZyB0aGF0Ci0gKiBQcm9jZXNzQ29uZmlndXJhdG9yIGRvZXMgbm90IHNob3cuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gSmFuIDExLCAyMDA2Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvciBJTlNUQU5DRSA9IG5ldyBQcm9jZXNzQXV0aG9yaW5nQ29uZmlndXJhdG9yKCk7Ci0KLQlwcml2YXRlIFByb2Nlc3NBdXRob3JpbmdDb25maWd1cmF0b3IoKSB7Ci0JCXN1cGVyKG51bGwpOwotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKG5ldyBJTGlicmFyeVNlcnZpY2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgY29uZmlndXJhdGlvblNldChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeUNyZWF0ZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlSZW9wZW5lZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlicmFyeVNldChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCX0KLQkJCQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqIG92ZXJyaWRlIHRoaXMsICBmb3IgcHJvY2VzcyBhdXRob3JpbmcgZWRpdCwgc2hvdWxkIGdldCBkaXJlY3QgY2hpbGRyZW4gbm8gcmVhbGl6YXRpb24uCi0JICogIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKE9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjaGlsZEZlYXR1cmUpIHsKLQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIG9iajsKLQkJcmV0dXJuIChMaXN0KWVPYmplY3QuZUdldChjaGlsZEZlYXR1cmUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25GaWx0ZXIjcmVzb2x2ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgcmVzb2x2ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlciNnZXRWYXJpYWJpbGl0eUluZm8ob3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQpCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5SW5mbyBnZXRWYXJpYWJpbGl0eUluZm8oVmFyaWFiaWxpdHlFbGVtZW50IHZlKSB7Ci0JCXJldHVybiBuZXcgVmFyaWFiaWxpdHlJbmZvKHZlKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVmFyaWFiaWxpdHlJbmZvI2dldEluaGVyaXJhbmNlTGlzdCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBMaXN0IGdldEluaGVyaXRhbmNlTGlzdCgpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRPd25lcigpKTsKLQkJCX0KLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlZhcmlhYmlsaXR5SW5mbyNnZXRDb250cmlidXRvcnMoKQotCQkJICovCi0JCQlwdWJsaWMgTGlzdCBnZXRDb250cmlidXRvcnMoKSB7Ci0JCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb25maWd1cmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NDb25maWd1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlNGMxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuUHJvY2Vzc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLQotCi0vKioKLSAqIAotICogQGF1dGhvciBQaG9uZyBMZQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzQ29uZmlndXJhdG9yIGV4dGVuZHMgQ29uZmlndXJhdGlvbkZpbHRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tPd25pbmdQcm9jZXNzOwotCi0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbmZpZ3VyYXRvcihNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykgewotCQlzdXBlcihtZXRob2RDb25maWcpOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbWV0aG9kQ29uZmlnCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBjaGVja093bmluZ1Byb2Nlc3MgaWYgdHJ1ZSB3aWxsIGNoZWNrIG9uIG93bmluZyBwcm9jZXNzIG9mIGFjdGl2aXRpZXMgd2hldGhlciBpdCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKiAgICAgICAgICBUaGlzIGNoZWNrIGlzIG5vdCByZXF1aXJlZCBpbiBwcm9jZXNzIGVkaXRvciBhbmQgc2tpcHBpbmcgaXQgaGVscHMgdGhlIHBlcmZvcm1hbmNlLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnLCBib29sZWFuIGNoZWNrT3duaW5nUHJvY2VzcykgewotCQl0aGlzKG1ldGhvZENvbmZpZyk7Ci0JCXRoaXMuY2hlY2tPd25pbmdQcm9jZXNzID0gY2hlY2tPd25pbmdQcm9jZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLQkJbWV0aG9kQ29uZmlnID0gbmV3Q29uZmlnOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCWlmIChtZXRob2RDb25maWcgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihzdXBlci5tZXRob2RDb25maWcpOwotCQkJcmV0dXJuIGFjY2VwdCgoQnJlYWtkb3duRWxlbWVudClvYmosIHJlYWxpemVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChvYmopOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvciNhY2NlcHQob3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChCcmVha2Rvd25FbGVtZW50IGUsIGZpbmFsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoZSBpbnN0YW5jZW9mIE1pbGVzdG9uZSB8fCBlIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCS8vIGFjY2VwdCBhbGwgcHJvY2VzcyBlbGVtZW50cyB0aGF0IGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSBjb250ZW50Ci0JCQkvLyBlbGVtZW50Ci0JCQkvLwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQlyZXR1cm4gUHJvY2Vzc1V0aWwuYWNjZXB0KChBY3Rpdml0eSkgZSwgbmV3IElGaWx0ZXIoKSB7Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iaikgewotCQkJCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCA/IHJlYWxpemVyLmluQ29uZmlnKChNZXRob2RFbGVtZW50KSBvYmopIDogdHJ1ZTsKLQkJCQl9Ci0JCQkJCi0JCQl9LCBjaGVja093bmluZ1Byb2Nlc3MpOwotCQl9Ci0JCWVsc2UgaWYoZSBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLQkJCS8vIFRPRE86IG5lZWQgdG8gY29uc2lkZXIgY2hlY2tpbmcgb24gb3duaW5nIHByb2Nlc3Mgb2YgdGhlIGRlc2NyaXB0b3Igd2hldGhlciBpdCBpcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkJCS8vIEN1cnJlbnRseSwgdGhpcyBjaGVjayBpcyBub3QgcmVxdWlyZWQgYW5kIHNraXBwaW5nIGl0IGhlbHBzIHRoZSBwZXJmb3JtYW5jZS4KLQkJCS8vIEJ1dCB0aGlzIGNoZWNrIG1pZ2h0IGFmZmVjdCB0aGUgY3VycmVudCBjb2RlLCBlLmcuOiBwcm9jZXNzIHByb3BlcnRpZXMgdmlldy4KLQkJCS8vCi0JCQlNZXRob2RFbGVtZW50IGxpbmtlZF9vYmogPSBQcm9jZXNzVXRpbC5nZXRBc3NvY2lhdGVkRWxlbWVudCgoRGVzY3JpcHRvcikgZSk7Ci0JCQlpZiAobGlua2VkX29iaiA9PSBudWxsIHx8IGxpbmtlZF9vYmouZUlzUHJveHkoKSkgewotCQkJCS8vIHRoaXMgaXMgdGhlIHByb2Nlc3NlcyBvd24gZGVzY3JpcHRvciAoaW5kZXBlbmRlbnQgZnJvbSB0aGUgY29udGVudCkKLQkJCQkvLyBhbHdheXMgYWNjZXB0IGl0Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG1ha2Ugc3VyZSB0aGF0IGVsZW1lbnQgd2l0aCByZXBsYWNlciBtaWdodCBzdGlsbCBiZSBhY2NlcHRlZAotCQkJCS8vCi0JCQkJbGlua2VkX29iaiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobGlua2VkX29iaiwgcmVhbGl6ZXIpOwotCi0JCQkJLy8gaWYgdGhlIGxpbmtlZCBlbGVtZW50IGlzIG5vdCBpbiBjb25maWcsIGRvbid0IGFjY2VwdCBpdAotCQkJCXJldHVybiByZWFsaXplci5pbkNvbmZpZyhsaW5rZWRfb2JqKTsKLQkJCX0JCQotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0KGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Qcm9jZXNzVmFyaWFiaWxpdHlDb25maWd1cmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTkzOTVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1Byb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NWYXJpYWJpbGl0eUNvbmZpZ3VyYXRvciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IgewotCi0JLyoqCi0JICogQHBhcmFtIG1ldGhvZENvbmZpZwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1ZhcmlhYmlsaXR5Q29uZmlndXJhdG9yKE1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlnKSB7Ci0JCXN1cGVyKG1ldGhvZENvbmZpZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotCQltZXRob2RDb25maWcgPSBuZXdDb25maWc7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3IjYWNjZXB0KG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCUFjdGl2aXR5IGJhc2UgPSAoQWN0aXZpdHkpICgoQWN0aXZpdHkpIGUpCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoYmFzZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuaW5Db25maWcoCi0JCQkJCQlUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZSksIG1ldGhvZENvbmZpZyk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKFRuZ1V0aWwKLQkJCQkJCS5nZXRPd25pbmdQcm9jZXNzKGJhc2UpLCBtZXRob2RDb25maWcpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdChlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub01hbnlGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvTWFueUZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTdhNDk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvTWFueUZlYXR1cmVWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLQotLyoqCi0gKiByZWFsaXplZCBmZWF0dXJlIHZhbHVlIGZvciBhIHRvTWFueSBmZWF0dXJlCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVG9NYW55RmVhdHVyZVZhbHVlIGV4dGVuZHMgRmVhdHVyZVZhbHVlIHsKLQotCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5GZWF0dXJlVmFsdWUjRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQsIE1ldGhvZEVsZW1lbnQsIE9iamVjdCwgRWxlbWVudFJlYWxpemVyKQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICovCi0JcHVibGljIFRvTWFueUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBPYmplY3QgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIGZlYXR1cmUgdmFsdWUgdG8gdGhlIHZhbHVlIGxpc3QKLQkgKiBAcGFyYW0gb3duZXIgVmFyaWFiaWxpdHlFbGVtZW50Ci0JICogQHBhcmFtIHZhbHVlIE9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChWYXJpYWJpbGl0eUVsZW1lbnQgb3duZXIsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoICEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSApIHsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCQotCQlIYXNoU2V0IHNlZW5WYWx1ZXMgPSBuZXcgSGFzaFNldCh2YWx1ZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gKChMaXN0KSB2YWx1ZSkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCWlmICggb2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgb2JqOwotCQkJCS8vTWV0aG9kRWxlbWVudCBjZSA9IHJlYWxpemVyLnJlYWxpemUoZSk7Ci0JCQkJTWV0aG9kRWxlbWVudCBjZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCQkJCQotCQkJCS8vIGNhbGN1bGF0ZWQgZWxlbWVudCBjYW4gYmUgbnVsbCBpZiBpdCBjYW4ndCBzaG93Ci0JCQkJaWYgKGNlICE9IG51bGwgJiYgIXNlZW5WYWx1ZXMuY29udGFpbnMoY2UpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoY2UpOwotCQkJCQlzZWVuVmFsdWVzLmFkZChjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlpZiAoIChvd25lciBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkJCSYmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkpKSB7Ci0JCQlDb25maWd1cmF0aW9uSGVscGVyLm9yZGVyU2VjdGlvbnMoKENvbnRlbnRFbGVtZW50KSBvd25lciwgdmFsdWVzKTsKLQkJfQotCQkJCQkJCi0JfQotCQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWFsaXplZCB2YWx1ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsJCQotCQlpZiAoIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkKLQkJCS8vIHJlbW92ZSB0aGUgX05VTExfIGl0ZW0uIHRoYXQgaXMgdXNlZCBhcyBhbiBpbmRpY2F0b3IgdG8gYmxhbmsgb3V0IHRoZSBiYXNlIAotCQkJLy8gZm9yIHRoZSBleHRlbmQtcmVwbGFjZQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHZhbHVlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU9iamVjdCBvID0gKE9iamVjdCkgaXQubmV4dCgpOwotCQkJCWlmICggaXNCbGFua0luZGljYXRvcihvKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWl0ZW1zLmFkZChvKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGl0ZW1zOwotCQl9Ci0JCQotCQlyZXR1cm4gdmFsdWVzOwotCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBzaXplIG9mIHRoZSB2YWx1ZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHZhbHVlcy5zaXplKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvTWFueU9wcG9zaXRlRmVhdHVyZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTE5YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9NYW55T3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG9NYW55IG9wcG9zaXRlIGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZSBleHRlbmRzIFRvTWFueUZlYXR1cmVWYWx1ZSB7Ci0JCi0JLyoqCi0JICogQHNlZSBjb25zdHJ1Y3QgYSBmZWF0dXJlIHZhbHVlIG9iamVjdCBmb3IgdG8tbWFueSBvcHBvc2l0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSByZWFsaXplcgotCSAqLwotCXB1YmxpYyBUb01hbnlPcHBvc2l0ZUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJc3VwZXIoZWxlbWVudCwgbnVsbCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCX0KLQotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlRvTWFueUZlYXR1cmVWYWx1ZSNhZGQoVmFyaWFiaWxpdHlFbGVtZW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQkvLyB3b3JrIGFyb3VuZCBmb3Igb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSB0aGF0IHN0aWxsIHJldHVybiBhIHNpbmdsZSB2YWx1ZSBpbnN0ZWFkIG9mIGEgbGlzdAotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCUFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdi5hZGQodmFsdWUpOwotCQkJdmFsdWUgPSB2OwotCQl9Ci0JCQotCQlpZiAoICEodmFsdWUgaW5zdGFuY2VvZiBMaXN0KSApIHsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2YgPSAoT3Bwb3NpdGVGZWF0dXJlKWZlYXR1cmU7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gb2YuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCi0JCQkvLyBSZXBsYWNlIGRvZXMgbm90IGNvbXBsZXRlbHkgcmVtb3ZlCi0JCQkvLyBvdXRnb2luZyBhc3NvY2lhdGlvbnMKLQkJCS8vIGlmIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIGhhcyByZXBsYWNlciBpbiB0aGUKLQkJCS8vIGNvbmZpZ3VyYXRpb24KLQkJCS8vIGl0J3Mgb3V0Z29pbmcgYXNzb2NpYXRpb25zIChpLmUuLCB0aGlzIGVsZW1lbnQpIHdpbGwgYmUKLQkJCS8vIHJlcGxhY2VkIGJ5IHRoZSByZXBsYWNpbmcgZWxlbWVudAotCQkJLy8gYXMgYSByZXN1bHQsIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlIHNob3VsZCBkcm9wIHRoZQotCQkJLy8gcmVwbGFjZWQgZWxlbWVudAotCQkJLy8KLQkJCS8vIGZvciBleGFtcGxlLCBSMSAtPiByZXNwb25zaWJsZSBmb3IgQTEsIFIyIHJlc3BvbnNpYmxlIGZvcgotCQkJLy8gQTIKLQkJCS8vIGlmIFIyIHJlcGxhY2VzIFIxLCB0aGVuIFIyIHN0aWxsIHJlc3BvbnNpYmxlIGZvciBBMgotCQkJLy8gYnV0IEExIGRvZXMgbm90IGhhdmUgYSByZXNwb25zaWJsZSByb2xlIChub3QgUjIpCi0JCQkvLyBzbyBmb3IgQTEncyByZXNwb25zaWJsZSByb2xlIG9wcG9zaXRlIGZlYXR1cmUsCi0JCQkvLyB0aGUgdmFsdWUgUjEgc2hvdWxkIGJlIGRyb3BwZWQgaW5zdGVhZCBvZiByZWFsaXplIHRvIFIyCi0JCQkvLyBKaW5odWEgWGksIDEwLzI3LzIwMDUKLQkJCQotCQkJLy8gY2hlY2sgdGhlIHJlcGxhY2VyIGlzIG5vdCBlbm91Z2guIElmIHRoZSBiYXNlIGVsZW1lbnQgaXMgcmVwbGFjZWQsIAotCQkJLy8gYWxsIHRoZSBjb250cmlidXRvcnMgdG8gdGhlIGJhc2Ugc2hvdWxkIGFsc28gYmUgY29uc2lkZXJlZCBhcyByZXBsYWNlZC4KLQkJCS8vIHNvIHJlYWxpemUgdGhlIGVsZW1lbnQsIHNlZSBpZiBpdCBpcyBhIHJlcGxhY2VyCi0JCQkvLyBCdWcgMTk5Njg2IC0gUmVwbGFjaW5nIHJvbGVzIGRvZXMgbm90IHVwZGF0ZSByZXNwb25zaWJsZSB3b3JrIHByb2R1Y3QncyBwYWdlcwotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcGxhY2VyID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCApIHsKLQkJCQkvL3JlcGxhY2VyID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCXJlcGxhY2VyID0gKFZhcmlhYmlsaXR5RWxlbWVudClDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIHJlYWxpemVyKTsKLQkJCQlpZiAoIChyZXBsYWNlciA9PSBlKSB8fCAhQ29uZmlndXJhdGlvbkhlbHBlci5pc1JlcGxhY2VyKHJlcGxhY2VyKSB8fCAKLQkJCQkJCUNvbmZpZ3VyYXRpb25IZWxwZXIuY29udHJ1YnV0ZUNoYWluKChWYXJpYWJpbGl0eUVsZW1lbnQpIGUsIChWYXJpYWJpbGl0eUVsZW1lbnQpcmVwbGFjZXIpKSB7CQkJCQkKLQkJCQkJcmVwbGFjZXIgPSBudWxsOwotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCWJvb2xlYW4gaXNWYWx1ZVJlcGxhY2VkID0gKHJlcGxhY2VyICE9IG51bGwpOwotCi0JCQlib29sZWFuIGtlZXAgPSAhaXNWYWx1ZVJlcGxhY2VkOwotCQkJaWYgKCBpc1ZhbHVlUmVwbGFjZWQgJiYgCi0JCQkJCShDb25maWd1cmF0aW9uSGVscGVyLmlzRXh0ZW5kUmVwbGFjZXIocmVwbGFjZXIpIAotCQkJCQl8fCBFbGVtZW50UmVhbGl6ZXIuaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpKSApIHsKLQkJCQkvLyBpZiB0aGUgdmFsdWUgaXMgcmVwbGFjZWQsIGJ1dCB0aGUgb3V0IGdvaW5nIGZlYXR1cmUgaXMgaW5oZXJpdGVkIGJ5IHRoZSByZXBsYWNlcgotCQkJCS8vIHRoZW4gd2Ugc2hvdWxkIGtlZXAgdGhpcyB2YWx1ZSwgc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgdmFsdWUgCi0JCQkJLy8gb2YgdGhlIHJlcGxhY2VyCi0JCQkJaWYgKCBmLmlzTWFueSgpICkgewotCQkJCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocmVwbGFjZXIsIGYsIHJlYWxpemVyKTsKLQkJCQkJa2VlcCA9IGl0ZW1zLmNvbnRhaW5zKG93bmVyKTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShyZXBsYWNlciwgZiwgcmVhbGl6ZXIpOwotCQkJCQlrZWVwID0gKGl0ZW0gPT0gb3duZXIpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gaWYgdGhlIHZhbHVlJ3MgZmVhdHVyZSB0byB0aGlzIGVsZW1lbnQgaXMgdG8tb25lLCAKLQkJCS8vIHRoZW4gdGhpcyB2YWx1ZSdzIGZlYXR1cmUgdmFsdWUgc2hvdWxkIGJlIHRoZSBlbGVtZW50LAotCQkJLy8gb3RoZXJ3aXNlIGRyb3AgdGhlIHZhbHVlCi0JCQkvLyBmb3IgZXhhbXBsZSwgCi0JCQkvLyBUMSAtPiBSMSAocHJpbWFyeSBwZXJmb3JtYWVyKQotCQkJLy8gVDIgLT4gUjIKLQkJCS8vIFQyIGNvbnRyaWJ1dGVzIHRvIFQxCi0JCQkvLyBzaW5jZSBUMSBhbHJlYWR5IGhhcyBSMSwgc28gUjIgaXMgZHJvcGVkCi0JCQkvLyBzbyB3aGVuIGNhbGN1bGF0aW5nIFIyJ3MgcGVyZm9ybWluZyB0YXNrcywgVDEgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZAotCQkJaWYgKCBrZWVwICkgewotCQkJCU1ldGhvZEVsZW1lbnQgdmUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIHJlYWxpemVyKTsKLQkJCQlpZiAoIHZlICE9IG51bGwgKSB7Ci0JCQkJCQotCQkJCQkvLyBjaGVjayBpZiB0aGlzIGlzIGEgdG8tb25lIGZlYXR1cmUsIGN1cnJlbnRseSBvbmx5IFRhc2stPlByaW1hcnkgUm9sZSBhbmQgVEQgLT4gUHJpbWFyeSBSRAotCQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZjEgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldDAxRmVhdHVyZShvZik7Ci0JCQkJCWlmICggZjEgIT0gbnVsbCApIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHZlLCBmMSwgcmVhbGl6ZXIpOwotCQkJCQkJCi0JCQkJCQkvLyBpZiB0aGUgdmFsdWUgZWxlbWVudCdzIHRvLW9uZSBmZWF0dXJlIHZhbHVlIGl0ZW0gaXMgbm90IHRoZSBjdXJyZW50IGVsZW1lbnQsIAotCQkJCQkJLy8gdGhlbiB0aGUgZWxlbWVudCdzIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgc2hvdWxkIG5vdCBjb250YWluIHRoaXMgdmFsdWUuCi0JCQkJCQkvLyBzYXksIHRoZSB2YWx1ZSBlbGVtZW50IGlzIGEgdGFzayBhbmQgdGhlIGN1cnJlbnQgZWxlbWVudCBpcyBhIHJvbGUsCi0JCQkJCQkvLyB0aGVuIGlmIHRoZSB0YXNrJ3MgcHJpbWFyeSBwZXJmb3JtZXIgKGl0ZW0gYWJvdmUpIGlzIG5vdCB0aGlzIHJvbGUgKHRoZSBjdXJyZW50IGVsZW1lbnQpLCAKLQkJCQkJCS8vIHRoZW4gdGhlIHJvbGUncyBwZXJmb3JtaW5nIHRhc2tzICh0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSkgCi0JCQkJCQkvLyBzaG91bGQgbm90IGNvbnRhaW4gdGhpcyB0YXNrICh0aGUgdmFsdWUsIHZlIGFib3ZlKQotCQkJCQkJaWYgKCBpdGVtICE9IGVsZW1lbnQpIHsKLQkJCQkJCQlrZWVwID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQkJaWYgKCBrZWVwICkgewotCQkJCQkKLQkJCQlNZXRob2RFbGVtZW50IGNlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLCByZWFsaXplcik7Ci0KLQkJCQkvLyBjYWxjdWxhdGVkIGVsZW1lbnQgY2FuIGJlIG51bGwgaWYgaXQgY2FuJ3Qgc2hvdwotCQkJCWlmIChjZSAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnMoY2UpKSB7Ci0JCQkJCXZhbHVlcy5hZGQoY2UpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJCi0JCQkvLyBpZiB0aGUgZWxlbWVudCBlIGhhcyBleHRlbmRlcnMgYW5kIHRoZSBleHRlbmRlcidzIGZlYXR1cmUgaXMgdGhlIG93bmVyIGVsZW1lbnQsIAotCQkJLy8gdGhlbiB3ZSBhbHNvIG5lZWQgdG8gaW5jbHVkZSB0aGUgZXh0ZW5kZXIKLQkJCXByb2Nlc3NFeHRlbmRlcnMoZSwgZik7Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRXh0ZW5kZXJzKE1ldGhvZEVsZW1lbnQgZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGYpIHsKLQkJaWYgKCAhKGUgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KWU7Ci0JCQotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRFeHRlbmRlcnMoIHZlLCByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQlpZiAoIGl0ZW1zLnNpemUoKSA+IDAgKSB7CQkKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQkJYm9vbGVhbiBrZWVwID0gZmFsc2U7Ci0JCQkJaWYgKCBmLmlzTWFueSgpICkgewotCQkJCQlMaXN0IHZ4ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUobWUsIGYsIHJlYWxpemVyKTsKLQkJCQkJLy8gaWYgdGhlIHZhbHVlIGNvbnRhaW5zIHRoZSBvd25lciBlbGVtZW50LCB0aGVuIGluY2x1ZGUgaXQKLQkJCQkJa2VlcCA9ICh2eCAhPSBudWxsKSAmJiB2eC5jb250YWlucyhzdXBlci5lbGVtZW50KTsKLQkJCQl9IGVsc2UgewotCQkJCQlNZXRob2RFbGVtZW50IHYgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShtZSwgZiwgcmVhbGl6ZXIpOwotCQkJCQkKLQkJCQkJLy8gaWYgdGhlIGZlYXR1cmUgdmFsdWUgaXMgdGhlIG93bmVyIGVsZW1lbnQsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgYmUgaW5jbHVkZWQKLQkJCQkJa2VlcCA9ICh2ID09IHN1cGVyLmVsZW1lbnQpOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoa2VlcCAmJiAhc3VwZXIudmFsdWVzLmNvbnRhaW5zKG1lKSApIHsKLQkJCQkJc3VwZXIudmFsdWVzLmFkZChtZSk7Ci0JCQkJCXByb2Nlc3NFeHRlbmRlcnMobWUsIGYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBjb250cmlidXRvciBvciByZXBsYWNlciwgYWxzbyBuZWVkIHRvIGNoZWNrIHRoZSBleHRlbmRlcnMgb2YgdGhlIGJhc2UgZWxlbWVudAotCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2ZSkgfHwgQ29uZmlndXJhdGlvbkhlbHBlci5pc1JlcGxhY2VyKHZlKSApIHsKLQkJCXByb2Nlc3NFeHRlbmRlcnModmUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCBmKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lRmVhdHVyZVZhbHVlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9Ub09uZUZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGFjZjA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lRmVhdHVyZVZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci0KLS8qKgotICogcmVhbGl6ZWQgZmVhdHVyZSB2YWx1ZSBmb3IgYSB0by1vbmUgZmVhdHVyZQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFRvT25lRmVhdHVyZVZhbHVlIGV4dGVuZHMgRmVhdHVyZVZhbHVlIHsKLQotCS8vIG1hcCBvZiBlbGVtZW50IGFuZCB0aGUgdmFsdWUKLQlMaW5rZWRIYXNoTWFwIHZhbHVlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCB0aGUgb2JqZWN0IGZvciBhIHRvLW9uZSBmZWF0dXJlIHZhbHVlCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gcmVhbGl6ZXIKLQkgKi8KLQlwdWJsaWMgVG9PbmVGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwgT2JqZWN0IGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlzdXBlcihlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNhZGQoVmFyaWFiaWxpdHlFbGVtZW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFZhcmlhYmlsaXR5RWxlbWVudCBvd25lciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggKHZhbHVlID09IG51bGwpIHx8ICEodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSApIHsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNpbmNlIHRoaXMgaXMgYSB0byBvbmUgYXNzb2NpYXRpb24sIGlmIHRoZSBiYXNlIG9mIHRoZSBvd25lciBhbHJlYWR5IGhhcyBvbmUsIAotCQkvLyBubyBjb250cmlidXRpbmcgdmFsdWUgc2hvdWxkIGJlIGFkZGVkCi0JCS8vIDE3MjYwMiAtIFZhcmlhYmlsaXR5OiBQcmltYXJ5IHJvbGUgbWlzc2luZyBpbiB0aGUgdHJhbnNpdGl2ZSBjYXNlIG9mIGNvbnRyaWJ1dGluZyB0YXNrcwotCQlpZiAoIENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcihvd25lcikgKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgYmFzZSA9IG93bmVyLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmICggYmFzZSAhPSBudWxsICYmIHZhbHVlTWFwLmNvbnRhaW5zS2V5KGJhc2UpICkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJLy9NZXRob2RFbGVtZW50IGUgPSBzdXBlci5yZWFsaXplci5yZWFsaXplKChNZXRob2RFbGVtZW50KXZhbHVlKTsKLQkJTWV0aG9kRWxlbWVudCBlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgoTWV0aG9kRWxlbWVudCl2YWx1ZSwgc3VwZXIucmVhbGl6ZXIpOwotCQkKLQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQlPYmplY3Qga2V5ID0gKG93bmVyPT1udWxsKSA/IGVsZW1lbnQgOiBvd25lcjsKLQkJCWlmICggIXZhbHVlTWFwLmNvbnRhaW5zS2V5KGtleSkgKSB7Ci0JCQkJdmFsdWVNYXAucHV0KGtleSwgZSk7Ci0JCQl9Ci0JCX0JCQkKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRmVhdHVyZVZhbHVlI2dldFZhbHVlKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQkKLQkJT2JqZWN0IHYgPSBudWxsOwotCQlpZiAoIHNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIHY7Ci0JCX0KLQkJCi0JCU9iamVjdFtdIGVudHJpZXMgPSB2YWx1ZU1hcC5lbnRyeVNldCgpLnRvQXJyYXkoKTsKLQkJaWYgKCBzaXplKCkgPT0gMSApIHsKLQkJCS8vIGlmIGp1c3Qgb25lIGVudHJ5LCByZXR1cm4gaXQKLQkJCXYgPSAoKE1hcC5FbnRyeSllbnRyaWVzWzBdKS5nZXRWYWx1ZSgpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgbW9yZSB0aGFuIG9uZSBlbnRyeSwgaWYgdGhlIGZpcnN0IGVudHJ5IGlzIGZyb20gdGhlIGVsZW1lbnQgaXRzZWxmLCB0aGVuIHJldHVybiB0aGUgdmFsdWUKLQkJCS8vIG90aGVyd2lzZSwgcmV0dXJuIG51bGwKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpZW50cmllc1swXTsKLQkJCWlmICggZW50cnkuZ2V0S2V5KCkgPT0gc3VwZXIuZWxlbWVudCApIHsKLQkJCQl2ID0gIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICggaXNFeHRlbmRSZXBsYWNlRW5hYmxlZCgpICkgewotCQkJaWYgKCBpc0JsYW5rSW5kaWNhdG9yKHYpICkgewotCQkJCS8vIHJlbW92ZSB0aGUgX05VTExfIGl0ZW0uIHRoYXQgaXMgdXNlZCBhcyBhbiBpbmRpY2F0b3IgdG8gYmxhbmsgb3V0IHRoZSBiYXNlIAotCQkJCS8vIGZvciB0aGUgZXh0ZW5kLXJlcGxhY2UKLQkJCQl2ID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHY7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdmFsdWVNYXAuc2l6ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vVG9PbmVPcHBvc2l0ZUZlYXR1cmVWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjk2NTMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL1RvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUgZm9yIGEgdG8tb25lIG9wcG9zaXRlIGZlYXR1cmUKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBUb09uZU9wcG9zaXRlRmVhdHVyZVZhbHVlIGV4dGVuZHMgVG9PbmVGZWF0dXJlVmFsdWUgewotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIHJlYWxpemVyCi0JICovCi0JcHVibGljIFRvT25lT3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgRWxlbWVudFJlYWxpemVyIHJlYWxpemVyKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG51bGwsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlRvT25lRmVhdHVyZVZhbHVlI2FkZChWYXJpYWJpbGl0eUVsZW1lbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoVmFyaWFiaWxpdHlFbGVtZW50IG93bmVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCAodmFsdWUgPT0gbnVsbCkgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkgewkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gUmVwbGFjZSBkb2VzIG5vdCBjb21wbGV0ZWx5IHJlbW92ZSBvdXRnb2luZwotCQkvLyBhc3NvY2lhdGlvbnMKLQkJLy8gaWYgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdmFsdWUgaGFzIHJlcGxhY2VyIGluIHRoZQotCQkvLyBjb25maWd1cmF0aW9uCi0JCS8vIGl0J3Mgb3V0Z29pbmcgYXNzb2NpYXRpb25zIChpLmUuLCB0aGlzIGVsZW1lbnQpIHdpbGwgYmUKLQkJLy8gcmVwbGFjZWQgYnkgdGhlIHJlcGxhY2luZyBlbGVtZW50Ci0JCS8vIGFzIGEgcmVzdWx0LCB0aGUgb3Bwb3NpdGUgZmVhdHVyZSB2YWx1ZSBzaG91bGQgZHJvcCB0aGUKLQkJLy8gcmVwbGFjZWQgZWxlbWVudAotCQkvLwotCQkvLyBmb3IgZXhhbXBsZSwgUjEgLT4gcmVzcG9uc2libGUgZm9yIEExLCBSMiByZXNwb25zaWJsZSBmb3IgQTIKLQkJLy8gaWYgUjIgcmVwbGFjZXMgUjEsIHRoZW4gUjIgc3RpbGwgcmVzcG9uc2libGUgZm9yIEEyCi0JCS8vIGJ1dCBBMSBkb2VzIG5vdCBoYXZlIGEgcmVzcG9uc2libGUgcm9sZSAobm90IFIyKQotCQkvLyBzbyBmb3IgQTEncyByZXNwb25zaWJsZSByb2xlIG9wcG9zaXRlIGZlYXR1cmUsCi0JCS8vIHRoZSB2YWx1ZSBSMSBzaG91bGQgYmUgZHJvcHBlZCBpbnN0ZWFkIG9mIHJlYWxpemUgdG8gUjIKLQkJLy8gSmluaHVhIFhpLCAxMC8yNy8yMDA1Ci0JCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSB2YWx1ZTsKLQkJYm9vbGVhbiBpc1ZhbHVlUmVwbGFjZWQgPSAoZSBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkKLQkJCQkmJiAoQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KSBlLCByZWFsaXplci5nZXRDb25maWd1cmF0aW9uKCkpICE9IG51bGwpOwotCQlpZiAoIWlzVmFsdWVSZXBsYWNlZCkgewotCQkJLy8gY29udHJpYnV0b3IgY2FuJ3QgY29udHJpYnV0ZSAwLi4xIHJlZmVyZW5jZSBpZiBiYXNlCi0JCQkvLyBhbHJlYWR5IGhhcyBvbmUsCi0JCQkvLyBvciBpZiBtb3JlIHRoYW4gb25lIGNvbnRyaWJ1dG9yIGhhcyB0aGUgdmFsdWUuCi0JCQkvLyBmb3IgZXhhbXBsZSwgaWYgdGhlIGJhc2UgdGFzayBoYXMgbm8gZGlzY2lwbGluZSwgYW5kIG9ubHkKLQkJCS8vIG9uZSBvZiBpdCdzIGNvbnRyaWJ1dG9ycyBoYXMgZGlzY2lwbGluZSwKLQkJCS8vIHRoZW4gdGhhdCBjb250cmlidXRvcidzIGRpc2NpcGxpbmUgd2lsbCBiZSB1c2VkLAotCQkJLy8gb3RoZXJ3aXNlLCBubyBkaXNjaXBsaW5lCi0KLQkJCS8vIHJpZ2h0IG5vdywgd2UgY2FuJ3QgZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIG1vcmUgdGhlbiBvbmUKLQkJCS8vIGNvbnRyaWJ1dG9ycyBoYXMgdGhlIHZhbHVlCi0JCQkvLyBzbyB3ZSBpZ25vcmUgY29udHJpYnV0b3IncyAwMSBpbWNvbWluZyB2YWx1ZQotCQkJCi0JCQkvLyAoU3VibWl0KTogSW5hYmlsaXR5IHRvIGFkZCByZXNwb25zaWJsZSBmb3IgcmVsYXRpb25zaGlwIHRvIGEgd29yayBwcm9kdWN0Ci0JCQkvLyBuZWVkIHRvIGZpeCB0aGlzIGlzc3VlLiBhbHdheXMgdGFrZSB0aGUgZmlyc3Qgb25lLgotCQkJZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZSwgcmVhbGl6ZXIpOwotCQkJaWYgKCBlICE9IG51bGwgKSB7Ci0JCQkJT2JqZWN0IGtleSA9IChvd25lcj09bnVsbCkgPyBlbGVtZW50IDogb3duZXI7Ci0JCQkJaWYgKCAhdmFsdWVNYXAuY29udGFpbnNLZXkoa2V5KSApIHsKLQkJCQkJdmFsdWVNYXAucHV0KGtleSwgZSk7Ci0JCQkJfQotCQkJfQkJCi0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkZlYXR1cmVWYWx1ZSNnZXRWYWx1ZSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJCi0JCU9iamVjdCB2ID0gbnVsbDsKLQkJCi0JCWlmICggc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdjsKLQkJfQotCQkKLQkJT2JqZWN0W10gZW50cmllcyA9IHZhbHVlTWFwLmVudHJ5U2V0KCkudG9BcnJheSgpOwotCQlpZiAoIHNpemUoKSA9PSAxICkgewotCQkJLy8gaWYganVzdCBvbmUgZW50cnksIHJldHVybiBpdAotCQkJdiA9ICgoTWFwLkVudHJ5KWVudHJpZXNbMF0pLmdldFZhbHVlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiBtb3JlIHRoYW4gb25lIGVudHJ5LCBpZiB0aGUgZmlyc3QgZW50cnkgaXMgZnJvbSB0aGUgZWxlbWVudCBpdHNlbGYsIHRoZW4gcmV0dXJuIHRoZSB2YWx1ZQotCQkJLy8gb3RoZXJ3aXNlLCByZXR1cm4gbnVsbAotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSllbnRyaWVzWzBdOwotCQkJaWYgKCBlbnRyeS5nZXRLZXkoKSA9PSBzdXBlci5lbGVtZW50ICkgewotCQkJCXYgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoIGlzRXh0ZW5kUmVwbGFjZUVuYWJsZWQoKSApIHsKLQkJCWlmICggaXNCbGFua0luZGljYXRvcih2KSApIHsKLQkJCQkvLyByZW1vdmUgdGhlIF9OVUxMXyBpdGVtLiB0aGF0IGlzIHVzZWQgYXMgYW4gaW5kaWNhdG9yIHRvIGJsYW5rIG91dCB0aGUgYmFzZSAKLQkJCQkvLyBmb3IgdGhlIGV4dGVuZC1yZXBsYWNlCi0JCQkJdiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ2xvc3VyZUxpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0Nsb3N1cmVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTg2YWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ2xvc3VyZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiAgQmFzZSBjbGFzcyBmb3IgbGlzdGVuZXJzIHRoYXQgbGlzdGVuIHRvIGEgQ29uZmlndXJhdGlvbkNsb3N1cmUgZm9yIGVycm9ycwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xvc3VyZUxpc3RlbmVyIGltcGxlbWVudHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvLyBlcnJvciByZW1vdmVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfUkVNT1ZFRCA9IDA7Ci0JCi0JLy8gZXJyb3IgYWRkZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9BRERFRCA9IDE7Ci0KLQkvLyBlcnJvciBjaGFuZ2VkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVVBEQVRFRCA9IDI7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlcnJvclJlbW92ZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXJyb3JBZGRlZChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgSUNvbmZpZ3VyYXRpb25FcnJvciBlcnJvcik7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlcnJvclVwZGF0ZWQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpOwotCQotCXB1YmxpYyB2b2lkIGZpcmVFdmVudChpbnQgdHlwZSwgZmluYWwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIGZpbmFsIElDb25maWd1cmF0aW9uRXJyb3IgZXJyb3IpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEVSUk9SX1JFTU9WRUQ6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQllcnJvclJlbW92ZWQoY29uZmlnLCBlcnJvcik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfQURERUQ6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQllcnJvckFkZGVkKGNvbmZpZywgZXJyb3IpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX1VQREFURUQ6Ci0JCQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQllcnJvclVwZGF0ZWQoY29uZmlnLCBlcnJvcik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ29uZmlndXJhdGlvbkNsb3N1cmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ29uZmlndXJhdGlvbkNsb3N1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwYjc5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25DbG9zdXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDg3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklDb25maWd1cmF0aW9uQ2xvc3VyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci0KLS8qKgotICogQSBtZXRob2QgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQ2xvc3VyZSBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ2xvc3VyZSB7Ci0KLQkvLyBJZiB0cnVlLCBnZW5lcmF0ZSBkZWJ1ZyB0cmFjZXMuCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gbnVsbDsKLQotCXByb3RlY3RlZCBJQ29uZmlndXJhdGlvbk1hbmFnZXIgY29uZmlnTWFuYWdlciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgRGVwZW5kZW5jeU1hbmFnZXIgZGVwZW5kZW5jeU1hbmFnZXIgPSBudWxsOwotCQotCXByb3RlY3RlZCBJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3I7Ci0KLQkvLyBOb2RlIGNoYW5nZSBpbmZvcm1hdGlvbi4gVGhlIG9iamVjdCBhcmUgdGhlIG1vZGVsIG9iamVjdHMKLQkvLyBjaGVjayB0aGUgbGlua2VkIG9iamVjdHMgaW4gbmVlZGVkCi0JcHJvdGVjdGVkIExpc3Qgc2VsZWN0ZWROb3RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwcml2YXRlIExpc3Q8RWxlbWVudEVycm9yPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PEVsZW1lbnRFcnJvcj4oKTsKLQkKLQkvLyBBIG1hcCBvZiBpbnZhbGlkIG5vZGVzIHRvIEVsZW1lbnREZXBlbmRlbmN5RXJyb3Igb2JqZWN0cy4KLQlwcm90ZWN0ZWQgTWFwPE9iamVjdCwgRWxlbWVudERlcGVuZGVuY3lFcnJvcj4gaW52YWxpZE5vZGVzTWFwID0KLQkJbmV3IEhhc2hNYXA8T2JqZWN0LCBFbGVtZW50RGVwZW5kZW5jeUVycm9yPigpOwotCi0JLy9wcm90ZWN0ZWQgTGlzdCBjaGFuZ2VkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0PENsb3N1cmVMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uUHJvcGVydGllcy5MaXN0ZW5lciBjb25maWdQcm9wTGlzdGVuZXI7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogCQkJICBUaGUgSUFjdGlvbk1hbmFnZXIgdG8gdXNlIHRvIGNoYW5nZSB0aGUgTWV0aG9kQ29uZmlndXJhdGlvbi4gIElmIG51bGwsIGNvbmZpZyB3aWxsIGJlIGNoYW5nZWQgZGlyZWN0bHkuCi0JICogQHBhcmFtIGNvbmZpZwotCSAqICAgICAgICAgICAgQSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkNsb3N1cmUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQl0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLQkJdGhpcy5hY3Rpb25NZ3IgPSBhY3Rpb25NZ3I7Ci0KLQkJY29uZmlnTWFuYWdlciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoCi0JCQkJY29uZmlnKTsKLQkJaWYgKGNvbmZpZ01hbmFnZXIgIT0gbnVsbCkgewotCQkJbGlicmFyeSA9IGNvbmZpZ01hbmFnZXIuZ2V0TWV0aG9kTGlicmFyeSgpOwotCQkJZGVwZW5kZW5jeU1hbmFnZXIgPSBjb25maWdNYW5hZ2VyLmdldERlcGVuZGVuY3lNYW5hZ2VyKCk7Ci0JCQkKLQkJCUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIHByb3BzID0gY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpOwotCQkJY29uZmlnUHJvcExpc3RlbmVyID0gbmV3IENvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzLkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGZpcmVFdmVudCgpIHsKLQkJCQkJcmVmcmVzaEVycm9ybWFya3MoKTsKLQkJCQl9Ci0JCQl9OwkJCQotCQkJcHJvcHMuYWRkTGlzdGVuZXJzKGNvbmZpZ1Byb3BMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBjb25maWd1cmF0aW9uIGNoYW5nZWQsIHJlLWJ1aWxkIHRoZSBhbmFseXplIHRoZSBjb25maWd1cmF0aW9uIGZvciBlcnJvcnMKLQkJY2hlY2tFcnJvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIG1hbmFnZXIuCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPkNvbmZpZ3VyYXRpb25NYW5hZ2VyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25NYW5hZ2VyIGdldENvbmZpZ3VyYXRpb25NYW5hZ2VyKCkgewotCQlyZXR1cm4gY29uZmlnTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+TWV0aG9kQ29uZmlndXJhdGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250YWluaW5pbmcgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBBIDxjb2RlPk1ldGhvZENvbmZpZ3VyYXRpb248L2NvZGU+LgotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldExpYnJhcnkoKSB7Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotLy8JLyoqCi0vLwkgKiBTZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzIHNlbGVjdGlvbi4KLS8vCSAqIAotLy8JICogQHBhcmFtIGVsZW1lbnRzCi0vLwkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9ucyhPYmplY3RbXSBlbGVtZW50cykgewotLy8JCQotLy8JCWlmICggZWxlbWVudHMgPT0gbnVsbCApIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQkKLS8vCQkvLyBjbGVhciB0aGUgb2xkIHNlbGVjdGlvbnMKLS8vCQlzZWxlY3RlZE5vdGVzLmNsZWFyKCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKyApIHsKLS8vCQkJc2VsZWN0ZWROb3Rlcy5hZGQoZWxlbWVudHNbaV0pOwotLy8JCX0KLS8vCX0KLQotCQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgc2VsZWN0aW9uIGxpc3QgYmFzZWQgb24gdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrRXJyb3IoKSB7Ci0JCQotCQkvLyBCdWcgMjA2NzI0IC0gU0NNOiBBbHdheXMgcHJvbXB0IGNoZWNrIG91dCBlbGVtZW50cyBmb3IgYSBvcGVuZWQgY29uZmlndXJhdGlvbiB3aGVuIHJlZnJlc2ggc291cmNlIGNvbnRyb2wgc3RhdHVzCi0JCS8vIGRvbid0IG5lZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24sIHJlbHkgb24gdGhlIGNhbGxlciB0byB2YWxpZGF0ZSBpdCBiZWZvcmUgY2FsbCB0aGlzIG1ldGhvZC4KLQkJLy8gVmFsaWRhdGUgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpdGggdGhlIGFjdGlvbiBtYW5hZ2VyLgotCQkvL0xpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0KLQkJLy8gaW5pdGlhbCBmaWxsIHRoZSBzZWxlY3Rpb25zCi0JCXNlbGVjdGVkTm90ZXMuY2xlYXIoKTsKLQkJc2VsZWN0ZWROb3Rlcy5hZGRBbGwoY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpKTsKLQkJc2VsZWN0ZWROb3Rlcy5hZGRBbGwoY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKSk7Ci0KLQkJLy8gUmUtYnVpbGQgdGhlIHNlbGVjdGlvbnMgdG8gYXV0byBhZGQgdGhlIHByb2Nlc3MgcGFja2FnZXMuCi0JCWNsZWFyRXJyb3JNYXJrcygpOwotCQkKLQkJLy8gQ2xlYW51cCB0aGUgb2xkIHN0YXR1cyBhbmQgcmVidWlsZCB0aGUgbGlzdC4KLQkJaW52YWxpZE5vZGVzTWFwLmNsZWFyKCk7Ci0KLQkJcHJvY2Vzc0NoYW5nZWROb2RlcyhnZXRTZWxlY3Rpb24oKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFcnJvck1hcmtzKCkgewotCQkvLyBSZS1idWlsZCB0aGUgc2VsZWN0aW9ucyB0byBhdXRvIGFkZCB0aGUgcHJvY2VzcyBwYWNrYWdlcy4KLQotCQlmb3IgKEl0ZXJhdG9yPEVsZW1lbnRFcnJvcj4gaXQgPSBlcnJvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUVsZW1lbnRFcnJvciBlcnJvciA9IGl0Lm5leHQoKTsKLQkJCW5vdGlmeUVycm9yKGVycm9yLCBDbG9zdXJlTGlzdGVuZXIuRVJST1JfUkVNT1ZFRCk7Ci0JCX0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hFcnJvcm1hcmtzKCkgewotCQljbGVhckVycm9yTWFya3MoKTsKLQkJZm9yIChJdGVyYXRvcjxFbGVtZW50RXJyb3I+IGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFbGVtZW50RXJyb3IgZXJyb3IgPSBpdC5uZXh0KCk7Ci0JCQlub3RpZnlFcnJvcihlcnJvciwgQ2xvc3VyZUxpc3RlbmVyLkVSUk9SX0FEREVEKTsKLQkJfQkKLQl9Ci0JCi0vLwlwcml2YXRlIHZvaWQgc2VsZWN0UHJvY2Vzc1BhY2thZ2VzKEFjdGl2aXR5IGEpIHsKLS8vCQlpZiAoYSA9PSBudWxsKSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBhLmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQlCcmVha2Rvd25FbGVtZW50IGUgPSAoQnJlYWtkb3duRWxlbWVudCkgaXQubmV4dCgpOwotLy8JCQlPYmplY3QgcGtnID0gZS5lQ29udGFpbmVyKCk7Ci0vLwkJCWlmICghc2VsZWN0ZWROb3Rlcy5jb250YWlucyhwa2cpKSB7Ci0vLwkJCQlzZWxlY3RlZE5vdGVzLmFkZChwa2cpOwotLy8JCQkJY2hhbmdlZE5vZGVzLmFkZChwa2cpOwotLy8JCQl9Ci0vLwotLy8JCQlpZiAoZSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0vLwkJCQlzZWxlY3RQcm9jZXNzUGFja2FnZXMoKEFjdGl2aXR5KSBlKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLQotLy8JLyoqCi0vLwkgKiBBZGRzIGEgbWV0aG9kIHBsdWctaW4gb3IgcGFja2FnZSB0byB0aGUgY2xvc3VyZS4KLS8vCSAqIAotLy8JICogQHBhcmFtIGVsZW1lbnQKLS8vCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLS8vCSAqIEBwYXJhbSBhZGRDaGlsZHJlbgotLy8JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgYWRkIGFsbCBjaGlsZCBtZXRob2QgZWxlbWVudHMuCi0vLwkgKi8KLS8vCXByaXZhdGUgdm9pZCBhZGQoRU9iamVjdCBlbGVtZW50LCBib29sZWFuIGFkZENoaWxkcmVuKSB7Ci0vLwkJaWYgKCFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotLy8JCWlmICghc2VsZWN0ZWROb3Rlcy5jb250YWlucyhlbGVtZW50KSkgewotLy8JCQlzZWxlY3RlZE5vdGVzLmFkZChlbGVtZW50KTsKLS8vCi0vLwkJCS8vIFNhdmUgdGhlIGNoYW5nZWQgbm9kZXMgc28gdGhhdCB3ZSBjYW4gdXBkYXRlIHRoZSBzdGF0dXMgbGF0ZXIuCi0vLwkJCWFkZENoYW5nZWQoZWxlbWVudCk7Ci0vLwotLy8JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotLy8JCQkJc2VsZWN0U3lzdGVtUGFja2FnZXMoKE1ldGhvZFBsdWdpbikgZWxlbWVudCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIEFkZCB0aGUgcGFyZW50IG1ldGhvZCBlbGVtZW50IGFzIHdlbGwuCi0vLwkJRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50LmVDb250YWluZXIoKTsKLS8vCQlpZiAoKHBhcmVudCAhPSBudWxsKSAmJiAhc2VsZWN0ZWROb3Rlcy5jb250YWlucyhwYXJlbnQpKSB7Ci0vLwkJCWFkZChwYXJlbnQsIGZhbHNlKTsKLS8vCQl9Ci0vLwotLy8JCS8vIEFkZCBjaGlsZHJlbiBhcyBuZWVkZWQuCi0vLwkJaWYgKGFkZENoaWxkcmVuKSB7Ci0vLwkJCUVMaXN0IGVsZW1lbnRzID0gZWxlbWVudC5lQ29udGVudHMoKTsKLS8vCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLS8vCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0vLwkJCQkJYWRkKGNoaWxkLCB0cnVlKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcml2YXRlIHZvaWQgYWRkQ2hhbmdlZChPYmplY3QgZWxlbWVudCkgewotLy8JCWlmICghY2hhbmdlZE5vZGVzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0vLwkJCWNoYW5nZWROb2Rlcy5hZGQoZWxlbWVudCk7Ci0vLwkJfQotLy8JfQotCi0vLwlwcml2YXRlIHZvaWQgc2VsZWN0U3lzdGVtUGFja2FnZXMoTWV0aG9kUGx1Z2luIHBsdWdpbikgewotLy8JCUxpc3QgcGtncyA9IFRuZ1V0aWwuZ2V0QWxsU3lzdGVtUGFja2FnZXMocGx1Z2luKTsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCUVPYmplY3QgcGtnID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLS8vCQkJYWRkKHBrZywgZmFsc2UpOwotLy8JCX0KLS8vCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIHBsdWctaW4gb3IgcGFja2FnZSBpcyBzZWxlY3RlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGlzIHNlbGVjdGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoT2JqZWN0IGlucHV0KSB7Ci0JCWlmICgoaW5wdXQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB8fCBpbnB1dCA9PSBjb25maWcKLQkJCQl8fCBzZWxlY3RlZE5vdGVzLmNvbnRhaW5zKGlucHV0KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGVsZW1lbnQgZGVwZW5kZW5jeSBlcnJvciBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAZWxlbWVudCBBIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQW4gPGNvZGU+RWxlbWVudERlcGVuZGVuY3lFcnJvcjwvY29kZT4uCi0JICovCi0JcHVibGljIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0RXJyb3IoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZ2V0RXJyb3IoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaW52YWxpZE5vZGVzTWFwCi0JCQkJLmdldChlbGVtZW50KTsKLQkJaWYgKGVycm9yID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQllcnJvciA9IG5ldyBFbGVtZW50RGVwZW5kZW5jeUVycm9yKGVsZW1lbnQpOwotCQkJaW52YWxpZE5vZGVzTWFwLnB1dChlbGVtZW50LCBlcnJvcik7Ci0JCX0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGVycm9yIGluIHRoaXMgY29uZmlndXJhdGlvbiBjbG9zdXJlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpbnZhbGlkTm9kZXNNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IChFbGVtZW50RGVwZW5kZW5jeUVycm9yKSBpdC5uZXh0KCk7Ci0JCQlpZiAoZXJyb3IuaXNFcnJvcigpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBwcm9ibGVtIChlcnJvci93YXJuaW5nKSB3aXRoIHRoaXMgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb2JsZW0oKSB7Ci0JCXJldHVybiBpbnZhbGlkTm9kZXNNYXAuc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZXJyb3JzLgotCSAqIAotCSAqIEByZXR1cm4gQSBhIGxpc3Qgb2YgPGNvZGU+UGFja2FnZUVycm9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTGlzdDxQYWNrYWdlRXJyb3I+IGdldEFsbEVycm9ycygpIHsKLQkJTGlzdDxQYWNrYWdlRXJyb3I+IGVycm9ycyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZUVycm9yPigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaW52YWxpZE5vZGVzTWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSAoRWxlbWVudERlcGVuZGVuY3lFcnJvcikgaXQubmV4dCgpOwotCQkJZXJyb3JzLmFkZEFsbChlcnJvci5nZXRBbGwoKSk7Ci0JCX0KLQkJcmV0dXJuIGVycm9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgZGVwZW5kZW5jeSBlcnJvcnMuCi0JICogCi0JICogQHJldHVybiBBbiBhcnJheSBvZiA8Y29kZT5FbGVtZW50RGVwZW5kZW5jeUVycm9yPC9jb2RlPgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXREZXBlbmRlbmN5RXJyb3JzKCkgewotCQlyZXR1cm4gaW52YWxpZE5vZGVzTWFwLnZhbHVlcygpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgaW52YWxpZCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBpbnZhbGlkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0SW52YWxpZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGludmFsaWROb2Rlc01hcC5rZXlTZXQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVycm9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChpbnZhbGlkTm9kZXNNYXAuY29udGFpbnNLZXkoZWxlbWVudCkpIHsKLQkJCWludmFsaWROb2Rlc01hcC5yZW1vdmUoZWxlbWVudCk7Ci0KLS8vCQkJLy8gRXJyb3Igc3RhdHVzIGNoYW5nZWQsIGFkZCBpdCB0byB0aGUgY2hhbmdlZCBsaXN0LgotLy8JCQlpZiAoIWNoYW5nZWROb2Rlcy5jb250YWlucyhlbGVtZW50KSkgewotLy8JCQkJY2hhbmdlZE5vZGVzLmFkZChlbGVtZW50KTsKLS8vCQkJfQotCQl9Ci0JfQotCi0vLwkvKioKLS8vCSAqIFJldHVybnMgYWxsIHRoZSBjaGFuZ2VkIGVsZW1lbnRzLiBUaGVzZSBhcmUgZWxlbWVudHMgd2hvc2UgY2hlY2sgc3RhdGVzCi0vLwkgKiBoYXZlIGNoYW5nZWQgb3Igd2hvc2UgaW1hZ2UgaGF2ZSBjaGFuZ2VkIGR1ZSB0byBlcnJvci4KLS8vCSAqIAotLy8JICogQHJldHVybiBBIGxpc3Qgb2YgY2hhbmdlZCBtZXRob2QgZWxlbWVudHMuCi0vLwkgKi8KLS8vCXB1YmxpYyBMaXN0IGdldENoYW5nZWRFbGVtZW50cygpIHsKLS8vCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdChjaGFuZ2VkTm9kZXMpOwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBpbnZhbGlkTm9kZXNNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgaXRlbSA9IGl0Lm5leHQoKTsKLS8vCQkJaWYgKCFpdGVtcy5jb250YWlucyhpdGVtKSkgewotLy8JCQkJaXRlbXMuYWRkKGl0ZW0pOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBpdGVtczsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGhvZCBwbHVnLWlucyBhbmQgcGFja2FnZXMgc2VsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgbWV0aG9kIHBsdWctaW5zIGFuZCBwYWNrYWdlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2VsZWN0ZWROb3Rlcy50b0FycmF5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDaGFuZ2VkTm9kZXMoT2JqZWN0W10gY2hhbmdlZE5vZGVzKSB7Ci0JCQotCQkvLyBmb3IgYWxsIHRoZSBjaGFuZ2VkIG5vdGVzLAotCQkvLyBhbGwgYWxsIGNvbnRhaW5lZCBlbGVtZW50cyBhbmQgY2hlY2sgaWYgdGhlIGVsZW1lbnRzIGFyZSBpbiBjb25maWcgb3Igbm90Ci0JCS8vIGlmIHRoZSBlbGVtZW50cyBhcmUgaW4gY29uZmlnLCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cyBzaG91bGQgYWxzbyBiZSBpbiBjb25maWcKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDxjaGFuZ2VkTm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCQotCQkJLy8gdGhlIGVsZW1lbnRzIGFyZSBlaXRoZXIgcGx1Z2luIG9yIHBhY2thZ2UKLQkJCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGNoYW5nZWROb2Rlc1tpXTsKLQkJCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5TWFuYWdlcgotCQkJCQkuZ2V0RGVwZW5kZW5jeSgoTWV0aG9kRWxlbWVudCkgY2hhbmdlZEVsZW1lbnQpOwotCQkJaWYgKGRlcGVuZGVuY3kgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlMaXN0IHJlZnMgPSBkZXBlbmRlbmN5LmdldEFsbEVsZW1lbnRSZWZlcmVuY2VzKCk7Ci0JCQlpZiAoIHJlZnMgPT0gbnVsbCB8fCByZWZzLnNpemUoKSA9PSAwICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTsgKSB7Ci0JCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSAoRWxlbWVudFJlZmVyZW5jZSlpdHIubmV4dCgpOwotCQkJCWNoZWNrUmVmZXJlbmNlKHJlZik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBhZGRlZCBjYXRlZ29yeSwgY2hlY2sgdGhlaXIgcmVmZXJlbmNlcyBhcyB3ZWxsCi0JCWZvciAoIEl0ZXJhdG9yPE1ldGhvZEVsZW1lbnQ+IGl0ID0gY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uRGF0YSgpCi0JCQkJLmdldEFkZGVkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gaXQubmV4dCgpOwotCQkJCi0JCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gCi0JCQkJZGVwZW5kZW5jeU1hbmFnZXIuZ2V0RGVwZW5kZW5jeSgoTWV0aG9kRWxlbWVudCllLmVDb250YWluZXIoKSk7Ci0JCQlpZiAoZGVwZW5kZW5jeSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQotCQkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRBbGxFbGVtZW50UmVmZXJlbmNlcygpOwotCQkJaWYgKCByZWZzID09IG51bGwgfHwgcmVmcy5zaXplKCkgPT0gMCApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgewotCQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpaXRyLm5leHQoKTsKLQkJCQlpZiAoIHJlZi5nZXRFbGVtZW50KCkgPT0gZSApIHsKLQkJCQkJY2hlY2tSZWZlcmVuY2UocmVmKTsKLQkJCQl9Ci0JCQl9Ci0JCi0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja1JlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlNZXRob2RFbGVtZW50IGUgPSByZWYuZ2V0RWxlbWVudCgpOwotCQlNZXRob2RFbGVtZW50IGVfcmVmID0gcmVmLmdldFJlZkVsZW1lbnQoKTsKLQkJCi0JCWlmICggZSBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UgfHwgZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIEJ1ZyAyMDc2MDkgLSBSZXBsYWNlZCBlbGVtZW50cyBhcmUgbm90IGNvbnNpZGVyZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3IgIm1pc3NpbmcgbWFuZGF0b3J5IGlucHV0IgotCQkvLyBpZiB0aGUgZWxlbWVudCBpcyByZXBsYWNlZCwgaWdub3JlIHRoZSByZWZlcmVuY2UKLQkJaWYgKCBlIGluc3RhbmNlb2YgVmFyaWFiaWxpdHlFbGVtZW50ICkgewotCQkJVmFyaWFiaWxpdHlFbGVtZW50IHJlcGxhY2VyID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRSZXBsYWNlcigoVmFyaWFiaWxpdHlFbGVtZW50KWUsIGNvbmZpZyk7Ci0JCQlpZiAoIHJlcGxhY2VyICE9IG51bGwgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCQotCQkvLyB0aGUgZWxlbWVudCBtaWdodCBiZSBzdWJ0cmFjdGVkLCBzbyBpZ25vcmUgaXQKLQkJaWYgKCAhQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhlLCBjb25maWcsIHRydWUsIGZhbHNlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkJCi0JCS8vIGlmIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgaXMgbm90IGluICBjb25maWcsIGxvZyBlcnJvcgotCQlpZiAoICFDb25maWd1cmF0aW9uSGVscGVyLmluQ29uZmlnKGVfcmVmLCBjb25maWcpKSB7Ci0JCQkKLQkJCS8qCi0JCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQsIAotCQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSwgCi0JCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZV9yZWYpIH0pKTsKLQkJCQotCQkJRWxlbWVudEVycm9yIGVycm9yID0gbmV3IEVsZW1lbnRFcnJvcigKLQkJCQkJdGhpcywgRXJyb3JJbmZvLldBUk5JTkcsCi0JCQkJCW1lc3NhZ2UsIGUsIGVfcmVmLCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsgLy8kTk9OLU5MUy0xJAotCQkJKi8KLQkJCUVsZW1lbnRFcnJvciBlcnJvciA9IENvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5nZXRFcnJvcihjb25maWcsIHJlZik7Ci0JCQlpZiAoIGVycm9yID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQllcnJvcnMuYWRkKGVycm9yKTsKLQkJCW5vdGlmeUVycm9yKGVycm9yLCBDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQpOwotCQkJCi0JCQkvLyBwcm9jZXNzIHBhY2thZ2UgZXJyb3IKLQkJCXByb2Nlc3NQYWNrYWdlRXJyb3IoTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlKSwgTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlX3JlZiksIGVycm9yLmdldEVycm9yTGV2ZWwoKSApOwotCQl9CQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BhY2thZ2VFcnJvcihPYmplY3QgcGtnLCBPYmplY3QgcGtnX3JlZiwgaW50IGVycm9yTGV2ZWwgKSB7Ci0JCWlmICggZXJyb3JMZXZlbCA+IDAgKSB7Ci0JCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IocGtnLCB0cnVlKTsKLQkJCQotCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IuZ2V0RXJyb3IocGtnX3JlZik7Ci0JCQlpZiAoIHBrZ2Vycm9yID09IG51bGwgKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBMaWJyYXJ5UmVzb3VyY2VzLmNvbmZpZ0Nsb3N1cmVXYXJuaW5nX21zZzE7Ci0JCi0JCQkJcGtnZXJyb3IgPSAgbmV3IFBhY2thZ2VFcnJvcihlcnJvckxldmVsLCBtZXNzYWdlLCAKLQkJCQkJCXBrZywgcGtnX3JlZiwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTyk7CQkJCQotCQkJCWVycm9yLmFkZEVycm9yKHBrZ2Vycm9yKTsKLQkJCQkKLQkJCX0gZWxzZSB7Ci0JCQkJcGtnZXJyb3Iuc2V0RXJyb3JMZXZlbChlcnJvckxldmVsKTsKLQkJCQkKLQkJCQkvLyBuZWVkIHRvIHJlY2FsYyB0aGUgZXJyb3IgYml0cwotCQkJCWVycm9yLmNhbGN1bGF0ZUVycm9yQml0cygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gcmVtb3ZlIHRoZSBlcnJvcgotCQkJcmVtb3ZlRXJyb3IocGtnKTsKLQkJfQotCQkKLQkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdClwa2cpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBub3RpZnlFcnJvcihFbGVtZW50RXJyb3IgZXJyb3IsIGludCB0eXBlICkgewotCQkKLQkJaWYgKCBlcnJvciA9PSBudWxsIHx8IGxpc3RlbmVycyA9PSBudWxsIHx8IGxpc3RlbmVycy5zaXplKCkgPT0gMCApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCQkJCQkKLQkJCWZvciAoSXRlcmF0b3I8Q2xvc3VyZUxpc3RlbmVyPiBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyID0gaXRlci5uZXh0KCk7Ci0JCQkJCi0JCQkJbGlzdGVuZXIuZmlyZUV2ZW50KHR5cGUsIGNvbmZpZywgZXJyb3IpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCQotLy8JLyoqCi0vLwkgKiBWYWxpZGF0ZXMgdGhlIGVsZW1lbnQgZGVwZW5kZW5jeSB3aGVuIHRoZSBlbGVtZW50IGlzIHNlbGVjdGVkLiBXaGVuIHRoZQotLy8JICogZWxlbWVudCBpcyBzZWxlY3RlZCwgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOiAxLiBDaGVjayBlcnJvciBmb3IKLS8vCSAqIHJlZmVyZW5jZXMgMi4gUmVtb3ZlIGVycm9yIGZvciBkZXBlbmRlbnRzIGFzc29jaWF0ZWQgd2l0aCBlbGVtZW50IDMuCi0vLwkgKiBVcGRhdGUgcGFyZW50czogaWYgdGhlIHNlbGVjdGlvbiBpcyB2YWxpZCwgcmVtb3ZlIGFsbCBlcnJvcnMgZnJvbSBwYXJlbnRzCi0vLwkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbGVtZW50IGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCwgc2V0IGVycm9yIHRvCi0vLwkgKiBhbGwgcGFyZW50cy4KLS8vCSAqIAotLy8JICogQHBhcmFtIGRlcGVuZGVuY3kKLS8vCSAqICAgICAgICAgICAgRWxlbWVudERlcGVuZGVuY3kKLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU2VsZWN0ZWQoUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewotLy8JCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGRlcGVuZGVuY3kuZ2V0RWxlbWVudCgpOwotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIHJlbW92ZSBhbGwgcHJldmlvdXMgZXJyb3JzLgotLy8JCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCi0vLwkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgc2VsZWN0ZWQsIGNoZWNrIGFsbCBkZXBlbmRlbmN5IGVycm9ycyBpbiB0aGUKLS8vCQkvLyBkZXBlbmRlbnQgZWxlbWVudHMuCi0vLwkJTGlzdCBkZXBlbmRlbnRzID0gZGVwZW5kZW5jeS5nZXREZXBlbmRlbnRzKCk7Ci0vLwkJaWYgKGRlcGVuZGVudHMgIT0gbnVsbCAmJiBkZXBlbmRlbnRzLnNpemUoKSA+IDApIHsKLS8vCQkJT2JqZWN0IGVsZW1lbnQ7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRyID0gZGVwZW5kZW50cy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotLy8JCQkJZWxlbWVudCA9IGl0ci5uZXh0KCk7Ci0vLwotLy8JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLS8vCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IucmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8JCQkJCWlmIChlcnJvci5zaXplKCkgPT0gMCkgewotLy8JCQkJCQlyZW1vdmVFcnJvcihlbGVtZW50KTsKLS8vCi0vLwkJCQkJCS8vIENsZWFyIHRoZSBwYXJlbnQgZXJyb3IgaW50cm9kdWNlZCBieSB0aGlzIGVsZW1lbnQuCi0vLwkJCQkJCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGVsZW1lbnQpOwotLy8JCQkJCX0KLS8vCQkJCQkKLS8vCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciByZW1vdmVkCi0vLwkJCQkJbm90aWZ5RXJyb3JSZW1vdmVkKHBrZ2Vycm9yKTsKLS8vCi0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIElmIGFuIGVsZW1lbnQgaXMgY2hlY2tlZCwgY2hlY2sgdGhlIGVsZW1lbnQgaXQgZGVwZW5kcyBvbiwKLS8vCQkvLyB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBhcyB3ZWxsLgotLy8JCUxpc3QgcmVmcyA9IGRlcGVuZGVuY3kuZ2V0UmVmZXJlbmNlcygpOwotLy8JCWlmIChyZWZzICE9IG51bGwgJiYgcmVmcy5zaXplKCkgPiAwKSB7Ci0vLwkJCVBhY2thZ2VSZWZlcmVuY2UgcmVmOwotLy8JCQlPYmplY3QgZWxlbWVudDsKLS8vCQkJZm9yIChJdGVyYXRvciBpdHIgPSByZWZzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlyZWYgPSAoUGFja2FnZVJlZmVyZW5jZSkgaXRyLm5leHQoKTsKLS8vCQkJCWVsZW1lbnQgPSByZWYuZ2V0UmVmRWxlbWVudCgpOwotLy8KLS8vCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8KLS8vCQkJCS8vIERvbid0IHdhcm4gb24gb3B0aW9uYWwgaW5wdXRzIG5vdCBiZWluZwotLy8JCQkJLy8gcHJlc2VudCwgc28gYWRkZWQgdGhlIGNhbklnbm9yZSgpIG1ldGhvZAotLy8JCQkJaWYgKCFpc1NlbGVjdGVkKGVsZW1lbnQpICYmICFjYW5JZ25vcmUocmVmKSkgewotLy8JCQkJCVN0cmluZyBtZXNzYWdlOwotLy8JCQkJCWludCBlcnJvclR5cGUgPSAwOwotLy8JCQkJCWlmIChyZWYuaGFzQmFzZVJlZmVyZW5jZSgpKSB7Ci0vLwkJCQkJCWVycm9yVHlwZSA9IEVycm9ySW5mby5FUlJPUjsKLS8vCQkJCQkJbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMjsKLS8vCQkJCQl9IGVsc2UgewotLy8JCQkJCQllcnJvclR5cGUgPSBFcnJvckluZm8uV0FSTklORzsKLS8vCQkJCQkJbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuY29uZmlnQ2xvc3VyZVdhcm5pbmdfbXNnMzsKLS8vCQkJCQl9Ci0vLwotLy8JCQkJCUVsZW1lbnREZXBlbmRlbmN5RXJyb3IgZXJyb3IgPSBnZXRFcnJvcihjaGFuZ2VkRWxlbWVudCwKLS8vCQkJCQkJCXRydWUpOwotLy8JCQkJCQotLy8JCQkJCVBhY2thZ2VFcnJvciBwa2dlcnJvciA9ICBuZXcgUGFja2FnZUVycm9yKHRoaXMsIGVycm9yVHlwZSwgbWVzc2FnZSwKLS8vCQkJCQkJCWNoYW5nZWRFbGVtZW50LCBlbGVtZW50LCBFcnJvckluZm8uUkVGRVJFTkNFX1RPKTsJCQkJCi0vLwkJCQkJZXJyb3IuYWRkRXJyb3IocGtnZXJyb3IpOwotLy8KLS8vCQkJCQkvLyBub3RpZnkgdGhlIGVycm9yIGxpc3RlbmVyIGFib3V0IHRoZSBlcnJvciBhZGRlZAotLy8JCQkJCW5vdGlmeUVycm9yQWRkZWQocGtnZXJyb3IpOwotLy8KLS8vCQkJCX0gZWxzZSB7Ci0vLwkJCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGNoYW5nZWRFbGVtZW50LAotLy8JCQkJCQkJZmFsc2UpOwotLy8JCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJCVBhY2thZ2VFcnJvciBwa2dlcnJvciA9IGVycm9yLnJlbW92ZUVycm9yKGVsZW1lbnQpOwotLy8JCQkJCQkKLS8vCQkJCQkJLy8gbm90aWZ5IHRoZSBlcnJvciBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3IgcmVtb3ZlZAotLy8JCQkJCQlub3RpZnlFcnJvclJlbW92ZWQocGtnZXJyb3IpOwotLy8KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCS8vIEZpbmFsbHksIHVwZGF0ZSB0aGUgcGFyZW50cy4KLS8vCQl1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKChFT2JqZWN0KSBjaGFuZ2VkRWxlbWVudCk7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBWYWxpZGF0ZXMgdGhlIEVsZW1lbnREZXBlbmRlbmN5IHdoZW4gdGhlIGVsZW1lbnQgaXMgdW5zZWxlY3RlZC4gV2hlbiB0aGUKLS8vCSAqIGVsZW1lbnQgaXMgdW5zZWxlY3RlZCwgd2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOiAxLiBjaGVjayBlcnJvciBmb3IKLS8vCSAqIGRlcGVuZGVuY3RzIDIuIHJlbW92ZSBlcnJvciBmb3IgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggZWxlbWVudCwgaW4KLS8vCSAqIGNhc2Ugb2YgYW55IGFkZGVkIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGNoZWNrIDMuIHVwZGF0ZSBwYXJlbnRzOiBpZiB0aGUKLS8vCSAqIHNlbGVjdGlvbiBpcyB2YWxpZCwgcmVtb3ZlIGFsbCBlcnJvcnMgZnJvbSBwYXJlbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0vLwkgKiBlbGVtZW50IGlmIHRoZSBzZWxlY3Rpb24gaXMgaW52YWxpZCwgc2V0IGVycm9yIHRvIGFsbCBwYXJlbnRzLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZGVwZW5kZW5jeQotLy8JICogICAgICAgICAgICBBIDxjb2RlPkVsZW1lbnREZXBlbmRlbmN5PC9jb2RlPiBvYmplY3QuCi0vLwkgKi8KLS8vCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVVuU2VsZWN0ZWQoUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSkgewotLy8JCU9iamVjdCBjaGFuZ2VkRWxlbWVudCA9IGRlcGVuZGVuY3kuZ2V0RWxlbWVudCgpOwotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgdW4tc2VsZWN0ZWQsIHJlbW92ZSBhbGwgcHJldmlvdXMgZXJyb3JzLgotLy8JCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCi0vLwkJaWYgKGNoYW5nZWRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8KLS8vCQkvLyBTaW5jZSB0aGlzIGVsZW1lbnQgaXMgdW4tc2VsZWN0ZWQsIHJlbW92ZSBhbGwgZXJyb3JzIGluIHRoZQotLy8JCS8vIHJlZmVyZW5jZWQgZWxlbWVudHMuCi0vLwkJTGlzdCByZWZzID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2VzKCk7Ci0vLwkJaWYgKHJlZnMgIT0gbnVsbCAmJiByZWZzLnNpemUoKSA+IDApIHsKLS8vCQkJRWxlbWVudFJlZmVyZW5jZSByZWY7Ci0vLwkJCU9iamVjdCBlbGVtZW50OwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJlZnMuaXRlcmF0b3IoKTsgaXRyLmhhc05leHQoKTspIHsKLS8vCQkJCXJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdHIubmV4dCgpOwotLy8JCQkJZWxlbWVudCA9IHJlZi5nZXRSZWZFbGVtZW50KCk7Ci0vLwotLy8JCQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQsIGZhbHNlKTsKLS8vCQkJCWlmIChlcnJvciAhPSBudWxsKSB7Ci0vLwkJCQkJUGFja2FnZUVycm9yIHBrZ2Vycm9yID0gZXJyb3IucmVtb3ZlRXJyb3IoY2hhbmdlZEVsZW1lbnQpOwotLy8JCQkJCWlmIChlcnJvci5zaXplKCkgPT0gMCkgewotLy8JCQkJCQlyZW1vdmVFcnJvcihlbGVtZW50KTsKLS8vCi0vLwkJCQkJCS8vIENsZWFyIHRoZSBwYXJlbnQgZXJyb3IgaW50cm9kdWNlZCBieSB0aGlzIGVsZW1lbnQuCi0vLwkJCQkJCXVwZGF0ZVBhcmVudHNGb3JFcnJvcnMoKEVPYmplY3QpIGVsZW1lbnQpOwotLy8KLS8vCQkJCQl9Ci0vLwkJCQkJCi0vLwkJCQkJLy8gbm90aWZ5IHRoZSBlcnJvciBsaXN0ZW5lciBhYm91dCB0aGUgZXJyb3IgcmVtb3ZlZAotLy8JCQkJCW5vdGlmeUVycm9yUmVtb3ZlZChwa2dlcnJvcik7Ci0vLwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQkvLyBJZiBhbiBlbGVtZW50IGlzIHVuY2hlY2tlZCwgY2hlY2sgdGhlIGRlcGVuZGVudCBlbGVtZW50cy4KLS8vCQkvLyBJZiB0aGVyZSBhcmUgY2hlY2sgZWxlbWVudHMgZGVwZW5kaW5nIG9uIGl0LCB0aGUgZWxlbWVudCBjYW4ndCBiZQotLy8JCS8vIHVuY2hlY2tlZC4KLS8vCQlMaXN0IGRlcGVuZGVudHMgPSBkZXBlbmRlbmN5LmdldERlcGVuZGVudHMoKTsKLS8vCQlpZiAoZGVwZW5kZW50cyAhPSBudWxsICYmIGRlcGVuZGVudHMuc2l6ZSgpID4gMCkgewotLy8JCQlPYmplY3QgZWxlbWVudDsKLS8vCQkJZm9yIChJdGVyYXRvciBpdHIgPSBkZXBlbmRlbnRzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQllbGVtZW50ID0gaXRyLm5leHQoKTsKLS8vCi0vLwkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLS8vCi0vLwkJCQlpZiAoaXNTZWxlY3RlZChlbGVtZW50KSkgewotLy8JCQkJCS8vIERldGVybWluZSB0aGUgdHlwZSBvZiBkZXBlbmRlbmN5LgotLy8JCQkJCVBhY2thZ2VEZXBlbmRlbmN5IGNoaWxkRGVwID0gZGVwZW5kZW5jeU1hbmFnZXIKLS8vCQkJCQkJCS5nZXREZXBlbmRlbmN5KChNZXRob2RFbGVtZW50KSBlbGVtZW50KTsKLS8vCi0vLwkJCQkJdmFsaWRhdGVTZWxlY3RlZChjaGlsZERlcCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCXJlbW92ZUVycm9yKGNoYW5nZWRFbGVtZW50KTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJLy8gZmluYWxseSwgdXBkYXRlIHRoZSBwYXJlbnRzCi0vLwkJdXBkYXRlUGFyZW50c0ZvckVycm9ycygoRU9iamVjdCkgY2hhbmdlZEVsZW1lbnQpOwotLy8JfQotLy8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUGFyZW50RXJyb3IoRU9iamVjdCBwYXJlbnQsIEVPYmplY3QgZWxlbWVudCwKLQkJCWludCBlcnJvclR5cGUpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IChwYXJlbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLS8vCQlpZiAoKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0vLwkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzR2xvYmFsUGFja2FnZSgoTWV0aG9kUGFja2FnZSkgcGFyZW50KSkgewotLy8JCQl1cGRhdGVQYXJlbnRFcnJvcihwYXJlbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotCi0JCS8vIFJlbW92ZSB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCBmcm9tIGFsbCBwYXJlbnRzLgotCQlFbGVtZW50RGVwZW5kZW5jeUVycm9yIGVycm9yID0gZ2V0RXJyb3IocGFyZW50LCBmYWxzZSk7Ci0JCWlmIChlcnJvciAhPSBudWxsICYmIGVycm9yLnNpemUoKSA+IDApIHsKLQkJCWVycm9yLnJlbW92ZUVycm9yKGVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGVycm9yVHlwZSAhPSBFcnJvckluZm8uTk9ORSkgewotCQkJLy8gUHJvcGVnYXRlIHRoZSBlcnJvciB0byBhbGwgcGFyZW50cy4KLQkJCWVycm9yID0gZ2V0RXJyb3IocGFyZW50LCB0cnVlKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5jb25maWdDbG9zdXJlV2FybmluZ19tc2cxOwotCQkJUGFja2FnZUVycm9yIHBrZ2VyciA9IG5ldyBQYWNrYWdlRXJyb3IoZXJyb3JUeXBlLCBtZXNzYWdlLCBwYXJlbnQsIGVsZW1lbnQsCi0JCQkJCUVycm9ySW5mby5OT05FKTsKLQkJCWVycm9yLmFkZEVycm9yKHBrZ2Vycik7Ci0JCX0gZWxzZSBpZiAoKGVycm9yICE9IG51bGwpICYmIChlcnJvci5zaXplKCkgPT0gMCkpIHsKLQkJCXJlbW92ZUVycm9yKHBhcmVudCk7Ci0JCX0KLQotCQl1cGRhdGVQYXJlbnRFcnJvcihwYXJlbnQuZUNvbnRhaW5lcigpLCBlbGVtZW50LCBlcnJvclR5cGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVQYXJlbnRzRm9yRXJyb3JzKEVPYmplY3QgZWxlbWVudCkgewotCQlpbnQgZXJyb3JUeXBlID0gRXJyb3JJbmZvLk5PTkU7Ci0KLQkJRWxlbWVudERlcGVuZGVuY3lFcnJvciBlcnJvciA9IGdldEVycm9yKGVsZW1lbnQpOwotCQlpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5zaXplKCkgPiAwKSB7Ci0JCQlpZiAoZXJyb3IuaXNFcnJvcigpIHx8IGVycm9yLmlzQ2hpbGRFcnJvcigpKSB7Ci0JCQkJZXJyb3JUeXBlID0gUGFja2FnZUVycm9yLkNISUxEX0VSUk9SOwotCQkJfSBlbHNlIGlmIChlcnJvci5pc1dhcm5pbmcoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0JCQkJZXJyb3JUeXBlID0gUGFja2FnZUVycm9yLkNISUxEX1dBUk5JTkc7Ci0JCQl9Ci0JCX0KLQotCQl1cGRhdGVQYXJlbnRFcnJvcihlbGVtZW50LmVDb250YWluZXIoKSwgZWxlbWVudCwgZXJyb3JUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBhY2NlcHQgdGhlIGN1dHJyZW50IHNlbGVjdGlvbiwgZml4IHRoZSBlcnJvcnMgYW5kIGlnbm9yZSBhbnkgd2FybmluZyBtZXNzYWdlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpeEVycm9ycygpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQkJYm9vbGVhbiBmb3JjZUNoZWNrID0gdHJ1ZTsKLQkJd2hpbGUgKGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSBmaXhQcm9ibGVtcyh0cnVlLCBmb3JjZUNoZWNrKTsKLQkJCWZvcmNlQ2hlY2sgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGZpeCBhbGwgZXJyb3IocykgYW5kIHdhcm5pZ24ocykKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXhQcm9ibGVtcygpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gdHJ1ZTsKLQkJYm9vbGVhbiBmb3JjZUNoZWNrID0gdHJ1ZTsKLQkJd2hpbGUgKGNoYW5nZWQpIHsKLQkJCWNoYW5nZWQgPSBmaXhQcm9ibGVtcyhmYWxzZSwgZm9yY2VDaGVjayk7Ci0JCQlmb3JjZUNoZWNrID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZml4UHJvYmxlbXMoYm9vbGVhbiBlcnJvck9ubHksIGJvb2xlYW4gZm9yY2VDaGVjaykgewotCQkvLyBOb3RlOiBtYWtlIGNsb3N1cmUgd2lsbCBzZWxlY3QgZWxlbWVudHMgYXMgbmVlZGVkLgotCQkvLyBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IHNlbGN0ZWQgb25lcwotCQkvLyBpbiBvcmRlciB0byB0cmFjZSB0aGUgc3RhdHVzCi0JCS8vTGlzdCBjdXJyZW50U2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KHNlbGVjdGVkTm90ZXMpOwotCi0JCS8vIGlmIGZvcmNlIGNoZWNrIGlzIHNldCwgcnVuIGNoZWNrIGFueXdheQotCQlib29sZWFuIGNoYW5nZWQgPSBmb3JjZUNoZWNrOwotCi0JCS8vIGxpc3Qgb2YgZXJyb3JJbmZvIG9iamVjdHMKLQkJTGlzdCBlcnJvcnMgPSBnZXRBbGxFcnJvcnMoKTsKLQkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7CQkJCi0JCQlpbnZhbGlkTm9kZXNNYXAuY2xlYXIoKTsKLQkJCVBhY2thZ2VFcnJvciBlcnJvcjsKLQkJCUVPYmplY3QgY2F1c2VFbGVtZW50OwotCQkJLy9ib29sZWFuIG93bmVyU2VsZWN0ZWQsIGNhdXNlU2VsZWN0ZWQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQllcnJvciA9IChQYWNrYWdlRXJyb3IpIGl0Lm5leHQoKTsKLQotCQkJCS8vb3duZXJFbGVtZW50ID0gKEVPYmplY3QpIGVycm9yLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWNhdXNlRWxlbWVudCA9IChFT2JqZWN0KSBlcnJvci5nZXRDYXVzZUVsZW1lbnQoKTsKLQkJCQkvL2FkZENoYW5nZWQob3duZXJFbGVtZW50KTsKLQkJCQkvL2FkZENoYW5nZWQoY2F1c2VFbGVtZW50KTsKLS8vCQkJCWlmIChlcnJvci5pc0NoaWxkRXJyb3IoKSB8fCBlcnJvci5pc0NoaWxkV2FybmluZygpKSB7Ci0vLwkJCQkJY29udGludWU7Ci0vLwkJCQl9Ci0KLQkJCQlib29sZWFuIGlzRXJyb3IgPSBlcnJvci5pc0Vycm9yKCk7Ci0JCQkJYm9vbGVhbiBpc1dhcm5pbmcgPSBlcnJvci5pc1dhcm5pbmcoKTsKLQkJCQlpZiAoIWlzRXJyb3IgJiYgIWlzV2FybmluZyB8fCAhaXNFcnJvciAmJiBlcnJvck9ubHkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCi0JCQkJaWYgKCAhaXNTZWxlY3RlZChjYXVzZUVsZW1lbnQpICYmIHNlbGVjdEVycm9yRWxlbWVudChjYXVzZUVsZW1lbnQpICkgewotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIGNoYW5nZWQgKSB7Ci0JCQljaGVja0Vycm9yKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3RFcnJvckVsZW1lbnQoRU9iamVjdCBlbGVtZW50KSB7Ci0KLQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRydWU7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIAotCQkJCSYmICFjb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQoKE1ldGhvZFBsdWdpbikgZWxlbWVudCk7Ci0JCX0gZWxzZSBpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIAotCQkJCSYmICFjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNvbnRhaW5zKGVsZW1lbnQpKXsKLQkJCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChNZXRob2RQYWNrYWdlKSBlbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGVkID0gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0KLS8vCS8qKgotLy8JICogdXBkYXRlIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBpbiB0aGUgbGlicmFyeSB3aXRoIHRoZSBjdXJyZW50IHNlbGVjdGlvbnMKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgc2F2ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0vLwkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotLy8JCUxpc3QgcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotLy8KLS8vCQlwbHVnaW5zLmNsZWFyKCk7Ci0vLwkJcGFja2FnZXMuY2xlYXIoKTsKLS8vCi0vLwkJRU9iamVjdCBlbGVtZW50OwotLy8JCWZvciAoSXRlcmF0b3IgaXQgPSBzZWxlY3RlZE5vdGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLS8vCQkJZWxlbWVudCA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0vLwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0vLwkJCQlpZiAoIXBsdWdpbnMuY29udGFpbnMoZWxlbWVudCkpIHsKLS8vCQkJCQlwbHVnaW5zLmFkZChlbGVtZW50KTsKLS8vCQkJCX0KLS8vCQkJfSBlbHNlIGlmICgoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpCi0vLwkJCQkJJiYgIUNvbmZpZ3VyYXRpb25IZWxwZXIKLS8vCQkJCQkJCS5pc0dsb2JhbFBhY2thZ2UoKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQpKSB7Ci0vLwkJCQlpZiAoIXBhY2thZ2VzLmNvbnRhaW5zKGVsZW1lbnQpKSB7Ci0vLwkJCQkJcGFja2FnZXMuYWRkKGVsZW1lbnQpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotLy8JfQotCi0JLyoqCi0JICogUGFja2FnZXMgdGhlIGxpYnJhcnkgYmFzZWQgb24gdGhlIHNlbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBjdXJyZW50IGxpYnJhcnkuIEJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBhCi0JICogY29weSBvZiB0aGUgY3VycmVudCBsaWJyYXJ5IHNob3VsZCBiZSBjcmVhdGVkIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKLQkgKiAxLiBDcmVhdGUgYSBuZXcgPGNvZGU+Q29uZmlndXJhdGlvbk1hbmFnZXI8L2NvZGU+IHdpdGggYSBjb3B5IG9mIHRoZQotCSAqIG9yaWdpbmFsIGxpYnJhcnksIDIuIFJlYnVpbGQgdGhlIGRlcGVuZGVuY3ksIDMuIENyZWF0ZSBhCi0JICogPGNvZGU+Q29uZmlndXJhdGlvbkNsb3N1cmU8L2NvZGU+IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+TWV0aG9kTGlicmFyeTwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgcGFja2FnZUxpYnJhcnkoYm9vbGVhbiByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKSB7Ci0JCXByb2Nlc3NTZWxlY3Rpb24obGlicmFyeSwgcmVtb3ZlQnJva2VuUmVmZXJlbmNlcyk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBjb25maWd1cmF0aW9ucyBleGNlcHQgZm9yIHRoZSBjdXJyZW50IG9uZS4KLQkJTGlzdCBjb25maWdzID0gbGlicmFyeS5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJY29uZmlncy5jbGVhcigpOwotCQljb25maWdzLmFkZChjb25maWcpOwotCi0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIHByb2Nlc3MgdGhlIHNlbGVjdGVkIHBhY2thZ2UgYnkgcmVtb3ZlaW5nIGFsbCB1bnNlbGVjdGVkIGVsZW1lbnRzIGFuZCBhbnkKLQkgKiBtaXNzaW5nIHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzU2VsZWN0aW9uKEVPYmplY3QgZWxlbWVudCwKLQkJCWJvb2xlYW4gcmVtb3ZlQnJva2VuUmVmZXJlbmNlcykgewotCQlpZiAocmVtb3ZlQnJva2VuUmVmZXJlbmNlcykgewotCQkJLy8gSXRlcmF0b3IgdGhlIHJlZmVyZW5jZXMgYW5kIHJlbW92ZSBicm9rZW4gcmVmZXJlbmNlcy4KLQkJCUVMaXN0IHJlZmVyZW5jZXMgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKTsKLQkJCWlmIChyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbmV3IEFycmF5TGlzdChyZWZlcmVuY2VzKS5pdGVyYXRvcigpOyBpdAotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgaXQubmV4dCgpOwotCQkJCQlFT2JqZWN0IHBrZ1JlZiA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUocmVmKTsKLQkJCQkJaWYgKHBrZ1JlZiAhPSBudWxsICYmICFpc1NlbGVjdGVkKHBrZ1JlZikpIHsKLQkJCQkJCXJlbW92ZVJlZmVyZW5jZShlbGVtZW50LCByZWYpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQotCQkJCS8vIElmIHRoZSBjaGlsZCBlbGVtZW50IGlzIHNlbGVjdGFibGUgYnV0IGl0IGlzIG5vdCBpbiB0aGUKLQkJCQkvLyBjb25maWd1cmF0aW9uLCByZW1vdmUgaXQuCi0JCQkJaWYgKExpYnJhcnlVdGlsLnNlbGVjdGFibGUoY2hpbGQpICYmICFpc1NlbGVjdGVkKGNoaWxkKSkgewotCQkJCQlFY29yZVV0aWwucmVtb3ZlKGNoaWxkKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9jZXNzU2VsZWN0aW9uKGNoaWxkLCByZW1vdmVCcm9rZW5SZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKEVPYmplY3Qgb3duZXJFbGVtZW50LCBFT2JqZWN0IHJlZkVsZW1lbnQpIHsKLQkJQWRhcHRlckZhY3RvcnlDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBjb25maWdNYW5hZ2VyCi0JCQkJLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlJUHJvcGVydHlTb3VyY2UgcHMgPSBwcm92aWRlci5nZXRQcm9wZXJ0eVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gcGRzID0gcHMuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQlpZiAocGRzICE9IG51bGwgJiYgcGRzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKElQcm9wZXJ0eURlc2NyaXB0b3IpIHBkc1tpXTsKLQkJCQlPYmplY3QgaWQgPSBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCQkJT2JqZWN0IHZhbHVlID0gcHMuZ2V0UHJvcGVydHlWYWx1ZShpZCk7Ci0KLQkJCQkvLyBDaGVjayB3aGV0aGVyIHRoZSB2YWx1ZSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYW4gZWRpdGFibGUKLQkJCQkvLyB2YWx1ZS4KLQkJCQlJUHJvcGVydHlTb3VyY2Ugc291cmNlID0gcHJvdmlkZXIuZ2V0UHJvcGVydHlTb3VyY2UodmFsdWUpOwotCQkJCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHNvdXJjZS5nZXRFZGl0YWJsZVZhbHVlKCk7Ci0JCQkJfQotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEVMaXN0KSB7Ci0JCQkJCUVMaXN0IHJlZkxpc3QgPSAoRUxpc3QpIHZhbHVlOwotCQkJCQlpZiAocmVmTGlzdC5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJLnByaW50bG4oIlJlZmVyZW5jZSBbIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkrICJdIHJlbW92ZWQgZnJvbSBbIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCSsgTGlicmFyeVV0aWwuZ2V0TmFtZShvd25lckVsZW1lbnQpCi0JCQkJCQkJCQkJCSsgIl0ncyByZWZlcmVuY2UgbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlyZWZMaXN0LnJlbW92ZShyZWZFbGVtZW50KTsKLQkJCQkJCXBzLnNldFByb3BlcnR5VmFsdWUoaWQsIHJlZkxpc3QpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCJSZWZlcmVuY2UgWyIgKyBMaWJyYXJ5VXRpbC5nZXROYW1lKHJlZkVsZW1lbnQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkrICJdIHJlbW92ZWQgZnJvbSBbIiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXROYW1lKG93bmVyRWxlbWVudCkKLQkJCQkJCQkJCQkrICJdIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwcy5zZXRQcm9wZXJ0eVZhbHVlKGlkLCBudWxsKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBjbG9zdXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCQljbGVhckVycm9yTWFya3MoKTsKLQkJCi0JCWlmIChjb25maWdNYW5hZ2VyICE9IG51bGwpIHsKLQkJCUNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzIHByb3BzID0gY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uUHJvcGVydGllcygpOwkJCQotCQkJcHJvcHMucmVtb3ZlTGlzdGVuZXJzKGNvbmZpZ1Byb3BMaXN0ZW5lcik7Ci0JCX0KLQkJCQkKLQkJY29uZmlnTWFuYWdlciA9IG51bGw7Ci0JCWNvbmZpZyA9IG51bGw7Ci0JCWxpYnJhcnkgPSBudWxsOwotCQlkZXBlbmRlbmN5TWFuYWdlciA9IG51bGw7Ci0JCWFjdGlvbk1nciA9IG51bGw7Ci0JCS8vc2VsZWN0ZWROb3Rlcy5jbGVhcigpOwotCQkvL2NoYW5nZWROb2Rlcy5jbGVhcigpOwotCQlpZiAoaW52YWxpZE5vZGVzTWFwICE9IG51bGwpIHsKLQkJCWludmFsaWROb2Rlc01hcC5jbGVhcigpOwotCQl9Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbGlzdGVuZXJzLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiBjYW5JZ25vcmUoUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYpIHsKLS8vCQlyZXR1cm4gcGtnUmVmLmNhbklnbm9yZSgpOwotLy8JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDxDbG9zdXJlTGlzdGVuZXI+KCk7Ci0JCX0KLQkJaWYgKCFsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCQkKLQkJbm90aWZ5TGlzdGVuZXIobGlzdGVuZXIsIHRoaXMuZXJyb3JzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKGxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQkKLS8vCXByaXZhdGUgdm9pZCBub3RpZnlFcnJvckFkZGVkKFBhY2thZ2VFcnJvciBwa2dlcnJvcikgewotLy8JCQkvL25vdGlmeUxpc3RlbmVycyhDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQsIHBrZ2Vycm9yKTsKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSB2b2lkIG5vdGlmeUVycm9yUmVtb3ZlZChQYWNrYWdlRXJyb3IgcGtnZXJyb3IpIHsKLS8vCQkvL25vdGlmeUxpc3RlbmVycyhDbG9zdXJlTGlzdGVuZXIuRVJST1JfUkVNT1ZFRCwgcGtnZXJyb3IpOwkKLS8vCX0KLQkKLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXIoQ2xvc3VyZUxpc3RlbmVyIGxpc3RlbmVyLCBMaXN0IGVycm9ycykgewotCQkJCQkJCQkJCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZXJyb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlFbGVtZW50RXJyb3IgZXJyb3IgPSAoRWxlbWVudEVycm9yKWl0Lm5leHQoKTsKLQkJCWxpc3RlbmVyLmZpcmVFdmVudChDbG9zdXJlTGlzdGVuZXIuRVJST1JfQURERUQsIGNvbmZpZywgZXJyb3IpOwotCQl9Ci0JfQotCQotLy8JLyoqCi0vLwkgKiBhZGQgdGhpcyBlbGVtZW50IGludG8gdGhlIGNvbmZpZ3VyYXRpb24KLS8vCSAqIHRoaXMgaXMgZm9yIHF1aWNrIGZpeCBhY3Rpb24KLS8vCSAqIG91ciBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIHRvIHNlbGVjdCB0aGUgb3duaW5nIHBhY2thZ2UKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcmV0dXJuIElTdGF0dXMKLS8vCSAqLwotLy8JcHVibGljIElTdGF0dXMgc2VsZWN0RWxlbWVudChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQkKLS8vCQkvL2lmIHRoZSBlbGVtZW50IGlzIHN1YnRyYWN0ZWQsIHdlIGNhbid0IHNlbGVjdCB0aGUgZWxlbWVudAotLy8JCS8vIHJldHVybiBhbiBlcnJvcgotLy8JCWlmICggY29uZmlnTWFuYWdlci5nZXRDb25maWd1cmF0aW9uRGF0YSgpLmlzRWxlbWVudEluU3VidHJhY3RlZENhdGVnb3J5KGVsZW1lbnQpKSB7Ci0vLwkJCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuUXVpY2tmaXhFcnJvcl9yZWFzb24xLCAKLS8vCQkJCQkobmV3IFN0cmluZ1tdIHtMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KX0pKTsKLS8vCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLS8vCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gZm9yIHF1aWNrIGZpeCwgd2UganVzdCBzZWxlY3QgdGhlIHBhY2thZ2Ugb2YgdGhlIGVsZW1lbnQgCi0vLwkJLy8gYW5kIHRoZSBjaGlsZCBwYWNrYWdlcwotLy8JCU9iamVjdCBvd25lciA9IExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0vLwkJaWYgKCBvd25lciAhPSBudWxsICYmIG93bmVyIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotLy8JCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChvd25lcik7Ci0vLwkJfQkKLS8vCQkKLS8vCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ29uZmlndXJhdGlvbkVycm9yTWF0cml4LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0NvbmZpZ3VyYXRpb25FcnJvck1hdHJpeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWQzYzZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvQ29uZmlndXJhdGlvbkVycm9yTWF0cml4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb24gZXJyb3IgbGV2ZWwgbWV0cml4Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uRXJyb3JNYXRyaXggewotCQotLy8JcHJpdmF0ZSBzdGF0aWMgTGlzdCBsZXZlbDFGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCXByaXZhdGUgc3RhdGljIExpc3QgbGV2ZWwyRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IGxldmVsM0ZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8Jc3RhdGljIHsKLS8vCQlsZXZlbDJGZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpKTsKLS8vCX0KLQkKLS8vCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotLy8JcHVibGljIENvbmZpZ3VyYXRpb25FcnJvck1hdHJpeChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotLy8JCXRoaXMuY29uZmlnID0gY29uZmlnOwotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgRWxlbWVudEVycm9yIGdldEVycm9yKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQkKLQkJaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKSApIHsKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUVycm9yKGNvbmZpZywgcmVmKTsKLQkJfSAKLQkJCi0JCWludCBlcnJvckxldmVsID0gRXJyb3JJbmZvLklORk87Ci0JCVN0cmluZyBtZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ7Ci0JCQotCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0RWxlbWVudCgpOwotCQlNZXRob2RFbGVtZW50IGVfcmVmID0gKE1ldGhvZEVsZW1lbnQpcmVmLmdldFJlZkVsZW1lbnQoKTsKLQotCQlpZiAoIHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSkgKSB7Ci0JCQllcnJvckxldmVsID0gRXJyb3JJbmZvLkVSUk9SOwotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19tYW5kYXRvcnlfaW5wdXQ7Ci0JCX0gZWxzZSBpZiAoIHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCkpICkgewotCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5FUlJPUjsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3Npbmdfb3V0cHV0OwotCQl9IGVsc2UgaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCkpICkgewotCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5XQVJOSU5HOwotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfbWlzc2luZ19wcmltYXJ5X3BlcmZvcm1lcjsKLQkJfSBlbHNlIGlmICggcmVmLmhhc0ZlYXR1cmUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSApIHsKLQkJCWVycm9yTGV2ZWwgPSBFcnJvckluZm8uV0FSTklORzsKLQkJCW1lc3NhZ2VJZCA9IExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfcmVzcG9uc2libGVfZm9yX3dvcmtQcm9kdWN0OwotCQl9IGVsc2UgaWYgKCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkpIAotCQkJCXx8IHJlZi5oYXNGZWF0dXJlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpKSAKLQkJCQl8fCByZWYuaGFzRmVhdHVyZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCkpCi0JCQkJICkgewotCQkJLy8gZGVmYXVsdAotCQl9IGVsc2UgaWYgKCBpc0JyZWFrZG93blJlZmVyZW5jZShlLCBlX3JlZikgKSB7Ci0JCQllcnJvckxldmVsID0gRXJyb3JJbmZvLklORk87Ci0JCX0gZWxzZSBpZiggaXNHdWlkYW5jZVJlZmVyZW5jZShlLCBlX3JlZikgKSB7Ci0JCQkvLyBkZWZhdWx0Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBtZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKG1lc3NhZ2VJZCwgCi0JCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZVBhdGgoZSksIAotCQkJCQkJTGlicmFyeVV0aWwuZ2V0VHlwZVBhdGgoZV9yZWYpIH0pKTsKLQotCQlyZXR1cm4gbmV3IEVsZW1lbnRFcnJvcihjb25maWcsIGVycm9yTGV2ZWwsIG1lc3NhZ2UsIGUsIGVfcmVmLCBFcnJvckluZm8uUkVGRVJFTkNFX1RPLCBtZXNzYWdlSWQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQnJlYWtkb3duUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZSwgTWV0aG9kRWxlbWVudCBlX3JlZikgewotCQlyZXR1cm4gKGVfcmVmIGluc3RhbmNlb2YgVGFzayB8fCBlX3JlZiBpbnN0YW5jZW9mIFJvbGUgfHwgZV9yZWYgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgCi0JCQkmJiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR3VpZGFuY2VSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlLCBNZXRob2RFbGVtZW50IGVfcmVmKSB7Ci0JCXJldHVybiAoZSBpbnN0YW5jZW9mIFRhc2sgfHwgZSBpbnN0YW5jZW9mIFJvbGUgfHwgZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSAKLQkJCSYmIChlX3JlZiBpbnN0YW5jZW9mIEd1aWRhbmNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRWxlbWVudEVycm9yIGdldFZhcmlhYmlsaXR5RXJyb3IoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIEVsZW1lbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCi0JCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudClyZWYuZ2V0RWxlbWVudCgpOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgZV9yZWYgPSAoVmFyaWFiaWxpdHlFbGVtZW50KXJlZi5nZXRSZWZFbGVtZW50KCk7Ci0JCQotCQlpZiAoIGUuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IGVfcmVmICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVZhcmlhYmlsaXR5VHlwZSB0eXBlID0gZS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCi0JCWludCBlcnJvckxldmVsID0gRXJyb3JJbmZvLldBUk5JTkc7Ci0JCVN0cmluZyBtZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9taXNzaW5nX2VsZW1lbnQ7Ci0KLQkJaWYgKCB0eXBlID09IFZhcmlhYmlsaXR5VHlwZS5DT05UUklCVVRFUyApIHsKLQkJCWlmICggZSBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSB8fCBlIGluc3RhbmNlb2YgR3VpZGFuY2UgKSB7Ci0JCQkJZXJyb3JMZXZlbCA9IEVycm9ySW5mby5JTkZPOwotCQkJfQotCQkJCi0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9jb250cmlidXRvcl9taXNzaW5nX2Jhc2U7Ci0JCX0gZWxzZSBpZiAoIHR5cGUgPT0gVmFyaWFiaWxpdHlUeXBlLkVYVEVORFMgKSB7Ci0JCQltZXNzYWdlSWQgPSBMaWJyYXJ5UmVzb3VyY2VzLkVsZW1lbnRFcnJvcl9leHRlbmRlcl9taXNzaW5nX2Jhc2U7Ci0JCQkKLQkJfSBlbHNlIGlmICggdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMgCi0JCQkJfHwgdHlwZSA9PSBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUykgewotCQkJbWVzc2FnZUlkID0gTGlicmFyeVJlc291cmNlcy5FbGVtZW50RXJyb3JfcmVwbGFjZXJfbWlzc2luZ19iYXNlOwotCQl9Ci0JCQotCQlTdHJpbmcgbWVzc2FnZSA9IExpYnJhcnlSZXNvdXJjZXMuYmluZChtZXNzYWdlSWQsIAotCQkJCShuZXcgU3RyaW5nW10ge0xpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGUpLCAKLQkJCQkJCUxpYnJhcnlVdGlsLmdldFR5cGVQYXRoKGVfcmVmKSB9KSk7Ci0KLQkJcmV0dXJuIG5ldyBFbGVtZW50RXJyb3IoY29uZmlnLCBlcnJvckxldmVsLCBtZXNzYWdlLCBlLCBlX3JlZiwgRXJyb3JJbmZvLlJFRkVSRU5DRV9UTywgbWVzc2FnZUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0RlcGVuZGVuY3lNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1N2NlNGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9EZXBlbmRlbmN5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZXZlbnRzLklMaWJyYXJ5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBtZXRob2QgZWxlbWVudCBkZXBlbmRlbmNpZXMgaW4gYSBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeU1hbmFnZXIgewotCi0JLy8gSWYgdHJ1ZSwgZ2VuZXJhdGUgZGVidWcgdHJhY2VzLgotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0KLQkvLyBUaGUgbWV0aG9kIGxpYnJhcnkuCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnkgbGlicmFyeTsKLQotCS8vIFRoZSBsaWJyYXJ5IG1hbmFnZXIuCi0JcHJvdGVjdGVkIElMaWJyYXJ5TWFuYWdlciBsaWJyYXJ5TWFuYWdlcjsKLQotCS8vIEEgbWFwIG9mIHBhY2thZ2UgZWxlbWVudHMgdG8gUGFja2FnZURlcGVuZGVuY3kgb2JqZWN0cy4KLQlwcm90ZWN0ZWQgTWFwIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLy8gQSBsaWJyYXJ5IGNoYW5nZSBsaXN0ZW5lci4KLQlwcml2YXRlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgbGliTGlzdGVuZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeU1hbmFnZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCXRoaXMubGlicmFyeSA9IGxpYnJhcnk7Ci0JCXRoaXMubGlicmFyeU1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldExpYnJhcnlNYW5hZ2VyKAotCQkJCWxpYnJhcnkpOwotCQlpbml0KCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQkKLQkJbGliTGlzdGVuZXIgPSBuZXcgSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0vLwkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0xPQURFRAotLy8JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fQ1JFQVRFRCkgewotLy8JCQkJCS8vIFRPRE86IElzIHRoaXMgbmVjZXNzYXJ5PwotLy8JCQkJCS8vIHJlZnJlc2goKTsKLS8vCQkJCX0gZWxzZSAKLQkJCQlpZiAob3B0aW9uID09IElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIuT1BUSU9OX0RFTEVURUQpIHsKLQkJCQkJaGFuZGxlRGVsZXRlZEVsZW1lbnQoY2hhbmdlZEl0ZW1zKTsKLQkJCQl9IGVsc2UgaWYgKG9wdGlvbiA9PSBJTGlicmFyeUNoYW5nZUxpc3RlbmVyLk9QVElPTl9DSEFOR0VECi0JCQkJCQl8fCBvcHRpb24gPT0gSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5PUFRJT05fTkVXQ0hJTEQpIHsKLQkJCQkJaWYgKGNoYW5nZWRJdGVtcyAhPSBudWxsICYmIGNoYW5nZWRJdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hhbmdlZEl0ZW1zLml0ZXJhdG9yKCk7IGl0Ci0JCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJCQkJYnVpbGREZXBlbmRlbmN5Rm9yKChNZXRob2RFbGVtZW50KSBlKTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlCi0JCQkJCQkJCQkJCQkrICIgaXMgbm90IGEgbWV0aG9kIGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCi0JCWxpYnJhcnlNYW5hZ2VyLmFkZExpc3RlbmVyKGxpYkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIGRlcGVuZGVuY3kgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgbWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiBBIDxjb2RlPlBhY2thZ2VEZXBlbmRlbmN5PC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGFja2FnZURlcGVuZGVuY3kgZ2V0RGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKCFMaWJyYXJ5VXRpbC5zZWxlY3RhYmxlKGVsZW1lbnQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIEFsd2F5cyByZWJ1aWxkIHRoZSBkZXBlbmRlbmN5IGZvciB0aGUgZWxlbWVudCBzaW5jZSB0aGUKLQkJLy8gZGVwZW5kZW50cyBtYXkgbm90IGJlIGZ1bGx5IGVzdGFibGlzaGVkLgotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gZ2V0RGVwZW5kZW5jeShlbGVtZW50LCBmYWxzZSk7Ci0JCWlmIChkZXBlbmRlbmN5ID09IG51bGwgfHwgIWRlcGVuZGVuY3kuaXNMb2FkZWQoKSkgewotCQkJYnVpbGREZXBlbmRlbmN5KGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGdldERlcGVuZGVuY3koZWxlbWVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFByaW50cyB0aGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludERlcGVuZGVuY3koKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkZXBlbmRlbmN5TWFwLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCSgoUGFja2FnZURlcGVuZGVuY3kpIGl0Lm5leHQoKSkucHJpbnQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyB0aGUgZGVwZW5kZW5jeSBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgQSBtZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGREZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGJ1aWxkRGVwZW5kZW5jeUZvcihlbGVtZW50KTsKLQotCQkJRUxpc3QgZWxlbWVudHMgPSBlbGVtZW50LmVDb250ZW50cygpOwotCQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCQlpZiAoISAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJCWlmIChtZXRob2RFbGVtZW50ICE9IG51bGwKLQkJCQkJCQkmJiAhTGlicmFyeVV0aWwuc2VsZWN0YWJsZShtZXRob2RFbGVtZW50KSkgewotCQkJCQkJYnVpbGREZXBlbmRlbmN5Rm9yKG1ldGhvZEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlkZXBlbmRlbmN5LnNldExvYWRlZCh0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZHMgdGhlIGRlcGVuZGVuY3kgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogPHA+Ci0JICogVGhpcyBjcmVhdGVzIGFuIDxjb2RlPkVsZW1lbnRSZWZlcmVuY2U8L2NvZGU+IGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIHRoYXQgcG9pbnRzIHRvIGFsbCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cywgYW5kIGFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgYXMKLQkgKiBhIGRlcGVuZGVudCBlbGVtZW50IHRvIGFsbCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cy4gVGhpcyBzaG91bGQgb25seSBiZQotCSAqIGNhbGxlZCBvbmNlIGZvciBlYWNoIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqIEByZXR1cm4gQSA8Y29kZT5QYWNrYWdlRGVwZW5kZW5jeTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBQYWNrYWdlRGVwZW5kZW5jeSBidWlsZERlcGVuZGVuY3lGb3IoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQnVpbGQgdGhlIGRlcGVuZGVuY3kgb24gdGhlIHNlbGVjdGFibGUgZWxlbWVudC9wYXJlbnQgb25seQotCQlNZXRob2RFbGVtZW50IHNlbGVjdGFibGVFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShlbGVtZW50KTsKLQkJaWYgKHNlbGVjdGFibGVFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUGFja2FnZURlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IGdldERlcGVuZGVuY3koc2VsZWN0YWJsZUVsZW1lbnQsIHRydWUpOwotCi0JCS8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgZWxlbWVudCByZWZlcmVuY2UgZm9yIHRoaXMgZWxlbWVudC4KLQkJZGVwZW5kZW5jeS5yZW1vdmVSZWZlcmVuY2UoZWxlbWVudCk7Ci0vKgotCQkvLyBHZXQgdGhlIFZhcmlhYmlsaXR5RWxlbWVudC4KLQkJQ29udGVudEVsZW1lbnQgYmFzZUVsZW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQliYXNlRWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgKChDb250ZW50RWxlbWVudCkgZWxlbWVudCkKLQkJCQkJLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCWlmIChiYXNlRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gRXN0YWJsaXNoIHRoZSBwYWNrYWdlIHJlZmVyZW5jZS4KLQkJCQlFT2JqZWN0IHNlbGVjdGFibGVCYXNlID0gTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShiYXNlRWxlbWVudCk7Ci0JCQkJaWYgKHNlbGVjdGFibGVCYXNlICE9IG51bGwpIHsKLQkJCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZSgKLQkJCQkJCQlzZWxlY3RhYmxlQmFzZSwgdHJ1ZSk7Ci0KLQkJCQkJaWYgKCFwa2dSZWYuaGFzUmVmZXJlbmNlKGVsZW1lbnQsIGJhc2VFbGVtZW50KSkgewotCQkJCQkJLy8gQWRkIHRoZSBkZXRhaWwgZWxlbWVudCByZWZlcmVuY2UgdG8gdGhlIHBhY2thZ2UKLQkJCQkJCS8vIHJlZmVyZW5jZS4KLQkJCQkJCVZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZSByZWYgPSBuZXcgVmFyaWFiaWxpdHlFbGVtZW50UmVmZXJlbmNlKAotCQkJCQkJCQllbGVtZW50LCBiYXNlRWxlbWVudCk7Ci0JCQkJCQlwa2dSZWYuYWRkUmVmZXJlbmNlKHJlZik7Ci0JCQkJCX0KLQotCQkJCQkvLyBTZXQgdGhlIGRlcGVuZGVudCBvZiB0aGUgcmVmZXJlbmNlZCBwYWNrYWdlLgotCQkJCQlnZXREZXBlbmRlbmN5KHNlbGVjdGFibGVCYXNlLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUxpc3QgcmVmZXJlbmNlcyA9IGVsZW1lbnQuZUNyb3NzUmVmZXJlbmNlcygpOwotCi0JCS8vIFVwZGF0ZSB0aGUgZGVwZW5kZW50cyBvZiB0aG9zZSBlbGVtZW50cyBpbiB0aGUgbGlzdC4KLQkJaWYgKHJlZmVyZW5jZXMgIT0gbnVsbCAmJiByZWZlcmVuY2VzLnNpemUoKSA+IDApIHsKLQkJCS8vIEdldCB0aGUgc2VsZWN0YWJsZSByZWZlcmVuY2VzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWZFbGVtZW50ID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCQlFT2JqZWN0IHNlbGVjdGFibGVSZWYgPSBMaWJyYXJ5VXRpbC5nZXRTZWxlY3RhYmxlKHJlZkVsZW1lbnQpOwotCQkJCWlmIChzZWxlY3RhYmxlUmVmICE9IG51bGwpIHsKLQkJCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSBkZXBlbmRlbmN5LmdldFJlZmVyZW5jZSgKLQkJCQkJCQlzZWxlY3RhYmxlUmVmLCB0cnVlKTsKLQotCQkJCQlpZiAoZWxlbWVudCA9PSBzZWxlY3RhYmxlRWxlbWVudAotCQkJCQkJCSYmIHJlZkVsZW1lbnQgPT0gc2VsZWN0YWJsZVJlZikgewotCQkJCQkJLy8gTm8gbmVlZCB0byBhZGQgdGhpcy4KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFwa2dSZWYuaGFzUmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpKSB7Ci0JCQkJCQlHZW5lcmFsUmVmZXJlbmNlIHJlZiA9IG5ldyBHZW5lcmFsUmVmZXJlbmNlKGVsZW1lbnQsCi0JCQkJCQkJCXJlZkVsZW1lbnQpOwotCQkJCQkJcGtnUmVmLmFkZFJlZmVyZW5jZShyZWYpOwotCQkJCQl9Ci0KLQkJCQkJZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlUmVmLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotKi8KLQkJTGlzdCBwcm9wZXJ0aWVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnRpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQlpZiAoIShmIGluc3RhbmNlb2YgRVJlZmVyZW5jZSkgKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUVSZWZlcmVuY2UgZmVhdHVyZSA9IChFUmVmZXJlbmNlKWY7Ci0JCQlpZiAoIGZlYXR1cmUuaXNDb250YWluZXIoKSB8fCBmZWF0dXJlLmlzQ29udGFpbm1lbnQoKSApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQkJCQotCQkJT2JqZWN0IHZhbHVlID0gZWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQkJaWYgKCB2YWx1ZSA9PSBudWxsICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBudWxsOwotCQkJTGlzdCB2YWx1ZXMgPSBudWxsOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCQotCQkJaWYgKCBmZWF0dXJlLmlzTWFueSgpICkgewotCQkJCXZhbHVlcyA9IChMaXN0KXZhbHVlOwotCQkJCWlmICggdmFsdWVzLnNpemUoKSA+IDAgKSB7Ci0JCQkJCXJlZkVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl2YWx1ZXMuZ2V0KGNvdW50KTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0JCQkJcmVmRWxlbWVudCA9IChNZXRob2RFbGVtZW50KXZhbHVlOwkJCQkKLQkJCX0KLQkJCSAKLQkJCXdoaWxlICggcmVmRWxlbWVudCAhPSBudWxsICkgewotCQkJCQotCQkJCWJvb2xlYW4gc2tpcCA9IGZhbHNlOwotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfTW9kaWZpZXMoKSkgewotCQkJCQlza2lwID0gdHJ1ZTsKLQkJCQl9CQkJCQotCQkJCQotCQkJCU1ldGhvZEVsZW1lbnQgc2VsZWN0YWJsZVJlZiA9IHNraXAgPyBudWxsIDogKE1ldGhvZEVsZW1lbnQpTGlicmFyeVV0aWwuZ2V0U2VsZWN0YWJsZShyZWZFbGVtZW50KTsKLQkJCQlpZiAoc2VsZWN0YWJsZVJlZiAhPSBudWxsKSB7Ci0JCQkJCVBhY2thZ2VSZWZlcmVuY2UgcGtnUmVmID0gZGVwZW5kZW5jeS5nZXRSZWZlcmVuY2UoCi0JCQkJCQkJc2VsZWN0YWJsZVJlZiwgdHJ1ZSk7Ci0JCi0JCQkJCWlmIChlbGVtZW50ID09IHNlbGVjdGFibGVFbGVtZW50Ci0JCQkJCQkJJiYgcmVmRWxlbWVudCA9PSBzZWxlY3RhYmxlUmVmKSB7Ci0JCQkJCQkvLyBObyBuZWVkIHRvIGFkZCB0aGlzLgotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkKLQkJCQkJRWxlbWVudFJlZmVyZW5jZSByZWYgPSBwa2dSZWYuZ2V0UmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpOwotCQkJCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQkJCXJlZiA9IG5ldyBFbGVtZW50UmVmZXJlbmNlKGVsZW1lbnQsIHJlZkVsZW1lbnQpOwotCQkJCQkJcGtnUmVmLmFkZFJlZmVyZW5jZShyZWYpOwotCQkJCQl9Ci0JCi0JCQkJCXJlZi5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCQkKLQkJCQkJZ2V0RGVwZW5kZW5jeShzZWxlY3RhYmxlUmVmLCB0cnVlKS5hZGREZXBlbmRlbnQoCi0JCQkJCQkJc2VsZWN0YWJsZUVsZW1lbnQpOwotCQkJCX0KLQkJCQkKLQkJCQlyZWZFbGVtZW50ID0gbnVsbDsKLQkJCQlpZiAoIHZhbHVlcyAhPSBudWxsICkgewotCQkJCQljb3VudCsrOwotCQkJCQlpZiAoIGNvdW50IDwgdmFsdWVzLnNpemUoKSApIHsKLQkJCQkJCXJlZkVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCl2YWx1ZXMuZ2V0KGNvdW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJCi0JCXJldHVybiBkZXBlbmRlbmN5OwotCX0KLQotCXByaXZhdGUgUGFja2FnZURlcGVuZGVuY3kgZ2V0RGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmICghTGlicmFyeVV0aWwuc2VsZWN0YWJsZShlbGVtZW50KSkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIkVycm9yLCBTZWxlY3RhYmxlIGVsZW1lbnQgcmVxdWlyZWQ6ICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlQYWNrYWdlRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKFBhY2thZ2VEZXBlbmRlbmN5KSBkZXBlbmRlbmN5TWFwCi0JCQkJLmdldChlbGVtZW50KTsKLQkJaWYgKGRlcGVuZGVuY3kgPT0gbnVsbCAmJiBjcmVhdGUpIHsKLQkJCWRlcGVuZGVuY3kgPSBuZXcgUGFja2FnZURlcGVuZGVuY3koZWxlbWVudCk7Ci0JCQlkZXBlbmRlbmN5TWFwLnB1dChlbGVtZW50LCBkZXBlbmRlbmN5KTsKLQkJfQotCi0JCXJldHVybiBkZXBlbmRlbmN5OwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZWRFbGVtZW50KENvbGxlY3Rpb24gY2hhbmdlZEl0ZW1zKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjaGFuZ2VkSXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZW1vdmVSZWZlcmVuY2UoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZWxlbWVudCByZWZlcmVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudCwgcmVidWlsZCBsYXRlcgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBBIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcGVuZGVuY3kgPSBudWxsOwotCi0JCU1ldGhvZEVsZW1lbnQgcGtnID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLmdldFNlbGVjdGFibGUoZWxlbWVudCk7Ci0JCWlmICgocGtnID09IG51bGwpIHx8ICgoZGVwZW5kZW5jeSA9IGdldERlcGVuZGVuY3kocGtnLCBmYWxzZSkpID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlkZXBlbmRlbmN5LnJlbW92ZVJlZmVyZW5jZShlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0MmFmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnREZXBlbmRlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogSG9sZHMgdGhlIGEgbGlzdCBvZiBwYWNrYWdlIHJlZmVyZW5jZXMgb2Ygb25lIHBhY2thZ2UgZWxlbWVudCBpdCBhbHNvIGhvbGRzIGEKLSAqIGxpc3Qgb2YgZGVwZW5kYW50IHBhY2thZ2UgZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZXBlbmRlbmN5IHsKLQotCS8vIHRoZSBwYWNrYWdlIGVsZW1lbnQKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogbGlzdCBvZiBFbGVtZW50UmVmZXJlbmNlIG9iamVjdHMsIGVhY2ggRWxlbWVudFJlZmVyZW5jZSBvYmplY3QgaG9sZHMgYQotCSAqIGxpc3Qgb2YgcmVmZXJlbmNlcyBvZiB0aGUgc2FtZSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIExpc3QgcmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIGRlcGVuZGVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBkZXBlbmRlbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIEVsZW1lbnREZXBlbmRlbmN5KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBlbGVtZW50cyB0aGlzIGVsZW1lbnQgZGVwZW5kcyBvbgotCSAqIAotCSAqIEByZXR1cm4gTGlzdCBhIGxpc3Qgb2YgRWxlbWVudFJlZmVyZW5jZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBFbGVtZW50UmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIHJlZkVsZW1lbnQgdGhhdCB0aGUgY3VycmVudAotCSAqIGVsZW1lbnQgcmVjZXJlbmNlcyB0by4KLQkgKiAKLQkgKiBAcGFyYW0gUmVmRWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIGN1cnJlbnQgZWxlbWVudCByZWZlcmVuY2VzCi0JICogQHJldHVybiBFbGVtZW50UmVmZXJlbmNlCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlFbGVtZW50UmVmZXJlbmNlIHJlZjsKLQkJT2JqZWN0IHJlZkVsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlyZWYgPSAoRWxlbWVudFJlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJcmVmRWwgPSByZWYuZ2V0UmVmRWxlbWVudCgpOwotCQkJaWYgKHJlZkVsICE9IG51bGwgJiYgcmVmRWwgPT0gcmVmRWxlbWVudCkgewotCQkJCXJldHVybiByZWY7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBkZXBlbmQgb24gdGhpcyBlbGVtZW50Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0RGVwZW5kZW50cygpIHsKLQkJcmV0dXJuIGRlcGVuZGVudHM7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgZGVwZW5kZW50Ci0JICogQHBhcmFtIGVsIE9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERlcGVuZGVudChNZXRob2RFbGVtZW50IGVsKSB7Ci0JCWlmICghZGVwZW5kZW50cy5jb250YWlucyhlbCkpIHsKLQkJCWRlcGVuZGVudHMuYWRkKGVsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZCBhIHJlZmVyZW5jZQotCSAqIEBwYXJhbSByZWYgRWxlbWVudFJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlyZWZlcmVuY2VzLmFkZChyZWYpOwotCX0KLQotCS8qKgotCSAqIHByaW50IG91dCB0aGUgcmVmZXJlbmNlcy4gVGhpcyBpcyBhIGRlYnVnZ2luZyBtZXRob2QuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZmVyZW5jZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IHJlZiA9IGl0Lm5leHQoKTsKLQkJCWlmIChyZWYgaW5zdGFuY2VvZiBQYWNrYWdlUmVmZXJlbmNlKSB7Ci0JCQkJKChQYWNrYWdlUmVmZXJlbmNlKSByZWYpLnByaW50KCk7Ci0JCQl9IGVsc2UgewotCQkJCSgoRWxlbWVudFJlZmVyZW5jZSkgcmVmKS5wcmludCgpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnREZXBlbmRlbmN5RXJyb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU0ZmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudERlcGVuZGVuY3lFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgZWxlbWVudCBkZXBlbmRlbmN5IGVycm9yIGluIGEgY29uZmlndXJhdGlvbiBjbG9zdXJlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudERlcGVuZGVuY3lFcnJvciB7Ci0KLQkvLyB0aGUgZXJyb3IgZWxlbWVudCwgY291bGQgYmUgYSBNZXRob2RQYWNrYWdlIG9yIGEgVUkgcGFja2FnZQotCXByaXZhdGUgT2JqZWN0IGVycm9yRWxlbWVudDsKLQotCS8qKgotCSAqIG1hcCBvZiBjYXVzZWVsZW1lbnQgdG8gdGhlIEVycm9ySW5mbyBvYmplY3QKLQkgKi8KLQlwcml2YXRlIE1hcDxPYmplY3QsIFBhY2thZ2VFcnJvcj4gZXJyb3JJbmZvTWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBQYWNrYWdlRXJyb3I+KCk7Ci0KLQlwcml2YXRlIGludCBlcnJvckJpdHMgPSAwOwotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBFbGVtZW50RGVwZW5kZW5jeUVycm9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRoaXMuZXJyb3JFbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgZXJyb3IKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RXJyb3JFbGVtZW50KCkgewotCQlyZXR1cm4gZXJyb3JFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudHMgdGhhdCBjYXVzZWQgdGhlIGVycm9yCi0JICogQHJldHVybiBPYmplY3RbXQotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDYXVzZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gZXJyb3JJbmZvTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNvdW50IG9mIHRoZSBlcnJvciBpbmZvIGVudHJ5Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiBlcnJvckluZm9NYXAuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhbiBlcnJvciBlbnRyeQotCSAqIEBwYXJhbSBlcnJvckluZm8gUGFja2FnZUVycm9yCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXJyb3IoUGFja2FnZUVycm9yIGVycm9ySW5mbykgewotCQllcnJvckluZm9NYXAucHV0KGVycm9ySW5mby5nZXRDYXVzZUVsZW1lbnQoKSwgZXJyb3JJbmZvKTsKLQkJZXJyb3JCaXRzIHw9IGVycm9ySW5mby5nZXRFcnJvckxldmVsKCk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIHRoZSBlcnJvciBhc3NvY2lhdGVkIHdpdGggdGhlIGNhdXNlRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBjYXVzZUVsZW1lbnQKLQkgKiAgICAgICAgICAgIE9iamVjdCB0aGUgZWxlbWVudCB0aGF0IGNhdXNlZCB0aGUgZXJyb3IKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUVycm9yIHJlbW92ZUVycm9yKE9iamVjdCBjYXVzZUVsZW1lbnQpIHsKLQkJUGFja2FnZUVycm9yIGVycm9yID0gZXJyb3JJbmZvTWFwLnJlbW92ZShjYXVzZUVsZW1lbnQpOwotCi0JCS8vIHJlY2FsY3VsYXRlIHRoZSBlcnJvciBiaXRzCi0JCWNhbGN1bGF0ZUVycm9yQml0cygpOwotCQkKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZSB0aGUgZXJyb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYXVzZUVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gY2F1c2VFbGVtZW50Ci0JICogICAgICAgICAgICBPYmplY3QgdGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhlIGVycm9yCi0JICovCi0JcHVibGljIFBhY2thZ2VFcnJvciBnZXRFcnJvcihPYmplY3QgY2F1c2VFbGVtZW50KSB7Ci0JCXJldHVybiBlcnJvckluZm9NYXAuZ2V0KGNhdXNlRWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBhbGwgRXJySW5mbyBvYmplY3RzCi0JICogCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBFcnJvckluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0PFBhY2thZ2VFcnJvcj4gZ2V0QWxsKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxQYWNrYWdlRXJyb3I+KGVycm9ySW5mb01hcC52YWx1ZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgdGhpcyBpcyBhbiBlcnJvciBvciBub3QuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBFcnJvckluZm8uRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGlzIGlzIGEgd2FybmluZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBFcnJvckluZm8uV0FSTklORykgPiAwOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoaXMgaXMgZHVlIHRvIGFuIGVycm9yIGluIGl0J3MgY2hpbGRyZW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkRXJyb3IoKSB7Ci0JCXJldHVybiAoZXJyb3JCaXRzICYgUGFja2FnZUVycm9yLkNISUxEX0VSUk9SKSA+IDA7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBpcyBkdWUgdG8gYSB3YXJuaW5nIGluIGl0J3MgY2hpbGRyZW4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckJpdHMgJiBQYWNrYWdlRXJyb3IuQ0hJTERfV0FSTklORykgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGNhbGN1bGF0ZUVycm9yQml0cygpIHsKLQkJZXJyb3JCaXRzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVycm9ySW5mb01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQllcnJvckJpdHMgfD0gKChFcnJvckluZm8pIGl0Lm5leHQoKSkuZ2V0RXJyb3JMZXZlbCgpOwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RXJyb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudEVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzcxODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FbGVtZW50RXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaWRlbnRpZmllcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IgYmV0d2VlbiB0d28gZWxlbWVudHMKLSAqIAotICogQGF1dGhvciBqeGkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50RXJyb3IgIGV4dGVuZHMgRXJyb3JJbmZvIGltcGxlbWVudHMgSUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0KLQkvLyBuZWVkIHRoZSBjb25maWcgaWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gZXJyb3IKLQlTdHJpbmcgY29uZmlnSWQ7Ci0JCi0JcHVibGljIEVsZW1lbnRFcnJvcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgIAotCQkJaW50IGVycm9yTGV2ZWwsIFN0cmluZyBtZXNzYWdlLCAKLQkJCU9iamVjdCBvd25lckVsZW1lbnQsIE9iamVjdCBjYXVzZUVsZW1lbnQsIAotCQkJaW50IHJlbGF0aW9uLCBTdHJpbmcgbWVzc2FnZUlkKSB7Ci0JCXN1cGVyKGVycm9yTGV2ZWwsIG1lc3NhZ2UsIG93bmVyRWxlbWVudCwgY2F1c2VFbGVtZW50LCByZWxhdGlvbiwgbWVzc2FnZUlkKTsKLQkJdGhpcy5jb25maWdJZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JfQotCi0JCi0JLy8gbWV0aG9kcyBmb3IgdGhlIElDb25maWd1cmF0aW9uRXJyb3IKLQkvLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldENhdXNlTWV0aG9kRWxlbWVudCgpIHsKLQkJaWYgKCB0aGlzLmNhdXNlRWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCl0aGlzLmNhdXNlRWxlbWVudDsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RXJyb3JNZXRob2RFbGVtZW50KCkgewotCQlpZiAoIHRoaXMub3duZXJFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCApIHsKLQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCl0aGlzLm93bmVyRWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlNZXRob2RFbGVtZW50IG0xID0gZ2V0RXJyb3JNZXRob2RFbGVtZW50KCk7Ci0JCU1ldGhvZEVsZW1lbnQgbTIgPSBnZXRDYXVzZU1ldGhvZEVsZW1lbnQoKTsKLQkJaWYgKCBtMSAhPSBudWxsICYmIG0yICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gY29uZmlnSWQgKyAiLCIgKyBtMS5nZXRHdWlkKCkgKyAiLCIgKyBtMi5nZXRHdWlkKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCQotCQlyZXR1cm4gSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmhhc2hDb2RlKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXN3aXRjaCAoZ2V0RXJyb3JMZXZlbCgpICkgewotCQljYXNlIEVycm9ySW5mby5FUlJPUjoKLQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOwotCQljYXNlIEVycm9ySW5mby5XQVJOSU5HOiAKLQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCX0KLQkJCi0JCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX0lORk87Ci0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0VsZW1lbnRSZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U0YjRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRWxlbWVudFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uY2xvc3VyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBhbiBFbGVtZW50IFJlZmVyZW5jZSBiZXR3ZWVuIHR3byBlbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRSZWZlcmVuY2UgewotCi0JTWV0aG9kRWxlbWVudCBlbGVtZW50LCByZWZFbGVtZW50OwotCQotCS8vIHNhdmUgdGhlIGZlYXR1cmVzIHJlbGF0aW5nIHRvIHRoaXMgcmVmZXJlbmNlCi0JTGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCi0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIHJlZmVyZW5jZSBpbnN0YW5jZQotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSByZWZlcmVuY2VkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnJlZkVsZW1lbnQgPSByZWZFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWZlcmVuY2VkIGVsZW1lbnQKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldFJlZkVsZW1lbnQoKSB7Ci0JCXJldHVybiByZWZFbGVtZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJaWYgKCAhZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkgKSB7Ci0JCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSk7Ci0JfQotCQotCS8qKgotCSAqIGRlYnVnZ2luZyBtZXRob2QgdG8gcHJpbnQgb3V0IHRoZSByZWxhdGlvbnNoaXAKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlTeXN0ZW0ub3V0Ci0JCQkJLnByaW50bG4oIiAgICAiICsgTGlicmFyeVV0aWwuZ2V0TmFtZShlbGVtZW50KSArICIgLS0+ICIgKyBMaWJyYXJ5VXRpbC5nZXROYW1lKHJlZkVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIHJlZmVyZW5jZSBjYW4gYmUgaWdub3JlZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbklnbm9yZSgpIHsKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaGFzIG5vIGNvbnRhaW5lciwgaXQncyBhIGRlbGV0ZWQgZWxlbWVudCwgaWdub3JlIGl0Ci0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIEVPYmplY3QpCi0JCQkJJiYgKChFT2JqZWN0KSBlbGVtZW50KS5lQ29udGFpbmVyKCkgPT0gbnVsbAotCQkJCXx8IChyZWZFbGVtZW50IGluc3RhbmNlb2YgRU9iamVjdCkKLQkJCQkmJiAoKEVPYmplY3QpIHJlZkVsZW1lbnQpLmVDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIERvbid0IHdhcm4gb24gb3B0aW9uYWwgaW5wdXRzIG5vdCBiZWluZyBwcmVzZW50Ci0JCS8vIHNvIGFkZGVkIHRoZSBjYW5JZ25vcmUoKSBtZXRob2QKLQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgVGFzaykgJiYgKHJlZkVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkpIHsKLQkJCS8vIGlmIGl0J3MgYSBtYW5kYXRvcnkgaW5wdXQsIGNhbiBpZ25vcmUKLQkJCWlmICgoKFRhc2spIGVsZW1lbnQpLmdldE1hbmRhdG9yeUlucHV0KCkuY29udGFpbnMocmVmRWxlbWVudCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIG5vdCBtYW5kYXRvcnksIGJ1dCBvcHRpb25hbCwgb2ssIGlnbm9yZSBpdAotCQkJaWYgKCgoVGFzaykgZWxlbWVudCkuZ2V0T3B0aW9uYWxJbnB1dCgpLmNvbnRhaW5zKHJlZkVsZW1lbnQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyByb2xlJ3MgbW9kaWZpZXMgZmVhdHVyZSBpcyBhY3R1YWxseSBhIGRlcmVpdmVkIG9wcG9zaXRlIGZlYXR1cmUsCi0JCS8vIGl0J3MgdmFsdWUgY2FuIGJlIGFuIGVsZW1lbnQgbm90IHZpc2libGUgdG8gdGhpcyBwbHVnaW4KLQkJLy8gaWdub3JlIGl0Ci0JCS8vIEludmFsaWQgY29uZmlndXJhdGlvbiBkZXBlbmRlbmN5IGVycm9yIHJlcG9ydGVkCi0JCWlmICgoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpICYmIChyZWZFbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlSb2xlIHIgPSAoUm9sZSkgZWxlbWVudDsKLQkJCWlmIChyLmdldE1vZGlmaWVzKCkuY29udGFpbnMocmVmRWxlbWVudCkKLQkJCQkJJiYgIXIuZ2V0UmVzcG9uc2libGVGb3IoKS5jb250YWlucyhyZWZFbGVtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FcnJvckluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvRXJyb3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Mjk2MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9FcnJvckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLQotLyoqCi0gKiBBbiBFcnJvckluZm8gb2JqZWN0IGhvbGRzIHRoZSBlcnJvciBtZXNzYWdlIGluZm8gY2F1c2VkIGJ5IGFuIGVsZW1lbnQuIFRoZQotICogRXJyb3JJbmZvIG9iamVjdCBpcyBvd25lZCBieSB0aGUgb3duZXIgZWxlbWVudCB3aGljaCBoYXMgdGhpcyBlcnJvcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JJbmZvIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSElMRF9FUlJPUiA9IDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSElMRF9XQVJOSU5HID0gMTY7Ci0KLQkvKioKLQkgKiB0aGlzIGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4gCi0JICogVGhlIG93bmVyIGVsZW1lbnQgcmVmZXJlbmNlcyB0byB0aGUgdGhlIGNhdXNlIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUZFUkVOQ0VfVE8gPSAxNjsKLQotCS8qKgotCSAqIHRoaXMgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG93bmVyIGVsZW1lbnQgYW5kIHRoZSBjYXVzZSBlbGVtZW50LiAKLQkgKiBUaGUgb3duZXIgZWxlbWVudCBpcyByZWZlcmVuY2VkIGJ5IHRoZSB0aGUgY2F1c2UgZWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFRkVSRU5DRURfQlkgPSAzMjsKLQotCS8vIGVycm9yIGNhdGVnb3J5Ci0JcHJvdGVjdGVkIFN0cmluZyBjYXRlZ29yeTsKLQkKLQlwcm90ZWN0ZWQgaW50IGVycm9yTGV2ZWw7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IG93bmVyRWxlbWVudDsKLQotCXByb3RlY3RlZCBPYmplY3QgY2F1c2VFbGVtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgaW50IHJlbGF0aW9uID0gMDsKLQkKLQlwcml2YXRlIFN0cmluZyBtZXNzYWdlSWQ7Ci0KLQkvL3Byb3RlY3RlZCBDb25maWd1cmF0aW9uQ2xvc3VyZSBjbG9zdXJlID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckxldmVsIGludCB0aGUgZXJyb3IgbGV2ZWwKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoaXMgZXJyb3IKLQkgKiBAcGFyYW0gY2F1c2VFbGVtZW50IE9iamVjdCwgdGhlIGVsZW1lbnQgdGhhdCBjYXVzZWQgdGhpcyBlcnJvcgotCSAqIEBwYXJhbSByZWxhdGlvbiBpbnQgdGhlIHJlbGF0aGlvc2hpcCBiZXR3ZWVuIHRoZSBvd25lciBlbGVtZW50IGFuZCB0aGUgY2F1c2UgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgRXJyb3JJbmZvKGludCBlcnJvckxldmVsLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG93bmVyRWxlbWVudCwKLQkJCU9iamVjdCBjYXVzZUVsZW1lbnQsIGludCByZWxhdGlvbiwgU3RyaW5nIG1lc3NhZ2VJZCkgewotCQkvL3RoaXMuY2xvc3VyZSA9IGNsb3N1cmU7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50OwotCQl0aGlzLmNhdXNlRWxlbWVudCA9IGNhdXNlRWxlbWVudDsKLQkJdGhpcy5lcnJvckxldmVsID0gZXJyb3JMZXZlbDsKLQkJdGhpcy5lcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotCQl0aGlzLnJlbGF0aW9uID0gcmVsYXRpb247Ci0JCXRoaXMubWVzc2FnZUlkID0gbWVzc2FnZUlkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZWxhdGlvbigpIHsKLQkJcmV0dXJuIHJlbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENhdXNlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGNhdXNlRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFcnJvckxldmVsKCkgewotCQlyZXR1cm4gZXJyb3JMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gKGVycm9yTGV2ZWwgJiBFUlJPUikgPiAwOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckxldmVsICYgV0FSTklORykgPiAwOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZXJyb3IgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZCgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VJZDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL0lDb25maWd1cmF0aW9uRXJyb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvSUNvbmZpZ3VyYXRpb25FcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTUwNjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvSUNvbmZpZ3VyYXRpb25FcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgQ29uZmlndXJhdGlvbiBlcnJvcnMKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25FcnJvciB7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmZiBlcnJvciBpcyBhIHdhcm5pbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dhcm5pbmcoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWZmIGVycm9yIGlzIGFuIGVycm9yCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcnJvcigpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIE1ldGhvZEVsZW1lbnQgY29udGFpbmluZyB0aGUgZXJyb3IsIGllLCB0aGUgZWxlbWVudCByZWZlcnJpbmcgdG8gc29tZXRoaW5nIHRoYXQgaXMgbWlzc2luZwotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVycm9yTWV0aG9kRWxlbWVudCgpOwotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIE1ldGhvZEVsZW1lbnQgY2F1c2luZyB0aGUgZXJyb3IsIGllLCB0aGUgZWxlbWVudCB0aGF0IGNhbiBiZSBzZWxlY3RlZCB0byBmaXggdGhlIGVycm9yCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0Q2F1c2VNZXRob2RFbGVtZW50KCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBJRCBmb3IgdGhpcyBlcnJvcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9uZSBvZiBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGlzIGVycm9yCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpOwotCQotCS8qKgotCSAqIGdldCB0aGUgZXJyb3IgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVycm9yIG1lc3NhZ2UgaWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZURlcGVuZGVuY3kuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZURlcGVuZGVuY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzNTc0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VEZXBlbmRlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5jbG9zdXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogSG9sZHMgdGhlIGEgbGlzdCBvZiBwYWNrYWdlIHJlZmVyZW5jZXMgb2Ygb25lIHBhY2thZ2UgZWxlbWVudCBpdCBhbHNvIGhvbGRzIGEKLSAqIGxpc3Qgb2YgZGVwZW5kYW50IHBhY2thZ2UgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlRGVwZW5kZW5jeSBleHRlbmRzIEVsZW1lbnREZXBlbmRlbmN5IHsKLQotCXByaXZhdGUgYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBhIHBhY2thZ2UgZGVwZW5kZW5jeSBmb3IgdGhlIGVsZW1lbnQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXB1YmxpYyBQYWNrYWdlRGVwZW5kZW5jeShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBsb2FkZWQgZmxhZwotCSAqIEBwYXJhbSBsb2FkZWQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYWRlZChib29sZWFuIGxvYWRlZCkgewotCQl0aGlzLmxvYWRlZCA9IGxvYWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBpcyBsb2FkZWQgb3Igbm90Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoKSB7Ci0JCXJldHVybiB0aGlzLmxvYWRlZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJlZmVyZW5jZSBmb3IgYW4gZWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE9iamVjdAotCSAqIEBwYXJhbSBjcmVhdGUgYm9vbGVhbiBpZiB0cnVlIGNyZWF0ZSBpZiBub3QgZXhpc3QuCi0JICogQHJldHVybiBQYWNrYWdlUmVmZXJlbmNlCi0JICovCi0JcHVibGljIFBhY2thZ2VSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJUGFja2FnZVJlZmVyZW5jZSByZWYgPSAoUGFja2FnZVJlZmVyZW5jZSkgc3VwZXIKLQkJCQkuZ2V0UmVmZXJlbmNlKHJlZkVsZW1lbnQpOwotCQlpZiAocmVmID09IG51bGwgJiYgY3JlYXRlKSB7Ci0JCQlyZWYgPSBuZXcgUGFja2FnZVJlZmVyZW5jZShlbGVtZW50LCByZWZFbGVtZW50KTsKLQkJCXN1cGVyLmFkZFJlZmVyZW5jZShyZWYpOwotCQl9Ci0KLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRQYWNrYWdlUmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0QWxsRWxlbWVudFJlZmVyZW5jZXMoKSB7Ci0JCUxpc3QgYWxsUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZ2V0UGFja2FnZVJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJUGFja2FnZVJlZmVyZW5jZSBwa2dSZWYgPSAoUGFja2FnZVJlZmVyZW5jZSlpdC5uZXh0KCk7Ci0JCQlhbGxSZWZzLmFkZEFsbChwa2dSZWYuZ2V0UmVmZXJlbmNlcygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIGFsbFJlZnM7Ci0JfQotCQotCS8qKgotCSAqIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB3aXRoIHRoZSBnaXZlbiBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyRWxlbWVudCBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQpIHsKLQkJUGFja2FnZVJlZmVyZW5jZSByZWY7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzdXBlci5nZXRSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJcmVmID0gKFBhY2thZ2VSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCXJlZi5yZW1vdmVSZWZlcmVuY2Uob3duZXJFbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRlYnVnIG1ldGhvZCB0byBwcmludCBvdXQgdGhlIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludCgpIHsKLQkJc3VwZXIucHJpbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZUVycm9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFiNWMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL2Nsb3N1cmUvUGFja2FnZUVycm9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGlkZW50aWZpZXMgYSBjb25maWd1cmF0aW9uIGVycm9yIGJldHdlZW4gdHdvIHBhY2thZ2VzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZUVycm9yIGV4dGVuZHMgRXJyb3JJbmZvIHsKLQotCUxpc3Q8RWxlbWVudEVycm9yPiBlbGVtZW50RXJyb3MgPSBudWxsOwotCQotCXB1YmxpYyBQYWNrYWdlRXJyb3IoaW50IGVycm9yTGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBPYmplY3Qgb3duZXJFbGVtZW50LCAKLQkJCU9iamVjdCBjYXVzZUVsZW1lbnQsIGludCByZWxhdGlvbikgewotCQlzdXBlcihlcnJvckxldmVsLCBtZXNzYWdlLCBvd25lckVsZW1lbnQsIGNhdXNlRWxlbWVudCwgcmVsYXRpb24sIG51bGwpOwotCQkKLQkJLy9jaGVja0VsZW1lbnRFcnJvcnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RXJyb3JMZXZlbChpbnQgbGV2ZWwpIHsKLQkJZXJyb3JMZXZlbCB8PSBsZXZlbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzRWxlbWVudEVycm9yKCkgewotCQlyZXR1cm4gZWxlbWVudEVycm9zICE9IG51bGwgJiYgZWxlbWVudEVycm9zLnNpemUoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFcnJvcigpIHsKLQkJcmV0dXJuIChlcnJvckxldmVsICYgQ0hJTERfRVJST1IpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NoaWxkV2FybmluZygpIHsKLQkJcmV0dXJuIChlcnJvckxldmVsICYgQ0hJTERfV0FSTklORykgPiAwOwotCX0KLQkKLS8vCS8qKgotLy8JICogZ2V0IGEgbGlzdCBlbGVtZW50IGVycm9ycyB3aXRoaW4gdGhpcyBQYWNrYWdlRXJyb3IKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHVibGljIExpc3Q8RWxlbWVudEVycm9yPiBnZXRFbGVtZW50RXJyb3JMaXN0KCkgewotLy8JCQotLy8JCXJldHVybiB0aGlzLmVsZW1lbnRFcnJvczsKLS8vCX0KLQkKLS8vCi0vLwlwcml2YXRlIHZvaWQgY2hlY2tFbGVtZW50RXJyb3JzKCkgewotLy8JCWlmICggaXNDaGlsZEVycm9yKCkgfHwgaXNDaGlsZFdhcm5pbmcoKSApIHsKLS8vCQkJcmV0dXJuOwotLy8JCX0KLS8vCQkKLS8vCQl0aGlzLmVsZW1lbnRFcnJvcyA9IG5ldyBBcnJheUxpc3Q8RWxlbWVudEVycm9yPigpOwotLy8KLS8vCQlpbnQgcmVsYXRpb24gPSB0aGlzLmdldFJlbGF0aW9uKCk7Ci0vLwkJTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdGhpcy5nZXRPd25lckVsZW1lbnQoKTsKLS8vCQlNZXRob2RFbGVtZW50IGNhdXNlRWxlbWVudCA9IChNZXRob2RFbGVtZW50KSB0aGlzLmdldENhdXNlRWxlbWVudCgpOwotLy8JCVBhY2thZ2VEZXBlbmRlbmN5IGRlcDsKLS8vCQlQYWNrYWdlUmVmZXJlbmNlIHBrZ1JlZiA9IG51bGw7Ci0vLwotLy8JCWlmIChyZWxhdGlvbiA9PSBFcnJvckluZm8uUkVGRVJFTkNFX1RPKSB7Ci0vLwkJCWRlcCA9IGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREZXBlbmRlbmN5TWFuYWdlcigpCi0vLwkJCQkJLmdldERlcGVuZGVuY3kob3duZXJFbGVtZW50KTsKLS8vCQkJcGtnUmVmID0gZGVwLmdldFJlZmVyZW5jZShjYXVzZUVsZW1lbnQsIGZhbHNlKTsKLS8vCQl9IGVsc2UgaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VEX0JZKSB7Ci0vLwkJCWRlcCA9IGNsb3N1cmUuZ2V0Q29uZmlndXJhdGlvbk1hbmFnZXIoKS5nZXREZXBlbmRlbmN5TWFuYWdlcigpCi0vLwkJCQkJLmdldERlcGVuZGVuY3koY2F1c2VFbGVtZW50KTsKLS8vCQkJcGtnUmVmID0gZGVwLmdldFJlZmVyZW5jZShvd25lckVsZW1lbnQsIGZhbHNlKTsKLS8vCQl9Ci0vLwotLy8JCWlmIChwa2dSZWYgIT0gbnVsbCkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtnUmVmLmdldFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdAotLy8JCQkJCS5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlFbGVtZW50UmVmZXJlbmNlIHJlZiA9IChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCk7Ci0vLwotLy8JCQkJLy8gRG9uJ3Qgc2hvdyB0aGUgZW50cnkgaWYgdGhlIHJlZmVyZW5jZSBjYW4gYmUgaWdub3JlZC4KLS8vCQkJCWlmIChyZWYuY2FuSWdub3JlKCkpIHsKLS8vCQkJCQljb250aW51ZTsKLS8vCQkJCX0KLS8vCQkJCUVsZW1lbnRFcnJvciBlbGVtZW50RXJyb3I7Ci0vLwkJCQlTdHJpbmcgbWVzc2FnZSA9ICIiOwotLy8JCQkJTWV0aG9kRWxlbWVudCBlMSwgZTI7Ci0vLwotLy8JCQkJaWYgKHJlbGF0aW9uID09IEVycm9ySW5mby5SRUZFUkVOQ0VfVE8pIHsKLS8vCQkJCQllMSA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRFbGVtZW50KCk7Ci0vLwkJCQkJZTIgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0UmVmRWxlbWVudCgpOwotLy8JCQkJfSBlbHNlIHsKLS8vCQkJCQllMiA9IChNZXRob2RFbGVtZW50KXJlZi5nZXRFbGVtZW50KCk7Ci0vLwkJCQkJZTEgPSAoTWV0aG9kRWxlbWVudClyZWYuZ2V0UmVmRWxlbWVudCgpOwotLy8JCQkJfQotLy8KLS8vCQkJCS8vIGlmIHRoZSBlbGVtZW50IGlzIHN1YnRyYWN0ZWQsIGRvbid0IGluY2x1ZGUgdGhlIHJlZmVyZW5jZQotLy8JCQkJaWYgKCBjbG9zdXJlLmlzRWxlbWVudFN1YnRyYWN0ZWQoZTEpICkgewotLy8JCQkJCWNvbnRpbnVlOwotLy8JCQkJfQotLy8JCQkJCi0vLwkJCQltZXNzYWdlID0gTGlicmFyeVJlc291cmNlcy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRWxlbWVudEVycm9yX21pc3NpbmdfZWxlbWVudF9tZXNzYWdlLCAKLS8vCQkJCQkJKG5ldyBTdHJpbmdbXSB7TGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZTEpLCAKLS8vCQkJCQkJCQlMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlMikgfSkpOwotLy8JCQkJCi0vLwkJCQllbGVtZW50RXJyb3IgPSBuZXcgRWxlbWVudEVycm9yKAotLy8JCQkJCQl0aGlzLmNsb3N1cmUsIHRoaXMuZ2V0RXJyb3JMZXZlbCgpLAotLy8JCQkJCQltZXNzYWdlLCBlMSwgZTIsIHJlbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQkJCXRoaXMuZWxlbWVudEVycm9zLmFkZChlbGVtZW50RXJyb3IpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vY2xvc3VyZS9QYWNrYWdlUmVmZXJlbmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZWYyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvY29uZmlndXJhdGlvbi9jbG9zdXJlL1BhY2thZ2VSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLmNsb3N1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogQSBwYWNrYWdlIHJlZmVyZW5jZSBob2xkcyB0aGUgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IHBhY2thZ2UgZWxlbWVudCB0bwotICogYW5vdGhlciBwYWNrYWdlIGVsZW1lbnQuIElmIG9uZSBlbGVtZW50IGluIHRoZSBwYWNrYWdlIHJlZmVyZW5jZXMgdG8gYW5vdGhlcgotICogZWxlbWVudCBpbiBhbm90aGVyIHBhY2thZ2UsIHRoZSB0aGlzIHBhY2thZ2UgcmVmZXJlY2VzIHRvIHRoYXQgcGFja2FnZS4KLSAqIFVubGlrZSBlbGVtZW50IHJlZmVyZW5jZXMsIFBhY2thZ2VSZWZlcmVuY2UgaG9sZCBhIG9uZSB0byBvbmUgcmVsYXRpb25zaGlwCi0gKiBiZXR3ZWVuIHR3byBwYWNrYWdlcyBUaGUgUGFja2FnZXJlZmVyZW5jZSBvYmplY3QgYWxzbyBob2xkIGEgbGlzdCBvZgotICogRWxlbWVudFJlZmVyZW5jZXMgZm9yIGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZVJlZmVyZW5jZSBleHRlbmRzIEVsZW1lbnRSZWZlcmVuY2UgewotCQotCS8vIGxpc3Qgb2YgZWxlbWVudCByZWZlcmVjZXMgYmV0d2VlbiB0aGUgdHdvIHBhY2thZ2UKLQlwcml2YXRlIExpc3QgcmVmTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBQYWNrYWdlUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCByZWZFbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQsIHJlZkVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIG5ldyBlbGVtZW50IHJlZmVyZW5jZSBpZiB0aGUgcmVmZXJlbmNlIGlzIG5vdCBzZXQuIGNhbGwKLQkgKiBoYXNSZWZlcmVuY2UoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCByZWZFbGVtZW50KSBiZWZvcmUgY2FsbGluZyB0aGlzCi0JICogbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHJlZgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShFbGVtZW50UmVmZXJlbmNlIHJlZikgewotCQlyZWZMaXN0LmFkZChyZWYpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgZWxlbWVudCByZWZlcmVuY2VzIGFtb25nIHRoaXMgcGFja2FnZSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIEVsZW1lbnRSZWZlcmVuY2Ugb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiByZWZMaXN0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhpcyBwYWNrYWdlIHJlZmVyZW5jZQotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQKLQkgKiBAcmV0dXJuIEVsZW1lbnRSZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCByZWZFbGVtZW50KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZMaXN0Lml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCWlmIChyZWYuZ2V0RWxlbWVudCgpID09IGVsZW1lbnQKLQkJCQkJJiYgcmVmLmdldFJlZkVsZW1lbnQoKSA9PSByZWZFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayB0aGUgZWxlbWVudCByZWZlcmVuY2UgZXhpc3RzIGluIHRoaXMgcGFja2FnZSByZWZlcmVuY2UKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1JlZmVyZW5jZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQkKLQkJcmV0dXJuIGdldFJlZmVyZW5jZShlbGVtZW50LCByZWZFbGVtZW50KSAhPSBudWxsOwotCX0KLQotLy8JLyoqCi0vLwkgKiBjaGVjayBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSBvZiB2YXJpYWJpbGl0eSBiYXNlIGVsZW1lbnQKLS8vCSAqIEByZXR1cm4KLS8vCSAqLwotLy8JcHVibGljIGJvb2xlYW4gaGFzQmFzZVJlZmVyZW5jZSgpIHsKLS8vCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLS8vCQkJaWYgKHJlZiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudFJlZmVyZW5jZSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLQotCS8qKgotCSAqIHJlbW92ZSB0aGUgcmVmZXJlbmNlIG93bmVyZCBieSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCU9iamVjdCBlOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgcmVmTGlzdC5zaXplKCkpIHsKLQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIHJlZkxpc3QuZ2V0KGkpOwotCQkJZSA9IHJlZi5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZSAhPSBudWxsICYmIGUgPT0gb3duZXJFbGVtZW50KSB7Ci0JCQkJcmVmTGlzdC5yZW1vdmUoaSk7Ci0JCQl9IGVsc2UgewotCQkJCWkrKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHByaW50IG91dAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oTGlicmFyeVV0aWwuZ2V0TmFtZShlbGVtZW50KQotCQkJCSsgIiAtLT4gIiArIExpYnJhcnlVdGlsLmdldE5hbWUocmVmRWxlbWVudCkpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlZkxpc3QuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJKChFbGVtZW50UmVmZXJlbmNlKSBpdC5uZXh0KCkpLnByaW50KCk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgcGFja2FnZSByZWZlcmVuY2UgY2FuIGJlIGlnbm9yZWQKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5JZ25vcmUoKSB7Ci0JCS8vIGlmIHRoZSBwYWNrYWdlIGhhcyBubyBlbGVtZW50IHJlZmVyZW5jZSBvciBhbGwgZWxlbWVudCByZWZlcmVuY2VzIGNhbgotCQkvLyBiZSBpZ25vcmVkLCByZXR1cm4gdHJ1ZQotCQkvLyBvdGhlcndpc2UsIGZhbHNlCi0JCUxpc3QgcmVmcyA9IHRoaXMuZ2V0UmVmZXJlbmNlcygpOwotCi0JCWlmIChyZWZzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVsZW1lbnRSZWZlcmVuY2UgcmVmID0gKEVsZW1lbnRSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCWlmICghcmVmLmNhbklnbm9yZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjMzZmU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9jb25maWd1cmF0aW9uL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVsZW1lbnQgcmVhbGl6YXRpb24gc3VwcG9ydCBpbiBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9ldmVudHMvSUxpYnJhcnlDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9JTGlicmFyeUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Zjc5YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9JTGlicmFyeUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaWJyYXJ5Q2hhbmdlTGlzdGVuZXIgewotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fTE9BREVEID0gMHgxOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fU0FWRUQgPSAweDI7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9DUkVBVEVEID0gMHg0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OX0NIQU5HRUQgPSAweDg7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fREVMRVRFRCA9IDB4MTA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fTkVXQ0hJTEQgPSAweDIwOwotCi0vLwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05fQ09ORklHVVJBVElPTl9TRUxFQ1RFRCA9IDB4NDA7Ci0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElPTl9MSUJSQVJZX0NMT1NFRCA9IDB4ODA7Ci0KLQkvKioKLQkgKiBub3RpZnkgdGhlIGxpc3RlbmVyIG9mIHRoZSBsaWJyYXJ5IGNoYW5nZXMuCi0JICogCi0JICogQHBhcmFtIG9wdGlvbgotCSAqICAgICAgICAgICAgaW50IG9uZSBvZiB0aGUgY2hhbmdlIG9wdGlvbnMKLQkgKiBAcGFyYW0gY29sbGVjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGNoYW5nZWQgZWxlbWVudHMgaW4gdGhlIGxpYnJhcnksIGlmIHRoZSBvcHRpb24gaXMKLQkgKiAgICAgICAgICAgIE9QVElPTl9DSEFOR0VELCBudWxsIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyB2b2lkIGxpYnJhcnlDaGFuZ2VkKGludCBvcHRpb24sIENvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2V2ZW50cy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiYWM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvZXZlbnRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciBtZXRob2QgbGlicmFyeSBldmVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL0xpYnJhcnlNYW5hZ2VyRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWFkYjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9MaWJyYXJ5TWFuYWdlckVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBNb2RlbHMgYSAibGlicmFyeU1hbmFnZXIiIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1hbmFnZXJFbGVtZW50IHsKLQotCS8vIFRoZSBjb250cmlidXRpbmcgcGx1Zy1pbi4KLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvLyBUaGUgbGlicmFyeSBtYW5hZ2VyIGNsYXNzIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCi0JLy8gVGhlIGxpYnJhcnkgdHlwZSBpZGVudGlmaWVyLgotCXByaXZhdGUgU3RyaW5nIHR5cGVJZDsKLQotCS8vIFRoZSBsaWJyYXJ5IHR5cGUgZGlzcGxheSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCQotCXByaXZhdGUgaW50IHZlcnNpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250cmlidXRpbmcgcGx1Zy1pbgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IG1hbmFnZXIgY2xhc3MgbmFtZQotCSAqIEBwYXJhbSB0eXBlSWQKLQkgKiAgICAgICAgICAgIHRoZSBsaWJyYXJ5IHR5cGUgaWRlbnRpZmllcgotCSAqIEBwYXJhbSB0eXBlTmFtZQotCSAqICAgICAgICAgICAgdGhlIGxpYnJhcnkgdHlwZSBkaXNwbGF5IG5hbWUKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1hbmFnZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBjbGFzc05hbWUsCi0JCQlTdHJpbmcgdHlwZUlkLCBTdHJpbmcgdHlwZU5hbWUsIGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy50eXBlSWQgPSB0eXBlSWQ7Ci0JCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwbHVnLWluIHRoYXQgY29udHJpYnV0ZWQgdGhlIGV4dGVuc2lvbiBwb2ludAotCSAqIAotCSAqIEByZXR1cm4gYSBwbHVnLWluIGJ1bmRsZQotCSAqLwotCXB1YmxpYyBCdW5kbGUgZ2V0QnVuZGxlKCkgewotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJjbGFzcyIgYXR0cmlidXRlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgbWFuYWdlciBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlICJ0eXBlIiBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBhIHVuaXF1ZSBzdHJpbmcgSUQgZm9yIHRoZSBsaWJyYXJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVJZCgpIHsKLQkJcmV0dXJuIHR5cGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSAidHlwZU5hbWUiIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgZGlzcGxheSBuYW1lIGZvciB0aGUgbGlicmFyeSB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWQwYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2ludGVybmFsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGV4dGVuc2lvbiBwb2ludCBtYW5hZ2VtZW50IGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvQm9va21hcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhZWZiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBib29rbWFyayBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHB1Ymxpc2hlZCBib29rbWFyayBlbnRyaWVzLiAKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvb2ttYXJrIHsKLQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMzY1MjU4Mjc5MTMyNjMyMzg2M0w7Ci0KLQkvLyBwb2ludHMgdG8gdGhlIGRlc2NyaXB0aW9uIGZpbGUgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHVzZWQgYXMgImNsb3NlZCIgb3IgImRlZmF1bHQiIGljb24KLQlwcml2YXRlIFN0cmluZyBfY2xvc2VkSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdXNlZCBhcyAib3BlbiIgaWNvbgotCXByaXZhdGUgU3RyaW5nIF9vcGVuSWNvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHJlc2VudGF0aW9uIG5hbWUgb2YgdGhlIGVudHJ5Ci0JcHJpdmF0ZSBTdHJpbmcgX3ByZXNlbnRhdGlvbk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gd2hldGhlciBtb3VzZSBpcyBvdmVyIHRoZSBib29rbWFyawotCS8vIHRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0JLy8gcHJpdmF0ZSBib29sZWFuIF9pc01vdXNlT3ZlciA9IGZhbHNlOwotCi0JLy8gd2hldGhlciB0aGUgZmlsZSBleGlzdHMgaW4gdGhlIGZpbGUgc3lzdGVtCi0JcHJpdmF0ZSBib29sZWFuIF9pc0V4aXN0ID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGZpbGUgaXMgZnJvbSBjb250ZW50IGxpYnJhcnkKLQlwcml2YXRlIGJvb2xlYW4gX2lzRnJvbUNvbnRlbnRMaWJyYXJ5ID0gdHJ1ZTsKLQotCS8vIHVuaXF1ZSBpZC4KLQkvLyBBIGJvb2ttYXJrIG1heSBub3QgaGF2ZSBhIHVuaXF1ZUlEIGluIHdoaWNoIGNhc2UgdGhlCi0JLy8gYm9va21hcmsgaGFzIG5vIHJlbGF0aW9uIHRvIGFueSBsYXlvdXQgZWxlbWVudHMuCi0JcHJpdmF0ZSBTdHJpbmcgX3VuaXF1ZUlkID0gbnVsbDsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHZpc2libGUKLQlwcml2YXRlIGJvb2xlYW4gX2lzVmlzaWJsZSA9IHRydWU7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBlbmFibGVkCi0JLy8gdGhpcyBpcyB0byBzdXBwb3J0IGEgc3BlY2lhbCBjYXNlIHdoZXJlIGJvb2ttYXJrcwotCS8vIGFyZSB0byByZW1haW4gaGlkZGVuIGFuZCBjYW5ub3QgYmUgdW5oaWRkZW4gYXMKLQkvLyB3ZWxsIGFzIHRyYW5zcGFyZW5jeQotCXByaXZhdGUgYm9vbGVhbiBfaXNFbmFibGVkID0gdHJ1ZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRyYW5zcGFyZW50Ci0JcHJpdmF0ZSBib29sZWFuIF9pc1RyYW5zcGFyZW50ID0gZmFsc2U7Ci0KLQkvLyB3aGV0aGVyIHRoZSBib29rbWFyayBpcyBhIGRlZmF1bHQgb25lCi0JLy8gZGVmYXVsdCBtZWFucyB0aGF0IGl0IGlzIHB1Ymxpc2hlZCBhbmQgaXMgcmVhZC1vbmx5Ci0JcHJpdmF0ZSBib29sZWFuIF9pc0RlZmF1bHQgPSBmYWxzZTsKLQotCS8vIHdoZXRoZXIgdGhlIGJvb2ttYXJrIGlzIHRoZSBjdXJyZW50IG9uZQotCS8vIGN1cnJlbnQgbWVhbnMgdGhlIGZpcnN0IG9uZSB0byBiZSBmb2N1c2VkIG9uCi0JcHJpdmF0ZSBib29sZWFuIF9pc0N1cnJlbnQgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIEJvb2ttYXJrIHBhcmVudCA9IG51bGw7Ci0JCi0JLy8gdGhlIG93bmVyIGVsZW1lbnQgb2YgdGhlIG5vZGUKLQlwcml2YXRlIE9iamVjdCBvd25lciA9IG51bGw7Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gVGFrZXMgaW4gdGhlIHByZXNlbnRhdGlvbiBuYW1lIG9mIHRoZSBwcm9jZXNzIGxheW91dAotCSAqIGVudHJ5LgotCSAqLwotCXB1YmxpYyBCb29rbWFyayhTdHJpbmcgbmFtZSkgewotCQlfdW5pcXVlSWQgPSBudWxsOwotCQlfcHJlc2VudGF0aW9uTmFtZSA9IG5hbWU7Ci0JCWlmIChfcHJlc2VudGF0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQlfcHJlc2VudGF0aW9uTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOYW1lIGFuZCB1bmlxdWVJZCBmb3IgYSBsYXlvdXQgbm9kZS4KLQkgKi8KLQlwdWJsaWMgQm9va21hcmsoU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUsIFN0cmluZyB1bmlxdWVJZCkgewotCQl0aGlzKHByZXNlbnRhdGlvbk5hbWUpOwotCQlfdW5pcXVlSWQgPSB1bmlxdWVJZDsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyKE9iamVjdCBlbGVtZW50KSB7Ci0JCXRoaXMub3duZXIgPSBlbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gcmV0dXJuIHByZXNlbnRhdGlvbiBuYW1lIGFzIHRoZSB1c2VyIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFVzZXJPYmplY3QoKSB7Ci0JCXJldHVybiAoX3ByZXNlbnRhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgdXNlciBvYmplY3QKLQkgKiBAcGFyYW0gdXNlck9iamVjdCBPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyT2JqZWN0KE9iamVjdCB1c2VyT2JqZWN0KSB7Ci0JCV9wcmVzZW50YXRpb25OYW1lID0gKFN0cmluZykgdXNlck9iamVjdDsKLQkJaWYgKF9wcmVzZW50YXRpb25OYW1lID09IG51bGwpIHsKLQkJCV9wcmVzZW50YXRpb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgcHJlc2VudGF0aW9uIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9wcmVzZW50YXRpb25OYW1lID0gbmFtZTsKLQkJaWYgKF9wcmVzZW50YXRpb25OYW1lID09IG51bGwpIHsKLQkJCV9wcmVzZW50YXRpb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcHJlc2VudGF0aW9uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChfcHJlc2VudGF0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgbmFtZSkgewotCQlfZmlsZU5hbWUgPSBuYW1lOwotCQlpZiAoX2ZpbGVOYW1lID09IG51bGwpIHsKLQkJCV9maWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIChfZmlsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgaWNvbiBuYW1lIGZvciB0aGUgY2xvc2VkIGljb24KLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbG9zZWRJY29uTmFtZShTdHJpbmcgbmFtZSkgewotCQlfY2xvc2VkSWNvbk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgY2xvc2VkIGljb24gbmFtZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbG9zZWRJY29uTmFtZSgpIHsKLQkJcmV0dXJuIChfY2xvc2VkSWNvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgb3BlbiBpY29uIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgb3BlbiBpY29uIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9wZW5JY29uTmFtZSgpIHsKLQkJcmV0dXJuIChfb3Blbkljb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIG9wZW4gaWNvbiBuYW1lCi0JICogCi0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3Blbkljb25OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9vcGVuSWNvbk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZXhpc3QgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0V4aXN0IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdChib29sZWFuIGlzRXhpc3QpIHsKLQkJX2lzRXhpc3QgPSBpc0V4aXN0OwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZXhpc3QgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhpc3QoKSB7Ci0JCXJldHVybiAoX2lzRXhpc3QpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgYSBsZWdhY3kgbWV0aG9kLCBub3QgdXNlZCBhbnkgbW9yZQotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIGZsYWcgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZyb21Db250ZW50TGlicmFyeShib29sZWFuIGZsYWcpIHsKLQkJX2lzRnJvbUNvbnRlbnRMaWJyYXJ5ID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIGEgbGVnYWN5IG1ldGhvZCwgbm90IHVzZWQgYW55IG1vcmUKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRnJvbUNvbnRlbnRMaWJyYXJ5KCkgewotCQlyZXR1cm4gKF9pc0Zyb21Db250ZW50TGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1bmlxdWUgaWQgb2YgdGhlIGJvb2ttYXJrCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUlkKCkgewotCQlyZXR1cm4gKF91bmlxdWVJZCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB1bmlxdWUgaWQgb2YgdGhlIGJvb2ttYXJrCi0JICogCi0JICogQHBhcmFtIHVuaXF1ZUlkIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgewotCQlfdW5pcXVlSWQgPSB1bmlxdWVJZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIHZpc2libGUgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc1Zpc2libGUgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiBpc1Zpc2libGUpIHsKLQkJX2lzVmlzaWJsZSA9IGlzVmlzaWJsZTsKLQkJLy8gc3BlY2lhbCBjYXNlIHdoZXJlIGFsbCBjaGlsZHJlbiBuZWVkIHRvIGNoYW5nZSBhcyB3ZWxsCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0Q2hpbGRDb3VudCgpOyBpKyspIHsKLQkJCUJvb2ttYXJrIGNoaWxkID0gKEJvb2ttYXJrKSAoKEJvb2ttYXJrKSBnZXRDaGlsZEF0KGkpKTsKLQkJCWNoaWxkLnNldFZpc2libGUoaXNWaXNpYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmlzaWJsZSBmbGFnCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotCQlyZXR1cm4gKF9pc1Zpc2libGUpOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgZW5hYmxlZCBmbGFnCi0JICogCi0JICogQHBhcmFtIGlzRW5hYmxlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGlzRW5hYmxlZCkgewotCQlfaXNFbmFibGVkID0gaXNFbmFibGVkOwotCQkvLyBzcGVjaWFsIGNhc2Ugd2hlcmUgYWxsIGNoaWxkcmVuIG5lZWQgdG8gY2hhbmdlIGFzIHdlbGwKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRDaGlsZENvdW50KCk7IGkrKykgewotCQkJQm9va21hcmsgY2hpbGQgPSAoQm9va21hcmspICgoQm9va21hcmspIGdldENoaWxkQXQoaSkpOwotCQkJY2hpbGQuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbmFibGVkIGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiAoX2lzRW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB0cmFuc3BhcmFudCBmbGFnCi0JICogCi0JICogQHBhcmFtIGlzVHJhbnNwYXJlbnQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRyYW5zcGFyZW5jeShib29sZWFuIGlzVHJhbnNwYXJlbnQpIHsKLQkJLy8gc2V0IGF0IHRoaXMgYm9va21hcmsgb25seSwgbm90IGNoaWxkcmVuCi0JCV9pc1RyYW5zcGFyZW50ID0gaXNUcmFuc3BhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHRyYW5zcGFyZW50IGZsYWcKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zcGFyZW50KCkgewotCQlyZXR1cm4gKF9pc1RyYW5zcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGJvb2ttYXJrIGFzIGRlZmF1bHQKLQkgKiAKLQkgKiBAcGFyYW0gaXNEZWZhdWx0IGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gaXNEZWZhdWx0KSB7Ci0JCV9pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhpcyBib29rbWFyayBpcyBzZXQgYXMgZGVmYXVsdAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIChfaXNEZWZhdWx0KTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIGN1cnJlbnQgZmxhZwotCSAqIAotCSAqIEBwYXJhbSBpc0N1cnJlbnQgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQoYm9vbGVhbiBpc0N1cnJlbnQpIHsKLQkJX2lzQ3VycmVudCA9IGlzQ3VycmVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGN1cnJlbnQgZmxhZwotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3VycmVudCgpIHsKLQkJcmV0dXJuIChfaXNDdXJyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIG51bWJlciBvZiBjaGlsZHJlbgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgewotCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyByZWFsIGNoaWxkIGNvdW50IHJlZ2FyZGxlc3Mgb2YgdmlzaWJpbGl0eS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdHVhbENoaWxkQ291bnQoKSB7Ci0JCXJldHVybiAoZ2V0Q2hpbGRDb3VudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNwZWNpZmllZCBjaGlsZAotCSAqIEBwYXJhbSBpIGludCBwb3NpdGlvbiBvZiB0aGUgY2hpbGQKLQkgKiBAcmV0dXJuIE9iamVjdCB0aGUgY2hpbGQgYm9va21hcmsKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENoaWxkQXQoaW50IGkpIHsKLQkJcmV0dXJuIGNoaWxkcmVuLmdldChpKTsKLQl9Ci0KLQkvKioKLQkgKiBzYW1lIGFzIGdldENoaWxkQXQKLQkgKiAKLQkgKiBAcGFyYW0gaSBpbnQgcG9zaXRpb24gb2YgdGhlIGNoaWxkCi0JICogQHJldHVybiBPYmplY3QgdGhlIGNoaWxkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxDaGlsZEF0KGludCBpKSB7Ci0JCXJldHVybiBjaGlsZHJlbi5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbmV3IGNoaWxkIGJvb2ttYXJrCi0JICogCi0JICogQHBhcmFtIGNoaWxkIEJvb2ttYXJrCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoQm9va21hcmsgY2hpbGQpIHsKLQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJY2hpbGQucGFyZW50ID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgQm9va21hcmsgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcXVlcnkgc3RyaW5nIHRvIHRoaXMgYm9va21hcmsuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkKLQl7Ci0JCXJldHVybiBxdWVyeVN0cmluZzsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IHRoZSBxdWVyeSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnlTdHIgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnlTdHJpbmcoU3RyaW5nIHF1ZXJ5U3RyKQotCXsKLQkJdGhpcy5xdWVyeVN0cmluZyA9IHF1ZXJ5U3RyOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBkb2N1bWVudCBmb3IgdGhpcyBib29rbWFyay4KLQkgKiAKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBuZXcgWG1sRWxlbWVudCgiRWxlbWVudCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJndWlkIiwgZ2V0VW5pcXVlSWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBnZXRQcmVzZW50YXRpb25OYW1lKCkudHJpbSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiY2xvc2VkSWNvbk5hbWUiLCBnZXRDbG9zZWRJY29uTmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgib3Blbkljb25OYW1lIiwgZ2V0T3Blbkljb25OYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJleGlzdCIsIGlzRXhpc3QoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCSJmcm9tQ29udGVudExpYnJhcnkiLCBpc0Zyb21Db250ZW50TGlicmFyeSgpID8gInRydWUiIDogImZhbHNlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkuc2V0QXR0cmlidXRlKCJ2aXNpYmxlIiwgaXNWaXNpYmxlKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImVuYWJsZWQiLCBpc0VuYWJsZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgidHJhbnNwYXJlbnQiLCBpc1RyYW5zcGFyZW50KCkgPyAidHJ1ZSIgOiAiZmFsc2UiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCS5zZXRBdHRyaWJ1dGUoImRlZmF1bHQiLCBpc0RlZmF1bHQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgiY3VycmVudCIsIGlzQ3VycmVudCgpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoImNsb3NlZEljb25JZCIsIGdldEljb25JZChnZXRDbG9zZWRJY29uTmFtZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBxU3RyID0gZ2V0UXVlcnlTdHJpbmcoKTsKLQkJaWYgKCBxU3RyID09IG51bGwgfHwgcVN0ci5sZW5ndGgoKSA9PSAwICkgewotCQkJcVN0ciA9ICI/bm9kZUlkPSIgKyBlbGVtZW50WG1sLmdldElkKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXFTdHIgKz0gIiZub2RlSWQ9IiArIGVsZW1lbnRYbWwuZ2V0SWQoKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInVybCIsIGdldEZpbGVOYW1lKCkgKyBxU3RyKTsgLy8kTk9OLU5MUy0xJAotCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldENoaWxkQ291bnQoKTsgaSsrKSB7Ci0JCQlCb29rbWFyayBjaGlsZCA9IChCb29rbWFyaykgZ2V0QWN0dWFsQ2hpbGRBdChpKTsKLQkJCWVsZW1lbnRYbWwuYWRkQ2hpbGQoY2hpbGQuZ2V0WG1sRWxlbWVudCgpKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKSArIGdldFF1ZXJ5U3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWNvbklkKFN0cmluZyBpY29uRmlsZU5hbWUpIHsKLQkJaWYgKCBpY29uRmlsZU5hbWUgPT0gbnVsbCApIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIEludGVnZXIudG9IZXhTdHJpbmcoaWNvbkZpbGVOYW1lLmhhc2hDb2RlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Cb29rbWFya0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhMTA2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jvb2ttYXJrTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBhIGxpc3Qgb2YgYm9va21hcmtzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29rbWFya0xpc3QgewotCi0JLy8gYSBsaXN0IG9mIGJvb2ttYXJrIGl0ZW1zCi0JcHJpdmF0ZSBMaXN0IGJvb2ttYXJrcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBCb29rbWFya0xpc3QoKSB7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbmV3IGJvb2ttYXJrICBlbnRyeSB0byB0aGUgbGlzdAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZyB0aGUgQm9va21hcmsgbmFtZQotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcgdGhlIGZpbGUgbmFtZSBvZiB0aGUgYm9va21hcmsKLQkgKiBAcGFyYW0gc2V0QXNEZWZhdWx0IGJvb2xlYW4gc2V0IHRoZSBib29rbWFyayBhcyBkZWZhdWx0IGlmIHRydWUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQm9va21hcmsoU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiBzZXRBc0RlZmF1bHQpIHsKLQkJX0Jvb2ttYXJrRW50cnkgZW50cnkgPSBuZXcgX0Jvb2ttYXJrRW50cnkobmFtZSwgZmlsZU5hbWUsIHNldEFzRGVmYXVsdCk7Ci0JCWJvb2ttYXJrcy5hZGQoZW50cnkpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgYm9va21hcmsgZW50cmllcwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJvb2ttYXJrcygpIHsKLQkJcmV0dXJuIGJvb2ttYXJrczsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBkb2N1bWVudCBmb3IgdGhlIGJvb2ttYXJrIGVudHJpZXMuCi0JICogCi0JICogQHJldHVybiBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gbmV3IFhtbEVsZW1lbnQoIkJvb2ttYXJrcyIpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGJvb2ttYXJrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlfQm9va21hcmtFbnRyeSBlbnRyeSA9IChfQm9va21hcmtFbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGJvb2ttYXJrID0gZW50cnkuZmlsZU5hbWU7Ci0KLQkJCS8vIFN0cmluZyB0YWJOYW1lPSIiOwotCQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgaW5keCA9IGJvb2ttYXJrLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbmR4ID4gMCkgewotCQkJCS8vIHRhYk5hbWUgPSBib29rbWFyay5zdWJzdHJpbmcoMCwgaW5keCkucmVwbGFjZSgnXycsICcgJyk7Ci0JCQkJdXJsID0gYm9va21hcmsuc3Vic3RyaW5nKDAsIGluZHgpICsgIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiQm9va21hcmsiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBib29rbWFyaykgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ0YWJOYW1lIiwgZW50cnkudGFiTmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCB1cmwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkiZGVmYXVsdCIsIChlbnRyeS5pc0RlZmF1bHQpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIF9Cb29rbWFya0VudHJ5IHsKLQkJcHJpdmF0ZSBTdHJpbmcgZmlsZU5hbWU7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdGFiTmFtZTsKLQotCQlib29sZWFuIGlzRGVmYXVsdDsKLQotCQlfQm9va21hcmtFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbGVOYW1lLCBib29sZWFuIGlzRGVmYXVsdCkgewotCQkJdGhpcy50YWJOYW1lID0gbmFtZS50cmltKCk7Ci0JCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCQl0aGlzLmlzRGVmYXVsdCA9IGlzRGVmYXVsdDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Ccm93c2luZ0xheW91dFNldHRpbmdzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlYWVmYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZWZpbmUgdGhlIGJyb3dzaW5nIHNldHRpbmdzLiBVSSBwcmVmZXJlbmNlIGNhbiBzZXQgdGhlIG9wdGlvbnMgdG8gY2hhbmdlIHRoZSBicm93c2luZyBiZWhhdmlvcgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBCcm93c2luZ0xheW91dFNldHRpbmdzIHsKLQotCXB1YmxpYyBzdGF0aWMgQnJvd3NpbmdMYXlvdXRTZXR0aW5ncyBJTlNUQU5DRSA9IG5ldyBCcm93c2luZ0xheW91dFNldHRpbmdzKCk7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBwdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbiA9IGZhbHNlOwotCQotCS8vIGlmIHRydWUsIHRoZSB0by1tYW55IG91dGdvaW5nIGFzc29jaWF0aW9uIGZyb20gYmFzZSB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIGV4dGVuZGVyIGhhcyBpdHMgb3duCi0JcHJpdmF0ZSBib29sZWFuIHVzZU5ld0V4dGVuZFNlbWFudGljcyA9IGZhbHNlOwotCQotCXByaXZhdGUgIEZpbGUgeHNsUGF0aCA9IG51bGw7Ci0JcHJpdmF0ZSAgRmlsZSBjc3NQYXRoID0gbnVsbDsKLQlwcml2YXRlIEZpbGUgc2NyaXB0UGF0aCA9IG51bGw7Ci0JCi0JLy8gcmVjb3JkIGFsbCB0aGUgc2l0ZXMgdXBkYXRlZCBzaW5jZSB0aGUgbGFzdCBjaGFuZ2UKLQlwcml2YXRlICBMaXN0IHVwZGF0ZWRTaXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VOZXdFeHRlbmRTZW1hbnRpY3MoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMudXNlTmV3RXh0ZW5kU2VtYW50aWNzID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2VOZXdFeHRlbmRTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiB0aGlzLnVzZU5ld0V4dGVuZFNlbWFudGljczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyA9IGZsYWc7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gdGhpcy5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hVbm9wZW5BY3Rpdml0eWRkID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaFVub3BlbkFjdGl2aXR5ZGQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGJvb2xlYW4gZmxhZykgewotCQl0aGlzLnB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gZmxhZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb247Ci0JfQotCQotCXB1YmxpYyAgdm9pZCBzZXRYc2xQYXRoKEZpbGUgcGF0aCkgewotCQl4c2xQYXRoID0gcGF0aDsKLQl9Ci0JCi0JcHVibGljICB2b2lkIHNldENzc1BhdGgoRmlsZSBwYXRoKSB7Ci0JCWNzc1BhdGggPSBwYXRoOwotCX0KLQkKLQlwdWJsaWMgIHZvaWQgc2V0U2NyaXB0UGF0aChGaWxlIHBhdGgpIHsKLQkJc2NyaXB0UGF0aCA9IHBhdGg7Ci0JfQotCQotCXB1YmxpYyAgRmlsZSBnZXRYc2xQYXRoKCkgewotCQlyZXR1cm4geHNsUGF0aDsKLQl9Ci0JCi0JcHVibGljICBGaWxlIGdldENzc1BhdGgoKSB7Ci0JCXJldHVybiBjc3NQYXRoOwotCX0KLQkKLQlwdWJsaWMgIEZpbGUgZ2V0U2NyaXB0UGF0aCgpIHsKLQkJcmV0dXJuIHNjcmlwdFBhdGg7Ci0JfQotCQotCXB1YmxpYyAgdm9pZCBzZXRDaGFuZ2VkKCkgewotCQl1cGRhdGVkU2l0ZXMuY2xlYXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljICBib29sZWFuIG5lZWRVcGRhdGUoU3RyaW5nIHB1YkRpcikgewotCQlpZiAoIHB1YkRpciA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAhdXBkYXRlZFNpdGVzLmNvbnRhaW5zKHB1YkRpcik7Ci0JfQotCQotCXB1YmxpYyAgdm9pZCB1cGRhdGUoSHRtbEJ1aWxkZXIgYnVpbGRlcikgewotCQlpZiAoIChidWlsZGVyID09IG51bGwpIHx8ICFuZWVkVXBkYXRlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpKSApIHsKLQkJCWlmICgoYnVpbGRlciAhPSBudWxsKSYmKHhzbFBhdGggIT0gbnVsbCkpIHsKLQkJCQlidWlsZGVyLnNldExheW91dFhzbFJvb3RQYXRoKHhzbFBhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggeHNsUGF0aCA9PSBudWxsIHx8IGNzc1BhdGggPT0gbnVsbCB8fCBzY3JpcHRQYXRoID09IG51bGwpIHsKLQkJCS8vIHVzZSB0aGUgZGVmYXVsdAotCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlMYXlvdXRGaWxlcyhidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSk7Ci0JCQlidWlsZGVyLmxvYWREZWZhdWx0TGF5b3V0WHNsKCk7Ci0JCX0gZWxzZSB7Ci0JCQkKLQkJCS8vIHNldCB0aGUgeHNsIHBhdGgKLQkJCWJ1aWxkZXIuc2V0TGF5b3V0WHNsUm9vdFBhdGgoeHNsUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkKLQkJCS8vIGNvcHkgdGhlIGZpbHMgdG8gdGhlIHB1Ymxpc2ggZm9sZGVyCi0JCQlTdHJpbmcgaW5jbHVkZSA9ICIqLiosKiovKi4qIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGV4Y2x1ZGUgPSBudWxsOwotCQkJYm9vbGVhbiBvdmVycmlkZSA9IHRydWU7Ci0JCQkKLQkJCUZpbGUgZm9sZGVyID0gbmV3IEZpbGUoYnVpbGRlci5nZXRQdWJsaXNoRGlyKCksICJjc3MiKTsJCQkgLy8kTk9OLU5MUy0xJAotCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoY3NzUGF0aCwgZm9sZGVyLCBpbmNsdWRlLCBleGNsdWRlLCBvdmVycmlkZSk7Ci0JCQkKLQkJCWZvbGRlciA9IG5ldyBGaWxlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpLCAic2NyaXB0cyIpOwkJCSAvLyROT04tTkxTLTEkCi0JCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihzY3JpcHRQYXRoLCBmb2xkZXIsIGluY2x1ZGUsIGV4Y2x1ZGUsIG92ZXJyaWRlKTsKLQkJfQotCQkKLQkJdXBkYXRlZFNpdGVzLmFkZChidWlsZGVyLmdldFB1Ymxpc2hEaXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0Q29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9EZWZhdWx0Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTQ4NDQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Db250ZW50UmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUNvbnRlbnRWYWxpZGF0b3IuIFRoaXMgdmFsaWRhdG9yIGlzIHVzZWQgZm9yIGJyb3dzaW5nIGFuZCBwcmV2aWV3Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ29udGVudFZhbGlkYXRvciB7Ci0KLQlwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gaW5mbzsKLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSB3YXJuaW5nOwotCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGVycm9yOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJEaXI7Ci0KLQkvL3Byb3RlY3RlZCBib29sZWFuIHNob3dCcm9rZW5MaW5rcyA9IHRydWU7Ci0JCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcHViRGlyCi0JICovCi0JcHVibGljIERlZmF1bHRDb250ZW50VmFsaWRhdG9yKFN0cmluZyBwdWJEaXIpIHsKLQkJdGhpcy5wdWJEaXIgPSBwdWJEaXI7Ci0JCWluZm8gPSBTeXN0ZW0ub3V0OwotCQl3YXJuaW5nID0gU3lzdGVtLm91dDsKLQkJZXJyb3IgPSBTeXN0ZW0uZXJyOwotCX0KLQotCS8qKgotCSAqIHNldCBwdWJsaXNoIGRpcgotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgcHViRGlyKSB7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hEaXIoKSB7Ci0JCXJldHVybiB0aGlzLnB1YkRpcjsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHNldFNob3dCcm9rZW5MaW5rcyhib29sZWFuIGZsYWcpIHsKLS8vCQlzaG93QnJva2VuTGlua3MgPSBmbGFnOwotLy8JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3dCcm9rZW5MaW5rcygpIHsKLQkJcmV0dXJuIHRydWU7IC8vIGRlZmF1bHQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2NhbkNvbnRlbnQoSUVsZW1lbnRMYXlvdXQgbGF5b3V0LCBTdHJpbmcgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlNZXRob2RFbGVtZW50IG93bmVyID0gbGF5b3V0LmdldEVsZW1lbnQoKTsKLQkJU3RyaW5nIGNvbnRlbnRQYXRoID0gbGF5b3V0LmdldEZpbGVQYXRoKCk7Ci0KLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gZ2V0U2Nhbm5lcihvd25lcik7Ci0JCWlmICggc2Nhbm5lciAhPSBudWxsICkgewotCQkJc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBjb250ZW50LCBjb250ZW50UGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCByZXNvdXJjZSBzY2FubmVyIGZvciB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgZ2V0U2Nhbm5lcihNZXRob2RFbGVtZW50IG93bmVyKSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKG93bmVyKTsKLQkJaWYgKCByZXNNZ3IgPT0gbnVsbCApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlTdHJpbmcgcm9vdENvbnRlbnRQYXRoID0gcmVzTWdyLmdldExvZ2ljYWxQbHVnaW5QYXRoKG93bmVyKTsKLQkJRmlsZSBzcmNfcm9vdCA9IG5ldyBGaWxlKHJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgob3duZXIpKTsKLQkJRmlsZSB0Z3Rfcm9vdCA9IG5ldyBGaWxlKHB1YkRpciwgcm9vdENvbnRlbnRQYXRoKTsKLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoc3JjX3Jvb3QsIHRndF9yb290LCByb290Q29udGVudFBhdGgsIHRoaXMpOwotCi0JCXJldHVybiBzY2FubmVyOwotCX0KLQkKLQlwdWJsaWMgTGlua0luZm8gdmFsaWRhdGVMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBhdHRyaWJ1dGVzLAotCQkJU3RyaW5nIHRleHQsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBTdHJpbmcgdGFnKSB7Ci0KLQkJTGlua0luZm8gaW5mbyA9IG5ldyBMaW5rSW5mbyhvd25lciwgdGhpcywgcHViRGlyLCB0YWcpOwotCQlpbmZvLnZhbGlkYXRlTGluayhhdHRyaWJ1dGVzLCB0ZXh0LCBjb25maWcpOwotCi0JCXJldHVybiBpbmZvOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0luZm8oTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaW5mbwotCQkJCS5wcmludGxuKE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMSwgKChvd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpKSArICI6ICIgKyBtZXNzYWdlKSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5mby5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJd2FybmluZwotCQkJCS5wcmludGxuKE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHNCwgKChvd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpKSArICI6ICIgKyBtZXNzYWdlKSk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJd2FybmluZy5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpIHsKLQkJZXJyb3IKLQkJCQkucHJpbnRsbihOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzcsICgob3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSkgKyAiOiAiICsgbWVzc2FnZSkpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmICh0aCAhPSBudWxsKSB7Ci0JCQl0aC5wcmludFN0YWNrVHJhY2UoZXJyb3IpOwotCQl9Ci0JCWVycm9yLmZsdXNoKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZ0luZm8obnVsbCwgbWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlsb2dXYXJuaW5nKG51bGwsIG1lc3NhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGgpIHsKLQkJbG9nRXJyb3IobnVsbCwgbWVzc2FnZSwgdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlsb2dXYXJuaW5nKAotCQkJCW93bmVyLAotCQkJCU5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTAsIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHJlZkVsZW1lbnQpKSk7IAotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGd1aWQsCi0JCQlTdHJpbmcgbGlua2VkVGV4dCkgewotCQlsb2dXYXJuaW5nKG93bmVyLCBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzExLCBndWlkKSk7IAotCX0KLQotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIG1zZzsKLQkJaWYgKHJlc291cmNlRmlsZSAhPSBudWxsKSB7Ci0JCQltc2cgPSBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkRlZmF1bHRDb250ZW50VmFsaWRhdG9yX01TRzEyLCByZXNvdXJjZUZpbGUuZ2V0UGF0aCgpLCB1cmwpOyAKLQkJfSBlbHNlIHsKLQkJCW1zZyA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTUsIHVybCk7IAotCQl9Ci0KLQkJbG9nV2FybmluZyhvd25lciwgbXNnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgdGV4dDsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotCQkJdGV4dCA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTksIHVybCwgbWVzc2FnZSk7IAotCQl9IGVsc2UgewotCQkJdGV4dCA9IE5MUy5iaW5kKExpYnJhcnlSZXNvdXJjZXMuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3JfTVNHMTcsIHVybCk7IAotCQl9Ci0JCWxvZ1dhcm5pbmcob3duZXIsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGRpc2NhcmRlZCBvciBub3QKLQkgKiBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZSB0cmVhdGVkIGFzIG91dCBzaWRlIHRoZSBjb25maWd1cnNhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBPYmplY3QgZmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUgb3IgT3Bwb3NpdGVGZWF0dXJlCi0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBjaGVja2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjYXJkZWQoTWV0aG9kRWxlbWVudCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpCi0JewotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQkKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5pc1Nob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpOwotCX0KLQkJCi0JLyoqCi0JICogc2hvdyBkZXNjcmlwdG9ycyBvbiBtZXRob2QgZWxlbWVudCBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgdGFiIGlkIGZvciB0aGUgYWN0aXZpdHkgbGF5b3V0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRBY3Rpdml0eVRhYigpIHsKLQkJcmV0dXJuIG51bGw7ICAvLyB1c2UgdGhlIGRlZmF1bHQKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdFNoYXBlaWNvbnMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRGVmYXVsdFNoYXBlaWNvbnMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiNTYyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0RlZmF1bHRTaGFwZWljb25zLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgRGVmYXVsdCBTaGFwZSBJY29uIE1hcHBpbmcgZm9yIHRoZSBNZXRob2QgRWxlbWVudHMuCi0KLSMgQ29yZSBNZXRob2QgRWxlbWVudHMKLWFydGlmYWN0PWltYWdlcy9hcnRpZmFjdC5naWYKLWNvbnRlbnRlbGVtZW50PWltYWdlcy9ndWlkYW5jZS5naWYKLWNvbnRlbnRwYWNrYWdlPWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi1kZWxpdmVyYWJsZT1pbWFnZXMvYXJ0aWZhY3QuZ2lmCi1tZXRob2RwbHVnaW49aW1hZ2VzL21ldGhvZF9wbHVnaW4uZ2lmCi1vdXRjb21lPWltYWdlcy9hcnRpZmFjdC5naWYKLXJvbGU9aW1hZ2VzL3JvbGUuZ2lmCi10YXNrPWltYWdlcy90YXNrLmdpZgotCi0jIEd1aWRhbmNlCi1jaGVja2xpc3Q9aW1hZ2VzL2NoZWNrbGlzdC5naWYKLWNvbmNlcHQ9aW1hZ2VzL2NvbmNlcHQuZ2lmCi1leGFtcGxlPWltYWdlcy9leGFtcGxlLmdpZgotZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPWltYWdlcy9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMuZ2lmCi1ndWlkYW5jZT1pbWFnZXMvZ3VpZGFuY2UuZ2lmCi1ndWlkbGluZT1pbWFnZXMvZ3VpZGxpbmUuZ2lmCi1wcmFjdGljZT1pbWFnZXMvcHJhY3RpY2UuZ2lmCi1yb2FkbWFwPWltYWdlcy9yb2FkbWFwLmdpZgotcmVwb3J0PWltYWdlcy9yZXBvcnQuZ2lmCi1yZXVzYWJsZWFzc2V0PWltYWdlcy9yZXVzYWJsZWFzc2V0LmdpZgotc3VwcG9ydGluZ21hdGVyaWFsPWltYWdlcy9zdXBwb3J0aW5nbWF0ZXJpYWwuZ2lmCi10ZWNobmlxdWU9aW1hZ2VzL3RlY2huaXF1ZS5naWYKLXRlbXBsYXRlPWltYWdlcy90ZW1wbGF0ZS5naWYKLXRlcm1kZWZpbml0aW9uPWltYWdlcy90ZXJtZGVmaW5pdGlvbi5naWYKLXRvb2xtZW50b3I9aW1hZ2VzL3Rvb2xtZW50b3IuZ2lmCi13aGl0ZXBhcGVyPWltYWdlcy93aGl0ZXBhcGVyLmdpZgotCi0jIENvbnRlbnQgQ2F0ZWdvcmllcwotY3VzdG9tY2F0ZWdvcnk9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLWRpc2NpcGxpbmU9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLWRpc2NpcGxpbmVncm91cGluZz1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotZG9tYWluPWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi1yb2xlc2V0PWltYWdlcy9jb250ZW50X3BhY2thZ2UuZ2lmCi1yb2xlc2V0Z3JvdXBpbmc9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXRvb2w9aW1hZ2VzL2NvbnRlbnRfcGFja2FnZS5naWYKLXdvcmtwcm9kdWN0dHlwZT1pbWFnZXMvY29udGVudF9wYWNrYWdlLmdpZgotCi0jIFByb2Nlc3MgRWxlbWVudHMKLWFjdGl2aXR5PWltYWdlcy9wcm9jZXNzLmdpZgotY2FwYWJpbGl0eXBhdHRlcm49aW1hZ2VzL3Byb2Nlc3MuZ2lmCi1kZWxpdmVyeXByb2Nlc3M9aW1hZ2VzL3Byb2Nlc3MuZ2lmCi1pdGVyYXRpb249aW1hZ2VzL3Byb2Nlc3MuZ2lmCi1waGFzZT1pbWFnZXMvcHJvY2Vzcy5naWYKLXByb2Nlc3M9aW1hZ2VzL3Byb2Nlc3MuZ2lmCi0KLSMgRGVzY3JpcHRvcnMKLWNvbXBvc2l0ZXJvbGU9aW1hZ2VzL2NvbXBvc2l0ZXJvbGUuZ2lmCi1yb2xlZGVzY3JpcHRvcj1pbWFnZXMvcm9sZWRlc19sZ19kZ20zMi5naWYKLXRhc2tkZXNjcmlwdG9yPWltYWdlcy90YXNrZGVzX2xnX2RnbTMyLmdpZgotdGVhbXByb2ZpbGU9aW1hZ2VzL3RlYW1wcm9maWxlLmdpZgotd29ya3Byb2R1Y3RkZXNjcmlwdG9yPWltYWdlcy93b3JrZGVzX2xnX2RnbTMyLmdpZgotbWlsZXN0b25lPWltYWdlcy9taWxlc3RvbmUuZ2lmCi0KLSMgTWlzYwotZ2VuZXJhbD1pbWFnZXMvZ3VpZGFuY2UuZ2lmCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRMYXlvdXRNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0VsZW1lbnRMYXlvdXRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzRkMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9FbGVtZW50TGF5b3V0TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbS5JQWN0aXZpdHlEaWFncmFtU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWJzdHJhY3RFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5HZW5lcmFsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50TGF5b3V0TWFuYWdlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gRWxlbWVudExheW91dE1hbmFnZXIuY2xhc3MKLQkJCS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRlZmF1bHRfY29uZmlnX3BhdGggPSAibm9jb25maWciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNQdWJsaXNoaW5nTW9kZSA9IGZhbHNlOyAvLyBkZWZhdWx0IHRvIGJyb3dzaW5nIG1vZGUKLQkKLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoX2RpciA9IG51bGw7Ci0KLQlwcml2YXRlIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQotCXByaXZhdGUgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBudWxsOwotCi0JLy8gbmVlZCB0byBzZXBlcmF0ZSB0aGUgYWRhcHRlciBmYWN0b3J5IGZvcm0gY29udGVudCBhbmQgZGlhZ3JhbQotCS8vIGRpYWdyYW0gYWRhcHRvciBmYWN0b3J5IHNob3VsZCBub3QgYmUgcm9sbGVkIHVwCi0JcHJpdmF0ZSBMYXlvdXRBZGFwdGVyRmFjdG9yeSBjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkgPSBudWxsOwotCXByaXZhdGUgTGF5b3V0QWRhcHRlckZhY3RvcnkgZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQkKLQkvLyBjYWNoZSB0aGUgc3VwcHJlc3Npb24gb2JqZWN0IGZvciBwdWJsaXNoaW5nIG1vZGVsIG9ubHkKLQkvLyBtYXAgb2YgcHJvYyBndWlkIHRvIFN1cHByZXNpaW9uIG9iamVjdAkKLQlwcml2YXRlIE1hcCBzdXByZXNzaW9uTWFwID0gbnVsbDsKLQkKLQlwcml2YXRlIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBudWxsOwotCQotCS8vIHRoZSBsYXlvdXQgZXh0ZW5zaW9ucy4gZWFjaCBleHRlbnNpb24gaXMgaWRlbnRpZmllZCBieSB0aGUgcHJvcGVydHkgaWQgb2YgdGhlIGNvbmZpZ3VyYXRpb24KLQlwcml2YXRlIE1hcDxTdHJpbmcsIExheW91dEV4dGVuc2lvbj4gbGF5b3V0RXh0ZW5zaW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGF5b3V0RXh0ZW5zaW9uPigpOwotCQotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaGluZ01vZGUoKQotCXsKLQkJcmV0dXJuIHRoaXMuaXNQdWJsaXNoaW5nTW9kZTsKLQl9Ci0JCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyKCkgewotCQl0aGlzKG51bGwsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcyhjb25maWcsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudExheW91dE1hbmFnZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBwdWJsaXNoZGlyLCBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IsIGJvb2xlYW4gaXNQdWJsaXNoaW5nTW9kZSkgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJdGhpcy5pc1B1Ymxpc2hpbmdNb2RlID0gaXNQdWJsaXNoaW5nTW9kZTsKLQkJCi0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JCX0KLQotCQlpZiAocHVibGlzaGRpciA9PSBudWxsKSB7Ci0JCQlwdWJsaXNoZGlyID0gTGF5b3V0UmVzb3VyY2VzLmdldERlZmF1bHRQdWJsaXNoRGlyKCk7Ci0JCQlpZiAoIXB1Ymxpc2hkaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQkJcHVibGlzaGRpciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJCX0KLQotCQkJLy8gYWxzbyBhcHBlbmQgdGhlIGNvbmZpZ3VyYXRpb24gcGF0aAotCQkJaWYgKHRoaXMuY29uZmlnID09IG51bGwpIHsKLQkJCQlwdWJsaXNoZGlyICs9IGRlZmF1bHRfY29uZmlnX3BhdGg7Ci0JCQl9IGVsc2UgewotCQkJCVN0cmluZyBzdHIgPSBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHRoaXMuY29uZmlnLmdldE5hbWUoKSk7Ci0JCQkJaWYgKCBzdHIgPT0gIiIgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RyID0gSW50ZWdlci50b0hleFN0cmluZyh0aGlzLmNvbmZpZy50b1N0cmluZygpLmhhc2hDb2RlKCkpOwotCQkJCX0KLQkJCQlwdWJsaXNoZGlyICs9IHN0cjsKLQkJCX0KLQkJfQotCi0JCXNldFB1Ymxpc2hEaXIocHVibGlzaGRpcik7Ci0KLQkJY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5ID0gbmV3IExheW91dEFkYXB0ZXJGYWN0b3J5KHRoaXMuY29uZmlnKTsKLQkJZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5ID0gbmV3IExheW91dEFkYXB0ZXJGYWN0b3J5KHRoaXMuY29uZmlnKTsKLQkJCi0JCS8vCWxvYWQgdGhlIGxheW91dCBleHRlbnNpb25zIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24KLQkJbG9hZExheW91dEV4dGVuc2lvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZExheW91dEV4dGVuc2lvbnMoKSB7Ci0JCWlmICggY29uZmlnID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGxvYWQgdGhlIGxheW91dCBleHRlbnNpb25zIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24KLQkJTGlzdCBwcm9wcyA9IGNvbmZpZy5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJaWYgKCBwcm9wcyAhPSBudWxsICYmIHByb3BzLnNpemUoKSA+IDAgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0cCA9IHByb3BzLml0ZXJhdG9yKCk7IGl0cC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSlpdHAubmV4dCgpOwotCQkJCVN0cmluZyBpZCA9IHByb3AuZ2V0TmFtZSgpOwotCQkJCUxheW91dEV4dGVuc2lvbiBleHQ9IExheW91dEV4dGVuc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFeHRlbnNpb24oaWQpOwotCQkJCWlmICggZXh0ICE9IG51bGwgKSB7Ci0JCQkJCWV4dC5pbml0KHRoaXMpOwotCQkJCQlsYXlvdXRFeHRlbnNpb25zLnB1dChpZCwgZXh0KTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXZhbGlkYXRvciA9IG5ldyBEZWZhdWx0Q29udGVudFZhbGlkYXRvcihnZXRQdWJsaXNoRGlyKCkpOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCQotCXB1YmxpYyBFbGVtZW50UmVhbGl6ZXIgZ2V0RWxlbWVudFJlYWxpemVyKCkgewotCQlpZiAoIHJlYWxpemVyID09IG51bGwgKSB7Ci0JCQlyZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQlyZWFsaXplci5zZXRGaWx0ZXIoY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LmdldEZpbHRlcigpKTsKLQkJfQotCQkKLQkJcmV0dXJuIHJlYWxpemVyOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRSZWFsaXplcihFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJdGhpcy5yZWFsaXplciA9IHJlYWxpemVyOwkJCi0JfQotCQotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5Lndic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LnRic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeS53cGJzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkuY2JzQWRhcHRlckZhY3Rvcnk7Ci0JfQotCi0JcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgZ2V0RGlhZ3JhbUFkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5Lndic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKElBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlKSB7Ci0JCXRoaXMuZGlhZ3JhbVNlcnZpY2UgPSBkaWFncmFtU2VydmljZTsKLQl9Ci0KLQlwdWJsaWMgSUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlhZ3JhbVNlcnZpY2U7Ci0JfQotCi0JcHVibGljIFN1cHByZXNzaW9uIGdldFN1cHByZXNzaW9uKFByb2Nlc3MgcHJvYykKLQl7Ci0JCVN1cHByZXNzaW9uIHN1cCA9IG51bGw7Ci0JCWlmICggaXNQdWJsaXNoaW5nTW9kZSkKLQkJewotCQkJaWYgKCBzdXByZXNzaW9uTWFwID09IG51bGwgKQotCQkJewotCQkJCXN1cHJlc3Npb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJfQotCQkJU3RyaW5nIGd1aWQgPSBwcm9jLmdldEd1aWQoKTsKLQkJCXN1cCA9IChTdXBwcmVzc2lvbilzdXByZXNzaW9uTWFwLmdldChndWlkKTsKLQkJCWlmICggc3VwID09IG51bGwgKQotCQkJewotCQkJCXN1cCA9IGNyZWF0ZVN1cHByZXNzaW9uKHByb2MpOwotCQkJCXN1cHJlc3Npb25NYXAucHV0KGd1aWQsIHN1cCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlzdXAgPSBjcmVhdGVTdXBwcmVzc2lvbihwcm9jKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJlcGFyZUFkYXB0b3JGYWN0b3JpZXNGb3JQcm9jZXNzKFByb2Nlc3MgcHJvYykKLQl7Ci0JCS8vIG5lZWQgdG8gaXRlcmF0ZSB0aGUgYWRhcHRvciBmYWN0b3J5IHRvIGdlbmVyYXRlIHRoZSBhZGFwdG9yIHRyZWUKLQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGdldENCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpOwotCQlwcmVwYXJlQWRhcHRlcmZhY3RvcnlGb3IoZ2V0VEJTQWRhcHRlckZhY3RvcnkoKSwgcHJvYyk7Ci0JCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihnZXRXQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQkJcHJlcGFyZUFkYXB0ZXJmYWN0b3J5Rm9yKGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcigKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksIE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiA9PSBudWxsIHx8IGFkYXB0ZXJGYWN0b3J5ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBvYmo7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KG9iaiwKLQkJCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJCS51bndyYXAocmF3aXRlbSk7Ci0JCQkJaWYgKChpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCXByZXBhcmVBZGFwdGVyZmFjdG9yeUZvcihhZGFwdGVyRmFjdG9yeSwgcmF3aXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSUVsZW1lbnRMYXlvdXQgY3JlYXRlTGF5b3V0KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYW4gYWN0aXZpdHksIHdlIG5lZWQgdG8gZmluZWQgdGhlIHBhdGggdG8gdGhlIHByb2Nlc3MKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlQcm9jZXNzIG93bmluZ1Byb2MgPSBudWxsOwotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSApCi0JCXsKLQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSllbGVtZW50OwotCQkJcGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQuZ2V0UGF0aChhY3QpOwotCQkJb3duaW5nUHJvYyA9IFRuZ1V0aWwuZ2V0T3duaW5nUHJvY2VzcyhhY3QpOwotCQl9Ci0JCQotCQlyZXR1cm4gY3JlYXRlTGF5b3V0KGVsZW1lbnQsIG93bmluZ1Byb2MsIHBhdGgpOwotCX0KLQotCXB1YmxpYyBJRWxlbWVudExheW91dCBjcmVhdGVMYXlvdXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJUHJvY2VzcyBvd25pbmdQcm9jLCBTdHJpbmcgcGF0aCkgewotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gbnVsbDsKLQotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlbGVtZW50KSkgewotCQkJY2xhc3NOYW1lID0gIkNvbnRlbnREZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCWNsYXNzTmFtZSA9ICJBY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICgoZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtCcmVha2Rvd25FbGVtZW50KQotCQkJCSYmICEoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSkgewotCQkJY2xhc3NOYW1lID0gIldvcmtCcmVha2Rvd25FbGVtZW50IjsgLy8kTk9OLU5MUy0xJCAgLy8gdGFza2Rlc2NyaXB0b3IgaGFzIGl0J3Mgb3duIGxheW91dAotCQl9IGVsc2UgewotCQkJQ2xhc3MgaVtdID0gZWxlbWVudC5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKTsKLQkJCWlmIChpICE9IG51bGwgJiYgaS5sZW5ndGggPT0gMSkgewotCQkJCWNsYXNzTmFtZSA9IGlbMF0uZ2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQljbGFzc05hbWUgPSBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID49IDApIHsKLQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JCQl9Ci0JCX0KLQotCQljbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLmVsZW1lbnRzLiIgKyBjbGFzc05hbWUgKyAiTGF5b3V0IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJdHJ5IHsKLQkJCUNsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQlpZiAoYyAhPSBudWxsKSB7Ci0JCQkJbGF5b3V0ID0gKEFic3RyYWN0RWxlbWVudExheW91dCkgYy5uZXdJbnN0YW5jZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKGxheW91dCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkxheW91dCBjbGFzcyAnIiArIGNsYXNzTmFtZSArICInIGZvciBlbGVtZW50Ci0JCQkvLyAnIiArIGVsZW1lbnQuZ2V0TmFtZSgpICsgIicgbm90IGRlZmluZWQuIFVzZSBHZW5lcmFsTGF5b3V0Iik7Ci0JCQlsYXlvdXQgPSBuZXcgR2VuZXJhbExheW91dCgpOwotCQl9Ci0KLQkJaWYgKGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpIHsKLQkJCSgoQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCkgbGF5b3V0KS5pbml0KHRoaXMsIGVsZW1lbnQsCi0JCQkJCW93bmluZ1Byb2MsIHBhdGgpOwotCQl9IGVsc2UgewotCQkJbGF5b3V0LmluaXQodGhpcywgZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQotCXB1YmxpYyBJRWxlbWVudExheW91dCBnZXRMYXlvdXQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGNyZWF0ZSkgewotCQkvLyBTdHJpbmcgaWQgPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gbnVsbDsgLy8gKElFbGVtZW50TGF5b3V0KWxheW91dE1hcC5nZXQoaWQpOwotCQlpZiAoKGxheW91dCA9PSBudWxsKSAmJiBjcmVhdGUpIHsKLQkJCWxheW91dCA9IGNyZWF0ZUxheW91dChlbGVtZW50KTsKLQkJCS8vIGxheW91dE1hcC5wdXQoaWQsIGxheW91dCk7Ci0JCX0KLQotCQlyZXR1cm4gbGF5b3V0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9wYXJhbWV0ZXJzID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSJcXD9wcm9jPSguKj8pJnBhdGg9KC4qKT8iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJRWxlbWVudExheW91dCBnZXRMYXlvdXQoU3RyaW5nIHVybCkgewotCi0JCVByb2Nlc3Mgb3duaW5nUHJvYyA9IG51bGw7Ci0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQotCQlNYXRjaGVyIG0gPSBwX3BhcmFtZXRlcnMubWF0Y2hlcih1cmwpOwotCQlpZiAobS5maW5kKCkpIHsKLQkJCVN0cmluZyBwcm9jID0gbS5ncm91cCgxKTsKLQkJCXBhdGggPSBtLmdyb3VwKDIpOwotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJb3duaW5nUHJvYyA9IChQcm9jZXNzKSBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoCi0JCQkJCQlwcm9jKTsKLQkJCX0KLQkJfQotCi0JCS8vIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KXVybE1hcC5nZXQodXJsKTsKLQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gUmVzb3VyY2VIZWxwZXIuZ2V0RWxlbWVudEZyb21GaWxlTmFtZSh1cmwpOwotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY3JlYXRlTGF5b3V0KGVsZW1lbnQsIG93bmluZ1Byb2MsIHBhdGgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW4ndCBmaW5kIGVsZW1lbnQgZm9yIHVybCAnIiArIHVybCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRRdWVyeVN0cmluZyhTdHJpbmcgcHJvYywgU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuICI/IiArIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUFJPQ0VTUyArICI9IiArIHByb2MgKyAiJiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkrIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUEFUSCArICI9IiArIHBhdGg7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb25maWc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgcGF0aCkgewotCQl0aGlzLnB1Ymxpc2hfZGlyID0gcGF0aDsKLQkJaWYgKCAhdGhpcy5wdWJsaXNoX2Rpci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgKSB7Ci0JCQl0aGlzLnB1Ymxpc2hfZGlyICs9IEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0KLQkJLy8gaW5pdGlhbGl6ZSBwdWJsaXNoaW5nIHNpdGUgaWYgbmVlZGVkCi0JCWluaXRfcHVibGlzaGluZ1NpdGUoKTsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaF9kaXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRfcHVibGlzaGluZ1NpdGUoKSB7Ci0JCWlmICggQnJvd3NpbmdMYXlvdXRTZXR0aW5ncy5JTlNUQU5DRS5uZWVkVXBkYXRlKHB1Ymxpc2hfZGlyKSApIHsKLQkJCWlmICggTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKSApIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiQmVnaW4gaW5pdGlhbGl6aW5nIHB1Ymxpc2hpbmcgc2l0ZTogIiArIHB1Ymxpc2hfZGlyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQkvLyBjb3B5IHRoZSBsYXlvdXQgZmlsZXMgZnJvbSBwbHVnaW4gbGF5b3V0IHRvIHB1Ymxpc2hpZ24gc2l0ZQotCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlMYXlvdXRGaWxlcyhwdWJsaXNoX2Rpcik7Ci0JCi0JCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbmQgaW5pdGlhbGl6aW5nIHB1Ymxpc2hpbmcgc2l0ZTogIiArIHB1Ymxpc2hfZGlyKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCBjb3B5TGlicmFyeVJlc291cmNlcygpIHsKLS8vCQlpZiAoIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCkgKSB7Ci0vLwkJCVN5c3RlbS5vdXQKLS8vCQkJCQkucHJpbnRsbigiQmVnaW4gY29weWluZyBsaWJyYXJ5IHJlc291cmNlcyB0byBwdWJsaXNoaW5nIHNpdGU6ICIgKyBwdWJsaXNoX2Rpcik7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gY29weSBsaWJyYXJ5IHJlc291cmNlcyBmcm9tIGxpYnJhcnkgdG8gcHVibGlzaGluZyBzaXRlCi0vLwkJRmlsZSBsaWJSb290ID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSk7Ci0vLwkJaWYgKGxpYlJvb3QgIT0gbnVsbCkgewotLy8JCQlMYXlvdXRSZXNvdXJjZXMuY29weURpcihsaWJSb290LmdldFBhdGgoKSwgcHVibGlzaF9kaXIpOwotLy8JCX0KLS8vCi0vLwkJaWYgKCBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpICkgewotLy8JCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJLnByaW50bG4oIkVuZCBjb3B5aW5nIGxpYnJhcnkgcmVzb3VyY2VzIHRvIHB1Ymxpc2hpbmcgc2l0ZTogIiArIHB1Ymxpc2hfZGlyKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQkvLyBsYXlvdXRNYXAuY2xlYXIoKTsKLQkJCi0JCWRpYWdyYW1TZXJ2aWNlID0gbnVsbDsKLQkJCi0JCWlmICggc3VwcmVzc2lvbk1hcCAhPSBudWxsICkKLQkJewotCQkJc3VwcmVzc2lvbk1hcC5jbGVhcigpOwotCQl9Ci0JCQotCQlsYXlvdXRFeHRlbnNpb25zLmNsZWFyKCk7Ci0JCWxheW91dEV4dGVuc2lvbnMgPSBudWxsOwotCQkKLQkJY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5LmNsZWFyKCk7Ci0JCWRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeS5jbGVhcigpOwotCQkKLQkJaWYgKCB2YWxpZGF0b3IgIT0gbnVsbCApCi0JCXsKLQkJCXZhbGlkYXRvci5kaXNwb3NlKCk7Ci0JCQl2YWxpZGF0b3IgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoIHJlYWxpemVyICE9IG51bGwgKSB7Ci0JCQlyZWFsaXplci5kaXNwb3NlKCk7Ci0JCQlyZWFsaXplciA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmICggY29udGVudExheW91dEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwgKSB7Ci0JCQljb250ZW50TGF5b3V0QWRhcHRlckZhY3RvcnkuY2xlYXIoKTsKLQkJCWNvbnRlbnRMYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG51bGw7CQkJCi0JCX0KLQkJCi0JCWlmICggZGlhZ3JhbUxheW91dEFkYXB0ZXJGYWN0b3J5ICE9IG51bGwgKSB7Ci0JCQlkaWFncmFtTGF5b3V0QWRhcHRlckZhY3RvcnkuY2xlYXIoKTsKLQkJCWRpYWdyYW1MYXlvdXRBZGFwdGVyRmFjdG9yeSA9IG51bGw7CQkJCi0JCX0KLQkJIAotCX0KLQotCXB1YmxpYyBjbGFzcyBMYXlvdXRBZGFwdGVyRmFjdG9yeQotCXsKLQkJcHVibGljIENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3Rvcnkgd2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQlwdWJsaWMgQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSB0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHdwYnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCXB1YmxpYyBDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGNic0FkYXB0ZXJGYWN0b3J5ID0gbnVsbDsKLQotCQlQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIgY29uZmlndXJhdG9yID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBMYXlvdXRBZGFwdGVyRmFjdG9yeShNZXRob2RDb25maWd1cmF0aW9uIG1ldGhvZENvbmZpZykKLQkJewotCQkJLy8gY3JlYXRlIGFkYXB0IGZhY3RvcmllcwotCQkJLy8KLQkJCWlmKGlzUHVibGlzaGluZ01vZGUoKSkgewotCQkJCXdic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVB1Ymxpc2hpbmdXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVB1Ymxpc2hpbmdUQlNBZGFwdGVyRmFjdG9yeSgpOwotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVQdWJsaXNoaW5nV1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUHVibGlzaGluZ0NCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXQlNDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQkJdGJzQWRhcHRlckZhY3RvcnkgPSAoQ29uZmlndXJhYmxlQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSkgVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlVEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeSA9IChDb25maWd1cmFibGVDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5jcmVhdGVXUEJTQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQkJCWNic0FkYXB0ZXJGYWN0b3J5ID0gKENvbmZpZ3VyYWJsZUNvbXBvc2VkQWRhcHRlckZhY3RvcnkpIFRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJLmNyZWF0ZVByb2Nlc3NDb21wb3NlZEFkYXB0ZXJGYWN0b3J5KCk7Ci0JCQl9Ci0KLQkJCS8vIHNldCBjb25maWd1cmF0aW9uIGZpbHRlcgotCQkJY29uZmlndXJhdG9yID0gbmV3IFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlcihtZXRob2RDb25maWcsIHRoaXMpOwotCi0JCQl3YnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIoY29uZmlndXJhdG9yKTsKLQkJCXRic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihjb25maWd1cmF0b3IpOwotCQkJY2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKGNvbmZpZ3VyYXRvcik7CQkKLQkJfQotCQkKLQkJcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2xlYXIoKQotCQl7Ci0JCQkKLQkJCWlmICh3YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJd2JzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKG51bGwpOwotCQkJCXdic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh0YnNBZGFwdGVyRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJdGJzQWRhcHRlckZhY3Rvcnkuc2V0RmlsdGVyKG51bGwpOwotCQkJCXRic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl0YnNBZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmICh3cGJzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCXdwYnNBZGFwdGVyRmFjdG9yeS5zZXRGaWx0ZXIobnVsbCk7Ci0JCQkJd3Bic0FkYXB0ZXJGYWN0b3J5LmRpc3Bvc2UoKTsKLQkJCQl3cGJzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCi0JCQlpZiAoY2JzQWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNic0FkYXB0ZXJGYWN0b3J5LnNldEZpbHRlcihudWxsKTsKLQkJCQljYnNBZGFwdGVyRmFjdG9yeS5kaXNwb3NlKCk7Ci0JCQkJY2JzQWRhcHRlckZhY3RvcnkgPSBudWxsOwotCQkJfQotCQkJCi0JCQlpZiAoIGNvbmZpZ3VyYXRvciAhPSBudWxsICkgewotCQkJCWNvbmZpZ3VyYXRvci5kaXNwb3NlKCk7Ci0JCQkJY29uZmlndXJhdG9yID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN1cHByZXNzaW9uIGNyZWF0ZVN1cHByZXNzaW9uKFByb2Nlc3MgcHJvYykgewotCQkvLyBjaGVjayBpZiB0aGVyZSBhcmUgZXh0ZW5zaW9ucwotCQlpZiAoIGxheW91dEV4dGVuc2lvbnMgIT0gbnVsbCAmJiBsYXlvdXRFeHRlbnNpb25zLnNpemUoKSA+IDAgKSB7Ci0JCQlmb3IgKCBJdGVyYXRvcjxMYXlvdXRFeHRlbnNpb24+IGl0ID0gbGF5b3V0RXh0ZW5zaW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCUxheW91dEV4dGVuc2lvbiBleHQgPSBpdC5uZXh0KCk7Ci0JCQkJU3VwcHJlc3Npb24gc3VwID0gZXh0LmdldFN1cHByZXNzaW9uKHByb2MpOwotCQkJCWlmICggc3VwICE9IG51bGwgKSB7Ci0JCQkJCXJldHVybiBzdXA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbmV3IFN1cHByZXNzaW9uKHByb2MpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9FbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODA4ZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9FbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuSUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGxvYWRzIGFuZCBtYW5hZ2VzIGFueSBlbGVtZW50UHJvcGVydHlQcm92aWRlcyByZWdpc3RlcmVkLiBUaGlzIGNsYXNzIHJ1bnMgYXMgYSBzaW5nbGV0b24uCi0gKiAKLSAqIEBhdXRob3IgUGllcnJlIFBhZG92YW5pCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyIHsKLQotICAvKioKLSAgICogVGhlIGV4dGVuc2lvbiBwb2ludCBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfTkFNRSA9ICJlbGVtZW50UHJvcGVydHlQcm92aWRlcnMiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIFRoZSAiY2xhc3MiIGF0dHJpYnV0ZSBuYW1lLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCX05BTUUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLSAgcHJpdmF0ZSBzdGF0aWMgRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyIG15c2VsZjsKLSAgCi0gIHByaXZhdGUgQXJyYXlMaXN0PElFbGVtZW50UHJvcGVydHlQcm92aWRlcj4gcHJvdmlkZXJzOwotICAKLSAgcHJpdmF0ZSBFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIoKSB7Ci0gICAgLy8gcHJpdmF0ZSB0byBhdm9pZCBvdXRzaWRlIGNhbGxzCi0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLSAgICogCi0gICAqIEByZXR1cm4gRWxlbWVudFByb3BlcnR5UHJvdmlkZXJNYW5hZ2VyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAobXlzZWxmID09IG51bGwpIHsKLSAgICAgIG15c2VsZiA9IG5ldyBFbGVtZW50UHJvcGVydHlQcm92aWRlck1hbmFnZXIoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG15c2VsZjsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgbGV2ZXJhZ2UgdGhlIGVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVycyBleHRlbnNpb24gcG9pbnQgdG8gYWRkIGFkZGl0aW9uYWwgCi0gICAqIGN1c3RvbSBwcm9wZXJ0aWVzIHRvIHRoZSB4bWwgZG9jdW1lbnQgdXNlZCB0byBwdWJsaXNoIGFnYWluc3QgdGhlIFhTTFQgdGVtcGxhdGVzLiBBIG5ldyBjaGlsZAotICAgKiBlbGVtZW50IHdpbGwgYmUgY3JlYXRlZCBiYXNlZCBvbiB0aGUgbmFtZSBwcm92aWRlIGJ5IHRoZSBwcm92aWRlci4KLSAgICogCi0gICAqIEBwYXJhbSBlbGVtZW50Ci0gICAqICAgICAgIE1ldGhvZEVsZW1lbnQKLSAgICogQHBhcmFtIGRvY3VtZW50Ci0gICAqICAgICAgIFhtbEVsZW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvYWRBZGRpdGlvbmFsRWxlbWVudFByb3BlcnRpZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBYbWxFbGVtZW50IGRvY3VtZW50KSB7Ci0gICAgLy8gTG9hZCB0aGUgcHJvdmlkZXJzIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIGxvYWRlZCBhbHJlYWR5LgotICAgIGlmIChwcm92aWRlcnMgPT0gbnVsbCkgewotICAgICAgbG9hZFByb3ZpZGVycygpOwotICAgIH0KLSAgCi0gICAgLy8gTm93IGZvciBlYWNoIHByb3ZpZGVyIGhhdmUgdGhlbSBsb2FkIHByb3BlcnRpZXMgYXMgbmVlZGVkLiBJZiBhIG51bGwgaXMgcmV0dXJuZWQgZm9yIHRoZSBuYW1lLCAKLSAgICAvLyBza2lwIHRoZSBwcm92aWRlci4KLSAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBwcm92aWRlcnMuc2l6ZSgpOyBpZHggKyspIHsKLSAgICAgIElFbGVtZW50UHJvcGVydHlQcm92aWRlciBwcm92aWRlciA9IHByb3ZpZGVycy5nZXQoaWR4KTsKLSAgICAgIFN0cmluZyBjaGlsZE5hbWUgPSBwcm92aWRlci5nZXRDaGlsZEVsZW1lbnROYW1lKGVsZW1lbnQpOwotICAgICAgaWYgKGNoaWxkTmFtZSAhPSBudWxsICYmIGNoaWxkTmFtZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgWG1sRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBkb2N1bWVudC5uZXdDaGlsZChjaGlsZE5hbWUpOwotICAgICAgICBwcm92aWRlci5wdWJsaXNoTWV0aG9kRWxlbWVudFByb3BlcnRpZXMoZWxlbWVudCwgY2hpbGRFbGVtZW50KTsKLSAgICAgIH0KLSAgICB9IAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgbG9hZFByb3ZpZGVycygpIHsKLSAgICBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PElFbGVtZW50UHJvcGVydHlQcm92aWRlcj4oKTsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotICAgICAgICBFWFRFTlNJT05fUE9JTlRfTkFNRVNQQUNFLCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0gICAgaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLSAgICAgIElFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIElFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLSAgICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLSAgICAgICAgICAgIC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotICAgICAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByb3ZpZGVycy5hZGQoKElFbGVtZW50UHJvcGVydHlQcm92aWRlcikgY29uZmlnRWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKENMQVNTX0FUVFJJQl9OQU1FKSk7Ci0gICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICAKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSHRtbEJ1aWxkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSHRtbEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzOWRkMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0h0bWxCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuSTE4blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmcy5QcmVmZXJlbmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5DYWxlbmRhcjsKLQotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBwYWdlIGZvciBhIE1ldGhvZCBlbGVtZW50LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIdG1sQnVpbGRlciB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKLQotCXByaXZhdGUgUHJvcGVydGllcyB4c2xQYXJhbXMgPSBudWxsOwotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlciBtZ3IgPSBudWxsOwotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlciBpbnRlcm5hbF9tZ3IgPSBudWxsOwotCi0JLy9wcml2YXRlIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2NhbkNvbnRlbnQgPSB0cnVlOwotCi0JLy8gSWYgdHJ1ZSwgZGlzcGxheSB0aGUgIlNob3cgdHJlZSBicm93c2UiIGltYWdlL2xpbmsgdG8gdGhlIHJpZ2h0IG9mIGEKLQkvLyBwdWJsaXNoZWQgcGFnZS4KLQlwcml2YXRlIGJvb2xlYW4gc2hvd1RyZWVCcm93c2VyID0gZmFsc2U7Ci0KLQkvL3ByaXZhdGUgSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQotCS8vIG92ZXJyaWRlIHRoaXMgcGF0aCB0byBzcGVjaWZ5IHhzbCBwYXRoCi0JcHJpdmF0ZSBTdHJpbmcgbGF5b3V0WHNsUm9vdFBhdGggPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXlvdXRYc2xQYXRoKCk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSHRtbEJ1aWxkZXIoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSHRtbEJ1aWxkZXIoRWxlbWVudExheW91dE1hbmFnZXIgbWdyKSB7Ci0JCWluaXQoKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihtZ3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXRYc2xSb290UGF0aChTdHJpbmcgcGF0aCkgewotCQl0cnkgewotCQkJaWYgKCBwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDAgKSB7Ci0JCQkJdGhpcy5sYXlvdXRYc2xSb290UGF0aCA9IHBhdGg7Ci0JCQkJaWYgKCAhdGhpcy5sYXlvdXRYc2xSb290UGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgKSB7Ci0JCQkJCXRoaXMubGF5b3V0WHNsUm9vdFBhdGggKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGdldCB0aGUgbG9jYWxpemVkIGZpbGUKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0aGlzLmxheW91dFhzbFJvb3RQYXRoLCAicmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJCVN0cmluZyBsb2NhbEZpbGVOYW1lID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBsb2NhbGUpOwotCQkJCWlmICggbG9jYWxGaWxlTmFtZSAhPSBudWxsICkgewotCQkJCQlmaWxlID0gbmV3IEZpbGUobG9jYWxGaWxlTmFtZSk7Ci0JCQkJfQotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXhzbFBhcmFtcy5sb2FkKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJCX0JCi0JCQkJCi0JCQkJLy8gdGhlIFByZWZlcmVuY2VVdGlsIGFsc28gdXNlcyB0aGUgeHNsIHByb3BlcnRpZXMgZm9yIGFjdGl2aXR5IGJyZWFrZG93biBsYXlvdXQKLQkJCQkvLyBzbyBzZXQgaXQgYXMgd2VsbAotCQkJCVByZWZlcmVuY2VVdGlsLnNldFhzbFByb3BlcnRpZXMoeHNsUGFyYW1zKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2FkRGVmYXVsdExheW91dFhzbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWREZWZhdWx0TGF5b3V0WHNsKCkgewotCQlsYXlvdXRYc2xSb290UGF0aCA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFhzbFBhdGgoKTsKLQkJdHJ5IHsKLQkJCXhzbFBhcmFtcyA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByb3BlcnRpZXMoCi0JCQkJCSIvbGF5b3V0L3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIGFkZCB0aGUgY29sb24gcHJvcGVydHksIAotCQkJeHNsUGFyYW1zLnB1dCgiY29sb25fd2l0aF9zcGFjZSIsIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJLy8gdGhlIFByZWZlcmVuY2VVdGlsIGFsc28gdXNlcyB0aGUgeHNsIHByb3BlcnRpZXMgZm9yIGFjdGl2aXR5IGJyZWFrZG93biBsYXlvdXQKLQkJCS8vIHNvIHNldCBpdCBhcyB3ZWxsCi0JCQlQcmVmZXJlbmNlVXRpbC5zZXRYc2xQcm9wZXJ0aWVzKHhzbFBhcmFtcyk7Ci0KLQkJCQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl4c2xQYXJhbXMgPSBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcigpIHsKLQkJcmV0dXJuIChtZ3IgPT0gbnVsbCkgPyBudWxsIDogbWdyLmdldFB1Ymxpc2hEaXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyBkaXIpIHsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQltZ3Iuc2V0UHVibGlzaERpcihkaXIpOwotCQl9Ci0KLQkJLy9nZXRTY2FubmVyKCkuc2V0VGFyZ2V0Um9vdFBhdGgobmV3IEZpbGUoZ2V0UHVibGlzaERpcigpKSk7Ci0KLQkJLy8gUmVzZXQgdGhlIHZhbGlkYXRvcidzIHB1Ymxpc2ggZGlyLgotCQlnZXRWYWxpZGF0b3IoKS5zZXRQdWJsaXNoRGlyKGRpcik7Ci0JfQotCi0vLwkvKioKLS8vCSAqIFNldHMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yLgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0vLwkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0vLwkJZ2V0U2Nhbm5lcigpLnNldFZhbGlkYXRvcih0aGlzLnZhbGlkYXRvcik7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotLy8JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotLy8JCQl2YWxpZGF0b3IgPSBuZXcgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IoZ2V0UHVibGlzaERpcigpKTsKLS8vCQl9Ci0vLwkJcmV0dXJuIHZhbGlkYXRvcjsKLQkJCi0JCXJldHVybiB0aGlzLm1nci5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogUmV0dXJucyB0aGUgY29udGVudCByZXNvdXJjZSBzY2FubmVyIGZvciB0aGUgZWxlbWVudC4KLS8vCSAqLwotLy8JcHJpdmF0ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIGdldFNjYW5uZXIoTWV0aG9kRWxlbWVudCBvd25lcikgewotLy8JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKG93bmVyKTsKLS8vCQlpZiAoIHJlc01nciA9PSBudWxsICkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJCi0vLwkJU3RyaW5nIHJvb3RDb250ZW50UGF0aCA9IHJlc01nci5nZXRMb2dpY2FsUGx1Z2luUGF0aChvd25lcik7Ci0vLwkJRmlsZSBzcmNfcm9vdCA9IG5ldyBGaWxlKHJlc01nci5nZXRQaHlzaWNhbFBsdWdpblBhdGgob3duZXIpKTsKLS8vCQlGaWxlIHRndF9yb290ID0gbmV3IEZpbGUoZ2V0UHVibGlzaERpcigpLCByb290Q29udGVudFBhdGgpOwotLy8JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBDb250ZW50UmVzb3VyY2VTY2FubmVyKHNyY19yb290LCB0Z3Rfcm9vdCwgcm9vdENvbnRlbnRQYXRoLCBnZXRWYWxpZGF0b3IoKSk7Ci0vLwotLy8JCXJldHVybiBzY2FubmVyOwotLy8JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmxhZyB0byBkaXNwbGF5IHRoZSAiU2hvdyB0cmVlIGJyb3dzZXIiIGltYWdlL2xpbmsuCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlVHJlZUJyb3dzZXIoYm9vbGVhbiBmbGFnKSB7Ci0JCXRoaXMuc2hvd1RyZWVCcm93c2VyID0gZmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIGNvbnRlbnQgc2Nhbm5pbmcuCi0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlQ29udGVudFNjYW4oYm9vbGVhbiBzY2FuKSB7Ci0JCXRoaXMuc2NhbkNvbnRlbnQgPSBzY2FuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29udGVudCBzY2FubmluZyBpcyBlbmFibGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRlbnRTY2FuRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHNjYW5Db250ZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIuCi0JICogPHA+Ci0JICogQSBFbGVtZW50IExheW91dCBNYW5hZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0TWFuYWdlcihFbGVtZW50TGF5b3V0TWFuYWdlciBtZ3IpIHsKLQkJdGhpcy5tZ3IgPSBtZ3I7Ci0JCWlmICh0aGlzLm1nciA9PSBudWxsKSB7Ci0JCQl0aGlzLm1nciA9IGdldERlZmF1bHRMYXlvdXRNYW5hZ2VyKCk7IAotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBzY2FubmVyIHRhcmdldCBwYXRoLgotCQkvL2dldFNjYW5uZXIoKS5zZXRUYXJnZXRSb290UGF0aChuZXcgRmlsZShnZXRQdWJsaXNoRGlyKCkpKTsKLQotCQkvLyBSZXNldCB0aGUgdmFsaWRhdG9yIHB1YiBkaXIuCi0JCWdldFZhbGlkYXRvcigpLnNldFB1Ymxpc2hEaXIoZ2V0UHVibGlzaERpcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXREZWZhdWx0TGF5b3V0TWFuYWdlcigpIHsKLQkJaWYgKCB0aGlzLmludGVybmFsX21nciA9PSBudWxsICkgewotCQkJdGhpcy5pbnRlcm5hbF9tZ3IgPSBuZXcgRWxlbWVudExheW91dE1hbmFnZXIoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxfbWdyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEVsZW1lbnQgTGF5b3V0IE1hbmFnZXIuCi0JICovCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1hbmFnZXIoKSB7Ci0JCWlmICh0aGlzLm1nciA9PSBudWxsKSB7Ci0JCQl0aGlzLm1nciA9IGdldERlZmF1bHRMYXlvdXRNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG1ncjsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgZm9yIGEgTWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIGVsZW1lbnQuCi0JICogQHJldHVybiBBIHVybCBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQgSFRNTCBmaWxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVIdG1sKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJSUVsZW1lbnRMYXlvdXQgbGF5b3V0ID0gZ2V0TGF5b3V0TWFuYWdlcigpLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLQkJCXVybCA9IGdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQkJbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJUaW1lIHRha2VuIHRvIHJlbmRlciBIVE1MIHBhZ2UgZm9yICIgKyBlbGVtZW50LmdldE5hbWUoKSArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkiOiAiICsgKGVuZFRpbWUgLSBzdGFydFRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIHsKLQkJCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGdldExheW91dE1hbmFnZXIoKS5nZXRMYXlvdXQoZWxlbWVudCwgdHJ1ZSk7Ci0JCQl1cmwgPSBnZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFRoZSBVUkwgb2YgYSBNZXRob2QgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZUh0bWwoU3RyaW5nIHVybCkgewotCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBnZXRMYXlvdXRNYW5hZ2VyKCkuZ2V0TGF5b3V0KHVybCk7Ci0JCWdlbmVyYXRlSHRtbChsYXlvdXQpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBFbGVtZW50LiBMYXlvdXQgb2JqZWN0LgotCSAqIEBwYXJhbSBsaW5rZWRFbGVtZW50cwotCSAqICAgICAgICAgICAgSWYgbm90IG51bGwsIHRoaXMgb2JqZWN0IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSBsaXN0IG9mCi0JICogICAgICAgICAgICBsaW5rZWQgZWxlbWVudHMgaW4gdGhlIHBhZ2UuCi0JICogQHJldHVybiBBIHVybCBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQgSFRNTCBmaWxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVIdG1sKElFbGVtZW50TGF5b3V0IGxheW91dCkgewotCQlpZiAobGF5b3V0ID09IG51bGwpIHsKLQkJCXJldHVybiAiYWJvdXQ6YmxhbmsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIGdlbmVyYXRlSHRtbDogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxheW91dC5nZXRFbGVtZW50KCkpICk7Ci0JCQotCQkvLyBhZGQgdGltZSBsb2dnaW5nIHdoZW4gcHVibGlzaGluZyBlbGVtZW50Ci0JCWxvbmcgdGltZV9zdGFydCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCk7Ci0JCVN0cmluZyBlbGVtZW50UGF0aCA9IGxheW91dC5nZXRGaWxlUGF0aCgpLnJlcGxhY2UoJy8nLAotCQkJCUZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCVN0cmluZyBlbGVtZW50UGF0aE5hbWUgPSBlbGVtZW50UGF0aAotCQkJCSsgbGF5b3V0LmdldEZpbGVOYW1lKFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQlTdHJpbmcgZmlsZVBhdGggPSB0aGlzLmdldFB1Ymxpc2hEaXIoKSArIGVsZW1lbnRQYXRoOwotCQlTdHJpbmcgaHRtbF9maWxlID0gdGhpcy5nZXRQdWJsaXNoRGlyKCkgKyBlbGVtZW50UGF0aE5hbWU7Ci0KLQkJdHJ5IHsKLQotCQkJU3RyaW5nQnVmZmVyIHhtbCA9IGdldFhtbChsYXlvdXQpOwotCi0JCQlTdHJpbmcgeHNsX3VyaTsKLQotCQkJRmlsZSBmID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotCQkJaWYgKCFmLmV4aXN0cygpKSB7Ci0JCQkJZi5ta2RpcnMoKTsKLQkJCX0KLQotCQkJLy8gR2VuZXJhdGUgdGhlIGFkZGl0b25hbCBvdXRwdXRzLgotCQkJTGlzdCBsYXlvdXRzID0gbGF5b3V0LmdldExheW91dHMoKTsKLQkJCXhzbF91cmkgPSBsYXlvdXRYc2xSb290UGF0aCArIGxheW91dC5nZXRYc2xVcmwoKTsKLQkJCWdlbmVyYXRlSHRtbChsYXlvdXQsIHhzbF91cmksIGh0bWxfZmlsZSwgeG1sKTsKLQotCQkJLy8gR2VuZXJhdGUgb3RoZXIgbGF5b3V0IGZpbGVzLgotCQkJaWYgKGxheW91dHMgIT0gbnVsbCAmJiBsYXlvdXRzLnNpemUoKSA+IDApIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbGF5b3V0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUxheW91dEluZm8gaW5mbyA9IChMYXlvdXRJbmZvKSBpdC5uZXh0KCk7Ci0JCQkJCXhzbF91cmkgPSBsYXlvdXRYc2xSb290UGF0aCArIGluZm8ubGF5b3V0X3hzbDsKLQkJCQkJU3RyaW5nIGZpbGUgPSBmaWxlUGF0aCArIGluZm8uZmlsZU5hbWU7Ci0JCQkJCWdlbmVyYXRlSHRtbChsYXlvdXQsIHhzbF91cmksIGZpbGUsIHhtbCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCWh0bWxfZmlsZSA9IG51bGw7Ci0JCX0KLQotCQlsb25nIHRpbWVfZW5kID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKTsKLQkJbG9uZyBtaW5pX3NlY29uZHMgPSB0aW1lX2VuZCAtIHRpbWVfc3RhcnQ7Ci0JCWlmIChtaW5pX3NlY29uZHMgPiAxMDAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gbWluaV9zZWNvbmRzCi0JCQkJCSsgIiBtaW5pLXNlY29uZChzKSBwdWJsaXNoaW5nIGVsZW1lbnQgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGxheW91dC5nZXRFbGVtZW50KCkpICsgIlsiICsgZWxlbWVudFBhdGhOYW1lICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0VmFsaWRhdG9yKCk7Ci0JCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmFsaWRhdG9yLmxvZ0luZm8obXNnKTsKLQkJCX0KLQkJfQotCQlpZiAoaHRtbF9maWxlICE9IG51bGwpIHsKLQkJCXJldHVybiBodG1sX2ZpbGU7Ci0JCX0KLQotCQlyZXR1cm4gImFib3V0OmJsYW5rIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgYSBNZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0Ci0JICogICAgICAgICAgICBBIE1ldGhvZCBFbGVtZW50LiBMYXlvdXQgb2JqZWN0LgotCSAqIEBwYXJhbSB4c2xVUkkKLQkgKiAgICAgICAgICAgIFRoZSBYU0wgc3R5bGVzaGVldC4KLQkgKiBAcGFyYW0gaHRtbEZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBIVE1MIGZpbGUgdG8gYmUgZ2VuZXJhdGVkLgotCSAqIEBwYXJhbSB4bWwKLQkgKiAgICAgICAgICAgIFRoZSBYTUwgYnVmZmVyLgotCSAqIEByZXR1cm4gQSB1cmwgb2YgdGhlIGdlbmVyYXRlZCBjb250ZW50IEhUTUwgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVIdG1sKElFbGVtZW50TGF5b3V0IGxheW91dCwKLQkJCVN0cmluZyB4c2xfdXJpLCBTdHJpbmcgaHRtbF9maWxlLCBTdHJpbmdCdWZmZXIgeG1sKSB7Ci0JCVRocm93YWJsZSB0aCA9IG51bGw7Ci0JCWlmIChsYXlvdXQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVGltZXIgdGltZXIgPSBudWxsOwotCQlpZiAoIGRlYnVnICkgewotCQkJdGltZXIgPSBuZXcgVGltZXIoKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIHN3KTsKLQkJCXN3LmZsdXNoKCk7Ci0JCQlTdHJpbmcgY29udGVudCA9IHN3LmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0KLQkJCWlmICggZGVidWcpIHsKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGZvciB4bWwveHNsdCB0cmFuc2Zvcm1hdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGltZXIuc3RhcnQoKTsKLQkJCX0KLQkJCS8vIEFsd2F5cyB2YWxpZGF0ZSBhbmQgZml4IHRoZSBjb250ZW50IGJlZm9yZSBwdWJsaXNoaW5nLgotCQkJY29udGVudCA9IFJlc291cmNlSGVscGVyLnZhbGlkYXRlQ29udGVudChsYXlvdXQuZ2V0RWxlbWVudCgpLAotCQkJCQljb250ZW50LCBnZXRWYWxpZGF0b3IoKSwgbGF5b3V0LmdldExheW91dE1ncigpCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKSwgdGhpcy5sYXlvdXRYc2xSb290UGF0aCk7Ci0JCQlpZiAoY29udGVudFNjYW5FbmFibGVkKCkpIHsKLS8vCQkJCXNjYW5Db250ZW50Rm9yUmVzb3VyY2VzKGxheW91dC5nZXRFbGVtZW50KCksIGNvbnRlbnQsIGxheW91dAotLy8JCQkJCQkuZ2V0RmlsZVBhdGgoKSk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkuc2NhbkNvbnRlbnQobGF5b3V0LCBjb250ZW50KTsKLQkJCX0KLQotCQkJaWYgKCBkZWJ1ZykgewotCQkJCXRpbWVyLnN0b3AoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgc2Nhbm5pbmcgY29udGVudCIpOyAvLyROT04tTkxTLTEkCi0JCQkJdGltZXIuc3RhcnQoKTsKLQkJCX0KLQkJCQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGh0bWxfZmlsZSksICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXRwdXQud3JpdGUoY29udGVudCk7Ci0JCQlvdXRwdXQuZmx1c2goKTsKLQkJCW91dHB1dC5jbG9zZSgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl0aCA9IGU7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGggPSBlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGggPSBlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXRoID0gZTsKLQkJfQotCi0JCWlmICh0aCAhPSBudWxsKSB7Ci0JCQl0aGlzLmdldFZhbGlkYXRvcigpLmxvZ0Vycm9yKGxheW91dC5nZXRFbGVtZW50KCksCi0JCQkJCSJFcnJvciBnZW5lcmF0aW5nIGVsZW1lbnQgY29udGVudCIsIHRoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIHRoZSBIVE1MIGZvciBhIE1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXQKLQkgKiAgICAgICAgICAgIEEgTWV0aG9kIEVsZW1lbnQuIExheW91dCBvYmplY3QuCi0JICogQHJldHVybiBBIHVybCBvZiB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQgSFRNTCBmaWxlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGdldFhtbChJRWxlbWVudExheW91dCBsYXlvdXQpIHsKLQkJU3RyaW5nQnVmZmVyIHhtbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0gbGF5b3V0LmdldFhtbEVsZW1lbnQodHJ1ZSk7Ci0JCQotCQkvLyBzZXQgdGhlIGxhbmd1YWdlIGF0dHJpYnV0ZQotCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQkJU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJeG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChzaG93VHJlZUJyb3dzZXIpIHsKLQkJCXhtbEVsZW1lbnQuc2V0QXR0cmlidXRlKCJzaG93VHJlZUJyb3dzZXIiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXhtbC5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh4bWxFbGVtZW50LnRvWG1sKCkpOwotCi0JCWlmICggZGVidWcgKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB4bWxfZmlsZSA9IHRoaXMuZ2V0UHVibGlzaERpcigpICsgInhtbCIgKyBGaWxlLnNlcGFyYXRvcjsgLy8kTk9OLU5MUy0xJAotCQkJCXhtbF9maWxlICs9IGxheW91dC5nZXRUeXBlKCkgKyAiLiIgKyBsYXlvdXQuZ2V0RmlsZU5hbWUoIi54bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJRmlsZSB4ZiA9IG5ldyBGaWxlKHhtbF9maWxlKTsKLQkJCQlpZiAoICF4Zi5leGlzdHMoKSApCi0JCQkJewotCQkJCQl4Zi5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCXhmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQl9Ci0JCQkJCQkJCi0JCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0JCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbSh4ZiksICJ1dGYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJb3V0cHV0LndyaXRlKHhtbC50b1N0cmluZygpKTsKLQkJCQlvdXRwdXQuZmx1c2goKTsKLQkJCQlvdXRwdXQuY2xvc2UoKTsKLQkKLQkJCQkvLyBGaWxlV3JpdGVyIHh3ID0gbmV3IEZpbGVXcml0ZXIoeG1sX2ZpbGUpOwotCQkJCS8vIHh3LndyaXRlKHhtbC50b1N0cmluZygpKTsKLQkJCQkvLyB4dy5mbHVzaCgpOwotCQkJCS8vIHh3LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHhtbDsKLQl9Ci0KLS8vCS8qKgotLy8JICogU2NhbnMgdGhlIGNvbnRlbnQgZm9yIHJlc291cmNlIHJlZmVyZW5jZXMuCi0vLwkgKi8KLS8vCXByaXZhdGUgdm9pZCBzY2FuQ29udGVudEZvclJlc291cmNlcyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwKLS8vCQkJU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0vLwkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gZ2V0U2Nhbm5lcihvd25lcik7Ci0vLwkJaWYgKCBzY2FubmVyICE9IG51bGwgKSB7Ci0vLwkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhvd25lciwgY29udGVudCwgY29udGVudFBhdGgpOwotLy8JCX0KLS8vCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0vLwkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0vLwkJCXZhbGlkYXRvci5kaXNwb3NlKCk7Ci0vLwkJfQotCi0JCWlmICggaW50ZXJuYWxfbWdyICE9IG51bGwgKSB7Ci0JCQlpbnRlcm5hbF9tZ3IuY2xlYXIoKTsKLQkJCWludGVybmFsX21nciA9IG51bGw7Ci0JCX0KLQkJCi0JCW1nciA9IG51bGw7Ci0vLwkJc2Nhbm5lciA9IG51bGw7Ci0vLwkJdmFsaWRhdG9yID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lDb250ZW50VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDU4ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9JQ29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogaW50ZXJmYWNlIGZvciBjb250ZW50IHZhbGlkYXRvciBhdCBicm93c2luZyBhbmQgcHVibGlzaGluZwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29udGVudFZhbGlkYXRvciAgewotCi0JLyoqCi0JICogc2V0IHB1Ymxpc2ggZGlyCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoRGlyKFN0cmluZyBwdWJEaXIpOwotCQotCS8qKgotCSAqIHNob3cgYnJva2VuIGxpbmtzIGlmIHRydWUKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG93QnJva2VuTGlua3MoKTsKLQkKLQlwdWJsaWMgdm9pZCBzY2FuQ29udGVudChJRWxlbWVudExheW91dCBsYXlvdXQsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGxpbmsgYXR0cmlidXRlIGFuZCBsaW5rZWQgdGV4dCBmb3IgdGhlIG93bmluZyBlbGVtZW50IHdpdGhpbiB0aGUgY29uZmlndXJhdGlvbi4gCi0JICogUmV0dXJucyBhIExpbmtJbmZvIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIge0BsaW5rIE1ldGhvZEVsZW1lbnR9IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIGF0dHJpYnV0ZXMgU3RyaW5nIHRoZSB1cmwgYXR0cmlidXRlcwotCSAqIEBwYXJhbSB0ZXh0IFN0cmluZyB0aGUgbGlua2VkIHRleHQKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gdGFnIHRoZSBIVE1MIHRhZyAoYSwgYXJlYSkKLQkgKiBAcmV0dXJuIExpbmtJbmZvCi0JICovCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhZyk7Ci0KLQkvKioKLQkgKiBsb2cgdGhlIGluZm8gZm9yIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbWVzc2FnZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbmZvKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIGxvZyBhIG1pc3NpbmcgcmVmZXJlbmNlCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50IHRoZSByZWZlcm5lY2VkIGVsZW1lbnQgdGhhdCBpcyBtaXNzaW5nIGluIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsCi0JCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQpOwotCi0JLyoqCi0JICogbG9nIGEgbWlzc2luZyByZWZlcmVuY2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSBndWlkIFN0cmluZyB0aGUgcmVmZXJlbmNlZCBndWlkIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGVsZW1lbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW55IG1vcmUKLQkgKiBAcGFyYW0gbGlua2VkVGV4dCBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0IGFsb25nIHdpdGggdGhlIGxpbmsuCi0JICovCi0JcHVibGljIHZvaWQgbG9nTWlzc2luZ1JlZmVyZW5jZShNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgZ3VpZCwKLQkJCVN0cmluZyBsaW5rZWRUZXh0KTsKLQotCS8qKgotCSAqIGxvZyBhIG1pc3NpbmcgcmVzb3VyY2UgCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIG93bmVyCi0JICogQHBhcmFtIHJlc291cmNlRmlsZSBGaWxlIHRoZSBmaWxlIHRoYXQgb3duZWQgYnkgdGhlIGVsZW1lbnQgYW5kIHJlZmVyZW5jZXMgdGhlIG1pc2luZyByZXNvdXJjZSwgCi0JICogbnVsbCBpZiB0aGUgbWlzaW5nIHJlZmVyZW5jZSBpcyByZWZlcmVuY2VkIGJ5IHRoZSBlbGVtZW50IGl0c2VsZiAKLQkgKiBAcGFyYW0gdXJsIFN0cmluZyB0aGUgdXJsIHRoYXQgY2FuJ3QgYmUgcmVzb3ZsZWQgdG8gYSByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dNaXNzaW5nUmVzb3VyY2UoTWV0aG9kRWxlbWVudCBvd25lciwgRmlsZSByZXNvdXJjZUZpbGUsCi0JCQlTdHJpbmcgdXJsKTsKLQotCS8qKgotCSAqIGxvZ24gYSB3YXJuaW5nIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGFuIGVycm9yIG1lc3NhZ2UKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJhbSB0aCBUaHJvd2FibGUsIG51bGwgaWYgbm90Ci0JICovCi0JcHVibGljIHZvaWQgbG9nRXJyb3IoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aCk7Ci0KLQkvKioKLQkgKiBsb2cgYW4gaW52YWxpZCBleHRlcm5hbCBsaW5rCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gdXJsIFN0cmluZyB0aGUgdXJsCi0JICogQHBhcmFtIG1lc3NhZ2UgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgbG9nSW52YWxpZEV4dGVybmFsTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsLAotCQkJU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGEgbWVzc2FnZQotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1lc3NhZ2UpOwotCi0JLyoqCi0JICogbG9nIGEgd2FybmluZwotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotIAkgKi8KLQlwdWJsaWMgdm9pZCBsb2dXYXJuaW5nKFN0cmluZyBtZXNzYWdlKTsKLQotCS8qKgotCSAqIGxvZyBhbiBlcnJvcgotCSAqIEBwYXJhbSBtZXNzYWdlIFN0cmluZwotCSAqIEBwYXJhbSB0aCBUaHJvd2FibGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRoKTsKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGRpc2NhcmRlZCBvciBub3QKLQkgKiBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZSB0cmVhdGVkIGFzIG91dCBzaWRlIHRoZSBjb25maWd1cnNhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBPYmplY3QgZmVhdHVyZSBFU3RydWN0dXJhbEZlYXR1cmUgb3IgT3Bwb3NpdGVGZWF0dXJlCi0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBjaGVja2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjYXJkZWQoTWV0aG9kRWxlbWVudCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZSk7Ci0KLQkvKioKLQkgKiBzZXQgYW4gZGlzY2FyZGVkIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY2FyZGVkRWxlbWVudChNZXRob2RFbGVtZW50IGUpOwotCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgb2JqZWN0IGFuZCBmcmVlIHJlc291cmNlcwotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCQkKLQkvKioKLQkgKiBhZGQgYSByZWZlcm5lY2VkIGVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXIgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgb3duZXIgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSk7Ci0JCQotCS8qKgotCSAqIGdldCB0aGUgZmxhZyBhYm91dCBzaG93aW5nIGV4dHJhIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpbmtlZCBlbGVtZW50cyBmb3IgZGVzY3JpcHRvcnMKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKTsKLQotCS8qKgotCSAqIHNob3cgZGVzY3JpcHRvcnMgb24gbWV0aG9kIGVsZW1lbnQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMoKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIHRhYiBpZCBmb3IgdGhlIGFjdGl2aXR5IGxheW91dAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUVsZW1lbnRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvSUVsZW1lbnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyOTIyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0lFbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgZWxlbWVudCBsYXlvdXQuIGFueSBlbGVtZW50IGxheW91dCBzaG91bGQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogQW4gZWxlbWVudCBsYXlvdXQgZGVmaW5lcyBob3cgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIHJlbmRlcmVkIGluIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFbGVtZW50TGF5b3V0IHsKLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCBpZCwgd2hpY2ggaXMgdGhlIGVsZW1lbnQncyBHVUlECi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIHRoZSByZWFsaXplZCBwcmVzZW50YXRpb24gbmFtZSBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpOwotCi0JLyoqCi0JICogdGhlIHVybCBvZiB0aGUgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKTsKLQotCS8qKgotCSAqIHRoZSB1cmwgZm9yIHNoYXBlIGljb24gb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGVpY29uVXJsKCk7Ci0KLQkvKioKLQkgKiB0aGUgdXJsIGZvciBub2RlIGljb24gb2YgdGhlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZWljb25VcmwoKTsKLQotCS8qKgotCSAqIHRoZSB1cmwgZm9yIGRpYWdyYW0gaWNvbiBvZiB0aGUgZWxlbWVudCwgCi0JICogZm9yIGV4YW1wbGUsIHRoZSBpY29uIGZvciBhIHJvbGUgaW4gdGhlIHJvbGUtdGFzay13cCByZWxhdGlvbnNoaXAgZGlhZ3JhbS4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlhZ3JhbWljb25VcmwoKTsgLy8gaWNvbiBmb3IgZGlhZ3JhbSBzdWNoIGFzIFJvbGUgZGlhZ3JhbQotCi0JLyoqCi0JICogdGhlIGxheW91dCB4c2wgdXJsCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhzbFVybCgpOwotCi0JLyoqCi0JICogdGhlIGJhY2sgcGF0aCBvZiB0aGUgZWxlbWVudCByZWxhdGl2ZSB0byB0aGUgcHVibGlzaGluZyByb290IGRpci4KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja1BhdGgoKTsKLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIHJvb3QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKTsKLQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBwYXRoIHJlbGF0aXZlIHRvIGFub3RoZXIgZWxlbWVudC4gVGhpcyBpcyB0aGUKLQkgKiByZWxhdGl2ZVRvLmJhY2twYXRoICsgdGhpcy5lbGVtZW50cGF0aAotCSAqIAotCSAqIEBwYXJhbSByZWxhdGl2ZVRvCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0IHJlbGF0aXZlVG8pOwotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgb2YgdGhlIGVsZW1lbnQsIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbi4KLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBleHRlbnNpb24sIHN1Y2ggYXMgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZXh0KTsKLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCAKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxheW91dCBtYW5hZ2VyIGZvciByYW5kZXJpbmcgdGhlIGxheW91dCBvZiB0aGUgZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIEVsZW1lbnRMYXlvdXRNYW5hZ2VyCi0JICovCi0JcHVibGljIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGdldExheW91dE1ncigpOwotCi0JLyoqCi0JICogZ2V0IHRoZSBYbWxFbGVtZW50IGZvciB0aGUgZWxlbWVudCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVSZWZlcmVuY2VzCi0JICogICAgICAgICAgICB0cnVlIHRvIGluY2x1ZGUgdGhlIHhtbCBvZiB0aGUgcmVmZXJlbmNlZCBlbGVtZW50LiBmYWxzZSB0bwotCSAqICAgICAgICAgICAgaWdub3JlIHRoZSB4bWwgb2YgdGhlIHJlZmVyZW5jZXMuCi0JICogQHJldHVybiBYbWxFbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIHJldHVybiBhIGxpc3Qgb2YgTGF5b3V0SW5mbyBvYmplY3RzCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgTGF5b3V0SW5mbyBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0TGF5b3V0cygpOwotCi0KLQkvKioKLQkgKiBpZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgaXMgdGFyZ2V0IGZvciBhbm90aGVyIGVsZW1lbnQsIHNldCBpdCBoZXJlLiBmb3IKLQkgKiBleGFtcGxlLCBzdGVwIGNvbnRlbnQgY2F0IHRhcmdldCBmb3IgYSBUYXNrIG9yIGEgdGFzayBkZXNjcmlwdG9yCi0JICogY29weXJpZ2h0IGNvbnRlbnQgY2FuIHRhcmdldCB0byBkaWZmZXJlbnQgZWxlbWVudHMuCi0JICogCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0aGF0IHRoZSBzeXN0ZW0gd2lsbCBmaXggdGhlIGxpbmtzIGluIHRoZSBjb250ZW50Ci0JICogdG8gcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUYXJnZXQoTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50KTsKLQotCS8qKgotCSAqIG5lZWQgdG8gc2V0IHRoZSBvd25lciBvZiB0aGUgY3VycmVudCBsYXlvdXQgZWxlbWVudC4gSW4gbW9zdCBjYXNlcyB0aGlzCi0JICogc2hvdWxkIGJlIHRoZSBlQ29udGFpbmVyIG9mIHRoZSBlbGVtZW50LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGluIHNvbWUKLQkgKiBzaXR1YXRpb24gdGhlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBvd25lciB3aGVuIHRoZSBvYmplY3QgaXMgY3JlYXRlZC4KLQkgKiBGb3IgZXhhbXBsZSwgdGhlIENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QncyBlQ29udGluZXIgaXMgbnVsbCBpZiB0aGUKLQkgKiBjb250ZW50IGZpbGUgaXMgbm90IHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRPd25lcihNZXRob2RFbGVtZW50IG93bmVyKTsKLQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBodG1sIGNvbnRlbnQgZ2VuZXJhdGVkIGZyb20gdGhpcyB4c2wgZmlsZSBuZWVkcyB0byBiZSBzY2FubmVkIG9yIG5vdAotCSAqIHNjYW4gdGhlIGNvbnRlbnQgaXMgZm9yIGlkZW50aWZ5aW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgY29udGVudCBhbmQgY29weSBvdmVyIHJlc291cmNlIGZpbGVzCi0JICogaW4gc29tZSBjYXNlcyB3ZSBkb24ndCBuZWVkIHRvIHNjYW4gdGhlIGNvbnRlbnQsIGZvciBleGFtcGxlLCB0aGUgYWN0aXZpdHkgYnJlYWtkb3duIHN0cnVjdHVyZQotCSAqIAotCSAqIEBwYXJhbSB4c2xVcmwgdGhlIHhzbCB0aGF0IGh0bWwgaXMgZ2VuZXJhdGVkIGZyb20sIG51bGwgZm9yIHRoZSBkZWZhdWx0IHhzbCBsYXlvdXQKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkQ29udGVudFNjYW4oU3RyaW5nIHhzbFVybCk7Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNob3cKLQkgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgbmVlZGVkIGFueSBtb3JlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0VsZW1lbnRMaW5rKGJvb2xlYW4gc2hvdyk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTJhY2VjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbGF5b3V0IGV4dGVuZHNpb24KLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF5b3V0RXh0ZW5zaW9uIHsKLQotCXByb3RlY3RlZCBFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNZ3I7Ci0JCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIExheW91dEV4dGVuc2lvbigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWdyKSB7Ci0JCXRoaXMubGF5b3V0TWdyID0gbGF5b3V0TWdyOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgRWxlbWVudFJlYWxpemVyIGdldEVsZW1lbnRSZWFsaXplcigpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKTsKLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEV4dGVuc2lvbkZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODE2YjdiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIExheW91dEV4dGVuc2lvbiBjb250cmlidXRpb25zCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRFeHRlbnNpb25GYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gcG9pbnQgbmFtZXNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UgPSAib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIHBvaW50IG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiZWxlbWVudExheW91dEV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgImNsYXNzIiBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJfTkFNRSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAiaWQiIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQl9OQU1FID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBMYXlvdXRFeHRlbnNpb25GYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vIEEgbWFwIG9mIGxpYnJhcnkgbWFuYWdlciBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCXByaXZhdGUgTWFwPFN0cmluZywgTGF5b3V0RXh0ZW5zaW9uRWxlbWVudD4gbGF5b3V0RWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExheW91dEV4dGVuc2lvbkVsZW1lbnQ+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgTGF5b3V0RXh0ZW5zaW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IExheW91dEV4dGVuc2lvbkZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExheW91dEV4dGVuc2lvbkZhY3RvcnkoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoKSB7Ci0JCS8vIFByb2Nlc3MgdGhlICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5saWJyYXJ5TWFuYWdlcnMiIGV4dGVuc2lvbiBwb2ludAotCQkvLyBjb250cmlidXRvcnMuCi0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCUVYVEVOU0lPTl9QT0lOVF9OQU1FU1BBQ0UsIEVYVEVOU0lPTl9QT0lOVF9OQU1FKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldOwotCQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2VJZGVudGlmaWVyKCk7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0QXR0cmlidXRlKENMQVNTX0FUVFJJQl9OQU1FKTsKLQkJCQkJCVN0cmluZyBpZCA9IGNvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJLmdldEF0dHJpYnV0ZShJRF9BVFRSSUJfTkFNRSk7Ci0JCQkJCQlpZiAoY2xhc3NOYW1lICE9IG51bGwgJiYgY2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkJCQkJJiYgaWQgIT0gbnVsbCAmJiBpZC50cmltKCkubGVuZ3RoKCkgPiAwKSB7CQkJCQkJCQotCQkJCQkJCUxheW91dEV4dGVuc2lvbkVsZW1lbnQgcHJvdmlkZXIgPSBsYXlvdXRFbGVtZW50cy5nZXQoaWQpOwotCQkJCQkJCWlmKHByb3ZpZGVyID09IG51bGwgKSB7Ci0JCQkJCQkJCXByb3ZpZGVyID0gbmV3IExheW91dEV4dGVuc2lvbkVsZW1lbnQoCi0JCQkJCQkJCQkJYnVuZGxlLCBjbGFzc05hbWUsIGlkKTsKLQkJCQkJCQkJbGF5b3V0RWxlbWVudHMucHV0KGlkLCBwcm92aWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBsYXlvdXRFbGVtZW50cy5jb250YWluc0tleShpZCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgbGF5b3V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIGV4dGVuc2lvbiBpZAotCSAqIEByZXR1cm4gTGF5b3V0RXh0ZW5zaW9uCi0JICovCi0JcHVibGljIExheW91dEV4dGVuc2lvbiBjcmVhdGVFeHRlbnNpb24oU3RyaW5nIGlkKSB7Ci0JCQotCQlpZiAoICFoYXNFeHRlbnNpb24oaWQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUxheW91dEV4dGVuc2lvbkVsZW1lbnQgcHJvdmlkZXIgPSAoTGF5b3V0RXh0ZW5zaW9uRWxlbWVudCkgbGF5b3V0RWxlbWVudHMuZ2V0KGlkKTsKLQkJdHJ5IHsKLQkJCUNsYXNzIGNsYXp6ID0gcHJvdmlkZXIuYnVuZGxlLmxvYWRDbGFzcyhwcm92aWRlci5jbGFzc05hbWUpOwotCQkJcmV0dXJuIChMYXlvdXRFeHRlbnNpb24pIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBMYXlvdXRFeHRlbnNpb25FbGVtZW50IHsKLQkJQnVuZGxlIGJ1bmRsZTsKLQkJU3RyaW5nIGNsYXNzTmFtZTsKLQkJU3RyaW5nIGlkOwotCQlwcml2YXRlIExheW91dEV4dGVuc2lvbkVsZW1lbnQoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGlkKSB7Ci0JCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKLQkJCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4ODVhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotLyoqCi0gKiBsTHlvdXQgaW5mbyBmb3IgYW4gZWxlbWVudC4KLSAqIDxwPgotICogVGhpcyBpcyB1c2VkIHdoZW4gYW4gZWxlbWVudCBvdXRwdXQgbW9yZSB0aGVuIG9uZSBsYXlvdXQsIHN1Y2ggYXMgYWN0aXZpdHkKLSAqIHRhYnMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExheW91dEluZm8gewotCi0JcHVibGljIExheW91dEluZm8oU3RyaW5nIG5hbWUsIFN0cmluZyB4c2wsIFN0cmluZyBmaWxlTmFtZSwKLQkJCWJvb2xlYW4gaXNQcmltYXJ5KSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGF5b3V0X3hzbCA9IHhzbDsKLQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQl0aGlzLmlzUHJpbWFyeSA9IGlzUHJpbWFyeTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIGxheW91dCB4c2wgZmlsZSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBsYXlvdXRfeHNsOwotCi0JLyoqCi0JICogdGhlIG91dG91dCBmaWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZpbGVOYW1lOwotCi0JLyoqCi0JICogaXMgdGhpcyB0aGUgcHJpbWFyeSBsYXlvdXQ/IHRoaXMgYXBwbHkgdG8gdGhlIGNhc2Ugd2hlbiBvbmUgZWxlbWVudCBoYXMgbW9yZSB0aGFuIG9uZSBsYXlvdXQuCi0JICogIEZvciBleGFtcGxlLCBhbiBhY3Rpdml0eSBlbGVtZW50IGhhcyA0IGxheW91dHMuCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5OwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MYXlvdXRSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkNTU0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0KLS8qKgotICogYSB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBsYXlvdXQgcmVsYXRlZCByZXNvdXJjZXMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXlvdXRSZXNvdXJjZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBzaGFwZWljb25CdW5kbGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEVNUF9MQVlPVVRfRElSID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQl0cnkgewotCQkJU3RyaW5nIHBrZyA9IExheW91dFJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIHJlc291cmNlID0gTGF5b3V0UmVzb3VyY2VzLmNsYXNzLmdldE5hbWUoKTsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlKTsKLQkJCXNoYXBlaWNvbkJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShwa2cKLQkJCQkJKyAiLkRlZmF1bHRTaGFwZWljb25zIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLyoKLQkJCSAqIFRFTVBfTEFZT1VUX0RJUiA9IGdldFN0cmluZygidGVtcF9sYXlvdXRfZGlyIik7IGlmICgKLQkJCSAqIFRFTVBfTEFZT1VUX0RJUiAhPSBudWxsICkgeyBURU1QX0xBWU9VVF9ESVIgPQotCQkJICogVEVNUF9MQVlPVVRfRElSLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOyB9Ci0JCQkgKi8KLQotCQkJLy8gTXVsdGlwbGUgaW5zdGFuY2VzIG9mIEVQRiBydW5uaW5nIGRpZmZlcmVudCBsaWJzIGFyZSBzaGFyaW5nIHRoZSBzYW1lIGxheW91dCBkaXJlY3RvcnkKLQkJCS8vIHVzZSB0aW1lc3RhbXAgdG8gaWRlbnRpZnkgZWFjaCBpbnN0YW5jZQotCQkJLy8gd2UgbmVlZCB0byBjbGVhbiB0aGUgZmlsZXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhpdAkJCQotCQkJU3RyaW5nIHVzZXJIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJVEVNUF9MQVlPVVRfRElSID0gdXNlckhvbWUgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrICJFUEYiICsgRmlsZS5zZXBhcmF0b3IgKyAibGF5b3V0IiArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIExvbmcudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCQotCQkJRmlsZSBydXBUbXBEaXIgPSBuZXcgRmlsZShURU1QX0xBWU9VVF9ESVIpOwotCQkJaWYgKCFydXBUbXBEaXIuZXhpc3RzKCkpIHsKLQkJCQlydXBUbXBEaXIubWtkaXJzKCk7Ci0JCQl9IGVsc2UgewotCQkJCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKHJ1cFRtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjYWxsIHRoaXMgd2hlbiB0aGUgYXBwbGljYXRpb24gZXhpdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhcigpCi0JewotCQl0cnkgewotCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXMoVEVNUF9MQVlPVVRfRElSKTsKLQkJCQotCQkJLy8gYWxzbyBkZWxldGUgdGhlIGZvbGRlcgotCQkJbmV3IEZpbGUoVEVNUF9MQVlPVVRfRElSKS5kZWxldGUoKTsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJLy8gYWxzbyByZXNldCB0aGUgYnJvd3NlciBzZXR0aW5ncyBzbyB0aGF0IHRoZSBsYXlvdXQgZGF0YSB3aWxsIGJlIGNvcGllZAotCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnNldENoYW5nZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBkZWZhdWx0IHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gVEVNUF9MQVlPVVRfRElSOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeHNsIHVyaSBmb3IgdGhlIGdpdmVuIGtleXMKLQkgKiBAcGFyYW0ga2V5IFN0cmluZwotCSAqIEBwYXJhbSBzZWNvbmRLZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0WHNsUGF0aChTdHJpbmcga2V5LCBTdHJpbmcgc2Vjb25kS2V5KSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRYc2xVcmkoa2V5LCBzZWNvbmRLZXkpOwotCi0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJLy8gcmVzb2x2ZSB0aGUgZmlsZQotCQkJcmV0dXJuIExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFhzbFBhdGgoKSArIHVybDsKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgeHNsIHVyaSBmb3IgdGhlIGdpdmVuIGtleXMKLQkgKiBAcGFyYW0ga2V5IFN0cmluZwotCSAqIEBwYXJhbSBzZWNvbmRLZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYc2xVcmkoU3RyaW5nIGtleSwgU3RyaW5nIHNlY29uZEtleSkgewotCQlTdHJpbmcgdXJsID0gZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlLCBrZXkudG9Mb3dlckNhc2UoKSk7Ci0JCWlmICgodXJsID09IG51bGwpICYmIChzZWNvbmRLZXkgIT0gbnVsbCkpIHsKLQkJCXVybCA9IGdldFN0cmluZyhyZXNvdXJjZUJ1bmRsZSwgc2Vjb25kS2V5LnRvTG93ZXJDYXNlKCkpOwotCQl9Ci0KLQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQl1cmwgPSBnZXRTdHJpbmcocmVzb3VyY2VCdW5kbGUsICJkZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJcmV0dXJuIHVybDsgCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZGVmYXVsdCBzaGFwZSBpY29uIHVybAotCSAqIEBwYXJhbSBrZXkgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0U2hhcGVpY29uVXJsKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIHVybCA9IGdldFN0cmluZyhzaGFwZWljb25CdW5kbGUsIGtleSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdXJsID0gZ2V0U3RyaW5nKHNoYXBlaWNvbkJ1bmRsZSwgImdlbmVyYWwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBudWxsOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgcmVzb3VyY2Ugc3RyaW5nIGZvciB0aGUga2V5Ci0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldFN0cmluZyhyZXNvdXJjZUJ1bmRsZSwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGZpbGVzIGZyb20gb25lIGRpciB0byBhbm90aGVyCi0JICogQHBhcmFtIGZyb21EaXIgU3RyaW5nCi0JICogQHBhcmFtIHRvRGlyIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKFN0cmluZyBmcm9tRGlyLCBTdHJpbmcgdG9EaXIpIHsKLQotCQlTdHJpbmcgaW5jbHVkZXMgPSAiKi4qLCAqKi9jc3MvKi4qLCAqKi9pY29ucy8qLiosICoqL2ltYWdlcy8qLiosICoqL3Jlc291cmNlcy8qLiosICoqL3N0eWxlc2hlZXRzLyouKiwgKiovc2NyaXB0cy8qLioiOyAvLyROT04tTkxTLTEkCi0JCWNvcHlEaXIoZnJvbURpciwgdG9EaXIsIGluY2x1ZGVzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBjb3B5IGZpbGVzIGZyb20gb25lIGRpciB0byBhbm90aGVyLCB3aXRoIGZpbHRlcnMKLQkgKiBAcGFyYW0gZnJvbURpciBTdHJpbmcKLQkgKiBAcGFyYW0gdG9EaXIgU3RyaW5nCi0JICogQHBhcmFtIGluY2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihTdHJpbmcgZnJvbURpciwgU3RyaW5nIHRvRGlyLCBTdHJpbmcgaW5jbHVkZXMsCi0JCQlTdHJpbmcgZXhjbHVkZXMpIHsKLQkJY29weURpcihuZXcgRmlsZShmcm9tRGlyKSwgbmV3IEZpbGUodG9EaXIpLCBpbmNsdWRlcywgZXhjbHVkZXMpOwotCX0KLQotCS8qKgotCSAqIGNvcHkgZGlyCi0JICogCi0JICogQHBhcmFtIGZyb21EaXIgRmlsZQotCSAqIEBwYXJhbSB0b0RpciBGaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlcyBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weURpcihGaWxlIGZyb21EaXIsIEZpbGUgdG9EaXIsIFN0cmluZyBpbmNsdWRlcywKLQkJCVN0cmluZyBleGNsdWRlcykKLQl7Ci0JCWNvcHlEaXIoZnJvbURpciwgdG9EaXIsIGluY2x1ZGVzLCBleGNsdWRlcywgdHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIGNvcHkgZGlyCi0JICogQHBhcmFtIGZyb21EaXIgRmlsZQotCSAqIEBwYXJhbSB0b0RpciBGaWxlCi0JICogQHBhcmFtIGluY2x1ZGVzIFN0cmluZwotCSAqIEBwYXJhbSBleGNsdWRlcyBTdHJpbmcKLQkgKiBAcGFyYW0gb3ZlcndyaXRlIGJvb2xlYW4gdHJ1ZSB0byBvdmVycmlkZSBleGlzdGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5RGlyKEZpbGUgZnJvbURpciwgRmlsZSB0b0RpciwgU3RyaW5nIGluY2x1ZGVzLAotCQkJU3RyaW5nIGV4Y2x1ZGVzLCBib29sZWFuIG92ZXJ3cml0ZSkgewotCQlDb3B5IGNwID0gbmV3IENvcHkoKTsKLQkJY3Auc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7IC8vIG9ubHkgY3BveSBuZXcgZmlsZXMgb3IgbmV3ZXIgZmlsZXMKLQkJaWYgKGluY2x1ZGVzICE9IG51bGwgfHwgZXhjbHVkZXMgIT0gbnVsbCkgewotCQkJRmlsZVNldCBzZXQgPSBuZXcgRmlsZVNldCgpOwotCQkJaWYgKGluY2x1ZGVzICE9IG51bGwpIHsKLQkJCQlzZXQuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwotCQkJfQotCi0JCQlpZiAoZXhjbHVkZXMgIT0gbnVsbCkgewotCQkJCXNldC5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0JCQl9Ci0KLQkJCXNldC5zZXREaXIoZnJvbURpcik7Ci0JCQljcC5hZGRGaWxlc2V0KHNldCk7Ci0JCX0KLQotCQljcC5zZXRUb2Rpcih0b0Rpcik7Ci0JCWNwLnNldFByb2plY3QobmV3IFByb2plY3QoKSk7Ci0JCWNwLmV4ZWN1dGUoKTsKLQotCX0KLQotCS8qKgotCSAqIGNvcHkgdGhlIGxheW91dCBmaWxlcyBmcm9tIHRoZSBsaWJyYXJ5IGxheW91dCBwYXRoIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwdWJsaXNoIGZvbGRlcgotCSAqIAotCSAqIEBwYXJhbSB0b0RpcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5TGF5b3V0RmlsZXMoU3RyaW5nIHRvRGlyKSB7Ci0JCS8vIGNvcHkgdGhlIGxheW91dCBmaWxlcyB0byB0aGUgdGVtcCBmb2xkZXIKLQkJU3RyaW5nIHNvdXJjZURpciA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFBhdGgoKTsKLQkJY29weURpcihzb3VyY2VEaXIsIHRvRGlyKTsKLQotCQl0cnkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuY29weUxvY2FsaXplZEZpbGVzKAotCQkJCQlMaWJyYXJ5UGx1Z2luLkxBWU9VVF9TQ1JJUFRTX1BBVEgsCi0JCQkJCW5ldyBGaWxlKHRvRGlyLCBMaWJyYXJ5UGx1Z2luLkxBWU9VVF9TQ1JJUFRTX0ZPTERFUiksIHRydWUsCi0JCQkJCWZhbHNlKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuemlwKEZpbGUgemlwRmlsZSwgRmlsZSB0b0RpcikgewotCQlFeHBhbmQgZXhwID0gbmV3IEV4cGFuZCgpOwotCQlleHAuc2V0T3ZlcndyaXRlKHRydWUpOyAKLQkJZXhwLnNldFNyYyh6aXBGaWxlKTsKLQkJZXhwLnNldERlc3QodG9EaXIpOwotCQlleHAuc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKLQkJZXhwLmV4ZWN1dGUoKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xheW91dFJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjEwZjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIHVybHMgc3RhcnQgd2l0aCB0aGUgZm9sbG93aW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBleHRlcm5hbCB1cmxzLCB1c2UgfCB0byBzcGVyYXRlIAotIwotI2V4dGVybmFsVXJsX3N0YXJ0V2l0aD1odHRwOi8vfGh0dHBzOi8vfGZ0cDovLwotIyBzZWUgYWxsIHRoZSBwb3NzaWJsZSBwcm90b2NhbHMgYXQ6Ci0jIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvdXJpLXNjaGVtZXMuaHRtbAotZXh0ZXJuYWxVcmxfc3RhcnRXaXRoPVthLXpBLVowLTlcXC5dezEsMTV9Oi8vCi0KLSMgWFNMIFN0eWxlc2hlZXQgTWFwcGluZyBmb3IgdGhlIE1ldGhvZCBFbGVtZW50cy4KLQotIyBDb3JlIE1ldGhvZCBFbGVtZW50cwotYXJ0aWZhY3Q9YXJ0aWZhY3QueHNsCi1kZWxpdmVyYWJsZT1kZWxpdmVyYWJsZS54c2wKLW91dGNvbWU9b3V0Y29tZS54c2wKLXJvbGU9cm9sZS54c2wKLXRhc2s9dGFzay54c2wKLQotIyBHdWlkYW5jZQotY2hlY2tsaXN0PWNoZWNrbGlzdC54c2wKLWNvbmNlcHQ9Z3VpZGFuY2UueHNsCi1leGFtcGxlPWd1aWRhbmNlX3dpdGhfYXR0YWNobWVudC54c2wKLWd1aWRlbGluZT1ndWlkYW5jZS54c2wKLXByYWN0aWNlPXByYWN0aWNlLnhzbAotcmVwb3J0PWd1aWRhbmNlLnhzbAotcm9hZG1hcD1ndWlkYW5jZS54c2wKLXJldXNhYmxlYXNzZXQ9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotc3VwcG9ydGluZ21hdGVyaWFsPWd1aWRhbmNlLnhzbAotdGVtcGxhdGU9Z3VpZGFuY2Vfd2l0aF9hdHRhY2htZW50LnhzbAotdGVybWRlZmluaXRpb249Z3VpZGFuY2UueHNsCi10b29sbWVudG9yPWd1aWRhbmNlLnhzbAotd2hpdGVwYXBlcj1ndWlkYW5jZV93aXRoX2F0dGFjaG1lbnQueHNsCi1lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM9Z3VpZGFuY2UueHNsCi0KLSMgQ29udGVudCBDYXRlZ29yaWVzCi1jdXN0b21jYXRlZ29yeT1jb250ZW50Y2F0ZWdvcnkueHNsCi1kaXNjaXBsaW5lPWNvbnRlbnRjYXRlZ29yeS54c2wKLWRpc2NpcGxpbmVncm91cGluZz1jb250ZW50Y2F0ZWdvcnkueHNsCi1kb21haW49Y29udGVudGNhdGVnb3J5LnhzbAotcm9sZXNldD1jb250ZW50Y2F0ZWdvcnkueHNsCi1yb2xlc2V0Z3JvdXBpbmc9Y29udGVudGNhdGVnb3J5LnhzbAotdG9vbD1jb250ZW50Y2F0ZWdvcnkueHNsCi13b3JrcHJvZHVjdHR5cGU9Y29udGVudGNhdGVnb3J5LnhzbAotCi0jIFByb2Nlc3MgRWxlbWVudHMKLSMgYWN0aXZpdHkgbGF5b3V0IHVzZSB0aGUgZGVmYXVsdCB0YWIgbGF5b3V0IHhzbAotI3dhcyB1c2luZyBhIHJlZnJlc2ggdG8gc2hvdyB0aGUgZGVmYXVsdCBwYWdlCi0jYnV0IGNhdXNlZCBwcm9ibGVtIGluIHRoZSBuYXZpZ2F0aW9uIGhpc3RvcnkgYmFjay9mb3J3YXJkIGluIGJyb3dzaW5nCi0jc28gc3dpdGNoIHRvIHRoZSBvbGQgd2F5IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGxheW91dCB1c2luZyB0aGUgc2V0IGRlZmF1bHQgdGFiCi0jCi0jYWN0aXZpdHk9YWN0aXZpdHkueHNsCi0jY2FwYWJpbGl0eXBhdHRlcm49YWN0aXZpdHkueHNsCi0jZGVsaXZlcnlwcm9jZXNzPWFjdGl2aXR5LnhzbAotI2l0ZXJhdGlvbj1hY3Rpdml0eS54c2wKLSNwaGFzZT1hY3Rpdml0eS54c2wKLSNwcm9jZXNzPWFjdGl2aXR5LnhzbAotI3Byb2Nlc3Njb250cmlidXRpb249YWN0aXZpdHkueHNsCi0KLSMgRGVzY3JpcHRvcnMKLWNvbXBvc2l0ZXJvbGU9Y29tcG9zaXRlcm9sZS54c2wKLW1pbGVzdG9uZT1taWxlc3RvbmUueHNsCi1yb2xlZGVzY3JpcHRvcj1yb2xlX2Rlc2NyaXB0b3IueHNsCi10YXNrZGVzY3JpcHRvcj10YXNrX2Rlc2NyaXB0b3IueHNsCi10ZWFtcHJvZmlsZT10ZWFtcHJvZmlsZS54c2wKLXdvcmtwcm9kdWN0ZGVzY3JpcHRvcj1hcnRpZmFjdF9kZXNjcmlwdG9yLnhzbAotCi0jIE1pc2MKLWRlZmF1bHQ9ZGVmYXVsdC54c2wKLWdlbmVyYWw9Z2VuZXJhbC54c2wKLXBhZ2Vfbm90X2luc3RhbGxlZD1wYWdlX25vdF9pbnN0YWxsZWQueHNsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xpbmtJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L0xpbmtJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YWM2YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9MaW5rSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci0KLS8qKgotICogY2xhc3MgdG8gcHJvY2VzcyBhbiBlbGVtZW50IGxpbmsgaW4gdGhlIGNvbnRlbnQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpbmtJbmZvIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfQVRUUl9HVUlEID0gImd1aWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfSFJFRiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX0tFWSA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX0FUVFJfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19BVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGxpbmtlZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGxpbmtFbGVtZW50ID0gbnVsbDsKLQotCXByaXZhdGUgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTWlzc2luZ1JlZmVyZW5jZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0JcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJEaXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGFnOwotCQotCS8vVGVtcCBzb2x1dGlvbiBmb3IgZ2V0dGluZyBhcm91bmQgd2l0aG91dCBoYXZpbmcgYSBsaWJNZ3IgZHVyaW5nIG1pZ3JhdGlvbgotCS8vU2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBsaWIgbG9hZGVkIGR1cmluZyBtaWdyYXRpb24gaXMgcmVnaXN0ZWQgd2l0aCBMaWIgc2VydmljZS4KLQlwcml2YXRlIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IKLQkgKiBAcGFyYW0gcHViRGlyCi0JICovCi0JcHVibGljIExpbmtJbmZvKE1ldGhvZEVsZW1lbnQgb3duZXIsIElDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwKLQkJCVN0cmluZyBwdWJEaXIsIFN0cmluZyB0YWcpIHsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lcjsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCQl0aGlzLnRhZyA9IHRhZzsKLQl9Ci0KLQkvKioKLQkgKiBpcyB0aGlzIGFuIGVsZW1lbnQgbGluaz8KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRMaW5rKCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuaXNFbGVtZW50TGluayhnZXRFbGVtZW50TGlua1R5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGxpbmsgdHlwZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TGlua1R5cGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTElOS19BVFRSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGd1aWQgb2YgdGhlIGVsZW1lbnQgbGluawotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKExJTktfQVRUUl9HVUlEKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHVybCBvZiB0aGUgbGluawotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoTElOS19BVFRSX0hSRUYpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGlua2VkIHRleHQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua2VkVGV4dCgpIHsKLQkJcmV0dXJuIGxpbmtlZFRleHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBsaW5rZWQgZWxlbWVudAotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldExpbmtlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBsaW5rRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGh0bWwgZm9yIHRoZSBsaW5rLgotCSAqIAotCSAqIEBwYXJhbSBzaG93QnJva2VuTGlua3MgYm9vbGVhbiB0cnVlIHRvIHNob3cgdGhlIGJyb2tlbiBsaW5rIG1hcmsuIGZhbHNlIHRvIHNob3cgdGV4dCBvbmx5Ci0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEh0bWwoYm9vbGVhbiBzaG93QnJva2VuTGlua3MpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoaXNNaXNzaW5nUmVmZXJlbmNlICYmIChwdWJEaXIgIT0gbnVsbCkpIHsKLQkJCVN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFzaG93QnJva2VuTGlua3MpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmtlZFRleHQpOwotCQkJCXJldHVybiBidWZmZXI7Ci0JCQl9Ci0KLQkJCXVybCA9IGdldE1pc3NpbmdFbGVtZW50VXJsKCk7Ci0JCQlidWZmZXIKLQkJCQkJLmFwcGVuZCgiPGltZyBhbHQ9XCJcIiBzcmM9XCIiICsgUmVzb3VyY2VIZWxwZXIuZ2V0QmFja1BhdGgob3duZXJFbGVtZW50KSArICJpbWFnZXMvbm9fcnVwLmdpZlwiPiYjMTYwOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJc2V0VXJsKHVybCk7Ci0JCX0KLQotCQlidWZmZXIuYXBwZW5kKCI8IiArIHRhZyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4+IGl0ID0gYXR0cmlidXRlTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA9IGl0Lm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoTElOS19BVFRSX0hSRUYuZXF1YWxzKGtleSkKLQkJCQkJJiYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYnVmZmVyLmFwcGVuZCgiICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI9IikgLy8kTk9OLU5MUy0xJAotCQkJCQkuYXBwZW5kKCJcIiIpLmFwcGVuZChlbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJYnVmZmVyLmFwcGVuZCgiPiIpLmFwcGVuZChsaW5rZWRUZXh0KS5hcHBlbmQoIjwvIiArIHRhZyArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgbGluayBhdHRyaWJ1dGVzCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMgU3RyaW5nIHRoZSBsaW5rIGF0dHJpYnV0ZXMKLQkgKiBAcGFyYW0gdGV4dCBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0Ci0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVMaW5rKFN0cmluZyBhdHRyaWJ1dGVzLCBTdHJpbmcgdGV4dCwKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRoaXMubGlua2VkVGV4dCA9IHRleHQ7Ci0KLQkJTWF0Y2hlciBtMiA9IFJlc291cmNlSGVscGVyLnBfdGFnX2F0dHJpYnV0ZXMubWF0Y2hlcihhdHRyaWJ1dGVzKTsKLQkJd2hpbGUgKG0yLmZpbmQoKSkgewotCQkJU3RyaW5nIGF0dHJOYW1lID0gbTIuZ3JvdXAoMSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChtMi5ncm91cCgzKSAhPSBudWxsKSB7Ci0JCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMykudHJpbSgpOwotCQkJfSBlbHNlIGlmIChtMi5ncm91cCgyKSAhPSBudWxsKSB7Ci0JCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMikudHJpbSgpOwotCQkJfQotCQkJCi0JCQkvKgotCQkJICogaWYgKGF0dHJWYWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7IGF0dHJWYWx1ZSA9Ci0JCQkgKiBhdHRyVmFsdWUuc3Vic3RyaW5nKDEpOyB9IGlmIChhdHRyVmFsdWUuZW5kc1dpdGgoIlwiIikpIHsKLQkJCSAqIGF0dHJWYWx1ZSA9IGF0dHJWYWx1ZS5zdWJzdHJpbmcoMCwgYXR0clZhbHVlLmxlbmd0aCgpIC0gMSk7IH0KLQkJCSAqLwotCi0JCQkvLyBHVlQ6IENhbm5vdCBQcmV2aWV3L0Jyb3dzZSBEZXNjcmlwdGlvbiBUYWIgd2hlbgotCQkJLy8gdGhlIENQIGNvbnRhaW5zIGNoaW5lc2UgY2hhcmFjdGVycwotCQkJLy8gZ2VuZXJhdGVkIGh0bWwgZnJvbSB4c2x0IGdvdCB0aGUgaHJlZiB1cmxzIGVuY29kZWQuIHdlIGRvbid0IHdhbnQKLQkJCS8vIHRoYXQgbWFrZSBzdXJlIGRlY29kZSB0aGUgdXJsIHVzaW5nICJVVEYtOCIgZW5jb2RpbmcKLQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoTElOS19BVFRSX0hSRUYpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYXR0clZhbHVlID0gZGVjb2RlKGF0dHJWYWx1ZSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlhdHRyaWJ1dGVNYXAucHV0KGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotCQl9Ci0KLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkKCk7Ci0JCWlmIChndWlkID09IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBmaWxlIGNvbnRhaW5zIGd1aWQsIGlmIHllcywgbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQKLQkJCVN0cmluZyB1cmwgPSBnZXRVcmwoKTsKLQkJCWd1aWQgPSBSZXNvdXJjZUhlbHBlci5nZXRHdWlkRnJvbUZpbGVOYW1lKHVybCk7Ci0JCQlpZiAoZ3VpZCAhPSBudWxsKSB7Ci0JCQkJc2V0R3VpZChndWlkKTsKLQkJCX0KLQkJfQotCi0JCXZhbGlkYXRlRWxlbWVudFVybChjb25maWcpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZGVjb2RlKFN0cmluZyBzdHIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHN0ciwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYXR0cmlidXRlCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgZ3VpZAotCSAqIEBwYXJhbSBndWlkIFN0cmluZwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRHdWlkKFN0cmluZyBndWlkKSB7Ci0JCWF0dHJpYnV0ZU1hcC5wdXQoTElOS19BVFRSX0dVSUQsIGd1aWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCWF0dHJpYnV0ZU1hcC5wdXQoTElOS19BVFRSX0hSRUYsIHVybCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRWxlbWVudFVybChNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWQoKTsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gbnVsbDsKLQkJCWUgPSBnZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCi0JCQkvLyBpZiBwcm9jZXNzIGNvbXBvbmVudCwgZ2V0IHNob3cgdGhlIHByb2Nlc3MKLQkJCWlmIChlIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCWUgPSAoKFByb2Nlc3NDb21wb25lbnQpIGUpLmdldFByb2Nlc3MoKTsKLQkJCX0KLQotCQkJLy8gMTU2NDc0IC0gUHJvY2VzcyBQYWNrYWdlIChlaXRoZXIgQ1AgcGFja2FnZSBvciBEUCBwYWNrYWdlKSBjYW4KLQkJCS8vIG5vdCBiZSBsaW5rZWQgaW4gUlRFCi0JCQkvLyBkb24ndCBzaG93IGxpbmsgZm9yIHBhY2thZ2VzLgotCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkJCXx8IGUgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJZSA9IG51bGw7Ci0JCQkJLy8gcmVtb3ZlIHRoZSBsaW5rIGF0eXRyaWJ1dGUKLQkJCQlzZXRVcmwobnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZTEgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KGUsIGNvbmZpZyk7Ci0JCQkJCWlmIChlMSAhPSBudWxsKSB7Ci0JCQkJCQllID0gZTE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpc01pc3NpbmdSZWZlcmVuY2UgPSB0cnVlOwotCQkJCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaXNNaXNzaW5nUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQl2YWxpZGF0b3IubG9nTWlzc2luZ1JlZmVyZW5jZShvd25lckVsZW1lbnQsIGd1aWQsIGxpbmtlZFRleHQpOwotCQkJfQotCi0JCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJZ3VpZCA9IGUuZ2V0R3VpZCgpOwotCQkJCXNldEd1aWQoZ3VpZCk7Ci0JCQkJU3RyaW5nIHVybCA9IGdldFVybCgpOwotCi0JCQkJLy8gdXJsIGNhbiBiZSBudWxsLCBmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBsaW5rIGZvcgotCQkJCS8vIHByZXNlbnRhdGlvbiBuYW1lLCBzdWNoIGFzCi0JCQkJLy8gPGEgY2xhc3M9IlByZXNlbnRhdGlvbk5hbWUiCi0JCQkJLy8gZ3VpZD0ie0VFOTdBOENELTY2Q0EtNEE5Qi05ODcxLUUzQjk0Q0NFRDUyOH0iPlByb2plY3QKLQkJCQkvLyBNYW5hZ2VyPC9hPgotCQkJCS8vIHdlIG9ubHkgbmVlZCB0byBnZXQgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZ3VpZAotCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQl1cmwgPSB1cmwudHJpbSgpOwotCQkJCQlpZiAoIXVybC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoCi0JCQkJCQkJUmVzb3VyY2VIZWxwZXIuVVJMX1NUUl9KQVZBU0NSSVBUKSkgewotCQkJCQkJdXJsID0gUmVzb3VyY2VIZWxwZXIuZ2V0VXJsKGUsIG93bmVyRWxlbWVudCwKLQkJCQkJCQkJUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCwgdXJsKTsKLQkJCQkJCXNldFVybCh1cmwpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGlzRWxlbWVudExpbmsoKSAmJiAhdGFnLmVxdWFscygiYXJlYSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIHRleHQgPSBSZXNvdXJjZUhlbHBlci5nZXRMaW5rVGV4dChlLAotCQkJCQkJCWdldEVsZW1lbnRMaW5rVHlwZSgpKTsKLQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCQkJLy8gaWYgbnVsbCwgY2FuIGJlIHVzZWQgdGV4dCwgZG9uJ3QgcmVzZXQgaXQKLQkJCQkJCXRoaXMubGlua2VkVGV4dCA9IHRleHQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodmFsaWRhdG9yLmlzRGlzY2FyZGVkKG93bmVyRWxlbWVudCwgbnVsbCwgZSkpIHsKLQkJCQkJaXNNaXNzaW5nUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJdmFsaWRhdG9yLmxvZ01pc3NpbmdSZWZlcmVuY2Uob3duZXJFbGVtZW50LCBlKTsKLQkJCQkJZSA9IG51bGw7IC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIGRpc2NhcmRlZAotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5saW5rRWxlbWVudCA9IGU7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KFN0cmluZyBndWlkKSB7Ci0JCU1ldGhvZEVsZW1lbnQgZTsKLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsICYmIGdldExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQllID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQl9IGVsc2UgewotCQkJZSA9IGdldE1ldGhvZEVsZW1lbnRfKGd1aWQpOwotCQkJaWYgKGUgPT0gbnVsbCAmJiBtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQllID0gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlOwotCX0KLQotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNSVNTSU5HX1BBR0VTX1hTTCA9ICJwYWdlc19ub3RfaW5zdGFsbGVkLyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGdldE1pc3NpbmdFbGVtZW50VXJsKCkgewotCQlpZiAoIWlzTWlzc2luZ1JlZmVyZW5jZSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQotCQkvLyBpZiAobGlua0VsZW1lbnQgPT0gbnVsbCkgewotCQkvLyAvLyB0aGlzIGlzIGFuIGludmFsaWQgZWxlbWVudCwgbWF5YmUgZGVsZXRlZCBmcm9tIHRoZSBsaWJyYXJ5Ci0JCS8vIC8vIGFscmVhZHkKLQkJLy8gdXJsID0gUmVzb3VyY2VIZWxwZXIuTUlTU0lOR19QQUdFU19GT0xERVIgKyBnZXRHdWlkKCkKLQkJLy8gKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOwotCQkvLyB9IGVsc2UgewotCQkvLyB1cmwgPSBSZXNvdXJjZUhlbHBlci5NSVNTSU5HX1BBR0VTX0ZPTERFUgotCQkvLyArIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGxpbmtFbGVtZW50LAotCQkvLyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJLy8gfQotCi0JCXVybCA9IFJlc291cmNlSGVscGVyLk1JU1NJTkdfUEFHRVNfRk9MREVSICsgInBhZ2VzX25vdF9pbnN0YWxsZWQiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7Ci0KLQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCB1cmwpOwotCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAoIWRpci5leGlzdHMoKSkgewotCQkJZGlyLm1rZGlycygpOwotCQl9Ci0KLQkJLy8gaWYgKCAhZi5leGlzdHMoKSApCi0JCXsKLQkJCS8vIGdlbmVyYXRlIHRoZSBodG1sIGZpbGUKLQkJCVhtbEVsZW1lbnQgeG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkKLQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJCXhtbC5zZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkJCWlmIChsaW5rRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJeG1sLnNldEF0dHJpYnV0ZSgiaW52YWxpZExpbmsiLCAidHJ1ZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGxpbmtlZFRleHQpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXhtbAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiZ3VpZCIsIGdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgidHlwZSIsIGxpbmtFbGVtZW50LmdldFR5cGUoKS5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBsaW5rRWxlbWVudC5nZXROYW1lKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCSJwbHVnaW5OYW1lIiwgTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGxpbmtFbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJpbmcgeHNsUGF0aCA9IExheW91dFJlc291cmNlcy5nZXREZWZhdWx0WHNsUGF0aCgKLQkJCQkJInBhZ2Vfbm90X2luc3RhbGxlZCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlzYXZlSHRtbCh4bWwsIHhzbFBhdGgsIGYpOwotCQl9Ci0KLQkJcmV0dXJuIFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKG93bmVyRWxlbWVudCkucmVwbGFjZSgKLQkJCQlGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkrIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBzYXZlIGEgaHRtbCBmaWxlIAotCSAqIEBwYXJhbSB4bWxFbGVtZW50Ci0JICogQHBhcmFtIHhzbF91cmkKLQkgKiBAcGFyYW0gb3V0cHV0RmlsZQotCSAqIEBkZXByZWNhdGVkIHRoaXMgbWV0aG9kIGlkIG5vdCB1c2VkIGFueSBtb3JlCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZUh0bWwoWG1sRWxlbWVudCB4bWxFbGVtZW50LCBTdHJpbmcgeHNsX3VyaSwgRmlsZSBvdXRwdXRGaWxlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgb3V0cHV0KTsKLQkJCW91dHB1dC5mbHVzaCgpOwotCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhTdHJpbmcgZ3VpZCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChnZXRMaWJyYXJ5KCkgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJSUxpYnJhcnlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IChJTGlicmFyeVJlc291cmNlU2V0KSBnZXRMaWJyYXJ5KCkKLQkJCQkJCQkuZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiAoTWV0aG9kRWxlbWVudCkgcmVzb3VyY2VTZXQuZ2V0RU9iamVjdChndWlkKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0aCkgewotCQkJCQkvLyBMb2cgZXJyb3IgaGVyZQotCQkJCQl0aC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCUxpbmtJbmZvLmxpYnJhcnkgPSBsaWJyYXJ5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvUHJvY2Vzc0FkYXB0ZXJGYWN0b3J5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGI3YjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9Qcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuSUFkYXB0ZXJGYWN0b3J5RmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci0KLQotCi0vKioKLSAqIFRoZSBwcm9jZXNzIGZpbHRlciB3aXRoIGFkYXB0b3IgZmFjdG9yeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NBZGFwdGVyRmFjdG9yeUZpbHRlciBleHRlbmRzIFByb2Nlc3NDb25maWd1cmF0b3IgaW1wbGVtZW50cwotCQlJQWRhcHRlckZhY3RvcnlGaWx0ZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50TGF5b3V0TWFuYWdlci5MYXlvdXRBZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JLyoqCi0JICogY29uc3RydWN0b3IgdGhlIGZpbHRlcgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RDb25maWcKLQkgKiBAcGFyYW0gZmFjdG9yeQotCSAqLwotCXB1YmxpYyBQcm9jZXNzQWRhcHRlckZhY3RvcnlGaWx0ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWcsIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLkxheW91dEFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIobWV0aG9kQ29uZmlnKTsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS53YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFRCU0FkYXB0ZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeS50YnNBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIEFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5IGdldFdQQlNBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIGZhY3Rvcnkud3Bic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gQWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnkgZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5LmNic0FkYXB0ZXJGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIGFjY2VwdCB0aGUgb2JqZWN0IG9yIG5vdC4KLQkgKiBAcGFyYW0gb2JqIE9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQob2JqKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmYWN0b3J5ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9SaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MWY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L1JpY2hUZXh0Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQ7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFNwZWNpYWwgY29udGVudCB2YWxpZGF0b3IgZm9yIHRoZSBSaWNoIFRleHQgRWRpdG9yCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dENvbnRlbnRWYWxpZGF0b3IgZXh0ZW5kcyBEZWZhdWx0Q29udGVudFZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZXMgYSBVUkwgd2l0aG91dCBkZWNvZGluZyBpdAotCSAqLwotCXB1YmxpYyBMaW5rSW5mbyB2YWxpZGF0ZUxpbmsoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGF0dHJpYnV0ZXMsCi0JCQlTdHJpbmcgdGV4dCwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyB0YWcpIHsKLQotCQlMaW5rSW5mbyBpbmZvID0gbmV3IExpbmtJbmZvKG93bmVyLCB0aGlzLCBwdWJEaXIsIHRhZykgewotCQkJcHJvdGVjdGVkIFN0cmluZyBkZWNvZGUoU3RyaW5nIHN0cikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQkJCXJldHVybiBzdHI7Ci0JCQl9Ci0JCX07Ci0JCWluZm8udmFsaWRhdGVMaW5rKGF0dHJpYnV0ZXMsIHRleHQsIGNvbmZpZyk7Ci0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vRGlhZ3JhbUluZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9EaWFncmFtSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGNiMTZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9EaWFncmFtSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBjbGFzcyBmb3IgZGlhZ3JhbSBsYXlvdXQKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW5mbyBleHRlbmRzIE1ldGhvZEVsZW1lbnREaWFncmFtIHsKLQotCXByaXZhdGUgaW50IHN1cHByZXNzZWRDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbm9kZUNvdW50ID0gMDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBkaWFncmFtVHlwZQotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIERpYWdyYW1JbmZvKFN0cmluZyBkaWFncmFtVHlwZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKGVsZW1lbnQpOwotCi0JCXN1cGVyLnNldEhUTUxNYXAobmV3IEhUTUxNYXAoZGlhZ3JhbVR5cGUgKyAiXyIgKyBlbGVtZW50LmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogYWRkIGEgZGlhZ3JhbSBhcmVhCi0JICogQHBhcmFtIGUKLQkgKiBAcGFyYW0geAotCSAqIEBwYXJhbSB5Ci0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGhlaWdodAotCSAqIEBwYXJhbSBhbHRUYWcKLQkgKiBAcGFyYW0gc3VwcHJlc3NlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFyZWEoTWV0aG9kRWxlbWVudCBlLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKLQkJCVN0cmluZyBhbHRUYWcsIGJvb2xlYW4gc3VwcHJlc3NlZCkgewotCQlpZiAoIHN1cHByZXNzZWQgKQotCQl7Ci0JCQlzdXBwcmVzc2VkQ291bnQrKzsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKGFsdFRhZyA9PSBudWxsKSB7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCWFsdFRhZyA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJaWYgKGFsdFRhZy5sZW5ndGgoKSA8IDEgfHwgYWx0VGFnID09ICIiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGUgaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJT2JqZWN0IGJhc2UgPSAoKEFjdGl2aXR5KSBlKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQkJCQlhbHRUYWcgPSAoKEFjdGl2aXR5KSBiYXNlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUgIT0gbnVsbCkgewotCQkJCWFsdFRhZyA9IGUuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlhbHRUYWcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJUmVjdGFuZ2xlIGNvb3JkaW5hdGVzID0gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQkJU3RyaW5nIGhyZWYgPSBSZXNvdXJjZUhlbHBlci5nZXRVcmwoZSwgc3VwZXIuZ2V0TWV0aG9kRWxlbWVudCgpLAotCQkJCVJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUwpOwotCQlIVE1MTWFwIG1hcCA9IHN1cGVyLmdldEhUTUxNYXAoKTsKLQkJbWFwLmFkZEFyZWEobmV3IEhUTUxBcmVhKGUuZ2V0R3VpZCgpLCBocmVmLCAicmVjdCIsIGNvb3JkaW5hdGVzLCBhbHRUYWcpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBBZGQgZ3JhcGhpY2FsIG5vZGVzCi0JICovCi0JcHVibGljIHZvaWQgYWRkR3JhcGhpY2FsTm9kZXMoKSB7Ci0JCW5vZGVDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VGaWxlUGF0aChTdHJpbmcgcGF0aCkgewotCQlzdXBlci5zZXRJbWFnZUZpbGVOYW1lKFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKHN1cGVyCi0JCQkJLmdldE1ldGhvZEVsZW1lbnQoKSkKLQkJCQkrIHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbnVtYmVyIG9mIGFyZWFzCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFyZWFDb3VudCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEhUTUxNYXAoKS5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBudW1iZXIgb2Ygc3VwcHJlc3NlZCBhcmVhcwotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdXBwcmVzc2VkQ291bnQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkQ291bnQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgbnVtYmVyIG9mIGdyYXBoaWNhbCBub2RlcyBpbiB0aGUgZGlhZ3JhbQotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRHcmFwaGljYWxOb2RlQ291bnQoKSB7Ci0JCXJldHVybiBub2RlQ291bnQ7Ci0JfQotCQotCS8qKgotCSAqIGlzIGVtcHR5PwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQotCQlyZXR1cm4gZ2V0QXJlYUNvdW50KCkgKyBnZXRTdXBwcmVzc2VkQ291bnQoKSArIGdldEdyYXBoaWNhbE5vZGVDb3VudCgpID09IDA7Ci0JCQkJCQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0hUTUxBcmVhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTEFyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0YjllYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTEFyZWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtOwotCi1pbXBvcnQgamF2YS5hd3QuUmVjdGFuZ2xlOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgSFRNTCBBUkVBIHRhZy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYSQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTEFyZWEgewotCi0JcHJpdmF0ZSBTdHJpbmcgZ3VpZCA9ICBudWxsOwotCQotCXByaXZhdGUgU3RyaW5nIGhyZWY7Ci0KLQlwcml2YXRlIFN0cmluZyBzaGFwZTsKLQotCXByaXZhdGUgUmVjdGFuZ2xlIGNvb3JkaW5hdGVzOwotCi0JcHJpdmF0ZSBTdHJpbmcgYWx0VGFnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5IVE1MQXJlYTwvY29kZT4uCi0JICovCi0JcHVibGljIEhUTUxBcmVhKFN0cmluZyBndWlkLCBTdHJpbmcgaHJlZiwgU3RyaW5nIHNoYXBlLCBSZWN0YW5nbGUgY29vcmRpbmF0ZXMsCi0JCQlTdHJpbmcgYWx0VGFnKSB7Ci0JCXRoaXMuZ3VpZCA9IGd1aWQ7Ci0JCXRoaXMuaHJlZiA9IGhyZWY7Ci0JCXRoaXMuc2hhcGUgPSBzaGFwZTsKLQkJdGhpcy5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzOwotCQl0aGlzLmFsdFRhZyA9IGFsdFRhZzsKLQkJCi0JCS8vIHJlbW92ZSBuZXcgbGluZSBjaGFyYWN0ZXJzLCBvdGhlcndpc2UgaXQgd2lsbCBjYXVzZWQgYSB3aGl0ZSBzcGFjZSBpbiB0aGUgcHVibGlzaGVkIGh0bWwKLQkJLy8gbm90IGFzIGV4cGVjdGVkLiAKLQkJLy8gc2VlIGJ1ZyAwMDM4ODk3OCAtIEV4dHJhIHNwYWNlIGluIHRoZSBmbHlvdmVyIHRleHQgaW4gdGhlIENhc3BpYW4gSmFwYW5lc2Ugc2l0ZQkJCi0JCWlmICggdGhpcy5hbHRUYWcgIT0gbnVsbCApIHsKLQkJCXRoaXMuYWx0VGFnID0gdGhpcy5hbHRUYWcucmVwbGFjZUFsbCgiKFxyfFxuKSsiLCAiIik7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkgewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSFJFRi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBocmVmOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXBlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGUoKSB7Ci0JCXJldHVybiBzaGFwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb29yZGluYXRlcy4KLQkgKi8KLQlwdWJsaWMgUmVjdGFuZ2xlIGdldENvb3JkaW5hdGVzKCkgewotCQlyZXR1cm4gY29vcmRpbmF0ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWx0IHRhZy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdFRhZygpIHsKLQkJcmV0dXJuIGFsdFRhZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vSFRNTE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBhYmJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9IVE1MTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEVuY2Fwc3VsYXRlcyB0aGUgSFRNTCBNQVAgdGFnLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNYXAgewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGFyZWFzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5IVE1MTWFwPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSFRNTE1hcChTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGFyZWEgdG8gdGhlIG1hcC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBcmVhKEhUTUxBcmVhIGFyZWEpIHsKLQkJaWYgKGFyZWEgIT0gbnVsbCkgewotCQkJYXJlYXMuYWRkKGFyZWEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciB0byBpdGVyYXRlIHRoZSBhcmVhcy4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0QXJlYXMoKSB7Ci0JCXJldHVybiBhcmVhcy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGFyZWFzLnNpemUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9JQWN0aXZpdHlEaWFncmFtU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0lBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyM2E1OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL0lBY3Rpdml0eURpYWdyYW1TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLQotcHVibGljIGludGVyZmFjZSBJQWN0aXZpdHlEaWFncmFtU2VydmljZSB7Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBlbGVtZW50IGRpYWdyYW0gaW1hZ2UgYW5kIHJldHVybnMgdGhlIGltYWdlIGZpbGUgdXJsLgotCSAqIAotCSAqIEBwYXJhbSB3cmFwZXIgT2JqZWN0IHRoZSBpdGVtIHByb3ZpZGVyIHdyYXBwZXIgb2YgdGhlIGFjdGl2aXR5IGVsZW1lbnQKLQkgKiBAcGFyYW0gaW1nUGF0aCBTdHJpbmcgdGhlIGdlbmVyYXRlZCBpbWFnZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpci4KLQkgKiBAcGFyYW0gZGlhZ3JhbVR5cGUKLQkgKiBAcGFyYW0gZmlsdGVyCi0JICogICAgICAgICAgICBJRmlsdGVyCi0JICogQHBhcmFtIHN1cAotCSAqICAgICAgICAgICAgU3VwcHJlc3Npb24KLQkgKiBAcmV0dXJuIERpYWdyYW1JbmZvIHRoZSBkaWFncmFtIGluZm8KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUluZm8gc2F2ZURpYWdyYW0oT2JqZWN0IHdyYXBlciwgU3RyaW5nIGltZ1BhdGgsIFN0cmluZyBkaWFncmFtVHlwZSwKLQkJCUlGaWx0ZXIgZmlsdGVyLCBTdXBwcmVzc2lvbiBzdXApOwotCQotCQotCXB1YmxpYyBBY3Rpdml0eSBnZXRSZWFsaXplZEZvclVubW9kaWZpZWQoT2JqZWN0IHdyYXBwZXIsIElGaWx0ZXIgZmlsdGVyLCAKLQkJCVN1cHByZXNzaW9uIHN1cHByZXNzaW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL01ldGhvZEVsZW1lbnREaWFncmFtLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vTWV0aG9kRWxlbWVudERpYWdyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5MWZkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vTWV0aG9kRWxlbWVudERpYWdyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBFbmNhcHN1bGF0ZXMgYSBwdWJsaXNoZWQgZGlhZ3JhbSBmb3IgYSA8Y29kZT5NZXRob2RFbGVtZW50PC9jb2RlPi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudERpYWdyYW0gewotCi0JLy8gVGhlIE1ldGhvZEVsZW1lbnQuCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGVsZW1lbnQ7Ci0KLQkvLyBUaGUgZ2VuZXJhdGVkIEpQRUcgZmlsZSBuYW1lLgotCXByaXZhdGUgU3RyaW5nIGltYWdlRmlsZU5hbWU7Ci0KLQkvLyBUaGUgSFRNTCBBcmVhIE1hcC4KLQlwcml2YXRlIEhUTUxNYXAgaHRtbE1hcDsKLQotCS8vIFRoZSBIVE1MIHRoYXQgcmVwcmVzZW50cyB0aGlzIGRpYWdyYW0uCi0JLy8gcHJpdmF0ZSBTdHJpbmcgZGlhZ3JhbUhUTUw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJvbGVEaWFncmFtSW5mbzwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIFRoZSA8Y29kZT5Db250ZW50RWxlbWVudDwvY29kZT4uCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnREaWFncmFtKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk1ldGhvZEVsZW1lbnQ8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHVibGlzaGVkCi0JICogZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5NZXRob2RFbGVtZW50PC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhlIHB1Ymxpc2hlZAotCSAqICAgICAgICAgZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmaWxlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBUaGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGltYWdlRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVOYW1lCi0JICogICAgICAgICAgICBUaGUgaW1hZ2UgZmlsZSBuYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlRmlsZU5hbWUoU3RyaW5nIGltYWdlRmlsZU5hbWUpIHsKLQkJdGhpcy5pbWFnZUZpbGVOYW1lID0gaW1hZ2VGaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIEFyZWEgTWFwLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIEhUTUwgQXJlYSBNYXAuCi0JICovCi0JcHVibGljIEhUTUxNYXAgZ2V0SFRNTE1hcCgpIHsKLQkJcmV0dXJuIGh0bWxNYXA7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgSFRNTCBBcmVhIE1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gaHRtbE1hcAotCSAqICAgICAgICAgICAgVGhlIEhUTUwgQXJlYSBNYXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SFRNTE1hcChIVE1MTWFwIGh0bWxNYXApIHsKLQkJdGhpcy5odG1sTWFwID0gaHRtbE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgZGlhZ3JhbS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBIVE1MIHNvdXJjZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpYWdyYW0uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIVE1MKCkgewotCQlTdHJpbmdCdWZmZXIgaHRtbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaHRtbC5hcHBlbmQoIjxwPiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbWFnZUZpbGVOYW1lICE9IG51bGwgJiYgaHRtbE1hcCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbWFwTmFtZSA9IGh0bWxNYXAuZ2V0TmFtZSgpOwotCQkJaHRtbC5hcHBlbmQoIjxtYXAgbmFtZT1cIiIpLmFwcGVuZChodG1sTWFwLmdldE5hbWUoKSkuYXBwZW5kKCJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJdGVyYXRvciBhcmVhcyA9IGh0bWxNYXAuZ2V0QXJlYXMoKTsKLQkJCXdoaWxlIChhcmVhcy5oYXNOZXh0KCkpIHsKLQkJCQlIVE1MQXJlYSBodG1sQXJlYSA9IChIVE1MQXJlYSkgYXJlYXMubmV4dCgpOwotCQkJCVJlY3RhbmdsZSBjb29yZHMgPSBodG1sQXJlYS5nZXRDb29yZGluYXRlcygpOwotCQkJCWh0bWwKLQkJCQkJCS5hcHBlbmQoIjxhcmVhIGhyZWY9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0SHJlZigpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIgc2hhcGU9XCIiKS5hcHBlbmQoaHRtbEFyZWEuZ2V0U2hhcGUoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiIGNvb3Jkcz1cIiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoKGludCkgY29vcmRzLmdldFgoKSkKLQkJCQkJCS5hcHBlbmQoIiwgIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgoaW50KSBjb29yZHMuZ2V0WSgpKQotCQkJCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WCgpICsgY29vcmRzLmdldFdpZHRoKCkpKQotCQkJCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WSgpICsgY29vcmRzLmdldEhlaWdodCgpKSkKLQkJCQkJCS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLmFwcGVuZCgiIGFsdD1cIiIpLmFwcGVuZChodG1sQXJlYS5nZXRBbHRUYWcoKSkuYXBwZW5kKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLmFwcGVuZCgiIHRpdGxlPVwiIikuYXBwZW5kKGh0bWxBcmVhLmdldEFsdFRhZygpKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuYXBwZW5kKCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlodG1sLmFwcGVuZCgiPC9tYXA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWwKLQkJCQkJLmFwcGVuZCgiPGltZyBib3JkZXI9XCIwXCIgc3JjPVwiIikuYXBwZW5kKGltYWdlRmlsZU5hbWUpLmFwcGVuZCgiXCIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLmFwcGVuZCgiIGFsdD1cIiIpLmFwcGVuZChtYXBOYW1lKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5hcHBlbmQoIiB0aXRsZT1cIiIpLmFwcGVuZChtYXBOYW1lKS5hcHBlbmQoIlwiIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5hcHBlbmQoIiB1c2VtYXA9XCIjIikuYXBwZW5kKG1hcE5hbWUpLmFwcGVuZCgiXCIvPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlodG1sLmFwcGVuZCgiPC9wPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBodG1sLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZWxlbWVudCBmb3IgdGhlIGRpYWdyYW0KLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KCkKLQl7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IG51bGw7Ci0KLQkJaWYgKGltYWdlRmlsZU5hbWUgIT0gbnVsbCAmJiBodG1sTWFwICE9IG51bGwpIHsKLQkJCVN0cmluZyBtYXBOYW1lID0gaHRtbE1hcC5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgZXNjYXBlZE5hbWUgPSBTdHJVdGlsLnRvRXNjYXBlZFVuaWNvZGUobWFwTmFtZSwgdHJ1ZSkucmVwbGFjZSgiXFx1IiwgIiIpOwotCQkJeG1sRWxlbWVudCA9IG5ldyBYbWxFbGVtZW50KCJtYXAiKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGVzY2FwZWROYW1lKSAgLy8kTk9OLU5MUy0xJCAKLQkJCQkuc2V0QXR0cmlidXRlKCJzcmMiLCBpbWFnZUZpbGVOYW1lKSAvLyROT04tTkxTLTEkIAotCQkJCS5zZXRBdHRyaWJ1dGUoImFsdCIsIG1hcE5hbWUpOyAgLy8kTk9OLU5MUy0xJCAKLQkJCQotCQkJSXRlcmF0b3IgYXJlYXMgPSBodG1sTWFwLmdldEFyZWFzKCk7Ci0JCQl3aGlsZSAoYXJlYXMuaGFzTmV4dCgpKSB7Ci0JCQkJSFRNTEFyZWEgaHRtbEFyZWEgPSAoSFRNTEFyZWEpIGFyZWFzLm5leHQoKTsKLQkJCQlSZWN0YW5nbGUgY29vcmRzID0gaHRtbEFyZWEuZ2V0Q29vcmRpbmF0ZXMoKTsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWJ1ZmZlci5hcHBlbmQoKGludCkgY29vcmRzLmdldFgoKSkKLQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKChpbnQpIGNvb3Jkcy5nZXRZKCkpCi0JCQkJLmFwcGVuZCgiLCAiKSAvLyROT04tTkxTLTEkCi0JCQkJLmFwcGVuZCgoaW50KSAoY29vcmRzLmdldFgoKSArIGNvb3Jkcy5nZXRXaWR0aCgpKSkKLQkJCQkuYXBwZW5kKCIsICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKChpbnQpIChjb29yZHMuZ2V0WSgpICsgY29vcmRzLmdldEhlaWdodCgpKSk7Ci0JCQkJCi0JCQkJLy8gbmVlZCB0byBlc2NhcGUgdGhlIHVybCBzaW5jZSBpdCB3aWxsIGJlIHBhc3NlZCBhcyBhIGxpdGVyYWwgc3RyaW5nIHRvIGEgamF2YXNjcmlwdCB2YXJpYWJsZQotCQkJCXhtbEVsZW1lbnQubmV3Q2hpbGQoImFyZWEiKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCAoaHRtbEFyZWEuZ2V0R3VpZCgpID09IG51bGwpID8gIiIgOiBodG1sQXJlYS5nZXRHdWlkKCkgKSAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoImhyZWYiLCBTdHJVdGlsLmVzY2FwZShodG1sQXJlYS5nZXRIcmVmKCkpKQkvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInNoYXBlIiwgaHRtbEFyZWEuZ2V0U2hhcGUoKSkJLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJjb29yZHMiLCBidWZmZXIudG9TdHJpbmcoKSkJLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJhbHQiLCBodG1sQXJlYS5nZXRBbHRUYWcoKSk7CS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHhtbEVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL1JvbGVEaWFncmFtUHVibGlzaGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vUm9sZURpYWdyYW1QdWJsaXNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlNDA1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2RpYWdyYW0vUm9sZURpYWdyYW1QdWJsaXNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZGlhZ3JhbTsKLQotaW1wb3J0IGphdmEuYXd0LkJhc2ljU3Ryb2tlOwotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKLWltcG9ydCBqYXZhLmF3dC5Qb2ludDsKLWltcG9ydCBqYXZhLmF3dC5SZWN0YW5nbGU7Ci1pbXBvcnQgamF2YS5hd3QuUmVuZGVyaW5nSGludHM7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dHVyZVBhaW50OwotaW1wb3J0IGphdmEuYXd0Lmdlb20uTGluZTJEOwotaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JMThuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkltYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5Sb2xlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZlcmVuY2VzLkxpYnJhcnlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLQotLyoqCi0gKiBSZW5kZXJzIHRoZSBSb2xlIGRpYWdyYW0gdXNpbmcgSmF2YTJEIGFuZCBzYXZlcyBpdCBhcyBhIEpQRUcgZmlsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURpYWdyYW1QdWJsaXNoZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRk9OVF9OQU1FID0gIkFyaWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRk9OVF9TSVpFID0gMTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9YX01BUkdJTiA9IDIwMDsKLQotCS8vIFRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBnZW5lcmF0ZWQgaW1hZ2UuCi0JcHJpdmF0ZSBpbnQgbWF4SW1hZ2VXaWR0aCA9IDEwMjQ7Ci0KLQkvLyBUaGUgbWF4aW11bSBoZWlnaHQgb2YgdGhlIGdlbmVyYXRlZCBpbWFnZS4KLQlwcml2YXRlIGludCBtYXhJbWFnZUhlaWdodCA9IDEwMjQ7Ci0KLQkvLyBUaGUgYm9yZGVyIHdpZHRoLgotCXByaXZhdGUgaW50IGJvcmRlcldpZHRoID0gMTA7Ci0KLQkvLyBUaGUgYm9yZGVyIGhlaWdodC4KLQlwcml2YXRlIGludCBib3JkZXJIZWlnaHQgPSAxMDsKLQotCS8vIFRoZSBhZGRpdGlvbmFsIHNwYWNpbmcgYmVmb3JlIHRoZSBsZWZ0LW1vc3QgVGFzayBhbmQvb3IgV29yayBQcm9kdWN0Ci0JLy8gaW1hZ2UuCi0JcHJpdmF0ZSBpbnQgeE1hcmdpbiA9IDI0MDsKLQotCS8vIFRoZSBob3Jpem9udGFsIHNwYWNpbmcgYmV0d2VlbiB0aGUgZWxlbWVudCBpbWFnZXMuCi0JcHJpdmF0ZSBpbnQgeFNwYWNpbmc7Ci0KLQkvLyBUaGUgdmVydGljYWwgc3BhY2luZyBiZXR3ZWVuIHRoZSBlbGVtZW50IGltYWdlcy4KLQlwcml2YXRlIGludCB5U3BhY2luZzsKLQotCS8vIFRoZSBtYXhpbXVuIG51bWJlciBvZiB0ZXh0IGxpbmVzIGZvciB0aGUgZWxlbWVudCBsYWJlbHMuCi0JcHJpdmF0ZSBpbnQgbWF4VGV4dExpbmVzOwotCi0JcHJpdmF0ZSBpbnQgbGluZVBhZGRpbmcgPSAxMjsKLQotCXByaXZhdGUgRm9udCB0ZXh0Rm9udCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkltYWdlUHVibGlzaGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUm9sZURpYWdyYW1QdWJsaXNoZXIoKSB7Ci0JCS8vIFNlbGVjdCB0aGUgZm9udCBmb3IgcmVuZGVyaW5nIHRoZSBlbGVtZW50IG5hbWVzLgotCQlTdHJpbmcgZm9udE5hbWU7Ci0JCWludCBmb250U2l6ZTsKLQkJZm9udE5hbWUgPSBnZXRGb250TmFtZSgpOwotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJZm9udFNpemUgPSBJMThuVXRpbC5nZXRJbnQoCi0JCQkJCUxpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X3NpemVfd2luMzIsCi0JCQkJCURFRkFVTFRfRk9OVF9TSVpFKTsKLQkJfSBlbHNlIHsKLQkJCWZvbnRTaXplID0gSTE4blV0aWwuZ2V0SW50KExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X3NpemUsCi0JCQkJCURFRkFVTFRfRk9OVF9TSVpFKTsKLQkJfQotCQlpZiAoZm9udE5hbWUuc3RhcnRzV2l0aCgiWyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZvbnROYW1lID0gREVGQVVMVF9GT05UX05BTUU7Ci0JCX0KLQkJdGV4dEZvbnQgPSBuZXcgRm9udChmb250TmFtZSwgRm9udC5QTEFJTiwgZm9udFNpemUpOwotCi0JCXhNYXJnaW4gPSBJMThuVXRpbC5nZXRJbnQoTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbV94TWFyZ2luLAotCQkJCURFRkFVTFRfWF9NQVJHSU4pOwotCi0JCXhTcGFjaW5nID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoKTsKLQkJeVNwYWNpbmcgPSBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKTsKLQkJbWF4VGV4dExpbmVzID0gTGlicmFyeVByZWZlcmVuY2VzLmdldFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRGb250TmFtZSgpIHsKLQkJU3RyaW5nIGZvbnROYW1lOwotCQlpZiAoUGxhdGZvcm0uZ2V0TkwoKS5zdGFydHNXaXRoKCJqYSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX2phOwotCQkJfSBlbHNlIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfamE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoUGxhdGZvcm0uZ2V0TkwoKS5zdGFydHNXaXRoKCJrbyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX2tvOwotCQkJfSBlbHNlIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfa287Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoUGxhdGZvcm0uZ2V0TkwoKS5zdGFydHNXaXRoKCJ6aF9UVyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX3poX1RXOwotCQkJfSBlbHNlIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfemhfVFc7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoUGxhdGZvcm0uZ2V0TkwoKS5zdGFydHNXaXRoKCJ6aCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoUGxhdGZvcm0uV1NfV0lOMzIpKSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lX3dpbjMyX3poOwotCQkJfSBlbHNlIHsKLQkJCQlmb250TmFtZSA9IExpYnJhcnlSZXNvdXJjZXMucm9sZURpYWdyYW1Gb250X25hbWVfemg7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKFBsYXRmb3JtLldTX1dJTjMyKSkgewotCQkJCWZvbnROYW1lID0gTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbUZvbnRfbmFtZV93aW4zMjsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9udE5hbWUgPSBMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtRm9udF9uYW1lOwotCQkJfQotCQl9Ci0JCXJldHVybiBmb250TmFtZTsKLQotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyB0aGUgUm9sZSBEaWFncmFtIEhUTUwgc291cmNlIGZvciB0aGUgZ2l2ZW4gcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgVGhlIFJvbGUgZWxlbWVudC4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgVGhlIHB1Ymxpc2ggcGF0aC4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+TWV0aG9kRWxlbWVudERpYWdyYW08L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogICAgICAgICBwdWJsaXNoZWQgZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudERpYWdyYW0gcHVibGlzaChSb2xlTGF5b3V0IHJvbGVMYXlvdXQsIEZpbGUgcGF0aCkgewotCi0JCVJvbGUgcm9sZSA9IChSb2xlKSByb2xlTGF5b3V0LmdldEVsZW1lbnQoKTsKLQotCQlpZiAocm9sZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0cnkgewotCQkJTWV0aG9kRWxlbWVudERpYWdyYW0gZWxlbWVudERpYWdyYW0gPSBuZXcgTWV0aG9kRWxlbWVudERpYWdyYW0ocm9sZSk7Ci0KLQkJCVN0cmluZyBwdWJsaXNoRGlyID0gcm9sZUxheW91dC5nZXRMYXlvdXRNZ3IoKS5nZXRQdWJsaXNoRGlyKCk7Ci0JCQlTdHJpbmcgbWFwTmFtZSA9IHJvbGVMYXlvdXQuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWlmIChtYXBOYW1lID09IG51bGwgfHwgbWFwTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJbWFwTmFtZSA9ICJVbmtub3duIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQltYXBOYW1lID0gbWFwTmFtZS5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCX0KLQkJCUhUTUxNYXAgaHRtbE1hcCA9IG5ldyBIVE1MTWFwKG1hcE5hbWUpOwotCQkJZWxlbWVudERpYWdyYW0uc2V0SFRNTE1hcChodG1sTWFwKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSBBV1QgSlBhbmVsIGZvciByZW5kZXJpbmcgdGhlIGRpYWdyYW0uCi0JCQlKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKCk7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgb3V0cHV0IEJ1ZmZlcmVkSW1hZ2UuCi0JCQlCdWZmZXJlZEltYWdlIG91dHB1dEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UobWF4SW1hZ2VXaWR0aCwKLQkJCQkJbWF4SW1hZ2VIZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCKTsKLQkJCUdyYXBoaWNzMkQgZzJkID0gKEdyYXBoaWNzMkQpIG91dHB1dEltYWdlLmdldEdyYXBoaWNzKCk7Ci0KLQkJCS8vIFN3aXRjaCBvbiBhbnRpLWFsaWFzaW5nLgotCQkJZzJkLnNldFJlbmRlcmluZ0hpbnQoUmVuZGVyaW5nSGludHMuS0VZX1RFWFRfQU5USUFMSUFTSU5HLAotCQkJCQlSZW5kZXJpbmdIaW50cy5WQUxVRV9URVhUX0FOVElBTElBU19PTik7Ci0JCQlnMmQuc2V0UmVuZGVyaW5nSGludChSZW5kZXJpbmdIaW50cy5LRVlfQU5USUFMSUFTSU5HLAotCQkJCQlSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOwotCQkJZzJkLmZpbGxSZWN0KDAsIDAsIG1heEltYWdlV2lkdGgsIG1heEltYWdlSGVpZ2h0KTsKLQotCQkJLy8gU2V0IHRoZSBzdHJva2UgZm9yIGRyYXdpbmcgdGhlIGFzc29jaWF0aW9uIGxpbmVzLgotCQkJZzJkLnNldFN0cm9rZShuZXcgQmFzaWNTdHJva2UoMS4yNWYpKTsKLQkJCWcyZC5zZXRDb2xvcihDb2xvci5CTEFDSyk7Ci0KLQkJCWludCB4T2Zmc2V0ID0geFNwYWNpbmcgLyAyOwotCi0JCQkvLyBSZW5kZXJzIHRoZSBUYXNrcyBwZXJmb3JtZWQgYnkgdGhlIFJvbGUuCi0JCQlMaXN0IHRhc2tzID0gcm9sZUxheW91dC5nZXRQZXJmb3JtcygpOwotCQkJaW50IHRvdGFsVGFza3MgPSB0YXNrcyAhPSBudWxsID8gdGFza3Muc2l6ZSgpIDogMDsKLQkJCVBvaW50IHRhc2tTdGFydFBvaW50ID0gbmV3IFBvaW50KGJvcmRlcldpZHRoICsgeE1hcmdpbiwKLQkJCQkJYm9yZGVySGVpZ2h0KTsKLQkJCVBvaW50IHRhc2tFbmRQb2ludCA9IG5ldyBQb2ludChib3JkZXJXaWR0aCArIHhNYXJnaW4sIGJvcmRlckhlaWdodCk7Ci0JCQlpbnQgeCA9IHRhc2tTdGFydFBvaW50Lng7Ci0JCQlpbnQgeSA9IHRhc2tTdGFydFBvaW50Lnk7Ci0JCQlpbnQgdGFza3NFbmRYID0gMDsKLQkJCWlmICh0b3RhbFRhc2tzID4gMCkgewotCQkJCWludCB0YXNrTm8gPSAxOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHRhc2tzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyB0YXNrTm8rKykgewotCQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgaS5uZXh0KCk7Ci0KLQkJCQkJSUVsZW1lbnRMYXlvdXQgdGFza0xheW91dCA9IHJvbGVMYXlvdXQuZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkuZ2V0TGF5b3V0KHRhc2ssIHRydWUpOwotCi0JCQkJCVN0cmluZyB0YXNrTmFtZSA9IHRhc2tMYXlvdXQuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IHB1Ymxpc2hEaXIKLQkJCQkJCQkrIHRhc2tMYXlvdXQuZ2V0RGlhZ3JhbWljb25VcmwoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUJ1ZmZlcmVkSW1hZ2UgdGFza0ltYWdlID0gSW1hZ2VVdGlsLmdldEJ1ZmZlcmVkSW1hZ2UoCi0JCQkJCQkJCWltYWdlRmlsZSwgcGFuZWwpOwotCQkJCQkJaW50IHRhc2tXaWR0aCA9IHRhc2tJbWFnZS5nZXRXaWR0aCgpOwotCQkJCQkJaW50IHRhc2tIZWlnaHQgPSB0YXNrSW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0JCQkJCQlpZiAodGFza05vID09IDEpIHsKLQkJCQkJCQl0YXNrRW5kUG9pbnQueCArPSB0YXNrV2lkdGg7Ci0JCQkJCQkJdGFza0VuZFBvaW50LnkgKz0gdGFza0hlaWdodDsKLQkJCQkJCQl0YXNrc0VuZFggPSB0YXNrRW5kUG9pbnQueDsKLQkJCQkJCX0KLQkJCQkJCVJlY3RhbmdsZSB0YXNrSW1hZ2VSZWN0ID0gbmV3IFJlY3RhbmdsZSh4LCB5LAotCQkJCQkJCQl0YXNrV2lkdGgsIHRhc2tIZWlnaHQpOwotCQkJCQkJVGV4dHVyZVBhaW50IHRhc2tQYWludCA9IG5ldyBUZXh0dXJlUGFpbnQodGFza0ltYWdlLAotCQkJCQkJCQl0YXNrSW1hZ2VSZWN0KTsKLQkJCQkJCWcyZC5zZXRQYWludCh0YXNrUGFpbnQpOwotCQkJCQkJZzJkLmZpbGwodGFza0ltYWdlUmVjdCk7Ci0JCQkJCQlpZiAodGFza05hbWUgIT0gbnVsbCkgewotCQkJCQkJCUltYWdlVXRpbC5kcmF3VGV4dChnMmQsIHRhc2tOYW1lLCB0ZXh0Rm9udCwKLQkJCQkJCQkJCUNvbG9yLkJMQUNLLCB4IC0geE9mZnNldCwgdGFza0VuZFBvaW50LnksCi0JCQkJCQkJCQl0YXNrV2lkdGggKyB4U3BhY2luZywgbWF4VGV4dExpbmVzKTsKLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIGhyZWYgPSB0YXNrTGF5b3V0LmdldEZpbGVQYXRoKHJvbGVMYXlvdXQpCi0JCQkJCQkJCSsgdGFza0xheW91dC5nZXRGaWxlTmFtZSgiLmh0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSFRNTEFyZWEgaHRtbEFyZWEgPSBuZXcgSFRNTEFyZWEodGFzay5nZXRHdWlkKCksIGhyZWYsCi0JCQkJCQkJCSJyZWN0IiwgdGFza0ltYWdlUmVjdCwgdGFza05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlodG1sTWFwLmFkZEFyZWEoaHRtbEFyZWEpOwotCi0JCQkJCQlpZiAoeCArIHRhc2tXaWR0aCA+IHRhc2tzRW5kWCkgewotCQkJCQkJCXRhc2tzRW5kWCA9IHggKyB0YXNrV2lkdGg7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCQkJCWludCB4SW5jcmVtZW50ID0gdGFza1dpZHRoICsgeFNwYWNpbmc7Ci0JCQkJCQkJeCArPSB4SW5jcmVtZW50OwotCQkJCQkJCXRhc2tFbmRQb2ludC54ICs9IHhJbmNyZW1lbnQ7Ci0JCQkJCQkJaWYgKCh4ICsgeEluY3JlbWVudCArIHhPZmZzZXQgKyBib3JkZXJXaWR0aCkgPiBtYXhJbWFnZVdpZHRoKSB7Ci0JCQkJCQkJCXggPSB0YXNrU3RhcnRQb2ludC54OwotCQkJCQkJCQlpbnQgeUluY3JlbWVudCA9IHRhc2tIZWlnaHQgKyB5U3BhY2luZzsKLQkJCQkJCQkJeSArPSB5SW5jcmVtZW50OwotCQkJCQkJCQl0YXNrRW5kUG9pbnQueSArPSB5SW5jcmVtZW50OwotCQkJCQkJCQl0YXNrRW5kUG9pbnQueCA9IHRhc2tTdGFydFBvaW50LnggKyB0YXNrV2lkdGg7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbmRlcnMgdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCB0aGUgUm9sZSBpcyByZXNwb25zaWJsZSBmb3IuCi0JCQlMaXN0IHdvcmtQcm9kdWN0cyA9IHJvbGVMYXlvdXQuZ2V0UmVzcG9uc2libGVGb3IoKTsKLQkJCWludCB0b3RhbFdvcmtQcm9kdWN0cyA9IHdvcmtQcm9kdWN0cyAhPSBudWxsID8gd29ya1Byb2R1Y3RzLnNpemUoKQotCQkJCQk6IDA7Ci0JCQlQb2ludCB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQodGFza1N0YXJ0UG9pbnQueCwKLQkJCQkJYm9yZGVySGVpZ2h0KTsKLQkJCVBvaW50IHdvcmtQcm9kdWN0RW5kUG9pbnQgPSBuZXcgUG9pbnQodGFza1N0YXJ0UG9pbnQueCwKLQkJCQkJYm9yZGVySGVpZ2h0KTsKLQkJCWlmICh0b3RhbFRhc2tzID4gMCAmJiB0b3RhbFdvcmtQcm9kdWN0cyA+IDApIHsKLQkJCQl3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueSA9IHRhc2tFbmRQb2ludC55ICsgeVNwYWNpbmcgKyB5U3BhY2luZwotCQkJCQkJLyAyOwotCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueSA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC55OwotCQkJfSBlbHNlIGlmICh0b3RhbFRhc2tzID4gMCkgewotCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueSA9IHRhc2tFbmRQb2ludC55ICsgYm9yZGVySGVpZ2h0OwotCQkJfQotCQkJeCA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC54OwotCQkJeSA9IHdvcmtQcm9kdWN0U3RhcnRQb2ludC55OwotCQkJaW50IHdvcmtQcm9kdWN0c0VuZFggPSAwOwotCQkJaWYgKHRvdGFsV29ya1Byb2R1Y3RzID4gMCkgewotCQkJCWludCB3b3JrUHJvZHVjdE5vID0gMTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSB3b3JrUHJvZHVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7IHdvcmtQcm9kdWN0Tm8rKykgewotCQkJCQlXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCkgaS5uZXh0KCk7Ci0KLQkJCQkJSUVsZW1lbnRMYXlvdXQgd3BMYXlvdXQgPSByb2xlTGF5b3V0LmdldExheW91dE1ncigpCi0JCQkJCQkJLmdldExheW91dCh3b3JrUHJvZHVjdCwgdHJ1ZSk7Ci0KLQkJCQkJU3RyaW5nIHdvcmtQcm9kdWN0TmFtZSA9IHdwTGF5b3V0LmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJCVN0cmluZyBpbWFnZUZpbGUgPSBwdWJsaXNoRGlyCi0JCQkJCQkJKyB3cExheW91dC5nZXREaWFncmFtaWNvblVybCgpOwotCQkJCQl0cnkgewotCQkJCQkJQnVmZmVyZWRJbWFnZSB3b3JrUHJvZHVjdEltYWdlID0gSW1hZ2VVdGlsCi0JCQkJCQkJCS5nZXRCdWZmZXJlZEltYWdlKGltYWdlRmlsZSwgcGFuZWwpOwotCQkJCQkJaW50IHdvcmtQcm9kdWN0V2lkdGggPSB3b3JrUHJvZHVjdEltYWdlLmdldFdpZHRoKCk7Ci0JCQkJCQlpbnQgd29ya1Byb2R1Y3RIZWlnaHQgPSB3b3JrUHJvZHVjdEltYWdlLmdldEhlaWdodCgpOwotCQkJCQkJaWYgKHdvcmtQcm9kdWN0Tm8gPT0gMSkgewotCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueCArPSB3b3JrUHJvZHVjdFdpZHRoOwotCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueSArPSB3b3JrUHJvZHVjdEhlaWdodDsKLQkJCQkJCQl3b3JrUHJvZHVjdHNFbmRYID0gd29ya1Byb2R1Y3RFbmRQb2ludC54OwotCQkJCQkJfQotCQkJCQkJUmVjdGFuZ2xlIHdvcmtQcm9kdWN0SW1hZ2VSZWN0ID0gbmV3IFJlY3RhbmdsZSh4LCB5LAotCQkJCQkJCQl3b3JrUHJvZHVjdFdpZHRoLCB3b3JrUHJvZHVjdEhlaWdodCk7Ci0JCQkJCQlUZXh0dXJlUGFpbnQgd29ya1Byb2R1Y3RQYWludCA9IG5ldyBUZXh0dXJlUGFpbnQoCi0JCQkJCQkJCXdvcmtQcm9kdWN0SW1hZ2UsIHdvcmtQcm9kdWN0SW1hZ2VSZWN0KTsKLQkJCQkJCWcyZC5zZXRQYWludCh3b3JrUHJvZHVjdFBhaW50KTsKLQkJCQkJCWcyZC5maWxsKHdvcmtQcm9kdWN0SW1hZ2VSZWN0KTsKLQkJCQkJCWlmICh3b3JrUHJvZHVjdE5hbWUgIT0gbnVsbCkgewotCQkJCQkJCUltYWdlVXRpbC5kcmF3VGV4dChnMmQsIHdvcmtQcm9kdWN0TmFtZSwgdGV4dEZvbnQsCi0JCQkJCQkJCQlDb2xvci5CTEFDSywgeCAtIHhPZmZzZXQsCi0JCQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnksIHdvcmtQcm9kdWN0V2lkdGgKLQkJCQkJCQkJCQkJKyB4U3BhY2luZywgbWF4VGV4dExpbmVzKTsKLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIGhyZWYgPSB3cExheW91dC5nZXRGaWxlUGF0aChyb2xlTGF5b3V0KQotCQkJCQkJCQkrIHdwTGF5b3V0LmdldEZpbGVOYW1lKCIuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCUhUTUxBcmVhIGh0bWxBcmVhID0gbmV3IEhUTUxBcmVhKHdvcmtQcm9kdWN0LmdldEd1aWQoKSwKLQkJCQkJCQkJaHJlZiwKLQkJCQkJCQkJInJlY3QiLCB3b3JrUHJvZHVjdEltYWdlUmVjdCwgd29ya1Byb2R1Y3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaHRtbE1hcC5hZGRBcmVhKGh0bWxBcmVhKTsKLQotCQkJCQkJaWYgKHggKyB3b3JrUHJvZHVjdFdpZHRoID4gd29ya1Byb2R1Y3RzRW5kWCkgewotCQkJCQkJCXdvcmtQcm9kdWN0c0VuZFggPSB4ICsgd29ya1Byb2R1Y3RXaWR0aDsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJaW50IHhJbmNyZW1lbnQgPSB3b3JrUHJvZHVjdFdpZHRoICsgeFNwYWNpbmc7Ci0JCQkJCQkJeCArPSB4SW5jcmVtZW50OwotCQkJCQkJCXdvcmtQcm9kdWN0RW5kUG9pbnQueCArPSB4SW5jcmVtZW50OwotCQkJCQkJCWlmICgoeCArIHhJbmNyZW1lbnQgKyB4T2Zmc2V0ICsgYm9yZGVyV2lkdGgpID4gbWF4SW1hZ2VXaWR0aCkgewotCQkJCQkJCQl4ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50Lng7Ci0JCQkJCQkJCWludCB5SW5jcmVtZW50ID0gd29ya1Byb2R1Y3RIZWlnaHQgKyB5U3BhY2luZzsKLQkJCQkJCQkJeSArPSB5SW5jcmVtZW50OwotCQkJCQkJCQl3b3JrUHJvZHVjdEVuZFBvaW50LnkgKz0geUluY3JlbWVudDsKLQkJCQkJCQkJd29ya1Byb2R1Y3RFbmRQb2ludC54ID0gd29ya1Byb2R1Y3RTdGFydFBvaW50LngKLQkJCQkJCQkJCQkrIHdvcmtQcm9kdWN0V2lkdGg7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJlbmRlciB0aGUgUm9sZS4KLQkJCVBvaW50IHJvbGVTdGFydFBvaW50ID0gbmV3IFBvaW50KHhPZmZzZXQgLSA1LCBib3JkZXJIZWlnaHQpOwotCQkJUG9pbnQgcm9sZUVuZFBvaW50ID0gcm9sZVN0YXJ0UG9pbnQ7Ci0JCQl0cnkgewotCQkJCVN0cmluZyByb2xlTmFtZSA9IHJvbGVMYXlvdXQuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCQlTdHJpbmcgaW1hZ2VGaWxlID0gcHVibGlzaERpciArIHJvbGVMYXlvdXQuZ2V0RGlhZ3JhbWljb25VcmwoKTsKLQkJCQlCdWZmZXJlZEltYWdlIHJvbGVJbWFnZSA9IEltYWdlVXRpbC5nZXRCdWZmZXJlZEltYWdlKGltYWdlRmlsZSwKLQkJCQkJCXBhbmVsKTsKLQkJCQlpbnQgcm9sZVdpZHRoID0gcm9sZUltYWdlLmdldFdpZHRoKCk7Ci0JCQkJaW50IHJvbGVIZWlnaHQgPSByb2xlSW1hZ2UuZ2V0SGVpZ2h0KCk7Ci0JCQkJeCA9IHhPZmZzZXQgLSA1OwotCQkJCXkgPSBib3JkZXJIZWlnaHQ7Ci0JCQkJcm9sZUVuZFBvaW50LnggKz0gcm9sZVdpZHRoOwotCQkJCXJvbGVFbmRQb2ludC55ICs9IHJvbGVIZWlnaHQ7Ci0JCQkJaWYgKHRvdGFsV29ya1Byb2R1Y3RzID4gMCkgewotCQkJCQl5ID0gYm9yZGVySGVpZ2h0Ci0JCQkJCQkJKyAod29ya1Byb2R1Y3RFbmRQb2ludC55IC0gdGFza1N0YXJ0UG9pbnQueSAtIHJvbGVIZWlnaHQpCi0JCQkJCQkJLyAyOwotCi0JCQkJCS8vIFJlbmRlciB0aGUgInJlc3BvbnNpYmxlIGZvciIgYXNzb2NpYXRpb24gbGluZS4KLQkJCQkJUG9pbnQgc3RhcnRQb2ludCA9IG5ldyBQb2ludCh4ICsgcm9sZVdpZHRoICsgbGluZVBhZGRpbmcKLQkJCQkJCQkvIDIsIHkgKyByb2xlSGVpZ2h0IC8gMik7Ci0JCQkJCWludCBsaW5lRW5kUG9pbnQgPSB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueCAtIGxpbmVQYWRkaW5nOwotCQkJCQlpZiAobGluZUVuZFBvaW50ID4gKERFRkFVTFRfWF9NQVJHSU4gLSB4U3BhY2luZyAvIDIpKSB7Ci0JCQkJCQlsaW5lRW5kUG9pbnQgPSAoREVGQVVMVF9YX01BUkdJTiAtIHhTcGFjaW5nIC8gMik7Ci0JCQkJCX0KLQkJCQkJUG9pbnQgZW5kUG9pbnQgPSBuZXcgUG9pbnQod29ya1Byb2R1Y3RTdGFydFBvaW50LngKLQkJCQkJCQktIGxpbmVQYWRkaW5nLCB3b3JrUHJvZHVjdFN0YXJ0UG9pbnQueQotCQkJCQkJCSsgKHdvcmtQcm9kdWN0RW5kUG9pbnQueSAtIHdvcmtQcm9kdWN0U3RhcnRQb2ludC55KQotCQkJCQkJCS8gMik7Ci0JCQkJCXJlbmRlckFzc29jaWF0aW9uKGcyZCwgc3RhcnRQb2ludCwgZW5kUG9pbnQsCi0JCQkJCQkJTGlicmFyeVJlc291cmNlcy5yb2xlRGlhZ3JhbVJlc3BvbnNpYmxlRm9yX3RleHQsCi0JCQkJCQkJdGV4dEZvbnQsIENvbG9yLkJMQUNLKTsKLQkJCQl9IGVsc2UgaWYgKHRvdGFsVGFza3MgPiAwKSB7Ci0JCQkJCXkgPSBib3JkZXJIZWlnaHQKLQkJCQkJCQkrICh0YXNrRW5kUG9pbnQueSAtIHRhc2tTdGFydFBvaW50LnkgLSByb2xlSGVpZ2h0KQotCQkJCQkJCS8gMjsKLQkJCQl9Ci0JCQkJcm9sZVN0YXJ0UG9pbnQueSA9IHk7Ci0JCQkJcm9sZUVuZFBvaW50LnkgPSB5ICsgcm9sZUhlaWdodDsKLQotCQkJCWlmICh0b3RhbFRhc2tzID4gMCkgewotCQkJCQkvLyBSZW5kZXIgdGhlICJwZXJmb3JtcyIgYXNzb2NpYXRpb24gbGluZS4KLQkJCQkJUG9pbnQgc3RhcnRQb2ludCA9IG5ldyBQb2ludCh4ICsgcm9sZVdpZHRoICsgbGluZVBhZGRpbmcKLQkJCQkJCQkvIDIsIHkgKyByb2xlSGVpZ2h0IC8gMik7Ci0JCQkJCWludCBsaW5lRW5kUG9pbnQgPSB0YXNrU3RhcnRQb2ludC54IC0gbGluZVBhZGRpbmc7Ci0JCQkJCWlmIChsaW5lRW5kUG9pbnQgPiAoREVGQVVMVF9YX01BUkdJTiAtIHhTcGFjaW5nIC8gMikpIHsKLQkJCQkJCWxpbmVFbmRQb2ludCA9IChERUZBVUxUX1hfTUFSR0lOIC0geFNwYWNpbmcgLyAyKTsKLQkJCQkJfQotCQkJCQlQb2ludCBlbmRQb2ludCA9IG5ldyBQb2ludChsaW5lRW5kUG9pbnQsIGJvcmRlckhlaWdodAotCQkJCQkJCSsgKHRhc2tFbmRQb2ludC55IC0gdGFza1N0YXJ0UG9pbnQueSkgLyAyKTsKLQkJCQkJcmVuZGVyQXNzb2NpYXRpb24oZzJkLCBzdGFydFBvaW50LCBlbmRQb2ludCwKLQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLnJvbGVEaWFncmFtUGVyZm9ybXNfdGV4dCwKLQkJCQkJCQl0ZXh0Rm9udCwgQ29sb3IuQkxBQ0spOwotCQkJCX0KLQkJCQlSZWN0YW5nbGUgcm9sZUltYWdlUmVjdCA9IG5ldyBSZWN0YW5nbGUoeCwgeSwgcm9sZVdpZHRoLAotCQkJCQkJcm9sZUhlaWdodCk7Ci0JCQkJVGV4dHVyZVBhaW50IHJvbGVQYWludCA9IG5ldyBUZXh0dXJlUGFpbnQocm9sZUltYWdlLAotCQkJCQkJcm9sZUltYWdlUmVjdCk7Ci0JCQkJZzJkLnNldFBhaW50KHJvbGVQYWludCk7Ci0JCQkJZzJkLmZpbGwocm9sZUltYWdlUmVjdCk7Ci0JCQkJaWYgKHJvbGVOYW1lICE9IG51bGwpIHsKLQkJCQkJSW1hZ2VVdGlsLmRyYXdUZXh0KGcyZCwgcm9sZU5hbWUsIHRleHRGb250LCBDb2xvci5CTEFDSywgeAotCQkJCQkJCS0geE9mZnNldCwgeSArIHJvbGVIZWlnaHQsIHJvbGVXaWR0aCArIHhTcGFjaW5nLAotCQkJCQkJCW1heFRleHRMaW5lcyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCX0KLQotCQkJLy8gQ2FsY3VsYXRlIHRoZSBvcHRpbWFsIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSByZW5kZXJlZCBpbWFnZS4KLQkJCWludCBvcHRpbWFsV2lkdGggPSBNYXRoLm1heCh0YXNrc0VuZFgsIHdvcmtQcm9kdWN0c0VuZFgpCi0JCQkJCSsgYm9yZGVyV2lkdGg7Ci0JCQlvcHRpbWFsV2lkdGggPSBNYXRoLm1heChvcHRpbWFsV2lkdGgsIHJvbGVFbmRQb2ludC54ICsgYm9yZGVyV2lkdGgpOwotCi0JCQlvcHRpbWFsV2lkdGggPSBNYXRoLm1pbihvcHRpbWFsV2lkdGgsIG1heEltYWdlV2lkdGgpOwotCi0JCQlpbnQgb3B0aW1hbEhlaWdodCA9IHdvcmtQcm9kdWN0RW5kUG9pbnQueSArIGJvcmRlckhlaWdodDsKLQkJCW9wdGltYWxIZWlnaHQgPSBNYXRoLm1heChvcHRpbWFsSGVpZ2h0LCByb2xlRW5kUG9pbnQueQotCQkJCQkrIGJvcmRlckhlaWdodCk7Ci0JCQlvcHRpbWFsV2lkdGggKz0geE9mZnNldDsKLQkJCW9wdGltYWxIZWlnaHQgKz0gKG1heFRleHRMaW5lcyAqIDEwKTsKLQotCQkJb3B0aW1hbEhlaWdodCA9IE1hdGgubWluKG9wdGltYWxIZWlnaHQsIG1heEltYWdlSGVpZ2h0KTsKLQkJCUJ1ZmZlcmVkSW1hZ2Ugb3B0aW1hbEltYWdlID0gb3V0cHV0SW1hZ2UuZ2V0U3ViaW1hZ2UoMCwgMCwKLQkJCQkJb3B0aW1hbFdpZHRoLCBvcHRpbWFsSGVpZ2h0KTsKLQotCQkJLy8gU2F2ZSB0aGUgaW1hZ2UgYXMgYSBKUEVHIGZpbGUuCi0JCQlGaWxlIGpwZ0ZpbGUgPSBuZXcgRmlsZShwYXRoLCByb2xlTGF5b3V0LmdldEZpbGVQYXRoKCkKLQkJCQkJKyByb2xlTGF5b3V0LmdldEZpbGVOYW1lKCIuanBnIikpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIHBhcmVudEZvbGRlciA9IGpwZ0ZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKCFwYXJlbnRGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlwYXJlbnRGb2xkZXIubWtkaXJzKCk7Ci0JCQl9Ci0JCQlJbWFnZUlPLndyaXRlKG9wdGltYWxJbWFnZSwgImpwZyIsIGpwZ0ZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQllbGVtZW50RGlhZ3JhbS5zZXRJbWFnZUZpbGVOYW1lKGpwZ0ZpbGUuZ2V0TmFtZSgpKTsKLQkJCXJldHVybiBlbGVtZW50RGlhZ3JhbTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW5kZXJzIHRoZSBhc3NvY2lhdGlvbiBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBnMmQKLQkgKiAgICAgICAgICAgIFRoZSBHcmFwaGljczJEIGNvbnRleHQuCi0JICogQHBhcmFtIHN0YXJ0UG9pbnQKLQkgKiAgICAgICAgICAgIFRoZSBzdGFydCBwb2ludCBvZiB0aGUgbGluZS4KLQkgKiBAcGFyYW0gZW5kUG9pbnQKLQkgKiAgICAgICAgICAgIFRoZSBlbmQgcG9pbnQgb2YgdGhlIGxpbmUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBmb250Ci0JICogICAgICAgICAgICBUaGUgZm9udCBmb3IgcmVuZGVyaW5nIHRoZSBhc3NvY2lhdGlvbiBuYW1lLgotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGNvbG9yIGZvciByZW5kZXJpbmcgdGhlIGFzc29jaWF0aW9uIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVuZGVyQXNzb2NpYXRpb24oR3JhcGhpY3MyRCBnMmQsIFBvaW50IHN0YXJ0UG9pbnQsCi0JCQlQb2ludCBlbmRQb2ludCwgU3RyaW5nIG5hbWUsIEZvbnQgZm9udCwgQ29sb3IgY29sb3IpIHsKLQkJZzJkLmRyYXcobmV3IExpbmUyRC5Eb3VibGUoc3RhcnRQb2ludC54LCBzdGFydFBvaW50LnksIGVuZFBvaW50LngsCi0JCQkJZW5kUG9pbnQueSkpOwotCQlpbnQgdGV4dFggPSBzdGFydFBvaW50LnggKyAoZW5kUG9pbnQueCAtIHN0YXJ0UG9pbnQueCkgLyAyIC0gNDA7Ci0JCWludCB0ZXh0WSA9IHN0YXJ0UG9pbnQueSArIChlbmRQb2ludC55IC0gc3RhcnRQb2ludC55KSAvIDIgLSA1OwotCQlpZiAoc3RhcnRQb2ludC55ICE9IGVuZFBvaW50LnkpIHsKLQkJCWcyZC5zZXRDb2xvcihDb2xvci5XSElURSk7Ci0JCQlnMmQuZmlsbFJlY3QodGV4dFgsIHRleHRZLCA4MCwgMTApOwotCQl9IGVsc2UgewotCQkJdGV4dFkgLT0gMTA7Ci0JCX0KLQkJSW1hZ2VVdGlsLmRyYXdUZXh0KGcyZCwgbmFtZSwgZm9udCwgY29sb3IsIHRleHRYLCB0ZXh0WSwgODAsIDMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZGlhZ3JhbS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmYzMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9kaWFncmFtL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHJvbGUgYW5kIGFjdGl2aXR5IGRpYWdyYW1zIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYWl0b24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdEVsZW1lbnRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RFbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjI4ZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdEVsZW1lbnRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVYTUlTYXZlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgbGF5b3V0IGZvciBhbGwgTWV0aG9kIEVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaWNuZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWxlbWVudExheW91dCBpbXBsZW1lbnRzIElFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRUZFUkVOQ0UgPSAicmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRUZFUkVOQ0VMSVNUID0gInJlZmVyZW5jZUxpc3QiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJvdGVjdGVkIEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXI7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50OwotCi0JcHJvdGVjdGVkIFN0cmluZyB1cmwgPSBudWxsOwotCi0JLy8gZWxlbWVudCBlbGVtZW50IHBhdGggcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgcm9vdAotCXByb3RlY3RlZCBTdHJpbmcgZWxlbWVudFBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gdGhlIGJhY2sgdXAgcGF0aCB0byByZWF0aCB0aGUgcHVibGlzaGluZyByb290Ci0JcHJvdGVjdGVkIFN0cmluZyBiYWNrUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBtYXAgb2YgbGF5b3V0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlIGV4dGVudGlvbiwgaWYgdGhlIGVsZW1lbnQgaGFzIG1vcmUKLQkvLyB0aGFuIG9uZSBsYXlvdXQgb3V0cHV0Ci0JcHJvdGVjdGVkIExpc3QgbGF5b3V0cyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gbnVsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dFbGVtZW50TGluayA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIEFic3RyYWN0RWxlbWVudExheW91dCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBpZiB0aGUgZWxlbWVudCdzIGNvbnRlbnQgaXMgdGFyZ2V0IGZvciBhbm90aGVyIGVsZW1lbnQsIHNldCBpdCBoZXJlLiBmb3IKLQkgKiBleGFtcGxlLCBzdGVwIGNvbnRlbnQgY2F0IHRhcmdldCBmb3IgYSBUYXNrIG9yIGEgdGFzayBkZXNjcmlwdG9yCi0JICogY29weXJpZ2h0IGNvbnRlbnQgY2FuIHRhcmdldCB0byBkaWZmZXJlbnQgZWxlbWVudHMuCi0JICogCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0aGF0IHRoZSBzeXN0ZW0gd2lsbCBmaXggdGhlIGxpbmtzIGluIHRoZSBjb250ZW50Ci0JICogdG8gcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUYXJnZXQoTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50KSB7Ci0JCXRoaXMudGFyZ2V0RWxlbWVudCA9IHRhcmdldEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogbmVlZCB0byBzZXQgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IGxheW91dCBlbGVtZW50LiBJbiBtb3N0IGNhc2VzIHRoaXMKLQkgKiBzaG91bGQgYmUgdGhlIGVDb250YWluZXIgb2YgdGhlIGVsZW1lbnQuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgaW4gc29tZQotCSAqIHNpdHVhdGlvbiB0aGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIG93bmVyIHdoZW4gdGhlIG9iamVjdCBpcyBjcmVhdGVkLgotCSAqIEZvciBleGFtcGxlLCB0aGUgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCdzIGVDb250aW5lciBpcyBudWxsIGlmIHRoZQotCSAqIGNvbnRlbnQgZmlsZSBpcyBub3Qgc2F2ZWQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE93bmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNob3dFbGVtZW50TGluayhib29sZWFuIHNob3cpIHsKLQkJdGhpcy5zaG93RWxlbWVudExpbmsgPSBzaG93OwotCX0KLQkKLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQgd2l0aCB0aGUgZWxlbWVudCBsYXlvdXQgbWFuYWdlciBhbmQgdGhlIGVsZW1lbnQuCi0JICogQHBhcmFtIGxheW91dE1hbmFnZXIgRWxlbWVudExheW91dE1hbmFnZXIKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KTsKLQotCXByb3RlY3RlZCB2b2lkIF9faW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMubGF5b3V0TWFuYWdlciA9IGxheW91dE1hbmFnZXI7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWlmICghQ29uZmlndXJhdGlvbkhlbHBlci5pc0Rlc2NyaXB0aW9uRWxlbWVudChlbGVtZW50KSkgewotCQkJaWYgKCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSApIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhlIGVsZW1lbnQgaXMgbG9hZGVkIHdpdGggdGhlIGNvcnJlY3QgY29udGFpbmVyCi0JCQkJLy8gb3RoZXJ3aXNlIHRoZSAgZWxlbWVudCBtYXkgbm90IGhhdmUgYSB2YWxpZCBjb250YWluZXIKLQkJCQkvLyBhbmQgdGh1cyB0aGUgZWxlbWVudCBjb250ZW50IHBhdGggY2FuJ3QgYmUgZGV0ZXJtaW5lZAotCQkJCS8vIHRoaXMgaXMganVzdCBhIHdvcmthcm91bmQuIHNob3VsZCB3ZSBoYXZlIGEgYmV0dGVyIHdheSB0byBtYWtlIHN1cmUgdGhlIGVsZW1lbnRzIGFyZSBsb2FkZWQgY29ycmVjdGx5Pz8/Pz8/Pz8/Pz8KLQkJCQkvLyAxNjA0NDEgLSBNaXNzaW5nIHRlbXBsYXRlIGZpbGVzIHdoZW4gcHVibGlzaCBjb25maWd1cmF0aW9uCi0JCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkJCQlpZiAoIHBsdWdpbiA9PSBudWxsIHx8IHBsdWdpbi5lQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQkKLQkJCQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBwdWJsaXNoaW5nIG1vZGUgc2luY2UgdGhlIHdob2xlIGxpYnJhcnkgaXMgYWxyZWFkeSBsb2FkZWQKLQkJCQkJaWYgKCBkZWJ1ZyAmJiBnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiBFbGVtZW50IHdpdGhvdXQgYSB2YWxpZCBjb250YWluZXI6ICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkKLQkJCQkJTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCkpOwotCQkJCX0gCi0JCQl9Ci0JCQlidWlsZFBhdGgoKTsKLQkJCXRoaXMudXJsID0gZWxlbWVudFBhdGggKyBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQkJfQotCQkKLQkJLy8gdGhpcyBpcyBhIHdvcmthcm91bmQuIAotCQkvLyB3ZSBuZWVkIHRvIHBhc3MgcGFyYW1ldGVycyBpbiB0aGUgZmlsZSB1cmwsIAotCQkvLyBob3dldmVyLCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlIHBhcmFtZXRlcnMgaXMgbm90IHBhc3NlZCBvdmVyIGluIGJyb3dzaW5nCi0JCS8vIHNvIGNyZWF0ZSBhIGR1bW15IGZpbGUKLQkJaWYgKCF0aGlzLmxheW91dE1hbmFnZXIuaXNQdWJsaXNoaW5nTW9kZSgpICYmICEoCi0JCQkJCWVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24gCi0JCQkJfHwgZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24KLQkJCQl8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgKQotCQl7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBodG1sX2ZpbGUgPSB0aGlzLmxheW91dE1hbmFnZXIuZ2V0UHVibGlzaERpcigpICsgdGhpcy5nZXRGaWxlUGF0aCgpICsgZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUoaHRtbF9maWxlKTsKLQkJCQlpZiAoICFmLmV4aXN0cygpICkKLQkJCQl7Ci0JCQkJCWYuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJlbG9hZE9wcG9zaXRlZmVhdHVyZXMoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVsb2FkT3Bwb3NpdGVmZWF0dXJlcygpIHsKLQkJLy8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzZXMgYXJlIGxvYWRlZCBiZWZvcmUgY2FsY3VsYXRpbmcgdGhlIGZlYXR1cmUKLQkJLy8gb3RoZXJ3aXNlIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIG1hcCBpcyBub3QgcG9wdWxhdGVkCi0JCS8vIGZpbmUgZm9yIHB1Ymxpc2hpbmcgc2luY2UgdGhlIHdob2xlIGxpYnJhcnkgaXMgbG9hZGVkIGFscmVhZHkKLQkJLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IgYnJvd3NpbmcKLQkJLy8gbG9hZCB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBzcGVjaWZpY2FsbHkKLQkJaWYgKCBnZXRMYXlvdXRNZ3IoKS5pc1B1Ymxpc2hpbmdNb2RlKCkgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vT3Bwb3NpdGVGZWF0dXJlIG9mOwotCQlSZXNvdXJjZSByZXMgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotCQlpZiAoIHJlcyA9PSBudWxsICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlSZXNvdXJjZVNldCByZXNTZXQgPSByZXMuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJaWYgKCAhKHJlc1NldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlMaXN0PE9wcG9zaXRlRmVhdHVyZT4gb3Bwb3NpdGVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8T3Bwb3NpdGVGZWF0dXJlPigpOwotCQlpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFJvbGUgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVEZXNjcmlwdG9ycyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFRhc2sgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5UYXNrX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0ICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3REZXNjcmlwdG9ycyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIENoZWNrbGlzdCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkNoZWNrbGlzdF9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIENvbmNlcHQgfHwgdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgV2hpdGVwYXBlciApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkNvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBDaGVja2xpc3QgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQnJlYWtkb3duRWxlbWVudHMpOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBFeGFtcGxlICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIEd1aWRlbGluZSApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLkd1aWRlbGluZV9CcmVha2Rvd25FbGVtZW50cyk7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFJldXNhYmxlQXNzZXQgKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVzLmFkZChBc3NvY2lhdGlvbkhlbHBlci5SZXVzYWJsZUFzc2V0X0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgUm9hZG1hcCApIHsKLQkJCW9wcG9zaXRlRmVhdHVyZXMuYWRkKEFzc29jaWF0aW9uSGVscGVyLlJvYWRtYXBfQWN0aXZpdGVzKTsKLQkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsICkgewotCQkJb3Bwb3NpdGVGZWF0dXJlcy5hZGQoQXNzb2NpYXRpb25IZWxwZXIuU3VwcG9ydGluZ01hdGVyaWFsX0JyZWFrZG93bkVsZW1lbnRzKTsKLQkJfSAKLQkKLQkJaWYgKCBvcHBvc2l0ZUZlYXR1cmVzLnNpemUoKSA+IDAgKSB7Ci0JCQlDb25maWd1cmF0aW9uSGVscGVyLmdldERlbGVnYXRlKCkubG9hZE9wcG9zaXRlRmVhdHVyZXMoCi0JCQkJCShJTGlicmFyeVJlc291cmNlU2V0KSByZXNTZXQsIG9wcG9zaXRlRmVhdHVyZXMsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TGF5b3V0SW5mbyhMYXlvdXRJbmZvIGluZm8pIHsKLQkJaWYgKGxheW91dHMgPT0gbnVsbCkgewotCQkJbGF5b3V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlsYXlvdXRzLmFkZChpbmZvKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gYSBsaXN0IG9mIExheW91dEluZm8gb2JqZWN0cwotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIExheW91dEluZm8gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldExheW91dHMoKSB7Ci0JCXJldHVybiBsYXlvdXRzOwotCX0KLQotCS8qKgotCSAqIGdldCBsYXlvdXQgYnkgbmFtZQotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBMYXlvdXRJbmZvCi0JICovCi0JcHVibGljIExheW91dEluZm8gZ2V0TGF5b3V0SW5mbyhTdHJpbmcgbmFtZSkgewotCQlpZiAoIGxheW91dHMgPT0gbnVsbCB8fCBsYXlvdXRzLnNpemUoKSA9PSAwICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBsYXlvdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlMYXlvdXRJbmZvIGluZm8gPSAoTGF5b3V0SW5mbylpdC5uZXh0KCk7Ci0JCQlpZiAoIGluZm8ubmFtZS5lcXVhbHMobmFtZSkgKSB7Ci0JCQkJcmV0dXJuIGluZm87Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRMYXlvdXRNZ3IoKQotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiB0aGlzLmxheW91dE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RWxlbWVudCgpCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0VHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldERpc3BsYXlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkKLQkJLy8gW0J1ZyAxOTYzOTldIFAtbmFtZSBpcyBub3QgaW5oZXJpdGVkIGZyb20gaXRzIGJhc2UgZWxlbWVudCBpbiBhbiBleHRlbmRpbmcgZWxlbWVudAotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsIGdldExheW91dE1ncigpLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBlbGVtZW50LmdldEd1aWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRVcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEJhY2tQYXRoKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tQYXRoKCkgewotCQlyZXR1cm4gYmFja1BhdGg7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RmlsZVBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZVBhdGgoKSB7Ci0JCXJldHVybiBlbGVtZW50UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gYW5vdGhlciBlbGVtZW50LiBUaGlzIGlzIHRoZQotCSAqIHJlbGF0aXZlVG8uYmFja3BhdGggKyB0aGlzLmVsZW1lbnRwYXRoLgotCSAqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0RmlsZVBhdGgoSUVsZW1lbnRMYXlvdXQpCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0IHJlbGF0aXZlVG8pIHsKLQkJcmV0dXJuIHJlbGF0aXZlVG8uZ2V0QmFja1BhdGgoKSArIHRoaXMuZ2V0RmlsZVBhdGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldEZpbGVOYW1lKFN0cmluZykKLQkgKi8KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIGV4dCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZU5hbWUoZWxlbWVudCwgZXh0KTsKLQl9Ci0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WHNsVXJsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhzbFVybCgpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJcmV0dXJuIExheW91dFJlc291cmNlcy5nZXRYc2xVcmkoZ2V0VHlwZSgpLnRvTG93ZXJDYXNlKCksCi0JCQkJCSJjb250ZW50ZWxlbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTGF5b3V0UmVzb3VyY2VzLmdldFhzbFVyaShnZXRUeXBlKCkudG9Mb3dlckNhc2UoKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQYXRoKCkgewotCQkvLyB0aGlzIGlzIDxwbHVnaW4+LzxlbGVtZW50IHR5cGU+LwotCQllbGVtZW50UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWJhY2tQYXRoID0gIi4vIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoICEoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24gfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpICkKLQkJewotCQkJU3RyaW5nIHBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KTsKLQkJCWlmICggcGF0aCAhPSBudWxsICkgewotCQkJCWVsZW1lbnRQYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCQliYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgaHRtbCBjb250ZW50IGdlbmVyYXRlZCBmcm9tIHRoaXMgeHNsIGZpbGUgbmVlZHMgdG8gYmUgc2Nhbm5lZCBvciBub3QKLQkgKiBzY2FuIHRoZSBjb250ZW50IGlzIGZvciBpZGVudGlmeWluZyBlbGVtZW50IHJlZmVyZW5jZXMgaW4gdGhlIGNvbnRlbnQgYW5kIGNvcHkgb3ZlciByZXNvdXJjZSBmaWxlcwotCSAqIGluIHNvbWUgY2FzZXMgd2UgZG9uJ3QgbmVlZCB0byBzY2FuIHRoZSBjb250ZW50LCBmb3IgZXhhbXBsZSwgdGhlIGFjdGl2aXR5IGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBAcGFyYW0geHNsVXJsIHRoZSB4c2wgdGhhdCBodG1sIGlzIGdlbmVyYXRlZCBmcm9tLCBudWxsIGZvciB0aGUgZGVmYXVsdCB4c2wgbGF5b3V0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZENvbnRlbnRTY2FuKFN0cmluZyB4c2xVcmwpCi0JewotCQkvLyBieSBkZWZhdWx0IGFsbCBjb250ZW50cyBhcmUgc2Nhbm5lZAotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBsYXlvdXQgZm9yIGEgY2hpbGQgZWxlbWVudCBvZiB0aGlzIGVsZW1lbnQKLQkgKiBBY3Rpdml0eUVsZW1lbnRMYXlvdXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBsYXlvdXQgd2l0aCBub2RlIHBhdGgKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiBAcmV0dXJuIElFbGVtZW50TGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIElFbGVtZW50TGF5b3V0IGdldENoaWxkTGF5b3V0KE1ldGhvZEVsZW1lbnQgY2hpbGQpCi0JewotCQlyZXR1cm4gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoY2hpbGQsIHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGQoT2JqZWN0IGZlYXR1cmUsIFhtbEVsZW1lbnQgcGFyZW50LCBNZXRob2RFbGVtZW50IGUsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCUlFbGVtZW50TGF5b3V0IGwgPSBnZXRDaGlsZExheW91dChlKTsKLQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkvLyBkb24ndCBpbmNsdWRlIHRoZSByZWZlcmVuY2VzIG9mIHRoZSByZWZlcmVjZWQgZWxlbWVudHMsCi0JCQkJLy8gb3RoZXJ3aXNlLCBtYXkgY2F1c2UgZGVhZGxvY2sKLQkJCQlib29sZWFuIGlzQ29udGVudCA9IChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJCSYmIENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KChNZXRob2RFbGVtZW50KSBlKTsKLQkJCQlpZiAoaXNDb250ZW50KSB7Ci0JCQkJCWlmICh0YXJnZXRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCWwuc2V0Q29udGVudFRhcmdldCh0YXJnZXRFbGVtZW50KTsKLQkJCQkJfQotCQkJCQlsLnNldEVsZW1lbnRPd25lcihlbGVtZW50KTsKLQkJCQl9Ci0JCQkJWG1sRWxlbWVudCBjaGlsZFhtbEVsZW1lbnQgPSBsLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZFhtbEVsZW1lbnQpOwotCQkJCXByb2Nlc3NHcmFuZENoaWxkKGZlYXR1cmUsIGUsIGwsIGNoaWxkWG1sRWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hpbGQoT2JqZWN0IGZlYXR1cmUsIFhtbEVsZW1lbnQgcGFyZW50LCBMaXN0IGl0ZW1zLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlID0gaXQubmV4dCgpOwotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlNZXRob2RFbGVtZW50IG1lID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQkJCWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJSUVsZW1lbnRMYXlvdXQgbCA9IGdldENoaWxkTGF5b3V0KG1lKTsKLQkJCQkJCWlmIChsICE9IG51bGwpIHsJCQkJCQkJCi0JCQkJCQkJLy8gZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVmZXJlY2VkCi0JCQkJCQkJLy8gZWxlbWVudHMsIG90aGVyd2lzZSwgbWF5IGNhdXNlIGRlYWRsb2NrCi0JCQkJCQkJWG1sRWxlbWVudCBjaGlsZFhtbEVsZW1lbnQgPSBsLmdldFhtbEVsZW1lbnQoQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KG1lKSA/IHRydWUKLQkJCQkJCQkJCTogaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZFhtbEVsZW1lbnQpOwotCQkJCQkJCXByb2Nlc3NHcmFuZENoaWxkKGZlYXR1cmUsIG1lLCBsLCBjaGlsZFhtbEVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJvY2Vzc05vbk1ldGhvZEVsZW1lbnRJblByb2Nlc3NDaGlsZChlLCBmZWF0dXJlLCBwYXJlbnQsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc05vbk1ldGhvZEVsZW1lbnRJblByb2Nlc3NDaGlsZCgKLQkJCU9iamVjdCBub25NZXRob2RFbGVtZW50Q2hpbGQsIE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dyYW5kQ2hpbGQoT2JqZWN0IGZlYXR1cmUsCi0JCQlNZXRob2RFbGVtZW50IGNoaWxkRWxlbWVtdCwgSUVsZW1lbnRMYXlvdXQgY2hpbGRMYXlvdXQsCi0JCQlYbWxFbGVtZW50IGNoaWxkWG1sRWxlbWVudCkgewotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgdG8tbWFueSByZWZlcmVuY2VzCi0JICogQHBhcmFtIGVsZW1lbnRYbWwgWG1sRWxlbWVudAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcyBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgY2FsY3VsYXRlMG5SZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJLy8gcmVmZXJlbmNlTWFwLmNsZWFyKCk7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJbG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IG5ldyBYbWxFbGVtZW50KCJFbGVtZW50IikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIklkIiwgZ2V0SWQoKSkgLy8kTk9OLU5MUy0xJAkKLQkJCQkuc2V0QXR0cmlidXRlKCJUeXBlIiwgZ2V0VHlwZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiVHlwZU5hbWUiLCBUbmdVdGlsLmdldFR5cGVUZXh0KGVsZW1lbnQpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiTmFtZSIsIGdldE5hbWUoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIkJhY2tQYXRoIiwgZ2V0QmFja1BhdGgoKSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlNoYXBlaWNvblVybCIsIGdldFNoYXBlaWNvblVybCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmICggc2hvd0VsZW1lbnRMaW5rICkgewotCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlVybCIsIGdldFVybCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgYXR0cmlidXRlcwotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkQXR0cmlidXRlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQotCQlib29sZWFuIGlzQWN0aXZpdHlBdHRyaWJ1dGUgPSAoZWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSAKLQkJCXx8IChlbGVtZW50IGluc3RhbmNlb2YgQ29udGVudERlc2NyaXB0aW9uKSAKLQkJCQkmJiAoZWxlbWVudC5lQ29udGFpbmVyKCkgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBvd25lckVsZW1lbnQgaW5zdGFuY2VvZiBBY3Rpdml0eSk7Ci0JCQotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsJCQkKLQkJCQlpZiAoIShwIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlFQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKXA7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKLQkJCQkJCQkJCQotCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoInByZXNlbnRhdGlvbk5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gdmFsdWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSBpZiggaXNBY3Rpdml0eUF0dHJpYnV0ZSAmJiBTdHJpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhdHRyaWIuZ2V0RUF0dHJpYnV0ZVR5cGUoKS5nZXRJbnN0YW5jZUNsYXNzKCkpKSB7Ci0JCQkJCQotCQkJCQkvLyBmb3IgYWN0aXZpdHksIHRoZSB3YXkgdG8gbWVyZ2UgYXR0cmlidXRlIGZyb20gYmFzZSBpcyBkaWZmZXJlbnQKLQkJCQkJdmFsdWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldEFjdGl2aXR5U3RyaW5nQXR0cmlidXRlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgYXR0cmliLCBnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBlc2NhcGUgQnJpZWYgRGVzY3JpcHRpb24gaW50byBIVE1MIGVudGl0aWVzCi0JCQkJaWYgKG5hbWUuZXF1YWxzKCJicmllZkRlc2NyaXB0aW9uIikgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlNdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZSBteUVzY2FwZSA9IG5ldyBNdWx0aUZpbGVYTUlTYXZlSW1wbC5NeUVzY2FwZSgpOwotCQkJCQl2YWx1ZSA9IG15RXNjYXBlLmNvbnZlcnQoKFN0cmluZyl2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gU3RyVXRpbC5jb252ZXJ0TmV3bGluZXNUb0hUTUwoKFN0cmluZyl2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJZWxlbWVudFhtbAotCQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKS5zZXRWYWx1ZSgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQkJLy8gR2V0IHRoZSBzaW5nbGV0b24gb2YgdGhlIEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlciBhbmQgaGF2ZSBpdCBhZGQgYW55IGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcyBuZWVkZWQKLQkJCUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLmxvYWRBZGRpdGlvbmFsRWxlbWVudFByb3BlcnRpZXMoZWxlbWVudCwgZWxlbWVudFhtbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGF0dHJpYnV0ZSBmZWF0dXJlIHZhbHVlIGFuZCBtZXJnZSB0aGUgdGV4dCwgZml4IHVybCByZWZlcm5lY2VzLCBldGMuCi0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQlvd25lckVsZW1lbnQsIGZlYXR1cmUsIGxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQotCQkvLyBub3cgaWYgdGhlIHRhcmdldCBpcyBzZXQgYW5kIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBlbGVtZW50IG9yIHRoZQotCQkvLyBlbGVtZW50J3Mgb3duZXIKLQkJLy8gdGhlbiBmaXggdGhlIGNvbnRlbnQKLQkJaWYgKCh0YXJnZXRFbGVtZW50ICE9IG51bGwpICYmICh2YWx1ZSAhPSBudWxsKQotCQkJCSYmICh2YWx1ZS50b1N0cmluZygpLmxlbmd0aCgpID4gMCkpIHsKLQkJCVN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCS5nZXRFbGVtZW50UGF0aCgoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgPyAKLQkJCQkJCQkoKG93bmVyRWxlbWVudD09bnVsbCkgPyAoTWV0aG9kRWxlbWVudCkgZWxlbWVudC5lQ29udGFpbmVyKCkgOiBvd25lckVsZW1lbnQpIAotCQkJCQkJCTogZWxlbWVudCk7Ci0KLQkJCVN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyCi0JCQkJCS5nZXRCYWNrUGF0aCgodGFyZ2V0RWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgPyAoTWV0aG9kRWxlbWVudCkgdGFyZ2V0RWxlbWVudAotCQkJCQkJCS5lQ29udGFpbmVyKCkKLQkJCQkJCQk6IHRhcmdldEVsZW1lbnQpOwotCi0JCQl2YWx1ZSA9IFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKHZhbHVlLnRvU3RyaW5nKCksCi0JCQkJCWNvbnRlbnRQYXRoLCBiYWNrUGF0aCk7Ci0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIHRoZSBjb3B5cmlnaHQgdGV4dAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkQ29weXJpZ2h0KFhtbEVsZW1lbnQgZWxlbWVudFhtbCkgewotCi0JCS8vIExpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY3VsYXRlQ29weXJpZ2h0KGVsZW1lbnQsCi0JCS8vIGxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBpdGVtcyk7Ci0JCS8vIGlmICggaXRlbXMuc2l6ZSgpID4gMCApCi0JCS8vIHsKLQkJLy8gU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodDsKLQkJLy8gU3RyaW5nQnVmZmVyIGNvcHlyaWdodHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIGZvciAoIEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0JCS8vIHsKLQkJLy8gY29weXJpZ2h0ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgaXQubmV4dCgpOwotCQkvLyBTdHJpbmcgc3RhdGVtZW50ID0gY29weXJpZ2h0LmdldFByZXNlbnRhdGlvbigpLmdldE1haW5EZXNjcmlwdGlvbigpOwotCQkvLwkJCQkJCQkKLQkJLy8gLy8gbmVlZCB0byBmaXggdGhlIGNvbnRlbnQgZm9yIHJlbGF0aXZlIGxpbmtzLgotCQkvLyAvLyBzaW5jZSB0aGUgbGluayBpcyBhIHJlbGF0aXZlIHBhdGggdG8gdGhlIFN1cHBvcnRpbmdNYXRlcmlhbAotCQkvLyBsb2NhdGlvbiwKLQkJLy8gLy8gbmVlZCB0byBjb252ZXJ0IHRvIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQKLQkJLy8gLy8gc28gcmUtY2FsY3VhdGUgdGhlIGJhY2sgcGF0aAotCQkvLyAvLyBqeGksIDA2LzI4LzA1Ci0JCS8vIFN0cmluZyBjb250ZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGNvcHlyaWdodCk7Ci0JCS8vIFN0cmluZyBiYWNrUGF0aCA9IFJlc291cmNlSGVscGVyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQkvLyBzdGF0ZW1lbnQgPSBSZXNvdXJjZUhlbHBlci5maXhDb250ZW50VXJsUGF0aChzdGF0ZW1lbnQsIGNvbnRlbnRQYXRoLAotCQkvLyBiYWNrUGF0aCk7Ci0JCS8vIGNvcHlyaWdodHMuYXBwZW5kKHN0YXRlbWVudCk7Ci0JCS8vIH0KLQkJLy8JCQkKLQkJLy8gZWxlbWVudFhtbC5uZXdDaGlsZCgiY29weXJpZ2h0Iikuc2V0VmFsdWUoY29weXJpZ2h0cy50b1N0cmluZygpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLyB9Ci0KLQkJU3RyaW5nIGNvcHlyaWdodCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dChlbGVtZW50LAotCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsICYmIGNvcHlyaWdodC5sZW5ndGgoKSA+IDApIHsKLQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImNvcHlyaWdodCIpLnNldFZhbHVlKGNvcHlyaWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGNhbGN1bGF0ZSB0aGUgdG8tb25lIHJlZmVyZW5jZQotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGNhbGN1bGF0ZTAxUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBlbGVtZW50IHJlZmVyZW5jZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQotCQkJCS8vIE9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0KGkpOwotCi0JCQkJRUNsYXNzaWZpZXIgdHlwZSA9IHAuZ2V0RVR5cGUoKTsKLQkJCQlpZiAoISh0eXBlIGluc3RhbmNlb2YgRUNsYXNzKSB8fCBwLmlzTWFueSgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxvYWRGZWF0dXJlKHAsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlnZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogbG9hZCB0aGUgbm9uLWF0dHJpYnV0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZVZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQotCQlpZiAoIShmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0JCQotCQlpZiAoIWZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkvLyBCcm93c2luZyBzdG9wcyB3b3JraW5nIHdoZW4gYSByb2xlIGlzIHNldCB0bwotCQkJLy8gcmVwbGFjZWQgYW5vdGhlciByb2xlCi0JCQkvLyBmb3IgcmVwbGFjZXIsIHRoZSBiYXNlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRoZSByZXBsYWNlcgotCQkJLy8gYW5kIGNhdXNpbmcgZGVhZGxvY2sKLQkJCWlmIChlICE9IG51bGwgJiYgZSAhPSBlbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBzaG93RGV0YWlsID0gKENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKQotCQkJCS8qCi0JCQkJICogfHwgKHAgPT0KLQkJCQkgKiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpKQotCQkJCSAqLykgPyB0cnVlIDogaW5jbHVkZVJlZmVyZW5jZXM7Ci0JCQkJCi0JCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgZSkgKSB7Ci0JCQkJCWlmICggZWxlbWVudFhtbCAhPSBudWxsICkgewotCQkJCQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIGVsZW1lbnRYbWwKLQkJCQkJCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSksIGUsIHNob3dEZXRhaWwpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBwdiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBvd25lckVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgcHYpICkgewotCQkJCWlmICggZWxlbWVudFhtbCAhPSBudWxsICkgewotCQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHB2KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHB2OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgTWV0aG9kRWxlbWVudCBvd25lckVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgb3duZXJFbGVtZW50LCBmZWF0dXJlLAotCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCX0JCi0JCi0JLyoqCi0JICogbG9hZCB0aGUgbm9uLWF0dHJpYnV0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0KLQkJaWYgKCFmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCQlmZWF0dXJlLCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCS8vIEJyb3dzaW5nIHN0b3BzIHdvcmtpbmcgd2hlbiBhIHJvbGUgaXMgc2V0IHRvCi0JCQkvLyByZXBsYWNlZCBhbm90aGVyIHJvbGUKLQkJCS8vIGZvciByZXBsYWNlciwgdGhlIGJhc2Ugd2lsbCBiZSBldmFsdWF0ZWQgdG8gdGhlIHJlcGxhY2VyCi0JCQkvLyBhbmQgY2F1c2luZyBkZWFkbG9jawotCQkJaWYgKGUgIT0gbnVsbCAmJiBlICE9IGVsZW1lbnQpIHsKLQkJCQlib29sZWFuIHNob3dEZXRhaWwgPSAoQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmlzRGVzY3JpcHRpb25FbGVtZW50KGUpCi0JCQkJLyoKLQkJCQkgKiB8fCAocCA9PQotCQkJCSAqIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0U3RhdGVtZW50KCkpCi0JCQkJICovKSA/IHRydWUgOiBpbmNsdWRlUmVmZXJlbmNlczsKLQotCQkJCWlmICggYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIGUpICkKLQkJCQl7Ci0JCQkJCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQkJCQllbGVtZW50WG1sCi0JCQkJCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSksIGUsIHNob3dEZXRhaWwpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlMaXN0IHB2ID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaWYgKCBhY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgcHYpICYmIHB2LnNpemUoKSA+IDApIHsKLQkJCQlhZGRSZWZlcmVuY2VzKGZlYXR1cmUsIGVsZW1lbnRYbWwsIG5hbWUsIHB2KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUsIEVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogbG9hZCByZWZlcmVuY2VzIGZvciB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlMaXN0IGZlYXR1cmVzID0gTGlicmFyeVV0aWwuZ2V0U3RydWN0dXJhbEZlYXR1cmVzKGVsZW1lbnQpOwotLy8JCUxpc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcwotCQkJCQkJLmdldChpKTsKLQkJCQlpZiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUNvbGxlY3Rpb24gb3Bwb3NpdGVQcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdChlbGVtZW50LmdldE9wcG9zaXRlRmVhdHVyZXMoKSk7Ci0JCWZvciAoSXRlcmF0b3Igej0gb3Bwb3NpdGVQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7IHouaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IChPcHBvc2l0ZUZlYXR1cmUpIHoubmV4dCgpOwotCQkJbG9hZEZlYXR1cmUob2ZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJfQotCQkvL2VsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgdGhlIHJlZmVyZW5jZSBsYXlvdXQgdG8gdGhlIHJlc3VsdAotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdAotCSAqIEBwYXJhbSBlbGVtZW50WG1sIFhtbEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmZXJlbmNlTmFtZSBTdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN0cmluZyByZWZlcmVuY2VOYW1lLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXByb2Nlc3NDaGlsZChmZWF0dXJlLCAKLQkJCQllbGVtZW50WG1sCi0JCQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRSkuc2V0QXR0cmlidXRlKCJuYW1lIiwgcmVmZXJlbmNlTmFtZSksIGVsZW1lbnQsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQkvKioKLQkgKiBhZGQgcmVmZXJlbmNlcyB0byB0aGUgbGF5b3V0Ci0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSByZWZlcmVuY2VOYW1lCi0JICogQHBhcmFtIGl0ZW1zCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlcyhPYmplY3QgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLCBTdHJpbmcgcmVmZXJlbmNlTmFtZSwKLQkJCUxpc3QgaXRlbXMpIHsKLQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIAotCQkJCWVsZW1lbnRYbWwKLQkJCQkJCS5uZXdDaGlsZChUQUdfUkVGRVJFTkNFTElTVCkuc2V0QXR0cmlidXRlKCJuYW1lIiwgcmVmZXJlbmNlTmFtZSksIGl0ZW1zLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBnZXRYbWxFbGVtZW50KCk7Ci0KLQkJLy8gbG9hZCB0aGUgcmVmZXJlbmNlcwotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQotCQkJLy8gbG9hZCB0aGUgY29weXJpZ2h0IGluZm8KLQkJCWxvYWRDb3B5cmlnaHQoZWxlbWVudFhtbCk7Ci0KLQkJCS8vIGxvYWQgdGhlIGF0dHJpYnV0ZXMKLQkJCWxvYWRBdHRyaWJ1dGVzKGVsZW1lbnRYbWwpOwotCi0JCQlsb2FkUmVmZXJlbmNlcyhlbGVtZW50WG1sLCBmYWxzZSk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQkvKioKLQkgKiBzb21lIGxheW91dCBuZWVkIHRvIGhhdmUgdGhlIGZlYXR1cmUgdmFsdWVzIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuIFNvCi0JICogdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGZlYXR1cmUgaXMgY2FsY3VsYXRlZCBpbiB0aGlzIGFic3RyYWN0Ci0JICogY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5EZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcykgewotCQkJaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5ICkgewotCQkJCXJldHVybiBnZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eSgoTWV0aG9kRWxlbWVudCl2YWx1ZSk7Ci0JCQl9IGVsc2UgaWYgKCB2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlMaXN0IGl0ZW1zID0gKExpc3QpdmFsdWU7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlICggaSA8IGl0ZW1zLnNpemUoKSApIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbXMuZ2V0KGkpOwotCQkJCQlpZiAoICFnZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShlKSApIHsKLQkJCQkJCWl0ZW1zLnJlbW92ZShpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZ2V0UHVibGlzaENhdGVnb3J5UHJvcGVydHkoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBwcm9wID0gVG5nVXRpbC5nZXRQdWJsaXNoQ2F0ZWdvcnlQcm9wZXJ0eShlKTsKLQkJaWYgKCBwcm9wID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVN0cmluZyB2ID0gcHJvcC5nZXRWYWx1ZSgpOwotCQlpZiAoIHYgPT0gbnVsbCB8fCAhdi50b1N0cmluZygpLmVxdWFscygidHJ1ZSIpICkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFNoYXBlaWNvblVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZWljb25VcmwoKSB7Ci0JCVVSSSB1cmkgPSBudWxsOwotCQlTdHJpbmcgaW1hZ2VVcmw7Ci0JCQotCQkvLyBTdHJpbmcgaW1hZ2VGaWxlOwotCQlWYXJpYWJpbGl0eUVsZW1lbnQgdXJpSW5oZXJpdGluZ0Jhc2UgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJdXJpID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldFNoYXBlaWNvbigpOwotCi0JCQlpZiAodXJpID09IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudFtdIHVyaUluaGVyaXRpbmdCYXNlcyA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRbMV07Ci0JCQkJdXJpID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRJbmhlcml0aW5nVXJpKAotCQkJCQkJKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCwgdXJpLCB1cmlJbmhlcml0aW5nQmFzZXMsCi0JCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRDb25maWd1cmF0aW9uKCksIDEpOwotCQkJCXVyaUluaGVyaXRpbmdCYXNlID0gdXJpSW5oZXJpdGluZ0Jhc2VzWzBdOwotCQkJfQotCQl9Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudDEgPSB1cmlJbmhlcml0aW5nQmFzZSA9PSBudWxsID8gZWxlbWVudCA6IHVyaUluaGVyaXRpbmdCYXNlOwotCi0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKGVsZW1lbnQxKTsKLQotCQlpZiAodXJpID09IG51bGwgfHwgcmVzTWdyID09IG51bGwgKSB7Ci0JCQlpbWFnZVVybCA9IGdldERlZmF1bHRTaGFwZWljb25VcmwoKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlVXJsID0gTmV0VXRpbC5kZWNvZGVkRmlsZVVybCh1cmkudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQkvLyBuZWVkIHRvIGNvcHkgdGhlIGltYWdlIGZpbGUgaWYgaXQncyBub3QgaW4gdGhlIGRlZmF1bHQgZGlyZWN0b3J5Ci0JCWlmICghaW1hZ2VVcmwuc3RhcnRzV2l0aCgiaW1hZ2VzLyIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCi0JCQkvLyBGcm9tIEVQRiAxLjIsIHNoYXBlSWNvbi9ub2RlSWNvbiBzdG9yZXMgdXJpIHJlbGF0aXZlIHRvIHBsdWdpbiBwYXRoLiAKLQkJCS8vIEJlbG93IHNlY3Rpb24gb2YgY29kZSBpcyBuZWNlc3NhcnkgdG8gYXBwZW5kIHBsdWdpbiBuYW1lIHRvIHNoYXBlSWNvbi9ub2RlSWNvbiB1cmkuCi0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudDEpOwotCQkJaWYocGx1Z2luICE9IG51bGwpewotCQkJCWlmKCFpbWFnZVVybC5zdGFydHNXaXRoKHBsdWdpbi5nZXROYW1lKCkpICl7Ci0vLwkJCQkJU3RyaW5nIHBsdWdpblBhdGggPSBSZXNvdXJjZUhlbHBlci5nZXRQbHVnaW5QYXRoKGVsZW1lbnQpOwotLy8JCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBsdWdpblBhdGggKyBGaWxlLnNlcGFyYXRvcisgaW1hZ2VVcmwpOwotLy8JCQkJCWltYWdlVXJsID0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKEZpbGVVdGlsLmdldFJlbGF0aXZlUGF0aChmaWxlLCAKLS8vCQkJCQkJCW5ldyBGaWxlKGxpYlJvb3QpKSk7Ci0JCQkJCWltYWdlVXJsID0gTmV0VXRpbC5lbmNvZGVGaWxlVVJMKHBsdWdpbi5nZXROYW1lKCkgKyAiLyIgKyBpbWFnZVVybCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQkJLy8gbmVlZCBkZWNvZGVkIFVSTCBmb3IgZmlsZSBvcHMKLQkJCQlTdHJpbmcgZGVjb2RlZEltYWdlVXJsID0gTmV0VXRpbC5kZWNvZGVkRmlsZVVybChpbWFnZVVybCk7Ci0JCQkJRmlsZSBzb3VyY2UgPSBuZXcgRmlsZShyZXNNZ3IucmVzb2x2ZShlbGVtZW50MSwgZGVjb2RlZEltYWdlVXJsKSk7Ci0JCQkJRmlsZSBkZXN0ID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLCBkZWNvZGVkSW1hZ2VVcmwpOwotCQkJCUZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VVcmw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0Tm9kZWljb25VcmwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZWljb25VcmwoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNoYXBlaWNvblVybCgpIHsKLQkJcmV0dXJuIExheW91dFJlc291cmNlcy5nZXREZWZhdWx0U2hhcGVpY29uVXJsKGVsZW1lbnQuZ2V0VHlwZSgpCi0JCQkJLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXREaWFncmFtaWNvblVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtaWNvblVybCgpIHsKLQkJcmV0dXJuICJpY29ucy8iICsgZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIi5naWYiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGlzIGEgc2hhcmVkIG1ldGhvZCB0byBsb2FkIHRoZSB3b3JrIG9yZGVyIG9mIHRoZSB3b3JrIGJyZWFrZG93bgotCSAqIGVsZW1lbnQuIHdpbGwgYmUgdXNlZCBieSBhbGwgd29yayBicmVha2Rvd24gZWxlbW50IGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqICAgICAgICAgICAgWG1sRWxlbWVudCB0aGUgcGFyZW50IHhtbCBlbGVtZW50IHRvIGxvYWQgdGhlIHdvcmsgb3JkZXIKLQkgKiAgICAgICAgICAgIGxheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvYWRXb3JrT3JkZXIoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKTsKLQotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJWG1sRWxlbWVudCBwcmVkZWNlc3NvclhtbCA9IGVsZW1lbnRYbWwKLQkJCQkubmV3Q2hpbGQoVEFHX1JFRkVSRU5DRUxJU1QpLnNldEF0dHJpYnV0ZSgibmFtZSIsIGZlYXR1cmUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlXb3JrT3JkZXIgd28gPSAoV29ya09yZGVyKSBpdC5uZXh0KCk7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuY2FsYzAxRmVhdHVyZVZhbHVlKHdvLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0V29ya09yZGVyX1ByZWQoKSwgbGF5b3V0TWFuYWdlcgotCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCWlmIChtZSAhPSBudWxsKSB7Ci0JCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBnZXRDaGlsZExheW91dChtZSk7Ci0JCQkJCWlmIChsICE9IG51bGwpIHsKLQkJCQkJCXByZWRlY2Vzc29yWG1sLmFkZENoaWxkKGwuZ2V0WG1sRWxlbWVudChmYWxzZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIHNob3cgdGhlIGRlc2NyaXB0b3JzIG9mIHRoZSBtZXRob2QgZWxlbWVudAotCSAqIEBwYXJhbSBkZXNjcmlwdG9ycwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NEZXNjcmlwdG9ycyhYbWxFbGVtZW50IGVsZW1lbnRYbWwpIHsKLQkJCi0JCS8vIDE4MDU4MyAtIFB1YiBvcHRpb25zIHRvIGFsbG93IGFkZGluZyAod2hlbiBwdWJsaXNoaW5nKSBhbGwgZGVzY3JpcHRvcnMgdW5kZXIgYSBtZXRob2QgZWxlbWVudCBpbiBmb3JtIG9mIHRoZWlyIHBhdGgKLQkJCi0JCWlmICggIWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLnNob3dSZWxhdGVkRGVzY3JpcHRvcnMoKSApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gc2hvdyB0aGUgcm9sZSBkZXNjcmlwdG9ycyByZWZlcmVuY2luZyB0aGlzIHJvbGUKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mID0gbnVsbDsKLQkJCi0JCWlmICggdGhpcy5lbGVtZW50IGluc3RhbmNlb2YgUm9sZSApIHsKLQkJCW9mID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlRGVzY3JpcHRvcnM7Ci0JCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudCBpbnN0YW5jZW9mIFRhc2sgKSB7Ci0JCQlvZiA9IEFzc29jaWF0aW9uSGVscGVyLlRhc2tfVGFza0Rlc2NyaXB0b3JzOwotCQl9IGVsc2UgaWYgKCB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCApIHsKLQkJCW9mID0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3REZXNjcmlwdG9yczsKLQkJfQotCQkJCi0JCUxpc3QgZGVzY3JpcHRvcnMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQl0aGlzLmVsZW1lbnQsIG9mLAotCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCS8vIGNyZWF0ZSBhIGVsZW1lbnQgbm9kZXMgZm9yIGNlc2NyaXB0b3IgbGlzdAotCQlYbWxFbGVtZW50IGRlc2NMaXN0WG1sID0gZWxlbWVudFhtbC5uZXdDaGlsZChUQUdfUkVGRVJFTkNFTElTVCkuc2V0QXR0cmlidXRlKCJuYW1lIiwgImRlc2NyaXB0b3JzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKyApIHsKLQkJCURlc2NyaXB0b3IgZGVzYyA9IChEZXNjcmlwdG9yKWRlc2NyaXB0b3JzLmdldChpKTsKLQkJCUlFbGVtZW50TGF5b3V0IGxheW91dCA9IGdldENoaWxkTGF5b3V0KGRlc2MpOwotCQkJWG1sRWxlbWVudCBkZXNjWG1sID0gbGF5b3V0LmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJZGVzY0xpc3RYbWwuYWRkQ2hpbGQoZGVzY1htbCk7Ci0JCQkKLQkJCUxpc3QgcGFyZW50cyA9IF9fZ2V0U3VwZXJBY3Rpdml0aWVzKGRlc2MpOwotCQkJZm9yIChpbnQgcCA9IDA7IHAgPCBwYXJlbnRzLnNpemUoKTsgcCsrICkgewotCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSlwYXJlbnRzLmdldChwKTsKLQkJCQlsYXlvdXQgPSBnZXRDaGlsZExheW91dChhY3QpOwotCQkJCVhtbEVsZW1lbnQgYWN0WG1sID0gbGF5b3V0LmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJCWRlc2NYbWwuYWRkQ2hpbGQoYWN0WG1sKTsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIExpc3QgX19nZXRTdXBlckFjdGl2aXRpZXMoQnJlYWtkb3duRWxlbWVudCBlbGVtZW50KSB7Ci0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBidWlsZCB0aGUgcGFyZW50IG5vZGVzCi0JCUJyZWFrZG93bkVsZW1lbnQgcGFyZW50ID0gZWxlbWVudC5nZXRTdXBlckFjdGl2aXRpZXMoKTsgCi0JCXdoaWxlICggcGFyZW50ICE9IG51bGwgKSB7Ci0JCQkKLQkJCS8vIG5lZWQgdG8gcmVhbGl6ZSB0aGUgYWN0aXZpdHksIHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IGxpbmsgYW5kIHBhcmVudCBsaW5rcwotCQkJLy8gMjA0NzQ1IC0gd3JvbmcgcHJvY2VzcyB1c2FnZSBwYXRoIGZvciBjb250cmlidXRpbmcgYWN0aXZpdGllcwotCQkJcGFyZW50ID0gKEJyZWFrZG93bkVsZW1lbnQpQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChwYXJlbnQsIGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJaWYgKCBwYXJlbnQgPT0gbnVsbCApIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaXRlbXMuYWRkKDAsIHBhcmVudCk7Ci0JCQlpZiAoTGlicmFyeVV0aWwuaXNQcm9jZXNzKHBhcmVudCkgKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCX0KLQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzQnJlYWtkb3duRWxlbWVudF9HdWlkYW5jZXMoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJVW1hUGFja2FnZSB1bWFQa2cgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJaWYgKGZlYXR1cmUgPT0gdW1hUGtnLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQlpZiAoZmVhdHVyZSA9PSB1bWFQa2cuZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkKLQkJaWYgKGZlYXR1cmUgPT0gdW1hUGtnLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCi0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDI1ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5CcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogYWJzdHJjdCBjbGFzcyBmb3IgcHJvY2VzcyBlbGVtZW50IGxheW91dCB0aGF0IGlzIHByb2Nlc3Mgc3BlY2lmaWMKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgZXh0ZW5kcwotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHJvdGVjdGVkIFByb2Nlc3Mgb3duaW5nUHJvY2VzcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRQcm9jZXNzUGF0aCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyByZWxQcm9jZXNzUGF0aCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHBhdGhzID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlOYW1lID0gbnVsbDsKLQkKLQkvKioKLQkgKiBjb25zdHJ1Y3QgYSBsYXlvdXQgZm9yIHByb2Nlc3MgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBsYXlvdXRNYW5hZ2VyCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gb3duaW5nUHJvYwotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlQcm9jZXNzIG93bmluZ1Byb2MsIFN0cmluZyBwYXRoKSB7Ci0KLQkJaW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQotCQl0aGlzLm93bmluZ1Byb2Nlc3MgPSBvd25pbmdQcm9jOwotCQl0aGlzLmVsZW1lbnRQcm9jZXNzUGF0aCA9IHBhdGg7Ci0KLQkJaWYgKHRoaXMub3duaW5nUHJvY2VzcyA9PSBudWxsKSB7Ci0JCQl0aGlzLm93bmluZ1Byb2Nlc3MgPSBUbmdVdGlsCi0JCQkJCS5nZXRPd25pbmdQcm9jZXNzKChCcmVha2Rvd25FbGVtZW50KSBzdXBlci5lbGVtZW50KTsKLQkJfQotCi0JCWlmIChMaWJyYXJ5VXRpbC5pc1Byb2Nlc3MoZWxlbWVudCkpIHsKLQkJCW93bmluZ1Byb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCWVsZW1lbnRQcm9jZXNzUGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQubWFrZVBhdGgobnVsbCwKLQkJCQkJZWxlbWVudCk7Ci0JCQlyZWxQcm9jZXNzUGF0aCA9IGVsZW1lbnRQcm9jZXNzUGF0aDsKLQkJfQotCQkKLQkJaWYgKCBlbGVtZW50UHJvY2Vzc1BhdGggPT0gbnVsbCAmJiB0aGlzLmVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KQotCQl7Ci0JCQllbGVtZW50UHJvY2Vzc1BhdGggPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldFBhdGgoKEJyZWFrZG93bkVsZW1lbnQpdGhpcy5lbGVtZW50KTsKLQkJfQotCQkKLQkJLy8gZ2V0IHRoZSBwYXRoIGFycmF5Ci0JCXBhdGhzID0gZ2V0UGF0aEFycmF5KGVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQotCX0KLQotCi0JLyoqCi0JICogdGhlIHByb2Nlc3MgcGF0aCBvZiB0aGlzIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIGNhbGxpbmcgaXRlbQotCSAqIEBwYXJhbSBwYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVsYXRpdmVQcm9jZXNzUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXRoaXMucmVsUHJvY2Vzc1BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlbGF0aXZlIHByb2Nlc3MgcGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVByb2Nlc3NQYXRoKCkKLQl7Ci0JCXJldHVybiB0aGlzLnJlbFByb2Nlc3NQYXRoOwotCX0KLQkKLS8vCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotLy8JCVN0cmluZyB1cmwgPSBzdXBlci5nZXRVcmwoKTsKLS8vCi0vLwkJcmV0dXJuIHVybCArIGdldFF1ZXJ5U3RyaW5nKCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBnZXQgcXVlcnkgc3RyaW5nIGZvciB0aGUgcHJvY2VzcyBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgewotLy8JCWlmIChvd25pbmdQcm9jZXNzID09IGVsZW1lbnQpIHsKLS8vCQkJcmV0dXJuICIiOwotLy8JCX0KLQkJLy8gcmV0dXJuICI/IiArIFJlc291cmNlSGVscGVyLlVSTF9QQVJBTUVURVJfUFJPQ0VTUyArICI9IiArCi0JCS8vIG93bmluZ1Byb2Nlc3MuZ2V0R3VpZCgpICsgIiYiICsgUmVzb3VyY2VIZWxwZXIuVVJMX1BBUkFNRVRFUl9QQVRIICsKLQkJLy8gIj0iICsgZWxlbWVudFByb2Nlc3NQYXRoOwotCi0JCXJldHVybiBFbGVtZW50TGF5b3V0TWFuYWdlci5nZXRRdWVyeVN0cmluZyhvd25pbmdQcm9jZXNzLmdldEd1aWQoKSwKLQkJCQllbGVtZW50UHJvY2Vzc1BhdGgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldERpc3BsYXlOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlpZiAoIHRoaXMuZGlzcGxheU5hbWUgPT0gbnVsbCApIHsKLQkJCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCQotCQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN1cHJlc3NlZCBicmVha2Rvd24gZWxlbWVudHMKLQkJCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQkKLQkJCS8vIGRpc3BsYXkgbmFtZSBuZWVkcyB0byBiZSBmaXhlZCwgZXh0ZW5kZWQgYWN0aXZpdHkgbWF5IG5lZWQgdG8gZ2V0IGRpc3BsYXkgbmFtZSBmcm9tIHRoZSBiYXNlCi0JCQkvLyBEVlQ6ICBQTnMgb2YgZXh0ZW5kZWQgcHJvY2Vzc2VzIG5vIHBpY2tlZCB1cCBmb3IgcHVibGlzaCAoVENUIDYzOCkKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgodGhpcy5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCQl9Ci0JCi0JCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQl3cmFwcGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQotCQkJdGhpcy5kaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShlbGVtZW50LAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBhZGFwdGVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRpc3BsYXlOYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3VwcHJlc3Npb24gZ2V0U3VwcHJlc3Npb24oUHJvY2VzcyBwcm9jKQotCXsKLQkJcmV0dXJuIGxheW91dE1hbmFnZXIuZ2V0U3VwcHJlc3Npb24ocHJvYyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoKTsKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInF1ZXJ5U3RyaW5nIiwgZ2V0UXVlcnlTdHJpbmcoKSkgLy8kTk9OLU5MUy0xJAotCQkJLy8uc2V0QXR0cmlidXRlKCJvd25pbmdQcm9jZXNzR3VpZCIsIG93bmluZ1Byb2Nlc3MuZ2V0R3VpZCgpKSAvLyAvLyROT04tTkxTLTEkCi0JCQkvLy5zZXRBdHRyaWJ1dGUoImVsZW1lbnRQcm9jZXNzUGF0aCIsIGVsZW1lbnRQcm9jZXNzUGF0aCkgLy8kTk9OLU5MUy0xJAotCQkJLnNldEF0dHJpYnV0ZSgicmVsUHJvY2Vzc1BhdGgiLCByZWxQcm9jZXNzUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb2Nlc3MgZ2V0T3duaW5nUHJvY2VzcygpIHsKLQkJcmV0dXJuIG93bmluZ1Byb2Nlc3M7Ci0JfQotCi0JcHJvdGVjdGVkIElFbGVtZW50TGF5b3V0IGdldExheW91dChQcm9jZXNzRWxlbWVudEl0ZW0gaXRlbSkgewotCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChpdGVtLmVsZW1lbnQsIG93bmluZ1Byb2Nlc3MsIGl0ZW0ucGF0aCk7Ci0JCQotCQlpZiAoIGxheW91dCBpbnN0YW5jZW9mIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgKQotCQl7CQkKLQkJCS8vIHNldCB0aGUgcmVsYXRpdmUgcGF0aCB0byB0aGlzIGxheW91dCBzaW5jZSB0aGlzIGlzIHRoZSBjYWxsZXIKLQkJCVN0cmluZyByZWxQYXRoID0gQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dC5nZXRSZWxhdGl2ZVBhdGgoaXRlbS5wYXRoLCB0aGlzLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCQkoKEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQpbGF5b3V0KS5zZXRSZWxhdGl2ZVByb2Nlc3NQYXRoKHJlbFBhdGgpOwotCQl9Ci0JCXJldHVybiBsYXlvdXQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckFjdGl2aXR5UGF0aCgpIHsKLQkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCApIHsKLQkJCUFjdGl2aXR5IGFjdCA9ICgoQnJlYWtkb3duRWxlbWVudCllbGVtZW50KS5nZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCVN0cmluZyBpZCA9IGFjdC5nZXRHdWlkKCk7Ci0JCQlpbnQgaSA9IGVsZW1lbnRQcm9jZXNzUGF0aC5pbmRleE9mKGlkKTsKLQkJCWlmICggaSA+PTAgKSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnRQcm9jZXNzUGF0aC5zdWJzdHJpbmcoMCwgaSArIGlkLmxlbmd0aCgpKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgZm9yIG1ha2UgYSBwYXRoIGZvciB0aGUgcHJvY2VzcyBlbGVubWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VQYXRoKFN0cmluZyBwYXJlbnRQYXRoLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHBhcmVudFBhdGggPT0gbnVsbCB8fCBwYXJlbnRQYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50LmdldEd1aWQoKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnRQYXRoICsgIiwiICsgZWxlbWVudC5nZXRHdWlkKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBzdGF0aWMgbWV0aG9kIHRvIGdldCB0aGUgcGF0aCBvZiBhIGJyZWFrIGRvd24gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJU3RyaW5nIHBhdGggPSBlbGVtZW50LmdldEd1aWQoKTsKLQkJQnJlYWtkb3duRWxlbWVudCBhY3QgPSBlbGVtZW50OwotCQlQcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0KLQkJLy8gQ2hlY2sgc3VwZXJhY3Rpdml0eSBpcyBwcm9jZXNzIGFuZCBzaG91bGQgb3duaW5nIHByb2Nlc3MgKHRoaXMgaXMgdXNlZnVsIGluIGRlZXBjb3B5Ci0JCXdoaWxlICggYWN0ICE9IHByb2MgKQotCQl7Ci0JCQlBY3Rpdml0eSBzdXBlckFjdHMgPSBhY3QuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0JCQlpZiAoIHN1cGVyQWN0cyAhPSBudWxsICkKLQkJCXsKLQkJCQlhY3QgPSBzdXBlckFjdHM7Ci0JCQkJcGF0aCA9IGFjdC5nZXRHdWlkKCkgKyAiLCIgKyBwYXRoOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwYXRoOwkJCi0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcGF0aCBmb3IgYSBnaXZlbiBicmVha2Rvd24gZWxlbWVudCBpdGVtIHByb3ZpZGVyCi0JICogQHBhcmFtIHdyYXBwZXIgQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIgd3JhcHBlcikKLQl7Ci0JCU9iamVjdCBlID0gTGlicmFyeVV0aWwudW53cmFwKHdyYXBwZXIpOwotCQlpZiAoICEoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJT2JqZWN0IHRvcEl0ZW0gPSB3cmFwcGVyLmdldFRvcEl0ZW0oKTsKLQkJU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXBhdGguYXBwZW5kKCgoTWV0aG9kRWxlbWVudCllKS5nZXRHdWlkKCkpOwotCQkKLQkJT2JqZWN0IHBhcmVudCA9IHdyYXBwZXI7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gdG9wSXRlbSkgewotCQkJaWYgKCBwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50ICkgewotCQkJCXBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudClwYXJlbnQpLmdldFN1cGVyQWN0aXZpdGllcygpOwotCQkJCWUgPSBwYXJlbnQ7Ci0JCQl9IGVsc2UgaWYgKCBwYXJlbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlciApewotCQkJCXBhcmVudCA9ICgoQnJlYWtkb3duRWxlbWVudFdyYXBwZXJJdGVtUHJvdmlkZXIpcGFyZW50KS5nZXRQYXJlbnQocGFyZW50KTsKLQkJCQllID0gTGlicmFyeVV0aWwudW53cmFwKHBhcmVudCk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQkJCi0JCQlpZiAoIGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJcGF0aC5pbnNlcnQoMCwgKChNZXRob2RFbGVtZW50KWUpLmdldEd1aWQoKSArICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHBhdGgudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogdXRpbGl0eSBtZXRob2QgdG8gZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBwYXJlbnQKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKiBAcGFyYW0gcGFyZW50UGF0aCBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aChTdHJpbmcgcGF0aCwgU3RyaW5nIHBhcmVudFBhdGgpIHsKLQkJCi0JCWlmICggcGF0aCA9PSBudWxsICkKLQkJewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQkJCi0JCWlmICggcGF0aC5zdGFydHNXaXRoKHBhcmVudFBhdGgpICkKLQkJewotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKHBhcmVudFBhdGgubGVuZ3RoKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHBhdGggYXJycmF5Ci0JICogQHBhcmFtIHBhdGggU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UGF0aEFycmF5KFN0cmluZyBwYXRoKQotCXsKLQkJaWYgKCBwYXRoID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde307CQkJCi0JCX0KLQkJCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocGF0aCwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoIHN0Lmhhc01vcmVUb2tlbnMoKSApCi0JCXsKLQkJCVN0cmluZyBzID0gc3QubmV4dFRva2VuKCkudHJpbSgpOwotCQkJaWYgKCBzLmxlbmd0aCgpID4gMCApCi0JCQl7Ci0JCQkJaXRlbXMuYWRkKHMpOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmdbXSBhcnIgPSBuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV07Ci0JCWl0ZW1zLnRvQXJyYXkoYXJyKTsKLQkJCi0JCXJldHVybiBhcnI7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgb3duaW5nIHByb2Nlc3MgZnJvbSBwYXRoLCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcGF0aCBpcyB0aGUgZ3VpZCBvZiB0aGUgcHJvY2VzcwotCSAqIEBwYXJhbSBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPd25pbmdQcm9jZXNzR3VpZEZyb21QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJaWYgKCBwYXRoID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaW50IGluZGV4ID0gcGF0aC5pbmRleE9mKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGd1aWQ7Ci0JCWlmICggaW5kZXggPCAwICkKLQkJewotCQkJZ3VpZCA9IHBhdGg7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlndWlkID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHBhcmVudCBwYXRoCi0JICogQHBhcmFtIHBhdGgKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhcmVudFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKCBwYXRoID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZigiLCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICggaW5kZXggPiAwICkgewotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWVmYzcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlRpbWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkNvbXBhcmF0b3JzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5QcmVkZWNlc3Nvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlByb2Nlc3NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5TdXBwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLkRpYWdyYW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLklBY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuQlNDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZnMuUHJlZmVyZW5jZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSb2xlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUxheW91dCBleHRlbmRzIEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQl9OQU1FX0FDVElWSVRZX0RFU0MgPSAiRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCX05BTUVfQUNUSVZJVFlfV0JTID0gIldCUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJfTkFNRV9BQ1RJVklUWV9UQlMgPSAiVEJTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQl9OQU1FX0FDVElWSVRZX1dQQlMgPSAiV1BCUyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNFX1JFUExBQ0VNRU5UID0gIl9CUl8iOwkgLy8kTk9OLU5MUy0xJAotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTkJSQUNFX1NUUklORyA9ICJcXHsiOwkgLy8kTk9OLU5MUy0xJAotCQotCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8gdXNlckRpYWdyYW1JbmZvID0gbnVsbDsKLQlib29sZWFuIGRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkKLQlwcml2YXRlIFRCU0l0ZW1EZXRhaWwgaXRlbURldGFpbCA9IG5ldyBUQlNJdGVtRGV0YWlsKCk7Ci0JCi0JcHVibGljIEFjdGl2aXR5TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHByb2Nlc3MgaXMgbG9hZGVkCi0JCS8vIG90aGVyd2lzZSB0aGUgcHJvY2VzcyBvciBwcm9jZXNzIGVsZW1lbnRzIG1heSBub3QgaGF2ZSBhIHZhbGlkIGNvbnRhaW5lcgotCQkvLyBhbmQgdGh1cyB0aGUgZWxlbWVudCBjb250ZW50IHBhdGggY2FuJ3QgYmUgZGV0ZXJtaW5lZAotCQkvLyB0aGlzIGlzIGp1c3QgYSB3b3JrYXJvdW5kLiBzaG91bGQgd2UgaGF2ZSBhIGJldHRlciB3YXkgdG8gbWFrZSBzdXJlIHRoZSBlbGVtZW50cyBhcmUgbG9hZGVkIGNvcnJlY3RseT8/Pz8/Pz8/Pz8/Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4oZWxlbWVudCk7Ci0JCWlmICggcGx1Z2luID09IG51bGwgfHwgcGx1Z2luLmVDb250YWluZXIoKSA9PSBudWxsICkgewotCQkJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBwdWJsaXNoaW5nIG1vZGUgc2luY2UgdGhlIHdob2xlIGxpYnJhcnkgaXMgYWxyZWFkeSBsb2FkZWQKLQkJCWlmICggZGVidWcgJiYgZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IEVsZW1lbnQgd2l0aG91dCBhIHZhbGlkIGNvbnRhaW5lcjogIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsUHJvY2Vzc2VzKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JCX0KLQkJCi0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQotCQl1c2VyRGlhZ3JhbUluZm8gPSBuZXcgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbygoQWN0aXZpdHkpZWxlbWVudCk7Ci0JCQotCQotCQkvLyBzZXR1cCB0aGUgbXVsdGkgbGF5b3V0IG91dHB1dAotCQkvLyBTdHJpbmcgZmlsZV9kZXNjID0gc3VwZXIuZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7CQkKLQkJCi0JCVN0cmluZyBmaWxlOwotCQkKLS8vCQlpZiAoc3VwZXIuZWxlbWVudC5nZXRHdWlkKCkuc3RhcnRzV2l0aCgieyIpKQotLy8JCXsKLS8vCQkJU3RyaW5nIG5ld0d1aWQgPSBzdXBlci5lbGVtZW50LmdldEd1aWQoKS5yZXBsYWNlRmlyc3QoIE9QRU5CUkFDRV9TVFJJTkcsIEJSQUNFX1JFUExBQ0VNRU5UICk7Ci0vLwkJCWZpbGUgPSBzdXBlci5lbGVtZW50LmdldE5hbWUoKSArIG5ld0d1aWQuc3Vic3RyaW5nKDAsIG5ld0d1aWQubGVuZ3RoKCktMSk7Ci0vLwkJfQotLy8JCWVsc2UKLQkJCS8vZmlsZSA9IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnMoc3VwZXIuZWxlbWVudC5nZXROYW1lKCkpICsgc3VwZXIuZWxlbWVudC5nZXRHdWlkKCk7Ci0JCQotCQlmaWxlID0gZ2V0RmlsZU5hbWUoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCk7Ci0JCWlmIChmaWxlICE9IG51bGwgKSB7Ci0JCQkvLyByZXBsYWNlICcgYW5kICIgd2l0aCBzcGFjZQotCQkJZmlsZSA9IGZpbGUucmVwbGFjZSgnXCcnLCAnICcpLnJlcGxhY2UoJ1wiJywgJyAnKTsKLQkJCQotCQkJc2V0TGF5b3V0SW5mbyhuZXcgTGF5b3V0SW5mbygKLQkJCQlUQUJfTkFNRV9BQ1RJVklUWV9ERVNDLCAiYWN0aXZpdHlfZGVzYy54c2wiLCBmaWxlICsgVEFCVVJMX1NVRkZJWF9ERVNDLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCVRBQl9OQU1FX0FDVElWSVRZX1dQQlMsICJhY3Rpdml0eV93cGJzLnhzbCIsIGZpbGUgKyBUQUJVUkxfU1VGRklYX1dQQlMsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCVRBQl9OQU1FX0FDVElWSVRZX1RCUywgImFjdGl2aXR5X3Ricy54c2wiLCBmaWxlICsgVEFCVVJMX1NVRkZJWF9UQlMsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCQlzZXRMYXlvdXRJbmZvKG5ldyBMYXlvdXRJbmZvKAotCQkJCVRBQl9OQU1FX0FDVElWSVRZX1dCUywgImFjdGl2aXR5X3dicy54c2wiLCBmaWxlICsgVEFCVVJMX1NVRkZJWF9XQlMsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQgCi0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIGluIEFjdGl2aXR5TGF5b3V0LmluaXQ6IG5vIGZpbGUgZm9yIGVsZW1lbnQgIiArIHN1cGVyLmVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhzbFVybCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKSB7Ci0JCS8vIHNldCB0aGUgZGVmYXVsdCB0YWIgdXJsLCB0aGUgZGVmYXVsdCB0YWIgd2lsbCBiZSBzZXQgaW4gcHVibGlzaGluZy4KLQkJLy8gZm9yIGJyb3dzaW5nLCB1c2UgdGhlIFRBQl9OQU1FX0FDVElWSVRZX1dCUyB0YWIKLQkJU3RyaW5nIHRhYk5hbWUgPSBnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5nZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLQkJaWYgKCB0YWJOYW1lID09IG51bGwgKSB7Ci0JCQl0YWJOYW1lID0gVEFCX05BTUVfQUNUSVZJVFlfV0JTOwotCQl9Ci0JCUxheW91dEluZm8gaW5mbyA9IGdldExheW91dEluZm8odGFiTmFtZSk7Ci0JCWlmICggaW5mbyA9PSBudWxsICkgewotCQkJaW5mbyA9IGdldExheW91dEluZm8oVEFCX05BTUVfQUNUSVZJVFlfV0JTKTsKLQkJfQkKLQkJCi0JCXJldHVybiBpbmZvLmxheW91dF94c2w7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJVUkxfU1VGRklYX0RFU0MgPSAiX2Rlc2MiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJVUkxfU1VGRklYX1dQQlMgPSAiX3dwYnMiICsgUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTDsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJVUkxfU1VGRklYX1RCUyA9ICJfdGJzIiArIFJlc291cmNlSGVscGVyLkZJTEVfRVhUX0hUTUw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCVVJMX1NVRkZJWF9XQlMgPSAiX3dicyIgKyBSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aXZpdHlUYWJVcmwoU3RyaW5nIHVybCkgewotCQkKLQkJaWYgKCB1cmwgPT0gbnVsbCB8fCB1cmwubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuICh1cmwuZW5kc1dpdGgoVEFCVVJMX1NVRkZJWF9ERVNDKSAKLQkJCQl8fCB1cmwuZW5kc1dpdGgoVEFCVVJMX1NVRkZJWF9XUEJTKSAKLQkJCQl8fCB1cmwuZW5kc1dpdGgoVEFCVVJMX1NVRkZJWF9UQlMpIAotCQkJCXx8IHVybC5lbmRzV2l0aChUQUJVUkxfU1VGRklYX1dCUykgKTsKLQkJCi0JfQotCS8qKgotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGNvbGxlY3QgdGhlIFN1cHBvcnRpbmdNYXRlcmlhbHMgdGhhdCBhcmUgZm9yIHVzZXIgZGVmaW5lZCBkaWFncmFtcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsICkgewkJCQotCQkJcmV0dXJuICF1c2VyRGlhZ3JhbUluZm8uaXNEaWFncmFtKCAoU3VwcG9ydGluZ01hdGVyaWFsKXZhbHVlICk7Ci0JCX0KLQkJZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgTGlzdCApCi0JCXsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlICggaSA8IGl0ZW1zLnNpemUoKSApCi0JCQl7Ci0JCQkJT2JqZWN0IG8gPSBpdGVtcy5nZXQoaSk7Ci0JCQkJaWYgKCAobyBpbnN0YW5jZW9mIFN1cHBvcnRpbmdNYXRlcmlhbCkgJiYgdXNlckRpYWdyYW1JbmZvLmlzRGlhZ3JhbSgoU3VwcG9ydGluZ01hdGVyaWFsKW8pICkgewkJCQotCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQotCQlTdHJpbmcgbXNnOwotCQlUaW1lciB0ID0gbnVsbDsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQgPSBuZXcgVGltZXIoKTsJCi0JCQltc2cgPSAiR2VuZXJhdGluZyBsYXlvdXQgeG1sIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIC8vJE5PTi1OTFMtMSQgCi0JCQkJKyAiLCBpbmNsdWRlUmVmZXJlbmNlcyA9ICIgKyBpbmNsdWRlUmVmZXJlbmNlczsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJCi0KLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudCgpOwotCQkKLQkJLy8gbG9hZCB0aGUgYXR0cmlidXRlcwotCQlsb2FkQXR0cmlidXRlcyhlbGVtZW50WG1sKTsKLQkJCi0vLwkJLy8gc2V0IHRoZSBkZWZhdWx0IHRhYiB1cmwsIHRoZSBkZWZhdWx0IHRhYiB3aWxsIGJlIHNldCBpbiBwdWJsaXNoaW5nLgotLy8JCS8vIGZvciBicm93c2luZywgdXNlIHRoZSBUQUJfTkFNRV9BQ1RJVklUWV9XQlMgdGFiCi0vLwkJU3RyaW5nIHRhYk5hbWUgPSBnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5nZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLS8vCQlpZiAoIHRhYk5hbWUgPT0gbnVsbCApIHsKLS8vCQkJdGFiTmFtZSA9IFRBQl9OQU1FX0FDVElWSVRZX1dCUzsKLS8vCQl9Ci0vLwkJTGF5b3V0SW5mbyBsaW5mbyA9IGdldExheW91dEluZm8odGFiTmFtZSk7Ci0vLwkJaWYgKCBsaW5mbyA9PSBudWxsICkgewotLy8JCQlsaW5mbyA9IGdldExheW91dEluZm8oVEFCX05BTUVfQUNUSVZJVFlfV0JTKTsKLS8vCQl9CQotLy8JCQotLy8JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJkZWZhdWx0VGFiVXJsIiwgbGluZm8uZmlsZU5hbWUpOwotLy8JCQotCQlQcm9jZXNzIHByb2MgPSBnZXRPd25pbmdQcm9jZXNzKCk7Ci0JCQotCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50cwotCQkvLyB1c2UgdGhlIFN1cHJlc3MgdXRpbGl0eQotCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQotLy8JCS8vIGRpc3BsYXkgbmFtZSBuZWVkcyB0byBiZSBmaXhlZCwgZXh0ZW5kZWQgYWN0aXZpdHkgbWF5IG5lZWQgdG8gZ2V0IGRpc3BsYXkgbmFtZSBmcm9tIHRoZSBiYXNlCi0vLwkJLy8gRFZUOiAgUE5zIG9mIGV4dGVuZGVkIHByb2Nlc3NlcyBubyBwaWNrZWQgdXAgZm9yIHB1Ymxpc2ggKFRDVCA2MzgpCi0vLwkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLS8vCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLS8vCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLS8vCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0vLwkJfQotLy8KLS8vCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotLy8JCQkJd3JhcHBlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLS8vCi0vLwkJU3RyaW5nIGRpc3BsYXlOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGVsZW1lbnQsCi0vLwkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBhZGFwdGVyKTsKLS8vCi0vLwkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIWluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFhtbDsKLQkJfQotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCS8vIGdldCB0aGUgdGFicyB4bWwgc2VjdGlvbgotCQlYbWxFbGVtZW50IHRhYnNYbWwgPSBlbGVtZW50WG1sLm5ld0NoaWxkKCJ0YWJzIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxheW91dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTGF5b3V0SW5mbyBpbmZvID0gKExheW91dEluZm8pIGl0Lm5leHQoKTsKLQkJCXRhYnNYbWwubmV3Q2hpbGQoInRhYiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGluZm8ubmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBzdXBlci5lbGVtZW50UGF0aCArIGluZm8uZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBkbyBpdCBvbmx5IHdoZW4gaXQncyBhIHByb2Nlc3Mgb3IgaXQncyBub3QgaW4gcHVibGlzaGluZyBtb2RlbAotCQkvLyBzaW5jZSBpbiBwdWJsaXNoaW5nLCB0aGUgaXRlcmF0aW9uIGFsd2F5cyBzdGFydCBmcm9tIHByb2Nlc3MKLQkJLy8gZm9yIGJyb3dzaW5nLCBpdCBjYW4gc3RhcnQgaW4gdGhlIG1pZGRsZSAKLQkJaWYgKCAhZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpIHx8IHN1cGVyLmVsZW1lbnQgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgKSB7Ci0JCQlnZXRMYXlvdXRNZ3IoKS5wcmVwYXJlQWRhcHRvckZhY3Rvcmllc0ZvclByb2Nlc3MocHJvYyk7Ci0JCX0KLQotCQkvLyBsb2FkIHRoZSBjb3B5cmlnaHQgaW5mbwotCQlsb2FkQ29weXJpZ2h0KGVsZW1lbnRYbWwpOwotCi0JCS8vIGNhbGN1bGF0ZSBvdGhlciBzZWxlY3RlZCByZWZlcmVjbmVzCi0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBlbGVtZW50IHJlZmVyZW5jZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzCi0JCQkJCQkuZ2V0KGkpOwotCi0JCQkJLy8gc2tpcCB0aGUgYnJlYWtkb3duIGVsZW1lbnRzIHNpbmNlIHdlIHdpbGwgYnVpbGQgdGhlIGJyZWFrZG93bgotCQkJCS8vIHN0cnVjdHVyZSBsYXRlcgotCQkJCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBPYmplY3QgdmFsdWUgPSBlbGVtZW50LmdldChpKTsKLQkJCQlFQ2xhc3NpZmllciB0eXBlID0gZmVhdHVyZS5nZXRFVHlwZSgpOwotCQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBvcHBvc2l0ZVByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnQuZ2V0T3Bwb3NpdGVGZWF0dXJlcygpKTsKLQkJZm9yIChJdGVyYXRvciB6PSBvcHBvc2l0ZVByb3BlcnRpZXMuaXRlcmF0b3IoKTsgei5oYXNOZXh0KCk7ICkKLQkJewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgei5uZXh0KCk7Ci0JCQlsb2FkRmVhdHVyZShvZmVhdHVyZSwgZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIEFjdGl2aXR5IERlc2NyaW90aW9uIHhtbCBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCQotCQkJdC5zdGFydCgpOwotCQl9Ci0KLQkJYnVpbGRXQlMoZWxlbWVudFhtbCwgc3VwKTsKLQkJaWYgKCBkZWJ1ZyApIHsKLQkJCXQuc3RvcCgpOwotCQkJbXNnID0gdC5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBXQlMgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkKLQkJCXQuc3RhcnQoKTsKLQkJfQotCQkKLQkJYnVpbGRUQlMoZWxlbWVudFhtbCwgc3VwKTsJCi0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIFRCUyBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkJCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkKLQkJCXQuc3RhcnQoKTsKLQkJfQotCQkKLQkJYnVpbGRXUEJTKGVsZW1lbnRYbWwsIHN1cCk7Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQltc2cgPSB0LmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGJ1aWxkaW5nIFdQQlMgZm9yICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlbGVtZW50KSAgOyAvLyROT04tTkxTLTEkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQkKLQkJCW1zZyA9IHQuZ2V0VG90YWxUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBidWlsZGluZyBsYXlvdXQgeG1sIGZvciAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JCQotCQkKLS8vCQkvLyBmb3IgdGVzdCBvbmx5Ci0vLwkJUHJvY2Vzc0xheW91dERhdGEgZGF0YSA9IG5ldyBQcm9jZXNzTGF5b3V0RGF0YShnZXRPd25pbmdQcm9jZXNzKCkuZ2V0R3VpZCgpKTsKLS8vCQlsb2FkTGF5b3V0RGF0YShkYXRhLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVzZXJEaWFncmFtVGV4dChTdXBwb3J0aW5nTWF0ZXJpYWwgdXNlckRpYWdyYW0pCi0JewotCQkvLyB1c2VyIGRlZmluZWQgZGlhZ3JhbQotCQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCWwuaW5pdChnZXRMYXlvdXRNZ3IoKSwgdXNlckRpYWdyYW0uZ2V0UHJlc2VudGF0aW9uKCkpOwotCQlsLnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlyZXR1cm4gKFN0cmluZylsLmdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShmZWF0dXJlKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q29sdW1ucyhYbWxFbGVtZW50IHBhcmVudFhtbCwgTGlzdCBjb2xzKSB7Ci0JCVhtbEVsZW1lbnQgY29sc1htbCA9IHBhcmVudFhtbC5uZXdDaGlsZCgiY29sdW1ucyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBjb2xzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlCU0NvbHVtbiBjb2wgPSAoQlNDb2x1bW4paXQubmV4dCgpOwotCQkJY29sc1htbC5uZXdDaGlsZCgiY29sdW1uIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoImlkIiwgY29sLmlkKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgibGFiZWwiLCBjb2wubGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV0JTKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJLy8gYnVpbGQgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdHJlZQotCQlYbWxFbGVtZW50IGJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCB0aGUgY29sdW1ucwotCQlzZXRDb2x1bW5zKGJzLCBQcmVmZXJlbmNlVXRpbC5nZXRXQlNDb2x1bW5zKCkpOwotCQkKLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0JCS8vIGlmICggc3VwZXIuZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MgKQotCQl7Ci0JCQlQcm9jZXNzVXRpbC51cGRhdGVJRHMoYWRhcHRlckZhY3RvcnksIHN1cC5nZXRQcm9jZXNzKCkpOwotCQl9Ci0KLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0KLQkJLy8gZXNjYXBlIHRoZSBxdW90ZXMgaW4gdGhlIHN0cmluZyBzaWNuZSB3ZSBzZXQgdGhlIHN0cmluZyBpbnRvIGphdmFzY3JpcHQgdmFyaWFibGVzIGluIHRoZSBsYXlvdXQKLQkJc2V0dGluZy5lc2NhcGVTdHJpbmcgPSB0cnVlOwotCQkKLQkJLy8gc2V0IHRvIG9ubHkgc2hvdyB0YXNrIGRlc2NyaXB0b3JzIGZvciBzdWItYWN0aXZpdGllcwotCQlzZXR0aW5nLnNob3dUYXNrT25seSA9IHRydWU7Ci0JCQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9IAotCQkKLQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHdyYXBwZXIpICkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGUoZWxlbWVudEl0ZW0sIGJzLCBzZXR0aW5nKTsKLQkJCi0KLQkJWG1sRWxlbWVudCBkaWFncmFtcyA9IGVsZW1lbnRYbWwubmV3Q2hpbGQoImRpYWdyYW1zIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBkaWFncmFtVHlwZTsKLQkJU3RyaW5nIGltZ0ZpbGU7Ci0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgdXNlckRpYWdyYW0gPSB1c2VyRGlhZ3JhbUluZm8uZ2V0QWN0aXZpdHlEaWFncmFtKCk7Ci0JCWlmICggdXNlckRpYWdyYW1JbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgJiYgKHVzZXJEaWFncmFtICE9IG51bGwpICkKLQkJewkJCQkKLQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJ1c2VyZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZGlhZ3JhbVR5cGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0VmFsdWUoZ2V0VXNlckRpYWdyYW1UZXh0KHVzZXJEaWFncmFtKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVkZEluZm8gPSBnZXRSZWFsaXplZFVERChzdXAsIGRpYWdyYW1UeXBlKTsKLQkJCWJvb2xlYW4gZ2VuZXJhdGVkRGlhZ3JhbSA9IHRydWU7Ci0JCQlpZih1ZGRJbmZvICE9IG51bGwpewotCQkJCXVzZXJEaWFncmFtID0gdWRkSW5mby5nZXRBY3Rpdml0eURpYWdyYW0oKTsKLQkJCQlpZih1ZGRJbmZvLmNhblB1Ymxpc2hBREltYWdlKCkgJiYgdXNlckRpYWdyYW0gIT0gbnVsbCl7Ci0JCQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJ1c2VyZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGRpYWdyYW1UeXBlKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJCQkJZ2VuZXJhdGVkRGlhZ3JhbSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoZ2VuZXJhdGVkRGlhZ3JhbSl7Ci0JCQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgZGlhZ3JhbVR5cGUpOwotCQkJCURpYWdyYW1JbmZvIGRpYWdyYW1fd29ya2Zsb3cgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQkJCWlmIChkaWFncmFtX3dvcmtmbG93ICE9IG51bGwKLQkJCQkJJiYgZGlhZ3JhbV93b3JrZmxvdy5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVykgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgiYWx0IiwgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vLnNldFZhbHVlKGRpYWdyYW1fd29ya2Zsb3cuZ2V0SFRNTCgpKTsKLQkJCQkJCS5hZGRDaGlsZChkaWFncmFtX3dvcmtmbG93LmdldFhtbEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlkaWFncmFtVHlwZSA9IFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCXVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQlpZiAoIHVzZXJEaWFncmFtSW5mby5jYW5QdWJsaXNoQURESW1hZ2UoKSAmJiAodXNlckRpYWdyYW0gIT0gbnVsbCkgKQotCQl7CQkJCQotCQkJZGlhZ3JhbXMubmV3Q2hpbGQoInVzZXJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBkaWFncmFtVHlwZSkgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZShnZXRVc2VyRGlhZ3JhbVRleHQodXNlckRpYWdyYW0pKTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWltZ0ZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXREaWFncmFtRmlsZVBhdGhOYW1lKGVsZW1lbnQsIGRpYWdyYW1UeXBlKTsKLQkJCURpYWdyYW1JbmZvIGRpYWdyYW1fZGV0YWlsID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJCWlmIChkaWFncmFtX2RldGFpbCAhPSBudWxsICYmIGRpYWdyYW1fZGV0YWlsLmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJZGlhZ3JhbXMKLQkJCQkJCS5uZXdDaGlsZCgiZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkiYWx0IiwgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUwpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLy5zZXRWYWx1ZShkaWFncmFtX2RldGFpbC5nZXRIVE1MKCkpOwotCQkJCQkJLmFkZENoaWxkKGRpYWdyYW1fZGV0YWlsLmdldFhtbEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1k7Ci0JCXVzZXJEaWFncmFtID0gdXNlckRpYWdyYW1JbmZvLmdldFdQRERpYWdyYW0oKTsKLQkJaWYgKCB1c2VyRGlhZ3JhbUluZm8uY2FuUHVibGlzaFdQREltYWdlKCkgJiYgKHVzZXJEaWFncmFtICE9IG51bGwpICkKLQkJewkJCQkKLQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJ1c2VyZGlhZ3JhbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgZGlhZ3JhbVR5cGUpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0VmFsdWUoZ2V0VXNlckRpYWdyYW1UZXh0KHVzZXJEaWFncmFtKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBkaWFncmFtVHlwZSk7Ci0JCQlEaWFncmFtSW5mbyBkaWFncmFtX3dwID0gZ2VuZXJhdGVEaWFncmFtKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwkKLQkJCWlmIChkaWFncmFtX3dwICE9IG51bGwgJiYgZGlhZ3JhbV93cC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJCWRpYWdyYW1zLm5ld0NoaWxkKCJkaWFncmFtIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkiYWx0IiwgZ2V0RGlhZ3JhbURpc3BsYXlOYW1lKFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8uc2V0VmFsdWUoZGlhZ3JhbV93cC5nZXRIVE1MKCkpOwotCQkJCQkJLmFkZENoaWxkKGRpYWdyYW1fd3AuZ2V0WG1sRWxlbWVudCgpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWFncmFtRGlzcGxheU5hbWUoU3RyaW5nIHR5cGUpIHsKLQkKLQkJU3RyaW5nIG5hbWUgPSBnZXREaXNwbGF5TmFtZSgpOwotCQlpZiAoIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XT1JLRkxPVy5lcXVhbHModHlwZSkgKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5hY3Rpdml0eURpYWdyYW1OYW1lLCBuYW1lKTsJCQotCQl9IGVsc2UgaWYgKCBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMLmVxdWFscyh0eXBlKSApIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLmFjdGl2aXR5RGV0YWlsRGlhZ3JhbU5hbWUsIG5hbWUpOwkJCi0JCX0gZWxzZSBpZiAoIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZLmVxdWFscyh0eXBlKSApIHsKLQkJCXJldHVybiBOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLndwRGVwZW5kZW5jeURpYWdyYW1OYW1lLCBuYW1lKTsJCQotCQl9IGVsc2UgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0vLwlwcml2YXRlIERpYWdyYW1JbmZvIGdlbmVyYXRlRGlhZ3JhbShTdXBwcmVzc2lvbiBzdXAsIFN0cmluZyBkaWFncmFtVHlwZSwgU3RyaW5nIGltZ0ZpbGUpIHsKLS8vCQkKLS8vLy8JCWlmICggIl9vM25ab1NGckVkcXJYOFlWenZ0bElnLF9qaW4yb0NHR0VkcU1jb3ZSemtDUW93Ii5lcXVhbHMoc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKSApIHsKLS8vLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oInh4Iik7Ci0vLy8vCQl9Ci0vLwkJCi0vLwkJRGlhZ3JhbUluZm8gaW5mbyA9IG51bGw7Ci0vLwkJRWxlbWVudExheW91dE1hbmFnZXIgbWdyID0gZ2V0TGF5b3V0TWdyKCk7Ci0vLwkJaWYgKG1nciAhPSBudWxsKSB7Ci0vLwkJCWluZm8gPSBtZ3IuZ2V0Q2FjaGVkRGlhZ3JhbUluZm8oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7Ci0vLwkJCWlmIChpbmZvICE9IG51bGwpIHsKLS8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiKioqIGRpYWdyYW0gZ2VuZXJhdGVkOiAiICsgaW5mby5wYXRoICsgIiwgIGZpbGUgbmFtZTogIiArIGltZ0ZpbGUpOwotLy8KLS8vCQkJCXJldHVybiBpbmZvOwotLy8JCQl9Ci0vLwkJfQotLy8JCWluZm8gPSBnZW5lcmF0ZURpYWdyYW1fKHN1cCwgZGlhZ3JhbVR5cGUsIGltZ0ZpbGUpOwotLy8JCWlmICggaW5mbyAhPSBudWxsICkgewotLy8JCQlpbmZvLnBhdGggPSBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGg7Ci0vLwkJfQotLy8JCQotLy8JCWlmIChtZ3IgIT0gbnVsbCkgewotLy8JCQltZ3IuYWRkQ2FjaGVkRGlhZ3JhbUluZm8oaW5mbywgc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7Ci0vLwkJfQotLy8JCXJldHVybiBpbmZvOwotLy8JfQotCQotCXByaXZhdGUgRGlhZ3JhbUluZm8gZ2VuZXJhdGVEaWFncmFtKFN1cHByZXNzaW9uIHN1cCwgU3RyaW5nIGRpYWdyYW1UeXBlLCBTdHJpbmcgaW1nRmlsZSkKLQl7Ci0JCVRpbWVyIHRpbWVyID0gbnVsbDsKLQkJaWYgKGRlYnVnICl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUQVJUOiBnZW5lcmF0aW5nIGRpYWdyYW0gIiArIGltZ0ZpbGUpOwotCQkJdGltZXIgPSBuZXcgVGltZXIoKTsJCQkKLQkJfQotCQkvLyBnZW5lcmF0ZSBkaWFncmFtCi0JCS8vIHNob3cgdGhlIGFjdGl2aXR5IGRpYWdyYW1zCi0JCUlBY3Rpdml0eURpYWdyYW1TZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRBY3Rpdml0eURpYWdyYW1TZXJ2aWNlKCk7Ci0JCURpYWdyYW1JbmZvIGRpYWdyYW0gPSBudWxsOwotCQlpZiAoZGlhZ3JhbVNlcnZpY2UgIT0gbnVsbCkgewotCQkJSUZpbHRlciBmaWx0ZXIgPSBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpLmdldEZpbHRlcigpOwotCQkJCi0JCQkvLyBnZXQgdGhlIHdyYXBwZXIgZnJvbSB0aGUgV0JTIGFkYXB0ZXIgZmFjdG9yeQotCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpKTsKLQkJCQotCQkJLy8gU2V0IHRoZSBwdWJsaXNoaW5nIG1vZGUKLQkJCWJvb2xlYW4gcHVibGlzaGluZ21vZGUgPSBMaWJyYXJ5VXRpbC5QVUJMSVNIX01PREU7Ci0JCQlMaWJyYXJ5VXRpbC5QVUJMSVNIX01PREUgPSB0cnVlOwotCi0JCQlkaWFncmFtID0gZGlhZ3JhbVNlcnZpY2Uuc2F2ZURpYWdyYW0od3JhcHBlciwKLQkJCQkJaW1nRmlsZSwKLQkJCQkJZGlhZ3JhbVR5cGUsIGZpbHRlciwgc3VwKTsKLQkJCQotCQkJLy8gc2V0IGJhY2sgdG8gCi0JCQlMaWJyYXJ5VXRpbC5QVUJMSVNIX01PREUgPSBwdWJsaXNoaW5nbW9kZTsKLQkJfQotCi0JCWlmICggdGltZXIgIT0gbnVsbCApewotCQkJdGltZXIuc3RvcCgpOwkKLQkJCVN0cmluZyBtc2cgPSB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBnZW5lcmF0aW5nICIgKyBkaWFncmFtVHlwZSArICIgZGlhZ3JhbSIgIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVORDogZ2VuZXJhdGluZyBkaWFncmFtICIgKyBpbWdGaWxlKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRpYWdyYW07Ci0KLQl9Ci0JCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIGdldFJlYWxpemVkVUREKFN1cHByZXNzaW9uIHN1cCwgU3RyaW5nIGRpYWdyYW1UeXBlKQotCXsKLQkJLy8gZ2VuZXJhdGUgZGlhZ3JhbQotCQkvLyBzaG93IHRoZSBhY3Rpdml0eSBkaWFncmFtcwotCQlJQWN0aXZpdHlEaWFncmFtU2VydmljZSBkaWFncmFtU2VydmljZSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0QWN0aXZpdHlEaWFncmFtU2VydmljZSgpOwotCQlpZiAoZGlhZ3JhbVNlcnZpY2UgIT0gbnVsbCkgewotCQkJSUZpbHRlciBmaWx0ZXIgPSBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpLmdldEZpbHRlcigpOwotCQkJCi0JCQkvLyBnZXQgdGhlIHdyYXBwZXIgZnJvbSB0aGUgV0JTIGFkYXB0ZXIgZmFjdG9yeQotCQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBsYXlvdXRNYW5hZ2VyLmdldERpYWdyYW1BZGFwdGVyRmFjdG9yeSgpKTsKLQotCQkJT2JqZWN0IHJlYWxpemVkID0gZGlhZ3JhbVNlcnZpY2UuZ2V0UmVhbGl6ZWRGb3JVbm1vZGlmaWVkKHdyYXBwZXIsIGZpbHRlciwgc3VwKTsKLQkJCQotCQkJaWYocmVhbGl6ZWQgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwudXRpbC5EaWFncmFtSW5mbyB1ZGRJbmZvID0gbmV3IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuRGlhZ3JhbUluZm8oCi0JCQkJCQkoQWN0aXZpdHkpcmVhbGl6ZWQpOwotCQkJCWlmKHVkZEluZm8uY2FuUHVibGlzaEFESW1hZ2UoKSl7Ci0JCQkJCXJldHVybiB1ZGRJbmZvOyAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFRCUyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIlRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGNvbHVtbnMKLQkJc2V0Q29sdW1ucyhicywgUHJlZmVyZW5jZVV0aWwuZ2V0VEJTQ29sdW1ucygpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlci5nZXRUQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlDb21wb3NpdGVSb2xlcyBjcnMgPSBudWxsOyAvL25ldyBDb21wb3NpdGVSb2xlcyhhZGFwdGVyRmFjdG9yeSwgKEFjdGl2aXR5KSBzdXBlci5lbGVtZW50KTsKLQkJCi0JCS8vIHJvb2x1cCB0aGUgbGF5b3V0Ci0JCUlCU0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCXN1cGVyLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCi0JCS8vIGNvbGxlY3QgYWxsIFJvbGVEZXNjcmlwdG9ycyBiZWZvcmUgcm9sbHVwCi0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKGZhbHNlKTsKLQkJaXRlbURldGFpbC5pdGVyYXRlKGFkYXB0ZXJGYWN0b3J5LCB3cmFwcGVyKTsKLQotCQlwcm92aWRlci5zZXRSb2xsZWRVcCh0cnVlKTsJCQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQkJc2V0dGluZy5yb2xsdXBSb2xlcyA9IHRydWU7Ci0JCXNldHRpbmcuZXNjYXBlU3RyaW5nID0gdHJ1ZTsKLQotCQlpdGVyYXRlKGVsZW1lbnRJdGVtLCBicywgc2V0dGluZyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFdQQlMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQlYbWxFbGVtZW50IGJzID0gZWxlbWVudFhtbAotCQkubmV3Q2hpbGQoImJyZWFrZG93biIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZ2V0RGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGNvbHVtbnMKLQkJc2V0Q29sdW1ucyhicywgUHJlZmVyZW5jZVV0aWwuZ2V0V1BCU0NvbHVtbnMoKSk7Ci0KLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCQkKLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoc3VwZXIuZWxlbWVudCwKLQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlwcm92aWRlci5zZXRSb2xsZWRVcCh0cnVlKTsKLQkJCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZyhhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCQlzZXR0aW5nLmVzY2FwZVN0cmluZyA9IHRydWU7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGUoZWxlbWVudEl0ZW0sIGJzLCBzZXR0aW5nKTsKLQotCX0KLQotCS8qKgotCSAqIGl0ZXJhdGUgdGhlIGJyZWFrIGRvd24gc3RydWN0dXJlIGFuZCBidWlsZCB0aGUgeG1sIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudEl0ZW0KLQkgKiAgICAgICAgICAgIFRoZSBvYmplY3QgdG8gaXRlcmF0ZS4gSXQgY2FuIGJlIGEgYnJlYWtkb3duIGVsZW1lbnQsIG9yIGl0J3MKLQkgKiAgICAgICAgICAgIGFkYXB0b3IKLQkgKiBAcGFyYW0gcGFyZW50WG1sCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGl0ZXJhdGUoUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudEl0ZW0sIFhtbEVsZW1lbnQgcGFyZW50WG1sLAotCQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcpIHsKLQkJaXRlcmF0ZShwYXJlbnRJdGVtLCBwYXJlbnRYbWwsIHNldHRpbmcsIDApOwotCX0KLQkKLQkvLyBsZXZlbCB0byBleHBhbmQgYWxsIEJXUyBhY3Rpdml0aWVzIHRvLCAwIGZvciB0aGUgZmlyc3QgbGV2ZWwKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfU0hPV19MRVZFTCA9IDE7Ci0JCi0JLyoqCi0JICogaXRlcmF0ZSB0aGUgYnJlYWsgZG93biBzdHJ1Y3R1cmUgYW5kIGJ1aWxkIHRoZSB4bWwgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50SXRlbQotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBpdGVyYXRlLiBJdCBjYW4gYmUgYSBicmVha2Rvd24gZWxlbWVudCwgb3IgaXQncwotCSAqICAgICAgICAgICAgYWRhcHRvcgotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShQcm9jZXNzRWxlbWVudEl0ZW0gcGFyZW50SXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZywgaW50IGFjdExldmVsKSB7Ci0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCU9iamVjdCBwYXJlbnRPYmogPSBwYXJlbnRJdGVtLnJhd0l0ZW07Ci0JCQkKLQkJVGltZXIgdGltZXIgPSBudWxsOwotCQlpZiAoZGVidWcgKXsKLQkJCXRpbWVyID0gbmV3IFRpbWVyKCk7CQkJCi0JCX0KLQkJCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZXR0aW5nLmFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0vLwkJCVN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShwYXJlbnRPYmosCi0vLwkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgcHJvdmlkZXIpOwotLy8JCQlwYXJlbnRYbWwuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGRpc3BsYXlOYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvL0xpc3QgdW5pcXVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihwYXJlbnRPYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsKLQotCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbAotCQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQotCQkJCWlmICggc2V0dGluZy5zaG93VGFza09ubHkgJiYgKGFjdExldmVsID4gQUNUSVZJVFlfU0hPV19MRVZFTCkKLQkJCQkJCSYmICEoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5IHx8IGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICggaXRlbSA9PSBudWxsICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gYWRkIHRoZSBlbGVtZW50IHRvIHRoZSByZWZlcmVuY2UgbGlzdCwgCi0JCQkJLy8gdGhpcyBpcyBmb3IgcHVibGlzaGluZyBvbmx5LCBmb3IgYnJvd3NpbmcsIHRoaXMgY2FsbCBkb2VzIG5vdGhpbmcKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChzdXBlci5lbGVtZW50LCBpdGVtKTsKLQkJCQkKLQkJCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHJhd2l0ZW0sIGl0ZW0sIHBhcmVudEl0ZW0pOwotCi0JCQkJLy8gUHJvY2VzcyBQdWJsaXNoaW5nOiBSZXBsYWNlIHJvbGUgZGVzY3JpcHRvcgotCQkJCS8vIHdpdGggY29tcG9zaXRlIHJvbGUKLQkJCQkvLyBpZiBpdCBjb250YWlucyB0aGUgcm9sZSBkZXNjcmlwdG9yIGR1cmluZyBwcmV2aWV3L3B1Ymxpc2hpbmcKLQkJCQkvLyBzbyBpZiB0aGlzIGd1eSBpcyBhIFJvbGVEZXNjcnB0b3IsIGZpbmQgdGhlIGNvbXBvc2l0ZSByb2xlCi0JCQkJLy8gZGVzY3JpcHRvciB3aXRoaW4gdGhlIHNjb3BlCi0JCQkJLy8gCi0JCQkJaWYgKChwYXJlbnRPYmogaW5zdGFuY2VvZiBBY3Rpdml0eSAmJiBzZXR0aW5nLmNycyAhPSBudWxsKQotCQkJCQkJJiYgKGl0ZW0gaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikpIHsKLQkJCQkJQ29tcG9zaXRlUm9sZSBjciA9IHNldHRpbmcuY3JzLmdldENvbXBvc2l0ZVJvbGUoCi0JCQkJCQkJKEFjdGl2aXR5KSBwYXJlbnRPYmosIChSb2xlRGVzY3JpcHRvcikgaXRlbSk7Ci0JCQkJCWlmIChjciAhPSBudWxsKSB7Ci0JCQkJCQlpdGVtID0gY3I7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlYbWxFbGVtZW50IGNoaWxkID0gZ2VuZXJhdGVDaGlsZFhtbChlbGVtZW50SXRlbSwgcGFyZW50WG1sLCBzZXR0aW5nKTsKLQkJCQkJCi0JCQkJcGFyZW50WG1sLmFkZENoaWxkKGNoaWxkKTsKLQkJCQkJCQkJCQotCQkJCS8vIHNob3cgb25seSB0YXNrIHRhc2sgZGVzY3JpcHRvcnMgZm9yIHN1YiBhY3Rpdml0aWVzIGluIHRoZSB0YnMgbGF5b3V0Ci0JCQkJaWYgKCBzZXR0aW5nLnNob3dUYXNrT25seSAmJiAoYWN0TGV2ZWwgPiBBQ1RJVklUWV9TSE9XX0xFVkVMKSAmJiAhKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSApKSB7Ci0JCQkJCS8vIGlmIGFjdCBsZXZlbCA+IDAsIG9ubHkgaXRlcmF0ZSB0aGUgc3ViLWFjdGl2aXRpZXMKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIGluZXRlcmF0ZSBjaGlsZHJlbiwgbm90IGp1c3QgYWN0aXZpdHksIGFueSBjaGlsZCBpbiB0aGUKLQkJCQkvLyByYXdpdGVtIHNob3VsZCBiZSBpdGVyYXRlZCwKLQkJCQkvLyBzdWNoIGFzIHRoZSBzdWItYXJ0aWZhY3RzCi0JCQkJaXRlcmF0ZShlbGVtZW50SXRlbSwgY2hpbGQsIHNldHRpbmcsIAotCQkJCQkJKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgPyBhY3RMZXZlbCsxIDogYWN0TGV2ZWwpOwkJCQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCB0aW1lciAhPSBudWxsICkgewotCQkJdGltZXIuc3RvcCgpOwkKLQkJCWlmICh0aW1lci5nZXRUaW1lKCkgPiAxMDApIHsKLQkJCQlTdHJpbmcgbXNnID0gdGltZXIuZ2V0VGltZSgpICsgIiBtaW5pIHNlY29uZHMgaXRlcmF0aW5nIGJyZWFrZG93biBpdGVtICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShwYXJlbnRJdGVtLmVsZW1lbnQpICA7IC8vJE5PTi1OTFMtMSQgCQkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgWG1sRWxlbWVudCBnZW5lcmF0ZUNoaWxkWG1sKFByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSwgWG1sRWxlbWVudCBwYXJlbnRYbWwsCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZykKLQl7Ci0JCVRpbWVyIHRpbWVyID0gbnVsbDsKLQkJaWYgKGRlYnVnICl7Ci0JCQl0aW1lciA9IG5ldyBUaW1lcigpOwkJCQotCQl9Ci0JCQotCQlNZXRob2RFbGVtZW50IGl0ZW0gPSBlbGVtZW50SXRlbS5lbGVtZW50OwotCQkKLQkJSUVsZW1lbnRMYXlvdXQgbCA9IGdldExheW91dChlbGVtZW50SXRlbSk7Ci0JCi0JCS8vIGxhdCB0aGUgcHJlc2VudGF0aW9uIHRvIGRldGVybWluZSB3aGVuIHRvIHNob3cKLQkJLy8gc2V0IGdlbmVyYXRlIHRoZSBmbGFnIGZvciBicm93c2luZwotCQlib29sZWFuIGlzU3VwcmVzc2VkID0gc2V0dGluZy5zdXAuaXNTdXBwcmVzc2VkKGVsZW1lbnRJdGVtLnJhd0l0ZW0pOwotCQlpZiAoIGlzU3VwcmVzc2VkICkgewotCQkJaXRlbURldGFpbC5hZGRTdXBwcmVzc2VkKGVsZW1lbnRJdGVtLmVsZW1lbnQpOwotCQl9Ci0JCQotCQlYbWxFbGVtZW50IGNoaWxkID0gbC5nZXRYbWxFbGVtZW50KGZhbHNlKTsKLQotCQkvLyB3ZSBzdGlsbCBnZW5lcmF0ZSB0aGUgaXRlbSBldmVuIHRob3VnaCBpdCdzIHN1cHByZXNzZWQsIAotCQkvLyBsZXQgdGhlIGxheW91dCBqYXZhc2NyaXB0IHRvIGhhbmRsZSB0aGUgc2hvdyBvciBoaWRlCi0JCS8vIHNldCB0aGUgaXNTdXByZXNzZWQgZmxhZyBmb3IgYnJvd3NpbmcgbW9kZWwgb25seSwKLQkJLy8gZm9yIHB1Ymxpc2hpbmcsIHRoZSBmbGFnIHdpbGwgYmUgZ2VlbnJhdGVkIGFuZCBzYXZlZCBpbiBhIHNlcGVyYXRlZCBqcyBmaWxlCi0JCS8vIHB1Ymxpc2hlZCBodG1sIHBhZ2VzIHdpbGwgZ2V0IHRoZSBpc1N1cHJlc3NlZCBmbGFnIHZpYSBqYXZhc2NyaXB0IG1ldGhvZC4KLQkJaWYgKCAhZ2V0TGF5b3V0TWdyKCkuaXNQdWJsaXNoaW5nTW9kZSgpICkKLQkJewotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJpc1N1cHJlc3NlZCIsIChpc1N1cHJlc3NlZCA/ICJ0cnVlIiA6ICJmYWxzZSIpICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJCi0JCUlCU0l0ZW1Qcm92aWRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRJdGVtLnJhd0l0ZW0gaW5zdGFuY2VvZiBJQlNJdGVtUHJvdmlkZXIpIHsKLQkJCWFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBlbGVtZW50SXRlbS5yYXdJdGVtOwotCQl9IGVsc2UgewotCQkJYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIHNldHRpbmcuYWRhcHRlckZhY3RvcnkKLQkJCQkJLmFkYXB0KGVsZW1lbnRJdGVtLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQk7Ci0JCX0KLQotCQkvLyBnZXQgdGhlIGluZGV4IGFuZCBwcmVkZWNlc3NvciBpbmRlY2VzCi0JCWlmIChlbGVtZW50SXRlbS5lbGVtZW50IGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJU3RyaW5nIGluZGV4ID0gZ2V0SW5kZXgoYWRhcHRlcik7Ci0JCQkKLQkJCVN0cmluZyBtb2RlbEluZm8gPSBudWxsOwkJCQotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIpIHsKLQkJCQlDb21wb3NlZFdQRGVzY3JpcHRvcldyYXBwZXJJdGVtUHJvdmlkZXIgcHJvdmlkZXIgPSAoQ29tcG9zZWRXUERlc2NyaXB0b3JXcmFwcGVySXRlbVByb3ZpZGVyKSBhZGFwdGVyOwotCQkJCW1vZGVsSW5mbyA9IHByb3ZpZGVyLmdldEF0dHJpYnV0ZShpdGVtLCBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8pOwotCQkJfSBlbHNlIHsKLQkJCQltb2RlbEluZm8gPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfTU9ERUxfSU5GTywgYWRhcHRlcik7Ci0JCQl9CQkJCi0JCQkKLQkJCVN0cmluZyB0ZWFtID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMsIGFkYXB0ZXIpOwotCQkJU3RyaW5nIHByZWZpeCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwgYWRhcHRlcik7CQkJCi0JCQlTdHJpbmcgaXNFdmVudERyaXZlbiA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPbmdvaW5nID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT05HT0lORywgYWRhcHRlcik7Ci0JCQlTdHJpbmcgaXNPcHRpb25hbCA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1BsYW5uZWQgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19QTEFOTkVELCBhZGFwdGVyKTsKLQkJCVN0cmluZyBpc1JlcGVhdGFibGUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19SRVBFQVRBQkxFLCBhZGFwdGVyKTsKLQkJCVN0cmluZyBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gUHJvY2Vzc1V0aWwKLQkJCQkJLmdldEF0dHJpYnV0ZSgKLQkJCQkJCQlpdGVtLAotCQkJCQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQkJCWFkYXB0ZXIpOwotCQkJCi0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBQcm9jZXNzVXRpbC5nZXRBdHRyaWJ1dGUoaXRlbSwKLQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgYWRhcHRlcik7Ci0JCQkKLQkJCVN0cmluZyBtTmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShpdGVtLAotCQkJCQlJQlNJdGVtUHJvdmlkZXIuQ09MX05BTUUsIGFkYXB0ZXIpOwotCi0JCQkvLyBmb3IgV0JTIGxheW91dCB3ZSBwdXQgdGhlIHN0cmluZyBpbnRvIGphdmFzY3JpcHQgdmFyaWFibGVzCi0JCQkvLyBzbyBuZWVkIHRvIGVzY2FwZSB0aGUgcXVvdGVzICIgYW5kICcKLQkJCWlmICggc2V0dGluZy5lc2NhcGVTdHJpbmcgKQotCQkJewotCQkJCW1vZGVsSW5mbyA9IFN0clV0aWwuZXNjYXBlKG1vZGVsSW5mbyk7Ci0JCQkJZGlzcGxheU5hbWUgPSBYTUxVdGlsLmVzY2FwZShkaXNwbGF5TmFtZSk7Ci0JCQkJbU5hbWUgPSBYTUxVdGlsLmVzY2FwZShtTmFtZSk7Ci0JCQkJCi0JCQkJLy8gYW5kIHRoZSB1cmwKLQkJCQkvLyBuZWVkIGFuIGVzY2FwZWQgdXJsIGZvciBqYXZhc2NyaXB0Ci0JCQkJU3RyaW5nIGpzRXNjYXBlZFVybCA9IFN0clV0aWwuZXNjYXBlKGwuZ2V0VXJsKCkpOwotCQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiVXJsIiwganNFc2NhcGVkVXJsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl9Ci0JCQkKLQkJCWNoaWxkLnNldEF0dHJpYnV0ZSgiSW5kZXgiLCBpbmRleCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJNb2RlbEluZm8iLCBtb2RlbEluZm8pIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiVGVhbSIsIHRlYW0pOyAvLyROT04tTkxTLTEkCi0KLQkJCWNoaWxkLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAicHJlZml4Iikuc2V0VmFsdWUocHJlZml4KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNFdmVudERyaXZlbiIpLnNldFZhbHVlKGlzRXZlbnREcml2ZW4pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzT25nb2luZyIpLnNldFZhbHVlKGlzT25nb2luZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNPcHRpb25hbCIpLnNldFZhbHVlKGlzT3B0aW9uYWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAKLQkJCWNoaWxkCi0JCQkJCS5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImlzUGxhbm5lZCIpLnNldFZhbHVlKGlzUGxhbm5lZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJY2hpbGQKLQkJCQkJLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiaXNSZXBlYXRhYmxlIikuc2V0VmFsdWUoaXNSZXBlYXRhYmxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQljaGlsZAotCQkJCQkubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIikuc2V0VmFsdWUoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIkRpc3BsYXlOYW1lIiwgZGlzcGxheU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIk5hbWUiLCBtTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCVN0cmluZyBlbnRyeVN0YXRlID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoaXRlbSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9FTlRSWV9TVEFURSk7Ci0JCQlTdHJpbmcgZXhpdFN0YXRlID0gYWRhcHRlci5nZXRBdHRyaWJ1dGUoaXRlbSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFKTsKLQkJCVN0cmluZyBkZWxpdmVyYWJsZSA9IGFkYXB0ZXIuZ2V0QXR0cmlidXRlKGl0ZW0sIElCU0l0ZW1Qcm92aWRlci5DT0xfREVMSVZFUkFCTEUpOwotCi0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIkVudHJ5U3RhdGUiLCBlbnRyeVN0YXRlKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIkV4aXRTdGF0ZSIsIGV4aXRTdGF0ZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJEZWxpdmVyYWJsZSIsIGRlbGl2ZXJhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBXb3JrQnJlYWtkb3duRWxlbWVudCkgewotCQkJU3RyaW5nIHByZWRlY2Vzc29ycyA9IGdldFByZWRlY2Vzc29ycyhhZGFwdGVyLAotCQkJCQlzZXR0aW5nLnN1cCk7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoIlByZWRlY2Vzc29ycyIsIHByZWRlY2Vzc29ycyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGlmIGl0J3MgYSB0YXNrIGRlc2NyaXB0b3IsIGdldCB0aGUgc3RlcHMKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCi0JCQlYbWxFbGVtZW50IHN0ZXBzWG1sID0gY2hpbGQubmV3Q2hpbGQoIlN0ZXBzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVRhc2tEZXNjcmlwdG9yIHRkID0gKFRhc2tEZXNjcmlwdG9yKSBpdGVtOwotCQkJTGlzdCBzZWxTdGVwcyA9IHRkLmdldFNlbGVjdGVkU3RlcHMoKTsKLQkJCVRhc2sgdCA9IChUYXNrKSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCS5nZXRDYWxjdWxhdGVkRWxlbWVudCh0ZC5nZXRUYXNrKCksCi0JCQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWlmICh0ICE9IG51bGwpIHsKLQkJCQlMaXN0IHN0ZXBzID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCQkuZ2V0VGFza19TdGVwcygpLCBnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RlcHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IHN0ZXAgPSBzdGVwcy5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBzZWxTdGVwcy5jb250YWlucyhzdGVwKTsKLQkJCQkJc3RlcHNYbWwKLQkJCQkJCQkubmV3Q2hpbGQoIlN0ZXAiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJpbmRleCIsIEludGVnZXIudG9TdHJpbmcoaSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkJInNlbGVjdGVkIiwgc2VsZWN0ZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCS8vIGJ1aWxkIHRoZSB0ZWFtIHByb2ZpbGUgdHJlZS4KLQkJLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSByZXBsYWNlbWVudCBmb3IgdGhlIHRlYW0gYnJlYWtkb3duCi0JCS8vIHN0cnVjdHVyZSBkaWFncmFtCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgVGVhbVByb2ZpbGUpIHsKLQkJCVRlYW1Qcm9maWxlIHN1cGVyVGVhbSA9ICgoVGVhbVByb2ZpbGUpaXRlbSkuZ2V0U3VwZXJUZWFtKCk7Ci0JCQljaGlsZC5zZXRBdHRyaWJ1dGUoImhhc1N1cGVyVGVhbSIsIChzdXBlclRlYW0gIT0gbnVsbCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCi0JCS8vIGlmIHJvbGUgcm9sbHVwIGlzIHNldCwgYnVpbGQgdGhlIHJvbGUgc3ViIHRyZWUKLQkJaWYgKHNldHRpbmcucm9sbHVwUm9sZXMgJiYgaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQlidWlsZFJvbGVSb2xsdXAoKFJvbGVEZXNjcmlwdG9yKSBpdGVtLCBjaGlsZCwgc2V0dGluZyk7Ci0JCX0KLQkJCi0JCWlmICggdGltZXIgIT0gbnVsbCApIHsKLQkJCXRpbWVyLnN0b3AoKTsJCi0JCQlpZiAodGltZXIuZ2V0VGltZSgpID4gMTAwKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGdlbmVyYXRpbmcgeG1sIGZvciBicmVha2Rvd24gaXRlbSAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoZWxlbWVudEl0ZW0uZWxlbWVudCkgIDsgLy8kTk9OLU5MUy0xJCAJCQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZFJvbGVSb2xsdXAoUm9sZURlc2NyaXB0b3Igcm9sZUl0ZW0sIFhtbEVsZW1lbnQgcGFyZW50WG1sLAotCQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcpIHsKLQkJUm9sZSByID0gcm9sZUl0ZW0uZ2V0Um9sZSgpOwotCQlMaXN0IGRlc2NyaXB0b3JzID0gaXRlbURldGFpbC5nZXREZXNjcmlwdG9ycyhyKTsKLQkJaWYgKCBkZXNjcmlwdG9ycyA9PSBudWxsICkgewotCQkJZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaWYgKCAhZGVzY3JpcHRvcnMuY29udGFpbnMocm9sZUl0ZW0pICkgewotCQkJZGVzY3JpcHRvcnMuYWRkKHJvbGVJdGVtKTsKLQkJfQotCQkKLQkJTGlzdCByZXNwb25zaWJsZUZvciA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBtb2RpZmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwcmltYXJ5VGFza3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWRkaXRpb25hbFRhc2tzID0gbmV3IEFycmF5TGlzdCgpOwkKLQkJTGlzdCBpdGVtczsKLQkJCi0JCWZvciAoIEl0ZXJhdG9yIGl0ID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCQotCQkJcm9sZUl0ZW0gPSAoUm9sZURlc2NyaXB0b3IpIGl0Lm5leHQoKTsKLQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCXJlc3BvbnNpYmxlRm9yLmFkZEFsbChpdGVtcyk7Ci0JCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpLCBnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQltb2RpZmllcy5hZGRBbGwoaXRlbXMpOwotCQkJCi0JCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJvbGVJdGVtLAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzLAotCQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlwcmltYXJ5VGFza3MuYWRkQWxsKGl0ZW1zKTsKLQkJCQotCQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyb2xlSXRlbSwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycywgCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZGl0aW9uYWxUYXNrcy5hZGRBbGwoaXRlbXMpOwotCQl9Ci0JCQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3BvbnNpYmxlRm9yLCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJY3JlYXRlUm9sZVJvbGx1cE5vZGVzKHBhcmVudFhtbCwgcmVzcG9uc2libGVGb3IsIFRuZ1V0aWwKLQkJCQkuZ2V0RmVhdHVyZVRleHQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSkpOwotCi0JCUNvbGxlY3Rpb25zLnNvcnQobW9kaWZpZXMsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCBtb2RpZmllcywgVG5nVXRpbAotCQkJCS5nZXRGZWF0dXJlVGV4dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpKSk7Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChwcmltYXJ5VGFza3MsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQljcmVhdGVSb2xlUm9sbHVwTm9kZXMocGFyZW50WG1sLCBwcmltYXJ5VGFza3MsIAotCQkJCUxpYnJhcnlSZXNvdXJjZXMuQWN0aXZpdHlMYXlvdXRfcHJpbWFyeVRhc2tzX3RleHQpOyAKLQotCQlDb2xsZWN0aW9ucy5zb3J0KGFkZGl0aW9uYWxUYXNrcywgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCWNyZWF0ZVJvbGVSb2xsdXBOb2RlcyhwYXJlbnRYbWwsIGFkZGl0aW9uYWxUYXNrcywgCi0JCQkJTGlicmFyeVJlc291cmNlcy5BY3Rpdml0eUxheW91dF9hZGRpdGlvbmFsVGFza3NfdGV4dCk7IAotCi0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVSb2xlUm9sbHVwTm9kZXMoWG1sRWxlbWVudCBwYXJlbnRYbWwsIExpc3QgaXRlbXMsCi0JCQlTdHJpbmcgaW5mbykgewotCQkKLQkJLy8gMTYwMTg4IC0gUHVibGlzaGVkIFRlYW0gQWxsb2NhdGlvbiB0YWIgc2hvd3MgcmVkdW5kYW50IGluZm9ybWF0aW9uCi0JCS8vIG9ubHkgc2hvdyBvbmUgZGVzY3JpcHRvciBpZiBtb3JlIHRoYW4gb25lIGFyZSBsaW5rZWQgdG8gdGhlIHNhbWUgdGFzayBvciB3cC4KLQkJLy8gc28ga2VlcCB0aGUgcHJvY2Vzc2VkIHRhc2sgYW5kIHdwIGluc3RlYWQgb2YgdGhlIGRlc2NyaXB0b3JzCi0JCUxpc3QgcHJvY2Vzc2VkID0gbmV3IEFycmF5TGlzdCgpOwotCQlNZXRob2RFbGVtZW50IGxpbmtlZCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJbGlua2VkID0gbnVsbDsKLQkJCWlmICggZSBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yICkgewotCQkJCWxpbmtlZCA9ICgoVGFza0Rlc2NyaXB0b3IpZSkuZ2V0VGFzaygpOwotCQkJfSBlbHNlIGlmICggZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciApIHsKLQkJCQlsaW5rZWQgPSAoKFdvcmtQcm9kdWN0RGVzY3JpcHRvcillKS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJfQotCQkJaWYgKCBsaW5rZWQgPT0gbnVsbCApIHsKLQkJCQlsaW5rZWQgPSBlOwotCQkJfQotCQkJCi0JCQlpZiAoIHByb2Nlc3NlZC5jb250YWlucyhsaW5rZWQpICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlwcm9jZXNzZWQuYWRkKGxpbmtlZCk7Ci0JCQkKLQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChlLCB0cnVlKTsKLQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJY2hpbGQuc2V0QXR0cmlidXRlKCJNb2RlbEluZm8iLCBpbmZvKTsgLy8kTk9OLU5MUy0xJAotCQkJcGFyZW50WG1sLmFkZENoaWxkKGNoaWxkKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRleChJQlNJdGVtUHJvdmlkZXIgYWRhcHRlcikgewotCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQoZSwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTs7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGFkYXB0ZXIuZ2V0SWQoKTsKLQkJCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gSW50ZWdlci50b1N0cmluZyhpbmRleCk7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVkZWNlc3NvcnMoSUJTSXRlbVByb3ZpZGVyIGFkYXB0ZXIsIFN1cHByZXNzaW9uIHN1cCkgewotCQkvLyBJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGZhY3RvcnkuYWRhcHQoZSwKLQkJLy8gSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTs7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVByZWRlY2Vzc29yTGlzdCBsaXN0ID0gYWRhcHRlci5nZXRQcmVkZWNlc3NvcnMoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbGlzdC50b1VuU3VwcHJlc3NlZFN0cmluZyhzdXAsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVzIHsKLQkJLy8gYSBtYXAgb2YgYWN0aXZpdHkgdG8gQ29tcG9zaXRlUm9sZUluZm8KLQkJTWFwIGl0ZW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXB1YmxpYyBDb21wb3NpdGVSb2xlcyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUFjdGl2aXR5IGFjdCkgewotCQkJc2NhbihhZGFwdGVyRmFjdG9yeSwgbnVsbCwgYWN0KTsKLQkJfQotCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZUluZm8gZ2V0Q29tcG9zaXRlUm9sZUluZm8oQWN0aXZpdHkgcGFyZW50LAotCQkJCUFjdGl2aXR5IGFjdCkgewotCQkJQ29tcG9zaXRlUm9sZUluZm8gaW5mbyA9IChDb21wb3NpdGVSb2xlSW5mbykgaXRlbU1hcC5nZXQoYWN0KTsKLQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQlpbmZvID0gbmV3IENvbXBvc2l0ZVJvbGVJbmZvKHBhcmVudCwgYWN0KTsKLQkJCQlpdGVtTWFwLnB1dChhY3QsIGluZm8pOwotCQkJfQotCi0JCQlyZXR1cm4gaW5mbzsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzY2FuKENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQkJQWN0aXZpdHkgcGFyZW50LCBBY3Rpdml0eSBhY3QpIHsKLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJCS5hZGFwdChhY3QsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCUNvbGxlY3Rpb24gaXRlbXMgPSBwcm92aWRlci5nZXRDaGlsZHJlbihhY3QpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgaXRlbSA9IChNZXRob2RFbGVtZW50KSBMaWJyYXJ5VXRpbC51bndyYXAoaXQKLQkJCQkJCQkubmV4dCgpKTsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBDb21wb3NpdGVSb2xlKSB7Ci0JCQkJCQlnZXRDb21wb3NpdGVSb2xlSW5mbyhwYXJlbnQsIGFjdCkuYWRkQ29tcG9zaXRlUm9sZSgKLQkJCQkJCQkJKENvbXBvc2l0ZVJvbGUpIGl0ZW0pOwotCQkJCQl9IGVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpdml0eSkgewotCQkJCQkJc2NhbihhZGFwdGVyRmFjdG9yeSwgYWN0LCAoQWN0aXZpdHkpIGl0ZW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIGZpbmQgdGhlIGNvbXBvc2l0ZSByb2xlIGZvciB0aGUgcm9sZSBkZXNjcmlwdG9yIGZyb20gdGhlIGFjdGl2aXR5IGFuZAotCQkgKiBpdCdzIHBhcmVudHMsIHJldHVybiBudWxsIGlmIG5vdCBmb3VuZAotCQkgKiAKLQkJICogQHBhcmFtIGFjdGl2aXR5Ci0JCSAqIEBwYXJhbSBpdGVtCi0JCSAqIEByZXR1cm4gUm9sZURlc2NyaXB0b3IKLQkJICovCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZSBnZXRDb21wb3NpdGVSb2xlKEFjdGl2aXR5IGFjdGl2aXR5LAotCQkJCVJvbGVEZXNjcmlwdG9yIGl0ZW0pIHsKLQkJCS8vIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBlbGVtZW50cywKLQkJCS8vIGlmIHRoZXJlIGlzIGEgY29tcG9zaXRlIHJvbGUgdGhhdCBjb250YWlucyB0aGUgcm9sZSwgcmV0dXJuIHRoZQotCQkJLy8gY29tcG9zaXRlLAotCQkJLy8gaWYgbm90LCBmaW5kIGluIHRoZSBwYXJlbnQgYWN0aXZpdHkKLQotCQkJaWYgKGFjdGl2aXR5ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQ29tcG9zaXRlUm9sZSBkZXNjID0gbnVsbDsKLQkJCUNvbXBvc2l0ZVJvbGVJbmZvIGluZm8gPSAoQ29tcG9zaXRlUm9sZUluZm8pIGl0ZW1NYXAuZ2V0KGFjdGl2aXR5KTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlkZXNjID0gaW5mby5nZXRDb21wb3NpdGVSb2xlKGl0ZW0pOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlc2M7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGdldENvbXBvc2l0ZVJvbGUoaW5mby5nZXRQYXJlbnRBY3Rpdml0eSgpLCBpdGVtKTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUluZm8gewotCQlBY3Rpdml0eSBwYXJlbnQ7Ci0KLQkJQWN0aXZpdHkgb3duZXI7Ci0KLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29tcG9zaXRlUm9sZUluZm8oQWN0aXZpdHkgcGFyZW50LCBBY3Rpdml0eSBvd25lcikgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIGUpIHsKLQkJCWlmICghaXRlbXMuY29udGFpbnMoZSkpIHsKLQkJCQlpdGVtcy5hZGQoZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIEFjdGl2aXR5IGdldFBhcmVudEFjdGl2aXR5KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXByaXZhdGUgQ29tcG9zaXRlUm9sZSBnZXRDb21wb3NpdGVSb2xlKFJvbGVEZXNjcmlwdG9yIGl0ZW0pIHsKLQkJCWlmIChpdGVtcy5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlSb2xlIHIgPSBpdGVtLmdldFJvbGUoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29tcG9zaXRlUm9sZSBjciA9IChDb21wb3NpdGVSb2xlKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGNyLmdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNvbnRhaW5zKHIpKSB7Ci0JCQkJCXJldHVybiBjcjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIEFjdGl2aXR5TGF5b3V0U2V0dGluZyB7Ci0JCXB1YmxpYyBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JCXB1YmxpYyBDb21wb3NpdGVSb2xlcyBjcnM7Ci0KLQkJcHVibGljIFN1cHByZXNzaW9uIHN1cDsKLQotCQlib29sZWFuIHJvbGx1cFJvbGVzID0gZmFsc2U7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXNjYXBlU3RyaW5nID0gZmFsc2U7Ci0JCQotCQkvLyBzZXQgdG8gc2hvdyB0YXNrIG9ubHkgZm9yIHN1YiBhY3Rpdml0aWVzCi0JCS8vIHRoaXMgb25seSBhcHBseSB0byBDQlMgbGF5b3V0Ci0JCXB1YmxpYyBib29sZWFuIHNob3dUYXNrT25seSA9IGZhbHNlOwotCQkKLQkJcHVibGljIEFjdGl2aXR5TGF5b3V0U2V0dGluZyhDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJCUNvbXBvc2l0ZVJvbGVzIGNycywgU3VwcHJlc3Npb24gc3VwKSB7Ci0JCQl0aGlzLmFkYXB0ZXJGYWN0b3J5ID0gYWRhcHRlckZhY3Rvcnk7Ci0JCQl0aGlzLmNycyA9IGNyczsKLQkJCXRoaXMuc3VwID0gc3VwOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVEJTSXRlbURldGFpbCB7Ci0JCQotCQkvLyByZWNvcmQgdGhlIHN1cHByZXNzZWQgaXRlbXMKLQkJTGlzdCBzdXBwcmVzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBtYXAgb2Ygcm9sZSB0byByb2xlIGRlc2NyaXB0b3JzCi0JCU1hcCByb2xlRGVzY3JpcHRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQlwdWJsaWMgVEJTSXRlbURldGFpbCgpIHsKLQkJCQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRTdXBwcmVzc2VkKE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAoICFzdXBwcmVzc2VkSXRlbXMuY29udGFpbnMoaXRlbSkgKSB7Ci0JCQkJc3VwcHJlc3NlZEl0ZW1zLmFkZChpdGVtKTsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIHZvaWQgaXRlcmF0ZShDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3QgcGFyZW50T2JqKSB7Ci0JCQotCQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkJCi0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7Ci0KLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwudW53cmFwKHJhd2l0ZW0pOwotCQkJCWlmICggaXRlbSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yICkgewotCQkJCQlhZGRSb2xlRGVzY3JpcHRvciggKFJvbGVEZXNjcmlwdG9yKWl0ZW0gKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpdGVyYXRlKGFkYXB0ZXJGYWN0b3J5LCByYXdpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlwcml2YXRlIHZvaWQgYWRkUm9sZURlc2NyaXB0b3IoUm9sZURlc2NyaXB0b3IgcmRlc2MpIHsKLQkJCVJvbGUgciA9IHJkZXNjLmdldFJvbGUoKTsKLQkJCWlmIChyICE9IG51bGwgKSB7Ci0JCQkJTGlzdCBpdGVtcyA9IChMaXN0KXJvbGVEZXNjcmlwdG9yTWFwLmdldChyKTsKLQkJCQlpZiAoIGl0ZW1zID09IG51bGwgKSB7Ci0JCQkJCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlyb2xlRGVzY3JpcHRvck1hcC5wdXQociwgaXRlbXMpOwotCQkJCQlpZiAoZGVidWcgKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGVkIFJvbGVEZXNjcmlwdG9yICIgKyByZGVzYy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJaWYgKCAhaXRlbXMuY29udGFpbnMocmRlc2MpICkgewotCQkJCQlpdGVtcy5hZGQocmRlc2MpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RGVzY3JpcHRvcnMoUm9sZSByKSB7Ci0JCQlyZXR1cm4gKExpc3Qpcm9sZURlc2NyaXB0b3JNYXAuZ2V0KHIpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIGxvYWQgdGhlIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgZm9yIHB1Ymxpc2hpbmcuCi0JICogYnJvd3NpbmcgZG9lcyBub3QgbmVlZCB0aGlzIHNpbmNlIGl0J3MgZ2VuZXJhdGVkIG9uIHRoZSBmbHkKLQkgKiBAcGFyYW0gcHJvY19kYXRhCi0JICovCi0JcHVibGljIHZvaWQgbG9hZExheW91dERhdGEoUHJvY2Vzc0xheW91dERhdGEgcHJvY19kYXRhLCBib29sZWFuIGxvYWRXYnMsIGJvb2xlYW4gbG9hZFRicywgYm9vbGVhbiBsb2FkV3BicykKLQl7Ci0JCVRpbWVyIHQgPSBuZXcgVGltZXIoKTsJCQotCi0JCUFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSA9IHByb2NfZGF0YS5jcmVhdGVBY3Rpdml0eUxhdW91dERhdGEodGhpcy5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQkKLQkJLy8gaXRlcmF0ZSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgY29sbGVjdCB0aGUgaW5mby4KLQkJUHJvY2VzcyBwcm9jID0gZ2V0T3duaW5nUHJvY2VzcygpOwotCQlpZiAoIHByb2MgPT0gdGhpcy5lbGVtZW50ICkgewotCQkJc3VwQ291bnQgPSAwOwotCQl9Ci0JCQotCQkvLyBuZWVkIHRvIGhhbmRsZSB0aGUgc3VwcmVzc2VkIGJyZWFrZG93biBlbGVtZW50cwotCQkvLyB1c2UgdGhlIFN1cHJlc3MgdXRpbGl0eQotCQlTdXBwcmVzc2lvbiBzdXAgPSBnZXRTdXBwcmVzc2lvbihwcm9jKTsKLQotCQkvLyBuZWVkIHRvIGludGVyYXRlIHRoZSAzIGxheW91dCBzdHJ1Y3R1cmUgc2ljbmUgdGhlaXIgcGF0aCBpcyBkaWZmZXJlbnQKLQkJaWYgKCBsb2FkV2JzICkgewotCQkJbG9hZFdCU0xheW91dERhdGEoYWN0X2RhdGEsIHN1cCk7Ci0JCX0KLQkJCi0JCWlmICggbG9hZFRicyApIHsKLQkJCWxvYWRUQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQl9Ci0JCQotCQlpZiAoIGxvYWRXcGJzICkgewotCQkJbG9hZFdQQlNMYXlvdXREYXRhKGFjdF9kYXRhLCBzdXApOwotCQl9Ci0JCQotCQlpZiAoIGRlYnVnICkgewotCQkJdC5zdG9wKCk7Ci0JCQlTdHJpbmcgbXNnID0gdC5nZXRUaW1lKCkKLQkJCQkJKyAiIG1pbmktc2Vjb25kKHMpIGxvYWRpbmcgbGF5b3V0IGRhdGEgZm9yIHByb2Nlc3MgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKHByb2MpIC8vJE5PTi1OTFMtMSQgLwotCQkJCQkrICIsIGFjdGl2aXR5OiAiICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUoc3VwZXIuZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLwkJCQotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRXQlNMYXlvdXREYXRhKEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgU3VwcHJlc3Npb24gc3VwKQotCXsKLQkJLy8gcHVibGlzaCB0aGUgY29uc29saWRhdGVkIHZpZXcKLQkJQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSA9IGxheW91dE1hbmFnZXIKLQkJCQkuZ2V0Q0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJQWN0aXZpdHlMYXlvdXRTZXR0aW5nIHNldHRpbmcgPSBuZXcgQWN0aXZpdHlMYXlvdXRTZXR0aW5nKAotCQkJCWFkYXB0ZXJGYWN0b3J5LCBjcnMsIHN1cCk7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQlQcm9jZXNzRWxlbWVudEl0ZW0gZWxlbWVudEl0ZW0gPSBuZXcgUHJvY2Vzc0VsZW1lbnRJdGVtKHdyYXBwZXIsIHN1cGVyLmVsZW1lbnQsIHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCk7Ci0JCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0KLS8vCQkvLyBpZiB0aGVyZSBpcyBubyBwcm9jZXNzLWxvY2FsIHN1cHJlc3NlZCBpdGVtLCBkb24ndCBnZW5lcmF0ZSBkaWFncmFtcwotCQkvLyBubywgdGhpcyB3aWxsIG5vdCB3b3JrLCBzaW5jZSB0aGUgdGV4dCBjb2xvciBvZmQgdGhlIGRpYWdyYW0gaXMgZ3JlZW4sIGlmIHVzZSBiYXNlLCBpdCdzIGJsYWNrLgotCQkvLyBzbyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBkaWFncmFtIG5vIG1hdHRlciB3aGF0LgotLy8JCWlmICggIWFjdF9kYXRhLmhhc0xvY2FsU3VwcHJlc3NlZCgpICkKLS8vCQl7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0JCQotCQlTdHJpbmcgZGlhZ3JhbVR5cGUsIGltZ0ZpbGU7Ci0JCQotCQkvLyBtYWtlIGEgc2hvcnQgcHJlZml4IGZvciB0aGUgZmlsZSBuYW1lCi0JCVN0cmluZyBwcmVmaXggPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aC5oYXNoQ29kZSgpKTsKLQkJCi0JCWRpYWdyYW1UeXBlID0gUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV93b3JrZmxvdyA9IGdlbmVyYXRlRGlhZ3JhbShzdXAsIGRpYWdyYW1UeXBlLCBpbWdGaWxlKTsJCi0JCWlmIChkaWFncmFtX3dvcmtmbG93ICE9IG51bGwKLQkJCQkmJiBkaWFncmFtX3dvcmtmbG93LmdldEltYWdlRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQlhY3RfZGF0YS5zZXRBY3Rpdml0eURpYWdyYW1QYXRoKGRpYWdyYW1fd29ya2Zsb3cuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCQkKLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfQUNUSVZJVFlfREVUQUlMOwotCQlpbWdGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RGlhZ3JhbUZpbGVQYXRoTmFtZShlbGVtZW50LCBwcmVmaXggKyAiXyIgKyBkaWFncmFtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJRGlhZ3JhbUluZm8gZGlhZ3JhbV9kZXRhaWwgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQlpZiAoZGlhZ3JhbV9kZXRhaWwgIT0gbnVsbCAmJiBkaWFncmFtX2RldGFpbC5nZXRJbWFnZUZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJYWN0X2RhdGEuc2V0QWN0aXZpdHlEZXRhaWxEaWFncmFtUGF0aChkaWFncmFtX2RldGFpbC5nZXRJbWFnZUZpbGVOYW1lKCkpOwotCQl9Ci0KLQkJZGlhZ3JhbVR5cGUgPSBSZXNvdXJjZUhlbHBlci5ESUFHUkFNX1RZUEVfV1BfREVQRU5ERU5DWTsKLQkJaW1nRmlsZSA9IFJlc291cmNlSGVscGVyLmdldERpYWdyYW1GaWxlUGF0aE5hbWUoZWxlbWVudCwgcHJlZml4ICsgIl8iICsgZGlhZ3JhbVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCURpYWdyYW1JbmZvIGRpYWdyYW1fd3AgPSBnZW5lcmF0ZURpYWdyYW0oc3VwLCBkaWFncmFtVHlwZSwgaW1nRmlsZSk7CQotCQlpZiAoZGlhZ3JhbV93cCAhPSBudWxsICYmIGRpYWdyYW1fd3AuZ2V0SW1hZ2VGaWxlTmFtZSgpICE9IG51bGwpIHsKLQkJCWFjdF9kYXRhLnNldFdQRGVwZW5kZW5jeURpYWdyYW1QYXRoKGRpYWdyYW1fd3AuZ2V0SW1hZ2VGaWxlTmFtZSgpKTsKLQkJfQotCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkVEJTTGF5b3V0RGF0YShBY3Rpdml0eUxheW91dERhdGEgYWN0X2RhdGEsIFN1cHByZXNzaW9uIHN1cCkKLQl7Ci0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldFRCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCUNvbXBvc2l0ZVJvbGVzIGNycyA9IG51bGw7IC8vbmV3IENvbXBvc2l0ZVJvbGVzKGFkYXB0ZXJGYWN0b3J5LCAoQWN0aXZpdHkpIHN1cGVyLmVsZW1lbnQpOwotCi0JCS8vIHJvb2x1cCB0aGUgbGF5b3V0Ci0JCUlCU0l0ZW1Qcm92aWRlciBwcm92aWRlciA9IChJQlNJdGVtUHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCXN1cGVyLmVsZW1lbnQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXByb3ZpZGVyLnNldFJvbGxlZFVwKHRydWUpOwotCi0JCQotCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZyA9IG5ldyBBY3Rpdml0eUxheW91dFNldHRpbmcoCi0JCQkJYWRhcHRlckZhY3RvcnksIGNycywgc3VwKTsKLQkJc2V0dGluZy5yb2xsdXBSb2xlcyA9IHRydWU7Ci0KLQkJCi0JCS8vIG5lZWQgdG8gZ2V0IHRoZSByYXcgaXRlbSBwcm92aWRlciBmcm9tIHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkJT2JqZWN0IHdyYXBwZXIgPSBzdXAuZ2V0T2JqZWN0QnlQYXRoKHN1cGVyLnBhdGhzLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJd3JhcHBlciA9IHN1cGVyLmVsZW1lbnQ7Ci0JCX0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSh3cmFwcGVyLCBzdXBlci5lbGVtZW50LCBzdXBlci5lbGVtZW50UHJvY2Vzc1BhdGgpOwotCQlpdGVyYXRlUHJvY2Vzc0l0ZW0oZWxlbWVudEl0ZW0sIGFjdF9kYXRhLCBzZXR0aW5nLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOwotCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkV1BCU0xheW91dERhdGEoQWN0aXZpdHlMYXlvdXREYXRhIGFjdF9kYXRhLCBTdXBwcmVzc2lvbiBzdXApCi0JewotCQkvLyBwdWJsaXNoIHRoZSBjb25zb2xpZGF0ZWQgdmlldwotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gbGF5b3V0TWFuYWdlcgotCQkJCS5nZXRXUEJTQWRhcHRlckZhY3RvcnkoKTsKLQkJQ29tcG9zaXRlUm9sZXMgY3JzID0gbnVsbDsgLy9uZXcgQ29tcG9zaXRlUm9sZXMoYWRhcHRlckZhY3RvcnksIChBY3Rpdml0eSkgc3VwZXIuZWxlbWVudCk7Ci0KLQkJLy8gcm9vbHVwIHRoZSBsYXlvdXQKLQkJSUJTSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKElCU0l0ZW1Qcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJc3VwZXIuZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJcHJvdmlkZXIuc2V0Um9sbGVkVXAodHJ1ZSk7Ci0JCi0JCUFjdGl2aXR5TGF5b3V0U2V0dGluZyBzZXR0aW5nID0gbmV3IEFjdGl2aXR5TGF5b3V0U2V0dGluZygKLQkJCQlhZGFwdGVyRmFjdG9yeSwgY3JzLCBzdXApOwotCi0JCQotCQkvLyBuZWVkIHRvIGdldCB0aGUgcmF3IGl0ZW0gcHJvdmlkZXIgZnJvbSB0aGUgYWRhcHRlciBmYWN0b3J5Ci0JCU9iamVjdCB3cmFwcGVyID0gc3VwLmdldE9iamVjdEJ5UGF0aChzdXBlci5wYXRocywgYWRhcHRlckZhY3RvcnkpOwotCQlpZiAoIHdyYXBwZXIgPT0gbnVsbCApIHsKLQkJCXdyYXBwZXIgPSBzdXBlci5lbGVtZW50OwotCQl9Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0od3JhcHBlciwgc3VwZXIuZWxlbWVudCwgc3VwZXIuZWxlbWVudFByb2Nlc3NQYXRoKTsKLQkJaXRlcmF0ZVByb2Nlc3NJdGVtKGVsZW1lbnRJdGVtLCBhY3RfZGF0YSwgc2V0dGluZywgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgc3VwQ291bnQgPSAwOwotCQotCXByaXZhdGUgdm9pZCBpdGVyYXRlUHJvY2Vzc0l0ZW0oUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudEl0ZW0sIEFjdGl2aXR5TGF5b3V0RGF0YSBhY3RfZGF0YSwgCi0JCQlBY3Rpdml0eUxheW91dFNldHRpbmcgc2V0dGluZywgYm9vbGVhbiBsb2FkV2JzLCBib29sZWFuIGxvYWRUYnMsIGJvb2xlYW4gbG9hZFdwYnMpIHsKLQkJCi0JCS8vU3RyaW5nIG1zZyA9ICIgLS0tIGl0ZXJhdGUgcHJvY2VzcyBpdGVtICIgKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShwYXJlbnRJdGVtLmVsZW1lbnQpICsgIlsiICsgcGFyZW50SXRlbS5wYXRoICsgIl0iIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCQkJCi0JCS8vU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0KLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbnVsbDsKLQkJT2JqZWN0IHBhcmVudE9iaiA9IHBhcmVudEl0ZW0ucmF3SXRlbTsKLQkJCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBzZXR0aW5nLmFkYXB0ZXJGYWN0b3J5LmFkYXB0KAotCQkJCQlwYXJlbnRPYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCX0KLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7CQkJCi0JCQkJCi0vLwkJCQkvLyBsYXQgdGhlIHByZXNlbnRhdGlvbiB0byBkZXRlcm1pbmUgd2hlbiB0byBzaG93Ci0vLwkJCQkvLyBzZXQgZ2VuZXJhdGUgdGhlIGZsYWcgZm9yIGJyb3dzaW5nCi0JCQkJYm9vbGVhbiBpc1N1cHJlc3NlZCA9IHNldHRpbmcuc3VwLmlzU3VwcHJlc3NlZChyYXdpdGVtKTsKLQkJCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJCS51bndyYXAocmF3aXRlbSk7Ci0JCQkJCQkJCQotCQkJCVByb2Nlc3NFbGVtZW50SXRlbSBlbGVtZW50SXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ocmF3aXRlbSwgaXRlbSwgcGFyZW50SXRlbSk7Ci0KLQkJCQlpZiAoZGVidWcgJiYgaXNTdXByZXNzZWQgKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3VwcHJlc3NlZDogIiArICsrc3VwQ291bnQgKyAiIDogIiAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJKyBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShpdGVtKSAKLQkJCQkJCQkrICI6ICIgKyBlbGVtZW50SXRlbS5wYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQl9Ci0KLQkJCQlJRWxlbWVudExheW91dCBsID0gZ2V0TGF5b3V0KGVsZW1lbnRJdGVtKTsKLQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0ICkKLQkJCQl7CQkKLQkJCQkJaWYgKCBpc1N1cHJlc3NlZCApCi0JCQkJCXsKLQkJCQkJCVN0cmluZyByZWxQYXRoID0gKChBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0KWwpLmdldFJlbGF0aXZlUHJvY2Vzc1BhdGgoKTsKLQkJCQkJCWFjdF9kYXRhLnNldFN1cHByZXNzZWQocmVsUGF0aCk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgCi0JCQkJCXsJCQkJCi0JCQkJCQkvLyBvbmx5IGl0ZXJhdGUgdW4tc3VwcHJlc3NlZCBpdGVtCi0JCQkJCQkvLyBpZiB0aGUgbGF5b3V0IGlzIGFuIGFjdGl2aXR5IGxheW91dCwgY29sbGVjdCB0aGUgbGF5b3V0IGRhdGEgZm9yIGl0Ci0JCQkJCQlpZiAoIGwgaW5zdGFuY2VvZiBBY3Rpdml0eUxheW91dCApCi0JCQkJCQl7Ci0JCQkJCQkJKChBY3Rpdml0eUxheW91dClsKS5sb2FkTGF5b3V0RGF0YShhY3RfZGF0YS5nZXRQcm9jZXNzTGF5b3V0RGF0YSgpLCAKLQkJCQkJCQkJIGxvYWRXYnMsIGxvYWRUYnMsIGxvYWRXcGJzKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQkvLyBpbmV0ZXJhdGUgY2hpbGRyZW4sIG5vdCBqdXN0IGFjdGl2aXR5LCBhbnkgY2hpbGQgaW4gdGhlCi0JCQkJCQkJLy8gcmF3aXRlbSBzaG91bGQgYmUgaXRlcmF0ZWQsCi0JCQkJCQkJLy8gc3VjaCBhcyB0aGUgc3ViLWFydGlmYWN0cwotCQkJCQkJCWl0ZXJhdGVQcm9jZXNzSXRlbShlbGVtZW50SXRlbSwgYWN0X2RhdGEsIHNldHRpbmcsIGxvYWRXYnMsIGxvYWRUYnMsIGxvYWRXcGJzKTsJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0JCi0JCi0JLyoqCi0JICogZ2V0IGFsbCB0aGUgbGlua2VkIHRhc2tzLCByb2xlcywgYW5kIHdvcmtwcm9kdWN0cyBmb3IgdGhpcyBhY3Rpdml0eSBhbmQgYWxsIGl0J3MgYnJlYWtkb3duIGVsZW1lbnRzLCByZWN1cnNpdmVseS4KLQkgKiB0aGUgZWxlbWVudCBmb3VuZCBhcmUgbm90aWZpZWQgdmlhIElDb250ZW50VmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KCkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaW5kQWxsTGlua2VkRWxlbWVudHMoKSB7Ci0JCS8vIGl0ZXJhdGUgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIGNvbGxlY3QgdGhlIGluZm8uCi0JCVByb2Nlc3MgcHJvYyA9IGdldE93bmluZ1Byb2Nlc3MoKTsKLQkJCi0JCS8vIG5lZWQgdG8gaGFuZGxlIHRoZSBzdXByZXNzZWQgYnJlYWtkb3duIGVsZW1lbnRzCi0JCS8vIHVzZSB0aGUgU3VwcmVzcyB1dGlsaXR5Ci0JCVN1cHByZXNzaW9uIHN1cCA9IGdldFN1cHByZXNzaW9uKHByb2MpOwotCi0JCS8vIHB1Ymxpc2ggdGhlIGNvbnNvbGlkYXRlZCB2aWV3Ci0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0KLQkJLy8gbmVlZCB0byBnZXQgdGhlIHJhdyBpdGVtIHByb3ZpZGVyIGZyb20gdGhlIGFkYXB0ZXIgZmFjdG9yeQotCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgoc3VwZXIucGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJaWYgKCB3cmFwcGVyID09IG51bGwgKSB7Ci0JCQl3cmFwcGVyID0gc3VwZXIuZWxlbWVudDsKLQkJfQotCQkKLQkJZ2V0TGF5b3V0TWdyKCkuZ2V0VmFsaWRhdG9yKCkuYWRkUmVmZXJlbmNlZEVsZW1lbnQobnVsbCwgc3VwZXIuZWxlbWVudCk7Ci0KLQkJaXRlcmF0ZUl0ZW1Gb3JMaW5rZWRFbGVtZW50cyh3cmFwcGVyLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZUl0ZW1Gb3JMaW5rZWRFbGVtZW50cyhPYmplY3QgcGFyZW50T2JqLCBDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBTdXBwcmVzc2lvbiBzdXApIHsKLQkJCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCQotCQlpZiAocGFyZW50T2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQlwcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHBhcmVudE9iajsKLQkJfSBlbHNlIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkuYWRhcHQoCi0JCQkJCXBhcmVudE9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJfQotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJQ29sbGVjdGlvbiBpdGVtcyA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcmF3aXRlbSA9IGl0Lm5leHQoKTsJCQkKLQkJCQotCQkJaWYgKCBzdXAuaXNTdXBwcmVzc2VkKHJhd2l0ZW0pICkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IGl0ZW0gPSAoTWV0aG9kRWxlbWVudCkgTGlicmFyeVV0aWwKLQkJCQkJLnVud3JhcChyYXdpdGVtKTsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IG51bGw7Ci0JCQlpZiAoIGl0ZW0gaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciApIHsKLQkJCQllID0gKChUYXNrRGVzY3JpcHRvcilpdGVtKS5nZXRUYXNrKCk7Ci0JCQl9IGVsc2UgaWYgKCBpdGVtIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IgKSB7Ci0JCQkJZSA9ICgoUm9sZURlc2NyaXB0b3IpaXRlbSkuZ2V0Um9sZSgpOwotCQkJfSBlbHNlIGlmICggaXRlbSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0RGVzY3JpcHRvciApIHsKLQkJCQllID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpaXRlbSkuZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCX0gCi0JCQkKLQkJCWlmICggZSAhPSBudWxsICkgewotCQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KGl0ZW0sIGUpOwotCQkJfSAKLQkJCQkKLQkJCU1ldGhvZEVsZW1lbnQgcGFyZW50ID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChyYXdpdGVtKTsKLQkJCWdldExheW91dE1ncigpLmdldFZhbGlkYXRvcigpLmFkZFJlZmVyZW5jZWRFbGVtZW50KHBhcmVudCwgaXRlbSk7Ci0KLQkJCWl0ZXJhdGVJdGVtRm9yTGlua2VkRWxlbWVudHMocmF3aXRlbSwgYWRhcHRlckZhY3RvcnksIHN1cCk7Ci0JCX0KLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQWN0aXZpdHlMYXlvdXREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjFlMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9BY3Rpdml0eUxheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIGNsYXNzIHRvIGhvbGQgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgZWFjaCBhY3Rpdml0eQotICogdGhlIGRhdGEgd2lsbCBiZSB3cml0ZSBvdXQgdG8gYSBqYXZhc2NyaXB0IG1hcCAKLSAqIHNvIHRoYXQgYWN0aXZpdHkgbGF5b3V0IGluIHRoZSBwdWJsaXNoZWQgc2l0ZSBjYW4gZ2V0IHRoZSBzdGF0dXMgZHluYW1pY2FsbHkuCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5TGF5b3V0RGF0YSB7Ci0KLQlwcml2YXRlIFByb2Nlc3NMYXlvdXREYXRhIHByb2NfZGF0YTsKLQkKLQlwdWJsaWMgU3RyaW5nIGFkX2ltZ19wYXRoID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIGFkZF9pbWdfcGF0aCA9IG51bGw7Ci0JcHVibGljIFN0cmluZyB3cGRfaW1nX3BhdGggPSBudWxsOwotCQotCS8vIG1hcCBvZiBzdXByZXNzZWQgaXRlbSdzIHJlbGF0aXZlIHBhdGggdG8gdGhlIGN1cnJlbnQgYWN0aXZpdHkKLQlwcml2YXRlIExpc3Qgc3VwcmVzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JLyoqCi0JICogY29uc3R1Y3RvcgotCSAqIEBwYXJhbSBwcm9jX2RhdGEKLQkgKiBAcGFyYW0gYWN0aXZpdHlfcGF0aAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eUxheW91dERhdGEoUHJvY2Vzc0xheW91dERhdGEgcHJvY19kYXRhLCBTdHJpbmcgYWN0aXZpdHlfcGF0aCkKLQl7Ci0JCXRoaXMucHJvY19kYXRhID0gcHJvY19kYXRhOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgUHJvY2Vzc0xheW91dERhdGEKLQkgKiBAcmV0dXJuIFByb2Nlc3NMYXlvdXREYXRhCi0JICovCi0JcHVibGljIFByb2Nlc3NMYXlvdXREYXRhIGdldFByb2Nlc3NMYXlvdXREYXRhKCkKLQl7Ci0JCXJldHVybiBwcm9jX2RhdGE7Ci0JfQotCQotCS8qKgotCSAqIHNldCBhY3Rpdml0eSBkaWFncmFtIHBhdGgKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3Rpdml0eURpYWdyYW1QYXRoKFN0cmluZyBwYXRoKQotCXsKLQkJYWRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW0gcGF0aAotCSAqIEBwYXJhbSBwYXRoIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RGV0YWlsRGlhZ3JhbVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQlhZGRfaW1nX3BhdGggPSBwYXRoOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXUERlcGVuZGVuY3lEaWFncmFtUGF0aChTdHJpbmcgcGF0aCkKLQl7Ci0JCXdwZF9pbWdfcGF0aCA9IHBhdGg7Ci0JfQotCQotCS8qKgotCSAqIHNldCB0aGUgZWxlbWVudCdzIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBzdXBwcmVzcyBlbGVtZW50Ci0JICogQHBhcmFtIGl0ZW1SZWxQYXRoCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3NlZChTdHJpbmcgaXRlbVJlbFBhdGgpCi0JewotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiU3VwcHJlc3NlZDogIiArIGFjdGl2aXR5X3BhdGggKyAiOiAiICsgaXRlbVJlbFBhdGgpOwotCQkKLQkJaWYgKCAhc3VwcmVzc2VkSXRlbXMuY29udGFpbnMoaXRlbVJlbFBhdGgpICkKLQkJewotCQkJc3VwcmVzc2VkSXRlbXMuYWRkKGl0ZW1SZWxQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIFN0cmluZyBmb3IgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIHN1cHByZXNzZWQgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdXBwcmVzc2VkSXRlbXMoKQotCXsKLQkJcmV0dXJuIHN1cHJlc3NlZEl0ZW1zOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyBhbnkgc3VwcHJlc3NlZCBpdGVtIGxvY2FsIHRvIHRoaXMgcHJvY2VzcwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0xvY2FsU3VwcHJlc3NlZCgpCi0JewotCQlyZXR1cm4gKHN1cHJlc3NlZEl0ZW1zLnNpemUoKSA+IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQXJ0aWZhY3RMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQXJ0aWZhY3RMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyODY5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0FydGlmYWN0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhbiBBcnRpZmFjdC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdExheW91dCBleHRlbmRzIFdvcmtQcm9kdWN0TGF5b3V0IHsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBBcnRpZmFjdExheW91dAotCSAqCi0JICovCi0JcHVibGljIEFydGlmYWN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ2hlY2tsaXN0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjM2M3NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9DaGVja2xpc3RMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgQ2hlY2tsaXN0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIGNoZWNrIGxpc3QgbGF5b3V0Ci0JICoKLQkgKi8KLQlwdWJsaWMgQ2hlY2tsaXN0TGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIGxheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5DaGVja2xpc3RfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvQ29uY2VwdExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Db25jZXB0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NmM2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Db25jZXB0TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIENvbmNlcHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JLyoqCi0JICogY29uc3RydWN0IGEgbGF5b3V0IGZvciBDb25jZXB0Ci0JICoKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsYXlvdXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQkJCQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Db25jZXB0X0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVsaXZlcmFibGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NTU2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0RlbGl2ZXJhYmxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIERlbGl2ZXJhYmxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJhYmxlTGF5b3V0IGV4dGVuZHMgV29ya1Byb2R1Y3RMYXlvdXQgewotCi0JLyoqCi0JICogbGF5b3V0IGZvciBEZWxpdmVyYWJsZQotCSAqCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckRlc2NyaXB0aW9uTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzVmNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9yIGNvbnRlbnRzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JTWV0aG9kRWxlbWVudCBkZXNjcmlwdG9yOwotCU1ldGhvZEVsZW1lbnQgbGlua2VkRWxlbWVudDsKLQlBYnN0cmFjdEVsZW1lbnRMYXlvdXQgbGlua2VkRGVzY3JpcHRpb25MYXlvdXQgPSBudWxsOwotCi0JLyoqCi0JICogbGF5b3V0IGZvciBkZXNjcmlwdG9ycwotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkxheW91dChNZXRob2RFbGVtZW50IGRlc2NyaXB0b3IpIHsKLQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQl9Ci0JCi0JLyoqCi0JICogaW5pdGlhbGl6ZSB0aGUgbGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCQkKLQkJc3VwZXIudGFyZ2V0RWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCXN1cGVyLm93bmVyRWxlbWVudCA9IGRlc2NyaXB0b3I7Ci0JCQotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhc2tEZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChUYXNrRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0VGFzaygpOwotCQl9IGVsc2UgaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJbGlua2VkRWxlbWVudCA9ICgoUm9sZURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJvbGUoKTsKLQkJfSBlbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJCi0JCS8vIGdldCB0aGUgcmVhbGl6ZWQgb25lCi0JCS8vIDE5NjA5NCAtIFRhc2sgZGVzY3JpcHRvciBwYWdlIHNob3VsZCBzaG93IHRoZSByZWFsaXplZCBjb250ZW50IG9mIHRoZSBsaW5rZWQgZWxlbWVudAotCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQlpZiAobGlua2VkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dCA9IG5ldyBHZW5lcmFsTGF5b3V0KCk7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dC5pbml0KGxheW91dE1hbmFnZXIsICgoRGVzY3JpYmFibGVFbGVtZW50KWxpbmtlZEVsZW1lbnQpLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCWxpbmtlZERlc2NyaXB0aW9uTGF5b3V0LnNldENvbnRlbnRUYXJnZXQoZGVzY3JpcHRvcik7Ci0JCQlsaW5rZWREZXNjcmlwdGlvbkxheW91dC5zZXRFbGVtZW50T3duZXIobGlua2VkRWxlbWVudCk7CQkKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgbG9hZEF0dHJpYnV0ZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0KLQkJTWFwIGZlYXR1cmVWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZWxlbWVudCk7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQkJaWYgKGZlYXR1cmVzICE9IG51bGwpIHsKLQkJCS8vIGdldCBhbGwgc3RyaW5nIHR5cGUgYXR0cmlidXRlcwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwkJCQotCQkJCWlmICghKHAgaW5zdGFuY2VvZiBFQXR0cmlidXRlKSApIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSlwOwotCQkJCVN0cmluZyBuYW1lID0gcC5nZXROYW1lKCk7Ci0JCQkJCQkJCQotCQkJCU9iamVjdCB2YWx1ZTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoInByZXNlbnRhdGlvbk5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJLy8gdmFsdWUgPSBUbmdVdGlsLmdldFByZXNlbnRhdGlvbk5hbWUoZWxlbWVudCk7Ci0JCQkJCXZhbHVlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXZhbHVlID0gZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKHApOwotCQkJCX0KLQkJCQkKLQkJCQlmZWF0dXJlVmFsdWVNYXAucHV0KG5hbWUsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIHJlZmluZWREZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIG1haW5EZXNjTmFtZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkuZ2V0TmFtZSgpOwotCQkKLQkJLy8gbm93LCBnZXQgdGhlIGZlYXR1cmUgdmFsdWUgZnJvbSB0aGUgbGluayBlbGVtZW50J3MgZGVjcmlwdGlvbgotCQlmZWF0dXJlcyA9IG51bGw7Ci0JCWlmICggKCBsaW5rZWREZXNjcmlwdGlvbkxheW91dCE9bnVsbCApICYmIChsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkgIT0gbnVsbCkgKSB7Ci0vLwkJCXByb3BlcnRpZXMgPSBsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkuZ2V0SW5zdGFuY2VQcm9wZXJ0aWVzKCk7Ci0JCQlmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRFbGVtZW50KCkpOwotCQl9Ci0JCQotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGFsbCBzdHJpbmcgdHlwZSBhdHRyaWJ1dGVzCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIHAgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7CQkJCi0JCQkJaWYgKCEocCBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy9FQXR0cmlidXRlIGF0dHJpYiA9IChFQXR0cmlidXRlKXA7Ci0JCQkJU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKLQkJCQlpZiAoIG5hbWUuZXF1YWxzKG1haW5EZXNjTmFtZSkgKSB7Ci0JCQkJCW5hbWUgPSByZWZpbmVkRGVzY05hbWU7Ci0JCQkJfQotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IGZlYXR1cmVWYWx1ZU1hcC5nZXQobmFtZSk7Ci0JCQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoKCkgPT0gMCApIHsKLQkJCQkJdmFsdWUgPSBsaW5rZWREZXNjcmlwdGlvbkxheW91dC5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUocCk7Ci0JCQkJCWZlYXR1cmVWYWx1ZU1hcC5wdXQobmFtZSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gbm93IHNldCB0aGUgdmFsdWVzCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmZWF0dXJlVmFsdWVNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSlpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW50cnkuZ2V0S2V5KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikJLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKQkJLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRWYWx1ZSgodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLnRvU3RyaW5nKCkpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rlc2NyaXB0b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWEwMmYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvRGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIGJhc2UgbGF5b3V0IGNsYXNzIGZvciBkZXNjcmlwdG9ycwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQgPSBBcnJheXMuYXNMaXN0KG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpCQotCX0pOwotCi0JTWV0aG9kRWxlbWVudCBsaW5rZWRFbGVtZW50ID0gbnVsbDsKLQotCUFic3RyYWN0RWxlbWVudExheW91dCBlbGVtZW50TGF5b3V0ID0gbnVsbDsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBfX2luaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0KLQkJLy8gMTk2MDk0IC0gVGFzayBkZXNjcmlwdG9yIHBhZ2Ugc2hvdWxkIHNob3cgdGhlIHJlYWxpemVkIGNvbnRlbnQgb2YgdGhlIGxpbmtlZCBlbGVtZW50Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFRhc2tEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRUYXNrKCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFRhc2tMYXlvdXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpIHsKLQkJCWxpbmtlZEVsZW1lbnQgPSAoKFJvbGVEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRSb2xlKCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFJvbGVMYXlvdXQoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yKSB7Ci0JCQlsaW5rZWRFbGVtZW50ID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGVsZW1lbnQpLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlsaW5rZWRFbGVtZW50ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChsaW5rZWRFbGVtZW50LCBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWlmIChsaW5rZWRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQllbGVtZW50TGF5b3V0ID0gbmV3IFdvcmtQcm9kdWN0TGF5b3V0KCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudExheW91dCAhPSBudWxsKSB7Ci0JCQllbGVtZW50TGF5b3V0LmluaXQobGF5b3V0TWFuYWdlciwgbGlua2VkRWxlbWVudCk7Ci0JCQllbGVtZW50TGF5b3V0LnNldENvbnRlbnRUYXJnZXQoZWxlbWVudCk7Ci0JCX0JCi0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIGxpbmtlZCBlbGVtZW50IGlzIGxvYWRlZAotCQlpZiAoIGxpbmtlZEVsZW1lbnQgIT0gbnVsbCApIHsKLQkJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IGxpbmtlZEVsZW1lbnQuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWl0ZXIubmV4dCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlc2NyaXB0b3JzLCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBnZXQgZnJvbSB0aGUgbGliZWQKLQkgKiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZUZlYXR1cmVWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotCQlPYmplY3QgdmFsdWUgPSBzdXBlci5nZXRBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoZmVhdHVyZSk7Ci0JCWlmICgoZWxlbWVudExheW91dCA9PSBudWxsKSB8fCAodmFsdWUgIT0gbnVsbCkKLQkJCQkmJiAodmFsdWUudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQkvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCBncmFiIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGUKLQkJLy8gbGlua2VkIGVsZW1lbnQKLQkJLy8gc3BlY2lmaWVkIGF0dHJpYnV0ZXMgb25seS4gQWRkIG1vcmUgZmVhdHVyZSBoZXJlIGlmIG5lZWRlZAotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSkgewotCQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0QXR0cmlidXRlRmVhdHVyZVZhbHVlKGZlYXR1cmUpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgbGF5b3V0IGZvciBhIGNoaWxkIGVsZW1lbnQgb2YgdGhpcyBlbGVtZW50Ci0JICogQWN0aXZpdHlFbGVtZW50TGF5b3V0IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgbGF5b3V0IHdpdGggbm9kZSBwYXRoCi0JICogQHBhcmFtIGNoaWxkCi0JICogQHJldHVybiBJRWxlbWVudExheW91dAotCSAqLwotCXByb3RlY3RlZCBJRWxlbWVudExheW91dCBnZXRDaGlsZExheW91dChNZXRob2RFbGVtZW50IGNoaWxkKQotCXsKLQkJaWYgKCBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpIAotCQkJCSYmIChjaGlsZCBpbnN0YW5jZW9mIERlc2NyaXB0b3JEZXNjcmlwdGlvbikgKSB7Ci0JCQlEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQgbCA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25MYXlvdXQodGhpcy5lbGVtZW50KTsKLQkJCWwuaW5pdChsYXlvdXRNYW5hZ2VyLCBjaGlsZCk7Ci0JCQlyZXR1cm4gbDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBsYXlvdXRNYW5hZ2VyLmdldExheW91dChjaGlsZCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkgewotCQlyZXR1cm4gZXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJCi0JCVN1cHByZXNzaW9uIHN1cCA9IHN1cGVyLmdldFN1cHByZXNzaW9uKHN1cGVyLm93bmluZ1Byb2Nlc3MpOwotCQlpZiAoIHN1cCAhPSBudWxsICkgewotCQkJLy8gY2hlY2sgc3VwcHJlc3Npb24KLQkJCWlmICggdmFsdWUgaW5zdGFuY2VvZiBMaXN0ICkgewotCQkJCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJCQlpbnQgaSA9IDA7Ci0JCQkJd2hpbGUgKCBpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJCQlPYmplY3QgdiA9IGl0ZW1zLmdldChpKTsKLQkJCQkJaWYgKCBpc1N1cHByZXNzZWQoc3VwLCBmZWF0dXJlLCB2KSApIHsKLQkJCQkJCWl0ZW1zLnJlbW92ZShpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWkrKzsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoIGl0ZW1zLnNpemUoKSA9PSAwICkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIGlzU3VwcHJlc3NlZChzdXAsIGZlYXR1cmUsIHZhbHVlKSApIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzU3VwcHJlc3NlZChTdXBwcmVzc2lvbiBzdXAsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIGVsZW1lbnQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICkgewotCQkJcmV0dXJuIHN1cC5pc1N1cHByZXNzZWQoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYXNrT3Bwb3NpdGVGZWF0dXJlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzKQotCQl8fCAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMpCi0JCXx8ICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycykKLQkJfHwgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzKQotCQl8fCAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9EaXNjaXBsaW5lTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rpc2NpcGxpbmVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIyZWVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0Rpc2NpcGxpbmVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgRGlzY2lwbGluZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0xheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjOWVlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7CQkJCQkJCi0JCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1Rhc2tzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1Rhc2tzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgdGFza3MpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCUxpc3Qgd29ya1Byb2R1Y3RzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1dvcmtQcm9kdWN0cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc19Xb3JrUHJvZHVjdHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCB3b3JrUHJvZHVjdHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9FeGFtcGxlTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0V4YW1wbGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwZWI2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0V4YW1wbGVMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYW4gRXhhbXBsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgRXhhbXBsZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuRXhhbXBsZV9Db250ZW50RWxlbWVudHMsIGxheW91dE1hbmFnZXIKLQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5FeGFtcGxlX0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQkJCQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5FeGFtcGxlX0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF90ZW1wbGF0ZV9hdHRhY2htZW50X3VybC5tYXRjaGVyKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWlmICghbS5maW5kKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgImZpbGU6Ly8iICsgYXR0YWNobWVudEZpbGUpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IG0uZ3JvdXAoMik7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgbS5ncm91cCgxKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci19Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HZW5lcmFsTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0dlbmVyYWxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NzNkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0dlbmVyYWxMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhbExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgR2VuZXJhbExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0d1aWRlbGluZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9HdWlkZWxpbmVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0N2QwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL0d1aWRlbGluZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBHdWlkZWxpbmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgR3VpZGVsaW5lTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5HdWlkZWxpbmVfQ29udGVudEVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuR3VpZGVsaW5lX0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5HdWlkZWxpbmVfQ29udGVudEVsZW1lbnRzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvT3V0Y29tZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9PdXRjb21lTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDk5YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9PdXRjb21lTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIE91dGNvbWUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0Y29tZUxheW91dCBleHRlbmRzIFdvcmtQcm9kdWN0TGF5b3V0IHsKLQotCXB1YmxpYyBPdXRjb21lTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9QcmFjdGljZUxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9QcmFjdGljZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTNkOGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJhY3RpY2VMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuUHJlc2VudGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb25maWd1cmF0aW9uLlByYWN0aWNlSXRlbVByb3ZpZGVyLkdyb3VwaW5nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUHJhY3RpY2UKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZUxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUHJhY3RpY2VMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzsKLQkJCUxpc3Q8TWV0aG9kRWxlbWVudD4gY2hpbGRyZW4gPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgbnVsbCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3Q8V29ya1Byb2R1Y3Q+IHdwU2xvdElucHV0cyA9IGdldElucHV0V3BTbG90cyhjaGlsZHJlbik7Ci0JCQkKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMSA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM7Ci0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGNoaWxkcmVuMSA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLAotCQkJCQlmZWF0dXJlMSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMiA9IFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM7Ci0JCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGNoaWxkcmVuMiA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBudWxsLAotCQkJCQlmZWF0dXJlMiwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCWNoaWxkcmVuLmFkZEFsbChjaGlsZHJlbjEpOwotCQkJY2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuMik7Ci0JCQkKLQkJCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQlHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlciA9IG5ldyBHcm91cGluZ0hlbHBlcih0aGlzKSB7CQkJCi0JCQkJcHJvdGVjdGVkIHZvaWQgZ3JvdXBpbmcoT2JqZWN0IHBhcmVudE9iamVjdCwgTGlzdCByZXQsCi0JCQkJCQlDb2xsZWN0aW9uIGNoaWxkcmVuLCBHcm91cGluZ0hlbHBlciBncm91cGluZ0hlbHBlcikgewkJCQkJCi0JCQkJCWlmIChnZXRHcm91cGVyKCkgaW5zdGFuY2VvZiBQcmFjdGljZUxheW91dCkgewotCQkJCQkJKChQcmFjdGljZUxheW91dCkgZ2V0R3JvdXBlcigpKS5ncm91cGluZyhwYXJlbnRPYmplY3QsIHJldCwKLQkJCQkJCQkJY2hpbGRyZW4sIGdyb3VwaW5nSGVscGVyKTsKLQkJCQkJfQotCQkJCX0JCi0JCQl9OwotCQkJCi0JCQlncm91cGluZyh0aGlzLCByZXQsIGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQkJCQotCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLAotCQkJCQllbGVtZW50WG1sLCAiUHJhY3RpY2UgZ3VpZGFuY2UgdHJlZSIsIHJldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKHdwU2xvdElucHV0cyAhPSBudWxsKSB7Ci0JCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLAotCQkJCQllbGVtZW50WG1sLCAiSW5wdXQgd29yayBwcm9kdWN0IHNsb3RzIiwgd3BTbG90SW5wdXRzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8V29ya1Byb2R1Y3Q+IGdldElucHV0V3BTbG90cyhMaXN0PE1ldGhvZEVsZW1lbnQ+IGVsZW1lbnRzKSB7Ci0JCVNldDxXb3JrUHJvZHVjdD4gc2xvdHMgPSBuZXcgSGFzaFNldDxXb3JrUHJvZHVjdD4oKTsKLQkJZm9yIChNZXRob2RFbGVtZW50IGVsZW06IGVsZW1lbnRzKSB7Ci0JCQlpZiAoZWxlbSBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzaykgZWxlbTsKLQkJCQlmb3IgKFdvcmtQcm9kdWN0IHdwOiB0YXNrLmdldE1hbmRhdG9yeUlucHV0KCkpIHsKLQkJCQkJaWYgKHdwLmdldElzQWJzdHJhY3QoKSkgewotCQkJCQkJc2xvdHMuYWRkKHdwKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKFdvcmtQcm9kdWN0IHdwOiB0YXNrLmdldE9wdGlvbmFsSW5wdXQoKSkgewotCQkJCQlpZiAod3AuZ2V0SXNBYnN0cmFjdCgpKSB7Ci0JCQkJCQlzbG90cy5hZGQod3ApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChzbG90cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTGlzdDxXb3JrUHJvZHVjdD4gd3BTbG90SW5wdXRzID0gbmV3IEFycmF5TGlzdDxXb3JrUHJvZHVjdD4oKTsKLQkJd3BTbG90SW5wdXRzLmFkZEFsbChzbG90cyk7Ci0JCQotCQlpZiAod3BTbG90SW5wdXRzLnNpemUoKSA+IDEpIHsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IFByZXNlbnRhdGlvbkNvbnRleHQuSU5TVEFOQ0UuZ2V0UHJlc05hbWVDb21wYXJhdG9yKCk7Ci0JCQlDb2xsZWN0aW9ucy48V29ya1Byb2R1Y3Q+c29ydCh3cFNsb3RJbnB1dHMsIGNvbXBhcmF0b3IpOwotCQl9Ci0JCQotCQlyZXR1cm4gd3BTbG90SW5wdXRzOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJLy9yZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdyb3VwaW5nKE9iamVjdCBwYXJlbnRPYmplY3QsIExpc3QgcmV0LCBDb2xsZWN0aW9uIGNoaWxkcmVuLCAKLQkJCVByYWN0aWNlSXRlbVByb3ZpZGVyLkdyb3VwaW5nSGVscGVyIGdyb3VwaW5nSGVscGVyKSB7Ci0JCU1hcDxTdHJpbmcsIExpc3Q+IG1hcCA9IFByYWN0aWNlSXRlbVByb3ZpZGVyLmdldFN1Ykdyb3VwTWFwKGNoaWxkcmVuLCBncm91cGluZ0hlbHBlcik7Ci0JCQotCQlib29sZWFuIHRvU29ydCA9IHRydWU7Ci0JCVN0cmluZ1tdIGtleXMgPSBncm91cGluZ0hlbHBlci5nZXRLZXlzSW5PcmRlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBrZXkgPSBrZXlzW2ldOwotCQkJTGlzdCBzdWJncm91cENoaWxkcmVuID0gbWFwLmdldChrZXkpOwotCQkJaWYgKHN1Ymdyb3VwQ2hpbGRyZW4gPT0gbnVsbCB8fCBzdWJncm91cENoaWxkcmVuLmlzRW1wdHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGdyb3VwaW5nSGVscGVyLnRvR3JvdXAoa2V5LCBzdWJncm91cENoaWxkcmVuKSkgewotCQkJCXN1Ymdyb3VwQ2hpbGRyZW4gPSBncm91cGluZ0hlbHBlci5uZXN0ZWRHcm91cGluZyhwYXJlbnRPYmplY3QsIGtleSwgc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJU3ViR3JvdXBWYWx1ZSBzdWJHcm91cFZhbHVlID0gbmV3IFN1Ykdyb3VwVmFsdWUoa2V5LCBzdWJncm91cENoaWxkcmVuKTsKLQkJCQlyZXQuYWRkKHN1Ykdyb3VwVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodG9Tb3J0KSB7Ci0JCQkJCVByYWN0aWNlSXRlbVByb3ZpZGVyLnNvcnQoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQkJfQotCQkJCXJldC5hZGRBbGwoc3ViZ3JvdXBDaGlsZHJlbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc05vbk1ldGhvZEVsZW1lbnRJblByb2Nlc3NDaGlsZCgKLQkJCU9iamVjdCBub25NZXRob2RFbGVtZW50Q2hpbGQsIE9iamVjdCBmZWF0dXJlLCBYbWxFbGVtZW50IHBhcmVudCwKLQkJCWJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCWlmIChub25NZXRob2RFbGVtZW50Q2hpbGQgaW5zdGFuY2VvZiBTdWJHcm91cFZhbHVlKSB7Ci0JCQlTdWJHcm91cFZhbHVlIHN1Ykdyb3VwVmFsdWUgPSAoU3ViR3JvdXBWYWx1ZSkgbm9uTWV0aG9kRWxlbWVudENoaWxkOwotCQkJU3RyaW5nIGtleSA9IHN1Ykdyb3VwVmFsdWUua2V5OwotCQkJTGlzdCBsaXN0VmFsdWUgPSBzdWJHcm91cFZhbHVlLmxpc3RWYWx1ZTsKLQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwKLQkJCQlwYXJlbnQsIGtleSwgbGlzdFZhbHVlKTsgCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLkRlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkJCQotCQlyZXR1cm4gc3VwZXIuYWNjZXB0RmVhdHVyZVZhbHVlKGZlYXR1cmUsIHZhbHVlKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgU3ViR3JvdXBWYWx1ZSB7Ci0JCXB1YmxpYyBTdHJpbmcga2V5OwotCQlwdWJsaWMgTGlzdCBsaXN0VmFsdWU7Ci0JCQotCQlwdWJsaWMgU3ViR3JvdXBWYWx1ZShTdHJpbmcga2V5LCBMaXN0IGxpc3RWYWx1ZSkgewotCQkJdGhpcy5rZXkgPSBrZXk7Ci0JCQl0aGlzLmxpc3RWYWx1ZSA9IGxpc3RWYWx1ZTsKLQkJfQotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzRWxlbWVudEl0ZW0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0VsZW1lbnRJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMjk5MzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzRWxlbWVudEl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBzaW1wbGUgaG9sZGVyIG9mIHByb2Nlc3MgZWxlbWVudCBpdGVtIGluZm8KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50SXRlbSB7Ci0JCi0JcHVibGljIE9iamVjdCByYXdJdGVtID0gbnVsbDsKLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHBhdGggPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgcHJvY19ndWlkID0gbnVsbDsKLQkKLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtKE9iamVjdCByYXdJdGVtLCBNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwYXRoKQotCXsKLQkJdGhpcy5yYXdJdGVtID0gcmF3SXRlbTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQkJdGhpcy5wcm9jX2d1aWQgPSBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0LmdldE93bmluZ1Byb2Nlc3NHdWlkRnJvbVBhdGgocGF0aCk7Ci0JfQotCQotCXB1YmxpYyBQcm9jZXNzRWxlbWVudEl0ZW0oT2JqZWN0IHJhd0l0ZW0sIE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgUHJvY2Vzc0VsZW1lbnRJdGVtIHBhcmVudCkKLQl7Ci0JCXRoaXMucmF3SXRlbSA9IHJhd0l0ZW07Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMucGF0aCA9IEFic3RyYWN0UHJvY2Vzc0VsZW1lbnRMYXlvdXQubWFrZVBhdGgocGFyZW50LnBhdGgsIHRoaXMuZWxlbWVudCk7IC8vIG1ha2UgcGF0aCBoZXJlCi0JCXRoaXMucHJvY19ndWlkID0gcGFyZW50LnByb2NfZ3VpZDsJCQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKQotCXsKLQkJcmV0dXJuIEVsZW1lbnRMYXlvdXRNYW5hZ2VyLmdldFF1ZXJ5U3RyaW5nKHByb2NfZ3VpZCwgcGF0aCk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Byb2Nlc3NMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVkODA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VkQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuVG5nQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUm9sZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0xheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUHJvY2Vzc0xheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KCk7Ci0KLQkJaWYgKCFpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JCX0KLQotCQkvLyBidWlsZCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0cmVlCi0JCVhtbEVsZW1lbnQgYnMgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiV29yayBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRXQlNfQ29tcG9zZWRBZGFwdGVyRmFjdG9yeSgpOwotCQlpdGVyYXRlKHN1cGVyLmVsZW1lbnQsIGJzLCBhZGFwdGVyRmFjdG9yeSk7Ci0KLQkJYnMgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJicmVha2Rvd24iKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAiVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0T0JTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCWJzID0gZWxlbWVudFhtbAotCQkJCS5uZXdDaGlsZCgiYnJlYWtkb3duIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIldvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkuZ2V0UEJTX0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKTsKLQkJaXRlcmF0ZShzdXBlci5lbGVtZW50LCBicywgYWRhcHRlckZhY3RvcnkpOwotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdGUgdGhlIGJyZWFrIGRvd24gc3RydWN0dXJlIGFuZCBidWlsZCB0aGUgeG1sIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudE9iagotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZShPYmplY3QgcGFyZW50T2JqLCBYbWxFbGVtZW50IHBhcmVudFhtbCwKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQocGFyZW50T2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gcHJvdmlkZXIuZ2V0Q2hpbGRyZW4ocGFyZW50T2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsLnVud3JhcChpdAotCQkJCQkJLm5leHQoKSk7Ci0JCQkJLy8gc3VwZXIucHJvY2Vzc0NoaWxkKHBhcmVudFhtbCwgaXRlbSwgZmFsc2UpOwotCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChpdGVtLCB0cnVlKTsKLQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCVhtbEVsZW1lbnQgY2hpbGQgPSBsLmdldFhtbEVsZW1lbnQoZmFsc2UpOwotCQkJCQlwYXJlbnRYbWwuYWRkQ2hpbGQoY2hpbGQpOwotCi0JCQkJCS8vIGluZXRlcmF0ZSBjaGlsZHJlbgotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJCQlpdGVyYXRlKGl0ZW0sIGNoaWxkLCBhZGFwdGVyRmFjdG9yeSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzTGF5b3V0RGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Qcm9jZXNzTGF5b3V0RGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY4MzU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUHJvY2Vzc0xheW91dERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLQotLyoqCi0gKiAKLSAqIGNsYXNzIHRvIGhvbGQgcHJvY2VzcyBzcGVjaWZpYyBsYXlvdXQgZGF0YSBmb3IgZWFjaCBhY3Rpdml0eQotICogdGhlIGRhdGEgd2lsbCBiZSB3cml0ZSBvdXQgdG8gYSBqYXZhc2NyaXB0IG1hcCAKLSAqIHNvIHRoYXQgYWN0aXZpdHkgbGF5b3V0IGluIHRoZSBwdWJsaXNoZWQgc2l0ZSBjYW4gZ2V0IHRoZSBzdGF0dXMgZHluYW1pY2FsbHkuCi0gKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NMYXlvdXREYXRhIHsKLQotCU1hcCBhY3Rpdml0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JLyoqCi0JICogY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gcHJvY19ndWlkCi0JICovCi0JcHVibGljIFByb2Nlc3NMYXlvdXREYXRhKFN0cmluZyBwcm9jX2d1aWQpCi0JewotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiBpdCBjb250YWlucyB0aGUgYWN0aXZpdHkgbGF5b3V0IG9mIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIEBwYXJhbSBhY3Rpdml0eV9wYXRoIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FjdGl2aXR5TGF5b3V0KFN0cmluZyBhY3Rpdml0eV9wYXRoKQotCXsKLQkJcmV0dXJuIGFjdGl2aXR5TWFwLmNvbnRhaW5zS2V5KGFjdGl2aXR5X3BhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYW4gQWN0aXZpdHlMYXlvdXREYXRhIGZvciB0aGUgYWN0aXZpdHkgcGF0aAotCSAqIEBwYXJhbSBhY3Rpdml0eV9wYXRoIFN0cmluZwotCSAqIEByZXR1cm4gQWN0aXZpdHlMYXlvdXREYXRhCi0JICovCi0JcHVibGljIEFjdGl2aXR5TGF5b3V0RGF0YSBjcmVhdGVBY3Rpdml0eUxhdW91dERhdGEoU3RyaW5nIGFjdGl2aXR5X3BhdGgpCi0JewotCQlBY3Rpdml0eUxheW91dERhdGEgZGF0YSA9IChBY3Rpdml0eUxheW91dERhdGEpYWN0aXZpdHlNYXAuZ2V0KGFjdGl2aXR5X3BhdGgpOwotCQlpZiAoIGRhdGEgPT0gbnVsbCApCi0JCXsKLQkJCWRhdGEgPSBuZXcgQWN0aXZpdHlMYXlvdXREYXRhKHRoaXMsIGFjdGl2aXR5X3BhdGgpOwotCQkJYWN0aXZpdHlNYXAucHV0KGFjdGl2aXR5X3BhdGgsIGRhdGEpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbWFwIG9mIHRoZSBhY3Rpdml0eSBsYXlvdXQgZGF0YQotCSAqIEByZXR1cm4gTWFwCi0JICovCi0JcHVibGljIE1hcCBnZXRBY3Rpdml0eUxheW91dERhdGFNYXAoKQotCXsKLQkJcmV0dXJuIGFjdGl2aXR5TWFwOwotCX0KLQkKLQkvKioKLQkgKiBwcmludCB0aGUgaW5mbyB0byBhIGphdmFzY3JpcHQgZmlsZSBpbiB0aGUgcHVibGlzaGVkIHNpdGUuIAotCSAqIFRoZXNlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGxheW91dCBvZiBwcm9jZXNzIGVsZW1lbnRzLgotCSAqIEBwYXJhbSBwcyBQcmludFdyaXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIHBzKQotCXsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBhY3Rpdml0eU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotCQl7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWl0Lm5leHQoKTsKLQkJCVN0cmluZyBhY3Rpdml0eV9wYXRoID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLQkJCUFjdGl2aXR5TGF5b3V0RGF0YSBkYXRhID0gKEFjdGl2aXR5TGF5b3V0RGF0YSllbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKCBkYXRhLmFkX2ltZ19wYXRoICE9IG51bGwgKQotCQkJewotCQkJCVN0cmluZyBrZXkgPSBhY3Rpdml0eV9wYXRoICsgUmVzb3VyY2VIZWxwZXIuRElBR1JBTV9UWVBFX1dPUktGTE9XOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLmFkX2ltZ19wYXRoKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBkYXRhLmFkZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9BQ1RJVklUWV9ERVRBSUw7Ci0JCQkJcHJpbnRJbWdGaWxlKHBzLCBrZXksIGRhdGEuYWRkX2ltZ19wYXRoKTsKLQkJCX0KLQkJCQotCQkJaWYgKCBkYXRhLndwZF9pbWdfcGF0aCAhPSBudWxsICkKLQkJCXsKLQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIFJlc291cmNlSGVscGVyLkRJQUdSQU1fVFlQRV9XUF9ERVBFTkRFTkNZOwotCQkJCXByaW50SW1nRmlsZShwcywga2V5LCBkYXRhLndwZF9pbWdfcGF0aCk7Ci0JCQl9Ci0KLQkJCWlmICggZGF0YS5nZXRTdXBwcmVzc2VkSXRlbXMoKS5zaXplKCkgPiAwICkKLQkJCXsKLQkJCQlmb3IgKCBJdGVyYXRvciBpdDIgPSBkYXRhLmdldFN1cHByZXNzZWRJdGVtcygpLml0ZXJhdG9yKCk7IGl0Mi5oYXNOZXh0KCk7ICkKLQkJCQl7Ci0JCQkJCVN0cmluZyByZWxQYXRoID0gKFN0cmluZylpdDIubmV4dCgpOwotCQkJCQlTdHJpbmcga2V5ID0gYWN0aXZpdHlfcGF0aCArIHJlbFBhdGg7Ci0JCQkJCXByaW50U3VwcHJlc3NlZEl0ZW0ocHMsIGtleSk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcmludEltZ0ZpbGUoUHJpbnRXcml0ZXIgcHMsIFN0cmluZyBrZXksIFN0cmluZyBmaWxlTmFtZSkKLQl7Ci0JCVN0cmluZyBsaW5lID0gImNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmltYWdlRmlsZXNbXCIiICsga2V5ICsgIlwiXT1cIiIgKyBmaWxlTmFtZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXBzLnByaW50bG4obGluZSk7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW50U3VwcHJlc3NlZEl0ZW0oUHJpbnRXcml0ZXIgcHMsIFN0cmluZyBrZXkpCi0JewotCQlTdHJpbmcgbGluZSA9ICJjb250ZW50UGFnZS5wcm9jZXNzUGFnZS5zdXBwcmVzc2VkSXRlbXNbXCIiICsga2V5ICsgIlwiXT10cnVlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXBzLnByaW50bG4obGluZSk7CQotCQkvL1N5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWFjdGl2aXR5TWFwLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXBvcnRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUmVwb3J0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTllNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXBvcnRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgUmVwb3J0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvcnRMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFJlcG9ydExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUmVwb3J0X1dvcmtQcm9kdWN0cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJlcG9ydF9Xb3JrUHJvZHVjdHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9SZXVzYWJsZUFzc2V0TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JldXNhYmxlQXNzZXRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwN2RkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JldXNhYmxlQXNzZXRMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSZXVzYWJsZSBBc3NldC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldExheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgUmV1c2FibGVBc3NldExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuUmV1c2FibGVBc3NldF9Db250ZW50RWxlbWVudHMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCi0JCQlMaXN0IGFjdGl2aXRpZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5SZXVzYWJsZUFzc2V0X0JyZWFrZG93bkVsZW1lbnRzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQotCQkJY29udGVudEVsZW1lbnRzLmFkZEFsbChhY3Rpdml0aWVzKTsKLQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5SZXVzYWJsZUFzc2V0X0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpIHN1cGVyLmVsZW1lbnQ7Ci0JCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIGd1aWRhbmNlCi0JCQkJCS5nZXRQcmVzZW50YXRpb24oKTsKLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQkKLQkJCQkvLyBBdXRob3Jpbmc6ICBUZW1wbGF0ZSBhdHRhY2htZW50cyBvZiBhIGNvbnRyaWJ1dGluZyB0ZW1wbGF0ZSBndWlkYW5jZSBlbGVtZW50IGFyZSBub3QgYXBwZW5kZWQgdG8gdGhlIGJhc2UgbGlzdCBvZiBhdHRhY2htZW50cwkJCQkKLQkJCQkvL1N0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24pY29udGVudCkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKGNvbnRlbnQsIHN1cGVyLmVsZW1lbnQsIGZlYXR1cmUsIHN1cGVyLmxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlpZiAoIChhdHRhY2htZW50U3RyaW5nICE9IG51bGwpICYmIChhdHRhY2htZW50U3RyaW5nLmluZGV4T2YoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SKSA+IDApICkKLQkJCQl7Ci0JCQkJCWF0dGFjaG1lbnRTdHJpbmcgPSBhdHRhY2htZW50U3RyaW5nLnJlcGxhY2VBbGwoQ29uZmlndXJhdGlvbkhlbHBlci5BVFRSSUJVVEVfVkFMVUVfU0VQRVJBVE9SLCBUbmdVdGlsLkdVSURBTkNFX0ZJTEVTVFJJTkdfU0VQQVJBVE9SKTsgCi0JCQkJfQotCQkJCUxpc3QgYXR0YWNobWVudExpc3QgPSBUbmdVdGlsLmNvbnZlcnRHdWlkYW5jZUF0dGFjaG1lbnRzVG9MaXN0KGF0dGFjaG1lbnRTdHJpbmcpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBhdHRhY2htZW50RmlsZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoYXR0YWNobWVudEZpbGUgIT0gbnVsbCkgewotCQkJCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF90ZW1wbGF0ZV9hdHRhY2htZW50X3VybC5tYXRjaGVyKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCWlmICghbS5maW5kKCkpIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVXRpbC5nZXRGaWxlTmFtZShhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgImZpbGU6Ly8iICsgYXR0YWNobWVudEZpbGUpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IG0uZ3JvdXAoMik7Ci0JCQkJCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiYXR0cmlidXRlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkiYXR0YWNoZWRGaWxlIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkidXJsIiwgbS5ncm91cCgxKSkgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImZpbGVOYW1lIiwgZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci19Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9hZG1hcExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2FkbWFwTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYTJlNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2FkbWFwTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFJvYWRtYXAuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFJvYWRtYXBMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0KLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlMaXN0IGNvbnRlbnRFbGVtZW50cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvYWRtYXBfQWN0aXZpdGVzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuUm9hZG1hcF9BY3Rpdml0ZXMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudFhtbDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlRGVzY3JpcHRvckxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Sb2xlRGVzY3JpcHRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Y5MjhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZURlc2NyaXB0b3JMYXlvdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgbGF5b3V0IGZvciBhIFJvbGVEZXNjcmlwdG9yLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9yTGF5b3V0IGV4dGVuZHMgRGVzY3JpcHRvckxheW91dCB7Ci0JCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCS8vIHVzZSB0aGUgZGVmYXVsdAotCQkvLyBpZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSBkaWFncmFtLCB5b3UgbWF5IG5lZWQgdG8ga2VlcCB0aGUgZmVhdHVyZQotCQkvLyB2YWx1ZXMuCi0JCS8vIGp1c3QgZG8gc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlIFJvbGVMYXlvdXQKLQkJLy8gTk9URTogZm9yIHJvbGUtdGFza3MgcmVsYXRpb25zaGlwLCB0aGUgZmVhdHVyZSBpcwotCQkvLyBSb2xlRGVzY3JpcHRvciNnZXRQZXJmb3Jtc0FzT3duZXIKLQkJLy8gaXQncyBhIGJpZGlyZWN0aW9uYWwgZmVhdHVyZSwgZG9uJ3QgbmVlZCBvcHBvc2l0ZSBmZWF0dXJlCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQotCQlzdXBlci5sb2FkUmVmZXJlbmNlcyhlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQotCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiU2hvd0Z1bGxNZXRob2RDb250ZW50IiwgKGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQotCQlpZiAoIChzdXBlci5lbGVtZW50TGF5b3V0ICE9IG51bGwgKSAmJiBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpICkgewotCQkJLy8gYWxzbyBsb2FkIHRoZSBsaW5rZWQgZWxlbWVudCByZWZlcmVuY2VkIGluZm9ybWF0aW9uCi0JCQlmb3IgKEl0ZXJhdG9yPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gaXRlciA9IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JCi0JLyoqCi0JICogbG9hZCB0aGUgbm9uLWF0dHJpYnV0ZSBmZWF0dXJlCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gZWxlbWVudFhtbAotCSAqIEBwYXJhbSBpbmNsdWRlUmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBYbWxFbGVtZW50IGVsZW1lbnRYbWwsCi0JCQlib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCWlmICggZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpICkgewotCQkJTGlzdCB2ID0gY2FsY01vZGlmaWVkV29ya1Byb2R1Y3REZXNjcmlwdG9ycygpOwotCQkJYWRkUmVmZXJlbmNlcyhmZWF0dXJlLCBlbGVtZW50WG1sLCBmZWF0dXJlLmdldE5hbWUoKSwgdik7Ci0JCX0gZWxzZSB7Ci0JCQlnZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdCBjYWxjTW9kaWZpZWRXb3JrUHJvZHVjdERlc2NyaXB0b3JzKCkgewotCQlMaXN0IHYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IGdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpOwotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzOwotCQlMaXN0IHYyID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJaWYgKCB2Mi5zaXplKCkgPiAwICkgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSB2Mi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0Lm5leHQoKTsKLQkJCQkKLQkJCQlTdHJpbmcgcGF0aCA9IHN1cGVyLm1ha2VQYXRoKGdldFN1cGVyQWN0aXZpdHlQYXRoKCksIGUpOwotCQkJCVRhc2tEZXNjcmlwdG9yTGF5b3V0IHRsID0gKFRhc2tEZXNjcmlwdG9yTGF5b3V0KWxheW91dE1hbmFnZXIuY3JlYXRlTGF5b3V0KGUsIG93bmluZ1Byb2Nlc3MsIHBhdGgpOwotCQkJCS8vUm9sZURlc2NyaXB0b3IgciA9IChSb2xlRGVzY3JpcHRvcil0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgbnVsbCwgZmFsc2UpOwotCQkJCUxpc3Qgckxpc3QgPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgbnVsbCwgZmFsc2UpOwotCQkJCS8vaWYgKCByID09IHRoaXMuZWxlbWVudCApIHsKLQkJCQlpZiAoIHJMaXN0LmNvbnRhaW5zKHRoaXMuZWxlbWVudCkgKSB7Ci0JCQkJCUxpc3QgdmFsdWUgPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgbnVsbCwgZmFsc2UpOwotCQkJCQlpZiAoIHZhbHVlICE9IG51bGwgJiYgdmFsdWUuc2l6ZSgpID4gMCApIHsKLQkJCQkJCWZvciAoIEl0ZXJhdG9yIGl0ciA9IHZhbHVlLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgewotCQkJCQkJCU9iamVjdCBvID0gaXRyLm5leHQoKTsKLQkJCQkJCQlpZiAoICF2LmNvbnRhaW5zKG8pICkgewotCQkJCQkJCQl2LmFkZChvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2OwotCX0KLQkJCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJCi0JCWlmICggIXN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSkgKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmICggIWlzVGFza09wcG9zaXRlRmVhdHVyZShmZWF0dXJlKSB8fCAhKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IChMaXN0KXZhbHVlOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgaXRlbXMuc2l6ZSgpICkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbXMuZ2V0KGkpOwotCQkJU3RyaW5nIHBhdGggPSBzdXBlci5tYWtlUGF0aChnZXRTdXBlckFjdGl2aXR5UGF0aCgpLCBlKTsKLQkJCVRhc2tEZXNjcmlwdG9yTGF5b3V0IHRsID0gKFRhc2tEZXNjcmlwdG9yTGF5b3V0KWxheW91dE1hbmFnZXIuY3JlYXRlTGF5b3V0KGUsIG93bmluZ1Byb2Nlc3MsIHBhdGgpOwotCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCBudWxsLCBmYWxzZSk7CQkJCi0JCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCBudWxsLCBmYWxzZSk7CQkJCQkJCi0JCQl9IGVsc2UgaWYgKCBmZWF0dXJlID09IEFzc29jaWF0aW9uSGVscGVyLlJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkgbyA9IHRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIG51bGwsIGZhbHNlKTsJCQkJCQkKLQkJCX0KLQkJCQotCQkJaWYgKCAobyA9PSB0aGlzLmVsZW1lbnQpIHx8IChvIGluc3RhbmNlb2YgTGlzdCkgJiYgKChMaXN0KW8pLmNvbnRhaW5zKHRoaXMuZWxlbWVudCkgKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQl9Ci0JCX0KLQotCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1JvbGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQ2MzM2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvUm9sZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Db21wYXJhdG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLk1ldGhvZEVsZW1lbnREaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5kaWFncmFtLlJvbGVEaWFncmFtUHVibGlzaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBSb2xlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJvbGVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHJvdGVjdGVkIE1hcCByZWZlcmVuY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIFJvbGVMYXlvdXQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJWG1sRWxlbWVudCBlbGVtZW50WG1sID0gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBwZXJmb3JtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQlzdXBlci5lbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJcmVmZXJlbmNlTWFwLnB1dCgicGVyZm9ybXMiLCBwZXJmb3Jtcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gTk8sIHRoaXMgaXMgd3JvbmchIHNob3VsZCBjYWxjdWxhdGUgdGhlIHJlYWxpemVkIGZlYXR1cmUgdmFsdWUhCi0JCQkvLyBtb3ZlZCB0byBhY2NlcHRGZWF0dXJlVmFsdWUgdG8gZ2V0IHRoZSByZWFsaXplZCB2YWx1ZSBhbmQgc2F2ZSB0bwotCQkJLy8gdGhlIG1hcAotCQkJLy8gaWYgKHN1cGVyLmVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlSW1wbCkKLQkJCS8vIHsKLQkJCS8vIHJlZmVyZW5jZU1hcC5wdXQoInJlc3BvbnNpYmxlRm9yIiwKLQkJCS8vICgoUm9sZUltcGwpc3VwZXIuZWxlbWVudCkuZ2V0UmVzcG9uc2libGVGb3IoKSk7Ci0JCQkvLyB9Ci0KLQkJCUxpc3QgYWRkaXRpb25hbGx5UGVyZm9ybXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9TZWNvbmRhcnlfVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJLy8gcmVmZXJlbmNlTWFwLnB1dCgiYWRkaXRpb25hbGx5UGVyZm9ybXMiLCBhZGRpdGlvbmFsbHlQZXJmb3Jtcyk7Ci0JCQkvLyAvLyROT04tTkxTLTEkCi0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlJvbGVfU2Vjb25kYXJ5X1Rhc2tzLCBlbGVtZW50WG1sLAotCQkJCQkiYWRkaXRpb25hbGx5UGVyZm9ybXMiLCBhZGRpdGlvbmFsbHlQZXJmb3Jtcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVJvbGVEaWFncmFtUHVibGlzaGVyIGRpYWdyYW1QdWJsaXNoZXIgPSBuZXcgUm9sZURpYWdyYW1QdWJsaXNoZXIoKTsKLQkJCU1ldGhvZEVsZW1lbnREaWFncmFtIGRpYWdyYW0gPSBkaWFncmFtUHVibGlzaGVyLnB1Ymxpc2godGhpcywKLQkJCQkJbmV3IEZpbGUobGF5b3V0TWFuYWdlci5nZXRQdWJsaXNoRGlyKCkpKTsKLQotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkKLQkJCQllbGVtZW50WG1sLnNldENvbnRlbnQoImRpYWdyYW0iLCBkaWFncmFtLmdldEhUTUwoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCByb2xlU2V0cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQlzdXBlci5lbGVtZW50LCBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVTZXRzLAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0cywgZWxlbWVudFhtbCwKLQkJCQkJInJvbGVTZXRzIiwgcm9sZVNldHMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCS8vIGFkZCB0aGUgZGVzY3JpcHRvcnMgcmVmZXJlbmNpbmcgdGhpcyBlbGVtZW50Ci0JCQlzdXBlci5wcm9jZXNzRGVzY3JpcHRvcnMoZWxlbWVudFhtbCk7Ci0JCQkKLQkJfQotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldFBlcmZvcm1zKCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgcmVmZXJlbmNlTWFwLmdldCgicGVyZm9ybXMiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtcygpIHsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIHJlZmVyZW5jZU1hcC5nZXQoImFkZGl0aW9uYWxseVBlcmZvcm1zIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBDb21wYXJhdG9ycy5QUkVTRU5UQVRJT05fTkFNRV9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGxpc3Q7CQkKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJTGlzdCBsaXN0ID0gIChMaXN0KSByZWZlcmVuY2VNYXAuZ2V0KCJyZXNwb25zaWJsZUZvciIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgQ29tcGFyYXRvcnMuUFJFU0VOVEFUSU9OX05BTUVfQ09NUEFSQVRPUik7Ci0JCXJldHVybiBsaXN0OwkJCi0JfQotCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZXMoKSB7Ci0JCUxpc3QgbGlzdCA9ICAoTGlzdCkgcmVmZXJlbmNlTWFwLmdldCgibW9kaWZpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIENvbXBhcmF0b3JzLlBSRVNFTlRBVElPTl9OQU1FX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gbGlzdDsJCQotCX0KLQotCS8qKgotCSAqIHNvbWUgbGF5b3V0IG5lZWQgdG8gaGF2ZSB0aGUgZmVhdHVyZSB2YWx1ZXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4gU28KLQkgKiB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgZmVhdHVyZSBpcyBjYWxjdWxhdGVkIGluIHRoaXMgYWJzdHJhY3QKLQkgKiBjbGFzcwotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RmVhdHVyZVZhbHVlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJcmVmZXJlbmNlTWFwLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogc29tZSBsYXlvdXQgbmVlZCB0byBoYXZlIHRoZSBmZWF0dXJlIHZhbHVlcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiBTbwotCSAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBmZWF0dXJlIGlzIGNhbGN1bGF0ZWQgaW4gdGhpcyBhYnN0cmFjdAotCSAqIGNsYXNzCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRGZWF0dXJlVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQotCQkvLyBzYXZlIHRoZSBmZWF0dXJlIHZhbHVlIGZvciBkaWFncmFtIGdlbmVyYXRpb24KLQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpKSB7Ci0JCQlyZWZlcmVuY2VNYXAucHV0KCJyZXNwb25zaWJsZUZvciIsIHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0RmVhdHVyZVZhbHVlKE9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCB2YWx1ZSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NHcmFuZENoaWxkKE9iamVjdCBmZWF0dXJlLAotCQkJTWV0aG9kRWxlbWVudCBjaGlsZEVsZW1lbXQsIElFbGVtZW50TGF5b3V0IGNoaWxkTGF5b3V0LAotCQkJWG1sRWxlbWVudCBjaGlsZFhtbEVsZW1lbnQpIHsKLQkJaWYgKCEoY2hpbGRMYXlvdXQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdExheW91dCkKLQkJCQl8fCBjaGlsZFhtbEVsZW1lbnQgPT0gbnVsbAotCQkJCXx8ICEoY2hpbGRFbGVtZW10IGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgKChXb3JrUHJvZHVjdCljaGlsZEVsZW1lbXQpLmdldElzQWJzdHJhY3QoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlXb3JrUHJvZHVjdExheW91dCB3cENoaWxkTGF5b3V0ID0gKFdvcmtQcm9kdWN0TGF5b3V0KSBjaGlsZExheW91dDsKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gd3BDaGlsZExheW91dC5sYXlvdXRNYW5hZ2VyCi0JCQkJLmdldEVsZW1lbnRSZWFsaXplcigpOwotCi0JCWlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSB8fAotCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCkpIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvRnVsZmlsbGluZ0ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50czsKLQkJCUxpc3QgaXRlbXMgPSB3cENoaWxkTGF5b3V0LmNhbGMwbkZlYXR1cmVWYWx1ZShjaGlsZEVsZW1lbXQsIG9GdWxmaWxsaW5nRmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkJd3BDaGlsZExheW91dC5hZGRSZWZlcmVuY2VzKG9GdWxmaWxsaW5nRmVhdHVyZSwgY2hpbGRYbWxFbGVtZW50LCBvRnVsZmlsbGluZ0ZlYXR1cmUKLQkJCQkJLmdldE5hbWUoKSwgaXRlbXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N0ZXBMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3RlcExheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWRjMThiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3RlcExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBTdGVwTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VtbWFyeVBhZ2VMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvU3VtbWFyeVBhZ2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5MjhlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1bW1hcnlQYWdlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogVGhlIGxheW91dCBmb3IgYSBzdW1tYXJ5IHBhZ2Ugb2YgYW4gZWxlbWVudC4KLSAqIDxwPgotICogVGhlIHN1bW1hcnlwYWdlIGxheW91dCBhIGxpc3Qgb2YgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGUgb3duZXIgZWxlbWVudAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdW1tYXJ5UGFnZUxheW91dCBpbXBsZW1lbnRzIElFbGVtZW50TGF5b3V0IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVFlQRSA9ICJTdW1tYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9YU0wgPSAic3VtbWFyeS54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyOwotCi0JTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JTGlzdCByZWZMaXN0OwotCi0JU3RyaW5nIHRpdGxlOwotCQotCVN0cmluZyBwcmVmaXg7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0KLQlwcml2YXRlIEh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCQotCS8vIFN0cmluZyBmaWxlTmFtZTsKLQlJRWxlbWVudExheW91dCBlbGVtZW50TGF5b3V0OwotCi0vLwlwdWJsaWMgU3VtbWFyeVBhZ2VMYXlvdXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwKLS8vCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGl0bGUsIExpc3QgcmVmTGlzdCkgewotLy8JCXRoaXMubGF5b3V0TWFuYWdlciA9IGxheW91dE1hbmFnZXI7Ci0vLwkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLS8vCQl0aGlzLnJlZkxpc3QgPSByZWZMaXN0OwotLy8JCXRoaXMudGl0bGUgPSB0aXRsZTsKLS8vCi0vLwkJdGhpcy5lbGVtZW50TGF5b3V0ID0gbGF5b3V0TWFuYWdlci5nZXRMYXlvdXQoZWxlbWVudCwgdHJ1ZSk7Ci0vLwl9Ci0JcHVibGljIFN1bW1hcnlQYWdlTGF5b3V0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB0aXRsZSwgTGlzdCByZWZMaXN0KSB7Ci0JCXRoaXMobGF5b3V0TWFuYWdlciwgZWxlbWVudCwgcHJlZml4LCB0aXRsZSwgcmVmTGlzdCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBTdW1tYXJ5UGFnZUxheW91dChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGl0bGUsIAotCQkJTGlzdCByZWZMaXN0LCBTdHJpbmcgdHlwZU5hbWUpIAotCXsKLQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCQl0aGlzLmxheW91dE1hbmFnZXIgPSBsYXlvdXRNYW5hZ2VyOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnJlZkxpc3QgPSByZWZMaXN0OwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCXRoaXMucHJlZml4ID0gKHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgcHJlZml4LmluZGV4T2YoIm51bGwiKSA8IDApID8gcHJlZml4IDogIlN1bW1hcnkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQl0aGlzLmVsZW1lbnRMYXlvdXQgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChlbGVtZW50LCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZWxlbWVudC5nZXRHdWlkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gTEFZT1VUX1RZUEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gZWxlbWVudExheW91dC5nZXRGaWxlUGF0aCgpCi0JCQkJKyBnZXRGaWxlTmFtZShSZXNvdXJjZUhlbHBlci5GSUxFX0VYVF9IVE1MKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXBlaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtaWNvblVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYc2xVcmwoKSB7Ci0JCXJldHVybiBMQVlPVVRfWFNMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja1BhdGgoKSB7Ci0JCXJldHVybiBlbGVtZW50TGF5b3V0LmdldEJhY2tQYXRoKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZVBhdGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXRoKElFbGVtZW50TGF5b3V0IHJlbGF0aXZlVG8pIHsKLQkJcmV0dXJuIGVsZW1lbnRMYXlvdXQuZ2V0RmlsZVBhdGgocmVsYXRpdmVUbyk7Ci0JfQotCi0vLwlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBleHQpIHsKLS8vCQlyZXR1cm4gU3RyVXRpbC5tYWtlVmFsaWRGaWxlTmFtZSh0aXRsZSArICJfIikgKyBlbGVtZW50TGF5b3V0LmdldEZpbGVOYW1lKGV4dCk7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgZXh0KSB7Ci0JCXJldHVybiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKHByZWZpeCArICJfIikgKyBlbGVtZW50TGF5b3V0LmdldEZpbGVOYW1lKGV4dCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiBsYXlvdXRNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0I2dldFhtbEVsZW1lbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCi0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IG5ldyBYbWxFbGVtZW50KCJFbGVtZW50IikgLy8kTk9OLU5MUy0xJAotCQkJCS5zZXRBdHRyaWJ1dGUoIlR5cGUiLCBnZXRUeXBlKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJOYW1lIiwgZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiVXJsIiwgZ2V0VXJsKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJCYWNrUGF0aCIsIGdldEJhY2tQYXRoKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkuc2V0QXR0cmlidXRlKCJJbWFnZVVybCIsIGdldFNoYXBlaWNvblVybCgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgiRGlzcGxheU5hbWUiLCBnZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYgKHR5cGVOYW1lICE9IG51bGwpIHsKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJUeXBlTmFtZSIsIHR5cGVOYW1lKTsKLQkJfQotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJCi0JCQlTdHJpbmcgY29weXJpZ2h0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KGVsZW1lbnQsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCWlmIChjb3B5cmlnaHQgIT0gbnVsbCAmJiBjb3B5cmlnaHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZWxlbWVudFhtbC5uZXdDaGlsZCgiY29weXJpZ2h0Iikuc2V0VmFsdWUoY29weXJpZ2h0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlYbWxFbGVtZW50IHJlZlhtbCA9IGVsZW1lbnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2VMaXN0Iikuc2V0QXR0cmlidXRlKCJuYW1lIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVmTGlzdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IGUgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgZTsKLQkJCQkJbWUgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KG1lLAotCQkJCQkJCWxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKG1lICE9IG51bGwpIHsKLQkJCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChtZSwgdHJ1ZSk7Ci0JCQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCQkJLy8gZG9uJ3QgaW5jbHVkZSB0aGUgcmVmZXJlbmNlcyBvZiB0aGUgcmVmZXJlY2VkCi0JCQkJCQkJLy8gZWxlbWVudHMsIG90aGVyd2lzZSwgbWF5IGNhdXNlIGRlYWRsb2NrCi0JCQkJCQkJcmVmWG1sLmFkZENoaWxkKGwuZ2V0WG1sRWxlbWVudChmYWxzZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgewotCQkJCQlQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyIHByb3ZpZGVyID0gKFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIpIGU7Ci0JCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBuZXcgU3VtbWFyeVBhZ2VMYXlvdXQoZ2V0TGF5b3V0TWdyKCksCi0JCQkJCQkJcHJvdmlkZXIuZ2V0UHJhY3RpY2UoKSwgcHJvdmlkZXIuZ2V0VGV4dChudWxsKSwKLQkJCQkJCQlwcm92aWRlci5nZXRUZXh0KG51bGwpLCAoTGlzdCkgcHJvdmlkZXIKLQkJCQkJCQkJCS5nZXRDaGlsZHJlbihudWxsKSwgcHJvdmlkZXIuZ2V0VGV4dChudWxsKSk7Ci0JCQkJCXJlZlhtbC5hZGRDaGlsZChsLmdldFhtbEVsZW1lbnQoZmFsc2UpKTsKLQkJCQkJCi0JCQkJCS8vVGhpcyBpcyBhIHNob3J0IGN1dCBhcHByb2FjaC4KLQkJCQkJLy9UbyBkbzogZ2VuZXJhbGl6ZSBsYXlvdXRNYW5hZ2VyIHRvIGhhbmRsZSBub24gbWV0aG9kIGVsZW1lbnQgbGF5b3V0cwotCQkJCQlpZiAoIXRoaXMubGF5b3V0TWFuYWdlci5pc1B1Ymxpc2hpbmdNb2RlKCkgJiYgaHRtbEJ1aWxkZXIgIT0gbnVsbCkgewotCQkJCQkJaHRtbEJ1aWxkZXIuZ2VuZXJhdGVIdG1sKGwpOwkJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TGF5b3V0cygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIGxheW91dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKExheW91dEluZm8gaW5mbywgU3RyaW5nIGV4dCkgewotCQlyZXR1cm4gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZU5hbWUoZWxlbWVudCwgbnVsbCwgaW5mby5uYW1lLCBleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUYXJnZXQoTWV0aG9kRWxlbWVudCB0YXJnZXRFbGVtZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE93bmVyKE1ldGhvZEVsZW1lbnQgb3duZXIpIHsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgaHRtbCBjb250ZW50IGdlbmVyYXRlZCBmcm9tIHRoaXMgeHNsIGZpbGUgbmVlZHMgdG8gYmUgc2Nhbm5lZCBvciBub3QKLQkgKiBzY2FuIHRoZSBjb250ZW50IGlzIGZvciBpZGVudGlmeWluZyBlbGVtZW50IHJlZmVyZW5jZXMgaW4gdGhlIGNvbnRlbnQgYW5kIGNvcHkgb3ZlciByZXNvdXJjZSBmaWxlcwotCSAqIGluIHNvbWUgY2FzZXMgd2UgZG9uJ3QgbmVlZCB0byBzY2FuIHRoZSBjb250ZW50LCBmb3IgZXhhbXBsZSwgdGhlIGFjdGl2aXR5IGJyZWFrZG93biBzdHJ1Y3R1cmUKLQkgKiAKLQkgKiBAcGFyYW0geHNsVXJsIHRoZSB4c2wgdGhhdCBodG1sIGlzIGdlbmVyYXRlZCBmcm9tLCBudWxsIGZvciB0aGUgZGVmYXVsdCB4c2wgbGF5b3V0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbmVlZENvbnRlbnRTY2FuKFN0cmluZyB4c2xVcmwpCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNob3dFbGVtZW50TGluayhib29sZWFuIHNob3cpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIdG1sQnVpbGRlcihIdG1sQnVpbGRlciBodG1sQnVpbGRlcikgewotCQl0aGlzLmh0bWxCdWlsZGVyID0gaHRtbEJ1aWxkZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1cHBvcnRpbmdNYXRlcmlhbExheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9TdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzMDlkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1N1cHBvcnRpbmdNYXRlcmlhbExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBTdXBwb3J0aW5nIE1hdGVyaWFsLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBwb3J0aW5nTWF0ZXJpYWxMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRMYXlvdXQgewotCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCUxpc3QgYWN0aXZpdGllcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlN1cHBvcnRpbmdNYXRlcmlhbF9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cywgZWxlbWVudFhtbCwgImNvbnRlbnRFbGVtZW50cyIsIGNvbnRlbnRFbGVtZW50cyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tEZXNjcmlwdG9yTGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rhc2tEZXNjcmlwdG9yTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWY2ZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrRGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlN1cHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgbGF5b3V0IGZvciBhIFRhc2tEZXNjcmlwdG9yLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9yTGF5b3V0IGV4dGVuZHMgRGVzY3JpcHRvckxheW91dCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZXh0cmFGZWF0dXJlc0Zyb21UYXNrID0gQXJyYXlzLmFzTGlzdChuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpCi0JfSk7Ci0JCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yTGF5b3V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRYbWxFbGVtZW50KGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQjbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCkpIHsKLQkJCQkJLy8gbmVlZCB0byBoYW5kbGUgdGhlIHN0ZXAgY29udGVudHMgYnkgZml4aW5nIHRoZSBsaW5rcwotCQkJCQlwcm9jZXNzU3RlcHMoZWxlbWVudFhtbCwgaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCQkJfSBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSkgewotCQkJCQlzdXBlci5sb2FkV29ya09yZGVyKGVsZW1lbnRYbWwpOwotCQkJCX0gZWxzZSBpZiAoZmVhdHVyZS5nZXRFVHlwZSgpIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJCWxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCi0JCWlmICgoc3VwZXIuZWxlbWVudExheW91dCAhPSBudWxsICkgJiYgbGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSApIHsKLQkJCS8vIGFsc28gbG9hZCB0aGUgbGlua2VkIGVsZW1lbnQgcmVmZXJlbmNlZCBpbmZvcm1hdGlvbgotCQkJZm9yIChJdGVyYXRvcjxFU3RydWN0dXJhbEZlYXR1cmU+IGl0ZXJhdG9yID0gZ2V0RXh0cmFGZWF0dXJlc0Zyb21Db250ZW50RWxlbWVudCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlzdXBlci5lbGVtZW50TGF5b3V0LmxvYWRGZWF0dXJlKGZlYXR1cmUsIGVsZW1lbnRYbWwsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzU3RlcHMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQotCQkvLyAxOTYwOTQgLSBUYXNrIGRlc2NyaXB0b3IgcGFnZSBzaG91bGQgc2hvdyB0aGUgcmVhbGl6ZWQgY29udGVudCBvZiB0aGUgbGlua2VkIGVsZW1lbnQKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpOwotCQlTdHJpbmcgZmVhdHVyZV9uYW1lID0gZmVhdHVyZS5nZXROYW1lKCk7Ci0KLQkJTGlzdCBpdGVtczsKLQkJCi0JCS8vIHBlciBQZXRlciwgdGhpcyBpcyBub3QgdGhlIHJpZ2h0IGJlaGF2aW9yCi0JCS8vIGRlc2NyaXB0b3JzIHNob3VsZCBhbHdheXMgc2hvdyB0aGUgc2VsZWN0ZWQgc3RlcHMgb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQKLQkJLy8gaXQgc2hvdWxkIG5vdCBzaG93IHRoZSByZWFsaXplZCBzdGVwcwotCQkvLyBzbyByb2xsYmFjayB0byB0aGUgb2xkIGJlaGF2aW9yCi0JCS8vIEppbmh1YSBYaSAwOC8yOC8wNwotCQkvKgotCQlpZiAoIGxheW91dE1hbmFnZXIuZ2V0VmFsaWRhdG9yKCkuc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkpIHsKLQkJCWlmIChsaW5rZWRFbGVtZW50ID09IG51bGwpIHsKLQkJCQlpdGVtcyA9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCQkJCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUobGlua2VkRWxlbWVudCwgZiwKLQkJCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCX0KLQotCQl9IGVsc2UgCi0JCSovCi0JCXsKLQkJCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQl9Ci0JCQotCQlYbWxFbGVtZW50IHN0ZXBYbWwgPSBlbGVtZW50WG1sCi0JCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2VMaXN0Iikuc2V0QXR0cmlidXRlKCJuYW1lIiwgZmVhdHVyZV9uYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaWYgKGl0ZW1zICE9IG51bGwgJiYgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3QgZSA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBlOwotCQkJCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChtZSwKLQkJCQkJCQlsYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCUlFbGVtZW50TGF5b3V0IGwgPSBsYXlvdXRNYW5hZ2VyLmdldExheW91dChtZSwgdHJ1ZSk7Ci0JCQkJCQlpZiAobCAhPSBudWxsKSB7Ci0JCQkJCQkJbC5zZXRDb250ZW50VGFyZ2V0KGVsZW1lbnQpOwotCQkJCQkJCXN0ZXBYbWwuYWRkQ2hpbGQobAotCQkJCQkJCQkJLmdldFhtbEVsZW1lbnQoQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJCQkJCQkuaXNEZXNjcmlwdGlvbkVsZW1lbnQobWUpID8gdHJ1ZQotCQkJCQkJCQkJCQk6IGluY2x1ZGVSZWZlcmVuY2VzKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKSB7Ci0JCUFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KGV4dHJhRmVhdHVyZXNGcm9tVGFzayk7Ci0JCWZlYXR1cmVzLmFkZEFsbChzdXBlci5nZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkpOwotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwcmVzc2VkKFN1cHByZXNzaW9uIHN1cCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQotCQkvLyBtYWtlIHN1cmUgYWxsIGNhc2VzIGFyZSBjb3ZlcmVkCi0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IgKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IHN1cGVyLm1ha2VQYXRoKHN1cGVyLmVsZW1lbnRQcm9jZXNzUGF0aCwgKE1ldGhvZEVsZW1lbnQpZWxlbWVudCk7Ci0JCQlTdHJpbmdbXSBwYXRocyA9IHN1cGVyLmdldFBhdGhBcnJheShwYXRoKTsKLQkJCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBsYXlvdXRNYW5hZ2VyLmdldENCU0FkYXB0ZXJGYWN0b3J5KCk7Ci0JCQlPYmplY3Qgd3JhcHBlciA9IHN1cC5nZXRPYmplY3RCeVBhdGgocGF0aHMsIGFkYXB0ZXJGYWN0b3J5KTsKLQkJCWlmICggd3JhcHBlciA9PSBudWxsICkgewotCQkJCXdyYXBwZXIgPSBlbGVtZW50OwotCQkJfQotCQkJCi0JCQlyZXR1cm4gc3VwLmlzU3VwcHJlc3NlZCh3cmFwcGVyLCBmZWF0dXJlKTsKLQkKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBzdXBlci5pc1N1cHByZXNzZWQoc3VwLCBmZWF0dXJlLCBlbGVtZW50KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGFza0xheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZmZkYTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9UYXNrTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFRhc2suCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFza0xheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVGFza0xheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCQlUYXNrIHRhc2sgPSAoVGFzaykgc3VwZXIuZWxlbWVudDsKLQkJCUxpc3QgcGVyZm9ybWluZ1JvbGVzID0gdGFzay5nZXRQZXJmb3JtZWRCeSgpOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXRvciA9IHBlcmZvcm1pbmdSb2xlcy5pdGVyYXRvcigpOyBpdG9yLmhhc05leHQoKTspIHsKLQkJCQlSb2xlIHBlcmZvcm1pbmdSb2xlID0gKFJvbGUpIGl0b3IubmV4dCgpOwotCQkJCWlmIChwZXJmb3JtaW5nUm9sZSAhPSBudWxsKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgcm9sZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIHBlcmZvcm1pbmdSb2xlLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJCQkuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHJvbGVOYW1lID0gKChSb2xlKSByb2xlKS5nZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQkJCQlpZiAocm9sZU5hbWUgPT0gbnVsbCB8fCByb2xlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJcm9sZU5hbWUgPSByb2xlLmdldE5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJwZXJmb3JtaW5nUm9sZU5hbWUiLCByb2xlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWFkZFJlZmVyZW5jZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCksIGVsZW1lbnRYbWwsICJwZXJmb3JtaW5nUm9sZSIsIHJvbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQotCQkJLy8gY2FsY3VsYXRlIHRoZSBjYXRlZ29yaWVzIG9wcG9zaXRlIGZlYXR1cmUKLQkJCS8vIG11bHRpcGxpY2l0eSBjaGFuZ2UgZm9yIG9wcG9zaXRlIGZlYXR1cmVzCi0JCQlMaXN0IGRpc2NpcGxpbmVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLlRhc2tfRGlzY2lwbGluZXMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5UYXNrX0Rpc2NpcGxpbmVzLCBlbGVtZW50WG1sLCAiZGlzY2lwbGluZXMiLCBkaXNjaXBsaW5lcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCB1c2VyY2F0ZWdvcmllcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotCQkJCQlzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5EZXNjcmliYWJsZUVsZW1lbnRfQ3VzdG9tQ2F0ZWdvcmllcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlwcm9jZXNzQ2hpbGQoQXNzb2NpYXRpb25IZWxwZXIuRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMsIAotCQkJCQllbGVtZW50WG1sCi0JCQkJCQkJLm5ld0NoaWxkKCJyZWZlcmVuY2VMaXN0Iikuc2V0QXR0cmlidXRlKCJuYW1lIiwgImN1c3RvbUNhdGVnb3JpZXMiKSwgdXNlcmNhdGVnb3JpZXMsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJLy8gYWRkIHRoZSBkZXNjcmlwdG9ycyByZWZlcmVuY2luZyB0aGlzIGVsZW1lbnQKLQkJCXN1cGVyLnByb2Nlc3NEZXNjcmlwdG9ycyhlbGVtZW50WG1sKTsKLQotCQl9Ci0JCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKCJTaG93RnVsbE1ldGhvZENvbnRlbnQiLCAobGF5b3V0TWFuYWdlci5nZXRWYWxpZGF0b3IoKS5zaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzR3JhbmRDaGlsZChPYmplY3QgZmVhdHVyZSwKLQkJCU1ldGhvZEVsZW1lbnQgY2hpbGRFbGVtZW10LCBJRWxlbWVudExheW91dCBjaGlsZExheW91dCwKLQkJCVhtbEVsZW1lbnQgY2hpbGRYbWxFbGVtZW50KSB7Ci0JCWlmICghKGNoaWxkTGF5b3V0IGluc3RhbmNlb2YgV29ya1Byb2R1Y3RMYXlvdXQpCi0JCQkJfHwgY2hpbGRYbWxFbGVtZW50ID09IG51bGwKLQkJCQl8fCAhKGNoaWxkRWxlbWVtdCBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghICgoV29ya1Byb2R1Y3QpY2hpbGRFbGVtZW10KS5nZXRJc0Fic3RyYWN0KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJV29ya1Byb2R1Y3RMYXlvdXQgd3BDaGlsZExheW91dCA9IChXb3JrUHJvZHVjdExheW91dCkgY2hpbGRMYXlvdXQ7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IHdwQ2hpbGRMYXlvdXQubGF5b3V0TWFuYWdlcgotCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKTsKLQotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCkgfHwKLQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCkgfHwKLQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKSkgewotCQkJT3Bwb3NpdGVGZWF0dXJlIG9GdWxmaWxsaW5nRmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLkZ1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzOwotCQkJTGlzdCBpdGVtcyA9IHdwQ2hpbGRMYXlvdXQuY2FsYzBuRmVhdHVyZVZhbHVlKGNoaWxkRWxlbWVtdCwgb0Z1bGZpbGxpbmdGZWF0dXJlLCByZWFsaXplcik7Ci0JCQl3cENoaWxkTGF5b3V0LmFkZFJlZmVyZW5jZXMob0Z1bGZpbGxpbmdGZWF0dXJlLCBjaGlsZFhtbEVsZW1lbnQsIG9GdWxmaWxsaW5nRmVhdHVyZQotCQkJCQkuZ2V0TmFtZSgpLCBpdGVtcyk7Ci0JCX0KLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVhbVByb2ZpbGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVhbVByb2ZpbGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlYTM0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlYW1Qcm9maWxlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotCi0KLS8qKgotICogVGVhbSBQcm9maWxlIGxheW91dCBmb3IgYnJvd3NpbmcKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVMYXlvdXQgZXh0ZW5kcyBBYnN0cmFjdFByb2Nlc3NFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBUZWFtUHJvZmlsZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlyZXR1cm4gc3VwZXIuZ2V0WG1sRWxlbWVudChpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JfQotCS8qKgotCSAqIGxvYWQgdGhlIG5vbi1hdHRyaWJ1dGUgZmVhdHVyZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIGVsZW1lbnRYbWwKLQkgKiBAcGFyYW0gaW5jbHVkZVJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkRmVhdHVyZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgWG1sRWxlbWVudCBlbGVtZW50WG1sLAotCQkJYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlpZiAoIShmZWF0dXJlLmdldEVUeXBlKCkgaW5zdGFuY2VvZiBFQ2xhc3MpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0TmFtZSgpOwotCi0JCWlmICghZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJZmVhdHVyZSwgbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkvLyBCcm93c2luZyBzdG9wcyB3b3JraW5nIHdoZW4gYSByb2xlIGlzIHNldCB0bwotCQkJLy8gcmVwbGFjZWQgYW5vdGhlciByb2xlCi0JCQkvLyBmb3IgcmVwbGFjZXIsIHRoZSBiYXNlIHdpbGwgYmUgZXZhbHVhdGVkIHRvIHRoZSByZXBsYWNlcgotCQkJLy8gYW5kIGNhdXNpbmcgZGVhZGxvY2sKLQkJCWlmIChlICE9IG51bGwgJiYgZSAhPSBlbGVtZW50KSB7Ci0JCQkJYm9vbGVhbiBzaG93RGV0YWlsID0gKENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCS5pc0Rlc2NyaXB0aW9uRWxlbWVudChlKQotCQkJCS8qCi0JCQkJICogfHwgKHAgPT0KLQkJCQkgKiBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpKQotCQkJCSAqLykgPyB0cnVlIDogaW5jbHVkZVJlZmVyZW5jZXM7Ci0KLQkJCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCBlKSApIHsKLQkJCQkJcHJvY2Vzc0NoaWxkKGZlYXR1cmUsIAotCQkJCQkJCWVsZW1lbnRYbWwKLQkJCQkJCQkJCS5uZXdDaGlsZCgicmVmZXJlbmNlIikuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSksIGUsIHNob3dEZXRhaWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJaWYgKGlzQnJlYWtkb3duRWxlbWVudF9HdWlkYW5jZXMoZmVhdHVyZSkpIHsKLQkJCQlzdXBlci5sb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJTGlzdCBwdiA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCUxpc3Qgcm9sZURlc2NMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKChwdiAhPSBudWxsKSAmJiAoIXB2LmlzRW1wdHkoKSkpCi0JCQl7Ci0JCQkJZm9yIChJdGVyYXRvciBpdG9yPXB2Lml0ZXJhdG9yKCk7IGl0b3IuaGFzTmV4dCgpOykKLQkJCQl7Ci0JCQkJCU9iamVjdCBvYmogPSBpdG9yLm5leHQoKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSAKLQkJCQkJewotCQkJCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2MgPSAoUm9sZURlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmICgocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkKLQkJCQkJCQl8fCAocm9sZURlc2MuZ2V0U3VwZXJBY3Rpdml0aWVzKCkgPT0gbnVsbCkpCi0JCQkJCQkJcm9sZURlc2NMaXN0LmFkZChvYmopOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIGFjY2VwdEZlYXR1cmVWYWx1ZShmZWF0dXJlLCByb2xlRGVzY0xpc3QpICYmIHJvbGVEZXNjTGlzdC5zaXplKCkgPiAwICkgewotCQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgbmFtZSwgcm9sZURlc2NMaXN0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVtcGxhdGVMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVGVtcGxhdGVMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzY2QyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1RlbXBsYXRlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLQotLyoqCi0gKiBUaGUgZWxlbWVudCBsYXlvdXQgZm9yIGEgVGVtcGxhdGUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBUZW1wbGF0ZUxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuVGVtcGxhdGVfV29ya1Byb2R1Y3RzLCBsYXlvdXRNYW5hZ2VyCi0JCQkJCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuVGVtcGxhdGVfV29ya1Byb2R1Y3RzLCBlbGVtZW50WG1sLCAiY29udGVudEVsZW1lbnRzIiwgY29udGVudEVsZW1lbnRzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgc3VwZXIuZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ3VpZGFuY2UKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJCQotCQkJCS8vIEF1dGhvcmluZzogIFRlbXBsYXRlIGF0dGFjaG1lbnRzIG9mIGEgY29udHJpYnV0aW5nIHRlbXBsYXRlIGd1aWRhbmNlIGVsZW1lbnQgYXJlIG5vdCBhcHBlbmRlZCB0byB0aGUgYmFzZSBsaXN0IG9mIGF0dGFjaG1lbnRzCQkJCQotCQkJCS8vU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoKG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiljb250ZW50KS5nZXRBdHRhY2htZW50cygpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50cygpOwotCQkJCVN0cmluZyBhdHRhY2htZW50U3RyaW5nID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUoY29udGVudCwgc3VwZXIuZWxlbWVudCwgZmVhdHVyZSwgc3VwZXIubGF5b3V0TWFuYWdlci5nZXRDb25maWd1cmF0aW9uKCkpOwotCQkJCWlmICggKGF0dGFjaG1lbnRTdHJpbmcgIT0gbnVsbCkgJiYgKGF0dGFjaG1lbnRTdHJpbmcuaW5kZXhPZihDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IpID4gMCkgKQotCQkJCXsKLQkJCQkJYXR0YWNobWVudFN0cmluZyA9IGF0dGFjaG1lbnRTdHJpbmcucmVwbGFjZUFsbChDb25maWd1cmF0aW9uSGVscGVyLkFUVFJJQlVURV9WQUxVRV9TRVBFUkFUT1IsIFRuZ1V0aWwuR1VJREFOQ0VfRklMRVNUUklOR19TRVBBUkFUT1IpOyAKLQkJCQl9Ci0JCQkJTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoYXR0YWNobWVudFN0cmluZyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0YWNobWVudExpc3QuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIGF0dGFjaG1lbnRGaWxlID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChhdHRhY2htZW50RmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX3RlbXBsYXRlX2F0dGFjaG1lbnRfdXJsLm1hdGNoZXIoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJaWYgKCFtLmZpbmQoKSkgewotCQkJCQkJCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKGF0dGFjaG1lbnRGaWxlKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCAiZmlsZTovLyIgKyBhdHRhY2htZW50RmlsZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gbS5ncm91cCgyKTsKLQkJCQkJCQllbGVtZW50WG1sLm5ld0NoaWxkKCJhdHRyaWJ1dGUiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSJhdHRhY2hlZEZpbGUiKS5zZXRBdHRyaWJ1dGUoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSJ1cmwiLCBtLmdyb3VwKDEpKSAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkJLnNldEF0dHJpYnV0ZSgiZmlsZU5hbWUiLCBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBlbGVtZW50WG1sOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1Rvb2xNZW50b3JMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVG9vbE1lbnRvckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzUxOTExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvVG9vbE1lbnRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYSBUb29sIE1lbnRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckxheW91dCBleHRlbmRzIEFic3RyYWN0RWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgVG9vbE1lbnRvckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlpZiAoaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9UYXNrcywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLlRvb2xNZW50b3JfVGFza3MsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Q8TWV0aG9kRWxlbWVudD4gdG9vbHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSgKLQkJCQkJc3VwZXIuZWxlbWVudCwgQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9Ub29scywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlpbnQgc3ogPSB0b29scyA9PSBudWxsID8gMCA6IHRvb2xzLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3o7IGkrKykgewotCQkJCU1ldGhvZEVsZW1lbnQgdG9vbCA9IHRvb2xzLmdldChpKTsKLQkJCQlhZGRSZWZlcmVuY2UoQXNzb2NpYXRpb25IZWxwZXIuVG9vbE1lbnRvcl9Ub29scywgZWxlbWVudFhtbCwgInRvb2wiLCB0b29sKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1doaXRlcGFwZXJMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV2hpdGVwYXBlckxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWY3ZjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV2hpdGVwYXBlckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLS8qKgotICogVGhlIGVsZW1lbnQgbGF5b3V0IGZvciBhIFdoaXRlcGFwZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBXaGl0ZXBhcGVyTGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQkKLQlwdWJsaWMgV2hpdGVwYXBlckxheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdChFbGVtZW50TGF5b3V0TWFuYWdlciBsYXlvdXRNYW5hZ2VyLCBNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIuX19pbml0KGxheW91dE1hbmFnZXIsIGVsZW1lbnQpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dCNnZXRYbWxFbGVtZW50KGJvb2xlYW4pCi0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudChib29sZWFuIGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0JCVhtbEVsZW1lbnQgZWxlbWVudFhtbCA9IHN1cGVyLmdldFhtbEVsZW1lbnQoaW5jbHVkZVJlZmVyZW5jZXMpOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcykgewotCQkJTGlzdCBjb250ZW50RWxlbWVudHMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LCAKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIAotCQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQkJCQotCQkJTGlzdCBhY3Rpdml0aWVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9CcmVha2Rvd25FbGVtZW50cywgbGF5b3V0TWFuYWdlcgotCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0KLQkJCWNvbnRlbnRFbGVtZW50cy5hZGRBbGwoYWN0aXZpdGllcyk7Ci0KLQkJCWFkZFJlZmVyZW5jZXMoQXNzb2NpYXRpb25IZWxwZXIuQ29uY2VwdF9Db250ZW50RWxlbWVudHMsIGVsZW1lbnRYbWwsICJjb250ZW50RWxlbWVudHMiLCBjb250ZW50RWxlbWVudHMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUd1aWRhbmNlIGd1aWRhbmNlID0gKEd1aWRhbmNlKSBzdXBlci5lbGVtZW50OwotCQkJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnQgPSAoQ29udGVudERlc2NyaXB0aW9uKSBndWlkYW5jZQotCQkJCQkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCi0JCQkJLy8gQXV0aG9yaW5nOiAgVGVtcGxhdGUgYXR0YWNobWVudHMgb2YgYSBjb250cmlidXRpbmcgdGVtcGxhdGUgZ3VpZGFuY2UgZWxlbWVudCBhcmUgbm90IGFwcGVuZGVkIHRvIHRoZSBiYXNlIGxpc3Qgb2YgYXR0YWNobWVudHMJCQkJCi0JCQkJLy9TdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uKWNvbnRlbnQpLmdldEF0dGFjaG1lbnRzKCk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCk7Ci0JCQkJU3RyaW5nIGF0dGFjaG1lbnRTdHJpbmcgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjb250ZW50LCBzdXBlci5lbGVtZW50LCBmZWF0dXJlLCBzdXBlci5sYXlvdXRNYW5hZ2VyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCQkJaWYgKCAoYXR0YWNobWVudFN0cmluZyAhPSBudWxsKSAmJiAoYXR0YWNobWVudFN0cmluZy5pbmRleE9mKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUikgPiAwKSApCi0JCQkJewotCQkJCQlhdHRhY2htZW50U3RyaW5nID0gYXR0YWNobWVudFN0cmluZy5yZXBsYWNlQWxsKENvbmZpZ3VyYXRpb25IZWxwZXIuQVRUUklCVVRFX1ZBTFVFX1NFUEVSQVRPUiwgVG5nVXRpbC5HVUlEQU5DRV9GSUxFU1RSSU5HX1NFUEFSQVRPUik7IAotCQkJCX0KLQkJCQlMaXN0IGF0dGFjaG1lbnRMaXN0ID0gVG5nVXRpbC5jb252ZXJ0R3VpZGFuY2VBdHRhY2htZW50c1RvTGlzdChhdHRhY2htZW50U3RyaW5nKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRhY2htZW50TGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudEZpbGUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGF0dGFjaG1lbnRGaWxlICE9IG51bGwpIHsKLQkJCQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwubWF0Y2hlcihhdHRhY2htZW50RmlsZSk7Ci0JCQkJCQlpZiAoIW0uZmluZCgpKSB7Ci0JCQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVV0aWwuZ2V0RmlsZU5hbWUoYXR0YWNobWVudEZpbGUpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsICJmaWxlOi8vIiArIGF0dGFjaG1lbnRGaWxlKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlTdHJpbmcgZmlsZU5hbWUgPSBtLmdyb3VwKDIpOwotCQkJCQkJCWVsZW1lbnRYbWwubmV3Q2hpbGQoImF0dHJpYnV0ZSIpLnNldEF0dHJpYnV0ZSgibmFtZSIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJImF0dGFjaGVkRmlsZSIpLnNldEF0dHJpYnV0ZSggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJInVybCIsIG0uZ3JvdXAoMSkpIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCQkuc2V0QXR0cmlidXRlKCJmaWxlTmFtZSIsIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya0JyZWFrZG93bkVsZW1lbnRMYXlvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvV29ya0JyZWFrZG93bkVsZW1lbnRMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlNWQxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLQotLyoqCi0gKiBUaGUgbGF5b3V0IGZvciB3b3JrIGJyZWFrZG93biBFbGVtZW50cy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RQcm9jZXNzRWxlbWVudExheW91dCB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHRoZSB3b3Jrb3JkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IExpYnJhcnlVdGlsLmdldFN0cnVjdHVyYWxGZWF0dXJlcyhlbGVtZW50KTsKLS8vCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUuZ2V0RVR5cGUoKSBpbnN0YW5jZW9mIEVDbGFzcykgewotCQkJCQlpZiAoZmVhdHVyZSAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpKSB7Ci0JCQkJCQlsb2FkRmVhdHVyZShmZWF0dXJlLCBlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlzdXBlci5sb2FkV29ya09yZGVyKGVsZW1lbnRYbWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckxheW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5ZmJmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0RGVzY3JpcHRvckxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0b3JMYXlvdXQgZXh0ZW5kcyBEZXNjcmlwdG9yTGF5b3V0IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBleHRyYUZlYXR1cmVzRnJvbVdvcmtQcm9kdWN0ID0gQXJyYXlzLmFzTGlzdChuZXcgRVN0cnVjdHVyYWxGZWF0dXJlW10gewotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkKLQl9KTsKLQotCXB1YmxpYyB2b2lkIGluaXQoRWxlbWVudExheW91dE1hbmFnZXIgbGF5b3V0TWFuYWdlciwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLl9faW5pdChsYXlvdXRNYW5hZ2VyLCBlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BYnN0cmFjdEVsZW1lbnRMYXlvdXQjbG9hZFJlZmVyZW5jZXMoWG1sRWxlbWVudCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2FkUmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIGJvb2xlYW4gaW5jbHVkZVJlZmVyZW5jZXMpIHsKLQotCQlzdXBlci5sb2FkUmVmZXJlbmNlcyhlbGVtZW50WG1sLCBpbmNsdWRlUmVmZXJlbmNlcyk7Ci0JCQotCQkvLyAxNjEzMjUgLSBXUERlc2NyaXB0b3JzIGRpZCBub3Qgc2hvdyBtb2RpZnkgUm9sZURlc2NyaXB0b3JzCi0JCS8vIGdldCB0aGUgbW9kaWZpZXMgZmVhdHVyZQotCQkvLyB0aGlzIGd1eSBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlCi0JCS8vIHRoaXMgbWV0aG9kIGNhbGwgaXMgbm90IHNhZmUuIAotLy8JCUxpc3QgbW9kaWZ5Um9sZXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNNb2RpZnlSb2xlRGVzY3JpcHRvcnMoCi0vLwkJCQkoV29ya1Byb2R1Y3REZXNjcmlwdG9yKXN1cGVyLmVsZW1lbnQsIAotLy8JCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQotCQlMaXN0IG1vZGlmeVJvbGVzID0gY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycygpOwotCQkKLQkJYWRkUmVmZXJlbmNlcyhudWxsLCBlbGVtZW50WG1sLCAid29ya2VkT25CeSIsIG1vZGlmeVJvbGVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJaWYgKChzdXBlci5lbGVtZW50TGF5b3V0ICE9IG51bGwgKSAmJiBsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpICkgewotCQkJLy8gYWxzbyBsb2FkIHRoZSBsaW5rZWQgZWxlbWVudCByZWZlcmVuY2VkIGluZm9ybWF0aW9uCi0JCQlmb3IgKEl0ZXJhdG9yPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gaXRlcmF0b3IgPSBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCXN1cGVyLmVsZW1lbnRMYXlvdXQubG9hZEZlYXR1cmUoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmFsc2UpOwotCQkJfQotCi0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRFeHRyYUZlYXR1cmVzRnJvbUNvbnRlbnRFbGVtZW50KCkgewotCQlBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPiBmZWF0dXJlcyA9IG5ldyBBcnJheUxpc3Q8RVN0cnVjdHVyYWxGZWF0dXJlPihleHRyYUZlYXR1cmVzRnJvbVdvcmtQcm9kdWN0KTsKLQkJZmVhdHVyZXMuYWRkQWxsKHN1cGVyLmdldEV4dHJhRmVhdHVyZXNGcm9tQ29udGVudEVsZW1lbnQoKSk7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0JCi0JcHVibGljIExpc3QgY2FsY01vZGlmeVJvbGVEZXNjcmlwdG9ycygpIHsKLQkJCi0JCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCk7Ci0JCUxpc3QgdGFza0Rlc2NyaXB0b3JzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJZWxlbWVudCwgCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzLCAKLQkJCQlyZWFsaXplcik7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFza0Rlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlUYXNrRGVzY3JpcHRvciB0ID0gKFRhc2tEZXNjcmlwdG9yKWl0Lm5leHQoKTsKLQkJCQotCQkJLy8gbWFrZSBzdXJlIHRoZSB0YXNrIGRlc2NyaXB0b3IgaGFzIHRoZSBjdXJyZW50IHdwIGRlc2NyaXB0b3IgYXMgb3V0cHV0Ci0JCQlTdHJpbmcgcGF0aCA9IHN1cGVyLm1ha2VQYXRoKGdldFN1cGVyQWN0aXZpdHlQYXRoKCksIHQpOwotCQkJVGFza0Rlc2NyaXB0b3JMYXlvdXQgdGwgPSAoVGFza0Rlc2NyaXB0b3JMYXlvdXQpbGF5b3V0TWFuYWdlci5jcmVhdGVMYXlvdXQodCwgb3duaW5nUHJvY2VzcywgcGF0aCk7Ci0JCQlMaXN0IG91dHB1dHMgPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgbnVsbCwgZmFsc2UpOwotCQkJCi0JCQlpZiAoIG91dHB1dHMgIT0gbnVsbCAmJiBvdXRwdXRzLmNvbnRhaW5zKGVsZW1lbnQpICkgewkKLQkJCQlMaXN0IHJvbGVEZXNjcmlwdG9ycyA9IChMaXN0KSB0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgbnVsbCwgZmFsc2UpOwotCQkJCWlmIChyb2xlRGVzY3JpcHRvcnMgIT0gbnVsbCkgewotCQkJCWZvciAoSXRlcmF0b3IgaSA9IHJvbGVEZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJewotCQkJCQlSb2xlRGVzY3JpcHRvciByID0gKFJvbGVEZXNjcmlwdG9yKSBpLm5leHQoKTsKLQkJCQkJaWYgKCAociAhPSBudWxsKSAmJiAhbW9kaWZ5Um9sZXMuY29udGFpbnMocikgKSB7Ci0JCQkJCQltb2RpZnlSb2xlcy5hZGQocik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbW9kaWZ5Um9sZXM7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdEZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlpZiAoICFzdXBlci5hY2NlcHRGZWF0dXJlVmFsdWUoZmVhdHVyZSwgdmFsdWUpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoICFpc1Rhc2tPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSkgfHwgISh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUxpc3QgaXRlbXMgPSAoTGlzdCl2YWx1ZTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaSA8IGl0ZW1zLnNpemUoKSApIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KWl0ZW1zLmdldChpKTsKLQkJCVN0cmluZyBwYXRoID0gc3VwZXIubWFrZVBhdGgoZ2V0U3VwZXJBY3Rpdml0eVBhdGgoKSwgZSk7Ci0JCQlUYXNrRGVzY3JpcHRvckxheW91dCB0bCA9IChUYXNrRGVzY3JpcHRvckxheW91dClsYXlvdXRNYW5hZ2VyLmNyZWF0ZUxheW91dChlLCBvd25pbmdQcm9jZXNzLCBwYXRoKTsKLQkJCUxpc3QgbyA9IG51bGw7Ci0JCQlpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIG51bGwsIGZhbHNlKTsJCQkKLQkJCX0gZWxzZSBpZiAoIGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzICkgewotCQkJCW8gPSAoTGlzdCl0bC5nZXRGZWF0dXJlVmFsdWUoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyApIHsKLQkJCQlvID0gKExpc3QpdGwuZ2V0RmVhdHVyZVZhbHVlKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSBlbHNlIGlmICggZmVhdHVyZSA9PSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMgKSB7Ci0JCQkJbyA9IChMaXN0KXRsLmdldEZlYXR1cmVWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgbnVsbCwgZmFsc2UpOwkJCQotCQkJfSAKLQkJCQotCQkJaWYgKCAobyAhPSBudWxsKSAmJiBvLmNvbnRhaW5zKHRoaXMuZWxlbWVudCkgKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQl9Ci0JCX0KLQotCi0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQotCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkID0gbnVsbDsKLQkJV29ya1Byb2R1Y3Qgd3AgPSBudWxsOwotCi0JCWJvb2xlYW4gaXNTbG90ID0gZmFsc2U7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCXdwZCA9IChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIGdldEVsZW1lbnQoKTsKLQkJCXdwID0gd3BkLmdldFdvcmtQcm9kdWN0KCk7Ci0JCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCWlzU2xvdCA9IHdwLmdldElzQWJzdHJhY3QoKTsKLQkJCX0KLQkJfQotCQlpZiAoaXNTbG90KSB7Ci0JCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgKLQkJCQkJIlR5cGUiLCAiV29ya1Byb2R1Y3RTbG90Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWVsZW1lbnRYbWwuc2V0QXR0cmlidXRlKAotCQkJCQkiVHlwZU5hbWUiLCBMaWJyYXJ5UmVzb3VyY2VzLldvcmtQcm9kdWN0U2xvdF90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRU9iamVjdCBjb250YWluaW5nT2JqID0gd3BkLmVDb250YWluZXIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgY29udGFuaW5nUGtnID0gY29udGFpbmluZ09iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlID8gKFByb2Nlc3NQYWNrYWdlKSBjb250YWluaW5nT2JqCi0JCQkJOiBudWxsOwotCi0JCWlmIChpbmNsdWRlUmVmZXJlbmNlcyAmJiBjb250YW5pbmdQa2cgIT0gbnVsbCkgewotCQkJTGlzdDxQcm9jZXNzRWxlbWVudD4gcHJvY2Vzc0VsZW1lbnRzID0gY29udGFuaW5nUGtnCi0JCQkJCS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCU1hcDxXb3JrUHJvZHVjdCwgV29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cFdwZE1hcCA9IG5ldyBIYXNoTWFwPFdvcmtQcm9kdWN0LCBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KCk7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkKLQkJCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWZvciAoUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgOiBwcm9jZXNzRWxlbWVudHMpIHsKLQkJCQlpZiAocHJvY2Vzc0VsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZEVsZW0gPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBwcm9jZXNzRWxlbWVudDsKLQkJCQkJV29ya1Byb2R1Y3Qgd3BFbGVtZW50ID0gd3BkRWxlbS5nZXRXb3JrUHJvZHVjdCgpOwotCQkJCQlpZiAod3BFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCXdwRWxlbWVudCA9IChXb3JrUHJvZHVjdCkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHdwRWxlbWVudCwgY29uZmlnKTsKLQkJCQkJCWlmICh3cEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCXdwV3BkTWFwLnB1dCh3cEVsZW1lbnQsIHdwZEVsZW0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaXNTbG90KSB7Ci0JCQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHM7Ci0JCQkJTGlzdCBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQod3AsIGNvbmZpZyk7Ci0JCQkJTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHdwZExpc3QgPSBnZXRXcGRMaXN0KHdwV3BkTWFwLCBsaXN0KTsKLQkJCQlhZGRSZWZlcmVuY2VzKG9mZWF0dXJlLCBlbGVtZW50WG1sLCBvZmVhdHVyZS5nZXROYW1lKCksIHdwZExpc3QpOwotCQkJfSBlbHNlIGlmICh3cCAhPSBudWxsKSB7Ci0JCQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKTsKLQkJCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyCi0JCQkJCQkuY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscyh3cCwgY29uZmlnKTsKLQkJCQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BkTGlzdCA9IGdldFdwZExpc3Qod3BXcGRNYXAsIGxpc3QpOwotCQkJCWFkZFJlZmVyZW5jZXMoZmVhdHVyZSwgZWxlbWVudFhtbCwgZmVhdHVyZS5nZXROYW1lKCksIHdwZExpc3QpOwotCQkJCQotCQkJCWluY2x1ZGVTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLCB3cGRMaXN0KTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbmNsdWRlU2xvdFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sLCBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3Bkc1dpdGhzbG90cykgewotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpOwkJCi0JCQkJCi0JCWFkZFNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG9fVGFza0Rlc2NyaXB0b3JzLAotCQkJCSJtYW5kYXRvcnlJbnB1dFRvVGFza0Rlc2NyaXB0b3JzX2Zyb21TbG90cyIsIHdwZHNXaXRoc2xvdHMsIHJlYWxpemVyKTsJLy8kTk9OLU5MUy0xJAotCi0JCWFkZFNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMsCi0JCQkJIm9wdGlvbmFsSW5wdXRUb1Rhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiLCB3cGRzV2l0aHNsb3RzLCByZWFsaXplcik7CS8vJE5PTi1OTFMtMSQKLQotCQlhZGRTbG90UmVmZXJlbmNlcyhlbGVtZW50WG1sLAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tX1Rhc2tEZXNjcmlwdG9ycywKLQkJCQkib3V0cHV0RnJvbVRhc2tEZXNjcmlwdG9yc19mcm9tU2xvdHMiLCB3cGRzV2l0aHNsb3RzLCByZWFsaXplcik7CS8vJE5PTi1OTFMtMSQKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTbG90UmVmZXJlbmNlcyhYbWxFbGVtZW50IGVsZW1lbnRYbWwsIE9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSwgU3RyaW5nIHJlZmVyZW5jZU5hbWUsIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiB3cGRzV2l0aHNsb3RzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yIChXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkOiB3cGRzV2l0aHNsb3RzKSB7Ci0JCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh3cGQsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCQlyZWZlcmVuY2VzLmFkZEFsbChsaXN0KTsKLQkJfQotCi0JCWFkZFJlZmVyZW5jZXMob2ZlYXR1cmUsIGVsZW1lbnRYbWwsIHJlZmVyZW5jZU5hbWUsIHJlZmVyZW5jZXMpOyAKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0V3BkTGlzdChNYXA8V29ya1Byb2R1Y3QsIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gd3BXcGRNYXAsIExpc3Q8V29ya1Byb2R1Y3Q+IHdwTGlzdCkgewotCQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gcmV0ID0gbmV3IEFycmF5TGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KCk7Ci0JCWZvciAoV29ya1Byb2R1Y3Qgd3A6IHdwTGlzdCkgewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCA9IHdwV3BkTWFwLmdldCh3cCk7Ci0JCQlpZiAod3BkICE9IG51bGwpIHsKLQkJCQlyZXQuYWRkKHdwZCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0TGF5b3V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL1dvcmtQcm9kdWN0TGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZTU2YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9lbGVtZW50cy9Xb3JrUHJvZHVjdExheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotCi0vKioKLSAqIFRoZSBlbGVtZW50IGxheW91dCBmb3IgYW4gQXJ0aWZhY3QuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0TGF5b3V0IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50TGF5b3V0IHsKLQotCXB1YmxpYyBXb3JrUHJvZHVjdExheW91dCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KEVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1hbmFnZXIsIE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5fX2luaXQobGF5b3V0TWFuYWdlciwgZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUVsZW1lbnRMYXlvdXQjZ2V0WG1sRWxlbWVudChib29sZWFuKQotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IGdldFhtbEVsZW1lbnQoYm9vbGVhbiBpbmNsdWRlUmVmZXJlbmNlcykgewotCQlYbWxFbGVtZW50IGVsZW1lbnRYbWwgPSBzdXBlci5nZXRYbWxFbGVtZW50KGluY2x1ZGVSZWZlcmVuY2VzKTsKLQkJCi0JCWJvb2xlYW4gaXNTbG90ID0gZmFsc2U7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJV29ya1Byb2R1Y3Qgd3AgPSAoV29ya1Byb2R1Y3QpIGdldEVsZW1lbnQoKTsKLQkJCWlzU2xvdCA9IHdwLmdldElzQWJzdHJhY3QoKTsKLQkJfQotCQlpZiAoaXNTbG90KSB7CQkJCi0JCQllbGVtZW50WG1sLnNldEF0dHJpYnV0ZSgiVHlwZSIsICJXb3JrUHJvZHVjdFNsb3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlR5cGVOYW1lIiwgTGlicmFyeVJlc291cmNlcy5Xb3JrUHJvZHVjdFNsb3RfdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJaWYgKGluY2x1ZGVSZWZlcmVuY2VzKSB7Ci0KLQkJCS8vIG5vIHRoaXMgd2lsbCBsb3NlIHRoZSBjb250cmlidXRvcgotCQkJLy8gUm9sZSByZXNwb25zaWJsZVJvbGUgPQotCQkJLy8gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlKChXb3JrUHJvZHVjdClzdXBlci5lbGVtZW50KTsKLQkJCS8vbXVsdGlwbGljaXR5IGNoYW5nZSBmb3Igb3Bwb3NpdGUgZmVhdHVyZXMKLQkJCUxpc3QgcmVzcG9uc2libGVSb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMsCi0JCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0vLwkJCWlmIChyZXNwb25zaWJsZVJvbGUgIT0gbnVsbCkgewotLy8JCQkJTWV0aG9kRWxlbWVudCByb2xlID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLS8vCQkJCQkJKE1ldGhvZEVsZW1lbnQpIHJlc3BvbnNpYmxlUm9sZSwgbGF5b3V0TWFuYWdlcgotLy8JCQkJCQkJCS5nZXRDb25maWd1cmF0aW9uKCkpOwotLy8JCQkJaWYgKHJvbGUgIT0gbnVsbCkgewotLy8JCQkJCVN0cmluZyByb2xlTmFtZSA9ICgoUm9sZSkgcm9sZSkuZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotLy8JCQkJCWlmIChyb2xlTmFtZSA9PSBudWxsIHx8IHJvbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLS8vCQkJCQkJcm9sZU5hbWUgPSByb2xlLmdldE5hbWUoKTsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoInJlc3BvbnNpYmxlUm9sZU5hbWUiLCByb2xlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlhZGRSZWZlcmVuY2UoQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlLCBlbGVtZW50WG1sLCAicmVzcG9uc2libGVSb2xlIiwgcm9sZSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLS8vCQkJfQotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzLCBlbGVtZW50WG1sLCAicmVzcG9uc2libGVSb2xlcyIsIHJlc3BvbnNpYmxlUm9sZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIEJyb3dzaW5nIGEgQ29uZmlndXJhdGlvbiBJbmNsdWRlcyBhIFJlbGF0aW9uc2hpcCB0aGF0IGlzIG5vdCBQYXJ0IG9mIHRoZSBDb25maWd1cmF0aW9uCi0JCQkvLyBzaG91bGQgY2FsbCB0aGUgY29uZmlndXJhdGlvbiBoZWxwZXIgdG8gcmVhbGl6ZSB0aGUgdmFsdWUKLQkJCS8vIHRoZXJlIGlzIG5vIG9wcG9zaXRlIGZlYXR1cmUgZGVmaW5lZCBmb3IgdGhpcy4gCi0JCQkvLyB3ZSBnZXQgdGhlIHZhbHVlIGluIHR3byBzdGVwczoKLQkJCS8vIDEuIGdldCB0aGUgdGFza3MgdGhhdCBvdXRwdXQgdGhpcyBXUAotCQkJLy8gMi4gZ2V0IHRoZSByb2xlcyB0aGF0IGlzIHRoZSByZXNwb25zaWJsZSBmb3IgdGhlIHRhc2tzCi0vLwkJCUxpc3QgbW9kaWZ5Um9sZXMgPSBBc3NvY2lhdGlvbkhlbHBlcgotLy8JCQkJCS5nZXRNb2RpZmllZEJ5KChXb3JrUHJvZHVjdCkgc3VwZXIuZWxlbWVudCk7Ci0vLwkJCW1vZGlmeVJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudHMoCi0vLwkJCQkJbW9kaWZ5Um9sZXMsIGxheW91dE1hbmFnZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQotLy8JCQlMaXN0IHRhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0vLwkJCQkJc3VwZXIuZWxlbWVudCwgCi0vLwkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcywgCi0vLwkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0vLwkJCUxpc3QgbW9kaWZ5Um9sZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXQgPSB0YXNrcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQkJVGFzayB0ID0gKFRhc2spaXQubmV4dCgpOwotLy8JCQkJTGlzdCByb2xlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKAotLy8JCQkJCQl0LCAKLS8vCQkJCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpLCAKLS8vCQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0vLwkJCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHJvbGVzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7ICkgewotLy8JCQkJCU9iamVjdCByID0gaXRyLm5leHQoKTsKLS8vCQkJCQlpZiAoICFtb2RpZnlSb2xlcy5jb250YWlucyhyKSApIHsKLS8vCQkJCQkJbW9kaWZ5Um9sZXMuYWRkKHIpOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJfQotCQkJCi0JCQlMaXN0IG1vZGlmeVJvbGVzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjTW9kaWZ5Um9sZXMoCi0JCQkJCShXb3JrUHJvZHVjdClzdXBlci5lbGVtZW50LCAKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkKLQkJCS8vIHRoaXMgZ3V5IGRvZXMgbm90IGhhdmUgYSBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmUKLQkJCS8vIGp1c3QgcGFzcyBudWxsIGFzIGl0J3MgZmVhdHVyZSBvYmplY3QsIEppbmh1YSBYaSwgMDQvMTcvMjAwNgotCQkJYWRkUmVmZXJlbmNlcyhudWxsLCBlbGVtZW50WG1sLCAibW9kaWZ5Um9sZXMiLCBtb2RpZnlSb2xlcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJTGlzdCBkb21haW5zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoCi0JCQkJCXN1cGVyLmVsZW1lbnQsIEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Eb21haW5zLCBlbGVtZW50WG1sLCAiZG9tYWlucyIsIGRvbWFpbnMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgd29ya1Byb2R1Y3RUeXBlcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzLCBlbGVtZW50WG1sLCAid29ya1Byb2R1Y3RUeXBlcyIsIHdvcmtQcm9kdWN0VHlwZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3QgbWFuZGF0b3J5SW5wdXRUb1Rhc2tzID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoc3VwZXIuZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcywKLQkJCQkJbGF5b3V0TWFuYWdlci5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQlhZGRSZWZlcmVuY2VzKEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X01hbmRhdG9yeUlucHV0VG9fVGFza3MsIGVsZW1lbnRYbWwsCi0JCQkJCSJtYW5kYXRvcnlJbnB1dFRvVGFza3MiLCBtYW5kYXRvcnlJbnB1dFRvVGFza3MpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxpc3Qgb3B0aW9uYWxJbnB1dFRvVGFza3MgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShzdXBlci5lbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MsIGVsZW1lbnRYbWwsCi0JCQkJCSJvcHRpb25hbElucHV0VG9UYXNrcyIsIG9wdGlvbmFsSW5wdXRUb1Rhc2tzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlMaXN0IG91dHB1dEZyb21UYXNrcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHN1cGVyLmVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MsCi0JCQkJCWxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJYWRkUmVmZXJlbmNlcyhBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLCAKLQkJCQkJZWxlbWVudFhtbCwgIm91dHB1dEZyb21UYXNrcyIsIG91dHB1dEZyb21UYXNrcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaW5jbHVkZVNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwpOwotCQkJCi0JCQkvLyBhZGQgdGhlIGRlc2NyaXB0b3JzIHJlZmVyZW5jaW5nIHRoaXMgZWxlbWVudAotCQkJc3VwZXIucHJvY2Vzc0Rlc2NyaXB0b3JzKGVsZW1lbnRYbWwpOwotCi0JCX0KLQkJZWxlbWVudFhtbC5zZXRBdHRyaWJ1dGUoIlNob3dGdWxsTWV0aG9kQ29udGVudCIsIChsYXlvdXRNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycygpKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJcmV0dXJuIGVsZW1lbnRYbWw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbmNsdWRlU2xvdFJlZmVyZW5jZXMoWG1sRWxlbWVudCBlbGVtZW50WG1sKSB7Ci0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IGxheW91dE1hbmFnZXIuZ2V0RWxlbWVudFJlYWxpemVyKCk7CQkKLQkJRnVsZmlsbGFibGVFbGVtZW50IGZFbGVtZW50ID0gKEZ1bGZpbGxhYmxlRWxlbWVudCkgZ2V0RWxlbWVudCgpOwotCQlpZiAoZkVsZW1lbnQuZ2V0SXNBYnN0cmFjdCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCBzbG90cyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygKLQkJCQlmRWxlbWVudCwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQkKLQkJYWRkU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzLAotCQkJCSJtYW5kYXRvcnlJbnB1dFRvVGFza3NfZnJvbVNsb3RzIiwgc2xvdHMsIHJlYWxpemVyKTsJLy8kTk9OLU5MUy0xJAotCi0JCWFkZFNsb3RSZWZlcmVuY2VzKGVsZW1lbnRYbWwsCi0JCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfT3B0aW9uYWxJbnB1dFRvX1Rhc2tzLAotCQkJCSJvcHRpb25hbElucHV0VG9UYXNrc19mcm9tU2xvdHMiLCBzbG90cywgcmVhbGl6ZXIpOwkvLyROT04tTkxTLTEkCi0KLQkJYWRkU2xvdFJlZmVyZW5jZXMoZWxlbWVudFhtbCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzLAotCQkJCSJvdXRwdXRGcm9tVGFza3NfZnJvbVNsb3RzIiwgc2xvdHMsIHJlYWxpemVyKTsJLy8kTk9OLU5MUy0xJAkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNsb3RSZWZlcmVuY2VzKFhtbEVsZW1lbnQgZWxlbWVudFhtbCwgT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlLCBTdHJpbmcgcmVmZXJlbmNlTmFtZSwgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IHNsb3RzLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJZm9yIChGdWxmaWxsYWJsZUVsZW1lbnQgZkVsZW1lbnQ6IHNsb3RzKSB7Ci0JCQlMaXN0IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShmRWxlbWVudCwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJCXJlZmVyZW5jZXMuYWRkQWxsKGxpc3QpOwotCQl9Ci0KLQkJYWRkUmVmZXJlbmNlcyhvZmVhdHVyZSwgZWxlbWVudFhtbCwgcmVmZXJlbmNlTmFtZSwgcmVmZXJlbmNlcyk7IAotCX0KLQkJCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgb3duZXJFbGVtZW50LCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCUVsZW1lbnRSZWFsaXplciByZWFsaXplcikgewotCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSkgewotCQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0Z1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygKLQkJCQkJKEZ1bGZpbGxhYmxlRWxlbWVudCkgZWxlbWVudCwgcmVhbGl6ZXIuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIG93bmVyRWxlbWVudCwgZmVhdHVyZSwKLQkJCQlsYXlvdXRNYW5hZ2VyLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9CQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlLCBFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIpIHsKLQkJaWYgKGZlYXR1cmUgPT0gQXNzb2NpYXRpb25IZWxwZXIuRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMpIHsKLQkJCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQoCi0JCQkJCShGdWxmaWxsYWJsZUVsZW1lbnQpIGVsZW1lbnQsIHJlYWxpemVyLmdldENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLCBsYXlvdXRNYW5hZ2VyCi0JCQkJLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L2VsZW1lbnRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2M0ZjNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvZWxlbWVudHMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgbGF5b3V0IG1hbmFnZW1lbnQgZm9yIG1ldGhvZCBhbmQgcHJvY2VzcyBlbGVtZW50cyBpbiBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWJlZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW50ZXJmYWNlcyBmb3IgbWFuYWdpbmcgdGhlIGxheW91dCBvZiBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvSVhtbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9JWG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4Nzg5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9JWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWw7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYW4gWE1MIGVsZW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhtbEVsZW1lbnQgewotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgc3RyaW5nIHRleHQKLQkgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgdG9YbWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9YbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjk2MTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotCi0vKioKLSAqIEltcGxlbWVudHMgYSBYTUwgZWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudCBpbXBsZW1lbnRzIElYbWxFbGVtZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gRmlsZVV0aWwuTElORV9TRVA7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTk9ERV9JRCA9ICJub2RlSWQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwcml2YXRlIHN0YXRpYyBTdHJpbmcgUEFSRU5UX05PREVfSUQgPSAicGFyZW50Tm9kZUlkIjsKLQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnRfbmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBlbGVtZW50X3ZhbHVlID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBNYXAgY29udGVudHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0JLyoqCi0JICogY3JlYXRlIGFuIFhtbEVsZW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudChTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBYbWxFbGVtZW50Ci0JICogQHBhcmFtIG5hbWUgU3RyaW5nCi0JICogQHBhcmFtIGlkIFN0cmluZwotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50KFN0cmluZyBuYW1lLCBTdHJpbmcgaWQpIHsKLQkJdGhpcy5lbGVtZW50X25hbWUgPSBuYW1lOwotCQkKLQkJaWYgKGlkID09IG51bGwgKSB7Ci0JCQlpZCA9IEludGVnZXIudG9IZXhTdHJpbmcodGhpcy50b1N0cmluZygpLmhhc2hDb2RlKCkpOwotCQl9Ci0JCQotCQl0aGlzLmlkID0gaWQ7Ci0JCXNldEF0dHJpYnV0ZShOT0RFX0lELCB0aGlzLmlkKTsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBlbGVtZW50IGl0c2VsZgotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50IHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5lbGVtZW50X3ZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIHNldCB0aGUgY29udGVudCBvZiB0aGUgZWxlbWVudC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBzZXRDb250ZW50KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJY29udGVudHMucHV0KG5hbWUsIHZhbHVlKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgY2hpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBjaGlsZAotCSAqIEByZXR1cm4gWG1sRWxlbWVudCB0aGUgZWxlbWVudCBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBhZGRDaGlsZChYbWxFbGVtZW50IGNoaWxkKSB7Ci0JCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhIG5ldyBjaGlpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBjaGlsZCBlbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgbmV3Q2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ld0NoaWxkKG5hbWUsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBjcmVhdGUgYSBuZXcgY2hpbGQgZWxlbWVudAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIGlkCi0JICogQHJldHVybiBYbWxFbGVtZW50IHRoZSBjaGlsZCBlbGVtZW50Ci0JICovCi0JcHVibGljIFhtbEVsZW1lbnQgbmV3Q2hpbGQoU3RyaW5nIG5hbWUsIFN0cmluZyBpZCkgewotCQlYbWxFbGVtZW50IGNoaWxkID0gbmV3IFhtbEVsZW1lbnQobmFtZSwgaWQpOwotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpZAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgeG1sIHN0cmluZwotCSAqIEByZXR1cm4gU3RyaW5nQnVmZmVyCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciB0b1htbCgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGNvbnRlbnRzLnNpemUoKSA9PSAwICYmIGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKAotCQkJCQlYbWxIZWxwZXIuZ2V0RWxlbWVudChlbGVtZW50X25hbWUsIGVsZW1lbnRfdmFsdWUsCi0JCQkJCQkJYXR0cmlidXRlcykpLmFwcGVuZChCUik7Ci0JCX0gZWxzZSB7Ci0JCQlidWZmZXIuYXBwZW5kKFhtbEhlbHBlci5iZWdpbkVsZW1lbnQoZWxlbWVudF9uYW1lLCBhdHRyaWJ1dGVzKSkKLQkJCQkJLmFwcGVuZChCUik7Ci0KLQkJCS8vIHByb2Nlc3MgdGhlIGNvbnRlbnRzCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY29udGVudHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQkJZm9yIChJdGVyYXRvciBpdExpc3QgPSAoKExpc3QpIHZhbHVlKS5pdGVyYXRvcigpOyBpdExpc3QKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJYnVmZmVyLmFwcGVuZCgKLQkJCQkJCQkJWG1sSGVscGVyLmdldEVsZW1lbnQoa2V5LCBpdExpc3QubmV4dCgpCi0JCQkJCQkJCQkJLnRvU3RyaW5nKCksIG51bGwpKS5hcHBlbmQoQlIpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYnVmZmVyCi0JCQkJCQkJLmFwcGVuZCgKLQkJCQkJCQkJCVhtbEhlbHBlcgotCQkJCQkJCQkJCQkuZ2V0RWxlbWVudCgKLQkJCQkJCQkJCQkJCQlrZXksCi0JCQkJCQkJCQkJCQkJKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZS50b1N0cmluZygpLCBudWxsKSkuYXBwZW5kKEJSKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gcHJvY2VzcyB0aGUgY2hpbGRyZW4KLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSVhtbEVsZW1lbnQgY2hpbGQgPSAoSVhtbEVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlidWZmZXIuYXBwZW5kKGNoaWxkLnRvWG1sKCkpOwotCQkJfQotCi0JCQlidWZmZXIuYXBwZW5kKFhtbEhlbHBlci5lbmRFbGVtZW50KGVsZW1lbnRfbmFtZSkpLmFwcGVuZChCUik7Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLQotCS8qKgotCSAqIHNhdmUgdGhlIGVsZW1lbnQncyB4bWwgdG8gYSBmaWxlCi0JICogQHBhcmFtIGZpbGVQYXRoTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVUbyhTdHJpbmcgZmlsZVBhdGhOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciB4bWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXhtbC5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh0aGlzLnRvWG1sKCkpOwotCi0JCXRyeSB7Ci0JCQkvLyBtYXkgbmVlZCB0byBjcmVhdGUgdGhlIGZvbGRlcnMsIFRPRE8KLQkJCS8qCi0JCQkgKiBGaWxlIHhmID0gbmV3IEZpbGUoIGZpbGVQYXRoKTsgaWYgKCAheGYuZXhpc3RzKCkgKSB7IHhmLm1rZGlycygpOyB9Ci0JCQkgKi8KLQotCQkJLy8gbmVlZCB0byBlbmZvcmUgdXRmLTggZW5jb2RpbmcsIGNhbid0IHVzZSBGaWxlV3JpdGVyLCBqeGkKLQkJCS8vIEZpbGVXcml0ZXIgeHcgPSBuZXcgRmlsZVdyaXRlcihmaWxlUGF0aE5hbWUpOwotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIHh3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZVBhdGhOYW1lKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJeHcud3JpdGUoeG1sLnRvU3RyaW5nKCkpOwotCQkJeHcuZmx1c2goKTsKLQkJCXh3LmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvWG1sSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZmFkMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L2xheW91dC91dGlsL1htbEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBwcm9jZXNzaW5nIHRoZSBYTUwgcmVwcmVzZW50YXRpb24gb2YgYSBNZXRob2QgRWxlbWVudC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICovCi1wdWJsaWMgY2xhc3MgWG1sSGVscGVyIHsKLQotCS8qKgotCSAqIFhNTCBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBYTUxfSEVBREVSID0gWE1MVXRpbC5YTUxfREVDTEFSQVRJT04KLQkJCSsgRmlsZVV0aWwuTElORV9TRVA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBYTUxVdGlsLmVzY2FwZShlbGVtZW50TmFtZS5yZXBsYWNlKCcgJywgJy0nKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gIlwiIiArIHN0ciArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZhbGlkYXRlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBzID09IG51bGwgPyAiIiA6IHM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgdGhlIHN0YXJ0IHRhZyBvZiBhbiB4bWwgZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50TmFtZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiZWdpbkVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBNYXAgYXR0cmlidXRlcykgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCI8IiArIHZhbGlkTmFtZShlbGVtZW50TmFtZSkpOyAvLyROT04tTkxTLTEkCi0JCWlmICgoYXR0cmlidXRlcyAhPSBudWxsKSAmJiAoYXR0cmlidXRlcy5zaXplKCkgPiAwKSkgewotCQkJSXRlcmF0b3IgaXQgPSBhdHRyaWJ1dGVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCVN0cmluZyBrZXksIHZhbHVlOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQl2YWx1ZSA9IHF1b3RlKFhNTFV0aWwuZXNjYXBlKAotCQkJCQkJdmFsaWRhdGUoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSksIHRydWUpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCIgIiArIHZhbGlkTmFtZShrZXkpICsgIj0iICsgdmFsdWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlidWZmZXIuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiBlbmQgdGFnIG9mIGFuIHhtbCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnROYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbmRFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gIjwvIiArIHZhbGlkTmFtZShlbGVtZW50TmFtZSkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIGNyZWF0ZSBhbiB4bWwgZWxlbWVudCBzdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUKLQkgKiBAcGFyYW0gZWxlbWVudFZhbHVlCi0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgZWxlbWVudFZhbHVlLAotCQkJTWFwIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChiZWdpbkVsZW1lbnQoZWxlbWVudE5hbWUsIGF0dHJpYnV0ZXMpKS5hcHBlbmQoCi0JCQkJWE1MVXRpbC5lc2NhcGUodmFsaWRhdGUoZWxlbWVudFZhbHVlKSwgdHJ1ZSkpLmFwcGVuZCgKLQkJCQllbmRFbGVtZW50KGVsZW1lbnROYW1lKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvbGF5b3V0L3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBmMDM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9sYXlvdXQvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBsYXlvdXQgbWFuYWdlbWVudCBzdXBwb3J0IGZvciBtZXRob2QgYW5kIHByb2Nlc3MgZWxlbWVudHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTYxNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0aGUgbGlicmFyeSBzZXJ2aWNlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9MaWJyYXJ5UHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5YTliYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvTGlicmFyeVByZWZlcmVuY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlU3RvcmVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci0KLS8qKgotICogVGhlIExpYnJhcnkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciBzdG9yaW5nIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkgPSAic2F2ZWRNZXRob2RMaWJyYXJ5VVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZAotCSAqIGluIHRoZSBsYXN0IHNlc3Npb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFID0gInNhdmVkTWV0aG9kTGlicmFyeVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3Igc3RvcmluZyB0aGUgZGlzY2FyZCB1bnJlc29sdmVkIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSAiZGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHVzZSBuZXcgZXh0ZW5kcyBzZW1hbnRpY3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyA9ICJ1c2VOZXdFeHRlbmRzU2VtYW50aWNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIHRoZSBob3Jpem9udGFsIHNwYWNpbmcgYmV0d2VlbiB0YXNrcyBhbmQgcm9sZXMgaW4gdGhlCi0JICogcm9sZSBkaWFncmFtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcmVuY2Uga2V5IGZvciB0aGUgdmVydGljYWwgc3BhY2luZyBiZXR3ZWVuIHRhc2tzIGFuZCByb2xlcyBpbiB0aGUKLQkgKiByb2xlIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcgPSAicm9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcmVmZXJlbmNlIGtleSBmb3IgdGhlIG1heGltdW4gZWxlbWVudCBsYWJlbCB0ZXh0IGxpbmVzIGluIHRoZSByb2xlCi0JICogZGlhZ3JhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMgPSAicm9sZURpYWdyYW1FbGVtZW50TGFiZWxUZXh0TGluZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9VU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HID0gNzA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORyA9IDMwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTID0gMzsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgcHJlZlN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXN0YXRpYyB7Ci0JCS8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSB2YWx1ZXMuCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KERJU0NBUkRfVU5SRVNPTFZFRF9SRUZFUkVOQ0VTLAotCQkJCURFRkFVTFRfRElTQ0FSRF9VTlJFU09MVkVEX1JFRkVSRU5DRVMpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTLAotCQkJCURFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUyk7Ci0KLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX0hPUklaT05UQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORywKLQkJCQlERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTLAotCQkJCURFRkFVTFRfUk9MRV9ESUFHUkFNX01BWF9URVhUX0xJTkVTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVVSSSgpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoU0FWRURfTUVUSE9EX0xJUkFSWV9VUkkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBVUkkgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlVUkkoU3RyaW5nIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShTQVZFRF9NRVRIT0RfTElSQVJZX1VSSSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkTWV0aG9kTGlicmFyeVR5cGUoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKFNBVkVEX01FVEhPRF9MSVJBUllfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHR5cGUgb2YgdGhlIG1ldGhvZCBsaWJyYXJ5IHRoYXQgd2FzIG9wZW5lZCBpbiB0aGUgbGFzdCBzZXNzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTYXZlZE1ldGhvZExpYnJhcnlUeXBlKFN0cmluZyB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoU0FWRURfTUVUSE9EX0xJUkFSWV9UWVBFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RGlzY2FyZFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjYXJkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREaXNjYXJkVW5yZXNvbHZlZFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUyk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpc2NhcmQgdW5yZXNvbHZlZCByZWZlcmVuY2VzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpc2NhcmRVbnJlc29sdmVkUmVmZXJlbmNlcyhib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShESVNDQVJEX1VOUkVTT0xWRURfUkVGRVJFTkNFUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlTmV3RXh0ZW5kc1NlbWFudGljcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFX05FV19FWFRFTkRTX1NFTUFOVElDUzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2UgbmV3IGV4dGVuZHMgc2VtYW50aWNzIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFVzZU5ld0V4dGVuZHNTZW1hbnRpY3MoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihVU0VfTkVXX0VYVEVORFNfU0VNQU5USUNTKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlIG5ldyBleHRlbmRzIHNlbWFudGljcyBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKFVTRV9ORVdfRVhURU5EU19TRU1BTlRJQ1MsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGhvcml6b250YWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9IT1JJWk9OVEFMX1NQQUNJTkc7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIHJvbGUgZGlhZ3JhbSBob3Jpem9udGFsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtSG9yaXpvbnRhbFNwYWNpbmcoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fSE9SSVpPTlRBTF9TUEFDSU5HLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCByb2xlIGRpYWdyYW0gdmVydGljYWwgc3BhY2luZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGlhZ3JhbSB2ZXJ0aWNhbCBzcGFjaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKCkgewotCQlpbnQgdmFsdWUgPSBwcmVmU3RvcmUuZ2V0SW50KFJPTEVfRElBR1JBTV9WRVJUSUNBTF9TUEFDSU5HKTsKLQkJcmV0dXJuIHZhbHVlID4gMCA/IHZhbHVlIDogREVGQVVMVF9ST0xFX0RJQUdSQU1fVkVSVElDQUxfU1BBQ0lORzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIHZlcnRpY2FsIHNwYWNpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFJvbGVEaWFncmFtVmVydGljYWxTcGFjaW5nKGludCB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoUk9MRV9ESUFHUkFNX1ZFUlRJQ0FMX1NQQUNJTkcsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHJvbGUgZGlhZ3JhbSBlbGVtZW50IGxhYmVsIG1heGltdW0gdGV4dCBsaW5lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXREZWZhdWx0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkgewotCQlyZXR1cm4gREVGQVVMVF9ST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpIHsKLQkJaW50IHZhbHVlID0gcHJlZlN0b3JlLmdldEludChST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMpOwotCQlyZXR1cm4gdmFsdWUgPiAwID8gdmFsdWUgOiBERUZBVUxUX1JPTEVfRElBR1JBTV9NQVhfVEVYVF9MSU5FUzsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgcm9sZSBkaWFncmFtIGVsZW1lbnQgbGFiZWwgbWF4aW11bSB0ZXh0IGxpbmVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSb2xlRGlhZ3JhbU1heGltdW1UZXh0TGluZXMoaW50IHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShST0xFX0RJQUdSQU1fTUFYX1RFWFRfTElORVMsIHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWNjMDM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBwcmVmZXJlbmNlIHN1cHBvcnQgZm9yIHRoZSBsaWJyYXJ5IHNlcnZpY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0JTQ29sdW1uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4MWJhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvQlNDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWZzOwotCi0vKioKLSAqIFNpbXBsZSBkYXRhIHN0cnVjdHVyZSB0byBpZGVudGlmeSBhIGJyZWFrZG93biBsYXlvdXQgY29sdW1uLgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCU0NvbHVtbiB7Ci0KLQlwdWJsaWMgU3RyaW5nIGlkOwotCXB1YmxpYyBTdHJpbmcgbGFiZWw7Ci0JCi0JcHVibGljIEJTQ29sdW1uKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9MaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDRmNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL0xpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotLyoqCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cyBleHRlbmRzIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0xJQlJBUllfUEFSRU5UX0RJUkVDVE9SWSA9IFBSRUZJWCArICJsYXN0X2xpYnJhcnlfX3BhcmVudF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX0RFRkFVTFRfRElSRUNUT1JZX0NIRUNLRUQgPSBQUkVGSVggKyAibGFzdF9kZWZhdWx0X2RpcmVjdG9yeV9jaGVja2VkIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkFESU9fU0FWRV9DSE9JQ0UgPSBQUkVGSVggKyAicmFkaW9fc2F2ZV9jaG9pY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1RSQU5TTEFUSU9OX0VYUE9SVF9ESVJFQ1RPUlkgPSBQUkVGSVggKyAibGFzdF90cmFuc2xhdGlvbl9leHBvcnRfZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9MQVNUX1BVQkxJU0hfRk9MREVSID0gUFJFRklYICsgImxhc3RfcHVibGlzaF9mb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX1BVQkxJU0hfRElSRUNUT1JZID0gUFJFRklYICsgImRlZmF1bHRfcHVibGlzaF9kaXJlY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0ZFRURCQUNLX1VSTCA9IFBSRUZJWCArICJkZWZhdWx0X2ZlZWRiYWNrX3VybCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQID0gUFJFRklYICsgInByb21wdF9mb3JfbGlicmFyeV9hdF9zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTiA9IFBSRUZJWCArICJzZWxlY3RlZF9jb25maWdfaW5fbGFzdF9zZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ERUZBVUxUX0hJU1RPUllfU0laRSA9IFBSRUZJWCArICJkZWZhdWx0X2xpc3RfbGVuZ3RoX2xhYmVsIjsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk0NjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLkxpYnJhcnlFZGl0Q29uc3RhbnRzOwotCi0vKioKLSAqIENvbnN0YW50cyB0byBiZSB1c2VkIGluIHByZWZlcmVuY2Ugc3RvcmUuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VDb25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByZWYuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbW92ZWQgZnJvbSB0byBoZXJlIHRvIHNoYXJlIHRoZSBjb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1dCU19DT0xVTU5TID0gTGlicmFyeUVkaXRDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfVEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1RCU19DT0xVTU5TOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9XUEJTX0NPTFVNTlMgPSBMaWJyYXJ5RWRpdENvbnN0YW50cy5QUkVGX1dQQlNfQ09MVU1OUzsKLQotCS8vIGRlZmluZSB0aGUgZGVmYXVsdCBjb2x1bW5zIGZvciB3YnMsIHRicywgYW5kIHdwYnMgbGF5b3V0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1dCU19DT0xVTU5TID0gewotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSUQsCi0JCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRUZJWCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCBJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUkVQRUFUQUJMRSwKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19PTkdPSU5HLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9JU19FVkVOVF9EUklWRU4sCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMIH07Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfVEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9XUEJTX0NPTFVNTlMgPSB7Ci0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJLy8gSUJTSXRlbVByb3ZpZGVyLkNPTF9JRCwKLQkJCS8vIElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9NT0RFTF9JTkZPLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0VOVFJZX1NUQVRFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9FWElUX1NUQVRFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLAotCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9UWVBFLCBJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1BMQU5ORUQsCi0JCQlJQlNJdGVtUHJvdmlkZXIuQ09MX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCUlCU0l0ZW1Qcm92aWRlci5DT0xfSVNfT1BUSU9OQUwgfTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL1ByZWZlcmVuY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgyZWViNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJlZnMvUHJlZmVyZW5jZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcmVmczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGhhbmRsZSB0aGUgcHJvY2VzcyBlbGVtZW50IGxheW91dCBwcmVmZXJlbmNlcwotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VVdGlsIHsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyB4c2xQYXJhbXM7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNvbElkTGFiZWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8vIHF1aWNrIHNvbHV0aW9uLCB0aGUgdGVhbSBjb2x1bW4gZm9yIHRoZSBXQlMgdmlldy4KLQkvLyAxNjI3ODMgLSBQdWJsaXNoIHRlYW0gaW5mb3JtYXRpb24gaW4gV0JTIGZvciBURHMKLQlwcml2YXRlIHN0YXRpYyBCU0NvbHVtbiB0ZWFtQ29sID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TVEVQUyA9ICJzdGVwcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQl0cnkgewotCQkJUHJvcGVydGllcyBwYXJhbXMgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL2xheW91dC94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlzZXRYc2xQcm9wZXJ0aWVzKHBhcmFtcyk7Ci0JCQkKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYc2xQcm9wZXJ0aWVzKFByb3BlcnRpZXMgbmV3WHNsUGFyYW1zKSB7Ci0JCXhzbFBhcmFtcyA9IG5ld1hzbFBhcmFtczsJCi0JCQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lELCBnZXRMYWJlbCgiaW5kZXhUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfTkFNRSwgZ2V0TGFiZWwoIm5hbWVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUsIGdldExhYmVsKCJicmVha2Rvd25FbGVtZW50VGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJRF9TVEVQUywgZ2V0TGFiZWwoInN0ZXBzVGV4dCIpKTsJCSAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFRklYLCBnZXRMYWJlbCgicHJlZml4VGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1RZUEUsIGdldExhYmVsKCJ0eXBlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX01PREVMX0lORk8sIGdldExhYmVsKCJtb2RlbEluZm9UZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFREVDRVNTT1JTLCBnZXRMYWJlbCgicHJlZGVjZXNzb3JzVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX1JFUEVBVEFCTEUsIGdldExhYmVsKCJyZXBlYXRhYmxlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09OR09JTkcsIGdldExhYmVsKCJvbmdvaW5nVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX0VWRU5UX0RSSVZFTiwgZ2V0TGFiZWwoImV2ZW50RHJpdmVuVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0lTX09QVElPTkFMLCBnZXRMYWJlbCgib3B0aW9uYWxUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSVNfUExBTk5FRCwgZ2V0TGFiZWwoInBsYW5uZWRUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBnZXRMYWJlbCgibXVsdGlwbGVPY2N1cnJlbmNlc1RleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX1RFQU1TLCBnZXRMYWJlbCgidGVhbVRleHQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0RFTElWRVJBQkxFLCBnZXRMYWJlbCgiZGVsaXZlcmFibGVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0JCWNvbElkTGFiZWxNYXAucHV0KElCU0l0ZW1Qcm92aWRlci5DT0xfRU5UUllfU1RBVEUsIGdldExhYmVsKCJlbnRyeVN0YXRlVGV4dCIpKTsgLy8kTk9OLU5MUy0xJAotCQljb2xJZExhYmVsTWFwLnB1dChJQlNJdGVtUHJvdmlkZXIuQ09MX0VYSVRfU1RBVEUsIGdldExhYmVsKCJleGl0U3RhdGVUZXh0IikpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhYmVsKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIGxhYmVsID0geHNsUGFyYW1zLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICggbGFiZWwgPT0gbnVsbCApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBwcm9wZXJ0eSBlbnRyeSBmb3IgIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJCWxhYmVsID0ga2V5OwotCQl9Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBjb2x1bW5zIGZvciBXQlMgbGF5b3V0Ci0JICogQHJldHVybiBMaXN0IG9mIEJTQ29sdW1uIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V0JTQ29sdW1ucygpIHsKLQkJTGlzdCBjb2xzID0gZ2V0UHJlZmVyZW5jZUl0ZW1zKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUyk7Ci0JCQotCQkvLyBpZiB0aGUgVEJTIGNvbHVtbnMgaGFzIHRlYW0sIGFsc28gYWRkIHRvIHRoZSBXQlMKLQkJLy8gMTYyNzgzIC0gUHVibGlzaCB0ZWFtIGluZm9ybWF0aW9uIGluIFdCUyBmb3IgVERzCi0JCXRlYW1Db2wgPSBudWxsOwotCQlnZXRUQlNDb2x1bW5zKCk7Ci0JCWlmICggdGVhbUNvbCAhPSBudWxsICkgewotCQkJY29scy5hZGQoY29scy5zaXplKCksIHRlYW1Db2wpOwotCQl9Ci0JCXJldHVybiBjb2xzOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgYSBsaXN0IG9mIGNvbHVtbnMgZm9yIFRCUyBsYXlvdXQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgQlNDb2x1bW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUQlNDb2x1bW5zKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZUl0ZW1zKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUyk7Ci0JfQotCQotCS8qKgotCSAqIGdldCBhIGxpc3Qgb2YgY29sdW1ucyBmb3IgV1BCUyBsYXlvdXQKLQkgKiBAcmV0dXJuIExpc3Qgb2YgQlNDb2x1bW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRXUEJTQ29sdW1ucygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VJdGVtcyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV1BCU19DT0xVTU5TKTsKLQl9Ci0JCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbHVtbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVQcmVmZXJlbmNlcygpIHsKLQkJLy8gY2FsbCB0aGUgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGUgZGVmYXVsdCBpcyBsb2FkZWQKLQkJZ2V0V0JTQ29sdW1ucygpOwotCQlnZXRUQlNDb2x1bW5zKCk7Ci0JCWdldFdQQlNDb2x1bW5zKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0UHJlZmVyZW5jZUl0ZW1zKFN0cmluZyBrZXkpIHsKLQkJCi0JCUlQcmVmZXJlbmNlU3RvcmVXcmFwcGVyIHN0b3JlID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7CQkKLQkJU3RyaW5nIHN0ciA9IHN0b3JlLmdldFN0cmluZyhrZXkpOwotCQlpZiAoc3RyID09IG51bGwpIHsKLQkJCXN0ciA9IHN0b3JlLmdldERlZmF1bHRTdHJpbmcoa2V5KTsKLQkJfQotCQkKLQkJaWYgKCBzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCApIHsKLQkJCXN0ciA9IGdldERlZmF1bHQoa2V5KTsKLQkJCXN0b3JlLnNldFZhbHVlKGtleSwgc3RyKTsKLQkJfQotCQkKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgaWQgPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwkJCi0JCQlpZiAoaWQgIT0gbnVsbCAmJiBpZC5sZW5ndGgoKSAhPSAwICkgewotCQkJCQotCQkJCUJTQ29sdW1uIGNvbCA9IG5ldyBCU0NvbHVtbihpZCwgZ2V0Q29sVGV4dChpZCkpOwotCQkJCWl0ZW1zLmFkZChjb2wpOwotCQkJCS8vIGFkZCBzdGVwcyBjb2x1bW4gZm9yIFdCUwotCQkJCWlmICgga2V5LmVxdWFscyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfV0JTX0NPTFVNTlMpIAotCQkJCQkJJiYgaWQuZXF1YWxzKElCU0l0ZW1Qcm92aWRlci5DT0xfUFJFU0VOVEFUSU9OX05BTUUpICkgewotCQkJCQljb2wgPSBuZXcgQlNDb2x1bW4oSURfU1RFUFMsIGdldENvbFRleHQoSURfU1RFUFMpKTsKLQkJCQkJaXRlbXMuYWRkKGNvbCk7Ci0JCQkJfQotCQkJCQotCQkJCS8vIHNhdmUgdGhlIHRlYW0gY29sdW1uIGZvciBXQlMKLQkJCQkvLyAxNjI3ODMgLSBQdWJsaXNoIHRlYW0gaW5mb3JtYXRpb24gaW4gV0JTIGZvciBURHMKLQkJCQlpZiAoIElCU0l0ZW1Qcm92aWRlci5DT0xfVEVBTVMuZXF1YWxzKGlkKSApIHsKLQkJCQkJdGVhbUNvbCA9IGNvbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBpdGVtczsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbFRleHQoU3RyaW5nIGtleSkgewotCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpY29sSWRMYWJlbE1hcC5nZXQoa2V5KTsKLQkJaWYgKCB0ZXh0ID09IG51bGwgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGxhYmVsIGRlZmluZWQgZm9yIGNvbHVtbiAiICsga2V5KTsgIC8vJE5PTi1OTFMtMSQKLQkJCXRleHQgPSBrZXk7Ci0JCX0KLQkJCi0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyAgU3RyaW5nIGdldERlZmF1bHQoU3RyaW5nIGtleSkgewotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XQlNfQ09MVU1OUy5lcXVhbHMoa2V5KSApIHsKLQkJCXJldHVybiB0b1N0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfV0JTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9UQlNfQ09MVU1OUy5lcXVhbHMoa2V5KSApIHsKLQkJCXJldHVybiB0b1N0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLkRFRkFVTFRfVEJTX0NPTFVNTlMpOwotCQl9Ci0JCQotCQlpZiAoIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9XUEJTX0NPTFVNTlMuZXF1YWxzKGtleSkgKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5ERUZBVUxUX1dQQlNfQ09MVU1OUyk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nW10gaWRzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHJCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBtYXggPSBpZHMubGVuZ3RoIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJc3RyQnVmLmFwcGVuZChpZHNbaV0pCi0JCQkJCS5hcHBlbmQoJywnKTsKLQkJfQotCQlzdHJCdWYuYXBwZW5kKGlkc1tpZHMubGVuZ3RoLTFdKTsKLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlU2VsZWN0ZWRDb25maWdJbnRvUGVyc2lzdGVuY2UoU3RyaW5nIGNvbmZpZ05hbWUpIHsKLQkJSVByZWZlcmVuY2VTdG9yZVdyYXBwZXIgc3RvcmUgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUKLQkJCQkuc2V0VmFsdWUoCi0JCQkJCQlMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NFTEVDVEVEX0NPTkZJR19JTl9MQVNUX1NFU1NJT04sCi0JCQkJCQljb25maWdOYW1lKTsKLQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2F2ZWRMYXN0Q29uZmlnKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlV3JhcHBlciBzdG9yZSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0VMRUNURURfQ09ORklHX0lOX0xBU1RfU0VTU0lPTik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcmVmcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Y2MwMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3ByZWZzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RjNWVhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgdGhlIE1ldGhvZCBMaWJyYXJ5IFByb2plY3RzIGluIGEgd29ya3NwYWNlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZExpYnJhcnlQcm9qZWN0IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiAgICAgICAgICAgIEEgbmFtZSBmb3IgdGhlIG5ldyBtZXRob2QgbGlicmFyeSBwcm9qZWN0LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiBBIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGNyZWF0ZVByb2plY3QoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCi0JCS8vIGZpbmQgdGhlIHByb2plY3QgYnkgcGF0aAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7CQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCApIHsKLQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCXwgSVByb2plY3QuTkVWRVJfREVMRVRFX1BST0pFQ1RfQ09OVEVOVCwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCWlmICggcHJvamVjdE5hbWUgPT0gbnVsbCApIHsKLQkJCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJCXByb2plY3ROYW1lID0gbGlicmFyeVBhdGguZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQkvLyBpZiBhIHByb2plY3Qgb2YgdGhlIHNhbWUgbmFtZSBhbHNvIGV4aXN0cywgZGVsZXRlIGl0Ci0JCS8vIHRoaXMgaXMgbmVlZGVkIHRvIHRha2UgY2FyZSBvZiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgotCQkvLyBhIHByb2plY3QgaXMgb3BlbmVkIGJ1dCBub3QgY2xvc2VkIGZvciBzb21lIHJlYXNvbgotCQkvLyBub3cgY3JlYXRlIGEgbmV3IGxpYnJhcnkgd2l0aCB0aGUgc2FtZSBuYW1lIChzYW1lIGxpYnJhcnkgZm9sZGVyKQotCQkvLyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGUgcHJldmlvdXMgb25lCi0JCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAocHJvamVjdC5leGlzdHMoKSkgewotCQkJcHJvamVjdC5kZWxldGUoSVByb2plY3QuRk9SQ0UKLQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJfQotCQkKLQotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gd29ya3NwYWNlCi0JCQkJLm5ld1Byb2plY3REZXNjcmlwdGlvbihwcm9qZWN0TmFtZSk7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSURTKTsKLQkJSVBhdGggcHJvamVjdFBhdGggPSBuZXcgUGF0aChwYXRoKTsKLQkJaWYgKCFQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YocHJvamVjdFBhdGgpKSB7Ci0JCQlkZXNjcmlwdGlvbi5zZXRMb2NhdGlvbihwcm9qZWN0UGF0aCk7Ci0JCX0KLQkJcHJvamVjdC5jcmVhdGUoZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLS8vCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0vLwkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0vLwkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLS8vCQl9Ci0vLwkJRmlsZSBsaWJyYXJ5UGF0aCA9IG5ldyBGaWxlKHBhdGgpOwotLy8JCVN0cmluZyBwcm9qZWN0UGF0aCA9IGxpYnJhcnlQYXRoLmdldEFic29sdXRlUGF0aCgpOwotLy8JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGxpYnJhcnlQYXRoLmdldE5hbWUoKTsKLS8vCQlyZXR1cm4gY3JlYXRlUHJvamVjdChwcm9qZWN0UGF0aCwgcHJvamVjdE5hbWUsIG1vbml0b3IpOwotCQkKLQkJcmV0dXJuIGNyZWF0ZVByb2plY3QocGF0aCwgbnVsbCwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCBhIHdvcmtzcGFjZSBwcm9qZWN0IGlzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgQSB3b3Jrc3BhY2UgcHJvamVjdC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiB3b3Jrc3BhY2UgcHJvamVjdCBpcyBhIG1ldGhvZAotCSAqICAgICAgICAgbGlicmFyeSBwcm9qZWN0LCA8Y29kZT5mYWxzZTwvY2xvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RMaWJyYXJ5UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gY2xvc2VQcm9qZWN0T25FeGl0ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJY2xvc2VQcm9qZWN0T25FeGl0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCQkJaWYgKEFycmF5cy5hc0xpc3QobmF0dXJlSWRzKS5jb250YWlucygKLQkJCQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY2xvc2VQcm9qZWN0T25FeGl0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9qZWN0LmNsb3NlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpbiB0aGUgY3VycmVudCB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKG5ldyBGaWxlKHBhdGgpLmNvbXBhcmVUbyhwcm9qZWN0LmdldExvY2F0aW9uKCkudG9GaWxlKCkpID09IDAKLQkJCQkJCSYmIGlzTWV0aG9kTGlicmFyeVByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJcmV0dXJuIHByb2plY3Q7Ci0JCQkJfQotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSA9PSAwKSB7Ci0JCQkJCXJldHVybiBwcm9qZWN0OwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExvY2F0ZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcmV0dXJuIEEgPGNvZGU+SVByb2plY3Q8L2NvZGU+IG9yIDxvY2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtZXRob2QKLQkgKiAgICAgICAgIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIGZpbmRQcm9qZWN0KGdldExpYnJhcnlQYXRoKGxpYnJhcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBPcGVucyBhbiBleGlzdGluZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBjYW5ub3QgYmUgbG9jYXRlZCwgY3JlYXRlIGEgbmV3IG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gQSA8Y29kZT5JUHJvamVjdDwvY29kZT4uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IG9wZW5Qcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gb3BlblByb2plY3QocGF0aCwgbnVsbCwgIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIGFuIGV4aXN0aW5nIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqIDxwPgotCSAqIElmIHRoZSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGNhbm5vdCBiZSBsb2NhdGVkLCBjcmVhdGUgYSBuZXcgb25lLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIEEgcHJvZ3Jlc3MgbW9uaXRvci4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICogQHJldHVybiBBIDxjb2RlPklQcm9qZWN0PC9jb2RlPi4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGVyZm9ybWluZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3Qgb3BlblByb2plY3QoU3RyaW5nIHBhdGgsIFN0cmluZyBwcm9qZWN0TmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKHBhdGggKyBGaWxlLnNlcGFyYXRvcgotCQkJCSsgSVByb2plY3REZXNjcmlwdGlvbi5ERVNDUklQVElPTl9GSUxFX05BTUUpOwotCi0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb247Ci0JCXRyeSB7Ci0JCQlkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbihwcm9qZWN0UGF0aCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQlkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJLy8gLnByb2plY3QgZmlsZSBpcyBtaXNzaW5nLCBjcmVhdGUgYSBuZXcgbWV0aG9kIGxpYnJhcnkKLQkJCS8vIHByb2plY3QuCi0JCQlwcm9qZWN0ID0gTWV0aG9kTGlicmFyeVByb2plY3QuY3JlYXRlUHJvamVjdChwYXRoLCBwcm9qZWN0TmFtZSwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyAucHJvamVjdCBmaWxlIGV4aXN0cywgcmV0cmlldmUgdGhlIHByb2plY3QgZnJvbSB0aGUKLQkJCS8vIHdvcmtzcGFjZS4KLQkJCWlmICggcHJvamVjdE5hbWUgIT0gbnVsbCApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXROYW1lKHByb2plY3ROYW1lKTsKLQkJCX0KLQkJCQotCQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgKLQkJCQkJZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCS8vIFRoZSBwcm9qZWN0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UuIENyZWF0ZSBhIG5ldwotCQkJCS8vIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgdXNpbmcgdGhlIHByb2plY3QgbmFtZSBmcm9tIHRoZQotCQkJCS8vIC5wcm9qZWN0IGZpbGUuCi0JCQkJcHJvamVjdCA9IE1ldGhvZExpYnJhcnlQcm9qZWN0LmNyZWF0ZVByb2plY3QocGF0aCwgcHJvamVjdAotCQkJCQkJLmdldE5hbWUoKSwgbW9uaXRvcik7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSBwcm9qZWN0IGRvZXMgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkJCQkvLyBWZXJpZnkgdGhhdCB0aGUgbG9jYXRpb24gbWF0Y2hlcy4gSWYgbm90LCBjcmVhdGUgYSBuZXcgbWV0aG9kCi0JCQkJLy8gbGlicmFyeSBwcm9qZWN0LgotCQkJCWlmIChuZXcgRmlsZShwYXRoKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpLnRvRmlsZSgpKSAhPSAwKSB7Ci0JCQkJCXByb2plY3QgPSBNZXRob2RMaWJyYXJ5UHJvamVjdC5jcmVhdGVQcm9qZWN0KHBhdGgsIG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJcHJvamVjdC5vcGVuKElSZXNvdXJjZS5CQUNLR1JPVU5EX1JFRlJFU0gsIG1vbml0b3IpOwotCQl9Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCWRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBwcm9qZWN0IGhhcyB0aGUgTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuCi0JCVN0cmluZ1tdIG5hdHVyZUlkcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQlpZiAoIUFycmF5cy5hc0xpc3QobmF0dXJlSWRzKS5jb250YWlucygKLQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpKSB7Ci0JCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuTkFUVVJFX0lEUyk7Ci0JCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBJUHJvamVjdC5GT1JDRQotCQkJCQl8IElQcm9qZWN0LktFRVBfSElTVE9SWSwgbW9uaXRvcik7Ci0JCX0KLQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBtZXRob2QgbGlicmFyeSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIEFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCS8vIGNoZWNrIGlmIHdvcmtzcGFjZSBpcyBtb2RpZmlhYmxlCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgIXByb2plY3QuZ2V0V29ya3NwYWNlKCkuaXNUcmVlTG9ja2VkKCkgJiYgcHJvamVjdC5pc09wZW4oKSkgewotCQkJcHJvamVjdC5jbG9zZShtb25pdG9yKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY2xvc2VQcm9qZWN0KGdldExpYnJhcnlQYXRoKGxpYnJhcnkpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmcm9tIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgQW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBBIHByb2dyZXNzIG1vbml0b3IuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBpcyBzdWNjZXNzZnVsbHkKLQkgKiAgICAgICAgIGRlbGV0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlUHJvamVjdChTdHJpbmcgcGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBmaW5kUHJvamVjdChwYXRoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJCX0KLQkJCQlwcm9qZWN0LmRlbGV0ZShJUHJvamVjdC5GT1JDRQotCQkJCQkJfCBJUHJvamVjdC5ORVZFUl9ERUxFVEVfUFJPSkVDVF9DT05URU5ULCBtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIGEgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCBmcm9tIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlicmFyeQotCSAqICAgICAgICAgICAgQSBtZXRob2QgbGlicmFyeS4KLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgQSBwcm9ncmVzcyBtb25pdG9yLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBsaWJyYXJ5IHByb2plY3QgaXMgc3VjY2Vzc2Z1bGx5Ci0JICogICAgICAgICBkZWxldGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gZGVsZXRlUHJvamVjdChnZXRMaWJyYXJ5UGF0aChsaWJyYXJ5KSwgbW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5Ci0JICogQHJldHVybiBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlQYXRoKE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQlyZXR1cm4gbmV3IEZpbGUobGlicmFyeS5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkKLQkJCQkuZ2V0UGFyZW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YzYzNjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvcHJvamVjdC9NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0TmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIEEgTWV0aG9kIExpYnJhcnkgUHJvamVjdCBuYXR1cmUuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUgaW1wbGVtZW50cyBJUHJvamVjdE5hdHVyZSB7Ci0KLQkvKioKLQkgKiBUaGUgbmF0dXJlIElEIGZvciBhIE1ldGhvZCBMaWJyYXJ5IFByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUVVJFX0lEID0gTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmUuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBNZXRob2QgTGlicmFyeSBQcm9qZWN0IG5hdHVyZSBJRHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBOQVRVUkVfSURTID0geyBOQVRVUkVfSUQgfTsKLQotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3ROYXR1cmUjY29uZmlndXJlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNkZWNvbmZpZ3VyZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVjb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNnZXRQcm9qZWN0KCkKLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdE5hdHVyZSNzZXRQcm9qZWN0KElQcm9qZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzE4YjRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9wcm9qZWN0L3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIG1hbmFnZW1lbnQgb2YgbWV0aG9kIGxpYnJhcnkgcHJvamVjdHMgaW4gYSB3b3Jrc3BhY2UuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnRGaWxlLmphdmEudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL0VsZW1lbnRGaWxlLmphdmEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThlYzU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9FbGVtZW50RmlsZS5qYXZhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi0vKioKLSAqIAotICogVGhpcyBjbGFzcyBpcyBkZXByaWNhdGVkLiB1c2UgRmlsZU5hbWVHZW5lcmF0b3IgaW5zdGVhZAotICoKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRGaWxlIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZ3VpZDsKLQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQlwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhDb3VudGVyID0gMDsKLQkKLQlwdWJsaWMgRWxlbWVudEZpbGUoU3RyaW5nIGd1aWQsIFN0cmluZyBmaWxlTmFtZSkgewotCQl0aGlzLmd1aWQgPSBndWlkOwotCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCWluZGV4Q291bnRlciA9IDA7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgZSkJewotCQlFbGVtZW50RmlsZSBlRmlsZSA9IChFbGVtZW50RmlsZSkgZTsKLQkJCi0JCWlmICghKGdldEd1aWQoKS5lcXVhbHMoZUZpbGUuZ2V0R3VpZCgpKSkgCi0JCQkJJiYgZ2V0RmlsZU5hbWUoKS5lcXVhbHMoZUZpbGUuZ2V0RmlsZU5hbWUoKSkpIHsJCQkKLQkJCXJldHVybiBhcHBlbmRJbmRleCgpOwotCQl9Ci0JCWluZGV4Q291bnRlcisrOwotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKS5lcXVhbHMoZUZpbGUuZ2V0RmlsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmaWxlTmFtZS5oYXNoQ29kZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgZSkgewkJCi0JCWlmIChlIGluc3RhbmNlb2YgRWxlbWVudEZpbGUpCi0JCXsKLQkJCUVsZW1lbnRGaWxlIGFGaWxlID0gKEVsZW1lbnRGaWxlKSBlOwotCQkJcmV0dXJuIGZpbGVOYW1lLmNvbXBhcmVUbyhhRmlsZS5nZXRGaWxlTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZOYW1lKSB7Ci0JCWZpbGVOYW1lID0gZk5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQl7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRHdWlkKCkJewotCQlyZXR1cm4gZ3VpZDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFwcGVuZEluZGV4KCkgewotCQlTdHJpbmdCdWZmZXIgdFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0RmlsZU5hbWUoKSk7Ci0JCWludCBiZWdpbmRJZHggPSBnZXRGaWxlTmFtZSgpLmxhc3RJbmRleE9mKCItIik7Ci0JCWludCBlbmRJZHggPSBnZXRGaWxlTmFtZSgpLmxhc3RJbmRleE9mKCIuaHRtIik7Ci0JCWlmIChiZWdpbmRJZHggPiAtMSAmJiBlbmRJZHggPiAtMSkgewotCQkJaWYgKGluZGV4Q291bnRlciA+IDApIHsKLQkJCQl0U3RyaW5nLnJlcGxhY2UoYmVnaW5kSWR4KzEsIGVuZElkeCwgSW50ZWdlci50b1N0cmluZygrK2luZGV4Q291bnRlcikpOwkKLQkJCQlzZXRGaWxlTmFtZSh0U3RyaW5nLnRvU3RyaW5nKCkpOwotCQkJCS8vaW5kZXhDb3VudGVyID0gMDsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChlbmRJZHggPiAtMSkgewkJCQotCQkJdFN0cmluZy5pbnNlcnQoZW5kSWR4LCAiLSIgKyBJbnRlZ2VyLnRvU3RyaW5nKCsraW5kZXhDb3VudGVyKSk7Ci0JCQlzZXRGaWxlTmFtZSh0U3RyaW5nLnRvU3RyaW5nKCkpOwotCQkJLy9pbmRleENvdW50ZXIgPSAwOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JmZGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5BY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLklMaWJyYXJ5UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBoZWxwZXIgaXMgdXNpbmcgYW4gaW5zdGFuY2Ugb2YgSUFjdGlvbk1hbmFnZXIgdG8ga2VlcCB0cmFjayBvZiBjaGFuZ2VzLgotICogQ2xpZW4gbXVzdCB7QGxpbmsgI2Rpc3Bvc2UoKSA8ZW0+ZGlzcG9zZTwvZW0+fSB0aGlzIGhlbHBlciBhZnRlciB1c2UuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyIHsKLQotCUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyID0gbnVsbDsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgTGlicmFyeU1vZGlmaWNhdGlvbkhlbHBlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGFjdGlvbiBtYW5hZ2VyCi0JICogQHJldHVybiBBY3Rpb25NYW5hZ2VyCi0JICovCi0JcHVibGljIEFjdGlvbk1hbmFnZXIgZ2V0QWN0aW9uTWFuYWdlcigpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWN0aW9uTWdyOwotCQl9Ci0KLQkJYWN0aW9uTWdyID0gbmV3IEFjdGlvbk1hbmFnZXIoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBkb0FjdGlvbihpbnQgYWN0aW9uVHlwZSwgRU9iamVjdCBvYmplY3QsCi0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgdmFsdWUsIGludCBpbmRleCkgewotCQkJCWlmIChjYW5VcGRhdGUob2JqZWN0KSkgewotCQkJCQlyZXR1cm4gc3VwZXIuZG9BY3Rpb24oYWN0aW9uVHlwZSwgb2JqZWN0LCBmZWF0dXJlLCB2YWx1ZSwKLQkJCQkJCQlpbmRleCk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgc2F2ZShSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJfQotCQl9OwotCi0JCXJldHVybiBhY3Rpb25NZ3I7Ci0JfQotCi0JLyoqCi0JICogZGlzcG9zZQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGFjdGlvbk1nciAhPSBudWxsKSB7Ci0JCQlhY3Rpb25NZ3IuZGlzcG9zZSgpOwotCQkJYWN0aW9uTWdyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIHVwZGF0ZSBpcyBhbGxvd2VkCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5VcGRhdGUoRU9iamVjdCBvYmplY3QpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBUbmdVdGlsLmNoZWNrRWRpdChvYmplY3QsIG51bGwpOwotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5MaWJyYXJ5TW9kaWZpY2F0aW9uSGVscGVyX2Nhbm5vdFVwZGF0ZSwgVG5nVXRpbC5nZXRUeXBlVGV4dChvYmplY3QpLCBvYmplY3QKLQkJCS5lR2V0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCkpKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheVdhcm5pbmcoTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCksCi0JCQkJCUxpYnJhcnlSZXNvdXJjZXMud2FybmluZ0RsZ190aXRsZQotCQkJCQksIG1zZywgVG5nVXRpbC5nZXRNZXNzYWdlKHN0YXR1cykpOwotCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBzYXZlIGlzIG5lZWRlZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2F2ZU5lZWRlZCgpIHsKLQkJcmV0dXJuIChhY3Rpb25NZ3IgIT0gbnVsbCkgJiYgYWN0aW9uTWdyLmlzU2F2ZU5lZWRlZCgpOwotCX0KLQotCS8qKgotCSAqIGRvIHNhdmUKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB7Ci0JCWlmIChhY3Rpb25NZ3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsJCQkKLQkJCUNvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZXMgPSBhY3Rpb25NZ3IuZ2V0TW9kaWZpZWRSZXNvdXJjZXMoKTsKLQkJCUZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBnZXRQZXJzaXN0ZXIobW9kaWZpZWRSZXNvdXJjZXMpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbW9kaWZpZWRSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlc291cmNlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5lcnJvckRsZ19zYXZlRXJyb3IKLQkJCQkJCQksIHJlc291cmNlLmdldFVSSSgpLmlzRmlsZSgpID8gcmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkgOiByZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKTsgCi0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0NhbGxiYWNrKCkuZGlzcGxheUVycm9yKExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLAotCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JEbGdfdGl0bGUKLQkJCQkJCQksIG1zZywgZSk7Ci0JCQkJfQotCQkJfQotCi0JCQl0cnkgewotCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQlhY3Rpb25NZ3Iuc2F2ZUlzRG9uZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0cnkgewotCQkJCQlwZXJzaXN0ZXIucm9sbGJhY2soKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgdGgpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIGlmIHJvbGxiYWNrIGZhaWxlZCwgcmVsb2FkIHRoZSBsaWJyYXJ5Ci0JCQkJCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJCS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldFBlcnNpc3RlcihDb2xsZWN0aW9uIHJlc291cmNlcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7Ci0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHJlc291cmNlLmdldFJlc291cmNlU2V0KCk7Ci0JCQlpZihyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElMaWJyYXJ5UmVzb3VyY2VTZXQpIHsKLQkJCQlJTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSAoKElMaWJyYXJ5UmVzb3VyY2VTZXQpcmVzb3VyY2VTZXQpLmdldFBlcnNpc3RlcigpOwotCQkJCWlmKHBlcnNpc3RlciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBwZXJzaXN0ZXIuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL05hbWVDYWNoZS5qYXZhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNmEyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvTmFtZUNhY2hlLmphdmEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGRlcHJpY2F0ZWQuIHVzZSBGaWxlTmFtZUdlbmVyYXRvciBpbnN0ZWFkCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTmFtZUNhY2hlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBOYW1lQ2FjaGUgaW5zdGFuY2UgPSBuZXcgTmFtZUNhY2hlKCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGFNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQlwcml2YXRlIFNldDxFbGVtZW50RmlsZT4gYVNldCA9IG5ldyBIYXNoU2V0PEVsZW1lbnRGaWxlPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBnTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICogQGRlcGxpY2F0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBOYW1lQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgdGhpcyBjbGFzcyBmcm9tIGJlaW5nIGluc3RhbnRpYXRlZC4KLQkgKi8KLQlwcml2YXRlIE5hbWVDYWNoZSgpIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWFNYXAuY2xlYXIoKTsKLQkJYVNldC5jbGVhcigpOwotCQlnTWFwLmNsZWFyKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBuYW1lUHJlZml4IFN0cmluZyBwcmVmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIG5hbWVTdWZmaXggU3RyaW5nIHN1ZmZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gZXh0IFN0cmluZyBmaWxlIGV4dGVuc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBkZXBsaWNhdGVkCi0JICovCSAKLQlwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsKLQkJCi0JCVN0cmluZyBleGlzdGluZ0VsZW1lbnROYW1lID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKG5hbWVQcmVmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lUHJlZml4KTsKLQkJfQotCQkKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpID09ICIiKQotCQkJcmV0dXJuICIwIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCWlmICghZ01hcC5pc0VtcHR5KCkpIHsKLQkJCWV4aXN0aW5nRWxlbWVudE5hbWUgPSAgKFN0cmluZykgZ01hcC5nZXQoZWxlbWVudC5nZXRHdWlkKCkpOwotCQl9Ci0JCS8vIEJyb3dzaW5nOiBCcm93c2luZyBDUCB3aXRoIHNwZWNpYWwgY2hhcnMgZmFpbGVkIHdpdGgKLQkJLy8gYmxhbmsgcGFnZXMgYW5kIFNjcmlwdCBFcnJvciBuZWVkIHRvIG1ha2UgYSB2YWxpZCBmaWxlIG5hbWUKLQkJYnVmZmVyLmFwcGVuZCgoZXhpc3RpbmdFbGVtZW50TmFtZSAhPSBudWxsKSA/IGV4aXN0aW5nRWxlbWVudE5hbWUgOiBTdHJVdGlsLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXJzKGVsZW1lbnQuZ2V0TmFtZSgpKSk7Ci0JCWlmIChuYW1lU3VmZml4ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZVN1ZmZpeCk7Ci0JCX0KLQotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCWlmIChleHQuaW5kZXhPZigiLiIpIDwgMCkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWV4dCA9ICIuIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChleHQpOwotCQl9Ci0JCQotCQlpZiAoZXhpc3RpbmdFbGVtZW50TmFtZSA9PSBudWxsKSB7Ci0JCQkKLQkJCUVsZW1lbnRGaWxlIGEgPSBuZXcgRWxlbWVudEZpbGUoZWxlbWVudC5nZXRHdWlkKCksIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQotCQkJaWYgKGEgIT0gbnVsbCAmJiBhU2V0LmFkZChhKSkgewotCQkJCWludCBleHREb3QgPSBhLmdldEZpbGVOYW1lKCkubGFzdEluZGV4T2YoIi4iKTsKLQkJCQlhTWFwLnB1dCgoZXh0RG90IDwgMCkgPyBhLmdldEZpbGVOYW1lKCkgOiBhLmdldEZpbGVOYW1lKCkuc3Vic3RyaW5nKDAsIGV4dERvdCksIGVsZW1lbnQuZ2V0R3VpZCgpKTsJCQkgCi0JCQkJZ01hcC5wdXQoZWxlbWVudC5nZXRHdWlkKCksIChleHREb3QgPCAwKSA/IGEuZ2V0RmlsZU5hbWUoKSA6IGEuZ2V0RmlsZU5hbWUoKS5zdWJzdHJpbmcoMCwgZXh0RG90KSk7Ci0JCQl9Ci0JCQotCQkJcmV0dXJuIGEuZ2V0RmlsZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVOYW1lKFN0cmluZyBndWlkKSB7Ci0JCi0JCWlmIChndWlkICE9IG51bGwgJiYgIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgZ01hcC5nZXQoZ3VpZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7IAotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZCBmcm9tIHRoZSBmaWxlIG5hbWUsIGFzc3VtaW5nIHRoZSBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkIGZyb20gYW4gZWxlbWVudCwgCi0JICogcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLgotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZEZyb21GaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaWYgKGZpbGVOYW1lID09IG51bGwgfHwgKGZpbGVOYW1lLmluZGV4T2YoInJlc291cmNlcy8iKSA+IC0xICYmIGZpbGVOYW1lLmluZGV4T2YoIi5odG0iKSA8IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCQotCQkKLQkJU3RyaW5nIGd1aWQgPSBudWxsOwotCQkKLQkJaW50IGlkeCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIvIik7Ci0JCWludCBsYXN0SWR4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQotCQlpZiAoaWR4ID4gLTEpIHsKLQkJCWd1aWQgPSAoU3RyaW5nKSBhTWFwLmdldCgobGFzdElkeCA+IC0xICYmIGlkeCA8IGxhc3RJZHgpID8gCi0JCQkJCWZpbGVOYW1lLnN1YnN0cmluZyhpZHgrMSwgbGFzdElkeCkgOiAoaWR4IDwgZmlsZU5hbWUubGVuZ3RoKCkpID8gCi0JCQkJCQkJZmlsZU5hbWUuc3Vic3RyaW5nKGlkeCsxKSA6IG51bGwpOwotCQl9IGVsc2UgewotCQkJZ3VpZCA9IChTdHJpbmcpIGFNYXAuZ2V0KChsYXN0SWR4ID4gLTEpID8gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJZHgpIDogZmlsZU5hbWUpOwotCQl9Ci0JCWlmIChndWlkID09IG51bGwpCXJldHVybiBudWxsOwkJCi0JCi0JCS8vIHR1cm4gb2ZmIGVycm9yIHJlcG9ydGluZyBhbmQgc2VlIGlmIGd1aWQgZXhpc3RzIGluIGxpYnJhcnkKLQkJYm9vbGVhbiBvbGRSZXBvcnRfRXJyb3IgPSBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SID0gZmFsc2U7Ci0vKgkJTWV0aG9kRWxlbWVudCBlID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKQotCQkJCS5nZXRNZXRob2RFbGVtZW50KGd1aWQpOyovCi0JCS8vcGFydCBvZiB0ZW1wIHNvbHV0aW9uIGR1ZSB0byBub3QgaGF2aW5nIGxpYiBtZ3IgZHVyaW5nIG1pZ3JhdGlvbgotCQlNZXRob2RFbGVtZW50IGUgPSBMaW5rSW5mby5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQlNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwuUkVQT1JUX0VSUk9SID0gb2xkUmVwb3J0X0Vycm9yOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIGd1aWQ7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZmlsZSBuYW1lIHdpdGggdGhlIGdpdmVuIHByZWZpeCBhbmQgZXh0ZW5zaW9uCi0JICogQHBhcmFtIHZpZXcgQm9va21hcmsKLQkgKiBAcGFyYW0gbmFtZVByZWZpeCBTdHJpbmcgcHJlZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBuYW1lU3VmZml4IFN0cmluZyBzdWZmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIGV4dCBTdHJpbmcgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAZGVwbGljYXRlZCB0aGlzIG1ldGhvZCBpcyBub3QgbmVlZGVkIAotCSAqLwkgCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZU5hbWUoQm9va21hcmsgdmlldywgU3RyaW5nIG5hbWVQcmVmaXgsCi0JCQlTdHJpbmcgbmFtZVN1ZmZpeCwgU3RyaW5nIGV4dCkgewotCQkKLQkJU3RyaW5nIGV4aXN0aW5nRWxlbWVudE5hbWUgPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmFtZVByZWZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVQcmVmaXgpOwotCQl9Ci0JCQotCQlpZiAodmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkgPT0gIiIpCi0JCQlyZXR1cm4gIjAiICsgZXh0OyAvLyROT04tTkxTLTEkCi0JCQotCQlpZiAoIWdNYXAuaXNFbXB0eSgpKSB7Ci0JCQlleGlzdGluZ0VsZW1lbnROYW1lID0gIChTdHJpbmcpIGdNYXAuZ2V0KHZpZXcuZ2V0VW5pcXVlSWQoKSk7Ci0JCX0KLQkJLy8gQnJvd3Npbmc6IEJyb3dzaW5nIENQIHdpdGggc3BlY2lhbCBjaGFycyBmYWlsZWQgd2l0aAotCQkvLyBibGFuayBwYWdlcyBhbmQgU2NyaXB0IEVycm9yIG5lZWQgdG8gbWFrZSBhIHZhbGlkIGZpbGUgbmFtZQotCQlidWZmZXIuYXBwZW5kKChleGlzdGluZ0VsZW1lbnROYW1lICE9IG51bGwpID8gZXhpc3RpbmdFbGVtZW50TmFtZSA6IFN0clV0aWwucmVtb3ZlU3BlY2lhbENoYXJhY3RlcnModmlldy5nZXRQcmVzZW50YXRpb25OYW1lKCkpKTsKLQkJaWYgKG5hbWVTdWZmaXggIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZChuYW1lU3VmZml4KTsKLQkJfQotCi0JCWlmIChleHQgIT0gbnVsbCkgewotCQkJaWYgKGV4dC5pbmRleE9mKCIuIikgPCAwKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZXh0ID0gIi4iICsgZXh0OyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKGV4dCk7Ci0JCX0KLQotCQlFbGVtZW50RmlsZSBhID0gbmV3IEVsZW1lbnRGaWxlKHZpZXcuZ2V0VW5pcXVlSWQoKSwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkKLQkJaWYgKGEgIT0gbnVsbCAmJiBhU2V0LmFkZChhKSkgewotCQkJaW50IGV4dERvdCA9IGEuZ2V0RmlsZU5hbWUoKS5sYXN0SW5kZXhPZigiLiIpOwotCQkJYU1hcC5wdXQoKGV4dERvdCA8IDApID8gYS5nZXRGaWxlTmFtZSgpIDogYS5nZXRGaWxlTmFtZSgpLnN1YnN0cmluZygwLCBleHREb3QpLCB2aWV3LmdldFVuaXF1ZUlkKCkpOwkJCSAKLQkJCWdNYXAucHV0KHZpZXcuZ2V0VW5pcXVlSWQoKSwgKGV4dERvdCA8IDApID8gYS5nZXRGaWxlTmFtZSgpIDogYS5nZXRGaWxlTmFtZSgpLnN1YnN0cmluZygwLCBleHREb3QpKTsKLQkJfQotCi0JCXJldHVybiBhLmdldEZpbGVOYW1lKCk7IAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS9zZXJ2aWNlcy9TYWZlVXBkYXRlQ29udHJvbGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1NhZmVVcGRhdGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTUwNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL1NhZmVVcGRhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBhIHV0aWxpdHkgY2xhc3MgdG8gYWxsb3cgVUkgdXBkYXRlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYWZlVXBkYXRlQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBzeW5jIGV4ZWN1dGUgdGhlIHJ1bm5hYmxlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLQkgKiBAcGFyYW0gcnVubmFibGUgUnVubmFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQkJdHJ5IHsKLQkJCS8vIHNpbmNlIHRoaXMgd2lsbCBjYXVzZSBVSSB1cGRhdGUsIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgaW4gdGhlIFVJCi0JCQkvLyB0aHJlYWQKLQkJCS8vIG90aGVyd2lzZSwgd2lsbCBjYXVzZSBJbnZhbGlkIFRocmVhZCBBY2Nlc3MgZXhjZXB0aW9uCi0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCWlmIChkaXNwbGF5ID09IG51bGwpIHsKLQkJCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkJcnVubmFibGUucnVuKCk7Ci0JCQl9IGVsc2UgewotCQkJCWRpc3BsYXkuc3luY0V4ZWMocnVubmFibGUpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFzeW5jIGV4ZWN1dGUgdGhlIHJ1bm5hYmxlIHdpdGggdGhlIHZhbGlkIFVJIHRocmVhZC4KLQkgKiBAcGFyYW0gcnVubmFibGUgUnVubmFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzaW5jZSB0aGlzIHdpbGwgY2F1c2UgVUkgdXBkYXRlLCB3aGljaCBtdXN0IGJlIGV4ZWN1dGVkIGluIHRoZSBVSQotCQkJLy8gdGhyZWFkCi0JCQkvLyBvdGhlcndpc2UsIHdpbGwgY2F1c2UgSW52YWxpZCBUaHJlYWQgQWNjZXNzIGV4Y2VwdGlvbgotCQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQkJfQotCQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJCXJ1bm5hYmxlLnJ1bigpOwotCQkJfSBlbHNlIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3NlcnZpY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5NGI2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvc2VydmljZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIGxpYnJhcnkgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db250ZW50UmVzb3VyY2VTY2FubmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Db250ZW50UmVzb3VyY2VTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjI5MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udGVudFJlc291cmNlU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBzY2FuIGNvbnRlbnQgYW5kIGNvcHkgcmVzb3VyY2VzIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24gZm9yIGJyb3dzaW5nIGFuZCBwdWJsaXNoaW5nCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFJlc291cmNlU2Nhbm5lciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9pbWFnZV9yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8KGltZ3xpZnJhbWUpLio/c3JjXFxzKj1cXHMqXCIpKC4qPykoXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEZpbGUgc291cmNlUm9vdFBhdGg7Ci0KLQlwcml2YXRlIEZpbGUgdGFyZ2V0Um9vdFBhdGg7Ci0KLQlwcml2YXRlIFN0cmluZyByb290Q29udGVudFBhdGg7Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQlwcml2YXRlIExpc3QgcHJvY2Vzc2VkSXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3QgdGhlIG9iamVjdCB3aXRoIHRoZSByb290IHBhdGggb2YgdGhlIHNvdXJjZSBjb250ZW50Ci0JICogQHBhcmFtIHNvdXJjZVJvb3RQYXRoIEZpbGUKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoLCBGaWxlIHRhcmdldFJvb3RQYXRoLCBTdHJpbmcgcm9vdENvbnRlbnRQYXRoKSB7Ci0JCXRoaXMoc291cmNlUm9vdFBhdGgsIHRhcmdldFJvb3RQYXRoLCByb290Q29udGVudFBhdGgsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdCB0aGUgb2JqZWN0IGluc3RhbmNlIHdpdGggdGhlIHJvb3QgcGF0aCBvZiB0aGUgc291cmNlIGNvbnRlbnQgYW5kIGEgY29udGVudCB2YWxpZGF0b3IKLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlUm9vdFBhdGggRmlsZQotCSAqIEBwYXJhbSB2YWxpZGF0b3IgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgQ29udGVudFJlc291cmNlU2Nhbm5lcihGaWxlIHNvdXJjZVJvb3RQYXRoLCBGaWxlIHRhcmdldFJvb3RQYXRoLCBTdHJpbmcgcm9vdENvbnRlbnRQYXRoLCAKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnNvdXJjZVJvb3RQYXRoID0gc291cmNlUm9vdFBhdGg7Ci0JCXRoaXMudGFyZ2V0Um9vdFBhdGggPSB0YXJnZXRSb290UGF0aDsKLQkJdGhpcy5yb290Q29udGVudFBhdGggPSByb290Q29udGVudFBhdGg7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIHNldCBjb250ZW50IHZhbGlkYXRvcgotCSAqIEBwYXJhbSB2YWxpZGF0b3IgSUNvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoSUNvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgc291cmNlIHJvb3QgcGF0aAotCSAqIEByZXR1cm4gRmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFNvdXJjZVJvb3RQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2VSb290UGF0aDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSB0YXJnZXQgcm9vdCBwYXRoCi0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VGFyZ2V0Um9vdFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldFJvb3RQYXRoOwotCX0KLQkKLQkvKioKLQkgKiBzZXQgdGhlIHRhcmdldCByb290IHBhdGgKLQkgKiBAcGFyYW0gdGFyZ2V0Um9vdFBhdGggRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldFJvb3RQYXRoKEZpbGUgdGFyZ2V0Um9vdFBhdGgpIHsKLQkJdGhpcy50YXJnZXRSb290UGF0aCA9IHRhcmdldFJvb3RQYXRoOwotCX0KLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGltYWdlcyBpbiB0aGUgdGV4dC4gY29weSB0aGUgaW1hZ2UgdG8gZGVzdGluYXRpb24gaWYgbmVlZGVkCi0JICogVGhpcyBpcyB1c2VkIGZvciBjb3B5aW5nIHJlc291cmNlcyBmcm9tIGEgbGlicmFyeSB0byBhbm90aGVyIGRlc3RpbmF0aW9uCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmVSZXNvdXJjZXMoU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50UGF0aCkgewotCQlyZXNvbHZlUmVzb3VyY2VzKG51bGwsIGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgY29weWluZyByZXNvdXJjZXMgZnJvbSBhIGxpYnJhcnkgdG8gYW5vdGhlciBkZXN0aW5hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGNvbnRlbnQgU3RyaW5nCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoIFN0cmluZwotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlc291cmNlcyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgY29udGVudCwKLQkJCVN0cmluZyBjb250ZW50UGF0aCkgewotCQlwcm9jZXNzZWRJdGVtcy5jbGVhcigpOwotCQlSZXNvdXJjZUhlbHBlci5yZXNvbHZlUmVzb3VyY2VzKG93bmVyLCBudWxsLCBjb250ZW50LCBjb250ZW50UGF0aCwKLQkJCQl0aGlzLnNvdXJjZVJvb3RQYXRoLCB0aGlzLnRhcmdldFJvb3RQYXRoLCB0aGlzLnJvb3RDb250ZW50UGF0aCwgcHJvY2Vzc2VkSXRlbXMsCi0JCQkJdmFsaWRhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgbW92aW5nIHJlc291cmNlcyB3aXRoaW4gYSBsaWJyYXJ5IGllLCB3aGVuCi0JICogc291cmNlUm9vdFBhdGguZXF1YWxzKHRhcmdldFJvb3RQYXRoKQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyByZXNvbHZlUmVzb3VyY2VzUGx1Z2luKFN0cmluZyBjb250ZW50LCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlTdHJpbmcgb2xkQ29udGVudFBhdGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4odXJsLCBjb250ZW50UGF0aCwgb2xkQ29udGVudFBhdGgpOwotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKTsKLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCWNvbnRlbnQgPSBzYi50b1N0cmluZygpOwotCQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJCS8vIHByb2Nlc3MgYXR0YWNobWVudHMKLQkJCW0gPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfcmVmX2dlbi5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIHNiTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkvLyBTdHJpbmcgdGFnID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgdXJsdGV4dCA9ICIgIiArIG0uZ3JvdXAoMikgKyAiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChSZXNvdXJjZUhlbHBlci5nZXRHdWlkRnJvbVVybCh1cmx0ZXh0KSA9PSBudWxsKSB7Ci0JCQkJCU1hdGNoZXIgbTIgPSBSZXNvdXJjZUhlbHBlci5wX2xpbmtfaHJlZl9waWNrZXIKLQkJCQkJCQkubWF0Y2hlcih1cmx0ZXh0KTsKLQkJCQkJaWYgKG0yLmZpbmQoKSkgewotCQkJCQkJU3RyaW5nIHVybCA9IG0yLmdyb3VwKDEpLnRyaW0oKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl1cmwgPSBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4odXJsLCBjb250ZW50UGF0aCwKLQkJCQkJCQkJb2xkQ29udGVudFBhdGgpOwotCQkJCQkJbTIuYXBwZW5kUmVwbGFjZW1lbnQoc2JMaW5rLCB1cmx0ZXh0LnN1YnN0cmluZyhtMgotCQkJCQkJCQkuc3RhcnQoKSwgbTIuc3RhcnQoMSkpCi0JCQkJCQkJCSsgdXJsICsgdXJsdGV4dC5zdWJzdHJpbmcobTIuZW5kKDEpLCBtMi5lbmQoKSkpOwotCQkJCQkJbTIuYXBwZW5kVGFpbChzYkxpbmspOwotCQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgY29udGVudC5zdWJzdHJpbmcobS5zdGFydCgpLCBtCi0JCQkJCQkJCS5zdGFydCgyKSkKLQkJCQkJCQkJKyBzYkxpbmsudG9TdHJpbmcoKQotCQkJCQkJCQkrIGNvbnRlbnQuc3Vic3RyaW5nKG0uZW5kKDIpLCBtLmVuZCgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGEgcmVzb3VyY2UgdXJsIGZvciBtb3Zpbmcgd2l0aGluIGEgbGlicmFyeQotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcGFyYW0gY29udGVudFBhdGgKLQkgKiAgICAgICAgICAgIG5ldyBwbHVnaW4gcGF0aAotCSAqIEBwYXJhbSBvbGRDb250ZW50UGF0aAotCSAqICAgICAgICAgICAgb2xkIHBsdWdpbiBwYXRoCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzUmVzb3VyY2VVcmxQbHVnaW4oU3RyaW5nIHVybCwgU3RyaW5nIGNvbnRlbnRQYXRoLAotCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoKSB7Ci0JCVN0cmluZyBpbWFnZUZpbGUgPSBSZXNvdXJjZUhlbHBlci5nZXRGaWxlUGF0aEZyb21VcmwodXJsLAotCQkJCW9sZENvbnRlbnRQYXRoKTsKLQkJaWYgKGltYWdlRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0JCVN0cmluZyBuZXdVcmwgPSBudWxsOwotCQlGaWxlIHNvdXJjZTsKLQkJRmlsZSBkZXN0OwotCQkvLyB0YXJnZXRSb290UGF0aCBpcyBzZXQgdG8gdGhlIHRhcmdldCBwbHVnaW4gZGlyZWN0b3J5Ci0JCXNvdXJjZSA9IG5ldyBGaWxlKHRoaXMuc291cmNlUm9vdFBhdGguZ2V0UGFyZW50RmlsZSgpLCBpbWFnZUZpbGUpOwotCQlpZiAoaW1hZ2VGaWxlLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpICE9IC0xKSB7Ci0JCQlTdHJpbmcgb2xkUGx1Z2luID0gaW1hZ2VGaWxlLnN1YnN0cmluZygwLCBpbWFnZUZpbGUKLQkJCQkJLmluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQkJCVN0cmluZyBuZXdQbHVnaW4gPSB0aGlzLnRhcmdldFJvb3RQYXRoLmdldE5hbWUoKTsKLQkJCW5ld1VybCA9IHVybC5yZXBsYWNlRmlyc3Qob2xkUGx1Z2luLCBuZXdQbHVnaW4pOwotCQkJaW1hZ2VGaWxlID0gaW1hZ2VGaWxlLnN1YnN0cmluZyhpbWFnZUZpbGUuaW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOwotCQl9Ci0JCWRlc3QgPSBuZXcgRmlsZSh0aGlzLnRhcmdldFJvb3RQYXRoLCBpbWFnZUZpbGUpOwotCi0JCUZpbGVVdGlsLmNvcHlGaWxlKHNvdXJjZSwgZGVzdCk7Ci0KLQkJcmV0dXJuIG5ld1VybDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBjb3B5IGFsbCByZXNvdXJjZXMgcmVmZXJlbmNlZCBieSB0aGUgdGhlIGVsZW1lbnQgYW5kIGFsbCBpdHMgY29udGFpbmVkIGVsZW1lbnRzLCByZWN1cnNpdmVseQotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmVzb3VyY2VzKEVPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYgKCBlbGVtZW50ID09IG51bGwgKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCApIHsKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZSA9IChEZXNjcmliYWJsZUVsZW1lbnQpZWxlbWVudDsKLQkJCVN0cmluZyBlbGVtZW50UGF0aCA9IFJlc291cmNlSGVscGVyLmdldEVsZW1lbnRQYXRoKGRlKTsKLQkJCQotCQkJLy8xLiBpY29ucwotCQkJamF2YS5uZXQuVVJJIGljb24gPSBkZS5nZXRTaGFwZWljb24oKTsKLQkJCWlmICggaWNvbiAhPSBudWxsICkgewotCQkJCVN0cmluZyBwYXRoID0gaWNvbi5nZXRQYXRoKCk7Ci0JCQkJRmlsZVV0aWwuY29weUZpbGUoCi0JCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBwYXRoKSwgCi0JCQkJCQluZXcgRmlsZShnZXRUYXJnZXRSb290UGF0aCgpLCBwYXRoKSk7Ci0JCQl9Ci0JCQkKLQkJCWljb24gPSBkZS5nZXROb2RlaWNvbigpOwotCQkJaWYgKCBpY29uICE9IG51bGwgKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBpY29uLmdldFBhdGgoKTsKLQkJCQlGaWxlVXRpbC5jb3B5RmlsZSgKLQkJCQkJCW5ldyBGaWxlKGdldFNvdXJjZVJvb3RQYXRoKCksIHBhdGgpLCAKLQkJCQkJCW5ldyBGaWxlKGdldFRhcmdldFJvb3RQYXRoKCksIHBhdGgpKTsKLQkJCX0KLQkJCQotCQkJLy8gMi4gYXR0YWNobWVudHMKLQkJCi0JCQkKLQkJCS8vIDMuIGNvbnRlbnRzCi0JCQlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IGRlLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKCBkZXNjLmVDb250YWluZXIoKSAhPSBudWxsICkgewotCQkJCUxpc3QgZmVhdHVyZXMgPSBMaWJyYXJ5VXRpbC5nZXRTdHJ1Y3R1cmFsRmVhdHVyZXMoZGVzYyk7Ci0vLwkJCQlMaXN0IHByb3BlcnRpZXMgPSBkZXNjLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJCQkJCQkKLQkJCQkvLyBnZXQgYWxsIHN0cmluZyB0eXBlIGF0dHJpYnV0ZXMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCQkuZ2V0KGkpOwotCQkJCQlpZiAoICEoZmVhdHVyZSBpbnN0YW5jZW9mIEVBdHRyaWJ1dGUpICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCU9iamVjdCB2YWx1ZSA9IGRlc2MuZUdldChmZWF0dXJlKTsKLQkJCQkJaWYgKCB2YWx1ZSA9PSBudWxsICkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCQotCQkJCQlpZiAoZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKSApIHsKLQkJCQkJCUxpc3Qgc2VjdGlvbnMgPSAoTGlzdCl2YWx1ZTsKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzZWN0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQkJCVN0cmluZyB0ZXh0ID0gKChTZWN0aW9uKWl0Lm5leHQoKSkuZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCk7Ci0JCQkJCQkJcmVzb2x2ZVJlc291cmNlcyhkZSwgdGV4dCwgZWxlbWVudFBhdGgpOwotCQkJCQkJfQotCQkJCQl9ICBlbHNlIGlmIChmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSApIHsKLQkJCQkJCVN0cmluZyB1cmxzID0gdmFsdWUudG9TdHJpbmcoKS50cmltKCk7Ci0JCQkJCQlpZiAodXJscy5sZW5ndGgoKSAhPSAwICkgewotCQkJCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodXJscywgInwiKTsgLy8gdGhpcyBpcyBoYXJkY29kZWQgc29tZWhvdyAvLyROT04tTkxTLTEkCi0JCQkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSApIHsKLQkJCQkJCQkJU3RyaW5nIHVybCA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZSgKLQkJCQkJCQkJCQluZXcgRmlsZShnZXRTb3VyY2VSb290UGF0aCgpLCBlbGVtZW50UGF0aCArIHVybCksIAotCQkJCQkJCQkJCW5ldyBGaWxlKGdldFRhcmdldFJvb3RQYXRoKCksIGVsZW1lbnRQYXRoICsgdXJsKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSBpZiAoIHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nICkgewotCQkJCQkJcmVzb2x2ZVJlc291cmNlcyhkZSwgdmFsdWUudG9TdHJpbmcoKSwgZWxlbWVudFBhdGgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29udmVydEFjdGl2aXR5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTAyNGZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvbnZlcnRBY3Rpdml0eVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotCi0vKioKLSAqIGNsYXNzIHRvIGNvbnZlcnQgYWN0aXZpdHkgdHlwZXMKLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnRBY3Rpdml0eVR5cGUgewotCi0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBvbGRBY3Rpdml0eSA9IG51bGw7Ci0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkKLS8vCS8vIG9yaWdpbmFsIGFjdGl2aXR5J3MgY29udGFpbmVyCi0vLwlwcml2YXRlIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBvbGRBY3Rpdml0eUNvbnRhaW5lciA9IG51bGw7Ci0vLwkKLS8vCS8vIHRoZSBvcmlnaW5hbCBhY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IG9sZEFjdGl2aXR5QnJlYWtkb3duID0gbnVsbDsKLS8vCQotLy8JLy8gaW5kZXggb2YgdGhlIG9yaWdpbmFsIGFjdGl2aXR5IGluIGl0J3Mgc3VwZXJBY3Rpdml0eSdzIGJyZWFrZG93biBsaXN0Ci0vLwlwcml2YXRlIHN0YXRpYyBpbnQgb2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCA9IC0xOwotLy8JCi0vLwkvLyBvcmlnaW5hbCBBY3Rpdml0eSdzIHBhcmVudCBhY3Rpdml0eQotLy8JcHJpdmF0ZSBzdGF0aWMgQWN0aXZpdHkgc3VwZXJBY3QgPSBudWxsOwotLy8JCi0vLwkvLyBwYXJlbnQgYWN0aXZpdHkncyBicmVha2Rvd24gbGlzdAotLy8JcHJpdmF0ZSBzdGF0aWMgRUxpc3Qgc3VwZXJBY3RicmVha2Rvd25MaXN0ID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyB2YXJpYWJpbGl0eVR5cGUKLS8vCXByaXZhdGUgc3RhdGljIFZhcmlhYmlsaXR5VHlwZSBvbGRBY3RWYXJUeXBlID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyB2YXJpYWJpbGl0eUVsZW1lbnQKLS8vCXByaXZhdGUgc3RhdGljIFZhcmlhYmlsaXR5RWxlbWVudCBvbGRBY3RWYXJFbGVtZW50ID0gbnVsbDsKLS8vCQotLy8JLy8gb3JpZ2luYWwgQWN0aXZpdHkncyBpbW1lZGl0YXRlVmFyaWV0aWVzCi0vLwlwcml2YXRlIHN0YXRpYyBMaXN0IG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBpbnRbXSBjb21wYXRpYmxlQWN0aXZpdGllcyA9IHsgVW1hUGFja2FnZS5BQ1RJVklUWSwKLQkJCVVtYVBhY2thZ2UuSVRFUkFUSU9OLAotCQkJVW1hUGFja2FnZS5QSEFTRSwKLQkJCVVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOLAotCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTLAotCX07Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgY29tcGF0aWJsZUFjdGl2aXRpZXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGF0aWJsZUFjdGl2aXRpZXMubGVuZ3RoOyBpKyspCi0JCQljb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuYWRkKG5ldyBJbnRlZ2VyKGNvbXBhdGlibGVBY3Rpdml0aWVzW2ldKSk7Ci0JfQotCi0JLy8gVGhpcyBtZXRob2QgaXMgYnVnZ3kgYW5kIGlzIHJlcGxhY2VkIHdpdGggVHlwZUNvbnZlcnRlci5jb252ZXJ0QWN0aXZpdHkoKQotCS8vCi0vLwlwdWJsaWMgc3RhdGljIEFjdGl2aXR5IGNvbnZlcnRBY3Rpdml0eShBY3Rpdml0eSBvbGRBY3Rpdml0eSwgaW50IG5ld1R5cGUsCi0vLwkJCURlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLS8vCi0vLwkJCi0vLwkJQ29udmVydEFjdGl2aXR5VHlwZS5vbGRBY3Rpdml0eSA9IG9sZEFjdGl2aXR5OwotLy8JCQotLy8JCS8vIGFjdGl2aXR5IGlzIGFscmVhZHkgdGhpcyB0eXBlCi0vLwkJaWYgKG5ld1R5cGUgPT0gb2xkQWN0aXZpdHkuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCQotLy8JCS8vIG5ld1R5cGUgaXMgbm90IHZhbGlkCi0vLwkJaWYgKCFjb21wYXRpYmxlQWN0aXZpdGllc0xpc3QuY29udGFpbnMobmV3IEludGVnZXIobmV3VHlwZSkpKSB7Ci0vLwkJCXJldHVybiBudWxsOwotLy8JCX0KLS8vCQkKLS8vCQlBY3Rpdml0eSBuZXdBY3Rpdml0eSA9IGRvQ29udmVydChuZXdUeXBlLCBjb21tYW5kKTsKLS8vCi0vLwkJcmV0dXJuIG5ld0FjdGl2aXR5OwotLy8JfQotLy8KLS8vCXByaXZhdGUgc3RhdGljIEFjdGl2aXR5IGRvQ29udmVydChpbnQgbmV3VHlwZSwgRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQgY29tbWFuZCkgewotLy8JCQotLy8JCXRyeSB7Ci0vLwkJCUZpbGUgb2xkQWN0aXZpdHlQYXRoRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLS8vCQkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlQYXRoKCksIE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIKLS8vCQkJCQkuZ2V0RWxlbWVudFBhdGgob2xkQWN0aXZpdHkpKTsKLS8vCi0vLwkJCS8vIGNyZWF0ZSBuZXcgYWN0aXZpdHkKLS8vCQkJbmV3QWN0aXZpdHkgPSBjcmVhdGVOZXdBY3Rpdml0eShuZXdUeXBlKTsKLS8vCi0vLwkJCS8vIFRPRE86IHN0b3JlIG9sZEFjdGl2aXR5J3MgZmVhdHVyZXMgaGVyZSwgYW5kIGRvbid0IHNldCB0aGVtIHVudGlsCi0vLwkJCS8vIGFmdGVyIG9sZGFjdGl2aXR5IGlzIGRlbGV0ZWQKLS8vCQkJCi0vLwkJCS8vIHN0b3JlIG9sZEFjdGl2aXR5J3MgYnJlYWtkb3duIGxpc3QKLS8vCQkJb2xkQWN0aXZpdHlCcmVha2Rvd24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IG9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCW9sZEFjdGl2aXR5QnJlYWtkb3duLmFkZChpdGVyLm5leHQoKSk7Ci0vLwkJCX0KLS8vCQkJb2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCA9IGdldEluZGV4SW5CcmVha2Rvd24ob2xkQWN0aXZpdHkpOwotLy8JCQkKLS8vCQkJLy8gY29weSBhbGwgZGF0YSBmcm9tIG9sZEFjdGl2aXR5IHRvIG5ld0FjdGl2aXR5Ci0vLwkJCUl0ZXJhdG9yIGl0ZXIgPSBvbGRBY3Rpdml0eS5lQ2xhc3MoKS5nZXRFQWxsU3RydWN0dXJhbEZlYXR1cmVzKCkKLS8vCQkJCQkuaXRlcmF0b3IoKTsKLS8vCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0vLwkJCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotLy8JCQkJT2JqZWN0IG8gPSBvbGRBY3Rpdml0eS5lR2V0KGZlYXR1cmUpOwotLy8JCQkJaWYgKGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04KLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlECi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5BQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUyAKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUCi0vLwkJCQkJCSYmIGZlYXR1cmUuZ2V0RmVhdHVyZUlEKCkgIT0gVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQKLS8vCQkJCQkJJiYgZmVhdHVyZS5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUwotLy8JCQkJCQkmJiBmZWF0dXJlLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUwotLy8JCQkJCQkpIHsKLS8vCQkJCQluZXdBY3Rpdml0eS5lU2V0KGZlYXR1cmUsIG8pOwotLy8JCQkJfQotLy8JCQl9Ci0vLwotLy8JCQkvLyBzdG9yZSBHdWlkIGhlcmUKLS8vCQkJU3RyaW5nIG9sZEFjdGl2aXR5R3VpZCA9IG9sZEFjdGl2aXR5LmdldEd1aWQoKTsKLS8vCi0vLwkJCS8vIHN0b3JlIG9sZCBhY3Rpdml0eSdzIGVDb250YWluZXIKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIgPSAoUHJvY2Vzc1BhY2thZ2UpIG9sZEFjdGl2aXR5Ci0vLwkJCQkJLmVDb250YWluZXIoKTsKLS8vCi0vLwkJCS8vIHNldCBjb250YWluZXIKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkucmVtb3ZlKG9sZEFjdGl2aXR5KTsKLS8vCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG5ld0FjdGl2aXR5KTsKLS8vCi0vLwkJCS8vIGNyZWF0ZSBwcmVzZW50YXRpb24KLS8vCQkJQ29udGVudERlc2NyaXB0aW9uIG5ld0NvbnRlbnREZXNjID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotLy8JCQkJCS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24obmV3QWN0aXZpdHkpOwotLy8JCQluZXdBY3Rpdml0eS5zZXRQcmVzZW50YXRpb24obmV3Q29udGVudERlc2MpOwotLy8KLS8vCQkJRmlsZSBuZXdBY3Rpdml0eVBhdGhGaWxlID0gbmV3IEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotLy8JCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSwgTWV0aG9kTGlicmFyeVBlcnNpc3RlcgotLy8JCQkJCS5nZXRFbGVtZW50UGF0aChuZXdBY3Rpdml0eSkpOwotLy8JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcigKLS8vCQkJCQlvbGRBY3Rpdml0eVBhdGhGaWxlKTsKLS8vCQkJc2Nhbm5lci5zZXRUYXJnZXRSb290UGF0aChuZXdBY3Rpdml0eVBhdGhGaWxlKTsKLS8vCi0vLwkJCS8vIGNvcHkgYWxsIHByZXNlbnRhdGlvbiBkYXRhIGZyb20gb2xkQWN0aXZpdHkgdG8gbmV3QWN0aXZpdHkKLS8vCQkJQ29udGVudERlc2NyaXB0aW9uIG9sZENvbnRlbnREZXNjID0gb2xkQWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCk7Ci0vLwkJCWl0ZXIgPSBvbGRDb250ZW50RGVzYy5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0vLwkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotLy8JCQkJRUF0dHJpYnV0ZSBhdHRyaWIgPSAoRUF0dHJpYnV0ZSkgaXRlci5uZXh0KCk7Ci0vLwkJCQlpZiAoYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFCi0vLwkJCQkJCSYmIGF0dHJpYi5nZXRGZWF0dXJlSUQoKSAhPSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUKLS8vCQkJCQkJJiYgYXR0cmliLmdldEZlYXR1cmVJRCgpICE9IFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVAotLy8JCQkJCQkpIHsKLS8vCQkJCQlPYmplY3QgbyA9IG9sZENvbnRlbnREZXNjLmVHZXQoYXR0cmliKTsKLS8vCQkJCQlpZiAobyBpbnN0YW5jZW9mIFN0cmluZyAmJiAoKFN0cmluZykgbykudHJpbSgpLmxlbmd0aCgpID4gMCkgewotLy8JCQkJCQkvLyBwcm9jZXNzIGxpbmtzCi0vLwkJCQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhuZXdBY3Rpdml0eSwgKFN0cmluZykgbywgIiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJCS8vIHNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhuZXdBY3Rpdml0eSwgKFN0cmluZykgbywKLS8vCQkJCQkJLy8gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5nZXRFbGVtZW50UGF0aChuZXdBY3Rpdml0eSkpOwotLy8JCQkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQkJfQotLy8JCQkJCW5ld0NvbnRlbnREZXNjLmVTZXQoYXR0cmliLCBvKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQkKLS8vCQkJLy8gbWFrZSBicmVha2Rvd24gbGlua3MKLS8vCQkJTGlzdCBvbGRBY3RCcmVha2Rvd25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCQlvbGRBY3RCcmVha2Rvd25MaXN0LmFkZEFsbChvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpKTsKLS8vCQkJZm9yIChpdGVyID0gb2xkQWN0QnJlYWtkb3duTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJQnJlYWtkb3duRWxlbWVudCBiZSA9IChCcmVha2Rvd25FbGVtZW50KWl0ZXIubmV4dCgpOwotLy8JCQkJYmUuc2V0U3VwZXJBY3Rpdml0aWVzKG51bGwpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlvbGRBY3Rpdml0eS5nZXRCcmVha2Rvd25FbGVtZW50cygpLmNsZWFyKCk7Ci0vLwkJCW5ld0FjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKG9sZEFjdGl2aXR5QnJlYWtkb3duKTsKLS8vCQkJLy8gbW92ZSBuZXcgYWN0aXZpdHkgdG8gcHJvcGVyIGluZGV4IGluIHRoZSBwYXJlbnQgYWN0J3MgYnJlYWtkb3duIGxpc3QKLS8vCQkJc3VwZXJBY3QgPSBVbWFVdGlsLmdldFBhcmVudEFjdGl2aXR5KG9sZEFjdGl2aXR5KTsKLS8vCQkJc3VwZXJBY3RicmVha2Rvd25MaXN0ID0gKEVMaXN0KXN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0vLwkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5hZGQob2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCwgbmV3QWN0aXZpdHkpOwotLy8JCQkKLS8vCQkJLy8gaGFuZGxlIHZhcmlhYmlsaXR5Ci0vLwkJCW9sZEFjdFZhckVsZW1lbnQgPSBvbGRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0vLwkJCW9sZEFjdFZhclR5cGUgPSBvbGRBY3Rpdml0eS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLS8vCQkJb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLS8vCQkJb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdC5hZGRBbGwoQXNzb2NpYXRpb25IZWxwZXIuZ2V0SW1tZWRpYXRlVmFyaWV0aWVzKG9sZEFjdGl2aXR5KSk7Ci0vLwkJCQotLy8JCQlpZiAob2xkQWN0VmFyRWxlbWVudCAhPSBudWxsICYmIG9sZEFjdFZhclR5cGUgIT0gbnVsbCkgewotLy8JCQkJbmV3QWN0aXZpdHkuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChvbGRBY3RWYXJFbGVtZW50KTsKLS8vCQkJCW5ld0FjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShvbGRBY3RWYXJUeXBlKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJZm9yIChpdGVyID0gb2xkQWN0SW1tZWRpYXRlVmFyaWV0aWVzTGlzdC5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotLy8JCQkJVmFyaWFiaWxpdHlFbGVtZW50IHZlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgaXRlci5uZXh0KCk7Ci0vLwkJCQl2ZS5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KG5ld0FjdGl2aXR5KTsKLS8vCQkJfQotLy8KLS8vCQkJLy8gY3JlYXRlIHRlbXAgUHJvY2Vzc1BhY2thZ2UgYW5kIG1vdmUgb2xkQWN0aXZpdHkgdG8gaXQKLS8vCQkJUHJvY2Vzc1BhY2thZ2UgdGVtcFBhcmVudCA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0vLwkJCXRlbXBQYXJlbnQuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9sZEFjdGl2aXR5KTsKLS8vCQkJdGVtcFBhcmVudC5zZXROYW1lKCJ0ZW1wIFBQIGZvciBkZWxldGlvbiIpOyAvLyROT04tTkxTLTEkCi0vLwotLy8JCQkvLyBkZWxldGUgb2xkIEFjdGl2aXR5IGhlcmUgLSBpZiBmYWlscywgcm9sbCBiYWNrIGJ5IGRlbGV0aW5nIG5ldyBBY3Rpdml0eQotLy8JCQljb21tYW5kLmV4ZWN1dGUoKTsKLS8vCi0vLwkJCWlmICghY29tbWFuZC5leGVjdXRlZCB8fCBjb21tYW5kLmZhaWxlZCkgewotLy8JCQkJLy8gZGVsZXRlIGZhaWxlZCwgb3IgdXNlciBzZWxlY3RlZCBjYW5jZWwgb24gdGhlICJkZWxldGUKLS8vCQkJCS8vIHJlZmVyZW5jZXMiIGRpYWxvZwotLy8JCQkJLy8gY2xlYW4gdXAgbmV3IEFjdGl2aXR5Ci0vLwotLy8JCQkJdW5kbygpOwotLy8KLS8vCQkJCW5ld0FjdGl2aXR5ID0gbnVsbDsKLS8vCQkJCW5ld0NvbnRlbnREZXNjID0gbnVsbDsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwotLy8JCQkvLyBzZXQgbmV3IGFjdGl2aXR5J3MgR1VJRAotLy8JCQluZXdBY3Rpdml0eS5zZXRHdWlkKG9sZEFjdGl2aXR5R3VpZCk7Ci0vLwkJCQotLy8JCQkvLyBUT0RPOiB1cGRhdGUgZWRpdG9yIGNvbnRlbnRzIAotLy8KLS8vCQkJLy8gVE9ETzogb24gcm9sbGJhY2ssIGxpYnJhcnkgbWF5IGJlIGRpcnR5IGJlY2F1c2Ugb2YgdGhlCi0vLwkJCS8vIGNvbnRhaW5lci9jb250ZW50ZGVzYyBjaGFuZ2VzIHdlJ3ZlIGRvbmUKLS8vCQkJLy8gZml4IHRoaXMgYnkgc3RvcmluZyBhbGwgdGhlIG9sZCBhY3Rpdml0eSdzIGluZm8sIHRoZW4gb25seSBjcmVhdGUKLS8vCQkJLy8gbmV3IGFjdGl2aXR5IGFmdGVyIG9sZCBvbmUgaGFzCi0vLwkJCS8vIGJlZW4gZGVsZXRlZC4KLS8vCi0vLwkJCVNldCBtb2RpZmllZFJlc291cmNlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLS8vCQkJCi0vLwkJCS8vIHNhdmUgbmV3IGFjdGl2aXR5IGFuZCBpdHMgcHJlc2VudGF0aW9uCi0vLwkJCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyLkZhaWxTYWZlTWV0aG9kTGlicmFyeVBlcnNpc3RlciBwZXJzaXN0ZXIgPSBDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5Ci0vLwkJCQkJLmdldE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotLy8JCQl0cnkgewotLy8JCQkJaWYgKG5ld0FjdGl2aXR5LmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQobmV3QWN0aXZpdHkuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKG5ld0FjdGl2aXR5LmdldFByZXNlbnRhdGlvbigpLmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQobmV3QWN0aXZpdHkuZ2V0UHJlc2VudGF0aW9uKCkuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKG9sZEFjdGl2aXR5Q29udGFpbmVyLmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQob2xkQWN0aXZpdHlDb250YWluZXIuZVJlc291cmNlKCkpOwotLy8JCQkJaWYgKHN1cGVyQWN0LmVSZXNvdXJjZSgpICE9IG51bGwpCi0vLwkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoc3VwZXJBY3QuZVJlc291cmNlKCkpOwotLy8KLS8vCQkJCWZvciAoaXRlciA9IG1vZGlmaWVkUmVzb3VyY2VTZXQuaXRlcmF0b3IoKTtpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpIGl0ZXIubmV4dCgpOwotLy8JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0vLwkJCQl9Ci0vLwkJCQlwZXJzaXN0ZXIuY29tbWl0KCk7Ci0vLwotLy8JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8JCQkJcGVyc2lzdGVyLnJvbGxiYWNrKCk7Ci0vLwkJCQljb21tYW5kLnVuZG8oKTsKLS8vCQkJCQotLy8JCQkJdW5kbygpOwotLy8JCQkJTGlicmFyeVBsdWdpbgotLy8JCQkJCQkuZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCQkuZGlzcGxheUVycm9yKAotLy8JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuY29udmVydEFjdGl2aXR5RXJyb3JfdGl0bGUsCi0vLwkJCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5zYXZlQ29udmVydGVkQWN0aXZpdHlFcnJvcl9tc2csIG5ld0FjdGl2aXR5LmdldE5hbWUoKSksIAotLy8JCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuZXJyb3JfcmVhc29uLAotLy8JCQkJCQkJCWUpOwotLy8JCQkJbmV3QWN0aXZpdHkgPSBudWxsOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotLy8JCQljb21tYW5kLnVuZG8oKTsKLS8vCQkJdW5kbygpOwotLy8JCQlMaWJyYXJ5UGx1Z2luCi0vLwkJCQkJLmdldERlZmF1bHQoKQotLy8JCQkJCS5nZXRNc2dEaWFsb2coKQotLy8JCQkJCS5kaXNwbGF5RXJyb3IoCi0vLwkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLmNvbnZlcnRBY3Rpdml0eUVycm9yX3RpdGxlLAotLy8JCQkJCQkJTkxTLmJpbmQoTGlicmFyeVJlc291cmNlcy5jb252ZXJ0QWN0aXZpdHlFcnJvcl9tc2csIG5ld0FjdGl2aXR5LmdldE5hbWUoKSksIAotLy8JCQkJCQkJTGlicmFyeVJlc291cmNlcy5lcnJvcl9yZWFzb24sIAotLy8JCQkJCQkJZXgpOwotLy8JCQluZXdBY3Rpdml0eSA9IG51bGw7Ci0vLwkJfQotLy8JCXJldHVybiBuZXdBY3Rpdml0eTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHN0YXRpYyBBY3Rpdml0eSBjcmVhdGVOZXdBY3Rpdml0eShpbnQgbmV3VHlwZSkgewotLy8JCXN3aXRjaCAobmV3VHlwZSkgewotLy8JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFk6Ci0vLwkJCQlyZXR1cm4gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKTsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjoKLS8vCQkJCXJldHVybiBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJdGVyYXRpb24oKTsKLS8vCQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotLy8JCQkJcmV0dXJuIFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBoYXNlKCk7Ci0vLwkJCWRlZmF1bHQ6Ci0vLwkJCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgc3RhdGljIGludCBnZXRJbmRleEluQnJlYWtkb3duKEFjdGl2aXR5IGFjdCkgewotLy8JCWludCBpbmRleCA9IC0xOwotLy8JCUFjdGl2aXR5IHN1cGVyQWN0ID0gVW1hVXRpbC5nZXRQYXJlbnRBY3Rpdml0eShhY3QpOwotLy8JCWlmIChzdXBlckFjdCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLS8vCQkJLy8gZ2V0IHByb2Nlc3MsIGZpbmQgYnJlYWtkb3duCi0vLwkJCWluZGV4ID0gKChQcm9jZXNzQ29tcG9uZW50KXN1cGVyQWN0KS5nZXRQcm9jZXNzKCkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5pbmRleE9mKGFjdCk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlpbmRleCA9IHN1cGVyQWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuaW5kZXhPZihhY3QpOwotLy8JCX0KLS8vCQlyZXR1cm4gaW5kZXg7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kbygpIHsKLS8vCQkvLyB1bmRvIG1vdmluZyBvZiBvbGRBY3Rpdml0eSB0byB0aGUgZmFrZSBQUAotLy8JCWlmIChvbGRBY3Rpdml0eUNvbnRhaW5lciAhPSBudWxsKSB7Ci0vLwkJCW9sZEFjdGl2aXR5Q29udGFpbmVyLmdldFByb2Nlc3NFbGVtZW50cygpLnJlbW92ZShuZXdBY3Rpdml0eSk7Ci0vLwkJCWlmICghb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuY29udGFpbnMob2xkQWN0aXZpdHkpKQotLy8JCQkJb2xkQWN0aXZpdHlDb250YWluZXIuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkKG9sZEFjdGl2aXR5KTsKLS8vCQl9Ci0vLwkJLy8gdW5kbyB0aGUgYnJlYWtkb3duIGxpbmsgY2hhbmdlcwotLy8JCWlmIChuZXdBY3Rpdml0eSAhPSBudWxsKSB7Ci0vLwkJCW5ld0FjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLS8vCQl9Ci0vLwkJaWYgKG9sZEFjdGl2aXR5QnJlYWtkb3duICE9IG51bGwgJiYgb2xkQWN0aXZpdHkgIT0gbnVsbCkgewotLy8vLwkJCW9sZEFjdGl2aXR5LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLS8vCQkJb2xkQWN0aXZpdHkuZ2V0QnJlYWtkb3duRWxlbWVudHMoKS5hZGRBbGwob2xkQWN0aXZpdHlCcmVha2Rvd24pOwotLy8JCX0KLS8vCQlpZiAoc3VwZXJBY3RicmVha2Rvd25MaXN0ICE9IG51bGwpIHsKLS8vCQkJaWYgKG5ld0FjdGl2aXR5ICE9IG51bGwpIHsKLS8vCQkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5yZW1vdmUobmV3QWN0aXZpdHkpOwotLy8JCQl9Ci0vLwkJCWlmIChvbGRBY3Rpdml0eUJyZWFrZG93bkluZGV4ICE9IC0xICYmIG9sZEFjdGl2aXR5ICE9IG51bGwgJiYKLS8vCQkJCQkhc3VwZXJBY3RicmVha2Rvd25MaXN0LmNvbnRhaW5zKG9sZEFjdGl2aXR5KSkKLS8vCQkJCXN1cGVyQWN0YnJlYWtkb3duTGlzdC5hZGQob2xkQWN0aXZpdHlCcmVha2Rvd25JbmRleCwgb2xkQWN0aXZpdHkpOwotLy8JCX0KLS8vCQkKLS8vCQkvLyB2YXJpYWJpbGl0eQotLy8JCWlmIChvbGRBY3RWYXJFbGVtZW50ICE9IG51bGwgJiYgb2xkQWN0VmFyVHlwZSAhPSBudWxsKSB7Ci0vLwkJCW9sZEFjdGl2aXR5LnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQob2xkQWN0VmFyRWxlbWVudCk7Ci0vLwkJCW9sZEFjdGl2aXR5LnNldFZhcmlhYmlsaXR5VHlwZShvbGRBY3RWYXJUeXBlKTsKLS8vCQl9Ci0vLwkJCi0vLwkJaWYgKG9sZEFjdEltbWVkaWF0ZVZhcmlldGllc0xpc3QgIT0gbnVsbCkgewotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBvbGRBY3RJbW1lZGlhdGVWYXJpZXRpZXNMaXN0Lml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlWYXJpYWJpbGl0eUVsZW1lbnQgdmUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVyLm5leHQoKTsKLS8vCQkJCXZlLnNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQob2xkQWN0aXZpdHkpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCi0vLwl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvQ29weUF0dGFjaG1lbnRzVG9OZXdMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDlhNjY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0NvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuTWV0aG9kRWxlbWVudEFkZENvbW1hbmQuQmFzaWNSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklDb250ZW50VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiB1dGlsaXR5IGNsYXNzIHRvIGNvcHkgYXR0YWNobWVlbnRzIHRvIGFub3RoZXIgbG9jYXRpb24KLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpY25lIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24gZXh0ZW5kcyBCYXNpY1Jlc291cmNlTWFuYWdlciB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gbW9kaWZpZWRSZXNvdXJjZVNldDsKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZzsKLQotCXByaXZhdGUgTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcDsKLQotCXByaXZhdGUgTWV0aG9kUGx1Z2luIGxhc3RPbGRQbHVnaW4gPSBudWxsOwotCi0JcHVibGljIENvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24oKSB7Ci0JCWRlYnVnID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGF0dGFjaG1lbnRzIHdpdGhpbiBhIGxpYnJhcnksIGZyb20gb25lIHBsdWdpbiB0byBhbm90aGVyCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gY29weVJlZmVyZW5jZWRDb250ZW50cyhDb2xsZWN0aW9uIGVsZW1lbnRzLAotCQkJTWFwIGVsZW1lbnRUb09sZFBsdWdpbk1hcCkgewotCQlsYXN0T2xkUGx1Z2luID0gbnVsbDsKLQkJbW9kaWZpZWRSZXNvdXJjZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChlbGVtZW50VG9PbGRQbHVnaW5NYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JCX0KLQkJdGhpcy5lbGVtZW50VG9PbGRQbHVnaW5NYXAgPSBlbGVtZW50VG9PbGRQbHVnaW5NYXA7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLQkJCQlSZXNvdXJjZSByID0gKFJlc291cmNlKSBvOwotCQkJCUl0ZXJhdG9yIHJlc291cmNlSXRlciA9IHIuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChyZXNvdXJjZUl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSByZXNvdXJjZUl0ZXIubmV4dCgpOwotCQkJCQlIYW5kbGVBdHRhY2htZW50c1BsdWdpbihlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBFT2JqZWN0KSB7Ci0JCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIG87Ci0JCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkUmVzb3VyY2VTZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIEhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKEVPYmplY3QgZSkgewotCQkvLyBoYW5kbGUgc2VsZgotCQlNZXRob2RFbGVtZW50IGVsZW1lbnRUb1Byb2Nlc3MgPSBudWxsOwotCQkvLyBmaW5kIHRoZSBvbGQgcGx1Z2luLCBpZiB0aGVyZSBpcyBvbmUKLQkJaWYgKGVsZW1lbnRUb09sZFBsdWdpbk1hcCAhPSBudWxsCi0JCQkJJiYgKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKSAhPSBudWxsKSB7Ci0JCQlsYXN0T2xkUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgZWxlbWVudFRvT2xkUGx1Z2luTWFwLmdldChlKTsKLQkJfQotCi0JCWlmIChsYXN0T2xkUGx1Z2luICE9IG51bGwpIHsKLQkJCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGRlID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZTsKLQotCQkJCS8vIEN1c3RvbSBpY29ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNoYXBlIGljb24KLQkJCQkJamF2YS5uZXQuVVJJIHNoYXBlSWNvblVyaSA9IGRlLmdldFNoYXBlaWNvbigpOwotCQkJCQlpZiAoc2hhcGVJY29uVXJpICE9IG51bGwpIHsKLQkJCQkJCS8vIFRvIGhhbmRsZSB0aGUgc2hhcGVJY29uL25vZGVJY29uIHVyaSBnb3QgY2hhbmdlZCwgaXRzIHJlbGF0aXZlIHRvIHBsdWdpblBhdGguCi0JCQkJCQlqYXZhLm5ldC5VUkkgbmV3U2hhcGVJY29uVXJpID0gaGFuZGxlSWNvblVSSShkZSwKLQkJCQkJCQkJc2hhcGVJY29uVXJpKTsKLQkJCQkJCWlmIChuZXdTaGFwZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJCWRlLnNldFNoYXBlaWNvbihuZXdTaGFwZUljb25VcmkpOwotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKGRlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIG5vZGUgaWNvbgotCQkJCQlqYXZhLm5ldC5VUkkgbm9kZUljb25VcmkgPSBkZS5nZXROb2RlaWNvbigpOwotCQkJCQlpZiAobm9kZUljb25VcmkgIT0gbnVsbCkgewotCQkJCQkJamF2YS5uZXQuVVJJIG5ld05vZGVJY29uVXJpID0gaGFuZGxlSWNvblVSSShkZSwKLQkJCQkJCQkJc2hhcGVJY29uVXJpKTsKLQkJCQkJCWlmIChuZXdOb2RlSWNvblVyaSAhPSBudWxsKSB7Ci0JCQkJCQkJZGUuc2V0Tm9kZWljb24obmV3Tm9kZUljb25VcmkpOwotCQkJCQkJCW1vZGlmaWVkUmVzb3VyY2VTZXQuYWRkKGRlLmVSZXNvdXJjZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJCUhhbmRsZUF0dGFjaG1lbnRzUGx1Z2luKGRlLmdldFByZXNlbnRhdGlvbigpKTsKLQkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50RGVzY3JpcHRpb24pIHsKLQkJCQllbGVtZW50VG9Qcm9jZXNzID0gKENvbnRlbnREZXNjcmlwdGlvbikgZTsKLQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQllbGVtZW50VG9Qcm9jZXNzID0gKE1ldGhvZEVsZW1lbnQpIGU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb24uSGFuZGxlQXR0YWNobWVudHNQbHVnaW46IHVua25vd24gdHlwZSAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChlbGVtZW50VG9Qcm9jZXNzICE9IG51bGwKLQkJCQkJJiYgZWxlbWVudFRvUHJvY2Vzcy5lUmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJLy8gc2V0IHVwIENvbnRlbnRSZXNvdXJjZVNjYW5uZXIgZm9yIHRoaXMgZWxlbWVudAotCQkJCS8vIGdpdmUgQ29udGVudFJlc291cmNlU2Nhbm5lciBzYW1lIGRpcmVjdG9yeSBmb3Igc291cmNlUm9vdFBhdGgKLQkJCQkvLyBhbmQgdGFyZ2V0Um9vdFBhdGgKLS8vCQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLS8vCQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0vLwkJCQkKLS8vCQkJCVVSSSBlbGVtZW50VVJJID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRFbGVtZW50UmVsYXRpdmVVUkkoZWxlbWVudFRvUHJvY2VzcykgOiBudWxsOwotLy8JCQkJaWYgKGVsZW1lbnRVUkkgPT0gbnVsbCB8fCBlbGVtZW50VVJJLnNlZ21lbnRDb3VudCgpIDwgMSkKLS8vCQkJCQlyZXR1cm47Ci0JCQkJCi0JCQkJCi0JCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gUmVzb3VyY2VIZWxwZXIuZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudFRvUHJvY2Vzcyk7Ci0JCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbGFzdE9sZFBsdWdpblJlc01nciA9IFJlc291cmNlSGVscGVyLmdldFJlc291cmNlTWdyKGxhc3RPbGRQbHVnaW4pOwotCQkJCQotCQkJCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IGdldFNjYW5uZXIoZWxlbWVudFRvUHJvY2Vzcyk7Ci0KLQkJCQkvLyBpdGVyYXRlIHRocnUgZWxlbWVudCdzIGNvbnRlbnQKLQkJCQlTdHJpbmcgY29udGVudFBhdGggPSBSZXNvdXJjZUhlbHBlcgotCQkJCQkJLmdldEVsZW1lbnRQYXRoKChNZXRob2RFbGVtZW50KSBlbGVtZW50VG9Qcm9jZXNzKTsKLQkJCQlpZiAoY29udGVudFBhdGggPT0gbnVsbCB8fCBjb250ZW50UGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4KLQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJLmdldExvZ2dlcigpCi0JCQkJCQkJLmxvZ1dhcm5pbmcoCi0JCQkJCQkJCQlOTFMuYmluZChMaWJyYXJ5UmVzb3VyY2VzLkNvcHlBdHRhY2htZW50c1RvTmV3TG9jYXRpb25fbG9nX25vQ29udGVudFBhdGgsIChuZXcgT2JqZWN0W10geyAoKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRUb1Byb2Nlc3MpLmdldE5hbWUoKSB9KSkpOyAKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIEZJWE1FOiB0aGlzIGlzIG5vdCBhbHdheXMgY29ycmVjdCB0aGlzIHJlbGF0aXZlIG9mIHRoZSBlbGVtZW50J3MgZm9sZGVyIG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkCi0JCQkJLy8gZHVyaW5nIG1vdmUvY29weQotCQkJCVN0cmluZyBvbGRDb250ZW50UGF0aDIgPSBjb250ZW50UGF0aC5yZXBsYWNlRmlyc3QoVW1hVXRpbAotCQkJCQkJLmdldE1ldGhvZFBsdWdpbihlbGVtZW50VG9Qcm9jZXNzKS5nZXROYW1lKCksCi0JCQkJCQlsYXN0T2xkUGx1Z2luLmdldE5hbWUoKSk7Ci0JCQkJU3RyaW5nIG9sZENvbnRlbnRQYXRoID0gUmVzb3VyY2VIZWxwZXIKLQkJCQkJLmdldEVsZW1lbnRQYXRoKGxhc3RPbGRQbHVnaW4pOwotCi0JCQkJSXRlcmF0b3IgaXRlciA9IGVsZW1lbnRUb1Byb2Nlc3MuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKQotCQkJCQkJLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUVBdHRyaWJ1dGUgYXR0cmliID0gKEVBdHRyaWJ1dGUpIGl0ZXIubmV4dCgpOwotCQkJCQlPYmplY3QgbyA9IGVsZW1lbnRUb1Byb2Nlc3MuZUdldChhdHRyaWIpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCQkJU3RyaW5nIGNvbnRlbnQgPSAoU3RyaW5nKSBvOwotCQkJCQkJaWYgKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld0NvbnRlbnQgPSBzY2FubmVyLnJlc29sdmVSZXNvdXJjZXNQbHVnaW4oCi0JCQkJCQkJCQljb250ZW50LCBjb250ZW50UGF0aCwgb2xkQ29udGVudFBhdGgpOwotCQkJCQkJCWlmIChuZXdDb250ZW50ICE9IG51bGwKLQkJCQkJCQkJCSYmIG5ld0NvbnRlbnQudHJpbSgpLmxlbmd0aCgpICE9IDAKLQkJCQkJCQkJCSYmICFjb250ZW50LmVxdWFscyhuZXdDb250ZW50KSkgewotCQkJCQkJCQllbGVtZW50VG9Qcm9jZXNzLmVTZXQoYXR0cmliLCBuZXdDb250ZW50KTsKLQkJCQkJCQkJbW9kaWZpZWRSZXNvdXJjZVNldC5hZGQoZWxlbWVudFRvUHJvY2VzcwotCQkJCQkJCQkJCS5lUmVzb3VyY2UoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gVGVtcGxhdGUgYXR0YWNobWVudHMKLS8vCQkJCVN0cmluZyBsaWJSb290ID0gUmVzb3VyY2VIZWxwZXIuZ2V0VmlydHVhbExpYnJhcnlSb290KGVsZW1lbnRUb1Byb2Nlc3MpOwotCQkJCWlmIChlbGVtZW50VG9Qcm9jZXNzIGluc3RhbmNlb2YgR3VpZGFuY2VEZXNjcmlwdGlvbikgewotCQkJCQlTdHJpbmcgYXR0YWNobWVudFN0cmluZyA9ICgoR3VpZGFuY2VEZXNjcmlwdGlvbikgZWxlbWVudFRvUHJvY2VzcykKLQkJCQkJCQkuZ2V0QXR0YWNobWVudHMoKTsKLQkJCQkJTGlzdCBhdHRhY2htZW50TGlzdCA9IFRuZ1V0aWwKLQkJCQkJCQkuY29udmVydEd1aWRhbmNlQXR0YWNobWVudHNUb0xpc3QoYXR0YWNobWVudFN0cmluZyk7Ci0JCQkJCWZvciAoaXRlciA9IGF0dGFjaG1lbnRMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIGF0dGFjaG1lbnQgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChhdHRhY2htZW50ICE9IG51bGwKLQkJCQkJCQkJJiYgYXR0YWNobWVudC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF90ZW1wbGF0ZV9hdHRhY2htZW50X3VybC5tYXRjaGVyKGF0dGFjaG1lbnQpOwotCQkJCQkJCWlmICghbS5maW5kKCkpIHsKLQkJCQkJCQkJRmlsZSBzcmNDb250ZW50UGF0aCA9IG5ldyBGaWxlKGxhc3RPbGRQbHVnaW5SZXNNZ3IucmVzb2x2ZShsYXN0T2xkUGx1Z2luLCBvbGRDb250ZW50UGF0aCkpOwotCQkJCQkJCQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNDb250ZW50UGF0aCwKLQkJCQkJCQkJCQlhdHRhY2htZW50KTsKLQkJCQkJCQkJRmlsZSB0Z3RDb250ZW50UGF0aCA9IG5ldyBGaWxlKHJlc01nci5nZXRQaHlzaWNhbFBhdGgoZWxlbWVudFRvUHJvY2VzcykpOwotCQkJCQkJCQlGaWxlIHRndEZpbGUgPSBuZXcgRmlsZSh0Z3RDb250ZW50UGF0aCwKLQkJCQkJCQkJCQlhdHRhY2htZW50KTsKLQkJCQkJCQkJaWYgKCF0Z3RGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0Z3RGaWxlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGhhbmRsZSBjaGlsZHJlbgotCQlJdGVyYXRvciBpdGVyID0gZS5lQWxsQ29udGVudHMoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlFT2JqZWN0IGNoaWxkID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJSGFuZGxlQXR0YWNobWVudHNQbHVnaW4oY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRlCi0JICogQHBhcmFtIGljb25VcmkKLQkgKiBAcmV0dXJuIHRoZSBuZXcgSWNvbiBVUkkgKHJlbGF0aXZlIHBhdGgsIHNvIGl0cyByZWFkeSB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIG1vZGVsKQotCSAqIEB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBqYXZhLm5ldC5VUkkgaGFuZGxlSWNvblVSSShEZXNjcmliYWJsZUVsZW1lbnQgZGUsCi0JCQlqYXZhLm5ldC5VUkkgaWNvblVyaSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCWphdmEubmV0LlVSSSBzcmNVcmkgPSBUbmdVdGlsLmdldEZ1bGxQYXRoVVJJKGRlLAotCQkJCWljb25VcmkpOwotCQlTdHJpbmcgaWNvblBhdGggPSBpY29uVXJpLmdldFBhdGgoKTsKLQkJaWYoaWNvblBhdGguaW5kZXhPZihsYXN0T2xkUGx1Z2luLmdldE5hbWUoKSkgPCAwKXsKLQkJCXNyY1VyaSA9IG5ldyBGaWxlKFJlc291cmNlSGVscGVyLmdldFBsdWdpblBhdGgobGFzdE9sZFBsdWdpbikgKyBGaWxlLnNlcGFyYXRvciArIGljb25QYXRoKS50b1VSSSgpOwotCQl9Ci0JCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY1VyaSk7Ci0JCWphdmEubmV0LlVSSSB0Z3RVcmkgPSBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRQbHVnaW5QYXRoKGRlKSArIEZpbGUuc2VwYXJhdG9yICsgaWNvblBhdGgpLnRvVVJJKCk7Ci0JCUZpbGUgdGd0RmlsZSA9IG5ldyBGaWxlKHRndFVyaSk7Ci0JCWlmICghdGd0RmlsZS5leGlzdHMoKSkgewotCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RmlsZSk7Ci0JCX0KLQkJamF2YS5uZXQuVVJJIG5ld0ljb25VcmkgPSBuZXcgamF2YS5uZXQuVVJJKE5ldFV0aWwKLQkJCQkuZW5jb2RlRmlsZVVSTChGaWxlVXRpbC5nZXRSZWxhdGl2ZVBhdGgoCi0JCQkJCQl0Z3RGaWxlLCBuZXcgRmlsZShSZXNvdXJjZUhlbHBlci5nZXRQbHVnaW5QYXRoKGRlKSkpKSk7Ci0JCXJldHVybiBuZXdJY29uVXJpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVzb3VyY2Ugc2Nhbm5lciBmb3IgdGhlIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIGdldFNjYW5uZXIoTWV0aG9kRWxlbWVudCBvd25lcikgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCWlmICggcmVzTWdyID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIHJvb3RDb250ZW50UGF0aCA9IHJlc01nci5nZXRMb2dpY2FsUGx1Z2luUGF0aChvd25lcik7Ci0JCUZpbGUgc3JjX3Jvb3QgPSBuZXcgRmlsZShyZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG93bmVyKSk7Ci0JCUZpbGUgdGd0X3Jvb3QgPSBzcmNfcm9vdDsKLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoc3JjX3Jvb3QsIHRndF9yb290LCByb290Q29udGVudFBhdGgsIGdldFZhbGlkYXRvcigpKTsKLQotCQlyZXR1cm4gc2Nhbm5lcjsKLQl9Ci0JCi0JcHVibGljIElDb250ZW50VmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JCi0JLyoqCi0JICogQ29weSBhbGwgYXR0YWNobWVudHMgZnJvbSBvbmUgbGlicmFyeSB0byBhbm90aGVyCi0JICogCi0JICogQHBhcmFtIG9sZExpYkRpcgotCSAqICAgICAgICAgICAgT3JpZ2luYWwgbGlicmFyeSByb290Ci0JICogQHBhcmFtIG5ld0xpYkRpcgotCSAqICAgICAgICAgICAgTmV3IGxpYnJhcnkgcm9vdAotCSAqIEBwYXJhbSB4bWlMaXN0Ci0JICogICAgICAgICAgICBsaXN0IG9mIHhtaSBGaWxlJ3MgKHBhc3MgbnVsbCB0byBwcm9jZXNzIGFsbCBmaWxlcyBpbgotCSAqICAgICAgICAgICAgbmV3TGliRGlyKQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBvcHRpb25hbCAoY2FuIGJlIG51bGwpIElQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weUF0dGFjaG1lbnRzTGlicmFyeShTdHJpbmcgb2xkTGliRGlyLAotCQkJU3RyaW5nIG5ld0xpYkRpciwgTGlzdCB4bWlMaXN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQkvLyBnZXQgbGlzdCBvZiAueG1pIGZpbGVzIGluIG5ld0xpYkRpcgotCQlpZiAoeG1pTGlzdCA9PSBudWxsKQotCQkJeG1pTGlzdCA9IEZpbGVVdGlsLmZpbGVMaXN0KG5ldyBGaWxlKG5ld0xpYkRpciksICJ4bWkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQltb25pdG9yLnN1YlRhc2soTGlicmFyeVJlc291cmNlcy5jb3B5aW5nQXR0YWNobWVudHNUYXNrX25hbWUpOwotCi0JCUl0ZXJhdG9yIGl0ZXIgPSB4bWlMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCUZpbGUgeG1pRmlsZSA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWlmICh4bWlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJLy8gcGFyc2UgeG1pIGZpbGUKLQkJCQlTQVhQYXJzZXJYTUkgcGFyc2VyID0gbmV3IFNBWFBhcnNlclhNSShudWxsKTsKLQkJCQlwYXJzZXIucGFyc2UoeG1pRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJLy8gaXRlcmF0ZSB0aHJ1IGl0J3MgZWxlbWVudHMsIGNoZWNraW5nIGNvbnRlbnQgZm9yIGF0dGFjaG1lbnRzCi0JCQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoCi0JCQkJCQluZXcgRmlsZShvbGRMaWJEaXIpLCBuZXcgRmlsZShuZXdMaWJEaXIpLCBudWxsKTsKLQkJCQlIYW5kbGVBdHRhY2htZW50cyhwYXJzZXIueG1pTWFwLCBzY2FubmVyLCB4bWlGaWxlLmdldFBhcmVudCgpCi0JCQkJCQkuc3Vic3RyaW5nKG5ld0xpYkRpci5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBIYW5kbGVBdHRhY2htZW50cyhIYXNoTWFwIGVNYXAsCi0JCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIsIFN0cmluZyBjb250ZW50UGF0aCkgewotCQkvLyBoYW5kbGUgc2VsZgotCQlTdHJpbmcgY29udGVudCA9IFNBWFBhcnNlclhNSS5nZXRFbGVtZW50Q29udGVudChlTWFwKTsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkgewotCQkJLy8gc2NhbiBjb250ZW50IGZvciBhdHRhY2htZW50cwotCQkJc2Nhbm5lci5yZXNvbHZlUmVzb3VyY2VzKGNvbnRlbnQsIGNvbnRlbnRQYXRoKTsKLQkJfQotCi0JCS8vIGhhbmRsZSBjaGlsZHJlbgotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCUhhbmRsZUF0dGFjaG1lbnRzKGNoaWxkTWFwLCBzY2FubmVyLCBjb250ZW50UGF0aCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ZpbGVOYW1lR2VuZXJhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9GaWxlTmFtZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTZlYzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ZpbGVOYW1lR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5U2VydmljZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIGhlbHBlciBjbGFzcyB0byBwcm9kdWNlIGEgdW5pcXVlIG5hbWUgZm9yIGVhY2ggZ3VpZCBvciBlbGVtZW50Ci0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRmlsZU5hbWVHZW5lcmF0b3IgewotCXB1YmxpYyBzdGF0aWMgRmlsZU5hbWVHZW5lcmF0b3IgSU5TVEFOQ0UgPSBuZXcgRmlsZU5hbWVHZW5lcmF0b3IoKTsKLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZVRvR3VpZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBndWlkVG9OYW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBiYXNlTmFtZUluZGV4TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotCQotCXByaXZhdGUgSUxpYnJhcnlTZXJ2aWNlTGlzdGVuZXIgc3ZjTGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBGaWxlTmFtZUdlbmVyYXRvcigpIHsKLQkJCi0JCXN2Y0xpc3RlbmVyID0gbmV3IElMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCl7Ci0KLQkJCXB1YmxpYyB2b2lkIGNvbmZpZ3VyYXRpb25TZXQoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlDbG9zZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJRmlsZU5hbWVHZW5lcmF0b3IudGhpcy5jbGVhcigpOwotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5Q3JlYXRlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlGaWxlTmFtZUdlbmVyYXRvci50aGlzLmNsZWFyKCk7Ci0JCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpYnJhcnlPcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJRmlsZU5hbWVHZW5lcmF0b3IudGhpcy5jbGVhcigpOwotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5UmVvcGVuZWQoTWV0aG9kTGlicmFyeSBsaWJyYXJ5KSB7Ci0JCQkJRmlsZU5hbWVHZW5lcmF0b3IudGhpcy5jbGVhcigpOwotCQkJCQotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaWJyYXJ5U2V0KE1ldGhvZExpYnJhcnkgbGlicmFyeSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCQkKLQkJCX0KLQkJCQotCQl9OwotCQkKLQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5hZGRMaXN0ZW5lcihzdmNMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZCBmcm9tIHRoZSBmaWxlIG5hbWUsIGFzc3VtaW5nIHRoZSBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkIGZyb20gYW4gZWxlbWVudCwgCi0JICogcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLgotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEd1aWRGcm9tRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWlmICggZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS5lcXVhbHMoIiIpICkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIGdldEd1aWRGcm9tVW5pcXVlTmFtZShnZXRVbmlxdWVOYW1lKGZpbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmaWxlIG5hbWUgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4IGFuZCBleHRlbnNpb24KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG5hbWVQcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgdGhlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZVN1ZmZpeCBTdHJpbmcgc3VmZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBleHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uLCBmb3IgZXhhbXBsZSwgIi5odG1sIgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCSAKLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRGaWxlTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuYW1lUHJlZml4LAotCQkJU3RyaW5nIG5hbWVTdWZmaXgsIFN0cmluZyBleHQpIHsKLQotCQlTdHJpbmcgdW5pcXVlTmFtZSA9IGdldFVuaXF1ZU5hbWVGb3JHdWlkKGVsZW1lbnQuZ2V0R3VpZCgpLCBlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobmFtZVByZWZpeCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWVQcmVmaXgpOwotCQl9Ci0KLQkJYnVmZmVyLmFwcGVuZCh1bmlxdWVOYW1lKTsKLQkJCi0JCWlmIChuYW1lU3VmZml4ICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZVN1ZmZpeCk7Ci0JCX0KLQotCQlpZiAoZXh0ICE9IG51bGwpIHsKLQkJCWlmIChleHQuaW5kZXhPZigiLiIpIDwgMCkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWV4dCA9ICIuIiArIGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChleHQpOwotCQl9Ci0JCQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQluYW1lVG9HdWlkTWFwLmNsZWFyKCk7Ci0JCWd1aWRUb05hbWVNYXAuY2xlYXIoKTsKLQkJYmFzZU5hbWVJbmRleE1hcC5jbGVhcigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05BTUVfTEVOR1RIID0gNjQ7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlTmFtZUZvckd1aWQoU3RyaW5nIGd1aWQsIFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlpZiAoIGd1aWQgPT0gbnVsbCB8fCBndWlkLmVxdWFscygiIikgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvLyBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IGdlbmVucmF0ZWQsIHJldHVybiBpdAotCQlTdHJpbmcgdW5pcXVlTmFtZSA9IGd1aWRUb05hbWVNYXAuZ2V0KGd1aWQpOwotCQlpZiAoIHVuaXF1ZU5hbWUgIT0gbnVsbCApIHsKLQkJCXJldHVybiB1bmlxdWVOYW1lOwotCQl9Ci0JCQotCQkvLyBjb25zdHJ1Y3QgdGhlIGJhc2UgZmlsZSBuYW1lIG9mIHRoZSBlbGVtZW50Ci0JCS8vIG5vdGU6IHRvIG1ha2UgdGhlIG5hbWUgY29uc2lzdGVudCBldmVyeXRpbWUgdGhlIG5hbWUgaXMgZ2VuZXJhdGVkLCAKLQkJLy8gd2Ugc3RpbGwgbmVlZCB0byBtYWtlIHRoZSBuYW1lIGd1aWQgc3BlY2lmaWMuIAotCQkvLyBhcHBlbmRpbmcgdGhlIGd1aWQgbWFrZXMgdGhlIHN0cmluZyB0byBsb25nLCBzbyB1c2UgdGhlIGhhc2hjb2RlCi0JCS8vIGhvd2V2ZXIsIGhhc2hjb2RlIG1heSBoYXZlIGNvbGxpc2lvbiwgc28gc3RpbGwgbmVlZCB0byBhcHBlbmQgdGhlIHN1ZmZpeCBpbmRleCwKLQkJLy8gaW4gc3VjaCBjYXNlLCB0aGUgZmlsZSBuYW1lIG1heSBzdGlsbCBub3QgdW5pcXVlbHkgYmluZGluZyB0byB0aGUgc2FtZSBlbGVtZW50IGNvbnNpc3RlbnRseS4KLQkJLy8gYnV0IHRoZSBjaGFuY2UgaXMgbXVjaCBzbWFsbGVyCi0JCWlmICggZGVmYXVsdE5hbWUgPT0gbnVsbCApIHsKLQkJCWRlZmF1bHROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGUgYmFzZSBuYW1lIHN0cmluZyBpcyB2YWxpZCBhbmQgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBsZW5ndGgKLQkJU3RyaW5nIGJhc2VOYW1lID0gU3RyVXRpbC5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhkZWZhdWx0TmFtZSk7CQotCQlpZiAoIGJhc2VOYW1lLmxlbmd0aCgpID4gTUFYX05BTUVfTEVOR1RIICkgewotCQkJYmFzZU5hbWUgPSBiYXNlTmFtZS5zdWJzdHJpbmcoMCwgTUFYX05BTUVfTEVOR1RIKTsKLQkJfQotCQkJCi0JCWJhc2VOYW1lICs9ICJfIiArIEludGVnZXIudG9IZXhTdHJpbmcoZ3VpZC5oYXNoQ29kZSgpKS50b1VwcGVyQ2FzZSgpOyAvLyROT04tTkxTLTEkCi0KLQkJdW5pcXVlTmFtZSA9IGJhc2VOYW1lOwotCQlJbnRlZ2VyIGluZGV4ID0gYmFzZU5hbWVJbmRleE1hcC5nZXQoYmFzZU5hbWUpOwotCQlpZiAoIGluZGV4ID09IG51bGwgKSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBmaXJzdCB3aXRoIHRoaXMgYmFzZSBuYW1lLCB1c2UgaXQKLQkJCWluZGV4ID0gbmV3IEludGVnZXIoMSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpbmNyZWFzZSB0aGUgaW5kZXggYnkgb25lIGFuZCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgYmFzZSBuYW1lCi0JCQlpbmRleCsrOwotCQkJdW5pcXVlTmFtZSA9IGJhc2VOYW1lICsgIi0iICsgaW5kZXgudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQliYXNlTmFtZUluZGV4TWFwLnB1dChiYXNlTmFtZSwgaW5kZXgpOwotCQlndWlkVG9OYW1lTWFwLnB1dChndWlkLCB1bmlxdWVOYW1lKTsKLQkJbmFtZVRvR3VpZE1hcC5wdXQodW5pcXVlTmFtZSwgZ3VpZCk7Ci0JCXJldHVybiB1bmlxdWVOYW1lOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRHdWlkRnJvbVVuaXF1ZU5hbWUoU3RyaW5nIHVuaXF1ZU5hbWUpIHsKLQkJcmV0dXJuIG5hbWVUb0d1aWRNYXAuZ2V0KHVuaXF1ZU5hbWUpOwotCX0KLQkJCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCi0JCXRyeSB7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJZmlsZU5hbWUgPSBmLmdldE5hbWUoKTsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIGluZGV4IDwgMCApIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0lFbGVtZW50UHJvcGVydHlQcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NzY4MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSUVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlLCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBleHRlbnNpb24gcG9pbnQKLSAqIGVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVycywgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGV4cG9zdXJlIG9mIGN1c3RvbQotICogYXR0cmlidXRlcyBvZiBNZXRob2RFbGVtZW50IHRvIHRoZSBYU0xUIHRlbXBsYXRlcyBkdXJpbmcgYSBwdWJsaXNoIG9mIHRoZQotICogbWV0aG9kIGxpYnJhcnkuCi0gKiAKLSAqIEBhdXRob3IgUGllcnJlIFBhZG92YW5pCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRWxlbWVudFByb3BlcnR5UHJvdmlkZXIgZXh0ZW5kcyBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLSAgCi0gIC8qKgotICAgKiBJbXBsZW1lbnRvcnMgbXVzdCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNoaWxkIFhtbEVsZW1lbnQgdGhleSB3aXNoIHRvIGhhdmUgY3JlYXRlZAotICAgKiBhZ2FpbnN0IHRoZSBNZXRob2RFbGVtZW50IGJlaW5nIHByb2Nlc3NlZC4gVGhpcyBuYW1lIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGNoaWxkCi0gICAqIFhtbEVsZW1lbnQgYmVmb3JlIGEgc3Vic2VxdWVudCBjYWxsIHRvIHB1Ymxpc2hNZXRob2RFbGVtZW50UHJvcGVydGllcy4gSWYgbm8gcHJvcGVydGllcwotICAgKiBmb3IgdGhlIGVsZW1lbnQgZXhpc3Qgb3IgaGF2ZSBiZWVuIGRlZmluZWQsIHJldHVybiBudWxsLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogICAgICAgICAgTWV0aG9kRWxlbWVudAotICAgKiBAcmV0dXJuIFN0cmluZwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDaGlsZEVsZW1lbnROYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCk7Ci0gIAotICAvKioKLSAgICogSW1wbGVtZW50b3JzIG9mIHRoaXMgbWV0aG9kIHdpbGwgYmUgZ2l2ZW4gYSBjaGlsZCBYbWxFbGVtZW50IHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRoCi0gICAqIGFueSBkYXRhIGRlc2lyZWQuIEFsbCBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFhtbEVsZW1lbnQgd2lsbCBiZSBleHBvc2VkIHRvIHRoZSBYU0xUIAotICAgKiBkdXJpbmcgYSBwdWJsaXNoLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnQKLSAgICogICAgICAgICAgTWV0aG9kRWxlbWVudAotICAgKiBAcGFyYW0gZGF0YQotICAgKiAgICAgICAgICBYbWxFbGVtZW50Ci0gICAqLwotICBwdWJsaWMgdm9pZCBwdWJsaXNoTWV0aG9kRWxlbWVudFByb3BlcnRpZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBYbWxFbGVtZW50IGRhdGEpOwotICAKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ljb25VdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9JY29uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NmNmMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ljb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW47Ci0KLS8qKgotICogdXRpbGl0eSBjbGFzcyB0byBtYW5hZ2UgaWNvbiB1cmxzCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSWNvblV0aWwgewotCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIG5vZGVJY29uUGx1Z2luUm9vdCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0FjdGl2aXR5ID0gImZ1bGwvb2JqMTYvQWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0FydGlmYWN0ID0gImZ1bGwvb2JqMTYvQXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NhcGFiaWxpdHlQYXR0ZXJuID0gImZ1bGwvb2JqMTYvQ2FwYWJpbGl0eVBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NoZWNrbGlzdCA9ICJmdWxsL29iajE2L0NoZWNrbGlzdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fQ29uY2VwdCA9ICJmdWxsL29iajE2L0NvbmNlcHQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0NvbnRlbnRQYWNrYWdlID0gImZ1bGwvb2JqMTYvQ29udGVudFBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0N1c3RvbUNhdGVnb3J5ID0gImZ1bGwvb2JqMTYvQ3VzdG9tQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RlbGl2ZXJhYmxlID0gImZ1bGwvb2JqMTYvRGVsaXZlcmFibGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0RlbGl2ZXJ5UHJvY2VzcyA9ICJmdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRGlzY2lwbGluZSA9ICJmdWxsL29iajE2L0Rpc2NpcGxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0Rpc2NpcGxpbmVHcm91cGluZyA9ICJmdWxsL29iajE2L0Rpc2NpcGxpbmVHcm91cGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRG9tYWluID0gImZ1bGwvb2JqMTYvRG9tYWluIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Fc3RpbWF0ZSA9ICJmdWxsL29iajE2L0VzdGltYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSAiZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0V4YW1wbGUgPSAiZnVsbC9vYmoxNi9FeGFtcGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9HdWlkZWxpbmUgPSAiZnVsbC9vYmoxNi9HdWlkZWxpbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0l0ZXJhdGlvbiA9ICJmdWxsL29iajE2L0l0ZXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWV0aG9kQ29uZmlndXJhdGlvbiA9ICJmdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01ldGhvZExpYnJhcnkgPSAiZnVsbC9vYmoxNi9NZXRob2RMaWJyYXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NZXRob2RQYWNrYWdlID0gImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTWV0aG9kUGx1Z2luID0gImZ1bGwvb2JqMTYvTWV0aG9kUGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NaWxlc3RvbmUgPSAiZnVsbC9vYmoxNi9NaWxlc3RvbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX091dGNvbWUgPSAiZnVsbC9vYmoxNi9PdXRjb21lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QaGFzZSA9ICJmdWxsL29iajE2L1BoYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9QcmFjdGljZSA9ICJmdWxsL29iajE2L1ByYWN0aWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Qcm9jZXNzQ29udHJpYnV0aW9uID0gImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUHJvY2Vzc0ZhbWlseSA9ICJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Byb2Nlc3NQYWNrYWdlID0gImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JlcG9ydCA9ICJmdWxsL29iajE2L1JlcG9ydCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUmV1c2FibGVBc3NldCA9ICJmdWxsL29iajE2L1JldXNhYmxlQXNzZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JvYWRtYXAgPSAiZnVsbC9vYmoxNi9Sb2FkbWFwIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9Sb2xlID0gImZ1bGwvb2JqMTYvUm9sZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fUm9sZVNldCA9ICJmdWxsL29iajE2L1JvbGVTZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JvbGVTZXRHcm91cGluZyA9ICJmdWxsL29iajE2L1JvbGVTZXRHcm91cGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fU3VwcG9ydGluZ01hdGVyaWFsID0gImZ1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9UYXNrID0gImZ1bGwvb2JqMTYvVGFzayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVGVtcGxhdGUgPSAiZnVsbC9vYmoxNi9UZW1wbGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVGVybURlZmluaXRpb24gPSAiZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVG9vbCA9ICJmdWxsL29iajE2L1Rvb2wiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1Rvb2xNZW50b3IgPSAiZnVsbC9vYmoxNi9Ub29sTWVudG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9XaGl0ZXBhcGVyID0gImZ1bGwvb2JqMTYvV2hpdGVwYXBlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fV29ya1Byb2R1Y3QgPSAiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fV29ya1Byb2R1Y3RUeXBlID0gImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3RUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbWFwIG9mIGltYWdlIHR5cGUgdG8gaW1hZ2UKLQlwcml2YXRlIHN0YXRpYyBNYXAgbm9kZUljb25VcmxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXN0YXRpYyB7Ci0JCW5vZGVJY29uVXJsTWFwLnB1dCgiYWN0aXZpdHkiLCBJQ09OX0FjdGl2aXR5KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImFydGlmYWN0IiwgSUNPTl9BcnRpZmFjdCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJjYXBhYmlsaXR5cGF0dGVybiIsIElDT05fQ2FwYWJpbGl0eVBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY2hlY2tsaXN0IiwgSUNPTl9DaGVja2xpc3QpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY29uY2VwdCIsIElDT05fQ29uY2VwdCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJjb250ZW50cGFja2FnZSIsIElDT05fQ29udGVudFBhY2thZ2UpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgiY3VzdG9tY2F0ZWdvcnkiLCBJQ09OX0N1c3RvbUNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImRlbGl2ZXJhYmxlIiwgSUNPTl9EZWxpdmVyYWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkZWxpdmVyeXByb2Nlc3MiLCBJQ09OX0RlbGl2ZXJ5UHJvY2Vzcyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJkaXNjaXBsaW5lIiwgSUNPTl9EaXNjaXBsaW5lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImRpc2NpcGxpbmVncm91cGluZyIsIElDT05fRGlzY2lwbGluZUdyb3VwaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImRvbWFpbiIsIElDT05fRG9tYWluKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImVzdGltYXRlIiwgSUNPTl9Fc3RpbWF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KAotCQkJCSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiLCBJQ09OX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJleGFtcGxlIiwgSUNPTl9FeGFtcGxlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoImd1aWRlbGluZSIsIElDT05fR3VpZGVsaW5lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIml0ZXJhdGlvbiIsIElDT05fSXRlcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1ldGhvZGNvbmZpZ3VyYXRpb24iLCBJQ09OX01ldGhvZENvbmZpZ3VyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgibWV0aG9kbGlicmFyeSIsIElDT05fTWV0aG9kTGlicmFyeSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJtZXRob2RwYWNrYWdlIiwgSUNPTl9NZXRob2RQYWNrYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1ldGhvZHBsdWdpbiIsIElDT05fTWV0aG9kUGx1Z2luKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm1pbGVzdG9uZSIsIElDT05fTWlsZXN0b25lKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIm91dGNvbWUiLCBJQ09OX091dGNvbWUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicGhhc2UiLCBJQ09OX1BoYXNlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInByYWN0aWNlIiwgSUNPTl9QcmFjdGljZSk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJwcm9jZXNzY29udHJpYnV0aW9uIiwgSUNPTl9Qcm9jZXNzQ29udHJpYnV0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInByb2Nlc3NmYW1pbHkiLCBJQ09OX1Byb2Nlc3NGYW1pbHkpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicHJvY2Vzc3BhY2thZ2UiLCBJQ09OX1Byb2Nlc3NQYWNrYWdlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJlcG9ydCIsIElDT05fUmVwb3J0KTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJldXNhYmxlYXNzZXQiLCBJQ09OX1JldXNhYmxlQXNzZXQpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicm9hZG1hcCIsIElDT05fUm9hZG1hcCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJyb2xlIiwgSUNPTl9Sb2xlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInJvbGVzZXQiLCBJQ09OX1JvbGVTZXQpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgicm9sZXNldGdyb3VwaW5nIiwgSUNPTl9Sb2xlU2V0R3JvdXBpbmcpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgic3VwcG9ydGluZ21hdGVyaWFsIiwgSUNPTl9TdXBwb3J0aW5nTWF0ZXJpYWwpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidGFzayIsIElDT05fVGFzayk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ0ZW1wbGF0ZSIsIElDT05fVGVtcGxhdGUpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidGVybWRlZmluaXRpb24iLCBJQ09OX1Rlcm1EZWZpbml0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRvb2wiLCBJQ09OX1Rvb2wpOyAvLyROT04tTkxTLTEkCi0JCW5vZGVJY29uVXJsTWFwLnB1dCgidG9vbG1lbnRvciIsIElDT05fVG9vbE1lbnRvcik7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3aGl0ZXBhcGVyIiwgSUNPTl9XaGl0ZXBhcGVyKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIndvcmtwcm9kdWN0IiwgSUNPTl9Xb3JrUHJvZHVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJbm9kZUljb25VcmxNYXAucHV0KCJ3b3JrcHJvZHVjdHR5cGUiLCBJQ09OX1dvcmtQcm9kdWN0VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlub2RlSWNvblVybE1hcC5wdXQoInJvbGVkZXNjcmlwdG9yIiwgSUNPTl9Sb2xlKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoInRhc2tkZXNjcmlwdG9yIiwgSUNPTl9UYXNrKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlSWNvblVybE1hcC5wdXQoIndvcmtwcm9kdWN0ZGVzY3JpcHRvciIsIElDT05fV29ya1Byb2R1Y3QpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCW5vZGVJY29uUGx1Z2luUm9vdCA9IEZpbGVMb2NhdG9yLnJlc29sdmUoVW1hRWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkuZ2V0QmFzZVVSTCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBub2RlIGljb24gdXJsCi0JICogCi0JICogQHBhcmFtIHR5cGUgU3RyaW5nIHRoZSBlbGVtZW50IHR5cGUKLQkgKiBAcmV0dXJuIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldE5vZGVJY29uVVJMKFN0cmluZyB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgbm9kZUljb25VcmxNYXAuZ2V0KHR5cGUudG9Mb3dlckNhc2UoKSk7Ci0JCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFVSTChub2RlSWNvblBsdWdpblJvb3QsICJpY29ucy8iICsga2V5ICsgIi5naWYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBub2RlIGljb24gZmlsZSBsb2NhdGlvbiBmb3IgdGhlIGVsZW1lbnQgdHlwZQotCSAqIEBwYXJhbSB0eXBlIFN0cmluZyB0aGUgZWxlbWVudCB0eXBlCi0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldE5vZGVJY29uRmlsZShTdHJpbmcgdHlwZSkgewotCQlVUkwgdXJsID0gZ2V0Tm9kZUljb25VUkwodHlwZSk7Ci0JCWlmICh1cmwgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSW1wb3J0RXhwb3J0VXRpbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvSW1wb3J0RXhwb3J0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzM4OWY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0ltcG9ydEV4cG9ydFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlU2F2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yZXNvdXJjZW1hbmFnZXIuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gaGFuZGxlIGVsZW1lbnQgcmVwbGFjZSBvciByZW5hbWluZyBmb3IgaW1wb3J0L2V4cG9ydAotICogCi0gKiBAYXV0aG9yID8/PwotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydEV4cG9ydFV0aWwgewotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwcm9jQ29tcAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0JICogQHRocm93cyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yCi0JICogQHRocm93cyBTQVhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZShQcm9jZXNzQ29tcG9uZW50IHByb2NDb21wLCBTdHJpbmcgZGlyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotCQkJRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciwgU0FYRXhjZXB0aW9uIHsKLQkJRmlsZSBuZXdQcm9jQ29tcEZpbGUgPSBuZXcgRmlsZShkaXIsCi0JCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRSk7Ci0JCWlmICghbmV3UHJvY0NvbXBGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKAotCQkJCQlNZXNzYWdlRm9ybWF0Ci0JCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCUxpYnJhcnlSZXNvdXJjZXMuSW1wb3J0RXhwb3J0VXRpbF9NU0c4LCBuZXcgT2JqZWN0W10geyBuZXdQcm9jQ29tcEZpbGUgfSkpOwotCQl9Ci0KLQkJU3RyaW5nIG9sZE1vZGVsRmlsZVN0ciA9IHByb2NDb21wLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQlTdHJpbmcgb2xkUHJvY0NvbXBEaXIgPSBuZXcgRmlsZShvbGRNb2RlbEZpbGVTdHIpLmdldFBhcmVudCgpOwotCi0JCVN0cmluZyBzdWZmaXggPSBNdWx0aUZpbGVTYXZlVXRpbC5nZXRCYWNrdXBGaWxlU3VmZml4KCk7Ci0KLQkJRmlsZSB0ZW1wRGlyID0gbnVsbDsKLQotCQl0cnkgewotCQkJLy8gY29weSBkaXIgYSB0ZW1wIGRpciBpbnNpZGUgdGhlIHRhcmdldCBkaXIKLQkJCS8vCi0JCQl0ZW1wRGlyID0gbmV3IEZpbGUob2xkUHJvY0NvbXBEaXIsIHN1ZmZpeCk7Ci0JCQlpZiAoIXRlbXBEaXIubWtkaXIoKSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKLQkJCQkJCU1lc3NhZ2VGb3JtYXQKLQkJCQkJCQkJLmZvcm1hdCgKLQkJCQkJCQkJCQlMaWJyYXJ5UmVzb3VyY2VzLkltcG9ydEV4cG9ydFV0aWxfTVNHOSwgbmV3IE9iamVjdFtdIHsgdGVtcERpciB9KSk7Ci0JCQl9Ci0JCQlGaWxlVXRpbC5jb3B5RGlyKG5ldyBGaWxlKGRpciksIHRlbXBEaXIpOwotCQkJbmV3UHJvY0NvbXBGaWxlID0gbmV3IEZpbGUodGVtcERpciwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9NT0RFTF9GSUxFTkFNRSk7Ci0KLQkJCS8vIGxvYWQgdGhlIG5ldyBtb2RlbC54bWkKLQkJCS8vCi0JCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IHByb2NDb21wCi0JCQkJCS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJUmVzb3VyY2UgbmV3UmVzb3VyY2UgPSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZShVUkkKLQkJCQkJLmNyZWF0ZUZpbGVVUkkobmV3UHJvY0NvbXBGaWxlLmdldEFic29sdXRlUGF0aCgpKSwgdHJ1ZSk7Ci0KLQkJCS8vIGZpeCBjb25maWd1cmF0aW9uIHJlZmVyZW5jZXMKLQkJCS8vCi0JCQlQcm9jZXNzQ29tcG9uZW50IG5ld1Byb2NDb21wID0gKFByb2Nlc3NDb21wb25lbnQpIFBlcnNpc3RlbmNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kRWxlbWVudChuZXdSZXNvdXJjZSk7Ci0JCQlQcm9jZXNzIG5ld1Byb2MgPSBuZXdQcm9jQ29tcC5nZXRQcm9jZXNzKCk7Ci0JCQluZXdQcm9jCi0JCQkJCS5zZXREZWZhdWx0Q29udGV4dChwcm9jQ29tcC5nZXRQcm9jZXNzKCkKLQkJCQkJCQkuZ2V0RGVmYXVsdENvbnRleHQoKSk7Ci0JCQluZXdQcm9jLmdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQluZXdQcm9jLmdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgKLQkJCQkJcHJvY0NvbXAuZ2V0UHJvY2VzcygpLmdldFZhbGlkQ29udGV4dCgpKTsKLQotCQkJLy8gZml4IGFsbCBzdGVwcwotCQkJLy8JCQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbmV3UHJvY0NvbXAuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlUYXNrRGVzY3JpcHRvciB0YXNrRGVzYyA9IChUYXNrRGVzY3JpcHRvcikgZWxlbWVudDsKLQkJCQkJVGFzayB0YXNrID0gdGFza0Rlc2MuZ2V0VGFzaygpOwotCQkJCQlTdHJpbmcgdGFza05hbWUgPSB0YXNrID09IG51bGwgPyAiTk9ORSIgOiAiJyIgKyB0YXNrLmdldE5hbWUoKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUYXNrOiAiICsgdGFza05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmICh0YXNrICE9IG51bGwpIHsKLQkJCQkJCXRhc2tEZXNjLmdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJCQkJdGFza0Rlc2MuZ2V0U2VsZWN0ZWRTdGVwcygpLmFkZEFsbCh0YXNrLmdldFN0ZXBzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyByZXBsYWNlIEdVSUQgb2YgbmV3IFByb2Nlc3NDb21wb25lbnQgYW5kIGl0cyBSZXNvdXJjZU1hbmFnZXIgd2l0aAotCQkJLy8gb2xkIG9uZXMKLQkJCS8vCi0KLQkJCS8vIC8vIHJlYWQgdGhlIG1vZGVsLnhtaSBmaWxlCi0JCQkvLyBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9Ci0JCQkvLyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQkvLyBEb2N1bWVudCBkb2MgPSBidWlsZGVyLnBhcnNlKG5ld1Byb2NDb21wRmlsZSk7Ci0KLQkJCS8vIHNldCBHVUlEIG9mIG5ldyBSZXNvdXJjZU1hbmFnZXIgdG8gb2xkIEdVSUQKLQkJCVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBNdWx0aUZpbGVTYXZlVXRpbAotCQkJCQkuZ2V0UmVzb3VyY2VNYW5hZ2VyKHByb2NDb21wLmVSZXNvdXJjZSgpKTsKLQkJCWlmIChyZXNNZ3IgIT0gbnVsbCkgewotCQkJCU11bHRpRmlsZVNhdmVVdGlsLmdldFJlc291cmNlTWFuYWdlcihuZXdSZXNvdXJjZSkuc2V0R3VpZCgKLQkJCQkJCXJlc01nci5nZXRHdWlkKCkpOwotCQkJfQotCi0JCQkvLyBOb2RlTGlzdCBsaXN0ID0KLQkJCS8vIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIik7Ci0JCQkvLyBFbGVtZW50IGUgPSAoRWxlbWVudCkgbGlzdC5pdGVtKDApOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoInhtaTppZCIsIGd1aWQpOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBndWlkKTsKLQotCQkJLy8gc2V0IEdVSUQgb2YgbmV3IFByb2Nlc3NDb21wb25lbnQgdG8gb2xkIEdVSUQKLQkJCW5ld1Byb2NDb21wLnNldEd1aWQocHJvY0NvbXAuZ2V0R3VpZCgpKTsKLQotCQkJLy8gZ3VpZCA9IHByb2NDb21wLmdldEd1aWQoKTsKLQkJCS8vIGxpc3QgPQotCQkJLy8gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiKTsKLQkJCS8vIGUgPSAoRWxlbWVudCkgbGlzdC5pdGVtKDApOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoInhtaTppZCIsIGd1aWQpOwotCQkJLy8gZS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBndWlkKTsKLQotCQkJLy8gc2F2ZSB0aGUgbmV3IG1vZGVsLnhtaQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IG1hbmFnZXIgIT0gbnVsbCA/IG1hbmFnZXIuZ2V0U2F2ZU9wdGlvbnMoKSA6IG5ldyBIYXNoTWFwKCk7CQkJCi0JCQluZXdSZXNvdXJjZS5zYXZlKHNhdmVPcHRpb25zKTsKLQotCQkJLy8gYmFjayB1cCBvbGQgbW9kZWwueG1pCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShvbGRNb2RlbEZpbGVTdHIpOwotCQkJRmlsZVV0aWwubW92ZUZpbGUoZmlsZSwgbmV3IEZpbGUob2xkTW9kZWxGaWxlU3RyICsgIi5iYWsiICsgc3VmZml4KSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJRmlsZVV0aWwubW92ZUZpbGUobmV3UHJvY0NvbXBGaWxlLCBuZXcgRmlsZShvbGRNb2RlbEZpbGVTdHIpKTsKLQotCQkJLy8gWE1MVXRpbC5zYXZlRG9jdW1lbnQoZG9jLCBvbGRNb2RlbEZpbGVTdHIpOwotCi0JCQlGaWxlIG5ld0NvbnRlbnRGaWxlID0gbmV3IEZpbGUodGVtcERpciwKLQkJCQkJTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9DT05URU5UX0ZJTEVOQU1FKTsKLQotCQkJLy8gYmFjayB1cCBvbGQgY29udGVudC54bWkKLQkJCVN0cmluZyBjb250ZW50RmlsZVN0ciA9IG9sZFByb2NDb21wRGlyICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBNdWx0aUZpbGVTYXZlVXRpbC5ERUZBVUxUX0NPTlRFTlRfRklMRU5BTUU7Ci0JCQlGaWxlIG9sZENvbnRlbnRGaWxlID0gbmV3IEZpbGUoY29udGVudEZpbGVTdHIpOwotCQkJRmlsZVV0aWwubW92ZUZpbGUob2xkQ29udGVudEZpbGUsIG5ldyBGaWxlKGNvbnRlbnRGaWxlU3RyICsgIi5iYWsiICsgc3VmZml4KSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gY29weSBuZXcgY29udGVudC54bWkKLQkJCWlmIChuZXdDb250ZW50RmlsZS5leGlzdHMoKSkgewotCQkJCUZpbGVVdGlsLm1vdmVGaWxlKG5ld0NvbnRlbnRGaWxlLCBvbGRDb250ZW50RmlsZSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAodGVtcERpciAhPSBudWxsKSB7Ci0JCQkJRmlsZVV0aWwuZGVsZXRlQWxsRmlsZXModGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJdGVtcERpci5kZWxldGUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xpYnJhcnlNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2JiYTg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xpYnJhcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdFRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuQWRkVG9DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLklBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JUmVzb3VyY2VBd2FyZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLlJlbW92ZUZyb21DYXRlZ29yeUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5NaXNjOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBhbGwgdGhlIHJvdXRpbmVzIHVzZWQgYnkgdGhlIHRvb2wgZWRpdG9yIHRvIG1hbmlwdWxhdGUKLSAqIHRoZSBhc3NvY2lhdGlvbnMgb2YgYSBtZXRob2QgZWxlbWVudCBpbiB0aGUgbGlicmFyeSB3aXRoIG90aGVyIGNhdGVnb3JpZXMgb3IKLSAqIG1ldGhvZCBlbGVtZW50cwotICogCi0gKiBVc2UgZ2V0QXZhaWxhYmxlWFhYIHRvIHJldHJpZXZlIGEgcGljayBsaXN0IG9mIGNhdGVnb3JpZXMsIG1ldGhvZCBlbGVtZW50IGZvcgotICogYSBnaXZlbiBtZXRob2QgZWxlbWVudC4gVXNlIGFkZFRvWFhYIHRvIGVzdGFibGlzaCBhIG5ldyBhc3NvY2lhdGlvbi4gVXNlCi0gKiByZW1vdmVGcm9tWFhYIHRvIHJlbW92ZSBhbiBleGlzaXRpbmcgYXNzb2NpYXRpb24uCi0gKiAKLSAqIENhbGwgcmVsZWFzZUNhdGVnb3JpZXMoKSBiZWZvcmUgdGhlIGVkaXRvciBjbG9zZXMsIHBhc3NpbmcgaW4gYWxsIHRoZQotICogY2F0ZWdvcmllcyB0aGF0IHlvdSBoYXZlIHJldHJpZXZlZCB3aXRoIGdldEF2YWlsYWJsZVhYWCgpIGZvciB0aGUgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeU1hbmFnZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvciBuYW1lQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYgKG8xIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBvMiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvMSkuZ2V0TmFtZSgpLmNvbXBhcmVUbygKLQkJCQkJCSgoTWV0aG9kRWxlbWVudCkgbzIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeU1hbmFnZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaWJyYXJ5TWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoTGlicmFyeU1hbmFnZXIuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5TWFuYWdlcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIExpYnJhcnlNYW5hZ2VyKCkgewotCX0KLQotCS8vIC8vLy8vLwotCS8vIEJlZ2luIG9mIGNvZGUgbW92ZWQgZnJvbSBNZXRob2RFbGVtZW50VXRpbCBhbmQgbWFkZSBwcml2YXRlCi0JLy8gLy8vLy8vCi0JLyoqCi0JICogUmV0dXJuIGNhdGVnb3JpZXMgaW4gdGhlIG1vZGVsLCBnaXZlbiBwYXJ0aWN1bGFyIG9iamVjdCBhbmQgY2xhc3MKLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHBhcmFtIGNsYXNzCi0JICogQHBhcmFtIFN0cmluZ1tdCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoTWV0aG9kRWxlbWVudCBvYmplY3QsIENsYXNzIGNsYXNzVHlwZSwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTGlzdCBpdGVtTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oKEVPYmplY3QpIG9iamVjdCk7Ci0KLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCS8vIGFkZCBhbGwgY2F0ZWdvcmllcyBmcm9tIHRoZSBjdXJyZW50IHBsdWdpbgotCQkJLy8KLQkJCUNvbnRlbnRQYWNrYWdlIGRpc2NpcGxpbmVQa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShtb2RlbCwKLQkJCQkJcGF0aCk7Ci0JCQlpZiAoZGlzY2lwbGluZVBrZyAhPSBudWxsKSB7Ci0JCQkJRUxpc3QgY29udGVudENhdHMgPSAoRUxpc3QpIGRpc2NpcGxpbmVQa2cuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50Q2F0cy5zaXplKCk7IGkrKykgewotCQkJCQlPYmplY3QgZWxlbWVudCA9IGNvbnRlbnRDYXRzLmdldChpKTsKLQotCQkJCQlpZiAoY2xhc3NUeXBlLmlzSW5zdGFuY2UoZWxlbWVudCkgJiYgZWxlbWVudCAhPSBvYmplY3QpIHsKLQkJCQkJCWl0ZW1MaXN0LmFkZChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYWRkIGFsbCBjYXRlZ29yaWVzIGZyb20gYmFzZSBwbHVnaW5zIHRoYXQgYXJlIG5vdCBleHRlbmRlZAotCQkJLy8KLQkJCUxpc3QgbGlzdCA9IE1pc2MuZ2V0QWxsQmFzZShtb2RlbCk7Ci0JCQkvLyBsaXN0LmFkZCgwLCBtb2RlbCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQlDb250ZW50UGFja2FnZSBwYXJlbnREaXNjaXBsaW5lcyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQkJKChNZXRob2RQbHVnaW4pIGxpc3QuZ2V0KGopKSwgcGF0aCk7Ci0JCQkJaWYgKHBhcmVudERpc2NpcGxpbmVzICE9IG51bGwpIHsKLQkJCQkJRUxpc3QgY29udGVudENhdHMgPSAoRUxpc3QpIHBhcmVudERpc2NpcGxpbmVzCi0JCQkJCQkJLmdldENvbnRlbnRFbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRDYXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlPYmplY3QgZWxlbWVudCA9IGNvbnRlbnRDYXRzLmdldChpKTsKLQotCQkJCQkJaWYgKGNsYXNzVHlwZS5pc0luc3RhbmNlKGVsZW1lbnQpKSB7Ci0JCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGl0ZW0gPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlbGVtZW50OwotCQkJCQkJCWlmIChpdGVtLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkJCQkJCS8vIG1ha2Ugc3VyZSB0aGUgaXRlbUxpc3QgZG9lc24ndCBoYXZlIGEKLQkJCQkJCQkJLy8gY2F0ZWdvcnkgdGhhdCBleHRlbmRzIHRoaXMKLQkJCQkJCQkJaW50IGs7Ci0JCQkJCQkJCWZvciAoayA9IDA7IGsgPCBpdGVtTGlzdC5zaXplKCk7IGsrKykgewotCQkJCQkJCQkJaWYgKCgoVmFyaWFiaWxpdHlFbGVtZW50KSBpdGVtTGlzdC5nZXQoaykpCi0JCQkJCQkJCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPT0gaXRlbSkKLQkJCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoayA9PSBpdGVtTGlzdC5zaXplKCkpCi0JCQkJCQkJCQlpdGVtTGlzdC5hZGQoaXRlbSk7Ci0KLQkJCQkJCQkJLy8gaXRlbUxpc3QuYWRkKGl0ZW0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUNvbGxlY3Rpb25zLnNvcnQoaXRlbUxpc3QsIG5hbWVDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gaXRlbUxpc3Q7Ci0JfQotCi0JLy8gLy8vLy8vLy8KLQkvLyBFbmQgb2YgY29kZSBtb3ZlZCBmcm9tIE1ldGhvZEVsZW1lbnRVdGlsCi0JLy8gLy8vLy8vLy8KLQotCS8qKgotCSAqIEdldHMgYWxsIGRpc2NpcGxpbmVzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudAotCSAqIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBEaXNjaXBsaW5lIG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVEaXNjaXBsaW5lcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgRGlzY2lwbGluZS5jbGFzcywKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxUX0RJU0NJUExJTkVfREVGX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGRvbWFpbnMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBEb21haW4gb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZURvbWFpbnMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUxpc3QgZG9tYWlucyA9IGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgRG9tYWluLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFRfRE9NQUlOX1BBVEgpOwotCi0JCS8vIGdldCBhbGwgdGhlIGRvbWFpbnMgaW5jbHVkaW5nIHN1YmRvbWFpbnMKLQkJLy8KLQkJTGlzdCBhbGxEb21haW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBkb21haW5zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pIGl0ZXIubmV4dCgpOwotCQkJSXRlcmF0b3IgZG9tYWluVHJlZSA9IG5ldyBBYnN0cmFjdFRyZWVJdGVyYXRvcihkb21haW4sIHRydWUpIHsKLQotCQkJCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiAoKERvbWFpbikgb2JqZWN0KS5nZXRTdWJkb21haW5zKCkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0KLQkJCX07Ci0JCQl3aGlsZSAoZG9tYWluVHJlZS5oYXNOZXh0KCkpIHsKLQkJCQlhbGxEb21haW5zLmFkZChkb21haW5UcmVlLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KGFsbERvbWFpbnMsIG5hbWVDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gYWxsRG9tYWluczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB3b3JrIHByb2R1Y3QgdHlwZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFdvcmtQcm9kdWN0VHlwZSBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlV29ya1Byb2R1Y3RUeXBlcyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgV29ya1Byb2R1Y3RUeXBlLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFRfV09SS19QUk9EVUNUX1RZUEVfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgcm9sZSBzZXRzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgUm9sZVNldCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUm9sZVNldHMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDYXRlZ29yaWVzKGUsIFJvbGVTZXQuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgY3VzdG9tIGNhdGVnb3JpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSBnaXZlbiBNZXRob2RFbGVtZW50Ci0JICogb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFJvbGVTZXQgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUN1c3RvbUNhdGVnb3JpZXMoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCUxpc3QgY2F0ZWdvcmllcyA9IGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9DVVNUT01fQ0FURUdPUllfUEFUSCk7Ci0JCS8vIGZpbHRlciBvdXQgdGhlIHJvb3QgY3VzdG9tIGNhdGVnb3JpZXMKLQkJLy8KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChUbmdVdGlsLmlzUm9vdEN1c3RvbUNhdGVnb3J5KChDdXN0b21DYXRlZ29yeSkgaXRlci5uZXh0KCkpKSB7Ci0JCQkJaXRlci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0b29scyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBsaXN0IG9mIFRvb2wgb2JqZWN0cwotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVRvb2xzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyhlLCBUb29sLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgZ2l2ZW4KLQkgKiBNZXRob2RFbGVtZW50IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gbGlzdCBvZiBSb2xlU2V0IG9iamVjdHMKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVEaXNjaXBsaW5lR3JvdXBpbmdzKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ2F0ZWdvcmllcyhlLCBEaXNjaXBsaW5lR3JvdXBpbmcuY2xhc3MsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHJvbGUgc2V0IGdyb3VwaW5ncyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQKLQkgKiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgUm9sZVNldCBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUm9sZVNldEdyb3VwaW5ncyhNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNhdGVnb3JpZXMoZSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIHRhc2sgdG8gYSBkaXNjaXBsaW5lCi0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSBkaXNjaXBsaW5lCi0JICogQHBhcmFtIHRhc2sKLQkgKiBAcmV0dXJuIERpc2NpcGxpbmUKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBhZGRUb0Rpc2NpcGxpbmUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lLCBUYXNrIHRhc2ssIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJcmV0dXJuIChEaXNjaXBsaW5lKSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgZGlzY2lwbGluZSwgdGFzaywKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kaXNjaXBsaW5lRGVmaW5pdGlvblBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgYSB3b3JrcHJvZHVjdCB0byBhIGRvbWFpbgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogQHBhcmFtIHdwCi0JICogQHJldHVybiBEb21haW4KLQkgKi8KLQlwdWJsaWMgRG9tYWluIGFkZFRvRG9tYWluKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgRG9tYWluIGRvbWFpbiwKLQkJCVdvcmtQcm9kdWN0IHdwLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCXJldHVybiAoRG9tYWluKSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgZG9tYWluLCB3cCwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCksCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBhZGQgYSB3b3JrIHByb2R1Y3QgdG8gYSBXb3JrUHJvZHVjdFR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIHdwVHlwZQotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gV29ya1Byb2R1Y3RUeXBlCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0VHlwZSBhZGRUb1dvcmtQcm9kdWN0VHlwZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsCi0JCQlXb3JrUHJvZHVjdFR5cGUgd3BUeXBlLCBXb3JrUHJvZHVjdCB3cCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKFdvcmtQcm9kdWN0VHlwZSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHdwVHlwZSwgd3AsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0cygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCi0KLQkvKioKLQkgKiBhZGQgYW4gZWxlbWVudCB0byBhIEN1c3RvbUNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGFjdGlvbk1ncgotCSAqIEBwYXJhbSB1c2VyRGVmaW5lZENhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIEN1c3RvbUNhdGVnb3J5Ci0JICovCi0JcHVibGljIEN1c3RvbUNhdGVnb3J5IGFkZFRvQ3VzdG9tQ2F0ZWdvcnkoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJQ3VzdG9tQ2F0ZWdvcnkgdXNlckRlZmluZWRDYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwKLQkJCQkJdXNlckRlZmluZWRDYXRlZ29yeSwgZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLAotCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCwgdHJ1ZSwgdXNlZENhdGVnb3JpZXMpOwotCQl9Ci0KLQkJLy8gaWYoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCS8vIHJldHVybiAoQ3VzdG9tQ2F0ZWdvcnkpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB1c2VyRGVmaW5lZENhdGVnb3J5LAotCQkvLyBlbGVtZW50LAotCQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCksCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB0cnVlKTsKLQkJLy8gfQotCQkvLyBlbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJLy8gcmV0dXJuIChDdXN0b21DYXRlZ29yeSkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHVzZXJEZWZpbmVkQ2F0ZWdvcnksCi0JCS8vIGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIHRydWUpOwotCQkvLyB9Ci0JCS8vIGVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3MpewotCQkvLyByZXR1cm4gKEN1c3RvbUNhdGVnb3J5KSBhZGRUb0NhdGVnb3J5KGFjdGlvbk1nciwgdXNlckRlZmluZWRDYXRlZ29yeSwKLQkJLy8gZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfUHJvY2Vzc0VsZW1lbnRzKCksCi0JCS8vIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoLCB0cnVlKTsKLQkJLy8gfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogYWRkIGEgdG9vbG1lbnRvciB0byBhIFRvb2wKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIHRvb2wKLQkgKiBAcGFyYW0gdG9vbE1lbnRvcgotCSAqIEByZXR1cm4gVG9vbAotCSAqLwotCXB1YmxpYyBUb29sIGFkZFRvVG9vbChJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFRvb2wgdG9vbCwKLQkJCVRvb2xNZW50b3IgdG9vbE1lbnRvciwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlyZXR1cm4gKFRvb2wpIGFkZFRvQ2F0ZWdvcnkoYWN0aW9uTWdyLCB0b29sLCB0b29sTWVudG9yLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoLCB0cnVlLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBhZGQgYSByb2xlIHRvIGEgUm9sZVNldAotCSAqIEBwYXJhbSBhY3Rpb25NZ3IKLQkgKiBAcGFyYW0gcm9sZVNldAotCSAqIEBwYXJhbSByb2xlCi0JICogQHJldHVybiBSb2xlU2V0Ci0JICovCi0JcHVibGljIFJvbGVTZXQgYWRkVG9Sb2xlU2V0KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgUm9sZVNldCByb2xlU2V0LAotCQkJUm9sZSByb2xlLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCXJldHVybiAoUm9sZVNldCkgYWRkVG9DYXRlZ29yeShhY3Rpb25NZ3IsIHJvbGVTZXQsIHJvbGUsCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgsIHRydWUsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbWV0aG9kIGVsZW1lbnQgdG8gdGhlIGNhdGVnb3J5LiBUaGlzIG1ldGhvZCBtaWdodCBjcmVhdGUgYSBuZXcKLQkgKiBjb250cmlidXRvciB0byB0aGUgZ2l2ZW4gY2F0ZWdvcnkgaW4gdGhlIG1ldGhvZCBlbGVtZW50J3MgcGx1Z2luIGlmIHRoZQotCSAqIGdpdmVuIGNhdGVnb3J5IGJlbG9uZ3MgdG8gdGhlIGJhc2UgcGx1Z2luIG9mIHRoZSBtZXRob2QgZWxlbWVudCdzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEBwYXJhbSBjYXRlZ29yeVBrZ1BhdGgKLQkgKiBAcGFyYW0gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yCi0JICogQHJldHVybiB0aGUgYWN0dWFsIGNhdGVnb3J5IHRoYXQgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IGlzIGFkZGVkIHRvCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBhZGRUb0NhdGVnb3J5KElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIFN0cmluZ1tdIGNhdGVnb3J5UGtnUGF0aCwKLQkJCWJvb2xlYW4gY2hlY2tGb3JFeGlzdGluZ0NvbnRyaWJ1dG9yLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUFkZFRvQ2F0ZWdvcnlDb21tYW5kIGNtZCA9IG5ldyBBZGRUb0NhdGVnb3J5Q29tbWFuZChjYXRlZ29yeSwgZWxlbWVudCwKLQkJCQlmZWF0dXJlLCBjYXRlZ29yeVBrZ1BhdGgsIGNoZWNrRm9yRXhpc3RpbmdDb250cmlidXRvciwgdXNlZENhdGVnb3JpZXMpOwotCQlhY3Rpb25NZ3IuZXhlY3V0ZShjbWQpOwotCQlyZXR1cm4gKENvbnRlbnRDYXRlZ29yeSkgKChMaXN0KSBjbWQuZ2V0QWZmZWN0ZWRPYmplY3RzKCkpLmdldCgwKTsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNpYmxlUm9sZShJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIFdvcmtQcm9kdWN0IHdwLAotLy8JCQlSb2xlIHJvbGUpIHsKLS8vCQlJUmVzb3VyY2VBd2FyZUNvbW1hbmQgY21kID0gbmV3IFNldE9wcG9zaXRlRmVhdHVyZUNvbW1hbmQod3AsCi0vLwkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGUsIHJvbGUpOwotLy8JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0vLwl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBjYXRlZ29yeS4gVGhpcyBtZXRob2QgbWlnaHQgZGVsZXRlCi0JICogdGhlIGNhdGVnb3J5IGlmIGl0IGlzIGEgY29udHJpYnV0b3IgYW5kIGJlY2FtZSBlbXB0eSBhZnRlciB0aGUgcmVtb3ZhbCBvZgotCSAqIHRoZSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBmZWF0dXJlIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGNvbnRlbnRQa2dQYXRoCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCwgZmFsc2UKLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tQ2F0ZWdvcnkoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJQ29udGVudENhdGVnb3J5IGNhdGVnb3J5LCBNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nW10gY29udGVudFBrZ1BhdGgsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJSVJlc291cmNlQXdhcmVDb21tYW5kIGNtZCA9IG5ldyBSZW1vdmVGcm9tQ2F0ZWdvcnlDb21tYW5kKGNhdGVnb3J5LAotCQkJCWVsZW1lbnQsIGZlYXR1cmUsIGNvbnRlbnRQa2dQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JCWFjdGlvbk1nci5leGVjdXRlKGNtZCk7Ci0JCXJldHVybiAhY21kLmdldFJlc3VsdCgpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBtZXRob2QgZWxlbWVudCBmcm9tIHRoZSBjYXRlZ29yeS4gVGhpcyBtZXRob2QgbWlnaHQgZGVsZXRlCi0JICogdGhlIGNhdGVnb3J5IGlmIGl0IGlzIGEgY29udHJpYnV0b3IgYW5kIGJlY2FtZSBlbXB0eSBhZnRlciB0aGUgcmVtb3ZhbCBvZgotCSAqIHRoZSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBmZWF0dXJlIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnRGZWF0dXJlcwotCSAqICAgICAgICAgICAgZmVhdHVyZXMgdG8gY2hlY2sgZm9yIGVtcHRpbmVzcyBiZWZvcmUgZGVsZXRpbmcgdGhlIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNvbnRlbnRQa2dQYXRoCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBtZXRob2QgZWxlbWVudCBpcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZCwgZmFsc2UKLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tQ2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5LCBNZXRob2RFbGVtZW50Ci0JLy8gZWxlbWVudCwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdCi0JLy8gZWxlbWVudEZlYXR1cmVzLCBTdHJpbmdbXSBjb250ZW50UGtnUGF0aCkgewotCS8vIGJvb2xlYW4gcmV0OwotCS8vIGJvb2xlYW4gZW1wdHkgPSBmYWxzZTsKLQkvLyBNZXRob2RQbHVnaW4gY2F0ZWdvcnlQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihjYXRlZ29yeSk7Ci0JLy8gTWV0aG9kUGx1Z2luIGVsZW1lbnRQbHVnaW4gPSBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQkvLyBDb250ZW50Q2F0ZWdvcnkgdXNlZENhdGVnb3J5OwotCS8vIGlmKGNhdGVnb3J5UGx1Z2luICE9IGVsZW1lbnRQbHVnaW4pIHsKLQkvLyB1c2VkQ2F0ZWdvcnkgPQotCS8vIFRuZ1V0aWwuZmluZENvbnRyaWJ1dG9yKFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGVsZW1lbnRQbHVnaW4sCi0JLy8gY29udGVudFBrZ1BhdGgpLCBjYXRlZ29yeSk7Ci0JLy8gaWYodXNlZENhdGVnb3J5ID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gZWxzZSB7Ci0JLy8gdXNlZENhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JLy8gfQotCS8vIGlmKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkvLyBDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbikgdXNlZENhdGVnb3J5LmVHZXQoZmVhdHVyZSk7Ci0JLy8gcmV0ID0gY29sbGVjdGlvbi5yZW1vdmUoZWxlbWVudCk7Ci0JLy8gZW1wdHkgPSB0cnVlOwotCS8vIC8vVE9ETzogbmVlZCByZXZpc2l0IHRvIGZpbmQgYmV0dGVyIHdheSB0byByZW1vdmUgdGhlIGVtcHR5IGNvbnRyaWJ1dG9ycwotCS8vIHdpdGhvdXQgYWRkaW5nIHRvIG11Y2ggd29yayBvbiBpbiB0aGUgVUkgY29kZQotCS8vIC8vCi0JLy8gLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50RmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkvLyAvLyBjb2xsZWN0aW9uID0gKENvbGxlY3Rpb24pIGNhdGVnb3J5LmVHZXQoZWxlbWVudEZlYXR1cmVzW2ldKTsKLQkvLyAvLyBpZighY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkvLyAvLyBlbXB0eSA9IGZhbHNlOwotCS8vIC8vIGJyZWFrOwotCS8vIC8vIH0KLQkvLyAvLyB9Ci0JLy8gfQotCS8vIGVsc2UgewotCS8vIHVzZWRDYXRlZ29yeS5lU2V0KGZlYXR1cmUsIG51bGwpOwotCS8vIHJldCA9IHRydWU7Ci0JLy8gfQotCS8vIC8vIGlmKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsICYmIGVtcHR5KSB7Ci0JLy8gLy8gRWNvcmVVdGlsLnJlbW92ZShjYXRlZ29yeSk7Ci0JLy8gLy8gfQotCS8vIHJldHVybiByZXQ7Ci0JLy8gfQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21EaXNjaXBsaW5lKERpc2NpcGxpbmUgZGlzY2lwbGluZSwgVGFzayB0YXNrKSB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCk7Ci0JLy8gcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShkaXNjaXBsaW5lLCB0YXNrLCBmZWF0dXJlLCBuZXcKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7IGZlYXR1cmUgfSwKLQkvLyBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCk7Ci0JLy8gfQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21EaXNjaXBsaW5lKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwKLQkJCURpc2NpcGxpbmUgZGlzY2lwbGluZSwgVGFzayB0YXNrLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgZGlzY2lwbGluZSwgdGFzaywgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRpc2NpcGxpbmVEZWZpbml0aW9uUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Eb21haW4oRG9tYWluIGRvbWFpbiwgV29ya1Byb2R1Y3Qgd3ApIHsKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9Ci0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoZG9tYWluLCB3cCwgZmVhdHVyZSwgbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkvLyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZG9tYWluUGF0aCk7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbURvbWFpbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIERvbWFpbiBkb21haW4sCi0JCQlXb3JrUHJvZHVjdCB3cCwgTGlzdCB1c2VkQ2F0ZWdvcmllcykgewotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKTsKLQkJcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShhY3Rpb25NZ3IsIGRvbWFpbiwgd3AsIGZlYXR1cmUsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kb21haW5QYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgd3BUeXBlLAotCS8vIFdvcmtQcm9kdWN0IHdwKSB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPQotCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQkvLyByZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KHdwVHlwZSwgd3AsIGZlYXR1cmUsIG5ldyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7Ci0JLy8gZmVhdHVyZSB9LCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULndvcmtQcm9kdWN0VHlwZVBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Xb3JrUHJvZHVjdFR5cGUoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJV29ya1Byb2R1Y3RUeXBlIHdwVHlwZSwgV29ya1Byb2R1Y3Qgd3AsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCk7Ci0JCXJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoYWN0aW9uTWdyLCB3cFR5cGUsIHdwLCBmZWF0dXJlLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCwgdXNlZENhdGVnb3JpZXMpOwotCX0KLQotCS8vIHB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Sb2xlU2V0KFJvbGVTZXQgcm9sZVNldCwgUm9sZSByb2xlKSB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0JLy8gcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeShyb2xlU2V0LCByb2xlLCBmZWF0dXJlLCBuZXcKLQkvLyBFU3RydWN0dXJhbEZlYXR1cmVbXSB7IGZlYXR1cmUgfSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JLy8gfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbVJvbGVTZXQoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLCBSb2xlU2V0IHJvbGVTZXQsCi0JCQlSb2xlIHJvbGUsIExpc3QgdXNlZENhdGVnb3JpZXMpIHsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0JCXJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkoYWN0aW9uTWdyLCByb2xlU2V0LCByb2xlLCBmZWF0dXJlLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tVG9vbChUb29sIHRvb2wsIFRvb2xNZW50b3IgdG9vbE1lbnRvcikgewotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpOwotCS8vIHJldHVybiByZW1vdmVGcm9tQ2F0ZWdvcnkodG9vbCwgdG9vbE1lbnRvciwgZmVhdHVyZSwgbmV3Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10geyBmZWF0dXJlIH0sIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQudG9vbFBhdGgpOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZyb21Ub29sKElBY3Rpb25NYW5hZ2VyIGFjdGlvbk1nciwgVG9vbCB0b29sLAotCQkJVG9vbE1lbnRvciB0b29sTWVudG9yLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpOwotCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgdG9vbCwgdG9vbE1lbnRvciwgZmVhdHVyZSwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoLCB1c2VkQ2F0ZWdvcmllcyk7Ci0JfQotCi0JLy8gcHVibGljIGJvb2xlYW4gcmVtb3ZlRnJvbUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5Ci0JLy8gdXNlckRlZmluZWRDYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlKSB7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGNvbnRlbnRFbGVtZW50RmVhdHVyZSA9Ci0JLy8gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBjb250ZW50Q2F0ZWdvcnlGZWF0dXJlID0KLQkvLyBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCk7Ci0JLy8gRVN0cnVjdHVyYWxGZWF0dXJlW10gZmVhdHVyZXMgPSB7IGNvbnRlbnRFbGVtZW50RmVhdHVyZSwKLQkvLyBjb250ZW50Q2F0ZWdvcnlGZWF0dXJlIH07Ci0JLy8gaWYoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JLy8gcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeSh1c2VyRGVmaW5lZENhdGVnb3J5LCBlLCBjb250ZW50RWxlbWVudEZlYXR1cmUsCi0JLy8gZmVhdHVyZXMsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkvLyB9Ci0JLy8gZWxzZSBpZihlIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JLy8gcmV0dXJuIHJlbW92ZUZyb21DYXRlZ29yeSh1c2VyRGVmaW5lZENhdGVnb3J5LCBlLCBjb250ZW50Q2F0ZWdvcnlGZWF0dXJlLAotCS8vIGZlYXR1cmVzLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JLy8gfQotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVGcm9tQ3VzdG9tQ2F0ZWdvcnkoSUFjdGlvbk1hbmFnZXIgYWN0aW9uTWdyLAotCQkJQ3VzdG9tQ2F0ZWdvcnkgdXNlckRlZmluZWRDYXRlZ29yeSwgTWV0aG9kRWxlbWVudCBlLCBMaXN0IHVzZWRDYXRlZ29yaWVzKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0JCQlyZXR1cm4gcmVtb3ZlRnJvbUNhdGVnb3J5KGFjdGlvbk1nciwgdXNlckRlZmluZWRDYXRlZ29yeSwgZSwKLQkJCQkJZmVhdHVyZSwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jdXN0b21DYXRlZ29yeVBhdGgsIHVzZWRDYXRlZ29yaWVzKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgdGhlIGVkaXRvciBjbG9zZXMsIHBhc3NpbmcgaW4gYWxsIHRoZSBjYXRlZ29yaWVzCi0JICogdGhhdCB5b3UgaGF2ZSByZXRyaWV2ZWQgd2l0aCBnZXRBdmFpbGFibGVYWFgoKSBmb3IgdGhlIGVkaXRvcgotCSAqIAotCSAqIEBwYXJhbSBjb25zdW1lcgotCSAqIEBwYXJhbSBjYXRlZ29yaWVzCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUNhdGVnb3JpZXMoTWV0aG9kRWxlbWVudCBjb25zdW1lciwgQ29sbGVjdGlvbiBjYXRlZ29yaWVzKSB7Ci0JCU1ldGhvZFBsdWdpbiBjb25zdW1lclBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGNvbnN1bWVyKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSA9IChDb250ZW50Q2F0ZWdvcnkpIGl0ZXIubmV4dCgpOwotCQkJTWV0aG9kUGx1Z2luIGNhdGVnb3J5UGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oY2F0ZWdvcnkpOwotCQkJaWYgKGNhdGVnb3J5LmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCSYmIGNhdGVnb3J5UGx1Z2luID09IGNvbnN1bWVyUGx1Z2luCi0JCQkJCSYmIFRuZ1V0aWwuaXNFbXB0eShjYXRlZ29yeSkpIHsKLQkJCQlFY29yZVV0aWwucmVtb3ZlKGNhdGVnb3J5KTsKLQkJCQlpZiAoY2F0ZWdvcnkgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQlUbmdVdGlsLmdldFJvb3RDdXN0b21DYXRlZ29yeShjYXRlZ29yeVBsdWdpbikKLQkJCQkJCQkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLnJlbW92ZShjYXRlZ29yeSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlTdHJpbmdbXSBwYXRoID0gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aChjYXRlZ29yeSk7Ci0JCQkJLy8gcGF0aCBjYW4gYmUgbnVsbCBpZiB0aGUgY2F0ZWdvcnkgaXMgZGVsZXRlZAotCQkJCS8vCi0JCQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJCQlDb250ZW50UGFja2FnZSBjYXRlZ29yeVBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKAotCQkJCQkJCWNvbnN1bWVyUGx1Z2luLCBwYXRoKTsKLQkJCQkJQ29udGVudENhdGVnb3J5IGNvbnRyaWJ1dG9yID0gVG5nVXRpbC5maW5kQ29udHJpYnV0b3IoCi0JCQkJCQkJY2F0ZWdvcnlQa2csIGNhdGVnb3J5KTsKLQkJCQkJaWYgKGNvbnRyaWJ1dG9yICE9IG51bGwgJiYgVG5nVXRpbC5pc0VtcHR5KGNvbnRyaWJ1dG9yKSkgewotCQkJCQkJRWNvcmVVdGlsLnJlbW92ZShjb250cmlidXRvcik7Ci0JCQkJCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCQkJCVRuZ1V0aWwuZ2V0Um9vdEN1c3RvbUNhdGVnb3J5KGNvbnN1bWVyUGx1Z2luKQotCQkJCQkJCQkJLmdldENhdGVnb3JpemVkRWxlbWVudHMoKS5yZW1vdmUoY29udHJpYnV0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlVGFza3MoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoVGFzay5jbGFzcywgY2F0ZWdvcnksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVXb3JrUHJvZHVjdHMoQ29udGVudENhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCS8vIC8vIHNwZWNpYWwgaGFuZGxpbmcgdG8gZGlzYWxsb3cgYXNzaWdtZW50IG9mIHdvcmsgcHJvZHVjdHMgdG8gZG9tYWluCi0JCS8vIHdpdGggc3ViZG9tYWlucwotCQkvLyAvLwotCQkvLyBpZihjYXRlZ29yeSBpbnN0YW5jZW9mIERvbWFpbiAmJgotCQkvLyAhKChEb21haW4pY2F0ZWdvcnkpLmdldFN1YmRvbWFpbnMoKS5pc0VtcHR5KCkpIHsKLQkJLy8gcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCS8vIH0KLQotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFdvcmtQcm9kdWN0LmNsYXNzLCBjYXRlZ29yeSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVzKENvbnRlbnRDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlyZXR1cm4gZ2V0QXZhaWxhYmxlQ29udGVudEVsZW1lbnRzKFJvbGUuY2xhc3MsIGNhdGVnb3J5LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGdpdmVuIGNvbnRlbnQgZWxlbWVudAotCSAqIHRvIHJlZmVyZW5jZSB0bwotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RFbGVtZW50VHlwZQotCSAqICAgICAgICAgICAgY29uY3JlY3QgY2xhc3Mgb2YgdGhlIHRoZSBnaXZlbiBjb250ZW50IGVsZW1lbnQuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbG9jYWxPbmx5Ci0JICogICAgICAgICAgICBpZiB0cnVlLCBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgZ2l2ZW4gZWxlbWVudCdzIHBsdWdpbiBhcmUKLQkgKiAgICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhDbGFzcyBtZXRob2RFbGVtZW50VHlwZSwKLQkJCUNvbnRlbnRFbGVtZW50IGVsZW1lbnQsIGJvb2xlYW4gbG9jYWxPbmx5KSB7Ci0JCUxpc3QgZWxlbWVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgbW9kZWxMaXN0OwotCQlpZiAobG9jYWxPbmx5KSB7Ci0JCQltb2RlbExpc3QgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFVtYVV0aWwKLQkJCQkJLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RlbExpc3QgPSBNZXRob2RFbGVtZW50VXRpbC5nZXRBbGxNb2RlbHMoZWxlbWVudCk7Ci0JCX0KLQkJaW50IHNpemUgPSBtb2RlbExpc3Quc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTWV0aG9kUGx1Z2luIG1vZGVsID0gKE1ldGhvZFBsdWdpbikgbW9kZWxMaXN0LmdldChpKTsKLQkJCUNvbnRlbnRQYWNrYWdlIGNvcmVDb250ZW50UGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UobW9kZWwsCi0JCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY29yZUNvbnRlbnRQYXRoKTsKLQkJCWlmIChjb3JlQ29udGVudFBrZyA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJVHJlZUl0ZXJhdG9yIGl0ZXJhdG9yID0gY29yZUNvbnRlbnRQa2cuZUFsbENvbnRlbnRzKCk7Ci0KLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChtZXRob2RFbGVtZW50VHlwZS5pc0luc3RhbmNlKG9iaikgJiYgb2JqICE9IGVsZW1lbnQpIHsKLQkJCQkJZWxlbWVudExpc3QuYWRkKG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChlbGVtZW50TGlzdCwgbmFtZUNvbXBhcmF0b3IpOwotCi0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVRhc2tzKFJvbGUgcm9sZSkgewotCQkvLyBXaGlsZSBlZGl0aW5nIGEgcm9sZSwgeW91IG9ubHkgY2FuIGFzc2lnbiB0aGlzIHJvbGUgdG8gYSB0YXNrIGluIHRoZQotCQkvLyBzYW1lIHBsdWdpbi4KLQkJLy8gT3RoZXdpc2UgeW91IHdpbGwgbW9kaWZ5IHRoZSBiYXNlIHBsdWdpbi4KLQkJLy8KLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhUYXNrLmNsYXNzLCByb2xlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVUYXNrcyhXb3JrUHJvZHVjdCB3cCkgewotCQkvLyBXaGlsZSBlZGl0aW5nIGEgd29yayBwcm9kdWN0LCB5b3Ugb25seSBjYW4gYXNzaWduIHRoaXMgd29yayBwcm9kdWN0Ci0JCS8vIHRvIGEgdGFzayBpbiB0aGUgc2FtZSBwbHVnaW4uCi0JCS8vIE90aGV3aXNlIHlvdSB3aWxsIG1vZGlmeSB0aGUgYmFzZSBwbHVnaW4uCi0JCS8vCi0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoVGFzay5jbGFzcywgd3AsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVJvbGVzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCS8vIFdoaWxlIGVkaXRpbmcgYSB3b3JrIHByb2R1Y3QsIHlvdSBvbmx5IGNhbiBhc3NpZ24gdGhpcyB3b3JrIHByb2R1Y3QKLQkJLy8gdG8gYSByb2xlIGluIHRoZSBzYW1lIHBsdWdpbi4KLQkJLy8gT3RoZXdpc2UgeW91IHdpbGwgbW9kaWZ5IHRoZSBiYXNlIHBsdWdpbi4KLQkJLy8KLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhSb2xlLmNsYXNzLCB3cCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJvbGUKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVXb3JrUHJvZHVjdHMoUm9sZSByb2xlKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoV29ya1Byb2R1Y3QuY2xhc3MsIHJvbGUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFzawotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZVdvcmtQcm9kdWN0cyhUYXNrIHRhc2spIHsKLQkJcmV0dXJuIGdldEF2YWlsYWJsZUNvbnRlbnRFbGVtZW50cyhXb3JrUHJvZHVjdC5jbGFzcywgdGFzaywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlUm9sZXMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiBnZXRBdmFpbGFibGVDb250ZW50RWxlbWVudHMoUm9sZS5jbGFzcywgdGFzaywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RlcExpc3QoVGFzayB0YXNrKSB7Ci0JCWlmICh0YXNrLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTCi0JCQkJfHwgdGFzay5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gVG5nVXRpbC5nZXRCYXNlKHRhc2spOwotCQkJZmluYWwgTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmICh0eXBlcy5pc0VtcHR5KCkpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKHR5cGVzKSB7Ci0JCQkJCWlmICh0eXBlcy5pc0VtcHR5KCkpIHsKLQkJCQkJCXR5cGVzLmFkZChWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQkJCQkJdHlwZXMuYWRkKFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUl0ZXJhdG9yIGV4dGVuZGVkID0gbmV3IEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJhc2UpIHsKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQkJCQlMaXN0IGxpc3QgPSBBc3NvY2lhdGlvbkhlbHBlcgotCQkJCQkJCS5nZXRJbW1lZGlhdGVWYXJpZXRpZXMoKFZhcmlhYmlsaXR5RWxlbWVudCkgb2JqZWN0KTsKLQkJCQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LmlzRW1wdHkoKSkKLQkJCQkJCUNvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJCQkJTGlzdCBvdXRwdXRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGUgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBsaXN0LmdldChpKTsKLQkJCQkJCWlmICh0eXBlcy5jb250YWlucyhlLmdldFZhcmlhYmlsaXR5VHlwZSgpKSkgewotCQkJCQkJCW91dHB1dExpc3QuYWRkKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBvdXRwdXRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfTsKLQkJCWZvciAoOyBleHRlbmRlZC5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0ID0gKFRhc2spIGV4dGVuZGVkLm5leHQoKTsKLQkJCQl0LmdldFByZXNlbnRhdGlvbigpLmdldFNlY3Rpb25zKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGJhc2UKLQkgKiBAcGFyYW0gdmFyaWFiaWxpdHlUeXBlcwotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuZGVkKFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLCBDb2xsZWN0aW9uIHZhcmlhYmlsaXR5VHlwZXMpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRFeHRlbmRlZChsaXN0LCBiYXNlLCB2YXJpYWJpbGl0eVR5cGVzKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRFeHRlbmRlZChMaXN0IG91dHB1dExpc3QsIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNlLAotCQkJQ29sbGVjdGlvbiB2YXJpYWJpbGl0eVR5cGVzKSB7Ci0JCUxpc3QgbGlzdCA9IEFzc29jaWF0aW9uSGVscGVyLmdldEltbWVkaWF0ZVZhcmlldGllcyhiYXNlKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBlID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgbGlzdC5nZXQoaSk7Ci0JCQlpZiAodmFyaWFiaWxpdHlUeXBlcy5jb250YWlucyhlLmdldFZhcmlhYmlsaXR5VHlwZSgpKSkgewotCQkJCW91dHB1dExpc3QuYWRkKGUpOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgZSA9IChWYXJpYWJpbGl0eUVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKHZhcmlhYmlsaXR5VHlwZXMuY29udGFpbnMoZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSkpIHsKLQkJCQlnZXRFeHRlbmRlZChvdXRwdXRMaXN0LCBiYXNlLCB2YXJpYWJpbGl0eVR5cGVzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcnlQYWNrYWdlUGF0aChDb250ZW50Q2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLQkJRU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQlmb3IgKHBhcmVudCA9IGNhdGVnb3J5LmVDb250YWluZXIoKTsgcGFyZW50ICE9IG51bGwKLQkJCQkmJiAhKHBhcmVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKTsgcGFyZW50ID0gcGFyZW50Ci0JCQkJLmVDb250YWluZXIoKSkKLQkJCTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbnRlbnRQYWNrYWdlIGNhdGVnb3J5UGtnID0gKENvbnRlbnRQYWNrYWdlKSBwYXJlbnQ7Ci0JCXJldHVybiBNaXNjLmdldFBhdGhSZWxhdGl2ZVRvUGx1Z2luKGNhdGVnb3J5UGtnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xpYnJhcnlVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9MaWJyYXJ5VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTUzYTk3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL0xpYnJhcnlVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UcmFuc2llbnRHcm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuSUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UuSUxpYnJhcnlSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLk11bHRpRmlsZVJlc291cmNlU2V0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gUFVCTElTSF9NT0RFID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvcjxFQ2xhc3M+IHR5cGVDb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8RUNsYXNzPigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoRUNsYXNzIG8xLCBFQ2xhc3MgbzIpIHsKLQkJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7Ci0JCX0KLQkJCi0JfTsKLQotCXByaXZhdGUgc3RhdGljIExpc3Q8RUNsYXNzPiBpbmNsdWRlZEVsZW1lbnRUeXBlczsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPEVDbGFzcz4gZXhjbHVkZWRUeXBlcyA9IEFycmF5cy5hc0xpc3QobmV3IEVDbGFzc1tdIHsKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RnVsZmlsbGFibGVFbGVtZW50KCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRLaW5kKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0VsZW1lbnQoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3IoKSwKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpLAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya09yZGVyKCksCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCX0pOwotCQotCS8qKgotCSAqIENoZWNrIGlzIGdpdmVuIHBsdWdpbiBuYW1lIGlzIHZhbGlkIG5hbWUgaW4gdGhlIGxpYnJhcnkKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hlY2tQbHVnaW5OYW1lKE1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZyBuZXdOYW1lKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlyZXR1cm4gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlVmFsaWRhdG9yKGxpYiwKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywKLQkJCQkoSUZpbHRlcikgbnVsbCwgbnVsbCwgVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKQotCQkJCS5pc1ZhbGlkKG5ld05hbWUpOwkJCi0JfQotCi0JLyoqCi0JICogbWV0aG9kIHRvIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGEgcGx1Z2luIG9yIHBhY2thZ2Ugc28gdGhhdCBpcyBjYW4gYmUgc2VsZWN0ZWQgaW4gY29uZmlndXJhdGlvbiBlZGl0b3IuIAotCSAqIE1heSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoaXMuCi0JICogQHBhcmFtIGVsZW1lbnQgRU9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzZWxlY3RhYmxlKEVPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5Ci0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBjb250YWluZXIgb2YgdGhlIGVsZW1lbnQgdGhhdCBpcyBzZWxlY3RhYmxlLgotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKiBAcmV0dXJuIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0U2VsZWN0YWJsZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBCcmVha2Rvd25FbGVtZW50KSB7Ci0JCQlFT2JqZWN0IHBrZyA9IGVsZW1lbnQuZUNvbnRhaW5lcigpOwotCQkJd2hpbGUgKHBrZyAhPSBudWxsICYmICEocGtnIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgKSB7Ci0JCQkJcGtnID0gcGtnLmVDb250YWluZXIoKTsKLQkJCX0KLQkJCXJldHVybiBwa2c7Ci0JCQkKLQkJfSBlbHNlIHsKLQkJCUVPYmplY3QgcGFyZW50ID0gZWxlbWVudDsKLQkJCXdoaWxlICgocGFyZW50ICE9IG51bGwpICYmICFzZWxlY3RhYmxlKHBhcmVudCkpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZUNvbnRhaW5lcigpOwotCQkJfQotCi0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBtZXRob2QgcGx1Z2luIGZvciB0aGUgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IEVPYmplY3QKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihFT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gRU9iamVjdCBwYXJlbnQgPSBlbGVtZW50OwotCQkvLyB3aGlsZSAoKHBhcmVudCAhPSBudWxsKSAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJLy8gcGFyZW50ID0gcGFyZW50LmVDb250YWluZXIoKTsKLQkJLy8gfQotCQkvLwotCQkvLyByZXR1cm4gKE1ldGhvZFBsdWdpbikgcGFyZW50OwotCi0JCXJldHVybiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSBwcmludGFibGUgbmFtZSBzdHJpbmcgZm9yIHRoZSBlbGVtZW50LiBOb3RlLCB0aGlzIGlzIG5vdCB0aGUgZWxlbWVudCBuYW1lIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBlbGVtZW50IE9iamVjdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIExpYnJhcnlSZXNvdXJjZXMudW5rbm93bl90ZXh0OyAKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRGdWxsTmFtZSgoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZWxlbWVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdldCBhIHByaW50YWJsZSBuYW1lIGZvciB0aGUgZWxlbWVudC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsTmFtZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKHNlbGVjdGFibGUoZWxlbWVudCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlidWZmZXIuYXBwZW5kKCJbIikuYXBwZW5kKGVsZW1lbnQuZ2V0TmFtZSgpKS5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlNZXRob2RFbGVtZW50IHBhcmVudCA9IGVsZW1lbnQ7Ci0JCQl3aGlsZSAoKHBhcmVudCA9IChNZXRob2RFbGVtZW50KSBwYXJlbnQuZUNvbnRhaW5lcigpKSAhPSBudWxsKSB7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJ1ZmZlci5pbnNlcnQoMCwgIlsiICsgcGFyZW50LmdldE5hbWUoKSArICJdLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBlbGVtZW50LmdldE5hbWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZWxlbWVudCdzIHR5cGU6bmFtZSBhcyBhIGxvY2FsaXplZCBzdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2NhbGl6ZVR5cGVOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJU3RyaW5nIG5hbWVTdHIgPSBUbmdVdGlsLmdldFR5cGVUZXh0KGVsZW1lbnQpICsgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlIDsKLQkJCQotCQkJaWYgKCgoRGVzY3JpYmFibGVFbGVtZW50KSBlbGVtZW50KS5nZXRQcmVzZW50YXRpb25OYW1lKCkgIT0gbnVsbCkgewotCQkJCW5hbWVTdHIgKz0gIigiICsgKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpLmdldFByZXNlbnRhdGlvbk5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkrICIpICIgKyAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCW5hbWVTdHIgKz0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmFtZVN0ciA7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZU5hbWUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgdHlwZTpuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50ID09IG51bGwgPyAiIiA6IGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIGVsZW1lbnQuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50J3MgdHlwZTpuYW1lCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBlbGVtZW50ID09IG51bGwgPyAiIiA6IGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6IiArIFRuZ1V0aWwuZ2V0TGFiZWxXaXRoUGF0aChlbGVtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JCi0JLyoqCi0JICogZ2V0IHRoZSBtZXRob2QgcGx1Z2lucyBpbiB0aGUgbGlicmFyeQotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIExpc3QgYSBsaXN0IG9mIE1ldGhvZFBsdWdpbiBvYmplY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2lucyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPihsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IGEgbGlzdCBvZiBndWlkIHN0cmluZ3Mgb2YgdGhlIG1ldGhvZCBwbHVnaW5zIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYnJhcnkgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNZXRob2RQbHVnaW5HdWlkcyhNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJTGlzdCBpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBlbGVtZW50cyA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQlpdGVtcy5hZGQoZWxlbWVudC5nZXRHdWlkKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgTWV0aG9kUGx1Z2luIGluIHRoZSBsaWJyYXJ5IHdpdGggdGhlIGdpdmVuIHBsdWdpbiBndWlkLgotCSAqIAotCSAqIEBwYXJhbSBsaWJyYXJ5IE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gcGx1Z2luR3VpZCBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZFBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihNZXRob2RMaWJyYXJ5IGxpYnJhcnksCi0JCQlTdHJpbmcgcGx1Z2luR3VpZCkgewotCQlpZiAocGx1Z2luR3VpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUxpc3QgZWxlbWVudHMgPSBsaWJyYXJ5LmdldE1ldGhvZFBsdWdpbnMoKTsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHBsdWdpbkd1aWQuZXF1YWxzKGVsZW1lbnQuZ2V0R3VpZCgpKSkgewotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBNZXRob2RQbHVnaW4gaW4gdGhlIGxpYnJhcnkgd2l0aCB0aGUgZ2l2ZW4gcGx1Z2luIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqIEByZXR1cm4gTWV0aG9kUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gZ2V0TWV0aG9kUGx1Z2luQnlOYW1lKE1ldGhvZExpYnJhcnkgbGlicmFyeSwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTGlzdCBlbGVtZW50cyA9IGxpYnJhcnkuZ2V0TWV0aG9kUGx1Z2lucygpOwotCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0Lm5leHQoKTsKLQkJCQlpZiAobmFtZS5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBlbGVtZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogZ2V0IGFsbCB0aGUgY29udGFpbmVkIE1ldGhvZFBhY2thZ2VzIGZvciB0aGUgZWxlbWVudCwgcmV0dXJuIGVtcHR5IGxpc3QgaWYgbm90aGluZyBmb3VuZC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1ldGhvZFBhY2thZ2VzKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlMaXN0IGl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBlID0gKEVPYmplY3QpIGl0Lm5leHQoKTsKLQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCWl0ZW1zLmFkZChlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiB1cHdyYXAgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogT2JqZWN0Ci0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCB1bndyYXAoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gVG5nVXRpbC51bndyYXAob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiB1bndyYXAgdGhlIGNvbW1hbmQKLQkgKiBAcGFyYW0gY21kIENvbW1hbmQKLQkgKiBAcmV0dXJuIENvbW1hbmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1hbmQgdW53cmFwKENvbW1hbmQgY21kKSB7Ci0JCXJldHVybiBUbmdVdGlsLnVud3JhcChjbWQpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHRoZSByZXNvdXJjZSB0aGUgZWxlbWVudHMgYXNzb2NpYXRlZCB0by4gU28gdGhhdCB0aGUgZWxlbWVudCBjYW4gYmUKLQkgKiBhZGRlZCB0byBhbm90aGVyIGxpYnJhcnkgYW5kIGdvdCBuZXcgcmVzb3VyY2UgYXNzaWduZWQuCi0JICogCi0JICogQHBhcmFtIGltcG9ydExpYnJhdHkKLQkgKiAgICAgICAgICAgIE1ldGhvZExpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGV0YWNoRnJvbVJlc291cmNlKE1ldGhvZExpYnJhcnkgaW1wb3J0TGlicmF0eSkgewotCQlSZXNvdXJjZVNldCByZXNTZXQgPSBudWxsOwotCQlSZXNvdXJjZSByZXMgPSBpbXBvcnRMaWJyYXR5LmVSZXNvdXJjZSgpOwotCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCXJlc1NldCA9IHJlcy5nZXRSZXNvdXJjZVNldCgpOwotCQl9Ci0KLQkJaWYgKHJlc1NldCAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVJdGVyYXRvciBpdCA9IHJlc1NldC5nZXRBbGxDb250ZW50cygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTXVsdGlSZXNvdXJjZUVPYmplY3QpIHsKLQkJCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgb2JqKS5lU2V0UmVzb3VyY2UobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2xlYXIgYWxsIHRoZSB1bnJlc29sdmVkIHByb3hpZXMKLQkJY2xlYXJQcm94aWVzKGltcG9ydExpYnJhdHkpOwotCX0KLQotCS8qKgotCSAqIGNsZWFyIHByb3h5IGZvciB0aGUgZWxlbWVudC4gVGhpcyBpcyB1c2VkIHRvIGZpeCB0aGUgZWxlbWVudCB3aGVuIHRoZSBwcm94eSBjYW4ndCBiZSByZXNvbHZlZC4KLQkgKiBAcGFyYW0gZWxlbWVudCBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyUHJveGllcyhFT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQuZUlzUHJveHkoKSkgewotCQkJLy8gcmVzZXQgdGhlIHByb3h5IHRvIG51bGwKLQkJCXNldFByb3h5VVJJKGVsZW1lbnQsIG51bGwpOwotCQl9IGVsc2UgewotCQkJLy8gaXRlcmF0ZSB0aGUgY2hpbGRyZW4KLQkJCWZvciAoVHJlZUl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgbyA9IChFT2JqZWN0KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG8uZUlzUHJveHkoKSkgewotCQkJCQlzZXRQcm94eVVSSShvLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIG9iamVjdCdzIHByb3h5IHVyaQotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqIEBwYXJhbSB1cmkgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm94eVVSSShFT2JqZWN0IG9iaiwKLQkJCW9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkgdXJpKSB7Ci0JCSgob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkgb2JqKS5lU2V0UHJveHlVUkkodXJpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldExvYWRlZFJlc291cmNlcyhNZXRob2RMaWJyYXJ5IGxpYiwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZXhjbHVkZXMpIHsKLQotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkZWRyZXMgPSBuZXcgSGFzaFNldDxSZXNvdXJjZT4oKTsKLQotCQlmb3IgKEl0ZXJhdG9yPFJlc291cmNlPiBpdCA9IGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpCi0JCQkJLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlSZXNvdXJjZSByZXMgPSAoUmVzb3VyY2UpaXQubmV4dCgpOwotCQkJaWYgKCByZXMuaXNMb2FkZWQoKSApIHsKLQkJCQlpZiAoIChleGNsdWRlcyA9PSBudWxsKSB8fCAhZXhjbHVkZXMuY29udGFpbnMocmVzKSApIHsKLQkJCQkJbG9hZGVkcmVzLmFkZChyZXMpOwotCQkJCX0KLQkJCX0KLQkJfQkKLQkJCi0JCXJldHVybiBsb2FkZWRyZXM7Ci0JfQotCQotCS8qKgotCSAqIGxvYWQgYWxsIGVsZW1lbnRzIGluIHRoZSBsaWJyYXJ5Ci0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlc291cmNlPiBsb2FkQWxsKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0KLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gbG9hZGVkcmVzID0gZ2V0TG9hZGVkUmVzb3VyY2VzKGxpYiwgbnVsbCk7Ci0JCQotCQlsb2FkQWxsQ29udGFpbmVkKGxpYik7Ci0JCQotCQlyZXR1cm4gZ2V0TG9hZGVkUmVzb3VyY2VzKGxpYiwgbG9hZGVkcmVzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEFsbENvbnRhaW5lZChNZXRob2RFbGVtZW50IG1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IG1lLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCXRyeSB7Ci0JCQkJRU9iamVjdCBlbGVtZW50ID0gKEVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCWZvciAoSXRlcmF0b3I8RU9iamVjdD4gaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxQbHVnaW5zKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVpZ25zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQlmb3IgKE1ldGhvZFBsdWdpbiBwbHVnaW46IHBsdWlnbnMpIHsKLQkJCWxvYWRBbGxDb250YWluZWQocGx1Z2luKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBsb2FkIGFsbCBwcm9jZXNzZXMgaW4gdGhlIGxpYnJhcnkKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZEFsbFByb2Nlc3NlcyhNZXRob2RMaWJyYXJ5IGxpYikgewotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpYi5nZXRNZXRob2RQbHVnaW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCQlUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogc2F2ZSBhbGwgZWxlbWVudHMgaW4gdGhlIGxpYnJhcnkgbm90IG1hdHRlciB0aGUgZWxlbWVudCBpcyBjaGFuZ2VkIG9yIG5vdC4gCi0JICogRG9uJ3QgcmVmcmVzaCB0aGUgd29ya3NwYWNlLgotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGwoTWV0aG9kTGlicmFyeSBsaWIpIHRocm93cyBFeGNlcHRpb24gewotCQlzYXZlTGlicmFyeShsaWIsIHRydWUsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBzYXZlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkgYmFzZWQgb24gdGhlIGxpYnJhcnkgcmVzb3VyY2VzZXQuIFlvdQotCSAqIG5lZWQgdG8gc2V0IHRoZSByZXNvdXJjZSBzZXQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QgdG8gc2F2ZSB0aGUKLQkgKiBsaWJyYXJ5Ci0JICogCi0JICogQHBhcmFtIGxpYgotCSAqICAgICAgICAgICAgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBzYXZlQWxsCi0JICogICAgICAgICAgICBib29sZWFuIGlmIHRydWUsIGZvcmNlIHNhdmluZyBhbGwgdGhlIHJlc291cmNlcyBldmVuIGlmIHRoZXkKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbW9kaWZpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliLCBib29sZWFuIHNhdmVBbGwsCi0JCQlib29sZWFuIHJlZnJlc2gpIHRocm93cyBFeGNlcHRpb24gewotCQlJTGlicmFyeVJlc291cmNlU2V0IGxpYlJlc291cmNlU2V0ID0gKElMaWJyYXJ5UmVzb3VyY2VTZXQpIGxpYi5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQlpZihsaWJSZXNvdXJjZVNldCBpbnN0YW5jZW9mIE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgewotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgbGliUmVzb3VyY2VTZXQ7Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJTWFwIHNhdmVPcHRpb25zID0gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlci5nZXRTYXZlT3B0aW9ucygpCi0JCQkJCTogbmV3IEhhc2hNYXAoKTsKLQotCQkJLy8gYmFjayB1cCBjdXJyZW50IFJFRlJFU0hfTkVXX1JFU09VUkNFIG9wdGlvbgotCQkJT2JqZWN0IG9sZCA9IHNhdmVPcHRpb25zLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSk7Ci0JCQlPYmplY3Qgb2xkQ2hlY2tNb2RpZnkgPSBzYXZlT3B0aW9ucwotCQkJLmdldChNdWx0aUZpbGVYTUlTYXZlSW1wbC5DSEVDS19NT0RJRlkpOwotCQkJdHJ5IHsKLQkJCQkvLyBkaXNhYmxlIHdvcmtzcGFjZSByZWZyZXNoIHdoZW4gbmV3IGZpbGUgaXMgY3JlYXRlZAotCQkJCXNhdmVPcHRpb25zLnB1dChNdWx0aUZpbGVYTUlTYXZlSW1wbC5SRUZSRVNIX05FV19SRVNPVVJDRSwKLQkJCQkJCXJlZnJlc2ggPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkNIRUNLX01PRElGWSwgImZhbHNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8vIHNhdmUgcmVzb3VyY2Ugc2V0IGhlcmUKLQkJCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCBzYXZlQWxsKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy8gcmVzdG9yZSBSRUZSRVNIX05FV19SRVNPVVJDRSBvcHRpb24KLQkJCQlzYXZlT3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuUkVGUkVTSF9ORVdfUkVTT1VSQ0UsIG9sZCk7Ci0JCQkJc2F2ZU9wdGlvbnMucHV0KE11bHRpRmlsZVhNSVNhdmVJbXBsLkNIRUNLX01PRElGWSwgb2xkQ2hlY2tNb2RpZnkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJbGliUmVzb3VyY2VTZXQuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgbGlicmFyeSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguIHJldHVybiB0aGUgTWV0aG9kTGlicmFyeS4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdGhlIG9wZW4gbGlicmFyeSBpbiBMaWJyYXJ5U2VydmljZS4gCi0JICogSXQgb25seSBsb2FkIHRoZSByb3cgbGlicmFyeSBvYmplY3QgYnV0IHdpbGwgbm90IGltcGFjdCB0aGUgY3VycmVudCBFUEYgZW52aXJvbm1lbnQuCi0JICogQHBhcmFtIGxpYnJhcnlQYXRoIFN0cmluZwotCSAqIEByZXR1cm4gTWV0aG9kTGlicmFyeQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGxvYWRMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5UGF0aCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gUGVyc2lzdGVuY2VTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVJlc291cmNlU2V0KFNlcnZpY2VzLlhNSV9QRVJTSVNURU5DRV9UWVBFKTsKLQkJcmVzb3VyY2VTZXQubG9hZE1ldGhvZExpYnJhcmllcyhVUkkuY3JlYXRlRmlsZVVSSShsaWJyYXJ5UGF0aCksIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCXJldHVybiByZXNvdXJjZVNldC5nZXRGaXJzdE1ldGhvZExpYnJhcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHJvb3QgcGF0aCBvZiB0aGUgbWV0aG9kIGxpYnJhcnkgCi0JICogQHBhcmFtIGxpYiBNZXRob2RMaWJyYXJ5Ci0JICogQHJldHVybiBGaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldExpYnJhcnlSb290UGF0aChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlSZXNvdXJjZSByZXMgPSBsaWIuZVJlc291cmNlKCk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlVUkkgdXJpID0gcmVzLmdldFVSSSgpOwotCQlTdHJpbmcgcGF0aCA9IHVyaS50b0ZpbGVTdHJpbmcoKTsKLQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0JCXJldHVybiBmLmdldFBhcmVudEZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYWxsIHBhY2thZ2VzIGluIHRoZSBwbHVnaW4KLQkgKiBAcGFyYW0gcGx1Z2luIE1ldGhvZFBsdWdpbgotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxQYWNrYWdlcyhNZXRob2RQbHVnaW4gcGx1Z2luKSB7Ci0JCUxpc3QgYWxsUGtncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IHBrZ3MgPSBwbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJYWxsUGtncy5hZGRBbGwocGtncyk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdCA9IHBrZ3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJZ2V0QWxsQ2hpbGRQYWNrYWdlcygoTWV0aG9kUGFja2FnZSkgaXQubmV4dCgpLCBhbGxQa2dzKTsKLQkJfQotCi0JCXJldHVybiBhbGxQa2dzOwotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgY2hpbGQgcGFja2FnZXMgb2YgdGhlIGdpdmVuIE1ldGhvZFBhY2thZ2UgYW5kIGFkZCB0byB0aGUgbGlzdAotCSAqIEBwYXJhbSBwa2cgTWV0aG9kUGFja2FnZQotCSAqIEBwYXJhbSByZXN1bHQgTGlzdCB0aGUgcGFja2FnZXMgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsQ2hpbGRQYWNrYWdlcyhNZXRob2RQYWNrYWdlIHBrZywgTGlzdCByZXN1bHQpIHsKLQkJTGlzdCBwa2dzID0gcGtnLmdldENoaWxkUGFja2FnZXMoKTsKLQkJcmVzdWx0LmFkZEFsbChwa2dzKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlnZXRBbGxDaGlsZFBhY2thZ2VzKChNZXRob2RQYWNrYWdlKSBpdC5uZXh0KCksIHJlc3VsdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgYWxsIGNvbmZpZ3VyYXRpb25zIHJlZmVyZW5jZWQgYnkgdGhpcyBwbHVnaW4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogQHJldHVybiBMaXN0IG9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gZ2V0QXNzb2NpYXRlZENvbmZpZ3VyYXRpb25zKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJLy8gZ2V0IHRoZSBjb25maWdzIHRoYXQgcmVmZXJlbmNlcyB0aGlzIG1ldGhvZCBwbHVnaW4KLQkJTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBhbGxDb25maWdzID0gbmV3IEFycmF5TGlzdDxNZXRob2RDb25maWd1cmF0aW9uPigpOwotLyoJCUxpc3QgY29uZmlncyA9IChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBwbHVnaW4pCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKEFzc29jaWF0aW9uSGVscGVyLk1ldGhvZFBsdWdpbl9NZXRob2RDb25maWd1cmF0aW9ucyk7Ci0JCWFkZFVuaXF1ZUl0ZW1zKGNvbmZpZ3MsIGFsbENvbmZpZ3MpOwotCi0JCS8vIGdldCB0aGUgY29uZmlncyB0aGF0IHJlZmVyZW5jZXMgdGhlIHBhY2thZ2VzIGluIHRoaXMgcGx1Z2luCi0JCUxpc3QgcGtncyA9IGdldEFsbFBhY2thZ2VzKHBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwa2dzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG8gPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGl0Lm5leHQoKTsKLQotCQkJY29uZmlncyA9IChMaXN0KSBvCi0JCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBc3NvY2lhdGlvbkhlbHBlci5NZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zKTsKLQkJCWFkZFVuaXF1ZUl0ZW1zKGNvbmZpZ3MsIGFsbENvbmZpZ3MpOwotCQl9Ci0qLwotCQkvLyBnZXQgdGhlIGNvbmdpZ3VyYXRpb25zIHRoYXQgcmVmZXJlbmNlZCBieSB0aGUgcHJvY2Vzc2VzIGluIHRoaXMKLQkJLy8gcGx1Z2luCi0JCUxpc3QgcHJvY3MgPSBUbmdVdGlsLmdldEFsbFByb2Nlc3NlcyhwbHVnaW4pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvY3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHAgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBpdAotCQkJCQkubmV4dCgpOwotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjID0gcC5nZXREZWZhdWx0Q29udGV4dCgpOwotCQkJaWYgKChjICE9IG51bGwpICYmICFhbGxDb25maWdzLmNvbnRhaW5zKGMpKSB7Ci0JCQkJYWxsQ29uZmlncy5hZGQoYyk7Ci0JCQl9Ci0JCQlhZGRVbmlxdWVJdGVtcyhwLmdldFZhbGlkQ29udGV4dCgpLCBhbGxDb25maWdzKTsKLQkJfQotCi0JCXJldHVybiBhbGxDb25maWdzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVW5pcXVlSXRlbXMoTGlzdCBmcm9tLCBMaXN0IHRvKSB7Ci0JCWlmIChmcm9tID09IG51bGwgfHwgdG8gPT0gbnVsbCB8fCBmcm9tLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZnJvbS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCWlmICghdG8uY29udGFpbnMobykpIHsKLQkJCQl0by5hZGQobyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB2YWxpZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBieSBmb3JjaW5nIHRvIHNlbGVjdCB0aGUgZ2xvYmFsIHBhY2thZ2VzIG9mCi0JICogdGhlIHNlbGVjdGVkIG1ldGhvZCBwbHVnaW5zLCB0aGlzIGlzIG5lZWRlZCBmb3IgY29uZmlndXJhdGlvbiBleHBvcnRpbmcuCi0JICogSWYgZ2xvYmFsIHBhY2thZ2VzIGFyZSBtaXNzaW5nLCB0aGUgZXhwb3J0ZWQgY29uZmlndXJhdGlvbiBpcyBub3QgdmFsaWQKLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uTWdyIGlmIG5vdCBudWxsLCB3aWxsIHVzZSB0aGUgZ2l2ZW4gSUFjdGlvbk1hbmFnZXIgdG8gY2hhbmdlIHRoZSBjb25maWd1cmF0aW9uLCBvdGhlcndpc2UgY29uZmlndXJhdGlvbiB3aWxsIGJlIGNoYW5nZWQgZGlyZWN0bHkKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihJQWN0aW9uTWFuYWdlciBhY3Rpb25NZ3IsIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0vLwkJTGlzdCBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotLy8JCUxpc3QgcGtnU2VscyA9IGNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0vLwotLy8JCWZvciAoSXRlcmF0b3IgaXRwID0gcGx1Z2lucy5pdGVyYXRvcigpOyBpdHAuaGFzTmV4dCgpOykgewotLy8JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRwLm5leHQoKTsKLS8vCQkJTGlzdCBwa2dzID0gVG5nVXRpbC5nZXRBbGxTeXN0ZW1QYWNrYWdlcyhwbHVnaW4pOwotLy8JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcGtncy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0vLwkJCQlPYmplY3QgcGtnID0gaXQubmV4dCgpOwotLy8JCQkJaWYgKCFwa2dTZWxzLmNvbnRhaW5zKHBrZykpIHsKLS8vCQkJCQlwa2dTZWxzLmFkZChwa2cpOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJfQotCQkKLQkJLy8gbW92ZWQgdG8gVG5nVXRpbAotCQlUbmdVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihhY3Rpb25NZ3IsIGNvbmZpZyk7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gYnkgZm9yY2luZyB0byBzZWxlY3QgdGhlIGdsb2JhbCBwYWNrYWdlcyBvZgotCSAqIHRoZSBzZWxlY3RlZCBtZXRob2QgcGx1Z2lucywgdGhpcyBpcyBuZWVkZWQgZm9yIGNvbmZpZ3VyYXRpb24gZXhwb3J0aW5nLgotCSAqIElmIGdsb2JhbCBwYWNrYWdlcyBhcmUgbWlzc2luZywgdGhlIGV4cG9ydGVkIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkCi0JICogQHBhcmFtIHBsdWdpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIGNvbmZpZyk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgY29weXJpZ2h0IG9iamVjdCBmb3IgYW4gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN1cHBvcnRpbmdNYXRlcmlhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3VwcG9ydGluZ01hdGVyaWFsIGdldENvcHlyaWdodChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIHNtID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RVbml0KSB7Ci0JCQlzbSA9ICgoTWV0aG9kVW5pdCkgZWxlbWVudCkuZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJc20gPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudCkuZ2V0UHJlc2VudGF0aW9uKCkKLQkJCQkJLmdldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9Ci0KLQkJLy8gaWYgbm8gY29weXJpZ2h0IG9mIGl0J3Mgb3duLCBnZXQgdGhlIGNvcHlyaWdodCBmcm9tIHRoZSBwbHVnaW4KLQkJaWYgKHNtID09IG51bGwpIHsKLQkJCU1ldGhvZFBsdWdpbiBwID0gZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJaWYgKHAgIT0gbnVsbCkgewotCQkJCXNtID0gcC5nZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzbTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgdGhlIGdpdmVuIGNvbnRhaW5lciBhbmQgZWxlbWVudHMgbGlzdCwgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaW4gdGhlIGxpc3QgaXMgY29udGFpbmVkIGJ5IHRoZSBjb250YWluZXIgb3Igbm90LiAKLQkgKiByZXR1cm4gYWxsIHRoZSBjb250YWluZWQgZWxlbWVudHMgZm9yIGEgZ2l2ZW4gY29udGFpbmVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBPYmplY3QKLQkgKiBAcGFyYW0gZWxlbWVudHMgQ29sbGVjdGlvbgotCSAqIEByZXR1cm4gQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbiBnZXRDb250YWluZWRFbGVtZW50cyhPYmplY3QgY29udGFpbmVyLAotCQkJQ29sbGVjdGlvbiBlbGVtZW50cykgewotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIHsKLQkJCWNvbnRhaW5lciA9ICgoVHJhbnNpZW50R3JvdXBJdGVtUHJvdmlkZXIpIGNvbnRhaW5lcikuZ2V0VGFyZ2V0KCk7Ci0JCX0KLQkJQXJyYXlMaXN0IGNvbnRhaW5lZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWxlbWVudHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJCSYmIFVtYVV0aWwuaXNDb250YWluZWRCeSgoRU9iamVjdCkgZWxlbWVudCwgY29udGFpbmVyKSkgewotCQkJCWNvbnRhaW5lZC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZDsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiB0d28gbWV0aG9kIGVsZW1lbnQgYXJlIGlkZW50aWNhbCBvciBub3QuIFR3byBlbGVtZW50cyBhcmUKLQkgKiBpZGVudGljYWwgaWYgYW5kIG9ubHkgaWY6IGFsbCB0aGUgYXR0cmlidXRlIHZhbHVlcyBhcmUgZXF1YWwgYWxsIHRoZQotCSAqIHJlZmVyZW5jZWQgZWxlbWVudHMgYXJlIGVxdWFsIGFsbCB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGFyZSBpZGVudGljYWwKLQkgKiAKLQkgKiBAcGFyYW0gb2xkT2JqCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIG5ld09iagotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0lkZW50aWNhbChNZXRob2RFbGVtZW50IG9sZE9iaiwgTWV0aG9kRWxlbWVudCBuZXdPYmopIHsKLQotCQlpZiAoKG9sZE9iaiA9PSBudWxsKSAmJiAobmV3T2JqID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCWlmICgob2xkT2JqID09IG51bGwpIHx8IChuZXdPYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHRoaXMgZG9lcyBub3Qgd29yaywgdGhlIHRvU3RyaW5nIGNvbnRhaW5zIHRoZSBvYmplY3QgaW5zdGFuY2UgaW5mbwotCQkvLyByZXR1cm4gb2xkT2JqLnRvU3RyaW5nKCkuZXF1YWxzKG5ld09iai50b1N0cmluZygpKTsKLQotCQlMaXN0IGZlYXR1cmVzID0gZ2V0U3RydWN0dXJhbEZlYXR1cmVzKG9sZE9iaik7Ci0vLwkJTGlzdCBwcm9wZXJ0aWVzID0gb2xkT2JqLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJT2JqZWN0IG9sZFZhbHVlID0gb2xkT2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJT2JqZWN0IG5ld1ZhbHVlID0gbmV3T2JqLmVHZXQoZmVhdHVyZSk7Ci0JCQkJaWYgKG9sZFZhbHVlID09IG51bGwgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAob2xkVmFsdWUgPT0gbnVsbCB8fCBuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAob2xkVmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0KLQkJCQkJLy8gaWYgaXQnYyBjb250YWlubWVudCBmZWF0dXJlIHZhbHVlLCBpdGVyYXRlIGl0Ci0JCQkJCU1ldGhvZEVsZW1lbnQgb2xkZSA9IChNZXRob2RFbGVtZW50KSBvbGRWYWx1ZTsKLQkJCQkJaWYgKG9sZGUuZUNvbnRhaW5lcigpID09IG9sZE9iaikgewotCQkJCQkJaWYgKCFpc0lkZW50aWNhbChvbGRlLCAoTWV0aG9kRWxlbWVudCkgbmV3VmFsdWUpKSB7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG9sZFZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlMaXN0IG9sZGwgPSAoTGlzdCkgb2xkVmFsdWU7Ci0JCQkJCUxpc3QgbmV3bCA9IChMaXN0KSBuZXdWYWx1ZTsKLQkJCQkJaWYgKG9sZGwuc2l6ZSgpICE9IG5ld2wuc2l6ZSgpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlmb3IgKGludCB4ID0gMDsgeCA8IG9sZGwuc2l6ZSgpOyB4KyspIHsKLQkJCQkJCU9iamVjdCBvID0gb2xkbC5nZXQoeCk7Ci0JCQkJCQlPYmplY3QgbiA9IG5ld2wuZ2V0KHgpOwotCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCQkJLy8gaWYgaXQnYyBjb250YWlubWVudCBmZWF0dXJlIHZhbHVlLCBpdGVyYXRlIGl0Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBvbGRlID0gKE1ldGhvZEVsZW1lbnQpIG87Ci0JCQkJCQkJaWYgKG9sZGUuZUNvbnRhaW5lcigpID09IG9sZE9iaikgewotCQkJCQkJCQlpZiAoIWlzSWRlbnRpY2FsKG9sZGUsIChNZXRob2RFbGVtZW50KSBuKSkgewotCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfSBlbHNlIGlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAoIW8uZXF1YWxzKG4pKSB7Ci0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIW9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBhIHByb2Nlc3Mgb3Igbm90LiAKLQkgKiBBIFByb2Nlc3MgaXMgYSBDYXBhYmlsaXR5UGF0dGVybiBvciBEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0IAotCSAqIHRoYXQgaXMgY29udGFpbmVkIGJ5IGEgUHJvY2Vzc0NvbXBvbmVudC4KLQkgKiBAcGFyYW0gZSBFT2JqZWN0Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvY2VzcyhFT2JqZWN0IGUpIHsKLQkJcmV0dXJuIChlIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSAmJiAKLQkJCShlLmVDb250YWluZXIoKSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VmFsaWRWaWV3cyhNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkKLQkJTGlzdCB2aWV3cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yICggSXRlcmF0b3IgaXQgPSBjb25maWcuZ2V0UHJvY2Vzc1ZpZXdzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSlpdC5uZXh0KCk7Ci0JCQlpZiAoICFDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udHJpYnV0b3IodmlldykgKSB7Ci0JCQkJdmlldyA9IChDb250ZW50Q2F0ZWdvcnkpQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh2aWV3LCBjb25maWcpOwotCQkJCWlmICggdmlldyAhPSBudWxsICYmICF2aWV3cy5jb250YWlucyh2aWV3KSApIHsKLQkJCQkJdmlld3MuYWRkKHZpZXcpOwotCQkJCX0gCi0JCQl9CQotCQl9Ci0JCQkJCi0JCXJldHVybiB2aWV3czsKLQl9Ci0JCi0vLwlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U3VwZXJBY3Rpdml0aWVzKEJyZWFrZG93bkVsZW1lbnQgZWxlbWVudCkgewotLy8JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwotLy8JCS8vIGJ1aWxkIHRoZSBwYXJlbnQgbm9kZXMKLS8vCQlCcmVha2Rvd25FbGVtZW50IHBhcmVudCA9IGVsZW1lbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7IAotLy8JCXdoaWxlICggcGFyZW50ICE9IG51bGwgKSB7Ci0vLwkJCWl0ZW1zLmFkZCgwLCBwYXJlbnQpOwotLy8JCQlpZiAoTGlicmFyeVV0aWwuaXNQcm9jZXNzKHBhcmVudCkgKSB7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gaXRlbXM7Ci0vLwl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbGwgc3RydWN0dXJhbCBmZWF0dXJlcyBmb3IgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFN0cnVjdHVyYWxGZWF0dXJlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBwcm9wZXJ0aWVzID0gZWxlbWVudC5nZXRJbnN0YW5jZVByb3BlcnRpZXMoKTsKLQotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJCS8vIGdldCBhbGwgZmVhdHVyZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJCUVQcm9wZXJ0eSBwcm9wZXJ0eSA9IChFUHJvcGVydHkpIHByb3BlcnRpZXMuZ2V0KGkpOwotCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gcHJvcGVydHkKLQkJCQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCk7Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmVhdHVyZXM7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdDxFQ2xhc3M+IGdldEluY2x1ZGVkRWxlbWVudFR5cGVzKCkgewotCQlpZiAoaW5jbHVkZWRFbGVtZW50VHlwZXMgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChMaWJyYXJ5VXRpbC5jbGFzcykgewotCQkJCWlmIChpbmNsdWRlZEVsZW1lbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQkJCWluY2x1ZGVkRWxlbWVudFR5cGVzID0gbmV3IEFycmF5TGlzdDxFQ2xhc3M+KCk7Ci0JCQkJCWZvciAoRUNsYXNzaWZpZXIgY2xzIDogVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RUNsYXNzaWZpZXJzKCkpIHsKLQkJCQkJCWlmIChjbHMgaW5zdGFuY2VvZiBFQ2xhc3MKLQkJCQkJCQkJJiYgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkJCQkJCQkJCQkuaXNTdXBlclR5cGVPZigoRUNsYXNzKSBjbHMpKSB7Ci0JCQkJCQkJaW5jbHVkZWRFbGVtZW50VHlwZXMuYWRkKChFQ2xhc3MpIGNscyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaW5jbHVkZWRFbGVtZW50VHlwZXMucmVtb3ZlQWxsKGV4Y2x1ZGVkVHlwZXMpOwotCQkJCQlDb2xsZWN0aW9ucy5zb3J0KGluY2x1ZGVkRWxlbWVudFR5cGVzLCB0eXBlQ29tcGFyYXRvcik7Ci0JCQkJCWluY2x1ZGVkRWxlbWVudFR5cGVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChpbmNsdWRlZEVsZW1lbnRUeXBlcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmNsdWRlZEVsZW1lbnRUeXBlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4gZ2V0SW5jbHVkZWRFbGVtZW50cyhDdXN0b21DYXRlZ29yeSBjYXRlZ29yeSwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGluY2x1ZGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4oKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5jbHVkZWRFbGVtZW50czsKLQkJfQotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgcHJvcCA9IE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eShjYXRlZ29yeSwgTWV0aG9kRWxlbWVudFByb3BlcnR5SGVscGVyLkNVU1RPTV9DQVRFR09SWV9fSU5DTFVERURfRUxFTUVOVFMpOwotCQlFQ2xhc3NpZmllciBjbHMgPSBwcm9wID09IG51bGwgPyBudWxsIDogVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUNsYXNzaWZpZXIocHJvcC5nZXRWYWx1ZSgpKTsKLQkJaWYoY2xzIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQlFQ2xhc3MgZUNsYXNzID0gKEVDbGFzcykgY2xzOwotCQkJaWYgKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudCgpLmlzU3VwZXJUeXBlT2YoZUNsYXNzKSkgewotCQkJCU1ldGhvZExpYnJhcnkgbGliID0gKE1ldGhvZExpYnJhcnkpIGNvbmZpZwotCQkJCQkJLmVDb250YWluZXIoKTsKLQkJCQlJdGVyYXRvcjxFT2JqZWN0PiBpdGVyID0gbGliLmVBbGxDb250ZW50cygpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlFT2JqZWN0IGVPYmplY3QgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKGVDbGFzcy5pc0luc3RhbmNlKGVPYmplY3QpKSB7Ci0JCQkJCQlpbmNsdWRlZEVsZW1lbnRzLmFkZCgoRGVzY3JpYmFibGVFbGVtZW50KSBlT2JqZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5jbHVkZWRFbGVtZW50czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvTG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE2ZjY5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Mb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExvZyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBJTlNUQU5DRSA9IExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0TG9nZ2VyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL01pZ3JhdGlvblV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL01pZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJmMDkzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9NaWdyYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Qcm9jZXNzQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIHRoZSBNaWdyYXRpb24gU2VydmljZS4KLSAqCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25VdGlsIHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4gYW5kIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4KLQkgKiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0UHJvY2Vzc2VzKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgZGVsaXZlcnlQcm9jZXNzUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIHRoZSBjdXJyZW50IE1ldGhvZCBMaWJyYXJ5LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRDYXBhYmlsaXR5UGF0dGVybnMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgY2FwYWJpbGl0eVBhdHRlcm5QYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGg7Ci0JCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHMpOwotCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldENhcGFiaWxpdHlQYXR0ZXJucygoUHJvY2Vzc1BhY2thZ2UpbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+IGluIHRoZSBjdXJyZW50IE1ldGhvZCBMaWJyYXJ5LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXREZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBkZWxpdmVyeVByb2Nlc3NQYXRoc1tdID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2UpbWV0aG9kUGFja2FnZSwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIHRoZSBjb250ZXh0cyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzLgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRDb250ZXh0cyhQcm9jZXNzIHByb2Nlc3MpIHsKLQkJaWYgKHByb2Nlc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlpZiAoZGVmYXVsdENvbnRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnB1dChkZWZhdWx0Q29udGV4dC5nZXROYW1lKCksIGRlZmF1bHRDb250ZXh0KTsKLQkJfQotCi0JCUxpc3QgY29udGV4dHMgPSBwcm9jZXNzLmdldFZhbGlkQ29udGV4dCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZXh0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbnRleHQgPSAoTWV0aG9kQ29uZmlndXJhdGlvbilpLm5leHQoKTsKLQkJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQucHV0KGNvbnRleHQuZ2V0TmFtZSgpLCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbWFwIG9mIGFsbCA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXRDYXBhYmlsaXR5UGF0dGVybnMoUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UsIE1hcCByZXN1bHQpIHsKLQkJTGlzdCBjaGlsZFBhY2thZ2VzID0gcHJvY2Vzc1BhY2thZ2UuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBjaGlsZFBhY2thZ2VzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpb2JqOwotCQkJCVByb2Nlc3MgcHJvY2VzcyAgPSBwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCQlpZiAocHJvY2VzcyBpbnN0YW5jZW9mIENhcGFiaWxpdHlQYXR0ZXJuKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW9iaiwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiBhIGdpdmVuIDxjb2RlPlByb2Nlc3NQYWNrYWdlPC9jb2RlPi4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldERlbGl2ZXJ5UHJvY2Vzc2VzKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBEZWxpdmVyeVByb2Nlc3MpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzLmdldE5hbWUoKTsKLQkJCQkJcmVzdWx0LnB1dChuYW1lLCBwcm9jZXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0QWN0aXZpdGllcyhQcm9jZXNzIHByb2Nlc3MpewotCQlyZXR1cm4gZ2V0QWN0aXZpdGllcyhwcm9jZXNzLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzLCBib29sZWFuIGxpbmtlZEhhc2hNYXApewotCQlNYXAgcmVzdWx0ID0gbGlua2VkSGFzaE1hcCA/IG5ldyBMaW5rZWRIYXNoTWFwKCkgOiBuZXcgVHJlZU1hcCgpOwotCQlNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpOwotCQlQcm9jZXNzQ29uZmlndXJhdG9yIGZpbHRlciA9IG5ldyBQcm9jZXNzQ29uZmlndXJhdG9yKGRlZmF1bHRDb250ZXh0KTsKLQkJZ2V0QWN0aXZpdGllcyhwcm9jZXNzLCByZXN1bHQsIGZpbHRlcik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIE1ldGhvZCByZXR1cm5zIExpc3Qgb2YgYWN0aXZpdGllcyAocmVjdXJzaXZlbHkpIGZvciBwYXJ0aWN1bGFyIGNvbmZpZ3VyYXRpb24gCi0JICogdW5kZXIgYSBQcm9jZXNzICg8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+IG9yIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPikuICAKLQkgKiAgQHBhcmFtIEFjdGl2aXR5Ci0JICogIEBwYXJhbSBNYXAKLQkgKiAgQHBhcmFtIFByb2Nlc3NDb25maWd1cmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0QWN0aXZpdGllcyhBY3Rpdml0eSBwcm9jZXNzLCBNYXAgcmVzdWx0LCBQcm9jZXNzQ29uZmlndXJhdG9yIGZpbHRlcil7Ci0JCXJlc3VsdC5wdXQocHJvY2Vzcy5nZXROYW1lKCksIHByb2Nlc3MpOwotCQlMaXN0IGxpc3QgPSBwcm9jZXNzLmdldEJyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCWlmKGxpc3Quc2l6ZSgpID4gMCl7Ci0JCQlmb3IoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspewotCQkJCU9iamVjdCBvYmplY3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYob2JqZWN0IGluc3RhbmNlb2YgQWN0aXZpdHkpewotCQkJCQlpZihmaWx0ZXIgIT0gbnVsbCAmJiBmaWx0ZXIuYWNjZXB0KG9iamVjdCkpewotCQkJCQkJcmVzdWx0LnB1dCgoKEFjdGl2aXR5KW9iamVjdCkuZ2V0TmFtZSgpLCBvYmplY3QpOwotCQkJCQl9Ci0JCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJCWdldEFjdGl2aXRpZXMoKEFjdGl2aXR5KW9iamVjdCwgcmVzdWx0LCBmaWx0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9Nb2RlbFN0b3JhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL01vZGVsU3RvcmFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmFmODdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL01vZGVsU3RvcmFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Nb2RlbFN0cnVjdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5JTGlicmFyeVJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTW9kZWxTdG9yYWdlIHsKLQkKLQkvKioKLQkgKiByZXR1cm4gdGhlIE1ldGhvZFBsdWdpbnMgaW4gdGhlIGN1cnJlbnQgTWV0aG9kTGlicmFyeQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldEJhc2VNb2RlbHMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGliICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KGxpYi5nZXRNZXRob2RQbHVnaW5zKCkpOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlIGEgbmV3IE1ldGhvZExpYnJhcnkgYW5kIHJldHVybiB0aGUgYXNzb2NpYXRlZCBSZXNvdXJjZQotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVNldCBNdWx0aUZpbGVSZXNvdXJjZVNldEltcGwKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcGFyYW0gZGlyIFN0cmluZwotCSAqIEBwYXJhbSBiTXVsdGlwbGUgYm9vbGVhbgotCSAqIEByZXR1cm4gUmVzb3VyY2UKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgbmV3TGlicmFyeShJTGlicmFyeVJlc291cmNlU2V0IHJlc291cmNlU2V0LAotCQkJU3RyaW5nIG5hbWUsIFN0cmluZyBkaXIsIGJvb2xlYW4gYk11bHRpcGxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxpYl9maWxlbmFtZSA9IG51bGw7Ci0JCS8vIE1hcCBvcHRpb25zID0gbmV3Ci0JCS8vIEhhc2hNYXAoTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsLkRFRkFVTFRfU0FWRV9PUFRJT05TKTsKLQkJaWYgKGJNdWx0aXBsZSkgewotCQkJbGliX2ZpbGVuYW1lID0gTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FOwotCQkJLy8gb3B0aW9ucy5wdXQoTXVsdGlGaWxlWE1JU2F2ZUltcGwuTVVMVElfRklMRSwgQm9vbGVhbi5UUlVFKTsKLQkJfSBlbHNlIHsKLQkJCWxpYl9maWxlbmFtZSA9IG5hbWU7Ci0JCX0KLQkJcmVzb3VyY2VTZXQudW5sb2FkKCk7Ci0JCVJlc291cmNlIHJlcyA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVGaWxlVVJJKGRpcgotCQkJCSsgRmlsZS5zZXBhcmF0b3IgKyBsaWJfZmlsZW5hbWUpKTsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0JCWxpYi5zZXROYW1lKG5hbWUpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQobGliKTsKLQkJcmVzb3VyY2VTZXQuc2F2ZShudWxsKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JLyoqCi0JICogaW5pdGlhbGl6ZSBhIG5ldyBtZXRob2QgcGx1Z2luCi0JICogQHBhcmFtIGVtcHR5TW9kZWwgTWV0aG9kUGx1Z2luCi0JICogQHJldHVybiBNZXRob2RQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBpbml0aWFsaXplKE1ldGhvZFBsdWdpbiBlbXB0eU1vZGVsKSB7Ci0JCWVtcHR5TW9kZWwuc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbi5UUlVFKTsKLQotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwgTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9ET01BSU5fUEFUSCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsIE1vZGVsU3RydWN0dXJlLkRFRkFVTFQucm9sZVNldFBhdGgpOwotCQljcmVhdGVDb250ZW50UGFja2FnZXMoZW1wdHlNb2RlbCwKLQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCWNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLCBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULnRvb2xQYXRoKTsKLQkJY3JlYXRlQ29udGVudFBhY2thZ2VzKGVtcHR5TW9kZWwsCi0JCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5zdGFuZGFyZENhdGVnb3J5UGF0aCk7Ci0KLQkJQ29udGVudFBhY2thZ2UgY29udGVudFBrZyA9IGNyZWF0ZUNvbnRlbnRQYWNrYWdlcyhlbXB0eU1vZGVsLAotCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY3VzdG9tQ2F0ZWdvcnlQYXRoKTsKLQkJVG5nVXRpbC5jcmVhdGVSb290Q3VzdG9tQ2F0ZWdvcnkoY29udGVudFBrZyk7Ci0KLQkJLy8gY3JlYXRlIERlbGl2ZXJ5UHJvY2Vzc2VzIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQlwa2cuc2V0TmFtZShNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGhbMF0pOwotCQllbXB0eU1vZGVsLmdldE1ldGhvZFBhY2thZ2VzKCkuYWRkKHBrZyk7Ci0KLQkJLy8gY3JlYXRlIFByb2Nlc3NDb250cmlidXRpb25zIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlNb2RlbFN0cnVjdHVyZS5jcmVhdGVQcm9jZXNzQ29udHJpYnV0aW9uUGFja2FnZShlbXB0eU1vZGVsKTsKLQotCQkvLyBjcmVhdGUgQ2FwYWJpbGl0eVBhdHRlcm5zIHByb2Nlc3MgcGFja2FnZQotCQkvLwotCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQlpbnQgbGVuID0gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgubGVuZ3RoIC0gMTsKLQkJcGtnLnNldE5hbWUoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGhbbGVuXSk7Ci0JCVN0cmluZ1tdIHBhdGggPSBuZXcgU3RyaW5nW2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5jYXBhYmlsaXR5UGF0dGVyblBhdGgsIDAsIHBhdGgsCi0JCQkJMCwgbGVuKTsKLQkJQ29udGVudFBhY2thZ2UgY29udFBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKGVtcHR5TW9kZWwsIHBhdGgpOwotCQljb250UGtnLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTsKLQotCQkvLyAvLyBjcmVhdGUgaW5oZXJpdGVkIGRvbWFpbnMKLQkJLy8gLy8KLQkJLy8gTGlzdCBhbGxCYXNlID0gTWlzYy5nZXRBbGxCYXNlKGVtcHR5TW9kZWwpOwotCQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIk1vZGVsU3RvcmFnZS5pbml0aWFsaXplKCk6IGFsbEJhc2U9IithbGxCYXNlKTsKLQkJLy8gZm9yKEl0ZXJhdG9yIGl0ZXIgPSBhbGxCYXNlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkvLyBNZXRob2RQbHVnaW4gYmFzZVBsdWdpbiA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkvLyBDb250ZW50UGFja2FnZSBiYXNlRG9tYWluUGtnID0gVW1hVXRpbC5maW5kQ29udGVudFBhY2thZ2UoYmFzZVBsdWdpbiwKLQkJLy8gTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVF9ET01BSU5fUEFUSCk7Ci0JCS8vIEluaGVyaXRlZENhdGVnb3J5UGFja2FnZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3Ci0JCS8vIEluaGVyaXRlZERvbWFpblBhY2thZ2VMaXN0ZW5lcihkb21haW5Qa2cpOwotCQkvLyBiYXNlRG9tYWluUGtnLmVBZGFwdGVycygpLmFkZChsaXN0ZW5lcik7Ci0JCS8vIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPQotCQkvLyBiYXNlRG9tYWluUGtnLmdldENvbnRlbnRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJLy8gT2JqZWN0IGVsZW1lbnQgPSAoT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCS8vIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBEb21haW4pIHsKLQkJLy8gQ29udGVudENhdGVnb3J5IGNhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgZWxlbWVudDsKLQkJLy8gaWYoY2F0ZWdvcnkuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpID09IG51bGwpIHsKLQkJLy8gLy8gdGhpcyBjYXRlZ29yeSBpcyBub3QgYSBpbmhlcml0ZWQgb25lLCBjYW4gYmUgYWRkZWQuCi0JCS8vIC8vCi0JCS8vIGRvbWFpblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5hZGQobGlzdGVuZXIuY3JlYXRlSW5oZXJpdGVkKChDb250ZW50Q2F0ZWdvcnkpCi0JCS8vIGVsZW1lbnQpKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCi0JCS8vIFRPRE86IHRlc3Qgb24tZmx5IGNyZWF0aW9uIG9mIGNhdGVnb3J5IGNvbnRyaWJ1dG9yCi0JCS8vIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBpdGVtUHJvdmlkZXIgPSAoTWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyKQotCQkvLyBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKS5hZGFwdChlbXB0eU1vZGVsLAotCQkvLyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkvLyBpdGVtUHJvdmlkZXIuYWRkSW5oZXJpdGVkQ2F0ZWdvcmllcygpOwotCi0JCXJldHVybiBlbXB0eU1vZGVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIGVtcHR5TW9kZWwKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZXMoTWV0aG9kUGx1Z2luIG1vZGVsLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlMaXN0IGxpc3QgPSBtb2RlbC5nZXRNZXRob2RQYWNrYWdlcygpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShsaXN0LCBwYXRoWzBdKTsKLQkJaWYgKHBrZyA9PSBudWxsKSB7Ci0JCQlwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUocGF0aFswXSk7Ci0JCQlsaXN0LmFkZChwa2cpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewotCQkJbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCQlwa2cgPSBVbWFVdGlsLmZpbmRDb250ZW50UGFja2FnZShsaXN0LCBwYXRoW2ldKTsKLQkJCWlmIChwa2cgPT0gbnVsbCkgewotCQkJCXBrZyA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCQkJcGtnLnNldE5hbWUocGF0aFtpXSk7Ci0JCQkJbGlzdC5hZGQocGtnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGtnOwotCX0KLQotCS8qKgotCSAqIGxvYWQgdGhlIGNvbnRhaW5tZW50IHByb3hpZXMgZm9yIHRoZSBvYmplY3QKLQkgKiBAcGFyYW0gb2JqIEVPYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9hZENvbnRhaW5tZW50UHJveGllcyhFT2JqZWN0IG9iaikgewotCQkvLyBmb3IoVHJlZUl0ZXJhdG9yIGl0ZXIgPSBvYmouZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQlMaXN0IGxpc3QgPSBvYmouZUNvbnRlbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJSW50ZXJuYWxFT2JqZWN0IG8gPSAoSW50ZXJuYWxFT2JqZWN0KSBsaXN0LmdldChpKTsKLQkJCS8vIEludGVybmFsRU9iamVjdCBvID0gKEludGVybmFsRU9iamVjdClpdGVyLm5leHQoKTsKLQkJCWlmIChvLmVQcm94eVVSSSgpICE9IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3h5IFVSSSA9ICIgKyBvLmVQcm94eVVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gby5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpOwotCQkJCVJlc291cmNlIHJlcyA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKG8uZVByb3h5VVJJKCksIHRydWUpOwotCQkJCUludGVybmFsRU9iamVjdCByZXNvbHZlZE9iaiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb2x2ZWRPYmogPSAoSW50ZXJuYWxFT2JqZWN0KSByZXMuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNvbHZlZE9iaiA9ICIgKyByZXNvbHZlZE9iaik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVzb2x2ZWRPYmogIT0gbnVsbCkgewotCQkJCQlFY29yZVV0aWwucmVwbGFjZShvLCByZXNvbHZlZE9iaik7Ci0JCQkJCSgoQmFzaWNFTGlzdCkgcmVzLmdldENvbnRlbnRzKCkpLnNldERhdGEoMSwKLQkJCQkJCQluZXcgT2JqZWN0W10geyByZXNvbHZlZE9iaiB9KTsgICAgICAgICAKLQkJCQkJbyA9IHJlc29sdmVkT2JqOwotCQkJCX0KLQkJCX0KLQkJCWxvYWRDb250YWlubWVudFByb3hpZXMobyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBsb2FkIGFsbCBwcm94aWVzIGZvciB0aGUgb2JqZWN0Ci0JICogQHBhcmFtIG9iaiBFT2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvYWRBbGxQcm94aWVzKEVPYmplY3Qgb2JqKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IG9iai5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZWxlbWVudC5lQ3Jvc3NSZWZlcmVuY2VzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBsb2FkQ29udGFpbm1lbnRQcm94aWVzKG9iaik7Ci0JCS8vIGxvYWRDcm9zc1JlZmVyZW5jZVByb3hpZXMob2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBsb2FkIGFsbCBjcm9zcyByZWZlcmVuY2UgcHJveGllcyBmb3IgdGhlIG9iamVjdAotCSAqIEBwYXJhbSBvYmogRU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQ3Jvc3NSZWZlcmVuY2VQcm94aWVzKEVPYmplY3Qgb2JqKSB7Ci0JCUxpc3QgbGlzdCA9IG9iai5lQ3Jvc3NSZWZlcmVuY2VzKCk7Ci0JCWludCBzaXplID0gbGlzdC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlFT2JqZWN0IG8gPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQlsb2FkQ3Jvc3NSZWZlcmVuY2VQcm94aWVzKG8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZmluZCBhIE1ldGhvZEVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gZWxlbWVudCBuYW1lIGluIHRoZSBlbGVtZW50IGxpc3QKLQkgKiBAcGFyYW0gbWV0aG9kRWxlbWVudHMgVGhlIGVsZW1lbnQgbGlzdAotCSAqIEBwYXJhbSBuYW1lIFN0cmluZwotCSAqIEByZXR1cm4gTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kRWxlbWVudCBmaW5kTWV0aG9kRWxlbWVudChMaXN0IG1ldGhvZEVsZW1lbnRzLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJaW50IHNpemUgPSBtZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbWV0aG9kRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgb2YgaW5kZXggaW50IGhlIGxpc3QgbG9jYXRpb24gZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogQHBhcmFtIG1ldGhvZEVsZW1lbnRzIExpc3QKLQkgKiBAcGFyYW0gbmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoTGlzdCBtZXRob2RFbGVtZW50cywgU3RyaW5nIG5hbWUpIHsKLQkJaW50IHNpemUgPSBtZXRob2RFbGVtZW50cy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgbWV0aG9kRWxlbWVudHMuZ2V0KGkpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gaTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9QbHVnaW5SZWZlcmVuY2VDaGVja2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9QbHVnaW5SZWZlcmVuY2VDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MDc1ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUGx1Z2luUmVmZXJlbmNlQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIHV0aWxpdHkgY2xhc3MgdG8gY2hlY2sgcGx1Z2luIHJlZmVyZW5jZXMKLSAqIEBhdXRob3IgPz8/Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5SZWZlcmVuY2VDaGVja2VyIHsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotLy8JcHVibGljIHN0YXRpYyBMaXN0IGNoZWNrQ2lyY3VsYXJEZXBlbmRlbnRQbHVnaW5zSW5MaWJyYXJ5KCkgewotLy8JCUxpc3QgY2RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotLy8KLS8vCQlMaXN0IGFsbFBsdWdpbkxpc3QgPSBNb2RlbFN0b3JhZ2UuZ2V0QmFzZU1vZGVscygpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFsbFBsdWdpbkxpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0vLwkJCU1ldGhvZFBsdWdpbiBlbGVtZW50ID0gKE1ldGhvZFBsdWdpbikgaXRlci5uZXh0KCk7Ci0vLwkJCWlmIChoYXNDaXJjdWxhckNvbmZsaWN0V2l0aFBsdWdpbihlbGVtZW50KSkKLS8vCQkJCWNkTGlzdC5hZGQoZWxlbWVudCk7Ci0vLwkJfQotLy8JCXJldHVybiBjZExpc3Q7Ci0vLwl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gYVBsdWdpbgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNDaXJjdWxhckNvbmZsaWN0V2l0aFBsdWdpbihNZXRob2RQbHVnaW4gYVBsdWdpbikgewkJCi0vLwkJYm9vbGVhbiBhbnN3ZXIgPSBmYWxzZTsKLS8vCi0vLwkJTGlzdCBhbGxvd2FibGVCYXNlTGlzdCA9IGdldEFwcGxpY2FibGVCYXNlUGx1Z2lucyhhUGx1Z2luKTsKLS8vCQlMaXN0IGV4dGVuZGVkQmFzZUxpc3QgPSBhUGx1Z2luLmdldEJhc2VzKCk7Ci0vLwotLy8JCWlmICghYWxsb3dhYmxlQmFzZUxpc3QuY29udGFpbnNBbGwoZXh0ZW5kZWRCYXNlTGlzdCkpIHsKLS8vCQkJU3lzdGVtLm91dAotLy8JCQkJCS5wcmludGxuKCIkJCQ6IGNpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgZm9yICIgKyBhUGx1Z2luLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJcHJpbnRQbHVnaW5MaXN0KCJhbGxvd2FibGUgcGx1Z2luIGxpc3QiLCBhbGxvd2FibGVCYXNlTGlzdCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJcHJpbnRQbHVnaW5MaXN0KCJjdXJyZW50IGJhc2UgbGlzdCIsIGV4dGVuZGVkQmFzZUxpc3QpOyAvLyROT04tTkxTLTEkCi0vLwkJCWFuc3dlciA9IHRydWU7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gYW5zd2VyOwotCQkKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYVBsdWdpbi5nZXRCYXNlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGJhc2UgPSAoT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmKCFEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShhUGx1Z2luLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCBiYXNlKS5pc09LKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGFQbHVnaW4KLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRBcHBsaWNhYmxlQmFzZVBsdWdpbnMoTWV0aG9kUGx1Z2luIGFQbHVnaW4pIHsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IG1vZGVscyA9IE1vZGVsU3RvcmFnZS5nZXRCYXNlTW9kZWxzKCk7Ci0KLQkJTGlzdDxNZXRob2RQbHVnaW4+IGRlc2NlbmRhbnRMaXN0ID0gZ2V0RGVzY2VuZGFudHMoYVBsdWdpbik7Ci0JCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdGVyID0gZGVzY2VuZGFudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IChNZXRob2RQbHVnaW4pIGl0ZXIubmV4dCgpOwotCQkJaWYgKGFQbHVnaW4uZ2V0QmFzZXMoKS5jb250YWlucyhlbGVtZW50KSkgewkJLy9wYXJ0IG9mIDE3MDM2NzogYWxsb3cgaXQgdG8gc2hvdyBmb3IgdW5zZWxlY3QKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW1vZGVscy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWxzOwotCX0KLQotCS8vIHRob3NlIHR3byBnZXREZXNjZW5kYW50cygpIG1ldGhvZHMgc2hvdWxkIGJlIG1vdmVkIGludG8gbG93ZXIgbGF5ZXIKLQlwcml2YXRlIHN0YXRpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0RGVzY2VuZGFudHMoTWV0aG9kUGx1Z2luIG1ldGhvZE9iamVjdCkgewotCQlMaXN0PE1ldGhvZFBsdWdpbj4gZGVzY2VuZGFudExpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQotCQlMaXN0PE1ldGhvZFBsdWdpbj4gb2JqTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kUGx1Z2luPigpOwotCQlvYmpMaXN0LmFkZChtZXRob2RPYmplY3QpOwotCi0JCWdldERlc2NlbmRhbnRzKGRlc2NlbmRhbnRMaXN0LCBvYmpMaXN0KTsKLQotCQlyZXR1cm4gZGVzY2VuZGFudExpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldERlc2NlbmRhbnRzKExpc3Q8TWV0aG9kUGx1Z2luPiBhbGxEZXNjZW5kYW50TGlzdCwKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RPYmplY3RMaXN0KSB7Ci0JCWlmIChtZXRob2RPYmplY3RMaXN0LmlzRW1wdHkoKSkKLQkJCXJldHVybiBhbGxEZXNjZW5kYW50TGlzdDsKLQotCQlMaXN0PE1ldGhvZFBsdWdpbj4gY29tYkRlc2NlbmRhbnRMaXN0ID0gbmV3IEFycmF5TGlzdDxNZXRob2RQbHVnaW4+KCk7Ci0KLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ZXIgPSBtZXRob2RPYmplY3RMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWV0aG9kUGx1Z2luIGVsZW1lbnQgPSAoTWV0aG9kUGx1Z2luKSBpdGVyLm5leHQoKTsKLQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBkZXNjZW5kYW50TGlzdCA9IEFzc29jaWF0aW9uSGVscGVyCi0JCQkJCS5nZXRQbHVnaW5EaXJlY3RFeHRlbnNpb25zKGVsZW1lbnQpOwotCQkJY29tYkRlc2NlbmRhbnRMaXN0LmFkZEFsbChkZXNjZW5kYW50TGlzdCk7Ci0KLQkJfQotCi0JCWFsbERlc2NlbmRhbnRMaXN0LmFkZEFsbChtZXRob2RPYmplY3RMaXN0KTsKLQkJTGlzdDxNZXRob2RQbHVnaW4+IG5leHRDaGVja0xpc3QgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBsdWdpbj4oKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGl0ZXIgPSBjb21iRGVzY2VuZGFudExpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKCFhbGxEZXNjZW5kYW50TGlzdC5jb250YWlucyhlbGVtZW50KSkKLQkJCQluZXh0Q2hlY2tMaXN0LmFkZChlbGVtZW50KTsKLQkJfQotCi0JCXJldHVybiBnZXREZXNjZW5kYW50cyhhbGxEZXNjZW5kYW50TGlzdCwgbmV4dENoZWNrTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGRlc2MKLQkgKiBAcGFyYW0gcGx1Z2luTGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFBsdWdpbkxpc3QoU3RyaW5nIGRlc2MsIExpc3QgcGx1Z2luTGlzdCkgewotCQlTeXN0ZW0ub3V0LnByaW50KCIkJCQgIiArIGRlc2MgKyAiOiBbIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGx1Z2luTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaXRlcmF0b3IubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludChwbHVnaW4uZ2V0TmFtZSgpICsgIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIl0iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUmVzb3VyY2VIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1Jlc291cmNlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWIxZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUmVzb3VyY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5JMThuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLk5ldFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LklMaWJyYXJ5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeVJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Ccm93c2luZ0xheW91dFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5EZWZhdWx0Q29udGVudFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSUNvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxheW91dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGlua0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLkFjdGl2aXR5TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NZXRob2RMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUhlbHBlciB7Ci0KLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkFDRV9SRVBMQUNFTUVOVCA9ICJfQlJfIjsgLy8kTk9OLU5MUy0xJAotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5CUkFDRV9TVFJJTkcgPSAiXFx7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0JPT0tNQVJLX0lORElDQVRPUiA9ICIjIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1BBUkFNRVRFUl9JTkRJQ0FUT1IgPSAiPyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVJBTUVURVJfUFJPQ0VTUyA9ICJwcm9jIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1NUUl9KQVZBU0NSSVBUID0gImphdmFzY3JpcHQ6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1NUUl9NQUlMVE8gPSAibWFpbHRvOiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QQVJBTUVURVJfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfS0VZID0gImtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfR1VJRCA9ICJndWlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfSFJFRiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FUVFJfVkFMVUVfSU5ERVggPSAiaW5kZXgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVF9IVE1MID0gIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9FWFRfSFRNID0gIi5odG0iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0VYVF9KUEVHID0gIi5qcGVnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlTU0lOR19QQUdFU19GT0xERVIgPSAicGFnZXNfbm90X2luc3RhbGxlZC8iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmsgPSAiZWxlbWVudExpbmsiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZSA9ICJlbGVtZW50TGlua1dpdGhUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rV2l0aFVzZXJUZXh0ID0gImVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRk9MREVSID0gTWV0aG9kTGlicmFyeVBlcnNpc3Rlci5SRVNPVVJDRV9GT0xERVI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9odG1sX2ZpbGVfbmFtZSA9IFBhdHRlcm4KLQkJCS5jb21waWxlKCIoLiopLCguKilcXC5odG1sIik7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHRoaXMgb25lIGRvZXMgbm90IHdvcmsgd2hlbiBjb250YWluaW5nIG5vbi1lbmdsaXNoIGNoYXJhY3RlcnMsIHVzZSB0aGUKLQkvLyBtb3JlIGdlbmVyYWwgb25lCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWYgPQotCS8vIFBhdHRlcm4uY29tcGlsZSgiPGFcXHMrPyhbXj5dKik+KC4qPyk8L2E+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwKLQkvLyBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3JlZiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiPGFcXHMrPyguKj8pPiguKj8pPC9hPiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfdGVtcGxhdGVfYXR0YWNobWVudF91cmwgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIjxhXFxzKz9ocmVmXFxzKj89XFxzKj9cIiguKj8pXCJcXHMqPz4oLio/KTwvYT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfYXJlYV9yZWYgPSBQYXR0ZXJuCi0vLwkJCS5jb21waWxlKAotLy8JCQkJCSI8YXJlYS4qPyhocmVmXFxzKj1cXHMqXCIoLio/KVwiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2FyZWFfcmVmID0gUGF0dGVybgotCS5jb21waWxlKAotCQkJIjxhcmVhXFxzKz8oLio/KS8/PiIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19yZWZfZ2VuID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSI8KGF8YXJlYSlcXHMrPyhbXj5dKik+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9saW5rX3R5cGVfcGlja2VyID0gUGF0dGVybgotCQkJLmNvbXBpbGUoCi0JCQkJCSJcXHMqY2xhc3NcXHMqPz1cXHMqPyguKj8pXFxzKyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19ndWlkX3BpY2tlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiXFxzKmd1aWRcXHMqPz1cXHMqPyguKj8pXFxzKyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfbGlua19ocmVmX3BpY2tlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiXFxzKmhyZWZcXHMqPz1cXHMqP1wiKC4qPylcIlxccysiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX3RhZ19yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIjwoW14+IV0qKShcXG58XFxyKShbXj5dKik+IiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF9pbWFnZV9yZWYgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIig8KGltZ3xpZnJhbWUpLio/c3JjXFxzKj1cXHMqXCIpKC4qPykoXCIpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBhdHRlcm4gcF91cmxfZGVjb2RlciA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKDxbXj5dKj8oc3JjfGhyZWYpXFxzKj1cXHMqXCIpKC4qPykoXCJbXj5dKj8+KSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfdGFnX2F0dHJpYnV0ZXMgPSBQYXR0ZXJuCi0JLmNvbXBpbGUoCi0JCQkiKFtcXFMmJltePV1dKylcXHMqPVxccyooW1xcUyYmW15cIl1dK3xcIihbXFxTICYmW15cIl1dKylcIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2Nzc19yZWYgPSBQYXR0ZXJuLmNvbXBpbGUoCi0JCQkiIHVybFxcKCguKj8pXFwpIiwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkvLyBkZWZpbmUgY29uc3RhbnRzIGZvciBkaWFncmFtIHR5cGUuCi0JLy8gVGhpcyB3aWxsIGJlIHVzZWQgd2hlbiBsaW5raW5nIGRpYWdyYW1zIGludG8gcHVibGlzaGVkIGNvbnRlbnRzCi0JLy8gQWN0aXZpdHkgZGlhZ3JhbQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fVFlQRV9XT1JLRkxPVyA9ICJBY3Rpdml0eSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9UWVBFX0FDVElWSVRZX0RFVEFJTCA9ICJBY3Rpdml0eURldGFpbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFdQRGVwZW5kZW5jeSBkaWFncmFtCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9UWVBFX1dQX0RFUEVOREVOQ1kgPSAiV1BEZXBlbmRlbmN5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgZGVmYXVsdFJlc291cmNlTWdyOwotCQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3dTa2luUmVzb3VyY2UgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMQVlPVVRfWFNMX1JPT1RfUEFUSCA9IG51bGw7Ci0JCi0JcHVibGljIFJlc291cmNlSGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0RGVmYXVsdFJlc291cmNlTWdyKElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIG1ncikgewotCQlkZWZhdWx0UmVzb3VyY2VNZ3IgPSBtZ3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIElMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIGdldERlZmF1bHRSZXNvdXJjZU1ncigpIHsKLQkJcmV0dXJuIGRlZmF1bHRSZXNvdXJjZU1ncjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTGlicmFyeVJlc291cmNlTWFuYWdlciBnZXRSZXNvdXJjZU1ncihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBVbWFVdGlsLmdldE1ldGhvZExpYnJhcnkoZWxlbWVudCk7Ci0JCWlmICggbGliICE9IG51bGwgKSB7Ci0JCQlJTGlicmFyeU1hbmFnZXIgbGliTWdyID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRMaWJyYXJ5TWFuYWdlcihsaWIpOwotCQkJaWYgKGxpYk1nciA9PSBudWxsKSB7Ci0JCQkJbGliID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQkJCWxpYk1nciA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0TGlicmFyeU1hbmFnZXIobGliKTsKLQkJCX0KLQkJCWlmIChsaWJNZ3IgPT0gbnVsbCkgewotCQkJCXJldHVybiBnZXREZWZhdWx0UmVzb3VyY2VNZ3IoKTsKLQkJCX0KLQkJCXJldHVybiBsaWJNZ3IuZ2V0UmVzb3VyY2VNYW5hZ2VyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgZm9sZGVyIG9mIHRoZSBwbHVnaW4gaW4gdGhlIGxpYnJhcnksCi0JICogcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5SZXNvdXJjZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWdyKGVsZW1lbnQpOwotCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFVtYVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGVsZW1lbnQpOwotCQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc01nci5nZXRMb2dpY2FsUmVzb3VyY2VQYXRoKGVsZW1lbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcmVzTWdyLmdldExvZ2ljYWxSZXNvdXJjZVBhdGgocGx1Z2luKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSByZXNvdXJjZSBmb2xkZXIgb2YgdGhlIGVsZW1lbnQgaW4gdGhlCi0JICogbGlicmFyeSwgcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRSZXNvdXJjZVBhdGgoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWdyKGVsZW1lbnQpOwotCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJcmV0dXJuIHJlc01nci5nZXRMb2dpY2FsUmVzb3VyY2VQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVzb3VyY2UgZm9sZGVyIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHJldHVybiBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBlbGVtZW50J3MgcmVzb3VyY2UgZm9sZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QWJzb2x1dGVFbGVtZW50UmVzb3VyY2VQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiByZXNNZ3IuZ2V0UGh5c2ljYWxSZXNvdXJjZVBhdGgoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZm9sZGVyIG9mIHRoZSBlbGVtZW50IGluIHRoZSBsaWJyYXJ5LAotCSAqIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50UGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQl0cnkgewotLy8JCQlTdHJpbmcgcGF0aCA9IE1ldGhvZExpYnJhcnlQZXJzaXN0ZXIuSU5TVEFOQ0UuZ2V0UmVsYXRpdmVFbGVtZW50UGF0aChlbGVtZW50KTsKLS8vCQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLS8vCQkJewotLy8JCQkJU3lzdGVtLm91dAotLy8JCQkJCQkucHJpbnRsbigiV2FybmluZyEgTm8gUGF0aCBmb3IgRWxlbWVudCBbIiArIGVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSArICI6ICIgKyBlbGVtZW50LmdldE5hbWUoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0vLwkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJfQotLy8JCQlyZXR1cm4gZml4UGF0aChwYXRoKTsKLS8vCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwotLy8JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBnZXRSZXNvdXJjZU1ncihlbGVtZW50KTsKLQkJaWYgKCByZXNNZ3IgIT0gbnVsbCApIHsKLQkJCXJldHVybiByZXNNZ3IuZ2V0TG9naWNhbFBhdGgoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLS8vCXByaXZhdGUgc3RhdGljIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIGdldEZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0vLwkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlbGVtZW50LmVSZXNvdXJjZSgpOwotLy8JCWlmKHJlc291cmNlICE9IG51bGwpIHsKLS8vCQkJSUxpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldFBlcnNpc3RlckZvcihyZXNvdXJjZSk7Ci0vLwkJCWlmKHBlcnNpc3RlciBpbnN0YW5jZW9mIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyKSB7Ci0vLwkJCQlyZXR1cm4gKChJRmlsZUJhc2VkTGlicmFyeVBlcnNpc3RlcilwZXJzaXN0ZXIpOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotLy8JCi0vLwkvKioKLS8vCSAqIEdldHMgdGhlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudCdzIGZvbGRlciByZWxhdGl2ZSB0byBpdHMgcGx1Zy1pbi4KLS8vCSAqIAotLy8JICogQHBhcmFtIGVsZW1lbnQKLS8vCSAqIEByZXR1cm4KLS8vCSAqIEBkZXBsaWNhdGVkIAotLy8JICovCi0vLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Rm9sZGVyUmVsYXRpdmVQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldEZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIoZWxlbWVudCk7Ci0vLwkJcmV0dXJuIHBlcnNpc3RlciAhPSBudWxsID8gcGVyc2lzdGVyLmdldEZvbGRlclJlbGF0aXZlUGF0aChlbGVtZW50KSA6IG51bGw7Ci0vLwl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgYWJzb2x1dGUgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50J3MgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvbGRlckFic29sdXRlUGF0aChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLS8vCQlpZiAoIGVsZW1lbnQgPT0gbnVsbCApIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCQotLy8JCUlGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IGdldEZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIoZWxlbWVudCk7Ci0vLwkJcmV0dXJuIHBlcnNpc3RlciAhPSBudWxsID8gcGVyc2lzdGVyLmdldEZvbGRlckFic29sdXRlUGF0aChlbGVtZW50KSA6IG51bGw7Ci0JCUlMaWJyYXJ5UmVzb3VyY2VNYW5hZ2VyIHJlc01nciA9IGdldFJlc291cmNlTWdyKGVsZW1lbnQpOwotCQlpZiAoIHJlc01nciAhPSBudWxsICkgewotCQkJcmV0dXJuIHJlc01nci5nZXRQaHlzaWNhbFBhdGgoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotLy8JLyoqCi0vLwkgKiByZXR1cm4gdGhlIHBhcmVudCBmb2xkZXIgb2YgdGhlIHBsdWdpbiBvciBjb25maWd1cmF0aW9uIG9mIHRoZSBlbGVtZW50LgotLy8JICogb3IgdGhlIGxpYnJhcnkgcm9vdCBpZiB0aGUgZWxlbWVudCBpcyB0aGUgTWV0aG9kTGlicmFyeS4KLS8vCSAqIAotLy8JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotLy8JICogQHJldHVybiBTdHJpbmcKLS8vCSAqLwotLy8JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmlydHVhbExpYnJhcnlSb290KE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCWlmICggZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkgKSB7Ci0vLwkJCS8vIGRlZmF1bHQsIHJldHVybiB0aGUgY3VycmVudCBsaWJyYXJ5IHBhdGgKLS8vCQkJcmV0dXJuIExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpOwkJCQkJCi0vLwkJfSAKLS8vCQkKLS8vCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0vLwkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uICkgewotLy8JCQlwYXRoID0gZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKGVsZW1lbnQpOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXBhdGggPSBnZXRQbHVnaW5QYXRoKGVsZW1lbnQpOwotLy8JCX0KLS8vCQkKLS8vCQlpZiAoIHBhdGggIT0gbnVsbCApIHsKLS8vCQkJRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0vLwkJCXJldHVybiBmLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLS8vCQl9Ci0vLwkJCi0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0JCi0vLwkvKioKLS8vCSAqIGZpeCB0aGUgcGF0aCBieSBhcHBlbmRpbmcgYSBGaWxlLnNlcGVyYXRvciB0byB0aGUgZW5kIG9mIGl0Ci0vLwkgKiBAcGFyYW0gcGF0aCBTdHJpbmcKLS8vCSAqIEByZXR1cm4gU3RyaW5nCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeFBhdGgoU3RyaW5nIHBhdGgpIHsKLS8vCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotLy8JCXsKLS8vCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0vLwkJfSBlbHNlIGlmICghcGF0aC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLS8vCQkJcmV0dXJuIHBhdGggKyBGaWxlLnNlcGFyYXRvcjsKLS8vCQl9IGVsc2UgewotLy8JCQlyZXR1cm4gcGF0aDsKLS8vCQl9Ci0vLwl9Ci0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQncyBiYWNrIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdC4gRm9yIGV4YW1wbGUsCi0JICogIk9wZW5VUFxndWlkYW5jZVxjb25jZXB0XGMxLnhtbCIsIHRoZSBiYWNrIHBhdGggaXMgIi4vLi4vLi4vLi4vIgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhY2tQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotLy8JCS8vIExpbnV4OiBCcm93c2luZyBhbmQgcHJldmlldyBzaG93cyBvbmx5IHBsYWluIHRleHQuCi0vLwkJLy8gVGhlcmUgYXJlIG5vIGltYWdlcy9zZWN0aW9ucwotLy8JCS8vIGVsZW1lbnQgcGF0aCBzaG91bGQgY2hlY2sgRmlsZS5zZXBhcmF0b3JDaGFyIGluc3RlYWQgb2YgIlwiCi0vLwkJU3RyaW5nIGJhY2tQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQlTdHJpbmcgcGF0aCA9IGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpOwotLy8JCWlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGgoKSA+IDApIHsKLS8vCQkJYmFja1BhdGggPSBwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpLnJlcGxhY2VBbGwoCi0vLwkJCQkJIi4qPy8iLCAiXFwuXFwuLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLS8vCQl9Ci0vLwkJcmV0dXJuICIuLyIgKyBiYWNrUGF0aDsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgcmVzTWdyID0gZ2V0UmVzb3VyY2VNZ3IoZWxlbWVudCk7Ci0JCWlmICggcmVzTWdyICE9IG51bGwgKSB7Ci0JCQlyZXR1cm4gcmVzTWdyLmdldEJhY2tQYXRoKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGV4dCBTdHJpbmcgdGhlIGZpbGUgZXh0ZW5hc2lvbiwgZm9yIGV4YW1wbGUsICIuaHRtbCIKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGV4dCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoZWxlbWVudCwgbnVsbCwgbnVsbCwgZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgbmFtZSB3aXRoIHRoZSBnaXZlbiBwcmVmaXggYW5kIGV4dGVuc2lvbgotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbmFtZVByZWZpeCBTdHJpbmcgcHJlZml4IGZvciB0aGUgbmFtZQotCSAqIEBwYXJhbSBuYW1lU3VmZml4IFN0cmluZyBzdWZmaXggZm9yIHRoZSBuYW1lCi0JICogQHBhcmFtIGV4dCBTdHJpbmcgZmlsZSBleHRlbnNpb24sIGZvciBleGFtcGxlLCAiLmh0bWwiCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8JIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZpbGVOYW1lKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5hbWVQcmVmaXgsCi0JCQlTdHJpbmcgbmFtZVN1ZmZpeCwgU3RyaW5nIGV4dCkgewkJCi0JCXJldHVybiBGaWxlTmFtZUdlbmVyYXRvci5JTlNUQU5DRS5nZXRGaWxlTmFtZShlbGVtZW50LCBuYW1lUHJlZml4LCBuYW1lU3VmZml4LCBleHQpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZCBmcm9tIHRoZSBmaWxlIG5hbWUsIGFzc3VtaW5nIHRoZSBmaWxlIG5hbWUgaXMgZ2VuZXJhdGVkIGZyb20gYW4gZWxlbWVudCwgCi0JICogcmV0dXJuIG51bGwgaWYgbm90IGZvdW5kLgotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEd1aWRGcm9tRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBGaWxlTmFtZUdlbmVyYXRvci5JTlNUQU5DRS5nZXRHdWlkRnJvbUZpbGVOYW1lKGZpbGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgZnJvbSB0aGUgZmlsZSBuYW1lLCBhc3N1bWluZyB0aGUgZmlsZSBuYW1lIGlzIGdlbmVyYXRlZCBmcm9tIGFuIGVsZW1lbnQsCi0JICogcmV0dXJuIG51bGwgaWYgbm90LgotCSAqIEBwYXJhbSBmaWxlTmFtZSBTdHJpbmcKLQkgKiBAcmV0dXJuIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0RWxlbWVudEZyb21GaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHdWlkRnJvbUZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJaWYgKGd1aWQgIT0gbnVsbCkgewotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbWFuYWdlci5nZXRNZXRob2RFbGVtZW50KGd1aWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IHVybCByZWxhdGl2ZSB0byB0aGUgcmVmRWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gcmVmRWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZpbGVFeHQgU3RyaW5nIGZpbGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIG9sZF91cmwgU3RyaW5nIHRoZSBvbGQgdXJsIG9mIHRoZSBlbGVtZW50LiBJZiB0aGUgb2xkIHVybCBpcyBub3QgbnVsbCwgCi0JICogYW55IGJvb2ttYXJrIG9yIHVybCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIG5ldyB1cmwKLQkgKiBAcmV0dXJuIFN0cmluZyBTdHJpbmcgdGhlIG5ldyBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXJsKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCwgU3RyaW5nIGZpbGVFeHQsIFN0cmluZyBvbGRfdXJsKSB7Ci0JCVN0cmluZyB1cmwgPSBnZXRVcmwoZWxlbWVudCwgcmVmRWxlbWVudCwgZmlsZUV4dCk7Ci0KLQkJLy8gaWYgdGhlIG9sZCB1cmwgaGFzIGJvb2ttYXJrIGluIGl0LCBrZWVwIGl0Ci0JCWlmIChvbGRfdXJsICE9IG51bGwpIHsKLQkJCWludCBpbmR4ID0gb2xkX3VybC5pbmRleE9mKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpOwotCQkJaWYgKGluZHggPCAwKSB7Ci0JCQkJLy8ga2VlcCB1cmwgcXVlcnkgc3RyaW5nIGFzIHdlbGwKLQkJCQlpbmR4ID0gb2xkX3VybC5pbmRleE9mKFVSTF9QQVJBTUVURVJfSU5ESUNBVE9SKTsKLQkJCX0KLQotCQkJaWYgKGluZHggPj0gMCkgewotCQkJCXVybCA9IHVybCArIG9sZF91cmwuc3Vic3RyaW5nKGluZHgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgdXJsIHJlbGF0aXZlIHRvIHRoZSByZWZFbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSByZWZFbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gZmlsZUV4dCBTdHJpbmcgZmlsZSBleHRlbnNpb24KLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJsCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXJsKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCwgU3RyaW5nIGZpbGVFeHQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAocmVmRWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RWxlbWVudFBhdGgoZWxlbWVudCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykKLQkJCQkJKyBnZXRGaWxlTmFtZShlbGVtZW50LCBmaWxlRXh0KTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAoZ2V0QmFja1BhdGgocmVmRWxlbWVudCkgKyBnZXRFbGVtZW50UGF0aChlbGVtZW50KSkucmVwbGFjZSgKLQkJCQkJRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpCi0JCQkJCSsgZ2V0RmlsZU5hbWUoZWxlbWVudCwgZmlsZUV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGxpbmsgdGV4dCBmb3IgYW4gZWxlbWVudAotCSAqIEBwYXJhbSBlIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gbGlua1R5cGUgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaW5rVGV4dChNZXRob2RFbGVtZW50IGUsIFN0cmluZyBsaW5rVHlwZSkgewotCQlTdHJpbmcgbGlua2VkVGV4dCA9IG51bGw7Ci0JCQotCQkvLyBSVEUgbWF5IGNoYW5nZSB0aGUgY2FzZSBvZiBhdHRyaWJ1dGVzLgotCQlpZiAoKGxpbmtUeXBlICE9IG51bGwpCi0JCQkJJiYgIUVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dC5lcXVhbHNJZ25vcmVDYXNlKGxpbmtUeXBlKSkgewotCQkJaWYgKEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhUeXBlLmVxdWFsc0lnbm9yZUNhc2UobGlua1R5cGUpKSB7Ci0JCQkJbGlua2VkVGV4dCA9IGdldEVsZW1lbnRMaW5rVGV4dChlLCB0cnVlKTsKLQkJCX0gZWxzZSBpZiAoRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rLmVxdWFsc0lnbm9yZUNhc2UobGlua1R5cGUpKSB7Ci0JCQkJbGlua2VkVGV4dCA9IGdldEVsZW1lbnRMaW5rVGV4dChlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlua2VkVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGVsZW1lbnQgbGluayB0ZXh0IGZvciB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqIEBwYXJhbSBlbGVtZW50IE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gd2l0aFR5cGUgYm9vbGVhbiBpZiB0cnVlIHRoZSBlbGVtZW50IHR5cGUgc3RyaW5nIHdpbGwgYmUgaW5jbHVkZWQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRMaW5rVGV4dChNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlib29sZWFuIHdpdGhUeXBlKSB7Ci0JCVN0cmluZyB0ZXh0ID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotLy8JCWlmICh3aXRoVHlwZSkgewotLy8JCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVUZXh0KGVsZW1lbnQpICsgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlICsgdGV4dDsgCi0vLwkJfQotLy8KLS8vCQlyZXR1cm4gdGV4dDsKLQkJaWYgKHdpdGhUeXBlKSB7Ci0JCQlpZiAoc2hvd1NraW5SZXNvdXJjZSkgewotCQkJCVN0cmluZyB4c2xQYXRoID0gbnVsbDsKLQotCQkJCWlmICgoTEFZT1VUX1hTTF9ST09UX1BBVEggPT0gbnVsbCkKLQkJCQkJCXx8IChMQVlPVVRfWFNMX1JPT1RfUEFUSC5lcXVhbHMoIiIpKSkgewotCQkJCQlMQVlPVVRfWFNMX1JPT1RfUEFUSCA9IEJyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0UuZ2V0WHNsUGF0aCgpCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpOwotCQkJCX0KLQkJCQlQcm9wZXJ0aWVzIGJyb3dzaW5nUmVzb3VyY2UgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKExBWU9VVF9YU0xfUk9PVF9QQVRILCAicmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJCVN0cmluZyBsb2NhbEZpbGVOYW1lID0gSTE4blV0aWwuZ2V0TG9jYWxpemVkRmlsZShmaWxlCi0JCQkJCQkuZ2V0QWJzb2x1dGVQYXRoKCksIGxvY2FsZSk7Ci0JCQkJaWYgKGxvY2FsRmlsZU5hbWUgIT0gbnVsbCkgewotCQkJCQlmaWxlID0gbmV3IEZpbGUobG9jYWxGaWxlTmFtZSk7Ci0JCQkJfQotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlicm93c2luZ1Jlc291cmNlLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHR5cGUgPSBnZXRFbGVtZW50VHlwZVRleHQoZWxlbWVudCk7Ci0JCQkJU3RyaW5nIGtleSA9IHR5cGUuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkKLQkJCQkJCSsgdHlwZS5zdWJzdHJpbmcoMSkgKyAiVGV4dCI7Ci0JCQkJU3RyaW5nIHZhbHVlID0gYnJvd3NpbmdSZXNvdXJjZS5nZXRQcm9wZXJ0eShrZXkpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB2YWx1ZSArIExpYnJhcnlSZXNvdXJjZXMuY29sb25fd2l0aF9zcGFjZSArIHRleHQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIHR5cGUgKyBMaWJyYXJ5UmVzb3VyY2VzLmNvbG9uX3dpdGhfc3BhY2UgKyB0ZXh0OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVUZXh0KGVsZW1lbnQpICsgTGlicmFyeVJlc291cmNlcy5jb2xvbl93aXRoX3NwYWNlICsgdGV4dDsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBndGUgdGhlIGVsZW1lbnQgdHlwZSBzdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZVRleHQoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogYXV0byBnZW5lcmF0ZWQgZWxlbWVudCBsaW5rIDxhIGNsYXNzPSJlbGVtZW50TGluayIgaHJlZj0iZWxlbWVudF91cmwiCi0JICogZ3VpZD0iZWxlbWVudF9ndWlkIj5lbGVtZW50X3R5cGU6IGVsZW1lbnRfcHJlc2VudGF0aW9uX25hbWU8L2E+Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKiBAcGFyYW0gd2l0aFR5cGUKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRMaW5rKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCWJvb2xlYW4gd2l0aFR5cGUsIFN0cmluZyB1cmwpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRFbGVtZW50TGlua1RleHQoZWxlbWVudCwgd2l0aFR5cGUpOwotCQlTdHJpbmcgbGlua0NsYXNzID0gRUxFTUVOVF9MSU5LX0NMQVNTX2VsZW1lbnRMaW5rOwotCQlpZiAod2l0aFR5cGUpCi0JCQlsaW5rQ2xhc3MgPSBFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZTsKLQkJcmV0dXJuIGdldEVsZW1lbnRMaW5rKGVsZW1lbnQsIHRleHQsIHVybCwgbGlua0NsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBlbGVtZW50IGxpbmsgd2l0aCB1c2VyIHNwZWNpZmllZCBsaW5rIHRleHQKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmsoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCwKLQkJCVN0cmluZyB1cmwpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRMaW5rKGVsZW1lbnQsIHRleHQsIHVybCwKLQkJCQlFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVXNlclRleHQpOwotCX0KLQotCS8qKgotCSAqIGVsZW1lbnQgbGluayB3aXRoIHVzZXIgc3BlY2lmaWVkIGxpbmsgdGV4dAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHRleHQKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50TGluayhNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB0ZXh0LAotCQkJU3RyaW5nIHVybCwgU3RyaW5nIGxpbmtDbGFzcykgewotCQlyZXR1cm4gIjxhIGNsYXNzPVwiIiArIGxpbmtDbGFzcyArICJcIiAiICsgZ2V0VXJsVGV4dCh1cmwpICsgIiBndWlkPVwiIiArIGVsZW1lbnQuZ2V0R3VpZCgpICsgIlwiID4iICsgdGV4dCArICI8L2E+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotCi0JLyoqCi0JICogdGhlIHBhc3NlZCBpbiB1cmwgbWlnaHQgY29udGFpbiB0aGUgaHJlZiBhdHRyaWJ1dGUgd2l0aCBpdCwgb3IgZXZlbiBvdGhlcgotCSAqIGF0dHJpYnV0ZXMsIHNvIGNoZWNrIGlmIHRoaXMgaXMgYSBwdXJlIHVybCBvciBub3QuIHJldHVybiB0aGUgdXJsIGhyZWYKLQkgKiB0ZXJtIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVybFRleHQoU3RyaW5nIHVybCkgewotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl1cmwgPSB1cmwudHJpbSgpOwotCQl9Ci0KLQkJLy8gc3RhcnRzIHdpdGggaHJlZiwgb3IgY29udGFpbnMgYW4gaHJlZiB0ZXJtIGluIGl0Ci0JCWlmICh1cmwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCJocmVmIikgfHwgdXJsLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiIGhyZWYiKSA+IDApIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl7Ci0JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJcmV0dXJuICJocmVmPVwiIiArIHVybCArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIHZhbGlkYXRlIHRoZSBjb250ZW50IGJ5IGNoZWNraW5nIGVsZW1lbnQgbGlua3MgYW5kIGltYWdlcwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVDb250ZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHNvdXJjZSkgewotCQlyZXR1cm4gdmFsaWRhdGVDb250ZW50KGVsZW1lbnQsIHNvdXJjZSwgbmV3IERlZmF1bHRDb250ZW50VmFsaWRhdG9yKCksCi0JCQkJbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGxpbmsgdHlwZSBpcyBlbGVtZW50IGxpbmsgb3Igbm90Ci0JICogQHBhcmFtIGxpbmtUeXBlIFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VsZW1lbnRMaW5rKFN0cmluZyBsaW5rVHlwZSkgewotCQlpZiAobGlua1R5cGUgPT0gbnVsbCB8fCBsaW5rVHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBSVEUgbWF5IGNoYW5nZSB0aGUgY2FzZSBvZiBhdHRyaWJ1dGVzLgotCQlyZXR1cm4gbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmspCi0JCQkJfHwgbGlua1R5cGUuZXF1YWxzSWdub3JlQ2FzZShFTEVNRU5UX0xJTktfQ0xBU1NfZWxlbWVudExpbmtXaXRoVHlwZSkKLQkJCQl8fCBsaW5rVHlwZS5lcXVhbHNJZ25vcmVDYXNlKEVMRU1FTlRfTElOS19DTEFTU19lbGVtZW50TGlua1dpdGhVc2VyVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGNvbnRlbnQgYnkgY2hlY2tpbmcgZWxlbWVudCBsaW5rcyBhbmQgaW1hZ2VzLCBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgb3duZXIKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHRoZSBjb250ZW50IGlzCi0JICogICAgICAgICAgICB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0gbGlua2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIExpc3QgYSBwYXNzZWQgaW4gbGlzdCB0byBjb2xsZWN0IHRoZSBsaW5rZWQgZWxlbWVudHMgaW4gdGhpcwotCSAqICAgICAgICAgICAgY29udGVudCwgaWYgbnVsbCwgbm8gbGlua2VkIGVsZW1lbnRzIGFyZSBjb2xsZWN0ZWQuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHZhbGlkYXRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVDb250ZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHNvdXJjZSwKLQkJCUlDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBsYXlvdXRYc2xSb290UGF0aCkgewotCQkKLQkJdHJ5IHsKLQkJCVJlc291cmNlSGVscGVyLkxBWU9VVF9YU0xfUk9PVF9QQVRIID0gbGF5b3V0WHNsUm9vdFBhdGg7Ci0JCQlzaG93U2tpblJlc291cmNlID0gdHJ1ZTsKLQkJCS8vIGZpcnN0IHZhbGlkYXRlIHRoZSB0YWdzLCByZW1vdmUgYW55IENGL0xGIGZyb20gdGhlIHRhZyB0ZXh0Ci0JCQlzb3VyY2UgPSB2YWxpZGF0ZVRhZyhzb3VyY2UpOwotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIoc291cmNlKTsKLQotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0KLQkJCQkvLyBQcm9ibGVtcyBwYXJzaW5nIDxhIGhyZWY+IHRhZ3MKLQkJCQkvLyBuZWVkIHRvIHJlbW92ZSBhbGwgTEYsIENSIHdpdGhpbiB0aGUgPGEgLi4+IHRhZwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbGlua2VkVGV4dCA9IG0uZ3JvdXAoMik7Ci0JCQkJTGlua0luZm8gaW5mbyA9IHZhbGlkYXRvci52YWxpZGF0ZUxpbmsoZWxlbWVudCwgdXJsdGV4dCwKLQkJCQkJCWxpbmtlZFRleHQsIGNvbmZpZywgImEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJdGV4dCA9IGluZm8uZ2V0SHRtbCh2YWxpZGF0b3Iuc2hvd0Jyb2tlbkxpbmtzKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGluZm8uZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWxpZGF0b3IuYWRkUmVmZXJlbmNlZEVsZW1lbnQoZWxlbWVudCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwoImZpbGU6Ly8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnJlcGxhY2VBbGwoImZpbGU6Ly8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQkKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUocmVwbGFjZW1lbnQpKTsKLQkJCX0KLQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJfQotCi0JCQkvLyBhbHNvIGZpeCB0aGUgYXJlYSBtYXAKLQkJCXNvdXJjZSA9IHNiLnRvU3RyaW5nKCk7Ci0JCQltID0gcF9hcmVhX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCQlzYi5zZXRMZW5ndGgoMCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJIiIsIGNvbmZpZywgImFyZWEiKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJCi0JCQkJCS8vIGRvbid0IHNob3cgYnJva2VuIGxpbmtzIGluIGFyZWEgbWFwLiBTaG93IHBsYW4gdGV4dCBpbnN0ZWFkCi0JCQkJCXRleHQgPSBpbmZvLmdldEh0bWwoZmFsc2UvKnZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSovKS50b1N0cmluZygpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBpbmZvLmdldExpbmtlZEVsZW1lbnQoKTsKLQkJCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yLmFkZFJlZmVyZW5jZWRFbGVtZW50KGVsZW1lbnQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdGV4dC5yZXBsYWNlQWxsKCJmaWxlOi8vLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVwbGFjZW1lbnQgPSByZXBsYWNlbWVudC5yZXBsYWNlQWxsKCJmaWxlOi8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCS8vIFNoYXBlIGljb24gYnJva2VuIGluIHByZXZpZXcgYW5kIGJyb3dzaW5nCi0JCQkvLyAvLyBuZWVkIHRvIGRlY29kZSB0aGUgaW1hZ2UgcGF0aCB1bmxlc3Mgd2UgY2FuIGRpc2FibGUgdGhlIHVybAotCQkJLy8gZW5jb2RpbmcgaW4geHNsdAotCQkJLy8gc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJCS8vIHNiLnNldExlbmd0aCgwKTsKLQkJCS8vIG0gPSBSZXNvdXJjZUhlbHBlci5wX2ltYWdlX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCQkvLyB3aGlsZSAoIG0uZmluZCgpICkKLQkJCS8vIHsKLQkJCS8vIFN0cmluZyB1cmwgPSBtLmdyb3VwKDMpOwotCQkJLy8gdXJsID0gVVJMRGVjb2Rlci5kZWNvZGUodXJsLCAiVVRGLTgiKTsKLQkJCS8vIG0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKTsKLQkJCS8vIH0KLQkJCS8vIG0uYXBwZW5kVGFpbChzYik7Ci0JCQkvLyByZXR1cm4gc2IudG9TdHJpbmcoKTsKLQotCQkJLy8gZGVjb2RlIHRoZSB1cmxzCi0JCQlyZXR1cm4gZGVjb2RlVXJsc0luQ29udGVudChzYi50b1N0cmluZygpKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkKLQkJewotCQkJUmVzb3VyY2VIZWxwZXIuTEFZT1VUX1hTTF9ST09UX1BBVEggPSBudWxsOwotCQkJc2hvd1NraW5SZXNvdXJjZSA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBkZWNvZGUgdGhlIHVybHMgaW4gdGhlIGNvbnRlbnQuIENvbnRlbnQgZnJvbSB4c2x0IG91dHB1dCBhcmUgZW5jb2RlZC4gV2UKLQkgKiBkb24ndCB3YW50IHRoaXMgdG8gYmUgZW5jb2RlZCBzaW5jZSB0aGUgYnJvd3NlciBtYXkgZGVjb2RlIGl0IGluIGEgd3JvbmcKLQkgKiBlbmNvZGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXJsc0luQ29udGVudChTdHJpbmcgY29udGVudCkgewotCQl0cnkgewotCQkJLy8gU2hhcGUgaWNvbiBicm9rZW4gaW4gcHJldmlldyBhbmQgYnJvd3NpbmcKLQkJCS8vIG5lZWQgdG8gZGVjb2RlIHRoZSBpbWFnZSBwYXRoIHVubGVzcyB3ZSBjYW4gZGlzYWJsZSB0aGUgdXJsCi0JCQkvLyBlbmNvZGluZyBpbiB4c2x0Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX3VybF9kZWNvZGVyLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSBVUkxEZWNvZGVyLmRlY29kZSh1cmwsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKDEpICsgdXJsICsgbS5ncm91cCg0KTsKLQkJCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCByZWdFeHBFc2NhcGUodGV4dCkpOyAJCi0JCQl9Ci0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBlc2NhcGUgdGhlIHJlZ2V4cCByZXNlcnZlZCB3b3Jkcywgc3VjaCBhcyAkCi0JICogQHBhcmFtIHRleHQgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWdFeHBFc2NhcGUoU3RyaW5nIHRleHQpIHsKLQkJLy8gZXNjYXBlIHRoZSByZWdFeHAgcmVzZXJ2ZWQgd29yZHMsCi0JCS8vIHRoZSAkIHNpZ24gaXMgcmVzZXJ2ZWQgZm9yIGdyb3VwIG1hdGNoaW5nIAotCQlTdHJpbmcgbmV3dGV4dCA9IFN0clV0aWwuZXNjYXBlQ2hhcih0ZXh0LCAnJCcpOwotCQluZXd0ZXh0ID0gU3RyVXRpbC5lc2NhcGVDaGFyKHRleHQsICdcXCcpOwotCQlyZXR1cm4gbmV3dGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogZml4IHRoZSBlbGVtZW50IHVybCBpbiB0aGUgdXJsdGV4dC4gdGhlIHRleHQgaXMgdGhlIHBhcnQgZnJvbSB0aGUKLQkgKiBwX2xpbmtfcmVmIHBhdHRlcm4gbWF0Y2gKLQkgKiAKLQkgKiBAcGFyYW0gdXJsdGV4dAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gd2hpY2ggdGhlIGNvbnRlbnQgaXMKLQkgKiAgICAgICAgICAgIHZhbGlkYXRlZAotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBmaXhlZCB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4RWxlbWVudFVybChNZXRob2RFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmx0ZXh0LAotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJTWF0Y2hlciBtID0gcF9saW5rX2hyZWZfcGlja2VyLm1hdGNoZXIoIiAiICsgdXJsdGV4dCArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMSk7Ci0JCQlTdHJpbmcgbmV3dXJsID0gbnVsbDsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZ3VpZCA9IGdldEd1aWRGcm9tVXJsKHVybHRleHQpOwotCQkJCWlmIChndWlkICE9IG51bGwpIHsKLQkJCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQkJCQlNZXRob2RFbGVtZW50IGUgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyCi0JCQkJCQkJLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCkgOiBudWxsOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQkJCQllID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudChlLAotCQkJCQkJCQkJY29uZmlnKTsKLQkJCQkJCX0KLQkJCQkJCW5ld3VybCA9IGdldFVybChlLCBlbGVtZW50LCBGSUxFX0VYVF9IVE1MLCB1cmwpOwotCQkJCQl9Ci0KLQkJCQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgbnVsbCwgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgdXJsIGxpbmsgYW5kCi0JCQkJCS8vIGxvZyBhbiBlcnJvcgotCQkJCQkvLyBUT0RPCi0JCQkJfQotCQkJfQotCi0JCQlpZiAobmV3dXJsICE9IG51bGwgJiYgIW5ld3VybC5lcXVhbHModXJsKSkgewotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9ICIgaHJlZj1cIiIgKyBuZXd1cmwgKyAiXCIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHVybHRleHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBlbGVtZW50IGxpbmsgdHlwZSBmb3IgdGhlIHVybAotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nIHRoZSBsaW5rCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHR5cGUgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudExpbmtUeXBlKFN0cmluZyBzb3VyY2UpIHsKLQkJTWF0Y2hlciBtID0gcF9saW5rX3R5cGVfcGlja2VyLm1hdGNoZXIoIiAiICsgc291cmNlICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJcmV0dXJuIG0uZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgZ3VpZCBmcm9tIHRoZSB1cmwKLQkgKiBAcGFyYW0gc291cmNlIFN0cmluZyB0aGUgdXJsCi0JICogQHJldHVybiBTdHJpZ24gdGhlIGd1aWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHdWlkRnJvbVVybChTdHJpbmcgc291cmNlKSB7Ci0JCU1hdGNoZXIgbSA9IHBfbGlua19ndWlkX3BpY2tlci5tYXRjaGVyKCIgIiArIHNvdXJjZSArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAobS5maW5kKCkpIHsKLQkJCXJldHVybiBtLmdyb3VwKDEpLnRyaW0oKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQltID0gcF9saW5rX2hyZWZfcGlja2VyLm1hdGNoZXIoIiAiICsgc291cmNlICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChtLmZpbmQoKSkgewotCQkJU3RyaW5nIGhyZWYgPSBtLmdyb3VwKDEpLnRyaW0oKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZ2V0R3VpZEZyb21GaWxlTmFtZShocmVmKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGhhbmRsZSBhIGJ1ZyBpbiBJRS4gYW5jaG9yIHRhZyBjYW4ndCBoYXZlIENSIExGLCBsaWtlIDxBIFxyXG4KLQkgKiBocmVmPSJ3d3cueWFob28uY29tIiBcclxuPiBzY2FuIHRoZSBzdHJpbmcgc291cmNlLCBmaW5kIGFsbCBhbmNob3IgdGFncwotCSAqIGFuZCByZXBsYWNlIHdpdGggc3BhY2UuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBmaXhlZCBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2YWxpZGF0ZVRhZyhTdHJpbmcgc291cmNlKSB7Ci0JCS8vIFBhdHRlcm4gcF9hbmNob3JfcmVmID0gUGF0dGVybi5jb21waWxlKCIoKis/KT0oKi4/KSIsCi0JCS8vIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsKLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IHBfdGFnX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0JCS8vIFN0cmluZ0J1ZmZlciB0ZW1wU2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsKLQkJCVN0cmluZyByZXBsYWNlbWVudCA9IGZpeFRhZ0F0dHJpYnV0ZSh0ZXh0KTsKLQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQl9Ci0KLQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBmaXggdGFnIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpeFRhZ0F0dHJpYnV0ZShTdHJpbmcgc291cmNlKSB7Ci0JCS8vIHNpbXBseSByZXBsYWNlIGFsbCBDUiBMRiB3aXRoICcgJywgZmluZSB0dW5lIGxhdGVyCi0JCXJldHVybiBzb3VyY2UKLQkJCQkucmVwbGFjZUFsbCgiXFxcclxcXG4iLCAiICIpLnJlcGxhY2VBbGwoIlxcXHIiLCAiICIpLnJlcGxhY2VBbGwoIlxcXG4iLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCX0KLQotLy8JLyoqCi0vLwkgKiBnZXQgdGhlIHJlc291cmNlIGZpbGUgdXJsIHJlbGF0aXZlIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGUKLS8vCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0aGF0IHJlZmVyZW5jZXMgdGhpcyByZXNvdXJjZQotLy8JICogQHBhcmFtIGZpbGUKLS8vCSAqICAgICAgICAgICAgRmlsZSB0aGUgcmVzb3VyY2UncyBwaHlzaWNhbCBwYXRoCi0vLwkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJsIHRvIHRoaXMgcmVzb3VyY2UgZnJvbSB0aGUgZWxlbWVudAotLy8JICogQGRlcGxpY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IHZhbGlkIGZvciBkaXN0cmlidXRlZCBsaWJyYXJ5Ci0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZUZpbGVVcmwoTWV0aG9kRWxlbWVudCBlLCBGaWxlIGZpbGUpIHsKLS8vCQlTdHJpbmcgZmlsZVVybCA9IGdldEZpbGVVcmwoZmlsZSk7Ci0vLwkJLy8gU3RyaW5nIGVsZW1lbnRQYXRoID0KLS8vCQkvLyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UmVzb3VyY2VQYXRoKGUpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLAotLy8JCS8vICcvJyk7Ci0vLwotLy8JCWZpbGVVcmwgPSBSZXNvdXJjZUhlbHBlci5nZXRCYWNrUGF0aChlKSArIGZpbGVVcmw7Ci0vLwotLy8JCXJldHVybiBmaWxlVXJsOwotLy8KLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIHJldHVybiB0aGUgZmlsZSdzIHJlbGF0aXZlIHBhdGggdG8gdGhlIHBsdWdpbiByb290Ci0vLwkgKiAKLS8vCSAqIEBwYXJhbSBmCi0vLwkgKiBAcmV0dXJuIFN0cmluZwotLy8JICogQGRlcGxpY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IHZhbGlkIGZvciBkaXN0cmlidXRlZCBsaWJyYXJ5Ci0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRGaWxlVXJsKEZpbGUgZikgewotLy8JCVN0cmluZyBwYXRoID0gZ2V0RmlsZVJlbFBhdGgoZik7Ci0vLwkJcGF0aCA9IHBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0vLwkJcmV0dXJuIHBhdGg7Ci0vLwl9Ci0KLS8vCS8qKgotLy8JICogZ2V0IHRoZSBVUkkgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBiYXNlCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSB1cmkKLS8vCSAqIEByZXR1cm4gamF2YS5uZXQuVVJJCi0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgVVJJIGdldFJlbGF0aXZlVVJJKFVSSSB1cmksIFN0cmluZyByb290UGF0aCkgewotLy8JCXJldHVybiBnZXRSZWxhdGl2ZVVSSSh1cmksIG5ldyBGaWxlKHJvb3RQYXRoKS50b1VSSSgpKTsKLS8vCX0KLQotCS8qKgotCSAqIGdldCB0aGUgVVJJIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgYmFzZQotCSAqIAotCSAqIEBwYXJhbSB1cmkKLQkgKiBAcmV0dXJuIGphdmEubmV0LlVSSQotCSAqIEBkZXBsaWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0UmVsYXRpdmVVUkkoVVJJIHVyaSwgVVJJIHJlbGF0aXZlVG8pIHsKLQkJVVJJIHJlbFVyaSA9IHJlbGF0aXZlVG8ucmVsYXRpdml6ZSh1cmkpOwotCQlyZXR1cm4gcmVsVXJpOwotCX0KLQotLy8JLyoqCi0vLwkgKiByZXNvbHZlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBsaWJyYXJ5IHJvb3QKLS8vCSAqIAotLy8JICogQHBhcmFtIGYKLS8vCSAqIEByZXR1cm4gU3RyaW5nIHRoZSByYWx0aXZlIHBhdGgKLS8vCSAqIEBkZXBsaWNhdGVkIHRoaXMgbWV0aG9kIGlzIG5vdCB2YWxpZCBmb3IgZGlzdHJpYnV0ZWQgbGlicmFyeQotLy8JICovCi0vLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVJlbFBhdGgoRmlsZSBmKSB7Ci0vLwkJRmlsZSBsaWJyYXJ5Um9vdFBhdGggPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKTsKLS8vCQlTdHJpbmcgcm9vdCA9IGxpYnJhcnlSb290UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLS8vCQlTdHJpbmcgcGF0aCA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0vLwkJaWYgKHBhdGguc3RhcnRzV2l0aChyb290KSkgewotLy8JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcocm9vdC5sZW5ndGgoKSk7Ci0vLwkJfQotLy8KLS8vCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgewotLy8JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMSk7Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gcGF0aDsKLS8vCX0KLQotLy8JLyoqCi0vLwkgKiBnZXQgdGhlIFVSSSByZWxhdGl2ZSB0byB0aGUgbGlicmFyeSByb290Ci0vLwkgKiAKLS8vCSAqIEBwYXJhbSBmCi0vLwkgKiBAcmV0dXJuIGphdmEubmV0LlVSSQotLy8JICogQGRlcGxpY2F0ZWQgdGhpcyBtZXRob2QgaXMgbm90IHZhbGlkIGZvciBkaXN0cmlidXRlZCBsaWJyYXJ5Ci0vLwkgKi8KLS8vCXByaXZhdGUgc3RhdGljIGphdmEubmV0LlVSSSBnZXRGaWxlUmVsYXRpdmVVUkkoRmlsZSBmKSB7Ci0vLwkJRmlsZSBsaWJyYXJ5Um9vdFBhdGggPSBuZXcgRmlsZShMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0vLwkJCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKTsKLS8vCQlqYXZhLm5ldC5VUkkgbGliVVJJID0gbGlicmFyeVJvb3RQYXRoLnRvVVJJKCk7Ci0vLwkJamF2YS5uZXQuVVJJIGZpbGVVUkkgPSBmLnRvVVJJKCk7Ci0vLwkJamF2YS5uZXQuVVJJIHJlbFVyaSA9IGxpYlVSSS5yZWxhdGl2aXplKGZpbGVVUkkpOwotLy8KLS8vCQlyZXR1cm4gcmVsVXJpOwotLy8JfQotCi0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIGF0dGFjaG1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aFRvRmlsZUZyb21FbGVtZW50KAotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50LCBGaWxlIGF0dGFjaG1lbnQpIHsKLQkJU3RyaW5nIGVsZW1lbnRMb2MgPSBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgoZWxlbWVudCk7CQotCQlyZXR1cm4gRmlsZVV0aWwuZ2V0UmVsYXRpdmVQYXRoKGF0dGFjaG1lbnQsIG5ldyBGaWxlKGVsZW1lbnRMb2MpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGZpbGUgcGF0aCBuYW1lIG9mIHRoZSB0eXBlIG9mIGRpYWdyYW0gZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIGRpYWdyYW1UeXBlCi0JICogICAgICAgICAgICBTdHJpbmcgZGlhZ3JhbSB0eXBlIGRlZmluZWQgaW4gb25lIG9mIHRoZSBkaWFncmFtIHR5cGUKLQkgKiAgICAgICAgICAgIGNvbnN0YW50cwotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGxpYnJhcnkgcm9vdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpYWdyYW1GaWxlUGF0aE5hbWUoTWV0aG9kRWxlbWVudCBlLAotCQkJU3RyaW5nIGRpYWdyYW1UeXBlKSB7Ci0JCS8vIEluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY3Rpdml0eS9DUCBzaGFyZSB0aGUKLQkJLy8gc2FtZSBkaWFncmFtIGluIGEgRGVsaXZlcnkgUHJvY2VzcwotCQkvLyBuZWVkIHRvIG1ha2UgdGhlIG5hbWUgdW5pcXVlCi0vLwkJcmV0dXJuIGdldEVsZW1lbnRSZXNvdXJjZVBhdGgoZSkKLS8vCQkJCSsgU3RyVXRpbC5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVycyhlLmdldE5hbWUoKSkKLS8vCQkJCSsgIl8iICsgZS5nZXRHdWlkKCkgKyAiXyIgKyBkaWFncmFtVHlwZSArIEZJTEVfRVhUX0pQRUc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkKLQkJcmV0dXJuIGdldEVsZW1lbnRSZXNvdXJjZVBhdGgoZSkKLQkJKyBGaWxlTmFtZUdlbmVyYXRvci5JTlNUQU5DRS5nZXRGaWxlTmFtZShlLCAiIiwgIl8iICsgZGlhZ3JhbVR5cGUsIEZJTEVfRVhUX0pQRUcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYbWxFeHBvcnRlZERpYWdyYW1JbWFnZUZpbGVOYW1lKE1ldGhvZEVsZW1lbnQgZSwgU3RyaW5nIGRpYWdyYW1UeXBlLCBTdHJpbmcgZm9ybWF0KSB7Ci0JCVN0cmluZyBzdHIgPSBlLmdldE5hbWUoKSArICIgIiArIGUuZ2V0R3VpZCgpICsgIl8iICsgZGlhZ3JhbVR5cGUgKyBmb3JtYXQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gc3RyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnNvbHV0ZXBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJCi0JCWlmICggcGF0aCA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoIAlwYXRoLnN0YXJ0c1dpdGgoIi8iKSAgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikgCi0JCQkJfHwgcGF0aC5pbmRleE9mKCI6IikgPiAwICkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGZpbGUgYmFzZWQgb24gdGhlIHVybAotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgdXJsCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHBhdGggb2YgdGhlIGNvbnRlbnQgdGhhdCBjb250YWlucyB0aGlzIHVybAotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdGhlIGNvbnRlbnQgcHVibGlzaGluZyByb290Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZVBhdGhGcm9tVXJsKFN0cmluZyB1cmwsIFN0cmluZyBjb250ZW50UGF0aCkgewotCi0JCVN0cmluZyBmaWxlUGF0aCA9IHVybDsKLQkJaWYgKGlzRXh0ZXJuYWxMaW5rKGZpbGVQYXRoKQotCQkJCXx8IGZpbGVQYXRoLnN0YXJ0c1dpdGgoIm1haWx0bzoiKSB8fCBmaWxlUGF0aC5zdGFydHNXaXRoKFVSTF9CT09LTUFSS19JTkRJQ0FUT1IpKSAvLyROT04tTkxTLTEkIAotCQl7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBpbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoTmV0VXRpbC5GSUxFX1BSRUZJWF8zKTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCWZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKE5ldFV0aWwuRklMRV9QUkVGSVhfMy5sZW5ndGgoKSk7Ci0JCX0KLQotCQlpbmRleCA9IGZpbGVQYXRoLmluZGV4T2YoTmV0VXRpbC5GSUxFX1BSRUZJWF8yKTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCWZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKE5ldFV0aWwuRklMRV9QUkVGSVhfMi5sZW5ndGgoKSk7Ci0JCX0KLQkJCi0JCWlmICggaXNBYnNvbHV0ZXBhdGgoZmlsZVBhdGgpICkgewotCQkJLy8gYXNzdW1lIHRoaXMgaXMgYW4gYWJzb2x1dGUgcGF0aAotCQkJcmV0dXJuIFhNTFV0aWwudW5lc2NhcGUoTmV0VXRpbC5kZWNvZGVkRmlsZVVybChmaWxlUGF0aCkpOwotLy8JCQlyZXR1cm4gdXJsOwotCQl9Ci0KLQkJRmlsZSBmID0gbmV3IEZpbGUoY29udGVudFBhdGgpOwotCQkKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW5kZXggPSAwOwotCQl3aGlsZSAoKGYgIT0gbnVsbCkgJiYgKGluZGV4ID0gZmlsZVBhdGguaW5kZXhPZigiLi4vIiwgc3RhcnQpKSA+PSAwKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWYgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCXN0YXJ0ID0gaW5kZXggKyAzOwotCQl9Ci0JCQotCQlTdHJpbmcgcm9vdEZvbGRlciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChmICE9IG51bGwpIHsKLQkJCXJvb3RGb2xkZXIgPSBmLmdldFBhdGgoKTsKLQkJfQotCi0JCWlmIChyb290Rm9sZGVyLmxlbmd0aCgpID4gMCAmJiAhcm9vdEZvbGRlci5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXJvb3RGb2xkZXIgKz0gRmlsZS5zZXBhcmF0b3I7Ci0JCX0KLQotCQkvLyB0aGUgZmlsZSBwYXRoIGlzCi0JCVN0cmluZyBwYXRoID0gcm9vdEZvbGRlcgotCQkJCSsgZmlsZVBhdGguc3Vic3RyaW5nKHN0YXJ0KS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQotCQlyZXR1cm4gWE1MVXRpbC51bmVzY2FwZShOZXRVdGlsLmRlY29kZWRGaWxlVXJsKHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgd2l0aCB1cmwgYmFzZWQgb24gdGhlIG9sZENvbnRlbnRQYXRoLCByZXNvbHZlIHRvCi0JICogdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlIGNvbnRlbnRQYXRoLiBJZiBiYWNrcGF0aCBpcwotCSAqIHNwZWNpZmllZCwgYWRkIHRoZSBiYWNrUGF0aC4gcmV0dXJuIHRoZSB1cGRhdGVkIGNvbnRlbnQuIEEgdHlwaWNhbAotCSAqIHNjZW5hcmlvIGlzIHRoZSBjb250ZW50IGlzIGZyb20gYSBjb250cmlidXRpbmcgZWxlbWVudCwgd2hpY2ggaGFzIHVybHMKLQkgKiByZWxhdGl2ZSB0byB0aGUgY29udHJpYnV0aW5nIGVsZW1lbnQncyBjb250ZW50UGF0aC4gVGhpcyBtZXRob2Qgd2lsbCBmaXgKLQkgKiB0aGUgdXJsIHRvIGJhc2VkIG9uIHRoZSBiYXNlIGVsZW1lbnQncyBjb250ZW50UGF0aC4KLQkgKiAKLQkgKiBTbyBjYWxsIGZpeENvbnRlbnRVcmxQYXRoKGNvbnRyaWJ1dG9yX3RleHQsIGNvbnRyaWJ1dG9yX2VsZW1lbnRQYXRoLAotCSAqIGJhc2VFbGVtZW50X2JhY2tQYXRoKQotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogQHBhcmFtIG9sZENvbnRlbnRQYXRoCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHVwZGF0ZWQgY29udGVudCB3aXRoIGZpeGVkIHBhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZml4Q29udGVudFVybFBhdGgoU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCVN0cmluZyBiYWNrUGF0aCkgewotCQkKLQkJaWYgKCBjb250ZW50UGF0aCA9PSBudWxsIHx8IGJhY2tQYXRoID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gY29udGVudDsKLQkJfQotCQkKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJLy8gcHJvY2VzcyBpbWFnZXMKLQkJCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfaW1hZ2VfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgdXJsID0gbS5ncm91cCgzKTsKLQkJCQl1cmwgPSByZXNvbHZlVXJsKHVybCwgY29udGVudFBhdGgsIGJhY2tQYXRoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKG0uZ3JvdXAoMSkgKyB1cmwgKyBtLmdyb3VwKDQpKSk7Ci0JCQkJfQotCQkJfQotCQkJbS5hcHBlbmRUYWlsKHNiKTsKLQotCQkJY29udGVudCA9IHNiLnRvU3RyaW5nKCk7Ci0JCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQotCQkJLy8gcHJvY2VzcyBhdHRhY2htZW50cwotCQkJbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19yZWZfZ2VuLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmdCdWZmZXIgc2JMaW5rID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCS8vIFN0cmluZyB0YWcgPSBtLmdyb3VwKDEpOwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gIiAiICsgbS5ncm91cCgyKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCi0JCQkJaWYgKFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tVXJsKHVybHRleHQpID09IG51bGwpIHsKLQkJCQkJTWF0Y2hlciBtMiA9IFJlc291cmNlSGVscGVyLnBfbGlua19ocmVmX3BpY2tlcgotCQkJCQkJCS5tYXRjaGVyKHVybHRleHQpOwotCQkJCQlpZiAobTIuZmluZCgpKSB7Ci0JCQkJCQlTdHJpbmcgdXJsID0gbTIuZ3JvdXAoMSkudHJpbSgpLnJlcGxhY2VBbGwoIlwiIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJaWYgKCBpc0V4dGVybmFsTGluayh1cmwpICkgewotCQkJCQkJCS8vIGRlY29kZSBmb3IgZXh0ZXJuYWwgbGluayAKLQkJCQkJCQl1cmwgPSBYTUxVdGlsLnVuZXNjYXBlKE5ldFV0aWwuZGVjb2RlZEZpbGVVcmwodXJsKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXVybCA9IHJlc29sdmVVcmwodXJsLCBjb250ZW50UGF0aCwgYmFja1BhdGgpOwotCQkJCQkJfQotCQkJCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gdXJsdGV4dC5zdWJzdHJpbmcobTIuc3RhcnQoKSwgbTIuc3RhcnQoMSkpCi0JCQkJCQkJCQkrIHVybAotCQkJCQkJCQkJKyB1cmx0ZXh0LnN1YnN0cmluZyhtMi5lbmQoMSksIG0yLmVuZCgpKTsKLQkJCQkJCQkKLQkJCQkJCQltMi5hcHBlbmRSZXBsYWNlbWVudChzYkxpbmssIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJCQkJCW0yLmFwcGVuZFRhaWwoc2JMaW5rKTsKLQkJCQkJCQkKLQkJCQkJCQlyZXBsYWNlbWVudCA9IGNvbnRlbnQuc3Vic3RyaW5nKG0uc3RhcnQoKSwgbS5zdGFydCgyKSkKLQkJCQkJCQkJCSsgc2JMaW5rLnRvU3RyaW5nKCkgKyBjb250ZW50LnN1YnN0cmluZyhtLmVuZCgyKSwgbS5lbmQoKSk7Ci0JCQkJCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCSAqIEBwYXJhbSBiYWNrUGF0aAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVybChTdHJpbmcgdXJsLCBTdHJpbmcgY29udGVudFBhdGgsCi0JCQlTdHJpbmcgYmFja1BhdGgpIHsKLQkJU3RyaW5nIG5ld191cmwgPSBnZXRGaWxlUGF0aEZyb21VcmwodXJsLCBjb250ZW50UGF0aCk7Ci0JCWlmIChpc0Fic29sdXRlcGF0aChuZXdfdXJsKSkKLQkJCXJldHVybiBuZXdfdXJsOwotCQlpZiAobmV3X3VybCAhPSBudWxsICYmICFuZXdfdXJsLmVxdWFscyh1cmwpICkgewotCQkJaWYgKGJhY2tQYXRoICE9IG51bGwpIHsKLQkJCQluZXdfdXJsID0gYmFja1BhdGggKyBuZXdfdXJsOwotCQkJfQotCi0JCQlyZXR1cm4gbmV3X3VybC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9VUkxfU1RBUlRfV0lUSCA9IExheW91dFJlc291cmNlcwotCQkJLmdldFN0cmluZygiZXh0ZXJuYWxVcmxfc3RhcnRXaXRoIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2V4dGVybmFsX3VybF9zdGFydFdpdGggPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJIigiICsgRVhURVJOQUxfVVJMX1NUQVJUX1dJVEggKyAiKSIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBjaGVjayBpZiB0aGlzIGlzIGFuIGV4dGVybmFsIHVybCBvciBub3QKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRXh0ZXJuYWxMaW5rKFN0cmluZyB1cmwpIHsKLQkJLy8gMTYyOTY5IC0gUmVmaW5lIGV4dGVybmFsIGxpbmsncyByZWd1bGFyIGV4cCBpbiBlcGYubGlicmFyeS9sYXlvdXQvTGF5b3V0UmVzb3VyY2VzLnByb3BlcnRpZXMKLQkJLy8gZmlsZTovLyBzaG91bGQgYmUgZXhjbHVkZWQKLQkJaWYgKCB1cmwgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJdXJsID0gdXJsLnRvTG93ZXJDYXNlKCk7Ci0JCWlmICggdXJsLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSApIHsgIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCB1cmwuc3RhcnRzV2l0aCgiaHR0cDovLyIpIAkvLyROT04tTkxTLTEkCi0JCQkJfHwgdXJsLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJmdHA6Ly8iKSAgLy8kTk9OLU5MUy0xJAotCQkJCXx8IHVybC5zdGFydHNXaXRoKCJ3d3cuIikgKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlNYXRjaGVyIG0gPSBwX2V4dGVybmFsX3VybF9zdGFydFdpdGgubWF0Y2hlcih1cmwpOwotCQlpZiAobS5maW5kKCkpIHsKLQkJCXJldHVybiAobS5zdGFydCgxKSA9PSAwKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF2YXNjcmlwdFVybChTdHJpbmcgdXJsKSB7Ci0JCWlmICh1cmwgPT0gbnVsbCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoVVJMX1NUUl9NQUlMVE8pCi0JCQkJfHwgdXJsLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVUkxfU1RSX0pBVkFTQ1JJUFQpOwotCX0KLQkKLQkvKioKLQkgKiBmaW5kIHRoZSByZXNvdXJjZSBmaWxlIGJhc2VkIG9uIHRoZSB1cmwsIGNvcHkgdGhlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uCi0JICogZm9sZGVyLiBpZiB0aGUgZmlsZSBpcyBhbiBodG1sIGF0dGFjaG1lbnQsIHNjYW4gdGhlIGZpbGUgcmVjdXJzaXZlbHkgYW5kCi0JICogY29weSBjb250YWluZWQgaW1hZ2VzLCByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50LCB0aGUgb3duZXIgZWxlbWVudAotCSAqIEBwYXJhbSByZXNvdXJjZUZpbGUKLQkgKiAgICAgICAgICAgIEZpbGUsIHRoZSByZXNvdXJjZSBmaWxlCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSB1cmwgdG8gYmUgcHJvY2Vzc2VkCi0JICogQHBhcmFtIGNvbnRlbnRQYXRoCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgdXJsIG93bmVyLCByZWxhdGl2ZSB0byB0aGUKLQkgKiAgICAgICAgICAgIHNvdXJjZSByb290IHBhdGgKLQkgKiBAcGFyYW0gc291cmNlUm9vdFBhdGgKLQkgKiAgICAgICAgICAgIEZpbGUgdGhlIHNvdXJjZSByb290IHBhdGgsIHVzdWFsbHkgaXQncyB0aGUgbGlicmFyeSByb290IHBhdGgKLQkgKiBAcGFyYW0gdGFyZ2V0Um9vdFBhdGgKLQkgKiAgICAgICAgICAgIEZpbGUgdGhlIHRhcmdldCByb290IHBhdGgsIHVzdWFsbHkgaXQncyB0aGUgcHVibGlzaGluZyByb290Ci0JICogICAgICAgICAgICBwYXRoCi0JICogQHBhcmFtIHJvb3RDb250ZW50UGF0aCBTdHJpbmcgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgcm9vdAotCSAqIEBwYXJhbSBwcm9jZXNzZWRJdGVtcwotCSAqICAgICAgICAgICAgTGlzdCwgYSBsaXN0IHRvIGhvbGQgYWxsIHByb2Nlc3NlZCB1cmxzLCB0byBhdm9pZCBkdXBsaWNhdGUKLQkgKiAgICAgICAgICAgIHByb2Nlc3NpbmcKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICBJQ29udGVudFZhbGlkYXRvcgotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSBmaXhlZCB1cmwsIG5vdCB1c2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2Nlc3NSZXNvdXJjZVVybChNZXRob2RFbGVtZW50IG93bmVyLAotCQkJRmlsZSByZXNvdXJjZUZpbGUsIFN0cmluZyB1cmwsIFN0cmluZyBjb250ZW50UGF0aCwKLQkJCUZpbGUgc291cmNlUm9vdFBhdGgsIEZpbGUgdGFyZ2V0Um9vdFBhdGgsIFN0cmluZyByb290Q29udGVudFBhdGgsIExpc3QgcHJvY2Vzc2VkSXRlbXMsCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHVybCA9PSBudWxsIHx8IGlzRXh0ZXJuYWxMaW5rKHVybCkgfHwgaXNKYXZhc2NyaXB0VXJsKHVybCkKLQkJCQl8fCB1cmwuc3RhcnRzV2l0aChVUkxfQk9PS01BUktfSU5ESUNBVE9SKSkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCQkKLQkJLy8gaWYgdGhlIHVybCBjb250YWlucyB0aGUgZ3VpZCwgaXQgbWlnaHQgYmUgc29tZSBraW5kIG9mIGVsZW1lbnQgbGluaywKLQkJLy8gZm9yIGV4YW1wbGUsIGFjdGl2aXR5IGNhbiBoYXZlIG1vZGVsIHRoYW4gb25lIGVsZW1lbnQgbGluawotCQlTdHJpbmcgZ3VpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvd25lciAhPSBudWxsKSB7Ci0JCQlndWlkID0gb3duZXIuZ2V0R3VpZCgpOwotCQkJaWYgKHVybC5pbmRleE9mKGd1aWQpID49IDAgfHwgaXNBY3Rpdml0eVRhYlVybCh1cmwpICkgewkJCQkKLQkJCQlyZXR1cm4gdXJsOwotCQkJfQkJCQotCQl9Ci0JCQotCQkvLyBQdWJsaXNoaW5nIHJlcG9ydCBsaXN0cyBtaXNzaW5nIHJlc291cmNlIGZpbGVzIHRoYXQKLQkJLy8gYXJlIHByZXNlbnQKLQkJLy8gYm9va21hcmtzIHNob3VsZCBiZSBzdHJpcHBlZCBvdXQgd2hlbiBjaGVja2luZyByZXNvdXJjZQotCQlpbnQgaW5kZXggPSB1cmwuaW5kZXhPZihVUkxfQk9PS01BUktfSU5ESUNBVE9SKTsKLQkJaWYgKGluZGV4IDwgMCkgewotCQkJaW5kZXggPSB1cmwuaW5kZXhPZihVUkxfUEFSQU1FVEVSX0lORElDQVRPUik7Ci0JCX0KLQotCQlTdHJpbmcgdXJsX3RhaWwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQl1cmxfdGFpbCA9IHVybC5zdWJzdHJpbmcoaW5kZXgpOwotCQkJdXJsID0gdXJsLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCX0KLQotCQlTdHJpbmcgaW1hZ2VGaWxlID0gUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZVBhdGhGcm9tVXJsKHVybCwgY29udGVudFBhdGgpOwotCQlpZiAoaW1hZ2VGaWxlID09IG51bGwpIHsKLQkJCWlmICh2YWxpZGF0b3IgIT0gbnVsbCkgewotCQkJCXZhbGlkYXRvci5sb2dNaXNzaW5nUmVzb3VyY2Uob3duZXIsIHJlc291cmNlRmlsZSwgdXJsKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQkKLQkJLy8gaW5kZXguaHRtIGlzIHRoZSBkZWZhdWx0IGluZGV4IGZpbGUsIGFsd2F5cyBpZ25vcmUgaXQKLQkJaWYgKGltYWdlRmlsZS5lcXVhbHNJZ25vcmVDYXNlKCJpbmRleC5odG0iKSB8fCBpbWFnZUZpbGUuZXF1YWxzSWdub3JlQ2FzZSgiaW5kZXguaHRtbCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJewotCQkJcmV0dXJuIHVybCArIHVybF90YWlsOwotCQl9Ci0KLQkJU3RyaW5nIG5ld1VybCA9IHVybDsKLQotCQlGaWxlIHNvdXJjZTsKLQkJRmlsZSBkZXN0OwotCQkKLQkJLy8gaWYgdGhlIHVybCBpcyBhIGxvY2FsIGZpbGUgaW4gYW4gYWJzb2x1dGUgcGF0aCwgd2UgZG9uJ3QgY29weSB0aGUgZmlsZSwgbGVhdmUgYXMgaXMKLQkJc291cmNlID0gbmV3IEZpbGUoaW1hZ2VGaWxlKTsKLQkJaWYgKCBzb3VyY2UuZXhpc3RzKCkgKSB7Ci0JCQlyZXR1cm4gdXJsICsgdXJsX3RhaWw7Ci0JCX0KLQotCQkvLyBpZiByb290IENvbnRlbnQgcGF0aCBpcyBzZXQsIHJlbW92ZSBmcm9tIHRoZSBmaWxlIHBhdGgKLQkJYm9vbGVhbiB1c2VQdWJSb290ID0gdHJ1ZTsKLQkJU3RyaW5nIGZpbGVQYXRoID0gaW1hZ2VGaWxlOwotCQlpZiAoIHJvb3RDb250ZW50UGF0aCAhPSBudWxsICYmIHJvb3RDb250ZW50UGF0aC5sZW5ndGgoKSA+IDAgKSB7Ci0JCQlpZiAoIGZpbGVQYXRoLnN0YXJ0c1dpdGgocm9vdENvbnRlbnRQYXRoKSApIHsKLQkJCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZyhyb290Q29udGVudFBhdGgubGVuZ3RoKCkpOwotCQkJCXVzZVB1YlJvb3QgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBjaGVjayBpZiB0aGlzIGlzIGEgcmVhbCBmaWxlLCBpZiBub3QsIGl0IGlzIGEgcmVmZXJlbmNlIHRvIGEgYmFzZQotCQkvLyBwbHVnaW4KLQkJc291cmNlID0gbmV3IEZpbGUoc291cmNlUm9vdFBhdGgsIGZpbGVQYXRoKTsKLQkJCi0JCS8vIGlmIHRoZSBzb3VyY2UgZG9lcyBub3QgZXhpc3QsIG1pZ2h0IGJlIGEgcmVmZXJlbmNlIHRvIGEgcmVzb3VyY2UgaW4gYW5vdGhlciBwbHVnaW4/Ci0JCS8vIGZvciBleGFtcGxlLCBpZiB0aGUgY29udGVudCBpcyBjb250cmlidXRlZCBmcm9tIGFub3RoZXIgZWxlbWVudCBpbiBhbm90aGVyIHBsdWdpbiwgdGhpcyB3aWxsIGhhcHBlbgotCQlpZiAoIXNvdXJjZS5leGlzdHMoKSkgewotCQkJSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXIgbWdyID0gZ2V0UmVzb3VyY2VNZ3Iob3duZXIpOwotCQkJaWYgKCBtZ3IgIT0gbnVsbCApIHsKLQkJCQlTdHJpbmcgdG1wUGF0aCA9IG1nci5yZXNvbHZlKG93bmVyLCBmaWxlUGF0aCk7Ci0JCQkJaWYgKCB0bXBQYXRoICE9IG51bGwgKSB7Ci0JCQkJCXNvdXJjZSA9IG5ldyBGaWxlKHRtcFBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gaWYgdGhlIGZpbGUgaXMgbm90IGluIHRoZSBsaWJyYXJ5LCBjaGVjayB0aGUgcGx1Z2luIGxheW91dCBmb2xkZXIKLQkJaWYgKCFzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXNvdXJjZSA9IG5ldyBGaWxlKExpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExheW91dFBhdGgoKSwKLQkJCQkJZmlsZVBhdGgpOwotCQl9Ci0KLQkJLy8gaWYgdGhlIGZpbGVQYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBwdWIgcm9vdCwgZml4IHRoZSB0YXJnZXQgcGF0aAotCQlpZiAoIHVzZVB1YlJvb3QgJiYgcm9vdENvbnRlbnRQYXRoICE9IG51bGwgJiYgcm9vdENvbnRlbnRQYXRoLmxlbmd0aCgpID4gMCApIHsKLQkJCUZpbGUgdG1wZiA9ICBuZXcgRmlsZShyb290Q29udGVudFBhdGgpOwotCQkJd2hpbGUgKCB0bXBmICE9IG51bGwgKSB7Ci0JCQkJdG1wZiA9IHRtcGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJCXRhcmdldFJvb3RQYXRoID0gdGFyZ2V0Um9vdFBhdGguZ2V0UGFyZW50RmlsZSgpOwotCQkJfQotCQl9Ci0JCQotCQlkZXN0ID0gbmV3IEZpbGUodGFyZ2V0Um9vdFBhdGgsIGZpbGVQYXRoKTsKLQotCQlpZiAoc291cmNlLmV4aXN0cygpKSB7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShzb3VyY2UsIGRlc3QpOwotCi0JCQkvLyBpZiB0aGUgZmlsZSBpcyBhbiBodG1sIGF0dGFjaG1lbnQsIG5lZWQgdG8gc2NhbiB0aGUgZmlsZSBhbmQgY29weQotCQkJLy8gdGhlIHJlZmVyZW5jZWQgZmlsZSBpbiBpdCwgcmVjdXJzaXZlbHkKLQkJCWlmIChpbWFnZUZpbGUuZW5kc1dpdGgoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNKQotCQkJCQl8fCBpbWFnZUZpbGUuZW5kc1dpdGgoUmVzb3VyY2VIZWxwZXIuRklMRV9FWFRfSFRNTCkpIHsKLQkJCQlGaWxlIGYgPSBuZXcgRmlsZShpbWFnZUZpbGUpOwotCQkJCXRyeSB7Ci0JCQkJCXJlc29sdmVSZXNvdXJjZXMob3duZXIsIGYsIEZpbGVVdGlsLnJlYWRGaWxlKHNvdXJjZSwKLQkJCQkJCQlGaWxlVXRpbC5FTkNPRElOR19VVEZfOCkudG9TdHJpbmcoKSwgZi5nZXRQYXJlbnQoKSwKLQkJCQkJCQlzb3VyY2VSb290UGF0aCwgdGFyZ2V0Um9vdFBhdGgsIHJvb3RDb250ZW50UGF0aCwgcHJvY2Vzc2VkSXRlbXMsCi0JCQkJCQkJdmFsaWRhdG9yKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIHRoZXJlLCBtaWdodCBiZSBnZW5lcmF0ZWQgZHluYW1pY2FsbHksIHNvCi0JCS8vIGRvbid0IGxvZyBpdAotCQllbHNlIGlmICghZGVzdC5leGlzdHMoKSAmJiBpc1ZhbGlkRmlsZVVybCh1cmwpICYmICh2YWxpZGF0b3IgIT0gbnVsbCkpIHsKLQkJCXZhbGlkYXRvci5sb2dNaXNzaW5nUmVzb3VyY2Uob3duZXIsIHJlc291cmNlRmlsZSwgdXJsKTsKLQkJfQotCi0JCXJldHVybiBuZXdVcmwgKyB1cmxfdGFpbDsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBY3Rpdml0eVRhYlVybChTdHJpbmcgdXJsKSB7Ci0JCXJldHVybiBBY3Rpdml0eUxheW91dC5pc0FjdGl2aXR5VGFiVXJsKHVybCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZpbGVVcmwoU3RyaW5nIHVybCkgewotCQkvLyBqdXN0IGEgdGVtcCBzb2x1dGlvbiBoZXJlIHRvIGdldCByaWQgb2YgdGhlIHdyb25nIHJlcG9ydGluZyBvZiBtc3NpbmcKLQkJLy8gcmVzb3VyY2UKLQkJaWYgKHVybCA9PSBudWxsIHx8IHVybC5lcXVhbHMoIicgKyBkaWFncmFtX2ltZyArICciKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBpbWFnZXMgaW4gdGhlIHRleHQuIGNvcHkgdGhlIGltYWdlIHRvIGRlc3RpbmF0aW9uIGlmIG5lZWRlZAotCSAqIFRoaXMgaXMgdXNlZCBmb3IgY29weWluZyByZXNvdXJjZXMgZnJvbSBhIGxpYnJhcnkgdG8gYW5vdGhlciBkZXN0aW5hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCwgdGhlIG93bmVyIGVsZW1lbnQKLQkgKiBAcGFyYW0gcmVzb3VyY2VGaWxlCi0JICogICAgICAgICAgICBGaWxlLCB0aGUgcmVzb3VyY2UgZmlsZQotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGNvbnRlbnQgc3RyaW5nIHRvIGJlIHByb2Nlc3NlZAotCSAqIEBwYXJhbSBjb250ZW50UGF0aAotCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSBjb250ZW50IHBhdGggb2YgdGhlIHNvdXJjZSB0ZXh0LCByZWxhdGl2ZSB0byB0aGUKLQkgKiAgICAgICAgICAgIHNvdXJjZSByb290IHBhdGgKLQkgKiBAcGFyYW0gc291cmNlUm9vdFBhdGgKLQkgKiAgICAgICAgICAgIEZpbGUgdGhlIHNvdXJjZSByb290IHBhdGgsIHVzdWFsbHkgaXQncyB0aGUgbGlicmFyeSByb290IHBhdGgKLQkgKiBAcGFyYW0gdGFyZ2V0Um9vdFBhdGgKLQkgKiAgICAgICAgICAgIEZpbGUgdGhlIHRhcmdldCByb290IHBhdGgsIHVzdWFsbHkgaXQncyB0aGUgcHVibGlzaGluZyByb290Ci0JICogICAgICAgICAgICBwYXRoCi0JICogQHBhcmFtIHJvb3RDb250ZW50UGF0aCBTdHJpbmcgdGhlIGNvbnRlbnQgcGF0aCBvZiB0aGUgcm9vdAotCSAqIEBwYXJhbSBwcm9jZXNzZWRJdGVtcwotCSAqICAgICAgICAgICAgTGlzdCwgYSBsaXN0IHRvIGhvbGQgYWxsIHByb2Nlc3NlZCB1cmxzLCB0byBhdm9pZCBkdXBsaWNhdGUKLQkgKiAgICAgICAgICAgIHByb2Nlc3NpbmcKLQkgKiBAcGFyYW0gdmFsaWRhdG9yCi0JICogICAgICAgICAgICBJQ29udGVudFZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNvbHZlUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgb3duZXIsIEZpbGUgcmVzb3VyY2VGaWxlLAotCQkJU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBjb250ZW50UGF0aCwgRmlsZSBzb3VyY2VSb290UGF0aCwKLQkJCUZpbGUgdGFyZ2V0Um9vdFBhdGgsIFN0cmluZyByb290Q29udGVudFBhdGgsIExpc3QgcHJvY2Vzc2VkSXRlbXMsCi0JCQlJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdHJ5IHsKLQkJCS8vIHByb2Nlc3MgaW1hZ2VzCi0JCQlNYXRjaGVyIG0gPSBSZXNvdXJjZUhlbHBlci5wX2ltYWdlX3JlZi5tYXRjaGVyKGNvbnRlbnQpOwotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHVybCA9IG0uZ3JvdXAoMyk7Ci0JCQkJaWYgKCFwcm9jZXNzZWRJdGVtcy5jb250YWlucyh1cmwpKSB7Ci0JCQkJCS8vIG5vdGU6IGFkZCB0aGUgdXJsIGludG8gdGhlIHByb2Nlc3NlZEl0ZW1zIGxpc3QgZmlyc3QsCi0JCQkJCS8vIG90aGVyd2lzZSBtYXkgZ2V0IGRlYWRsb2NrIGlmIHRoZSB1cmwgY29udGVudCBoYXMKLQkJCQkJLy8gcmVmZXJlbmNlIGJhY2sgdG8gdGhlIG93bmVyCi0JCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZCh1cmwpOwotCQkJCQlSZXNvdXJjZUhlbHBlci5wcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHJlc291cmNlRmlsZSwgdXJsLAotCQkJCQkJCWNvbnRlbnRQYXRoLCBzb3VyY2VSb290UGF0aCwgdGFyZ2V0Um9vdFBhdGgsIHJvb3RDb250ZW50UGF0aCwgCi0JCQkJCQkJcHJvY2Vzc2VkSXRlbXMsIHZhbGlkYXRvcik7Ci0JCQkJfQotCQkJfQotCi0JCQltID0gUmVzb3VyY2VIZWxwZXIucF9jc3NfcmVmLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQlTdHJpbmcgY3NzVVJMID0gbS5ncm91cCgxKTsKLQotCQkJCS8vIGl0J3MgaGFyZCB0byB0ZWxsIGlmIHRoaXMgaXMgYSByaWdodCBtYXRjaCBvciBub3QKLQkJCQkvLyBzaW5jZSB3ZSBjYW4ndCB0ZWxsIGlmIHRoZSBtYXRjaGVkIG9uZSBpcyBhY3R1YWxseSBmcm9tIGEgY3NzCi0JCQkJLy8gb3IganVzdCBhIGh0bWwgdGV4dAotCQkJCS8vIGZvciBleGFtcGxlLCB0ZXh0IGNhbiBoYXZlIHNvbWV0aGluZyBsaWtlIHVybCh4eHgpIHdoaWNoIGlzCi0JCQkJLy8gbWF0Y2hlZCBoZXJlCi0JCQkJLy8gd2UgZG9uJ3Qgd2FudCB0byByZXBvcnQgbWlzc2luZyByZXNvdXJjZSBmb3IgdGhpcwotCQkJCS8vIHNvIGRvbid0IHNldCB0aGUgdmFsaWRhdG9yCi0JCQkJLy8gUHVibGlzaGluZyB3YXJuaW5nczogaW5hcHByb3ByaWF0ZSB3YXJuaW5ncwotCQkJCS8vIGNvbWluZyBmcm9tIHJlcXVpcmVkIGNvcHlyaXRlLmh0bQotCi0JCQkJaWYgKCFwcm9jZXNzZWRJdGVtcy5jb250YWlucyhjc3NVUkwpKSB7Ci0JCQkJCS8vIG5vdGU6IGFkZCB0aGUgdXJsIGludG8gdGhlIHByb2Nlc3NlZEl0ZW1zIGxpc3QgZmlyc3QsCi0JCQkJCS8vIG90aGVyd2lzZSBtYXkgZ2V0IGRlYWRsb2NrIGlmIHRoZSB1cmwgY29udGVudCBoYXMKLQkJCQkJLy8gcmVmZXJlbmNlIGJhY2sgdG8gdGhlIG93bmVyCi0JCQkJCXByb2Nlc3NlZEl0ZW1zLmFkZChjc3NVUkwpOwotCQkJCQlSZXNvdXJjZUhlbHBlcgotCQkJCQkJCS5wcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsIHJlc291cmNlRmlsZSwgY3NzVVJMLAotCQkJCQkJCQkJY29udGVudFBhdGgsIHNvdXJjZVJvb3RQYXRoLAotCQkJCQkJCQkJdGFyZ2V0Um9vdFBhdGgsIHJvb3RDb250ZW50UGF0aCwgcHJvY2Vzc2VkSXRlbXMsIG51bGwvKiB2YWxpZGF0b3IgKi8pOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gcHJvY2VzcyBhdHRhY2htZW50cwotCQkJbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19yZWZfZ2VuLm1hdGNoZXIoY29udGVudCk7Ci0JCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCQkvLyBTdHJpbmcgdGFnID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgdXJsdGV4dCA9IG0uZ3JvdXAoMik7Ci0JCQkJaWYgKFJlc291cmNlSGVscGVyLmdldEd1aWRGcm9tVXJsKHVybHRleHQpID09IG51bGwpIHsKLQkJCQkJTWF0Y2hlciBtMiA9IFJlc291cmNlSGVscGVyLnBfbGlua19ocmVmX3BpY2tlcgotCQkJCQkJCS5tYXRjaGVyKCIgIiArIHVybHRleHQgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKG0yLmZpbmQoKSkgewotCQkJCQkJU3RyaW5nIHVybCA9IG0yLmdyb3VwKDEpLnRyaW0oKS5yZXBsYWNlQWxsKCJcIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlpZiAoIXByb2Nlc3NlZEl0ZW1zLmNvbnRhaW5zKHVybCkpIHsKLQkJCQkJCQkvLyBub3RlOiBhZGQgdGhlIHVybCBpbnRvIHRoZSBwcm9jZXNzZWRJdGVtcyBsaXN0Ci0JCQkJCQkJLy8gZmlyc3QsIG90aGVyd2lzZSBtYXkgZ2V0IGRlYWRsb2NrIGlmIHRoZSB1cmwKLQkJCQkJCQkvLyBjb250ZW50IGhhcyByZWZlcmVuY2UgYmFjayB0byB0aGUgb3duZXIKLQkJCQkJCQlwcm9jZXNzZWRJdGVtcy5hZGQodXJsKTsKLQkJCQkJCQlSZXNvdXJjZUhlbHBlci5wcm9jZXNzUmVzb3VyY2VVcmwob3duZXIsCi0JCQkJCQkJCQlyZXNvdXJjZUZpbGUsIHVybCwgY29udGVudFBhdGgsCi0JCQkJCQkJCQlzb3VyY2VSb290UGF0aCwgdGFyZ2V0Um9vdFBhdGgsIHJvb3RDb250ZW50UGF0aCwgCi0JCQkJCQkJCQlwcm9jZXNzZWRJdGVtcywgdmFsaWRhdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRha2UgdGhlIHRhZyBhdHRyaWJ1dGVzIHN0cmluZyBhcyBpbnB1dCBhbmQgcmV0dXJucyB0aGUgYXR0cmlidXRlCi0JICogbmFtZS12YWx1ZSBtYXAKLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlc1N0cgotCSAqIEByZXR1cm4gTWFwIHRoZSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBtYXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRUYWdBdHRyaWJ1dGVzKFN0cmluZyBhdHRyaWJ1dGVzU3RyKSB7Ci0JCXRyeSB7Ci0JCQkvLyB1c2UgTGlua2VkSGFzaE1hcCB0byByZXNlcnZlIHRoZSBvcmRlciBvZiB0aGUgYXR0cmlidXRlcwotCQkJTWFwIGF0dHJpYnV0ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKDMpOwotCQkJTWF0Y2hlciBtMiA9IHBfdGFnX2F0dHJpYnV0ZXMubWF0Y2hlcihhdHRyaWJ1dGVzU3RyKTsKLQotCQkJd2hpbGUgKG0yLmZpbmQoKSkgewotCQkJCVN0cmluZyBhdHRyTmFtZSA9IG0yLmdyb3VwKDEpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCVN0cmluZyBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChtMi5ncm91cCgzKSAhPSBudWxsKSB7Ci0JCQkJCWF0dHJWYWx1ZSA9IG0yLmdyb3VwKDMpLnRyaW0oKTsKLQkJCQl9IGVsc2UgaWYgKG0yLmdyb3VwKDIpICE9IG51bGwpIHsKLQkJCQkJYXR0clZhbHVlID0gbTIuZ3JvdXAoMikudHJpbSgpOwotCQkJCX0JCQkJCi0JCQotCQkJCS8vIENhbm5vdCBQcmV2aWV3L0Jyb3dzZSBEZXNjcmlwdGlvbiBUYWIgd2hlbgotCQkJCS8vIHRoZSBDUCBjb250YWlucyBjaGluZXNlIGNoYXJhY3RlcnMKLQkJCQkvLyBnZW5lcmF0ZWQgaHRtbCBmcm9tIHhzbHQgZ290IHRoZSBocmVmIHVybHMgZW5jb2RlZC4gd2UgZG9uJ3Qgd2FudAotCQkJCS8vIHRoYXQgbWFrZSBzdXJlIGRlY29kZSB0aGUgdXJsIHVzaW5nICJVVEYtOCIgZW5jb2RpbmcKLQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKFRBR19BVFRSX0hSRUYpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlhdHRyVmFsdWUgPSBVUkxEZWNvZGVyLmRlY29kZShhdHRyVmFsdWUsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQkJCQkJCi0JCQkJfQotCQkJCWF0dHJpYnV0ZU1hcC5wdXQoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYXR0cmlidXRlTWFwOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewkJCQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBtYXAgZm9yIGFuIEhUTUwgbGluawotCSAqIAotCSAqIEBwYXJhbSBsaW5rCi0JICogQHJldHVybiBNYXAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRBdHRyaWJ1dGVzRnJvbUxpbmsoU3RyaW5nIGxpbmspIHsKLQkJTWF0Y2hlciBtID0gcF9saW5rX3JlZi5tYXRjaGVyKGxpbmspOwotCQlpZiAobS5maW5kKCkpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVzID0gbS5ncm91cCgxKTsKLQkJCXJldHVybiBnZXRUYWdBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIG1hcCBmb3IgYW4gSFRNTCBsaW5rCi0JICogCi0JICogQHBhcmFtIGxpbmsKLQkgKiBAcmV0dXJuIE1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEF0dHJpYnV0ZXNGcm9tTGluayhQYXR0ZXJuIHBhdHRlcm4sIFN0cmluZyBsaW5rKSB7Ci0JCU1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihsaW5rKTsKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlcyA9IG0uZ3JvdXAoMSk7Ci0JCQlyZXR1cm4gZ2V0VGFnQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogdGFrZXMgYW4gYXR0cmlidXRlTWFwIChpZSwgZnJvbSAjZ2V0VGFnQXR0cmlidXRlcykgYW5kIHJldHVybnMgdGhlIFN0cmluZwotCSAqIHJlcHJlc2VudGF0aW9uCi0JICogCi0JICogQHBhcmFtIGF0dHJpYnV0ZU1hcAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlc0FzU3RyaW5nKE1hcCBhdHRyaWJ1dGVNYXApIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChrZXkpOwotCQkJaWYgKGJ1Zi5sZW5ndGgoKSA+IDApCi0JCQkJYnVmLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWYuYXBwZW5kKGtleSArICI9XCIiICsgdmFsdWUgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEJhZCBsaW5rIGZyb20gV2VsY29tZSBwYWdlIGh1bXAgY2hhcnQKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RGlzY2FyZGVkRWxlbWVudFVSTChNZXRob2RFbGVtZW50IG93bmVyRWxlbWVudCwKLQkJCU1ldGhvZEVsZW1lbnQgbGlua0VsZW1lbnQsIFN0cmluZyBndWlkLCBTdHJpbmcgcHViRGlyKSB7Ci0JCVN0cmluZ0J1ZmZlciBkaXNjYXJkZWRFbGVtZW50VVJMID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWRpc2NhcmRlZEVsZW1lbnRVUkwuYXBwZW5kKE1JU1NJTkdfUEFHRVNfRk9MREVSKS5hcHBlbmQoCi0JCQkJInBhZ2VzX25vdF9pbnN0YWxsZWQiKS5hcHBlbmQoRklMRV9FWFRfSFRNTCk7IC8vJE5PTi1OTFMtMSQKLQotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShwdWJEaXIsIGRpc2NhcmRlZEVsZW1lbnRVUkwudG9TdHJpbmcoKSk7Ci0JCUZpbGUgZGlyID0gb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmICghZGlyLmV4aXN0cygpKSB7Ci0JCQlkaXIubWtkaXJzKCk7Ci0JCX0KLQotCQkvLyBnZW5lcmF0ZSB0aGUgaHRtbCBmaWxlCi0JCVhtbEVsZW1lbnQgeG1sID0gbmV3IFhtbEVsZW1lbnQoIkVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXhtbAotCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBndWlkKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCBsaW5rRWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbGlua0VsZW1lbnQuZ2V0TmFtZSgpKSAvLyROT04tTkxTLTEkCi0JCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCSJwbHVnaW5OYW1lIiwgTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKGxpbmtFbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCQkJCQkJCQkKLQkJU3RyaW5nIHhzbFBhdGggPSBMYXlvdXRSZXNvdXJjZXMuZ2V0RGVmYXVsdFhzbFBhdGgoInBhZ2Vfbm90X2luc3RhbGxlZCIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJ5IHsKLQkJCVN0cmluZ0J1ZmZlciB4bWwyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sMi5hcHBlbmQoWG1sSGVscGVyLlhNTF9IRUFERVIpLmFwcGVuZCh4bWwudG9YbWwoKSk7Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKSwgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi9sYXlvdXQveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJWFNMVFByb2Nlc3NvcgotCQkJCQkudHJhbnNmb3JtKHhzbFBhdGgsIHhtbDIudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBvdXRwdXQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCXJldHVybiBnZXRCYWNrUGF0aChvd25lckVsZW1lbnQpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpCi0JCQkJKyBkaXNjYXJkZWRFbGVtZW50VVJMLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCQotCS8qKgotCSAqIEZPUiBVU0UgV0lUSCBSSUNIIFRFWFQgRURJVE9SCi0JICogdmFsaWRhdGUgdGhlIGNvbnRlbnQgYnkgY2hlY2tpbmcgZWxlbWVudCBsaW5rcyBhbmQgaW1hZ2VzLCBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgb3duZXIKLQkgKiAKLQkgKiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgdmFsaWRhdGVDb250ZW50IG1ldGhvZCwgZXhjZXB0IGl0IGRvZXMgbm90IGRlY29kZSB0aGUgcmVzdWx0cwotCSAqIHZpYSBVUkxEZWNvZGVyLmRlY29kZSgpCi0JICogCi0JICogIHRoaXMgd2lsbCBkbyB0aGUgZm9sbG93aW5nIHRvIHRoZSBIVE1MOgotCSAqICAxLiAgdXBkYXRlIEVsZW1lbnQgTGlua3MKLQkgKiAgMi4gIGNoYW5nZSA8QSAuLj4gdG8gPGEgLi4+Ci0JICogIDMuICBjaGFuZ2UgPC9BPiB0byA8L2E+Ci0JICogIDQuICBhZGQgZG91YmxlLXF1b3RlcyAoIikgYXJvdW5kIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIGlmIHRoZXkgYXJlIG1pc3NpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudCwgdGhlIGVsZW1lbnQgdGhhdCBvd25zIHRoZSBjb250ZW50Ci0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBNZXRob2RDb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHRvIHdoaWNoIHRoZSBjb250ZW50IGlzCi0JICogICAgICAgICAgICB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0gbGlua2VkRWxlbWVudHMKLQkgKiAgICAgICAgICAgIExpc3QgYSBwYXNzZWQgaW4gbGlzdCB0byBjb2xsZWN0IHRoZSBsaW5rZWQgZWxlbWVudHMgaW4gdGhpcwotCSAqICAgICAgICAgICAgY29udGVudCwgaWYgbnVsbCwgbm8gbGlua2VkIGVsZW1lbnRzIGFyZSBjb2xsZWN0ZWQuCi0JICogQHJldHVybiBTdHJpbmcgdGhlIHZhbGlkYXRlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGVSaWNoVGV4dENvbnRlbnQoTWV0aG9kRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgc291cmNlLCBJQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLSAJCXRyeSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IG51bGw7Ci0JCQkKLQkJCS8vIGZpcnN0IHZhbGlkYXRlIHRoZSB0YWdzLCByZW1vdmUgYW55IENGL0xGIGZyb20gdGhlIHRhZyB0ZXh0Ci0JCQlzb3VyY2UgPSB2YWxpZGF0ZVRhZyhzb3VyY2UpOwotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlNYXRjaGVyIG0gPSBwX2xpbmtfcmVmLm1hdGNoZXIoc291cmNlKTsKLQotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0KLQkJCQkvLyBQcm9ibGVtcyBwYXJzaW5nIDxhIGhyZWY+IHRhZ3MKLQkJCQkvLyBuZWVkIHRvIHJlbW92ZSBhbGwgTEYsIENSIHdpdGhpbiB0aGUgPGEgLi4+IHRhZwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlTdHJpbmcgbGlua2VkVGV4dCA9IG0uZ3JvdXAoMik7Ci0JCQkJTGlua0luZm8gaW5mbyA9IHZhbGlkYXRvci52YWxpZGF0ZUxpbmsoZWxlbWVudCwgdXJsdGV4dCwKLQkJCQkJCWxpbmtlZFRleHQsIGNvbmZpZywgImEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJdGV4dCA9IGluZm8uZ2V0SHRtbCh2YWxpZGF0b3Iuc2hvd0Jyb2tlbkxpbmtzKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgZSA9IGluZm8uZ2V0TGlua2VkRWxlbWVudCgpOwotCQkJCQlpZiAoZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWxpZGF0b3IuYWRkUmVmZXJlbmNlZEVsZW1lbnQoZWxlbWVudCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwoImZpbGU6Ly8vIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnJlcGxhY2VBbGwoImZpbGU6Ly8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlZ0V4cEVzY2FwZShyZXBsYWNlbWVudCkpOwotCQkJfQotCi0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGFsc28gZml4IHRoZSBhcmVhIG1hcAotCQkJc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJCW0gPSBwX2FyZWFfcmVmLm1hdGNoZXIoc291cmNlKTsKLQkJCXNiLnNldExlbmd0aCgwKTsKLQotCQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQkJU3RyaW5nIHRleHQgPSBtLmdyb3VwKCk7Ci0KLQkJCQkvLyBQcm9ibGVtcyBwYXJzaW5nIDxhIGhyZWY+IHRhZ3MKLQkJCQkvLyBuZWVkIHRvIHJlbW92ZSBhbGwgTEYsIENSIHdpdGhpbiB0aGUgPGEgLi4+IHRhZwotCQkJCVN0cmluZyB1cmx0ZXh0ID0gbS5ncm91cCgxKTsKLQkJCQlMaW5rSW5mbyBpbmZvID0gdmFsaWRhdG9yLnZhbGlkYXRlTGluayhlbGVtZW50LCB1cmx0ZXh0LAotCQkJCQkJIiIsIGNvbmZpZywgImFyZWEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQl0ZXh0ID0gaW5mby5nZXRIdG1sKHZhbGlkYXRvci5zaG93QnJva2VuTGlua3MoKSkudG9TdHJpbmcoKTsKLQkJCQkJTWV0aG9kRWxlbWVudCBlID0gaW5mby5nZXRMaW5rZWRFbGVtZW50KCk7Ci0JCQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQkJCXZhbGlkYXRvci5hZGRSZWZlcmVuY2VkRWxlbWVudChlbGVtZW50LCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCVN0cmluZyByZXBsYWNlbWVudCA9IHRleHQucmVwbGFjZUFsbCgiZmlsZTovLy8iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUFsbCgiZmlsZTovLyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVnRXhwRXNjYXBlKHJlcGxhY2VtZW50KSk7Ci0JCQl9Ci0KLQkJCW0uYXBwZW5kVGFpbChzYik7Ci0KLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLS8vCS8qKgotLy8JICogY29weSBhbGwgcmVzb3VyY2UgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50IHRvIHRoZSB0YXJnZXQgbG9jYXRpb24uCi0vLwkgKiByZWN1cnNpdmUgYWxsIGl0J3MgY29udGFpbmVkIGVsZW1lbnRzIGlmIHJlY3Vyc2l2ZSBpcyB0cnVlLgotLy8JICogCi0vLwkgKiBAcGFyYW0gZWxlbWVudAotLy8JICogQHBhcmFtIGZyb20KLS8vCSAqIEBwYXJhbSB0bwotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIHZvaWQgY29weUFsbFJlc291cmNlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEZpbGUgZnJvbSwgRmlsZSB0bywgYm9vbGVhbiByZWN1cnNpdmUpIHsKLS8vCQkKLS8vCQlDb250ZW50UmVzb3VyY2VTY2FubmVyIHNjYW5uZXIgPSBuZXcgQ29udGVudFJlc291cmNlU2Nhbm5lcihmcm9tLCB0bywgKTsKLS8vCQlzY2FubmVyLnNldFRhcmdldFJvb3RQYXRoKHRvKTsKLS8vCQlzY2FubmVyLmNvcHlSZXNvdXJjZXMoZWxlbWVudCk7Ci0vLwkJCi0vLwkJaWYgKCByZWN1cnNpdmUgKSB7Ci0vLwkJCWZvciAoIEl0ZXJhdG9yIGl0ID0gZWxlbWVudC5lQWxsQ29udGVudHMoKTsgaXQuaGFzTmV4dCgpOyApIHsKLS8vCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0vLwkJCQlpZiAoIG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgKSB7Ci0vLwkJCQkJc2Nhbm5lci5jb3B5UmVzb3VyY2VzKChNZXRob2RFbGVtZW50KW9iaik7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luUGF0aChNZXRob2RFbGVtZW50IGUpIHsJCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hVXRpbC5nZXRNZXRob2RQbHVnaW4oZSk7Ci0JCXJldHVybiBnZXRGb2xkZXJBYnNvbHV0ZVBhdGgocGx1Z2luKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5QYXRoKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIGdldEZvbGRlckFic29sdXRlUGF0aChwbHVnaW4pOwotCX0KLQkKLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvUmVzb3VyY2VVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlMzNhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5GaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyB0aGUgTWV0aG9kIExpYnJhcnkgYXMgYSBwcm9qZWN0IGluIHRoZSBFY2xpcHNlCi0gKiB3b3Jrc3BhY2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVXRpbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbWV0aG9kTGlicmFyeU5hdHVyZSA9ICJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbWV0aG9kTGlicmFyeU5hdHVyZXMgPSB7IG1ldGhvZExpYnJhcnlOYXR1cmUgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19GSUxFTkFNRSA9ICIubG9jayI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBsaWIgTWV0aG9kTGlicmFyeQotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG9wZW4oTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCW9wZW4oZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliRGlyIFN0cmluZwotCSAqIEBwYXJhbSBtb25pdG9yIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG9wZW4oU3RyaW5nIGxpYkRpciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxpYkRpciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJKyBJUHJvamVjdERlc2NyaXB0aW9uLkRFU0NSSVBUSU9OX0ZJTEVfTkFNRSk7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKQotCQkJCQkubG9hZFByb2plY3REZXNjcmlwdGlvbihwYXRoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCS8vIG1pc3NpbmcgLnByb2plY3QgZmlsZQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIjIyMgLSBleGNlcHRpb24gaW4gbG9hZFByb2plY3REZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJLy8gLnByb2plY3QgZmlsZSBpcyBtaXNzaW5nIC0gY3JlYXRlIGEgbmV3IHByb2plY3QKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXByb2plY3QgPSBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChsaWJEaXIsIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyAucHJvamVjdCBmaWxlIGV4aXN0cwotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIG9wZW5pbmcgZXhpc3RpbmcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCAiICsgZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQotCQkJCS8vIGNoZWNrIGlmIHByb2plY3Qgb2YgdGhpcyBuYW1lIGV4aXN0cyBpbiB3b3Jrc3BhY2UKLQkJCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KAotCQkJCQkJZGVzY3JpcHRpb24uZ2V0TmFtZSgpKTsKLQotCQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCQkvLyBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QgaW4gd29ya3NwYWNlLCBzbyBtYWtlIG9uZSB3aXRoIHRoZQotCQkJCQkvLyBwcm9qZWN0IG5hbWUgaW4gLnByb2plY3QKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBleGlzdGluZyAucHJvamVjdCAiICsgZGVzY3JpcHRpb24uZ2V0TmFtZSgpICsgIiBpbiB3b3Jrc3BhY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3QuZ2V0TmFtZSgpLAotCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJLy8gZmFpbGVkIHRvIG1ha2UgdGhpcyBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UgLQotCQkJCQkJLy8gYW5vdGhlciBwcm9qZWN0IG1heSBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGF0IHRoaXMKLQkJCQkJCS8vIGxvY2F0aW9uCi0JCQkJCQkvLyBzbyB3ZSBuZWVkIHRvIGRlbGV0ZSB0aGF0IGNvbmZsaWN0aW5nIHByb2plY3QgYW5kIHRyeQotCQkJCQkJLy8gYWdhaW4KLQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBleGlzdGluZyAucHJvamVjdCBmYWlsZWQgLSBkZWxldGluZyB3b3Jrc3BhY2UtcHJvamVjdCBpbiAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQlsaWJEaXIKLQkJCQkJCQkJCQkJKyAiIGFuZCBjcmVhdGluZyB3b3Jrc3BhY2UtcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlkZWxldGVQcm9qZWN0KGxpYkRpciwgbW9uaXRvcik7Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3QuZ2V0TmFtZSgpLAotCQkJCQkJCQltb25pdG9yKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHByb2plY3QgZG9lcyBleGlzdCBpbiB3b3Jrc3BhY2UgLSBtYWtlIHN1cmUgbG9jYXRpb24KLQkJCQkJLy8gbWF0Y2hlcywgaWYgbm90LCBtYWtlIGEgbmV3IHByb2plY3QKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCS5wcmludGxuKCIjIyMgLSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgZXhpc3RzIGluIHdvcmtzcGFjZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlpZiAobmV3IEZpbGUobGliRGlyKS5jb21wYXJlVG8ocHJvamVjdC5nZXRMb2NhdGlvbigpCi0JCQkJCQkJLnRvRmlsZSgpKSAhPSAwKSB7Ci0JCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGV4aXN0cyBpbiB3b3Jrc3BhY2UsIGJ1dCBsb2NhdGlvbiBkaWZmZXJzIC0gY3JlYXRlIGEgbmV3IHByb2plY3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlGaWxlIHByb2plY3RGaWxlID0gcGF0aC50b0ZpbGUoKTsKLQkJCQkJCWlmIChwcm9qZWN0RmlsZS5jYW5Xcml0ZSgpKSB7Ci0JCQkJCQkJcHJvamVjdEZpbGUuZGVsZXRlKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vIHRoaXMgd2lsbCBjYXVzZSB0aGUgY2FsbGVyIHRvIGRpc3BsYXkgYQotCQkJCQkJCS8vIG1lc3NhZ2Vib3ggYXNraW5nIHRoZSB1c2VyIHRvIG1ha2UgLnByb2plY3QKLQkJCQkJCQkvLyB3cml0YWJsZQotCQkJCQkJCS8vIFRPRE86IHVzZSBvdXIgb3duIHR5cGUgb2YgRXhjZXB0aW9uPwotCQkJCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKLQkJCQkJCQkJCSIjIyMiICsgcHJvamVjdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlwcm9qZWN0ID0gY3JlYXRlVmFsaWRQcm9qZWN0RnJvbVBhdGgobGliRGlyLCBtb25pdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCQkvLyBsaWJEaXIgbXVzdCBiZSBhbiBpbnZhbGlkIHBhdGggKG92ZXJsYXBzIHdvcmtzcGFjZT8pCi0JCQkJLy8gVE9ETzogdGhpcyBleGNlcHRpb24gaXNuJ3QgaGFuZGxlZCB3ZWxsIC0gaXQgc2hvdWxkbid0IGhhcHBlbgotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihMaWJyYXJ5UmVzb3VyY2VzLmludmFsaWRMaWJyYXJ5UGF0aEVycm9yX3JlYXNvbik7Ci0JCQl9Ci0JCQlwcm9qZWN0Lm9wZW4oSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSCwgbW9uaXRvcik7CQkJCQkJCi0JCQkKLQkJCS8vIFNldCBsb2NrIGZpbGUgYXMgdGVhbSBwcml2YXRlIG1lbWJlciBzbyBpdCB3aWxsIG5vdCBiZSBzaGFyZWQgKGFkZGVkIHRvIHNvdXJjZSBjb250cm9sKS4KLQkJCS8vIFRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgcHJvamVjdCBmb2xkZXIgZ290IHJlZnJlc2hlZC4gU28gdGhpcyBwb3J0aW9uIG9mIGNvZGUgbXVzdCBiZQotCQkJLy8gZXhlY3V0ZWQgcmlnaHQgYWZ0ZXIgSVByb2plY3Qub3BlbigpIHJldHVybmVkLiBQcm9qZWN0IG11c3QgYmUgb3BlbmVkIHdpdGggSVJlc291cmNlLkJBQ0tHUk9VTkRfUkVGUkVTSAotCQkJLy8gdG8gcHJldmVudCBsb2NrIGZpbGUgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgcHJvamVjdCBiZWZvcmUgaXQgaXMgc2V0IGFzIHRlYW0gcHJpdmF0ZSBtZW1iZXIKLQkJCS8vCi0JCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUobGliRGlyLCBSZXNvdXJjZVV0aWwuTE9DS19GSUxFTkFNRSk7Ci0JCQlpZihsb2NrRmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCUlSZXNvdXJjZSB3c1JlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGxvY2tGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkJCWlmKHdzUmVzICE9IG51bGwpIHsKLQkJCQkJCXdzUmVzLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfWkVSTywgbnVsbCk7Ci0JCQkJCQl3c1Jlcy5zZXRUZWFtUHJpdmF0ZU1lbWJlcih0cnVlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbW9uaXRvciBmb3IgY2hhbmdlIGluIHRoZSByZXNvdXJjZQotLy8JCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLm1vbml0b3IocHJvamVjdCk7Ci0KLQkJCWRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCi0JCQkvLyBtYWtlIHN1cmUgcHJvamVjdCBoYXMgdGhlIE1ldGhvZExpYnJhcnlOYXR1cmUKLQkJCVN0cmluZ1tdIGV4aXN0aW5nTmF0dXJlcyA9IGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpOwotCQkJaWYgKCEoQXJyYXlzLmFzTGlzdChleGlzdGluZ05hdHVyZXMpLmNvbnRhaW5zKG1ldGhvZExpYnJhcnlOYXR1cmUpKSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIiMjIyAtIGFkZGluZyBtZXRob2RsaWJyYXJ5bmF0dXJlIHRvICIgKyBkZXNjcmlwdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhtZXRob2RMaWJyYXJ5TmF0dXJlcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgSVByb2plY3QuRk9SQ0UKLQkJCQkJCXwgSVByb2plY3QuS0VFUF9ISVNUT1JZLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJTGlicmFyeVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQkJdGhyb3cgZXg7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYSBsaWJyYXJ5J3MgcHJvamVjdC4gSXQgZmluZHMgdGhlIHByb2plY3QgYnkgbG9jYXRpbmcgYSBwcm9qZWN0Ci0JICogd2l0aCB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgY2xvc2UoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QobGliKTsKLS8vCQlpZiAocHJvamVjdCAhPSBudWxsICYmIHByb2plY3QuaXNPcGVuKCkpIHsKLS8vCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCS5wcmludGxuKCIjIyMgLSBjbG9zaW5nIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0vLwkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJaWYgKGRlYnVnKSB7Ci0vLwkJCQlTeXN0ZW0ub3V0Ci0vLwkJCQkJCS5wcmludGxuKCIjIyMgLSBFUlJPUiBjbG9zaW5nIHByb2plY3QgZm9yIGxpYnJhcnkgaW4gXCIiICsgZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpICsgIlwiOiBwcm9qZWN0IGNvdWxkIG5vdCBiZSBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0vLwkJCX0KLS8vCQl9Ci0JCQotCQljbG9zZShnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkaXIgU3RyaW5nCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBjbG9zZShTdHJpbmcgZGlyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QoZGlyKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiIyMjIC0gY2xvc2luZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkKLQkJCS8vIHN0b3AgbW9uaXRvcmluZyBjaGFuZ2Ugb24gdGhlIHByb2plY3QKLQkJCS8vCi0vLwkJCVJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkudW5tb25pdG9yKHByb2plY3QpOwotCQkJCi0JCX0gZWxzZSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiIyMjIC0gRVJST1IgY2xvc2luZyBwcm9qZWN0IGZvciBsaWJyYXJ5IGluIFwiIiArIGRpciArICJcIjogcHJvamVjdCBjb3VsZCBub3QgYmUgZm91bmQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0JCQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHByb2plY3Qgd2l0aCB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgbGlicmFyeSdzIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBmaW5kUHJvamVjdChNZXRob2RMaWJyYXJ5IGxpYikgewotCQlyZXR1cm4gZmluZFByb2plY3QoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2NhdGVzdCB0aGUgcHJvamVjdCB3aG9zZSBsb2NhdGlvbiBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBkaXIgU3RyaW5nCi0JICogQHJldHVybiBJUHJvamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZFByb2plY3QoU3RyaW5nIGRpcikgewotCQlmaW5hbCBJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQkJaWYgKG5ldyBGaWxlKGRpcikuY29tcGFyZVRvKHByb2plY3QuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSkgPT0gMCkgewotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkJLnByaW50bG4oIiMjIyAtIGZvdW5kIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiB3aXRoIGxvY2F0aW9uICIgKyBkaXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlyZXR1cm4gcHJvamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgcHJvamVjdCB3aG9zZSBsb2NhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlbGV0ZVByb2plY3QoTWV0aG9kTGlicmFyeSBsaWIsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRlbGV0ZVByb2plY3QoZ2V0TGlicmFyeURpcmVjdG9yeShsaWIpLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBwcm9qZWN0IHdob3NlIGxvY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxldGVQcm9qZWN0KFN0cmluZyBwYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRlbGV0ZSBhbnkgd29ya3NwYWNlIHByb2plY3QgdGhhdCBleGlzdHMgZm9yIHRoaXMgcGF0aAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmluZFByb2plY3QocGF0aCk7Ci0JCXRyeSB7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQKLQkJCQkJCQkucHJpbnRsbigiIyMjIC0gZGVsZXRpbmcgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQkJfQotCQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCUxpYnJhcnlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvamVjdCBmb3IgdGhlIGxpYnJhcnkuCi0JICogCi0JICogQHJldHVybiBudWxsIGlmIHRoZSBsaWJyYXJ5IGlzIG5vdCBpbiBhIHZhbGlkIHByb2plY3QgbG9jYXRpb24gKGllLAotCSAqICAgICAgICAgb3ZlcmxhcHMgdGhlIHdvcmtzcGFjZSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KE1ldGhvZExpYnJhcnkgbGliLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChnZXRMaWJyYXJ5RGlyZWN0b3J5KGxpYiksIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9qZWN0IGZvciB0aGUgcGF0aCBzcGVjaWZpZWQsIHVzaW5nIHRoZSBsYXN0IHBhdGggZnJhZ21lbnQgYXMKLQkgKiB0aGUgcHJvamVjdCBuYW1lLiBXaWxsIGFwcGVuZCBpbmNyZWFzaW5nIGludGVnZXJzIHRvIHRoZSBwcm9qZWN0IG5hbWUgaW4KLQkgKiBvcmRlciB0byBjcmVhdGUgYSB2YWxpZCBwcm9qZWN0LiBGaXJzdCBkZWxldGVzIGFueSB3b3Jrc3BhY2UgcHJvamVjdAotCSAqIHdob3NlIGxvY2F0aW9uIGlzIHRoZSBnaXZlbiBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIElQcm9qZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVWYWxpZFByb2plY3RGcm9tUGF0aChTdHJpbmcgcGF0aCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBkZWxldGUgYW55IHdvcmtzcGFjZSBwcm9qZWN0IHRoYXQgZXhpc3RzIGZvciB0aGlzIHBhdGgKLQkJSVByb2plY3QgcHJvamVjdCA9IGZpbmRQcm9qZWN0KHBhdGgpOwotCQl0cnkgewotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCXByb2plY3QuZGVsZXRlKElQcm9qZWN0LkZPUkNFCi0JCQkJCQl8IElQcm9qZWN0Lk5FVkVSX0RFTEVURV9QUk9KRUNUX0NPTlRFTlQsIG1vbml0b3IpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBsaWJOYW1lID0gbmV3IEZpbGUocGF0aCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgbGliRGlyID0gbmV3IEZpbGUocGF0aCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLQkJU3RyaW5nIHByb2plY3ROYW1lID0gbGliTmFtZTsKLQkJaW50IGkgPSAyOwotCQl3aGlsZSAoaSA8IDEwMCkgewotCQkJdHJ5IHsKLQkJCQlwcm9qZWN0ID0gY3JlYXRlUHJvamVjdChsaWJEaXIsIHByb2plY3ROYW1lLCBtb25pdG9yKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCS5wcmludGxuKCIjIyMgLSBjcmVhdGluZyBuZXcgbWV0aG9kIGxpYnJhcnkgcHJvamVjdCAiICsgcHJvamVjdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBwcm9qZWN0OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCXByb2plY3ROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcihsaWJOYW1lKS5hcHBlbmQoJyAnKS5hcHBlbmQoaSsrKQotCQkJCQkJLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gY3JlYXRlIGEgcHJvamVjdCBuYW1lZCBwcm9qZWN0TmFtZSBpbiB0aGUgZGlyZWN0b3J5IGRpci4KLQkgKiBUaHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIGZhaWxzIGZvciBhbnkgcmVhc29uLgotCSAqIAotCSAqIEBwYXJhbSBkaXIKLQkgKiBAcGFyYW0gcHJvamVjdE5hbWUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBkaXIsIFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQotCQkvLyBnZXQgYSBwcm9qZWN0IGhhbmRsZQotCQlJUHJvamVjdCBuZXdQcm9qZWN0SGFuZGxlID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHdvcmtzcGFjZQotCQkJCS5uZXdQcm9qZWN0RGVzY3JpcHRpb24obmV3UHJvamVjdEhhbmRsZS5nZXROYW1lKCkpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMobWV0aG9kTGlicmFyeU5hdHVyZXMpOwotCQlJUGF0aCBwcm9qZWN0UGF0aCA9IG5ldyBQYXRoKGRpcik7Ci0JCWlmICghUGxhdGZvcm0uZ2V0TG9jYXRpb24oKS5pc1ByZWZpeE9mKHByb2plY3RQYXRoKSkgewotCQkJZGVzY3JpcHRpb24uc2V0TG9jYXRpb24ocHJvamVjdFBhdGgpOwotCQl9Ci0KLQkJbmV3UHJvamVjdEhhbmRsZS5jcmVhdGUoZGVzY3JpcHRpb24sIG1vbml0b3IpOwotCQlyZXR1cm4gbmV3UHJvamVjdEhhbmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgYWxsIChvcGVuKSBwcm9qZWN0cyB0aGF0IGhhdmUgdGhlIE1ldGhvZExpYnJhcnkgbmF0dXJlCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFsbE1ldGhvZExpYnJhcnlQcm9qZWN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJCWlmIChwcm9qZWN0LmlzT3BlbigpCi0JCQkJCQkmJiBwcm9qZWN0LmdldE5hdHVyZShtZXRob2RMaWJyYXJ5TmF0dXJlKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiIyMjIC0gY2xvc2luZyBtZXRob2QgbGlicmFyeSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExpYnJhcnlEaXJlY3RvcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVzZWRSZXNvdXJjZXMKLQkgKiBAcmV0dXJuIENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldE91dE9mU3luY1Jlc291cmNlcyhDb2xsZWN0aW9uPFJlc291cmNlPiB1c2VkUmVzb3VyY2VzKSB7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0JCWZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiB1c2VkUmVzb3VyY2VzKSB7Ci0JCQlTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCUlSZXNvdXJjZSB3c1JlcyA9IEZpbGVNYW5hZ2VyLmdldFJlc291cmNlRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJaWYod3NSZXMgIT0gbnVsbCAmJiAhd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQkKLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VzIENvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT3V0T2ZTeW5jaChDb2xsZWN0aW9uPFJlc291cmNlPiByZXNvdXJjZXMpIHsKLQkJZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgewotCQkJaWYocmVzb3VyY2UuZ2V0VVJJKCkuaXNGaWxlKCkpIHsKLQkJCQlTdHJpbmcgZmlsZVBhdGggPSByZXNvdXJjZS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKTsKLQkJCQlJUmVzb3VyY2Ugd3NSZXMgPSBGaWxlTWFuYWdlci5nZXRSZXNvdXJjZUZvckxvY2F0aW9uKGZpbGVQYXRoKTsKLQkJCQlpZih3c1JlcyAhPSBudWxsICYmICF3c1Jlcy5pc1N5bmNocm9uaXplZChJUmVzb3VyY2UuREVQVEhfWkVSTykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9CQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZXNUb0NoZWNrIENvbGxlY3Rpb24KLQkgKiBAcGFyYW0gcmVtb3ZlZFJlc291cmNlcyBDb2xsZWN0aW9uCi0JICogQHBhcmFtIGNoYW5nZWRSZXNvdXJjZXMgQ29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja091dE9mU3luY2hSZXNvdXJjZXMoQ29sbGVjdGlvbiByZXNvdXJjZXNUb0NoZWNrLCAKLQkJCUNvbGxlY3Rpb24gcmVtb3ZlZFJlc291cmNlcywgQ29sbGVjdGlvbiBjaGFuZ2VkUmVzb3VyY2VzKQotCXsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VzVG9DaGVjay5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBmaWxlUGF0aCA9IHJlc291cmNlLmdldFVSSSgpLnRvRmlsZVN0cmluZygpOwotCQkJSVJlc291cmNlIHdzUmVzID0gRmlsZU1hbmFnZXIuZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlUGF0aCk7Ci0JCQlpZih3c1JlcyA9PSBudWxsKSB7Ci0JCQkJcmVtb3ZlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCQkJZWxzZSBpZighd3NSZXMuaXNTeW5jaHJvbml6ZWQoSVJlc291cmNlLkRFUFRIX1pFUk8pKSB7Ci0JCQkJY2hhbmdlZFJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbGliIE1ldGhvZExpYnJhcnkKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hSZXNvdXJjZXMoTWV0aG9kTGlicmFyeSBsaWIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZihsaWIgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJqID0gTWV0aG9kTGlicmFyeVByb2plY3QuZmluZFByb2plY3QobGliKTsKLQkJCWlmKHByaiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcHJqLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3V0aWwvU0FYUGFyc2VyWE1JLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk5MzNkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9TQVhQYXJzZXJYTUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5BYnN0cmFjdFNBWFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucGVyc2lzdGVuY2UuTXVsdGlGaWxlWE1JU2F2ZUltcGwuTXlFc2NhcGU7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGFuIFhNSSBmaWxlLCBhbmQgc3RvcmVzIHRoZSBkYXRhIGluIGEgSGFzaE1hcCBjYWxsZWQgYW4KLSAqICJlTWFwIi4KLSAqIDxwPgotICogQW4gZU1hcCBoYXMgNCBlbnRyaWVzOgotICogPGxpPiJ0YWciIC0gdGhlIGVsZW1lbnQncyB0YWc8L2xpPgotICogPGxpPiJhdHRyaWJ1dGVzIiAtIGFuIEFycmF5TGlzdCBvZiB0aGUgWE1MIGF0dHJpYnV0ZXMuIEVhY2ggYXR0cmlidXRlIGlzIG9mCi0gKiB0aGUgZm9ybSAoYXR0cmlidXRlIG5hbWUpLChhdHRyaWJ1dGUgdmFsdWUpPC9saT4KLSAqIDxsaT4iY29udGVudCIgLSB0aGUgZWxlbWVudCdzIGNvbnRlbnQ8L2xpPgotICogPGxpPiJjaGlsZHJlbiIgLSBhbiBBcnJheUxpc3Qgb2YgdGhlIGVsZW1lbnQncyBzdWItZWxlbWVudHMuIEVhY2ggY2hpbGQgaXMKLSAqIGFuIGVNYXAuPC9saT4KLSAqIDwvcD4KLSAqIDxwPgotICogVGhlIHJvb3QgZWxlbWVudCdzIGVNYXAgaXMgcmVmZXJlbmNlZCBieSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwCi0gKiA8L3A+Ci0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU0FYUGFyc2VyWE1JIGV4dGVuZHMgQWJzdHJhY3RTQVhQYXJzZXIgewotCi0JcHVibGljIEhhc2hNYXAgeG1pTWFwOwotCi0JLy8gcHJpdmF0ZSBpbnQgZWxlbWVudENvdW50ID0gMDsKLQlwcml2YXRlIFN0YWNrIHN0YWNrOwotCi0JcHJpdmF0ZSBNeUVzY2FwZSBlc2NhcGUgPSBuZXcgTXlFc2NhcGUoKTsKLQotCXB1YmxpYyBTQVhQYXJzZXJYTUkoTG9nZ2VyIGxvZ2dlcikgewotCQkvLyB2YWxpZGF0aW5nIGlzIGZhbHNlIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBEVEQKLQkJc3VwZXIobG9nZ2VyLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIFhNTCBwYXJzZXIgc3RhcnRzIHRvIHBhcnNlIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgewotCQlzdXBlci5zdGFydERvY3VtZW50KCk7Ci0JCXN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JCXN1cGVyLmVuZERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQlTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlIYXNoTWFwIGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl0cnkgewotCQkJSGFzaE1hcCBwYXJlbnQgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJKChBcnJheUxpc3QpIHBhcmVudC5nZXQoImNoaWxkcmVuIikpLmFkZChlTWFwKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpIHsKLQkJCXhtaU1hcCA9IGVNYXA7Ci0JCX0KLQotCQkvLyBwdXQgdGFnCi0JCWVNYXAucHV0KCJ0YWciLCBxbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBwdXQgYXR0cmlidXRlTWFwCi0JCUxpc3QgYXR0cmlidXRlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJpYnV0ZUxpc3QuYWRkKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkKLQkJCQkJCSsgIiwiICsgYXR0cmlidXRlcy5nZXRWYWx1ZShpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQllTWFwLnB1dCgiYXR0cmlidXRlcyIsIGF0dHJpYnV0ZUxpc3QpOyAvLyROT04tTkxTLTEkCi0KLQkJZU1hcC5wdXQoImNoaWxkcmVuIiwgbmV3IEFycmF5TGlzdCgpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFjay5wdXNoKGVNYXApOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlIYXNoTWFwIGVNYXAgPSAoSGFzaE1hcCkgc3RhY2sucGVlaygpOwotCQkJTGlzdCBhdHRyaWJ1dGVMaXN0ID0gKEFycmF5TGlzdCkgZU1hcC5nZXQoImF0dHJpYnV0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dHJpYnV0ZUxpc3Quc2l6ZSgpID09IDApCi0JCQkJaWYgKHN0ckJ1Zi50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJZU1hcC5wdXQoImNvbnRlbnQiLCBlc2NhcGUuY29udmVydExpbmVzKHN0ckJ1Zi50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzdGFjay5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBGaW5kIGEgZ3VpZCdzIGVsZW1lbnQgdGFnIHdpdGhpbiB0aGUgWE1JCi0JICogZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBndWlkCi0JICogQHBhcmFtIHhtaU1hcAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhhc2hNYXAgZmluZEVsZW1lbnRUYWdvZkd1aWQoU3RyaW5nIGVsZW1lbnRUYWcsIFN0cmluZyBndWlkLAotCQkJSGFzaE1hcCB4bWlNYXApIHsKLQkJSGFzaE1hcCBlTWFwID0gU0FYUGFyc2VyWE1JLmZpbmRHdWlkKGd1aWQsIHhtaU1hcCk7Ci0KLQkJLy8gd2UgaGF2ZSBoYXNobWFwIG9mIHRoZSBndWlkJ3MgZWxlbWVudCAtIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlCi0JCS8vIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiBzZWFyY2hlcyBlTWFwJ3MgY2hpbGRyZW4gZm9yIGVsZW1lbnRUYWcKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFRhZwotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGdldENoaWxkRWxlbWVudFRhZyhTdHJpbmcgZWxlbWVudFRhZywgSGFzaE1hcCBlTWFwKSB7Ci0JCS8vIHNlYXJjaCBjaGlsZHJlbiBmb3IgdGhlIGVsZW1lbnRUYWcKLQkJSXRlcmF0b3IgaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKSkuaXRlcmF0b3IoKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUhhc2hNYXAgY2hpbGRNYXAgPSAoSGFzaE1hcCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoU0FYUGFyc2VyWE1JLmdldFRhZyhjaGlsZE1hcCkuZXF1YWxzKGVsZW1lbnRUYWcpKQotCQkJCXJldHVybiBjaGlsZE1hcDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JLiByZXR1cm5zIFRhZyBvZiBlbGVtZW50LiBEb2VzIG5vdCByZXR1cm4KLQkgKiBudWxsLCByZXR1cm5zICIiIGluc3RlYWQuCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhZyhIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIHRhZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChlTWFwICE9IG51bGwpCi0JCQl0YWcgPSAoU3RyaW5nKSBlTWFwLmdldCgidGFnIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJcmV0dXJuIHRhZzsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4gZ2V0cyBjb250ZW50IG9mIGVsZW1lbnQgLSBjYW4gYmUgbnVsbAotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50Q29udGVudChIYXNoTWFwIGVNYXApIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBudWxsOwotCQlpZiAoZU1hcCAhPSBudWxsKQotCQkJY29udGVudCA9IChTdHJpbmcpIGVNYXAuZ2V0KCJjb250ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSBndWlkIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGdpdmVuIGVNYXAgLSBjYW4gcmV0dXJuIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gZ3VpZAotCSAqICAgICAgICAgICAgZ3VpZCB0byBmaW5kCi0JICogQHBhcmFtIGVNYXAKLQkgKiAgICAgICAgICAgIHVzZSBUTkdTQVhQYXJzZXJYTUkueG1pTWFwLCBvciBhIHN1Yi1lTWFwCi0JICogQHJldHVybiBIYXNoTWFwCi0JICovCi0JcHVibGljIHN0YXRpYyBIYXNoTWFwIGZpbmRHdWlkKFN0cmluZyBndWlkLCBIYXNoTWFwIGVNYXApIHsKLQkJQXJyYXlMaXN0IGF0dExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChndWlkLmVxdWFscyhTQVhQYXJzZXJYTUkuZ2V0R3VpZE9mTGlzdChhdHRMaXN0KSkpCi0JCQlyZXR1cm4gZU1hcDsKLQotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJjaGlsZHJlbiIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCUhhc2hNYXAgcmVzdWx0ID0gZmluZEd1aWQoZ3VpZCwgY2hpbGRNYXApOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRm9yIHVzZSB3aXRoIFROR1NBWFBhcnNlclhNSS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0TGlzdAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R3VpZE9mTGlzdChBcnJheUxpc3QgYXR0TGlzdCkgewotCQlJdGVyYXRvciBpdGVyID0gYXR0TGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRwYWlyID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgYXR0bmFtZSA9IGF0dHBhaXIuc3Vic3RyaW5nKDAsIGF0dHBhaXIuaW5kZXhPZigiLCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRuYW1lLmVxdWFscygiZ3VpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgdXNlIHdpdGggVE5HU0FYUGFyc2VyWE1JIHdoZW4gcGFyc2luZyByZXNtZ3IueG1pCi0JICogCi0JICogQHBhcmFtIGF0dExpc3QKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElkT2ZMaXN0KEFycmF5TGlzdCBhdHRMaXN0KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZU1hcAotCSAqIEByZXR1cm4gVVJJCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkkgZ2V0UHJlc2VudGF0aW9uVXJpT2ZFbGVtZW50KEhhc2hNYXAgZU1hcCkgewotCQlpZiAoZU1hcCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyB0YWcgPSBTQVhQYXJzZXJYTUkuZ2V0VGFnKGVNYXApOwotCi0JCS8vIC8vIGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGFuIGJyZWFrZG93bkVsZW1lbnQgLSBpZiBzbywgcmV0dXJuIG51bGwKLQkJLy8gLy8gYmVjYXVzZSB3aGlsZSBicmVha2Rvd25FbGVtZW50cyBoYXZlIHByZXNlbnRhdGlvbnMsIHRoZXkgYXJlIG5vdAotCQkvLyB1c2VkLgotCQkvLyBpZiAodGFnLmVxdWFscygiYnJlYWtkb3duRWxlbWVudHMiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCQkvLyAvLyBwcm9jZXNzZXMgZG9uJ3QgdXNlIHRoZWlyIHByZXNlbnRhdGlvbiBlaXRoZXIKLQkJLy8gaWYgKHRhZy5lcXVhbHMoInByb2Nlc3MiKSkgewotCQkvLyByZXR1cm4gbnVsbDsKLQkJLy8gfQotCi0JCS8vIGxvb2sgZm9yIGNoaWxkUGFja2FnZSBwcmVzZW50YXRpb25zLCB3aGljaCBhcmUgYW4gaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKHRhZy5lcXVhbHMoImNoaWxkUGFja2FnZXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhdHRMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYXR0bmFtZS5lcXVhbHMoImhyZWYiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhdHR2YWwpOwotCQkJCQkJcmV0dXJuIHVyaTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCQkvLyBpZiAoYXR0dmFsLmluZGV4T2YoInVtYTovLyIpICE9IC0xKSB7Ci0JCQkJCS8vIFN0cmluZyBwcmVzSWQgPQotCQkJCQkvLyBhdHR2YWwuc3Vic3RyaW5nKGF0dHZhbC5pbmRleE9mKCJ1bWE6Ly8iKSs2KTsKLQkJCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkJLy8gfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUFycmF5TGlzdCBjaGlsZExpc3QgPSAoQXJyYXlMaXN0KSBlTWFwLmdldCgiY2hpbGRyZW4iKTsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdGVyID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSGFzaE1hcCBjaGlsZE1hcCA9IChIYXNoTWFwKSBpdGVyLm5leHQoKTsKLQkJCXRhZyA9IFNBWFBhcnNlclhNSS5nZXRUYWcoY2hpbGRNYXApOwotCQkJaWYgKHRhZy5lcXVhbHMoInByZXNlbnRhdGlvbiIpKSB7IC8vIHx8IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyB0YWcuZXF1YWxzKCJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IikpCi0JCQkJLy8geyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlBcnJheUxpc3QgYXR0TGlzdCA9IChBcnJheUxpc3QpIGNoaWxkTWFwLmdldCgiYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJSXRlcmF0b3IgYXR0SXRlciA9IGF0dExpc3QuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoYXR0SXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBhdHRJdGVyLm5leHQoKTsKLQkJCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGF0dG5hbWUuZXF1YWxzKCJocmVmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShhdHR2YWwpOwotCQkJCQkJCXJldHVybiB1cmk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGlmIChhdHR2YWwuaW5kZXhPZigidW1hOi8vIikgIT0gLTEpIHsKLQkJCQkJCS8vIFN0cmluZyBwcmVzSWQgPQotCQkJCQkJLy8gYXR0dmFsLnN1YnN0cmluZyhhdHR2YWwuaW5kZXhPZigidW1hOi8vIikrNik7Ci0JCQkJCQkvLyByZXR1cm4gcHJlc0lkOwotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gaWYgKGF0dExpc3Quc2l6ZSgpID09IDApCi0JCQkJLy8gY29udGludWU7Ci0JCQkJLy8gU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKWF0dExpc3QuZ2V0KDApOwotCQkJCS8vIC8vIFN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwKLQkJCQkvLyBhdHRwYWlyLmluZGV4T2YoIiwiKSk7Ci0JCQkJLy8gU3RyaW5nIGF0dHZhbCA9IGF0dHBhaXIuc3Vic3RyaW5nKGF0dHBhaXIuaW5kZXhPZigiLCIpKzEpOwotCQkJCS8vIGlmIChhdHR2YWwuaW5kZXhPZigidW1hOi8vIikgIT0gLTEpIHsKLQkJCQkvLyBTdHJpbmcgcHJlc0lkID0gYXR0dmFsLnN1YnN0cmluZyhhdHR2YWwuaW5kZXhPZigidW1hOi8vIikrNik7Ci0JCQkJLy8gcmV0dXJuIHByZXNJZDsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVNYXAKLQkgKiBAcGFyYW0gYXR0cmlidXRlTmFtZQotCSAqIEBwYXJhbSBhdHRyaWJ1dGVWYWx1ZQotCSAqIEByZXR1cm4gSGFzaE1hcAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaE1hcCBmaW5kRWxlbWVudEJ5QXR0cmlidXRlKEhhc2hNYXAgZU1hcCwKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lLCBTdHJpbmcgYXR0cmlidXRlVmFsdWUpIHsKLQkJLy8gc2VhcmNoIHRoaXMgZU1hcCdzIGNoaWxkcmVuCi0JCUl0ZXJhdG9yIGl0ZXIgPSAoKEFycmF5TGlzdCkgZU1hcC5nZXQoImNoaWxkcmVuIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlIYXNoTWFwIGNoaWxkTWFwID0gKEhhc2hNYXApIGl0ZXIubmV4dCgpOwotCQkJSGFzaE1hcCByZXN1bHQgPSBmaW5kRWxlbWVudEJ5QXR0cmlidXRlKGNoaWxkTWFwLCBhdHRyaWJ1dGVOYW1lLAotCQkJCQlhdHRyaWJ1dGVWYWx1ZSk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8vIHNlYXJjaCB0aGlzIGVNYXAKLQkJaXRlciA9ICgoQXJyYXlMaXN0KSBlTWFwLmdldCgiYXR0cmlidXRlcyIpKS5pdGVyYXRvcigpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGF0dHBhaXIgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBhdHRuYW1lID0gYXR0cGFpci5zdWJzdHJpbmcoMCwgYXR0cGFpci5pbmRleE9mKCIsIikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXR0dmFsID0gYXR0cGFpci5zdWJzdHJpbmcoYXR0cGFpci5pbmRleE9mKCIsIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGF0dG5hbWUuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpICYmIGF0dHZhbC5lcXVhbHMoYXR0cmlidXRlVmFsdWUpKQotCQkJCXJldHVybiBlTWFwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlTWFwCi0JICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZU9mRWxlbWVudChIYXNoTWFwIGVNYXAsCi0JCQlTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlJdGVyYXRvciBpdGVyID0gKChBcnJheUxpc3QpIGVNYXAuZ2V0KCJhdHRyaWJ1dGVzIikpLml0ZXJhdG9yKCk7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgYXR0cGFpciA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIGF0dG5hbWUgPSBhdHRwYWlyLnN1YnN0cmluZygwLCBhdHRwYWlyLmluZGV4T2YoIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhdHR2YWwgPSBhdHRwYWlyLnN1YnN0cmluZyhhdHRwYWlyLmluZGV4T2YoIiwiKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0bmFtZS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpCi0JCQkJcmV0dXJuIGF0dHZhbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL1RleHRSZWZlcmVuY2VSZXBsYWNlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYzA0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9UZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8qKgotICogSW1wbGVtZW50YXRpb24gZm9yIElUZXh0UmVmZXJlbmNlUmVwbGFjZXIuIFVzZWQgaW4gZGVlcCBjb3B5Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JVGV4dFJlZmVyZW5jZVJlcGxhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFRleHRSZWZlcmVuY2VSZXBsYWNlckltcGwgaW1wbGVtZW50cyBJVGV4dFJlZmVyZW5jZVJlcGxhY2VyIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQ0FQQUJJTElUWV9QQVRIID0gTXVsdGlGaWxlU2F2ZVV0aWwuQ0FQQUJJTElUWV9QQVRURVJOX1BBVEggKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgREVMSVZFUllfUEFUSCA9IE11bHRpRmlsZVNhdmVVdGlsLkRFTElWRVJZX1BST0NFU1NfUEFUSCArICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBMaWJyYXJ5UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyAgPSBmYWxzZTsJCi0JCi0JcHJpdmF0ZSBNYXAgY29udmVydE1hcChNYXAgb2xkVG9OZXdPYmplY3RNYXApIHsKLQkJaWYgKG9sZFRvTmV3T2JqZWN0TWFwID09IG51bGwpIHsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gb2xkVG9OZXdPYmplY3RNYXAgaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWFwIG0gPSBudWxsOwotCQlJdGVyYXRvciBpdCA9IG9sZFRvTmV3T2JqZWN0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJT2JqZWN0IGtleSA9IGVudHJ5LmdldEtleSgpOwotCQkJT2JqZWN0IHZhbCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZCBrZXkgPSAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZCB2YWwgPSAiICsgdmFsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKCBrZXkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50ICYmIHZhbCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmV3S2V5ID0gKChNZXRob2RFbGVtZW50KWtleSkuZ2V0R3VpZCgpOwotCQkJCVN0cmluZyBuZXdWYWwgPSAoKE1ldGhvZEVsZW1lbnQpdmFsKS5nZXRHdWlkKCk7Ci0JCQkJaWYgKGtleSAhPSBudWxsICYmIHZhbCAhPSBudWxsKSB7Ci0JCQkJCWlmIChtID09IG51bGwpIHsKLQkJCQkJCW0gPSBuZXcgSGFzaE1hcCgpOwotCQkJCQl9Ci0JCQkJCW0ucHV0KG5ld0tleSwgbmV3VmFsKTsKLQkJCQl9Ci0JCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gbmV3IGtleSA9ICIgKyBuZXdLZXkgKyAiLCBuZXdWYWwgPSAiICsgbmV3VmFsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBtOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UgU3RyaW5nCi0JICogQHBhcmFtIG93bmVyIEVPYmplY3QKLQkgKiBAb2xkVG9OZXdPYmplY3RNYXAgTWFwCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHNvdXJjZSwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKSB7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBFbnRlcmluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBvd25lcjogIiArIG93bmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVN0cmluZyByZXQgPSByZXBsYWNlXyhzb3VyY2UsIG93bmVyLCBvbGRUb05ld09iamVjdE1hcCk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlib29sZWFuIG5vQ2hhbmdlID0gISBzb3VyY2UuZXF1YWxzKHJldCk7Ci0JCQlTdHJpbmcgc3RyID0gc291cmNlLmVxdWFscyhyZXQpID8gIk5vIGNobmFuZ2UhIiA6IHJldDsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gRXhpdGluZyBUZXh0UmVmZXJlbmNlUmVwbGFjZXJJbXBsLnJlcGxhY2U6ICIgKyBzdHIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZV8oU3RyaW5nIHNvdXJjZSwgRU9iamVjdCBvd25lciwgTWFwIG9sZFRvTmV3T2JqZWN0TWFwKSB7CQotCQlNYXAgbG9jYWxNYXAgPSBjb252ZXJ0TWFwKG9sZFRvTmV3T2JqZWN0TWFwKTsKLQkJaWYgKGxvY2FsTWFwID09IG51bGwpIHsKLQkJCXJldHVybiBzb3VyY2U7Ci0JCX0KLQkJCi0JCVN0cmluZyByZXBsYWNpbmdQYXRoID0gbnVsbDsKLQkJU3RyaW5nIHJlcGxhY2VkUGF0aCA9IG51bGw7CQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJcmVwbGFjaW5nUGF0aCA9IERFTElWRVJZX1BBVEg7Ci0JCQlyZXBsYWNlZFBhdGggPSBDQVBBQklMSVRZX1BBVEg7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXIgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJcmVwbGFjaW5nUGF0aCA9IENBUEFCSUxJVFlfUEFUSDsKLQkJCXJlcGxhY2VkUGF0aCA9IERFTElWRVJZX1BBVEg7Ci0JCX0gZWxzZSB7Ci0JCQlyZXBsYWNpbmdQYXRoID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcGxhY2VkUGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0KLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IG0uZ3JvdXAoKTsJCQkJCQkKLQkJCU1hcCBhdHRyaWJ1dGVNYXAgPSBSZXNvdXJjZUhlbHBlci5nZXRBdHRyaWJ1dGVzRnJvbUxpbmsodGV4dCk7Ci0JCQlTdHJpbmcgb2xkR3VpZCA9IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfR1VJRCk7CQotCQkJU3RyaW5nIG5ld0d1aWQgPSBvbGRHdWlkID09IG51bGwgPyBudWxsIDogKFN0cmluZykgbG9jYWxNYXAuZ2V0KG9sZEd1aWQpOwotCQkJCi0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHRleHQ6ICAgICAgIiArIHRleHQpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gYXR0cmlidXRlTWFwOiAiICsgYXR0cmlidXRlTWFwKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG9sZEd1aWQ6ICIgKyBvbGRHdWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld0d1aWQ6ICIgKyBuZXdHdWlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQkJCQotCQkJaWYgKG5ld0d1aWQgIT0gbnVsbCAmJiAhbmV3R3VpZC5lcXVhbHMob2xkR3VpZCkpIHsKLQkJCQkJCQkJCi0JCQkJLy9TdHJpbmcgcmVwbGFjZW1lbnQgPSB0ZXh0LnJlcGxhY2VBbGwob2xkR3VpZCwgbmV3R3VpZCk7Ci0JCQkJLy9DYW4ndCB1c2UgdGhlIGFib3ZlIGNvbW1lbnRlZCBvdXQgbGluZSwgYmVjYXVzZSBzb21lIGd1aWQgc3RyaW5ncyBhcmUgbm90IHZhbGlkIHJlZ2V4IHBhdHRlcm5zCi0JCQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gcmVwbGFjZUFsbCh0ZXh0LCBvbGRHdWlkLCBuZXdHdWlkKTsJCQotCQkJCWlmIChyZXBsYWNlbWVudC5pbmRleE9mKHJlcGxhY2VkUGF0aCkgPiAwKSB7Ci0JCQkJCXJlcGxhY2VtZW50ID0gcmVwbGFjZW1lbnQucmVwbGFjZUZpcnN0KHJlcGxhY2VkUGF0aCwgcmVwbGFjaW5nUGF0aCk7Ci0JCQkJfQotCQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlcGxhY2VtZW50OiAiICsgcmVwbGFjZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIHJlcGxhY2VtZW50KTsJCi0JCQl9Ci0JCQkKLQkJfQotCQltLmFwcGVuZFRhaWwoc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHRleHQgU3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2VkIFN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNpbmcgU3RyaW5nCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQWxsKFN0cmluZyB0ZXh0LCBTdHJpbmcgcmVwbGFjZWQsIFN0cmluZyByZXBsYWNpbmcpIHsKLQkJaW50IGZyb21JbmRleCA9IDA7Ci0JCWludCBpeCA9IHRleHQuaW5kZXhPZihyZXBsYWNlZCwgZnJvbUluZGV4KTsKLQkJaWYgKGl4IDwgMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0JCQkKLQkJaW50IHJlcGxhY2VkTGVuID0gcmVwbGFjZWQubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoaXggPj0gZnJvbUluZGV4KSB7Ci0JCQlpZiAoaXggPiBmcm9tSW5kZXgpIHsKLQkJCQluZXdUZXh0LmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhmcm9tSW5kZXgsIGl4KSk7Ci0JCQl9Ci0JCQluZXdUZXh0LmFwcGVuZChyZXBsYWNpbmcpOwotCQkJZnJvbUluZGV4ID0gaXggKyByZXBsYWNlZExlbjsKLQkJCWl4ID0gdGV4dC5pbmRleE9mKHJlcGxhY2VkLCBmcm9tSW5kZXgpOwotCQl9Ci0JCWlmIChmcm9tSW5kZXggPCB0ZXh0Lmxlbmd0aCgpICkgewotCQkJbmV3VGV4dC5hcHBlbmQodGV4dC5zdWJzdHJpbmcoZnJvbUluZGV4LCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld1RleHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5L3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwZTBlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBhY2Nlc3MgYW5kIGVkaXRpbmcgc3VwcG9ydCBmb3IgYSBtZXRob2QgbGlicmFyeS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5jdnNpZ25vcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FjMzU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIGRpYWdyYW0gbWlncmF0aW9uIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9kZWJ1Zz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MWUxNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMDUwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZCwKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjhlNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvb2JqMTYvWE1MRmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiNDRiYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vaWNvbnMvZnVsbC9vYmoxNi9YTUxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9pY29ucy9mdWxsL3dpemJhbi9FeHBvcnRYTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDk4MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL2ljb25zL2Z1bGwvd2l6YmFuL0V4cG9ydFhNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzgxYzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZT1FUEYgRGlhZ3JhbSBNaWdyYXRpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIFdpemFyZHMKLWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmROYW1lPVdvcmtmbG93IFRlbXBsYXRlCi1leHBvcnRXb3JrZmxvd1RlbXBsYXRlV2l6YXJkRGVzY3JpcHRpb249RXhwb3J0IGEgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MgZGlhZ3JhbSB0ZW1wbGF0ZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzOTc4NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPHdpemFyZAotICAgICAJICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkcy5NaWdyYXRpb25FeHBvcnRXaXphcmQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L1hNTEZpbGUuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC53aXphcmRzLk1pZ3JhdGlvbkV4cG9ydFdpemFyZCIKLSAgICAgICAgICAgIG5hbWU9IiVleHBvcnRXb3JrZmxvd1RlbXBsYXRlV2l6YXJkTmFtZSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+Ci0JICAgICAgICAgJWV4cG9ydFdvcmtmbG93VGVtcGxhdGVXaXphcmREZXNjcmlwdGlvbgotICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvd2l6YXJkPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyI+Ci0gICAgICA8d2l6YXJkIGlkPSJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkcy5NaWdyYXRpb25FeHBvcnRXaXphcmQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLmRpYWdyYW1NaWdyYXRpb24iPgotICAgICAgPGRpYWdyYW1NaWdyYXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5EaWFncmFtTWlncmF0aW9uIi8+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vRGlhZ3JhbU1pZ3JhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UyMzg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuSURpYWdyYW1NaWdyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLnNlcnZpY2VzLldvcmtmbG93RXhwb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0udXRpbC5NaWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVSZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGRpZ3JhbSBtaWdyYXRpb24gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdSAtIEFwcmlsIDA0LCAyMDA3Ci0gKiBAc2luY2UgIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1pZ3JhdGlvbiBpbXBsZW1lbnRzIElEaWFncmFtTWlncmF0aW9uIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCQotCXB1YmxpYyB2b2lkIG1pZ3JhdGUoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMpIHRocm93cyBFeGNlcHRpb24gewkKLQkJLy8gZGVidWcKLQkJZGVidWcgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQkKLQkJV29ya2Zsb3dFeHBvcnRTZXJ2aWNlIHNlcnZpY2UgPSBuZXcgV29ya2Zsb3dFeHBvcnRTZXJ2aWNlKCk7Ci0JCQotCQlpbnQgIGVycm9yQ291bnQgPSAwOwotCQlNZXRob2RMaWJyYXJ5IGxpYiA9IG51bGw7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPFByb2Nlc3M+IGl0ID0gcHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVByb2Nlc3MgcHJvYyA9IGl0Lm5leHQoKTsKLQkJCWlmIChsaWIgPT0gbnVsbCkgewotCQkJCWxpYiA9IFVtYVV0aWwuZ2V0TWV0aG9kTGlicmFyeShwcm9jKTsKLQkJCX0KLQkJCQotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcHJvYzogIiArIHByb2MpOwkvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHByb2MuZVJlc291cmNlKCk6ICIgKyAgcHJvYy5lUmVzb3VyY2UoKSk7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChwcm9jLmVSZXNvdXJjZSgpICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gIHByb2MuZVJlc291cmNlKCkuZ2V0VVJJKCk6ICIgKyAgcHJvYy5lUmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBtb2RlbEZpbGVQYXRoID0gcHJvYy5lUmVzb3VyY2UoKSA9PSBudWxsID8gbnVsbCA6IAotCQkJCQkJCQkJCXByb2MuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCk7Ci0JCQlpZiAobW9kZWxGaWxlUGF0aCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkJCQkKLQkJCUZpbGUgY3BGb2xkZXJQYXRoID0gbmV3IEZpbGUobW9kZWxGaWxlUGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJU3RyaW5nIGRpYWdyYW1GaWxlUGF0aCA9IGNwRm9sZGVyUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsKLQkJCQkJCQkJCQkiZGlhZ3JhbS54bWkiOwkJCQkvLyROT04tTkxTLTEkCi0JCQlGaWxlIGRpYWdyYW1GaWxlID0gbmV3IEZpbGUoZGlhZ3JhbUZpbGVQYXRoKTsKLQkJCWlmIChkaWFncmFtRmlsZS5leGlzdHMoKSkgewotCQkJCWRpYWdyYW1GaWxlLmRlbGV0ZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IERlbGV0ZWQgZGlhZ3JhbUZpbGU6ICIgKyBkaWFncmFtRmlsZSk7Ly8kTk9OLU5MUy0xJAotCQkJCVJlc291cmNlVXRpbC5yZWZyZXNoUmVzb3VyY2VzKGxpYiwgbnVsbCk7Ci0JCQl9Ci0JCQkvL2RpYWdyYW1GaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGRpYWdyYW1GaWxlOiAiICsgZGlhZ3JhbUZpbGUpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJc2VydmljZS5leHBvcnQocHJvYywgcHJvYywgImRpYWdyYW0ueG1pIiwgY3BGb2xkZXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllcnJvckNvdW50Kys7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGZhaWxlZDogIiArIGRpYWdyYW1GaWxlKTsJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHByb2Nlc3Nlcy5zaXplKCk6ICIgKyBwcm9jZXNzZXMuc2l6ZSgpKTsJLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZXJyb3JDb3VudDogIiArIGVycm9yQ291bnQpOwkvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJlbW92ZU9sZERpYWdyYW1zKHByb2Nlc3NlcywgbGliKTsJCQkJCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlT2xkRGlhZ3JhbXMoQ29sbGVjdGlvbjxQcm9jZXNzPiBwcm9jZXNzZXMsIE1ldGhvZExpYnJhcnkgbGliKSB7CQkKLQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBuZWVkU2F2ZSA9IGZhbHNlOwotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHJlbW92ZU9sZERpYWdyYW1zIC4uLiIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzPiBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlQcm9jZXNzIHByb2MgPSBpdC5uZXh0KCk7Ci0JCQlib29sZWFuIGRpcnR5ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCU1hcCBhY3Rpdml0aWVzID0gTWlncmF0aW9uVXRpbC5nZXRBY3Rpdml0aWVzKHByb2MsIHRydWUpOwotCQkJCWZvciAoSXRlcmF0b3IgaWl0ID0gYWN0aXZpdGllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpaXQuaGFzTmV4dCgpOykgewkJCQkKLQkJCQkJCUFjdGl2aXR5IGFjdCA9IChBY3Rpdml0eSkgaWl0Lm5leHQoKTsJCQkJCQkKLQkJCQkJCUVPYmplY3QgY29udGFpbmVyID0gYWN0LmVDb250YWluZXIoKTsKLQkJCQkJCWlmIChjb250YWluZXIgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgY29udGFpbmVyOwotCQkJCQkJCWlmICghIHBrZy5nZXREaWFncmFtcygpLmlzRW1wdHkoKSkgewotCQkJCQkJCQlBcnJheUxpc3QgcmVtb3ZlTGlzdCA9IG5ldyBBcnJheUxpc3QocGtnLmdldERpYWdyYW1zKCkpOwotCQkJCQkJCQlwa2cuZ2V0RGlhZ3JhbXMoKS5yZW1vdmVBbGwocmVtb3ZlTGlzdCk7Ci0JCQkJCQkJCWRpcnR5ID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwcm9jOiAiICsgcHJvYyk7CS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+ICBwa2c6ICIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRpcnR5KSB7Ci0JCQkJCXByb2MuZVJlc291cmNlKCkuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJCW5lZWRTYXZlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0JCQkKLQkJfQotCQlpZiAobmVlZFNhdmUpIHsKLQkJCVJlc291cmNlIHJlc291cmNlID0gbGliLmVSZXNvdXJjZSgpOwotCQkJTXVsdGlGaWxlUmVzb3VyY2VTZXRJbXBsIHJlc291cmNlU2V0ID0gKE11bHRpRmlsZVJlc291cmNlU2V0SW1wbCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJCU1hcCBzYXZlT3B0aW9ucyA9IHJlc291cmNlU2V0LmdldERlZmF1bHRTYXZlT3B0aW9ucygpOwotCQkJdHJ5IHsKLQkJCQlyZXNvdXJjZVNldC5zYXZlKHNhdmVPcHRpb25zLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQkKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb25QbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL0RpYWdyYW1NaWdyYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNmY5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9EaWFncmFtTWlncmF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbiBleHRlbmRzIEFic3RyYWN0UGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBEaWFncmFtTWlncmF0aW9uUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW1NaWdyYXRpb25QbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvbkV4cG9ydENvbnN0YW50cy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTRhOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzIHsKLQkKLQkvKioKLQkgKiBUaGUgcHJvY2VzcyB0eXBlIHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NfVFlQRSA9ICJwcm9jZXNzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwcm9jZXNzIG5hbWUgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU19OQU1FID0gInByb2Nlc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHByb2Nlc3MgY29udGV4dCBwcmVmZXJlbmNlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0NPTlRFWFQgPSAiY29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB0YXJnZXQgZGlyZWN0b3JpZXMgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RJUkVDVE9SSUVTID0gInRhcmdldERpcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgbmFtZXMgcHJlZmVyZW5jZSBrZXkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfTkFNRVMgPSAidGVtcGxhdGVOYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcHJvY2VzcyBjb250ZXh0IHByZWZlcmVuY2Uga2V5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0NPTlRFWFQgPSAiYWN0aXZpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnID0gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjExMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW07Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwNDk0MDAzNTA1Mjc3MTA2MTRMOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgTWlncmF0aW9uRXhwb3J0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9NaWdyYXRpb25SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvblJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2UzYjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL01pZ3JhdGlvblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBNaWdyYXRpb24gcmVzb3VyY2VzCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWlncmF0aW9uUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBNaWdyYXRpb25SZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc0dyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc05hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfY29udGV4dE5hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVHcm91cF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVOYW1lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19leHBvcnRfd2l6YXJkX2RpckxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9icm93c2VCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrZmxvd19vdmVyd3JpdGVUZXh0RGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X292ZXJ3cml0ZVRleHRfbXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtmbG93X2V4cG9ydF93aXphcmRfYWN0aXZpdGllc05hbWVMYWJlbF90ZXh0OwotCi0JCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5fbWV0aG9kX2xpYnJhcnlfZXJyb3JfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90ZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfRk9SSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0lOSVRJQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9GSU5BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfRlJFRV9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfTUVSR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR1JBUEhfTk9ERV9KT0lOOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdSQVBIX05PREVfTElOSzsKLQkKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNaWdyYXRpb25SZXNvdXJjZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmMzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90aXRsZT1FeHBvcnQgV29ya2Zsb3cgV2l6YXJkCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX3RleHQ9V2l6YXJkIHRvIGV4cG9ydCB3b3JrZmxvdyAoYWN0aXZpdHkgZGlhZ3JhbXMpCi13b3JrZmxvd19leHBvcnRfd2l6YXJkX3Byb2Nlc3NHcm91cF90ZXh0PVByb2Nlc3MKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbl90ZXh0PUNhcGFiaWxpdHkgUGF0dGVybgotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbl90ZXh0PURlbGl2ZXJ5IFByb2Nlc3MKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfcHJvY2Vzc05hbWVMYWJlbF90ZXh0PVByb2Nlc3M6Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2NvbnRleHROYW1lTGFiZWxfdGV4dD1Db25maWd1cmF0aW9uOgotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZUdyb3VwX3RleHQ9VGVtcGxhdGUKLXdvcmtmbG93X2V4cG9ydF93aXphcmRfdGVtcGxhdGVOYW1lTGFiZWxfdGV4dD1GaWxlIE5hbWU6Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2RpckxhYmVsX3RleHQ9RGlyZWN0b3J5Ogotd29ya2Zsb3dfZXhwb3J0X3dpemFyZF9icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLXdvcmtmbG93X292ZXJ3cml0ZVRleHREaWFsb2dfdGl0bGU9T3ZlcndyaXRlCi13b3JrZmxvd19vdmVyd3JpdGVUZXh0X21zZz1EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGU/Ci13b3JrZmxvd19leHBvcnRfd2l6YXJkX2FjdGl2aXRpZXNOYW1lTGFiZWxfdGV4dD1BY3Rpdml0eToKLQotb3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90aXRsZT1PcGVuIE1ldGhvZCBMaWJyYXJ5IEVycm9yCi1vcGVuX21ldGhvZF9saWJyYXJ5X2Vycm9yX3RleHQ9WW91IG5lZWQgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5IGJlZm9yZSBwZXJmb3JtaW5nIGFuIGV4cG9ydC4KLQotIyBHcmFwaCBOb2RlIG5hbWVzCi0KLUdSQVBIX05PREVfRk9SSz1Gb3JrIE5vZGUKLUdSQVBIX05PREVfSU5JVElBTD1TdGFydCBOb2RlCi1HUkFQSF9OT0RFX0ZJTkFMPUVuZCBOb2RlCi1HUkFQSF9OT0RFX0RFQ0lTSU9OPURlY2lzaW9uIG5vZGUKLUdSQVBIX05PREVfRlJFRV9URVhUPUZyZWUgVGV4dAotR1JBUEhfTk9ERV9NRVJHRT1NZXJnZSBOb2RlCi1HUkFQSF9OT0RFX0pPSU49Sm9pbiBOb2RlCi1HUkFQSF9OT0RFX0xJTks9TGluawpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eU1hcE5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eU1hcE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwZjliNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvQWN0aXZpdHlNYXBOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5icmlkZ2UuQnJpZGdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlNYXBOb2RlIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlNYXBOb2RlKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoU3RydWN0dXJlZEFjdGl2aXR5Tm9kZSkgZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RydWN0dXJlZEFjdGl2aXR5Tm9kZSgpKTsKLQkJT2JqZWN0IG9iaiA9IChPYmplY3QpIG5vZGUuZ2V0T2JqZWN0KCk7Ci0vKgkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbih1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLCAKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9QSEFTRSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTik7Ci0JCX0gZWxzZSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYWRkRUFubm90YXRpb25UeXBlKHVtbE5vZGUsIAotCQkJCQlCcmlkZ2VIZWxwZXIuVU1BX0FDVElWSVRZKTsKLQkJfSovCi0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKHVtbE5vZGUsICgoTWV0aG9kRWxlbWVudCkgb2JqKSk7Ci0JCX0KLQotCQlpZiAodW1sTm9kZSAhPSBudWxsKSB7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9BY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNGIyMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0FjdGl2aXR5UGFyYW1ldGVyTWFwZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5UGFyYW1ldGVyTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgQWN0aXZpdHlQYXJhbWV0ZXJNYXBlTm9kZShOb2RlIG5vZGUpIHsKLQkJc3VwZXIobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHVtbCBub2RlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTm9kZSgpIHsKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCQl1bWxOb2RlID0gKEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUsCi0JCQkJVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlQYXJhbWV0ZXJOb2RlKCkpOwotCQlPYmplY3Qgb2JqID0gKE9iamVjdCkgbm9kZS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbih1bWxOb2RlLCAoKE1ldGhvZEVsZW1lbnQpIG9iaikpOwotCQl9Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCUJyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwgCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJQnJpZGdlSGVscGVyLmFkZEVBbm5vdGF0aW9uVHlwZSh1bWxOb2RlLCAKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpOwotCQl9Ci0KLQkJaWYgKHVtbE5vZGUgIT0gbnVsbCkgewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9EZWNpc2lvbk5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9EZWNpc2lvbk5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE4NThhNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRGVjaXNpb25Ob2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5EZWNpc2lvbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWNpc2lvbk5vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgRGVjaXNpb25Ob2RlTWFwKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogVXBkYXRlIHVtbCBub2RlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTm9kZSgpIHsKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCi0JCXVtbE5vZGUgPSAoRGVjaXNpb25Ob2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiAiICIsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWNpc2lvbk5vZGUoKSk7Ci0JCQotCQlpZih1bWxOb2RlICE9IG51bGwpewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9GaW5hbE5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9GaW5hbE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyNzk2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRmluYWxOb2RlTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eUZpbmFsTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEZpbmFsTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyBGaW5hbE5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQkKLQkJc3VwZXIudXBkYXRlTm9kZSgpOwotCQl1bWxOb2RlID0gKEFjdGl2aXR5RmluYWxOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiBHUkFQSF9OT0RFX0ZJTkFMLCAKLQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eUZpbmFsTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0ZvcmtOb2RlTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRm9ya05vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhOWYyYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvRm9ya05vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkZvcmtOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgRm9ya05vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIEZvcmtOb2RlTWFwKE5vZGUgbm9kZSkgewotCQlzdXBlcihub2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogIFVwZGF0ZSB1bWwgbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZU5vZGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZU5vZGUoKTsKLQotCQl1bWxOb2RlID0gKEZvcmtOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiBHUkFQSF9OT0RFX0ZPUktfTk9ERSwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRGb3JrTm9kZSgpKTsKLQkKLQkJaWYodW1sTm9kZSAhPSBudWxsKXsKLQkJCWdyYXBoVU1MTm9kZU1hcC5wdXQobm9kZSwgdW1sTm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9JTWFwQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSU1hcENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDE1Zjg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9JTWFwQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5NaWdyYXRpb25SZXNvdXJjZXM7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1hcENvbnN0YW50cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRlYnVnICA9IHRydWU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GT1JLX05PREUgPSAiIjsgLy9NaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9GT1JLOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0lOSVRJQUwgPSAiIjsgLy9NaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9JTklUSUFMOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0ZJTkFMID0gIiI7IC8vIE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0ZJTkFMOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkFQSF9OT0RFX0RFQ0lTSU9OID0gIE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0RFQ0lTSU9OOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9GUkVFX1RFWFQgPSBNaWdyYXRpb25SZXNvdXJjZXMuR1JBUEhfTk9ERV9GUkVFX1RFWFQ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JBUEhfTk9ERV9NRVJHRSA9IE1pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX01FUkdFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSQVBIX05PREVfSk9JTiA9ICIiOyAvL01pZ3JhdGlvblJlc291cmNlcy5HUkFQSF9OT0RFX0pPSU47IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgTWFwIGdyYXBoVU1MTm9kZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSW5pdGlhbE5vZGVNYXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Jbml0aWFsTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjY1YTRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9Jbml0aWFsTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0aWFsTm9kZU1hcCBleHRlbmRzIE1hcE5vZGUgewotCi0JCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwdWJsaWMgSW5pdGlhbE5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoSW5pdGlhbE5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfSU5JVElBTCwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbml0aWFsTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL0pvaW5Ob2RlTWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSm9pbk5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5MmE1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvSm9pbk5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkpvaW5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEpvaW5Ob2RlTWFwIGV4dGVuZHMgTWFwTm9kZSB7Ci0KLQlwdWJsaWMgSm9pbk5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoSm9pbk5vZGUpZ2V0QWN0aXZpdHkoKS5jcmVhdGVOb2RlKG5hbWUgPSAobmFtZSAhPSBudWxsKT8gbmFtZSA6IEdSQVBIX05PREVfSk9JTiwgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRKb2luTm9kZSgpKTsKLQkJCi0JCWlmKHVtbE5vZGUgIT0gbnVsbCl7Ci0JCQlncmFwaFVNTE5vZGVNYXAucHV0KG5vZGUsIHVtbE5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcEZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYjUzNmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICovCi0KLQotcHVibGljIGNsYXNzIE1hcEZhY3RvcnkgewotCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0Jc3RhdGljIE1hcEZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgTWFwRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZXRlIG1hcCBub2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE1hcE5vZGUgY3JlYXRlKE5vZGUgbm9kZSkgewotCQlpbnQgY2xhc3NpZmllciA9IG5vZGUuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCk7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcikgewotCQljYXNlIE1vZGVsUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX05PREU6Ci0JCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrRG93bkVsZW1lbnROb2RlKG5vZGUpOwotCQljYXNlIE1vZGVsUGFja2FnZS5UWVBFRF9OT0RFOgotCQkJVHlwZWROb2RlIHR5cGVkTm9kZSA9IChUeXBlZE5vZGUpIG5vZGU7Ci0JCQlpZiAodHlwZWROb2RlLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuREVDSVNJT04pIHsKLQkJCQlMaXN0IGluY29taW5nQ29ubmVjdGlvbnMgPSB0eXBlZE5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJCQotCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpCi0JCQkJCXJldHVybiBjcmVhdGVNZXJnZU5vZGUobm9kZSk7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gY3JlYXRlRGVjaXNpb25Ob2RlKG5vZGUpOwotCQkJCQotLy8JCQkJTGlzdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSkKLS8vCQkJCQlyZXR1cm4gY3JlYXRlTWVyZ2VOb2RlKG5vZGUpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID09IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxKQotLy8JCQkJCXJldHVybiBjcmVhdGVEZWNpc2lvbk5vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPiAxCi0vLwkJCQkJCSYmIG91dGdvaW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkgewotLy8JCQkJCWNyZWF0ZU1lcmdlTm9kZShub2RlKTsKLS8vCQkJCQlyZXR1cm4gY3JlYXRlRGVjaXNpb25Ob2RlKG5vZGUpOwotLy8JCQkJfQotCQkJfSBlbHNlIGlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5TVEFSVCkKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbE5vZGUobm9kZSk7Ci0JCQllbHNlIGlmICh0eXBlZE5vZGUuZ2V0VHlwZSgpID09IFR5cGVkTm9kZS5FTkQpCi0JCQkJcmV0dXJuIGNyZWF0ZUZpbmFsTm9kZShub2RlKTsKLQkJCWVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLlNZTkNIX0JBUikgewotCQkJCUxpc3QgaW5jb21pbmdDb25uZWN0aW9ucyA9IHR5cGVkTm9kZS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMSkKLQkJCQkJcmV0dXJuIGNyZWF0ZUpvaW5Ob2RlKG5vZGUpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGNyZWF0ZUZvcmtOb2RlKG5vZGUpOwotLy8JCQkJTGlzdCBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gdHlwZWROb2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLS8vCQkJCWlmIChpbmNvbWluZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEgJiYgb3V0Z29pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSkKLS8vCQkJCQlyZXR1cm4gY3JlYXRlSm9pbk5vZGUobm9kZSk7Ci0vLwkJCQlpZiAoaW5jb21pbmdDb25uZWN0aW9ucy5zaXplKCkgPT0gMSAmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpCi0vLwkJCQkJcmV0dXJuIGNyZWF0ZUZvcmtOb2RlKG5vZGUpOwotLy8JCQkJaWYgKGluY29taW5nQ29ubmVjdGlvbnMuc2l6ZSgpID4gMQotLy8JCQkJCQkmJiBvdXRnb2luZ0Nvbm5lY3Rpb25zLnNpemUoKSA+IDEpIHsKLS8vCQkJCQljcmVhdGVKb2luTm9kZShub2RlKTsKLS8vCQkJCQlyZXR1cm4gY3JlYXRlRm9ya05vZGUobm9kZSk7Ci0vLwkJCQl9Ci0JCQl9IGVsc2UgaWYgKHR5cGVkTm9kZS5nZXRUeXBlKCkgPT0gVHlwZWROb2RlLkZSRUVfVEVYVCkgewotCQkJCXJldHVybiBjcmVhdGVGcmVlVGV4dE5vZGUobm9kZSk7Ci0JCQl9Ci0JCWNhc2UgTW9kZWxQYWNrYWdlLkxJTks6Ci0JCQlyZXR1cm4gY3JlYXRlQ29udHJvbEZsb3cobm9kZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIG5vZGUuZUNsYXNzKCkuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hcE5vZGUgY3JlYXRlV29ya0JyZWFrRG93bkVsZW1lbnROb2RlKE5vZGUgbm9kZSkgewotCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRPYmplY3QoKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5KSAKLQkJCXJldHVybiBuZXcgQWN0aXZpdHlNYXBOb2RlKG5vZGUpOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvciB8fCBvYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIAotCQkJcmV0dXJuIG5ldyBBY3Rpdml0eVBhcmFtZXRlck1hcGVOb2RlKG5vZGUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUZyZWVUZXh0Tm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUZpbmFsTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBGaW5hbE5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUluaXRpYWxOb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEluaXRpYWxOb2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVDb250cm9sRmxvdyhOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZU1lcmdlTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBNZXJnZU5vZGVNYXAobm9kZSk7Ci0JfQotCi0JcHJpdmF0ZSBNYXBOb2RlIGNyZWF0ZUpvaW5Ob2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IEpvaW5Ob2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVEZWNpc2lvbk5vZGUoTm9kZSBub2RlKSB7Ci0JCXJldHVybiBuZXcgRGVjaXNpb25Ob2RlTWFwKG5vZGUpOwotCX0KLQotCXByaXZhdGUgTWFwTm9kZSBjcmVhdGVGb3JrTm9kZShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBGb3JrTm9kZU1hcChub2RlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwTm9kZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01hcE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4N2E0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5BYnNvbHV0ZUJlbmRwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUHJlY2lzaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eUZpbmFsTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnV0aWwuRGlhZ3JhbUNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTmFtZWROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uQm91bmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5JZGVudGl0eUFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uUmVsYXRpdmVCZW5kcG9pbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uZGF0YXR5cGUuUmVsYXRpdmVCZW5kcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTFBhY2thZ2U7Ci0KLS8qKgotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBOb2RlIGltcGxlbWVudHMgSU1hcENvbnN0YW50cyB7Ci0KLQlwcm90ZWN0ZWQgTm9kZSBub2RlOwotCi0JLy9wcml2YXRlIFJlc291cmNlU2V0IHJlc291cmNlU2V0OwotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm90YXRpb25Ob2RlOwotCi0JcHJpdmF0ZSBBY3Rpdml0eSBhY3Rpdml0eTsKLQkKLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBBY3Rpdml0eU5vZGUgdW1sTm9kZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTUFHRV9IRUlHSFQgPSAzMjsKLQkKLQlwdWJsaWMgTWFwTm9kZShOb2RlIG5vZGUpIHsKLQkJdGhpcy5ub2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgTWFwTm9kZSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdXBkYXRlUmVzb3VyY2UoKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQotCQkvLyBDaGVjayBpZiBub3RhdGlvbiBlbGVtZW50IGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGdyYXBoVU1MTm9kZU1hcC5nZXQobm9kZSkgIT0gbnVsbCkgewotCQkJb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlIHRlbXBVTUxOb2RlID0gKEFjdGl2aXR5Tm9kZSkgZ3JhcGhVTUxOb2RlTWFwCi0JCQkJCS5nZXQobm9kZSk7Ci0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRlbXBOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQlkaWFncmFtLCB0ZW1wVU1MTm9kZSk7Ci0JCQlpZiAodGVtcE5vdGF0aW9uTm9kZSAhPSBudWxsKQotCQkJCXJldHVybiB0ZW1wTm90YXRpb25Ob2RlOwotCi0JCX0KLQotCQkvLyBDcmVhdGUgQWN0aXZpdHkgTm9kZQotCQl1cGRhdGVOb2RlKCk7Ci0KLQkJLy8gQ3JlYXRlIE5vdGF0aW9uIG5ub2RlCi0JCW5vdGF0aW9uTm9kZSA9IE1hcFV0aWwuY3JlYXRlTm90YXRpb25Ob2RlX0FEKGRpYWdyYW0sIHVtbE5vZGUpOwotCQlkaWFncmFtLmluc2VydENoaWxkKG5vdGF0aW9uTm9kZSk7Ci0KLQkJLy8gc2V0IHNpemUKLQkJc2V0TGF5b3V0Q29uc3RyYWludChub2RlLCBub3RhdGlvbk5vZGUpOwotCi0JCS8vIHNldCBlbGVtZW50Ci0JCW5vdGF0aW9uTm9kZS5zZXRFbGVtZW50KHVtbE5vZGUpOwotCi0JCS8vIG1hcmsgaW5oZXJpdGVkCi0JCXNldEluaGVyaXRlZEF0dHJpYnV0ZShub2RlLCBub3RhdGlvbk5vZGUpOwotCQkKLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBub3RhdGlvbk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TGF5b3V0Q29uc3RyYWludChvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSkgewotCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQkJCi0JCWludCB0eXBlID0gbmV3IEludGVnZXIobm90YXRpb25Ob2RlLmdldFR5cGUoKSkuaW50VmFsdWUoKTsKLQkJaWYgKG5vZGUuZ2V0SGVpZ2h0KCkgPT0gLTEpIHsKLQkJCSBpZiAodHlwZSA9PSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgdHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCXsKLQkJCQkgYm91bmRzLnNldEhlaWdodCgyNCk7Ci0JCQkgfQotCQkJIGVsc2UgaWYgKHR5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwgdHlwZSA9PSBKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkJewotCQkJCSBib3VuZHMuc2V0SGVpZ2h0KDUpOwotCQkJIH0KLQkJCSBlbHNlIGlmICh0eXBlID09IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKXsKLQkJCQkgYm91bmRzLnNldEhlaWdodCgyNCk7Ci0JCQkgfQotCQl9IGVsc2UgewotCQkJYm91bmRzLnNldEhlaWdodChub2RlLmdldEhlaWdodCgpKTsKLQkJfQotCQkKLQkJLy8gRHVlIHRvIGJ1ZyBpbiBvbGQgZGlhZ3JhbSwgc29tZSBvZiB0aGUgZGVjaXNpb25Ob2RlIHdpZHRoIGlzIC0xCi0JCWlmICgobm9kZS5nZXRXaWR0aCgpID09IC0xKSAmJiAodHlwZSA9PSBEZWNpc2lvbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJfHwgdHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpKSB7Ci0JCQkJYm91bmRzLnNldFdpZHRoKDQ4KTsKLQkJfSBlbHNlIHsKLQkJCWJvdW5kcy5zZXRXaWR0aChub2RlLmdldFdpZHRoKCkpOwotCQl9Ci0JCQotCQlpbnQgdyA9IGJvdW5kcy5nZXRXaWR0aCgpOwotCQlpbnQgaCA9IGJvdW5kcy5nZXRIZWlnaHQoKTsKLQkJRGltZW5zaW9uIGRpbSA9IERpYWdyYW1Db3JlVXRpbC5nZXRUZXh0U2l6ZUluV3JhcExhYmVsKG5hbWUsIG51bGwsIHcsIGgsIG51bGwpOwotCQlpbnQgZGltdyA9IGRpbS53aWR0aDsKLQkJaWYgKHcgPCBkaW13ICYmIGRpbXcgIT0gMCkgewotCQkJYm91bmRzLnNldFdpZHRoKGRpbXcpOwotCQl9Ci0JCQotLy8JCWJvdW5kcy5zZXRIZWlnaHQobm9kZS5nZXRIZWlnaHQoKSk7Ci0vLwkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCWJvdW5kcy5zZXRYKG5vZGUuZ2V0TG9jYXRpb24oKS54KTsKLQkJYm91bmRzLnNldFkobm9kZS5nZXRMb2NhdGlvbigpLnkpOwotCQlub3RhdGlvbk5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChib3VuZHMpOwotCX0KLQotCS8qKgotCSAqIFNldCBpbmhlcml0ZWQgYXR0cmlidXRlCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbm90YXRpb25Ob2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEluaGVyaXRlZEF0dHJpYnV0ZShvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUsCi0JCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSkgewotCQlpZiAobm9kZS5nZXRMaW5rZWRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJaWYgKG5vZGUuZ2V0R3JhcGhOb2RlKCkuZ2V0QnJpZWZEZXNjcmlwdGlvbigpICE9IG51bGwKLQkJCQkJJiYgIShub2RlLmdldEdyYXBoTm9kZSgpLmdldEJyaWVmRGVzY3JpcHRpb24oKS50cmltKCkKLQkJCQkJCQkuZXF1YWxzKCIiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlCcmlkZ2VIZWxwZXIubWFya0luaGVyaXRlZChub3RhdGlvbk5vZGUpOwotCQl9IAotCX0KLQkKLQkKLQkvKioKLQkgKiBGaW5kIGNvcnJlc3BvbmRpbmcgbm90YXRpb24gbm9kZSBmb3IgdGhlIHVtbCBub2RlIGluIHRoZSBkaWFncmFtCi0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gdW1sTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgZmluZE5vdGF0aW9uTm9kZSgKLQkJCURpYWdyYW0gZGlhZ3JhbSwgQWN0aXZpdHlOb2RlIHVtbE5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQlpZiAobGlzdCAhPSBudWxsICYmIGxpc3Quc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgbm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBpdGVyYXRvcgotCQkJCQkJLm5leHQoKTsKLQkJCQlpZiAodW1sTm9kZS5lcXVhbHMobm9kZS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiBub2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgVW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIE5hbWVkTm9kZSkgewotCQkJbmFtZSA9ICgoTmFtZWROb2RlKSBub2RlKS5nZXROYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgb3V0Z29pbmcgY29ubmVjdGlvbnMKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIG91dGdvaW5nQ29ubmVjdGlvbnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBub2RlLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQotCQlpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiBjb25uZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8gY3JlYXRlIGNvbm5lY3Rpb24KLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkJCS5nZXQobm9kZSk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQkJZ2V0RGlhZ3JhbSgpLCBzb3VyY2VOb2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyBzb3VyY2UgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRTb3VyY2VFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBVTUwgY29udHJvbCBmbG93Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgQ29udHJvbEZsb3cgY3JlYXRlQ29udHJvbEZsb3coKSB7Ci0JCUNvbnRyb2xGbG93IGNvbnRyb2xGbG93ID0gKG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93KSBnZXRBY3Rpdml0eSgpCi0JCQkJLmNyZWF0ZUVkZ2UoIiIsIC8qTWlncmF0aW9uUmVzb3VyY2VzLkdSQVBIX05PREVfTElOSywqLyAvLyROT04tTkxTLTEkCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250cm9sRmxvdygpKTsKLQotCQlyZXR1cm4gY29udHJvbEZsb3c7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgc291cmNlIGFuZCB0YXJnZXQgZW5kIHBvaW50cyBmb3Igc3luY2hyb25pemF0aW9uIGJhciBhbmQgZGVjaXNpb24gbm9kZQotCSAqIEBwYXJhbSBlZGdlCi0JICogQHBhcmFtIGZsb3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCVBvaW50IHNyY1BvaW50ID0gZmxvdy5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQotCQlWaWV3IHNyY1ZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldFZpZXcgPSBlZGdlLmdldFRhcmdldCgpOwotCQlpbnQgc3JjVHlwZSA9IG5ldyBJbnRlZ2VyKHNyY1ZpZXcuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCQlpbnQgdGFyZ2V0VHlwZSA9IG5ldyBJbnRlZ2VyKHRhcmdldFZpZXcuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCi0JCWlmIChzcmNUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHNyY1R5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwKLQkJCQlzcmNUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCBzcmNUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJaWYgKHNyY1BvaW50ICE9IG51bGwKLQkJCQkJJiYgc3JjVmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgKSB7Ci0JCQkJQm91bmRzIGJvdW5kcyA9IChCb3VuZHMpICgob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgc3JjVmlldykKLQkJCQkJCS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJSWRlbnRpdHlBbmNob3IgYW5jaG9yID0gY3JlYXRlSWRlbnRpdHlBbmNob3Ioc3JjUG9pbnQsIGJvdW5kcyk7Ci0JCQkJaWYgKGFuY2hvciAhPSBudWxsKQotCQkJCQllZGdlLnNldFNvdXJjZUFuY2hvcihhbmNob3IpOwotCQkJfQotCQl9Ci0JCWlmICh0YXJnZXRUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lEIHx8IHRhcmdldFR5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQgfHwKLQkJCQl0YXJnZXRUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCB8fCB0YXJnZXRUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJaWYgKHRhcmdldFBvaW50ICE9IG51bGwKLQkJCQkJJiYgdGFyZ2V0VmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHsKLQkJCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgKChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSB0YXJnZXRWaWV3KQotCQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQlJZGVudGl0eUFuY2hvciBhbmNob3IgPSBjcmVhdGVJZGVudGl0eUFuY2hvcih0YXJnZXRQb2ludCwgYm91bmRzKTsKLQkJCQlpZiAoYW5jaG9yICE9IG51bGwpCi0JCQkJCWVkZ2Uuc2V0VGFyZ2V0QW5jaG9yKGFuY2hvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlIGlkZW50aXR5IGFuY2hvcgotCSAqIEBwYXJhbSBwb2ludAotCSAqIEBwYXJhbSBib3VuZHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJZGVudGl0eUFuY2hvciBjcmVhdGVJZGVudGl0eUFuY2hvcihQb2ludCBwb2ludCwgQm91bmRzIGJvdW5kcykgewotCQlQb2ludCB0ZW1wUG9pbnQgPSBuZXcgUG9pbnQoYm91bmRzLmdldFgoKSArIHBvaW50LngsIGJvdW5kcy5nZXRZKCkKLQkJCQkrIHBvaW50LnkpOwotCi0JCVByZWNpc2lvblBvaW50IHByZVBvaW50ID0gTWFwVXRpbC5nZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKHRlbXBQb2ludCwgYm91bmRzKTsKLQkJU3RyaW5nIGlkID0gTWFwVXRpbC5jb21wb3NlVGVybWluYWxTdHJpbmcocHJlUG9pbnQpOwotCi0JCUlkZW50aXR5QW5jaG9yIHZhbHVlID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGl0eUFuY2hvcigpOwotCQl2YWx1ZS5zZXRJZChpZCk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBMb2FkIHJlbGF0aXZlIGJlbmQgcG9pbnRzCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQmVuZFBvaW50cyhFZGdlIGVkZ2UsIExpbmsgZmxvdykgewotCQlMaXN0IGxpc3QgPSBmbG93LmdldEJlbmRwb2ludHMoKTsKLQkJTGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4gcmVsYXRpdmVQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PigpOwotCi0JCVJlbGF0aXZlQmVuZHBvaW50IHJicCA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludCgwLCAwLCAwLCAwKTsKLQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBhYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHNyY05vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgZWRnZS5nZXRTb3VyY2UoKTsKLQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgZWRnZS5nZXRUYXJnZXQoKTsKLQkJCQlpbnQgc3JjVHlwZSA9IG5ldyBJbnRlZ2VyKHNyY05vZGUuZ2V0VHlwZSgpKS5pbnRWYWx1ZSgpOwotCQkJCWludCB0YXJnZXRUeXBlID0gbmV3IEludGVnZXIodGFyZ2V0Tm9kZS5nZXRUeXBlKCkpLmludFZhbHVlKCk7Ci0JCQkJCi0JCQkJQm91bmRzIHNvdXJjZUJvdW5kcyA9IChCb3VuZHMpIHNyY05vZGUuZ2V0TGF5b3V0Q29uc3RyYWludCgpOwkJCQkKLQkJCQlCb3VuZHMgdGFyZ2V0Qm91bmRzID0gKEJvdW5kcykgdGFyZ2V0Tm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkJCQkKLQkJCQlpbnQgc3JjTGluZSA9IE1hcFV0aWwuZ2V0Tm9PZkxpbmVzKHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXModGFyZ2V0Tm9kZSk7Ci0JCQkJaW50IHNyY0hlaWdodCA9IE1hcFV0aWwuZ2V0VGV4dEhlaWdodChzcmNOb2RlKTsKLQkJCQlpbnQgdGFyZ2V0SGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHRhcmdldE5vZGUpOwotCQkJCQotCQkJCWludCBzcmNYID0gc291cmNlQm91bmRzLmdldFgoKSArIHNvdXJjZUJvdW5kcy5nZXRXaWR0aCgpIC8gMjsKLQkJCQlpbnQgc3JjWSA9IHNvdXJjZUJvdW5kcy5nZXRZKCkgKyAoSU1BR0VfSEVJR0hUICsgKHNyY0xpbmUgKiBzcmNIZWlnaHQpKSAvIDI7Ci0JCQkJaW50IHRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCB0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKSArIChJTUFHRV9IRUlHSFQgKyAodGFyZ2V0TGluZSAqIHRhcmdldEhlaWdodCkpIC8gMjsKLQotCQkJCWlmIChzcmNUeXBlID09IEZvcmtOb2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCBzcmNUeXBlID09IEpvaW5Ob2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCBzcmNUeXBlID09IERlY2lzaW9uTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRAotCQkJCQkJfHwgc3JjVHlwZSA9PSBNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpIHsKLQkJCQkJUG9pbnQgc3JjUG9pbnQgPSBmbG93LmdldFNvdXJjZUVuZFBvaW50KCk7Ci0JCQkJCWlmIChzcmNQb2ludCAhPSBudWxsKSB7Ci0JCQkJCQlzcmNYID0gc291cmNlQm91bmRzLmdldFgoKSArIHNyY1BvaW50Lng7Ci0JCQkJCQlzcmNZID0gc291cmNlQm91bmRzLmdldFkoKSArIHNyY1BvaW50Lnk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRhcmdldFR5cGUgPT0gRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHRhcmdldFR5cGUgPT0gSm9pbk5vZGVFZGl0UGFydC5WSVNVQUxfSUQKLQkJCQkJCXx8IHRhcmdldFR5cGUgPT0gRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lECi0JCQkJCQl8fCB0YXJnZXRUeXBlID09IE1lcmdlTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkgewotCQkJCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsJCQotCQkJCQlpZiAodGFyZ2V0UG9pbnQgIT0gbnVsbCkgewotCQkJCQkJdGFyWCA9IHRhcmdldEJvdW5kcy5nZXRYKCkgKyB0YXJnZXRQb2ludC54OwotCQkJCQkJdGFyWSA9IHRhcmdldEJvdW5kcy5nZXRZKCkgKyB0YXJnZXRQb2ludC55OwotCQkJCQl9CQkJCi0JCQkJfQkJCQotCQkJCWlmICh0YXJnZXRUeXBlID09IEFjdGl2aXR5RmluYWxOb2RlRWRpdFBhcnQuVklTVUFMX0lEKXsJCi0JCQkJCXRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCQl0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKSArIHRhcmdldEJvdW5kcy5nZXRIZWlnaHQoKSAvIDI7CQkKLQkJCQl9Ci0KLQkJCQlpbnQgcmVsMSA9IGFicC54IC0gc3JjWDsKLQkJCQlpbnQgcmVsMiA9IGFicC55IC0gc3JjWTsKLQkJCQlpbnQgcmVsMyA9IGFicC54IC0gdGFyWDsKLQkJCQlpbnQgcmVsNCA9IGFicC55IC0gdGFyWTsKLQotCQkJCVJlbGF0aXZlQmVuZHBvaW50IHJicDEgPSBuZXcgUmVsYXRpdmVCZW5kcG9pbnQocmVsMSwgcmVsMiwKLQkJCQkJCXJlbDMsIHJlbDQpOwotCQkJCXJlbGF0aXZlUG9pbnRzLmFkZChyYnAxKTsKLQkJCX0KLQkJfQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQotCQlpZiAocmVsYXRpdmVQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJlbmRwb2ludHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSZWxhdGl2ZUJlbmRwb2ludHMoKTsKLQkJCWJlbmRwb2ludHMuc2V0UG9pbnRzKHJlbGF0aXZlUG9pbnRzKTsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kcG9pbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZWRnZSBpbiBkaWFncmFtIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgZmluZEVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb2RlLAotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IG5vdGF0aW9uTm9kZS5nZXREaWFncmFtKCkuZ2V0RWRnZXMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICgoZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJCQkJJiYgdGFyZ2V0Tm9kZS5lcXVhbHMoZWRnZS5nZXRUYXJnZXQoKSkKLQkJCQkJCSYmIChlZGdlLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQkJCQkmJiBzb3VyY2VOb2RlLmVxdWFscyhlZGdlLmdldFNvdXJjZSgpKSkgewotCQkJCQlyZXR1cm4gZWRnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGUgaW5jb21pbmcgY29ubmVjdGlvbnMKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIGluY29taW5nQ29ubmVjdGlvbnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgY29ubmVjdGlvbnMgPSBub2RlLmdldEluY29taW5nQ29ubmVjdGlvbnMoKTsKLQotCQlpZiAoY29ubmVjdGlvbnMgIT0gbnVsbCAmJiBjb25uZWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29ubmVjdGlvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUxpbmsgbGluayA9IChMaW5rKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJLy8gY3JlYXRlIGVkZ2UKLQkJCQlFZGdlIGVkZ2UgPSBjcmVhdGVDb25uZWN0aW9uKGxpbmspOwotCi0JCQkJQWN0aXZpdHlOb2RlIHNvdXJjZU5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkJCS5nZXQobm9kZSk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb3RhdGlvbk5vZGUgPSBmaW5kTm90YXRpb25Ob2RlKAotCQkJCQkJZ2V0RGlhZ3JhbSgpLCBzb3VyY2VOb2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyB0YXJnZXQgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRUYXJnZXRFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gZWRnZSBmb3IgdGhlIGdpdmVuIGxpbmsKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgY3JlYXRlQ29ubmVjdGlvbihMaW5rIGxpbmspIHsKLQkJLy8gZ2V0IHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMgb2YgdGhlIGxpbmsKLQkJTm9kZSBzb3VyY2VPYmogPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldE9iaiA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gZ2V0IHVtbCBub2RlcwotCQlBY3Rpdml0eU5vZGUgc291cmNlVU1MTm9kZSA9IChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGUpIGdyYXBoVU1MTm9kZU1hcAotCQkJCS5nZXQoc291cmNlT2JqKTsKLQkJQWN0aXZpdHlOb2RlIHRhcmdldFVNTE5vZGUgPSAob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlOb2RlKSBncmFwaFVNTE5vZGVNYXAKLQkJCQkuZ2V0KHRhcmdldE9iaik7Ci0KLQkJLy8gZ2V0IG5vdGF0aW9uIG5vZGVzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gZmluZE5vdGF0aW9uTm9kZSgKLQkJCQlnZXREaWFncmFtKCksIHNvdXJjZVVNTE5vZGUpOwotCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRhcmdldE5vdGF0aW9uTm9kZSA9IGZpbmROb3RhdGlvbk5vZGUoCi0JCQkJZ2V0RGlhZ3JhbSgpLCB0YXJnZXRVTUxOb2RlKTsKLQotCQlFZGdlIGVkZ2UgPSBmaW5kRWRnZShzb3VyY2VOb3RhdGlvbk5vZGUsIHRhcmdldE5vdGF0aW9uTm9kZSk7Ci0JCWlmIChlZGdlID09IG51bGwgJiYgdGFyZ2V0Tm90YXRpb25Ob2RlICE9IG51bGwpIHsKLQkJCUNvbnRyb2xGbG93IGNvbnRyb2xGbG93ID0gY3JlYXRlQ29udHJvbEZsb3coKTsKLQotCQkJaWYgKHRhcmdldFVNTE5vZGUgaW5zdGFuY2VvZiBBY3Rpdml0eU5vZGUpIHsKLQkJCQljb250cm9sRmxvdy5zZXRTb3VyY2UoKEFjdGl2aXR5Tm9kZSkgc291cmNlVU1MTm9kZSk7Ci0JCQkJY29udHJvbEZsb3cuc2V0VGFyZ2V0KChBY3Rpdml0eU5vZGUpIHRhcmdldFVNTE5vZGUpOwotCQkJfQotCi0JCQkvLyBjcmVhdGUgbm90YXRpb24gZWRnZQotCQkJZWRnZSA9IE1hcFV0aWwuY3JlYXRlRWRnZV9BRChzb3VyY2VOb3RhdGlvbk5vZGUsIHRhcmdldE5vdGF0aW9uTm9kZSwKLQkJCQkJY29udHJvbEZsb3cpOwotCQkJZWRnZS5zZXRFbGVtZW50KGNvbnRyb2xGbG93KTsKLQkJCWxvYWRTb3VyY2VBbmRUYXJnZXRFbmRQb2ludChlZGdlLCBsaW5rKTsKLQkJCWxvYWRCZW5kUG9pbnRzKGVkZ2UsIGxpbmspOwotCQl9Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCS8vIHByaXZhdGUgRWRnZSBmaW5kRWRnZShvcmcuZWNsaXBzZS51bWwyLnVtbC5Db250cm9sRmxvdyBmbG93LCBEaWFncmFtCi0JLy8gZGlhZ3JhbSkgewotCS8vIExpc3QgbGlzdCA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JLy8gT2JqZWN0IG9iamVjdCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkvLyBpZiAob2JqZWN0IGluc3RhbmNlb2YgRWRnZSkgewotCS8vIE9iamVjdCBlbGVtZW50ID0gKChFZGdlKSBvYmplY3QpLmdldEVsZW1lbnQoKTsKLQkvLyBpZiAoZmxvdy5lcXVhbHMoZWxlbWVudCkpIHsKLQkvLyByZXR1cm4gKEVkZ2UpIG9iamVjdDsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0KLQlwcml2YXRlIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLS8qCQlpZiAoZGlhZ3JhbSA9PSBudWxsKSB7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOwotCQkJZGlhZ3JhbSA9IChEaWFncmFtKSByZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgxKTsKLQkJfSovCi0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCXB1YmxpYyBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLS8qCQlpZiAoYWN0aXZpdHkgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuCi0JCQkvLyAoQWN0aXZpdHkpKChNb2RlbClnZXRVTUxPYmplY3QoKSkuYWxsT3duZWRFbGVtZW50cygpLmdldCgwKTsKLQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSByZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7Ci0JCQlhY3Rpdml0eSA9IChBY3Rpdml0eSkgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCX0qLwotCQlyZXR1cm4gYWN0aXZpdHk7Ci0JfQotCS8vIHB1YmxpYyBFT2JqZWN0IGdldFVNTE9iamVjdCgpewotCS8vIGlmKGVPYmplY3QgPT0gbnVsbCl7Ci0JLy8JCQkKLQkvLyBlT2JqZWN0ID0gKEFjdGl2aXR5KWdldFJlc291cmNlKDApLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCS8vIH0KLQkvLyByZXR1cm4gZU9iamVjdDsKLQkvLyB9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5KEFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCXRoaXMuYWN0aXZpdHkgPSBhY3Rpdml0eTsKLQl9Ci0KLQkvLyBwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKGludCBpKXsKLQkvLyByZXR1cm4gKFJlc291cmNlKXJlc291cmNlU2V0LmdldFJlc291cmNlcygpLmdldChpKTsKLQkvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS9hZC9tYXAvTWFwVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGYwZTJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NYXBVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5QcmVjaXNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLmdlZi51dGlsLlRlbXBsYXRlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5BY3Rpdml0eVBhcmFtZXRlck5vZGVOYW1lMkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuQ29udHJvbEZsb3dFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuRGVjaXNpb25Ob2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5EZWNpc2lvbk5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5Gb3JrTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSW5pdGlhbE5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLkluaXRpYWxOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuSm9pbk5vZGVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLk1lcmdlTm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuTWVyZ2VOb2RlTmFtZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGUzRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQuZWRpdC5wYXJ0cy5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTJFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5lZGl0LnBhcnRzLlN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lM0VkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLmVkaXQucGFydHMuU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5wYXJ0LkFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5Sb2xlVGFza0NvbXBvc2l0ZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Q29tcG9zaXRlRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLnBhcnQuQWN0aXZpdHlEZXRhaWxEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUuYnJpZGdlLkJyaWRnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlJvbGVUYXNrQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLldvcmtQcm9kdWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLldvcmtQcm9kdWN0Tm9kZUVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQuZWRpdC5wYXJ0cy5Xb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5wYXJ0LldQRERpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5jb21tb24udWkuc2VydmljZXMucGFyc2VyLkNvbW1vblBhcnNlckhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLlZpZXdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS51dGlsLlZpZXdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZHJhdzJkLnVpLmZpZ3VyZXMuRmlndXJlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EZXNjcmlwdGlvblN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5GaWxsU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkxpbmVTdHlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vdGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkFjdGl2aXR5RWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHlQYXJhbWV0ZXJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkNvbnRyb2xGbG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLkRlY2lzaW9uTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5GaW5hbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRm9ya05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSW5pdGlhbE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuSm9pbk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuTWVyZ2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5TdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlOwotCi0vKioKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLQotcHVibGljIGNsYXNzIE1hcFV0aWwgewotCi0JLyoqCi0JICogQ3JlYXRlIG5vdGF0aW9uIG5vZGUgaW4gZGlhZ3JhbSBjb3JyZXNwb25kaW5nIHRvIGFjdGl2aXR5IG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gZGlhZ3JhbQotCSAqIEBwYXJhbSB1bWxOb2RlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTm9kZSBjcmVhdGVOb3RhdGlvbk5vZGVfQUQoRGlhZ3JhbSBkaWFncmFtLCBPYmplY3Qgb2JqKSB7Ci0JCU5vZGUgbm90YXRpb25Ob2RlID0gbnVsbDsKLQotCQlBY3Rpdml0eU5vZGUgdW1sTm9kZSA9IG9iaiBpbnN0YW5jZW9mIEFjdGl2aXR5Tm9kZSA/IChBY3Rpdml0eU5vZGUpIG9iagotCQkJCTogbnVsbDsKLQkJaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEJyaWRnZUhlbHBlci5nZXRFQW5ub3RhdGlvblR5cGUodW1sTm9kZSwKLQkJCQkJQnJpZGdlSGVscGVyLlVNQV9UWVBFKTsKLQkJCWlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQnJpZGdlSGVscGVyLlVNQV9QSEFTRSkpIHsKLQkJCQkvLyBQaGFzZQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGUyRWRpdFBhcnQuVklTVUFMX0lEKQotCQkJCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJCVN0cnVjdHVyZWRBY3Rpdml0eU5vZGVOYW1lMkVkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJCi0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShCcmlkZ2VIZWxwZXIuVU1BX0lURVJBVElPTikpIHsKLQkJCQkvLyBJdGVyYXRpb24KLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlM0VkaXRQYXJ0LlZJU1VBTF9JRCkKLQkJCQkJCQkJLnRvU3RyaW5nKCksCi0JCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQlTdHJ1Y3R1cmVkQWN0aXZpdHlOb2RlTmFtZTNFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBBY3Rpdml0eQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKFN0cnVjdHVyZWRBY3Rpdml0eU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJU3RydWN0dXJlZEFjdGl2aXR5Tm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfQotCQkJCi0JCQkvLyBzZXQgZGVmYXVsdCBmb250IHN0eWxlCi0JCQlzZXREZWZhdWx0Rm9udFN0eWxlKG5vdGF0aW9uTm9kZSk7Ci0JCQkKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgSW5pdGlhbE5vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoSW5pdGlhbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlJbml0aWFsTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBEZWNpc2lvbk5vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoRGVjaXNpb25Ob2RlRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCB1bWxOb2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJRGVjaXNpb25Ob2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIE1lcmdlTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihNZXJnZU5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlNZXJnZU5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfSBlbHNlIGlmICh1bWxOb2RlIGluc3RhbmNlb2YgRm9ya05vZGUpIHsKLQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJbmV3IEludGVnZXIoRm9ya05vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQl9IGVsc2UgaWYgKHVtbE5vZGUgaW5zdGFuY2VvZiBKb2luTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCB1bWxOb2RlLAotCQkJCQluZXcgSW50ZWdlcihKb2luTm9kZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIEZpbmFsTm9kZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UKLQkJCQkJLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQkJQWN0aXZpdHlGaW5hbE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCUFjdGl2aXR5RmluYWxOb2RlTmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCX0gZWxzZSBpZiAodW1sTm9kZSBpbnN0YW5jZW9mIEFjdGl2aXR5UGFyYW1ldGVyTm9kZSkgewotCQkJU3RyaW5nIHR5cGUgPSBCcmlkZ2VIZWxwZXIuZ2V0RUFubm90YXRpb25UeXBlKHVtbE5vZGUsCi0JCQkJCUJyaWRnZUhlbHBlci5VTUFfVFlQRSk7Ci0JCQlpZiAodHlwZS5lcXVhbHNJZ25vcmVDYXNlKEJyaWRnZUhlbHBlci5VTUFfTUlMRVNUT05FKSkgewotCQkJCS8vIE1pbGVzdG9uZQotCQkJCW5vdGF0aW9uTm9kZSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgdW1sTm9kZSwKLQkJCQkJCW5ldyBJbnRlZ2VyKEFjdGl2aXR5UGFyYW1ldGVyTm9kZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIHVtbE5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQkJQWN0aXZpdHlQYXJhbWV0ZXJOb2RlTmFtZTJFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkudG9TdHJpbmcoKSwKLQkJCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJfSBlbHNlIGlmICh0eXBlLmVxdWFsc0lnbm9yZUNhc2UoQnJpZGdlSGVscGVyLlVNQV9UQVNLX0RFU0NSSVBUT1IpKSB7Ci0JCQkJLy8gVGFza0Rlc2NyaXB0b3IKLQkJCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIHVtbE5vZGUsCi0JCQkJCQluZXcgSW50ZWdlcihBY3Rpdml0eVBhcmFtZXRlck5vZGVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkJVmlld1NlcnZpY2UKLQkJCQkJCS5jcmVhdGVOb2RlKG5vdGF0aW9uTm9kZSwgdW1sTm9kZSwgbmV3IEludGVnZXIoCi0JCQkJCQkJCUFjdGl2aXR5UGFyYW1ldGVyTm9kZU5hbWVFZGl0UGFydC5WSVNVQUxfSUQpCi0JCQkJCQkJCS50b1N0cmluZygpLAotCQkJCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCX0KLQotCQkJLy8Jc2V0IGRlZmF1bHQgZm9udCBzdHlsZQotCQkJc2V0RGVmYXVsdEZvbnRTdHlsZShub3RhdGlvbk5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIG5vdGF0aW9uTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gbm9kZSBmb3IgbW9kZWwgbm9kZSBpbiBBREQgYW5kIFdQRAotCSAqIEBwYXJhbSBkaWFncmFtCi0JICogQHBhcmFtIG9iagotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlTm90YXRpb25Ob2RlX0FERG9yV1BEKERpYWdyYW0gZGlhZ3JhbSwgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuTm9kZSBvYmopIHsKLQkJTm9kZSBub3RhdGlvbk5vZGUgPSBudWxsOwotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUgPSBvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlID8gKG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGUpIG9iagotCQkJCTogbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSb2xlVGFza0NvbXBvc2l0ZSkgewotCQkJbm90YXRpb25Ob2RlID0gVmlld1NlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCBub2RlLCBuZXcgSW50ZWdlcigKLQkJCQkJUm9sZVRhc2tDb21wb3NpdGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJLyoKLQkJCSAqIFZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUobm90YXRpb25Ob2RlLCBub2RlLCBuZXcgSW50ZWdlcigKLQkJCSAqIFJvbGVUYXNrQ29tcG9zaXRlUm9sZVRhc2tDb21wYXJ0bWVudEVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCSAqIEFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJICovCi0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0Q29tcG9zaXRlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdENvbXBvc2l0ZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkvKgotCQkJICogVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJICogV29ya1Byb2R1Y3RDb21wb3NpdGVXb3JrUHJvZHVjdENvbXBhcnRtZW50RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJICogQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQkgKi8KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgV29ya1Byb2R1Y3ROb2RlKSB7Ci0JCQlub3RhdGlvbk5vZGUgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdE5vZGVFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShub3RhdGlvbk5vZGUsIG5vZGUsIG5ldyBJbnRlZ2VyKAotCQkJCQlXb3JrUHJvZHVjdE5vZGVOYW1lRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJfQotCQkKLQkJLy8gc2V0IGRlZmF1bHQgZm9udCBzdHlsZSBmb3Igbm90YXRpb24gbm9kZQotCQlzZXREZWZhdWx0Rm9udFN0eWxlKG5vdGF0aW9uTm9kZSk7Ci0JCXJldHVybiBub3RhdGlvbk5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQ3JlYXRlIHRleHQgZm9yIGZyZWUgZm9ybSB0ZXh0Ci0JICogQHBhcmFtIGRpYWdyYW0KLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUgY3JlYXRlVGV4dChEaWFncmFtIGRpYWdyYW0sCi0JCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlIG5vZGUpIHsKLQotCQkvLyBjcmVhdGUgdGV4dAotCQlOb2RlIHRleHQgPSBWaWV3U2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIFZpZXdUeXBlLlRFWFQsCi0JCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQotCQlWaWV3U2VydmljZS5jcmVhdGVOb2RlKHRleHQsIFZpZXdUeXBlLkRJQUdSQU1fTkFNRSwKLQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZSh0ZXh0LCBDb21tb25QYXJzZXJIaW50LkRFU0NSSVBUSU9OLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbgotCQlHcmFwaE5vZGUgZ3JhcGhOb2RlID0gKEdyYXBoTm9kZSkgbm9kZS5nZXRPYmplY3QoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShncmFwaE5vZGUKLQkJCQkuZ2V0UHJvcGVydHkoKSwgR3JhcGhpY2FsRGF0YUhlbHBlci5HUkFQSF9OT0RFX0ZSRUVfVEVYVCk7Ci0KLQkJaWYgKHByb3AgIT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gcHJvcC5nZXRWYWx1ZSgpOwotCQlEZXNjcmlwdGlvblN0eWxlIGRlc2NTdHlsZSA9IChEZXNjcmlwdGlvblN0eWxlKSB0ZXh0Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVElPTl9TVFlMRSk7Ci0JCWRlc2NTdHlsZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQotCQkvLyAKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IChJUHJlZmVyZW5jZVN0b3JlKSBBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCi0JCS8vIGNyZWF0ZSBmaWxsIHN0eWxlCi0JCUZpbGxTdHlsZSBmaWxsU3R5bGUgPSAoRmlsbFN0eWxlKSB0ZXh0Ci0JCQkJLmdldFN0eWxlKE5vdGF0aW9uUGFja2FnZS5MaXRlcmFscy5GSUxMX1NUWUxFKTsKLQkJaWYgKGZpbGxTdHlsZSAhPSBudWxsKSB7Ci0JCQkvLyBmaWxsIGNvbG9yCi0JCQlSR0IgZmlsbFJHQiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsCi0JCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRklMTF9DT0xPUik7Ci0JCQlmaWxsU3R5bGUuc2V0RmlsbENvbG9yKEZpZ3VyZVV0aWxpdGllcy5SR0JUb0ludGVnZXIoZmlsbFJHQikKLQkJCQkJLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGxpbmUgc3R5bGUKLQkJTGluZVN0eWxlIGxpbmVTdHlsZSA9IChMaW5lU3R5bGUpIHRleHQKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkxJTkVfU1RZTEUpOwotCQlpZiAobGluZVN0eWxlICE9IG51bGwpIHsKLQkJCS8vIGxpbmUgY29sb3IKLQkJCVJHQiBsaW5lUkdCID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwKLQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9MSU5FX0NPTE9SKTsKLQkJCWxpbmVTdHlsZS5zZXRMaW5lQ29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihsaW5lUkdCKQotCQkJCQkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgZm9udCBzdHlsZQotCQlGb250U3R5bGUgZm9udFN0eWxlID0gKEZvbnRTdHlsZSkgdGV4dAotCQkJCS5nZXRTdHlsZShOb3RhdGlvblBhY2thZ2UuTGl0ZXJhbHMuRk9OVF9TVFlMRSk7Ci0JCUZvbnQgb2xkRm9udCA9IG51bGw7Ci0JCWlmIChmb250U3R5bGUgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGZvbnQgcHJvcGVydGllcwotCQkJU3RyaW5nIGZvbnROYW1lID0gZ2V0UHJvcGVydHlWYWx1ZShncmFwaE5vZGUsCi0JCQkJCVRlbXBsYXRlQ29uc3RhbnRzLlBST1BFUlRZX0ZPTlRfTkFNRSk7Ci0JCQlpZiAoZm9udE5hbWUgPT0gbnVsbCkgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCVN0cmluZyBvbGRGb250U3R5bGVTdHIgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9TVFlMRSk7CQotCQkJU3RyaW5nIGZvbnRIZWlnaHRTdHIgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9IRUlHSFQpOwkJCQotCQkJU3RyaW5nIGZvbnRSZWQgPSBnZXRQcm9wZXJ0eVZhbHVlKGdyYXBoTm9kZSwKLQkJCQkJVGVtcGxhdGVDb25zdGFudHMuUFJPUEVSVFlfRk9OVF9SRUQpOwotCQkJU3RyaW5nIGZvbnRHcmVlbiA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0dSRUVOKTsKLQkJCVN0cmluZyBmb250Qmx1ZSA9IGdldFByb3BlcnR5VmFsdWUoZ3JhcGhOb2RlLAotCQkJCQlUZW1wbGF0ZUNvbnN0YW50cy5QUk9QRVJUWV9GT05UX0JMVUUpOwotCQkJCi0JCQlpbnQgcmVkID0gMDsKLQkJCWludCBncmVlbiA9IDA7Ci0JCQlpbnQgYmx1ZSA9IDA7Ci0KLQkJCWlmIChmb250TmFtZSAhPSBudWxsKQotCQkJCWZvbnRTdHlsZS5zZXRGb250TmFtZShmb250TmFtZSk7Ci0JCQkKLQkJCWludCBvbGRGb250U3R5bGUgPSAwOwotCQkJaWYgKG9sZEZvbnRTdHlsZVN0ciAhPSBudWxsKSB7Ci0JCQkJb2xkRm9udFN0eWxlID0gbmV3IEludGVnZXIob2xkRm9udFN0eWxlU3RyKS5pbnRWYWx1ZSgpOwotCQkJCWlmIChvbGRGb250U3R5bGUgPT0gMSkKLQkJCQkJZm9udFN0eWxlLnNldEJvbGQodHJ1ZSk7Ci0JCQkJaWYgKG9sZEZvbnRTdHlsZSA9PSAyKQotCQkJCQlmb250U3R5bGUuc2V0SXRhbGljKHRydWUpOwotCQkJCWlmIChvbGRGb250U3R5bGUgPT0gMykgewotCQkJCQlmb250U3R5bGUuc2V0Qm9sZCh0cnVlKTsKLQkJCQkJZm9udFN0eWxlLnNldEl0YWxpYyh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIHNldCBmb250IGhlaWdodAotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWlmIChmb250SGVpZ2h0U3RyICE9IG51bGwpCi0JCQkJZm9udEhlaWdodCA9IG5ldyBJbnRlZ2VyKGZvbnRIZWlnaHRTdHIpLmludFZhbHVlKCk7Ci0JCQlmb250U3R5bGUuc2V0Rm9udEhlaWdodChmb250SGVpZ2h0KTsKLQkJCQotCQkJLy8gc2V0IGZvbnQgUkdCIGNvbG9yCi0JCQlpZiAoZm9udFJlZCAhPSBudWxsKQotCQkJCXJlZCA9IG5ldyBJbnRlZ2VyKGZvbnRSZWQpLmludFZhbHVlKCk7Ci0JCQlpZiAoZm9udEdyZWVuICE9IG51bGwpCi0JCQkJZ3JlZW4gPSBuZXcgSW50ZWdlcihmb250R3JlZW4pLmludFZhbHVlKCk7Ci0JCQlpZiAoZm9udEJsdWUgIT0gbnVsbCkKLQkJCQlibHVlID0gbmV3IEludGVnZXIoZm9udEJsdWUpLmludFZhbHVlKCk7Ci0KLQkJCVJHQiBmb250UkdCID0gbmV3IFJHQihyZWQsIGdyZWVuLCBibHVlKTsKLQkJCWZvbnRTdHlsZS5zZXRGb250Q29sb3IoRmlndXJlVXRpbGl0aWVzLlJHQlRvSW50ZWdlcihmb250UkdCKQotCQkJCQkuaW50VmFsdWUoKSk7CQkJCi0JCQkKLQkJCS8vIG1ha2Ugb2xkIGZvbnQgYXMgd2VsbAotCQkJb2xkRm9udCA9IG5ldyBGb250KG51bGwsIGZvbnROYW1lLCBmb250SGVpZ2h0LCBvbGRGb250U3R5bGUpOwotCQl9Ci0JCi0JCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKGRlc2NyaXB0aW9uLCBvbGRGb250KTsKLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgewotCQkJb2xkRm9udC5kaXNwb3NlKCk7Ci0JCX0KLQkJaW50IG5vT2ZMaW5lcyA9IDE7Ci0JCWlmIChkICE9IG51bGwgJiYgZC53aWR0aCA+IDApIHsKLQkJCWlmIChub2RlLmdldFdpZHRoKCkgPT0gLTEpCi0JCQkJbm9PZkxpbmVzID0gMTsKLQkJCWVsc2UgewotCQkJCWludCBkaXYgPSBkLndpZHRoIC8gbm9kZS5nZXRXaWR0aCgpOwkJCi0JCQkJaW50IG1vZCA9IGQud2lkdGggJSBub2RlLmdldFdpZHRoKCk7Ci0vLwkJCQlpZiAobW9kICE9IDApCi0JCQkJCWRpdisrOwotCQkJCW5vT2ZMaW5lcyA9IGRpdjsKLQkJCX0KLQkJfQotCi0JCWludCB0ZXh0SGVpZ2h0ID0gZC5oZWlnaHQ7CQkKLQotCQkvLyBjcmVhdGUgbGF5b3V0IGNvbnRyYWludAotCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLS8vCQlib3VuZHMuc2V0SGVpZ2h0KG5vT2ZMaW5lcyAqIHRleHRIZWlnaHQpOwotCQlpZiAobm9kZS5nZXRXaWR0aCgpID09IC0xKSB7Ci0JCQlpbnQgdGV4dFdpZHRoID0gZC53aWR0aDsKLQkJCWJvdW5kcy5zZXRXaWR0aCh0ZXh0V2lkdGgpOwotCQl9Ci0JCWVsc2UKLQkJCWJvdW5kcy5zZXRXaWR0aChub2RlLmdldFdpZHRoKCkpOwotCQlib3VuZHMuc2V0WChub2RlLmdldExvY2F0aW9uKCkueCk7Ci0JCWJvdW5kcy5zZXRZKG5vZGUuZ2V0TG9jYXRpb24oKS55KTsKLQotCQl0ZXh0LnNldExheW91dENvbnN0cmFpbnQoYm91bmRzKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVkZ2UgZm9yIEFEIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfQUQoTm9kZSBzb3VyY2VOb2RlLCBOb2RlIHRhcmdldE5vZGUsCi0JCQlBY3Rpdml0eUVkZ2UgYWN0RWRnZSkgewotCQlpZiAoYWN0RWRnZSBpbnN0YW5jZW9mIENvbnRyb2xGbG93KSB7Ci0JCQlFZGdlIGVkZ2UgPSBWaWV3U2VydmljZS5jcmVhdGVFZGdlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUsIGFjdEVkZ2UsCi0JCQkJCW5ldyBJbnRlZ2VyKENvbnRyb2xGbG93RWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCUNvbnRyb2xGbG93TmFtZUVkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVCk7Ci0JCQlyZXR1cm4gZWRnZTsKLQkJfQotCQkKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgV1BEIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfV1BEKE5vZGUgc291cmNlTm9kZSwgTm9kZSB0YXJnZXROb2RlLAotCQkJRU9iamVjdCBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgTGluaykgewotCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlLCBhY3RFZGdlLAotCQkJCQluZXcgSW50ZWdlcihvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLmVkaXQucGFydHMuTGlua0VkaXRQYXJ0LlZJU1VBTF9JRCkudG9TdHJpbmcoKSwKLQkJCQkJV1BERGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJVmlld1NlcnZpY2UuY3JlYXRlTm9kZShlZGdlLCBhY3RFZGdlLCBuZXcgSW50ZWdlcigKLQkJCQkJb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCVdQRERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCXJldHVybiBlZGdlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgZWRnZSBmb3IgQUREIGRpYWdyYW0KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlTm9kZQotCSAqIEBwYXJhbSB0YXJnZXROb2RlCi0JICogQHBhcmFtIGFjdEVkZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBFZGdlIGNyZWF0ZUVkZ2VfQUREKE5vZGUgc291cmNlTm9kZSwgTm9kZSB0YXJnZXROb2RlLAotCQkJRU9iamVjdCBhY3RFZGdlKSB7Ci0JCWlmIChhY3RFZGdlIGluc3RhbmNlb2YgTGluaykgewotCQkJRWRnZSBlZGdlID0gVmlld1NlcnZpY2UuY3JlYXRlRWRnZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlLCBhY3RFZGdlLAotCQkJCQluZXcgSW50ZWdlcihvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQuZWRpdC5wYXJ0cy5MaW5rRWRpdFBhcnQuVklTVUFMX0lEKS50b1N0cmluZygpLAotCQkJCQlBY3Rpdml0eURldGFpbERpYWdyYW1FZGl0b3JQbHVnaW4uRElBR1JBTV9QUkVGRVJFTkNFU19ISU5UKTsKLQkJCVZpZXdTZXJ2aWNlLmNyZWF0ZU5vZGUoZWRnZSwgYWN0RWRnZSwgbmV3IEludGVnZXIoCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5lZGl0LnBhcnRzLkxpbmtFZGl0UGFydC5WSVNVQUxfSUQpLnRvU3RyaW5nKCksCi0JCQkJCUFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQkJcmV0dXJuIGVkZ2U7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKEdyYXBoTm9kZSBncmFwaE5vZGUsIFN0cmluZyBrZXkpIHsKLQkJUHJvcGVydHkgcHJvcCA9IEdyYXBoaWNhbERhdGFIZWxwZXIuZ2V0UHJvcGVydHlCeUtleShncmFwaE5vZGUKLQkJCQkuZ2V0UHJvcGVydHkoKSwga2V5KTsKLQotCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcC5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyBubyBvZiBsaW5lcyBpbiB0aGUgbm9kZSB0ZXh0IGJhc2VkIG9uIHRleHQgd2lkdGggYW5kIHdpZHRoIG9mCi0JICogZmlndXJlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0Tm9PZkxpbmVzKE5vZGUgbm9kZSkgewotCQlpbnQgbm9PZkxpbmVzID0gMTsKLQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJU3RyaW5nIHRleHQgPSAoKE5hbWVkRWxlbWVudCkgbm9kZS5nZXRFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCUZvbnQgZiA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlCb3VuZHMgYm91bmRzID0gKEJvdW5kcykgbm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQlpZiAoZCAhPSBudWxsICYmIGQud2lkdGggPiAwKSB7Ci0JCQkJaW50IGRpdiA9IGQud2lkdGggLyBib3VuZHMuZ2V0V2lkdGgoKTsKLQkJCQlpbnQgbW9kID0gZC53aWR0aCAlIGJvdW5kcy5nZXRXaWR0aCgpOwotCQkJCWlmIChtb2QgIT0gMCkKLQkJCQkJZGl2Kys7Ci0JCQkJbm9PZkxpbmVzID0gZGl2OwotCQkJfQotCQl9Ci0JCXJldHVybiBub09mTGluZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGhlaWdodCBvZiB0ZXh0IG9mIHRoIGVub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGV4dEhlaWdodChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0RWxlbWVudCgpICE9IG51bGwKLQkJCQkmJiBub2RlLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJU3RyaW5nIHRleHQgPSAoKE5hbWVkRWxlbWVudCkgbm9kZS5nZXRFbGVtZW50KCkpLmdldE5hbWUoKTsKLQkJCUZvbnQgZiA9IFRlbXBsYXRlQ29uc3RhbnRzLkRFRkFVTFRfRk9OVDsKLQkJCURpbWVuc2lvbiBkID0gRmlndXJlVXRpbGl0aWVzLmdldFRleHRFeHRlbnRzKHRleHQsIGYpOwotCi0JCQlpZiAoZCAhPSBudWxsKQotCQkJCXJldHVybiBkLmhlaWdodDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHBvaW50IHRvIHRlcm1pbmFsIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBwCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBvc2VUZXJtaW5hbFN0cmluZyhQcmVjaXNpb25Qb2ludCBwKSB7Ci0JCWZpbmFsIGNoYXIgVEVSTUlOQUxfU1RBUlRfQ0hBUiA9ICcoJzsKLQkJZmluYWwgY2hhciBURVJNSU5BTF9ERUxJTUlURVJfQ0hBUiA9ICcsJzsKLQkJZmluYWwgY2hhciBURVJNSU5BTF9FTkRfQ0hBUiA9ICcpJzsKLQotCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoMjQpOwotCQlzLmFwcGVuZChURVJNSU5BTF9TVEFSVF9DSEFSKTsgLy8gMSBjaGFyCi0JCXMuYXBwZW5kKChmbG9hdCkgcC5wcmVjaXNlWCk7IC8vIDEwIGNoYXJzCi0JCXMuYXBwZW5kKFRFUk1JTkFMX0RFTElNSVRFUl9DSEFSKTsgLy8gMSBjaGFyCi0JCXMuYXBwZW5kKChmbG9hdCkgcC5wcmVjaXNlWSk7IC8vIDEwIGNoYXJzCi0JCXMuYXBwZW5kKFRFUk1JTkFMX0VORF9DSEFSKTsgLy8gMSBjaGFyCi0JCXJldHVybiBzLnRvU3RyaW5nKCk7IC8vIDI0IGNoYXJzIG1heCAoKzEgZm9yIHNhZmV0eSwgaS5lLiBmb3Igc3RyaW5nCi0JCQkJCQkJCS8vIHRlcm1pbmF0aW9uKQotCX0KLQotCS8qKgotCSAqIEdldCByZWxhdGl2ZSBhbmNob3IgbG9jYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcAotCSAqIEBwYXJhbSBib3VuZHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcmVjaXNpb25Qb2ludCBnZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKFBvaW50IHAsCi0JCQlCb3VuZHMgYm91bmRzKSB7Ci0JCVByZWNpc2lvblBvaW50IHJlbExvY2F0aW9uOwotCQlQb2ludCB0ZW1wID0gbmV3IFBvaW50KHApOwotCQlpZiAocC54IDwgYm91bmRzLmdldFgoKSB8fCBwLnggPiBib3VuZHMuZ2V0WCgpICsgYm91bmRzLmdldFdpZHRoKCkKLQkJCQl8fCBwLnkgPCBib3VuZHMuZ2V0WSgpCi0JCQkJfHwgcC55ID4gYm91bmRzLmdldFkoKSArIGJvdW5kcy5nZXRIZWlnaHQoKSkgewotCQkJaWYgKHAueCA8IGJvdW5kcy5nZXRYKCkgfHwgcC54ID4gYm91bmRzLmdldFgoKSArIGJvdW5kcy5nZXRXaWR0aCgpKSB7Ci0JCQkJdGVtcC54ID0gcC54IDwgYm91bmRzLmdldFgoKSA/IGJvdW5kcy5nZXRYKCkgOiBib3VuZHMuZ2V0WCgpCi0JCQkJCQkrIGJvdW5kcy5nZXRXaWR0aCgpOwotCQkJfQotCQkJaWYgKHAueSA8IGJvdW5kcy5nZXRZKCkgfHwgcC55ID4gYm91bmRzLmdldFkoKSArIGJvdW5kcy5nZXRIZWlnaHQoKSkgewotCQkJCXRlbXAueSA9IHAueSA8IGJvdW5kcy5nZXRZKCkgPyBib3VuZHMuZ2V0WSgpIDogYm91bmRzLmdldFkoKQotCQkJCQkJKyBib3VuZHMuZ2V0SGVpZ2h0KCk7Ci0JCQl9Ci0JCQlyZWxMb2NhdGlvbiA9IG5ldyBQcmVjaXNpb25Qb2ludCgoZG91YmxlKSAodGVtcC54IC0gYm91bmRzLmdldFgoKSkKLQkJCQkJLyBib3VuZHMuZ2V0V2lkdGgoKSwgKGRvdWJsZSkgKHRlbXAueSAtIGJvdW5kcy5nZXRZKCkpCi0JCQkJCS8gYm91bmRzLmdldEhlaWdodCgpKTsKLQkJfSBlbHNlIHsKLQotCQkJcmVsTG9jYXRpb24gPSBuZXcgUHJlY2lzaW9uUG9pbnQoKGRvdWJsZSkgKHRlbXAueCAtIGJvdW5kcy5nZXRYKCkpCi0JCQkJCS8gYm91bmRzLmdldFdpZHRoKCksIChkb3VibGUpICh0ZW1wLnkgLSBib3VuZHMuZ2V0WSgpKQotCQkJCQkvIGJvdW5kcy5nZXRIZWlnaHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlbExvY2F0aW9uOwotCX0KLQotCQotCS8qKgotCSAqIFNldCBkZWZhdWx0IGZvbnQgc3R5bGUgZm9yIG5vdGF0aW9uIG5vZGUKLQkgKiBAcGFyYW0gbm90YXRpb25Ob2RlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXREZWZhdWx0Rm9udFN0eWxlKE5vZGUgbm90YXRpb25Ob2RlKSB7Ci0JCS8vCWNyZWF0ZSBmb250IHN0eWxlCi0JCUZvbnRTdHlsZSBmb250U3R5bGUgPSAoRm9udFN0eWxlKSBub3RhdGlvbk5vZGUKLQkJCQkuZ2V0U3R5bGUoTm90YXRpb25QYWNrYWdlLkxpdGVyYWxzLkZPTlRfU1RZTEUpOwotCi0JCWlmIChmb250U3R5bGUgIT0gbnVsbCkgewotCi0JCQkvLyBzZXQgZm9udCBuYW1lCi0JCQlTdHJpbmcgZm9udE5hbWUgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfTkFNRTsKLQkJCWlmIChmb250TmFtZSAhPSBudWxsKQotCQkJCWZvbnRTdHlsZS5zZXRGb250TmFtZShmb250TmFtZSk7Ci0KLQkJCS8vIHNldCBmb250IGhlaWdodAotCQkJaW50IGZvbnRIZWlnaHQgPSBUZW1wbGF0ZUNvbnN0YW50cy5ERUZBVUxUX0ZPTlRfU0laRTsKLQkJCWZvbnRTdHlsZS5zZXRGb250SGVpZ2h0KGZvbnRIZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01lcmdlTm9kZU1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvbWFwL01lcmdlTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjYyZWVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL21hcC9NZXJnZU5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk1lcmdlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXJnZU5vZGVNYXAgZXh0ZW5kcyBNYXBOb2RlIHsKLQotCXB1YmxpYyBNZXJnZU5vZGVNYXAoTm9kZSBub2RlKSB7Ci0JCXN1cGVyKG5vZGUpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdW1sIG5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVOb2RlKCkgewotCQlzdXBlci51cGRhdGVOb2RlKCk7Ci0JCXVtbE5vZGUgPSAoTWVyZ2VOb2RlKWdldEFjdGl2aXR5KCkuY3JlYXRlTm9kZShuYW1lID0gKG5hbWUgIT0gbnVsbCk/IG5hbWUgOiAiICIsIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQlVTUxQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXJnZU5vZGUoKSk7Ci0JCQotCQlpZih1bWxOb2RlICE9IG51bGwpewotCQkJZ3JhcGhVTUxOb2RlTWFwLnB1dChub2RlLCB1bWxOb2RlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3NlcnZpY2VzL1dvcmtmbG93MlhNSVJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDhkNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFNhdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNSVJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JU2F2ZUltcGw7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1JUmVzb3VyY2VJbXBsIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFdvcmtmbG93MlhNSVJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdXJpCi0JICovCi0JcHVibGljIFdvcmtmbG93MlhNSVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0KLQkJZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fU0NIRU1BX0xPQ0FUSU9OLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fVVNFX0VOQ09ERURfQVRUUklCVVRFX1NUWUxFLCBCb29sZWFuLlRSVUUpOwotCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRU5DT0RJTkcsIERFRkFVTFRfRU5DT0RJTkcpOwotCQlnZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VOQ09ESU5HLCBERUZBVUxUX0VOQ09ESU5HKTsKLQkJCi0KLQkJZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCi0JCWdldERlZmF1bHRTYXZlT3B0aW9ucygpLnB1dChYTUlSZXNvdXJjZS5PUFRJT05fVVNFX1hNSV9UWVBFLCBCb29sZWFuLlRSVUUpOwotCQlnZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1JUmVzb3VyY2UuT1BUSU9OX1VTRV9YTUlfVFlQRSwgQm9vbGVhbi5UUlVFKTsKLQkJc2V0VHJhY2tpbmdNb2RpZmljYXRpb24odHJ1ZSk7Ci0JCS8vc2V0SW50cmluc2ljSURUb0VPYmplY3RNYXAobWFwKTsKLQkJaWRUb0VPYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQljcmVhdGVYTUxIZWxwZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlVVVJRHMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQlyZXR1cm4gbmV3IFhNSVNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3NlcnZpY2VzL1dvcmtmbG93RXhwb3J0U2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3dFeHBvcnRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTU0ODYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvc2VydmljZXMvV29ya2Zsb3dFeHBvcnRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU1vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLnBhcnQuQWN0aXZpdHlEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5wYXJ0LkFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLmJyaWRnZS5CcmlkZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5BY3Rpdml0eURldGFpbERpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWwuQWN0aXZpdHlEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLlR5cGVkTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5Xb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLnV0aWwuR3JhcGhpY2FsRGF0YUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkdyYXBoaWNhbERhdGFNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQucGFydC5XUEREaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRGlhZ3JhbU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLklEaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLklNYXBDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcC5NYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5hZC5tYXAuTWFwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQubWFwLk1hcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkZHdwZC5tYXAuQ29ubmVjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLnV0aWwuTWlncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUucHJlZmVyZW5jZXMuUHJlZmVyZW5jZXNIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5WaWV3U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Cb3VuZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob3RhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5VTUxQYWNrYWdlOwotCi0vKioKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMgotICovCi0KLXB1YmxpYyBjbGFzcyBXb3JrZmxvd0V4cG9ydFNlcnZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9YTUlfRVhURU5TSU9OID0gIi54bWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWJ1ZzsKLQkKLQlwdWJsaWMgc3RhdGljIFdvcmtmbG93RXhwb3J0U2VydmljZSBzaW5nbGV0b24gPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBXb3JrZmxvd0V4cG9ydFNlcnZpY2UgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChzaW5nbGV0b24gPT0gbnVsbCkgewotCQkJc2luZ2xldG9uID0gbmV3IFdvcmtmbG93RXhwb3J0U2VydmljZSgpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b247Ci0JfQotCi0JLyoqCi0JICogRXhwb3J0IGFjdGl2aXR5IGRpYWdyYW0gZGF0YQotCSAqIEBwYXJhbSBwcm9jCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHBhcmFtIHRhcmdldERpcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cG9ydChQcm9jZXNzIHByb2MsIEFjdGl2aXR5IGFjdGl2aXR5LCBTdHJpbmcgZmlsZU5hbWUsCi0JCQlGaWxlIHRhcmdldERpcikgdGhyb3dzIE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbiB7Ci0KLQkJZGVidWcgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQkKLQkJLy8gY29uc3RydWN0IHRoZSBleHBvcnQgdGFyZ2V0IHhtbCBmaWxlIHBhdGgKLQkJUGF0aCBleHBvcnRQYXRoID0gbmV3IFBhdGgodGFyZ2V0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYm9vbGVhbiBlbmRXaXRoWG1pRXh0ID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgKLQkJCQlERUZBVUxUX1hNSV9FWFRFTlNJT04pOwotCi0JCVN0cmluZyBleHBvcnRYTUlQYXRoID0gKGV4cG9ydFBhdGguYXBwZW5kKGVuZFdpdGhYbWlFeHQgPyBmaWxlTmFtZQotCQkJCTogKGZpbGVOYW1lICsgREVGQVVMVF9YTUlfRVhURU5TSU9OKSkpLnRvT1NTdHJpbmcoKTsKLQotCi0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlRmlsZVVSSShleHBvcnRYTUlQYXRoKTsKLQkJCi0vKgkJLy8gQ3JlYXRlIHJlc291cmNlIHNldAotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQotCQkvL1hNTFJlc291cmNlSW1wbCB4bWlyZXMgPSBuZXcgV29ya2Zsb3cyWE1JUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCS8vUmVzb3VyY2UgeG1pcmVzID0gIG5ldyBHTUZSZXNvdXJjZUZhY3RvcnkoKS5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlSZXNvdXJjZSB4bWlyZXMgPSAgRGlhZ3JhbU1hbmFnZXIuZ2V0SW5zdGFuY2UocHJvYykKLQkJCQkJCQkuZ2V0RWRpdGluZ0RvbWFpbigpLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UodXJpKTsKLQotCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZXMoKS5hZGQoeG1pcmVzKTsqLwotCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBEaWFncmFtTWFuYWdlci5nZXRJbnN0YW5jZShwcm9jLCB0aGlzKTsKLQkJCi0JCXRyeSB7Ci0JCQlUcmFuc2FjdGlvbiB0eCA9ICBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsCi0JCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlSZXNvdXJjZSB4bWlyZXMgPSBtZ3IuZ2V0UmVzb3VyY2UoKTsKLQkJCXR4LmNvbW1pdCgpOwotCQkJCi0JCQkvLyBDcmVhdGUgdGVtcCBtYXAKLQkJCUlNYXBDb25zdGFudHMuZ3JhcGhVTUxOb2RlTWFwLmNsZWFyKCk7Ci0JCQkKLQkJCWlmIChwcm9jID09IGFjdGl2aXR5KSB7Ci0JCQkJTWFwIGFjdGl2aXRpZXMgPSBNaWdyYXRpb25VdGlsLmdldEFjdGl2aXRpZXMocHJvYywgdHJ1ZSk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGFjdGl2aXRpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlBY3Rpdml0eSBhY3QgPSAoQWN0aXZpdHkpIGl0Lm5leHQoKTsKLQkJCQkJYWRkQUQoeG1pcmVzLCBwcm9jLCBhY3QsIG1ncik7Ci0JCQkJCWFkZEFERCh4bWlyZXMsIHByb2MsIGFjdCwgbWdyKTsKLQkJCQkJYWRkV1BEKHhtaXJlcywgcHJvYywgYWN0LCBtZ3IpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYWRkQUQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCQlhZGRBREQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCQlhZGRXUEQoeG1pcmVzLCBwcm9jLCBhY3Rpdml0eSwgbWdyKTsKLQkJCX0KLQotLyoJCQl0eC5jb21taXQoKTsqLwotCQkJCi0JCQlMaXN0IGNvbnRlbnRzID0geG1pcmVzLmdldENvbnRlbnRzKCk7Ci0JCQlpZiAoY29udGVudHMgIT0gbnVsbCAmJiAhIGNvbnRlbnRzLmlzRW1wdHkoKSkgewotCQkJCXhtaXJlcy5zYXZlKG51bGwpOwotCQkJfQotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJdGhyb3cgbmV3IE1pZ3JhdGlvbkV4cG9ydEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9XUEQoUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFByb2Nlc3MgcHJvYywKLQkJCUFjdGl2aXR5IHVtYUFjdGl2aXR5KSB7CQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgID0gR3JhcGhpY2FsRGF0YU1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRVTUFEaWFncmFtKHVtYUFjdGl2aXR5LCBJRGlhZ3JhbU1hbmFnZXIuV09SS19QUk9EVUNUX0RFUEVOREVOQ1lfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldQREQtPiIrcHJvYy5nZXROYW1lKCkrIjo6Iit1bWFBY3Rpdml0eS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0gd3BkRGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZVdvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0oKTsKLQkJCWFkZERhdGFUb1Jlc291cmNlX0FERG9yV1BEKHByb2MsIHVtYUFjdGl2aXR5LCB4bWlSZXNvdXJjZSwKLQkJCQkJd3BkRGlhZ3JhbSk7Ci0JCX0KLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgYWRkRGF0YVRvUmVzb3VyY2VfQUREKFJlc291cmNlIHhtaVJlc291cmNlLAotCQkJUHJvY2VzcyBwcm9jLCBBY3Rpdml0eSB1bWFBY3Rpdml0eSkgewotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gZCA9IEdyYXBoaWNhbERhdGFNYW5hZ2VyLmdldEluc3RhbmNlKCkKLQkJCQkuZ2V0VU1BRGlhZ3JhbSh1bWFBY3Rpdml0eSwKLQkJCQkJCUlEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ERVRBSUxfRElBR1JBTSwgZmFsc2UpOwotCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFERC0+Iitwcm9jLmdldE5hbWUoKSsiOiIrdW1hQWN0aXZpdHkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlBY3Rpdml0eURldGFpbERpYWdyYW0gYWRkRGlhZ3JhbSA9IE1vZGVsRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJLmNyZWF0ZUFjdGl2aXR5RGV0YWlsRGlhZ3JhbSgpOwotCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUREb3JXUEQocHJvYywgdW1hQWN0aXZpdHksIHhtaVJlc291cmNlLAotCQkJCQlhZGREaWFncmFtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9BRERvcldQRChQcm9jZXNzIHByb2MsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCAKLQkJCVJlc291cmNlIHhtaVJlc291cmNlLCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5EaWFncmFtIGFkZE9yV3BkRGlhZ3JhbSkgewotCQlTdXBwcmVzc2lvbiBzdXAgPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCWFkZE9yV3BkRGlhZ3JhbS5zZXRTdXBwcmVzc2lvbihzdXApOwotCQlTdHJpbmcga2luZCA9IG51bGw7Ci0JCVByZWZlcmVuY2VzSGludCBwcmVmSGludCA9IG51bGw7Ci0JCWlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBBY3Rpdml0eURldGFpbERpYWdyYW0pIHsKLQkJCWFkZE9yV3BkRGlhZ3JhbS5zZXRGaWx0ZXIoUHJvY2Vzc0F1dGhvcmluZ0NvbmZpZ3VyYXRvci5JTlNUQU5DRSk7Ci0JCQlraW5kID0gRGlhZ3JhbU1hbmFnZXIuQUREX2tpbmQ7Ci0JCQlwcmVmSGludCA9IEFjdGl2aXR5RGV0YWlsRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQ7Ci0JCX0gZWxzZSBpZiAoYWRkT3JXcGREaWFncmFtIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSkgewotCQkJa2luZCA9IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kOwotCQkJcHJlZkhpbnQgPSBXUEREaWFncmFtRWRpdG9yUGx1Z2luLkRJQUdSQU1fUFJFRkVSRU5DRVNfSElOVDsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCWFkZE9yV3BkRGlhZ3JhbS5zZXRPYmplY3QodW1hQWN0aXZpdHkpOwotCQlhZGRPcldwZERpYWdyYW0uc2V0TGlua2VkRWxlbWVudCh1bWFBY3Rpdml0eSk7Ci0JCQotCQkvLwlzZXQgc3VwcHJlc3Npb24vcHVibGlzaGVkIGluZm8gZm9yIEFERC8gV1BERAotCQlvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gdW1hRGlhZ3JhbSA9IGFkZE9yV3BkRGlhZ3JhbS5nZXRVTUFEaWFncmFtKCk7Ci0JCWlmICh1bWFEaWFncmFtICE9IG51bGwpIHsKLQkJCWlmICh1bWFEaWFncmFtLmdldFN1cHByZXNzZWQoKS5ib29sZWFuVmFsdWUoKSkgewkKLQkJCQlpZiAoYWRkT3JXcGREaWFncmFtIGluc3RhbmNlb2YgQWN0aXZpdHlEZXRhaWxEaWFncmFtKXsKLQkJCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFERCh1bWFBY3Rpdml0eSwgZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhZGRPcldwZERpYWdyYW0gaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlcGVuZGVuY3lEaWFncmFtKSB7Ci0JCQkJCURpYWdyYW1PcHRpb25zLnNldFB1Ymxpc2hXUEREKHVtYUFjdGl2aXR5LCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdldCBhdXRvTGF5b3V0IGZsYWcgaWYgZGlhZ3JhbSBpcyBBREQKLQkJaWYgKGFkZE9yV3BkRGlhZ3JhbSBpbnN0YW5jZW9mIEFjdGl2aXR5RGV0YWlsRGlhZ3JhbSkgewotCQkJYm9vbGVhbiB2YWx1ZSA9IEdyYXBoaWNhbERhdGFIZWxwZXIKLQkJCQkJLmlzQXV0b0xheW91dCgoQWN0aXZpdHlEZXRhaWxEaWFncmFtKSBhZGRPcldwZERpYWdyYW0pOwotCQkJKChBY3Rpdml0eURldGFpbERpYWdyYW0pIGFkZE9yV3BkRGlhZ3JhbSkuc2V0QXV0b0xheW91dCh2YWx1ZSk7Ci0JCX0KLQkJCi0JCS8vIENyZWF0ZSBkaWFncmFtCi0JCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0oYWRkT3JXcGREaWFncmFtLCBraW5kLAotCQkJCXByZWZIaW50KTsKLQkJZGlhZ3JhbS5zZXRFbGVtZW50KGFkZE9yV3BkRGlhZ3JhbSk7Ci0JCWRpYWdyYW0uc2V0TmFtZSh1bWFBY3Rpdml0eS5nZXROYW1lKCkpOwotCQkKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoYWRkT3JXcGREaWFncmFtKTsKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkKLQkJTGlzdCBkaWFncmFtTm9kZXMgPSBhZGRPcldwZERpYWdyYW0uZ2V0Tm9kZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGRpYWdyYW1Ob2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUgKSB7Ci0JCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iajsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgJiYKLQkJCQkJCSgoKFR5cGVkTm9kZSlvYmopLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSkJewkKLQkJCQkJLy8gZG8gc3BlY2lhbCBoYW5kaW5nIGZvciBmcmVlIHRleHQgbm9kZQkJCQkJCi0JCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgdGV4dCA9IE1hcFV0aWwuY3JlYXRlVGV4dChkaWFncmFtLCAoTm9kZSkgb2JqKTsKLQkJCQkJZGlhZ3JhbS5pbnNlcnRDaGlsZCh0ZXh0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIENyZWF0ZSBOb3RhdGlvbiBubm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIG5vdGF0aW9uTm9kZSA9IE1hcFV0aWwuY3JlYXRlTm90YXRpb25Ob2RlX0FERG9yV1BEKGRpYWdyYW0sIG5vZGUpOwotCQkJCQlpZiAobm90YXRpb25Ob2RlID09IG51bGwpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWRpYWdyYW0uaW5zZXJ0Q2hpbGQobm90YXRpb25Ob2RlKTsKLQotCQkJCQlCb3VuZHMgYm91bmRzID0gTm90YXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCb3VuZHMoKTsKLQkJCQkJYm91bmRzLnNldEhlaWdodChub2RlLmdldEhlaWdodCgpKTsKLQkJCQkJYm91bmRzLnNldFdpZHRoKG5vZGUuZ2V0V2lkdGgoKSk7Ci0JCQkJCWJvdW5kcy5zZXRYKG5vZGUuZ2V0TG9jYXRpb24oKS54KTsKLQkJCQkJYm91bmRzLnNldFkobm9kZS5nZXRMb2NhdGlvbigpLnkpOwotCQkJCQlub3RhdGlvbk5vZGUuc2V0TGF5b3V0Q29uc3RyYWludChib3VuZHMpOwotCi0JCQkJCW5vdGF0aW9uTm9kZS5zZXRFbGVtZW50KG5vZGUpOwotCQkJCQotCQkJCQlub2Rlcy5hZGQobm9kZSk7Ci0JCQkJCW1hcC5wdXQobm9kZSwgbm90YXRpb25Ob2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlDb25uZWN0aW9uRmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbm5lY3Rpb25GYWN0b3J5KGRpYWdyYW0sIG1hcCwga2luZCk7Ci0JCS8vIENyZWF0ZSBPdXRnb2luZyBjb25uZWN0aW9ucwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJZmFjdG9yeS5vdXRnb2luZ0Nvbm5lY3Rpb25zKChOb2RlKSBvYmopOwotCQkJfQotCQl9Ci0KLQkJLy8gQ3JlYXRlIE91dGdvaW5nIGNvbm5lY3Rpb25zCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBub2Rlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qgb2JqID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlmYWN0b3J5LmluY29taW5nQ29ubmVjdGlvbnMoKE5vZGUpIG9iaik7Ci0JCQl9Ci0JCX0KLQkJCi0JfQotCQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREYXRhVG9SZXNvdXJjZV9BRCggUmVzb3VyY2UgeG1pUmVzb3VyY2UsIFByb2Nlc3MgcHJvYywKLQkJCUFjdGl2aXR5IHVtYUFjdGl2aXR5KSB7Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtIGQgPSBHcmFwaGljYWxEYXRhTWFuYWdlci5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFVNQURpYWdyYW0odW1hQWN0aXZpdHksIElEaWFncmFtTWFuYWdlci5BQ1RJVklUWV9ESUFHUkFNLAotCQkJCQkJZmFsc2UpOwotCQlpZiAoZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFELT4iK3Byb2MuZ2V0TmFtZSgpKyI6Iit1bWFBY3Rpdml0eS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQkKLQkJLy8gQ3JlYXRlIHRvcCBsZXZlbCBVTUwgYWN0aXZpdHkKLQkJRU9iamVjdCBhY3Rpdml0eSA9IFVNTEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZShVTUxQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eSgpKTsKLQkJaWYgKGFjdGl2aXR5IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpIHsKLQkJCSgob3JnLmVjbGlwc2UudW1sMi51bWwuQWN0aXZpdHkpYWN0aXZpdHkpLnNldE5hbWUodW1hQWN0aXZpdHkuZ2V0TmFtZSgpKTsKLQkJfQotCQlpZiAoYWN0aXZpdHkgaW5zdGFuY2VvZiBFTW9kZWxFbGVtZW50KSB7Ci0JCQkvL0JyaWRnZUhlbHBlci5hZGRFQW5ub3RhdGlvbigoRU1vZGVsRWxlbWVudCkgYWN0aXZpdHksICgoTWV0aG9kRWxlbWVudCkgdW1hQWN0aXZpdHkpKTsKLS8vCQkJVW1hVW1sVXRpbC5jcmVhdGVFQW5ub3RhdGlvbkZvclVtbCgoTmFtZWRFbGVtZW50KSBhY3Rpdml0eSwKLS8vCQkJCQl1bWFBY3Rpdml0eS5nZXRHdWlkKCkpOwotCQkJCi0JCQlCcmlkZ2VIZWxwZXIuYXNzb2NpYXRlKChFTW9kZWxFbGVtZW50KSBhY3Rpdml0eSwgdW1hQWN0aXZpdHkpOwotCQl9Ci0JCQotCQkvLyBDcmVhdGUgZGlhZ3JhbQotCQlEaWFncmFtIGRpYWdyYW0gPSBWaWV3U2VydmljZS5jcmVhdGVEaWFncmFtKGFjdGl2aXR5LCBEaWFncmFtTWFuYWdlci5BRF9raW5kLAotCQkJCUFjdGl2aXR5RGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOwotCQlkaWFncmFtLnNldEVsZW1lbnQoYWN0aXZpdHkpOwotCQlpZiAoYWN0aXZpdHkgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSkgewotCQkJZGlhZ3JhbS5zZXROYW1lKHVtYUFjdGl2aXR5LmdldE5hbWUoKSk7Ci0JCX0KLQkKLQkJU3VwcHJlc3Npb24gc3VwcHJlc3Npb24gPSBuZXcgU3VwcHJlc3Npb24ocHJvYyk7Ci0JCQotCQlBY3Rpdml0eURpYWdyYW0gYWQgPSBNb2RlbEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGlhZ3JhbSgpOwotCQlhZC5zZXRTdXBwcmVzc2lvbihzdXBwcmVzc2lvbik7Ci0JCWFkLnNldE9iamVjdCh1bWFBY3Rpdml0eSk7Ci0JCWlmIChhZC5pc05ldygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIHNldCBzdXBwcmVzc2lvbi9wdWJsaXNoZWQgaW5mbyBmb3IgQUQgCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSB1bWFEaWFncmFtID0gYWQuZ2V0VU1BRGlhZ3JhbSgpOwotCQlpZiAodW1hRGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQlpZiAodW1hRGlhZ3JhbS5nZXRTdXBwcmVzc2VkKCkuYm9vbGVhblZhbHVlKCkpIHsJCi0JCQkJRGlhZ3JhbU9wdGlvbnMuc2V0UHVibGlzaEFEKHVtYUFjdGl2aXR5LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJCi0vLwkJcmV0dXJuIChMaXN0KSBhZC5nZXROb2RlcygpOwotCQkKLS8vCQlMaXN0IGRpYWdyYW1Ob2RlcyA9IGdldEFjdGl2aXR5RGlhZ3JhbURhdGEoc3VwcHJlc3Npb24sIHVtYUFjdGl2aXR5KTsKLQkJTGlzdCBkaWFncmFtTm9kZXMgPSBhZC5nZXROb2RlcygpOwotCQlpZiAoZGlhZ3JhbU5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQotCi0JCXhtaVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGFjdGl2aXR5KTsKLQkJeG1pUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkKLQkJTGlzdCBtYXBOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSGFzaE1hcCBtYXBOb2Rlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQotCQkvLyBDcmVhdGUgVU1MIGFuZCBub3RhdGlvbiBub2RlcwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGlhZ3JhbU5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTm9kZSApIHsKLQkJCQlpZiAoKG9iaiBpbnN0YW5jZW9mIFR5cGVkTm9kZSkgJiYKLQkJCQkJCSgoKFR5cGVkTm9kZSlvYmopLmdldFR5cGUoKSA9PSBUeXBlZE5vZGUuRlJFRV9URVhUKSkJewkKLQkJCQkJLy8gZG8gc3BlY2lhbCBoYW5kaW5nIGZvciBmcmVlIHRleHQgbm9kZQotCQkJCQlvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlIHRleHQgPSBNYXBVdGlsLmNyZWF0ZVRleHQoZGlhZ3JhbSwgKE5vZGUpIG9iaik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlNYXBOb2RlIG1hcE5vZGUgPSBNYXBGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlKChOb2RlKSBvYmopOwotCQkJCQltYXBOb2RlLnNldEFjdGl2aXR5KChvcmcuZWNsaXBzZS51bWwyLnVtbC5BY3Rpdml0eSlhY3Rpdml0eSk7Ci0JCQkJCW1hcE5vZGUuc2V0RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJCi0JCQkJCW1hcE5vZGUudXBkYXRlUmVzb3VyY2UoKTsKLQkJCQkJbWFwTm9kZXMuYWRkKG1hcE5vZGUpOwotCQkJCQltYXBOb2Rlc01hcC5wdXQobWFwTm9kZSwgKE5vZGUpIG9iaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgT3V0Z29pbmcgY29ubmVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWFwTm9kZSkgewotCQkJCSgoTWFwTm9kZSkgb2JqKS5vdXRnb2luZ0Nvbm5lY3Rpb25zKChOb2RlKSBtYXBOb2Rlc01hcC5nZXQoKE1hcE5vZGUpIG9iaikpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBDcmVhdGUgaW5jb21pbmcgY29ubmVjdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcE5vZGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWFwTm9kZSkgewotCQkJCSgoTWFwTm9kZSkgb2JqKS5pbmNvbWluZ0Nvbm5lY3Rpb25zKChOb2RlKSBtYXBOb2Rlc01hcC5nZXQoKE1hcE5vZGUpIG9iaikpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybiBhY3Rpdml0eSBkaWFncmFtIGRhdGEKLQkgKiBAcGFyYW0gc3VwCi0JICogQHBhcmFtIGFjdGl2aXR5Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRBY3Rpdml0eURpYWdyYW1EYXRhKFN1cHByZXNzaW9uIHN1cCwgQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJQWN0aXZpdHlEaWFncmFtIGFkID0gTW9kZWxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBY3Rpdml0eURpYWdyYW0oKTsKLQkJYWQuc2V0U3VwcHJlc3Npb24oc3VwKTsKLQkJYWQuc2V0T2JqZWN0KGFjdGl2aXR5KTsKLQkJaWYgKGFkLmlzTmV3KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoTGlzdCkgYWQuZ2V0Tm9kZXMoKTsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQUQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRBREQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRXUEQoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFByb2Nlc3MgcHJvYywKLQkJCWZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LCBmaW5hbCBEaWFncmFtTWFuYWdlciBtZ3IpIHsKLQkJYWRkVG9SZXNvdXJjZShyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHksIG1nciwgMik7Ci0JfQotCQotCS8vdHlwZTogMD1BRCwgMT1BREQsIDI9V1BECi0JcHJpdmF0ZSB2b2lkIGFkZFRvUmVzb3VyY2UoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQlmaW5hbCBQcm9jZXNzIHByb2MsIGZpbmFsIEFjdGl2aXR5IHVtYUFjdGl2aXR5LAotCQkJZmluYWwgRGlhZ3JhbU1hbmFnZXIgbWdyLCBmaW5hbCBpbnQgdHlwZSkgewotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVHJhbnNhY3Rpb24gdHggPSBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oCi0JCQkJCQkJZmFsc2UsIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0KLQkJCQkJaWYgKHR5cGUgPT0gMCkgewotCQkJCQkJYWRkRGF0YVRvUmVzb3VyY2VfQUQocmVzb3VyY2UsIHByb2MsIHVtYUFjdGl2aXR5KTsKLQkJCQkJfSBlbHNlIGlmICh0eXBlID09IDEpIHsKLQkJCQkJCWFkZERhdGFUb1Jlc291cmNlX0FERChyZXNvdXJjZSwgcHJvYywgdW1hQWN0aXZpdHkpOwotCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT0gMikgewotCQkJCQkJYWRkRGF0YVRvUmVzb3VyY2VfV1BEKHJlc291cmNlLCBwcm9jLCB1bWFBY3Rpdml0eSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhc3NlcnQgKGZhbHNlKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJdHguY29tbWl0KCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3dpemFyZHMvTWlncmF0aW9uRXhwb3J0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjNiODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5EaWFncmFtTWlncmF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5NaWdyYXRpb25FeHBvcnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvblJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWQuc2VydmljZXMuV29ya2Zsb3dFeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBFeHBvcnQgd2l6YXJkIGZvciBleHBvcnRpbmcgZGlhZ3JhbXMKLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJRXhwb3J0V2l6YXJkIHsKLQotCS8vIFRoZSB3b3JrYmVuY2ggaW5zdGFuY2UuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gVGhlIHdvcmtiZW5jaCBzZWxlY3Rpb24gd2hlbiB0aGUgd2l6YXJkIHdhcyBzdGFydGVkLgotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0KLQkvLyBUaGUgZmlyc3Qgd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIE1pZ3JhdGlvbkV4cG9ydFdpemFyZFBhZ2UgcGFnZTE7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgZGlhZ3JhbSBtaWdyYXRpb24gZXhwb3J0Ci0JICovCi0JcHVibGljIE1pZ3JhdGlvbkV4cG9ydFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHBhZ2UxICE9IG51bGwpIHsKLQotCQkJUHJvY2VzcyBwcm9jID0gcGFnZTEuZ2V0UHJvY2VzcygpOwotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSBwYWdlMS5nZXRBY3Rpdml0eSgpOwotCQkJLy8gTWV0aG9kQ29uZmlndXJhdGlvbiBtYyA9IHBhZ2UxLmdldENvbnRleHQoKTsKLQotCQkJU3RyaW5nIGZpbGVOYW1lID0gcGFnZTEuZ2V0VGVtcGxhdGVOYW1lKCk7Ci0JCQlTdHJpbmcgdGFyZ2V0RGlyID0gcGFnZTEuZ2V0VGFyZ2V0RGlyZWN0b3J5KCk7Ci0KLQkJCVN0cmluZyB0ZW1wbGF0ZUZpbGVOYW1lID0gZmlsZU5hbWUgKyAiLnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyLCB0ZW1wbGF0ZUZpbGVOYW1lKTsKLQkJCWlmICh0ZW1wbGF0ZUZpbGUuZXhpc3RzKCkpIHsKLQkJCQlib29sZWFuIG9rID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheVByb21wdCgKLQkJCQkJCQkJTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X292ZXJ3cml0ZVRleHREaWFsb2dfdGl0bGUsCi0JCQkJCQkJCU1pZ3JhdGlvblJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X292ZXJ3cml0ZVRleHRfbXNnLAotCQkJCQkJCQkJCQkJbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCQkJCQkJdGVtcGxhdGVGaWxlTmFtZSwKLQkJCQkJCQkJCQkJCQkJdGFyZ2V0RGlyIH0pKTsKLQotCQkJCWlmICghb2spIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBXb3JrZmxvd0V4cG9ydFNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5leHBvcnQoCi0JCQkJCQlwcm9jLCBhY3Rpdml0eSwgZmlsZU5hbWUsIG5ldyBGaWxlKHRhcmdldERpcikpOwotCi0JCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQl9IGNhdGNoIChNaWdyYXRpb25FeHBvcnRFeGNlcHRpb24geGUpIHsKLQkJCQl4ZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpemFyZCNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJLy8gc3VwZXIuYWRkUGFnZXMoKTsKLQkJTWV0aG9kTGlicmFyeSBsaWIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWIgPT0gbnVsbCkgewotCQkJRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMub3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90aXRsZSwKLQkJCQkJCQlNaWdyYXRpb25SZXNvdXJjZXMub3Blbl9tZXRob2RfbGlicmFyeV9lcnJvcl90ZXh0KTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcGFnZTEgPSBuZXcgTWlncmF0aW9uRXhwb3J0V2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKHBhZ2UxKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCS8vIHJldHVybiBzdXBlci5jYW5GaW5pc2goKTsKLQkJcmV0dXJuIHBhZ2UxLmlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2NyZWF0ZVBhZ2VDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSBwYWdlQ29udGFpbmVyKSB7Ci0JCXN1cGVyLmNyZWF0ZVBhZ2VDb250cm9scyhwYWdlQ29udGFpbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkL3dpemFyZHMvTWlncmF0aW9uRXhwb3J0V2l6YXJkUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTAxOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWQvd2l6YXJkcy9NaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLkRpYWdyYW1NaWdyYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLk1pZ3JhdGlvbkV4cG9ydENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uTWlncmF0aW9uUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS51dGlsLk1pZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRXhwb3J0IHdpemFyZCBwYWdlIGZvciBleHBvcnRpbmcgZGlhZ3JhbXMKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzCi0JCUlXaXphcmRQYWdlLCBMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQVJSQVkgPSBuZXcgU3RyaW5nWzBdOwotCi0JcHJpdmF0ZSBCdXR0b24gY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIGRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uOwotCi0JcHJpdmF0ZSBDb21ibyBwcm9jZXNzQ29tYm87Ci0KLS8vCXByaXZhdGUgQ29tYm8gY29udGV4dENvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyBhY3Rpdml0eUNvbWJvOwotCi0JcHJpdmF0ZSBDb21ibyB0ZW1wbGF0ZU5hbWVDb21ibzsKLQotCXByaXZhdGUgQ29tYm8gdGVtcGxhdGVEaXJDb21ibzsKLQotCXByaXZhdGUgTWFwIGNhcGFiaWxpdHlQYXR0ZXJuczsKLQotCXByaXZhdGUgTWFwIGRlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0JcHJpdmF0ZSBNYXAgYWN0aXZpdGllczsKLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBNaWdyYXRpb25FeHBvcnRXaXphcmRQYWdlKCkgewotCQlzdXBlcihQQUdFX05BTUUpOwotCQlzZXRUaXRsZShNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX3RleHQpOwotCQkKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEltYWdlRGVzY3JpcHRvcigiZnVsbC93aXpiYW4vRXhwb3J0WE1MLmdpZiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCS8vIENyZWF0ZSB0aGUgY29tcG9zaXRlIHRvIGhvbGQgdGhlIHdpZGdldHMuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBQcm9jZXNzIGdyb3VwLgotCQlHcm91cCBwcm9jZXNzR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXByb2Nlc3NHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJcHJvY2Vzc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlwcm9jZXNzR3JvdXAKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzR3JvdXBfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocHJvY2Vzc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCWNhcGFiaWxpdHlQYXR0ZXJuUmFkaW9CdXR0b24KLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uX3RleHQpOwotCQljYXBhYmlsaXR5UGF0dGVyblJhZGlvQnV0dG9uCi0JCQkJLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhjYXBhYmlsaXR5UGF0dGVybnMpOwotCQkJCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUkFESU8pOwotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2RlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uX3RleHQpOwotCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbgotCQkJCS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCQl1cGRhdGVQcm9jZXNzQ29tYm8oZGVsaXZlcnlQcm9jZXNzZXMpOwotCQkJCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQlDb21wb3NpdGUgcHJvY2Vzc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocHJvY2Vzc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCXByb2Nlc3NDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXByb2Nlc3NDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgcHJvY2Vzc05hbWVMYWJlbCA9IG5ldyBMYWJlbChwcm9jZXNzQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXByb2Nlc3NOYW1lTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9wcm9jZXNzTmFtZUxhYmVsX3RleHQpOwotCi0JCXByb2Nlc3NDb21ibyA9IG5ldyBDb21ibyhwcm9jZXNzQ29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCXByb2Nlc3NDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHJvY2Vzc0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0vLwkJCQl1cGRhdGVDb250ZXh0Q29tYm8oZ2V0UHJvY2VzcygpKTsKLS8vCQkJCWlmIChnZXRQcm9jZXNzQ29udGV4dE5hbWUoKSAhPSBudWxsKSB7Ci0vLwkJCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCQkJTWFwIHJlc3VsdCA9IE1pZ3JhdGlvblV0aWwuZ2V0Q29udGV4dHMoZ2V0UHJvY2VzcygpKTsKLS8vCQkJCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSwKLS8vCQkJCQkJCShNZXRob2RDb25maWd1cmF0aW9uKSByZXN1bHQuZ2V0KGNvbnRleHROYW1lKSk7Ci0vLwkJCQl9Ci0JCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0KLS8vCQlMYWJlbCBjb250ZXh0TmFtZUxhYmVsID0gbmV3IExhYmVsKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5OT05FKTsKLS8vCQljb250ZXh0TmFtZUxhYmVsCi0vLwkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9jb250ZXh0TmFtZUxhYmVsX3RleHQpOwotLy8KLS8vCQljb250ZXh0Q29tYm8gPSBuZXcgQ29tYm8ocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotLy8JCWNvbnRleHRDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLS8vCQljb250ZXh0Q29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotLy8KLS8vCQljb250ZXh0Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotLy8JCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCQlNYXAgcmVzdWx0ID0gTWlncmF0aW9uVXRpbC5nZXRDb250ZXh0cyhnZXRQcm9jZXNzKCkpOwotLy8JCQkJdXBkYXRlQWN0aXZpdHlDb21ibyhnZXRQcm9jZXNzKCksIChNZXRob2RDb25maWd1cmF0aW9uKSByZXN1bHQKLS8vCQkJCQkJLmdldChjb250ZXh0TmFtZSkpOwotLy8JCQl9Ci0vLwotLy8JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLS8vCQkJfQotLy8JCX0pOwotCi0JCUxhYmVsIGFjdGl2aXRpZXNOYW1lTGFiZWwgPSBuZXcgTGFiZWwocHJvY2Vzc0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhY3Rpdml0aWVzTmFtZUxhYmVsCi0JCQkJLnNldFRleHQoTWlncmF0aW9uUmVzb3VyY2VzLndvcmtmbG93X2V4cG9ydF93aXphcmRfYWN0aXZpdGllc05hbWVMYWJlbF90ZXh0KTsKLQotCQlhY3Rpdml0eUNvbWJvID0gbmV3IENvbWJvKHByb2Nlc3NDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJYWN0aXZpdHlDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJYWN0aXZpdHlDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5zID0gTWlncmF0aW9uVXRpbC5nZXRDYXBhYmlsaXR5UGF0dGVybnMoKTsKLQkJZGVsaXZlcnlQcm9jZXNzZXMgPSBNaWdyYXRpb25VdGlsLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKCk7Ci0JCVN0cmluZyBzYXZlZFByb2Nlc3NUeXBlID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfVFlQRSk7Ci0JCWlmIChzYXZlZFByb2Nlc3NUeXBlICE9IG51bGwKLQkJCQkmJiBzYXZlZFByb2Nlc3NUeXBlLmVxdWFscygiRGVsaXZlcnlQcm9jZXNzIikgJiYgZGVsaXZlcnlQcm9jZXNzZXMuc2l6ZSgpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQlkZWxpdmVyeVByb2Nlc3NSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oZGVsaXZlcnlQcm9jZXNzZXMpOwotCQl9IGVsc2UgaWYgKHNhdmVkUHJvY2Vzc1R5cGUgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMuc2l6ZSgpID4gMCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oY2FwYWJpbGl0eVBhdHRlcm5zKTsKLQkJfSBlbHNlIGlmIChjYXBhYmlsaXR5UGF0dGVybnMgIT0gbnVsbCAmJiBjYXBhYmlsaXR5UGF0dGVybnMuc2l6ZSgpID4gMCkgewotCQkJY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl1cGRhdGVQcm9jZXNzQ29tYm8oY2FwYWJpbGl0eVBhdHRlcm5zKTsKLQkJfSBlbHNlIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc1JhZGlvQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCXVwZGF0ZVByb2Nlc3NDb21ibyhkZWxpdmVyeVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQl1cGRhdGVBY3Rpdml0eUNvbWJvKGdldFByb2Nlc3MoKSk7Ci0JCQotCQkvLyBDcmVhdGUgdGhlIFByb2plY3QgVGVtcGxhdGUgZ3JvdXAuCi0JCUdyb3VwIHRlbXBsYXRlR3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCXRlbXBsYXRlR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCXRlbXBsYXRlR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRlbXBsYXRlR3JvdXAKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZUdyb3VwX3RleHQpOwotCi0JCUNvbXBvc2l0ZSB0ZW1wbGF0ZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGVtcGxhdGVHcm91cCwgU1dULk5VTEwpOwotCQl0ZW1wbGF0ZUNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJdGVtcGxhdGVDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgdGVtcGxhdGVOYW1lTGFiZWwgPSBuZXcgTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGVtcGxhdGVOYW1lTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF90ZW1wbGF0ZU5hbWVMYWJlbF90ZXh0KTsKLQotCQl0ZW1wbGF0ZU5hbWVDb21ibyA9IG5ldyBDb21ibyh0ZW1wbGF0ZUNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXRlbXBsYXRlTmFtZUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTdHJpbmcgcHJldk5hbWUgPSBEaWFncmFtTWlncmF0aW9uUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQlNaWdyYXRpb25FeHBvcnRDb25zdGFudHMuVEVNUExBVEVfTkFNRVMpOwotCQlpZiAocHJldk5hbWUgIT0gbnVsbCkgewotCQkJdGVtcGxhdGVOYW1lQ29tYm8uYWRkKHByZXZOYW1lKTsKLQkJfQotCQl0ZW1wbGF0ZU5hbWVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJbmV3IExhYmVsKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJTGFiZWwgZGlyTGFiZWwgPSBuZXcgTGFiZWwodGVtcGxhdGVDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGlyTGFiZWwKLQkJCQkuc2V0VGV4dChNaWdyYXRpb25SZXNvdXJjZXMud29ya2Zsb3dfZXhwb3J0X3dpemFyZF9kaXJMYWJlbF90ZXh0KTsKLQotCQl0ZW1wbGF0ZURpckNvbWJvID0gbmV3IENvbWJvKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJdGVtcGxhdGVEaXJDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJU3RyaW5nIHNhdmVkRGlyID0gRGlhZ3JhbU1pZ3JhdGlvblBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlRBUkdFVF9ESVJFQ1RPUklFUyk7Ci0JCWlmIChzYXZlZERpciAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZURpckNvbWJvLmFkZChzYXZlZERpcik7Ci0JCQl0ZW1wbGF0ZURpckNvbWJvLnNldFRleHQoc2F2ZWREaXIpOwotCQl9Ci0JCXRlbXBsYXRlRGlyQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKHRlbXBsYXRlQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbgotCQkJCS5zZXRUZXh0KE1pZ3JhdGlvblJlc291cmNlcy53b3JrZmxvd19leHBvcnRfd2l6YXJkX2Jyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhzaGVsbCwKLQkJCQkJCQlTV1QuTk9ORSk7Ci0JCQkJCVN0cmluZyBzZWxlY3RlZERpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChzZWxlY3RlZERpciAhPSBudWxsKSB7Ci0JCQkJCQl0ZW1wbGF0ZURpckNvbWJvLmFkZChzZWxlY3RlZERpciwgMCk7Ci0JCQkJCQl0ZW1wbGF0ZURpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIFByb2Nlc3MgQ29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvY2Vzc0NvbWJvKE1hcCBwcm9jZXNzZXMpIHsKLQkJaWYgKHByb2Nlc3NlcyAhPSBudWxsICYmIHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbcHJvY2Vzc2VzLnNpemUoKV07Ci0JCQlwcm9jZXNzZXMua2V5U2V0KCkudG9BcnJheShuYW1lcyk7Ci0JCQlwcm9jZXNzQ29tYm8uc2V0SXRlbXMobmFtZXMpOwotCQkJU3RyaW5nIHNhdmVkUHJvY2VzcyA9IERpYWdyYW1NaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfTkFNRSk7Ci0JCQlpZiAoc2F2ZWRQcm9jZXNzICE9IG51bGwgJiYgcHJvY2Vzc2VzLmNvbnRhaW5zS2V5KHNhdmVkUHJvY2VzcykpIHsKLQkJCQlwcm9jZXNzQ29tYm8uc2V0VGV4dChzYXZlZFByb2Nlc3MpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9jZXNzQ29tYm8uc2V0VGV4dChwcm9jZXNzQ29tYm8uZ2V0SXRlbSgwKSk7Ci0JCQl9Ci0vLwkJCXVwZGF0ZUNvbnRleHRDb21ibyhnZXRQcm9jZXNzKCkpOwotCQl9IGVsc2UgewotCQkJcHJvY2Vzc0NvbWJvLnNldEl0ZW1zKEVNUFRZX0FSUkFZKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIENvbnRleHQgQ29tYm8uCi0JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb250ZXh0Q29tYm8oUHJvY2VzcyBwcm9jZXNzKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJTWFwIGNvbnRleHRzID0gTWlncmF0aW9uVXRpbC5nZXRDb250ZXh0cyhwcm9jZXNzKTsKLS8vCQkJaWYgKGNvbnRleHRzICE9IG51bGwgJiYgY29udGV4dHMuc2l6ZSgpID4gMCkgewotLy8JCQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2NvbnRleHRzLnNpemUoKV07Ci0vLwkJCQljb250ZXh0cy5rZXlTZXQoKS50b0FycmF5KG5hbWVzKTsKLS8vCQkJCWNvbnRleHRDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0vLwkJCQlTdHJpbmcgc2F2ZWRDb250ZXh0ID0gRGlhZ3JhbW1pbmdNaWdyYXRpb25QbHVnaW4uZ2V0RGVmYXVsdCgpCi0vLwkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0vLwkJCQkJCQkJTWlncmF0aW9uRXhwb3J0Q29uc3RhbnRzLlBST0NFU1NfQ09OVEVYVCk7Ci0vLwkJCQlpZiAoc2F2ZWRDb250ZXh0ICE9IG51bGwgJiYgY29udGV4dHMuY29udGFpbnNLZXkoc2F2ZWRDb250ZXh0KSkgewotLy8JCQkJCWNvbnRleHRDb21iby5zZXRUZXh0KHNhdmVkQ29udGV4dCk7Ci0vLwkJCQl9IGVsc2UgewotLy8JCQkJCVN0cmluZyBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKQotLy8JCQkJCQkJLmdldE5hbWUoKTsKLS8vCQkJCQljb250ZXh0Q29tYm8uc2V0VGV4dChkZWZhdWx0Q29udGV4dCk7Ci0vLwkJCQl9Ci0vLwkJCX0gZWxzZSB7Ci0vLwkJCQljb250ZXh0Q29tYm8uc2V0SXRlbXMoRU1QVFlfQVJSQVkpOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQl9Ci0vLwl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhY3Rpdml0aXR5IENvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFjdGl2aXR5Q29tYm8oUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCXRyeSB7Ci0JCQlhY3Rpdml0aWVzID0gTWlncmF0aW9uVXRpbC5nZXRBY3Rpdml0aWVzKHByb2Nlc3MpOwotCQkJaWYgKGFjdGl2aXRpZXMgIT0gbnVsbCAmJiBhY3Rpdml0aWVzLnNpemUoKSA+IDApIHsKLQkJCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbYWN0aXZpdGllcy5zaXplKCldOwotCQkJCWFjdGl2aXRpZXMua2V5U2V0KCkudG9BcnJheShuYW1lcyk7Ci0JCQkJYWN0aXZpdHlDb21iby5zZXRJdGVtcyhuYW1lcyk7Ci0JCQkJLy8gU3RyaW5nIHNhdmVkQ29udGV4dCA9IFdvcmtmbG93RXhwUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS8vIC5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoCi0JCQkJLy8gV29ya2Zsb3dFeHBvcnRDb25zdGFudHMuQUNUSVZJVFlfQ09OVEVYVCk7Ci0JCQkJLy8gaWYgKHNhdmVkQ29udGV4dCAhPSBudWxsICYmCi0JCQkJLy8gY29udGV4dHMuY29udGFpbnNLZXkoc2F2ZWRDb250ZXh0KSkgewotCQkJCS8vIGFjdGl2aXR5Q29tYm8uc2V0VGV4dChzYXZlZENvbnRleHQpOwotCQkJCS8vIH0gZWxzZSB7Ci0JCQkJLy8gU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gcHJvY2Vzcy5nZXREZWZhdWx0Q29udGV4dCgpCi0JCQkJLy8gLmdldE5hbWUoKTsKLQkJCQkvLyBhY3Rpdml0eUNvbWJvLnNldFRleHQoZGVmYXVsdENvbnRleHQpOwotCQkJCS8vIH0KLQkJCQlhY3Rpdml0eUNvbWJvLnNldFRleHQobmFtZXNbMF0pOwotCQkJfSBlbHNlIHsKLQkJCQlhY3Rpdml0eUNvbWJvLnNldEl0ZW1zKEVNUFRZX0FSUkFZKTsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgUHJvY2Vzcy4KLQkgKi8KLQlwdWJsaWMgUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5SYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzQ29tYm8uZ2V0VGV4dCgpOwotCQkJcmV0dXJuIChQcm9jZXNzKSBjYXBhYmlsaXR5UGF0dGVybnMuZ2V0KG5hbWUpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG5hbWUgPSBwcm9jZXNzQ29tYm8uZ2V0VGV4dCgpOwotCQkJcmV0dXJuIChQcm9jZXNzKSBkZWxpdmVyeVByb2Nlc3Nlcy5nZXQobmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBQcm9jZXNzIGNvbnRleHQuCi0JICovCi0vLwlwdWJsaWMgU3RyaW5nIGdldFByb2Nlc3NDb250ZXh0TmFtZSgpIHsKLS8vCQlyZXR1cm4gKFN0cmluZykgY29udGV4dENvbWJvLmdldFRleHQoKTsKLS8vCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZU5hbWUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZU5hbWVDb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGFyZ2V0IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBsYXRlRGlyQ29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAocHJvY2Vzc0NvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwCi0vLwkJCQkmJiBjb250ZXh0Q29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiB0ZW1wbGF0ZU5hbWVDb21iby5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMAotCQkJCSYmIHRlbXBsYXRlRGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDAKLQkJCQkmJiBhY3Rpdml0eUNvbWJvLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEFjdGl2aXR5IGdldEFjdGl2aXR5KCkgewotCQlpZiAoYWN0aXZpdHlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKSB7Ci0JCQlTdHJpbmcgYWN0aXZpdHlOYW1lID0gYWN0aXZpdHlDb21iby5nZXRUZXh0KCk7Ci0JCQlBY3Rpdml0eSBhY3Rpdml0eSA9IChBY3Rpdml0eSkgYWN0aXZpdGllcy5nZXQoYWN0aXZpdHlOYW1lKTsKLQkJCXJldHVybiBhY3Rpdml0eTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLS8vCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGdldENvbnRleHQoKSB7Ci0vLwkJaWYgKGdldFByb2Nlc3NDb250ZXh0TmFtZSgpICE9IG51bGwpIHsKLS8vCQkJU3RyaW5nIGNvbnRleHROYW1lID0gZ2V0UHJvY2Vzc0NvbnRleHROYW1lKCk7Ci0vLwkJCU1hcCByZXN1bHQgPSBNaWdyYXRpb25VdGlsLmdldENvbnRleHRzKGdldFByb2Nlc3MoKSk7Ci0vLwkJCXJldHVybiAoTWV0aG9kQ29uZmlndXJhdGlvbikgcmVzdWx0LmdldChjb250ZXh0TmFtZSk7Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWRkd3BkL21hcC9Db25uZWN0aW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtL3NyYy9vcmcvZWNsaXBzZS9lcGYvbWlncmF0aW9uL2RpYWdyYW0vYWRkd3BkL21hcC9Db25uZWN0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODdhMjI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL2FkZHdwZC9tYXAvQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0uYWRkd3BkLm1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFic29sdXRlQmVuZHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUHJlY2lzaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLmFkLm1hcC5NYXBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkJvdW5kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLkVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uSWRlbnRpdHlBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm90YXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLlJlbGF0aXZlQmVuZHBvaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5WaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLmRhdGF0eXBlLlJlbGF0aXZlQmVuZHBvaW50OwotCi0vKioKLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkZhY3RvcnkgewotCi0JcHJpdmF0ZSBIYXNoTWFwIG1hcCA9IG51bGw7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBraW5kOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElNQUdFX0hFSUdIVCA9IDMyOwotCi0JcHVibGljIENvbm5lY3Rpb25GYWN0b3J5KERpYWdyYW0gZGlhZ3JhbSwgSGFzaE1hcCBtYXAsIFN0cmluZyBraW5kKSB7Ci0JCXRoaXMubWFwID0gbWFwOwotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOwotCQl0aGlzLmtpbmQgPSBraW5kOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBvdXRnb2luZyBjb25uZWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgb3V0Z29pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCS8vIGNyZWF0ZSBjb25uZWN0aW9uCi0JCQkJRWRnZSBlZGdlID0gY3JlYXRlQ29ubmVjdGlvbihsaW5rKTsKLQotCQkJCS8vIGdldCBzb3VyY2Ugbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCQkJLmdldChub2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyBzb3VyY2UgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRTb3VyY2VFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBpbmNvbWluZyBjb25uZWN0aW9ucwotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgaW5jb21pbmdDb25uZWN0aW9ucyhOb2RlIG5vZGUpIHsKLQkJTGlzdCBjb25uZWN0aW9ucyA9IG5vZGUuZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCi0JCWlmIChjb25uZWN0aW9ucyAhPSBudWxsICYmIGNvbm5lY3Rpb25zLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25uZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJTGluayBsaW5rID0gKExpbmspIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCS8vIGNyZWF0ZSBlZGdlCi0JCQkJRWRnZSBlZGdlID0gY3JlYXRlQ29ubmVjdGlvbihsaW5rKTsKLQotCQkJCS8vIGdldCBzb3VyY2Ugbm9kZQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCQkJLmdldChub2RlKTsKLQotCQkJCS8vIGFkZCB0aGUgZWRnZSBhcyB0YXJnZXQgZWRnZQotCQkJCXNvdXJjZU5vdGF0aW9uTm9kZS5nZXRUYXJnZXRFZGdlcygpLmFkZChlZGdlKTsKLQkJCQlzb3VyY2VOb3RhdGlvbk5vZGUuZ2V0RGlhZ3JhbSgpLmluc2VydEVkZ2UoZWRnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgbm90YXRpb24gZWRnZSBmb3IgdGhlIGdpdmVuIGxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gbGluawotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgY3JlYXRlQ29ubmVjdGlvbihMaW5rIGxpbmspIHsKLQkJLy8gZ2V0IHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMgb2YgdGhlIGxpbmsKLQkJTm9kZSBzb3VyY2VPYmogPSBsaW5rLmdldFNvdXJjZSgpOwotCQlOb2RlIHRhcmdldE9iaiA9IGxpbmsuZ2V0VGFyZ2V0KCk7Ci0KLQkJLy8gZ2V0IG5vdGF0aW9uIG5vZGVzCi0JCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc291cmNlTm90YXRpb25Ob2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIG1hcAotCQkJCS5nZXQoc291cmNlT2JqKTsKLQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb3RhdGlvbk5vZGUgPSAob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgbWFwCi0JCQkJLmdldCh0YXJnZXRPYmopOwotCi0JCUVkZ2UgZWRnZSA9IGZpbmRFZGdlKHNvdXJjZU5vdGF0aW9uTm9kZSwgdGFyZ2V0Tm90YXRpb25Ob2RlKTsKLQkJaWYgKGVkZ2UgPT0gbnVsbCAmJiB0YXJnZXROb3RhdGlvbk5vZGUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIG5vdGF0aW9uIGVkZ2UKLQkJCWlmIChraW5kID09IERpYWdyYW1NYW5hZ2VyLkFERF9raW5kKQotCQkJCWVkZ2UgPSBNYXBVdGlsLmNyZWF0ZUVkZ2VfV1BEKHNvdXJjZU5vdGF0aW9uTm9kZSwKLQkJCQkJCXRhcmdldE5vdGF0aW9uTm9kZSwgbGluayk7Ci0JCQllbHNlIGlmIChraW5kID09IERpYWdyYW1NYW5hZ2VyLldQRF9raW5kKQotCQkJCWVkZ2UgPSBNYXBVdGlsLmNyZWF0ZUVkZ2VfV1BEKHNvdXJjZU5vdGF0aW9uTm9kZSwKLQkJCQkJCXRhcmdldE5vdGF0aW9uTm9kZSwgbGluayk7Ci0KLQkJCWlmIChlZGdlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCWVkZ2Uuc2V0RWxlbWVudChsaW5rKTsKLQkJCWxvYWRTb3VyY2VBbmRUYXJnZXRFbmRQb2ludChlZGdlLCBsaW5rKTsKLQkJCWxvYWRCZW5kUG9pbnRzKGVkZ2UsIGxpbmspOwotCQl9Ci0JCXJldHVybiBlZGdlOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHNvdXJjZSBhbmQgdGFyZ2V0IGVuZCBwb2ludHMgZm9yIHN5bmNocm9uaXphdGlvbiBiYXIgYW5kIGRlY2lzaW9uCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBlZGdlCi0JICogQHBhcmFtIGZsb3cKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFNvdXJjZUFuZFRhcmdldEVuZFBvaW50KEVkZ2UgZWRnZSwgTGluayBmbG93KSB7Ci0JCVBvaW50IHNyY1BvaW50ID0gZmxvdy5nZXRTb3VyY2VFbmRQb2ludCgpOwotCQlQb2ludCB0YXJnZXRQb2ludCA9IGZsb3cuZ2V0VGFyZ2V0RW5kUG9pbnQoKTsKLQotCQlWaWV3IHNyY1ZpZXcgPSBlZGdlLmdldFNvdXJjZSgpOwotCQlWaWV3IHRhcmdldFZpZXcgPSBlZGdlLmdldFRhcmdldCgpOwotCi0JCWlmIChzcmNQb2ludCAhPSBudWxsCi0JCQkJJiYgc3JjVmlldyBpbnN0YW5jZW9mIG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHsKLQkJCUJvdW5kcyBib3VuZHMgPSAoQm91bmRzKSAoKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIHNyY1ZpZXcpCi0JCQkJCS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0JCQkvLyBmb3IgV1BELCBoZWlnaHQgaXMgbm90IHN0b3JlZCBhbmQgaXQncyBhbHdheXMgc2FtZS4KLQkJCS8vIFdlIGRvIG5lZWQgY29ycmVjdCBoZWlnaHQgdG8gY2FsY3VsYXRlIGlkZW50aXR5IGFuY2hvciBpbiBHTUYKLQkJCWlmIChib3VuZHMuZ2V0SGVpZ2h0KCkgPT0gLTEpCi0JCQkJYm91bmRzLnNldEhlaWdodCg0MCk7Ci0JCQlJZGVudGl0eUFuY2hvciBhbmNob3IgPSBjcmVhdGVJZGVudGl0eUFuY2hvcihzcmNQb2ludCwgYm91bmRzKTsKLQkJCWlmIChhbmNob3IgIT0gbnVsbCkKLQkJCQllZGdlLnNldFNvdXJjZUFuY2hvcihhbmNob3IpOwotCQl9Ci0KLQkJaWYgKHRhcmdldFBvaW50ICE9IG51bGwKLQkJCQkmJiB0YXJnZXRWaWV3IGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgewotCQkJQm91bmRzIGJvdW5kcyA9IChCb3VuZHMpICgob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSkgdGFyZ2V0VmlldykKLQkJCQkJLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCS8vIEZvciBXUEQsIGhlaWdodCBpcyBub3Qgc3RvcmVkIGFuZCBpdCdzIGFsd2F5cyBzYW1lLgotCQkJLy8gV2UgZG8gbmVlZCBjb3JyZWN0IGhlaWdodCB0byBjYWxjdWxhdGUgaWRlbnRpdHkgYW5jaG9yIGluIEdNRgotCQkJaWYgKGJvdW5kcy5nZXRIZWlnaHQoKSA9PSAtMSkKLQkJCQlib3VuZHMuc2V0SGVpZ2h0KDQwKTsKLQkJCUlkZW50aXR5QW5jaG9yIGFuY2hvciA9IGNyZWF0ZUlkZW50aXR5QW5jaG9yKHRhcmdldFBvaW50LCBib3VuZHMpOwotCQkJaWYgKGFuY2hvciAhPSBudWxsKQotCQkJCWVkZ2Uuc2V0VGFyZ2V0QW5jaG9yKGFuY2hvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgaWRlbnRpdHkgYW5jaG9yCi0JICogCi0JICogQHBhcmFtIHBvaW50Ci0JICogQHBhcmFtIGJvdW5kcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElkZW50aXR5QW5jaG9yIGNyZWF0ZUlkZW50aXR5QW5jaG9yKFBvaW50IHBvaW50LCBCb3VuZHMgYm91bmRzKSB7Ci0JCVByZWNpc2lvblBvaW50IHByZVBvaW50ID0gTWFwVXRpbC5nZXRBbmNob3JSZWxhdGl2ZUxvY2F0aW9uKHBvaW50LAotCQkJCWJvdW5kcyk7Ci0JCVN0cmluZyBpZCA9IE1hcFV0aWwuY29tcG9zZVRlcm1pbmFsU3RyaW5nKHByZVBvaW50KTsKLQotCQlJZGVudGl0eUFuY2hvciB2YWx1ZSA9IE5vdGF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpdHlBbmNob3IoKTsKLQkJdmFsdWUuc2V0SWQoaWQpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHJlbGF0aXZlIGJlbmQgcG9pbnRzCi0JICogCi0JICogQHBhcmFtIGVkZ2UKLQkgKiBAcGFyYW0gZmxvdwotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQmVuZFBvaW50cyhFZGdlIGVkZ2UsIExpbmsgZmxvdykgewotCQlMaXN0IGxpc3QgPSBmbG93LmdldEJlbmRwb2ludHMoKTsKLQkJTGlzdDxSZWxhdGl2ZUJlbmRwb2ludD4gcmVsYXRpdmVQb2ludHMgPSBuZXcgQXJyYXlMaXN0PFJlbGF0aXZlQmVuZHBvaW50PigpOwotCi0JCVJlbGF0aXZlQmVuZHBvaW50IHJicCA9IG5ldyBSZWxhdGl2ZUJlbmRwb2ludCgwLCAwLCAwLCAwKTsKLQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlBYnNvbHV0ZUJlbmRwb2ludCBhYnAgPSAoQWJzb2x1dGVCZW5kcG9pbnQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCW9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUgc3JjTm9kZSA9IChvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5Ob2RlKSBlZGdlCi0JCQkJCQkuZ2V0U291cmNlKCk7Ci0JCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlID0gKG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGUpIGVkZ2UKLQkJCQkJCS5nZXRUYXJnZXQoKTsKLQotCQkJCUJvdW5kcyBzb3VyY2VCb3VuZHMgPSAoQm91bmRzKSBzcmNOb2RlLmdldExheW91dENvbnN0cmFpbnQoKTsKLQkJCQlCb3VuZHMgdGFyZ2V0Qm91bmRzID0gKEJvdW5kcykgdGFyZ2V0Tm9kZS5nZXRMYXlvdXRDb25zdHJhaW50KCk7Ci0KLQkJCQlpbnQgc3JjTGluZSA9IE1hcFV0aWwuZ2V0Tm9PZkxpbmVzKHNyY05vZGUpOwotCQkJCWludCB0YXJnZXRMaW5lID0gTWFwVXRpbC5nZXROb09mTGluZXModGFyZ2V0Tm9kZSk7Ci0JCQkJaW50IHNyY0hlaWdodCA9IE1hcFV0aWwuZ2V0VGV4dEhlaWdodChzcmNOb2RlKTsKLQkJCQlpbnQgdGFyZ2V0SGVpZ2h0ID0gTWFwVXRpbC5nZXRUZXh0SGVpZ2h0KHRhcmdldE5vZGUpOwotCi0JCQkJaW50IHNyY1ggPSBzb3VyY2VCb3VuZHMuZ2V0WCgpICsgc291cmNlQm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCBzcmNZID0gc291cmNlQm91bmRzLmdldFkoKQotCQkJCQkJKyAoSU1BR0VfSEVJR0hUICsgKHNyY0xpbmUgKiBzcmNIZWlnaHQpKSAvIDI7Ci0JCQkJaW50IHRhclggPSB0YXJnZXRCb3VuZHMuZ2V0WCgpICsgdGFyZ2V0Qm91bmRzLmdldFdpZHRoKCkgLyAyOwotCQkJCWludCB0YXJZID0gdGFyZ2V0Qm91bmRzLmdldFkoKQotCQkJCQkJKyAoSU1BR0VfSEVJR0hUICsgKHRhcmdldExpbmUgKiB0YXJnZXRIZWlnaHQpKSAvIDI7Ci0KLQkJCQlpbnQgcmVsMSA9IGFicC54IC0gc3JjWDsKLQkJCQlpbnQgcmVsMiA9IGFicC55IC0gc3JjWTsKLQkJCQlpbnQgcmVsMyA9IGFicC54IC0gdGFyWDsKLQkJCQlpbnQgcmVsNCA9IGFicC55IC0gdGFyWTsKLQotCQkJCVJlbGF0aXZlQmVuZHBvaW50IHJicDEgPSBuZXcgUmVsYXRpdmVCZW5kcG9pbnQocmVsMSwgcmVsMiwKLQkJCQkJCXJlbDMsIHJlbDQpOwotCQkJCXJlbGF0aXZlUG9pbnRzLmFkZChyYnAxKTsKLQkJCX0KLQkJfQotCQlyZWxhdGl2ZVBvaW50cy5hZGQocmJwKTsKLQotCQlpZiAocmVsYXRpdmVQb2ludHMuc2l6ZSgpID4gMCkgewotCQkJUmVsYXRpdmVCZW5kcG9pbnRzIGJlbmRwb2ludHMgPSBOb3RhdGlvbkZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCS5jcmVhdGVSZWxhdGl2ZUJlbmRwb2ludHMoKTsKLQkJCWJlbmRwb2ludHMuc2V0UG9pbnRzKHJlbGF0aXZlUG9pbnRzKTsKLQkJCWVkZ2Uuc2V0QmVuZHBvaW50cyhiZW5kcG9pbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmQgZWRnZSBpbiBkaWFncmFtIGdpdmVuIHNvdXJjZSBhbmQgdGFyZ2V0IG5vZGVzCi0JICogCi0JICogQHBhcmFtIHNvdXJjZU5vZGUKLQkgKiBAcGFyYW0gdGFyZ2V0Tm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEVkZ2UgZmluZEVkZ2Uob3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSBzb3VyY2VOb2RlLAotCQkJb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uTm9kZSB0YXJnZXROb2RlKSB7Ci0JCUxpc3QgbGlzdCA9IGRpYWdyYW0uZ2V0RWRnZXMoKTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiBsaXN0LnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlFZGdlIGVkZ2UgPSAoRWRnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICgoZWRnZS5nZXRUYXJnZXQoKSAhPSBudWxsKQotCQkJCQkJJiYgdGFyZ2V0Tm9kZS5lcXVhbHMoZWRnZS5nZXRUYXJnZXQoKSkKLQkJCQkJCSYmIChlZGdlLmdldFNvdXJjZSgpICE9IG51bGwpCi0JCQkJCQkmJiBzb3VyY2VOb2RlLmVxdWFscyhlZGdlLmdldFNvdXJjZSgpKSkgewotCQkJCQlyZXR1cm4gZWRnZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0vc3JjL29yZy9lY2xpcHNlL2VwZi9taWdyYXRpb24vZGlhZ3JhbS91dGlsL01pZ3JhdGlvblV0aWwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGUyZDcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS9zcmMvb3JnL2VjbGlwc2UvZXBmL21pZ3JhdGlvbi9kaWFncmFtL3V0aWwvTWlncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLlByb2Nlc3NDb25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLk1vZGVsU3RydWN0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBIZWxwZXIgdXRpbGl0aWVzIGZvciB0aGUgTWlncmF0aW9uIFNlcnZpY2UuCi0gKgotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWlncmF0aW9uVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGFuZCA8Y29kZT5EZWxpdmVyeVByb2Nlc3M8L2NvZGU+Ci0JICogaW4gdGhlIGN1cnJlbnQgTWV0aG9kIExpYnJhcnkuCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWFwIGdldFByb2Nlc3NlcygpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTGlzdCBtZXRob2RQbHVnaW5zID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2lucyhsaWJyYXJ5KTsKLQkJZm9yIChJdGVyYXRvciBpID0gbWV0aG9kUGx1Z2lucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbilpLm5leHQoKTsKLQkJCVN0cmluZyBjYXBhYmlsaXR5UGF0dGVyblBhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSAgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwgY2FwYWJpbGl0eVBhdHRlcm5QYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQkJfQotCQkJfQotCQkJU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzW10gPSBNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRlbGl2ZXJ5UHJvY2Vzc1BhdGg7Ci0JCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sIGRlbGl2ZXJ5UHJvY2Vzc1BhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKChQcm9jZXNzUGFja2FnZSltZXRob2RQYWNrYWdlLCByZXN1bHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYWxsIDxjb2RlPkNhcGFiaWxpdHlQYXR0ZXJuPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKCkgewotCQlNZXRob2RMaWJyYXJ5IGxpYnJhcnkgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCU1hcCByZXN1bHQgPSBuZXcgVHJlZU1hcCgpOwotCQlMaXN0IG1ldGhvZFBsdWdpbnMgPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKGxpYnJhcnkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCU1ldGhvZFBsdWdpbiBtZXRob2RQbHVnaW4gPSAoTWV0aG9kUGx1Z2luKWkubmV4dCgpOwotCQkJU3RyaW5nIGNhcGFiaWxpdHlQYXR0ZXJuUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuY2FwYWJpbGl0eVBhdHRlcm5QYXRoOwotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlICA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBjYXBhYmlsaXR5UGF0dGVyblBhdGhzKTsKLQkJCWlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXRDYXBhYmlsaXR5UGF0dGVybnMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBpbiB0aGUgY3VycmVudCBNZXRob2QgTGlicmFyeS4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSB7Ci0JCU1ldGhvZExpYnJhcnkgbGlicmFyeSA9IExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCWlmIChsaWJyYXJ5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWFwIHJlc3VsdCA9IG5ldyBUcmVlTWFwKCk7Ci0JCUxpc3QgbWV0aG9kUGx1Z2lucyA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbnMobGlicmFyeSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG1ldGhvZFBsdWdpbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiA9IChNZXRob2RQbHVnaW4paS5uZXh0KCk7Ci0JCQlTdHJpbmcgZGVsaXZlcnlQcm9jZXNzUGF0aHNbXSA9IE1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGVsaXZlcnlQcm9jZXNzUGF0aDsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLCBkZWxpdmVyeVByb2Nlc3NQYXRocyk7Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKFByb2Nlc3NQYWNrYWdlKW1ldGhvZFBhY2thZ2UsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFsbCB0aGUgY29udGV4dHMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzcy4KLQkgKgotCSAqIFRPRE86IE1vdmUgdGhpcyBtZXRob2QgdG8gdGhlIGNvbS5pYm0ucm1tLmxpYnJhcnkuc2VydmljZXMuTGlicmFyeVV0aWwgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0Q29udGV4dHMoUHJvY2VzcyBwcm9jZXNzKSB7Ci0JCWlmIChwcm9jZXNzID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJaWYgKGxpYnJhcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlNYXAgcmVzdWx0ID0gbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5wdXQoZGVmYXVsdENvbnRleHQuZ2V0TmFtZSgpLCBkZWZhdWx0Q29udGV4dCk7Ci0JCX0KLQotCQlMaXN0IGNvbnRleHRzID0gcHJvY2Vzcy5nZXRWYWxpZENvbnRleHQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY29udGV4dHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb250ZXh0ID0gKE1ldGhvZENvbmZpZ3VyYXRpb24paS5uZXh0KCk7Ci0JCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LnB1dChjb250ZXh0LmdldE5hbWUoKSwgY29udGV4dCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFkZCBhIG1hcCBvZiBhbGwgPGNvZGU+Q2FwYWJpbGl0eVBhdHRlcm48L2NvZGU+IGluIGEgZ2l2ZW4gPGNvZGU+UHJvY2Vzc1BhY2thZ2U8L2NvZGU+LgotCSAqCi0JICogVE9ETzogTW92ZSB0aGlzIG1ldGhvZCB0byB0aGUgY29tLmlibS5ybW0ubGlicmFyeS5zZXJ2aWNlcy5MaWJyYXJ5VXRpbCBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKFByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlLCBNYXAgcmVzdWx0KSB7Ci0JCUxpc3QgY2hpbGRQYWNrYWdlcyA9IHByb2Nlc3NQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KW9iajsKLQkJCQlQcm9jZXNzIHByb2Nlc3MgID0gcHJvY2Vzc0NvbXBvbmVudC5nZXRQcm9jZXNzKCk7Ci0JCQkJaWYgKHByb2Nlc3MgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybikgewotCQkJCQlTdHJpbmcgbmFtZSA9IHByb2Nlc3MuZ2V0TmFtZSgpOwotCQkJCQlyZXN1bHQucHV0KG5hbWUsIHByb2Nlc3MpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQkJZ2V0Q2FwYWJpbGl0eVBhdHRlcm5zKChQcm9jZXNzUGFja2FnZSlvYmosIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBtYXAgb2YgYWxsIDxjb2RlPkRlbGl2ZXJ5UHJvY2VzczwvY29kZT4gaW4gYSBnaXZlbiA8Y29kZT5Qcm9jZXNzUGFja2FnZTwvY29kZT4uCi0JICoKLQkgKiBUT0RPOiBNb3ZlIHRoaXMgbWV0aG9kIHRvIHRoZSBjb20uaWJtLnJtbS5saWJyYXJ5LnNlcnZpY2VzLkxpYnJhcnlVdGlsIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBnZXREZWxpdmVyeVByb2Nlc3NlcyhQcm9jZXNzUGFja2FnZSBwcm9jZXNzUGFja2FnZSwgTWFwIHJlc3VsdCkgewotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBwcm9jZXNzUGFja2FnZS5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGNoaWxkUGFja2FnZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudClvYmo7Ci0JCQkJUHJvY2VzcyBwcm9jZXNzICA9IHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCWlmIChwcm9jZXNzIGluc3RhbmNlb2YgRGVsaXZlcnlQcm9jZXNzKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gcHJvY2Vzcy5nZXROYW1lKCk7Ci0JCQkJCXJlc3VsdC5wdXQobmFtZSwgcHJvY2Vzcyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NlcygoUHJvY2Vzc1BhY2thZ2Upb2JqLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWFwIGdldEFjdGl2aXRpZXMoUHJvY2VzcyBwcm9jZXNzKXsKLQkJcmV0dXJuIGdldEFjdGl2aXRpZXMocHJvY2VzcywgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRBY3Rpdml0aWVzKFByb2Nlc3MgcHJvY2VzcywgYm9vbGVhbiBsaW5rZWRIYXNoTWFwKXsKLQkJTWFwIHJlc3VsdCA9IGxpbmtlZEhhc2hNYXAgPyBuZXcgTGlua2VkSGFzaE1hcCgpIDogbmV3IFRyZWVNYXAoKTsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBkZWZhdWx0Q29udGV4dCA9IHByb2Nlc3MuZ2V0RGVmYXVsdENvbnRleHQoKTsKLQkJUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIgPSBuZXcgUHJvY2Vzc0NvbmZpZ3VyYXRvcihkZWZhdWx0Q29udGV4dCk7Ci0JCWdldEFjdGl2aXRpZXMocHJvY2VzcywgcmVzdWx0LCBmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNZXRob2QgcmV0dXJucyBMaXN0IG9mIGFjdGl2aXRpZXMgKHJlY3Vyc2l2ZWx5KSBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9uIAotCSAqIHVuZGVyIGEgUHJvY2VzcyAoPGNvZGU+RGVsaXZlcnlQcm9jZXNzPC9jb2RlPiBvciA8Y29kZT5DYXBhYmlsaXR5UGF0dGVybjwvY29kZT4pLiAgCi0JICogIEBwYXJhbSBBY3Rpdml0eQotCSAqICBAcGFyYW0gTWFwCi0JICogIEBwYXJhbSBQcm9jZXNzQ29uZmlndXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGdldEFjdGl2aXRpZXMoQWN0aXZpdHkgcHJvY2VzcywgTWFwIHJlc3VsdCwgUHJvY2Vzc0NvbmZpZ3VyYXRvciBmaWx0ZXIpewotCQlyZXN1bHQucHV0KHByb2Nlc3MuZ2V0TmFtZSgpLCBwcm9jZXNzKTsKLQkJTGlzdCBsaXN0ID0gcHJvY2Vzcy5nZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQlpZihsaXN0LnNpemUoKSA+IDApewotCQkJZm9yKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KXsKLQkJCQlPYmplY3Qgb2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKG9iamVjdCBpbnN0YW5jZW9mIEFjdGl2aXR5KXsKLQkJCQkJaWYoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLmFjY2VwdChvYmplY3QpKXsKLQkJCQkJCXJlc3VsdC5wdXQoKChBY3Rpdml0eSlvYmplY3QpLmdldE5hbWUoKSwgb2JqZWN0KTsKLQkJCQkJfQotCQkJCQlpZihvYmplY3QgaW5zdGFuY2VvZiBBY3Rpdml0eSl7Ci0JCQkJCQlnZXRBY3Rpdml0aWVzKChBY3Rpdml0eSlvYmplY3QsIHJlc3VsdCwgZmlsdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzlmNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFjYzAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LAotIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gY29tLmlibS5pY3UKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5NGVmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBtb2RlbC8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L21vZGVsL01TX1Byb2plY3RfMjAwMy5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQ2ZjJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QiIG1vZGVsTmFtZT0iTVNfUHJvamVjdF8yMDAzIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS54c2QuZWNvcmUuaW1wb3J0ZXIiPgotICA8Zm9yZWlnbk1vZGVsPmZpbGU6L0M6L0VjbGlwc2UzMTEvTVNfUHJvamVjdF8yMDAzLnhzZDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJNc3Byb2plY3QiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIHJlc291cmNlPSJYTUwiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBsb2FkSW5pdGlhbGl6YXRpb249InRydWUiIGVjb3JlUGFja2FnZT0ibXNwcm9qZWN0LmVjb3JlIy8iPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQWNjcnVlQXQiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0FjdGl2ZURpcmVjdG9yeUdVSURUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9BbGlhc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0F1dGhvclR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Cb29raW5nVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0Jvb2tpbmdUeXBlVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NhbGN1bGF0aW9uVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NhdGVnb3J5VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ29kZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbXBhbnlUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db25zdHJhaW50VHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0NvbnRhY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Db3N0UmF0ZVRhYmxlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0N1cnJlbmN5U3ltYm9sVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGF5VHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0RlZmF1bHRUYXNrVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0R1cmF0aW9uRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlMyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlNCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRHVyYXRpb25Gb3JtYXRUeXBlNSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FbWFpbEFkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vRml4ZWRDb3N0QWNjcnVhbFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0ZZU3RhcnREYXRlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vR3JvdXBUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUxIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1N1YkFkZHJlc3NUeXBlMiIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vSHlwZXJsaW5rVHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0h5cGVybGlua1R5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Jbml0aWFsc1R5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xhZ0Zvcm1hdFR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL01hbmFnZXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9NYXRlcmlhbExhYmVsVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05hbWVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vTmFtZVR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OYW1lVHlwZTMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL05ld1Rhc2tTdGFydERhdGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9OVEFjY291bnRUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lTnVtYmVyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1Bob25ldGljQWxpYXNUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9QaG9uZXRpY3NUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9QcmVmaXhUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9SYXRlVGFibGVUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Sb2xsdXBUeXBlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1N1YmplY3RUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9TdWJwcm9qZWN0TmFtZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1RpdGxlVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlMSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGUyIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9UeXBlVHlwZTMiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9Im1zcHJvamVjdC5lY29yZSMvL1R5cGVUeXBlNCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVHlwZVR5cGU1Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9VSURUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Vbml0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVsaXN0U29ydE9yZGVyVHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV2Vla1N0YXJ0RGF5VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya0NvbnRvdXJUeXBlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JrRm9ybWF0VHlwZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya0dyb3VwVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC90YXNrVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXNvdXJjZVVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYWN0dWFsU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2FDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NvbmZpcm1lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdFJhdGVUYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvY29zdFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9jViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZGVsYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZmluaXNoVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2h5cGVybGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29ya1ZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9oYXNGaXhlZFJhdGVVbml0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvZml4ZWRNYXRlcmlhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGV2ZWxpbmdEZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvbGlua2VkRmllbGRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9taWxlc3RvbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L25vdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9vdmVyYWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9vdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L292ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVndWxhcldvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ0Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3JlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvcmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXNwb25zZVBlbmRpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9zdG9wIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9yZXN1bWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3N0YXJ0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3VuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC91cGRhdGVOZWVkZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L3ZBQyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvd29ya0NvbnRvdXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2JDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2Jvb2tpbmdUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2NyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50L2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnQvYmFzZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXNzaWdubWVudC90aW1lcGhhc2VkRGF0YSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Bc3NpZ25tZW50cyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0Fzc2lnbm1lbnRzL2Fzc2lnbm1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2QvYXZhaWxhYmxlRnJvbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0F2YWlsYWJpbGl0eVBlcmlvZC9hdmFpbGFibGVVbml0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9BdmFpbGFiaWxpdHlQZXJpb2RzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQXZhaWxhYmlsaXR5UGVyaW9kcy9hdmFpbGFiaWxpdHlQZXJpb2QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS90aW1lcGhhc2VkRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL251bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2ludGVyaW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2ZpbmlzaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2R1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9lc3RpbWF0ZWREdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZS9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUvYkNXUyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lL2JDV1AiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvbnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTIvY29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMi9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUyL2JDV1AiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL3RpbWVwaGFzZWREYXRhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL251bWJlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvd29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0Jhc2VsaW5lMy9jb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQmFzZWxpbmUzL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9CYXNlbGluZTMvYkNXUCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9DYWxlbmRhciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL2lzQmFzZUNhbGVuZGFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vQ2FsZW5kYXIvYmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFyL3dlZWtEYXlzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFycyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0NhbGVuZGFycy9jYWxlbmRhciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QvbWl4ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vRG9jdW1lbnRSb290L3hNTE5TUHJlZml4TWFwIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0RvY3VtZW50Um9vdC94U0lTY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Eb2N1bWVudFJvb3QvcHJvamVjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2ZpZWxkTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL2FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcGhvbmV0aWNBbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3JvbGx1cFR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9jYWxjdWxhdGlvblR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9mb3JtdWxhIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUvcmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS92YWx1ZWxpc3RTb3J0T3JkZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9hcHBlbmROZXdWYWx1ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZS9kZWZhdWx0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlL3ZhbHVlTGlzdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi91SUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTIvZmllbGRJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMi92YWx1ZUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyL2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlMy9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGUzL3ZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTMvZHVyYXRpb25Gb3JtYXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0L2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZTQvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL0V4dGVuZGVkQXR0cmlidXRlNC9kdXJhdGlvbkZvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9FeHRlbmRlZEF0dHJpYnV0ZXMvZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vTWFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9sZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL01hc2svbGVuZ3RoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vTWFzay9zZXBhcmF0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vTWFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9NYXNrcy9tYXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvZmllbGROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvYWxpYXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9waG9uZXRpY0FsaWFzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3ZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2VudGVycHJpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9lbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL3Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL2xlYWZPbmx5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUvYWxsTGV2ZWxzUmVxdWlyZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZS9vbmx5VGFibGVWYWx1ZXNBbGxvd2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlL21hc2tzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL091dGxpbmVDb2RlMi9maWVsZElEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUyL3ZhbHVlSUQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vT3V0bGluZUNvZGUzL2ZpZWxkSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZTMvdmFsdWVJRCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9PdXRsaW5lQ29kZXMvb3V0bGluZUNvZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvcHJlZGVjZXNzb3JVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9jcm9zc1Byb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9QcmVkZWNlc3NvckxpbmsvY3Jvc3NQcm9qZWN0TmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ByZWRlY2Vzc29yTGluay9saW5rTGFnIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJlZGVjZXNzb3JMaW5rL2xhZ0Zvcm1hdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvdGl0bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N1YmplY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NhdGVnb3J5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jb21wYW55Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tYW5hZ2VyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRob3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NyZWF0aW9uRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcmV2aXNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2xhc3RTYXZlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc2NoZWR1bGVGcm9tU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZllTdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2NyaXRpY2FsU2xhY2tMaW1pdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvY3VycmVuY3lEaWdpdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbmN5U3ltYm9sIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jdXJyZW5jeVN5bWJvbFBvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jYWxlbmRhclVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdEZpbmlzaFRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pbnV0ZXNQZXJEYXkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21pbnV0ZXNQZXJXZWVrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9kYXlzUGVyTW9udGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRUYXNrVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRTdGFuZGFyZFJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2RlZmF1bHRPdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2R1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC93b3JrRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9lZGl0YWJsZUFjdHVhbENvc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9ob25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9lYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tdWx0aXBsZUNyaXRpY2FsUGF0aHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L25ld1Rhc2tzRWZmb3J0RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9uZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9zcHJlYWRQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Rhc2tVcGRhdGVzUmVzb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Zpc2NhbFllYXJTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvd2Vla1N0YXJ0RGF5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlQ29tcGxldGVkRW5kc0JhY2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L21vdmVSZW1haW5pbmdTdGFydHNCYWNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9tb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9iYXNlbGluZUZvckVhcm5lZFZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3N0YXR1c0RhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2N1cnJlbnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9taWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hdXRvbGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvbmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvZGVmYXVsdFRhc2tFVk1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2V4dGVuZGVkQ3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9hY3R1YWxzSW5TeW5jIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9yZW1vdmVGaWxlUHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3QvYWRtaW5Qcm9qZWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvb3V0bGluZUNvZGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Byb2plY3Qvd0JTTWFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9leHRlbmRlZEF0dHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC9jYWxlbmRhcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUHJvamVjdC90YXNrcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L3Jlc291cmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9Qcm9qZWN0L2Fzc2lnbm1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1JhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvcmF0ZXNGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlc1RvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9yYXRlVGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL3N0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvc3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmF0ZS9vdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SYXRlL292ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1JhdGUvY29zdFBlclVzZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9SYXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1JhdGVzL3JhdGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc051bGwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pbml0aWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3Bob25ldGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL25UQWNjb3VudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL21hdGVyaWFsTGFiZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS93b3JrR3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9lbWFpbEFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9oeXBlcmxpbmtBZGRyZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvaHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL21heFVuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGVha1VuaXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvb3ZlckFsbG9jYXRlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJsZUZyb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hdmFpbGFibGVUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY2FuTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY2NydWVBdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZWd1bGFyV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL292ZXJ0aW1lV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbFdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcGVyY2VudFdvcmtDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YW5kYXJkUmF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3N0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZVJhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9vdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb3N0UGVyVXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL3JlbWFpbmluZ0Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9yZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9jb3N0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9zViIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYUNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2NhbGVuZGFyVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2Uvbm90ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9iQ1dTIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvYkNXUCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzR2VuZXJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2lzSW5hY3RpdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9pc0VudGVycHJpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9ib29raW5nVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2FjdHVhbFdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9SZXNvdXJjZS9hY3RpdmVEaXJlY3RvcnlHVUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvY3JlYXRpb25EYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2V4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2Jhc2VsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL291dGxpbmVDb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Jlc291cmNlL2F2YWlsYWJpbGl0eVBlcmlvZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvcmF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2UvdGltZXBoYXNlZERhdGEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2VzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vUmVzb3VyY2VzL3Jlc291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdUlEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9pRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNOdWxsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jcmVhdGVEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb250YWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93QlMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dCU0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdXRsaW5lTnVtYmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdXRsaW5lTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByaW9yaXR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3dvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0b3AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3Jlc3VtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVzdW1lVmFsaWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2VmZm9ydERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVjdXJyaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9vdmVyQWxsb2NhdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lc3RpbWF0ZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL21pbGVzdG9uZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svc3VtbWFyeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY3JpdGljYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lzU3VicHJvamVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svaXNTdWJwcm9qZWN0UmVhZE9ubHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N1YnByb2plY3ROYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9leHRlcm5hbFRhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2V4dGVybmFsVGFza1Byb2plY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcmx5U3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Vhcmx5RmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9sYXRlU3RhcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2xhdGVGaW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3N0YXJ0VmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay93b3JrVmFyaWFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2ZyZWVTbGFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdG90YWxTbGFjayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZml4ZWRDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9maXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wZXJjZW50Q29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2Nvc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL292ZXJ0aW1lQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svb3ZlcnRpbWVXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxTdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxEdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9hY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3JlZ3VsYXJXb3JrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nQ29zdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nV29yayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2FDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NWIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9jb25zdHJhaW50VHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svY2FsZW5kYXJVSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2NvbnN0cmFpbnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9kZWFkbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdDYW5TcGxpdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdEZWxheSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svbGV2ZWxpbmdEZWxheUZvcm1hdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svcHJlTGV2ZWxlZFN0YXJ0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9wcmVMZXZlbGVkRmluaXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oeXBlcmxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2h5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2lnbm9yZVJlc291cmNlQ2FsZW5kYXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL25vdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9oaWRlQmFyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9yb2xsdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2JDV1MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL2JDV1AiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3BoeXNpY2FsUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9lYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL3ByZWRlY2Vzc29yTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svZXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVGFzay9iYXNlbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrL291dGxpbmVDb2RlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1Rhc2svdGltZXBoYXNlZERhdGEiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vVGFza3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBtc3Byb2plY3QuZWNvcmUjLy9UYXNrcy90YXNrIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVQZXJpb2QvZnJvbURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lUGVyaW9kL3RvRGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS90eXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVGltZXBoYXNlZERhdGFUeXBlL3VJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS9zdGFydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS9maW5pc2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9UaW1lcGhhc2VkRGF0YVR5cGUvdW5pdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1RpbWVwaGFzZWREYXRhVHlwZS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUvdmFsdWVJRCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL3BhcmVudFZhbHVlSUQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZS92YWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlMiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL2lEIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWUyL2Rlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1ZhbHVlTGlzdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1ZhbHVlTGlzdC92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9WYWx1ZXMvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vVmFsdWVzL3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dCU01hc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svbGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrL2xlbmd0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2svc2VwYXJhdG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy92ZXJpZnlVbmlxdWVDb2RlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG1zcHJvamVjdC5lY29yZSMvL1dCU01hc2tzL2dlbmVyYXRlQ29kZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XQlNNYXNrcy9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV0JTTWFza3Mvd0JTTWFzayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L2RheVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9XZWVrRGF5L2RheVdvcmtpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheS90aW1lUGVyaW9kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXkvd29ya2luZ1RpbWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im1zcHJvamVjdC5lY29yZSMvL1dlZWtEYXlzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV2Vla0RheXMvd2Vla0RheSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgbXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWUvZnJvbVRpbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBtc3Byb2plY3QuZWNvcmUjLy9Xb3JraW5nVGltZS90b1RpbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ibXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgbXNwcm9qZWN0LmVjb3JlIy8vV29ya2luZ1RpbWVzL3dvcmtpbmdUaW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvbW9kZWwvbXNwcm9qZWN0LmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWJkMjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9tb2RlbC9tc3Byb2plY3QuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im1zcHJvamVjdCIKLSAgICBuc1VSST0iaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiIG5zUHJlZml4PSJtc3Byb2plY3QiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZ1bGwgcHJvamVjdCBzY2hlbWEgZGVmaW5pdGlvbiBmcm9tIHRoZSBwcm9qZWN0IGxldmVsIGRvd24sICYjeEQ7JiN4QTsmI3g5OyYjeDk7c3RhcnRpbmcgd2l0aCBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUFubm90YXRpb25zPgotICAgIDxkZXRhaWxzIGtleT0iYXBwaW5mbyIgdmFsdWU9IlRoZSBNaWNyb3NvZnQgUHJvamVjdCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSBmb3IgTWljcm9zb2Z0IFByb2plY3QgMTAuJiN4RDsmI3hBOyYjeDk7JiN4OTsiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWNjcnVlQXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjdGl2ZURpcmVjdG9yeUdVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMTYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHdvcmsgY29tcGxldGVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGFtb3VudCBvZiB3b3JrIGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmZpcm1lZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbmZpcm1lZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RSYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db3N0UmF0ZVRhYmxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvc3QgYW5kIGJhc2VsaW5lIGNvc3QgZm9yIGEgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGF5IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBmaW5pc2ggZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2hWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiBhc3NpZ25tZW50IHdvcmsgZnJvbSB0aGUgYmFzZWxpbmUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoYXNGaXhlZFJhdGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGFzRml4ZWRSYXRlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZE1hdGVyaWFsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsIDIxPW51bGwsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rZWRGaWVsZHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFByb2plY3QgaXMgbGlua2VkIHRvIGFub3RoZXIgT0xFIG9iamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rZWRGaWVsZHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGFzc2lnbm1lbnQgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyYWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcmFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyB3b3JrIHNjaGVkdWxlZCB0byBjb21wbGV0ZSB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2VQZW5kaW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIGEgcmVzcG9uc2UgaGFzIG5vdCBiZWVuIHJlY2VpdmVkIGZvciBhIFRlYW1Bc3NpZ24gbWVzc2FnZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzcG9uc2VQZW5kaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdG9wIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXRzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB1bml0cyBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1cGRhdGVOZWVkZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVXBkYXRlTmVlZGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idkFDIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVkFDIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrQ29udG91ciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtDb250b3VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGNvbnRvdXIgb2YgdGhlIGFzc2lnbm1lbnQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GbGF0LCAxPUJhY2sgTG9hZGVkLCAyPUZyb250IExvYWRlZCwgMz1Eb3VibGUgUGVhaywgND1FYXJseSBQZWFrLCA1PUxhdGUgUGVhaywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBhc3NpZ25tZW50IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFzc2lnbm1lbnRzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaWdubWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgYXNzaWdubWVudCBpbiBlYWNoIEFzc2lnbm1lbnRzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkF1dGhvclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGJlY29tZXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVVuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGR1cmluZyB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBdmFpbGFiaWxpdHlQZXJpb2RzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZHNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2QiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmlvZCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzayBiYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW50ZXJpbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhpcyBpcyBhbiBJbnRlcmltIEJhc2VsaW5lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnRlcmltIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrIGJhc2VsaW5lLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgMjA9ZSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWREdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCB3b3JrIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBhc3NpZ25lZCB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgaXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBjb3N0IGZvciB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCYXNlbGluZTMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrIHNjaGVkdWxlZCBvbiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3RlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50IHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lRm9yRWFybmVkVmFsdWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2tpbmdUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2FsY3VsYXRpb25UeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Jhc2VDYWxlbmRhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY2FsZW5kYXIgaXMgYSBiYXNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0Jhc2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VDYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHRoaXMgY2FsZW5kYXIgZGVwZW5kcy4gT25seSBhcHBsaWNhYmxlIGlmIHRoZSBjYWxlbmRhciBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBiYXNlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5cyIgZVR5cGU9IiMvL1dlZWtEYXlzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgV2Vla2RheXMgdGhhdCBkZWZpbmVzIHRoaXMgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FsZW5kYXJzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhbGVuZGFyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2FsZW5kYXJzIGFyZSB1c2VkIHRvIGRlZmluZSBzdGFuZGFyZCB3b3JraW5nIGFuZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBub24td29ya2luZyB0aW1lcy4gUHJvamVjdHMgbXVzdCBoYXZlIG9uZSBiYXNlIGNhbGVuZGFyLiBUYXNrcyBhbmQgcmVzb3VyY2VzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIG1heSBoYXZlIHRoZWlyIG93biBub24tYmFzZSBjYWxlbmRhcnMgd2hpY2ggYXJlIGJhc2VkIG9uIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDYXRlZ29yeVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhdGVnb3J5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvZGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbXBhbnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wYW55Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnN0cmFpbnRUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvbnRhY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNvc3RSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkN1cnJlbmN5U3ltYm9sVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXlUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvY3VtZW50Um9vdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Im1peGVkIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1peGVkIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudFdpbGRjYXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IjptaXhlZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4TUxOU1ByZWZpeE1hcCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4bWxuczpwcmVmaXgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieFNJU2NoZW1hTG9jYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieHNpOnNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2plY3QiIHVwcGVyQm91bmQ9Ii0yIgotICAgICAgICBlVHlwZT0iIy8vUHJvamVjdCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRHVyYXRpb25Gb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZTUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVhcm5lZFZhbHVlTWV0aG9kVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRW1haWxBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRW1haWxBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGlhcyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNBbGlhcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljQWxpYXNUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gZmllbGQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xsdXBUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyByb2xsdXBzIGFyZSBjYWxjdWxhdGVkLiBWYWx1ZXMgYXJlOiAwPU1heGltdW0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9SIGZvciBmbGFnIGZpZWxkcyksIDE9TWluaW11bSAoQU5EIGZvciBmbGFnIGZpZWxkcyksIDI9Q291bnQgYWxsLCAzPVN1bSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uc3VtbWFyaWVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxjdWxhdGlvblR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DYWxjdWxhdGlvblR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Tm9uZSwgMT1Sb2xsdXAsIDI9Q2FsY3VsYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsY3VsYXRpb25UeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZm9ybXVsYSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybXVsYSB0aGF0IE1pY3Jvc29mdCBQcm9qZWN0IHVzZXMgdG8gcG9wdWxhdGUgdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGb3JtdWxhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdHJpY3RWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBpbiB0aGUgZmlsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN0cmljdFZhbHVlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlbGlzdFNvcnRPcmRlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlbGlzdFNvcnRPcmRlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1EZXNjZW5kaW5nLCAxPUFzY2VuZGluZyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhcHBlbmROZXdWYWx1ZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIEFwcGVuZE5ld1ZhbHVlcz1UcnVlIHRoZW4gYW55IG5ldyB2YWx1ZXMgYWRkZWQgaW4gYSBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBlbmROZXdWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgcG9pbnRzIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBsaXN0LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgcHJlc2VudCBpZiBubyBkZWZhdWx0IGlzIHNldC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlTGlzdCIgZVR5cGU9IiMvL1ZhbHVlTGlzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIG9mIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEsIHRoZXkgbWF5IGVpdGhlciBiZSBzcGVjaWZpZWQgYnkgdmFsdWVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJ5IHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LiAgQXBwbGljYXRpb25zIG1heSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dCBsb29rdXAgdGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi4gIFRoZXJlIGFyZSBubyBsaW1pdHMgdG8gdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IG1heSBhcHBlYXIsIGJ1dCBwcm9qZWN0ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIHdpbGwgb25seSB1bmRlcnN0YW5kIEZsYWcxLUZsYWcxMCwgZXRjLiAgVGhpcyBtdXN0IGFwcGVhciBvbmNlIGluIGVhY2ggRXh0ZW5kZWRBdHRyaWJ1dGVzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRml4ZWRDb3N0QWNjcnVhbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZZU3RhcnREYXRlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZZU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iR3JvdXBUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua0FkZHJlc3NUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbml0aWFsc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxhZ0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hbmFnZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlNSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIG1hc2suIFZhbHVlcyBhcmU6IDA9TnVtYmVycywgMT1VcHBlciBDYXNlIExldHRlcnMsIDI9TG93ZXIgQ2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZXMuICBJZiBsZW5ndGggaXMgYW55LCB0aGUgdmFsdWUgaXMgemVyby4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgdmFsdWUgb2YgdGhlIGNvZGUgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2siIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWFzayIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3VyIGVsZW1lbnRzIG9mIHRoZSBtYXNrIGNvbnN0aXR1dGUgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgb3V0bGluZSBjb2RlIG11c3QgYXBwZWFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTWF0ZXJpYWxMYWJlbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hdGVyaWFsTGFiZWxfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIyNTUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmV3VGFza1N0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5UQWNjb3VudFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRsaW5lQ29kZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29yZXNwb25kcyB0byB0aGUgZmllbGQgbnVtYmVyIG9mIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkTmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVzIiBlVHlwZT0iIy8vVmFsdWVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlcyBvZiB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgd2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBpcyBhbiBlbnRlcnByaXNlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW5vdGhlciBjdXN0b20gZmllbGQgZm9yIHdoaWNoIHRoaXMgaXMgYW4gYWxpYXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZWFmT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGlzIG91dGxpbmUgY29kZSBmaWVsZCBtdXN0IGJlIGxlYWYgdmFsdWVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZWFmT25seSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsbExldmVsc1JlcXVpcmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJOZXcgY29kZXMgbXVzdCBoYXZlIGFsbCBsZXZlbHMgcHJlc2VudC4gIE5vdCBhdmFpbGFibGUgZm9yIEVudGVycHJpc2UgQ29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsbExldmVsc1JlcXVpcmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib25seVRhYmxlVmFsdWVzQWxsb3dlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB2YWx1ZXMgc3BlY2lmaWVkIG11c3QgY29tZSBmcm9tIHZhbHVlcyB0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT25seVRhYmxlVmFsdWVzQWxsb3dlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hc2tzIiBlVHlwZT0iIy8vTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gaW4gdGhlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBpbiB0aGUgdmFsdWUgbGlzdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRlZmluaXRpb24gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2Rlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGluZGl2aWR1YWwgb3V0bGluZSBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdXRsaW5lTnVtYmVyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJPdmVydGltZVJhdGVGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNBbGlhc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQaG9uZXRpY3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlZGVjZXNzb3JMaW5rIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGlua18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWRlY2Vzc29yVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByZWRlY2Vzc29yIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsaW5rIHR5cGUuICBWYWx1ZXMgYXJlIDA9RkYsIDE9RlMsIDI9U0YgYW5kIDM9U1MmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJlZGVjZXNzb3IgaXMgcGFydCBvZiBhbm90aGVyIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyb3NzUHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGV4dGVybmFsIHByZWRlY2Vzc29yIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyb3NzUHJvamVjdE5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rTGFnIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGxhZyBpbiB0ZW50aHMgb2YgYSBtaW51dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxpbmtMYWciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYWdGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MYWdGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgbGFnIGZvcm1hdC4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhZ0Zvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlByZWZpeFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUwIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2plY3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1VJRFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vTmFtZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0aXRsZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1RpdGxlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJqZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3ViamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGVnb3J5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2F0ZWdvcnlUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNhdGVnb3J5IG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbXBhbnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db21wYW55VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hbmFnZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYW5hZ2VyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYW5hZ2VyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQXV0aG9yVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhdXRob3Igb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dGhvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldmlzaW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIHRpbWVzIGEgcHJvamVjdCBoYXMgYmVlbiBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV2aXNpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXN0U2F2ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXN0U2F2ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlZHVsZUZyb21TdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2NoZWR1bGVGcm9tU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcHJvamVjdC4gUmVxdWlyZWQgaWYgU2NoZWR1bGVGcm9tU3RhcnQgaXMgdHJ1ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZZU3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRllTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRmlzY2FsIFllYXIgc3RhcnRpbmcgbW9udGguIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPUphbnVhcnksIDI9RmVicnVhcnksIDM9TWFyY2gsIDQ9QXByaWwsIDU9TWF5LCA2PUp1bmUsIDc9SnVseSwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5Ozg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyaXRpY2FsU2xhY2tMaW1pdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIE1pY3Jvc29mdCBQcm9qZWN0IG1hcmtzIHRoYXQgdGFzayBhcyBhIGNyaXRpY2FsIHRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsU2xhY2tMaW1pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5RGlnaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5RGlnaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2wiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY3VycmVuY3kgc3ltYm9sIHVzZWQgaW4gdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVuY3lTeW1ib2xQb3NpdGlvbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0N1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW5jeSBzeW1ib2wuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1CZWZvcmUsIDE9QWZ0ZXIsIDI9QmVmb3JlIFdpdGggU3BhY2UsIDM9QWZ0ZXIgd2l0aCBzcGFjZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBjYWxlbmRhci4gIFJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O0NhbGVuZGFycyBlbGVtZW50IG9mIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFydFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHN0YXJ0IHRpbWUgb2YgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhcnRUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdEZpbmlzaFRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZpbmlzaCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpbmlzaFRpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyRGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIGRheS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWludXRlc1BlckRheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbnV0ZXNQZXJXZWVrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIG1pbnV0ZXMgcGVyIHdlZWsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJXZWVrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5c1Blck1vbnRoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbnVtYmVyIG9mIGRheXMgcGVyIG1vbnRoLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlzUGVyTW9udGgiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VGFza1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza1R5cGVUeXBlIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIxIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgdHlwZSBvZiBuZXcgdGFza3MuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaXhlZENvc3RBY2NydWFsIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsxPVN0YXJ0LCAyPVByb3JhdGVkLCAzPUVuZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRTdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFuZGFyZCByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0U3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdE92ZXJ0aW1lUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IG92ZXJ0aW1lIHJhdGUgZm9yIG5ldyByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7NTM9bnVsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0Zvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCB3b3JrIHVuaXQgZm9ybWF0LiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZGl0YWJsZUFjdHVhbENvc3RzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBvciBub3QgYWN0dWFsIGNvc3RzIGFyZSBlZGl0YWJsZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWRpdGFibGVBY3R1YWxDb3N0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvbm9yQ29uc3RyYWludHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGFza3MgaG9ub3VyIHRoZWlyIGNvbnN0cmFpbnQgZGF0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhvbm9yQ29uc3RyYWludHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcm5lZFZhbHVlTWV0aG9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGNhbGN1bGF0ZSBzdWJ0YXNrcyBhcyBzdW1tYXJ5IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtdWx0aXBsZUNyaXRpY2FsUGF0aHMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIG11bHRpcGxlIGNyaXRpY2FsIHBhdGhzIGFyZSBjYWxjdWxhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNdWx0aXBsZUNyaXRpY2FsUGF0aHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuZXdUYXNrc0VmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBuZXcgdGFza3MgYXJlIGVmZm9ydCBkcml2ZW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRWZmb3J0RHJpdmVuIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gc2hvdyB0aGUgZXN0aW1hdGVkIGR1cmF0aW9uIGJ5IGRlZmF1bHQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5ld1Rhc2tzRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGluLXByb2dyZXNzIHRhc2tzIGNhbiBiZSBzcGxpdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkQWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBhY3R1YWwgY29zdHMgYXJlIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZEFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzcHJlYWRQZXJjZW50Q29tcGxldGUiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ByZWFkUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFza1VwZGF0ZXNSZXNvdXJjZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB1cGRhdGVzIHRvIHRhc2tzIHVwZGF0ZSByZXNvdXJjZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tVcGRhdGVzUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXNjYWxZZWFyU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBmaXNjYWwgeWVhciBudW1iZXJpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmlzY2FsWWVhclN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id2Vla1N0YXJ0RGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV2Vla1N0YXJ0RGF5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN0YXJ0IGRheSBvZiB0aGUgd2Vlay4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla1N0YXJ0RGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNCYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgYmVnaW5uaW5nIG9mIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O3N0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gaGF2ZSBiZWVuIGNvbXBsZXRlZCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtiZWZvcmUgdGhlIHN0YXR1cyBkYXRlIGJ1dCBiZWd1biBsYXRlIHNob3VsZCBiZSBtb3ZlZCB1cCB0byB0aGUgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlbGluZUZvckVhcm5lZFZhbHVlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3BlY2lmaWMgYmFzZWxpbmUgdXNlZCB0byBjYWxjdWxhdGUgVmFyaWFuY2UgdmFsdWVzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs3PUJhc2VsaW5lIDcsIDg9QmFzZWxpbmUgOCwgOT1CYXNlbGluZSA5LCAxMD1CYXNlbGluZSAxMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXR1c0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRlIHVzZWQgZm9yIGNhbGN1bGF0aW9uIGFuZCByZXBvcnRpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXR1c0RhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW50RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzeXN0ZW0gZGF0ZSB0aGF0IHRoZSBYTUwgd2FzIGdlbmVyYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3VycmVudERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0b2xpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF1dG9saW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza1N0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL05ld1Rhc2tTdGFydERhdGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UHJvamVjdCBTdGFydCBEYXRlLCAxPUN1cnJlbnQgRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrU3RhcnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tFVk1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RlZmF1bHRUYXNrRVZNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZWFybmVkIHZhbHVlIG1ldGhvZCBmb3IgdGFza3MuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFRhc2tFVk1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RFeHRlcm5hbGx5RWRpdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVuZGVkQ3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZENyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbHNJblN5bmMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWxsIGFjdHVhbCB3b3JrIGhhcyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxzSW5TeW5jIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtb3ZlRmlsZVByb3BlcnRpZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdG8gcmVtb3ZlIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gc2F2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtb3ZlRmlsZVByb3BlcnRpZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZG1pblByb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRtaW5Qcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0bGluZUNvZGVzIiBlVHlwZT0iIy8vT3V0bGluZUNvZGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2Ygb3V0bGluZSBjb2RlIGRlZmluaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4gIFRoZXNlIGNvZGVzIG1heSBiZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCB0aGlzIHByb2plY3QsIG9yIG1heSBiZSBjb21tb24gYW1vbmcgc2V2ZXJhbCBwcm9qZWN0cyAoZW50ZXJwcmlzZSBjb2RlcykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2tzIiBlVHlwZT0iIy8vV0JTTWFza3MiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFibGUgb2YgZW50cmllcyB0aGF0IGRlZmluZSB0aGUgb3V0bGluZSBjb2RlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2tzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGVzIiBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGVzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgZXh0ZW5kZWQgYXR0cmlidXRlIChjdXN0b20gZmllbGQpIGRlZmluaXRpb25zICYjeEQ7JiN4QTsgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FsZW5kYXJzIiBlVHlwZT0iIy8vQ2FsZW5kYXJzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgY2FsZW5kYXJzIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAmI3hEOyYjeEE7ICAgICAgICBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgZVR5cGU9IiMvL1Rhc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgdGFza3MgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlcyIgZVR5cGU9IiMvL1Jlc291cmNlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnRzIiBlVHlwZT0iIy8vQXNzaWdubWVudHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuJiN4RDsmI3hBOyAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc0Zyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByYXRlIGJlY29tZXMgZWZmZWN0aXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlc0Zyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlc1RvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhdGVUYWJsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1JhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJhdGUgdGFibGUgZm9yIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIGZvciB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwZXJpb2Qgc3BlY2lmaWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGVGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdmVydGltZVJhdGVGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYXRlIiB1cHBlckJvdW5kPSIyNSIgZVR5cGU9IiMvL1JhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiBhIHRpbWUgcGVyaW9kLCBhbmQgdGhlIHJhdGVzIGFwcGxpY2FibGUgZm9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkdXJpbmcgdGhhdCBwZXJpb2QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSYXRlVGFibGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZVRhYmxlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgbGlzdCBvZiByZXNvdXJjZXMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiByZXNvdXJjZS4gVmFsdWVzIGFyZTogMD1NYXRlcmlhbCwgMT1Xb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc051bGwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFscyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0luaXRpYWxzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbml0aWFscyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluaXRpYWxzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGhvbmV0aWNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUGhvbmV0aWNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBzcGVsbGluZyBvZiB0aGUgcmVzb3VyY2UgbmFtZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1c2Ugd2l0aCBKYXBhbmVzZSBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuVEFjY291bnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OVEFjY291bnRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTlRBY2NvdW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF0ZXJpYWxMYWJlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL01hdGVyaWFsTGFiZWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXQgb2YgbWVhc3VyZSBmb3IgdGhlIG1hdGVyaWFsIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29kZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0NvZGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvZGUgb3Igb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Hcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0dyb3VwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya0dyb3VwVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1EZWZhdWx0LCAxPU5vbmUsIDI9RW1haWwsIDM9V2ViJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVtYWlsQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0VtYWlsQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rQWRkcmVzcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua0FkZHJlc3NUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXhVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMS4wIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF4VW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZWFrVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZWFrVW5pdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXZhaWxhYmxlRnJvbSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaXJzdCBkYXRlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlRnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZVRvIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhc3QgZGF0ZSB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFibGVUbyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FuTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHJlc291cmNlIGNhbiBiZSBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYW5MZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjY3J1ZUF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQWNjcnVlQXQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHJlc291cmNlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAxPVN0YXJ0LCAyPUVuZCwgMz1Qcm9yYXRlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY2NydWVBdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZ3VsYXJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHJlbWFpbmluZyB3b3JrIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHdvcmsgY29tcGxldGVkIGFjcm9zcyBhbGwgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFuZGFyZFJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFuZGFyZCByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXksIDg9bWF0ZXJpYWwgcmVzb3VyY2UgcmF0ZSAob3IgYmxhbmsgc3ltYm9sIHNwZWNpZmllZCkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHByb2plY3QgY29zdCBmb3IgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdmVydGltZSByYXRlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBvdmVydGltZSByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFBlclVzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvc3QgcGVyIHVzZSBvZiB0aGUgcmVzb3VyY2UuIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RQZXJVc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBieSB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIHRoZSByZXNvdXJjZSB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGJhc2VsaW5lIHdvcmsgYW5kIHRoZSB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSBjb3N0IGFuZCB0aGUgY29zdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNHZW5lcmljIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNHZW5lcmljIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmFjdGl2ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNJbmFjdGl2ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGFuIEVudGVycHJpc2UgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzRW50ZXJwcmlzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvb2tpbmdUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQm9va2luZ1R5cGVUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZlRGlyZWN0b3J5R1VJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjdGl2ZURpcmVjdG9yeUdVSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIEFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3RpdmVEaXJlY3RvcnlHVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0aW9uRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYmFzZWxpbmUgdmFsdWVzIGZvciB0aGUgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIGEgcG9pbnRlciBiYWNrIHRvICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdmFpbGFiaWxpdHlQZXJpb2RzIiBlVHlwZT0iIy8vQXZhaWxhYmlsaXR5UGVyaW9kcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGR1cmluZyB3aGljaCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZXMiIGVUeXBlPSIjLy9SYXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29sbGVjdGlvbiBvZiBwZXJpb2RzIGFuZCB0aGUgcmF0ZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVzb3VyY2VzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc291cmNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1Jlc291cmNlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgcmVzb3VyY2UgaW4gZWFjaCBSZXNvdXJjZXMgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJSb2xsdXBUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cFR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDciLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3ViamVjdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU3VicHJvamVjdE5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgdGFzayB3aXRoaW4gdGhlIGxpc3Qgb2YgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1R5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFzayBpcyBudWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc051bGwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGVEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgY3JlYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRlRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnRhY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db250YWN0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb250YWN0IHBlcnNvbiBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRhY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSBjb2RlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3QlNMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmlnaHRtb3N0IFdCUyBsZXZlbCBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU0xldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZU51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVOdW1iZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbnVtYmVyIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lTnVtYmVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0bGluZUxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJpb3JpdHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBmcm9tIDAgdG8gMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJpb3JpdHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwbGFubmVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlNCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIER1cmF0aW9uIG9mIHRoZSBUYXNrLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBzY2hlZHVsZWQgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdG9wIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgdGFzayB3YXMgc3RvcHBlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdW1lVmFsaWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgY2FuIGJlIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZVZhbGlkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWZmb3J0RHJpdmVuIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVmZm9ydC1kcml2ZW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlY3VycmluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhIHJlY3VycmluZyB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWN1cnJpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVyQWxsb2NhdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIG92ZXJhbGxvY2F0ZWQuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJBbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgZXN0aW1hdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaWxlc3RvbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBtaWxlc3RvbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1bW1hcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSBzdW1tYXJ5IHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1bW1hcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBpbiB0aGUgY3JpdGljYWwgY2hhaW4uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyaXRpY2FsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTdWJwcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGFuIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdFJlYWRPbmx5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBpbnNlcnRlZCBwcm9qZWN0IGlzIHJlYWQtb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNTdWJwcm9qZWN0UmVhZE9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJwcm9qZWN0TmFtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YnByb2plY3ROYW1lVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGluc2VydGVkIHByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YnByb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGV4dGVybmFsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbFRhc2tQcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIGFuZCB0YXNrIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsVGFza1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVhcmx5IHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5U3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJseUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybHlGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGF0ZSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsYXRlRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxhdGVGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgc3RhcnQgZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YXJpYW5jZSBvZiB0aGUgdGFzayBmaW5pc2ggZGF0ZSBmcm9tICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGFzayB3b3JrIGZyb20gdGhlIGJhc2VsaW5lICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJlZVNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGZyZWUgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyZWVTbGFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvdGFsU2xhY2siIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdG90YWwgc2xhY2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvdGFsU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaXhlZENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZml4ZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRml4ZWRDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0QWNjcnVhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZpeGVkQ29zdEFjY3J1YWxUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHRoZSBmaXhlZCBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1Qcm9yYXRlZCBhbmQgMz1FbmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50Q29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIGR1cmF0aW9uIGNvbXBsZXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyY2VudENvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHRhc2sgd29yayBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRXb3JrQ29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB3b3JrIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZ3VsYXJXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0R1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB0aW1lIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSB1bmZpbmlzaGVkIHBvcnRpb24gb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ0R1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgY29zdCBvZiBjb21wbGV0aW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZUNvc3QiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBwcm9qZWN0ZWQgdG8gZmluaXNoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdPdmVydGltZVdvcmsiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY1YiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25zdHJhaW50VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnRUeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb25zdHJhaW50IG9uIHRoZSBzdGFydCBvciBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BcyBTb29uIEFzIFBvc3NpYmxlLCAxPUFzIExhdGUgQXMgUG9zc2libGUsIDI9TXVzdCBTdGFydCBPbiwgMz1NdXN0IEZpbmlzaCBPbiwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1TdGFydCBObyBFYXJsaWVyIFRoYW4sIDU9U3RhcnQgTm8gTGF0ZXIgVGhhbiwgNj1GaW5pc2ggTm8gRWFybGllciBUaGFuIGFuZCA3PUZpbmlzaCBObyBMYXRlciBUaGFuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnRUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0YXNrIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSBhcmd1bWVudCBmb3IgdGhlIHRhc2sgY29uc3RyYWludCB0eXBlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlYWRsaW5lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlYWRsaW5lIGZvciB0aGUgdGFzayB0byBiZSBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlYWRsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxBc3NpZ25tZW50cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gYWRqdXN0IGFzc2lnbm1lbnRzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbEFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdDYW5TcGxpdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBsZXZlbGluZyBjYW4gc3BsaXQgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nQ2FuU3BsaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0xldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayBiZWZvcmUgaXQgd2FzIGxldmVsZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZUxldmVsZWRTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZUxldmVsZWRGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaHlwZXJsaW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rQWRkcmVzcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua1N1YkFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpZ25vcmVSZXNvdXJjZUNhbGVuZGFyIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlnbm9yZXMgdGhlIHJlc291cmNlIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm90ZXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGV4dCBub3RlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGlkZUJhciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgR0FOVFQgYmFyIG9mIHRoZSB0YXNrIGlzIGhpZGRlbiB3aGVuIGRpc3BsYXllZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSGlkZUJhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGx1cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyByb2xsZWQgdXAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGx1cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBoeXNpY2FsUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBjb21wbGV0ZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSBQcm9qZWN0IE1hbmFnZXIuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciBjYWxjdWxhdGluZyBCQ1dQLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVhcm5lZFZhbHVlTWV0aG9kIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRWFybmVkVmFsdWVNZXRob2RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yTGluayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVkZWNlc3NvckxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBwcmVkZWNlc3NvciB0YXNrIG9mIHRoZSB0YXNrIHRoYXQgY29udGFpbnMgaXQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWRlY2Vzc29yTGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmtQcm90ZWN0ZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGR1cmF0aW9uIHRocm91Z2ggd2hpY2ggYWN0dWFsIHdvcmsgaXMgcHJvdGVjdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYmFzZWxpbmUgdmFsdWVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL091dGxpbmVDb2RlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSB0YXNrIGluIGVhY2ggVGFza3MgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVQZXJpb2QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyb21EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgZXhjZXB0aW9uIHRpbWUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGltZXBoYXNlZERhdGFUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmaW5pdGlvbiBvZiB0aGUgdGltZSBwaGFzZWQgZGF0YSBibG9jay4mI3hEOyYjeEE7JiN4OTsmI3g5OyAgICAgICAgIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YVR5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSImI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHRhc2sgdGltZXBoYXNlZCBkYXRhLiBWYWx1ZXMgYXJlOiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE9QXNzaWdubWVudCBSZW1haW5pbmcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI9QXNzaWdubWVudCBBY3R1YWwgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM9QXNzaWdubWVudCBBY3R1YWwgT3ZlcnRpbWUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ9QXNzaWdubWVudCBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNT1Bc3NpZ25tZW50IEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2PUFzc2lnbm1lbnQgQWN0dWFsIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3PVJlc291cmNlIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA4PVJlc291cmNlIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA5PVRhc2sgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDEwPVRhc2sgQmFzZWxpbmUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDExPVRhc2sgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE2PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTc9QXNzaWdubWVudCBCYXNlbGluZSAxIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOD1UYXNrIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE5PVRhc2sgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjA9UmVzb3VyY2UgQmFzZWxpbmUgMSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjE9UmVzb3VyY2UgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjI9QXNzaWdubWVudCBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyMz1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI0PVRhc2sgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjU9VGFzayBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNj1SZXNvdXJjZSBCYXNlbGluZSAyIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyNz1SZXNvdXJjZSBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOD1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI5PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzA9VGFzayBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMT1UYXNrIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMyPVJlc291cmNlIEJhc2VsaW5lIDMgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMzPVJlc291cmNlIEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM0PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzU9QXNzaWdubWVudCBCYXNlbGluZSA0IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNj1UYXNrIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM3PVRhc2sgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzg9UmVzb3VyY2UgQmFzZWxpbmUgNCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzk9UmVzb3VyY2UgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDA9QXNzaWdubWVudCBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQyPVRhc2sgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDM9VGFzayBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0ND1SZXNvdXJjZSBCYXNlbGluZSA1IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0NT1SZXNvdXJjZSBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nj1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ3PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDg9VGFzayBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0OT1UYXNrIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUwPVJlc291cmNlIEJhc2VsaW5lIDYgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUxPVJlc291cmNlIEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUyPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTM9QXNzaWdubWVudCBCYXNlbGluZSA3IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1ND1UYXNrIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU1PVRhc2sgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTY9UmVzb3VyY2UgQmFzZWxpbmUgNyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTc9UmVzb3VyY2UgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTg9QXNzaWdubWVudCBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1OT1Bc3NpZ25tZW50IEJhc2VsaW5lIDggQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYwPVRhc2sgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjE9VGFzayBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mj1SZXNvdXJjZSBCYXNlbGluZSA4IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Mz1SZXNvdXJjZSBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2ND1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY1PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjY9VGFzayBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2Nz1UYXNrIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY4PVJlc291cmNlIEJhc2VsaW5lIDkgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY5PVJlc291cmNlIEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcwPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcxPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDcyPVRhc2sgQmFzZWxpbmUgMTAgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDczPVRhc2sgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc0PVJlc291cmNlIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3NT1SZXNvdXJjZSBCYXNlbGluZSAxMCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzY9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHJlY29yZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdGFydCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVuaXQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Vbml0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1tLCAxPWgsIDI9ZCwgMz13LCA1PW1vLCA4PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVbml0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIHBlciB1bml0IG9mIHRpbWUgZm9yIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVGl0bGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaXRsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEgMzIgMzMgMzQgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgNDggNDkgNTAgNTEgNTIgNTMgNTQgNTUgNTYgNTcgNTggNTkgNjAgNjEgNjIgNjMgNjQgNjUgNjYgNjcgNjggNjkgNzAgNzEgNzIgNzMgNzQgNzUgNzYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVJRFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVuaXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNSA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlIGFjcm9zcyB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmVudFZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFyZW50VmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGlzIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFsdWUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGxpc3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVMaXN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlTGlzdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhbHVlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSB2YWx1ZSBsaXN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlZhbHVlbGlzdFNvcnRPcmRlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFsdWVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWwiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsZXZlbCBvZiB0aGUgbWFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVHlwZVR5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgdGhlIG5vZGUgdmFsdWUuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXJjYXNlIExldHRlcnMsIDI9TG93ZXJjYXNlIExldHRlcnMsIDM9Q2hhcmFjdGVycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imxlbmd0aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycy4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICZxdW90O2FueSZxdW90Oy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVuZ3RoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VwYXJhdG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG9mIHRoZSBub2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTZXBhcmF0b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXQlNNYXNrcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcmlmeVVuaXF1ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIHVuaXF1ZSBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWZXJpZnlVbmlxdWVDb2RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdlbmVyYXRlQ29kZXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIFdCUyBjb2RlcyBhcmUgZ2VuZXJhdGVkIGZvciBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkdlbmVyYXRlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QcmVmaXhUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByZWZpeCBmb3IgYWxsIFdCUyBjb2Rlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZml4Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id0JTTWFzayIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9XQlNNYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFdCUyBNYXNrIHRoYXQgaXMgYXBwbGllZCB0byBhbGwgdGFza3MgaW4gdGhlIFByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldCU01hc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtEYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRGF5VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBkYXkuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPUV4Y2VwdGlvbiwgMT1Nb25kYXksIDI9VHVlc2RheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc9U3VuZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkYXlXb3JraW5nIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBzcGVjaWZpZWQgZGF0ZSBvciBkYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5V29ya2luZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVQZXJpb2QiIGVUeXBlPSIjLy9UaW1lUGVyaW9kIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZVBlcmlvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtpbmdUaW1lcyIgZVR5cGU9IiMvL1dvcmtpbmdUaW1lcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHdvcmtpbmcgdGltZXMgdGhhdCBkZWZpbmUgdGhlIHRpbWUgd29ya2VkICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXZWVrRGF5cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndlZWtEYXkiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgd2Vla2RheSBlaXRoZXIgZGVmaW5lcyByZWd1bGFyIGRheXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHdlZWsgb3IgZXhjZXB0aW9uIGRheXMgaW4gdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV2Vla1N0YXJ0RGF5VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0NvbnRvdXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya0NvbnRvdXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2IDcgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJXb3JrRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0dyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtHcm91cF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya2luZ1RpbWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJlZ2lubmluZyBvZiB0aGUgd29ya2luZyB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZyb21UaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9UaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSB3b3JraW5nICB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZSIgdXBwZXJCb3VuZD0iNSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtpbmdUaW1lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgd29ya2luZyB0aW1lIGR1cmluZyB0aGUgd2Vla2RheS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JraW5nVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM0M2IxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIDxjb3B5cmlnaHQ+Ci0jIDwvY29weXJpZ2h0PgotIwotIyAkSWQ6IHBsdWdpbi5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NTcganRoYW0gRXhwICQKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotcGx1Z2luTmFtZSA9IEVQRiBNU1Byb2plY3QyMDAzIE1vZGVsCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjYxOTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTwhLS0KLSA8Y29weXJpZ2h0PgotIDwvY29weXJpZ2h0PgotCi0gJElkOiBwbHVnaW4ueG1sLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NTcganRoYW0gRXhwICQKLS0tPgotCi08cGx1Z2luPgotCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgPHBhY2thZ2UgCi0gICAgICAgdXJpID0gImh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UiCi0gICAgICAgZ2VuTW9kZWwgPSAibW9kZWwvTVNfUHJvamVjdF8yMDAzLmdlbm1vZGVsIiAvPiAKLSAgPC9leHRlbnNpb24+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotICAgIDxwYXJzZXIgCi0gICAgICAgdHlwZT0ibXNwcm9qZWN0IiAKLSAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM4YmM0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMzQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NpZ25tZW50IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2sgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFza1VJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVGFza1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VGFza1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRhc2tVSUQgPGVtPlRhc2sgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZVVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXNvdXJjZVVJRCA8ZW0+UmVzb3VyY2UgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZVVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudFdvcmtDb21wbGV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0FjdHVhbFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgYW1vdW50IG9mIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFDV1AoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmZpcm1lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgUmVzb3VyY2UgaGFzIGFjY2VwdGVkIGFsbCBvZiBoaXMgb3IgaGVyIGFzc2lnbm1lbnRzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29uZmlybWVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25maXJtZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29uZmlybWVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjdW5zZXRDb25maXJtZWQoKQotCSAqIEBzZWUgI2lzQ29uZmlybWVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb25maXJtZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCA8ZW0+Q29uZmlybWVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25maXJtZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvbmZpcm1lZCgpCi0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBzZWUgI3NldENvbmZpcm1lZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29uZmlybWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHJhdGUgdGFibGUgdXNlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFJhdGUgVGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvc3RSYXRlVGFibGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Nvc3RSYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db3N0UmF0ZVRhYmxlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFJhdGVUYWJsZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0Q29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUgPGVtPkNvc3QgUmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29zdCBhbmQgYmFzZWxpbmUgY29zdCBmb3IgYSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0Q29zdFZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IHRoYXQgdGhlIGFzc2lnbm1lbnQgaXMgZGVsYXllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWxheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldERlbGF5IDxlbT5EZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWxheShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpbmlzaCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9GaW5pc2hWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGluaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRIeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGluayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua0FkZHJlc3NUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5IeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1dvcmtWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgRml4ZWQgUmF0ZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgVW5pdHMgYXJlIEZpeGVkIFJhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIYXNGaXhlZFJhdGVVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjc2V0SGFzRml4ZWRSYXRlVW5pdHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0hhc0ZpeGVkUmF0ZVVuaXRzIDxlbT5IYXMgRml4ZWQgUmF0ZSBVbml0czwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEhhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAc2VlICNzZXRIYXNGaXhlZFJhdGVVbml0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjb25zdW1wdGlvbiBvZiB0aGUgYXNzaWduZWQgbWF0ZXJpYWwgcmVzb3VyY2Ugb2NjdXJzIGluIGEgc2luZ2xlLCBmaXhlZCBhbW91bnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICN1bnNldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkTWF0ZXJpYWwnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjaXNGaXhlZE1hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaXhlZE1hdGVyaWFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXhlZE1hdGVyaWFsKCkKLQkgKiBAc2VlICNpc0ZpeGVkTWF0ZXJpYWwoKQotCSAqIEBzZWUgI3NldEZpeGVkTWF0ZXJpYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEZpeGVkTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsaW5nIERlbGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0xldmVsaW5nRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rZWQgRmllbGRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjdW5zZXRMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfTGlua2VkRmllbGRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMaW5rZWRGaWVsZHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmtlZCBGaWVsZHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICN1bnNldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtlZEZpZWxkcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzIDxlbT5MaW5rZWQgRmllbGRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBzZWUgI3NldExpbmtlZEZpZWxkcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGlua2VkRmllbGRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0xpbmtlZEZpZWxkcyA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGlua2VkIEZpZWxkczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNpc0xpbmtlZEZpZWxkcygpCi0JICogQHNlZSAjc2V0TGlua2VkRmllbGRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBhIG1pbGVzdG9uZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWlsZXN0b25lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X05vdGVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05vdGVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vdGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyYWxsb2NhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIG92ZXJhbGxvY2F0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcmFsbG9jYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNPdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyYWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVyYWxsb2NhdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE92ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRPdmVyYWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJhbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBub24tb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgZm9yIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWd1bGFyV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZ3VsYXJXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlZ3VsYXJXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHByb2plY3RlZCBvdmVydGltZSBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfUmVtYWluaW5nV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzcG9uc2UgUGVuZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3Vuc2V0UmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3BvbnNlUGVuZGluZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2VQZW5kaW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Jlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjdW5zZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZyA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI2lzUmVzcG9uc2VQZW5kaW5nKCkKLQkgKiBAc2VlICNzZXRSZXNwb25zZVBlbmRpbmcoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNSZXNwb25zZVBlbmRpbmcgPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNlIFBlbmRpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBzZWUgI3NldFJlc3BvbnNlUGVuZGluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdG9wKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1N0b3AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdG9wJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0b3AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdG9wPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdG9wKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1Jlc3VtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZXN1bWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YXJpYW5jZSBvZiB0aGUgYXNzaWdubWVudCBzdGFydCBkYXRlIGZyb20gdGhlIGJhc2VsaW5lIHN0YXJ0IGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfU3RhcnRWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnRWYXJpYW5jZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0U3RhcnRWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRWYXJpYW5jZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVuaXRzKCkKLQkgKiBAc2VlICN1bnNldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1VuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFVuaXRzIDxlbT5Vbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbml0cyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0VW5pdHMoKQotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAc2VlICNzZXRVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRVbml0cygpCi0JICogQHNlZSAjZ2V0VW5pdHMoKQotCSAqIEBzZWUgI3NldFVuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VW5pdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0ZSBOZWVkZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRydWUgaWYgdGhlIHJlc291cmNlIGFzc2lnbmVkIHRvIGEgdGFzayBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjdW5zZXRVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVXBkYXRlTmVlZGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVcGRhdGVOZWVkZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICN1bnNldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFVwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjaXNVcGRhdGVOZWVkZWQoKQotCSAqIEBzZWUgI3NldFVwZGF0ZU5lZWRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VXBkYXRlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQHNlZSAjc2V0VXBkYXRlTmVlZGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVcGRhdGVOZWVkZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiYXNsaW5lIGNvc3QgYW5kIHRvdGFsIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WQUM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VkFDKCkKLQkgKiBAc2VlICN1bnNldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfVkFDKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVkFDJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZBQzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI3Vuc2V0VkFDKCkKLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZBQyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRWQUMgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VkFDPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWQUMoKQotCSAqIEBzZWUgI2dldFZBQygpCi0JICogQHNlZSAjc2V0VkFDKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VkFDKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgQ29udG91cjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHdvcmsgY29udG91ciBvZiB0aGUgYXNzaWdubWVudC4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2PUJlbGwsIDc9VHVydGxlLCA4PUNvbnRvdXJlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBDb250b3VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrQ29udG91cihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrQ29udG91clR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtDb250b3VyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgQ29udG91cjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya0NvbnRvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBvbiB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSBhc3NpZ25tZW50LiAxPUNvbW1pdGVkLCAyPVByb3Bvc2VkCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQm9va2luZ1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEJvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRpbWVwaGFzZWQgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXNzaWdubWVudC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50X1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBBc3NpZ25tZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Fzc2lnbm1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhODBjZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Bc3NpZ25tZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBc3NpZ25tZW50cy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50cygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXNzaWdubWVudHNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzaWdubWVudHMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QXNzaWdubWVudCgpOwotCi19IC8vIEFzc2lnbm1lbnRzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3ZDgwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF2YWlsYWJpbGl0eVBlcmlvZCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJsZUZyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVG8oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVUbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJsZVRvJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEF2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgZHVyaW5nIHRoZSBzcGVjaWZpZWQgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjdW5zZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVVuaXRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlVW5pdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVVbml0cyA8ZW0+QXZhaWxhYmxlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVW5pdHM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFibGVVbml0cygpCi0JICogQHNlZSAjc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdmFpbGFibGVVbml0cygpOwotCi19IC8vIEF2YWlsYWJpbGl0eVBlcmlvZApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9BdmFpbGFiaWxpdHlQZXJpb2RzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkZTk2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0F2YWlsYWJpbGl0eVBlcmlvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBdmFpbGFiaWxpdHlQZXJpb2RzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHNfQXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F2YWlsYWJpbGl0eVBlcmlvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi19IC8vIEF2YWlsYWJpbGl0eVBlcmlvZHMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1YWRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uIDxlbT5EdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrIGJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bWJlcihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTnVtYmVyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXROdW1iZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmltPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0ludGVyaW0oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmltJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmltPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEludGVyaW0oKQotCSAqIEBzZWUgI3Vuc2V0SW50ZXJpbSgpCi0JICogQHNlZSAjaXNJbnRlcmltKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnRlcmltKCkKLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBzZWUgI3NldEludGVyaW0oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0ludGVyaW0gPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyaW08L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEludGVyaW0oKQotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjc2V0SW50ZXJpbShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SW50ZXJpbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbihPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2sgYmFzZWxpbmUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZV9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlZCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgYmFzZWxpbmUgZHVyYXRpb24gb2YgdGhlIHRhc2sgd2FzIGVzdGltYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlZER1cmF0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICN1bnNldEVzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0ZWREdXJhdGlvbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI3NldEVzdGltYXRlZER1cmF0aW9uKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24gPGVtPkVzdGltYXRlZCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjaXNFc3RpbWF0ZWREdXJhdGlvbigpCi0JICogQHNlZSAjc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIHdvcmsgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBjb3N0IG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmVfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLX0gLy8gQmFzZWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0Jhc2VsaW5lMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE3NzFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQmFzZWxpbmVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VsaW5lMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX051bWJlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J051bWJlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB3b3JrIGFzc2lnbmVkIHRoZSByZXNvdXJjZSB3aGVuIHRoZSBiYXNlbGluZSBpcyBzYXZlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTJfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByb2plY3RlZCBjb3N0IGZvciB0aGUgcmVzb3VyY2Ugd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdCgpCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9Db3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q29zdCgpCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAc2VlICNzZXRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUyX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lMl9CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi19IC8vIEJhc2VsaW5lMgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQmFzZWxpbmUzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWE2YzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9CYXNlbGluZTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lMy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jhc2VsaW5lXy5fMl8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlbGluZTMgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIEJhc2VsaW5lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19UaW1lcGhhc2VkRGF0YSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUaW1lcGhhc2VkRGF0YScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgbnVtYmVyIG9mIHRoZSBiYXNlbGluZSBkYXRhIHJlY29yZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVtYmVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfTnVtYmVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOdW1iZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bWJlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEJhc2VsaW5lM19GaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0QmFzZWxpbmUzX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgb24gdGhlIGFzc2lnbm1lbnQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSBhc3NpZ25tZW50IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRCYXNlbGluZTNfQkNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEJDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQHNlZSAjc2V0QkNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1AoKTsKLQotfSAvLyBCYXNlbGluZTMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5NWQwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYWxlbmRhci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2lzSXNCYXNlQ2FsZW5kYXIgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGVuZGFyXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhbGVuZGFyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgY2FsZW5kYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0Jhc2VDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc0Jhc2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lzQmFzZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNzZXRJc0Jhc2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNCYXNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SXNCYXNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIENhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBiYXNlIGNhbGVuZGFyIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gd2hpY2ggdGhpcyBjYWxlbmRhciBkZXBlbmRzLiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGNhbGVuZGFyIGlzIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX0Jhc2VDYWxlbmRhclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZUNhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmFzZUNhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBXZWVrZGF5cyB0aGF0IGRlZmluZXMgdGhpcyBjYWxlbmRhci4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdlZWtEYXlzKFdlZWtEYXlzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyX1dlZWtEYXlzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5cyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIERheXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrRGF5cyhXZWVrRGF5cyB2YWx1ZSk7Ci0KLX0gLy8gQ2FsZW5kYXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0NhbGVuZGFycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGI2MmNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvQ2FsZW5kYXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFycy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIgPGVtPkNhbGVuZGFyPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0Q2FsZW5kYXJzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDYWxlbmRhcnNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FsZW5kYXJzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgCi0JICogICAgICAgICAgICAgICAgICAgICBub24td29ya2luZyB0aW1lcy4gUHJvamVjdHMgbXVzdCBoYXZlIG9uZSBiYXNlIGNhbGVuZGFyLiBUYXNrcyBhbmQgcmVzb3VyY2VzIAotCSAqICAgICAgICAgICAgICAgICAgICAgbWF5IGhhdmUgdGhlaXIgb3duIG5vbi1iYXNlIGNhbGVuZGFycyB3aGljaCBhcmUgYmFzZWQgb24gYSBiYXNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldENhbGVuZGFyc19DYWxlbmRhcigpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENhbGVuZGFyKCk7Ci0KLX0gLy8gQ2FsZW5kYXJzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Eb2N1bWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3NzU1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPScnIGtpbmQ9J21peGVkJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFJvb3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWl4ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnRXaWxkY2FyZCcgbmFtZT0nOm1peGVkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRNaXhlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIFRoZSBrZXkgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogYW5kIHRoZSB2YWx1ZSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+JyBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiBrZXlUeXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd4bWxuczpwcmVmaXgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwIGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIGtleVR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlVHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3hzaTpzY2hlbWFMb2NhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXAgZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGlzIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuCi0JICogCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2plY3QoUHJvamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXREb2N1bWVudFJvb3RfUHJvamVjdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHZhbHVlKTsKLQotfSAvLyBEb2N1bWVudFJvb3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5Mzc4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRSb2xsdXBUeXBlIDxlbT5Sb2xsdXAgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzIDxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0VmFsdWVsaXN0U29ydE9yZGVyIDxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RGVmYXVsdCA8ZW0+RGVmYXVsdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZE5hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGROYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gZmllbGQKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsaWFzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFsaWFzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBmaWVsZAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlBob25ldGljQWxpYXNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsdXAgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSG93IHJvbGx1cHMgYXJlIGNhbGN1bGF0ZWQuIFZhbHVlcyBhcmU6IDA9TWF4aW11bSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1BdmVyYWdlLCA1PUF2ZXJhZ2UgRmlyc3QgU3VibGV2ZWwsIDY9Q291bnQgRmlyc3QgU3VibGV2ZWwsIDc9Q291bnQgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25zdW1tYXJpZXMKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJvbGx1cFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUm9sbHVwVHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGx1cFR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJvbGx1cFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Um9sbHVwVHlwZSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSb2xsdXBUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciByb2xsdXBzIGFyZSBjYWxjdWxhdGVkIGZvciB0YXNrIGFuZCBncm91cCBzdW1tYXJ5IHJvd3MuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1Ob25lLCAxPVJvbGx1cCwgMj1DYWxjdWxhdGlvbgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxjdWxhdGlvblR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9DYWxjdWxhdGlvblR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxjdWxhdGlvblR5cGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxjdWxhdGlvblR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENhbGN1bGF0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRDYWxjdWxhdGlvblR5cGUgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2FsY3VsYXRpb25UeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSB0YXNrIGZpZWxkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGb3JtdWxhKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zvcm11bGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Rm9ybXVsYSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Gb3JtdWxhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGb3JtdWxhKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN0cmljdCBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIFJlc3RyaWN0VmFsdWVzPVRydWUgdGhlbiBvbmx5IHZhbHVlcyBpbiB0aGUgbGlzdCBhcmUgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkIGluIHRoZSBmaWxlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjdW5zZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9SZXN0cmljdFZhbHVlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzdHJpY3RWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI3Vuc2V0UmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBzZWUgI2lzUmVzdHJpY3RWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3RyaWN0VmFsdWVzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQHNlZSAjc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3RyaWN0VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN0cmljdCBWYWx1ZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRSZXN0cmljdFZhbHVlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBIb3cgdmFsdWUgbGlzdHMgYXJlIHNvcnRlZC4gVmFsdWVzIGFyZTogCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPURlc2NlbmRpbmcsIDE9QXNjZW5kaW5nCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZWxpc3QgU29ydCBPcmRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBlbmQgTmV3IFZhbHVlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgQXBwZW5kTmV3VmFsdWVzPVRydWUgdGhlbiBhbnkgbmV3IHZhbHVlcyBhZGRlZCBpbiBhIHByb2plY3QgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBlbmROZXdWYWx1ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXBwZW5kTmV3VmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICN1bnNldEFwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjaXNBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFwcGVuZE5ld1ZhbHVlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0QXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjc2V0QXBwZW5kTmV3VmFsdWVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBcHBlbmROZXdWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcyA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBcHBlbmROZXdWYWx1ZXMoKQotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAc2VlICNzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIGxpc3QuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlX0RlZmF1bHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIExpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZW4gdmFsdWVzIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBhcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gdGhlIHNjaGVtYSwgdGhleSBtYXkgZWl0aGVyIGJlIHNwZWNpZmllZCBieSB2YWx1ZXMgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgb3JkZXJpbmcgb2YgdGhlIGxpc3QgYnkgb3JkZXJpbmcgc3BlY2lmaWVkIGhlcmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlTGlzdChWYWx1ZUxpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVMaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVMaXN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVMaXN0IGdldFZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVhNzhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZV8uXzFfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGUyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4YjI4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L0V4dGVuZGVkQXR0cmlidXRlMy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBQSUQgb2YgdGhlIGN1c3RvbSBmaWVsZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmllbGRJRChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0ZpZWxkSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmllbGRJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EdXJhdGlvbkZvcm1hdFR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlMwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGU0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDFlY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZTQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlNC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlNDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpZWxkSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZElEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEdXJhdGlvbkZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIEV4dGVuZGVkQXR0cmlidXRlNApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDhmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9FeHRlbmRlZEF0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXh0ZW5kZWRBdHRyaWJ1dGVzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkQXR0cmlidXRlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRWFjaCBvZiB0aGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIGRlZmluaXRpb24gCi0JICogICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiAgVGhlcmUgYXJlIG5vIGxpbWl0cyB0byB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoYXQgbWF5IGFwcGVhciwgYnV0IHByb2plY3QgCi0JICogICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZEF0dHJpYnV0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLX0gLy8gRXh0ZW5kZWRBdHRyaWJ1dGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2suamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y5OWIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFzay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hc2sgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxldmVsIG9mIHRoZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX0xldmVsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbWF4aW11bSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGUgb3V0bGluZSBjb2RlIHZhbHVlcy4gIElmIGxlbmd0aCBpcyBhbnksIHRoZSB2YWx1ZSBpcyB6ZXJvLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfTGVuZ3RoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZW5ndGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NlcGFyYXRvcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXBhcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgdmFsdWUpOwotCi19IC8vIE1hc2sKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvTWFza3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQwNjRhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01hc2tzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1hc2tzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE1hc2tzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYXNrc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXNrcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvdXIgZWxlbWVudHMgb2YgdGhlIG1hc2sgY29uc3RpdHV0ZSB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBvdXRsaW5lIGNvZGUgbXVzdCBhcHBlYXIuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0TWFza3NfTWFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE1hc2soKTsKLQotfSAvLyBNYXNrcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1ZTdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEZhY3RvcnkuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNc3Byb2plY3RGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0RmFjdG9yeSBlSU5TVEFOQ0UgPSBuZXcgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdEZhY3RvcnlJbXBsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFzc2lnbm1lbnQgY3JlYXRlQXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFzc2lnbm1lbnRzIGNyZWF0ZUFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZCBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBdmFpbGFiaWxpdHlQZXJpb2RzIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCYXNlbGluZSBjcmVhdGVCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmFzZWxpbmUyIGNyZWF0ZUJhc2VsaW5lMigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNlbGluZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmFzZWxpbmUzIGNyZWF0ZUJhc2VsaW5lMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYWxlbmRhcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhbGVuZGFyIGNyZWF0ZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhcnMgY3JlYXRlQ2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlMiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXh0ZW5kZWRBdHRyaWJ1dGUzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeHRlbmRlZEF0dHJpYnV0ZTQgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlcyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFzayBjcmVhdGVNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWFza3MgY3JlYXRlTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlIGNyZWF0ZU91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlMiBjcmVhdGVPdXRsaW5lQ29kZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0bGluZUNvZGUzIGNyZWF0ZU91dGxpbmVDb2RlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPdXRsaW5lQ29kZXMgY3JlYXRlT3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByZWRlY2Vzc29yTGluayBjcmVhdGVQcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvamVjdCBjcmVhdGVQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJhdGUgY3JlYXRlUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SYXRlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJhdGVzIGNyZWF0ZVJhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBjcmVhdGVUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza3MgY3JlYXRlVGFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWUgUGVyaW9kPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lUGVyaW9kIGNyZWF0ZVRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lcGhhc2VkRGF0YVR5cGUgY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWUgY3JlYXRlVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZTI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlMiBjcmVhdGVWYWx1ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFsdWVzIGNyZWF0ZVZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V0JTIE1hc2s8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdCU01hc2sgY3JlYXRlV0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XQlMgTWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV0JTTWFza3MgY3JlYXRlV0JTTWFza3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXZWVrRGF5IGNyZWF0ZVdlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdlZWtEYXlzIGNyZWF0ZVdlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZSBjcmVhdGVXb3JraW5nVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZXMgY3JlYXRlV29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBwYWNrYWdlIHN1cHBvcnRlZCBieSB0aGlzIGZhY3RvcnkuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1zcHJvamVjdFBhY2thZ2UgZ2V0TXNwcm9qZWN0UGFja2FnZSgpOwotCi19IC8vTXNwcm9qZWN0RmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Nc3Byb2plY3RQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4N2M0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L01zcHJvamVjdFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNTQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UGFja2FnZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBUaGUgZnVsbCBwcm9qZWN0IHNjaGVtYSBkZWZpbml0aW9uIGZyb20gdGhlIHByb2plY3QgbGV2ZWwgZG93biwgCi0gKiAJCXN0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1zcHJvamVjdFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL2VwZi5lY2xpcHNlLm9yZy9tc3Byb2plY3QiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19QUkVGSVggPSAibXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTXNwcm9qZWN0UGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzayBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19UQVNLX1VJRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1QgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQUNUVUFMX1dPUksgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19BQ1dQID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uZmlybWVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09ORklSTUVEID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0NPU1QgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFJhdGUgVGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRSA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQ1YgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0RFTEFZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fSFlQRVJMSU5LID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SHlwZXJsaW5rIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUyA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwgPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGlua2VkIEZpZWxkczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19NSUxFU1RPTkUgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX05PVEVTID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcmFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVCA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19PVkVSVElNRV9XT1JLID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVndWxhciBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfQ09TVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSAzNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSyA9IDM3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNlIFBlbmRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVCA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0b3A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVE9QID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fUkVTVU1FID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVU5JVFMgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGUgTmVlZGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fVVBEQVRFX05FRURFRCA9IDQ0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZBQzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1ZBQyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19XT1JLID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBDb250b3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fV09SS19DT05UT1VSID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JDV1MgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkNXUCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvb2tpbmcgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19DUkVBVElPTl9EQVRFID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVF9fQkFTRUxJTkUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSA9IDU2OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFTU0lHTk1FTlRfRkVBVFVSRV9DT1VOVCA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsIDxlbT5Bc3NpZ25tZW50czwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50c0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBU1NJR05NRU5UUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBU1NJR05NRU5UU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE8gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9VTklUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRF9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVZBSUxBQklMSVRZX1BFUklPRFNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwgPGVtPkJhc2VsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19OVU1CRVIgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyaW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fSU5URVJJTSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fU1RBUlQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19GSU5JU0ggPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX0RVUkFUSU9OID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRFVSQVRJT05fRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkVfX1dPUksgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORV9fQ09TVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dTID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX19CQ1dQID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lMkltcGwgPGVtPkJhc2VsaW5lMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FMiA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX19OVU1CRVIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX1dPUksgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0NPU1QgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1MgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTJfX0JDV1AgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5CYXNlbGluZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUyX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUzSW1wbCA8ZW0+QmFzZWxpbmUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQkFTRUxJTkUzID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX05VTUJFUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX1NUQVJUID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fV09SSyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQ09TVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJBU0VMSU5FM19fQkNXUCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2VsaW5lMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCQVNFTElORTNfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwgPGVtPkNhbGVuZGFyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJfX05BTUUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEJhc2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSX19XRUVLX0RBWVMgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQUxFTkRBUl9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFyc0ltcGwgPGVtPkNhbGVuZGFyczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTEVOREFSUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBTEVOREFSU19fQ0FMRU5EQVIgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FMRU5EQVJTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1QgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1peGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NSVhFRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhTSSBTY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fUFJPSkVDVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVMgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsY3VsYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rm9ybXVsYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzdHJpY3QgVmFsdWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19SRVNUUklDVF9WQUxVRVMgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUiA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwZW5kIE5ldyBWYWx1ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTJfRkVBVFVSRV9DT1VOVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFMyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTNfX1VJRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19GSUVMRF9JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUID0gNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEUzX0ZFQVRVUkVfQ09VTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTQgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhURU5ERURfQVRUUklCVVRFNF9GRUFUVVJFX0NPVU5UID0gNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlc0ltcGwgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYVEVOREVEX0FUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCA8ZW0+TWFzazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTSyA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19fTEVWRUwgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tfX1NFUEFSQVRPUiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1hc2tzSW1wbCA8ZW0+TWFza3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUFTS1MgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNQVNLU19fTUFTSyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1BU0tTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0ZJRUxEX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19GSUVMRF9OQU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxJQVMgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUyA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19WQUxVRVMgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVfX0xFQUZfT05MWSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERV9fT05MWV9UQUJMRV9WQUxVRVNfQUxMT1dFRCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX19NQVNLUyA9IDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFX0ZFQVRVUkVfQ09VTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFMl9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWVsZCBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX0ZJRUxEX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTMgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREUzX19VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fRklFTERfSUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFM19fVkFMVUVfSUQgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVExJTkVfQ09ERTNfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZXNJbXBsIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2Rlc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFUyA9IDIwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRMSU5FX0NPREVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJlZGVjZXNzb3JMaW5rSW1wbCA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTksgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkVERUNFU1NPUl9MSU5LX19UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIExhZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWcgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJFREVDRVNTT1JfTElOS19GRUFUVVJFX0NPVU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsIDxlbT5Qcm9qZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9KRUNUID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGl0bGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19USVRMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NVQkpFQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FURUdPUlkgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19DT01QQU5ZID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5hZ2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUFOQUdFUiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUSE9SID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1JFQVRJT05fREFURSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVZJU0lPTiA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFzdCBTYXZlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0xBU1RfU0FWRUQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TVEFSVF9EQVRFID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GSU5JU0hfREFURSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZZIFN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19GWVNUQVJUX0RBVEUgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgRGlnaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ0FMRU5EQVJfVUlEID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9TVEFSVF9USU1FID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaW5pc2ggVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUUgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBEYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NSU5VVEVTX1BFUl9EQVkgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW51dGVzIFBlciBXZWVrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSyA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRheXMgUGVyIE1vbnRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREFZU19QRVJfTU9OVEggPSAyNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfVEFTS19UWVBFID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSA9IDI3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0RVUkFUSU9OX0ZPUk1BVCA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fV09SS19GT1JNQVQgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFMgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybmVkIFZhbHVlIE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlkgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTiA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BMSVRTX0lOX1BST0dSRVNTX1RBU0tTID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSA9IDQxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpc2NhbCBZZWFyIFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQgPSA0MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XZWVrIFN0YXJ0IERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1dFRUtfU1RBUlRfREFZID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSyA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGF0dXMgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX1NUQVRVU19EQVRFID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fQ1VSUkVOVF9EQVRFID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkwgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRvbGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FVVE9MSU5LID0gNTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEUgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRCA9IDU1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWxzIEluIFN5bmM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUyA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19BRE1JTl9QUk9KRUNUID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX09VVExJTkVfQ09ERVMgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19XQlNfTUFTS1MgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUyA9IDYzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0NBTEVOREFSUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9fVEFTS1MgPSA2NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9KRUNUX19SRVNPVVJDRVMgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0pFQ1RfX0FTU0lHTk1FTlRTID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlByb2plY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPSkVDVF9GRUFUVVJFX0NPVU5UID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCA8ZW0+UmF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkFURSA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzIEZyb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19SQVRFU19GUk9NID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1JBVEVTX1RPID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYXRlIFRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fUkFURV9UQUJMRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX1NUQU5EQVJEX1JBVEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURV9fU1RBTkRBUkRfUkFURV9GT1JNQVQgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19PVkVSVElNRV9SQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFX19DT1NUX1BFUl9VU0UgPSA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJBVEVfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlc0ltcGwgPGVtPlJhdGVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFJhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVTID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkFURVNfX1JBVEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5SYXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSQVRFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCA8ZW0+UmVzb3VyY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0UgPSAyNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OQU1FID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfTlVMTCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSU5JVElBTFMgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QSE9ORVRJQ1MgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5UIEFjY291bnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTlRBQ0NPVU5UID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXRlcmlhbCBMYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19NQVRFUklBTF9MQUJFTCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT0RFID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19HUk9VUCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SS19HUk9VUCA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVtYWlsIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fRU1BSUxfQUREUkVTUyA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTksgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUyA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXggVW5pdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fTUFYX1VOSVRTID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVhayBVbml0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRUFLX1VOSVRTID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfRlJPTSA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF2YWlsYWJsZSBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCTEVfVE8gPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFSVCA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19GSU5JU0ggPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYW4gTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ0FOX0xFVkVMID0gMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjcnVlIEF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDQ1JVRV9BVCA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fV09SSyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZ3VsYXIgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRUdVTEFSX1dPUksgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1dPUksgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SSyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUksgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSyA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEUgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19TVEFOREFSRF9SQVRFX0ZPUk1BVCA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ09TVCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fT1ZFUlRJTUVfUkFURSA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVkVSVElNRV9DT1NUID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVFVBTF9DT1NUID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19SRU1BSU5JTkdfQ09TVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19XT1JLX1ZBUklBTkNFID0gNDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DT1NUX1ZBUklBTkNFID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fU1YgPSA0NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DViA9IDQ3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNXUCA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19DQUxFTkRBUl9VSUQgPSA0OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19OT1RFUyA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUyA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkNXUCA9IDUyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEdlbmVyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fSVNfR0VORVJJQyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEluYWN0aXZlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0lTX0lOQUNUSVZFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW50ZXJwcmlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19JU19FTlRFUlBSSVNFID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Qm9va2luZyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRSA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQgPSA1NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEID0gNTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCA9IDU5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQ1JFQVRJT05fREFURSA9IDYwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSA9IDYxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fQkFTRUxJTkUgPSA2MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19PVVRMSU5FX0NPREUgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUyA9IDY0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVTT1VSQ0VfX1JBVEVTID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFX0ZFQVRVUkVfQ09VTlQgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlc0ltcGwgPGVtPlJlc291cmNlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFU09VUkNFUyA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVNPVVJDRVNfX1JFU09VUkNFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UmVzb3VyY2VzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFU09VUkNFU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVUlEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTkFNRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RZUEUgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE51bGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19OVUxMID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGUgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NSRUFURV9EQVRFID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OVEFDVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V0JTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV0JTID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XQlMgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19XQlNfTEVWRUwgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTnVtYmVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUTElORV9OVU1CRVIgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dGxpbmUgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0xFVkVMID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpb3JpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUklPUklUWSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0ggPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0RVUkFUSU9OID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHVyYXRpb24gRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRFVSQVRJT05fRk9STUFUID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1dPUksgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RPUCA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRSA9IDE4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VtZSBWYWxpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFU1VNRV9WQUxJRCA9IDE5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVmZm9ydCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FRkZPUlRfRFJJVkVOID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVjdXJyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVDVVJSSU5HID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlciBBbGxvY2F0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSX0FMTE9DQVRFRCA9IDIyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRFRCA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01JTEVTVE9ORSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1bW1hcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVU1NQVJZID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JpdGljYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DUklUSUNBTCA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWSA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVQlBST0pFQ1RfTkFNRSA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIFRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FWFRFUk5BTF9UQVNLID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUID0gMzE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWFybHkgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJMWV9TVEFSVCA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcmx5IEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VBUkxZX0ZJTklTSCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxhdGUgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX1NUQVJUID0gMzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGF0ZSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MQVRFX0ZJTklTSCA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1RBUlRfVkFSSUFOQ0UgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggVmFyaWFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSU5JU0hfVkFSSUFOQ0UgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV09SS19WQVJJQU5DRSA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyZWUgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GUkVFX1NMQUNLID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG90YWwgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19UT1RBTF9TTEFDSyA9IDQwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpeGVkIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GSVhFRF9DT1NUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Rml4ZWQgQ29zdCBBY2NydWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BFUkNFTlRfQ09NUExFVEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJDRU5UX1dPUktfQ09NUExFVEUgPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09TVCA9IDQ1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVkVSVElNRV9DT1NUID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09WRVJUSU1FX1dPUksgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfU1RBUlQgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0ZJTklTSCA9IDQ5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBEdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9EVVJBVElPTiA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX0NPU1QgPSA1MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19BQ1RVQUxfV09SSyA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUksgPSA1NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRUdVTEFSX1dPUksgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgRHVyYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfRFVSQVRJT04gPSA1NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19DT1NUID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVtYWluaW5nIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19SRU1BSU5JTkdfV09SSyA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1QgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDV1AgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DVjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0NWID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9UWVBFID0gNjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ0FMRU5EQVJfVUlEID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OU1RSQUlOVF9EQVRFID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVhZGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ERUFETElORSA9IDY2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsIEFzc2lnbm1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBDYW4gU3BsaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19MRVZFTElOR19DQU5fU1BMSVQgPSA2ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0xFVkVMSU5HX0RFTEFZID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUID0gNzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVfTEVWRUxFRF9TVEFSVCA9IDcxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBMZXZlbGVkIEZpbmlzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCA9IDcyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0hZUEVSTElOSyA9IDczOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSFlQRVJMSU5LX0FERFJFU1MgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX05PVEVTID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGlkZSBCYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19ISURFX0JBUiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGx1cDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1JPTExVUCA9IDc5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19CQ1dTID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QkNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JDV1AgPSA4MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURSA9IDgyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FQVJORURfVkFMVUVfTUVUSE9EID0gODM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFREVDRVNTT1JfTElOSyA9IDg0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRCA9IDg1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCA9IDg2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fRVhURU5ERURfQVRUUklCVVRFID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZWxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JBU0VMSU5FID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRMSU5FX0NPREUgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RJTUVQSEFTRURfREFUQSA9IDkwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5UYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfRkVBVFVSRV9DT1VOVCA9IDkxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza3NJbXBsIDxlbT5UYXNrczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLUyA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tTX19UQVNLID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGFza3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS1NfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZVBlcmlvZEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfX0ZST01fREFURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG8gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVfUEVSSU9EX19UT19EQVRFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRV9QRVJJT0RfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsIDxlbT5UaW1lcGhhc2VkIERhdGEgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUSU1FUEhBU0VEX0RBVEFfVFlQRV9fVUlEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRJTUVQSEFTRURfREFUQV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsIDxlbT5WYWx1ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRSA9IDMxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfX1ZBTFVFX0lEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fUEFSRU5UX1ZBTFVFX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9fREVTQ1JJUFRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwgPGVtPlZhbHVlMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFMiA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQUxVRTJfX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFMl9fREVTQ1JJUFRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZTI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUUyX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUxpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFZBTFVFX0xJU1QgPSAzMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVfTElTVF9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZSBMaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFX0xJU1RfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsIDxlbT5WYWx1ZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQUxVRVMgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX19HUk9VUCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBTFVFU19fVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5WYWx1ZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFMVUVTX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwgPGVtPldCUyBNYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXQlNfTUFTSyA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX0xFVkVMID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tfX1RZUEUgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19MRU5HVEggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcGFyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLX19TRVBBUkFUT1IgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XQlMgTWFzazwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCA8ZW0+V0JTIE1hc2tzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdCU19NQVNLUyA9IDM2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlIENvZGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0JTX01BU0tTX19QUkVGSVggPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXQlNfTUFTS1NfX1dCU19NQVNLID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdCU19NQVNLU19GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsIDxlbT5XZWVrIERheTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0VFS19EQVkgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EYXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZX19EQVlfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF5IFdvcmtpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9fREFZX1dPUktJTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1RJTUVfUEVSSU9EID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0VFS19EQVlfX1dPUktJTkdfVElNRVMgPSAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5XZWVrIERheTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWV9GRUFUVVJFX0NPVU5UID0gNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbCA8ZW0+V2VlayBEYXlzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdFRUtfREFZUyA9IDM4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldlZWsgRGF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXRUVLX0RBWVNfX1dFRUtfREFZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V2VlayBEYXlzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdFRUtfREFZU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCA8ZW0+V29ya2luZyBUaW1lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRSA9IDM5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZyb20gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9fRlJPTV9USU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UbyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS0lOR19USU1FX19UT19USU1FID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRV9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lc0ltcGwgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtpbmdUaW1lcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktJTkdfVElNRVNfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNDUlVFX0FUID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkFsaWFzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QWxpYXNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFMSUFTX1RZUEUgPSA0MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0QXV0aG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBVVRIT1JfVFlQRSA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRSA9IDQ1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPT0tJTkdfVFlQRV9UWVBFID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Qm9va2luZ1R5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBCT09LSU5HX1RZUEVfVFlQRTEgPSA0NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBTENVTEFUSU9OX1RZUEVfVFlQRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENhdGVnb3J5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDQVRFR09SWV9UWVBFID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvZGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb2RlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT0RFX1RZUEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvbXBhbnlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTVBBTllfVFlQRSA9IDUxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Q29uc3RyYWludFR5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfVFlQRV9UWVBFID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDb250YWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05UQUNUX1RZUEUgPSA1MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldENvc3RSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPU1RfUkFURV9UQUJMRV9UWVBFID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRSA9IDU1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRDdXJyZW5jeVN5bWJvbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VSUkVOQ1lfU1lNQk9MX1RZUEUgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RGF5IFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RGF5VHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREFZX1RZUEVfVFlQRSA9IDU3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRSA9IDU4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRSA9IDU5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREZWZhdWx0VGFza1R5cGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFRkFVTFRfVEFTS19UWVBFX1RZUEUgPSA2MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRSA9IDYxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEUxID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTIgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXREdXJhdGlvbkZvcm1hdFR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERVUkFUSU9OX0ZPUk1BVF9UWVBFMyA9IDY0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldER1cmF0aW9uRm9ybWF0VHlwZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFVSQVRJT05fRk9STUFUX1RZUEU0ID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVVJBVElPTl9GT1JNQVRfVFlQRTUgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFID0gNjc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMSA9IDY4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RW1haWxBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTUFJTF9BRERSRVNTX1RZUEUgPSA2OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhURVJOQUxfVEFTS19QUk9KRUNUX1RZUEUgPSA3MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRklYRURfQ09TVF9BQ0NSVUFMX1RZUEUgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRGWVN0YXJ0RGF0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRllfU1RBUlRfREFURV9UWVBFID0gNzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0R3JvdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdST1VQX1RZUEUgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFID0gNzQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfQUREUkVTU19UWVBFMSA9IDc1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX0FERFJFU1NfVFlQRTIgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUgPSA3NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTEgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTIgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRSA9IDgwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0SHlwZXJsaW5rVHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSFlQRVJMSU5LX1RZUEUxID0gODE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRIeXBlcmxpbmtUeXBlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBIWVBFUkxJTktfVFlQRTIgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+SW5pdGlhbHMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRJbml0aWFsc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU5JVElBTFNfVFlQRSA9IDgzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MYWcgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExhZ0Zvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTEFHX0ZPUk1BVF9UWVBFID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRSA9IDg1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTEgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hbmFnZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BTkFHRVJfVFlQRSA9IDg3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE1hdGVyaWFsTGFiZWxUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1BVEVSSUFMX0xBQkVMX1RZUEUgPSA4ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRSA9IDg5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OYW1lIFR5cGUxPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5hbWVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FX1RZUEUxID0gOTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TmFtZVR5cGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5BTUVfVFlQRTIgPSA5MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+TmFtZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXROYW1lVHlwZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRV9UWVBFMyA9IDkyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRSA9IDkzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0TlRBY2NvdW50VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOVF9BQ0NPVU5UX1RZUEUgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+T3V0bGluZSBOdW1iZXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRPdXRsaW5lTnVtYmVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBPVVRMSU5FX05VTUJFUl9UWVBFID0gOTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRSA9IDk2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTEgPSA5NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRQaG9uZXRpY0FsaWFzVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSE9ORVRJQ19BTElBU19UWVBFID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFBob25ldGljc1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhPTkVUSUNTX1RZUEUgPSA5OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0UHJlZml4VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkVGSVhfVFlQRSA9IDEwMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRSYXRlVGFibGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJBVEVfVEFCTEVfVFlQRSA9IDEwMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+Um9sbHVwIFR5cGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0Um9sbHVwVHlwZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MTFVQX1RZUEVfVFlQRSA9IDEwMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFID0gMTAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTEgPSAxMDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YmplY3QgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRTdWJqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJKRUNUX1RZUEUgPSAxMDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFN1YnByb2plY3ROYW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVUJQUk9KRUNUX05BTUVfVFlQRSA9IDEwNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VGl0bGUgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUaXRsZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVElUTEVfVFlQRSA9IDEwNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUgPSAxMDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTE8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEUxID0gMTA5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGUyPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFMiA9IDExMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VHlwZSBUeXBlMzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VHlwZVR5cGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRZUEVfVFlQRTMgPSAxMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlR5cGUgVHlwZTQ8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFR5cGVUeXBlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUWVBFX1RZUEU0ID0gMTEyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5UeXBlIFR5cGU1PC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRUeXBlVHlwZTUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRV9UWVBFNSA9IDExMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VUlEIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0VUlEVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVSURfVFlQRSA9IDExNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+VW5pdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRVbml0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVTklUX1RZUEUgPSAxMTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRSA9IDExNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V2Vla1N0YXJ0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXRUVLX1NUQVJUX0RBWV9UWVBFID0gMTE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTXNwcm9qZWN0UGFja2FnZUltcGwjZ2V0V29ya0NvbnRvdXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQ09OVE9VUl9UWVBFID0gMTE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Nc3Byb2plY3RQYWNrYWdlSW1wbCNnZXRXb3JrRm9ybWF0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0ZPUk1BVF9UWVBFID0gMTE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk1zcHJvamVjdFBhY2thZ2VJbXBsI2dldFdvcmtHcm91cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19HUk9VUF9UWVBFID0gMTIwOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXNzaWdubWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VGFza1VJRCA8ZW0+VGFzayBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUYXNrVUlEKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNvdXJjZSBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVzb3VyY2VVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxTdGFydCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNDb25maXJtZWQgPGVtPkNvbmZpcm1lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbmZpcm1lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc0NvbmZpcm1lZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db25maXJtZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldENvc3RSYXRlVGFibGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDViA8ZW0+Q1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDVigpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9DVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGluaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IeXBlcmxpbmtTdWJBZGRyZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNIYXNGaXhlZFJhdGVVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpeGVkIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9GaXhlZE1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rZWQgRmllbGRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzTGlua2VkRmllbGRzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc092ZXJhbGxvY2F0ZWQgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVyYWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVyYWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZWd1bGFyV29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0U3RhcnRWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRVbml0cygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Vbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjaXNVcGRhdGVOZWVkZWQgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcGRhdGUgTmVlZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1VwZGF0ZU5lZWRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDIDxlbT5WQUM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WQUM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0VkFDKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1ZBQygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRXb3JrQ29udG91ciA8ZW0+V29yayBDb250b3VyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29yayBDb250b3VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFdvcmtDb250b3VyKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1dvcmtDb250b3VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJDV1AoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Cb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnQjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9FeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0Jhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50I2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudCNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXNzaWdubWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCA8ZW0+QXNzaWdubWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzaWdubWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHMjZ2V0QXNzaWdubWVudCgpCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRzX0Fzc2lnbm1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVGcm9tKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVRvIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2QjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kI2dldEF2YWlsYWJsZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEF2YWlsYWJpbGl0eVBlcmlvZF9BdmFpbGFibGVVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHMjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RzX0F2YWlsYWJpbGl0eVBlcmlvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJhc2VsaW5lX1RpbWVwaGFzZWREYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldE51bWJlcigpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSA8ZW0+SW50ZXJpbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkludGVyaW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzSW50ZXJpbSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lX0ludGVyaW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0U3RhcnQoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUjZ2V0RHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Fc3RpbWF0ZWREdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRDb3N0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dTPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZSNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIgPGVtPkJhc2VsaW5lMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QmFzZWxpbmUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtYmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0TnVtYmVyKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9OdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRXb3JrKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0Q29zdCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMiNnZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyA8ZW0+QmFzZWxpbmUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRCYXNlbGluZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OdW1iZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXROdW1iZXIoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX051bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldFdvcmsgPGVtPldvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRDb3N0IDxlbT5Db3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldENvc3QoKQotCSAqIEBzZWUgI2dldEJhc2VsaW5lMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0Nvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCYXNlbGluZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJhc2VsaW5lM19CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTMjZ2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QmFzZWxpbmUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQmFzZSBDYWxlbmRhcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjaXNJc0Jhc2VDYWxlbmRhcigpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENhbGVuZGFyX0lzQmFzZUNhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXIjZ2V0QmFzZUNhbGVuZGFyVUlEIDxlbT5CYXNlIENhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldENhbGVuZGFyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cyA8ZW0+V2VlayBEYXlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciNnZXRXZWVrRGF5cygpCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENhbGVuZGFyX1dlZWtEYXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXJzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycyNnZXRDYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMjZ2V0Q2FsZW5kYXIoKQotCSAqIEBzZWUgI2dldENhbGVuZGFycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJzX0NhbGVuZGFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRNaXhlZCgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREb2N1bWVudFJvb3RfTWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBtYXAgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgbWFwICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFhTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXREb2N1bWVudFJvb3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkRvY3VtZW50Um9vdCNnZXRQcm9qZWN0IDxlbT5Qcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290I2dldFByb2plY3QoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0RmllbGROYW1lKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEFsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQWxpYXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUGhvbmV0aWNBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sbHVwIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFJvbGx1cFR5cGUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Sb2xsdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlIDxlbT5DYWxjdWxhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Q2FsY3VsYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjZ2V0Rm9ybXVsYSA8ZW0+Rm9ybXVsYTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZvcm11bGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldEZvcm11bGEoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9Gb3JtdWxhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUjaXNSZXN0cmljdFZhbHVlcyA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlbGlzdFNvcnRPcmRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldERlZmF1bHQgPGVtPkRlZmF1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSNnZXREZWZhdWx0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfRGVmYXVsdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlI2dldFZhbHVlTGlzdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEV4dGVuZGVkQXR0cmlidXRlX1ZhbHVlTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMiNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0R1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmllbGQgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRGaWVsZElEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19GaWVsZElEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlM19WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMyNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRHVyYXRpb25Gb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0IDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldEZpZWxkSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlNCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0X1ZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTQjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGU0I2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlcyNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZXNfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayA8ZW0+TWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZXZlbCgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2sjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0TWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlbmd0aDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRMZW5ndGgoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlcGFyYXRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzayNnZXRTZXBhcmF0b3IoKQotCSAqIEBzZWUgI2dldE1hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1hc2tfU2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrcyNnZXRNYXNrKCkKLQkgKiBAc2VlICNnZXRNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWFza3NfTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZE5hbWUoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRBbGlhcyA8ZW0+QWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldFZhbHVlcygpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVudGVycHJpc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxlYWYgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0xlYWZPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMgPGVtPk91dGxpbmUgQ29kZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRVSUQoKQotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlMygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpZWxkIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0RmllbGRJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VmFsdWVJRCgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTNfVmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSgpCi0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZXNfT3V0bGluZUNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJlZGVjZXNzb3JMaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFByZWRlY2Vzc29yVUlEIDxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxpbmsgTGFnPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZygpCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYWcgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvckxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlIDxlbT5UaXRsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRpdGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRpdGxlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3ViamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N1YmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55IDxlbT5Db21wYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tcGFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDb21wYW55KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYW5hZ2VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWFuYWdlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXZpc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TGFzdFNhdmVkIDxlbT5MYXN0IFNhdmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGFzdCBTYXZlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRMYXN0U2F2ZWQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmluaXNoIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZZIFN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RllTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhcnRUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpbmlzaFRpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWludXRlcyBQZXIgV2VlazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EYXlzUGVyTW9udGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSA8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1dvcmtGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0hvbm9yQ29uc3RyYWludHMgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FYXJuZWRWYWx1ZU1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VmZm9ydERyaXZlbiA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldlZWsgU3RhcnQgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdlZWtTdGFydERheSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXR1cyBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfU3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVudERhdGUgPGVtPkN1cnJlbnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW50RGF0ZSgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRvbGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Qcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUgPGVtPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0V4dGVuZGVkQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2plY3RfQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfT3V0bGluZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9FeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FsZW5kYXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFycygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9DYWxlbmRhcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzIDxlbT5UYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFRhc2tzKCkKLQkgKiBAc2VlICNnZXRQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMoKQotCSAqIEBzZWUgI2dldFByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2plY3RfUmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Bc3NpZ25tZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0UHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlIDxlbT5SYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGVzIEZyb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNGcm9tKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZXNUbyA8ZW0+UmF0ZXMgVG88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SYXRlcyBUbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzVG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhdGUgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfU3RhbmRhcmRSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJhdGVfQ29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSgpCi0JICogQHNlZSAjZ2V0UmF0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJhdGVzX1JhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlc291cmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VUlEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SUQgPGVtPklEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE51bGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SW5pdGlhbHMgPGVtPkluaXRpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBob25ldGljczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TlQgQWNjb3VudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfTlRBY2NvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb2RlIDxlbT5Db2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgR3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtHcm91cCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0VtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWF4IFVuaXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVhayBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0RmluaXNoKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FuIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWNjcnVlIEF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY2NydWVBdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZWd1bGFyV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFBlciBVc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RQZXJVc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0UGVyVXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0IFZhcmlhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Db3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TVjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U1YoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDVigpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJDV1A8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9CQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYygpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNJbmFjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9va2luZyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSgpCi0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJhc2VsaW5lKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJhdGVzKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBzZWUgI2dldFJlc291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXNvdXJjZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMjZ2V0UmVzb3VyY2UgPGVtPlJlc291cmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlKCkKLQkgKiBAc2VlICNnZXRSZXNvdXJjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEIDxlbT5JRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldElEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBOdWxsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q3JlYXRlRGF0ZSA8ZW0+Q3JlYXRlIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDcmVhdGVEYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db250YWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnRhY3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29udGFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTIDxlbT5XQlM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5XQlM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldCUyBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlNMZXZlbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19XQlNMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdXRsaW5lIE51bWJlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJpb3JpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wIDxlbT5TdG9wPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RvcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdG9wKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlc3VtZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1Jlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVjdXJyaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVjdXJyaW5nKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXN0aW1hdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc01pbGVzdG9uZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1bW1hcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JpdGljYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19Dcml0aWNhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybHlTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcmx5IEZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZVN0YXJ0IDxlbT5MYXRlIFN0YXJ0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGF0ZSBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2goKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGF0ZUZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBWYXJpYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1N0YXJ0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaFZhcmlhbmNlIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1dvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RnJlZSBTbGFjazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRnJlZVNsYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvdGFsIFNsYWNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRvdGFsU2xhY2soKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfVG90YWxTbGFjaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19GaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdmVydGltZVdvcmsgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19PdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgU3RhcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbEZpbmlzaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRHVyYXRpb24gPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nV29yaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QUNXUDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNWPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NhbGVuZGFyVUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWFkbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19EZWFkbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZXZlbGluZyBEZWxheTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfSHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGlkZSBCYXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0hpZGVCYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Sb2xsdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUm9sbHVwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QkNXUzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CQ1dQPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1AoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfQkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1BoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlZGVjZXNzb3JMaW5rIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19QcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QmFzZWxpbmUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfQmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUNvZGUgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX091dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3MjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tzX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCA8ZW0+VGltZSBQZXJpb2Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Gcm9tIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUoKQotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVQZXJpb2RfRnJvbURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlKCkKLQkgKiBAc2VlICNnZXRUaW1lUGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX1RvRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VUlEIDxlbT5VSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVSUQoKQotCSAqIEBzZWUgI2dldFRpbWVwaGFzZWREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGltZXBoYXNlZERhdGFUeXBlX1VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFN0YXJ0KCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9TdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VW5pdCgpCi0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQoKQotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRWYWx1ZV9WYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0UGFyZW50VmFsdWVJRCA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVfRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIDxlbT5WYWx1ZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhbHVlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRJRCA8ZW0+SUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRWYWx1ZTIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhbHVlMl9EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QgPGVtPlZhbHVlIExpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZUxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3QjZ2V0VmFsdWUoKQotCSAqIEBzZWUgI2dldFZhbHVlTGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VmFsdWVMaXN0X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcyNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0R3JvdXAoKQotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRWYWx1ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhbHVlc19WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V0JTTWFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwgPGVtPkxldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGV2ZWwoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFdCU01hc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdCU01hc2tfVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZW5ndGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZXBhcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdCU01hc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19WZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNnZXRXQlNNYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNnZXRQcmVmaXgoKQotCSAqIEBzZWUgI2dldFdCU01hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0V0JTTWFzaygpCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdCU01hc2tzX1dCU01hc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2VlayBEYXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdlZWtEYXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0RGF5VHlwZSgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXZWVrRGF5X0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0VGltZVBlcmlvZCgpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRXb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFdvcmtpbmdUaW1lcygpCi0JICogQHNlZSAjZ2V0V2Vla0RheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XZWVrIERheXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXZWVrRGF5cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXMjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldlZWsgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cyNnZXRXZWVrRGF5KCkKLQkgKiBAc2VlICNnZXRXZWVrRGF5cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V2Vla0RheXNfV2Vla0RheSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmtpbmcgVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtpbmdUaW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUgPGVtPkZyb20gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZyb20gVGltZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0RnJvbVRpbWUoKQotCSAqIEBzZWUgI2dldFdvcmtpbmdUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtpbmdUaW1lX1RvVGltZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXMgPGVtPldvcmtpbmcgVGltZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JraW5nVGltZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSgpCi0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JraW5nVGltZXNfV29ya2luZ1RpbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+QWNjcnVlIEF0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BY2NydWUgQXQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWNjcnVlQXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWNjcnVlQXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSURfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScxNiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5BbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBbGlhc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRBbGlhc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5BdXRob3IgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+QXV0aG9yIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0F1dGhvcl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QXV0aG9yVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyA0IDUgNiA3IDggOSAxMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Jvb2tpbmdUeXBlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Qm9va2luZyBUeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQm9va2luZ1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkNhbGN1bGF0aW9uIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2FsY3VsYXRpb24gVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NhbGN1bGF0aW9uVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDYWxjdWxhdGlvblR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q2F0ZWdvcnkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2F0ZWdvcnlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb2RlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb2RlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbXBhbnkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29tcGFueSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wYW55Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb21wYW55VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db25zdHJhaW50IFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29uc3RyYWludCBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29uc3RyYWludFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldENvbnN0cmFpbnRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkNvbnRhY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29udGFjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250YWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDb250YWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+Q29zdCBSYXRlIFRhYmxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29zdFJhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0N1cnJlbmN5U3ltYm9sUG9zaXRpb25fLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkN1cnJlbmN5IFN5bWJvbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ3VycmVuY3lTeW1ib2xfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPScyMCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkRheSBUeXBlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGF5VHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RGVmYXVsdCBUYXNrIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWZhdWx0VGFza1R5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTE8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0R1cmF0aW9uRm9ybWF0Xy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTQ8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEdXJhdGlvbkZvcm1hdF8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREdXJhdGlvbkZvcm1hdFR5cGU1KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Vhcm5lZFZhbHVlTWV0aG9kXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5FbWFpbCBBZGRyZXNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkVtYWlsIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRW1haWxBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRml4ZWRDb3N0QWNjcnVhbF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBlbnVtZXJhdGlvbj0nMSAyIDMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+RlkgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0ZZU3RhcnREYXRlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkdyb3VwIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0dyb3VwXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRHcm91cFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtBZGRyZXNzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBBZGRyZXNzIFR5cGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rQWRkcmVzc18uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUyPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdIeXBlcmxpbmtfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkh5cGVybGluayBUeXBlMjwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nSHlwZXJsaW5rXy5fMl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5Jbml0aWFscyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Jbml0aWFscyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdJbml0aWFsc18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0SW5pdGlhbHNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TGFnIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xhZ0Zvcm1hdF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0xldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPSczIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0Xy5fMV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzMgNCA1IDYgNyA4IDkgMTAgMTEgMTIgMTkgMjAgMjEgMzUgMzYgMzcgMzggMzkgNDAgNDEgNDIgNDMgNDQgNTEgNTIgNTMnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hbmFnZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNYW5hZ2VyXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRNYW5hZ2VyVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01hdGVyaWFsTGFiZWxfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE1hdGVyaWFsTGFiZWxUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TmFtZSBUeXBlMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmFtZSBUeXBlMTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTmFtZV8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk5hbWUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05hbWVfLl8yXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXROYW1lVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5OYW1lIFR5cGUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OYW1lIFR5cGUzPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzI1NSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TmFtZVR5cGUzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+TmV3IFRhc2sgU3RhcnQgRGF0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05ld1Rhc2tTdGFydERhdGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+TlQgQWNjb3VudCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J05UQWNjb3VudF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUxMiciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0TlRBY2NvdW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVOdW1iZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE91dGxpbmVOdW1iZXJUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5QaG9uZXRpYyBBbGlhcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY0FsaWFzXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTAnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLlN0cmluZyA8ZW0+UGhvbmV0aWNzIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlBob25ldGljcyBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQaG9uZXRpY3NfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFBob25ldGljc1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5QcmVmaXggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UHJlZml4IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ByZWZpeF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzUwJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlJhdGUgVGFibGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JhdGVUYWJsZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0UmF0ZVRhYmxlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Sb2xsdXAgVHlwZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGx1cFR5cGVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFJvbGx1cFR5cGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1IDcnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQgVHlwZTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1N0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScxIDIgMyA0IDUgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YmplY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3ViamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTdWJqZWN0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRTdWJqZWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5TdWJwcm9qZWN0IE5hbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5sYW5nLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3VicHJvamVjdE5hbWVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZycgbWF4TGVuZ3RoPSc1MTInIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFN1YnByb2plY3ROYW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlRpdGxlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RpdGxlXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmcnIG1heExlbmd0aD0nNTEyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUaXRsZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5UeXBlIFR5cGUxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1R5cGVfLl8xXy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMCAxIDIgMyciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGUxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTI8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlMzwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fM18uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VHlwZSBUeXBlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VHlwZSBUeXBlNDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUeXBlXy5fNF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlR5cGUgVHlwZTU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlR5cGUgVHlwZTU8L2VtPicuCi0JICogQHNlZSBqYXZhLm1hdGguQmlnSW50ZWdlcgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLm1hdGguQmlnSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVHlwZV8uXzVfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRUeXBlVHlwZTUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLmxhbmcuU3RyaW5nIDxlbT5VSUQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VUlEIFR5cGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VJRF8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nJyBtYXhMZW5ndGg9JzE2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRVSURUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPlVuaXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VW5pdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgamF2YS5tYXRoLkJpZ0ludGVnZXIKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS5tYXRoLkJpZ0ludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1VuaXRfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDUgOCciIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VW5pdFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZWxpc3RTb3J0T3JkZXJfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEnIiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFZhbHVlbGlzdFNvcnRPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V2VlayBTdGFydCBEYXkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXZWVrU3RhcnREYXlfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzIDQgNSA2JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXZWVrU3RhcnREYXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5tYXRoLkJpZ0ludGVnZXIgPGVtPldvcmsgQ29udG91ciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Xb3JrIENvbnRvdXIgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrQ29udG91cl8uX3R5cGUnIGJhc2VUeXBlPSdodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlcicgZW51bWVyYXRpb249JzAgMSAyIDMgNCA1IDYgNyA4JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlciA8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrRm9ybWF0Xy5fdHlwZScgYmFzZVR5cGU9J2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyJyBlbnVtZXJhdGlvbj0nMSAyIDMgNCA1JyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubWF0aC5CaWdJbnRlZ2VyIDxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPldvcmsgR3JvdXAgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIGphdmEubWF0aC5CaWdJbnRlZ2VyCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubWF0aC5CaWdJbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrR3JvdXBfLl90eXBlJyBiYXNlVHlwZT0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXInIGVudW1lcmF0aW9uPScwIDEgMiAzJyIgCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRXb3JrR3JvdXBUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNc3Byb2plY3RGYWN0b3J5IGdldE1zcHJvamVjdEZhY3RvcnkoKTsKLQotfSAvL01zcHJvamVjdFBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxOWFmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RmllbGROYW1lIDxlbT5GaWVsZCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEFsaWFzIDxlbT5BbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRQaG9uZXRpY0FsaWFzIDxlbT5QaG9uZXRpYyBBbGlhczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRWYWx1ZXMgPGVtPlZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPGVtPkVudGVycHJpc2UgT3V0bGluZSBDb2RlIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNBbGxMZXZlbHNSZXF1aXJlZCA8ZW0+QWxsIExldmVscyBSZXF1aXJlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0TWFza3MgPGVtPk1hc2tzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J091dGxpbmVDb2RlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpZWxkSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGRJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpZWxkSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpZWxkIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RmllbGROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEZpZWxkTmFtZSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmllbGQgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaWVsZE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsaWFzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfQWxpYXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaG9uZXRpYyBBbGlhczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHByb251bmNpYXRpb24gb2YgdGhlIGFsaWFzIG9mIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpYyBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfUGhvbmV0aWNBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQaG9uZXRpY0FsaWFzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljQWxpYXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0UGhvbmV0aWNBbGlhcyA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBob25ldGljIEFsaWFzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaG9uZXRpY0FsaWFzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZXMoVmFsdWVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX1ZhbHVlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhbHVlcyBnZXRWYWx1ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjZ2V0VmFsdWVzIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoVmFsdWVzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGVycHJpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGlzIGFuIGVudGVycHJpc2UgY3VzdG9tIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNFbnRlcnByaXNlIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0RW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldEVudGVycHJpc2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVudGVycHJpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0VudGVycHJpc2UgPGVtPkVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEVudGVycHJpc2UoKQotCSAqIEBzZWUgI2lzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBjdXN0b20gb3V0bGluZSBjb2RlIGNhbiBiZSB1c2VkIGJ5IHRoZSBSZXNvdXJjZSBTdWJzdGl0dXRpb24gV2l6YXJkIGluIE1pY3Jvc29mdCBQcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZV9SZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3Vuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAc2VlICNzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIDxlbT5SZXNvdXJjZSBTdWJzdGl0dXRpb24gRW5hYmxlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQHNlZSAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKQotCSAqIEBzZWUgI3NldFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZWFmIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVhZiBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICN1bnNldExlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0xlYWZPbmx5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZWFmT25seScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMZWFmT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZWFmT25seSgpCi0JICogQHNlZSAjdW5zZXRMZWFmT25seSgpCi0JICogQHNlZSAjaXNMZWFmT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNMZWFmT25seSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldExlYWZPbmx5KCkKLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAc2VlICNzZXRMZWFmT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TGVhZk9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0xlYWZPbmx5IDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxlYWYgT25seTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGVhZk9ubHkoKQotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBzZWUgI3NldExlYWZPbmx5KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZWFmT25seSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsIExldmVscyBSZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbGxMZXZlbHNSZXF1aXJlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICN1bnNldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNpc0FsbExldmVsc1JlcXVpcmVkKCkKLQkgKiBAc2VlICNzZXRBbGxMZXZlbHNSZXF1aXJlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjaXNBbGxMZXZlbHNSZXF1aXJlZCgpCi0JICogQHNlZSAjc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFsbExldmVsc1JlcXVpcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHZhbHVlcyBzcGVjaWZpZWQgbXVzdCBjb21lIGZyb20gdmFsdWVzIHRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlX09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09ubHlUYWJsZVZhbHVlc0FsbG93ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjdW5zZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQHNlZSAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkKLQkgKiBAc2VlICNzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFza3MoTWFza3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVfTWFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1hc2tzIGdldE1hc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlI2dldE1hc2tzIDxlbT5NYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXNrcyhNYXNrcyB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDMwMWIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTIuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl8xXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlMiBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotfSAvLyBPdXRsaW5lQ29kZTIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2RlMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjVlODMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvT3V0bGluZUNvZGUzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZTMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ1IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTMjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlMygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nT3V0bGluZUNvZGVfLl8yXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE91dGxpbmVDb2RlMyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGUzX1VJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaWVsZCBJRCBpbiB0aGUgbG9jYWxpc2VkIGxhbmd1YWdlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaWVsZElEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRPdXRsaW5lQ29kZTNfRmllbGRJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGaWVsZElEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEZpZWxkSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWVsZCBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmllbGRJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIG91dGxpbmUgY29kZSBjb2xsZWN0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gT3V0bGluZUNvZGUzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9PdXRsaW5lQ29kZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ODYyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L091dGxpbmVDb2Rlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlcyNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRsaW5lQ29kZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0bGluZUNvZGVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0bGluZSBDb2RlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCBvdXRsaW5lIGNvZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIENvZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0T3V0bGluZUNvZGVzX091dGxpbmVDb2RlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi19IC8vIE91dGxpbmVDb2RlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUHJlZGVjZXNzb3JMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2FiN2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9QcmVkZWNlc3NvckxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByZWRlY2Vzc29yTGluay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNpc0Nyb3NzUHJvamVjdCA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMaW5rTGFnIDxlbT5MaW5rIExhZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGFnRm9ybWF0IDxlbT5MYWcgRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmVkZWNlc3NvckxpbmtfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJlZGVjZXNzb3JMaW5rIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3IgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByZWRlY2Vzc29yIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVkZWNlc3NvclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19QcmVkZWNlc3NvclVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlZGVjZXNzb3JVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFByZWRlY2Vzc29yVUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRQcmVkZWNlc3NvclVJRCA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVkZWNlc3NvclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBsaW5rIHR5cGUuICBWYWx1ZXMgYXJlIDA9RkYsIDE9RlMsIDI9U0YgYW5kIDM9U1MKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcm9zcyBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcmVkZWNlc3NvciBpcyBwYXJ0IG9mIGFub3RoZXIgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nyb3NzUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDcm9zc1Byb2plY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcm9zc1Byb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENyb3NzUHJvamVjdCgpCi0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0Q3Jvc3NQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rI2lzQ3Jvc3NQcm9qZWN0IDxlbT5Dcm9zcyBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDcm9zc1Byb2plY3QoKQotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRDcm9zc1Byb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENyb3NzUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3Jvc3MgUHJvamVjdCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZXh0ZXJuYWwgcHJlZGVjZXNzb3IgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByZWRlY2Vzc29yTGlua19Dcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Nyb3NzUHJvamVjdE5hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcm9zcyBQcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyb3NzUHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgTGFnPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGxhZyBpbiB0ZW50aHMgb2YgYSBtaW51dGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBMYWc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExpbmtMYWcoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcmVkZWNlc3NvckxpbmtfTGlua0xhZygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGlua0xhZycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGlua0xhZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgTGFnPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMaW5rTGFnKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMaW5rTGFnKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGFnIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgbGFnIGZvcm1hdC4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFnIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGFnRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJlZGVjZXNzb3JMaW5rX0xhZ0Zvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkxhZ0Zvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xhZ0Zvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGFnRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluayNnZXRMYWdGb3JtYXQgPGVtPkxhZyBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhZyBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExhZ0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGFnRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi19IC8vIFByZWRlY2Vzc29yTGluawpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Qcm9qZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg4MDcwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Byb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9qZWN0LmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUaXRsZSA8ZW0+VGl0bGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdWJqZWN0IDxlbT5TdWJqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2F0ZWdvcnkgPGVtPkNhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q29tcGFueSA8ZW0+Q29tcGFueTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1hbmFnZXIgPGVtPk1hbmFnZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBdXRob3IgPGVtPkF1dGhvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFJldmlzaW9uIDxlbT5SZXZpc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JpdGljYWxTbGFja0xpbWl0IDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbmN5RGlnaXRzIDxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlckRheSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWludXRlc1BlcldlZWsgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREYXlzUGVyTW9udGggPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdFRhc2tUeXBlIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXb3JrRm9ybWF0IDxlbT5Xb3JrIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEVhcm5lZFZhbHVlTWV0aG9kIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3ByZWFkUGVyY2VudENvbXBsZXRlIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V2Vla1N0YXJ0RGF5IDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRTdGF0dXNEYXRlIDxlbT5TdGF0dXMgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9saW5rIDxlbT5BdXRvbGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza0VWTWV0aG9kIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBY3R1YWxzSW5TeW5jIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXQlNNYXNrcyA8ZW0+V0JTIE1hc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2plY3RfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvamVjdCBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVUlEVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUzIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaXRsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGl0bGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGl0bGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaXRsZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpdGxlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UaXRsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpdGxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWJqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3ViamVjdCBvZiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3ViamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TdWJqZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3ViamVjdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YmplY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3ViamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN1YmplY3QgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YmplY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YmplY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRlZ29yeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYXRlZ29yeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhdGVnb3J5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2F0ZWdvcnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDYXRlZ29yeSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3J5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbXBhbnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb21wYW55IHRoYXQgb3ducyB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tcGFueTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tcGFueShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Db21wYW55KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ29tcGFueVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbXBhbnknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tcGFueSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbXBhbnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbXBhbnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbmFnZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtYW5hZ2VyIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5hZ2VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYW5hZ2VyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X01hbmFnZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYW5hZ2VyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuYWdlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0TWFuYWdlciA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFuYWdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFuYWdlcihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9BdXRob3IoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdXRob3JUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRob3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXV0aG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHByb2plY3Qgd2FzIGNyZWF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV2aXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgYSBwcm9qZWN0IGhhcyBiZWVuIHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXZpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV2aXNpb24oQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1JldmlzaW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXZpc2lvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldmlzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXZpc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV2aXNpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MYXN0IFNhdmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBsYXN0IHNhdmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXN0IFNhdmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXN0U2F2ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTGFzdFNhdmVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGFzdFNhdmVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhc3RTYXZlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldExhc3RTYXZlZCA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGFzdCBTYXZlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXN0U2F2ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcHJvamVjdCBpcyBzY2hkdWxlZCBmcm9tIHRoZSBzdGFydCBkYXRlIG9yIGZpbmlzaCBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NjaGVkdWxlRnJvbVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NjaGVkdWxlRnJvbVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTY2hlZHVsZUZyb21TdGFydCA8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZWR1bGUgRnJvbSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQHNlZSAjaXNTY2hlZHVsZUZyb21TdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NoZWR1bGVGcm9tU3RhcnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU2NoZWR1bGVGcm9tU3RhcnQgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAc2VlICNzZXRTY2hlZHVsZUZyb21TdGFydChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyB0cnVlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydERhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbmlzaCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIGZhbHNlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRGaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GWSBTdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBGaXNjYWwgWWVhciBzdGFydGluZyBtb250aC4gVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksIAotCSAqIAkJCQkJCTg9QXVndXN0LCA5PVNlcHRlbWJlciwgMTA9T2N0b2JlciwgMTE9Tm92ZW1iZXIsIDEyPURlY2VtYmVyIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGWVN0YXJ0RGF0ZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRllTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5GWVN0YXJ0RGF0ZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZZU3RhcnREYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEZZU3RhcnREYXRlIDxlbT5GWSBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GWSBTdGFydCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGWVN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RllTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Dcml0aWNhbCBTbGFjayBMaW1pdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBhc3QgaXRzIGVuZCBkYXRlIHRoYXQgYSB0YXNrIGNhbiBnbyAKLQkgKiAJCQkJCQliZWZvcmUgTWljcm9zb2Z0IFByb2plY3QgbWFya3MgdGhhdCB0YXNrIGFzIGEgY3JpdGljYWwgdGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcml0aWNhbFNsYWNrTGltaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1cnJlbmN5IERpZ2l0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBEaWdpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1cnJlbmN5RGlnaXRzKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lEaWdpdHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lEaWdpdHMgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJyZW5jeSBTeW1ib2w8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjdXJyZW5jeSBzeW1ib2wgdXNlZCBpbiB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DdXJyZW5jeVN5bWJvbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ3VycmVuY3lTeW1ib2wnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3VycmVuY3lTeW1ib2woKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRDdXJyZW5jeVN5bWJvbCA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2w8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXJyZW5jeVN5bWJvbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbmN5IHN5bWJvbC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW5jeVN5bWJvbFBvc2l0aW9uJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbiA8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhciBVSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0IGNhbGVuZGFyLiAgUmVmZXJzIHRvIGEgdmFsaWQgVUlEIGluIHRoZSAKLQkgKiAJCQkJCQlDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBTdGFydCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFydFRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRTdGFydFRpbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFydFRpbWUgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0U3RhcnRUaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpbmlzaCBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRmluaXNoIFRpbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRGaW5pc2hUaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5UaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0RmluaXNoVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXREZWZhdWx0RmluaXNoVGltZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaW5pc2hUaW1lIDxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IEZpbmlzaCBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0RmluaXNoVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdEZpbmlzaFRpbWUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbnV0ZXMgUGVyIERheTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlckRheSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWludXRlc1BlckRheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNaW51dGVzUGVyRGF5KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWludXRlcyBQZXIgV2VlazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTWludXRlc1BlcldlZWsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01pbnV0ZXNQZXJXZWVrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRNaW51dGVzUGVyV2VlaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWludXRlc1BlcldlZWsoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXlzIFBlciBNb250aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheXNQZXJNb250aChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGF5c1Blck1vbnRoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlzUGVyTW9udGgnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheXNQZXJNb250aCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERheXNQZXJNb250aCA8ZW0+RGF5cyBQZXIgTW9udGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRheXMgUGVyIE1vbnRoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheXNQZXJNb250aChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgVGFzayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPUZpeGVkIFVuaXRzLCAxPUZpeGVkIER1cmF0aW9uLCAyPUZpeGVkIFdvcmsuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRUYXNrVHlwZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRGVmYXVsdFRhc2tUeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0VGFza1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0VGFza1R5cGUgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFRhc2tUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZnJvbSB3aGVyZSBmaXhlZCBjb3N0cyBhcmUgYWNjcnVlZC4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9U3RhcnQsIDI9UHJvcmF0ZWQsIDM9RW5kCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRGaXhlZENvc3RBY2NydWFsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsIDxlbT5EZWZhdWx0IEZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZWZhdWx0U3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBzZWUgI3Vuc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQHNlZSAjc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRTdGFuZGFyZFJhdGUgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBTdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0U3RhbmRhcmRSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpCi0JICogQHNlZSAjdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRPdmVydGltZVJhdGUgPGVtPkRlZmF1bHQgT3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAc2VlICNzZXREZWZhdWx0T3ZlcnRpbWVSYXRlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBzZWUgI3NldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbiBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgCi0JICogCQkJCQkJMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCAKLQkgKiAJCQkJCQk1Mz1udWxsLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9EdXJhdGlvbkZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkR1cmF0aW9uRm9ybWF0VHlwZTUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0R1cmF0aW9uRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHdvcmsgdW5pdCBmb3JtYXQuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29ya0Zvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV29ya0Zvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtGb3JtYXRUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXb3JrRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIG9yIG5vdCBhY3R1YWwgY29zdHMgYXJlIGVkaXRhYmxlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjdW5zZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9FZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWRpdGFibGVBY3R1YWxDb3N0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICN1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRWRpdGFibGVBY3R1YWxDb3N0cyA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEVkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjc2V0RWRpdGFibGVBY3R1YWxDb3N0cyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNFZGl0YWJsZUFjdHVhbENvc3RzIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQHNlZSAjaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkKLQkgKiBAc2VlICNzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib25vciBDb25zdHJhaW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICN1bnNldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJ0cnVlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0hvbm9yQ29uc3RyYWludHMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3Vuc2V0SG9ub3JDb25zdHJhaW50cygpCi0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIb25vckNvbnN0cmFpbnRzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNIb25vckNvbnN0cmFpbnRzIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI3NldEhvbm9yQ29uc3RyYWludHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEhvbm9yQ29uc3RyYWludHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgZWFybmVkIHZhbHVlLiBWYWx1ZXMgYXJlOiAKLQkgKiAJCQkJCQkwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFYXJuZWRWYWx1ZU1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RWFybmVkVmFsdWVNZXRob2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gY2FsY3VsYXRlIHN1YnRhc2tzIGFzIHN1bW1hcnkgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPGVtPkluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKQotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAc2VlICNzZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbXVsdGlwbGUgY3JpdGljYWwgcGF0aHMgYXJlIGNhbGN1bGF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjdW5zZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI3NldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTXVsdGlwbGVDcml0aWNhbFBhdGhzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc011bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICN1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE11bHRpcGxlQ3JpdGljYWxQYXRocyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBzZWUgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkKLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQHNlZSAjc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VmZm9ydERyaXZlbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFZmZvcnREcml2ZW4gPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXROZXdUYXNrc0VmZm9ydERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byBzaG93IHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24gYnkgZGVmYXVsdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOZXdUYXNrc0VzdGltYXRlZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0TmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNOZXdUYXNrc0VzdGltYXRlZCA8ZW0+TmV3IFRhc2tzIEVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc05ld1Rhc2tzRXN0aW1hdGVkIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjaXNOZXdUYXNrc0VzdGltYXRlZCgpCi0JICogQHNlZSAjc2V0TmV3VGFza3NFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE5ld1Rhc2tzRXN0aW1hdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4idHJ1ZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcGxpdHNJblByb2dyZXNzVGFza3MgPGVtPlNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKQotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAc2VlICNzZXRTcGxpdHNJblByb2dyZXNzVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ByZWFkIEFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQHNlZSAjaXNTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZEFjdHVhbENvc3QgPGVtPlNwcmVhZCBBY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRBY3R1YWxDb3N0KCkKLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBzZWUgI3NldFNwcmVhZEFjdHVhbENvc3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHBlcmNlbnQgY29tcGxldGUgaXMgc3ByZWFkIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICN1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9TcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTcHJlYWRQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3Vuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUgPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI3NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNwcmVhZCBQZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAc2VlICNzZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFzayBVcGRhdGVzIFJlc291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHVwZGF0ZXMgdG8gdGFza3MgdXBkYXRlIHJlc291cmNlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFza1VwZGF0ZXNSZXNvdXJjZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICN1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzVGFza1VwZGF0ZXNSZXNvdXJjZSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFRhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjc2V0VGFza1VwZGF0ZXNSZXNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNUYXNrVXBkYXRlc1Jlc291cmNlIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQHNlZSAjaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkKLQkgKiBAc2VlICNzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXNjYWwgWWVhciBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIGZpc2NhbCB5ZWFyIG51bWJlcmluZwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Zpc2NhbFllYXJTdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmlzY2FsWWVhclN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0Zpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlzY2FsIFllYXIgU3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICN1bnNldEZpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBzZWUgI2lzRmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNzZXRGaXNjYWxZZWFyU3RhcnQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpc2NhbFllYXJTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNGaXNjYWxZZWFyU3RhcnQgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RmlzY2FsWWVhclN0YXJ0KCkKLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQHNlZSAjc2V0RmlzY2FsWWVhclN0YXJ0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRGaXNjYWxZZWFyU3RhcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldlZWsgU3RhcnQgRGF5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9U3VuZGF5LCAxPU1vbmRheSwgMj1UdWVzZGF5LCAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBTdGFydCBEYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFdlZWtTdGFydERheShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfV2Vla1N0YXJ0RGF5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla1N0YXJ0RGF5VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla1N0YXJ0RGF5JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRXZWVrU3RhcnREYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRXZWVrU3RhcnREYXkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5XZWVrIFN0YXJ0IERheTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXZWVrU3RhcnREYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqIAkJCQkJCQlTcGVjaWZpZXMgd2hldGhlciB0aGUgZW5kIG9mIGNvbXBsZXRlZCBwb3J0aW9ucyBvZiB0YXNrcyBzY2hlZHVsZWQgdG8gYmVnaW4gYWZ0ZXIgdGhlIAotCSAqIAkJCQkJCQlzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLgotCSAqIAkJCQkJCQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlQ29tcGxldGVkRW5kc0JhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2sgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogCi0JICogCQkJCQkJCVNwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgCi0JICogCQkJCQkJCXN0YXR1cyBkYXRlIGJ1dCBiZWd1biBlYXJseSBzaG91bGQgYmUgbW92ZWQgYmFjayB0byB0aGUgc3RhdHVzIGRhdGUuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjdW5zZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQHNlZSAjc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVndW4gbGF0ZSAKLQkgKiAJCQkJCQkJc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICN1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ImZhbHNlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiAKLQkgKiAJCQkJCQkJU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgCi0JICogCQkJCQkJCWJlZm9yZSB0aGUgc3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGxhdGUgc2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4KLQkgKiAJCQkJCQkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI3Vuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKQotCSAqIEBzZWUgI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkKLQkgKiBAc2VlICNzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9QmFzZWxpbmUsIDE9QmFzZWxpbmUgMSwgMj1CYXNlbGluZSAyLCAzPUJhc2VsaW5lIDMsIDQ9QmFzZWxpbmUgNCwgNT1CYXNlbGluZSA1LCA2PUJhc2VsaW5lIDYsIAotCSAqIAkJCQkJCTc9QmFzZWxpbmUgNywgOD1CYXNlbGluZSA4LCA5PUJhc2VsaW5lIDksIDEwPUJhc2VsaW5lIDEwCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyByZXNvdXJjZXMgdG8gdGhlIHJlc291cmNlIHBvb2wuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvIEFkZCBOZXcgUmVzb3VyY2VzIEFuZCBUYXNrczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3Vuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpCi0JICogQHNlZSAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI3NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKQotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAc2VlICNzZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhdHVzIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhdHVzIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXR1c0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfU3RhdHVzRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXR1c0RhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RhdHVzRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFN0YXR1c0RhdGUgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGF0dXMgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhdHVzRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhdHVzRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VycmVudCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3VycmVudERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQ3VycmVudERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDdXJyZW50RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDdXJyZW50RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEN1cnJlbnREYXRlIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnJlbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3VycmVudERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEN1cnJlbnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkIGJ5IGEgUHJvamVjdCBTZXJ2ZXIgdXNlciBhcyBvcHBvc2VkIHRvIGFuIE5UIHVzZXIuCi0JICogCQkJCQkJCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9NaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAc2VlICNzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKQotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQHNlZSAjc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0b2xpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdG8gYXV0b2xpbmsgaW5zZXJ0ZWQgb3IgbW92ZWQgdGFza3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfQXV0b2xpbmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0F1dG9saW5rJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0F1dG9saW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dG9saW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICN1bnNldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRvbGluayhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEF1dG9saW5rKCkKLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAc2VlICNzZXRBdXRvbGluayhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QXV0b2xpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQXV0b2xpbmsgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRvbGluazwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QXV0b2xpbmsoKQotCSAqIEBzZWUgI2lzQXV0b2xpbmsoKQotCSAqIEBzZWUgI3NldEF1dG9saW5rKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRBdXRvbGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmV3IFRhc2sgU3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZGF0ZSBmb3IgbmV3IHRhc2tzIHN0YXJ0LiAgVmFsdWVzIGFyZTogCi0JICogCQkJCQkJMD1Qcm9qZWN0IFN0YXJ0IERhdGUsIDE9Q3VycmVudCBEYXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OZXdUYXNrU3RhcnREYXRlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTmV3VGFza1N0YXJ0RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldE5ld1Rhc2tTdGFydERhdGUgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5ld1Rhc2tTdGFydERhdGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVmYXVsdCBlYXJuZWQgdmFsdWUgbWV0aG9kIGZvciB0YXNrcy4gIFZhbHVlcyBhcmU6IAotCSAqIAkJCQkJCTA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0RlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFRhc2tFVk1ldGhvZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldERlZmF1bHRUYXNrRVZNZXRob2QgPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBwcm9qZWN0IFhNTCB3YXMgZWRpdGVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCA8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjdW5zZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQHNlZSAjaXNQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkIDxlbT5Qcm9qZWN0IEV4dGVybmFsbHkgRWRpdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkKLQkgKiBAc2VlICNzZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIENyZWF0aW9uIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfRXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlbmRlZENyZWF0aW9uRGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldEV4dGVuZGVkQ3JlYXRpb25EYXRlIDxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlbmRlZCBDcmVhdGlvbiBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbHMgSW4gU3luYzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBhbGwgYWN0dWFsIHdvcmsgaGFzIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbHNJblN5bmMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjdW5zZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbHNJblN5bmMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FjdHVhbHNJblN5bmMgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBY3R1YWxzSW5TeW5jKCkKLQkgKiBAc2VlICNpc0FjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI3NldEFjdHVhbHNJblN5bmMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFjdHVhbHNJblN5bmMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFjdHVhbHNJblN5bmMoKQotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQHNlZSAjc2V0QWN0dWFsc0luU3luYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWN0dWFsc0luU3luYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0byByZW1vdmUgYWxsIGZpbGUgcHJvcGVydGllcyBvbiBzYXZlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfUmVtb3ZlRmlsZVByb3BlcnRpZXMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbW92ZUZpbGVQcm9wZXJ0aWVzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjdW5zZXRSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQHNlZSAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzUmVtb3ZlRmlsZVByb3BlcnRpZXMgPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbW92ZSBGaWxlIFByb3BlcnRpZXM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNzZXRSZW1vdmVGaWxlUHJvcGVydGllcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkbWluIFByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHByb2plY3QgaXMgYW4gYWRtaW5pc3RyYXRpdmUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRtaW4gUHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3Vuc2V0QWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRtaW5Qcm9qZWN0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZG1pbiBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNpc0FkbWluUHJvamVjdCA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAc2VlICNzZXRBZG1pblByb2plY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEFkbWluUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjaXNBZG1pblByb2plY3QgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkbWluIFByb2plY3Q8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEFkbWluUHJvamVjdCgpCi0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBzZWUgI3NldEFkbWluUHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBvdXRsaW5lIGNvZGUgZGVmaW5pdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LiAgVGhlc2UgY29kZXMgbWF5IGJlIGFzc29jaWF0ZWQgb25seSB3aXRoIHRoaXMgcHJvamVjdCwgb3IgbWF5IGJlIGNvbW1vbiBhbW9uZyBzZXZlcmFsIHByb2plY3RzIChlbnRlcnByaXNlIGNvZGVzKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dGxpbmVDb2RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRPdXRsaW5lQ29kZXMgPGVtPk91dGxpbmUgQ29kZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE91dGxpbmVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XQlMgTWFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0YWJsZSBvZiBlbnRyaWVzIHRoYXQgZGVmaW5lIHRoZSBvdXRsaW5lIGNvZGUgbWFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIE1hc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRXQlNNYXNrcyhXQlNNYXNrcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X1dCU01hc2tzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV0JTTWFza3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXQlNNYXNrcyBnZXRXQlNNYXNrcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0I2dldFdCU01hc2tzIDxlbT5XQlMgTWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUyBNYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCU01hc2tzKFdCU01hc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAKLQkgKiAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRQcm9qZWN0X0V4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4dGVuZGVkQXR0cmlidXRlcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgCi0JICogICAgICAgICBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhbGVuZGFycyhDYWxlbmRhcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9DYWxlbmRhcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDYWxlbmRhcnMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDYWxlbmRhcnMgZ2V0Q2FsZW5kYXJzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0Q2FsZW5kYXJzIDxlbT5DYWxlbmRhcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhcnMoQ2FsZW5kYXJzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB0YXNrcyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhc2tzKFRhc2tzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFByb2plY3RfVGFza3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUYXNrcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tzIGdldFRhc2tzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2tzKFRhc2tzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4KLQkgKiAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNvdXJjZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlc291cmNlcyhSZXNvdXJjZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9SZXNvdXJjZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNvdXJjZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVzb3VyY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNvdXJjZXMoUmVzb3VyY2VzIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBhc3NpZ25tZW50cyB0aGF0IG1ha2UgdXAgdGhlIHByb2plY3QuCi0JICogICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Fzc2lnbm1lbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXNzaWdubWVudHMgZ2V0QXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgdmFsdWUpOwotCi19IC8vIFByb2plY3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTQ4MDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSYXRlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc1RvIDxlbT5SYXRlcyBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmF0ZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXRlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZXMgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYXRlc0Zyb20oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfUmF0ZXNGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSYXRlc0Zyb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRSYXRlc0Zyb20gPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzIEZyb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNGcm9tKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlcyBUbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhc3QgZGF0ZSB0aGF0IHRoZSByYXRlIGlzIGVmZmVjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZXNUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlc1RvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JhdGVzVG8nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmF0ZXNUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYXRlcyBUbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZXNUbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXNUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmF0ZSBUYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1BLCAxPUIsIDI9QywgMz1ELCA0PUUKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmF0ZVRhYmxlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZV9SYXRlVGFibGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlVGFibGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlVGFibGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFJhdGVUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldFJhdGVUYWJsZSA8ZW0+UmF0ZSBUYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZSBUYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYXRlVGFibGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFuZGFyZCBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3RhbmRhcmQgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFuZGFyZFJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX1N0YW5kYXJkUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRTdGFuZGFyZFJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfU3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3RhbmRhcmRSYXRlRm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBSYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSYXRlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lUmF0ZUZvcm1hdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBQZXIgVXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi19IC8vIFJhdGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvUmF0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkN2VkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1JhdGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJhdGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXMjZ2V0UmF0ZSA8ZW0+UmF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJhdGVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSYXRlc18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSYXRlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNvdXJjZSBkdXJpbmcgdGhhdCBwZXJpb2QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmF0ZXNfUmF0ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIgdXBwZXI9IjI1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmF0ZSgpOwotCi19IC8vIFJhdGVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjRmOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEluaXRpYWxzIDxlbT5Jbml0aWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROVEFjY291bnQgPGVtPk5UIEFjY291bnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya0dyb3VwIDxlbT5Xb3JrIEdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEVtYWlsQWRkcmVzcyA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF4VW5pdHMgPGVtPk1heCBVbml0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWNjcnVlQXQgPGVtPkFjY3J1ZSBBdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlZ3VsYXJXb3JrIDxlbT5SZWd1bGFyIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0IDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZUNvc3QgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFBlclVzZSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q3JlYXRpb25EYXRlIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmF0ZXMgPGVtPlJhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2UgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRVSUQgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcG9zaXRpb24gaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBsaXN0IG9mIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9JRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldElEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTmFtZVR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOYW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yawotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9UeXBlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVHlwZVR5cGU0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzTnVsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNOdWxsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzTnVsbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBzZWUgI3NldElzTnVsbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNOdWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGluaXRpYWxzIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdGlhbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0luaXRpYWxzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSW5pdGlhbHNUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbml0aWFscycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbml0aWFscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5pdGlhbHMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBob25ldGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBob25ldGljIHNwZWxsaW5nIG9mIHRoZSByZXNvdXJjZSBuYW1lLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaG9uZXRpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBob25ldGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUGhvbmV0aWNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGhvbmV0aWNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBob25ldGljcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQaG9uZXRpY3MgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGhvbmV0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBob25ldGljcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TlQgQWNjb3VudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIE5UIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROVEFjY291bnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX05UQWNjb3VudCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk5UQWNjb3VudFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05UQWNjb3VudCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROVEFjY291bnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OVCBBY2NvdW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROVEFjY291bnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF0ZXJpYWwgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfTWF0ZXJpYWxMYWJlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hdGVyaWFsTGFiZWxUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXRlcmlhbExhYmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1hdGVyaWFsTGFiZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0TWF0ZXJpYWxMYWJlbCA8ZW0+TWF0ZXJpYWwgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hdGVyaWFsIExhYmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXRlcmlhbExhYmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXRlcmlhbExhYmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29kZSBvciBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29kZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29kZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNvZGVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb2RlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29kZSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29kZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R3JvdXAoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdHcm91cCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JvdXAoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgR3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHdvcmtncm91cCB0byB3aGljaCB0aGUgcmVzb3VyY2UgYmVsb25ncy4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPURlZmF1bHQsIDE9Tm9uZSwgMj1FbWFpbCwgMz1XZWIKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIEdyb3VwPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrR3JvdXAoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JrR3JvdXBUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrR3JvdXAnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrR3JvdXAgPGVtPldvcmsgR3JvdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgR3JvdXA8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya0dyb3VwKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW1haWwgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVtYWlsQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRW1haWxBZGRyZXNzVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRW1haWxBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVtYWlsIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RW1haWxBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmsoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEh5cGVybGluayA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkb2N1bWVudCBib29rbWFyayBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0h5cGVybGlua1N1YkFkZHJlc3MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWF4IFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IjEuMCI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXRzIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI3NldE1heFVuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX01heFVuaXRzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iMS4wIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYXhVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNYXhVbml0cygpCi0JICogQHNlZSAjdW5zZXRNYXhVbml0cygpCi0JICogQHNlZSAjZ2V0TWF4VW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1heFVuaXRzKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRNYXhVbml0cyA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldE1heFVuaXRzKCkKLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQHNlZSAjc2V0TWF4VW5pdHMoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRNYXhVbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1heCBVbml0czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TWF4VW5pdHMoKQotCSAqIEBzZWUgI2dldE1heFVuaXRzKCkKLQkgKiBAc2VlICNzZXRNYXhVbml0cyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1heFVuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZWFrIFVuaXRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFyZ2VzdCBudW1iZXIgb2YgdW5pdHMgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGF0IGFueSB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1BlYWtVbml0cygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlYWtVbml0cycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldFBlYWtVbml0cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRQZWFrVW5pdHMgPGVtPlBlYWsgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlYWsgVW5pdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0UGVha1VuaXRzKCkKLQkgKiBAc2VlICN1bnNldFBlYWtVbml0cygpCi0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZWFrVW5pdHMoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlYWtVbml0cyA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZWFrIFVuaXRzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRQZWFrVW5pdHMoKQotCSAqIEBzZWUgI2dldFBlYWtVbml0cygpCi0JICogQHNlZSAjc2V0UGVha1VuaXRzKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UGVha1VuaXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVyQWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyQWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNPdmVyQWxsb2NhdGVkIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNpc092ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI3NldE92ZXJBbGxvY2F0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFibGUgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZpcnN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVGcm9tKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFibGVGcm9tKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmxlRnJvbScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEF2YWlsYWJsZUZyb20gPGVtPkF2YWlsYWJsZSBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgRnJvbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXZhaWxhYmxlRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXZhaWxhYmxlRnJvbShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXZhaWxhYmxlIFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGFzdCBkYXRlIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmxlIFRvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdmFpbGFibGVUbyhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQXZhaWxhYmxlVG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBdmFpbGFibGVUbycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBdmFpbGFibGVUbygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFibGVUbyA8ZW0+QXZhaWxhYmxlIFRvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdmFpbGFibGUgVG88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVUbyhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FuIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYW4gTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3Vuc2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FuTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbkxldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0NhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENhbkxldmVsKCkKLQkgKiBAc2VlICN1bnNldENhbkxldmVsKCkKLQkgKiBAc2VlICNpc0NhbkxldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYW5MZXZlbChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0NhbkxldmVsIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q2FuTGV2ZWwoKQotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBzZWUgI3NldENhbkxldmVsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDYW5MZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzQ2FuTGV2ZWwgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FuIExldmVsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDYW5MZXZlbCgpCi0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQHNlZSAjc2V0Q2FuTGV2ZWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldENhbkxldmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2NydWUgQXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyBjb3N0IGlzIGFjY3J1ZWQgYWdhaW5zdCB0aGUgcmVzb3VyY2UuIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2NydWUgQXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjY3J1ZUF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BY2NydWVBdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWNjcnVlQXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEFjY3J1ZUF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY3J1ZSBBdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjY3J1ZUF0KEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0V29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZ3VsYXIgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVndWxhcldvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVndWxhciBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVndWxhcldvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ1dvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiBhY3R1YWwgb3ZlcnRpbWUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lV29yaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFtb3VudCBvZiByZW1haW5pbmcgb3ZlcnRpbWUgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2Ugb2Ygd29yayBjb21wbGV0ZWQgYWNyb3NzIGFsbCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQZXJjZW50V29ya0NvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFBlcmNlbnRXb3JrQ29tcGxldGUgPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YW5kYXJkIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfU3RhbmRhcmRSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFN0YW5kYXJkUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGUgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YW5kYXJkIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhbmRhcmRSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIHN0YW5kYXJkIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFuZGFyZFJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgcHJvamVjdCBjb3N0IGZvciB0aGUgcmVzb3VyY2UgYWNyb3NzIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0IDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG92ZXJ0aW1lIHJhdGUgb2YgdGhlIHJlc291cmNlLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGUgPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIFJhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX092ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZVJhdGVGb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRPdmVydGltZVJhdGVGb3JtYXQgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdG90YWwgb3ZlcnRpbWUgY29zdCBmb3IgdGhlIHJlc291cmNlIGluY2x1ZGluZyBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0cy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3N0IFBlciBVc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBQZXIgVXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFBlclVzZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgUGVyIFVzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbENvc3QoQmlnRGVjaW1hbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFjdHVhbENvc3QgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JlbWFpbmluZ0Nvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ0Nvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0UmVtYWluaW5nQ29zdCA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Xb3JrVmFyaWFuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI3NldFdvcmtWYXJpYW5jZShmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29zdCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBzZWUgI3Vuc2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDb3N0VmFyaWFuY2UgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvc3QgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENvc3RWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRDb3N0VmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgc2NoZWR1bGUgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U1YoKQotCSAqIEBzZWUgI3Vuc2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRTVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFNWKCkKLQkgKiBAc2VlICN1bnNldFNWKCkKLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U1YoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldFNWIDxlbT5TVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRTViA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTVigpCi0JICogQHNlZSAjZ2V0U1YoKQotCSAqIEBzZWUgI3NldFNWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNWPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFYXJuZWQgdmFsdWUgY29zdCB2YXJpYW5jZSwgdGhyb3VnaCB0aGUgcHJvamVjdCBzdGF0dXMgZGF0ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DVjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDVigpCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ1YoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDVicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldENWKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0Q1YgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNnZXRDVigpCi0JICogQHNlZSAjc2V0Q1YoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRDVigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UgZm9yIHRoZSBwcm9qZWN0IHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQUNXUCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FDV1AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEFDV1AgPGVtPkFDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QUNXUCgpCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBQ1dQKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQHNlZSAjc2V0QUNXUChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEFDV1AoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhbGVuZGFyIFVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHJlc291cmNlIGNhbGVuZGFyLlJlZmVycyB0byBhIHZhbGlkIFVJRCBpbiB0aGUgQ2FsZW5kYXJzIGVsZW1lbnQgb2YgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRDYWxlbmRhclVJRCA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWxlbmRhciBVSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUZXh0IG5vdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXQgY29zdCBvZiB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHJlc291cmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dTJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1MoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUyhmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1MgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBzZWUgI3NldEJDV1MoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CQ1dQPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUCgpCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0JDV1AoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkZsb2F0IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCQ1dQJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0QkNXUCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldEJDV1AgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1A8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBHZW5lcmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZ2VuZXJpYy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBHZW5lcmljPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjdW5zZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzR2VuZXJpYygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNHZW5lcmljJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzR2VuZXJpYygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzR2VuZXJpYyA8ZW0+SXMgR2VuZXJpYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgR2VuZXJpYzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3Vuc2V0SXNHZW5lcmljKCkKLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNHZW5lcmljKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0dlbmVyaWMgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEdlbmVyaWM8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzR2VuZXJpYygpCi0JICogQHNlZSAjaXNJc0dlbmVyaWMoKQotCSAqIEBzZWUgI3NldElzR2VuZXJpYyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNHZW5lcmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBJbmFjdGl2ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHNldCB0byBpbmFjdGl2ZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICN1bnNldElzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc0luYWN0aXZlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgSW5hY3RpdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjdW5zZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzSW5hY3RpdmUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0luYWN0aXZlIDxlbT5JcyBJbmFjdGl2ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBzZWUgI3NldElzSW5hY3RpdmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzSW5hY3RpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzSW5hY3RpdmUgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmFjdGl2ZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNJbmFjdGl2ZSgpCi0JICogQHNlZSAjaXNJc0luYWN0aXZlKCkKLQkgKiBAc2VlICNzZXRJc0luYWN0aXZlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFbnRlcnByaXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgYW4gRW50ZXJwcmlzZSByZXNvdXJjZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbnRlcnByaXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjdW5zZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0lzRW50ZXJwcmlzZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSXNFbnRlcnByaXNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRW50ZXJwcmlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNpc0lzRW50ZXJwcmlzZSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNFbnRlcnByaXNlKCkKLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2lzSXNFbnRlcnByaXNlIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEVudGVycHJpc2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzRW50ZXJwcmlzZSgpCi0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBzZWUgI3NldElzRW50ZXJwcmlzZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNFbnRlcnByaXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Cb29raW5nIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgYm9va2luZyB0eXBlIG9mIHRoZSByZXNvdXJjZS4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJvb2tpbmcgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9va2luZ1R5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9Cb29raW5nVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJvb2tpbmdUeXBlVHlwZTEiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jvb2tpbmdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRCb29raW5nVHlwZSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Cb29raW5nIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCBvdmVydGltZSB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgQWN0aXZlIERpcmVjdG9yeSBHVUlEIGZvciB0aGUgcmVzb3VyY2UuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BY3RpdmVEaXJlY3RvcnlHVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2ZURpcmVjdG9yeUdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZlRGlyZWN0b3J5R1VJRChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25EYXRlKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9DcmVhdGlvbkRhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcmVhdGlvbkRhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYXNlbGluZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldEJhc2VsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIENvZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlM30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdXRsaW5lIGNvZGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgQ29kZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRsaW5lQ29kZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldE91dGxpbmVDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgZHVyaW5nIHdoaWNoIHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRSZXNvdXJjZV9BdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXZhaWxhYmlsaXR5UGVyaW9kcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF2YWlsYWJpbGl0eVBlcmlvZHMgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzIDxlbT5BdmFpbGFiaWxpdHkgUGVyaW9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBjb2xsZWN0aW9uIG9mIHBlcmlvZHMgYW5kIHRoZSByYXRlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBvbmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmF0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhdGVzKFJhdGVzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlX1JhdGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmF0ZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSYXRlcyBnZXRSYXRlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSNnZXRSYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhdGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmF0ZXMoUmF0ZXMgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0UmVzb3VyY2VfVGltZXBoYXNlZERhdGEoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGltZXBoYXNlZERhdGEnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCi19IC8vIFJlc291cmNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiZjZmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Jlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2VzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2VzI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmVzb3VyY2VzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlcyBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBpbiBlYWNoIFJlc291cmNlcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFJlc291cmNlc19SZXNvdXJjZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2UiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc291cmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0UmVzb3VyY2UoKTsKLQotfSAvLyBSZXNvdXJjZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVGFzay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYjQxMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFzay5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCUyA8ZW0+V0JTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V0JTTGV2ZWwgPGVtPldCUyBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVOdW1iZXIgPGVtPk91dGxpbmUgTnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZUxldmVsIDxlbT5PdXRsaW5lIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJpb3JpdHkgPGVtPlByaW9yaXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AgPGVtPlN0b3A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VzdGltYXRlZCA8ZW0+RXN0aW1hdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzU3VtbWFyeSA8ZW0+U3VtbWFyeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEV4dGVybmFsVGFza1Byb2plY3QgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEVhcmx5U3RhcnQgPGVtPkVhcmx5IFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlGaW5pc2ggPGVtPkVhcmx5IEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVGaW5pc2ggPGVtPkxhdGUgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RnJlZVNsYWNrIDxlbT5GcmVlIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0VG90YWxTbGFjayA8ZW0+VG90YWwgU2xhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3RBY2NydWFsIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29yayA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nRHVyYXRpb24gPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nV29yayA8ZW0+UmVtYWluaW5nIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDb25zdHJhaW50VHlwZSA8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNMZXZlbGluZ0NhblNwbGl0IDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExldmVsaW5nRGVsYXlGb3JtYXQgPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmVMZXZlbGVkRmluaXNoIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmsgPGVtPkh5cGVybGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEh5cGVybGlua0FkZHJlc3MgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJZ25vcmVSZXNvdXJjZUNhbGVuZGFyIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZWRlY2Vzc29yTGluayA8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFzaygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza18uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19VSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVSUQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSB0YXNrIHdpdGhpbiB0aGUgbGlzdCBvZiB0YXNrcy4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRJRCA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5OYW1lVHlwZTIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J05hbWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBOdWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFzayBpcyBudWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE51bGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICN1bnNldElzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Jc051bGwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lzTnVsbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc051bGwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgTnVsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc051bGwoKQotCSAqIEBzZWUgI3Vuc2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNOdWxsKCkKLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQHNlZSAjc2V0SXNOdWxsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNOdWxsIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBOdWxsPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc051bGwoKQotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAc2VlICNzZXRJc051bGwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0ZURhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ3JlYXRlRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NyZWF0ZURhdGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0Q3JlYXRlRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENyZWF0ZURhdGUgPGVtPkNyZWF0ZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGUgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRlRGF0ZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbnRhY3QgcGVyc29uIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb250YWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NvbnRhY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db250YWN0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGFjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb250YWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Q29udGFjdCA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFjdChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgd29yayBicmVha2Rvd24gc3RydWN0dXJlIGNvZGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXQlMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV0JTKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dCUycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXQlMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXQlMgPGVtPldCUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V0JTPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCUyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V0JTIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmlnaHRtb3N0IFdCUyBsZXZlbCBvZiB0aGUgdGFzay4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V0JTIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXQlNMZXZlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19XQlNMZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlNMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXQlNMZXZlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldCUyBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdCU0xldmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIE51bWJlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG91dGxpbmUgbnVtYmVyIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdXRsaW5lTnVtYmVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX091dGxpbmVOdW1iZXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lTnVtYmVyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZU51bWJlcicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPdXRsaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0T3V0bGluZU51bWJlciA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTnVtYmVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdXRsaW5lTnVtYmVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRsaW5lIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRsaW5lIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdXRsaW5lTGV2ZWwoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX091dGxpbmVMZXZlbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUxldmVsJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRPdXRsaW5lTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRPdXRsaW5lTGV2ZWwgPGVtPk91dGxpbmUgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk91dGxpbmUgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE91dGxpbmVMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3V0bGluZUxldmVsKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpb3JpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcmlvcml0eSBvZiB0aGUgdGFzayBmcm9tIDAgdG8gMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcmlvcml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpb3JpdHkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByaW9yaXR5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmlvcml0eScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UHJpb3JpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQcmlvcml0eSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW9yaXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmlvcml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpb3JpdHkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdGFydCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzY2hlZHVsZWQgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2goT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBsYW5uZWQgZHVyYXRpb24gb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldER1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0R1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR1cmF0aW9uIEZvcm1hdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgRHVyYXRpb24gb2YgdGhlIFRhc2suICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA9ZSUsIDIxPW51bGwsIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRHVyYXRpb25Gb3JtYXRUeXBlNCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRHVyYXRpb25Gb3JtYXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFdvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdG9wPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHdhcyBzdG9wcGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0b3AoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3RvcCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N0b3AnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0U3RvcCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN0b3AgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0b3A8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0b3AoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhhdCB0aGUgdGFzayByZXN1bWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1Jlc3VtZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3VtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRSZXN1bWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZXN1bWUgPGVtPlJlc3VtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlc3VtZShPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdW1lIFZhbGlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjdW5zZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1Jlc3VtZVZhbGlkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXN1bWVWYWxpZCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNSZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdW1lIFZhbGlkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICN1bnNldFJlc3VtZVZhbGlkKCkKLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXN1bWVWYWxpZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUmVzdW1lVmFsaWQgPGVtPlJlc3VtZSBWYWxpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjaXNSZXN1bWVWYWxpZCgpCi0JICogQHNlZSAjc2V0UmVzdW1lVmFsaWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJlc3VtZVZhbGlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VtZSBWYWxpZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0UmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBzZWUgI3NldFJlc3VtZVZhbGlkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRSZXN1bWVWYWxpZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWZmb3J0IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVmZm9ydCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldEVmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FZmZvcnREcml2ZW4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VmZm9ydERyaXZlbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RWZmb3J0IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI3Vuc2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFZmZvcnREcml2ZW4gPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQHNlZSAjc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFZmZvcnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRWZmb3J0RHJpdmVuIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FZmZvcnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFZmZvcnREcml2ZW4oKQotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAc2VlICNzZXRFZmZvcnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVmZm9ydERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVjdXJyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgcmVjdXJyaW5nIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVjdXJyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjdW5zZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVjdXJyaW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWN1cnJpbmcnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSZWN1cnJpbmcgPGVtPlJlY3VycmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVjdXJyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjdW5zZXRSZWN1cnJpbmcoKQotCSAqIEBzZWUgI2lzUmVjdXJyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWN1cnJpbmcoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0UmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc1JlY3VycmluZyA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWN1cnJpbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFJlY3VycmluZygpCi0JICogQHNlZSAjaXNSZWN1cnJpbmcoKQotCSAqIEBzZWUgI3NldFJlY3VycmluZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0UmVjdXJyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVyIEFsbG9jYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBpbmZvcm1hdGlvbmFsIG9ubHkuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjdW5zZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19PdmVyQWxsb2NhdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVyQWxsb2NhdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc092ZXJBbGxvY2F0ZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICN1bnNldE92ZXJBbGxvY2F0ZWQoKQotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0T3ZlckFsbG9jYXRlZCgpCi0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAc2VlICNzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRPdmVyQWxsb2NhdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgZXN0aW1hdGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0VzdGltYXRlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0VzdGltYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXN0aW1hdGVkIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI3Vuc2V0RXN0aW1hdGVkKCkKLQkgKiBAc2VlICNpc0VzdGltYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXN0aW1hdGVkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEVzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFc3RpbWF0ZWQoKQotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAc2VlICNzZXRFc3RpbWF0ZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEVzdGltYXRlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX01pbGVzdG9uZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWlsZXN0b25lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc01pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI3Vuc2V0TWlsZXN0b25lKCkKLQkgKiBAc2VlICNpc01pbGVzdG9uZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWlsZXN0b25lKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNNaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsZXN0b25lPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRNaWxlc3RvbmUoKQotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAc2VlICNzZXRNaWxlc3RvbmUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldE1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VtbWFyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgdGFzayBpcyBhIHN1bW1hcnkgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0U3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfU3VtbWFyeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VtbWFyeScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTdW1tYXJ5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI3Vuc2V0U3VtbWFyeSgpCi0JICogQHNlZSAjaXNTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdW1tYXJ5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFN1bW1hcnkoKQotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQHNlZSAjc2V0U3VtbWFyeShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0U3VtbWFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNTdW1tYXJ5IDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdW1tYXJ5PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRTdW1tYXJ5KCkKLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBzZWUgI3NldFN1bW1hcnkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFN1bW1hcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyaXRpY2FsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGluIHRoZSBjcml0aWNhbCBjaGFpbi4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjdW5zZXRDcml0aWNhbCgpCi0JICogQHNlZSAjc2V0Q3JpdGljYWwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NyaXRpY2FsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDcml0aWNhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNDcml0aWNhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzQ3JpdGljYWwgPGVtPkNyaXRpY2FsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0aWNhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjdW5zZXRDcml0aWNhbCgpCi0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JpdGljYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRDcml0aWNhbCgpCi0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQHNlZSAjc2V0Q3JpdGljYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENyaXRpY2FsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGljYWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldENyaXRpY2FsKCkKLQkgKiBAc2VlICNpc0NyaXRpY2FsKCkKLQkgKiBAc2VlICNzZXRDcml0aWNhbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q3JpdGljYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgYW4gaW5zZXJ0ZWQgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfSXNTdWJwcm9qZWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc1N1YnByb2plY3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNJc1N1YnByb2plY3QgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFN1YnByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3VicHJvamVjdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzU3VicHJvamVjdCgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBzZWUgI3NldElzU3VicHJvamVjdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNTdWJwcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdCA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNTdWJwcm9qZWN0KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdCgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0KGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1N1YnByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSBpbnNlcnRlZCBwcm9qZWN0IGlzIHJlYWQtb25seS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJc1N1YnByb2plY3RSZWFkT25seScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1N1YnByb2plY3RSZWFkT25seSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjdW5zZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjaXNJc1N1YnByb2plY3RSZWFkT25seSgpCi0JICogQHNlZSAjc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lzU3VicHJvamVjdFJlYWRPbmx5IDxlbT5JcyBTdWJwcm9qZWN0IFJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAc2VlICNzZXRJc1N1YnByb2plY3RSZWFkT25seShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YnByb2plY3QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgaW5zZXJ0ZWQgcHJvamVjdC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN1YnByb2plY3ROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1N1YnByb2plY3ROYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuU3VicHJvamVjdE5hbWVUeXBlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJwcm9qZWN0TmFtZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTdWJwcm9qZWN0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFN1YnByb2plY3ROYW1lIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1YnByb2plY3QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3VicHJvamVjdE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YnByb2plY3ROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBUYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlzIGV4dGVybmFsLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIFRhc2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICN1bnNldEV4dGVybmFsVGFzaygpCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FeHRlcm5hbFRhc2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVybmFsVGFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNFeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0V4dGVybmFsVGFzayA8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI3Vuc2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxUYXNrKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRFeHRlcm5hbFRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzRXh0ZXJuYWxUYXNrIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRFeHRlcm5hbFRhc2soKQotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2soYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEV4dGVybmFsVGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc291cmNlIGxvY2F0aW9uIGFuZCB0YXNrIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVybmFsIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbFRhc2tQcm9qZWN0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxUYXNrUHJvamVjdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCA8ZW0+RXh0ZXJuYWwgVGFzayBQcm9qZWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcmx5IFN0YXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZWFybHkgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RWFybHlTdGFydChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FYXJseVN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybHlTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRFYXJseVN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybHlTdGFydCA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcmx5IFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFYXJseVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJseVN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FYXJseSBGaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlYXJseSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcmx5RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0Vhcmx5RmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybHlGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RWFybHlGaW5pc2goKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRFYXJseUZpbmlzaCA8ZW0+RWFybHkgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FYXJseSBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJseUZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGF0ZSBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMYXRlU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfTGF0ZVN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGF0ZVN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldExhdGVTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldExhdGVTdGFydCA8ZW0+TGF0ZSBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGF0ZSBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGF0ZVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXRlU3RhcnQoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhdGUgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGF0ZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYXRlIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGF0ZUZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MYXRlRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGF0ZUZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRMYXRlRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGF0ZUZpbmlzaCA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhdGUgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMYXRlRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMYXRlRmluaXNoKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBWYXJpYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19TdGFydFZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydFZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiYXNlbGluZSBmaW5pc2ggZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbmlzaFZhcmlhbmNlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19GaW5pc2hWYXJpYW5jZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoVmFyaWFuY2UnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFZhcmlhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFyaWFuY2Ugb2YgdGFzayB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB3b3JrIGFzIG1pbnV0ZXMgeCAxMDAwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfV29ya1ZhcmlhbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV29ya1ZhcmlhbmNlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFZhcmlhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjdW5zZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjc2V0V29ya1ZhcmlhbmNlKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRXb3JrVmFyaWFuY2UgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgVmFyaWFuY2U8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFdvcmtWYXJpYW5jZSgpCi0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAc2VlICNzZXRXb3JrVmFyaWFuY2UoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyZWUgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgZnJlZSBzbGFjay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GcmVlIFNsYWNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcmVlU2xhY2soQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZyZWVTbGFjaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRnJlZVNsYWNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRGcmVlU2xhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGcmVlU2xhY2sgPGVtPkZyZWUgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyZWUgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZyZWVTbGFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJlZVNsYWNrKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG90YWwgU2xhY2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2YgdG90YWwgc2xhY2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRvdGFsU2xhY2soQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1RvdGFsU2xhY2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RvdGFsU2xhY2snIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFRvdGFsU2xhY2soKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRUb3RhbFNsYWNrIDxlbT5Ub3RhbCBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG90YWwgU2xhY2s8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvdGFsU2xhY2soQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZml4ZWQgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3NldEZpeGVkQ29zdChmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpeGVkQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0ZpeGVkQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEZpeGVkQ29zdCA8ZW0+Rml4ZWQgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3Vuc2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpeGVkQ29zdChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRGaXhlZENvc3QgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Rml4ZWRDb3N0KCkKLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI3NldEZpeGVkQ29zdChmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEZpeGVkQ29zdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRGaXhlZENvc3QoKQotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQHNlZSAjc2V0Rml4ZWRDb3N0KGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Rml4ZWRDb3N0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaXhlZCBDb3N0IEFjY3J1YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1Qcm9yYXRlZCBhbmQgMz1FbmQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0ZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5GaXhlZENvc3RBY2NydWFsVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRml4ZWRDb3N0QWNjcnVhbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRGaXhlZENvc3RBY2NydWFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpeGVkQ29zdEFjY3J1YWwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmNlbnQgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIGR1cmF0aW9uIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQZXJjZW50Q29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyY2VudENvbXBsZXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRQZXJjZW50Q29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50Q29tcGxldGUgPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayB3b3JrIGNvbXBsZXRlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmNlbnRXb3JrQ29tcGxldGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BlcmNlbnRXb3JrQ29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcmNlbnQgV29yayBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBwcm9qZWN0ZWQgb3Igc2NoZWR1bGVkIGNvc3Qgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0Q29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvc3QgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc3VtIG9mIHRoZSBhY3R1YWwgYW5kIHJlbWFpbmluZyBvdmVydGltZSBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3ZlcnRpbWVDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdmVydGltZUNvc3QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdmVydGltZSBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldE92ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3ZlcnRpbWUgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPdmVydGltZVdvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBTdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxGaW5pc2goKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxGaW5pc2gnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsRmluaXNoIDxlbT5BY3R1YWwgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgRmluaXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIGR1cmF0aW9uIG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsRHVyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxEdXJhdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRBY3R1YWxEdXJhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbER1cmF0aW9uIDxlbT5BY3R1YWwgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjdHVhbER1cmF0aW9uKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgQ29zdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxDb3N0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EZWNpbWFsIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxDb3N0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjdHVhbCBDb3N0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbE92ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0IDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsV29yaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0dWFsV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhY3R1YWwgb3ZlcnRpbWUgd29yayBmb3IgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBY3R1YWxPdmVydGltZVdvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWd1bGFyIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlZ3VsYXJXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlZ3VsYXJXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVndWxhcldvcmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVndWxhcldvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWd1bGFyIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIER1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYW1vdW50IG9mIHRpbWUgcmVxdWlyZWQgdG8gY29tcGxldGUgdGhlIHVuZmluaXNoZWQgcG9ydGlvbiBvZiB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlbWFpbmluZ0R1cmF0aW9uKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nRHVyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0UmVtYWluaW5nRHVyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdEdXJhdGlvbiA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIENvc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nQ29zdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGVjaW1hbCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBXb3JrPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdXb3JrKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JlbWFpbmluZ1dvcmsoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkR1cmF0aW9uIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZW1haW5pbmdXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIFdvcms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ1dvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19SZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRlY2ltYWwiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlbWFpbmluZ092ZXJ0aW1lQ29zdCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gZmluaXNoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVtYWluaW5nT3ZlcnRpbWVXb3JrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QUNXUDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGFjdHVhbCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QUNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRBQ1dQKCkKLQkgKiBAc2VlICN1bnNldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19BQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQUNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEFDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QUNXUCgpCi0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QUNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEFDV1AoKQotCSAqIEBzZWUgI2dldEFDV1AoKQotCSAqIEBzZWUgI3NldEFDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRBQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRBQ1dQKCkKLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAc2VlICNzZXRBQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QUNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q1Y8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVhcm5lZCB2YWx1ZSBjb3N0IHZhcmlhbmNlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldENWKCkKLQkgKiBAc2VlICN1bnNldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0NWKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ1YnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRDVigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENWIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q1Y8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI3Vuc2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDVihmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0Q1YoKQotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAc2VlICNzZXRDVihmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldENWKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRDViA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNWPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRDVigpCi0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBzZWUgI3NldENWKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0Q1YoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnN0cmFpbnQgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGNvbnN0cmFpbnQgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgND1TdGFydCBObyBFYXJsaWVyIFRoYW4sIDU9U3RhcnQgTm8gTGF0ZXIgVGhhbiwgNj1GaW5pc2ggTm8gRWFybGllciBUaGFuIGFuZCA3PUZpbmlzaCBObyBMYXRlciBUaGFuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29uc3RyYWludCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29uc3RyYWludFR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Db25zdHJhaW50VHlwZVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnN0cmFpbnRUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDb25zdHJhaW50VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnRUeXBlIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cmFpbnRUeXBlKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FsZW5kYXIgVUlEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFhNTCBTY2hlbWEuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FsZW5kYXIgVUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ2FsZW5kYXJVSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhbGVuZGFyVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRDYWxlbmRhclVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhbGVuZGFyIFVJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhbGVuZGFyVUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29uc3RyYWludCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSBhcmd1bWVudCBmb3IgdGhlIHRhc2sgY29uc3RyYWludCB0eXBlLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29uc3RyYWludERhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQ29uc3RyYWludERhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdDb25zdHJhaW50RGF0ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRDb25zdHJhaW50RGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldENvbnN0cmFpbnREYXRlIDxlbT5Db25zdHJhaW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnN0cmFpbnREYXRlKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWFkbGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlYWRsaW5lIGZvciB0aGUgdGFzayB0byBiZSBjb21wbGV0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVhZGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlYWRsaW5lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0RlYWRsaW5lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVhZGxpbmUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0RGVhZGxpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXREZWFkbGluZSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlYWRsaW5lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWFkbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVhZGxpbmUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsIEFzc2lnbm1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIGxldmVsaW5nIGNhbiBhZGp1c3QgYXNzaWdubWVudHMuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbEFzc2lnbm1lbnRzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0xldmVsQXNzaWdubWVudHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICN1bnNldExldmVsQXNzaWdubWVudHMoKQotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWxBc3NpZ25tZW50cyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxBc3NpZ25tZW50cyA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsQXNzaWdubWVudHMgPGVtPkxldmVsIEFzc2lnbm1lbnRzPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0TGV2ZWxBc3NpZ25tZW50cygpCi0JICogQHNlZSAjaXNMZXZlbEFzc2lnbm1lbnRzKCkKLQkgKiBAc2VlICNzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBDYW4gU3BsaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3NldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nQ2FuU3BsaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjdW5zZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0xldmVsaW5nQ2FuU3BsaXQgPGVtPkxldmVsaW5nIENhbiBTcGxpdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMZXZlbGluZ0NhblNwbGl0KCkKLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI3NldExldmVsaW5nQ2FuU3BsaXQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldExldmVsaW5nQ2FuU3BsaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldExldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQHNlZSAjc2V0TGV2ZWxpbmdDYW5TcGxpdChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxpbmcgRGVsYXk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWxheSBjYXVzZWQgYnkgbGV2ZWxpbmcgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0xldmVsaW5nRGVsYXkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xldmVsaW5nRGVsYXknIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRMZXZlbGluZ0RlbGF5IDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBkZWxheS4gIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMz1tLCA0PWVtLCA1PWgsIDY9ZWgsIDc9ZCwgOD1lZCwgOT13LCAxMD1ldywgMTE9bW8sIDEyPWVtbywgMTk9JSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbGluZ0RlbGF5Rm9ybWF0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExldmVsaW5nRGVsYXlGb3JtYXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgTGV2ZWxlZCBTdGFydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVMZXZlbGVkU3RhcnQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlTGV2ZWxlZFN0YXJ0JyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFByZUxldmVsZWRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldFByZUxldmVsZWRTdGFydCA8ZW0+UHJlIExldmVsZWQgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZUxldmVsZWRTdGFydChPYmplY3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIExldmVsZWQgRmluaXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBMZXZlbGVkIEZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlTGV2ZWxlZEZpbmlzaCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRQcmVMZXZlbGVkRmluaXNoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZUxldmVsZWRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0h5cGVybGluaygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lkh5cGVybGlua1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SHlwZXJsaW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBBZGRyZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFzay4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rQWRkcmVzc1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEh5cGVybGlua0FkZHJlc3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkh5cGVybGluayBTdWIgQWRkcmVzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIeXBlcmxpbmtTdWJBZGRyZXNzJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SHlwZXJsaW5rU3ViQWRkcmVzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBXaGV0aGVyIHRoZSB0YXNrIGlnbm9yZXMgdGhlIHJlc291cmNlIGNhbGVuZGFyLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0lnbm9yZVJlc291cmNlQ2FsZW5kYXInIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjdW5zZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIgPGVtPklnbm9yZSBSZXNvdXJjZSBDYWxlbmRhcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkKLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI3NldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQHNlZSAjc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vdGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19Ob3RlcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RlcycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldE5vdGVzIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGlkZSBCYXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGlkZSBCYXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGlkZUJhcigpCi0JICogQHNlZSAjdW5zZXRIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19IaWRlQmFyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIaWRlQmFyJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0hpZGVCYXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRIaWRlQmFyKCkKLQkgKiBAc2VlICN1bnNldEhpZGVCYXIoKQotCSAqIEBzZWUgI2lzSGlkZUJhcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGlkZUJhcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzSGlkZUJhciA8ZW0+SGlkZSBCYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRIaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNpc0hpZGVCYXIgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaWRlIEJhcjwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SGlkZUJhcigpCi0JICogQHNlZSAjaXNIaWRlQmFyKCkKLQkgKiBAc2VlICNzZXRIaWRlQmFyKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIaWRlQmFyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xsdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI3Vuc2V0Um9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1JvbGx1cCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUm9sbHVwJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1JvbGx1cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGx1cDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI3Vuc2V0Um9sbHVwKCkKLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sbHVwKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFJvbGx1cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjaXNSb2xsdXAgPGVtPlJvbGx1cDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sbHVwPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRSb2xsdXAoKQotCSAqIEBzZWUgI2lzUm9sbHVwKCkKLQkgKiBAc2VlICNzZXRSb2xsdXAoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFJvbGx1cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QkNXUzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJDV1M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0QkNXUygpCi0JICogQHNlZSAjdW5zZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQkNXUygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRmxvYXQiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JDV1MnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlmbG9hdCBnZXRCQ1dTKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICN1bnNldEJDV1MoKQotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJDV1MoZmxvYXQgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRCQ1dTKCkKLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAc2VlICNzZXRCQ1dTKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0QkNXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0QkNXUygpCi0JICogQHNlZSAjZ2V0QkNXUygpCi0JICogQHNlZSAjc2V0QkNXUyhmbG9hdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEJDV1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJDV1A8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QkNXUDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRCQ1dQKCkKLQkgKiBAc2VlICN1bnNldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CQ1dQKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5GbG9hdCIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQkNXUCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWZsb2F0IGdldEJDV1AoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI3Vuc2V0QkNXUCgpCi0JICogQHNlZSAjZ2V0QkNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QkNXUChmbG9hdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEJDV1AoKQotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBzZWUgI3NldEJDV1AoZmxvYXQpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRCQ1dQKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CQ1dQPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRCQ1dQKCkKLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAc2VlICNzZXRCQ1dQKGZsb2F0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0QkNXUCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIGZvciBjYWxjdWxhdGluZyBCQ1dQLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19QaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGh5c2ljYWxQZXJjZW50Q29tcGxldGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUgPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVhcm5lZFZhbHVlTWV0aG9kKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkVhcm5lZFZhbHVlTWV0aG9kVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWFybmVkVmFsdWVNZXRob2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFYXJuZWRWYWx1ZU1ldGhvZChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yIExpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGlua30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBwcmVkZWNlc3NvciB0YXNrIG9mIHRoZSB0YXNrIHRoYXQgY29udGFpbnMgaXQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3IgTGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVkZWNlc3NvckxpbmsnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRQcmVkZWNlc3NvckxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRHVyYXRpb24iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdHVhbFdvcmtQcm90ZWN0ZWQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlPYmplY3QgZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EdXJhdGlvbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEZpZWxkIElELCBhbmQgdGhlIHZhbHVlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgd2l0aCB0aGUgdmFsdWUsIG9yIGEgcG9pbnRlciBiYWNrIHRvIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX0V4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4dGVuZGVkQXR0cmlidXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBiYXNlbGluZSB2YWx1ZXMgb2YgdGhlIHRhc2suCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZWxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza19CYXNlbGluZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Jhc2VsaW5lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0QmFzZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiBhbiBvdXRsaW5lIGNvZGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG91dGxpbmUgY29kZSB0YWJsZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSB1bmlxdWUgSUQgb3IgdGhlIEZpZWxkIElELCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRhc2tfT3V0bGluZUNvZGUoKQotCSAqIEBtb2RlbCB0eXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0bGluZUNvZGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRPdXRsaW5lQ29kZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrX1RpbWVwaGFzZWREYXRhKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVwaGFzZWREYXRhJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0VGltZXBoYXNlZERhdGEoKTsKLQotfSAvLyBUYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1Rhc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzQzYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrcy5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUYXNrcygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza3NfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza3MgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHRhc2sgaW4gZWFjaCBUYXNrcyBjb2xsZWN0aW9uLgotCSAqICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGFza3NfVGFzaygpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFRhc2soKTsKLQotfSAvLyBUYXNrcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lUGVyaW9kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4Y2JhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVQZXJpb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZVBlcmlvZC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRpbWUgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZCNnZXRGcm9tRGF0ZSA8ZW0+RnJvbSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0VG9EYXRlIDxlbT5UbyBEYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGltZVBlcmlvZF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUaW1lUGVyaW9kIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RnJvbSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gdGltZS4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcm9tRGF0ZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VGltZVBlcmlvZF9Gcm9tRGF0ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zyb21EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZyb21EYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QjZ2V0RnJvbURhdGUgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGcm9tRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RnJvbURhdGUoT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUb0RhdGUoT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVQZXJpb2RfVG9EYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVG9EYXRlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldFRvRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kI2dldFRvRGF0ZSA8ZW0+VG8gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VG8gRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VG9EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb0RhdGUoT2JqZWN0IHZhbHVlKTsKLQotfSAvLyBUaW1lUGVyaW9kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9UaW1lcGhhc2VkRGF0YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkZDBmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1RpbWVwaGFzZWREYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZXBoYXNlZERhdGFUeXBlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lcGhhc2VkIERhdGEgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSB0aW1lIHBoYXNlZCBkYXRhIGJsb2NrLgotICogCQkgICAgICAgIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1RpbWVwaGFzZWREYXRhVHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRpbWVwaGFzZWREYXRhVHlwZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIAotCSAqICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZToKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE9QXNzaWdubWVudCBSZW1haW5pbmcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMj1Bc3NpZ25tZW50IEFjdHVhbCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ9QXNzaWdubWVudCBCYXNlbGluZSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1PUFzc2lnbm1lbnQgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3PVJlc291cmNlIEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDg9UmVzb3VyY2UgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDEwPVRhc2sgQmFzZWxpbmUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMTE9VGFzayBQZXJjZW50IENvbXBsZXRlCi0JICogICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMTc9QXNzaWdubWVudCBCYXNlbGluZSAxIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDE4PVRhc2sgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjA9UmVzb3VyY2UgQmFzZWxpbmUgMSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyMT1SZXNvdXJjZSBCYXNlbGluZSAxIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAyMz1Bc3NpZ25tZW50IEJhc2VsaW5lIDIgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjQ9VGFzayBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAyNj1SZXNvdXJjZSBCYXNlbGluZSAyIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI3PVJlc291cmNlIEJhc2VsaW5lIDIgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDI5PUFzc2lnbm1lbnQgQmFzZWxpbmUgMyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzMD1UYXNrIEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDMyPVJlc291cmNlIEJhc2VsaW5lIDMgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzM9UmVzb3VyY2UgQmFzZWxpbmUgMyBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgMzU9QXNzaWdubWVudCBCYXNlbGluZSA0IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDM2PVRhc2sgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgMzg9UmVzb3VyY2UgQmFzZWxpbmUgNCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICAzOT1SZXNvdXJjZSBCYXNlbGluZSA0IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA0MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDI9VGFzayBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0ND1SZXNvdXJjZSBCYXNlbGluZSA1IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ1PVJlc291cmNlIEJhc2VsaW5lIDUgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDQ3PUFzc2lnbm1lbnQgQmFzZWxpbmUgNiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA0OD1UYXNrIEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDUwPVJlc291cmNlIEJhc2VsaW5lIDYgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTE9UmVzb3VyY2UgQmFzZWxpbmUgNiBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNTM9QXNzaWdubWVudCBCYXNlbGluZSA3IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU0PVRhc2sgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNTY9UmVzb3VyY2UgQmFzZWxpbmUgNyBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1Nz1SZXNvdXJjZSBCYXNlbGluZSA3IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA1OT1Bc3NpZ25tZW50IEJhc2VsaW5lIDggQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjA9VGFzayBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2Mj1SZXNvdXJjZSBCYXNlbGluZSA4IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDYzPVJlc291cmNlIEJhc2VsaW5lIDggQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY1PUFzc2lnbm1lbnQgQmFzZWxpbmUgOSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA2Nj1UYXNrIEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDY4PVJlc291cmNlIEJhc2VsaW5lIDkgV29yawotCSAqICAgICAgICAgICAgICAgICAgICAgNjk9UmVzb3VyY2UgQmFzZWxpbmUgOSBDb3N0Ci0JICogICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDcxPUFzc2lnbm1lbnQgQmFzZWxpbmUgMTAgQ29zdAotCSAqICAgICAgICAgICAgICAgICAgICAgNzI9VGFzayBCYXNlbGluZSAxMCBXb3JrCi0JICogICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc0PVJlc291cmNlIEJhc2VsaW5lIDEwIFdvcmsKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc1PVJlc291cmNlIEJhc2VsaW5lIDEwIENvc3QKLQkgKiAgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUKLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVHlwZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlR5cGVUeXBlMyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVHlwZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcmVjb3JkLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VUlEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVSUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRlZ2VyIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVUlEJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRVSUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVJRCA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0KE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGFydCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN0YXJ0KE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4KLQkgKiAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfRmluaXNoKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRmluaXNoJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZpbmlzaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRGaW5pc2goT2JqZWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSBwZXJpb2QuIAotCSAqICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPW0sIDE9aCwgMj1kLCAzPXcsIDU9bW8sIDg9eQotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VW5pdChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVW5pdFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1VuaXQnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldFVuaXQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFVuaXQgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVuaXQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHZhbHVlIHBlciB1bml0IG9mIHRpbWUgZm9yIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLgotCSAqICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRpbWVwaGFzZWREYXRhVHlwZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTUzOGIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFBhcmVudFZhbHVlSUQgPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbHVlIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfVmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgSUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQgVmFsdWUgSUQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgb2YgdGhlIG91dGxpbmUgY29kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRWYWx1ZUlEKEJpZ0ludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVfUGFyZW50VmFsdWVJRCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50ZWdlciIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGFyZW50VmFsdWVJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0UGFyZW50VmFsdWVJRCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBWYWx1ZSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyZW50VmFsdWVJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlX1ZhbHVlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZV9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBWYWx1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWUyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTg5ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlMi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlXy5fMV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZTIgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVW5pcXVlIElEIG9mIHZhbHVlIGFjcm9zcyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SUQoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZTJfSUQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJRCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0SUQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyI2dldElEIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SUQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJRChCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgYWN0dWFsIHZhbHVlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdWYWx1ZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWx1ZSAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlMl9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEZXNjcmlwdGlvbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gVmFsdWUyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5MDJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1ZhbHVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZUxpc3QuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUgTGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRWYWx1ZUxpc3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhbHVlTGlzdF8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWx1ZUxpc3QgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIHRoZSB2YWx1ZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlTGlzdF9WYWx1ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsdWUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRWYWx1ZSgpOwotCi19IC8vIFZhbHVlTGlzdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvVmFsdWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZDFjZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9WYWx1ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWVzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzI2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdWYWx1ZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFsdWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0VmFsdWVzX0dyb3VwKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFZhbHVlc19WYWx1ZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ZhbHVlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyBncm91cD0nI2dyb3VwOjAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRWYWx1ZSgpOwotCi19IC8vIFZhbHVlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2OWZiMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2suamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dCU01hc2tfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV0JTTWFzayBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgbGV2ZWwgb2YgdGhlIG1hc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZXZlbChCaWdJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfTGV2ZWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludGVnZXIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdMZXZlbCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJpZ0ludGVnZXIgZ2V0TGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGV2ZWwoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgdHlwZSBvZiB0aGUgbm9kZSB2YWx1ZS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrX1R5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UeXBlVHlwZTIiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUeXBlJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQmlnSW50ZWdlciBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBvbWl0dGVkIHdoZW4gbGVuZ3RoIGlzICJhbnkiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza19MZW5ndGgoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0xlbmd0aCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayNnZXRMZW5ndGggPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExlbmd0aChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VwYXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VwYXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXBhcmF0b3IoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tfU2VwYXJhdG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTZXBhcmF0b3InIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2sjZ2V0U2VwYXJhdG9yIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcGFyYXRvcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXQlNNYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dCU01hc2tzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMTY4ODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9XQlNNYXNrcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV0JTTWFza3MuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2dldFdCU01hc2sgPGVtPldCUyBNYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dCU01hc2tzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdCU01hc2tzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciBXQlMgY29kZXMgYXJlIHVuaXF1ZSBmb3IgbmV3IHRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJpZnkgVW5pcXVlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRWZXJpZnlVbmlxdWVDb2Rlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1ZlcmlmeVVuaXF1ZUNvZGVzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIHVuaXF1ZT0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmVyaWZ5VW5pcXVlQ29kZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjaXNWZXJpZnlVbmlxdWVDb2RlcygpCi0JICogQHNlZSAjc2V0VmVyaWZ5VW5pcXVlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZlcmlmeVVuaXF1ZUNvZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjaXNWZXJpZnlVbmlxdWVDb2RlcyA8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyaWZ5IFVuaXF1ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBzZWUgI3NldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGUgQ29kZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFdoZXRoZXIgV0JTIGNvZGVzIGFyZSBnZW5lcmF0ZWQgZm9yIG5ldyB0YXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjdW5zZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNzZXRHZW5lcmF0ZUNvZGVzKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiB1bmlxdWU9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0dlbmVyYXRlQ29kZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzR2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICN1bnNldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrcyNpc0dlbmVyYXRlQ29kZXMgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldEdlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI2lzR2VuZXJhdGVDb2RlcygpCi0JICogQHNlZSAjc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0R2VuZXJhdGVDb2RlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzI2lzR2VuZXJhdGVDb2RlcyA8ZW0+R2VuZXJhdGUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlIENvZGVzPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRHZW5lcmF0ZUNvZGVzKCkKLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBzZWUgI3NldEdlbmVyYXRlQ29kZXMoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldEdlbmVyYXRlQ29kZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIHByZWZpeCBmb3IgYWxsIFdCUyBjb2Rlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdCU01hc2tzX1ByZWZpeCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWZpeFR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWZpeCcgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldCUyBNYXNrPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XQlMgTWFzazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXQlNNYXNrc19XQlNNYXNrKCkKLQkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXQlNNYXNrJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0V0JTTWFzaygpOwotCi19IC8vIFdCU01hc2tzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWEzNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDUganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0OwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV2Vla0RheV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXZWVrRGF5IGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0eXBlIG9mIGRheS4gCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksIAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM9V2VkbmVzZGF5LCA0PVRodXJzZGF5LCA1PUZyaWRheSwgNj1TYXR1cmRheSwgCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNz1TdW5kYXkKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERheVR5cGUoQmlnSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXZWVrRGF5X0RheVR5cGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5EYXlUeXBlVHlwZSIgcmVxdWlyZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RheVR5cGUnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCaWdJbnRlZ2VyIGdldERheVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXREYXlUeXBlIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERheVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERheVR5cGUoQmlnSW50ZWdlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXkgV29ya2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5IAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaXMgd29ya2luZy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF5IFdvcmtpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjdW5zZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdEYXlXb3JraW5nJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0RheVdvcmtpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXREYXlXb3JraW5nKCkKLQkgKiBAc2VlICN1bnNldERheVdvcmtpbmcoKQotCSAqIEBzZWUgI2lzRGF5V29ya2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGF5V29ya2luZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5I2lzRGF5V29ya2luZyA8ZW0+RGF5IFdvcmtpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNpc0RheVdvcmtpbmcgPGVtPkRheSBXb3JraW5nPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EYXkgV29ya2luZzwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0RGF5V29ya2luZygpCi0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAc2VlICNzZXREYXlXb3JraW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXREYXlXb3JraW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyBhIGNvbnRpZ3VvdXMgc2V0IG9mIGV4Y2VwdGlvbiBkYXlzLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UaW1lIFBlcmlvZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGltZVBlcmlvZChUaW1lUGVyaW9kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdlZWtEYXlfVGltZVBlcmlvZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RpbWVQZXJpb2QnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUaW1lUGVyaW9kIGdldFRpbWVQZXJpb2QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSNnZXRUaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRpbWVQZXJpb2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgd2Vla2RheS4gIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGFuZCB0aGVyZSBtYXkgYmUgbm8gbW9yZSB0aGFuIGZpdmUuCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZXMnIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JraW5nVGltZXMgZ2V0V29ya2luZ1RpbWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIFRpbWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRXb3JraW5nVGltZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgdmFsdWUpOwotCi19IC8vIFdlZWtEYXkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV2Vla0RheXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxY2FlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dlZWtEYXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdlZWtEYXlzLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo0NSBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldlZWsgRGF5czwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzI2dldFdlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dlZWtEYXlzXy5fdHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdlZWtEYXlzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V2VlayBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSB3ZWVrZGF5IGVpdGhlciBkZWZpbmVzIHJlZ3VsYXIgZGF5cyAKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2VlayBEYXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V2Vla0RheXNfV2Vla0RheSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nV2Vla0RheScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdlZWtEYXkoKTsKLQotfSAvLyBXZWVrRGF5cwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE1MjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvV29ya2luZ1RpbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya2luZ1RpbWUuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JraW5nVGltZV8uX3R5cGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JraW5nVGltZSBleHRlbmRzIEVPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZyb20gVGltZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGJlZ2lubmluZyBvZiB0aGUgd29ya2luZyB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RnJvbSBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGcm9tVGltZShPYmplY3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVfRnJvbVRpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Zyb21UaW1lJyBuYW1lc3BhY2U9JyMjdGFyZ2V0TmFtZXNwYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT2JqZWN0IGdldEZyb21UaW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lI2dldEZyb21UaW1lIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZyb20gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RnJvbVRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZyb21UaW1lKE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UbyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZW5kIG9mIHRoZSB3b3JraW5nICB0aW1lLgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG8gVGltZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG9UaW1lKE9iamVjdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZSNnZXRXb3JraW5nVGltZV9Ub1RpbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1RvVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9iamVjdCBnZXRUb1RpbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUjZ2V0VG9UaW1lIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UbyBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRvVGltZShPYmplY3QgdmFsdWUpOwotCi19IC8vIFdvcmtpbmdUaW1lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9Xb3JraW5nVGltZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4MDBhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L1dvcmtpbmdUaW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZXMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQ2IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29ya2luZyBUaW1lczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lcyNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZ2V0V29ya2luZ1RpbWVzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JraW5nVGltZXNfLl90eXBlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya2luZ1RpbWVzIGV4dGVuZHMgRU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29ya2luZyBUaW1lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSB3b3JraW5nIHRpbWUgZHVyaW5nIHRoZSB3ZWVrZGF5LgotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlI2dldFdvcmtpbmdUaW1lc19Xb3JraW5nVGltZSgpCi0JICogQG1vZGVsIHR5cGU9Im9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiIHVwcGVyPSI1IgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JraW5nVGltZScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldFdvcmtpbmdUaW1lKCk7Ci0KLX0gLy8gV29ya2luZ1RpbWVzCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXNzaWdubWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGNhZTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Bc3NpZ25tZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUYXNrVUlEIDxlbT5UYXNrIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc291cmNlVUlEIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRQZXJjZW50V29ya0NvbXBsZXRlIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbEZpbmlzaCA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QWN0dWFsU3RhcnQgPGVtPkFjdHVhbCBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEFjdHVhbFdvcmsgPGVtPkFjdHVhbCBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QUNXUCA8ZW0+QUNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzQ29uZmlybWVkIDxlbT5Db25maXJtZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFJhdGVUYWJsZSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q29zdFZhcmlhbmNlIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RGVsYXkgPGVtPkRlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRGaW5pc2hWYXJpYW5jZSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzSGFzRml4ZWRSYXRlVW5pdHMgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNGaXhlZE1hdGVyaWFsIDxlbT5GaXhlZCBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldExldmVsaW5nRGVsYXkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNMaW5rZWRGaWVsZHMgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc01pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjaXNPdmVyYWxsb2NhdGVkIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0T3ZlcnRpbWVXb3JrIDxlbT5PdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2lzUmVzcG9uc2VQZW5kaW5nIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnQgPGVtPlN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RvcCA8ZW0+U3RvcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFJlc3VtZSA8ZW0+UmVzdW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0U3RhcnRWYXJpYW5jZSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRVbml0cyA8ZW0+VW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNpc1VwZGF0ZU5lZWRlZCA8ZW0+VXBkYXRlIE5lZWRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFZBQyA8ZW0+VkFDPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldFdvcmtDb250b3VyIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudEltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEJvb2tpbmdUeXBlIDxlbT5Cb29raW5nIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkFzc2lnbm1lbnRJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Bc3NpZ25tZW50SW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXNzaWdubWVudEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2lnbm1lbnQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza1VJRCgpIDxlbT5UYXNrIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRBU0tfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tVSUQoKSA8ZW0+VGFzayBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2tVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHRhc2tVSUQgPSBUQVNLX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNvdXJjZVVJRCgpIDxlbT5SZXNvdXJjZSBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUkVTT1VSQ0VfVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlVUlEKCkgPGVtPlJlc291cmNlIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2VVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJlc291cmNlVUlEID0gUkVTT1VSQ0VfVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxDb3N0ID0gQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsT3ZlcnRpbWVDb3N0ID0gQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbE92ZXJ0aW1lV29yayA9IEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxTdGFydCgpIDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFN0YXJ0ID0gQUNUVUFMX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmsoKSA8ZW0+QWN0dWFsIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29yayA9IEFDVFVBTF9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT05GSVJNRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29uZmlybWVkKCkgPGVtPkNvbmZpcm1lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDb25maXJtZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbmZpcm1lZCA9IENPTkZJUk1FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29uZmlybWVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RSYXRlVGFibGUoKSA8ZW0+Q29zdCBSYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UmF0ZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjb3N0UmF0ZVRhYmxlID0gQ09TVF9SQVRFX1RBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0VmFyaWFuY2UoKSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY29zdFZhcmlhbmNlID0gQ09TVF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ29zdCBWYXJpYW5jZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29zdFZhcmlhbmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDVl9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjViA9IENWX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDViBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY1ZFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsYXkoKSA8ZW0+RGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWxheSA9IERFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaCgpIDxlbT5GaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2ggPSBGSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPGVtPkhhcyBGaXhlZCBSYXRlIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKSA8ZW0+SGFzIEZpeGVkIFJhdGUgVW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzRml4ZWRSYXRlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0ZpeGVkUmF0ZVVuaXRzID0gSEFTX0ZJWEVEX1JBVEVfVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEhhcyBGaXhlZCBSYXRlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGaXhlZFJhdGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJWEVEX01BVEVSSUFMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpeGVkTWF0ZXJpYWwoKSA8ZW0+Rml4ZWQgTWF0ZXJpYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRml4ZWRNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBNYXRlcmlhbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZml4ZWRNYXRlcmlhbEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheSgpIDxlbT5MZXZlbGluZyBEZWxheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxpbmdEZWxheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheSA9IExFVkVMSU5HX0RFTEFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKSA8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGlua2VkRmllbGRzKCkgPGVtPkxpbmtlZCBGaWVsZHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGlua2VkRmllbGRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTElOS0VEX0ZJRUxEU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMaW5rZWRGaWVsZHMoKSA8ZW0+TGlua2VkIEZpZWxkczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMaW5rZWRGaWVsZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkcyA9IExJTktFRF9GSUVMRFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIExpbmtlZCBGaWVsZHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxpbmtlZEZpZWxkc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlMRVNUT05FX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pbGVzdG9uZSgpIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmUgPSBNSUxFU1RPTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pbGVzdG9uZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWlsZXN0b25lRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPdmVyYWxsb2NhdGVkKCkgPGVtPk92ZXJhbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlcmFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJBTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlcmFsbG9jYXRlZCgpIDxlbT5PdmVyYWxsb2NhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc092ZXJhbGxvY2F0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJhbGxvY2F0ZWQgPSBPVkVSQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyYWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyYWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nV29yaygpIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZW1haW5pbmdXb3JrID0gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNwb25zZVBlbmRpbmcoKSA8ZW0+UmVzcG9uc2UgUGVuZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXNwb25zZVBlbmRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNQT05TRV9QRU5ESU5HX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3BvbnNlUGVuZGluZygpIDxlbT5SZXNwb25zZSBQZW5kaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3BvbnNlUGVuZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nID0gUkVTUE9OU0VfUEVORElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzcG9uc2UgUGVuZGluZyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzcG9uc2VQZW5kaW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9QX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0b3AoKSA8ZW0+U3RvcDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RvcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzdG9wID0gU1RPUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFU1VNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bWUoKSA8ZW0+UmVzdW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVzdW1lID0gUkVTVU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pdHMoKSA8ZW0+VW5pdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFVOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXRzKCkgPGVtPlVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHVuaXRzID0gVU5JVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VwZGF0ZU5lZWRlZCgpIDxlbT5VcGRhdGUgTmVlZGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1VwZGF0ZU5lZWRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVQREFURV9ORUVERURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVXBkYXRlTmVlZGVkKCkgPGVtPlVwZGF0ZSBOZWVkZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXBkYXRlTmVlZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWQgPSBVUERBVEVfTkVFREVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBVcGRhdGUgTmVlZGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1cGRhdGVOZWVkZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VkFDKCkgPGVtPlZBQzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VkFDKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFZBQ19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWQUMoKSA8ZW0+VkFDPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWQUMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB2QUMgPSBWQUNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFZBQyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdkFDRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0NvbnRvdXIoKSA8ZW0+V29yayBDb250b3VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrQ29udG91cigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfQ09OVE9VUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrQ29udG91cigpIDxlbT5Xb3JrIENvbnRvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtDb250b3VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB3b3JrQ29udG91ciA9IFdPUktfQ09OVE9VUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCb29raW5nVHlwZSgpIDxlbT5Cb29raW5nIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJvb2tpbmdUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQk9PS0lOR19UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlID0gQk9PS0lOR19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsV29ya1Byb3RlY3RlZCA9IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcmsgUHJvdGVjdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaW1lcGhhc2VkRGF0YSgpIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZXBoYXNlZERhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0aW1lcGhhc2VkRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBc3NpZ25tZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUYXNrVUlEKCkgewotCQlyZXR1cm4gdGFza1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVUlEKEJpZ0ludGVnZXIgbmV3VGFza1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFRhc2tVSUQgPSB0YXNrVUlEOwotCQl0YXNrVUlEID0gbmV3VGFza1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRCwgb2xkVGFza1VJRCwgdGFza1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFJlc291cmNlVUlEKCkgewotCQlyZXR1cm4gcmVzb3VyY2VVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VVSUQoQmlnSW50ZWdlciBuZXdSZXNvdXJjZVVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFJlc291cmNlVUlEID0gcmVzb3VyY2VVSUQ7Ci0JCXJlc291cmNlVUlEID0gbmV3UmVzb3VyY2VVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlELCBvbGRSZXNvdXJjZVVJRCwgcmVzb3VyY2VVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEUsIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUsIHBlcmNlbnRXb3JrQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gYWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZEFjdHVhbENvc3QgPSBhY3R1YWxDb3N0OwotCQlhY3R1YWxDb3N0ID0gbmV3QWN0dWFsQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsRmluaXNoKCkgewotCQlyZXR1cm4gYWN0dWFsRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbEZpbmlzaChPYmplY3QgbmV3QWN0dWFsRmluaXNoKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxGaW5pc2ggPSBhY3R1YWxGaW5pc2g7Ci0JCWFjdHVhbEZpbmlzaCA9IG5ld0FjdHVhbEZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNILCBvbGRBY3R1YWxGaW5pc2gsIGFjdHVhbEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVCwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0LCBhY3R1YWxPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxTdGFydCgpIHsKLQkJcmV0dXJuIGFjdHVhbFN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFN0YXJ0KE9iamVjdCBuZXdBY3R1YWxTdGFydCkgewotCQlPYmplY3Qgb2xkQWN0dWFsU3RhcnQgPSBhY3R1YWxTdGFydDsKLQkJYWN0dWFsU3RhcnQgPSBuZXdBY3R1YWxTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQsIG9sZEFjdHVhbFN0YXJ0LCBhY3R1YWxTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLLCBvbGRBY3R1YWxXb3JrLCBhY3R1YWxXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEFDV1AoKSB7Ci0JCXJldHVybiBhQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFDV1AoZmxvYXQgbmV3QUNXUCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYUNXUCA9IG5ld0FDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1AsIG9sZEFDV1AsIGFDV1AsICFvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QUNXUCgpIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWJvb2xlYW4gb2xkQUNXUEVTZXQgPSBhQ1dQRVNldDsKLQkJYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0JCWFDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlybWVkKCkgewotCQlyZXR1cm4gY29uZmlybWVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpcm1lZChib29sZWFuIG5ld0NvbmZpcm1lZCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJY29uZmlybWVkID0gbmV3Q29uZmlybWVkOwotCQlib29sZWFuIG9sZENvbmZpcm1lZEVTZXQgPSBjb25maXJtZWRFU2V0OwotCQljb25maXJtZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgY29uZmlybWVkLCAhb2xkQ29uZmlybWVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29uZmlybWVkKCkgewotCQlib29sZWFuIG9sZENvbmZpcm1lZCA9IGNvbmZpcm1lZDsKLQkJYm9vbGVhbiBvbGRDb25maXJtZWRFU2V0ID0gY29uZmlybWVkRVNldDsKLQkJY29uZmlybWVkID0gQ09ORklSTUVEX0VERUZBVUxUOwotCQljb25maXJtZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT05GSVJNRUQsIG9sZENvbmZpcm1lZCwgQ09ORklSTUVEX0VERUZBVUxULCBvbGRDb25maXJtZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDb25maXJtZWQoKSB7Ci0JCXJldHVybiBjb25maXJtZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoQmlnRGVjaW1hbCBuZXdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQ29zdCA9IGNvc3Q7Ci0JCWNvc3QgPSBuZXdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRDb3N0UmF0ZVRhYmxlKCkgewotCQlyZXR1cm4gY29zdFJhdGVUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UmF0ZVRhYmxlKEJpZ0ludGVnZXIgbmV3Q29zdFJhdGVUYWJsZSkgewotCQlCaWdJbnRlZ2VyIG9sZENvc3RSYXRlVGFibGUgPSBjb3N0UmF0ZVRhYmxlOwotCQljb3N0UmF0ZVRhYmxlID0gbmV3Q29zdFJhdGVUYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEUsIG9sZENvc3RSYXRlVGFibGUsIGNvc3RSYXRlVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3RWYXJpYW5jZShmbG9hdCBuZXdDb3N0VmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkQ29zdFZhcmlhbmNlID0gY29zdFZhcmlhbmNlOwotCQljb3N0VmFyaWFuY2UgPSBuZXdDb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgQ09TVF9WQVJJQU5DRV9FREVGQVVMVCwgb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdFZhcmlhbmNlKCkgewotCQlyZXR1cm4gY29zdFZhcmlhbmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DViwgb2xkQ1YsIGNWLCAhb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDVigpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWID0gQ1ZfRURFRkFVTFQ7Ci0JCWNWRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1YsIG9sZENWLCBDVl9FREVGQVVMVCwgb2xkQ1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRDVigpIHsKLQkJcmV0dXJuIGNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREZWxheSgpIHsKLQkJcmV0dXJuIGRlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGF5KEJpZ0ludGVnZXIgbmV3RGVsYXkpIHsKLQkJQmlnSW50ZWdlciBvbGREZWxheSA9IGRlbGF5OwotCQlkZWxheSA9IG5ld0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZLCBvbGREZWxheSwgZGVsYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNILCBvbGRGaW5pc2gsIGZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZpbmlzaFZhcmlhbmNlKCkgewotCQlyZXR1cm4gZmluaXNoVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoVmFyaWFuY2UoQmlnSW50ZWdlciBuZXdGaW5pc2hWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZEZpbmlzaFZhcmlhbmNlID0gZmluaXNoVmFyaWFuY2U7Ci0JCWZpbmlzaFZhcmlhbmNlID0gbmV3RmluaXNoVmFyaWFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFLCBvbGRGaW5pc2hWYXJpYW5jZSwgZmluaXNoVmFyaWFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGluaygpIHsKLQkJcmV0dXJuIGh5cGVybGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmsoU3RyaW5nIG5ld0h5cGVybGluaykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rID0gaHlwZXJsaW5rOwotCQloeXBlcmxpbmsgPSBuZXdIeXBlcmxpbms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LLCBvbGRIeXBlcmxpbmssIGh5cGVybGluaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rQWRkcmVzcygpIHsKLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rQWRkcmVzcyhTdHJpbmcgbmV3SHlwZXJsaW5rQWRkcmVzcykgewotCQlTdHJpbmcgb2xkSHlwZXJsaW5rQWRkcmVzcyA9IGh5cGVybGlua0FkZHJlc3M7Ci0JCWh5cGVybGlua0FkZHJlc3MgPSBuZXdIeXBlcmxpbmtBZGRyZXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTLCBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzLCBoeXBlcmxpbmtTdWJBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrVmFyaWFuY2UoZmxvYXQgbmV3V29ya1ZhcmlhbmNlKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJd29ya1ZhcmlhbmNlID0gbmV3V29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIFdPUktfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFdvcmtWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIHdvcmtWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJcmV0dXJuIGhhc0ZpeGVkUmF0ZVVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc0ZpeGVkUmF0ZVVuaXRzKGJvb2xlYW4gbmV3SGFzRml4ZWRSYXRlVW5pdHMpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQloYXNGaXhlZFJhdGVVbml0cyA9IG5ld0hhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIGhhc0ZpeGVkUmF0ZVVuaXRzLCAhb2xkSGFzRml4ZWRSYXRlVW5pdHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpIHsKLQkJYm9vbGVhbiBvbGRIYXNGaXhlZFJhdGVVbml0cyA9IGhhc0ZpeGVkUmF0ZVVuaXRzOwotCQlib29sZWFuIG9sZEhhc0ZpeGVkUmF0ZVVuaXRzRVNldCA9IGhhc0ZpeGVkUmF0ZVVuaXRzRVNldDsKLQkJaGFzRml4ZWRSYXRlVW5pdHMgPSBIQVNfRklYRURfUkFURV9VTklUU19FREVGQVVMVDsKLQkJaGFzRml4ZWRSYXRlVW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUywgb2xkSGFzRml4ZWRSYXRlVW5pdHMsIEhBU19GSVhFRF9SQVRFX1VOSVRTX0VERUZBVUxULCBvbGRIYXNGaXhlZFJhdGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhhc0ZpeGVkUmF0ZVVuaXRzKCkgewotCQlyZXR1cm4gaGFzRml4ZWRSYXRlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rml4ZWRNYXRlcmlhbChib29sZWFuIG5ld0ZpeGVkTWF0ZXJpYWwpIHsKLQkJYm9vbGVhbiBvbGRGaXhlZE1hdGVyaWFsID0gZml4ZWRNYXRlcmlhbDsKLQkJZml4ZWRNYXRlcmlhbCA9IG5ld0ZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMLCBvbGRGaXhlZE1hdGVyaWFsLCBmaXhlZE1hdGVyaWFsLCAhb2xkRml4ZWRNYXRlcmlhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkTWF0ZXJpYWwoKSB7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbCA9IGZpeGVkTWF0ZXJpYWw7Ci0JCWJvb2xlYW4gb2xkRml4ZWRNYXRlcmlhbEVTZXQgPSBmaXhlZE1hdGVyaWFsRVNldDsKLQkJZml4ZWRNYXRlcmlhbCA9IEZJWEVEX01BVEVSSUFMX0VERUZBVUxUOwotCQlmaXhlZE1hdGVyaWFsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUwsIG9sZEZpeGVkTWF0ZXJpYWwsIEZJWEVEX01BVEVSSUFMX0VERUZBVUxULCBvbGRGaXhlZE1hdGVyaWFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Rml4ZWRNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGZpeGVkTWF0ZXJpYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua2VkRmllbGRzKGJvb2xlYW4gbmV3TGlua2VkRmllbGRzKSB7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzID0gbGlua2VkRmllbGRzOwotCQlsaW5rZWRGaWVsZHMgPSBuZXdMaW5rZWRGaWVsZHM7Ci0JCWJvb2xlYW4gb2xkTGlua2VkRmllbGRzRVNldCA9IGxpbmtlZEZpZWxkc0VTZXQ7Ci0JCWxpbmtlZEZpZWxkc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFMsIG9sZExpbmtlZEZpZWxkcywgbGlua2VkRmllbGRzLCAhb2xkTGlua2VkRmllbGRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGlua2VkRmllbGRzKCkgewotCQlib29sZWFuIG9sZExpbmtlZEZpZWxkcyA9IGxpbmtlZEZpZWxkczsKLQkJYm9vbGVhbiBvbGRMaW5rZWRGaWVsZHNFU2V0ID0gbGlua2VkRmllbGRzRVNldDsKLQkJbGlua2VkRmllbGRzID0gTElOS0VEX0ZJRUxEU19FREVGQVVMVDsKLQkJbGlua2VkRmllbGRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUywgb2xkTGlua2VkRmllbGRzLCBMSU5LRURfRklFTERTX0VERUZBVUxULCBvbGRMaW5rZWRGaWVsZHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5rZWRGaWVsZHMoKSB7Ci0JCXJldHVybiBsaW5rZWRGaWVsZHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90ZXMoKSB7Ci0JCXJldHVybiBub3RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RlcyhTdHJpbmcgbmV3Tm90ZXMpIHsKLQkJU3RyaW5nIG9sZE5vdGVzID0gbm90ZXM7Ci0JCW5vdGVzID0gbmV3Tm90ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlcmFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJhbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcmFsbG9jYXRlZChib29sZWFuIG5ld092ZXJhbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJb3ZlcmFsbG9jYXRlZCA9IG5ld092ZXJhbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlcmFsbG9jYXRlZEVTZXQgPSBvdmVyYWxsb2NhdGVkRVNldDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIG92ZXJhbGxvY2F0ZWQsICFvbGRPdmVyYWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0T3ZlcmFsbG9jYXRlZCgpIHsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkID0gb3ZlcmFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyYWxsb2NhdGVkRVNldCA9IG92ZXJhbGxvY2F0ZWRFU2V0OwotCQlvdmVyYWxsb2NhdGVkID0gT1ZFUkFMTE9DQVRFRF9FREVGQVVMVDsKLQkJb3ZlcmFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQsIG9sZE92ZXJhbGxvY2F0ZWQsIE9WRVJBTExPQ0FURURfRURFRkFVTFQsIG9sZE92ZXJhbGxvY2F0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPdmVyYWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlcmFsbG9jYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0T3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZE92ZXJ0aW1lQ29zdCA9IG92ZXJ0aW1lQ29zdDsKLQkJb3ZlcnRpbWVDb3N0ID0gbmV3T3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUkssIG9sZE92ZXJ0aW1lV29yaywgb3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldFJlbWFpbmluZ0Nvc3QoKSB7Ci0JCXJldHVybiByZW1haW5pbmdDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ0Nvc3QoQmlnRGVjaW1hbCBuZXdSZW1haW5pbmdDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkUmVtYWluaW5nQ29zdCA9IHJlbWFpbmluZ0Nvc3Q7Ci0JCXJlbWFpbmluZ0Nvc3QgPSBuZXdSZW1haW5pbmdDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlbWFpbmluZ1dvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ1dvcmsoT2JqZWN0IG5ld1JlbWFpbmluZ1dvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ1dvcmsgPSByZW1haW5pbmdXb3JrOwotCQlyZW1haW5pbmdXb3JrID0gbmV3UmVtYWluaW5nV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3BvbnNlUGVuZGluZyhib29sZWFuIG5ld1Jlc3BvbnNlUGVuZGluZykgewotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZyA9IHJlc3BvbnNlUGVuZGluZzsKLQkJcmVzcG9uc2VQZW5kaW5nID0gbmV3UmVzcG9uc2VQZW5kaW5nOwotCQlib29sZWFuIG9sZFJlc3BvbnNlUGVuZGluZ0VTZXQgPSByZXNwb25zZVBlbmRpbmdFU2V0OwotCQlyZXNwb25zZVBlbmRpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HLCBvbGRSZXNwb25zZVBlbmRpbmcsIHJlc3BvbnNlUGVuZGluZywgIW9sZFJlc3BvbnNlUGVuZGluZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3BvbnNlUGVuZGluZygpIHsKLQkJYm9vbGVhbiBvbGRSZXNwb25zZVBlbmRpbmcgPSByZXNwb25zZVBlbmRpbmc7Ci0JCWJvb2xlYW4gb2xkUmVzcG9uc2VQZW5kaW5nRVNldCA9IHJlc3BvbnNlUGVuZGluZ0VTZXQ7Ci0JCXJlc3BvbnNlUGVuZGluZyA9IFJFU1BPTlNFX1BFTkRJTkdfRURFRkFVTFQ7Ci0JCXJlc3BvbnNlUGVuZGluZ0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1BPTlNFX1BFTkRJTkcsIG9sZFJlc3BvbnNlUGVuZGluZywgUkVTUE9OU0VfUEVORElOR19FREVGQVVMVCwgb2xkUmVzcG9uc2VQZW5kaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzcG9uc2VQZW5kaW5nKCkgewotCQlyZXR1cm4gcmVzcG9uc2VQZW5kaW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0b3AoKSB7Ci0JCXJldHVybiBzdG9wOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0b3AoT2JqZWN0IG5ld1N0b3ApIHsKLQkJT2JqZWN0IG9sZFN0b3AgPSBzdG9wOwotCQlzdG9wID0gbmV3U3RvcDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QLCBvbGRTdG9wLCBzdG9wKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZXN1bWUoKSB7Ci0JCXJldHVybiByZXN1bWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdW1lKE9iamVjdCBuZXdSZXN1bWUpIHsKLQkJT2JqZWN0IG9sZFJlc3VtZSA9IHJlc3VtZTsKLQkJcmVzdW1lID0gbmV3UmVzdW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRSwgb2xkUmVzdW1lLCByZXN1bWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRTdGFydFZhcmlhbmNlKCkgewotCQlyZXR1cm4gc3RhcnRWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydFZhcmlhbmNlKEJpZ0ludGVnZXIgbmV3U3RhcnRWYXJpYW5jZSkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YXJ0VmFyaWFuY2UgPSBzdGFydFZhcmlhbmNlOwotCQlzdGFydFZhcmlhbmNlID0gbmV3U3RhcnRWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRSwgb2xkU3RhcnRWYXJpYW5jZSwgc3RhcnRWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRVbml0cygpIHsKLQkJcmV0dXJuIHVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXRzKGZsb2F0IG5ld1VuaXRzKSB7Ci0JCWZsb2F0IG9sZFVuaXRzID0gdW5pdHM7Ci0JCXVuaXRzID0gbmV3VW5pdHM7Ci0JCWJvb2xlYW4gb2xkVW5pdHNFU2V0ID0gdW5pdHNFU2V0OwotCQl1bml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VOSVRTLCBvbGRVbml0cywgdW5pdHMsICFvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVuaXRzKCkgewotCQlmbG9hdCBvbGRVbml0cyA9IHVuaXRzOwotCQlib29sZWFuIG9sZFVuaXRzRVNldCA9IHVuaXRzRVNldDsKLQkJdW5pdHMgPSBVTklUU19FREVGQVVMVDsKLQkJdW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUywgb2xkVW5pdHMsIFVOSVRTX0VERUZBVUxULCBvbGRVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVuaXRzKCkgewotCQlyZXR1cm4gdW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZU5lZWRlZChib29sZWFuIG5ld1VwZGF0ZU5lZWRlZCkgewotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZCA9IHVwZGF0ZU5lZWRlZDsKLQkJdXBkYXRlTmVlZGVkID0gbmV3VXBkYXRlTmVlZGVkOwotCQlib29sZWFuIG9sZFVwZGF0ZU5lZWRlZEVTZXQgPSB1cGRhdGVOZWVkZWRFU2V0OwotCQl1cGRhdGVOZWVkZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVELCBvbGRVcGRhdGVOZWVkZWQsIHVwZGF0ZU5lZWRlZCwgIW9sZFVwZGF0ZU5lZWRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFVwZGF0ZU5lZWRlZCgpIHsKLQkJYm9vbGVhbiBvbGRVcGRhdGVOZWVkZWQgPSB1cGRhdGVOZWVkZWQ7Ci0JCWJvb2xlYW4gb2xkVXBkYXRlTmVlZGVkRVNldCA9IHVwZGF0ZU5lZWRlZEVTZXQ7Ci0JCXVwZGF0ZU5lZWRlZCA9IFVQREFURV9ORUVERURfRURFRkFVTFQ7Ci0JCXVwZGF0ZU5lZWRlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQsIG9sZFVwZGF0ZU5lZWRlZCwgVVBEQVRFX05FRURFRF9FREVGQVVMVCwgb2xkVXBkYXRlTmVlZGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VXBkYXRlTmVlZGVkKCkgewotCQlyZXR1cm4gdXBkYXRlTmVlZGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0VkFDKCkgewotCQlyZXR1cm4gdkFDOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZBQyhmbG9hdCBuZXdWQUMpIHsKLQkJZmxvYXQgb2xkVkFDID0gdkFDOwotCQl2QUMgPSBuZXdWQUM7Ci0JCWJvb2xlYW4gb2xkVkFDRVNldCA9IHZBQ0VTZXQ7Ci0JCXZBQ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQywgb2xkVkFDLCB2QUMsICFvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRWQUMoKSB7Ci0JCWZsb2F0IG9sZFZBQyA9IHZBQzsKLQkJYm9vbGVhbiBvbGRWQUNFU2V0ID0gdkFDRVNldDsKLQkJdkFDID0gVkFDX0VERUZBVUxUOwotCQl2QUNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19WQUMsIG9sZFZBQywgVkFDX0VERUZBVUxULCBvbGRWQUNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWQUMoKSB7Ci0JCXJldHVybiB2QUNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0V29yaygpIHsKLQkJcmV0dXJuIHdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29yayhPYmplY3QgbmV3V29yaykgewotCQlPYmplY3Qgb2xkV29yayA9IHdvcms7Ci0JCXdvcmsgPSBuZXdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRXb3JrQ29udG91cigpIHsKLQkJcmV0dXJuIHdvcmtDb250b3VyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtDb250b3VyKEJpZ0ludGVnZXIgbmV3V29ya0NvbnRvdXIpIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrQ29udG91ciA9IHdvcmtDb250b3VyOwotCQl3b3JrQ29udG91ciA9IG5ld1dvcmtDb250b3VyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUiwgb2xkV29ya0NvbnRvdXIsIHdvcmtDb250b3VyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRCb29raW5nVHlwZSgpIHsKLQkJcmV0dXJuIGJvb2tpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb2tpbmdUeXBlKEJpZ0ludGVnZXIgbmV3Qm9va2luZ1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRCb29raW5nVHlwZSA9IGJvb2tpbmdUeXBlOwotCQlib29raW5nVHlwZSA9IG5ld0Jvb2tpbmdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRSwgb2xkQm9va2luZ1R5cGUsIGJvb2tpbmdUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENyZWF0aW9uRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0aW9uRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0NyZWF0aW9uRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOwotCQljcmVhdGlvbkRhdGUgPSBuZXdDcmVhdGlvbkRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTQuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUzLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JBU0VMSU5FKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUaW1lcGhhc2VkRGF0YSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VGFza1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU09VUkNFX1VJRDoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXJldHVybiBnZXRBY3R1YWxTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc0NvbmZpcm1lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXJldHVybiBnZXRDb3N0UmF0ZVRhYmxlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENvc3RWYXJpYW5jZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBnZXREZWxheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hBU19GSVhFRF9SQVRFX1VOSVRTOgotCQkJCXJldHVybiBpc0hhc0ZpeGVkUmF0ZVVuaXRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJWEVEX01BVEVSSUFMOgotCQkJCXJldHVybiBpc0ZpeGVkTWF0ZXJpYWwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MRVZFTElOR19ERUxBWV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldExldmVsaW5nRGVsYXlGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc0xpbmtlZEZpZWxkcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19NSUxFU1RPTkU6Ci0JCQkJcmV0dXJuIGlzTWlsZXN0b25lKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXJldHVybiBnZXROb3RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJBTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlcmFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlZ3VsYXJXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNSZXNwb25zZVBlbmRpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFVuaXRzKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJcmV0dXJuIGlzVXBkYXRlTmVlZGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFZBQygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBnZXRXb3JrQ29udG91cigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dTKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlzZXRUYXNrVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXNldFJlc291cmNlVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXNldENvbmZpcm1lZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9SQVRFX1RBQkxFOgotCQkJCXNldENvc3RSYXRlVGFibGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlzZXRDVigoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19BRERSRVNTOgotCQkJCXNldEh5cGVybGlua0FkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLX1ZBUklBTkNFOgotCQkJCXNldFdvcmtWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IQVNfRklYRURfUkFURV9VTklUUzoKLQkJCQlzZXRIYXNGaXhlZFJhdGVVbml0cygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklYRURfTUFURVJJQUw6Ci0JCQkJc2V0Rml4ZWRNYXRlcmlhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTElOS0VEX0ZJRUxEUzoKLQkJCQlzZXRMaW5rZWRGaWVsZHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlzZXRNaWxlc3RvbmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXNldE92ZXJhbGxvY2F0ZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlzZXRSZXNwb25zZVBlbmRpbmcoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXNldFN0b3AoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQlzZXRVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXNldFVwZGF0ZU5lZWRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXNldFZBQygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfQ09OVE9VUjoKLQkJCQlzZXRXb3JrQ29udG91cigoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RBU0tfVUlEOgotCQkJCXNldFRhc2tVSUQoVEFTS19VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNPVVJDRV9VSUQ6Ci0JCQkJc2V0UmVzb3VyY2VVSUQoUkVTT1VSQ0VfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRXb3JrQ29tcGxldGUoUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsQ29zdChBQ1RVQUxfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJc2V0QWN0dWFsRmluaXNoKEFDVFVBTF9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZUNvc3QoQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDV1A6Ci0JCQkJdW5zZXRBQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPTkZJUk1FRDoKLQkJCQl1bnNldENvbmZpcm1lZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfUkFURV9UQUJMRToKLQkJCQlzZXRDb3N0UmF0ZVRhYmxlKENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1RfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRDb3N0VmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1Y6Ci0JCQkJdW5zZXRDVigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19ERUxBWToKLQkJCQlzZXREZWxheShERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXNldEZpbmlzaFZhcmlhbmNlKEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJdW5zZXRXb3JrVmFyaWFuY2UoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJdW5zZXRIYXNGaXhlZFJhdGVVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQl1bnNldEZpeGVkTWF0ZXJpYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xJTktFRF9GSUVMRFM6Ci0JCQkJdW5zZXRMaW5rZWRGaWVsZHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTUlMRVNUT05FOgotCQkJCXVuc2V0TWlsZXN0b25lKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX05PVEVTOgotCQkJCXNldE5vdGVzKE5PVEVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUkFMTE9DQVRFRDoKLQkJCQl1bnNldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoUkVHVUxBUl9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNQT05TRV9QRU5ESU5HOgotCQkJCXVuc2V0UmVzcG9uc2VQZW5kaW5nKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fU1RPUDoKLQkJCQlzZXRTdG9wKFNUT1BfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRVNVTUU6Ci0JCQkJc2V0UmVzdW1lKFJFU1VNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VTklUUzoKLQkJCQl1bnNldFVuaXRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1VQREFURV9ORUVERUQ6Ci0JCQkJdW5zZXRVcGRhdGVOZWVkZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVkFDOgotCQkJCXVuc2V0VkFDKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXNldFdvcmtDb250b3VyKFdPUktfQ09OVE9VUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZShCT09LSU5HX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKEFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19UQVNLX1VJRDoKLQkJCQlyZXR1cm4gVEFTS19VSURfRURFRkFVTFQgPT0gbnVsbCA/IHRhc2tVSUQgIT0gbnVsbCA6ICFUQVNLX1VJRF9FREVGQVVMVC5lcXVhbHModGFza1VJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTT1VSQ0VfVUlEOgotCQkJCXJldHVybiBSRVNPVVJDRV9VSURfRURFRkFVTFQgPT0gbnVsbCA/IHJlc291cmNlVUlEICE9IG51bGwgOiAhUkVTT1VSQ0VfVUlEX0VERUZBVUxULmVxdWFscyhyZXNvdXJjZVVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IHBlcmNlbnRXb3JrQ29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQuZXF1YWxzKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfRklOSVNIOgotCQkJCXJldHVybiBBQ1RVQUxfRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxGaW5pc2ggIT0gbnVsbCA6ICFBQ1RVQUxfRklOSVNIX0VERUZBVUxULmVxdWFscyhhY3R1YWxGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIEFDVFVBTF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsU3RhcnQgIT0gbnVsbCA6ICFBQ1RVQUxfU1RBUlRfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19BQ1RVQUxfV09SSzoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmsgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19FREVGQVVMVC5lcXVhbHMoYWN0dWFsV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09ORklSTUVEOgotCQkJCXJldHVybiBpc1NldENvbmZpcm1lZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0NPU1Q6Ci0JCQkJcmV0dXJuIENPU1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvc3QgIT0gbnVsbCA6ICFDT1NUX0VERUZBVUxULmVxdWFscyhjb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DT1NUX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIENPU1RfUkFURV9UQUJMRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFJhdGVUYWJsZSAhPSBudWxsIDogIUNPU1RfUkFURV9UQUJMRV9FREVGQVVMVC5lcXVhbHMoY29zdFJhdGVUYWJsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ09TVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRDb3N0VmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0RFTEFZOgotCQkJCXJldHVybiBERUxBWV9FREVGQVVMVCA9PSBudWxsID8gZGVsYXkgIT0gbnVsbCA6ICFERUxBWV9FREVGQVVMVC5lcXVhbHMoZGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LOgotCQkJCXJldHVybiBIWVBFUkxJTktfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGluayAhPSBudWxsIDogIUhZUEVSTElOS19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSFlQRVJMSU5LX1NVQl9BRERSRVNTOgotCQkJCXJldHVybiBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua1N1YkFkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fSEFTX0ZJWEVEX1JBVEVfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SGFzRml4ZWRSYXRlVW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19GSVhFRF9NQVRFUklBTDoKLQkJCQlyZXR1cm4gaXNTZXRGaXhlZE1hdGVyaWFsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fTEVWRUxJTkdfREVMQVk6Ci0JCQkJcmV0dXJuIExFVkVMSU5HX0RFTEFZX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBsZXZlbGluZ0RlbGF5Rm9ybWF0ICE9IG51bGwgOiAhTEVWRUxJTkdfREVMQVlfRk9STUFUX0VERUZBVUxULmVxdWFscyhsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19MSU5LRURfRklFTERTOgotCQkJCXJldHVybiBpc1NldExpbmtlZEZpZWxkcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNTZXRNaWxlc3RvbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19OT1RFUzoKLQkJCQlyZXR1cm4gTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IG5vdGVzICE9IG51bGwgOiAhTk9URVNfRURFRkFVTFQuZXF1YWxzKG5vdGVzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJhbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lV29yayAhPSBudWxsIDogIU9WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdPdmVydGltZVdvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nT3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTUE9OU0VfUEVORElORzoKLQkJCQlyZXR1cm4gaXNTZXRSZXNwb25zZVBlbmRpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVE9QOgotCQkJCXJldHVybiBTVE9QX0VERUZBVUxUID09IG51bGwgPyBzdG9wICE9IG51bGwgOiAhU1RPUF9FREVGQVVMVC5lcXVhbHMoc3RvcCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fUkVTVU1FOgotCQkJCXJldHVybiBSRVNVTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VtZSAhPSBudWxsIDogIVJFU1VNRV9FREVGQVVMVC5lcXVhbHMocmVzdW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0VW5pdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19VUERBVEVfTkVFREVEOgotCQkJCXJldHVybiBpc1NldFVwZGF0ZU5lZWRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1ZBQzoKLQkJCQlyZXR1cm4gaXNTZXRWQUMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fV09SS19DT05UT1VSOgotCQkJCXJldHVybiBXT1JLX0NPTlRPVVJfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtDb250b3VyICE9IG51bGwgOiAhV09SS19DT05UT1VSX0VERUZBVUxULmVxdWFscyh3b3JrQ29udG91cik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVF9fQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gQ1JFQVRJT05fREFURV9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25EYXRlICE9IG51bGwgOiAhQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoY3JlYXRpb25EYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UX19CQVNFTElORToKLQkJCQlyZXR1cm4gYmFzZWxpbmUgIT0gbnVsbCAmJiAhYmFzZWxpbmUuaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gdGltZXBoYXNlZERhdGEgIT0gbnVsbCAmJiAhdGltZXBoYXNlZERhdGEuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhc2tVSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRhc2tVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNvdXJjZVVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb25maXJtZWQ6ICIpOwotCQlpZiAoY29uZmlybWVkRVNldCkgcmVzdWx0LmFwcGVuZChjb25maXJtZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UmF0ZVRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UmF0ZVRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWxheTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVsYXkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGluazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaHlwZXJsaW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoeXBlcmxpbmtTdWJBZGRyZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYXNGaXhlZFJhdGVVbml0czogIik7Ci0JCWlmIChoYXNGaXhlZFJhdGVVbml0c0VTZXQpIHJlc3VsdC5hcHBlbmQoaGFzRml4ZWRSYXRlVW5pdHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZE1hdGVyaWFsOiAiKTsKLQkJaWYgKGZpeGVkTWF0ZXJpYWxFU2V0KSByZXN1bHQuYXBwZW5kKGZpeGVkTWF0ZXJpYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsaW5rZWRGaWVsZHM6ICIpOwotCQlpZiAobGlua2VkRmllbGRzRVNldCkgcmVzdWx0LmFwcGVuZChsaW5rZWRGaWVsZHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWxlc3RvbmU6ICIpOwotCQlpZiAobWlsZXN0b25lRVNldCkgcmVzdWx0LmFwcGVuZChtaWxlc3RvbmUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm90ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJhbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlcmFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlcmFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3BvbnNlUGVuZGluZzogIik7Ci0JCWlmIChyZXNwb25zZVBlbmRpbmdFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3BvbnNlUGVuZGluZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RvcDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RvcCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0VmFyaWFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0VmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXRzOiAiKTsKLQkJaWYgKHVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZCh1bml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVwZGF0ZU5lZWRlZDogIik7Ci0JCWlmICh1cGRhdGVOZWVkZWRFU2V0KSByZXN1bHQuYXBwZW5kKHVwZGF0ZU5lZWRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZBQzogIik7Ci0JCWlmICh2QUNFU2V0KSByZXN1bHQuYXBwZW5kKHZBQyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtDb250b3VyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrQ29udG91cik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Bc3NpZ25tZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Fzc2lnbm1lbnRzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI1NjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Bc3NpZ25tZW50c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFzc2lnbm1lbnRzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFzc2lnbm1lbnRzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXNzaWdubWVudHNJbXBsI2dldEFzc2lnbm1lbnQgPGVtPkFzc2lnbm1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NpZ25tZW50c0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEFzc2lnbm1lbnRzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NpZ25tZW50KCkgPGVtPkFzc2lnbm1lbnQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGFzc2lnbm1lbnQgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFzc2lnbm1lbnRzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFzc2lnbm1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEFzc2lnbm1lbnQoKSB7Ci0JCWlmIChhc3NpZ25tZW50ID09IG51bGwpIHsKLQkJCWFzc2lnbm1lbnQgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQXNzaWdubWVudC5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UU19fQVNTSUdOTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEFzc2lnbm1lbnQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCXJldHVybiBnZXRBc3NpZ25tZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTX19BU1NJR05NRU5UOgotCQkJCWdldEFzc2lnbm1lbnQoKS5jbGVhcigpOwotCQkJCWdldEFzc2lnbm1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJZ2V0QXNzaWdubWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVFNfX0FTU0lHTk1FTlQ6Ci0JCQkJcmV0dXJuIGFzc2lnbm1lbnQgIT0gbnVsbCAmJiAhYXNzaWdubWVudC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0Fzc2lnbm1lbnRzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NjBiYWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0F2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEF2YWlsYWJpbGl0eVBlcmlvZEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdmFpbGFiaWxpdHkgUGVyaW9kPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQXZhaWxhYmlsaXR5UGVyaW9kSW1wbCNnZXRBdmFpbGFibGVGcm9tIDxlbT5BdmFpbGFibGUgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkF2YWlsYWJpbGl0eVBlcmlvZEltcGwjZ2V0QXZhaWxhYmxlVW5pdHMgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEF2YWlsYWJpbGl0eVBlcmlvZEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEF2YWlsYWJpbGl0eVBlcmlvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVVuaXRzKCkgPGVtPkF2YWlsYWJsZSBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBhdmFpbGFibGVVbml0cyA9IEFWQUlMQUJMRV9VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXZhaWxhYmxlIFVuaXRzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdmFpbGFibGVVbml0c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBdmFpbGFibGVGcm9tKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlRnJvbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdmFpbGFibGVGcm9tKE9iamVjdCBuZXdBdmFpbGFibGVGcm9tKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVGcm9tID0gYXZhaWxhYmxlRnJvbTsKLQkJYXZhaWxhYmxlRnJvbSA9IG5ld0F2YWlsYWJsZUZyb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTywgb2xkQXZhaWxhYmxlVG8sIGF2YWlsYWJsZVRvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVW5pdHMoZmxvYXQgbmV3QXZhaWxhYmxlVW5pdHMpIHsKLQkJZmxvYXQgb2xkQXZhaWxhYmxlVW5pdHMgPSBhdmFpbGFibGVVbml0czsKLQkJYXZhaWxhYmxlVW5pdHMgPSBuZXdBdmFpbGFibGVVbml0czsKLQkJYm9vbGVhbiBvbGRBdmFpbGFibGVVbml0c0VTZXQgPSBhdmFpbGFibGVVbml0c0VTZXQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgYXZhaWxhYmxlVW5pdHMsICFvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF2YWlsYWJsZVVuaXRzKCkgewotCQlmbG9hdCBvbGRBdmFpbGFibGVVbml0cyA9IGF2YWlsYWJsZVVuaXRzOwotCQlib29sZWFuIG9sZEF2YWlsYWJsZVVuaXRzRVNldCA9IGF2YWlsYWJsZVVuaXRzRVNldDsKLQkJYXZhaWxhYmxlVW5pdHMgPSBBVkFJTEFCTEVfVU5JVFNfRURFRkFVTFQ7Ci0JCWF2YWlsYWJsZVVuaXRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTLCBvbGRBdmFpbGFibGVVbml0cywgQVZBSUxBQkxFX1VOSVRTX0VERUZBVUxULCBvbGRBdmFpbGFibGVVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF2YWlsYWJsZVVuaXRzKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlRnJvbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRBdmFpbGFibGVVbml0cygpKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX0ZST006Ci0JCQkJc2V0QXZhaWxhYmxlRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXNldEF2YWlsYWJsZVRvKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVU5JVFM6Ci0JCQkJc2V0QXZhaWxhYmxlVW5pdHMoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oQVZBSUxBQkxFX0ZST01fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oQVZBSUxBQkxFX1RPX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXVuc2V0QXZhaWxhYmxlVW5pdHMoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EX19BVkFJTEFCTEVfRlJPTToKLQkJCQlyZXR1cm4gQVZBSUxBQkxFX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZUZyb20gIT0gbnVsbCA6ICFBVkFJTEFCTEVfRlJPTV9FREVGQVVMVC5lcXVhbHMoYXZhaWxhYmxlRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1RPOgotCQkJCXJldHVybiBBVkFJTEFCTEVfVE9fRURFRkFVTFQgPT0gbnVsbCA/IGF2YWlsYWJsZVRvICE9IG51bGwgOiAhQVZBSUxBQkxFX1RPX0VERUZBVUxULmVxdWFscyhhdmFpbGFibGVUbyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRF9fQVZBSUxBQkxFX1VOSVRTOgotCQkJCXJldHVybiBpc1NldEF2YWlsYWJsZVVuaXRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdmFpbGFibGVGcm9tOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVGcm9tKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdmFpbGFibGVUbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXZhaWxhYmxlVG8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVVuaXRzOiAiKTsKLQkJaWYgKGF2YWlsYWJsZVVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChhdmFpbGFibGVVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BdmFpbGFiaWxpdHlQZXJpb2RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY1NDgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5BdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCNnZXRBdmFpbGFiaWxpdHlQZXJpb2QgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQXZhaWxhYmlsaXR5UGVyaW9kcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXZhaWxhYmlsaXR5UGVyaW9kID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChBdmFpbGFiaWxpdHlQZXJpb2QuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0QpOwotCQl9Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFNfX0FWQUlMQUJJTElUWV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIGdldEF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EU19fQVZBSUxBQklMSVRZX1BFUklPRDoKLQkJCQlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTX19BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2QgIT0gbnVsbCAmJiAhYXZhaWxhYmlsaXR5UGVyaW9kLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vQXZhaWxhYmlsaXR5UGVyaW9kc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGRjM2QxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTJJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlbGluZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTJJbXBsI2dldE51bWJlciA8ZW0+TnVtYmVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRXb3JrIDxlbT5Xb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmUySW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQmFzZWxpbmUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlcigpIDxlbT5OdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bWJlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbnVtYmVyID0gTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgd29yayA9IFdPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENPU1RfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENvc3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvc3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZWxpbmUySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lMigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE51bWJlcigpIHsKLQkJcmV0dXJuIG51bWJlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdW1iZXIoQmlnSW50ZWdlciBuZXdOdW1iZXIpIHsKLQkJQmlnSW50ZWdlciBvbGROdW1iZXIgPSBudW1iZXI7Ci0JCW51bWJlciA9IG5ld051bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChmbG9hdCBuZXdDb3N0KSB7Ci0JCWZsb2F0IG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJYm9vbGVhbiBvbGRDb3N0RVNldCA9IGNvc3RFU2V0OwotCQljb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NULCBvbGRDb3N0LCBjb3N0LCAhb2xkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENvc3QoKSB7Ci0JCWZsb2F0IG9sZENvc3QgPSBjb3N0OwotCQlib29sZWFuIG9sZENvc3RFU2V0ID0gY29zdEVTZXQ7Ci0JCWNvc3QgPSBDT1NUX0VERUZBVUxUOwotCQljb3N0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NULCBvbGRDb3N0LCBDT1NUX0VERUZBVUxULCBvbGRDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1MsIG9sZEJDV1MsIEJDV1NfRURFRkFVTFQsIG9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXU0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1AoZmxvYXQgbmV3QkNXUCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYkNXUCA9IG5ld0JDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fV09SSzoKLQkJCQlyZXR1cm4gZ2V0V29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQ09TVDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENvc3QoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJc2V0V29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXNldENvc3QoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19CQ1dQOgotCQkJCXNldEJDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fTlVNQkVSOgotCQkJCXNldE51bWJlcihOVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXVuc2V0Q29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19XT1JLOgotCQkJCXJldHVybiBXT1JLX0VERUZBVUxUID09IG51bGwgPyB3b3JrICE9IG51bGwgOiAhV09SS19FREVGQVVMVC5lcXVhbHMod29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUyX19DT1NUOgotCQkJCXJldHVybiBpc1NldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTJfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMl9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChudW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG51bWJlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCWlmIChjb3N0RVNldCkgcmVzdWx0LmFwcGVuZChjb3N0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lMkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQmFzZWxpbmUzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVjZjQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZTNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCYXNlbGluZTNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lM0ltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZTNJbXBsI2dldEJDV1AgPGVtPkJDV1A8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlbGluZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBCYXNlbGluZTMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUJFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbnVtYmVyID0gTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29zdCA9IENPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1NfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUygpIDxlbT5CQ1dTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dTKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1NFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEJDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QkNXUCgpIDxlbT5CQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEJDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmFzZWxpbmUzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJhc2VsaW5lMygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihTdHJpbmcgbmV3TnVtYmVyKSB7Ci0JCVN0cmluZyBvbGROdW1iZXIgPSBudW1iZXI7Ci0JCW51bWJlciA9IG5ld051bWJlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUiwgb2xkTnVtYmVyLCBudW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoU3RyaW5nIG5ld1N0YXJ0KSB7Ci0JCVN0cmluZyBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQsIG9sZFN0YXJ0LCBzdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluaXNoKCkgewotCQlyZXR1cm4gZmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaChTdHJpbmcgbmV3RmluaXNoKSB7Ci0JCVN0cmluZyBvbGRGaW5pc2ggPSBmaW5pc2g7Ci0JCWZpbmlzaCA9IG5ld0ZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvc3QoKSB7Ci0JCXJldHVybiBjb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvc3QoU3RyaW5nIG5ld0Nvc3QpIHsKLQkJU3RyaW5nIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QkNXUyhmbG9hdCBuZXdCQ1dTKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQliQ1dTID0gbmV3QkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBiQ1dTLCAhb2xkQkNXU0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1MoKSB7Ci0JCWZsb2F0IG9sZEJDV1MgPSBiQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1MgPSBCQ1dTX0VERUZBVUxUOwotCQliQ1dTRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIGJDV1AsICFvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUCgpIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJvb2xlYW4gb2xkQkNXUEVTZXQgPSBiQ1dQRVNldDsKLQkJYkNXUCA9IEJDV1BfRURFRkFVTFQ7Ci0JCWJDV1BFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1AsIG9sZEJDV1AsIEJDV1BfRURFRkFVTFQsIG9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlyZXR1cm4gZ2V0VGltZXBoYXNlZERhdGEoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlyZXR1cm4gZ2V0TnVtYmVyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXJldHVybiBnZXRDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlzZXRDb3N0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX0JDV1A6Ci0JCQkJc2V0QkNXUCgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTNfX1dPUks6Ci0JCQkJc2V0V29yayhXT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQl1bnNldEJDV1MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXVuc2V0QkNXUCgpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19OVU1CRVI6Ci0JCQkJcmV0dXJuIE5VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gbnVtYmVyICE9IG51bGwgOiAhTlVNQkVSX0VERUZBVUxULmVxdWFscyhudW1iZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19GSU5JU0g6Ci0JCQkJcmV0dXJuIEZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoICE9IG51bGwgOiAhRklOSVNIX0VERUZBVUxULmVxdWFscyhmaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FM19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkUzX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dTOiAiKTsKLQkJaWYgKGJDV1NFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiQ1dQOiAiKTsKLQkJaWYgKGJDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGJDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQmFzZWxpbmUzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0Jhc2VsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA3MDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9CYXNlbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJhc2VsaW5lSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2VsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFRpbWVwaGFzZWREYXRhIDxlbT5UaW1lcGhhc2VkIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0TnVtYmVyIDxlbT5OdW1iZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjaXNJbnRlcmltIDxlbT5JbnRlcmltPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRGaW5pc2ggPGVtPkZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXREdXJhdGlvbiA8ZW0+RHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNpc0VzdGltYXRlZER1cmF0aW9uIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkJhc2VsaW5lSW1wbCNnZXRDb3N0IDxlbT5Db3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQmFzZWxpbmVJbXBsI2dldEJDV1MgPGVtPkJDV1M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5CYXNlbGluZUltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJhc2VsaW5lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQmFzZWxpbmUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXIoKSA8ZW0+TnVtYmVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBOVU1CRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVtYmVyKCkgPGVtPk51bWJlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TnVtYmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBudW1iZXIgPSBOVU1CRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnRlcmltKCkgPGVtPkludGVyaW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW50ZXJpbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVEVSSU1fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW50ZXJpbSgpIDxlbT5JbnRlcmltPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0ludGVyaW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGludGVyaW0gPSBJTlRFUklNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJbnRlcmltIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmltRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFc3RpbWF0ZWREdXJhdGlvbigpIDxlbT5Fc3RpbWF0ZWQgRHVyYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXN0aW1hdGVkRHVyYXRpb24oKSA8ZW0+RXN0aW1hdGVkIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VzdGltYXRlZER1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbiA9IEVTVElNQVRFRF9EVVJBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRXN0aW1hdGVkIER1cmF0aW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrKCkgPGVtPldvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHdvcmsgPSBXT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3QoKSA8ZW0+Q29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0ID0gQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBCYXNlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUaW1lcGhhc2VkRGF0YSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhID09IG51bGwpIHsKLQkJCXRpbWVwaGFzZWREYXRhID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRpbWVwaGFzZWREYXRhVHlwZS5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBKTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TnVtYmVyKCkgewotCQlyZXR1cm4gbnVtYmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bWJlcihCaWdJbnRlZ2VyIG5ld051bWJlcikgewotCQlCaWdJbnRlZ2VyIG9sZE51bWJlciA9IG51bWJlcjsKLQkJbnVtYmVyID0gbmV3TnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVIsIG9sZE51bWJlciwgbnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmltKCkgewotCQlyZXR1cm4gaW50ZXJpbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmltKGJvb2xlYW4gbmV3SW50ZXJpbSkgewotCQlib29sZWFuIG9sZEludGVyaW0gPSBpbnRlcmltOwotCQlpbnRlcmltID0gbmV3SW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU0sIG9sZEludGVyaW0sIGludGVyaW0sICFvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SW50ZXJpbSgpIHsKLQkJYm9vbGVhbiBvbGRJbnRlcmltID0gaW50ZXJpbTsKLQkJYm9vbGVhbiBvbGRJbnRlcmltRVNldCA9IGludGVyaW1FU2V0OwotCQlpbnRlcmltID0gSU5URVJJTV9FREVGQVVMVDsKLQkJaW50ZXJpbUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNLCBvbGRJbnRlcmltLCBJTlRFUklNX0VERUZBVUxULCBvbGRJbnRlcmltRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SW50ZXJpbSgpIHsKLQkJcmV0dXJuIGludGVyaW1FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTiwgb2xkRHVyYXRpb24sIGR1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRlZER1cmF0aW9uKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGVkRHVyYXRpb24oYm9vbGVhbiBuZXdFc3RpbWF0ZWREdXJhdGlvbikgewotCQlib29sZWFuIG9sZEVzdGltYXRlZER1cmF0aW9uID0gZXN0aW1hdGVkRHVyYXRpb247Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gbmV3RXN0aW1hdGVkRHVyYXRpb247Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb25FU2V0ID0gZXN0aW1hdGVkRHVyYXRpb25FU2V0OwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBlc3RpbWF0ZWREdXJhdGlvbiwgIW9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCWJvb2xlYW4gb2xkRXN0aW1hdGVkRHVyYXRpb24gPSBlc3RpbWF0ZWREdXJhdGlvbjsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JCWVzdGltYXRlZER1cmF0aW9uID0gRVNUSU1BVEVEX0RVUkFUSU9OX0VERUZBVUxUOwotCQllc3RpbWF0ZWREdXJhdGlvbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT04sIG9sZEVzdGltYXRlZER1cmF0aW9uLCBFU1RJTUFURURfRFVSQVRJT05fRURFRkFVTFQsIG9sZEVzdGltYXRlZER1cmF0aW9uRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWREdXJhdGlvbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUkssIG9sZFdvcmssIHdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0KCkgewotCQlyZXR1cm4gY29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0KEJpZ0RlY2ltYWwgbmV3Q29zdCkgewotCQlCaWdEZWNpbWFsIG9sZENvc3QgPSBjb3N0OwotCQljb3N0ID0gbmV3Q29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE51bWJlcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19JTlRFUklNOgotCQkJCXJldHVybiBpc0ludGVyaW0oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkRHVyYXRpb24oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX1dPUks6Ci0JCQkJcmV0dXJuIGdldFdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QkNXUygpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fSU5URVJJTToKLQkJCQlzZXRJbnRlcmltKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRVNUSU1BVEVEX0RVUkFUSU9OOgotCQkJCXNldEVzdGltYXRlZER1cmF0aW9uKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlzZXROdW1iZXIoTlVNQkVSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJdW5zZXRJbnRlcmltKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKEZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTjoKLQkJCQlzZXREdXJhdGlvbihEVVJBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0VTVElNQVRFRF9EVVJBVElPTjoKLQkJCQl1bnNldEVzdGltYXRlZER1cmF0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19XT1JLOgotCQkJCXNldFdvcmsoV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiB0aW1lcGhhc2VkRGF0YSAhPSBudWxsICYmICF0aW1lcGhhc2VkRGF0YS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX05VTUJFUjoKLQkJCQlyZXR1cm4gTlVNQkVSX0VERUZBVUxUID09IG51bGwgPyBudW1iZXIgIT0gbnVsbCA6ICFOVU1CRVJfRURFRkFVTFQuZXF1YWxzKG51bWJlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0lOVEVSSU06Ci0JCQkJcmV0dXJuIGlzU2V0SW50ZXJpbSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19FU1RJTUFURURfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkRHVyYXRpb24oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfX0JDV1M6Ci0JCQkJcmV0dXJuIGlzU2V0QkNXUygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX19CQ1dQOgotCQkJCXJldHVybiBpc1NldEJDV1AoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG51bWJlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobnVtYmVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnRlcmltOiAiKTsKLQkJaWYgKGludGVyaW1FU2V0KSByZXN1bHQuYXBwZW5kKGludGVyaW0pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkRHVyYXRpb246ICIpOwotCQlpZiAoZXN0aW1hdGVkRHVyYXRpb25FU2V0KSByZXN1bHQuYXBwZW5kKGVzdGltYXRlZER1cmF0aW9uKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Jhc2VsaW5lSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0NhbGVuZGFySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2QwOGQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENhbGVuZGFySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FsZW5kYXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkNhbGVuZGFySW1wbCNpc0lzQmFzZUNhbGVuZGFyIDxlbT5JcyBCYXNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuQ2FsZW5kYXJJbXBsI2dldEJhc2VDYWxlbmRhclVJRCA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhckltcGwjZ2V0V2Vla0RheXMgPGVtPldlZWsgRGF5czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhbGVuZGFySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgQ2FsZW5kYXIgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQmFzZUNhbGVuZGFyKCkgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzQmFzZUNhbGVuZGFyKCkgPGVtPklzIEJhc2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNCYXNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQmFzZUNhbGVuZGFyID0gSVNfQkFTRV9DQUxFTkRBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgQmFzZSBDYWxlbmRhciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNCYXNlQ2FsZW5kYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZUNhbGVuZGFyVUlEKCkgPGVtPkJhc2UgQ2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlQ2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCQVNFX0NBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ2FsZW5kYXJVSUQoKSA8ZW0+QmFzZSBDYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYmFzZUNhbGVuZGFyVUlEID0gQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrRGF5cygpIDxlbT5XZWVrIERheXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtEYXlzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheXMgd2Vla0RheXMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENhbGVuZGFySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGVuZGFyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzQmFzZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaXNCYXNlQ2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNCYXNlQ2FsZW5kYXIoYm9vbGVhbiBuZXdJc0Jhc2VDYWxlbmRhcikgewotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyID0gaXNCYXNlQ2FsZW5kYXI7Ci0JCWlzQmFzZUNhbGVuZGFyID0gbmV3SXNCYXNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXJFU2V0ID0gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCQlpc0Jhc2VDYWxlbmRhckVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSLCBvbGRJc0Jhc2VDYWxlbmRhciwgaXNCYXNlQ2FsZW5kYXIsICFvbGRJc0Jhc2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzQmFzZUNhbGVuZGFyKCkgewotCQlib29sZWFuIG9sZElzQmFzZUNhbGVuZGFyID0gaXNCYXNlQ2FsZW5kYXI7Ci0JCWJvb2xlYW4gb2xkSXNCYXNlQ2FsZW5kYXJFU2V0ID0gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCQlpc0Jhc2VDYWxlbmRhciA9IElTX0JBU0VfQ0FMRU5EQVJfRURFRkFVTFQ7Ci0JCWlzQmFzZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVIsIG9sZElzQmFzZUNhbGVuZGFyLCBJU19CQVNFX0NBTEVOREFSX0VERUZBVUxULCBvbGRJc0Jhc2VDYWxlbmRhckVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzQmFzZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaXNCYXNlQ2FsZW5kYXJFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEJhc2VDYWxlbmRhclVJRCgpIHsKLQkJcmV0dXJuIGJhc2VDYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlQ2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdCYXNlQ2FsZW5kYXJVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRCYXNlQ2FsZW5kYXJVSUQgPSBiYXNlQ2FsZW5kYXJVSUQ7Ci0JCWJhc2VDYWxlbmRhclVJRCA9IG5ld0Jhc2VDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQsIG9sZEJhc2VDYWxlbmRhclVJRCwgYmFzZUNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXlzIGdldFdlZWtEYXlzKCkgewotCQlyZXR1cm4gd2Vla0RheXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0V2Vla0RheXMoV2Vla0RheXMgbmV3V2Vla0RheXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJV2Vla0RheXMgb2xkV2Vla0RheXMgPSB3ZWVrRGF5czsKLQkJd2Vla0RheXMgPSBuZXdXZWVrRGF5czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBvbGRXZWVrRGF5cywgbmV3V2Vla0RheXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlZWtEYXlzKFdlZWtEYXlzIG5ld1dlZWtEYXlzKSB7Ci0JCWlmIChuZXdXZWVrRGF5cyAhPSB3ZWVrRGF5cykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod2Vla0RheXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpd2Vla0RheXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dlZWtEYXlzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dlZWtEYXlzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdlZWtEYXlzKG5ld1dlZWtEYXlzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUywgbmV3V2Vla0RheXMsIG5ld1dlZWtEYXlzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldFdlZWtEYXlzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzSXNCYXNlQ2FsZW5kYXIoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0JBU0VfQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRCYXNlQ2FsZW5kYXJVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fV0VFS19EQVlTOgotCQkJCXJldHVybiBnZXRXZWVrRGF5cygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19JU19CQVNFX0NBTEVOREFSOgotCQkJCXNldElzQmFzZUNhbGVuZGFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0QmFzZUNhbGVuZGFyVUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlzZXRXZWVrRGF5cygoV2Vla0RheXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX0lTX0JBU0VfQ0FMRU5EQVI6Ci0JCQkJdW5zZXRJc0Jhc2VDYWxlbmRhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fQkFTRV9DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0QmFzZUNhbGVuZGFyVUlEKEJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1dFRUtfREFZUzoKLQkJCQlzZXRXZWVrRGF5cygoV2Vla0RheXMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUl9fSVNfQkFTRV9DQUxFTkRBUjoKLQkJCQlyZXR1cm4gaXNTZXRJc0Jhc2VDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19CQVNFX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQkFTRV9DQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGJhc2VDYWxlbmRhclVJRCAhPSBudWxsIDogIUJBU0VfQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhiYXNlQ2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSX19XRUVLX0RBWVM6Ci0JCQkJcmV0dXJuIHdlZWtEYXlzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNCYXNlQ2FsZW5kYXI6ICIpOwotCQlpZiAoaXNCYXNlQ2FsZW5kYXJFU2V0KSByZXN1bHQuYXBwZW5kKGlzQmFzZUNhbGVuZGFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFzZUNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChiYXNlQ2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9DYWxlbmRhckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvQ2FsZW5kYXJzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y1ZWU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9DYWxlbmRhcnNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYWxlbmRhcnNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYWxlbmRhcnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5DYWxlbmRhcnNJbXBsI2dldENhbGVuZGFyIDxlbT5DYWxlbmRhcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhbGVuZGFyc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIENhbGVuZGFycyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXIoKSA8ZW0+Q2FsZW5kYXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBjYWxlbmRhciA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FsZW5kYXJzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldENhbGVuZGFycygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDYWxlbmRhcigpIHsKLQkJaWYgKGNhbGVuZGFyID09IG51bGwpIHsKLQkJCWNhbGVuZGFyID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KENhbGVuZGFyLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSU19fQ0FMRU5EQVIpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRDYWxlbmRhcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gZ2V0Q2FsZW5kYXIoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2FsZW5kYXIoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlnZXRDYWxlbmRhcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTX19DQUxFTkRBUjoKLQkJCQlyZXR1cm4gY2FsZW5kYXIgIT0gbnVsbCAmJiAhY2FsZW5kYXIuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9DYWxlbmRhcnNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0RvY3VtZW50Um9vdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxMzAxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNaXhlZCA8ZW0+TWl4ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0UHJvamVjdCA8ZW0+UHJvamVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50Um9vdEltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIERvY3VtZW50Um9vdCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWl4ZWQoKSA8ZW0+TWl4ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWl4ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIG1peGVkID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFhNTE5TUHJlZml4TWFwKCkgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn0nIG1hcC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFhNTE5TUHJlZml4TWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRU1hcCB4TUxOU1ByZWZpeE1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpIDxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYU0lTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXAgeFNJU2NoZW1hTG9jYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50Um9vdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRNaXhlZCgpIHsKLQkJaWYgKG1peGVkID09IG51bGwpIHsKLQkJCW1peGVkID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJfQotCQlyZXR1cm4gbWl4ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVNYXAgZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXAoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeUltcGwuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCk7Ci0JCX0KLQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTWFwIGdldFhTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlpZiAoeFNJU2NoZW1hTG9jYXRpb24gPT0gbnVsbCkgewotCQkJeFNJU2NoZW1hTG9jYXRpb24gPSBuZXcgRWNvcmVFTWFwKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkoKSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gKFByb2plY3QpZ2V0TWl4ZWQoKS5nZXQoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvamVjdChQcm9qZWN0IG5ld1Byb2plY3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfUHJvamVjdCgpLCBuZXdQcm9qZWN0LCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgbmV3UHJvamVjdCkgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9Qcm9qZWN0KCksIG5ld1Byb2plY3QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRNaXhlZCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UHJvamVjdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gZ2V0TWl4ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFhTSVNjaGVtYUxvY2F0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWl4ZWQoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCWdldFhNTE5TUHJlZml4TWFwKCkuY2xlYXIoKTsKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fUFJPSkVDVDoKLQkJCQlzZXRQcm9qZWN0KChQcm9qZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCWdldE1peGVkKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUDoKLQkJCQlnZXRYTUxOU1ByZWZpeE1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJZ2V0WFNJU2NoZW1hTG9jYXRpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19QUk9KRUNUOgotCQkJCXNldFByb2plY3QoKFByb2plY3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQ6Ci0JCQkJcmV0dXJuIG1peGVkICE9IG51bGwgJiYgIW1peGVkLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCXJldHVybiB4TUxOU1ByZWZpeE1hcCAhPSBudWxsICYmICF4TUxOU1ByZWZpeE1hcC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4geFNJU2NoZW1hTG9jYXRpb24gIT0gbnVsbCAmJiAheFNJU2NoZW1hTG9jYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldFByb2plY3QoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9jdW1lbnRSb290SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTRlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlMkltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUySW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlMkltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlMkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIEV4dGVuZGVkQXR0cmlidXRlMiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB2YWx1ZUlEID0gVkFMVUVfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdCA9IERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTJfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUyX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMl9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkdXJhdGlvbkZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZHVyYXRpb25Gb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FeHRlbmRlZEF0dHJpYnV0ZTJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhNmE5NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXh0ZW5kZWQgQXR0cmlidXRlMzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlM0ltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTNJbXBsI2dldFZhbHVlSUQgPGVtPlZhbHVlIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUzIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkSUQoKSA8ZW0+RmllbGQgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGRJRCA9IEZJRUxEX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbkZvcm1hdCgpIDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldER1cmF0aW9uRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0ID0gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlM0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRChWQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlzZXREdXJhdGlvbkZvcm1hdChEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTNfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEUzX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gZHVyYXRpb25Gb3JtYXQgIT0gbnVsbCA6ICFEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGR1cmF0aW9uRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlM0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQ4YjdlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlbmRlZCBBdHRyaWJ1dGU0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0RmllbGRJRCA8ZW0+RmllbGQgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlNEltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZTRJbXBsI2dldER1cmF0aW9uRm9ybWF0IDxlbT5EdXJhdGlvbiBGb3JtYXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZTQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEV4dGVuZGVkQXR0cmlidXRlNCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQsIG9sZEZpZWxkSUQsIGZpZWxkSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZUlEKCkgewotCQlyZXR1cm4gdmFsdWVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUlEKEJpZ0ludGVnZXIgbmV3VmFsdWVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFZhbHVlSUQgPSB2YWx1ZUlEOwotCQl2YWx1ZUlEID0gbmV3VmFsdWVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldER1cmF0aW9uRm9ybWF0KCkgewotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb25Gb3JtYXQoQmlnSW50ZWdlciBuZXdEdXJhdGlvbkZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZER1cmF0aW9uRm9ybWF0ID0gZHVyYXRpb25Gb3JtYXQ7Ci0JCWR1cmF0aW9uRm9ybWF0ID0gbmV3RHVyYXRpb25Gb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFULCBvbGREdXJhdGlvbkZvcm1hdCwgZHVyYXRpb25Gb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBnZXREdXJhdGlvbkZvcm1hdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXNldER1cmF0aW9uRm9ybWF0KERVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0X19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFNF9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIFZBTFVFX0lEX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZUlEICE9IG51bGwgOiAhVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTRfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gRFVSQVRJT05fRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbkZvcm1hdCAhPSBudWxsIDogIURVUkFUSU9OX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoZHVyYXRpb25Gb3JtYXQpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1SUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpZWxkSUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRXh0ZW5kZWRBdHRyaWJ1dGU0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYwZGMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZUltcGwjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFJvbGx1cFR5cGUgPGVtPlJvbGx1cCBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldENhbGN1bGF0aW9uVHlwZSA8ZW0+Q2FsY3VsYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRGb3JtdWxhIDxlbT5Gb3JtdWxhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2lzUmVzdHJpY3RWYWx1ZXMgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2lzQXBwZW5kTmV3VmFsdWVzIDxlbT5BcHBlbmQgTmV3IFZhbHVlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLkV4dGVuZGVkQXR0cmlidXRlSW1wbCNnZXREZWZhdWx0IDxlbT5EZWZhdWx0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsI2dldFZhbHVlTGlzdCA8ZW0+VmFsdWUgTGlzdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRXh0ZW5kZWRBdHRyaWJ1dGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkTmFtZSgpIDxlbT5GaWVsZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmllbGROYW1lID0gRklFTERfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsaWFzKCkgPGVtPkFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGlhcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbGlhcyA9IEFMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBIT05FVElDX0FMSUFTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBob25ldGljQWxpYXMoKSA8ZW0+UGhvbmV0aWMgQWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBob25ldGljQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGhvbmV0aWNBbGlhcyA9IFBIT05FVElDX0FMSUFTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGx1cFR5cGUoKSA8ZW0+Um9sbHVwIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGx1cFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBST0xMVVBfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xsdXBUeXBlKCkgPGVtPlJvbGx1cCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xsdXBUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciByb2xsdXBUeXBlID0gUk9MTFVQX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTENVTEFUSU9OX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsY3VsYXRpb25UeXBlKCkgPGVtPkNhbGN1bGF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGN1bGF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlID0gQ0FMQ1VMQVRJT05fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGb3JtdWxhKCkgPGVtPkZvcm11bGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZvcm11bGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1VTEFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rm9ybXVsYSgpIDxlbT5Gb3JtdWxhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGb3JtdWxhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZvcm11bGEgPSBGT1JNVUxBX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdHJpY3RWYWx1ZXMoKSA8ZW0+UmVzdHJpY3QgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3RyaWN0VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTVFJJQ1RfVkFMVUVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Jlc3RyaWN0VmFsdWVzKCkgPGVtPlJlc3RyaWN0IFZhbHVlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNSZXN0cmljdFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RWYWx1ZXMgPSBSRVNUUklDVF9WQUxVRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc3RyaWN0IFZhbHVlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzdHJpY3RWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVsaXN0U29ydE9yZGVyKCkgPGVtPlZhbHVlbGlzdCBTb3J0IE9yZGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBWQUxVRUxJU1RfU09SVF9PUkRFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSA8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlbGlzdFNvcnRPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVsaXN0U29ydE9yZGVyID0gVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBcHBlbmROZXdWYWx1ZXMoKSA8ZW0+QXBwZW5kIE5ldyBWYWx1ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXBwZW5kTmV3VmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQXBwZW5kTmV3VmFsdWVzKCkgPGVtPkFwcGVuZCBOZXcgVmFsdWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0FwcGVuZE5ld1ZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXBwZW5kTmV3VmFsdWVzID0gQVBQRU5EX05FV19WQUxVRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFwcGVuZCBOZXcgVmFsdWVzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhcHBlbmROZXdWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdCgpIDxlbT5EZWZhdWx0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHQoKSA8ZW0+RGVmYXVsdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0XyA9IERFRkFVTFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUxpc3QoKSA8ZW0+VmFsdWUgTGlzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVMaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVMaXN0IHZhbHVlTGlzdCA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiBmaWVsZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGROYW1lKFN0cmluZyBuZXdGaWVsZE5hbWUpIHsKLQkJU3RyaW5nIG9sZEZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLQkJZmllbGROYW1lID0gbmV3RmllbGROYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRSwgb2xkRmllbGROYW1lLCBmaWVsZE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsaWFzKCkgewotCQlyZXR1cm4gYWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxpYXMoU3RyaW5nIG5ld0FsaWFzKSB7Ci0JCVN0cmluZyBvbGRBbGlhcyA9IGFsaWFzOwotCQlhbGlhcyA9IG5ld0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVMsIG9sZEFsaWFzLCBhbGlhcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNBbGlhcygpIHsKLQkJcmV0dXJuIHBob25ldGljQWxpYXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGhvbmV0aWNBbGlhcyhTdHJpbmcgbmV3UGhvbmV0aWNBbGlhcykgewotCQlTdHJpbmcgb2xkUGhvbmV0aWNBbGlhcyA9IHBob25ldGljQWxpYXM7Ci0JCXBob25ldGljQWxpYXMgPSBuZXdQaG9uZXRpY0FsaWFzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVMsIG9sZFBob25ldGljQWxpYXMsIHBob25ldGljQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRSb2xsdXBUeXBlKCkgewotCQlyZXR1cm4gcm9sbHVwVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb2xsdXBUeXBlKEJpZ0ludGVnZXIgbmV3Um9sbHVwVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFJvbGx1cFR5cGUgPSByb2xsdXBUeXBlOwotCQlyb2xsdXBUeXBlID0gbmV3Um9sbHVwVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFLCBvbGRSb2xsdXBUeXBlLCByb2xsdXBUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsY3VsYXRpb25UeXBlKCkgewotCQlyZXR1cm4gY2FsY3VsYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGN1bGF0aW9uVHlwZShCaWdJbnRlZ2VyIG5ld0NhbGN1bGF0aW9uVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGN1bGF0aW9uVHlwZSA9IGNhbGN1bGF0aW9uVHlwZTsKLQkJY2FsY3VsYXRpb25UeXBlID0gbmV3Q2FsY3VsYXRpb25UeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQ0FMQ1VMQVRJT05fVFlQRSwgb2xkQ2FsY3VsYXRpb25UeXBlLCBjYWxjdWxhdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvcm11bGEoKSB7Ci0JCXJldHVybiBmb3JtdWxhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvcm11bGEoU3RyaW5nIG5ld0Zvcm11bGEpIHsKLQkJU3RyaW5nIG9sZEZvcm11bGEgPSBmb3JtdWxhOwotCQlmb3JtdWxhID0gbmV3Rm9ybXVsYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEEsIG9sZEZvcm11bGEsIGZvcm11bGEpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc3RyaWN0VmFsdWVzKCkgewotCQlyZXR1cm4gcmVzdHJpY3RWYWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdHJpY3RWYWx1ZXMoYm9vbGVhbiBuZXdSZXN0cmljdFZhbHVlcykgewotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzID0gcmVzdHJpY3RWYWx1ZXM7Ci0JCXJlc3RyaWN0VmFsdWVzID0gbmV3UmVzdHJpY3RWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXNFU2V0ID0gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCQlyZXN0cmljdFZhbHVlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTLCBvbGRSZXN0cmljdFZhbHVlcywgcmVzdHJpY3RWYWx1ZXMsICFvbGRSZXN0cmljdFZhbHVlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3RyaWN0VmFsdWVzKCkgewotCQlib29sZWFuIG9sZFJlc3RyaWN0VmFsdWVzID0gcmVzdHJpY3RWYWx1ZXM7Ci0JCWJvb2xlYW4gb2xkUmVzdHJpY3RWYWx1ZXNFU2V0ID0gcmVzdHJpY3RWYWx1ZXNFU2V0OwotCQlyZXN0cmljdFZhbHVlcyA9IFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVDsKLQkJcmVzdHJpY3RWYWx1ZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUywgb2xkUmVzdHJpY3RWYWx1ZXMsIFJFU1RSSUNUX1ZBTFVFU19FREVGQVVMVCwgb2xkUmVzdHJpY3RWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZXN0cmljdFZhbHVlcygpIHsKLQkJcmV0dXJuIHJlc3RyaWN0VmFsdWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKSB7Ci0JCXJldHVybiB2YWx1ZWxpc3RTb3J0T3JkZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVsaXN0U29ydE9yZGVyKEJpZ0ludGVnZXIgbmV3VmFsdWVsaXN0U29ydE9yZGVyKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVsaXN0U29ydE9yZGVyID0gdmFsdWVsaXN0U29ydE9yZGVyOwotCQl2YWx1ZWxpc3RTb3J0T3JkZXIgPSBuZXdWYWx1ZWxpc3RTb3J0T3JkZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUiwgb2xkVmFsdWVsaXN0U29ydE9yZGVyLCB2YWx1ZWxpc3RTb3J0T3JkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FwcGVuZE5ld1ZhbHVlcygpIHsKLQkJcmV0dXJuIGFwcGVuZE5ld1ZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHBlbmROZXdWYWx1ZXMoYm9vbGVhbiBuZXdBcHBlbmROZXdWYWx1ZXMpIHsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXMgPSBhcHBlbmROZXdWYWx1ZXM7Ci0JCWFwcGVuZE5ld1ZhbHVlcyA9IG5ld0FwcGVuZE5ld1ZhbHVlczsKLQkJYm9vbGVhbiBvbGRBcHBlbmROZXdWYWx1ZXNFU2V0ID0gYXBwZW5kTmV3VmFsdWVzRVNldDsKLQkJYXBwZW5kTmV3VmFsdWVzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUywgb2xkQXBwZW5kTmV3VmFsdWVzLCBhcHBlbmROZXdWYWx1ZXMsICFvbGRBcHBlbmROZXdWYWx1ZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBcHBlbmROZXdWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gb2xkQXBwZW5kTmV3VmFsdWVzID0gYXBwZW5kTmV3VmFsdWVzOwotCQlib29sZWFuIG9sZEFwcGVuZE5ld1ZhbHVlc0VTZXQgPSBhcHBlbmROZXdWYWx1ZXNFU2V0OwotCQlhcHBlbmROZXdWYWx1ZXMgPSBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVDsKLQkJYXBwZW5kTmV3VmFsdWVzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19BUFBFTkRfTkVXX1ZBTFVFUywgb2xkQXBwZW5kTmV3VmFsdWVzLCBBUFBFTkRfTkVXX1ZBTFVFU19FREVGQVVMVCwgb2xkQXBwZW5kTmV3VmFsdWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCkgewotCQlyZXR1cm4gYXBwZW5kTmV3VmFsdWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0XzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuZXdEZWZhdWx0KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0ID0gZGVmYXVsdF87Ci0JCWRlZmF1bHRfID0gbmV3RGVmYXVsdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQsIG9sZERlZmF1bHQsIGRlZmF1bHRfKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlTGlzdCBnZXRWYWx1ZUxpc3QoKSB7Ci0JCXJldHVybiB2YWx1ZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVMaXN0KFZhbHVlTGlzdCBuZXdWYWx1ZUxpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmFsdWVMaXN0IG9sZFZhbHVlTGlzdCA9IHZhbHVlTGlzdDsKLQkJdmFsdWVMaXN0ID0gbmV3VmFsdWVMaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgb2xkVmFsdWVMaXN0LCBuZXdWYWx1ZUxpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlTGlzdChWYWx1ZUxpc3QgbmV3VmFsdWVMaXN0KSB7Ci0JCWlmIChuZXdWYWx1ZUxpc3QgIT0gdmFsdWVMaXN0KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh2YWx1ZUxpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVMaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlTGlzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZUxpc3QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZUxpc3QobmV3VmFsdWVMaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRV9MSVNULCBuZXdWYWx1ZUxpc3QsIG5ld1ZhbHVlTGlzdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJCXJldHVybiBiYXNpY1NldFZhbHVlTGlzdChudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBnZXRGaWVsZElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXJldHVybiBnZXRGaWVsZE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXJldHVybiBnZXRBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJcmV0dXJuIGdldFBob25ldGljQWxpYXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JPTExVUF9UWVBFOgotCQkJCXJldHVybiBnZXRSb2xsdXBUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRDYWxjdWxhdGlvblR5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZPUk1VTEE6Ci0JCQkJcmV0dXJuIGdldEZvcm11bGEoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQlyZXR1cm4gaXNSZXN0cmljdFZhbHVlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFTElTVF9TT1JUX09SREVSOgotCQkJCXJldHVybiBnZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXJldHVybiBpc0FwcGVuZE5ld1ZhbHVlcygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0RFRkFVTFQ6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJcmV0dXJuIGdldFZhbHVlTGlzdCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlzZXRSb2xsdXBUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXNldENhbGN1bGF0aW9uVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlzZXRGb3JtdWxhKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1JFU1RSSUNUX1ZBTFVFUzoKLQkJCQlzZXRSZXN0cmljdFZhbHVlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXNldEFwcGVuZE5ld1ZhbHVlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXNldERlZmF1bHQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fVkFMVUVfTElTVDoKLQkJCQlzZXRWYWx1ZUxpc3QoKFZhbHVlTGlzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0ZJRUxEX05BTUU6Ci0JCQkJc2V0RmllbGROYW1lKEZJRUxEX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FMSUFTOgotCQkJCXNldEFsaWFzKEFMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlzZXRQaG9uZXRpY0FsaWFzKFBIT05FVElDX0FMSUFTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlzZXRSb2xsdXBUeXBlKFJPTExVUF9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXNldENhbGN1bGF0aW9uVHlwZShDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GT1JNVUxBOgotCQkJCXNldEZvcm11bGEoRk9STVVMQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXVuc2V0UmVzdHJpY3RWYWx1ZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlzZXRWYWx1ZWxpc3RTb3J0T3JkZXIoVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX0FQUEVORF9ORVdfVkFMVUVTOgotCQkJCXVuc2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fREVGQVVMVDoKLQkJCQlzZXREZWZhdWx0KERFRkFVTFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJc2V0VmFsdWVMaXN0KChWYWx1ZUxpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gRklFTERfSURfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkSUQgIT0gbnVsbCA6ICFGSUVMRF9JRF9FREVGQVVMVC5lcXVhbHMoZmllbGRJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19GSUVMRF9OQU1FOgotCQkJCXJldHVybiBGSUVMRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWVsZE5hbWUgIT0gbnVsbCA6ICFGSUVMRF9OQU1FX0VERUZBVUxULmVxdWFscyhmaWVsZE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQUxJQVM6Ci0JCQkJcmV0dXJuIEFMSUFTX0VERUZBVUxUID09IG51bGwgPyBhbGlhcyAhPSBudWxsIDogIUFMSUFTX0VERUZBVUxULmVxdWFscyhhbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gUEhPTkVUSUNfQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IHBob25ldGljQWxpYXMgIT0gbnVsbCA6ICFQSE9ORVRJQ19BTElBU19FREVGQVVMVC5lcXVhbHMocGhvbmV0aWNBbGlhcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ST0xMVVBfVFlQRToKLQkJCQlyZXR1cm4gUk9MTFVQX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGx1cFR5cGUgIT0gbnVsbCA6ICFST0xMVVBfVFlQRV9FREVGQVVMVC5lcXVhbHMocm9sbHVwVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19DQUxDVUxBVElPTl9UWVBFOgotCQkJCXJldHVybiBDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxUID09IG51bGwgPyBjYWxjdWxhdGlvblR5cGUgIT0gbnVsbCA6ICFDQUxDVUxBVElPTl9UWVBFX0VERUZBVUxULmVxdWFscyhjYWxjdWxhdGlvblR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fRk9STVVMQToKLQkJCQlyZXR1cm4gRk9STVVMQV9FREVGQVVMVCA9PSBudWxsID8gZm9ybXVsYSAhPSBudWxsIDogIUZPUk1VTEFfRURFRkFVTFQuZXF1YWxzKGZvcm11bGEpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fUkVTVFJJQ1RfVkFMVUVTOgotCQkJCXJldHVybiBpc1NldFJlc3RyaWN0VmFsdWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19WQUxVRUxJU1RfU09SVF9PUkRFUjoKLQkJCQlyZXR1cm4gVkFMVUVMSVNUX1NPUlRfT1JERVJfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlbGlzdFNvcnRPcmRlciAhPSBudWxsIDogIVZBTFVFTElTVF9TT1JUX09SREVSX0VERUZBVUxULmVxdWFscyh2YWx1ZWxpc3RTb3J0T3JkZXIpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURV9fQVBQRU5EX05FV19WQUxVRVM6Ci0JCQkJcmV0dXJuIGlzU2V0QXBwZW5kTmV3VmFsdWVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFX19ERUZBVUxUOgotCQkJCXJldHVybiBERUZBVUxUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0XyAhPSBudWxsIDogIURFRkFVTFRfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRfKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVfX1ZBTFVFX0xJU1Q6Ci0JCQkJcmV0dXJuIHZhbHVlTGlzdCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGROYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGhvbmV0aWNBbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGhvbmV0aWNBbGlhcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbHVwVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sbHVwVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FsY3VsYXRpb25UeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxjdWxhdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZvcm11bGE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZvcm11bGEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3RyaWN0VmFsdWVzOiAiKTsKLQkJaWYgKHJlc3RyaWN0VmFsdWVzRVNldCkgcmVzdWx0LmFwcGVuZChyZXN0cmljdFZhbHVlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlbGlzdFNvcnRPcmRlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVsaXN0U29ydE9yZGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBlbmROZXdWYWx1ZXM6ICIpOwotCQlpZiAoYXBwZW5kTmV3VmFsdWVzRVNldCkgcmVzdWx0LmFwcGVuZChhcHBlbmROZXdWYWx1ZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0Xyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGUwOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4dGVuZGVkQXR0cmlidXRlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5FeHRlbmRlZEF0dHJpYnV0ZXNJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBFeHRlbmRlZEF0dHJpYnV0ZXMgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGV4dGVuZGVkQXR0cmlidXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFeHRlbmRlZEF0dHJpYnV0ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEV4dGVuZGVkQXR0cmlidXRlKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoRXh0ZW5kZWRBdHRyaWJ1dGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEVTX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVNfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFU19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL0V4dGVuZGVkQXR0cmlidXRlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9NYXNrSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MzM2MzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNYXNrSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuTWFza0ltcGwjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrSW1wbCNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1hc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBNYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbCA9IExFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRU5HVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VwYXJhdG9yKCkgPGVtPlNlcGFyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VwYXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlcGFyYXRvciA9IFNFUEFSQVRPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMZXZlbCgpIHsKLQkJcmV0dXJuIGxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsKEJpZ0ludGVnZXIgbmV3TGV2ZWwpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbCA9IGxldmVsOwotCQlsZXZlbCA9IG5ld0xldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMLCBvbGRMZXZlbCwgbGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChCaWdJbnRlZ2VyIG5ld0xlbmd0aCkgewotCQlCaWdJbnRlZ2VyIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSCwgb2xkTGVuZ3RoLCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIHNlcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXBhcmF0b3IoU3RyaW5nIG5ld1NlcGFyYXRvcikgewotCQlTdHJpbmcgb2xkU2VwYXJhdG9yID0gc2VwYXJhdG9yOwotCQlzZXBhcmF0b3IgPSBuZXdTZXBhcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SLCBvbGRTZXBhcmF0b3IsIHNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBnZXRMZW5ndGgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRVZFTDoKLQkJCQlzZXRMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoTEVWRUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS19fU0VQQVJBVE9SOgotCQkJCXNldFNlcGFyYXRvcihTRVBBUkFUT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX0xFVkVMOgotCQkJCXJldHVybiBMRVZFTF9FREVGQVVMVCA9PSBudWxsID8gbGV2ZWwgIT0gbnVsbCA6ICFMRVZFTF9FREVGQVVMVC5lcXVhbHMobGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tfX1NFUEFSQVRPUjoKLQkJCQlyZXR1cm4gU0VQQVJBVE9SX0VERUZBVUxUID09IG51bGwgPyBzZXBhcmF0b3IgIT0gbnVsbCA6ICFTRVBBUkFUT1JfRURFRkFVTFQuZXF1YWxzKHNlcGFyYXRvcik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlbmd0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXBhcmF0b3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01hc2tJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTWFza3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YTdlZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01hc2tzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWFza3NJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFza3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5NYXNrc0ltcGwjZ2V0TWFzayA8ZW0+TWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1hc2tzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgTWFza3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hc2soKSA8ZW0+TWFzazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgbWFzayA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFza3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWFza3MoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0TWFzaygpIHsKLQkJaWYgKG1hc2sgPT0gbnVsbCkgewotCQkJbWFzayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChNYXNrLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLk1BU0tTX19NQVNLKTsKLQkJfQotCQlyZXR1cm4gbWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0TWFzaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJcmV0dXJuIGdldE1hc2soKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1NfX01BU0s6Ci0JCQkJZ2V0TWFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlnZXRNYXNrKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVNLU19fTUFTSzoKLQkJCQlyZXR1cm4gbWFzayAhPSBudWxsICYmICFtYXNrLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vTWFza3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvTXNwcm9qZWN0RmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTAyY2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdEZhY3RvcnlJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3Nvckxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIE1zcHJvamVjdEZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVNTSUdOTUVOVDogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzogcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDogcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFWQUlMQUJJTElUWV9QRVJJT0RTOiByZXR1cm4gY3JlYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOiByZXR1cm4gY3JlYXRlQmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6IHJldHVybiBjcmVhdGVCYXNlbGluZTIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTM6IHJldHVybiBjcmVhdGVCYXNlbGluZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUjogcmV0dXJuIGNyZWF0ZUNhbGVuZGFyKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVJTOiByZXR1cm4gY3JlYXRlQ2FsZW5kYXJzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6IHJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OiByZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzogcmV0dXJuIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6IHJldHVybiBjcmVhdGVNYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6IHJldHVybiBjcmVhdGVNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMjogcmV0dXJuIGNyZWF0ZU91dGxpbmVDb2RlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTM6IHJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOiByZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOSzogcmV0dXJuIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1Q6IHJldHVybiBjcmVhdGVQcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURTogcmV0dXJuIGNyZWF0ZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFUzogcmV0dXJuIGNyZWF0ZVJhdGVzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6IHJldHVybiBjcmVhdGVSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzogcmV0dXJuIGNyZWF0ZVJlc291cmNlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0s6IHJldHVybiBjcmVhdGVUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6IHJldHVybiBjcmVhdGVUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOiByZXR1cm4gY3JlYXRlVGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOiByZXR1cm4gY3JlYXRlVGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6IHJldHVybiBjcmVhdGVWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjogcmV0dXJuIGNyZWF0ZVZhbHVlMigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1Q6IHJldHVybiBjcmVhdGVWYWx1ZUxpc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVM6IHJldHVybiBjcmVhdGVWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzogcmV0dXJuIGNyZWF0ZVdCU01hc2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6IHJldHVybiBjcmVhdGVXQlNNYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZOiByZXR1cm4gY3JlYXRlV2Vla0RheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzogcmV0dXJuIGNyZWF0ZVdlZWtEYXlzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOiByZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVzKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQXV0aG9yVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQm9va2luZ1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2F0ZWdvcnlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb2RlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29tcGFueVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ29uc3RyYWludFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb250YWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDb3N0UmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVDdXJyZW5jeVN5bWJvbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEYXlUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEZWZhdWx0VGFza1R5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRW1haWxBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGaXhlZENvc3RBY2NydWFsVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rVHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZUh5cGVybGlua1R5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVMYWdGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hbmFnZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTWF0ZXJpYWxMYWJlbFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVOZXdUYXNrU3RhcnREYXRlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlTlRBY2NvdW50VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVBob25ldGljc1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUHJlZml4VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZVRhYmxlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjcmVhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3ViamVjdFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlU3VicHJvamVjdE5hbWVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVGl0bGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVUeXBlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlMkZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVR5cGVUeXBlNUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVSURUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVVbml0VHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtDb250b3VyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtGb3JtYXRUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gY29udmVydEFjY3J1ZUF0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BQ1RJVkVfRElSRUNUT1JZX0dVSURfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0QWxpYXNUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVVRIT1JfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEF1dGhvclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CT09LSU5HX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEJvb2tpbmdUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0Qm9va2luZ1R5cGVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMQ1VMQVRJT05fVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q2FsY3VsYXRpb25UeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FURUdPUllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENhdGVnb3J5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09ERV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29kZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbXBhbnlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT05TVFJBSU5UX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydENvbnN0cmFpbnRUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29udGFjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPU1RfUkFURV9UQUJMRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q3VycmVuY3lTeW1ib2xUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGF5VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGVmYXVsdFRhc2tUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnREdXJhdGlvbkZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNDoKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gY29udmVydER1cmF0aW9uRm9ybWF0VHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVSTkFMX1RBU0tfUFJPSkVDVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Rml4ZWRDb3N0QWNjcnVhbFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEdyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtBZGRyZXNzVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX1NVQl9BRERSRVNTX1RZUEUyOgotCQkJCXJldHVybiBjb252ZXJ0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydEh5cGVybGlua1R5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRIeXBlcmxpbmtUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEluaXRpYWxzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEFHX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQU5BR0VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRNYW5hZ2VyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFURVJJQUxfTEFCRUxfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE1hdGVyaWFsTGFiZWxUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMToKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMjoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlMlRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gY29udmVydE5hbWVUeXBlM1RvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0TmV3VGFza1N0YXJ0RGF0ZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE5UQWNjb3VudFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfTlVNQkVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydE92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUEhPTkVUSUNTX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVGSVhfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFJhdGVUYWJsZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJPTExVUF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRSb2xsdXBUeXBlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNVQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YmplY3RUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElUTEVfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTFUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTJUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTQ6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRUeXBlVHlwZTVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlVJRF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFTElTVF9TT1JUX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX1NUQVJUX0RBWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V2Vla1N0YXJ0RGF5VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrQ29udG91clR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrRm9ybWF0VHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19HUk9VUF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0V29ya0dyb3VwVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXNzaWdubWVudCBjcmVhdGVBc3NpZ25tZW50KCkgewotCQlBc3NpZ25tZW50SW1wbCBhc3NpZ25tZW50ID0gbmV3IEFzc2lnbm1lbnRJbXBsKCk7Ci0JCXJldHVybiBhc3NpZ25tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBc3NpZ25tZW50cyBjcmVhdGVBc3NpZ25tZW50cygpIHsKLQkJQXNzaWdubWVudHNJbXBsIGFzc2lnbm1lbnRzID0gbmV3IEFzc2lnbm1lbnRzSW1wbCgpOwotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF2YWlsYWJpbGl0eVBlcmlvZCBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZEltcGwgYXZhaWxhYmlsaXR5UGVyaW9kID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZEltcGwoKTsKLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXZhaWxhYmlsaXR5UGVyaW9kcyBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RzKCkgewotCQlBdmFpbGFiaWxpdHlQZXJpb2RzSW1wbCBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbmV3IEF2YWlsYWJpbGl0eVBlcmlvZHNJbXBsKCk7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXNlbGluZSBjcmVhdGVCYXNlbGluZSgpIHsKLQkJQmFzZWxpbmVJbXBsIGJhc2VsaW5lID0gbmV3IEJhc2VsaW5lSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJhc2VsaW5lMiBjcmVhdGVCYXNlbGluZTIoKSB7Ci0JCUJhc2VsaW5lMkltcGwgYmFzZWxpbmUyID0gbmV3IEJhc2VsaW5lMkltcGwoKTsKLQkJcmV0dXJuIGJhc2VsaW5lMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmFzZWxpbmUzIGNyZWF0ZUJhc2VsaW5lMygpIHsKLQkJQmFzZWxpbmUzSW1wbCBiYXNlbGluZTMgPSBuZXcgQmFzZWxpbmUzSW1wbCgpOwotCQlyZXR1cm4gYmFzZWxpbmUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWxlbmRhciBjcmVhdGVDYWxlbmRhcigpIHsKLQkJQ2FsZW5kYXJJbXBsIGNhbGVuZGFyID0gbmV3IENhbGVuZGFySW1wbCgpOwotCQlyZXR1cm4gY2FsZW5kYXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBjcmVhdGVDYWxlbmRhcnMoKSB7Ci0JCUNhbGVuZGFyc0ltcGwgY2FsZW5kYXJzID0gbmV3IENhbGVuZGFyc0ltcGwoKTsKLQkJcmV0dXJuIGNhbGVuZGFyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpIHsKLQkJRG9jdW1lbnRSb290SW1wbCBkb2N1bWVudFJvb3QgPSBuZXcgRG9jdW1lbnRSb290SW1wbCgpOwotCQlyZXR1cm4gZG9jdW1lbnRSb290OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZSBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGVJbXBsIGV4dGVuZGVkQXR0cmlidXRlID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlMiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlMkltcGwgZXh0ZW5kZWRBdHRyaWJ1dGUyID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlMkltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRBdHRyaWJ1dGUzIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMygpIHsKLQkJRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCBleHRlbmRlZEF0dHJpYnV0ZTMgPSBuZXcgRXh0ZW5kZWRBdHRyaWJ1dGUzSW1wbCgpOwotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGUzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZTQgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KCkgewotCQlFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsIGV4dGVuZGVkQXR0cmlidXRlNCA9IG5ldyBFeHRlbmRlZEF0dHJpYnV0ZTRJbXBsKCk7Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4dGVuZGVkQXR0cmlidXRlcyBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlc0ltcGwgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gbmV3IEV4dGVuZGVkQXR0cmlidXRlc0ltcGwoKTsKLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFzayBjcmVhdGVNYXNrKCkgewotCQlNYXNrSW1wbCBtYXNrID0gbmV3IE1hc2tJbXBsKCk7Ci0JCXJldHVybiBtYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXNrcyBjcmVhdGVNYXNrcygpIHsKLQkJTWFza3NJbXBsIG1hc2tzID0gbmV3IE1hc2tzSW1wbCgpOwotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlIGNyZWF0ZU91dGxpbmVDb2RlKCkgewotCQlPdXRsaW5lQ29kZUltcGwgb3V0bGluZUNvZGUgPSBuZXcgT3V0bGluZUNvZGVJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0bGluZUNvZGUyIGNyZWF0ZU91dGxpbmVDb2RlMigpIHsKLQkJT3V0bGluZUNvZGUySW1wbCBvdXRsaW5lQ29kZTIgPSBuZXcgT3V0bGluZUNvZGUySW1wbCgpOwotCQlyZXR1cm4gb3V0bGluZUNvZGUyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRsaW5lQ29kZTMgY3JlYXRlT3V0bGluZUNvZGUzKCkgewotCQlPdXRsaW5lQ29kZTNJbXBsIG91dGxpbmVDb2RlMyA9IG5ldyBPdXRsaW5lQ29kZTNJbXBsKCk7Ci0JCXJldHVybiBvdXRsaW5lQ29kZTM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBjcmVhdGVPdXRsaW5lQ29kZXMoKSB7Ci0JCU91dGxpbmVDb2Rlc0ltcGwgb3V0bGluZUNvZGVzID0gbmV3IE91dGxpbmVDb2Rlc0ltcGwoKTsKLQkJcmV0dXJuIG91dGxpbmVDb2RlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlZGVjZXNzb3JMaW5rIGNyZWF0ZVByZWRlY2Vzc29yTGluaygpIHsKLQkJUHJlZGVjZXNzb3JMaW5rSW1wbCBwcmVkZWNlc3NvckxpbmsgPSBuZXcgUHJlZGVjZXNzb3JMaW5rSW1wbCgpOwotCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9qZWN0IGNyZWF0ZVByb2plY3QoKSB7Ci0JCVByb2plY3RJbXBsIHByb2plY3QgPSBuZXcgUHJvamVjdEltcGwoKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJhdGUgY3JlYXRlUmF0ZSgpIHsKLQkJUmF0ZUltcGwgcmF0ZSA9IG5ldyBSYXRlSW1wbCgpOwotCQlyZXR1cm4gcmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmF0ZXMgY3JlYXRlUmF0ZXMoKSB7Ci0JCVJhdGVzSW1wbCByYXRlcyA9IG5ldyBSYXRlc0ltcGwoKTsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsKLQkJUmVzb3VyY2VJbXBsIHJlc291cmNlID0gbmV3IFJlc291cmNlSW1wbCgpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKSB7Ci0JCVJlc291cmNlc0ltcGwgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlc0ltcGwoKTsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBjcmVhdGVUYXNrcygpIHsKLQkJVGFza3NJbXBsIHRhc2tzID0gbmV3IFRhc2tzSW1wbCgpOwotCQlyZXR1cm4gdGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRpbWVQZXJpb2QgY3JlYXRlVGltZVBlcmlvZCgpIHsKLQkJVGltZVBlcmlvZEltcGwgdGltZVBlcmlvZCA9IG5ldyBUaW1lUGVyaW9kSW1wbCgpOwotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZXBoYXNlZERhdGFUeXBlIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJVGltZXBoYXNlZERhdGFUeXBlSW1wbCB0aW1lcGhhc2VkRGF0YVR5cGUgPSBuZXcgVGltZXBoYXNlZERhdGFUeXBlSW1wbCgpOwotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZSBjcmVhdGVWYWx1ZSgpIHsKLQkJVmFsdWVJbXBsIHZhbHVlID0gbmV3IFZhbHVlSW1wbCgpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlMiBjcmVhdGVWYWx1ZTIoKSB7Ci0JCVZhbHVlMkltcGwgdmFsdWUyID0gbmV3IFZhbHVlMkltcGwoKTsKLQkJcmV0dXJuIHZhbHVlMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFsdWVMaXN0IGNyZWF0ZVZhbHVlTGlzdCgpIHsKLQkJVmFsdWVMaXN0SW1wbCB2YWx1ZUxpc3QgPSBuZXcgVmFsdWVMaXN0SW1wbCgpOwotCQlyZXR1cm4gdmFsdWVMaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYWx1ZXMgY3JlYXRlVmFsdWVzKCkgewotCQlWYWx1ZXNJbXBsIHZhbHVlcyA9IG5ldyBWYWx1ZXNJbXBsKCk7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdCU01hc2sgY3JlYXRlV0JTTWFzaygpIHsKLQkJV0JTTWFza0ltcGwgd2JzTWFzayA9IG5ldyBXQlNNYXNrSW1wbCgpOwotCQlyZXR1cm4gd2JzTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgY3JlYXRlV0JTTWFza3MoKSB7Ci0JCVdCU01hc2tzSW1wbCB3YnNNYXNrcyA9IG5ldyBXQlNNYXNrc0ltcGwoKTsKLQkJcmV0dXJuIHdic01hc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXZWVrRGF5IGNyZWF0ZVdlZWtEYXkoKSB7Ci0JCVdlZWtEYXlJbXBsIHdlZWtEYXkgPSBuZXcgV2Vla0RheUltcGwoKTsKLQkJcmV0dXJuIHdlZWtEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdlZWtEYXlzIGNyZWF0ZVdlZWtEYXlzKCkgewotCQlXZWVrRGF5c0ltcGwgd2Vla0RheXMgPSBuZXcgV2Vla0RheXNJbXBsKCk7Ci0JCXJldHVybiB3ZWVrRGF5czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWUgY3JlYXRlV29ya2luZ1RpbWUoKSB7Ci0JCVdvcmtpbmdUaW1lSW1wbCB3b3JraW5nVGltZSA9IG5ldyBXb3JraW5nVGltZUltcGwoKTsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JraW5nVGltZXMgY3JlYXRlV29ya2luZ1RpbWVzKCkgewotCQlXb3JraW5nVGltZXNJbXBsIHdvcmtpbmdUaW1lcyA9IG5ldyBXb3JraW5nVGltZXNJbXBsKCk7Ci0JCXJldHVybiB3b3JraW5nVGltZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQWNjcnVlQXRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QWNjcnVlQXRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBbGlhc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEFsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVBdXRob3JUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRBdXRob3JUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUJvb2tpbmdUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29raW5nVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVCb29raW5nVHlwZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEJvb2tpbmdUeXBlVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDYWxjdWxhdGlvblR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhbGN1bGF0aW9uVHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNhdGVnb3J5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q2F0ZWdvcnlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvZGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb2RlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVDb21wYW55VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29tcGFueVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUNvbnN0cmFpbnRUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb25zdHJhaW50VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRhY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDb250YWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlQ29zdFJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q29zdFJhdGVUYWJsZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlQ3VycmVuY3lTeW1ib2xUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDdXJyZW5jeVN5bWJvbFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURheVR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERheVR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERlZmF1bHRUYXNrRVZNZXRob2RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRGVmYXVsdFRhc2tUeXBlVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnREZWZhdWx0VGFza1R5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRHVyYXRpb25Gb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydER1cmF0aW9uRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTNGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlM1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RHVyYXRpb25Gb3JtYXRUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFYXJuZWRWYWx1ZU1ldGhvZFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVhcm5lZFZhbHVlTWV0aG9kVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUVtYWlsQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEVtYWlsQWRkcmVzc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlRXh0ZXJuYWxUYXNrUHJvamVjdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEV4dGVybmFsVGFza1Byb2plY3RUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGaXhlZENvc3RBY2NydWFsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlRllTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEZZU3RhcnREYXRlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua0FkZHJlc3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua0FkZHJlc3NUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rQWRkcmVzc1R5cGUyVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZUh5cGVybGlua1R5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRIeXBlcmxpbmtUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVIeXBlcmxpbmtUeXBlMkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SHlwZXJsaW5rVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlSW5pdGlhbHNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbml0aWFsc1R5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxhZ0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TGFnRm9ybWF0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExldmVsaW5nRGVsYXlGb3JtYXRUeXBlMVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTWFuYWdlclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE1hbmFnZXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU1hdGVyaWFsTGFiZWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRNYXRlcmlhbExhYmVsVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOYW1lVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUxRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmFtZVR5cGUzRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydE5ld1Rhc2tTdGFydERhdGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVOVEFjY291bnRUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROVEFjY291bnRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU91dGxpbmVOdW1iZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdXRsaW5lTnVtYmVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRPdmVydGltZVJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVBob25ldGljQWxpYXNUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY0FsaWFzVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVQaG9uZXRpY3NUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRQaG9uZXRpY3NUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVByZWZpeFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFByZWZpeFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJhdGVUYWJsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0UmF0ZVRhYmxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVJvbGx1cFR5cGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGx1cFR5cGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN1YmplY3RUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoU3RyaW5nKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRTdWJqZWN0VHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVTdWJwcm9qZWN0TmFtZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN1YnByb2plY3ROYW1lVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjcmVhdGVUaXRsZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldFN0cmluZygpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFRpdGxlVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGUxVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGUyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlMlRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGNyZWF0ZVR5cGVUeXBlM0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEJpZ0ludGVnZXIpWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUZyb21TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUeXBlVHlwZTNUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVUeXBlVHlwZTRGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VHlwZVR5cGU0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVHlwZVR5cGU1RnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFR5cGVUeXBlNVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY3JlYXRlVUlEVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZylYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U3RyaW5nKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VUlEVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY29udmVydFRvU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdHJpbmcoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlVW5pdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VW5pdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlbGlzdFNvcnRPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXZWVrU3RhcnREYXlUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdlZWtTdGFydERheVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrQ29udG91clR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0NvbnRvdXJUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIFhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jb252ZXJ0VG9TdHJpbmcoWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmdldEludGVnZXIoKSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgY3JlYXRlV29ya0Zvcm1hdFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCaWdJbnRlZ2VyKVhNTFR5cGVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGcm9tU3RyaW5nKFhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlZ2VyKCksIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya0Zvcm1hdFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBjcmVhdGVXb3JrR3JvdXBUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7Ci0JCXJldHVybiAoQmlnSW50ZWdlcilYTUxUeXBlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRnJvbVN0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtHcm91cFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gWE1MVHlwZUZhY3RvcnkuZUlOU1RBTkNFLmNvbnZlcnRUb1N0cmluZyhYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZWdlcigpLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UGFja2FnZSBnZXRNc3Byb2plY3RQYWNrYWdlKCkgewotCQlyZXR1cm4gKE1zcHJvamVjdFBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vTXNwcm9qZWN0RmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Nc3Byb2plY3RQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YjJhMDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL01zcHJvamVjdFBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UGFja2FnZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuRWNvcmVSZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5pbXBsLlhNTFR5cGVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QudXRpbC5Nc3Byb2plY3RWYWxpZGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBNc3Byb2plY3RQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VGaWxlbmFtZSA9ICJtc3Byb2plY3QuZWNvcmUiOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXNzaWdubWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhc3NpZ25tZW50c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhdmFpbGFiaWxpdHlQZXJpb2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBiYXNlbGluZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYmFzZWxpbmUzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhbGVuZGFyc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb2N1bWVudFJvb3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1hc2tFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWFza3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0bGluZUNvZGUyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGxpbmVDb2RlM0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBvdXRsaW5lQ29kZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2plY3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcmF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByYXRlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXNvdXJjZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0aW1lUGVyaW9kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB2YWx1ZTJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFsdWVMaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHZhbHVlc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3YnNNYXNrRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdic01hc2tzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdlZWtEYXlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd2Vla0RheXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya2luZ1RpbWVzRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjY3J1ZUF0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGFsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBhdXRob3JUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgY2F0ZWdvcnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvZGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbXBhbnlUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb250YWN0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjb3N0UmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBjdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGF5VHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBlbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBncm91cFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTFFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIGxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hbmFnZXJUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5hbWVUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBuYW1lVHlwZTJFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgbmFtZVR5cGUzRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG5ld1Rhc2tTdGFydERhdGVUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIG50QWNjb3VudFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3V0bGluZU51bWJlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY0FsaWFzVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHByZWZpeFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgcmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSByb2xsdXBUeXBlVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YmplY3RUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0aXRsZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGUxRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlMkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB0eXBlVHlwZTNFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgdHlwZVR5cGU0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHR5cGVUeXBlNUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB1aWRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVuaXRUeXBlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd2Vla1N0YXJ0RGF5VHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgd29ya0dyb3VwVHlwZUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1zcHJvamVjdFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBNc3Byb2plY3RGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBNc3Byb2plY3RQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChNc3Byb2plY3RQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlNc3Byb2plY3RQYWNrYWdlSW1wbCB0aGVNc3Byb2plY3RQYWNrYWdlID0gKE1zcHJvamVjdFBhY2thZ2VJbXBsKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSBpbnN0YW5jZW9mIE1zcHJvamVjdFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgOiBuZXcgTXNwcm9qZWN0UGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlYTUxUeXBlUGFja2FnZUltcGwuaW5pdCgpOwotCi0JCS8vIExvYWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5sb2FkUGFja2FnZSgpOwotCi0JCS8vIEZpeCBsb2FkZWQgcGFja2FnZXMKLQkJdGhlTXNwcm9qZWN0UGFja2FnZS5maXhQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBSZWdpc3RlciBwYWNrYWdlIHZhbGlkYXRvcgotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dAotCQkJKHRoZU1zcHJvamVjdFBhY2thZ2UsIAotCQkJIG5ldyBFVmFsaWRhdG9yLkRlc2NyaXB0b3IoKSB7Ci0JCQkJIHB1YmxpYyBFVmFsaWRhdG9yIGdldEVWYWxpZGF0b3IoKSB7Ci0JCQkJCSByZXR1cm4gTXNwcm9qZWN0VmFsaWRhdG9yLklOU1RBTkNFOwotCQkJCSB9Ci0JCQkgfSk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVNc3Byb2plY3RQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVNc3Byb2plY3RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXNzaWdubWVudCgpIHsKLQkJaWYgKGFzc2lnbm1lbnRFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMyk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lnbm1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Rhc2tVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1Jlc291cmNlVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9BY3R1YWxTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NvbmZpcm1lZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Db3N0UmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9EZWxheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpbmlzaFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfSHlwZXJsaW5rQWRkcmVzcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9IYXNGaXhlZFJhdGVVbml0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0ZpeGVkTWF0ZXJpYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9MZXZlbGluZ0RlbGF5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfTGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0xpbmtlZEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X01pbGVzdG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfT3ZlcmFsbG9jYXRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfUmVtYWluaW5nQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ092ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXNwb25zZVBlbmRpbmcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9VcGRhdGVOZWVkZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9WQUMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9Xb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfV29ya0NvbnRvdXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXNzaWdubWVudF9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFzc2lnbm1lbnRfQWN0dWFsV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0FjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBc3NpZ25tZW50X0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50X0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFzc2lnbm1lbnRfQmFzZWxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBc3NpZ25tZW50KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXNzaWdubWVudF9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEFzc2lnbm1lbnQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFzc2lnbm1lbnRzKCkgewotCQlpZiAoYXNzaWdubWVudHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXNzaWdubWVudHNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQpOwotCQl9Ci0JCXJldHVybiBhc3NpZ25tZW50c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBc3NpZ25tZW50c19Bc3NpZ25tZW50KCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0QXNzaWdubWVudHMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkgewotCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCWF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNik7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEF2YWlsYWJpbGl0eVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QXZhaWxhYmlsaXR5UGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBdmFpbGFiaWxpdHlQZXJpb2RfQXZhaWxhYmxlVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLQkJaWYgKGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYXZhaWxhYmlsaXR5UGVyaW9kc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNyk7Ci0JCX0KLQkJcmV0dXJuIGF2YWlsYWJpbGl0eVBlcmlvZHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXZhaWxhYmlsaXR5UGVyaW9kc19BdmFpbGFiaWxpdHlQZXJpb2QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmVFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZV9UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfSW50ZXJpbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfRXN0aW1hdGVkRHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmVfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZV9Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QmFzZWxpbmUyKCkgewotCQlpZiAoYmFzZWxpbmUyRUNsYXNzID09IG51bGwpIHsKLQkJCWJhc2VsaW5lMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOSk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUyX0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lMl9CQ1dTKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTJfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCYXNlbGluZTMoKSB7Ci0JCWlmIChiYXNlbGluZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMCk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VsaW5lM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCYXNlbGluZTNfVGltZXBoYXNlZERhdGEoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19OdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0ZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJhc2VsaW5lM19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0QmFzZWxpbmUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCYXNlbGluZTNfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEJhc2VsaW5lMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QmFzZWxpbmUzX0JDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRCYXNlbGluZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FsZW5kYXIoKSB7Ci0JCWlmIChjYWxlbmRhckVDbGFzcyA9PSBudWxsKSB7Ci0JCQljYWxlbmRhckVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTUpOwotCQl9Ci0JCXJldHVybiBjYWxlbmRhckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FsZW5kYXJfTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9Jc0Jhc2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldENhbGVuZGFyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYWxlbmRhcl9CYXNlQ2FsZW5kYXJVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2FsZW5kYXJfV2Vla0RheXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYWxlbmRhcnMoKSB7Ci0JCWlmIChjYWxlbmRhcnNFQ2xhc3MgPT0gbnVsbCkgewotCQkJY2FsZW5kYXJzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxNik7Ci0JCX0KLQkJcmV0dXJuIGNhbGVuZGFyc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDYWxlbmRhcnNfQ2FsZW5kYXIoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRDYWxlbmRhcnMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCkgewotCQlpZiAoZG9jdW1lbnRSb290RUNsYXNzID09IG51bGwpIHsKLQkJCWRvY3VtZW50Um9vdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjkpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RG9jdW1lbnRSb290KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9YU0lTY2hlbWFMb2NhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldERvY3VtZW50Um9vdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1Byb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXREb2N1bWVudFJvb3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzkpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX1JvbGx1cFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfQ2FsY3VsYXRpb25UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0Zvcm11bGEoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfUmVzdHJpY3RWYWx1ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVfVmFsdWVsaXN0U29ydE9yZGVyKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlX0FwcGVuZE5ld1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9EZWZhdWx0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZV9WYWx1ZUxpc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGUyRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDApOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZTJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlMl9EdXJhdGlvbkZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFeHRlbmRlZEF0dHJpYnV0ZTMoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZTNFQ2xhc3MgPT0gbnVsbCkgewotCQkJZXh0ZW5kZWRBdHRyaWJ1dGUzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0MSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlM0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTNfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldEV4dGVuZGVkQXR0cmlidXRlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4dGVuZGVkQXR0cmlidXRlNCgpIHsKLQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlNEVDbGFzcyA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZTRFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQyKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEV4dGVuZGVkQXR0cmlidXRlNF9WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGU0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFeHRlbmRlZEF0dHJpYnV0ZTRfRHVyYXRpb25Gb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRFeHRlbmRlZEF0dHJpYnV0ZTQoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZXh0ZW5kZWRBdHRyaWJ1dGVzRUNsYXNzID09IG51bGwpIHsKLQkJCWV4dGVuZGVkQXR0cmlidXRlc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDMpOwotCQl9Ci0JCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzX0V4dGVuZGVkQXR0cmlidXRlKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1hc2soKSB7Ci0JCWlmIChtYXNrRUNsYXNzID09IG51bGwpIHsKLQkJCW1hc2tFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYyKTsKLQkJfQotCQlyZXR1cm4gbWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0TWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE1hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWFza3MoKSB7Ci0JCWlmIChtYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQltYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjMpOwotCQl9Ci0JCXJldHVybiBtYXNrc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNYXNrc19NYXNrKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0TWFza3MoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzEpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9GaWVsZElEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0ZpZWxkTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGlhcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9QaG9uZXRpY0FsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2RlX1ZhbHVlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9FbnRlcnByaXNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlX1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9MZWFmT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9BbGxMZXZlbHNSZXF1aXJlZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZV9Pbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRPdXRsaW5lQ29kZV9NYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRPdXRsaW5lQ29kZTIoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZTJFQ2xhc3MgPT0gbnVsbCkgewotCQkJb3V0bGluZUNvZGUyRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3Mik7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRPdXRsaW5lQ29kZTJfRmllbGRJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUyX1ZhbHVlSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0bGluZUNvZGUzKCkgewotCQlpZiAob3V0bGluZUNvZGUzRUNsYXNzID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlM0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzMpOwotCQl9Ci0JCXJldHVybiBvdXRsaW5lQ29kZTNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX1VJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldE91dGxpbmVDb2RlMygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0T3V0bGluZUNvZGUzX0ZpZWxkSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRPdXRsaW5lQ29kZTMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE91dGxpbmVDb2RlM19WYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0T3V0bGluZUNvZGUzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE91dGxpbmVDb2RlcygpIHsKLQkJaWYgKG91dGxpbmVDb2Rlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc0KTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGVzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE91dGxpbmVDb2Rlc19PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldE91dGxpbmVDb2RlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmVkZWNlc3NvckxpbmsoKSB7Ci0JCWlmIChwcmVkZWNlc3NvckxpbmtFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJlZGVjZXNzb3JMaW5rRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MCk7Ci0JCX0KLQkJcmV0dXJuIHByZWRlY2Vzc29yTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfUHJlZGVjZXNzb3JVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJlZGVjZXNzb3JMaW5rKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmVkZWNlc3NvckxpbmtfQ3Jvc3NQcm9qZWN0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByZWRlY2Vzc29yTGluaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJlZGVjZXNzb3JMaW5rX0xpbmtMYWcoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByZWRlY2Vzc29yTGlua19MYWdGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcmVkZWNlc3NvckxpbmsoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKHByb2plY3RFQ2xhc3MgPT0gbnVsbCkgewotCQkJcHJvamVjdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODIpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9UaXRsZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ViamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ2F0ZWdvcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NvbXBhbnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01hbmFnZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dGhvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3JlYXRpb25EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZXZpc2lvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTGFzdFNhdmVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9TdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaW5pc2hEYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRllTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Dcml0aWNhbFNsYWNrTGltaXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW5jeURpZ2l0cygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0N1cnJlbmN5U3ltYm9sKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQ3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFN0YXJ0VGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0RlZmF1bHRGaW5pc2hUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTWludXRlc1BlckRheSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pbnV0ZXNQZXJXZWVrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGF5c1Blck1vbnRoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdFRhc2tUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfV29ya0Zvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0VkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Ib25vckNvbnN0cmFpbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfRWFybmVkVmFsdWVNZXRob2QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9JbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9NdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9OZXdUYXNrc0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tzRXN0aW1hdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfU3ByZWFkQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9GaXNjYWxZZWFyU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9XZWVrU3RhcnREYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9Nb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X1N0YXR1c0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9DdXJyZW50RGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9BdXRvbGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X05ld1Rhc2tTdGFydERhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9EZWZhdWx0VGFza0VWTWV0aG9kKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2plY3RfUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9FeHRlbmRlZENyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FjdHVhbHNJblN5bmMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvamVjdF9SZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9qZWN0X0FkbWluUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X091dGxpbmVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9qZWN0X1dCU01hc2tzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfRXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfQ2FsZW5kYXJzKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UHJvamVjdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2plY3RfVGFza3MoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9SZXNvdXJjZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRQcm9qZWN0KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvamVjdF9Bc3NpZ25tZW50cygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFByb2plY3QoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGUoKSB7Ci0JCWlmIChyYXRlRUNsYXNzID09IG51bGwpIHsKLQkJCXJhdGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDgzKTsKLQkJfQotCQlyZXR1cm4gcmF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1JhdGVzRnJvbSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZXNUbygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfUmF0ZVRhYmxlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJhdGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJhdGVfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmF0ZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmF0ZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSYXRlX0Nvc3RQZXJVc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSYXRlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJhdGVzKCkgewotCQlpZiAocmF0ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmF0ZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg0KTsKLQkJfQotCQlyZXR1cm4gcmF0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmF0ZXNfUmF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJhdGVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlKCkgewotCQlpZiAocmVzb3VyY2VFQ2xhc3MgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg2KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05hbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSW5pdGlhbHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUGhvbmV0aWNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX05UQWNjb3VudCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9NYXRlcmlhbExhYmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfR3JvdXAoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtHcm91cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRW1haWxBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9IeXBlcmxpbmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0h5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX01heFVuaXRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZWFrVW5pdHMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZUZyb20oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0F2YWlsYWJsZVRvKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfRmluaXNoKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9DYW5MZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWNjcnVlQXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlZ3VsYXJXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbFdvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1JlbWFpbmluZ1dvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdHVhbE92ZXJ0aW1lV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9QZXJjZW50V29ya0NvbXBsZXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TdGFuZGFyZFJhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1N0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfT3ZlcnRpbWVSYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9PdmVydGltZVJhdGVGb3JtYXQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX092ZXJ0aW1lQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFBlclVzZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsQ29zdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQWN0dWFsT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9SZW1haW5pbmdPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX1dvcmtWYXJpYW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ29zdFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9TVigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQ1YoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FDV1AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NhbGVuZGFyVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQ5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Ob3RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfQkNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VfSXNHZW5lcmljKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0luYWN0aXZlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9Jc0VudGVycHJpc2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0Jvb2tpbmdUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSZXNvdXJjZV9BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0FjdGl2ZURpcmVjdG9yeUdVSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlc291cmNlX0NyZWF0aW9uRGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfRXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZXNvdXJjZV9PdXRsaW5lQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfQXZhaWxhYmlsaXR5UGVyaW9kcygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UmVzb3VyY2VfUmF0ZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRSZXNvdXJjZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlX1RpbWVwaGFzZWREYXRhKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0UmVzb3VyY2UoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJlc291cmNlcygpIHsKLQkJaWYgKHJlc291cmNlc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDg3KTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJlc291cmNlc19SZXNvdXJjZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFJlc291cmNlcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrKCkgewotCQlpZiAodGFza0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl0YXNrRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Myk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19VSUQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0lEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19OYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc051bGwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NyZWF0ZURhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnRhY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1dCUygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV0JTTGV2ZWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVOdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX091dGxpbmVMZXZlbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1ByaW9yaXR5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19EdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0R1cmF0aW9uRm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfV29yaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N0b3AoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZXN1bWVWYWxpZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDE5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0VmZm9ydERyaXZlbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlY3VycmluZygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX092ZXJBbGxvY2F0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19NaWxlc3RvbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdW1tYXJ5KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ3JpdGljYWwoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Jc1N1YnByb2plY3RSZWFkT25seSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDI4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1N1YnByb2plY3ROYW1lKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMjkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXh0ZXJuYWxUYXNrUHJvamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0Vhcmx5U3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJseUZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVTdGFydCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDM0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xhdGVGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19TdGFydFZhcmlhbmNlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMzYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRmluaXNoVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Xb3JrVmFyaWFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19GcmVlU2xhY2soKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Ub3RhbFNsYWNrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRml4ZWRDb3N0QWNjcnVhbCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRDb21wbGV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1BlcmNlbnRXb3JrQ29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Db3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxGaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbENvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1MSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVndWxhcldvcmsoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdEdXJhdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDU2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JlbWFpbmluZ0Nvc3QoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1Nyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19SZW1haW5pbmdXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNTkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQUNXUCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NWKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQ29uc3RyYWludFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Myk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19DYWxlbmRhclVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0NvbnN0cmFpbnREYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRGVhZGxpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbEFzc2lnbm1lbnRzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNjcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfTGV2ZWxpbmdDYW5TcGxpdCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDY4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0xldmVsaW5nRGVsYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19MZXZlbGluZ0RlbGF5Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZFN0YXJ0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUHJlTGV2ZWxlZEZpbmlzaCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDczKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0h5cGVybGlua0FkZHJlc3MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3NCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19IeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX05vdGVzKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNzcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfSGlkZUJhcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1JvbGx1cCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDc5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0JDV1MoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4MCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19CQ1dQKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfUGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Mik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19FYXJuZWRWYWx1ZU1ldGhvZCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX1ByZWRlY2Vzc29yTGluaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0FjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4NSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19BY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4Nik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19FeHRlbmRlZEF0dHJpYnV0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrX0Jhc2VsaW5lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0VGFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoODgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3V0bGluZUNvZGUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRUYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4OSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19UaW1lcGhhc2VkRGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tzKCkgewotCQlpZiAodGFza3NFQ2xhc3MgPT0gbnVsbCkgewotCQkJdGFza3NFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk0KTsKLQkJfQotCQlyZXR1cm4gdGFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza3NfVGFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFRhc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVQZXJpb2QoKSB7Ci0JCWlmICh0aW1lUGVyaW9kRUNsYXNzID09IG51bGwpIHsKLQkJCXRpbWVQZXJpb2RFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk1KTsKLQkJfQotCQlyZXR1cm4gdGltZVBlcmlvZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lUGVyaW9kX0Zyb21EYXRlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZVBlcmlvZCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGltZVBlcmlvZF9Ub0RhdGUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lUGVyaW9kKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRpbWVwaGFzZWREYXRhVHlwZSgpIHsKLQkJaWYgKHRpbWVwaGFzZWREYXRhVHlwZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl0aW1lcGhhc2VkRGF0YVR5cGVFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk2KTsKLQkJfQotCQlyZXR1cm4gdGltZXBoYXNlZERhdGFUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9GaW5pc2goKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRpbWVwaGFzZWREYXRhVHlwZV9Vbml0KCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VGltZXBoYXNlZERhdGFUeXBlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUaW1lcGhhc2VkRGF0YVR5cGVfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRUaW1lcGhhc2VkRGF0YVR5cGUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZUVDbGFzcyA9PSBudWxsKSB7Ci0JCQl2YWx1ZUVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA2KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVfVmFsdWVJRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZV9QYXJlbnRWYWx1ZUlEKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlX0Rlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWUyKCkgewotCQlpZiAodmFsdWUyRUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlMkVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA3KTsKLQkJfQotCQlyZXR1cm4gdmFsdWUyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhbHVlMl9JRCgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFZhbHVlMigpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWUyX1ZhbHVlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWUyKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRWYWx1ZTJfRGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRWYWx1ZTIoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFsdWVMaXN0KCkgewotCQlpZiAodmFsdWVMaXN0RUNsYXNzID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdEVDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA4KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVMaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFZhbHVlTGlzdF9WYWx1ZSgpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFZhbHVlTGlzdCgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRWYWx1ZXMoKSB7Ci0JCWlmICh2YWx1ZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJdmFsdWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTApOwotCQl9Ci0JCXJldHVybiB2YWx1ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VmFsdWVzX0dyb3VwKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0VmFsdWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRWYWx1ZXNfVmFsdWUoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRWYWx1ZXMoKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFzaygpIHsKLQkJaWYgKHdic01hc2tFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2JzTWFza0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTExKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX0xldmVsKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19UeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V0JTTWFzaygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza19MZW5ndGgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrX1NlcGFyYXRvcigpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2soKS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V0JTTWFza3MoKSB7Ci0JCWlmICh3YnNNYXNrc0VDbGFzcyA9PSBudWxsKSB7Ci0JCQl3YnNNYXNrc0VDbGFzcyA9IChFQ2xhc3MpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTEyKTsKLQkJfQotCQlyZXR1cm4gd2JzTWFza3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfVmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V0JTTWFza3NfR2VuZXJhdGVDb2RlcygpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXQlNNYXNrc19QcmVmaXgoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXQlNNYXNrcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V0JTTWFza3NfV0JTTWFzaygpIHsKLSAgICAgICAgcmV0dXJuIChFUmVmZXJlbmNlKWdldFdCU01hc2tzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXkoKSB7Ci0JCWlmICh3ZWVrRGF5RUNsYXNzID09IG51bGwpIHsKLQkJCXdlZWtEYXlFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExMyk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlUeXBlKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V2Vla0RheV9EYXlXb3JraW5nKCkgewotICAgICAgICByZXR1cm4gKEVBdHRyaWJ1dGUpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9UaW1lUGVyaW9kKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V2Vla0RheSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V2Vla0RheV9Xb3JraW5nVGltZXMoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5KCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdlZWtEYXlzKCkgewotCQlpZiAod2Vla0RheXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd2Vla0RheXNFQ2xhc3MgPSAoRUNsYXNzKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNCk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXlzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdlZWtEYXlzX1dlZWtEYXkoKSB7Ci0gICAgICAgIHJldHVybiAoRVJlZmVyZW5jZSlnZXRXZWVrRGF5cygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lRUNsYXNzID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTkpOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Gcm9tVGltZSgpIHsKLSAgICAgICAgcmV0dXJuIChFQXR0cmlidXRlKWdldFdvcmtpbmdUaW1lKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JraW5nVGltZV9Ub1RpbWUoKSB7Ci0gICAgICAgIHJldHVybiAoRUF0dHJpYnV0ZSlnZXRXb3JraW5nVGltZSgpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JraW5nVGltZXMoKSB7Ci0JCWlmICh3b3JraW5nVGltZXNFQ2xhc3MgPT0gbnVsbCkgewotCQkJd29ya2luZ1RpbWVzRUNsYXNzID0gKEVDbGFzcylFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMjApOwotCQl9Ci0JCXJldHVybiB3b3JraW5nVGltZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya2luZ1RpbWVzX1dvcmtpbmdUaW1lKCkgewotICAgICAgICByZXR1cm4gKEVSZWZlcmVuY2UpZ2V0V29ya2luZ1RpbWVzKCkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjY3J1ZUF0KCkgewotCQlpZiAoYWNjcnVlQXRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWNjcnVlQXRFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDApOwotCQl9Ci0JCXJldHVybiBhY2NydWVBdEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKCkgewotCQlpZiAoYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEpOwotCQl9Ci0JCXJldHVybiBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEFsaWFzVHlwZSgpIHsKLQkJaWYgKGFsaWFzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIpOwotCQl9Ci0JCXJldHVybiBhbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRBdXRob3JUeXBlKCkgewotCQlpZiAoYXV0aG9yVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhdXRob3JUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1KTsKLQkJfQotCQlyZXR1cm4gYXV0aG9yVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKCkgewotCQlpZiAoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExKTsKLQkJfQotCQlyZXR1cm4gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRCb29raW5nVHlwZVR5cGUoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJYm9va2luZ1R5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMik7Ci0JCX0KLQkJcmV0dXJuIGJvb2tpbmdUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEJvb2tpbmdUeXBlVHlwZTEoKSB7Ci0JCWlmIChib29raW5nVHlwZVR5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWJvb2tpbmdUeXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEzKTsKLQkJfQotCQlyZXR1cm4gYm9va2luZ1R5cGVUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhbGN1bGF0aW9uVHlwZVR5cGUoKSB7Ci0JCWlmIChjYWxjdWxhdGlvblR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNhbGN1bGF0aW9uVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE0KTsKLQkJfQotCQlyZXR1cm4gY2FsY3VsYXRpb25UeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENhdGVnb3J5VHlwZSgpIHsKLQkJaWYgKGNhdGVnb3J5VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljYXRlZ29yeVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE3KTsKLQkJfQotCQlyZXR1cm4gY2F0ZWdvcnlUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q29kZVR5cGUoKSB7Ci0JCWlmIChjb2RlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljb2RlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTgpOwotCQl9Ci0JCXJldHVybiBjb2RlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbXBhbnlUeXBlKCkgewotCQlpZiAoY29tcGFueVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29tcGFueVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDE5KTsKLQkJfQotCQlyZXR1cm4gY29tcGFueVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb25zdHJhaW50VHlwZVR5cGUoKSB7Ci0JCWlmIChjb25zdHJhaW50VHlwZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29uc3RyYWludFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnN0cmFpbnRUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldENvbnRhY3RUeXBlKCkgewotCQlpZiAoY29udGFjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJY29udGFjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDIxKTsKLQkJfQotCQlyZXR1cm4gY29udGFjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRDb3N0UmF0ZVRhYmxlVHlwZSgpIHsKLQkJaWYgKGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgyMik7Ci0JCX0KLQkJcmV0dXJuIGNvc3RSYXRlVGFibGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoKSB7Ci0JCWlmIChjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjMpOwotCQl9Ci0JCXJldHVybiBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEN1cnJlbmN5U3ltYm9sVHlwZSgpIHsKLQkJaWYgKGN1cnJlbmN5U3ltYm9sVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQljdXJyZW5jeVN5bWJvbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI0KTsKLQkJfQotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2xUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGF5VHlwZVR5cGUoKSB7Ci0JCWlmIChkYXlUeXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkYXlUeXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjUpOwotCQl9Ci0JCXJldHVybiBkYXlUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSgpIHsKLQkJaWYgKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI2KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMjcpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSB7Ci0JCWlmIChkZWZhdWx0VGFza1R5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWRlZmF1bHRUYXNrVHlwZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDI4KTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldER1cmF0aW9uRm9ybWF0VHlwZSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlkdXJhdGlvbkZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDMwKTsKLQkJfQotCQlyZXR1cm4gZHVyYXRpb25Gb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzEpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzIpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMygpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzMpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNCgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTRFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzQpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpIHsKLQkJaWYgKGR1cmF0aW9uRm9ybWF0VHlwZTVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJZHVyYXRpb25Gb3JtYXRUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzUpOwotCQl9Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdFR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RWFybmVkVmFsdWVNZXRob2RUeXBlKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWVhcm5lZFZhbHVlTWV0aG9kVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMzYpOwotCQl9Ci0JCXJldHVybiBlYXJuZWRWYWx1ZU1ldGhvZFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKCkgewotCQlpZiAoZWFybmVkVmFsdWVNZXRob2RUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllYXJuZWRWYWx1ZU1ldGhvZFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzNyk7Ci0JCX0KLQkJcmV0dXJuIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFbWFpbEFkZHJlc3NUeXBlKCkgewotCQlpZiAoZW1haWxBZGRyZXNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQllbWFpbEFkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgzOCk7Ci0JCX0KLQkJcmV0dXJuIGVtYWlsQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgpIHsKLQkJaWYgKGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0NCk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVybmFsVGFza1Byb2plY3RUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSB7Ci0JCWlmIChmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDUpOwotCQl9Ci0JCXJldHVybiBmaXhlZENvc3RBY2NydWFsVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEZZU3RhcnREYXRlVHlwZSgpIHsKLQkJaWYgKGZ5U3RhcnREYXRlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlmeVN0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDQ2KTsKLQkJfQotCQlyZXR1cm4gZnlTdGFydERhdGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0R3JvdXBUeXBlKCkgewotCQlpZiAoZ3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWdyb3VwVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDcpOwotCQl9Ci0JCXJldHVybiBncm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg0OCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUxKCkgewotCQlpZiAoaHlwZXJsaW5rQWRkcmVzc1R5cGUxRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWh5cGVybGlua0FkZHJlc3NUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNDkpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtBZGRyZXNzVHlwZTFFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKSB7Ci0JCWlmIChoeXBlcmxpbmtBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rQWRkcmVzc1R5cGUyRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1MCk7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua0FkZHJlc3NUeXBlMkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlKCkgewotCQlpZiAoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUxKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Mik7Ci0JCX0KLQkJcmV0dXJuIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1N1YkFkZHJlc3NUeXBlMigpIHsKLQkJaWYgKGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMkVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDUzKTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZSgpIHsKLQkJaWYgKGh5cGVybGlua1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTQpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0SHlwZXJsaW5rVHlwZTEoKSB7Ci0JCWlmIChoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQloeXBlcmxpbmtUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNTUpOwotCQl9Ci0JCXJldHVybiBoeXBlcmxpbmtUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldEh5cGVybGlua1R5cGUyKCkgewotCQlpZiAoaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU2KTsKLQkJfQotCQlyZXR1cm4gaHlwZXJsaW5rVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJbml0aWFsc1R5cGUoKSB7Ci0JCWlmIChpbml0aWFsc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJaW5pdGlhbHNUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg1Nyk7Ci0JCX0KLQkJcmV0dXJuIGluaXRpYWxzVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExhZ0Zvcm1hdFR5cGUoKSB7Ci0JCWlmIChsYWdGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCWxhZ0Zvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU4KTsKLQkJfQotCQlyZXR1cm4gbGFnRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldExldmVsaW5nRGVsYXlGb3JtYXRUeXBlKCkgewotCQlpZiAobGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDU5KTsKLQkJfQotCQlyZXR1cm4gbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTFFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2MCk7Ci0JCX0KLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE1hbmFnZXJUeXBlKCkgewotCQlpZiAobWFuYWdlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbWFuYWdlclR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDYxKTsKLQkJfQotCQlyZXR1cm4gbWFuYWdlclR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRNYXRlcmlhbExhYmVsVHlwZSgpIHsKLQkJaWYgKG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2NCk7Ci0JCX0KLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWxUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUoKSB7Ci0JCWlmIChuYW1lVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjUpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5hbWVUeXBlMSgpIHsKLQkJaWYgKG5hbWVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQluYW1lVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY2KTsKLQkJfQotCQlyZXR1cm4gbmFtZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0TmFtZVR5cGUyKCkgewotCQlpZiAobmFtZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW5hbWVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNjcpOwotCQl9Ci0JCXJldHVybiBuYW1lVHlwZTJFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROYW1lVHlwZTMoKSB7Ci0JCWlmIChuYW1lVHlwZTNFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmFtZVR5cGUzRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg2OCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVUeXBlM0VEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldE5ld1Rhc2tTdGFydERhdGVUeXBlKCkgewotCQlpZiAobmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDY5KTsKLQkJfQotCQlyZXR1cm4gbmV3VGFza1N0YXJ0RGF0ZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXROVEFjY291bnRUeXBlKCkgewotCQlpZiAobnRBY2NvdW50VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQludEFjY291bnRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3MCk7Ci0JCX0KLQkJcmV0dXJuIG50QWNjb3VudFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRPdXRsaW5lTnVtYmVyVHlwZSgpIHsKLQkJaWYgKG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCW91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3NSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVOdW1iZXJUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzYpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoNzcpOwotCQl9Ci0JCXJldHVybiBvdmVydGltZVJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFBob25ldGljQWxpYXNUeXBlKCkgewotCQlpZiAocGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDc4KTsKLQkJfQotCQlyZXR1cm4gcGhvbmV0aWNBbGlhc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQaG9uZXRpY3NUeXBlKCkgewotCQlpZiAocGhvbmV0aWNzVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwaG9uZXRpY3NUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg3OSk7Ci0JCX0KLQkJcmV0dXJuIHBob25ldGljc1R5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRQcmVmaXhUeXBlKCkgewotCQlpZiAocHJlZml4VHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlwcmVmaXhUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4MSk7Ci0JCX0KLQkJcmV0dXJuIHByZWZpeFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSYXRlVGFibGVUeXBlKCkgewotCQlpZiAocmF0ZVRhYmxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlyYXRlVGFibGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4NSk7Ci0JCX0KLQkJcmV0dXJuIHJhdGVUYWJsZVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRSb2xsdXBUeXBlVHlwZSgpIHsKLQkJaWYgKHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXJvbGx1cFR5cGVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg4OCk7Ci0JCX0KLQkJcmV0dXJuIHJvbGx1cFR5cGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3RhbmRhcmRSYXRlRm9ybWF0VHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoODkpOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEoKSB7Ci0JCWlmIChzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTApOwotCQl9Ci0JCXJldHVybiBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFN1YmplY3RUeXBlKCkgewotCQlpZiAoc3ViamVjdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3ViamVjdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDkxKTsKLQkJfQotCQlyZXR1cm4gc3ViamVjdFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSB7Ci0JCWlmIChzdWJwcm9qZWN0TmFtZVR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJc3VicHJvamVjdE5hbWVUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCg5Mik7Ci0JCX0KLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFRpdGxlVHlwZSgpIHsKLQkJaWYgKHRpdGxlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0aXRsZVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk3KTsKLQkJfQotCQlyZXR1cm4gdGl0bGVUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUoKSB7Ci0JCWlmICh0eXBlVHlwZUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoOTgpOwotCQl9Ci0JCXJldHVybiB0eXBlVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFR5cGVUeXBlMSgpIHsKLQkJaWYgKHR5cGVUeXBlMUVEYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlVHlwZTFFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDk5KTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUxRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUyKCkgewotCQlpZiAodHlwZVR5cGUyRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlMkVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAwKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUyRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGUzKCkgewotCQlpZiAodHlwZVR5cGUzRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlM0VEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAxKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGUzRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU0KCkgewotCQlpZiAodHlwZVR5cGU0RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNEVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAyKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VHlwZVR5cGU1KCkgewotCQlpZiAodHlwZVR5cGU1RURhdGFUeXBlID09IG51bGwpIHsKLQkJCXR5cGVUeXBlNUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTAzKTsKLQkJfQotCQlyZXR1cm4gdHlwZVR5cGU1RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VUlEVHlwZSgpIHsKLQkJaWYgKHVpZFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdWlkVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA0KTsKLQkJfQotCQlyZXR1cm4gdWlkVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFVuaXRUeXBlKCkgewotCQlpZiAodW5pdFR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdW5pdFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDEwNSk7Ci0JCX0KLQkJcmV0dXJuIHVuaXRUeXBlRURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmFsdWVsaXN0U29ydE9yZGVyVHlwZSgpIHsKLQkJaWYgKHZhbHVlbGlzdFNvcnRPcmRlclR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZSA9IChFRGF0YVR5cGUpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoTXNwcm9qZWN0UGFja2FnZS5lTlNfVVJJKS5nZXRFQ2xhc3NpZmllcnMoKS5nZXQoMTA5KTsKLQkJfQotCQlyZXR1cm4gdmFsdWVsaXN0U29ydE9yZGVyVHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdlZWtTdGFydERheVR5cGUoKSB7Ci0JCWlmICh3ZWVrU3RhcnREYXlUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdlZWtTdGFydERheVR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExNSk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtTdGFydERheVR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrQ29udG91clR5cGUoKSB7Ci0JCWlmICh3b3JrQ29udG91clR5cGVFRGF0YVR5cGUgPT0gbnVsbCkgewotCQkJd29ya0NvbnRvdXJUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTYpOwotCQl9Ci0JCXJldHVybiB3b3JrQ29udG91clR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRXb3JrRm9ybWF0VHlwZSgpIHsKLQkJaWYgKHdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtGb3JtYXRUeXBlRURhdGFUeXBlID0gKEVEYXRhVHlwZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShNc3Byb2plY3RQYWNrYWdlLmVOU19VUkkpLmdldEVDbGFzc2lmaWVycygpLmdldCgxMTcpOwotCQl9Ci0JCXJldHVybiB3b3JrRm9ybWF0VHlwZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFdvcmtHcm91cFR5cGUoKSB7Ci0JCWlmICh3b3JrR3JvdXBUeXBlRURhdGFUeXBlID09IG51bGwpIHsKLQkJCXdvcmtHcm91cFR5cGVFRGF0YVR5cGUgPSAoRURhdGFUeXBlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE1zcHJvamVjdFBhY2thZ2UuZU5TX1VSSSkuZ2V0RUNsYXNzaWZpZXJzKCkuZ2V0KDExOCk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtHcm91cFR5cGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEZhY3RvcnkgZ2V0TXNwcm9qZWN0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChNc3Byb2plY3RGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMb2FkZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIExhb2RzIHRoZSBwYWNrYWdlIGFuZCBhbnkgc3ViLXBhY2thZ2VzIGZyb20gdGhlaXIgc2VyaWFsaXplZCBmb3JtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRQYWNrYWdlKCkgewotCQlpZiAoaXNMb2FkZWQpIHJldHVybjsKLQkJaXNMb2FkZWQgPSB0cnVlOwotCi0JCVVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKHBhY2thZ2VGaWxlbmFtZSk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3Npbmcgc2VyaWFsaXplZCBwYWNrYWdlOiAiICsgcGFja2FnZUZpbGVuYW1lKTsKLQkJfQotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBFY29yZVJlc291cmNlRmFjdG9yeUltcGwoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKHVybC50b1N0cmluZygpKSk7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZS5sb2FkKG51bGwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBXcmFwcGVkRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCX0KLQkJaW5pdGlhbGl6ZUZyb21Mb2FkZWRFUGFja2FnZSh0aGlzLCAoRVBhY2thZ2UpcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpeGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGaXhlcyB1cCB0aGUgbG9hZGVkIHBhY2thZ2UsIHRvIG1ha2UgaXQgYXBwZWFyIGFzIGlmIGl0IGhhZCBiZWVuIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZml4UGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNGaXhlZCkgcmV0dXJuOwotCQlpc0ZpeGVkID0gdHJ1ZTsKLQkJZml4RUNsYXNzaWZpZXJzKCk7Ci0JfQotfSAvL01zcHJvamVjdFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwNmIxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogT3V0bGluZUNvZGUySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0bGluZSBDb2RlMjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlMkltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTJJbXBsI2dldEZpZWxkSUQgPGVtPkZpZWxkIElEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUySW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGxpbmVDb2RlMkltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlMiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZElEKCkgPGVtPkZpZWxkIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWVsZElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkSUQgPSBGSUVMRF9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlMkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRsaW5lQ29kZTIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGRJRCgpIHsKLQkJcmV0dXJuIGZpZWxkSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmllbGRJRChTdHJpbmcgbmV3RmllbGRJRCkgewotCQlTdHJpbmcgb2xkRmllbGRJRCA9IGZpZWxkSUQ7Ci0JCWZpZWxkSUQgPSBuZXdGaWVsZElEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX0ZJRUxEX0lELCBvbGRGaWVsZElELCBmaWVsZElEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFsdWVJRCgpIHsKLQkJcmV0dXJuIHZhbHVlSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVJRChCaWdJbnRlZ2VyIG5ld1ZhbHVlSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRWYWx1ZUlEID0gdmFsdWVJRDsKLQkJdmFsdWVJRCA9IG5ld1ZhbHVlSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVkFMVUVfSUQsIG9sZFZhbHVlSUQsIHZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fVUlEOgotCQkJCXJldHVybiBnZXRVSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlyZXR1cm4gZ2V0RmllbGRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRWYWx1ZUlEKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRChGSUVMRF9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoVkFMVUVfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1VJRDoKLQkJCQlyZXR1cm4gVUlEX0VERUZBVUxUID09IG51bGwgPyB1SUQgIT0gbnVsbCA6ICFVSURfRURFRkFVTFQuZXF1YWxzKHVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMl9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIEZJRUxEX0lEX0VERUZBVUxUID09IG51bGwgPyBmaWVsZElEICE9IG51bGwgOiAhRklFTERfSURfRURFRkFVTFQuZXF1YWxzKGZpZWxkSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTJfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vT3V0bGluZUNvZGUySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZTNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZmRhNzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL091dGxpbmVDb2RlM0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGxpbmVDb2RlM0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZTNJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGUzSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlM0ltcGwjZ2V0VmFsdWVJRCA8ZW0+VmFsdWUgSUQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZTNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBPdXRsaW5lQ29kZTMgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlSUQoKSA8ZW0+VmFsdWUgSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHZhbHVlSUQgPSBWQUxVRV9JRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZTNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0bGluZUNvZGUzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChCaWdJbnRlZ2VyIG5ld1VJRCkgewotCQlCaWdJbnRlZ2VyIG9sZFVJRCA9IHVJRDsKLQkJdUlEID0gbmV3VUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkSUQoKSB7Ci0JCXJldHVybiBmaWVsZElEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkSUQoU3RyaW5nIG5ld0ZpZWxkSUQpIHsKLQkJU3RyaW5nIG9sZEZpZWxkSUQgPSBmaWVsZElEOwotCQlmaWVsZElEID0gbmV3RmllbGRJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1ZBTFVFX0lELCBvbGRWYWx1ZUlELCB2YWx1ZUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVJRCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fRklFTERfSUQ6Ci0JCQkJc2V0RmllbGRJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFM19fVkFMVUVfSUQ6Ci0JCQkJc2V0VmFsdWVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoRklFTERfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERTNfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzX19WQUxVRV9JRDoKLQkJCQlyZXR1cm4gVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlSUQgIT0gbnVsbCA6ICFWQUxVRV9JRF9FREVGQVVMVC5lcXVhbHModmFsdWVJRCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1SUQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmllbGRJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmllbGRJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL091dGxpbmVDb2RlM0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5YWZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGxpbmUgQ29kZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZElEIDxlbT5GaWVsZCBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRGaWVsZE5hbWUgPGVtPkZpZWxkIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjZ2V0QWxpYXMgPGVtPkFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFBob25ldGljQWxpYXMgPGVtPlBob25ldGljIEFsaWFzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2dldFZhbHVlcyA8ZW0+VmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzRW50ZXJwcmlzZSA8ZW0+RW50ZXJwcmlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyA8ZW0+RW50ZXJwcmlzZSBPdXRsaW5lIENvZGUgQWxpYXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5PdXRsaW5lQ29kZUltcGwjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzTGVhZk9ubHkgPGVtPkxlYWYgT25seTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNpc0FsbExldmVsc1JlcXVpcmVkIDxlbT5BbGwgTGV2ZWxzIFJlcXVpcmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVJbXBsI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCA8ZW0+T25seSBUYWJsZSBWYWx1ZXMgQWxsb3dlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLk91dGxpbmVDb2RlSW1wbCNnZXRNYXNrcyA8ZW0+TWFza3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRsaW5lQ29kZUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIE91dGxpbmVDb2RlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGRJRCgpIDxlbT5GaWVsZCBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWVsZElEID0gRklFTERfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmllbGROYW1lKCkgPGVtPkZpZWxkIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWVsZE5hbWUoKSA8ZW0+RmllbGQgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmllbGROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpZWxkTmFtZSA9IEZJRUxEX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxpYXMoKSA8ZW0+QWxpYXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGlhcygpIDxlbT5BbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWxpYXMgPSBBTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaG9uZXRpY0FsaWFzKCkgPGVtPlBob25ldGljIEFsaWFzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaG9uZXRpY0FsaWFzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljQWxpYXMgPSBQSE9ORVRJQ19BTElBU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlcygpIDxlbT5WYWx1ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlcyB2YWx1ZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRW50ZXJwcmlzZSgpIDxlbT5FbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VudGVycHJpc2UoKSA8ZW0+RW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFbnRlcnByaXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbnRlcnByaXNlID0gRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpIDxlbT5FbnRlcnByaXNlIE91dGxpbmUgQ29kZSBBbGlhczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzID0gRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSA8ZW0+UmVzb3VyY2UgU3Vic3RpdHV0aW9uIEVuYWJsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPGVtPlJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlc291cmNlIFN1YnN0aXR1dGlvbiBFbmFibGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMZWFmT25seSgpIDxlbT5MZWFmIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGVhZk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRUFGX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGVhZk9ubHkoKSA8ZW0+TGVhZiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xlYWZPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGVhZiBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZWFmT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FsbExldmVsc1JlcXVpcmVkKCkgPGVtPkFsbCBMZXZlbHMgUmVxdWlyZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWxsTGV2ZWxzUmVxdWlyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFsbExldmVsc1JlcXVpcmVkID0gQUxMX0xFVkVMU19SRVFVSVJFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQWxsIExldmVscyBSZXF1aXJlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgPGVtPk9ubHkgVGFibGUgVmFsdWVzIEFsbG93ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpIDxlbT5Pbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc09ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBPTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPbmx5IFRhYmxlIFZhbHVlcyBBbGxvd2VkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFza3MoKSA8ZW0+TWFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFza3MgbWFza3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGxpbmVDb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZElEKCkgewotCQlyZXR1cm4gZmllbGRJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWVsZElEKFN0cmluZyBuZXdGaWVsZElEKSB7Ci0JCVN0cmluZyBvbGRGaWVsZElEID0gZmllbGRJRDsKLQkJZmllbGRJRCA9IG5ld0ZpZWxkSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRCwgb2xkRmllbGRJRCwgZmllbGRJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgewotCQlyZXR1cm4gZmllbGROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpZWxkTmFtZShTdHJpbmcgbmV3RmllbGROYW1lKSB7Ci0JCVN0cmluZyBvbGRGaWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0JCWZpZWxkTmFtZSA9IG5ld0ZpZWxkTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUUsIG9sZEZpZWxkTmFtZSwgZmllbGROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGlhcygpIHsKLQkJcmV0dXJuIGFsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsaWFzKFN0cmluZyBuZXdBbGlhcykgewotCQlTdHJpbmcgb2xkQWxpYXMgPSBhbGlhczsKLQkJYWxpYXMgPSBuZXdBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMSUFTLCBvbGRBbGlhcywgYWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBob25ldGljQWxpYXMoKSB7Ci0JCXJldHVybiBwaG9uZXRpY0FsaWFzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljQWxpYXMoU3RyaW5nIG5ld1Bob25ldGljQWxpYXMpIHsKLQkJU3RyaW5nIG9sZFBob25ldGljQWxpYXMgPSBwaG9uZXRpY0FsaWFzOwotCQlwaG9uZXRpY0FsaWFzID0gbmV3UGhvbmV0aWNBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTLCBvbGRQaG9uZXRpY0FsaWFzLCBwaG9uZXRpY0FsaWFzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhbHVlcyBnZXRWYWx1ZXMoKSB7Ci0JCXJldHVybiB2YWx1ZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJVmFsdWVzIG9sZFZhbHVlcyA9IHZhbHVlczsKLQkJdmFsdWVzID0gbmV3VmFsdWVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBvbGRWYWx1ZXMsIG5ld1ZhbHVlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKFZhbHVlcyBuZXdWYWx1ZXMpIHsKLQkJaWYgKG5ld1ZhbHVlcyAhPSB2YWx1ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZXMobmV3VmFsdWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVMsIG5ld1ZhbHVlcywgbmV3VmFsdWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlKGJvb2xlYW4gbmV3RW50ZXJwcmlzZSkgewotCQlib29sZWFuIG9sZEVudGVycHJpc2UgPSBlbnRlcnByaXNlOwotCQllbnRlcnByaXNlID0gbmV3RW50ZXJwcmlzZTsKLQkJYm9vbGVhbiBvbGRFbnRlcnByaXNlRVNldCA9IGVudGVycHJpc2VFU2V0OwotCQllbnRlcnByaXNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFLCBvbGRFbnRlcnByaXNlLCBlbnRlcnByaXNlLCAhb2xkRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGVycHJpc2UoKSB7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZSA9IGVudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkRW50ZXJwcmlzZUVTZXQgPSBlbnRlcnByaXNlRVNldDsKLQkJZW50ZXJwcmlzZSA9IEVOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWVudGVycHJpc2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0UsIG9sZEVudGVycHJpc2UsIEVOVEVSUFJJU0VfRURFRkFVTFQsIG9sZEVudGVycHJpc2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFbnRlcnByaXNlKCkgewotCQlyZXR1cm4gZW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoKSB7Ci0JCXJldHVybiBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyhCaWdJbnRlZ2VyIG5ld0VudGVycHJpc2VPdXRsaW5lQ29kZUFsaWFzKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgPSBuZXdFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTLCBvbGRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcywgZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoYm9vbGVhbiBuZXdSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQpIHsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQ7Ci0JCXJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCA9IG5ld1Jlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDsKLQkJYm9vbGVhbiBvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0ID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQsICFvbGRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkID0gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkOwotCQlib29sZWFuIG9sZFJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZEVTZXQgPSByZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0OwotCQlyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWQgPSBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVDsKLQkJcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19SRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkLCBSRVNPVVJDRV9TVUJTVElUVVRJT05fRU5BQkxFRF9FREVGQVVMVCwgb2xkUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgewotCQlyZXR1cm4gcmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xlYWZPbmx5KCkgewotCQlyZXR1cm4gbGVhZk9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVhZk9ubHkoYm9vbGVhbiBuZXdMZWFmT25seSkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWxlYWZPbmx5ID0gbmV3TGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZLCBvbGRMZWFmT25seSwgbGVhZk9ubHksICFvbGRMZWFmT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExlYWZPbmx5KCkgewotCQlib29sZWFuIG9sZExlYWZPbmx5ID0gbGVhZk9ubHk7Ci0JCWJvb2xlYW4gb2xkTGVhZk9ubHlFU2V0ID0gbGVhZk9ubHlFU2V0OwotCQlsZWFmT25seSA9IExFQUZfT05MWV9FREVGQVVMVDsKLQkJbGVhZk9ubHlFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWSwgb2xkTGVhZk9ubHksIExFQUZfT05MWV9FREVGQVVMVCwgb2xkTGVhZk9ubHlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZWFmT25seSgpIHsKLQkJcmV0dXJuIGxlYWZPbmx5RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbExldmVsc1JlcXVpcmVkKCkgewotCQlyZXR1cm4gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWxsTGV2ZWxzUmVxdWlyZWQoYm9vbGVhbiBuZXdBbGxMZXZlbHNSZXF1aXJlZCkgewotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkID0gYWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWFsbExldmVsc1JlcXVpcmVkID0gbmV3QWxsTGV2ZWxzUmVxdWlyZWQ7Ci0JCWJvb2xlYW4gb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0ID0gYWxsTGV2ZWxzUmVxdWlyZWRFU2V0OwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIGFsbExldmVsc1JlcXVpcmVkLCAhb2xkQWxsTGV2ZWxzUmVxdWlyZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBbGxMZXZlbHNSZXF1aXJlZCgpIHsKLQkJYm9vbGVhbiBvbGRBbGxMZXZlbHNSZXF1aXJlZCA9IGFsbExldmVsc1JlcXVpcmVkOwotCQlib29sZWFuIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCA9IGFsbExldmVsc1JlcXVpcmVkRVNldDsKLQkJYWxsTGV2ZWxzUmVxdWlyZWQgPSBBTExfTEVWRUxTX1JFUVVJUkVEX0VERUZBVUxUOwotCQlhbGxMZXZlbHNSZXF1aXJlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRCwgb2xkQWxsTGV2ZWxzUmVxdWlyZWQsIEFMTF9MRVZFTFNfUkVRVUlSRURfRURFRkFVTFQsIG9sZEFsbExldmVsc1JlcXVpcmVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBhbGxMZXZlbHNSZXF1aXJlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKGJvb2xlYW4gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZCkgewotCQlib29sZWFuIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkOwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkID0gbmV3T25seVRhYmxlVmFsdWVzQWxsb3dlZDsKLQkJYm9vbGVhbiBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0OwotCQlvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VELCBvbGRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkLCAhb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ7Ci0JCWJvb2xlYW4gb2xkT25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQgPSBvbmx5VGFibGVWYWx1ZXNBbGxvd2VkRVNldDsKLQkJb25seVRhYmxlVmFsdWVzQWxsb3dlZCA9IE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQ7Ci0JCW9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWQsIE9OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRURfRURFRkFVTFQsIG9sZE9ubHlUYWJsZVZhbHVlc0FsbG93ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRPbmx5VGFibGVWYWx1ZXNBbGxvd2VkKCkgewotCQlyZXR1cm4gb25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1hc2tzIGdldE1hc2tzKCkgewotCQlyZXR1cm4gbWFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFza3MoTWFza3MgbmV3TWFza3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJTWFza3Mgb2xkTWFza3MgPSBtYXNrczsKLQkJbWFza3MgPSBuZXdNYXNrczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBvbGRNYXNrcywgbmV3TWFza3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hc2tzKE1hc2tzIG5ld01hc2tzKSB7Ci0JCWlmIChuZXdNYXNrcyAhPSBtYXNrcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFza3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFza3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hc2tzKG5ld01hc2tzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUywgbmV3TWFza3MsIG5ld01hc2tzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJCXJldHVybiBiYXNpY1NldE1hc2tzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfSUQ6Ci0JCQkJcmV0dXJuIGdldEZpZWxkSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpZWxkTmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJcmV0dXJuIGdldEFsaWFzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19QSE9ORVRJQ19BTElBUzoKLQkJCQlyZXR1cm4gZ2V0UGhvbmV0aWNBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXJldHVybiBnZXRWYWx1ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJcmV0dXJuIGlzRW50ZXJwcmlzZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBnZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXJldHVybiBpc0xlYWZPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxMX0xFVkVMU19SRVFVSVJFRDoKLQkJCQlyZXR1cm4gaXNBbGxMZXZlbHNSZXF1aXJlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzT25seVRhYmxlVmFsdWVzQWxsb3dlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXJldHVybiBnZXRNYXNrcygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXNldEZpZWxkSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRklFTERfTkFNRToKLQkJCQlzZXRGaWVsZE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fQUxJQVM6Ci0JCQkJc2V0QWxpYXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19WQUxVRVM6Ci0JCQkJc2V0VmFsdWVzKChWYWx1ZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJc2V0RW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBUzoKLQkJCQlzZXRFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0xFQUZfT05MWToKLQkJCQlzZXRMZWFmT25seSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXNldEFsbExldmVsc1JlcXVpcmVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19NQVNLUzoKLQkJCQlzZXRNYXNrcygoTWFza3MpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9JRDoKLQkJCQlzZXRGaWVsZElEKEZJRUxEX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19GSUVMRF9OQU1FOgotCQkJCXNldEZpZWxkTmFtZShGSUVMRF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlzZXRBbGlhcyhBTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUEhPTkVUSUNfQUxJQVM6Ci0JCQkJc2V0UGhvbmV0aWNBbGlhcyhQSE9ORVRJQ19BTElBU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fVkFMVUVTOgotCQkJCXNldFZhbHVlcygoVmFsdWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0U6Ci0JCQkJdW5zZXRFbnRlcnByaXNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVM6Ci0JCQkJc2V0RW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMoRU5URVJQUklTRV9PVVRMSU5FX0NPREVfQUxJQVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1JFU09VUkNFX1NVQlNUSVRVVElPTl9FTkFCTEVEOgotCQkJCXVuc2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTEVBRl9PTkxZOgotCQkJCXVuc2V0TGVhZk9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTExfTEVWRUxTX1JFUVVJUkVEOgotCQkJCXVuc2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19PTkxZX1RBQkxFX1ZBTFVFU19BTExPV0VEOgotCQkJCXVuc2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX01BU0tTOgotCQkJCXNldE1hc2tzKChNYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX0lEOgotCQkJCXJldHVybiBGSUVMRF9JRF9FREVGQVVMVCA9PSBudWxsID8gZmllbGRJRCAhPSBudWxsIDogIUZJRUxEX0lEX0VERUZBVUxULmVxdWFscyhmaWVsZElEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0ZJRUxEX05BTUU6Ci0JCQkJcmV0dXJuIEZJRUxEX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGZpZWxkTmFtZSAhPSBudWxsIDogIUZJRUxEX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpZWxkTmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19BTElBUzoKLQkJCQlyZXR1cm4gQUxJQVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsaWFzICE9IG51bGwgOiAhQUxJQVNfRURFRkFVTFQuZXF1YWxzKGFsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1BIT05FVElDX0FMSUFTOgotCQkJCXJldHVybiBQSE9ORVRJQ19BTElBU19FREVGQVVMVCA9PSBudWxsID8gcGhvbmV0aWNBbGlhcyAhPSBudWxsIDogIVBIT05FVElDX0FMSUFTX0VERUZBVUxULmVxdWFscyhwaG9uZXRpY0FsaWFzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX1ZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsdWVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19FTlRFUlBSSVNFOgotCQkJCXJldHVybiBpc1NldEVudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0VOVEVSUFJJU0VfT1VUTElORV9DT0RFX0FMSUFTOgotCQkJCXJldHVybiBFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVCA9PSBudWxsID8gZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMgIT0gbnVsbCA6ICFFTlRFUlBSSVNFX09VVExJTkVfQ09ERV9BTElBU19FREVGQVVMVC5lcXVhbHMoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fUkVTT1VSQ0VfU1VCU1RJVFVUSU9OX0VOQUJMRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0UmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFX19MRUFGX09OTFk6Ci0JCQkJcmV0dXJuIGlzU2V0TGVhZk9ubHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX0FMTF9MRVZFTFNfUkVRVUlSRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0QWxsTGV2ZWxzUmVxdWlyZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVfX09OTFlfVEFCTEVfVkFMVUVTX0FMTE9XRUQ6Ci0JCQkJcmV0dXJuIGlzU2V0T25seVRhYmxlVmFsdWVzQWxsb3dlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERV9fTUFTS1M6Ci0JCQkJcmV0dXJuIG1hc2tzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWVsZElEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaWVsZElEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaWVsZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxpYXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwaG9uZXRpY0FsaWFzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY0FsaWFzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlOiAiKTsKLQkJaWYgKGVudGVycHJpc2VFU2V0KSByZXN1bHQuYXBwZW5kKGVudGVycHJpc2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZDogIik7Ci0JCWlmIChyZXNvdXJjZVN1YnN0aXR1dGlvbkVuYWJsZWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxlYWZPbmx5OiAiKTsKLQkJaWYgKGxlYWZPbmx5RVNldCkgcmVzdWx0LmFwcGVuZChsZWFmT25seSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsbExldmVsc1JlcXVpcmVkOiAiKTsKLQkJaWYgKGFsbExldmVsc1JlcXVpcmVkRVNldCkgcmVzdWx0LmFwcGVuZChhbGxMZXZlbHNSZXF1aXJlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9ubHlUYWJsZVZhbHVlc0FsbG93ZWQ6ICIpOwotCQlpZiAob25seVRhYmxlVmFsdWVzQWxsb3dlZEVTZXQpIHJlc3VsdC5hcHBlbmQob25seVRhYmxlVmFsdWVzQWxsb3dlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvT3V0bGluZUNvZGVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNkM2M3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9PdXRsaW5lQ29kZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRsaW5lQ29kZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PdXRsaW5lIENvZGVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuT3V0bGluZUNvZGVzSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3V0bGluZUNvZGVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgT3V0bGluZUNvZGVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0bGluZUNvZGVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVDb2RlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRPdXRsaW5lQ29kZSgpIHsKLQkJaWYgKG91dGxpbmVDb2RlID09IG51bGwpIHsKLQkJCW91dGxpbmVDb2RlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KE91dGxpbmVDb2RlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFU19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTX19PVVRMSU5FX0NPREU6Ci0JCQkJZ2V0T3V0bGluZUNvZGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVNfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGUgIT0gbnVsbCAmJiAhb3V0bGluZUNvZGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9PdXRsaW5lQ29kZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ByZWRlY2Vzc29yTGlua0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2YTM5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJlZGVjZXNzb3JMaW5rSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlZGVjZXNzb3IgTGluazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0UHJlZGVjZXNzb3JVSUQgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjaXNDcm9zc1Byb2plY3QgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldENyb3NzUHJvamVjdE5hbWUgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByZWRlY2Vzc29yTGlua0ltcGwjZ2V0TGlua0xhZyA8ZW0+TGluayBMYWc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5QcmVkZWNlc3NvckxpbmtJbXBsI2dldExhZ0Zvcm1hdCA8ZW0+TGFnIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByZWRlY2Vzc29yTGlua0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFByZWRlY2Vzc29yTGluayB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yVUlEKCkgPGVtPlByZWRlY2Vzc29yIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3JVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3JVSUQoKSA8ZW0+UHJlZGVjZXNzb3IgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgcHJlZGVjZXNzb3JVSUQgPSBQUkVERUNFU1NPUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3Jvc3NQcm9qZWN0KCkgPGVtPkNyb3NzIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3Jvc3NQcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcm9zc1Byb2plY3QoKSA8ZW0+Q3Jvc3MgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcm9zc1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENyb3NzIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcm9zc1Byb2plY3ROYW1lKCkgPGVtPkNyb3NzIFByb2plY3QgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyb3NzUHJvamVjdE5hbWUoKSA8ZW0+Q3Jvc3MgUHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcm9zc1Byb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyb3NzUHJvamVjdE5hbWUgPSBDUk9TU19QUk9KRUNUX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGlua0xhZygpIDxlbT5MaW5rIExhZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua0xhZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIExJTktfTEFHX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtMYWcoKSA8ZW0+TGluayBMYWc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtMYWcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxpbmtMYWcgPSBMSU5LX0xBR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEFHX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYWdGb3JtYXQoKSA8ZW0+TGFnIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFnRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsYWdGb3JtYXQgPSBMQUdfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZWRlY2Vzc29yTGlua0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVkZWNlc3NvckxpbmsoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQcmVkZWNlc3NvclVJRCgpIHsKLQkJcmV0dXJuIHByZWRlY2Vzc29yVUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWRlY2Vzc29yVUlEKEJpZ0ludGVnZXIgbmV3UHJlZGVjZXNzb3JVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRQcmVkZWNlc3NvclVJRCA9IHByZWRlY2Vzc29yVUlEOwotCQlwcmVkZWNlc3NvclVJRCA9IG5ld1ByZWRlY2Vzc29yVUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRCwgb2xkUHJlZGVjZXNzb3JVSUQsIHByZWRlY2Vzc29yVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdChib29sZWFuIG5ld0Nyb3NzUHJvamVjdCkgewotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdCA9IGNyb3NzUHJvamVjdDsKLQkJY3Jvc3NQcm9qZWN0ID0gbmV3Q3Jvc3NQcm9qZWN0OwotCQlib29sZWFuIG9sZENyb3NzUHJvamVjdEVTZXQgPSBjcm9zc1Byb2plY3RFU2V0OwotCQljcm9zc1Byb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNULCBvbGRDcm9zc1Byb2plY3QsIGNyb3NzUHJvamVjdCwgIW9sZENyb3NzUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldENyb3NzUHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRDcm9zc1Byb2plY3QgPSBjcm9zc1Byb2plY3Q7Ci0JCWJvb2xlYW4gb2xkQ3Jvc3NQcm9qZWN0RVNldCA9IGNyb3NzUHJvamVjdEVTZXQ7Ci0JCWNyb3NzUHJvamVjdCA9IENST1NTX1BST0pFQ1RfRURFRkFVTFQ7Ci0JCWNyb3NzUHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1QsIG9sZENyb3NzUHJvamVjdCwgQ1JPU1NfUFJPSkVDVF9FREVGQVVMVCwgb2xkQ3Jvc3NQcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q3Jvc3NQcm9qZWN0KCkgewotCQlyZXR1cm4gY3Jvc3NQcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyb3NzUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiBjcm9zc1Byb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyb3NzUHJvamVjdE5hbWUoU3RyaW5nIG5ld0Nyb3NzUHJvamVjdE5hbWUpIHsKLQkJU3RyaW5nIG9sZENyb3NzUHJvamVjdE5hbWUgPSBjcm9zc1Byb2plY3ROYW1lOwotCQljcm9zc1Byb2plY3ROYW1lID0gbmV3Q3Jvc3NQcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUUsIG9sZENyb3NzUHJvamVjdE5hbWUsIGNyb3NzUHJvamVjdE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRMaW5rTGFnKCkgewotCQlyZXR1cm4gbGlua0xhZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaW5rTGFnKEJpZ0ludGVnZXIgbmV3TGlua0xhZykgewotCQlCaWdJbnRlZ2VyIG9sZExpbmtMYWcgPSBsaW5rTGFnOwotCQlsaW5rTGFnID0gbmV3TGlua0xhZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRywgb2xkTGlua0xhZywgbGlua0xhZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExhZ0Zvcm1hdCgpIHsKLQkJcmV0dXJuIGxhZ0Zvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWdGb3JtYXQoQmlnSW50ZWdlciBuZXdMYWdGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMYWdGb3JtYXQgPSBsYWdGb3JtYXQ7Ci0JCWxhZ0Zvcm1hdCA9IG5ld0xhZ0Zvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MQUdfRk9STUFULCBvbGRMYWdGb3JtYXQsIGxhZ0Zvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19QUkVERUNFU1NPUl9VSUQ6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yVUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQ3Jvc3NQcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q3Jvc3NQcm9qZWN0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xJTktfTEFHOgotCQkJCXJldHVybiBnZXRMaW5rTGFnKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0TGFnRm9ybWF0KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUX05BTUU6Ci0JCQkJc2V0Q3Jvc3NQcm9qZWN0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlzZXRQcmVkZWNlc3NvclVJRChQUkVERUNFU1NPUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1Q6Ci0JCQkJdW5zZXRDcm9zc1Byb2plY3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fQ1JPU1NfUFJPSkVDVF9OQU1FOgotCQkJCXNldENyb3NzUHJvamVjdE5hbWUoQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTElOS19MQUc6Ci0JCQkJc2V0TGlua0xhZyhMSU5LX0xBR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0xBR19GT1JNQVQ6Ci0JCQkJc2V0TGFnRm9ybWF0KExBR19GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1BSRURFQ0VTU09SX1VJRDoKLQkJCQlyZXR1cm4gUFJFREVDRVNTT1JfVUlEX0VERUZBVUxUID09IG51bGwgPyBwcmVkZWNlc3NvclVJRCAhPSBudWxsIDogIVBSRURFQ0VTU09SX1VJRF9FREVGQVVMVC5lcXVhbHMocHJlZGVjZXNzb3JVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19DUk9TU19QUk9KRUNUOgotCQkJCXJldHVybiBpc1NldENyb3NzUHJvamVjdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRURFQ0VTU09SX0xJTktfX0NST1NTX1BST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBjcm9zc1Byb2plY3ROYW1lICE9IG51bGwgOiAhQ1JPU1NfUFJPSkVDVF9OQU1FX0VERUZBVUxULmVxdWFscyhjcm9zc1Byb2plY3ROYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LX19MSU5LX0xBRzoKLQkJCQlyZXR1cm4gTElOS19MQUdfRURFRkFVTFQgPT0gbnVsbCA/IGxpbmtMYWcgIT0gbnVsbCA6ICFMSU5LX0xBR19FREVGQVVMVC5lcXVhbHMobGlua0xhZyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJFREVDRVNTT1JfTElOS19fTEFHX0ZPUk1BVDoKLQkJCQlyZXR1cm4gTEFHX0ZPUk1BVF9FREVGQVVMVCA9PSBudWxsID8gbGFnRm9ybWF0ICE9IG51bGwgOiAhTEFHX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMobGFnRm9ybWF0KTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZWRlY2Vzc29yVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVkZWNlc3NvclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0OiAiKTsKLQkJaWYgKGNyb3NzUHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3Jvc3NQcm9qZWN0TmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3Jvc3NQcm9qZWN0TmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGlua0xhZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGlua0xhZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGFnRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYWdGb3JtYXQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9QcmVkZWNlc3NvckxpbmtJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUHJvamVjdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY0ZDA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Qcm9qZWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2plY3RJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2tzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9qZWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGl0bGUgPGVtPlRpdGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3ViamVjdCA8ZW0+U3ViamVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhdGVnb3J5IDxlbT5DYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENvbXBhbnkgPGVtPkNvbXBhbnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRNYW5hZ2VyIDxlbT5NYW5hZ2VyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0QXV0aG9yIDxlbT5BdXRob3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDcmVhdGlvbkRhdGUgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRSZXZpc2lvbiA8ZW0+UmV2aXNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRMYXN0U2F2ZWQgPGVtPkxhc3QgU2F2ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NjaGVkdWxlRnJvbVN0YXJ0IDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRGWVN0YXJ0RGF0ZSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENyaXRpY2FsU2xhY2tMaW1pdCA8ZW0+Q3JpdGljYWwgU2xhY2sgTGltaXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW5jeURpZ2l0cyA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0Q3VycmVuY3lTeW1ib2wgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPGVtPkN1cnJlbmN5IFN5bWJvbCBQb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhcnRUaW1lIDxlbT5EZWZhdWx0IFN0YXJ0IFRpbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0RmluaXNoVGltZSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJEYXkgPGVtPk1pbnV0ZXMgUGVyIERheTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldE1pbnV0ZXNQZXJXZWVrIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGF5c1Blck1vbnRoIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldERlZmF1bHRUYXNrVHlwZSA8ZW0+RGVmYXVsdCBUYXNrIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0U3RhbmRhcmRSYXRlIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXREdXJhdGlvbkZvcm1hdCA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V29ya0Zvcm1hdCA8ZW0+V29yayBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc0VkaXRhYmxlQWN0dWFsQ29zdHMgPGVtPkVkaXRhYmxlIEFjdHVhbCBDb3N0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSG9ub3JDb25zdHJhaW50cyA8ZW0+SG9ub3IgQ29uc3RyYWludHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFYXJuZWRWYWx1ZU1ldGhvZCA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5IDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc011bHRpcGxlQ3JpdGljYWxQYXRocyA8ZW0+TXVsdGlwbGUgQ3JpdGljYWwgUGF0aHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuIDxlbT5OZXcgVGFza3MgRWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTmV3VGFza3NFc3RpbWF0ZWQgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcyA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNTcHJlYWRBY3R1YWxDb3N0IDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UgPGVtPlRhc2sgVXBkYXRlcyBSZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzRmlzY2FsWWVhclN0YXJ0IDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldFdlZWtTdGFydERheSA8ZW0+V2VlayBTdGFydCBEYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVDb21wbGV0ZWRFbmRzQmFjayA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA8ZW0+TW92ZSBSZW1haW5pbmcgU3RhcnRzIEJhY2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIDxlbT5Nb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlIDxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPGVtPkF1dG8gQWRkIE5ldyBSZXNvdXJjZXMgQW5kIFRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0U3RhdHVzRGF0ZSA8ZW0+U3RhdHVzIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRDdXJyZW50RGF0ZSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMIDxlbT5NaWNyb3NvZnQgUHJvamVjdCBTZXJ2ZXIgVVJMPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNBdXRvbGluayA8ZW0+QXV0b2xpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXROZXdUYXNrU3RhcnREYXRlIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRFeHRlbmRlZENyZWF0aW9uRGF0ZSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWN0dWFsc0luU3luYyA8ZW0+QWN0dWFscyBJbiBTeW5jPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjaXNSZW1vdmVGaWxlUHJvcGVydGllcyA8ZW0+UmVtb3ZlIEZpbGUgUHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2lzQWRtaW5Qcm9qZWN0IDxlbT5BZG1pbiBQcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0T3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0V0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlcyA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlByb2plY3RJbXBsI2dldENhbGVuZGFycyA8ZW0+Q2FsZW5kYXJzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUHJvamVjdEltcGwjZ2V0UmVzb3VyY2VzIDxlbT5SZXNvdXJjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5Qcm9qZWN0SW1wbCNnZXRBc3NpZ25tZW50cyA8ZW0+QXNzaWdubWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUHJvamVjdCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1SUQgPSBVSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUaXRsZSgpIDxlbT5UaXRsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGl0bGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpdGxlKCkgPGVtPlRpdGxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaXRsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZSA9IFRJVExFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmplY3QoKSA8ZW0+U3ViamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJqZWN0KCkgPGVtPlN1YmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3ViamVjdCA9IFNVQkpFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcnkoKSA8ZW0+Q2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRlZ29yeSgpIDxlbT5DYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2F0ZWdvcnkgPSBDQVRFR09SWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21wYW55KCkgPGVtPkNvbXBhbnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbXBhbnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBTllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tcGFueSgpIDxlbT5Db21wYW55PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21wYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXBhbnkgPSBDT01QQU5ZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbmFnZXIoKSA8ZW0+TWFuYWdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFuYWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYW5hZ2VyKCkgPGVtPk1hbmFnZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmFnZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFuYWdlciA9IE1BTkFHRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yKCkgPGVtPkF1dGhvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF1dGhvciA9IEFVVEhPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvbkRhdGUoKSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDUkVBVElPTl9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRpb25EYXRlID0gQ1JFQVRJT05fREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSRVZJU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXZpc2lvbigpIDxlbT5SZXZpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV2aXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJldmlzaW9uID0gUkVWSVNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGFzdFNhdmVkKCkgPGVtPkxhc3QgU2F2ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhc3RTYXZlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgTEFTVF9TQVZFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMYXN0U2F2ZWQoKSA8ZW0+TGFzdCBTYXZlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGFzdFNhdmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGxhc3RTYXZlZCA9IExBU1RfU0FWRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTY2hlZHVsZUZyb21TdGFydCgpIDxlbT5TY2hlZHVsZSBGcm9tIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NjaGVkdWxlRnJvbVN0YXJ0KCkgPGVtPlNjaGVkdWxlIEZyb20gU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2NoZWR1bGVGcm9tU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNjaGVkdWxlRnJvbVN0YXJ0ID0gU0NIRURVTEVfRlJPTV9TVEFSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU2NoZWR1bGUgRnJvbSBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydERhdGUoKSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgRklOSVNIX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmaW5pc2hEYXRlID0gRklOSVNIX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBGWVNUQVJUX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RllTdGFydERhdGUoKSA8ZW0+RlkgU3RhcnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RllTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGZZU3RhcnREYXRlID0gRllTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRpY2FsU2xhY2tMaW1pdCgpIDxlbT5Dcml0aWNhbCBTbGFjayBMaW1pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgPGVtPkNyaXRpY2FsIFNsYWNrIExpbWl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0aWNhbFNsYWNrTGltaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNyaXRpY2FsU2xhY2tMaW1pdCA9IENSSVRJQ0FMX1NMQUNLX0xJTUlUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5RGlnaXRzKCkgPGVtPkN1cnJlbmN5IERpZ2l0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lEaWdpdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lEaWdpdHMoKSA8ZW0+Q3VycmVuY3kgRGlnaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeURpZ2l0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY3VycmVuY3lEaWdpdHMgPSBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2woKSA8ZW0+Q3VycmVuY3kgU3ltYm9sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW5jeVN5bWJvbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1cnJlbmN5U3ltYm9sKCkgPGVtPkN1cnJlbmN5IFN5bWJvbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3VycmVuY3lTeW1ib2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3VycmVuY3lTeW1ib2wgPSBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIDxlbT5DdXJyZW5jeSBTeW1ib2wgUG9zaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gPSBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIENBTEVOREFSX1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhclVJRCgpIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhbGVuZGFyVUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBjYWxlbmRhclVJRCA9IENBTEVOREFSX1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhcnRUaW1lKCkgPGVtPkRlZmF1bHQgU3RhcnQgVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YXJ0VGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRTdGFydFRpbWUoKSA8ZW0+RGVmYXVsdCBTdGFydCBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0U3RhcnRUaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGRlZmF1bHRTdGFydFRpbWUgPSBERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSA8ZW0+RGVmYXVsdCBGaW5pc2ggVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVmYXVsdEZpbmlzaFRpbWUgPSBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfREFZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJEYXkoKSA8ZW0+TWludXRlcyBQZXIgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBtaW51dGVzUGVyRGF5ID0gTUlOVVRFU19QRVJfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZXNQZXJXZWVrKCkgPGVtPk1pbnV0ZXMgUGVyIFdlZWs8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZXNQZXJXZWVrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaW51dGVzUGVyV2VlaygpIDxlbT5NaW51dGVzIFBlciBXZWVrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW51dGVzUGVyV2VlaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgbWludXRlc1BlcldlZWsgPSBNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERheXNQZXJNb250aCgpIDxlbT5EYXlzIFBlciBNb250aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5c1Blck1vbnRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZU19QRVJfTU9OVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5c1Blck1vbnRoKCkgPGVtPkRheXMgUGVyIE1vbnRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlzUGVyTW9udGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRheXNQZXJNb250aCA9IERBWVNfUEVSX01PTlRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrVHlwZSgpIDxlbT5EZWZhdWx0IFRhc2sgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQgPSBuZXcgQmlnSW50ZWdlcigiMSIpOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tUeXBlKCkgPGVtPkRlZmF1bHQgVGFzayBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZSA9IERFRkFVTFRfVEFTS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFRhc2sgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkRlZmF1bHQgRml4ZWQgQ29zdCBBY2NydWFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgPGVtPkRlZmF1bHQgU3RhbmRhcmQgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpIDxlbT5EZWZhdWx0IFN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBEZWZhdWx0IFN0YW5kYXJkIFJhdGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpIDxlbT5EZWZhdWx0IE92ZXJ0aW1lIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRPdmVydGltZVJhdGUoKSA8ZW0+RGVmYXVsdCBPdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IERFRkFVTFRfT1ZFUlRJTUVfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRGVmYXVsdCBPdmVydGltZSBSYXRlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya0Zvcm1hdCgpIDxlbT5Xb3JrIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya0Zvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFdPUktfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtGb3JtYXQoKSA8ZW0+V29yayBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtGb3JtYXQgPSBXT1JLX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKSA8ZW0+RWRpdGFibGUgQWN0dWFsIENvc3RzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VkaXRhYmxlQWN0dWFsQ29zdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFRElUQUJMRV9BQ1RVQUxfQ09TVFNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpIDxlbT5FZGl0YWJsZSBBY3R1YWwgQ29zdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWRpdGFibGVBY3R1YWxDb3N0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgRWRpdGFibGUgQWN0dWFsIENvc3RzIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSG9ub3JDb25zdHJhaW50cygpIDxlbT5Ib25vciBDb25zdHJhaW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIb25vckNvbnN0cmFpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSE9OT1JfQ09OU1RSQUlOVFNfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIb25vckNvbnN0cmFpbnRzKCkgPGVtPkhvbm9yIENvbnN0cmFpbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hvbm9yQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHMgPSBIT05PUl9DT05TVFJBSU5UU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSG9ub3IgQ29uc3RyYWludHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhvbm9yQ29uc3RyYWludHNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcm5lZFZhbHVlTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZCA9IEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSA8ZW0+SW5zZXJ0ZWQgUHJvamVjdHMgTGlrZSBTdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWV9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIDxlbT5JbnNlcnRlZCBQcm9qZWN0cyBMaWtlIFN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEluc2VydGVkIFByb2plY3RzIExpa2UgU3VtbWFyeSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgPGVtPk11bHRpcGxlIENyaXRpY2FsIFBhdGhzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc011bHRpcGxlQ3JpdGljYWxQYXRocygpIDxlbT5NdWx0aXBsZSBDcml0aWNhbCBQYXRoczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNdWx0aXBsZSBDcml0aWNhbCBQYXRocyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA8ZW0+TmV3IFRhc2tzIEVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFZmZvcnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVdfVEFTS1NfRUZGT1JUX0RSSVZFTl9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgPGVtPk5ldyBUYXNrcyBFZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBOZXcgVGFza3MgRWZmb3J0IERyaXZlbiBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOZXdUYXNrc0VzdGltYXRlZCgpIDxlbT5OZXcgVGFza3MgRXN0aW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05ld1Rhc2tzRXN0aW1hdGVkKCkgPGVtPk5ldyBUYXNrcyBFc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTmV3VGFza3NFc3RpbWF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5ld1Rhc2tzRXN0aW1hdGVkID0gTkVXX1RBU0tTX0VTVElNQVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTmV3IFRhc2tzIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSA8ZW0+U3BsaXRzIEluIFByb2dyZXNzIFRhc2tzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQTElUU19JTl9QUk9HUkVTU19UQVNLU19FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIDxlbT5TcGxpdHMgSW4gUHJvZ3Jlc3MgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwbGl0cyBJbiBQcm9ncmVzcyBUYXNrcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3ByZWFkQWN0dWFsQ29zdCgpIDxlbT5TcHJlYWQgQWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkQWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVCA9IHRydWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZEFjdHVhbENvc3QoKSA8ZW0+U3ByZWFkIEFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NwcmVhZEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZEFjdHVhbENvc3QgPSBTUFJFQURfQUNUVUFMX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNwcmVhZCBBY3R1YWwgQ29zdCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5TcHJlYWQgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTcHJlYWRQZXJjZW50Q29tcGxldGUoKSA8ZW0+U3ByZWFkIFBlcmNlbnQgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgU3ByZWFkIFBlcmNlbnQgQ29tcGxldGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKSA8ZW0+VGFzayBVcGRhdGVzIFJlc291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Rhc2tVcGRhdGVzUmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUQVNLX1VQREFURVNfUkVTT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpIDxlbT5UYXNrIFVwZGF0ZXMgUmVzb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVGFza1VwZGF0ZXNSZXNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVGFzayBVcGRhdGVzIFJlc291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmlzY2FsWWVhclN0YXJ0KCkgPGVtPkZpc2NhbCBZZWFyIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Zpc2NhbFllYXJTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Zpc2NhbFllYXJTdGFydCgpIDxlbT5GaXNjYWwgWWVhciBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNGaXNjYWxZZWFyU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGZpc2NhbFllYXJTdGFydCA9IEZJU0NBTF9ZRUFSX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXNjYWwgWWVhciBTdGFydCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdlZWtTdGFydERheSgpIDxlbT5XZWVrIFN0YXJ0IERheTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2Vla1N0YXJ0RGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgV0VFS19TVEFSVF9EQVlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2Vla1N0YXJ0RGF5KCkgPGVtPldlZWsgU3RhcnQgRGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXZWVrU3RhcnREYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdlZWtTdGFydERheSA9IFdFRUtfU1RBUlRfREFZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgPGVtPk1vdmUgQ29tcGxldGVkIEVuZHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IE1PVkVfQ09NUExFVEVEX0VORFNfQkFDS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTW92ZSBDb21wbGV0ZWQgRW5kcyBCYWNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBCYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNCYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjayA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgQmFjayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpIDxlbT5Nb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgPGVtPk1vdmUgUmVtYWluaW5nIFN0YXJ0cyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIFJlbWFpbmluZyBTdGFydHMgRm9yd2FyZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSA8ZW0+TW92ZSBDb21wbGV0ZWQgRW5kcyBGb3J3YXJkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNb3ZlIENvbXBsZXRlZCBFbmRzIEZvcndhcmQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCkgPGVtPkJhc2VsaW5lIEZvciBFYXJuZWQgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VsaW5lRm9yRWFybmVkVmFsdWUoKSA8ZW0+QmFzZWxpbmUgRm9yIEVhcm5lZCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSA8ZW0+QXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQXV0byBBZGQgTmV3IFJlc291cmNlcyBBbmQgVGFza3MgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFUVVNfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGF0dXNEYXRlKCkgPGVtPlN0YXR1cyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGF0dXNEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXR1c0RhdGUgPSBTVEFUVVNfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXJyZW50RGF0ZSgpIDxlbT5DdXJyZW50IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1cnJlbnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBDVVJSRU5UX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VycmVudERhdGUoKSA8ZW0+Q3VycmVudCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXJyZW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjdXJyZW50RGF0ZSA9IENVUlJFTlRfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc01pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSA8ZW0+TWljcm9zb2Z0IFByb2plY3QgU2VydmVyIFVSTDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgPGVtPk1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCA9IE1JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE1pY3Jvc29mdCBQcm9qZWN0IFNlcnZlciBVUkwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBdXRvbGluaygpIDxlbT5BdXRvbGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBdXRvbGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFVVE9MSU5LX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0F1dG9saW5rKCkgPGVtPkF1dG9saW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0F1dG9saW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBdXRvbGluayBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXV0b2xpbmtFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIDxlbT5OZXcgVGFzayBTdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROZXdUYXNrU3RhcnREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTkVXX1RBU0tfU1RBUlRfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROZXdUYXNrU3RhcnREYXRlKCkgPGVtPk5ldyBUYXNrIFN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5ld1Rhc2tTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGUgPSBORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRUYXNrRVZNZXRob2QoKSA8ZW0+RGVmYXVsdCBUYXNrIEVWIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpIDxlbT5EZWZhdWx0IFRhc2sgRVYgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VGFza0VWTWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kID0gREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgPGVtPlByb2plY3QgRXh0ZXJuYWxseSBFZGl0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUHJvamVjdCBFeHRlcm5hbGx5IEVkaXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKSA8ZW0+RXh0ZW5kZWQgQ3JlYXRpb24gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZXh0ZW5kZWRDcmVhdGlvbkRhdGUgPSBFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWN0dWFsc0luU3luYygpIDxlbT5BY3R1YWxzIEluIFN5bmM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWN0dWFsc0luU3luYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBY3R1YWxzSW5TeW5jKCkgPGVtPkFjdHVhbHMgSW4gU3luYzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBY3R1YWxzSW5TeW5jKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY3R1YWxzSW5TeW5jID0gQUNUVUFMU19JTl9TWU5DX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBY3R1YWxzIEluIFN5bmMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZW1vdmVGaWxlUHJvcGVydGllcygpIDxlbT5SZW1vdmUgRmlsZSBQcm9wZXJ0aWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVGaWxlUHJvcGVydGllcyA9IFJFTU9WRV9GSUxFX1BST1BFUlRJRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFJlbW92ZSBGaWxlIFByb3BlcnRpZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQWRtaW5Qcm9qZWN0KCkgPGVtPkFkbWluIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQWRtaW5Qcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQURNSU5fUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBZG1pblByb2plY3QoKSA8ZW0+QWRtaW4gUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNBZG1pblByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdCA9IEFETUlOX1BST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFkbWluIFByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFkbWluUHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlcygpIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2tzKCkgPGVtPldCUyBNYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXQlNNYXNrcyB3QlNNYXNrcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWxlbmRhcnMoKSA8ZW0+Q2FsZW5kYXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWxlbmRhcnMgY2FsZW5kYXJzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2tzKCkgPGVtPlRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tzIHRhc2tzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc291cmNlcygpIDxlbT5SZXNvdXJjZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc291cmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudHMoKSA8ZW0+QXNzaWdubWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc2lnbm1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXNzaWdubWVudHMgYXNzaWdubWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2plY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VUlEKCkgewotCQlyZXR1cm4gdUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVJRChTdHJpbmcgbmV3VUlEKSB7Ci0JCVN0cmluZyBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQsIG9sZFVJRCwgdUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZShTdHJpbmcgbmV3VGl0bGUpIHsKLQkJU3RyaW5nIG9sZFRpdGxlID0gdGl0bGU7Ci0JCXRpdGxlID0gbmV3VGl0bGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEUsIG9sZFRpdGxlLCB0aXRsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHN1YmplY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViamVjdChTdHJpbmcgbmV3U3ViamVjdCkgewotCQlTdHJpbmcgb2xkU3ViamVjdCA9IHN1YmplY3Q7Ci0JCXN1YmplY3QgPSBuZXdTdWJqZWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1QsIG9sZFN1YmplY3QsIHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGVnb3J5KCkgewotCQlyZXR1cm4gY2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnkoU3RyaW5nIG5ld0NhdGVnb3J5KSB7Ci0JCVN0cmluZyBvbGRDYXRlZ29yeSA9IGNhdGVnb3J5OwotCQljYXRlZ29yeSA9IG5ld0NhdGVnb3J5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZLCBvbGRDYXRlZ29yeSwgY2F0ZWdvcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBhbnkoKSB7Ci0JCXJldHVybiBjb21wYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbXBhbnkoU3RyaW5nIG5ld0NvbXBhbnkpIHsKLQkJU3RyaW5nIG9sZENvbXBhbnkgPSBjb21wYW55OwotCQljb21wYW55ID0gbmV3Q29tcGFueTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DT01QQU5ZLCBvbGRDb21wYW55LCBjb21wYW55KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQlyZXR1cm4gbWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBuZXdNYW5hZ2VyKSB7Ci0JCVN0cmluZyBvbGRNYW5hZ2VyID0gbWFuYWdlcjsKLQkJbWFuYWdlciA9IG5ld01hbmFnZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUiwgb2xkTWFuYWdlciwgbWFuYWdlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgewotCQlyZXR1cm4gYXV0aG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcihTdHJpbmcgbmV3QXV0aG9yKSB7Ci0JCVN0cmluZyBvbGRBdXRob3IgPSBhdXRob3I7Ci0JCWF1dGhvciA9IG5ld0F1dGhvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1IsIG9sZEF1dGhvciwgYXV0aG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRDcmVhdGlvbkRhdGUoKSB7Ci0JCXJldHVybiBjcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKE9iamVjdCBuZXdDcmVhdGlvbkRhdGUpIHsKLQkJT2JqZWN0IG9sZENyZWF0aW9uRGF0ZSA9IGNyZWF0aW9uRGF0ZTsKLQkJY3JlYXRpb25EYXRlID0gbmV3Q3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEUsIG9sZENyZWF0aW9uRGF0ZSwgY3JlYXRpb25EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmV2aXNpb24oKSB7Ci0JCXJldHVybiByZXZpc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXZpc2lvbihCaWdJbnRlZ2VyIG5ld1JldmlzaW9uKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUmV2aXNpb24gPSByZXZpc2lvbjsKLQkJcmV2aXNpb24gPSBuZXdSZXZpc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVZJU0lPTiwgb2xkUmV2aXNpb24sIHJldmlzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXN0U2F2ZWQoKSB7Ci0JCXJldHVybiBsYXN0U2F2ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFzdFNhdmVkKE9iamVjdCBuZXdMYXN0U2F2ZWQpIHsKLQkJT2JqZWN0IG9sZExhc3RTYXZlZCA9IGxhc3RTYXZlZDsKLQkJbGFzdFNhdmVkID0gbmV3TGFzdFNhdmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQsIG9sZExhc3RTYXZlZCwgbGFzdFNhdmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTY2hlZHVsZUZyb21TdGFydCgpIHsKLQkJcmV0dXJuIHNjaGVkdWxlRnJvbVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVkdWxlRnJvbVN0YXJ0KGJvb2xlYW4gbmV3U2NoZWR1bGVGcm9tU3RhcnQpIHsKLQkJYm9vbGVhbiBvbGRTY2hlZHVsZUZyb21TdGFydCA9IHNjaGVkdWxlRnJvbVN0YXJ0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IG5ld1NjaGVkdWxlRnJvbVN0YXJ0OwotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IHNjaGVkdWxlRnJvbVN0YXJ0RVNldDsKLQkJc2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TQ0hFRFVMRV9GUk9NX1NUQVJULCBvbGRTY2hlZHVsZUZyb21TdGFydCwgc2NoZWR1bGVGcm9tU3RhcnQsICFvbGRTY2hlZHVsZUZyb21TdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNjaGVkdWxlRnJvbVN0YXJ0KCkgewotCQlib29sZWFuIG9sZFNjaGVkdWxlRnJvbVN0YXJ0ID0gc2NoZWR1bGVGcm9tU3RhcnQ7Ci0JCWJvb2xlYW4gb2xkU2NoZWR1bGVGcm9tU3RhcnRFU2V0ID0gc2NoZWR1bGVGcm9tU3RhcnRFU2V0OwotCQlzY2hlZHVsZUZyb21TdGFydCA9IFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQ7Ci0JCXNjaGVkdWxlRnJvbVN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVCwgb2xkU2NoZWR1bGVGcm9tU3RhcnQsIFNDSEVEVUxFX0ZST01fU1RBUlRfRURFRkFVTFQsIG9sZFNjaGVkdWxlRnJvbVN0YXJ0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U2NoZWR1bGVGcm9tU3RhcnQoKSB7Ci0JCXJldHVybiBzY2hlZHVsZUZyb21TdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydERhdGUoKSB7Ci0JCXJldHVybiBzdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnREYXRlKE9iamVjdCBuZXdTdGFydERhdGUpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwgc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gZmluaXNoRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hEYXRlKE9iamVjdCBuZXdGaW5pc2hEYXRlKSB7Ci0JCU9iamVjdCBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsIGZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRGWVN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIGZZU3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZZU3RhcnREYXRlKEJpZ0ludGVnZXIgbmV3RllTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGRGWVN0YXJ0RGF0ZSA9IGZZU3RhcnREYXRlOwotCQlmWVN0YXJ0RGF0ZSA9IG5ld0ZZU3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURSwgb2xkRllTdGFydERhdGUsIGZZU3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3JpdGljYWxTbGFja0xpbWl0KCkgewotCQlyZXR1cm4gY3JpdGljYWxTbGFja0xpbWl0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsU2xhY2tMaW1pdChCaWdJbnRlZ2VyIG5ld0NyaXRpY2FsU2xhY2tMaW1pdCkgewotCQlCaWdJbnRlZ2VyIG9sZENyaXRpY2FsU2xhY2tMaW1pdCA9IGNyaXRpY2FsU2xhY2tMaW1pdDsKLQkJY3JpdGljYWxTbGFja0xpbWl0ID0gbmV3Q3JpdGljYWxTbGFja0xpbWl0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlULCBvbGRDcml0aWNhbFNsYWNrTGltaXQsIGNyaXRpY2FsU2xhY2tMaW1pdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEN1cnJlbmN5RGlnaXRzKCkgewotCQlyZXR1cm4gY3VycmVuY3lEaWdpdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lEaWdpdHMoQmlnSW50ZWdlciBuZXdDdXJyZW5jeURpZ2l0cykgewotCQlCaWdJbnRlZ2VyIG9sZEN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHM7Ci0JCWN1cnJlbmN5RGlnaXRzID0gbmV3Q3VycmVuY3lEaWdpdHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTLCBvbGRDdXJyZW5jeURpZ2l0cywgY3VycmVuY3lEaWdpdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbmN5U3ltYm9sKCkgewotCQlyZXR1cm4gY3VycmVuY3lTeW1ib2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2woU3RyaW5nIG5ld0N1cnJlbmN5U3ltYm9sKSB7Ci0JCVN0cmluZyBvbGRDdXJyZW5jeVN5bWJvbCA9IGN1cnJlbmN5U3ltYm9sOwotCQljdXJyZW5jeVN5bWJvbCA9IG5ld0N1cnJlbmN5U3ltYm9sOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTCwgb2xkQ3VycmVuY3lTeW1ib2wsIGN1cnJlbmN5U3ltYm9sKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGN1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVuY3lTeW1ib2xQb3NpdGlvbihCaWdJbnRlZ2VyIG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb24pIHsKLQkJQmlnSW50ZWdlciBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uID0gY3VycmVuY3lTeW1ib2xQb3NpdGlvbjsKLQkJY3VycmVuY3lTeW1ib2xQb3NpdGlvbiA9IG5ld0N1cnJlbmN5U3ltYm9sUG9zaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OLCBvbGRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uLCBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q2FsZW5kYXJVSUQoKSB7Ci0JCXJldHVybiBjYWxlbmRhclVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWxlbmRhclVJRChCaWdJbnRlZ2VyIG5ld0NhbGVuZGFyVUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ2FsZW5kYXJVSUQgPSBjYWxlbmRhclVJRDsKLQkJY2FsZW5kYXJVSUQgPSBuZXdDYWxlbmRhclVJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQsIG9sZENhbGVuZGFyVUlELCBjYWxlbmRhclVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFN0YXJ0VGltZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTdGFydFRpbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFN0YXJ0VGltZShPYmplY3QgbmV3RGVmYXVsdFN0YXJ0VGltZSkgewotCQlPYmplY3Qgb2xkRGVmYXVsdFN0YXJ0VGltZSA9IGRlZmF1bHRTdGFydFRpbWU7Ci0JCWRlZmF1bHRTdGFydFRpbWUgPSBuZXdEZWZhdWx0U3RhcnRUaW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRSwgb2xkRGVmYXVsdFN0YXJ0VGltZSwgZGVmYXVsdFN0YXJ0VGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdEZpbmlzaFRpbWUoKSB7Ci0JCXJldHVybiBkZWZhdWx0RmluaXNoVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmluaXNoVGltZShPYmplY3QgbmV3RGVmYXVsdEZpbmlzaFRpbWUpIHsKLQkJT2JqZWN0IG9sZERlZmF1bHRGaW5pc2hUaW1lID0gZGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWRlZmF1bHRGaW5pc2hUaW1lID0gbmV3RGVmYXVsdEZpbmlzaFRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRSwgb2xkRGVmYXVsdEZpbmlzaFRpbWUsIGRlZmF1bHRGaW5pc2hUaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlckRheSgpIHsKLQkJcmV0dXJuIG1pbnV0ZXNQZXJEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWludXRlc1BlckRheShCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJEYXkpIHsKLQkJQmlnSW50ZWdlciBvbGRNaW51dGVzUGVyRGF5ID0gbWludXRlc1BlckRheTsKLQkJbWludXRlc1BlckRheSA9IG5ld01pbnV0ZXNQZXJEYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZLCBvbGRNaW51dGVzUGVyRGF5LCBtaW51dGVzUGVyRGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TWludXRlc1BlcldlZWsoKSB7Ci0JCXJldHVybiBtaW51dGVzUGVyV2VlazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGVzUGVyV2VlayhCaWdJbnRlZ2VyIG5ld01pbnV0ZXNQZXJXZWVrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTWludXRlc1BlcldlZWsgPSBtaW51dGVzUGVyV2VlazsKLQkJbWludXRlc1BlcldlZWsgPSBuZXdNaW51dGVzUGVyV2VlazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLLCBvbGRNaW51dGVzUGVyV2VlaywgbWludXRlc1BlcldlZWspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREYXlzUGVyTW9udGgoKSB7Ci0JCXJldHVybiBkYXlzUGVyTW9udGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5c1Blck1vbnRoKEJpZ0ludGVnZXIgbmV3RGF5c1Blck1vbnRoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGF5c1Blck1vbnRoID0gZGF5c1Blck1vbnRoOwotCQlkYXlzUGVyTW9udGggPSBuZXdEYXlzUGVyTW9udGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEgsIG9sZERheXNQZXJNb250aCwgZGF5c1Blck1vbnRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdFRhc2tUeXBlKCkgewotCQlyZXR1cm4gZGVmYXVsdFRhc2tUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrVHlwZShCaWdJbnRlZ2VyIG5ld0RlZmF1bHRUYXNrVHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZERlZmF1bHRUYXNrVHlwZSA9IGRlZmF1bHRUYXNrVHlwZTsKLQkJZGVmYXVsdFRhc2tUeXBlID0gbmV3RGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRSwgb2xkRGVmYXVsdFRhc2tUeXBlLCBkZWZhdWx0VGFza1R5cGUsICFvbGREZWZhdWx0VGFza1R5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0VGFza1R5cGUoKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tUeXBlID0gZGVmYXVsdFRhc2tUeXBlOwotCQlib29sZWFuIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQgPSBkZWZhdWx0VGFza1R5cGVFU2V0OwotCQlkZWZhdWx0VGFza1R5cGUgPSBERUZBVUxUX1RBU0tfVFlQRV9FREVGQVVMVDsKLQkJZGVmYXVsdFRhc2tUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEUsIG9sZERlZmF1bHRUYXNrVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfRURFRkFVTFQsIG9sZERlZmF1bHRUYXNrVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERlZmF1bHRUYXNrVHlwZSgpIHsKLQkJcmV0dXJuIGRlZmF1bHRUYXNrVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKSB7Ci0JCXJldHVybiBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChCaWdJbnRlZ2VyIG5ld0RlZmF1bHRGaXhlZENvc3RBY2NydWFsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwgPSBuZXdEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTCwgb2xkRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwsIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0U3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTdGFuZGFyZFJhdGUoZmxvYXQgbmV3RGVmYXVsdFN0YW5kYXJkUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZSA9IG5ld0RlZmF1bHRTdGFuZGFyZFJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSBkZWZhdWx0U3RhbmRhcmRSYXRlRVNldDsKLQkJZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURSwgb2xkRGVmYXVsdFN0YW5kYXJkUmF0ZSwgZGVmYXVsdFN0YW5kYXJkUmF0ZSwgIW9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlID0gZGVmYXVsdFN0YW5kYXJkUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGRlZmF1bHRTdGFuZGFyZFJhdGVFU2V0OwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlID0gREVGQVVMVF9TVEFOREFSRF9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0U3RhbmRhcmRSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9TVEFOREFSRF9SQVRFLCBvbGREZWZhdWx0U3RhbmRhcmRSYXRlLCBERUZBVUxUX1NUQU5EQVJEX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRTdGFuZGFyZFJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldERlZmF1bHRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBkZWZhdWx0T3ZlcnRpbWVSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPdmVydGltZVJhdGUoZmxvYXQgbmV3RGVmYXVsdE92ZXJ0aW1lUmF0ZSkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZSA9IG5ld0RlZmF1bHRPdmVydGltZVJhdGU7Ci0JCWJvb2xlYW4gb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSBkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldDsKLQkJZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURSwgb2xkRGVmYXVsdE92ZXJ0aW1lUmF0ZSwgZGVmYXVsdE92ZXJ0aW1lUmF0ZSwgIW9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlmbG9hdCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlID0gZGVmYXVsdE92ZXJ0aW1lUmF0ZTsKLQkJYm9vbGVhbiBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGRlZmF1bHRPdmVydGltZVJhdGVFU2V0OwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlID0gREVGQVVMVF9PVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCQlkZWZhdWx0T3ZlcnRpbWVSYXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFLCBvbGREZWZhdWx0T3ZlcnRpbWVSYXRlLCBERUZBVUxUX09WRVJUSU1FX1JBVEVfRURFRkFVTFQsIG9sZERlZmF1bHRPdmVydGltZVJhdGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCkgewotCQlyZXR1cm4gZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RHVyYXRpb25Gb3JtYXQoKSB7Ci0JCXJldHVybiBkdXJhdGlvbkZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREdXJhdGlvbkZvcm1hdChCaWdJbnRlZ2VyIG5ld0R1cmF0aW9uRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkRHVyYXRpb25Gb3JtYXQgPSBkdXJhdGlvbkZvcm1hdDsKLQkJZHVyYXRpb25Gb3JtYXQgPSBuZXdEdXJhdGlvbkZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQsIG9sZER1cmF0aW9uRm9ybWF0LCBkdXJhdGlvbkZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtGb3JtYXQoKSB7Ci0JCXJldHVybiB3b3JrRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtGb3JtYXQoQmlnSW50ZWdlciBuZXdXb3JrRm9ybWF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkV29ya0Zvcm1hdCA9IHdvcmtGb3JtYXQ7Ci0JCXdvcmtGb3JtYXQgPSBuZXdXb3JrRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dPUktfRk9STUFULCBvbGRXb3JrRm9ybWF0LCB3b3JrRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZUFjdHVhbENvc3RzKCkgewotCQlyZXR1cm4gZWRpdGFibGVBY3R1YWxDb3N0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZUFjdHVhbENvc3RzKGJvb2xlYW4gbmV3RWRpdGFibGVBY3R1YWxDb3N0cykgewotCQlib29sZWFuIG9sZEVkaXRhYmxlQWN0dWFsQ29zdHMgPSBlZGl0YWJsZUFjdHVhbENvc3RzOwotCQllZGl0YWJsZUFjdHVhbENvc3RzID0gbmV3RWRpdGFibGVBY3R1YWxDb3N0czsKLQkJYm9vbGVhbiBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCQllZGl0YWJsZUFjdHVhbENvc3RzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTLCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzLCBlZGl0YWJsZUFjdHVhbENvc3RzLCAhb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKSB7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0cyA9IGVkaXRhYmxlQWN0dWFsQ29zdHM7Ci0JCWJvb2xlYW4gb2xkRWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBlZGl0YWJsZUFjdHVhbENvc3RzRVNldDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0cyA9IEVESVRBQkxFX0FDVFVBTF9DT1NUU19FREVGQVVMVDsKLQkJZWRpdGFibGVBY3R1YWxDb3N0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUywgb2xkRWRpdGFibGVBY3R1YWxDb3N0cywgRURJVEFCTEVfQUNUVUFMX0NPU1RTX0VERUZBVUxULCBvbGRFZGl0YWJsZUFjdHVhbENvc3RzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RWRpdGFibGVBY3R1YWxDb3N0cygpIHsKLQkJcmV0dXJuIGVkaXRhYmxlQWN0dWFsQ29zdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG9ub3JDb25zdHJhaW50cyhib29sZWFuIG5ld0hvbm9yQ29uc3RyYWludHMpIHsKLQkJYm9vbGVhbiBvbGRIb25vckNvbnN0cmFpbnRzID0gaG9ub3JDb25zdHJhaW50czsKLQkJaG9ub3JDb25zdHJhaW50cyA9IG5ld0hvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTLCBvbGRIb25vckNvbnN0cmFpbnRzLCBob25vckNvbnN0cmFpbnRzLCAhb2xkSG9ub3JDb25zdHJhaW50c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhvbm9yQ29uc3RyYWludHMoKSB7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50cyA9IGhvbm9yQ29uc3RyYWludHM7Ci0JCWJvb2xlYW4gb2xkSG9ub3JDb25zdHJhaW50c0VTZXQgPSBob25vckNvbnN0cmFpbnRzRVNldDsKLQkJaG9ub3JDb25zdHJhaW50cyA9IEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxUOwotCQlob25vckNvbnN0cmFpbnRzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFMsIG9sZEhvbm9yQ29uc3RyYWludHMsIEhPTk9SX0NPTlNUUkFJTlRTX0VERUZBVUxULCBvbGRIb25vckNvbnN0cmFpbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIGhvbm9yQ29uc3RyYWludHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCXJldHVybiBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KGJvb2xlYW4gbmV3SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBuZXdJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCA9IGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnksICFvbGRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKSB7Ci0JCWJvb2xlYW4gb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5ID0gaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5OwotCQlib29sZWFuIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnlFU2V0OwotCQlpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkgPSBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQ7Ci0JCWluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWSwgb2xkSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5LCBJTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUllfRURFRkFVTFQsIG9sZEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpIHsKLQkJcmV0dXJuIGluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSB7Ci0JCXJldHVybiBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKGJvb2xlYW4gbmV3TXVsdGlwbGVDcml0aWNhbFBhdGhzKSB7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzID0gbXVsdGlwbGVDcml0aWNhbFBhdGhzOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBuZXdNdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01VTFRJUExFX0NSSVRJQ0FMX1BBVEhTLCBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMsIG11bHRpcGxlQ3JpdGljYWxQYXRocywgIW9sZE11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpIHsKLQkJYm9vbGVhbiBvbGRNdWx0aXBsZUNyaXRpY2FsUGF0aHMgPSBtdWx0aXBsZUNyaXRpY2FsUGF0aHM7Ci0JCWJvb2xlYW4gb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCA9IG11bHRpcGxlQ3JpdGljYWxQYXRoc0VTZXQ7Ci0JCW11bHRpcGxlQ3JpdGljYWxQYXRocyA9IE1VTFRJUExFX0NSSVRJQ0FMX1BBVEhTX0VERUZBVUxUOwotCQltdWx0aXBsZUNyaXRpY2FsUGF0aHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUywgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzLCBNVUxUSVBMRV9DUklUSUNBTF9QQVRIU19FREVGQVVMVCwgb2xkTXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TXVsdGlwbGVDcml0aWNhbFBhdGhzKCkgewotCQlyZXR1cm4gbXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlyZXR1cm4gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza3NFZmZvcnREcml2ZW4oYm9vbGVhbiBuZXdOZXdUYXNrc0VmZm9ydERyaXZlbikgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCW5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3TmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgbmV3VGFza3NFZmZvcnREcml2ZW4sICFvbGROZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuID0gbmV3VGFza3NFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFZmZvcnREcml2ZW5FU2V0ID0gbmV3VGFza3NFZmZvcnREcml2ZW5FU2V0OwotCQluZXdUYXNrc0VmZm9ydERyaXZlbiA9IE5FV19UQVNLU19FRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCQluZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOLCBvbGROZXdUYXNrc0VmZm9ydERyaXZlbiwgTkVXX1RBU0tTX0VGRk9SVF9EUklWRU5fRURFRkFVTFQsIG9sZE5ld1Rhc2tzRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdUYXNrc0VzdGltYXRlZCgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tzRXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5ld1Rhc2tzRXN0aW1hdGVkKGJvb2xlYW4gbmV3TmV3VGFza3NFc3RpbWF0ZWQpIHsKLQkJYm9vbGVhbiBvbGROZXdUYXNrc0VzdGltYXRlZCA9IG5ld1Rhc2tzRXN0aW1hdGVkOwotCQluZXdUYXNrc0VzdGltYXRlZCA9IG5ld05ld1Rhc2tzRXN0aW1hdGVkOwotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IG5ld1Rhc2tzRXN0aW1hdGVkRVNldDsKLQkJbmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVELCBvbGROZXdUYXNrc0VzdGltYXRlZCwgbmV3VGFza3NFc3RpbWF0ZWQsICFvbGROZXdUYXNrc0VzdGltYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE5ld1Rhc2tzRXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZE5ld1Rhc2tzRXN0aW1hdGVkID0gbmV3VGFza3NFc3RpbWF0ZWQ7Ci0JCWJvb2xlYW4gb2xkTmV3VGFza3NFc3RpbWF0ZWRFU2V0ID0gbmV3VGFza3NFc3RpbWF0ZWRFU2V0OwotCQluZXdUYXNrc0VzdGltYXRlZCA9IE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQ7Ci0JCW5ld1Rhc2tzRXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRCwgb2xkTmV3VGFza3NFc3RpbWF0ZWQsIE5FV19UQVNLU19FU1RJTUFURURfRURFRkFVTFQsIG9sZE5ld1Rhc2tzRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBuZXdUYXNrc0VzdGltYXRlZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCXJldHVybiBzcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKGJvb2xlYW4gbmV3U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBuZXdTcGxpdHNJblByb2dyZXNzVGFza3M7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCA9IHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBzcGxpdHNJblByb2dyZXNzVGFza3MsICFvbGRTcGxpdHNJblByb2dyZXNzVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzID0gc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzOwotCQlib29sZWFuIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBzcGxpdHNJblByb2dyZXNzVGFza3NFU2V0OwotCQlzcGxpdHNJblByb2dyZXNzVGFza3MgPSBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQ7Ci0JCXNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQTElUU19JTl9QUk9HUkVTU19UQVNLUywgb2xkU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzLCBTUExJVFNfSU5fUFJPR1JFU1NfVEFTS1NfRURFRkFVTFQsIG9sZFNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwbGl0c0luUHJvZ3Jlc3NUYXNrcygpIHsKLQkJcmV0dXJuIHNwbGl0c0luUHJvZ3Jlc3NUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgewotCQlyZXR1cm4gc3ByZWFkQWN0dWFsQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcHJlYWRBY3R1YWxDb3N0KGJvb2xlYW4gbmV3U3ByZWFkQWN0dWFsQ29zdCkgewotCQlib29sZWFuIG9sZFNwcmVhZEFjdHVhbENvc3QgPSBzcHJlYWRBY3R1YWxDb3N0OwotCQlzcHJlYWRBY3R1YWxDb3N0ID0gbmV3U3ByZWFkQWN0dWFsQ29zdDsKLQkJYm9vbGVhbiBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCA9IHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCQlzcHJlYWRBY3R1YWxDb3N0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NULCBvbGRTcHJlYWRBY3R1YWxDb3N0LCBzcHJlYWRBY3R1YWxDb3N0LCAhb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNwcmVhZEFjdHVhbENvc3QoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdCA9IHNwcmVhZEFjdHVhbENvc3Q7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBzcHJlYWRBY3R1YWxDb3N0RVNldDsKLQkJc3ByZWFkQWN0dWFsQ29zdCA9IFNQUkVBRF9BQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQkJc3ByZWFkQWN0dWFsQ29zdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVCwgb2xkU3ByZWFkQWN0dWFsQ29zdCwgU1BSRUFEX0FDVFVBTF9DT1NUX0VERUZBVUxULCBvbGRTcHJlYWRBY3R1YWxDb3N0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3ByZWFkQWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIHNwcmVhZEFjdHVhbENvc3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3ByZWFkUGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZShib29sZWFuIG5ld1NwcmVhZFBlcmNlbnRDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSA9IHNwcmVhZFBlcmNlbnRDb21wbGV0ZTsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlID0gbmV3U3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURSwgb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlLCBzcHJlYWRQZXJjZW50Q29tcGxldGUsICFvbGRTcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gb2xkU3ByZWFkUGVyY2VudENvbXBsZXRlID0gc3ByZWFkUGVyY2VudENvbXBsZXRlOwotCQlib29sZWFuIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQgPSBzcHJlYWRQZXJjZW50Q29tcGxldGVFU2V0OwotCQlzcHJlYWRQZXJjZW50Q29tcGxldGUgPSBTUFJFQURfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQkJc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEUsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZSwgU1BSRUFEX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQsIG9sZFNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHNwcmVhZFBlcmNlbnRDb21wbGV0ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNUYXNrVXBkYXRlc1Jlc291cmNlKCkgewotCQlyZXR1cm4gdGFza1VwZGF0ZXNSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrVXBkYXRlc1Jlc291cmNlKGJvb2xlYW4gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZSkgewotCQlib29sZWFuIG9sZFRhc2tVcGRhdGVzUmVzb3VyY2UgPSB0YXNrVXBkYXRlc1Jlc291cmNlOwotCQl0YXNrVXBkYXRlc1Jlc291cmNlID0gbmV3VGFza1VwZGF0ZXNSZXNvdXJjZTsKLQkJYm9vbGVhbiBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCQl0YXNrVXBkYXRlc1Jlc291cmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS19VUERBVEVTX1JFU09VUkNFLCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlLCB0YXNrVXBkYXRlc1Jlc291cmNlLCAhb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFRhc2tVcGRhdGVzUmVzb3VyY2UoKSB7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSA9IHRhc2tVcGRhdGVzUmVzb3VyY2U7Ci0JCWJvb2xlYW4gb2xkVGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSB0YXNrVXBkYXRlc1Jlc291cmNlRVNldDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZSA9IFRBU0tfVVBEQVRFU19SRVNPVVJDRV9FREVGQVVMVDsKLQkJdGFza1VwZGF0ZXNSZXNvdXJjZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tfVVBEQVRFU19SRVNPVVJDRSwgb2xkVGFza1VwZGF0ZXNSZXNvdXJjZSwgVEFTS19VUERBVEVTX1JFU09VUkNFX0VERUZBVUxULCBvbGRUYXNrVXBkYXRlc1Jlc291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmlzY2FsWWVhclN0YXJ0KCkgewotCQlyZXR1cm4gZmlzY2FsWWVhclN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpc2NhbFllYXJTdGFydChib29sZWFuIG5ld0Zpc2NhbFllYXJTdGFydCkgewotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydCA9IGZpc2NhbFllYXJTdGFydDsKLQkJZmlzY2FsWWVhclN0YXJ0ID0gbmV3RmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVCwgb2xkRmlzY2FsWWVhclN0YXJ0LCBmaXNjYWxZZWFyU3RhcnQsICFvbGRGaXNjYWxZZWFyU3RhcnRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRGaXNjYWxZZWFyU3RhcnQoKSB7Ci0JCWJvb2xlYW4gb2xkRmlzY2FsWWVhclN0YXJ0ID0gZmlzY2FsWWVhclN0YXJ0OwotCQlib29sZWFuIG9sZEZpc2NhbFllYXJTdGFydEVTZXQgPSBmaXNjYWxZZWFyU3RhcnRFU2V0OwotCQlmaXNjYWxZZWFyU3RhcnQgPSBGSVNDQUxfWUVBUl9TVEFSVF9FREVGQVVMVDsKLQkJZmlzY2FsWWVhclN0YXJ0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQsIG9sZEZpc2NhbFllYXJTdGFydCwgRklTQ0FMX1lFQVJfU1RBUlRfRURFRkFVTFQsIG9sZEZpc2NhbFllYXJTdGFydEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpc2NhbFllYXJTdGFydCgpIHsKLQkJcmV0dXJuIGZpc2NhbFllYXJTdGFydEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0V2Vla1N0YXJ0RGF5KCkgewotCQlyZXR1cm4gd2Vla1N0YXJ0RGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdlZWtTdGFydERheShCaWdJbnRlZ2VyIG5ld1dlZWtTdGFydERheSkgewotCQlCaWdJbnRlZ2VyIG9sZFdlZWtTdGFydERheSA9IHdlZWtTdGFydERheTsKLQkJd2Vla1N0YXJ0RGF5ID0gbmV3V2Vla1N0YXJ0RGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZLCBvbGRXZWVrU3RhcnREYXksIHdlZWtTdGFydERheSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlyZXR1cm4gbW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vdmVDb21wbGV0ZWRFbmRzQmFjayhib29sZWFuIG5ld01vdmVDb21wbGV0ZWRFbmRzQmFjaykgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gbmV3TW92ZUNvbXBsZXRlZEVuZHNCYWNrOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgbW92ZUNvbXBsZXRlZEVuZHNCYWNrLCAhb2xkTW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCkgewotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjayA9IG1vdmVDb21wbGV0ZWRFbmRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gbW92ZUNvbXBsZXRlZEVuZHNCYWNrRVNldDsKLQkJbW92ZUNvbXBsZXRlZEVuZHNCYWNrID0gTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxUOwotCQltb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0ssIG9sZE1vdmVDb21wbGV0ZWRFbmRzQmFjaywgTU9WRV9DT01QTEVURURfRU5EU19CQUNLX0VERUZBVUxULCBvbGRNb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0JhY2tFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjayhib29sZWFuIG5ld01vdmVSZW1haW5pbmdTdGFydHNCYWNrKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjaywgIW9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2sgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFjazsKLQkJYm9vbGVhbiBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQgPSBtb3ZlUmVtYWluaW5nU3RhcnRzQmFja0VTZXQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrID0gTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0tfRURFRkFVTFQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0ssIG9sZE1vdmVSZW1haW5pbmdTdGFydHNCYWNrLCBNT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDS19FREVGQVVMVCwgb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygpIHsKLQkJcmV0dXJuIG1vdmVSZW1haW5pbmdTdGFydHNCYWNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlyZXR1cm4gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoYm9vbGVhbiBuZXdNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCW1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbmV3TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQsICFvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKCkgewotCQlib29sZWFuIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0ID0gbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0OwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCA9IE1PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEX0VERUZBVUxUOwotCQltb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJELCBvbGRNb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCwgTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCXJldHVybiBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKGJvb2xlYW4gbmV3TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBuZXdNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQ7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkRVNldCA9IG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQsICFvbGRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKSB7Ci0JCWJvb2xlYW4gb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkID0gbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOwotCQlib29sZWFuIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBtb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmRFU2V0OwotCQltb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQgPSBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQ7Ci0JCW1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRCwgb2xkTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkLCBNT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkRfRURFRkFVTFQsIG9sZE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpIHsKLQkJcmV0dXJuIG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGJhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCaWdJbnRlZ2VyIG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWUpIHsKLQkJQmlnSW50ZWdlciBvbGRCYXNlbGluZUZvckVhcm5lZFZhbHVlID0gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTsKLQkJYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSA9IG5ld0Jhc2VsaW5lRm9yRWFybmVkVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRSwgb2xkQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgewotCQlyZXR1cm4gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyhib29sZWFuIG5ld0F1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcykgewotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyA9IGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrczsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gbmV3QXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLUywgb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzLCBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MsICFvbGRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKSB7Ci0JCWJvb2xlYW4gb2xkQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzID0gYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOwotCQlib29sZWFuIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQgPSBhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3NFU2V0OwotCQlhdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MgPSBBVVRPX0FERF9ORVdfUkVTT1VSQ0VTX0FORF9UQVNLU19FREVGQVVMVDsKLQkJYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1MsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcywgQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1NfRURFRkFVTFQsIG9sZEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpIHsKLQkJcmV0dXJuIGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGF0dXNEYXRlKCkgewotCQlyZXR1cm4gc3RhdHVzRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXNEYXRlKE9iamVjdCBuZXdTdGF0dXNEYXRlKSB7Ci0JCU9iamVjdCBvbGRTdGF0dXNEYXRlID0gc3RhdHVzRGF0ZTsKLQkJc3RhdHVzRGF0ZSA9IG5ld1N0YXR1c0RhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEUsIG9sZFN0YXR1c0RhdGUsIHN0YXR1c0RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEN1cnJlbnREYXRlKCkgewotCQlyZXR1cm4gY3VycmVudERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudERhdGUoT2JqZWN0IG5ld0N1cnJlbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlOwotCQljdXJyZW50RGF0ZSA9IG5ld0N1cnJlbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURSwgb2xkQ3VycmVudERhdGUsIGN1cnJlbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlyZXR1cm4gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKGJvb2xlYW4gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMID0gbmV3TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTDsKLQkJYm9vbGVhbiBvbGRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0OwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgIW9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRNaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMKCkgewotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOwotCQlib29sZWFuIG9sZE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0ID0gbWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQ7Ci0JCW1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwgPSBNSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMX0VERUZBVUxUOwotCQltaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCwgTUlDUk9TT0ZUX1BST0pFQ1RfU0VSVkVSX1VSTF9FREVGQVVMVCwgb2xkTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKSB7Ci0JCXJldHVybiBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0F1dG9saW5rKCkgewotCQlyZXR1cm4gYXV0b2xpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0b2xpbmsoYm9vbGVhbiBuZXdBdXRvbGluaykgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWF1dG9saW5rID0gbmV3QXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGlua0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgYXV0b2xpbmssICFvbGRBdXRvbGlua0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEF1dG9saW5rKCkgewotCQlib29sZWFuIG9sZEF1dG9saW5rID0gYXV0b2xpbms7Ci0JCWJvb2xlYW4gb2xkQXV0b2xpbmtFU2V0ID0gYXV0b2xpbmtFU2V0OwotCQlhdXRvbGluayA9IEFVVE9MSU5LX0VERUZBVUxUOwotCQlhdXRvbGlua0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LLCBvbGRBdXRvbGluaywgQVVUT0xJTktfRURFRkFVTFQsIG9sZEF1dG9saW5rRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QXV0b2xpbmsoKSB7Ci0JCXJldHVybiBhdXRvbGlua0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TmV3VGFza1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIG5ld1Rhc2tTdGFydERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmV3VGFza1N0YXJ0RGF0ZShCaWdJbnRlZ2VyIG5ld05ld1Rhc2tTdGFydERhdGUpIHsKLQkJQmlnSW50ZWdlciBvbGROZXdUYXNrU3RhcnREYXRlID0gbmV3VGFza1N0YXJ0RGF0ZTsKLQkJbmV3VGFza1N0YXJ0RGF0ZSA9IG5ld05ld1Rhc2tTdGFydERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tfU1RBUlRfREFURSwgb2xkTmV3VGFza1N0YXJ0RGF0ZSwgbmV3VGFza1N0YXJ0RGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldERlZmF1bHRUYXNrRVZNZXRob2QoKSB7Ci0JCXJldHVybiBkZWZhdWx0VGFza0VWTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRUYXNrRVZNZXRob2QoQmlnSW50ZWdlciBuZXdEZWZhdWx0VGFza0VWTWV0aG9kKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRGVmYXVsdFRhc2tFVk1ldGhvZCA9IGRlZmF1bHRUYXNrRVZNZXRob2Q7Ci0JCWRlZmF1bHRUYXNrRVZNZXRob2QgPSBuZXdEZWZhdWx0VGFza0VWTWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfVEFTS19FVl9NRVRIT0QsIG9sZERlZmF1bHRUYXNrRVZNZXRob2QsIGRlZmF1bHRUYXNrRVZNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2plY3RFeHRlcm5hbGx5RWRpdGVkKCkgewotCQlyZXR1cm4gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoYm9vbGVhbiBuZXdQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCkgewotCQlib29sZWFuIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gbmV3UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQ7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0OwotCQlwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQsIG9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgIW9sZFByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDsKLQkJYm9vbGVhbiBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQgPSBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQ7Ci0JCXByb2plY3RFeHRlcm5hbGx5RWRpdGVkID0gUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVDsKLQkJcHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVELCBvbGRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCwgUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRF9FREVGQVVMVCwgb2xkUHJvamVjdEV4dGVybmFsbHlFZGl0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpIHsKLQkJcmV0dXJuIHByb2plY3RFeHRlcm5hbGx5RWRpdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEV4dGVuZGVkQ3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRDcmVhdGlvbkRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoT2JqZWN0IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRFeHRlbmRlZENyZWF0aW9uRGF0ZSA9IGV4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlleHRlbmRlZENyZWF0aW9uRGF0ZSA9IG5ld0V4dGVuZGVkQ3JlYXRpb25EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEUsIG9sZEV4dGVuZGVkQ3JlYXRpb25EYXRlLCBleHRlbmRlZENyZWF0aW9uRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0dWFsc0luU3luYygpIHsKLQkJcmV0dXJuIGFjdHVhbHNJblN5bmM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsc0luU3luYyhib29sZWFuIG5ld0FjdHVhbHNJblN5bmMpIHsKLQkJYm9vbGVhbiBvbGRBY3R1YWxzSW5TeW5jID0gYWN0dWFsc0luU3luYzsKLQkJYWN0dWFsc0luU3luYyA9IG5ld0FjdHVhbHNJblN5bmM7Ci0JCWJvb2xlYW4gb2xkQWN0dWFsc0luU3luY0VTZXQgPSBhY3R1YWxzSW5TeW5jRVNldDsKLQkJYWN0dWFsc0luU3luY0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQywgb2xkQWN0dWFsc0luU3luYywgYWN0dWFsc0luU3luYywgIW9sZEFjdHVhbHNJblN5bmNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBY3R1YWxzSW5TeW5jKCkgewotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmMgPSBhY3R1YWxzSW5TeW5jOwotCQlib29sZWFuIG9sZEFjdHVhbHNJblN5bmNFU2V0ID0gYWN0dWFsc0luU3luY0VTZXQ7Ci0JCWFjdHVhbHNJblN5bmMgPSBBQ1RVQUxTX0lOX1NZTkNfRURFRkFVTFQ7Ci0JCWFjdHVhbHNJblN5bmNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkMsIG9sZEFjdHVhbHNJblN5bmMsIEFDVFVBTFNfSU5fU1lOQ19FREVGQVVMVCwgb2xkQWN0dWFsc0luU3luY0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFjdHVhbHNJblN5bmMoKSB7Ci0JCXJldHVybiBhY3R1YWxzSW5TeW5jRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoYm9vbGVhbiBuZXdSZW1vdmVGaWxlUHJvcGVydGllcykgewotCQlib29sZWFuIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gcmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gbmV3UmVtb3ZlRmlsZVByb3BlcnRpZXM7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0OwotCQlyZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFTU9WRV9GSUxFX1BST1BFUlRJRVMsIG9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzLCByZW1vdmVGaWxlUHJvcGVydGllcywgIW9sZFJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXMgPSByZW1vdmVGaWxlUHJvcGVydGllczsKLQkJYm9vbGVhbiBvbGRSZW1vdmVGaWxlUHJvcGVydGllc0VTZXQgPSByZW1vdmVGaWxlUHJvcGVydGllc0VTZXQ7Ci0JCXJlbW92ZUZpbGVQcm9wZXJ0aWVzID0gUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVDsKLQkJcmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTLCBvbGRSZW1vdmVGaWxlUHJvcGVydGllcywgUkVNT1ZFX0ZJTEVfUFJPUEVSVElFU19FREVGQVVMVCwgb2xkUmVtb3ZlRmlsZVByb3BlcnRpZXNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZG1pblByb2plY3QoYm9vbGVhbiBuZXdBZG1pblByb2plY3QpIHsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3QgPSBhZG1pblByb2plY3Q7Ci0JCWFkbWluUHJvamVjdCA9IG5ld0FkbWluUHJvamVjdDsKLQkJYm9vbGVhbiBvbGRBZG1pblByb2plY3RFU2V0ID0gYWRtaW5Qcm9qZWN0RVNldDsKLQkJYWRtaW5Qcm9qZWN0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVCwgb2xkQWRtaW5Qcm9qZWN0LCBhZG1pblByb2plY3QsICFvbGRBZG1pblByb2plY3RFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBZG1pblByb2plY3QoKSB7Ci0JCWJvb2xlYW4gb2xkQWRtaW5Qcm9qZWN0ID0gYWRtaW5Qcm9qZWN0OwotCQlib29sZWFuIG9sZEFkbWluUHJvamVjdEVTZXQgPSBhZG1pblByb2plY3RFU2V0OwotCQlhZG1pblByb2plY3QgPSBBRE1JTl9QUk9KRUNUX0VERUZBVUxUOwotCQlhZG1pblByb2plY3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BRE1JTl9QUk9KRUNULCBvbGRBZG1pblByb2plY3QsIEFETUlOX1BST0pFQ1RfRURFRkFVTFQsIG9sZEFkbWluUHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEFkbWluUHJvamVjdCgpIHsKLQkJcmV0dXJuIGFkbWluUHJvamVjdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGxpbmVDb2RlcyBnZXRPdXRsaW5lQ29kZXMoKSB7Ci0JCXJldHVybiBvdXRsaW5lQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3V0bGluZUNvZGVzKE91dGxpbmVDb2RlcyBuZXdPdXRsaW5lQ29kZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJT3V0bGluZUNvZGVzIG9sZE91dGxpbmVDb2RlcyA9IG91dGxpbmVDb2RlczsKLQkJb3V0bGluZUNvZGVzID0gbmV3T3V0bGluZUNvZGVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVMsIG9sZE91dGxpbmVDb2RlcywgbmV3T3V0bGluZUNvZGVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG5ld091dGxpbmVDb2RlcykgewotCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG91dGxpbmVDb2RlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW91dGxpbmVDb2RlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3V0bGluZUNvZGVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld091dGxpbmVDb2RlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPdXRsaW5lQ29kZXMobmV3T3V0bGluZUNvZGVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUywgbmV3T3V0bGluZUNvZGVzLCBuZXdPdXRsaW5lQ29kZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV0JTTWFza3MgZ2V0V0JTTWFza3MoKSB7Ci0JCXJldHVybiB3QlNNYXNrczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXQlNNYXNrcyBvbGRXQlNNYXNrcyA9IHdCU01hc2tzOwotCQl3QlNNYXNrcyA9IG5ld1dCU01hc2tzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUywgb2xkV0JTTWFza3MsIG5ld1dCU01hc2tzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXQlNNYXNrcyhXQlNNYXNrcyBuZXdXQlNNYXNrcykgewotCQlpZiAobmV3V0JTTWFza3MgIT0gd0JTTWFza3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHdCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdCU01hc2tzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dCU01hc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1dCU01hc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0V0JTTWFza3MobmV3V0JTTWFza3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1MsIG5ld1dCU01hc2tzLCBuZXdXQlNNYXNrcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeHRlbmRlZEF0dHJpYnV0ZXMgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhFeHRlbmRlZEF0dHJpYnV0ZXMgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUV4dGVuZGVkQXR0cmlidXRlcyBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMgPSBleHRlbmRlZEF0dHJpYnV0ZXM7Ci0JCWV4dGVuZGVkQXR0cmlidXRlcyA9IG5ld0V4dGVuZGVkQXR0cmlidXRlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTLCBvbGRFeHRlbmRlZEF0dHJpYnV0ZXMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBuZXdFeHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBleHRlbmRlZEF0dHJpYnV0ZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClleHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0V4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFeHRlbmRlZEF0dHJpYnV0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RXh0ZW5kZWRBdHRyaWJ1dGVzKG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVMsIG5ld0V4dGVuZGVkQXR0cmlidXRlcywgbmV3RXh0ZW5kZWRBdHRyaWJ1dGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhbGVuZGFycyBnZXRDYWxlbmRhcnMoKSB7Ci0JCXJldHVybiBjYWxlbmRhcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FsZW5kYXJzKENhbGVuZGFycyBuZXdDYWxlbmRhcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ2FsZW5kYXJzIG9sZENhbGVuZGFycyA9IGNhbGVuZGFyczsKLQkJY2FsZW5kYXJzID0gbmV3Q2FsZW5kYXJzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgb2xkQ2FsZW5kYXJzLCBuZXdDYWxlbmRhcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhbGVuZGFycyhDYWxlbmRhcnMgbmV3Q2FsZW5kYXJzKSB7Ci0JCWlmIChuZXdDYWxlbmRhcnMgIT0gY2FsZW5kYXJzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWxlbmRhcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FsZW5kYXJzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhbGVuZGFycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWxlbmRhcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWxlbmRhcnMobmV3Q2FsZW5kYXJzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTLCBuZXdDYWxlbmRhcnMsIG5ld0NhbGVuZGFycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrcyBnZXRUYXNrcygpIHsKLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhc2tzKFRhc2tzIG5ld1Rhc2tzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVRhc2tzIG9sZFRhc2tzID0gdGFza3M7Ci0JCXRhc2tzID0gbmV3VGFza3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG9sZFRhc2tzLCBuZXdUYXNrcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza3MoVGFza3MgbmV3VGFza3MpIHsKLQkJaWYgKG5ld1Rhc2tzICE9IHRhc2tzKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YXNrcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YXNrcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Rhc2tzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Rhc2tzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUYXNrcyhuZXdUYXNrcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTLCBuZXdUYXNrcywgbmV3VGFza3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXNvdXJjZXMoUmVzb3VyY2VzIG5ld1Jlc291cmNlcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlSZXNvdXJjZXMgb2xkUmVzb3VyY2VzID0gcmVzb3VyY2VzOwotCQlyZXNvdXJjZXMgPSBuZXdSZXNvdXJjZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBvbGRSZXNvdXJjZXMsIG5ld1Jlc291cmNlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKFJlc291cmNlcyBuZXdSZXNvdXJjZXMpIHsKLQkJaWYgKG5ld1Jlc291cmNlcyAhPSByZXNvdXJjZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlc291cmNlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXNvdXJjZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVzb3VyY2VzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Jlc291cmNlcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlc291cmNlcyhuZXdSZXNvdXJjZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRVNPVVJDRVMsIG5ld1Jlc291cmNlcywgbmV3UmVzb3VyY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFzc2lnbm1lbnRzIGdldEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gYXNzaWdubWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXNzaWdubWVudHMoQXNzaWdubWVudHMgbmV3QXNzaWdubWVudHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQXNzaWdubWVudHMgb2xkQXNzaWdubWVudHMgPSBhc3NpZ25tZW50czsKLQkJYXNzaWdubWVudHMgPSBuZXdBc3NpZ25tZW50czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgb2xkQXNzaWdubWVudHMsIG5ld0Fzc2lnbm1lbnRzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBuZXdBc3NpZ25tZW50cykgewotCQlpZiAobmV3QXNzaWdubWVudHMgIT0gYXNzaWdubWVudHMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFzc2lnbm1lbnRzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFzc2lnbm1lbnRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXNzaWdubWVudHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXNzaWdubWVudHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFzc2lnbm1lbnRzKG5ld0Fzc2lnbm1lbnRzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFMsIG5ld0Fzc2lnbm1lbnRzLCBuZXdBc3NpZ25tZW50cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRPdXRsaW5lQ29kZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V0JTTWFza3MobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEV4dGVuZGVkQXR0cmlidXRlcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDYWxlbmRhcnMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUYXNrcyhudWxsLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRSZXNvdXJjZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRBc3NpZ25tZW50cyhudWxsLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19USVRMRToKLQkJCQlyZXR1cm4gZ2V0VGl0bGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXJldHVybiBnZXRTdWJqZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENhdGVnb3J5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlyZXR1cm4gZ2V0Q29tcGFueSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01BTkFHRVI6Ci0JCQkJcmV0dXJuIGdldE1hbmFnZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBnZXRSZXZpc2lvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIGdldExhc3RTYXZlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJcmV0dXJuIGlzU2NoZWR1bGVGcm9tU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlyZXR1cm4gZ2V0U3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GWVNUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldEZZU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JJVElDQUxfU0xBQ0tfTElNSVQ6Ci0JCQkJcmV0dXJuIGdldENyaXRpY2FsU2xhY2tMaW1pdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlyZXR1cm4gZ2V0Q3VycmVuY3lEaWdpdHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9TWU1CT0w6Ci0JCQkJcmV0dXJuIGdldEN1cnJlbmN5U3ltYm9sKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBnZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFN0YXJ0VGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklOSVNIX1RJTUU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRGaW5pc2hUaW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXJldHVybiBnZXRNaW51dGVzUGVyRGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gZ2V0TWludXRlc1BlcldlZWsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlyZXR1cm4gZ2V0RGF5c1Blck1vbnRoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXJldHVybiBnZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldERlZmF1bHRTdGFuZGFyZFJhdGUoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldER1cmF0aW9uRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldFdvcmtGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FRElUQUJMRV9BQ1RVQUxfQ09TVFM6Ci0JCQkJcmV0dXJuIGlzRWRpdGFibGVBY3R1YWxDb3N0cygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19IT05PUl9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gaXNIb25vckNvbnN0cmFpbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldEVhcm5lZFZhbHVlTWV0aG9kKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSU5TRVJURURfUFJPSkVDVFNfTElLRV9TVU1NQVJZOgotCQkJCXJldHVybiBpc0luc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzTmV3VGFza3NFZmZvcnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTkVXX1RBU0tTX0VTVElNQVRFRDoKLQkJCQlyZXR1cm4gaXNOZXdUYXNrc0VzdGltYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9BQ1RVQUxfQ09TVDoKLQkJCQlyZXR1cm4gaXNTcHJlYWRBY3R1YWxDb3N0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NQUkVBRF9QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1NwcmVhZFBlcmNlbnRDb21wbGV0ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzVGFza1VwZGF0ZXNSZXNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19GSVNDQUxfWUVBUl9TVEFSVDoKLQkJCQlyZXR1cm4gaXNGaXNjYWxZZWFyU3RhcnQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0VFS19TVEFSVF9EQVk6Ci0JCQkJcmV0dXJuIGdldFdlZWtTdGFydERheSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQlyZXR1cm4gaXNNb3ZlQ29tcGxldGVkRW5kc0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0JBQ0s6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2soKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzTW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXJldHVybiBpc01vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19CQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFOgotCQkJCXJldHVybiBnZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzQXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBnZXRTdGF0dXNEYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXJldHVybiBnZXRDdXJyZW50RGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01JQ1JPU09GVF9QUk9KRUNUX1NFUlZFUl9VUkw6Ci0JCQkJcmV0dXJuIGlzTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNBdXRvbGluaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXJldHVybiBnZXROZXdUYXNrU3RhcnREYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFRhc2tFVk1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1BST0pFQ1RfRVhURVJOQUxMWV9FRElURUQ6Ci0JCQkJcmV0dXJuIGlzUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlyZXR1cm4gZ2V0RXh0ZW5kZWRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJcmV0dXJuIGlzQWN0dWFsc0luU3luYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXJldHVybiBpc1JlbW92ZUZpbGVQcm9wZXJ0aWVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzQWRtaW5Qcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVDb2RlcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dCU19NQVNLUzoKLQkJCQlyZXR1cm4gZ2V0V0JTTWFza3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJcmV0dXJuIGdldENhbGVuZGFycygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXJldHVybiBnZXRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2VzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVNTSUdOTUVOVFM6Ci0JCQkJcmV0dXJuIGdldEFzc2lnbm1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1VJRDoKLQkJCQlzZXRVSUQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NVQkpFQ1Q6Ci0JCQkJc2V0U3ViamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ0FURUdPUlk6Ci0JCQkJc2V0Q2F0ZWdvcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJc2V0Q29tcGFueSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUFOQUdFUjoKLQkJCQlzZXRNYW5hZ2VyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRIT1I6Ci0JCQkJc2V0QXV0aG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXNldENyZWF0aW9uRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVWSVNJT046Ci0JCQkJc2V0UmV2aXNpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19MQVNUX1NBVkVEOgotCQkJCXNldExhc3RTYXZlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlzZXRTY2hlZHVsZUZyb21TdGFydCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBUlRfREFURToKLQkJCQlzZXRTdGFydERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJTklTSF9EQVRFOgotCQkJCXNldEZpbmlzaERhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXNldENyaXRpY2FsU2xhY2tMaW1pdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX0RJR0lUUzoKLQkJCQlzZXRDdXJyZW5jeURpZ2l0cygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTDoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sUG9zaXRpb24oKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSU5JU0hfVElNRToKLQkJCQlzZXREZWZhdWx0RmluaXNoVGltZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfREFZOgotCQkJCXNldE1pbnV0ZXNQZXJEYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJc2V0RGF5c1Blck1vbnRoKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX1RZUEU6Ci0JCQkJc2V0RGVmYXVsdFRhc2tUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUw6Ci0JCQkJc2V0RGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XT1JLX0ZPUk1BVDoKLQkJCQlzZXRXb3JrRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRURJVEFCTEVfQUNUVUFMX0NPU1RTOgotCQkJCXNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0hPTk9SX0NPTlNUUkFJTlRTOgotCQkJCXNldEhvbm9yQ29uc3RyYWludHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19JTlNFUlRFRF9QUk9KRUNUU19MSUtFX1NVTU1BUlk6Ci0JCQkJc2V0SW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlzZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FRkZPUlRfRFJJVkVOOgotCQkJCXNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRVNUSU1BVEVEOgotCQkJCXNldE5ld1Rhc2tzRXN0aW1hdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJc2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfQUNUVUFMX0NPU1Q6Ci0JCQkJc2V0U3ByZWFkQWN0dWFsQ29zdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0U3ByZWFkUGVyY2VudENvbXBsZXRlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJc2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklTQ0FMX1lFQVJfU1RBUlQ6Ci0JCQkJc2V0RmlzY2FsWWVhclN0YXJ0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XRUVLX1NUQVJUX0RBWToKLQkJCQlzZXRXZWVrU3RhcnREYXkoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0JBQ0s6Ci0JCQkJc2V0TW92ZUNvbXBsZXRlZEVuZHNCYWNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQlzZXRNb3ZlUmVtYWluaW5nU3RhcnRzQmFjaygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfRk9SV0FSRDoKLQkJCQlzZXRNb3ZlQ29tcGxldGVkRW5kc0ZvcndhcmQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXNldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOVF9EQVRFOgotCQkJCXNldEN1cnJlbnREYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXNldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9MSU5LOgotCQkJCXNldEF1dG9saW5rKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS19TVEFSVF9EQVRFOgotCQkJCXNldE5ld1Rhc2tTdGFydERhdGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXNldERlZmF1bHRUYXNrRVZNZXRob2QoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXNldFByb2plY3RFeHRlcm5hbGx5RWRpdGVkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9DUkVBVElPTl9EQVRFOgotCQkJCXNldEV4dGVuZGVkQ3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BQ1RVQUxTX0lOX1NZTkM6Ci0JCQkJc2V0QWN0dWFsc0luU3luYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlzZXRSZW1vdmVGaWxlUHJvcGVydGllcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQlzZXRBZG1pblByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX09VVExJTkVfQ09ERVM6Ci0JCQkJc2V0T3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlzZXRFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlzZXRDYWxlbmRhcnMoKENhbGVuZGFycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFU09VUkNFUzoKLQkJCQlzZXRSZXNvdXJjZXMoKFJlc291cmNlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FTU0lHTk1FTlRTOgotCQkJCXNldEFzc2lnbm1lbnRzKChBc3NpZ25tZW50cyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJc2V0VGl0bGUoVElUTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVUJKRUNUOgotCQkJCXNldFN1YmplY3QoU1VCSkVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXNldENhdGVnb3J5KENBVEVHT1JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ09NUEFOWToKLQkJCQlzZXRDb21wYW55KENPTVBBTllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXNldE1hbmFnZXIoTUFOQUdFUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVEhPUjoKLQkJCQlzZXRBdXRob3IoQVVUSE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1JFQVRJT05fREFURToKLQkJCQlzZXRDcmVhdGlvbkRhdGUoQ1JFQVRJT05fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXNldFJldmlzaW9uKFJFVklTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTEFTVF9TQVZFRDoKLQkJCQlzZXRMYXN0U2F2ZWQoTEFTVF9TQVZFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NDSEVEVUxFX0ZST01fU1RBUlQ6Ci0JCQkJdW5zZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZShTVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZShGSU5JU0hfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlzZXRGWVN0YXJ0RGF0ZShGWVNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUklUSUNBTF9TTEFDS19MSU1JVDoKLQkJCQlzZXRDcml0aWNhbFNsYWNrTGltaXQoQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5DWV9ESUdJVFM6Ci0JCQkJc2V0Q3VycmVuY3lEaWdpdHMoQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXNldEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZX1NZTUJPTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTkNZX1NZTUJPTF9QT1NJVElPTjoKLQkJCQlzZXRDdXJyZW5jeVN5bWJvbFBvc2l0aW9uKENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRChDQUxFTkRBUl9VSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQVJUX1RJTUU6Ci0JCQkJc2V0RGVmYXVsdFN0YXJ0VGltZShERUZBVUxUX1NUQVJUX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXNldERlZmF1bHRGaW5pc2hUaW1lKERFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJc2V0TWludXRlc1BlckRheShNSU5VVEVTX1BFUl9EQVlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9XRUVLOgotCQkJCXNldE1pbnV0ZXNQZXJXZWVrKE1JTlVURVNfUEVSX1dFRUtfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EQVlTX1BFUl9NT05USDoKLQkJCQlzZXREYXlzUGVyTW9udGgoREFZU19QRVJfTU9OVEhfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQl1bnNldERlZmF1bHRUYXNrVHlwZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbChERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBTkRBUkRfUkFURToKLQkJCQl1bnNldERlZmF1bHRTdGFuZGFyZFJhdGUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9PVkVSVElNRV9SQVRFOgotCQkJCXVuc2V0RGVmYXVsdE92ZXJ0aW1lUmF0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJc2V0V29ya0Zvcm1hdChXT1JLX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQl1bnNldEVkaXRhYmxlQWN0dWFsQ29zdHMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJdW5zZXRIb25vckNvbnN0cmFpbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQl1bnNldEluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQl1bnNldE11bHRpcGxlQ3JpdGljYWxQYXRocygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldE5ld1Rhc2tzRWZmb3J0RHJpdmVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJdW5zZXROZXdUYXNrc0VzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJdW5zZXRTcGxpdHNJblByb2dyZXNzVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXVuc2V0U3ByZWFkQWN0dWFsQ29zdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQl1bnNldFNwcmVhZFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJdW5zZXRUYXNrVXBkYXRlc1Jlc291cmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXVuc2V0RmlzY2FsWWVhclN0YXJ0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXNldFdlZWtTdGFydERheShXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfQ09NUExFVEVEX0VORFNfQkFDSzoKLQkJCQl1bnNldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX1JFTUFJTklOR19TVEFSVFNfQkFDSzoKLQkJCQl1bnNldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19GT1JXQVJEOgotCQkJCXVuc2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0JBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUU6Ci0JCQkJc2V0QmFzZWxpbmVGb3JFYXJuZWRWYWx1ZShCQVNFTElORV9GT1JfRUFSTkVEX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUT19BRERfTkVXX1JFU09VUkNFU19BTkRfVEFTS1M6Ci0JCQkJdW5zZXRBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1RBVFVTX0RBVEU6Ci0JCQkJc2V0U3RhdHVzRGF0ZShTVEFUVVNfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NVUlJFTlRfREFURToKLQkJCQlzZXRDdXJyZW50RGF0ZShDVVJSRU5UX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXVuc2V0TWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQl1bnNldEF1dG9saW5rKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJc2V0TmV3VGFza1N0YXJ0RGF0ZShORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREVGQVVMVF9UQVNLX0VWX01FVEhPRDoKLQkJCQlzZXREZWZhdWx0VGFza0VWTWV0aG9kKERFRkFVTFRfVEFTS19FVl9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19QUk9KRUNUX0VYVEVSTkFMTFlfRURJVEVEOgotCQkJCXVuc2V0UHJvamVjdEV4dGVybmFsbHlFZGl0ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRVhURU5ERURfQ1JFQVRJT05fREFURToKLQkJCQlzZXRFeHRlbmRlZENyZWF0aW9uRGF0ZShFWFRFTkRFRF9DUkVBVElPTl9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQUNUVUFMU19JTl9TWU5DOgotCQkJCXVuc2V0QWN0dWFsc0luU3luYygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19SRU1PVkVfRklMRV9QUk9QRVJUSUVTOgotCQkJCXVuc2V0UmVtb3ZlRmlsZVByb3BlcnRpZXMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQURNSU5fUFJPSkVDVDoKLQkJCQl1bnNldEFkbWluUHJvamVjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19PVVRMSU5FX0NPREVTOgotCQkJCXNldE91dGxpbmVDb2RlcygoT3V0bGluZUNvZGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19XQlNfTUFTS1M6Ci0JCQkJc2V0V0JTTWFza3MoKFdCU01hc2tzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19FWFRFTkRFRF9BVFRSSUJVVEVTOgotCQkJCXNldEV4dGVuZGVkQXR0cmlidXRlcygoRXh0ZW5kZWRBdHRyaWJ1dGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DQUxFTkRBUlM6Ci0JCQkJc2V0Q2FsZW5kYXJzKChDYWxlbmRhcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1RBU0tTOgotCQkJCXNldFRhc2tzKChUYXNrcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXNldFJlc291cmNlcygoUmVzb3VyY2VzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlzZXRBc3NpZ25tZW50cygoQXNzaWdubWVudHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVElUTEU6Ci0JCQkJcmV0dXJuIFRJVExFX0VERUZBVUxUID09IG51bGwgPyB0aXRsZSAhPSBudWxsIDogIVRJVExFX0VERUZBVUxULmVxdWFscyh0aXRsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1VCSkVDVDoKLQkJCQlyZXR1cm4gU1VCSkVDVF9FREVGQVVMVCA9PSBudWxsID8gc3ViamVjdCAhPSBudWxsIDogIVNVQkpFQ1RfRURFRkFVTFQuZXF1YWxzKHN1YmplY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBVEVHT1JZOgotCQkJCXJldHVybiBDQVRFR09SWV9FREVGQVVMVCA9PSBudWxsID8gY2F0ZWdvcnkgIT0gbnVsbCA6ICFDQVRFR09SWV9FREVGQVVMVC5lcXVhbHMoY2F0ZWdvcnkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NPTVBBTlk6Ci0JCQkJcmV0dXJuIENPTVBBTllfRURFRkFVTFQgPT0gbnVsbCA/IGNvbXBhbnkgIT0gbnVsbCA6ICFDT01QQU5ZX0VERUZBVUxULmVxdWFscyhjb21wYW55KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NQU5BR0VSOgotCQkJCXJldHVybiBNQU5BR0VSX0VERUZBVUxUID09IG51bGwgPyBtYW5hZ2VyICE9IG51bGwgOiAhTUFOQUdFUl9FREVGQVVMVC5lcXVhbHMobWFuYWdlcik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQVVUSE9SOgotCQkJCXJldHVybiBBVVRIT1JfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvciAhPSBudWxsIDogIUFVVEhPUl9FREVGQVVMVC5lcXVhbHMoYXV0aG9yKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1JFVklTSU9OOgotCQkJCXJldHVybiBSRVZJU0lPTl9FREVGQVVMVCA9PSBudWxsID8gcmV2aXNpb24gIT0gbnVsbCA6ICFSRVZJU0lPTl9FREVGQVVMVC5lcXVhbHMocmV2aXNpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0xBU1RfU0FWRUQ6Ci0JCQkJcmV0dXJuIExBU1RfU0FWRURfRURFRkFVTFQgPT0gbnVsbCA/IGxhc3RTYXZlZCAhPSBudWxsIDogIUxBU1RfU0FWRURfRURFRkFVTFQuZXF1YWxzKGxhc3RTYXZlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU0NIRURVTEVfRlJPTV9TVEFSVDoKLQkJCQlyZXR1cm4gaXNTZXRTY2hlZHVsZUZyb21TdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsIDogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRklOSVNIX0RBVEU6Ci0JCQkJcmV0dXJuIEZJTklTSF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2hEYXRlICE9IG51bGwgOiAhRklOSVNIX0RBVEVfRURFRkFVTFQuZXF1YWxzKGZpbmlzaERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZZU1RBUlRfREFURToKLQkJCQlyZXR1cm4gRllTVEFSVF9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmWVN0YXJ0RGF0ZSAhPSBudWxsIDogIUZZU1RBUlRfREFURV9FREVGQVVMVC5lcXVhbHMoZllTdGFydERhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NSSVRJQ0FMX1NMQUNLX0xJTUlUOgotCQkJCXJldHVybiBDUklUSUNBTF9TTEFDS19MSU1JVF9FREVGQVVMVCA9PSBudWxsID8gY3JpdGljYWxTbGFja0xpbWl0ICE9IG51bGwgOiAhQ1JJVElDQUxfU0xBQ0tfTElNSVRfRURFRkFVTFQuZXF1YWxzKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfRElHSVRTOgotCQkJCXJldHVybiBDVVJSRU5DWV9ESUdJVFNfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5RGlnaXRzICE9IG51bGwgOiAhQ1VSUkVOQ1lfRElHSVRTX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeURpZ2l0cyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sICE9IG51bGwgOiAhQ1VSUkVOQ1lfU1lNQk9MX0VERUZBVUxULmVxdWFscyhjdXJyZW5jeVN5bWJvbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OOgotCQkJCXJldHVybiBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGN1cnJlbmN5U3ltYm9sUG9zaXRpb24gIT0gbnVsbCA6ICFDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fRURFRkFVTFQuZXF1YWxzKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSX1VJRDoKLQkJCQlyZXR1cm4gQ0FMRU5EQVJfVUlEX0VERUZBVUxUID09IG51bGwgPyBjYWxlbmRhclVJRCAhPSBudWxsIDogIUNBTEVOREFSX1VJRF9FREVGQVVMVC5lcXVhbHMoY2FsZW5kYXJVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfU1RBUlRfVElNRToKLQkJCQlyZXR1cm4gREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0U3RhcnRUaW1lICE9IG51bGwgOiAhREVGQVVMVF9TVEFSVF9USU1FX0VERUZBVUxULmVxdWFscyhkZWZhdWx0U3RhcnRUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJTklTSF9USU1FOgotCQkJCXJldHVybiBERUZBVUxUX0ZJTklTSF9USU1FX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0RmluaXNoVGltZSAhPSBudWxsIDogIURFRkFVTFRfRklOSVNIX1RJTUVfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSU5VVEVTX1BFUl9EQVk6Ci0JCQkJcmV0dXJuIE1JTlVURVNfUEVSX0RBWV9FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlckRheSAhPSBudWxsIDogIU1JTlVURVNfUEVSX0RBWV9FREVGQVVMVC5lcXVhbHMobWludXRlc1BlckRheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTUlOVVRFU19QRVJfV0VFSzoKLQkJCQlyZXR1cm4gTUlOVVRFU19QRVJfV0VFS19FREVGQVVMVCA9PSBudWxsID8gbWludXRlc1BlcldlZWsgIT0gbnVsbCA6ICFNSU5VVEVTX1BFUl9XRUVLX0VERUZBVUxULmVxdWFscyhtaW51dGVzUGVyV2Vlayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fREFZU19QRVJfTU9OVEg6Ci0JCQkJcmV0dXJuIERBWVNfUEVSX01PTlRIX0VERUZBVUxUID09IG51bGwgPyBkYXlzUGVyTW9udGggIT0gbnVsbCA6ICFEQVlTX1BFUl9NT05USF9FREVGQVVMVC5lcXVhbHMoZGF5c1Blck1vbnRoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0VGFza1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRGaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRGaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1NUQU5EQVJEX1JBVEU6Ci0JCQkJcmV0dXJuIGlzU2V0RGVmYXVsdFN0YW5kYXJkUmF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0RFRkFVTFRfT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gaXNTZXREZWZhdWx0T3ZlcnRpbWVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV09SS19GT1JNQVQ6Ci0JCQkJcmV0dXJuIFdPUktfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyB3b3JrRm9ybWF0ICE9IG51bGwgOiAhV09SS19GT1JNQVRfRURFRkFVTFQuZXF1YWxzKHdvcmtGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VESVRBQkxFX0FDVFVBTF9DT1NUUzoKLQkJCQlyZXR1cm4gaXNTZXRFZGl0YWJsZUFjdHVhbENvc3RzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fSE9OT1JfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIGlzU2V0SG9ub3JDb25zdHJhaW50cygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IGVhcm5lZFZhbHVlTWV0aG9kICE9IG51bGwgOiAhRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZWFybmVkVmFsdWVNZXRob2QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0lOU0VSVEVEX1BST0pFQ1RTX0xJS0VfU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTZXRJbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NVUxUSVBMRV9DUklUSUNBTF9QQVRIUzoKLQkJCQlyZXR1cm4gaXNTZXRNdWx0aXBsZUNyaXRpY2FsUGF0aHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ORVdfVEFTS1NfRUZGT1JUX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXROZXdUYXNrc0VmZm9ydERyaXZlbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLU19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0TmV3VGFza3NFc3RpbWF0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUExJVFNfSU5fUFJPR1JFU1NfVEFTS1M6Ci0JCQkJcmV0dXJuIGlzU2V0U3BsaXRzSW5Qcm9ncmVzc1Rhc2tzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fU1BSRUFEX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBpc1NldFNwcmVhZEFjdHVhbENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19TUFJFQURfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gaXNTZXRTcHJlYWRQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19UQVNLX1VQREFURVNfUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0VGFza1VwZGF0ZXNSZXNvdXJjZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0ZJU0NBTF9ZRUFSX1NUQVJUOgotCQkJCXJldHVybiBpc1NldEZpc2NhbFllYXJTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1dFRUtfU1RBUlRfREFZOgotCQkJCXJldHVybiBXRUVLX1NUQVJUX0RBWV9FREVGQVVMVCA9PSBudWxsID8gd2Vla1N0YXJ0RGF5ICE9IG51bGwgOiAhV0VFS19TVEFSVF9EQVlfRURFRkFVTFQuZXF1YWxzKHdlZWtTdGFydERheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9DT01QTEVURURfRU5EU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVDb21wbGV0ZWRFbmRzQmFjaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX01PVkVfUkVNQUlOSU5HX1NUQVJUU19CQUNLOgotCQkJCXJldHVybiBpc1NldE1vdmVSZW1haW5pbmdTdGFydHNCYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fTU9WRV9SRU1BSU5JTkdfU1RBUlRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NT1ZFX0NPTVBMRVRFRF9FTkRTX0ZPUldBUkQ6Ci0JCQkJcmV0dXJuIGlzU2V0TW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRToKLQkJCQlyZXR1cm4gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSAhPSBudWxsIDogIUJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGJhc2VsaW5lRm9yRWFybmVkVmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FVVE9fQUREX05FV19SRVNPVVJDRVNfQU5EX1RBU0tTOgotCQkJCXJldHVybiBpc1NldEF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX1NUQVRVU19EQVRFOgotCQkJCXJldHVybiBTVEFUVVNfREFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhdHVzRGF0ZSAhPSBudWxsIDogIVNUQVRVU19EQVRFX0VERUZBVUxULmVxdWFscyhzdGF0dXNEYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19DVVJSRU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENVUlJFTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY3VycmVudERhdGUgIT0gbnVsbCA6ICFDVVJSRU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGN1cnJlbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19NSUNST1NPRlRfUFJPSkVDVF9TRVJWRVJfVVJMOgotCQkJCXJldHVybiBpc1NldE1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BVVRPTElOSzoKLQkJCQlyZXR1cm4gaXNTZXRBdXRvbGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX05FV19UQVNLX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIE5FV19UQVNLX1NUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG5ld1Rhc2tTdGFydERhdGUgIT0gbnVsbCA6ICFORVdfVEFTS19TVEFSVF9EQVRFX0VERUZBVUxULmVxdWFscyhuZXdUYXNrU3RhcnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19ERUZBVUxUX1RBU0tfRVZfTUVUSE9EOgotCQkJCXJldHVybiBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0VGFza0VWTWV0aG9kICE9IG51bGwgOiAhREVGQVVMVF9UQVNLX0VWX01FVEhPRF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdFRhc2tFVk1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUFJPSkVDVF9FWFRFUk5BTExZX0VESVRFRDoKLQkJCQlyZXR1cm4gaXNTZXRQcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0NSRUFUSU9OX0RBVEU6Ci0JCQkJcmV0dXJuIEVYVEVOREVEX0NSRUFUSU9OX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVuZGVkQ3JlYXRpb25EYXRlICE9IG51bGwgOiAhRVhURU5ERURfQ1JFQVRJT05fREFURV9FREVGQVVMVC5lcXVhbHMoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FDVFVBTFNfSU5fU1lOQzoKLQkJCQlyZXR1cm4gaXNTZXRBY3R1YWxzSW5TeW5jKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVNT1ZFX0ZJTEVfUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gaXNTZXRSZW1vdmVGaWxlUHJvcGVydGllcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0FETUlOX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0QWRtaW5Qcm9qZWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fT1VUTElORV9DT0RFUzoKLQkJCQlyZXR1cm4gb3V0bGluZUNvZGVzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fV0JTX01BU0tTOgotCQkJCXJldHVybiB3QlNNYXNrcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0VYVEVOREVEX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBST0pFQ1RfX0NBTEVOREFSUzoKLQkJCQlyZXR1cm4gY2FsZW5kYXJzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fVEFTS1M6Ci0JCQkJcmV0dXJuIHRhc2tzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVF9fUkVTT1VSQ0VTOgotCQkJCXJldHVybiByZXNvdXJjZXMgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUX19BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gYXNzaWdubWVudHMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0aXRsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGl0bGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1YmplY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YmplY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGVnb3J5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXRlZ29yeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29tcGFueTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29tcGFueSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFuYWdlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFuYWdlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdXRob3IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRpb25EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXZpc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmV2aXNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhc3RTYXZlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGFzdFNhdmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlZHVsZUZyb21TdGFydDogIik7Ci0JCWlmIChzY2hlZHVsZUZyb21TdGFydEVTZXQpIHJlc3VsdC5hcHBlbmQoc2NoZWR1bGVGcm9tU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZllTdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZZU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjcml0aWNhbFNsYWNrTGltaXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyaXRpY2FsU2xhY2tMaW1pdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVuY3lEaWdpdHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5RGlnaXRzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjdXJyZW5jeVN5bWJvbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3VycmVuY3lTeW1ib2wpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGN1cnJlbmN5U3ltYm9sUG9zaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbmN5U3ltYm9sUG9zaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhbGVuZGFyVUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWxlbmRhclVJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFN0YXJ0VGltZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YXJ0VGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdEZpbmlzaFRpbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRGaW5pc2hUaW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyRGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGVzUGVyRGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaW51dGVzUGVyV2VlazogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWludXRlc1BlcldlZWspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRheXNQZXJNb250aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF5c1Blck1vbnRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza1R5cGU6ICIpOwotCQlpZiAoZGVmYXVsdFRhc2tUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza1R5cGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRTdGFuZGFyZFJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdFN0YW5kYXJkUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdFN0YW5kYXJkUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRPdmVydGltZVJhdGU6ICIpOwotCQlpZiAoZGVmYXVsdE92ZXJ0aW1lUmF0ZUVTZXQpIHJlc3VsdC5hcHBlbmQoZGVmYXVsdE92ZXJ0aW1lUmF0ZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uRm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbkZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya0Zvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0Zvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWRpdGFibGVBY3R1YWxDb3N0czogIik7Ci0JCWlmIChlZGl0YWJsZUFjdHVhbENvc3RzRVNldCkgcmVzdWx0LmFwcGVuZChlZGl0YWJsZUFjdHVhbENvc3RzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaG9ub3JDb25zdHJhaW50czogIik7Ci0JCWlmIChob25vckNvbnN0cmFpbnRzRVNldCkgcmVzdWx0LmFwcGVuZChob25vckNvbnN0cmFpbnRzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWFybmVkVmFsdWVNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVhcm5lZFZhbHVlTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnk6ICIpOwotCQlpZiAoaW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChpbnNlcnRlZFByb2plY3RzTGlrZVN1bW1hcnkpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtdWx0aXBsZUNyaXRpY2FsUGF0aHM6ICIpOwotCQlpZiAobXVsdGlwbGVDcml0aWNhbFBhdGhzRVNldCkgcmVzdWx0LmFwcGVuZChtdWx0aXBsZUNyaXRpY2FsUGF0aHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VmZm9ydERyaXZlbjogIik7Ci0JCWlmIChuZXdUYXNrc0VmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFZmZvcnREcml2ZW4pOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrc0VzdGltYXRlZDogIik7Ci0JCWlmIChuZXdUYXNrc0VzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQobmV3VGFza3NFc3RpbWF0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcGxpdHNJblByb2dyZXNzVGFza3M6ICIpOwotCQlpZiAoc3BsaXRzSW5Qcm9ncmVzc1Rhc2tzRVNldCkgcmVzdWx0LmFwcGVuZChzcGxpdHNJblByb2dyZXNzVGFza3MpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRBY3R1YWxDb3N0OiAiKTsKLQkJaWYgKHNwcmVhZEFjdHVhbENvc3RFU2V0KSByZXN1bHQuYXBwZW5kKHNwcmVhZEFjdHVhbENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzcHJlYWRQZXJjZW50Q29tcGxldGU6ICIpOwotCQlpZiAoc3ByZWFkUGVyY2VudENvbXBsZXRlRVNldCkgcmVzdWx0LmFwcGVuZChzcHJlYWRQZXJjZW50Q29tcGxldGUpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YXNrVXBkYXRlc1Jlc291cmNlOiAiKTsKLQkJaWYgKHRhc2tVcGRhdGVzUmVzb3VyY2VFU2V0KSByZXN1bHQuYXBwZW5kKHRhc2tVcGRhdGVzUmVzb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXNjYWxZZWFyU3RhcnQ6ICIpOwotCQlpZiAoZmlzY2FsWWVhclN0YXJ0RVNldCkgcmVzdWx0LmFwcGVuZChmaXNjYWxZZWFyU3RhcnQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3ZWVrU3RhcnREYXk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdlZWtTdGFydERheSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNCYWNrOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzQmFja0VTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2s6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2tFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNCYWNrKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmQ6ICIpOwotCQlpZiAobW92ZVJlbWFpbmluZ1N0YXJ0c0ZvcndhcmRFU2V0KSByZXN1bHQuYXBwZW5kKG1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkOiAiKTsKLQkJaWYgKG1vdmVDb21wbGV0ZWRFbmRzRm9yd2FyZEVTZXQpIHJlc3VsdC5hcHBlbmQobW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzOiAiKTsKLQkJaWYgKGF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrc0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b0FkZE5ld1Jlc291cmNlc0FuZFRhc2tzKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhdHVzRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhdHVzRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3VycmVudERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1cnJlbnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWNyb3NvZnRQcm9qZWN0U2VydmVyVVJMOiAiKTsKLQkJaWYgKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkxFU2V0KSByZXN1bHQuYXBwZW5kKG1pY3Jvc29mdFByb2plY3RTZXJ2ZXJVUkwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdXRvbGluazogIik7Ci0JCWlmIChhdXRvbGlua0VTZXQpIHJlc3VsdC5hcHBlbmQoYXV0b2xpbmspOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuZXdUYXNrU3RhcnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuZXdUYXNrU3RhcnREYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VGFza0VWTWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0VGFza0VWTWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZDogIik7Ci0JCWlmIChwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQocHJvamVjdEV4dGVybmFsbHlFZGl0ZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlbmRlZENyZWF0aW9uRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZW5kZWRDcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbHNJblN5bmM6ICIpOwotCQlpZiAoYWN0dWFsc0luU3luY0VTZXQpIHJlc3VsdC5hcHBlbmQoYWN0dWFsc0luU3luYyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbW92ZUZpbGVQcm9wZXJ0aWVzOiAiKTsKLQkJaWYgKHJlbW92ZUZpbGVQcm9wZXJ0aWVzRVNldCkgcmVzdWx0LmFwcGVuZChyZW1vdmVGaWxlUHJvcGVydGllcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkbWluUHJvamVjdDogIik7Ci0JCWlmIChhZG1pblByb2plY3RFU2V0KSByZXN1bHQuYXBwZW5kKGFkbWluUHJvamVjdCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9qZWN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1JhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjZGFmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJhdGVJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFJhdGVzRnJvbSA8ZW0+UmF0ZXMgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldFJhdGVzVG8gPGVtPlJhdGVzIFRvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0UmF0ZVRhYmxlIDxlbT5SYXRlIFRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0U3RhbmRhcmRSYXRlIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmF0ZUltcGwjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0IDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldE92ZXJ0aW1lUmF0ZSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SYXRlSW1wbCNnZXRDb3N0UGVyVXNlIDxlbT5Db3N0IFBlciBVc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXRlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgUmF0ZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzRnJvbSgpIDxlbT5SYXRlcyBGcm9tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlc0Zyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJBVEVTX0ZST01fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZXNGcm9tKCkgPGVtPlJhdGVzIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzRnJvbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByYXRlc0Zyb20gPSBSQVRFU19GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzVG8oKSA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJBVEVTX1RPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzVG8oKSA8ZW0+UmF0ZXMgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGVzVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmF0ZXNUbyA9IFJBVEVTX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVUYWJsZSgpIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBSQVRFX1RBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVUYWJsZSgpIDxlbT5SYXRlIFRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHJhdGVUYWJsZSA9IFJBVEVfVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFNUQU5EQVJEX1JBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlKCkgPGVtPlN0YW5kYXJkIFJhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgc3RhbmRhcmRSYXRlID0gU1RBTkRBUkRfUkFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIDxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGUoKSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgT1ZFUlRJTUVfUkFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGUoKSA8ZW0+T3ZlcnRpbWUgUmF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBvdmVydGltZVJhdGUgPSBPVkVSVElNRV9SQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIDxlbT5PdmVydGltZSBSYXRlIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdCA9IE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9QRVJfVVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RQZXJVc2UoKSA8ZW0+Q29zdCBQZXIgVXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0UGVyVXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBjb3N0UGVyVXNlID0gQ09TVF9QRVJfVVNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmF0ZXNGcm9tKCkgewotCQlyZXR1cm4gcmF0ZXNGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzRnJvbShPYmplY3QgbmV3UmF0ZXNGcm9tKSB7Ci0JCU9iamVjdCBvbGRSYXRlc0Zyb20gPSByYXRlc0Zyb207Ci0JCXJhdGVzRnJvbSA9IG5ld1JhdGVzRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NLCBvbGRSYXRlc0Zyb20sIHJhdGVzRnJvbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmF0ZXNUbygpIHsKLQkJcmV0dXJuIHJhdGVzVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmF0ZXNUbyhPYmplY3QgbmV3UmF0ZXNUbykgewotCQlPYmplY3Qgb2xkUmF0ZXNUbyA9IHJhdGVzVG87Ci0JCXJhdGVzVG8gPSBuZXdSYXRlc1RvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPLCBvbGRSYXRlc1RvLCByYXRlc1RvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UmF0ZVRhYmxlKCkgewotCQlyZXR1cm4gcmF0ZVRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVUYWJsZShCaWdJbnRlZ2VyIG5ld1JhdGVUYWJsZSkgewotCQlCaWdJbnRlZ2VyIG9sZFJhdGVUYWJsZSA9IHJhdGVUYWJsZTsKLQkJcmF0ZVRhYmxlID0gbmV3UmF0ZVRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEUsIG9sZFJhdGVUYWJsZSwgcmF0ZVRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIG5ld1N0YW5kYXJkUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZFN0YW5kYXJkUmF0ZSA9IHN0YW5kYXJkUmF0ZTsKLQkJc3RhbmRhcmRSYXRlID0gbmV3U3RhbmRhcmRSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEUsIG9sZFN0YW5kYXJkUmF0ZSwgc3RhbmRhcmRSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld1N0YW5kYXJkUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCA9IHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJc3RhbmRhcmRSYXRlRm9ybWF0ID0gbmV3U3RhbmRhcmRSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFULCBvbGRTdGFuZGFyZFJhdGVGb3JtYXQsIHN0YW5kYXJkUmF0ZUZvcm1hdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lUmF0ZSgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGUoQmlnRGVjaW1hbCBuZXdPdmVydGltZVJhdGUpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZVJhdGUgPSBvdmVydGltZVJhdGU7Ci0JCW92ZXJ0aW1lUmF0ZSA9IG5ld092ZXJ0aW1lUmF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFLCBvbGRPdmVydGltZVJhdGUsIG92ZXJ0aW1lUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZVJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdPdmVydGltZVJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRPdmVydGltZVJhdGVGb3JtYXQgPSBvdmVydGltZVJhdGVGb3JtYXQ7Ci0JCW92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG5ld092ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCwgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0LCBvdmVydGltZVJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRDb3N0UGVyVXNlKCkgewotCQlyZXR1cm4gY29zdFBlclVzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3N0UGVyVXNlKEJpZ0RlY2ltYWwgbmV3Q29zdFBlclVzZSkgewotCQlCaWdEZWNpbWFsIG9sZENvc3RQZXJVc2UgPSBjb3N0UGVyVXNlOwotCQljb3N0UGVyVXNlID0gbmV3Q29zdFBlclVzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0UsIG9sZENvc3RQZXJVc2UsIGNvc3RQZXJVc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlyZXR1cm4gZ2V0UmF0ZXNGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJcmV0dXJuIGdldFJhdGVzVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXJldHVybiBnZXRSYXRlVGFibGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURToKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX0NPU1RfUEVSX1VTRToKLQkJCQlyZXR1cm4gZ2V0Q29zdFBlclVzZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFU19GUk9NOgotCQkJCXNldFJhdGVzRnJvbSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJc2V0UmF0ZXNUbygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURV9UQUJMRToKLQkJCQlzZXRSYXRlVGFibGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZSgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fQ09TVF9QRVJfVVNFOgotCQkJCXNldENvc3RQZXJVc2UoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfRlJPTToKLQkJCQlzZXRSYXRlc0Zyb20oUkFURVNfRlJPTV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX1RPOgotCQkJCXNldFJhdGVzVG8oUkFURVNfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19SQVRFX1RBQkxFOgotCQkJCXNldFJhdGVUYWJsZShSQVRFX1RBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlzZXRTdGFuZGFyZFJhdGUoU1RBTkRBUkRfUkFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdChTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlKE9WRVJUSU1FX1JBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlzZXRPdmVydGltZVJhdGVGb3JtYXQoT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJc2V0Q29zdFBlclVzZShDT1NUX1BFUl9VU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVTX0ZST006Ci0JCQkJcmV0dXJuIFJBVEVTX0ZST01fRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVzRnJvbSAhPSBudWxsIDogIVJBVEVTX0ZST01fRURFRkFVTFQuZXF1YWxzKHJhdGVzRnJvbSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fUkFURVNfVE86Ci0JCQkJcmV0dXJuIFJBVEVTX1RPX0VERUZBVUxUID09IG51bGwgPyByYXRlc1RvICE9IG51bGwgOiAhUkFURVNfVE9fRURFRkFVTFQuZXF1YWxzKHJhdGVzVG8pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX1JBVEVfVEFCTEU6Ci0JCQkJcmV0dXJuIFJBVEVfVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHJhdGVUYWJsZSAhPSBudWxsIDogIVJBVEVfVEFCTEVfRURFRkFVTFQuZXF1YWxzKHJhdGVUYWJsZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19TVEFOREFSRF9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YW5kYXJkUmF0ZUZvcm1hdCAhPSBudWxsIDogIVNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhzdGFuZGFyZFJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfX09WRVJUSU1FX1JBVEU6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZSAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRURFRkFVTFQuZXF1YWxzKG92ZXJ0aW1lUmF0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIE9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGVGb3JtYXQgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFBlclVzZSAhPSBudWxsIDogIUNPU1RfUEVSX1VTRV9FREVGQVVMVC5lcXVhbHMoY29zdFBlclVzZSk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyYXRlc0Zyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJhdGVzRnJvbSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmF0ZXNUbzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmF0ZXNUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmF0ZVRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYXRlVGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0UGVyVXNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3N0UGVyVXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmF0ZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SYXRlc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcyYzA1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmF0ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSYXRlc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SYXRlczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJhdGVzSW1wbCNnZXRSYXRlIDxlbT5SYXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmF0ZXNJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSYXRlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmF0ZSgpIDxlbT5SYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByYXRlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSYXRlc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSYXRlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSYXRlKCkgewotCQlpZiAocmF0ZSA9PSBudWxsKSB7Ci0JCQlyYXRlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJhdGUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkFURVNfX1JBVEUpOwotCQl9Ci0JCXJldHVybiByYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSYXRlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlyZXR1cm4gZ2V0UmF0ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SQVRFU19fUkFURToKLQkJCQlnZXRSYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRSYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCWdldFJhdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVTX19SQVRFOgotCQkJCXJldHVybiByYXRlICE9IG51bGwgJiYgIXJhdGUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9SYXRlc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyN2Q3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjE1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVzb3VyY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VUlEIDxlbT5VSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SUQgPGVtPklEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNpc0lzTnVsbCA8ZW0+SXMgTnVsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRJbml0aWFscyA8ZW0+SW5pdGlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGhvbmV0aWNzIDxlbT5QaG9uZXRpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0TlRBY2NvdW50IDxlbT5OVCBBY2NvdW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1hdGVyaWFsTGFiZWwgPGVtPk1hdGVyaWFsIExhYmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvZGUgPGVtPkNvZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFdvcmtHcm91cCA8ZW0+V29yayBHcm91cDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFbWFpbEFkZHJlc3MgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcyA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE1heFVuaXRzIDxlbT5NYXggVW5pdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVha1VuaXRzIDxlbT5QZWFrIFVuaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzT3ZlckFsbG9jYXRlZCA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlRnJvbSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QXZhaWxhYmxlVG8gPGVtPkF2YWlsYWJsZSBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0RmluaXNoIDxlbT5GaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNDYW5MZXZlbCA8ZW0+Q2FuIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFjY3J1ZUF0IDxlbT5BY2NydWUgQXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29yayA8ZW0+V29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZWd1bGFyV29yayA8ZW0+UmVndWxhciBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrIDxlbT5BY3R1YWwgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRSZW1haW5pbmdXb3JrIDxlbT5SZW1haW5pbmcgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFN0YW5kYXJkUmF0ZSA8ZW0+U3RhbmRhcmQgUmF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTdGFuZGFyZFJhdGVGb3JtYXQgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3QgPGVtPkNvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVSYXRlIDxlbT5PdmVydGltZSBSYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0T3ZlcnRpbWVDb3N0IDxlbT5PdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RQZXJVc2UgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxDb3N0IDxlbT5BY3R1YWwgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ0Nvc3QgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0V29ya1ZhcmlhbmNlIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENvc3RWYXJpYW5jZSA8ZW0+Q29zdCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRTViA8ZW0+U1Y8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEFDV1AgPGVtPkFDV1A8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Q2FsZW5kYXJVSUQgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXROb3RlcyA8ZW0+Tm90ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QkNXUyA8ZW0+QkNXUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRCQ1dQIDxlbT5CQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNHZW5lcmljIDxlbT5JcyBHZW5lcmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2lzSXNJbmFjdGl2ZSA8ZW0+SXMgSW5hY3RpdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjaXNJc0VudGVycHJpc2UgPGVtPklzIEVudGVycHJpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0Qm9va2luZ1R5cGUgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZUltcGwjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCA8ZW0+QWN0aXZlIERpcmVjdG9yeSBHVUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldENyZWF0aW9uRGF0ZSA8ZW0+Q3JlYXRpb24gRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRFeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEJhc2VsaW5lIDxlbT5CYXNlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldEF2YWlsYWJpbGl0eVBlcmlvZHMgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuUmVzb3VyY2VJbXBsI2dldFJhdGVzIDxlbT5SYXRlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlJlc291cmNlSW1wbCNnZXRUaW1lcGhhc2VkRGF0YSA8ZW0+VGltZXBoYXNlZCBEYXRhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBSZXNvdXJjZSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFVJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVSUQoKSA8ZW0+VUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHVJRCA9IFVJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJRCgpIDxlbT5JRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGlEID0gSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc051bGwoKSA8ZW0+SXMgTnVsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc051bGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19OVUxMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgTnVsbCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOdWxsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluaXRpYWxzKCkgPGVtPkluaXRpYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbml0aWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbHMoKSA8ZW0+SW5pdGlhbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxzID0gSU5JVElBTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQSE9ORVRJQ1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGhvbmV0aWNzKCkgPGVtPlBob25ldGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGhvbmV0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBob25ldGljcyA9IFBIT05FVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROVEFjY291bnQoKSA8ZW0+TlQgQWNjb3VudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TlRBY2NvdW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOVEFDQ09VTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TlRBY2NvdW50KCkgPGVtPk5UIEFjY291bnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5UQWNjb3VudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuVEFjY291bnQgPSBOVEFDQ09VTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFURVJJQUxfTEFCRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF0ZXJpYWxMYWJlbCgpIDxlbT5NYXRlcmlhbCBMYWJlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWF0ZXJpYWxMYWJlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXRlcmlhbExhYmVsID0gTUFURVJJQUxfTEFCRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29kZSgpIDxlbT5Db2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvZGUoKSA8ZW0+Q29kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb2RlID0gQ09ERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwKCkgPGVtPkdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBncm91cCA9IEdST1VQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBXT1JLX0dST1VQX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtHcm91cCgpIDxlbT5Xb3JrIEdyb3VwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrR3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHdvcmtHcm91cCA9IFdPUktfR1JPVVBfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW1haWxBZGRyZXNzKCkgPGVtPkVtYWlsIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVtYWlsQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUxfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbWFpbEFkZHJlc3MoKSA8ZW0+RW1haWwgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1haWxBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVtYWlsQWRkcmVzcyA9IEVNQUlMX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rKCkgPGVtPkh5cGVybGluazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGluayA9IEhZUEVSTElOS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkgPGVtPkh5cGVybGluayBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua0FkZHJlc3MgPSBIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3MgPSBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBNQVhfVU5JVFNfRURFRkFVTFQgPSAxLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VW5pdHMoKSA8ZW0+TWF4IFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXhVbml0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IG1heFVuaXRzID0gTUFYX1VOSVRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBNYXggVW5pdHMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1heFVuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlYWtVbml0cygpIDxlbT5QZWFrIFVuaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZWFrVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgUEVBS19VTklUU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZWFrVW5pdHMoKSA8ZW0+UGVhayBVbml0czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGVha1VuaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgcGVha1VuaXRzID0gUEVBS19VTklUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUGVhayBVbml0cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVha1VuaXRzRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzT3ZlckFsbG9jYXRlZCgpIDxlbT5PdmVyIEFsbG9jYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNPdmVyQWxsb2NhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkID0gT1ZFUl9BTExPQ0FURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIE92ZXIgQWxsb2NhdGVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZUZyb20oKSA8ZW0+QXZhaWxhYmxlIEZyb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZUZyb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYXZhaWxhYmxlRnJvbSA9IEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF2YWlsYWJsZVRvKCkgPGVtPkF2YWlsYWJsZSBUbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXZhaWxhYmxlVG8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFWQUlMQUJMRV9UT19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFibGVUbygpIDxlbT5BdmFpbGFibGUgVG88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF2YWlsYWJsZVRvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGF2YWlsYWJsZVRvID0gQVZBSUxBQkxFX1RPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0NhbkxldmVsKCkgPGVtPkNhbiBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYW5MZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBTl9MRVZFTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYW5MZXZlbCgpIDxlbT5DYW4gTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FuTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDYW4gTGV2ZWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkxldmVsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY3J1ZUF0KCkgPGVtPkFjY3J1ZSBBdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjcnVlQXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBBQ0NSVUVfQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjcnVlQXQoKSA8ZW0+QWNjcnVlIEF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2NydWVBdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYWNjcnVlQXQgPSBBQ0NSVUVfQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWd1bGFyV29yaygpIDxlbT5SZWd1bGFyIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZ3VsYXJXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRUdVTEFSX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWd1bGFyV29yayA9IFJFR1VMQVJfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBPVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lV29yaygpIDxlbT5PdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3Qgb3ZlcnRpbWVXb3JrID0gT1ZFUlRJTUVfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ092ZXJ0aW1lV29yayA9IFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwZXJjZW50V29ya0NvbXBsZXRlID0gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBTVEFOREFSRF9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YW5kYXJkUmF0ZSgpIDxlbT5TdGFuZGFyZCBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHN0YW5kYXJkUmF0ZSA9IFNUQU5EQVJEX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhbmRhcmRSYXRlRm9ybWF0KCkgPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKSA8ZW0+U3RhbmRhcmQgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YW5kYXJkUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0ID0gU1RBTkRBUkRfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9SQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lUmF0ZSgpIDxlbT5PdmVydGltZSBSYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lUmF0ZSA9IE9WRVJUSU1FX1JBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgPGVtPk92ZXJ0aW1lIFJhdGUgRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVJhdGVGb3JtYXQoKSA8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE9WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVDb3N0KCkgPGVtPk92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgb3ZlcnRpbWVDb3N0ID0gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0UGVyVXNlKCkgPGVtPkNvc3QgUGVyIFVzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29zdFBlclVzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgY29zdFBlclVzZSA9IENPU1RfUEVSX1VTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxDb3N0KCkgPGVtPkFjdHVhbCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgYWN0dWFsQ29zdCA9IEFDVFVBTF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbE92ZXJ0aW1lQ29zdCA9IEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdDb3N0KCkgPGVtPlJlbWFpbmluZyBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdDb3N0ID0gUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0RlY2ltYWwgcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBXT1JLX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtWYXJpYW5jZSgpIDxlbT5Xb3JrIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrVmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCB3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBXb3JrIFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdFZhcmlhbmNlKCkgPGVtPkNvc3QgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3RWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBDT1NUX1ZBUklBTkNFX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvc3RWYXJpYW5jZSgpIDxlbT5Db3N0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBjb3N0VmFyaWFuY2UgPSBDT1NUX1ZBUklBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBDb3N0IFZhcmlhbmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb3N0VmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U1YoKSA8ZW0+U1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFNWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNWKCkgPGVtPlNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHNWID0gU1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFNWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDVigpIDxlbT5DVjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q1YoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQ1ZfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgY1YgPSBDVl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ1YgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNWRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBBQ1dQX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFDV1AoKSA8ZW0+QUNXUDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QUNXUCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGFDV1AgPSBBQ1dQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBBQ1dQIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhQ1dQRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RlcygpIDxlbT5Ob3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90ZXMgPSBOT1RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzR2VuZXJpYygpIDxlbT5JcyBHZW5lcmljPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzR2VuZXJpYygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX0dFTkVSSUNfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNHZW5lcmljKCkgPGVtPklzIEdlbmVyaWM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNHZW5lcmljKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBHZW5lcmljIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19JTkFDVElWRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0luYWN0aXZlKCkgPGVtPklzIEluYWN0aXZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzSW5hY3RpdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgSW5hY3RpdmUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5hY3RpdmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VudGVycHJpc2UoKSA8ZW0+SXMgRW50ZXJwcmlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc0VudGVycHJpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTlRFUlBSSVNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRW50ZXJwcmlzZSgpIDxlbT5JcyBFbnRlcnByaXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW50ZXJwcmlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlID0gSVNfRU5URVJQUklTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRW50ZXJwcmlzZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRlcnByaXNlRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvb2tpbmdUeXBlKCkgPGVtPkJvb2tpbmcgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9va2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBCT09LSU5HX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9va2luZ1R5cGUoKSA8ZW0+Qm9va2luZyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb29raW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgYm9va2luZ1R5cGUgPSBCT09LSU5HX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpIDxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2ZURpcmVjdG9yeUdVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWRV9ESVJFQ1RPUllfR1VJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgPGVtPkFjdGl2ZSBEaXJlY3RvcnkgR1VJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3RpdmVEaXJlY3RvcnlHVUlEID0gQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uRGF0ZSgpIDxlbT5DcmVhdGlvbiBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvbkRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IENSRUFUSU9OX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25EYXRlKCkgPGVtPkNyZWF0aW9uIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGlvbkRhdGUgPSBDUkVBVElPTl9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVuZGVkQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZXh0ZW5kZWRBdHRyaWJ1dGUgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZWxpbmUoKSA8ZW0+QmFzZWxpbmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBiYXNlbGluZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdXRsaW5lQ29kZSgpIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0bGluZUNvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBvdXRsaW5lQ29kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkgPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdmFpbGFiaWxpdHlQZXJpb2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXZhaWxhYmlsaXR5UGVyaW9kcyBhdmFpbGFiaWxpdHlQZXJpb2RzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhdGVzKCkgPGVtPlJhdGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFJhdGVzIHJhdGVzID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFVJRCgpIHsKLQkJcmV0dXJuIHVJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVSUQoQmlnSW50ZWdlciBuZXdVSUQpIHsKLQkJQmlnSW50ZWdlciBvbGRVSUQgPSB1SUQ7Ci0JCXVJRCA9IG5ld1VJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIGlzTnVsbCwgIW9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzTnVsbCgpIHsKLQkJYm9vbGVhbiBvbGRJc051bGwgPSBpc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbCA9IElTX05VTExfRURFRkFVTFQ7Ci0JCWlzTnVsbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMLCBvbGRJc051bGwsIElTX05VTExfRURFRkFVTFQsIG9sZElzTnVsbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzTnVsbCgpIHsKLQkJcmV0dXJuIGlzTnVsbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFscygpIHsKLQkJcmV0dXJuIGluaXRpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxzKFN0cmluZyBuZXdJbml0aWFscykgewotCQlTdHJpbmcgb2xkSW5pdGlhbHMgPSBpbml0aWFsczsKLQkJaW5pdGlhbHMgPSBuZXdJbml0aWFsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSU5JVElBTFMsIG9sZEluaXRpYWxzLCBpbml0aWFscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGhvbmV0aWNzKCkgewotCQlyZXR1cm4gcGhvbmV0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBob25ldGljcyhTdHJpbmcgbmV3UGhvbmV0aWNzKSB7Ci0JCVN0cmluZyBvbGRQaG9uZXRpY3MgPSBwaG9uZXRpY3M7Ci0JCXBob25ldGljcyA9IG5ld1Bob25ldGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTLCBvbGRQaG9uZXRpY3MsIHBob25ldGljcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TlRBY2NvdW50KCkgewotCQlyZXR1cm4gblRBY2NvdW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5UQWNjb3VudChTdHJpbmcgbmV3TlRBY2NvdW50KSB7Ci0JCVN0cmluZyBvbGROVEFjY291bnQgPSBuVEFjY291bnQ7Ci0JCW5UQWNjb3VudCA9IG5ld05UQWNjb3VudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5ULCBvbGROVEFjY291bnQsIG5UQWNjb3VudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0ZXJpYWxMYWJlbCgpIHsKLQkJcmV0dXJuIG1hdGVyaWFsTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF0ZXJpYWxMYWJlbChTdHJpbmcgbmV3TWF0ZXJpYWxMYWJlbCkgewotCQlTdHJpbmcgb2xkTWF0ZXJpYWxMYWJlbCA9IG1hdGVyaWFsTGFiZWw7Ci0JCW1hdGVyaWFsTGFiZWwgPSBuZXdNYXRlcmlhbExhYmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTCwgb2xkTWF0ZXJpYWxMYWJlbCwgbWF0ZXJpYWxMYWJlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29kZSgpIHsKLQkJcmV0dXJuIGNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29kZShTdHJpbmcgbmV3Q29kZSkgewotCQlTdHJpbmcgb2xkQ29kZSA9IGNvZGU7Ci0JCWNvZGUgPSBuZXdDb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFLCBvbGRDb2RlLCBjb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHcm91cCgpIHsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwKFN0cmluZyBuZXdHcm91cCkgewotCQlTdHJpbmcgb2xkR3JvdXAgPSBncm91cDsKLQkJZ3JvdXAgPSBuZXdHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fR1JPVVAsIG9sZEdyb3VwLCBncm91cCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFdvcmtHcm91cCgpIHsKLQkJcmV0dXJuIHdvcmtHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrR3JvdXAoQmlnSW50ZWdlciBuZXdXb3JrR3JvdXApIHsKLQkJQmlnSW50ZWdlciBvbGRXb3JrR3JvdXAgPSB3b3JrR3JvdXA7Ci0JCXdvcmtHcm91cCA9IG5ld1dvcmtHcm91cDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUCwgb2xkV29ya0dyb3VwLCB3b3JrR3JvdXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVtYWlsQWRkcmVzcygpIHsKLQkJcmV0dXJuIGVtYWlsQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbWFpbEFkZHJlc3MoU3RyaW5nIG5ld0VtYWlsQWRkcmVzcykgewotCQlTdHJpbmcgb2xkRW1haWxBZGRyZXNzID0gZW1haWxBZGRyZXNzOwotCQllbWFpbEFkZHJlc3MgPSBuZXdFbWFpbEFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1MsIG9sZEVtYWlsQWRkcmVzcywgZW1haWxBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmsoKSB7Ci0JCXJldHVybiBoeXBlcmxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rKFN0cmluZyBuZXdIeXBlcmxpbmspIHsKLQkJU3RyaW5nIG9sZEh5cGVybGluayA9IGh5cGVybGluazsKLQkJaHlwZXJsaW5rID0gbmV3SHlwZXJsaW5rOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19BRERSRVNTLCBvbGRIeXBlcmxpbmtBZGRyZXNzLCBoeXBlcmxpbmtBZGRyZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtTdWJBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtTdWJBZGRyZXNzID0gaHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaHlwZXJsaW5rU3ViQWRkcmVzcyA9IG5ld0h5cGVybGlua1N1YkFkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUywgb2xkSHlwZXJsaW5rU3ViQWRkcmVzcywgaHlwZXJsaW5rU3ViQWRkcmVzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRNYXhVbml0cygpIHsKLQkJcmV0dXJuIG1heFVuaXRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFVuaXRzKGZsb2F0IG5ld01heFVuaXRzKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCW1heFVuaXRzID0gbmV3TWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0c0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFMsIG9sZE1heFVuaXRzLCBtYXhVbml0cywgIW9sZE1heFVuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWF4VW5pdHMoKSB7Ci0JCWZsb2F0IG9sZE1heFVuaXRzID0gbWF4VW5pdHM7Ci0JCWJvb2xlYW4gb2xkTWF4VW5pdHNFU2V0ID0gbWF4VW5pdHNFU2V0OwotCQltYXhVbml0cyA9IE1BWF9VTklUU19FREVGQVVMVDsKLQkJbWF4VW5pdHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTLCBvbGRNYXhVbml0cywgTUFYX1VOSVRTX0VERUZBVUxULCBvbGRNYXhVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE1heFVuaXRzKCkgewotCQlyZXR1cm4gbWF4VW5pdHNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRQZWFrVW5pdHMoKSB7Ci0JCXJldHVybiBwZWFrVW5pdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVha1VuaXRzKGZsb2F0IG5ld1BlYWtVbml0cykgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCXBlYWtVbml0cyA9IG5ld1BlYWtVbml0czsKLQkJYm9vbGVhbiBvbGRQZWFrVW5pdHNFU2V0ID0gcGVha1VuaXRzRVNldDsKLQkJcGVha1VuaXRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFMsIG9sZFBlYWtVbml0cywgcGVha1VuaXRzLCAhb2xkUGVha1VuaXRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UGVha1VuaXRzKCkgewotCQlmbG9hdCBvbGRQZWFrVW5pdHMgPSBwZWFrVW5pdHM7Ci0JCWJvb2xlYW4gb2xkUGVha1VuaXRzRVNldCA9IHBlYWtVbml0c0VTZXQ7Ci0JCXBlYWtVbml0cyA9IFBFQUtfVU5JVFNfRURFRkFVTFQ7Ci0JCXBlYWtVbml0c0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTLCBvbGRQZWFrVW5pdHMsIFBFQUtfVU5JVFNfRURFRkFVTFQsIG9sZFBlYWtVbml0c0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFBlYWtVbml0cygpIHsKLQkJcmV0dXJuIHBlYWtVbml0c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPdmVyQWxsb2NhdGVkKCkgewotCQlyZXR1cm4gb3ZlckFsbG9jYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVyQWxsb2NhdGVkKGJvb2xlYW4gbmV3T3ZlckFsbG9jYXRlZCkgewotCQlib29sZWFuIG9sZE92ZXJBbGxvY2F0ZWQgPSBvdmVyQWxsb2NhdGVkOwotCQlvdmVyQWxsb2NhdGVkID0gbmV3T3ZlckFsbG9jYXRlZDsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkRVNldCA9IG92ZXJBbGxvY2F0ZWRFU2V0OwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBPVkVSX0FMTE9DQVRFRF9FREVGQVVMVCwgb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCXJldHVybiBvdmVyQWxsb2NhdGVkRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZUZyb20oKSB7Ci0JCXJldHVybiBhdmFpbGFibGVGcm9tOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUZyb20oT2JqZWN0IG5ld0F2YWlsYWJsZUZyb20pIHsKLQkJT2JqZWN0IG9sZEF2YWlsYWJsZUZyb20gPSBhdmFpbGFibGVGcm9tOwotCQlhdmFpbGFibGVGcm9tID0gbmV3QXZhaWxhYmxlRnJvbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST00sIG9sZEF2YWlsYWJsZUZyb20sIGF2YWlsYWJsZUZyb20pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEF2YWlsYWJsZVRvKCkgewotCQlyZXR1cm4gYXZhaWxhYmxlVG87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVG8oT2JqZWN0IG5ld0F2YWlsYWJsZVRvKSB7Ci0JCU9iamVjdCBvbGRBdmFpbGFibGVUbyA9IGF2YWlsYWJsZVRvOwotCQlhdmFpbGFibGVUbyA9IG5ld0F2YWlsYWJsZVRvOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE8sIG9sZEF2YWlsYWJsZVRvLCBhdmFpbGFibGVUbykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChPYmplY3QgbmV3U3RhcnQpIHsKLQkJT2JqZWN0IG9sZFN0YXJ0ID0gc3RhcnQ7Ci0JCXN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQVJULCBvbGRTdGFydCwgc3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZpbmlzaCgpIHsKLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2goT2JqZWN0IG5ld0ZpbmlzaCkgewotCQlPYmplY3Qgb2xkRmluaXNoID0gZmluaXNoOwotCQlmaW5pc2ggPSBuZXdGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbkxldmVsKCkgewotCQlyZXR1cm4gY2FuTGV2ZWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuTGV2ZWwoYm9vbGVhbiBuZXdDYW5MZXZlbCkgewotCQlib29sZWFuIG9sZENhbkxldmVsID0gY2FuTGV2ZWw7Ci0JCWNhbkxldmVsID0gbmV3Q2FuTGV2ZWw7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWxFU2V0ID0gY2FuTGV2ZWxFU2V0OwotCQljYW5MZXZlbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBjYW5MZXZlbCwgIW9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q2FuTGV2ZWwoKSB7Ci0JCWJvb2xlYW4gb2xkQ2FuTGV2ZWwgPSBjYW5MZXZlbDsKLQkJYm9vbGVhbiBvbGRDYW5MZXZlbEVTZXQgPSBjYW5MZXZlbEVTZXQ7Ci0JCWNhbkxldmVsID0gQ0FOX0xFVkVMX0VERUZBVUxUOwotCQljYW5MZXZlbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUwsIG9sZENhbkxldmVsLCBDQU5fTEVWRUxfRURFRkFVTFQsIG9sZENhbkxldmVsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q2FuTGV2ZWwoKSB7Ci0JCXJldHVybiBjYW5MZXZlbEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0QWNjcnVlQXQoKSB7Ci0JCXJldHVybiBhY2NydWVBdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2NydWVBdChCaWdJbnRlZ2VyIG5ld0FjY3J1ZUF0KSB7Ci0JCUJpZ0ludGVnZXIgb2xkQWNjcnVlQXQgPSBhY2NydWVBdDsKLQkJYWNjcnVlQXQgPSBuZXdBY2NydWVBdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FULCBvbGRBY2NydWVBdCwgYWNjcnVlQXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFdvcmsoKSB7Ci0JCXJldHVybiB3b3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmsoT2JqZWN0IG5ld1dvcmspIHsKLQkJT2JqZWN0IG9sZFdvcmsgPSB3b3JrOwotCQl3b3JrID0gbmV3V29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVndWxhcldvcmsoKSB7Ci0JCXJldHVybiByZWd1bGFyV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWd1bGFyV29yayhPYmplY3QgbmV3UmVndWxhcldvcmspIHsKLQkJT2JqZWN0IG9sZFJlZ3VsYXJXb3JrID0gcmVndWxhcldvcms7Ci0JCXJlZ3VsYXJXb3JrID0gbmV3UmVndWxhcldvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSywgb2xkUmVndWxhcldvcmssIHJlZ3VsYXJXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiBvdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZE92ZXJ0aW1lV29yayA9IG92ZXJ0aW1lV29yazsKLQkJb3ZlcnRpbWVXb3JrID0gbmV3T3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbFdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsV29yayhPYmplY3QgbmV3QWN0dWFsV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsV29yayA9IGFjdHVhbFdvcms7Ci0JCWFjdHVhbFdvcmsgPSBuZXdBY3R1YWxXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSywgb2xkQWN0dWFsV29yaywgYWN0dWFsV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSywgb2xkUmVtYWluaW5nV29yaywgcmVtYWluaW5nV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbE92ZXJ0aW1lV29yayhPYmplY3QgbmV3QWN0dWFsT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxPdmVydGltZVdvcmsgPSBhY3R1YWxPdmVydGltZVdvcms7Ci0JCWFjdHVhbE92ZXJ0aW1lV29yayA9IG5ld0FjdHVhbE92ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSB7Ci0JCXJldHVybiByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKE9iamVjdCBuZXdSZW1haW5pbmdPdmVydGltZVdvcmspIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ092ZXJ0aW1lV29yayA9IHJlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQZXJjZW50V29ya0NvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJjZW50V29ya0NvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGVyY2VudFdvcmtDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRXb3JrQ29tcGxldGUgPSBwZXJjZW50V29ya0NvbXBsZXRlOwotCQlwZXJjZW50V29ya0NvbXBsZXRlID0gbmV3UGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0U3RhbmRhcmRSYXRlKCkgewotCQlyZXR1cm4gc3RhbmRhcmRSYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YW5kYXJkUmF0ZShCaWdEZWNpbWFsIG5ld1N0YW5kYXJkUmF0ZSkgewotCQlCaWdEZWNpbWFsIG9sZFN0YW5kYXJkUmF0ZSA9IHN0YW5kYXJkUmF0ZTsKLQkJc3RhbmRhcmRSYXRlID0gbmV3U3RhbmRhcmRSYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFLCBvbGRTdGFuZGFyZFJhdGUsIHN0YW5kYXJkUmF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YW5kYXJkUmF0ZUZvcm1hdCgpIHsKLQkJcmV0dXJuIHN0YW5kYXJkUmF0ZUZvcm1hdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFyZFJhdGVGb3JtYXQoQmlnSW50ZWdlciBuZXdTdGFuZGFyZFJhdGVGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRTdGFuZGFyZFJhdGVGb3JtYXQgPSBzdGFuZGFyZFJhdGVGb3JtYXQ7Ci0JCXN0YW5kYXJkUmF0ZUZvcm1hdCA9IG5ld1N0YW5kYXJkUmF0ZUZvcm1hdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQsIG9sZFN0YW5kYXJkUmF0ZUZvcm1hdCwgc3RhbmRhcmRSYXRlRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1QsIG9sZENvc3QsIGNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZVJhdGUoKSB7Ci0JCXJldHVybiBvdmVydGltZVJhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVSYXRlKEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVSYXRlKSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVSYXRlID0gb3ZlcnRpbWVSYXRlOwotCQlvdmVydGltZVJhdGUgPSBuZXdPdmVydGltZVJhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEUsIG9sZE92ZXJ0aW1lUmF0ZSwgb3ZlcnRpbWVSYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0KCkgewotCQlyZXR1cm4gb3ZlcnRpbWVSYXRlRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lUmF0ZUZvcm1hdChCaWdJbnRlZ2VyIG5ld092ZXJ0aW1lUmF0ZUZvcm1hdCkgewotCQlCaWdJbnRlZ2VyIG9sZE92ZXJ0aW1lUmF0ZUZvcm1hdCA9IG92ZXJ0aW1lUmF0ZUZvcm1hdDsKLQkJb3ZlcnRpbWVSYXRlRm9ybWF0ID0gbmV3T3ZlcnRpbWVSYXRlRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVCwgb2xkT3ZlcnRpbWVSYXRlRm9ybWF0LCBvdmVydGltZVJhdGVGb3JtYXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBvdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3T3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkT3ZlcnRpbWVDb3N0ID0gb3ZlcnRpbWVDb3N0OwotCQlvdmVydGltZUNvc3QgPSBuZXdPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1QsIG9sZE92ZXJ0aW1lQ29zdCwgb3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdFBlclVzZSgpIHsKLQkJcmV0dXJuIGNvc3RQZXJVc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFBlclVzZShCaWdEZWNpbWFsIG5ld0Nvc3RQZXJVc2UpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0UGVyVXNlID0gY29zdFBlclVzZTsKLQkJY29zdFBlclVzZSA9IG5ld0Nvc3RQZXJVc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRSwgb2xkQ29zdFBlclVzZSwgY29zdFBlclVzZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbENvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbENvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsQ29zdCA9IGFjdHVhbENvc3Q7Ci0JCWFjdHVhbENvc3QgPSBuZXdBY3R1YWxDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVCwgb2xkQWN0dWFsQ29zdCwgYWN0dWFsQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdBY3R1YWxPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxPdmVydGltZUNvc3QgPSBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWFjdHVhbE92ZXJ0aW1lQ29zdCA9IG5ld0FjdHVhbE92ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nQ29zdCgpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ0Nvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRSZW1haW5pbmdDb3N0ID0gcmVtYWluaW5nQ29zdDsKLQkJcmVtYWluaW5nQ29zdCA9IG5ld1JlbWFpbmluZ0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NULCBvbGRSZW1haW5pbmdDb3N0LCByZW1haW5pbmdDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVCwgb2xkUmVtYWluaW5nT3ZlcnRpbWVDb3N0LCByZW1haW5pbmdPdmVydGltZUNvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0V29ya1ZhcmlhbmNlKCkgewotCQlyZXR1cm4gd29ya1ZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtWYXJpYW5jZShmbG9hdCBuZXdXb3JrVmFyaWFuY2UpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQl3b3JrVmFyaWFuY2UgPSBuZXdXb3JrVmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkV29ya1ZhcmlhbmNlRVNldCA9IHdvcmtWYXJpYW5jZUVTZXQ7Ci0JCXdvcmtWYXJpYW5jZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFLCBvbGRXb3JrVmFyaWFuY2UsIHdvcmtWYXJpYW5jZSwgIW9sZFdvcmtWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFdvcmtWYXJpYW5jZSgpIHsKLQkJZmxvYXQgb2xkV29ya1ZhcmlhbmNlID0gd29ya1ZhcmlhbmNlOwotCQlib29sZWFuIG9sZFdvcmtWYXJpYW5jZUVTZXQgPSB3b3JrVmFyaWFuY2VFU2V0OwotCQl3b3JrVmFyaWFuY2UgPSBXT1JLX1ZBUklBTkNFX0VERUZBVUxUOwotCQl3b3JrVmFyaWFuY2VFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRDb3N0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBjb3N0VmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdFZhcmlhbmNlKGZsb2F0IG5ld0Nvc3RWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWNvc3RWYXJpYW5jZSA9IG5ld0Nvc3RWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRDb3N0VmFyaWFuY2VFU2V0ID0gY29zdFZhcmlhbmNlRVNldDsKLQkJY29zdFZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfVkFSSUFOQ0UsIG9sZENvc3RWYXJpYW5jZSwgY29zdFZhcmlhbmNlLCAhb2xkQ29zdFZhcmlhbmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q29zdFZhcmlhbmNlKCkgewotCQlmbG9hdCBvbGRDb3N0VmFyaWFuY2UgPSBjb3N0VmFyaWFuY2U7Ci0JCWJvb2xlYW4gb2xkQ29zdFZhcmlhbmNlRVNldCA9IGNvc3RWYXJpYW5jZUVTZXQ7Ci0JCWNvc3RWYXJpYW5jZSA9IENPU1RfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0JCWNvc3RWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFLCBvbGRDb3N0VmFyaWFuY2UsIENPU1RfVkFSSUFOQ0VfRURFRkFVTFQsIG9sZENvc3RWYXJpYW5jZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENvc3RWYXJpYW5jZSgpIHsKLQkJcmV0dXJuIGNvc3RWYXJpYW5jZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldFNWKCkgewotCQlyZXR1cm4gc1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U1YoZmxvYXQgbmV3U1YpIHsKLQkJZmxvYXQgb2xkU1YgPSBzVjsKLQkJc1YgPSBuZXdTVjsKLQkJYm9vbGVhbiBvbGRTVkVTZXQgPSBzVkVTZXQ7Ci0JCXNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NWLCBvbGRTViwgc1YsICFvbGRTVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFNWKCkgewotCQlmbG9hdCBvbGRTViA9IHNWOwotCQlib29sZWFuIG9sZFNWRVNldCA9IHNWRVNldDsKLQkJc1YgPSBTVl9FREVGQVVMVDsKLQkJc1ZFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1YsIG9sZFNWLCBTVl9FREVGQVVMVCwgb2xkU1ZFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTVigpIHsKLQkJcmV0dXJuIHNWRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0Q1YoKSB7Ci0JCXJldHVybiBjVjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDVihmbG9hdCBuZXdDVikgewotCQlmbG9hdCBvbGRDViA9IGNWOwotCQljViA9IG5ld0NWOwotCQlib29sZWFuIG9sZENWRVNldCA9IGNWRVNldDsKLQkJY1ZFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DViwgb2xkQ1YsIENWX0VERUZBVUxULCBvbGRDVkVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENWKCkgewotCQlyZXR1cm4gY1ZFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBQ1dQKGZsb2F0IG5ld0FDV1ApIHsKLQkJZmxvYXQgb2xkQUNXUCA9IGFDV1A7Ci0JCWFDV1AgPSBuZXdBQ1dQOwotCQlib29sZWFuIG9sZEFDV1BFU2V0ID0gYUNXUEVTZXQ7Ci0JCWFDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQLCBvbGRBQ1dQLCBBQ1dQX0VERUZBVUxULCBvbGRBQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRCwgb2xkQ2FsZW5kYXJVSUQsIGNhbGVuZGFyVUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTk9URVMsIG9sZE5vdGVzLCBub3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dTKCkgewotCQlyZXR1cm4gYkNXUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dTKGZsb2F0IG5ld0JDV1MpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJDV1MgPSBuZXdCQ1dTOwotCQlib29sZWFuIG9sZEJDV1NFU2V0ID0gYkNXU0VTZXQ7Ci0JCWJDV1NFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUywgb2xkQkNXUywgYkNXUywgIW9sZEJDV1NFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dTKCkgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYm9vbGVhbiBvbGRCQ1dTRVNldCA9IGJDV1NFU2V0OwotCQliQ1dTID0gQkNXU19FREVGQVVMVDsKLQkJYkNXU0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUCwgb2xkQkNXUCwgYkNXUCwgIW9sZEJDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRCQ1dQKCkgewotCQlmbG9hdCBvbGRCQ1dQID0gYkNXUDsKLQkJYm9vbGVhbiBvbGRCQ1dQRVNldCA9IGJDV1BFU2V0OwotCQliQ1dQID0gQkNXUF9FREVGQVVMVDsKLQkJYkNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dQLCBvbGRCQ1dQLCBCQ1dQX0VERUZBVUxULCBvbGRCQ1dQRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUCgpIHsKLQkJcmV0dXJuIGJDV1BFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNHZW5lcmljKCkgewotCQlyZXR1cm4gaXNHZW5lcmljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzR2VuZXJpYyhib29sZWFuIG5ld0lzR2VuZXJpYykgewotCQlib29sZWFuIG9sZElzR2VuZXJpYyA9IGlzR2VuZXJpYzsKLQkJaXNHZW5lcmljID0gbmV3SXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBpc0dlbmVyaWMsICFvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0dlbmVyaWMoKSB7Ci0JCWJvb2xlYW4gb2xkSXNHZW5lcmljID0gaXNHZW5lcmljOwotCQlib29sZWFuIG9sZElzR2VuZXJpY0VTZXQgPSBpc0dlbmVyaWNFU2V0OwotCQlpc0dlbmVyaWMgPSBJU19HRU5FUklDX0VERUZBVUxUOwotCQlpc0dlbmVyaWNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfR0VORVJJQywgb2xkSXNHZW5lcmljLCBJU19HRU5FUklDX0VERUZBVUxULCBvbGRJc0dlbmVyaWNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0dlbmVyaWMoKSB7Ci0JCXJldHVybiBpc0dlbmVyaWNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuIGlzSW5hY3RpdmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNJbmFjdGl2ZShib29sZWFuIG5ld0lzSW5hY3RpdmUpIHsKLQkJYm9vbGVhbiBvbGRJc0luYWN0aXZlID0gaXNJbmFjdGl2ZTsKLQkJaXNJbmFjdGl2ZSA9IG5ld0lzSW5hY3RpdmU7Ci0JCWJvb2xlYW4gb2xkSXNJbmFjdGl2ZUVTZXQgPSBpc0luYWN0aXZlRVNldDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgaXNJbmFjdGl2ZSwgIW9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc0luYWN0aXZlKCkgewotCQlib29sZWFuIG9sZElzSW5hY3RpdmUgPSBpc0luYWN0aXZlOwotCQlib29sZWFuIG9sZElzSW5hY3RpdmVFU2V0ID0gaXNJbmFjdGl2ZUVTZXQ7Ci0JCWlzSW5hY3RpdmUgPSBJU19JTkFDVElWRV9FREVGQVVMVDsKLQkJaXNJbmFjdGl2ZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19JTkFDVElWRSwgb2xkSXNJbmFjdGl2ZSwgSVNfSU5BQ1RJVkVfRURFRkFVTFQsIG9sZElzSW5hY3RpdmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0luYWN0aXZlKCkgewotCQlyZXR1cm4gaXNJbmFjdGl2ZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc0VudGVycHJpc2UoKSB7Ci0JCXJldHVybiBpc0VudGVycHJpc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFbnRlcnByaXNlKGJvb2xlYW4gbmV3SXNFbnRlcnByaXNlKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlID0gaXNFbnRlcnByaXNlOwotCQlpc0VudGVycHJpc2UgPSBuZXdJc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIGlzRW50ZXJwcmlzZSwgIW9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzRW50ZXJwcmlzZSgpIHsKLQkJYm9vbGVhbiBvbGRJc0VudGVycHJpc2UgPSBpc0VudGVycHJpc2U7Ci0JCWJvb2xlYW4gb2xkSXNFbnRlcnByaXNlRVNldCA9IGlzRW50ZXJwcmlzZUVTZXQ7Ci0JCWlzRW50ZXJwcmlzZSA9IElTX0VOVEVSUFJJU0VfRURFRkFVTFQ7Ci0JCWlzRW50ZXJwcmlzZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFLCBvbGRJc0VudGVycHJpc2UsIElTX0VOVEVSUFJJU0VfRURFRkFVTFQsIG9sZElzRW50ZXJwcmlzZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldElzRW50ZXJwcmlzZSgpIHsKLQkJcmV0dXJuIGlzRW50ZXJwcmlzZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Qm9va2luZ1R5cGUoKSB7Ci0JCXJldHVybiBib29raW5nVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb29raW5nVHlwZShCaWdJbnRlZ2VyIG5ld0Jvb2tpbmdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQm9va2luZ1R5cGUgPSBib29raW5nVHlwZTsKLQkJYm9va2luZ1R5cGUgPSBuZXdCb29raW5nVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFLCBvbGRCb29raW5nVHlwZSwgYm9va2luZ1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoT2JqZWN0IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFdvcmtQcm90ZWN0ZWQgPSBhY3R1YWxXb3JrUHJvdGVjdGVkOwotCQlhY3R1YWxXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQsIG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCwgYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3RpdmVEaXJlY3RvcnlHVUlEKCkgewotCQlyZXR1cm4gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVEaXJlY3RvcnlHVUlEKFN0cmluZyBuZXdBY3RpdmVEaXJlY3RvcnlHVUlEKSB7Ci0JCVN0cmluZyBvbGRBY3RpdmVEaXJlY3RvcnlHVUlEID0gYWN0aXZlRGlyZWN0b3J5R1VJRDsKLQkJYWN0aXZlRGlyZWN0b3J5R1VJRCA9IG5ld0FjdGl2ZURpcmVjdG9yeUdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRCwgb2xkQWN0aXZlRGlyZWN0b3J5R1VJRCwgYWN0aXZlRGlyZWN0b3J5R1VJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRpb25EYXRlKCkgewotCQlyZXR1cm4gY3JlYXRpb25EYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uRGF0ZShPYmplY3QgbmV3Q3JlYXRpb25EYXRlKSB7Ci0JCU9iamVjdCBvbGRDcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7Ci0JCWNyZWF0aW9uRGF0ZSA9IG5ld0NyZWF0aW9uRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ1JFQVRJT05fREFURSwgb2xkQ3JlYXRpb25EYXRlLCBjcmVhdGlvbkRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURSk7Ci0JCX0KLQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRCYXNlbGluZSgpIHsKLQkJaWYgKGJhc2VsaW5lID09IG51bGwpIHsKLQkJCWJhc2VsaW5lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KEJhc2VsaW5lMi5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTMuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERSk7Ci0JCX0KLQkJcmV0dXJuIG91dGxpbmVDb2RlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBdmFpbGFiaWxpdHlQZXJpb2RzIGdldEF2YWlsYWJpbGl0eVBlcmlvZHMoKSB7Ci0JCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMoQXZhaWxhYmlsaXR5UGVyaW9kcyBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUF2YWlsYWJpbGl0eVBlcmlvZHMgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcyA9IGF2YWlsYWJpbGl0eVBlcmlvZHM7Ci0JCWF2YWlsYWJpbGl0eVBlcmlvZHMgPSBuZXdBdmFpbGFiaWxpdHlQZXJpb2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgb2xkQXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMpIHsKLQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gYXZhaWxhYmlsaXR5UGVyaW9kcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYXZhaWxhYmlsaXR5UGVyaW9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhdmFpbGFiaWxpdHlQZXJpb2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0F2YWlsYWJpbGl0eVBlcmlvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcywgbmV3QXZhaWxhYmlsaXR5UGVyaW9kcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSYXRlcyBnZXRSYXRlcygpIHsKLQkJcmV0dXJuIHJhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJhdGVzKFJhdGVzIG5ld1JhdGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJhdGVzIG9sZFJhdGVzID0gcmF0ZXM7Ci0JCXJhdGVzID0gbmV3UmF0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTLCBvbGRSYXRlcywgbmV3UmF0ZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhdGVzKFJhdGVzIG5ld1JhdGVzKSB7Ci0JCWlmIChuZXdSYXRlcyAhPSByYXRlcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmF0ZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmF0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmF0ZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYXRlcyhuZXdSYXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUywgbmV3UmF0ZXMsIG5ld1JhdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEEpOwotCQl9Ci0JCXJldHVybiB0aW1lcGhhc2VkRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRCYXNlbGluZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVVRMSU5FX0NPREU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0T3V0bGluZUNvZGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF2YWlsYWJpbGl0eVBlcmlvZHMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UmF0ZXMobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VGltZXBoYXNlZERhdGEoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlyZXR1cm4gZ2V0SUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzSXNOdWxsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbHMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBnZXRQaG9uZXRpY3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBnZXROVEFjY291bnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIGdldE1hdGVyaWFsTGFiZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09ERToKLQkJCQlyZXR1cm4gZ2V0Q29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0V29ya0dyb3VwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0VNQUlMX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEVtYWlsQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rQWRkcmVzcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0TWF4VW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRQZWFrVW5pdHMoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc092ZXJBbGxvY2F0ZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXJldHVybiBnZXRBdmFpbGFibGVGcm9tKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmxlVG8oKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNDYW5MZXZlbCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNDUlVFX0FUOgotCQkJCXJldHVybiBnZXRBY2NydWVBdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0T3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRVJDRU5UX1dPUktfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRXb3JrQ29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gZ2V0U3RhbmRhcmRSYXRlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXJldHVybiBnZXRTdGFuZGFyZFJhdGVGb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gZ2V0Q29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBnZXRPdmVydGltZVJhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIGdldE92ZXJ0aW1lUmF0ZUZvcm1hdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVF9QRVJfVVNFOgotCQkJCXJldHVybiBnZXRDb3N0UGVyVXNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0V29ya1ZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Q29zdFZhcmlhbmNlKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldFNWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldENWKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0QUNXUCgpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1A6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRCQ1dQKCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXJldHVybiBpc0lzR2VuZXJpYygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfSU5BQ1RJVkU6Ci0JCQkJcmV0dXJuIGlzSXNJbmFjdGl2ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNJc0VudGVycHJpc2UoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gZ2V0Qm9va2luZ1R5cGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVElWRV9ESVJFQ1RPUllfR1VJRDoKLQkJCQlyZXR1cm4gZ2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBnZXRDcmVhdGlvbkRhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlyZXR1cm4gZ2V0QmFzZWxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBnZXRPdXRsaW5lQ29kZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlyZXR1cm4gZ2V0QXZhaWxhYmlsaXR5UGVyaW9kcygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SQVRFUzoKLQkJCQlyZXR1cm4gZ2V0UmF0ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCXJldHVybiBnZXRUaW1lcGhhc2VkRGF0YSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXNldFVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BIT05FVElDUzoKLQkJCQlzZXRQaG9uZXRpY3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJc2V0TWF0ZXJpYWxMYWJlbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SS19HUk9VUDoKLQkJCQlzZXRXb3JrR3JvdXAoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXNldE1heFVuaXRzKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QRUFLX1VOSVRTOgotCQkJCXNldFBlYWtVbml0cygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9GUk9NOgotCQkJCXNldEF2YWlsYWJsZUZyb20oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJc2V0QXZhaWxhYmxlVG8oKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFSVDoKLQkJCQlzZXRTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DQU5fTEVWRUw6Ci0JCQkJc2V0Q2FuTGV2ZWwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJc2V0QWNjcnVlQXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRPdmVydGltZVdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SSzoKLQkJCQlzZXRBY3R1YWxXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEU6Ci0JCQkJc2V0U3RhbmRhcmRSYXRlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURToKLQkJCQlzZXRPdmVydGltZVJhdGUoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfUkFURV9GT1JNQVQ6Ci0JCQkJc2V0T3ZlcnRpbWVSYXRlRm9ybWF0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0T3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXNldEFjdHVhbENvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19DT1NUOgotCQkJCXNldFJlbWFpbmluZ0Nvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXNldENvc3RWYXJpYW5jZSgoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1Y6Ci0JCQkJc2V0U1YoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXNldEFDV1AoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JDV1M6Ci0JCQkJc2V0QkNXUygoKEZsb2F0KW5ld1ZhbHVlKS5mbG9hdFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19HRU5FUklDOgotCQkJCXNldElzR2VuZXJpYygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXNldElzSW5hY3RpdmUoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19FTlRFUlBSSVNFOgotCQkJCXNldElzRW50ZXJwcmlzZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JPT0tJTkdfVFlQRToKLQkJCQlzZXRCb29raW5nVHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RJVkVfRElSRUNUT1JZX0dVSUQ6Ci0JCQkJc2V0QWN0aXZlRGlyZWN0b3J5R1VJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZWxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXNldFJhdGVzKChSYXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5jbGVhcigpOwotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19VSUQ6Ci0JCQkJc2V0VUlEKFVJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlzZXRJbml0aWFscyhJTklUSUFMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19QSE9ORVRJQ1M6Ci0JCQkJc2V0UGhvbmV0aWNzKFBIT05FVElDU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OVEFDQ09VTlQ6Ci0JCQkJc2V0TlRBY2NvdW50KE5UQUNDT1VOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVRFUklBTF9MQUJFTDoKLQkJCQlzZXRNYXRlcmlhbExhYmVsKE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPREU6Ci0JCQkJc2V0Q29kZShDT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXNldEdyb3VwKEdST1VQX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1dPUktfR1JPVVA6Ci0JCQkJc2V0V29ya0dyb3VwKFdPUktfR1JPVVBfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRU1BSUxfQUREUkVTUzoKLQkJCQlzZXRFbWFpbEFkZHJlc3MoRU1BSUxfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKEhZUEVSTElOS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19NQVhfVU5JVFM6Ci0JCQkJdW5zZXRNYXhVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEVBS19VTklUUzoKLQkJCQl1bnNldFBlYWtVbml0cygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfRlJPTToKLQkJCQlzZXRBdmFpbGFibGVGcm9tKEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJMRV9UTzoKLQkJCQlzZXRBdmFpbGFibGVUbyhBVkFJTEFCTEVfVE9fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoU1RBUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRklOSVNIOgotCQkJCXNldEZpbmlzaChGSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FOX0xFVkVMOgotCQkJCXVuc2V0Q2FuTGV2ZWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDQ1JVRV9BVDoKLQkJCQlzZXRBY2NydWVBdChBQ0NSVUVfQVRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVHVUxBUl9XT1JLOgotCQkJCXNldFJlZ3VsYXJXb3JrKFJFR1VMQVJfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yayhPVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLOgotCQkJCXNldEFjdHVhbFdvcmsoQUNUVUFMX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nV29yayhSRU1BSU5JTkdfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRBY3R1YWxPdmVydGltZVdvcmsoQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKFJFTUFJTklOR19PVkVSVElNRV9XT1JLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVEFOREFSRF9SQVRFOgotCQkJCXNldFN0YW5kYXJkUmF0ZShTVEFOREFSRF9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1NUQU5EQVJEX1JBVEVfRk9STUFUOgotCQkJCXNldFN0YW5kYXJkUmF0ZUZvcm1hdChTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUOgotCQkJCXNldENvc3QoQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXNldE92ZXJ0aW1lUmF0ZShPVkVSVElNRV9SQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJUSU1FX1JBVEVfRk9STUFUOgotCQkJCXNldE92ZXJ0aW1lUmF0ZUZvcm1hdChPVkVSVElNRV9SQVRFX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXNldE92ZXJ0aW1lQ29zdChPVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NPU1RfUEVSX1VTRToKLQkJCQlzZXRDb3N0UGVyVXNlKENPU1RfUEVSX1VTRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lQ29zdChBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdDb3N0KFJFTUFJTklOR19DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXVuc2V0V29ya1ZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXVuc2V0Q29zdFZhcmlhbmNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQl1bnNldFNWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXNldENhbGVuZGFyVUlEKENBTEVOREFSX1VJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19OT1RFUzoKLQkJCQlzZXROb3RlcyhOT1RFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXVuc2V0QkNXUygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQl1bnNldEJDV1AoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJdW5zZXRJc0dlbmVyaWMoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXVuc2V0SXNJbmFjdGl2ZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQl1bnNldElzRW50ZXJwcmlzZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXNldEJvb2tpbmdUeXBlKEJPT0tJTkdfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1RVQUxfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsV29ya1Byb3RlY3RlZChBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXNldEFjdGl2ZURpcmVjdG9yeUdVSUQoQUNUSVZFX0RJUkVDVE9SWV9HVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NSRUFUSU9OX0RBVEU6Ci0JCQkJc2V0Q3JlYXRpb25EYXRlKENSRUFUSU9OX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0JBU0VMSU5FOgotCQkJCWdldEJhc2VsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCSUxJVFlfUEVSSU9EUzoKLQkJCQlzZXRBdmFpbGFiaWxpdHlQZXJpb2RzKChBdmFpbGFiaWxpdHlQZXJpb2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkFURVM6Ci0JCQkJc2V0UmF0ZXMoKFJhdGVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVElNRVBIQVNFRF9EQVRBOgotCQkJCWdldFRpbWVwaGFzZWREYXRhKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpRCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JU19OVUxMOgotCQkJCXJldHVybiBpc1NldElzTnVsbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19JTklUSUFMUzoKLQkJCQlyZXR1cm4gSU5JVElBTFNfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRpYWxzICE9IG51bGwgOiAhSU5JVElBTFNfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUEhPTkVUSUNTOgotCQkJCXJldHVybiBQSE9ORVRJQ1NfRURFRkFVTFQgPT0gbnVsbCA/IHBob25ldGljcyAhPSBudWxsIDogIVBIT05FVElDU19FREVGQVVMVC5lcXVhbHMocGhvbmV0aWNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTlRBQ0NPVU5UOgotCQkJCXJldHVybiBOVEFDQ09VTlRfRURFRkFVTFQgPT0gbnVsbCA/IG5UQWNjb3VudCAhPSBudWxsIDogIU5UQUNDT1VOVF9FREVGQVVMVC5lcXVhbHMoblRBY2NvdW50KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFURVJJQUxfTEFCRUw6Ci0JCQkJcmV0dXJuIE1BVEVSSUFMX0xBQkVMX0VERUZBVUxUID09IG51bGwgPyBtYXRlcmlhbExhYmVsICE9IG51bGwgOiAhTUFURVJJQUxfTEFCRUxfRURFRkFVTFQuZXF1YWxzKG1hdGVyaWFsTGFiZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT0RFOgotCQkJCXJldHVybiBDT0RFX0VERUZBVUxUID09IG51bGwgPyBjb2RlICE9IG51bGwgOiAhQ09ERV9FREVGQVVMVC5lcXVhbHMoY29kZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0dST1VQOgotCQkJCXJldHVybiBHUk9VUF9FREVGQVVMVCA9PSBudWxsID8gZ3JvdXAgIT0gbnVsbCA6ICFHUk9VUF9FREVGQVVMVC5lcXVhbHMoZ3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX0dST1VQOgotCQkJCXJldHVybiBXT1JLX0dST1VQX0VERUZBVUxUID09IG51bGwgPyB3b3JrR3JvdXAgIT0gbnVsbCA6ICFXT1JLX0dST1VQX0VERUZBVUxULmVxdWFscyh3b3JrR3JvdXApOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FTUFJTF9BRERSRVNTOgotCQkJCXJldHVybiBFTUFJTF9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBlbWFpbEFkZHJlc3MgIT0gbnVsbCA6ICFFTUFJTF9BRERSRVNTX0VERUZBVUxULmVxdWFscyhlbWFpbEFkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTks6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19FREVGQVVMVCA9PSBudWxsID8gaHlwZXJsaW5rICE9IG51bGwgOiAhSFlQRVJMSU5LX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGh5cGVybGlua0FkZHJlc3MgIT0gbnVsbCA6ICFIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVC5lcXVhbHMoaHlwZXJsaW5rQWRkcmVzcyk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fTUFYX1VOSVRTOgotCQkJCXJldHVybiBpc1NldE1heFVuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFQUtfVU5JVFM6Ci0JCQkJcmV0dXJuIGlzU2V0UGVha1VuaXRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQVZBSUxBQkxFX0ZST006Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9GUk9NX0VERUZBVUxUID09IG51bGwgPyBhdmFpbGFibGVGcm9tICE9IG51bGwgOiAhQVZBSUxBQkxFX0ZST01fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZUZyb20pOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BVkFJTEFCTEVfVE86Ci0JCQkJcmV0dXJuIEFWQUlMQUJMRV9UT19FREVGQVVMVCA9PSBudWxsID8gYXZhaWxhYmxlVG8gIT0gbnVsbCA6ICFBVkFJTEFCTEVfVE9fRURFRkFVTFQuZXF1YWxzKGF2YWlsYWJsZVRvKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBUlQ6Ci0JCQkJcmV0dXJuIFNUQVJUX0VERUZBVUxUID09IG51bGwgPyBzdGFydCAhPSBudWxsIDogIVNUQVJUX0VERUZBVUxULmVxdWFscyhzdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0NBTl9MRVZFTDoKLQkJCQlyZXR1cm4gaXNTZXRDYW5MZXZlbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ0NSVUVfQVQ6Ci0JCQkJcmV0dXJuIEFDQ1JVRV9BVF9FREVGQVVMVCA9PSBudWxsID8gYWNjcnVlQXQgIT0gbnVsbCA6ICFBQ0NSVUVfQVRfRURFRkFVTFQuZXF1YWxzKGFjY3J1ZUF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRUdVTEFSX1dPUks6Ci0JCQkJcmV0dXJuIFJFR1VMQVJfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVndWxhcldvcmsgIT0gbnVsbCA6ICFSRUdVTEFSX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlZ3VsYXJXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhT1ZFUlRJTUVfV09SS19FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ1dvcmsgIT0gbnVsbCA6ICFSRU1BSU5JTkdfV09SS19FREVGQVVMVC5lcXVhbHMocmVtYWluaW5nV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURToKLQkJCQlyZXR1cm4gU1RBTkRBUkRfUkFURV9FREVGQVVMVCA9PSBudWxsID8gc3RhbmRhcmRSYXRlICE9IG51bGwgOiAhU1RBTkRBUkRfUkFURV9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fU1RBTkRBUkRfUkFURV9GT1JNQVQ6Ci0JCQkJcmV0dXJuIFNUQU5EQVJEX1JBVEVfRk9STUFUX0VERUZBVUxUID09IG51bGwgPyBzdGFuZGFyZFJhdGVGb3JtYXQgIT0gbnVsbCA6ICFTVEFOREFSRF9SQVRFX0ZPUk1BVF9FREVGQVVMVC5lcXVhbHMoc3RhbmRhcmRSYXRlRm9ybWF0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ09TVDoKLQkJCQlyZXR1cm4gQ09TVF9FREVGQVVMVCA9PSBudWxsID8gY29zdCAhPSBudWxsIDogIUNPU1RfRURFRkFVTFQuZXF1YWxzKGNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFOgotCQkJCXJldHVybiBPVkVSVElNRV9SQVRFX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVJhdGUgIT0gbnVsbCA6ICFPVkVSVElNRV9SQVRFX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9SQVRFX0ZPUk1BVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfUkFURV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IG92ZXJ0aW1lUmF0ZUZvcm1hdCAhPSBudWxsIDogIU9WRVJUSU1FX1JBVEVfRk9STUFUX0VERUZBVUxULmVxdWFscyhvdmVydGltZVJhdGVGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBPVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZUNvc3QgIT0gbnVsbCA6ICFPVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhvdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1BFUl9VU0U6Ci0JCQkJcmV0dXJuIENPU1RfUEVSX1VTRV9FREVGQVVMVCA9PSBudWxsID8gY29zdFBlclVzZSAhPSBudWxsIDogIUNPU1RfUEVSX1VTRV9FREVGQVVMVC5lcXVhbHMoY29zdFBlclVzZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsQ29zdCAhPSBudWxsIDogIUFDVFVBTF9DT1NUX0VERUZBVUxULmVxdWFscyhhY3R1YWxDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZUNvc3QgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19XT1JLX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldFdvcmtWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DT1NUX1ZBUklBTkNFOgotCQkJCXJldHVybiBpc1NldENvc3RWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19TVjoKLQkJCQlyZXR1cm4gaXNTZXRTVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DVjoKLQkJCQlyZXR1cm4gaXNTZXRDVigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19BQ1dQOgotCQkJCXJldHVybiBpc1NldEFDV1AoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBDQUxFTkRBUl9VSURfRURFRkFVTFQgPT0gbnVsbCA/IGNhbGVuZGFyVUlEICE9IG51bGwgOiAhQ0FMRU5EQVJfVUlEX0VERUZBVUxULmVxdWFscyhjYWxlbmRhclVJRCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19CQ1dTOgotCQkJCXJldHVybiBpc1NldEJDV1MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0dFTkVSSUM6Ci0JCQkJcmV0dXJuIGlzU2V0SXNHZW5lcmljKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0lTX0lOQUNUSVZFOgotCQkJCXJldHVybiBpc1NldElzSW5hY3RpdmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fSVNfRU5URVJQUklTRToKLQkJCQlyZXR1cm4gaXNTZXRJc0VudGVycHJpc2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQk9PS0lOR19UWVBFOgotCQkJCXJldHVybiBCT09LSU5HX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGJvb2tpbmdUeXBlICE9IG51bGwgOiAhQk9PS0lOR19UWVBFX0VERUZBVUxULmVxdWFscyhib29raW5nVHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrUHJvdGVjdGVkICE9IG51bGwgOiAhQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxULmVxdWFscyhhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCAhPSBudWxsIDogIUFDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQUNUSVZFX0RJUkVDVE9SWV9HVUlEOgotCQkJCXJldHVybiBBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2ZURpcmVjdG9yeUdVSUQgIT0gbnVsbCA6ICFBQ1RJVkVfRElSRUNUT1JZX0dVSURfRURFRkFVTFQuZXF1YWxzKGFjdGl2ZURpcmVjdG9yeUdVSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19DUkVBVElPTl9EQVRFOgotCQkJCXJldHVybiBDUkVBVElPTl9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvbkRhdGUgIT0gbnVsbCA6ICFDUkVBVElPTl9EQVRFX0VERUZBVUxULmVxdWFscyhjcmVhdGlvbkRhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIGV4dGVuZGVkQXR0cmlidXRlICE9IG51bGwgJiYgIWV4dGVuZGVkQXR0cmlidXRlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRV9fT1VUTElORV9DT0RFOgotCQkJCXJldHVybiBvdXRsaW5lQ29kZSAhPSBudWxsICYmICFvdXRsaW5lQ29kZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX0FWQUlMQUJJTElUWV9QRVJJT0RTOgotCQkJCXJldHVybiBhdmFpbGFiaWxpdHlQZXJpb2RzICE9IG51bGw7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VfX1JBVEVTOgotCQkJCXJldHVybiByYXRlcyAhPSBudWxsOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbml0aWFscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGhvbmV0aWNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwaG9uZXRpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5UQWNjb3VudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoblRBY2NvdW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXRlcmlhbExhYmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXRlcmlhbExhYmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb2RlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXApOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtHcm91cDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod29ya0dyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbWFpbEFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVtYWlsQWRkcmVzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1heFVuaXRzOiAiKTsKLQkJaWYgKG1heFVuaXRzRVNldCkgcmVzdWx0LmFwcGVuZChtYXhVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlYWtVbml0czogIik7Ci0JCWlmIChwZWFrVW5pdHNFU2V0KSByZXN1bHQuYXBwZW5kKHBlYWtVbml0cyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJBbGxvY2F0ZWQ6ICIpOwotCQlpZiAob3ZlckFsbG9jYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQob3ZlckFsbG9jYXRlZCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZUZyb206ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF2YWlsYWJsZUZyb20pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF2YWlsYWJsZVRvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdmFpbGFibGVUbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FuTGV2ZWw6ICIpOwotCQlpZiAoY2FuTGV2ZWxFU2V0KSByZXN1bHQuYXBwZW5kKGNhbkxldmVsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWNjcnVlQXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjY3J1ZUF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZWd1bGFyV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVndWxhcldvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVtYWluaW5nT3ZlcnRpbWVXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZW1haW5pbmdPdmVydGltZVdvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmNlbnRXb3JrQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRXb3JrQ29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YW5kYXJkUmF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhbmRhcmRSYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFuZGFyZFJhdGVGb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YW5kYXJkUmF0ZUZvcm1hdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVSYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZVJhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lUmF0ZUZvcm1hdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVSYXRlRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvdmVydGltZUNvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG92ZXJ0aW1lQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdFBlclVzZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdFBlclVzZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsQ29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0dWFsT3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxPdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrVmFyaWFuY2U6ICIpOwotCQlpZiAod29ya1ZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZCh3b3JrVmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb3N0VmFyaWFuY2U6ICIpOwotCQlpZiAoY29zdFZhcmlhbmNlRVNldCkgcmVzdWx0LmFwcGVuZChjb3N0VmFyaWFuY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzVjogIik7Ci0JCWlmIChzVkVTZXQpIHJlc3VsdC5hcHBlbmQoc1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjVjogIik7Ci0JCWlmIChjVkVTZXQpIHJlc3VsdC5hcHBlbmQoY1YpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhQ1dQOiAiKTsKLQkJaWYgKGFDV1BFU2V0KSByZXN1bHQuYXBwZW5kKGFDV1ApOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNHZW5lcmljOiAiKTsKLQkJaWYgKGlzR2VuZXJpY0VTZXQpIHJlc3VsdC5hcHBlbmQoaXNHZW5lcmljKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNJbmFjdGl2ZTogIik7Ci0JCWlmIChpc0luYWN0aXZlRVNldCkgcmVzdWx0LmFwcGVuZChpc0luYWN0aXZlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNFbnRlcnByaXNlOiAiKTsKLQkJaWYgKGlzRW50ZXJwcmlzZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFbnRlcnByaXNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYm9va2luZ1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJvb2tpbmdUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrUHJvdGVjdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZlRGlyZWN0b3J5R1VJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0aXZlRGlyZWN0b3J5R1VJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JlYXRpb25EYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvbkRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvUmVzb3VyY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZlNjMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9SZXNvdXJjZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXNvdXJjZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5SZXNvdXJjZXNJbXBsI2dldFJlc291cmNlIDxlbT5SZXNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFJlc291cmNlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzb3VyY2UoKSA8ZW0+UmVzb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCByZXNvdXJjZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRSZXNvdXJjZSgpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJlc291cmNlID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFJlc291cmNlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFU19fUkVTT1VSQ0UpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRSZXNvdXJjZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlyZXR1cm4gZ2V0UmVzb3VyY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlnZXRSZXNvdXJjZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzb3VyY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlnZXRSZXNvdXJjZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTX19SRVNPVVJDRToKLQkJCQlyZXR1cm4gcmVzb3VyY2UgIT0gbnVsbCAmJiAhcmVzb3VyY2UuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTg3ODQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUHJlZGVjZXNzb3JMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVwaGFzZWREYXRhVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRVSUQgPGVtPlVJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldElEIDxlbT5JRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc051bGwgPGVtPklzIE51bGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDcmVhdGVEYXRlIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENvbnRhY3QgPGVtPkNvbnRhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRXQlMgPGVtPldCUzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdCU0xldmVsIDxlbT5XQlMgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lTnVtYmVyIDxlbT5PdXRsaW5lIE51bWJlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE91dGxpbmVMZXZlbCA8ZW0+T3V0bGluZSBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFByaW9yaXR5IDxlbT5Qcmlvcml0eTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0IDxlbT5TdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb24gPGVtPkR1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RHVyYXRpb25Gb3JtYXQgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmsgPGVtPldvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdG9wIDxlbT5TdG9wPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVzdW1lIDxlbT5SZXN1bWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1Jlc3VtZVZhbGlkIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0VmZm9ydERyaXZlbiA8ZW0+RWZmb3J0IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUmVjdXJyaW5nIDxlbT5SZWN1cnJpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc092ZXJBbGxvY2F0ZWQgPGVtPk92ZXIgQWxsb2NhdGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFc3RpbWF0ZWQgPGVtPkVzdGltYXRlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc1N1bW1hcnkgPGVtPlN1bW1hcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNpc0NyaXRpY2FsIDxlbT5Dcml0aWNhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSXNTdWJwcm9qZWN0IDxlbT5JcyBTdWJwcm9qZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNJc1N1YnByb2plY3RSZWFkT25seSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRTdWJwcm9qZWN0TmFtZSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNFeHRlcm5hbFRhc2sgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0IDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRFYXJseVN0YXJ0IDxlbT5FYXJseSBTdGFydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEVhcmx5RmluaXNoIDxlbT5FYXJseSBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlU3RhcnQgPGVtPkxhdGUgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMYXRlRmluaXNoIDxlbT5MYXRlIEZpbmlzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFN0YXJ0VmFyaWFuY2UgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RmluaXNoVmFyaWFuY2UgPGVtPkZpbmlzaCBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFdvcmtWYXJpYW5jZSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEZyZWVTbGFjayA8ZW0+RnJlZSBTbGFjazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFRvdGFsU2xhY2sgPGVtPlRvdGFsIFNsYWNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0IDxlbT5GaXhlZCBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Rml4ZWRDb3N0QWNjcnVhbCA8ZW0+Rml4ZWQgQ29zdCBBY2NydWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudENvbXBsZXRlIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSA8ZW0+UGVyY2VudCBXb3JrIENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29zdCA8ZW0+Q29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lQ29zdCA8ZW0+T3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldE92ZXJ0aW1lV29yayA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEFjdHVhbFN0YXJ0IDxlbT5BY3R1YWwgU3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxGaW5pc2ggPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxEdXJhdGlvbiA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsQ29zdCA8ZW0+QWN0dWFsIENvc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZUNvc3QgPGVtPkFjdHVhbCBPdmVydGltZSBDb3N0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QWN0dWFsV29yayA8ZW0+QWN0dWFsIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmsgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVndWxhcldvcmsgPGVtPlJlZ3VsYXIgV29yazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ0R1cmF0aW9uIDxlbT5SZW1haW5pbmcgRHVyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRSZW1haW5pbmdDb3N0IDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ1dvcmsgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0IDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yayA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBQ1dQIDxlbT5BQ1dQPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q1YgPGVtPkNWPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Q29uc3RyYWludFR5cGUgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldENhbGVuZGFyVUlEIDxlbT5DYWxlbmRhciBVSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRDb25zdHJhaW50RGF0ZSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RGVhZGxpbmUgPGVtPkRlYWRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNMZXZlbEFzc2lnbm1lbnRzIDxlbT5MZXZlbCBBc3NpZ25tZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzTGV2ZWxpbmdDYW5TcGxpdCA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0TGV2ZWxpbmdEZWxheSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0IDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVMZXZlbGVkU3RhcnQgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0UHJlTGV2ZWxlZEZpbmlzaCA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0SHlwZXJsaW5rIDxlbT5IeXBlcmxpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRIeXBlcmxpbmtBZGRyZXNzIDxlbT5IeXBlcmxpbmsgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEh5cGVybGlua1N1YkFkZHJlc3MgPGVtPkh5cGVybGluayBTdWIgQWRkcmVzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhciA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0Tm90ZXMgPGVtPk5vdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjaXNIaWRlQmFyIDxlbT5IaWRlIEJhcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2lzUm9sbHVwIDxlbT5Sb2xsdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCQ1dTIDxlbT5CQ1dTPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0QkNXUCA8ZW0+QkNXUDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0RWFybmVkVmFsdWVNZXRob2QgPGVtPkVhcm5lZCBWYWx1ZSBNZXRob2Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRQcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrIFByb3RlY3RlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tJbXBsI2dldEV4dGVuZGVkQXR0cmlidXRlIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRCYXNlbGluZSA8ZW0+QmFzZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UYXNrSW1wbCNnZXRPdXRsaW5lQ29kZSA8ZW0+T3V0bGluZSBDb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGFza0ltcGwjZ2V0VGltZXBoYXNlZERhdGEgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIElEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElEKCkgPGVtPklEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgaUQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzTnVsbCgpIDxlbT5JcyBOdWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzTnVsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX05VTExfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNOdWxsKCkgPGVtPklzIE51bGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNOdWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGwgPSBJU19OVUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBOdWxsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ1JFQVRFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRlRGF0ZSgpIDxlbT5DcmVhdGUgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVEYXRlID0gQ1JFQVRFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGFjdCgpIDxlbT5Db250YWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRhY3QoKSA8ZW0+Q29udGFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udGFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb250YWN0ID0gQ09OVEFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlMoKSA8ZW0+V0JTPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXQlMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd0JTID0gV0JTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU0xldmVsKCkgPGVtPldCUyBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFdCU19MRVZFTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXQlNMZXZlbCgpIDxlbT5XQlMgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdCU0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHdCU0xldmVsID0gV0JTX0xFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVExJTkVfTlVNQkVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVOdW1iZXIoKSA8ZW0+T3V0bGluZSBOdW1iZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE91dGxpbmVOdW1iZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3V0bGluZU51bWJlciA9IE9VVExJTkVfTlVNQkVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVMZXZlbCgpIDxlbT5PdXRsaW5lIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIG91dGxpbmVMZXZlbCA9IE9VVExJTkVfTEVWRUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUFJJT1JJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpb3JpdHkoKSA8ZW0+UHJpb3JpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW9yaXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwcmlvcml0eSA9IFBSSU9SSVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdXJhdGlvbigpIDxlbT5EdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uKCkgPGVtPkR1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkdXJhdGlvbiA9IERVUkFUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER1cmF0aW9uRm9ybWF0KCkgPGVtPkR1cmF0aW9uIEZvcm1hdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RHVyYXRpb25Gb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RHVyYXRpb25Gb3JtYXQoKSA8ZW0+RHVyYXRpb24gRm9ybWF0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREdXJhdGlvbkZvcm1hdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXQgPSBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29yaygpIDxlbT5Xb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmsoKSA8ZW0+V29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB3b3JrID0gV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdG9wKCkgPGVtPlN0b3A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0b3AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1BfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RvcCgpIDxlbT5TdG9wPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdG9wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0b3AgPSBTVE9QX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVTVU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VtZSgpIDxlbT5SZXN1bWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZXN1bWUgPSBSRVNVTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZXN1bWVWYWxpZCgpIDxlbT5SZXN1bWUgVmFsaWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUmVzdW1lVmFsaWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNVTUVfVkFMSURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVzdW1lVmFsaWQoKSA8ZW0+UmVzdW1lIFZhbGlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1Jlc3VtZVZhbGlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgUmVzdW1lIFZhbGlkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bWVWYWxpZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VmZm9ydERyaXZlbigpIDxlbT5FZmZvcnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0VmZm9ydERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVGRk9SVF9EUklWRU5fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRWZmb3J0RHJpdmVuKCkgPGVtPkVmZm9ydCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRWZmb3J0RHJpdmVuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW4gPSBFRkZPUlRfRFJJVkVOX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFZmZvcnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZmZvcnREcml2ZW5FU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJFQ1VSUklOR19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSZWN1cnJpbmcoKSA8ZW0+UmVjdXJyaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JlY3VycmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSZWN1cnJpbmcgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlY3VycmluZ0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc092ZXJBbGxvY2F0ZWQoKSA8ZW0+T3ZlciBBbGxvY2F0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzT3ZlckFsbG9jYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBPdmVyIEFsbG9jYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlckFsbG9jYXRlZEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVNUSU1BVEVEX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VzdGltYXRlZCgpIDxlbT5Fc3RpbWF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXN0aW1hdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlc3RpbWF0ZWQgPSBFU1RJTUFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEVzdGltYXRlZCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXN0aW1hdGVkRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBNSUxFU1RPTkVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTWlsZXN0b25lKCkgPGVtPk1pbGVzdG9uZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1pbGVzdG9uZSA9IE1JTEVTVE9ORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTWlsZXN0b25lIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdW1tYXJ5KCkgPGVtPlN1bW1hcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VtbWFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNVTU1BUllfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3VtbWFyeSgpIDxlbT5TdW1tYXJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1N1bW1hcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1bW1hcnkgPSBTVU1NQVJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBTdW1tYXJ5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdW1tYXJ5RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ3JpdGljYWwoKSA8ZW0+Q3JpdGljYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ3JpdGljYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDUklUSUNBTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDcml0aWNhbCgpIDxlbT5Dcml0aWNhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDcml0aWNhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQ3JpdGljYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNyaXRpY2FsRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0KCkgPGVtPklzIFN1YnByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1N1YnByb2plY3QoKSA8ZW0+SXMgU3VicHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N1YnByb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPGVtPklzIFN1YnByb2plY3QgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKSA8ZW0+SXMgU3VicHJvamVjdCBSZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTdWJwcm9qZWN0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3VicHJvamVjdFJlYWRPbmx5ID0gSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN1YnByb2plY3QgUmVhZCBPbmx5IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJwcm9qZWN0TmFtZSgpIDxlbT5TdWJwcm9qZWN0IE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnByb2plY3ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJQUk9KRUNUX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VicHJvamVjdE5hbWUoKSA8ZW0+U3VicHJvamVjdCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJwcm9qZWN0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWJwcm9qZWN0TmFtZSA9IFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4dGVybmFsVGFzaygpIDxlbT5FeHRlcm5hbCBUYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4dGVybmFsVGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVYVEVSTkFMX1RBU0tfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRXh0ZXJuYWxUYXNrKCkgPGVtPkV4dGVybmFsIFRhc2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXh0ZXJuYWxUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2sgPSBFWFRFUk5BTF9UQVNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBFeHRlcm5hbCBUYXNrIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbFRhc2tFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpIDxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsVGFza1Byb2plY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1RBU0tfUFJPSkVDVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbFRhc2tQcm9qZWN0KCkgPGVtPkV4dGVybmFsIFRhc2sgUHJvamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbFRhc2tQcm9qZWN0ID0gRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5U3RhcnQoKSA8ZW0+RWFybHkgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5U3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZWFybHlTdGFydCA9IEVBUkxZX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVhcmx5RmluaXNoKCkgPGVtPkVhcmx5IEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybHlGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJseUZpbmlzaCgpIDxlbT5FYXJseSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVhcmx5RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGVhcmx5RmluaXNoID0gRUFSTFlfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVTdGFydCgpIDxlbT5MYXRlIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMYXRlU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGF0ZVN0YXJ0KCkgPGVtPkxhdGUgU3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsYXRlU3RhcnQgPSBMQVRFX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IExBVEVfRklOSVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhdGVGaW5pc2goKSA8ZW0+TGF0ZSBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExhdGVGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGF0ZUZpbmlzaCA9IExBVEVfRklOSVNIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0VmFyaWFuY2UoKSA8ZW0+U3RhcnQgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0VmFyaWFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBTVEFSVF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydFZhcmlhbmNlKCkgPGVtPlN0YXJ0IFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBzdGFydFZhcmlhbmNlID0gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoVmFyaWFuY2UoKSA8ZW0+RmluaXNoIFZhcmlhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hWYXJpYW5jZSgpIDxlbT5GaW5pc2ggVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaFZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmaW5pc2hWYXJpYW5jZSA9IEZJTklTSF9WQVJJQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JrVmFyaWFuY2UoKSA8ZW0+V29yayBWYXJpYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1ZhcmlhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1ZhcmlhbmNlKCkgPGVtPldvcmsgVmFyaWFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtWYXJpYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IHdvcmtWYXJpYW5jZSA9IFdPUktfVkFSSUFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFdvcmsgVmFyaWFuY2UgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdvcmtWYXJpYW5jZUVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgRlJFRV9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcmVlU2xhY2soKSA8ZW0+RnJlZSBTbGFjazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJlZVNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBmcmVlU2xhY2sgPSBGUkVFX1NMQUNLX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvdGFsU2xhY2soKSA8ZW0+VG90YWwgU2xhY2s8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvdGFsU2xhY2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUT1RBTF9TTEFDS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb3RhbFNsYWNrKCkgPGVtPlRvdGFsIFNsYWNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb3RhbFNsYWNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0b3RhbFNsYWNrID0gVE9UQUxfU0xBQ0tfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0KCkgPGVtPkZpeGVkIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmbG9hdCBGSVhFRF9DT1NUX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpeGVkQ29zdCgpIDxlbT5GaXhlZCBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaXhlZENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBGaXhlZCBDb3N0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpIDxlbT5GaXhlZCBDb3N0IEFjY3J1YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpeGVkQ29zdEFjY3J1YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEX0NPU1RfQUNDUlVBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaXhlZENvc3RBY2NydWFsKCkgPGVtPkZpeGVkIENvc3QgQWNjcnVhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaXhlZENvc3RBY2NydWFsID0gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRDb21wbGV0ZSA9IFBFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIDxlbT5QZXJjZW50IFdvcmsgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmNlbnRXb3JrQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBlcmNlbnRXb3JrQ29tcGxldGUgPSBQRVJDRU5UX1dPUktfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29zdCgpIDxlbT5Db3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgQ09TVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3N0KCkgPGVtPkNvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGNvc3QgPSBDT1NUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBPVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE92ZXJ0aW1lQ29zdCgpIDxlbT5PdmVydGltZSBDb3N0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdmVydGltZUNvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIG92ZXJ0aW1lQ29zdCA9IE9WRVJUSU1FX0NPU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3ZlcnRpbWVXb3JrKCkgPGVtPk92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPdmVydGltZVdvcmsoKSA8ZW0+T3ZlcnRpbWUgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3ZlcnRpbWVXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IG92ZXJ0aW1lV29yayA9IE9WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsU3RhcnQoKSA8ZW0+QWN0dWFsIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbFN0YXJ0KCkgPGVtPkFjdHVhbCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsU3RhcnQgPSBBQ1RVQUxfU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRmluaXNoKCkgPGVtPkFjdHVhbCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbEZpbmlzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0ZJTklTSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxGaW5pc2goKSA8ZW0+QWN0dWFsIEZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbEZpbmlzaCA9IEFDVFVBTF9GSU5JU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsRHVyYXRpb24oKSA8ZW0+QWN0dWFsIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbER1cmF0aW9uKCkgPGVtPkFjdHVhbCBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsRHVyYXRpb24gPSBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsQ29zdCgpIDxlbT5BY3R1YWwgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbENvc3QoKSA8ZW0+QWN0dWFsIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbENvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIGFjdHVhbENvc3QgPSBBQ1RVQUxfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZUNvc3QoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lQ29zdCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCBhY3R1YWxPdmVydGltZUNvc3QgPSBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBBQ1RVQUxfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrKCkgPGVtPkFjdHVhbCBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGFjdHVhbFdvcmsgPSBBQ1RVQUxfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKSA8ZW0+QWN0dWFsIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrKCkgPGVtPkFjdHVhbCBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3R1YWxPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgYWN0dWFsT3ZlcnRpbWVXb3JrID0gQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVndWxhcldvcmsoKSA8ZW0+UmVndWxhciBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWd1bGFyV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVHVUxBUl9XT1JLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZ3VsYXJXb3JrKCkgPGVtPlJlZ3VsYXIgV29yazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVndWxhcldvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVndWxhcldvcmsgPSBSRUdVTEFSX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKSA8ZW0+UmVtYWluaW5nIER1cmF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdEdXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0R1cmF0aW9uKCkgPGVtPlJlbWFpbmluZyBEdXJhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nRHVyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nRHVyYXRpb24gPSBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nQ29zdCgpIDxlbT5SZW1haW5pbmcgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ0Nvc3QoKSA8ZW0+UmVtYWluaW5nIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ0Nvc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdEZWNpbWFsIHJlbWFpbmluZ0Nvc3QgPSBSRU1BSU5JTkdfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdXb3JrKCkgPGVtPlJlbWFpbmluZyBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdXb3JrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlbWFpbmluZ1dvcmsgPSBSRU1BSU5JTkdfV09SS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIENvc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgpIDxlbT5SZW1haW5pbmcgT3ZlcnRpbWUgQ29zdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnRGVjaW1hbCByZW1haW5pbmdPdmVydGltZUNvc3QgPSBSRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKSA8ZW0+UmVtYWluaW5nIE92ZXJ0aW1lIFdvcms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlbWFpbmluZ092ZXJ0aW1lV29yaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgPGVtPlJlbWFpbmluZyBPdmVydGltZSBXb3JrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZW1haW5pbmdPdmVydGltZVdvcmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVtYWluaW5nT3ZlcnRpbWVXb3JrID0gUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IEFDV1BfRURFRkFVTFQgPSAwLjBGOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QUNXUCgpIDxlbT5BQ1dQPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBQ1dQKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmxvYXQgYUNXUCA9IEFDV1BfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIEFDV1AgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFDV1BFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q1YoKSA8ZW0+Q1Y8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENWKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGZsb2F0IENWX0VERUZBVUxUID0gMC4wRjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENWKCkgPGVtPkNWPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDVigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGZsb2F0IGNWID0gQ1ZfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIENWIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjVkVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25zdHJhaW50VHlwZSgpIDxlbT5Db25zdHJhaW50IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnN0cmFpbnRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnRUeXBlKCkgPGVtPkNvbnN0cmFpbnQgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGNvbnN0cmFpbnRUeXBlID0gQ09OU1RSQUlOVF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhbGVuZGFyVUlEKCkgPGVtPkNhbGVuZGFyIFVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FsZW5kYXJVSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBDQUxFTkRBUl9VSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FsZW5kYXJVSUQoKSA8ZW0+Q2FsZW5kYXIgVUlEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWxlbmRhclVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgY2FsZW5kYXJVSUQgPSBDQUxFTkRBUl9VSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29uc3RyYWludERhdGUoKSA8ZW0+Q29uc3RyYWludCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25zdHJhaW50RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQ09OU1RSQUlOVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnN0cmFpbnREYXRlKCkgPGVtPkNvbnN0cmFpbnQgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uc3RyYWludERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY29uc3RyYWludERhdGUgPSBDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVhZGxpbmUoKSA8ZW0+RGVhZGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlYWRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBERUFETElORV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWFkbGluZSgpIDxlbT5EZWFkbGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVhZGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZGVhZGxpbmUgPSBERUFETElORV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsQXNzaWdubWVudHMoKSA8ZW0+TGV2ZWwgQXNzaWdubWVudHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxBc3NpZ25tZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50cyA9IExFVkVMX0FTU0lHTk1FTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBMZXZlbCBBc3NpZ25tZW50cyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxBc3NpZ25tZW50c0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xldmVsaW5nQ2FuU3BsaXQoKSA8ZW0+TGV2ZWxpbmcgQ2FuIFNwbGl0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xldmVsaW5nQ2FuU3BsaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMRVZFTElOR19DQU5fU1BMSVRfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpIDxlbT5MZXZlbGluZyBDYW4gU3BsaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTGV2ZWxpbmdDYW5TcGxpdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGV2ZWxpbmcgQ2FuIFNwbGl0IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsZXZlbGluZ0NhblNwbGl0RVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsaW5nRGVsYXkoKSA8ZW0+TGV2ZWxpbmcgRGVsYXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbGluZ0RlbGF5KCkgPGVtPkxldmVsaW5nIERlbGF5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbGluZ0RlbGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5ID0gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIDxlbT5MZXZlbGluZyBEZWxheSBGb3JtYXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsaW5nRGVsYXlGb3JtYXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGxldmVsaW5nRGVsYXlGb3JtYXQgPSBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkgPGVtPlByZSBMZXZlbGVkIFN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkU3RhcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRTdGFydCgpIDxlbT5QcmUgTGV2ZWxlZCBTdGFydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlTGV2ZWxlZFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHByZUxldmVsZWRTdGFydCA9IFBSRV9MRVZFTEVEX1NUQVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZUxldmVsZWRGaW5pc2goKSA8ZW0+UHJlIExldmVsZWQgRmluaXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVMZXZlbGVkRmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIDxlbT5QcmUgTGV2ZWxlZCBGaW5pc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZUxldmVsZWRGaW5pc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcHJlTGV2ZWxlZEZpbmlzaCA9IFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIeXBlcmxpbmsoKSA8ZW0+SHlwZXJsaW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rID0gSFlQRVJMSU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua0FkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua0FkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rQWRkcmVzcyA9IEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKSA8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIeXBlcmxpbmtTdWJBZGRyZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIWVBFUkxJTktfU1VCX0FERFJFU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SHlwZXJsaW5rU3ViQWRkcmVzcygpIDxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEh5cGVybGlua1N1YkFkZHJlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzcyA9IEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSA8ZW0+SWdub3JlIFJlc291cmNlIENhbGVuZGFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIDxlbT5JZ25vcmUgUmVzb3VyY2UgQ2FsZW5kYXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IElHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSWdub3JlIFJlc291cmNlIENhbGVuZGFyIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vdGVzKCkgPGVtPk5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90ZXMoKSA8ZW0+Tm90ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vdGVzID0gTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBISURFX0JBUl9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIaWRlQmFyKCkgPGVtPkhpZGUgQmFyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0hpZGVCYXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXIgPSBISURFX0JBUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSGlkZSBCYXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFJPTExVUF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNSb2xsdXAoKSA8ZW0+Um9sbHVwPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1JvbGx1cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcm9sbHVwID0gUk9MTFVQX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBSb2xsdXAgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJvbGx1cEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXU19FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dTKCkgPGVtPkJDV1M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dTID0gQkNXU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXU0VTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZmxvYXQgQkNXUF9FREVGQVVMVCA9IDAuMEY7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCQ1dQKCkgPGVtPkJDV1A8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJDV1AoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBmbG9hdCBiQ1dQID0gQkNXUF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgQkNXUCBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYkNXUEVTZXQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIDxlbT5QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFBIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKSA8ZW0+UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlID0gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpIDxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEVBUk5FRF9WQUxVRV9NRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKSA8ZW0+RWFybmVkIFZhbHVlIE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RWFybmVkVmFsdWVNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kID0gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yTGluaygpIDxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHByZWRlY2Vzc29yTGluayA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbFdvcmtQcm90ZWN0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEFDVFVBTF9XT1JLX1BST1RFQ1RFRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgPGVtPkFjdHVhbCBXb3JrIFByb3RlY3RlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxXb3JrUHJvdGVjdGVkID0gQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpIDxlbT5BY3R1YWwgT3ZlcnRpbWUgV29yayBQcm90ZWN0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgPSBBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBleHRlbmRlZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlbGluZSgpIDxlbT5CYXNlbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGJhc2VsaW5lID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dGxpbmVDb2RlKCkgPGVtPk91dGxpbmUgQ29kZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRsaW5lQ29kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IG91dGxpbmVDb2RlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRpbWVwaGFzZWREYXRhKCkgPGVtPlRpbWVwaGFzZWQgRGF0YTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUaW1lcGhhc2VkRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHRpbWVwaGFzZWREYXRhID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlELCBvbGRVSUQsIHVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldElEKCkgewotCQlyZXR1cm4gaUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUQoQmlnSW50ZWdlciBuZXdJRCkgewotCQlCaWdJbnRlZ2VyIG9sZElEID0gaUQ7Ci0JCWlEID0gbmV3SUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUQsIG9sZElELCBpRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKEJpZ0ludGVnZXIgbmV3VHlwZSkgewotCQlCaWdJbnRlZ2VyIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNOdWxsKGJvb2xlYW4gbmV3SXNOdWxsKSB7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsID0gaXNOdWxsOwotCQlpc051bGwgPSBuZXdJc051bGw7Ci0JCWJvb2xlYW4gb2xkSXNOdWxsRVNldCA9IGlzTnVsbEVTZXQ7Ci0JCWlzTnVsbEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEwsIG9sZElzTnVsbCwgaXNOdWxsLCAhb2xkSXNOdWxsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNOdWxsKCkgewotCQlib29sZWFuIG9sZElzTnVsbCA9IGlzTnVsbDsKLQkJYm9vbGVhbiBvbGRJc051bGxFU2V0ID0gaXNOdWxsRVNldDsKLQkJaXNOdWxsID0gSVNfTlVMTF9FREVGQVVMVDsKLQkJaXNOdWxsRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTCwgb2xkSXNOdWxsLCBJU19OVUxMX0VERUZBVUxULCBvbGRJc051bGxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc051bGwoKSB7Ci0JCXJldHVybiBpc051bGxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q3JlYXRlRGF0ZSgpIHsKLQkJcmV0dXJuIGNyZWF0ZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRlRGF0ZShPYmplY3QgbmV3Q3JlYXRlRGF0ZSkgewotCQlPYmplY3Qgb2xkQ3JlYXRlRGF0ZSA9IGNyZWF0ZURhdGU7Ci0JCWNyZWF0ZURhdGUgPSBuZXdDcmVhdGVEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFLCBvbGRDcmVhdGVEYXRlLCBjcmVhdGVEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250YWN0KCkgewotCQlyZXR1cm4gY29udGFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWN0KFN0cmluZyBuZXdDb250YWN0KSB7Ci0JCVN0cmluZyBvbGRDb250YWN0ID0gY29udGFjdDsKLQkJY29udGFjdCA9IG5ld0NvbnRhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OVEFDVCwgb2xkQ29udGFjdCwgY29udGFjdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V0JTKCkgewotCQlyZXR1cm4gd0JTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCUyhTdHJpbmcgbmV3V0JTKSB7Ci0JCVN0cmluZyBvbGRXQlMgPSB3QlM7Ci0JCXdCUyA9IG5ld1dCUzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlMsIG9sZFdCUywgd0JTKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXQlNMZXZlbCgpIHsKLQkJcmV0dXJuIHdCU0xldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdCU0xldmVsKFN0cmluZyBuZXdXQlNMZXZlbCkgewotCQlTdHJpbmcgb2xkV0JTTGV2ZWwgPSB3QlNMZXZlbDsKLQkJd0JTTGV2ZWwgPSBuZXdXQlNMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUwsIG9sZFdCU0xldmVsLCB3QlNMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZU51bWJlcigpIHsKLQkJcmV0dXJuIG91dGxpbmVOdW1iZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZU51bWJlcihTdHJpbmcgbmV3T3V0bGluZU51bWJlcikgewotCQlTdHJpbmcgb2xkT3V0bGluZU51bWJlciA9IG91dGxpbmVOdW1iZXI7Ci0JCW91dGxpbmVOdW1iZXIgPSBuZXdPdXRsaW5lTnVtYmVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSLCBvbGRPdXRsaW5lTnVtYmVyLCBvdXRsaW5lTnVtYmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0T3V0bGluZUxldmVsKCkgewotCQlyZXR1cm4gb3V0bGluZUxldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVMZXZlbChCaWdJbnRlZ2VyIG5ld091dGxpbmVMZXZlbCkgewotCQlCaWdJbnRlZ2VyIG9sZE91dGxpbmVMZXZlbCA9IG91dGxpbmVMZXZlbDsKLQkJb3V0bGluZUxldmVsID0gbmV3T3V0bGluZUxldmVsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTEVWRUwsIG9sZE91dGxpbmVMZXZlbCwgb3V0bGluZUxldmVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UHJpb3JpdHkoKSB7Ci0JCXJldHVybiBwcmlvcml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eShCaWdJbnRlZ2VyIG5ld1ByaW9yaXR5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkUHJpb3JpdHkgPSBwcmlvcml0eTsKLQkJcHJpb3JpdHkgPSBuZXdQcmlvcml0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWSwgb2xkUHJpb3JpdHksIHByaW9yaXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KE9iamVjdCBuZXdTdGFydCkgewotCQlPYmplY3Qgb2xkU3RhcnQgPSBzdGFydDsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSCwgb2xkRmluaXNoLCBmaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldER1cmF0aW9uKCkgewotCQlyZXR1cm4gZHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RHVyYXRpb24oT2JqZWN0IG5ld0R1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGREdXJhdGlvbiA9IGR1cmF0aW9uOwotCQlkdXJhdGlvbiA9IG5ld0R1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OLCBvbGREdXJhdGlvbiwgZHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXREdXJhdGlvbkZvcm1hdCgpIHsKLQkJcmV0dXJuIGR1cmF0aW9uRm9ybWF0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldER1cmF0aW9uRm9ybWF0KEJpZ0ludGVnZXIgbmV3RHVyYXRpb25Gb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGREdXJhdGlvbkZvcm1hdCA9IGR1cmF0aW9uRm9ybWF0OwotCQlkdXJhdGlvbkZvcm1hdCA9IG5ld0R1cmF0aW9uRm9ybWF0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVCwgb2xkRHVyYXRpb25Gb3JtYXQsIGR1cmF0aW9uRm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRXb3JrKCkgewotCQlyZXR1cm4gd29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JrKE9iamVjdCBuZXdXb3JrKSB7Ci0JCU9iamVjdCBvbGRXb3JrID0gd29yazsKLQkJd29yayA9IG5ld1dvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSywgb2xkV29yaywgd29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0U3RvcCgpIHsKLQkJcmV0dXJuIHN0b3A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RvcChPYmplY3QgbmV3U3RvcCkgewotCQlPYmplY3Qgb2xkU3RvcCA9IHN0b3A7Ci0JCXN0b3AgPSBuZXdTdG9wOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1AsIG9sZFN0b3AsIHN0b3ApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFJlc3VtZSgpIHsKLQkJcmV0dXJuIHJlc3VtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWUoT2JqZWN0IG5ld1Jlc3VtZSkgewotCQlPYmplY3Qgb2xkUmVzdW1lID0gcmVzdW1lOwotCQlyZXN1bWUgPSBuZXdSZXN1bWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FLCBvbGRSZXN1bWUsIHJlc3VtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bWVWYWxpZChib29sZWFuIG5ld1Jlc3VtZVZhbGlkKSB7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWQgPSByZXN1bWVWYWxpZDsKLQkJcmVzdW1lVmFsaWQgPSBuZXdSZXN1bWVWYWxpZDsKLQkJYm9vbGVhbiBvbGRSZXN1bWVWYWxpZEVTZXQgPSByZXN1bWVWYWxpZEVTZXQ7Ci0JCXJlc3VtZVZhbGlkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElELCBvbGRSZXN1bWVWYWxpZCwgcmVzdW1lVmFsaWQsICFvbGRSZXN1bWVWYWxpZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFJlc3VtZVZhbGlkKCkgewotCQlib29sZWFuIG9sZFJlc3VtZVZhbGlkID0gcmVzdW1lVmFsaWQ7Ci0JCWJvb2xlYW4gb2xkUmVzdW1lVmFsaWRFU2V0ID0gcmVzdW1lVmFsaWRFU2V0OwotCQlyZXN1bWVWYWxpZCA9IFJFU1VNRV9WQUxJRF9FREVGQVVMVDsKLQkJcmVzdW1lVmFsaWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUVfVkFMSUQsIG9sZFJlc3VtZVZhbGlkLCBSRVNVTUVfVkFMSURfRURFRkFVTFQsIG9sZFJlc3VtZVZhbGlkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0UmVzdW1lVmFsaWQoKSB7Ci0JCXJldHVybiByZXN1bWVWYWxpZEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWZmb3J0RHJpdmVuKGJvb2xlYW4gbmV3RWZmb3J0RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuID0gZWZmb3J0RHJpdmVuOwotCQllZmZvcnREcml2ZW4gPSBuZXdFZmZvcnREcml2ZW47Ci0JCWJvb2xlYW4gb2xkRWZmb3J0RHJpdmVuRVNldCA9IGVmZm9ydERyaXZlbkVTZXQ7Ci0JCWVmZm9ydERyaXZlbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU4sIG9sZEVmZm9ydERyaXZlbiwgZWZmb3J0RHJpdmVuLCAhb2xkRWZmb3J0RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RWZmb3J0RHJpdmVuKCkgewotCQlib29sZWFuIG9sZEVmZm9ydERyaXZlbiA9IGVmZm9ydERyaXZlbjsKLQkJYm9vbGVhbiBvbGRFZmZvcnREcml2ZW5FU2V0ID0gZWZmb3J0RHJpdmVuRVNldDsKLQkJZWZmb3J0RHJpdmVuID0gRUZGT1JUX0RSSVZFTl9FREVGQVVMVDsKLQkJZWZmb3J0RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTiwgb2xkRWZmb3J0RHJpdmVuLCBFRkZPUlRfRFJJVkVOX0VERUZBVUxULCBvbGRFZmZvcnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFZmZvcnREcml2ZW4oKSB7Ci0JCXJldHVybiBlZmZvcnREcml2ZW5FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVjdXJyaW5nKCkgewotCQlyZXR1cm4gcmVjdXJyaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlY3VycmluZyhib29sZWFuIG5ld1JlY3VycmluZykgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJcmVjdXJyaW5nID0gbmV3UmVjdXJyaW5nOwotCQlib29sZWFuIG9sZFJlY3VycmluZ0VTZXQgPSByZWN1cnJpbmdFU2V0OwotCQlyZWN1cnJpbmdFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgcmVjdXJyaW5nLCAhb2xkUmVjdXJyaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0UmVjdXJyaW5nKCkgewotCQlib29sZWFuIG9sZFJlY3VycmluZyA9IHJlY3VycmluZzsKLQkJYm9vbGVhbiBvbGRSZWN1cnJpbmdFU2V0ID0gcmVjdXJyaW5nRVNldDsKLQkJcmVjdXJyaW5nID0gUkVDVVJSSU5HX0VERUZBVUxUOwotCQlyZWN1cnJpbmdFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkcsIG9sZFJlY3VycmluZywgUkVDVVJSSU5HX0VERUZBVUxULCBvbGRSZWN1cnJpbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRSZWN1cnJpbmcoKSB7Ci0JCXJldHVybiByZWN1cnJpbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3ZlckFsbG9jYXRlZChib29sZWFuIG5ld092ZXJBbGxvY2F0ZWQpIHsKLQkJYm9vbGVhbiBvbGRPdmVyQWxsb2NhdGVkID0gb3ZlckFsbG9jYXRlZDsKLQkJb3ZlckFsbG9jYXRlZCA9IG5ld092ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVELCBvbGRPdmVyQWxsb2NhdGVkLCBvdmVyQWxsb2NhdGVkLCAhb2xkT3ZlckFsbG9jYXRlZEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldE92ZXJBbGxvY2F0ZWQoKSB7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZCA9IG92ZXJBbGxvY2F0ZWQ7Ci0JCWJvb2xlYW4gb2xkT3ZlckFsbG9jYXRlZEVTZXQgPSBvdmVyQWxsb2NhdGVkRVNldDsKLQkJb3ZlckFsbG9jYXRlZCA9IE9WRVJfQUxMT0NBVEVEX0VERUZBVUxUOwotCQlvdmVyQWxsb2NhdGVkRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQsIG9sZE92ZXJBbGxvY2F0ZWQsIE9WRVJfQUxMT0NBVEVEX0VERUZBVUxULCBvbGRPdmVyQWxsb2NhdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0T3ZlckFsbG9jYXRlZCgpIHsKLQkJcmV0dXJuIG92ZXJBbGxvY2F0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGVkKCkgewotCQlyZXR1cm4gZXN0aW1hdGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRlZChib29sZWFuIG5ld0VzdGltYXRlZCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJZXN0aW1hdGVkID0gbmV3RXN0aW1hdGVkOwotCQlib29sZWFuIG9sZEVzdGltYXRlZEVTZXQgPSBlc3RpbWF0ZWRFU2V0OwotCQllc3RpbWF0ZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgZXN0aW1hdGVkLCAhb2xkRXN0aW1hdGVkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RXN0aW1hdGVkKCkgewotCQlib29sZWFuIG9sZEVzdGltYXRlZCA9IGVzdGltYXRlZDsKLQkJYm9vbGVhbiBvbGRFc3RpbWF0ZWRFU2V0ID0gZXN0aW1hdGVkRVNldDsKLQkJZXN0aW1hdGVkID0gRVNUSU1BVEVEX0VERUZBVUxUOwotCQllc3RpbWF0ZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQsIG9sZEVzdGltYXRlZCwgRVNUSU1BVEVEX0VERUZBVUxULCBvbGRFc3RpbWF0ZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRFc3RpbWF0ZWQoKSB7Ci0JCXJldHVybiBlc3RpbWF0ZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWlsZXN0b25lKCkgewotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbGVzdG9uZShib29sZWFuIG5ld01pbGVzdG9uZSkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJbWlsZXN0b25lID0gbmV3TWlsZXN0b25lOwotCQlib29sZWFuIG9sZE1pbGVzdG9uZUVTZXQgPSBtaWxlc3RvbmVFU2V0OwotCQltaWxlc3RvbmVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgbWlsZXN0b25lLCAhb2xkTWlsZXN0b25lRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TWlsZXN0b25lKCkgewotCQlib29sZWFuIG9sZE1pbGVzdG9uZSA9IG1pbGVzdG9uZTsKLQkJYm9vbGVhbiBvbGRNaWxlc3RvbmVFU2V0ID0gbWlsZXN0b25lRVNldDsKLQkJbWlsZXN0b25lID0gTUlMRVNUT05FX0VERUZBVUxUOwotCQltaWxlc3RvbmVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkUsIG9sZE1pbGVzdG9uZSwgTUlMRVNUT05FX0VERUZBVUxULCBvbGRNaWxlc3RvbmVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRNaWxlc3RvbmUoKSB7Ci0JCXJldHVybiBtaWxlc3RvbmVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VtbWFyeSgpIHsKLQkJcmV0dXJuIHN1bW1hcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3VtbWFyeShib29sZWFuIG5ld1N1bW1hcnkpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJc3VtbWFyeSA9IG5ld1N1bW1hcnk7Ci0JCWJvb2xlYW4gb2xkU3VtbWFyeUVTZXQgPSBzdW1tYXJ5RVNldDsKLQkJc3VtbWFyeUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIHN1bW1hcnksICFvbGRTdW1tYXJ5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3VtbWFyeSgpIHsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5ID0gc3VtbWFyeTsKLQkJYm9vbGVhbiBvbGRTdW1tYXJ5RVNldCA9IHN1bW1hcnlFU2V0OwotCQlzdW1tYXJ5ID0gU1VNTUFSWV9FREVGQVVMVDsKLQkJc3VtbWFyeUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlksIG9sZFN1bW1hcnksIFNVTU1BUllfRURFRkFVTFQsIG9sZFN1bW1hcnlFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRTdW1tYXJ5KCkgewotCQlyZXR1cm4gc3VtbWFyeUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDcml0aWNhbCgpIHsKLQkJcmV0dXJuIGNyaXRpY2FsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENyaXRpY2FsKGJvb2xlYW4gbmV3Q3JpdGljYWwpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQljcml0aWNhbCA9IG5ld0NyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIGNyaXRpY2FsLCAhb2xkQ3JpdGljYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRDcml0aWNhbCgpIHsKLQkJYm9vbGVhbiBvbGRDcml0aWNhbCA9IGNyaXRpY2FsOwotCQlib29sZWFuIG9sZENyaXRpY2FsRVNldCA9IGNyaXRpY2FsRVNldDsKLQkJY3JpdGljYWwgPSBDUklUSUNBTF9FREVGQVVMVDsKLQkJY3JpdGljYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTCwgb2xkQ3JpdGljYWwsIENSSVRJQ0FMX0VERUZBVUxULCBvbGRDcml0aWNhbEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldENyaXRpY2FsKCkgewotCQlyZXR1cm4gY3JpdGljYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3VicHJvamVjdChib29sZWFuIG5ld0lzU3VicHJvamVjdCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdCA9IGlzU3VicHJvamVjdDsKLQkJaXNTdWJwcm9qZWN0ID0gbmV3SXNTdWJwcm9qZWN0OwotCQlib29sZWFuIG9sZElzU3VicHJvamVjdEVTZXQgPSBpc1N1YnByb2plY3RFU2V0OwotCQlpc1N1YnByb2plY3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNULCBvbGRJc1N1YnByb2plY3QsIGlzU3VicHJvamVjdCwgIW9sZElzU3VicHJvamVjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdCgpIHsKLQkJYm9vbGVhbiBvbGRJc1N1YnByb2plY3QgPSBpc1N1YnByb2plY3Q7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0RVNldCA9IGlzU3VicHJvamVjdEVTZXQ7Ci0JCWlzU3VicHJvamVjdCA9IElTX1NVQlBST0pFQ1RfRURFRkFVTFQ7Ci0JCWlzU3VicHJvamVjdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1QsIG9sZElzU3VicHJvamVjdCwgSVNfU1VCUFJPSkVDVF9FREVGQVVMVCwgb2xkSXNTdWJwcm9qZWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0RVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlyZXR1cm4gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoYm9vbGVhbiBuZXdJc1N1YnByb2plY3RSZWFkT25seSkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWlzU3VicHJvamVjdFJlYWRPbmx5ID0gbmV3SXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgaXNTdWJwcm9qZWN0UmVhZE9ubHksICFvbGRJc1N1YnByb2plY3RSZWFkT25seUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3VicHJvamVjdFJlYWRPbmx5KCkgewotCQlib29sZWFuIG9sZElzU3VicHJvamVjdFJlYWRPbmx5ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHk7Ci0JCWJvb2xlYW4gb2xkSXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0ID0gaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0OwotCQlpc1N1YnByb2plY3RSZWFkT25seSA9IElTX1NVQlBST0pFQ1RfUkVBRF9PTkxZX0VERUZBVUxUOwotCQlpc1N1YnByb2plY3RSZWFkT25seUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZLCBvbGRJc1N1YnByb2plY3RSZWFkT25seSwgSVNfU1VCUFJPSkVDVF9SRUFEX09OTFlfRURFRkFVTFQsIG9sZElzU3VicHJvamVjdFJlYWRPbmx5RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiBpc1N1YnByb2plY3RSZWFkT25seUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdWJwcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHN1YnByb2plY3ROYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1YnByb2plY3ROYW1lKFN0cmluZyBuZXdTdWJwcm9qZWN0TmFtZSkgewotCQlTdHJpbmcgb2xkU3VicHJvamVjdE5hbWUgPSBzdWJwcm9qZWN0TmFtZTsKLQkJc3VicHJvamVjdE5hbWUgPSBuZXdTdWJwcm9qZWN0TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUUsIG9sZFN1YnByb2plY3ROYW1lLCBzdWJwcm9qZWN0TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFzayhib29sZWFuIG5ld0V4dGVybmFsVGFzaykgewotCQlib29sZWFuIG9sZEV4dGVybmFsVGFzayA9IGV4dGVybmFsVGFzazsKLQkJZXh0ZXJuYWxUYXNrID0gbmV3RXh0ZXJuYWxUYXNrOwotCQlib29sZWFuIG9sZEV4dGVybmFsVGFza0VTZXQgPSBleHRlcm5hbFRhc2tFU2V0OwotCQlleHRlcm5hbFRhc2tFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLLCBvbGRFeHRlcm5hbFRhc2ssIGV4dGVybmFsVGFzaywgIW9sZEV4dGVybmFsVGFza0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEV4dGVybmFsVGFzaygpIHsKLQkJYm9vbGVhbiBvbGRFeHRlcm5hbFRhc2sgPSBleHRlcm5hbFRhc2s7Ci0JCWJvb2xlYW4gb2xkRXh0ZXJuYWxUYXNrRVNldCA9IGV4dGVybmFsVGFza0VTZXQ7Ci0JCWV4dGVybmFsVGFzayA9IEVYVEVSTkFMX1RBU0tfRURFRkFVTFQ7Ci0JCWV4dGVybmFsVGFza0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0ssIG9sZEV4dGVybmFsVGFzaywgRVhURVJOQUxfVEFTS19FREVGQVVMVCwgb2xkRXh0ZXJuYWxUYXNrRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0RXh0ZXJuYWxUYXNrKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxUYXNrRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVybmFsVGFza1Byb2plY3QoKSB7Ci0JCXJldHVybiBleHRlcm5hbFRhc2tQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsVGFza1Byb2plY3QoU3RyaW5nIG5ld0V4dGVybmFsVGFza1Byb2plY3QpIHsKLQkJU3RyaW5nIG9sZEV4dGVybmFsVGFza1Byb2plY3QgPSBleHRlcm5hbFRhc2tQcm9qZWN0OwotCQlleHRlcm5hbFRhc2tQcm9qZWN0ID0gbmV3RXh0ZXJuYWxUYXNrUHJvamVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1QsIG9sZEV4dGVybmFsVGFza1Byb2plY3QsIGV4dGVybmFsVGFza1Byb2plY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEVhcmx5U3RhcnQoKSB7Ci0JCXJldHVybiBlYXJseVN0YXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVhcmx5U3RhcnQoT2JqZWN0IG5ld0Vhcmx5U3RhcnQpIHsKLQkJT2JqZWN0IG9sZEVhcmx5U3RhcnQgPSBlYXJseVN0YXJ0OwotCQllYXJseVN0YXJ0ID0gbmV3RWFybHlTdGFydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVCwgb2xkRWFybHlTdGFydCwgZWFybHlTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWFybHlGaW5pc2goKSB7Ci0JCXJldHVybiBlYXJseUZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFYXJseUZpbmlzaChPYmplY3QgbmV3RWFybHlGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEVhcmx5RmluaXNoID0gZWFybHlGaW5pc2g7Ci0JCWVhcmx5RmluaXNoID0gbmV3RWFybHlGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNILCBvbGRFYXJseUZpbmlzaCwgZWFybHlGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVTdGFydCgpIHsKLQkJcmV0dXJuIGxhdGVTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXRlU3RhcnQoT2JqZWN0IG5ld0xhdGVTdGFydCkgewotCQlPYmplY3Qgb2xkTGF0ZVN0YXJ0ID0gbGF0ZVN0YXJ0OwotCQlsYXRlU3RhcnQgPSBuZXdMYXRlU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9TVEFSVCwgb2xkTGF0ZVN0YXJ0LCBsYXRlU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExhdGVGaW5pc2goKSB7Ci0JCXJldHVybiBsYXRlRmluaXNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdGVGaW5pc2goT2JqZWN0IG5ld0xhdGVGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZExhdGVGaW5pc2ggPSBsYXRlRmluaXNoOwotCQlsYXRlRmluaXNoID0gbmV3TGF0ZUZpbmlzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSCwgb2xkTGF0ZUZpbmlzaCwgbGF0ZUZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFN0YXJ0VmFyaWFuY2UoKSB7Ci0JCXJldHVybiBzdGFydFZhcmlhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0VmFyaWFuY2UoQmlnSW50ZWdlciBuZXdTdGFydFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkU3RhcnRWYXJpYW5jZSA9IHN0YXJ0VmFyaWFuY2U7Ci0JCXN0YXJ0VmFyaWFuY2UgPSBuZXdTdGFydFZhcmlhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFLCBvbGRTdGFydFZhcmlhbmNlLCBzdGFydFZhcmlhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RmluaXNoVmFyaWFuY2UoKSB7Ci0JCXJldHVybiBmaW5pc2hWYXJpYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5pc2hWYXJpYW5jZShCaWdJbnRlZ2VyIG5ld0ZpbmlzaFZhcmlhbmNlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkRmluaXNoVmFyaWFuY2UgPSBmaW5pc2hWYXJpYW5jZTsKLQkJZmluaXNoVmFyaWFuY2UgPSBuZXdGaW5pc2hWYXJpYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0UsIG9sZEZpbmlzaFZhcmlhbmNlLCBmaW5pc2hWYXJpYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya1ZhcmlhbmNlKGZsb2F0IG5ld1dvcmtWYXJpYW5jZSkgewotCQlmbG9hdCBvbGRXb3JrVmFyaWFuY2UgPSB3b3JrVmFyaWFuY2U7Ci0JCXdvcmtWYXJpYW5jZSA9IG5ld1dvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCB3b3JrVmFyaWFuY2UsICFvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCWZsb2F0IG9sZFdvcmtWYXJpYW5jZSA9IHdvcmtWYXJpYW5jZTsKLQkJYm9vbGVhbiBvbGRXb3JrVmFyaWFuY2VFU2V0ID0gd29ya1ZhcmlhbmNlRVNldDsKLQkJd29ya1ZhcmlhbmNlID0gV09SS19WQVJJQU5DRV9FREVGQVVMVDsKLQkJd29ya1ZhcmlhbmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRSwgb2xkV29ya1ZhcmlhbmNlLCBXT1JLX1ZBUklBTkNFX0VERUZBVUxULCBvbGRXb3JrVmFyaWFuY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRXb3JrVmFyaWFuY2UoKSB7Ci0JCXJldHVybiB3b3JrVmFyaWFuY2VFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEZyZWVTbGFjaygpIHsKLQkJcmV0dXJuIGZyZWVTbGFjazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcmVlU2xhY2soQmlnSW50ZWdlciBuZXdGcmVlU2xhY2spIHsKLQkJQmlnSW50ZWdlciBvbGRGcmVlU2xhY2sgPSBmcmVlU2xhY2s7Ci0JCWZyZWVTbGFjayA9IG5ld0ZyZWVTbGFjazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLLCBvbGRGcmVlU2xhY2ssIGZyZWVTbGFjaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFRvdGFsU2xhY2soKSB7Ci0JCXJldHVybiB0b3RhbFNsYWNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvdGFsU2xhY2soQmlnSW50ZWdlciBuZXdUb3RhbFNsYWNrKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVG90YWxTbGFjayA9IHRvdGFsU2xhY2s7Ci0JCXRvdGFsU2xhY2sgPSBuZXdUb3RhbFNsYWNrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLLCBvbGRUb3RhbFNsYWNrLCB0b3RhbFNsYWNrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3QoZmxvYXQgbmV3Rml4ZWRDb3N0KSB7Ci0JCWZsb2F0IG9sZEZpeGVkQ29zdCA9IGZpeGVkQ29zdDsKLQkJZml4ZWRDb3N0ID0gbmV3Rml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3RFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIGZpeGVkQ29zdCwgIW9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEZpeGVkQ29zdCgpIHsKLQkJZmxvYXQgb2xkRml4ZWRDb3N0ID0gZml4ZWRDb3N0OwotCQlib29sZWFuIG9sZEZpeGVkQ29zdEVTZXQgPSBmaXhlZENvc3RFU2V0OwotCQlmaXhlZENvc3QgPSBGSVhFRF9DT1NUX0VERUZBVUxUOwotCQlmaXhlZENvc3RFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NULCBvbGRGaXhlZENvc3QsIEZJWEVEX0NPU1RfRURFRkFVTFQsIG9sZEZpeGVkQ29zdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEZpeGVkQ29zdCgpIHsKLQkJcmV0dXJuIGZpeGVkQ29zdEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaXhlZENvc3RBY2NydWFsKCkgewotCQlyZXR1cm4gZml4ZWRDb3N0QWNjcnVhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaXhlZENvc3RBY2NydWFsKFN0cmluZyBuZXdGaXhlZENvc3RBY2NydWFsKSB7Ci0JCVN0cmluZyBvbGRGaXhlZENvc3RBY2NydWFsID0gZml4ZWRDb3N0QWNjcnVhbDsKLQkJZml4ZWRDb3N0QWNjcnVhbCA9IG5ld0ZpeGVkQ29zdEFjY3J1YWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMLCBvbGRGaXhlZENvc3RBY2NydWFsLCBmaXhlZENvc3RBY2NydWFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudENvbXBsZXRlKCkgewotCQlyZXR1cm4gcGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcmNlbnRDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRDb21wbGV0ZSkgewotCQlCaWdJbnRlZ2VyIG9sZFBlcmNlbnRDb21wbGV0ZSA9IHBlcmNlbnRDb21wbGV0ZTsKLQkJcGVyY2VudENvbXBsZXRlID0gbmV3UGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBlcmNlbnRDb21wbGV0ZSwgcGVyY2VudENvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBlcmNlbnRXb3JrQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyY2VudFdvcmtDb21wbGV0ZShCaWdJbnRlZ2VyIG5ld1BlcmNlbnRXb3JrQ29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQZXJjZW50V29ya0NvbXBsZXRlID0gcGVyY2VudFdvcmtDb21wbGV0ZTsKLQkJcGVyY2VudFdvcmtDb21wbGV0ZSA9IG5ld1BlcmNlbnRXb3JrQ29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9XT1JLX0NPTVBMRVRFLCBvbGRQZXJjZW50V29ya0NvbXBsZXRlLCBwZXJjZW50V29ya0NvbXBsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0Q29zdCgpIHsKLQkJcmV0dXJuIGNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29zdChCaWdEZWNpbWFsIG5ld0Nvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRDb3N0ID0gY29zdDsKLQkJY29zdCA9IG5ld0Nvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVCwgb2xkQ29zdCwgY29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdEZWNpbWFsIGdldE92ZXJ0aW1lQ29zdCgpIHsKLQkJcmV0dXJuIG92ZXJ0aW1lQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdmVydGltZUNvc3QoQmlnRGVjaW1hbCBuZXdPdmVydGltZUNvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRPdmVydGltZUNvc3QgPSBvdmVydGltZUNvc3Q7Ci0JCW92ZXJ0aW1lQ29zdCA9IG5ld092ZXJ0aW1lQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NULCBvbGRPdmVydGltZUNvc3QsIG92ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gb3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJ0aW1lV29yayhPYmplY3QgbmV3T3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRPdmVydGltZVdvcmsgPSBvdmVydGltZVdvcms7Ci0JCW92ZXJ0aW1lV29yayA9IG5ld092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLLCBvbGRPdmVydGltZVdvcmssIG92ZXJ0aW1lV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWN0dWFsU3RhcnQoKSB7Ci0JCXJldHVybiBhY3R1YWxTdGFydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxTdGFydChPYmplY3QgbmV3QWN0dWFsU3RhcnQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbFN0YXJ0ID0gYWN0dWFsU3RhcnQ7Ci0JCWFjdHVhbFN0YXJ0ID0gbmV3QWN0dWFsU3RhcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJULCBvbGRBY3R1YWxTdGFydCwgYWN0dWFsU3RhcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbEZpbmlzaCgpIHsKLQkJcmV0dXJuIGFjdHVhbEZpbmlzaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxGaW5pc2goT2JqZWN0IG5ld0FjdHVhbEZpbmlzaCkgewotCQlPYmplY3Qgb2xkQWN0dWFsRmluaXNoID0gYWN0dWFsRmluaXNoOwotCQlhY3R1YWxGaW5pc2ggPSBuZXdBY3R1YWxGaW5pc2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSCwgb2xkQWN0dWFsRmluaXNoLCBhY3R1YWxGaW5pc2gpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbER1cmF0aW9uKCkgewotCQlyZXR1cm4gYWN0dWFsRHVyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsRHVyYXRpb24oT2JqZWN0IG5ld0FjdHVhbER1cmF0aW9uKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxEdXJhdGlvbiA9IGFjdHVhbER1cmF0aW9uOwotCQlhY3R1YWxEdXJhdGlvbiA9IG5ld0FjdHVhbER1cmF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTiwgb2xkQWN0dWFsRHVyYXRpb24sIGFjdHVhbER1cmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWN0dWFsQ29zdCgpIHsKLQkJcmV0dXJuIGFjdHVhbENvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsQ29zdChCaWdEZWNpbWFsIG5ld0FjdHVhbENvc3QpIHsKLQkJQmlnRGVjaW1hbCBvbGRBY3R1YWxDb3N0ID0gYWN0dWFsQ29zdDsKLQkJYWN0dWFsQ29zdCA9IG5ld0FjdHVhbENvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1QsIG9sZEFjdHVhbENvc3QsIGFjdHVhbENvc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRBY3R1YWxPdmVydGltZUNvc3QoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZUNvc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEJpZ0RlY2ltYWwgbmV3QWN0dWFsT3ZlcnRpbWVDb3N0KSB7Ci0JCUJpZ0RlY2ltYWwgb2xkQWN0dWFsT3ZlcnRpbWVDb3N0ID0gYWN0dWFsT3ZlcnRpbWVDb3N0OwotCQlhY3R1YWxPdmVydGltZUNvc3QgPSBuZXdBY3R1YWxPdmVydGltZUNvc3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1QsIG9sZEFjdHVhbE92ZXJ0aW1lQ29zdCwgYWN0dWFsT3ZlcnRpbWVDb3N0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrKCkgewotCQlyZXR1cm4gYWN0dWFsV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrKE9iamVjdCBuZXdBY3R1YWxXb3JrKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrID0gYWN0dWFsV29yazsKLQkJYWN0dWFsV29yayA9IG5ld0FjdHVhbFdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUkssIG9sZEFjdHVhbFdvcmssIGFjdHVhbFdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFjdHVhbE92ZXJ0aW1lV29yaygpIHsKLQkJcmV0dXJuIGFjdHVhbE92ZXJ0aW1lV29yazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxPdmVydGltZVdvcmsoT2JqZWN0IG5ld0FjdHVhbE92ZXJ0aW1lV29yaykgewotCQlPYmplY3Qgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrID0gYWN0dWFsT3ZlcnRpbWVXb3JrOwotCQlhY3R1YWxPdmVydGltZVdvcmsgPSBuZXdBY3R1YWxPdmVydGltZVdvcms7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUkssIG9sZEFjdHVhbE92ZXJ0aW1lV29yaywgYWN0dWFsT3ZlcnRpbWVXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRSZWd1bGFyV29yaygpIHsKLQkJcmV0dXJuIHJlZ3VsYXJXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ3VsYXJXb3JrKE9iamVjdCBuZXdSZWd1bGFyV29yaykgewotCQlPYmplY3Qgb2xkUmVndWxhcldvcmsgPSByZWd1bGFyV29yazsKLQkJcmVndWxhcldvcmsgPSBuZXdSZWd1bGFyV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUkssIG9sZFJlZ3VsYXJXb3JrLCByZWd1bGFyV29yaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nRHVyYXRpb24oKSB7Ci0JCXJldHVybiByZW1haW5pbmdEdXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdEdXJhdGlvbihPYmplY3QgbmV3UmVtYWluaW5nRHVyYXRpb24pIHsKLQkJT2JqZWN0IG9sZFJlbWFpbmluZ0R1cmF0aW9uID0gcmVtYWluaW5nRHVyYXRpb247Ci0JCXJlbWFpbmluZ0R1cmF0aW9uID0gbmV3UmVtYWluaW5nRHVyYXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OLCBvbGRSZW1haW5pbmdEdXJhdGlvbiwgcmVtYWluaW5nRHVyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnRGVjaW1hbCBnZXRSZW1haW5pbmdDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nQ29zdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZW1haW5pbmdDb3N0KEJpZ0RlY2ltYWwgbmV3UmVtYWluaW5nQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ0Nvc3QgPSByZW1haW5pbmdDb3N0OwotCQlyZW1haW5pbmdDb3N0ID0gbmV3UmVtYWluaW5nQ29zdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfQ09TVCwgb2xkUmVtYWluaW5nQ29zdCwgcmVtYWluaW5nQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nV29yaygpIHsKLQkJcmV0dXJuIHJlbWFpbmluZ1dvcms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVtYWluaW5nV29yayhPYmplY3QgbmV3UmVtYWluaW5nV29yaykgewotCQlPYmplY3Qgb2xkUmVtYWluaW5nV29yayA9IHJlbWFpbmluZ1dvcms7Ci0JCXJlbWFpbmluZ1dvcmsgPSBuZXdSZW1haW5pbmdXb3JrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLLCBvbGRSZW1haW5pbmdXb3JrLCByZW1haW5pbmdXb3JrKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0RlY2ltYWwgZ2V0UmVtYWluaW5nT3ZlcnRpbWVDb3N0KCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdChCaWdEZWNpbWFsIG5ld1JlbWFpbmluZ092ZXJ0aW1lQ29zdCkgewotCQlCaWdEZWNpbWFsIG9sZFJlbWFpbmluZ092ZXJ0aW1lQ29zdCA9IHJlbWFpbmluZ092ZXJ0aW1lQ29zdDsKLQkJcmVtYWluaW5nT3ZlcnRpbWVDb3N0ID0gbmV3UmVtYWluaW5nT3ZlcnRpbWVDb3N0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NULCBvbGRSZW1haW5pbmdPdmVydGltZUNvc3QsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCkgewotCQlyZXR1cm4gcmVtYWluaW5nT3ZlcnRpbWVXb3JrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlbWFpbmluZ092ZXJ0aW1lV29yayhPYmplY3QgbmV3UmVtYWluaW5nT3ZlcnRpbWVXb3JrKSB7Ci0JCU9iamVjdCBvbGRSZW1haW5pbmdPdmVydGltZVdvcmsgPSByZW1haW5pbmdPdmVydGltZVdvcms7Ci0JCXJlbWFpbmluZ092ZXJ0aW1lV29yayA9IG5ld1JlbWFpbmluZ092ZXJ0aW1lV29yazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSywgb2xkUmVtYWluaW5nT3ZlcnRpbWVXb3JrLCByZW1haW5pbmdPdmVydGltZVdvcmspKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0QUNXUCgpIHsKLQkJcmV0dXJuIGFDV1A7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QUNXUChmbG9hdCBuZXdBQ1dQKSB7Ci0JCWZsb2F0IG9sZEFDV1AgPSBhQ1dQOwotCQlhQ1dQID0gbmV3QUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUCwgb2xkQUNXUCwgYUNXUCwgIW9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRBQ1dQKCkgewotCQlmbG9hdCBvbGRBQ1dQID0gYUNXUDsKLQkJYm9vbGVhbiBvbGRBQ1dQRVNldCA9IGFDV1BFU2V0OwotCQlhQ1dQID0gQUNXUF9FREVGQVVMVDsKLQkJYUNXUEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDV1AsIG9sZEFDV1AsIEFDV1BfRURFRkFVTFQsIG9sZEFDV1BFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRBQ1dQKCkgewotCQlyZXR1cm4gYUNXUEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldENWKCkgewotCQlyZXR1cm4gY1Y7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q1YoZmxvYXQgbmV3Q1YpIHsKLQkJZmxvYXQgb2xkQ1YgPSBjVjsKLQkJY1YgPSBuZXdDVjsKLQkJYm9vbGVhbiBvbGRDVkVTZXQgPSBjVkVTZXQ7Ci0JCWNWRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1YsIG9sZENWLCBjViwgIW9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0Q1YoKSB7Ci0JCWZsb2F0IG9sZENWID0gY1Y7Ci0JCWJvb2xlYW4gb2xkQ1ZFU2V0ID0gY1ZFU2V0OwotCQljViA9IENWX0VERUZBVUxUOwotCQljVkVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWLCBvbGRDViwgQ1ZfRURFRkFVTFQsIG9sZENWRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0Q1YoKSB7Ci0JCXJldHVybiBjVkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0Q29uc3RyYWludFR5cGUoKSB7Ci0JCXJldHVybiBjb25zdHJhaW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25zdHJhaW50VHlwZShCaWdJbnRlZ2VyIG5ld0NvbnN0cmFpbnRUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkQ29uc3RyYWludFR5cGUgPSBjb25zdHJhaW50VHlwZTsKLQkJY29uc3RyYWludFR5cGUgPSBuZXdDb25zdHJhaW50VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEUsIG9sZENvbnN0cmFpbnRUeXBlLCBjb25zdHJhaW50VHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldENhbGVuZGFyVUlEKCkgewotCQlyZXR1cm4gY2FsZW5kYXJVSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FsZW5kYXJVSUQoQmlnSW50ZWdlciBuZXdDYWxlbmRhclVJRCkgewotCQlCaWdJbnRlZ2VyIG9sZENhbGVuZGFyVUlEID0gY2FsZW5kYXJVSUQ7Ci0JCWNhbGVuZGFyVUlEID0gbmV3Q2FsZW5kYXJVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlELCBvbGRDYWxlbmRhclVJRCwgY2FsZW5kYXJVSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbnN0cmFpbnREYXRlKCkgewotCQlyZXR1cm4gY29uc3RyYWludERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uc3RyYWludERhdGUoT2JqZWN0IG5ld0NvbnN0cmFpbnREYXRlKSB7Ci0JCU9iamVjdCBvbGRDb25zdHJhaW50RGF0ZSA9IGNvbnN0cmFpbnREYXRlOwotCQljb25zdHJhaW50RGF0ZSA9IG5ld0NvbnN0cmFpbnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURSwgb2xkQ29uc3RyYWludERhdGUsIGNvbnN0cmFpbnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXREZWFkbGluZSgpIHsKLQkJcmV0dXJuIGRlYWRsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlYWRsaW5lKE9iamVjdCBuZXdEZWFkbGluZSkgewotCQlPYmplY3Qgb2xkRGVhZGxpbmUgPSBkZWFkbGluZTsKLQkJZGVhZGxpbmUgPSBuZXdEZWFkbGluZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORSwgb2xkRGVhZGxpbmUsIGRlYWRsaW5lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbEFzc2lnbm1lbnRzKGJvb2xlYW4gbmV3TGV2ZWxBc3NpZ25tZW50cykgewotCQlib29sZWFuIG9sZExldmVsQXNzaWdubWVudHMgPSBsZXZlbEFzc2lnbm1lbnRzOwotCQlsZXZlbEFzc2lnbm1lbnRzID0gbmV3TGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFMsIG9sZExldmVsQXNzaWdubWVudHMsIGxldmVsQXNzaWdubWVudHMsICFvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0TGV2ZWxBc3NpZ25tZW50cygpIHsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzID0gbGV2ZWxBc3NpZ25tZW50czsKLQkJYm9vbGVhbiBvbGRMZXZlbEFzc2lnbm1lbnRzRVNldCA9IGxldmVsQXNzaWdubWVudHNFU2V0OwotCQlsZXZlbEFzc2lnbm1lbnRzID0gTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQ7Ci0JCWxldmVsQXNzaWdubWVudHNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUywgb2xkTGV2ZWxBc3NpZ25tZW50cywgTEVWRUxfQVNTSUdOTUVOVFNfRURFRkFVTFQsIG9sZExldmVsQXNzaWdubWVudHNFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCkgewotCQlyZXR1cm4gbGV2ZWxBc3NpZ25tZW50c0VTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMZXZlbGluZ0NhblNwbGl0KCkgewotCQlyZXR1cm4gbGV2ZWxpbmdDYW5TcGxpdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbGluZ0NhblNwbGl0KGJvb2xlYW4gbmV3TGV2ZWxpbmdDYW5TcGxpdCkgewotCQlib29sZWFuIG9sZExldmVsaW5nQ2FuU3BsaXQgPSBsZXZlbGluZ0NhblNwbGl0OwotCQlsZXZlbGluZ0NhblNwbGl0ID0gbmV3TGV2ZWxpbmdDYW5TcGxpdDsKLQkJYm9vbGVhbiBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCA9IGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCQlsZXZlbGluZ0NhblNwbGl0RVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElULCBvbGRMZXZlbGluZ0NhblNwbGl0LCBsZXZlbGluZ0NhblNwbGl0LCAhb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExldmVsaW5nQ2FuU3BsaXQoKSB7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdCA9IGxldmVsaW5nQ2FuU3BsaXQ7Ci0JCWJvb2xlYW4gb2xkTGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBsZXZlbGluZ0NhblNwbGl0RVNldDsKLQkJbGV2ZWxpbmdDYW5TcGxpdCA9IExFVkVMSU5HX0NBTl9TUExJVF9FREVGQVVMVDsKLQkJbGV2ZWxpbmdDYW5TcGxpdEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVCwgb2xkTGV2ZWxpbmdDYW5TcGxpdCwgTEVWRUxJTkdfQ0FOX1NQTElUX0VERUZBVUxULCBvbGRMZXZlbGluZ0NhblNwbGl0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGV2ZWxpbmdDYW5TcGxpdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nQ2FuU3BsaXRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldExldmVsaW5nRGVsYXkoKSB7Ci0JCXJldHVybiBsZXZlbGluZ0RlbGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldmVsaW5nRGVsYXkoQmlnSW50ZWdlciBuZXdMZXZlbGluZ0RlbGF5KSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWxpbmdEZWxheSA9IGxldmVsaW5nRGVsYXk7Ci0JCWxldmVsaW5nRGVsYXkgPSBuZXdMZXZlbGluZ0RlbGF5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZLCBvbGRMZXZlbGluZ0RlbGF5LCBsZXZlbGluZ0RlbGF5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdCgpIHsKLQkJcmV0dXJuIGxldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxpbmdEZWxheUZvcm1hdChCaWdJbnRlZ2VyIG5ld0xldmVsaW5nRGVsYXlGb3JtYXQpIHsKLQkJQmlnSW50ZWdlciBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0ID0gbGV2ZWxpbmdEZWxheUZvcm1hdDsKLQkJbGV2ZWxpbmdEZWxheUZvcm1hdCA9IG5ld0xldmVsaW5nRGVsYXlGb3JtYXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFULCBvbGRMZXZlbGluZ0RlbGF5Rm9ybWF0LCBsZXZlbGluZ0RlbGF5Rm9ybWF0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcmVMZXZlbGVkU3RhcnQoKSB7Ci0JCXJldHVybiBwcmVMZXZlbGVkU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZFN0YXJ0KE9iamVjdCBuZXdQcmVMZXZlbGVkU3RhcnQpIHsKLQkJT2JqZWN0IG9sZFByZUxldmVsZWRTdGFydCA9IHByZUxldmVsZWRTdGFydDsKLQkJcHJlTGV2ZWxlZFN0YXJ0ID0gbmV3UHJlTGV2ZWxlZFN0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJULCBvbGRQcmVMZXZlbGVkU3RhcnQsIHByZUxldmVsZWRTdGFydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpIHsKLQkJcmV0dXJuIHByZUxldmVsZWRGaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlTGV2ZWxlZEZpbmlzaChPYmplY3QgbmV3UHJlTGV2ZWxlZEZpbmlzaCkgewotCQlPYmplY3Qgb2xkUHJlTGV2ZWxlZEZpbmlzaCA9IHByZUxldmVsZWRGaW5pc2g7Ci0JCXByZUxldmVsZWRGaW5pc2ggPSBuZXdQcmVMZXZlbGVkRmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSCwgb2xkUHJlTGV2ZWxlZEZpbmlzaCwgcHJlTGV2ZWxlZEZpbmlzaCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGluayhTdHJpbmcgbmV3SHlwZXJsaW5rKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmsgPSBoeXBlcmxpbms7Ci0JCWh5cGVybGluayA9IG5ld0h5cGVybGluazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTkssIG9sZEh5cGVybGluaywgaHlwZXJsaW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtBZGRyZXNzKCkgewotCQlyZXR1cm4gaHlwZXJsaW5rQWRkcmVzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtBZGRyZXNzKFN0cmluZyBuZXdIeXBlcmxpbmtBZGRyZXNzKSB7Ci0JCVN0cmluZyBvbGRIeXBlcmxpbmtBZGRyZXNzID0gaHlwZXJsaW5rQWRkcmVzczsKLQkJaHlwZXJsaW5rQWRkcmVzcyA9IG5ld0h5cGVybGlua0FkZHJlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1MsIG9sZEh5cGVybGlua0FkZHJlc3MsIGh5cGVybGlua0FkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKSB7Ci0JCXJldHVybiBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1N1YkFkZHJlc3MoU3RyaW5nIG5ld0h5cGVybGlua1N1YkFkZHJlc3MpIHsKLQkJU3RyaW5nIG9sZEh5cGVybGlua1N1YkFkZHJlc3MgPSBoeXBlcmxpbmtTdWJBZGRyZXNzOwotCQloeXBlcmxpbmtTdWJBZGRyZXNzID0gbmV3SHlwZXJsaW5rU3ViQWRkcmVzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1MsIG9sZEh5cGVybGlua1N1YkFkZHJlc3MsIGh5cGVybGlua1N1YkFkZHJlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZVJlc291cmNlQ2FsZW5kYXIoKSB7Ci0JCXJldHVybiBpZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoYm9vbGVhbiBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKSB7Ci0JCWJvb2xlYW4gb2xkSWdub3JlUmVzb3VyY2VDYWxlbmRhciA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXI7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXIgPSBuZXdJZ25vcmVSZXNvdXJjZUNhbGVuZGFyOwotCQlib29sZWFuIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JCWlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVIsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXIsICFvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpIHsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gaWdub3JlUmVzb3VyY2VDYWxlbmRhcjsKLQkJYm9vbGVhbiBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGlnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0OwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyID0gSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSX0VERUZBVUxUOwotCQlpZ25vcmVSZXNvdXJjZUNhbGVuZGFyRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSLCBvbGRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyLCBJR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVJfRURFRkFVTFQsIG9sZElnbm9yZVJlc291cmNlQ2FsZW5kYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJZ25vcmVSZXNvdXJjZUNhbGVuZGFyKCkgewotCQlyZXR1cm4gaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RlcygpIHsKLQkJcmV0dXJuIG5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGVzKFN0cmluZyBuZXdOb3RlcykgewotCQlTdHJpbmcgb2xkTm90ZXMgPSBub3RlczsKLQkJbm90ZXMgPSBuZXdOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUywgb2xkTm90ZXMsIG5vdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIaWRlQmFyKGJvb2xlYW4gbmV3SGlkZUJhcikgewotCQlib29sZWFuIG9sZEhpZGVCYXIgPSBoaWRlQmFyOwotCQloaWRlQmFyID0gbmV3SGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSElERV9CQVIsIG9sZEhpZGVCYXIsIGhpZGVCYXIsICFvbGRIaWRlQmFyRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SGlkZUJhcigpIHsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyID0gaGlkZUJhcjsKLQkJYm9vbGVhbiBvbGRIaWRlQmFyRVNldCA9IGhpZGVCYXJFU2V0OwotCQloaWRlQmFyID0gSElERV9CQVJfRURFRkFVTFQ7Ci0JCWhpZGVCYXJFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUiwgb2xkSGlkZUJhciwgSElERV9CQVJfRURFRkFVTFQsIG9sZEhpZGVCYXJFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRIaWRlQmFyKCkgewotCQlyZXR1cm4gaGlkZUJhckVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb2xsdXAoKSB7Ci0JCXJldHVybiByb2xsdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um9sbHVwKGJvb2xlYW4gbmV3Um9sbHVwKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlyb2xsdXAgPSBuZXdSb2xsdXA7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwRVNldCA9IHJvbGx1cEVTZXQ7Ci0JCXJvbGx1cEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCByb2xsdXAsICFvbGRSb2xsdXBFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRSb2xsdXAoKSB7Ci0JCWJvb2xlYW4gb2xkUm9sbHVwID0gcm9sbHVwOwotCQlib29sZWFuIG9sZFJvbGx1cEVTZXQgPSByb2xsdXBFU2V0OwotCQlyb2xsdXAgPSBST0xMVVBfRURFRkFVTFQ7Ci0JCXJvbGx1cEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUCwgb2xkUm9sbHVwLCBST0xMVVBfRURFRkFVTFQsIG9sZFJvbGx1cEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJvbGx1cCgpIHsKLQkJcmV0dXJuIHJvbGx1cEVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGZsb2F0IGdldEJDV1MoKSB7Ci0JCXJldHVybiBiQ1dTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJDV1MoZmxvYXQgbmV3QkNXUykgewotCQlmbG9hdCBvbGRCQ1dTID0gYkNXUzsKLQkJYkNXUyA9IG5ld0JDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXU0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1MsIG9sZEJDV1MsIGJDV1MsICFvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0QkNXUygpIHsKLQkJZmxvYXQgb2xkQkNXUyA9IGJDV1M7Ci0JCWJvb2xlYW4gb2xkQkNXU0VTZXQgPSBiQ1dTRVNldDsKLQkJYkNXUyA9IEJDV1NfRURFRkFVTFQ7Ci0JCWJDV1NFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTLCBvbGRCQ1dTLCBCQ1dTX0VERUZBVUxULCBvbGRCQ1dTRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0QkNXUygpIHsKLQkJcmV0dXJuIGJDV1NFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBmbG9hdCBnZXRCQ1dQKCkgewotCQlyZXR1cm4gYkNXUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCQ1dQKGZsb2F0IG5ld0JDV1ApIHsKLQkJZmxvYXQgb2xkQkNXUCA9IGJDV1A7Ci0JCWJDV1AgPSBuZXdCQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1BFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dQLCBvbGRCQ1dQLCBiQ1dQLCAhb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEJDV1AoKSB7Ci0JCWZsb2F0IG9sZEJDV1AgPSBiQ1dQOwotCQlib29sZWFuIG9sZEJDV1BFU2V0ID0gYkNXUEVTZXQ7Ci0JCWJDV1AgPSBCQ1dQX0VERUZBVUxUOwotCQliQ1dQRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUCwgb2xkQkNXUCwgQkNXUF9FREVGQVVMVCwgb2xkQkNXUEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEJDV1AoKSB7Ci0JCXJldHVybiBiQ1dQRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBoeXNpY2FsUGVyY2VudENvbXBsZXRlKEJpZ0ludGVnZXIgbmV3UGh5c2ljYWxQZXJjZW50Q29tcGxldGUpIHsKLQkJQmlnSW50ZWdlciBvbGRQaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IHBoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSA9IG5ld1BoeXNpY2FsUGVyY2VudENvbXBsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEUsIG9sZFBoeXNpY2FsUGVyY2VudENvbXBsZXRlLCBwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldEVhcm5lZFZhbHVlTWV0aG9kKCkgewotCQlyZXR1cm4gZWFybmVkVmFsdWVNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWFybmVkVmFsdWVNZXRob2QoQmlnSW50ZWdlciBuZXdFYXJuZWRWYWx1ZU1ldGhvZCkgewotCQlCaWdJbnRlZ2VyIG9sZEVhcm5lZFZhbHVlTWV0aG9kID0gZWFybmVkVmFsdWVNZXRob2Q7Ci0JCWVhcm5lZFZhbHVlTWV0aG9kID0gbmV3RWFybmVkVmFsdWVNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRCwgb2xkRWFybmVkVmFsdWVNZXRob2QsIGVhcm5lZFZhbHVlTWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFByZWRlY2Vzc29yTGluaygpIHsKLQkJaWYgKHByZWRlY2Vzc29yTGluayA9PSBudWxsKSB7Ci0JCQlwcmVkZWNlc3NvckxpbmsgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoUHJlZGVjZXNzb3JMaW5rLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTkspOwotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3Nvckxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxXb3JrUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxXb3JrUHJvdGVjdGVkKSB7Ci0JCU9iamVjdCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkID0gYWN0dWFsV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsV29ya1Byb3RlY3RlZCA9IG5ld0FjdHVhbFdvcmtQcm90ZWN0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVELCBvbGRBY3R1YWxXb3JrUHJvdGVjdGVkLCBhY3R1YWxXb3JrUHJvdGVjdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKE9iamVjdCBuZXdBY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpIHsKLQkJT2JqZWN0IG9sZEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCA9IGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDsKLQkJYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkID0gbmV3QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRCwgb2xkQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkLCBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKSB7Ci0JCWlmIChleHRlbmRlZEF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQlleHRlbmRlZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChFeHRlbmRlZEF0dHJpYnV0ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gZXh0ZW5kZWRBdHRyaWJ1dGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEJhc2VsaW5lKCkgewotCQlpZiAoYmFzZWxpbmUgPT0gbnVsbCkgewotCQkJYmFzZWxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoQmFzZWxpbmUuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkUpOwotCQl9Ci0JCXJldHVybiBiYXNlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0T3V0bGluZUNvZGUoKSB7Ci0JCWlmIChvdXRsaW5lQ29kZSA9PSBudWxsKSB7Ci0JCQlvdXRsaW5lQ29kZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChPdXRsaW5lQ29kZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFKTsKLQkJfQotCQlyZXR1cm4gb3V0bGluZUNvZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFRpbWVwaGFzZWREYXRhKCkgewotCQlpZiAodGltZXBoYXNlZERhdGEgPT0gbnVsbCkgewotCQkJdGltZXBoYXNlZERhdGEgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoVGltZXBoYXNlZERhdGFUeXBlLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQSk7Ci0JCX0KLQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVERUNFU1NPUl9MSU5LOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFByZWRlY2Vzc29yTGluaygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVOREVEX0FUVFJJQlVURToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEJhc2VsaW5lKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldE91dGxpbmVDb2RlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVElNRVBIQVNFRF9EQVRBOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldFRpbWVwaGFzZWREYXRhKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19VSUQ6Ci0JCQkJcmV0dXJuIGdldFVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lEOgotCQkJCXJldHVybiBnZXRJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlyZXR1cm4gaXNJc051bGwoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENyZWF0ZURhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXJldHVybiBnZXRDb250YWN0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXJldHVybiBnZXRXQlMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlNfTEVWRUw6Ci0JCQkJcmV0dXJuIGdldFdCU0xldmVsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9OVU1CRVI6Ci0JCQkJcmV0dXJuIGdldE91dGxpbmVOdW1iZXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBnZXRPdXRsaW5lTGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUklPUklUWToKLQkJCQlyZXR1cm4gZ2V0UHJpb3JpdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXREdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OX0ZPUk1BVDoKLQkJCQlyZXR1cm4gZ2V0RHVyYXRpb25Gb3JtYXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXJldHVybiBnZXRXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RPUDoKLQkJCQlyZXR1cm4gZ2V0U3RvcCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlyZXR1cm4gZ2V0UmVzdW1lKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXJldHVybiBpc1Jlc3VtZVZhbGlkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzRWZmb3J0RHJpdmVuKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFQ1VSUklORzoKLQkJCQlyZXR1cm4gaXNSZWN1cnJpbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJcmV0dXJuIGlzT3ZlckFsbG9jYXRlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzRXN0aW1hdGVkKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX01JTEVTVE9ORToKLQkJCQlyZXR1cm4gaXNNaWxlc3RvbmUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlyZXR1cm4gaXNTdW1tYXJ5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc0NyaXRpY2FsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1Q6Ci0JCQkJcmV0dXJuIGlzSXNTdWJwcm9qZWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXJldHVybiBpc0lzU3VicHJvamVjdFJlYWRPbmx5KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gZ2V0U3VicHJvamVjdE5hbWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLOgotCQkJCXJldHVybiBpc0V4dGVybmFsVGFzaygpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsVGFza1Byb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9TVEFSVDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0RWFybHlGaW5pc2goKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBnZXRMYXRlU3RhcnQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0TGF0ZUZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRTdGFydFZhcmlhbmNlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBnZXRGaW5pc2hWYXJpYW5jZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRXb3JrVmFyaWFuY2UoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRlJFRV9TTEFDSzoKLQkJCQlyZXR1cm4gZ2V0RnJlZVNsYWNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJcmV0dXJuIGdldFRvdGFsU2xhY2soKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBuZXcgRmxvYXQoZ2V0Rml4ZWRDb3N0KCkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gZ2V0Rml4ZWRDb3N0QWNjcnVhbCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldFBlcmNlbnRDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGVyY2VudFdvcmtDb21wbGV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldENvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBnZXRPdmVydGltZVdvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbFN0YXJ0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsRmluaXNoKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBnZXRBY3R1YWxEdXJhdGlvbigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9DT1NUOgotCQkJCXJldHVybiBnZXRBY3R1YWxDb3N0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLOgotCQkJCXJldHVybiBnZXRBY3R1YWxXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJcmV0dXJuIGdldEFjdHVhbE92ZXJ0aW1lV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVndWxhcldvcmsoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0R1cmF0aW9uKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIGdldFJlbWFpbmluZ0Nvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nV29yaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBnZXRSZW1haW5pbmdPdmVydGltZUNvc3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlyZXR1cm4gZ2V0UmVtYWluaW5nT3ZlcnRpbWVXb3JrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEFDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIG5ldyBGbG9hdChnZXRDVigpKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENvbnN0cmFpbnRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ0FMRU5EQVJfVUlEOgotCQkJCXJldHVybiBnZXRDYWxlbmRhclVJRCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlyZXR1cm4gZ2V0Q29uc3RyYWludERhdGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gZ2V0RGVhZGxpbmUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNMZXZlbEFzc2lnbm1lbnRzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlyZXR1cm4gaXNMZXZlbGluZ0NhblNwbGl0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBnZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfU1RBUlQ6Ci0JCQkJcmV0dXJuIGdldFByZUxldmVsZWRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlyZXR1cm4gZ2V0UHJlTGV2ZWxlZEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gZ2V0SHlwZXJsaW5rKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua0FkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJcmV0dXJuIGdldEh5cGVybGlua1N1YkFkZHJlc3MoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzSWdub3JlUmVzb3VyY2VDYWxlbmRhcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0Tm90ZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlyZXR1cm4gaXNIaWRlQmFyKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JPTExVUDoKLQkJCQlyZXR1cm4gaXNSb2xsdXAoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1MoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gbmV3IEZsb2F0KGdldEJDV1AoKSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gZ2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXJldHVybiBnZXRFYXJuZWRWYWx1ZU1ldGhvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yTGluaygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsV29ya1Byb3RlY3RlZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gZ2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBnZXRFeHRlbmRlZEF0dHJpYnV0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JBU0VMSU5FOgotCQkJCXJldHVybiBnZXRCYXNlbGluZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gZ2V0T3V0bGluZUNvZGUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIGdldFRpbWVwaGFzZWREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfTlVMTDoKLQkJCQlzZXRJc051bGwoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJc2V0Q29udGFjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTOgotCQkJCXNldFdCUygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX05VTUJFUjoKLQkJCQlzZXRPdXRsaW5lTnVtYmVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXNldFByaW9yaXR5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RVUkFUSU9OOgotCQkJCXNldER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XT1JLOgotCQkJCXNldFdvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJc2V0U3RvcCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FOgotCQkJCXNldFJlc3VtZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXNldFJlc3VtZVZhbGlkKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FRkZPUlRfRFJJVkVOOgotCQkJCXNldEVmZm9ydERyaXZlbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXNldFJlY3VycmluZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJc2V0T3ZlckFsbG9jYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVNUSU1BVEVEOgotCQkJCXNldEVzdGltYXRlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXNldE1pbGVzdG9uZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQlzZXRTdW1tYXJ5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DUklUSUNBTDoKLQkJCQlzZXRDcml0aWNhbCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlzZXRJc1N1YnByb2plY3QoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXNldElzU3VicHJvamVjdFJlYWRPbmx5KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVUJQUk9KRUNUX05BTUU6Ci0JCQkJc2V0U3VicHJvamVjdE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFUk5BTF9UQVNLX1BST0pFQ1Q6Ci0JCQkJc2V0RXh0ZXJuYWxUYXNrUHJvamVjdCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfRklOSVNIOgotCQkJCXNldEVhcmx5RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1RBUlRfVkFSSUFOQ0U6Ci0JCQkJc2V0U3RhcnRWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSF9WQVJJQU5DRToKLQkJCQlzZXRGaW5pc2hWYXJpYW5jZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dPUktfVkFSSUFOQ0U6Ci0JCQkJc2V0V29ya1ZhcmlhbmNlKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZSRUVfU0xBQ0s6Ci0JCQkJc2V0RnJlZVNsYWNrKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjaygoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJc2V0Rml4ZWRDb3N0KCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlzZXRGaXhlZENvc3RBY2NydWFsKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXNldFBlcmNlbnRDb21wbGV0ZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09TVDoKLQkJCQlzZXRDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoKEJpZ0RlY2ltYWwpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXNldE92ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1NUQVJUOgotCQkJCXNldEFjdHVhbFN0YXJ0KChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfRklOSVNIOgotCQkJCXNldEFjdHVhbEZpbmlzaCgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXNldEFjdHVhbER1cmF0aW9uKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KChCaWdEZWNpbWFsKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUdVTEFSX1dPUks6Ci0JCQkJc2V0UmVndWxhcldvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19EVVJBVElPTjoKLQkJCQlzZXRSZW1haW5pbmdEdXJhdGlvbigoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9DT1NUOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lQ29zdCgoQmlnRGVjaW1hbCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXNldFJlbWFpbmluZ092ZXJ0aW1lV29yaygoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlzZXRBQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NWOgotCQkJCXNldENWKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZSgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NBTEVOREFSX1VJRDoKLQkJCQlzZXRDYWxlbmRhclVJRCgoQmlnSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfREFURToKLQkJCQlzZXRDb25zdHJhaW50RGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fREVBRExJTkU6Ci0JCQkJc2V0RGVhZGxpbmUoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMX0FTU0lHTk1FTlRTOgotCQkJCXNldExldmVsQXNzaWdubWVudHMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQlzZXRMZXZlbGluZ0NhblNwbGl0KCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlzZXRMZXZlbGluZ0RlbGF5KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXNldExldmVsaW5nRGVsYXlGb3JtYXQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QUkVfTEVWRUxFRF9TVEFSVDoKLQkJCQlzZXRQcmVMZXZlbGVkU3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTks6Ci0JCQkJc2V0SHlwZXJsaW5rKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtBZGRyZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19IWVBFUkxJTktfU1VCX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rU3ViQWRkcmVzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSUdOT1JFX1JFU09VUkNFX0NBTEVOREFSOgotCQkJCXNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXNldE5vdGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQlzZXRIaWRlQmFyKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJc2V0Um9sbHVwKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQ1dTOgotCQkJCXNldEJDV1MoKChGbG9hdCluZXdWYWx1ZSkuZmxvYXRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlzZXRCQ1dQKCgoRmxvYXQpbmV3VmFsdWUpLmZsb2F0VmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJORURfVkFMVUVfTUVUSE9EOgotCQkJCXNldEVhcm5lZFZhbHVlTWV0aG9kKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlnZXRQcmVkZWNlc3NvckxpbmsoKS5jbGVhcigpOwotCQkJCWdldFByZWRlY2Vzc29yTGluaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9XT1JLX1BST1RFQ1RFRDoKLQkJCQlzZXRBY3R1YWxXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURUQ6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCWdldEV4dGVuZGVkQXR0cmlidXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJZ2V0QmFzZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEJhc2VsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1VUTElORV9DT0RFOgotCQkJCWdldE91dGxpbmVDb2RlKCkuY2xlYXIoKTsKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VGltZXBoYXNlZERhdGEoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXNldFVJRChVSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19OVUxMOgotCQkJCXVuc2V0SXNOdWxsKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSRUFURV9EQVRFOgotCQkJCXNldENyZWF0ZURhdGUoQ1JFQVRFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05UQUNUOgotCQkJCXNldENvbnRhY3QoQ09OVEFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCUzoKLQkJCQlzZXRXQlMoV0JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV0JTX0xFVkVMOgotCQkJCXNldFdCU0xldmVsKFdCU19MRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXNldE91dGxpbmVOdW1iZXIoT1VUTElORV9OVU1CRVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXNldE91dGxpbmVMZXZlbChPVVRMSU5FX0xFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJJT1JJVFk6Ci0JCQkJc2V0UHJpb3JpdHkoUFJJT1JJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVDoKLQkJCQlzZXRTdGFydChTVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJc2V0RHVyYXRpb24oRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19EVVJBVElPTl9GT1JNQVQ6Ci0JCQkJc2V0RHVyYXRpb25Gb3JtYXQoRFVSQVRJT05fRk9STUFUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlzZXRXb3JrKFdPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVE9QOgotCQkJCXNldFN0b3AoU1RPUF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRToKLQkJCQlzZXRSZXN1bWUoUkVTVU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVTVU1FX1ZBTElEOgotCQkJCXVuc2V0UmVzdW1lVmFsaWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUZGT1JUX0RSSVZFTjoKLQkJCQl1bnNldEVmZm9ydERyaXZlbigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRUNVUlJJTkc6Ci0JCQkJdW5zZXRSZWN1cnJpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUl9BTExPQ0FURUQ6Ci0JCQkJdW5zZXRPdmVyQWxsb2NhdGVkKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VTVElNQVRFRDoKLQkJCQl1bnNldEVzdGltYXRlZCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19NSUxFU1RPTkU6Ci0JCQkJdW5zZXRNaWxlc3RvbmUoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VNTUFSWToKLQkJCQl1bnNldFN1bW1hcnkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JJVElDQUw6Ci0JCQkJdW5zZXRDcml0aWNhbCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0KCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX1NVQlBST0pFQ1RfUkVBRF9PTkxZOgotCQkJCXVuc2V0SXNTdWJwcm9qZWN0UmVhZE9ubHkoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fU1VCUFJPSkVDVF9OQU1FOgotCQkJCXNldFN1YnByb2plY3ROYW1lKFNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJdW5zZXRFeHRlcm5hbFRhc2soKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXNldEV4dGVybmFsVGFza1Byb2plY3QoRVhURVJOQUxfVEFTS19QUk9KRUNUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTFlfU1RBUlQ6Ci0JCQkJc2V0RWFybHlTdGFydChFQVJMWV9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX0ZJTklTSDoKLQkJCQlzZXRFYXJseUZpbmlzaChFQVJMWV9GSU5JU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXNldExhdGVTdGFydChMQVRFX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEFURV9GSU5JU0g6Ci0JCQkJc2V0TGF0ZUZpbmlzaChMQVRFX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUX1ZBUklBTkNFOgotCQkJCXNldFN0YXJ0VmFyaWFuY2UoU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSU5JU0hfVkFSSUFOQ0U6Ci0JCQkJc2V0RmluaXNoVmFyaWFuY2UoRklOSVNIX1ZBUklBTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQl1bnNldFdvcmtWYXJpYW5jZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXNldEZyZWVTbGFjayhGUkVFX1NMQUNLX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVE9UQUxfU0xBQ0s6Ci0JCQkJc2V0VG90YWxTbGFjayhUT1RBTF9TTEFDS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1Q6Ci0JCQkJdW5zZXRGaXhlZENvc3QoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklYRURfQ09TVF9BQ0NSVUFMOgotCQkJCXNldEZpeGVkQ29zdEFjY3J1YWwoRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEVSQ0VOVF9DT01QTEVURToKLQkJCQlzZXRQZXJjZW50Q29tcGxldGUoUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlzZXRQZXJjZW50V29ya0NvbXBsZXRlKFBFUkNFTlRfV09SS19DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPU1Q6Ci0JCQkJc2V0Q29zdChDT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRPdmVydGltZUNvc3QoT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJUSU1FX1dPUks6Ci0JCQkJc2V0T3ZlcnRpbWVXb3JrKE9WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfU1RBUlQ6Ci0JCQkJc2V0QWN0dWFsU3RhcnQoQUNUVUFMX1NUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0ZJTklTSDoKLQkJCQlzZXRBY3R1YWxGaW5pc2goQUNUVUFMX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9EVVJBVElPTjoKLQkJCQlzZXRBY3R1YWxEdXJhdGlvbihBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1RVQUxfQ09TVDoKLQkJCQlzZXRBY3R1YWxDb3N0KEFDVFVBTF9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX0NPU1Q6Ci0JCQkJc2V0QWN0dWFsT3ZlcnRpbWVDb3N0KEFDVFVBTF9PVkVSVElNRV9DT1NUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJc2V0QWN0dWFsV29yayhBQ1RVQUxfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29yayhBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFR1VMQVJfV09SSzoKLQkJCQlzZXRSZWd1bGFyV29yayhSRUdVTEFSX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfRFVSQVRJT046Ci0JCQkJc2V0UmVtYWluaW5nRHVyYXRpb24oUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJc2V0UmVtYWluaW5nQ29zdChSRU1BSU5JTkdfQ09TVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXNldFJlbWFpbmluZ1dvcmsoUkVNQUlOSU5HX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZUNvc3QoUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfV09SSzoKLQkJCQlzZXRSZW1haW5pbmdPdmVydGltZVdvcmsoUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19BQ1dQOgotCQkJCXVuc2V0QUNXUCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DVjoKLQkJCQl1bnNldENWKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlNUUkFJTlRfVFlQRToKLQkJCQlzZXRDb25zdHJhaW50VHlwZShDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJc2V0Q2FsZW5kYXJVSUQoQ0FMRU5EQVJfVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ09OU1RSQUlOVF9EQVRFOgotCQkJCXNldENvbnN0cmFpbnREYXRlKENPTlNUUkFJTlRfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0RFQURMSU5FOgotCQkJCXNldERlYWRsaW5lKERFQURMSU5FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxfQVNTSUdOTUVOVFM6Ci0JCQkJdW5zZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0NBTl9TUExJVDoKLQkJCQl1bnNldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVk6Ci0JCQkJc2V0TGV2ZWxpbmdEZWxheShMRVZFTElOR19ERUxBWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xFVkVMSU5HX0RFTEFZX0ZPUk1BVDoKLQkJCQlzZXRMZXZlbGluZ0RlbGF5Rm9ybWF0KExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXNldFByZUxldmVsZWRTdGFydChQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX0ZJTklTSDoKLQkJCQlzZXRQcmVMZXZlbGVkRmluaXNoKFBSRV9MRVZFTEVEX0ZJTklTSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlzZXRIeXBlcmxpbmsoSFlQRVJMSU5LX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJc2V0SHlwZXJsaW5rQWRkcmVzcyhIWVBFUkxJTktfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlzZXRIeXBlcmxpbmtTdWJBZGRyZXNzKEhZUEVSTElOS19TVUJfQUREUkVTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lHTk9SRV9SRVNPVVJDRV9DQUxFTkRBUjoKLQkJCQl1bnNldElnbm9yZVJlc291cmNlQ2FsZW5kYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTk9URVM6Ci0JCQkJc2V0Tm90ZXMoTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ISURFX0JBUjoKLQkJCQl1bnNldEhpZGVCYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUk9MTFVQOgotCQkJCXVuc2V0Um9sbHVwKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1M6Ci0JCQkJdW5zZXRCQ1dTKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0JDV1A6Ci0JCQkJdW5zZXRCQ1dQKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BIWVNJQ0FMX1BFUkNFTlRfQ09NUExFVEU6Ci0JCQkJc2V0UGh5c2ljYWxQZXJjZW50Q29tcGxldGUoUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUk5FRF9WQUxVRV9NRVRIT0Q6Ci0JCQkJc2V0RWFybmVkVmFsdWVNZXRob2QoRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRURFQ0VTU09SX0xJTks6Ci0JCQkJZ2V0UHJlZGVjZXNzb3JMaW5rKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbFdvcmtQcm90ZWN0ZWQoQUNUVUFMX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEOgotCQkJCXNldEFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZChBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJZ2V0RXh0ZW5kZWRBdHRyaWJ1dGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19CQVNFTElORToKLQkJCQlnZXRCYXNlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfQ09ERToKLQkJCQlnZXRPdXRsaW5lQ29kZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RJTUVQSEFTRURfREFUQToKLQkJCQlnZXRUaW1lcGhhc2VkRGF0YSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVUlEOgotCQkJCXJldHVybiBVSURfRURFRkFVTFQgPT0gbnVsbCA/IHVJRCAhPSBudWxsIDogIVVJRF9FREVGQVVMVC5lcXVhbHModUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0lTX05VTEw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNOdWxsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1JFQVRFX0RBVEU6Ci0JCQkJcmV0dXJuIENSRUFURV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGVEYXRlICE9IG51bGwgOiAhQ1JFQVRFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNyZWF0ZURhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NPTlRBQ1Q6Ci0JCQkJcmV0dXJuIENPTlRBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnRhY3QgIT0gbnVsbCA6ICFDT05UQUNUX0VERUZBVUxULmVxdWFscyhjb250YWN0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19XQlM6Ci0JCQkJcmV0dXJuIFdCU19FREVGQVVMVCA9PSBudWxsID8gd0JTICE9IG51bGwgOiAhV0JTX0VERUZBVUxULmVxdWFscyh3QlMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1dCU19MRVZFTDoKLQkJCQlyZXR1cm4gV0JTX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyB3QlNMZXZlbCAhPSBudWxsIDogIVdCU19MRVZFTF9FREVGQVVMVC5lcXVhbHMod0JTTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09VVExJTkVfTlVNQkVSOgotCQkJCXJldHVybiBPVVRMSU5FX05VTUJFUl9FREVGQVVMVCA9PSBudWxsID8gb3V0bGluZU51bWJlciAhPSBudWxsIDogIU9VVExJTkVfTlVNQkVSX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTnVtYmVyKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0xFVkVMOgotCQkJCXJldHVybiBPVVRMSU5FX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyBvdXRsaW5lTGV2ZWwgIT0gbnVsbCA6ICFPVVRMSU5FX0xFVkVMX0VERUZBVUxULmVxdWFscyhvdXRsaW5lTGV2ZWwpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSSU9SSVRZOgotCQkJCXJldHVybiBQUklPUklUWV9FREVGQVVMVCA9PSBudWxsID8gcHJpb3JpdHkgIT0gbnVsbCA6ICFQUklPUklUWV9FREVGQVVMVC5lcXVhbHMocHJpb3JpdHkpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUQVJUOgotCQkJCXJldHVybiBTVEFSVF9FREVGQVVMVCA9PSBudWxsID8gc3RhcnQgIT0gbnVsbCA6ICFTVEFSVF9FREVGQVVMVC5lcXVhbHMoc3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJTklTSDoKLQkJCQlyZXR1cm4gRklOSVNIX0VERUZBVUxUID09IG51bGwgPyBmaW5pc2ggIT0gbnVsbCA6ICFGSU5JU0hfRURFRkFVTFQuZXF1YWxzKGZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT046Ci0JCQkJcmV0dXJuIERVUkFUSU9OX0VERUZBVUxUID09IG51bGwgPyBkdXJhdGlvbiAhPSBudWxsIDogIURVUkFUSU9OX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRFVSQVRJT05fRk9STUFUOgotCQkJCXJldHVybiBEVVJBVElPTl9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGR1cmF0aW9uRm9ybWF0ICE9IG51bGwgOiAhRFVSQVRJT05fRk9STUFUX0VERUZBVUxULmVxdWFscyhkdXJhdGlvbkZvcm1hdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SSzoKLQkJCQlyZXR1cm4gV09SS19FREVGQVVMVCA9PSBudWxsID8gd29yayAhPSBudWxsIDogIVdPUktfRURFRkFVTFQuZXF1YWxzKHdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NUT1A6Ci0JCQkJcmV0dXJuIFNUT1BfRURFRkFVTFQgPT0gbnVsbCA/IHN0b3AgIT0gbnVsbCA6ICFTVE9QX0VERUZBVUxULmVxdWFscyhzdG9wKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRVNVTUU6Ci0JCQkJcmV0dXJuIFJFU1VNRV9FREVGQVVMVCA9PSBudWxsID8gcmVzdW1lICE9IG51bGwgOiAhUkVTVU1FX0VERUZBVUxULmVxdWFscyhyZXN1bWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFU1VNRV9WQUxJRDoKLQkJCQlyZXR1cm4gaXNTZXRSZXN1bWVWYWxpZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VGRk9SVF9EUklWRU46Ci0JCQkJcmV0dXJuIGlzU2V0RWZmb3J0RHJpdmVuKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVDVVJSSU5HOgotCQkJCXJldHVybiBpc1NldFJlY3VycmluZygpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX09WRVJfQUxMT0NBVEVEOgotCQkJCXJldHVybiBpc1NldE92ZXJBbGxvY2F0ZWQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FU1RJTUFURUQ6Ci0JCQkJcmV0dXJuIGlzU2V0RXN0aW1hdGVkKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTUlMRVNUT05FOgotCQkJCXJldHVybiBpc1NldE1pbGVzdG9uZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVTU1BUlk6Ci0JCQkJcmV0dXJuIGlzU2V0U3VtbWFyeSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0NSSVRJQ0FMOgotCQkJCXJldHVybiBpc1NldENyaXRpY2FsKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSVNfU1VCUFJPSkVDVDoKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3QoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JU19TVUJQUk9KRUNUX1JFQURfT05MWToKLQkJCQlyZXR1cm4gaXNTZXRJc1N1YnByb2plY3RSZWFkT25seSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1NVQlBST0pFQ1RfTkFNRToKLQkJCQlyZXR1cm4gU1VCUFJPSkVDVF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzdWJwcm9qZWN0TmFtZSAhPSBudWxsIDogIVNVQlBST0pFQ1RfTkFNRV9FREVGQVVMVC5lcXVhbHMoc3VicHJvamVjdE5hbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VYVEVSTkFMX1RBU0s6Ci0JCQkJcmV0dXJuIGlzU2V0RXh0ZXJuYWxUYXNrKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURVJOQUxfVEFTS19QUk9KRUNUOgotCQkJCXJldHVybiBFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQgPT0gbnVsbCA/IGV4dGVybmFsVGFza1Byb2plY3QgIT0gbnVsbCA6ICFFWFRFUk5BTF9UQVNLX1BST0pFQ1RfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsVGFza1Byb2plY3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0VBUkxZX1NUQVJUOgotCQkJCXJldHVybiBFQVJMWV9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlTdGFydCAhPSBudWxsIDogIUVBUkxZX1NUQVJUX0VERUZBVUxULmVxdWFscyhlYXJseVN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19FQVJMWV9GSU5JU0g6Ci0JCQkJcmV0dXJuIEVBUkxZX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gZWFybHlGaW5pc2ggIT0gbnVsbCA6ICFFQVJMWV9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGVhcmx5RmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MQVRFX1NUQVJUOgotCQkJCXJldHVybiBMQVRFX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBsYXRlU3RhcnQgIT0gbnVsbCA6ICFMQVRFX1NUQVJUX0VERUZBVUxULmVxdWFscyhsYXRlU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0xBVEVfRklOSVNIOgotCQkJCXJldHVybiBMQVRFX0ZJTklTSF9FREVGQVVMVCA9PSBudWxsID8gbGF0ZUZpbmlzaCAhPSBudWxsIDogIUxBVEVfRklOSVNIX0VERUZBVUxULmVxdWFscyhsYXRlRmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19TVEFSVF9WQVJJQU5DRToKLQkJCQlyZXR1cm4gU1RBUlRfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0VmFyaWFuY2UgIT0gbnVsbCA6ICFTVEFSVF9WQVJJQU5DRV9FREVGQVVMVC5lcXVhbHMoc3RhcnRWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRklOSVNIX1ZBUklBTkNFOgotCQkJCXJldHVybiBGSU5JU0hfVkFSSUFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaFZhcmlhbmNlICE9IG51bGwgOiAhRklOSVNIX1ZBUklBTkNFX0VERUZBVUxULmVxdWFscyhmaW5pc2hWYXJpYW5jZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fV09SS19WQVJJQU5DRToKLQkJCQlyZXR1cm4gaXNTZXRXb3JrVmFyaWFuY2UoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GUkVFX1NMQUNLOgotCQkJCXJldHVybiBGUkVFX1NMQUNLX0VERUZBVUxUID09IG51bGwgPyBmcmVlU2xhY2sgIT0gbnVsbCA6ICFGUkVFX1NMQUNLX0VERUZBVUxULmVxdWFscyhmcmVlU2xhY2spOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1RPVEFMX1NMQUNLOgotCQkJCXJldHVybiBUT1RBTF9TTEFDS19FREVGQVVMVCA9PSBudWxsID8gdG90YWxTbGFjayAhPSBudWxsIDogIVRPVEFMX1NMQUNLX0VERUZBVUxULmVxdWFscyh0b3RhbFNsYWNrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19GSVhFRF9DT1NUOgotCQkJCXJldHVybiBpc1NldEZpeGVkQ29zdCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0ZJWEVEX0NPU1RfQUNDUlVBTDoKLQkJCQlyZXR1cm4gRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxUID09IG51bGwgPyBmaXhlZENvc3RBY2NydWFsICE9IG51bGwgOiAhRklYRURfQ09TVF9BQ0NSVUFMX0VERUZBVUxULmVxdWFscyhmaXhlZENvc3RBY2NydWFsKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19QRVJDRU5UX0NPTVBMRVRFOgotCQkJCXJldHVybiBQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50Q29tcGxldGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BFUkNFTlRfV09SS19DT01QTEVURToKLQkJCQlyZXR1cm4gUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxUID09IG51bGwgPyBwZXJjZW50V29ya0NvbXBsZXRlICE9IG51bGwgOiAhUEVSQ0VOVF9XT1JLX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwZXJjZW50V29ya0NvbXBsZXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT1NUOgotCQkJCXJldHVybiBDT1NUX0VERUZBVUxUID09IG51bGwgPyBjb3N0ICE9IG51bGwgOiAhQ09TVF9FREVGQVVMVC5lcXVhbHMoY29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gb3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhT1ZFUlRJTUVfQ09TVF9FREVGQVVMVC5lcXVhbHMob3ZlcnRpbWVDb3N0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBPVkVSVElNRV9XT1JLX0VERUZBVUxUID09IG51bGwgPyBvdmVydGltZVdvcmsgIT0gbnVsbCA6ICFPVkVSVElNRV9XT1JLX0VERUZBVUxULmVxdWFscyhvdmVydGltZVdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9TVEFSVDoKLQkJCQlyZXR1cm4gQUNUVUFMX1NUQVJUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxTdGFydCAhPSBudWxsIDogIUFDVFVBTF9TVEFSVF9FREVGQVVMVC5lcXVhbHMoYWN0dWFsU3RhcnQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9GSU5JU0g6Ci0JCQkJcmV0dXJuIEFDVFVBTF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbEZpbmlzaCAhPSBudWxsIDogIUFDVFVBTF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKGFjdHVhbEZpbmlzaCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0RVUkFUSU9OOgotCQkJCXJldHVybiBBQ1RVQUxfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbER1cmF0aW9uICE9IG51bGwgOiAhQUNUVUFMX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhhY3R1YWxEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX0NPU1Q6Ci0JCQkJcmV0dXJuIEFDVFVBTF9DT1NUX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxDb3N0ICE9IG51bGwgOiAhQUNUVUFMX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbENvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9DT1NUOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfQ09TVF9FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVDb3N0ICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX0NPU1RfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lQ29zdCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUks6Ci0JCQkJcmV0dXJuIEFDVFVBTF9XT1JLX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxXb3JrICE9IG51bGwgOiAhQUNUVUFMX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmspOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBBQ1RVQUxfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gYWN0dWFsT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhQUNUVUFMX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVHVUxBUl9XT1JLOgotCQkJCXJldHVybiBSRUdVTEFSX1dPUktfRURFRkFVTFQgPT0gbnVsbCA/IHJlZ3VsYXJXb3JrICE9IG51bGwgOiAhUkVHVUxBUl9XT1JLX0VERUZBVUxULmVxdWFscyhyZWd1bGFyV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0RVUkFUSU9OOgotCQkJCXJldHVybiBSRU1BSU5JTkdfRFVSQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ0R1cmF0aW9uICE9IG51bGwgOiAhUkVNQUlOSU5HX0RVUkFUSU9OX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdEdXJhdGlvbik7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUkVNQUlOSU5HX0NPU1Q6Ci0JCQkJcmV0dXJuIFJFTUFJTklOR19DT1NUX0VERUZBVUxUID09IG51bGwgPyByZW1haW5pbmdDb3N0ICE9IG51bGwgOiAhUkVNQUlOSU5HX0NPU1RfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ0Nvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nV29yayAhPSBudWxsIDogIVJFTUFJTklOR19XT1JLX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdXb3JrKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19SRU1BSU5JTkdfT1ZFUlRJTUVfQ09TVDoKLQkJCQlyZXR1cm4gUkVNQUlOSU5HX09WRVJUSU1FX0NPU1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlbWFpbmluZ092ZXJ0aW1lQ29zdCAhPSBudWxsIDogIVJFTUFJTklOR19PVkVSVElNRV9DT1NUX0VERUZBVUxULmVxdWFscyhyZW1haW5pbmdPdmVydGltZUNvc3QpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1JFTUFJTklOR19PVkVSVElNRV9XT1JLOgotCQkJCXJldHVybiBSRU1BSU5JTkdfT1ZFUlRJTUVfV09SS19FREVGQVVMVCA9PSBudWxsID8gcmVtYWluaW5nT3ZlcnRpbWVXb3JrICE9IG51bGwgOiAhUkVNQUlOSU5HX09WRVJUSU1FX1dPUktfRURFRkFVTFQuZXF1YWxzKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNXUDoKLQkJCQlyZXR1cm4gaXNTZXRBQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQ1Y6Ci0JCQkJcmV0dXJuIGlzU2V0Q1YoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX1RZUEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludFR5cGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX1RZUEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnRUeXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DQUxFTkRBUl9VSUQ6Ci0JCQkJcmV0dXJuIENBTEVOREFSX1VJRF9FREVGQVVMVCA9PSBudWxsID8gY2FsZW5kYXJVSUQgIT0gbnVsbCA6ICFDQUxFTkRBUl9VSURfRURFRkFVTFQuZXF1YWxzKGNhbGVuZGFyVUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19DT05TVFJBSU5UX0RBVEU6Ci0JCQkJcmV0dXJuIENPTlNUUkFJTlRfREFURV9FREVGQVVMVCA9PSBudWxsID8gY29uc3RyYWludERhdGUgIT0gbnVsbCA6ICFDT05TVFJBSU5UX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNvbnN0cmFpbnREYXRlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ERUFETElORToKLQkJCQlyZXR1cm4gREVBRExJTkVfRURFRkFVTFQgPT0gbnVsbCA/IGRlYWRsaW5lICE9IG51bGwgOiAhREVBRExJTkVfRURFRkFVTFQuZXF1YWxzKGRlYWRsaW5lKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTF9BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gaXNTZXRMZXZlbEFzc2lnbm1lbnRzKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfQ0FOX1NQTElUOgotCQkJCXJldHVybiBpc1NldExldmVsaW5nQ2FuU3BsaXQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19MRVZFTElOR19ERUxBWToKLQkJCQlyZXR1cm4gTEVWRUxJTkdfREVMQVlfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXkgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9FREVGQVVMVC5lcXVhbHMobGV2ZWxpbmdEZWxheSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fTEVWRUxJTkdfREVMQVlfRk9STUFUOgotCQkJCXJldHVybiBMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQgPT0gbnVsbCA/IGxldmVsaW5nRGVsYXlGb3JtYXQgIT0gbnVsbCA6ICFMRVZFTElOR19ERUxBWV9GT1JNQVRfRURFRkFVTFQuZXF1YWxzKGxldmVsaW5nRGVsYXlGb3JtYXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX1BSRV9MRVZFTEVEX1NUQVJUOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9TVEFSVF9FREVGQVVMVCA9PSBudWxsID8gcHJlTGV2ZWxlZFN0YXJ0ICE9IG51bGwgOiAhUFJFX0xFVkVMRURfU1RBUlRfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRTdGFydCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFX0xFVkVMRURfRklOSVNIOgotCQkJCXJldHVybiBQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IHByZUxldmVsZWRGaW5pc2ggIT0gbnVsbCA6ICFQUkVfTEVWRUxFRF9GSU5JU0hfRURFRkFVTFQuZXF1YWxzKHByZUxldmVsZWRGaW5pc2gpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOSzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmsgIT0gbnVsbCA6ICFIWVBFUkxJTktfRURFRkFVTFQuZXF1YWxzKGh5cGVybGluayk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fSFlQRVJMSU5LX0FERFJFU1M6Ci0JCQkJcmV0dXJuIEhZUEVSTElOS19BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX0FERFJFU1NfRURFRkFVTFQuZXF1YWxzKGh5cGVybGlua0FkZHJlc3MpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hZUEVSTElOS19TVUJfQUREUkVTUzoKLQkJCQlyZXR1cm4gSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxUID09IG51bGwgPyBoeXBlcmxpbmtTdWJBZGRyZXNzICE9IG51bGwgOiAhSFlQRVJMSU5LX1NVQl9BRERSRVNTX0VERUZBVUxULmVxdWFscyhoeXBlcmxpbmtTdWJBZGRyZXNzKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19JR05PUkVfUkVTT1VSQ0VfQ0FMRU5EQVI6Ci0JCQkJcmV0dXJuIGlzU2V0SWdub3JlUmVzb3VyY2VDYWxlbmRhcigpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX05PVEVTOgotCQkJCXJldHVybiBOT1RFU19FREVGQVVMVCA9PSBudWxsID8gbm90ZXMgIT0gbnVsbCA6ICFOT1RFU19FREVGQVVMVC5lcXVhbHMobm90ZXMpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0hJREVfQkFSOgotCQkJCXJldHVybiBpc1NldEhpZGVCYXIoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19ST0xMVVA6Ci0JCQkJcmV0dXJuIGlzU2V0Um9sbHVwKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUzoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dTKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkNXUDoKLQkJCQlyZXR1cm4gaXNTZXRCQ1dQKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURToKLQkJCQlyZXR1cm4gUEhZU0lDQUxfUEVSQ0VOVF9DT01QTEVURV9FREVGQVVMVCA9PSBudWxsID8gcGh5c2ljYWxQZXJjZW50Q29tcGxldGUgIT0gbnVsbCA6ICFQSFlTSUNBTF9QRVJDRU5UX0NPTVBMRVRFX0VERUZBVUxULmVxdWFscyhwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRUFSTkVEX1ZBTFVFX01FVEhPRDoKLQkJCQlyZXR1cm4gRUFSTkVEX1ZBTFVFX01FVEhPRF9FREVGQVVMVCA9PSBudWxsID8gZWFybmVkVmFsdWVNZXRob2QgIT0gbnVsbCA6ICFFQVJORURfVkFMVUVfTUVUSE9EX0VERUZBVUxULmVxdWFscyhlYXJuZWRWYWx1ZU1ldGhvZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fUFJFREVDRVNTT1JfTElOSzoKLQkJCQlyZXR1cm4gcHJlZGVjZXNzb3JMaW5rICE9IG51bGwgJiYgIXByZWRlY2Vzc29yTGluay5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQUNUVUFMX1dPUktfUFJPVEVDVEVEOgotCQkJCXJldHVybiBBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQgPT0gbnVsbCA/IGFjdHVhbFdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tfX0FDVFVBTF9PVkVSVElNRV9XT1JLX1BST1RFQ1RFRDoKLQkJCQlyZXR1cm4gQUNUVUFMX09WRVJUSU1FX1dPUktfUFJPVEVDVEVEX0VERUZBVUxUID09IG51bGwgPyBhY3R1YWxPdmVydGltZVdvcmtQcm90ZWN0ZWQgIT0gbnVsbCA6ICFBQ1RVQUxfT1ZFUlRJTUVfV09SS19QUk9URUNURURfRURFRkFVTFQuZXF1YWxzKGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fRVhURU5ERURfQVRUUklCVVRFOgotCQkJCXJldHVybiBleHRlbmRlZEF0dHJpYnV0ZSAhPSBudWxsICYmICFleHRlbmRlZEF0dHJpYnV0ZS5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS19fQkFTRUxJTkU6Ci0JCQkJcmV0dXJuIGJhc2VsaW5lICE9IG51bGwgJiYgIWJhc2VsaW5lLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19PVVRMSU5FX0NPREU6Ci0JCQkJcmV0dXJuIG91dGxpbmVDb2RlICE9IG51bGwgJiYgIW91dGxpbmVDb2RlLmlzRW1wdHkoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLX19USU1FUEhBU0VEX0RBVEE6Ci0JCQkJcmV0dXJuIHRpbWVwaGFzZWREYXRhICE9IG51bGwgJiYgIXRpbWVwaGFzZWREYXRhLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzTnVsbDogIik7Ci0JCWlmIChpc051bGxFU2V0KSByZXN1bHQuYXBwZW5kKGlzTnVsbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNyZWF0ZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0ZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnRhY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnRhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdCUzogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3QlNMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQod0JTTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVOdW1iZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG91dGxpbmVOdW1iZXIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG91dGxpbmVMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3V0bGluZUxldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmlvcml0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJpb3JpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGR1cmF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkdXJhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZHVyYXRpb25Gb3JtYXQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGR1cmF0aW9uRm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB3b3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdG9wOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdG9wKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdW1lVmFsaWQ6ICIpOwotCQlpZiAocmVzdW1lVmFsaWRFU2V0KSByZXN1bHQuYXBwZW5kKHJlc3VtZVZhbGlkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZWZmb3J0RHJpdmVuOiAiKTsKLQkJaWYgKGVmZm9ydERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQoZWZmb3J0RHJpdmVuKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVjdXJyaW5nOiAiKTsKLQkJaWYgKHJlY3VycmluZ0VTZXQpIHJlc3VsdC5hcHBlbmQocmVjdXJyaW5nKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlckFsbG9jYXRlZDogIik7Ci0JCWlmIChvdmVyQWxsb2NhdGVkRVNldCkgcmVzdWx0LmFwcGVuZChvdmVyQWxsb2NhdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXN0aW1hdGVkOiAiKTsKLQkJaWYgKGVzdGltYXRlZEVTZXQpIHJlc3VsdC5hcHBlbmQoZXN0aW1hdGVkKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWlsZXN0b25lOiAiKTsKLQkJaWYgKG1pbGVzdG9uZUVTZXQpIHJlc3VsdC5hcHBlbmQobWlsZXN0b25lKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VtbWFyeTogIik7Ci0JCWlmIChzdW1tYXJ5RVNldCkgcmVzdWx0LmFwcGVuZChzdW1tYXJ5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY3JpdGljYWw6ICIpOwotCQlpZiAoY3JpdGljYWxFU2V0KSByZXN1bHQuYXBwZW5kKGNyaXRpY2FsKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0OiAiKTsKLQkJaWYgKGlzU3VicHJvamVjdEVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTdWJwcm9qZWN0KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTdWJwcm9qZWN0UmVhZE9ubHk6ICIpOwotCQlpZiAoaXNTdWJwcm9qZWN0UmVhZE9ubHlFU2V0KSByZXN1bHQuYXBwZW5kKGlzU3VicHJvamVjdFJlYWRPbmx5KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VicHJvamVjdE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1YnByb2plY3ROYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2s6ICIpOwotCQlpZiAoZXh0ZXJuYWxUYXNrRVNldCkgcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2spOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleHRlcm5hbFRhc2tQcm9qZWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbFRhc2tQcm9qZWN0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseVN0YXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlYXJseVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJseUZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybHlGaW5pc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxhdGVTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGF0ZVN0YXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsYXRlRmluaXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsYXRlRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydFZhcmlhbmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdGFydFZhcmlhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaW5pc2hWYXJpYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoVmFyaWFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHdvcmtWYXJpYW5jZTogIik7Ci0JCWlmICh3b3JrVmFyaWFuY2VFU2V0KSByZXN1bHQuYXBwZW5kKHdvcmtWYXJpYW5jZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZyZWVTbGFjazogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZnJlZVNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b3RhbFNsYWNrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b3RhbFNsYWNrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3Q6ICIpOwotCQlpZiAoZml4ZWRDb3N0RVNldCkgcmVzdWx0LmFwcGVuZChmaXhlZENvc3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmaXhlZENvc3RBY2NydWFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaXhlZENvc3RBY2NydWFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmNlbnRDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyY2VudFdvcmtDb21wbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGVyY2VudFdvcmtDb21wbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29zdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3ZlcnRpbWVDb3N0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvdmVydGltZUNvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG92ZXJ0aW1lV29yazogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3ZlcnRpbWVXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxTdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsU3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbENvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbENvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxXb3JrOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY3R1YWxXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3R1YWxPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbE92ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVndWxhcldvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZ3VsYXJXb3JrKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdEdXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nRHVyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ0Nvc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ0Nvc3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ1dvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ1dvcmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlbWFpbmluZ092ZXJ0aW1lQ29zdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVtYWluaW5nT3ZlcnRpbWVDb3N0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZW1haW5pbmdPdmVydGltZVdvcms6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlbWFpbmluZ092ZXJ0aW1lV29yayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYUNXUDogIik7Ci0JCWlmIChhQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChhQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY1Y6ICIpOwotCQlpZiAoY1ZFU2V0KSByZXN1bHQuYXBwZW5kKGNWKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29uc3RyYWludFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnN0cmFpbnRUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYWxlbmRhclVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FsZW5kYXJVSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnN0cmFpbnREYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb25zdHJhaW50RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVhZGxpbmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlYWRsaW5lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbEFzc2lnbm1lbnRzOiAiKTsKLQkJaWYgKGxldmVsQXNzaWdubWVudHNFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsQXNzaWdubWVudHMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0NhblNwbGl0OiAiKTsKLQkJaWYgKGxldmVsaW5nQ2FuU3BsaXRFU2V0KSByZXN1bHQuYXBwZW5kKGxldmVsaW5nQ2FuU3BsaXQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZXZlbGluZ0RlbGF5Rm9ybWF0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbGluZ0RlbGF5Rm9ybWF0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVMZXZlbGVkU3RhcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZUxldmVsZWRTdGFydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlTGV2ZWxlZEZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlTGV2ZWxlZEZpbmlzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaHlwZXJsaW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChoeXBlcmxpbmspOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua0FkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua0FkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGh5cGVybGlua1N1YkFkZHJlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGh5cGVybGlua1N1YkFkZHJlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlnbm9yZVJlc291cmNlQ2FsZW5kYXI6ICIpOwotCQlpZiAoaWdub3JlUmVzb3VyY2VDYWxlbmRhckVTZXQpIHJlc3VsdC5hcHBlbmQoaWdub3JlUmVzb3VyY2VDYWxlbmRhcik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGlkZUJhcjogIik7Ci0JCWlmIChoaWRlQmFyRVNldCkgcmVzdWx0LmFwcGVuZChoaWRlQmFyKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm9sbHVwOiAiKTsKLQkJaWYgKHJvbGx1cEVTZXQpIHJlc3VsdC5hcHBlbmQocm9sbHVwKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUzogIik7Ci0JCWlmIChiQ1dTRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dTKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYkNXUDogIik7Ci0JCWlmIChiQ1dQRVNldCkgcmVzdWx0LmFwcGVuZChiQ1dQKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGh5c2ljYWxQZXJjZW50Q29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBoeXNpY2FsUGVyY2VudENvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlYXJuZWRWYWx1ZU1ldGhvZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZWFybmVkVmFsdWVNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbFdvcmtQcm90ZWN0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdHVhbFdvcmtQcm90ZWN0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmNWVlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFza3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRhc2tzSW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza3NJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUYXNrcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB0YXNrID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRUYXNrKCkgewotCQlpZiAodGFzayA9PSBudWxsKSB7Ci0JCQl0YXNrID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFRhc2suY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVEFTS1NfX1RBU0spOwotCQl9Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRUYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLU19fVEFTSzoKLQkJCQlnZXRUYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRUYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRBU0tTX19UQVNLOgotCQkJCXJldHVybiB0YXNrICE9IG51bGwgJiYgIXRhc2suaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9UYXNrc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9UaW1lUGVyaW9kSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTcxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVQZXJpb2RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUaW1lUGVyaW9kSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UaW1lIFBlcmlvZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlRpbWVQZXJpb2RJbXBsI2dldEZyb21EYXRlIDxlbT5Gcm9tIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lUGVyaW9kSW1wbCNnZXRUb0RhdGUgPGVtPlRvIERhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lUGVyaW9kSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVGltZVBlcmlvZCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZyb21EYXRlKCkgPGVtPkZyb20gRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnJvbURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IEZST01fREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tRGF0ZSgpIDxlbT5Gcm9tIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21EYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZyb21EYXRlID0gRlJPTV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvRGF0ZSgpIDxlbT5UbyBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb0RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IFRPX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9EYXRlKCkgPGVtPlRvIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCB0b0RhdGUgPSBUT19EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVQZXJpb2RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGltZVBlcmlvZCgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RnJvbURhdGUoKSB7Ci0JCXJldHVybiBmcm9tRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tRGF0ZShPYmplY3QgbmV3RnJvbURhdGUpIHsKLQkJT2JqZWN0IG9sZEZyb21EYXRlID0gZnJvbURhdGU7Ci0JCWZyb21EYXRlID0gbmV3RnJvbURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURSwgb2xkRnJvbURhdGUsIGZyb21EYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRUb0RhdGUoKSB7Ci0JCXJldHVybiB0b0RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9EYXRlKE9iamVjdCBuZXdUb0RhdGUpIHsKLQkJT2JqZWN0IG9sZFRvRGF0ZSA9IHRvRGF0ZTsKLQkJdG9EYXRlID0gbmV3VG9EYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFLCBvbGRUb0RhdGUsIHRvRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fRlJPTV9EQVRFOgotCQkJCXJldHVybiBnZXRGcm9tRGF0ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXJldHVybiBnZXRUb0RhdGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlzZXRGcm9tRGF0ZSgoT2JqZWN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX1RPX0RBVEU6Ci0JCQkJc2V0VG9EYXRlKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlzZXRGcm9tRGF0ZShGUk9NX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FX1BFUklPRF9fVE9fREFURToKLQkJCQlzZXRUb0RhdGUoVE9fREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0RfX0ZST01fREFURToKLQkJCQlyZXR1cm4gRlJPTV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBmcm9tRGF0ZSAhPSBudWxsIDogIUZST01fREFURV9FREVGQVVMVC5lcXVhbHMoZnJvbURhdGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EX19UT19EQVRFOgotCQkJCXJldHVybiBUT19EQVRFX0VERUZBVUxUID09IG51bGwgPyB0b0RhdGUgIT0gbnVsbCA6ICFUT19EQVRFX0VERUZBVUxULmVxdWFscyh0b0RhdGUpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZnJvbURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZyb21EYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0b0RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRvRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1RpbWVQZXJpb2RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1RpbWVwaGFzZWREYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyYTBjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGltZXBoYXNlZERhdGFUeXBlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGltZXBoYXNlZCBEYXRhIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFR5cGUgPGVtPlR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldFVJRCA8ZW0+VUlEPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRTdGFydCA8ZW0+U3RhcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5UaW1lcGhhc2VkRGF0YVR5cGVJbXBsI2dldEZpbmlzaCA8ZW0+RmluaXNoPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRVbml0IDxlbT5Vbml0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVGltZXBoYXNlZERhdGFUeXBlSW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBUaW1lcGhhc2VkRGF0YVR5cGUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBUWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VUlEKCkgPGVtPlVJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVUlEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVJRCgpIDxlbT5VSUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdUlEID0gVUlEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0KCkgPGVtPlN0YXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RBUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnQoKSA8ZW0+U3RhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHN0YXJ0ID0gU1RBUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGSU5JU0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoKCkgPGVtPkZpbmlzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGZpbmlzaCA9IEZJTklTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbml0KCkgPGVtPlVuaXQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBVTklUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXQoKSA8ZW0+VW5pdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdW5pdCA9IFVOSVRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUaW1lcGhhc2VkRGF0YVR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGltZXBoYXNlZERhdGFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShCaWdJbnRlZ2VyIG5ld1R5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQmlnSW50ZWdlciBnZXRVSUQoKSB7Ci0JCXJldHVybiB1SUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VUlEKEJpZ0ludGVnZXIgbmV3VUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVUlEID0gdUlEOwotCQl1SUQgPSBuZXdVSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRCwgb2xkVUlELCB1SUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoT2JqZWN0IG5ld1N0YXJ0KSB7Ci0JCU9iamVjdCBvbGRTdGFydCA9IHN0YXJ0OwotCQlzdGFydCA9IG5ld1N0YXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVCwgb2xkU3RhcnQsIHN0YXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGaW5pc2goKSB7Ci0JCXJldHVybiBmaW5pc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoKE9iamVjdCBuZXdGaW5pc2gpIHsKLQkJT2JqZWN0IG9sZEZpbmlzaCA9IGZpbmlzaDsKLQkJZmluaXNoID0gbmV3RmluaXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0gsIG9sZEZpbmlzaCwgZmluaXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0VW5pdCgpIHsKLQkJcmV0dXJuIHVuaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pdChCaWdJbnRlZ2VyIG5ld1VuaXQpIHsKLQkJQmlnSW50ZWdlciBvbGRVbml0ID0gdW5pdDsKLQkJdW5pdCA9IG5ld1VuaXQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQsIG9sZFVuaXQsIHVuaXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19UWVBFOgotCQkJCXJldHVybiBnZXRUeXBlKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlyZXR1cm4gZ2V0VUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXJldHVybiBnZXRTdGFydCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJcmV0dXJuIGdldEZpbmlzaCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VTklUOgotCQkJCXJldHVybiBnZXRVbml0KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fU1RBUlQ6Ci0JCQkJc2V0U3RhcnQoKE9iamVjdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19GSU5JU0g6Ci0JCQkJc2V0RmluaXNoKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlzZXRVbml0KChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VJRDoKLQkJCQlzZXRVSUQoVUlEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1NUQVJUOgotCQkJCXNldFN0YXJ0KFNUQVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX0ZJTklTSDoKLQkJCQlzZXRGaW5pc2goRklOSVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1VOSVQ6Ci0JCQkJc2V0VW5pdChVTklUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRVBIQVNFRF9EQVRBX1RZUEVfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19VSUQ6Ci0JCQkJcmV0dXJuIFVJRF9FREVGQVVMVCA9PSBudWxsID8gdUlEICE9IG51bGwgOiAhVUlEX0VERUZBVUxULmVxdWFscyh1SUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19TVEFSVDoKLQkJCQlyZXR1cm4gU1RBUlRfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0ICE9IG51bGwgOiAhU1RBUlRfRURFRkFVTFQuZXF1YWxzKHN0YXJ0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fRklOSVNIOgotCQkJCXJldHVybiBGSU5JU0hfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaCAhPSBudWxsIDogIUZJTklTSF9FREVGQVVMVC5lcXVhbHMoZmluaXNoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5USU1FUEhBU0VEX0RBVEFfVFlQRV9fVU5JVDoKLQkJCQlyZXR1cm4gVU5JVF9FREVGQVVMVCA9PSBudWxsID8gdW5pdCAhPSBudWxsIDogIVVOSVRfRURFRkFVTFQuZXF1YWxzKHVuaXQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVJRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RhcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmluaXNoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1bml0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh1bml0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UaW1lcGhhc2VkRGF0YVR5cGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5NDQ5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWUySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFsdWUySW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWUyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWUyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWUySW1wbCNnZXRJRCA8ZW0+SUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZTJJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlMkltcGwjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVmFsdWUySW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWUyIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SUQoKSA8ZW0+SUQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBpRCA9IElEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZTJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWUyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0SUQoKSB7Ci0JCXJldHVybiBpRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJRChCaWdJbnRlZ2VyIG5ld0lEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkSUQgPSBpRDsKLQkJaUQgPSBuZXdJRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lELCBvbGRJRCwgaUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJcmV0dXJuIGdldElEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX0lEOgotCQkJCXNldElEKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fSUQ6Ci0JCQkJc2V0SUQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyX19JRDoKLQkJCQlyZXR1cm4gSURfRURFRkFVTFQgPT0gbnVsbCA/IGlEICE9IG51bGwgOiAhSURfRURFRkFVTFQuZXF1YWxzKGlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpRDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWUySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGUxZGVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTE6NTMganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRWYWx1ZUlEIDxlbT5WYWx1ZSBJRDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLlZhbHVlSW1wbCNnZXRQYXJlbnRWYWx1ZUlEIDxlbT5QYXJlbnQgVmFsdWUgSUQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVJbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgVmFsdWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUlEKCkgPGVtPlZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgVkFMVUVfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVJRCgpIDxlbT5WYWx1ZSBJRDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgdmFsdWVJRCA9IFZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudFZhbHVlSUQoKSA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudFZhbHVlSUQoKSA8ZW0+UGFyZW50IFZhbHVlIElEPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRWYWx1ZUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBwYXJlbnRWYWx1ZUlEID0gUEFSRU5UX1ZBTFVFX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhbHVlSUQoKSB7Ci0JCXJldHVybiB2YWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlSUQoQmlnSW50ZWdlciBuZXdWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVmFsdWVJRCA9IHZhbHVlSUQ7Ci0JCXZhbHVlSUQgPSBuZXdWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRCwgb2xkVmFsdWVJRCwgdmFsdWVJRCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFBhcmVudFZhbHVlSUQoKSB7Ci0JCXJldHVybiBwYXJlbnRWYWx1ZUlEOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudFZhbHVlSUQoQmlnSW50ZWdlciBuZXdQYXJlbnRWYWx1ZUlEKSB7Ci0JCUJpZ0ludGVnZXIgb2xkUGFyZW50VmFsdWVJRCA9IHBhcmVudFZhbHVlSUQ7Ci0JCXBhcmVudFZhbHVlSUQgPSBuZXdQYXJlbnRWYWx1ZUlEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19QQVJFTlRfVkFMVUVfSUQsIG9sZFBhcmVudFZhbHVlSUQsIHBhcmVudFZhbHVlSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUVfSUQ6Ci0JCQkJcmV0dXJuIGdldFZhbHVlSUQoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXJldHVybiBnZXRQYXJlbnRWYWx1ZUlEKCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXNldFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXNldFBhcmVudFZhbHVlSUQoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRV9JRDoKLQkJCQlzZXRWYWx1ZUlEKFZBTFVFX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1BBUkVOVF9WQUxVRV9JRDoKLQkJCQlzZXRQYXJlbnRWYWx1ZUlEKFBBUkVOVF9WQUxVRV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlzZXRWYWx1ZShWQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfX1ZBTFVFX0lEOgotCQkJCXJldHVybiBWQUxVRV9JRF9FREVGQVVMVCA9PSBudWxsID8gdmFsdWVJRCAhPSBudWxsIDogIVZBTFVFX0lEX0VERUZBVUxULmVxdWFscyh2YWx1ZUlEKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fUEFSRU5UX1ZBTFVFX0lEOgotCQkJCXJldHVybiBQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcmVudFZhbHVlSUQgIT0gbnVsbCA6ICFQQVJFTlRfVkFMVUVfSURfRURFRkFVTFQuZXF1YWxzKHBhcmVudFZhbHVlSUQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJlbnRWYWx1ZUlEOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJlbnRWYWx1ZUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ZhbHVlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZTc3ZTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1ZhbHVlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFZhbHVlTGlzdEltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYWx1ZSBMaXN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVMaXN0SW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBWYWx1ZUxpc3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFZhbHVlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdChWYWx1ZTIuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUUpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0VmFsdWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRV9MSVNUX19WQUxVRToKLQkJCQlnZXRWYWx1ZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFsdWUoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVF9fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFX0xJU1RfX1ZBTFVFOgotCQkJCXJldHVybiB2YWx1ZSAhPSBudWxsICYmICF2YWx1ZS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvL1ZhbHVlTGlzdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvVmFsdWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGU4NTI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9WYWx1ZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBWYWx1ZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmFsdWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuVmFsdWVzSW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5WYWx1ZXNJbXBsI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhbHVlc0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFZhbHVlcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAoKSA8ZW0+R3JvdXA8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYWx1ZXNJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAoKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKSB7Ci0JCQlncm91cCA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwKWdldEdyb3VwKCkpLmxpc3QoTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VmFsdWVzX1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KWdldEdyb3VwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRWYWx1ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19HUk9VUDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCWdldEdyb3VwKCkuY2xlYXIoKTsKLQkJCQlnZXRHcm91cCgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fVkFMVUU6Ci0JCQkJZ2V0VmFsdWUoKS5jbGVhcigpOwotCQkJCWdldFZhbHVlKCkuYWRkQWxsKChDb2xsZWN0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFU19fR1JPVVA6Ci0JCQkJZ2V0R3JvdXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX1ZBTFVFOgotCQkJCWdldFZhbHVlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRVNfX0dST1VQOgotCQkJCXJldHVybiBncm91cCAhPSBudWxsICYmICFncm91cC5pc0VtcHR5KCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTX19WQUxVRToKLQkJCQlyZXR1cm4gIWdldFZhbHVlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXA6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVmFsdWVzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL1dCU01hc2tJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1YWEwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdCU01hc2tJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRMZXZlbCA8ZW0+TGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza0ltcGwjZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrSW1wbCNnZXRTZXBhcmF0b3IgPGVtPlNlcGFyYXRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdCU01hc2tJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBXQlNNYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTEVWRUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWwoKSA8ZW0+TGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciBsZXZlbCA9IExFVkVMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQmlnSW50ZWdlciB0eXBlID0gVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFTkdUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbGVuZ3RoID0gTEVOR1RIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcGFyYXRvcigpIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcGFyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcGFyYXRvcigpIDxlbT5TZXBhcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcGFyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZXBhcmF0b3IgPSBTRVBBUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV0JTTWFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXQlNNYXNrKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiBsZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbChCaWdJbnRlZ2VyIG5ld0xldmVsKSB7Ci0JCUJpZ0ludGVnZXIgb2xkTGV2ZWwgPSBsZXZlbDsKLQkJbGV2ZWwgPSBuZXdMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUwsIG9sZExldmVsLCBsZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCaWdJbnRlZ2VyIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoQmlnSW50ZWdlciBuZXdUeXBlKSB7Ci0JCUJpZ0ludGVnZXIgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKFN0cmluZyBuZXdMZW5ndGgpIHsKLQkJU3RyaW5nIG9sZExlbmd0aCA9IGxlbmd0aDsKLQkJbGVuZ3RoID0gbmV3TGVuZ3RoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEgsIG9sZExlbmd0aCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiBzZXBhcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBuZXdTZXBhcmF0b3IpIHsKLQkJU3RyaW5nIG9sZFNlcGFyYXRvciA9IHNlcGFyYXRvcjsKLQkJc2VwYXJhdG9yID0gbmV3U2VwYXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1IsIG9sZFNlcGFyYXRvciwgc2VwYXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRVZFTDoKLQkJCQlyZXR1cm4gZ2V0TGV2ZWwoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19MRU5HVEg6Ci0JCQkJcmV0dXJuIGdldExlbmd0aCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcGFyYXRvcigpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJc2V0TGV2ZWwoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fVFlQRToKLQkJCQlzZXRUeXBlKChCaWdJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLX19TRVBBUkFUT1I6Ci0JCQkJc2V0U2VwYXJhdG9yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFVkVMOgotCQkJCXNldExldmVsKExFVkVMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJc2V0VHlwZShUWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1NFUEFSQVRPUjoKLQkJCQlzZXRTZXBhcmF0b3IoU0VQQVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVWRUw6Ci0JCQkJcmV0dXJuIExFVkVMX0VERUZBVUxUID09IG51bGwgPyBsZXZlbCAhPSBudWxsIDogIUxFVkVMX0VERUZBVUxULmVxdWFscyhsZXZlbCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tfX1RZUEU6Ci0JCQkJcmV0dXJuIFRZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGUgIT0gbnVsbCA6ICFUWVBFX0VERUZBVUxULmVxdWFscyh0eXBlKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fTEVOR1RIOgotCQkJCXJldHVybiBMRU5HVEhfRURFRkFVTFQgPT0gbnVsbCA/IGxlbmd0aCAhPSBudWxsIDogIUxFTkdUSF9FREVGQVVMVC5lcXVhbHMobGVuZ3RoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS19fU0VQQVJBVE9SOgotCQkJCXJldHVybiBTRVBBUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IHNlcGFyYXRvciAhPSBudWxsIDogIVNFUEFSQVRPUl9FREVGQVVMVC5lcXVhbHMoc2VwYXJhdG9yKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxldmVsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZXZlbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGVuZ3RoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsZW5ndGgpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlcGFyYXRvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV0JTTWFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XQlNNYXNrc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmZDcxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV0JTTWFza3NJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXQlNNYXNrc0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V0JTIE1hc2tzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV0JTTWFza3NJbXBsI2lzVmVyaWZ5VW5pcXVlQ29kZXMgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XQlNNYXNrc0ltcGwjaXNHZW5lcmF0ZUNvZGVzIDxlbT5HZW5lcmF0ZSBDb2RlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldCU01hc2tzSW1wbCNnZXRXQlNNYXNrIDxlbT5XQlMgTWFzazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdCU01hc2tzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV0JTTWFza3MgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ZlcmlmeVVuaXF1ZUNvZGVzKCkgPGVtPlZlcmlmeSBVbmlxdWUgQ29kZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVmVyaWZ5VW5pcXVlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmVyaWZ5IFVuaXF1ZSBDb2RlcyBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHRU5FUkFURV9DT0RFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHZW5lcmF0ZUNvZGVzKCkgPGVtPkdlbmVyYXRlIENvZGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dlbmVyYXRlQ29kZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXMgPSBHRU5FUkFURV9DT0RFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgR2VuZXJhdGUgQ29kZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdCU01hc2soKSA8ZW0+V0JTIE1hc2s8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V0JTTWFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IHdCU01hc2sgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdCU01hc2tzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdCU01hc2tzKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWZXJpZnlVbmlxdWVDb2RlcygpIHsKLQkJcmV0dXJuIHZlcmlmeVVuaXF1ZUNvZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcmlmeVVuaXF1ZUNvZGVzKGJvb2xlYW4gbmV3VmVyaWZ5VW5pcXVlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2RlcyA9IHZlcmlmeVVuaXF1ZUNvZGVzOwotCQl2ZXJpZnlVbmlxdWVDb2RlcyA9IG5ld1ZlcmlmeVVuaXF1ZUNvZGVzOwotCQlib29sZWFuIG9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCA9IHZlcmlmeVVuaXF1ZUNvZGVzRVNldDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCB2ZXJpZnlVbmlxdWVDb2RlcywgIW9sZFZlcmlmeVVuaXF1ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0VmVyaWZ5VW5pcXVlQ29kZXMoKSB7Ci0JCWJvb2xlYW4gb2xkVmVyaWZ5VW5pcXVlQ29kZXMgPSB2ZXJpZnlVbmlxdWVDb2RlczsKLQkJYm9vbGVhbiBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQgPSB2ZXJpZnlVbmlxdWVDb2Rlc0VTZXQ7Ci0JCXZlcmlmeVVuaXF1ZUNvZGVzID0gVkVSSUZZX1VOSVFVRV9DT0RFU19FREVGQVVMVDsKLQkJdmVyaWZ5VW5pcXVlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVMsIG9sZFZlcmlmeVVuaXF1ZUNvZGVzLCBWRVJJRllfVU5JUVVFX0NPREVTX0VERUZBVUxULCBvbGRWZXJpZnlVbmlxdWVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZlcmlmeVVuaXF1ZUNvZGVzKCkgewotCQlyZXR1cm4gdmVyaWZ5VW5pcXVlQ29kZXNFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVDb2RlcygpIHsKLQkJcmV0dXJuIGdlbmVyYXRlQ29kZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVDb2Rlcyhib29sZWFuIG5ld0dlbmVyYXRlQ29kZXMpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJZ2VuZXJhdGVDb2RlcyA9IG5ld0dlbmVyYXRlQ29kZXM7Ci0JCWJvb2xlYW4gb2xkR2VuZXJhdGVDb2Rlc0VTZXQgPSBnZW5lcmF0ZUNvZGVzRVNldDsKLQkJZ2VuZXJhdGVDb2Rlc0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fR0VORVJBVEVfQ09ERVMsIG9sZEdlbmVyYXRlQ29kZXMsIGdlbmVyYXRlQ29kZXMsICFvbGRHZW5lcmF0ZUNvZGVzRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0R2VuZXJhdGVDb2RlcygpIHsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzID0gZ2VuZXJhdGVDb2RlczsKLQkJYm9vbGVhbiBvbGRHZW5lcmF0ZUNvZGVzRVNldCA9IGdlbmVyYXRlQ29kZXNFU2V0OwotCQlnZW5lcmF0ZUNvZGVzID0gR0VORVJBVEVfQ09ERVNfRURFRkFVTFQ7Ci0JCWdlbmVyYXRlQ29kZXNFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTLCBvbGRHZW5lcmF0ZUNvZGVzLCBHRU5FUkFURV9DT0RFU19FREVGQVVMVCwgb2xkR2VuZXJhdGVDb2Rlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEdlbmVyYXRlQ29kZXMoKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUNvZGVzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIG5ld1ByZWZpeCkgewotCQlTdHJpbmcgb2xkUHJlZml4ID0gcHJlZml4OwotCQlwcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19QUkVGSVgsIG9sZFByZWZpeCwgcHJlZml4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldFdCU01hc2soKSB7Ci0JCWlmICh3QlNNYXNrID09IG51bGwpIHsKLQkJCXdCU01hc2sgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QoV0JTTWFzay5jbGFzcywgdGhpcywgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLKTsKLQkJfQotCQlyZXR1cm4gd0JTTWFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdClnZXRXQlNNYXNrKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzVmVyaWZ5VW5pcXVlQ29kZXMoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlyZXR1cm4gaXNHZW5lcmF0ZUNvZGVzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fUFJFRklYOgotCQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1dCU19NQVNLOgotCQkJCXJldHVybiBnZXRXQlNNYXNrKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fVkVSSUZZX1VOSVFVRV9DT0RFUzoKLQkJCQlzZXRWZXJpZnlVbmlxdWVDb2RlcygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19HRU5FUkFURV9DT0RFUzoKLQkJCQlzZXRHZW5lcmF0ZUNvZGVzKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLU19fV0JTX01BU0s6Ci0JCQkJZ2V0V0JTTWFzaygpLmNsZWFyKCk7Ci0JCQkJZ2V0V0JTTWFzaygpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJdW5zZXRWZXJpZnlVbmlxdWVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXVuc2V0R2VuZXJhdGVDb2RlcygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlnZXRXQlNNYXNrKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1ZFUklGWV9VTklRVUVfQ09ERVM6Ci0JCQkJcmV0dXJuIGlzU2V0VmVyaWZ5VW5pcXVlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX0dFTkVSQVRFX0NPREVTOgotCQkJCXJldHVybiBpc1NldEdlbmVyYXRlQ29kZXMoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1NfX1BSRUZJWDoKLQkJCQlyZXR1cm4gUFJFRklYX0VERUZBVUxUID09IG51bGwgPyBwcmVmaXggIT0gbnVsbCA6ICFQUkVGSVhfRURFRkFVTFQuZXF1YWxzKHByZWZpeCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0JTX01BU0tTX19XQlNfTUFTSzoKLQkJCQlyZXR1cm4gd0JTTWFzayAhPSBudWxsICYmICF3QlNNYXNrLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZlcmlmeVVuaXF1ZUNvZGVzOiAiKTsKLQkJaWYgKHZlcmlmeVVuaXF1ZUNvZGVzRVNldCkgcmVzdWx0LmFwcGVuZCh2ZXJpZnlVbmlxdWVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdlbmVyYXRlQ29kZXM6ICIpOwotCQlpZiAoZ2VuZXJhdGVDb2Rlc0VTZXQpIHJlc3VsdC5hcHBlbmQoZ2VuZXJhdGVDb2Rlcyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByZWZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJlZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV0JTTWFza3NJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2U0OWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2Vla0RheUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZVBlcmlvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldERheVR5cGUgPGVtPkRheSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjaXNEYXlXb3JraW5nIDxlbT5EYXkgV29ya2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldlZWtEYXlJbXBsI2dldFRpbWVQZXJpb2QgPGVtPlRpbWUgUGVyaW9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV2Vla0RheUltcGwjZ2V0V29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2Vla0RheUltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlZWtEYXkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXlUeXBlKCkgPGVtPkRheSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgREFZX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF5VHlwZSgpIDxlbT5EYXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJpZ0ludGVnZXIgZGF5VHlwZSA9IERBWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREFZX1dPUktJTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRGF5V29ya2luZygpIDxlbT5EYXkgV29ya2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEYXlXb3JraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nID0gREFZX1dPUktJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIERheSBXb3JraW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGltZVBlcmlvZCgpIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGltZVBlcmlvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRpbWVQZXJpb2QgdGltZVBlcmlvZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZXMoKSA8ZW0+V29ya2luZyBUaW1lczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV2Vla0RheUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrRGF5KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJpZ0ludGVnZXIgZ2V0RGF5VHlwZSgpIHsKLQkJcmV0dXJuIGRheVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF5VHlwZShCaWdJbnRlZ2VyIG5ld0RheVR5cGUpIHsKLQkJQmlnSW50ZWdlciBvbGREYXlUeXBlID0gZGF5VHlwZTsKLQkJZGF5VHlwZSA9IG5ld0RheVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFLCBvbGREYXlUeXBlLCBkYXlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEYXlXb3JraW5nKCkgewotCQlyZXR1cm4gZGF5V29ya2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXlXb3JraW5nKGJvb2xlYW4gbmV3RGF5V29ya2luZykgewotCQlib29sZWFuIG9sZERheVdvcmtpbmcgPSBkYXlXb3JraW5nOwotCQlkYXlXb3JraW5nID0gbmV3RGF5V29ya2luZzsKLQkJYm9vbGVhbiBvbGREYXlXb3JraW5nRVNldCA9IGRheVdvcmtpbmdFU2V0OwotCQlkYXlXb3JraW5nRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBkYXlXb3JraW5nLCAhb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldERheVdvcmtpbmcoKSB7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZyA9IGRheVdvcmtpbmc7Ci0JCWJvb2xlYW4gb2xkRGF5V29ya2luZ0VTZXQgPSBkYXlXb3JraW5nRVNldDsKLQkJZGF5V29ya2luZyA9IERBWV9XT1JLSU5HX0VERUZBVUxUOwotCQlkYXlXb3JraW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HLCBvbGREYXlXb3JraW5nLCBEQVlfV09SS0lOR19FREVGQVVMVCwgb2xkRGF5V29ya2luZ0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldERheVdvcmtpbmcoKSB7Ci0JCXJldHVybiBkYXlXb3JraW5nRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGltZVBlcmlvZCBnZXRUaW1lUGVyaW9kKCkgewotCQlyZXR1cm4gdGltZVBlcmlvZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUaW1lUGVyaW9kKFRpbWVQZXJpb2QgbmV3VGltZVBlcmlvZCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUaW1lUGVyaW9kIG9sZFRpbWVQZXJpb2QgPSB0aW1lUGVyaW9kOwotCQl0aW1lUGVyaW9kID0gbmV3VGltZVBlcmlvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG9sZFRpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVQZXJpb2QoVGltZVBlcmlvZCBuZXdUaW1lUGVyaW9kKSB7Ci0JCWlmIChuZXdUaW1lUGVyaW9kICE9IHRpbWVQZXJpb2QpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRpbWVQZXJpb2QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGltZVBlcmlvZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9ELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUaW1lUGVyaW9kICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RpbWVQZXJpb2QpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUaW1lUGVyaW9kKG5ld1RpbWVQZXJpb2QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0QsIG5ld1RpbWVQZXJpb2QsIG5ld1RpbWVQZXJpb2QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya2luZ1RpbWVzIGdldFdvcmtpbmdUaW1lcygpIHsKLQkJcmV0dXJuIHdvcmtpbmdUaW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlXb3JraW5nVGltZXMgb2xkV29ya2luZ1RpbWVzID0gd29ya2luZ1RpbWVzOwotCQl3b3JraW5nVGltZXMgPSBuZXdXb3JraW5nVGltZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG9sZFdvcmtpbmdUaW1lcywgbmV3V29ya2luZ1RpbWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG5ld1dvcmtpbmdUaW1lcykgewotCQlpZiAobmV3V29ya2luZ1RpbWVzICE9IHdvcmtpbmdUaW1lcykgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAod29ya2luZ1RpbWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXdvcmtpbmdUaW1lcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1dPUktJTkdfVElNRVMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1dvcmtpbmdUaW1lcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdXb3JraW5nVGltZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFdvcmtpbmdUaW1lcyhuZXdXb3JraW5nVGltZXMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUywgbmV3V29ya2luZ1RpbWVzLCBuZXdXb3JraW5nVGltZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRUaW1lUGVyaW9kKG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0V29ya2luZ1RpbWVzKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0RGF5VHlwZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQlyZXR1cm4gaXNEYXlXb3JraW5nKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19USU1FX1BFUklPRDoKLQkJCQlyZXR1cm4gZ2V0VGltZVBlcmlvZCgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXJldHVybiBnZXRXb3JraW5nVGltZXMoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9UWVBFOgotCQkJCXNldERheVR5cGUoKEJpZ0ludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1dPUktJTkc6Ci0JCQkJc2V0RGF5V29ya2luZygoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlzZXRXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fREFZX1RZUEU6Ci0JCQkJc2V0RGF5VHlwZShEQVlfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfV09SS0lORzoKLQkJCQl1bnNldERheVdvcmtpbmcoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX1RJTUVfUEVSSU9EOgotCQkJCXNldFRpbWVQZXJpb2QoKFRpbWVQZXJpb2QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19XT1JLSU5HX1RJTUVTOgotCQkJCXNldFdvcmtpbmdUaW1lcygoV29ya2luZ1RpbWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZX19EQVlfVFlQRToKLQkJCQlyZXR1cm4gREFZX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRheVR5cGUgIT0gbnVsbCA6ICFEQVlfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGF5VHlwZSk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlfX0RBWV9XT1JLSU5HOgotCQkJCXJldHVybiBpc1NldERheVdvcmtpbmcoKTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHRpbWVQZXJpb2QgIT0gbnVsbDsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWV9fV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWVzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXlUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkYXlXb3JraW5nOiAiKTsKLQkJaWYgKGRheVdvcmtpbmdFU2V0KSByZXN1bHQuYXBwZW5kKGRheVdvcmtpbmcpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV2Vla0RheUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9XZWVrRGF5c0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMwYmRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV2Vla0RheXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXZWVrRGF5c0ltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XZWVrIERheXM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbC5XZWVrRGF5c0ltcGwjZ2V0V2Vla0RheSA8ZW0+V2VlayBEYXk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWVrRGF5c0ltcGwgZXh0ZW5kcyBFT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdlZWtEYXlzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXZWVrRGF5KCkgPGVtPldlZWsgRGF5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdlZWtEYXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3ZWVrRGF5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXZWVrRGF5c0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWVrRGF5cygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXZWVrRGF5KCkgewotCQlpZiAod2Vla0RheSA9PSBudWxsKSB7Ci0JCQl3ZWVrRGF5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdlZWtEYXkuY2xhc3MsIHRoaXMsIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWSk7Ci0JCX0KLQkJcmV0dXJuIHdlZWtEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZU19fV0VFS19EQVk6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V2Vla0RheSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlyZXR1cm4gZ2V0V2Vla0RheSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCWdldFdlZWtEYXkoKS5jbGVhcigpOwotCQkJCWdldFdlZWtEYXkoKS5hZGRBbGwoKENvbGxlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVlTX19XRUVLX0RBWToKLQkJCQlnZXRXZWVrRGF5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVNfX1dFRUtfREFZOgotCQkJCXJldHVybiB3ZWVrRGF5ICE9IG51bGwgJiYgIXdlZWtEYXkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9XZWVrRGF5c0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNhNTZjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZUltcGwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUxOjUzIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FT2JqZWN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmtpbmcgVGltZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5pbXBsLldvcmtpbmdUaW1lSW1wbCNnZXRGcm9tVGltZSA8ZW0+RnJvbSBUaW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVJbXBsI2dldFRvVGltZSA8ZW0+VG8gVGltZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtpbmdUaW1lSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWUgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGcm9tVGltZSgpIDxlbT5Gcm9tIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZyb21UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBGUk9NX1RJTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnJvbVRpbWUoKSA8ZW0+RnJvbSBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGcm9tVGltZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBmcm9tVGltZSA9IEZST01fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb1RpbWUoKSA8ZW0+VG8gVGltZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9UaW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBUT19USU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvVGltZSgpIDxlbT5UbyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgdG9UaW1lID0gVE9fVElNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JraW5nVGltZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JraW5nVGltZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RnJvbVRpbWUoKSB7Ci0JCXJldHVybiBmcm9tVGltZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcm9tVGltZShPYmplY3QgbmV3RnJvbVRpbWUpIHsKLQkJT2JqZWN0IG9sZEZyb21UaW1lID0gZnJvbVRpbWU7Ci0JCWZyb21UaW1lID0gbmV3RnJvbVRpbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUUsIG9sZEZyb21UaW1lLCBmcm9tVGltZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VG9UaW1lKCkgewotCQlyZXR1cm4gdG9UaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvVGltZShPYmplY3QgbmV3VG9UaW1lKSB7Ci0JCU9iamVjdCBvbGRUb1RpbWUgPSB0b1RpbWU7Ci0JCXRvVGltZSA9IG5ld1RvVGltZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUUsIG9sZFRvVGltZSwgdG9UaW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXJldHVybiBnZXRGcm9tVGltZSgpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gZ2V0VG9UaW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fRlJPTV9USU1FOgotCQkJCXNldEZyb21UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX1RPX1RJTUU6Ci0JCQkJc2V0VG9UaW1lKChPYmplY3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19GUk9NX1RJTUU6Ci0JCQkJc2V0RnJvbVRpbWUoRlJPTV9USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FX19UT19USU1FOgotCQkJCXNldFRvVGltZShUT19USU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVfX0ZST01fVElNRToKLQkJCQlyZXR1cm4gRlJPTV9USU1FX0VERUZBVUxUID09IG51bGwgPyBmcm9tVGltZSAhPSBudWxsIDogIUZST01fVElNRV9FREVGQVVMVC5lcXVhbHMoZnJvbVRpbWUpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRV9fVE9fVElNRToKLQkJCQlyZXR1cm4gVE9fVElNRV9FREVGQVVMVCA9PSBudWxsID8gdG9UaW1lICE9IG51bGwgOiAhVE9fVElNRV9FREVGQVVMVC5lcXVhbHModG9UaW1lKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGZyb21UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmcm9tVGltZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdG9UaW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0b1RpbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvV29ya2luZ1RpbWVzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmYyNGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvaW1wbC9Xb3JraW5nVGltZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JraW5nVGltZXNJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MTo1MyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZXM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JraW5nIFRpbWVzPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LmltcGwuV29ya2luZ1RpbWVzSW1wbCNnZXRXb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya2luZ1RpbWVzSW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgV29ya2luZ1RpbWVzIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nVGltZSgpIDxlbT5Xb3JraW5nIFRpbWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya2luZ1RpbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCB3b3JraW5nVGltZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RpbWVzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtpbmdUaW1lcygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRXb3JraW5nVGltZSgpIHsKLQkJaWYgKHdvcmtpbmdUaW1lID09IG51bGwpIHsKLQkJCXdvcmtpbmdUaW1lID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0KFdvcmtpbmdUaW1lLmNsYXNzLCB0aGlzLCBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRSk7Ci0JCX0KLQkJcmV0dXJuIHdvcmtpbmdUaW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpZ2V0V29ya2luZ1RpbWUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gZ2V0V29ya2luZ1RpbWUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUpKSB7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FU19fV09SS0lOR19USU1FOgotCQkJCWdldFdvcmtpbmdUaW1lKCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JraW5nVGltZSgpLmFkZEFsbCgoQ29sbGVjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZSkpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTX19XT1JLSU5HX1RJTUU6Ci0JCQkJZ2V0V29ya2luZ1RpbWUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlKSkgewotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktJTkdfVElNRVNfX1dPUktJTkdfVElNRToKLQkJCQlyZXR1cm4gd29ya2luZ1RpbWUgIT0gbnVsbCAmJiAhd29ya2luZ1RpbWUuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLX0gLy9Xb3JraW5nVGltZXNJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL21zcHJvamVjdC5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlYmQyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvbXNwcm9qZWN0LmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNTUxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJtc3Byb2plY3QiCi0gICAgbnNVUkk9Imh0dHA6Ly9lcGYuZWNsaXBzZS5vcmcvbXNwcm9qZWN0IiBuc1ByZWZpeD0ibXNwcm9qZWN0Ij4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmdWxsIHByb2plY3Qgc2NoZW1hIGRlZmluaXRpb24gZnJvbSB0aGUgcHJvamVjdCBsZXZlbCBkb3duLCAmI3hEOyYjeEE7JiN4OTsmI3g5O3N0YXJ0aW5nIHdpdGggZGF0YSB0eXBlIGRlZmluaXRpb25zLiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVBbm5vdGF0aW9ucz4KLSAgICA8ZGV0YWlscyBrZXk9ImFwcGluZm8iIHZhbHVlPSJUaGUgTWljcm9zb2Z0IFByb2plY3QgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgZm9yIE1pY3Jvc29mdCBQcm9qZWN0IDEwLiYjeEQ7JiN4QTsmI3g5OyYjeDk7Ii8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFjY3J1ZUF0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjE2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkFsaWFzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudFdvcmtDb21wbGV0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiB3b3JrIGNvbXBsZXRlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBvdmVydGltZSBjb3N0IGluY3VycmVkIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgYW1vdW50IG9mIG92ZXJ0aW1lIHdvcmsgaW5jdXJyZWQgb24gdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHN0YXJ0IGRhdGUgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBhbW91bnQgb2Ygd29yayBpbmN1cnJlZCBvbiB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgYXNzaWdubWVudCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb25maXJtZWQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFJlc291cmNlIGhhcyBhY2NlcHRlZCBhbGwgb2YgaGlzIG9yIGhlciBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25maXJtZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIG9yIHNjaGVkdWxlZCBjb3N0IG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UmF0ZVRhYmxlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29zdFJhdGVUYWJsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCByYXRlIHRhYmxlIHVzZWQgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0VmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjb3N0IGFuZCBiYXNlbGluZSBjb3N0IGZvciBhIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ1YiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxheSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCB0aGF0IHRoZSBhc3NpZ25tZW50IGlzIGRlbGF5ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgZmluaXNoIGRhdGUgZnJvbSB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoVmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua1N1YkFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgYXNzaWdubWVudCB3b3JrIGZyb20gdGhlIGJhc2VsaW5lIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzRml4ZWRSYXRlVW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIFVuaXRzIGFyZSBGaXhlZCBSYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikhhc0ZpeGVkUmF0ZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY29uc3VtcHRpb24gb2YgdGhlIGFzc2lnbmVkIG1hdGVyaWFsIHJlc291cmNlIG9jY3VycyBpbiBhIHNpbmdsZSwgZml4ZWQgYW1vdW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVsYXkgY2F1c2VkIGJ5IGxldmVsaW5nLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbGluZ0RlbGF5Rm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAyMT1udWxsLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua2VkRmllbGRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBQcm9qZWN0IGlzIGxpbmtlZCB0byBhbm90aGVyIE9MRSBvYmplY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGlua2VkRmllbGRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBhc3NpZ25tZW50IGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbGVzdG9uZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5vdGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcmFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgYXNzaWdubWVudCBpcyBvdmVyYWxsb2NhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJhbGxvY2F0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzdW0gb2YgdGhlIGFjdHVhbCBhbmQgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3Qgb2YgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVndWxhcldvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIG5vbi1vdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHByb2plY3RlZCBjb3N0IG9mIGNvbXBsZXRpbmcgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiBjb21wbGV0aW5nIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgb3ZlcnRpbWUgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgd29yayBzY2hlZHVsZWQgdG8gY29tcGxldGUgdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3BvbnNlUGVuZGluZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVHJ1ZSBpZiBhIHJlc3BvbnNlIGhhcyBub3QgYmVlbiByZWNlaXZlZCBmb3IgYSBUZWFtQXNzaWduIG1lc3NhZ2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNlUGVuZGluZyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RvcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIGFzc2lnbm1lbnQgcmVzdW1lZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIGFzc2lnbm1lbnQgc3RhcnQgZGF0ZSBmcm9tIHRoZSBiYXNlbGluZSBzdGFydCBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0VmFyaWFuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0cyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgdW5pdHMgZm9yIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlTmVlZGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUcnVlIGlmIHRoZSByZXNvdXJjZSBhc3NpZ25lZCB0byBhIHRhc2sgbmVlZHMgdG8gYmUgdXBkYXRlZCBhcyB0byB0aGUgc3RhdHVzIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVwZGF0ZU5lZWRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZBQyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYmFzbGluZSBjb3N0IGFuZCB0b3RhbCBjb3N0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZBQyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmsiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHNjaGVkdWxlZCB3b3JrIGZvciB0aGUgYXNzaWdubWVudC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0NvbnRvdXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrQ29udG91clR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgd29yayBjb250b3VyIG9mIHRoZSBhc3NpZ25tZW50LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RmxhdCwgMT1CYWNrIExvYWRlZCwgMj1Gcm9udCBMb2FkZWQsIDM9RG91YmxlIFBlYWssIDQ9RWFybHkgUGVhaywgNT1MYXRlIFBlYWssICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgNj1CZWxsLCA3PVR1cnRsZSwgOD1Db250b3VyZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrQ29udG91ciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9va2luZ1R5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Cb29raW5nVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgYXNzaWdubWVudC4gMT1Db21taXRlZCwgMj1Qcm9wb3NlZCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJvb2tpbmdUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29ya1Byb3RlY3RlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVXb3JrUHJvdGVjdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25EYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgYXNzaWdubWVudCB3YXMgY3JlYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ3JlYXRpb25EYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZW5kZWRBdHRyaWJ1dGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRXh0ZW5kZWRBdHRyaWJ1dGU0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhbHVlIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4gIFR3byBwaWVjZXMgb2YgZGF0YSBhcmUgbmVjZXNzYXJ5IC0gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VsaW5lIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0Jhc2VsaW5lMyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGFzc2lnbm1lbnQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBc3NpZ25tZW50cyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3NpZ25tZW50c18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2lnbm1lbnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQXNzaWdubWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGFzc2lnbm1lbnQgaW4gZWFjaCBBc3NpZ25tZW50cyBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJBdXRob3JUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3JfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJpbGl0eVBlcmlvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVVbml0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIHRoYXQgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZSBkdXJpbmcgdGhlIHNwZWNpZmllZCBwZXJpb2QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZVVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdmFpbGFiaWxpdHlQZXJpb2RzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJpb2QgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSBibG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2sgYmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVwaGFzZWREYXRhIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVtYmVyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIG51bWJlciBvZiB0aGUgYmFzZWxpbmUgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImludGVyaW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoaXMgaXMgYW4gSW50ZXJpbSBCYXNlbGluZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW50ZXJpbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzayBiYXNlbGluZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsIDIwPWUlLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkRHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGJhc2VsaW5lIGR1cmF0aW9uIG9mIHRoZSB0YXNrIHdhcyBlc3RpbWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlZER1cmF0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgd29yayBvZiB0aGUgdGFzayB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHRhc2sgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUyIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIHBlcmZvcm1lZCBvbiB0aGUgdGFzayB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im51bWJlciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOdW1iZXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHdvcmsgYXNzaWduZWQgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIGlzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcm9qZWN0ZWQgY29zdCBmb3IgdGhlIHJlc291cmNlIHdoZW4gdGhlIGJhc2VsaW5lIHdhcyBzYXZlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0IGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQmFzZWxpbmUzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VsaW5lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRpbWVwaGFzZWREYXRhIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1RpbWVwaGFzZWREYXRhVHlwZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aW1lIHBoYXNlZCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFzZWxpbmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGEiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBudW1iZXIgb2YgdGhlIGJhc2VsaW5lIGRhdGEgcmVjb3JkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBhbW91bnQgb2Ygd29yayBzY2hlZHVsZWQgb24gdGhlIGFzc2lnbm1lbnQgd2hlbiB0aGUgYmFzZWxpbmUgd2FzIHNhdmVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0ZWQgY29zdCBvZiB0aGUgYXNzaWdubWVudCB3aGVuIHRoZSBiYXNlbGluZSB3YXMgc2F2ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJDV1MiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYnVkZ2V0ZWQgY29zdCBvZiB3b3JrIG9uIHRoZSBhc3NpZ25tZW50LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIGFzc2lnbm1lbnQgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYXNlbGluZUZvckVhcm5lZFZhbHVlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDggOSAxMCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCb29raW5nVHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJCb29raW5nVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkNhbGN1bGF0aW9uVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxjdWxhdGlvblR5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYWxlbmRhciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGNhbGVuZGFyLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNCYXNlQ2FsZW5kYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIGNhbGVuZGFyIGlzIGEgYmFzZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNCYXNlQ2FsZW5kYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlQ2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYmFzZSBjYWxlbmRhciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB3aGljaCB0aGlzIGNhbGVuZGFyIGRlcGVuZHMuIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgY2FsZW5kYXIgaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgYmFzZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZUNhbGVuZGFyVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2Vla0RheXMiIGVUeXBlPSIjLy9XZWVrRGF5cyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIFdlZWtkYXlzIHRoYXQgZGVmaW5lcyB0aGlzIGNhbGVuZGFyLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhbGVuZGFycyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhcnNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWxlbmRhciIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYWxlbmRhciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNhbGVuZGFycyBhcmUgdXNlZCB0byBkZWZpbmUgc3RhbmRhcmQgd29ya2luZyBhbmQgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgbm9uLXdvcmtpbmcgdGltZXMuIFByb2plY3RzIG11c3QgaGF2ZSBvbmUgYmFzZSBjYWxlbmRhci4gVGFza3MgYW5kIHJlc291cmNlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBtYXkgaGF2ZSB0aGVpciBvd24gbm9uLWJhc2UgY2FsZW5kYXJzIHdoaWNoIGFyZSBiYXNlZCBvbiBhIGJhc2UgY2FsZW5kYXIuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGVuZGFyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ2F0ZWdvcnlUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yeV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb2RlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb21wYW55VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29tcGFueV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb25zdHJhaW50VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCA1IDYgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb250YWN0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGFjdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDb3N0UmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RSYXRlVGFibGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbFBvc2l0aW9uXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJDdXJyZW5jeVN5bWJvbFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF5VHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza0VWTWV0aG9kXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRlZmF1bHRUYXNrVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb2N1bWVudFJvb3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJtaXhlZCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaXhlZCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRXaWxkY2FyZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6bWl4ZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ieE1MTlNQcmVmaXhNYXAiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ieG1sbnM6cHJlZml4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhTSVNjaGVtYUxvY2F0aW9uIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhzaTpzY2hlbWFMb2NhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9qZWN0IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2plY3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJvamVjdCBpcyB0aGUgdG9wIGxldmVsIGVsZW1lbnQgb2YgdGhlIGRvY3VtZW50LiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkR1cmF0aW9uRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGUzIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEdXJhdGlvbkZvcm1hdFR5cGU1IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb25Gb3JtYXRfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2RfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkVtYWlsQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVtYWlsQWRkcmVzc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWxpYXMiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9BbGlhc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWxpYXMgb2YgdGhlIGN1c3RvbSBmaWVsZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljQWxpYXMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QaG9uZXRpY0FsaWFzVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tIGZpZWxkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBob25ldGljQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXBUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUm9sbHVwVHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJIb3cgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZC4gVmFsdWVzIGFyZTogMD1NYXhpbXVtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUiBmb3IgZmxhZyBmaWVsZHMpLCAxPU1pbmltdW0gKEFORCBmb3IgZmxhZyBmaWVsZHMpLCAyPUNvdW50IGFsbCwgMz1TdW0sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9QXZlcmFnZSwgNT1BdmVyYWdlIEZpcnN0IFN1YmxldmVsLCA2PUNvdW50IEZpcnN0IFN1YmxldmVsLCA3PUNvdW50ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbnN1bW1hcmllcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsY3VsYXRpb25UeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ2FsY3VsYXRpb25UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgcm9sbHVwcyBhcmUgY2FsY3VsYXRlZCBmb3IgdGFzayBhbmQgZ3JvdXAgc3VtbWFyeSByb3dzLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAwPU5vbmUsIDE9Um9sbHVwLCAyPUNhbGN1bGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNhbGN1bGF0aW9uVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZvcm11bGEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm11bGEgdGhhdCBNaWNyb3NvZnQgUHJvamVjdCB1c2VzIHRvIHBvcHVsYXRlIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b20gdGFzayBmaWVsZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRm9ybXVsYSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3RyaWN0VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBSZXN0cmljdFZhbHVlcz1UcnVlIHRoZW4gb25seSB2YWx1ZXMgaW4gdGhlIGxpc3QgYXJlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgaW4gdGhlIGZpbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzdHJpY3RWYWx1ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZWxpc3RTb3J0T3JkZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IHZhbHVlIGxpc3RzIGFyZSBzb3J0ZWQuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9RGVzY2VuZGluZywgMT1Bc2NlbmRpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwZW5kTmV3VmFsdWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBBcHBlbmROZXdWYWx1ZXM9VHJ1ZSB0aGVuIGFueSBuZXcgdmFsdWVzIGFkZGVkIGluIGEgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXV0b21hdGljYWxseSBhcHBlbmRlZCB0byB0aGUgbGlzdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwZW5kTmV3VmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIHBvaW50cyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgbGlzdC4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHByZXNlbnQgaWYgbm8gZGVmYXVsdCBpcyBzZXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZUxpc3QiIGVUeXBlPSIjLy9WYWx1ZUxpc3QiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGVuIHZhbHVlcyBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQgYXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCB0aGV5IG1heSBlaXRoZXIgYmUgc3BlY2lmaWVkIGJ5IHZhbHVlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBieSByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgbGlzdC4gIEFwcGxpY2F0aW9ucyBtYXkgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIG9yZGVyaW5nIG9mIHRoZSBsaXN0IGJ5IG9yZGVyaW5nIHNwZWNpZmllZCBoZXJlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeHRlbmRlZEF0dHJpYnV0ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFBJRCBvZiB0aGUgY3VzdG9tIGZpZWxkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaWVsZElEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImR1cmF0aW9uRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRHVyYXRpb25Gb3JtYXRUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGJ1bGsgZHVyYXRpb24uICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyPWV3PywgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgUElEIG9mIHRoZSBjdXN0b20gZmllbGQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIElEIG9mIHRoZSB2YWx1ZSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXQgbG9va3VwIHRhYmxlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXh0ZW5kZWRBdHRyaWJ1dGU0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBjb2xsZWN0aW9uLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpZWxkSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpZWxkIElEIGluIHRoZSBsb2NhbGlzZWQgbGFuZ3VhZ2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBJRCBvZiB0aGUgdmFsdWUgaW4gdGhlIGV4dGVuZGVkIGF0dHJpYnV0IGxvb2t1cCB0YWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBidWxrIGR1cmF0aW9uLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCA0Mz1tbz8sIDQ0PWVtbz8sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE9JT8sIDUyPWUlPyBhbmQgNTM9bnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEdXJhdGlvbkZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4dGVuZGVkQXR0cmlidXRlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVhY2ggb2YgdGhlIGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcyBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uICBUaGVyZSBhcmUgbm8gbGltaXRzIHRvIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBtYXkgYXBwZWFyLCBidXQgcHJvamVjdCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgdW5kZXJzdGFuZCBGbGFnMS1GbGFnMTAsIGV0Yy4gIFRoaXMgbXVzdCBhcHBlYXIgb25jZSBpbiBlYWNoIEV4dGVuZGVkQXR0cmlidXRlcyAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlbmRlZEF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkV4dGVybmFsVGFza1Byb2plY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkZpeGVkQ29zdEFjY3J1YWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGWVN0YXJ0RGF0ZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGWVN0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikdyb3VwVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rQWRkcmVzc1R5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtBZGRyZXNzXy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtBZGRyZXNzVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3NfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ikh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSHlwZXJsaW5rU3ViQWRkcmVzc18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJIeXBlcmxpbmtUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSHlwZXJsaW5rVHlwZTIiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua18uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iSW5pdGlhbHNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFsc18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMYWdGb3JtYXRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFnRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDE5IDIwIDIxIDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDUxIDUyIDUzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsaW5nRGVsYXlGb3JtYXRfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxOSAyMCAyMSAzNSAzNiAzNyAzOCAzOSA0MCA0MSA0MiA0MyA0NCA1MSA1MiA1MyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJNYW5hZ2VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlcl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXNrIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hc2tfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxldmVsIG9mIHRoZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiBtYXNrLiBWYWx1ZXMgYXJlOiAwPU51bWJlcnMsIDE9VXBwZXIgQ2FzZSBMZXR0ZXJzLCAyPUxvd2VyIENhc2UgTGV0dGVycywgMz1DaGFyYWN0ZXJzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIGxlbmd0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBvdXRsaW5lIGNvZGUgdmFsdWVzLiAgSWYgbGVuZ3RoIGlzIGFueSwgdGhlIHZhbHVlIGlzIHplcm8uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIHZhbHVlIG9mIHRoZSBjb2RlIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01hc2siCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm91ciBlbGVtZW50cyBvZiB0aGUgbWFzayBjb25zdGl0dXRlIHRoZSBmb3JtYXQgaW4gd2hpY2ggdGhlIG91dGxpbmUgY29kZSBtdXN0IGFwcGVhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik1hdGVyaWFsTGFiZWxUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXRlcmlhbExhYmVsXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5hbWVUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iTmFtZVR5cGUyIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lXy5fMl8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjc3RyaW5nIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im1heExlbmd0aCIgdmFsdWU9IjUxMiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOYW1lVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWVfLl8zXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iMjU1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik5ld1Rhc2tTdGFydERhdGVUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJOVEFjY291bnRUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOVEFjY291bnRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0bGluZUNvZGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZUNvZGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZElEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvcmVzcG9uZHMgdG8gdGhlIGZpZWxkIG51bWJlciBvZiBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaWVsZE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpZWxkTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsaWFzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWxpYXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaG9uZXRpY0FsaWFzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwaG9uZXRpYyBwcm9udW5jaWF0aW9uIG9mIHRoZSBhbGlhcyBvZiB0aGUgY3VzdG9tIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlcyIgZVR5cGU9IiMvL1ZhbHVlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZXMgb2YgdGhlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG91dGxpbmUgY29kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGN1c3RvbSBvdXRsaW5lIGNvZGUgaXMgYW4gZW50ZXJwcmlzZSBjdXN0b20gb3V0bGluZSBjb2RlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZW50ZXJwcmlzZU91dGxpbmVDb2RlQWxpYXMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFub3RoZXIgY3VzdG9tIGZpZWxkIGZvciB3aGljaCB0aGlzIGlzIGFuIGFsaWFzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbnRlcnByaXNlT3V0bGluZUNvZGVBbGlhcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc291cmNlU3Vic3RpdHV0aW9uRW5hYmxlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgY3VzdG9tIG91dGxpbmUgY29kZSBjYW4gYmUgdXNlZCBieSB0aGUgUmVzb3VyY2UgU3Vic3RpdHV0aW9uIFdpemFyZCBpbiBNaWNyb3NvZnQgUHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVzb3VyY2VTdWJzdGl0dXRpb25FbmFibGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGVhZk9ubHkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IHZhbHVlcyBzcGVjaWZpZWQgaW4gdGhpcyBvdXRsaW5lIGNvZGUgZmllbGQgbXVzdCBiZSBsZWFmIHZhbHVlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGVhZk9ubHkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxMZXZlbHNSZXF1aXJlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTmV3IGNvZGVzIG11c3QgaGF2ZSBhbGwgbGV2ZWxzIHByZXNlbnQuICBOb3QgYXZhaWxhYmxlIGZvciBFbnRlcnByaXNlIENvZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBbGxMZXZlbHNSZXF1aXJlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdmFsdWVzIHNwZWNpZmllZCBtdXN0IGNvbWUgZnJvbSB2YWx1ZXMgdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9ubHlUYWJsZVZhbHVlc0FsbG93ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXNrcyIgZVR5cGU9IiMvL01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uIGluIHRoZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlMyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZV8uXzJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIHZhbHVlIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmllbGRJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmllbGQgSUQgaW4gdGhlIGxvY2FsaXNlZCBsYW5ndWFnZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmllbGRJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgaW4gdGhlIHZhbHVlIGxpc3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZWZpbml0aW9uICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBvdXRsaW5lIGNvZGUgY29sbGVjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGxpbmVDb2RlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpbmRpdmlkdWFsIG91dGxpbmUgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3V0bGluZU51bWJlclR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVOdW1iZXJfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdF8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlRm9ybWF0Xy5fMV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlBob25ldGljQWxpYXNUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQaG9uZXRpY0FsaWFzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUGhvbmV0aWNzVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZWRlY2Vzc29yTGluayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmtfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcmVkZWNlc3NvciB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGluayB0eXBlLiAgVmFsdWVzIGFyZSAwPUZGLCAxPUZTLCAyPVNGIGFuZCAzPVNTJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByZWRlY2Vzc29yIGlzIHBhcnQgb2YgYW5vdGhlciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcm9zc1Byb2plY3ROYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBleHRlcm5hbCBwcmVkZWNlc3NvciBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcm9zc1Byb2plY3ROYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGlua0xhZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBsYWcgaW4gdGVudGhzIG9mIGEgbWludXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMaW5rTGFnIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFnRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTGFnRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmb3JtYXQgZm9yIGV4cHJlc3NpbmcgdGhlIGxhZyBmb3JtYXQuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgNDM9bW8/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYWdGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJQcmVmaXhUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVmaXhfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9qZWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1SUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9VSURUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBJRCBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL05hbWVUeXBlMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGl0bGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UaXRsZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGl0bGUgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpdGxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ViamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N1YmplY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1YmplY3Qgb2YgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YmplY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NhdGVnb3J5VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjYXRlZ29yeSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb21wYW55IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29tcGFueVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29tcGFueSB0aGF0IG93bnMgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbXBhbnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5hZ2VyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTWFuYWdlclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbWFuYWdlciBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWFuYWdlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0F1dGhvclR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYXV0aG9yIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRob3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvbkRhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSBwcm9qZWN0IHdhcyBjcmVhdGVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXZpc2lvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2plY3QgaGFzIGJlZW4gc2F2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldmlzaW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGFzdFNhdmVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcHJvamVjdCB3YXMgbGFzdCBzYXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGFzdFNhdmVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZWR1bGVGcm9tU3RhcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHByb2plY3QgaXMgc2NoZHVsZWQgZnJvbSB0aGUgc3RhcnQgZGF0ZSBvciBmaW5pc2ggZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjaGVkdWxlRnJvbVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHByb2plY3QuIFJlcXVpcmVkIGlmIFNjaGVkdWxlRnJvbVN0YXJ0IGlzIHRydWUuJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSBwcm9qZWN0LiBSZXF1aXJlZCBpZiBTY2hlZHVsZUZyb21TdGFydCBpcyBmYWxzZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmWVN0YXJ0RGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0ZZU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkZpc2NhbCBZZWFyIHN0YXJ0aW5nIG1vbnRoLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1KYW51YXJ5LCAyPUZlYnJ1YXJ5LCAzPU1hcmNoLCA0PUFwcmlsLCA1PU1heSwgNj1KdW5lLCA3PUp1bHksICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTs4PUF1Z3VzdCwgOT1TZXB0ZW1iZXIsIDEwPU9jdG9iZXIsIDExPU5vdmVtYmVyLCAxMj1EZWNlbWJlciAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRllTdGFydERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0aWNhbFNsYWNrTGltaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBudW1iZXIgb2YgZGF5cyBwYXN0IGl0cyBlbmQgZGF0ZSB0aGF0IGEgdGFzayBjYW4gZ28gJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O2JlZm9yZSBNaWNyb3NvZnQgUHJvamVjdCBtYXJrcyB0aGF0IHRhc2sgYXMgYSBjcml0aWNhbCB0YXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbFNsYWNrTGltaXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjdXJyZW5jeURpZ2l0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeURpZ2l0cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ3VycmVuY3lTeW1ib2xUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGN1cnJlbmN5IHN5bWJvbCB1c2VkIGluIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDdXJyZW5jeVN5bWJvbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1cnJlbmN5U3ltYm9sUG9zaXRpb24iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9DdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVuY3kgc3ltYm9sLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9QmVmb3JlLCAxPUFmdGVyLCAyPUJlZm9yZSBXaXRoIFNwYWNlLCAzPUFmdGVyIHdpdGggc3BhY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbmN5U3ltYm9sUG9zaXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYWxlbmRhclVJRCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3QgY2FsZW5kYXIuICBSZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtDYWxlbmRhcnMgZWxlbWVudCBvZiB0aGUgTWljcm9zb2Z0IFByb2plY3QgWE1MIFNjaGVtYS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhcnRUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCB0aW1lIG9mIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YXJ0VGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRGaW5pc2hUaW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1RpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggdGltZSBvZiBuZXcgdGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRGaW5pc2hUaW1lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlc1BlckRheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciBkYXkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1pbnV0ZXNQZXJEYXkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW51dGVzUGVyV2VlayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBtaW51dGVzIHBlciB3ZWVrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaW51dGVzUGVyV2VlayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRheXNQZXJNb250aCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG51bWJlciBvZiBkYXlzIHBlciBtb250aC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGF5c1Blck1vbnRoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVmYXVsdFRhc2tUeXBlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vRGVmYXVsdFRhc2tUeXBlVHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iMSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHR5cGUgb2YgbmV3IHRhc2tzLiBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MD1GaXhlZCBVbml0cywgMT1GaXhlZCBEdXJhdGlvbiwgMj1GaXhlZCBXb3JrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0VGFza1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0RlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGZyb20gd2hlcmUgZml4ZWQgY29zdHMgYXJlIGFjY3J1ZWQuICBWYWx1ZXMgYXJlOiAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7MT1TdGFydCwgMj1Qcm9yYXRlZCwgMz1FbmQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdEZpeGVkQ29zdEFjY3J1YWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0U3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhbmRhcmQgcmF0ZSBmb3IgbmV3IHJlc291cmNlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRPdmVydGltZVJhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBvdmVydGltZSByYXRlIGZvciBuZXcgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWZhdWx0T3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb25Gb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EdXJhdGlvbkZvcm1hdFR5cGU1Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZvcm1hdCBmb3IgZXhwcmVzc2luZyB0aGUgYnVsayBkdXJhdGlvbi4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTszPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAyMD1lJSwgMjE9bnVsbCwgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzM1PW0/LCAzNj1lbT8sIDM3PWg/LCAzOD1laD8sIDM5PWQ/LCA0MD1lZD8sIDQxPXc/LCA0Mj1ldz8sIDQzPW1vPywgNDQ9ZW1vPywgNTE9JT8sIDUyPWUlPyBhbmQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzUzPW51bGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya0Zvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtGb3JtYXRUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgd29yayB1bml0IGZvcm1hdC4gVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWRpdGFibGVBY3R1YWxDb3N0cyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgb3Igbm90IGFjdHVhbCBjb3N0cyBhcmUgZWRpdGFibGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVkaXRhYmxlQWN0dWFsQ29zdHMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob25vckNvbnN0cmFpbnRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRhc2tzIGhvbm91ciB0aGVpciBjb25zdHJhaW50IGRhdGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIb25vckNvbnN0cmFpbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybmVkVmFsdWVNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FYXJuZWRWYWx1ZU1ldGhvZFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgbWV0aG9kIGZvciBjYWxjdWxhdGluZyBlYXJuZWQgdmFsdWUuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVBlcmNlbnQgQ29tcGxldGUsIDE9UGh5c2ljYWwgUGVyY2VudCBDb21wbGV0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJuZWRWYWx1ZU1ldGhvZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydGVkUHJvamVjdHNMaWtlU3VtbWFyeSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBjYWxjdWxhdGUgc3VidGFza3MgYXMgc3VtbWFyeSB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW5zZXJ0ZWRQcm9qZWN0c0xpa2VTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibXVsdGlwbGVDcml0aWNhbFBhdGhzIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBtdWx0aXBsZSBjcml0aWNhbCBwYXRocyBhcmUgY2FsY3VsYXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTXVsdGlwbGVDcml0aWNhbFBhdGhzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmV3VGFza3NFZmZvcnREcml2ZW4iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbmV3IHRhc2tzIGFyZSBlZmZvcnQgZHJpdmVuLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VmZm9ydERyaXZlbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tzRXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHNob3cgdGhlIGVzdGltYXRlZCBkdXJhdGlvbiBieSBkZWZhdWx0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOZXdUYXNrc0VzdGltYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBpbi1wcm9ncmVzcyB0YXNrcyBjYW4gYmUgc3BsaXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwbGl0c0luUHJvZ3Jlc3NUYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNwcmVhZEFjdHVhbENvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgYWN0dWFsIGNvc3RzIGFyZSBzcHJlYWQgdG8gdGhlIHN0YXR1cyBkYXRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTcHJlYWRBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3ByZWFkUGVyY2VudENvbXBsZXRlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBwZXJjZW50IGNvbXBsZXRlIGlzIHNwcmVhZCB0byB0aGUgc3RhdHVzIGRhdGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNwcmVhZFBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhc2tVcGRhdGVzUmVzb3VyY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdXBkYXRlcyB0byB0YXNrcyB1cGRhdGUgcmVzb3VyY2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrVXBkYXRlc1Jlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmlzY2FsWWVhclN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgZmlzY2FsIHllYXIgbnVtYmVyaW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpc2NhbFllYXJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndlZWtTdGFydERheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtTdGFydERheVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdGFydCBkYXkgb2YgdGhlIHdlZWsuIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVN1bmRheSwgMT1Nb25kYXksIDI9VHVlc2RheSwgMz1XZWRuZXNkYXksIDQ9VGh1cnNkYXksIDU9RnJpZGF5LCA2PVNhdHVyZGF5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldlZWtTdGFydERheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVDb21wbGV0ZWRFbmRzQmFjayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBlbmQgb2YgY29tcGxldGVkIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBiZWdpbiBhZnRlciB0aGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c3RhdHVzIGRhdGUgYnV0IGJlZ3VuIGVhcmx5IHNob3VsZCBiZSBtb3ZlZCBiYWNrIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVDb21wbGV0ZWRFbmRzQmFjayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1vdmVSZW1haW5pbmdTdGFydHNCYWNrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZiByZW1haW5pbmcgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGJlZ2luIGFmdGVyIHRoZSAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTtzdGF0dXMgZGF0ZSBidXQgYmVndW4gZWFybHkgc2hvdWxkIGJlIG1vdmVkIGJhY2sgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZVJlbWFpbmluZ1N0YXJ0c0JhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtb3ZlUmVtYWluaW5nU3RhcnRzRm9yd2FyZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5O1NwZWNpZmllcyB3aGV0aGVyIHRoZSBiZWdpbm5pbmcgb2YgcmVtYWluaW5nIHBvcnRpb25zIG9mIHRhc2tzIHNjaGVkdWxlZCB0byBoYXZlIGJlZ3VuIGxhdGUgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7c2hvdWxkIGJlIG1vdmVkIHVwIHRvIHRoZSBzdGF0dXMgZGF0ZS4mI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1vdmVSZW1haW5pbmdTdGFydHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7U3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVuZCBvZiBjb21wbGV0ZWQgcG9ydGlvbnMgb2YgdGFza3Mgc2NoZWR1bGVkIHRvIGhhdmUgYmVlbiBjb21wbGV0ZWQgJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7YmVmb3JlIHRoZSBzdGF0dXMgZGF0ZSBidXQgYmVndW4gbGF0ZSBzaG91bGQgYmUgbW92ZWQgdXAgdG8gdGhlIHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTW92ZUNvbXBsZXRlZEVuZHNGb3J3YXJkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0Jhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNwZWNpZmljIGJhc2VsaW5lIHVzZWQgdG8gY2FsY3VsYXRlIFZhcmlhbmNlIHZhbHVlcy4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPUJhc2VsaW5lLCAxPUJhc2VsaW5lIDEsIDI9QmFzZWxpbmUgMiwgMz1CYXNlbGluZSAzLCA0PUJhc2VsaW5lIDQsIDU9QmFzZWxpbmUgNSwgNj1CYXNlbGluZSA2LCAmI3hEOyYjeEE7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7Nz1CYXNlbGluZSA3LCA4PUJhc2VsaW5lIDgsIDk9QmFzZWxpbmUgOSwgMTA9QmFzZWxpbmUgMTAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9BZGROZXdSZXNvdXJjZXNBbmRUYXNrcyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGFkZCBuZXcgcmVzb3VyY2VzIHRvIHRoZSByZXNvdXJjZSBwb29sLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvQWRkTmV3UmVzb3VyY2VzQW5kVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGF0dXNEYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0ZSB1c2VkIGZvciBjYWxjdWxhdGlvbiBhbmQgcmVwb3J0aW5nLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGF0dXNEYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3VycmVudERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3lzdGVtIGRhdGUgdGhhdCB0aGUgWE1MIHdhcyBnZW5lcmF0ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1cnJlbnREYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCB3YXMgY3JlYXRlZCBieSBhIFByb2plY3QgU2VydmVyIHVzZXIgYXMgb3Bwb3NlZCB0byBhbiBOVCB1c2VyLiYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWljcm9zb2Z0UHJvamVjdFNlcnZlclVSTCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dG9saW5rIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIGF1dG9saW5rIGluc2VydGVkIG9yIG1vdmVkIHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBdXRvbGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5ld1Rhc2tTdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9OZXdUYXNrU3RhcnREYXRlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGRhdGUgZm9yIG5ldyB0YXNrcyBzdGFydC4gIFZhbHVlcyBhcmU6ICYjeEQ7JiN4QTsmI3g5OyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTswPVByb2plY3QgU3RhcnQgRGF0ZSwgMT1DdXJyZW50IERhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmV3VGFza1N0YXJ0RGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlZmF1bHRUYXNrRVZNZXRob2QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EZWZhdWx0VGFza0VWTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IGVhcm5lZCB2YWx1ZSBtZXRob2QgZm9yIHRhc2tzLiAgVmFsdWVzIGFyZTogJiN4RDsmI3hBOyYjeDk7JiN4OTsmI3g5OyYjeDk7JiN4OTsmI3g5OzA9UGVyY2VudCBDb21wbGV0ZSwgMT1QaHlzaWNhbCBQZXJjZW50IENvbXBsZXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlZmF1bHRUYXNrRVZNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0RXh0ZXJuYWxseUVkaXRlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcHJvamVjdCBYTUwgd2FzIGVkaXRlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvamVjdEV4dGVybmFsbHlFZGl0ZWQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlbmRlZENyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGUgdXNlZCBmb3IgY2FsY3VsYXRpb24gYW5kIHJlcG9ydGluZy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxzSW5TeW5jIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIGFsbCBhY3R1YWwgd29yayBoYXMgYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsc0luU3luYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbW92ZUZpbGVQcm9wZXJ0aWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRvIHJlbW92ZSBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHNhdmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbW92ZUZpbGVQcm9wZXJ0aWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRtaW5Qcm9qZWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSBwcm9qZWN0IGlzIGFuIGFkbWluaXN0cmF0aXZlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkbWluUHJvamVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGxpbmVDb2RlcyIgZVR5cGU9IiMvL091dGxpbmVDb2RlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIG91dGxpbmUgY29kZSBkZWZpbml0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuICBUaGVzZSBjb2RlcyBtYXkgYmUgYXNzb2NpYXRlZCBvbmx5IHdpdGggdGhpcyBwcm9qZWN0LCBvciBtYXkgYmUgY29tbW9uIGFtb25nIHNldmVyYWwgcHJvamVjdHMgKGVudGVycHJpc2UgY29kZXMpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRsaW5lQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3QlNNYXNrcyIgZVR5cGU9IiMvL1dCU01hc2tzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRhYmxlIG9mIGVudHJpZXMgdGhhdCBkZWZpbmUgdGhlIG91dGxpbmUgY29kZSBtYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlcyIgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGV4dGVuZGVkIGF0dHJpYnV0ZSAoY3VzdG9tIGZpZWxkKSBkZWZpbml0aW9ucyAmI3hEOyYjeEE7ICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhbGVuZGFycyIgZVR5cGU9IiMvL0NhbGVuZGFycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGNhbGVuZGFycyB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJiN4RDsmI3hBOyAgICAgICAgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FsZW5kYXJzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIGVUeXBlPSIjLy9UYXNrcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIHRhc2tzIHRoYXQgbWFrZSB1cCB0aGUgcHJvamVjdC4mI3hEOyYjeEE7ICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFza3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZXMiIGVUeXBlPSIjLy9SZXNvdXJjZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NpZ25tZW50cyIgZVR5cGU9IiMvL0Fzc2lnbm1lbnRzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGNvbGxlY3Rpb24gb2YgYXNzaWdubWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFzc2lnbm1lbnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgdGhhdCB0aGUgcmF0ZSBiZWNvbWVzIGVmZmVjdGl2ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXNGcm9tIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmF0ZXNUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhhdCB0aGUgcmF0ZSBpcyBlZmZlY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYXRlVGFibGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9SYXRlVGFibGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByYXRlIHRhYmxlIGZvciB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QSwgMT1CLCAyPUMsIDM9RCwgND1FIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YW5kYXJkIHJhdGUgZm9yIHRoZSByZXNvdXJjZSBmb3IgdGhlIHBlcmlvZCBzcGVjaWZpZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pdHMgdXNlZCBieSBNaWNyb3NvZnQgUHJvamVjdCB0byBkaXNwbGF5IHRoZSBzdGFuZGFyZCByYXRlLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT1tLCAyPWgsIDM9ZCwgND13LCA1PW1vLCA3PXkmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhbmRhcmRSYXRlRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBmb3IgdGhlIHJlc291cmNlIGZvciB0aGUgcGVyaW9kIHNwZWNpZmllZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlRm9ybWF0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0cyB1c2VkIGJ5IE1pY3Jvc29mdCBQcm9qZWN0IHRvIGRpc3BsYXkgdGhlIG92ZXJ0aW1lIHJhdGUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPW0sIDI9aCwgMz1kLCA0PXcsIDU9bW8sIDc9eSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVydGltZVJhdGVGb3JtYXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3N0UGVyVXNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29zdCBwZXIgdXNlIG9mIHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBhcyBvZiB0aGUgY3VycmVudCBkYXRlIGlmIGEgcmF0ZSB0YWJsZSBleGlzdHMgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdFBlclVzZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJhdGVzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmF0ZSIgdXBwZXJCb3VuZD0iMjUiIGVUeXBlPSIjLy9SYXRlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgYSB0aW1lIHBlcmlvZCwgYW5kIHRoZSByYXRlcyBhcHBsaWNhYmxlIGZvciAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgZHVyaW5nIHRoYXQgcGVyaW9kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUmF0ZVRhYmxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJhdGVUYWJsZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjAgMSAyIDMgNCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXNvdXJjZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVJRCIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwb3NpdGlvbiBpZGVudGlmaWVyIG9mIHRoZSByZXNvdXJjZSB3aXRoaW4gdGhlIGxpc3Qgb2YgcmVzb3VyY2VzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5hbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGU0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgcmVzb3VyY2UuIFZhbHVlcyBhcmU6IDA9TWF0ZXJpYWwsIDE9V29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNOdWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5pdGlhbHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Jbml0aWFsc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5pdGlhbHMgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbml0aWFscyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBob25ldGljcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1Bob25ldGljc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGhvbmV0aWMgc3BlbGxpbmcgb2YgdGhlIHJlc291cmNlIG5hbWUuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggSmFwYW5lc2Ugb25seS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhvbmV0aWNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iblRBY2NvdW50IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vTlRBY2NvdW50VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBOVCBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik5UQWNjb3VudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hdGVyaWFsTGFiZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9NYXRlcmlhbExhYmVsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bml0IG9mIG1lYXN1cmUgZm9yIHRoZSBtYXRlcmlhbCByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWF0ZXJpYWxMYWJlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvZGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9Db2RlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2RlIG9yIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29kZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vR3JvdXBUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGdyb3VwIHRvIHdoaWNoIHRoZSByZXNvdXJjZSBiZWxvbmdzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHcm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtHcm91cCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtHcm91cFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdHlwZSBvZiB3b3JrZ3JvdXAgdG8gd2hpY2ggdGhlIHJlc291cmNlIGJlbG9uZ3MuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9RGVmYXVsdCwgMT1Ob25lLCAyPUVtYWlsLCAzPVdlYiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbWFpbEFkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9FbWFpbEFkZHJlc3NUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFbWFpbEFkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtUeXBlMSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0aXRsZSBvZiB0aGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGluayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGlua0FkZHJlc3MiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9IeXBlcmxpbmtBZGRyZXNzVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaHlwZXJsaW5rIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZG9jdW1lbnQgYm9va21hcmsgb2YgdGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWF4VW5pdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IjEuMCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtYXhpbXVtIG51bWJlciBvZiB1bml0cyB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1heFVuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVha1VuaXRzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhcmdlc3QgbnVtYmVyIG9mIHVuaXRzIGFzc2lnbmVkIHRvIHRoZSByZXNvdXJjZSBhdCBhbnkgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVha1VuaXRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgcmVzb3VyY2UgaXMgb3ZlcmFsbG9jYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlckFsbG9jYXRlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF2YWlsYWJsZUZyb20iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZmlyc3QgZGF0ZSB0aGF0IHRoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF2YWlsYWJsZUZyb20iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdmFpbGFibGVUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXN0IGRhdGUgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmxlVG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBzY2hlZHVsZWQgc3RhcnQgZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbkxldmVsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSByZXNvdXJjZSBjYW4gYmUgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FuTGV2ZWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2NydWVBdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FjY3J1ZUF0Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSG93IGNvc3QgaXMgYWNjcnVlZCBhZ2FpbnN0IHRoZSByZXNvdXJjZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMT1TdGFydCwgMj1FbmQsIDM9UHJvcmF0ZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWNjcnVlQXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgYXNzaWduZWQgdG8gdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWd1bGFyV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygb3ZlcnRpbWUgd29yayBhc3NpZ25lZCB0byB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiByZW1haW5pbmcgd29yayByZXF1aXJlZCB0byBjb21wbGV0ZSBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ1dvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIGFjdHVhbCBvdmVydGltZSB3b3JrIHBlcmZvcm1lZCBieSB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lV29yayIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgcmVtYWluaW5nIG92ZXJ0aW1lIHdvcmsgcmVxdWlyZWQgdG8gY29tcGxldGUgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJjZW50V29ya0NvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB3b3JrIGNvbXBsZXRlZCBhY3Jvc3MgYWxsIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhbmRhcmRSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhbmRhcmQgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YW5kYXJkUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgc3RhbmRhcmQgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15LCA4PW1hdGVyaWFsIHJlc291cmNlIHJhdGUgKG9yIGJsYW5rIHN5bWJvbCBzcGVjaWZpZWQpJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3QiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0b3RhbCBwcm9qZWN0IGNvc3QgZm9yIHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVSYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgb3ZlcnRpbWUgcmF0ZSBvZiB0aGUgcmVzb3VyY2UuICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgYXMgb2YgdGhlIGN1cnJlbnQgZGF0ZSBpZiBhIHJhdGUgdGFibGUgZXhpc3RzIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lUmF0ZUZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL092ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHVuaXRzIHVzZWQgYnkgTWljcm9zb2Z0IFByb2plY3QgdG8gZGlzcGxheSB0aGUgb3ZlcnRpbWUgcmF0ZS4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE9bSwgMj1oLCAzPWQsIDQ9dywgNT1tbywgNz15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lUmF0ZUZvcm1hdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvdGFsIG92ZXJ0aW1lIGNvc3QgZm9yIHRoZSByZXNvdXJjZSBpbmNsdWRpbmcgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdHMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvc3RQZXJVc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb3N0IHBlciB1c2Ugb2YgdGhlIHJlc291cmNlLiBUaGlzIHZhbHVlIGlzIGFzIG9mIHRoZSBjdXJyZW50IGRhdGUgaWYgYSByYXRlIHRhYmxlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyBmb3IgdGhlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb3N0UGVyVXNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBjb3N0IGluY3VycmVkIGJ5IHRoZSByZXNvdXJjZSBhY3Jvc3MgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsT3ZlcnRpbWVDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIGNvc3QgaW5jdXJyZWQgYnkgdGhlIHJlc291cmNlIGFjcm9zcyBhbGwgYXNzaWduZWQgdGFza3MuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgdGhlIHJlc291cmNlIHRvIGNvbXBsZXRlIGFsbCBhc3NpZ25lZCB0YXNrcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ092ZXJ0aW1lQ29zdCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBwcm9qZWN0ZWQgb3ZlcnRpbWUgY29zdCBvZiB0aGUgcmVzb3VyY2UgdG8gY29tcGxldGUgYWxsIGFzc2lnbmVkIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdPdmVydGltZUNvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrVmFyaWFuY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBiYXNlbGluZSB3b3JrIGFuZCB0aGUgd29yayBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1ZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYmFzZWxpbmUgY29zdCBhbmQgdGhlIGNvc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvc3RWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIHNjaGVkdWxlIHZhcmlhbmNlLCB0aHJvdWdoIHRoZSBwcm9qZWN0IHN0YXR1cyBkYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTViIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UsIHRocm91Z2ggdGhlIHByb2plY3Qgc3RhdHVzIGRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYUNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgY29zdCBvZiB0aGUgd29yayBwZXJmb3JtZWQgYnkgdGhlIHJlc291cmNlIGZvciB0aGUgcHJvamVjdCB0by1kYXRlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBQ1dQIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FsZW5kYXJVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZXNvdXJjZSBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTm90ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldCBjb3N0IG9mIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgcmVzb3VyY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dQIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygb2YgdGhlIHdvcmsgcGVyZm9ybWVkIGJ5IHRoZSByZXNvdXJjZSBmb3IgdGhlIHByb2plY3QgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQkNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzR2VuZXJpYyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGdlbmVyaWMuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzR2VuZXJpYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzSW5hY3RpdmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzZXQgdG8gaW5hY3RpdmUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzSW5hY3RpdmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0VudGVycHJpc2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBhbiBFbnRlcnByaXNlIHJlc291cmNlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0VudGVycHJpc2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJib29raW5nVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Jvb2tpbmdUeXBlVHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTcGVjaWZpZXMgdGhlIGJvb2tpbmcgdHlwZSBvZiB0aGUgcmVzb3VyY2UuIDE9Q29tbWl0ZWQsIDI9UHJvcG9zZWQmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQm9va2luZ1R5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2ZURpcmVjdG9yeUdVSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9BY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBBY3RpdmUgRGlyZWN0b3J5IEdVSUQgZm9yIHRoZSByZXNvdXJjZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZlRGlyZWN0b3J5R1VJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHJlc291cmNlIHdhcyBjcmVhdGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcmVhdGlvbkRhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlbmRlZEF0dHJpYnV0ZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9FeHRlbmRlZEF0dHJpYnV0ZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gZXh0ZW5kZWQgYXR0cmlidXRlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVuZGVkQXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQmFzZWxpbmUyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJhc2VsaW5lIHZhbHVlcyBmb3IgdGhlIHJlc291cmNlcy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSBhIHBvaW50ZXIgYmFjayB0byAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXZhaWxhYmlsaXR5UGVyaW9kcyIgZVR5cGU9IiMvL0F2YWlsYWJpbGl0eVBlcmlvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBkdXJpbmcgd2hpY2ggdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXZhaWxhYmlsaXR5UGVyaW9kcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJhdGVzIiBlVHlwZT0iIy8vUmF0ZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGNvbGxlY3Rpb24gb2YgcGVyaW9kcyBhbmQgdGhlIHJhdGVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9uZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmF0ZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lcGhhc2VkRGF0YSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9UaW1lcGhhc2VkRGF0YVR5cGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSBwaGFzZWQgZGF0YSYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlc291cmNlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNvdXJjZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNvdXJjZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9SZXNvdXJjZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIHJlc291cmNlIGluIGVhY2ggUmVzb3VyY2VzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc291cmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iUm9sbHVwVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXBUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFuZGFyZFJhdGVGb3JtYXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YW5kYXJkUmF0ZUZvcm1hdF8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIxIDIgMyA0IDUgNyA4Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YmplY3RUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJqZWN0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNzdHJpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ibWF4TGVuZ3RoIiB2YWx1ZT0iNTEyIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN1YnByb2plY3ROYW1lVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3VicHJvamVjdE5hbWVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIElEIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpRCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBvc2l0aW9uIGlkZW50aWZpZXIgb2YgdGhlIHRhc2sgd2l0aGluIHRoZSBsaXN0IG9mIHRhc2tzLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9OYW1lVHlwZTIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbmFtZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9UeXBlVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9Rml4ZWQgVW5pdHMsIDE9Rml4ZWQgRHVyYXRpb24sIDI9Rml4ZWQgV29yay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzTnVsbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRhc2sgaXMgbnVsbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXNOdWxsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIGNyZWF0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNyZWF0ZURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb250YWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vQ29udGFjdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29udGFjdCBwZXJzb24gZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB3b3JrIGJyZWFrZG93biBzdHJ1Y3R1cmUgY29kZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id0JTTGV2ZWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJpZ2h0bW9zdCBXQlMgbGV2ZWwgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVOdW1iZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lTnVtYmVyVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBvdXRsaW5lIG51bWJlciBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0bGluZU51bWJlciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im91dGxpbmVMZXZlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVMZXZlbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByaW9yaXR5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcHJpb3JpdHkgb2YgdGhlIHRhc2sgZnJvbSAwIHRvIDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByaW9yaXR5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2NoZWR1bGVkIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNjaGVkdWxlZCBmaW5pc2ggZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZHVyYXRpb24iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGxhbm5lZCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkdXJhdGlvbkZvcm1hdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0R1cmF0aW9uRm9ybWF0VHlwZTQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBEdXJhdGlvbiBvZiB0aGUgVGFzay4gICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDM9bSwgND1lbSwgNT1oLCA2PWVoLCA3PWQsIDg9ZWQsIDk9dywgMTA9ZXcsIDExPW1vLCAxMj1lbW8sIDE5PSUsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwPWUlLCAyMT1udWxsLCAzNT1tPywgMzY9ZW0/LCAzNz1oPywgMzg9ZWg/LCAzOT1kPywgNDA9ZWQ/LCA0MT13PywgNDI9ZXc/LCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mz1tbz8sIDQ0PWVtbz8sIDUxPSU/LCA1Mj1lJT8gYW5kIDUzPW51bGwuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkR1cmF0aW9uRm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29yayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygc2NoZWR1bGVkIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RvcCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoYXQgdGhlIHRhc2sgd2FzIHN0b3BwZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN0b3AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGF0IHRoZSB0YXNrIHJlc3VtZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3VtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VtZVZhbGlkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGNhbiBiZSByZXN1bWVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXN1bWVWYWxpZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVmZm9ydERyaXZlbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBlZmZvcnQtZHJpdmVuLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFZmZvcnREcml2ZW4iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWN1cnJpbmciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgYSByZWN1cnJpbmcgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVjdXJyaW5nIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlckFsbG9jYXRlZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBvdmVyYWxsb2NhdGVkLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgaW5mb3JtYXRpb25hbCBvbmx5LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdmVyQWxsb2NhdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGVzdGltYXRlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGVkIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWlsZXN0b25lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgbWlsZXN0b25lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNaWxlc3RvbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdW1tYXJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGV0aGVyIHRoZSB0YXNrIGlzIGEgc3VtbWFyeSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdW1tYXJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JpdGljYWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgaW4gdGhlIGNyaXRpY2FsIGNoYWluLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDcml0aWNhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3VicHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBhbiBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc1N1YnByb2plY3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N1YnByb2plY3RSZWFkT25seSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgaW5zZXJ0ZWQgcHJvamVjdCBpcyByZWFkLW9ubHkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklzU3VicHJvamVjdFJlYWRPbmx5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VicHJvamVjdE5hbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdWJwcm9qZWN0TmFtZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBpbnNlcnRlZCBwcm9qZWN0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJwcm9qZWN0TmFtZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsVGFzayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpcyBleHRlcm5hbC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxUYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxUYXNrUHJvamVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVybmFsVGFza1Byb2plY3RUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHNvdXJjZSBsb2NhdGlvbiBhbmQgdGFzayBpZGVudGlmaWVyIG9mIHRoZSBleHRlcm5hbCB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbFRhc2tQcm9qZWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlTdGFydCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBlYXJseSBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFYXJseVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZWFybHlGaW5pc2giIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZWFybHkgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVhcmx5RmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZVN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGxhdGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGF0ZVN0YXJ0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGF0ZUZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBsYXRlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMYXRlRmluaXNoIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRWYXJpYW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrIHN0YXJ0IGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgc3RhcnQgZGF0ZSBhcyBtaW51dGVzIHggMTAwMC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RhcnRWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaFZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFyaWFuY2Ugb2YgdGhlIHRhc2sgZmluaXNoIGRhdGUgZnJvbSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFzZWxpbmUgZmluaXNoIGRhdGUgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpbmlzaFZhcmlhbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1ZhcmlhbmNlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHZhcmlhbmNlIG9mIHRhc2sgd29yayBmcm9tIHRoZSBiYXNlbGluZSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrIHdvcmsgYXMgbWludXRlcyB4IDEwMDAuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtWYXJpYW5jZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZyZWVTbGFjayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBmcmVlIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcmVlU2xhY2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b3RhbFNsYWNrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYW1vdW50IG9mIHRvdGFsIHNsYWNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb3RhbFNsYWNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZml4ZWRDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpeGVkIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkZpeGVkQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpeGVkQ29zdEFjY3J1YWwiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9GaXhlZENvc3RBY2NydWFsVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkhvdyB0aGUgZml4ZWQgY29zdCBpcyBhY2NydWVkIGFnYWluc3QgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDE9U3RhcnQsIDI9UHJvcmF0ZWQgYW5kIDM9RW5kLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaXhlZENvc3RBY2NydWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyY2VudENvbXBsZXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcGVyY2VudGFnZSBvZiB0aGUgdGFzayBkdXJhdGlvbiBjb21wbGV0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBlcmNlbnRDb21wbGV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBlcmNlbnRXb3JrQ29tcGxldGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwZXJjZW50YWdlIG9mIHRoZSB0YXNrIHdvcmsgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJjZW50V29ya0NvbXBsZXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29zdCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHByb2plY3RlZCBvciBzY2hlZHVsZWQgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im92ZXJ0aW1lQ29zdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EZWNpbWFsIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN1bSBvZiB0aGUgYWN0dWFsIGFuZCByZW1haW5pbmcgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3ZlcnRpbWVXb3JrIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFtb3VudCBvZiBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik92ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBzdGFydCBkYXRlIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbEZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbER1cmF0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsRHVyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxDb3N0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2YgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbENvc3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZUNvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgb3ZlcnRpbWUgY29zdCBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0dWFsV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhY3R1YWwgd29yayBmb3IgdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbFdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxPdmVydGltZVdvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIG92ZXJ0aW1lIHdvcmsgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3R1YWxPdmVydGltZVdvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWd1bGFyV29yayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2Ygbm9uLW92ZXJ0aW1lIHdvcmsgc2NoZWR1bGVkIGZvciB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVndWxhcldvcmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZW1haW5pbmdEdXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBhbW91bnQgb2YgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSB0aGUgdW5maW5pc2hlZCBwb3J0aW9uIG9mIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdEdXJhdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ0Nvc3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGVjaW1hbCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSByZW1haW5pbmcgcHJvamVjdGVkIGNvc3Qgb2YgY29tcGxldGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nQ29zdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlbWFpbmluZ1dvcmsiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRHVyYXRpb24iPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIHdvcmsgc2NoZWR1bGVkIHRvIGNvbXBsZXRlIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZW1haW5pbmdXb3JrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVDb3N0IgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RlY2ltYWwiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgcmVtYWluaW5nIG92ZXJ0aW1lIGNvc3QgcHJvamVjdGVkIHRvIGZpbmlzaCB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVtYWluaW5nT3ZlcnRpbWVDb3N0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVtYWluaW5nT3ZlcnRpbWVXb3JrIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJlbWFpbmluZyBvdmVydGltZSB3b3JrIHNjaGVkdWxlZCB0byBmaW5pc2ggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlbWFpbmluZ092ZXJ0aW1lV29yayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFDV1AiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRmxvYXQiCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIGNvc3Qgb2Ygd29yayBwZXJmb3JtZWQgb24gdGhlIHRhc2sgdG8tZGF0ZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQUNXUCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNWIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWFybmVkIHZhbHVlIGNvc3QgdmFyaWFuY2UuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNWIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29uc3RyYWludFR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50VHlwZVR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29uc3RyYWludCBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIGRhdGUgb2YgdGhlIHRhc2suICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9QXMgU29vbiBBcyBQb3NzaWJsZSwgMT1BcyBMYXRlIEFzIFBvc3NpYmxlLCAyPU11c3QgU3RhcnQgT24sIDM9TXVzdCBGaW5pc2ggT24sICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ9U3RhcnQgTm8gRWFybGllciBUaGFuLCA1PVN0YXJ0IE5vIExhdGVyIFRoYW4sIDY9RmluaXNoIE5vIEVhcmxpZXIgVGhhbiBhbmQgNz1GaW5pc2ggTm8gTGF0ZXIgVGhhbiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25zdHJhaW50VHlwZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhbGVuZGFyVUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGFzayBjYWxlbmRhci5SZWZlcnMgdG8gYSB2YWxpZCBVSUQgaW4gdGhlIENhbGVuZGFycyBlbGVtZW50IG9mICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBYTUwgU2NoZW1hLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYWxlbmRhclVJRCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnN0cmFpbnREYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRhdGUgYXJndW1lbnQgZm9yIHRoZSB0YXNrIGNvbnN0cmFpbnQgdHlwZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29uc3RyYWludERhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWFkbGluZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWFkbGluZSBmb3IgdGhlIHRhc2sgdG8gYmUgY29tcGxldGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWFkbGluZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsQXNzaWdubWVudHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIGFkanVzdCBhc3NpZ25tZW50cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxBc3NpZ25tZW50cyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nQ2FuU3BsaXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgbGV2ZWxpbmcgY2FuIHNwbGl0IHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0NhblNwbGl0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibGV2ZWxpbmdEZWxheSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlbGF5IGNhdXNlZCBieSBsZXZlbGluZyB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTGV2ZWxpbmdEZWxheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsaW5nRGVsYXlGb3JtYXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9MZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZm9ybWF0IGZvciBleHByZXNzaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgZGVsYXkuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgYXJlOiAzPW0sIDQ9ZW0sIDU9aCwgNj1laCwgNz1kLCA4PWVkLCA5PXcsIDEwPWV3LCAxMT1tbywgMTI9ZW1vLCAxOT0lLCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMD1lJSwgMjE9bnVsbCwgMzU9bT8sIDM2PWVtPywgMzc9aD8sIDM4PWVoPywgMzk9ZD8sIDQwPWVkPywgNDE9dz8sIDQyPWV3PywgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM9bW8/LCA0ND1lbW8/LCA1MT0lPywgNTI9ZSU/IGFuZCA1Mz1udWxsLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJMZXZlbGluZ0RlbGF5Rm9ybWF0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlTGV2ZWxlZFN0YXJ0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHRhc2sgYmVmb3JlIGl0IHdhcyBsZXZlbGVkLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVMZXZlbGVkU3RhcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVMZXZlbGVkRmluaXNoIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGZpbmlzaCBkYXRlIG9mIHRoZSB0YXNrIGJlZm9yZSBpdCB3YXMgbGV2ZWxlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlTGV2ZWxlZEZpbmlzaCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imh5cGVybGluayIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0h5cGVybGlua1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpdGxlIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGh5cGVybGluayBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikh5cGVybGlua0FkZHJlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoeXBlcmxpbmtTdWJBZGRyZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRvY3VtZW50IGJvb2ttYXJrIG9mIHRoZSBoeXBlcmxpbmsgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJIeXBlcmxpbmtTdWJBZGRyZXNzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWdub3JlUmVzb3VyY2VDYWxlbmRhciIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgdGFzayBpZ25vcmVzIHRoZSByZXNvdXJjZSBjYWxlbmRhci4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSWdub3JlUmVzb3VyY2VDYWxlbmRhciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGVzIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRleHQgbm90ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RlcyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImhpZGVCYXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIEdBTlRUIGJhciBvZiB0aGUgdGFzayBpcyBoaWRkZW4gd2hlbiBkaXNwbGF5ZWQgaW4gTWljcm9zb2Z0IFByb2plY3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkhpZGVCYXIiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2xsdXAiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgdGhlIHRhc2sgaXMgcm9sbGVkIHVwLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xsdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiQ1dTIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Zsb2F0IgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGJ1ZGdldGVkIGNvc3Qgb2Ygd29yayBzY2hlZHVsZWQgZm9yIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCQ1dTIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYkNXUCIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9GbG9hdCIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBidWRnZXRlZCBjb3N0IG9mIHdvcmsgcGVyZm9ybWVkIG9uIHRoZSB0YXNrIHRvLWRhdGUuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJDV1AiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwaHlzaWNhbFBlcmNlbnRDb21wbGV0ZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHBlcmNlbnRhZ2UgY29tcGxldGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgUHJvamVjdCBNYW5hZ2VyLiAgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSBmb3IgY2FsY3VsYXRpbmcgQkNXUC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGh5c2ljYWxQZXJjZW50Q29tcGxldGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlYXJuZWRWYWx1ZU1ldGhvZCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0Vhcm5lZFZhbHVlTWV0aG9kVHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBtZXRob2QgZm9yIGNhbGN1bGF0aW5nIGVhcm5lZCB2YWx1ZS4gJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1QZXJjZW50IENvbXBsZXRlLCAxPVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRWFybmVkVmFsdWVNZXRob2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvckxpbmsiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vUHJlZGVjZXNzb3JMaW5rIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgcHJlZGVjZXNzb3IgdGFzayBvZiB0aGUgdGFzayB0aGF0IGNvbnRhaW5zIGl0LiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVkZWNlc3NvckxpbmsiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3R1YWxXb3JrUHJvdGVjdGVkIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0R1cmF0aW9uIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3BlY2lmaWVzIHRoZSBkdXJhdGlvbiB0aHJvdWdoIHdoaWNoIGFjdHVhbCB3b3JrIGlzIHByb3RlY3RlZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0dWFsV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EdXJhdGlvbiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlNwZWNpZmllcyB0aGUgZHVyYXRpb24gdGhyb3VnaCB3aGljaCBhY3R1YWwgb3ZlcnRpbWUgd29yayBpcyBwcm90ZWN0ZWQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdHVhbE92ZXJ0aW1lV29ya1Byb3RlY3RlZCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4dGVuZGVkQXR0cmlidXRlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0V4dGVuZGVkQXR0cmlidXRlMiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuICBUd28gcGllY2VzIG9mIGRhdGEgYXJlIG5lY2Vzc2FyeSAtICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciBiYWNrIHRvIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgdGFibGUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgdW5pcXVlIElEIG9yICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBGaWVsZCBJRCwgYW5kIHRoZSB2YWx1ZSB3aGljaCBpcyBzcGVjaWZpZWQgZWl0aGVyIHdpdGggdGhlIHZhbHVlLCBvciBhIHBvaW50ZXIgYmFjayB0byB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZW5kZWRBdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlbGluZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CYXNlbGluZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBjb2xsZWN0aW9uIG9mIGJhc2VsaW5lIHZhbHVlcyBvZiB0aGUgdGFzay4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRsaW5lQ29kZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9PdXRsaW5lQ29kZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgYW4gb3V0bGluZSBjb2RlLiAgVHdvIHBpZWNlcyBvZiBkYXRhIGFyZSBuZWNlc3NhcnkgLSAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgYmFjayB0byB0aGUgb3V0bGluZSBjb2RlIHRhYmxlIHdoaWNoIGlzIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlIHVuaXF1ZSBJRCBvciB0aGUgRmllbGQgSUQsICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgd2hpY2ggaXMgc3BlY2lmaWVkIGVpdGhlciB3aXRoIHRoZSB2YWx1ZSwgb3IgYSBwb2ludGVyIGJhY2sgdG8gdGhlIHZhbHVlIGxpc3QuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGxpbmVDb2RlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGltZXBoYXNlZERhdGEiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVGltZXBoYXNlZERhdGFUeXBlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YXNrLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUaW1lcGhhc2VkRGF0YSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2tzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2tzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFzayIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgdGFzayBpbiBlYWNoIFRhc2tzIGNvbGxlY3Rpb24uJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUaW1lUGVyaW9kIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmcm9tRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiB0aW1lLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnJvbURhdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b0RhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZW5kIG9mIHRoZSBleGNlcHRpb24gdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvRGF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRpbWVwaGFzZWREYXRhVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmluaXRpb24gb2YgdGhlIHRpbWUgcGhhc2VkIGRhdGEgYmxvY2suJiN4RDsmI3hBOyYjeDk7JiN4OTsgICAgICAgICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGltZXBoYXNlZERhdGFUeXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVHlwZVR5cGUzIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iJiN4RDsmI3hBOyAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0YXNrIHRpbWVwaGFzZWQgZGF0YS4gVmFsdWVzIGFyZTomI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxPUFzc2lnbm1lbnQgUmVtYWluaW5nIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyPUFzc2lnbm1lbnQgQWN0dWFsIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzPUFzc2lnbm1lbnQgQWN0dWFsIE92ZXJ0aW1lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0PUFzc2lnbm1lbnQgQmFzZWxpbmUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU9QXNzaWdubWVudCBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNj1Bc3NpZ25tZW50IEFjdHVhbCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNz1SZXNvdXJjZSBCYXNlbGluZSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOD1SZXNvdXJjZSBCYXNlbGluZSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgOT1UYXNrIEJhc2VsaW5lIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMD1UYXNrIEJhc2VsaW5lIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxMT1UYXNrIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxNj1Bc3NpZ25tZW50IEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDE3PUFzc2lnbm1lbnQgQmFzZWxpbmUgMSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMTg9VGFzayBCYXNlbGluZSAxIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAxOT1UYXNrIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIwPVJlc291cmNlIEJhc2VsaW5lIDEgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIxPVJlc291cmNlIEJhc2VsaW5lIDEgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDIyPUFzc2lnbm1lbnQgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjM9QXNzaWdubWVudCBCYXNlbGluZSAyIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyND1UYXNrIEJhc2VsaW5lIDIgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDI1PVRhc2sgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjY9UmVzb3VyY2UgQmFzZWxpbmUgMiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjc9UmVzb3VyY2UgQmFzZWxpbmUgMiBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMjg9QXNzaWdubWVudCBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAyOT1Bc3NpZ25tZW50IEJhc2VsaW5lIDMgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDMwPVRhc2sgQmFzZWxpbmUgMyBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzE9VGFzayBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMj1SZXNvdXJjZSBCYXNlbGluZSAzIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzMz1SZXNvdXJjZSBCYXNlbGluZSAzIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzND1Bc3NpZ25tZW50IEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM1PUFzc2lnbm1lbnQgQmFzZWxpbmUgNCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgMzY9VGFzayBCYXNlbGluZSA0IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAzNz1UYXNrIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM4PVJlc291cmNlIEJhc2VsaW5lIDQgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDM5PVJlc291cmNlIEJhc2VsaW5lIDQgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQwPUFzc2lnbm1lbnQgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDE9QXNzaWdubWVudCBCYXNlbGluZSA1IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Mj1UYXNrIEJhc2VsaW5lIDUgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQzPVRhc2sgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDQ9UmVzb3VyY2UgQmFzZWxpbmUgNSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDU9UmVzb3VyY2UgQmFzZWxpbmUgNSBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDY9QXNzaWdubWVudCBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA0Nz1Bc3NpZ25tZW50IEJhc2VsaW5lIDYgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDQ4PVRhc2sgQmFzZWxpbmUgNiBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNDk9VGFzayBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MD1SZXNvdXJjZSBCYXNlbGluZSA2IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1MT1SZXNvdXJjZSBCYXNlbGluZSA2IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1Mj1Bc3NpZ25tZW50IEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDUzPUFzc2lnbm1lbnQgQmFzZWxpbmUgNyBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTQ9VGFzayBCYXNlbGluZSA3IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA1NT1UYXNrIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU2PVJlc291cmNlIEJhc2VsaW5lIDcgV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU3PVJlc291cmNlIEJhc2VsaW5lIDcgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDU4PUFzc2lnbm1lbnQgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNTk9QXNzaWdubWVudCBCYXNlbGluZSA4IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2MD1UYXNrIEJhc2VsaW5lIDggV29yayYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDYxPVRhc2sgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjI9UmVzb3VyY2UgQmFzZWxpbmUgOCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjM9UmVzb3VyY2UgQmFzZWxpbmUgOCBDb3N0JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjQ9QXNzaWdubWVudCBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2NT1Bc3NpZ25tZW50IEJhc2VsaW5lIDkgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDY2PVRhc2sgQmFzZWxpbmUgOSBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNjc9VGFzayBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OD1SZXNvdXJjZSBCYXNlbGluZSA5IFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA2OT1SZXNvdXJjZSBCYXNlbGluZSA5IENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MD1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3MT1Bc3NpZ25tZW50IEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mj1UYXNrIEJhc2VsaW5lIDEwIFdvcmsmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3Mz1UYXNrIEJhc2VsaW5lIDEwIENvc3QmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICA3ND1SZXNvdXJjZSBCYXNlbGluZSAxMCBXb3JrJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgNzU9UmVzb3VyY2UgQmFzZWxpbmUgMTAgQ29zdCYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgIDc2PVBoeXNpY2FsIFBlcmNlbnQgQ29tcGxldGUmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idUlEIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHRpbWVwaGFzZWQgZGF0YSByZWNvcmQuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVUlEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnQiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdGFydCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbmlzaCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBmaW5pc2ggZGF0ZSBvZiB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGaW5pc2giLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1bml0IiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vVW5pdFR5cGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdGltZSB1bml0IG9mIHRoZSB0aW1lcGhhc2VkIGRhdGEgcGVyaW9kLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgIFZhbHVlcyBhcmU6IDA9bSwgMT1oLCAyPWQsIDM9dywgNT1tbywgOD15JiN4RDsmI3hBOyAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVW5pdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB2YWx1ZSBwZXIgdW5pdCBvZiB0aW1lIGZvciB0aGUgdGltZXBoYXNlZCBkYXRhIHBlcmlvZC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlRpdGxlVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGl0bGVfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSI1MTIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVHlwZVR5cGUxIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVHlwZV8uXzFfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlMiIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl8yXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJUeXBlVHlwZTMiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUeXBlXy5fM18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iYmFzZVR5cGUiIHZhbHVlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjaW50ZWdlciIvPgotICAgICAgPGRldGFpbHMga2V5PSJlbnVtZXJhdGlvbiIgdmFsdWU9IjEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl80Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlR5cGVUeXBlNSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVfLl81Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVSURUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLlN0cmluZyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJVSURfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI3N0cmluZyIvPgotICAgICAgPGRldGFpbHMga2V5PSJtYXhMZW5ndGgiIHZhbHVlPSIxNiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVbml0VHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlVuaXRfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDUgOCIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZV8uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlSUQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB1bmlxdWUgSUQgb2YgdGhlIG91dGxpbmUgY29kZSB2YWx1ZSBhY3Jvc3MgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJlbnRWYWx1ZUlEIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlIG9mIHRoZSBvdXRsaW5lIGNvZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBhcmVudFZhbHVlSUQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgYWN0dWFsIHZhbHVlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVzY3JpcHRpb24gb2YgdGhpcyB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWYWx1ZTIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVfLl8xXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaUQiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50ZWdlciI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVuaXF1ZSBJRCBvZiB2YWx1ZSBhY3Jvc3MgJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IklEIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGFjdHVhbCB2YWx1ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHZhbHVlICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlTGlzdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZUxpc3RfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWx1ZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9WYWx1ZTIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgdmFsdWVzIHRoYXQgbWFrZSB1cCB0aGUgdmFsdWUgbGlzdC4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5tYXRoLkJpZ0ludGVnZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsdWVsaXN0U29ydE9yZGVyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhbHVlcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYWx1ZXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cCIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vVmFsdWUiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaW5kaXZpZHVhbCB2YWx1ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlZhbHVlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDowIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldCU01hc2siPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza18uX3R5cGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgbGV2ZWwgb2YgdGhlIG1hc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgdW5pcXVlPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1R5cGVUeXBlMiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSB0eXBlIG9mIHRoZSBub2RlIHZhbHVlLiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGFyZTogMD1OdW1iZXJzLCAxPVVwcGVyY2FzZSBMZXR0ZXJzLCAyPUxvd2VyY2FzZSBMZXR0ZXJzLCAzPUNoYXJhY3RlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIG1heGltdW0gbGVuZ3RoIGluIGNoYXJhY3RlcnMuICAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgb21pdHRlZCB3aGVuIGxlbmd0aCBpcyAmcXVvdDthbnkmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikxlbmd0aCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcGFyYXRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciBvZiB0aGUgbm9kZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VwYXJhdG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV0JTTWFza3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV0JTTWFza3NfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJpZnlVbmlxdWVDb2RlcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoZXRoZXIgV0JTIGNvZGVzIGFyZSB1bmlxdWUgZm9yIG5ldyB0YXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmVyaWZ5VW5pcXVlQ29kZXMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0ZUNvZGVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIiB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciBXQlMgY29kZXMgYXJlIGdlbmVyYXRlZCBmb3IgbmV3IHRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHZW5lcmF0ZUNvZGVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vUHJlZml4VHlwZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBwcmVmaXggZm9yIGFsbCBXQlMgY29kZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZWZpeCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndCU01hc2siIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV0JTTWFzayIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBXQlMgTWFzayB0aGF0IGlzIGFwcGxpZWQgdG8gYWxsIHRhc2tzIGluIHRoZSBQcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXQlNNYXNrIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrRGF5Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RheVR5cGVUeXBlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHR5cGUgb2YgZGF5LiAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVzIGFyZTogMD1FeGNlcHRpb24sIDE9TW9uZGF5LCAyPVR1ZXNkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzPVdlZG5lc2RheSwgND1UaHVyc2RheSwgNT1GcmlkYXksIDY9U2F0dXJkYXksICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3PVN1bmRheSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEYXlUeXBlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF5V29ya2luZyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGUgb3IgZGF5ICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGlzIHdvcmtpbmcuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRheVdvcmtpbmciLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0aW1lUGVyaW9kIiBlVHlwZT0iIy8vVGltZVBlcmlvZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgYSBjb250aWd1b3VzIHNldCBvZiBleGNlcHRpb24gZGF5cy4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRpbWVQZXJpb2QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JraW5nVGltZXMiIGVUeXBlPSIjLy9Xb3JraW5nVGltZXMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgY29sbGVjdGlvbiBvZiB3b3JraW5nIHRpbWVzIHRoYXQgZGVmaW5lIHRoZSB0aW1lIHdvcmtlZCAmI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHdlZWtkYXkuICBPbmUgb2YgdGhlc2UgbXVzdCBiZSBwcmVzZW50LCBhbmQgdGhlcmUgbWF5IGJlIG5vIG1vcmUgdGhhbiBmaXZlLiYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2Vla0RheXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheXNfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3ZWVrRGF5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1dlZWtEYXkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHdlZWtkYXkgZWl0aGVyIGRlZmluZXMgcmVndWxhciBkYXlzICYjeEQ7JiN4QTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3ZWVrIG9yIGV4Y2VwdGlvbiBkYXlzIGluIHRoZSBjYWxlbmRhci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV2Vla0RheSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldlZWtTdGFydERheVR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXZWVrU3RhcnREYXlfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIDQgNSA2Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtDb250b3VyVHlwZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubWF0aC5CaWdJbnRlZ2VyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtDb250b3VyXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMCAxIDIgMyA0IDUgNiA3IDgiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iV29ya0Zvcm1hdFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRm9ybWF0Xy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSNpbnRlZ2VyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImVudW1lcmF0aW9uIiB2YWx1ZT0iMSAyIDMgNCA1Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtHcm91cFR5cGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm1hdGguQmlnSW50ZWdlciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrR3JvdXBfLl90eXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImJhc2VUeXBlIiB2YWx1ZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlI2ludGVnZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0iZW51bWVyYXRpb24iIHZhbHVlPSIwIDEgMiAzIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtpbmdUaW1lIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtpbmdUaW1lXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZnJvbVRpbWUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBiZWdpbm5pbmcgb2YgdGhlIHdvcmtpbmcgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJGcm9tVGltZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvVGltZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9UaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGVuZCBvZiB0aGUgd29ya2luZyAgdGltZS4mI3hEOyYjeEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JraW5nVGltZXMiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWVzXy5fdHlwZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya2luZ1RpbWUiIHVwcGVyQm91bmQ9IjUiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JraW5nVGltZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHdvcmtpbmcgdGltZSBkdXJpbmcgdGhlIHdlZWtkYXkuJiN4RDsmI3hBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya2luZ1RpbWUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2N2ZkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNiODBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBNaWNyb3NvZnQgUHJvamVjdCBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMjUzZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Nc3Byb2plY3RQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNc3Byb2plY3RBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTXNwcm9qZWN0UGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdEFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1zcHJvamVjdFN3aXRjaCBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBNc3Byb2plY3RTd2l0Y2goKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50KEFzc2lnbm1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFzc2lnbm1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXNzaWdubWVudHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoQXZhaWxhYmlsaXR5UGVyaW9kIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZShCYXNlbGluZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQmFzZWxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTIoQmFzZWxpbmUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTMoQmFzZWxpbmUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCYXNlbGluZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcihDYWxlbmRhciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2FsZW5kYXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcnMoQ2FsZW5kYXJzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDYWxlbmRhcnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShFeHRlbmRlZEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTMoRXh0ZW5kZWRBdHRyaWJ1dGUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZTQoRXh0ZW5kZWRBdHRyaWJ1dGU0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrKE1hc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1hc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VNYXNrcyhNYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlTWFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlT3V0bGluZUNvZGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTIoT3V0bGluZUNvZGUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZTNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VPdXRsaW5lQ29kZXMoT3V0bGluZUNvZGVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVPdXRsaW5lQ29kZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcmVkZWNlc3NvckxpbmsoUHJlZGVjZXNzb3JMaW5rIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcmVkZWNlc3NvckxpbmtBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VQcm9qZWN0KFByb2plY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2plY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlKFJhdGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSYXRlcyhSYXRlcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmF0ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZShSZXNvdXJjZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VSZXNvdXJjZXMoUmVzb3VyY2VzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXNvdXJjZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUYXNrcyhUYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lUGVyaW9kKFRpbWVQZXJpb2Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRpbWVQZXJpb2RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lcGhhc2VkRGF0YVR5cGUoVGltZXBoYXNlZERhdGFUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUaW1lcGhhc2VkRGF0YVR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZShWYWx1ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVmFsdWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZTIoVmFsdWUyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZTJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZUxpc3QoVmFsdWVMaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZUxpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VWYWx1ZXMoVmFsdWVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVWYWx1ZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrKFdCU01hc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdCU01hc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXQlNNYXNrcyhXQlNNYXNrcyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV0JTTWFza3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5KFdlZWtEYXkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdlZWtEYXlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXZWVrRGF5cyhXZWVrRGF5cyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV2Vla0RheXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZShXb3JraW5nVGltZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya2luZ1RpbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZXMoV29ya2luZ1RpbWVzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JraW5nVGltZXNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Bc3NpZ25tZW50IDxlbT5Bc3NpZ25tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBc3NpZ25tZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzIDxlbT5Bc3NpZ25tZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFzc2lnbm1lbnRzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZCA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkF2YWlsYWJpbGl0eVBlcmlvZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdmFpbGFiaWxpdHlQZXJpb2RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kcyA8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5BdmFpbGFiaWxpdHlQZXJpb2RzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF2YWlsYWJpbGl0eVBlcmlvZHNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUgPGVtPkJhc2VsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyIDxlbT5CYXNlbGluZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5CYXNlbGluZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQmFzZWxpbmUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lMyA8ZW0+QmFzZWxpbmUzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUJhc2VsaW5lM0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhciA8ZW0+Q2FsZW5kYXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYWxlbmRhckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnMgPGVtPkNhbGVuZGFyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkNhbGVuZGFycwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYWxlbmRhcnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290IDxlbT5Eb2N1bWVudCBSb290PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRG9jdW1lbnRSb290Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvY3VtZW50Um9vdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZSA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGUyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGUyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlMkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMgPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNCA8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFeHRlbmRlZEF0dHJpYnV0ZTRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzIDxlbT5FeHRlbmRlZCBBdHRyaWJ1dGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuRXh0ZW5kZWRBdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4dGVuZGVkQXR0cmlidXRlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrIDxlbT5NYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTWFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzIDxlbT5NYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1hc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlIDxlbT5PdXRsaW5lIENvZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIgPGVtPk91dGxpbmUgQ29kZTI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0bGluZUNvZGUyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMyA8ZW0+T3V0bGluZSBDb2RlMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRsaW5lQ29kZTNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzIDxlbT5PdXRsaW5lIENvZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuT3V0bGluZUNvZGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU91dGxpbmVDb2Rlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsgPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5QcmVkZWNlc3NvckxpbmsKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJlZGVjZXNzb3JMaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3QgPGVtPlByb2plY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Qcm9qZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2plY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZSA8ZW0+UmF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcyA8ZW0+UmF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSYXRlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZSA8ZW0+UmVzb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZXMgPGVtPlJlc291cmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXNvdXJjZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lUGVyaW9kIDxlbT5UaW1lIFBlcmlvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGltZVBlcmlvZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGUgPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVGltZXBoYXNlZERhdGFUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRpbWVwaGFzZWREYXRhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTIgPGVtPlZhbHVlMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZTJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0IDxlbT5WYWx1ZSBMaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuVmFsdWVMaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVZhbHVlTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZXMgPGVtPlZhbHVlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYWx1ZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFzayA8ZW0+V0JTIE1hc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdCU01hc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV0JTTWFza3MgPGVtPldCUyBNYXNrczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2tzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdCU01hc2tzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXkgPGVtPldlZWsgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV2Vla0RheQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWVrRGF5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXlzIDxlbT5XZWVrIERheXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXZWVrRGF5c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Xb3JraW5nVGltZSA8ZW0+V29ya2luZyBUaW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya2luZ1RpbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzIDxlbT5Xb3JraW5nIFRpbWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtpbmdUaW1lc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9Nc3Byb2plY3RBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTdiOTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MUmVzb3VyY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSBGYWN0b3J5PC9iPiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2thZ2UuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsLk1zcHJvamVjdFJlc291cmNlSW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKLQkJWE1MUmVzb3VyY2UgcmVzdWx0ID0gbmV3IE1zcHJvamVjdFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9FWFRFTkRFRF9NRVRBX0RBVEEsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0TG9hZE9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdFNhdmVPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9TQ0hFTUFfTE9DQVRJT04sIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL01zcHJvamVjdFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZTEwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0UmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFJlc291cmNlSW1wbC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUxSZXNvdXJjZUltcGw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWwuTXNwcm9qZWN0UmVzb3VyY2VGYWN0b3J5SW1wbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0UmVzb3VyY2VJbXBsIGV4dGVuZHMgWE1MUmVzb3VyY2VJbXBsIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB1cmkgdGhlIFVSSSBvZiB0aGUgbmV3IHJlc291cmNlLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTXNwcm9qZWN0UmVzb3VyY2VJbXBsKFVSSSB1cmkpIHsKLQkJc3VwZXIodXJpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MSGVscGVyIGNyZWF0ZVhNTEhlbHBlcigpewotCSAgICByZXR1cm4gbmV3IE1zcHJvamVjdFhNTEhlbHBlckltcGwodGhpcyk7Ci0JfQotfSAvL01zcHJvamVjdFJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE5MGI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNc3Byb2plY3RTd2l0Y2guamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjQxIGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQotICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAotICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKLSAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLSAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAotICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0U3dpdGNoIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE1zcHJvamVjdFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNc3Byb2plY3RTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgZG9Td2l0Y2goRUNsYXNzIHRoZUVDbGFzcywgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCWlmICh0aGVFQ2xhc3MuZUNvbnRhaW5lcigpID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIGRvU3dpdGNoKHRoZUVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSwgdGhlRU9iamVjdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMaXN0IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4KLQkJCQllU3VwZXJUeXBlcy5pc0VtcHR5KCkgPwotCQkJCQlkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KSA6Ci0JCQkJCWRvU3dpdGNoKChFQ2xhc3MpZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOiB7Ci0JCQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2lnbm1lbnQoYXNzaWdubWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFTU0lHTk1FTlRTOiB7Ci0JCQkJQXNzaWdubWVudHMgYXNzaWdubWVudHMgPSAoQXNzaWdubWVudHMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZUFzc2lnbm1lbnRzKGFzc2lnbm1lbnRzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRDogewotCQkJCUF2YWlsYWJpbGl0eVBlcmlvZCBhdmFpbGFiaWxpdHlQZXJpb2QgPSAoQXZhaWxhYmlsaXR5UGVyaW9kKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2QoYXZhaWxhYmlsaXR5UGVyaW9kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6IHsKLQkJCQlBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMgPSAoQXZhaWxhYmlsaXR5UGVyaW9kcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kcyhhdmFpbGFiaWxpdHlQZXJpb2RzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkU6IHsKLQkJCQlCYXNlbGluZSBiYXNlbGluZSA9IChCYXNlbGluZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmFzZWxpbmUoYmFzZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5CQVNFTElORTI6IHsKLQkJCQlCYXNlbGluZTIgYmFzZWxpbmUyID0gKEJhc2VsaW5lMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQmFzZWxpbmUyKGJhc2VsaW5lMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzogewotCQkJCUJhc2VsaW5lMyBiYXNlbGluZTMgPSAoQmFzZWxpbmUzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VCYXNlbGluZTMoYmFzZWxpbmUzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ0FMRU5EQVI6IHsKLQkJCQlDYWxlbmRhciBjYWxlbmRhciA9IChDYWxlbmRhcil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2FsZW5kYXIoY2FsZW5kYXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxFTkRBUlM6IHsKLQkJCQlDYWxlbmRhcnMgY2FsZW5kYXJzID0gKENhbGVuZGFycyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlQ2FsZW5kYXJzKGNhbGVuZGFycyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6IHsKLQkJCQlEb2N1bWVudFJvb3QgZG9jdW1lbnRSb290ID0gKERvY3VtZW50Um9vdCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRG9jdW1lbnRSb290KGRvY3VtZW50Um9vdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTogewotCQkJCUV4dGVuZGVkQXR0cmlidXRlIGV4dGVuZGVkQXR0cmlidXRlID0gKEV4dGVuZGVkQXR0cmlidXRlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShleHRlbmRlZEF0dHJpYnV0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTI6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTIgZXh0ZW5kZWRBdHRyaWJ1dGUyID0gKEV4dGVuZGVkQXR0cmlidXRlMil0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUyKGV4dGVuZGVkQXR0cmlidXRlMik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kZWRBdHRyaWJ1dGUzID0gKEV4dGVuZGVkQXR0cmlidXRlMyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUzKGV4dGVuZGVkQXR0cmlidXRlMyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTQ6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZTQgZXh0ZW5kZWRBdHRyaWJ1dGU0ID0gKEV4dGVuZGVkQXR0cmlidXRlNCl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGU0KGV4dGVuZGVkQXR0cmlidXRlNCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURVM6IHsKLQkJCQlFeHRlbmRlZEF0dHJpYnV0ZXMgZXh0ZW5kZWRBdHRyaWJ1dGVzID0gKEV4dGVuZGVkQXR0cmlidXRlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGVzKGV4dGVuZGVkQXR0cmlidXRlcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6IHsKLQkJCQlNYXNrIG1hc2sgPSAoTWFzayl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWFzayhtYXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFTS1M6IHsKLQkJCQlNYXNrcyBtYXNrcyA9IChNYXNrcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlTWFza3MobWFza3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREU6IHsKLQkJCQlPdXRsaW5lQ29kZSBvdXRsaW5lQ29kZSA9IChPdXRsaW5lQ29kZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlT3V0bGluZUNvZGUob3V0bGluZUNvZGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOiB7Ci0JCQkJT3V0bGluZUNvZGUyIG91dGxpbmVDb2RlMiA9IChPdXRsaW5lQ29kZTIpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlMihvdXRsaW5lQ29kZTIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUzOiB7Ci0JCQkJT3V0bGluZUNvZGUzIG91dGxpbmVDb2RlMyA9IChPdXRsaW5lQ29kZTMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlMyhvdXRsaW5lQ29kZTMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREVTOiB7Ci0JCQkJT3V0bGluZUNvZGVzIG91dGxpbmVDb2RlcyA9IChPdXRsaW5lQ29kZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZU91dGxpbmVDb2RlcyhvdXRsaW5lQ29kZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOiB7Ci0JCQkJUHJlZGVjZXNzb3JMaW5rIHByZWRlY2Vzc29yTGluayA9IChQcmVkZWNlc3NvckxpbmspdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByZWRlY2Vzc29yTGluayhwcmVkZWNlc3NvckxpbmspOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUk9KRUNUOiB7Ci0JCQkJUHJvamVjdCBwcm9qZWN0ID0gKFByb2plY3QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEU6IHsKLQkJCQlSYXRlIHJhdGUgPSAoUmF0ZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmF0ZShyYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6IHsKLQkJCQlSYXRlcyByYXRlcyA9IChSYXRlcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlUmF0ZXMocmF0ZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5SRVNPVVJDRTogewotCQkJCVJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZShyZXNvdXJjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJFU09VUkNFUzogewotCQkJCVJlc291cmNlcyByZXNvdXJjZXMgPSAoUmVzb3VyY2VzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VSZXNvdXJjZXMocmVzb3VyY2VzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzogewotCQkJCVRhc2sgdGFzayA9IChUYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrKHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UQVNLUzogewotCQkJCVRhc2tzIHRhc2tzID0gKFRhc2tzKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VUYXNrcyh0YXNrcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVfUEVSSU9EOiB7Ci0JCQkJVGltZVBlcmlvZCB0aW1lUGVyaW9kID0gKFRpbWVQZXJpb2QpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRpbWVQZXJpb2QodGltZVBlcmlvZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOiB7Ci0JCQkJVGltZXBoYXNlZERhdGFUeXBlIHRpbWVwaGFzZWREYXRhVHlwZSA9IChUaW1lcGhhc2VkRGF0YVR5cGUpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVRpbWVwaGFzZWREYXRhVHlwZSh0aW1lcGhhc2VkRGF0YVR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5WQUxVRTogewotCQkJCVZhbHVlIHZhbHVlID0gKFZhbHVlKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZSh2YWx1ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFMjogewotCQkJCVZhbHVlMiB2YWx1ZTIgPSAoVmFsdWUyKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZTIodmFsdWUyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDogewotCQkJCVZhbHVlTGlzdCB2YWx1ZUxpc3QgPSAoVmFsdWVMaXN0KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VWYWx1ZUxpc3QodmFsdWVMaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVTOiB7Ci0JCQkJVmFsdWVzIHZhbHVlcyA9IChWYWx1ZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVZhbHVlcyh2YWx1ZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTSzogewotCQkJCVdCU01hc2sgd2JzTWFzayA9IChXQlNNYXNrKXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXQlNNYXNrKHdic01hc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6IHsKLQkJCQlXQlNNYXNrcyB3YnNNYXNrcyA9IChXQlNNYXNrcyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV0JTTWFza3Mod2JzTWFza3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWTogewotCQkJCVdlZWtEYXkgd2Vla0RheSA9IChXZWVrRGF5KXRoZUVPYmplY3Q7Ci0JCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VXZWVrRGF5KHdlZWtEYXkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XRUVLX0RBWVM6IHsKLQkJCQlXZWVrRGF5cyB3ZWVrRGF5cyA9IChXZWVrRGF5cyl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV2Vla0RheXMod2Vla0RheXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6IHsKLQkJCQlXb3JraW5nVGltZSB3b3JraW5nVGltZSA9IChXb3JraW5nVGltZSl0aGVFT2JqZWN0OwotCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlV29ya2luZ1RpbWUod29ya2luZ1RpbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUVTOiB7Ci0JCQkJV29ya2luZ1RpbWVzIHdvcmtpbmdUaW1lcyA9IChXb3JraW5nVGltZXMpdGhlRU9iamVjdDsKLQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZVdvcmtpbmdUaW1lcyh3b3JraW5nVGltZXMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Bc3NpZ25tZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUFzc2lnbm1lbnQoQXNzaWdubWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFzc2lnbm1lbnRzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBc3NpZ25tZW50cyhBc3NpZ25tZW50cyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXZhaWxhYmlsaXR5IFBlcmlvZDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQXZhaWxhYmlsaXR5UGVyaW9kKEF2YWlsYWJpbGl0eVBlcmlvZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF2YWlsYWJpbGl0eSBQZXJpb2RzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VBdmFpbGFiaWxpdHlQZXJpb2RzKEF2YWlsYWJpbGl0eVBlcmlvZHMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUoQmFzZWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5CYXNlbGluZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VCYXNlbGluZTIoQmFzZWxpbmUyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QmFzZWxpbmUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJhc2VsaW5lMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlQmFzZWxpbmUzKEJhc2VsaW5lMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VDYWxlbmRhcihDYWxlbmRhciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhbGVuZGFyczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYWxlbmRhcnM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUNhbGVuZGFycyhDYWxlbmRhcnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvY3VtZW50IFJvb3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeHRlbmRlZCBBdHRyaWJ1dGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFeHRlbmRlZEF0dHJpYnV0ZShFeHRlbmRlZEF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUyKEV4dGVuZGVkQXR0cmlidXRlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlMzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGUzKEV4dGVuZGVkQXR0cmlidXRlMyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZTQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlNDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4dGVuZGVkIEF0dHJpYnV0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXh0ZW5kZWQgQXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRXh0ZW5kZWRBdHRyaWJ1dGVzKEV4dGVuZGVkQXR0cmlidXRlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1hc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlTWFzayhNYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWFza3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU1hc2tzKE1hc2tzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0bGluZSBDb2RlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlT3V0bGluZUNvZGUoT3V0bGluZUNvZGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMihPdXRsaW5lQ29kZTIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGUzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZTM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlMyhPdXRsaW5lQ29kZTMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5PdXRsaW5lIENvZGVzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGxpbmUgQ29kZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmVkZWNlc3NvciBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByZWRlY2Vzc29yIExpbms8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByZWRlY2Vzc29yTGluayhQcmVkZWNlc3Nvckxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9qZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2plY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVByb2plY3QoUHJvamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmF0ZShSYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmF0ZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJhdGVzKFJhdGVzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVJlc291cmNlKFJlc291cmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmVzb3VyY2VzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlc291cmNlczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlUmVzb3VyY2VzKFJlc291cmNlcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFza3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFza3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRhc2tzKFRhc2tzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGltZSBQZXJpb2Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVRpbWVQZXJpb2QoVGltZVBlcmlvZCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRpbWVwaGFzZWQgRGF0YSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VUaW1lcGhhc2VkRGF0YVR5cGUoVGltZXBoYXNlZERhdGFUeXBlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlKFZhbHVlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlMjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWUyKFZhbHVlMiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlIExpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFsdWUgTGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlVmFsdWVMaXN0KFZhbHVlTGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlZhbHVlczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYWx1ZXM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZVZhbHVlcyhWYWx1ZXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XQlMgTWFzazwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0JTTWFzayhXQlNNYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V0JTIE1hc2tzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldCUyBNYXNrczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV0JTTWFza3MoV0JTTWFza3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XZWVrIERheTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2Vla0RheShXZWVrRGF5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2VlayBEYXlzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldlZWsgRGF5czwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV2Vla0RheXMoV2Vla0RheXMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXR0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JraW5nIFRpbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VXb3JraW5nVGltZShXb3JraW5nVGltZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmtpbmcgVGltZXM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0dGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29ya2luZyBUaW1lczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlV29ya2luZ1RpbWVzKFdvcmtpbmdUaW1lcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldHRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTXNwcm9qZWN0U3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NGMwOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL01zcHJvamVjdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1zcHJvamVjdFZhbGlkYXRvci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6NDEganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LnV0aWw7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWNDaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUudXRpbC5YTUxUeXBlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkFzc2lnbm1lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQXZhaWxhYmlsaXR5UGVyaW9kczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkJhc2VsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQmFzZWxpbmUzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5DYWxlbmRhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5FeHRlbmRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LkV4dGVuZGVkQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5NYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk1zcHJvamVjdFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5PdXRsaW5lQ29kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Lk91dGxpbmVDb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByZWRlY2Vzc29yTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuUmF0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlRpbWVQZXJpb2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5UaW1lcGhhc2VkRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LlZhbHVlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldCU01hc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XQlNNYXNrczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldlZWtEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC5XZWVrRGF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0LldvcmtpbmdUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuV29ya2luZ1RpbWVzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+VmFsaWRhdG9yPC9iPiBmb3IgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3QuTXNwcm9qZWN0UGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTXNwcm9qZWN0VmFsaWRhdG9yIGV4dGVuZHMgRU9iamVjdFZhbGlkYXRvciB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBNc3Byb2plY3RWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgTXNwcm9qZWN0VmFsaWRhdG9yKCk7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IGZvciB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldFNvdXJjZSgpIHNvdXJjZX0gb2YgZGlhZ25vc3RpYyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0Q29kZSgpIGNvZGVzfSBmcm9tIHRoaXMgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWMjZ2V0U291cmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljI2dldENvZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHTk9TVElDX1NPVVJDRSA9ICJvcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgd2l0aCBhIGZpeGVkIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSB2YWx1ZSBmb3IgYWRkaXRpb25hbCBoYW5kIHdyaXR0ZW4gY29uc3RhbnRzIGluIGEgZGVyaXZlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBESUFHTk9TVElDX0NPREVfQ09VTlQgPSBHRU5FUkFURURfRElBR05PU1RJQ19DT0RFX0NPVU5UOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCBiYXNlIHBhY2thZ2UgdmFsaWRhdG9yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYTUxUeXBlVmFsaWRhdG9yIHhtbFR5cGVWYWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1zcHJvamVjdFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQkJeG1sVHlwZVZhbGlkYXRvciA9IFhNTFR5cGVWYWxpZGF0b3IuSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBvZiB0aGlzIHZhbGlkYXRvciBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVQYWNrYWdlIGdldEVQYWNrYWdlKCkgewotCSAgcmV0dXJuIE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPnZhbGlkYXRlWFhYPC9jb2RlPiBmb3IgdGhlIGNvcnJlc29uZGluZyBjbGFzc2lmaWVyIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZShpbnQgY2xhc3NpZmllcklELCBPYmplY3QgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UOgotCQkJCXJldHVybiB2YWxpZGF0ZUFzc2lnbm1lbnQoKEFzc2lnbm1lbnQpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BU1NJR05NRU5UUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBc3NpZ25tZW50cygoQXNzaWdubWVudHMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BVkFJTEFCSUxJVFlfUEVSSU9EOgotCQkJCXJldHVybiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZCgoQXZhaWxhYmlsaXR5UGVyaW9kKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVZBSUxBQklMSVRZX1BFUklPRFM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcygoQXZhaWxhYmlsaXR5UGVyaW9kcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lKChCYXNlbGluZSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTIoKEJhc2VsaW5lMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkJBU0VMSU5FMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVCYXNlbGluZTMoKEJhc2VsaW5lMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSOgotCQkJCXJldHVybiB2YWxpZGF0ZUNhbGVuZGFyKChDYWxlbmRhcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBTEVOREFSUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVDYWxlbmRhcnMoKENhbGVuZGFycyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRPQ1VNRU5UX1JPT1Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRG9jdW1lbnRSb290KChEb2N1bWVudFJvb3QpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUoKEV4dGVuZGVkQXR0cmlidXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoKEV4dGVuZGVkQXR0cmlidXRlMil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVYVEVOREVEX0FUVFJJQlVURTM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGUzKChFeHRlbmRlZEF0dHJpYnV0ZTMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFTkRFRF9BVFRSSUJVVEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlNCgoRXh0ZW5kZWRBdHRyaWJ1dGU0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRVhURU5ERURfQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoKEV4dGVuZGVkQXR0cmlidXRlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0s6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTWFzaygoTWFzayl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk1BU0tTOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hc2tzKChNYXNrcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZSgoT3V0bGluZUNvZGUpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX0NPREUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVDb2RlMigoT3V0bGluZUNvZGUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuT1VUTElORV9DT0RFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoKE91dGxpbmVDb2RlMyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk9VVExJTkVfQ09ERVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlT3V0bGluZUNvZGVzKChPdXRsaW5lQ29kZXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5QUkVERUNFU1NPUl9MSU5LOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWRlY2Vzc29yTGluaygoUHJlZGVjZXNzb3JMaW5rKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUFJPSkVDVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVQcm9qZWN0KChQcm9qZWN0KXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlKChSYXRlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkFURVM6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmF0ZXMoKFJhdGVzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0U6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUmVzb3VyY2UoKFJlc291cmNlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUkVTT1VSQ0VTOgotCQkJCXJldHVybiB2YWxpZGF0ZVJlc291cmNlcygoUmVzb3VyY2VzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTSzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUYXNrKChUYXNrKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVEFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGFza3MoKFRhc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVElNRV9QRVJJT0Q6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGltZVBlcmlvZCgoVGltZVBlcmlvZCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJTUVQSEFTRURfREFUQV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZSgoVGltZXBoYXNlZERhdGFUeXBlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVmFsdWUoKFZhbHVlKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUUyOgotCQkJCXJldHVybiB2YWxpZGF0ZVZhbHVlMigoVmFsdWUyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVfTElTVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZUxpc3QoKFZhbHVlTGlzdCl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlZBTFVFUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZXMoKFZhbHVlcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldCU19NQVNLOgotCQkJCXJldHVybiB2YWxpZGF0ZVdCU01hc2soKFdCU01hc2spdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XQlNfTUFTS1M6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV0JTTWFza3MoKFdCU01hc2tzKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19EQVk6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV2Vla0RheSgoV2Vla0RheSl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldFRUtfREFZUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrRGF5cygoV2Vla0RheXMpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5XT1JLSU5HX1RJTUU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya2luZ1RpbWUoKFdvcmtpbmdUaW1lKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS0lOR19USU1FUzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JraW5nVGltZXMoKFdvcmtpbmdUaW1lcyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDQ1JVRV9BVDoKLQkJCQlyZXR1cm4gdmFsaWRhdGVBY2NydWVBdCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkFDVElWRV9ESVJFQ1RPUllfR1VJRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5BTElBU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUFsaWFzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQVVUSE9SX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQXV0aG9yVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQk9PS0lOR19UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTEoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DQUxDVUxBVElPTl9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNBVEVHT1JZX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT0RFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29kZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNPTVBBTllfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb21wYW55VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OU1RSQUlOVF9UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ09OVEFDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUNvbnRhY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5DT1NUX1JBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkNVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuQ1VSUkVOQ1lfU1lNQk9MX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EQVlfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURheVR5cGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuREVGQVVMVF9GSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5ERUZBVUxUX1RBU0tfVFlQRV9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRUYXNrVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRFVSQVRJT05fRk9STUFUX1RZUEUzOgotCQkJCXJldHVybiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5EVVJBVElPTl9GT1JNQVRfVFlQRTQ6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkRVUkFUSU9OX0ZPUk1BVF9UWVBFNToKLQkJCQlyZXR1cm4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkVNQUlMX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFbWFpbEFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5FWFRFUk5BTF9UQVNLX1BST0pFQ1RfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuRklYRURfQ09TVF9BQ0NSVUFMX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkZZX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVGWVN0YXJ0RGF0ZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5HUk9VUF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUdyb3VwVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSFlQRVJMSU5LX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfQUREUkVTU19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19TVUJfQUREUkVTU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfU1VCX0FERFJFU1NfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5IWVBFUkxJTktfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlSHlwZXJsaW5rVHlwZTEoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkhZUEVSTElOS19UWVBFMjoKLQkJCQlyZXR1cm4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuSU5JVElBTFNfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVJbml0aWFsc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLkxBR19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5MRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTUFOQUdFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hbmFnZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5NQVRFUklBTF9MQUJFTF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5BTUVfVFlQRTE6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlTmFtZVR5cGUxKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5OQU1FX1RZUEUyOgotCQkJCXJldHVybiB2YWxpZGF0ZU5hbWVUeXBlMigoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuTkFNRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVOYW1lVHlwZTMoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5FV19UQVNLX1NUQVJUX0RBVEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLk5UX0FDQ09VTlRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVOVEFjY291bnRUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVVRMSU5FX05VTUJFUl9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5PVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMToKLQkJCQlyZXR1cm4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDX0FMSUFTX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBIT05FVElDU19UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVBob25ldGljc1R5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlBSRUZJWF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVByZWZpeFR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlJBVEVfVEFCTEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSYXRlVGFibGVUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuUk9MTFVQX1RZUEVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuU1VCSkVDVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVN1YmplY3RUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5TVUJQUk9KRUNUX05BTUVfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVTdWJwcm9qZWN0TmFtZVR5cGUoKFN0cmluZyl2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRJVExFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVGl0bGVUeXBlKChTdHJpbmcpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEUxOgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlMSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTI6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGUyKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVFlQRV9UWVBFMzoKLQkJCQlyZXR1cm4gdmFsaWRhdGVUeXBlVHlwZTMoKEJpZ0ludGVnZXIpdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCWNhc2UgTXNwcm9qZWN0UGFja2FnZS5UWVBFX1RZUEU0OgotCQkJCXJldHVybiB2YWxpZGF0ZVR5cGVUeXBlNCgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLlRZUEVfVFlQRTU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVHlwZVR5cGU1KChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVUlEX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlVUlEVHlwZSgoU3RyaW5nKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVU5JVF9UWVBFOgotCQkJCXJldHVybiB2YWxpZGF0ZVVuaXRUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV0VFS19TVEFSVF9EQVlfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19DT05UT1VSX1RZUEU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQljYXNlIE1zcHJvamVjdFBhY2thZ2UuV09SS19GT1JNQVRfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrRm9ybWF0VHlwZSgoQmlnSW50ZWdlcil2YWx1ZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQkJY2FzZSBNc3Byb2plY3RQYWNrYWdlLldPUktfR1JPVVBfVFlQRToKLQkJCQlyZXR1cm4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlKChCaWdJbnRlZ2VyKXZhbHVlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCQlkZWZhdWx0OiAKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudChBc3NpZ25tZW50IGFzc2lnbm1lbnQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXNzaWdubWVudHMoQXNzaWdubWVudHMgYXNzaWdubWVudHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXNzaWdubWVudHMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF2YWlsYWJpbGl0eVBlcmlvZChBdmFpbGFiaWxpdHlQZXJpb2QgYXZhaWxhYmlsaXR5UGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGF2YWlsYWJpbGl0eVBlcmlvZCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXZhaWxhYmlsaXR5UGVyaW9kcyhBdmFpbGFiaWxpdHlQZXJpb2RzIGF2YWlsYWJpbGl0eVBlcmlvZHMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYXZhaWxhYmlsaXR5UGVyaW9kcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUoQmFzZWxpbmUgYmFzZWxpbmUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJhc2VsaW5lMihCYXNlbGluZTIgYmFzZWxpbmUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGJhc2VsaW5lMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmUzKEJhc2VsaW5lMyBiYXNlbGluZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoYmFzZWxpbmUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxlbmRhcihDYWxlbmRhciBjYWxlbmRhciwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChjYWxlbmRhciwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsZW5kYXJzKENhbGVuZGFycyBjYWxlbmRhcnMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoY2FsZW5kYXJzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChkb2N1bWVudFJvb3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlKEV4dGVuZGVkQXR0cmlidXRlIGV4dGVuZGVkQXR0cmlidXRlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZTIoRXh0ZW5kZWRBdHRyaWJ1dGUyIGV4dGVuZGVkQXR0cmlidXRlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVuZGVkQXR0cmlidXRlMyhFeHRlbmRlZEF0dHJpYnV0ZTMgZXh0ZW5kZWRBdHRyaWJ1dGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KGV4dGVuZGVkQXR0cmlidXRlMywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRXh0ZW5kZWRBdHRyaWJ1dGU0KEV4dGVuZGVkQXR0cmlidXRlNCBleHRlbmRlZEF0dHJpYnV0ZTQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQoZXh0ZW5kZWRBdHRyaWJ1dGU0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlbmRlZEF0dHJpYnV0ZXMoRXh0ZW5kZWRBdHRyaWJ1dGVzIGV4dGVuZGVkQXR0cmlidXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChleHRlbmRlZEF0dHJpYnV0ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2soTWFzayBtYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hc2tzKE1hc2tzIG1hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG1hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZShPdXRsaW5lQ29kZSBvdXRsaW5lQ29kZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3V0bGluZUNvZGUyKE91dGxpbmVDb2RlMiBvdXRsaW5lQ29kZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQob3V0bGluZUNvZGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lQ29kZTMoT3V0bGluZUNvZGUzIG91dGxpbmVDb2RlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChvdXRsaW5lQ29kZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVDb2RlcyhPdXRsaW5lQ29kZXMgb3V0bGluZUNvZGVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KG91dGxpbmVDb2RlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZGVjZXNzb3JMaW5rKFByZWRlY2Vzc29yTGluayBwcmVkZWNlc3NvckxpbmssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocHJlZGVjZXNzb3JMaW5rLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVQcm9qZWN0KFByb2plY3QgcHJvamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChwcm9qZWN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlKFJhdGUgcmF0ZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSYXRlcyhSYXRlcyByYXRlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludChyYXRlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQocmVzb3VyY2UsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJlc291cmNlcyhSZXNvdXJjZXMgcmVzb3VyY2VzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHJlc291cmNlcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFzayhUYXNrIHRhc2ssIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFzaywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGFza3MoVGFza3MgdGFza3MsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodGFza3MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVQZXJpb2QoVGltZVBlcmlvZCB0aW1lUGVyaW9kLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVQZXJpb2QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVRpbWVwaGFzZWREYXRhVHlwZShUaW1lcGhhc2VkRGF0YVR5cGUgdGltZXBoYXNlZERhdGFUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHRpbWVwaGFzZWREYXRhVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWUoVmFsdWUgdmFsdWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlMihWYWx1ZTIgdmFsdWUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHZhbHVlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZUxpc3QsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQodmFsdWVMaXN0LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVWYWx1ZXMoVmFsdWVzIHZhbHVlcywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh2YWx1ZXMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2soV0JTTWFzayB3YnNNYXNrLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2ssIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdCU01hc2tzKFdCU01hc2tzIHdic01hc2tzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdic01hc2tzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5KFdlZWtEYXkgd2Vla0RheSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5LCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrRGF5cyhXZWVrRGF5cyB3ZWVrRGF5cywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlyZXR1cm4gdmFsaWRhdGVfRXZlcnlEZWZhdWx0Q29uc3RyYWludCh3ZWVrRGF5cywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya2luZ1RpbWUoV29ya2luZ1RpbWUgd29ya2luZ1RpbWUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlX0V2ZXJ5RGVmYXVsdENvbnN0cmFpbnQod29ya2luZ1RpbWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtpbmdUaW1lcyhXb3JraW5nVGltZXMgd29ya2luZ1RpbWVzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCXJldHVybiB2YWxpZGF0ZV9FdmVyeURlZmF1bHRDb25zdHJhaW50KHdvcmtpbmdUaW1lcywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWNjcnVlQXQoQmlnSW50ZWdlciBhY2NydWVBdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQWNjcnVlQXRfRW51bWVyYXRpb24oYWNjcnVlQXQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEFDQ1JVRV9BVF9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkFjY3J1ZSBBdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjY3J1ZUF0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgYWNjcnVlQXQsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoYWNjcnVlQXQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEFjY3J1ZUF0KCksIGFjY3J1ZUF0LCBBQ0NSVUVfQVRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZShTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BY3RpdmUgRGlyZWN0b3J5IEdVSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUFjdGl2ZURpcmVjdG9yeUdVSURUeXBlX01heExlbmd0aChTdHJpbmcgYWN0aXZlRGlyZWN0b3J5R1VJRFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFjdGl2ZURpcmVjdG9yeUdVSURUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSgpLCBhY3RpdmVEaXJlY3RvcnlHVUlEVHlwZSwgbGVuZ3RoLCAxNiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQWxpYXNUeXBlKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUFsaWFzVHlwZV9NYXhMZW5ndGgoYWxpYXNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkFsaWFzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVBbGlhc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBhbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGFsaWFzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MDsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWxpYXNUeXBlKCksIGFsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQXV0aG9yVHlwZShTdHJpbmcgYXV0aG9yVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQXV0aG9yVHlwZV9NYXhMZW5ndGgoYXV0aG9yVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5BdXRob3IgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUF1dGhvclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBhdXRob3JUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBhdXRob3JUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aG9yVHlwZSgpLCBhdXRob3JUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUoQmlnSW50ZWdlciBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGVfRW51bWVyYXRpb24oYmFzZWxpbmVGb3JFYXJuZWRWYWx1ZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJBU0VMSU5FX0ZPUl9FQVJORURfVkFMVUVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5CYXNlbGluZSBGb3IgRWFybmVkIFZhbHVlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJhc2VsaW5lRm9yRWFybmVkVmFsdWVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRCYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSgpLCBiYXNlbGluZUZvckVhcm5lZFZhbHVlVHlwZSwgQkFTRUxJTkVfRk9SX0VBUk5FRF9WQUxVRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24oYm9va2luZ1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Cb29raW5nIFR5cGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGJvb2tpbmdUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEJPT0tJTkdfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Qm9va2luZ1R5cGVUeXBlKCksIGJvb2tpbmdUeXBlVHlwZSwgQk9PS0lOR19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxKEJpZ0ludGVnZXIgYm9va2luZ1R5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQm9va2luZ1R5cGVUeXBlMV9FbnVtZXJhdGlvbihib29raW5nVHlwZVR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVCb29raW5nVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEJPT0tJTkdfVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkJvb2tpbmcgVHlwZSBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUJvb2tpbmdUeXBlVHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBib29raW5nVHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGJvb2tpbmdUeXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEJvb2tpbmdUeXBlVHlwZTEoKSwgYm9va2luZ1R5cGVUeXBlMSwgQk9PS0lOR19UWVBFX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZShCaWdJbnRlZ2VyIGNhbGN1bGF0aW9uVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNhbGN1bGF0aW9uVHlwZVR5cGVfRW51bWVyYXRpb24oY2FsY3VsYXRpb25UeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ2FsY3VsYXRpb25UeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDQUxDVUxBVElPTl9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5DYWxjdWxhdGlvbiBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDYWxjdWxhdGlvblR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY2FsY3VsYXRpb25UeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjYWxjdWxhdGlvblR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYWxjdWxhdGlvblR5cGVUeXBlKCksIGNhbGN1bGF0aW9uVHlwZVR5cGUsIENBTENVTEFUSU9OX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNhdGVnb3J5VHlwZShTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDYXRlZ29yeVR5cGVfTWF4TGVuZ3RoKGNhdGVnb3J5VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DYXRlZ29yeSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ2F0ZWdvcnlUeXBlX01heExlbmd0aChTdHJpbmcgY2F0ZWdvcnlUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBjYXRlZ29yeVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXRlZ29yeVR5cGUoKSwgY2F0ZWdvcnlUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGUoU3RyaW5nIGNvZGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb2RlVHlwZV9NYXhMZW5ndGgoY29kZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+Q29kZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29kZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBjb2RlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY29kZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb2RlVHlwZSgpLCBjb2RlVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlKFN0cmluZyBjb21wYW55VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29tcGFueVR5cGVfTWF4TGVuZ3RoKGNvbXBhbnlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbXBhbnkgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbXBhbnlUeXBlX01heExlbmd0aChTdHJpbmcgY29tcGFueVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbXBhbnlUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tcGFueVR5cGUoKSwgY29tcGFueVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb25zdHJhaW50VHlwZVR5cGUoQmlnSW50ZWdlciBjb25zdHJhaW50VHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbihjb25zdHJhaW50VHlwZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUNvbnN0cmFpbnRUeXBlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkNvbnN0cmFpbnQgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ29uc3RyYWludFR5cGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29uc3RyYWludFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ09OU1RSQUlOVF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY29uc3RyYWludFR5cGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25zdHJhaW50VHlwZVR5cGUoKSwgY29uc3RyYWludFR5cGVUeXBlLCBDT05TVFJBSU5UX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlKFN0cmluZyBjb250YWN0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ29udGFjdFR5cGVfTWF4TGVuZ3RoKGNvbnRhY3RUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkNvbnRhY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvbnRhY3RUeXBlX01heExlbmd0aChTdHJpbmcgY29udGFjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGNvbnRhY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFjdFR5cGUoKSwgY29udGFjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZShCaWdJbnRlZ2VyIGNvc3RSYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDb3N0UmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihjb3N0UmF0ZVRhYmxlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlQ29zdFJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gQ09TVF9SQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Db3N0IFJhdGUgVGFibGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUNvc3RSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgY29zdFJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBDT1NUX1JBVEVfVEFCTEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhjb3N0UmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29zdFJhdGVUYWJsZVR5cGUoKSwgY29zdFJhdGVUYWJsZVR5cGUsIENPU1RfUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUoQmlnSW50ZWdlciBjdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlQ3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGVfRW51bWVyYXRpb24oY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIENVUlJFTkNZX1NZTUJPTF9QT1NJVElPTl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+Q3VycmVuY3kgU3ltYm9sIFBvc2l0aW9uIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFBvc2l0aW9uVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gQ1VSUkVOQ1lfU1lNQk9MX1BPU0lUSU9OX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoY3VycmVuY3lTeW1ib2xQb3NpdGlvblR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlKCksIGN1cnJlbmN5U3ltYm9sUG9zaXRpb25UeXBlLCBDVVJSRU5DWV9TWU1CT0xfUE9TSVRJT05fVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZShTdHJpbmcgY3VycmVuY3lTeW1ib2xUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVDdXJyZW5jeVN5bWJvbFR5cGVfTWF4TGVuZ3RoKGN1cnJlbmN5U3ltYm9sVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5DdXJyZW5jeSBTeW1ib2wgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUN1cnJlbmN5U3ltYm9sVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGN1cnJlbmN5U3ltYm9sVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gY3VycmVuY3lTeW1ib2xUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDIwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXJyZW5jeVN5bWJvbFR5cGUoKSwgY3VycmVuY3lTeW1ib2xUeXBlLCBsZW5ndGgsIDIwLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZShCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihkYXlUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRGF5VHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRheSBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEYXlUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRheVR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gREFZX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkYXlUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGF5VHlwZVR5cGUoKSwgZGF5VHlwZVR5cGUsIERBWV9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RGVmYXVsdCBGaXhlZCBDb3N0IEFjY3J1YWwgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRGaXhlZENvc3RBY2NydWFsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERFRkFVTFRfRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWZhdWx0Rml4ZWRDb3N0QWNjcnVhbFR5cGUoKSwgZGVmYXVsdEZpeGVkQ29zdEFjY3J1YWxUeXBlLCBERUZBVUxUX0ZJWEVEX0NPU1RfQUNDUlVBTF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUoQmlnSW50ZWdlciBkZWZhdWx0VGFza0VWTWV0aG9kVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tFVk1ldGhvZFR5cGVfRW51bWVyYXRpb24oZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19FVl9NRVRIT0RfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkRlZmF1bHQgVGFzayBFViBNZXRob2QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZURlZmF1bHRUYXNrRVZNZXRob2RUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZGVmYXVsdFRhc2tFVk1ldGhvZFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrRVZNZXRob2RUeXBlKCksIGRlZmF1bHRUYXNrRVZNZXRob2RUeXBlLCBERUZBVUxUX1RBU0tfRVZfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlKEJpZ0ludGVnZXIgZGVmYXVsdFRhc2tUeXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihkZWZhdWx0VGFza1R5cGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEZWZhdWx0VGFza1R5cGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERFRkFVTFRfVEFTS19UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EZWZhdWx0IFRhc2sgVHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRGVmYXVsdFRhc2tUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGRlZmF1bHRUYXNrVHlwZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBERUZBVUxUX1RBU0tfVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGRlZmF1bHRUYXNrVHlwZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldERlZmF1bHRUYXNrVHlwZVR5cGUoKSwgZGVmYXVsdFRhc2tUeXBlVHlwZSwgREVGQVVMVF9UQVNLX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUoKSwgZHVyYXRpb25Gb3JtYXRUeXBlLCBEVVJBVElPTl9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTEoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTEoKSwgZHVyYXRpb25Gb3JtYXRUeXBlMSwgRFVSQVRJT05fRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTJfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGUyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlMik7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlMigpLCBkdXJhdGlvbkZvcm1hdFR5cGUyLCBEVVJBVElPTl9GT1JNQVRfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlM19FbnVtZXJhdGlvbihkdXJhdGlvbkZvcm1hdFR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5EdXJhdGlvbiBGb3JtYXQgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGUzX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgZHVyYXRpb25Gb3JtYXRUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhkdXJhdGlvbkZvcm1hdFR5cGUzKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXREdXJhdGlvbkZvcm1hdFR5cGUzKCksIGR1cmF0aW9uRm9ybWF0VHlwZTMsIERVUkFUSU9OX0ZPUk1BVF9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTQoQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVEdXJhdGlvbkZvcm1hdFR5cGU0X0VudW1lcmF0aW9uKGR1cmF0aW9uRm9ybWF0VHlwZTQsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkR1cmF0aW9uIEZvcm1hdCBUeXBlNDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTRfRW51bWVyYXRpb24oQmlnSW50ZWdlciBkdXJhdGlvbkZvcm1hdFR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGR1cmF0aW9uRm9ybWF0VHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldER1cmF0aW9uRm9ybWF0VHlwZTQoKSwgZHVyYXRpb25Gb3JtYXRUeXBlNCwgRFVSQVRJT05fRk9STUFUX1RZUEU0X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNShCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUR1cmF0aW9uRm9ybWF0VHlwZTVfRW51bWVyYXRpb24oZHVyYXRpb25Gb3JtYXRUeXBlNSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+RHVyYXRpb24gRm9ybWF0IFR5cGU1PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRHVyYXRpb25Gb3JtYXRUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGR1cmF0aW9uRm9ybWF0VHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZHVyYXRpb25Gb3JtYXRUeXBlNSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RHVyYXRpb25Gb3JtYXRUeXBlNSgpLCBkdXJhdGlvbkZvcm1hdFR5cGU1LCBEVVJBVElPTl9GT1JNQVRfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUVhcm5lZFZhbHVlTWV0aG9kVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBlYXJuZWRWYWx1ZU1ldGhvZFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZWFybmVkVmFsdWVNZXRob2RUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFYXJuZWRWYWx1ZU1ldGhvZFR5cGUoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlLCBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxKEJpZ0ludGVnZXIgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihlYXJuZWRWYWx1ZU1ldGhvZFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVFYXJuZWRWYWx1ZU1ldGhvZFR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEVBUk5FRF9WQUxVRV9NRVRIT0RfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5FYXJuZWQgVmFsdWUgTWV0aG9kIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRWFybmVkVmFsdWVNZXRob2RUeXBlMV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBFQVJORURfVkFMVUVfTUVUSE9EX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGVhcm5lZFZhbHVlTWV0aG9kVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEVhcm5lZFZhbHVlTWV0aG9kVHlwZTEoKSwgZWFybmVkVmFsdWVNZXRob2RUeXBlMSwgRUFSTkVEX1ZBTFVFX01FVEhPRF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGUoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUVtYWlsQWRkcmVzc1R5cGVfTWF4TGVuZ3RoKGVtYWlsQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+RW1haWwgQWRkcmVzcyBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRW1haWxBZGRyZXNzVHlwZV9NYXhMZW5ndGgoU3RyaW5nIGVtYWlsQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGVtYWlsQWRkcmVzc1R5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbWFpbEFkZHJlc3NUeXBlKCksIGVtYWlsQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVFeHRlcm5hbFRhc2tQcm9qZWN0VHlwZShTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChleHRlcm5hbFRhc2tQcm9qZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5FeHRlcm5hbCBUYXNrIFByb2plY3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsVGFza1Byb2plY3RUeXBlX01heExlbmd0aChTdHJpbmcgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGV4dGVybmFsVGFza1Byb2plY3RUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUoKSwgZXh0ZXJuYWxUYXNrUHJvamVjdFR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZShTdHJpbmcgZml4ZWRDb3N0QWNjcnVhbFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUZpeGVkQ29zdEFjY3J1YWxUeXBlX0VudW1lcmF0aW9uKGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVGaXhlZENvc3RBY2NydWFsVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJICIxIiwKLQkJCQkgIjIiLAotCQkJCSAiMyIKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZpeGVkIENvc3QgQWNjcnVhbCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlRml4ZWRDb3N0QWNjcnVhbFR5cGVfRW51bWVyYXRpb24oU3RyaW5nIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gRklYRURfQ09TVF9BQ0NSVUFMX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMoZml4ZWRDb3N0QWNjcnVhbFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZpeGVkQ29zdEFjY3J1YWxUeXBlKCksIGZpeGVkQ29zdEFjY3J1YWxUeXBlLCBGSVhFRF9DT1NUX0FDQ1JVQUxfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZShCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKGZ5U3RhcnREYXRlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlRllTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkZZIFN0YXJ0IERhdGUgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUZZU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIGZ5U3RhcnREYXRlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhmeVN0YXJ0RGF0ZVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEZZU3RhcnREYXRlVHlwZSgpLCBmeVN0YXJ0RGF0ZVR5cGUsIEZZX1NUQVJUX0RBVEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUdyb3VwVHlwZShTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVHcm91cFR5cGVfTWF4TGVuZ3RoKGdyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5Hcm91cCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlR3JvdXBUeXBlX01heExlbmd0aChTdHJpbmcgZ3JvdXBUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBncm91cFR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRHcm91cFR5cGUoKSwgZ3JvdXBUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZV9NYXhMZW5ndGgoaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua0FkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTFfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMSgpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTIoU3RyaW5nIGh5cGVybGlua0FkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rQWRkcmVzc1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIEFkZHJlc3MgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtBZGRyZXNzVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua0FkZHJlc3NUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua0FkZHJlc3NUeXBlMigpLCBoeXBlcmxpbmtBZGRyZXNzVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZShTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgU3ViIEFkZHJlc3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1N1YkFkZHJlc3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFN1YiBBZGRyZXNzIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRIeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTEoKSwgaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKFN0cmluZyBoeXBlcmxpbmtTdWJBZGRyZXNzVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBTdWIgQWRkcmVzcyBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1N1YkFkZHJlc3NUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rU3ViQWRkcmVzc1R5cGUyKCksIGh5cGVybGlua1N1YkFkZHJlc3NUeXBlMiwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUoU3RyaW5nIGh5cGVybGlua1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGVfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+SHlwZXJsaW5rIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gaHlwZXJsaW5rVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUoKSwgaHlwZXJsaW5rVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxKFN0cmluZyBoeXBlcmxpbmtUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlSHlwZXJsaW5rVHlwZTFfTWF4TGVuZ3RoKGh5cGVybGlua1R5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkh5cGVybGluayBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUh5cGVybGlua1R5cGUxX01heExlbmd0aChTdHJpbmcgaHlwZXJsaW5rVHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGh5cGVybGlua1R5cGUxLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0SHlwZXJsaW5rVHlwZTEoKSwgaHlwZXJsaW5rVHlwZTEsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMihTdHJpbmcgaHlwZXJsaW5rVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUh5cGVybGlua1R5cGUyX01heExlbmd0aChoeXBlcmxpbmtUeXBlMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5IeXBlcmxpbmsgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVIeXBlcmxpbmtUeXBlMl9NYXhMZW5ndGgoU3RyaW5nIGh5cGVybGlua1R5cGUyLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBoeXBlcmxpbmtUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEh5cGVybGlua1R5cGUyKCksIGh5cGVybGlua1R5cGUyLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlSW5pdGlhbHNUeXBlKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUluaXRpYWxzVHlwZV9NYXhMZW5ndGgoaW5pdGlhbHNUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPkluaXRpYWxzIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVJbml0aWFsc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBpbml0aWFsc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IGluaXRpYWxzVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldEluaXRpYWxzVHlwZSgpLCBpbml0aWFsc1R5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMYWdGb3JtYXRUeXBlKEJpZ0ludGVnZXIgbGFnRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGFnRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihsYWdGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVMYWdGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExBR19GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxhZyBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZUxhZ0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsYWdGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxhZ0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldExhZ0Zvcm1hdFR5cGUoKSwgbGFnRm9ybWF0VHlwZSwgTEFHX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24obGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUzIikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPkxldmVsaW5nIERlbGF5IEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IExFVkVMSU5HX0RFTEFZX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSgpLCBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVMZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEoQmlnSW50ZWdlciBsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihsZXZlbGluZ0RlbGF5Rm9ybWF0VHlwZTEsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZUxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBMRVZFTElOR19ERUxBWV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjExIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+TGV2ZWxpbmcgRGVsYXkgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgbGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGV2ZWxpbmdEZWxheUZvcm1hdFR5cGUxKCksIGxldmVsaW5nRGVsYXlGb3JtYXRUeXBlMSwgTEVWRUxJTkdfREVMQVlfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGUoU3RyaW5nIG1hbmFnZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVNYW5hZ2VyVHlwZV9NYXhMZW5ndGgobWFuYWdlclR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TWFuYWdlciBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTWFuYWdlclR5cGVfTWF4TGVuZ3RoKFN0cmluZyBtYW5hZ2VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbWFuYWdlclR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRNYW5hZ2VyVHlwZSgpLCBtYW5hZ2VyVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU1hdGVyaWFsTGFiZWxUeXBlKFN0cmluZyBtYXRlcmlhbExhYmVsVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTWF0ZXJpYWxMYWJlbFR5cGVfTWF4TGVuZ3RoKG1hdGVyaWFsTGFiZWxUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk1hdGVyaWFsIExhYmVsIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVNYXRlcmlhbExhYmVsVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG1hdGVyaWFsTGFiZWxUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBtYXRlcmlhbExhYmVsVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE1hdGVyaWFsTGFiZWxUeXBlKCksIG1hdGVyaWFsTGFiZWxUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUoU3RyaW5nIG5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZV9NYXhMZW5ndGgobmFtZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZSgpLCBuYW1lVHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlMShTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVOYW1lVHlwZTFfTWF4TGVuZ3RoKG5hbWVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OYW1lIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUxX01heExlbmd0aChTdHJpbmcgbmFtZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBuYW1lVHlwZTEubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROYW1lVHlwZTEoKSwgbmFtZVR5cGUxLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTmFtZVR5cGUyKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5hbWVUeXBlMl9NYXhMZW5ndGgobmFtZVR5cGUyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk5hbWUgVHlwZTI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTJfTWF4TGVuZ3RoKFN0cmluZyBuYW1lVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IG5hbWVUeXBlMi5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5hbWVUeXBlMigpLCBuYW1lVHlwZTIsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOYW1lVHlwZTMoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTmFtZVR5cGUzX01heExlbmd0aChuYW1lVHlwZTMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+TmFtZSBUeXBlMzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5hbWVUeXBlM19NYXhMZW5ndGgoU3RyaW5nIG5hbWVUeXBlMywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbmFtZVR5cGUzLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDI1NTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0TmFtZVR5cGUzKCksIG5hbWVUeXBlMywgbGVuZ3RoLCAyNTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlKEJpZ0ludGVnZXIgbmV3VGFza1N0YXJ0RGF0ZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU5ld1Rhc2tTdGFydERhdGVUeXBlX0VudW1lcmF0aW9uKG5ld1Rhc2tTdGFydERhdGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBORVdfVEFTS19TVEFSVF9EQVRFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5OZXcgVGFzayBTdGFydCBEYXRlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOZXdUYXNrU3RhcnREYXRlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIG5ld1Rhc2tTdGFydERhdGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKG5ld1Rhc2tTdGFydERhdGVUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXROZXdUYXNrU3RhcnREYXRlVHlwZSgpLCBuZXdUYXNrU3RhcnREYXRlVHlwZSwgTkVXX1RBU0tfU1RBUlRfREFURV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlTlRBY2NvdW50VHlwZShTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlTlRBY2NvdW50VHlwZV9NYXhMZW5ndGgobnRBY2NvdW50VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5OVCBBY2NvdW50IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVOVEFjY291bnRUeXBlX01heExlbmd0aChTdHJpbmcgbnRBY2NvdW50VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlpbnQgbGVuZ3RoID0gbnRBY2NvdW50VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE5UQWNjb3VudFR5cGUoKSwgbnRBY2NvdW50VHlwZSwgbGVuZ3RoLCA1MTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU91dGxpbmVOdW1iZXJUeXBlKFN0cmluZyBvdXRsaW5lTnVtYmVyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlT3V0bGluZU51bWJlclR5cGVfTWF4TGVuZ3RoKG91dGxpbmVOdW1iZXJUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPk91dGxpbmUgTnVtYmVyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdXRsaW5lTnVtYmVyVHlwZV9NYXhMZW5ndGgoU3RyaW5nIG91dGxpbmVOdW1iZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBvdXRsaW5lTnVtYmVyVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGxpbmVOdW1iZXJUeXBlKCksIG91dGxpbmVOdW1iZXJUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24ob3ZlcnRpbWVSYXRlRm9ybWF0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+T3ZlcnRpbWUgUmF0ZSBGb3JtYXQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciBvdmVydGltZVJhdGVGb3JtYXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdmVydGltZVJhdGVGb3JtYXRUeXBlKCksIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMShCaWdJbnRlZ2VyIG92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVPdmVydGltZVJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbihvdmVydGltZVJhdGVGb3JtYXRUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlT3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gT1ZFUlRJTUVfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5PdmVydGltZSBSYXRlIEZvcm1hdCBUeXBlMTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZU92ZXJ0aW1lUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBPVkVSVElNRV9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhvdmVydGltZVJhdGVGb3JtYXRUeXBlMSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEoKSwgb3ZlcnRpbWVSYXRlRm9ybWF0VHlwZTEsIE9WRVJUSU1FX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNBbGlhc1R5cGUoU3RyaW5nIHBob25ldGljQWxpYXNUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVQaG9uZXRpY0FsaWFzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNBbGlhc1R5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIE1heExlbmd0aCBjb25zdHJhaW50IG9mICc8ZW0+UGhvbmV0aWMgQWxpYXMgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljQWxpYXNUeXBlX01heExlbmd0aChTdHJpbmcgcGhvbmV0aWNBbGlhc1R5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHBob25ldGljQWxpYXNUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaG9uZXRpY0FsaWFzVHlwZSgpLCBwaG9uZXRpY0FsaWFzVHlwZSwgbGVuZ3RoLCA1MCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUGhvbmV0aWNzVHlwZShTdHJpbmcgcGhvbmV0aWNzVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUGhvbmV0aWNzVHlwZV9NYXhMZW5ndGgocGhvbmV0aWNzVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QaG9uZXRpY3MgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVBob25ldGljc1R5cGVfTWF4TGVuZ3RoKFN0cmluZyBwaG9uZXRpY3NUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwaG9uZXRpY3NUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUxMjsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRNYXhMZW5ndGhWaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGhvbmV0aWNzVHlwZSgpLCBwaG9uZXRpY3NUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUHJlZml4VHlwZShTdHJpbmcgcHJlZml4VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlUHJlZml4VHlwZV9NYXhMZW5ndGgocHJlZml4VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5QcmVmaXggVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeFR5cGVfTWF4TGVuZ3RoKFN0cmluZyBwcmVmaXhUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBwcmVmaXhUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDUwOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmVmaXhUeXBlKCksIHByZWZpeFR5cGUsIGxlbmd0aCwgNTAsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVJhdGVUYWJsZVR5cGUoQmlnSW50ZWdlciByYXRlVGFibGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSYXRlVGFibGVUeXBlX0VudW1lcmF0aW9uKHJhdGVUYWJsZVR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVJhdGVUYWJsZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUkFURV9UQUJMRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+UmF0ZSBUYWJsZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlUmF0ZVRhYmxlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJhdGVUYWJsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMocmF0ZVRhYmxlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmF0ZVRhYmxlVHlwZSgpLCByYXRlVGFibGVUeXBlLCBSQVRFX1RBQkxFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZShCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihyb2xsdXBUeXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlUm9sbHVwVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlJvbGx1cCBUeXBlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVSb2xsdXBUeXBlVHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHJvbGx1cFR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gUk9MTFVQX1RZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyhyb2xsdXBUeXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sbHVwVHlwZVR5cGUoKSwgcm9sbHVwVHlwZVR5cGUsIFJPTExVUF9UWVBFX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihzdGFuZGFyZFJhdGVGb3JtYXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5TdGFuZGFyZCBSYXRlIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUoKSwgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKEJpZ0ludGVnZXIgc3RhbmRhcmRSYXRlRm9ybWF0VHlwZTEsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxX0VudW1lcmF0aW9uKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBTVEFOREFSRF9SQVRFX0ZPUk1BVF9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlN0YW5kYXJkIFJhdGUgRm9ybWF0IFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3RhbmRhcmRSYXRlRm9ybWF0VHlwZTFfRW51bWVyYXRpb24oQmlnSW50ZWdlciBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFNUQU5EQVJEX1JBVEVfRk9STUFUX1RZUEUxX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHN0YW5kYXJkUmF0ZUZvcm1hdFR5cGUxKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSgpLCBzdGFuZGFyZFJhdGVGb3JtYXRUeXBlMSwgU1RBTkRBUkRfUkFURV9GT1JNQVRfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZShTdHJpbmcgc3ViamVjdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YmplY3RUeXBlX01heExlbmd0aChzdWJqZWN0VHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5TdWJqZWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVTdWJqZWN0VHlwZV9NYXhMZW5ndGgoU3RyaW5nIHN1YmplY3RUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJqZWN0VHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFN1YmplY3RUeXBlKCksIHN1YmplY3RUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlKFN0cmluZyBzdWJwcm9qZWN0TmFtZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVN1YnByb2plY3ROYW1lVHlwZV9NYXhMZW5ndGgoc3VicHJvamVjdE5hbWVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlN1YnByb2plY3QgTmFtZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU3VicHJvamVjdE5hbWVUeXBlX01heExlbmd0aChTdHJpbmcgc3VicHJvamVjdE5hbWVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSBzdWJwcm9qZWN0TmFtZVR5cGUubGVuZ3RoKCk7ICAKLQkJYm9vbGVhbiByZXN1bHQgPSBsZW5ndGggPD0gNTEyOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdWJwcm9qZWN0TmFtZVR5cGUoKSwgc3VicHJvamVjdE5hbWVUeXBlLCBsZW5ndGgsIDUxMiwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVGl0bGVUeXBlKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVRpdGxlVHlwZV9NYXhMZW5ndGgodGl0bGVUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBNYXhMZW5ndGggY29uc3RyYWludCBvZiAnPGVtPlRpdGxlIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUaXRsZVR5cGVfTWF4TGVuZ3RoKFN0cmluZyB0aXRsZVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJaW50IGxlbmd0aCA9IHRpdGxlVHlwZS5sZW5ndGgoKTsgIAotCQlib29sZWFuIHJlc3VsdCA9IGxlbmd0aCA8PSA1MTI7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0TWF4TGVuZ3RoVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFRpdGxlVHlwZSgpLCB0aXRsZVR5cGUsIGxlbmd0aCwgNTEyLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZShCaWdJbnRlZ2VyIHR5cGVUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZV9FbnVtZXJhdGlvbih0eXBlVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZSk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUoKSwgdHlwZVR5cGUsIFRZUEVfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMShCaWdJbnRlZ2VyIHR5cGVUeXBlMSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKHR5cGVUeXBlMSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGUxPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUxX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGUxLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFMV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTEpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlMSgpLCB0eXBlVHlwZTEsIFRZUEVfVFlQRTFfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTIoQmlnSW50ZWdlciB0eXBlVHlwZTIsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbih0eXBlVHlwZTIsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlMjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlMl9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlMiwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTJfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGUyKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTIoKSwgdHlwZVR5cGUyLCBUWVBFX1RZUEUyX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGUzKEJpZ0ludGVnZXIgdHlwZVR5cGUzLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24odHlwZVR5cGUzLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUyA9Ci0JCXdyYXBFbnVtZXJhdGlvblZhbHVlcwotCQkJKG5ldyBPYmplY3RbXSB7Ci0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIxNyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMTgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjE5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyNiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjI4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIyOSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjM3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCIzOCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMzkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQzIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ2IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI0NyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNDgiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQ5IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUyIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1MyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU1IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1NiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNTciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjU4IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI1OSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYxIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2MiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY0IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2NSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjY3IiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI2OCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNjkiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjcwIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3MSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjczIiksCi0JCQkJIG5ldyBCaWdJbnRlZ2VyKCI3NCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNzUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjc2IikKLQkJCSB9KTsKLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgRW51bWVyYXRpb24gY29uc3RyYWludCBvZiAnPGVtPlR5cGUgVHlwZTM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTNfRW51bWVyYXRpb24oQmlnSW50ZWdlciB0eXBlVHlwZTMsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBUWVBFX1RZUEUzX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHR5cGVUeXBlMyk7Ci0JCWlmICghcmVzdWx0ICYmIGRpYWdub3N0aWNzICE9IG51bGwpIAotCQkJcmVwb3J0RW51bWVyYXRpb25WaW9sYXRpb24oTXNwcm9qZWN0UGFja2FnZS5lSU5TVEFOQ0UuZ2V0VHlwZVR5cGUzKCksIHR5cGVUeXBlMywgVFlQRV9UWVBFM19fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNChCaWdJbnRlZ2VyIHR5cGVUeXBlNCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKHR5cGVUeXBlNCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5UeXBlIFR5cGU0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVHlwZVR5cGU0X0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgdHlwZVR5cGU0LCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVFlQRV9UWVBFNF9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh0eXBlVHlwZTQpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFR5cGVUeXBlNCgpLCB0eXBlVHlwZTQsIFRZUEVfVFlQRTRfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVUeXBlVHlwZTUoQmlnSW50ZWdlciB0eXBlVHlwZTUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbih0eXBlVHlwZTUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VHlwZSBUeXBlNTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVR5cGVUeXBlNV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHR5cGVUeXBlNSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFRZUEVfVFlQRTVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnModHlwZVR5cGU1KTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRUeXBlVHlwZTUoKSwgdHlwZVR5cGU1LCBUWVBFX1RZUEU1X19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVUlEVHlwZShTdHJpbmcgdWlkVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlVUlEVHlwZV9NYXhMZW5ndGgodWlkVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgTWF4TGVuZ3RoIGNvbnN0cmFpbnQgb2YgJzxlbT5VSUQgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVJRFR5cGVfTWF4TGVuZ3RoKFN0cmluZyB1aWRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWludCBsZW5ndGggPSB1aWRUeXBlLmxlbmd0aCgpOyAgCi0JCWJvb2xlYW4gcmVzdWx0ID0gbGVuZ3RoIDw9IDE2OwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydE1heExlbmd0aFZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVSURUeXBlKCksIHVpZFR5cGUsIGxlbmd0aCwgMTYsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVVuaXRUeXBlKEJpZ0ludGVnZXIgdW5pdFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVVuaXRUeXBlX0VudW1lcmF0aW9uKHVuaXRUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBVTklUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiOCIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Vbml0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVVbml0VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHVuaXRUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHVuaXRUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRVbml0VHlwZSgpLCB1bml0VHlwZSwgVU5JVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZShCaWdJbnRlZ2VyIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24odmFsdWVsaXN0U29ydE9yZGVyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlVmFsdWVsaXN0U29ydE9yZGVyVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBWQUxVRUxJU1RfU09SVF9PUkRFUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+VmFsdWVsaXN0IFNvcnQgT3JkZXIgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVZhbHVlbGlzdFNvcnRPcmRlclR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlLCBEaWFnbm9zdGljQ2hhaW4gZGlhZ25vc3RpY3MsIE1hcCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gVkFMVUVMSVNUX1NPUlRfT1JERVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh2YWx1ZWxpc3RTb3J0T3JkZXJUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYWx1ZWxpc3RTb3J0T3JkZXJUeXBlKCksIHZhbHVlbGlzdFNvcnRPcmRlclR5cGUsIFZBTFVFTElTVF9TT1JUX09SREVSX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsgCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlKEJpZ0ludGVnZXIgd2Vla1N0YXJ0RGF5VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbih3ZWVrU3RhcnREYXlUeXBlLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQHNlZSAjdmFsaWRhdGVXZWVrU3RhcnREYXlUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdFRUtfU1RBUlRfREFZX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNiIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5XZWVrIFN0YXJ0IERheSBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV2Vla1N0YXJ0RGF5VHlwZV9FbnVtZXJhdGlvbihCaWdJbnRlZ2VyIHdlZWtTdGFydERheVR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXRUVLX1NUQVJUX0RBWV9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLmNvbnRhaW5zKHdlZWtTdGFydERheVR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdlZWtTdGFydERheVR5cGUoKSwgd2Vla1N0YXJ0RGF5VHlwZSwgV0VFS19TVEFSVF9EQVlfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZVdvcmtDb250b3VyVHlwZShCaWdJbnRlZ2VyIHdvcmtDb250b3VyVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uKHdvcmtDb250b3VyVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0NvbnRvdXJUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTID0KLQkJd3JhcEVudW1lcmF0aW9uVmFsdWVzCi0JCQkobmV3IE9iamVjdFtdIHsKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjAiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjEiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjIiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjMiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjQiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjUiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjYiKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjciKSwKLQkJCQkgbmV3IEJpZ0ludGVnZXIoIjgiKQotCQkJIH0pOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBFbnVtZXJhdGlvbiBjb25zdHJhaW50IG9mICc8ZW0+V29yayBDb250b3VyIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrQ29udG91clR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrQ29udG91clR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBXT1JLX0NPTlRPVVJfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrQ29udG91clR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtDb250b3VyVHlwZSgpLCB3b3JrQ29udG91clR5cGUsIFdPUktfQ09OVE9VUl9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGUoQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24od29ya0Zvcm1hdFR5cGUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAc2VlICN2YWxpZGF0ZVdvcmtGb3JtYXRUeXBlX0VudW1lcmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiNSIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEZvcm1hdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0Zvcm1hdFR5cGVfRW51bWVyYXRpb24oQmlnSW50ZWdlciB3b3JrRm9ybWF0VHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfRk9STUFUX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMuY29udGFpbnMod29ya0Zvcm1hdFR5cGUpOwotCQlpZiAoIXJlc3VsdCAmJiBkaWFnbm9zdGljcyAhPSBudWxsKSAKLQkJCXJlcG9ydEVudW1lcmF0aW9uVmlvbGF0aW9uKE1zcHJvamVjdFBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtGb3JtYXRUeXBlKCksIHdvcmtGb3JtYXRUeXBlLCBXT1JLX0ZPUk1BVF9UWVBFX19FTlVNRVJBVElPTl9fVkFMVUVTLCBkaWFnbm9zdGljcywgY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlV29ya0dyb3VwVHlwZShCaWdJbnRlZ2VyIHdvcmtHcm91cFR5cGUsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWxpZGF0ZVdvcmtHcm91cFR5cGVfRW51bWVyYXRpb24od29ya0dyb3VwVHlwZSwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBzZWUgI3ZhbGlkYXRlV29ya0dyb3VwVHlwZV9FbnVtZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBXT1JLX0dST1VQX1RZUEVfX0VOVU1FUkFUSU9OX19WQUxVRVMgPQotCQl3cmFwRW51bWVyYXRpb25WYWx1ZXMKLQkJCShuZXcgT2JqZWN0W10gewotCQkJCSBuZXcgQmlnSW50ZWdlcigiMCIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMSIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMiIpLAotCQkJCSBuZXcgQmlnSW50ZWdlcigiMyIpCi0JCQkgfSk7Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIEVudW1lcmF0aW9uIGNvbnN0cmFpbnQgb2YgJzxlbT5Xb3JrIEdyb3VwIFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVXb3JrR3JvdXBUeXBlX0VudW1lcmF0aW9uKEJpZ0ludGVnZXIgd29ya0dyb3VwVHlwZSwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUy5jb250YWlucyh3b3JrR3JvdXBUeXBlKTsKLQkJaWYgKCFyZXN1bHQgJiYgZGlhZ25vc3RpY3MgIT0gbnVsbCkgCi0JCQlyZXBvcnRFbnVtZXJhdGlvblZpb2xhdGlvbihNc3Byb2plY3RQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrR3JvdXBUeXBlKCksIHdvcmtHcm91cFR5cGUsIFdPUktfR1JPVVBfVFlQRV9fRU5VTUVSQVRJT05fX1ZBTFVFUywgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0KLX0gLy9Nc3Byb2plY3RWYWxpZGF0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0L3NyYy9vcmcvZWNsaXBzZS9lcGYvbXNwcm9qZWN0L3V0aWwvTXNwcm9qZWN0WE1MSGVscGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWNkNzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9Nc3Byb2plY3RYTUxIZWxwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC51dGlsOwotCi1pbXBvcnQgamF2YS50ZXh0LkZpZWxkUG9zaXRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW50ZXJuYWwuWE1MQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLnV0aWwuWE1MVHlwZVV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotCi0vKioKLSAqIENyZWF0ZSBhIHNsaWdodGx5IGN1c3RvbWl6ZWQgWE1MSGVscGVySW1wbCBjbGFzcwotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1zcHJvamVjdFhNTEhlbHBlckltcGwgZXh0ZW5kcyBYTUxIZWxwZXJJbXBsIGltcGxlbWVudHMgWE1MSGVscGVyIHsKLQotCSBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgW10gRURBVEVfRk9STUFUUyA9Ci0JICB7Ci0JCW5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIiksCi0JICAgIG5ldyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWiIpLAotCSAgICBuZXcgU2FmZVNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGRaIikKLQkgIH07Ci0JIAotCSAvKioKLQkgICogQ29uc3RydWN0b3IKLQkgICogQHBhcmFtIHJlc291cmNlCi0JICAqLwotCXB1YmxpYyBNc3Byb2plY3RYTUxIZWxwZXJJbXBsKFhNTFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBib29sZWFuIHZhbHVlIHRvIGVpdGhlciAiMCIgb3IgIjEiCi0JICogQ29udmVydCBEYXRlVGltZSB2YWx1ZSB0byBiZSBjb21wYXRpYmxlIHdpdGggTVMgcHJvamVjdAotCSAqLwotCSBwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRmFjdG9yeSBmYWN0b3J5LCBFRGF0YVR5cGUgZGF0YVR5cGUsIE9iamVjdCB2YWx1ZSkKLQkgIHsKLQkJIAotLy8JCSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuaW1wbC5YTUxUeXBlRmFjdG9yeUltcGwgYUZhY3RvcnkgPSBuZXcgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLmltcGwuWE1MVHlwZUZhY3RvcnlJbXBsKCk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkJCQgZGF0YVR5cGUgbmFtZSA9ICIgKyBkYXRhVHlwZS5nZXROYW1lKCkpOwotCQkgCi0JCSBpZiAoIkJvb2xlYW4iLmVxdWFsc0lnbm9yZUNhc2UoZGF0YVR5cGUuZ2V0TmFtZSgpKSkgewotLy8JCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgbmVlZCB0byBvdmVycmlkZSB0aGUgQm9vbGVhbjogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSBTdHJpbmcgcnMgPSAiMCI7Ci0JCQkJIHRyeSB7Ci0JCQkJCSBCb29sZWFuIGJPYmplY3QgPSAoQm9vbGVhbil2YWx1ZTsKLQkJCQkJIGlmIChiT2JqZWN0LmJvb2xlYW5WYWx1ZSgpKQotCQkJCQkJIHJzID0gIjEiOwotCQkJCSB9IGNhdGNoIChFeGNlcHRpb24gZSkge30KLS8vCQkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBjb252ZXJ0ZWQgc3RyaW5nID0gIiArIHJzKTsKLQkJCQkgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9IGVsc2UgaWYgKCJEYXRlVGltZSIuZXF1YWxzSWdub3JlQ2FzZShkYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBEYXRlVGltZTogIiArIHZhbHVlLmdldENsYXNzKCkgKyAiLCIgKyB2YWx1ZSk7Ci0JCQkgaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkgICBTdHJpbmcgcnMgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJCSAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpCi0JCQkJICAgIHsKLQkJCQkgICAgICBycyA9IEVEQVRFX0ZPUk1BVFNbMF0uZm9ybWF0KChEYXRlKXZhbHVlKTsKLQkJCQkgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFhNTENhbGVuZGFyKXsKLQkJCQkJICBycyA9ICgoWE1MQ2FsZW5kYXIpdmFsdWUpLnRvU3RyaW5nKCk7Ci0JCQkJCSAgaW50IGlkeCA9IHJzLmluZGV4T2YoJy4nKTsKLQkJCQkJICBpZiAoaWR4ID4gMCkKLQkJCQkJCSAgcnMgPSBycy5zdWJzdHJpbmcoMCwgaWR4KTsKLQkJCQkJfQotLy8JCQkJICAgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIHN0cmluZyA9ICIgKyBycyk7Ci0JCQkJICAgcmV0dXJuIHJzOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZmFjdG9yeSArICIsIiArIGRhdGFUeXBlICsgIiwiICsgdmFsdWUpOwotCQkgU3RyaW5nIHJzID0gc3VwZXIuY29udmVydFRvU3RyaW5nKCBmYWN0b3J5LCAgZGF0YVR5cGUsICB2YWx1ZSk7Ci0vLwkJIFN5c3RlbS5vdXQucHJpbnRsbigiJCQkIGNvbnZlcnRlZCBzdHJpbmcgKG91dCkgPSAiICsgcnMpOwotCQkgcmV0dXJuIHJzOwotCSAgfQotCSAKLQkgLyoqCi0JICAqIENvbnZlcnQgdGhlIDEgb3IgMCBib29sZWFuIHZhbHVlIHRvIGFuIEJvb2xlYW4gT2JqZWN0Ci0JICAqIGNvbnZlcnQgdGhlIGRhdGV0aW1lIHN0cmluZyBpbnRvIFhNTENhbGVuZGFyIG9iamVjdC4KLQkgICovCi0JIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRmFjdG9yeSBlRmFjdG9yeSwgRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIHZhbHVlKQotCSAgewotCQkgaWYgKCJCb29sZWFuIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBCb29sZWFuOiAiICsgdmFsdWUpOwotCQkJIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgiMSIpKQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCQkgZWxzZQotCQkJCQkgcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkgfQotCQkJIHJldHVybiBudWxsOyAKLQkJIH0gZWxzZSBpZiAoIkRhdGVUaW1lIi5lcXVhbHNJZ25vcmVDYXNlKGVEYXRhVHlwZS5nZXROYW1lKCkpKSB7Ci0vLwkJCSBTeXN0ZW0ub3V0LnByaW50bG4oIiQkJCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBEYXRlVGltZTogIiArIHZhbHVlKTsKLQkJCSBpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCSAgIHJldHVybiBuZXcgWE1MQ2FsZW5kYXIoY29sbGFwc2VXaGl0ZVNwYWNlKHZhbHVlKSwgWE1MQ2FsZW5kYXIuREFURVRJTUUpOwotCQkJIH0KLQkJCSByZXR1cm4gbnVsbDsgCi0JCSB9Ci0JCSAKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgRUZhY3RvcnksIEVEYXRhVHlwZSwgdmFsdWUgPSAiICsgZUZhY3RvcnkgKyAiLCIgKyBlRGF0YVR5cGUgKyAiLCIgKyB2YWx1ZSk7Ci0JCSBPYmplY3Qgcm8gPSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKCBlRmFjdG9yeSwgIGVEYXRhVHlwZSwgIHZhbHVlKTsKLS8vCQkgU3lzdGVtLm91dC5wcmludGxuKCIkJCQgY29udmVydGVkIG9iamVjdCAoaW4pID0gIiArIHJvKTsKLQkJIHJldHVybiBybzsKLQkgIH0KLQkgCi0JIHByb3RlY3RlZCBTdHJpbmcgY29sbGFwc2VXaGl0ZVNwYWNlKFN0cmluZyB2YWx1ZSkKLQkgewotCQkgcmV0dXJuIFhNTFR5cGVVdGlsLm5vcm1hbGl6ZSh2YWx1ZSwgdHJ1ZSk7Ci0JIH0KLQkgIAotCSBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYWZlU2ltcGxlRGF0ZUZvcm1hdCBleHRlbmRzIFNpbXBsZURhdGVGb3JtYXQKLQkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgU2FmZVNpbXBsZURhdGVGb3JtYXQoU3RyaW5nIHBhdHRlcm4pCi0JICAgIHsKLQkgICAgICBzdXBlcihwYXR0ZXJuKTsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0ZSBwYXJzZShTdHJpbmcgc291cmNlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLQkgICAgewotCSAgICAgIHJldHVybiBzdXBlci5wYXJzZShzb3VyY2UpOwotCSAgICB9Ci0KLQkgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoRGF0ZSBkYXRlLCBTdHJpbmdCdWZmZXIgdG9BcHBlbmRUbywgRmllbGRQb3NpdGlvbiBwb3MpCi0JICAgIHsKLQkgICAgICBTdHJpbmdCdWZmZXIgcmVzdWx0ID0gc3VwZXIuZm9ybWF0KGRhdGUsIHRvQXBwZW5kVG8sIHBvcyk7Ci0vLwkgICAgICByZXN1bHQuaW5zZXJ0KHJlc3VsdC5sZW5ndGgoKSAtIDIsICI6Iik7Ci0JICAgICAgcmV0dXJuIHJlc3VsdDsKLQkgICAgfQotCSAgfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5tc3Byb2plY3Qvc3JjL29yZy9lY2xpcHNlL2VwZi9tc3Byb2plY3QvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDNkODguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdC9zcmMvb3JnL2VjbGlwc2UvZXBmL21zcHJvamVjdC91dGlsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgTWljcm9zb2Z0IFByb2plY3QgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTc0MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDRmYjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWZlYXR1cmVQbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm07IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNDk2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbAotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFhODhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgd2l0aCBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CdWlsZCBpZDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVkOGIzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHdlbGNvbWUueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIG5sLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL2VjbGlwc2UzMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9kYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhM2ZiZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCBtZWQgRU1GIEdFRiBHTUYKLQotYmx1cmI9RWNsaXBzZS1wbGF0Zm9ybVxuXAotXG5cCi1WZXJzaW9uOiAzLjMuMFxuXAotQnlnLWlkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLUJlc1x1MDBmOGcgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1EZXR0ZSBwcm9kdWt0IGluZGVob2xkZXIgc29mdHdhcmUsIGRlciBlciB1ZHZpa2xldCBhZlxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ3N2ZhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIG1pdCBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb246IDMuMy4wXG5cCi1CdWlsZC1JRDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotQmVzdWNoZW4gU2llIGRpZSBXZWJzZWl0ZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtLlxuXAotXG5cCi1EaWVzZXMgUHJvZHVrdCBlbnRoXHUwMGU0bHQgU29mdHdhcmUsIGRpZSB2b24gZGVyXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykgZW50d2lja2VsdCB3dXJkZS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzM4YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2VzL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCBjb24gRU1GIEdFRiBHTUYKLQotYmx1cmI9UGxhdGFmb3JtYSBFY2xpcHNlXG5cCi1cblwKLVZlcnNpXHUwMGYzbjogMy4zLjBcblwKLUlEIGRlIGJ1aWxkOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IENvbGFib3JhZG9yZXMgZGUgRWNsaXBzZSB5IG90cm9zIDIwMDAsIDIwMDcuICBSZXNlcnZhZG9zIHRvZG9zIGxvcyBkZXJlY2hvcy5cblwKLVZpc2l0ZSBsYSBwXHUwMGUxZ2luYSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLUVzdGUgcHJvZHVjdG8gaW5jbHV5ZSBzb2Z0d2FyZSBkZXNhcnJvbGxhZG8gcG9yIGxhXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvZnIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTgyNDdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGxhdGZvcm0gMy4zLjAgYXZlYyBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNpb24gOiAzLjMuMFxuXAotSUQgZGUgY29uc3RydWN0aW9uIDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXRleiBsYSBwYWdlIHN1aXZhbnRlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1DZSBwcm9kdWl0IGNvbnRpZW50IGRlcyBsb2dpY2llbHMgZFx1MDBlOXZlbG9wcFx1MDBlOXMgcGFyXG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjU1YjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9pdC9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPVBpYXR0YWZvcm1hIEVjbGlwc2UgMy4zLjAgY29uIEVNRiBHRUYgR01GCi0KLWJsdXJiPVBpYXR0YWZvcm1hIEVjbGlwc2VcblwKLVxuXAotVmVyc2lvbmU6IDMuMy4wXG5cCi1JZCBidWlsZDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBjb250cmlidXRvciBFY2xpcHNlIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1WaXNpdGFyZSBsJ2luZGlyaXp6byBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtXG5cCi1cblwKLVF1ZXN0byBwcm9kb3R0byBpbmNsdWRlIHNvZnR3YXJlIHN2aWx1cHBhdG8gZGFcblwKLUFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmODM2OTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2phL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCB3aXRoIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgUGxhdGZvcm1cblwKLVxuXAotXHUzMGQwXHUzMGZjXHUzMGI4XHUzMGU3XHUzMGYzOiAzLjMuMFxuXAotXHUzMGQzXHUzMGViXHUzMGM5IElEOiBJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BsYXRmb3JtIFx1MzA5Mlx1NTNjMlx1NzE2N1x1MzAwMlxuXAotXG5cCi1cdTMwNTNcdTMwNmVcdTg4ZmRcdTU0YzFcdTMwNmJcdTMwNmZcdTMwMDFBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLylcblwKLVx1MzA2Ylx1MzA4OFx1MzA4YVx1OTU4Ylx1NzY3YVx1MzA1NVx1MzA4Y1x1MzA1Zlx1MzBiZFx1MzBkNVx1MzBjOFx1MzBhNlx1MzBhN1x1MzBhMlx1MzA0Y1x1NTQyYlx1MzA3ZVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL2tvL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhZjlkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwva28vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFx1ZDUwY1x1YjdhYlx1ZDNmYyAzLjMuMChFTUYgR0VGIEdNRiBcdWQzZWNcdWQ1NjgpCi0KLWJsdXJiPUVjbGlwc2UgXHVkNTBjXHViN2FiXHVkM2ZjXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogMy4zLjBcblwKLVx1YmU0Y1x1YjRkYyBJRDogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybSBcdWM2ZjlcdWMwYWNcdWM3NzRcdWQyYjhcdWI5N2MgXHViYzI5XHViYjM4XHVkNTU4XHVjMmVkXHVjMmRjXHVjNjI0LlxuXAotXG5cCi1cdWM3NzQgXHVjODFjXHVkNDg4XHVjNWQwXHViMjk0IEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pXHVjNWQwXHVjMTFjIFxuXAotXHVhYzFjXHViYzFjXHVkNTVjIFx1YzE4Y1x1ZDUwNFx1ZDJiOFx1YzZlOFx1YzViNFx1YWMwMCBcdWQzZWNcdWQ1NjhcdWI0MThcdWM1YjQgXHVjNzg4XHVjMmI1XHViMmM4XHViMmU0LgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0YjMyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIDMuMy4wIGNvbSBFTUYgR0VGIEdNRgotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVZlcnNcdTAwZTNvOiAzLjMuMFxuXAotSUQgZGEgQ29uc3RydVx1MDBlN1x1MDBlM286IEkyMDA3MDYyNS0xNTAwXG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA3LiBUb2RvcyBvcyBkaXJlaXRvcyByZXNlcnZhZG9zLlxuXAotVmlzaXRlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvcGxhdGZvcm1cblwKLVxuXAotRXN0ZSBwcm9kdXRvIGluY2x1aSBzb2Z0d2FyZSBkZXNlbnZvbHZpZG8gcGVsYVxuXAotQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnLwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3J1L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcnUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MWYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvcnUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25Db3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1mZWF0dXJlTmFtZT1cdTA0MWZcdTA0M2JcdTA0MzBcdTA0NDJcdTA0NDRcdTA0M2VcdTA0NDBcdTA0M2NcdTA0MzAgRWNsaXBzZSAzLjMuMCBcdTA0NDEgRU1GIEdFRiBHTUYKLQotYmx1cmI9XHUwNDFmXHUwNDNiXHUwNDMwXHUwNDQyXHUwNDQ0XHUwNDNlXHUwNDQwXHUwNDNjXHUwNDMwIEVjbGlwc2VcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiAzLjMuMFxuXAotXHUwNDE4XHUwNDE0IFx1MDQzYVx1MDQzZVx1MDQzY1x1MDQzZlx1MDQzZVx1MDQzZFx1MDQzZVx1MDQzMlx1MDQzYVx1MDQzODogSTIwMDcwNjI1LTE1MDBcblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBcdTA0MTJcdTA0NDFcdTA0MzUgXHUwNDNmXHUwNDQwXHUwNDMwXHUwNDMyXHUwNDMwIFx1MDQzN1x1MDQzMFx1MDQ0OVx1MDQzOFx1MDQ0OVx1MDQzNVx1MDQzZFx1MDQ0Yi5cblwKLVx1MDQxZlx1MDQzZVx1MDQ0MVx1MDQzNVx1MDQ0Mlx1MDQzOFx1MDQ0Mlx1MDQzNSBcdTA0NDFcdTA0NDJcdTA0NDBcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NDZcdTA0NDMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTA0MTIgXHUwNDQxXHUwNDNlXHUwNDQxXHUwNDQyXHUwNDMwXHUwNDMyIFx1MDQzNFx1MDQzMFx1MDQzZFx1MDQzZFx1MDQzZVx1MDQzM1x1MDQzZSBcdTA0M2ZcdTA0NDBcdTA0M2VcdTA0MzRcdTA0NDNcdTA0M2FcdTA0NDJcdTA0MzAgXHUwNDMyXHUwNDQ1XHUwNDNlXHUwNDM0XHUwNDM4XHUwNDQyIFx1MDQzYVx1MDQzZVx1MDQzNCwgXHUwNDQwXHUwNDMwXHUwNDM3XHUwNDQwXHUwNDMwXHUwNDMxXHUwNDNlXHUwNDQyXHUwNDMwXHUwNDNkXHUwNDNkXHUwNDRiXHUwNDM5XG5cCi1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vbmwvemgvQ04vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDlhZTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWZlYXR1cmVOYW1lPVx1NWUyNlx1NjcwOSBFTUYgR0VGIEdNRiBcdTc2ODQgRWNsaXBzZSBQbGF0Zm9ybSAzLjMuMAotCi1ibHVyYj1FY2xpcHNlIFBsYXRmb3JtXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYTMuMy4wXG5cCi1cdTVkZTVcdTRmNWNcdTcyNDhcdTY3MmNcdTY4MDdcdThiYzZcdWZmMWFJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1cdThiZjdcdThiYmZcdTk1ZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTY3MmNcdTRlYTdcdTU0YzFcdTUzMDVcdTU0MmJcdTc1MzEgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25cdWZmMDhodHRwOi8vd3d3LmFwYWNoZS5vcmcvXHVmZjA5XHU1ZjAwXHU1M2QxXHU3Njg0XHU4ZjZmXHU0ZWY2XG4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNzUxYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybSAzLjMuMCB3aXRoIEVNRiBHRUYgR01GCi0KLWJsdXJiPUVjbGlwc2UgXHU1ZTczXHU1M2YwXG5cCi1cblwKLVx1NzI0OFx1NjcyY1x1ZmYxYTMuMy4wXG5cCi1cdTVlZmFcdTdmNmUgSURcdWZmMWFJMjAwNzA2MjUtMTUwMFxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1cdThhY2JcdTkwMjBcdThhMmEgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wbGF0Zm9ybVxuXAotXG5cCi1cdTY3MmNcdTc1MjJcdTU0YzFcdTUzMDVcdTU0MmIgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gaHR0cDovL3d3dy5hcGFjaGUub3JnL1xuXAotXHU2MjQwXHU5NThiXHU3NjdjXHU3Njg0XHU4ZWRmXHU5YWQ0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTQ2NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUGxhdGZvcm0gRmVhdHVyZQotZmVhdHVyZVBsdWdpbk5hbWVOTD1FUEYgUGxhdGZvcm0gRmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA5MjQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS93ZWxjb21lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTx3ZWxjb21lUGFnZSAKLQl0aXRsZT0iRWNsaXBzZSBNb2RlbGluZyBGcmFtZXdvcmsgKEVNRikiPgotCi08aW50cm8+RU1GIGlzIGEgSmF2YS9YTUwgZnJhbWV3b3JrIGZvciBnZW5lcmF0aW5nIHRvb2xzIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMKLWJhc2VkIG9uIHNpbXBsZSBjbGFzcyBtb2RlbHMuCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVNRj88L2I+Ci0JUmVhZCB0aGUgPHRvcGljIGhyZWY9Ii9vcmcuZWNsaXBzZS5lbWYuZG9jL3JlZmVyZW5jZXMvb3ZlcnZpZXcvRU1GLmh0bWwiPm92ZXJ2aWV3PC90b3BpYz4gYXJ0aWNsZSB0byBsZWFybiBhYm91dCBFTUYuCi0JVGhlbiwgZm9sbG93IHRoZSA8dG9waWMgaHJlZj0iL29yZy5lY2xpcHNlLmVtZi5kb2MvdHV0b3JpYWxzL2NsaWJtb2QvY2xpYm1vZC5odG1sIj50dXRvcmlhbDwvdG9waWM+IHRvIHNlZSBob3cgZWFzeSBpdCBpcyB0byBnZW5lcmF0ZSBhIG1vZGVsLgotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCVRoaXMgaXMgdGhlIG9mZmljaWFsIHNpdGUgb2YgRU1GOiA8dG9waWMgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mPC90b3BpYz4KLTwvaXRlbT4KLQotPC93ZWxjb21lUGFnZT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2U2ZTZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3MTg3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UuaGVscC5iYXNlLAotIG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YjgyNDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9SZXBvcnRpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzhjYzhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1JlcG9ydGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9pY29ucy9XZWJQdWJsaXNoLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmRjZjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL1dlYlB1Ymxpc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvaWNvbnMvZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5ODMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL2ljb25zL2Z1bGwvd2l6YmFuL1B1Ymxpc2hDb25maWd1cmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYThiMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCRUdJTiBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRGVmYXVsdCBQdWJsaXNoIFBhdGgKLSMgISEgRE8gTk9UIFRSQU5TTEFURSBUSEUgRk9MTE9XSU5HIExJTkUgISEKLXB1Ymxpc2hQYXRoPTx1c2VyLmhvbWU+LzxhcHAubmFtZT4vUHVibGlzaAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIERlZmF1bHQgRmVlZGJhY2sgVVJMCi1mZWVkYmFja1VSTD1odHRwOi8vd3d3LnB1Ymxpc2hlZF93ZWJzaXRlLmNvbS9mZWVkYmFjawotCi0jIFB1Ymxpc2ggQ29uZmlndXJhdGlvbiBBY3Rpb24KLXB1Ymxpc2hDb25maWdBY3Rpb249JlB1Ymxpc2guLi4KLXB1Ymxpc2hDb25maWdBY3Rpb25Ub29sdGlwPVB1Ymxpc2ggYSB3ZWIgc2l0ZSBmb3IgYSBjb25maWd1cmF0aW9uCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1yb290UGFnZU5hbWU9UHVibGlzaGluZy9Ccm93c2luZwotcm9sZURpYWdyYW1QYWdlTmFtZT1Sb2xlIERpYWdyYW0KLWFjdGl2aXR5RGlhZ3JhbVBhZ2VOYW1lPUFjdGl2aXR5IERpYWdyYW1zCi1wdWJsaXNoaW5nT3B0aW9ucz1QdWJsaXNoaW5nIE9wdGlvbnMKLQotIyBQdWJsaXNoaW5nIEFjdGlvbnMKLWNvbmZpZ0FjdGlvblNldD1Db25maWd1cmF0aW9uCi1jb25maWdNZW51PSZDb25maWd1cmF0aW9uCi0KLSMgUHJpbnQgQ29uZmlndXJhdGlvbiBBY3Rpb24KLXByaW50Q29uZmlnQWN0aW9uPVByaW50Ci0KLSMgdGhlIHRpdGxlIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLSNkb24ndCBkZWZpbmUgaGVyZSwgbGV0IHVzZXIgc3BlY2lmeSBpdC4KLSN0aXRsZT1PcGVuVVAvQmFzaWMKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzcyMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uLXBvaW50Ci0gICAgICAgICBpZD0icHVibGlzaENvbmZpZ1dpemFyZCIKLSAgICAgICAgIG5hbWU9IlB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYWl0b24gV2l6YXJkIEV4dGVuc2lvbiIKLSAgICAgICAgIHNjaGVtYT0ic2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZCIgLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCIKLSAgICAgICAgICAgIGxhYmVsPSIlY29uZmlnQWN0aW9uU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgICAgPG1lbnUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5tZW51LmNvbmZpZ3VyYXRpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJWNvbmZpZ01lbnUiCi0gICAgICAgICAgICAgICBwYXRoPSJhZGRpdGlvbnMiLz4gIAotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLmFjdGlvbnMuUHVibGlzaENvbmZpZ0FjdGlvbiIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY29uZmlndXJhdGlvbl9wdWJsaXNoX2NvbnRleHQiCi0gICAgICAgICAgICAgICBpY29uPSJpY29ucy9XZWJQdWJsaXNoLmdpZiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5hY3Rpb25zLlB1Ymxpc2giCi0gICAgICAgICAgICAgICBsYWJlbD0iJXB1Ymxpc2hDb25maWdBY3Rpb24iCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubWVudS5jb25maWd1cmF0aW9uL2FkZGl0aW9ucyIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIi8+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucGVyc3BlY3RpdmVFeHRlbnNpb25zIj4KLSAgICAgIDxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8L2FjdGlvblNldD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkJyb3dzaW5nUGVyc3BlY3RpdmUiPgotICAgICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8L2FjdGlvblNldD4KLSAgICAgIDwvcGVyc3BlY3RpdmVFeHRlbnNpb24+ICAgICAgCi0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotICAgICAgPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkNvbmZpZ0FjdGlvblNldCI+Ci0gICAgICAgICA8cGFydAotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuZWRpdG9ycy5Db25maWd1cmF0aW9uRWRpdG9yIj4KLSAgICAgICAgIDwvcGFydD4KLSAgICAgIDwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVyb290UGFnZU5hbWUiLz4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVyb2xlRGlhZ3JhbVBhZ2VOYW1lIi8+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLkFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLkFjdGl2aXR5RGlhZ3JhbVByZWZlcmVuY2VQYWdlIgotCQkgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLlB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSIKLQkJICAgIG5hbWU9IiVhY3Rpdml0eURpYWdyYW1QYWdlTmFtZSIvPiAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kTGlzdGVuZXJzIj4KLSAgICAgIDxjb21tYW5kTGlzdGVuZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzLkRlbGV0ZUNvbmZpZ0NvbW1hbmRMaXN0ZW5lciIvPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NjaGVtYS9QdWJsaXNoQ29uZmlnV2l6YXJkLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNWI4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc2NoZW1hL1B1Ymxpc2hDb25maWdXaXphcmQuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkiIGlkPSJwdWJsaXNoQ29uZmlnV2l6YXJkIiBuYW1lPSJQdWJsaXNoIE1ldGhvZCBDb25mZ3VyYXRpb24gV2l6YXJkIEV4dGVuc2lvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFbmFibGVzIGEgcGx1Zy1pbiB0byBleHRlbmQgdGhlIFB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24gd2l6YXJkIGJ5IHJlcGxhY2luZyBleGlzdGluZyB3aXphcmQgcGFnZXMgb3IgYWRkaW5nIG5ldyBvbmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmRFeHRlbmRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmRFeHRlbmRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZFBhZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0icHVibGlzaGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSB3aXphcmQgZXh0ZW5kZXIuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnRzICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuSVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZsdDsvY29kZSZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9IndpemFyZFBhZ2UiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIHdpemFyZCBwYWdlLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2UmbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgZXh0ZW5zaW9uIC0gJnF1b3Q7cmVwbGFjZSZxdW90OyBvciAmcXVvdDtuZXcmcXVvdDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRvIGJlIHJlcGxhY2VkIG9yIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIGluc2VydGluZyBhIG5ldyB3aXphcmQgcGFnZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGluc2VydGlvbiB0eXBlIGZvciBhIG5ldyB3aXphcmQgcGFnZSAtICZxdW90O2JlZm9yZSZxdW90OyBvciAmcXVvdDthZnRlciZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGlzaGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb25maWd1cmF0aW9uIHB1Ymxpc2hlci4gVGhpcyBjbGFzcyBtdXN0IGV4dGVuZHMgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VmcnZpY2VzLkFic3RyYWN0UHVibGlzaE1hbmFnZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgZXh0ZW5zaW9uIHBvaW50IGNhbiBiZSB1c2VkOiAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHVibGlzaENvbmZpZ1dpemFyZCZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmRFeHRlbmRlcgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5NeVB1Ymxpc2hDb25maWdXaXphcmRFeHRlbmRlciZxdW90OyZndDsKLSAgICAgICAgICZsdDt3aXphcmRQYWdlCi0gICAgICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLk15U2VsZWN0UHVibGlzaE9wdGlvbnNQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O3JlcGxhY2UmcXVvdDsKLSAgICAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLlNlbGVjdFB1Ymxpc2hPcHRpb25zUGFnZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7d2l6YXJkUGFnZQotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkcy5NeU5ld1B1Ymxpc2hQYWdlJnF1b3Q7Ci0gICAgICAgICAgICAgICB0eXBlPSZxdW90O25ldyZxdW90OwotICAgICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuU2VsZWN0UHVibGlzaE9wdGlvbnNQYWdlJnF1b3Q7ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBpbnNlcnQ9JnF1b3Q7YWZ0ZXImcXVvdDsvJmd0OyAgICAgICAgICAgICAgIAotICAgICAgICAgJmx0O3B1Ymxpc2hlcgotICAgICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuTXlDb25maWdQdWJsaXNoZXImcXVvdDsvJmd0OwotICAgICAgJmx0Oy93aXphcmRFeHRlbmRlciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIAotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hlckVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFiNjg3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGVyRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS53aXphcmRzLkFic3RyYWN0UHVibGlzaFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgcHVibGlzaGVyIGV4dGVuc2lvbiBwb2ludAotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hlckVsZW1lbnQgewotCUJ1bmRsZSBidW5kbGU7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgaWNvbjsKLQlwcml2YXRlIFN0cmluZyB3aXphcmRDbGFzczsKLQlwcml2YXRlIFN0cmluZyBtYW5hZ2VyQ2xhc3M7CQotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBQdWJsaXNoZXJFbGVtZW50IGV4dGVuc2lvbiBwb2ludAotCSAqIEBwYXJhbSBidW5kbGUgQnVuZGxlIHRoZSBidW5kbGUgdGhhdCBsYW9kIHRoZSBlbGVtZW50IGRlZmluaXRpb24gZmlsZQotCSAqIEBwYXJhbSBpZCBTdHJpbmcKLQkgKiBAcGFyYW0gbGFiZWwgU3RyaW5nCi0JICogQHBhcmFtIGljb24gU3RyaW5nIGljb24gcGF0aAotCSAqIEBwYXJhbSB3aXphcmRDbGFzcyBTdHJpbmcgdGhlIHB1Ymxpc2hpbmcgd2l6YXJkIGNsYXNzLiAKLQkgKiBUaGlzIGNsYXNzIG11c3QgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy53aXphcmRzLkFic3RyYWN0UHVibGlzaFdpemFyZCBjbGFzcwotCSAqIEBwYXJhbSBtYW5hZ2VyQ2xhc3MgU3RyaW5nIHRoZSBwdWJsaXNoIG1hbWFnZXIgY2xhc3MuIAotCSAqIHRoaXMgY2xhc3MgbXVzdCBleHRlbmRzIHRoZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIGNsYXNzLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoZXJFbGVtZW50KEJ1bmRsZSBidW5kbGUsIFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgaWNvbiwgU3RyaW5nIHdpemFyZENsYXNzLCBTdHJpbmcgbWFuYWdlckNsYXNzKSB7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOyAKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMuaWNvbiA9IGljb247Ci0JCXRoaXMud2l6YXJkQ2xhc3MgPSB3aXphcmRDbGFzczsKLQkJdGhpcy5tYW5hZ2VyQ2xhc3MgPSBtYW5hZ2VyQ2xhc3M7CQkKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gQWJzdHJhY3RQdWJsaXNoV2l6YXJkCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQdWJsaXNoV2l6YXJkIGdldFB1Ymxpc2hXaXphcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xhc3MgY2xhenogPSBidW5kbGUubG9hZENsYXNzKHdpemFyZENsYXNzKTsKLQkJcmV0dXJuIChBYnN0cmFjdFB1Ymxpc2hXaXphcmQpIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIGdldCB0aGUgcHVibGlzaCBtYW5hZ2VyCi0JICogCi0JICogQHJldHVybiBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyCi0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBnZXRQdWJsaXNoTWFuYWdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlDbGFzcyBjbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MobWFuYWdlckNsYXNzKTsKLQkJcmV0dXJuIChBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyKSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGlkIG9mIHRoZSBwdWJsaXNoZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7IAotCQlyZXR1cm4gaWQ7IAotCX0KLQkKLQkvKioKLQkgKiBnZXQgdGhlIGxhYmVsIG9mIHRoZSBwdWJsaXNoZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0JCi0JLyoqCi0JICogZ2V0IHRoZSBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgcHVibGlzaGVyIGljb24uCi0JICogCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJaWYgKCBpY29uID09IG51bGwgfHwgaWNvbi5sZW5ndGgoKSA9PSAwICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlVUkwgaW5zdGFsbFVSTCA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgaWNvblVSTCA9IG5ldyBVUkwoaW5zdGFsbFVSTCwgaWNvbik7Ci0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwoaWNvblVSTCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwMzk0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUHVibGlzaGluZ1VJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJyb3dzaW5nTGF5b3V0U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyBmb3IgdGhlIHB1Ymxpc2hpbmcgVUkgcGx1Z2luLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1VJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBQdWJsaXNoaW5nVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGluZ1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5jb3JlLnBsdWdpbi5BYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkKLQkJdXBkYXRlTGF5b3V0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHVibGlzaGluZ1VJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogdXBkYXRlIHRoZSBwdWJsaXNoaW5nL2Jyb3dzaW5nIGxheW91dCBzZXR0aW5ncy4KLQkgKiBDYWxsIHRoaXMgbWV0aG9kIHdoZW4gZXZlciBwdWJsaXNoaW5nL2Jyb3dzaW5nIHJlbGF0ZWQgcHJlZmVyZW5jZXMgYXJlIGNoYW5nZWQuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVMYXlvdXRTZXR0aW5ncygpIAotCXsKLQkJLy8gY2FsbCB0aGUgbGlicmFyeSBVSSB0byB1cGRhdGUgdGhlIHNldHRpbmdzIGZpcnN0Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkudXBkYXRlTGF5b3V0U2V0dGluZ3MoKTsKLQkJCi0JCS8vIGdldCB0aGUgc2tpbiBzZXR0aW5nIGZyb20gcHJlZmVyZW5jZQotCQkvL2Jvb2xlYW4gcHVibGlzaFVub3BlbkFjdGl2aXR5ZGQgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpOwkKLQkJLy9ib29sZWFuIHB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uID0gTGlicmFyeVVJUHJlZmVyZW5jZXMuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKTsKLQkJYm9vbGVhbiBleHRyYURlc2NyaXB0b3JJbmZvID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpOwotCQkvL2Jvb2xlYW4gdXNlbmV3RXh0ZW5kcyA9IExpYnJhcnlQcmVmZXJlbmNlcy5nZXRVc2VOZXdFeHRlbmRzU2VtYW50aWNzKCk7Ci0JCQotCQkvL0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24ocHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24pOwotCQkvL0Jyb3dzaW5nTGF5b3V0U2V0dGluZ3MuSU5TVEFOQ0Uuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5ZGQocHVibGlzaFVub3BlbkFjdGl2aXR5ZGQpOwotCQlCcm93c2luZ0xheW91dFNldHRpbmdzLklOU1RBTkNFLnNldFNob3dFeHRyYUluZm9Gb3JEZXNjcmlwdG9ycyhleHRyYURlc2NyaXB0b3JJbmZvKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL1B1Ymxpc2hpbmdVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M5N2RlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9QdWJsaXNoaW5nVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIFVJIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHVibGlzaGluZ1VJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jbGFzcwotCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFB1Ymxpc2hpbmdVSVJlc291cmNlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbmZpZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hXZWJTaXRlR3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBicm93c2luZ0xheW91dEdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aXRsZUFuZExpbmtzR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvb2tBbmRGZWVsR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpdGxlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhbm5lckltYWdlTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFib3V0SFRNTExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmZWVkYmFja1VSTExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnbG9zc2FyeUFuZEluZGV4R3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hHbG9zc2FyeUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoSW5kZXhMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdmFsaWRhdGlvbkdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGVja0V4dGVybmFsTGlua3NMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEJyb2tlbkxpbmtzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpYWdyYW1Hcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEFjdGl2aXR5RGV0YWlsRGlhZ3JhbXNMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaEV4dGVuZGVkQWN0aXZpdHlEaWFncmFtc0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsYXlvdXRHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRXh0cmFEZXNjcmlwdG9ySW5mb0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoRW1wdHlDYXRlZ29yaWVzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGlyTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcEdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGR5bmFtaWNXZWJBcHBSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5jbHVkZVNlYXJjaENoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzdGluYXRpb25EaXJlY3RvcnlHcm91cF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGF0aExhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VEZWZhdWx0UGF0aENoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1c2VEZWZhdWx0RmVlZGJhY2tMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5jbHVkZVNlYXJjaGVzTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsaWVudFNpZGVTZWFyY2hSYWRpb0J1dHRvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyU2lkZVNlYXJjaFJhZGlvQnV0dG9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZVdBUkZpbGVMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXNlQXBwbGV0Q2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNpdGVDdXN0b21pemF0aW9uV2l6YXJkUGFnZV90aXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNpdGVDdXN0b21pemF0aW9uV2l6YXJkUGFnZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGhlbWVBbmRTa2luR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3dCYW5uZXJDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0U2tpbkxhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXBhYmlsaXR5UGF0dGVybnNfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGl2ZXJ5UHJvY2Vzc2VzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkVmlld3NJbmZvX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRWaWV3U2FtZVZpZXdJbmZvX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZWZlcmVuY2VQYWdlX2RlZmF1bHRQYXRoX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbGVtZW50U3BhY2luZ0dyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YXNrc0hvcml6b25hbFNwYWNpbmdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza3NWZXJ0aWNhbFNwYWNpbmdMYWJlbF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWxlbWVudFRleHRMYWJlbEdyb3VwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXhMaW5lT2ZUZXh0TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRIb3Jpem9uYWxTcGFjaW5nRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZFZlcnRpY2FsU3BhY2luZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRUZXh0TGluZXNFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uZmlybVBhdGhEaWFsb2dfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG92ZXJ3cml0ZURpYWxvZ190ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FuY2VsUHVibGlzaENvbmZpZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB2aWV3UmVwb3J0RXJyb3JfdGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNzaW5nVmlld0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdFB1Ymxpc2hFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkUGF0aEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJldmlld0NvbmZpZ0Vycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHZpZXdSZXBvcnRFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsZXRlRmlsZXNFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVEaXJFcnJvcl9yZWFzb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuQnJvd3NlckVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdlYkFwcE5hbWVFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3ZWJBcHBOYW1lQ2hhcnNFcnJvcl9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93UmVsYXRlZERlc2NyaXB0b3JzX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkQWJvdXRQYXRoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEFib3V0UGF0aENoYXJzRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0RGVmYXVsdEFjdGl2aXR5VGFiX3RleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmY2EyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZAotcHVibGlzaENvbmZpZ1dpemFyZF90aXRsZT1QdWJsaXNoIE1ldGhvZCBDb25maWd1cmF0aW9uCi0KLSMgU2VsZWN0IE1ldGhvZCBDb25maWd1cmF0aW9uIFdpemFyZCBQYWdlCi1zZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgY29uZmlndXJhdGlvbgotc2VsZWN0Q29uZmlnV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMgdGhlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgd2hpY2ggeW91IHdvdWxkIGxpa2UgdG8gcHVibGlzaC4KLWNvbmZpZ0xhYmVsX3RleHQ9TWV0aG9kIGNvbmZpZ3VyYXRpb246Ci0KLSMgU2VsZWN0IE1ldGhvZCBDb25maWd1cmF0aW9uIENvbnRlbnQgV2l6YXJkIFBhZ2UKLXNlbGVjdENvbnRlbnRXaXphcmRQYWdlX3RpdGxlPVNlbGVjdCBtZXRob2QgY29uZmlndXJhdGlvbiBjb250ZW50Ci1zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gY29udGVudCB0byBwdWJsaXNoLiBZb3UgY2FuIGNob29zZSB0byBwdWJsaXNoIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbiBvciBvbmx5IGEgZmV3IHNlbGVjdCBwcm9jZXNzZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi1wdWJsaXNoQ29uZmlnUmFkaW9CdXR0b25fdGV4dD1QdWJsaXNoIHRoZSBlbnRpcmUgY29uZmlndXJhdGlvbgotcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uX3RleHQ9UHVibGlzaCBzZWxlY3RlZCBwcm9jZXNzZXM6Ci1pbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dD1QdWJsaXNoIHJlZmVyZW5jZWQgYmFzZSBwcm9jZXNzZXMKLQotIyBTZWxlY3QgUHVibGlzaGluZyBPcHRpb25zIFdpemFyZCBQYWdlCi1zZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IHB1Ymxpc2hpbmcgb3B0aW9ucwotc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RleHQ9U2VsZWN0IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuIFRoZXNlIG9wdGlvbnMgd2lsbCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgbG9vayBhbmQgYmVoYXZpb3Igb2YgdGhlIHB1Ymxpc2hlZCB3ZWJzaXRlLgotdGl0bGVBbmRMaW5rc0dyb3VwX3RleHQ9VGl0bGUgYW5kIGxpbmtzCi10aXRsZUxhYmVsX3RleHQ9VGl0bGU6Ci1hYm91dEhUTUxMYWJlbF90ZXh0PUFib3V0IGNvbnRlbnQ6Ci1mZWVkYmFja1VSTExhYmVsX3RleHQ9RmVlZGJhY2sgVVJMOgotZ2xvc3NhcnlBbmRJbmRleEdyb3VwX3RleHQ9R2xvc3NhcnkgYW5kIGluZGV4Ci1wdWJsaXNoR2xvc3NhcnlMYWJlbF90ZXh0PVB1Ymxpc2ggZ2xvc3NhcnkKLXB1Ymxpc2hJbmRleExhYmVsX3RleHQ9UHVibGlzaCBpbmRleAotbG9va0FuZEZlZWxHcm91cF90ZXh0PUxvb2sgYW5kIGZlZWwKLWJhbm5lckltYWdlTGFiZWxfdGV4dD1CYW5uZXIgaW1hZ2U6Ci12YWxpZGF0aW9uR3JvdXBfdGV4dD1WYWxpZGF0aW9uCi1jaGVja0V4dGVybmFsTGlua3NMYWJlbF90ZXh0PUNoZWNrIGV4dGVybmFsIGh5cGVybGlua3MKLWNvbnZlcnRCcm9rZW5MaW5rc0xhYmVsX3RleHQ9Q29udmVydCBicm9rZW4gaHlwZXJsaW5rcyB0byBwbGFpbiB0ZXh0Ci1kaWFncmFtR3JvdXBfdGV4dD1EaWFncmFtcwotcHVibGlzaEFjdGl2aXR5RGV0YWlsRGlhZ3JhbXNMYWJlbF90ZXh0PVB1Ymxpc2ggYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBtYW51YWxseSBjcmVhdGVkCi1wdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dD1QdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW1zIGZvciB1bm1vZGlmaWVkIGFjdGl2aXR5IGV4dGVuc2lvbnMKLWxheW91dEdyb3VwX3RleHQ9TGF5b3V0Ci1wdWJsaXNoTGlnaHRXZWlnaHRUcmVlTGFiZWxfdGV4dD1TaG93IHJlbGF0aW9uc2hpcCBzdWItZm9sZGVycyBpbiBuYXZpZ2F0aW9uIHRyZWVzCi1wdWJsaXNoRXh0cmFEZXNjcmlwdG9ySW5mb0xhYmVsX3RleHQ9SW5jbHVkZSBtZXRob2QgY29udGVudCBpbiBkZXNjcmlwdG9yIHBhZ2VzCi1wdWJsaXNoRW1wdHlDYXRlZ29yaWVzTGFiZWxfdGV4dD1QdWJsaXNoIGNhdGVnb3JpZXMgd2l0aCBubyBjYXRlZ29yaXplZCBlbGVtZW50cwotcHVibGlzaFdlYlNpdGVHcm91cF90ZXh0PVB1Ymxpc2hlZCB3ZWJzaXRlCi1icm93c2luZ0xheW91dEdyb3VwX3RleHQ9QnJvd3NpbmcgTGF5b3V0Ci1zaG93UmVsYXRlZERlc2NyaXB0b3JzX3RleHQ9SW5jbHVkZSBsaW5rcyB0byByZWxhdGVkIGRlc2NyaXB0b3JzIGluIHJvbGUsIHRhc2sgYW5kIHdvcmsgcHJvZHVjdCBwYWdlcwotc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZV90ZXh0PVNob3cgdGFzayBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWVzCi1zZWxlY3REZWZhdWx0QWN0aXZpdHlUYWJfdGV4dD1EZWZhdWx0IHRhYiBmb3IgYWN0aXZpdHkgcGFnZXM6Ci0KLSMgU2VsZWN0IERlc3RpbmF0aW9uIFdpemFyZCBQYWdlCi1zZWxlY3REZXN0aW5hdGlvbldpemFyZFBhZ2VfdGl0bGU9U2VsZWN0IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQgd2Vic2l0ZSBmb3JtYXQKLXNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90ZXh0PVNlbGVjdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGFuZCBmb3JtYXQgZm9yIHRoZSBwdWJsaXNoZWQgd2Vic2l0ZS4KLWRpckxhYmVsX3RleHQ9RGlyZWN0b3J5Ogotd2ViQXBwR3JvdXBfdGV4dD1XZWJzaXRlIGZvcm1hdAotc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uX3RleHQ9U3RhdGljIHdlYiBzaXRlCi1keW5hbWljV2ViQXBwUmFkaW9CdXR0b25fdGV4dD1KYXZhIEVFIHdlYiBhcHBsaWNhdGlvbiBwYWNrYWdlZCBpbiBhIFdBUiBmaWxlIChyZXF1aXJlcyBKYXZhIFNlcnZsZXQgMi4zIG9yIGFib3ZlIGNvbXBsaWFudCBzZXJ2bGV0IGNvbnRhaW5lcikKLWluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0PUluY2x1ZGUgc2VhcmNoIGNhcGFiaWxpdHkKLXdlYkFwcGxpY2F0aW9uTmFtZUxhYmVsX3RleHQ9V2ViIGFwcGxpY2F0aW9uIG5hbWU6Ci0KLWRlc3RpbmF0aW9uRGlyZWN0b3J5R3JvdXBfdGV4dD1EZXN0aW5hdGlvbiBkaXJlY3RvcnkKLXBhdGhMYWJlbF90ZXh0PVBhdGg6Ci11c2VEZWZhdWx0UGF0aENoZWNrYm94X3RleHQ9VXNlIGRlZmF1bHQgcGF0aAotdXNlRGVmYXVsdEZlZWRiYWNrTGFiZWxfdGV4dD1Vc2UgZGVmYXVsdCBmZWVkYmFjayBVUkwKLQotaW5jbHVkZVNlYXJjaENoZWNrYm94X3RleHQ9SW5jbHVkZSBzZWFyY2ggY2FwYWJpbGl0eSAocmVxdWlyZXMgY29udGFpbmVyIGZvciBzZXJ2bGV0KQotaW5jbHVkZVNlYXJjaGVzTGFiZWxfdGV4dD1JbmNsdWRlIHNlYXJjaCBjYXBhYmlsaXR5Ci1jbGllbnRTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dD0gQ2xpZW50IHNpZGUgc2VhcmNoIChyZXF1aXJlcyBKYXZhIGFwcGxldCBzdXBwb3J0IGluIGJyb3dzZXIpCi1zZXJ2ZXJTaWRlU2VhcmNoUmFkaW9CdXR0b25fdGV4dD0gU2VydmVyIHNpZGUgc2VhcmNoIChyZXF1aXJlcyBDb250YWluZXIgZm9yIHNlcnZsZXQpCi1nZW5lcmF0ZVdBUkZpbGVMYWJlbF90ZXh0PUdlbmVyYXRlIFdBUiAoV2ViIEFSY2hpdmUpIGZpbGUKLQotdXNlQXBwbGV0Q2hlY2tib3hfdGV4dD1TdXBwb3J0IHZpZXcgY3VzdG9taXphdGlvbiAocmVxdWlyZXMgSmF2YSBhcHBsZXQgc3VwcG9ydCBpbiBicm93c2VyKQotCi1zaXRlQ3VzdG9taXphdGlvbldpemFyZFBhZ2VfdGl0bGU9Q3VzdG9taXplIFdlYnNpdGUKLXNpdGVDdXN0b21pemF0aW9uV2l6YXJkUGFnZV90ZXh0PUN1c3RvbWl6ZSBXZWJzaXRlIGxvb2sgYW5kIGZlZWwKLXRoZW1lQW5kU2tpbkdyb3VwX3RleHQ9VGhlbWUgYW5kIFNraW4KLXNob3dCYW5uZXJDaGVja2JveF90ZXh0PVNob3cgYmFubmVyCi1zZWxlY3RTa2luTGFiZWxfdGV4dD1TZWxlY3Qgc2tpbjoKLQotIyBGSVhNRSEgU2hvdWxkIHRoZXNlIGJlIHdhcm5pbmcgbWVzc2FnZXM/Ci0jIEluZm9ybWF0aW9uIE1lc3NhZ2UKLWludmFsaWRWaWV3c0luZm9fbXNnPVRoZSBmb2xsb3dpbmcgdmlldyhzKSBpbiBjb25maWd1cmF0aW9uICcnezB9Jycgd2lsbCBub3QgYmUgcHVibGlzaGVkOgotaW52YWxpZFZpZXdDb250cmlidXRvckluZm9fbXNnPXswfTogVGhlIHZpZXcgaXMgYSBjb250cmlidXRvcgotaW52YWxpZFZpZXdTYW1lVmlld0luZm9fbXNnPXswfTogVGhpcyB2aWV3IGlzIGEgZHVwbGljYXRlIG9mIGFub3RoZXIgdmlldwotCi1jYXBhYmlsaXR5UGF0dGVybnNfdGV4dD1DYXBhYmlsaXR5IFBhdHRlcm5zCi1kZWxpdmVyeVByb2Nlc3Nlc190ZXh0PURlbGl2ZXJ5IFByb2Nlc3NlcwotCi0jIFB1Ymxpc2hpbmcgUHJlZmVyZW5jZSBQYWdlCi1wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0PURlZmF1bHQgcGF0aDoKLQotIyBSb2xlIERpYWdyYW0gUHJlZmVyZW5jZSBQYWdlCi1lbGVtZW50U3BhY2luZ0dyb3VwX3RleHQ9U3BhY2luZyBiZXR3ZWVuIHRhc2sgYW5kIHdvcmsgcHJvZHVjdCBlbGVtZW50cwotdGFza3NIb3Jpem9uYWxTcGFjaW5nTGFiZWxfdGV4dD1Ib3Jpem9udGFsIHNwYWNpbmc6Ci10YXNrc1ZlcnRpY2FsU3BhY2luZ0xhYmVsX3RleHQ9VmVydGljYWwgc3BhY2luZzoKLWVsZW1lbnRUZXh0TGFiZWxHcm91cF90ZXh0PUVsZW1lbnQgbGFiZWxzCi1tYXhMaW5lT2ZUZXh0TGFiZWxfdGV4dD1NYXhpbXVtIGxpbmUgb2YgdGV4dDoKLQotIyBSb2xlIERpYWdyYW0gUHJlZmVyZW5jZSBQYWdlIEVycm9yIE1lc3NhZ2VzCi1pbnZhbGlkSG9yaXpvbmFsU3BhY2luZ0Vycm9yX21zZz1Ib3Jpem9udGFsIHNwYWNpbmcgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmFuZ2luZyBmcm9tIHswfSB0byB7MX0uCi1pbnZhbGlkVmVydGljYWxTcGFjaW5nRXJyb3JfbXNnPVZlcnRpY2FsIHNwYWNpbmcgbXVzdCBiZSBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmFuZ2luZyBmcm9tIHswfSB0byB7MX0uCi1pbnZhbGlkVGV4dExpbmVzRXJyb3JfbXNnPU51bWJlciBvZiB0ZXh0IGxpbmVzIG11c3QgYmUgYW4gaW50ZWdlciB3aXRoIHZhbHVlIHJhbmdpbmcgZnJvbSB7MH0gdG8gezF9LgotCi0jIENvbmZpcm1hdGlvbiBEaWFsb2dzCi1wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlPVB1Ymxpc2ggTWV0aG9kIENvbmZpZ3VyYXRpb24KLWNvbmZpcm1QYXRoRGlhbG9nX3RleHQ9VGhlIGRlc3RpbmF0aW9uIHBhdGggaGFzIGJlZW4gcmVzb2x2ZWQgdG8gJyd7MH0nJy4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLW92ZXJ3cml0ZURpYWxvZ190ZXh0PVRoZSBkZXN0aW5hdGlvbiBwYXRoICcnezB9JycgYWxyZWFkeSBleGlzdHMuIEFsbCBmaWxlcyBpbiB0aGUgZm9sZGVyIHdpbGwgYmUgZGVsZXRlZC4gRG8geW91IHdhbnQgdG8gcHJvY2VlZD8KLWNhbmNlbFB1Ymxpc2hDb25maWdfbXNnPVRoZSBwdWJsaXNoaW5nIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQuCi0KLSMgRXJyb3IgRGlhbG9ncwotcHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlPVByZXZpZXcgUHVibGlzaGVkIE1ldGhvZCBDb25maWd1cmF0aW9uCi12aWV3UmVwb3J0RXJyb3JfdGl0bGU9VmlldyBQdWJsaXNoaW5nIFJlcG9ydAotCi0jIEVycm9yIE1lc3NhZ2VzCi1taXNzaW5nVmlld0Vycm9yX21zZz1JVVBQMDEwMEU6IFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCB2aWV3LiBFZGl0IHRoZSBjb25maWd1cmF0aW9uIGFuZCBhZGQgYSB2aWV3LCBvciBzZWxlY3QgYW5vdGhlciBjb25maWd1cmF0aW9uLgotY2Fubm90UHVibGlzaEVycm9yX21zZz1JVVBQMDEwMUU6IFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBwdWJsaXNoZWQuCi1pbnZhbGlkUGF0aEVycm9yX21zZz1JVVBQMDEwMkU6IFRoZSBkZXN0aW5hdGlvbiBwYXRoIGlzIGJsYW5rIG9yIGludmFsaWQuCi1pbnZhbGlkUGF0aENoYXJzRXJyb3JfbXNnPUlVUFAwMTAzRTogVGhlIGRlc3RpbmF0aW9uIHBhdGggY2Fubm90IGNvbnRhaW4gdGhlc2UgY2hhcmFjdGVyczogXFwgIyAqID8gIiA8ID4gfCAhICUgLwotcHVibGlzaENvbmZpZ0Vycm9yX21zZz1JVVBQMDEwNEU6IFRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uIHdhcyBub3QgcHVibGlzaGVkIHN1Y2Nlc3NmdWxseS4KLXByZXZpZXdDb25maWdFcnJvcl9tc2c9SVVQUDAxMDVFOiBVbmFibGUgdG8gb3BlbiBhbiBIVE1MIGJyb3dzZXIgdG8gcHJldmlldyB0aGUgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi12aWV3UmVwb3J0RXJyb3JfbXNnPUlVUFAwMTA2RTogVW5hYmxlIHRvIG9wZW4gYW4gSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHB1Ymxpc2hpbmcgcmVwb3J0Lgotd2ViQXBwTmFtZUVycm9yX21zZz1JVVBQMDEwN0U6IFRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLXdlYkFwcE5hbWVDaGFyc0Vycm9yX21zZz1JVVBQMDEwOEU6IFRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBjYW5ub3QgY29udGFpbiB0aGVzZSBjaGFyYWN0ZXJzOiBcXCAjICogPyAiIDwgPiB8ICEgJSAvCi1pbnZhbGlkQWJvdXRQYXRoRXJyb3JfbXNnPUlVUFAwMTA5RTogVGhlIHBhdGggaXMgaW52YWxpZC4KLWludmFsaWRBYm91dFBhdGhDaGFyc0Vycm9yX21zZz1JVVBQMDExMEU6IFRoZSBwYXRoIGNhbm5vdCBjb250YWluIHRoZXNlIGNoYXJhY3RlcnM6ICMgKiA/ICIgPCA+IHwgISAlIC8KLQotIyBFcnJvciBSZWFzb25zICYgUmVjb21tZW5kZWQgQWN0aW9ucwotcHVibGlzaENvbmZpZ0Vycm9yX3JlYXNvbj1DbGljayBEZXRhaWxzIGZvciBtb3JlIGluZm9ybWF0aW9uLgotZGVsZXRlRmlsZXNFcnJvcl9yZWFzb249VGhlIGRlc3RpbmF0aW9uIHBhdGggJyd7MH0nJyBjb250YWlucyBmaWxlcyB0aGF0IGNhbm5vdCBiZSBkZWxldGVkLlxuXG5DbG9zZSB0aGlzIGRpYWxvZyBhbmQgc3BlY2lmeSBhbm90aGVyIHBhdGguCi1jcmVhdGVEaXJFcnJvcl9yZWFzb249VGhlIGRlc3RpbmF0aW9uIHBhdGggJyd7MH0nJyBjYW5ub3QgYmUgY3JlYXRlZC5cblxuQ2xvc2UgdGhpcyBkaWFsb2cgYW5kIHNwZWNpZnkgYW5vdGhlciBwYXRoLgotb3BlbkJyb3dzZXJFcnJvcl9yZWFzb249VGhlIGRlZmF1bHQgSFRNTCBicm93c2VyIG9uIHRoaXMgc3lzdGVtIGNhbm5vdCBiZSBkZXRlY3RlZCBvciBsb2NhdGVkLlxuXG5DbG9zZSB0aGlzIGRpYWxvZyBhbmQgb3BlbiB0aGUgZmlsZSAnJ3swfScnIG1hbnVhbGx5IHdpdGggYW4gSFRNTCBicm93c2VyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hDb25maWdBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL1B1Ymxpc2hDb25maWdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhOTkxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvYWN0aW9ucy9QdWJsaXNoQ29uZmlnQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHMuUHVibGlzaENvbmZpZ1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogSW52b2tlcyB0aGUgUHVibGlzaCBNZXRob2QgQ29uZmlndXJhdGlvbiB3aXphcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hDb25maWdBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjaW5pdChJV29ya2JlbmNoV2luZG93KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNydW4oSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCS8vIEluc3RhbnRpYXRlIGFuZCBpbml0aWFsaXplIHRoZSBQdWJsaXNoIE1ldGhvZCBDb25maWd1cmFpdG9uCi0JCQkvLyB3aXphcmQuCi0JCQlQdWJsaXNoQ29uZmlnV2l6YXJkIHdpemFyZCA9IG5ldyBQdWJsaXNoQ29uZmlnV2l6YXJkKCk7Ci0JCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBudWxsKTsKLQotCQkJLy8gSW5zdGFudGlhdGUgdGhlIHdpemFyZCBjb250YWluZXIgd2l0aCB0aGUgd2l6YXJkIGFuZCBvcGVuIGl0LgotCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJIkVycm9yIHB1Ymxpc2hpbmcgY29udGVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZSNzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24sIElTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNThlZTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIHRoZSBwdWJsaXNoaW5nIFVJLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdPcGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9pbnRlcm5hbC93aXphcmRzL1B1Ymxpc2hDb25maWdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzNzM5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvaW50ZXJuYWwvd2l6YXJkcy9QdWJsaXNoQ29uZmlnT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFZpZXdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgcHVibGlzaCBjb25maWd1cmF0aW9uIG9wZXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaENvbmZpZ09wZXJhdGlvbiBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0RpYWxvZ190aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9yZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX0NPTkZJR19FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmV2aWV3Q29uZmlnRXJyb3JfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVWSUVXX0NPTkZJR19FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJldmlld0NvbmZpZ0Vycm9yX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnZpZXdSZXBvcnRFcnJvcl90aXRsZTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdfUkVQT1JUX0VSUk9SX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy52aWV3UmVwb3J0RXJyb3JfbXNnOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04gPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMub3BlbkJyb3dzZXJFcnJvcl9yZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19DQU5DRUxfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbmNlbFB1Ymxpc2hDb25maWdfbXNnOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgcHVibGlzaE1ncjsKLQotCXByaXZhdGUgU3RyaW5nIHB1Ymxpc2hlZF91cmw7Ci0KLQlwcml2YXRlIFN0cmluZyByZXBvcnRfdXJsOwotCi0JcHJpdmF0ZSBNc2dEaWFsb2cgbXNnRGlhbG9nOwotCi0JcHJpdmF0ZSBFeGNlcHRpb24gcnVuRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaENvbmZpZ09wZXJhdGlvbihBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wdWJsaXNoTWdyID0gcHVibGlzaE1ncjsKLQkJdGhpcy5tc2dEaWFsb2cgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdmlldyBidWlsZGVyLgotCSAqIAotCSAqIEByZXR1cm4gQWJzdHJhY3RWaWV3QnVpbGRlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFZpZXdCdWlsZGVyIGdldFZpZXdCdWlsZGVyKCkgewotCQlyZXR1cm4gdGhpcy5wdWJsaXNoTWdyLmdldFZpZXdCdWlsZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB1cmwgZm9yIHRoZSBwdWJsaXNoZWQgc2l0ZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKSB7Ci0JCXJldHVybiBwdWJsaXNoZWRfdXJsOwotCX0KLQotCS8qKgotCSAqIHJ1biB0aGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gdGhlIHB1Ymxpc2hpbmcgdGFzay4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvcgotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlydW5FeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJbW9uaXRvcgotCQkJCQkuc2V0VGFza05hbWUoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCQlyZXBvcnRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoUmVwb3J0VXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5FeGNlcHRpb24gPSBlOwotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoY2FuY2VsZWQpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlJbmZvKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHB1Ymxpc2hlZF91cmwgPT0gbnVsbCB8fCByZXBvcnRfdXJsID09IG51bGwpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihQVUJMSVNIX0NPTkZJR19FUlJPUl9USVRMRSwKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJUFVCTElTSF9DT05GSUdfRVJST1JfUkVBU09OLCBydW5FeGNlcHRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJUHVibGlzaE9wdGlvbnMgb3B0aW9ucyA9IHB1Ymxpc2hNZ3IuZ2V0Vmlld0J1aWxkZXIoKQotCQkJCQkJLmdldE9wdGlvbnMoKTsKLQkJCQlpZiAob3B0aW9ucyBpbnN0YW5jZW9mIFB1Ymxpc2hIVE1MT3B0aW9ucykgewotCQkJCQlpZiAoISgoUHVibGlzaEhUTUxPcHRpb25zKSBvcHRpb25zKQotCQkJCQkJCS5pc1B1Ymxpc2hEeW5hbWljV2ViQXBwKCkpIHsKLQkJCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkJCQkJCWlmIChvcGVuQnJvd3NlcihwdWJsaXNoZWRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQkJCVN0cmluZyByZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJCQluZXcgT2JqZWN0W10geyBwdWJsaXNoZWRfdXJsIH0pOwotCQkJCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFJFVklFV19DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJCQlQUkVWSUVXX0NPTkZJR19FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBMYXVuY2ggYSBIVE1MIGJyb3dzZXIgdG8gdmlldyB0aGUgcmVwb3J0IG9uIHRoZSBwdWJsaXNoZWQKLQkJCQkvLyBzaXRlLgotCQkJCWlmIChvcGVuQnJvd3NlcihyZXBvcnRfdXJsKSA9PSBmYWxzZSkgewotCQkJCQlTdHJpbmcgcmVhc29uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCi0JCQkJCQkJT1BFTl9CUk9XU0VSX0VSUk9SX1JFQVNPTiwKLQkJCQkJCQluZXcgT2JqZWN0W10geyByZXBvcnRfdXJsIH0pOwotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFZJRVdfUkVQT1JUX0VSUk9SX1RJVExFLAotCQkJCQkJCVZJRVdfUkVQT1JUX0VSUk9SX01TRywgcmVhc29uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIG9wZW4gYSBicm93c2VyIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgc2l0ZSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBicm93c2VyIG9wZW5lZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkJyb3dzZXIoZmluYWwgU3RyaW5nIHVybCkgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIExhdW5jaCB0aGUgZGVmYXVsdCBIVE1MIHZpZXdlciB0byBkaXNwbGF5IHRoZSBIVE1MIHBhZ2UuCi0JCQkvLyBPbiBMaW51eCwgdGhpcyBjYW4ndCBsYXVuY2ggdXJscywgb25seSBsb2NhbCBmaWxlcyBjYW4gYmUKLQkJCS8vIGxhdW5jaGVkLgotCQkJLy8gU29ycnkgSSBoYXZlIHVzZSBpbnRlcm5hbCBjbGFzcyBoZXJlLgotCQkJLy8gaG9wZSBFY2xpcHNlLm9yZyBjYW4gaGF2ZSBhIHB1YmxpYyBhcGkgdG8gZG8gc28uCi0JCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzdWNjZXNzID0gUHJvZ3JhbS5sYXVuY2godXJsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gSUJyb3dzZXIgYnJvd3NlciA9Ci0JCQkJLy8gb3JnLmVjbGlwc2UuaGVscC5pbnRlcm5hbC5icm93c2VyLkJyb3dzZXJNYW5hZ2VyCi0JCQkJLy8gLmdldEluc3RhbmNlKCkuY3JlYXRlQnJvd3Nlcih0cnVlKTsKLQkJCQkvLyBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0JCQkJLy8gdHJ5IHsKLQkJCQkvLyBicm93c2VyLmRpc3BsYXlVUkwodXJsKTsKLQkJCQkvLyBzdWNjZXNzID0gdHJ1ZTsKLQkJCQkvLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQotCQkJCS8vIDE1NTQ5MCAtIENhbm5vdCBkZXRlY3RlZCBkZWZhdWx0IGJyb3dzZXIgd2hlbiBwcmV2aWV3Ci0JCQkJLy8gcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gb24gTGludXgKLQkJCQkvLyBjaGFuZ2VkIHRvIHVzZSBzd3QgYnJvd3NlcgotCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCS8vIC8vIG9wZW4gYW5vdGhlciBzd3QgYnJvd3NlciBzaW5jZSB3ZSBoYXZlIG5vIChzaW1wbGUpCi0JCQkJCQkvLyB3YXkgb2YgY3JlYXRpbmcgYSBzeXN0ZW0gZGVmYXVsdCBicm93c2VyCi0JCQkJCQkvLyAvLyB0aGUgRWNsaXBzZSBndXlzIGhpZGUgYWxsIHRoZSBnb29kIGFwaXMgYXMKLQkJCQkJCS8vIGludGVybmFsCi0JCQkJCQlTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCgpOwotCQkJCQkJc2hlbGwuc2V0VGV4dCh1cmwpOwotCQkJCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQkJCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJCQkJc2hlbGwuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJCQlCcm93c2VyIHBvcHVwX2Jyb3dzZXIgPSBuZXcgQnJvd3NlcihzaGVsbCwgU1dULk5PTkUpOwotCQkJCQkJcG9wdXBfYnJvd3Nlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgKLQkJCQkJCQkJR3JpZERhdGEuRklMTF9CT1RIIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMCi0JCQkJCQkJCQkJfCBHcmlkRGF0YS5HUkFCX1ZFUlRJQ0FMKSk7Ci0JCQkJCQlwb3B1cF9icm93c2VyLnNldFVybCh1cmwpOwotCQkJCQkJc2hlbGwub3BlbigpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJc3VjY2VzcyA9IGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3MzhmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciBtYW5hZ2luZyB0aGUgcHVibGlzaGluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvQWN0aXZpdHlEaWFncmFtUHJlZmVyZW5jZVBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9BY3Rpdml0eURpYWdyYW1QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzRlNGUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9BY3Rpdml0eURpYWdyYW1QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkucHJlZmVyZW5jZXMuTGlicmFyeVVJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGRpYWdyYW0gb3B0aW9ucwotICogCi0gKiBAYXV0aG9yIFBob25nIExlCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eURpYWdyYW1QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCWludCBOVU1fQ09MVU1OID0gMzsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZDsKLQotCXByaXZhdGUgQnV0dG9uIGN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uOwotCQotCXB1YmxpYyBBY3Rpdml0eURpYWdyYW1QcmVmZXJlbmNlUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCS8vIENyZWF0ZSBhY3Rpdml0eSBkaWFncmFtIGdyb3VwLgotCQlHcm91cCBhY3Rpdml0eURpYWdyYW1Hcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJlZmVyZW5jZV9BY3Rpdml0eV9EaWFncmFtLCAxKTsKLQotCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbiA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCWFjdGl2aXR5RGlhZ3JhbUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdF9mb3JfcHVibGlzaF9leHRlbmRfYWN0aXZpdHlfZGlhZ3JhbSk7Ci0KLQkJLy8gQ3JlYXRlIGFjdGl2aXR5IGRldGF0aWwgZGlhZ3JhbSBncm91cC4KLQkJR3JvdXAgYWN0aXZpdHlEZXRhaWxEaWFncmFtR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByZWZlcmVuY2VfQWN0aXZpdHlfRGV0YWlsX0RpYWdyYW0sIDEpOwotCi0JCWN0cmxfcHVibGlzaF91bm9wZW5fYWN0aXZpdHlkZCA9IGNyZWF0ZUNoZWNrYm94KAotCQkJCWFjdGl2aXR5RGV0YWlsRGlhZ3JhbUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQpOwotCQkKLS8vCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLS8vCQljdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQKLS8vCQkJCS5zZXRUZXh0KEF1dGhvcmluZ1VJUmVzb3VyY2VzLnByb21wdGZvcl9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkX3RleHQpOyAKLS8vCi0vLwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotLy8JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotLy8JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0vLwkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkLnNldExheW91dERhdGEoZGF0YSk7Ci0vLwkJCi0vLwkJY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLS8vCQljdHJsX3B1Ymxpc2hfYWRfZm9yX2FjdGl2aXR5X2V4dGVuc2lvbgotLy8JCQkJLnNldFRleHQoQXV0aG9yaW5nVUlSZXNvdXJjZXMucHJvbXB0X2Zvcl9wdWJsaXNoX2V4dGVuZF9hY3Rpdml0eV9kaWFncmFtKTsgCi0vLwkJCQkKLQkJCi0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0cygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKSBNZXRob2QgZGVjbGFyZWQgb24gUHJlZmVyZW5jZVBhZ2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCUxpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gdXBkYXRlIHRoZSBzZXR0aW5ncyBmb3IgYnJvd3NpbmcKLQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJLy8gSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBzdG9yZS5zZXRWYWx1ZShMaWJyYXJ5UHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BST01QVF9GT1JfTElCUkFSWV9BVF9TVEFSVFVQLAotCQkvLyBjdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQuZ2V0U2VsZWN0aW9uKCkpOwotCQlMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5zZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZChjdHJsX3B1Ymxpc2hfdW5vcGVuX2FjdGl2aXR5ZGQKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCUxpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRGVmYXVsdHMoKSB7Ci0JCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCWN0cmxfcHVibGlzaF9hZF9mb3JfYWN0aXZpdHlfZXh0ZW5zaW9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBzdGF0ZXMgb2YgdGhlIGNvbnRyb2xzIGZyb20gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCS8vIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJLy8gY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkLnNldFNlbGVjdGlvbihzdG9yZS5nZXRCb29sZWFuKExpYnJhcnlQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUFJPTVBUX0ZPUl9MSUJSQVJZX0FUX1NUQVJUVVApKTsKLQkJY3RybF9wdWJsaXNoX3Vub3Blbl9hY3Rpdml0eWRkLnNldFNlbGVjdGlvbihMaWJyYXJ5VUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlkZCgpKTsKLQkJY3RybF9wdWJsaXNoX2FkX2Zvcl9hY3Rpdml0eV9leHRlbnNpb24KLQkJCQkuc2V0U2VsZWN0aW9uKExpYnJhcnlVSVByZWZlcmVuY2VzCi0JCQkJCQkuZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnByZWZlcmVuY2VzLkNvbW1vblByZWZQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIExpYnJhcnlVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvRGVsZXRlQ29uZmlnQ29tbWFuZExpc3RlbmVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvRGVsZXRlQ29uZmlnQ29tbWFuZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NmY5NmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL0RlbGV0ZUNvbmZpZ0NvbW1hbmRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5jb21tYW5kLkRlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0vKioKLSAqIENvbW1hbmQgbGlzdGVuZXIgZm9yIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kCi0gKiBDbGVhbiBhbGwgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwdWJsaXNoaW5nIHByZWZlcmVuY2VzIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgZGVsZXRlZAotICogQGF1dGhvciBYaWFuZyBEb25nIEh1Ci0gKiBAc2luY2UgMS4yCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgxNDg3Ci0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVDb25maWdDb21tYW5kTGlzdGVuZXIgaW1wbGVtZW50cwotCQlJRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmRMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0T2JqZWN0c1RvRGVsZXRlQ29udGVudChDb2xsZWN0aW9uIGNvbGxlY3RlZE9iamVjdHMsCi0JCQlNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbGxlY3RPYmplY3RzVG9SZW1vdmUoQ29sbGVjdGlvbiBvYmplY3RzVG9SZW1vdmUsCi0JCQlFT2JqZWN0IGVsZW1lbnRUb0RlbGV0ZSwgRU9iamVjdCByZWZlcmVuY2VyLCBDb2xsZWN0aW9uIHJlZmVyZW5jZXMpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBDbGFzcyBnZXRDb21tYW5kVHlwZSgpIHsKLQkJcmV0dXJuIERlbGV0ZU1ldGhvZEVsZW1lbnRDb21tYW5kLmNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUV4ZWN1dGVkKENvbW1hbmQgY29tbWFuZCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9ICgoRGVsZXRlTWV0aG9kRWxlbWVudENvbW1hbmQpY29tbWFuZCkuZ2V0UmVzdWx0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0Lm5leHQoKTsKLQkJCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKXsKLQkJCQlTdHJpbmcgY29uZmlnSWQgPSAoKE1ldGhvZENvbmZpZ3VyYXRpb24pZWxlbWVudCkuZ2V0R3VpZCgpOwotCQkJCXJlbW92ZVB1Ymxpc2hQcmVmZXJlbmNlcyhjb25maWdJZCk7Ci0JCQl9Ci0JCX0KLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2F2ZUFsbFByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJlRXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHByZVVuZG8oQ29tbWFuZCBjb21tYW5kKSB7Ci0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHVibGlzaFByZWZlcmVuY2VzKFN0cmluZyBjb25maWdJZCl7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUFib3V0SFRNTChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUJhbm5lckltYWdlKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlQ2hlY2tFeHRlcm5hbExpbmtzKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlQ29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlQ29udmVydEJyb2tlbkxpbmtzKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlRXh0cmFEZXNjcmlwdG9ySW5mbyhjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUZlZWRiYWNrVVJMKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlSW5jbHVkZUdsb3NzYXJ5KGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlSW5jbHVkZUluZGV4KGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlSW5jbHVkZVNlYXJjaChjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZUluY2x1ZGVTZXJ2bGV0U2VhcmNoKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlTGlnaHRXZWlnaHRUcmVlKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlUHVibGlzaEVudGlyZUNvbmZpZyhjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlUHVibGlzaFBhdGgoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVQdWJsaXNoU3RhdGljV2ViU2l0ZShjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlVGl0bGUoY29uZmlnSWQpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5yZW1vdmVXZWJBcHBOYW1lKGNvbmZpZ0lkKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMucmVtb3ZlU2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhjb25maWdJZCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnJlbW92ZVNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoY29uZmlnSWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBvc3RVbmRvKENvbW1hbmQgY29tbWFuZCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTljZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5CYXNlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXJlY3RvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgUHVibGlzaGluZyBwcmVmZXJlbmNlIHBhZ2UuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICogCi0gKiBCdWdzIGZpeGVkOgotICogPHVsPgotICogPGxpPmh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTY5NTc8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgZGVzdGluYXRpb25QYXRoVGV4dDsKLQotCXByaXZhdGUgVGV4dCBmZWVkYmFja1VSTFRleHQ7Ci0KLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3g7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIHRoZSBTV1QgY29udHJvbCBmb3IgdGhlIGN1c3RvbWl6ZWQgYm9keSBvZiB0aGlzCi0JICogcHJlZmVyZW5jZSBwYWdlIHVuZGVyIHRoZSBnaXZlbiBwYXJlbnQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiB0aGUgbmV3IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQkvLyBDcmVhdGUgdGhlIERlc3RpbmF0aW9uIHBhdGggZ3JvdXAuCi0JCS8qCi0JCSAqIEdyb3VwIGRlc3RpbmF0aW9uR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkgKiBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZGVzdGluYXRpb25EaXJlY3RvcnlHcm91cF90ZXh0LCAzKTsKLQkJICovCi0KLQkJLy8gQ3JlYXRlIHRoZSBQdWJsaXNoZWQgV2Vic2l0ZSBncm91cC4KLQkJR3JvdXAgd2ViU2l0ZUdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaFdlYlNpdGVHcm91cF90ZXh0LCAzKTsKLQkJY3JlYXRlTGFiZWwod2ViU2l0ZUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wcmVmZXJlbmNlUGFnZV9kZWZhdWx0UGF0aF90ZXh0KTsKLQkJZGVzdGluYXRpb25QYXRoVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh3ZWJTaXRlR3JvdXApOwotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24od2ViU2l0ZUdyb3VwLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCQljcmVhdGVMYWJlbCh3ZWJTaXRlR3JvdXAsIFB1Ymxpc2hpbmdVSVJlc291cmNlcy5mZWVkYmFja1VSTExhYmVsX3RleHQpOwotCQlmZWVkYmFja1VSTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQod2ViU2l0ZUdyb3VwLCAyKTsKLQotCQkvLyBDcmVhdGUgdGhlIEJyb3dzaW5nIGdyb3VwLgotCQlHcm91cCBicm93c2luZ0dyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmJyb3dzaW5nTGF5b3V0R3JvdXBfdGV4dCwgMSk7Ci0JCWV4dHJhRGVzY3JpcHRvckluZm9DaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGJyb3dzaW5nR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hFeHRyYURlc2NyaXB0b3JJbmZvTGFiZWxfdGV4dCwgMSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCWRlc3RpbmF0aW9uUGF0aFRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRQdWJsaXNoUGF0aCgpKTsKLQkJZmVlZGJhY2tVUkxUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JCWV4dHJhRGVzY3JpcHRvckluZm9DaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZGVzdGluYXRpb25QYXRoVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoIWlzUGF0aFZhbGlkKGRlc3RpbmF0aW9uUGF0aFRleHQuZ2V0VGV4dCgpKSkgewotCQkJCQlzZXRWYWxpZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlbkRpcmVjdG9yeURpYWxvZygpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlpbml0aWFsaXplRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXN0b3JlVmFsdWVzKCk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNhdmVBbGxQcmVmZXJlbmNlcygpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBzZXR0aW5ncyBmb3IgYnJvd3NpbmcKLQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS51cGRhdGVMYXlvdXRTZXR0aW5ncygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBjb250cm9scyBiYWNrIHRvIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFBhdGgoZGVzdGluYXRpb25QYXRoVGV4dC5nZXRUZXh0KCkKLQkJCQkudHJpbSgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuc2V0RmVlZGJhY2tVUkwoZmVlZGJhY2tVUkxUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5zZXRFeHRyYURlc2NyaXB0b3JJbmZvKGV4dHJhRGVzY3JpcHRvckluZm9DaGVja2JveAotCQkJCQkJLmdldFNlbGVjdGlvbigpKTsKLQotLy8JCS8vIEZJWE1FISBSZXZpZXcgaW1wbGVtZW50YXRpb24uCi0vLwkJLy8gYWxsb3cgdG8gcGFzcyB0aGUgdmFsdWUgdG8gdGhlIGxpYnJhcnkgYnJvd3NpbmcKLS8vCQkvLyBTeXN0ZW0uc2V0UHJvcGVydHkoRVhUUkFfREVTQ1JJUFRPUl9JTkZPLAotLy8JCS8vIGV4dHJhRGVzY3JpcHRvckluZm9DdHIuZ2V0U2VsZWN0aW9uKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLS8vCQlEZWZhdWx0Q29udGVudFZhbGlkYXRvcgotLy8JCQkJLnNldERlZmF1bHRTaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMoZXh0cmFEZXNjcmlwdG9ySW5mb0NoZWNrYm94Ci0vLwkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0cygpIHsKLQkJZGVzdGluYXRpb25QYXRoVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpKTsKLQkJZmVlZGJhY2tVUkxUZXh0Ci0JCQkJLnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0RGVmYXVsdEZlZWRiYWNrVVJMKCkpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldERlZmF1bHRFeHRyYURlc2NyaXB0b3JJbmZvKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgdXNlciBzcGVjaWZpZWQgZGVzdGluYXRpb24gcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXRoVmFsaWQoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpIDw9IDApIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhwYXRoKTsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZWNQYXRoLmlzVmFsaWRQYXRoKHBhdGgpOwotCQlpZiAoIWlzVmFsaWQpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIVN0clV0aWwuaXNWYWxpZFB1Ymxpc2hQYXRoKHBhdGgpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoQ2hhcnNFcnJvcl9tc2cpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBkaXJlY3RvcnkgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgdm9pZCBvcGVuRGlyZWN0b3J5RGlhbG9nKCkgewotCQl0cnkgewotCQkJRGlyZWN0b3J5RGlhbG9nIGRkID0gbmV3IERpcmVjdG9yeURpYWxvZyhjb21wb3NpdGUuZ2V0U2hlbGwoKSwKLQkJCQkJU1dULk5PTkUpOwotCQkJU3RyaW5nIGRlc3RpbmF0aW9uID0gZGQub3BlbigpOwotCQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpIHsKLQkJCQlkZXN0aW5hdGlvblBhdGhUZXh0LnNldFRleHQoZGVzdGluYXRpb24pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL1B1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NTM3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BY3Rpdml0eUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5wcmVmZXJlbmNlcy5MaWJyYXJ5VUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIFB1Ymxpc2hpbmcgVUkgcHJlZmVyZW5jZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0VOVElSRV9DT05GSUcgPSAicHVibGlzaEVudGlyZUNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJ0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQU5ORVJfSU1BR0UgPSAiYmFubmVySW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfSFRNTCA9ICJhYm91dEhUTUwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVFREJBQ0tfVVJMID0gImZlZWRiYWNrVVJMIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0dMT1NTQVJZID0gImluY2x1ZGVHbG9zc2FyeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX0lOREVYID0gImluY2x1ZGVJbmRleCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEVDS19FWFRFUk5BTF9MSU5LUyA9ICJjaGVja0V4dGVybmFsTGlua3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9CUk9LRU5fTElOS1MgPSAiY29udmVydEJyb2tlbkxpbmtzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJR0hUX1dFSUdIVF9UUkVFID0gImxpZ2h0V2VpZ2h0VHJlZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9ERVNDUklQVE9SX0lORk8gPSAiZXh0cmFEZXNjcmlwdG9ySW5mbyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCA9ICJwdWJsaXNoVW5vcGVuQWN0aXZpdHlERCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04gPSAicHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9QQVRIID0gInB1Ymxpc2hQYXRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFID0gInB1Ymxpc2hTdGF0aWNXZWJTaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREVfU0VSVkxFVF9TRUFSQ0ggPSAiaW5jbHVkZVNlcnZsZXRTZWFyY2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCQVBQX05BTUUgPSAid2ViQXBwTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1NFQVJDSCA9ICJpbmNsdWRlU2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxJWkVEID0gImluaXRpYWxpemVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfUkVMQVRFRF9ERVNDUklQVE9SUyA9ICJzaG93UmVsYXRlZERlc2NyaXB0b3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfREVTQ1JJUFRPUlNfSU5fTkFWSUdBVElPTlRSRUUgPSAic2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FDVElWSVRZX1RBQiA9ICJkZWZhdWx0QWN0aXZpdHlUYWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QVUJMSVNIX0ZPTERFUl9OQU1FID0gIlB1Ymxpc2giOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFRpdGxlID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWZhdWx0QmFubmVySW1hZ2UgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBYm91dEhUTUwgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRGZWVkYmFja1VSTCA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVmYXVsdFB1Ymxpc2hQYXRoID0gbnVsbDsKLQotCS8vIFRoZSBwbHVnLWluIHNwZWNpZmljIHByZWZlcmVuY2Ugc3RvcmUuCi0JcHJpdmF0ZSBzdGF0aWMgSVByZWZlcmVuY2VTdG9yZSBwcmVmU3RvcmUgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQlzdGF0aWMgewotCQkvLyBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzLgotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX0VOVElSRV9DT05GSUcsIHRydWUpOwotCi0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFRJVExFLCBnZXREZWZhdWx0VGl0bGUoKSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEJBTk5FUl9JTUFHRSwgZ2V0RGVmYXVsdEJhbm5lckltYWdlKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChBQk9VVF9IVE1MLCBnZXREZWZhdWx0QWJvdXRIVE1MKCkpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChGRUVEQkFDS19VUkwsIGdldERlZmF1bHRGZWVkYmFja1VSTCgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoSU5DTFVERV9HTE9TU0FSWSwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX0lOREVYLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENIRUNLX0VYVEVSTkFMX0xJTktTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KENPTlZFUlRfQlJPS0VOX0xJTktTLCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0RELCBmYWxzZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgZmFsc2UpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChMSUdIVF9XRUlHSFRfVFJFRSwgdHJ1ZSk7Ci0JCXByZWZTdG9yZS5zZXREZWZhdWx0KEVYVFJBX0RFU0NSSVBUT1JfSU5GTywKLQkJCQlnZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoREVGQVVMVF9BQ1RJVklUWV9UQUIsCi0JCQkJQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV0JTKTsKLQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChQVUJMSVNIX1BBVEgsIGdldERlZmF1bHRQdWJsaXNoUGF0aCgpKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUsIHRydWUpOwotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX1NFUlZMRVRfU0VBUkNILCB0cnVlKTsKLQkJcHJlZlN0b3JlLnNldERlZmF1bHQoV0VCQVBQX05BTUUsICIiKTsgLy8kTk9OLU5MUy0xJAkJCQotCQlwcmVmU3RvcmUuc2V0RGVmYXVsdChJTkNMVURFX1NFQVJDSCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBlbnRpcmUgY29uZmlndXJhdGlvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaEVudGlyZUNvbmZpZyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIFBVQkxJU0hfRU5USVJFX0NPTkZJRyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oUFVCTElTSF9FTlRJUkVfQ09ORklHKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZW50aXJlIGNvbmZpZ3VyYXRpb25wcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoRW50aXJlQ29uZmlnKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfRU5USVJFX0NPTkZJRywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZW50aXJlIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHVibGlzaEVudGlyZUNvbmZpZyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9FTlRJUkVfQ09ORklHKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHRpdGxlIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdGl0bGUgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VGl0bGUoKSB7Ci0JCWlmIChkZWZhdWx0VGl0bGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHVybCA9IFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJ0aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodXJsID09IG51bGwgfHwgdXJsLmxlbmd0aCgpID09IDAgfHwgdXJsLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWRlZmF1bHRUaXRsZSA9IHVybDsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFRpdGxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBzaXRlIHRpdGxlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSB3ZWIgc2l0ZSB0aXRsZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRpdGxlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhUSVRMRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgc2l0ZSB0aXRsZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICB0aGUgd2ViIHNpdGUgdGl0bGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdGl0bGUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgVElUTEUsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgc2l0ZSB0aXRsZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlVGl0bGUoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBUSVRMRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBiYW5uZXIgaW1hZ2UgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBiYW5uZXIgaW1hZ2UgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QmFubmVySW1hZ2UoKSB7Ci0JCWlmIChkZWZhdWx0QmFubmVySW1hZ2UgPT0gbnVsbCkgewotCQkJU3RyaW5nIGltYWdlID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRTdHJpbmcoCi0JCQkJCSJiYW5uZXJJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW1hZ2UgPT0gbnVsbCB8fCBpbWFnZS5sZW5ndGgoKSA9PSAwIHx8IGltYWdlLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZGVmYXVsdEJhbm5lckltYWdlID0gaW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRCYW5uZXJJbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBiYW5uZXIgaW1hZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGJhbm5lciBpbWFnZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBCQU5ORVJfSU1BR0UpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoQkFOTkVSX0lNQUdFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhbm5lciBpbWFnZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgYmFubmVyIGltYWdlIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCYW5uZXJJbWFnZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBpbWFnZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBCQU5ORVJfSU1BR0UsIGltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYW5uZXIgaW1hZ2UgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUJhbm5lckltYWdlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQkFOTkVSX0lNQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IGFib3V0IEhUTUwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBhYm91dCBIVE1MIGZvciBhIHB1Ymxpc2hlZCB3ZWJzaXRlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEFib3V0SFRNTCgpIHsKLQkJaWYgKGRlZmF1bHRBYm91dEhUTUwgPT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGUgPSBQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRTdHJpbmcoImFib3V0SFRNTCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZmlsZSA9PSBudWxsIHx8IGZpbGUubGVuZ3RoKCkgPT0gMCB8fCBmaWxlLnN0YXJ0c1dpdGgoIlsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZmlsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkZWZhdWx0QWJvdXRIVE1MID0gZmlsZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEFib3V0SFRNTDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhYm91dCBIVE1MIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBhYm91dCBIVE1MIGZpbGUgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFib3V0SFRNTChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgQUJPVVRfSFRNTCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhBQk9VVF9IVE1MKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFib3V0IEhUTUwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgYWJvdXQgSFRNTCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWJvdXRIVE1MKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHBhdGgpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQUJPVVRfSFRNTCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWJvdXQgSFRNTCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWJvdXRIVE1MKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgQUJPVVRfSFRNTCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBmZWVkYmFjayBVUkwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBmZWVkYmFjayBVUkwgZm9yIGEgcHVibGlzaGVkIHdlYnNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0RmVlZGJhY2tVUkwoKSB7Ci0JCWlmIChkZWZhdWx0RmVlZGJhY2tVUkwgPT0gbnVsbCkgewotCQkJZGVmYXVsdEZlZWRiYWNrVVJMID0gImh0dHA6Ly93d3cucHVibGlzaGVkX3dlYnNpdGUuY29tL2ZlZWRiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBkZWZhdWx0RmVlZGJhY2tVUkw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZmVlZGJhY2sgVVJMCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEZFRURCQUNLX1VSTCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqICAgICAgICAgICAgdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGZWVkYmFja1VSTChTdHJpbmcgdXJsKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShGRUVEQkFDS19VUkwsIHVybCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVlZGJhY2sgVVJMIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGZWVkYmFja1VSTChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgRkVFREJBQ0tfVVJMKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKEZFRURCQUNLX1VSTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBmZWVkYmFjayBVUkwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmVlZGJhY2tVUkwoU3RyaW5nIGNvbmZpZ0lkLCBTdHJpbmcgdXJsKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIEZFRURCQUNLX1VSTCwgdXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZlZWRiYWNrVVJMKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgRkVFREJBQ0tfVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlR2xvc3NhcnkoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX0dMT1NTQVJZKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX0dMT1NTQVJZKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgZ2xvc3NhcnkgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZUdsb3NzYXJ5KFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0dMT1NTQVJZLAotCQkJCXZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIGdsb3NzYXJ5IHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlR2xvc3NhcnkoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZQotCQkJCS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0dMT1NTQVJZKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlIGluZGV4IHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlSW5kZXgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX0lOREVYKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihJTkNMVURFX0lOREVYKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgaW5kZXggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUKLQkJCQkuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTkNMVURFX0lOREVYLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBpbmRleCBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSW5jbHVkZUluZGV4KFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9JTkRFWCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIENIRUNLX0VYVEVSTkFMX0xJTktTKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihDSEVDS19FWFRFUk5BTF9MSU5LUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBleHRlcm5hbCBsaW5rcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGVja0V4dGVybmFsTGlua3MoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZSgKLQkJCQlnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIENIRUNLX0VYVEVSTkFMX0xJTktTLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3MgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNoZWNrRXh0ZXJuYWxMaW5rcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgQ0hFQ0tfRVhURVJOQUxfTElOS1MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDb252ZXJ0QnJva2VuTGlua3MoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBDT05WRVJUX0JST0tFTl9MSU5LUyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oQ09OVkVSVF9CUk9LRU5fTElOS1MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udmVydCBicm9rZW4gbGlua3MgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udmVydEJyb2tlbkxpbmtzKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoCi0JCQkJZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBDT05WRVJUX0JST0tFTl9MSU5LUywgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDb252ZXJ0QnJva2VuTGlua3MoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIENPTlZFUlRfQlJPS0VOX0xJTktTKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIHVub3BlbiBhY3Rpdml0eSBkZXRhaWwgZGlhZ3JhbXMgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hVbm9wZW5BY3Rpdml0eUREKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfVU5PUEVOX0FDVElWSVRZX0REKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1VOT1BFTl9BQ1RJVklUWV9ERCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQKLQkgKiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgUFVCTElTSF9VTk9QRU5fQUNUSVZJVFlfREQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBQVUJMSVNIX0FEX0ZPUl9BQ1RJVklUWV9FWFRFTlNJT04pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGFjdGl2aXkgZGlhZ3JhbXMgZm9yIGJhc2UgYWN0aXZpdGllcyB3aXRoIHVubW9kaWZpZWQKLQkgKiBleHRlbnNpb24gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkLAotCQkJYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTiwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggYWN0aXZpeSBkaWFncmFtcyBmb3IgYmFzZSBhY3Rpdml0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbiBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfQURfRk9SX0FDVElWSVRZX0VYVEVOU0lPTik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGlnaHQgd2VpZ2h0IHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldExpZ2h0V2VpZ2h0VHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIExJR0hUX1dFSUdIVF9UUkVFKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihMSUdIVF9XRUlHSFRfVFJFRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaWdodCB3ZWlnaHQgdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMaWdodFdlaWdodFRyZWUoU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIExJR0hUX1dFSUdIVF9UUkVFLAotCQkJCXZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaWdodCB3ZWlnaHQgdHJlZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTGlnaHRXZWlnaHRUcmVlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBMSUdIVF9XRUlHSFRfVFJFRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWZhdWx0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0RXh0cmFEZXNjcmlwdG9ySW5mbygpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKEVYVFJBX0RFU0NSSVBUT1JfSU5GTyk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCBleHRyYSBkZXNjcmlwdG9yIGluZm8gcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dHJhRGVzY3JpcHRvckluZm8oYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoRVhUUkFfREVTQ1JJUFRPUl9JTkZPLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFeHRyYURlc2NyaXB0b3JJbmZvKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgRVhUUkFfREVTQ1JJUFRPUl9JTkZPKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEV4dHJhRGVzY3JpcHRvckluZm8oU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgRVhUUkFfREVTQ1JJUFRPUl9JTkZPLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXh0cmEgZGVzY3JpcHRvciBpbmZvIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFeHRyYURlc2NyaXB0b3JJbmZvKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBFWFRSQV9ERVNDUklQVE9SX0lORk8pOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgcGF0aCBmb3IgYSBwdWJsaXNoZWQgd2ViIHNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZGVmYXVsdCBwYXRoIGZvciBhIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UHVibGlzaFBhdGgoKSB7Ci0JCWlmIChkZWZhdWx0UHVibGlzaFBhdGggPT0gbnVsbCkgewotCQkJZGVmYXVsdFB1Ymxpc2hQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFwcE5hbWUgPSBMaWJyYXJ5VUlQcmVmZXJlbmNlcy5nZXRBcHBsaWNhdGlvblNob3J0TmFtZSgpOwotCQkJaWYgKGFwcE5hbWUgIT0gbnVsbCAmJiBhcHBOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCWRlZmF1bHRQdWJsaXNoUGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIGFwcE5hbWUgKyBGaWxlVXRpbC5GSUxFX1NFUAotCQkJCQkJKyBERUZBVUxUX1BVQkxJU0hfRk9MREVSX05BTUU7Ci0JCQl9IGVsc2UgewotCQkJCWRlZmF1bHRQdWJsaXNoUGF0aCA9IGRlZmF1bHRQdWJsaXNoUGF0aCArIEZpbGVVdGlsLkZJTEVfU0VQCi0JCQkJCQkrIERFRkFVTFRfUFVCTElTSF9GT0xERVJfTkFNRTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmYXVsdFB1Ymxpc2hQYXRoOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFB1Ymxpc2hQYXRoKCkgewotCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQVUJMSVNIX1BBVEgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShQVUJMSVNIX1BBVEgsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggcGF0aCBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHJldHVybiB0aGUgcHVibGlzaCBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHVibGlzaFBhdGgoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIFBVQkxJU0hfUEFUSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhQVUJMSVNIX1BBVEgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2ggcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBwYXRoKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFBVQkxJU0hfUEFUSCwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwYXRoIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQdWJsaXNoUGF0aChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFBVQkxJU0hfUEFUSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCkgewotCQlpZiAoZ2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKGNvbmZpZ0lkKSkgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgUFVCTElTSF9TVEFUSUNfV0VCX1NJVEUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggc3RhdGljIHdlYiBzaXRlIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFBVQkxJU0hfU1RBVElDX1dFQl9TSVRFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBzdGF0aWMgd2ViIHNpdGUgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVB1Ymxpc2hTdGF0aWNXZWJTaXRlKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBQVUJMSVNIX1NUQVRJQ19XRUJfU0lURSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBhcHBsZXQgc2VhcmNoIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0Qm9vbGVhbihnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKElOQ0xVREVfU0VSVkxFVF9TRUFSQ0gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBwcmVmZXJlbmNlIHZhbHVlLi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZVNlcnZsZXRTZWFyY2goU3RyaW5nIGNvbmZpZ0lkLCBib29sZWFuIHZhbHVlKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgc2VydmxldCBzZWFyY2ggcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0IHZhbHVlLi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlU2VydmxldFNlYXJjaChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgSU5DTFVERV9TRVJWTEVUX1NFQVJDSCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UgaXMgc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEluY2x1ZGVTZWFyY2goU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkJKyBJTkNMVURFX1NFQVJDSCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldEJvb2xlYW4oSU5DTFVERV9TRUFSQ0gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5jbHVkZSBzZWFyY2ggcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5jbHVkZVNlYXJjaChTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9TRUFSQ0gsCi0JCQkJdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluY2x1ZGUgc2VhcmNoIHByZWZlcmVuY2UgdG8gYmUgZGVmYXVsdCB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlU2VhcmNoKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5DTFVERV9TRUFSQ0gpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdlYiBhcHBsaWNhdGlvbiBuYW1lIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJaWYgKGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChjb25maWdJZCkpIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJCSsgV0VCQVBQX05BTUUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHByZWZTdG9yZS5nZXRTdHJpbmcoV0VCQVBQX05BTUUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgd2ViIGFwcGxpY2F0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQsIFN0cmluZyBuYW1lKSB7Ci0JCXByZWZTdG9yZS5zZXRWYWx1ZShnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFdFQkFQUF9OQU1FLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3ZWIgYXBwbGljYXRpb24gbmFtZSBwcmVmZXJlbmNlIHRvIGJlIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlV2ViQXBwTmFtZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKSArIFdFQkFQUF9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBzcGVjaWZpYyBwcmVmZXJlbmNlIHByZWZpeC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgcHJlZmVyZW5jZSBwcmVmaXggYXNzaWduZWQgdG8gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb25maWdQcmVmUHJlZml4KFN0cmluZyBjb25maWdJZCkgewotCQlyZXR1cm4gY29uZmlnSWQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb25maWd1cmF0aW9uIHNwZWNpZmljIHByZWZlcmVuY2VzIGluaXRpYWxpemVkIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldENvbmZpZ1ByZWZJbml0aWFsaXplZChTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZQotCQkJCS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCwgYm9vbGVhbiB2YWx1ZSkgewotCQlwcmVmU3RvcmUuc2V0VmFsdWUoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkgKyBJTklUSUFMSVpFRCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgcHJlZmVyZW5jZXMgaW5pdGlhbGl6ZWQgcHJlZmVyZW5jZSB0byBiZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQ29uZmlnUHJlZkluaXRpYWxpemVkKFN0cmluZyBjb25maWdJZCkgewotCQlwcmVmU3RvcmUuc2V0VG9EZWZhdWx0KGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgSU5JVElBTElaRUQpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbiBjb250ZW50IHBhZ2UgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhTdHJpbmcgY29uZmlnSWQsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX1JFTEFURURfREVTQ1JJUFRPUlMsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IHJlbGF0ZWQgZGVzY3JpcHRvcnMgaW4gY29udGVudCBwYWdlIHByZWZlcmVuY2UgdG8gYmUKLQkgKiBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVNob3dSZWxhdGVkRGVzY3JpcHRvcnMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCXByZWZTdG9yZS5zZXRUb0RlZmF1bHQoZ2V0Q29uZmlnUHJlZlByZWZpeChjb25maWdJZCkKLQkJCQkrIFNIT1dfUkVMQVRFRF9ERVNDUklQVE9SUyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvdyBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIHByZWZlcmVuY2UgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcmV0dXJuIHByZWZTdG9yZS5nZXRCb29sZWFuKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX0RFU0NSSVBUT1JTX0lOX05BVklHQVRJT05UUkVFKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBwcmVmZXJlbmNlIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWdJZAotCSAqICAgICAgICAgICAgYSBtZXRob2QgY29uZmlndXJhdGlvbiBHVUlECi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJlZmVyZW5jZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKFN0cmluZyBjb25maWdJZCwKLQkJCWJvb2xlYW4gdmFsdWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKGdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpCi0JCQkJKyBTSE9XX0RFU0NSSVBUT1JTX0lOX05BVklHQVRJT05UUkVFLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgcHJlZmVyZW5jZSB0byBiZSBkZWZhdWx0Ci0JICogdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlU2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShTdHJpbmcgY29uZmlnSWQpIHsKLQkJcHJlZlN0b3JlLnNldFRvRGVmYXVsdChnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCSsgU0hPV19ERVNDUklQVE9SU19JTl9OQVZJR0FUSU9OVFJFRSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCBhY3Rpdml0eSB0YWIgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnSWQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24gR1VJRAotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0QWN0aXZpdHlUYWIoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCWlmIChnZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQpKSB7Ci0JCQlyZXR1cm4gcHJlZlN0b3JlLmdldFN0cmluZyhnZXRDb25maWdQcmVmUHJlZml4KGNvbmZpZ0lkKQotCQkJCQkrIERFRkFVTFRfQUNUSVZJVFlfVEFCKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwcmVmU3RvcmUuZ2V0U3RyaW5nKERFRkFVTFRfQUNUSVZJVFlfVEFCKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIHByZWZlcmVuY2UgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ0lkCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uIEdVSUQKLQkgKiBAcGFyYW0gdGFiTmFtZQotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2aXR5VGFiKFN0cmluZyBjb25maWdJZCwgU3RyaW5nIHRhYk5hbWUpIHsKLQkJcHJlZlN0b3JlLnNldFZhbHVlKAotCQkJCWdldENvbmZpZ1ByZWZQcmVmaXgoY29uZmlnSWQpICsgREVGQVVMVF9BQ1RJVklUWV9UQUIsIHRhYk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIGFsbCB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNhdmVBbGxQcmVmZXJlbmNlcygpIHsKLQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhlNDQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS9wcmVmZXJlbmNlcy9Sb2xlRGlhZ3JhbVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJlZmVyZW5jZXMuTGlicmFyeVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkucHJlZmVyZW5jZXMuQmFzZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIHByZWZlcmVuY2UgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqIEJ1Z3MgZml4ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1Njk1NzwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgUm9sZURpYWdyYW1QcmVmZXJlbmNlUGFnZSBleHRlbmRzIEJhc2VQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCU1vZGlmeUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIGludCBNSU5fSE9SSVpPTlRBTF9TUEFDSU5HID0gNTA7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTUFYX0hPUklaT05UQUxfU1BBQ0lORyA9IDIwMDsKLQotCXByaXZhdGUgc3RhdGljIGludCBNSU5fVkVSVElDQUxfU1BBQ0lORyA9IDI1OwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9WRVJUSUNBTF9TUEFDSU5HID0gMTAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IE1JTl9URVhUX0xJTkVTID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGludCBNQVhfVEVYVF9MSU5FUyA9IDU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb21wb3NpdGU7Ci0KLQlwcml2YXRlIFRleHQgaG9yaXpvbmFsU3BhY2luZ1RleHQ7Ci0KLQlwcml2YXRlIFRleHQgdmVydGljYWxTcGFjaW5nVGV4dDsKLQotCXByaXZhdGUgVGV4dCB0ZXh0TGluZXNUZXh0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgU1dUIGNvbnRyb2wgZm9yIHRoZSBjdXN0b21pemVkIGJvZHkgb2YgdGhpcwotCSAqIHByZWZlcmVuY2UgcGFnZSB1bmRlciB0aGUgZ2l2ZW4gcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIG5ldyBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQljb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJLy8gQ3JlYXRlIFNwYWNpbmcgYmV0d2VlbiB0YXNrIGFuZCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgZ3JvdXAuCi0JCUdyb3VwIGVsZW1lbnRTcGFjaW5nR3JvdXAgPSBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5lbGVtZW50U3BhY2luZ0dyb3VwX3RleHQsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKGVsZW1lbnRTcGFjaW5nR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRhc2tzSG9yaXpvbmFsU3BhY2luZ0xhYmVsX3RleHQpOwotCQlob3Jpem9uYWxTcGFjaW5nVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChlbGVtZW50U3BhY2luZ0dyb3VwLCAiIiwgMjUpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwoZWxlbWVudFNwYWNpbmdHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudGFza3NWZXJ0aWNhbFNwYWNpbmdMYWJlbF90ZXh0KTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dChlbGVtZW50U3BhY2luZ0dyb3VwLCAiIiwgMjUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gQ3JlYXRlIEVsZW1lbnQgdGV4dCBsYWJlbCBncm91cC4KLQkJR3JvdXAgZWxlbWVudFRleHRMYWJlbEdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZWxlbWVudFRleHRMYWJlbEdyb3VwX3RleHQsIDIpOwotCi0JCWNyZWF0ZUxhYmVsKGVsZW1lbnRUZXh0TGFiZWxHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMubWF4TGluZU9mVGV4dExhYmVsX3RleHQpOwotCQl0ZXh0TGluZXNUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGVsZW1lbnRUZXh0TGFiZWxHcm91cCwgIiIsIDE1KTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2UgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlob3Jpem9uYWxTcGFjaW5nVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKCkpKTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dC5zZXRUZXh0KFN0cmluZy52YWx1ZU9mKExpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5nZXRSb2xlRGlhZ3JhbVZlcnRpY2FsU3BhY2luZygpKSk7Ci0JCXRleHRMaW5lc1RleHQuc2V0VGV4dChTdHJpbmcudmFsdWVPZihMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuZ2V0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgcHJlZmVyZW5jZSBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJaG9yaXpvbmFsU3BhY2luZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXZlcnRpY2FsU3BhY2luZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXRleHRMaW5lc1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJc2V0VmFsaWQodHJ1ZSk7Ci0KLQkJaW50IHZhbHVlID0gMDsKLQkJaWYgKGUud2lkZ2V0ID09IGhvcml6b25hbFNwYWNpbmdUZXh0KSB7Ci0JCQl2YWx1ZSA9IGdldEhvcml6b250YWxTcGFjaW5nKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fSE9SSVpPTlRBTF9TUEFDSU5HCi0JCQkJCXx8IHZhbHVlID4gTUFYX0hPUklaT05UQUxfU1BBQ0lORykgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkSG9yaXpvbmFsU3BhY2luZ0Vycm9yX21zZywKLQkJCQkJCW5ldyBPYmplY3RbXSB7IG5ldyBJbnRlZ2VyKE1JTl9IT1JJWk9OVEFMX1NQQUNJTkcpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfSE9SSVpPTlRBTF9TUEFDSU5HKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHZlcnRpY2FsU3BhY2luZ1RleHQpIHsKLQkJCXZhbHVlID0gZ2V0VmVydGljYWxTcGFjaW5nKCk7Ci0JCQlpZiAodmFsdWUgPCBNSU5fVkVSVElDQUxfU1BBQ0lORyB8fCB2YWx1ZSA+IE1BWF9WRVJUSUNBTF9TUEFDSU5HKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWZXJ0aWNhbFNwYWNpbmdFcnJvcl9tc2csCi0JCQkJCQluZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihNSU5fVkVSVElDQUxfU1BBQ0lORyksCi0JCQkJCQkJCW5ldyBJbnRlZ2VyKE1BWF9WRVJUSUNBTF9TUEFDSU5HKSB9KSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IHRleHRMaW5lc1RleHQpIHsKLQkJCXZhbHVlID0gZ2V0TWF4aW11bVRleHRMaW5lcygpOwotCQkJaWYgKHZhbHVlIDwgTUlOX1RFWFRfTElORVMgfHwgdmFsdWUgPiBNQVhfVEVYVF9MSU5FUykgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkVGV4dExpbmVzRXJyb3JfbXNnLAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmV3IEludGVnZXIoTUlOX1RFWFRfTElORVMpLAotCQkJCQkJCQluZXcgSW50ZWdlcihNQVhfVEVYVF9MSU5FUykgfSkpOwotCQkJCXNldFZhbGlkKGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCXVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgc3BlY2lhbCBwcm9jZXNzaW5nIHdoZW4gdGhpcyBwYWdlJ3MgRGVmYXVsdHMgYnV0dG9uIGhhcyBiZWVuCi0JICogcHJlc3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlob3Jpem9uYWxTcGFjaW5nVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIExpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0Um9sZURpYWdyYW1Ib3Jpem9udGFsU3BhY2luZygpKTsKLQkJdmVydGljYWxTcGFjaW5nVGV4dC5zZXRUZXh0KCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIExpYnJhcnlQcmVmZXJlbmNlcy5nZXREZWZhdWx0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoKSk7Ci0JCXRleHRMaW5lc1RleHQuc2V0VGV4dCgiIiAvLyROT04tTkxTLTEkCi0JCQkJKyBMaWJyYXJ5UHJlZmVyZW5jZXMuZ2V0RGVmYXVsdFJvbGVEaWFncmFtTWF4aW11bVRleHRMaW5lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUxpYnJhcnlQcmVmZXJlbmNlcwotCQkJCS5zZXRSb2xlRGlhZ3JhbUhvcml6b250YWxTcGFjaW5nKGdldEhvcml6b250YWxTcGFjaW5nKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMuc2V0Um9sZURpYWdyYW1WZXJ0aWNhbFNwYWNpbmcoZ2V0VmVydGljYWxTcGFjaW5nKCkpOwotCQlMaWJyYXJ5UHJlZmVyZW5jZXMKLQkJCQkuc2V0Um9sZURpYWdyYW1NYXhpbXVtVGV4dExpbmVzKGdldE1heGltdW1UZXh0TGluZXMoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGhvcml6b250YWwgc3BhY2luZyBiZXR3ZWVuIHRhc2tzIGFuZCByb2xlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEhvcml6b250YWxTcGFjaW5nKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZShob3Jpem9uYWxTcGFjaW5nVGV4dC5nZXRUZXh0KCkudHJpbSgpLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCB2ZXJ0aWNhbCBzcGFjaW5nIGJldHdlZW4gdGFza3MgYW5kIHJvbGVzLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0VmVydGljYWxTcGFjaW5nKCkgewotCQlyZXR1cm4gU3RyVXRpbC5nZXRJbnRWYWx1ZSh2ZXJ0aWNhbFNwYWNpbmdUZXh0LmdldFRleHQoKS50cmltKCksIDApOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGVsZW1lbnQgbGFiZWwgdGV4dCBsaW5lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldE1heGltdW1UZXh0TGluZXMoKSB7Ci0JCXJldHVybiBTdHJVdGlsLmdldEludFZhbHVlKHRleHRMaW5lc1RleHQuZ2V0VGV4dCgpLnRyaW0oKSwgMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1OGMyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgcHVibGlzaGluZyBVSS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9BYnN0cmFjdFB1Ymxpc2hXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL0Fic3RyYWN0UHVibGlzaFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGY3OWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL0Fic3RyYWN0UHVibGlzaFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci0KLS8qKgotICogQWJzdHJhY3QgcHVibGlzaGluZyB3aXphcmQgY2xhc3MuIAotICogdXNlIHRoZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoZXJzIGV4dGVuc2lvbiBwb2ludCB0byBleHRlbmQgdGhpcyBjbGFzcyAKLSAqIGlmIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSB0aGUgcHVibGlzaGluZyB1aS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFB1Ymxpc2hXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQotCS8vIFRoZSBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JcHJvdGVjdGVkIFB1Ymxpc2hPcHRpb25zIGRhdGFNb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEFic3RyYWN0UHVibGlzaFdpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogZmluaXNoIHRoZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHBlcmZvcm1GaW5pc2goKTsKLQotCS8qKgotCSAqIGluaXRpYWxpemUgdGhlIHdpemFyZC4KLQkgKiAKLQkgKiBAcGFyYW0gd29ya2JlbmNoIElXb3JrYmVuY2gKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIElTdHJ1Y3R1cmVkU2VsZWN0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKTsKLQkKLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2ggb3B0aW9ucwotCSAqIAotCSAqIEByZXR1cm4gUHVibGlzaE9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hDb25maWdXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkYWQwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoQ29uZmlnV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkuVUlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaEhUTUxPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi0vKioKLSAqIEEgd2l6YXJkIHRoYXQgZ3VpZGVzIHRoZSB1c2VyIHRvIHB1Ymxpc2ggYSBtZXRob2QgY29uZmlndXJhdGlvbiB0byBhIHdlYgotICogc2l0ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29uZmlnV2l6YXJkIGV4dGVuZHMgQmFzZVdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfSUQgPSBQdWJsaXNoQ29uZmlnV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFRoZSBQdWJsaXNoIENvbmZpZ3VyYXRpb24gd2l6YXJkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSVpBUkRfRVhURU5TSU9OX1BPSU5UX0lEID0gIm9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLnB1Ymxpc2hDb25maWdXaXphcmQiOyAvLyROT04tTkxTLTEkCQotCi0JLy8gVGhlIHNlbGVjdCBjb25maWd1cmF0aW9uIHdpemFyZCBwYWdlLgotCXByb3RlY3RlZCBTZWxlY3RDb25maWdQYWdlIHNlbGVjdENvbmZpZ1BhZ2U7Ci0KLQkvLyBUaGUgc2VsZWN0IGNvbmZpZ3VyYXRpb24gY29udGVudCB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgU2VsZWN0Q29udGVudFBhZ2Ugc2VsZWN0Q29udGVudFBhZ2U7Ci0KLQkvLyBUaGUgc2VsZWN0IHB1Ymxpc2hpbmcgb3B0aW9ucyB3aXphcmQgcGFnZS4KLQlwcm90ZWN0ZWQgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZTsKLQotCS8vIFRoZSBzZWxlY3QgZGVzdGluYXRpb24gd2l6YXJkIHBhZ2UuCi0JcHJvdGVjdGVkIFNlbGVjdERlc3RpbmF0aW9uUGFnZSBzZWxlY3REZXN0aW5hdGlvblBhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoQ29uZmlnV2l6YXJkKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZCNpbml0KElXb3JrYmVuY2gsCi0JICogICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuaW5pdCh3b3JrYmVuY2gsIHNlbGVjdGlvbik7Ci0JCXNldFdpbmRvd1RpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnV2l6YXJkX3RpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmQjZ2V0V2l6YXJkRXh0ZW5kZXJFeHRlbnNpb25Qb2ludElkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnRJZCgpIHsKLQkJcmV0dXJuIFdJWkFSRF9FWFRFTlNJT05fUE9JTlRfSUQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2FkZFBhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCXNlbGVjdENvbmZpZ1BhZ2UgPSBuZXcgU2VsZWN0Q29uZmlnUGFnZSgpOwotCQkJc2VsZWN0Q29udGVudFBhZ2UgPSBuZXcgU2VsZWN0Q29udGVudFBhZ2UoKTsKLQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZSA9IG5ldyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQlzdXBlci5hZGRQYWdlKHNlbGVjdENvbnRlbnRQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCXN1cGVyLmFkZFBhZ2Uoc2VsZWN0RGVzdGluYXRpb25QYWdlKTsKLQkJfSBlbHNlIHsKLQkJCUxpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzID0gbmV3IEFycmF5TGlzdDxJV2l6YXJkUGFnZT4oKTsKLQotCQkJSVdpemFyZFBhZ2UgcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RDb25maWdQYWdlLlBBR0VfTkFNRSk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHBhZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZWxlY3RDb25maWdQYWdlID0gbmV3IFNlbGVjdENvbmZpZ1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0Q29uZmlnUGFnZSk7Ci0JCQl9Ci0KLQkJCXBhZ2UgPSB3aXphcmRFeHRlbmRlcgotCQkJCQkuZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU2VsZWN0Q29udGVudFBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdENvbnRlbnRQYWdlID0gbmV3IFNlbGVjdENvbnRlbnRQYWdlKCk7Ci0JCQkJd2l6YXJkUGFnZXMuYWRkKHNlbGVjdENvbnRlbnRQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZSA9IG5ldyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKTsKLQkJCX0KLQotCQkJcGFnZSA9IHdpemFyZEV4dGVuZGVyCi0JCQkJCS5nZXRSZXBsYWNlV2l6YXJkUGFnZShTZWxlY3REZXN0aW5hdGlvblBhZ2UuUEFHRV9OQU1FKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQl3aXphcmRQYWdlcy5hZGQocGFnZSk7Ci0JCQl9IGVsc2UgewotCQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZSA9IG5ldyBTZWxlY3REZXN0aW5hdGlvblBhZ2UoKTsKLQkJCQl3aXphcmRQYWdlcy5hZGQoc2VsZWN0RGVzdGluYXRpb25QYWdlKTsKLQkJCX0KLQotCQkJc3VwZXIuZ2V0TmV3V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gd2l6YXJkUGFnZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUlXaXphcmRQYWdlIHdpemFyZFBhZ2UgPSAoSVdpemFyZFBhZ2UpIGl0Lm5leHQoKTsKLQkJCQlzdXBlci5hZGRQYWdlKHdpemFyZFBhZ2UpOwotCQkJfQotCi0JCQl3aXphcmRFeHRlbmRlci5pbml0V2l6YXJkUGFnZXMod2l6YXJkUGFnZXMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJLy9vdmVycmlkZSB0aGUgYmFzZSB3aXphcmQncyBsb2dpYywgCi0JCS8vbGV0IHRoZSB3aXphcmQgZXh0ZW5kZXIgZHJpdmUgdGhlIHBhZ2UgZmxvdyB3aGVuIHRoZXJlIGlzIGEgd2l6YXJkIGV4dGVuZGVyCi0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCW5leHRQYWdlID0gd2l6YXJkRXh0ZW5kZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKHBhZ2UpOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjY3JlYXRlUGFnZUNvbnRyb2xzKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWdlQ29udHJvbHMoQ29tcG9zaXRlIHBhZ2VDb250YWluZXIpIHsKLQkJc3VwZXIuY3JlYXRlUGFnZUNvbnRyb2xzKHBhZ2VDb250YWluZXIpOwotCQlwYWdlQ29udGFpbmVyLmdldFNoZWxsKCkuc2V0SW1hZ2UoCi0JCQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZEltYWdlKAotCQkJCQkJImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQjcGVyZm9ybUZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiB3aXphcmRFeHRlbmRlci5kb0ZpbmlzaCgpOwotCQl9IGVsc2UgewotCQkJUHVibGlzaE1hbmFnZXIgcHVibGlzaGVyID0gbmV3IFB1Ymxpc2hNYW5hZ2VyKCk7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSBwdWJsaXNoQ29uZmlnKHNlbGVjdENvbmZpZ1BhZ2UuZ2V0U2VsZWN0ZWRDb25maWcoKSwKLQkJCQkJZ2V0UHVibGlzaGluZ09wdGlvbnMoKSwgcHVibGlzaGVyKTsKLQkJCWlmIChwdWJsaXNoZXIgIT0gbnVsbCkgewotCQkJCXB1Ymxpc2hlci5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFB1Ymxpc2hlcyB0aGUgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgY29uZmlndXJhdGlvbiBuYW1lCi0JICogQHBhcmFtIG9wdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwdWJsaXNoQ29uZmlnKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoT3B0aW9ucyBvcHRpb25zLAotCQkJUHVibGlzaE1hbmFnZXIgcHVibGlzaGVyKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoY2hlY2tBbmRDcmVhdGVEaXIob3B0aW9ucykpIHsKLQkJCQlwdWJsaXNoZXIuaW5pdChvcHRpb25zLmdldFB1Ymxpc2hEaXIoKSwgY29uZmlnLCBvcHRpb25zKTsKLQkJCQlQdWJsaXNoaW5nT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBQdWJsaXNoaW5nT3BlcmF0aW9uKAotCQkJCQkJcHVibGlzaGVyKTsKLQotCQkJCVB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cgZGxnID0gbmV3IFB1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2coCi0JCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBwdWJsaXNoZXIKLQkJCQkJCQkJLmdldFZpZXdCdWlsZGVyKCkpOwotCi0JCQkJVUlIZWxwZXIucnVuV2l0aFByb2dyZXNzKG9wZXJhdGlvbiwgZGxnLCB0cnVlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdXaXphcmRfdGl0bGUpOwotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ1dpemFyZF90aXRsZSwKLQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdFcnJvcl9tc2csCi0JCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgIT0gbnVsbCkgewotCQkJCXNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5zYXZlUHJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJCWlmIChzZWxlY3REZXN0aW5hdGlvblBhZ2UgIT0gbnVsbCkgewotCQkJCXNlbGVjdERlc3RpbmF0aW9uUGFnZS5zYXZlUHJlZmVyZW5jZXMoKTsKLQkJCX0KLQkJCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZy5nZXRHdWlkKCk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRDb25maWdQcmVmSW5pdGlhbGl6ZWQoY29uZmlnSWQsIHRydWUpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2F2ZUFsbFByZWZlcmVuY2VzKCk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgdXNlciBzcGVjaWZpZWQgcHVibGlzaGluZyBvcHRpb25zLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoaW5nT3B0aW9ucygpIHsKLQkJUHVibGlzaE9wdGlvbnMgb3B0aW9uczsKLQkJCi0JCWlmIChzZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UgIT0gbnVsbCkgewotCQkJb3B0aW9ucyA9IHNlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5nZXRQdWJsaXNoaW5nT3B0aW9ucygpOwotCQl9Ci0JCWVsc2UgewotCQkJb3B0aW9ucyA9IG5ldyBQdWJsaXNoT3B0aW9ucygpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdENvbnRlbnRQYWdlICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gcHVibGlzaENvbmZpZyA9IHNlbGVjdENvbnRlbnRQYWdlLmdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKTsKLQkJCW9wdGlvbnMuc2V0UHVibGlzaENvbmZpZ3VyYXRpb24ocHVibGlzaENvbmZpZyk7Ci0JCQlvcHRpb25zLnNldFB1Ymxpc2hQcm9jZXNzKCFwdWJsaXNoQ29uZmlnKTsKLQkJCWlmICghcHVibGlzaENvbmZpZykgewotCQkJCW9wdGlvbnMuc2V0UHJvY2Vzc2VzKHNlbGVjdENvbnRlbnRQYWdlLmdldFNlbGVjdGVkUHJvY2Vzc2VzKCkpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoc2VsZWN0RGVzdGluYXRpb25QYWdlICE9IG51bGwpIHsKLQkJCW9wdGlvbnMuc2V0UHVibGlzaERpcihzZWxlY3REZXN0aW5hdGlvblBhZ2UuZ2V0UHVibGlzaERpcmVjdG9yeSgpKTsKLQotCQkJaWYgKCFzZWxlY3REZXN0aW5hdGlvblBhZ2UuZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpCi0JCQkJCSYmIG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCQlQdWJsaXNoSFRNTE9wdGlvbnMgaHRtbE9wdGlvbnMgPSAoUHVibGlzaEhUTUxPcHRpb25zKSBvcHRpb25zOwotCQkJCWh0bWxPcHRpb25zLnNldFB1Ymxpc2hEeW5hbWljV2ViQXBwKHRydWUpOwotCQkJCWh0bWxPcHRpb25zLnNldER5bmFtaWNXZWJBcHBOYW1lKHNlbGVjdERlc3RpbmF0aW9uUGFnZQotCQkJCQkJLmdldFdlYkFwcE5hbWUoKSk7Ci0JCQkJaHRtbE9wdGlvbnMuc2V0SW5jbHVkZVNlcnZsZXRTZWFyY2goc2VsZWN0RGVzdGluYXRpb25QYWdlCi0JCQkJCQkuZ2V0SW5jbHVkZVNlYXJjaFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBvcHRpb25zOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBhbmQgY3JlYXRlcyB0aGUgZGVzdGluYXRpb24gcGF0aCB3aGVyZSB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiB3aWxsIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlc3RpbmF0aW9uIHBhdGggaXMgdmFsaWQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbmRDcmVhdGVEaXIoUHVibGlzaE9wdGlvbnMgb3B0aW9ucykgewotCQlTdHJpbmcgZGlyID0gb3B0aW9ucy5nZXRQdWJsaXNoRGlyKCk7Ci0JCVN0cmluZyBkZWZhdWx0UHVibGlzaFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXREZWZhdWx0UHVibGlzaFBhdGgoKTsKLQkJYm9vbGVhbiBhbnN3ZXIgPSBmYWxzZTsKLQotCQlJUGF0aCBlY1BhdGggPSBQYXRoLmZyb21PU1N0cmluZyhkaXIpOwotCQlpZiAoIWVjUGF0aC5pc0Fic29sdXRlKCkpIHsKLQkJCVN0cmluZyBwYXRoID0gZGVmYXVsdFB1Ymxpc2hQYXRoCi0JCQkJCSsgU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpICsgZGlyOyAvLyROT04tTkxTLTEkCi0JCQlhbnN3ZXIgPSBQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuZ2V0TXNnRGlhbG9nKCkKLQkJCQkJLmRpc3BsYXlQcm9tcHQoCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbmZpcm1QYXRoRGlhbG9nX3RleHQsCi0JCQkJCQkJCQkJCXBhdGgpKTsKLQotCQkJaWYgKGFuc3dlcikgewotCQkJCW9wdGlvbnMuc2V0UHVibGlzaERpcihkaXIpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIpOwotCi0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmaWxlLmxpc3RGaWxlcygpOwotCQkJaWYgKGZpbGVzICE9IG51bGwgJiYgZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCWFuc3dlciA9IFB1Ymxpc2hpbmdVSVBsdWdpbgotCQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkuZGlzcGxheUNvbmZpcm1hdGlvbigKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLm92ZXJ3cml0ZURpYWxvZ190ZXh0LAotCQkJCQkJCQkJCQkJZGlyKSk7Ci0KLQkJCQlpZiAoYW5zd2VyID09IHRydWUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWFuc3dlciA9IEZpbGVVdGlsCi0JCQkJCQkJCS5kZWxldGVBbGxGaWxlcyhmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQkJCWlmIChhbnN3ZXIgPT0gZmFsc2UpIHsKLQkJCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4KLQkJCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJCS5nZXRNc2dEaWFsb2coKQotCQkJCQkJCQkJLmRpc3BsYXlFcnJvcigKLQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5ub3RQdWJsaXNoRXJyb3JfbXNnLAotCQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMKLQkJCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5kZWxldGVGaWxlc0Vycm9yX3JlYXNvbiwKLQkJCQkJCQkJCQkJCQkJCWRpcikpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luCi0JCQkJCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkJCQkJLmdldE1zZ0RpYWxvZygpCi0JCQkJCQkJCS5kaXNwbGF5RXJyb3IoCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzCi0JCQkJCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRlbGV0ZUZpbGVzRXJyb3JfcmVhc29uLAotCQkJCQkJCQkJCQkJCQlkaXIpLCBlKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWFuc3dlciA9IGZpbGUubWtkaXJzKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGUsCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY2Fubm90UHVibGlzaEVycm9yX21zZywKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY3JlYXRlRGlyRXJyb3JfcmVhc29uLAotCQkJCQkJCQlmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKCFhbnN3ZXIpIHsKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlFcnJvcigKLQkJCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRGlhbG9nX3RpdGxlLAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNhbm5vdFB1Ymxpc2hFcnJvcl9tc2csCi0JCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNyZWF0ZURpckVycm9yX3JlYXNvbiwKLQkJCQkJCQkJZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhbnN3ZXI7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaE9wdGlvbkNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvUHVibGlzaE9wdGlvbkNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhiM2I2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hPcHRpb25Db250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLS8qKgotICogTW9kZWxzIGEgInB1Ymxpc2hPcHRpb24iIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBpbiB0aGUKLSAqICJvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoQ29uZmlndXJhdGlvbldpemFyZCIgZXh0ZW5zaW9uIHBvaW50LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hPcHRpb25Db250cmlidXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRTZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBuYW1lCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICB0aGUgZXhwb3J0IG9wdGlvbiBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZWZhdWx0U2VsZWN0aW9uCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdAotCSAqLwotCXB1YmxpYyBQdWJsaXNoT3B0aW9uQ29udHJpYnV0aW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sCi0JCQlib29sZWFuIGRlZmF1bHRTZWxlY3Rpb24pIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmRlZmF1bHRTZWxlY3Rpb24gPSBkZWZhdWx0U2VsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGV4cG9ydCBvcHRpb24gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZWxlY2l0b24gb2YgdGhpcyBleHBvcnQgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvcHRpb24gc2hvdWxkIGJlIHNlbGVjdGVkIGJ5IGRlZmF1bHQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gZGVmYXVsdFNlbGVjdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hQcm9ncmVzc01vbml0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I4ZTA5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoUHJvZ3Jlc3NNb25pdG9yRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcuZ2VmLnZpZXdlci5BY3Rpdml0eURpYWdyYW1TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5EaWFncmFtSW1hZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5FbGVtZW50TGF5b3V0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFZpZXdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBUaGUgcHVibGlzaCBjb25maWd1cmF0aW9uIHByb2dyZXNzIGRpYWxvZy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyBleHRlbmRzIFByb2dyZXNzTW9uaXRvckRpYWxvZyB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBkaWFncmFtVmlld2VySG9sZGVyOwotCi0JcHJpdmF0ZSBBYnN0cmFjdFZpZXdCdWlsZGVyIHZpZXdCdWlsZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaFByb2dyZXNzTW9uaXRvckRpYWxvZyhTaGVsbCBwYXJlbnQsCi0JCQlBYnN0cmFjdFZpZXdCdWlsZGVyIHZpZXdCdWlsZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudmlld0J1aWxkZXIgPSB2aWV3QnVpbGRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjdHJsID0gc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCWlmICh2aWV3QnVpbGRlciAhPSBudWxsKSB7Ci0JCQkvLyBDcmVhdGUgdGhlIGRpYWdyYW0gdmlld2VyIGhvbGRlciBhbmQgdGhlIGRpYWdyYW0gc2VydmljZS4KLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJZGlhZ3JhbVZpZXdlckhvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgxLCAxKSk7Ci0JCQlkaWFncmFtVmlld2VySG9sZGVyLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1nciA9IHZpZXdCdWlsZGVyLmdldExheW91dE1ncigpOwotCQkJU3RyaW5nIG5ld0RpYWdyYW1zID0gQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZygiUFVCTElTSF9ORVdfRElBR1JBTSIpOyAvLyROT04tTkxTLTEkCi0JCQlCb29sZWFuIG5ld0RpYWdyYW0gPSBuZXcgQm9vbGVhbih0cnVlKTsKLQkJCWlmKG5ld0RpYWdyYW1zICE9IG51bGwgJiYgbmV3RGlhZ3JhbXMubGVuZ3RoKCkgPiAwKXsKLQkJCQluZXdEaWFncmFtID0gbmV3IEJvb2xlYW4obmV3RGlhZ3JhbXMpOwotCQkJfQotCQkJaWYgKG5ld0RpYWdyYW0uYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlEaWFncmFtSW1hZ2VTZXJ2aWNlIGRpYWdyYW1TZXJ2aWNlID0gbmV3IERpYWdyYW1JbWFnZVNlcnZpY2UoCi0JCQkJCQlkaWFncmFtVmlld2VySG9sZGVyLAotCQkJCQkJbmV3IEZpbGUobGF5b3V0TWdyLmdldFB1Ymxpc2hEaXIoKSkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldENvbmZpZyhsYXlvdXRNZ3IuZ2V0Q29uZmlndXJhdGlvbigpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoZWRVbkNyZWF0ZWRBREQodmlld0J1aWxkZXIKLQkJCQkJCS5nZXRPcHRpb25zKCkuaXNQdWJsaXNoVW5vcGVuQUREKCkpOwotCQkJCWRpYWdyYW1TZXJ2aWNlLnNldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzUHVibGlzaEJhc2VBRCgpKTsKLQkJCQlsYXlvdXRNZ3Iuc2V0QWN0aXZpdHlEaWFncmFtU2VydmljZShkaWFncmFtU2VydmljZSk7Ci0JCQl9IGVsc2UgewotCQkJCUFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UgZGlhZ3JhbVNlcnZpY2UgPSBuZXcgQWN0aXZpdHlEaWFncmFtU2VydmljZSgKLQkJCQkJCWRpYWdyYW1WaWV3ZXJIb2xkZXIsCi0JCQkJCQluZXcgRmlsZShsYXlvdXRNZ3IuZ2V0UHVibGlzaERpcigpKSk7Ci0JCQkJZGlhZ3JhbVNlcnZpY2Uuc2V0UHVibGlzaGVkVW5DcmVhdGVkQUREKHZpZXdCdWlsZGVyCi0JCQkJCQkuZ2V0T3B0aW9ucygpLmlzUHVibGlzaFVub3BlbkFERCgpKTsKLQkJCQlkaWFncmFtU2VydmljZS5zZXRQdWJsaXNoQURGb3JBY3Rpdml0eUV4dGVuc2lvbih2aWV3QnVpbGRlcgotCQkJCQkJLmdldE9wdGlvbnMoKS5pc1B1Ymxpc2hCYXNlQUQoKSk7Ci0JCQkJbGF5b3V0TWdyLnNldEFjdGl2aXR5RGlhZ3JhbVNlcnZpY2UoZGlhZ3JhbVNlcnZpY2UpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGN0cmw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIE1ldGhvZCBkZWNsYXJlZCBvbiBXaW5kb3cuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCQotCQl2aWV3QnVpbGRlciA9IG51bGw7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hpbmdPcGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1B1Ymxpc2hpbmdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxMDk0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9QdWJsaXNoaW5nT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuTXNnRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuQWJzdHJhY3RQdWJsaXNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5BYnN0cmFjdFZpZXdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLlB1Ymxpc2hIVE1MT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmJyb3dzZXIuSVdlYkJyb3dzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYnJvd3Nlci5JV29ya2JlbmNoQnJvd3NlclN1cHBvcnQ7Ci0KLS8qKgotICogUGVyZm9ybXMgdGhlIHJlYWwgd29yayBvZiBwdWJsaXNoaW5nIGEgTWV0aG9kIENvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdPcGVyYXRpb24gaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MsIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hDb25maWdEaWFsb2dfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaENvbmZpZ0Vycm9yX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJU0hfQ09ORklHX0VSUk9SX1JFQVNPTiA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfVElUTEUgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHJldmlld0NvbmZpZ0Vycm9yX3RpdGxlOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFVklFV19DT05GSUdfRVJST1JfTVNHID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLnByZXZpZXdDb25maWdFcnJvcl9tc2c7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy52aWV3UmVwb3J0RXJyb3JfdGl0bGU7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX1JFUE9SVF9FUlJPUl9NU0cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmlld1JlcG9ydEVycm9yX21zZzsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OID0gUHVibGlzaGluZ1VJUmVzb3VyY2VzLm9wZW5Ccm93c2VyRXJyb3JfcmVhc29uOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9DT05GSUdfQ0FOQ0VMX01TRyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5jYW5jZWxQdWJsaXNoQ29uZmlnX21zZzsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyIHB1Ymxpc2hNZ3I7Ci0KLQlwcml2YXRlIFN0cmluZyBwdWJsaXNoZWRfdXJsOwotCi0JcHJpdmF0ZSBTdHJpbmcgcmVwb3J0X3VybDsKLQotCXByaXZhdGUgTXNnRGlhbG9nIG1zZ0RpYWxvZzsKLQotCXByaXZhdGUgRXhjZXB0aW9uIHJ1bkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdPcGVyYXRpb24oQWJzdHJhY3RQdWJsaXNoTWFuYWdlciBwdWJsaXNoTWdyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHVibGlzaE1nciA9IHB1Ymxpc2hNZ3I7Ci0JCXRoaXMubXNnRGlhbG9nID0gUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRNc2dEaWFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHZpZXcgYnVpbGRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0Vmlld0J1aWxkZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWaWV3QnVpbGRlciBnZXRWaWV3QnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpOwotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdXJsIGZvciB0aGUgcHVibGlzaGVkIHNpdGUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaGVkVXJsKCkgewotCQlyZXR1cm4gcHVibGlzaGVkX3VybDsKLQl9Ci0KLQkvKioKLQkgKiBydW4gdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtIHRoZSBwdWJsaXNoaW5nIHRhc2suCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKLQkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCi0JCXRyeSB7Ci0JCQlfcnVuSXQobW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLnB1Ymxpc2hNZ3IgPSBudWxsOwotCQkJdGhpcy5tc2dEaWFsb2cgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcnVuIHRoZSBvcGVyYXRpb24gdG8gcGVyZm9ybSB0aGUgcHVibGlzaGluZyB0YXNrLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIF9ydW5JdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlydW5FeGNlcHRpb24gPSBudWxsOwotCQl0cnkgewotCQkJbW9uaXRvcgotCQkJCQkuc2V0VGFza05hbWUoUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoaW5nQ29uZmlndXJhdGlvblRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQJCQkKLQkJCXB1Ymxpc2hNZ3IucHVibGlzaChtb25pdG9yKTsKLQotCQkJcHVibGlzaGVkX3VybCA9IHB1Ymxpc2hNZ3IuZ2V0UHVibGlzaGVkVXJsKCk7Ci0JCQlyZXBvcnRfdXJsID0gcHVibGlzaE1nci5nZXRQdWJsaXNoUmVwb3J0VXJsKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlydW5FeGNlcHRpb24gPSBlOwotCQl9Ci0KLQkJZmluYWwgYm9vbGVhbiBjYW5jZWxlZCA9IG1vbml0b3IuaXNDYW5jZWxlZCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoY2FuY2VsZWQpIHsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlJbmZvKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0NBTkNFTF9NU0cpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKHJlcG9ydF91cmwgPT0gbnVsbCkgewotCQkJCQltc2dEaWFsb2cuZGlzcGxheUVycm9yKFBVQkxJU0hfQ09ORklHX0VSUk9SX1RJVExFLAotCQkJCQkJCVBVQkxJU0hfQ09ORklHX0VSUk9SX01TRywKLQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04sIHJ1bkV4Y2VwdGlvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zID0gcHVibGlzaE1nci5nZXRWaWV3QnVpbGRlcigpCi0JCQkJCQkuZ2V0T3B0aW9ucygpOwotCQkJCWJvb2xlYW4gdG9PcGVuUHVibGlzaGVkVXJpID0gZmFsc2U7Ci0JCQkJaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBQdWJsaXNoSFRNTE9wdGlvbnMpIHsKLQkJCQkJaWYgKCEoKFB1Ymxpc2hIVE1MT3B0aW9ucykgb3B0aW9ucykKLQkJCQkJCQkuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpKSB7Ci0JCQkJCQl0b09wZW5QdWJsaXNoZWRVcmkgPSB0cnVlOwotCQkJCQkJaWYgKHB1Ymxpc2hlZF91cmwgPT0gbnVsbCkgewotCQkJCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFVCTElTSF9DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9NU0csCi0JCQkJCQkJCQlQVUJMSVNIX0NPTkZJR19FUlJPUl9SRUFTT04sIHJ1bkV4Y2VwdGlvbik7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJLy8gcmVtb3ZlZCBsYXVuY2ggb2YgcHVibGlzaGVkX3VybAotCQkJCS8vIGJlY2F1c2UgbGF1bmNoaW5nIDIgVVJMUyBhdCBuZWFybHkgdGhlIHNhbWUgdGltZSAKLQkJCQkvLyB3YXMgY2F1c2luZyBwcm9ibGVtcyB3aXRoIElFNyAmIEZpcmVmb3gKLQkJCQkvLyBpbnN0ZWFkLCB0aGUgcmVwb3J0IEhUTUwgZmlsZSBoYXMgYW4KLQkJCQkvLyBvbmxvYWQgc2NyaXB0IG9mIHRoZSBib2R5IGVsZW1lbnQgdGhhdCB3aWxsCi0JCQkJLy8gbG9hZCB0aGUgcHVibGlzaGVkIHVybAotCQkJCQotCQkJCS8vIExhdW5jaCBhIEhUTUwgYnJvd3NlciB0byB2aWV3IHRoZSBwdWJsaXNoZWQgc2l0ZS4KLQkJCQlpZiAodG9PcGVuUHVibGlzaGVkVXJpICYmIG9wZW5Ccm93c2VyKHB1Ymxpc2hlZF91cmwpID09IGZhbHNlKSB7Ci0JCQkJCVN0cmluZyByZWFzb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlPUEVOX0JST1dTRVJfRVJST1JfUkVBU09OLAotCQkJCQkJCW5ldyBPYmplY3RbXSB7IHB1Ymxpc2hlZF91cmwgfSk7Ci0JCQkJCW1zZ0RpYWxvZy5kaXNwbGF5RXJyb3IoUFJFVklFV19DT05GSUdfRVJST1JfVElUTEUsCi0JCQkJCQkJUFJFVklFV19DT05GSUdfRVJST1JfTVNHLCByZWFzb24pOwotCQkJCX0KLQotCi0JCQkJLy8gTGF1bmNoIGEgSFRNTCBicm93c2VyIHRvIHZpZXcgdGhlIHJlcG9ydCBvbiB0aGUgcHVibGlzaGVkCi0JCQkJLy8gc2l0ZS4KLQkJCQlpZiAob3BlblNXVEJyb3dzZXIocmVwb3J0X3VybCkgPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIHJlYXNvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJCU9QRU5fQlJPV1NFUl9FUlJPUl9SRUFTT04sCi0JCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVwb3J0X3VybCB9KTsKLQkJCQkJbXNnRGlhbG9nLmRpc3BsYXlFcnJvcihWSUVXX1JFUE9SVF9FUlJPUl9USVRMRSwKLQkJCQkJCQlWSUVXX1JFUE9SVF9FUlJPUl9NU0csIHJlYXNvbik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJCi0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gb3BlblNXVEJyb3dzZXIoZmluYWwgU3RyaW5nIHVybFN0cmluZykgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCBTV1QuU0hFTExfVFJJTSk7Ci0JCQlzaGVsbC5zZXRUZXh0KHVybFN0cmluZyk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlzaGVsbC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCUJyb3dzZXIgcG9wdXBfYnJvd3NlciA9IG5ldyBCcm93c2VyKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCQlwb3B1cF9icm93c2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQkJcG9wdXBfYnJvd3Nlci5zZXRVcmwodXJsU3RyaW5nKTsKLQkJCXNoZWxsLm9wZW4oKTsKLQkJCXN1Y2Nlc3MgPSB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZXgpOwotCQl9Ci0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotCS8qKgotCSAqIG9wZW4gYSBicm93c2VyIHRvIHNob3cgdGhlIHB1Ymxpc2hlZCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB1cmxTdHJpbmcKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgc2l0ZSB1cmwKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBicm93c2VyIG9wZW5lZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gb3BlbkJyb3dzZXIoZmluYWwgU3RyaW5nIHVybFN0cmluZykgewotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3MgPSBQcm9ncmFtLmxhdW5jaCh1cmxTdHJpbmcpOwotCQkJfSBlbHNlIHsKLQkJCQlzdWNjZXNzID0gdHJ1ZTsKLQkJCQlJV2ViQnJvd3NlciBicm93c2VyID0gbnVsbDsKLQkJCQlJV29ya2JlbmNoQnJvd3NlclN1cHBvcnQgYnJvd3NlclN1cHBvcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEJyb3dzZXJTdXBwb3J0KCk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnJvd3NlciA9IGJyb3dzZXJTdXBwb3J0LmdldEV4dGVybmFsQnJvd3NlcigpOwotCQkJCQlpZiAoYnJvd3NlciAhPSBudWxsKSB7Ci0JCQkJCQlVUkwgdXJsID0gbmV3IEZpbGUodXJsU3RyaW5nKS50b1VSTCgpOwotCQkJCQkJYnJvd3Nlci5vcGVuVVJMKHVybCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkgewotCQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGV4KTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihleCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCXN1Y2Nlc3MgPSBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBzdWNjZXNzOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdENvbmZpZ1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1ZTI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb25maWdQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlIZWxwQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIEEgd2l6YXJkIHBhZ2UgdGhhdCBwcm9tcHRzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIG1ldGhvZCBjb25maWd1cmF0aW9uIHRvCi0gKiBwdWJsaXNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdENvbmZpZ1BhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBUaGUgd2l6YXJkIHBhZ2UgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3RDb25maWdQYWdlLmNsYXNzLmdldE5hbWUoKTsKLQotCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKLQotCXByb3RlY3RlZCBUYWJsZVZpZXdlciBjb25maWdWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgVGV4dCBicmllZkRlc2NUZXh0OwotCi0JcHJvdGVjdGVkIExpc3QgcHJvY2Vzc1ZpZXdzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWU7Ci0JCi0JcHJpdmF0ZSBNZXRob2RDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlnOwotCi0JLyoqCi0JICogCi0JICogQGF1dGhvciBza2Fubm9vcgotCSAqIEBkZXByZWNhdGVkIChzZWUgYmVsb3cgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyLikKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29uZmlndXJhdGlvblRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gY29uZmlnLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gbmV3IEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcigKLQkJCVRuZ0FkYXB0ZXJGYWN0b3J5LklOU1RBTkNFCi0JCQkJCS5nZXROYXZpZ2F0b3JWaWV3X0NvbXBvc2VkQWRhcHRlckZhY3RvcnkoKSkgewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIHN1cGVyLmdldENvbHVtblRleHQob2JqZWN0LCBjb2x1bW5JbmRleCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIHN1cGVyLmdldENvbHVtbkltYWdlKG9iamVjdCwgY29sdW1uSW5kZXgpOwotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdENvbmZpZ1BhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb25maWdXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdENvbmZpZ1dpemFyZFBhZ2VfdGV4dCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShwYXJlbnQsIDEpOwotCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmNvbmZpZ0xhYmVsX3RleHQpOwotCi0JCXRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAxMjA7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDI4MDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJY29uZmlnVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEF1dGhvcmluZ1VJVGV4dC5ERVNDUklQVElPTl9URVhUKTsKLQotCQlicmllZkRlc2NUZXh0ID0gY3JlYXRlTXVsdGlMaW5lVGV4dChjb21wb3NpdGUsICIiLCAzNjAsIDgwLCAxKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRDb250cm9scygpOwotCi0JCWFkZExpc3RlbmVycygpOwotCi0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJCi0JCQkJLmdldFdvcmtiZW5jaCgpCi0JCQkJLmdldEhlbHBTeXN0ZW0oKQotCQkJCS5zZXRIZWxwKAotCQkJCQkJY29tcG9zaXRlLAotCQkJCQkJQXV0aG9yaW5nVUlIZWxwQ29udGV4dHMuQ09ORklHVVJBVElPTl9QVUJMSVNIX1dJWkFSRF9BTExfUEFHRVNfQ09OVEVYVCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCS8vIGNvbmZpZ1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBDb25maWd1cmF0aW9uVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQljb25maWdWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJY29uZmlnVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJTGlzdDxPYmplY3Q+IGNvbmZpZ3NMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWNvbmZpZ3NMaXN0LmFkZEFsbChBcnJheXMuYXNMaXN0KGNvbmZpZ3MpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChjb25maWdzTGlzdCwgQ29tcGFyYXRvcnMuREVGQVVMVF9DT01QQVJBVE9SKTsKLQkJY29uZmlnVmlld2VyLnNldElucHV0KGNvbmZpZ3NMaXN0LnRvQXJyYXkoKSk7Ci0JCS8vIGNvbmZpZ1ZpZXdlci5zZXRJbnB1dChjb25maWdzKTsKLQotCQlpZiAoY29uZmlncy5sZW5ndGggPiAwKSB7Ci0JCQkvLyBTZWxlY3QgdGhlIGZpcnN0IGNvbmZpZyBhbmQgZGlzcGxheSBpdHMgYnJpZWYgZGVzY3JpcHRpb24uCi0JCQl0YWJsZS5zZWxlY3QoMCk7Ci0JCQlzZXRCcmllZkRlc2NyaXB0aW9uKGNvbmZpZ3NbMF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBldmVudCBoYW5kbGVycyB0byB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQljb25maWdWaWV3ZXIKLQkJCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQKLQkJCQkJCQkJLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKCFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQkJT2JqZWN0W10gY29uZmlncyA9IHNlbGVjdGlvbi50b0FycmF5KCk7Ci0JCQkJCQkJc2V0QnJpZWZEZXNjcmlwdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbikgY29uZmlnc1swXSk7Ci0JCQkJCQl9Ci0JCQkJCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCQkJCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzQ29tcGxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSA9PSBudWxsKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoTGlicmFyeVVJUmVzb3VyY2VzLm5vT3BlbkxpYnJhcnlXYXJuaW5nX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJaWYgKHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPiAwKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQkJc2VsZWN0ZWRDb25maWdOYW1lID0gaXRlbXNbMF0uZ2V0VGV4dCgpOwotCQkJLypNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkJLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIHNlbGVjdGVkQ29uZmlnTmFtZSk7Ki8KLQkJCQotCQkJCi0JCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9ICBpdGVtc1swXS5nZXREYXRhKCkgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uID8KLQkJCQkJKE1ldGhvZENvbmZpZ3VyYXRpb24pIGl0ZW1zWzBdLmdldERhdGEoKSA6IG51bGw7Ci0JCQlzZXRTZWxlY3RlZENvbmZpZyhjb25maWcpOwotCQkJCQkKLQkJCXByb2Nlc3NWaWV3cyA9IG51bGw7Ci0JCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCQlwcm9jZXNzVmlld3MgPSBnZXRWYWxpZENvbmZpZ1ZpZXdzKGNvbmZpZyk7Ci0JCQl9Ci0KLQkJCWlmIChwcm9jZXNzVmlld3MgIT0gbnVsbCAmJiBwcm9jZXNzVmlld3Muc2l6ZSgpID4gMCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLm1pc3NpbmdWaWV3RXJyb3JfbXNnKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBnZXRDb25maWdOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGxpc3Qgb2YgdmFsaWQgY29uZmlndXJhdGlvbiB2aWV3cy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnCi0JICogICAgICAgICAgICBhIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiB2aWV3cwotCSAqLwotCXByb3RlY3RlZCBMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0VmFsaWRDb25maWdWaWV3cygKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCVN0cmluZyBtc2c7Ci0JCVN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gdmlld3MgPSBuZXcgQXJyYXlMaXN0PENvbnRlbnRDYXRlZ29yeT4oKTsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IGl0ID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpLml0ZXJhdG9yKCk7IGl0Ci0JCQkJLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gaXQubmV4dCgpOwotCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuaXNDb250cmlidXRvcih2aWV3KSkgewotCQkJCW1zZyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcy5iaW5kKAotCQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3Q29udHJpYnV0b3JJbmZvX21zZywKLQkJCQkJCXZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQltZXNzYWdlLmFwcGVuZChTdHJVdGlsLlRBQikuYXBwZW5kKG1zZykuYXBwZW5kKAotCQkJCQkJU3RyVXRpbC5MSU5FX0ZFRUQpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ID0gKENvbnRlbnRDYXRlZ29yeSkgQ29uZmlndXJhdGlvbkhlbHBlcgotCQkJCQkJLmdldENhbGN1bGF0ZWRFbGVtZW50KHZpZXcsIGNvbmZpZyk7Ci0JCQkJaWYgKHZpZXcgIT0gbnVsbCkgewotCQkJCQlpZiAodmlld3MuY29udGFpbnModmlldykpIHsKLQkJCQkJCW1zZyA9IFB1Ymxpc2hpbmdVSVJlc291cmNlcwotCQkJCQkJCQkuYmluZCgKLQkJCQkJCQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFZpZXdTYW1lVmlld0luZm9fbXNnLAotCQkJCQkJCQkJCXZpZXcuZ2V0UHJlc2VudGF0aW9uTmFtZSgpKTsKLQkJCQkJCW1lc3NhZ2UuYXBwZW5kKFN0clV0aWwuVEFCKS5hcHBlbmQobXNnKS5hcHBlbmQoCi0JCQkJCQkJCVN0clV0aWwuTElORV9GRUVEKTsKLQotCQkJCQl9IGVsc2UgewotCQkJCQkJdmlld3MuYWRkKHZpZXcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQltc2cgPSBQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmluZCgKLQkJCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRWaWV3c0luZm9fbXNnLCBjb25maWcKLQkJCQkJCQkuZ2V0TmFtZSgpKTsKLQkJCW1lc3NhZ2UuaW5zZXJ0KDAsIG1zZyArIFN0clV0aWwuTElORV9GRUVEICsgU3RyVXRpbC5MSU5FX0ZFRUQpOwotCi0JCQkvLyBGSVhNRSEgU2hvdWxkIG5vdCBkaXNwbGF5IHdhcm5pbmcgbWVzc2FnZXMgaW4gdGhlIGJyaWVmCi0JCQkvLyBkZXNjcmlwdGlvbiBmaWVsZC4KLQkJCWJyaWVmRGVzY1RleHQuc2V0VGV4dChtZXNzYWdlLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHZpZXdzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdXNlciBzZWxlY3RlZCBjb25maWd1cmF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb25maWdOYW1lKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRDb25maWdOYW1lOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgQnJpZWYgRGVzY3JpcHRpb24gdGV4dCBjb250cm9sIHdpdGggdGhlIGdpdmVuCi0JICogY29uZmlndXJhdGlvbidzIGJyaWVmIGRlc2NyaXBvdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlicmllZkRlc2NUZXh0LnNldFRleHQoY29uZmlnLmdldEJyaWVmRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0U2VsZWN0ZWRDb25maWcoKSB7Ci0JCXJldHVybiBzZWxlY3RlZENvbmZpZzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRDb25maWcoTWV0aG9kQ29uZmlndXJhdGlvbiBzZWxlY3RlZENvbmZpZykgewotCQl0aGlzLnNlbGVjdGVkQ29uZmlnID0gc2VsZWN0ZWRDb25maWc7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0Q29udGVudFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNGEyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3RDb250ZW50UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkudmlld3MuUHJvY2Vzc1RyZWVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnZpZXdzLlByb2Nlc3NUcmVlVUlGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcHVibGlzaCB0aGUgZW50aXJlIG1ldGhvZAotICogY29uZmlndXJhdGlvbiBvciBvbmx5IHNwZWNpZmljIHByb2Nlc3NlcyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RDb250ZW50UGFnZSBleHRlbmRzIEJhc2VXaXphcmRQYWdlIGltcGxlbWVudHMgTGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0Q29udGVudFBhZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b247Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDaGVja2JveFRyZWVWaWV3ZXIgcHJvY2Vzc1ZpZXdlcjsKLQotCXByb3RlY3RlZCBCdXR0b24gaW5jbHVkZUJhc2VQcm9jZXNzZXNDaGVja2JveDsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQotCXByb3RlY3RlZCBjbGFzcyBQcm9jZXNzVmlld2VyQ29udGVudFByb3ZpZGVyIGV4dGVuZHMKLQkJCVByb2Nlc3NUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIExpc3Q8TWV0aG9kUGFja2FnZT4gcGFja2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZFBhY2thZ2U+KCk7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLAotCQkgKiAgICAgIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlzdXBlci5pbnB1dENoYW5nZWQodmlld2VyLCBvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlciNnZXRDaGlsZHJlbihPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIHBhcmVudEVsZW1lbnQ7Ci0JCQkJTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCQkJcGFja2FnZXMgPSBjb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJCUxpc3Q8TWV0aG9kUGx1Z2luPiBwbHVnaW5zID0gY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpOwotCQkJCWZvciAoSXRlcmF0b3I8TWV0aG9kUGx1Z2luPiBpdCA9IHBsdWdpbnMuaXRlcmF0b3IoKTsgaXQKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBpdC5uZXh0KCk7Ci0JCQkJCUxpc3Q8UHJvY2Vzcz4gcHJvY2Vzc2VzID0gVG5nVXRpbC5nZXRBbGxQcm9jZXNzZXMocGx1Z2luKTsKLQkJCQkJaWYgKHByb2Nlc3Nlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQocGx1Z2luKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gY2hpbGRyZW4udG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1RyZWVVSUZvbGRlcikgewotCQkJCVByb2Nlc3NUcmVlVUlGb2xkZXIgdWlGb2xkZXIgPSAoUHJvY2Vzc1RyZWVVSUZvbGRlcikgcGFyZW50RWxlbWVudDsKLQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgdWlGb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCQkJaWYgKHVpRm9sZGVyLmdldE5hbWUoKSA9PSBDQVBBQklMSVRZX1BBVFRFUk5TKSB7Ci0JCQkJCUxpc3Q8Q2FwYWJpbGl0eVBhdHRlcm4+IHNlbGVjdGVkQ2FwYWJpbGl0eVBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxDYXBhYmlsaXR5UGF0dGVybj4oKTsKLQkJCQkJTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gY2FwYWJpbGl0eVBhdHRlcm5zID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldENhcGFiaWxpdHlQYXR0ZXJucyhwbHVnaW4pOwotCQkJCQlmb3IgKEl0ZXJhdG9yPENhcGFiaWxpdHlQYXR0ZXJuPiBpdCA9IGNhcGFiaWxpdHlQYXR0ZXJucwotCQkJCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlDYXBhYmlsaXR5UGF0dGVybiBjcCA9IGl0Lm5leHQoKTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZ2V0UHJvY2Vzc1BhY2thZ2UoY3ApOwotCQkJCQkJaWYgKHBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCQlzZWxlY3RlZENhcGFiaWxpdHlQYXR0ZXJucy5hZGQoY3ApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBzZWxlY3RlZENhcGFiaWxpdHlQYXR0ZXJucy50b0FycmF5KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTGlzdDxEZWxpdmVyeVByb2Nlc3M+IHNlbGVjdGVkRGVsaXZlcnlQcm9jZXNzZXMgPSBuZXcgQXJyYXlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4oKTsKLQkJCQkJTGlzdDxEZWxpdmVyeVByb2Nlc3M+IGRlbGl2ZXJ5UHJvY2Vzc2VzID0gTGlicmFyeVNlcnZpY2VVdGlsCi0JCQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc2VzKHBsdWdpbik7Ci0JCQkJCWZvciAoSXRlcmF0b3I8RGVsaXZlcnlQcm9jZXNzPiBpdCA9IGRlbGl2ZXJ5UHJvY2Vzc2VzCi0JCQkJCQkJLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCURlbGl2ZXJ5UHJvY2VzcyBkcCA9IGl0Lm5leHQoKTsKLQkJCQkJCVByb2Nlc3NQYWNrYWdlIHBrZyA9IFVtYVV0aWwuZ2V0UHJvY2Vzc1BhY2thZ2UoZHApOwotCQkJCQkJaWYgKHBhY2thZ2VzLmNvbnRhaW5zKHBrZykpIHsKLQkJCQkJCQlzZWxlY3RlZERlbGl2ZXJ5UHJvY2Vzc2VzLmFkZChkcCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHNlbGVjdGVkRGVsaXZlcnlQcm9jZXNzZXMudG9BcnJheSgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0Q29udGVudFBhZ2UoKSB7Ci0JCXN1cGVyKFBBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RDb250ZW50V2l6YXJkUGFnZV90ZXh0KTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJCSJmdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMSk7Ci0KLQkJcHVibGlzaENvbmZpZ1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoQ29uZmlnUmFkaW9CdXR0b25fdGV4dCwgMSwgdHJ1ZSk7Ci0KLQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oY29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoUHJvY2Vzc2VzUmFkaW9CdXR0b25fdGV4dCwgMSwKLQkJCQlmYWxzZSk7Ci0KLQkJQ29tcG9zaXRlIHByb2Nlc3NDb21wb3NpdGUgPSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLAotCQkJCTEpOwotCi0JCXByb2Nlc3NWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKHByb2Nlc3NDb21wb3NpdGUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgKLQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSAzMDA7Ci0JCXByb2Nlc3NWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWluY2x1ZGVCYXNlUHJvY2Vzc2VzQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChwcm9jZXNzQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94TGFiZWxfdGV4dCk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSB3aXphcmQgcGFnZSBjb250cm9scyB3aXRoIGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRyb2xzKCkgewotCQlwcm9jZXNzVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgUHJvY2Vzc1ZpZXdlckNvbnRlbnRQcm92aWRlcigpKTsKLQkJcHJvY2Vzc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBQcm9jZXNzVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBwdWJsaXNoQ29uZmlnID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaEVudGlyZUNvbmZpZyhjb25maWdJZCk7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24ocHVibGlzaENvbmZpZyk7Ci0JCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oIXB1Ymxpc2hDb25maWcpOwotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKCFwdWJsaXNoQ29uZmlnKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGV2ZW50IGhhbmRsZXJzIHRvIHRoZSB3aXphcmQgcGFnZSBjb250cm9scy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB0aGlzKTsKLQkJcHVibGlzaFByb2Nlc3Nlc1JhZGlvQnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCQlpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIHRoaXMpOwotCi0JCXByb2Nlc3NWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBjaGVja2VkRWxlbWVudCA9IGV2ZW50LmdldEVsZW1lbnQoKTsKLQkJCQlib29sZWFuIGNoZWNrZWQgPSBldmVudC5nZXRDaGVja2VkKCk7Ci0KLQkJCQlwcm9jZXNzVmlld2VyLnNldENoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCXByb2Nlc3NWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoY2hlY2tlZEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJCWlmIChpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXNlbGVjdEJhc2VQcm9jZXNzZXMoKTsKLQkJCQl9Ci0JCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCi0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjaGVjayBzdGF0ZXMgb2YgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlcygpIHsKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY3AgPSAoSVRyZWVDb250ZW50UHJvdmlkZXIpIHByb2Nlc3NWaWV3ZXIKLQkJCQkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gcGx1Z2lucyA9IGNwLmdldENoaWxkcmVuKGNvbmZpZyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3RbXSB1aUZvbGRlcnMgPSBjcC5nZXRDaGlsZHJlbihwbHVnaW5zW2ldKTsKLQkJCQlpbnQgdG90YWxVSUZvbGRlcnMgPSB1aUZvbGRlcnMubGVuZ3RoOwotCQkJCWludCBjaGVja2VkVUlGb2xkZXJzID0gMDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVpRm9sZGVycy5sZW5ndGg7IGorKykgewotCQkJCQlPYmplY3RbXSBwcm9jZXNzZXMgPSBjcC5nZXRDaGlsZHJlbih1aUZvbGRlcnNbal0pOwotCQkJCQlpbnQgdG90YWxQcm9jZXNzZXMgPSBwcm9jZXNzZXMubGVuZ3RoOwotCQkJCQlpbnQgY2hlY2tlZFByb2Nlc3NlcyA9IDA7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcHJvY2Vzc2VzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQlpZiAocHJvY2Vzc1ZpZXdlci5nZXRDaGVja2VkKHByb2Nlc3Nlc1trXSkpIHsKLQkJCQkJCQljaGVja2VkUHJvY2Vzc2VzKys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNoZWNrZWRQcm9jZXNzZXMgPT0gMCkgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJfSBlbHNlIGlmIChjaGVja2VkUHJvY2Vzc2VzID09IHRvdGFsUHJvY2Vzc2VzKSB7Ci0JCQkJCQlwcm9jZXNzVmlld2VyLnNldEdyYXllZCh1aUZvbGRlcnNbal0sIGZhbHNlKTsKLQkJCQkJCXByb2Nlc3NWaWV3ZXIuc2V0Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRHcmF5Q2hlY2tlZCh1aUZvbGRlcnNbal0sIHRydWUpOwotCQkJCQl9Ci0JCQkJCWlmIChwcm9jZXNzVmlld2VyLmdldENoZWNrZWQodWlGb2xkZXJzW2pdKSkgewotCQkJCQkJY2hlY2tlZFVJRm9sZGVycysrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaGVja2VkVUlGb2xkZXJzID09IHRvdGFsVUlGb2xkZXJzKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheWVkKHBsdWdpbnNbaV0sIGZhbHNlKTsKLQkJCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKHBsdWdpbnNbaV0sIHRydWUpOwotCQkJCX0gZWxzZSBpZiAoY2hlY2tlZFVJRm9sZGVycyA9PSAwKSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByb2Nlc3NWaWV3ZXIuc2V0R3JheUNoZWNrZWQocGx1Z2luc1tpXSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgcmVmZXJlbmNlZCBiYXNlIHByb2Nlc3NlcyBpbiB0aGUgcHJvY2VzcyB0cmVlIHZpZXdlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0QmFzZVByb2Nlc3NlcygpIHsKLQkJLy8gR2V0IHRoZSByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCk7Ci0JCUxpc3Q8UHJvY2Vzcz4gYmFzZVByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlDb25maWd1cmF0aW9uSGVscGVyLmdldEJhc2VQcm9jZXNzZXMoKEFjdGl2aXR5KSBpdC5uZXh0KCksIGNvbmZpZywKLQkJCQkJYmFzZVByb2Nlc3Nlcyk7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIHByb2Nlc3MgdHJlZSB2aWV3ZXIuCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBiYXNlUHJvY2Vzc2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXQubmV4dCgpOwotCQkJcHJvY2Vzc1ZpZXdlci5zZXRDaGVja2VkKGVsZW1lbnQsIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lciNoYW5kbGVFdmVudChFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlwcm9jZXNzVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKAotCQkJCXB1Ymxpc2hQcm9jZXNzZXNSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCA9PSBpbmNsdWRlQmFzZVByb2Nlc3Nlc0NoZWNrYm94KSB7Ci0JCQkvLyBJZiBzZWxlY3RlZCwgc2VsZWN0IGFsbCByZWZlcmVuY2VkIGJhc2UgcHJvY2Vzc2VzLgotCQkJc2VsZWN0QmFzZVByb2Nlc3NlcygpOwotCQkJdXBkYXRlQ2hlY2tlZFN0YXRlcygpOwotCQl9Ci0KLQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQlnZXRXaXphcmQoKS5nZXRDb250YWluZXIoKS51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZSNvbkVudGVyUGFnZShPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgb25FbnRlclBhZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqICE9IG51bGwgJiYgb2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlTdHJpbmcgY29uZmlnTmFtZSA9IChTdHJpbmcpIG9iajsKLQkJCWNvbmZpZyA9IExpYnJhcnlTZXJ2aWNlVXRpbC5nZXRNZXRob2RDb25maWd1cmF0aW9uKExpYnJhcnlTZXJ2aWNlCi0JCQkJCS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCksIGNvbmZpZ05hbWUpOwotCQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkJcHJvY2Vzc1ZpZXdlci5zZXRJbnB1dChjb25maWcpOwotCQkJCXByb2Nlc3NWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlI2lzUGFnZUNvbXBsZXRlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHB1Ymxpc2hDb25maWdSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGdldFNlbGVjdGVkUHJvY2Vzc2VzKCkuc2l6ZSgpID4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgc2VsZWN0ZWQgcHJvY2Vzc2VzIHRvIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Qcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFB1Ymxpc2hDb25maWdTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlnUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhbGwgdGhlIHVzZXIgc2VsZWN0ZWQgcHJvY2Vzc2VzIHRvIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiA8Y29kZT5Qcm9jZXNzPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMaXN0PFByb2Nlc3M+IGdldFNlbGVjdGVkUHJvY2Vzc2VzKCkgewotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IG5ldyBBcnJheUxpc3Q8UHJvY2Vzcz4oKTsKLQkJT2JqZWN0W10gc2VsZWN0ZWQgPSBwcm9jZXNzVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOwotCQlpZiAoc2VsZWN0ZWQgIT0gbnVsbCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkW2ldIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQlwcm9jZXNzZXMuYWRkKChQcm9jZXNzKSBzZWxlY3RlZFtpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdWkvd2l6YXJkcy9TZWxlY3REZXN0aW5hdGlvblBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDc3YjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdERlc3RpbmF0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLnV0aWwuQ29tbW9uUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5QdWJsaXNoaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkucHJlZmVyZW5jZXMuUHVibGlzaGluZ1VJUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuQmFzZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBBIHdpemFyZCBwYWdlIHRoYXQgcHJvbXB0cyB0aGUgdXNlciB0byBzZWxlY3QgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBhbmQKLSAqIGZvcm1hdCBmb3IgdGhlIHB1Ymxpc2hlZCB3ZWIgc2l0ZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3REZXN0aW5hdGlvblBhZ2UgZXh0ZW5kcyBCYXNlV2l6YXJkUGFnZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUdFX05BTUUgPSBTZWxlY3REZXN0aW5hdGlvblBhZ2UuY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX0RFTElNSVRFUiA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BMSVRfUFJFRkVSRU5DRV9ERUxJTUlURVIgPSAiXFwiICsgUFJFRkVSRU5DRV9ERUxJTUlURVI7Ly8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFBhdGggPSBQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJLmdldERlZmF1bHRQdWJsaXNoUGF0aCgpOwotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIENvbWJvIGRpckNvbWJvOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQlwcm90ZWN0ZWQgR3JvdXAgd2ViQXBwR3JvdXA7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbjsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgc3RhdGljV2ViU2l0ZUNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBCdXR0b24gamF2YVdlYkFwcFJhZGlvQnV0dG9uOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBqYXZhV2ViQXBwQ29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIExhYmVsIHdlYkFwcE5hbWVMYWJlbDsKLQotCXByb3RlY3RlZCBDb21ibyB3ZWJBcHBOYW1lQ29tYm87Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGluY2x1ZGVTZWFyY2hDaGVja2JveDsKLQotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IHNlbGVjdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlbGVjdERlc3RpbmF0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNlbGVjdERlc3RpbmF0aW9uV2l6YXJkUGFnZV90aXRsZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0RGVzdGluYXRpb25XaXphcmRQYWdlX3RleHQsCi0JCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJCQkiZnVsbC93aXpiYW4vUHVibGlzaENvbmZpZ3VyYXRpb24uZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0RGVzdGluYXRpb25QYWdlKCkgewotCQl0aGlzKFBBR0VfTkFNRSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCi0JCWNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQlDb21wb3NpdGUgZGlyQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShjb21wb3NpdGUsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKGRpckNvbXBvc2l0ZSwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRpckxhYmVsX3RleHQpOwotCi0JCWRpckNvbWJvID0gY3JlYXRlQ29tYm9ib3goZGlyQ29tcG9zaXRlKTsKLQotCQlicm93c2VCdXR0b24gPSBjcmVhdGVCdXR0b24oZGlyQ29tcG9zaXRlLAotCQkJCUF1dGhvcmluZ1VJVGV4dC5CUk9XU0VfQlVUVE9OX1RFWFQpOwotCi0JCXdlYkFwcEdyb3VwID0gc3VwZXIuY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwR3JvdXBfdGV4dCwgMSk7Ci0KLQkJc3RhdGljV2ViU2l0ZVJhZGlvQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24od2ViQXBwR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbl90ZXh0KTsKLQotCQlzdGF0aWNXZWJTaXRlQ29tcG9zaXRlID0gY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHdlYkFwcEdyb3VwLCAxKTsKLQotCQlqYXZhV2ViQXBwUmFkaW9CdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbih3ZWJBcHBHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZHluYW1pY1dlYkFwcFJhZGlvQnV0dG9uX3RleHQpOwotCi0JCWphdmFXZWJBcHBDb21wb3NpdGUgPSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUod2ViQXBwR3JvdXAsIDMpOwotCi0JCWluY2x1ZGVTZWFyY2hDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGphdmFXZWJBcHBDb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmluY2x1ZGVTZWFyY2hDaGVja2JveF90ZXh0LCAzKTsKLQotCQl3ZWJBcHBOYW1lTGFiZWwgPSBjcmVhdGVMYWJlbChqYXZhV2ViQXBwQ29tcG9zaXRlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy53ZWJBcHBsaWNhdGlvbk5hbWVMYWJlbF90ZXh0KTsKLQotCQl3ZWJBcHBOYW1lQ29tYm8gPSBjcmVhdGVDb21ib2JveChqYXZhV2ViQXBwQ29tcG9zaXRlLCAyKTsKLQotCQlpbml0Q29udHJvbHMoKTsKLQotCQlhZGRMaXN0ZW5lcnMoKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzIHdpdGggZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29udHJvbHMoKSB7Ci0JCVN0cmluZyBjb25maWdJZCA9IGNvbmZpZyAhPSBudWxsID8gY29uZmlnLmdldEd1aWQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGRpciA9IFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLmdldFB1Ymxpc2hQYXRoKGNvbmZpZ0lkKTsKLQkJaWYgKGRpciAhPSBudWxsICYmIGRpci5sZW5ndGgoKSA+IDApIHsKLQkJCWRpckNvbWJvLnNldEl0ZW1zKHN1YkFycmF5KGNvdmVyU3RyaW5nVG9BcnJheShkaXIpKSk7Ci0JCQlkaXJDb21iby5zZWxlY3QoMCk7Ci0JCX0KLQotCQlib29sZWFuIHB1Ymxpc2hTdGF0aWNXZWJTaXRlID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQpOwotCQlzdGF0aWNXZWJTaXRlUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHB1Ymxpc2hTdGF0aWNXZWJTaXRlKTsKLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbighcHVibGlzaFN0YXRpY1dlYlNpdGUpOwotCi0JCWluY2x1ZGVTZWFyY2hDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0SW5jbHVkZVNlYXJjaChjb25maWdJZCkpOwotCi0JCVN0cmluZyB3ZWJBcHBOYW1lID0gUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0V2ViQXBwTmFtZShjb25maWdJZCk7Ci0JCWlmICh3ZWJBcHBOYW1lICE9IG51bGwgJiYgd2ViQXBwTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXdlYkFwcE5hbWVDb21iby5zZXRJdGVtcyhuZXcgU3RyaW5nW10geyB3ZWJBcHBOYW1lIH0pOwotCQkJd2ViQXBwTmFtZUNvbWJvLnNldFRleHQod2ViQXBwTmFtZSk7Ci0JCX0KLQotCQl1cGRhdGVDb250cm9scygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZXZlbnQgaGFuZGxlcnMgdG8gdGhlIHdpemFyZCBwYWdlIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJZGlyQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCXRyeSB7Ci0JCQkJCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHNoZWxsLAotCQkJCQkJCVNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGVkRGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJaWYgKHNlbGVjdGVkRGlyICE9IG51bGwpIHsKLQkJCQkJCWRpckNvbWJvLnNldFRleHQoc2VsZWN0ZWREaXIpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJamF2YVdlYkFwcFJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb250cm9scygpOwotCQkJfQotCQl9KTsKLQotCQl3ZWJBcHBOYW1lQ29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gc3ViQXJyYXkoU3RyaW5nW10gYXJyKSB7Ci0JCWludCBsbCA9IENvbW1vblByZWZlcmVuY2VzLmdldFByZWZlcmVuY2VIaXN0b3J5U2l6ZSgpOwotCQlpZiAobGwgPCAxKQotCQkJbGwgPSBDb21tb25QcmVmZXJlbmNlcy5nZXREZWZhdWx0UHJlZmVyZW5jZUhpc3RvcnlTaXplKCk7Ci0KLQkJaW50IGFyckxlbmd0aCA9IGFyci5sZW5ndGg7Ci0KLQkJaWYgKGFyckxlbmd0aCA8IGxsICYmIGFyclswXS5lcXVhbHMoZGVmYXVsdFBhdGgpKQotCQkJcmV0dXJuIGFycjsKLQotCQlsbCA9IGFyckxlbmd0aCA+PSBsbCA/IGxsIDogYXJyTGVuZ3RoICsgMTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tsbF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGwgLSAxOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycltpXTsKLQkJfQotCQlyZXN1bHRbbGwgLSAxXSA9IGFyclswXS5lcXVhbHMoZGVmYXVsdFBhdGgpID8gYXJyW2xsXSA6IGRlZmF1bHRQYXRoOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvdmVyU3RyaW5nVG9BcnJheShTdHJpbmcgcHJlZmVyZW5jZVN0cikgewotCQlyZXR1cm4gcHJlZmVyZW5jZVN0ci5zcGxpdChTUExJVF9QUkVGRVJFTkNFX0RFTElNSVRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0QXJyYXlUb1N0cmluZyhTdHJpbmdbXSBhcnIpIHsKLQkJU3RyaW5nQnVmZmVyIHNCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChhcnIgPT0gbnVsbCB8fCBhcnIubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gc0J1ZmZlci50b1N0cmluZygpOwotCQlzQnVmZmVyLmFwcGVuZChhcnJbMF0pOwotCQlmb3IgKGludCBpID0gMTsgaSA8IGFyci5sZW5ndGg7IGkrKykgewotCQkJc0J1ZmZlci5hcHBlbmQoUFJFRkVSRU5DRV9ERUxJTUlURVIpOwotCQkJc0J1ZmZlci5hcHBlbmQoYXJyW2ldKTsKLQkJfQotCQlyZXR1cm4gc0J1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JCWJvb2xlYW4gcHVibGlzaFN0YXRpY1dlYlNpdGUgPSBnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCk7Ci0JCXdlYkFwcE5hbWVMYWJlbC5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCXdlYkFwcE5hbWVDb21iby5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCWluY2x1ZGVTZWFyY2hDaGVja2JveC5zZXRFbmFibGVkKCFwdWJsaXNoU3RhdGljV2ViU2l0ZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQljb25maWcgPSAoTWV0aG9kQ29uZmlndXJhdGlvbikgb2JqOwotCQkJaWYgKCFzZWxlY3RlZENvbmZpZ3MuY29udGFpbnMoY29uZmlnKSkgewotCQkJCXNlbGVjdGVkQ29uZmlncy5hZGQoY29uZmlnKTsKLQkJCQlpbml0Q29udHJvbHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2UjaXNDb21wbGV0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlTdHJpbmcgcGF0aCA9IGdldFB1Ymxpc2hEaXJlY3RvcnkoKTsKLQkJSVBhdGggZWNQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcocGF0aCk7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGVjUGF0aC5pc1ZhbGlkUGF0aChwYXRoKTsKLQkJaWYgKCFpc1ZhbGlkKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UoUHVibGlzaGluZ1VJUmVzb3VyY2VzLmludmFsaWRQYXRoRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZFBhdGhDaGFyc0Vycm9yX21zZyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQkJaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFnZXRTdGF0aWNXZWJTaXRlU2VsZWN0aW9uKCkpIHsKLQkJCVN0cmluZyB3ZWJBcHBOYW1lID0gZ2V0V2ViQXBwTmFtZSgpOwotCQkJaWYgKHdlYkFwcE5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwTmFtZUVycm9yX21zZyk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkTmFtZSh3ZWJBcHBOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMud2ViQXBwTmFtZUNoYXJzRXJyb3JfbXNnKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGlzaERpcmVjdG9yeSgpIHsKLQkJU3RyaW5nIGRpclRleHQgPSBkaXJDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoZGlyVGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQlyZXR1cm4gZGlyLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBkaXJUZXh0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRQdWJsaXNoRGlyZWN0b3J5QXJyYXkoKSB7Ci0JCVN0cmluZyBzZWxlY3RlZHRleHQgPSBkaXJDb21iby5nZXRUZXh0KCk7Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2Yoc2VsZWN0ZWR0ZXh0KSA+IDApIHsKLQkJCWRpckNvbWJvLnJlbW92ZShzZWxlY3RlZHRleHQpOwotCQl9Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2Yoc2VsZWN0ZWR0ZXh0KSA8IDApIHsKLQkJCWRpckNvbWJvLmFkZChzZWxlY3RlZHRleHQsIDApOwotCQl9Ci0KLQkJaWYgKGRpckNvbWJvLmluZGV4T2YoZGVmYXVsdFBhdGgpID4gMCkgewotCQkJZGlyQ29tYm8ucmVtb3ZlKGRlZmF1bHRQYXRoKTsKLQkJfQotCi0JCXJldHVybiBkaXJDb21iby5nZXRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHN0YXRpYyB3ZWIgc2l0ZSBzZWxlY3Rpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RhdGljV2ViU2l0ZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHN0YXRpY1dlYlNpdGVSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgamF2YSB3ZWIgYXBwbGljYXRpb24gc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEphdmFXZWJBcHBTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBqYXZhV2ViQXBwUmFkaW9CdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgaW5jbHVkZSBzZWFyY2ggc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVTZWFyY2hTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBpbmNsdWRlU2VhcmNoQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2ViIGFwbGljYXRpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlYkFwcE5hbWUoKSB7Ci0JCXJldHVybiB3ZWJBcHBOYW1lQ29tYm8uZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgdXNlciBzZWxlY3Rpb25zIGluIHRoaXMgd2l6YXJkIHBhZ2UgdG8gcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnLmdldEd1aWQoKTsKLQkJCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFB1Ymxpc2hQYXRoKGNvbmZpZ0lkLAotCQkJCQljb252ZXJ0QXJyYXlUb1N0cmluZyhnZXRQdWJsaXNoRGlyZWN0b3J5QXJyYXkoKSkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFN0YXRpY1dlYlNpdGUoY29uZmlnSWQsCi0JCQkJCWdldFN0YXRpY1dlYlNpdGVTZWxlY3Rpb24oKSk7Ci0JCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlU2VhcmNoKGNvbmZpZ0lkLAotCQkJCQlnZXRJbmNsdWRlU2VhcmNoU2VsZWN0aW9uKCkpOwotCQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0V2ViQXBwTmFtZShjb25maWdJZCwgZ2V0V2ViQXBwTmFtZSgpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91aS93aXphcmRzL1NlbGVjdFB1Ymxpc2hpbmdPcHRpb25zUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ODEyZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3VpL3dpemFyZHMvU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJSGVscENvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQXV0aG9yaW5nVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5lbGVtZW50cy5BY3Rpdml0eUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5QdWJsaXNoSFRNTE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuUHVibGlzaE9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkuUHVibGlzaGluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLlB1Ymxpc2hpbmdVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wcmVmZXJlbmNlcy5QdWJsaXNoaW5nVUlQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5CYXNlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gc2VsZWN0IHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgZm9yIHRoZQotICogZ2VuZXJhdGVkIHdlYiBzaXRlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqIGZpeCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwNjU2NwotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlIGV4dGVuZHMgQmFzZVdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogVGhlIHdpemFyZCBwYWdlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9OQU1FID0gU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJvdGVjdGVkIFNoZWxsIHNoZWxsOwotCi0JcHJvdGVjdGVkIFRleHQgdGl0bGVUZXh0OwotCi0JcHJvdGVjdGVkIFRleHQgYWJvdXRIVE1MVGV4dDsKLQotCXByb3RlY3RlZCBUZXh0IGZlZWRiYWNrVVJMVGV4dDsKLQotCXByb3RlY3RlZCBCdXR0b24gc2VsZWN0SFRNTEJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaEdsb3NzYXJ5Q2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hJbmRleENoZWNrYm94OwotCi0JcHJvdGVjdGVkIFRleHQgYmFubmVySW1hZ2VUZXh0OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzZWxlY3RJbWFnZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBCdXR0b24gY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBwdWJsaXNoVW5vcGVuQUREQ2hlY2tib3g7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIHB1Ymxpc2hCYXNlQURDaGVja2JveDsKLQotCXByb3RlY3RlZCBCdXR0b24gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZUNoZWNrYm94OwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlOwotCi0JcHJvdGVjdGVkIENvbWJvVmlld2VyIGFjdGl2aXR5VGFiVmlld2VyOwotCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnOwotCi0JcHJvdGVjdGVkIExpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gc2VsZWN0ZWRDb25maWdzID0gbmV3IEFycmF5TGlzdDxNZXRob2RDb25maWd1cmF0aW9uPigpOwotCi0JcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFjdGl2aXR5VGFiTWFwID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQlzdGF0aWMgewotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfREVTQywKLQkJCQlBdXRob3JpbmdVSVJlc291cmNlcy5kZXNjcmlwdGlvblBhZ2VfdGl0bGUpOwotCQlhY3Rpdml0eVRhYk1hcC5wdXQoQWN0aXZpdHlMYXlvdXQuVEFCX05BTUVfQUNUSVZJVFlfV0JTLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfV29ya0JyZWFrZG93blN0cnVjdHVyZSk7Ci0JCWFjdGl2aXR5VGFiTWFwLnB1dChBY3Rpdml0eUxheW91dC5UQUJfTkFNRV9BQ1RJVklUWV9UQlMsCi0JCQkJQXV0aG9yaW5nVUlSZXNvdXJjZXMuUHJvY2Vzc0VkaXRvcl9UZWFtQWxsb2NhdGlvbik7Ci0JCWFjdGl2aXR5VGFiTWFwLnB1dChBY3Rpdml0eUxheW91dC5UQUJfTkFNRV9BQ1RJVklUWV9XUEJTLAotCQkJCUF1dGhvcmluZ1VJUmVzb3VyY2VzLlByb2Nlc3NFZGl0b3JfV29ya1Byb2R1Y3RVc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0UHVibGlzaGluZ09wdGlvbnNQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0UHVibGlzaGluZ09wdGlvbnNXaXphcmRQYWdlX3RpdGxlLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5zZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1dpemFyZFBhZ2VfdGV4dCwKLQkJCQlQdWJsaXNoaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkJCSJmdWxsL3dpemJhbi9QdWJsaXNoQ29uZmlndXJhdGlvbi5naWYiKSk7IC8vJE5PTi1OTFMtMSQJCQkKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWxlY3RQdWJsaXNoaW5nT3B0aW9uc1BhZ2UoKSB7Ci0JCXRoaXMoUEFHRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1BhZ2UjY3JlYXRlQ29udHJvbChDb21wb3NpdGUpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQljcmVhdGVUaXRsZUFuZExpbmtzR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlR2xvc3NhcnlBbmRJbmRleEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUxvb2tBbmRGZWVsR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlVmFsaWRhdGlvbihjb21wb3NpdGUpOwotCQljcmVhdGVEaWFncmFtR2VuZXJhdGlvbkdyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUxheW91dEdyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJaW5pdENvbnRyb2xzKCk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0KLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkKLQkJCQkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0SGVscFN5c3RlbSgpCi0JCQkJLnNldEhlbHAoCi0JCQkJCQljb21wb3NpdGUsCi0JCQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5DT05GSUdVUkFUSU9OX1BVQkxJU0hfV0laQVJEX0FMTF9QQUdFU19DT05URVhUKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBUaXRsZSBhbmQgbGlua3MgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlVGl0bGVBbmRMaW5rc0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgdGl0bGVBbmRMaW5rc0dyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudGl0bGVBbmRMaW5rc0dyb3VwX3RleHQsIDMpOwotCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwgUHVibGlzaGluZ1VJUmVzb3VyY2VzLnRpdGxlTGFiZWxfdGV4dCk7Ci0JCXRpdGxlVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh0aXRsZUFuZExpbmtzR3JvdXAsICIiLCAzNjAsIDEpOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKHRpdGxlQW5kTGlua3NHcm91cCwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5hYm91dEhUTUxMYWJlbF90ZXh0KTsKLQkJYWJvdXRIVE1MVGV4dCA9IGNyZWF0ZUVkaXRhYmxlVGV4dCh0aXRsZUFuZExpbmtzR3JvdXAsICIiLCAzNjAsIDEpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdEhUTUxCdXR0b24gPSBuZXcgQnV0dG9uKHRpdGxlQW5kTGlua3NHcm91cCwgU1dULk5PTkUpOwotCQlzZWxlY3RIVE1MQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCk7Ci0KLQkJY3JlYXRlTGFiZWwodGl0bGVBbmRMaW5rc0dyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5mZWVkYmFja1VSTExhYmVsX3RleHQpOwotCQlmZWVkYmFja1VSTFRleHQgPSBjcmVhdGVFZGl0YWJsZVRleHQodGl0bGVBbmRMaW5rc0dyb3VwLCAiIiwgMzYwLCAxKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVMYWJlbCh0aXRsZUFuZExpbmtzR3JvdXAsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiB0aXRsZUFuZExpbmtzR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgTG9vayBhbmQgZmVlbCBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVMb29rQW5kRmVlbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgbG9va0FuZEZlZWxHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmxvb2tBbmRGZWVsR3JvdXBfdGV4dCwgMyk7Ci0KLQkJY3JlYXRlTGFiZWwobG9va0FuZEZlZWxHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuYmFubmVySW1hZ2VMYWJlbF90ZXh0KTsKLQkJYmFubmVySW1hZ2VUZXh0ID0gY3JlYXRlRWRpdGFibGVUZXh0KGxvb2tBbmRGZWVsR3JvdXAsICIiLCAzNjAsIDEpOyAvLyROT04tTkxTLTEkCi0JCXNlbGVjdEltYWdlQnV0dG9uID0gbmV3IEJ1dHRvbihsb29rQW5kRmVlbEdyb3VwLCBTV1QuTk9ORSk7Ci0JCXNlbGVjdEltYWdlQnV0dG9uLnNldFRleHQoQXV0aG9yaW5nVUlUZXh0LlNFTEVDVF9CVVRUT05fVEVYVCk7Ci0KLQkJcmV0dXJuIGxvb2tBbmRGZWVsR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgR2xvc2FyeSBhbmQgaW5kZXggZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlR2xvc3NhcnlBbmRJbmRleEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ2xvc3NhcnlBbmRJbmRleEdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuZ2xvc3NhcnlBbmRJbmRleEdyb3VwX3RleHQsIDIpOwotCi0JCXB1Ymxpc2hHbG9zc2FyeUNoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZ2xvc3NhcnlBbmRJbmRleEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoR2xvc3NhcnlMYWJlbF90ZXh0KTsKLQkJcHVibGlzaEluZGV4Q2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChnbG9zc2FyeUFuZEluZGV4R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hJbmRleExhYmVsX3RleHQpOwotCi0JCXJldHVybiBnbG9zc2FyeUFuZEluZGV4R3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgVmFsaWRhdGlvbiBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gdGhlIGdyb3VwIGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCBHcm91cCBjcmVhdGVWYWxpZGF0aW9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgdmFsaWRhdGlvbkdyb3VwID0gY3JlYXRlR3JpZExheW91dEdyb3VwKGNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMudmFsaWRhdGlvbkdyb3VwX3RleHQsIDIpOwotCi0JCWNoZWNrRXh0ZXJuYWxMaW5rc0NoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3godmFsaWRhdGlvbkdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5jaGVja0V4dGVybmFsTGlua3NMYWJlbF90ZXh0KTsKLQotCQljb252ZXJ0QnJva2VuTGlua3NDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KHZhbGlkYXRpb25Hcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuY29udmVydEJyb2tlbkxpbmtzTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBEaWFncmFtIEdlbmVyYXRpb24gZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlRGlhZ3JhbUdlbmVyYXRpb25Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGRpYWdyYW1Hcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmRpYWdyYW1Hcm91cF90ZXh0LCAxKTsKLQotCQlwdWJsaXNoVW5vcGVuQUREQ2hlY2tib3ggPSBjcmVhdGVDaGVja2JveChkaWFncmFtR3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnB1Ymxpc2hBY3Rpdml0eURldGFpbERpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJcHVibGlzaEJhc2VBRENoZWNrYm94ID0gY3JlYXRlQ2hlY2tib3goZGlhZ3JhbUdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoRXh0ZW5kZWRBY3Rpdml0eURpYWdyYW1zTGFiZWxfdGV4dCk7Ci0KLQkJcmV0dXJuIGRpYWdyYW1Hcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBMYXlvdXQgZ3JvdXAuCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZQotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIHRoZSBncm91cCBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlTGF5b3V0R3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBsYXlvdXRHcm91cCA9IGNyZWF0ZUdyaWRMYXlvdXRHcm91cChjb21wb3NpdGUsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLmxheW91dEdyb3VwX3RleHQsIDEpOwotCi0JCXB1Ymxpc2hMaWdodFdlaWdodFRyZWVDaGVja2JveCA9IGNyZWF0ZUNoZWNrYm94KGxheW91dEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5wdWJsaXNoTGlnaHRXZWlnaHRUcmVlTGFiZWxfdGV4dCk7Ci0KLQkJc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSA9IGNyZWF0ZUNoZWNrYm94KGxheW91dEdyb3VwLAotCQkJCVB1Ymxpc2hpbmdVSVJlc291cmNlcy5zaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlX3RleHQpOwotCi0JCWV4dHJhRGVzY3JpcHRvckluZm9DdHIgPSBjcmVhdGVDaGVja2JveChsYXlvdXRHcm91cCwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMucHVibGlzaEV4dHJhRGVzY3JpcHRvckluZm9MYWJlbF90ZXh0KTsKLQotCQlzaG93UmVsYXRlZERlc2NyaXB0b3JzID0gY3JlYXRlQ2hlY2tib3gobGF5b3V0R3JvdXAsCi0JCQkJUHVibGlzaGluZ1VJUmVzb3VyY2VzLnNob3dSZWxhdGVkRGVzY3JpcHRvcnNfdGV4dCk7Ci0KLQkJQ29tcG9zaXRlIGFjdGl2aXR5VGFiQ29tcG9zaXRlID0gY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShsYXlvdXRHcm91cCwKLQkJCQkyKTsKLQkJKChHcmlkTGF5b3V0KSBhY3Rpdml0eVRhYkNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gLTU7Ci0JCSgoR3JpZExheW91dCkgYWN0aXZpdHlUYWJDb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm1hcmdpbkxlZnQgPSAtNTsKLQotCQljcmVhdGVMYWJlbChhY3Rpdml0eVRhYkNvbXBvc2l0ZSwKLQkJCQlQdWJsaXNoaW5nVUlSZXNvdXJjZXMuc2VsZWN0RGVmYXVsdEFjdGl2aXR5VGFiX3RleHQpOwotCi0JCWFjdGl2aXR5VGFiVmlld2VyID0gbmV3IENvbWJvVmlld2VyKGFjdGl2aXR5VGFiQ29tcG9zaXRlLCBTV1QuQk9SREVSCi0JCQkJfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HCi0JCQkJfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlhY3Rpdml0eVRhYlZpZXdlci5nZXRDb21ibygpLnNldExheW91dERhdGEoZ2QpOwotCi0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgcGFyYW0pIHsKLQkJCQlpZiAocGFyYW0gaW5zdGFuY2VvZiBNYXAuRW50cnkpIHsKLQkJCQkJcmV0dXJuIChTdHJpbmcpICgoTWFwLkVudHJ5KSBwYXJhbSkuZ2V0VmFsdWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gcGFyYW0udG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWFjdGl2aXR5VGFiVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0KLQkJcmV0dXJuIGxheW91dEdyb3VwOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGUgYSBtZWFucyB0byBhZGQgYWRkaXRpb25hbCBvcHRpb25zIHRvIHRoZSBwdWJsaXNoZWQgd2ViIHNpdGUKLQkgKiBncm91cC4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluY2x1ZGVBZGRpdGlvbmFsUHVibGlzaGluZ09wdGlvbnMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucyBncm91cHMgdG8gdGhpcyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVB1Ymxpc2hpbmdPcHRpb25zR3JvdXBzKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgd2l6YXJkIHBhZ2UgY29udHJvbHMgd2l0aCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRDb250cm9scygpIHsKLQkJU3RyaW5nIGNvbmZpZ0lkID0gY29uZmlnICE9IG51bGwgPyBjb25maWcuZ2V0R3VpZCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQl0aXRsZVRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5nZXRUaXRsZShjb25maWdJZCkpOwotCQliYW5uZXJJbWFnZVRleHQuc2V0VGV4dChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRCYW5uZXJJbWFnZShjb25maWdJZCkpOwotCQlhYm91dEhUTUxUZXh0LnNldFRleHQoUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuZ2V0QWJvdXRIVE1MKGNvbmZpZ0lkKSk7Ci0JCWZlZWRiYWNrVVJMVGV4dC5zZXRUZXh0KFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEZlZWRiYWNrVVJMKGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hHbG9zc2FyeUNoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnSWQpKTsKLQkJcHVibGlzaEluZGV4Q2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldEluY2x1ZGVJbmRleChjb25maWdJZCkpOwotCQljaGVja0V4dGVybmFsTGlua3NDaGVja2JveC5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q2hlY2tFeHRlcm5hbExpbmtzKGNvbmZpZ0lkKSk7Ci0JCWNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRDb252ZXJ0QnJva2VuTGlua3MoY29uZmlnSWQpKTsKLQkJcHVibGlzaFVub3BlbkFERENoZWNrYm94LnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRQdWJsaXNoVW5vcGVuQWN0aXZpdHlERChjb25maWdJZCkpOwotCQlwdWJsaXNoQmFzZUFEQ2hlY2tib3guc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFB1Ymxpc2hBREZvckFjdGl2aXR5RXh0ZW5zaW9uKGNvbmZpZ0lkKSk7Ci0JCXB1Ymxpc2hMaWdodFdlaWdodFRyZWVDaGVja2JveC5zZXRTZWxlY3Rpb24oIVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldExpZ2h0V2VpZ2h0VHJlZShjb25maWdJZCkpOwotCQlleHRyYURlc2NyaXB0b3JJbmZvQ3RyLnNldFNlbGVjdGlvbihQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCS5nZXRFeHRyYURlc2NyaXB0b3JJbmZvKGNvbmZpZ0lkKSk7Ci0JCXNob3dSZWxhdGVkRGVzY3JpcHRvcnMuc2V0U2VsZWN0aW9uKFB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzCi0JCQkJLmdldFNob3dSZWxhdGVkRGVzY3JpcHRvcnMoY29uZmlnSWQpKTsKLQkJc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZS5zZXRTZWxlY3Rpb24oUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShjb25maWdJZCkpOwotCi0JCWlmIChhY3Rpdml0eVRhYlZpZXdlci5nZXRDb21ibygpLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCWFjdGl2aXR5VGFiVmlld2VyLmFkZChhY3Rpdml0eVRhYk1hcC5lbnRyeVNldCgpLnRvQXJyYXkoKSk7Ci0JCX0KLQkJYWN0aXZpdHlUYWJWaWV3ZXIuZ2V0Q29tYm8oKS5zZXRUZXh0KAotCQkJCWFjdGl2aXR5VGFiTWFwLmdldChQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcwotCQkJCQkJLmdldERlZmF1bHRBY3Rpdml0eVRhYihjb25maWdJZCkpKTsKLQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVycyBmb3IgdGhlIGNvbnRyb2xzIG9uIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCXNlbGVjdEltYWdlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCQkJCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJIiouZ2lmIiwgIiouanBnIiwgIiouYm1wIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJU3RyaW5nIGltYWdlRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCkgewotCQkJCQkJYmFubmVySW1hZ2VUZXh0LnNldFRleHQoaW1hZ2VGaWxlKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVB1Ymxpc2hpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQlzZWxlY3RIVE1MQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0JCQkJCWRpYWxvZwotCQkJCQkJCS5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkiKi5odG0iLCAiKi5odG1sIiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBodG1sRmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJCWlmIChodG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlhYm91dEhUTUxUZXh0LnNldFRleHQoaHRtbEZpbGUpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJUHVibGlzaGluZ1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWFib3V0SFRNTFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI29uRW50ZXJQYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uKSB7Ci0JCQlNZXRob2RDb25maWd1cmF0aW9uIHNlbGVjdGVkQ29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG9iajsKLQkJCWlmICghc2VsZWN0ZWRDb25maWdzLmNvbnRhaW5zKHNlbGVjdGVkQ29uZmlnKSkgewotCQkJCXNlbGVjdGVkQ29uZmlncy5hZGQoc2VsZWN0ZWRDb25maWcpOwotCQkJfQotCQkJaWYgKHNlbGVjdGVkQ29uZmlnICE9IGNvbmZpZykgewotCQkJCWNvbmZpZyA9IHNlbGVjdGVkQ29uZmlnOwotCQkJCWluaXRDb250cm9scygpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNpc1BhZ2VDb21wbGV0ZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCVN0cmluZyBwYXRoID0gYWJvdXRIVE1MVGV4dC5nZXRUZXh0KCk7Ci0JCUlQYXRoIGVjUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKHBhdGgpOwotCQlib29sZWFuIGlzVmFsaWQgPSBlY1BhdGguaXNWYWxpZFBhdGgocGF0aCk7Ci0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFB1Ymxpc2hpbmdVSVJlc291cmNlcy5pbnZhbGlkQWJvdXRQYXRoRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghU3RyVXRpbC5pc1ZhbGlkUHVibGlzaFBhdGgocGF0aCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShQdWJsaXNoaW5nVUlSZXNvdXJjZXMuaW52YWxpZEFib3V0UGF0aENoYXJzRXJyb3JfbXNnKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLkJhc2VXaXphcmRQYWdlI2dldE5leHRQYWdlRGF0YSgpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROZXh0UGFnZURhdGEoKSB7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzZWxlY3RlZCBwdWJsaXNoaW5nIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlB1Ymxpc2hPcHRpb25zPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaGluZ09wdGlvbnMoKSB7Ci0JCVB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zID0gbmV3IFB1Ymxpc2hIVE1MT3B0aW9ucygpOwotCi0JCW9wdGlvbnMuc2V0VGl0bGUoZ2V0V2ViU2l0ZVRpdGxlKCkpOwotCQlvcHRpb25zLnNldEJhbm5lckltYWdlKGdldEJhbm5lckltYWdlUGF0aCgpKTsKLQkJb3B0aW9ucy5zZXRBYm91dEhUTUwoZ2V0QWJvdXRIVE1MUGF0aCgpKTsKLQkJb3B0aW9ucy5zZXRGZWVkYmFja1VSTChnZXRGZWVkYmFja1VSTCgpKTsKLQkJb3B0aW9ucy5zZXRQdWJsaXNoR2xvc3NhcnkoZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldFB1Ymxpc2hJbmRleChnZXRQdWJsaXNoSW5kZXhTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0Q2hlY2tFeHRlcm5hbExpbmtzKGdldENoZWNrRXh0ZXJuYWxMaW5rc1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucy5zZXRQdWJsaXNoVW5vcGVuQUREKGdldFB1Ymxpc2hVbm9wZW5BRERTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaEJhc2VBRChnZXRQdWJsaXNoQmFzZUFEU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zLnNldENvbnZlcnRCcm9rZW5MaW5rcyhnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMuc2V0UHVibGlzaExpZ2h0V2VpZ2h0VHJlZShnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkpOwotCQlvcHRpb25zCi0JCQkJLnNldFNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycyhnZXRTaG93RXh0cmFEZXNjcmlwdG9ySW5mb1NlbGVjdGlvbigpKTsKLQkJb3B0aW9ucwotCQkJCS5zZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKHNob3dSZWxhdGVkRGVzY3JpcHRvcnMKLQkJCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCW9wdGlvbnMKLQkJCQkuc2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlCi0JCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCVN0cmluZyBkZWZhdWx0QWN0aXZpdHlUYWIgPSBnZXREZWZhdWx0QWN0aXZpdHlUYWJTZWxlY3Rpb24oKTsKLQkJaWYgKGRlZmF1bHRBY3Rpdml0eVRhYiAhPSBudWxsKSB7Ci0JCQlvcHRpb25zLnNldERlZmF1bHRBY3Rpdml0eVRhYihkZWZhdWx0QWN0aXZpdHlUYWIpOwotCQl9Ci0KLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgd2ViIHNpdGUgdGl0bGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXZWJTaXRlVGl0bGUoKSB7Ci0JCXJldHVybiB0aXRsZVRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBiYW5uZXIgaW1hZ2UgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJhbm5lckltYWdlUGF0aCgpIHsKLQkJcmV0dXJuIGJhbm5lckltYWdlVGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGFib3V0IEhUTUwgcGF0aC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFib3V0SFRNTFBhdGgoKSB7Ci0JCXJldHVybiBhYm91dEhUTUxUZXh0LmdldFRleHQoKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZmVlZGJhY2sgVVJMLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBmZWVkYmFja1VSTFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGdsb3NzYXJ5IHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoR2xvc3NhcnlTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoR2xvc3NhcnlDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBwdWJsaXNoIGluZGV4IHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoSW5kZXhTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoSW5kZXhDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBjaGVjayBleHRlcm5hbCBsaW5rcyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0Q2hlY2tFeHRlcm5hbExpbmtzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY2hlY2tFeHRlcm5hbExpbmtzQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgY29udmVydCBicm9rZW4gbGlua3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldENvbnZlcnRCcm9rZW5MaW5rc1NlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGNvbnZlcnRCcm9rZW5MaW5rc0NoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGF1dG8gZ2VuZXJhdGUgYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoVW5vcGVuQUREU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaFVub3BlbkFERENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZSBhY3RpdnRpZXMgd2l0aAotCSAqIHVubW9kaWZpZWQgZXh0ZW5zaW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoQmFzZUFEU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gcHVibGlzaEJhc2VBRENoZWNrYm94LmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGdlbmVyYXRlIGxpZ2h0IHdlaWdodCB0cmVlIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRQdWJsaXNoTGlnaHRXZWlnaHRUcmVlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gIXB1Ymxpc2hMaWdodFdlaWdodFRyZWVDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzaG93IGV4dHJhIGRlc2NyaXB0b3IgaW5mbyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm9TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiBleHRyYURlc2NyaXB0b3JJbmZvQ3RyLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIHNob3cgcmVsYXRlZCBkZXNjcmlwdG9yIGluIGNvbnRlbnQgcGFnZQotCSAqIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCBzaG93IGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZVNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZGVmYXVsdCBhY3Rpdml0eSB0YWIgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiU2VsZWN0aW9uKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGFjdGl2aXR5VGFiVmlld2VyCi0JCQkJLmdldFNlbGVjdGlvbigpOwotCQlNYXAuRW50cnkgaXRlbSA9IChNYXAuRW50cnkpIHNlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgaXRlbS5nZXRLZXkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB1c2VyIHNlbGVjdGlvbnMgaW4gdGhpcyB3aXphcmQgcGFnZSB0byBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29uZmlnSWQgPSBjb25maWcuZ2V0R3VpZCgpOwotCQkJc2F2ZVRpdGxlQW5kTGlua3NQcmVmZXJlbmNlcyhjb25maWdJZCk7Ci0JCQlzYXZlR2xvc3NhcnlBbmRJbmRleFByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJCXNhdmVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJc2F2ZURpYWdyYW1HZW5lcmF0aW9uUHJlZmVyZW5jZXMoY29uZmlnSWQpOwotCQkJc2F2ZUxheW91dFByZWZlcmVuY2VzKGNvbmZpZ0lkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB0aXRsZSBhbmQgbGlua3MgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVRpdGxlQW5kTGlua3NQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0VGl0bGUoY29uZmlnSWQsIGdldFdlYlNpdGVUaXRsZSgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QmFubmVySW1hZ2UoY29uZmlnSWQsIGdldEJhbm5lckltYWdlUGF0aCgpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0QWJvdXRIVE1MKGNvbmZpZ0lkLCBnZXRBYm91dEhUTUxQYXRoKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRGZWVkYmFja1VSTChjb25maWdJZCwgZ2V0RmVlZGJhY2tVUkwoKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdsb3NhYXJ5IGFuZCBpbmRleCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlR2xvc3NhcnlBbmRJbmRleFByZWZlcmVuY2VzKFN0cmluZyBjb25maWdJZCkgewotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlR2xvc3NhcnkoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEdsb3NzYXJ5U2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXRJbmNsdWRlSW5kZXgoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEluZGV4U2VsZWN0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSB2YWxpZGF0aW9uIHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVWYWxpZGF0aW9uUHJlZmVyZW5jZXMoU3RyaW5nIGNvbmZpZ0lkKSB7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENoZWNrRXh0ZXJuYWxMaW5rcyhjb25maWdJZCwKLQkJCQlnZXRDaGVja0V4dGVybmFsTGlua3NTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldENvbnZlcnRCcm9rZW5MaW5rcyhjb25maWdJZCwKLQkJCQlnZXRDb252ZXJ0QnJva2VuTGlua3NTZWxlY3Rpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGRpYWdyYW0gZ2VuZXJhdGlvbiBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlRGlhZ3JhbUdlbmVyYXRpb25QcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaFVub3BlbkFjdGl2aXR5REQoY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaFVub3BlbkFERFNlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0UHVibGlzaEFERm9yQWN0aXZpdHlFeHRlbnNpb24oY29uZmlnSWQsCi0JCQkJZ2V0UHVibGlzaEJhc2VBRFNlbGVjdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbGF5b3V0IHByZWZlcmVuY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVMYXlvdXRQcmVmZXJlbmNlcyhTdHJpbmcgY29uZmlnSWQpIHsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0TGlnaHRXZWlnaHRUcmVlKGNvbmZpZ0lkLAotCQkJCWdldFB1Ymxpc2hMaWdodFdlaWdodFRyZWVTZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldEV4dHJhRGVzY3JpcHRvckluZm8oY29uZmlnSWQsCi0JCQkJZ2V0U2hvd0V4dHJhRGVzY3JpcHRvckluZm9TZWxlY3Rpb24oKSk7Ci0JCVB1Ymxpc2hpbmdVSVByZWZlcmVuY2VzLnNldFNob3dSZWxhdGVkRGVzY3JpcHRvcnMoY29uZmlnSWQsCi0JCQkJZ2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9yc1NlbGVjdGlvbigpKTsKLQkJUHVibGlzaGluZ1VJUHJlZmVyZW5jZXMuc2V0U2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZShjb25maWdJZCwKLQkJCQlnZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlU2VsZWN0aW9uKCkpOwotCQlQdWJsaXNoaW5nVUlQcmVmZXJlbmNlcy5zZXREZWZhdWx0QWN0aXZpdHlUYWIoY29uZmlnSWQsCi0JCQkJZ2V0RGVmYXVsdEFjdGl2aXR5VGFiU2VsZWN0aW9uKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWE5NzRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBQdWJsaXNoaW5nIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3Byb2ZpbGluZz10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVkNTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlZGMyYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogcHVibGlzaGluZy5qYXIsIGxpYi9ycHdjb3JlLmphcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZSwKLSBvcmcuZWNsaXBzZS5jb3JlLm5ldAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcywKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5zZWFyY2gsCi0gb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHAKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODJmYzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXNvdXJjZS5wdWJsaXNoaW5nLmphciA9IHNyYy8KLW91dHB1dC5wdWJsaXNoaW5nLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHB1Ymxpc2hpbmcuamFyLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBkb2Nyb290LyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBrZXl3b3JkaW5kZXhkZWYudHh0LFwKLSAgICAgICAgICAgICAgIGtleXdvcmRwb3N0YW1ibGUudHh0LFwKLSAgICAgICAgICAgICAgIGtleXdvcmRwcmVhbWJsZS50eHQsXAotICAgICAgICAgICAgICAga2V5d29yZHMudHh0LFwKLSAgICAgICAgICAgICAgIHhzbC8KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL2xpYi9lcGYtd2ViLXNlYXJjaC5qYXIgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2VwZi13ZWItc2VhcmNoLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlZDMxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2VwZi13ZWItc2VhcmNoLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi5qYXIgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2VwZi13ZWIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFhMDVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi9saWIvZXBmLXdlYi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2ljdTRqXzNfNC5qYXIgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2ljdTRqXzNfNC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNWUzYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL2xpYi9pY3U0al8zXzQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL2xpYi9sdWNlbmUtY29yZS0xLjkuMS5qYXIgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2x1Y2VuZS1jb3JlLTEuOS4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0M2U5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L1dFQi1JTkYvbGliL2x1Y2VuZS1jb3JlLTEuOS4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvV0VCLUlORi93ZWIueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNGEyZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci0KLTwhRE9DVFlQRSB3ZWItYXBwCi0gICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCi0gICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci0KLTx3ZWItYXBwPgotICA8c2VydmxldD4KLSAgCTxzZXJ2bGV0LW5hbWU+U2VhcmNoU2VydmxldDwvc2VydmxldC1uYW1lPgotICAJPHNlcnZsZXQtY2xhc3M+b3JnLmVjbGlwc2UuZXBmLndlYi5zZXJ2bGV0LlNlYXJjaFNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gIAk8aW5pdC1wYXJhbT4KLSAgCQk8cGFyYW0tbmFtZT5zZWFyY2hJbmRleDwvcGFyYW0tbmFtZT4KLSAgCQk8cGFyYW0tdmFsdWU+c2VhcmNoL2luZGV4PC9wYXJhbS12YWx1ZT4KLSAgCTwvaW5pdC1wYXJhbT4KLSAgCTxpbml0LXBhcmFtPgotICAJCTxwYXJhbS1uYW1lPnhzbEZpbGU8L3BhcmFtLW5hbWU+Ci0gIAkJPHBhcmFtLXZhbHVlPi9zZWFyY2gvc2VhcmNoX3Jlc3VsdC54c2w8L3BhcmFtLXZhbHVlPgotICAJPC9pbml0LXBhcmFtPgotICA8L3NlcnZsZXQ+Ci0gIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gIDwhLS0gbm90ZTogZG9uJ3QgY2hhbmdlIHRoZSBzZXJ2bGV0IG1hcHBpbmcgaGVyZSBzaW5jZSB0aGUgc3RyaW5nIGlzIHVzZWQgaW4gb3RoZXIgZmlsZXMgYXMgd2VsbCAtLT4KLSAgCTxzZXJ2bGV0LW5hbWU+U2VhcmNoU2VydmxldDwvc2VydmxldC1uYW1lPgotICAJPHVybC1wYXR0ZXJuPi9TZWFyY2hTZXJ2bGV0PC91cmwtcGF0dGVybj4KLSAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2Fib3V0Lmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvYWJvdXQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGE1NzBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvYWJvdXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPGh0bWwgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+Ci08IS0tCi0gICAgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIi8+Ci0JPHRpdGxlPkFib3V0PC90aXRsZT4KLTxzY3JpcHQgc3JjPSJzY3JpcHRzL2NvbW1vbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PC9zY3JpcHQ+Ci0JPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLQkJYm9keSB7Ci0JCQltYXJnaW46IDhweDsKLQkJfQotCTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi0JPGltZyBzcmM9Ii4vaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIiB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGFsdD0iYWJvdXQgaWNvbiIgYm9yZGVyPSIwIi8+PGJyIC8+PGJyIC8+Ci08c3BhbiBjbGFzcz0icG9wIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrPGJyIC8+Ci1WZXJzaW9uIDEuMjxiciAvPgotPGJyIC8+Ci0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNCwgMjAwNy48YnIgLz4KLUFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9zcGFuPjxiciAvPjxiciAvPgotCTx0YWJsZSBzdW1tYXJ5PSIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KLQkgIDx0cj4KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5IiBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICA8L3RyPgotCSAgPHRyPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjQiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICA8L3RyPgotCSAgPHRyPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIGNvbHNwYW49IjIiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25ib2R5Ij48YSBjbGFzcz0iYnV0dG9uIiBocmVmPSJqYXZhc2NyaXB0OnNlbGYuY2xvc2UoKTsiPjxzcGFuIGNsYXNzPSJidXR0b250eHQiPiZuYnNwO0Nsb3NlJm5ic3A7PC9zcGFuPjwvYT48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiIHJvd3NwYW49IjIiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciICByb3dzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICA8L3RyPgotCSAgPHRyPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uYm9keSI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiBhbHQ9IiIgd2lkdGg9IjEiIGhlaWdodD0iMSIgLz48L3RkPgotCSAgICA8dGQgY2xhc3M9ImJ1dHRvbmJvZHkiPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkIGNsYXNzPSJidXR0b25zaGFkb3ciPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgYWx0PSIiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIC8+PC90ZD4KLQkgIDwvdHI+Ci0JICA8dHI+Ci0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjbGFzcz0iYnV0dG9uc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICAgIDx0ZCBjb2xzcGFuPSIyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIGFsdD0iIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiAvPjwvdGQ+Ci0JICA8L3RyPgotCTwvdGFibGU+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvZXBmLmljbyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvZXBmLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjOGJiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2VwZi5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9FUEZDX2Jhbm5lci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9FUEZDX2Jhbm5lci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTNkZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvRVBGQ19iYW5uZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvYmFubmVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzAwZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9jb2xsYXBzZV9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY3MDE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZDIwMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2UuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fY2xvc2Vfc21hbGwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjZiODE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX2Nsb3NlX3NtYWxsX3JpZ2h0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwNmM5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9jbG9zZV9zbWFsbF9yaWdodC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjkwNGVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW4uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2MzViMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb2NfZWxlbV9vcGVuX3NtYWxsLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2RvY19lbGVtX29wZW5fc21hbGxfcmlnaHQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjdkNGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZG9jX2VsZW1fb3Blbl9zbWFsbF9yaWdodC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9kb3duX2Fycm93LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjhjNDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2Rvd25fYXJyb3cuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvZXhwYW5kX2FsbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9leHBhbmRfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExOGEzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL2ljb25fYWJvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvaWNvbl9hYm91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMTNlNWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvaWNvbl9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9hYm91dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9hYm91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWExNGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfYWJvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZGlzcGxheVRyZWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZGlzcGxheVRyZWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGJjYmFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2Rpc3BsYXlUcmVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2ZlZWRiYWNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2ZlZWRiYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkNTJmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9mZWVkYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9nZXRTdGFydGVkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dldFN0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Q4Y2EwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dldFN0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2xvc3NhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfZ2xvc3NhcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzJhMjNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2dsb3NzYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2hhbmRsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9oYW5kbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDhkMDljLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX2hhbmRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9pbmRleC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9pbmRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNmQzMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfaW5kZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfcHJpbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvbmlfcHJpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFhMWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3ByaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NlYXJjaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9zZWFyY2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjc3MGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9uaV9zaXRlTWFwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NpdGVNYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjIxMmI1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL25pX3NpdGVNYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvc2hpbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9zaGltLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiYTc5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9zaGltLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NwbGFzaC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy9zcGxhc2guZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjM5NTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3NwbGFzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90aXRsZWJhY2tfbGVmdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWNhMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX2xlZnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RpdGxlYmFja19yaWdodC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Yjg5YzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdGl0bGViYWNrX3JpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90b3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTVhY2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90b3Bfc20uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdG9wX3NtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3ZmJhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L2ltYWdlcy90b3Bfc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdXBfYXJyb3cuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbWFnZXMvdXBfYXJyb3cuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU1Y2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW1hZ2VzL3VwX2Fycm93LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW5kZXgvaW5kZXguY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjhlNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLXAuaW5kZXhoZWFkaW5nCi17Ci1mb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSBmb250LXdlaWdodDogYm9sZDsKLW1hcmdpbi10b3A6ICsycHg7IAotbWFyZ2luLWJvdHRvbTogLTJweDsKLX0KLQotcC5pbmRleGxldmVsMQotewotZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gZm9udC1zaXplOiBzbWFsbGVyOwotIG1hcmdpbi10b3A6IC0wcHg7IAotbWFyZ2luLWJvdHRvbTogLTJweDsKLX0KLQotcC5pbmRleGxldmVsMgotewotZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gZm9udC1zaXplOiBzbWFsbGVyOwotIG1hcmdpbi1sZWZ0OiArMTZweDsKLSBtYXJnaW4tdG9wOiAtMXB4OyAKLW1hcmdpbi1ib3R0b206IC0ycHg7Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW5kZXgvaW5kZXguaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YTJhOTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9pbmRleC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotCSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQkKLTxodG1sIGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPkluZGV4IC0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iMjUsKiI+Ci08ZnJhbWUgbmFtZT0iaW5kZXhfdCIgdGl0bGU9Ik5hdmlnYXRpb24gYmFyIiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIvPgotPGZyYW1lIG5hbWU9ImtleXdvcmRfdCIgdGl0bGU9IkNvbnRlbnRzIiBzcmM9ImNvbnRlbnRzLmh0bSIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMiIgc2Nyb2xsaW5nPSJhdXRvIi8+Ci08L2ZyYW1lc2V0PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9sb2FkaW5nLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3QvaW5kZXgvbG9hZGluZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMGUyN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9pbmRleC9sb2FkaW5nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy9EVEQgSFRNTCA0LjAxLy9FTiIKLSAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj4KLQotPGhlYWQ+Ci08bWV0YSBIVFRQLUVRVUlWPSJyZWZyZXNoIiBDT05URU5UPSIxOyB1cmw9Y29udGVudHMuaHRtIj4KLTx0aXRsZT48L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPC9oZWFkPgotCi08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjMDA0MDgwIiB2bGluaz0iIzY2NjY2NiIgYWxpbms9IiMwMDAwRkYiPgotCi0KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotCi0KLQotCi0KLQotPGgzIGFsaWduPSJjZW50ZXIiPkluZGV4PC9oMz4KLQotPHA+PGJyPgotPC9wPgotCi08aDQgYWxpZ249ImNlbnRlciI+UGxlYXNlIHdhaXQgd2hpbGUgaW5kZXggcGFnZSBpcyBsb2FkaW5nLi4uPC9oND4KLTxwcmUgbXNuYXZpZ2F0aW9uPiA8L3ByZT48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0Ij4KLQotCi0gICAgICA8cD4gPHNtYWxsPjxzbWFsbD5Db3B5cmlnaHQmbmJzcDsKLSAgICAgICAgJmNvcHk7IDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnM8L3NtYWxsPjwvc21hbGw+PC9wPgotCi08L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0Ij48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KLTxwPgotPGEgaHJlZj0iLi4vaW5kZXguaHRtIj48L2E+Ci08L3A+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotZnVuY3Rpb24gbG9hZFRvcCgpCi17Ci0gIGlmKHBhcmVudC5mcmFtZXMubGVuZ3RoIT0wICYmIHBhcmVudC5mcmFtZXNbMV0ubmFtZT09Im9yeV90b2MiKQotICB7Ci0gICAgIGFsZXJ0KCJUaGUgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBpcyBhbHJlYWR5IGRpc3BsYXllZCB1c2luZyBmcmFtZXMiKTsKLSAgfQotICBlbHNlCi0gIHsKLSAgICB2YXIgZXhwaXJlcyA9IG5ldyBEYXRlKCk7Ci0gICAgZXhwaXJlcy5zZXRUaW1lIChleHBpcmVzLmdldFRpbWUoKSArICgxMDAwICogMjApKTsKLSAgICBkb2N1bWVudC5jb29raWUgPSAicnVwX29yeV9kb2M9IiArIGVzY2FwZSAoZG9jdW1lbnQuVVJMKSArCi0gICAgIjsgZXhwaXJlcz0iICsgZXhwaXJlcy50b1VUQ1N0cmluZygpICsgICI7IHBhdGg9LyI7Ci0KLSAgICB2YXIgbmV3X29yeV9kb2NfbG9jID0gbnVsbDsKLQotICAgIGZvcihpPWRvY3VtZW50LmxpbmtzLmxlbmd0aC0xO2k+PTA7aS0tKQotICAgIHsKLSAgICAgICBpZihkb2N1bWVudC5saW5rc1tpXS5ocmVmLmluZGV4T2YoImluZGV4Lmh0bSIpIT0tMSkKLSAgICAgICB7Ci0gICAgICAgICBuZXdfb3J5X2RvY19sb2MgPSBkb2N1bWVudC5saW5rc1tpXS5ocmVmOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICAgIGlmKG5ld19vcnlfZG9jX2xvYyE9bnVsbCkKLSAgICB7Ci0JaWYoIHNlbGYubmFtZSA9PSAib3J5X2RvYyIgKQotCXsKLQkJd2luZG93LmNsb3NlKCk7Ci0JCXdpbmRvdy5vcGVuKCBuZXdfb3J5X2RvY19sb2MgKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsKLQl9Ci0gICAgfQotICAgfQotfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotICBmdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkKLSAgewotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsKLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZi5zdWJzdHJpbmcoMCxkb2N1bWVudC5saW5rc1tpXS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOwotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsKLSAgICAgICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQKLWxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLU1TRlBob3ZlciA9Ci0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwKLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsKLQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpCi0gIHsKLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7Ci0gICAgIGEuc3JjPWltZzsKLSAgICAgcmV0dXJuIGE7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7Ci0gICAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLQotPGEgaHJlZj0iSmF2YVNjcmlwdDpsb2FkVG9wKCk7IiBvbm1vdXNlb3Zlcj0iaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9J0Rpc3BsYXkgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayB1c2luZyBmcmFtZXMnOyByZXR1cm4gdHJ1ZSIgb25tb3VzZW91dD0iaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBHcmF5LnNyYzsgc2VsZi5zdGF0dXM9ICcgJztyZXR1cm4gdHJ1ZSI+Ci08cD4KLTxpbWcgc3JjPSIuLi9pbWFnZXMvcnVwMS5naWYiIGJvcmRlcj0iMCIgYWx0PSJEaXNwbGF5IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgdXNpbmcgZnJhbWVzIiBuYW1lPSJIb21lIiB3aWR0aD0iMjAiIGhlaWdodD0iMTEwIj48L3A+PC9hPgotPC90ZD48L3RyPjwvdGFibGU+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KLTxwIGFsaWduPSJyaWdodCI+PHNtYWxsPjxzbWFsbD5FY2xpcHNlIFByb2Nlc3MKLUZyYW1ld29yayZuYnNwOyZuYnNwOwotPC9zbWFsbD48L3NtYWxsPgotPC90ZD48L3RyPjwvdGFibGU+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9ib29rbWFya3ZpZXdzLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRiZjE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvYm9va21hcmt2aWV3cy5qcworKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gamF2YXNjcmlwdCBmb3IgdGhlIGJvb2ttYXJrcyBmcmFtZSAoIHRoZSBvcnlfdG9jX2ZyYW1lIGZyYW1lKQotLy8gdGhpcyBmcmFtZSBjb250YWlucyBhIGNoaWxkIGlmcmFtZSAob3J5X3RvYykKLQotLy8gbWVzc2FnZXMgdG8gYmUgZXh0ZXJuaXplZAotLy8gaGVyZSBkZWZpbmVzIGFsbCB0aGUgSTE4TiBzcGVjaWZpYyBtZXNzYWdlcyB1c2VkIGluIHRoZSBqYXZhc2NyaXB0cwotdmFyIGJvb2ttYXJrdmlld3NfanNfTUVTU0FHRTEgPSAiVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiB0aGUgbmF2aWdhdGlvbiB0cmVlIHZpZXcuIjsKLQotZnVuY3Rpb24gZGlzcGxheVRyZWUodGFiKQotewotCXVybCA9IHRhYi5nZXRBdHRyaWJ1dGUoJ3VybCcpOwotCi0JaWYgKCBzZWxlY3RlZFRhYiAhPSBudWxsICkKLQl7Ci0JCXNlbGVjdGVkVGFiLmNsYXNzTmFtZSA9ICJ0YWIiCi0JfQotCXRhYi5jbGFzc05hbWUgPSAic2VsZWN0ZWRUYWIiCi0Jc2VsZWN0ZWRUYWIgPSB0YWI7Ci0KLQlsb2FkSWZyYW1lKCJvcnlfdG9jIiwgdXJsKTsKLX0KLQotZnVuY3Rpb24gbG9hZElmcmFtZShpZnJhbWVOYW1lLCB1cmwpCi17Ci0JaWYgKCB3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdICkKLQl7Ci0JCXdpbmRvdy5mcmFtZXNbaWZyYW1lTmFtZV0udG9jX2xvYWRlZCA9IGZhbHNlOwotCQl3aW5kb3cuZnJhbWVzW2lmcmFtZU5hbWVdLmxvY2F0aW9uID0gdXJsOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JZWxzZSByZXR1cm4gZmFsc2U7Ci19Ci0KLWZ1bmN0aW9uIHNob3dQYWdlKCkKLXsKLQotCXBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5sb2NhdGlvbi5ocmVmID0gZGVjb2RlVVJJKHRvcGljVG9EaXNwbGF5KTsKLX0KLQotCi0vKioKLSAqIGZpbmQgYSB0b3BpYyBpbiB0aGUgdHJlZTogdGhlIHRvcGljIGlzIHNldCBpbiB0b3BpY1RvRGlzcGxheQotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MKLSAqLwotZnVuY3Rpb24gZmluZFRvY1RvcGljKCkKLXsKLQl2YXIgdG9jX3dpbmRvdyA9IHdpbmRvdy5mcmFtZXNbIm9yeV90b2MiXTsKLQotCS8vIGNoZWNrIGZvciBmYWxzZSBpcyBub3Qgc2FmZSBzaW5jZSB0aGUgdmFsdWUgbWlnaHQgYmUgdW5kZWZpbmVkIGlmIHRoZSBmcmFtZSBpcyBub3QgbG9hZGVkIHlldAotCS8vaWYgKHRvY193aW5kb3cudG9jX2xvYWRlZCA9PSBmYWxzZSApCi0JaWYgKCB0b2Nfd2luZG93LnRvY19sb2FkZWQgIT0gdHJ1ZSApCi0JewotCQkvL2lmICggdG9jX3dpbmRvdy50b2NfbG9hZGVkID09IHVuZGVmaW5lZCApCi0JCS8vewotCQkvLwlhbGVydCgiZ290IGl0ISIpOwotCQkvL30KLQkJd2luZG93LnNldFRpbWVvdXQoImZpbmRUb2NUb3BpYygpIiwgMjAwKTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKCB0b3BpY1RvRGlzcGxheSA9PSBudWxsICkKLQkJewotCQkJdG9waWNUb0Rpc3BsYXkgPSB0b2Nfd2luZG93LmdldEZpcnN0VG9waWNVcmwoKTsKLQkJfQotCQotCQl2YXIgdG9waWMgPSB0b3BpY1RvRGlzcGxheTsKLQkJdmFyIGZvdW5kID0gdG9jX3dpbmRvdy5zZWxlY3RUb3BpYyh0b3BpYyk7Ci0JCWlmICggZm91bmQgPT0gZmFsc2UgKQotCQl7Ci0JCQl2YXIgYW5jaG9ySW5kZXggPSB0b3BpYy5sYXN0SW5kZXhPZigiIyIpOwotCQkJaWYgKGFuY2hvckluZGV4ID4gMCkKLQkJCXsKLQkJCQl0b3BpYyA9IHRvcGljLnN1YnN0cmluZygwLCBhbmNob3JJbmRleCk7Ci0JCQl9Ci0JCQlmb3VuZCA9IHRvY193aW5kb3cuc2VsZWN0VG9waWModG9waWMpOwotCQl9CQkJCQkJCi0KLQkJLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdmlldywgaWYgbm90LCBsb29rIGZvciB0aGUgbmV4dCB2aWV3Ci0JCWlmICggZm91bmQgPT0gZmFsc2UgKQotCQl7Ci0JCQlpZiAoIGxvYWRpbmdUYWJJbmRleCA8IHZpZXdUYWJzLmxlbmd0aCApCi0JCQl7Ci0JCQkJZGlzcGxheVRyZWUodmlld1RhYnNbbG9hZGluZ1RhYkluZGV4KytdKTsKLQkJCQlmaW5kVG9jVG9waWMoKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBlbmQgZmluZGluZyBhbmQgZ290IG5vdGhpbmcKLQkJCQkvLyBkaXNwbGF5IHRoZSBkZWZhdWx0Ci0JCQkJYWxlcnQoYm9va21hcmt2aWV3c19qc19NRVNTQUdFMSk7Ci0JCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsKLQkJCQlzaG93UGFnZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJbG9hZGluZ1RhYkluZGV4ID0gMDsKLQkJCS8vIGZpbmQgc3VjY2Vzc2Z1bCwgZGlzcGxheSB0aGUgdG9waWMgcGFnZQotCQkJc2hvd1BhZ2UoKTsKLQkJfQotCX0KLX0KLQotLy8gZmluZCB0aGUgdG9waWMgaW4gdGhlIGN1cnJlbnQgdGFiCi1mdW5jdGlvbiB3aGVyZUFtSSgpCi17Ci0JdmFyIHVybCA9IHBhcmVudC5mcmFtZXNbIm9yeV9kb2MiXS5kb2N1bWVudC5VUkw7Ci0JCi0JaWYgKCB1cmwgIT0gbnVsbCApCi0JewotCQl0b3BpY1RvRGlzcGxheSA9IHVybDsKLQkJZmluZFRvY1RvcGljKCk7Ci0JfQotfQotCi0KLWZ1bmN0aW9uIHRvZ1ZpZXdzKCkKLXsKLQkvLyBpZiBjdXJyZW50bHkgdmlzaWJsZSwgaGlkZSBhbGwgZXhjZXB0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLQlpc1ZpZXdzVmlzaWJsZSA9ICghaXNWaWV3c1Zpc2libGUpOwotCQotCWZvciAoIHZhciBpID0gMDsgIGkgPCB2aWV3VGFicy5sZW5ndGg7IGkrKykKLQl7Ci0JCXZhciBzaG93ID0gaXNWaWV3c1Zpc2libGUgfHwgKHZpZXdUYWJzW2ldID09IHNlbGVjdGVkVGFiKTsKLQkJaWYgKCBzaG93ICkKLQkJewkJCi0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7Ci0JCQl2aWV3VGFic1tpXS5zdHlsZS5kaXNwbGF5ID0gJyc7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3ZpZXdUYWJzW2ldLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKLQkJCXZpZXdUYWJzW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7Ci0JCX0KLQl9Ci0JCQotCQkKLQotfQotCi0KLS8vIGRpc3BsYXkgdGhlIGRlZmF1bHQgcGFnZSBhbmQgbmF2aWdhdGUgdG8gdGhlIG5vZGUKLS8vIGlmIG5vIGRlZmF1bHQgcGFnZSBpcyBzZXQsIGRpc3BsYXkgdGhlIGZpcnN0IG5vZGUgb2YgdGhlIGZpcnN0IHZpZXcKLWZ1bmN0aW9uIGluaXQoKQotewotCWxvYWRpbmdUYWJJbmRleCA9IDA7Ci0JdmFyIHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpOwotCXZhciB0YWJjb3VudCA9IDA7Ci0JZm9yICh2YXIgaT0wOyBpPHRhYnMubGVuZ3RoOyBpKyspCi0JewotCQlpZiAoIHRhYnNbaV0uZ2V0QXR0cmlidXRlKCd1cmwnKSAhPSBudWxsICkKLQkJewkJCQotCQkJdmFyIGlzRGVmYXVsdFZpZXcgPSB0YWJzW2ldLmdldEF0dHJpYnV0ZSgnaXNEZWZhdWx0VmlldycpOwotCQkJaWYgKCBpc0RlZmF1bHRWaWV3ID09ICJ0cnVlIiApCi0JCQl7Ci0JCQkJbG9hZGluZ1RhYkluZGV4ID0gdGFiY291bnQ7Ci0JCQl9Ci0JCQkKLQkJCXZpZXdUYWJzW3RhYmNvdW50KytdID0gdGFic1tpXTsKLQkJfQotCX0KLQotCXRvcGljVG9EaXNwbGF5ID0gcGFyZW50LmdldENvb2tpZSgicnVwX29yeV9kb2MiKTsKLQlkaXNwbGF5VHJlZSh2aWV3VGFic1tsb2FkaW5nVGFiSW5kZXhdKTsKLQlmaW5kVG9jVG9waWMoKTsKLX0KLQotCi12YXIgc2VsZWN0ZWRUYWIgPSBudWxsOwotdmFyIHZpZXdUYWJzID0gbmV3IEFycmF5KCk7OwotdmFyIGxvYWRpbmdUYWJJbmRleCA9IDA7Ci12YXIgdG9waWNUb0Rpc3BsYXkgPSBudWxsOwotdmFyIGlzVmlld3NWaXNpYmxlID0gdHJ1ZTsKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2FjdGlvbl9oaWRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2FjdGlvbl9oaWRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmY2RlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25faGlkZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9hY3Rpb25fdW5oaWRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE0Y2ZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvZmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VhOWU3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2ZvbGRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9mb2xkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQxOWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL2ZvbGRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9taW51cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9taW51cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDFkMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbWludXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbmlfd2hlcmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC9pbWFnZXMvbmlfd2hlcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWE0ZmQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25pX3doZXJlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25vcGx1cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9ub3BsdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDllMTE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL25vcGx1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L2ltYWdlcy9wbHVzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL3BsdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ2NzFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvbm9hcHBsZXQvaW1hZ2VzL3BsdXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90b2MuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RvYy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE5Y2EyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RvYy5qcworKysgL2Rldi9udWxsCkBAIC0xLDk3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAKLS8vIENvbW1vbiBzY3JpcHRzIGZvciBJRSBhbmQgTW96aWxsYS4KLQotdmFyIGlzTW96aWxsYSA9IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTW96aWxsYScpICE9IC0xICYmIHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uLnN1YnN0cmluZygwLDEpKSA+PSA1OwotdmFyIGlzSUUgPSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUnKSAhPSAtMTsKLQotLy8gdGhpcyBpcyB0aGUgc2VsZWN0ZWQgbm9kZQotdmFyIG9sZEFjdGl2ZTsKLXZhciBvbGRBY3RpdmVDbGFzcyA9ICIiOwotdmFyIHRvY19sb2FkZWQgPSBmYWxzZTsKLQotZnVuY3Rpb24gc2V0TG9hZGVkKCkKLXsKLQl0b2NfbG9hZGVkID0gdHJ1ZTsKLQlzZWxlY3RGaXJzdFRvcGljKCk7Ci19Ci0KLS8vIFByZWxvYWQgaW1hZ2VzCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBOb3RlOiBjb2RlIG1vdmVkIGludG8gdGhlIGpzcCwgZm9yIGR5bmFtaWMgaW1hZ2UgcHJlZmVyZW5jZXMKLQotLyoqCi0gKiBSZXR1cm5zIHRoZSB0YXJnZXQgbm9kZSBvZiBhbiBldmVudAotICovCi1mdW5jdGlvbiBnZXRUYXJnZXQoZSkgewotCXZhciB0YXJnZXQ7Ci0gIAlpZiAoaXNNb3ppbGxhKQotICAJCXRhcmdldCA9IGUudGFyZ2V0OwotICAJZWxzZSBpZiAoaXNJRSkKLSAgIAkJdGFyZ2V0ID0gd2luZG93LmV2ZW50LnNyY0VsZW1lbnQ7Ci0KLQlyZXR1cm4gdGFyZ2V0OwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5leHQgdHJlZSBub2RlICJkb3duIiBmcm9tIGN1cnJlbnQgb25lCi0gKi8KLWZ1bmN0aW9uIGdldE5leHREb3duKG5vZGUpCi17Ci0JdmFyIGEgPSBnZXRBbmNob3JOb2RlKG5vZGUpOwotCWlmICghYSkgcmV0dXJuIG51bGw7Ci0JCQotCS8vIFRyeSB2aXNpYmxlIGNoaWxkIGZpcnN0Ci0JdmFyIGxpID0gYS5wYXJlbnROb2RlOwotCXZhciB1bCA9IGdldENoaWxkTm9kZShsaSwgIlVMIik7Ci0JaWYgKHVsICYmIHVsLmNsYXNzTmFtZSA9PSAiZXhwYW5kZWQiKQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUodWwsICJBIik7Ci0JCi0JLy8gVHJ5IG5leHQgc2libGluZwotCXZhciBsaV9zaWIgPSBnZXROZXh0U2libGluZyhsaSk7Ci0JaWYgKGxpX3NpYiAhPSBudWxsKQotCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUobGlfc2liLCAiQSIpOwotCQkKLQkvLyBUcnkgbG9va2luZyB0byBwYXJlbnQncyBzaWJsaW5nCi0Jd2hpbGUobGlfc2liID09IG51bGwpIHsKLQkJdmFyIHVsID0gbGkucGFyZW50Tm9kZTsKLQkJbGkgPSB1bC5wYXJlbnROb2RlOwotCQlpZiAobGkudGFnTmFtZSAhPSAiTEkiKSAvLyByZWFjaGVkIHRoZSB0b3AsIG5vdGhpbmcgZWxzZSB0byBkbwotCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJbGlfc2liID0gZ2V0TmV4dFNpYmxpbmcobGkpOwkJCi0JfQotCQkKLQkvLyBmb3VuZCB0aGUgbmV4dCBkb3duIHNpYmxpbmcKLQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUobGlfc2liLCAiQSIpOwkJCi19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgbmV4dCB0cmVlIG5vZGUgImRvd24iIGZyb20gY3VycmVudCBvbmUKLSAqLwotZnVuY3Rpb24gZ2V0TmV4dFVwKG5vZGUpCi17Ci0JdmFyIGEgPSBnZXRBbmNob3JOb2RlKG5vZGUpOwotCWlmICghYSkgcmV0dXJuIG51bGw7Ci0JCQotCS8vIEdldCBwcmV2aW91cyBzaWJsaW5nIGZpcnN0Ci0JdmFyIGxpID0gYS5wYXJlbnROb2RlOwotCXZhciBsaV9zaWIgPSBnZXRQcmV2U2libGluZyhsaSk7Ci0JaWYgKGxpX3NpYiAhPSBudWxsKSB7Ci0JCS8vIHRyeSB0byBnZXQgdGhlIGRlZXBlc3Qgbm9kZSB0aGF0IHByZWNlZWRzIHRoaXMgY3VycmVudCBub2RlCi0JCXZhciBjYW5kaWRhdGUgPSBnZXREZXNjZW5kYW50Tm9kZShsaV9zaWIsICJBIik7Ci0JCXZhciBuZXh0RG93biA9IGdldE5leHREb3duKGNhbmRpZGF0ZSk7Ci0JCXdoaWxlKG5leHREb3duICE9IG51bGwgJiYgbmV4dERvd24gIT0gbm9kZSl7Ci0JCQljYW5kaWRhdGUgPSBuZXh0RG93bjsKLQkJCW5leHREb3duID0gZ2V0TmV4dERvd24obmV4dERvd24pOwotCQl9Ci0JCXJldHVybiBnZXREZXNjZW5kYW50Tm9kZShjYW5kaWRhdGUsICJBIik7CTsKLQl9IGVsc2UgewotCQkvLyBnZXQgdGhlIHBhcmVudAotCQl2YXIgbGkgPSBsaS5wYXJlbnROb2RlLnBhcmVudE5vZGU7Ci0JCWlmIChsaSAmJiBsaS50YWdOYW1lID09ICJMSSIpCi0JCQlyZXR1cm4gZ2V0RGVzY2VuZGFudE5vZGUobGksICJBIik7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBuZXh0IHNpYmxpbmcgZWxlbWVudAotICovCi1mdW5jdGlvbiBnZXROZXh0U2libGluZyhub2RlKSAKLXsKLQl2YXIgc2liID0gbm9kZS5uZXh0U2libGluZzsKLQl3aGlsZSAoc2liICYmIChzaWIubm9kZVR5cGUgPT0gMyB8fCBzaWIudGFnTmFtZT09IlNDUklQVCIpKSAvLyB0ZXh0IG9yIHNjcmlwdCBub2RlCi0JCXNpYiA9IHNpYi5uZXh0U2libGluZzsKLQlyZXR1cm4gc2liOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIG5leHQgc2libGluZyBlbGVtZW50Ci0gKi8KLWZ1bmN0aW9uIGdldFByZXZTaWJsaW5nKG5vZGUpIAotewotCXZhciBzaWIgPSBub2RlLnByZXZpb3VzU2libGluZzsKLQl3aGlsZSAoc2liICYmIChzaWIubm9kZVR5cGUgPT0gMyB8fCBzaWIudGFnTmFtZT09IlNDUklQVCIpKSAvLyB0ZXh0IG9yIHNjcmlwdCBub2RlCi0JCXNpYiA9IHNpYi5wcmV2aW91c1NpYmxpbmc7Ci0JcmV0dXJuIHNpYjsKLX0KLQotCi0vKioKLSAqIFJldHVybnMgdGhlIGNoaWxkIG5vZGUgd2l0aCBzcGVjaWZpZWQgdGFnCi0gKi8KLWZ1bmN0aW9uIGdldENoaWxkTm9kZShwYXJlbnQsIGNoaWxkVGFnKQotewotCXZhciBsaXN0ID0gcGFyZW50LmNoaWxkTm9kZXM7Ci0JaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JZm9yICh2YXIgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspCi0JCWlmIChsaXN0Lml0ZW0oaSkudGFnTmFtZSA9PSBjaGlsZFRhZykKLQkJCXJldHVybiBsaXN0Lml0ZW0oaSk7Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgZGVzY2VuZGF0IG5vZGUgd2l0aCBzcGVjaWZpZWQgdGFnIChkZXB0aC1maXJzdCBzZWFyY2hlcykKLSAqLwotZnVuY3Rpb24gZ2V0RGVzY2VuZGFudE5vZGUocGFyZW50LCBjaGlsZFRhZykKLXsJCi0JaWYgKHBhcmVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkKLQlpZiAocGFyZW50LnRhZ05hbWUgPT0gY2hpbGRUYWcpCi0JCXJldHVybiBwYXJlbnQ7Ci0JCQotCXZhciBsaXN0ID0gcGFyZW50LmNoaWxkTm9kZXM7Ci0JaWYgKGxpc3QgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JZm9yICh2YXIgaT0wOyBpPGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJdmFyIGNoaWxkID0gbGlzdC5pdGVtKGkpOwotCQlpZihjaGlsZC50YWdOYW1lID09IGNoaWxkVGFnKQotCQkJcmV0dXJuIGNoaWxkOwotCQkKLQkJY2hpbGQgPSBnZXREZXNjZW5kYW50Tm9kZShjaGlsZCwgY2hpbGRUYWcpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCXJldHVybiBjaGlsZDsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBhbmNob3Igb2YgdGhpcyBjbGljawotICogTk9URTogTU9aSUxMQSBCVUcgV0lUSCBBOmZvY3VzIGFuZCBBOmFjdGl2ZSBzdHlsZXMKLSAqLwotZnVuY3Rpb24gZ2V0QW5jaG9yTm9kZShub2RlKSB7Ci0gIGlmIChub2RlID09IG51bGwpIHJldHVybiBudWxsOwotICAgCi0gIGlmIChub2RlLm5vZGVUeXBlID09IDMpICAvLyJOb2RlLlRFWFRfTk9ERSIpIAotCXJldHVybiBub2RlLnBhcmVudE5vZGU7Ci0gIGVsc2UgaWYgKG5vZGUudGFnTmFtZSA9PSAiQSIpIAotICAgIHJldHVybiBub2RlOwotICBlbHNlIGlmIChub2RlLnRhZ05hbWUgPT0gIklNRyIpCi0gIAlyZXR1cm4gZ2V0Q2hpbGROb2RlKG5vZGUucGFyZW50Tm9kZSwgIkEiKTsKLSAgcmV0dXJuIG51bGw7Ci19Ci0KLS8qKgotICogUmV0dXJucyB0aGUgcGx1cy9taW51cyBpY29uIGZvciB0aGlzIHRyZWUgbm9kZQotICovCi1mdW5jdGlvbiBnZXRQbHVzTWludXMobm9kZSkKLXsKLQlpZiAoaXNQbHVzTWludXMobm9kZSkpCi0JCXJldHVybiBub2RlOwotICAJZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSAgLy8iTm9kZS5URVhUX05PREUiKSAKLQkJcmV0dXJuIGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSwgIklNRyIpOwotCWVsc2UgaWYgKG5vZGUudGFnTmFtZSA9PSAiSU1HIikKLSAgICAJcmV0dXJuIGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZSwgIklNRyIpOwotICAJZWxzZSBpZiAobm9kZS50YWdOYW1lID09ICJBIikgCi0gICAgCXJldHVybiBnZXRDaGlsZE5vZGUobm9kZS5wYXJlbnROb2RlLCAiSU1HIik7Ci0KLSAJcmV0dXJuIG51bGw7Ci19Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgbm9kZSBpcyB0aGUgcGx1cyBvciBtaW51cyBpY29uCi0gKi8KLWZ1bmN0aW9uIGlzUGx1c01pbnVzKG5vZGUpCi17Ci0JcmV0dXJuIChub2RlLm5vZGVUeXBlICE9IDMgJiYgbm9kZS50YWdOYW1lID09ICJJTUciICYmIChub2RlLmNsYXNzTmFtZSA9PSAiZXhwYW5kZWQiIHx8IG5vZGUuY2xhc3NOYW1lID09ICJjb2xsYXBzZWQiKSk7Ci19Ci0KLS8qKgotICogQ29sbGFwc2VzIGEgdHJlZSByb290ZWQgYXQgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0gKi8KLWZ1bmN0aW9uIGNvbGxhcHNlKG5vZGUpIHsKLSAgbm9kZS5jbGFzc05hbWUgPSAiY29sbGFwc2VkIjsKLSAgbm9kZS5zcmMgPSBwbHVzLnNyYzsKLSAgbm9kZS5hbHQgPSBhbHRUb3BpY0Nsb3NlZDsKLSAgLy8gc2V0IHRoZSBVTCBhcyB3ZWxsCi0gIHZhciB1bCA9IGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJVTCIpOwotICBpZiAodWwgIT0gbnVsbCkgdWwuY2xhc3NOYW1lID0gImNvbGxhcHNlZCI7Ci19Ci0KLS8qKgotICogRXhwYW5kcyBhIHRyZWUgcm9vdGVkIGF0IHRoZSBzcGVjaWZpZWQgZWxlbWVudAotICovCi1mdW5jdGlvbiBleHBhbmQobm9kZSkgewotICAJbm9kZS5jbGFzc05hbWUgPSAiZXhwYW5kZWQiOwotICAJbm9kZS5zcmMgPSBtaW51cy5zcmM7Ci0gICAgbm9kZS5hbHQgPSBhbHRUb3BpY09wZW47Ci0gIAkvLyBzZXQgdGhlIFVMIGFzIHdlbGwKLSAgCXZhciB1bCA9IGdldENoaWxkTm9kZShub2RlLnBhcmVudE5vZGUsICJVTCIpOwotICAJaWYgKHVsICE9IG51bGwpewotICAJCXVsLmNsYXNzTmFtZSA9ICJleHBhbmRlZCI7Ci0gIAkJaWYgKHVsLmlkLmxlbmd0aCA+IDApewotICAJCQlpZiAoIWZyYW1lcy5keW5Mb2FkRnJhbWUpIHsKLSAgCQkJCXJldHVybjsKLSAgCQkJfQotICAJCQl2YXIgaXggPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCc/Jyk7Ci0gIAkJCWlmIChpeCA8IDApIHsKLSAgCQkJCXJldHVybjsKLSAgCQkJfQotICAJCQl2YXIgcXVlcnkgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHIoaXgpOwotICAJCQlmcmFtZXMuZHluTG9hZEZyYW1lLmxvY2F0aW9uID0gInRvY0ZyYWdtZW50LmpzcCIgKyBxdWVyeSArICImcGF0aD0iICsgdWwuaWQ7Ci0gIAkJfQotICAJfQotfQotCi0vKioKLSAqIEV4cGFuZHMgdGhlIG5vZGVzIGZyb20gcm9vdCB0byB0aGUgc3BlY2lmaWVkIG5vZGUKLSAqLwotZnVuY3Rpb24gZXhwYW5kUGF0aFRvKG5vZGUsIGluY2x1c2l2ZSkKLXsKLQotCS8vIHdoZW4gdGhlIG5vZGUgaXMgYSBsaW5rLCBnZXQgdGhlIHBsdXMvbWludXMgaW1hZ2UKLQlpZiAobm9kZS50YWdOYW1lID09ICJBIikgCi0JewotCQl2YXIgaW1nID0gZ2V0Q2hpbGROb2RlKG5vZGUucGFyZW50Tm9kZSwgIklNRyIpCi0JCWlmIChpbWcgIT0gbnVsbCkKLQkJewkJCQotCQkJZXhwYW5kUGF0aFRvKGltZywgaW5jbHVzaXZlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQkKLQlpZiAoaW5jbHVzaXZlICYmIGlzQ29sbGFwc2VkKG5vZGUpKQotCQlleHBhbmQobm9kZSk7Ci0JCQotCXZhciBsaSA9IG5vZGUucGFyZW50Tm9kZTsKLQlpZiAobGkgPT0gbnVsbCkgcmV0dXJuOwotCXZhciB1bCA9IGxpLnBhcmVudE5vZGU7Ci0JaWYgKHVsID09IG51bGwpIHJldHVybjsKLQlsaSA9IHVsLnBhcmVudE5vZGU7Ci0JaWYgKGxpID09IG51bGwpIHJldHVybjsKLQl2YXIgaW1nID0gZ2V0Q2hpbGROb2RlKGxpLCAiSU1HIik7Ci0JaWYgKGltZyA9PSBudWxsKSByZXR1cm47Ci0JCQotCWV4cGFuZFBhdGhUbyhpbWcsIHRydWUpOwotfQotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoaXMgaXMgYW4gZXhwYW5kZWQgdHJlZSBub2RlCi0gKi8KLWZ1bmN0aW9uIGlzRXhwYW5kZWQobm9kZSkgewotICByZXR1cm4gbm9kZS5jbGFzc05hbWUgPT0gImV4cGFuZGVkIjsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgd2hlbiB0aGlzIGlzIGEgY29sbGFwc2VkIHRyZWUgbm9kZQotICovCi1mdW5jdGlvbiBpc0NvbGxhcHNlZChub2RlKSB7Ci0gIHJldHVybiAgbm9kZS5jbGFzc05hbWUgPT0gImNvbGxhcHNlZCI7Ci19Ci0KLS8qKgotICogSGlnaGxpZ2h0cyBsaW5rCi0gKi8KLWZ1bmN0aW9uIGhpZ2hsaWdodFRvcGljKHRvcGljKQotewotCWlmIChpc01vemlsbGEpCi0JCXdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTsKLQotICAJdmFyIGEgPSBnZXRBbmNob3JOb2RlKHRvcGljKTsgCi0gIAlpZiAoYSAhPSBudWxsKQotICAJewotICAJIC8vIAlwYXJlbnQucGFyZW50LnBhcmVudC5zZXRDb250ZW50VG9vbGJhclRpdGxlKHRvY1RpdGxlKTsKLSAgCSAgCWlmIChvbGRBY3RpdmUpIAotICAJICAJCW9sZEFjdGl2ZS5jbGFzc05hbWUgPSBvbGRBY3RpdmVDbGFzczsKLQotICAJCW9sZEFjdGl2ZSA9IGE7Ci0gIAkJb2xkQWN0aXZlQ2xhc3MgPSBhLmNsYXNzTmFtZTsKLSAgCQlhLmNsYXNzTmFtZSA9ICJhY3RpdmUiOwotICAJCS8vIGl0IGxvb2tzIGxpa2UgdGhlIG9uY2xpY2sgZXZlbnQgaXMgbm90IGhhbmRsZWQgaW4gbW96aWxsYQotICAJCS8vICoqKiBUTyBETzogaGFuZGxlIGZhaWxlZCBzeW5jaHJvbml6YXRpb24sIGRvIG5vdCBzZWxlY3QgaW4gdGhhdCBjYXNlCi0gIAkJaWYgKGlzTW96aWxsYSAmJiBhLm9uY2xpY2spIAotICAJCQlhLm9uY2xpY2soKQotICAJCS8vaWYgKGlzSUUpCi0gIAkJLy8JYS5oaWRlRm9jdXMgPSAidHJ1ZSI7Ci0gIAkJCi0gIAl9Ci19Ci0KLQotZnVuY3Rpb24gZ2V0Rmlyc3RUb3BpY1VybCgpCi17Ci0JdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKLQlpZiAoIGxpbmtzLmxlbmd0aCA+IDAgKQotCXsKLQkJcmV0dXJuIGxpbmtzWzBdLmhyZWY7Ci0JfQotCQotCXJldHVybiBudWxsOwotfQotCi1mdW5jdGlvbiBzZWxlY3RGaXJzdFRvcGljKCkgewotCS8vdmFyIHVybCA9IGdldEZpcnN0VG9waWNVcmwoKTsKLQkvL3NlbGVjdFRvcGljKHVybCk7Ci0KLQl2YXIgbGlua3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpOwotCWlmICggbGlua3MubGVuZ3RoID4gMCApCi0JewotCQloaWdobGlnaHRUb3BpYyhsaW5rc1swXSk7Ci0JCXBhcmVudC5wYXJlbnQuZnJhbWVzWyJvcnlfZG9jIl0ubG9jYXRpb24uaHJlZiA9IGxpbmtzWzBdLmhyZWY7Ci0JfQotCi0KLX0KLQotCi0vKioKLSAqIFNlbGVjdHMgYSB0b3BpYyBpbiB0aGUgdHJlZTogZXhwYW5kIHRyZWUgYW5kIGhpZ2hsaWdodCBpdAotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MKLSAqLwotZnVuY3Rpb24gc2VsZWN0VG9waWModG9waWMpCi17Ci0JaWYgKCF0b3BpYykKLQkJcmV0dXJuIGZhbHNlOwotCQkKLQl0b3BpYyA9IHBhcmVudC5wYXJlbnQuZml4VXJsKHRvcGljKTsKLQkKLQkvLyByZW1vdmUgdGhlIHF1ZXJ5LCBpZiBhbnkKLQl2YXIgaSA9IHRvcGljLmluZGV4T2YoJz8nKTsKLQlpZiAoaSAhPSAtMSkKLQkJdG9waWMgPSB0b3BpYy5zdWJzdHJpbmcoMCwgaSk7Ci0KLQotCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0KLQlmb3IgKHZhciBpPTA7IGk8bGlua3MubGVuZ3RoOyBpKyspCi0JewkJCQotCQl2YXIgZml4ZWRfaHJlZiA9IHBhcmVudC5wYXJlbnQuZml4VXJsKGxpbmtzW2ldLmhyZWYpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBxdWVyeSwgaWYgYW55Ci0JCXZhciBpbmR4ID0gZml4ZWRfaHJlZi5pbmRleE9mKCc/Jyk7Ci0JCWlmIChpbmR4ICE9IC0xKSB7Ci0JCQlmaXhlZF9ocmVmID0gZml4ZWRfaHJlZi5zdWJzdHJpbmcoMCwgaW5keCk7Ci0JCX0KLQotCQkvL2FsZXJ0KCJmaXhlZCBocmVmPSIgKyBmaXhlZF9ocmVmKTsKLQkJaWYgKHRvcGljID09IGZpeGVkX2hyZWYpCi0JCXsKLQkJCWV4cGFuZFBhdGhUbyhsaW5rc1tpXSwgZmFsc2UpOwotCQkJaGlnaGxpZ2h0VG9waWMobGlua3NbaV0pOwotCQkJc2Nyb2xsSW50b1ZpZXcobGlua3NbaV0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioKLSAqIFNlbGVjdHMgYSB0b3BpYyBpbiB0aGUgdHJlZTogZXhwYW5kIHRyZWUgYW5kIGhpZ2hsaWdodCBpdAotICogcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3MKLSAqLwotZnVuY3Rpb24gc2VsZWN0VG9waWNCeUlkKGlkKQotewotCXZhciB0b3BpYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKLQlpZiAodG9waWMpCi0JewotCQlleHBhbmRQYXRoVG8odG9waWMsIGZhbHNlKTsKLQkJaGlnaGxpZ2h0VG9waWModG9waWMpOwotCQlzY3JvbGxJbnRvVmlldyh0b3BpYyk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qKgotICogU2Nyb2xscyB0aGUgcGFnZSB0byBzaG93IHRoZSBzcGVjaWZpZWQgZWxlbWVudAotICovCi1mdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhub2RlKQotewotCXZhciBzY3JvbGwgPSBnZXRWZXJ0aWNhbFNjcm9sbChub2RlKTsKLQlpZiAoc2Nyb2xsICE9IDApCi0JCXdpbmRvdy5zY3JvbGxCeSgwLCBzY3JvbGwpOwotfQotCi0vKioKLSAqIFNjcm9sbHMgdGhlIHBhZ2UgdG8gc2hvdyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLSAqLwotZnVuY3Rpb24gZ2V0VmVydGljYWxTY3JvbGwobm9kZSkKLXsKLQl2YXIgbm9kZVRvcCA9IG5vZGUub2Zmc2V0VG9wOwotCXZhciBub2RlQm90dG9tID0gbm9kZVRvcCArIG5vZGUub2Zmc2V0SGVpZ2h0OwotCXZhciBwYWdlVG9wID0gMDsKLQl2YXIgcGFnZUJvdHRvbSA9IDA7Ci0JCi0JaWYgKGlzSUUpCi0JewotCQlwYWdlVG9wID0gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7IAotCQlwYWdlQm90dG9tID0gcGFnZVRvcCArIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0OwotCQotCX0gCi0JZWxzZSBpZiAoaXNNb3ppbGxhKQotCXsKLQkJcGFnZVRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldDsKLQkJcGFnZUJvdHRvbSA9IHBhZ2VUb3AgKyB3aW5kb3cuaW5uZXJIZWlnaHQgLSBub2RlLm9mZnNldEhlaWdodDsKLQl9Ci0JCi0JdmFyIHNjcm9sbCA9IDA7Ci0JaWYgKG5vZGVUb3AgPj0gcGFnZVRvcCApCi0JewotCQlpZiAobm9kZUJvdHRvbSA8PSBwYWdlQm90dG9tKQotCQkJc2Nyb2xsID0gMDsgLy8gYWxyZWFkeSBpbiB2aWV3Ci0JCWVsc2UKLQkJCXNjcm9sbCA9IG5vZGVCb3R0b20gLSBwYWdlQm90dG9tOwotCX0KLQllbHNlCi0JewotCQlzY3JvbGwgPSBub2RlVG9wIC0gcGFnZVRvcDsKLQl9Ci0JCi0JcmV0dXJuIHNjcm9sbDsKLX0KLQotLyoKLSAqIEN1cnJlbnRseSBjYWxsZWQgb24gSUUgb25seQotICovCi1mdW5jdGlvbiBmb2N1c0hhbmRsZXIoZSkKLXsKLQkvKmlmIChpc01vemlsbGEpCi0JCXJldHVybjsKLQkqLwotCQkKLQl0cnl7Ci0JCWlmIChvbGRBY3RpdmUpewotCQkJLy8gb25seSBmb2N1cyB3aGVuIHRoZSBlbGVtZW50IGlzIHZpc2libGUKLQkJCXZhciBzY3JvbGwgPSBnZXRWZXJ0aWNhbFNjcm9sbChvbGRBY3RpdmUpOwotCQkJaWYgKHNjcm9sbCA9PSAwKQotCQkJCW9sZEFjdGl2ZS5mb2N1cygpOwotCQl9CQkKLQl9Ci0JY2F0Y2goZSl7fQotfQotCi0KLS8qKgotICogZGlzcGxheSB0b3BpYyBsYWJlbCBpbiB0aGUgc3RhdHVzIGxpbmUgb24gbW91c2Ugb3ZlciB0b3BpYwotICovCi1mdW5jdGlvbiBtb3VzZU1vdmVIYW5kbGVyKGUpIHsKLQl2YXIgb3Zlck5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gCWlmICghb3Zlck5vZGUpIHJldHVybjsKLSAgCQotCW92ZXJOb2RlID0gZ2V0QW5jaG9yTm9kZShvdmVyTm9kZSk7Ci0JICBpZiAob3Zlck5vZGUgPT0gbnVsbCl7Ci0JICAgd2luZG93LnN0YXR1cyA9ICIiOwotCSAgIHJldHVybjsKLQkgIH0KLSAKLQlpZiAoaXNNb3ppbGxhKQotCQllLmNhbmNlbEJ1YmJsZSA9IGZhbHNlOwotICAJIAotCWlmIChvdmVyTm9kZS50aXRsZSA9PSAiIikgewotCQlpZiAob3Zlck5vZGUuaW5uZXJUZXh0KQotCQkJb3Zlck5vZGUudGl0bGUgPSBvdmVyTm9kZS5pbm5lclRleHQ7Ci0JCWVsc2UgaWYgKG92ZXJOb2RlLnRleHQpCi0JCQlvdmVyTm9kZS50aXRsZSA9IG92ZXJOb2RlLnRleHQ7Ci0JfQotCXdpbmRvdy5zdGF0dXMgPSBvdmVyTm9kZS50aXRsZTsKLX0KLQotLyoqCi0gKiBoYW5kbGVyIGZvciBleHBhbmRpbmcgLyBjb2xsYXBzaW5nIHRvcGljIHRyZWUKLSAqLwotZnVuY3Rpb24gbW91c2VDbGlja0hhbmRsZXIoZSkgewotCi0gIAl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0KLSAgCWlmIChpc1BsdXNNaW51cyhjbGlja2VkTm9kZSkgKQotICAJewkKLSAgICAJaWYgKGlzQ29sbGFwc2VkKGNsaWNrZWROb2RlKSkgCi0gICAJCQlleHBhbmQoY2xpY2tlZE5vZGUpOwotICAJCWVsc2UgaWYgKGlzRXhwYW5kZWQoY2xpY2tlZE5vZGUpKSAKLSAgCSAgCQljb2xsYXBzZShjbGlja2VkTm9kZSk7Ci0gIAl9Ci0gIAllbHNlCi0gIAl7Ci0gIAkJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJCWlmIChwbHVzX21pbnVzICE9IG51bGwpCi0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJfQotICAJCi0gIAlpZiAoaXNNb3ppbGxhKQotICAJCWUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCWVsc2UgaWYgKGlzSUUpCi0gIAkJd2luZG93LmV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7Ci19Ci0KLS8qKgotICogaGFuZGxlciBmb3IgZXhwYW5kaW5nIC8gY29sbGFwc2luZyB0b3BpYyB0cmVlCi0gKi8KLWZ1bmN0aW9uIG1vdXNlRGJsQ2xpY2tIYW5kbGVyKGUpIHsKLQotICAJdmFyIGNsaWNrZWROb2RlID0gZ2V0VGFyZ2V0KGUpOwotICAJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotCi0gIAl2YXIgcGx1c19taW51cyA9IGdldFBsdXNNaW51cyhjbGlja2VkTm9kZSk7Ci0gIAlpZiAocGx1c19taW51cyAhPSBudWxsKQotICAJewkKLSAgICAJaWYgKGNsaWNrZWROb2RlLnRhZ05hbWUgPT0gIkEiICYmIGdldENoaWxkTm9kZShjbGlja2VkTm9kZS5wYXJlbnROb2RlLCAiVUwiKSA9PSBudWxsKSAKLSAgCQl7Ci0gIAkJCWhpZ2hsaWdodFRvcGljKHBsdXNfbWludXMpOwotICAJCX0KLSAgCQllbHNlCi0gIAkJeyAgCQkKLSAgICAJCWlmIChpc0NvbGxhcHNlZChwbHVzX21pbnVzKSkgCi0gICAJCQkJZXhwYW5kKHBsdXNfbWludXMpOwotICAJCQllbHNlIGlmIChpc0V4cGFuZGVkKHBsdXNfbWludXMpKSAKLSAgCSAgCQkJY29sbGFwc2UocGx1c19taW51cyk7ICAJICAJCSAgCQkgIAotICAJICAJCQkKLSAgCQkJaGlnaGxpZ2h0VG9waWMocGx1c19taW51cyk7Ci0gIAkJfQotICAJfQotICAKLSAgCWlmIChpc01vemlsbGEpCi0gIAkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwotICAJZWxzZSBpZiAoaXNJRSkKLSAgCQl3aW5kb3cuZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLX0KLQotLyoqCi0gKiBIYW5kbGVyIGZvciBrZXkgZG93biAoYXJyb3dzKQotICovCi1mdW5jdGlvbiBrZXlEb3duSGFuZGxlcihlKQotewotCXZhciBrZXk7Ci0KLQlpZiAoaXNJRSkgewotCQlrZXkgPSB3aW5kb3cuZXZlbnQua2V5Q29kZTsKLQl9IGVsc2UgaWYgKGlzTW96aWxsYSkgewotCQlrZXkgPSBlLmtleUNvZGU7Ci0JfQotCQkKLQlpZiAoa2V5IDwzNyB8fCBrZXkgPiA0MCkgCi0JCXJldHVybiB0cnVlOwotCQotCWlmIChpc01vemlsbGEpCi0gIAkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwotICAJZWxzZSBpZiAoaXNJRSkKLSAgCQl3aW5kb3cuZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTsKLSAgCQkKLSAgCWlmIChrZXkgPT0gMzkpIHsgLy8gUmlnaHQgYXJyb3csIGV4cGFuZAotCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotICAJCWlmIChpc0lFKXsKLQkJCWlmKGNsaWNrZWROb2RlLmlkIT1udWxsKXsKLQkJCQlpZihjbGlja2VkTm9kZS5pZC5jaGFyQXQoMCk9PSdiJyl7Ci0JCQkJCWlmKGNsaWNrZWROb2RlLm5hbWUhPSJvcGVuZWQiKXsKLQkJCQkJCWxvYWRUT0MoY2xpY2tlZE5vZGUubmFtZSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0gIAkJdmFyIHBsdXNfbWludXMgPSBnZXRQbHVzTWludXMoY2xpY2tlZE5vZGUpOwotICAJCWlmIChwbHVzX21pbnVzICE9IG51bGwpCi0gIAkJewkKLSAgICAJCWlmIChpc0NvbGxhcHNlZChwbHVzX21pbnVzKSkgCi0gICAJCQkJZXhwYW5kKHBsdXNfbWludXMpOwotICAJCQkKLSAgCQkJaGlnaGxpZ2h0VG9waWMocGx1c19taW51cyk7Ci0gIAkJCXNjcm9sbEludG9WaWV3KGNsaWNrZWROb2RlKTsKLSAgCQl9Ci0gIAl9IGVsc2UgaWYgKGtleSA9PSAzNykgeyAvLyBMZWZ0IGFycm93LGNvbGxhcHNlCi0JCXZhciBjbGlja2VkTm9kZSA9IGdldFRhcmdldChlKTsKLSAgCQlpZiAoIWNsaWNrZWROb2RlKSByZXR1cm47Ci0gIAkJCi0gIAkJaWYoY2xpY2tlZE5vZGUuaWQhPW51bGwpewotICAJCQlpZihjbGlja2VkTm9kZS5pZC5jaGFyQXQoMCk9PSdiJyl7Ci0JCQkJaWYoY2xpY2tlZE5vZGUubmFtZT09Im9wZW5lZCIpewotCQkJCQlsb2FkVE9DKCIgIik7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQllbHNleyAJCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0KLSAgCQl2YXIgcGx1c19taW51cyA9IGdldFBsdXNNaW51cyhjbGlja2VkTm9kZSk7Ci0gIAkJaWYgKHBsdXNfbWludXMgIT0gbnVsbCkKLSAgCQl7CQotICAgIAkJaWYgKGlzRXhwYW5kZWQocGx1c19taW51cykpIAotICAgCQkJCWNvbGxhcHNlKHBsdXNfbWludXMpOwotICAJCQkKLSAgCQkJaGlnaGxpZ2h0VG9waWMocGx1c19taW51cyk7Ci0gIAkJCXNjcm9sbEludG9WaWV3KGNsaWNrZWROb2RlKTsKLSAgCQl9Ci0gIAl9IGVsc2UgaWYgKGtleSA9PSA0MCApIHsgLy8gZG93biBhcnJvdwotICAJCXZhciBjbGlja2VkTm9kZSA9IGdldFRhcmdldChlKTsKLSAgCQlpZiAoIWNsaWNrZWROb2RlKSByZXR1cm47Ci0KLQkJdmFyIG5leHQgPSBnZXROZXh0RG93bihjbGlja2VkTm9kZSk7Ci0JCWlmIChuZXh0KQotCQkJbmV4dC5mb2N1cygpOwotCi0gIAl9IGVsc2UgaWYgKGtleSA9PSAzOCApIHsgLy8gdXAgYXJyb3cKLSAgCQl2YXIgY2xpY2tlZE5vZGUgPSBnZXRUYXJnZXQoZSk7Ci0gIAkJaWYgKCFjbGlja2VkTm9kZSkgcmV0dXJuOwotCi0JCXZhciBuZXh0ID0gZ2V0TmV4dFVwKGNsaWNrZWROb2RlKTsKLQkJaWYgKG5leHQpCi0JCQluZXh0LmZvY3VzKCk7Ci0gIAl9Ci0gIAkKLSAgCSAJCQkKLSAgCXJldHVybiB0cnVlOwotfQotCi1pZiAoaXNNb3ppbGxhKSB7Ci0gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbW91c2VDbGlja0hhbmRsZXIsIHRydWUpOwotICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIG1vdXNlRGJsQ2xpY2tIYW5kbGVyLCB0cnVlKTsKLSAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgbW91c2VNb3ZlSGFuZGxlciwgdHJ1ZSk7Ci0gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBrZXlEb3duSGFuZGxlciwgdHJ1ZSk7Ci19Ci1lbHNlIGlmIChpc0lFKXsKLSAgZG9jdW1lbnQub25jbGljayA9IG1vdXNlQ2xpY2tIYW5kbGVyOwotICBkb2N1bWVudC5vbmRibGNsaWNrID0gbW91c2VEYmxDbGlja0hhbmRsZXI7Ci0gIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gbW91c2VNb3ZlSGFuZGxlcjsKLSAgZG9jdW1lbnQub25rZXlkb3duID0ga2V5RG93bkhhbmRsZXI7Ci0gIC8vd2luZG93Lm9uZm9jdXMgPSBmb2N1c0hhbmRsZXI7Ci19Ci0KLWZ1bmN0aW9uIHNldENvb2tpZSggbmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlICkgCi17Ci0JLy8gc2V0IHRpbWUsIGl0J3MgaW4gbWlsbGlzZWNvbmRzCi0JdmFyIHRvZGF5ID0gbmV3IERhdGUoKTsKLQl0b2RheS5zZXRUaW1lKCB0b2RheS5nZXRUaW1lKCkgKTsKLQotCS8qCi0JaWYgdGhlIGV4cGlyZXMgdmFyaWFibGUgaXMgc2V0LCBtYWtlIHRoZSBjb3JyZWN0IAotCWV4cGlyZXMgdGltZSwgdGhlIGN1cnJlbnQgc2NyaXB0IGJlbG93IHdpbGwgc2V0IAotCWl0IGZvciB4IG51bWJlciBvZiBkYXlzLCB0byBtYWtlIGl0IGZvciBob3VycywgCi0JZGVsZXRlICogMjQsIGZvciBtaW51dGVzLCBkZWxldGUgKiA2MCAqIDI0Ci0JKi8KLQlpZiAoIGV4cGlyZXMgKQotCXsKLQlleHBpcmVzID0gZXhwaXJlcyAqIDEwMDAgKiA2MCAqIDYwICogMjQ7Ci0JfQotCXZhciBleHBpcmVzX2RhdGUgPSBuZXcgRGF0ZSggdG9kYXkuZ2V0VGltZSgpICsgKGV4cGlyZXMpICk7Ci0KLQlkb2N1bWVudC5jb29raWUgPSBuYW1lICsgIj0iICtlc2NhcGUoIHZhbHVlICkgKwotCSggKCBleHBpcmVzICkgPyAiO2V4cGlyZXM9IiArIGV4cGlyZXNfZGF0ZS50b0dNVFN0cmluZygpIDogIiIgKSArIAotCSggKCBwYXRoICkgPyAiO3BhdGg9IiArIHBhdGggOiAiIiApICsgCi0JKCAoIGRvbWFpbiApID8gIjtkb21haW49IiArIGRvbWFpbiA6ICIiICkgKwotCSggKCBzZWN1cmUgKSA/ICI7c2VjdXJlIiA6ICIiICk7Ci19Ci0KLQotZnVuY3Rpb24gZ2V0Q29va2llKCBuYW1lICkgewkKLQl2YXIgc3RhcnQgPSBkb2N1bWVudC5jb29raWUuaW5kZXhPZiggbmFtZSArICI9IiApOwotCXZhciBsZW4gPSBzdGFydCArIG5hbWUubGVuZ3RoICsgMTsKLQlpZiAoICggIXN0YXJ0ICkgJiYKLQkoIG5hbWUgIT0gZG9jdW1lbnQuY29va2llLnN1YnN0cmluZyggMCwgbmFtZS5sZW5ndGggKSApICkKLQl7Ci0JcmV0dXJuIG51bGw7Ci0JfQotCWlmICggc3RhcnQgPT0gLTEgKSByZXR1cm4gbnVsbDsKLQl2YXIgZW5kID0gZG9jdW1lbnQuY29va2llLmluZGV4T2YoICI7IiwgbGVuICk7Ci0JaWYgKCBlbmQgPT0gLTEgKSBlbmQgPSBkb2N1bWVudC5jb29raWUubGVuZ3RoOwotCXJldHVybiB1bmVzY2FwZSggZG9jdW1lbnQuY29va2llLnN1YnN0cmluZyggbGVuLCBlbmQgKSApOwotfQotCi0KLWZ1bmN0aW9uIERlbGV0ZV9Db29raWUoIG5hbWUsIHBhdGgsIGRvbWFpbiApIHsKLQlpZiAoIEdldF9Db29raWUoIG5hbWUgKSApIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyAiPSIgKwotCSggKCBwYXRoICkgPyAiO3BhdGg9IiArIHBhdGggOiAiIikgKwotCSggKCBkb21haW4gKSA/ICI7ZG9tYWluPSIgKyBkb21haW4gOiAiIiApICsKLQkiO2V4cGlyZXM9VGh1LCAwMS1KYW4tMTk3MCAwMDowMDowMSBHTVQiOwotfQotCi1mdW5jdGlvbiBmaXhUb3BpY1VybCh1cmwpIHsKLQotCXZhciBmaXhlZF9ocmVmID0gcGFyZW50LnBhcmVudC5maXhVcmwodXJsKTsKLQkvLyByZW1vdmUgdGhlIHF1ZXJ5LCBpZiBhbnkKLQl2YXIgaW5keCA9IGZpeGVkX2hyZWYuaW5kZXhPZignPycpOwotCWlmIChpbmR4ICE9IC0xKSB7Ci0JCWZpeGVkX2hyZWYgPSBmaXhlZF9ocmVmLnN1YnN0cmluZygwLCBpbmR4KTsKLQl9Ci0KLQlyZXR1cm4gZml4ZWRfaHJlZjsKLX0KLQotLyogZmluZCB0aGUgbm9kZSB3aXRoIHRoZSBnaXZlbiB1cmwgYW5kIHJldHVybiB0aGUgQSBlbGVtZW50ICovCQotZnVuY3Rpb24gZmluZE5vZGUodG9waWMpIHsKLQlpZiAoIXRvcGljKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQl0b3BpYyA9IGZpeFRvcGljVXJsKHRvcGljKTsJCi0JdmFyIGxpbmtzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKLQlmb3IgKHZhciBpPTA7IGk8bGlua3MubGVuZ3RoOyBpKyspCi0JewkJCQotCQl2YXIgZml4ZWRfaHJlZiA9IGZpeFRvcGljVXJsKGxpbmtzW2ldLmhyZWYpOwkJCQotCQlpZiAodG9waWMgPT0gZml4ZWRfaHJlZikKLQkJewotCQkJLy9hbGVydCh0b3BpYyArICJcbiIgKyBsaW5rc1tpXS5ocmVmKTsKLQkJCXJldHVybiBsaW5rc1tpXTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLX0KLQotCi1mdW5jdGlvbiBnZXROb2RlSWRGcm9tVXJsKHVybCkgewotCi0JdmFyIGluZHggPSB1cmwuaW5kZXhPZigiPyIpOwotCWlmICggaW5keCA8IDAgKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlxdWVyeVN0ciA9IHVybC5zdWJzdHJpbmcoaW5keCsxKTsKLQl2YXIgcGFpcnMgPSBxdWVyeVN0ci5zcGxpdCgiJiIpOwotICAgCWZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgCQl2YXIgcG9zID0gcGFpcnNbaV0uaW5kZXhPZignPScpOwotICAgICAJCWlmIChwb3MgPT0gLTEpIGNvbnRpbnVlOwotICAgICAJCXZhciBhcmduYW1lID0gcGFpcnNbaV0uc3Vic3RyaW5nKDAscG9zKTsKLSAgICAgCQl2YXIgdmFsdWUgPSBwYWlyc1tpXS5zdWJzdHJpbmcocG9zKzEpOyAgICAJCi0gICAgIAkJaWYgKCBhcmduYW1lID09ICJub2RlSWQiICkgewotICAgICAJCQlyZXR1cm4gdmFsdWU7Ci0gICAgIAkJfQotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLX0KLQotZnVuY3Rpb24gZ2V0QnJlYWRjcnVtYnNCeUd1aWQoZ3VpZCkgewotCi0JdmFyIG5vZGUgPSBnZXROb2RlQnlHdWlkKGd1aWQpOwotCWlmIChub2RlICE9IG51bGwpIHsKLQkJaWQgPSBub2RlLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJcmV0dXJuIGdldEJyZWFkY3J1bWJzQnlOb2RlSWQoaWQpOwotCX0KLQkKLQlyZXR1cm4gIiI7CQotfQotCi1mdW5jdGlvbiBnZXROb2RlQnlHdWlkKGd1aWQpIHsKLQotCXZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIik7Ci0JZm9yICh2YXIgaT0wOyBpPGxpbmtzLmxlbmd0aDsgaSsrKQotCXsJCi0JCXZhciBub2RlID0gbGlua3NbaV07Ci0JCWlmIChndWlkID09IG5vZGUuZ2V0QXR0cmlidXRlKCJndWlkIikgKSB7Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCX0KLQkKLQlyZXR1cm4gbnVsbDsJCi19Ci0KLWZ1bmN0aW9uIGdldEJyZWFkY3J1bWJzKHVybCkgewotCi0JdmFyIGlkID0gZ2V0Tm9kZUlkRnJvbVVybCh1cmwpOwotCS8vYWxlcnQoImlkOiB1cmwgOiAiICsgaWQgKyAiLCAiICsgdXJsKTsKLQotCWlmICggaWQgPT0gbnVsbCB8fCBpZCA9PSAiIiApIHsKLQkJLyoKLQkJLy8gZ2V0IHRoZSBwYXJlbnQgbm9kZSwgYXNzdW1pbmcgdGhlIGN1cnJlbnQgbm9kZSBpcyBuYXZpZ2F0ZWQgZnJvbSB0aGUgcHJldmlvdXMgbm9kZQotCQl2YXIgcHJldmlvdXNCcmVhZENydW1iSWQgPSBnZXRDb29raWUoInByZXZpb3VzQnJlYWRDcnVtYklkIik7Ci0JCQotCQkvL2FsZXJ0KCJwcmV2aW91c0JyZWFkQ3J1bWJJZD0iICsgcHJldmlvdXNCcmVhZENydW1iSWQpOwotCQl2YXIgcE5vZGUgPSBudWxsOwotCQlpZiAoIHByZXZpb3VzQnJlYWRDcnVtYklkICE9IG51bGwgKSB7Ci0JCQlwTm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZXZpb3VzQnJlYWRDcnVtYklkKTsKLQkJCWlmICggcE5vZGUgIT0gbnVsbCApIHsKLQkJCQkvLyBnZXQgdGhlIHBhcmVudCBub2Qgb2YgdGhlIGxpbmsKLQkJCQlwTm9kZSA9IHBOb2RlLnBhcmVudE5vZGU7Ci0JCQkJLy9hbGVydChwTm9kZS50YWdOYW1lKTsKLQkJCX0KLQkJfQotCQkqLwotCQkKLQkJdmFyIG5vZGUgPSBmaW5kTm9kZSh1cmwpOwkJCi0JCWlmICggbm9kZSAhPSBudWxsICkgewotCQkJaWQgPSBub2RlLmdldEF0dHJpYnV0ZSgiaWQiKTsKLQkJfQotCQkKLQkJaWYgKCBpZCA9PSBudWxsICkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCQotCQkvLyBzYXZlIHRoZSBjdXJyZW50IGlkCi0JCS8vIHNldENvb2tpZSgicHJldmlvdXNCcmVhZENydW1iSWQiLCBpZCk7Ci0JfQotCQotCXNlbGVjdFRvcGljQnlJZChpZCk7Ci0KLQlyZXR1cm4gZ2V0QnJlYWRjcnVtYnNCeU5vZGVJZChpZCk7Ci19Ci0KLQotZnVuY3Rpb24gZ2V0QnJlYWRjcnVtYnNCeU5vZGVJZChpZCkgewotCi0JdmFyIGJjcyA9IFtdOwotCXZhciBjb3VudCA9IDA7Ci0JdmFyIHBJZCA9IGlkOwotCXdoaWxlICggcElkICE9ICIiICkgewotCQl2YXIgdG9waWMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwSWQpOwotCQlpZiAoIHRvcGljID09IG51bGwgKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCWJjc1tjb3VudCsrXSA9IF9jb25zdHJ1Y3RCcmVhZGNydW1iKHRvcGljKTsKLQkJCi0JCXBJZCA9IHRvcGljLmdldEF0dHJpYnV0ZSgicGFyZW50SWQiKTsKLQl9Ci0JCi0JcmV0dXJuIGJjcy5yZXZlcnNlKCk7Ci0KLX0KLQotZnVuY3Rpb24gX2NvbnN0cnVjdEJyZWFkY3J1bWIobm9kZSkgewotCi0KLQl2YXIgc3RyID0gbm9kZS5pbm5lckhUTUw7Ci0JdmFyIHVybCA9IG5vZGUuaHJlZjsKLQl2YXIgZ3VpZCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJndWlkIik7Ci0JCi0JdmFyIGkgPSBzdHIuaW5kZXhPZigiPiIpOwotCWlmICggaSA+IDAgKSB7Ci0JCXN0ciA9IHN0ci5zdWJzdHJpbmcoaSsxKTsKLQl9Ci0KLQlyZXR1cm4ge2lkOiBndWlkLCB1cmw6IHVybCwgdGl0bGU6IHN0cn07Ci0KLX0KLQotCi0KLWZ1bmN0aW9uIGdldEJhc2VVcmwoKSB7Ci0JdmFyIHVybCA9IHBhcmVudC5wYXJlbnQubG9jYXRpb24uaHJlZjsKLQl2YXIgaSA9IHVybC5sYXN0SW5kZXhPZigiLyIpOwotCXJldHVybiB1cmwuc3Vic3RyaW5nKDAsIGkrMSk7Ci19Ci0KLWZ1bmN0aW9uIGdldEN1cnJlbnRTZWxlY3Rpb24oKSB7Ci0JcmV0dXJuIG9sZEFjdGl2ZTsKLX0KLQotLyogZ2l2ZSB0aGUgTEkgbm9kZSBhcyBwYXJlbnQsIGZpbmQgdGhlIGNoaWxkIDxBIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gZ3VpZCovCi1mdW5jdGlvbiBnZXRDaGlsZE5vZGVXaXRoR3VpZCgvKkxJKi9wTm9kZSwgZ3VpZCkKLXsKLQkvL2FsZXJ0KCJwYXJlbnQgTGluazogIiArIHBOb2RlLnRhZ05hbWUpOwotCi0JaWYgKCBwTm9kZSA9PSBudWxsICkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JaWYgKCBwTm9kZS50YWdOYW1lID09ICJBIiApIHsKLQkJcE5vZGUgPSBwTm9kZS5wYXJlbnROb2RlOwotCX0KLQkKLQl2YXIgdWwgPSBnZXRDaGlsZE5vZGUocE5vZGUsICJVTCIpOwotCQkKLQlpZiAoIHVsID09IG51bGwgKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCi0JdmFyIGxpc3QgPSB1bC5jaGlsZE5vZGVzOwotCWlmIChsaXN0ID09IG51bGwpIHJldHVybiBudWxsOwotCQotCWZvciAodmFyIGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCXZhciB0YWcgPSBsaXN0Lml0ZW0oaSk7Ci0JCWlmICh0YWcudGFnTmFtZSA9PSAiTEkiICkgewotCQkJdmFyIGEgPSBnZXRDaGlsZE5vZGUodGFnLCAiQSIpOwotCQkJaWYgKCBhICE9IG51bGwgJiYgYS5nZXRBdHRyaWJ1dGUoImd1aWQiKSA9PSBndWlkKSB7CQkKLQkJCQlyZXR1cm4gYTsKLQkJCX0KLQkJfQotCX0KLQkKLQlyZXR1cm4gbnVsbDsKLX0KLQotCi0vKiBnaXZlIGFuIGFycmF5IG9mIGd1aWRzLCByZXR1cm5zIHRoZSBicmVhZGNydW1icyovCi1mdW5jdGlvbiBnZXRCcmVhZGNydW1ic0J5UGF0aChndWlkcykgewotCi0JaWYgKCBndWlkcyA9PSBudWxsIHx8IGd1aWRzLmxlbmd0aCA9PSAwICkgewotCQlyZXR1cm4gW107Ci0JfQotCQotCS8vIHN0YXJ0IGZyb20gdGhlIGZpcnN0IGd1aWQsIG9yIGZyb20gdGhlIGN1cnJlbnQgc2VsZWN0aW9uCi0JdmFyIHN0YXJ0ID0gMDsKLQl2YXIgcE5vZGUgPSBudWxsOwotCXZhciBjdXJOb2RlID0gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCWlmICggY3VyTm9kZSAhPSBudWxsICkgewotCQl2YXIgY3VyR3VpZCA9IGN1ck5vZGUuZ2V0QXR0cmlidXRlKCJndWlkIik7Ci0JCWZvciAoIHZhciBpID0gMDsgaSA8IGd1aWRzLmxlbmd0aC0xOyBpKysgKSB7Ci0JCQl2YXIgZ3VpZCA9IGd1aWRzW2ldOwotCQkJaWYgKCBndWlkID09IGN1ckd1aWQgKSB7Ci0JCQkJc3RhcnQgPSBpOwotCQkJCXBOb2RlID0gY3VyTm9kZTsKLQkJCQlicmVhazsKLQkJCX0JCQkKLQkJfQotCX0KLQkKLQotCWlmICggcE5vZGUgPT0gbnVsbCApIHsKLQkJcE5vZGUgPSBnZXROb2RlQnlHdWlkKGd1aWRzWzBdKTsKLQl9Ci0JCi0JaWYgKCBwTm9kZSA9PSBudWxsICkgewotCQlyZXR1cm4gW107Ci0JfQotCQotCXZhciBiY3MgPSBnZXRCcmVhZGNydW1ic0J5Tm9kZUlkKCBwTm9kZS5nZXRBdHRyaWJ1dGUoImlkIikgKTsKLQkJCi0JZm9yICggdmFyIGkgPSBzdGFydCsxOyBpIDwgZ3VpZHMubGVuZ3RoOyBpKysgKSB7Ci0JCXZhciBub2RlID0gZ2V0Q2hpbGROb2RlV2l0aEd1aWQocE5vZGUsIGd1aWRbaV0pOwotCQlpZiAoIG5vZGUgPT0gbnVsbCApIHsKLQkJCWJyZWFrOwotCQl9Ci0JCQotCQliY3MucHVzaChfY29uc3RydWN0QnJlYWRjcnVtYihub2RlKSk7CQkKLQkJcE5vZGUgPSBub2RlOwotCX0KLQotCS8vIHNlbGVjdCB0aGUgbm9kZQotCS8vc2VsZWN0VG9waWNCeUlkKHBOb2RlLmdldEF0dHJpYnV0ZSgiaWQiKSApOwotCi0JcmV0dXJuIGJjczsJCi19Ci0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RyZWUuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L25vYXBwbGV0L3RyZWUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjJlM2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9ub2FwcGxldC90cmVlLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKioKLSAqIExvYWRzIHRoZSBzcGVjaWZpZWQgdGFibGUgb2YgY29udGVudHMKLSAqLwotZnVuY3Rpb24gbG9hZFRPQyh0b2NIcmVmKQotewotCS8vIG5hdmlnYXRlIHRvIHRoaXMgdG9jLCBpZiBub3QgYWxyZWFkeSBsb2FkZWQKLQlpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigidG9jVmlldy5qc3A/dG9jPSIrdG9jSHJlZikgIT0gLTEpCi0JCXJldHVybjsKLQl3aW5kb3cubG9jYXRpb24ucmVwbGFjZSgidG9jVmlldy5qc3A/dG9jPSIrdG9jSHJlZik7Ci19Ci0KLXZhciB0b2NUaXRsZSA9ICIiOwotdmFyIHRvY0lkID0gIiI7Ci0KLWZ1bmN0aW9uIG9ubG9hZEhhbmRsZXIoKQotewotCXJldHVybjsKLQl0b2NUaXRsZSA9ICdXb3JrYmVuY2hcdTAwMjBVc2VyXHUwMDIwR3VpZGUnOwotCXZhciB0b2NUb3BpYyA9ICJhYm91dDpibGFuayI7Ci0KLQkvLyBzZXQgdGl0bGUgb24gdGhlIGNvbnRlbnQgdG9vbGJhcgotCXBhcmVudC5wYXJlbnQucGFyZW50LnNldENvbnRlbnRUb29sYmFyVGl0bGUodG9jVGl0bGUpOwotCi0JdmFyIHRvcGljU2VsZWN0ZWQ9ZmFsc2U7Ci0JLy8gc2VsZWN0IHNwZWNpZmllZCB0b3BpYywgb3IgZWxzZSB0aGUgYm9vawotCXZhciB0b3BpYyA9ICJhYm91dDpibGFuayI7Ci0JaWYgKHRvcGljICE9ICJhYm91dDpibGFuayIgJiYgdG9waWMgIT0gdG9jVG9waWMpIHsKLQkJaWYgKHRvcGljLmluZGV4T2Yod2luZG93LmxvY2F0aW9uLnByb3RvY29sKSAhPSAwICYmIHRvcGljLmxlbmd0aCA+IDIpIHsKLQkJCS8vIHJlbW92ZSB0aGUgLi4gZnJvbSB0b3BpYwotCQkJdG9waWMgPSB0b3BpYy5zdWJzdHJpbmcoMik7Ci0JCQkvLyByZW1vdmUgYWR2YW5jZWQvdG9jVmlldy5qc3AgZnJvbSBwYXRoIHRvIG9idGFpbiBjb250ZXh0UGF0aAotCQkJdmFyIGNvbnRleHRQYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lOwotCQkJdmFyIHNsYXNoID0gY29udGV4dFBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmKHNsYXNoID4gMCkgewotCQkJCXNsYXNoID0gY29udGV4dFBhdGgubGFzdEluZGV4T2YoJy8nLCBzbGFzaC0xKTsKLQkJCQlpZihzbGFzaCA+PSAwKSB7Ci0JCQkJCWNvbnRleHRQYXRoID0gY29udGV4dFBhdGguc3Vic3RyKDAsIHNsYXNoKTsKLQkJCQkJdG9waWMgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAiLy8iICt3aW5kb3cubG9jYXRpb24uaG9zdCArIGNvbnRleHRQYXRoICsgdG9waWM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRvcGljU2VsZWN0ZWQgPSBzZWxlY3RUb3BpYyh0b3BpYyk7Ci0JfSBlbHNlIHsKLQkJdG9waWNTZWxlY3RlZCA9IHNlbGVjdFRvcGljQnlJZCh0b2NJZCk7Ci0JfQotCi0JaWYoIXRvcGljU2VsZWN0ZWQpewotCQlpZihwYXJlbnQucGFyZW50LmFjdGl2aXR5RmlsdGVyaW5nKXsKLQkJCWFza1Nob3dBbGwoKTsKLQkJfQotCX0KLQotCi0JZm9jdXNIYW5kbGVyKCJlIik7Ci19Ci0KLXZhciBhc2tTaG93QWxsRGlhbG9nOwotdmFyIHcgPSA0NzA7Ci12YXIgaCA9IDI3MDsKLQotZnVuY3Rpb24gYXNrU2hvd0FsbCgpewotCi0JdmFyIGwgPSB0b3Auc2NyZWVuTGVmdCArICh0b3AuZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCAtIHcpIC8gMjsKLQl2YXIgdCA9IHRvcC5zY3JlZW5Ub3AgKyAodG9wLmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IC0gaCkgLyAyOwotCi0JLy8gbW92ZSB0aGUgZGlhbG9nIGp1c3QgYSBiaXQgaGlnaGVyIHRoYW4gdGhlIG1pZGRsZQotCWlmICh0LTUwID4gMCkgdCA9IHQtNTA7Ci0KLQl3aW5kb3cubG9jYXRpb249ImphdmFzY3JpcHQ6Ly9uZWVkTW9kYWwiOwotCWFza1Nob3dBbGxEaWFsb2cgPSB3aW5kb3cub3BlbigiYXNrU2hvd0FsbC5qc3AiLCAiYXNrU2hvd0FsbERpYWxvZyIsICJyZXNpemVhYmxlPW5vLGhlaWdodD0iK2grIix3aWR0aD0iK3crIixsZWZ0PSIrbCsiLHRvcD0iK3QgKTsKLQlhc2tTaG93QWxsRGlhbG9nLmZvY3VzKCk7Ci19Ci0KLWZ1bmN0aW9uIHllc1Nob3dBbGwoKXsKLQl3aW5kb3cucGFyZW50LnBhcmVudC5zaG93QWxsKCk7Ci19Ci0KLWZ1bmN0aW9uIGNsb3NlQXNrU2hvd0FsbERpYWxvZygpewotCXRyeSB7Ci0JCWlmIChhc2tTaG93QWxsRGlhbG9nKXsKLQkJCWFza1Nob3dBbGxEaWFsb2cuY2xvc2UoKTsKLQkJfQotCX0KLQljYXRjaChlKSB7fQotfQotCi1mdW5jdGlvbiBvbnVubG9hZEhhbmRsZXIoKSB7Ci0JY2xvc2VBc2tTaG93QWxsRGlhbG9nKCk7Ci0KLQlkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICIiOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9wcm9jZXNzL2dsb3NzYXJ5L2luZGV4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYmJmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvRFREIEhUTUwgNC4wMS8vRU4iCi0gICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotPGh0bWwgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPG1ldGEgbmFtZT0ibWV0YV90YWdnZWQiIGNvbnRlbnQ9InRydWUiPgotPHRpdGxlPkdsb3NzYXJ5IC0gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGl0bGU+Ci08L2hlYWQ+Ci08ZnJhbWVzZXQgcm93cz0iMjUsKiI+Ci08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfbmF2IiBzcmM9Im5hdmlnLmh0bSIgc2Nyb2xsaW5nPSJubyIgbWFyZ2luaGVpZ2h0PSIyIiBtYXJnaW53aWR0aD0iMiIgdGl0bGU9Ik5hdmlnYXRpb24gQXJlYSI+Ci08ZnJhbWUgbmFtZT0iZ2xvc3NhcnlfZG9jIiBzcmM9Ii4uL2dsb3NzYXJ5Lmh0bSIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMiIgc2Nyb2xsaW5nPSJhdXRvIiB0aXRsZT0iQ29udGVudCBBcmVhIj4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3JvcC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3JvcC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjIwZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9yb3AuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTY4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkKLXsKLQliYWNrZ3JvdW5kLWltYWdlOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOwotIAlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAJZm9udC1zaXplOiAxMHB0Ci19Ci0KLWJvZHkubmF2YnV0dG9ucwotewotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4Ci19Ci0KLS5iZ3doaXRlCi17IAotCSBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmCi19IAotCi0uYnV0dG9ucwotewotICAgCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmUJCi19Ci0KLS5idXR0b25vbiAKLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBtaWRkbGUKLX0gCi0KLXRkLmJ1dHRvbnMKLXsKLQl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQKLX0KLQotLmljb25ib3JkZXIKLXsgCi0JIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGUKLX0KLQotYS5idXR0b25zOmxpbmsgCi17IAotCWNvbG9yOiAjMDAwMDAwCi19Ci0KLWEuYnV0dG9uczp2aXNpdGVkIAoteyAKLQljb2xvcjogIzAwMDAwMAotfQotCi1hLmJ1dHRvbnM6aG92ZXIgCi17IAotCWNvbG9yOiAjY2MwMDAwCi19Ci0KLWEuYnV0dG9uczphY3RpdmUKLXsgCi0JY29sb3I6ICNjYzAwMDAKLX0KLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAgCi1kaXYubWFyZ2luczIwIAoteyAJCi0JbWFyZ2luLWxlZnQ6IDdweDsKLQltYXJnaW4tdG9wOiAyMHB4OwotCW1hcmdpbi1yaWdodDogN3B4Ci19ICAgCi0KLQotaDEKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiBsYXJnZQotfQotICAgICAgICAKLWgxLmJhbm5lcgotewotICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JICAJZm9udC1zaXplOiBsYXJnZTsKLQkgIAl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi1oMgotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTUwJQkKLX0KLSAgICAgICAgCi1oMi5iYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDE1MCU7Ci0gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lCi19Ci0KLWgzCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZgotfQotCi1oNCwgaDUsIGg2Ci17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotICAKLSAgICAKLWE6bGluawotewotICAgIGNvbG9yOiAjMDAzMzk5Ci19Ci0KLWE6YWN0aXZlCi17Ci0gICAgY29sb3I6ICMwMDAwZmYKLX0KLQotYTp2aXNpdGVkCi17Ci0gICAgY29sb3I6ICM2NjAwNjYKLX0KLQotZGwKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kdAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWRkCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotcAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLXAubm9kZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICAKLX0KLQotcC5leGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAuZXhhbXBsZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCW1hcmdpbi1sZWZ0OiA3MHB4OwotfQotCi1wLnBpY3R1cmV0ZXh0Ci17Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotICAgICAgICBtYXJnaW4tbGVmdDogNzBweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4Ci19Ci0KLXAuZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLnRhYmxlaGVhZGluZwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLnRhYmxldGV4dAotewotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLnBhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLnBhcmFtZXhhbXBsZQotewotICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgIGNvbG9yOiByZWQKLX0KLQotcC5wYXJhbWRlc2NyaXB0aW9uCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLW9sCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sLmFscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi11bAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotfQotCi11bCBsaQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzIwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCBsaS5ub2RlCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkuY2sKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmNrCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5jawotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0gICAgCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bC5wbHVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5taW51cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwuY2sKLXsKLQotfQotCi10YWJsZQotewotLyoJYm9yZGVyOiAxOyovCi0vKgl3aWR0aDogODUlOyovCi0vKgljZWxsc3BhY2luZzogMDsqLwotLyoJY2VsbHBhZGRpbmc6IDQ7Ki8KLS8qCXN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LDEyOCwxMjgpIjsqLwotLyoJYm9yZGVyY29sb3I9IiM4MDgwODAiOyovCi0vKglib3JkZXJjb2xvcmxpZ2h0OiAjODA4MDgwOyovCi0vKglib3JkZXJjb2xvcmRhcms6ICM4MDgwODAqLwotfQotCi10Ym9keQotewotCXZhbGlnbjogYmFzZWxpbmU7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYKLX0KLQotdGgKLXsKLQlmb250LXNpemU6IHNtYWxsZXIKLX0KLQotdGQKLXsKLQl2ZXJ0aWNhbC1hbGlnbjogdG9wOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQKLX0KLQotdGQgdWwKLXsKLQltYXJnaW4tbGVmdDogKzIwcHg7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdAotfQotCi1mb250LnBhcmFtZXhhbXBsZQotewotICAgY29sb3I6IHJlZAotfQotCi1mb250LmltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS8qIHVzZWQgZm9yIG5vdC1pbmNsdWRlZCBwbHVnaW5zKi8KLWgxLm5vdGluY2x1ZGVkYmFubmVyCi17Ci0gICAgICAgIGJhY2tncm91bmQ6ICNGRkZGQ0M7Ci0gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSAgZm9udC1zaXplOiBsYXJnZTsKLX0KLQotCi0vKnRoZSBmb2xsb3dpbmcgaXMgdXNlZCBmb3IgaWJtIGNvbnRlbnQqLwotCi1oMS5pYm0KLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgxLmlibWJhbm5lcgotewotICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JICBmb250LXNpemU6IGxhcmdlOwotCSB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi0KLSAgICAKLQotaDIuaWJtCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLSAgICAgICAgCi1oMi5pYm1iYW5uZXIKLXsKLSAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTUwJTsgCi0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWgzLmlibQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LmlibSwgaDUuaWJtLCBoNi5pYm0KLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLWRsLmlibQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWR0LmlibQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWRkLmlibQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0gICAKLXAuaWJtCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAJIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotcC5pYm1ub2RlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci0gICAgICAgIGxlZnRNYXJnaW46IDE1cHgKLX0KLQotcC5pYm1leGFtcGxlaGVhZGluZwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci19Ci0KLXAuaWJtZXhhbXBsZQotewotCW1hcmdpbi1sZWZ0OiA3MHB4OwotfQotCi1wLmlibXBpY3R1cmV0ZXh0Ci17Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotICAgICAgICBtYXJnaW4tbGVmdDogNzBweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4Ci19Ci0KLXAuaWJtZGVmaW5pdGlvbgotewotCWJhY2tncm91bmQ6ICNmZmZmY2M7Ci0JYm9yZGVyOiB0aGluIGRvdWJsZSBibGFjawotfQotCi1wLmlibXRhYmxlaGVhZGluZwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLmlibXRhYmxldGV4dAotewotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLmlibXBhcmFtbmFtZQotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1wLmlibXBhcmFtZXhhbXBsZQotewotICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgIGNvbG9yOiByZWQKLX0KLQotcC5pYm1wYXJhbWRlc2NyaXB0aW9uCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLW9sLmlibQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzQ1cHgKLX0KLQotb2wgb2wuaWJtCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbCBvbCBvbC5pYm0KLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sLmlibWFscGhhCi17Ci0JbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYQotfQotCi0KLQotdWwgbGkuaWJtCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMjBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5pYm0KLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkuaWJtCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5pYm1ub2RlCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkuaWJtY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmlibWNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCB1bCBsaS5pYm1jawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsLmlibXBsdXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLmlibW1pbnVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi0KLXVsLmlibWNrCi17Ci0KLX0KLQotdGFibGUuaWJtCi17Ci19Ci0KLXRyLmlibQotewotfQotCi10ZC5pYm0KLXsKLSAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcAotfQotCi10ZCB1bC5pYm0KLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyMHB4Ci19Ci0KLWZvbnQuaWJtcGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQuaWJtaW1hZ2VleGFtcGxlCi17Ci0gICBmb250LXNpemU6IHNtYWxsZXIKLX0KLQotLyp0aGUgZm9sbG93aW5nIGlzIHVzZWQgZm9yIHJlYWwgdGltZSBjb250ZW50Ki8KLQotaDEucmVhY3RpdmUKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgxLnJlYWN0aXZlYmFubmVyCi17Ci0gICAgICAgIAotICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiBsYXJnZTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotaDIucmVhY3RpdmUKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTUwJTsKLX0KLSAgICAgICAgCi1oMi5yZWFjdGl2ZWJhbm5lcgotewotICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTUwJTsKLSAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWgzLnJlYWN0aXZlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDQucmVhY3RpdmUsIGg1LnJlYWN0aXZlLCBoNi5yZWFjdGl2ZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotZGwucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotCi1kdC5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0gICAgICAKLWRkLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotcC5yZWFjdGl2ZQotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotcC5yZWFjdGl2ZW5vZGUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLSAgICAgICAgbGVmdE1hcmdpbjogMTVweAotfQotCi1wLnJlYWN0aXZlZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLnJlYWN0aXZlZXhhbXBsZQotewotCW1hcmdpbi1sZWZ0OiA3MHB4OwotfQotCi1wLnJlYWN0aXZlcGljdHVyZXRleHQKLXsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci0JZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiA3MHB4OwotICAgICAgICBtYXJnaW4tcmlnaHQ6IDUwcHgKLX0KLQotcC5yZWFjdGl2ZWRlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC5yZWFjdGl2ZXRhYmxlaGVhZGluZwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLnJlYWN0aXZldGFibGV0ZXh0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAucmVhY3RpdmVwYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5yZWFjdGl2ZXBhcmFtZXhhbXBsZQotewotICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgIGNvbG9yOiByZWQKLX0KLQotcC5yZWFjdGl2ZXBhcmFtZGVzY3JpcHRpb24KLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotb2wucmVhY3RpdmUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICs0NXB4Ci19Ci0KLW9sIG9sLnJlYWN0aXZlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbCBvbCBvbC5yZWFjdGl2ZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wucmVhY3RpdmVhbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotCi0KLXVsIGxpLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsyMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLnJlYWN0aXZlCi17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkucmVhY3RpdmUKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkucmVhY3RpdmVub2RlCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkucmVhY3RpdmVjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkucmVhY3RpdmVjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkucmVhY3RpdmVjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsLnJlYWN0aXZlcGx1cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotdWwucmVhY3RpdmVtaW51cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotCi11bC5yZWFjdGl2ZWNrCi17Ci19Ci0KLXRhYmxlLnJlYWN0aXZlCi17Ci19Ci0KLXRyLnJlYWN0aXZlCi17Ci19Ci0KLXRkLnJlYWN0aXZlCi17Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKLX0KLQotdGQgdWwucmVhY3RpdmUKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyMHB4Ci19Ci0KLWZvbnQucmVhY3RpdmVwYXJhbWV4YW1wbGUKLXsKLSAgIGNvbG9yOiByZWQKLX0KLQotZm9udC5yZWFjdGl2ZWltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS8qdGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciBNaWNyb3NvZnQgY29udGVudCovCi0KLWgxLm1zZnQKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0gICAgICAgIAotaDEubXNmdGJhbm5lcgotewotICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JICAJIGZvbnQtc2l6ZTogbGFyZ2U7Ci0JICAJIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1oMi5tc2Z0Ci17Ci0gICAgICAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDE1MCU7CQotfQotICAgICAgICAKLWgyLm1zZnRiYW5uZXIKLXsKLSAgICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDE1MCU7Ci0JIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotCSAgCQotfQotCi1oMy5tc2Z0Ci17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDQubXNmdCwgaDUubXNmdCwgaDYubXNmdAotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotZGwubXNmdAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCSBmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWR0Lm1zZnQKLXsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQkgZm9udC1zaXplOiAxMHB0OwotfQotICAgICAgCi1kZC5tc2Z0Ci17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotcC5tc2Z0Ci17Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JIGZvbnQtc2l6ZTogMTBwdDsKLX0KLQotcC5tc2Z0bm9kZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotICAgICAgICBsZWZ0TWFyZ2luOiAxNXB4Ci19Ci0KLXAubXNmdGV4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5tc2Z0ZXhhbXBsZQotewotCW1hcmdpbi1sZWZ0OiA3MHB4OwotfQotCi1wLm1zZnRwaWN0dXJldGV4dAotewotCXRleHQtYWxpZ246IGNlbnRlcjsKLQlmb250LWZhbWlseTogc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDgwJTsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDcwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogNTBweAotfQotCi1wLm1zZnRkZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAubXNmdHRhYmxlaGVhZGluZwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLm1zZnR0YWJsZXRleHQKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5tc2Z0cGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAubXNmdHBhcmFtZXhhbXBsZQotewotICAgdGV4dC1hbGlnbjogbGVmdDsKLSAgIGNvbG9yOiByZWQKLX0KLQotcC5tc2Z0cGFyYW1kZXNjcmlwdGlvbgotewotICAgdGV4dC1hbGlnbjogbGVmdAotfQotCi1vbC5tc2Z0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbC5tc2Z0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbCBvbCBvbC5tc2Z0Ci17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjNweAotfQotCi1vbC5tc2Z0YWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLQotCi11bCBsaS5tc2Z0Ci17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMjBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5tc2Z0Ci17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCSAgdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLm1zZnQKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsIGxpLm1zZnRub2RlCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkubXNmdGNrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotCi11bCB1bCBsaS5tc2Z0Y2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLm1zZnRjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsLm1zZnRwbHVzCi17Ci0gICAgICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5tc2Z0bWludXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLQotdWwubXNmdGNrCi17Ci19Ci0KLXRhYmxlLm1zZnQKLXsKLX0KLQotdHIubXNmdAotewotfQotCi10ZC5tc2Z0Ci17Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3AKLX0KLQotdGQgdWwubXNmdAotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIwcHgKLX0KLQotZm9udC5tc2Z0cGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQubXNmdGltYWdlZXhhbXBsZQotewotICAgZm9udC1zaXplOiBzbWFsbGVyCi19Ci0KLS8qdGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciBkYXRhYmFzZSBjb250ZW50Ki8KLQotaDEuZGJtcwotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDEuZGJtc2Jhbm5lcgotewotICAgICAgICBiYWNrZ3JvdW5kOiAjNmE4ZmJkOwotICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQkgIGZvbnQtc2l6ZTogbGFyZ2U7Ci19Ci0KLWgyLmRibXMKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotICAgICAgICAKLWgyLmRibXNiYW5uZXIKLXsKLSAgICAgICAgYmFja2dyb3VuZDogIzZhOGZiZDsKLSAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWgzLmRibXMKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotfQotCi1oNC5kYm1zLCBoNS5kYm1zLCBoNi5kYm1zCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1kbC5kYm1zCi17Ci19Ci0KLWR0LmRibXMKLXsKLX0KLSAgICAgIAotZGQuZGJtcwotewotfQotCi1wLmRibXMKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDBweAotfQotCi1wLmRibXNub2RlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci0gICAgICAgIGxlZnRNYXJnaW46IDE1cHgKLX0KLQotcC5kYm1zZXhhbXBsZWhlYWRpbmcKLXsKLSAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgZm9udC1zaXplOiAxMHB0OwotICAgICAgICBtYXJnaW4tbGVmdDogMTVweAotfQotCi1wLmRibXNleGFtcGxlCi17Ci0JbWFyZ2luLWxlZnQ6IDcwcHg7Ci19Ci0KLXAuZGJtc3BpY3R1cmV0ZXh0Ci17Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotICAgICAgICBtYXJnaW4tbGVmdDogNzBweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4Ci19Ci0KLXAuZGJtc2RlZmluaXRpb24KLXsKLQliYWNrZ3JvdW5kOiAjZmZmZmNjOwotCWJvcmRlcjogdGhpbiBkb3VibGUgYmxhY2sKLX0KLQotcC5kYm1zdGFibGVoZWFkaW5nCi17Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwCi19Ci0KLXAuZGJtc3RhYmxldGV4dAotewotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLmRibXNwYXJhbW5hbWUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQKLX0KLQotcC5kYm1zcGFyYW1leGFtcGxlCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgY29sb3I6IHJlZAotfQotCi1wLmRibXNwYXJhbWRlc2NyaXB0aW9uCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLW9sLmRibXMKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICs0NXB4Ci19Ci0KLW9sIG9sLmRibXMKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sIG9sIG9sLmRibXMKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sLmRibXNhbHBoYQotewotCWxpc3Qtc3R5bGUtdHlwZTogbG93ZXItYWxwaGEKLX0KLQotCi0KLXVsIGxpLmRibXMKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsyMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmRibXMKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JICB0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkuZGJtcwotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQkgIHRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkuZGJtc25vZGUKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi11bCBsaS5kYm1zY2sKLXsKLSAgICAgICAgdGV4dC1pbmRlbnQ6ICsxMHB4Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIGxpLmRibXNjawotewotICAgICAgICB0ZXh0LWluZGVudDogKzEwcHgKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkuZGJtc2NrCi17Ci0gICAgICAgIHRleHQtaW5kZW50OiArMTBweAotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwuZGJtc3BsdXMKLXsKLSAgICAgICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLXVsLmRibXNtaW51cwotewotICAgICAgICBsaXN0LXN0eWxlLWltYWdlOiAKLX0KLQotCi11bC5kYm1zY2sKLXsKLX0KLQotdGFibGUuZGJtcwotewotfQotCi10ci5kYm1zCi17Ci19Ci0KLXRkLmRibXMKLXsKLSAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcAotfQotCi10ZCB1bC5kYm1zCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjBweAotfQotCi1mb250LmRibXNwYXJhbWV4YW1wbGUKLXsKLSAgIGNvbG9yOiByZWQKLX0KLQotZm9udC5kYm1zaW1hZ2VleGFtcGxlCi17Ci0gICBmb250LXNpemU6IHNtYWxsZXIKLX0KLQotLyp0aGUgZm9sbG93aW5nIGlzIHVzZWQgZm9yIGxhcmdlLXNjYWxlIGRldmVsb3BtZW50IGNvbnRlbnQqLwotCi1oMS5sYXJnZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDEubGFyZ2ViYW5uZXIKLXsKLSAgICAgICAgYmFja2dyb3VuZDogIzZhOGZiZDsKLSAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JICBmb250LXNpemU6IGxhcmdlOwotfQotCi1oMi5sYXJnZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0gICAgICAgIAotaDIubGFyZ2ViYW5uZXIKLXsKLSAgICAgICAgYmFja2dyb3VuZDogIzZhOGZiZDsKLSAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci19Ci0KLWgzLmxhcmdlCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLX0KLQotaDQubGFyZ2UsIGg1LmxhcmdlLCBoNi5sYXJnZQotewotICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHgKLX0KLQotZGwubGFyZ2UKLXsKLX0KLQotZHQubGFyZ2UKLXsKLX0KLSAgICAgIAotZGQubGFyZ2UKLXsKLX0KLQotcC5sYXJnZQotewotICAgICAgICBtYXJnaW4tbGVmdDogMHB4Ci19Ci0KLXAubGFyZ2Vub2RlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4Ci0gICAgICAgIGxlZnRNYXJnaW46IDE1cHgKLX0KLQotcC5sYXJnZWV4YW1wbGVoZWFkaW5nCi17Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLSAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHgKLX0KLQotcC5sYXJnZWV4YW1wbGUKLXsKLQltYXJnaW4tbGVmdDogNzBweDsKLX0KLQotcC5sYXJnZXBpY3R1cmV0ZXh0Ci17Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotCWZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogODAlOwotICAgICAgICBtYXJnaW4tbGVmdDogNzBweDsKLSAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4Ci19Ci0KLXAubGFyZ2VkZWZpbml0aW9uCi17Ci0JYmFja2dyb3VuZDogI2ZmZmZjYzsKLQlib3JkZXI6IHRoaW4gZG91YmxlIGJsYWNrCi19Ci0KLXAubGFyZ2V0YWJsZWhlYWRpbmcKLXsKLQlmb250LXdlaWdodDogYm9sZDsKLSAgICAgICAgbWFyZ2luLWxlZnQ6IDAKLX0KLQotcC5sYXJnZXRhYmxldGV4dAotewotICAgICAgICBtYXJnaW4tbGVmdDogMAotfQotCi1wLmxhcmdlcGFyYW1uYW1lCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXAubGFyZ2VwYXJhbWV4YW1wbGUKLXsKLSAgIHRleHQtYWxpZ246IGxlZnQ7Ci0gICBjb2xvcjogcmVkCi19Ci0KLXAubGFyZ2VwYXJhbWRlc2NyaXB0aW9uCi17Ci0gICB0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLW9sLmxhcmdlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArNDVweAotfQotCi1vbCBvbC5sYXJnZQotewotICAgICAgICBtYXJnaW4tbGVmdDogKzIzcHgKLX0KLQotb2wgb2wgb2wubGFyZ2UKLXsKLSAgICAgICAgbWFyZ2luLWxlZnQ6ICsyM3B4Ci19Ci0KLW9sLmxhcmdlYWxwaGEKLXsKLQlsaXN0LXN0eWxlLXR5cGU6IGxvd2VyLWFscGhhCi19Ci0KLQotCi11bCBsaS5sYXJnZQotewotICAgIHRleHQtaW5kZW50OiArMjBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkubGFyZ2UKLXsKLSAgICB0ZXh0LWluZGVudDogKzEwcHg7Ci0JdGV4dC1hbGlnbjoganVzdGlmeQotfQotCi0KLXVsIHVsIHVsIGxpLmxhcmdlCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkubGFyZ2Vub2RlCi17Ci0gICAgdGV4dC1pbmRlbnQ6ICsxMHB4OwotCXRleHQtYWxpZ246IGp1c3RpZnkKLX0KLQotdWwgbGkubGFyZ2VjawotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgbGkubGFyZ2VjawotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLQotdWwgdWwgdWwgbGkubGFyZ2VjawotewotICAgIHRleHQtaW5kZW50OiArMTBweDsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5Ci19Ci0KLXVsLmxhcmdlcGx1cwotewotICAgIGxpc3Qtc3R5bGUtaW1hZ2U6IAotfQotCi11bC5sYXJnZW1pbnVzCi17Ci0gICAgbGlzdC1zdHlsZS1pbWFnZTogCi19Ci0KLQotdWwubGFyZ2VjawotewotfQotCi10YWJsZS5sYXJnZQotewotfQotCi10ci5sYXJnZQotewotfQotCi10ZC5sYXJnZQotewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wCi19Ci0KLXRkIHVsLmxhcmdlCi17Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiArMjBweAotfQotCi1mb250LmxhcmdlcGFyYW1leGFtcGxlCi17Ci0gICBjb2xvcjogcmVkCi19Ci0KLWZvbnQubGFyZ2VpbWFnZWV4YW1wbGUKLXsKLSAgIGZvbnQtc2l6ZTogc21hbGxlcgotfQotCi1ycHcKLXsKLSAgY29sb3I6ICMwMDAwNjYKLX0KLQotcnB3LnByb2Nlc3NfY29tcG9uZW50Ci17Ci0gIGNvbG9yOiBncmVlbgotfQotCi1ycHcucHJvY2Vzc19jb21wb25lbnQucmVtb3ZlX3RleHQKLXsKLSAgY29sb3I6IGdyZWVuOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaAotfQotLyp3YXMgY29sb3I6ICNGRkNDOTkqLyAKLQotcnB3LnJlbW92ZV90ZXh0Ci17Ci0gIGNvbG9yOiBncmVlbjsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLSAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2gKLX0KLQotcnB3LnBsdWdpbl9wcm9jZXNzX2NvbXBvbmVudAotewotICBjb2xvcjogcmVkCi19Ci0KLXJwdy5wbHVnaW5fcmVtb3ZlX3RleHQKLXsKLSAgY29sb3I6IHJlZDsKLSAgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLSAgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2gKLX0KLQotcnB3LnJwd19jb21tZW50Ci17Ci0gIGNvbG9yOiBncmF5OwotICBmb250LXN0eWxlOiBvYmxpcXVlCi19Ci0KLQotcnB3Lm1zZnQKLXsKLSAgY29sb3I6IGJsdWUKLX0KLQotcnB3LmlibQotewotICBjb2xvcjogYmx1ZQotfQotCi1ycHcucmVhY3RpdmUKLXsKLSAgY29sb3I6IHJlZAotfQotCi1ycHcuYnVzbW9kCi17Ci0gIGNvbG9yOiByZWQKLX0KLQotcnB3LnJ1cF9ydF9kZXNpZ24KLXsKLSAgY29sb3I6IGdyZWVuCi19Ci0KLXJwdy5ydXBfZGJfZGVzaWduCi17Ci0gIGNvbG9yOiBncmVlbgotfQotCi1ycHcucnVwX2d1aV9kZXNpZ24KLXsKLSAgY29sb3I6IGdyZWVuCi19Ci0KLS5ob3R0ZXh0Ci17CQotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsKLX0KLWEuaG90dGV4dDpsaW5rIAoteyAKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsgCi19Ci0KLWEuaG90dGV4dDp2aXNpdGVkIAoteyAKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246bm9uZTsgCi19Ci0KLWEuaG90dGV4dDpob3ZlciAKLXsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOm5vbmU7IAotfQotCi1hLmhvdHRleHQ6YWN0aXZlCi17IAotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjpub25lOyAKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9jb21tb24uanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvY29tbW9uLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNhY2I1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9jb21tb24uanMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZhciBnbG9iYWxMYXllciA9ICIiOwotCi0vL2ZvciBwb3B1cCBzdWJtZW51IHdpdGggcmVkIGFycm93cwotdmFyIGNoZWNrZWQgPSBmYWxzZTsKLQotLyogQnJvd3NlciBzZW5zaW5nICovCi0vKiBTZXQgdXAgYm9vbGlhbiB2YXJpYWJsZXMgdG8gcmVjb3JkIHRoZSBicm93c2VyIHR5cGUgKi8KLXZhciBpc05TNCA9IDA7Ci12YXIgaXNJRTQgPSAwOwotdmFyIGlzTmV3ID0gMDsKLXZhciBkb2NPYmosIHN0eWxlT2JqLCBjdXJyT2JqLCBsYXlPbiwgbGF5T2ZmLCBkb207Ci0vKiBEZXRlcm1pbmVzIHRoZSBicm93c2VyIG5hbWUgYW5kIGJyb3dzZXIgdmVyc2lvbiAqLwotdmFyIGJyb3cgPSAoKG5hdmlnYXRvci5hcHBOYW1lKSArIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikpKTsKLS8qIHJlYXNzaWduIHZhcmlhYmxlIGRlcGVuZGluZyBvbiB0aGUgYnJvd3NlciAqLwotCi0KLQotLy9jYXB0dXJlIGV2ZW50Ci1OUzQgPSAoZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyk7Ci1pZiAoTlM0KSB7IGRvY3VtZW50LmNhcHR1cmVFdmVudHMoRXZlbnQuTU9VU0VET1dOKTsgfQotZG9jdW1lbnQub25tb3VzZWRvd24gPSBkb0FjY2Vzc0tleXM7CQotCi0KLQotaWYgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uID49IDUpKSB7aXNOZXcgPSAxfQotCWVsc2UgaWYgKGJyb3cgPT0gIk5ldHNjYXBlNCIpIAotCXtpc05TNCA9IDE7fQotCQllbHNlIGlmIChicm93ID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXI0IikgCi0JCXtpc0lFNCA9IDE7fQotCQkJCQotaWYgKGlzTlM0fHxpc0lFNHx8aXNOZXcpIHsKLQlkb2NPYmogPSAoaXNOUzQpID8gJ2RvY3VtZW50JyA6ICdkb2N1bWVudC5hbGwnOwotCXN0eWxlT2JqID0gKGlzTlM0KSA/ICcnIDogJy5zdHlsZSc7Ci0JfQotCi0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vU05JRkZFUiBCRUdJTlMgSEVSRS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdmFyIGM9Jy5jc3MiIC8+JzsKLXZhciBsPSc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuL3N0eWxlc2hlZXRzLyc7Ci0KLS8vU25pZmZlciB2YXJpYWJsZXMgYmVnaW5zCi0vL2NvbnZlcnRpbmcgdG8gbG93ZXJjYXNlCi12YXIgc25uID0gbmF2aWdhdG9yOwotdmFyIHNucGwgPSBzbm4ucGxhdGZvcm0udG9Mb3dlckNhc2UoKTsgLy8gbm90IHN1cHBvcnRlZCBpbiBOUzMuMAotdmFyIHNudWEgPSAnICcgKyBzbm4udXNlckFnZW50LnRvTG93ZXJDYXNlKCk7Ci12YXIgc251biA9IHNubi5hcHBOYW1lLnRvTG93ZXJDYXNlKCk7Ci0KLS8vIHBsYXRmb3JtCi12YXIgc252cGxfbWFjID0gc251YS5pbmRleE9mKCdtYWMnKSA+IDA7Ci12YXIgc252cGxfdW5peCA9IHNudWEuaW5kZXhPZigieDExIikgPiAwOwotdmFyIHNudnBsX3dpbiA9IHNudWEuaW5kZXhPZignd2luJykgPiAwOwotCi0vLyBicm93c2VyIHZlcnNpb24KLXZhciBzbnZ2X2llID0gc251YS5pbmRleE9mKCdtc2llJykgPiAwOwotdmFyIHNudnZfbm4gPSBzbnVhLmluZGV4T2YoJ21vemlsbGEnKSA+IDA7Ci12YXIgc252dmVyc2lvbiA9IHNubi5hcHBWZXJzaW9uOwotCi0KLS8vICdjb21wYXRpYmxlJyB2ZXJzaW9ucyBvZiAibW96aWxsYSIgYXJlbid0IG5hdmlnYXRvcgotaWYoc251YS5pbmRleE9mKCdjb21wYXRpYmxlJykgPiAwKSB7Ci0Jc25udnZfbm4gPSBmYWxzZTsKLX0KLS8vRW5kcyBzbmlmZmVyIHZhcmlhYmxlcyAKLQkKLQkJCi0vKiBUaGlzIGlzIGEgYmFzaWMgc25pZmZlciAqLwotICAKLWlmKHNudnBsX3dpbikvL3dpbmRvd3MKLQoteyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZScrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZScrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDYnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLQkgIH0KLSAgfQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICAKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzUiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotCSAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0gIH0KLX0KLWVsc2UgaWYoc252cGxfdW5peCkvL3VuaXgKLSAgeyAgCi0gIGlmKHNudnZfaWUpICAgIAotICB7Ci0gICAgaWYgKHNudWEuaW5kZXhPZignaWUgNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZVVOWCcrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZVVOWCcrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDYnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdlVOWCcrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0KLQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYmFzZVVOWCcrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNSIpIT0tMSlkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZVTlgnK2MpOwotICBlbHNlCi0JICB7Ci0JICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2VU5YJytjKTsKLQkgIH0KLSAgfSAKLSAgZWxzZQotICB7Ci0gIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZVTlgnK2MpOwotICB9Ci19Ci0KLWVsc2UgaWYoc252cGxfbWFjKS8vbWFjCi0gIHsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA1LjUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2Jhc2UnK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICAgIGVsc2UKLQkgIHsKLQkgICBkb2N1bWVudC53cml0ZShsKydjb21tb25fYWR2JytjKTsKLQkgIH0KLSAgfQotCi0gIGVsc2UgaWYgKHNudnZfbm4pIAotICB7Ci0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9iYXNlJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi82IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHZNYWMnK2MpOwotICBlbHNlCi0JICB7Ci0JICAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0JICB9Ci0gIH0gCi0gIGVsc2UKLSAgewotIGRvY3VtZW50LndyaXRlKGwrJ2NvbW1vbl9hZHYnK2MpOwotICB9Ci19Ci0KLWVsc2UvL290aGVycyAKLXsKLSAgZG9jdW1lbnQud3JpdGUobCsnY29tbW9uX2FkdicrYyk7Ci0KLX0KLQotLy9TTklGRkVSIEVORFMgSEVSRQotCi0KLWZ1bmN0aW9uIG5zX3JlbG9hZChpbml0KSB7ICAvL3JlbG9hZHMgdGhlIHdpbmRvdyBpZiBOYXY0IHJlc2l6ZWQKLSAgaWYgKGluaXQ9PXRydWUpIHdpdGggKG5hdmlnYXRvcikge2lmICgoYXBwTmFtZT09Ik5ldHNjYXBlIikmJihwYXJzZUludChhcHBWZXJzaW9uKT09NCkpIHsKLSAgICBkb2N1bWVudC5OU1c9aW5uZXJXaWR0aDsgZG9jdW1lbnQuTlNIPWlubmVySGVpZ2h0OyBvbnJlc2l6ZT1uc19yZWxvYWQ7IH19Ci0gIGVsc2UgaWYgKGlubmVyV2lkdGghPWRvY3VtZW50Lk5TVyB8fCBpbm5lckhlaWdodCE9ZG9jdW1lbnQuTlNIKSBsb2NhdGlvbi5yZWxvYWQoKTsKLX0KLW5zX3JlbG9hZCh0cnVlKTsKLQotCi0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1NOSUZGRVIgRU5EUyBIRVJFLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQotLy9sb29wIHRvIGNoYW5nZSBiYWNrZ3JvdW5kIGNvbG9yIGZvciBpZQotZnVuY3Rpb24gYmNvbG9yKGJjb2wsZF9uYW1lKQotewotaWYgKGRvY3VtZW50LmFsbCkKLXsKLSB2YXIgdGhlc3R5bGU9IGV2YWwgKCdkb2N1bWVudC5hbGwuJytkX25hbWUrJy5zdHlsZScpOwotIHRoZXN0eWxlLmJhY2tncm91bmRDb2xvcj1iY29sOwotIH0KLX0KLQotLy8gbmV3IHBhZ2UgdG8gbG9hZCBpbiBmcmFtZQotZnVuY3Rpb24gY2hhbmdlZnJhbWUodXJsKSB7Ci10b3AuY2hlY2tpbmJvdHRvbS5sb2NhdGlvbi5ocmVmPSB1cmwgCi19Ci0KLS8vIGNoZWNrZWQgYWxsIGNoZWNrYm94ZXMKLWZ1bmN0aW9uIGNoZWNrQWxsKGZpZWxkKSB7Ci0gICAgIGlmICghY2hlY2tlZCkgeyAvLyBpZiBjaGVja2JveGVzIGFyZSBub3QgY2hlY2tlZCB0aGVuIGNoZWNrIHRoZW0KLSAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGQubGVuZ3RoOyBpKyspIHsgLy8gbG9vcCB0aHJvdWdoIHRoZSBhcnJheSBvZiBjaGVja2JveGVzICYgY2hlY2sgdGhlbQotICAgICAgICAgICAgICAgZmllbGRbaV0uY2hlY2tlZCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwotICAgICB9Ci19IAotCi1mdW5jdGlvbiBjaGVja2VkSW4oaWQpIHsKLSAgaWYgKGRvY3VtZW50LmFsbCkgewotICAgIHJldHVybiBkb2N1bWVudC5hbGxbaWRdLnN0eWxlOwotICB9IGVsc2UgaWYoZG9jdW1lbnQubGF5ZXJzKSB7Ci0gICAgcmV0dXJuIGRvY3VtZW50LmxheWVyc1tpZF07Ci0gIH0KLX0KLQotLy8gRm9yIElFIE9ubHk6IHRvIGVuYWJsZSBsaW5raW5nIGJlZm9yZSBwb3AtdXBzIGRpc3NhcHBlYXIgd2hlbiBjbGlja2VkLgotZnVuY3Rpb24gZGlzYWJsZWNhcHR1cmUoKSB7Ci1kb2N1bWVudC5vbm1vdXNlZG93biA9IG51bGw7Ci19Ci0KLQotLy8gaGlkZSBsYXllcnMgd2hlbiBjbGlja2VkCi1mdW5jdGlvbiBkb0FjY2Vzc0tleXMoZXYpIHsKLQlpZihnbG9iYWxMYXllciAhPSAiIikgewotCQlpZihkb2N1bWVudC5sYXllcnMpIHsgZG9jdW1lbnQubGF5ZXJzW2dsb2JhbExheWVyXS52aXNpYmlsaXR5ID0gImhpZGRlbiI7IH0JCi0JCWVsc2UgeyBkb2N1bWVudC5hbGxbZ2xvYmFsTGF5ZXJdLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsgfQotCX0KLX0KLQotCi0KLS8vYWxsb3dzIHR3byBib3R0b20gZnJhbWVzIHRvIGxpbmsgdG8gbmV3IHBhZ2VzIGF0IHRoZSBzYW1lIHRpbWUKLWZ1bmN0aW9uIGZyYW1lZGlyZWN0KCkgewotcGFnZSA9IGRvY3VtZW50LmZvcm1Ub3BmcmFtZS5uZXdMb2NhdGlvbi5vcHRpb25zW2RvY3VtZW50LmZvcm1Ub3BmcmFtZS5uZXdMb2NhdGlvbi5zZWxlY3RlZEluZGV4XS52YWx1ZTsKLXRlbXBJbmRleCA9IHBhZ2UuaW5kZXhPZignPycpOwotZmlyc3RVUkwgPSBwYWdlLnN1YnN0cmluZygwLHRlbXBJbmRleCk7Ci1zZWNvbmRVUkwgPSBwYWdlLnN1YnN0cmluZyh0ZW1wSW5kZXggKyAxLHBhZ2UubGVuZ3RoKTsKLQotdG9wLnRyZWVGcmFtZS5sb2NhdGlvbi5ocmVmID0gZmlyc3RVUkw7Ci10b3Audmlld0ZyYW1lLmxvY2F0aW9uLmhyZWYgPSBzZWNvbmRVUkw7Ci19Ci0KLQotZnVuY3Rpb24gTU1fcmVsb2FkUGFnZShpbml0KSB7ICAvL3JlbG9hZHMgdGhlIHdpbmRvdyBpZiBOYXY0IHJlc2l6ZWQKLSAgaWYgKGluaXQ9PXRydWUpIHdpdGggKG5hdmlnYXRvcikge2lmICgoYXBwTmFtZT09Ik5ldHNjYXBlIikmJihwYXJzZUludChhcHBWZXJzaW9uKT09NCkpIHsKLSAgICBkb2N1bWVudC5NTV9wZ1c9aW5uZXJXaWR0aDsgZG9jdW1lbnQuTU1fcGdIPWlubmVySGVpZ2h0OyBvbnJlc2l6ZT1NTV9yZWxvYWRQYWdlOyB9fQotICBlbHNlIGlmIChpbm5lcldpZHRoIT1kb2N1bWVudC5NTV9wZ1cgfHwgaW5uZXJIZWlnaHQhPWRvY3VtZW50Lk1NX3BnSCkgbG9jYXRpb24ucmVsb2FkKCk7Ci19Ci1NTV9yZWxvYWRQYWdlKHRydWUpOwotCi0KLWZ1bmN0aW9uIE1NX2ZpbmRPYmoobiwgZCkgeyAvL3Y0LjAxCi0gIHZhciBwLGkseDsgIGlmKCFkKSBkPWRvY3VtZW50OyBpZigocD1uLmluZGV4T2YoIj8iKSk+MCYmcGFyZW50LmZyYW1lcy5sZW5ndGgpIHsKLSAgICBkPXBhcmVudC5mcmFtZXNbbi5zdWJzdHJpbmcocCsxKV0uZG9jdW1lbnQ7IG49bi5zdWJzdHJpbmcoMCxwKTt9Ci0gIGlmKCEoeD1kW25dKSYmZC5hbGwpIHg9ZC5hbGxbbl07IGZvciAoaT0wOyF4JiZpPGQuZm9ybXMubGVuZ3RoO2krKykgeD1kLmZvcm1zW2ldW25dOwotICBmb3IoaT0wOyF4JiZkLmxheWVycyYmaTxkLmxheWVycy5sZW5ndGg7aSsrKSB4PU1NX2ZpbmRPYmoobixkLmxheWVyc1tpXS5kb2N1bWVudCk7Ci0gIGlmKCF4ICYmIGQuZ2V0RWxlbWVudEJ5SWQpIHg9ZC5nZXRFbGVtZW50QnlJZChuKTsgcmV0dXJuIHg7Ci19Ci0KLWZ1bmN0aW9uIE1NX2dvVG9VUkwoKSB7IC8vdjMuMAotICB2YXIgaSwgYXJncz1NTV9nb1RvVVJMLmFyZ3VtZW50czsgZG9jdW1lbnQuTU1fcmV0dXJuVmFsdWUgPSBmYWxzZTsKLSAgZm9yIChpPTA7IGk8KGFyZ3MubGVuZ3RoLTEpOyBpKz0yKSBldmFsKGFyZ3NbaV0rIi5sb2NhdGlvbj0nIithcmdzW2krMV0rIiciKTsKLX0KLQotCi1mdW5jdGlvbiBNTV9wcmVsb2FkSW1hZ2VzKCkgeyAvL3YzLjAKLSAgdmFyIGQ9ZG9jdW1lbnQ7IGlmKGQuaW1hZ2VzKXsgaWYoIWQuTU1fcCkgZC5NTV9wPW5ldyBBcnJheSgpOwotICAgIHZhciBpLGo9ZC5NTV9wLmxlbmd0aCxhPU1NX3ByZWxvYWRJbWFnZXMuYXJndW1lbnRzOyBmb3IoaT0wOyBpPGEubGVuZ3RoOyBpKyspCi0gICAgaWYgKGFbaV0uaW5kZXhPZigiIyIpIT0wKXsgZC5NTV9wW2pdPW5ldyBJbWFnZTsgZC5NTV9wW2orK10uc3JjPWFbaV07fX0KLX0KLQotCi1mdW5jdGlvbiBNTV9zd2FwSW1hZ2UoKSB7IC8vdjMuMAotICB2YXIgaSxqPTAseCxhPU1NX3N3YXBJbWFnZS5hcmd1bWVudHM7IGRvY3VtZW50Lk1NX3NyPW5ldyBBcnJheTsgZm9yKGk9MDtpPChhLmxlbmd0aC0yKTtpKz0zKQotICAgaWYgKCh4PU1NX2ZpbmRPYmooYVtpXSkpIT1udWxsKXtkb2N1bWVudC5NTV9zcltqKytdPXg7IGlmKCF4Lm9TcmMpIHgub1NyYz14LnNyYzsgeC5zcmM9YVtpKzJdO30KLX0KLQotCi1mdW5jdGlvbiBNTV9vcGVuQnJXaW5kb3codGhlVVJMLHdpbk5hbWUsZmVhdHVyZXMpIHsgLy92Mi4wCi0gIHdpbmRvdy5vcGVuKHRoZVVSTCx3aW5OYW1lLGZlYXR1cmVzKTsKLX0KLQotCi0KLWZ1bmN0aW9uIE1NX3Nob3dIaWRlTGF5ZXJzKCkgeyAvL3YzLjAKLSAgdmFyIGkscCx2LG9iaixhcmdzPU1NX3Nob3dIaWRlTGF5ZXJzLmFyZ3VtZW50czsKLSAgZm9yIChpPTA7IGk8KGFyZ3MubGVuZ3RoLTIpOyBpKz0zKSBpZiAoKG9iaj1NTV9maW5kT2JqKGFyZ3NbaV0pKSE9bnVsbCkgeyB2PWFyZ3NbaSsyXTsKLSAgICBpZiAob2JqLnN0eWxlKSB7IG9iaj1vYmouc3R5bGU7IHY9KHY9PSdzaG93Jyk/J3Zpc2libGUnOih2PSdoaWRlJyk/J2hpZGRlbic6djsgfQotICAgIG9iai52aXNpYmlsaXR5PXY7IH0KLX0KLQotCi1mdW5jdGlvbiBtc2NoYW5nZWZyYW1lKHVybCkgewotdG9wLmNvbnRlbnRGcmFtZS5sb2NhdGlvbi5ocmVmPSB1cmwgCi19Ci0KLS8vY2hhbmdlcyBtaWRkbGUgbmF2IGFuZCBjb250ZW50IGZyYW1lLCBjdXJyZW50bHkgdXNlZCBpbiBtdWx0aXNpdGUKLWZ1bmN0aW9uIE1TZnJhbWVDaGFuZ2UoKSB7Ci1wYWdlID0gZG9jdW1lbnQuZm9ybUJhbm5lckZyYW1lLm5ld0xvY2F0aW9uLm9wdGlvbnNbZG9jdW1lbnQuZm9ybUJhbm5lckZyYW1lLm5ld0xvY2F0aW9uLnNlbGVjdGVkSW5kZXhdLnZhbHVlOwotdGVtcEluZGV4ID0gcGFnZS5pbmRleE9mKCc/Jyk7Ci1maXJzdFVSTCA9IHBhZ2Uuc3Vic3RyaW5nKDAsdGVtcEluZGV4KTsKLXNlY29uZFVSTCA9IHBhZ2Uuc3Vic3RyaW5nKHRlbXBJbmRleCArIDEscGFnZS5sZW5ndGgpOwotCi10b3AubWlkZGxlTmF2LmxvY2F0aW9uLmhyZWYgPSBmaXJzdFVSTDsKLXRvcC5jb250ZW50RnJhbWUubG9jYXRpb24uaHJlZiA9IHNlY29uZFVSTDsKLX0KLQotCi0KLS8vb3BlbnMgdXAgYSBkeW5hbWljIHdpbmRvdwotZnVuY3Rpb24gb3Blbl9oZWxwKGhlbHBmaWxlKSB7Ci0gICAgdmFyIHdpbmxlZnQsIHdpbnRvcDsKLSAgICB2YXIgaGVscGxlZnQsIGhlbHB0b3A7Ci0gICAgdmFyIGhlbHB3aWR0aCwgaGVscGhlaWdodDsKLSAgICBpZiAoZG9jdW1lbnQubGF5ZXJzKSB7Ci0gICAgICAgIHdpbmxlZnQgPSB0b3Auc2NyZWVuWDsKLSAgICAgICAgd2ludG9wID0gdG9wLnNjcmVlblk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB3aW5sZWZ0ID0gdG9wLnNjcmVlbkxlZnQ7Ci0gICAgICAgIHdpbnRvcCA9IHRvcC5zY3JlZW5Ub3A7Ci0gICAgfQotICAgIGhlbHB3aWR0aCA9IE1hdGgubWluKHNjcmVlbi5hdmFpbFdpZHRoKTsKLSAgICBoZWxwaGVpZ2h0ID0gTWF0aC5taW4oc2NyZWVuLmF2YWlsSGVpZ2h0KTsKLSAJaGVscHdpZHRoPWhlbHB3aWR0aCAqLjY7Ci0JaGVscGhlaWdodD1oZWxwaGVpZ2h0ICouODU7CQotCWhlbHB0b3AgPSAwOwotICAgIGlmICh3aW5sZWZ0ID4gMjApCi0gICAgICAgIGhlbHBsZWZ0ID0gMDsKLSAgICBlbHNlCi0gICAgICAgIGhlbHBsZWZ0ID0gc2NyZWVuLndpZHRoIC0gaGVscHdpZHRoIC0gMTA7Ci0gICAgdG9wLm9wZW4oaGVscGZpbGUsICdjY3dlYl9oZWxwJywKLSAgICAgICAgICAgICAnbGVmdD0nK2hlbHBsZWZ0KycsdG9wPScraGVscHRvcCsnLHdpZHRoPScraGVscHdpZHRoKycsaGVpZ2h0PScraGVscGhlaWdodCsnLHJlc2l6YWJsZT0xLHNjcm9sbGJhcnM9MScpOwotfQotCi0KLQotLy8gcmVndWxhciBwb3B1cCB1cCBsYXllciBhY2NvcmRpbmcgdG8gZXZlbnQKLWZ1bmN0aW9uIHBvcExlZnRNZW51KGV2dCxjdXJyRWxlbSx1cENoayl7Ci0JLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGlzIGlzIGEgREhUTUwgYnJvd3NlciAKLQkvLyBhbmQgdGhhdCBjdXJyRWxlbSBpcyBub3Qgc2V0IHRvIDAgaW4gd2hpY2ggY2FzZSAKLQkvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIEhSRUYgYW5kIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGV2ZW50Ci0JLy91cENoayBzaG91bGQgYmUgc2V0IHRvIDEgZm9yIE5TIDQgZm9ybSBmaXggaWYgeW91IHdhbnQgdGhlIHBvcGRvd24gdG8gcG9wIHVwIGluc3RlYWQsIHNvIHRoYXQgaXQgZG9lc24ndCBhcHBlYXIgb3ZlciBmb3Jtcy4JCi0JZ2xvYmFsTGF5ZXIgPSBjdXJyRWxlbTsKLQkKLQlpZiAoKGlzTlM0ICYmIGN1cnJFbGVtICE9IDApIHx8IChpc0lFNCAmJiBjdXJyRWxlbSAhPSAwKSl7Ci0JCWRvbSA9IGV2YWwoZG9jT2JqICsgICcuJyArIGN1cnJFbGVtICsgc3R5bGVPYmopOwotCQlzdGF0ZSA9IGRvbS52aXNpYmlsaXR5OwotCQlpZiAoc3RhdGUgPT0gInZpc2libGUiIHx8IHN0YXRlID09ICJzaG93IikKLQkJCXtkb20udmlzaWJpbGl0eSA9ICJoaWRkZW4iO30KLQkJCWVsc2UgCi0JCQkvLyBmaW5kcyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIAotCQkJLy8gYW5kIHRoZW4gb2Zmc2V0cyB0aGUgY29vcmRpbmF0ZXMgc2xpZ2h0bHkKLQkJCQl7Ci0JCWlmIChpc05TNCl7Ci0JCQkJIGlmICgodXBDaGsgPT0gMSkgJiYgKHdpbmRvdy5pbm5lcldpZHRoIDwgNjcwKSkgewotCQkJdG9wVmFsID0gZXZhbChldnQucGFnZVkgLSA1MCk7Ci0JCQlsZWZ0VmFsID0gZXZhbChldnQucGFnZVggLSA5KTsKLQkJCX0JCQkJICAKLQkJCQllbHNlIHsKLQkJCQl0b3BWYWwgPSBldmFsKGV2dC5wYWdlWSAtIDApOwotCQkJCWxlZnRWYWwgPSBldmFsKGV2dC5wYWdlWCAtIDApOwotCQkJCX0KLQkJfQkJCi0JCQllbHNlIGlmIChpc0lFNCkgewotCQkJCXsKLQkJCQl0b3BWYWwgPSBldmFsKGV2ZW50LnkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldmVudC54K2RvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCAtIDApOwotCQkJCS8vYm90dG9tVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsQm90dG9tICsgMik7Ci0JCQkJfQotCQkJICAgIH0KLQkJCS8vIGtlZXBzIHRoZSBlbGVtZW50IGZyb20gZ29pbmcgb2ZmIHNjcmVlbiB0byB0aGUgbGVmdAotCQkJaWYobGVmdFZhbCA8IDIpIHtsZWZ0VmFsID0gMjt9Ci0JCQlpZih0b3BWYWwgPCAyKSB7dG9wVmFsID0gLTU7fQkJCQkKLQkJCWRvbS50b3AgPSB0b3BWYWw7Ci0JCQlkb20ubGVmdCA9IGxlZnRWYWw7Ci0JCQlkb20udmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsJCQkJCQotCQkJCX0KLQl9IAotCi19Ci0KLQotCi0vLyBzcGVjaWFsIHB1cHVwIGxheWVyIHRvIGtlZXAgaXQgZnJvbSBnb2luZyBvZmYgdGhlIHBhZ2UKLQotZnVuY3Rpb24gcG9wTGVmdE1lbnVTcGVjaWFsKGV2dCxjdXJyRWxlbSl7Ci0JLy8gY2hlY2tzIHRvIHNlZSBpZiB0aGlzIGlzIGEgREhUTUwgYnJvd3NlciAKLQkvLyBhbmQgdGhhdCBjdXJyRWxlbSBpcyBub3Qgc2V0IHRvIDAgaW4gd2hpY2ggY2FzZSAKLQkvLyB0aGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIEhSRUYgYW5kIGNhbm5vdCBiZSB0cmVhdGVkIGFzIGFuIGV2ZW50Ci0JLy91cENoayBzaG91bGQgYmUgc2V0IHRvIDEgZm9yIE5TIDQgZm9ybSBmaXggaWYgeW91IHdhbnQgdGhlIHBvcGRvd24gdG8gcG9wIHVwIGluc3RlYWQsIHNvIHRoYXQgaXQgZG9lc24ndCBhcHBlYXIgb3ZlciBmb3Jtcy4JCi0JZ2xvYmFsTGF5ZXIgPSBjdXJyRWxlbTsKLQkKLQlpZiAoKGlzTlM0ICYmIGN1cnJFbGVtICE9IDApIHx8IChpc0lFNCAmJiBjdXJyRWxlbSAhPSAwKSl7Ci0JCWRvbSA9IGV2YWwoZG9jT2JqICsgICcuJyArIGN1cnJFbGVtICsgc3R5bGVPYmopOwotCQlzdGF0ZSA9IGRvbS52aXNpYmlsaXR5OwotCQlpZiAoc3RhdGUgPT0gInZpc2libGUiIHx8IHN0YXRlID09ICJzaG93IikKLQkJCXtkb20udmlzaWJpbGl0eSA9ICJoaWRkZW4iO30KLQkJCWVsc2UgCi0JCQkvLyBmaW5kcyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vdXNlIAotCQkJLy8gYW5kIHRoZW4gb2Zmc2V0cyB0aGUgY29vcmRpbmF0ZXMgc2xpZ2h0bHkKLQkJCQl7Ci0JCWlmIChpc05TNCl7Ci0JCQkgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDwgNjAwKSB7Ci0JCQl0b3BWYWwgPSBldmFsKGV2dC5wYWdlWSAtIDApOwotCQkJbGVmdFZhbCA9IGV2YWwoZXZ0LnBhZ2VYIC0gMTEwKTsKLQkJCX0JCQotCQkJCQotCQkJCWVsc2UgewotCQkJCXRvcFZhbCA9IGV2YWwoZXZ0LnBhZ2VZIC0gMCk7Ci0JCQkJbGVmdFZhbCA9IGV2YWwoZXZ0LnBhZ2VYIC0gMCk7Ci0JCQkJfQotCQl9CQkKLQkJCWVsc2UgaWYgKGlzSUU0KSB7Ci0JCQkJaWYgKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCA2MDApIHsKLQkJCQkgIHRvcFZhbCA9IGV2YWwoZXZlbnQueStkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCAtIDApOwotCQkJCWxlZnRWYWwgPSBldmFsKGV2ZW50LngrZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IC0gMTEwKTsKLQkJCQl9Ci0JCQkJCi0JCQkJZWxzZXsKLQkJCQl0b3BWYWwgPSBldmFsKGV2ZW50LnkrZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgLSAwKTsKLQkJCQlsZWZ0VmFsID0gZXZhbChldmVudC54K2RvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCAtIDApOwotCQkJCS8vYm90dG9tVmFsID0gZXZhbChldmVudC55K2RvY3VtZW50LmJvZHkuc2Nyb2xsQm90dG9tICsgMik7Ci0JCQkJfQotCQkJICAgIH0KLQkJCS8vIGtlZXBzIHRoZSBlbGVtZW50IGZyb20gZ29pbmcgb2ZmIHNjcmVlbiB0byB0aGUgbGVmdAotCQkJaWYobGVmdFZhbCA8IDIpIHtsZWZ0VmFsID0gMjt9Ci0JCQlpZih0b3BWYWwgPCAyKSB7dG9wVmFsID0gLTU7fQkJCQkKLQkJCWRvbS50b3AgPSB0b3BWYWw7Ci0JCQlkb20ubGVmdCA9IGxlZnRWYWw7Ci0JCQlkb20udmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsJCQkJCQotCQkJCX0KLQl9IAotCQkKLX0KLQotCi0KLQotZnVuY3Rpb24gc2VhcmNoT3B0aW9ucyhuZXdMb2MpIHsgLy9PcGVucyBuZXcgcGFnZSBpbiB0aGUgcmlnaHQgZnJhbWUgZGVwZW5kaW5nIG9uIHRoZSAiQWR2YW5jZWQgU2VhcmNoIGZvcjoiIHNlbGVjdGlvbgotCQkJbmV3UGFnZSA9IG5ld0xvYy5vcHRpb25zW25ld0xvYy5zZWxlY3RlZEluZGV4XS52YWx1ZQotCQotCQkJaWYgKG5ld1BhZ2UgIT0gIiIpIHsKLQkJCQlwYXJlbnQudmlld0ZyYW1lLmxvY2F0aW9uLmhyZWYgPSBuZXdQYWdlCi0JCQl9Ci0JCX0KLQotCi0vL3VuY2hlY2sgY2hlY2tib3hlcwotZnVuY3Rpb24gdW5jaGVja0FsbChmaWVsZCkgewotICAgICBpZiAoY2hlY2tlZCkgeyAvLyBpZiBjaGVja2JveGVzIGFyZSBjaGVja2VkIHRoZW4gY2hlY2sgdGhlbQotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWVsZC5sZW5ndGg7IGkrKykgeyAvLyBsb29wIHRocm91Z2ggdGhlIGFycmF5IG9mIGNoZWNrYm94ZXMgJiB1bmNoZWNrIHRoZW0KLSAgICAgICAgICAgICAgIGZpZWxkW2ldLmNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2hlY2tlZCA9IGZhbHNlOwotICAgICB9Ci19IAotCi0vLyBzaG93IGhpZGUgbGF5ZXJzIGZvciBDUSBkZWZsZWN0X2xvZ2luX2VycgotbnM0ID0gKGRvY3VtZW50LmxheWVycyk/IHRydWU6ZmFsc2UKLWllNCA9IChkb2N1bWVudC5hbGwpPyB0cnVlOmZhbHNlCi0KLWZ1bmN0aW9uIHNob3coaWQpIHsKLWlmIChuczQpIGRvY3VtZW50LmxheWVyc1tpZF0udmlzaWJpbGl0eSA9ICJzaG93IgotaWYgKGllNCkgZG9jdW1lbnQuYWxsW2lkXS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiCi19Ci0KLWZ1bmN0aW9uIGhpZGUoaWQpIHsKLWlmIChuczQpIGRvY3VtZW50LmxheWVyc1tpZF0udmlzaWJpbGl0eSA9ICJoaWRlIgotaWYgKGllNCkgZG9jdW1lbnQuYWxsW2lkXS5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiIKLX0KLQotLy8gcG9wIHVwIHdpbmRvdyBhY2NvcmRpbmcgdG8gbW91c2UgZXZlbnQKLWZ1bmN0aW9uIHNob3dXaW5kb3coZSx1cmwpIHsKLSAgICB2YXIgeD15PTA7Ci0JCi0JaWYgKGUgIT0gJycpIHsKLSAgICAgICAgeCA9IGUuc2NyZWVuWDsKLSAgICAgICAgeSA9IGUuc2NyZWVuWTsKLSAgICB9Ci0KLSAgICBteVdpbmRvdz13aW5kb3cub3Blbih1cmwsJ3dpbmRvd05hbWUnLCd3aWR0aD0yMDAsaGVpZ2h0PTE1MCxzY3JlZW5YPScgKyB4ICsgJyxzY3JlZW5ZPScgKyB5ICsgJyxsZWZ0PScgKyB4ICsgJyx0b3A9JyArIHkpOwotfQotCi0KLQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3NjcmlwdHMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmVkMzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3NjcmlwdHMuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZhciBjPScuY3NzIiAvPic7Ci12YXIgbD0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj1cIi4vc3R5bGVzaGVldHMvJzsKLQotLy9TbmlmZmVyIHZhcmlhYmxlcyBiZWdpbnMKLS8vY29udmVydGluZyB0byBsb3dlcmNhc2UKLXZhciBzbm4gPSBuYXZpZ2F0b3I7Ci12YXIgc25wbCA9IHNubi5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpOyAvLyBub3Qgc3VwcG9ydGVkIGluIE5TMy4wCi12YXIgc251YSA9ICcgJyArIHNubi51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKLXZhciBzbnVuID0gc25uLmFwcE5hbWUudG9Mb3dlckNhc2UoKTsKLQotLy8gcGxhdGZvcm0KLXZhciBzbnZwbF9tYWMgPSBzbnVhLmluZGV4T2YoJ21hYycpID4gMDsKLXZhciBzbnZwbF91bml4ID0gc251YS5pbmRleE9mKCJ4MTEiKSA+IDA7Ci12YXIgc252cGxfd2luID0gc251YS5pbmRleE9mKCd3aW4nKSA+IDA7Ci0KLS8vIGJyb3dzZXIgdmVyc2lvbgotdmFyIHNudnZfaWUgPSBzbnVhLmluZGV4T2YoJ21zaWUnKSA+IDA7Ci12YXIgc252dl9ubiA9IHNudWEuaW5kZXhPZignbW96aWxsYScpID4gMDsKLXZhciBzbnZ2ZXJzaW9uID0gc25uLmFwcFZlcnNpb247Ci0KLQotLy8gJ2NvbXBhdGlibGUnIHZlcnNpb25zIG9mICJtb3ppbGxhIiBhcmVuJ3QgbmF2aWdhdG9yCi1pZihzbnVhLmluZGV4T2YoJ2NvbXBhdGlibGUnKSA+IDApIHsKLQlzbm52dl9ubiA9IGZhbHNlOwotfQotLy9FbmRzIHNuaWZmZXIgdmFyaWFibGVzIAotCQotCQkKLS8qIFRoaXMgaXMgYSBiYXNpYyBzbmlmZmVyICovCi0gIAotaWYoc252cGxfd2luKS8vd2luZG93cwotCi17ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0JICB9Ci0gIH0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgCi0gIGlmIChzbnVhLmluZGV4T2YoIi80IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNSIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0JICB9Ci0gIH0KLSAgZWxzZQotICB7Ci0gICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICB9Ci19Ci1lbHNlIGlmKHNudnBsX3VuaXgpLy91bml4Ci0gIHsgIAotICBpZihzbnZ2X2llKSAgICAKLSAgewotICAgIGlmIChzbnVhLmluZGV4T2YoJ2llIDUnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlIGlmKHNudWEuaW5kZXhPZignaWUgNS41JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDYnKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduJytjKTsKLSAgICBlbHNlCi0JICB7Ci0JICBkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotCSAgfQotICB9Ci0KLSAgZWxzZSBpZiAoc252dl9ubikgCi0gIHsKLSAgaWYgKHNudWEuaW5kZXhPZigiLzQiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZSBpZihzbnVhLmluZGV4T2YoIi81IikhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIGVsc2UgaWYoc251YS5pbmRleE9mKCIvNiIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlCi0JICB7Ci0JICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCSAgfQotICB9IAotICBlbHNlCi0gIHsKLSAgZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgfQotfQotCi1lbHNlIGlmKHNudnBsX21hYykvL21hYwotICB7ICAKLSAgaWYoc252dl9pZSkgICAgCi0gIHsKLSAgICBpZiAoc251YS5pbmRleE9mKCdpZSA1JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZSBpZihzbnVhLmluZGV4T2YoJ2llIDUuNScpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ24nK2MpOwotICAgIGVsc2UgaWYoc251YS5pbmRleE9mKCdpZSA2JykhPS0xKWRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0gICAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbicrYyk7Ci0JICB9Ci0gIH0KLQotICBlbHNlIGlmIChzbnZ2X25uKSAKLSAgewotICBpZiAoc251YS5pbmRleE9mKCIvNCIpIT0tMSlkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotICBlbHNlIGlmKHNudWEuaW5kZXhPZigiLzYiKSE9LTEpZG9jdW1lbnQud3JpdGUobCsnZGVzaWduX25zJytjKTsKLSAgZWxzZQotCSAgewotCSAgIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0JICB9Ci0gIH0gCi0gIGVsc2UKLSAgewotIGRvY3VtZW50LndyaXRlKGwrJ2Rlc2lnbl9ucycrYyk7Ci0gIH0KLX0KLQotZWxzZS8vb3RoZXJzIAotewotICBkb2N1bWVudC53cml0ZShsKydkZXNpZ25fbnMnK2MpOwotCi19Ci0KLS8vU05JRkZFUiBFTkRTIEhFUkUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzX3VuaXhGcmFtZS5qcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2NyaXB0cy9zY3JpcHRzX3VuaXhGcmFtZS5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM0MDc2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvc2NyaXB0c191bml4RnJhbWUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaWYoc25udnZfbm4gJiYgc252cGxfdW5peCkgewkgIHdpbmRvdy5sb2NhdGlvbiA9ICJ1bml4X2ZyYW1lcy5odG1sIgl9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvdG9wbmF2LmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RvcG5hdi5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExMzJhNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvdG9wbmF2LmpzCisrKyAvZGV2L251bGwKQEAgLTEsODA5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBtZXNzYWdlcyB0byBiZSBleHRlcm5pemVkCi0vLyBoZXJlIGRlZmluZXMgYWxsIHRoZSBJMThOIHNwZWNpZmljIG1lc3NhZ2VzIHVzZWQgaW4gdGhlIGphdmFzY3JpcHRzCi0KLXZhciB0b3BuYXZfanNfTUVTU0FHRTEgPSAiVGhlIFRyZWVCcm93c2UgaXMgbm90IHlldCBsb2FkZWQhXG5QbGVhc2Ugd2FpdCEiOwotdmFyIHRvcG5hdl9qc19NRVNTQUdFMiA9ICJUaGVyZSBpcyBubyAnezB9JyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMuIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTMgPSAiVGhlcmUgaXMgbm8gezB9IHBhZ2UhIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRV9wcmV2ID0gInByZXZpb3VzIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRV9uZXh0ID0gIm5leHQiOwotdmFyIHRvcG5hdl9qc19NRVNTQUdFX3VwID0gInVwIjsKLXZhciB0b3BuYXZfanNfTUVTU0FHRTQgPSAiVGhlIGN1cnJlbnQgZmlsZSBpcyBub3QgaW4gdGhlIHRyZWUgYnJvd3Nlci4iOwotdmFyIHRvcG5hdl9qc19NRVNTQUdFNSA9ICJUaGUgcHVibGlzaGVkIHNpdGUgaXMgYWxyZWFkeSBkaXNwbGF5ZWQgdXNpbmcgZnJhbWVzIjsKLQotZnVuY3Rpb24gZm9ybWF0U3RyaW5nKG1lc3NhZ2UsIHJlcGxhY2UwKQotewotICAgCXJldHVybiBtZXNzYWdlLnJlcGxhY2UoL1x7MFx9LywgcmVwbGFjZTApOwotfSAKLQotLy8gdGhpcyBzY3JpcHQgaXMgZm9yIHRoZSB0b3BuYXYuaHRtbAotLy8gdGhpcyBpcyBOT1QgZm9yIGdlbmVyYWwgdXNlCi1NU0ZQaG92ZXIgPQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8Ci0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7Ci0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQotICB7Ci0gICAgIHZhciBhPW5ldyBJbWFnZSgpOwotICAgICBhLnNyYz1pbWc7Ci0gICAgIHJldHVybiBhOwotICB9Ci0gIAotdmFyIHRvdXIgPSAwOwotCi1mdW5jdGlvbiBvcGVuRmlyc3RUb3VyICgpCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNAotewotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkKLSAgICB7Ci0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIG9wZW5Ub3VyICgpCi0vLyBvcGVuIHRoZSBndWlkZWQgdG91ciAvaGFha2FuIDk5MDMyNAotewotaWYoIXRvdXIgfHwgdG91cj09bnVsbCB8fCB0b3VyLmNsb3NlZCkKLSAgICB7Ci0gICAgICB0b3VyID0gb3BlbigiLi90b3VyL3RvdXIuaHRtIiwidG91cl9wYWdlIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM1MCxoZWlnaHQ9NzAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRvdXIuZm9jdXMoKTsKLSAgICB9Ci19Ci0KLS8vQWRkaXRpb24gYnkgQ2hpbmggVm8gMDMvMjgvMDAKLSBmdW5jdGlvbiBkaXNwbGF5R2V0dGluZ1N0YXJ0ZWQoKQotIHsKLSAJdmFyIHBhZ2VQYXR0ZXJuID0gL292dV9wcm9jLzsKLSAJdmFyIG1haW5QYWdlID0gd2luZG93LnBhcmVudC5vcnlfZG9jLmxvY2F0aW9uOwotCi0gCWlmICggcGFnZVBhdHRlcm4udGVzdCggbWFpblBhZ2UgKSApIHsKLSAgICAJaWYgKGdldENvb2tpZSgiUlVQIikgIT0gImNoZWNrZWQiKSB7IG9wZW5GaXJzdFRvdXIoKTsgfQotCX0KLQllbHNlIHsKLQkJc2V0VGltZW91dCggImRpc3BsYXlHZXR0aW5nU3RhcnRlZCgpIiwgMTAwMCApOwotCX0KLX0KLQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKQotewotICB2YXIgZGNvb2tpZSA9IGRvY3VtZW50LmNvb2tpZTsKLSAgdmFyIGNuYW1lID0gbmFtZSArICI9IjsKLSAgdmFyIGNsZW4gPSBkY29va2llLmxlbmd0aDsKLSAgdmFyIGNiZWdpbiA9IDA7Ci0gIHdoaWxlIChjYmVnaW4gPCBjbGVuKQotICB7Ci0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsKLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKQotICAgIHsKLSAgICAgIHZhciB2ZW5kID0gZGNvb2tpZS5pbmRleE9mICgiOyIsIHZiZWdpbik7Ci0gICAgICBpZiAodmVuZCA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgdmVuZCA9IGNsZW47Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7Ci0gICAgfQotICAgIGNiZWdpbiA9IGRjb29raWUuaW5kZXhPZigiICIsIGNiZWdpbikgKyAxOwotICAgIGlmIChjYmVnaW4gPT0gMCkKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGw7Ci0gfQotCi0KLSAgdmFyIGluZGV4PW51bGw7Ci0gIHZhciB0b3VyPW51bGw7Ci0gIHZhciBzZWFyY2g9bnVsbDsKLSAgdmFyIGdsb3NzYXJ5PW51bGw7Ci0gIHZhciBmZWVkYmFjaz1udWxsOwotICB2YXIgdHJlZUxvYWRlZD1mYWxzZTsKLSAgZnVuY3Rpb24gY2hlY2tUcmVlTG9hZGVkKCkKLSAgewotICAgIGlmKHRyZWVMb2FkZWQpCi0gICAgewotICAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgaWYocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0ICE9IG51bGwKLSAgICAgICAgJiYgcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkKLSAgICAgewotICAgICAgIHRyZWVMb2FkZWQgPSB0cnVlOwotICAgICB9Ci0gICAgICovCi0gICAgIGlmKHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LlJ1cFByZXNlbnRlckFwcGxldCAhPSBudWxsKQotICAgICB7Ci0gICAgICAJdmFyIG1ldGhvZCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuaXNSZWFkeTsKLQkgaWYgKG1ldGhvZCAhPSAidW5kZWZpbmVkIikgewotCQlpZiAocGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuUnVwUHJlc2VudGVyQXBwbGV0LmlzUmVhZHkoKSkKLQkJewotICAgICAgIAkJCXRyZWVMb2FkZWQgPSB0cnVlOwotCQl9Ci0KLQkgIH0KLQotICAgICB9Ci0KLSAgICAgcmV0dXJuIHRyZWVMb2FkZWQ7Ci0gICB9Ci0KLQotICAgIGZ1bmN0aW9uIHNob3dBbGVydE5vdExvYWRlZCgpCi0gICAgewotICAgICAgYWxlcnQodG9wbmF2X2pzX01FU1NBR0UxKTsKLSAgICB9Ci0KLWZ1bmN0aW9uIHNob3dTdGF0dXNOb3RMb2FkZWQoKQotICB7Ci0gICAgLy9yZXR1cm4gIlRoZSBUcmVlQnJvd3NlIGlzIG5vdCB5ZXQgbG9hZGVkIVxuUGxlYXNlIHdhaXQhIjsKLSAgICByZXR1cm4gdG9wbmF2X2pzX01FU1NBR0UxOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd0FsZXJ0Tm9QYWdlKHRleHQpCi0gIHsKLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkKLSAgICAgewotICAgICAgICAgIC8vYWxlcnQoIlRoZXJlIGlzIG5vICciICsgdGV4dCArICInIHBhZ2UgZm9yIHRoaXMgcGFnZS5cblRyeSBvbmUgb2YgdGhlIG90aGVyIG5hdmlnYXRpb24gYnV0dG9ucy4iKTsKLSAgICAgICAgICBhbGVydChmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UyLCB0ZXh0KSk7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgICAvL2FsZXJ0KCJUaGVyZSBpcyBubyAnIiArIHRleHQgKyAiJyBwYWdlIGZvciB0aGlzIHBhZ2UuXG5Ucnkgb25lIG9mIHRoZSBvdGhlciBuYXZpZ2F0aW9uIGJ1dHRvbnMiKTsKLSAgICAgICAgIGFsZXJ0KGZvcm1hdFN0cmluZyh0b3BuYXZfanNfTUVTU0FHRTIsIHRleHQpKTsKLSAgICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1N0YXR1c05vUGFnZSh0ZXh0KQotICB7Ci0KLSAgICAgdmFyIHBhcmVudExhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFBhcmVudExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgIHZhciBtc2c7Ci0gICAgIGlmKHBhcmVudExhYmVsIT0iIiAmJiBwYXJlbnRMYWJlbCE9bnVsbCkKLSAgICAgewotICAgICAgICAvL21zZyA9ICJUaGVyZSBpcyBubyAiICsgdGV4dCArICIgcGFnZSEiOwotICAgICAgICBtc2cgPSBmb3JtYXRTdHJpbmcodG9wbmF2X2pzX01FU1NBR0UzLCB0ZXh0KTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgLy9tc2cgPSAiVGhlcmUgaXMgbm8gIiArIHRleHQgKyAiIHBhZ2UhIjsKLSAgICAgICAgbXNnID0gZm9ybWF0U3RyaW5nKHRvcG5hdl9qc19NRVNTQUdFMywgdGV4dCk7Ci0gICAgIH0KLQotICAgICByZXR1cm4gbXNnOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1BhcmVudExhYmVsKCkKLSAgewotICAgIGlmKGNoZWNrVHJlZUxvYWRlZCgpKQotICAgIHsKLSAgICAgIHZhciBsYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICAgdmFyIHBhcmVudHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLQotICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgcGFyZW50dXJsIT0iIiAmJiBwYXJlbnR1cmwhPW51bGwpCi0gICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIHNlbGYuc3RhdHVzID0gc2hvd1N0YXR1c05vUGFnZSgidXAiKTsKLSAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb3RMb2FkZWQoKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBzaG93SG9tZUxhYmVsKCkKLSAgewotICAgIHNlbGYuc3RhdHVzID0gIkhvbWUiOwotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd1ByZXZpb3VzTGFiZWwoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIGxhYmVsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzTGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgIHZhciBwcmV2dXJsID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldFByZXZpb3VzVXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0KLSAgICAgaWYobGFiZWwhPSIiICYmIGxhYmVsIT1udWxsICYmIHByZXZ1cmwhPSIiICYmIHByZXZ1cmwhPW51bGwpCi0gICAgIHsKLSAgICAgICBzZWxmLnN0YXR1cyA9IGxhYmVsOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBzZWxmLnN0YXR1cyA9IHNob3dTdGF0dXNOb1BhZ2UoInByZXZpb3VzIik7Ci0gICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBzaG93U3RhdHVzTm90TG9hZGVkKCk7Ci0gICAgfQotICB9Ci0KLSAgZnVuY3Rpb24gc2hvd05leHRMYWJlbCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgICB2YXIgbGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0TmV4dExhYmVsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgICB2YXIgbmV4dHVybCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0VXJsKHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LlVSTCk7Ci0gICAgICBpZihsYWJlbCE9IiIgJiYgbGFiZWwhPW51bGwgJiYgbmV4dHVybCE9IiIgJiYgbmV4dHVybCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSBsYWJlbDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgc2VsZi5zdGF0dXMgPSAgc2hvd1N0YXR1c05vUGFnZSgibmV4dCIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHNlbGYuc3RhdHVzID0gIHNob3dTdGF0dXNOb3RMb2FkZWQoKTsKLSAgICB9Ci0gIH0KLQotICBmdW5jdGlvbiBsb2FkUHJldmlvdXMoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICB2YXIgbmV3TGFiZWwgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNMYWJlbChwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgICB2YXIgbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0UHJldmlvdXNVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLQotICAgICBpZihuZXdMb2NhdGlvbiE9IiIgJiYgbmV3TG9jYXRpb24hPW51bGwpCi0gICAgIHsKLQotCWlmICgobmV3TG9jYXRpb24uaW5kZXhPZigiYXBwbGV0Iik9PS0xKSAmJiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3Iik9PS0xKSkKLQl7Ci0JCXBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0JfQotCWVsc2UgaWYgKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpIT0tMSkKLQl7Ci0JIAlwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0QXBwbGV0UGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwpOwotCX0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJ3d3ciKSE9LTEpCi0JewotCQluZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRIdHRwUGFnZShuZXdMb2NhdGlvbiwgbmV3TGFiZWwsICJQcmV2aW91cyIpOwotCX0KLQkgICAgICAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnNlbGVjdE5vZGUobmV3TG9jYXRpb24pOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgIHNob3dBbGVydE5vUGFnZSh0b3BuYXZfanNfTUVTU0FHRV9wcmV2KTsKLSAgICAgfQotICAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICBmdW5jdGlvbiBsb2FkTmV4dCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgIHZhciBuZXdMYWJlbCA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXROZXh0TGFiZWwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldE5leHRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICB7Ci0KLQlpZiAoKG5ld0xvY2F0aW9uLmluZGV4T2YoImFwcGxldCIpPT0tMSkgJiYgKG5ld0xvY2F0aW9uLmluZGV4T2YoInd3dyIpPT0tMSkpCi0JewotCQlwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotCX0KLQllbHNlIGlmIChuZXdMb2NhdGlvbi5pbmRleE9mKCJhcHBsZXQiKSE9LTEpCi0JewotCSAJcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmdldEFwcGxldFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsKTsKLQl9Ci0JZWxzZSBpZiAobmV3TG9jYXRpb24uaW5kZXhPZigid3d3IikhPS0xKQotCXsKLQkJbmV3TG9jYXRpb24gPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuZ2V0SHR0cFBhZ2UobmV3TG9jYXRpb24sIG5ld0xhYmVsLCAiTmV4dCIpOwotCX0KLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7Ci0KLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX25leHQpOwotICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgZnVuY3Rpb24gbG9hZFBhcmVudCgpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgIHZhciBuZXdMb2NhdGlvbiA9IHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5nZXRQYXJlbnRVcmwocGFyZW50Lm9yeV9kb2MuZG9jdW1lbnQuVVJMKTsKLSAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICB7Ci0gICAgICAgcGFyZW50Lm9yeV9kb2MubG9jYXRpb24gPSBuZXdMb2NhdGlvbjsKLSAgICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShuZXdMb2NhdGlvbik7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgc2hvd0FsZXJ0Tm9QYWdlKHRvcG5hdl9qc19NRVNTQUdFX3VwKTsKLSAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLQotICAgICByZXR1cm47Ci0gIH0KLQotZnVuY3Rpb24gd2hlcmVBbUkoKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotCXZhciBzdGF0dXMgPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUuc2VsZWN0Tm9kZShwYXJlbnQub3J5X2RvYy5kb2N1bWVudC5VUkwpOwotICAgIAlpZiggc3RhdHVzID09IGZhbHNlICkKLQl7Ci0JCWFsZXJ0KCB0b3BuYXZfanNfTUVTU0FHRTQgKTsKLQl9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0gIGZ1bmN0aW9uIHVwQXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLnVwQXJyb3coKTsKLSAgICAgIGlmKG5ld0xvY2F0aW9uIT0iIiAmJiBuZXdMb2NhdGlvbiE9bnVsbCkKLSAgICAgIHsKLSAgICAgICBwYXJlbnQub3J5X2RvYy5sb2NhdGlvbiA9IG5ld0xvY2F0aW9uOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hvd0FsZXJ0Tm90TG9hZGVkKCk7Ci0gICAgfQotICAgICByZXR1cm47Ci0gIH0KLQotICBmdW5jdGlvbiBkb3duQXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICAgdmFyIG5ld0xvY2F0aW9uID0gcGFyZW50Lm9yeV90b2MuZG9jdW1lbnQuYXBwbGV0cy5UcmVlLmRvd25BcnJvdygpOwotICAgICAgaWYobmV3TG9jYXRpb24hPSIiICYmIG5ld0xvY2F0aW9uIT1udWxsKQotICAgICAgewotICAgICAgIHBhcmVudC5vcnlfZG9jLmxvY2F0aW9uID0gbmV3TG9jYXRpb247Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNob3dBbGVydE5vdExvYWRlZCgpOwotICAgIH0KLSAgICAgcmV0dXJuOwotICB9Ci0KLSAgICBmdW5jdGlvbiBsZWZ0QXJyb3coKQotICB7Ci0gICAgaWYoY2hlY2tUcmVlTG9hZGVkKCkpCi0gICAgewotICAgICBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5hcHBsZXRzLlRyZWUubGVmdEFycm93KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0gICAgZnVuY3Rpb24gcmlnaHRBcnJvdygpCi0gIHsKLSAgICBpZihjaGVja1RyZWVMb2FkZWQoKSkKLSAgICB7Ci0gICAgIHBhcmVudC5vcnlfdG9jLmRvY3VtZW50LmFwcGxldHMuVHJlZS5yaWdodEFycm93KCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaG93QWxlcnROb3RMb2FkZWQoKTsKLSAgICB9Ci0gICAgIHJldHVybjsKLSAgfQotCi0KLWZ1bmN0aW9uIGxvYWRUb3AoKQotewotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiBwYXJlbnQuZnJhbWVzWzFdLm5hbWU9PSJvcnlfdG9jIikKLSAgewotICAgICBhbGVydCh0b3BuYXZfanNfTUVTU0FHRTUpOwotICB9Ci0gIGVsc2UKLSAgewotICAgIHZhciBleHBpcmVzID0gbmV3IERhdGUoKTsKLSAgICBleHBpcmVzLnNldFRpbWUgKGV4cGlyZXMuZ2V0VGltZSgpICsgKDEwMDAgKiAyMCkpOwotICAgIGRvY3VtZW50LmNvb2tpZSA9ICJydXBfb3J5X2RvYz0iICsgZXNjYXBlIChkb2N1bWVudC5VUkwpICsKLSAgICAiOyBleHBpcmVzPSIgKyBleHBpcmVzLnRvVVRDU3RyaW5nKCkgKyAgIjsgcGF0aD0vIjsKLQotICAgIHZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOwotCi0gICAgZm9yKGk9ZG9jdW1lbnQubGlua3MubGVuZ3RoLTE7aT49MDtpLS0pCi0gICAgewotICAgICAgIGlmKGRvY3VtZW50LmxpbmtzW2ldLmhyZWYuaW5kZXhPZigiaW5kZXguaHRtIikhPS0xKQotICAgICAgIHsKLSAgICAgICAgIG5ld19vcnlfZG9jX2xvYyA9IGRvY3VtZW50LmxpbmtzW2ldLmhyZWY7Ci0gICAgICAgICBicmVhazsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQotICAgIHsKLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApCi0JewotCQl3aW5kb3cuY2xvc2UoKTsKLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwotCX0KLQllbHNlCi0JewotCSAgICAgICAJdG9wLmxvY2F0aW9uID0gbmV3X29yeV9kb2NfbG9jOwotCX0KLSAgICB9Ci0gICB9Ci19Ci0KLQotZnVuY3Rpb24gb3Blbk9yeSAocGFnZSwgdGFyZ2V0KQotewotICAgIGlmKCFpbmRleCB8fCBpbmRleC5jbG9zZWQpCi0gICAgewotICAgICAgaW5kZXggPSBvcGVuKHBhZ2UsdGFyZ2V0LCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz15ZXMsd2lkdGg9Mzk1LGhlaWdodD01MDAscmVzaXphYmxlPXllcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW5kZXguZm9jdXMoKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIG9wZW5TZWFyY2goKQotewotICAgIGlmKCFzZWFyY2ggfHwgc2VhcmNoLmNsb3NlZCkKLSAgICB7Ci0gICAgICBzZWFyY2ggPSBvcGVuKCIuL2FwcGxldC9zZWFyY2guaHRtIiwic2VhcmNoX3BhZ2UiLCJ0b29sYmFyPW5vLGRpcmVjdG9yaWVzPW5vLG1lbnViYXI9bm8sc2Nyb2xsYmFycz1ubyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZWFyY2guZm9jdXMoKTsKLSAgICB9Ci19Ci0KLWZ1bmN0aW9uIG9wZW5Qcm9jZXNzU2VhcmNoKCkKLXsKLSAgICBpZighc2VhcmNoIHx8IHNlYXJjaC5jbG9zZWQpCi0gICAgewotICAgICAgc2VhcmNoID0gb3BlbigiLi9zZWFyY2gvc2VhcmNoLmh0bWwiLCJzZWFyY2hfcGFnZSIsInRvb2xiYXI9bm8sZGlyZWN0b3JpZXM9bm8sbWVudWJhcj1ubyxzY3JvbGxiYXJzPXllcyx3aWR0aD02MzAsaGVpZ2h0PTQ1MCxyZXNpemFibGU9eWVzIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzZWFyY2guZm9jdXMoKTsKLSAgICB9Ci0gICAKLX0KLQotZnVuY3Rpb24gZ2V0QmFzZVVybCgpIHsKLQotICAgIC8vIGdldCB0aGUgdXJsIGJhc2UgZm9yIHRoZSBzZWFyY2ggdXJsCi0JdmFyIHVybCA9IGxvY2F0aW9uLmhyZWY7Ci0JdmFyIGkgPSB1cmwubGFzdEluZGV4T2YoIi8iKTsKLQl1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIGkpOwotCQotCXJldHVybiB1cmw7Ci19Ci0KLWZ1bmN0aW9uIG9wZW5JbmRleCgpCi17Ci0gICBvcGVuT3J5KCIuL2luZGV4L2luZGV4Lmh0bSIsImluZGV4X3dpbiIpOwotfQotCi1mdW5jdGlvbiBvcGVuR2xvc3NhcnkoKQotewotIGlmKCFnbG9zc2FyeSB8fCBnbG9zc2FyeS5jbG9zZWQpCi0gICAgewotICAgICAgZ2xvc3NhcnkgPSBvcGVuKCIuL3Byb2Nlc3MvZ2xvc3NhcnkvaW5kZXguaHRtIiwiZ2xvc3Nhcnlfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTM4NSxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGdsb3NzYXJ5LmZvY3VzKCk7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBwcmludFBhZ2UoKQotewotIHBhcmVudC5vcnlfZG9jLmZvY3VzKCk7Ci0gcGFyZW50Lm9yeV9kb2MucHJpbnQoKTsKLX0KLQotCi1mdW5jdGlvbiBzZW5kRmVlZGJhY2sodXJsKQotewotCWlmICggdXJsID09IG51bGwgfHwgdXJsID09ICcnICkKLQl7Ci0JCXJldHVybjsKLQl9Ci0JCi0JaWYgKCB1cmwuaW5kZXhPZigibWFpbHRvOiIpID49IDAgKQotCXsKLQkJc2VuZG1haWwodXJsKTsKLQl9Ci0JZWxzZQotCXsKLQkJCi0gCSAgICBpZighZmVlZGJhY2sgfHwgZmVlZGJhY2suY2xvc2VkKQotCSAgICB7Ci0JICAgICAgZmVlZGJhY2sgPSBvcGVuKHVybCwiZmVlZGJhY2tfd2luIiwidG9vbGJhcj1ubyxkaXJlY3Rvcmllcz1ubyxtZW51YmFyPW5vLHNjcm9sbGJhcnM9eWVzLHdpZHRoPTYwMCxoZWlnaHQ9NTAwLHJlc2l6YWJsZT15ZXMiKTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkgICAgICBmZWVkYmFjay5mb2N1cygpOwotCSAgICB9Ci0gICAgCX0KLSAgICAJCi19Ci0KLQotZnVuY3Rpb24gc2VuZG1haWwodXJsKQotewotCWlmICggdXJsLmluZGV4T2YoIj9zdWJqZWN0IikgPT0gLTEgKQotCXsKLQkJdmFyIGxpbms9cGFyZW50Lm9yeV9kb2MubG9jYXRpb247Ci0JCXVybCA9IHVybCArICc/c3ViamVjdD1GZWVkYmFjazogLSAnK2xpbms7Ci0JfQotCWxvY2F0aW9uLnJlcGxhY2UodXJsKTsKLX0KLQotLy9jYWxjdWxhdGVzIHJlbGF0aXZlIHBhdGgKLS8vcGF0aCBtdXN0IGJlIGFsbCByZWxhdGl2ZSBmcm9tIHdlYnNpdGUgYmFzZSBvciBjb250YWluIGZ1bGwgdXJscwotZnVuY3Rpb24gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHNvdXJjZVBhdGgsIHRhcmdldFBhdGgpCi17Ci0JaWYgKHRhcmdldFBhdGguaW5kZXhPZigiaHR0cDovIikgIT0gLTEpCi0JewotCQlyZXR1cm4gdGFyZ2V0UGF0aDsKLQl9Ci0KLQkvL3JlcGxhY2UgYWxsICdcJyB3aXRoICcvJwotCXNvdXJjZVBhdGggPSBzb3VyY2VQYXRoLnJlcGxhY2UoL1xcL2csIiQxLyQyIik7Ci0JdGFyZ2V0UGF0aCA9IHRhcmdldFBhdGgucmVwbGFjZSgvXFwvZywiLyIpOwotCi0JLy9hbGVydCgiUmVwbGFjZShTb3VyY2UpPT4iICsgc291cmNlUGF0aCk7Ci0JLy9hbGVydCgiUmVwbGFjZSh0YXJnZXQpPT4iICsgdGFyZ2V0UGF0aCk7Ci0KLQotCXNvdXJjZUFycmF5ID0gc291cmNlUGF0aC5zcGxpdCgiLyIpOwotCXRhcmdldEFycmF5ID0gdGFyZ2V0UGF0aC5zcGxpdCgiLyIpOwotCi0JdmFyIHRoZVJlbFBhdGggPSAiIjsKLQotCS8vbG9vcCB1bnRpbCB3ZSBmaW5kIGEgZGlmZmVyZW5jZQotCXZhciBpZHggPSAwOwotCWZvcihpZHggPSAwOyBpZHggPCBzb3VyY2VBcnJheS5sZW5ndGg7IGlkeCsrKQotCXsKLQkJaWYgKGlkeCA+IHRhcmdldFBhdGgubGVuZ3RoKQotCQl7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzb3VyY2VBcnJheVtpZHhdICE9IHRhcmdldEFycmF5W2lkeF0pCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLy9hcHBlbmQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiAuLwotCXZhciBtYXhJZHggPSBzb3VyY2VBcnJheS5sZW5ndGggLSAxOwotCWZvciAodmFyIGkgPSBpZHg7IGkgPCBtYXhJZHg7IGkrKykKLQl7Ci0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgIi4vIjsKLQotCQkvL2FsZXJ0KCJSZWxQYXRoPT4iICsgdGhlUmVsUGF0aCk7Ci0JfQotCi0JLy9hcHBlbmQgYW55IHJlbWFpbmluZyB0YXJnZXQgcGF0aAotCXdoaWxlKGlkeCA8IHRhcmdldEFycmF5Lmxlbmd0aCkKLQl7Ci0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoICsgdGFyZ2V0QXJyYXlbaWR4KytdICsgIi8iOwotCQkvL2FsZXJ0KCJSZWxQYXRoKGZpbmFsKT0+IiArIHRoZVJlbFBhdGgpOwotCX0KLQotCS8vcmVtb3ZlIHRoZSBsYXN0IHBhdGggc2VwYXJhdG9yCi0JaWYgKHRoZVJlbFBhdGgubGVuZ3RoID4gMCkKLQl7Ci0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7Ci0JCXRoZVJlbFBhdGggPSB0aGVSZWxQYXRoLnN1YnN0cmluZygwLCAodGhlUmVsUGF0aC5sZW5ndGggLSAxKSk7Ci0JCS8vYWxlcnQoIlJlbFBhdGgoVHJpbTEpPT4iICsgdGhlUmVsUGF0aCk7Ci0JfQotCi0JLy9hbGVydCgiUmV0dXJuIFJlbGF0aXZlIFBhdGggPT4gIiArIHRoZVJlbFBhdGgpOwotCi0JcmV0dXJuIHRoZVJlbFBhdGg7Ci19Ci0KLWZ1bmN0aW9uIGdldFRyZWVQYXRoKCkKLXsKLQlyZXR1cm4gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCk7Ci19Ci0KLS8vVGhpcyBtZXRob2Qgd2lsbCByZW1vdmUgdGhlIHdlYnNpdGUgYmFzZSBmcm9tIHRoZSB1cmwKLWZ1bmN0aW9uIGNhbGN1bGF0Q3VycmVudFBhZ2UoY3VyclVSTCkgewotCi0JdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7Ci0JLy9yZXBsYWNlIGFsbCAnXCcgd2l0aCAnLycKLQl0aGVDdXJyZW50TG9jYXRpb24gPSB0aGVDdXJyZW50TG9jYXRpb24ucmVwbGFjZSgvXFwvZywiJDEvJDIiKTsKLQljdXJyVVJMID0gY3VyclVSTC5yZXBsYWNlKC9cXC9nLCIkMS8kMiIpOwotCi0JdmFyIHNvdXJjZUFycmF5ID0gdGhlQ3VycmVudExvY2F0aW9uLnNwbGl0KCIvIik7Ci0JdmFyIGN1cnJBcnJheSA9IGN1cnJVUkwuc3BsaXQoIi8iKTsKLQotCXZhciBudW1Ub1JlbW92ZSA9IHNvdXJjZUFycmF5Lmxlbmd0aCAtIDI7Ci0JdmFyIGlkeCA9IDA7Ci0JdmFyIHRoZVJldHVyblBhdGggPSAiIjsKLQlmb3IgKGlkeCA9IG51bVRvUmVtb3ZlOyBpZHggPCBjdXJyQXJyYXkubGVuZ3RoOyBpZHgrKykgewotCQlpZiAodGhlUmV0dXJuUGF0aCAhPSAiIikgewotCQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyAiLyI7Ci0JCX0KLQkJdGhlUmV0dXJuUGF0aCA9IHRoZVJldHVyblBhdGggKyBjdXJyQXJyYXlbaWR4XTsKLQl9Ci0KLQkvL2FsZXJ0KCJBcnJheVRlc3Q9PiIgKyBjdXJyVVJMICsgIiwiICsgdGhlUmV0dXJuUGF0aCk7Ci0JcmV0dXJuIHRoZVJldHVyblBhdGg7Ci19Ci0KLS8vYnVpbGRzIHRyZWUgcGF0aAotZnVuY3Rpb24gYnVpbGRUcmVlUGF0aExvY2F0aW9uKCkKLXsKLQl2YXIgdGhlRGVsaW1pdGVyID0gIiMjKiI7Ci0JdmFyIHRoaXNQYWdlID0gImFwcGxldC9ydXBfdG9wbmF2Lmh0bSI7Ci0JdmFyIHRoZUxvYyA9ICIiOwotCi0KLQotCWlmKGNoZWNrVHJlZUxvYWRlZCgpKQotCXsKLQkJdmFyIHRoZUN1cnJlbnRMb2NhdGlvbiA9IHBhcmVudC5vcnlfZG9jLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7Ci0JCXRoaXNQYWdlID0gY2FsY3VsYXRDdXJyZW50UGFnZSh0aGVDdXJyZW50TG9jYXRpb24pOwotCi0JCS8vYWxlcnQoIlBhdGhOYW1lOiIgKyB0aGlzUGFnZSk7Ci0KLQkJLy9hbGVydCgiVHJ5aW5nIHRvIGZpbmQgdGhlIHBhdGggZm9yID0+IiArIHRoZUN1cnJlbnRMb2NhdGlvbik7Ci0KLQkJdmFyIHRoZVBhdGggPSBwYXJlbnQub3J5X3RvYy5kb2N1bWVudC5SdXBQcmVzZW50ZXJBcHBsZXQuZ2V0VHJlZVBhdGhBcnJheSh0aGVDdXJyZW50TG9jYXRpb24pOwotCi0JCS8vYWxlcnQoIlRoZSBUcmVlIFBhdGg6ICIgKyB0aGVQYXRoKTsKLQotCQl0aGVQYXRoU3RyaW5nID0gdGhlUGF0aCArICIiOwotICAgIAkJYXJyYXlGcm9tU3RyaW5nID0gdGhlUGF0aFN0cmluZy5zcGxpdCh0aGVEZWxpbWl0ZXIpOwotCi0JCS8vYnVpbGQgdGhlIHBhdGggZnJvbSB0aGUgYXJyYXkKLQkJLy9wYXJhbSAxID0gcGF0aCB0byBpY29uLCBwYXJhbSAyIC0gbGFiZWwsIHBhcmFtIDMgLSBwYXRoIHRvIGZpbGUKLQkJdmFyIGNvdW50ZXIgPSAwOwotCQl2YXIgdGhlTGFiZWw7Ci0JCXZhciB0aGVSZWxQYXRoOwotCQlpZiAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCA+IDIpCi0JCXsKLQkJICAgdGhlTG9jID0gIiI7Ci0JCSAgIGZvcih2YXIgaSA9IDA7IGkgPCAoYXJyYXlGcm9tU3RyaW5nLmxlbmd0aCAtIDEpIDsgaSsrKQotCQkgICB7Ci0JCQkvL2l0J3MgdGhlIGljb24gcGF0aAotCQkJaWYgKGNvdW50ZXIgPCAyKQotCQkJewotCQkJCWlmIChjb3VudGVyID4gMCkKLQkJCQl7Ci0JCQkJCXRoZUxvYyA9IHRoZUxvYyArICIgJmd0OyAiOwotCQkJCX0KLQotCQkJCS8vYWxlcnQoIkNhbGN1bGF0aW5nIHBhdGggZnJvbSgxKSAiICsgdGhpc1BhZ2UgKyAiID0+ICIgKyBhcnJheUZyb21TdHJpbmdbaV0pOwotCi0JCQkJaWYgKGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCJcXCIpID09IC0xICYmIGFycmF5RnJvbVN0cmluZ1tpXS5pbmRleE9mKCIvIikgPT0gLTEpCi0JCQkJewotCQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikKLQkJCQkJewotCQkJCQkJdGhlUmVsUGF0aCA9ICJhcHBsZXQvaW1hZ2VzLyIgKyBhcnJheUZyb21TdHJpbmdbaV07Ci0JCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCB0aGVSZWxQYXRoKTsKLQkJCQkJfQotCQkJCQkvL2FsZXJ0KCJNb2RpZnlpbmcgUGF0aCA9PiAiICsgdGhlUmVsUGF0aCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGVSZWxQYXRoID0gY2FsY3VsYXRlUmVsYXRpdmVQYXRoKHRoaXNQYWdlLCBhcnJheUZyb21TdHJpbmdbaV0pOwotCQkJCX0KLQotCQkJCWlmICh0aGVSZWxQYXRoICE9ICJudWxsIikKLQkJCQl7Ci0JCQkJCXRoZUxvYyA9IHRoZUxvYyArCi0JCQkJCQkgIjxpbWcgYm9yZGVyPTAgc3JjPVwiIiArCi0JCQkJCQkgdGhlUmVsUGF0aCAgKwotCQkJCQkJICJcIj4iOwotCQkJCX0KLQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOwotCQkJCWNvdW50ZXIgPSAyOwotCQkJfQotCQkJLy8gaXQncyB0aGUgbGFiZWwKLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMikKLQkJCXsKLQkJCQl0aGVMYWJlbCA9IGFycmF5RnJvbVN0cmluZ1tpXTsKLQkJCQljb3VudGVyID0gMzsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvdW50ZXIgPT0gMykKLQkJCXsKLQkJCQkvL2FsZXJ0KCJDYWxjdWxhdGluZyBwYXRoIGZyb20oMykgIiArIHRoaXNQYWdlICsgIiA9PiAiICsgYXJyYXlGcm9tU3RyaW5nW2ldKTsKLQkJCQlpZiAoYXJyYXlGcm9tU3RyaW5nW2ldICE9ICJudWxsIikKLQkJCQl7Ci0JCQkJCXRoZVJlbFBhdGggPSBjYWxjdWxhdGVSZWxhdGl2ZVBhdGgodGhpc1BhZ2UsIGFycmF5RnJvbVN0cmluZ1tpXSk7Ci0JCQkJCWlmICh0aGVSZWxQYXRoICE9ICIiKSB7Ci0JCQkJCQl0aGVMb2MgPSB0aGVMb2MgKwotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCIgdGFyZ2V0PVwib3J5X2RvY1wiIGhyZWY9XCIiICsKLQkJCQkJCQkgdGhlUmVsUGF0aCArCi0JCQkJCSAJCSJcIj4iICsKLQkJCQkJIAkJdGhlTGFiZWwgKwotCQkJCQkgCQkiPFwvYT5cbiI7Ci0JCQkJCSB9Ci0JCQkJCSBlbHNlIHsKLQkJCQkJIAl0aGVMb2MgPSB0aGVMb2MgKwotCQkJCQkgCQkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKwotCQkJCQkgCQl0aGVMYWJlbCArCi0JCQkJCSAJCSI8XC9hPlxuIjsKLQkJCQkJIH0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJdGhlTG9jID0gdGhlTG9jICsKLQkJCQkJIAkiPGEgY2xhc3M9XCJob3R0ZXh0XCI+IiAgKwotCQkJCQkgCXRoZUxhYmVsICsKLQkJCQkJIAkiPFwvYT5cbiI7Ci0JCQkJfQotCQkJCS8vYWxlcnQoInRoZSBjdXJyIHBhdGg9PiIgKyB0aGVMb2MpOwotCQkJCWNvdW50ZXIgPSAxOwotCQkJCXRoZVJlbFBhdGggPSAibnVsbCI7Ci0JCQkJdGhlTGFiZWwgPSAibnVsbCI7Ci0JCQl9Ci0JCSAgIH0KLQotCQkvL2FsZXJ0KCJGaW5pc2hlZCBCdWlsZGluZyA9PiAiICsgdGhlTG9jKTsKLQkJfQotCi0JfQotCi0JLy90aGVMb2MgPSAiQ3VycmVudCBMb2NhdGlvbiZuYnNwOyYjMDQ1OyZuYnNwOyIgKyB0aGVMb2M7Ci0KLQkvL2FsZXJ0KCJ0aGUgRmluYWwgU3RyaW5nPT4iICsgdGhlTG9jKTsKLQotCS8vZG9jdW1lbnQud3JpdGUodGhlTG9jKTsKLQlyZXR1cm4gdGhlTG9jOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvdHJlZWJyb3dzZXIuanMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NjcmlwdHMvdHJlZWJyb3dzZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MjQ2ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zY3JpcHRzL3RyZWVicm93c2VyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEhlcmUgZGVmaW5lcyBhbGwgdGhlIEkxOE4gc3BlY2lmaWMgbWVzc2FnZXMgdXNlZCBpbiB0aGUgamF2YXNjcmlwdHMKLXZhciB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSA9ICJUaGUgY29uZmlndXJhdGlvbiBpcyBhbHJlYWR5IGRpc3BsYXllZCB1c2luZyB2aWV3cyI7Ci12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTIgPSAiRGlzcGxheSB2aWV3cyI7Ci12YXIgdHJlZWJyb3dzZXJfanNfTUVTU0FHRTMgPSAiSG9tZSI7Ci0KLWZ1bmN0aW9uIGxvYWRUb3AoKQotewotICBpZihwYXJlbnQuZnJhbWVzLmxlbmd0aCE9MCAmJiAocGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIgfHwgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvY19mcmFtZSIpICkKLSAgewotICAgICBhbGVydCh0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMSk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotICAgIAkKLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IAotCXZhciBuZXdfb3J5X2RvY19sb2MgPSBudWxsOyAKLQlpZiAoICBtYWluSW5kZXhfYSAhPSBudWxsICkgeyAKLSAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbWFpbkluZGV4X2EuaXRlbSgwKS5ocmVmOyAKLQl9IAotCi0gICAgaWYobmV3X29yeV9kb2NfbG9jIT1udWxsKQotICAgIHsKLQlpZiggc2VsZi5uYW1lID09ICJvcnlfZG9jIiApCi0JewotCQl3aW5kb3cuY2xvc2UoKTsKLQkJd2luZG93Lm9wZW4oIG5ld19vcnlfZG9jX2xvYyApOwkJCi0JfQotCWVsc2UKLQl7Ci0JICAgICAgIAl0b3AubG9jYXRpb24gPSBuZXdfb3J5X2RvY19sb2M7Ci0JfQotICAgIH0KLSAgIH0KLX0KLQotCi0gIGZ1bmN0aW9uIGdldEltYWdlVXJsKGltYWdlKQotICB7Ci0gICAgdmFyIG5ld19vcnlfZG9jX2xvYz1udWxsOyAgICAKLSAgICB2YXIgbWFpbkluZGV4X2EgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSgibWFpbkluZGV4Iik7IAotICAgIG5ld19vcnlfZG9jX2xvYyA9IG1haW5JbmRleF9hLml0ZW0oMCkuaHJlZi5zdWJzdHJpbmcoMCxtYWluSW5kZXhfYS5pdGVtKDApLmhyZWYubGFzdEluZGV4T2YoIi8iKSk7Ci0gICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsKLSAgICByZXR1cm4gbmV3X29yeV9kb2NfbG9jOyAgICAKLSAgfQotCi1NU0ZQaG92ZXIgPQotKCgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSAzICkpIHx8Ci0gICgobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciIpICYmCi0gIChwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApKSk7Ci0KLSAgZnVuY3Rpb24gTVNGUHByZWxvYWQoaW1nKQotICB7Ci0gICAgIHZhciBhPW5ldyBJbWFnZSgpOwotICAgICBhLnNyYz1pbWc7Ci0gICAgIHJldHVybiBhOwotICB9Ci0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL2Rpc3BsYXlfdmlld3NfYS5naWYnKSk7Ci0gICAgfQotCi0KLS8vbmV3IGNvZGUgdG8gZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90Ci12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsKLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7Ci0gICBvcnlfdG9jX2V4aXN0ID0gdHlwZW9mIHBhcmVudC5vcnlfdG9jX2ZyYW1lOwotfQotCi1pZiAob3J5X3RvY19leGlzdCA9PSAidW5kZWZpbmVkIikgewotCWRvY3VtZW50LndyaXRlKCI8YSBjbGFzcz1cImV4cGFuZENvbGxhcHNlTGlua1wiIGhyZWY9XCJKYXZhU2NyaXB0OmxvYWRUb3AoKTtcIiBvbm1vdXNlb3Zlcj1cImlmKE1TRlBob3ZlcikgZG9jdW1lbnRbJ0hvbWUnXS5zcmM9UnVwQmx1ZS5zcmM7IHNlbGYuc3RhdHVzPXRyZWVicm93c2VyX2pzX01FU1NBR0UyOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIiICsgYmFja1BhdGggKyAiaW1hZ2VzL2Rpc3BsYXlfdmlld3MuZ2lmIik7Ci0vL1NUQVJUIE5PTi1UUkFOU0xBVEFCTEUKLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbGlnbj1cImFic21pZGRsZVwiIGFsdD1cIiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICJcIiBuYW1lPVwiIiArIHRyZWVicm93c2VyX2pzX01FU1NBR0UzICsgIlwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiPiIgKyB0cmVlYnJvd3Nlcl9qc19NRVNTQUdFMiArICI8XC9hPiIpOwotLy9FTkQgTk9OLVRSQU5TTEFUQUJMRQotfQotZWxzZSB7Ci0JZG9jdW1lbnQud3JpdGUoIiZuYnNwOyIpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9BcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9DYXBhYmlsaXR5UGF0dGVybi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ2hlY2tsaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NoZWNrbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZjZkOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ2hlY2tsaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0NvbmNlcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ29uY2VwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZjg0ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ29uY2VwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9DdXN0b21DYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvQ3VzdG9tQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGVsaXZlcmFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGVsaXZlcmFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWUyMjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RlbGl2ZXJhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWJkNDc2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGlzY2lwbGluZUdyb3VwaW5nLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTgwODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRGlzY2lwbGluZUdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvRXhhbXBsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9FeGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5NDRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9FeGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0d1aWRlbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9HdWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL0d1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNWZmMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvTWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGY1ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL090aGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL090aGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzZDgwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdGhlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9PdXRjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTAzZGEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4MDc1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9SZXBvcnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmVwb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyYzg1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9SZXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUmV1c2FibGVBc3NldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9SZXVzYWJsZUFzc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyMjdmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9SZXVzYWJsZUFzc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvYWRtYXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9hZG1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTkxMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9hZG1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZURlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTUyNGFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1JvbGVTZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvUm9sZVNldEdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvU3VtbWFyeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9TdW1tYXJ5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhODhmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9TdW1tYXJ5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1N1cHBvcnRpbmdNYXRlcmlhbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWEyMWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UYXNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1ZjgyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UZXJtRGVmaW5pdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9UZXJtRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjNlNzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVGVybURlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Ub29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1Rvb2xNZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVG9vbE1lbnRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvVG9vbE1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9XaGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1doaXRlcGFwZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI0ODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1dvcmtQcm9kdWN0VHlwZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9Xb3JrUHJvZHVjdFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VjYWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL1dvcmtQcm9kdWN0VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9uZXdfdG9waWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV3X3RvcGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzOTI5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9uZXdfdG9waWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbmV4dC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9uZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyN2ZkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9uZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL25vX25leHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbm9fbmV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNzg4YzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbm9fbmV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9ub19wcmV2aW91cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9ub19wcmV2aW91cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDc4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvbm9fcHJldmlvdXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvcHJldmlvdXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9pbWFnZXMvcHJldmlvdXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTk5OTA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3ByZXZpb3VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3NlYXJjaHJlY29yZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy9zZWFyY2hyZWNvcmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjNkODAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3NlYXJjaHJlY29yZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3NlcnZlcl9zZWFyY2gvc2VhcmNoL2ltYWdlcy90YWJfcGVuY2lsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3RhYl9wZW5jaWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ4NGNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvaW1hZ2VzL3RhYl9wZW5jaWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9zZWFyY2hfcmVzdWx0LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc2VydmVyX3NlYXJjaC9zZWFyY2gvc2VhcmNoX3Jlc3VsdC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzN2Y3NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoL3NlYXJjaC9zZWFyY2hfcmVzdWx0LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0KLSBSZXN0cmljdGVkIE1hdGVyaWFscyBvZiBJQk0gIC0gTW9kaWZpY2F0aW9uIGlzIHByb2hpYml0ZWQuCi0KLSAoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA0LCAyMDA3LiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLQotIE5vdGUgdG8gVS5TLiBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzOiAgVXNlLCBkdXBsaWNhdGlvbiBvcgotIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQICBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotLS0+Ci08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIgotCXhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgotCXhtbG5zOnhhbGFuPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4iCi0JZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhhbGFuIj4KLQkKLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgeGFsYW46b21pdC1tZXRhLXRhZz0ieWVzIiB4YWxhbjp1c2UtdXJsLWVzY2FwaW5nPSJubyIvPgotCQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL1NlYXJjaFJlc3VsdCI+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJpbml0UGFnZU51bSIgc2VsZWN0PSJAaW5pdFBhZ2VOdW0iLz4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9Im1heFBhZ2VOdW0iIHNlbGVjdD0iQG1heFBhZ2VOdW0iLz4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9Im5leHRFbmFibGVkIiBzZWxlY3Q9IkBuZXh0RW5hYmxlZCIvPgotCTx4c2w6dmFyaWFibGUgbmFtZT0icHJldkVuYWJsZWQiIHNlbGVjdD0iQHByZXZFbmFibGVkIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJuZXh0VGV4dCIgc2VsZWN0PSJAbmV4dFRleHQiLz4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXZUZXh0IiBzZWxlY3Q9IkBwcmV2VGV4dCIvPgkKLQk8eHNsOnZhcmlhYmxlIG5hbWU9ImltYWdlUGF0aCIgc2VsZWN0PSJAaW1hZ2VQYXRoIi8+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWFyY2hTdHJpbmciIHNlbGVjdD0iQHNlYXJjaFN0cmluZyIvPgkKLQk8eHNsOnZhcmlhYmxlIG5hbWU9Im5leHRIcmVmIiBzZWxlY3Q9IkBuZXh0SHJlZiIvPgkKLQk8eHNsOnZhcmlhYmxlIG5hbWU9InByZXZIcmVmIiBzZWxlY3Q9IkBwcmV2SHJlZiIvPgkKLQk8eHNsOnZhcmlhYmxlIG5hbWU9Imljb24iIHNlbGVjdD0iQGljb24iLz4JCi0KLQk8ZGl2IGNsYXNzPSJzZWFyY2hSZXN1bHRQYW5lIj4KLQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSIgPgotCQkJPHRyIGFsaWduPSJ0b3AiPgotCQkJCTx0ZCBhbGlnbj0icmlnaHQiIG5vd3JhcD0ibm93cmFwIj4KLQkJCQkJKDxiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaW5pdFBhZ2VOdW0iLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1heFBhZ2VOdW0iLz48L2I+PHhzbDp0ZXh0PiAvIDwveHNsOnRleHQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0b3RhbEhpdHMiLz4pCi0JCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJPHhzbDp3aGVuIHRlc3Q9IiRwcmV2RW5hYmxlZCA9ICd0cnVlJyI+Ci0JCQkJCQkJPGltZyBvbmNsaWNrPSJqYXZhc2NyaXB0OmdldFByZXZOZXh0UGFnZSgneyRwcmV2SHJlZn0nKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9InN0eWxlLmN1cnNvcj0ncG9pbnRlcic7IiBhbHQ9InskcHJldlRleHR9IiBzcmM9InskaW1hZ2VQYXRofXByZXZpb3VzLmdpZiIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQk8eHNsOm90aGVyd2lzZT4KLQkJCQkJCQk8aW1nIG9uY2xpY2s9IiIgb25tb3VzZW92ZXI9InN0eWxlLmN1cnNvcj0ncG9pbnRlcic7IiBhbHQ9InskcHJldlRleHR9IiBzcmM9InskaW1hZ2VQYXRofW5vX3ByZXZpb3VzLmdpZiIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJPC94c2w6Y2hvb3NlPgotCQkJCQk8eHNsOmNob29zZT4KLQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSIkbmV4dEVuYWJsZWQgPSAndHJ1ZSciPgotCQkJCQkJCTxpbWcgb25jbGljaz0iamF2YXNjcmlwdDpnZXRQcmV2TmV4dFBhZ2UoJ3skbmV4dEhyZWZ9Jyk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JG5leHRUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1uZXh0LmdpZiIvPgotCQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJCTxpbWcgb25jbGljaz0iIiBvbm1vdXNlb3Zlcj0ic3R5bGUuY3Vyc29yPSdwb2ludGVyJzsiIGFsdD0ieyRuZXh0VGV4dH0iIHNyYz0ieyRpbWFnZVBhdGh9bm9fbmV4dC5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCQk8L3hzbDpvdGhlcndpc2U+Ci0JCQkJCTwveHNsOmNob29zZT4KLQkJCQkJJiMxNjA7CSYjMTYwOwotCQkJCTwvdGQ+CQkJCi0JCQk8L3RyPgotCQk8L3RhYmxlPgkKLQk8L2Rpdj48YnIgLz4KLQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iU2VhcmNoSGl0Ij4KLQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJ1cmwiIHNlbGVjdD0iQHVybCIvPgotCQk8ZGl2IGNsYXNzPSJzZWFyY2hIaXQiPgotCQkJPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiA+Ci0JCQkJPHRyPgotCQkJCQk8dGQgYWxpZ249InJpZ2h0Ij4KLQkJCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJAaWNvbiAhPSAnJyI+Ci0JCQkJCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH17QGljb259IiBhbHQ9IiIvPgotCQkJCQkJCTwveHNsOndoZW4+Ci0JCQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQkJCTxpbWcgc3JjPSJ7JGltYWdlUGF0aH1zZWFyY2hyZWNvcmQuZ2lmIiBhbHQ9IiIvPgotCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQkJCTwveHNsOmNob29zZT4JCQkJCQkKLQkJCQkJPC90ZD4KLQkJCQkJPHRkIGFsaWduPSJsZWZ0Ij4KLQkJCQkJCTxhIGhyZWY9InskdXJsfSIgdGFyZ2V0PSJvcnlfZG9jIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRpdGxlIi8+PC9hPgotCQkJCQk8L3RkPgotCQkJCTwvdHI+Ci0JCQkJPHRyPgotCQkJCQk8dGQgYWxpZ249InJpZ2h0Ij48L3RkPgotCQkJCQk8dGQgYWxpZ249ImxlZnQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc3VtbWFyeSIvPjwvdGQ+Ci0JCQkJPC90cj4KLQkJCTwvdGFibGU+Ci0JCTwvZGl2PgotCTwveHNsOmZvci1lYWNoPgotCTxici8+Ci0JPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0JCTx0ciB2YWxpZ249Im1pZGRsZSI+Ci0JCQk8dGQgYWxpZ249InJpZ2h0IiBub3dyYXA9Im5vd3JhcCI+CQkJCQotCQkJCTx4c2w6Y2hvb3NlPgotCQkJCQk8eHNsOndoZW4gdGVzdD0iJHByZXZFbmFibGVkID0gJ3RydWUnIj4KLQkJCQkJCTxpbWcgb25jbGljaz0iamF2YXNjcmlwdDpnZXRQcmV2TmV4dFBhZ2UoJ3skcHJldkhyZWZ9Jyk7IHJldHVybiBmYWxzZTsiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JHByZXZUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1wcmV2aW91cy5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJPGltZyBvbmNsaWNrPSIiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JHByZXZUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1ub19wcmV2aW91cy5naWYiLz48eHNsOnRleHQ+IDwveHNsOnRleHQ+Ci0JCQkJCTwveHNsOm90aGVyd2lzZT4KLQkJCQk8L3hzbDpjaG9vc2U+Ci0JCQkJPHhzbDpjaG9vc2U+Ci0JCQkJCTx4c2w6d2hlbiB0ZXN0PSIkbmV4dEVuYWJsZWQgPSAndHJ1ZSciPgotCQkJCQkJPGltZyBvbmNsaWNrPSJqYXZhc2NyaXB0OmdldFByZXZOZXh0UGFnZSgneyRuZXh0SHJlZn0nKTsgcmV0dXJuIGZhbHNlOyIgb25tb3VzZW92ZXI9InN0eWxlLmN1cnNvcj0ncG9pbnRlcic7IiBhbHQ9InskbmV4dFRleHR9IiBzcmM9InskaW1hZ2VQYXRofW5leHQuZ2lmIi8+Ci0JCQkJCTwveHNsOndoZW4+Ci0JCQkJCTx4c2w6b3RoZXJ3aXNlPgotCQkJCQkJPGltZyBvbmNsaWNrPSIiIG9ubW91c2VvdmVyPSJzdHlsZS5jdXJzb3I9J3BvaW50ZXInOyIgYWx0PSJ7JG5leHRUZXh0fSIgc3JjPSJ7JGltYWdlUGF0aH1ub19uZXh0LmdpZiIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCQkmIzE2MDsJJiMxNjA7Ci0JCQk8L3RkPgkKLQkJPC90cj4KLQk8L3RhYmxlPiAgICAKLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3Nwc2NyZWVuLmh0bSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3BzY3JlZW4uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2FkNmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3BzY3JlZW4uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci0KLQotPCEtLSBSUFcgTUVUQSBEQVRBIFNUQVJUIC0tCi0KLQotLS0gUlBXIE1FVEEgREFUQSBFTkQgLS0+Ci0KLTxodG1sIGxhbmc9ImVuIiB4bWw6bGFuZz0iZW4iPgotCi08aGVhZD4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0icm9wLmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiLz4KLTx0aXRsZT5TcGxhc2ggU2NyZWVuPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLQotCi08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08aDIgYWxpZ249ImNlbnRlciI+UGxlYXNlIHdhaXQgd2hpbGUgdGhlIHRyZWUgYnJvd3NlciBpcyBiZWluZyBsb2FkZWQuLi48YnIvPjwvaDI+Ci08cCBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3A+Ci08IS0tCi08cCBhbGlnbj0iY2VudGVyIj48aW1nIHNyYz0iaW1hZ2VzL3NwbGFzaC5naWYiIGFsdD0iV2VsY29tZSB0byB0aGUgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayIvPjwvcD4KLSAtLT4KLTxici8+Ci08YnIvPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb24uY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb24uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTBhMGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWEKLXsJCi0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi1hLmJhc2ljCi17IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLX0KLQkKLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gLyogZm9udCBmb3IgYWN0aW9uIG9uIGNvbnRlbnQgcGFnZSB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2UgO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbgoteyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxMXB4OwkKLX0gCi0KLWEuY29weXJpZ2h0Ci17IAkKLSAgIGNvbG9yOiAjMzM2Njk5OyAgICAKLQlmb250LXNpemUgOiAxMHB4OwotIH0gIAotIAotYS5uYXZ0cmVlCi17IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLyAKLWEuYWN0aXZldGFiCi0geyAKLSAJY29sb3I6ICMwMDAwMDA7Ci0gCWZvbnQtc2l6ZTogMTJweDsKLSAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgfQotIAotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotIGEubm9uYWN0aXZldGFiCi0gewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtc2l6ZTogMTJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0gCi0gYS5yZWQKLXsKLQljb2xvcjogI2NjMzMwMDsKLX0KLQotYS50b3BiYXIKLXsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZwoteyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotLmJnYmxhY2sKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0gCi0uYmd3aGl0ZQoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gIAotYm9keSAKLXsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI2ZmZmZmZjsgICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkKLX0KLQotLmJvbGQKLXsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLSAuYm90dG9tYmFyZHJrCi17IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDMzNjY7Ci0gfQotCi0KLS5ib3R0b21iYXJsaWdodAoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLmJvdHRvbWJhcnNoYWRvdwoteyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLSAKLS5idXR0b25zCi0gewotICAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0uY29kZQoteyAKLSAgIGZvbnQtZmFtaWx5OiBDb3VyaWVyIE5ldywgQ291cmllciwgbW9ubzsgICAKLSAgIGZvbnQtc2l6ZTogMTJweDsKLSB9Ci0KLSAvKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0uY29udGVudGJvcmRlcgotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0gLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS5jb21tZW50cwoteyAJCi0JZm9udC1zaXplOiAxMXB4OwkKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0uY29weXJpZ2h0Ci17IAotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LXNpemUgOiAxMHB4OwotIH0KLSAKLSAuZGlhbGdieHNoYWRvdzIgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLSAuZGlhbG9ndWVib3hib3JkZXIKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMwotIH0KLSAKLSAuZGlhbG9ndWVib3hiZyAKLXsgIGJhY2tncm91bmQtY29sb3I6ICNkMmQyZDIKLX0KLSAKLS5kaWFsb2d1ZWJveGhpZ2hsaWdodCAKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotIC5kaWFsb2d1ZWJveE1lZGl1bQoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjOGI4YjhiCi0gfQotIAotIC5kaWFsb2d1ZWJveFRpdGxlCi0gewkgICAKLQlmb250LXNpemU6IDE0cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotIAotLmRpdmlkZXIKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjlmMDsKLX0KLSAKLWgxCi17ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE3cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qbWFpbiBoZWFkZXIgZm9yIGZyYW1lIG5hdmlnYXRpb24sIGllLCBjbGVhcmNhc2UgbWVyZ2UgZmlsZXMqLwotLmhlYWRlcm1haW4KLXsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTdweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypyZXBsYWNpbmcgc2lkZW1lbnVfYm9sZGxlZnQgbW92aW5nIGZvcndhcmQqLwotLm5hdmxlZnRib2xkCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qbGVmdCBuYXYgc3VibWVudSovCi0ubmF2bGVmdHN1YgotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLyoubGVmdG1lbnVhY3RpdmUqLwotLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qdXNlIG5hdmxlZnRib2xkIGluc3RlYWQgdG8gd29yayBpbiBOUzYqLwotLnNpZGVtZW51X2JvbGRsZWZ0Ci17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zaWRlbWVudV9idWxsZXRfY29sb3JlZAotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0ubGVmdG1lbnUKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLnNpZGVtZW51X2J1bGxldF9ncmV5Ci0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5zaWRlbWVudV9zdGFuZGFyZAotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNpZGVtZW51X3N0YW5kYXJkX3NlbGVjdGVkCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0udGV4dGdyYXkKLXsgIAotCWNvbG9yOiAjOTk5OTk5OwkKLX0KLQotLmgxCi17ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIwcHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5oZWFkZXJibHVlCi17Ci0JY29sb3I6ICMwMDY2OTk7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotaQotewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLWlucHV0Ci17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTJweDsKLX0gCi0KLWlucHV0LnB4MjUKLXsKLSAgICB3aWR0aDogMjVweAotfQotCi1pbnB1dC5weDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFLCBidXQgTlMKLSovCi1pbnB1dC5tYXg1MAotewotCXdpZHRoOiAzNjBweDsKLX0KLQotaW5wdXQucHg4NQotewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLWlucHV0LnB4MTM1Ci17Ci0gICAgd2lkdGg6IDEzNXB4Ci19Ci0KLQotaW5wdXQucHgxNTUKLXsKLSAgICB3aWR0aDogMTU1cHgKLX0KLQotaW5wdXQucHgyMzAKLXsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotCi1pbnB1dC5weDMwNQotewotICAgIHdpZHRoOiAzMDVweDsKLX0KLQotLmxlZnRuYXZoZWFkIAotIHsKLSAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLQlmb250LXNpemU6IDEzcHg7CQotfSAKLQotLmxlZnRuYXZsYWJlbAotewotY29sb3I6ICMwMDAwMDA7Ci1mb250LXdlaWdodCA6IDYwMDsKLWZvbnQtc2l6ZTogMTFweDsKLSB9Ci0gCi0vKnRvcG5hdiovIAotLm1pZGJhcmxpZ2h0Ci17IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotCi0vKnRvcG5hdiovIAotIC5taWRiYXJtZWQKLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9Ci0gIAotLnBhZ2Vib2xkCi17IAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwkKLSB9Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMKLXsgCi0JY29sb3I6ICM2NzY3Njc7CQotCWZvbnQtc2l6ZTogMTFweDsKLQkgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotIC8qdXNlIGZvciBwb3B1cG1lbnVzIGJ1dCBub3QgaW5jbHVkaW5nIHRvcCBuYXYqLwotLnBvcHVwdGV4dAotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfSAKLSAKLXNlbGVjdAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLXNlbGVjdC5zZWxweDE0NAotewotICAgIHdpZHRoOiAxNDRweDsKLX0KLQotLnNtYWxsdGV4dAotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS50YWJsZWhlYWRlcgoteyAgCi0JY29sb3I6ICMzMzMzMzM7CQotCWZvbnQtc2l6ZTogMTNweDsJCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkCi17Ci0gIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi19Ci0KLXRkLmFjdGl2ZXRhYgotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi0geyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2M0YzRjNDsKLSAgfQotIAotIHRkLm5vbmFjdGl2ZXRhYgotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0udGRMaWdodAotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0vKmRhcmsgZ3JleSBjZWxsIGJhY2tncm91bmQgYW5kIGJvbGQgdGV4dCAqLwotIC50ZERhcmtCb2xkCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS50b3BmcmFtZWJnIAoteyAgYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLnRvcGZyYW1lYmdHcmV5ZWQKLXsgIGJhY2tncm91bmQtY29sb3I6ICNlZGVkZWQ7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodCAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogI2I2YjViNTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0R3JleWVkCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICNlMWUxZTE7Ci19Ci0KLS50b3BmcmFtZXNoYWRvdyAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLnRvcGZyYW1lc2hhZG93R3JleWVkCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICNjZWNlY2U7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodDIgCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotIC50b3BmcmFtZWhpZ2hsaWdodDJHcmV5ZWQKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTsKLSB9IAotIAotIC50b3BmcmFtZWxvZ29iZyAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLnRvcGZyYW1lbG9nb2JnR3JleWVkCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICM5OWMyZDY7Ci19Ci0KLS50b3BsZWZ0bmF2Ci17CQotICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS50b3BsZWZ0bmF2R3JleWVkCi17CQotICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICBjb2xvcjogIzk5OTk5OTsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCX0KLQotLnRvcGxlZnRuYXZib2xkIAoteyAKLWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMHB4OyAKLXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi1mb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRvcGxlZnRuYXZib2xkR3JleWVkCi17IAotZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxMHB4OyAKLWNvbG9yOiAjOTk5OTk5OwotdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9wcmlnaHRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcGJhcmRpdmlkZXIKLSB7IAotIGJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2MgCi0gfQotCi0gLnRvcGJhcmRpdmlkZXJHcmV5ZWQKLSB7IAotIGJhY2tncm91bmQtY29sb3I6ICNhZGQ2ZWIKLSB9ICAKLQotIHRyLmJnbWlkZnJhbWUKLSAvKiB0aGlzIHdhcyBpbml0aWFsbHkgZGVjbGFyZWQgdGhlIHNhbWUgY29sb3VyIGFzIHRoZSBjbGFzcyB0b3BmcmFtZSBiZyBidXQgYmVjYXVzZSBpdCBsaWVzIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uYWwgYXJlYSwgaGFzIGJlZW4gcmVjcmVhdGVkIGhlcmUgICovCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLSAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Fkdi5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHYuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDU5MmE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Fkdi5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGJvdGggbGluayBhbmQgIG5vLWxpbmsgdGV4dCovCi0KLWEgewotCWNvbG9yOiAjMzM2Njk5OwotfQotCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluayB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIGFjdGlvbjtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25zZWxlY3RvciB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLWEuYnJlYWRjcnVtYnMgewkKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBEZXNjb3BlZCwgSXQncyBub3QgdXNlZCBpbiBjdXJyZW50IHByb2plY3RzLCB0byBiZSBhcmNoaXZlZCBhZnRlciA2IG1vbnRocy4gQWxpIFJva25pLCAwOS8wOS8wMiAqLwotLyogZm9yIGNvbnRleHQgdG9vbGJhciBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogIzMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjpob3ZlciB7Ci0JY29sb3I6ICMzMzMzMzM7Ci19Ci0KLWEuY29weXJpZ2h0IHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LXNpemU6IDEwcHg7Ci19IAotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAKLQotLypuYXZ0cmVlIGl0ZW0gb3IgZG9jKi8KLWEubmF2dHJlZWl0ZW0gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLypzaXRlbWFwIGhlYWRlciovCi1hLnNpdGVtYXBoIHsKLQlmb250LXNpemU6IDE3cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp1c2VkIGluIGZvcmdvdCBwYXNzd29yZCwgYW55IG90aGVyIHNtYWxsIHRleHQgbGlua3MqLwotYS5zbWFsbCB7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi1iIHsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypzdGFuZGFyZCB0ZXh0Ki8gIAotLmJhc2ljIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLmJnYmFzaWMgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKTsgdXNlIGJnYmFzaWMgKi8KLS5iZ3doaXRlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovICAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0uYm9yZGVyZHJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0vKnVzZSBpbiBwb3B1cHMgYXMgYm9yZGVycyBpbiBNdWx0aXNpdGUqLyAKLS5ib3JkZXJwb3B1cCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLypib3JkZXJzIHVzZWQgYXJvdW5kIGRhdGEsIHNlZSBSVVAqLyAKLS5ib3JkZXJ0YmwgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8gCi0uYm9yZGVydGJsMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzIHsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qdXNlZCBpbiB0b3BuYXYgLCBzaW1pbGFyIHRvIGNvbnRleHQgdG9vbGJhciovCi0uYnV0dG9uIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmRlc2NvcGVkOyB1c2UgYnV0dG9uIGluc3RlYWQ7IHVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbjMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qYWN0aXZlIG5hdmlnYXRpb24gYnV0dG9uLCBub3QgZm9ybSBidXR0b25zKi8gCi0uYnV0dG9ub24gewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMsIG5vdCBmb3JtIGJ1dHRvbnMqLyAKLS5idXR0b25zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGEuYnV0dG9uOyB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotLmJ1dHRvbnR4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBkaXNhYmxlZCBzdGF0ZSBvZiBub24taW1hZ2UgYnV0dG9uKi8gCi0uYnV0dG9udHh0ZHNibCB7Ci0JY29sb3I6ICM3RTdFN0U7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uY29weXJpZ2h0IHsgCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotfQotCi0vKmJsYWNrIGNvcHlyaWdodCB1c2VkIGluIFJVUCovCi0uY29weXJpZ2h0YiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMHB4OwotfQotCi1kZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCW1hcmdpbi1sZWZ0OiAtMXB4OwotfQotCi0vKmRlZmVjdCBwYWdlIHN1YmhlYWQgLCB1c2VkIGluIHByb2plY3QgY29uc29sZSovCi0uZGVmZWN0c3ViaGQgewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmRpYWxnYnhzaGFkb3cyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0uZGlhbG9ndWVib3hiZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5kaWFsb2d1ZWJveGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLX0KLQotLmRpYWxvZ3VlYm94aGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0uZGlhbG9ndWVib3htZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICM4QjhCOEI7Ci19Ci0KLWRpdiB7IAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfSAKLQotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLyAKLWRpdi5tYXJnaW5ydCB7Ci0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogN3B4OwotfQotCi1kaXYubWFyZ2lucyB7IAotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjVweDsKLQltYXJnaW4tcmlnaHQ6IDdweDsKLX0KLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAgCi1kaXYubWFyZ2luczIwIHsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogN3B4OwotCW1hcmdpbi10b3A6IDIwcHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci19Ci0KLS8qYWRkcyAxMCBweCBwYWRkaW5nIGFyb3VuZCB0ZXh0Ki8KLWRpdi5wYWQxMCB7Ci0JcGFkZGluZzogMTBweDsKLX0KLQotZGwgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLypyZW1vdmVzIGRlZmF1bHQgYm90dG9tIG1hcmdpbiwgZG9lc24ndCB3b3JrIGluIE5TNC43eCAqLyAgCi1kbC5kYXRhIHsKLQltYXJnaW4tYm90dG9tOiAtMXB4OwotfQotCi0vKnRpdGxlIGZvciBlcnJvciBtZXNzYWdlcyovCi0uZXJyb3IgewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjdweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0uZm9ybXRibGhlYWQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKmN1cnJlbnQgc29ydGVkIGNvbHVtbiovCi0uZm9ybXRibGhlYWRjIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTRFNEU0OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxLCBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLmhlYWRlcjMgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjJweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi1pIHsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9mZiB7Ci0JZmxvYXQ6IHJpZ2h0OwotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6MXB4OwotCXZpc2liaWxpdHk6aGlkZGVuOwotCXdpZHRoOjEwMCU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vbiB7Ci0JZmxvYXQ6IHJpZ2h0OwotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6MXB4OwotCXZpc2liaWxpdHk6c2hvdzsKLQl3aWR0aDogMTAwJTsKLX0KLQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi1pbnB1dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiAxLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSAqLwotaW5wdXQubWF4NTAgewotCXdpZHRoOiAzNjBweDsKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFCi0qLwotaW5wdXQucHg4NSB7Ci0Jd2lkdGg6IDg1cHgKLX0KLQotaW5wdXQucmFkaW8gewotCi19Ci0KLS8qdXNlZCBpbiB0cmVlc2NyaXB0cywgbGVmdG5hdiovCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5ub3RlcyB7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi1wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLS5wYWdlbnVtYmVyIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKnBvcHVwIGhlYWRlciovCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLS8qdXNlZCBpbiB0cmVlc2NyaXB0cyovCi0ucG9wbGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICNGMEYwRjA7Ci0JYm9yZGVyOiB0aGluIHNvbGlkICNDQ0NDQ0M7Ci0JbGVmdDogMjEwcHg7CS8qIGl0J3Mgbm90IHdvcmtpbmcgb24gbnMgNi4yLCBpZSA1LjUsIGllIDYgYW5kIG5zIDcsIHBvc3NpYmx5IGNhbiBiZSByZW1vdmVkIHNhZmVseSwgQWxpIFJva25pLCAwOS8xOC8wMiovCi0JcGFkZGluZzogMnB4OwotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQl0b3A6IDI1cHg7CS8qIGl0J3Mgbm90IHdvcmtpbmcgb24gbnMgNi4yLCBpZSA1LjUsIGllIDYgYW5kIG5zIDcsIHBvc3NpYmx5IGNhbiBiZSByZW1vdmVkIHNhZmVseSwgQWxpIFJva25pLCAwOS8xOC8wMiovCi0JdmlzaWJpbGl0eTogaGlkZGVuOwotCXdpZHRoOiBhdXRvOwotCXotaW5kZXg6IDEwOwotfQotCi0vKnByb2dyZXNzYmFyIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8KLS5wcm9ncmVzc2JhcmJyZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLX0KLQotc2VsZWN0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGJ1dHRvbnMzOyB1c2VkIGluIHRvcG5hdiovCi0uc21hbGx0ZXh0IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLX0KLQotLyogdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLXRkLmJ1dHRvbmJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNENEQ0RDQ7Ci19Ci0KLS8qIGRpc2FibGVkIHZlcnNpb24gKi8gCi10ZC5idXR0b25ib2R5ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKTsgdXNlIGJnYmFzaWMgKi8KLXRkLmJ1dHRvbmhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypub24taW1hZ2UgYnV0dG9uKi8KLXRkLmJ1dHRvbnNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZENkQ2RDsKLX0KLQotLyogbm9uLWltYWdlIGJ1dHRvbi0tZGlzYWJsZWQgdmVyc2lvbiAqLwotdGQuYnV0dG9uc2hhZG93ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0EyQTJBMjsKLX0KLQotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19ICAgCi0KLS8qZ3JheSBkYXRhIGhpZ2hsaWdodCBvciBwYWdlIGJhY2tncm91bmQqLyAKLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotdGV4dGFyZWEgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BiYXJkaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OUNDOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lYmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGJvcmRlcnRibDM7IHVzZWQgaW4gY29udGVudCBhcmVhIGFzIGEgaG9yaXpvbnRhbCBkaXYgaW4gTXVsdGlzaXRlKi8KLS50b3BmcmFtZWJnZ3JleWVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRURFREVEOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1laGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQjZCNUI1OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1laGlnaGxpZ2h0MiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWxvZ29iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZXNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLypnbG9iYWwgaWNvbiBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXYgewkKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmdsb2JhbCBpbnB1dCBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXZib2xkIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdGV4dCBvbiB0b3BuYXYsIHRvcCByaWdodCBzZWN0aW9uKi8KLS50b3ByaWdodG5hdiB7Ci0JY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleSAKLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBzcXVhcmU7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHZVTlguY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYWR2VU5YLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5NTBhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9hZHZVTlguY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyptdXN0IGFkZCBmb250IHR5cGUgaWYgY2xhc3MgaXMgYmVpbmcgdXNlZCBhcyBhIGxpbmsgYXMgd2VsbCBhcyBuby1saW5rKi8KLQotYSB7Ci0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi0vKiBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9ubGluayB7Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0gCi0vKiBmb250IGZvciBhY3Rpb247aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uc2VsZWN0b3IgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotYS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLWEuYnJlYWRjcnVtYnMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIERlc2NvcGVkLCBJdCdzIG5vdCB1c2VkIGluIGN1cnJlbnQgcHJvamVjdHMsIHRvIGJlIGFyY2hpdmVkIGFmdGVyIDYgbW9udGhzLiBBbGkgUm9rbmksIDA5LzA5LzAyICovCi0vKiBmb3IgY29udGV4dCB0b29sYmFyIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogIzMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjpob3ZlciB7Ci0JY29sb3I6ICMzMzMzMzM7Ci19Ci0KLWEuY29weXJpZ2h0IHsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDE1cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIG9uIHdoaXRlIGJhY2tncm91bmQqLwotLmFjdGlvbnNlbGVjdDIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyphY3Rpb25iYXIgYXBwZWFycyBvbiB0b3AgYW5kL29yIGJvdHRvbSBvZiBwYWdlKi8KLS5hY3Rpb25zZWxlY3RvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qY29sdW1uIGhlYWRpbmdzKi8KLWEuZm9ybXRibGhlYWQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gLypuYXZ0cmVlIGl0ZW0gb3IgZG9jKi8KLWEubmF2dHJlZWl0ZW0gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qc2l0ZW1hcCBoZWFkZXIqLwotYS5zaXRlbWFwaCB7Ci0JZm9udC1zaXplOiAyNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlZCBpbiBmb3Jnb3QgcGFzc3dvcmQsIGFueSBvdGhlciBzbWFsbCB0ZXh0IGxpbmtzKi8KLWEuc21hbGwgewotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotYiB7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypzdGFuZGFyZCB0ZXh0Ki8KLS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5iZ2Jhc2ljIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi0uYmd3aGl0ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJvbGQgewotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS5ib3JkZXJkcmsgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qdXNlIGluIHBvcHVwcyBhcyBib3JkZXJzIGluIE11bHRpc2l0ZSovIAotLmJvcmRlcnBvcHVwIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0vKmJvcmRlcnMgdXNlZCBhcm91bmQgZGF0YSwgc2VlIFJVUCovCi0uYm9yZGVydGJsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmRlc2lnbiBlbGVtZW50IHNpbXVsYXRpbmcgYSBkaW1lbnNpb25hbCBib3VuZGFyeSB0byBhIHRhYmxlICovIAotLmJvcmRlcnRibDJ7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0JEQkRCRDsKLX0KLQotLyp1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0uYm9yZGVydGJsMyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLmJyZWFkY3J1bWJzewotZm9udC1zaXplOiAxMXB4OwotfQotCi0vKnVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypkZXNjcGVkOyB1c2UgYnV0dG9uIGluc3RlYWQ7IHVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbjMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qYWN0aXZlIHN0YXRlIG9mIG5hdmlnYXRpb24gYnV0dG9uIGluIGNvbnRleHQgdG9vbGJhciovIAotLmJ1dHRvbm9uIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm5hdmlnYXRpb24gYnV0dG9ucyBpbiBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYS5idXR0b247IHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYWxpemF0aW9uKi8KLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGlzYWJsZWQgc3RhdGUgb2Ygbm9uLWltYWdlIGJ1dHRvbiovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmJsYWNrIGNvcHlyaWdodCB1c2VkIGluIFJVUCovCi0uY29weXJpZ2h0YiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi1kZCB7Ci1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JbWFyZ2luLWxlZnQ6IC0xcHg7Ci19Ci0KLS8qZGVmZWN0IHBhZ2Ugc3ViaGVhZCAsIHVzZWQgaW4gcHJvamVjdCBjb25zb2xlKi8KLS5kZWZlY3RzdWJoZCB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5kaWFsZ2J4c2hhZG93MiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uZGlhbG9ndWVib3hib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci19Ci0KLS5kaWFsb2d1ZWJveGhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLmRpYWxvZ3VlYm94bWVkaXVtIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOEI4QjhCOwotfQotCi1kaXYgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjVweDsKLX0KLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjBweDsKLX0KLQotLyphZGRzIDEwIHB4IHBhZGRpbmcgYXJvdW5kIHRleHQqLwotZGl2LnBhZDEwIHsKLQlwYWRkaW5nOiAxMHB4OwotfQotCi1kbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotfQotCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovIAotZGwuZGF0YSB7Ci0JbWFyZ2luLWJvdHRvbTogLTFweDsKLX0KLQotLyp0aXRsZSBmb3IgZXJyb3IgbWVzc2FnZXMqLwotLmVycm9yIHsKLQljb2xvcjogI0NDMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMwcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKmN1cnJlbnQgc29ydGVkIGNvbHVtbiovCi0uZm9ybXRibGhlYWRjIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTRFNEU0OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmhlYWRlcnMgd2l0aGluIHBhZ2UqLwotLmhlYWRlcjIgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjhweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0vKnVzdWFsbHkgdXNlZCBuZXh0IHRvIGhlYWRlcjE7IGZvciBkb2N1bWVudCByb290IGZvbGRlciovCi0uaGVhZGVyMyB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLWkgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLS8qdXNlZCBpbiBjb250cm9sc3RyaXAqLwotLmljb25vZmYgewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAxcHg7Ci0JdmlzaWJpbGl0eTogaGlkZGVuOwotCXdpZHRoOiAxMDAlOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub24gewotCWZsb2F0OiByaWdodDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAxcHg7Ci0JdmlzaWJpbGl0eTpzaG93OwotCXdpZHRoOiAxMDAlOwotfQotCi0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotCXdpZHRoOiA4NXB4OwotfQotCi1pbnB1dC5yYWRpbyB7IAotCi19Ci0KLSAvKnVzZWQgaW4gdHJlZXNjcmlwdHMsIGxlZnRuYXYqLwotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubm90ZXMgewotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qcG9wdXAgaGVhZGVyKi8KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAyNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMqLwotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCAjQ0NDQ0NDOwotCWxlZnQ6IDIxMHB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwkKLX0KLQotLypwcm9ncmVzc2JhciBib3JkZXJzIGluIE11bHRpc2l0ZSovCi0ucHJvZ3Jlc3NiYXJicmQgewotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci19Ci0KLXNlbGVjdCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBidXR0b25zMzsgdXNlZCBpbiB0b3BuYXYqLwotLnNtYWxsdGV4dCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci19Ci0KLSAvKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0Q0RDRENDsKLX0KLQotLyogZGlzYWJsZWQgdmVyc2lvbiAqLwotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLSAvKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGxpZ2h0IGdyYXkqLwotdGQudGJsaGlnaGx0MyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypncmF5IGRhdGEgaGlnaGxpZ2h0IG9yIHBhZ2UgYmFja2dyb3VuZCovIAotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi10ZXh0YXJlYSB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGJhcmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Q0M7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWViZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0QyRDJEMjsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLXVzZSBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVsb2dvYmcgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wZnJhbWVzaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS8qZ2xvYmFsIGljb24gb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2IHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmdsb2JhbCBpbnB1dCBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXZib2xkIHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYnJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdGV4dCBvbiB0b3BuYXYsIHRvcCByaWdodCBzZWN0aW9uKi8KLS50b3ByaWdodG5hdiB7Ci0JY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7IGRvZXNuJ3Qgd29yayBmb3IgbnM0Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvY29tbW9uX2Jhc2UuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YmI1MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gLyogRGVzY29wZWQsIEl0J3Mgbm90IHVzZWQgaW4gY3VycmVudCBwcm9qZWN0cywgdG8gYmUgYXJjaGl2ZWQgYWZ0ZXIgNiBtb250aHMuIEFsaSBSb2tuaSwgMDkvMDkvMDIgKi8KLS8qIGFjdGlvbiB0ZXh0IHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZTtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25saW5rIHsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLyogZm9udCBmb3IgYWN0aW9uO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbnNlbGVjdG9yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLWEuYmFzaWMgewotCWNvbG9yOiAjMDAwMDAwOwotfQotCi1hLmJyZWFkY3J1bWJzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3IgY29udGV4dCB0b29sYmFyIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogMzMzMzMzOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uOmhvdmVyIHsKLQljb2xvcjogMzMzMzMzOwotfQotCi1hLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotfQotCi0vKmFjdGlvbmJhciBvbiB3aGl0ZSBiYWNrZ3JvdW5kKi8KLS5hY3Rpb25zZWxlY3QyIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qYWN0aW9uYmFyIGFwcGVhcnMgb24gdG9wIGFuZC9vciBib3R0b20gb2YgcGFnZSovCi0uYWN0aW9uc2VsZWN0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKmNvbHVtbiBoZWFkaW5ncyovCi1hLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypuYXZ0cmVlIGl0ZW0gb3IgZG9jKi8KLWEubmF2dHJlZWl0ZW0gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qc2l0ZW1hcCBoZWFkZXIqLwotYS5zaXRlbWFwaCB7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlZCBpbiBmb3Jnb3QgcGFzc3dvcmQsIGFueSBvdGhlciBzbWFsbCB0ZXh0IGxpbmtzKi8KLWEuc21hbGwgewotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYiB7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qc3RhbmRhcmQgdGV4dCovCi0uYmFzaWMgewotY29sb3I6ICMwMDAwMDA7Ci1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTJweDsKLWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5iZ2Jhc2ljIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi0uYmd3aGl0ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXJpZ2h0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJvbGQgewotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0uYm9yZGVyZHJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0vKnVzZSBpbiBwb3B1cHMgYXMgYm9yZGVycyBpbiBNdWx0aXNpdGUqLyAKLS5ib3JkZXJwb3B1cCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLypib3JkZXJzIHVzZWQgYXJvdW5kIGRhdGEsIHNlZSBSVVAqLyAKLS5ib3JkZXJ0YmwgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8gCi0uYm9yZGVydGJsMnsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQkRCREJEOwotfQotCi0vKnVzZWQgaW4gY29udGVudCBhcmVhIGFzIGEgaG9yaXpvbnRhbCBkaXYgaW4gTXVsdGlzaXRlKi8KLS5ib3JkZXJ0YmwzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRURFREVEOwotfQotCi0uYnJlYWRjcnVtYnN7IAotZm9udC1zaXplOiAxMXB4OwotfQotCi0vKnVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypkZXNjb3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBzdGF0ZSBvZiBuYXZpZ2F0aW9uIGJ1dHRvbiBpbiBjb250ZXh0IHRvb2xiYXIqLyAKLS5idXR0b25vbiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm5hdmlnYXRpb24gYnV0dG9ucyBpbiBjb250ZXh0IHRvb2xiYXIqLyAKLS5idXR0b25zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktLXVzZSBhLmJ1dHRvbjsgdGhlc2UgYnV0dG9uIHN0eWxlcyBhcmUgZm9yIHRoZSB0ZXh0dWFsIGJ1dHRvbnMgaW50ZW5kZWQgdG8gcmVwbGFjZSBpbWFnZSBjb25zdHJ1Y3RzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLyAKLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGlzYWJsZWQgc3RhdGUgb2Ygbm9uLWltYWdlIGJ1dHRvbiovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxMHB4OwotfQotCi0vKmJsYWNrIGNvcHlyaWdodCB1c2VkIGluIFJVUCovCi0uY29weXJpZ2h0YiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMHB4OwotfQotCi1kZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCW1hcmdpbi1sZWZ0OiAtMXB4OwotfQotIAotLypkZWZlY3QgcGFnZSBzdWJoZWFkICwgdXNlZCBpbiBwcm9qZWN0IGNvbnNvbGUqLwotLmRlZmVjdHN1YmhkIHsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLSAKLS5kaWFsZ2J4c2hhZG93MiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qYmFja2dyb3VuZCBmb3IgbG9naW4gcGFnZXMqLwotLmRpYWxvZ3VlYm94YmcyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uZGlhbG9ndWVib3hib3JkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICMzMzMzMzM7Ci19Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLSAuZGlhbG9ndWVib3htZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICM4QjhCOEI7Ci19Ci0KLWRpdiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnQgewotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLX0KLQotZGl2Lm1hcmdpbnMgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjVweDsKLX0KLQotLypmb3IgcGFnZXMgd2l0aCBidXR0b24gbmF2aWdhdGlvbiBvbiB0b3AqLyAKLWRpdi5tYXJnaW5zMjAgewotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiA3cHg7Ci0JbWFyZ2luLXJpZ2h0OiA3cHg7Ci0JbWFyZ2luLXRvcDogMjBweDsKLX0KLQotLyphZGRzIDEwIHB4IHBhZGRpbmcgYXJvdW5kIHRleHQqLwotZGl2LnBhZDEwIHsKLQlwYWRkaW5nOiAxMHB4OwotfQotCi1kbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovCi1kbC5kYXRhIHsKLQltYXJnaW4tYm90dG9tOiAtMXB4OwotfQotCi0vKnRpdGxlIGZvciBlcnJvciBtZXNzYWdlcyovCi0uZXJyb3IgewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjdweDsKLQlmb250LXdlaWdodDogODAwOwotfQotIAotLmZvcm10YmxoZWFkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKmN1cnJlbnQgc29ydGVkIGNvbHVtbiovCi0uZm9ybXRibGhlYWRjIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTRFNEU0OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjJweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKmhlYWRlcnMgd2l0aGluIHBhZ2UqLwotLmhlYWRlcjIgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTlweDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0vKnVzdWFsbHkgdXNlZCBuZXh0IHRvIGhlYWRlcjEgZm9yIGRvY3VtZW50IHJvb3QgZm9sZGVyKi8KLS5oZWFkZXIzIHsKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotaSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9mZiB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9uIHsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAxcHg7Ci0JdmlzaWJpbGl0eTogc2hvdzsKLX0KLQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi1pbnB1dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0vKiAxLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSAqLwotaW5wdXQubWF4NTAgewotCXdpZHRoOiAzNjBweDsKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFCi0qLwotaW5wdXQucHg4NSB7Ci0Jd2lkdGg6IDg1cHg7Ci19Ci0KLWlucHV0LnJhZGlvewotCW1hcmdpbi10b3A6IC0ycHg7Ci19Ci0KLSAvKnVzZWQgaW4gdHJlZXNjcmlwdHMsIGxlZnRuYXYqLwotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0vKmFkZGVkIGZvciB4c2xfcHJvY2Vzcy0tcmVtb3ZlIDEyLzAyKi8KLS5sZWZ0bmF2dHJlZSB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXdpZHRoOiAyMDBweDsKLQloZWlnaHQ6IDExNXB4OwotCWxlZnQ6IDU7Ci0JdG9wOiAyNTsKLQl2aXNpYmlsaXR5OiB2aXNpYmxlOwotCXotaW5kZXg6IDA7Ci19Ci0KLS5ub3RlcyB7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CQotfQotCi1wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci19Ci0KLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLS5wYWdlbnVtYmVyIHsKLQljb2xvcjogIzY3Njc2NzsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLypmb250IGZvciBwcmV2aW91cyAmIG5leHQgaW4gcGFnaW5hdGlvbiovCi0ucGFnZXN0ZXBzIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLSB9Ci0KLS8qcG9wdXAgaGVhZGVyKi8KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMqLwotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCAjQ0NDQ0NDOwotCWxlZnQ6IDIxMHB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjphYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwkvKiBpdCdzIG5vdCB3b3JraW5nIG9uIG5zIDYuMiwgaWUgNS41LCBpZSA2IGFuZCBucyA3LCBwb3NzaWJseSBjYW4gYmUgcmVtb3ZlZCBzYWZlbHksIEFsaSBSb2tuaSwgMDkvMTgvMDIqLwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLQl3aWR0aDphdXRvOwotCXotaW5kZXg6MTA7CQotfQotCi0vKnByb2dyZXNzYmFyIGJvcmRlcnMgaW4gTXVsdGlzaXRlKi8KLS5wcm9ncmVzc2JhcmJyZHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotfQotIAotc2VsZWN0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlIGJ1dHRvbjM7IHVzZWQgaW4gdG9wbmF2Ki8KLS5zbWFsbHRleHQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0Q0RDRENDsKLX0KLQotIC8qIGRpc2FibGVkIHZlcnNpb24gKi8gCi10ZC5idXR0b25ib2R5ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RBREFEQTsKLX0KLQotLyogZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKTsgdXNlIGJnYmFzaWMgKi8KLXRkLmJ1dHRvbmhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLypub24taW1hZ2UgYnV0dG9uKi8KLXRkLmJ1dHRvbnNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZENkQ2RDsKLX0KLQotLyogbm9uLWltYWdlIGJ1dHRvbi0tZGlzYWJsZWQgdmVyc2lvbiAqLwotdGQuYnV0dG9uc2hhZG93ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0EyQTJBMjsKLX0KLQotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDMgewotCWJhY2tncm91bmQtY29sb3I6ICNFOUU5RTk7Ci19Ci0KLSAvKmdyYXkgZGF0YSBoaWdobGlnaHQgb3IgcGFnZSBiYWNrZ3JvdW5kKi8gCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLXRleHRhcmVhIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wYmFyZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTlDQzsKLX0KLSAKLSAvKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lYmcgewotCWJhY2tncm91bmQtY29sb3I6ICNEMkQyRDI7Ci19Ci0KLS8qZGVzY29wZWQgKHJlbW92ZSBhZnRlciB3YS1sdCByZWxlYXNlKS0tdXNlZCBib3JkZXJ0YmwzOyB1c2VkIGluIGNvbnRlbnQgYXJlYSBhcyBhIGhvcml6b250YWwgZGl2IGluIE11bHRpc2l0ZSovCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VERURFRDsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0I2QjVCNTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWhpZ2hsaWdodDIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lbG9nb2JnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1lc2hhZG93IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0vKmdsb2JhbCBpY29uIG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypnbG9iYWwgaW5wdXQgb3BlcmF0aW9ucyB0b29sYmFyKi8KLS50b3BsZWZ0bmF2Ym9sZCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp0ZXh0IG9uIHRvcG5hdiwgdG9wIHJpZ2h0IHNlY3Rpb24qLwotLnRvcHJpZ2h0bmF2IHsKLQljb2xvcjogI0ZGRkZGRjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wcmlnaHRuYXZncmV5Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsgZG9lc24ndCB3b3JrIGZvciBuczQqLwotdWwgewotCWxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9jb21tb25fYmFzZVVOWC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9iYXNlVU5YLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlYzkxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL2NvbW1vbl9iYXNlVU5YLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDYxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qbXVzdCBhZGQgZm9udCB0eXBlIGlmIGNsYXNzIGlzIGJlaW5nIHVzZWQgYXMgYSBsaW5rIGFzIHdlbGwgYXMgbm8tbGluayovCi0KLWEgewotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotLyogYWN0aW9uIHRleHQgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbmxpbmsgewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwkKLX0KLSAKLS8qIGZvbnQgZm9yIGFjdGlvbjtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25zZWxlY3RvciB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotYS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLWEuYnJlYWRjcnVtYnMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIERlc2NvcGVkLCBJdCdzIG5vdCB1c2VkIGluIGN1cnJlbnQgcHJvamVjdHMsIHRvIGJlIGFyY2hpdmVkIGFmdGVyIDYgbW9udGhzLiBBbGkgUm9rbmksIDA5LzA5LzAyICovCi0vKiBmb3IgY29udGV4dCB0b29sYmFyIGJ1dHRvbnMgaW4gTXVsdGlzaXRlLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uMiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5idXR0b246YWN0aXZlIHsKLQljb2xvcjogIzMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjpob3ZlciB7Ci0JY29sb3I6ICMzMzMzMzM7Ci19Ci0KLWEuY29weXJpZ2h0IHsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci19Ci0KLS8qYWN0aW9uYmFyIG9uIHdoaXRlIGJhY2tncm91bmQqLwotLmFjdGlvbnNlbGVjdDIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyphY3Rpb25iYXIgYXBwZWFycyBvbiB0b3AgYW5kL29yIGJvdHRvbSBvZiBwYWdlKi8KLS5hY3Rpb25zZWxlY3RvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qY29sdW1uIGhlYWRpbmdzKi8KLWEuZm9ybXRibGhlYWQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qbmF2dHJlZSBpdGVtIG9yIGRvYyovCi1hLm5hdnRyZWVpdGVtIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnNpdGVtYXAgaGVhZGVyKi8KLWEuc2l0ZW1hcGh7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlZCBpbiBmb3Jnb3QgcGFzc3dvcmQsIGFueSBvdGhlciBzbWFsbCB0ZXh0IGxpbmtzKi8KLWEuc21hbGwgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotYiB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypzdGFuZGFyZCB0ZXh0Ki8KLS5iYXNpYyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS5iZ2Jhc2ljIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi0uYmd3aGl0ZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLX0KLQotLyogc2l6ZSBpbnB1dCBmb3IgYmFzaWMgdGFncyBzdWNoIGFzIHAgYW5kIGxpIHRoYXQgZG8gbm90IGluaGVyaXQgZnJvbSB0ZCAqLyAKLWJvZHkgewotCWJhY2tncm91bmQtY29sb3IgOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JbWFyZ2luLWxlZnQ6IDBweDsKLQltYXJnaW4tcmlnaHQ6IDBweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLS5ib2xkIHsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0uYm9yZGVyZHJrIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotfQotCi0vKnVzZSBpbiBwb3B1cHMgYXMgYm9yZGVycyBpbiBNdWx0aXNpdGUqLyAKLS5ib3JkZXJwb3B1cCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLX0KLQotLypib3JkZXJzIHVzZWQgYXJvdW5kIGRhdGEsIHNlZSBSVVAqLwotLmJvcmRlcnRibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U5RTlFOTsKLX0KLQotLypkZXNpZ24gZWxlbWVudCBzaW11bGF0aW5nIGEgZGltZW5zaW9uYWwgYm91bmRhcnkgdG8gYSB0YWJsZSAqLyAKLS5ib3JkZXJ0YmwyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQkRCREJEOwotfQotCi0vKnVzZWQgaW4gY29udGVudCBhcmVhIGFzIGEgaG9yaXpvbnRhbCBkaXYgaW4gTXVsdGlzaXRlKi8KLS5ib3JkZXJ0YmwzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRURFREVEOwotfQotCi0uYnJlYWRjcnVtYnMgewotZm9udC1zaXplOiAxMXB4OwotfQotCi0vKnVzZWQgaW4gdG9wbmF2ICwgc2ltaWxhciB0byBjb250ZXh0IHRvb2xiYXIqLwotLmJ1dHRvbiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypkZXNjb3BlZDsgdXNlIGJ1dHRvbiBpbnN0ZWFkOyB1c2VkIGluIHRvcG5hdiAsIHNpbWlsYXIgdG8gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b24zIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKmFjdGl2ZSBzdGF0ZSBvZiBuYXZpZ2F0aW9uIGJ1dHRvbiBpbiBjb250ZXh0IHRvb2xiYXIqLyAKLS5idXR0b25vbiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0RFREVERTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMgaW4gY29udGV4dCB0b29sYmFyKi8KLS5idXR0b25zIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRUZFRkVGOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYS5idXR0b247IHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYWxpemF0aW9uKi8KLS5idXR0b250eHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogZGlzYWJsZWQgc3RhdGUgb2Ygbm9uLWltYWdlIGJ1dHRvbiovIAotLmJ1dHRvbnR4dGRzYmwgewotCWNvbG9yOiAjN0U3RTdFOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmNvcHlyaWdodCB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi0vKmJsYWNrIGNvcHlyaWdodCB1c2VkIGluIFJVUCovCi0uY29weXJpZ2h0YiB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNXB4OwotfQotCi1kZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotCW1hcmdpbi1sZWZ0OiAtMXB4OwotfQotCi0vKmRlZmVjdCBwYWdlIHN1YmhlYWQgLCB1c2VkIGluIHByb2plY3QgY29uc29sZSovCi0uZGVmZWN0c3ViaGQgewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uZGlhbGdieHNoYWRvdzIgewotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS5kaWFsb2d1ZWJveGJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotfQotCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLS5kaWFsb2d1ZWJveG1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhCOEI4QjsKLX0KLQotZGl2IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLyAKLWRpdi5tYXJnaW5ydCB7Ci0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogN3B4OwotfQotCi1kaXYubWFyZ2lucyB7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDdweDsKLQltYXJnaW4tcmlnaHQ6IDdweDsKLQltYXJnaW4tdG9wOiAyNXB4OwotfQotCi0vKmZvciBwYWdlcyB3aXRoIGJ1dHRvbiBuYXZpZ2F0aW9uIG9uIHRvcCovIAotZGl2Lm1hcmdpbnMyMCB7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDdweDsKLQltYXJnaW4tcmlnaHQ6IDdweDsKLQltYXJnaW4tdG9wOiAyMHB4OwkKLX0KLQotLyphZGRzIDEwIHB4IHBhZGRpbmcgYXJvdW5kIHRleHQqLwotZGl2LnBhZDEwIHsKLQlwYWRkaW5nOiAxMHB4OwotfQotCi1kbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotfQotCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovIAotZGwuZGF0YSB7IAotCW1hcmdpbi1ib3R0b206IC0xcHg7Ci19Ci0KLS8qdGl0bGUgZm9yIGVycm9yIG1lc3NhZ2VzKi8KLS5lcnJvciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzMHB4OwotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS5mb3JtdGJsaGVhZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLypjdXJyZW50IHNvcnRlZCBjb2x1bW4qLwotLmZvcm10YmxoZWFkYyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U0RTRFNDsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxIGFuZCBjb250ZW50aGVhZGVyIGxhcmdlKi8KLS5oZWFkZXIxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c3VhbGx5IHVzZWQgbmV4dCB0byBoZWFkZXIxOyBmb3IgZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLmhlYWRlcjMgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMzNweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi1pIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREVERURFOwotfQotCi0vKnVzZWQgaW4gY29udHJvbHN0cmlwKi8KLS5pY29ub2ZmIHsKLQlwb3NpdGlvbjogYWJzb2x1dGU7IAotCXRvcDogMXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsKLX0KLQotLyp1c2VkIGluIGNvbnRyb2xzdHJpcCovCi0uaWNvbm9uIHsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdG9wOiAxcHg7Ci0JdmlzaWJpbGl0eTogc2hvdzsKLX0KLQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi1pbnB1dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKiAxLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSAqLwotaW5wdXQubWF4NTAgewotCXdpZHRoOiAzNjBweDsKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFCi0qLwotaW5wdXQucHg4NSB7Ci0Jd2lkdGg6IDg1cHg7Ci19Ci0KLWlucHV0LnJhZGlvIHsKLQotfQotCi0gLyp1c2VkIGluIHRyZWVzY3JpcHRzLCBsZWZ0bmF2Ki8KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLm5vdGVzIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwotfQotCi0vKmZvbnQgZm9yIHRoZSBudW1iZXJzIGluIHBhZ2luYXRpb24gbGlicmFyeSovCi0ucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qcG9wdXAgaGVhZGVyKi8KLS5wb3BoMSB7Ci0JZm9udC1zaXplOiAyNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0vKnVzZWQgaW4gdHJlZXNjcmlwdHMqLwotLnBvcGxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRjBGMEYwOwotCWJvcmRlcjogdGhpbiBzb2xpZCAjQ0NDQ0NDOyAKLQlsZWZ0OiAyMTBweDsJLyogaXQncyBub3Qgd29ya2luZyBvbiBucyA2LjIsIGllIDUuNSwgaWUgNiBhbmQgbnMgNywgcG9zc2libHkgY2FuIGJlIHJlbW92ZWQgc2FmZWx5LCBBbGkgUm9rbmksIDA5LzE4LzAyKi8KLQlwYWRkaW5nOiAycHg7Ci0JcG9zaXRpb246IGFic29sdXRlOyAKLQl0b3A6IDI1cHg7CS8qIGl0J3Mgbm90IHdvcmtpbmcgb24gbnMgNi4yLCBpZSA1LjUsIGllIDYgYW5kIG5zIDcsIHBvc3NpYmx5IGNhbiBiZSByZW1vdmVkIHNhZmVseSwgQWxpIFJva25pLCAwOS8xOC8wMiovCi0JdmlzaWJpbGl0eTogaGlkZGVuOyAKLQl3aWR0aDo3NXB4OwotCXotaW5kZXg6MTA7Ci19Ci0KLS8qcHJvZ3Jlc3NiYXIgYm9yZGVycyBpbiBNdWx0aXNpdGUqLwotLnByb2dyZXNzYmFyYnJkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OwotfQotCi1zZWxlY3QgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypkZXNjb3BlZCAocmVtb3ZlIGFmdGVyIHdhLWx0IHJlbGVhc2UpLS11c2UgYnV0dG9uczM7IHVzZWQgaW4gdG9wbmF2Ki8KLS5zbWFsbHRleHQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0Q0RDRENDsKLX0KLQotLyogZGlzYWJsZWQgdmVyc2lvbiAqLwotdGQuYnV0dG9uYm9keWRzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS8qIGRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSk7IHVzZSBiZ2Jhc2ljICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci19Ci0KLS8qbm9uLWltYWdlIGJ1dHRvbiovCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2RDZENkQ7Ci19Ci0KLS8qIG5vbi1pbWFnZSBidXR0b24tLWRpc2FibGVkIHZlcnNpb24gKi8KLXRkLmJ1dHRvbnNoYWRvd2RzYmwgewotCWJhY2tncm91bmQtY29sb3I6ICNBMkEyQTI7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gbGlnaHQgZ3JheSovCi10ZC50YmxoaWdobHQzIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRTlFOUU5OwotfQotCi0vKmdyYXkgZGF0YSBoaWdobGlnaHQgb3IgcGFnZSBiYWNrZ3JvdW5kKi8gCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNFRkVGRUY7Ci19Ci0KLXRleHRhcmVhIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLS8qZ2xvYmFsIG5hdiovCi0udG9wYmFyZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTlDQzsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRDJEMkQyOwotfQotCi0vKmRlc2NvcGVkIChyZW1vdmUgYWZ0ZXIgd2EtbHQgcmVsZWFzZSktdXNlIGJvcmRlcnRibDM7IHVzZWQgaW4gY29udGVudCBhcmVhIGFzIGEgaG9yaXpvbnRhbCBkaXYgaW4gTXVsdGlzaXRlKi8KLS50b3BmcmFtZWJnZ3JleWVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRURFREVEOwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1laGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQjZCNUI1OwotfQotCi0vKmdsb2JhbCBuYXYqLwotLnRvcGZyYW1laGlnaGxpZ2h0MiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZWxvZ29iZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLX0KLQotLypnbG9iYWwgbmF2Ki8KLS50b3BmcmFtZXNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLypnbG9iYWwgaWNvbiBvcGVyYXRpb25zIHRvb2xiYXIqLwotLnRvcGxlZnRuYXYgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qZ2xvYmFsIGlucHV0IG9wZXJhdGlvbnMgdG9vbGJhciovCi0udG9wbGVmdG5hdmJvbGQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBicmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTVweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotfQotCi0vKnRleHQgb24gdG9wbmF2LCB0b3AgcmlnaHQgc2VjdGlvbiovCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0udG9wcmlnaHRuYXZncmV5Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypsaXN0LXN0eWxlLWltYWdlOiB1cmwoaW1hZ2VzL2Rvd25idXR0b24uZ2lmKTsgZG9lc24ndCB3b3JrIGZvciBuczQqLwotdWwgewotCWxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9kZXNpZ24uY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9kZXNpZ24uY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGQ5MjQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotIC8qIHRoaXMgaXMgYSBib3JkZXIgc3R5bGUgZm9yIHRoZSB0b3AgbWVudSBib3ggKi8KLSAuYm94dGhpbiB7Ci0JYm9yZGVyLWNvbG9yOiAjRTlFOUU5OwotCWJvcmRlci1zdHlsZTogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQltYXJnaW4tdG9wOiAxZW07Ci0JcGFkZGluZzogMWVtOwotCXdpZHRoOiAyNzVweDsKLX0KLQotIC8qIHRoaXMgaXMgYSBjb250YWluZXIgdG8ga2VlcCB0aGUgdG9wIG1lbnUgaXNvbGF0ZWQgZnJvbSBtYXRlcmlhbCBiZWxvdyBpdCAqLwotLmNvbnRhaW5lciB7Ci0JY2xlYXI6IGJvdGg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLSAvKiBhIHNpbXBsZSBpbnNldCBmb3IgYmxvY2tlZCBlbGVtZW50cyB0byBpbmRlbnQgKi8KLS5pbnNldCB7Ci0JY2xlYXI6IGJvdGg7Ci0JbWFyZ2luLWxlZnQ6IDEzcHg7Ci0JbWFyZ2luLXRvcDogNHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0ubWlkYWxpZ24gewotCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci19Ci0KLSAvKiBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgYmVuZWZpdCBvZiBJLkUuIDUrIHNvIHRoYXQgdGhlIHRvcCBtZW51IGlzIGNvbnN0cmFpbmVkIHRvIGxlZnQgKi8KLS5zcGFjaW5nIHsKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiAxMDBweDsKLX0KLQotIC8qIFRoZSBjbGFzc2VzIGJlbG93IGFsbCByZWxhdGUgdG8gdGhlIHVwcGVyIHJpZ2h0IGJ1dHRvbiBvbiB0aGUgbmF2IGZyYW1lKi8KLQotLndocmJ0biB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXJpZ2h0OiAwOwotCXRvcDogMDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLndocmJ1dHRvbmJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkJGQkZCOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS53aHJidXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQkNCQ0I7Ci19Ci0KLS53aHJidXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ODY4Njg7Ci19Ci0KLS53aHJtYXJnaW57Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLndocm1hcmdpbmJyZHIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLSAvKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciBuZXRzY2FwZSBzbyB0aGF0IHRoZSBzY3JvbGwgYmFyIGRvZXNuJ3QgY292ZXIgdGhlIGJ1dHRvbi4gQW4gaW1hZ2UgaW5zaWRlIG9mIGEgZGl2IGhlbHBzIHB1c2ggdGhlIGJ1dHRvbiB0byB0aGUgbGVmdC4gSGVyZSB0aGUgZGl2IGlzIHNpbXBseSB0dXJuZWQgb2ZmIHNpbmNlIGl0IGlzIHVubmVlZGVkICovCi0ud2hyc3BhY2VyIHsKLQlwb3NpdGlvbjogYWJzb2x1dGU7Ci0JdmlzaWJpbGl0eTogaGlkZGVuOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9kZXNpZ25fbnMuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9kZXNpZ25fbnMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGU2MGU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvZGVzaWduX25zLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLe+7vy8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLmJveHRoaW4gewotCWJvcmRlci1jb2xvcjogI0U5RTlFOTsKLQlib3JkZXItc3R5bGU6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQl3aWR0aDogMjc1cHg7Ci19Ci0KLS5jb250YWluZXIgewotCW1hcmdpbi1sZWZ0OiAxMnB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uY29udGVudCB7Ci0JbWFyZ2luLWxlZnQ6IDEycHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLSAvKiBhIHNpbXBsZSBpbnNldCBmb3IgYmxvY2tlZCBlbGVtZW50cyB0byBpbmRlbnQgKi8KLS5pbnNldCB7Ci0JY2xlYXI6IGJvdGg7Ci0JbWFyZ2luLWxlZnQ6IDEzcHg7Ci0JbWFyZ2luLXRvcDogNHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0ubWlkYWxpZ24gewotCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ci19Ci0KLS5zcGFjaW5nIHsKLX0KLQotIC8qIFRoZSBjbGFzc2VzIGJlbG93IGFsbCByZWxhdGUgdG8gdGhlIHVwcGVyIHJpZ2h0IGJ1dHRvbiBvbiB0aGUgbmF2IGZyYW1lKi8KLQotLndocmJ0biB7Ci0JcG9zaXRpb246IGFic29sdXRlOwotCXRvcDogMDsKLQl3aWR0aDogOTAlOwotfQotCi0ud2hyYnV0dG9uYmcgewotCWJhY2tncm91bmQtY29sb3I6ICNGQkZCRkI7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS53aHJidXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNDQkNCQ0I7Ci19Ci0KLS53aHJidXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ODY4Njg7Ci19Ci0KLS53aHJtYXJnaW57Ci0JYmFja2dyb3VuZC1jb2xvcjogI0VGRUZFRjsKLX0KLQotLndocm1hcmdpbmJyZHIgewotCWJhY2tncm91bmQtY29sb3I6ICNERURFREU7Ci19Ci0KLSAvKiBUaGlzIGNsYXNzIGlzIHByb3ZpZGVkIGZvciBuZXRzY2FwZSBzbyB0aGF0IHRoZSBzY3JvbGwgYmFyIGRvZXNuJ3QgY292ZXIgdGhlIGJ1dHRvbi4gVGhlIHNwYWNpbmcgaXMgcHJvdmlkZWQgYnkgYW4gaW1hZ2UgaW5zaWRlIGEgZGl2LiBJbiBvdGhlciBicm93c2VycywgaXQgaXMgc2ltcGx5IHR1cm5lZCBvZmYgKi8KLS53aHJzcGFjZXIgewotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfZXhwbG9yZXIuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfZXhwbG9yZXIuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ5ZWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2V4cGxvcmVyLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEzNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi1hCi17Ci0gICAgY29sb3I6ICMzMzY2OTk7Ci19Ci0uYWNjZW50Y29sb3IKLS8qdXNlZCBhcyBoaWdobGlnaHRlZCBkZXNjcmlwdGlvbiBhYm92ZSB0YWJsZXMqLwotewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXNpemUgOiAxZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IGEuYnJlYWRjcnVtYnMKLS8qbGlua2VkIGJyZWFkY3J1bWJzKi8KLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotCi1hLmJyZWFkY3J1bWJzOmhvdmVyCi17Ci0gIGNvbG9yOiAjZmZmZmZmCi19Ci0KLQotYS5saW5rX2NvbnRhaW5lcl9lZGl0b3IKLS8qRURJVCBsaW5rIHVuZGVyIGNvbnRhaW5lciBiYW5uZXIqLwotewotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLWEubGlua19ieWxpbmUKLS8qd3JpdHRlbiBieSBYWCBhdXRob3IgaW4gY29udGVudCovCi17Ci0JZm9udC1zaXplOiAuOWVtOwotCWNvbG9yOiAjMzM2Njk5OwotfQotCi0KLWEubGlua19mdW5jX29wdGlvbgotLypBZHZhbmNlZCBsaW5rIGluIHNlYXJjaCBjb250YWluZXIqLwotewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLWEubGlua3R5cGVkCi0vKnZpZXcgYWxsIGxpbmsgdW5kZXIgY29udGFpbmVyKi8KLXsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLQotYS5tZW51YmFyX2xpbmsKLS8qCi13aGl0ZSBmb250IGZvciB0aGUgdGV4dCBpbiB0aGUgdGFibGUgaGVhZGVyLCB1c3VhbGx5IGluIHRoZSAxbmQgbGV2ZWwgb2YgdGhlIHRhYmxlIGhlYWRlciBpZiB0aGVyZSBhcmUgMgotMXN0IGxldmVsOiByZWd1bGFyIAotMm5kIGxldmVsOiBib2xkCi0qLwotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lCi19Ci0KLQotYS5tZW51YmFyX2xpbms6aG92ZXIKLXsKLQljb2xvcjogI2ZmZmZmZjsKLX0KLQotYS5uYXZ0cmVlCi17IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotYS5wcm9qZWN0X25hdgotLypwcm9qZWN0IGV4cGxvcmVyIG1lbnViYXIgb3B0aW9uIGxpbmtzIGluIGxlZnQgbmF2Ki8KLXsKLQljb2xvcjogIzAwNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotYS5wcm9qZWN0X25hdnRyZWUKLS8qdG9wTmF2IHRyZWUgc3VibWVudSovCi17Ci0gIGNvbG9yOiAjMDAwMDAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAuOWVtOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1hLnRvcGJhcgotLyp0b3BOYXYqLwotewotICBjb2xvcjogIzY2NjY2NjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogLjllbTsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLWJvZHkKLS8qb3JpZ2luYWwgYm9keSBiYWNrZ3JvdW5kIHNldHVwKi8KLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlweDsKLQliYWNrZ3JvdW5kLWNvbG9yIDogZmZmZmZmOwotfQotCi0KLS5ib3JkZXJfZGVjb3JhdGlvbgotLypkb3R0ZWQgbGluZSBib3JkZXIgb2YgdGFibGVzIGluIGNvbnRlbnQqLwotewotCWJvcmRlciA6IHRoaW4gZG90dGVkICM2NjY2NjY7Ci0JZmxvYXQgOiByaWdodDsKLQltYXJnaW4tYm90dG9tIDogMTVweDsKLQltYXJnaW4tbGVmdCA6IDE1cHg7Ci0JcGFkZGluZzogNXB4OwotfQotCi0KLS5ib3R0b21iYXJfZGFyawotLypiYWNrZ3JvdW5kIGNvbG9yIGJlaGluZCBicmVhZGNydW1icyovCi17Ci0JYmFja2dyb3VuZDogIzAwMzM2NjsKLX0KLQotCi0uYm90dG9tYmFyX2xpZ2h0Ci0vKnRoaW4gbGluZSBiZXR3ZWVuIGRyb3Bkb3duIG1lbnUgJiBicmVhZGNydW1iIGJhciovIAotewotCWJhY2tncm91bmQ6ICMzMzk5Y2M7Ci0gfQotCi0KLSAuYm90dG9tYmFyX21lZGl1bQotIC8qdGhpbiBsaW5lIGJldHdlZW4gZHJvcGRvd24gbWVudSAmIHNoYWRvdyBjb2xvciAqLwoteyAKLQliYWNrZ3JvdW5kOiAjMDA2Njk5OwotIH0KLQotCi0gLmJvdHRvbWJhcl9zaGFkb3cKLSAgLypkYXJrIGxpbmVzIHVuZGVyIGJyZWFkY3J1bWJiYXIgJiAgZHJvcGRvd25tZW51IGJhciAqLwotewotCWJhY2tncm91bmQ6ICMwMDAwMDA7Ci19Ci0KLQotY29kZQotLypjb2RlIGFzc2V0IGluIGNvbnRlbnQqLwotewotCWNvbG9yOiAjNjc2NzY3OwotfQotCi0uY29kZTIKLS8qaW5kZW50IGNvZGUgYXNzZXQgaW4gY29udGVudCovCi17Ci0gICAJbWFyZ2luLWxlZnQgOiAxNXB4OwotCW1hcmdpbi1yaWdodCA6IDE1cHg7Ci19Ci0KLS5jb3B5cmlnaHQKLS8qY29weXJpZ2h0IGxpbmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFnZSovCi17IAotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogODYlOwotIH0KLSAKLS5jb250ZW50X2Jhc2ljCi0vKgotZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHRzCi1mb250IGZvciByZWd1bGFyIGNvbnRhaW5lciB0ZXh0cwotZm9udCBmb3IgcmVndWxhciBmb3JtIHRleHRzCi0qLwotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5jb250ZW50X2Jhc2ljX2VtcGhhc2lzCi0vKgotYm9sZCBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dHMKLWJvbGQgZm9udCBmb3IgcmVndWxhciBjb250YWluZXIgdGV4dHMKLWJvbGQgZm9udCBmb3IgcmVndWxhciBmb3JtIHRleHRzCi0qLwoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotCi0KLSAuY29udGVudF9jb2xvcmVkCi0gLypjb250ZW50Ki8KLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogMWVtOwotfQotCi0KLSAuY29udGVudF9jb250YWluZXIKLSAvKmJvdHRvbSBtYXJnaW4geWllbGQgdGhlIHNwYWNlIGJldHdlZW4gYnlsaW5lICYgcGFyYWdyYXBoKi8KLSB7Ci0JbWFyZ2luLWJvdHRvbSA6IDE1cHg7Ci19Ci0KLSAuY29udGVudF9kaWFncmFtCi0gLypkaWFncmFtIGRlc2NyaXB0aW9uLCBlZy4iIGZpZ3VyZSAxLi4uIiovCi0gewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtc3R5bGUgOiBpdGFsaWM7CQotCX0KLQotLmhlYWRlcl9vZl9hcnRpY2xlX3RhYmxlCi0vKmNvbG9yZWQgdGFibGUgaGVhZGVyIGluIGNvbnRlbnQqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0gLmNvbnRlbnRfZW1waGFzaXMKLSAvKmJvbGQgZm9udCBpbiBjb250ZW50Ki8KLSB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLQotLmNvbnRlbnRfZ3JleV9taWQKLS8qd2VsY29tZSBjb250YWluZXIqLwotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uY29udGVudF9ncmV5X21pZDIKLS8qZm9udCBpbiBmbG9hdGluZyBib3gqLwotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTAwJTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotIC5jb250ZW50X2hlYWRlcgotIC8qaGVhZGVyIG9mIGNvbnRlbnQgcGFyYWdyYXBoKi8KLSB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotIC5jb250ZW50X2hlYWRlcl9sYXJnZQotIC8qZm9udCBmb3IgcGFnZSBoZWFkZXIgZXhjZXB0IGZvciBhcnRpY2xlIHBhZ2VzLCAoc2VlIGhlYWRlcl9vZl9hcnRpY2xlKSovCi0gewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEuOGVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0gLmNvbnRlbnRfaGVhZGVyX2NvbG9yZWQKLSAgLypjb2xvcmVkIHRpdGxlIG9mIHRoZSBwYWdlIHVzZWQgd2l0aCBjb250ZW50X2hlYWRlcl9sYXJnZSovCi0gewotCWNvbG9yOiAjNjc2NzY3O3oKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLmNvbnRlbnRfcmVmZXJlbmNlCi0vKmZvcm50IGZvciByZWZlcmVuY2UsIGVnLiAic2VlIC4uLi4iKi8gCi17Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLQlmb250LXNpemU6IDFlbTsKLX0KLQotIC5jb250ZW50X3JpZ2h0Ci0gIC8qZmxvYXRpbmcgdGFibGUgb24gdGhlIHJpZ2h0IG9mIHRoZSBjb250ZW50Ki8KLXsKLQlmbG9hdCA6IHJpZ2h0OwotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodCA6IDEwcHg7Ci0JbWFyZ2luLXRvcCA6IDEwcHg7Ci0Jd2lkdGg6IDE3MjsKLX0KLQotIC5jb250ZW50X3JpZ2h0X3RhYmxlCi0gLyppbm5lciB0YWJsZSBvZiBjb250ZW50X3JpZ2h0Ki8KLXsKLQl3aWR0aDogMTAwJTsKLX0KLQotCi0gLmNvbnRlbnRfc21hbGwKLSAvKnNtYWxsZXIgZm9udCB0aGFuIGNvbnRlbnRfYmFzaWMqLwotewotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAuOWVtOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsX2NvbG9yZWQKLSAvKnNtYWxsIGJsdWUgZm9udCovCi17Ci0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAuOWVtOwotfQotCi0KLSAuY29udGVudF9zbWFsbF9jb2xvcmVkXzIKLSAvKmRhdGUgaW4gcmF0aW5nIGJhciovCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IC45ZW07Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5jb250ZW50X3NtYWxsX2NvbG9yZWRfMwotLyphdmVyYWdlIGluIHJhdGluZyBiYXIqLwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAuOWVtOwotfQotCi0KLS5jb250ZW50X2VtcGhhc2lzCi0vKmJvbGQgZm9udCovCi0gewotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWZvbnQtc2l6ZSA6IC45ZW07Ci19Ci0KLQotLmNvbnRlbnRfc3ViaGVhZGVyCi0vKmJvbGQgZm9udCBiaWdnZXIgdGhhbiBjb250ZW50X2Jhc2ljKi8KLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemUgOiAxZW07Ci19Ci0KLQotLmNvbnRlbnRfc3ViaGVhZGVyXzIKLS8qYmxhY2sgY29udGVudCB0aXRsZSBpbiBjb250YWluZXJzKi8KLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogNTAwOwotfQotCi0KLS5kaXNjdXNzaW9uX2NvbnRlbnQKLS8qYmxhY2sgdGV4dHMgaW4gdGFibGVzKi8KLXsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtc2l6ZTogLjllbTsKLQltYXJnaW4tbGVmdDogNXB4OwotfQotCi0KLQotLmRpc2N1c3Npb25fY29udGVudF9lbXBoYXNpcwotLypib2xkIHRleHRzIGluIHRhYmxlcyovCi17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LXNpemU6IC45ZW07Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotCi0gLmRpc2N1c3Npb25fZGVzY3JpcHRpb24KLSAvKmJsYWNrIHRleHRzIGluIHRhYmxlcyBmb3IgZGVzY3JpcHRpb25zKi8KLSB7IAotCWNvbG9yOiA2NjY2NjY7Ci0JZm9udC1zaXplOiAuOWVtOwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0gIH0KLQotCi0uZWRpdG9ybm90ZQotLypub3QgdXNlZCovCi0geyAKLSAgZm9udC1zdHlsZTogaXRhbGljCi0gfQotIAotIC8qdGhlIGZvbGxvd2luZyB0d28gY2xhc3NlcyBhcmUgdXNlZCBleHByZXNzbHkgaW4gdGhlIGtub3dsZWRnZV9hbm5vdW5jZW1lbnRzX3ZpZXcqLwotIAotIC5mbG9hdGNsZWFyCi17Ci0JcGFkZGluZzogNXB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMCBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmZsb2F0Z3JleQotewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JcGFkZGluZzogNXB4OwotCXdpZHRoOiA2NXB4OwotfQotCi0KLS5mb290bm90ZQotLypmb290IG5vdGUgYXQgdGhlIGJvdHRvbSBvZiBjb250ZW50ICovCi17IAotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0KLQotLmZvb3Rfc3RhcmluZGV4Ci0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLXsKLQljb2xvciA6IGNjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uZm9vdF9kZXNjcmlwdGlvbgotLyoKLWNvbG9yZWQgZm9udAotZGVzY3JpcHRpb24gYWJvdXQgdGhlIHVzZXIgc3RhdHVzLiBlcS4gInN1YnNjcmlwdGlvbnMgYXJlIHVwZGF0ZWQiCi1pdCdzIHVzdWFsbHkgb24gdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHBhZ2VzCi0qLwotewotCWNvbG9yIDogI2ZmNjUwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uZm9vdF90ZXh0Ci0vKnRoZSBkZXNjcmlwdGlvbnMgZm9yICogc3ltYm9sICwgZWcuIHJlcXVpcmVkIGZpZWxkKi8KLXsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uZm9vdF90aXRsZQotLypmb290IGluZGV4IGFzaWRlIHRoZSBwYWdlIGhlYWRlciwgZWcuICogc3ltYm9sICovCi17Ci0JY29sb3IgOiAjZmY2NTAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotfQotLmZvcm1maWVsZF9kZXNjIAotLypmb3JtIG9iamVjdCBkZXNjcmlwdGlvbiBvciBpbnN0cnVjdGlvbiovCi17Ci1jb2xvcjogIzMzMzMzMzsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi1mb250LXNpemU6IDFlbTsgCi1mb250LXdlaWdodCA6IDQwMDsgCi0gZm9udC1zdHlsZTogaXRhbGljCi19Ci0uZm9ybWZpZWxkX3RpdGxlCi0vKmZvcm0gb2JqZWN0IHRpdGxlKi8KLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemUgOiAxZW07Ci19Ci0uZmxvd2NoYXJ0Ci0vKm5vdCB1c2VkKi8KLXsgIAotCWZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzY2NjY2NgotfQotCi0uZ3JleV9kYXJrCi0vKmRhcmsgZ3JleSBjZWxsIGJhY2tncm91bmQqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi0uZ3JleV9tZWRpdW0KLS8qbWVkaXVtIGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLmhlYWRlcl9kaXNjdXNzaW9uX2xpbmsKLS8qCi1zYW1lIGFzIG1lbnViYXJfbGluawotd2hpdGUgZm9udCBmb3IgdGhlIHRleHQgaW4gdGhlIHRhYmxlIGhlYWRlciwgdXN1YWxseSBpbiB0aGUgMW5kIGxldmVsIG9mIHRoZSB0YWJsZSBoZWFkZXIgaWYgdGhlcmUgYXJlIDIKLTFzdCBsZXZlbDogcmVndWxhciAKLTJuZCBsZXZlbDogYm9sZAotKi8KLSB7Ci0JY29sb3I6IAlmZmZmZmY7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotLmhlYWRlcl9kaXNjdXNzaW9uX2xpbmtkawotewotCWNvbG9yOiAJMDAwMDAwOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5oZWFkZXJfZGlzY3Vzc2lvbl90aXRsZQotLyoKLXRhYmxlIHRpdGxlcwotd2hpdGUgYm9sZCBmb250IGZvciB0aGUgdGV4dCBpbiB0aGUgdGFibGUgaGVhZGVyLCB1c3VhbGx5IGluIHRoZSAybmQgbGV2ZWwgb2YgdGhlIHRhYmxlIGhlYWRlciBpZiB0aGVyZSBhcmUgMgotMXN0IGxldmVsOiByZWd1bGFyIAotMm5kIGxldmVsOiBib2xkCi0qLwotIHsKLQljb2xvcjogZmZmZmZmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1sZWZ0IDogNXB4OwotfQotCi0KLS5oZWFkZXJiCi0vKm5vdCB1c2VkKi8KLXsKLSAgICBjb2xvcjogI2ZmNjYwMDsKLSAgICBmb250LWZhbWlseTogYXJpYWwsdmVyZGFuYSxoZWx2ZXRpY2Esc2Fucy1zZXJpZjsKLSAgICBmb250LXNpemU6IDEycHQ7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmhlYWRlcl9vZl9jb250YWluZXIKLS8qY29sb3JlZCBmb250IGZvciB0aGUgdGl0bGUgb2YgdGhlIGNvbnRhaW5lciBlZy4gRmVhdHVyZSovCi17Ci0JY29sb3I6ICNjZDMzMDE7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyX2NvbG9yZWQKLS8qY29sb3JlZCBoZWFkZXIgaW4gbG9naW4gcGFnZSovCi17Ci0JY29sb3I6ICNjYzMzMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmhlYWRlcl9vZl9hcnRpY2xlCi0vKmNvbG9yZWQgYXJ0aWNsZSBoZWFkZXIqLwotewotCWNvbG9yOiAjY2QzMzAxOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMS4yM2VtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaGVhZGVyX29mX2FydGljbGUyCi0vKmFydGljbGUgaGVhZGVyKi8KLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JZm9udC13ZWlnaHQ6IDUwMDsKLX0KLQotLnN1YmhlYWQxX29mX2FydGljbGUyCi0vKmFydGljbGUgc2Vjb25kIGxldmVsIGhlYWQqLwotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTNweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnN1YmhlYWQyX29mX2FydGljbGUyCi0vKmFydGljbGUgdGhpcmQgbGV2ZWwgaGVhZCovCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMyBweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiA1cHg7Ci19Ci0KLS5zdWJoZWFkM19vZl9hcnRpY2xlMgotLyphcnRpY2xlIDR0aCBsZXZlbCBoZWFkKi8KLSB7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0uaGVhZGVyX29mX3N0ZXBzCi0vKmZvcm50IGZvciBzdGVwcyB0aXRsZSBpbiBmb3JtcyovCi17IAotCWNvbG9yOiAjYTRhNGE0OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJwdDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0KLS5oZWFkZXJfb2Zfc2l0ZW1hcAotLypoZWFkZXIgb2Ygc2l0ZW1hcCBwYWdlKi8KLXsKLQljb2xvcjogIzY2OTljYzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5oZWFkZXJfb2Zfc2l0ZW1hcDpob3ZlcgotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJwdDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLmhlYWRlcl9vZl90YWJsZQotLypoZWFkZXIgb2YgdGFibGVzIGluIGNvbnRlbnQgdXN1YWxseSBoYXMgYSBiYWNrZ3JvdW5kIGNvbG9yIGFzc2lnbmVkIHRvIHRoZSBjZWxsKi8KLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5oZWFkZXJfcmlnaHQKLXsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0uaW1hZ2VjYXB0aW9uCi0vKmltYWdlIGNhcHRpb24gaW4gY29udGVudCBwYWdlKi8KLXsgCi0gZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjMDAzMzY2Ci0gfQotCi0KLS5zaWRlYmFyIAotLypub3QgdXNlZCovCi17ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjRmNGY0OwotfQotCi0KLWlucHV0Ci0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLXsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC1mYW1pbHkgOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0KLWlucHV0LmlucHV0MjUKLXsKLSAgICB3aWR0aDogMjVweAotfQotCi0KLWlucHV0LmlucHV0NDUKLXsKLSAgICB3aWR0aDogNDVweAotfQotCi0KLWlucHV0LmlucHV0bWF4NTAKLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSwgYnV0IE5TCi0qLwotewotCXdpZHRoOiAzNjBweDsKLX0KLQotCi1pbnB1dC5pbnB1dDg1Ci17Ci0gICAgd2lkdGg6IDg1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDEzNQotewotICAgIHdpZHRoOiAxMzVweAotfQotCi0KLWlucHV0LmlucHV0MTU1Ci17Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLQotaW5wdXQuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotCi1pbnB1dC5pbnB1dDMwNQotewotICAgIHdpZHRoOiAzMDVweDsKLX0KLQotCi0ubWVudWJhcgotLyoKLXdoaXRlIGZvbnQgZm9yIHRoZSB0ZXh0IGluIHRoZSB0YWJsZSBoZWFkZXIsIHVzdWFsbHkgaW4gdGhlIDFuZCBsZXZlbCBvZiB0aGUgdGFibGUgaGVhZGVyIGlmIGh0ZXJlIGFyZSAyCi0xc3QgbGV2ZWw6IHJlZ3VsYXIgCi0ybmQgbGV2ZWw6IGJvbGQKLSovCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLS5tZW51YmFyOmhvdmVyCi17Ci0gIGNvbG9yOiAjZmZmZmZmCi19Ci0KLQotLm1lbnViYXJfYmcKLS8qYmFja2dyb3VuZCBvZiB0YWJsZSBoZWFkZXIqLwoteyAgIAotYmFja2dyb3VuZC1jb2xvcjojMDAzMzY2OyAKLX0KLQotCi0ubWVudWJhcl9lbXBoYXNpcwotLyoKLTEsYm9sZCBmb250IGZvciB0aGUgbGFzdCBpdGVtIG9mIHRoZSBicmVhZGNydW1icwotMixib2xkIGZvbnQgb2YgdGFibGUgaGVhZGVyIHdpdGggbWVudWJhcl9iZyhibHVlKSBhcyBiYWNrZ3JvdW5kIGNvbG9yIAotMyxib2xkIHRleHQgb24gY29sb3JlZCBiYWNrZ3JvdW5kIGVnLiBMb2dnZWQgSW4KLSovCi17Ci0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLm1lbnViYXJfZW1waGFzaXNkawotCi17Ci0gIGNvbG9yOiAjMDAwMDAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotCi0ubWlkYmFyX2JnCi0vKnRoZSBsaWdodCBwb2ludCBhYm92ZSB0aGUgdGFicyAqLwotewotCWJhY2tncm91bmQ6ICNmZmZmZmY7Ci19Ci0KLQotLm1pZGJhcl9kYXJrCi0vKmRhcmsgY29sb3IgYmV0d2VlbiB0YWJzKi8KLXsgCi0JYmFja2dyb3VuZDogIzAwMzM2NjsKLSB9Ci0KLQotLm1pZGJhcl9saWdodAotLyoKLTEsbGlnaHQgY29sb3Igb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSB0YWJzCi0yLGxpZ2h0IGNvbG9yIGFib3ZlIHRhYnMKLSovCi17IAotCWJhY2tncm91bmQ6ICMzMzk5Y2M7Ci0gfQotCi0gCi0gLm1pZGJhcl9tZWRpdW0KLSAvKmJhY2tncm91bmQgIG9mICB0YWJzKi8KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLS8qc2hhZG93IGNvbG9yIGJldHdlZW4gdGFicyovCi0gLm1pZGJhcl9zaGFkb3cKLXsKLQliYWNrZ3JvdW5kOiAjNjY2NjY2OwotfQotCi0KLS5wYWdlX251bWJlcgotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0KLS5wYWdlX3N0ZXBzCi0vKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLXsgCi0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi0KLSAucGFnZWhlYWRlcgotIC8qc2FtZSBhcyBjb250ZW50X2hlYWRlcl9sYXJnZSovCi17Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTE1JTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotIC5wYWdlaGVhZGVyX2NvbG9yZWQKLSAvKmNvbG9yZWQgdGl0bGUgb2YgdGhlIHBhZ2UgdXNlZCB3aXRoIGNvbnRlbnRfaGVhZGVyX2xhcmdlKi8KLXsKLSAgICBjb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICBmb250LXNpemU6IDE2cHQ7Ci0gICAgZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnBvcHVwX2JvcmRlcgotewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyIDogdGhpbiBzb2xpZCBjY2NjY2M7Ci0JcGFkZGluZyA6IDJweDsKLX0KLQotLnBvcHVwX3RleHQKLXsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250IDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0ucG9wdXBfdGV4dCA6IGFjdGl2ZQotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucG9wdXBfdGV4dCA6IGhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci19Ci0KLS5wcm9qZWN0X21lbnVfYm9yZGVyMQotLypwcm9qZWN0IGV4cGxvcmVyIG1lbnUgb3B0aW9ucyBiYWNrZ3JvdW5kIHN0eWxlIGluIGxlZnQgbmF2Ki8KLSB7Ci0JYm9yZGVyLXRvcCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJvcmRlci1yaWdodCA6IDFweCBzb2xpZCAjY2NjY2NjOwotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbWVudV90b3Bib3JkZXIKLS8qcHJvamVjdCBleHBsb3JlciBtZW51IG9wdGlvbnMgYmFja2dyb3VuZCBzdHlsZSBpbiBsZWZ0IG5hdiovCi0gewotCWJvcmRlci10b3AgOiAxcHggc29saWQgI2NjY2NjYzsJCi0JYmFja2dyb3VuZCA6ICNlZmVmZWY7Ci19Ci0ucHJvamVjdF9uYXYKLS8qZmllbGQgdGl0bGVzIGZvciBwcm9qZWN0IGV4cGxvcmVyIG1lbnUgbG9jYXRlZCBpbiBsZWZ0IG5hdiovCi17Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotc2VsZWN0Ci0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgc2VsZWN0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi1zZWxlY3QuaW5wdXQyNQotewotICAgIHdpZHRoOiAyNXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0NDUKLXsKLSAgICB3aWR0aDogNDVweAotfQotCi0KLXNlbGVjdC5pbnB1dDg1Ci17Ci0gICAgd2lkdGg6IDg1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQxNTUKLXsKLSAgICB3aWR0aDogMTU1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotCi1zZWxlY3QuaW5wdXQzMDUKLXsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS8qIEFsbCBzaGltIGNsYXNzZXMgYXJlIGZvciBzcGFjaW5nIGVsZW1lbnRzIHVzZWQgdG8gY29udHJvbCBsYXlvdXQsIGVzcGVjaWFsbHkgaW4gb2xkZXIgYnJvd3NlcnMgdGhhdCBkb24ndCB1bmRlcnN0YW5kIG1hcmdpbnMgYW5kIHBhZGRpbmcgKi8KLQotLnNoaW0zeDFweAotewotCWZvbnQtc2l6ZTogMXB4OwotCWhlaWdodCA6IDFweDsKLX0KLQotYS5zaWRlbWVudV9oZWFkZXIKLS8qbm90IHVzZWQ/Ki8KLXsKLSAgICBjb2xvcjogIzY2NjY2NjsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotYS5zaWRlbWVudV9oZWFkZXI6aG92ZXIKLS8qbm90IHVzZWQ/Ki8KLXsKLSAgY29sb3I6ICNjYzAwMDAKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnQKLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGl0ZW1zIGluIHNlYXJjaCBjb250YWluZXIKLTIsYm9sZCBsZWZOYXYgdW5zZWxlY3RlZAotKi8KLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQKLS8qYm9sZCBmb250IGxlZk5hdiBzZWxlY3RlZCovCi17Ci0JY29sb3I6ICNDQzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAuOWVtOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X2JvbGRyaWdodAotLyoKLTEsYm9sZCBmb250IGZvciB0aGUgaXRlbXMgaW4gcmlnaHQgaGFuZCBzaWRlCi0yLHNhbWUgYXMgc2lkZW1lbnVfYm9sZHJpZ2h0Ci0qLwotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9ib2xkcmlnaHQ6aG92ZXIKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0X2NvdXJzZWNhdGFsb2cKLS8qbm90IHVzZWQqLwotewotCWNvbG9yOiAjNjM5NjAyOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotCi0uc2lkZW1lbnVfc3RhbmRhcmQKLS8qbGVmdE5hdiBzdGFkYXJkKi8KLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X3N0YW5kYXJkX3NlbGVjdGVkCi0vKmxlZnROYXYgc2VsZWN0ZWQqLwotewotCWNvbG9yOiAjQ0MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogLjllbTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0KLXRkCi17Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA3NSU7Ci19Ci0KLQotCi0gdGQuYmdfZGlzY3Vzc2lvbl8xCi0gLypzYW1lIGFzIGdyZXlfbWVkaXVtKi8KLXsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0KLXRkLmJnX2Rpc2N1c3Npb25fMgotIC8qc2FtZSBhcyBncmV5X2xpZ2h0Ki8KLXsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9Ci0gCi10ZC5jb250ZW50X2NlbGwKLS8qZm9yIGVsaW1pbmF0ZSB0YWJsZSBzdHJ1Y3R1cmUgJiBrZWVwIHRoZSBjZWxscGFkZGluZyBpbiBjb250ZW50Ki8KLSB7Ci0JcGFkZGluZzogNXB4OwotfQotCi0KLXRkLmRpdmlkZXIKLS8qdGhpbiBsaW5lIGRpdmlkZSB0aGUgcGFnZSBjb2x1bW5zKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjlmMDsKLX0KLQotdGQuZGl2aWRlcjIKLS8qdGhpbiBsaW5lIGRpdmlkZSB0aGUgcGFnZSBjb2x1bW5zIC0gdXNlZCBpbiB0aGUgdmlld2ZyYW1lIGZyYW1lIHBhZ2UqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotfQotCi0KLS5ncmV5X2RhcmsKLS8qZGFyayBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci19Ci0KLXRkLmdyZXlfbWVkaXVtMgotLyptZWRpdW0gZ3JleSBjZWxsIGJhY2tncm91bmQgdy8gY2VsbCBwYWRkaW5nKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLQlwYWRkaW5nOiA1IHB4OwotfQotCi10ZC5ncmV5X2xpZ2h0MgotLypsaWdodCBncmV5IGNlbGwgYmFja2dyb3VuZCB3LyBjZWxsIHBhZGRpbmcqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDVweDsKLX0KLQotLmdyZXlfbGlnaHQKLS8qbGlnaHQgZ3JleSBjZWxsIGJhY2tncm91bmQqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0KLXRkLmNlbGxjb2xvcl9saWdodAotLypsaWdodCBjZWxsIGJhY2tncm91bmQgY29sb3IgZm9yIHNwZWNpZmljIGNvbG9yIHNjaGVtZSovCi0gewotCWJhY2tncm91bmQtY29sb3I6ICM5OWNjMDA7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX2RhcmsKLS8qZGFyayBjZWxsIGJhY2tncm91bmQgY29sb3IgZm9yIHNwZWNpZmljIGNvbG9yIHNjaGVtZSovCi17Ci0JYmFja2dyb3VuZC1jb2xvcjogIzYzOWMwMDsKLX0KLQotCi10ZC5jZWxsY29sb3Jfd2hpdGUKLS8qd2hpdGUgY2VsbCBiYWNrZ3JvdW5kIGNvbG9yKi8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLX0KLQotCi10ZC5zaWRlbWVudV9idWxsZXRfY29sb3JlZAotLypidWxsZXQgY29sb3IgZm9yIHRoZSBsZWZ0TmF2Ki8KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NkMzMwMTsKLX0KLQotCi10ZC5zaWRlbWVudV9idWxsZXRfZ3JleQotLypncmV5IGJ1bGxldCBjb2xvciBmb3IgdGhlIGxlZnROYXYqLwotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0KLXRleHRhcmVhCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgbXVsdGlsaW5lIHRleHRhcmVhIHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLXsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC1mYW1pbHkgOiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi0KLXRleHRhcmVhLnRleHRhcmVhNDUKLXsKLSAgICB3aWR0aDogNDVweAotfQotCi0KLXRleHRhcmVhLmlucHV0bWF4NTAKLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSwgYnV0IE5TCi0qLwotewotCXdpZHRoOiAzNjBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MTkwCi17Ci0gICAgd2lkdGg6IDE5MHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQyMzAKLXsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDM1MAotewotICAgIHdpZHRoOiAzNTBweAotfQotCi0KLS50b3BiYXJfc2VwYXJhdG9yCi0vKnNlcGFyYXRvciBvZiB0aGUgdG9wTmF2Ki8KLXsKLSAgY29sb3I6ICNjYzMzMDA7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IC45ZW07Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0udG9wbGluZV9jb2xvcgotLyp0aGUgdGhpbiBjb2xvciBsaW5lIG9uIHRoZSB0b3Agb2YgdGhlIGJyb3dzZXIgd2luZG93Ki8KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLyogYm9ycm93ZWQgc3R5bGVzIGZyb20gY29tbW9uLmNzcyB0byBiZSB0cmltbWVkIGxhdGVyICovCi0gCi0gLnRvcGZyYW1lYmcgCi17ICBiYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyCi19Ci0KLS50b3BmcmFtZWJnbGlnaHQgCi17ICAKLWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjUKLX0KLQotLnRvcGZyYW1lYmdkYXJrIAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0Ci19Ci0KLS50b3BmcmFtZWJnbGlnaHQyIAoteyAKLSBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmCi0gfQotICAgCi0gLnRvcGZyYW1lbG9nb2JnIAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5Ci19Ci0KLS50b3BsZWZ0bmF2Ci17Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcGxlZnRuYXZib2xkIAoteyAKLWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLWZvbnQtc2l6ZTogMTBweDsgCi10ZXh0LWRlY29yYXRpb246IG5vbmU7IAotZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b3ByaWdodG5hdgotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogI2ZmZmZmZjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udmVydGljYWxibHVlCi0geyAKLSBiYWNrZ3JvdW5kOiAjMzM5OWNjIAotIH0KLQotIC53aGl0ZWJnCi17IAotIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU1bnM0LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX2llNW5zNC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzUwZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU1bnM0LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDExOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKm11c3QgYWRkIGZvbnQgdHlwZSBpZiBjbGFzcyBpcyBiZWluZyB1c2VkIGFzIGEgbGluayBhcyB3ZWxsIGFzIG5vLWxpbmsqLwotCi1hIHsJCi0JY29sb3I6ICMzMzY2OTk7Ci19Ci0KLWEudG9wcmlnaHRuYXY6YWN0aXZlIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0KLQotYS50b3ByaWdodG5hdmdyZXk6YWN0aXZlIHsKLQljb2xvcjogI0NDMDAwMDsKLX0KLQotCi1hLnRvcHJpZ2h0bmF2Z3JleTpob3ZlciB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19IAotYS50b3ByaWdodG5hdjpob3ZlciB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19IC8qIGZvbnQgZm9yIGFjdGlvbiBvbiBjb250ZW50IHBhZ2UgdXN1YWxseSBsb2NhdGVkIG9uIHRvcCBvZiBwYWdlIDtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb24geyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxMXB4OwkKLX0gCi0KLWEuYWN0aW9uc2VsZWN0b3IgewotICAgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYiB7IAotIAljb2xvcjogIzAwMDAwMDsKLSAJZm9udC1zaXplOiAxMnB4OwotICAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWNvbG9yOiAjMmMyYzJjOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYmFzaWMgeyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJ1dHRvbjphY3RpdmUgewotCWNvbG9yOiAzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAzMzMzMzM7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgIGFjdGlvbnMvbGlua3MgZm9yIGVkaXRpbmcqLwotYS5jb25saW5rZWRpdCB7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQlmb250LXNpemUgOiAxMXB4OwotfQotCi1hLmNvcHlyaWdodCB7IAkKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1zaXplIDogMTBweDsKLX0gCi0KLWEuZm9ybXRibGhlYWQgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qIGxpZ2h0IGNvbG91cmVkIGhlYWRpbmcgbGluayBmb3IgZGlzY3Vzc2lvbiBhbmQgc2ltaWxhciB1c2VzIC0gd2FzIGhlYWRlcl9kaXNjdXNzaW9uX2xpbmsgaW4gcHJldmlvdXMgdmVyc2lvbnMgKi8KLSBhLmhlYWRlcmxpbmtsaWdodCB7Ci0JY29sb3I6IAlmZmZmZmY7Ci0JZm9udC1zaXplOiAwLjllbTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19CQotCi0vKmJvbGQgbGluaywgaWUsIGFkdmFuY2VkIHNlYXJjaCBsaW5rIGluIHBlKi8KLWEubGlua2Z1bmNvcHRpb24geyAgCQotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0gYS5uYXZ0cmVlIHsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotCi0vKm5hdnRyZWUgaXRlbSBvciBkb2MsIG5vZGVzIHRoYXQgZG9uJ3QgZXhwYW5kKi8KLWEubmF2dHJlZWl0ZW0geyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotIAotIC8qIHNpbXBsZSBtZWNoYW5pc20gdG8gdHVybiB0ZXh0IGRlY29yYXRpb24gb2ZmICovICAKLWEubm9saW5lIHsKLSAJdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotYS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHRleHQgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wb3B1cHRleHQ6IGFjdGl2ZSB7Ci0JY29sb3I6ICNjYzAwMDA7Ci19Ci0KLQotYS5zbWFsbCB7CQotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLWEuc21hbGxiIHsJCi0gICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7CQotfQotCi1hLnRvcGJhciB7Ci0gIGNvbG9yOiAjNjY2NjY2OwotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2VkIGFzIGhpZ2hsaWdodGVkIGRlc2NyaXB0aW9uIGFib3ZlIHRhYmxlcyovCi0uYWNjZW50Y29sb3IgewotCWNvbG9yIDogI2NjMzMwMDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotIC8qIGJnY29sb3IgIGZvciBhY3Rpb24gdGV4dCB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2U7aWUuLCBzZWxlY3QgYWxsKi8KLS5hY3Rpb25iZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS5hY3Rpb25zZWxlY3RvciB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLmFjdGlvbnNlbGVjdG9yZGlzIHsKLWJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0JY29sb3I6ICNjY2NjY2M7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYiB7IAotICAgZm9udC13ZWlnaHQgOiBib2xkOwotIH0KLSAgCi0uYmFzZWxpbmVpdGFsaWNzIHsKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmdibGFjayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotIAotIC8qIGJhc2ljIGNvbHVtbiBiYWNrZ3JvdW5kIGNvbG91ciBmb3IgZGlzY3Vzc2lvbnMsIGZpbGVzLCBvdGhlciBzdWNoIHRhYnVsYXRlZCBkYXRhICovCi0uYmdjb2x1bW5iYXNpYyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotLmJnd2hpdGUgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKiBzaXplIGlucHV0IGZvciBiYXNpYyB0YWdzIHN1Y2ggYXMgcCBhbmQgbGkgdGhhdCBkbyBub3QgaW5oZXJpdCBmcm9tIHRkICovIAotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7CQkKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi1yaWdodDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsJCi19Ci0KLS5ib2xkIHsgCi0gICBmb250LXdlaWdodCA6IDYwMDsKLSB9Ci0KLS5ib3JkZXJncmF5IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLSB9Ci0KLS5ib3R0b21iYXJkYXJrIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMzM2NjsKLSB9Ci0gIAotLmJvdHRvbWJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0KLS5ib3R0b21iYXJzaGFkb3cgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAwMDAwOwotIH0KLQotLmJyZWFkY3J1bWJzeyAKLWNvbG9yOiAjMzM2Njk5OwotZm9udC13ZWlnaHQ6IDYwMDsKLSB9Ci0KLS5icmVhZGNydW1iczJ7IAotY29sb3I6ICNmZmZmZmY7Ci1mb250LXNpemU6IDExcHg7Ci0gfSAKLQotLypuYXZpZ2F0aW9uIGJ1dHRvbnMsIG5vdCBmb3JtIGJ1dHRvbnMqLyAKLS5idXR0b25zIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLyphY3RpdmUgbmF2aWdhdGlvbiBidXR0b24sIG5vdCBmb3JtIGJ1dHRvbnMqLyAKLS5idXR0b25vbiB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19IAotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotLmJ1dHRvbnR4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uY29kZSB7IAotICAgZm9udC1mYW1pbHk6IENvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vOyAgIAotICAgZm9udC1zaXplOiAxMnB4OwotIH0KLSAKLSAgLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS5jb21tZW50cyB7IAkKLQlmb250LXNpemU6IDExcHg7CQotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qbWFpbiBjb250YWluZXIgaGVhZGVyKi8KLS5jb25oZWFkIHsgCi1jb2xvcjogI2NjMzMwMDsKLWZvbnQtd2VpZ2h0OiA2MDA7Ci10ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLSAKLSAvKm1haW4gY29udGFpbmVyIGRhdGEgbGFiZWxzKi8KLS5jb25sYWJlbCB7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9IAotIAotLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyBpbiBib2xkKi8KLS5jb25sYWJlbGJvbGQgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlMWUxZTE7Ci1mb250LXdlaWdodDogYm9sZDsKLSB9ICAKLSAKLS8qcmVwbGFjaW5nIHNpZGVtZW51X2JvbGRyaWdodCBtb3ZpbmcgZm9yd2FyZCovCi0uY29ucmJvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmhlYWRlciBmb3IgcmlnaHQgaGFuZCBjb250YWluZXIqLwotLmNvbnJoZWFkIHsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKm1haW4gY29udGFpbmVyIHRhYmxlIGhlYWRlciovCi0uY29udGJsaGVhZCB7ICAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JY29sb3I6ICMzMzMzMzM7CQotCWZvbnQtc2l6ZTogMTFweDsJCi0gICAgZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmNvbnRlbnR7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLSB9Ci0KLSAvKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0uY29udGVudGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLyogYWRkZWQgZm9yIHRleHQgcmVwcmVzZW50aW5nIGRpc2FibGVkIGZ1bmN0aW9ucy4gKi8KLS5jb250ZW50ZGlzYWJsZWQgewotCWNvbG9yOiAjY2NjY2NjOwotfQotCi0vKiBmb250IGZvciBib2xkIHRleHQgKi8KLS5jb250ZW50ZW1waGFzaXMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiB1c2VkIHRleHQgcmVtaW5kaW5nIHVzZXIgdGhhdCB0aGVyZSBpcyByZXF1aXJlZCBjb250ZW50ICovCi0uY29udGVudHJlcXVpcmVkIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXdlaWdodDogNTAwOwotfQotCi0uY29weXJpZ2h0IHsgCi1jb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQqLwotLmNvcHlyaWdodGIgeyAKLWNvbG9yIDogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMHB4OwotfQotCi1kZCB7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLW1hcmdpbi1sZWZ0OiAtMXB4OwotIH0KLSAKLS5kaWFsZ2J4c2hhZG93MiB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0uZGlhbG9ndWVib3hiZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi0vKmJhY2tncm91bmQgZm9yIGxvZ2luIHBhZ2VzKi8KLS5kaWFsb2d1ZWJveGJnMiB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0uZGlhbG9ndWVib3hib3JkZXIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzMzMzMzOwotIH0KLSAKLS5kaWFsb2d1ZWJveGhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotIC5kaWFsb2d1ZWJveG1lZGl1bSB7IAotCWJhY2tncm91bmQtY29sb3I6ICM4YjhiOGI7Ci0gfQotIAotIC5kaWFsb2d1ZWJveHRpdGxlIHsJICAgCi0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtc2l6ZTogMTFweDsJCi0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0vKnRleHQgZm9yIGRpc2FibGVkIGJ1dHRvbnMqLwotLmRpc2FibGV7IAotY29sb3I6ICM5OTk5OTk7Ci1mb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMTFweDsgIAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLSAKLWRpdnsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSB9IAotIAotLyp1c2VkIHRvIGFmZmVjdCByaWdodCBtYXJnaW4qLyAKLWRpdi5tYXJnaW5ydHsgCi0JY2xlYXI6IHJpZ2h0OwotCWZsb2F0OiByaWdodDsKLQl3aWR0aDogN3B4OwotIH0gIAotIAotZGl2Lm1hcmdpbnMgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDI1cHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgIAotCi0vKmZvciBwYWdlcyB3aXRoIGJ1dHRvbiBuYXZpZ2F0aW9uIG9uIHRvcCovIAotZGl2Lm1hcmdpbnMyMCB7IAotZmxvYXQ6IGxlZnQ7Ci1tYXJnaW4tbGVmdDogN3B4OwotbWFyZ2luLXRvcDogMjBweDsJCi1tYXJnaW4tcmlnaHQ6IDdweDsKLSB9ICAgIAotIAotIC8qYWRkcyAxMCBweCBwYWRkaW5nKi8KLSBkaXYucGFkMTB7IAotIHBhZGRpbmc6IDEwcHg7IAotICB9Ci0KLS5kaXZpZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjZmOWYwOwotfQotCi1kbHsgIAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDEycHg7ICAgCi0JfQotCi0vKnJlbW92ZXMgZGVmYXVsdCBib3R0b20gbWFyZ2luLCBkb2Vzbid0IHdvcmsgaW4gTlM0Ljd4ICovIAotZGwuZGF0YSB7IAotbWFyZ2luLWJvdHRvbTogLTFweDsKLSB9ICAKLQotLmRvY2JvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsgICAgICAgCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qZm9yIGFwcGxldCBkb3dubG9hZCBzcGxhc2ggcGFnZSovCi0uZG93bmxvYWR7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWVlZTsKLSB9Ci0KLS5lcnJvcm1zZyB7Ci0JY29sb3IgOiAjY2MwMDAwOwkKLX0gCi0gCi0vKgotY29sb3JlZCBmb250Ci1kZXNjcmlwdGlvbiBhYm91dCB0aGUgdXNlciBzdGF0dXMuIGVxLiAic3Vic2NyaXB0aW9ucyBhcmUgdXBkYXRlZCIKLWl0J3MgdXN1YWxseSBvbiB0aGUgdXBwZXIgcGFydCBvZiB0aGUgcGFnZXMKLSovCi0uZm9vdGVyYm9sZCB7Ci0JY29sb3IgOiAjYTRhNGE0OwotCWZvbnQtc2l6ZTogOTAlOwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RlcmJvbGRjb2xvcmVkIHsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmZvb3RpbmRpY2F0b3IgewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsgICAgICAgCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnRoZSAqIHN5bWJvbCBpbmRpY2F0ZSB0aGUgcmVxdWlyZWQgZmllbGQgKi8KLS5mb290c3RhcmluZGV4IHsKLQljb2xvciA6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS8qbW92ZSB0byBkZXNpZ25fcGUqLwotLmZvcm1sYWJlbCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5mb3JtdGJsaGVhZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLmdyZXltZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS5ncmF5Zm9sZCB7Ci0JY29sb3I6ICNjY2NjY2M7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LXNpemU6IDE1cHg7Ci19Ci0KLS8qTm90ZTogcmVtb3ZlIHRoaXMgbm90ZSBpZiB1c2luZyB0aGlzIHN0eWxlIG9yIHdpbGwgYmUgZGVsZXRlZCovCi0JLyogQ3VycmVudGx5IHVzZWQgaW4gY3FfZGVmbGVjdF9sb2dpbl9lcnIuaHRtbCAtIHNob3VsZCBiZSByZW5hbWVkIHRvIHNvbWV0aGluZyB0aGF0IGhhcyBsZXNzIGRlc2NyaXB0aXZlIG5hbWUgKi8KLS5oZWFkZXJibHVlIHsKLQljb2xvcjogIzAwNjY5OTsJCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnVzZWQgaW4gY2MgZm9yIGZyYW1lc2V0IGRpc3BsYXkqLyAKLS5oZWFkZXJpbmZyYW1lcyB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JbWFyZ2luLWJvdHRvbTogMnB4OwotCW1hcmdpbi10b3A6IDBweDsKLX0KLQotIC8qZm9udCBmb3IgcGFnZSBoZWFkZXIgZXhjZXB0IGZvciBhcnRpY2xlIHBhZ2VzLCAoc2VlIGhlYWRlcl9vZl9hcnRpY2xlKSovCi0uaGVhZGVybGFyZ2UgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTYwJTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbWFpbiBoZWFkZXIgZm9yIGZyYW1lIG5hdmlnYXRpb24sIGllLCBjbGVhcmNhc2UgbWVyZ2UgZmlsZXMqLwotLmhlYWRlcm1haW4geyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKiBoZWFkZXIgZWxlbWVudCBmb3IgZm9ybSB0YWJsZXMgY29udGFpbmluZyBtaWQtc2l6ZSBmaXhlZCBoZWlnaHQgdGV4dCAqLwotLmhlYWRlcm1lZGxpc3QgewotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypmb3JudCBmb3Igc3RlcHMgdGl0bGUgaW4gZm9ybXMqLwotLmhlYWRlcm9mc3RlcHMgeyAKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDE3cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5oZWFkZXJvZnN0ZXBzbm9uIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxN3B4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2UgaGVhZGVyMSBpbnN0ZWFkKi8KLS5oMSB7ICAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7ICAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLmgxcm9vdHsgIAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjJweDsJCi0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotCi0vKnVzZWQgaW4gY2MsIGNxLCBzbCovIAotaDEgeyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vLyp1c2UgaGVhZGVyMiBpbnN0ZWFkKi8KLS5oMiB7IAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTlweDsKLQlmb250LXdlaWdodDogNDAwOwkgCQotfQotCi0vKmhlYWRlcnMgd2l0aGluIHBhZ2UqLwotLmhlYWRlcjIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotaSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotLmljb25ib3JkZXIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0vKmZvbnQgc2l6ZSBzZXR1cCBzaG93biBpbiB0aGUgaW5wdXQgYm94IHdoaWNoIGlzIGluaGVyaXRlZCBieSBpbnB1dFhYKi8KLWlucHV0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMXB4OwotfSAKLQotaW5wdXQuaW5wdXQxMzUgewotCXdpZHRoOiAxMzVweAotfSAKLQotLyogMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUgKi8KLWlucHV0Lm1heDUwIHsKLQl3aWR0aDogMzYwcHg7Ci19Ci0KLWlucHV0LnB4MjUgewotICAgIHdpZHRoOiAyNXB4OwotfQotCi1pbnB1dC5weDQ1IHsKLSAgICB3aWR0aDogNDVweDsKLX0KLQotLyoKLTEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFCi0qLwotaW5wdXQucHg4NSB7Ci0gICAgd2lkdGg6IDg1cHg7Ci19Ci0KLWlucHV0LnB4MTM1IHsKLSAgICB3aWR0aDogMTM1cHg7Ci19Ci0KLWlucHV0LnB4MTU1IHsKLSAgICB3aWR0aDogMTU1cHg7Ci19Ci0KLWlucHV0LnB4MjMwIHsKLSAgICB3aWR0aDogMjMwcHg7Ci19Ci0KLWlucHV0LnB4MzA1IHsKLSAgICB3aWR0aDogMzA1cHg7Ci19Ci0KLS5sZWZ0bWVudSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmxlZnRtZW51YnVsbGV0IHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotIH0KLQotLmxlZnRtZW51YnVsbGV0YWN0aXZlIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotIH0KLQkKLQotLmxlZnRuYXZoZWFkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDEzcHg7CQotCWZvbnQtd2VpZ2h0OiBib2xkOwkKLX0gCi0KLS5sZWZ0bmF2bGFiZWwgewotY29sb3I6ICMwMDAwMDA7Ci1mb250LXdlaWdodCA6IDYwMDsKLWZvbnQtc2l6ZTogMTFweDsKLSB9Ci0KLS5saWdodGdyYXkgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlNGU0ZTQ7Ci0gfQotIAotLm1lbnViYXIgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS8qbWVudWJhciB3aXRoaW4gdG9wIG9mIGNvbnRlbnQgcGFnZSAgKi8KLS5tZW51YmFybWlkeyAKLWZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi0gfQotCi0vKgotMSxib2xkIGZvbnQgZm9yIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJyZWFkY3J1bWJzCi0yLGJvbGQgZm9udCBvZiB0YWJsZSBoZWFkZXIgd2l0aCBtZW51YmFyX2JnKGJsdWUpIGFzIGJhY2tncm91bmQgY29sb3IgCi0zLGJvbGQgdGV4dCBvbiBjb2xvcmVkIGJhY2tncm91bmQgZWcuIExvZ2dlZCBJbgotKi8KLS5tZW51YmFyZW1waGFzaXMgewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0gCi0ubWlkYmFyYmcgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIH0gCi0gCi0vKnRvcG5hdiovIAotLm1pZGJhcmxpZ2h0IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzOTljYzsKLSB9Ci0gCi0vKmRhcmsgY29sb3IgYmV0d2VlbiB0YWJzKi8KLSAubWlkYmFyZGFyayB7IAotCWJhY2tncm91bmQ6ICMwMDMzNjY7Ci0gfQotIAotIC8qdG9wbmF2Ki8gCi0gLm1pZGJhcm1lZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotIAotIC8qYmFja2dyb3VuZCAgb2YgIHRhYnMqLyAKLSAubWlkYmFybWVkaXVtIHsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0gCi0gLm1pZGJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICM2NjY2NjY7Ci0gfSAKLSAgCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkbGVmdCBtb3ZpbmcgZm9yd2FyZCovCi0ubmF2bGVmdGJvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIgewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotLm5vbmFjdGl2ZXRhYiB7Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1zaXplOiAxMnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLypub3Rlcy8gZGVzY3JpcHRpb24gb2YgaWNvbiAqLwotLm5vdGVzeyAgCi0gZm9udC1zaXplOiAxMXB4OwotIGZvbnQtd2VpZ2h0IDogNDAwOwkKLX0KLQotcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLX0KLQotLnBhZ2Vib2xkIHsgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7CQotIH0KLSAKLS8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLSAucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgeyAKLQljb2xvcjogIzY3Njc2NzsJCi0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLS5wb3AgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemUgOiAxMnB4OwotCWZvbnQtd2VpZ2h0IDogMjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnBvcGJhY2tncm91bmQgewotCi0JYmFja2dyb3VuZDogI2Q2ZDNjZTsKLX0KLQotLnBvcGgxIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0ucG9wbGVmdG1lbnUgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyOiB0aGluIHNvbGlkIGNjY2NjYzsgCi0JbGVmdDogMjEwcHg7IAotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjphYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwkKLSB9Ci0KLSAvKiB1c2UgcG9wbGVmdG1lbnUgaW5zdGVhZCBvZiB0aGlzIG9uZSovCi0ucG9wdXBib3JkZXIgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyIDogdGhpbiBzb2xpZCBjY2NjY2M7Ci0JcGFkZGluZyA6IDJweDsKLX0KLQotLnBvcHVwdGV4dCB7CQotICAgY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxMXB4OwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5wcm9qZWN0YXR0IHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi0JY29sb3I6ICNjZDMzMDE7Ci19Ci0KLS8qZGF0ZSBhc3NvY2lhdGVkIHdpdGggYXJ0aWNsZSByYXRpbmdzKi8KLS5yYXRpbmdzZGF0ZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotc2VsZWN0IHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMXB4OwotfQotCi1zZWxlY3Quc2VscHgxNDQgewotICAgIHdpZHRoOiAxNDRweDsKLX0KLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0IHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVib2xkKi8gCi0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZCByZXBsYWNlIHdpdGggLmxlZnRtZW51YWN0aXZlKi8KLQotLyogLnNpZGVtZW51X2J1bGxldF9jb2xvcmVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVidWxsZXRhY3RpdmUqLwotIAotLyouc2lkZW1lbnVfYnVsbGV0X2dyZXkgcmVwbGFjZSB3aXRoIGxlZnRtZW51YnVsbGV0Ki8KLQotLnNpZGVtZW51Ym9sZGxlZnQgewotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0KLS5zaWRlbWVudWJvbGRsZWZ0c2VsZWN0ZWQgewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZCB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zbWFsbHRleHQgewotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS50YWJsZWhlYWRlciB7IAotCi0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTNweDsJCi0gICAgZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotdGQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsJCi19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFiIHsgCi0gCWJhY2tncm91bmQtY29sb3I6ICNjNGM0YzQ7Ci0gIH0KLSAKLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotdGQuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2RkZGRkZDsKLSAgfQotICAKLSAvKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotdGQuYnV0dG9uYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLQotdGQuYnV0dG9uaGlnaGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi10ZC5idXR0b25zaGFkb3cgewotCWJhY2tncm91bmQtY29sb3I6ICM2ZDZkNmQ7Ci19Ci0gCi0vKiBkZXNpZ24gZWxlbWVudCByYXJlbHkgdXNlZCBmb3IgbGluZSBjb2xvdXIgaW4gY2VydGFpbiBkZWNvcmF0aXZlIHRhYmxlcyAqLwotdGQuZGVzaWduMSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLSAKLS8qZGVzaWduIGVsZW1lbnQgc2ltdWxhdGluZyBhIGRpbWVuc2lvbmFsIGJvdW5kYXJ5IHRvIGEgdGFibGUgKi8KLXRkLmRpdmlkZXJkaW1lbnMgewotCWJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7Ci19Ci0gCi0gLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5ub25hY3RpdmV0YWIgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qIGRhdGEgd2l0aGluIGEgdGFibGUgaGlnaGxpZ2h0ZWQgaW4gZ3JheSovCi10ZC50YmxoaWdobHQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gICBwYWRkaW5nOiAycHg7Ci0gfQotIAotIHRkLnRibGhpZ2hsdDEgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0gfQotIAotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDIgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfSAKLQotLypkYXJrIGdyZXkgY2VsbCBiYWNrZ3JvdW5kIGFuZCBib2xkIHRleHQgKi8KLS50ZGRhcmtib2xkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwkKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLnRkbGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JcGFkZGluZzogMnB4OwotfQotCi0udGRsaWdodDEgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0gCi0gCi10ZXh0YXJlYSB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotdGV4dGFyZWEucHgzODB7Ci0gd2lkdGg6IDM4MHB4OyAKLSB9Ci0KLS50ZXh0ZXJyb3Jtc2cgewotCWNvbG9yIDogY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTEwJTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRleHRncmF5IHsgIAotCWNvbG9yOiAjOTk5OTk5OwkKLX0KLQotLnRvcGJhcmRpdmlkZXIgeyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjIAotfQotCi0udG9wYmFyZGl2aWRlcmdyZXllZCB7IAotCWJhY2tncm91bmQ6ICNhZGQ2ZWIKLSB9ICAKLQotLnRvcGJhcnNlcGFyYXRvciB7Ci0gIGNvbG9yOiAjY2MzMzAwOyAgCi0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLSAKLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VkZWRlZDsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodGdyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0MmdyZXllZCB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7Ci0gfSAKLSAKLS50b3BmcmFtZWxvZ29iZyB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotfQotCi0udG9wZnJhbWVsb2dvYmdncmV5ZWQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5YzJkNjsKLX0KLQotLnRvcGZyYW1lc2hhZG93IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICM4NDg0ODQ7Ci19Ci0KLS50b3BmcmFtZXNoYWRvd2dyZXllZCB7ICAKLWJhY2tncm91bmQtY29sb3I6ICNjZWNlY2U7Ci19Ci0KLS50b3BsZWZ0bmF2IHsJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcGxlZnRuYXZib2xkIHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGJyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Ym9sZGdyZXllZCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDEwcHg7IAotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Z3JleWVkIHsJCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQl9Ci0KLS50b3BsaW5lY29sb3IgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0JCi0JCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKiB0aGlzIHdhcyBpbml0aWFsbHkgZGVjbGFyZWQgdGhlIHNhbWUgY29sb3VyIGFzIHRoZSBjbGFzcyB0b3BmcmFtZSBiZyBidXQgYmVjYXVzZSBpdCBsaWVzIGluIGEgZGlmZmVyZW50IGZ1bmN0aW9uYWwgYXJlYSwgaGFzIGJlZW4gcmVjcmVhdGVkIGhlcmUgICovCi10ci5iZ21pZGZyYW1lIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi10ZC5zaWRlbWVudWJ1bGxldGdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVidWxsZXRjb2xvcmVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmxpc3Qtc3R5bGUtaW1hZ2U6IHVybChpbWFnZXMvZG93bmJ1dHRvbi5naWYpOyovCi11bCB7CQotCWxpc3Qtc3R5bGUtdHlwZTogc3F1YXJlOwotfQotIAotCi0udm9iIHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1MCU7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLS52b2Jib3R0b20gewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19pZTZuczYuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfaWU2bnM2LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBkYzQ2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19pZTZuczYuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTE4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qbXVzdCBhZGQgZm9udCB0eXBlIGlmIGNsYXNzIGlzIGJlaW5nIHVzZWQgYXMgYSBsaW5rIGFzIHdlbGwgYXMgIG5vLWxpbmsgKi8KLQotYSB7CQotCWNvbG9yOiAjMzM2Njk5OwotfQotCi1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLQotYS50b3ByaWdodG5hdmdyZXk6aG92ZXIgewotCWNvbG9yOiAjQ0MwMDAwOwotfSAKLWEudG9wcmlnaHRuYXY6aG92ZXIgewotCWNvbG9yOiAjOTlDQ0NDOwotfSAvKiBmb250IGZvciBhY3Rpb24gb24gY29udGVudCBwYWdlIHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZSA7aWUuLCBzZWxlY3QgYWxsKi8KLWEuYWN0aW9uIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi19IAotCi1hLmFjdGlvbnNlbGVjdG9yIHsgIAotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsJCi19Ci0KLS8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCBpbnN0ZWFkIG9mIHRoZSBvdXRlcm1vc3QgY2VsbCAqLwotYS5hY3RpdmV0YWIgeyAKLSAJY29sb3I6ICMwMDAwMDA7Ci0gCWZvbnQtc2l6ZTogMTJweDsKLSAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi1hLmFjdGl2ZXRhYnNlbGVjdGVkIHsgCi0gCWNvbG9yOiAjMmMyYzJjOwotIAlmb250LXNpemU6IDEycHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYmFzaWMgeyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbiB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmJ1dHRvbjphY3RpdmUgewotCWNvbG9yOiAzMzMzMzM7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKiBmb3Igbm9uLWltYWdlIGJ1dHRvbnMsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b246aG92ZXIgewotCWNvbG9yOiAzMzMzMzM7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucyBpbiBNdWx0aXNpdGUsIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbiAqLwotYS5idXR0b24yIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0KLS8qbWFpbiBjb250YWluZXIgIGFjdGlvbnMvbGlua3MgZm9yIGVkaXRpbmcqLwotYS5jb25saW5rZWRpdAotewotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotYS5jb3B5cmlnaHQgeyAJCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDEwcHg7Ci19IAotCi1hLmZvcm10YmxoZWFkIHsKLSAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiBsaWdodCBjb2xvdXJlZCBoZWFkaW5nIGxpbmsgZm9yIGRpc2N1c3Npb24gYW5kIHNpbWlsYXIgdXNlcyAtIHdhcyBoZWFkZXJfZGlzY3Vzc2lvbl9saW5rIGluIHByZXZpb3VzIHZlcnNpb25zICovCi0gYS5oZWFkZXJsaW5rbGlnaHQgewotCWNvbG9yOiAJZmZmZmZmOwotCWZvbnQtc2l6ZTogMC45ZW07Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQkKLQotLypib2xkIGxpbmssIGllLCBhZHZhbmNlZCBzZWFyY2ggbGluayBpbiBwZSovCi1hLmxpbmtmdW5jb3B0aW9uIHsgIAkJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0JCi1hLm5hdnRyZWV7IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfSAKLQotLypuYXZ0cmVlIGl0ZW0gb3IgZG9jLCBub2RlcyB0aGF0IGRvbid0IGV4cGFuZCovCi1hLm5hdnRyZWVpdGVteyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotCi0vKiBzaW1wbGUgbWVjaGFuaXNtIHRvIHR1cm4gdGV4dCBkZWNvcmF0aW9uIG9mZiAqLwotYS5ub2xpbmUgewotIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi1hLnBvcHVwdGV4dCB7CQotICAgY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxMXB4OwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucG9wdGV4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udCA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHVwdGV4dDphY3RpdmV7CQotY29sb3I6ICNjYzAwMDA7Ci19Ci0KLWEuc21hbGwgewkKLQlmb250LXNpemU6IDExcHg7CQotfQotCi1hLnNtYWxsYiB7CQotICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotYS50b3BiYXJ7Ci0gIGNvbG9yOiAjNjY2NjY2OwotICAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotCi0vKnVzZWQgYXMgaGlnaGxpZ2h0ZWQgZGVzY3JpcHRpb24gYWJvdmUgdGFibGVzKi8KLS5hY2NlbnRjb2xvciB7Ci0JY29sb3IgOiAjY2MzMzAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0gLyogYmdjb2xvciAgZm9yIGFjdGlvbiB0ZXh0IHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZTtpZS4sIHNlbGVjdCBhbGwqLwotLmFjdGlvbmJnIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0uYWN0aW9uc2VsZWN0b3IgewotICAgYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLS5hY3Rpb25zZWxlY3RvcmRpcyB7Ci1iYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotCWNvbG9yOiAjY2NjY2NjOwotCWZvbnQtc2l6ZTogMTFweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWIgeyAKLSAgIGZvbnQtd2VpZ2h0IDogYm9sZDsKLSB9Ci0gCi0uYmFzZWxpbmVpdGFsaWNzIHsKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uYmdibGFjayB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci19Ci0KLSAvKiBiYXNpYyBjb2x1bW4gYmFja2dyb3VuZCBjb2xvdXIgZm9yIGRpc2N1c3Npb25zLCBmaWxlcywgb3RoZXIgc3VjaCB0YWJ1bGF0ZWQgZGF0YSAqLwotLmJnY29sdW1uYmFzaWMgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0KLSAKLS5iZ3doaXRlIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9IAotIAotIC8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gIAotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNmZmZmZmY7ICAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7CQkKLQltYXJnaW4tbGVmdDogMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLX0KLQotLmJvbGQgeyAKLSAgIGZvbnQtd2VpZ2h0IDogNjAwOwotIH0KLQotIC5ib3JkZXJncmF5IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLSB9Ci0gCi0gLmJvdHRvbWJhcmRhcmt7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDMzNjY7Ci0gfQotIAotLmJvdHRvbWJhcmxpZ2h0eyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLmJvdHRvbWJhcnNoYWRvd3sgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0KLS5icmVhZGNydW1ic3sgCi1jb2xvcjogIzMzNjY5OTsKLWZvbnQtd2VpZ2h0OiA2MDA7Ci0gfSAKLSAKLS5icmVhZGNydW1iczJ7IAotY29sb3I6ICNmZmZmZmY7Ci1mb250LXNpemU6IDExcHg7Ci0gfSAKLSAgCi0gLypuYXZpZ2F0aW9uIGJ1dHRvbnMsIG5vdCBmb3JtIGJ1dHRvbnMqLyAKLS5idXR0b25zIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDEwcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLyphY3RpdmUgbmF2aWdhdGlvbiBidXR0b24sIG5vdCBmb3JtIGJ1dHRvbnMqLyAKLS5idXR0b25vbiB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19IAotCi0vKiB0aGVzZSBidXR0b24gc3R5bGVzIGFyZSBmb3IgdGhlIHRleHR1YWwgYnV0dG9ucyBpbnRlbmRlZCB0byByZXBsYWNlIGltYWdlIGNvbnN0cnVjdHMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovIAotLmJ1dHRvbnR4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uY29kZSB7IAotICAgZm9udC1mYW1pbHk6IENvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vOyAgIAotICAgZm9udC1zaXplOiAxMnB4OwotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotLmNvbW1lbnRzIHsgCQotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JZm9udC1zaXplOiAxMXB4OwkKLX0KLQotLyptYWluIGNvbnRhaW5lciBoZWFkZXIqLwotLmNvbmhlYWR7IAotY29sb3I6ICNjYzMzMDA7Ci1mb250LXdlaWdodDogNjAwOwotdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLSB9Ci0KLSAvKm1haW4gY29udGFpbmVyIGRhdGEgbGFiZWxzKi8KLS5jb25sYWJlbHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotIH0gCi0KLS8qbWFpbiBjb250YWluZXIgZGF0YSBsYWJlbHMgaW4gYm9sZCovCi0uY29ubGFiZWxib2xkIHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gfSAgCi0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkcmlnaHQgbW92aW5nIGZvcndhcmQsIHVzZSBmb3IgbGlua3MgYW5kIG5vbi1saW5rcyovCi0uY29ucmJvbGQKLXsKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19IAotIAotIAotLypoZWFkZXIgZm9yIHJpZ2h0IGhhbmQgY29udGFpbmVyKi8KLS5jb25yaGVhZCB7Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLyptYWluIGNvbnRhaW5lciB0YWJsZSBoZWFkZXIqLwotLmNvbnRibGhlYWQgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JY29sb3I6ICMzMzMzMzM7CQotCWZvbnQtc2l6ZTogNzAlOwkKLSAgICBmb250LXdlaWdodDogNjAwOwotfQotCi0uY29udGVudHsgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotIH0KLQotIC8qbWVkaXVtIGdyZXkgY2VsbCBiYWNrZ3JvdW5kKi8KLS5jb250ZW50Ym9yZGVyIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi0vKiBhZGRlZCBmb3IgdGV4dCByZXByZXNlbnRpbmcgZGlzYWJsZWQgZnVuY3Rpb25zLiAqLwotLmNvbnRlbnRkaXNhYmxlZCB7Ci0JY29sb3I6ICNjY2NjY2M7Ci19Ci0KLS8qIGZvbnQgZm9yIGJvbGQgdGV4dCAqLwotLmNvbnRlbnRlbXBoYXNpcyB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS8qIHVzZWQgdGV4dCByZW1pbmRpbmcgdXNlciB0aGF0IHRoZXJlIGlzIHJlcXVpcmVkIGNvbnRlbnQgKi8KLS5jb250ZW50cmVxdWlyZWQgewotCWNvbG9yOiAjYjRiNGI0OwotCWZvbnQtd2VpZ2h0OiA1MDA7Ci19Ci0KLS5jb3B5cmlnaHQgeyAKLQljb2xvciA6ICM5OTk5OTk7Ci0JZm9udC1zaXplIDogMTBweDsKLX0KLQotLypibGFjayBjb3B5cmlnaHQqLwotLmNvcHlyaWdodGIgeyAKLWNvbG9yIDogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxMHB4OwotfQotCi1kZCB7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMnB4OwkKLW1hcmdpbi1sZWZ0OiAtMXB4OwotIH0KLSAKLS5kaWFsZ2J4c2hhZG93MiB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjODQ4NDg0OwotfQotCi0uZGlhbG9ndWVib3hiZyB7Ci0gCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDIKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMwotIH0KLSAKLS5kaWFsb2d1ZWJveGhpZ2hsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLmRpYWxvZ3VlYm94bWVkaXVtIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzhiOGI4YgotIH0KLSAKLS5kaWFsb2d1ZWJveHRpdGxlIHsJICAgCi0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLX0KLQotLyp0ZXh0IGZvciBkaXNhYmxlZCBidXR0b25zKi8KLS5kaXNhYmxleyAKLWNvbG9yOiAjOTk5OTk5OwotZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci1mb250LXNpemU6IDExcHg7ICAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9IAotCi0gZGl2eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotIH0gCi0KLS8qdXNlZCB0byBhZmZlY3QgcmlnaHQgbWFyZ2luKi8gCi1kaXYubWFyZ2lucnR7IAotCWNsZWFyOiByaWdodDsKLQlmbG9hdDogcmlnaHQ7Ci0Jd2lkdGg6IDdweDsKLSB9IAotIAotZGl2Lm1hcmdpbnMgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDI1cHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgIAotCi0vKmZvciBwYWdlcyB3aXRoIGJ1dHRvbiBuYXZpZ2F0aW9uIG9uIHRvcCovICAKLWRpdi5tYXJnaW5zMjAgeyAKLWZsb2F0OiBsZWZ0OwotbWFyZ2luLWxlZnQ6IDdweDsKLW1hcmdpbi10b3A6IDIwcHg7CQotbWFyZ2luLXJpZ2h0OiA3cHg7Ci0gfSAgIAotCi0gLyphZGRzIDEwIHB4IHBhZGRpbmcqLwotIGRpdi5wYWQxMHsgCi0gcGFkZGluZzogMTBweDsgCi0gIH0KLSAgCi0uZGl2aWRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Y2ZjlmMDsKLX0KLQotZGx7ICAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxMnB4OyAgIAotCX0KLQkKLS8qcmVtb3ZlcyBkZWZhdWx0IGJvdHRvbSBtYXJnaW4sIGRvZXNuJ3Qgd29yayBpbiBOUzQuN3ggKi8gIAotIGRsLmRhdGEgeyAKLW1hcmdpbi1ib3R0b206IC0xcHg7Ci0gfSAKLSAKLS5kb2Nib2xkIHsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7ICAgICAgIAotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKmZvciBhcHBsZXQgZG93bmxvYWQgc3BsYXNoIHBhZ2UqLwotLmRvd25sb2FkeyAKLWJhY2tncm91bmQtY29sb3I6ICNlZmVlZWU7Ci0gfQotIAotLmVycm9ybXNnIHsKLQljb2xvciA6ICNjYzAwMDA7CQotfSAgCi0KLS8qCi1jb2xvcmVkIGZvbnQKLWRlc2NyaXB0aW9uIGFib3V0IHRoZSB1c2VyIHN0YXR1cy4gZXEuICJzdWJzY3JpcHRpb25zIGFyZSB1cGRhdGVkIgotaXQncyB1c3VhbGx5IG9uIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBwYWdlcwotKi8KLS5mb290ZXJib2xkIHsKLQljb2xvciA6ICNhNGE0YTQ7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi0uZm9vdGVyYm9sZGNvbG9yZWQgewotCWNvbG9yIDogI2ZmNjUwMDsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0uZm9vdGluZGljYXRvciB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OyAgICAgICAKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RzdGFyaW5kZXggewotCWNvbG9yIDogI2NjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmZvcm1sYWJlbCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5mb3JtdGJsaGVhZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLmdyZXltZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS5ncmF5Zm9sZCB7Ci0JY29sb3I6ICNjY2NjY2M7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LXNpemU6IDE1cHg7Ci19Ci0KLS8qTm90ZTogcmVtb3ZlIHRoaXMgbm90ZSBpZiB1c2luZyB0aGlzIHN0eWxlIG9yIHdpbGwgYmUgZGVsZXRlZCovCi0JLyogQ3VycmVudGx5IHVzZWQgaW4gY3FfZGVmbGVjdF9sb2dpbl9lcnIuaHRtbCAtIHNob3VsZCBiZSByZW5hbWVkIHRvIHNvbWV0aGluZyB0aGF0IGhhcyBsZXNzIGRlc2NyaXB0aXZlIG5hbWUgKi8KLS5oZWFkZXJibHVlIHsKLQljb2xvcjogIzAwNjY5OTsJCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnVzZWQgaW4gY2MgZm9yIGZyYW1lc2V0IGRpc3BsYXkqLyAKLS5oZWFkZXJpbmZyYW1lcyB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1ib3R0b206IDJweDsKLQltYXJnaW4tdG9wOiAwcHg7Ci19Ci0KLQotIC8qZm9udCBmb3IgcGFnZSBoZWFkZXIgZXhjZXB0IGZvciBhcnRpY2xlIHBhZ2VzLCAoc2VlIGhlYWRlcl9vZl9hcnRpY2xlKSovCi0uaGVhZGVybGFyZ2UgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTYwJTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbWFpbiBoZWFkZXIgZm9yIGZyYW1lIG5hdmlnYXRpb24sIGllLCBjbGVhcmNhc2UgbWVyZ2UgZmlsZXMqLwotLmhlYWRlcm1haW4geyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxN3B4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKiBoZWFkZXIgZWxlbWVudCBmb3IgZm9ybSB0YWJsZXMgY29udGFpbmluZyBtaWQtc2l6ZSBmaXhlZCBoZWlnaHQgdGV4dCAqLwotLmhlYWRlcm1lZGxpc3QgewotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotLypmb3JudCBmb3Igc3RlcHMgdGl0bGUgaW4gZm9ybXMqLwotLmhlYWRlcm9mc3RlcHMgeyAKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDE3cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5oZWFkZXJvZnN0ZXBzbm9uIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyp1c2UgaGVhZGVyMSBpbnN0ZWFkKi8KLS5oMSB7ICAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qdG8gcmVwbGFjZSBoMSBhbmQgY29udGVudGhlYWRlciBsYXJnZSovCi0uaGVhZGVyMSB7ICAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIycHg7CQotCWZvbnQtd2VpZ2h0OiA4MDA7Ci19Ci0KLS8qZG9jdW1lbnQgcm9vdCBmb2xkZXIqLwotLmgxcm9vdHsgIAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjJweDsJCi0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLyp1c2VkIGluIGNjLCBjcSwgc2wqLyAgCi1oMSB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE3cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLS8qdXNlIGhlYWRlcjIgaW5zdGVhZCovCi0uaDIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE5cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotLypoZWFkZXJzIHdpdGhpbiBwYWdlKi8KLS5oZWFkZXIyIHsgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOXB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7CSAJCi19Ci0KLWkgewotCWZvbnQtc3R5bGUgOiBpdGFsaWM7Ci19Ci0KLS5pY29uYm9yZGVyIHsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLypmb250IHNpemUgc2V0dXAgc2hvd24gaW4gdGhlIGlucHV0IGJveCB3aGljaCBpcyBpbmhlcml0ZWQgYnkgaW5wdXRYWCovCi1pbnB1dCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0gCi0KLS8qIDEsYnVzaW5lc3Mgc3RhbmRhcmQgbXVsdGlsaW5lIGlucHV0IGJveCAKLTIsdGhpcyBzdHlsZSBvbmx5IGFjdGl2YXRlIGluIElFICovCi1pbnB1dC5tYXg1MCB7Ci0Jd2lkdGg6IDM2MHB4OwotfQotCi1pbnB1dC5weDI1IHsKLSAgICB3aWR0aDogMjVweAotfQotCi1pbnB1dC5weDQ1IHsKLQotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLS8qCi0xLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRQotKi8KLWlucHV0LnB4ODUgewotICAgIHdpZHRoOiA4NXB4Ci19Ci0KLWlucHV0LmlucHV0MTM1IHsKLQl3aWR0aDogMTM1cHgKLX0KLQotaW5wdXQucHgxMzUgewotICAgIHdpZHRoOiAxMzVweAotfQotCi1pbnB1dC5weDE1NSB7Ci0gICAgd2lkdGg6IDE1NXB4Ci19Ci0KLWlucHV0LnB4MjMwIHsKLSAgICB3aWR0aDogMjMwcHgKLX0KLQotaW5wdXQucHgzMDUgewotICAgIHdpZHRoOiAzMDVweDsKLX0KLQotCi0ubGVmdG1lbnUgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLS5sZWZ0bWVudWJ1bGxldCB7IAotYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLSB9Ci0gCi0ubGVmdG1lbnVidWxsZXRhY3RpdmUgeyAKLWJhY2tncm91bmQtY29sb3I6ICNjZDMzMDE7Ci0gfSAKLSAKLS5sZWZ0bmF2aGVhZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7CQotCWZvbnQtc2l6ZTogMTNweDsJCi19IAotCi0ubGVmdG5hdmxhYmVsIHsKLWNvbG9yOiAjMDAwMDAwOwotZm9udC13ZWlnaHQgOiA2MDA7Ci1mb250LXNpemU6IDExcHg7Ci0gfQotCi0gLmxpZ2h0Z3JheSB7IAotYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsKLSB9Ci0KLS5tZW51YmFyIHsKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA0MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0KLS5tZW51YmFyOmhvdmVyIHsKLSAgY29sb3I6ICNmZmZmZmYKLX0gCi0KLS8qbWVudWJhciB3aXRoaW4gdG9wIG9mIGNvbnRlbnQgcGFnZSAgKi8KLS5tZW51YmFybWlkeyAKLWZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi0gfQotIAotLyoKLTEsYm9sZCBmb250IGZvciB0aGUgbGFzdCBpdGVtIG9mIHRoZSBicmVhZGNydW1icwotMixib2xkIGZvbnQgb2YgdGFibGUgaGVhZGVyIHdpdGggbWVudWJhcl9iZyhibHVlKSBhcyBiYWNrZ3JvdW5kIGNvbG9yIAotMyxib2xkIHRleHQgb24gY29sb3JlZCBiYWNrZ3JvdW5kIGVnLiBMb2dnZWQgSW4KLSovCi0gLm1lbnViYXJlbXBoYXNpcyB7Ci0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLm1lbnViYXI6aG92ZXIgewotICBjb2xvcjogI2ZmZmZmZgotfSAKLQotLm1pZGJhcmJnIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9Ci0gIAotLyp0b3BuYXYqLyAKLS5taWRiYXJsaWdodCB7IAotCWJhY2tncm91bmQtY29sb3I6ICMzMzk5Y2M7Ci0gfQotCi0vKmRhcmsgY29sb3IgYmV0d2VlbiB0YWJzKi8KLS5taWRiYXJkYXJrIHsgCi0JYmFja2dyb3VuZDogIzAwMzM2NjsKLSB9Ci0gCi0vKnRvcG5hdiovIAotIC5taWRiYXJtZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDA2Njk5OwotIH0KLSAKLSAvKmJhY2tncm91bmQgIG9mICB0YWJzKi8KLS5taWRiYXJtZWRpdW0geyAKLQliYWNrZ3JvdW5kOiAjMDA2Njk5OwotIH0KLSAKLSAubWlkYmFyc2hhZG93IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLSB9Ci0gCi0vKnJlcGxhY2luZyBzaWRlbWVudV9ib2xkbGVmdCBtb3ZpbmcgZm9yd2FyZCovCi0ubmF2bGVmdGJvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmxlZnQgbmF2IHN1Ym1lbnUqLwotLm5hdmxlZnRzdWIKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0gIAotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi0ubm9uYWN0aXZldGFiIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXNpemU6IDEycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm5vdGVzLyBkZXNjcmlwdGlvbiBvZiBpY29uICovCi0ubm90ZXN7ICAKLSBmb250LXNpemU6IDExcHg7Ci0gZm9udC13ZWlnaHQgOiA0MDA7CQotfQotCi1wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQotCi0ucGFnZWJvbGQgeyAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsJCi0gfQotIAotIC8qZm9udCBmb3IgdGhlIG51bWJlcnMgaW4gcGFnaW5hdGlvbiBsaWJyYXJ5Ki8KLSAucGFnZW51bWJlciB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci19Ci0KLSAvKmZvbnQgZm9yIHByZXZpb3VzICYgbmV4dCBpbiBwYWdpbmF0aW9uKi8KLS5wYWdlc3RlcHMgeyAKLQljb2xvcjogIzY3Njc2NzsJCi0JZm9udC1zaXplOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSB9Ci0KLS5wb3AgewotCWZvbnQtc2l6ZSA6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiAyMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucG9wYmFja2dyb3VuZCB7Ci0JYmFja2dyb3VuZDogI2Q2ZDNjZTsKLX0KLQotLnBvcGgxIHsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiBib2xkOwotfQotCi0ucG9wbGVmdG1lbnUgewotCWJhY2tncm91bmQ6ICNmMGYwZjA7Ci0JYm9yZGVyOiB0aGluIHNvbGlkIGNjY2NjYzsgCi0JbGVmdDogMjEwcHg7IAotCXBhZGRpbmc6IDJweDsKLQlwb3NpdGlvbjphYnNvbHV0ZTsgCi0JdG9wOiAyNXB4OwotCXZpc2liaWxpdHk6IGhpZGRlbjsgCi0Jd2lkdGg6NzVweDsKLQl6LWluZGV4OjEwOwotIH0KLQotIC8qIHVzZSBwb3BsZWZ0bWVudSBpbnN0ZWFkIG9mIHRoaXMgb25lKi8KLSAucG9wdXBib3JkZXIgewkKLQliYWNrZ3JvdW5kOiAjZjBmMGYwOwotCWJvcmRlciA6IHRoaW4gc29saWQgY2NjY2NjOwotCXBhZGRpbmcgOiAycHg7Ci19Ci0KLS5wb3B1cHRleHQgewkKLSAgIGNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTFweDsJCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0gCi0ucHJvamVjdGF0dCB7IAotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7IAotCWNvbG9yOiAjY2QzMzAxOwotfQotCi0vKmRhdGUgYXNzb2NpYXRlZCB3aXRoIGFydGljbGUgcmF0aW5ncyovCi0ucmF0aW5nc2RhdGUKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LXNpemUgOiAxMXB4OwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXNlbGVjdCB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotc2VsZWN0LnNlbHB4MTQ0IHsKLSAgICB3aWR0aDogMTQ0cHg7Ci19Ci0KLS8qIC5zaWRlbWVudV9ib2xkbGVmdCByZXBsYWNlIHdpdGggLmxlZnRtZW51Ym9sZCovIAotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnRfc2VsZWN0ZWQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWFjdGl2ZSovCi0gCi0vKiAuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWJ1bGxldGFjdGl2ZSovCi0gCi0vKi5zaWRlbWVudV9idWxsZXRfZ3JleSByZXBsYWNlIHdpdGggbGVmdG1lbnVidWxsZXQqLwotIAotLnNpZGVtZW51Ym9sZGxlZnQgewotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0gCi0KLS5zaWRlbWVudWJvbGRsZWZ0c2VsZWN0ZWQgewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZCB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0uc2lkZW1lbnVzdGFuZGFyZHNlbGVjdGVkIHsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zbWFsbHRleHQgewotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMwMDAwMDA7Ci19Ci0KLS50YWJsZWhlYWRlciB7ICAKLQljb2xvcjogIzAwMDAwMDsJCi0JZm9udC1zaXplOiAxM3B4OwkKLSAgICBmb250LXdlaWdodDogYm9sZAotfQotCi0vKiBmb250IGZvciByZWd1bGFyIGNvbnRlbnQgdGV4dCAqLwotLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLXRkIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7CQotfQkKLQotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5hY3RpdmV0YWIgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2M0YzRjNDsKLX0KLQotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAliYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOwotICB9Ci0KLS8qIHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi10ZC5idXR0b25ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDRkNGQ0OwotfQotCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLXRkLmJ1dHRvbnNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZkNmQ2ZDsKLX0KLSAgCi0vKiBkZXNpZ24gZWxlbWVudCByYXJlbHkgdXNlZCBmb3IgbGluZSBjb2xvdXIgaW4gY2VydGFpbiBkZWNvcmF0aXZlIHRhYmxlcyAqLwotdGQuZGVzaWduMSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2Q0ZDRkNDsKLX0KLQotLypkZXNpZ24gZWxlbWVudCBzaW11bGF0aW5nIGEgZGltZW5zaW9uYWwgYm91bmRhcnkgdG8gYSB0YWJsZSAqLwotdGQuZGl2aWRlcmRpbWVucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKLX0KLQotIC8qIGJlY2F1c2Ugb2YgYW4gaW50ZXJ2ZW5pbmcgbGluayB0YWcsIHRleHQgb3B0aW9ucyB3ZXJlIGF0dGFjaGVkIHRvIGEgc2ltaWxhciBlbGVtZW50IGZvciBsaW5rcyAqLwotIHRkLm5vbmFjdGl2ZXRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBncmF5Ki8KLXRkLnRibGhpZ2hsdCB7IAotICAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLSAgIHBhZGRpbmc6IDJweDsKLSB9Ci0gCi0gdGQudGJsaGlnaGx0MSB7IAotICAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLSB9Ci0gCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGxpZ2h0IGdyYXkqLwotdGQudGJsaGlnaGx0MiB7IAotICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9IAotCi0vKmRhcmsgZ3JleSBjZWxsIGJhY2tncm91bmQgYW5kIGJvbGQgdGV4dCAqLwotLnRkZGFya2JvbGQgewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLS50ZGxpZ2h0IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotCXBhZGRpbmc6IDJweDsKLX0KLQotLnRkbGlnaHQxIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi10ZXh0YXJlYSB7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotdGV4dGFyZWEucHgzODB7Ci0gd2lkdGg6IDM4MHB4OyAKLSB9Ci0KLS50ZXh0ZXJyb3Jtc2cgewotCWNvbG9yIDogY2MwMDAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTEwJTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnRleHRncmF5IHsgIAotCWNvbG9yOiAjOTk5OTk5OwkKLX0KLQotLnRvcGJhcmRpdmlkZXIgeyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjIAotfQotCi0udG9wYmFyZGl2aWRlcmdyZXllZCB7IAotCWJhY2tncm91bmQ6ICNhZGQ2ZWIKLX0gIAotCi0udG9wYmFyc2VwYXJhdG9yIHsKLSAgY29sb3I6ICNjYzMzMDA7ICAKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BmcmFtZWJnIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDJkMmQyOwotfQotCi0udG9wZnJhbWViZ2dyZXllZCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VkZWRlZDsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0IHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNiNmI1YjU7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodGdyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZTFlMWUxOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLSAKLS50b3BmcmFtZWhpZ2hsaWdodDJncmV5ZWQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5OwotfSAKLQotLnRvcGZyYW1lbG9nb2JnIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS50b3BmcmFtZWxvZ29iZ2dyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljMmQ2OwotfQotCi0udG9wZnJhbWVzaGFkb3cgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLnRvcGZyYW1lc2hhZG93Z3JleWVkIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNjZWNlY2U7Ci19Ci0KLS50b3BsZWZ0bmF2IHsJCi0gICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzAwMDAwMDsKLX0KLQotLnRvcGxlZnRuYXZib2xkIHsgCi0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OyAKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Ym9sZGdyZXllZCB7IAotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOyAKLQlmb250LXNpemU6IDEwcHg7IAotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsgCi19Ci0KLS50b3BsZWZ0bmF2Z3JleWVkIHsJCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcGxpbmVjb2xvciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQotCi0udG9wcmlnaHRuYXYgewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3ByaWdodG5hdmdyZXkgCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLyogdGhpcyB3YXMgaW5pdGlhbGx5IGRlY2xhcmVkIHRoZSBzYW1lIGNvbG91ciBhcyB0aGUgY2xhc3MgdG9wZnJhbWUgYmcgYnV0IGJlY2F1c2UgaXQgbGllcyBpbiBhIGRpZmZlcmVudCBmdW5jdGlvbmFsIGFyZWEsIGhhcyBiZWVuIHJlY3JlYXRlZCBoZXJlICAqLwotdHIuYmdtaWRmcmFtZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2dyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNjZDMzMDE7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7Ki8KLXVsIHsKLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KLQotLnZvYgotewotCWZvbnQtc2l6ZTogMTUwJTsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLX0KLQotLnZvYmJvdHRvbQotewotCWZvbnQtc2l6ZTogMTRweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19uZXRzY2FwZTQuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvZG9jcm9vdC9zdHlsZXNoZWV0cy9zdHlsZXNfbmV0c2NhcGU0LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3NWQ0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc19uZXRzY2FwZTQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLXRkLnNwYW4uY29udGVudF9iYXNpYwotIHsKLQlwYWRkaW5nLWxlZnQgOiA1cHg7Ci19Ci0KLWEKLXsKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotCi0uYWNjZW50Y29sb3IKLXsKLQljb2xvciA6ICNjYzMzMDA7Ci0JZm9udC1zaXplIDogMTJweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1hLnRvcHJpZ2h0bmF2OmFjdGl2ZSB7Ci0JY29sb3I6ICM5OUNDQ0M7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmFjdGl2ZSB7Ci0JY29sb3I6ICNDQzAwMDA7Ci19Ci0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gYS5icmVhZGNydW1icwotewotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNDAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lCi19Ci0KLQotYS5icmVhZGNydW1iczpob3ZlcgotewotICBjb2xvcjogI2ZmZmZmZgotfQotCi0KLWEubGlua19yZXZlcnNlOmhvdmVyCi17Ci0gICAgYmFja2dyb3VuZDogI2RjZGNkYzsKLX0KLQotCi1hLmxpbmtfY29udGFpbmVyX2VkaXRvcgotewotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotCi1hLmxpbmtfYnlsaW5lCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplIDogLjllbTsKLX0KLQotCi1hLmxpbmtfZnVuY19vcHRpb24KLXsKLSAgCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi1hLmxpbmt0eXBlZAotewotCWZvbnQtc2l6ZTogMTFweDsKLX0KLQotYS5tZW51YmFyX2xpbmsKLXsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZQotfQotCi1hLm1lbnViYXJfbGluazpob3ZlcgotewotCWNvbG9yOiAjZmZmZmZmOwotfQotCi1hLm5hdnRyZWUKLXsgCQotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotCi1hLnByb2plY3RfbmF2Ci17Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLWEucHJvamVjdF9uYXZ0cmVlCi17Ci0gIGNvbG9yOiAjMDAwMDAwOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxMXB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci1hLnRvcGJhcgotewotICBjb2xvcjogIzY2NjY2NjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1ib2R5IAotewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOXB4OwotCWJhY2tncm91bmQtY29sb3IgOiBXaGl0ZTsKLX0KLQotCi0uYm9yZGVyX2RlY29yYXRpb24KLXsKLQlib3JkZXIgOiB0aGluIGRvdHRlZCAjNjY2NjY2OwotfQotCi0KLS5ib3R0b21iYXJfZGFyawoteyAKLQliYWNrZ3JvdW5kOiAjMDAzMzY2OwotIH0KLQotCi0uYm90dG9tYmFyX2xpZ2h0Ci17IAotCWJhY2tncm91bmQ6ICMzMzk5Y2M7Ci0gfQotCi0KLSAuYm90dG9tX21lZGl1bQoteyAKLQliYWNrZ3JvdW5kOiAjMDA2Njk5OwotIH0KLQotCi0gLmJvdHRvbWJhcl9zaGFkb3cKLXsgCi0JYmFja2dyb3VuZDogIzAwMDAwMDsKLSB9Ci0KLQotY29kZSAKLXsKLQljb2xvcjogIzY3Njc2NzsJCi19Ci0KLS5jb2RlMgotewotICAgCW1hcmdpbi1sZWZ0IDogMTVweDsKLQltYXJnaW4tcmlnaHQgOiAxNXB4OwotfQotCi0uY29weXJpZ2h0Ci17IAotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogNjAlOwotIH0KLQotCi0uY29udGVudF9iYXNpYwotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5jb250ZW50X2Jhc2ljX2VtcGhhc2lzCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5jb250ZW50X2NvbG9yZWQKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogMTJweDsKLX0KLQotCi0uY29udGVudF9jb250YWluZXIKLSB7Ci0JbWFyZ2luLWJvdHRvbSA6IDE1cHg7Ci19Ci0KLSAuY29udGVudF9kaWFncmFtCi0gewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTo2MCU7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLQkKLX0KLQotLmNvbnRlbnRfZ3JleV9taWQKLXsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5jb250ZW50X2dyZXlfbWlkMgotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5jb250ZW50X2VtcGhhc2lzCi0gewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci19Ci0KLS5jb250ZW50X2hlYWRlcgotewotCWNvbG9yOiAjMDA2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExMCU7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uY29udGVudF9oZWFkZXJfbGFyZ2UKLXsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxLjJlbTsKLQlmb250LXdlaWdodCA6IDYwMDsKLQljb2xvcjogIzMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotIC5jb250ZW50X2hlYWRlcl9jb2xvcmVkCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0KLSAuY29udGVudF9yZWZlcmVuY2UKLSB7Ci0JZm9udC1zdHlsZSA6IGl0YWxpYzsKLX0KLQotIC5jb250ZW50X3JpZ2h0Ci17Ci0JZmxvYXQ6IHJpZ2h0OwotCW1hcmdpbi10b3AgOiA1cHg7Ci0Jd2lkdGg6IDE2NjsKLX0KLQotIC5jb250ZW50X3JpZ2h0X3RhYmxlCi17Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLQotIC5jb250ZW50X3NtYWxsCi17Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0gLmNvbnRlbnRfc21hbGxfY29sb3JlZAotewotCWNvbG9yIDogIzk5OTk5OTsKLQlmb250LWZhbWlseSA6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplIDogMTFweDsKLX0KLQotCi0gLmNvbnRlbnRfc21hbGxfY29sb3JlZF8yCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZSA6IDExcHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0gIC5jb250ZW50X3NtYWxsX2NvbG9yZWRfMwotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5IDogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemUgOiAxMXB4OwotfQotCi0KLS5jb250ZW50X3NtYWxsX2VtcGhhc2lzCi0gewotIAlmb250LXNpemUgOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0KLS5jb250ZW50X3N1YmhlYWRlcgotewotICAgIGZvbnQtc2l6ZSA6IDEycHg7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtd2VpZ2h0OiAgYm9sZDsKLX0KLQotCi0uY29udGVudF9zdWJoZWFkZXJfMgoteyAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsKLSB9Ci0KLQotIC5kaXNjdXNzaW9uX2NvbnRlbnQKLXsgCi0JY29sb3I6IDAwMDAwMDsKLQlmb250LXNpemU6IDExcHg7Ci0JbWFyZ2luLWxlZnQ6IDVweDsKLSB9Ci0KLQotLmRpc2N1c3Npb25fY29udGVudF9lbXBoYXNpcwotewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotCW1hcmdpbi1sZWZ0OiA1cHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci19Ci0KLQotIC5kaXNjdXNzaW9uX2Rlc2NyaXB0aW9uCi0geyAKLQljb2xvcjogNjY2NjY2OwotCWZvbnQtc2l6ZTogMTFweDsKLQltYXJnaW4tbGVmdDogNXB4OwotICB9Ci0KLQotLmVkaXRvcm5vdGUgCi17ICAKLQlmb250LXN0eWxlOiBpdGFsaWMKLX0KLQotIC8qdGhlIGZvbGxvd2luZyB0d28gY2xhc3NlcyBhcmUgdXNlZCBleHByZXNzbHkgaW4gdGhlIGtub3dsZWRnZV9hbm5vdW5jZW1lbnRzX3ZpZXcqLwotIAotIC5mbG9hdGNsZWFyCi17Ci0JcGFkZGluZzogNXB4OwotCXBhZGRpbmctYm90dG9tOiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMCBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmZsb2F0Z3JleQotewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0JcGFkZGluZzogNXB4OwotCXdpZHRoOiA2NXB4OwotfQotCi0KLS5mb290bm90ZQoteyAKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IC45ZW07Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci0gfQotLmZvcm1maWVsZF9kZXNjIAotewotY29sb3I6ICMzMzMzMzM7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotZm9udC1zaXplOiAxZW07IAotZm9udC13ZWlnaHQgOiA0MDA7IAotIGZvbnQtc3R5bGU6IGl0YWxpYwotfQotLmZvcm1maWVsZF90aXRsZQotewotICAgIGZvbnQtc2l6ZSA6IDEycHg7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CQotCWZvbnQtd2VpZ2h0OiAgYm9sZDsKLX0KLS5mb290X3N0YXJpbmRleAotewotCWNvbG9yIDogI2NjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uZm9vdF9kZXNjcmlwdGlvbgotewotCWNvbG9yIDogI2ZmNjUwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi0uZm9vdF90ZXh0Ci17Ci0JY29sb3I6ICNiNGI0YjQ7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotLmZvb3RfdGl0bGUKLXsKLQljb2xvciA6ICNmZjY1MDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci19Ci0KLQotLmZsb3djaGFydCAKLXsgIAotCWZvbnQtc2l6ZTogOHB0OyBjb2xvcjogIzY2NjY2NgotfQotCi0KLS5oZWFkZXJfZGlzY3Vzc2lvbl9saW5rCi0gewotCWNvbG9yOiBmZmZmZmY7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0uaGVhZGVyX2Rpc2N1c3Npb25fbGlua2RrCi0gewotCWNvbG9yOiAwMDAwMDA7Ci0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLS5oZWFkZXJfZGlzY3Vzc2lvbl90aXRsZQotIHsKLQljb2xvcjogZmZmZmZmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogNjAwOwotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodDogNXB4OwotfQotCi0KLS5oZWFkZXJsaW5rX29mX2NvbnRhaW5lcgotewotCWNvbG9yOiAjNjY5OWNjOwotCWZvbnQtZmFtaWx5OiBhcmlhbCx2ZXJkYW5hLGhlbHZldGljYSxzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTRwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5oZWFkZXJiCi17Ci0gICAgY29sb3I6ICNmZjY2MDA7Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLHZlcmRhbmEsaGVsdmV0aWNhLHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxMnB0OwotICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfY29sb3JlZAotewotCWNvbG9yOiAjY2MzMzAwOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0KLS5oZWFkZXJfb2ZfYXJ0aWNsZQotewotCWNvbG9yOiAjY2QzMzAxOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodDogYm9sZDsKLQl9Ci0KLS5oZWFkZXJfb2ZfYXJ0aWNsZV90YWJsZQotewotCWNvbG9yOiAjMzM2Njk5OwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTJweDsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCQotLmhlYWRlcl9vZl9hcnRpY2xlMgotewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0uaGVhZGVyX3JpZ2h0Ci17Ci0JY29sb3I6IDAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHg7Ci0JZm9udC13ZWlnaHQ6IDgwMDsKLX0KLQotLnN1YmhlYWQxX29mX2FydGljbGUyCi17Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uc3ViaGVhZDJfb2ZfYXJ0aWNsZTIKLXsKLQljb2xvcjogIzMzNjY5OTsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE0cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogNXB4OwotfQotCi0uc3ViaGVhZDNfb2ZfYXJ0aWNsZTIKLSB7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4MCU7Ci19Ci0KLS5oZWFkZXJfb2Zfc3RlcHMKLXsKLQljb2xvcjogI0E0QTRBNDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXAKLXsKLQljb2xvcjojIDY2OTljYzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyX29mX3NpdGVtYXA6aG92ZXIKLXsKLQljb2xvcjogI2NjMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uaGVhZGVyX29mX3RhYmxlCi17Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLQotLmltYWdlX2NhcHRpb24gCi17ICAKLQlmb250LXNpemU6IDlwdDsgY29sb3I6ICMwMDMzNjYKLX0KLQotCi0uc2lkZWJhcgoteyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y0ZjRmNDsKLX0KLQotaW5wdXQKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxMXB4OwotfQotCi0KLWlucHV0LmlucHV0MjUKLXsKLSAgICB3aWR0aDogMjVweAotfQotCi0KLWlucHV0LmlucHV0NDUKLXsgCi0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDg1Ci17Ci0gICAgd2lkdGg6IDg1cHgKLX0KLQotCi1pbnB1dC5pbnB1dG1heDUwCi17Ci0Jd2lkdGg6IDM2MHB4Ci19Ci0KLQotaW5wdXQuaW5wdXQxMzUKLXsKLQl3aWR0aDogMTM1cHgKLX0KLQotCi1pbnB1dC5pbnB1dDE1NQotewotICAJIHdpZHRoOiAxNTVweAotfQotCi1pbnB1dC5pbnB1dDIzMAotewotICAgIHdpZHRoOiAyMzBweDsKLX0KLQotCi1pbnB1dC5pbnB1dDMwNQoteyAKLSAgICB3aWR0aDogMzA1cHgKLX0KLQotCi0ubWVudWJhcgotewotICBjb2xvcjogI2ZmZmZmZjsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDQwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLQotLm1lbnViYXI6aG92ZXIKLXsKLSAgY29sb3I6ICNmZmZmZmYKLX0KLQotCi0ubWVudWJhcl9iZwoteyAgIAotYmFja2dyb3VuZC1jb2xvcjojMDAzMzY2OyAKLX0KLQotCi0ubWVudWJhcl9lbXBoYXNpcwoteyAKLSAgY29sb3I6ICNmZmZmZmY7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIGZvbnQtd2VpZ2h0OiA2MDA7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZQotfQotCi0ubWVudWJhcl9lbXBoYXNpc2RrCi17IAotICBjb2xvcjogIzAwMDAwMDsKLSAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gIGZvbnQtc2l6ZTogMTFweDsKLSAgZm9udC13ZWlnaHQ6IDYwMDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lCi19Ci0KLQotLm1pZGJhcl9iZwoteyAKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotIH0KLQotCi0ubWlkYmFyX2RhcmsKLXsgCi0JYmFja2dyb3VuZDogIzAwMzM2NjsKLSB9Ci0KLQotLm1pZGJhcl9saWdodAoteyAKLQliYWNrZ3JvdW5kOiAjMzM5OWNjOwotIH0KLQotCi0gLm1pZGJhcl9tZWRpdW0KLXsgCi0JYmFja2dyb3VuZDogIzAwNjY5OTsKLSB9Ci0KLQotIC5taWRiYXJfc2hhZG93Ci17IAotCWJhY2tncm91bmQ6ICM2NjY2NjY7Ci0gfQotCi0KLS5wYWdlX251bWJlcgotewotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotfQotCi0KLS5wYWdlX3N0ZXBzCi17IAotCWNvbG9yOiAjNjc2NzY3OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQkgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLS5wYWdlaGVhZGVyCi17Ci0gICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgZm9udC1zaXplOiAxNnB0OwotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0gLnBhZ2VoZWFkZXJfY29sb3JlZAotewotCWNvbG9yOiAjOTk5OTk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZwdDsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0ucG9wdXBfdGV4dCA6IGFjdGl2ZQotewotCWNvbG9yOiAjY2MwMDAwOwotfQotCi0ucG9wdXBfdGV4dCA6IGhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci19Ci0KLS5wcm9qZWN0X21lbnVfYm9yZGVyMQotIHsKLQlib3JkZXItdG9wIDogMXB4IHNvbGlkICNjY2NjY2M7Ci0JYm9yZGVyLXJpZ2h0IDogMXB4IHNvbGlkICNjY2NjY2M7Ci0JYmFja2dyb3VuZCA6ICNlZmVmZWY7Ci19Ci0ucHJvamVjdF9tZW51X3RvcGJvcmRlcgotIHsKLQlib3JkZXItdG9wIDogMXB4IHNvbGlkICNjY2NjY2M7CQotCWJhY2tncm91bmQgOiAjZWZlZmVmOwotfQotLnByb2plY3RfbmF2Ci17Ci0JY29sb3I6ICMwMDY2OTk7Ci0JZm9udC1mYW1pbHkgOiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLXNlbGVjdAotewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDExcHg7Ci19Ci0KLQotc2VsZWN0LmlucHV0MjUKLXsgCi0gICAgd2lkdGg6IDI1cHgKLX0KLQotCi1zZWxlY3QuaW5wdXQ0NQotewotICAgIHdpZHRoOiA0NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0ODUKLXsKLSAgICB3aWR0aDogODVweAotfQotCi0KLXNlbGVjdC5pbnB1dDE1NQotewotICAgd2lkdGg6IDE1NXB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MjMwCi17Ci0gICAgd2lkdGg6IDIzMHB4Ci19Ci0KLQotc2VsZWN0LmlucHV0MzA1Ci17Ci0gICAgd2lkdGg6IDMwNXB4OwotfQotCi0vKiBBbGwgc2hpbSBjbGFzc2VzIGFyZSBmb3Igc3BhY2luZyBlbGVtZW50cyB1c2VkIHRvIGNvbnRyb2wgbGF5b3V0LCBlc3BlY2lhbGx5IGluIG9sZGVyIGJyb3dzZXJzIHRoYXQgZG9uJ3QgdW5kZXJzdGFuZCBtYXJnaW5zIGFuZCBwYWRkaW5nICovCi0KLS5zaGltM3gxcHgKLXsKLQloZWlnaHQ6IDFweDsKLQl3aWR0aDogM3B4OwotfQotCi1hLnNpZGVtZW51X2hlYWRlcgotewotICAgIGNvbG9yOiAjNjY2NjY2OwotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLSAgICBmb250LXdlaWdodDogYm9sZDsKLX0KLQotCi1hLnNpZGVtZW51X2hlYWRlcjpob3ZlcgotewotICBjb2xvcjogI2NjMDAwMAotfQotCi0KLS5zaWRlbWVudV9ib2xkbGVmdAotewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9ib2xkbGVmdF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9ib2xkcmlnaHQKLXsKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDExcHg7Ci0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotCi0uc2lkZW1lbnVfYm9sZHJpZ2h0OmhvdmVyCi17Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLQotLnNpZGVtZW51X3N0YW5kYXJkCi17Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0KLS5zaWRlbWVudV9zdGFuZGFyZF9zZWxlY3RlZAotewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotdGQKLXsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiA3MCUKLX0KLQotdGQuc2VhcmNoYm94Ci17Ci0JZm9udC1mYW1pbHk6IGNvdXJpZXI7Ci19Ci0KLQotIHRkLmJnX2Rpc2N1c3Npb25fMQotewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci0JCi19Ci0KLQotdGQuYmdfZGlzY3Vzc2lvbl8yCi17IAotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci0gfQotIAotIHRkLmNvbnRlbnRfY2VsbAotIHsKLSAKLX0KLQotCi10ZC5kaXZpZGVyCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLQotLmdyZXlfZGFyawotewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci19Ci0KLXRkLmdyZXlfbWVkaXVtMgotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGVkZWRlOwotfQotCi10ZC5ncmV5X2xpZ2h0MgotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0uZ3JleV9saWdodAotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0uZ3JleV9tZWRpdW0KLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotCi10ZC5jZWxsY29sb3JfbGlnaHQKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5Y2MwMDsKLX0KLQotCi0KLXRkLmNlbGxjb2xvcl9kYXJrCi0gewotCWJhY2tncm91bmQtY29sb3I6ICM2MzljMDA7Ci19Ci0KLQotdGQuY2VsbGNvbG9yX3doaXRlCi0gewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLQotdGQuc2lkZW1lbnVfYnVsbGV0X2dyZXkKLSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotCi10ZC5zaWRlbWVudV9idWxsZXRfY29sb3JlZAotIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjY2QzMzAxOwotfQotCi0KLXRleHRhcmVhCi17Ci0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtZmFtaWx5IDogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDQ1Ci17Ci0gICAgd2lkdGg6IDQ1cHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dG1heDUwCi17Ci0Jd2lkdGg6IDM2MHB4Ci19Ci0KLQotdGV4dGFyZWEuaW5wdXQxOTAKLXsKLSAgICB3aWR0aDogMTkwcHgKLX0KLQotCi10ZXh0YXJlYS5pbnB1dDIzMAotewotICAgIHdpZHRoOiAyMzBweAotfQotCi0KLXRleHRhcmVhLmlucHV0MzUwCi17Ci0gICAgd2lkdGg6IDM1MHB4Ci19Ci0KLQotLnRvcGJhcl9zZXBhcmF0b3IKLXsKLSAgY29sb3I6ICNjYzMzMDA7Ci0gIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICBmb250LXNpemU6IDExcHg7Ci0gIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0udG9wbGluZV9jb2xvcgoteyAKLQliYWNrZ3JvdW5kOiAjMDA2Njk5OwotIH0KLSAKLS8qIGJvcnJvd2VkIHN0eWxlcyBmcm9tIGNvbW1vbi5jc3MgdG8gYmUgdHJpbW1lZCBsYXRlciAqLwotIAotIC50b3BmcmFtZWJnIAoteyAgYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMgotfQotCi0udG9wZnJhbWViZ2xpZ2h0IAoteyAgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjYjZiNWI1Ci19Ci0KLS50b3BmcmFtZWJnZGFyayAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NAotfQotCi0udG9wZnJhbWViZ2xpZ2h0MiAKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZgotIH0KLSAgIAotIC50b3BmcmFtZWxvZ29iZyAKLXsgIAotYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OQotfQotCi0udG9wbGVmdG5hdgotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS50b3BsZWZ0bmF2Ym9sZCAKLXsgCi1mb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgCi1mb250LXNpemU6IDEwcHg7IAotdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9wcmlnaHRuYXYKLXsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHg7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS52ZXJ0aWNhbGJsdWUKLSB7IAotIGJhY2tncm91bmQ6ICMzMzk5Y2MgCi0gfQotCi0gLndoaXRlYmcKLXsgCi0gYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKLSB9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9kb2Nyb290L3N0eWxlc2hlZXRzL3N0eWxlc191bml4LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX3VuaXguY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTAwMDgxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2RvY3Jvb3Qvc3R5bGVzaGVldHMvc3R5bGVzX3VuaXguY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qbXVzdCBhZGQgZm9udCB0eXBlIGlmIGNsYXNzIGlzIGJlaW5nIHVzZWQgYXMgYSBsaW5rIGFzIHdlbGwgYXMgbm8tbGluayovCi0KLWEgewkKLQljb2xvcjogIzMzNjY5OTsKLX0KLQotYS50b3ByaWdodG5hdjphY3RpdmUgewotCWNvbG9yOiAjOTlDQ0NDOwotfQotCi1hLnRvcHJpZ2h0bmF2Z3JleTphY3RpdmUgewotCWNvbG9yOiAjQ0MwMDAwOwotfQotCi0KLS8qIGFjdGlvbiB0ZXh0IHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZTtpZS4sIHNlbGVjdCBhbGwqLwotYS5hY3Rpb25saW5rCi17IAotY29sb3I6ICMzMzY2OTk7Ci1mb250LXNpemU6IDExcHg7Ci10ZXh0LWRlY29yYXRpb24gOiBub25lOwkKLSB9Ci0gCi0gYS5hY3Rpb25saW5rOmFjdGl2ZSB7IAotIGNvbG9yOiAjMzM2Njk5OwotIGZvbnQtd2VpZ2h0OiBib2xkOwotICB9Ci0KLWEudG9wcmlnaHRuYXZncmV5OmhvdmVyIHsKLQljb2xvcjogI0NDMDAwMDsKLX0gCi1hLnRvcHJpZ2h0bmF2OmhvdmVyIHsKLQljb2xvcjogIzk5Q0NDQzsKLX0gLyogZm9udCBmb3IgYWN0aW9uIG9uIGNvbnRlbnQgcGFnZSB1c3VhbGx5IGxvY2F0ZWQgb24gdG9wIG9mIHBhZ2UgO2llLiwgc2VsZWN0IGFsbCovCi1hLmFjdGlvbiB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2cHg7CQotfSAKLQotYS5hY3Rpb25zZWxlY3RvciB7Ci0gICAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLWEuYWN0aXZldGFiIHsgCi0gCWNvbG9yOiAjMDAwMDAwOwotIAlmb250LXNpemU6IDE4cHg7Ci0gIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgaW5zdGVhZCBvZiB0aGUgb3V0ZXJtb3N0IGNlbGwgKi8KLWEuYWN0aXZldGFic2VsZWN0ZWQgeyAKLSAJY29sb3I6ICMyYzJjMmM7Ci0gCWZvbnQtc2l6ZTogMThweDsKLSAgCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5iYXNpYyB7IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zLCBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8KLWEuYnV0dG9uIHsKLQljb2xvcjogIzMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuYnV0dG9uOmFjdGl2ZSB7Ci0JY29sb3I6IDMzMzMzMzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIGZvciBub24taW1hZ2UgYnV0dG9ucywgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjpob3ZlciB7Ci0JY29sb3I6IDMzMzMzMzsKLX0KLQotLyogZm9yIG5vbi1pbWFnZSBidXR0b25zIGluIE11bHRpc2l0ZSwgZm9yIGludGVybmF0aW9uYWxpemF0aW9uICovCi1hLmJ1dHRvbjIgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLyptYWluIGNvbnRhaW5lciAgYWN0aW9ucy9saW5rcyBmb3IgZWRpdGluZyovCi1hLmNvbmxpbmtlZGl0IHsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWZvbnQtc2l6ZSA6IDE2cHg7Ci19Ci0KLWEuY29weXJpZ2h0IHsgCQotCWNvbG9yOiAjMzM2Njk5OyAgICAKLQlmb250LXNpemUgOiAxNXB4OwotfSAKLQotYS5mb3JtdGJsaGVhZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLyogbGlnaHQgY29sb3VyZWQgaGVhZGluZyBsaW5rIGZvciBkaXNjdXNzaW9uIGFuZCBzaW1pbGFyIHVzZXMgLSB3YXMgaGVhZGVyX2Rpc2N1c3Npb25fbGluayBpbiBwcmV2aW91cyB2ZXJzaW9ucyAqLwotIGEuaGVhZGVybGlua2xpZ2h0IHsKLQljb2xvcjogCWZmZmZmZjsKLQlmb250LXNpemU6IDAuOWVtOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0JCi0KLS8qYm9sZCBsaW5rLCBpZSwgYWR2YW5jZWQgc2VhcmNoIGxpbmsgaW4gcGUqLwotYS5saW5rZnVuY29wdGlvbiB7ICAJCi0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci19Ci0KLSBhLm5hdnRyZWUgeyAJCi0gICAgY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTZweDsKLQlmb250LXdlaWdodDogNjAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0KLS8qbmF2dHJlZSBpdGVtIG9yIGRvYywgbm9kZXMgdGhhdCBkb24ndCBleHBhbmQqLwotYS5uYXZ0cmVlaXRlbSB7IAkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LXNpemUgOiAxNnB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0gCi0gCi0gLyogc2ltcGxlIG1lY2hhbmlzbSB0byB0dXJuIHRleHQgZGVjb3JhdGlvbiBvZmYgKi8gIAotYS5ub2xpbmUgewotIAl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotCi1hLnBvcHVwdGV4dCB7CQotICAgY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1zaXplOiAxNnB4OwkKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucG9wdGV4dCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udCA6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnBvcHVwdGV4dDogYWN0aXZlIHsKLQljb2xvcjogI2NjMDAwMDsKLX0KLQotCi1hLnNtYWxsIHsJCi0JZm9udC1zaXplOiAxNnB4OwkKLX0KLQotYS5zbWFsbGIgewkKLSAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsJCi19Ci0KLWEudG9wYmFyIHsKLSAgY29sb3I6ICM2NjY2NjY7Ci0gIGZvbnQtc2l6ZTogMTZweDsKLSAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnVzZWQgYXMgaGlnaGxpZ2h0ZWQgZGVzY3JpcHRpb24gYWJvdmUgdGFibGVzKi8KLS5hY2NlbnRjb2xvciB7Ci0JY29sb3IgOiAjY2MzMzAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0gLyogYmdjb2xvciAgZm9yIGFjdGlvbiB0ZXh0IHVzdWFsbHkgbG9jYXRlZCBvbiB0b3Agb2YgcGFnZTtpZS4sIHNlbGVjdCBhbGwqLwotLmFjdGlvbmJnIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLyphY3Rpb25iYXIgYXBwZWFycyBvbiB0b3AgYW5kL29yIGJvdHRvbSBvZiBwYWdlKi8KLS5hY3Rpb25zZWxlY3RvciB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLyphY3Rpb25iYXIgb24gd2hpdGUgYmFja2dyb3VuZCovCi0uYWN0aW9uc2VsZWN0MiB7ICAgCi0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotfQotCi0uYWN0aW9uc2VsZWN0b3JkaXMgewotYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTsKLQljb2xvcjogI2NjY2NjYzsKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1iIHsgCi0gICBmb250LXdlaWdodCA6IGJvbGQ7Ci0gfQotICAKLS5iYXNlbGluZWl0YWxpY3MgewotCWNvbG9yOiAjNjY2NjY2OwotCWZvbnQtc2l6ZTogMTZweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5iZ2JsYWNrIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwMDAwMDsKLSB9Ci0gCi0gLyogYmFzaWMgY29sdW1uIGJhY2tncm91bmQgY29sb3VyIGZvciBkaXNjdXNzaW9ucywgZmlsZXMsIG90aGVyIHN1Y2ggdGFidWxhdGVkIGRhdGEgKi8KLS5iZ2NvbHVtbmJhc2ljIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9Ci0gCi0uYmd3aGl0ZSB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfSAKLSAKLS8qIHNpemUgaW5wdXQgZm9yIGJhc2ljIHRhZ3Mgc3VjaCBhcyBwIGFuZCBsaSB0aGF0IGRvIG5vdCBpbmhlcml0IGZyb20gdGQgKi8gCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI2ZmZmZmZjsgICAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsJCQotCW1hcmdpbi1sZWZ0OiAwcHg7Ci0JbWFyZ2luLXRvcDogMHB4OwkKLQltYXJnaW4tcmlnaHQ6IDBweDsKLX0KLQotLmJvbGQgeyAKLSAgIGZvbnQtd2VpZ2h0IDogNjAwOwotIH0KLQotLmJvcmRlcmdyYXkgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZTllOWU5OwotIH0KLQotLmJvdHRvbWJhcmRhcmsgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMDAzMzY2OwotIH0KLSAgCi0uYm90dG9tYmFybGlnaHQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLQotLmJvdHRvbWJhcnNoYWRvdyB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0gfQotCi0uYnJlYWRjcnVtYnN7IAotY29sb3I6ICMzMzY2OTk7Ci1mb250LXdlaWdodDogNjAwOwotIH0KLQotLmJyZWFkY3J1bWJzMnsgCi1jb2xvcjogI2ZmZmZmZjsKLWZvbnQtc2l6ZTogMTZweDsKLSB9IAotIAotLyphY3RpdmUgbmF2aWdhdGlvbiBidXR0b24sIG5vdCBmb3JtIGJ1dHRvbnMqLyAKLS5idXR0b25vbiB7Ci0gICAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsJCi19Ci0gIAotLypuYXZpZ2F0aW9uIGJ1dHRvbnMsIG5vdCBmb3JtIGJ1dHRvbnMqLyAKLS5idXR0b25zIHsKLSAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotICAgIGNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKLX0KLQotLyogZGlzYWJsZWQgc3RhdGUgKi8gCi0uYnV0dG9udHh0IHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgaGVsdmV0aWNhLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qIHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gLSB0aGlzIGlzIGZvciB0aGUgZGlzYWJsZWQgc3RhdGUgKi8gCi0uYnV0dG9udHh0ZHNibCB7Ci0JY29sb3I6ICM3RTdFN0U7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGhlbHZldGljYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uY29kZSB7IAotICAgZm9udC1mYW1pbHk6IENvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vOyAgIAotICAgZm9udC1zaXplOiAxOHB4OwotIH0KLSAKLSAgLyogZm9udCBmb3IgcmVndWxhciBjb250ZW50IHRleHQgKi8KLS5jb21tZW50cyB7IAkKLQlmb250LXNpemU6IDE2cHg7CQotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLS8qbWFpbiBjb250YWluZXIgaGVhZGVyKi8KLS5jb25oZWFkIHsgCi1jb2xvcjogI2NjMzMwMDsKLWZvbnQtd2VpZ2h0OiA2MDA7Ci10ZXh0LWRlY29yYXRpb24gOiBub25lOwotIH0KLSAKLSAvKm1haW4gY29udGFpbmVyIGRhdGEgbGFiZWxzKi8KLS5jb25sYWJlbCB7IAotYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9IAotIAotLyptYWluIGNvbnRhaW5lciBkYXRhIGxhYmVscyBpbiBib2xkKi8KLS5jb25sYWJlbGJvbGQgeyAKLWJhY2tncm91bmQtY29sb3I6ICNlMWUxZTE7Ci1mb250LXdlaWdodDogYm9sZDsKLSB9ICAKLSAKLS8qcmVwbGFjaW5nIHNpZGVtZW51X2JvbGRyaWdodCBtb3ZpbmcgZm9yd2FyZCovCi0uY29ucmJvbGQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotCi0vKmhlYWRlciBmb3IgcmlnaHQgaGFuZCBjb250YWluZXIqLwotLmNvbnJoZWFkIHsKLQljb2xvcjogMDAwMDAwOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKm1haW4gY29udGFpbmVyIHRhYmxlIGhlYWRlciovCi0uY29udGJsaGVhZCB7ICAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7Ci0JY29sb3I6ICMzMzMzMzM7CQotCWZvbnQtc2l6ZTogMTZweDsJCi0gICAgZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLmNvbnRlbnR7IAotZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwkKLSB9Ci0KLSAvKm1lZGl1bSBncmV5IGNlbGwgYmFja2dyb3VuZCovCi0uY29udGVudGJvcmRlciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLX0KLQotLyogYWRkZWQgZm9yIHRleHQgcmVwcmVzZW50aW5nIGRpc2FibGVkIGZ1bmN0aW9ucy4gKi8KLS5jb250ZW50ZGlzYWJsZWQgewotCWNvbG9yOiAjY2NjY2NjOwotfQotCi0vKiBmb250IGZvciBib2xkIHRleHQgKi8KLS5jb250ZW50ZW1waGFzaXMgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0vKiB1c2VkIHRleHQgcmVtaW5kaW5nIHVzZXIgdGhhdCB0aGVyZSBpcyByZXF1aXJlZCBjb250ZW50ICovCi0uY29udGVudHJlcXVpcmVkIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXdlaWdodDogNTAwOwotfQotCi0uY29weXJpZ2h0IHsgCi0JY29sb3IgOiAjOTk5OTk5OwotCWZvbnQtc2l6ZSA6IDE1cHg7Ci19Ci0KLS8qYmxhY2sgY29weXJpZ2h0Ki8KLS5jb3B5cmlnaHRiIHsgCi1jb2xvciA6ICMwMDAwMDA7Ci0JZm9udC1zaXplIDogMTVweDsKLX0KLQotZGQgeyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMThweDsJCi1tYXJnaW4tbGVmdDogLTFweDsKLSB9Ci0gCi0uZGlhbGdieHNoYWRvdzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLmRpYWxvZ3VlYm94YmcgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2QyZDJkMjsKLX0KLQotLypiYWNrZ3JvdW5kIGZvciBsb2dpbiBwYWdlcyovCi0uZGlhbG9ndWVib3hiZzIgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotLmRpYWxvZ3VlYm94Ym9yZGVyIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzMzMzMzMzsKLSB9Ci0gCi0uZGlhbG9ndWVib3hoaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7Ci19Ci0KLSAuZGlhbG9ndWVib3htZWRpdW0geyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOGI4YjhiOwotIH0KLSAKLSAuZGlhbG9ndWVib3h0aXRsZSB7CSAgIAotCWZvbnQtc2l6ZTogMjFweDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLS8qdGV4dCBmb3IgZGlzYWJsZWQgYnV0dG9ucyovCi0uZGlzYWJsZXsgCi1jb2xvcjogIzk5OTk5OTsKLWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBoZWx2ZXRpY2EsIGFyaWFsLCBzYW5zLXNlcmlmOwotZm9udC1zaXplOiAxNnB4OyAgCi0JZm9udC13ZWlnaHQ6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0gfQotIAotZGl2eyAKLWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotIH0gCi0gCi0vKnVzZWQgdG8gYWZmZWN0IHJpZ2h0IG1hcmdpbiovIAotZGl2Lm1hcmdpbnJ0eyAKLQljbGVhcjogcmlnaHQ7Ci0JZmxvYXQ6IHJpZ2h0OwotCXdpZHRoOiA3cHg7Ci0gfSAgCi0gCi1kaXYubWFyZ2lucyB7IAotZmxvYXQ6IGxlZnQ7Ci1tYXJnaW4tbGVmdDogN3B4OwotbWFyZ2luLXRvcDogMjVweDsJCi1tYXJnaW4tcmlnaHQ6IDdweDsKLSB9ICAgCi0KLS8qZm9yIHBhZ2VzIHdpdGggYnV0dG9uIG5hdmlnYXRpb24gb24gdG9wKi8gCi1kaXYubWFyZ2luczIwIHsgCi1mbG9hdDogbGVmdDsKLW1hcmdpbi1sZWZ0OiA3cHg7Ci1tYXJnaW4tdG9wOiAyMHB4OwkKLW1hcmdpbi1yaWdodDogN3B4OwotIH0gICAgCi0gCi0gLyphZGRzIDEwIHB4IHBhZGRpbmcqLwotIGRpdi5wYWQxMHsgCi0gcGFkZGluZzogMTBweDsgCi0gIH0KLQotLmRpdmlkZXIgewotCWJhY2tncm91bmQtY29sb3I6ICNmNmY5ZjA7Ci19Ci0KLWRseyAgCi1mb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLWZvbnQtc2l6ZTogMThweDsgICAKLQl9Ci0KLS8qcmVtb3ZlcyBkZWZhdWx0IGJvdHRvbSBtYXJnaW4sIGRvZXNuJ3Qgd29yayBpbiBOUzQuN3ggKi8gCi1kbC5kYXRhIHsgCi1tYXJnaW4tYm90dG9tOiAtMXB4OwotIH0gIAotCi0uZG9jYm9sZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OyAgICAgICAKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLypmb3IgYXBwbGV0IGRvd25sb2FkIHNwbGFzaCBwYWdlKi8KLS5kb3dubG9hZHsgCi1iYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZWVlOwotIH0KLQotIC5lcnJvcm1zZyB7Ci0JY29sb3IgOiAjY2MwMDAwOwkKLX0gCi0KLS8qCi1jb2xvcmVkIGZvbnQKLWRlc2NyaXB0aW9uIGFib3V0IHRoZSB1c2VyIHN0YXR1cy4gZXEuICJzdWJzY3JpcHRpb25zIGFyZSB1cGRhdGVkIgotaXQncyB1c3VhbGx5IG9uIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBwYWdlcwotKi8KLS5mb290ZXJib2xkIHsKLQljb2xvciA6ICNhNGE0YTQ7Ci0JZm9udC1zaXplOiA5MCU7Ci0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp0aGUgKiBzeW1ib2wgaW5kaWNhdGUgdGhlIHJlcXVpcmVkIGZpZWxkICovCi0uZm9vdGVyYm9sZGNvbG9yZWQgewotCWNvbG9yIDogI2ZmNjUwMDsKLQlmb250LXNpemU6IDkwJTsKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0uZm9vdGluZGljYXRvciB7Ci0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OyAgICAgICAKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qdGhlICogc3ltYm9sIGluZGljYXRlIHRoZSByZXF1aXJlZCBmaWVsZCAqLwotLmZvb3RzdGFyaW5kZXggewotCWNvbG9yIDogI2NjMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS8qbW92ZSB0byBkZXNpZ25fcGUqLwotLmZvcm1sYWJlbCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5mb3JtdGJsaGVhZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2NjY2NjOwotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLX0KLQotLmdyZXltZWRpdW0gewotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS5ncmF5Zm9sZCB7Ci0JY29sb3I6ICNjY2NjY2M7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LXNpemU6IDIycHg7Ci19Ci0KLS8qTm90ZTogcmVtb3ZlIHRoaXMgbm90ZSBpZiB1c2luZyB0aGlzIHN0eWxlIG9yIHdpbGwgYmUgZGVsZXRlZCovCi0JLyogQ3VycmVudGx5IHVzZWQgaW4gY3FfZGVmbGVjdF9sb2dpbl9lcnIuaHRtbCAtIHNob3VsZCBiZSByZW5hbWVkIHRvIHNvbWV0aGluZyB0aGF0IGhhcyBsZXNzIGRlc2NyaXB0aXZlIG5hbWUgKi8KLS5oZWFkZXJibHVlIHsKLQljb2xvcjogIzAwNjY5OTsJCi0JZm9udC13ZWlnaHQgOiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKnVzZWQgaW4gY2MgZm9yIGZyYW1lc2V0IGRpc3BsYXkqLyAKLS5oZWFkZXJpbmZyYW1lcyB7ICAKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7CQotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JbWFyZ2luLWJvdHRvbTogMnB4OwotCW1hcmdpbi10b3A6IDBweDsKLX0KLQotIC8qZm9udCBmb3IgcGFnZSBoZWFkZXIgZXhjZXB0IGZvciBhcnRpY2xlIHBhZ2VzLCAoc2VlIGhlYWRlcl9vZl9hcnRpY2xlKSovCi0uaGVhZGVybGFyZ2UgewotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtc2l6ZTogMTYwJTsKLQlmb250LXdlaWdodCA6IDQwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS8qbWFpbiBoZWFkZXIgZm9yIGZyYW1lIG5hdmlnYXRpb24sIGllLCBjbGVhcmNhc2UgbWVyZ2UgZmlsZXMqLwotLmhlYWRlcm1haW4geyAgCi0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAyNXB4OwkKLQlmb250LXdlaWdodDogNjAwOwotfQotCi0vKiBoZWFkZXIgZWxlbWVudCBmb3IgZm9ybSB0YWJsZXMgY29udGFpbmluZyBtaWQtc2l6ZSBmaXhlZCBoZWlnaHQgdGV4dCAqLwotLmhlYWRlcm1lZGxpc3QgewotCWZvbnQtc2l6ZTogMTZweDsKLX0KLQotLypmb3JudCBmb3Igc3RlcHMgdGl0bGUgaW4gZm9ybXMqLwotLmhlYWRlcm9mc3RlcHMgeyAKLQljb2xvcjogIzY2NjY2NjsKLQlmb250LXNpemU6IDI1cHg7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5oZWFkZXJvZnN0ZXBzbm9uIHsgCi0JY29sb3I6ICM2NjY2NjY7Ci0JZm9udC1zaXplOiAyNXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotCi0vKnVzZSBoZWFkZXIxIGluc3RlYWQqLwotLmgxIHsgIAotCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnRvIHJlcGxhY2UgaDEgYW5kIGNvbnRlbnRoZWFkZXIgbGFyZ2UqLwotLmhlYWRlcjEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0vKnVzZSBzdWJoZWFkMSBpbnN0ZWFkKi8KLS5oMXJvb3R7ICAKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDMzcHg7CQotCWZvbnQtd2VpZ2h0OiA0MDA7Ci19Ci0KLQotLyp1c2VkIGluIGNjLCBjcSwgc2wqLyAKLWgxIHsgIAotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjVweDsJCi0JZm9udC13ZWlnaHQ6IDYwMDsKLX0KLQotLyp1c2UgaGVhZGVyMiBpbnN0ZWFkKi8KLS5oMiB7IAotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMjhweDsKLQlmb250LXdlaWdodDogNDAwOwkgCQotfQotCi0vKmhlYWRlcnMgd2l0aGluIHBhZ2UqLwotLmhlYWRlcjIgeyAKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDI4cHg7Ci0JZm9udC13ZWlnaHQ6IDQwMDsJIAkKLX0KLQotCi1pIHsKLQlmb250LXN0eWxlIDogaXRhbGljOwotfQotCi0uaWNvbmJvcmRlciB7IAotCWJhY2tncm91bmQtY29sb3I6ICNkZWRlZGU7Ci19Ci0KLS8qZm9udCBzaXplIHNldHVwIHNob3duIGluIHRoZSBpbnB1dCBib3ggd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGlucHV0WFgqLwotaW5wdXQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE2cHg7Ci19IAotCi1pbnB1dC5pbnB1dDEzNSB7Ci0Jd2lkdGg6IDEzNXB4Ci19IAotCi0vKiAxLGJ1c2luZXNzIHN0YW5kYXJkIG11bHRpbGluZSBpbnB1dCBib3ggCi0yLHRoaXMgc3R5bGUgb25seSBhY3RpdmF0ZSBpbiBJRSAqLwotaW5wdXQubWF4NTAgewotCXdpZHRoOiAzNjBweDsKLX0KLQotaW5wdXQucHgyNSB7Ci0gICAgd2lkdGg6IDI1cHg7Ci19Ci0KLWlucHV0LnB4NDUgewotICAgIHdpZHRoOiA0NXB4OwotfQotCi0vKgotMSxidXNpbmVzcyBzdGFuZGFyZCBtdWx0aWxpbmUgaW5wdXQgYm94IAotMix0aGlzIHN0eWxlIG9ubHkgYWN0aXZhdGUgaW4gSUUKLSovCi1pbnB1dC5weDg1IHsKLSAgICB3aWR0aDogODVweDsKLX0KLQotaW5wdXQucHgxMzUgewotICAgIHdpZHRoOiAxMzVweDsKLX0KLQotaW5wdXQucHgxNTUgewotICAgIHdpZHRoOiAxNTVweDsKLX0KLQotaW5wdXQucHgyMzAgewotICAgIHdpZHRoOiAyMzBweDsKLX0KLQotaW5wdXQucHgzMDUgewotICAgIHdpZHRoOiAzMDVweDsKLX0KLQotLmxlZnRtZW51IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTk5OTk5OwotfQotCi0ubGVmdG1lbnVidWxsZXQgeyAKLWJhY2tncm91bmQtY29sb3I6ICM5OTk5OTk7Ci0gfQotCi0ubGVmdG1lbnVidWxsZXRhY3RpdmUgeyAKLWJhY2tncm91bmQtY29sb3I6ICNjZDMzMDE7Ci0gfQotCQotCi0ubGVmdG5hdmhlYWQgewotCWNvbG9yOiAjMDAwMDAwOwotCWZvbnQtc2l6ZTogMTlweDsJCi0JZm9udC13ZWlnaHQ6IGJvbGQ7CQotfSAKLQotLmxlZnRuYXZsYWJlbCB7Ci1jb2xvcjogIzAwMDAwMDsKLWZvbnQtd2VpZ2h0IDogNjAwOwotZm9udC1zaXplOiAxNnB4OwotIH0KLQotLmxpZ2h0Z3JheSB7IAotYmFja2dyb3VuZC1jb2xvcjogI2U0ZTRlNDsKLSB9Ci0gCi0ubWVudWJhciB7Ci0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxNnB4OwotICBmb250LXdlaWdodDogNDAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLyptZW51YmFyIHdpdGhpbiB0b3Agb2YgY29udGVudCBwYWdlICAqLwotLm1lbnViYXJtaWR7IAotZm9udC1zaXplOiAxNnB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLSB9Ci0KLS8qCi0xLGJvbGQgZm9udCBmb3IgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYnJlYWRjcnVtYnMKLTIsYm9sZCBmb250IG9mIHRhYmxlIGhlYWRlciB3aXRoIG1lbnViYXJfYmcoYmx1ZSkgYXMgYmFja2dyb3VuZCBjb2xvciAKLTMsYm9sZCB0ZXh0IG9uIGNvbG9yZWQgYmFja2dyb3VuZCBlZy4gTG9nZ2VkIEluCi0qLwotLm1lbnViYXJlbXBoYXNpcyB7Ci0gIGNvbG9yOiAjZmZmZmZmOwotICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAgZm9udC1zaXplOiAxNnB4OwotICBmb250LXdlaWdodDogNjAwOwotICB0ZXh0LWRlY29yYXRpb246IG5vbmUKLX0KLQotLm1lbnViYXI6aG92ZXIgewotICBjb2xvcjogI2ZmZmZmZgotfSAKLSAKLS5taWRiYXJiZyB7IAotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gfSAKLSAKLS8qdG9wbmF2Ki8gCi0ubWlkYmFybGlnaHQgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjMzM5OWNjOwotIH0KLSAKLS8qZGFyayBjb2xvciBiZXR3ZWVuIHRhYnMqLwotIC5taWRiYXJkYXJrIHsgCi0JYmFja2dyb3VuZDogIzAwMzM2NjsKLSB9Ci0gCi0gLyp0b3BuYXYqLyAKLSAubWlkYmFybWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzAwNjY5OTsKLSB9Ci0gCi0gLypiYWNrZ3JvdW5kICBvZiAgdGFicyovIAotIC5taWRiYXJtZWRpdW0geyAKLQliYWNrZ3JvdW5kOiAjMDA2Njk5OwotIH0KLSAKLSAubWlkYmFyc2hhZG93IHsgCi0JYmFja2dyb3VuZC1jb2xvcjogIzY2NjY2NjsKLSB9IAotICAKLS8qcmVwbGFjaW5nIHNpZGVtZW51X2JvbGRsZWZ0IG1vdmluZyBmb3J3YXJkKi8KLS5uYXZsZWZ0Ym9sZCB7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS8qbGVmdCBuYXYgc3VibWVudSovCi0ubmF2bGVmdHN1YiB7Ci0JY29sb3I6ICM2NzY3Njc7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNDAwOwotCWxpbmUtaGVpZ2h0IDogMTM1JTsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfQotIAotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gdGhpcyBlbGVtZW50IGluc3RlYWQgb2YgdGhlIG91dGVybW9zdCBjZWxsICovCi0ubm9uYWN0aXZldGFiIHsKLQljb2xvcjogI2I0YjRiNDsKLQlmb250LXNpemU6IDE4cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0vKm5vdGVzLyBkZXNjcmlwdGlvbiBvZiBpY29uICovCi0ubm90ZXN7ICAKLSBmb250LXNpemU6IDE2cHg7Ci0gZm9udC13ZWlnaHQgOiA0MDA7CQotfQotCi1wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7CQotfQotCi0ucGFnZWJvbGQgeyAKLQljb2xvcjogIzAwMDAwMDsKLQlmb250LXdlaWdodCA6IDYwMDsJCi0gfQotIAotLypmb250IGZvciB0aGUgbnVtYmVycyBpbiBwYWdpbmF0aW9uIGxpYnJhcnkqLwotIC5wYWdlbnVtYmVyIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXdlaWdodCA6IDQwMDsKLX0KLQotIC8qZm9udCBmb3IgcHJldmlvdXMgJiBuZXh0IGluIHBhZ2luYXRpb24qLwotLnBhZ2VzdGVwcyB7IAotCWNvbG9yOiAjNjc2NzY3OwkKLQlmb250LXNpemU6IDE2cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotIH0KLQotLnBvcCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZSA6IDE4cHg7Ci0JZm9udC13ZWlnaHQgOiAyMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucG9wYmFja2dyb3VuZCB7Ci0KLQliYWNrZ3JvdW5kOiAjZDZkM2NlOwotfQotCi0ucG9waDEgewotCWZvbnQtc2l6ZTogMjRweDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLS5wb3BsZWZ0bWVudSB7Ci0JYmFja2dyb3VuZDogI2YwZjBmMDsKLQlib3JkZXI6IHRoaW4gc29saWQgY2NjY2NjOyAKLQlsZWZ0OiAyMTBweDsgCi0JcGFkZGluZzogMnB4OwotCXBvc2l0aW9uOmFic29sdXRlOyAKLQl0b3A6IDI1cHg7Ci0JdmlzaWJpbGl0eTogaGlkZGVuOyAKLQl3aWR0aDo3NXB4OwotCXotaW5kZXg6MTA7CQotIH0KLQotIC8qIHVzZSBwb3BsZWZ0bWVudSBpbnN0ZWFkIG9mIHRoaXMgb25lKi8KLS5wb3B1cGJvcmRlciB7Ci0JYmFja2dyb3VuZDogI2YwZjBmMDsKLQlib3JkZXIgOiB0aGluIHNvbGlkIGNjY2NjYzsKLQlwYWRkaW5nIDogMnB4OwotfQotCi0ucG9wdXB0ZXh0IHsJCi0gICBjb2xvcjogIzMzMzMzMzsKLQlmb250LXNpemU6IDE2cHg7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnByb2plY3RhdHQgeyAKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE4cHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLQljb2xvcjogI2NkMzMwMTsKLX0KLQotLypkYXRlIGFzc29jaWF0ZWQgd2l0aCBhcnRpY2xlIHJhdGluZ3MqLwotLnJhdGluZ3NkYXRlCi17Ci0JY29sb3I6ICMzMzY2OTk7Ci0JZm9udC1zaXplIDogMTZweDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1zZWxlY3QgewotICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwkKLQlmb250LXNpemU6IDE2cHg7Ci19Ci0KLXNlbGVjdC5zZWxweDE0NCB7Ci0gICAgd2lkdGg6IDE0NHB4OwotfQotCi0vKiAuc2lkZW1lbnVfYm9sZGxlZnQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWJvbGQqLyAKLQotLyogLnNpZGVtZW51X2JvbGRsZWZ0X3NlbGVjdGVkIHJlcGxhY2Ugd2l0aCAubGVmdG1lbnVhY3RpdmUqLwotCi0vKiAuc2lkZW1lbnVfYnVsbGV0X2NvbG9yZWQgcmVwbGFjZSB3aXRoIC5sZWZ0bWVudWJ1bGxldGFjdGl2ZSovCi0gCi0vKi5zaWRlbWVudV9idWxsZXRfZ3JleSByZXBsYWNlIHdpdGggbGVmdG1lbnVidWxsZXQqLwotCi0uc2lkZW1lbnVib2xkbGVmdCB7Ci0JY29sb3I6ICMwMDAwMDA7CQotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotfSAKLQotLnNpZGVtZW51Ym9sZGxlZnRzZWxlY3RlZCB7Ci0JY29sb3I6ICNjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNnB4OwotCWZvbnQtd2VpZ2h0IDogNjAwOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zaWRlbWVudXN0YW5kYXJkIHsKLQljb2xvcjogIzY3Njc2NzsKLQlmb250LXNpemU6IDE2cHg7Ci0JZm9udC13ZWlnaHQgOiA0MDA7Ci0JbGluZS1oZWlnaHQgOiAxMzUlOwotCXRleHQtZGVjb3JhdGlvbiA6IG5vbmU7Ci19Ci0KLS5zaWRlbWVudXN0YW5kYXJkc2VsZWN0ZWQgewotCWNvbG9yOiAjY2MwMDAwOwotCWZvbnQtc2l6ZTogMTZweDsKLQlmb250LXdlaWdodCA6IDQwMDsKLQlsaW5lLWhlaWdodCA6IDEzNSU7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLX0KLQotLnNtYWxsdGV4dCB7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzAwMDAwMDsKLX0KLQotLyp0byByZXBsYWNlIGgxcm9vdCwgIGZvciBkb2N1bWVudCByb290IGZvbGRlciovCi0uc3ViaGVhZDEgeyAgCi0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAzM3B4OwkKLQlmb250LXdlaWdodDogODAwOwotfQotCi0udGFibGVoZWFkZXIgeyAKLQotCWNvbG9yOiAjMDAwMDAwOwkKLQlmb250LXNpemU6IDE5cHg7CQotICAgIGZvbnQtd2VpZ2h0OiBib2xkCi19Ci0KLS8qIGZvbnQgZm9yIHJlZ3VsYXIgY29udGVudCB0ZXh0ICovCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxOHB4OwkKLX0KLQotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5hY3RpdmV0YWIgeyAKLSAJYmFja2dyb3VuZC1jb2xvcjogI2M0YzRjNDsKLSAgfQotIAotLyogYmVjYXVzZSBvZiBhbiBpbnRlcnZlbmluZyBsaW5rIHRhZywgdGV4dCBvcHRpb25zIHdlcmUgYXR0YWNoZWQgdG8gYSBzaW1pbGFyIGVsZW1lbnQgZm9yIGxpbmtzICovCi10ZC5hY3RpdmV0YWJzZWxlY3RlZCB7IAotIAliYWNrZ3JvdW5kLWNvbG9yOiAjZGRkZGRkOwotICB9Ci0gIAotIC8qIHRoZXNlIGJ1dHRvbiBzdHlsZXMgYXJlIGZvciB0aGUgdGV4dHVhbCBidXR0b25zIGludGVuZGVkIHRvIHJlcGxhY2UgaW1hZ2UgY29uc3RydWN0cyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24gKi8gCi10ZC5idXR0b25ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0gLyogZGlzYWJsZWQgdmVyc2lvbiAqLyAKLXRkLmJ1dHRvbmJvZHlkc2JsIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0vKiB0aGlzIHN0eWxlIGlzIGRlc2NvcGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlICovCi10ZC5idXR0b25oaWdobGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLXRkLmJ1dHRvbnNoYWRvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzZkNmQ2ZDsKLX0KLQotLyogZGlzYWJsZWQgdmVyc2lvbiAqLwotdGQuYnV0dG9uc2hhZG93ZHNibCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0EyQTJBMjsKLX0KLSAKLS8qIGRlc2lnbiBlbGVtZW50IHJhcmVseSB1c2VkIGZvciBsaW5lIGNvbG91ciBpbiBjZXJ0YWluIGRlY29yYXRpdmUgdGFibGVzICovCi10ZC5kZXNpZ24xIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZDRkNGQ0OwotfQotIAotLypkZXNpZ24gZWxlbWVudCBzaW11bGF0aW5nIGEgZGltZW5zaW9uYWwgYm91bmRhcnkgdG8gYSB0YWJsZSAqLwotdGQuZGl2aWRlcmRpbWVucyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKLX0KLSAKLSAvKiBiZWNhdXNlIG9mIGFuIGludGVydmVuaW5nIGxpbmsgdGFnLCB0ZXh0IG9wdGlvbnMgd2VyZSBhdHRhY2hlZCB0byBhIHNpbWlsYXIgZWxlbWVudCBmb3IgbGlua3MgKi8KLXRkLm5vbmFjdGl2ZXRhYiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLQotLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBncmF5Ki8KLXRkLnRibGhpZ2hsdCB7IAotICAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLSAgIHBhZGRpbmc6IDJweDsKLSB9Ci0gCi0gdGQudGJsaGlnaGx0MSB7IAotICAgYmFja2dyb3VuZC1jb2xvcjogI2RlZGVkZTsKLSB9Ci0gCi0vKiBkYXRhIHdpdGhpbiBhIHRhYmxlIGhpZ2hsaWdodGVkIGluIGxpZ2h0IGdyYXkqLwotdGQudGJsaGlnaGx0MiB7IAotICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLSB9IAotCi0gLyogZGF0YSB3aXRoaW4gYSB0YWJsZSBoaWdobGlnaHRlZCBpbiBsaWdodCBncmF5Ki8KLXRkLnRibGhpZ2hsdDMgeyAKLSAgIGJhY2tncm91bmQtY29sb3I6ICNlOWU5ZTk7Ci0gfSAgCi0gCi0vKmRhcmsgZ3JleSBjZWxsIGJhY2tncm91bmQgYW5kIGJvbGQgdGV4dCAqLwotLnRkZGFya2JvbGQgewotCWJhY2tncm91bmQtY29sb3I6ICNjY2NjY2M7CQotCWZvbnQtd2VpZ2h0IDogNjAwOwotfQotCi0udGRsaWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLQlwYWRkaW5nOiAycHg7Ci19Ci0KLS50ZGxpZ2h0MSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjsKLX0KLSAKLSAKLXRleHRhcmVhIHsKLSAgICBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsJCi0JZm9udC1zaXplOiAxNnB4OwotfQotCi10ZXh0YXJlYS5weDM4MHsKLSB3aWR0aDogMzgwcHg7IAotIH0KLQotLnRleHRlcnJvcm1zZyB7Ci0JY29sb3IgOiBjYzAwMDA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMTAlOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udGV4dGdyYXkgeyAgCi0JY29sb3I6ICM5OTk5OTk7CQotfQotCi0udG9wYmFyZGl2aWRlciB7IAotCWJhY2tncm91bmQ6ICMzMzk5Y2MgCi19Ci0KLS50b3BiYXJkaXZpZGVyZ3JleWVkIHsgCi0JYmFja2dyb3VuZDogI2FkZDZlYgotIH0gIAotCi0udG9wYmFyc2VwYXJhdG9yIHsKLSAgY29sb3I6ICNjYzMzMDA7ICAKLSAgZm9udC1zaXplOiAxNnB4OwotICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19IAotIAotLnRvcGZyYW1lYmcgewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLS50b3BmcmFtZWJnZ3JleWVkIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWRlZGVkOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogI2I2YjViNTsKLX0KLQotLnRvcGZyYW1laGlnaGxpZ2h0Z3JleWVkIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICNlMWUxZTE7Ci19Ci0KLS50b3BmcmFtZWhpZ2hsaWdodDIgeyAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOwotfQotCi0udG9wZnJhbWVoaWdobGlnaHQyZ3JleWVkIHsgCi0JYmFja2dyb3VuZC1jb2xvcjogI2Y5ZjlmOTsKLSB9IAotIAotLnRvcGZyYW1lbG9nb2JnIHsgIAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci19Ci0KLS50b3BmcmFtZWxvZ29iZ2dyZXllZCB7ICAKLQliYWNrZ3JvdW5kLWNvbG9yOiAjOTljMmQ2OwotfQotCi0udG9wZnJhbWVzaGFkb3cgeyAgCi0JYmFja2dyb3VuZC1jb2xvcjogIzg0ODQ4NDsKLX0KLQotLnRvcGZyYW1lc2hhZG93Z3JleWVkIHsgIAotYmFja2dyb3VuZC1jb2xvcjogI2NlY2VjZTsKLX0KLQotLnRvcGxlZnRuYXYgewkKLSAgICBjb2xvcjogIzAwMDAwMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0udG9wbGVmdG5hdmJvbGQgeyAKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYnJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7IAotCWZvbnQtd2VpZ2h0OiA2MDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLX0KLQotLnRvcGxlZnRuYXZib2xkZ3JleWVkIHsgCi0JY29sb3I6ICM5OTk5OTk7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTVweDsgCi0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOyAKLX0KLQotLnRvcGxlZnRuYXZncmV5ZWQgewkKLQljb2xvcjogIzk5OTk5OTsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDE1cHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCX0KLQotLnRvcGxpbmVjb2xvciB7IAotCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7Ci0gfQkKLQkKLS50b3ByaWdodG5hdiB7Ci0JY29sb3I6ICNmZmZmZmY7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNHB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnRvcHJpZ2h0bmF2Z3JleQotewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBweDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLQotIC8qIHRoaXMgd2FzIGluaXRpYWxseSBkZWNsYXJlZCB0aGUgc2FtZSBjb2xvdXIgYXMgdGhlIGNsYXNzIHRvcGZyYW1lIGJnIGJ1dCBiZWNhdXNlIGl0IGxpZXMgaW4gYSBkaWZmZXJlbnQgZnVuY3Rpb25hbCBhcmVhLCBoYXMgYmVlbiByZWNyZWF0ZWQgaGVyZSAgKi8KLXRyLmJnbWlkZnJhbWUgewotCWJhY2tncm91bmQtY29sb3I6ICNkMmQyZDI7Ci19Ci0KLXRkLnNpZGVtZW51YnVsbGV0Z3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLX0KLQotCi10ZC5zaWRlbWVudWJ1bGxldGNvbG9yZWQgewotCWJhY2tncm91bmQtY29sb3I6ICNjZDMzMDE7Ci19Ci0KLS8qbGlzdC1zdHlsZS1pbWFnZTogdXJsKGltYWdlcy9kb3duYnV0dG9uLmdpZik7Ki8KLXVsIHsJCi0KLQlsaXN0LXN0eWxlLXR5cGU6IHNxdWFyZTsKLX0KLSAKLQotLnZvYiB7Ci0JZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQlmb250LXdlaWdodDogNDAwOwotfQotCi0udm9iYm90dG9tIHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDIxcHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaWNvbnMvUHVibGlzaGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pY29ucy9QdWJsaXNoaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMxYmFmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pY29ucy9QdWJsaXNoaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9BcnRpZmFjdC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvQXJ0aWZhY3QuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzM5MTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9BcnRpZmFjdC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvUm9sZS5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9pbWFnZXMvUm9sZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMTgzYTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1JvbGUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1Rhc2suanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL1Rhc2suanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWFjMmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy9UYXNrLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2ltYWdlcy90b3AuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL3RvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWFjZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvaW1hZ2VzL3RvcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkaW5kZXhkZWYudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZGluZGV4ZGVmLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxNzE4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkaW5kZXhkZWYudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcmVsYXRpdmVwYXRoCS4uCi13d3dyb290CS4uCi1tYWlucmVzdWx0ZmlsZQkvaW5kZXgvaW5kZXguaHRtCi1pbmRleHJlc3VsdGZpbGUJL2luZGV4L25hdmlnLmh0bQota2V5d29yZHJlc3VsdGZpbGUJL2luZGV4L2NvbnRlbnRzLmh0bQotbWFpbnRpdGxlCUluZGV4IC0gQmFzaWMgVW5pZmllZCBQcm9jZXNzCi10YXJnZXQJb3J5X2RvYwotaW5kZXh0YXJnZXQJaW5kZXhfdAota2V5d29yZHRhcmdldAlrZXl3b3JkX3QKLWluZGV4aGVpZ2h0CTI1Ci1oZWFkZXJmaWxlCWtleXdvcmRwcmVhbWJsZS50eHQKLWZvb3RlcmZpbGUJa2V5d29yZHBvc3RhbWJsZS50eHQKLWtleXdvcmRmaWxlCWtleXdvcmRzLnR4dAotbGVhdmVEaXIJX2JvcmRlcnMKLW11bGl0ZG9jdW1lbnRrZXl3b3JkCWZhbHNlCi1zaG93ZG9jdW1lbnR0aXRsZQlmYWxzZQotcHJlZml4CVhFXwotbGV2ZWxzZXBhcmF0b3IJX18KLXNlZQksIFNlZQotc2VlYWxzbwksIFNlZSBhbHNvCi1sZXZlbHN0eWxlCWRlZmF1bHRzdHlsZQlpbmRleGxldmVsMgotbGV2ZWxzdHlsZQkxCWluZGV4bGV2ZWwxCi1sZXZlbHN0eWxlCTIJaW5kZXhsZXZlbDIKLWxldmVsc3R5bGUJaGVhZGxpbmVzdHlsZQlpbmRleGhlYWRpbmcgCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcG9zdGFtYmxlLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRwb3N0YW1ibGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWEwOWNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRwb3N0YW1ibGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRwcmVhbWJsZS50eHQgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9rZXl3b3JkcHJlYW1ibGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjJlNzUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRwcmVhbWJsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPgotPGhlYWQ+Ci08TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Ci08bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9ImluZGV4LmNzcyIgdHlwZT0idGV4dC9jc3MiPgotPHRpdGxlPkluZGV4IC0gQmFzaWMgVW5pZmllZCBQcm9jZXNzPC90aXRsZT4KLQotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwNDA4MCIgdmxpbms9IiM4MDAwRkYiIGFsaW5rPSIjMDAwMEZGIj4KLSAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHMudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcva2V5d29yZHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGQyNTdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2tleXdvcmRzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotWEVfS2V5V29yZEluZGV4X19Db3B5cmlnaHQJWEVfQ29weXJpZ2h0Ci1YRV9TaXRlTWFwX19Db3B5cmlnaHQJWEVfQ29weXJpZ2h0Ci1YRV9TZWFyY2hFbmdpbmVfX0NvcHlyaWdodAlYRV9Db3B5cmlnaHQKLVhFX1RyZWVCcm93c2VyX19Db3B5cmlnaHQJWEVfQ29weXJpZ2h0Ci1YRV9UcmVlQnJvd3Nlcl9fRXhhbXBsZQlYRV9TeXN0ZW1fcmVxdWlyZW1lbnRzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvbGliL3Jwd2NvcmUuamFyIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvbGliL3Jwd2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjkxNDk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL2xpYi9ycHdjb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTk3YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFB1Ymxpc2hpbmcKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0KLQotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1B1Ymxpc2hpbmdQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Mzg4NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL1B1Ymxpc2hpbmdQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5BYnN0cmFjdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUHVibGlzaGluZyBwbHVnLWluIGFjdGl2YXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ1BsdWdpbiBleHRlbmRzIEFic3RyYWN0QWN0aXZhdG9yIHsKLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IFB1Ymxpc2hpbmdQbHVnaW4uY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFB1Ymxpc2hpbmdQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaGluZ1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFB1Ymxpc2hpbmdQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUHVibGlzaGluZ1Jlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWFmZWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9QdWJsaXNoaW5nUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBQdWJsaXNoaW5nIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFB1Ymxpc2hpbmdSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gUHVibGlzaGluZ1Jlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFB1Ymxpc2hpbmdSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hpbmdDb25maWd1cmF0aW9uVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5pdGlhbGl6aW5nRGlyVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weWluZ0ZpbGVzVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGluZ0Jvb2ttYXJrc1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHVibGlzaGluZ0xpbmtlZEVsZW1lbnRUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRpbmdXQVJGaWxlVGFza19uYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkaW5nRWxlbWVudENsb3N1cmVUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2FkTGlicmFyeVRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VydmVyRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW52YWxpZEh0dHBSZXNwb25zZUVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludmFsaWRFbGVtZW50V2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnZhbGlkTWV0aG9kRWxlbWVudFdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUZpbGVXYXJuaW5nX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ0ljb25OYW1lV2FybmluZ19tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlcm5hbFVybF9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVTZWFyY2hJbmRleEVycm9yX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhc2tOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcmltYXJpbHlQZXJmb3Jtc05vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGVyZm9ybWluZ1JvbGVzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdXRwdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNwb25zaWJsZUZvck5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1vZGlmaWVzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzcG9uc2libGVSb2xlTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3VpZGFuY2VOb2RlX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbnB1dFRvTm9kZV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgb3V0cHV0RnJvbU5vZGVfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZGV4TGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZzsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFB1Ymxpc2hpbmdSZXNvdXJjZXMuY2xhc3MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5NTI1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotIwotIyBNZXNzYWdlIElEIFJhbmdlOiBJVVBQMDAwMEUgLSBJVVBQMDA5OUUKLSMKLQotIyBQcm9ncmVzcyBNZXNzYWdlcwotcHVibGlzaGluZ0NvbmZpZ3VyYXRpb25UYXNrX25hbWU9UHVibGlzaGluZyBjb25maWd1cmF0aW9uLi4uCi1pbml0aWFsaXppbmdEaXJUYXNrX25hbWU9SW5pdGlhbGl6aW5nIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4uLgotY29weWluZ0ZpbGVzVGFza19uYW1lPUNvcHlpbmcgZmlsZXMuLi4KLWdlbmVyYXRpbmdCb29rbWFya3NUYXNrX25hbWU9R2VuZXJhdGluZyBib29rbWFya3MuLi4KLWdlbmVyYXRpbmdCb29rbWFya1Rhc2tfbmFtZT1HZW5lcmF0aW5nIGJvb2ttYXJrICcnezB9JycuLi4KLWdlbmVyYXRpbmdCb29rbWFya0luZGV4VGFza19uYW1lPUdlbmVyYXRpbmcgYm9va21hcmsgaW5kZXguLi4KLXB1Ymxpc2hpbmdMaW5rZWRFbGVtZW50VGFza19uYW1lPVB1Ymxpc2hpbmcgbWV0aG9kIGVsZW1lbnRzOiB7MH0gcHVibGlzaGVkLCB7MX0gcmVtYWluaW5nCi1wdWJsaXNoaW5nRWxlbWVudFRhc2tfbmFtZT1QdWJsaXNoaW5nIG1ldGhvZCBlbGVtZW50OiB7MH06ezF9Ci1nZW5lcmF0aW5nR2xvc3NhcnlUYXNrX25hbWU9R2VuZXJhdGluZyBnbG9zc2FyeS4uLgotZ2VuZXJhdGluZ1NlYXJjaEluZGV4VGFza19uYW1lPUdlbmVyYXRpbmcgc2VhcmNoIGluZGV4Li4uCi1nZW5lcmF0aW5nV0FSRmlsZVRhc2tfbmFtZT1HZW5lcmF0aW5nIFdBUiBmaWxlLi4uCi1idWlsZGluZ1Byb2Nlc3NDbG9zdXJlVGFza19uYW1lPUJ1aWxkaW5nIHByb2Nlc3MgY2xvc3VyZS4uLgotYnVpbGRpbmdFbGVtZW50Q2xvc3VyZVRhc2tfbmFtZT1CdWlsZGluZyBlbGVtZW50IGNsb3N1cmUgZm9yICcnezB9JycuLi4KLWxvYWRMaWJyYXJ5VGFza19uYW1lPUxvYWRpbmcgbGlicmFyeSBjb250ZW50cy4uLgotCi0jIEVycm9yIE1lc3NhZ2VzIGxvZ2dlZCBpbiB0aGUgUHVibGlzaGluZyBSZXBvcnQKLXB1Ymxpc2hFbGVtZW50RXJyb3JfbXNnPUlVUFAwMDAwRTogRXJyb3IgcHVibGlzaGluZyBlbGVtZW50OiB7MH0KLXNlcnZlckVycm9yX21zZz1JVVBQMDAwMUU6IE5vIGRhdGEgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIuCi1pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnPUlVUFAwMDAyRTogSW52YWxpZCByZXNwb25zZSBmcm9tIGh0dHA6Ly97MH06ezF9OnsyfQotCi0jIFdhcm5pbmcgTWVzc2FnZXMgbG9nZ2VkIGluIHRoZSBQdWJsaXNoaW5nIFJlcG9ydAotaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwM1c6IEVsZW1lbnQgd2FzIG5vdCBwdWJsaXNoZWQgYmVjYXVzZSBpdCBpcyBub3QgYSB2YWxpZCBlbGVtZW50IGluIHRoZSBjb25maWd1cmF0aW9uLgotaW52YWxpZE1ldGhvZEVsZW1lbnRXYXJuaW5nX21zZz1JVVBQMDAwNFc6IEVsZW1lbnQgd2FzIG5vdCBwdWJsaXNoZWQgYmVjYXVzZSBpdCBpcyBub3QgYSBtZXRob2QgZWxlbWVudDogezB9Ci1jb3B5RmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA1VzogVW5hYmxlIHRvIGNvcHkgZmlsZSBmcm9tICcnezB9JycgdG8gJyd7MX0nJy4KLW1pc3NpbmdJY29uRmlsZVdhcm5pbmdfbXNnPUlVUFAwMDA2VzogTm9kZSBpY29uIGZpbGUgJyd7MH0nJyBkb2VzIG5vdCBleGlzdHMuCi1taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZz1JVVBQMDAwN1c6IFVuYWJsZSB0byByZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgdGhlIG5vZGUgaWNvbi4KLWV4dGVybmFsVXJsX21zZz17MH0gbWluaS1zZWNvbmRzIHJlZmVyZW5jaW5nIGV4dGVybmFsIFVSTDogezF9Ci1kaXNjYXJlZENhdGVnb3J5V2FybmluZ19tc2c9RW1wdHkgY29udGVudCBjYXRlZ29yeSBlbGVtZW50IG5vdCBwdWJsaXNoZWQuCi0KLSMgRXJyb3IgRGV0YWlscwotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcl9tc2c9SVVQUDAwMDhFOiBUaGUgc2VhcmNoIGluZGV4IGZpbGUgd2FzIG5vdCBjcmVhdGVkLgotCi0jIFByb2Nlc3MgVHJlZSBOb2RlcwotcmVmZXJlbmNlV29ya2Zsb3dzTm9kZV90ZXh0PVJlZmVyZW5jZSBXb3JrZmxvd3MKLXRhc2tOb2RlX3RleHQ9VGFza3MKLXByaW1hcmlseVBlcmZvcm1zTm9kZV90ZXh0PVByaW1hcmlseSBQZXJmb3JtcwotYWRkaXRpb25hbGx5UGVyZm9ybXNOb2RlX3RleHQ9QWRkaXRpb25hbGx5IFBlcmZvcm1zCi1wZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ9UGVyZm9ybWluZyBSb2xlcwotaW5wdXRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9SW5wdXQgV29yayBQcm9kdWN0cwotb3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0PU91dHB1dCBXb3JrIFByb2R1Y3RzCi1yZXNwb25zaWJsZUZvck5vZGVfdGV4dD1SZXNwb25zaWJsZSBGb3IKLW1vZGlmaWVzTm9kZV90ZXh0PU1vZGlmaWVzCi1yZXNwb25zaWJsZVJvbGVOb2RlX3RleHQ9UmVzcG9uc2libGUgUm9sZQotY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0PUNvbnRhaW5pbmcgV29yayBQcm9kdWN0Ci1jb250YWluZWRXb3JrUHJvZHVjdHNOb2RlX3RleHQ9Q29udGFpbmVkIFdvcmsgUHJvZHVjdHMKLWd1aWRhbmNlTm9kZV90ZXh0PUd1aWRhbmNlCi1pbnB1dFRvTm9kZV90ZXh0PUlucHV0IHRvCi1vdXRwdXRGcm9tTm9kZV90ZXh0PU91dHB1dCBmcm9tCi0KLSMgSFRNTCBUaXRsZSBmb3IgSW5kZXggUGFnZQotaW5kZXhMYWJlbF90ZXh0PUluZGV4CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjNDJjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGFjdGl2YXRvciBmb3IgbWFuYWdpbmcgdGhlIFB1Ymxpc2hpbmcgcGx1Zy1pbidzIGxpZmUgY3ljbGUuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0UHVibGlzaE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFB1Ymxpc2hNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NTMzMTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0UHVibGlzaE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkRlYnVnVHJhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5GaWxlTmFtZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1Jlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgUHVibGlzaCBNYW5hZ2Vycy4KLSAqIDxwPgotICogVXNlIHRoZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5wdWJsaXNoZXJzIGV4dGVuc2lvbiBwb2ludCB0byBleHRlbmQKLSAqIHRoaXMgY2xhc3MgaWYgeW91IG5lZWQgdG8gY3VzdG9taXplIHRoZSBwdWJsaXNoaW5nLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQdWJsaXNoTWFuYWdlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gcHJvZmlsaW5nID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkKLQkJCS5pc1Byb2ZpbGluZygpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwdWJEaXI7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgUHVibGlzaEhUTUxPcHRpb25zIG9wdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RWaWV3QnVpbGRlciB2aWV3QnVpbGRlcjsKLQotCXByb3RlY3RlZCBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFic3RyYWN0UHVibGlzaE1hbmFnZXIoKSB7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlsaXplcyB0aGUgcHVibGlzaGluZyBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBwdWJEaXIKLQkgKiAgICAgICAgICAgIHRoZSBwdWJsaXNoIGRpcmVjdG9yeQotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gb3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucwotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoU3RyaW5nIHB1YkRpciwgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlQdWJsaXNoT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXRoaXMucHViRGlyID0gcHViRGlyOwotCi0JCWlmICghdGhpcy5wdWJEaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQl0aGlzLnB1YkRpciArPSBGaWxlLnNlcGFyYXRvcjsKLQkJfQotCi0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlpZiAob3B0aW9ucyBpbnN0YW5jZW9mIFB1Ymxpc2hIVE1MT3B0aW9ucykgewotCQkJdGhpcy5vcHRpb25zID0gKFB1Ymxpc2hIVE1MT3B0aW9ucykgb3B0aW9uczsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnZpZXdCdWlsZGVyID0gY3JlYXRlVmlld0J1aWxkZXIoKTsKLQotCQkvLyBjbGVhciB0aGUgZmlsZSBuYW1lIGNhY2hlCi0JCS8vIE5hbWVDYWNoZS5nZXRJbnN0YW5jZSgpLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBwdWJsaXNoaW5nIHZpZXcgYnVpbGRlci4gVGhlIHZpZXcgYnVpbGRlciBpcyByZXNwb25zaWJsZSB0byBidWlsZAotCSAqIHRoZSBwdWJsaXNoaW5nIHZpZXdzIGFuZCBjb250ZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIEFic3RyYWN0Vmlld0J1aWxkZXIKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RWaWV3QnVpbGRlciBnZXRWaWV3QnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMudmlld0J1aWxkZXI7Ci0JfQotCi0JcHVibGljIElTaXRlR2VuZXJhdG9yIGdldFNpdGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB2aWV3QnVpbGRlci5nZXRTaXRlR2VuZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogZG8gcHVibGlzaGluZy4gVGhlIHB1Ymxpc2hpbmcgcHJvY2VzcyBpcyBkZWZpbmVkIGluIHRocmVlIHN0ZXBzLgotCSAqIHByZVB1Ymxpc2ggdG8gZG8gc29tZSBwcmVwYXJhdGlvbiBiZWZvcmUgdGhlIGFjdHVhbCBwdWJsaXNoaW5nIGRvUHVibGlzaAotCSAqIHRvIHB1Ymxpc2ggdGhlIHZpZXdzIGFuZCBjb250ZW50cyBwb3N0UHVibGlzaCB0byBkbyBzb21lIGNsZWFudXAgd29yawotCSAqIGFmdGVyIHB1Ymxpc2guIEV4dGVuZGVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgdG8gYWNoaWV2ZQotCSAqIGFkZGl0aW9uYWwgcHVibGlzaGluZyByZXN1bHRzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCQlpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0JCQlvcHRpb25zLnZhbGlkYXRlKCk7Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgZmlsZSBuYW1lIGNhY2hlIHNvIHRoYXQgdGhlIGZpbGUgbmFtZSB3aWxsIGJlIGJhc2VkIG9uIHRoZSBsYXRlc3QgbGlicmFyeSBkYXRhCi0JCS8vIHRoaXMgY2FuIGF2b2lkIHRoZSBjYXNlcyB3aGVyZSBlbGVtZW50IG5hbWUgY2hhbmdlZCBiZWZvcmUgcHVibGlzaGluZwotCQlGaWxlTmFtZUdlbmVyYXRvci5JTlNUQU5DRS5jbGVhcigpOwotCQkKLQkJbG9uZyBiZWdpblRpbWUgPSAwTDsKLQkJbG9uZyBzdGFydFRpbWUgPSAwTDsKLQotCQkvLyBkbyBhIGdjIGJlZm9yZSBnZXR0aW5nIHN0YXJlZAotCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOwotCQkKLQkJdHJ5IHsKLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQliZWdpblRpbWUgPSBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCQotCQkJcHJlUHVibGlzaChtb25pdG9yKTsKLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJwcmVQdWJsaXNoIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQkJCQkKLQkJCWRvUHVibGlzaChtb25pdG9yKTsKLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJkb1B1Ymxpc2giLCAvLyROT04tTkxTLTEkCi0JCQkJCQkoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCXBvc3RQdWJsaXNoKG1vbml0b3IpOwotCQkJaWYgKHByb2ZpbGluZykgewotCQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInBvc3RQdWJsaXNoIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVGltZSB0YWtlbiB0byBwdWJsaXNoIGNvbmZpZ3VyYXRpb24gJyIgKyBjb25maWcuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyAiJzogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZ2luVGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGxvYWRMaWJyYXJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBmaXJzdCBvZiBhbGwsIHdlIG5lZWQgdG8gbG9hZCB0aGUgbGlicmFyeSwKLQkJLy8gb3RoZXJ3aXNlLCBzb21lIHJlbGF0aW9uc2hpcHMgYW5kIG9wcG9zaXRlIGZlYXR1cmVzIGFyZSBub3QKLQkJLy8gZXN0YWJsaXNoZWQKLQkJbG9uZyBzdGFydFRpbWUgPSAwTDsKLQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQkKLQkJQ29sbGVjdGlvbjxSZXNvdXJjZT4gY2hhbmdlZFJlc291cmNlcyA9IExpYnJhcnlVdGlsLmxvYWRBbGwoKE1ldGhvZExpYnJhcnkpIGNvbmZpZy5lQ29udGFpbmVyKCkpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHRoaXMsICJsb2FkTGlicmFyeSIsICJMaWJyYXJ5VXRpbC5sb2FkQWxsOiAiIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkKLQkJCQkJCQkrICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCQotLy8JcHJvdGVjdGVkIHZvaWQgdW5sb2FkUmVzb3VyY2VzKENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc291cmNlcykgewotLy8JCQotLy8JCS8vUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsKLS8vCQkvL2xvbmcgbTEgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkvMTAwMDAwMDsKLS8vCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlc291cmNlcyk7Ci0vLwkJLy9SdW50aW1lLmdldFJ1bnRpbWUoKS5nYygpOwkJCi0vLwkJLy9sb25nIG0yID0gUnVudGltZS5nZXRSdW50aW1lKCkuZnJlZU1lbW9yeSgpLzEwMDAwMDA7Ci0vLwkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgTG9uZy50b1N0cmluZyhtMi1tMSkgKyAiIE1CIGZyZWVkIGJ5IHVubG9hZGluZyByZXNvdXJjZXMiKTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlRGlhZ3JhbU1hbmFnZXJzKENvbGxlY3Rpb248RGlhZ3JhbU1hbmFnZXI+IG1ncnMsIENvbGxlY3Rpb248RGlhZ3JhbU1hbmFnZXI+IGtlZXBsaXN0KSB7Ci0vLwkJZm9yICggSXRlcmF0b3I8RGlhZ3JhbU1hbmFnZXI+IGl0ID0gbWdycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotLy8JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBpdC5uZXh0KCk7Ci0vLwkJCWlmICgga2VlcGxpc3QgPT0gbnVsbCB8fCAha2VlcGxpc3QuY29udGFpbnMobWdyKSApIHsKLS8vCQkJCW1nci5kaXNwb3NlKCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9iamVjdC4gT25jZSBkaXNwb3NlZCwgdGhlIG9iamVjdCBpcyBub3QgdmFsaWQgYW55IG1vcmUuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHZpZXdCdWlsZGVyICE9IG51bGwpIHsKLQkJCXZpZXdCdWlsZGVyLmRpc3Bvc2UoKTsKLQkJCXZpZXdCdWlsZGVyID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFic3RyYWN0IG1ldGhvZCB0byBnZXQgdGhlIHVybCB0byB0aGUgcHVibGlzaGVkIHNpdGUKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgdXJsCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQdWJsaXNoZWRVcmwoKTsKLQotCS8qKgotCSAqIGFic3RyYWN0IG1ldGhvZCB0byBnZXQgdGhlIHVybCB0byB0aGUgcHVibGlzaCByZXBvcnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Vmlld0J1aWxkZXIgY3JlYXRlVmlld0J1aWxkZXIoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByZVB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIEV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRvUHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQl0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcG9zdFB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJdGhyb3dzIEV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0U2l0ZUdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0Fic3RyYWN0U2l0ZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDQ4MDRmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFNpdGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5MYXlvdXRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYSBTaXRlIEdlbmVyYXRvci4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2l0ZUdlbmVyYXRvciBpbXBsZW1lbnRzIElTaXRlR2VuZXJhdG9yIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NfUk9PVCA9ICJkb2Nyb290LyI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORl9QQVRIID0gImRvY3Jvb3QvV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORl9ESVIgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YkRpcjsKLQlwcm90ZWN0ZWQgUHVibGlzaEhUTUxPcHRpb25zIG9wdGlvbnM7Ci0JcHJvdGVjdGVkIEh0bWxCdWlsZGVyIGJ1aWxkZXI7Ci0JCi0JcHVibGljIEFic3RyYWN0U2l0ZUdlbmVyYXRvcihIdG1sQnVpbGRlciBidWlsZGVyLCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucykgewotCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotCQl0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOwotCQl0aGlzLnB1YkRpciA9IGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBIdG1sQnVpbGRlciBnZXRIdG1sQnVpbGRlcigpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJbmRleEZpbGVQYXRoKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldE5vZGVJY29uUGF0aCgpOyAKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdEJhbm5lckltYWdlRmlsZSgpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoT3B0aW9ucygpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcG9zdFB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHJlUHVibGlzaCgpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVQdWJsaXNoZWRCb29rbWFya3MoTGlzdCBib29rbWFya3MsIEJvb2ttYXJrIGRlZmF1bHRWaWV3KQotCQkJdGhyb3dzIEV4Y2VwdGlvbjsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb3B5Q3VzdG9taXplZEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zLmJhbm5lckltYWdlICE9IG51bGwgJiYgb3B0aW9ucy5iYW5uZXJJbWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCUZpbGVVdGlsLmNvcHlGaWxlKG9wdGlvbnMuYmFubmVySW1hZ2UsIHB1YkRpciArICJpbWFnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJb3B0aW9ucy5iYW5uZXJJbWFnZSA9IEZpbGVVdGlsLmdldEZpbGVOYW1lKG9wdGlvbnMuYmFubmVySW1hZ2UpOwotCQl9IGVsc2UgewotCQkJb3B0aW9ucy5iYW5uZXJJbWFnZSA9IGdldERlZmF1bHRCYW5uZXJJbWFnZUZpbGUoKTsKLQkJfQotCQkKLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpKSB7Ci0JCQlVUkwgcGx1Z2luX3VybCA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKTsKLQkJCVN0cmluZyBwYXRoID0gRmlsZUxvY2F0b3IucmVzb2x2ZShuZXcgVVJMKHBsdWdpbl91cmwsIFdFQl9JTkZfUEFUSCkpLmdldFBhdGgoKTsKLQkJCVN0cmluZyBpbmNsdWRlcyA9ICIqLiosICoqLyI7IC8vJE5PTi1OTFMtMSQKLQkJCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHBhdGgsIHB1YkRpciArIFdFQl9JTkZfRElSLCBpbmNsdWRlcywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb3B5TG9jYWxpemVkRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBjb3B5IHNjcmlwdHMsIHJlbmFtZSB0aGUgbG9jYWxzZSBzcGVjaWZpYyBuYW1lIHRvIHRoZSBkZWZhdWx0Ci0JCS8vIG5hbWUKLQkJUHVibGlzaGluZ1BsdWdpbgotCQkJCS5nZXREZWZhdWx0KCkKLQkJCQkuY29weUxvY2FsaXplZEZpbGVzKAotCQkJCQkJRE9DX1JPT1QgKyAic2NyaXB0cy8iLCBuZXcgRmlsZShwdWJEaXIsICJzY3JpcHRzLyIpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmNvcHlMb2NhbGl6ZWRGaWxlcygKLQkJCQlET0NfUk9PVCArICJpbWFnZXMvIiwgbmV3IEZpbGUocHViRGlyLCAiaW1hZ2VzLyIpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCVB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmNvcHlMb2NhbGl6ZWRGaWxlcyhET0NfUk9PVCwKLQkJCQluZXcgRmlsZShwdWJEaXIsICIvIiksIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld0RhdGFGaWxlTmFtZShCb29rbWFyayBiLCBTdHJpbmcgZXh0KSB7Ci0JCUZpbGUgZiA9IG5ldyBGaWxlKGIuZ2V0RmlsZU5hbWUoKSk7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGYuZ2V0TmFtZSgpOwotCQlpbnQgaSA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGkgPj0gMCkgewotCQkJZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaSk7Ci0JCX0KLQotCQlyZXR1cm4gZmlsZU5hbWUgKyBleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKCBidWlsZGVyICE9IG51bGwgKSB7Ci0JCQlidWlsZGVyLmdldExheW91dE1hbmFnZXIoKS5jbGVhcigpOwotCQkJYnVpbGRlci5kaXNwb3NlKCk7Ci0JCQlidWlsZGVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFZpZXdCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQWJzdHJhY3RWaWV3QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWY2MWNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9BYnN0cmFjdFZpZXdCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRWxlbWVudExheW91dE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0Lkh0bWxCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkljb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1Jlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIHB1Ymxpc2hpbmcgdmlldyBidWlsZGVycy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZpZXdCdWlsZGVyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFRJTUVPVVRfSU5URVJWQUwgPSA2MDAwMDA7IC8vIGluIG1pbGxpc2Vjb25kcwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHByb2ZpbGluZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkuaXNQcm9maWxpbmcoKTsKLQotCXByb3RlY3RlZCBJU2l0ZUdlbmVyYXRvciBzaXRlR2VuZXJhdG9yOwotCi0JcHJvdGVjdGVkIFB1Ymxpc2hPcHRpb25zIG9wdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWc7Ci0KLQlwcm90ZWN0ZWQgQm9va21hcmsgZGVmYXVsdFZpZXc7Ci0KLQlQdWJsaXNoaW5nUnVubmFibGUgcnVubmFibGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZ2VuZXJhdG9yCi0JICogICAgICAgICAgICBhIHNpdGUgZ2VuZXJhdG9yCi0JICovCi0JcHVibGljIEFic3RyYWN0Vmlld0J1aWxkZXIoSVNpdGVHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXRoaXMuc2l0ZUdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLQkJdGhpcy5vcHRpb25zID0gZ2VuZXJhdG9yLmdldFB1Ymxpc2hPcHRpb25zKCk7Ci0JCXRoaXMuY29uZmlnID0gZ2VuZXJhdG9yLmdldEh0bWxCdWlsZGVyKCkuZ2V0TGF5b3V0TWFuYWdlcigpCi0JCQkJLmdldENvbmZpZ3VyYXRpb24oKTsKLQkJdGhpcy5ydW5uYWJsZSA9IG5ldyBQdWJsaXNoaW5nUnVubmFibGUoZ2VuZXJhdG9yLmdldEh0bWxCdWlsZGVyKCksIFRJTUVPVVRfSU5URVJWQUwpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNpdGUgZ2VuZXJhdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpdGUgZ2VuZXJhdG9yIGFzc2lnbmVkIHRvIHRoaXMgdmlldyBidWlsZGVyCi0JICovCi0JcHVibGljIElTaXRlR2VuZXJhdG9yIGdldFNpdGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnNpdGVHZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCBidWlsZGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEhUTUwgYnVpbGRlciBhc3NpZ25lZCB0byB0aGlzIHZpZXcgYnVpbGRlcgotCSAqLwotCXB1YmxpYyBIdG1sQnVpbGRlciBnZXRIdG1sQnVpbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc2l0ZUdlbmVyYXRvci5nZXRIdG1sQnVpbGRlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2hpbmcgb3B0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwdWJsaXNoaW5nIG9wdGlvbnMgYXNzaWduZWQgdG8gdGhpcyB2aWV3IGJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuc2l0ZUdlbmVyYXRvci5nZXRQdWJsaXNoT3B0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxheW91dCBtYW5hZ2VyLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWxlbWVudCBsYXlvdXQgbWFuYWdlciBhc3NpZ25lZCB0byB0aGlzIHZpZXcgYnVpbGRlcgotCSAqLwotCXB1YmxpYyBFbGVtZW50TGF5b3V0TWFuYWdlciBnZXRMYXlvdXRNZ3IoKSB7Ci0JCXJldHVybiBnZXRIdG1sQnVpbGRlcigpLmdldExheW91dE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50IHZhbGlkYXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGVsZW1lbnQgbGF5b3V0IG1hbmFnZXIgYXNzaWduZWQgdG8gdGhpcyB2aWV3IGJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gKFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKSBnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGVsZW1lbnQgY2FuIGJlIHB1Ymxpc2hlZCBvciBub3QuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCBjYW4gYmUgcHVibGlzaGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuUHVibGlzaChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGlzVmlzaWJsZShlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgcHVibGlzaGVkIHdlYgotCSAqIHNpdGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgZWxlbWVudCB3aWxsIGJlIHZpc2libGUgaW4gdGhlCi0JICogICAgICAgICBwdWJsaXNoZWQgd2ViIHNpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Zpc2libGUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmIChnZXRWYWxpZGF0b3IoKS5pc0Rpc2NhcmRlZChudWxsLCBudWxsLCBlbGVtZW50KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCFDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3coZWxlbWVudCwgY29uZmlnKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoUHJvY2VzcygpKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsaWRhdG9yKCkuaW5DbG9zdXJlKGVsZW1lbnQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNjYXJkRW1wdHlDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgZWxlbWVudCwgYm9vbGVhbiBkaXNjYXJkKSB7Ci0JCWlmIChkaXNjYXJkKSB7Ci0JCQlnZXRWYWxpZGF0b3IoKS5zZXREaXNjYXJkZWRFbGVtZW50KGVsZW1lbnQpOwotCQkJZ2V0VmFsaWRhdG9yKCkubG9nV2FybmluZyhlbGVtZW50LAotCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLmRpc2NhcmVkQ2F0ZWdvcnlXYXJuaW5nX21zZyk7Ci0JCX0gZWxzZSB7Ci0JCQlnZXRWYWxpZGF0b3IoKS5hZGRWYWxpZENhdGVnb3J5KChDb250ZW50Q2F0ZWdvcnkpIGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgY2FsYzAxRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWxjMG5GZWF0dXJlVmFsdWUoTWV0aG9kRWxlbWVudCBlbGVtZW50LAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIGZlYXR1cmUsCi0JCQkJZ2V0TGF5b3V0TWdyKCkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50IGNhbGMwMUZlYXR1cmVWYWx1ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgZmVhdHVyZSwKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FsYzBuRmVhdHVyZVZhbHVlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBmZWF0dXJlLAotCQkJCWdldExheW91dE1ncigpLmdldEVsZW1lbnRSZWFsaXplcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQdWJsaXNoZWRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvcigpLmdldFB1Ymxpc2hlZEVsZW1lbnRzKCk7Ci0JfQotCi0JCi0JLyoqCi0JICogUHVibGlzaGVzIHRoZSBlbGVtZW50LCBjb2xsZWN0cyB0aGUgbGlua2VkIGVsZW1lbnRzIGluIHRoZSBwdWJsaXNoZWQKLQkgKiBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2goZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLAotCQkJZmluYWwgTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBCZWdpbiBwdWJsaXNoaW5nIGVsZW1lbnQgIiArCi0JCS8vIGVsZW1lbnQuZ2V0R3VpZCgpICsgIjoiICsgZWxlbWVudC5nZXRUeXBlKCkuZ2V0TmFtZSgpICsgIjoiICsKLQkJLy8gZWxlbWVudC5nZXROYW1lKCkgKTsKLQkJdHJ5IHsKLQkJCUxpc3QgbGlua2VkRWxlbWVudHMgPSBnZXRWYWxpZGF0b3IoKQotCQkJCQkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCk7Ci0JCQlMaXN0IHB1Ymxpc2hlZEVsZW1lbnRzID0gZ2V0VmFsaWRhdG9yKCkKLQkJCQkJLmdldFB1Ymxpc2hlZEVsZW1lbnRzKCk7CQkJCQkKLQkJCUh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyID0gZ2V0SHRtbEJ1aWxkZXIoKTsKLQkJCWlmICghY2FuUHVibGlzaChlbGVtZW50KSkgewotCQkJCWh0bWxCdWlsZGVyLmdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoZWxlbWVudCwKLQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMuaW52YWxpZEVsZW1lbnRXYXJuaW5nX21zZyk7Ci0JCQl9IGVsc2UgaWYgKCFwdWJsaXNoZWRFbGVtZW50cy5jb250YWlucyhlbGVtZW50KSkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBzdHI7Ci0JCQkJCQlpZiAobGlua2VkRWxlbWVudHMgIT0gbnVsbCkgewotCQkJCQkJCXN0ciA9IE5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0xpbmtlZEVsZW1lbnRUYXNrX25hbWUsCi0JCQkJCQkJCQkJCUludGVnZXIKLQkJCQkJCQkJCQkJCQkudG9TdHJpbmcocHVibGlzaGVkRWxlbWVudHMKLQkJCQkJCQkJCQkJCQkJCS5zaXplKCkpLAotCQkJCQkJCQkJCQlJbnRlZ2VyCi0JCQkJCQkJCQkJCQkJLnRvU3RyaW5nKGxpbmtlZEVsZW1lbnRzCi0JCQkJCQkJCQkJCQkJCQkuc2l6ZSgpKSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXN0ciA9IE5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaGluZ0VsZW1lbnRUYXNrX25hbWUsCi0JCQkJCQkJCQkJCWVsZW1lbnQuZ2V0VHlwZSgpLmdldE5hbWUoKSwKLQkJCQkJCQkJCQkJZWxlbWVudC5nZXROYW1lKCkpOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci5zdWJUYXNrKHN0cik7Ci0KLQkJCQkJfQotCQkJCQlJRWxlbWVudExheW91dCBsYXlvdXQgPSBodG1sQnVpbGRlcgotCQkJCQkJCS5nZXRMYXlvdXRNYW5hZ2VyKCkKLQkJCQkJCQkuZ2V0TGF5b3V0KGVsZW1lbnQsIHRydWUpOwotLy8JCQkJCVN0cmluZyBodG1sZmlsZSA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQkJCQlTdHJpbmcgaHRtbGZpbGUgPSBydW5uYWJsZS5nZW5lcmF0ZUh0bWwobGF5b3V0KTsKLQkJCQkJZWxlbWVudFB1Ymxpc2hlZChsYXlvdXQsIGh0bWxmaWxlKTsKLQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQlodG1sQnVpbGRlcgotCQkJCQkJCS5nZXRWYWxpZGF0b3IoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJUHVibGlzaGluZ1Jlc291cmNlcy5wdWJsaXNoRWxlbWVudEVycm9yX21zZywKLQkJCQkJCQkJCQkJCQlleC5nZXRNZXNzYWdlKCkpLAotCQkJCQkJCQkJZXgpOwotCQkJCX0KLQkJCQlwdWJsaXNoZWRFbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQWxyZWFkeSBnZW5lcmF0ZWQ6ICIgKwotCQkJCS8vIGdldFVSTChlbGVtZW50KSApOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWdldEh0bWxCdWlsZGVyKCkKLQkJCQkJLmdldFZhbGlkYXRvcigpCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQllbGVtZW50LAotCQkJCQkJCU5MUwotCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMucHVibGlzaEVsZW1lbnRFcnJvcl9tc2csCi0JCQkJCQkJCQkJCWUuZ2V0TWVzc2FnZSgpKSwgZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbGVtZW50UHVibGlzaGVkKElFbGVtZW50TGF5b3V0IGxheW91dCwgU3RyaW5nIGh0bWxmaWxlKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlOb2RlSWNvbihGaWxlIHNvdXJjZSkgewotCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5nZXROYW1lKCk7Ci0KLQkJRmlsZSBkZXN0ID0gbmV3IEZpbGUoc2l0ZUdlbmVyYXRvci5nZXROb2RlSWNvblBhdGgoKSwgbmFtZSk7Ci0JCWlmIChGaWxlVXRpbC5jb3B5RmlsZShzb3VyY2UsIGRlc3QpID09IGZhbHNlKSB7Ci0JCQlnZXRIdG1sQnVpbGRlcigpLmdldFZhbGlkYXRvcigpLmxvZ1dhcm5pbmcoCi0JCQkJCU5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMuY29weUZpbGVXYXJuaW5nX21zZywgc291cmNlCi0JCQkJCQkJLmdldEFic29sdXRlUGF0aCgpLCBkZXN0LmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5vZGVJY29uTmFtZShPYmplY3Qgb2JqKSB7Ci0JCUZpbGUgaWNvbkZpbGUgPSBudWxsOwotCQlTdHJpbmcgaWNvbk5hbWUgPSBudWxsOwotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCVVSSSB1cmkgPSAoKERlc2NyaWJhYmxlRWxlbWVudCkgb2JqKS5nZXROb2RlaWNvbigpOwotCQkJCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgdXJpSW5oZXJpdGluZ0Jhc2UgPSBudWxsOwotCQkJaWYgKHVyaSA9PSBudWxsICYmIGNvbmZpZyAhPSBudWxsICYmIG9iaiBpbnN0YW5jZW9mIFZhcmlhYmlsaXR5RWxlbWVudCkgewotCQkJCVZhcmlhYmlsaXR5RWxlbWVudFtdIHVyaUluaGVyaXRpbmdCYXNlcyA9IG5ldyBWYXJpYWJpbGl0eUVsZW1lbnRbMV07Ci0JCQkJdXJpID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRJbmhlcml0aW5nVXJpKChEZXNjcmliYWJsZUVsZW1lbnQpIG9iaiwgdXJpLCB1cmlJbmhlcml0aW5nQmFzZXMsIGNvbmZpZywgMCk7Ci0JCQkJdXJpSW5oZXJpdGluZ0Jhc2UgPSB1cmlJbmhlcml0aW5nQmFzZXNbMF07Ci0JCQl9Ci0KLQkJCVN0cmluZyBlbGVtZW50TmFtZSA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmopLmdldFR5cGUoKS5nZXROYW1lKCkKLQkJCQkJLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAoRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzLnVzZURlZmF1bHRJY29uKGVsZW1lbnROYW1lKSkKLQkJCQl1cmkgPSBudWxsOwotCi0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkvLyB0cnkgaWYgdGhpcyBpcyBhIHZhbGlkIFVSTCBvciBub3QKLQkJCQlib29sZWFuIGlzRnVsbFBhdGggPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlVUkwgdXJsID0gdXJpLnRvVVJMKCk7Ci0JCQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCQkJaWNvbkZpbGUgPSBuZXcgRmlsZShVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0RmlsZSgpLAotCQkJCQkJCQkiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlzRnVsbFBhdGggPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCS8vIG5vdCBhIHZhbGlkIHVybCwgbWF5YmUgYSByZWxhdGl2ZSBwYXRoCi0JCQkJfQotCi0JCQkJaWYgKCFpc0Z1bGxQYXRoKSB7Ci0JCQkJCS8vIGljb25GaWxlID0gbmV3Ci0JCQkJCS8vIEZpbGUoTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeVBhdGgoKSwKLQkJCQkJLy8gVVJMRGVjb2Rlci5kZWNvZGUodXJpLnRvU3RyaW5nKCkpKTsKLQkJCQkJLy8gVG8gaGFuZGxlIHRoZSBub2RlSWNvbiB1cmksIEVQRiAxLjIsIGl0cyBjaGFuZ2VkIG5vdyBpdAotCQkJCQkvLyBpcyByZWxhdGl2ZSB0byBwbHVnaW4gcGF0aC4KLQkJCQkJaWNvbkZpbGUgPSBuZXcgRmlsZSgKLQkJCQkJCQlUbmdVdGlsLmdldEZ1bGxQYXRob2ZOb2Rlb3JTaGFwZUljb25VUkkoCi0JCQkJCQkJCQl1cmlJbmhlcml0aW5nQmFzZSA9PSBudWxsID8gKEVPYmplY3QpIG9iaiA6IHVyaUluaGVyaXRpbmdCYXNlLCB1cmkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGljb25GaWxlICE9IG51bGwpICYmICFpY29uRmlsZS5leGlzdHMoKSkgewotCQkJaWNvbkZpbGUgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGljb25GaWxlID09IG51bGwpIHsKLQkJCS8vIGdldCB0aGUgZGVmYXVsdCBpY29uIG5hbWUKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0VHlwZSgpLmdldE5hbWUoKQotCQkJCQkJLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWNvbkZpbGUgPSBJY29uVXRpbC5nZXROb2RlSWNvbkZpbGUodHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaWNvbkZpbGUgIT0gbnVsbCkgewotCQkJLy8gbmVlZCB0byBjb3B5IHRoZSBmaWxlIHRvZ2V0aGVyIGFuZCB6aXAgZm9yIHRoZSBhcHBsZXQKLQkJCWlmICghaWNvbkZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQlnZXRIdG1sQnVpbGRlcigpCi0JCQkJCQkJLmdldFZhbGlkYXRvcigpCi0JCQkJCQkJLmxvZ1dhcm5pbmcoCi0JCQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgb2JqLAotCQkJCQkJCQkJTkxTCi0JCQkJCQkJCQkJCS5iaW5kKAotCQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdSZXNvdXJjZXMubWlzc2luZ0ljb25GaWxlV2FybmluZ19tc2csCi0JCQkJCQkJCQkJCQkJaWNvbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlnZXRIdG1sQnVpbGRlcigpCi0JCQkJCQkJLmdldFZhbGlkYXRvcigpCi0JCQkJCQkJLmxvZ1dhcm5pbmcoCi0JCQkJCQkJCQlOTFMKLQkJCQkJCQkJCQkJLmJpbmQoCi0JCQkJCQkJCQkJCQkJUHVibGlzaGluZ1Jlc291cmNlcy5taXNzaW5nSWNvbkZpbGVXYXJuaW5nX21zZywKLQkJCQkJCQkJCQkJCQlpY29uRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCQkJCX0KLQkJCX0KLQotCQkJY29weU5vZGVJY29uKGljb25GaWxlKTsKLQkJCWljb25OYW1lID0gaWNvbkZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJaWYgKGljb25OYW1lID09IG51bGwgfHwgaWNvbk5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJU3RyaW5nIG5hbWU7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCW5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQluYW1lID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkubG9nV2FybmluZygKLQkJCQkJTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5taXNzaW5nSWNvbk5hbWVXYXJuaW5nX21zZywKLQkJCQkJCQluYW1lKSk7Ci0JCX0KLQotCQlyZXR1cm4gaWNvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheSBuYW1lIGZvciBhIG1ldGhvZCBlbGVtZW50IG9yIGl0ZXJtIHByb3ZpZGVyIGFkYXB0ZXIuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBvciBpdGVybSBwcm92aWRlciBhZGFwdGVyCi0JICogQHJldHVybiB0aGUgZGlzcGxheSBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0KLQkJCS8vIGNhbGN1bGF0ZSB0aGUgcHJlc2VudGF0aW9uIG5hbWUsIGZvciBleHRlbmRlcnMsIGdldCBmcm9tIGJhc2UgaWYKLQkJCS8vIG5lZWRlZAotCQkJbmFtZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0UHJlc2VudGF0aW9uTmFtZShlLCBjb25maWcpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5hbWUgPSBlLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWludCBpbmRleCA9IG5hbWUubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpbmRleCA+PSAwKSB7Ci0JCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCQlpZiAobmFtZS5lbmRzV2l0aCgiSW1wbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gNCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSXRlbVByb3ZpZGVyQWRhcHRlcikgewotCQkJSXRlbVByb3ZpZGVyQWRhcHRlciBwcm92aWRlciA9IChJdGVtUHJvdmlkZXJBZGFwdGVyKSBvYmo7Ci0JCQluYW1lID0gcHJvdmlkZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEdVSUQgZm9yIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIEdVSUQgZm9yIGEgbWV0aG9kIGVsZW1lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRHVUlEKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0R3VpZCgpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhyIFVSTCBmb3IgYSBtZXRob2QgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgVVJMIGZvciBhIG1ldGhvZCBlbGVtZW50IG9yIGEgYmxhbmsgSFRNTAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVSTChPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0TGF5b3V0TWdyKCkuZ2V0TGF5b3V0KChNZXRob2RFbGVtZW50KSBvYmosIHRydWUpLmdldFVybCgpOwotCQl9IGVsc2UgewotCQkJLy8gRklYTUU6IGxheW91dCBuZWVkcyB0byBiZSBwcm92aWRlZCBmb3IgdW5jYXRlZ29yaXplZCBhbmQgY2F0ZWdvcnkKLQkJCS8vIG9iamVjdAotCQkJcmV0dXJuICJhcHBsZXQvL2VtcHR5Lmh0bSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBib29rbWFyayBmb3IgYSBtZXRob2QgZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIDxjb2RlPkJvb2ttYXJrPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBCb29rbWFyayBjcmVhdGVCb29rbWFyayhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIHB1Ymxpc2ggdGhpcyBlbGVtZW50Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJLy8gZGVsYXkgdGhlIHB1Ymxpc2hpbmcgdGlsbCB0aGUgYm9va21hcmtzIGFyZSBjcmVhdGVkLgotCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKS5hZGRSZWZlcmVuY2VkRWxlbWVudChudWxsLAotCQkJCQkoTWV0aG9kRWxlbWVudCkgZWxlbWVudCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBib29rbWFyayBmb3IgdGhpcyBlbGVtZW50Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZShlbGVtZW50KTsKLQkJU3RyaW5nIGd1aWQgPSBnZXRHVUlEKGVsZW1lbnQpOwotCQlTdHJpbmcgdXJsID0gZ2V0VVJMKGVsZW1lbnQpOwotCQlTdHJpbmcgbm9kZUljb24gPSBnZXROb2RlSWNvbk5hbWUoZWxlbWVudCk7Ci0KLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKFB1Ymxpc2hpbmdSZXNvdXJjZXMuZ2VuZXJhdGluZ0Jvb2ttYXJrVGFza19uYW1lLAotCQkJCW5hbWUpOwotCQltb25pdG9yLnN1YlRhc2sobXNnKTsKLQkJcmV0dXJuIGNyZWF0ZUJvb2ttYXJrKG5hbWUsIGd1aWQsIHVybCwgbm9kZUljb24sIG5vZGVJY29uLCBlbGVtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9va21hcmsgY3JlYXRlQm9va21hcmsoU3RyaW5nIG5hbWUsIFN0cmluZyBndWlkLCBTdHJpbmcgdXJsLAotCQkJU3RyaW5nIGNsb3NlSWNvbiwgU3RyaW5nIG9wZW5JY29uLCBPYmplY3Qgb3duZXIpIHsKLQotCQlCb29rbWFyayBiID0gbmV3IEJvb2ttYXJrKG5hbWUpOwotCQliLnNldFByZXNlbnRhdGlvbk5hbWUobmFtZSk7Ci0JCWIuc2V0VW5pcXVlSWQoZ3VpZCk7Ci0JCWIuc2V0Q2xvc2VkSWNvbk5hbWUoY2xvc2VJY29uKTsKLQkJYi5zZXRPcGVuSWNvbk5hbWUob3Blbkljb24pOwotCQliLnNldEZpbGVOYW1lKHVybCk7Ci0JCWIuc2V0RnJvbUNvbnRlbnRMaWJyYXJ5KHRydWUpOwotCQliLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWIuc2V0RXhpc3QodHJ1ZSk7Ci0JCWIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJYi5zZXRUcmFuc3BhcmVuY3koZmFsc2UpOwotCQliLnNldERlZmF1bHQodHJ1ZSk7Ci0JCWIuc2V0Q3VycmVudChmYWxzZSk7Ci0JCWIuc2V0T3duZXIob3duZXIpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWZhdWx0IHZpZXcuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPkJvb2ttYXJrPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgZGVmYXVsdCB2aWV3Ci0JICovCi0JcHVibGljIEJvb2ttYXJrIGdldERlZmF1bHRWaWV3KCkgewotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIHRoZSB2aWV3cyBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgYm9va21hcmsgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgPGNvZGU+Qm9va21hcms8L2NvZGU+Ci0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3Q8Qm9va21hcms+IGJ1aWxkVmlld3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJY29uZmlnID0gbnVsbDsKLQkJaWYgKCBydW5uYWJsZSAhPSBudWxsICkgewotCQkJcnVubmFibGUuZGlzcG9zZSgpOwotCQkJcnVubmFibGUgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoIHNpdGVHZW5lcmF0b3IgIT0gbnVsbCApIHsKLQkJCXNpdGVHZW5lcmF0b3IuZGlzcG9zZSgpOwotCQkJc2l0ZUdlbmVyYXRvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uVmlld0J1aWxkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Db25maWd1cmF0aW9uVmlld0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDViM2VjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5EZWJ1Z1RyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuVGltZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnByb2Nlc3MuSUJTSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5Qcm9jZXNzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuU3VwcHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5JRWxlbWVudExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWN0aXZpdHlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLlByb2Nlc3NFbGVtZW50SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuUHJvY2Vzc0xheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LmVsZW1lbnRzLlN1bW1hcnlQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5QdWJsaXNoaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogQnVpbGRzIHRoZSB2aWV3cyBkZWZpbmVkIGZvciBhIG1ldGhvZCBjb25maWd1cmF0aW9uLgotICogCi0gKiBAYXV0aG9yIFNoaWxwYSBUb3Jhc2thcgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXdCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RWaWV3QnVpbGRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1JlZmVyZW5jZV9Xb3JrZmxvd3MgPSAiUmVmZXJlbmNlX1dvcmtmbG93cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfVGFza3MgPSAiVGFza3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX1Jlc3BvbnNpYmxlRm9yX1Rhc2tzID0gIlByaW1hcmlseV9QZXJmb3JtcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfUGFydGljaXBhdGVzSW5fVGFza3MgPSAiQWRkaXRpb25hbGx5X1BlcmZvcm1zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9QZXJmb3JtaW5nX1JvbGVzID0gIlBlcmZvcm1pbmdfUm9sZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9JbnB1dF9Xb3JrX1Byb2R1Y3RzID0gIklucHV0X1dvcmtfUHJvZHVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX091dHB1dF9Xb3JrX1Byb2R1Y3RzID0gIk91dHB1dF9Xb3JrX1Byb2R1Y3RzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9Xb3JrX1Byb2R1Y3RzX0NyZWF0ZWQgPSAiUmVzcG9uc2libGVfRm9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9Xb3JrX1Byb2R1Y3RzX01vZGlmaWVkID0gIk1vZGlmaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9SZXNwb25zaWJsZV9Sb2xlID0gIlJlc3BvbnNpYmxlX1JvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0ID0gIkNvbnRhaW5pbmdfV29ya19Qcm9kdWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9Db250YWluZWRfV29ya19Qcm9kdWN0cyA9ICJDb250YWluZWRfV29ya19Qcm9kdWN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfR3VpZGFuY2VzID0gIkd1aWRhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9JbnB1dFRvX1Rhc2sgPSAiSW5wdXRfdG8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX091dHB1dE9mX1Rhc2sgPSAiT3V0cHV0X2Zyb20iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9GT0xERVIgPSBEZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMKLQkJCS5nZXRJY29uTmFtZSgiZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1JlZmVyZW5jZV9Xb3JrZmxvd3MgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLnJlZmVyZW5jZVdvcmtmbG93c05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfVGFza3MgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLnRhc2tOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1Jlc3BvbnNpYmxlRm9yX1Rhc2tzID0gUHVibGlzaGluZ1Jlc291cmNlcy5wcmltYXJpbHlQZXJmb3Jtc05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUGFydGljaXBhdGVzSW5fVGFza3MgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmFkZGl0aW9uYWxseVBlcmZvcm1zTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9QZXJmb3JtaW5nX1JvbGVzID0gUHVibGlzaGluZ1Jlc291cmNlcy5wZXJmb3JtaW5nUm9sZXNOb2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX0lucHV0X1dvcmtfUHJvZHVjdHMgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmlucHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9PdXRwdXRfV29ya19Qcm9kdWN0cyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMub3V0cHV0V29ya1Byb2R1Y3RzTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9Xb3JrX1Byb2R1Y3RzX0NyZWF0ZWQgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLnJlc3BvbnNpYmxlRm9yTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9Xb3JrX1Byb2R1Y3RzX01vZGlmaWVkID0gUHVibGlzaGluZ1Jlc291cmNlcy5tb2RpZmllc05vZGVfdGV4dDsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUmVzcG9uc2libGVfUm9sZSA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMucmVzcG9uc2libGVSb2xlTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9Db250YWluaW5nX1dvcmtfUHJvZHVjdCA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuY29udGFpbmluZ1dvcmtQcm9kdWN0Tm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9Db250YWluZWRfV29ya19Qcm9kdWN0cyA9IFB1Ymxpc2hpbmdSZXNvdXJjZXMuY29udGFpbmVkV29ya1Byb2R1Y3RzTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9HdWlkYW5jZXMgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmd1aWRhbmNlTm9kZV90ZXh0OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9JbnB1dFRvX1Rhc2sgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLmlucHV0VG9Ob2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX091dHB1dE9mX1Rhc2sgPSBQdWJsaXNoaW5nUmVzb3VyY2VzLm91dHB1dEZyb21Ob2RlX3RleHQ7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTX0xBWU9VVF9EQVRBX0ZJTEUgPSAiL3NjcmlwdHMvcHJvY2Vzc0VsZW1lbnREYXRhLmpzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MgPSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3M7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZGVidWcgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKQotCQkJLmlzRGVidWdnaW5nKCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdDxCb29rbWFyaz4gYm9va21hcmtzID0gbmV3IEFycmF5TGlzdDxCb29rbWFyaz4oKTsKLQotCXByb3RlY3RlZCBBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBudWxsOwotCi0JcHJvdGVjdGVkIEVPYmplY3RDb21wYXJhdG9yIG5hbWVDb21wYXJhdG9yID0gbmV3IEVPYmplY3RDb21wYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uVmlld0J1aWxkZXIoSVNpdGVHZW5lcmF0b3Igc2l0ZUdlbmVyYXRvcikgewotCQlzdXBlcihzaXRlR2VuZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgdmlld3MgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcHVibGlzaCB0aGUgcmVsYXRlZAotCSAqIGNvbnRlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHJldHVybiBMaXN0IGEgbGlzdCBvZiBCb29rbWFya3MgZm9yIHRoZSB2aWV3cwotCSAqLwotCXB1YmxpYyBMaXN0PEJvb2ttYXJrPiBidWlsZFZpZXdzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbGRpbmcgdmlld3MuLi4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxvbmcgc3RhcnRUaW1lID0gMEw7Ci0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7Ci0JCQkKLS8vIGFscmVhZHkgZG9uZSBpbiBQdWJsaXNoTWFuYWdlcgotLy8JCQkvLyBmaXJzdCBvZiBhbGwsIHdlIG5lZWQgdG8gbG9hZCB0aGUgbGlicmFyeSwKLS8vCQkJLy8gb3RoZXJ3aXNlLCBzb21lIHJlbGF0aW9uc2hpcHMgYW5kIG9wcG9zaXRlIGZlYXR1cmVzIGFyZSBub3QKLS8vCQkJLy8gZXN0YWJsaXNoZWQKLS8vCQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMubG9hZExpYnJhcnlUYXNrX25hbWUpOwotLy8JCQlpZiAocHJvZmlsaW5nKSB7Ci0vLwkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLS8vCQkJfQotLy8JCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKChNZXRob2RMaWJyYXJ5KSBjb25maWcuZUNvbnRhaW5lcigpKTsKLS8vCQkJaWYgKHByb2ZpbGluZykgewotLy8JCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiYnVpbGRWaWV3cyIsICJMaWJyYXJ5VXRpbC5sb2FkQWxsOiAiIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLS8vCQkJCQkJCQkrIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkKLS8vCQkJCQkJCQkrICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBhIGZpbHRlciB0aGF0IGRvZXMgbm90IGRpc2NhcmQgdGhlIGNvbnRyaWJ1dG9ycy4KLQkJCS8vIHNvIHdlIGdldCB0aGUgY29udHJpYnV0b3JzIGluIHRvIHNob3cgaW4gdGhlIG5hdmlnYXRpb24gdHJlZQotCQkJSUZpbHRlciBjb25maWdGaWx0ZXIgPSBuZXcgQ29uZmlndXJhdGlvbkZpbHRlcihjb25maWcsIGZhbHNlKTsKLQkJCWFkYXB0ZXJGYWN0b3J5ID0gVG5nQWRhcHRlckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJLmdldENvbmZpZ3VyYXRpb25WaWV3X0FkYXB0ZXJGYWN0b3J5KGNvbmZpZ0ZpbHRlcik7Ci0KLQkJCWlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5pc1B1Ymxpc2hQcm9jZXNzKCkpIHsKLQkJCQltYWtlUHJvY2Vzc0Nsb3N1cmUoKTsKLQkJCX0KLQotCQkJLy8gcHVibGlzaCBhbGwgdGhlIHZpZXdzIGluIHRoZSBjb25maWd1cmF0aW9uCi0JCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCQlMaXN0IHZpZXdzID0gTGlicmFyeVV0aWwuZ2V0VmFsaWRWaWV3cyhjb25maWcpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHZpZXdzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJQ29udGVudENhdGVnb3J5IHYgPSAoQ29udGVudENhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFDb25maWd1cmF0aW9uSGVscGVyLmNhblNob3codiwgY29uZmlnKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgZWxlbWVudCA9IExpYnJhcnlVdGlsLnVud3JhcCh2KTsKLQkJCQlCb29rbWFyayBiID0gY3JlYXRlQm9va21hcmsodGhpcy5tb25pdG9yLCBlbGVtZW50KTsKLQotCQkJCWlmICh2ID09IGNvbmZpZy5nZXREZWZhdWx0VmlldygpKSB7Ci0JCQkJCXN1cGVyLmRlZmF1bHRWaWV3ID0gYjsKLQkJCQl9Ci0KLQkJCQkvLyBpdGVyYXRlIHRocnUgY29uZmlndXJhdGlvbiB0byBidWlsZCB0aGUgdmlldwotCQkJCWl0ZXJhdGUodiwgYik7Ci0JCQkJaWYgKGIuZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotCQkJCQlib29rbWFya3MuYWRkKGIpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwcm9maWxpbmcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRpbWUgdGFrZW4gdG8gcHVibGlzaCBib29rbWFya3M6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb2ZpbGluZykgewotCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcHVibGlzaFJlZmVyZW5jZUVsZW1lbnRzKCk7Ci0JCWlmIChwcm9maWxpbmcpIHsKLQkJCURlYnVnVHJhY2UucHJpbnQodGhpcywgInB1Ymxpc2hSZWZlcmVuY2VFbGVtZW50cyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gY29weUljb25zRm9yTm9uQXBwbGV0KCk7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHNhdmUgcHVibGlzaGVkIGVsZW1lbnQgdXJscwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlzYXZlRWxlbWVudFVybHMoKTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAic2F2ZUVsZW1lbnRVcmxzIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzdGFydFRpbWUpICsgIiBtcyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gYm9va21hcmtzOwotCX0KLQotCS8qKgotCSAqIFRoZSBwcm9jZXNzIGVsZW1lbnQgY2xvc3VyZSBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93czoKLQkgKiA8cD4KLQkgKiAxLiBwdWJsaXNoIHRoZSBzZWxlY3RlZCBwcm9jZXNzc2VzLCB3aGljaCBicmluZ3MgaW4gYWxsIHRoZSByZWxhdGVkCi0JICogcHJvY2VzcyBlbGVtZW50cwotCSAqIDxwPgotCSAqIDIuIHB1Ymxpc2ggYWxsIHRoZSByZWZlcmVuY2VkIHByb2Nlc3MgZWxlbWVudHMgZnJvbSBzdGVwIDEsIHRoaXMgYnJpbmdzCi0JICogaW4gYWxsIHRoZSBkaXJlY3RseSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudHMuIG1ha2UgYSBmaXJzdCBsZXZlbAotCSAqIGNsb3N1cmUgdG8gaW5jbHVkZSB0aGUgcHVibGlzaGVkIGVsZW1lbnRzIGFuZCB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cy4KLQkgKiBBbnkgZGlyZWN0IHJlZmVyZW5jZXMgdG8gYW55IHR5cGUgb2YgZ3VpZGFuY2VzIGFyZSBhbHNvIGluIHRoaXMgY2xvc3VyZS4KLQkgKiA8cD4KLQkgKiAzLiBwdWJsaXNoIGFsbCB0aGUgcmVmZXJlbmVkIG5vbi1Db250ZW50Q2F0ZWdvcnkgY29udGVudCBlbGVtZW50cyBmcm9tCi0JICogc3RlcCAyLiBiYXNlZCBvbiB0aGUgZmlyc3QgbGV2ZWwgY2xvc3VyZS4gVGhlIHB1cnBvc2Ugb2YgdGhlIGZpcnN0IGxldmVsCi0JICogY2xvc3VyZSBpcyB0byBhbGxvdyBicmluZyBpbiBndWlkYW5jZXMgd2l0aCB2YWxpZCBlbGVtZW50IGxpbmsgYW5kIGFueQotCSAqIG90aGVyIHJlZmVyZW5jZXMgc3VjaCBhcyBhIFRhc2sgb3IgUm9sZSwgYmVpbmcgbGlua2VkIHdpdGggYSBtaXNzaW5nCi0JICogZWxlbWVudCBsaW5rLiBUaGlzIGFnYWluIGJyaW5ncyBpbiBhbGwgdGhlIGRpcmVjdCByZWZlcmVuY2VzCi0JICogPHA+Ci0JICogNC5NYWtlIHRoZSBmaW5hbCBjbG9zdXJlIGJ5IGluY2x1ZGluZyB0aGUgZm9sbG93aW5nIGVsZW1lbnRzOgotCSAqIDxwPgotCSAqIGEuIGFsbCBwdWJsaXNoZWQgZWxlbWVudHMgZnJvbSBzdGVwIDEsMiwzLgotCSAqIDxwPgotCSAqIGIuIGFsbCByZWZlcmVuY2VkIEd1aWRhbmNlcyBmcm9tIHN0ZXAgMwotCSAqIDxwPgotCSAqIGMuIGFsbCBHdWlkYW5jZXMgb2YgdHlwZSBQcmFjdGljZSwgUm9hZE1hcCwgU3Vwb3J0aW5nIE1hdGVyaWFsLCBhbmQgVGVybQotCSAqIERlZmluaXRpb24sIGluIHRoZSBjb25maWd1cmF0aW9uCi0JICogPHA+Ci0JICogZC4gYWxsIENvbnRlbnQgQ2F0ZWdvcmllcyB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IG9mIHR5cGUgYSwKLQkgKiBiLCBvciBjLiBhbmQgdGhlaXIgcGFyZW50IGNhdGVnb3JpZXMKLQkgKiA8cD4KLQkgKiBUaGUgc2VsZWN0ZWQgdmlldyBpcyBwdWJsaXNoZWQgYmFzZWQgb24gdGhlIGVsZW1lbnQgY2xvc3VyZSBkZWZpbmVkCi0JICogYWJvdmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1ha2VQcm9jZXNzQ2xvc3VyZSgpIHsKLQkJbW9uaXRvci5zdWJUYXNrKFB1Ymxpc2hpbmdSZXNvdXJjZXMuYnVpbGRpbmdQcm9jZXNzQ2xvc3VyZVRhc2tfbmFtZSk7Ci0KLQkJLy8gcHVibGlzaCB0aGUgc2VsZWN0ZWQgcHJvY2Vzc2VzCi0JCS8vIG5lZWQgdG8gYnVpbGQgYSBjbG9zdXJlIG9mIGFsbCB0aGUgZWxlbWVudHMgaW52b2x2ZWQgaW4gdGhlCi0JCS8vIHByb2Nlc3NlcwotCQlMaXN0PFByb2Nlc3M+IHByb2Nlc3NlcyA9IG9wdGlvbnMuZ2V0UHJvY2Vzc2VzKCk7Ci0JCWlmIChwcm9jZXNzZXMgIT0gbnVsbCAmJiBwcm9jZXNzZXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvcjxQcm9jZXNzPiBpdCA9IHByb2Nlc3Nlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJbWFrZVByb2Nlc3NDbG9zdXJlKGl0Lm5leHQoKSk7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBtYWtlIHRoZSBmaXJzdCBsZXZlbCBjbG9zdXJlIHRvIGluY2x1ZGUgYWxsIHRoZSBwcm9jZXNzIGVsZW1lbnRzIGFuZAotCQkvLyBpdCdzIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkJLy8gYW55IHRoaW5nIGV4Y2VwdCBHdWlkYW5jZXMgYW5kIENvbnRlbnRDYXRlZ29yaWVzIG91dHNpZGUgdGhlIGNsb3N1cmUKLQkJLy8gaXMgZmlsdGVyZWQKLQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkuYWRkQ2xvc3VyZUVsZW1lbnRzKGdldFZhbGlkYXRvcigpLmdldFB1Ymxpc2hlZEVsZW1lbnRzKCkpOwotCQlnZXRWYWxpZGF0b3IoKS5hZGRDbG9zdXJlRWxlbWVudHMoCi0JCQkJZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkpOwotCi0JCS8vIG5vdyBwdWJsaXNoIGFsbCByZWZlcmVuY2VkIGVsZW1lbnRzLCBhbnkgZGlyZWN0IHJlZmVyZW5jZXMgaW4gdGhlCi0JCS8vIHByb2Nlc3MgZWxlbWVudHMgYXJlCi0JCS8vIHBhcnQgb2YgdGhlIGNsb3N1cmUKLQkJLy8gZG9uJ3QgcHVibGlzaCBjb250ZW50IGNhdGVnb3JpZXMgZm9yIG5vdyBzaW5jZSB0aGV5IG1pZ2h0IGJlIGVtcHR5Ci0JCS8vIGFuZCBkaXNjYXJkZWQgbGF0ZXIKLQkJTGlzdCByZWZzID0gbmV3IEFycmF5TGlzdChnZXRWYWxpZGF0b3IoKS5nZXRSZWZlcmVuY2VkRWxlbWVudHMoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9IChNZXRob2RFbGVtZW50KSBpdC5uZXh0KCk7Ci0JCQlpZiAoIShlIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSkgewotCQkJCXN1cGVyLnB1Ymxpc2gobW9uaXRvciwgZSk7Ci0KLQkJCQkvLyBjb2xsZWN0IHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGluZm8gd2l0aCBzdXBwcmVzc2lvbiBzdGF0dXMKLQkJCQkvLyB0aGlzIHdpbGwgaW5jbGR1ZSB0aGUgZGlhZ3JhbXMgYW5kIHRoZSBzdXByZXNzaW9uIHN0YXRlcyBvZgotCQkJCS8vIGVhY2ggaXRlbSB1bmRlciB0aGUgY3VycmVudCBwcm9jZWUKLQkJCQlpZiAoTGlicmFyeVV0aWwuaXNQcm9jZXNzKGUpKSB7Ci0JCQkJCXB1Ymxpc2hQcm9jZXNzTGF5b3V0KChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGUpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJLy8gbm93LCBhbnkgcmVmZXJlbmNlZCBndWlkYW5jZSBzaG91bGQgYmUgaW4gdGhlIGNsb3N1cmUsCi0JCS8vIHNvIGluY2x1ZGUgdGhlbSBhbmQgbWFrZSB0aGUgZmluYWwgY2xvc3VyZQotCQlyZWZzLmNsZWFyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRWYWxpZGF0b3IoKS5nZXRSZWZlcmVuY2VkRWxlbWVudHMoKS5pdGVyYXRvcigpOyBpdAotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNZXRob2RFbGVtZW50IGUgPSAoTWV0aG9kRWxlbWVudCkgaXQubmV4dCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCXJlZnMuYWRkKGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlZnMuc2l6ZSgpID4gMCkgewotCQkJZ2V0VmFsaWRhdG9yKCkuYWRkQ2xvc3VyZUVsZW1lbnRzKHJlZnMpOwotCQl9Ci0KLQkJLy8gbm93IGFsbCB0aGUgcHVibGlzaGVkIGVsZW1lbnRzIGFyZSB0aGUgZWxlbWVudCBjbG9zdXJlLCBtYWtlIHRoZQotCQkvLyBmaW5hbCBjbG9zdXJlCi0JCWdldFZhbGlkYXRvcigpLm1ha2VFbGVtZW50Q2xvc3VyZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlUHJvY2Vzc0Nsb3N1cmUob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MpIHsKLQotCQlpZiAocHJvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5jYW5TaG93KHByb2MsIGNvbmZpZykpIHsKLQkJCUFjdGl2aXR5TGF5b3V0IGwgPSBuZXcgQWN0aXZpdHlMYXlvdXQoKTsKLQkJCWwuaW5pdChnZXRMYXlvdXRNZ3IoKSwgcHJvYywgcHJvYywgbnVsbCk7Ci0JCQlsLmZpbmRBbGxMaW5rZWRFbGVtZW50cygpOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0V4dGVuZGVyKHByb2MpKSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgYmFzZVByb2MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSBwcm9jCi0JCQkJCS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pbkNvbmZpZyhiYXNlUHJvYywgY29uZmlnKSkgewotCQkJCW1ha2VQcm9jZXNzQ2xvc3VyZShiYXNlUHJvYyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoUmVmZXJlbmNlRWxlbWVudHMoKSB7Ci0JCS8vIG5vdyBwcm9jZXNzIHRoZSByZWZlcmVuY2VkIGVsZW1lbnRzIGFuZCBwdWJsaXNoIHRoZSBjb250ZW50cwotCQl3aGlsZSAoZ2V0VmFsaWRhdG9yKCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnRzKCkuc2l6ZSgpID4gMCkgewotCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpIGdldFZhbGlkYXRvcigpCi0JCQkJCS5nZXRSZWZlcmVuY2VkRWxlbWVudHMoKS5yZW1vdmUoMCk7Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyByZWZlcmVuY2VzIHRvIG1ldGhvZCBwbHVnaW5zIGFuZCBtZXRob2QgcGFja2FnZXMgY2FuIGJlCi0JCQkJLy8gaWdub3JlZAotCQkJCWlmIChlIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJCQlzdXBlci5wdWJsaXNoKG1vbml0b3IsIGUpOwotCi0JCQkJLy8gY29sbGVjdCBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBpbmZvIHdpdGggc3VwcHJlc3Npb24gc3RhdHVzCi0JCQkJLy8gdGhpcyB3aWxsIGluY2xkdWUgdGhlIGRpYWdyYW1zIGFuZCB0aGUgc3VwcmVzc2lvbiBzdGF0ZXMgb2YKLQkJCQkvLyBlYWNoIGl0ZW0gdW5kZXIgdGhlIGN1cnJlbnQgcHJvY2VlCi0JCQkJaWYgKExpYnJhcnlVdGlsLmlzUHJvY2VzcyhlKSkgewotCQkJCQkvLyBsb25nIHN0YXJ0VGltZTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJcHVibGlzaFByb2Nlc3NMYXlvdXQoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZSk7Ci0JCQkJCS8vIGxvbmcgZW5kVGltZTEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJQdWJsaXNoZWQgcHJvY2VzcyAiICsgZS5nZXROYW1lKCkgKwotCQkJCQkvLyAiOiAiICsgKGVuZFRpbWUxIC0gc3RhcnRUaW1lMSkgKyAiIG1zIik7Ci0JCQkJfQotCi0JCQkJbG9uZyBlbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJbG9uZyB0aW1lVGFrZW4gPSBlbmRUaW1lIC0gc3RhcnRUaW1lOwotCQkJCWlmICh0aW1lVGFrZW4gPj0gNTAwMCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlB1Ymxpc2hlZCAiICsgZS5nZXROYW1lKCkgKyAiOiAiIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCSsgdGltZVRha2VuICsgIiBtcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlnZXRWYWxpZGF0b3IoKS5sb2dFcnJvcihlLCAiRXJyb3IgcHVibGlzaGluZyBlbGVtZW50IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHVibGlzaFByb2Nlc3NMYXlvdXQoZmluYWwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIGUpIHsKLQotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlBY3Rpdml0eUxheW91dCBsYXlvdXQgPSBuZXcgQWN0aXZpdHlMYXlvdXQoKTsKLQkJCQkJbGF5b3V0LmluaXQoZ2V0TGF5b3V0TWdyKCksCi0JCQkJCQkJKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZSwgbnVsbCwgbnVsbCk7Ci0JCQkJCVByb2Nlc3NMYXlvdXREYXRhIHBkID0gbmV3IFByb2Nlc3NMYXlvdXREYXRhKGUuZ2V0R3VpZCgpKTsKLQkJCQkJbGF5b3V0LmxvYWRMYXlvdXREYXRhKHBkLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJCQkJcHJpbnRMYXlvdXRTY3JpcHQocGQpOwotCQkJCQlwZC5jbGVhcigpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCQlnZXRWYWxpZGF0b3IoKQotCQkJCQkJCS5sb2dFcnJvcigKLQkJCQkJCQkJCWUsCi0JCQkJCQkJCQkiRXJyb3IgcHVibGlzaGluZyBwcm9jZXNzIHNwZWNpZmljIGxheW91dCBkYXRhIiwgZTEpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCi0JCQl9Ci0JCX07Ci0KLQkJVGltZXIgdGltZXIgPSBuZXcgVGltZXIoKTsKLQkJdHJ5IHsKLQotCQkJLy8gcnVuIHRoZSBwdWJsaXNoaW5nIGFuZCBjaGVjayB0aGUgdGltZSwgaWYgdGltZW91dCwgdGVybWluYXRlIGl0Ci0JCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQocnVubmFibGUpOwotCQkJdC5zdGFydCgpOwotCQkJdC5qb2luKFRJTUVPVVRfSU5URVJWQUwpOwotCQkJaWYgKHQuaXNBbGl2ZSgpKSB7Ci0JCQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZCB0byBkaWUgYW5kIGxvZyBhbiBlcnJvcgotCQkJCXRpbWVyLnN0b3AoKTsKLQkJCQlnZXRWYWxpZGF0b3IoKQotCQkJCQkJLmxvZ0luZm8oCi0JCQkJCQkJCWUsCi0JCQkJCQkJCSJwdWJsaXNoaW5nIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEgdGFrZXMgIiArIHRpbWVyLmdldFRpbWUoKSArICIgbWluaSBzZWNvbmRzIGFscmVhZHkgYW5kIGlzIHN0aWxsIG5vdCBkb25lIHlldCAuLi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdGltZXIuc3RhcnQoKTsKLQkJCQl0LmpvaW4oKTsKLQkJCX0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZTEpIHsKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdGltZXIuc3RvcCgpOwotCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJLmxvZ0luZm8oCi0JCQkJCQkJZSwKLQkJCQkJCQl0aW1lci5nZXRUb3RhbFRpbWUoKQotCQkJCQkJCQkJKyAiIG1pbmkgc2Vjb25kcyBwdWJsaXNoaW5nIHByb2Nlc3Mgc3BlY2lmaWMgbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRMYXlvdXRTY3JpcHQoUHJvY2Vzc0xheW91dERhdGEgZGF0YSkgewotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShnZXRMYXlvdXRNZ3IoKS5nZXRQdWJsaXNoRGlyKCksCi0JCQkJUFJPQ0VTU19MQVlPVVRfREFUQV9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQlQcmludFdyaXRlciBwdyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBjcmVhdGUgYSBzdHJlYW0gd2l0aCBhcHBlbmQgZW5hYmxlZAotCQkJRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUsIHRydWUpOwotCi0JCQkvLyBjcmVhdGUgYSB3cml0ZSB3aXRoIHV0Zi04IGVuY29kaW5nCi0JCQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvcywgInV0Zi04Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy8gY3JlYXRlIGEgcHJpbnQgd3JpdGVyIHdpdGggYXV0byBmbHVzaAotCQkJcHcgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyLCB0cnVlKTsKLQkJCWRhdGEucHJpbnQocHcpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IoInVuYWJsZSB0byBzYXZlIHByb2Nlc3MgbGF5b3V0IGRhdGEiLCBlKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAocHcgIT0gbnVsbCkgewotCQkJCXB3LmZsdXNoKCk7Ci0JCQkJcHcuY2xvc2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogSXRlcmF0ZSB0aHJ1IHR1ZWUKLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKE9iamVjdCBvYmosIEJvb2ttYXJrIHBhcmVudCkgewotCQl0cnkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBHZXQgdGhlIGFkYXB0ZXIgZnJvbSB0aGUgZmFjdG9yeS4KLQkJCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBvYmo7Ci0JCQl9IGVsc2UgewotCQkJCXRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQl9Ci0JCQotCQkJLy8gRWl0aGVyIGRlbGVnYXRlIHRoZSBjYWxsIG9yIHJldHVybiBub3RoaW5nLgotCQkJaWYgKHRyZWVJdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlDb2xsZWN0aW9uIGl0ZW1zID0gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCS8vIGNyZWF0ZSBib29rbWFyawotCQkJCQlPYmplY3QgaXRvck9iaiA9IGl0Lm5leHQoKTsKLQkJCQkJT2JqZWN0IGVsZW1lbnQgPSBMaWJyYXJ5VXRpbC51bndyYXAoaXRvck9iaik7Ci0KLQkJCQkJaWYgKChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCQkJCU1ldGhvZEVsZW1lbnQgbWUgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaWYgKENvbmZpZ3VyYXRpb25IZWxwZXIuY2FuU2hvdyhtZSwgY29uZmlnKSkgewotCQkJCQkJCQltZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIKLQkJCQkJCQkJCQkuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQobWUsCi0JCQkJCQkJCQkJCQlnZXRMYXlvdXRNZ3IoKQotCQkJCQkJCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCQkJCQlpZiAobWUgIT0gbnVsbCkgewotCQkJCQkJCQkJaWYgKG1lIGluc3RhbmNlb2YgVG9vbCkgewotCQkJCQkJCQkJCWJ1aWxkVG9vbFN1YlRyZWUoKFRvb2wpIG1lLCBwYXJlbnQpOwotCQkJCQkJCQkJfSBlbHNlIGlmIChtZSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQkJCQkJCQlidWlsZERpc2NpcGxpbmVTdWJUcmVlKChEaXNjaXBsaW5lKSBtZSwKLQkJCQkJCQkJCQkJCXBhcmVudCk7Ci0JCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCS8vIGVsc2UgaWYgKG1lIGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nCi0JCQkJCQkJCQkvLyB8fCBtZSBpbnN0YW5jZW9mIERvbWFpbiB8fCBtZSBpbnN0YW5jZW9mCi0JCQkJCQkJCQkvLyBXb3JrUHJvZHVjdFR5cGUKLQkJCQkJCQkJCS8vIHx8IG1lIGluc3RhbmNlb2YgUm9sZVNldEdyb3VwaW5nIHx8IG1lCi0JCQkJCQkJCQkvLyBpbnN0YW5jZW9mIFJvbGVTZXQgKQotCQkJCQkJCQkJZWxzZSBpZiAobWUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQotCQkJCQkJCQkJCUNvbnRlbnRDYXRlZ29yeSBjYyA9IChDb250ZW50Q2F0ZWdvcnkpIG1lOwotCi0JCQkJCQkJCQkJLy8gaWYgdGhlIGNvbnRlbnQgY2F0ZWdvcnkgaXMgZW1wdHksCi0JCQkJCQkJCQkJLy8gZG9uJ3QgYWRkIHRvIHRoZSBwYXJlbnQKLQkJCQkJCQkJCQlCb29rbWFyayBiID0gY3JlYXRlQm9va21hcmsoCi0JCQkJCQkJCQkJCQl0aGlzLm1vbml0b3IsIGNjKTsKLQkJCQkJCQkJCQlpdGVyYXRlKGl0b3JPYmosIGIpOwotCQkJCQkJCQkJCWlmIChvcHRpb25zLmlzUHVibGlzaEVtcHR5Q2F0ZWdvcmllcygpCi0JCQkJCQkJCQkJCQl8fCBiLmdldENoaWxkQ291bnQoKSA+IDApIHsKLQkJCQkJCQkJCQkJcGFyZW50LmFkZENoaWxkKGIpOwotCQkJCQkJCQkJCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShjYywgZmFsc2UpOwotCQkJCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCWRpc2NhcmRFbXB0eUNhdGVnb3J5KGNjLCB0cnVlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgUHJhY3RpY2VTdWJncm91cEl0ZW1Qcm92aWRlcikgewotCQkJCQkJCQkJCQlidWlsZFByYWN0aWNlU3ViZ3JvdXBUcmVlKG9iaiwgcGFyZW50LAotCQkJCQkJCQkJCQkJCShQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSBpdG9yT2JqKTsKLQkJCQkJCQkJCQl9IGVsc2UgewkJCQkJCQkJCQkKLQkJCQkJCQkJCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKG1lLCBwYXJlbnQpOwotCQkJCQkJCQkJCQlpZiAoIWJ1aWxkU3ViVHJlZShpdG9yT2JqLCBtZSwgYikpIHsKLQkJCQkJCQkJCQkJCWl0ZXJhdGUoaXRvck9iaiwgYik7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIkVycm9yIGJ1aWxkaW5nIG5hdmlnYXRpb24gdHJlZSBmb3IgIiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCQkJCS5sb2dFcnJvcihtZXNzYWdlLCBlKTsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKGl0b3JPYmogaW5zdGFuY2VvZiBQcmFjdGljZVN1Ymdyb3VwSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQkJYnVpbGRQcmFjdGljZVN1Ymdyb3VwVHJlZShvYmosIHBhcmVudCwgKFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIpIGl0b3JPYmopOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpdGVyYXRlKGl0b3JPYmosIHBhcmVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIkVycm9yIGJ1aWxkaW5nIG5hdmlnYXRpb24gdHJlZSI7IC8vJE5PTi1OTFMtMSQKLQkJCWdldEh0bWxCdWlsZGVyKCkuZ2V0VmFsaWRhdG9yKCkubG9nRXJyb3IobWVzc2FnZSwgZSk7Ci0KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgYSBib29rbWFyayB1bmRlciB0aGUgc3BlY2lmaWVkIHBhcmVudC4gSWYgbm8gcGFyZW50IGlzIHNwZWNpZmllZCwKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIHBhcmVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9va21hcmsgY3JlYXRlQm9va21hcmsoT2JqZWN0IGVsZW1lbnQsIEJvb2ttYXJrIHBhcmVudCkgewotCQlCb29rbWFyayBiID0gY3JlYXRlQm9va21hcmsodGhpcy5tb25pdG9yLCBlbGVtZW50KTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlib29rbWFya3MuYWRkKGIpOwotCQl9IGVsc2UgewotCQkJcGFyZW50LmFkZENoaWxkKGIpOwotCQl9Ci0KLQkJcmV0dXJuIGI7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgdGhlIHN1YiB0cmVlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMKLQkgKiBoYW5kbGVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBibQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBidWlsZFN1YlRyZWUoT2JqZWN0IG9iaiwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCWJ1aWxkVGFza1N1YlRyZWUoKFRhc2spIGVsZW1lbnQsIGJtKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sZSkgewotCQkJYnVpbGRSb2xlU3ViVHJlZSgoUm9sZSkgZWxlbWVudCwgYm0pOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkgewotCQkJYnVpbGRXb3JrUHJvZHVjdFN1YlRyZWUoKFdvcmtQcm9kdWN0KSBlbGVtZW50LCBibSk7Ci0JCX0gZWxzZSBpZiAoTGlicmFyeVV0aWwuaXNQcm9jZXNzKGVsZW1lbnQpKSB7Ci0JCQlidWlsZFByb2Nlc3NTdWJUcmVlKG9iaiwgKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgZWxlbWVudCwgYm0pOwotCQl9IGVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJOb3QgaGFuZGxlZDogIiArIGVsZW1lbnQpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSXRlbXMoTGlzdCBlbGVtZW50cywgQm9va21hcmsgYm0pIHsKLQkJYnVpbGRJdGVtcyhlbGVtZW50cywgYm0sIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRJdGVtcyhMaXN0IGVsZW1lbnRzLCBCb29rbWFyayBibSwgYm9vbGVhbiBidWlsZFN1YlRyZWUpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGl0Lm5leHQoKTsKLQotCQkJLy8gZmlsdGVyIGF3YXkgdGhlIGNvbnRhaW5tZW50IGNoaWxkLWVsZW1lbnQgaWYgYW55IG9mIHRoZSBwYXJlbnQocykKLQkJCS8vIGFyZSBpbiB0aGUgbGlzdAotCQkJLy8gMDAzODQ2MTkgLSBQdWJsaXNoZWQgc2l0ZTogRGlzcGxheSBvZiBXUHMgdW5kZXIgcmVzcG9uc2libGUgcm9sZQotCQkJLy8gaWYgdGhlIGNvbnRhaW5lciBvZiB0aGUgZWxlbWVudCBpcyBpbiB0aGUgbGlzdCwgaWdub3JlIGl0Ci0JCQlpZiAoQ29uZmlndXJhdGlvbkhlbHBlci5pc0NvbnRhaW5tZW50RWxlbWVudChlbGVtZW50KQotCQkJCQkmJiBDb25maWd1cmF0aW9uSGVscGVyLmlzQ29udGFpbmVySW5MaXN0KGVsZW1lbnQsIGVsZW1lbnRzLAotCQkJCQkJCWNvbmZpZykpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJYnVpbGRJdGVtKGVsZW1lbnQsIGJtLCBidWlsZFN1YlRyZWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCb29rbWFyayBidWlsZEl0ZW0oTWV0aG9kRWxlbWVudCBlbGVtZW50LCBCb29rbWFyayBwYXJlbnQsCi0JCQlib29sZWFuIGJ1aWxkU3ViVHJlZSkgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQm9va21hcmsgYiA9IG51bGw7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHNob3dhYmxlCi0JCU1ldGhvZEVsZW1lbnQgZSA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoZWxlbWVudCwKLQkJCQlnZXRMYXlvdXRNZ3IoKS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCWlmIChpc1Zpc2libGUoZSkpIHsKLQkJCWIgPSBjcmVhdGVCb29rbWFyayh0aGlzLm1vbml0b3IsIGUpOwotCQkJaWYgKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiBiOwotCQkJfQotCi0JCQlwYXJlbnQuYWRkQ2hpbGQoYik7Ci0KLQkJCWlmIChidWlsZFN1YlRyZWUpIHsKLQkJCQlpZiAoZSBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQkJCWJ1aWxkQ29udGFpbmVkQXJ0aWZhY3RzU3ViVHJlZSgoQXJ0aWZhY3QpIGUsIGIsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBiOwotCX0KLQotLy8JLyoqCi0vLwkgKiBjcmVhdGUgdGhlIGZvbGRlciBib29rbWFyayBhbmQgaXQncyBjaGlsZHJlbi4gZ2VuZXJhdGUgdGhlIGZvbGRlciBzdW1tYXJ5Ci0vLwkgKiBwYWdlCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBlbGVtZW50Ci0vLwkgKiBAcGFyYW0gYm0KLS8vCSAqIEBwYXJhbSBub2RlTmFtZQotLy8JICogQHBhcmFtIGl0ZW1zCi0vLwkgKi8KLS8vCi0vLwlwcml2YXRlIEJvb2ttYXJrIGNyZWF0ZUZvbGRlckJvb2ttYXJrKE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgQm9va21hcmsgYm0sCi0vLwkJCVN0cmluZyBub2RlTmFtZSwgTGlzdCBpdGVtcywgYm9vbGVhbiBjcmVhdGVDaGlsZHJlbikgewotLy8JCUJvb2ttYXJrIGIgPSBudWxsOwotLy8JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0vLwkJCUlFbGVtZW50TGF5b3V0IGwgPSBuZXcgU3VtbWFyeVBhZ2VMYXlvdXQoZ2V0SHRtbEJ1aWxkZXIoKQotLy8JCQkJCS5nZXRMYXlvdXRNYW5hZ2VyKCksIGVsZW1lbnQsIG5vZGVOYW1lLCBpdGVtcyk7Ci0vLwkJCVN0cmluZyB1cmwgPSBsLmdldFVybCgpOwotLy8JCQlnZXRIdG1sQnVpbGRlcigpLmdlbmVyYXRlSHRtbChsKTsKLS8vCQkJYiA9IGNyZWF0ZUJvb2ttYXJrKG5vZGVOYW1lLCBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCksIHVybCwKLS8vCQkJCQlJQ09OX0ZPTERFUiwgSUNPTl9GT0xERVIsIG51bGwpOwotLy8JCQlibS5hZGRDaGlsZChiKTsKLS8vCQkJaWYgKGNyZWF0ZUNoaWxkcmVuKSB7Ci0vLwkJCQlidWlsZEl0ZW1zKGl0ZW1zLCBiKTsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGI7Ci0vLwl9Ci0KLQlTZXQ8U3RyaW5nPiBzdW1tYXJ5UGFnZXNHZW5lcmF0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCi0JcHJpdmF0ZSBCb29rbWFyayBjcmVhdGVGb2xkZXJCb29rbWFyayhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEJvb2ttYXJrIGJtLAotCQkJU3RyaW5nIHByZWZpeE5hbWUsIFN0cmluZyBub2RlTmFtZSwgTGlzdCBpdGVtcywKLQkJCWJvb2xlYW4gY3JlYXRlQ2hpbGRyZW4pIHsKLQkJQm9va21hcmsgYiA9IG51bGw7Ci0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlJRWxlbWVudExheW91dCBsID0gbmV3IFN1bW1hcnlQYWdlTGF5b3V0KGdldEh0bWxCdWlsZGVyKCkKLQkJCQkJLmdldExheW91dE1hbmFnZXIoKSwgZWxlbWVudCwgcHJlZml4TmFtZSwgbm9kZU5hbWUsIGl0ZW1zKTsKLQkJCVN0cmluZyB1cmwgPSBsLmdldFVybCgpOwotCQkJCi0JCQkvLyBkb24ndCByZWdlbmVyYXRlIHRoZSBwYWdlCi0JCQkvLyAyMDA2MTkgLSBTdW1tYXJ5IHBhZ2UgaHRtbCB3YXMgZ2VuZXJhdGVkIG11bHRpcGxlIHRpbWVzIHdoZW4gcHVibGlzaGluZwotCQkJaWYgKCAhc3VtbWFyeVBhZ2VzR2VuZXJhdGVkLmNvbnRhaW5zKHVybCkgKSB7Ci0JCQkJZ2V0SHRtbEJ1aWxkZXIoKS5nZW5lcmF0ZUh0bWwobCk7Ci0JCQkJc3VtbWFyeVBhZ2VzR2VuZXJhdGVkLmFkZCh1cmwpOwotCQkJfQotCQkJCi0JCQliID0gY3JlYXRlQm9va21hcmsobm9kZU5hbWUsIEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSwgdXJsLAotCQkJCQlJQ09OX0ZPTERFUiwgSUNPTl9GT0xERVIsIG51bGwpOwotCQkJYm0uYWRkQ2hpbGQoYik7Ci0JCQlpZiAoY3JlYXRlQ2hpbGRyZW4pIHsKLQkJCQlidWlsZEl0ZW1zKGl0ZW1zLCBiKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBiOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQcmFjdGljZVN1Ymdyb3VwVHJlZShPYmplY3QgcHJvdmlkZXJQYXJlbnQsCi0JCQlCb29rbWFyayBwYXJlbnQsIFByYWN0aWNlU3ViZ3JvdXBJdGVtUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKG51bGwpOwotCQlMaXN0IGl0ZW1zID0gY2hpbGRyZW4gaW5zdGFuY2VvZiBMaXN0ID8gKExpc3QpIGNoaWxkcmVuCi0JCQkJOiBuZXcgQXJyYXlMaXN0KGNoaWxkcmVuKTsKLQotCQlpZiAoaXRlbXMgIT0gbnVsbCAmJiBpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlQcmFjdGljZSBwcmFjdGljZSA9IHByb3ZpZGVyLmdldFByYWN0aWNlKCk7Ci0JCQlpZiAocHJhY3RpY2UgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSUVsZW1lbnRMYXlvdXQgbCA9IG5ldyBTdW1tYXJ5UGFnZUxheW91dChnZXRIdG1sQnVpbGRlcigpCi0JCQkJCS5nZXRMYXlvdXRNYW5hZ2VyKCksIHByYWN0aWNlLCBwcm92aWRlci5nZXRUZXh0KG51bGwpLAotCQkJCQlwcm92aWRlci5nZXRUZXh0KG51bGwpLCBpdGVtcywgcHJvdmlkZXIuZ2V0VGV4dChudWxsKSk7Ci0JCQlTdHJpbmcgdXJsID0gbC5nZXRVcmwoKTsKLQotCQkJaWYgKCFzdW1tYXJ5UGFnZXNHZW5lcmF0ZWQuY29udGFpbnModXJsKSkgewotCQkJCWdldEh0bWxCdWlsZGVyKCkuZ2VuZXJhdGVIdG1sKGwpOwotCQkJCXN1bW1hcnlQYWdlc0dlbmVyYXRlZC5hZGQodXJsKTsKLQkJCX0KLQotCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKHByb3ZpZGVyLmdldFRleHQobnVsbCksIEVjb3JlVXRpbAotCQkJCQkuZ2VuZXJhdGVVVUlEKCksIHVybCwgSUNPTl9GT0xERVIsIElDT05fRk9MREVSLCBudWxsKTsKLQkJCXBhcmVudC5hZGRDaGlsZChiKTsKLQkJCXRoaXMuaXRlcmF0ZShwcm92aWRlciwgYik7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgQm9va21hcmsgYnVpbGREaXNjaXBsaW5lU3ViVHJlZShEaXNjaXBsaW5lIGVsZW1lbnQsIEJvb2ttYXJrIHBhcmVudCkgewotCQlTdHJpbmcgdXJsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJQm9va21hcmsgYjsKLQotCQkvLyBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcmVhbGl6ZWQgdmFsdWUgb2YgdGhlIGZlYXR1cmUKLQkJTGlzdCBpdGVtc193b3JrZmxvdyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpKTsKLQotCQkvLyBUYXNrcyBpbiBwdWJsaXNoZWQgc2l0ZSB1bmRlciBEaXNjaXBsaW5lcyBhcmUgaW4KLQkJLy8gcmFuZG9tIG9yZGVyCi0JCS8vIHVzZSB0aGUgYWRhcHRvciBmYWN0b3J5IHRvIGdldCB0aGUgY2hpbGRyZW5zCi0JCS8vIExpc3QgaXRlbXNfdGFzayA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCS8vIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfVGFza3MoKSwgY29uZmlnKTsKLQkJTGlzdCBpdGVtc190YXNrID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGl0ZW1fc3ViRGlzY2lwbGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHRyZWVJdGVtQ29udGVudFByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgYWRhcHRlckZhY3RvcnkKLQkJCQkuYWRhcHQoZWxlbWVudCwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLmNsYXNzKTsKLQkJaWYgKHRyZWVJdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihlbGVtZW50KTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCS8vIGNyZWF0ZSBib29rbWFyawotCQkJCU9iamVjdCBpdG9yT2JqID0gaXQubmV4dCgpOwotCQkJCU9iamVjdCBlID0gTGlicmFyeVV0aWwudW53cmFwKGl0b3JPYmopOwotCQkJCWlmICgoZSBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQkJCU1ldGhvZEVsZW1lbnQgdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQoCi0JCQkJCQkJKE1ldGhvZEVsZW1lbnQpIGUsIGdldExheW91dE1ncigpCi0JCQkJCQkJCQkuZ2V0RWxlbWVudFJlYWxpemVyKCkpOwotCQkJCQlpZiAodCAhPSBudWxsKSB7Ci0JCQkJCQlpdGVtc190YXNrLmFkZCh0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIERpc2NpcGxpbmUpIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBkID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCgKLQkJCQkJCQkoTWV0aG9kRWxlbWVudCkgZSwgZ2V0TGF5b3V0TWdyKCkKLQkJCQkJCQkJCS5nZXRFbGVtZW50UmVhbGl6ZXIoKSk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCWl0ZW1fc3ViRGlzY2lwbGllcy5hZGQoZCk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCUxpc3QgaXRlbXNfZ3VpZGFuY2UgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXNfZ3VpZGFuY2UuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zX2d1aWRhbmNlLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtc19ndWlkYW5jZS5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotCi0JCWlmICghb3B0aW9ucy5pc1B1Ymxpc2hFbXB0eUNhdGVnb3JpZXMoKQotCQkJCSYmIGl0ZW1zX3dvcmtmbG93LnNpemUoKSArIGl0ZW1zX3Rhc2suc2l6ZSgpCi0JCQkJCQkrIGl0ZW1zX2d1aWRhbmNlLnNpemUoKSArIGl0ZW1fc3ViRGlzY2lwbGllcy5zaXplKCkgPT0gMCkgewotCQkJLy8gZG8gbm90aGluZywgZG9uJ3Qgc2hvdyB0aGUgZm9sZGVyCi0JCQlkaXNjYXJkRW1wdHlDYXRlZ29yeShlbGVtZW50LCB0cnVlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgaXRlbSBib29rbWFyawotCQkvLyBkb24ndCBzZXQgdG8gdGhlIHBhcmVudCB5ZXQuIG1ha2Ugc3VyZSBpdCdzIG5vdCBlbXB0eQotCQkvLyBuZWVkIHRvIGNoZWNrIHRoZSBzdWItZGlzY2lwbGluZXMKLQkJLy8gMTUwOTg0IC0gUHVibGlzaGluZzogTmVzdGVkIGRpc2NpcGxpbmUgaXMgbm90IGRpc3BsYXkgaW4gdGhlIHB1Ymxpc2gKLQkJLy8gcGFnZQotCQkvLyBCb29rbWFyayBibSA9IGNyZWF0ZUJvb2ttYXJrKGVsZW1lbnQsIHBhcmVudCk7Ci0JCUJvb2ttYXJrIGJtID0gY3JlYXRlQm9va21hcmsodGhpcy5tb25pdG9yLCBlbGVtZW50KTsKLQotCQkvLyBzdWItZGlzY2lwbGluZXMgY29tZSBmaXJzdAotCQlpZiAoaXRlbV9zdWJEaXNjaXBsaWVzLnNpemUoKSA+IDApIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtX3N1YkRpc2NpcGxpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCURpc2NpcGxpbmUgZCA9IChEaXNjaXBsaW5lKSBpdC5uZXh0KCk7Ci0JCQkJYnVpbGREaXNjaXBsaW5lU3ViVHJlZShkLCBibSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCi0JCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zX3dvcmtmbG93LCBuYW1lQ29tcGFyYXRvcik7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zX3Rhc2ssIG5hbWVDb21wYXJhdG9yKTsKLQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXNfZ3VpZGFuY2UsIG5hbWVDb21wYXJhdG9yKTsKLQotCQkJYnVpbGRJdGVtcyhpdGVtc193b3JrZmxvdywgYm0pOwotCQkJYnVpbGRJdGVtcyhpdGVtc190YXNrLCBibSk7Ci0JCQlidWlsZEl0ZW1zKGl0ZW1zX2d1aWRhbmNlLCBibSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoaXRlbXNfd29ya2Zsb3cuc2l6ZSgpID4gMCkgewotCQkJCUJvb2ttYXJrIHdmRm9sZGVyID0gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sCi0JCQkJCQlQUkVGSVhfUmVmZXJlbmNlX1dvcmtmbG93cywgTk9ERV9SZWZlcmVuY2VfV29ya2Zsb3dzLAotCQkJCQkJaXRlbXNfd29ya2Zsb3csIGZhbHNlKTsKLQotCQkJCS8vIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gdHJlZWJyb3dzZXIgdW5kZXIKLQkJCQkvLyBkaXNjaXBsaW5lcy1yZWZlcmVuY2Ugd29ya2Zsb3dzIGNhbm5vdCBiZSBleHBhbmRlZAotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtc193b3JrZmxvdy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQkvLyAxNzk2MDkgLSBFeGNlcHRpb24gd2hlbiBhc3NpZ24gYWN0aXZpdHkgYXMgZGlzY2lwbGluZSdzCi0JCQkJCS8vIHJlZmVyZW5jZWQgd29ya2Zsb3cKLQkJCQkJLy8gdGhpcyBpcyBhIG1vZGVsIGNoYW5nZSwgcmVmZXJlbmNlZCB3b3JrZmxvdyBjYW4gYmUKLQkJCQkJLy8gQWN0aXZpdHksCi0JCQkJCS8vIG9sZCBtb2RlbCByZWZlcmVuY2VzIFByb2Nlc3MKLQkJCQkJQWN0aXZpdHkgYWN0ID0gKEFjdGl2aXR5KSBpdC5uZXh0KCk7Ci0JCQkJCUJvb2ttYXJrIGJtV29ya2Zsb3cgPSBidWlsZEl0ZW0oYWN0LCB3ZkZvbGRlciwgZmFsc2UpOwotCQkJCQlidWlsZEFjdGl2aXR5U3ViVHJlZShhY3QsIGFjdCwgYm1Xb3JrZmxvdyk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJaWYgKGl0ZW1zX3Rhc2suc2l6ZSgpID4gMCkgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfVGFza3MsIE5PREVfVGFza3MsCi0JCQkJCQlpdGVtc190YXNrLCB0cnVlKTsKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChpdGVtc19ndWlkYW5jZS5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9HdWlkYW5jZXMsCi0JCQkJCQlOT0RFX0d1aWRhbmNlcywgaXRlbXNfZ3VpZGFuY2UsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCkgfHwgYm0uZ2V0Q2hpbGRDb3VudCgpID4gMCkgewotCQkJcGFyZW50LmFkZENoaWxkKGJtKTsKLQkJCWRpc2NhcmRFbXB0eUNhdGVnb3J5KGVsZW1lbnQsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWRpc2NhcmRFbXB0eUNhdGVnb3J5KGVsZW1lbnQsIHRydWUpOwotCQl9Ci0KLQkJcmV0dXJuIGJtOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEFjdGl2aXR5U3ViVHJlZShPYmplY3Qgb2JqLCBBY3Rpdml0eSBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2MgPSBUbmdVdGlsLmdldE93bmluZ1Byb2Nlc3MoZWxlbWVudCk7Ci0JCVByb2Nlc3NFbGVtZW50SXRlbSBwcm9jSXRlbSA9IG5ldyBQcm9jZXNzRWxlbWVudEl0ZW0ob2JqLCBlbGVtZW50LAotCQkJCWVsZW1lbnQuZ2V0R3VpZCgpKTsKLQotCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5ID0gc3VwZXIuZ2V0TGF5b3V0TWdyKCkKLQkJCQkuZ2V0V0JTQWRhcHRlckZhY3RvcnkoKTsKLQkJU3VwcHJlc3Npb24gc3VwID0gbmV3IFN1cHByZXNzaW9uKHByb2MpOwotCQlpdGVyYXRlQWN0aXZpdHkocHJvY0l0ZW0sIGJtLCBhZGFwdGVyRmFjdG9yeSwgc3VwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUb29sU3ViVHJlZShUb29sIGVsZW1lbnQsIEJvb2ttYXJrIHBhcmVudCkgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VG9vbF9Ub29sTWVudG9ycygpKTsKLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoRW1wdHlDYXRlZ29yaWVzKCkgfHwgaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJQm9va21hcmsgYiA9IGNyZWF0ZUJvb2ttYXJrKGVsZW1lbnQsIHBhcmVudCk7Ci0JCQlidWlsZEl0ZW1zKGl0ZW1zLCBiKTsKLQkJCWRpc2NhcmRFbXB0eUNhdGVnb3J5KGVsZW1lbnQsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWRpc2NhcmRFbXB0eUNhdGVnb3J5KGVsZW1lbnQsIHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVGFza1N1YlRyZWUoVGFzayBlbGVtZW50LCBCb29rbWFyayBibSkgewotCi0JCVN0cmluZyB1cmw7Ci0JCUJvb2ttYXJrIGI7Ci0KLQkJTGlzdCBhbGxJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBwZXJmb3JtaW5nIHJvbGVzCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVJvbGUgciA9IChSb2xlKSBjYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19QZXJmb3JtZWRCeSgpKTsKLQkJaWYgKHIgIT0gbnVsbCkgewotCQkJaXRlbXMuYWRkKHIpOwotCQl9Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpKSk7Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfUGVyZm9ybWluZ19Sb2xlcywKLQkJCQkJCU5PREVfUGVyZm9ybWluZ19Sb2xlcywgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIW9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCS8vIGlucHV0IHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsCi0JCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSkpOwotCQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0VGFza19PcHRpb25hbElucHV0KCkpKTsKLQotCQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0lucHV0X1dvcmtfUHJvZHVjdHMsCi0JCQkJCQlOT0RFX0lucHV0X1dvcmtfUHJvZHVjdHMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gb3V0cHV0IHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza19PdXRwdXQoKSk7Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfT3V0cHV0X1dvcmtfUHJvZHVjdHMsCi0JCQkJCQlOT0RFX091dHB1dF9Xb3JrX1Byb2R1Y3RzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGFsbCBndWlkYW5jZXMKLQkJaXRlbXMuY2xlYXIoKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKSk7Ci0JCS8vIE9iamVjdCBlID0gY2FsYzAxRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCS8vIC5nZXRUYXNrX0VzdGltYXRlKCkpOwotCQkvLyBpZiAoZSAhPSBudWxsKSB7Ci0JCS8vIGl0ZW1zLmFkZChlKTsKLQkJLy8gfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tfVG9vbE1lbnRvcnMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQlhbGxJdGVtcy5hZGRBbGwoaXRlbXMpOwotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0d1aWRhbmNlcywKLQkJCQkJCU5PREVfR3VpZGFuY2VzLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAob3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJYnVpbGRJdGVtcyhhbGxJdGVtcywgYm0pOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSb2xlU3ViVHJlZShSb2xlIGVsZW1lbnQsIEJvb2ttYXJrIGJtKSB7Ci0JCVN0cmluZyB1cmw7Ci0JCUJvb2ttYXJrIGI7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IGFsbEl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIHRhc2tzLCAvLyBuZWVkIGEgZ2VuZXJhbCBvdmVydmlldyBwYWdlLCBUT0RPCi0JCS8vIExpc3QgaXRlbXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza3MoZWxlbWVudCk7Ci0JCUxpc3QgaXRlbXMgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3MpOwotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9SZXNwb25zaWJsZUZvcl9UYXNrcywKLQkJCQkJCU5PREVfUmVzcG9uc2libGVGb3JfVGFza3MsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBzZWNvbmRhcnkgdGFza3MKLQkJCWl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsCi0JCQkJCUFzc29jaWF0aW9uSGVscGVyLlJvbGVfU2Vjb25kYXJ5X1Rhc2tzKTsKLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9QYXJ0aWNpcGF0ZXNJbl9UYXNrcywKLQkJCQkJCU5PREVfUGFydGljaXBhdGVzSW5fVGFza3MsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gcmVzcG9uc2libGUgZm9yIHdvcmsgcHJvZHVjdHMsCi0JCWl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKSk7Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWIgPSBjcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwKLQkJCQkJCVBSRUZJWF9Xb3JrX1Byb2R1Y3RzX0NyZWF0ZWQsCi0JCQkJCQlOT0RFX1dvcmtfUHJvZHVjdHNfQ3JlYXRlZCwgaXRlbXMsIGZhbHNlKTsKLQkJCQlidWlsZEl0ZW1zKGl0ZW1zLCBiLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCFvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkvLyBtb2RpZmllcyB3b3JrIHByb2R1Y3RzLCBuZWVkIGEgc3VtbWFyeSBwYWdlLCBUT0RPCi0JCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCQkuZ2V0Um9sZV9Nb2RpZmllcygpKTsKLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJYiA9IGNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJCQkJUFJFRklYX1dvcmtfUHJvZHVjdHNfTW9kaWZpZWQsCi0JCQkJCQlOT0RFX1dvcmtfUHJvZHVjdHNfTW9kaWZpZWQsIGl0ZW1zLCBmYWxzZSk7Ci0JCQkJYnVpbGRJdGVtcyhpdGVtcywgYiwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIGFsbCBndWlkYW5jZXMKLQkJaXRlbXMuY2xlYXIoKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpKSk7Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfR3VpZGFuY2VzLCBOT0RFX0d1aWRhbmNlcywgaXRlbXMsIHRydWUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCS8vIGxpZ2h0IHdlaWdodCB0cmVlLCBubyBzdWIgZm9sZGVycwotCQkJYnVpbGRJdGVtcyhhbGxJdGVtcywgYm0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV29ya1Byb2R1Y3RTdWJUcmVlKFdvcmtQcm9kdWN0IGVsZW1lbnQsIEJvb2ttYXJrIGJtKSB7Ci0JCUxpc3QgaXRlbXM7Ci0JCVN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBCb29rbWFyayBiOwotCi0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBhbGxJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBwZXJmb3JtaW5nIHJvbGVzLCAwLjEgcmVmZXJlbmNlIGVsZW1lbnQgd2lsbCBiZSByZWFsaXplZCBpbiBidWlsZEl0ZW0KLQkJLy8gbXVsdGlwbGljaXR5IGNoYW5nZSBmb3Igb3Bwb3NpdGUgZmVhdHVyZXMKLQkJLy8gUm9sZSByID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2libGVSb2xlKGVsZW1lbnQpOwotCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCUFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXMpOwotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl0ZW1zLCBuYW1lQ29tcGFyYXRvcik7Ci0JCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9SZXNwb25zaWJsZV9Sb2xlLAotCQkJCQkJTk9ERV9SZXNwb25zaWJsZV9Sb2xlLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNvbnRhaW5pbmcgd29yayBwcm9kdWN0cywgbmVlZCBhIHN1bW1hcnkgcGFnZSwgVE9ETwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0KLQkJCWlmICghb3B0aW9ucy5pc1B1Ymxpc2hMaWdodFdlaWdodFRyZWUoKSkgewotCQkJCVdvcmtQcm9kdWN0IHdwID0gKChBcnRpZmFjdCkgZWxlbWVudCkuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJCQkvLyBjcmVhdGVCb29rbWFyayhOT0RFX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0LAotCQkJCS8vIE5PREVfQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QsIHVybCwgIiIsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJaXRlbXMuYWRkKHdwKTsKLQkJCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sCi0JCQkJCQkJUFJFRklYX0NvbnRhaW5pbmdfV29ya19Qcm9kdWN0LAotCQkJCQkJCU5PREVfQ29udGFpbmluZ19Xb3JrX1Byb2R1Y3QsIGl0ZW1zLCB0cnVlKTsKLQkJCQl9Ci0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gY29udGFpbmVkIHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJCS8vIGl0ZW1zID0gKChBcnRpZmFjdCllbGVtZW50KS5nZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQkJCWl0ZW1zID0gY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSB0aGUgY29udGFpbmVkIGVsZW1lbnRzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvbnRhaW5lciwKLQkJCS8vIHRoaXMgaXMgcG9zc2libGUgZHVlIHRvIHJlYWxpemF0aW9uLCBzYXksIHRoZSBjb250YWluaW5nIGVsZW1lbnQKLQkJCS8vIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbnRhaW5lcgotCQkJaXRlbXMucmVtb3ZlKGVsZW1lbnQpOwotCi0JCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJCUNvbGxlY3Rpb25zLnNvcnQoaXRlbXMsIG5hbWVDb21wYXJhdG9yKTsKLQkJCQkJYWxsSXRlbXMuYWRkQWxsKGl0ZW1zKTsKLQkJCQl9IGVsc2UgewotCQkJCQlCb29rbWFyayBiID0gY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sCi0JCQkJCQkJUFJFRklYX0NvbnRhaW5lZF9Xb3JrX1Byb2R1Y3RzLAotCQkJCQkJCU5PREVfQ29udGFpbmVkX1dvcmtfUHJvZHVjdHMsIGl0ZW1zLCBmYWxzZSk7Ci0KLQkJCQkJLy8gZm9yIGVhY2ggY29udGFpbmVkIHdvcmsgcHJvZHVjdCwgY3JlYXRlIHRoZSBuZXN0ZWQgc3ViCi0JCQkJCS8vIHRyZWUKLQkJCQkJYnVpbGRJdGVtcyhpdGVtcywgYiwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoIW9wdGlvbnMuaXNQdWJsaXNoTGlnaHRXZWlnaHRUcmVlKCkpIHsKLQkJCS8vIGlucHV0IHRvIHRhc2tzCi0JCQlpdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwKLQkJCQkJQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcykpOwotCQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MpKTsKLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9JbnB1dFRvX1Rhc2ssCi0JCQkJCQlOT0RFX0lucHV0VG9fVGFzaywgaXRlbXMsIHRydWUpOwotCQkJfQotCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIG91dHB1dCBmcm9tIHRhc2tzCi0JCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LAotCQkJCQlBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzKTsKLQkJCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRm9sZGVyQm9va21hcmsoZWxlbWVudCwgYm0sIFBSRUZJWF9PdXRwdXRPZl9UYXNrLAotCQkJCQkJTk9ERV9PdXRwdXRPZl9UYXNrLCBpdGVtcywgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIGFsbCBndWlkYW5jZXMKLQkJaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSkpOwotCQkvLyBPYmplY3QgZSA9IGNhbGMwMUZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkvLyAuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSk7Ci0JCS8vIGlmIChlICE9IG51bGwpIHsKLQkJLy8gaXRlbXMuYWRkKGUpOwotCQkvLyB9Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpKSk7Ci0KLQkJaWYgKGl0ZW1zLnNpemUoKSA+IDApIHsKLQkJCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChpdGVtcywgbmFtZUNvbXBhcmF0b3IpOwotCQkJCWFsbEl0ZW1zLmFkZEFsbChpdGVtcyk7Ci0JCQl9IGVsc2UgewotCQkJCWNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLCBQUkVGSVhfR3VpZGFuY2VzLAotCQkJCQkJTk9ERV9HdWlkYW5jZXMsIGl0ZW1zLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpKSB7Ci0JCQlidWlsZEl0ZW1zKGFsbEl0ZW1zLCBibSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250YWluZWRBcnRpZmFjdHNTdWJUcmVlKEFydGlmYWN0IGVsZW1lbnQsIEJvb2ttYXJrIGJtLAotCQkJYm9vbGVhbiBzaG93R3VpZGFuY2VzKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTGlzdCBpdGVtczsKLQkJU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY29udGFpbmVkIHdvcmsgcHJvZHVjdHMsIG5lZWQgYSBzdW1tYXJ5IHBhZ2UsIFRPRE8KLQkJLy8gaXRlbXMgPSAoKEFydGlmYWN0KWVsZW1lbnQpLmdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQlpdGVtcyA9IGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSk7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoZSBjb250YWluZWQgZWxlbWVudHMgZG9lcyBub3QgY29udGFpbiB0aGUgY29udGFpbmVyLAotCQkvLyB0aGlzIGlzIHBvc3NpYmxlIGR1ZSB0byByZWFsaXphdGlvbiwgc2F5LCB0aGUgY29udGFpbmluZyBlbGVtZW50Ci0JCS8vIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbnRhaW5lcgotCQlpdGVtcy5yZW1vdmUoZWxlbWVudCk7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaXRlbXMuc2l6ZSgpID4gMCkgewotCQkJLy8gQm9va21hcmsgYiA9IGNyZWF0ZUZvbGRlckJvb2ttYXJrKGVsZW1lbnQsIGJtLAotCQkJLy8gTk9ERV9Db250YWluZWRfV29ya19Qcm9kdWN0cywgaXRlbXMsIGZhbHNlKTsKLQotCQkJLy8gZm9yIGVhY2ggY29udGFpbmVkIHdvcmsgcHJvZHVjdCwgY3JlYXRlIHRoZSBuZXN0ZWQgc3ViIHRyZWUKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlBcnRpZmFjdCBlID0gKEFydGlmYWN0KSBpdC5uZXh0KCk7Ci0JCQkJYnVpbGRJdGVtKGUsIGJtLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JCWlmICghc2hvd0d1aWRhbmNlcykgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpKTsKLQkJLy8gT2JqZWN0IGUgPSBjYWxjMDFGZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJLy8gLmdldFdvcmtQcm9kdWN0X0VzdGltYXRlKCkpOwotCQkvLyBpZiAoZSAhPSBudWxsKSB7Ci0JCS8vIGl0ZW1zLmFkZChlKTsKLQkJLy8gfQotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSkpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcnMoKSkpOwotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQkvLyBjcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgTk9ERV9HdWlkYW5jZXMsIGl0ZW1zLCB0cnVlKTsKLQkJCWJ1aWxkSXRlbXMoaXRlbXMsIGJtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGl0ZXJhdGUgdGhlIGJyZWFrIGRvd24gc3RydWN0dXJlIGFuZCBidWlsZCB0aGUgeG1sIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIHBhcmVudE9iagotCSAqICAgICAgICAgICAgVGhlIG9iamVjdCB0byBpdGVyYXRlLiBJdCBjYW4gYmUgYSBicmVha2Rvd24gZWxlbWVudCwgb3IgaXQncwotCSAqICAgICAgICAgICAgYWRhcHRvcgotCSAqIEBwYXJhbSBwYXJlbnRYbWwKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaXRlcmF0ZUFjdGl2aXR5KFByb2Nlc3NFbGVtZW50SXRlbSBwYXJlbnRJdGVtLAotCQkJQm9va21hcmsgcGFyZW50Qm0sIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnksCi0JCQlTdXBwcmVzc2lvbiBzdXApIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlPYmplY3QgcGFyZW50T2JqID0gcGFyZW50SXRlbS5yYXdJdGVtOwotCi0JCWlmIChwYXJlbnRPYmogaW5zdGFuY2VvZiBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHsKLQkJCXByb3ZpZGVyID0gKElUcmVlSXRlbUNvbnRlbnRQcm92aWRlcikgcGFyZW50T2JqOwotCQl9IGVsc2UgewotCQkJcHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdCgKLQkJCQkJcGFyZW50T2JqLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQl9Ci0KLQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCS8vIFN0cmluZyBkaXNwbGF5TmFtZSA9IFByb2Nlc3NVdGlsLmdldEF0dHJpYnV0ZShwYXJlbnRPYmosCi0JCQkvLyBJQlNJdGVtUHJvdmlkZXIuQ09MX1BSRVNFTlRBVElPTl9OQU1FLCBwcm92aWRlcik7Ci0JCQkvLyBwYXJlbnRYbWwuc2V0QXR0cmlidXRlKCJEaXNwbGF5TmFtZSIsIGRpc3BsYXlOYW1lKTsKLQotCQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IHByb3ZpZGVyLmdldENoaWxkcmVuKHBhcmVudE9iaik7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJT2JqZWN0IHJhd2l0ZW0gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHN1cC5pc1N1cHByZXNzZWQocmF3aXRlbSkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJTWV0aG9kRWxlbWVudCBpdGVtID0gKE1ldGhvZEVsZW1lbnQpIExpYnJhcnlVdGlsCi0JCQkJCQkudW53cmFwKHJhd2l0ZW0pOwotCi0JCQkJaWYgKCFvcHRpb25zLnNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUKLQkJCQkJCSYmIChpdGVtIGluc3RhbmNlb2YgRGVzY3JpcHRvcikpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJUHJvY2Vzc0VsZW1lbnRJdGVtIGVsZW1lbnRJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbSgKLQkJCQkJCXJhd2l0ZW0sIGl0ZW0sIHBhcmVudEl0ZW0pOwotCi0JCQkJQm9va21hcmsgY2hpbGQgPSBidWlsZEl0ZW0oZWxlbWVudEl0ZW0uZWxlbWVudCwgcGFyZW50Qm0sIGZhbHNlKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQkvLyBzZXQgdGhlIHF1ZXJ5IHN0cmluZwotCQkJCQljaGlsZC5zZXRRdWVyeVN0cmluZyhlbGVtZW50SXRlbS5nZXRRdWVyeVN0cmluZygpKTsKLQotCQkJCQlJQlNJdGVtUHJvdmlkZXIgYWRhcHRlciA9IG51bGw7Ci0JCQkJCWlmIChyYXdpdGVtIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCQlhZGFwdGVyID0gKElCU0l0ZW1Qcm92aWRlcikgcmF3aXRlbTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWFkYXB0ZXIgPSAoSUJTSXRlbVByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeS5hZGFwdChpdGVtLAotCQkJCQkJCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQkJCQkJOwotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gUHJvY2Vzc1V0aWwuZ2V0QXR0cmlidXRlKGl0ZW0sCi0JCQkJCQkJSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSwgYWRhcHRlcik7Ci0JCQkJCWNoaWxkLnNldFByZXNlbnRhdGlvbk5hbWUoZGlzcGxheU5hbWUpOwotCi0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJCWl0ZXJhdGVBY3Rpdml0eShlbGVtZW50SXRlbSwgY2hpbGQsIGFkYXB0ZXJGYWN0b3J5LCBzdXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJvY2Vzc1N1YlRyZWUoT2JqZWN0IG9iaiwKLQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBlbGVtZW50LCBCb29rbWFyayBibSkgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUxpc3QgaXRlbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJUHJvY2Vzc0VsZW1lbnRJdGVtIHByb2NJdGVtID0gbmV3IFByb2Nlc3NFbGVtZW50SXRlbShvYmosIGVsZW1lbnQsCi0JCQkJZWxlbWVudC5nZXRHdWlkKCkpOwotCi0JCUNvbXBvc2VkQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkgPSBzdXBlci5nZXRMYXlvdXRNZ3IoKQotCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpOwotCQlTdXBwcmVzc2lvbiBzdXAgPSBuZXcgU3VwcHJlc3Npb24oZWxlbWVudCk7Ci0JCWl0ZXJhdGVBY3Rpdml0eShwcm9jSXRlbSwgYm0sIGFkYXB0ZXJGYWN0b3J5LCBzdXApOwotCi0JCVN0cmluZyB1cmw7Ci0JCUJvb2ttYXJrIGI7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBhbGwgZ3VpZGFuY2VzCi0JCWl0ZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpKSk7Ci0JCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCkpKTsKLQkJaXRlbXMuYWRkQWxsKGNhbGMwbkZlYXR1cmVWYWx1ZShlbGVtZW50LCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpKSk7Ci0KLQkJLy8gbmVlZCB0byBpbmNsdWRlIHN1cHBvcnRpbmcgbWF0ZXJpYWxzIGFzIHdlbGwKLQkJLy8gZml4IGJ1Zzogc3VwcG9ydGluZyBtYXRlcmlhbCBzZXJ2ZWQgYXMgdXNlciBkZWZpbmVkIGRpYWdyYW0gc2hvdWxkIG5vdCAKLQkJLy8gc2hvdyB1cCBpbiB0aGUgbmF2aWdhdGlvbiB0cmVlIG9mIGEgcHVibGlzaGVkIHByb2Nlc3MuCQotCQlvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvIHVzZXJEaWFncmFtSW5mbyA9IAotCQkJCW5ldyBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC51dGlsLkRpYWdyYW1JbmZvKGVsZW1lbnQpOwotCQlMaXN0IHYgPSBjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkpOwotCQlmb3IgKCBJdGVyYXRvciBpdCA9IHYuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzID0gKFN1cHBvcnRpbmdNYXRlcmlhbClpdC5uZXh0KCk7Ci0JCQlpZiAoICF1c2VyRGlhZ3JhbUluZm8uaXNEaWFncmFtKCAoU3VwcG9ydGluZ01hdGVyaWFsKXMgKSApIHsKLQkJCQlpdGVtcy5hZGQocyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewotCQkJRGVsaXZlcnlQcm9jZXNzIGRwID0gKERlbGl2ZXJ5UHJvY2VzcykgZWxlbWVudDsKLQkJCWl0ZW1zLmFkZEFsbChjYWxjMG5GZWF0dXJlVmFsdWUoZWxlbWVudCwgVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFscygpKSk7Ci0JCQlpdGVtcy5hZGRBbGwoY2FsYzBuRmVhdHVyZVZhbHVlKGVsZW1lbnQsIFVtYVBhY2thZ2UuZUlOU1RBTkNFCi0JCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCkpKTsKLQkJfQotCi0JCWlmIChpdGVtcy5zaXplKCkgPiAwKSB7Ci0JCQljcmVhdGVGb2xkZXJCb29rbWFyayhlbGVtZW50LCBibSwgUFJFRklYX0d1aWRhbmNlcywgTk9ERV9HdWlkYW5jZXMsCi0JCQkJCWl0ZW1zLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlhZGFwdGVyRmFjdG9yeSA9IG51bGw7Ci0JCW5hbWVDb21wYXJhdG9yID0gbnVsbDsKLQkJYm9va21hcmtzLmNsZWFyKCk7Ci0JCWVsZW1lbnRVcmxzLmNsZWFyKCk7Ci0JCXN1bW1hcnlQYWdlc0dlbmVyYXRlZC5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCBTZXQgZWxlbWVudFVybHMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJvdGVjdGVkIHZvaWQgZWxlbWVudFB1Ymxpc2hlZChJRWxlbWVudExheW91dCBsYXlvdXQsIFN0cmluZyBodG1sZmlsZSkgewotCQkvLyBvbmx5IGZvciBwcm9jZXNzIGVsZW1lbnQgZm9yIG5vdwotCQkvLyBtYXkgY292ZXIgYWxsIG1ldGhvZCBlbGVtZW50cyBsYXRlcgotCQlpZiAobGF5b3V0LmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQlFbGVtZW50VXJsIHVybCA9IG5ldyBFbGVtZW50VXJsKGxheW91dC5nZXRFbGVtZW50KCkuZ2V0R3VpZCgpLAotCQkJCQlsYXlvdXQuZ2V0VXJsKCksIGxheW91dC5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCWVsZW1lbnRVcmxzLmFkZCh1cmwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVFbGVtZW50VXJscygpIHsKLQkJLy8gc2F2ZSBwdWJsaXNoZWQgZWxlbWVudCB1cmxzCi0JCS8vIG5lZWQgdG8gZXNjYXBlIHRoZSB1cmwgYW5kIHRleHQgc2luY2UgaXQgd2lsbCBiZSBhc3NpZ25lZCB0byBhCi0JCS8vIGphdmFzY3JpcHQgdmFyaWFibGUgYXMgbGl0ZXJhbAotCQlYbWxFbGVtZW50IHhtbCA9IG5ldyBYbWxFbGVtZW50KCJFbGVtZW50VXJscyIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbGVtZW50VXJscy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbGVtZW50VXJsIHVybCA9IChFbGVtZW50VXJsKSBpdC5uZXh0KCk7Ci0JCQl4bWwubmV3Q2hpbGQoImVsZW1lbnRVcmwiLCB1cmwuZ3VpZCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJ0ZXh0IiwgU3RyVXRpbC5lc2NhcGUodXJsLnRleHQpKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIFN0clV0aWwuZXNjYXBlKHVybC51cmwpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gYnVmZmVyLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbC50b1htbCgpKTsKLQkJLy8gRmlsZSBmID0gbmV3IEZpbGUoZ2V0TGF5b3V0TWdyKCkuZ2V0UHVibGlzaERpcigpLCAiRWxlbWVudFVybHMueG1sIik7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmLmdldEFic29sdXRlUGF0aCgpLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJU3RyaW5nIGh0bWwgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKHhtbCwgInhzbC9lbGVtZW50VXJscy54c2wiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGYgPSBuZXcgRmlsZShnZXRMYXlvdXRNZ3IoKS5nZXRQdWJsaXNoRGlyKCksCi0JCQkJUFJPQ0VTU19MQVlPVVRfREFUQV9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGYuZ2V0QWJzb2x1dGVQYXRoKCksIGh0bWwsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIGRhdGEgc3RydWN0dXJlIHRvIGRlZmluZSB1cmwgb2YgYW4gZWxlbWVudAotCSAqIAotCSAqIEBhdXRob3IgSmluaHVhIFhpCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIEVsZW1lbnRVcmwgewotCi0JCVN0cmluZyBndWlkOwotCQlTdHJpbmcgdXJsOwotCQlTdHJpbmcgdGV4dDsKLQotCQkvKioKLQkJICogY29uc3RydWN0b3IKLQkJICogCi0JCSAqIEBwYXJhbSBndWlkCi0JCSAqICAgICAgICAgICAgU3RyaW5nIHRoZSBndWlkIG9mIHRoZSBlbGVtZW50Ci0JCSAqIEBwYXJhbSB1cmwKLQkJICogICAgICAgICAgICBTdHJpbmcgdGhlIHVybCBvZiB0aGUgZWxlbWVudAotCQkgKiBAcGFyYW0gdGV4dAotCQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgdGV4dCBhbG9uZSB3aXRoIHRoZSB1cmwKLQkJICovCi0JCXB1YmxpYyBFbGVtZW50VXJsKFN0cmluZyBndWlkLCBTdHJpbmcgdXJsLCBTdHJpbmcgdGV4dCkgewotCQkJdGhpcy5ndWlkID0gZ3VpZDsKLQkJCXRoaXMudXJsID0gdXJsOwotCQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJfQotCX0KLQotCWNsYXNzIEVPYmplY3RDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIHBOYW1lID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0JCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIG5hbWUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXROYW1lZEVsZW1lbnRfTmFtZSgpOwotCi0JCXB1YmxpYyBFT2JqZWN0Q29tcGFyYXRvcigpIHsKLQotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQlpZiAoZTEgaW5zdGFuY2VvZiBFT2JqZWN0ICYmIGUyIGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJCU9iamVjdCB2MSA9IGdldFZhbHVlKGUxKTsKLQkJCQlPYmplY3QgdjIgPSBnZXRWYWx1ZShlMik7Ci0KLQkJCQlpZiAodjEgPT0gbnVsbCAmJiB2MiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBlMS50b1N0cmluZygpLmNvbXBhcmVUbyhlMi50b1N0cmluZygpKTsKLQkJCQl9IGVsc2UgaWYgKHYxID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0gZWxzZSBpZiAodjIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gdjEudG9TdHJpbmcoKS5jb21wYXJlVG8odjIudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZTEudG9TdHJpbmcoKS5jb21wYXJlVG8oZTIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZSkgewotCQkJT2JqZWN0IHYgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl2ID0gKChFT2JqZWN0KSBlKS5lR2V0KHBOYW1lKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCi0JCQl9Ci0JCQk7Ci0KLQkJCWlmICh2ID09IG51bGwgfHwgdi50b1N0cmluZygpLmxlbmd0aCgpID09IDApIHsKLQkJCQl0cnkgewotCQkJCQl2ID0gKChFT2JqZWN0KSBlKS5lR2V0KG5hbWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCi0JCQkJfQotCQkJCTsKLQkJCX0KLQotCQkJcmV0dXJuIHY7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NzI4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMKLSMgZGVmaW5lcyB3aGljaCBlbGVtZW50cyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBpY29uCi0jCi1kaXNjaXBsaW5lPXRydWUKLWNhcGFiaWxpdHlQYXR0ZXJuPXRydWUKLXJvbGU9dHJ1ZQotdGFzaz10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMzZmNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8gCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVsZW1lbnRUeXBlUmVzb3VyY2VzIAotewotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXN0YXRpYwotCXsKLQkJdHJ5IAotCQl7Ci0JCQlTdHJpbmcgcmVzb3VyY2UgPSBEZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMuY2xhc3MuZ2V0TmFtZSgpOwotCQkgICAgcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2UpOwotCQkJICAgIAkJICAgIAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkgICAgeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQkKLQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkKLQl7Ci0JCXRyeSAKLQkJewotCQkJcmV0dXJuIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSA/IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpIDogbnVsbDsKLQkJfSAKLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSAKLQkJewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiBhIGRlZmF1bHQgaWNvbiBpcyBpc2VkIG9yIG5vdCBmb3IgdGhlIHNwZWNpZmllZCBrZXkKLQkgKiAKLQkgKiBAcGFyYW0ga2V5IFN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VEZWZhdWx0SWNvbihTdHJpbmcga2V5KQotCXsKLQkJU3RyaW5nIGJvb2xlYW5SZXN1bHQgPSBnZXRTdHJpbmcoa2V5KTsKLQkJaWYgKCBib29sZWFuUmVzdWx0ID09IG51bGwgKQotCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiAoYm9vbGVhblJlc3VsdC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoInRydWUiKSA+IC0xKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotCX0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHRFbGVtZW50VHlwZVJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTIyZjg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0RWxlbWVudFR5cGVSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIGRlZmluZXMgd2hpY2ggZWxlbWVudHMgd2lsbCB1c2UgdGhlIGRlZmF1bHQgaWNvbgotIwotZGlzY2lwbGluZT10cnVlCi1jYXBhYmlsaXR5UGF0dGVybj10cnVlCi1yb2xlPXRydWUKLXRhc2s9dHJ1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3ZDY4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdE5vZGVJY29uUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHROb2RlSWNvblJlc291cmNlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUZBVUxUX0lDT05fTkFNRSA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyByZXNvdXJjZSA9IERlZmF1bHROb2RlSWNvblJlc291cmNlcy5jbGFzcy5nZXROYW1lKCk7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShyZXNvdXJjZSk7Ci0JCQlERUZBVUxUX0lDT05fTkFNRSA9IGdldFN0cmluZygiZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIChyZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSA/IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhrZXkpCi0JCQkJCTogbnVsbDsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBpY29uIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQga2V5Ci0JICogCi0JICogQHBhcmFtIGtleSBTdHJpbmcKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgaWNvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEljb25OYW1lKFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIGljb25OYW1lID0gZ2V0U3RyaW5nKGtleSk7Ci0JCWlmIChpY29uTmFtZSA9PSBudWxsKSB7Ci0JCQlpY29uTmFtZSA9IERFRkFVTFRfSUNPTl9OQU1FOwotCQl9Ci0KLQkJcmV0dXJuIGljb25OYW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHROb2RlSWNvblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0RlZmF1bHROb2RlSWNvblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWYxY2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0Tm9kZUljb25SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jCi0jIGRlZmluZXMgdGhlIGRlZmF1bHQgbm9kZSBpY29uIG5hbWVzCi0jCi1hY3Rpdml0eT1hY3Rpdml0eS5naWYKLWFydGlmYWN0PWFydGlmYWN0LmdpZgotcm9sZT13b3JrZXIuZ2lmCi10YXNrPWFjdGl2aXR5LmdpZgotZ3VpZGVsaW5lPWd1aWRlbGluZS5naWYKLWNoZWNrbGlzdD1jaGVja2xpc3QuZ2lmCi1jb25jZXB0PWNvbmNlcHQuZ2lmCi1leGFtcGxlPWV4YW1wbGUuZ2lmCi1yZXBvcnQ9Ci1zdXBwb3J0aW5nbWF0ZXJpYWw9Ci10ZWNobmlxdWU9Ci10ZW1wbGF0ZT0KLXRlcm1kZWZpbml0aW9uPQotdG9vbG1lbnRvcj0KLXRyYWluaW5nbW9kdWxlPQotd2hpdGVwYXBlcj0KLXdvcmtwcm9kdWN0Z3VpZGVsaW5lPQotZ2VuZXJhbD0KLXByb2Nlc3M9Ci1jYXBhYmlsaXR5cGF0dGVybj0KLWRlbGl2ZXJ5cHJvY2Vzcz0KLWZvbGRlcj1mb2xkZXIuZ2lmCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvRGVmYXVsdFNpdGVHZW5lcmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0U2l0ZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjJhNTdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9EZWZhdWx0U2l0ZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5Cb29rbWFyazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcmtMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuTGF5b3V0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLlB1Ymxpc2hpbmdVdGlsOwotCi0KLS8qKgotICogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2l0ZSBnZW5lcmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFNpdGVHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFNpdGVHZW5lcmF0b3IgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQVBQTEVUX0RJUkVDVE9SWSA9ICJub2FwcGxldCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1NVRkZJWCA9ICIuYmttIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1NVRkZJWF9YTUwgPSAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1NVRkZJWF9IVE1MID0gIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0VfUkVQTEFDRU1FTlQgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQUNFX1NUUklORyA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CT09LTUFSS19DRkdfTkFNRSA9Ci0JLy8gIkRlZmF1bHRCb29rbWFyay5jZmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVEX0JPT0tNQVJLU19DRkdfTkFNRSA9ICJQdWJsaXNoZWRCb29rbWFya3MueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVEX0JPT0tNQVJLU19ERUxJTUlURVIgPSAiKiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0tNQVJLX1hTTF9GSUxFID0gInhzbC9ib29rbWFyay54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS1NfWFNMX0ZJTEUgPSAieHNsL1B1Ymxpc2hlZEJvb2ttYXJrcy54c2wiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9YU0xfRklMRSA9ICJ4c2wvaW5kZXgueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QTkFWX1hTTF9GSUxFID0gInhzbC90b3BuYXYueHNsIjsgLy8kTk9OLU5MUy0xJAotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQVJDSF9YU0xfRklMRSA9ICJ4c2wvc2VhcmNoLnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMRVRfUEFUSCA9ICJhcHBsZXQiICsgRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0FQUExFVF9QQVRIID0gIm5vYXBwbGV0IiArIEZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1BBVEggPSAiaW1hZ2VzIiArIEZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfU0VBUkNIX1BBVEggPSAiZG9jcm9vdC9zZXJ2ZXJfc2VhcmNoIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CQU5ORVJfRklMRSA9ICJFUEZDX2Jhbm5lci5qcGciOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRmlsZSBpY29uUGF0aDsKLQotCXB1YmxpYyBEZWZhdWx0U2l0ZUdlbmVyYXRvcihIdG1sQnVpbGRlciBidWlsZGVyLCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucykgewotCQlzdXBlcihidWlsZGVyLCBvcHRpb25zKTsKLQotCQlpY29uUGF0aCA9IG5ldyBGaWxlKHB1YkRpciwgKG9wdGlvbnMuaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpICkgPyBOT19BUFBMRVRfUEFUSCAgKyBJQ09OX1BBVEggCi0JCQkJOiBBUFBMRVRfUEFUSCArIElDT05fUEFUSCk7Ci0JfQotCQotCXB1YmxpYyBIdG1sQnVpbGRlciBnZXRIdG1sQnVpbGRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkZXI7Ci0JfQotCQotCXB1YmxpYyBQdWJsaXNoT3B0aW9ucyBnZXRQdWJsaXNoT3B0aW9ucygpIHsKLQkJcmV0dXJuIG9wdGlvbnM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlSWNvblBhdGgoKSB7Ci0JCXJldHVybiBpY29uUGF0aC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QmFubmVySW1hZ2VGaWxlKCkgewotCQkvL3JldHVybiAiYmFubmVyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIERFRkFVTFRfQkFOTkVSX0ZJTEU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByZVB1Ymxpc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29weUZpbGVzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBvc3RQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvcHlJY29uc0Zvck5vbkFwcGxldCgpOwotCQl3cml0ZUluZGV4QW5kVG9wTmF2SHRtbCgpOwotCQl3cml0ZVNlYXJjaEh0bWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29weUZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJY29weURvY1Jvb3RGaWxlcygpOwotCi0JCS8vIGNvcHkgbG9jYWxpemVkIGZpbGVzCi0JCWNvcHlMb2NhbGl6ZWRGaWxlcygpOwotCi0JCS8vIGNvcHkgdXNlciBjdXN0b21pemVkIGZpbGVzIGxhc3QKLQkJY29weUN1c3RvbWl6ZWRGaWxlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlEb2NSb290RmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcGx1Z2luX3VybCA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKTsKLQkJVVJMIHVybCA9IG5ldyBVUkwocGx1Z2luX3VybCwgRE9DX1JPT1QpOwotCQlTdHJpbmcgZnJvbVBhdGggPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCS8vIGZvbGRlcnMgdGhhdCBhcHBseSB0byBhbGwKLQkJLy8gTk9URTogYXBwbGV0IGltYWdlcyBzaG91bGQgYWx3YXlzIGJlIGluY2x1ZGVkIHNpbmNlIGl0J3MgdXNlZCBpbgotCQkvLyBBdGxhbnRpYyBjb25maWd1cmF0aW9uCi0JCS8vIGFwcGxldC9oZWxwLmh0bSBpcyB1c2VkIGluIFJTQSB0byBjaGVjayBjaGFyYWN0ZXIgZW5jb2RpbmcsIHNvCi0JCS8vIG5lZWQgdG8gaW5jbHVkZSB0aGlzIGZpbGUKLQkJLy8gUHJvY2VzcyBBZHZpc29yOiBGaWxlTm90Rm91bmRFeGNlcHRpb24gaW4gUlNBIGxvZwotCQkvLyB3aGVuIGluZGV4aW5nIHN0YXJ0IG9uIGEgbm9uLWFwcGxldCBwdWJsaXNoZWQgc2l0ZQotCQlTdHJpbmcgaW5jbHVkZXMgPSAiKi4qLCBwcm9jZXNzLyoqLCBpbWFnZXMvKiosIGluZGV4LyoqLCBzY3JpcHRzLyoqLCBzdHlsZXNoZWV0cy8qKiI7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgZXhjbHVkZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGJhc2VkIG9uIHRoZSBzZWxlY3Rpb24sIGNvcHkgdGhlIG90aGVyIGZvbGRlcnMKLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoSmF2YVNjcmlwdFRyZWUoKSkgewotCQkJaW5jbHVkZXMgKz0gIiwgbm9hcHBsZXQvKioiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBTdHJpbmcgcHVibGlzaERpciA9IHZpZXdCdWlsZGVyLmdldEh0bWxCdWlsZGVyKCkuZ2V0UHVibGlzaERpcigpOwotCi0JCUxheW91dFJlc291cmNlcy5jb3B5RGlyKGZyb21QYXRoLCBwdWJEaXIsIGluY2x1ZGVzLCBleGNsdWRlcyk7CQkKLQkJCi0JCVN0cmluZyBwYXRoID0gRmlsZUxvY2F0b3IucmVzb2x2ZShuZXcgVVJMKHBsdWdpbl91cmwsIFNFUlZFUl9TRUFSQ0hfUEFUSCkpLmdldFBhdGgoKTsKLQkJaW5jbHVkZXMgPSAiKi4qLCBzZWFyY2gvKioiOyAvLyROT04tTkxTLTEkCi0JCUxheW91dFJlc291cmNlcy5jb3B5RGlyKHBhdGgsIHB1YkRpciwgaW5jbHVkZXMsIG51bGwpOwkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUN1c3RvbWl6ZWRGaWxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5jb3B5Q3VzdG9taXplZEZpbGVzKCk7Ci0KLQkJaWYgKG9wdGlvbnMuYWJvdXRIVE1MICE9IG51bGwgJiYgb3B0aW9ucy5hYm91dEhUTUwubGVuZ3RoKCkgPiAwKSB7Ci0JCQlGaWxlVXRpbC5jb3B5RmlsZShvcHRpb25zLmFib3V0SFRNTCwgcHViRGlyICsgImFib3V0Lmh0bSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9CQotCi0JcHJvdGVjdGVkIHZvaWQgY29weUxvY2FsaXplZEZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3VwZXIuY29weUxvY2FsaXplZEZpbGVzKCk7Ci0KLQkJaWYgKG9wdGlvbnMuaXNQdWJsaXNoSmF2YVNjcmlwdFRyZWUoKSkgewotCQkJLy8gY29weSB0aGUgYXBwbGV0IGh0bWwgZmlsZXMsIHJlbmFtZSBsb2NhbGUgc3BlY2lmaWMgbmFtZXMKLQkJCVB1Ymxpc2hpbmdQbHVnaW4KLQkJCQkJLmdldERlZmF1bHQoKQotCQkJCQkuY29weUxvY2FsaXplZEZpbGVzKAotCQkJCQkJCURPQ19ST09UICsgIm5vYXBwbGV0LyIsIG5ldyBGaWxlKHB1YkRpciwgIm5vYXBwbGV0LyIpLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvcHlJY29uc0Zvck5vbkFwcGxldCgpCi0JewotCQl0cnkKLQkJewotCQkJLy8gZG9uJ3QgamFyIGl0LiBjb3B5IHRoZSBpY29ucyB0byB0aGUgaW1hZ2VzCi0vLwkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGJ1aWxkZXIuZ2V0UHVibGlzaERpcigpLCBBUFBMRVRfUEFUSCArIElDT05fWklQX0ZJTEUpOwotLy8JCQlQdWJsaXNoaW5nVXRpbC5qYXJGaWxlcyhpY29uUGF0aCwgamFyRmlsZSk7Ci0KLQkJCWlmICggb3B0aW9ucy5pc1B1Ymxpc2hKYXZhU2NyaXB0VHJlZSgpICkKLQkJCXsKLQkJCQkvLyBhbHNvIGNvcHkgdGhlIGljb25zIHRvIHRoZSBuby1hcHBsZXQgZm9sZGVyCi0JCQkJTGF5b3V0UmVzb3VyY2VzLmNvcHlEaXIoaWNvblBhdGguZ2V0QWJzb2x1dGVQYXRoKCksIHB1YkRpciArIE5PX0FQUExFVF9QQVRIICsgSUNPTl9QQVRIKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KQotCQl7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHdyaXRlQm9va21hcmsoQm9va21hcmsgYikgewotCi0JCS8vIGdldCB0aGUgYm9va21hcmsgbmFtZSBmcm9tIHRoZSBib29rbWFyayB1cmwKLQkJU3RyaW5nIGJvb2ttYXJrRmlsZU5hbWUgPSBzdXBlci5nZXRWaWV3RGF0YUZpbGVOYW1lKGIsIEJPT0tNQVJLX1NVRkZJWF9YTUwpOwotCQlYbWxFbGVtZW50IHhtbCA9IGIuZ2V0WG1sRWxlbWVudCgpOwotCi0JCVN0cmluZyBidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKHhtbCwgQk9PS01BUktfWFNMX0ZJTEUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBodG1sUGF0aCA9IGdldEJvb2ttYXJrSHRtbFBhdGgoYm9va21hcmtGaWxlTmFtZSk7Ci0JCQlGaWxlVXRpbC53cml0ZVVURjhGaWxlKGh0bWxQYXRoLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gYm9va21hcmtGaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgd3JpdGVQdWJsaXNoZWRCb29rbWFya3MoTGlzdCBib29rbWFya3MsIEJvb2ttYXJrIGRlZmF1bHRWaWV3KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCS8vIGZpcnN0IHdyaXRlIHhtbCBmb3IgZWFjaCBpbmRpdmlkdWFsIHZpZXcgCi0JCUJvb2ttYXJrTGlzdCBsaXN0ID0gbmV3IEJvb2ttYXJrTGlzdCgpOwotCi0JCWlmICgoZGVmYXVsdFZpZXcgPT0gbnVsbCkgJiYgKGJvb2ttYXJrcy5zaXplKCkgPiAwKSkgewotCQkJZGVmYXVsdFZpZXcgPSAoQm9va21hcmspIGJvb2ttYXJrcy5nZXQoMCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYm9va21hcmtzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUJvb2ttYXJrIGIgPSAoQm9va21hcmspIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHdyaXRlQm9va21hcmsoYik7Ci0JCQlsaXN0LmFkZEJvb2ttYXJrKGIuZ2V0UHJlc2VudGF0aW9uTmFtZSgpLCBmaWxlTmFtZSwKLQkJCQkJKGRlZmF1bHRWaWV3ID09IGIpKTsKLQkJfQotCQkKLQkJLy8gdGhlbiB3cml0ZSB0aGUgdG9wIGxldmVsIGJvb2ttYXJrIHhtbAotCQlYbWxFbGVtZW50IHhtbCA9IGxpc3QuZ2V0WG1sRWxlbWVudCgpOwotCi0JCVN0cmluZyBidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKHhtbCwgQk9PS01BUktTX1hTTF9GSUxFKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaHRtbFBhdGggPSBnZXRCb29rbWFya0h0bWxQYXRoKFBVQkxJU0hFRF9CT09LTUFSS1NfQ0ZHX05BTUUpOwotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShodG1sUGF0aCwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHdyaXRlSW5kZXhBbmRUb3BOYXZIdG1sKCkgewotCQkJCQotCQlYbWxFbGVtZW50IG9wdGlvblhtbCA9IGdldE9wdGlvblhtbCgpOwkJCi0JCQkJCi0JCVN0cmluZyBidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKG9wdGlvblhtbCwgSU5ERVhfWFNMX0ZJTEUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBodG1sUGF0aCA9IGdldEluZGV4RmlsZVBhdGgoKTsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoaHRtbFBhdGgsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCi0JCWJ1ZmZlciA9IFB1Ymxpc2hpbmdVdGlsLmdldEh0bWwob3B0aW9uWG1sLCBUT1BOQVZfWFNMX0ZJTEUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBodG1sUGF0aCA9IHB1YkRpciArICJ0b3BuYXYuaHRtIjsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShodG1sUGF0aCwgYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHdyaXRlU2VhcmNoSHRtbCgpIHsKLQotCQlib29sZWFuIHNlcnZlclNpZGVTZWFyY2ggPSAob3B0aW9ucyA9PSBudWxsKSB8fCBvcHRpb25zLmlzSW5jbHVkZVNlcnZsZXRTZWFyY2goKTsKLQkJCi0JCVN0cmluZyB3ZWJBcHBOYW1lID0gb3B0aW9ucy5nZXREeW5hbWljV2ViQXBwTmFtZSgpOwotCQkKLQkJaWYgKHdlYkFwcE5hbWUgIT0gbnVsbCAmJiB3ZWJBcHBOYW1lLmxlbmd0aCgpID4gMCAmJiBzZXJ2ZXJTaWRlU2VhcmNoKSB7Ci0JCQotCQkJWG1sRWxlbWVudCBzZWFyY2hYbWwgPSBuZXcgWG1sRWxlbWVudCgiU2VhcmNoIikuc2V0QXR0cmlidXRlKCAvLyROT04tTkxTLTEkCi0JCQkJCSJ3ZWJBcHBOYW1lIiwgd2ViQXBwTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkKLQkJCVN0cmluZyBidWZmZXIgPSBQdWJsaXNoaW5nVXRpbC5nZXRIdG1sKHNlYXJjaFhtbCwgU0VBUkNIX1hTTF9GSUxFKTsKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCVN0cmluZyBodG1sUGF0aCA9IGdldFNlYXJjaEZpbGVQYXRoKCk7Ci0JCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShodG1sUGF0aCArICJzZWFyY2guaHRtbCIsIGJ1ZmZlci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9va21hcmtIdG1sUGF0aChTdHJpbmcgYm9vbWthcmtGaWxlKSB7Ci0JCWludCBpbmR4ID0gYm9vbWthcmtGaWxlLmxhc3RJbmRleE9mKEJPT0tNQVJLX1NVRkZJWF9YTUwpOwotCQlyZXR1cm4gcHViRGlyCi0JCQkJKyBOT19BUFBMRVRfRElSRUNUT1JZICsgRmlsZS5zZXBhcmF0b3JDaGFyCi0JCQkJKyBib29ta2Fya0ZpbGUuc3Vic3RyaW5nKDAsIGluZHgpICsgQk9PS01BUktfU1VGRklYX0hUTUw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIHB1YkRpciArICJpbmRleC5odG0iOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFNlYXJjaEZpbGVQYXRoKCkgewotCQlyZXR1cm4gcHViRGlyICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgInNlYXJjaCIgKyBGaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBnZXRPcHRpb25YbWwoKSB7Ci0JCWJvb2xlYW4gc2hvd0dsb3NzYXJ5ID0gKG9wdGlvbnMgPT0gbnVsbCkgfHwgb3B0aW9ucy5pc1B1Ymxpc2hHbG9zc2FyeSgpOwotCQlib29sZWFuIHNob3dJbmRleCA9IChvcHRpb25zID09IG51bGwpIHx8IG9wdGlvbnMuaXNQdWJsaXNoSW5kZXgoKTsKLQotCQlYbWxFbGVtZW50IG9wdGlvblhtbCA9IG5ldyBYbWxFbGVtZW50KCJQdWJsaXNoaW5nT3B0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCBvcHRpb25zICE9IG51bGwgKSB7CQkKLQkJCW9wdGlvblhtbC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgb3B0aW9ucy5nZXRUaXRsZSgpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS5zZXRBdHRyaWJ1dGUoImJhbm5lckltYWdlIiwgb3B0aW9ucy5iYW5uZXJJbWFnZSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkuc2V0QXR0cmlidXRlKCJiYW5uZXJJbWFnZUhlaWdodCIsIEludGVnZXIudG9TdHJpbmcob3B0aW9ucy5nZXRCYW5uZXJJbWFnZUhlaWdodCgpKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkuc2V0QXR0cmlidXRlKAotCQkJCQkiZmVlZGJhY2tVcmwiLCBvcHRpb25zLmZlZWRiYWNrVVJMKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS5zZXRBdHRyaWJ1dGUoInNob3dHbG9zc2FyeSIsIChzaG93R2xvc3NhcnkgPyAidHJ1ZSIgOiAiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCS5zZXRBdHRyaWJ1dGUoInNob3dJbmRleCIsIChzaG93SW5kZXggPyAidHJ1ZSIgOiAiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCS5zZXRBdHRyaWJ1dGUoInNlcnZlclNpZGVTZWFyY2giLCBvcHRpb25zLmlzSW5jbHVkZVNlcnZsZXRTZWFyY2goKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCX0KLQkJCi0JCXJldHVybiBvcHRpb25YbWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjFlOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0dsb3NzYXJ5QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LlRuZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29uZmlndXJhdGlvbi5HdWlkYW5jZUl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci0KLS8qKgotICogQnVpbGQgdGhlIGdsb3NzYXJ5IGZpbGUgZm9yIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdsb3NzYXJ5QnVpbGRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9CQUNLUEFUSCA9ICIuLy4uLyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJDbGFzcyA9IElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzczsKLQotCS8vIGdlbmVyYXRlZCBnbG9zc2FyeSBodG1sIGZpbGUgcmVsYXRpdmUgdG8gdGhlIHB1Ymxpc2hpbmcgZGlyCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX0hUTUxfRklMRSA9ICJwcm9jZXNzL2dsb3NzYXJ5Lmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9JTkRFWF9IVE1MX0ZJTEUgPSAicHJvY2Vzcy9nbG9zc2FyeS9pbmRleC5odG0iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX05BVklHX0hUTUxfRklMRSA9ICJwcm9jZXNzL2dsb3NzYXJ5L25hdmlnLmh0bSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHhzbCB0ZW1wbGF0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHTE9TU0FSWV9YU0xfRklMRSA9ICJ4c2wvZ2xvc3NhcnkueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX0lOREVYX1hTTF9GSUxFID0gInhzbC9nbG9zc2FyeV9pbmRleC54c2wiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT1NTQVJZX05BVklHX1hTTF9GSUxFID0gInhzbC9nbG9zc2FyeV9uYXZpZy54c2wiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBsaXN0IHRvIGhvbGQgYWxsIGdsb3NzYXJ5IGl0ZW1zLgotCXByaXZhdGUgR2xvc3NhcnlMaXN0IGdsb3NzYXJ5SXRlbXM7Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgR2xvc3NhcnlCdWlsZGVyKCkgewotCi0JfQotCi0JLyoqCi0JICogYnVpbGQgdGhlIGdsb3NzYXJ5IGFuZCBnZW5lcmF0ZSB0aGUgcmVsYXRlZCBmaWxlcy4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcHViRGlyIFN0cmluZwotCSAqIEBwYXJhbSB0aXRsZSBTdHJpbmcgdGhlIHRpdGxlIG9mIHRoZSBnbG9zc2FyeSBwYWdlCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBwdWJEaXIsCi0JCQlTdHJpbmcgdGl0bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWdsb3NzYXJ5SXRlbXMgPSBuZXcgR2xvc3NhcnlMaXN0KHB1YkRpcik7Ci0JCQotCQlnbG9zc2FyeUl0ZW1zLmNsZWFyKCk7Ci0JCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCQkvLyBpdGVyYXRlIHRocnUgY29uZmlndXJhdGlvbiB0byBnZXQgYWxsIGdsb3NzYXJ5IGl0ZW1zCi0JCWl0ZXJhdGUoY29uZmlnLCBtb25pdG9yKTsKLQotCQkvLyBjcmVhdGUgdGhlIGdsb3NzYXJ5IGZpbGUKLQkJY3JlYXRlR2xvc3NhcnkocHViRGlyLCB0aXRsZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIHRocnUgdGhlIGNvbmZpZ3VyYXRpb24gdHJlZSBhbmQgZmluZCBhbGwgdGVybSBkZWZpbml0aW9uIGVsZW1lbnRzCi0JICogaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKE9iamVjdCBvYmosIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIEdldCB0aGUgYWRhcHRlciBmcm9tIHRoZSBmYWN0b3J5LgotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgPSAoSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyKSBhZGFwdGVyRmFjdG9yeQotCQkJCS5hZGFwdChvYmosIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlckNsYXNzKTsKLQotCQkvLyBFaXRoZXIgZGVsZWdhdGUgdGhlIGNhbGwgb3IgcmV0dXJuIG5vdGhpbmcuCi0JCWlmICh0cmVlSXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlDb2xsZWN0aW9uIGl0ZW1zID0gdHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4ob2JqKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdGVtcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQlPYmplY3QgaXRvck9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChpdC5uZXh0KCkpOwotCQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikgewotCQkJCQlpdGVyYXRlKGl0b3JPYmosIG1vbml0b3IpOwotCQkJCX0gZWxzZSBpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWl0ZXJhdGUoaXRvck9iaiwgbW9uaXRvcik7Ci0JCQkJfSBlbHNlIGlmIChpdG9yT2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHsKLQkJCQkJLy8gY3JlYXRlIGEgZ2xvc3NhcnkgZW50cnkgZm9yIHRoZSBUZXJtRGVmaW5pdGlvbgotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oaXRvck9iaik7Ci0JCQkJCWdsb3NzYXJ5SXRlbXMuYWRkKChUZXJtRGVmaW5pdGlvbikgaXRvck9iaik7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlR2xvc3NhcnkoU3RyaW5nIHB1YkRpciwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCUdMT1NTQVJZX1hTTF9GSUxFKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJVbmFibGUgdG8gZ2V0IGdsb3NzYXJ5IHhzbCB0ZW1wbGF0ZSAiICsgR0xPU1NBUllfWFNMX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgeHNsX3VyaSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQlTdHJpbmdCdWZmZXIgeG1sID0gZ2xvc3NhcnlJdGVtcy5nZXRYbWwoKTsKLQotCQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCBHTE9TU0FSWV9IVE1MX0ZJTEUpOwotCQkJRmlsZSBwYXJlbnQgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmICghcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJcGFyZW50Lm1rZGlycygpOwotCQkJfQotCi0JCQkvLyBnZWVucmF0ZSB0aGUgaHRtbAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcm9wZXJ0aWVzKAotCQkJCQkiL3hzbC9yZXNvdXJjZXMucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkvLyBQcm9wZXJ0aWVzIHhzbFBhcmFtcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQl4c2xQYXJhbXMuc2V0UHJvcGVydHkoInRpdGxlIiwgdGl0bGUpOyAvLyROT04tTkxTLTEkCQkJCi0JCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCQkJLy8gU3RyaW5nIGNvbnRlbnQgPSBzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCi0JCQkvLyBuZWVkIHRvIGRlY29kZSB0aGUgdXJscwotCQkJU3RyaW5nIGNvbnRlbnQgPSBSZXNvdXJjZUhlbHBlci5kZWNvZGVVcmxzSW5Db250ZW50KHN3LmdldEJ1ZmZlcigpCi0JCQkJCS50b1N0cmluZygpKTsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSwgZml4Q29udGVudChjb250ZW50KSk7Ci0KLQkJCS8vIC8vIGZpeCB0aGUgZWxlbWVudCBsaW5rcwotCQkJLy8gRmlsZVdyaXRlciBvdXRwdXQgPSBuZXcgRmlsZVdyaXRlcihmKTsKLQkJCS8vIG91dHB1dC53cml0ZShmaXhDb250ZW50KGNvbnRlbnQpKTsKLQkJCS8vIG91dHB1dC5mbHVzaCgpOwotCQkJLy8gb3V0cHV0LmNsb3NlKCk7Ci0JCQlzdy5jbG9zZSgpOwotCi0JCQkvLyBhbHNvIHNhdmUgdGhlIGdsb3NzYXJ5IG5hdmlnYXRpb24gaGVhZGVyIGh0bWwgZmlsZQotCQkJdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCUdMT1NTQVJZX0lOREVYX1hTTF9GSUxFKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQKLQkJCQkJCS5wcmludGxuKCJVbmFibGUgdG8gZ2V0IGdsb3NzYXJ5IHhzbCB0ZW1wbGF0ZSAiICsgR0xPU1NBUllfSU5ERVhfWFNMX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQl4c2xfdXJpID0gUGxhdGZvcm0ucmVzb2x2ZSh1cmwpLmdldFBhdGgoKTsKLQkJCWYgPSBuZXcgRmlsZShwdWJEaXIsIEdMT1NTQVJZX0lOREVYX0hUTUxfRklMRSk7Ci0JCQlzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCVhTTFRQcm9jZXNzb3IudHJhbnNmb3JtKHhzbF91cmksIHhtbC50b1N0cmluZygpLCB4c2xQYXJhbXMsIHN3KTsKLQkJCXN3LmZsdXNoKCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBjcmVhdGVkLgotCQkJaWYgKCAhZi5leGlzdHMoKSApIHsKLQkJCQlGaWxlIHBmID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKCFwZi5leGlzdHMoKSkgewotCQkJCQlwZi5ta2RpcnMoKTsKLQkJCQl9Ci0JCQkJZi5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0JCQkKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSwgc3cudG9TdHJpbmcoKSk7Ci0KLQkJCXN3LmNsb3NlKCk7Ci0KLQkJCS8vIGFsc28gc2F2ZSB0aGUgZ2xvc3NhcnkgbmF2aWdhdGlvbiBoZWFkZXIgaHRtbCBmaWxlCi0JCQl1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJR0xPU1NBUllfTkFWSUdfWFNMX0ZJTEUpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIlVuYWJsZSB0byBnZXQgZ2xvc3NhcnkgeHNsIHRlbXBsYXRlICIgKyBHTE9TU0FSWV9OQVZJR19YU0xfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJZiA9IG5ldyBGaWxlKHB1YkRpciwgR0xPU1NBUllfTkFWSUdfSFRNTF9GSUxFKTsKLQkJCXN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQotCQkJRmlsZVV0aWwud3JpdGVVVEY4RmlsZShmLmdldEFic29sdXRlUGF0aCgpLCBzdy50b1N0cmluZygpKTsKLQotCQkJc3cuY2xvc2UoKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZml4Q29udGVudChTdHJpbmcgc291cmNlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJTWF0Y2hlciBtID0gUmVzb3VyY2VIZWxwZXIucF9saW5rX3JlZi5tYXRjaGVyKHNvdXJjZSk7Ci0KLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgdXJsdGV4dCA9IG0uZ3JvdXAoMSk7Ci0JCQlTdHJpbmcgbGlua2VkVGV4dCA9IG0uZ3JvdXAoMik7Ci0KLQkJCXVybHRleHQgPSBmaXhVcmxUZXh0KHVybHRleHQpOwotCi0JCQkvLyB1cGRhdGUgdGhlIHVybCB0ZXh0Ci0JCQlTdHJpbmcgdGV4dCA9ICI8YSAiICsgdXJsdGV4dCArICI+IiArIGxpbmtlZFRleHQgKyAiPC9hPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCW0uYXBwZW5kUmVwbGFjZW1lbnQoc2IsIFJlc291cmNlSGVscGVyLnJlZ0V4cEVzY2FwZSh0ZXh0KSk7Ci0JCX0KLQotCQltLmFwcGVuZFRhaWwoc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhVcmxUZXh0KFN0cmluZyB1cmx0ZXh0KSB7Ci0JCVN0cmluZyBndWlkID0gUmVzb3VyY2VIZWxwZXIuZ2V0R3VpZEZyb21VcmwodXJsdGV4dCk7Ci0JCWlmIChndWlkID09IG51bGwpIHsKLQkJCXJldHVybiB1cmx0ZXh0OwotCQl9Ci0KLQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldEN1cnJlbnRMaWJyYXJ5TWFuYWdlcigpOwotCQlNZXRob2RFbGVtZW50IGUgPSBtYW5hZ2VyICE9IG51bGwgPyBtYW5hZ2VyLmdldE1ldGhvZEVsZW1lbnQoZ3VpZCkKLQkJCQk6IG51bGw7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybiB1cmx0ZXh0OwotCQl9Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBUZXJtRGVmaW5pdGlvbiwgdXNlIHRoZSBib29rbWFyayBpbiB0aGUgZmlsZQotCQkvLyBvdGhlcndpc2UsIGZpbmQgdGhlIHBhdGggdG8gdGhlIGVsZW1lbnQKLQkJU3RyaW5nIGhyZWYgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZSBpbnN0YW5jZW9mIFRlcm1EZWZpbml0aW9uKSB7Ci0JCQlocmVmID0gIiMiICsgZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCS8vIG9uZSBsZXZlbCBiYWNrCi0JCQlocmVmID0gIi4uLyIgKyBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSArIFJlc291cmNlSGVscGVyLmdldEZpbGVOYW1lKGUsICIuaHRtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IFJlc291cmNlSGVscGVyLnBfbGlua19ocmVmX3BpY2tlcgotCQkJCS5tYXRjaGVyKCIgIiArIHVybHRleHQgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG0uZmluZCgpKSB7Ci0JCQltLmFwcGVuZFJlcGxhY2VtZW50KHNiLCAiIGhyZWY9XCIiICsgaHJlZiArICJcIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQltLmFwcGVuZFRhaWwoc2IpOwotCi0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiB1cmx0ZXh0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9HbG9zc2FyeUxpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9HbG9zc2FyeUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlMDc1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvR2xvc3NhcnlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuSUxpYnJhcnlSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkNvbnRlbnRSZXNvdXJjZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5SZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotCi0vKioKLSAqIEhvbGRzIGFsbCBnbG9zc2FyeSBpdGVtcyBhbmQgc29ydCB0aGVtIGluIGRlc2lyZWQgb3JkZXIgZ3JvdXBlZCBieSBmaXJzdAotICogbGV0dGVyIG9mIHRoZSBnbG9zc2FyeSBuYW1lIFRPRE86IEFkZCBhIGJyaWVmIGRlc2NyaXB0aW9uIGZvciB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2xvc3NhcnlMaXN0IHsKLQotCS8vIHVzaW5nIHRoZSBkZWZhdWx0IG9yZGVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZXhwbG9yZXIuCi0JLy8gbWF5YmUgYSBzcGVjaWFsIHNvcnRlZCBsaXN0IGxhdGVyLAotCS8vIFRyZWVNYXAgb2YgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgZ2xvc3NhcnkgbWFwIHRvIGEgKFNvcnRlZCkgTGlzdCBvZgotCS8vIGdsb3NzYXJ5IEl0ZW1zCi0JcHJpdmF0ZSBUcmVlTWFwIGl0ZW1NYXAgPSBuZXcgVHJlZU1hcCgpOwotCi0JcHJpdmF0ZSBTdHJpbmcgcHViRGlyOwotCQotCS8qKgotCSAqIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKgotCSAqLwotCXB1YmxpYyBHbG9zc2FyeUxpc3QoU3RyaW5nIHB1YkRpcikgewotCQl0aGlzLnB1YkRpciA9IHB1YkRpcjsKLQl9Ci0KLQkvKioKLQkgKiBpbml0aWFsaXplIHRoZSBsaXN0Ci0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaXRlbU1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIFRlcm1EZWZpbml0aW9uIGludG8gdGhlIGdsb3NzYXJ5IGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBUZXJtRGVmaW5pdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChUZXJtRGVmaW5pdGlvbiBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gVG5nVXRpbC5nZXRQcmVzZW50YXRpb25OYW1lKGVsZW1lbnQpOwotCQlTdHJpbmcgZ3JvdXAgPSAiIiArIG5hbWUuY2hhckF0KDApOyAvLyROT04tTkxTLTEkCi0JCWdldEl0ZW1MaXN0KGdyb3VwKS5hZGQoZWxlbWVudCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldEl0ZW1MaXN0KFN0cmluZyBncm91cCkgewotCQlncm91cCA9IGdyb3VwLnRvVXBwZXJDYXNlKCk7Ci0JCUxpc3QgbCA9IChMaXN0KSBpdGVtTWFwLmdldChncm91cCk7Ci0JCWlmIChsID09IG51bGwpIHsKLQkJCWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpdGVtTWFwLnB1dChncm91cCwgbCk7Ci0JCX0KLQotCQlyZXR1cm4gbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHhtbCBkb2N1bWVudCBmb3IgdGhlIGxpc3QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZ0J1ZmZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0WG1sKCkgewotCQlYbWxFbGVtZW50IHhlID0gbmV3IFhtbEVsZW1lbnQoIkdsb3NzYXJ5Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzZXQgdGhlIGxhbmd1YWdlIGF0dHJpYnV0ZQotCQlMb2NhbGUgbG9jYWxlID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQkJU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJeGUuc2V0QXR0cmlidXRlKCJsYW5nIiwgbGFuZyk7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gaXRlbU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBncm91cCA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJTGlzdCBpdGVtcyA9IChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0JCQkvLyBjcmVhdGUgYSBib29rbWFyayBmb3IgdGhlIGdyb3VwCi0JCQl4ZS5uZXdDaGlsZCgiaXRlbSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmFtZSIsIGdyb3VwKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInByZXNlbnRhdGlvbk5hbWUiLCBncm91cCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJuYXZpZ2F0aW9uLW1hcmsiLCAidHJ1ZSIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkuc2V0QXR0cmlidXRlKCJjb250ZW50IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJLy8gdGhlbiBjcmVhdGUgZW50cnkgZm9yIGVhY2ggaXRlbQotCQkJZm9yIChJdGVyYXRvciBpdEl0ZW0gPSBpdGVtcy5pdGVyYXRvcigpOyBpdEl0ZW0uaGFzTmV4dCgpOykgewotCQkJCVRlcm1EZWZpbml0aW9uIGVsZW1lbnQgPSAoVGVybURlZmluaXRpb24pIGl0SXRlbS5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgcHJlc2VudGF0aW9uTmFtZSA9IFRuZ1V0aWwuZ2V0UHJlc2VudGF0aW9uTmFtZShlbGVtZW50KTsKLQkJCQlTdHJpbmcgY29udGVudCA9IGVsZW1lbnQuZ2V0UHJlc2VudGF0aW9uKCkuZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkJCQkvLyBzY2FuIHRoZSBjb250ZW50IGFuZCBjb3B5IGltYWdlcyBpZiBhbnkKLQkJCQlzY2FuQ29udGVudEZvclJlc291cmNlcyhlbGVtZW50LCBjb250ZW50LCBSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KSk7Ci0KLQkJCQkvLyBmaXggdGhlIGxpbmtzIGluIHRoZSBjb250ZW50Ci0JCQkJY29udGVudCA9IFJlc291cmNlSGVscGVyLmZpeENvbnRlbnRVcmxQYXRoKGNvbnRlbnQsCi0JCQkJCQlSZXNvdXJjZUhlbHBlci5nZXRFbGVtZW50UGF0aChlbGVtZW50KSwKLQkJCQkJCUdsb3NzYXJ5QnVpbGRlci5HTE9TU0FSWV9CQUNLUEFUSCk7Ci0JCQkJCi0JCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgbmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgicHJlc2VudGF0aW9uTmFtZSIsIHByZXNlbnRhdGlvbk5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCBjb250ZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHhlLnRvWG1sKCk7Ci0JfQotCi0JLyoqCi0JICogU2NhbnMgdGhlIGNvbnRlbnQgZm9yIHJlc291cmNlIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNjYW5Db250ZW50Rm9yUmVzb3VyY2VzKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBjb250ZW50LAotCQkJU3RyaW5nIGNvbnRlbnRQYXRoKSB7Ci0JCUNvbnRlbnRSZXNvdXJjZVNjYW5uZXIgc2Nhbm5lciA9IGdldFNjYW5uZXIob3duZXIpOwotCQlpZiAoIHNjYW5uZXIgIT0gbnVsbCApIHsKLQkJCXNjYW5uZXIucmVzb2x2ZVJlc291cmNlcyhvd25lciwgY29udGVudCwgY29udGVudFBhdGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVzb3VyY2Ugc2Nhbm5lciBmb3IgdGhlIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBDb250ZW50UmVzb3VyY2VTY2FubmVyIGdldFNjYW5uZXIoTWV0aG9kRWxlbWVudCBvd25lcikgewotCQlJTGlicmFyeVJlc291cmNlTWFuYWdlciByZXNNZ3IgPSBSZXNvdXJjZUhlbHBlci5nZXRSZXNvdXJjZU1ncihvd25lcik7Ci0JCWlmICggcmVzTWdyID09IG51bGwgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIHJvb3RDb250ZW50UGF0aCA9IHJlc01nci5nZXRMb2dpY2FsUGx1Z2luUGF0aChvd25lcik7Ci0JCUZpbGUgc3JjX3Jvb3QgPSBuZXcgRmlsZShyZXNNZ3IuZ2V0UGh5c2ljYWxQbHVnaW5QYXRoKG93bmVyKSk7Ci0JCUZpbGUgdGd0X3Jvb3QgPSBuZXcgRmlsZSh0aGlzLnB1YkRpciwgcm9vdENvbnRlbnRQYXRoKTsKLQkJQ29udGVudFJlc291cmNlU2Nhbm5lciBzY2FubmVyID0gbmV3IENvbnRlbnRSZXNvdXJjZVNjYW5uZXIoc3JjX3Jvb3QsIHRndF9yb290LCByb290Q29udGVudFBhdGgsIG51bGwpOwotCi0JCXJldHVybiBzY2FubmVyOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9JU2l0ZUdlbmVyYXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0lTaXRlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNmRlMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0lTaXRlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkJvb2ttYXJrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLQotLyoqCi0gKiBkZWZpbmUgdGhlIGludGVyZmFjZSBmb3Igc2l0ZSBnZW5lcmF0b3IuIAotICogRWFjaCBwdWJsaXNoZXIgc2hvdWxkIGltcGxlbWVudCBhIHNpdGUgZ2VuZXJhdG9yIHRvIGhhbmRsZSB0aGUgc2l0ZSBnZW5lcmF0aW9uIHByb3Blcmx5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU2l0ZUdlbmVyYXRvciB7Ci0JCQkKLQlwdWJsaWMgdm9pZCBwcmVQdWJsaXNoKCkgdGhyb3dzIEV4Y2VwdGlvbjsKLQlwdWJsaWMgdm9pZCBwb3N0UHVibGlzaCgpIHRocm93cyBFeGNlcHRpb247Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZVB1Ymxpc2hlZEJvb2ttYXJrcyhMaXN0IGJvb2ttYXJrcywgQm9va21hcmsgZGVmYXVsdFZpZXcpIHRocm93cyBFeGNlcHRpb247Ci0KLQlwdWJsaWMgSHRtbEJ1aWxkZXIgZ2V0SHRtbEJ1aWxkZXIoKTsKLQlwdWJsaWMgUHVibGlzaE9wdGlvbnMgZ2V0UHVibGlzaE9wdGlvbnMoKTsKLQlwdWJsaWMgU3RyaW5nIGdldEluZGV4RmlsZVBhdGgoKTsKLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVJY29uUGF0aCgpOyAKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvSW5kZXhCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvSW5kZXhCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjliMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5YU0xUUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5UbmdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbmZpZ3VyYXRpb24uR3VpZGFuY2VJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5QdWJsaXNoaW5nUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0KLS8qKgotICogQnVpbGQgdGhlIGdsb3NzYXJ5IGZpbGUgZm9yIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluZGV4QnVpbGRlciB7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MgPSBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3M7Ci0KLQkvLyBnZW5lcmF0ZWQgZ2xvc3NhcnkgaHRtbCBmaWxlIHJlbGF0aXZlIHRvIHRoZSBwdWJsaXNoaW5nIGRpcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9IVE1MX0ZJTEUgPSAiaW5kZXgvY29udGVudHMuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX05BVklHX0hUTUxfRklMRSA9ICJpbmRleC9uYXZpZy5odG0iOyAvLyROT04tTkxTLTEkCi0KLQkvLyB4c2wgdGVtcGxhdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERVhfWFNMX0ZJTEUgPSAieHNsL2luZGV4X2NvbnRlbnRzLnhzbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9OQVZJR19YU0xfRklMRSA9ICJ4c2wvaW5kZXhfbmF2aWcueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gbGlzdCB0byBob2xkIGFsbCBnbG9zc2FyeSBpdGVtcy4KLQlwcml2YXRlIEluZGV4TGlzdCBpbmRleEl0ZW1zID0gbmV3IEluZGV4TGlzdCgpOwotCi0JLyoqCi0JICogZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIEluZGV4QnVpbGRlcigpIHsKLQotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBpbmRleCBmb3IgdGhlIHB1Ymxpc2hlZCBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcgTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBwdWJEaXIgU3RyaW5nCi0JICogQHBhcmFtIHRpdGxlIFN0cmluZyB0aGUgdGl0bGUgZm9yIHRoZSBnbG9zc2FyeSBpbmRleCBwYWdlCi0JICogQHBhcmFtIG1vbml0b3IgSVByb2dyZXNzTW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFN0cmluZyBwdWJEaXIsCi0JCQlTdHJpbmcgdGl0bGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpbmRleEl0ZW1zLmNsZWFyKCk7Ci0JCUlGaWx0ZXIgY29uZmlnRmlsdGVyID0gbmV3IENvbmZpZ3VyYXRpb25GaWx0ZXIoY29uZmlnKTsKLQkJYWRhcHRlckZhY3RvcnkgPSBUbmdBZGFwdGVyRmFjdG9yeS5JTlNUQU5DRQotCQkJCS5nZXRDb25maWd1cmF0aW9uVmlld19BZGFwdGVyRmFjdG9yeShjb25maWdGaWx0ZXIpOwotCQkvLyBpdGVyYXRlIHRocnUgY29uZmlndXJhdGlvbiB0byBnZXQgYWxsIGdsb3NzYXJ5IGl0ZW1zCi0JCWl0ZXJhdGUoY29uZmlnKTsKLQotCQkvLyBjcmVhdGUgdGhlIGdsb3NzYXJ5IGZpbGUKLQkJY3JlYXRlSW5kZXgocHViRGlyLCB0aXRsZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlIHRocnUgdGhlIGNvbmZpZ3VyYXRpb24gdHJlZSBhbmQgZmluZCBhbGwgdGVybSBkZWZpbml0aW9uIGVsZW1lbnRzCi0JICogaW4gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gb2JqCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXByaXZhdGUgdm9pZCBpdGVyYXRlKE9iamVjdCBvYmopIHsKLQkJLy8gR2V0IHRoZSBhZGFwdGVyIGZyb20gdGhlIGZhY3RvcnkuCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciB0cmVlSXRlbUNvbnRlbnRQcm92aWRlciA9IChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIGFkYXB0ZXJGYWN0b3J5Ci0JCQkJLmFkYXB0KG9iaiwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyQ2xhc3MpOwotCi0JCS8vIEVpdGhlciBkZWxlZ2F0ZSB0aGUgY2FsbCBvciByZXR1cm4gbm90aGluZy4KLQkJaWYgKHRyZWVJdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXRlbXMgPSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlci5nZXRDaGlsZHJlbihvYmopOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkvLyBjcmVhdGUgYm9va21hcmsKLQkJCQlPYmplY3QgaXRvck9iaiA9IExpYnJhcnlVdGlsLnVud3JhcChpdC5uZXh0KCkpOwotCQkJCWlmIChpdG9yT2JqIGluc3RhbmNlb2YgR3VpZGFuY2VHcm91cGluZ0l0ZW1Qcm92aWRlcikgewotCQkJCQlpdGVyYXRlKGl0b3JPYmopOwotCQkJCX0gZWxzZSBpZiAoaXRvck9iaiBpbnN0YW5jZW9mIEd1aWRhbmNlSXRlbVByb3ZpZGVyKSB7Ci0JCQkJCWl0ZXJhdGUoaXRvck9iaik7Ci0JCQkJfSBlbHNlIGlmIChpdG9yT2JqIGluc3RhbmNlb2YgVGVybURlZmluaXRpb24pIHsKLQkJCQkJLy8gaW5kZXggdGhlIHRlcm0gZGVmaW5pdGlvbiBvYmplY3RzCi0JCQkJCVRlcm1EZWZpbml0aW9uIHRlcm0gPSAoVGVybURlZmluaXRpb24pIGl0b3JPYmo7Ci0JCQkJCVN0cmluZyBuYW1lID0gdGVybS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBjb250ZW50ID0gImRlZmluaXRpb24gaW4gZ2xvc3NhcnkiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB1cmwgPSAiLi4vZ2xvc3NhcnkvZ2xvc3NhcnkuaHRtIyIgKyB0ZXJtLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleEl0ZW1zLmFkZChuYW1lLCBjb250ZW50LCB1cmwpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluZGV4KFN0cmluZyBwdWJEaXIsIFN0cmluZyB0aXRsZSkgewotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlJTkRFWF9YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBpbmRleCB4c2wgdGVtcGxhdGUgIiArIElOREVYX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIHhzbF91cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCQkJU3RyaW5nQnVmZmVyIHhtbCA9IGluZGV4SXRlbXMuZ2V0WG1sKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oeG1sKTsKLQotCQkJRmlsZSBmID0gbmV3IEZpbGUocHViRGlyLCBJTkRFWF9IVE1MX0ZJTEUpOwotCQkJRmlsZSBwYXJlbnQgPSBmLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmICghcGFyZW50LmV4aXN0cygpKSB7Ci0JCQkJcGFyZW50Lm1rZGlycygpOwotCQkJfQotCi0JCQkvLyBnZWVucmF0ZSB0aGUgaHRtbAotCQkJUHJvcGVydGllcyB4c2xQYXJhbXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJeHNsUGFyYW1zLnNldFByb3BlcnR5KCJ0aXRsZSIsIHRpdGxlKTsgLy8kTk9OLU5MUy0xJAkJCQotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsX3VyaSwgeG1sLnRvU3RyaW5nKCksIHhzbFBhcmFtcywgc3cpOwotCQkJc3cuZmx1c2goKTsKLQkJCVN0cmluZyBjb250ZW50ID0gc3cuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQotCQkJLy8gZml4IHRoZSBlbGVtZW50IGxpbmtzCi0JCQlGaWxlV3JpdGVyIG91dHB1dCA9IG5ldyBGaWxlV3JpdGVyKGYpOwotCQkJb3V0cHV0LndyaXRlKGNvbnRlbnQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQotCQkJLy8gYWxzbyBzYXZlIHRoZSBnbG9zc2FyeSBuYXZpZ2F0aW9uIGhlYWRlciBodG1sIGZpbGUKLQkJCXVybCA9IG5ldyBVUkwoUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFVSTCgpLAotCQkJCQlJTkRFWF9OQVZJR19YU0xfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiVW5hYmxlIHRvIGdldCBnbG9zc2FyeSB4c2wgdGVtcGxhdGUgIiArIElOREVYX05BVklHX1hTTF9GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJeHNsX3VyaSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQlmID0gbmV3IEZpbGUocHViRGlyLCBJTkRFWF9OQVZJR19IVE1MX0ZJTEUpOwotCQkJb3V0cHV0ID0gbmV3IEZpbGVXcml0ZXIoZik7Ci0JCQlYU0xUUHJvY2Vzc29yLnRyYW5zZm9ybSh4c2xfdXJpLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBvdXRwdXQpOwotCQkJb3V0cHV0LmZsdXNoKCk7Ci0JCQlvdXRwdXQuY2xvc2UoKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvSW5kZXhMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvSW5kZXhMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlN2IxOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL0luZGV4TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci0KLS8qKgotICogSG9sZHMgYWxsIGdsb3NzYXJ5IGl0ZW1zIGFuZCBzb3J0IHRoZW0gaW4gZGVzaXJlZCBvcmRlciBncm91cGVkIGJ5IGZpcnN0Ci0gKiBsZXR0ZXIgb2YgdGhlIGdsb3NzYXJ5IG5hbWUgVE9ETzogQWRkIGEgYnJpZWYgZGVzY3JpcHRpb24gZm9yIHRoaXMgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRleExpc3QgewotCi0JLy8gdXNpbmcgdGhlIGRlZmF1bHQgb3JkZXIgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBleHBsb3Jlci4KLQkvLyBtYXliZSBhIHNwZWNpYWwgc29ydGVkIGxpc3QgbGF0ZXIsCi0JLy8gVHJlZU1hcCBvZiB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBnbG9zc2FyeSBtYXAgdG8gYSAoU29ydGVkKSBMaXN0IG9mCi0JLy8gZ2xvc3NhcnkgSXRlbXMKLQlwcml2YXRlIFRyZWVNYXAgaXRlbU1hcCA9IG5ldyBUcmVlTWFwKCk7Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICoKLQkgKi8KLQlwdWJsaWMgSW5kZXhMaXN0KCkgewotCX0KLQotCS8qKgotCSAqIGluaXNsaXplIHRoZSBsaXN0Ci0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaXRlbU1hcC5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhbiBlbnRyeSB0byB0aGUgbGlzdAotCSAqIAotCSAqIEBwYXJhbSB0ZXJtIFN0cmluZwotCSAqIEBwYXJhbSBjb250ZW50IFN0cmluZwotCSAqIEBwYXJhbSB1cmwgU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyB0ZXJtLCBTdHJpbmcgY29udGVudCwgU3RyaW5nIHVybCkgewotCQlJbmRleEl0ZW0gaXRlbSA9IG5ldyBJbmRleEl0ZW0odGVybSwgY29udGVudCwgdXJsKTsKLQkJU3RyaW5nIGdyb3VwID0gIiIgKyBpdGVtLnRlcm1OYW1lLmNoYXJBdCgwKTsgLy8kTk9OLU5MUy0xJAotCQlnZXRJdGVtTGlzdChncm91cCkuYWRkKGl0ZW0pOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRJdGVtTGlzdChTdHJpbmcgZ3JvdXApIHsKLQkJZ3JvdXAgPSBncm91cC50b1VwcGVyQ2FzZSgpOwotCQlMaXN0IGwgPSAoTGlzdCkgaXRlbU1hcC5nZXQoZ3JvdXApOwotCQlpZiAobCA9PSBudWxsKSB7Ci0JCQlsID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXRlbU1hcC5wdXQoZ3JvdXAsIGwpOwotCQl9Ci0KLQkJcmV0dXJuIGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB4bWwgZG9jdW1lbnQgZm9yIHRoZSBsaXN0Ci0JICogCi0JICogQHJldHVybiBTdHJpbmdCdWZmZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldFhtbCgpIHsKLQkJWG1sRWxlbWVudCB4ZSA9IG5ldyBYbWxFbGVtZW50KCJJbmRleCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZm9yIChJdGVyYXRvciBpdCA9IGl0ZW1NYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgZ3JvdXAgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCUxpc3QgaXRlbXMgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLQotCQkJLy8gY3JlYXRlIGEgYm9va21hcmsgZm9yIHRoZSBncm91cAotCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBncm91cCkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwcmVzZW50YXRpb25OYW1lIiwgZ3JvdXApIC8vJE5PTi1OTFMtMSQKLQkJCQkJLnNldEF0dHJpYnV0ZSgibmF2aWdhdGlvbi1tYXJrIiwgInRydWUiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJLnNldEF0dHJpYnV0ZSgiY29udGVudCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIHRoZW4gY3JlYXRlIGVudHJ5IGZvciBlYWNoIGl0ZW0KLQkJCWZvciAoSXRlcmF0b3IgaXRJdGVtID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRJdGVtLmhhc05leHQoKTspIHsKLQkJCQlJbmRleEl0ZW0gaXRlbSA9IChJbmRleEl0ZW0pIGl0SXRlbS5uZXh0KCk7Ci0JCQkJeGUubmV3Q2hpbGQoIml0ZW0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJuYW1lIiwgaXRlbS50ZXJtTmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgicHJlc2VudGF0aW9uTmFtZSIsIGl0ZW0udGVybU5hbWUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoImNvbnRlbnQiLCBpdGVtLmNvbnRlbnQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIGl0ZW0udXJsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHhlLnRvWG1sKCk7Ci0JfQotCi0JY2xhc3MgSW5kZXhJdGVtIHsKLQkJcHVibGljIFN0cmluZyB0ZXJtTmFtZTsKLQotCQlwdWJsaWMgU3RyaW5nIGNvbnRlbnQ7Ci0KLQkJcHVibGljIFN0cmluZyB1cmw7Ci0KLQkJcHVibGljIEluZGV4SXRlbShTdHJpbmcgdGVybU5hbWUsIFN0cmluZyBjb250ZW50LCBTdHJpbmcgdXJsKSB7Ci0JCQl0aGlzLnRlcm1OYW1lID0gdGVybU5hbWU7Ci0JCQl0aGlzLmNvbnRlbnQgPSBjb250ZW50OwotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhZDZjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLyAKLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlcm1EZWZpbml0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGNvbnRlbnQgdmFsaWRhdG9yIGZvciBwdWJsaXNoaW5nIGEgcHJvY2VzcyBjbG9zdXJlLiAKLSAqIFRoZSB2YWxpZGF0b3Igd2lsbCBjaGVjayBlbGVtZW50cyBhZ2FpbnN0IHRoZSBwcm9jZXNzIGNsb3N1cmUgYW5kIGRldGVybWluZSBpZiAKLSAqIGFuIGVsZW1lbnQgc2hvdWxkIGJlIHB1Ymxpc2hlZCBvciBub3QuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU1VSRV9MT0dfRklMRU5BTUUgPSAicHJvY2Vzc0Nsb3N1cmUuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGNsb3N1cmUgZWxlbWVudHMgZm9yIHByb2Nlc3MgcHVibGlzaGluZywgbnVsbCBmb3IgY29uZmlnIHB1Ymxpc2hpbmcKLQlMaXN0IGNsb3N1cmVFbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRmluYWxDbG9zdXJlID0gZmFsc2U7Ci0JCi0vLwkvLyBtYWludGFpbiB0aGUgb2JqZWN0IHJlZmVyZW5jZXMgZ2VuZXJhdGVkIGZyb20gVGFza0Rlc2NyaXB0b3JzCi0vLwkvLyBtYXAgb2Ygb3duZXIgZWxlbWVudCB0byBhIGxpc3Qgb2YgcmVmZXJlbmNlZCBlbGVtZW50cwotLy8JTWFwIG9ialJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmlzRGVidWdnaW5nKCk7Ci0JCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGNsb3N1cmVMb2cgPSBudWxsOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKiBAcGFyYW0gdmFsaWRhdGVFeHRlcm5hbExpbmtzIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKFN0cmluZyBwdWJEaXIsIFB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXN1cGVyKHB1YkRpciwgb3B0aW9ucyk7Ci0JCQotCQljbG9zdXJlTG9nID0gZ2V0U3RyZWFtKENMT1NVUkVfTE9HX0ZJTEVOQU1FKTsKLQkJYmVnaW5DbG9zdXJlTG9nKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBhZGQgdGhlIGVsZW1lbnRzIHRvIHRoZSBwcm9jZXNzIGNsb3N1cmUuCi0JICogQHBhcmFtIGl0ZW1zIExpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDbG9zdXJlRWxlbWVudHMoTGlzdCBpdGVtcykgewotCQkvLyBkbyBub3RoaW5nCi0JCWlmICggY2xvc3VyZUVsZW1lbnRzID09IG51bGwgKSB7Ci0JCQljbG9zdXJlRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJCi0JCWNsb3N1cmVFbGVtZW50cy5hZGRBbGwoaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIAltYWtlIGVsZW1lbnQgY2xvc3VyZSAKLQkgKiAgYWxsIHRoZSBwdWJsaXNoZWQgYW5kIHJlZmVyZW5jZWQgZWxlbWVudHMgYXJlIHRoZSBlbGVtZW50IGNsb3N1cmUuIAotCSAqICBzaW5jZSB0aGV5IGFyZSBhbGwgdGhlIGVsZW1lbnRzIHJlZmVyZW5jZWQgYnkgdGhlIHByb2Nlc3NlcyBhbmQgdGhlaXIgcmVsYXRlZCBwcm9jZXNzIGVsZW1lbnRzLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYWtlRWxlbWVudENsb3N1cmUoKSB7Ci0JCXRoaXMuaXNGaW5hbENsb3N1cmUgPSB0cnVlOwotCQkKLQkJZW5kQ2xvc3VyZUxvZygpOwotCQkKLQkJLy8gdGVzdAotCQlpZiAoIGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT0gQ2xvc3VyZSBlbGVtZW50cyA9PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2xvc3VyZUVsZW1lbnRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKChNZXRob2RFbGVtZW50KWl0Lm5leHQoKSkpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09IENsb3N1cmUgZWxlbWVudHMgZW5kID09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBjaGVjayBpZiBhIGNsb3N1cmUgaXMgY3JlYXRlZCBvciBub3QuCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2xvc3VyZSgpIHsKLQkJcmV0dXJuIChjbG9zdXJlRWxlbWVudHMgIT0gbnVsbCkgJiYgKGNsb3N1cmVFbGVtZW50cy5zaXplKCkgPiAwKTsKLQl9Ci0JCi0JLyoqCi0JICogZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50IGlzIGluIHRoZSBwcm9jZXNzIGVsZW1lbnQgY2xvc3VyZSBvciBub3QKLQkgKiBUaGUgcHJvY2VzcyBlbGVtZW50IGNsb3N1cmUgY29udGFpbnMgYWxsIHRoZSBwcm9jZXNzIGVsZW1lbnRzIG9mIHRoZSBzZWxlY3RlZCBwcm9jZXNzZXMsIAotCSAqIHBsdXMgYWxsIHRoZSBjb250ZW50IGVsZW1lbnRzIHRob3NlIGVsZW1lbnRzIHJlZmVyZW5jZWQuCi0JICogCi0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGluQ2xvc3VyZShNZXRob2RFbGVtZW50IGUpIHsKLQkJCi0JCWlmICggZSA9PSBudWxsICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoICFoYXNDbG9zdXJlKCkgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYgKCBlIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5ICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCS8vIDE2NjA0OCAtIGNoZWNrLWl0ZW1zLCB0YXNrLXN0ZXBzIGRvbid0IGFwcGVhciB3aGVuIHVzaW5nIHRoZSBwdWJsaXNoaW5nIHR5cGUgInB1Ymxpc2ggdGhlIHByb2Nlc3NlcyBzZWxlY3RlZCBiZWxvdyIKLQkJaWYgKCBDb25maWd1cmF0aW9uSGVscGVyLmlzRGVzY3JpcHRpb25FbGVtZW50KGUpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICggY2xvc3VyZUVsZW1lbnRzLmNvbnRhaW5zKGUpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWlmICggIShlIGluc3RhbmNlb2YgR3VpZGFuY2UpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoIGUgaW5zdGFuY2VvZiBQcmFjdGljZSAKLQkJCQl8fCBlIGluc3RhbmNlb2YgUm9hZG1hcCAKLQkJCQl8fCBlIGluc3RhbmNlb2YgU3VwcG9ydGluZ01hdGVyaWFsIAotCQkJCXx8IGUgaW5zdGFuY2VvZiBUZXJtRGVmaW5pdGlvbiApCi0JCXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JfQotCQotCS8qKgotCSAqIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGRpc2NhcmRlZCBvciBub3QKLQkgKiBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZSB0cmVhdGVkIGFzIG91dCBzaWRlIHRoZSBjb25maWd1cnNhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBvd25lciBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIE9iamVjdCBFU3RydWN0dXJhbEZlYXR1cmUgb3IgT3Bwb3NpdGVGZWF0dXJlCi0JICogQHBhcmFtIGUgTWV0aG9kRWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBjaGVja2VkCi0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ybWMubGlicmFyeS5sYXlvdXQuSUNvbnRlbnRWYWxpZGF0b3IjaXNEaXNjYXJkZWQob3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50LCBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNjYXJkZWQoTWV0aG9kRWxlbWVudCBvd25lciwgT2JqZWN0IGZlYXR1cmUsIE1ldGhvZEVsZW1lbnQgZSkgewotCQotCQlpZiAoIG93bmVyID09IG51bGwgKSB7Ci0JCQlvd25lciA9IGRlZmF1bHRUYXJnZXQ7Ci0JCX0gZWxzZSBpZiAoIGRlZmF1bHRUYXJnZXQgIT0gbnVsbCAmJiBvd25lciAhPSBkZWZhdWx0VGFyZ2V0ICkgewotCQkJCi0JCQlzdXBlci5sb2dXYXJuaW5nKCJUYXJnZXQgbWlzbWF0Y2giICsgTGlicmFyeVV0aWwuZ2V0VHlwZU5hbWUob3duZXIpICsgIjwtLS0+IiArIExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGRlZmF1bHRUYXJnZXQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJCi0JCWlmICggc3VwZXIuaXNEaXNjYXJkZWQob3duZXIsIGZlYXR1cmUsIGUpICkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWJvb2xlYW4gaW5DbHMgPSBpbkNsb3N1cmUoZSk7Ci0JCWlmICghaW5DbHMgJiYgIWlzRmluYWxDbG9zdXJlICkgewotCQkJLy8gaWYgdGhlIGNsb3N1cmUgaXMgbm90IGZpbmFsLCB0aGVuIGlmIHRoZSBvd25lciBpcyBpbiBjbG9zdXJlIGFuZCB0aGUgZWxlbWVudCBpcyBhIEd1aWRhbmNlLCAKLQkJCS8vIHRoaXMgZWxlbWVudCBpcyBhbHNvIGluIGNsb3N1cmUKLQkJCWluQ2xzID0gaW5DbG9zdXJlKG93bmVyKSAmJiAoZSBpbnN0YW5jZW9mIEd1aWRhbmNlKTsKLQkJfQotCQkKLQkJaWYgKCAhaW5DbHMgKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLS8vCQkvLyBzcGVjaWFsIGhhbmRsaW5nIGZvciBUYXNrcwotLy8JCWlmICggb3duZXIgaW5zdGFuY2VvZiBUYXNrICkgewotLy8JCQlpZiAoIGZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHx8IAotLy8JCQkJCWZlYXR1cmUgPT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpIHx8Ci0vLwkJCQkJZmVhdHVyZSA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSB8fCAKLS8vCQkJCQlmZWF0dXJlID09IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfT3V0cHV0KCkgKSB7Ci0vLwkJCQlMaXN0IHJlZnMgPSAoTGlzdClvYmpSZWZlcmVuY2VzLmdldChvd25lcik7Ci0vLwkJCQlpZiAoIHJlZnMgIT0gbnVsbCAmJiAhcmVmcy5jb250YWlucyhlKSApIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogZGlzcG9zZSB0aGUgb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCi0JCWlmICggY2xvc3VyZUVsZW1lbnRzICE9IG51bGwgKSB7Ci0JCQljbG9zdXJlRWxlbWVudHMuY2xlYXIoKTsKLQkJfQotCQkKLS8vCQlpZiAoIG9ialJlZmVyZW5jZXMgIT0gbnVsbCApIHsKLS8vCQkJb2JqUmVmZXJlbmNlcy5jbGVhcigpOwotLy8JCX0KLQkJCi0JCWlmICggY2xvc3VyZUxvZyAhPSBudWxsICkgewotCQkJY2xvc3VyZUxvZy5jbG9zZSgpOwotCQkJY2xvc3VyZUxvZyA9IG51bGw7Ci0JCX0KLQkJCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBiZWdpbkNsb3N1cmVMb2coKSB7Ci0JCWNsb3N1cmVMb2cucHJpbnRsbigiPHRhYmxlPiIpOyAvLyROT04tTkxTLTEkCi0JCWFkZExvZ0VudHJ5KCI8Yj5FbGVtZW50PC9iPiIsICI8Yj5SZWZlcmVuY2VkIEJ5PC9iPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuZENsb3N1cmVMb2coKSB7Ci0JCWNsb3N1cmVMb2cucHJpbnRsbigiPC90YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTG9nRW50cnkoU3RyaW5nIHN0cjEsIFN0cmluZyBzdHIyKSB7Ci0JCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQliLmFwcGVuZCgiPHRyPjx0ZD4iKS5hcHBlbmQoc3RyMSkuYXBwZW5kKCI8L3RkPjx0ZD4iKS5hcHBlbmQoc3RyMikuYXBwZW5kKCI8L3RkPjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWNsb3N1cmVMb2cucHJpbnRsbihiKTsKLQl9Ci0JCi0JLyoqCi0JICogbG9nIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG93bmVyIE1ldGhvZEVsZW1lbnQgdGhlIHJlZmVyZW5jaW5nIGVsZW1lbnQKLQkgKiBAcGFyYW0gZSBNZXRob2RFbGVtZW50IHRoZSByZWZlcmVuY2VkIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgTWV0aG9kRWxlbWVudCBlKQotCXsKLQkJc3VwZXIubG9nUmVmZXJlbmNlKG93bmVyLCBlKTsKLQkJaWYgKCBlIGluc3RhbmNlb2YgRGVzY3JpcHRvciApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCAhaXNGaW5hbENsb3N1cmUgJiYgY2xvc3VyZUxvZyAhPSBudWxsKSB7Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKCBvd25lciBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQgKSB7Ci0JCQkJYi5hcHBlbmQoZ2V0QnJlYWtkb3duRWxlbWVudExhYmVsKChCcmVha2Rvd25FbGVtZW50KW93bmVyKSk7Ci0JCQl9IGVsc2UgaWYgKCBvd25lciAhPSBudWxsICkgewotCQkJCWIuYXBwZW5kKExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKG93bmVyKSk7Ci0JCQl9Ci0JCQkKLQkJCWFkZExvZ0VudHJ5KExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGUpLCBiLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGdldEJyZWFrZG93bkVsZW1lbnRMYWJlbChCcmVha2Rvd25FbGVtZW50IGUpIHsKLQkJU3RyaW5nQnVmZmVyIGIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWIuYXBwZW5kKExpYnJhcnlVdGlsLmdldFR5cGVOYW1lKGUpKTsKLQotCQl3aGlsZSAoIChlPWUuZ2V0U3VwZXJBY3Rpdml0aWVzKCkpICE9IG51bGwgKSB7Ci0JCQliLmluc2VydCgwLCBMaWJyYXJ5VXRpbC5nZXRUeXBlTmFtZShlKSArICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIGI7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9Qcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1Byb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGM0MjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1Byb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vIAotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotCi0vKioKLSAqIEVsZW1lbnRSZWFsaXplciBmb3IgcHJvY2VzcyBwdWJsaXNoaW5nLgotICogUmVhbGl6ZXMgdGhlIGVsZW1lbnQgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24sIHJlYWxpemUgb3B0aW9ucywgYW5kIHRoZSBwcm9jZXNzIGNsb3N1cmUuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciBleHRlbmRzIFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIgewotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHZhbGlkYXRvciBQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsIFByb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoY29uZmlnLCB2YWxpZGF0b3IpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3UHJvY2Vzc1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCVByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gKFByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKSBjcmVhdGVFbGVtZW50UmVhbGl6ZXJFeHRlbnNpb24oY29uZmlnLCBQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcl9UeXBlKTsKLQkJaWYgKHJlYWxpemVyID09IG51bGwpIHsKLQkJCXJlYWxpemVyID0gbmV3IFByb2Nlc3NQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKGNvbmZpZywgbnVsbCk7Ci0JCX0KLQkJcmVhbGl6ZXIudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQkKLQkJcmV0dXJuIHJlYWxpemVyOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBlbGVtZW50LiAKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBNZXRob2RFbGVtZW50IHRoZSByZWFsaXplZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQlyZXR1cm4gc3VwZXIucmVhbGl6ZShlbGVtZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogcmVhbGl6ZSB0aGUgbGlzdCBvZiBmZWF0dXJlIHZhbHVlcyBhbmQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHZhbHVlcwotCSAqIFRoZSBuZXcgbWlnaHQgYmUgYSByZS1zb3J0aW5nIG9mIHRoZSBvcmlnaW5hbCBsaXN0IAotCSAqIG9yIHNvbWUgb2YgdGhlIHZhbHVlcyBjYW4gYmUgZmlsdGVyZWQgb3V0LCBkZXBlbmRpbmcgb24gdGhlIGRldGFpbCBpbXBsZW1lbnRhdGlvbgotCSAqIE5vdGU6IHRoZSBsaXN0IHZhbHVlIHBhc3NlZCBpbiBtaWdodCBiZSB1cGRhdGVkIGFzIHdlbGwuCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlIEVTdHJ1Y3R1cmFsRmVhdHVyZQotCSAqIEBwYXJhbSB2YWx1ZXMgTGlzdAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50LCAKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBMaXN0IHZhbHVlcykKLQl7CQkKLQkJTGlzdCBpdGVtcyA9IHN1cGVyLnJlYWxpemUoZWxlbWVudCwgZmVhdHVyZSwgdmFsdWVzKTsKLQkKLS8vCQkvLyBhZGQgdGhlIGZlYXR1cmUgcmVmZXJlbmNlcyBpbiBjYXNlIHRoZSB2YWxpZGF0b3IgbmVlZCBmZWF0dXJlLWJhc2VkIHJlZmVyZW5jZSBpbmZvcm1hdGlvbiwKLS8vCQkvLyBmb3IgZXhhbXBsZSwgd2hlbiBwdWJsaXNoaW5nIHByb2Nlc3MsIHRoZSBvdXRwdXQgV1BzIGluIGEgVGFzayBzaG91bGQgbm90IGJlIHB1Ymxpc2hlZCAKLS8vCQkvLyBpdCBub25lIG9mIHRoZSBUYXNrRGVzY3JpcHRvcnMgZm9yIHRoaXMgdGFzayBoYXMgcmVmZXJlbmNlIHRvIHRoYXQgV1AuCi0vLwkJaWYgKCBlbGVtZW50IGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IgKSB7Ci0vLwkJCVRhc2sgdCA9IChUYXNrKXJlYWxpemUoKChUYXNrRGVzY3JpcHRvcillbGVtZW50KS5nZXRUYXNrKCkpOwotLy8JCQkKLS8vCQkJKChQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IpdmFsaWRhdG9yKS5zZXRFbGVtZW50UmVmZXJlbmNlcyh0LCBpdGVtcyk7Ci0vLwkJCQotLy8JCX0KLQkJCi0JCXJldHVybiBpdGVtczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoSFRNTE9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoSFRNTE9wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1YzE3NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaEhUTUxPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLmF3dC5JbWFnZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuZWxlbWVudHMuQWN0aXZpdHlMYXlvdXQ7Ci0KLS8qKgotICogRXh0ZW5kcyB0YmUgYmFzaWMgcHVibGlzaCBvcHRpb25zIHRvIGluY2x1ZGUgSFRNTCBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hIVE1MT3B0aW9ucyBleHRlbmRzIFB1Ymxpc2hPcHRpb25zIHsKLQotCS8vIFRoZSBIVE1MIHRpdGxlLgotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQkvLyBUaGUgYWJvdXQgSFRNTC4KLQlwcm90ZWN0ZWQgU3RyaW5nIGFib3V0SFRNTDsKLQotCS8vIFRoZSBmZWVkYmFjayBVUkwuCi0JcHJvdGVjdGVkIFN0cmluZyBmZWVkYmFja1VSTDsKLQotCS8vIFB1Ymxpc2ggZ2xvc3Nhcnkgb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hHbG9zc2FyeTsKLQotCS8vIFB1Ymxpc2ggaW5kZXggb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hJbmRleDsKLQotCS8vIFRoZSBiYW5uZXIgaW1hZ2UuCi0JcHJvdGVjdGVkIFN0cmluZyBiYW5uZXJJbWFnZTsKLQkKLQlwcm90ZWN0ZWQgaW50IGJhbm5lckltYWdlSGVpZ2h0ID0gNjc7IC8vIGJhbm5lciBpbWFnZSBoZWlnaHQsIGNhbiB3ZSBhdXRvIGNhbGMgaXQ/Pz8KLQotCS8vIENoZWNrIGV4dGVybmFsIGxpbmtzIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja0V4dGVybmFsTGlua3M7Ci0KLQkvLyBDb252ZXJ0IGJyb2tlbiBsaW5rcyB0byBwbGFpbiB0ZXh0IG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb252ZXJ0QnJva2VuTGlua3M7Ci0KLQkvLyBQdWJsaXNoIEphdmFTY3JpcHQgbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoSmF2YVNjcmlwdFRyZWUgPSB0cnVlOwotCi0JLy8gUHVibGlzaCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbiBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaER5bmFtaWNXZWJBcHA7Ci0KLQkvLyBUaGUgZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gbmFtZS4KLQlwcm90ZWN0ZWQgU3RyaW5nIGR5bmFtaWNXZWJBcHBOYW1lOwotCi0JLy8gSW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZVNlcnZsZXRTZWFyY2g7Ci0KLQkvLyBkZWZpbmUgdGhlIGRlZmF1bHQgYWN0aXZpdHkgdGFiCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0QWN0aXZpdHlUYWIgPSBBY3Rpdml0eUxheW91dC5UQUJfTkFNRV9BQ1RJVklUWV9XQlM7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUHVibGlzaEhUTUxPcHRpb25zKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hIVE1MT3B0aW9ucyhQdWJsaXNoT3B0aW9ucyBvcHRpb25zKSB7Ci0JCXRoaXMucHVibGlzaERpciA9IG9wdGlvbnMuZ2V0UHVibGlzaERpcigpOwotCQl0aGlzLnByb2Nlc3NlcyA9IG9wdGlvbnMuZ2V0UHJvY2Vzc2VzKCk7Ci0JCXRoaXMucHVibGlzaENvbmZpZ3VyYXRpb24gPSBvcHRpb25zLmlzUHVibGlzaENvbmZpZ3VyYXRpb24oKTsKLQkJdGhpcy5wdWJsaXNoUHJvY2VzcyA9IG9wdGlvbnMuaXNQdWJsaXNoUHJvY2VzcygpOwotCQl0aGlzLnB1Ymxpc2hVbm9wZW5BREQgPSBvcHRpb25zLmlzUHVibGlzaFVub3BlbkFERCgpOwotCQl0aGlzLnB1Ymxpc2hCYXNlQUQgPSBvcHRpb25zLmlzUHVibGlzaEJhc2VBRCgpOwotCQl0aGlzLnB1Ymxpc2hMaWdodFdlaWdodFRyZWUgPSBvcHRpb25zLmlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpOwotCQl0aGlzLnB1Ymxpc2hFbXB0eUNhdGVnb3JpZXMgPSBvcHRpb25zLmlzUHVibGlzaEVtcHR5Q2F0ZWdvcmllcygpOwotCQl0aGlzLnNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycyA9IG9wdGlvbnMKLQkJCQkuaXNTaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMoKTsKLQkJdGhpcy5zaG93UmVsYXRlZERlc2NyaXB0b3JzID0gb3B0aW9ucy5pc1Nob3dSZWxhdGVkRGVzY3JpcHRvcnMoKTsKLQkJdGhpcy5zaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlID0gb3B0aW9ucwotCQkJCS5pc1Nob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWUoKTsKLQkJdGhpcy5wdWJsaXNoRW1wdHlDYXRlZ29yaWVzID0gb3B0aW9ucy5pc1B1Ymxpc2hFbXB0eUNhdGVnb3JpZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHRpdGxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEhUTUwgdGl0bGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgSFRNTCB0aXRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIHRpdGxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBBYm91dCBIVE1MLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEFib3V0IEhUTUwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFib3V0SFRNTCgpIHsKLQkJcmV0dXJuIGFib3V0SFRNTDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBBYm91dCBIVE1MLgotCSAqIAotCSAqIEBwYXJhbSBhYm91dEhUTUwKLQkgKiAgICAgICAgICAgIHRoZSBBYm91dCBIVE1MCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWJvdXRIVE1MKFN0cmluZyBhYm91dEhUTUwpIHsKLQkJdGhpcy5hYm91dEhUTUwgPSBhYm91dEhUTUw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVlZGJhY2sgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZlZWRiYWNrIFVSTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmVlZGJhY2tVUkwoKSB7Ci0JCXJldHVybiBmZWVkYmFja1VSTDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWVkYmFjayBVUkwuCi0JICogCi0JICogQHBhcmFtIGZlZWRiYWNrVVJMCi0JICogICAgICAgICAgICB0aGUgZmVlZGJhY2sgVVJMCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVlZGJhY2tVUkwoU3RyaW5nIGZlZWRiYWNrVVJMKSB7Ci0JCXRoaXMuZmVlZGJhY2tVUkwgPSBmZWVkYmFja1VSTDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGdsb3NzYXJ5IG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnbG9zc2FyeSBuZWVkcyB0byBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hHbG9zc2FyeSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hHbG9zc2FyeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGdsb3NzYXJ5IG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEdsb3NzYXJ5Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaCB0aGUgZ2xvc3NhcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaXNoR2xvc3NhcnkoYm9vbGVhbiBwdWJsaXNoR2xvc3NhcnkpIHsKLQkJdGhpcy5wdWJsaXNoR2xvc3NhcnkgPSBwdWJsaXNoR2xvc3Nhcnk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBpbmRleCBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgaW5kZXggbmVlZHMgdG8gYmUgcHVibGlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoSW5kZXgoKSB7Ci0JCXJldHVybiBwdWJsaXNoSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBpbmRleCBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hJbmRleAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggdGhlIGluZGV4Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEluZGV4KGJvb2xlYW4gcHVibGlzaEluZGV4KSB7Ci0JCXRoaXMucHVibGlzaEluZGV4ID0gcHVibGlzaEluZGV4OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhbm5lciBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYW5uZXIgaW1hZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhbm5lckltYWdlKCkgewotCQlyZXR1cm4gYmFubmVySW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFubmVyIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBiYW5uZXJJbWFnZQotCSAqICAgICAgICAgICAgdGhlIGJhbm5lciBpbWFnZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhbm5lckltYWdlKFN0cmluZyBiYW5uZXJJbWFnZSkgewotCQl0aGlzLmJhbm5lckltYWdlID0gYmFubmVySW1hZ2U7Ci0JCQotCQkvLyBzZXQgdGhlIGhlaWdodCBvZiB0aGUgYmFubmVyCi0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJRmlsZSBmID0gbmV3IEZpbGUodGhpcy5iYW5uZXJJbWFnZSk7Ci0JCWlmICggZi5leGlzdHMoKSApIHsKLQkJCXRyeSB7Ci0JCQkJaW1hZ2UgPSBJbWFnZUlPLnJlYWQoZik7Ci0JCQkJaWYgKCBpbWFnZSAhPSBudWxsICkgewotCQkJCQlpbnQgaGVpZ2h0ID0gaW1hZ2UuZ2V0SGVpZ2h0KG51bGwpOwotCQkJCQlpZiAoIGhlaWdodCA+IDAgKSB7Ci0JCQkJCQl0aGlzLmJhbm5lckltYWdlSGVpZ2h0ID0gaGVpZ2h0OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4ICkgewotCQkJCS8vIGVycm9yIHJlYWQgdGhlIGZpbGUsIGlnbm9yZSBlcnJvciBhbmQgdXNlIHRoZSBkZWZhdWx0IGJhbm5lciBoZWlnaHQKLQkJCQk7Ci0JCQl9IGZpbmFsbHkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYmFubmVyIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhbm5lciBpbWFnZSBoZWlnaHQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEJhbm5lckltYWdlSGVpZ2h0KCkgewotCQlyZXR1cm4gYmFubmVySW1hZ2VIZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFubmVyIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBiYW5uZXJJbWFnZQotCSAqICAgICAgICAgICAgdGhlIGJhbm5lciBpbWFnZSBoZWlnaHQgaW4gcGl4ZWxzCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFubmVySW1hZ2VIZWlnaHQoaW50IGJhbm5lckltYWdlaGVpZ2h0KSB7Ci0JCXRoaXMuYmFubmVySW1hZ2VIZWlnaHQgPSBiYW5uZXJJbWFnZWhlaWdodDsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY2hlY2sgZXh0ZXJuYWwgbGlua3Mgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGV4dGVybmFsIGxpbmtzIG5lZWQgdG8gYmUgY2hlY2tlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tFeHRlcm5hbExpbmtzKCkgewotCQlyZXR1cm4gY2hlY2tFeHRlcm5hbExpbmtzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNoZWNrIGV4dGVybmFsIGxpbmtzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY2hlY2tFeHRlcm5hbExpbmtzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgY2hlY2sgdGhlIGV4dGVybmFsIGxpbmtzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tFeHRlcm5hbExpbmtzKGJvb2xlYW4gY2hlY2tFeHRlcm5hbExpbmtzKSB7Ci0JCXRoaXMuY2hlY2tFeHRlcm5hbExpbmtzID0gY2hlY2tFeHRlcm5hbExpbmtzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb252ZXJ0IGJyb2tlbiBsaW5rcyBuZWVkIHRvIGJlCi0JICogICAgICAgICBjb252ZXJ0ZWQgdG8gcGxhaW4gdGV4dAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29udmVydEJyb2tlbkxpbmtzKCkgewotCQlyZXR1cm4gY29udmVydEJyb2tlbkxpbmtzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnZlcnQgYnJva2VuIGxpbmtzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udmVydEJyb2tlbkxpbmtzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgY29udmVydCBicm9rZW4gbGlua3MgdG8gcGxpYW4gdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRCcm9rZW5MaW5rcyhib29sZWFuIGNvbnZlcnRCcm9rZW5MaW5rcykgewotCQl0aGlzLmNvbnZlcnRCcm9rZW5MaW5rcyA9IGNvbnZlcnRCcm9rZW5MaW5rczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIEphdmFTY3JpcHQgbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgSmF2YVNjcmlwdCBuYXZpZ2F0aW9uIHRyZWUgd2lsbCBiZQotCSAqICAgICAgICAgcHVibGlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoSmF2YVNjcmlwdFRyZWUoKSB7Ci0JCXJldHVybiBwdWJsaXNoSmF2YVNjcmlwdFRyZWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBKYXZhU2NyaXB0IG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hKYXZhU2NyaXB0VHJlZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYSBKYXZhU2NyaXB0IG5hdmlnYXRpb24gdHJlZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hKYXZhU2NyaXB0VHJlZShib29sZWFuIHB1Ymxpc2hKYXZhU2NyaXB0VHJlZSkgewotCQl0aGlzLnB1Ymxpc2hKYXZhU2NyaXB0VHJlZSA9IHB1Ymxpc2hKYXZhU2NyaXB0VHJlZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gd2lsbCBiZQotCSAqICAgICAgICAgcHVibGlzaGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaXNoRHluYW1pY1dlYkFwcCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGlzaER5bmFtaWNXZWJBcHAgCi0JCSYmICh0aGlzLmR5bmFtaWNXZWJBcHBOYW1lICE9IG51bGwpCi0JCSYmICh0aGlzLmR5bmFtaWNXZWJBcHBOYW1lLmxlbmd0aCgpID4gMCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbiBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hEeW5hbWljV2ViQXBwCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcHVibGlzaCBhIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaER5bmFtaWNXZWJBcHAoYm9vbGVhbiBwdWJsaXNoRHluYW1pY1dlYkFwcCkgewotCQl0aGlzLnB1Ymxpc2hEeW5hbWljV2ViQXBwID0gcHVibGlzaER5bmFtaWNXZWJBcHA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkeW5hbWljIHdlYiBhcHBsaWNhdGlvbiBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREeW5hbWljV2ViQXBwTmFtZSgpIHsKLQkJcmV0dXJuIGR5bmFtaWNXZWJBcHBOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uIG5hbWUuCi0JICogCi0JICogQHBhcmFtIGR5bmFtaWNXZWJBcHBOYW1lCi0JICogICAgICAgICAgICB0aGUgZHluYW1pYyB3ZWIgYXBwbGljYXRpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREeW5hbWljV2ViQXBwTmFtZShTdHJpbmcgZHluYW1pY1dlYkFwcE5hbWUpIHsKLQkJdGhpcy5keW5hbWljV2ViQXBwTmFtZSA9IGR5bmFtaWNXZWJBcHBOYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluY2x1ZGUgc2VydmxldCBzZWFyY2ggb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaW5jbHVkZSBzZXJ2bGV0IHNlYXJjaCB3aWxsIGJlIGFkZGVkIHRvCi0JICogICAgICAgICB0aGUgcHVibGlzaGVkIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlU2VydmxldFNlYXJjaCgpIHsKLQkJcmV0dXJuIGluY2x1ZGVTZXJ2bGV0U2VhcmNoICYmIGlzUHVibGlzaER5bmFtaWNXZWJBcHAoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbmNsdWRlIHNlcnZsZXQgc2VhcmNoIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZVNlcnZsZXRTZWFyY2gKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBpbmNsdWRlIHNlcnZsZXQgc2VhcmNoIGluIHRoZQotCSAqICAgICAgICAgICAgcHVibGlzaGVkIGR5bmFtaWMgd2ViIGFwcGxpY2F0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5jbHVkZVNlcnZsZXRTZWFyY2goYm9vbGVhbiBpbmNsdWRlU2VydmxldFNlYXJjaCkgewotCQl0aGlzLmluY2x1ZGVTZXJ2bGV0U2VhcmNoID0gaW5jbHVkZVNlcnZsZXRTZWFyY2g7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBkZWZhdWx0IGFjdGl2aXR5IHRhYgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QWN0aXZpdHlUYWIoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBY3Rpdml0eVRhYjsKLQl9Ci0JCi0JLyoqCi0JICogc2V0IHRoZSBkZWZhdWx0IGFjdGl2aXR5IHRhYgotCSAqIEBwYXJhbSB0YWJOYW1lCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2aXR5VGFiKFN0cmluZyB0YWJOYW1lKSB7Ci0JCXRoaXMuZGVmYXVsdEFjdGl2aXR5VGFiID0gdGFiTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBwdWJsaXNoIG9wdGlvbnMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHVibGlzaCBvcHRpb25zIGlzIHZhbGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQlzdXBlci52YWxpZGF0ZSgpOwotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE1hbmFnZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjkwMTdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5EZWJ1Z1RyYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuQm9va21hcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkVsZW1lbnRMYXlvdXRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC5IdG1sQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQudXRpbC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1Jlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleC5EZWZpbml0aW9uT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4LktleVdvcmRJbmRleEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLlB1Ymxpc2hpbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoU2VydmljZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBwdWJsaXNoaW5nIG9mIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoTWFuYWdlciBleHRlbmRzIEFic3RyYWN0UHVibGlzaE1hbmFnZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZV09SRF9ERUZfRklMRSA9ICJrZXl3b3JkaW5kZXhkZWYudHh0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSElOR19SRVBPUlRfWFNMX0ZJTEUgPSAieHNsL1B1Ymxpc2hpbmdSZXBvcnQueHNsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSElOR19SRVBPUlRfSFRNTF9GSUxFID0gIlB1Ymxpc2hpbmdSZXBvcnQuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hNYW5hZ2VyKCkgewotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdFZpZXdCdWlsZGVyIGNyZWF0ZVZpZXdCdWlsZGVyKCkgewotCQkvLyBib29sZWFuIHZhbGlkYXRlRXh0ZXJuYWxMaW5rcyA9IChvcHRpb25zICE9IG51bGwpCi0JCS8vICYmIG9wdGlvbnMuaXNDaGVja0V4dGVybmFsTGlua3MoKTsKLQotCQlQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IgPSBudWxsOwotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBudWxsOwotCQlpZiAoKG9wdGlvbnMgIT0gbnVsbCkgJiYgb3B0aW9ucy5wdWJsaXNoUHJvY2VzcykgewotCQkJdmFsaWRhdG9yID0gbmV3IFByb2Nlc3NQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcihwdWJEaXIsIG9wdGlvbnMpOwotCQkJcmVhbGl6ZXIgPSBQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5uZXdQcm9jZXNzUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihjb25maWcsCi0JCQkJCShQcm9jZXNzUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IpIHZhbGlkYXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQl2YWxpZGF0b3IgPSBuZXcgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IocHViRGlyLCBvcHRpb25zKTsKLQkJCXJlYWxpemVyID0gUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5uZXdQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKGNvbmZpZywgdmFsaWRhdG9yKTsKLQkJfQotCi0JCS8vIHZhbGlkYXRvci5zZXRTaG93QnJva2VuTGlua3Mob3B0aW9ucy5jb252ZXJ0QnJva2VuTGlua3MgPT0gZmFsc2UpOwotCQkvLyB2YWxpZGF0b3Iuc2V0U2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKG9wdGlvbnMKLQkJLy8gLmlzU2hvd01ldGhvZENvbnRlbnRJbkRlc2NyaXB0b3JzKCkpOwotCQkvLyB2YWxpZGF0b3Iuc2V0U2hvd1JlbGF0ZWREZXNjcmlwdG9ycyhvcHRpb25zLnNob3dSZWxhdGVkRGVzY3JpcHRvcnMpOwotCi0JCUVsZW1lbnRMYXlvdXRNYW5hZ2VyIGxheW91dE1nciA9IG5ldyBFbGVtZW50TGF5b3V0TWFuYWdlcihjb25maWcsCi0JCQkJcHViRGlyLCB2YWxpZGF0b3IsIHRydWUpOwotCQlsYXlvdXRNZ3Iuc2V0RWxlbWVudFJlYWxpemVyKHJlYWxpemVyKTsKLQkJSHRtbEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBIdG1sQnVpbGRlcihsYXlvdXRNZ3IpOwotCi0JCWJ1aWxkZXIuZW5hYmxlQ29udGVudFNjYW4odHJ1ZSk7Ci0JCWJ1aWxkZXIuZW5hYmxlVHJlZUJyb3dzZXIodHJ1ZSk7Ci0KLQkJSVNpdGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IERlZmF1bHRTaXRlR2VuZXJhdG9yKGJ1aWxkZXIsIG9wdGlvbnMpOwotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25WaWV3QnVpbGRlcihnZW5lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZVB1Ymxpc2goSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBmaXhPcHRpb25zKG9wdGlvbnMpOwotCi0JCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmluaXRpYWxpemluZ0RpclRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBtYWtlIHN1cmUgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5IGlzIGNyZWF0ZWQKLQkJRmlsZSBmID0gbmV3IEZpbGUodmlld0J1aWxkZXIuZ2V0SHRtbEJ1aWxkZXIoKS5nZXRQdWJsaXNoRGlyKCkpOwotCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCWYubWtkaXJzKCk7Ci0JCX0KLQotCQkvLyBjb3B5IHRoZSBjb25maWd1cmF0aW9uIGZpbGVzCi0JCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmNvcHlpbmdGaWxlc1Rhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJLyoKLQkJICogY29weURvY1Jvb3RGaWxlcygpOyAvLyBjb3B5IGxvY2FsaXplZCBmaWxlcyBjb3B5TG9jYWxpemVkRmlsZXMoKTsgLy8KLQkJICogY29weSB1c2VyIGN1c3RvbWl6ZWQgZmlsZXMgbGFzdCBjb3B5Q3VzdG9taXplZEZpbGVzKCk7Ci0JCSAqLwotCQlnZXRTaXRlR2VuZXJhdG9yKCkucHJlUHVibGlzaCgpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9QdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQkvLyBiZWZvcmUgZG9pbmcgcHVibGlzaGluZywgbG9hZCB0aGUgd2hvbGUgbGlicmFyeSBhbmQgcmVtZW1iZXIgdGhlIHJlc291Y2VzIGxvYWRlZAotCQkvLyBzbyB3ZSBjYW4gdW5sb2FkIHRob3NlIHJlc291cmNlcyBsYXRlciB0byBmcmVlIG1lbW9yeQotCQlDb2xsZWN0aW9uPFJlc291cmNlPiBjaGFuZ2VkUmVzb3VyY2VzID0gbG9hZExpYnJhcnkobW9uaXRvcik7Ci0JCUNvbGxlY3Rpb248RGlhZ3JhbU1hbmFnZXI+IGV4aXN0aW5nTWdycyA9IERpYWdyYW1NYW5hZ2VyLmdldERpYWdyYW1NYW5hZ2VycygpOwotCi0JCS8vIGRvbid0IGNvcHkgYWxsIHRoZSBjb250ZW50IHJlc291cmNlcwotCQkvLyBsZXQgdGhlIHN5c3RlbSBzY2FuIHRoZSBjb250ZW50IGFuZCBjb3B5IG9ubHkgdGhlIHJlcXVpcmVkCi0JCS8vIHJlc291cmNlCi0JCS8vIHZpZXdCdWlsZGVyLmdldEh0bWxCdWlsZGVyKCkuZW5hYmxlQ29udGVudFNjYW4odHJ1ZSk7Ci0JCS8vIHZpZXdCdWlsZGVyLmdldEh0bWxCdWlsZGVyKCkuZW5hYmxlVHJlZUJyb3dzZXIodHJ1ZSk7Ci0KLQkJLy8gZ2VuZXJhdGUgYm9va21hcmtzIGFuZCBwdWJsaXNoZWQgdGhlIGNvbnRlbnRzIGFzIG5lZWRlZAotCQltb25pdG9yLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5nZW5lcmF0aW5nQm9va21hcmtzVGFza19uYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlnZW5lcmF0ZUJvb2ttYXJrcyhtb25pdG9yKTsKLQotCQlTdHJpbmcgdGl0bGUgPSBvcHRpb25zID09IG51bGwgPyAiIiA6IG9wdGlvbnMuZ2V0VGl0bGUoKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsJCQkKLQkJCS8vIGNyZWF0aW5nIGdsb3NzYXJ5Ci0JCQlpZiAob3B0aW9ucyA9PSBudWxsIHx8IG9wdGlvbnMuaXNQdWJsaXNoR2xvc3NhcnkoKSkgewotCQkJCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmdlbmVyYXRpbmdHbG9zc2FyeVRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQluZXcgR2xvc3NhcnlCdWlsZGVyKCkuZXhlY3V0ZShjb25maWcsIHB1YkRpciwgdGl0bGUsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBtYWtlIHN1cmUgdGhlIHJlc291cmNlcyBhcmUgdW5sb2FkZWQgYmVmb3JlIHJldHVybgotCQkvLyBub3cgaXQncyB0aW1lIHRvIHVubG9hZCB0aGUgcmVzb3J1Y2VzCi0JCUNvbGxlY3Rpb248RGlhZ3JhbU1hbmFnZXI+IG5ld01ncnMgPSBEaWFncmFtTWFuYWdlci5nZXREaWFncmFtTWFuYWdlcnMoKTsKLQkJUHVibGlzaGluZ1V0aWwuZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhuZXdNZ3JzLCBleGlzdGluZ01ncnMpOwotCQlQdWJsaXNoaW5nVXRpbC51bmxvYWRSZXNvdXJjZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCWNoYW5nZWRSZXNvdXJjZXMuY2xlYXIoKTsKLQkJZXhpc3RpbmdNZ3JzLmNsZWFyKCk7Ci0JCW5ld01ncnMuY2xlYXIoKTsKLQkJUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsJCi0JCQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGNyZWF0aW5nIGNvbnRlbnQgaW5kZXgKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCB8fCBvcHRpb25zLmlzUHVibGlzaEluZGV4KCkpIHsKLQkJCW1vbml0b3IKLQkJCQkJLnN1YlRhc2soUHVibGlzaGluZ1Jlc291cmNlcy5nZW5lcmF0aW5nQm9va21hcmtJbmRleFRhc2tfbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIG5ldyBJbmRleEJ1aWxkZXIoKS5leGVjdXRlKGNvbmZpZywgcHVibGlzaERpciwgbW9uaXRvcik7Ci0JCQlnZW5lcmF0ZUJvb2ttYXJrSW5kZXgocHViRGlyLCB0aXRsZSwgbW9uaXRvcik7Ci0JCX0KLQotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGVuYWJsZSBzZWFyY2hpbmcKLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCAmJiBvcHRpb25zLmlzUHVibGlzaER5bmFtaWNXZWJBcHAoKQotCQkJCSYmIG9wdGlvbnMuaXNJbmNsdWRlU2VydmxldFNlYXJjaCgpKSB7Ci0JCQkvLyBnZW5lcmF0aW5nIHRoZSBzZWFyY2ggaW5kZXgKLQkJCW1vbml0b3Iuc3ViVGFzayhQdWJsaXNoaW5nUmVzb3VyY2VzLmdlbmVyYXRpbmdTZWFyY2hJbmRleFRhc2tfbmFtZSk7Ci0JCQlTZWFyY2hTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlSW5kZXgocHViRGlyLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3N0UHVibGlzaChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBmaW5hbGx5LCBnZW5lcmF0ZSBhIHJlcG9ydAotCQlnZXRTaXRlR2VuZXJhdG9yKCkucG9zdFB1Ymxpc2goKTsKLQotCQljcmVhdGVXQVJGaWxlKCk7Ci0KLQkJZ2V0UHVibGlzaFJlcG9ydFVybCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUJvb2ttYXJrcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlsb25nIGJlZ2luVGltZSA9IDBMOwotCQlsb25nIHN0YXJ0VGltZSA9IDBMOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQliZWdpblRpbWUgPSBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlMaXN0PEJvb2ttYXJrPiBib29rbWFya3MgPSB2aWV3QnVpbGRlci5idWlsZFZpZXdzKG1vbml0b3IpOwotCQlpZiAocHJvZmlsaW5nKSB7Ci0JCQlEZWJ1Z1RyYWNlLnByaW50KHZpZXdCdWlsZGVyLCAiYnVpbGRWaWV3cyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlCb29rbWFyayBkZWZhdWx0VmlldyA9IHZpZXdCdWlsZGVyLmdldERlZmF1bHRWaWV3KCk7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyAzLiBmaW5hbGx5LCB3cml0ZSB0aGUgcHVibGlzaGVkIGJvb2ttYXJrcyBmaWxlCi0JCWlmIChwcm9maWxpbmcpIHsKLQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWdldFNpdGVHZW5lcmF0b3IoKS53cml0ZVB1Ymxpc2hlZEJvb2ttYXJrcyhib29rbWFya3MsIGRlZmF1bHRWaWV3KTsKLQkJaWYgKHByb2ZpbGluZykgewotCQkJRGVidWdUcmFjZS5wcmludChnZXRTaXRlR2VuZXJhdG9yKCksICJ3cml0ZVB1Ymxpc2hlZEJvb2ttYXJrcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJRGVidWdUcmFjZS5wcmludCh0aGlzLCAiZ2VuZXJhdGVCb29rbWFya3MiLCAvLyROT04tTkxTLTEkCi0JCQkJCShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZ2luVGltZSkgKyAiIG1zIik7IC8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCB0aGUgdXJsIGZvciB0aGUgcHVibGlzaGVkIHNpdGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1Ymxpc2hlZFVybCgpIHsKLQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCVN0cmluZyB1cmwgPSBnZXRTaXRlR2VuZXJhdG9yKCkuZ2V0SW5kZXhGaWxlUGF0aCgpOwotCQkJRmlsZSBmID0gbmV3IEZpbGUodXJsKTsKLQkJCWlmIChmLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHVybDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQm9va21hcmtJbmRleChTdHJpbmcgcHVibGlzaERpciwgU3RyaW5nIHRpdGxlLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0KLQkJCVVSTCB1cmwgPSBuZXcgVVJMKFB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxVUkwoKSwKLQkJCQkJS0VZV09SRF9ERUZfRklMRSk7Ci0JCQlpZiAodXJsID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVuYWJsZSB0byBnZXQgaW5kZXggZGVmaW5pdGlvbiBmaWxlICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlTdHJpbmcgZGVmZmlsZSA9IFBsYXRmb3JtLnJlc29sdmUodXJsKS5nZXRQYXRoKCk7Ci0JCQlTdHJpbmcgY2hhclNldCA9ICJ1dGYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBoZWxwRmlsZSA9IG51bGw7Ci0JCQlLZXlXb3JkSW5kZXhIZWxwZXIgaW5kZXhIZWxwZXIgPSBuZXcgS2V5V29yZEluZGV4SGVscGVyKGRlZmZpbGUsCi0JCQkJCWNoYXJTZXQsIGhlbHBGaWxlKTsKLQkJCURlZmluaXRpb25PYmplY3QgZGVmT2JqID0gaW5kZXhIZWxwZXIubG9hZERlZmluaXRpb24ocHVibGlzaERpcik7Ci0JCQlpZiAoZGVmT2JqICE9IG51bGwpIHsKLQkJCQlkZWZPYmouc2V0d3d3Um9vdChwdWJsaXNoRGlyKTsKLQkJCQlkZWZPYmouc2V0SW5kZXhUaXRsZShQdWJsaXNoaW5nUmVzb3VyY2VzLmluZGV4TGFiZWxfdGV4dAotCQkJCQkJKyAiIC0gIiArIHRpdGxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWluZGV4SGVscGVyLmV4ZWN1dGUobW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGUgdGhlIHB1Ymxpc2hpbmcgcmVwb3J0IGFuZCByZXR1cm4gdGhlIHVybAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSByZXBvcnQgdXJsCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoUmVwb3J0VXJsKCkgewotCQlTdHJpbmcgcHVibGlzaERpciA9IHZpZXdCdWlsZGVyLmdldEh0bWxCdWlsZGVyKCkuZ2V0UHVibGlzaERpcigpOwotCQlTdHJpbmcgZmlsZV9wYXRobmFtZSA9IFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLkxPR1NfRk9MREVSCi0JCQkJKyBGaWxlLnNlcGFyYXRvciArIFBVQkxJU0hJTkdfUkVQT1JUX0hUTUxfRklMRTsKLQkJRmlsZSBmID0gbmV3IEZpbGUocHVibGlzaERpciwgZmlsZV9wYXRobmFtZSk7Ci0JCVN0cmluZyByZXBvcnRfZmlsZSA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmICghZi5leGlzdHMoKSkgewotCQkJRmlsZSBlcnJvckxvZyA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsCi0JCQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLkxPR1NfRk9MREVSICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJCQkrIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLkVSUk9SX0xPR19GSUxFTkFNRSk7Ci0JCQlGaWxlIHdhcm5pbmdMb2cgPSBuZXcgRmlsZShwdWJsaXNoRGlyLAotCQkJCQlQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5MT0dTX0ZPTERFUiArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5XQVJOSU5HX0xPR19GSUxFTkFNRSk7Ci0JCQlGaWxlIGluZm9Mb2cgPSBuZXcgRmlsZShwdWJsaXNoRGlyLAotCQkJCQlQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5MT0dTX0ZPTERFUiArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5JTkZPX0xPR19GSUxFTkFNRSk7Ci0KLQkJCS8vIGdlZW5yYXRlIHRoZSBpbmRleC5odG0KLQkJCVhtbEVsZW1lbnQgcmVwb3J0WG1sID0gbmV3IFhtbEVsZW1lbnQoIlB1Ymxpc2hpbmdSZXBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlyZXBvcnRYbWwubmV3Q2hpbGQoInB1YkRpciIpLnNldEF0dHJpYnV0ZSgicGF0aCIsIHB1Ymxpc2hEaXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoImVycm9yTG9nIikgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCSJuYW1lIiwgUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuRVJST1JfTE9HX0ZJTEVOQU1FKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoInBhdGgiLCAiLi8iICsgZXJyb3JMb2cuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoIndhcm5pbmdMb2ciKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJIm5hbWUiLCBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5XQVJOSU5HX0xPR19GSUxFTkFNRSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwYXRoIiwgIi4vIiArIHdhcm5pbmdMb2cuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoImluZm9Mb2ciKSAvLyROT04tTkxTLTEkCi0JCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJIm5hbWUiLCBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvci5JTkZPX0xPR19GSUxFTkFNRSkgLy8kTk9OLU5MUy0xJAotCQkJCQkuc2V0QXR0cmlidXRlKCJwYXRoIiwgIi4vIiArIGluZm9Mb2cuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCS8vIGRldGFpbCBpbmZvcm1hdGlvbgotCQkJUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yID0gKFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yKSB2aWV3QnVpbGRlcgotCQkJCQkuZ2V0SHRtbEJ1aWxkZXIoKS5nZXRWYWxpZGF0b3IoKTsKLQkJCXJlcG9ydFhtbC5hZGRDaGlsZCh2YWxpZGF0b3IuZ2V0UmVwb3J0KCkpOwotCi0JCQlTdHJpbmcgYnVmZmVyID0gUHVibGlzaGluZ1V0aWwuZ2V0SHRtbChyZXBvcnRYbWwsCi0JCQkJCVBVQkxJU0hJTkdfUkVQT1JUX1hTTF9GSUxFKTsKLQkJCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUocmVwb3J0X2ZpbGUsIGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXBvcnRfZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXQVJGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5pc1B1Ymxpc2hEeW5hbWljV2ViQXBwKCkKLQkJCQkmJiBvcHRpb25zLmdldER5bmFtaWNXZWJBcHBOYW1lKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTZWFyY2hTZXJ2aWNlLmdldEluc3RhbmNlKCkuY3JlYXRlV0FSKHB1YkRpciwKLQkJCQkJb3B0aW9ucy5nZXREeW5hbWljV2ViQXBwTmFtZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaE9wdGlvbnMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZkMDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci0KLS8qKgotICogVGhlIFB1Ymxpc2hpbmcgT3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaE9wdGlvbnMgewotCi0JLy8gVGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCXByb3RlY3RlZCBTdHJpbmcgcHVibGlzaERpcjsKLQotCS8vIFRoZSBsaXN0IG9mIHByb2Nlc3NlcyB0byBiZSBwdWJsaXNoZWQuCi0JcHJvdGVjdGVkIExpc3Q8UHJvY2Vzcz4gcHJvY2Vzc2VzOwotCi0JLy8gUHVibGlzaCBlbnRpcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hDb25maWd1cmF0aW9uOwotCi0JLy8gUHVibGlzaCBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHB1Ymxpc2hQcm9jZXNzOwotCi0JLy8gUHVibGlzaCB1bm9wZW4gYWN0aXZpdHkgZGV0YWlsIGRpYWdyYW1zIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoVW5vcGVuQUREOwotCi0JLy8gUHVibGlzaCBhY3Rpdml0eSBkaWFncmFtIGZvciBiYXNlIGFjdGl2dGllcyB3aXRoIHVubW9kaWZpZWQKLQkvLyBleHRlbnNpb25zIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoQmFzZUFEOwotCi0JLy8gUHVibGlzaCBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlOwotCi0JLy8gU2hvdyBtZXRob2QgY29udGVudCBpbiB0aGUgZGVzY3JpcHRvciBwYWdlcyBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd01ldGhvZENvbnRlbnRJbkRlc2NyaXB0b3JzOwotCi0JLy8gU2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIGluIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0IHBhZ2VzCi0JLy8gb3B0aW9uLgotCXByb3RlY3RlZCBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnM7Ci0KLQkvLyBTaG93IHRhc2sgZGVzY3JpcHRvcnMgaW4gdGhlIG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZTsKLQotCS8vIFB1Ymxpc2ggZW1wdHkgY2F0ZWdvcmllcyBvcHRpb24gKGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIGluIHRoZSBVSSkuCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHVibGlzaEVtcHR5Q2F0ZWdvcmllczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hPcHRpb25zKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggZGlyZWN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIHB1Ymxpc2hlZCBjb250ZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaXNoRGlyKCkgewotCQlyZXR1cm4gcHVibGlzaERpcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaERpcgotCSAqICAgICAgICAgICAgYSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgdGhlIHB1Ymxpc2hlZCBjb250ZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaERpcihTdHJpbmcgcHVibGlzaERpcikgewotCQl0aGlzLnB1Ymxpc2hEaXIgPSBwdWJsaXNoRGlyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpc3Qgb2YgcHJvY2Vzc2VzIHRoYXQgd2lsbCBiZSBwdWJsaXNoZWQuCi0JICogCi0JICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzPiBnZXRQcm9jZXNzZXMoKSB7Ci0JCXJldHVybiBwcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGlzdCBvZiBwcm9jZXNzZXMgdGhhdCB3aWxsIGJlIHB1Ymxpc2hlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc2VzCi0JICogICAgICAgICAgICBhIGNvbGxlY3Rpb24gb2YgPGNvZGU+UHJvY2VzczwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzZXMoTGlzdDxQcm9jZXNzPiBwcm9jZXNzZXMpIHsKLQkJdGhpcy5wcm9jZXNzZXMgPSBwcm9jZXNzZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBtZXRob2QgY29uZmlndXJhdGlvbiBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW50aXJlIG1ldGhvZCBjb25maWd1cmF0aW9uIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBwdWJsaXNoQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwdWJsaXNoIG1ldGhvZCBjb25maWd1cmF0aW9uIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaENvbmZpZ3VyYXRpb24KLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBlbnRpcmUgbWV0aG9kCi0JICogICAgICAgICAgICBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaENvbmZpZ3VyYXRpb24oYm9vbGVhbiBwdWJsaXNoQ29uZmlndXJhdGlvbikgewotCQl0aGlzLnB1Ymxpc2hDb25maWd1cmF0aW9uID0gcHVibGlzaENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvbmUgb3IgbW9yZSBwcm9jZXNzZXMgaW4gYSBtZXRob2QKLQkgKiAgICAgICAgIGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hQcm9jZXNzKCkgewotCQlyZXR1cm4gcHVibGlzaFByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBwcm9jZXNzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaFByb2Nlc3MKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIG9uZSBvciBtb3JlIHByb2Nlc3NlcyBpbiBhCi0JICogICAgICAgICAgICBtZXRob2QgY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hQcm9jZXNzKGJvb2xlYW4gcHVibGlzaFByb2Nlc3MpIHsKLQkJdGhpcy5wdWJsaXNoUHJvY2VzcyA9IHB1Ymxpc2hQcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyB3aWxsCi0JICogICAgICAgICBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hVbm9wZW5BREQoKSB7Ci0JCXJldHVybiBwdWJsaXNoVW5vcGVuQUREOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggdW5vcGVuIGFjdGl2aXR5IGRldGFpbCBkaWFncmFtcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hVbm9wZW5BREQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHVub3BlbiBhY3Rpdml0eSBkZXRhaWwKLQkgKiAgICAgICAgICAgIGRpYWdyYW1zCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaFVub3BlbkFERChib29sZWFuIHB1Ymxpc2hVbm9wZW5BREQpIHsKLQkJdGhpcy5wdWJsaXNoVW5vcGVuQUREID0gcHVibGlzaFVub3BlbkFERDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGFjdGl2aXR5IGRpYWdyYW0gZm9yIGJhc2UgYWN0aXZ0aWVzIHdpdGggdW5tb2RpZmllZAotCSAqIGV4dGVuc2lvbnMgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGFjdGl2aXR5IGRpYWdyYW0gZm9yIGJhc2UgYWN0aXZ0aWVzCi0JICogICAgICAgICB3aXRoIHVubW9kaWZpZWQgZXh0ZW5zaW9ucyB3aWxsIGJlIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaEJhc2VBRCgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hCYXNlQUQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBhY3Rpdml0eSBkaWFncmFtIGZvciBiYXNlIGFjdGl2dGllcyB3aXRoIHVubW9kaWZpZWQKLQkgKiBleHRlbnNpb25zIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaEJhc2VBRAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYWN0aXZpdHkgZGlhZ3JhbSBmb3IgYmFzZQotCSAqICAgICAgICAgICAgYWN0aXZ0aWVzIHdpdGggdW5tb2RpZmllZCBleHRlbnNpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEJhc2VBRChib29sZWFuIHB1Ymxpc2hCYXNlQUQpIHsKLQkJdGhpcy5wdWJsaXNoQmFzZUFEID0gcHVibGlzaEJhc2VBRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwdWJsaXNoIGxpZ2h0IHdlaWdodCBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbiB0cmVlIHdpbGwgYmUKLQkgKiAgICAgICAgIHB1Ymxpc2hlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGlzaExpZ2h0V2VpZ2h0VHJlZSgpIHsKLQkJcmV0dXJuIHB1Ymxpc2hMaWdodFdlaWdodFRyZWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcHVibGlzaCBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbiB0cmVlIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGlzaExpZ2h0V2VpZ2h0VHJlZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHB1Ymxpc2ggYSBsaWdodCB3ZWlnaHQgbmF2aWdhdGlvbgotCSAqICAgICAgICAgICAgdHJlZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hMaWdodFdlaWdodFRyZWUoYm9vbGVhbiBwdWJsaXNoTGlnaHRXZWlnaHRUcmVlKSB7Ci0JCXRoaXMucHVibGlzaExpZ2h0V2VpZ2h0VHJlZSA9IHB1Ymxpc2hMaWdodFdlaWdodFRyZWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hvdyBtZXRob2QgY29udGVudCBpbiBkZXNjcmlwdG9yIHBhZ2VzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtZXRob2QgY29udGVudCB3aWxsIGJlIGRpc3BsYXllZCBpbgotCSAqICAgICAgICAgdGhlIGRlc2NyaXB0b3IgcGFnZXMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaG93IG1ldGhvZCBjb250ZW50IGluIGRlc2NyaXB0b3IgcGFnZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBkaXNwbGF5IHRoZSBtZXRob2QgY29udGVudCBpbiB0aGUKLQkgKiAgICAgICAgICAgIGRlc2NyaXB0b3IgcGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93TWV0aG9kQ29udGVudEluRGVzY3JpcHRvcnMoCi0JCQlib29sZWFuIHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycykgewotCQl0aGlzLnNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycyA9IHNob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzaG93IHJlbGF0ZWQgZGVzY3JpcHRvcnMgaW4gdGhlIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3QKLQkgKiBwYWdlcyBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWxhdGVkIGRlc2NyaXB0b3JzIHdpbGwgYmUgZGlzcGxheWVkIGluCi0JICogICAgICAgICB0aGUgdGFzaywgcm9sZSwgYW5kIHdvcmsgcHJvZHVjdCBwYWdlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd1JlbGF0ZWREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyByZWxhdGVkIGRlc2NyaXB0b3JzIGluIHRoZSB0YXNrLCByb2xlLCBhbmQgd29yayBwcm9kdWN0Ci0JICogcGFnZXMgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaG93UmVsYXRlZERlc2NyaXB0b3JzCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGlzcGxheSB0aGUgcmVsYXRlZCBkZXNjcmlwdG9ycyBpbgotCSAqICAgICAgICAgICAgdGhlIHRhc2ssIHJvbGUsIGFuZCB3b3JrIHByb2R1Y3QgcGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93UmVsYXRlZERlc2NyaXB0b3JzKGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycykgewotCQl0aGlzLnNob3dSZWxhdGVkRGVzY3JpcHRvcnMgPSBzaG93UmVsYXRlZERlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHNob3cgdGFzayBkZXNjcmlwdG9ycyBpbiBuYXZpZ2F0aW9uIHRyZWUgb3B0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGFzayBkZXNjcmlwdG9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUKLQkgKiAgICAgICAgIG5hdmlnYXRpb24gdHJlZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSgpIHsKLQkJcmV0dXJuIHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2hvdyB0YXNrIGRlc2NyaXB0b3JzIGluIG5hdmlnYXRpb24gdHJlZSBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHNob3dEZXNjcmlwdG9yc0luVHJlZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGRpc3BsYXkgdGhlIHRhc2sgZGVzY3JpcHRvcnMgaW4gdGhlCi0JICogICAgICAgICAgICBuYXZpZ2F0aW9uIHRyZWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKAotCQkJYm9vbGVhbiBzaG93RGVzY3JpcHRvcnNJbk5hdmlnYXRpb25UcmVlKSB7Ci0JCXRoaXMuc2hvd0Rlc2NyaXB0b3JzSW5OYXZpZ2F0aW9uVHJlZSA9IHNob3dEZXNjcmlwdG9yc0luTmF2aWdhdGlvblRyZWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHVibGlzaCBlbXB0eSBjYXRlZ29yaWVzIG9wdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVtcHR5IGNhdGVnb3JpZXMgd2lsbCBiZSBwdWJsaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1B1Ymxpc2hFbXB0eUNhdGVnb3JpZXMoKSB7Ci0JCXJldHVybiBwdWJsaXNoRW1wdHlDYXRlZ29yaWVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1Ymxpc2ggZW1wdHkgY2F0ZWdvcmllcyBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwdWJsaXNoIHRoZSBlbXB0eSBjYXRlZ29yaWVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEVtcHR5Q2F0ZWdvcmllcyhib29sZWFuIHB1Ymxpc2hFbXB0eUNhdGVnb3JpZXMpIHsKLQkJdGhpcy5wdWJsaXNoRW1wdHlDYXRlZ29yaWVzID0gcHVibGlzaEVtcHR5Q2F0ZWdvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHB1Ymxpc2ggb3B0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwdWJsaXNoIG9wdGlvbnMgaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2MGM4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUubmV0LnByb3h5LklQcm94eURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5uZXQucHJveHkuSVByb3h5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuRGVmYXVsdENvbnRlbnRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LkxpbmtJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLlJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuUHVibGlzaGluZ1Jlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHAuSHR0cFJlc3BvbnNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cC5IdHRwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogY29udGVudCB2YWxpZGF0b3IgdXNlZCBmb3IgcHVibGlzaGluZy4gVGhpcyBjbGFzcyB3aWxsIGJlIHJlc3BvbnNpYmxlIGZvcgotICogdmFsaWRhdGluZyB0aGUgY29udGVudCB0byBiZSBwdWJsaXNoZWQsIGZpeGluZyBwcm9ibGVtcyBzdWNoIGFzIGxpbmtzIGluIHRoZQotICogY29udGVudCwgYW5kIGxvZ2dpbmcgaW5mb3JtYXRpb24gYWJvdXQgbWlzc2luZyBlbGVtZW50cywgbWlzc2luZyByZXNvdXJjZXMsCi0gKiBldGMuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgRGVmYXVsdENvbnRlbnRWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCS8vIHByaXZhdGUgYm9vbGVhbiBzaG93RXh0cmFJbmZvRm9yRGVzY3JpcHRvcnMgPSBmYWxzZTsKLQkvLyBwcml2YXRlIGJvb2xlYW4gc2hvd1JlbGF0ZWREZXNjcmlwdG9ycyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFB1Ymxpc2hIVE1MT3B0aW9ucyBvcHRpb25zID0gbnVsbDsKLQotCWNsYXNzIEludmFsaWRFeHRlcm5hbExpbmtJbmZvIHsKLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgb3duZXI7Ci0KLQkJcHVibGljIFN0cmluZyB1cmw7Ci0KLQkJcHVibGljIFN0cmluZyBtZXNzYWdlOwotCi0JCXB1YmxpYyBJbnZhbGlkRXh0ZXJuYWxMaW5rSW5mbyhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgdXJsLAotCQkJCVN0cmluZyBtZXNzYWdlKSB7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLnVybCA9IHVybDsKLQkJCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCX0KLQl9Ci0KLQljbGFzcyBNaXNzaW5nUmVmZXJlbmNlIHsKLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgb3duZXI7Ci0KLQkJcHVibGljIE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudDsKLQotCQlwdWJsaWMgU3RyaW5nIGd1aWQ7Ci0KLQkJcHVibGljIFN0cmluZyBsaW5rZWRUZXh0OwotCi0JCXB1YmxpYyBNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZWZFbGVtZW50ID0gcmVmRWxlbWVudDsKLQkJfQotCi0JCXB1YmxpYyBNaXNzaW5nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyBndWlkLAotCQkJCVN0cmluZyBsaW5rZWRUZXh0KSB7Ci0JCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCQl0aGlzLmd1aWQgPSBndWlkOwotCQkJdGhpcy5saW5rZWRUZXh0ID0gbGlua2VkVGV4dDsKLQkJfQotCX0KLQotCWNsYXNzIE1pc3NpbmdSZXNvdXJjZSB7Ci0JCXB1YmxpYyBNZXRob2RFbGVtZW50IG93bmVyOwotCi0JCXB1YmxpYyBGaWxlIHJlc291cmNlRmlsZTsKLQotCQlwdWJsaWMgU3RyaW5nIHVybDsKLQotCQlwdWJsaWMgTWlzc2luZ1Jlc291cmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIEZpbGUgcmVzb3VyY2VGaWxlLAotCQkJCVN0cmluZyB1cmwpIHsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVzb3VyY2VGaWxlID0gcmVzb3VyY2VGaWxlOwotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIExPR1NfRk9MREVSID0gImxvZ3MiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0xPR19GSUxFTkFNRSA9ICJlcnJvci5sb2ciOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkdfTE9HX0ZJTEVOQU1FID0gIndhcm5pbmcubG9nIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPX0xPR19GSUxFTkFNRSA9ICJpbmZvLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SRV9ORVRfQlVORExFID0gIm9yZy5lY2xpcHNlLmNvcmUubmV0IjsKLQotCXByb3RlY3RlZCBGaWxlIGxvZ1BhdGg7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUV4dGVybmFsTGlua3MgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBMaXN0IGludmFsaWRFeHRlcm5hbExpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gY2FjaGUgdGhlIHZhbGlkZWQgZXh0ZXJuYWwgbGlua3MgdG8gYXZvaWQgbXVsdGlwbGUgY2hlY2tpbmcKLQlwcm90ZWN0ZWQgTGlzdCB2YWxpZGF0ZWRFeHRlcm5hbExpbmtzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgbWlzc2luZ1JlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBtaXNzaW5nUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIExpc3QgZGlzY2FyZGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB2YWxpZENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgbG9uZyBwdWJsaXNoaW5nX3N0YXJ0ID0gMDsKLQotCXByb3RlY3RlZCBsb25nIHRpbWVfZm9yX2V4dGVybmFsX2xpbmtfY2hlY2tpbmcgPSAwOwotCi0JLy8gY29sbGVjdCB0aGUgZWxlbWVudHMgcmVmZXJlbmNlZCBieSB0aGUgcHVibGlzaGVkIGNvbnRlbnRzIHNvIHdlIGNhbgotCS8vIHB1Ymxpc2ggdGhlbQotCS8vIHRoaXMgd2lsbCBiZSB0aGUgZWxlbWVudHMgdG8gYmUgcHVibGlzaGVkCi0JcHJvdGVjdGVkIExpc3QgcmVmZXJlbmNlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcHVibGlzaGVkIGVsZW1lbnRzCi0JcHJvdGVjdGVkIExpc3QgcHVibGlzaGVkRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCBlbGVtZW50IGZvciB0aGUgY29udGVudCB2YWxpZGF0b3IKLQkvLyBzZXQgdGhpcyBiZWZvcmUgcHVibGlzaGluZyB0aGUgZWxlbWVudCBhbmQgc2V0IHRvIG51bGwgYWZ0ZXIgdGhlCi0JLy8gcHVibGlzaGlnbiBpcyBkb25lCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnQgZGVmYXVsdFRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiBjb25zcnVjdG9yCi0JICogCi0JICogQHBhcmFtIHB1YkRpcgotCSAqICAgICAgICAgICAgU3RyaW5nCi0JICogQHBhcmFtIHZhbGlkYXRlRXh0ZXJuYWxMaW5rcwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcihTdHJpbmcgcHViRGlyLCBQdWJsaXNoSFRNTE9wdGlvbnMgb3B0aW9ucykgewotCQlzdXBlcihwdWJEaXIpOwotCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotCi0JCXRoaXMudmFsaWRhdGVFeHRlcm5hbExpbmtzID0gb3B0aW9ucy5pc0NoZWNrRXh0ZXJuYWxMaW5rcygpOwotCi0JCXRoaXMubG9nUGF0aCA9IG5ldyBGaWxlKHB1YkRpciwgTE9HU19GT0xERVIpOwotCQlzdXBlci5pbmZvID0gZ2V0U3RyZWFtKElORk9fTE9HX0ZJTEVOQU1FKTsKLQkJc3VwZXIud2FybmluZyA9IGdldFN0cmVhbShXQVJOSU5HX0xPR19GSUxFTkFNRSk7Ci0JCXN1cGVyLmVycm9yID0gZ2V0U3RyZWFtKEVSUk9SX0xPR19GSUxFTkFNRSk7Ci0KLQkJLy8gc2V0IHRoZSBzdGFydCB0aW1lCi0JCXB1Ymxpc2hpbmdfc3RhcnQgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpOwotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIG9iamVjdAotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWludmFsaWRFeHRlcm5hbExpbmtzLmNsZWFyKCk7Ci0JCXZhbGlkYXRlZEV4dGVybmFsTGlua3MuY2xlYXIoKTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuY2xlYXIoKTsKLQkJbWlzc2luZ1Jlc291cmNlcy5jbGVhcigpOwotCQlkaXNjYXJkZWRFbGVtZW50cy5jbGVhcigpOwotCQl2YWxpZENhdGVnb3JpZXMuY2xlYXIoKTsKLQotCQlyZWZlcmVuY2VkRWxlbWVudHMuY2xlYXIoKTsKLQkJcHVibGlzaGVkRWxlbWVudHMuY2xlYXIoKTsKLQotCQlpbmZvLmNsb3NlKCk7Ci0JCXdhcm5pbmcuY2xvc2UoKTsKLQkJZXJyb3IuY2xvc2UoKTsKLQotCX0KLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBnZXRTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGYgPSBuZXcgRmlsZShsb2dQYXRoLCBmaWxlTmFtZSk7Ci0JCQlGaWxlIGRpciA9IGYuZ2V0UGFyZW50RmlsZSgpOwotCQkJZGlyLm1rZGlycygpOwotCi0JCQlpZiAoIWYuZXhpc3RzKCkpIHsKLQkJCQlmLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVByb3h5U2VydmljZSBnZXRQcm94eVNlcnZpY2UoKSB7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoQ09SRV9ORVRfQlVORExFKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlCdW5kbGVDb250ZXh0IGN0eCA9IGJ1bmRsZS5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IElQcm94eVNlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpOwotCQkJU2VydmljZVJlZmVyZW5jZSByZWYgPSBjdHguZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJCWlmIChyZWYgIT0gbnVsbCkKLQkJCQlyZXR1cm4gKElQcm94eVNlcnZpY2UpIGJ1bmRsZS5nZXRCdW5kbGVDb250ZXh0KCkKLQkJCQkJCS5nZXRTZXJ2aWNlKHJlZik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdmFsaWRhdGUgdGhlIGxpbmsgYXR0cmlidXRlcyBmcm8gdGhlIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBvd25lciBlbGVtZW50Ci0JICogQHBhcmFtIGF0dHJpYnV0ZXMKLQkgKiAgICAgICAgICAgIFN0cmluZyB0aGUgYXR0cmlidXRlcyBpbiB0aGUgbGluawotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICBTdHJpbmcgdGhlIHRleHQgYWxsb3cgd2l0aCB0aGUgbGluawotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIExpbmtJbmZvCi0JICovCi0JcHVibGljIExpbmtJbmZvIHZhbGlkYXRlTGluayhNZXRob2RFbGVtZW50IG93bmVyLCBTdHJpbmcgYXR0cmlidXRlcywKLQkJCVN0cmluZyB0ZXh0LCBNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywgU3RyaW5nIHRhZykgewotCQlMaW5rSW5mbyBpbmZvID0gc3VwZXIKLQkJCQkudmFsaWRhdGVMaW5rKG93bmVyLCBhdHRyaWJ1dGVzLCB0ZXh0LCBjb25maWcsIHRhZyk7Ci0KLQkJaWYgKHZhbGlkYXRlRXh0ZXJuYWxMaW5rcykgewotCi0JCQlTdHJpbmcgdXJsID0gaW5mby5nZXRVcmwoKTsKLQkJCWlmICgodXJsICE9IG51bGwpICYmIFJlc291cmNlSGVscGVyLmlzRXh0ZXJuYWxMaW5rKHVybCkKLQkJCQkJJiYgIXVybC5zdGFydHNXaXRoKCJmdHA6Ly8iKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWlmICghdmFsaWRhdGVkRXh0ZXJuYWxMaW5rcy5jb250YWlucyh1cmwpKSB7Ci0JCQkJCVRpbWVyIHQgPSBuZXcgVGltZXIoKTsKLQkJCQkJSVByb3h5U2VydmljZSBwcm94eVNlcnZpY2UgPSBnZXRQcm94eVNlcnZpY2UoKTsKLQotCQkJCQlpZiAocHJveHlTZXJ2aWNlLmlzUHJveGllc0VuYWJsZWQoKSkgewotCQkJCQkJSVByb3h5RGF0YSBwcm94eSA9IG51bGw7Ci0JCQkJCQlib29sZWFuIGFjY2Vzc2libGUgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gdXNlUHJveHkgPSBmYWxzZTsKLQkJCQkJCVN0cmluZyBleGNlcHRpb25NZXNzYWdlID0gbnVsbDsKLQkJCQkJCVN0cmluZ1tdIHByb3h5VHlwZXMgPSB7IElQcm94eURhdGEuSFRUUF9QUk9YWV9UWVBFLAotCQkJCQkJCQlJUHJveHlEYXRhLkhUVFBTX1BST1hZX1RZUEUsCi0JCQkJCQkJCUlQcm94eURhdGEuU09DS1NfUFJPWFlfVFlQRSB9OwotCQkJCQkJZm9yIChTdHJpbmcgcHJveHlUeXBlIDogcHJveHlUeXBlcykgewotCQkJCQkJCS8vIGFjY2VzcyBleHRlcm5hbCBsaW5rIGJ5IHVzaW5nIGRpZmZlcmVudCBwcm94eXMKLQkJCQkJCQlwcm94eSA9IHByb3h5U2VydmljZS5nZXRQcm94eURhdGEocHJveHlUeXBlKTsKLQkJCQkJCQlpZiAoKHByb3h5LmdldEhvc3QoKT09bnVsbCl8fHByb3h5LmdldFBvcnQoKT09LTEpCi0JCQkJCQkJewotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSHR0cFJlc3BvbnNlIHJlc3AgPSBIdHRwVXRpbC5kb0dldCh1cmwsIG51bGwsCi0JCQkJCQkJCQkJNjAwMCwgcHJveHkpOyAvLyB0aW1lb3V0Ci0JCQkJCQkJCXVzZVByb3h5ID0gdHJ1ZTsKLQkJCQkJCQkJYWNjZXNzaWJsZSA9IHRydWU7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAoZXhjZXB0aW9uTWVzc2FnZSA9PSBudWxsKQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlleGNlcHRpb25NZXNzYWdlID0gcHJveHkuZ2V0SG9zdCgpICsgIjoiCi0JCQkJCQkJCQkJCSsgcHJveHkuZ2V0UG9ydCgpICsgIlsiICsgcHJveHlUeXBlCi0JCQkJCQkJCQkJCSsgIl06IiArIGUuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJZXhjZXB0aW9uTWVzc2FnZSArPSAiOyIgKyBwcm94eS5nZXRIb3N0KCkKLQkJCQkJCQkJCQkJKyAiOiIgKyBwcm94eS5nZXRQb3J0KCkgKyAiWyIKLQkJCQkJCQkJCQkJKyBwcm94eVR5cGUgKyAiXToiICsgZS5nZXRNZXNzYWdlKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXNlUHJveHkpCi0JCQkJCQl7Ci0JCQkJCQkJaWYgKCFhY2Nlc3NpYmxlKSB7Ci0JCQkJCQkJCWlmIChleGNlcHRpb25NZXNzYWdlICE9IG51bGwpIHsKLQkJCQkJCQkJCWxvZ0ludmFsaWRFeHRlcm5hbExpbmsob3duZXIsIHVybCwKLQkJCQkJCQkJCQkJZXhjZXB0aW9uTWVzc2FnZSk7Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQkvLyBjb25uZWN0IGRpcmVjdGx5Ci0JCQkJCQl7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSHR0cFJlc3BvbnNlIHJlc3AgPSBIdHRwVXRpbC5kb0dldCh1cmwsIG51bGwsIDYwMDApOyAvLyB0aW1lb3V0Ci0JCQkJCQkJfSBjYXRjaCAoamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb24gZSkgewotCQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWxvZ0ludmFsaWRFeHRlcm5hbExpbmsob3duZXIsIHVybCwgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCQotCQkJCQl9IGVsc2UgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlIdHRwUmVzcG9uc2UgcmVzcCA9IEh0dHBVdGlsLmRvR2V0KHVybCwgbnVsbCwgNjAwMCk7IC8vIHRpbWVvdXQKLQkJCQkJCQkvLyBTeXN0ZW0ub3V0Ci0JCQkJCQkJLy8gLnByaW50bG4odGltZQotCQkJCQkJCS8vICsgIiBtaW5pLXNlY29uZHMgcXVlcnlpbmcgVXJsICciICsgdXJsICsgIicsCi0JCQkJCQkJLy8gcmV0dXJuCi0JCQkJCQkJLy8gc3RhdHVzPSIgKyByZXNwLmdldFN0YXR1cygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG51bGwpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXQuc3RvcCgpOwotCQkJCQl0aW1lX2Zvcl9leHRlcm5hbF9saW5rX2NoZWNraW5nICs9IHQuZ2V0VGltZSgpOwotCi0JCQkJCS8vIGNhY2hlIGl0Ci0JCQkJCXZhbGlkYXRlZEV4dGVybmFsTGlua3MuYWRkKHVybCk7Ci0KLQkJCQkJLy8gZG8gd2UgbmVlZCB0byBsb2cgdGhlIGluZm8gc28gdGhhdCB1c2VyIGtub3cgd2hhdAotCQkJCQkvLyBleHRlcm5hbAotCQkJCQkvLyB1cmxzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBjb250ZW50PwotCQkJCQlsb2dJbmZvKG93bmVyLCBOTFMuYmluZCgKLQkJCQkJCQlQdWJsaXNoaW5nUmVzb3VyY2VzLmV4dGVybmFsVXJsX21zZywgbmV3IE9iamVjdFtdIHsKLQkJCQkJCQkJCW5ldyBJbnRlZ2VyKHQuZ2V0VGltZSgpKSwgdXJsIH0pKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBsb2cgbWlzc2luZyByZWZlcmVuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlZkVsZW1lbnQKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQgdGhlIG1pc3NpbmcgZWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwKLQkJCU1ldGhvZEVsZW1lbnQgcmVmRWxlbWVudCkgewotCQlzdXBlci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuYWRkKG5ldyBNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCByZWZFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIG1pc3NpbmcgcmVmZXJlbmNlCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNPGV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBndWlkCi0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGd1aWQgb2YgdGhlIG1pc3NpbmcgZWxlbWVudAotCSAqIEBwYXJhbSBsaW5rZWRUZXh0Ci0JICogICAgICAgICAgICBTdHJpbmcgdGhlIGxpbmtlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZWZlcmVuY2UoTWV0aG9kRWxlbWVudCBvd25lciwgU3RyaW5nIGd1aWQsCi0JCQlTdHJpbmcgbGlua2VkVGV4dCkgewotCQlzdXBlci5sb2dNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCBndWlkLCBsaW5rZWRUZXh0KTsKLQkJbWlzc2luZ1JlZmVyZW5jZXMuYWRkKG5ldyBNaXNzaW5nUmVmZXJlbmNlKG93bmVyLCBndWlkLCBsaW5rZWRUZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIG1pc3NpbmcgcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIHJlc291cmNlRmlsZQotCSAqICAgICAgICAgICAgRmlsZQotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGxvZ01pc3NpbmdSZXNvdXJjZShNZXRob2RFbGVtZW50IG93bmVyLCBGaWxlIHJlc291cmNlRmlsZSwKLQkJCVN0cmluZyB1cmwpIHsKLQkJc3VwZXIubG9nTWlzc2luZ1Jlc291cmNlKG93bmVyLCByZXNvdXJjZUZpbGUsIHVybCk7Ci0JCW1pc3NpbmdSZXNvdXJjZXMuYWRkKG5ldyBNaXNzaW5nUmVzb3VyY2Uob3duZXIsIHJlc291cmNlRmlsZSwgdXJsKSk7Ci0JfQotCi0JLyoqCi0JICogbG9nIGludmFsaWQgZXh0ZXJuYWwgbGluawotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIFN0cmluZwotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBsb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKE1ldGhvZEVsZW1lbnQgb3duZXIsIFN0cmluZyB1cmwsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlci5sb2dJbnZhbGlkRXh0ZXJuYWxMaW5rKG93bmVyLCB1cmwsIG1lc3NhZ2UpOwotCQlpbnZhbGlkRXh0ZXJuYWxMaW5rcy5hZGQobmV3IEludmFsaWRFeHRlcm5hbExpbmtJbmZvKG93bmVyLCB1cmwsCi0JCQkJbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIGdldCByZXBvcnQgYWJvdXQgdGhlIGNvbnRlbnQgdmFsaWRhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFhtbEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudCBnZXRSZXBvcnQoKSB7Ci0JCVhtbEVsZW1lbnQgcmVwb3J0WG1sID0gbmV3IFhtbEVsZW1lbnQoInZhbGlkYXRvckluZm8iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpbnZhbGlkRXh0ZXJuYWxMaW5rcy5zaXplKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbXNnID0gdGltZV9mb3JfZXh0ZXJuYWxfbGlua19jaGVja2luZyAvIDEwMDAKLQkJCQkJKyAiIHNlY29uZHMgdmFsaWRhdGluZyBleHRlcm5hbCBsaW5rcyI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJbG9nSW5mbyhtc2cpOwotCi0JCQlYbWxFbGVtZW50IGludmFsaWRFeHRlcm5hbExpbmtzWG1sID0gcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgiaW52YWxpZEV4dGVybmFsTGlua3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IGludmFsaWRFeHRlcm5hbExpbmtzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJbnZhbGlkRXh0ZXJuYWxMaW5rSW5mbyBpbmZvID0gKEludmFsaWRFeHRlcm5hbExpbmtJbmZvKSBpdAotCQkJCQkJLm5leHQoKTsKLQkJCQlpbnZhbGlkRXh0ZXJuYWxMaW5rc1htbAotCQkJCQkJLm5ld0NoaWxkKCJlbnRyeSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5zZXRBdHRyaWJ1dGUoInVybCIsIGluZm8udXJsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkib3duZXIiLCAoaW5mby5vd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLm93bmVyKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJtZXNzYWdlIiwgaW5mby5tZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKG1pc3NpbmdSZWZlcmVuY2VzLnNpemUoKSA+IDApIHsKLQkJCVhtbEVsZW1lbnQgaW52YWxpZFJlZmVyZW5jZXNYbWwgPSByZXBvcnRYbWwKLQkJCQkJLm5ld0NoaWxkKCJpbnZhbGlkUmVmZXJlbmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlYbWxFbGVtZW50IG1pc3NpbmdSZWZlcmVuY2VzWG1sID0gcmVwb3J0WG1sCi0JCQkJCS5uZXdDaGlsZCgibWlzc2luZ1JlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IG1pc3NpbmdSZWZlcmVuY2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlNaXNzaW5nUmVmZXJlbmNlIGluZm8gPSAoTWlzc2luZ1JlZmVyZW5jZSkgaXQubmV4dCgpOwotCQkJCWlmIChpbmZvLnJlZkVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlpbnZhbGlkUmVmZXJlbmNlc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgiZWxlbWVudCIsIGluZm8ubGlua2VkVGV4dCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoImd1aWQiLCBpbmZvLmd1aWQpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKAotCQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGVsc2UgewotCQkJCQltaXNzaW5nUmVmZXJlbmNlc1htbAotCQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJCSJlbGVtZW50IiwgKGluZm8ucmVmRWxlbWVudCA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLnJlZkVsZW1lbnQpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkuc2V0QXR0cmlidXRlKCJndWlkIiwgaW5mby5yZWZFbGVtZW50LmdldEd1aWQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS5zZXRBdHRyaWJ1dGUoCi0JCQkJCQkJCQkib3duZXIiLCAoaW5mby5vd25lciA9PSBudWxsKSA/ICIiIDogTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShpbmZvLm93bmVyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChtaXNzaW5nUmVzb3VyY2VzLnNpemUoKSA+IDApIHsKLQkJCVhtbEVsZW1lbnQgbWlzc2luZ1Jlc291cmNlc1htbCA9IHJlcG9ydFhtbAotCQkJCQkubmV3Q2hpbGQoIm1pc3NpbmdSZXNvdXJjZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdCA9IG1pc3NpbmdSZXNvdXJjZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCU1pc3NpbmdSZXNvdXJjZSBpbmZvID0gKE1pc3NpbmdSZXNvdXJjZSkgaXQubmV4dCgpOwotCQkJCW1pc3NpbmdSZXNvdXJjZXNYbWwKLQkJCQkJCS5uZXdDaGlsZCgiZW50cnkiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkuc2V0QXR0cmlidXRlKCJ1cmwiLCBpbmZvLnVybCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJInJlc291cmNlIiwgKGluZm8ucmVzb3VyY2VGaWxlID09IG51bGwpID8gIiIgOiBpbmZvLnJlc291cmNlRmlsZS5nZXRQYXRoKCkpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJLnNldEF0dHJpYnV0ZSgKLQkJCQkJCQkJIm93bmVyIiwgKGluZm8ub3duZXIgPT0gbnVsbCkgPyAiIiA6IExpYnJhcnlVdGlsLmdldExvY2FsaXplVHlwZU5hbWUoaW5mby5vd25lcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJfQotCQl9Ci0KLQkJbG9uZyBwdWJsaXNoaW5nX3RpbWUgPSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5nZXRUaW1lSW5NaWxsaXMoKSAtIHB1Ymxpc2hpbmdfc3RhcnQpIC8gMTAwMDsKLQkJaW50IG1pbnV0ZXMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLyA2MDsKLQkJaW50IHNlY29uZHMgPSAoaW50KSBwdWJsaXNoaW5nX3RpbWUgLSBtaW51dGVzICogNjA7Ci0KLQkJbG9nSW5mbygiUHVibGlzaGluZyB0aW1lOiAiICsgbWludXRlcyArICIgbWludXRlcyAiICsgc2Vjb25kcyArICIgc2Vjb25kcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCXJldHVybiByZXBvcnRYbWw7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgY2F0ZWdvcnkgdGhhdCBzaG91bGQgYmUgcHVibGlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBDb250ZW50Q2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZENhdGVnb3J5KENvbnRlbnRDYXRlZ29yeSBlKSB7Ci0JCWlmICghdmFsaWRDYXRlZ29yaWVzLmNvbnRhaW5zKGUpKSB7Ci0JCQl2YWxpZENhdGVnb3JpZXMuYWRkKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgZGlzY2FyZGVkIG9yIG5vdCBkaXNjYXJkZWQgZWxlbWVudHMgd2lsbCBiZQotCSAqIHRyZWF0ZWQgYXMgb3V0IHNpZGUgdGhlIGNvbmZpZ3Vyc2F0aW9uCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBvd25lciBvZiB0aGUgZWxlbWVudAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBPYmplY3QgRVN0cnVjdHVyYWxGZWF0dXJlIG9yIE9wcG9zaXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50IHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2NhcmRlZChNZXRob2RFbGVtZW50IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gaWYgdGhlIGVsZW1lbnQgaXMgYSBDb250ZW50Q2F0ZWdvcnkgYW5kIGlzIG5vdCBkaXNjYXJkZWQKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb250ZW50Q2F0ZWdvcnkpIHsKLQkJCWlmICh2YWxpZENhdGVnb3JpZXMuY29udGFpbnMoZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIG90aGVyd2lzZSwgY2hlY2sgaWYgaXQgc2hvdWxkIGJlIGRpc2NhcmRlZCBvciBub3QKLQkJCS8vIFRPRE8KLQkJCS8vIGZvciBub3csIGRpc2NhcmQgYWxsIHJlZmVyZW5jZWQgY29udGVudCBjYXRlZ29yaWVzIGlmIHRoZXkgYXJlCi0JCQkvLyBub3QgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hpbmcgdmlldy4KLQkJCS8vIE5PISEhISEhISEhISEhIFRoaXMgd2lsbCBsZWFkIHRvIGEgbG90IG9mIGJyb2tlbiBsaW5rcyBhbmQKLQkJCS8vIG1pc3NpbmcgZWxlbWVudAotCQkJLy8gVE9PIHN0cm9uZyBsaW1pdGF0aW9uLiBMZXQgb3BlbiBpdCBmb3Igbm93Ci0JCQkvLyBQdWJsaXNoaW5nOk92ZXJ2aWV3IHBhZ2UgaW4gcHVibGlzaGVkIHdlYnNpdGUKLQkJCS8vIGhhdmUgYnJva2VuIGxpbmtzIHRvIEJNCi0JCQkvLyByZXR1cm4gdHJ1ZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgcmVmZXJlbmNlZCBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IG93bmVyLCBNZXRob2RFbGVtZW50IGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZG9uJ3QgYWRkIGRpc2NhcmRlZCBlbGVtZW50cwotCQlpZiAoaXNEaXNjYXJkZWQob3duZXIsIG51bGwsIGUpKSB7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkucHJpbnRsbigiRWxlbWVudCBpcyBkaXNjYXJkZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGUgIT0gbnVsbCAmJiAhcmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpCi0JCQkJJiYgIXB1Ymxpc2hlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMuYWRkKGUpOwotCQkJbG9nUmVmZXJlbmNlKG93bmVyLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGxvZyBhIHJlZmVybmVjZQotCSAqIAotCSAqIEBwYXJhbSBvd25lcgotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgbG9nUmVmZXJlbmNlKE1ldGhvZEVsZW1lbnQgb3duZXIsIE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIi0tLSBSZWZlcmVuZWNlIEVsZW1lbnQgQWRkZWQ6ICIgKyBMaWJyYXJ5VXRpbC5nZXRMb2NhbGl6ZVR5cGVOYW1lKGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlIGVsZW1lbnQgZnJvbSByZWZlcmVuY2VkIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAocmVmZXJlbmNlZEVsZW1lbnRzLmNvbnRhaW5zKGUpKSB7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudHMucmVtb3ZlKGUpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dAotCQkJCQkJLnByaW50bG4oIi0tLSBSZWZlcmVuY2UgRWxlbWVudCBSZW1vdmVkOiAiICsgTGlicmFyeVV0aWwuZ2V0TG9jYWxpemVUeXBlTmFtZShlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGdldCBhbGwgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWZlcmVuY2VkRWxlbWVudHMoKSB7Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogYWV0IHRoZSBkaXNjYXJkZWQgZWxlbWVudCBmb3IgdGhpcyBwdWJsaWNhdGlvbi4gSWYgYW4gZWxlbWVudCBpcwotCSAqIGRpc2NhcmRlZCwgaXQgc2hvdWxkIG5vdCBiZSBwdWJsaXNoZWQgYW5kIGxpbmsgdG8gaXQgc2hvdWxkIGJlIGxpbmsgdG8KLQkgKiBtaXNpbmcgZWxlbWVudCBwYWdlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIE1ldGhvZEVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjYXJkZWRFbGVtZW50KE1ldGhvZEVsZW1lbnQgZSkgewotCi0JCWlmIChlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghZGlzY2FyZGVkRWxlbWVudHMuY29udGFpbnMoZSkpIHsKLQkJCWRpc2NhcmRlZEVsZW1lbnRzLmFkZChlKTsKLQkJfQotCi0JCS8vIGlmIHRoIGZkaXNjYXJkZWQgZWxlbWVudCBpcyBpbiB0aGUgcmVmZXJlbmNlIGxpc3QsIHJlbW92ZSBpdCBhcyB3ZWxsCi0JCXJlbW92ZVJlZmVyZW5jZWRFbGVtZW50KGUpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGlmIGFuIGVsZW5tZW50IGlzIHJlZmVyZW5jZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkRWxlbWVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJcmV0dXJuIChlICE9IG51bGwpICYmIHJlZmVyZW5jZWRFbGVtZW50cy5jb250YWlucyhlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHB1Ymxpc2hlZCBlbGVtZW50cwotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFB1Ymxpc2hlZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gcHVibGlzaGVkRWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogc2V0IHRoZSBkZWZhdWx0IHRhcmdldCBmb3IgdGhlIHJlZmVyZW5jZWQgZWxlbWVudHMKLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RWxlbWVudChNZXRob2RFbGVtZW50IHRhcmdldCkgewotCQl0aGlzLmRlZmF1bHRUYXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgaWYgdGhlcmUgaXMgYSBjbG9zdXJlIG9yIG5vdAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Nsb3N1cmUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGNsb3N1cmUgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBNZXRob2RFbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5DbG9zdXJlKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgZWxlbWVudHMgdG8gY2xvc3VyZQotCSAqIAotCSAqIEBwYXJhbSBpdGVtcwotCSAqICAgICAgICAgICAgTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsb3N1cmVFbGVtZW50cyhMaXN0IGl0ZW1zKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIGEgY2xvc3VyZQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIG1ha2VFbGVtZW50Q2xvc3VyZSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3dCcm9rZW5MaW5rcygpIHsKLQkJcmV0dXJuICFvcHRpb25zLmlzQ29udmVydEJyb2tlbkxpbmtzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSBmbGFnIG9uIHdoZXRoZXIgdG8gc2hvdyBleHRyYSBkZXNjcmlwdG9yIGluZm8uIElmIHRydWUsCi0JICogaW5mb3JtYXRpb24gZnJvbSBsaW5rZWQgZWxlbWVudCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkZXNjcmlwdG9yIHBhZ2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvd0V4dHJhSW5mb0ZvckRlc2NyaXB0b3JzKCkgewotCQlyZXR1cm4gb3B0aW9ucy5pc1Nob3dNZXRob2RDb250ZW50SW5EZXNjcmlwdG9ycygpOwotCX0KLQotCS8qKgotCSAqIHNob3cgZGVzY3JpcHRvcnMgb24gbWV0aG9kIGVsZW1lbnQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3dSZWxhdGVkRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBvcHRpb25zLnNob3dSZWxhdGVkRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHRoZSB0YWIgaWQgZm9yIHRoZSBhY3Rpdml0eSBsYXlvdXQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEFjdGl2aXR5VGFiKCkgewotCQlyZXR1cm4gb3B0aW9ucy5nZXREZWZhdWx0QWN0aXZpdHlUYWIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwZmNjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotCi0KLS8qKgotICogUmVhbGl6ZXIgZm9yIHB1Ymxpc2hpbmcuCi0gKiBSZWFsaXplcyB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVhbGl6ZSBvcHRpb25zLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUHVibGlzaGluZ0VsZW1lbnRSZWFsaXplciBleHRlbmRzIERlZmF1bHRFbGVtZW50UmVhbGl6ZXIgewotCi0JUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IgdmFsaWRhdG9yOwotCQotCS8qKgotCSAqIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyBNZXRob2RDb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHZhbGlkYXRvciBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvcgotCSAqLwotCXByb3RlY3RlZCBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKE1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnLCBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFbGVtZW50UmVhbGl6ZXIgbmV3UHVibGlzaGluZ0VsZW1lbnRSZWFsaXplcihNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJCQkJCQkJCQkJCVB1Ymxpc2hpbmdDb250ZW50VmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gKFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXIpIGNyZWF0ZUVsZW1lbnRSZWFsaXplckV4dGVuc2lvbihjb25maWcsIFB1Ymxpc2hpbmdFbGVtZW50UmVhbGl6ZXJfVHlwZSk7Ci0JCWlmIChyZWFsaXplciA9PSBudWxsKSB7Ci0JCQlyZWFsaXplciA9IG5ldyBQdWJsaXNoaW5nRWxlbWVudFJlYWxpemVyKGNvbmZpZywgbnVsbCk7Ci0JCX0KLQkJcmVhbGl6ZXIudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQkKLQkJcmV0dXJuIHJlYWxpemVyOwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgTWV0aG9kRWxlbWVudAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IHJlYWxpemUoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQllbGVtZW50ID0gc3VwZXIucmVhbGl6ZShlbGVtZW50KTsKLQkJCi0JCWlmICggZWxlbWVudCA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vIFB1Ymxpc2hpbmcgc2hvdWxkIG5vdCBnZW5lcmF0ZSBsaW5rcyB0byB1bnB1Ymxpc2hlZCBjYXRlZ29yaWVzCi0JCWlmICggdmFsaWRhdG9yLmlzRGlzY2FyZGVkKG51bGwsIG51bGwsIGVsZW1lbnQpICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQkKLQkvKioKLQkgKiByZWFsaXplIHRoZSBsaXN0IG9mIGZlYXR1cmUgdmFsdWVzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgb2YgdmFsdWVzCi0JICogVGhlIG5ldyBtaWdodCBiZSBhIHJlLXNvcnRpbmcgb2YgdGhlIG9yaWdpbmFsIGxpc3QgCi0JICogb3Igc29tZSBvZiB0aGUgdmFsdWVzIGNhbiBiZSBmaWx0ZXJlZCBvdXQsIGRlcGVuZGluZyBvbiB0aGUgZGV0YWlsIGltcGxlbWVudGF0aW9uCi0JICogTm90ZTogdGhlIGxpc3QgdmFsdWUgcGFzc2VkIGluIG1pZ2h0IGJlIHVwZGF0ZWQgYXMgd2VsbC4KLQkgKiBAcGFyYW0gZWxlbWVudCBNZXRob2RFbGVtZW50Ci0JICogQHBhcmFtIGZlYXR1cmUgRVN0cnVjdHVyYWxGZWF0dXJlCi0JICogQHBhcmFtIHZhbHVlcyBMaXN0Ci0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHVibGljIExpc3QgcmVhbGl6ZShNZXRob2RFbGVtZW50IGVsZW1lbnQsIAotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIExpc3QgdmFsdWVzKQotCXsKLQkJaWYgKCB2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuc2l6ZSgpID09IDAgKSB7Ci0JCQlyZXR1cm4gdmFsdWVzOwotCQl9Ci0JCQotCQlMaXN0IGl0ZW1zID0gc3VwZXIucmVhbGl6ZShlbGVtZW50LCBmZWF0dXJlLCB2YWx1ZXMpOwotCQlpZiAoIHZhbGlkYXRvci5oYXNDbG9zdXJlKCkgKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoIGkgPCBpdGVtcy5zaXplKCkgKSB7Ci0JCQkJTWV0aG9kRWxlbWVudCBlID0gKE1ldGhvZEVsZW1lbnQpaXRlbXMuZ2V0KGkpOwotCQkJCWlmICggdmFsaWRhdG9yLmlzRGlzY2FyZGVkKG51bGwsIGZlYXR1cmUsIGUpICkgewotCQkJCQlpdGVtcy5yZW1vdmUoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdSdW5uYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL1B1Ymxpc2hpbmdSdW5uYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjBlNzAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5UaW1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5sYXlvdXQuSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LklFbGVtZW50TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBydW5uYWJsZSBjbGFzcyB0byBtb25pdG9yIHRoZSBodG1sIGdlbmVyYXRpb24KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLQlpbnQgdGltZW91dF9saW1pdCA9IDYwMDAwMDsgCi0JLy9QdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciB2YWxpZGF0b3I7IAotCUh0bWxCdWlsZGVyIGh0bWxCdWlsZGVyOwotCVN0cmluZyBodG1sX2ZpbGU7Ci0JSUVsZW1lbnRMYXlvdXQgbGF5b3V0OwotCQotCXB1YmxpYyBQdWJsaXNoaW5nUnVubmFibGUoSHRtbEJ1aWxkZXIgaHRtbEJ1aWxkZXIsIGludCB0aW1lb3V0KSB7Ci0JCXRoaXMudGltZW91dF9saW1pdCA9IHRpbWVvdXQ7Ci0JCXRoaXMuaHRtbEJ1aWxkZXIgPSBodG1sQnVpbGRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBQdWJsaXNoaW5nQ29udGVudFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiAoUHVibGlzaGluZ0NvbnRlbnRWYWxpZGF0b3IpaHRtbEJ1aWxkZXIuZ2V0VmFsaWRhdG9yKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCBodG1sQnVpbGRlciAhPSBudWxsICYmIHRoaXMubGF5b3V0ICE9IG51bGwgKSB7Ci0JCQl0aGlzLmh0bWxfZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmh0bWxfZmlsZSA9IGh0bWxCdWlsZGVyLmdlbmVyYXRlSHRtbChsYXlvdXQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVIdG1sKElFbGVtZW50TGF5b3V0IGxheW91dCkgewotCQkKLQkJdGhpcy5sYXlvdXQgPSBsYXlvdXQ7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IHRoaXMubGF5b3V0LmdldEVsZW1lbnQoKTsKLQkJCi0JCVRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKCk7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgdGhlIHRhcmdldCBlbGVtZW50IGZvciB0aHJlIGNvbnRlbnQgdmFsaWRhdG9yCi0JCQlnZXRWYWxpZGF0b3IoKS5zZXRUYXJnZXRFbGVtZW50KGVsZW1lbnQpOwotCi0JCQkvLyBydW4gdGhlIHB1Ymxpc2hpbmcgYW5kIGNoZWNrIHRoZSB0aW1lLCBpZiB0aW1lb3V0LCB0ZXJtaW5hdGUgaXQKLQkJCVRocmVhZCB0ID0gbmV3IFRocmVhZCh0aGlzKTsKLQkJCXQuc3RhcnQoKTsKLQkJCXQuam9pbih0aW1lb3V0X2xpbWl0KTsKLQkJCWlmICh0LmlzQWxpdmUoKSkgewotCQkJCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZGllIGFuZCBsb2cgYW4gZXJyb3IKLQkJCQl0aW1lci5zdG9wKCk7Ci0JCQkJZ2V0VmFsaWRhdG9yKCkKLQkJCQkJCS5sb2dJbmZvKAotCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkicHVibGlzaGluZyBlbGVtZW50IHRha2VzICIgKyB0aW1lci5nZXRUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBhbHJlYWR5IGFuZCBpcyBzdGlsbCBub3QgZG9uZSB5ZXQgLi4uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRpbWVyLnN0YXJ0KCk7Ci0JCQkJdC5qb2luKCk7CQkJCi0JCQl9Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWdldFZhbGlkYXRvcigpLnNldFRhcmdldEVsZW1lbnQobnVsbCk7Ci0JCQlnZXRWYWxpZGF0b3IoKS5nZXRSZWZlcmVuY2VkRWxlbWVudHMoKS5yZW1vdmUoZWxlbWVudCk7Ci0KLQkJCXRpbWVyLnN0b3AoKTsKLQkJCWdldFZhbGlkYXRvcigpLmxvZ0luZm8oZWxlbWVudCwKLQkJCQkJdGltZXIuZ2V0VG90YWxUaW1lKCkgKyAiIG1pbmkgc2Vjb25kcyBwdWJsaXNoaW5nIGVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlyZXR1cm4gdGhpcy5odG1sX2ZpbGU7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMubGF5b3V0ID0gbnVsbDsKLQkJdGhpcy5odG1sX2ZpbGUgPSBudWxsOwotCQl0aGlzLmh0bWxCdWlsZGVyID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvUHVibGlzaGluZ1NlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVjMGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9QdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXM7Ci0KLS8qKgotICogU2lnbmFscyB0aGF0IGEgUHVibGlzaGluZyBTZXJ2aWNlIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYwNjkxNzUxODg1OTg2MTM1MTNMOwotCi0JLyoqCi0JICogVGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGhyb3dhYmxlIHJvb3RDYXVzZTsKLQkKLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtCXJvb3RDYXVzZQlUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXRoaXMocm9vdENhdXNlLCByb290Q2F1c2UuZ2V0TWVzc2FnZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0JZXJyb3JNc2cJVGhlIGVycm9yIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIFB1Ymxpc2hpbmdTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFuZCB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0Jcm9vdENhdXNlCVRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogQHBhcmFtCWVycm9yTXNnCVRoZSBlcnJvciBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBQdWJsaXNoaW5nU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCQl0aGlzLnJvb3RDYXVzZSA9IHJvb3RDYXVzZTsKLQkJdGhpcy5lcnJvck1zZyA9IGVycm9yTXNnOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybglUaGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Um9vdENhdXNlKCkgewotCQlyZXR1cm4gcm9vdENhdXNlOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvQW5jaG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjY1OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0FuY2hvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLXB1YmxpYyBjbGFzcyBBbmNob3IKLXsKLSAgIHByaXZhdGUgU3RyaW5nIHRleHQ9bnVsbDsKLSAgIHByaXZhdGUgU3RyaW5nIGFuY2hvcj1udWxsOwotCi0gICBBbmNob3IoU3RyaW5nIHRleHQsIFN0cmluZyBhbmNob3IpCi0gICB7Ci0gICAgICB0aGlzLnRleHQgPSB0ZXh0OwotICAgICAgdGhpcy5hbmNob3IgPSBhbmNob3I7Ci0gICB9Ci0KLSAgIFN0cmluZyBnZXRBbmNob3IoKQotICAgewotICAgICAgcmV0dXJuIGFuY2hvcjsKLSAgIH0KLQotICAgU3RyaW5nIGdldFRleHQoKQotICAgewotICAgICAgcmV0dXJuIHRleHQ7Ci0gICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y0MjNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotCi1wdWJsaWMgY2xhc3MgRGVmCi17Ci0KLSAgICAvLyBBcmd1bWVudCBwYXJhbWV0ZXIKLSAgICBzdGF0aWMgU3RyaW5nIEFyZ3VtZW50UHJlZml4ID0gIi0iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBQcmludFRlbXBGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInRmIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUmVzcG9uc2VGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDaGFyYWN0ZXJTZXRBcmcgPSBEZWYuQXJndW1lbnRQcmVmaXggKyAiYyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhbmd1YWdlRmlsZUFyZyA9IERlZi5Bcmd1bWVudFByZWZpeCArICJsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVHJpbUFyZyA9IERlZi5Bcmd1bWVudFByZWZpeCArICJ0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVG9wRGlyQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSZXN1bHRGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgInJmIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2hvd1VzYWdlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGaWxlQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImYiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBQcmludERlYnVnQXJnID0gRGVmLkFyZ3VtZW50UHJlZml4ICsgImRlYnVnIjsgLy8kTk9OLU5MUy0xJAotICAgIC8vS2V5d29yZGluZGV4ZXJQYXJhbQotICAgIHN0YXRpYyBTdHJpbmcgSW5kZXhUaXRsZSA9ICJtYWludGl0bGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWVBbHNvID0gInNlZWFsc28iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWUgPSAic2VlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVsaW1ldGVycyA9ICJkZWxpbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyU2V0ID0gImNoYXJhY3RlcnNldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEtleVdvcmRQcmVmaXggPSAicHJlZml4IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgS2V5V29yZExldmVsU2VwYXJhdG9yID0gImxldmVsc2VwYXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEtleVdvcmRQcmVmaXggPSAiWEVfIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdEtleVdvcmRMZXZlbFNlcGFyYXRvciA9ICJfXyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExlYXZlRGlyID0gImxlYXZlRGlyIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3RhcnREaXIgPSAic3RhcnREaXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkRmlsZSA9ICJrZXl3b3JkZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1haW5SZXN1bHRGaWxlID0gIm1haW5yZXN1bHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW5kZXhSZXN1bHRGaWxlID0gImluZGV4cmVzdWx0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEluZGV4SGVpZ2h0ID0gImluZGV4aGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgS2V5V29yZFJlc3VsdEZpbGUgPSAia2V5d29yZHJlc3VsdGZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBLZXlXb3JkVGFyZ2V0ID0gImtleXdvcmR0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJbmRleFRhcmdldCA9ICJpbmRleHRhcmdldCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE11bHRpRG9jS2V5V29yZCA9ICJtdWxpdGRvY3VtZW50a2V5d29yZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNob3dEb2NUaXRsZSA9ICJzaG93ZG9jdW1lbnR0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgSGVhZGVyRmlsZSA9ICJoZWFkZXJmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRm9vdGVyRmlsZSA9ICJmb290ZXJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9TaXRtYXAgcGFyYW1ldGVyCi0gICAgc3RhdGljIFN0cmluZyBUcnVuY2F0ZUxhYmVsID0gInRydW5jYXRlbGFiZWwiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDb252ZXJ0QW1wZXJzYW5kID0gImNvbnZlcnRhbXBlcnNhbmQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUYWJsZVdpZHRoID0gInRhYmxld2lkdGgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIGludCBEZWZhdWx0Um93U3BhbiA9IDE7Ci0gICAgc3RhdGljIGludCBEZWZhdWx0Q29sU3BhbiA9IDE7Ci0gICAgc3RhdGljIFN0cmluZyBNb2RlID0gIm1vZGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBOb2RlU3RhcnQgPSAiPC0tIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTm9kZUVuZCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBOb2RlVGV4dCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vZGVMZXZlbCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIENvbHVtbldpZHRoID0gImNvbHdpZHRoIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQ29sdW1uID0gImNvbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFJvdyA9ICJyb3ciOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDb2xTcGFuID0gImNvbHNwYW4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBSb3dTcGFuID0gInJvd3NwYW4iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBDZWxsQ29sb3IgPSAiY2VsbGNvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGlua3MgPSAibGlua3MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdE9uY2UgPSAidmlzaXRvbmNlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgT25seVRoaXMgPSAib25seXRoaXMiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBUaXRsZUxlbmd0aCA9ICJ0aXRsZWxlbmd0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRUaXRsZUxlbmd0aCA9ICJkZWZhdWx0dGl0bGVsZW5ndGgiOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgU3RyaW5nIFJlbW92ZURhdEZpbGUgPSAicmVtb3ZlZGF0ZmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFN5bm9ueW1GaWxlID0gInN5bm9ueW1maWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3ViVHJlZSA9ICJpbmNsdWRlc3VidHJlZSI7IC8vJE5PTi1OTFMtMSQKLSAvLyAgIHN0YXRpYyBTdHJpbmcgRGF0VG9wID0gImRhdGF0b3AiOwotICAgIHN0YXRpYyBTdHJpbmcgUmVzRmlsZSA9ICJyZXN1bHRmaWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUmVsUGF0aCA9ICJyZWxhdGl2ZXBhdGgiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBNYXhMZXZlbHMgPSAibWF4bGV2ZWxzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTGV2ZWxTdHlsZSA9ICJsZXZlbHN0eWxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFN0eWxlID0gImRlZmF1bHRzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEhlYWRMaW5lU3R5bGUgPSAiaGVhZGxpbmVzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExldmVsRm9udCA9ICJsZXZlbGZvbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0Rm9udCA9ICJkZWZhdWx0Zm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEhlYWRMaW5lRm9udCA9ICJoZWFkbGluZWZvbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBCb2xkID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBJdGFsaWMgPSAiaXRhbGljIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgUGxhaW4gPSAicGxhaW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICBzdGF0aWMgU3RyaW5nIE1heE9wZW5Ob2Rlc1BhcmFtID0gIm1heHZpc2libGVub2RlcyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgaW50IERlZmF1bHRNYXhPcGVuTm9kZXMgPSAxMDA7Ci0gICAgc3RhdGljIFN0cmluZyBHYXJiYWdlQ29sbGVjdG9yUGFyYW0gPSAiZ2MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0R2FyYmFnZUNvbGxlY3RvciA9ICIxMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFZlcnRpY2FsSW5jcmVtZW50UGFyYW0gPSAidmVydGljYWxpbmNyZW1lbnQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBIb3Jpem9udGFsSW5jcmVtZW50UGFyYW0gPSAiaG9yaXpvbnRhbGluY3JlbWVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1haWx0byA9ICJtYWlsdG86IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVidWdQYXJhbSA9ICJkZWJ1ZyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFdXV1Jvb3RQYXJhbSA9ICJ3d3dyb290IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW1hZ2VEaXIgPSAiaW1hZ2VzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSW1hZ2VJY29uUGFyYW0gPSAiZnJhbWVpbWFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEJnSW1hZ2VQYXJhbSA9ICJiZ2ltYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVmlzaXRPbmNlTWFya0FsbFBhcmFtID0idmlzaXRvbmNlbWFya2FsbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNoYWRvd1BhcmFtID0ibW91c2VvdmVyc2hhZG93IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgc3RhdGljIFN0cmluZyBMb2FkaW5nVHJlZVBhcmFtID0gImxvYWRpbmdsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExvYWRpbmdUcmVlQnJvd3NlciA9ICJUcmVlQnJvd3NlciBpcyBsb2FkaW5nOjoiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMb2FkaW5nVHJlZSA9ICJMb2FkaW5nIHRyZWUuIFBsZWFzZSB3YWl0Li4uIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTG9hZGluZ1N1YlRyZWUgPSAiTG9hZGluZyBzdWIgdHJlZS4gUGxlYXNlIHdhaXQuLi4iOyAvLyROT04tTkxTLTEkCi0KLQotICAgIHN0YXRpYyBTdHJpbmcgQ2hhcmFjdGVyc2V0UGFyYW0gPSAiY2hhcmFjdGVyc2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVsaW1QYXJhbSA9ICJkZWxpbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgTE9BRF9QQUdFID0gImxvYWRwYWdlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRklOSVNIX1BBR0UgPSAiZmluaXNocGFnZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERhdGFGaWxlUGFyYW0gPSAiZGF0YWZpbGUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEYXRhRmlsZSA9ICJ0cmVlLmRhdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE5vbmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSHR0cCA9ICJodHRwOi8vIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgSHR0cHMgPSAiaHR0cHM6Ly8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGdHAgPSAiZnRwOi8vIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRmlsZSA9ICJmaWxlOi8iOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTbGFzaCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU3BhY2UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFppcEZpbGUgPSAiLnppcCI7IC8vJE5PTi1OTFMtMSQKLSAgICAvL0NvbG9yIHBhcmFtZXRlcnMKLSAgICBzdGF0aWMgU3RyaW5nIEJnQ29sb3JQYXJhbSA9ICJiZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgQmdDb2xvciA9ICIyNTUsMjU1LDI1NSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZnQ29sb3JQYXJhbSA9ICJmZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRmdDb2xvciA9ICIwLDAsMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFNlbEJnQ29sb3JQYXJhbSA9ICJzZWxiZ2NvbG9yIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2VsQmdDb2xvciA9ICIwLDAsMjU1IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgU2VsRmdDb2xvclBhcmFtID0gInNlbGZnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBTZWxGZ0NvbG9yID0gIjI1NSwyNTUsMjU1IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVmlzaXRDb2xvclBhcmFtID0gInZpc2l0Y29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBWaXNpdENvbG9yID0gIjI1NSw1MSw1MSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIE1vdXNlT3ZlckNvbG9yUGFyYW0gPSAibW91c2VvdmVyY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBNb3VzZU92ZXJDb2xvciA9ICJibHVlIjsgLy8kTk9OLU5MUy0xJAotCi0KLSAgICAvL0ZyYW1lIHBhcmFtZXRlcnMKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsUG9zUGFyYW0gPSAibGFiZWxwb3MiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBMYWJlbFBvcyA9ICJiZWxvdyI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lVGl0bGVQYXJhbSA9ICJmcmFtZXRpdGxlIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRnJhbWVUaXRsZSA9ICJUcmVlIEJyb3dzZXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGcmFtZVdpZHRoUGFyYW0gPSAiZnJhbWV3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lSGVpZ2h0UGFyYW0gPSAiZnJhbWVoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGcmFtZVdpZHRoID0gIjI1MCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lSGVpZ2h0ID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIEZyYW1lUGFyYW0gPSAiZnJhbWUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0RnJhbWUgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBGYWxzZSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIFRydWUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotICAgIHN0YXRpYyBTdHJpbmcgTGFiZWxQYXJhbSA9ICJmcmFtZWxhYmVsIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExhYmVsID0gIlRyZWUgQnJvd3NlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsQmdDb2xvclBhcmFtPSAiZnJhbWVsYWJlbGJnY29sb3IiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0TGFiZWxCZ0NvbG9yPSAiMjU1LDI1NSwyNTUiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBCb3JkZXJQYXJhbSA9ICJib3JkZXIiOyAvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0Qm9yZGVyID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLy9UcmVlIGNvbnN0YW50cwotICAgIHN0YXRpYyBTdHJpbmcgQ2VsbFNpemVQYXJhbSA9ICJjZWxsc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRDZWxsU2l6ZSA9ICIxNiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgaW50IEltYWdlSW5zZXQgPSAzOwotICAgIHN0YXRpYyBpbnQgVGV4dEluc2V0ID0gNjsKLSAgICBzdGF0aWMgaW50IFRleHRCYXNlTGluZSA9IDM7Ci0gICAgc3RhdGljIGludCBEb3VibGVDbGlja1Jlc29sdXRpb24gPSAzMzM7Ci0gICAgc3RhdGljIGludCBTY3JvbGxXaWR0aCA9IDE2OwotICAgIHN0YXRpYyBTdHJpbmcgU2Nyb2xsQmFyTGVmdFBhcmFtID0gInNjcm9sbGJhcnRvbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0gICAgc3RhdGljIFN0cmluZyBEZWZhdWx0VGFyZ2V0UGFyYW0gPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFRhcmdldCA9ICJfdG9wIjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgVHJlZUZvbnRQYXJhbSA9ICJ0cmVlZm9udCI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIERlZmF1bHRUcmVlRm9udCA9ICJBcmlhbCxQTEFJTiwxMiI7IC8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgU3RyaW5nIExhYmVsRm9udFBhcmFtID0gImZyYW1lbGFiZWxmb250IjsgLy8kTk9OLU5MUy0xJAotICAgIHN0YXRpYyBTdHJpbmcgRGVmYXVsdExhYmVsRm9udCA9ICJBcmlhbCxCT0xELDEyIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWZpbml0aW9uT2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRGVmaW5pdGlvbk9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODc2ODRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9EZWZpbml0aW9uT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLy9PYmplY3QgaG9sZGluZyBkZWZpbml0aW9uZmlsZSBpbmZvcm1hdGlvbgotcHVibGljIGNsYXNzIERlZmluaXRpb25PYmplY3QKLXsKLSAgcHJpdmF0ZSBTdHJpbmcgaW5kZXh0aXRsZSA9ICJJbmRleCAtIEJhc2ljIFVuaWZpZWQgUHJvY2VzcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgc2VlID0gIiwgU2VlICI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBTdHJpbmcgc2VlYWxzbyAgPSAiLCBTZWUgYWxzbyAiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgU3RyaW5nIGNoYXJhY3RlcnNldCA9ICJ1dGYtOCI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGtleVdvcmRTZXBhcmF0b3IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLSAgU3RyaW5nIGxldmVsU2VwYXJhdG9yUmVwbGFjZSA9ICI6IjsgLy8kTk9OLU5MUy0xJAotICBTdHJpbmcgd3d3Um9vdCA9IG51bGw7Ci0gIGludCBzdGlwTGVuZ3RoPTA7Ci0gIFN0cmluZyByZWxhdGl2ZXBhdGggPSBudWxsOwotICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBzcGVjS2V5V29yZEZpbGU9bnVsbDsKLSAgU3RyaW5nIG1haW5SZXN1bHRGaWxlPW51bGw7Ci0gIFN0cmluZyBpbmRleFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGluZGV4VGFyZ2V0PW51bGw7Ci0gIFN0cmluZyBpbmRleEhlaWdodD1udWxsOwotICBTdHJpbmcga2V5d29yZFRhcmdldD1udWxsOwotICBTdHJpbmcga2V5d29yZFJlc3VsdEZpbGU9bnVsbDsKLSAgU3RyaW5nIGhlYWRlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGZvb3RlckZpbGU9bnVsbDsKLSAgU3RyaW5nIGtleVdvcmRQcmVmaXg9RGVmLkRlZmF1bHRLZXlXb3JkUHJlZml4OwotICBTdHJpbmcga2V5V29yZExldmVsU2VwYXJhdG9yPURlZi5EZWZhdWx0S2V5V29yZExldmVsU2VwYXJhdG9yOwotCi0gIGJvb2xlYW4gbXVsdGlkb2N1bWVudGtleXdvcmQ9ZmFsc2U7Ci0gIGJvb2xlYW4gc2hvd2RvY3VtZW50dGl0bGU9ZmFsc2U7Ci0gIFZlY3RvciBzdG9wRGlyc1Y9bnVsbDsKLSAgIEhhc2h0YWJsZSBmb250RGVmaW5pdGlvbnM9bnVsbDsKLSAgSGFzaHRhYmxlIHN0eWxlRGVmaW5pdGlvbnM9bnVsbDsKLQotICBwcml2YXRlIEZpbGUgZGVmRmlsZVJvb3Q7Ci0KLSAgLy9Db25zdHJ1Y3RvciB0aGF0IHBhcnNlcyB0aGUgZGVmaW5pdGlvbmZpbGUKLSAgRGVmaW5pdGlvbk9iamVjdChTdHJpbmcgcHViRGlyLCBTdHJpbmcgZGVmZmlsZSwgU3RyaW5nIGNoYXJTZXQpCi0gIHsKLQkgIHNldHd3d1Jvb3QocHViRGlyKTsKLQkgIGRlZkZpbGVSb290ID0gbmV3IEZpbGUoZGVmZmlsZSkuZ2V0UGFyZW50RmlsZSgpOwotCi0gICAgIC8vIFJlYWQgdGhlIGRlZmluaXRpb24gZmlsZSBhbmQgc3BsaXQgdGhlIGRlZmZpbGUgaW50byBpdCdzIGluZGl2aWR1YWwgbGluZXMuCi0JU3RyaW5nIGluZmlsZSA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZGVmZmlsZSxjaGFyU2V0KTsKLSAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbmZpbGUsICJcdFxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICBzdG9wRGlyc1YgPSBuZXcgVmVjdG9yKCk7Ci0gICAgIGZvbnREZWZpbml0aW9ucyA9IG5ldyBIYXNodGFibGUoMTApOwotICAgICBzdHlsZURlZmluaXRpb25zID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0gICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIHBhcmFtID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQotICAgICAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5MZXZlbEZvbnQpKQotICAgICAgICB7Ci0gICAgICAgICAgIGFzaWduRm9udChwYXJzZXIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTGV2ZWxTdHlsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgYXNpZ25TdHlsZShwYXJzZXIpOwotICAgICAgICB9ICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICBpZih2YWx1ZT09bnVsbCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDphZGRWYWx1ZVxuIiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICBIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgKyBwYXJhbSk7Ci0gICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGFzaWduVmFsdWUocGFyYW0sIHZhbHVlKTsKLSAgICAgICAgfQotICAgICB9Ci0KLSAgfQotCi0gIC8vQ2hlY2sgaWYgZW5vdWdoIGlucHV0IGlzIHJlYWQKLSAgYm9vbGVhbiBlbm91Z2hJbnB1dCgpCi0gIHsKLSAgICAgYm9vbGVhbiBlbm91Z2g9dHJ1ZTsKLSAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgIGlmKHd3d1Jvb3Q9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLldXV1Jvb3RQYXJhbSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGtleXdvcmRSZXN1bHRGaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5LZXlXb3JkUmVzdWx0RmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGluZGV4UmVzdWx0RmlsZSE9bnVsbCAmJiBtYWluUmVzdWx0RmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuTWFpblJlc3VsdEZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4VGFyZ2V0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaW5kZXhSZXN1bHRGaWxlIT1udWxsICYmIGtleXdvcmRUYXJnZXQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLktleVdvcmRUYXJnZXQpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBpZihpbmRleFJlc3VsdEZpbGUhPW51bGwgJiYgaW5kZXhIZWlnaHQ9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkluZGV4SGVpZ2h0KTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYocmVsYXRpdmVwYXRoPT1udWxsKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyArIERlZi5SZWxQYXRoKTsKLSAgICAgICAgZW5vdWdoPWZhbHNlOwotICAgICB9Ci0KLSAgICAgaWYoaGVhZGVyRmlsZT09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuUEFSQU1FVEVSX01JU1NJTkcgKyBEZWYuSGVhZGVyRmlsZSk7Ci0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotCi0gICAgIGlmKGZvb3RlckZpbGU9PW51bGwpCi0gICAgIHsKLSAgICAgICAgYnVmZi5hcHBlbmQoSGVscE1lc3NhZ2VzLlBBUkFNRVRFUl9NSVNTSU5HICsgRGVmLkZvb3RlckZpbGUpOwotICAgICAgICBlbm91Z2g9ZmFsc2U7Ci0gICAgIH0KLQotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgIEZvbnRPYmplY3QgZnMgPSAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChEZWYuRGVmYXVsdFN0eWxlKTsKLSAgICAgaWYoZj09bnVsbCAmJiBmcz09bnVsbCkKLSAgICAgewotICAgICAgICBidWZmLmFwcGVuZChIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyArIERlZi5EZWZhdWx0Rm9udCArICIgIiArIERlZi5EZWZhdWx0U3R5bGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGVub3VnaD1mYWxzZTsKLSAgICAgfQotICAgICBpZighZW5vdWdoKQotICAgICB7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihidWZmKTsKLSAgICAgfQotICAgICByZXR1cm4gZW5vdWdoOwotICB9Ci0KLQotICAvL0FzaWducyB2YWx1ZXMgdG8gdGhlIGRpZmZlcmVudCBhdHRyaWJ1dGVzCi0gIHByaXZhdGUgdm9pZCBhc2lnblZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5NYWluUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIG1haW5SZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuQ2hhcmFjdGVyU2V0KSkKLSAgICB7Ci0gICAgICAgY2hhcmFjdGVyc2V0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlKSkKLSAgICB7Ci0gICAgICAgc2VlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuU2VlQWxzbykpCi0gICAgewotICAgICAgIHNlZWFsc28gPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleFJlc3VsdEZpbGUpKQotICAgIHsKLSAgICAgICBpbmRleFJlc3VsdEZpbGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkUmVzdWx0RmlsZSkpCi0gICAgewotICAgICAgIGtleXdvcmRSZXN1bHRGaWxlID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZGVyRmlsZSkpCi0gICAgewotICAgICAgIGhlYWRlckZpbGUgPSBuZXcgRmlsZShkZWZGaWxlUm9vdCwgdmFsdWUpLmdldEFic29sdXRlUGF0aCgpOzsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5Gb290ZXJGaWxlKSkKLSAgICB7Ci0gICAgICAgZm9vdGVyRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7OwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlJlbFBhdGgpKQotICAgIHsKLSAgICAgICByZWxhdGl2ZXBhdGggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5EZWZhdWx0VGFyZ2V0UGFyYW0pKQotICAgIHsKLSAgICAgICB0YXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkRmlsZSkpCi0gICAgewotICAgICAgIHNwZWNLZXlXb3JkRmlsZSA9IG5ldyBGaWxlKGRlZkZpbGVSb290LCB2YWx1ZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuSW5kZXhUaXRsZSkpCi0gICAgewotICAgICAgIGluZGV4dGl0bGUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkVGFyZ2V0KSkKLSAgICB7Ci0gICAgICAga2V5d29yZFRhcmdldCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkluZGV4VGFyZ2V0KSkKLSAgICB7Ci0gICAgICAgaW5kZXhUYXJnZXQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JbmRleEhlaWdodCkpCi0gICAgewotICAgICAgIGluZGV4SGVpZ2h0ID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuTXVsdGlEb2NLZXlXb3JkKSkKLSAgICB7Ci0gICAgICAgbXVsdGlkb2N1bWVudGtleXdvcmQgPSB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5UcnVlKTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5TaG93RG9jVGl0bGUpKQotICAgIHsKLSAgICAgICBzaG93ZG9jdW1lbnR0aXRsZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLlRydWUpOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkxlYXZlRGlyKSkKLSAgICB7Ci0gICAgICAgc3RvcERpcnNWLmFkZEVsZW1lbnQodmFsdWUpOwotICAgIH0KLSAgICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZShEZWYuS2V5V29yZFByZWZpeCkpCi0gICAgewotICAgICAgIGtleVdvcmRQcmVmaXggPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKERlZi5LZXlXb3JkTGV2ZWxTZXBhcmF0b3IpKQotICAgIHsKLSAgICAgICBrZXlXb3JkTGV2ZWxTZXBhcmF0b3IgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLQotICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSArIHBhcmFtKTsKLSAgICB9Ci0KLSAgfQotCi0gIC8vUGFyc2VzIGEgZm9udGRlZmluaXRpb24KLSAgcHJpdmF0ZSB2b2lkIGFzaWduRm9udChTdHJpbmdUb2tlbml6ZXIgcGFyc2VyKQotICB7Ci0gICAgU3RyaW5nIHN0cmluZ0xldmVsID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBPYmplY3Qga2V5ID0gc3RyaW5nTGV2ZWw7Ci0gICAgaWYoIXN0cmluZ0xldmVsLmVxdWFsc0lnbm9yZUNhc2UoRGVmLkRlZmF1bHRGb250KSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVGb250KSkKLSAgICB7Ci0gICAgICAga2V5ID0gIG5ldyBJbnRlZ2VyKHN0cmluZ0xldmVsKTsKLSAgICB9Ci0gICAgU3RyaW5nIG5hbWUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIFN0cmluZyBzdHlsZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgU3RyaW5nIHNpemUgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotCi0gICAgZm9udERlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3QobmFtZSwgc3R5bGUsIHNpemUpKTsKLSAgfQotCi0gIC8vUGFyc2VzIGEgc3R5bGVkZWZpbml0aW9uCi0gIHByaXZhdGUgdm9pZCBhc2lnblN0eWxlKFN0cmluZ1Rva2VuaXplciBwYXJzZXIpCi0gIHsKLSAgICBTdHJpbmcgc3RyaW5nTGV2ZWwgPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgIE9iamVjdCBrZXkgPSBzdHJpbmdMZXZlbDsKLSAgICBpZighc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuRGVmYXVsdFN0eWxlKSAmJiAhc3RyaW5nTGV2ZWwuZXF1YWxzSWdub3JlQ2FzZShEZWYuSGVhZExpbmVTdHlsZSkpCi0gICAgewotICAgICAgIGtleSA9ICBuZXcgSW50ZWdlcihzdHJpbmdMZXZlbCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHN0eWxlID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICBzdHlsZURlZmluaXRpb25zLnB1dChrZXksbmV3IEZvbnRPYmplY3Qoc3R5bGUpKTsKLSAgfQotICAKLSAgLy9DaGVjayBpZiB0aGUgcmVhY2hlZCBkaXJlY3RvcnkgaXMgd2hpdGhpbiB0aGUgc3RvcGRpcmxpc3QKLSAgICBib29sZWFuIGlzSW5TdG9wZGlyKFN0cmluZyBzdHIpCi0gICB7Ci0gICAgICBmb3IoaW50IGk9MDtpPHN0b3BEaXJzVi5zaXplKCk7aSsrKQotICAgICAgewotICAgICAgICAgU3RyaW5nIHRtcFN0ciA9IChTdHJpbmcpIHN0b3BEaXJzVi5lbGVtZW50QXQoaSk7Ci0gICAgICAgICBpZihzdHIuc3Vic3RyaW5nKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpLmxlbmd0aCgpKzEpLmNvbXBhcmVUbyh0bXBTdHIpPT0wKQotICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvL0FjY2Vzc21ldGhvZHMKLSAgU3RyaW5nIGdldEluZGV4VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4dGl0bGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlKCkKLSAgewotICAgIHJldHVybiBzZWU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0U2VlQWxzbygpCi0gIHsKLSAgICByZXR1cm4gc2VlYWxzbzsKLSAgfQotCi0gIFN0cmluZyBnZXRDaGFyYWN0ZXJTZXQoKQotICB7Ci0gICAgcmV0dXJuIGNoYXJhY3RlcnNldDsKLSAgfQotICBib29sZWFuIGdldE11bGl0RG9jdW1lbnRLZXl3b3JkKCkKLSAgewotICAgIHJldHVybiBtdWx0aWRvY3VtZW50a2V5d29yZDsKLSAgfQotCi0gIGJvb2xlYW4gZ2V0U2hvd0RvY3VtZW50VGl0bGUoKQotICB7Ci0gICAgcmV0dXJuIHNob3dkb2N1bWVudHRpdGxlOwotICB9Ci0KLSAgU3RyaW5nIGdldEtleVdvcmRUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRUYXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhUYXJnZXQoKQotICB7Ci0gICAgcmV0dXJuIGluZGV4VGFyZ2V0OwotICB9Ci0KLSAgU3RyaW5nIGdldEluZGV4SGVpZ2h0KCkKLSAgewotICAgIHJldHVybiBpbmRleEhlaWdodDsKLSAgfQotCi0gIFN0cmluZyBnZXRXd3dSb290KCkKLSAgewotICAgIHJldHVybiB3d3dSb290OwotICB9Ci0KLSAgaW50IGdldFd3d1Jvb3RMZW5ndGgoKQotICB7Ci0gICAgcmV0dXJuIHN0aXBMZW5ndGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0VGFyZ2V0KCkKLSAgewotICAgIHJldHVybiB0YXJnZXQ7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5V29yZEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIHNwZWNLZXlXb3JkRmlsZTsKLSAgfQotCi0gIFN0cmluZyBnZXRNYWluUmVzdWx0RmlsZSgpCi0gIHsKLSAgICByZXR1cm4gbWFpblJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SW5kZXhSZXN1bHRGaWxlKCkKLSAgewotICAgIHJldHVybiBpbmRleFJlc3VsdEZpbGU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0S2V5d29yZFJlc3VsdEZpbGUoKQotICB7Ci0gICAgcmV0dXJuIGtleXdvcmRSZXN1bHRGaWxlOwotICB9Ci0KLQotICBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKCkKLSAgewotICAgIHJldHVybiByZWxhdGl2ZXBhdGg7Ci0gIH0KLQotICBTdHJpbmcgZ2V0SGVhZGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gaGVhZGVyRmlsZTsKLSAgfQotCi0gICBTdHJpbmcgZ2V0Rm9vdGVyRmlsZSgpCi0gIHsKLSAgICByZXR1cm4gZm9vdGVyRmlsZTsKLSAgfQotCi0gU3RyaW5nIGdldEtleVdvcmRQcmVmaXgoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkUHJlZml4OwotIH0KLQotIFN0cmluZyBnZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKQotIHsKLSAgIHJldHVybiBrZXlXb3JkTGV2ZWxTZXBhcmF0b3I7Ci0gfQotCi0gRm9udE9iamVjdCBnZXRGb250KGludCBsZXZlbCkKLSAgewotICAgICBGb250T2JqZWN0IGYgPSAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KG5ldyBJbnRlZ2VyKGxldmVsKSk7Ci0gICAgIGlmKGY9PW51bGwpCi0gICAgIHsKLSAgICAgICAgZiA9IChGb250T2JqZWN0KWZvbnREZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRGb250KTsKLSAgICAgfQotICAgICByZXR1cm4gZjsKLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0Rm9udChPYmplY3Qga2V5KQotICB7Ci0gICAgIHJldHVybiAoRm9udE9iamVjdClmb250RGVmaW5pdGlvbnMuZ2V0KGtleSk7Ci0KLSAgfQotCi0gIEZvbnRPYmplY3QgZ2V0U3R5bGVTaGVldChpbnQgbGV2ZWwpCi0gIHsKLSAgICAgRm9udE9iamVjdCBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQobmV3IEludGVnZXIobGV2ZWwpKTsKLSAgICAgaWYoZj09bnVsbCkKLSAgICAgewotICAgICAgICBmID0gKEZvbnRPYmplY3Qpc3R5bGVEZWZpbml0aW9ucy5nZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIGY7Ci0gIH0KLQotICBGb250T2JqZWN0IGdldFN0eWxlU2hlZXQoT2JqZWN0IGtleSkKLSAgewotICAgIHJldHVybiAoRm9udE9iamVjdClzdHlsZURlZmluaXRpb25zLmdldChrZXkpOwotICB9Ci0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLGludCBsZXZlbCkKLSAgewotICAgIGlmKGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk9PW51bGwpCi0gICAgewotICAgICAgRm9udE9iamVjdCBmID0gZ2V0Rm9udChsZXZlbCk7Ci0gICAgICBpZihmPT1udWxsKQotICAgICAgewotICAgICAgICBmID0gZ2V0Rm9udChEZWYuRGVmYXVsdEZvbnQpOwotICAgICAgfQotICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRm9udE9iamVjdCBmID0gZ2V0U3R5bGVTaGVldChsZXZlbCk7Ci0gICAgICAgIGlmKGY9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgZiA9IGdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRTdGFydChvdXRQLCBmKTsKLSAgICB9Ci0gIH0KLSAgdm9pZCBwcmludFN0YXJ0KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLEZvbnRPYmplY3QgZikKLSAgewotCi0gICAgaWYob3V0UD09bnVsbCkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVmaW5pdGlvbk9iamVjdDpwcmludFN0YXJ0XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEZPTlQgRkFDRT1cIiIgKyBmLmdldE5hbWUoKSArICJcIiBTSVpFPVwiIiArIGYuZ2V0U2l6ZSgpICsgIlwiID5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgaWYoZi5pc0l0YWxpYygpKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIjxJPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPEI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPFAgQ0xBU1M9XCIiICsgZi5nZXRTdHlsZVNoZWV0KCkgKyAiXCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IGxldmVsKQotICB7Ci0KLSAgICBpZihvdXRQPT1udWxsKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZWZpbml0aW9uT2JqZWN0OnByaW50RW5kXG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYoZ2V0U3R5bGVTaGVldChEZWYuRGVmYXVsdFN0eWxlKT09bnVsbCkKLSAgICB7Ci0gICAgICBGb250T2JqZWN0IGYgPSBnZXRGb250KGxldmVsKTsKLSAgICAgIGlmKGY9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIGYgPSBnZXRGb250KERlZi5EZWZhdWx0Rm9udCk7Ci0gICAgICB9Ci0gICAgICBwcmludEVuZChvdXRQLCBmKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJpbnRFbmQob3V0UCwgbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBwcmludEVuZChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgRm9udE9iamVjdCBmKQotICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmluaXRpb25PYmplY3Q6cHJpbnRFbmRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZihmIT1udWxsICYmIGYuZ2V0U3R5bGVTaGVldCgpPT1udWxsKQotICAgIHsKLSAgICAgIGlmKGYuaXNCb2xkKCkpCi0gICAgICB7Ci0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9CPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0KLSAgICAgIGlmKGYuaXNJdGFsaWMoKSkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L0k+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwiPC9GT05UPlxuIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCI8L1A+XG4iKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLwotICAvLwlSUFcgMi4wIEludGVncmF0aW9uIC0tIERvIG5vdCBtb2RpZnkgdGhpcyBjb2RlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0gIC8vCSAgLy8JQmVjYXVzZSBSUFcgY2FsbHMgdGhlc2UgYXBwbGljYXRpb25zIGZyb20gYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhhbiB0aGUgYmF0Y2ggZmlsZQotICAvLwlpdCBpcyBuZWNjZXNzYXJ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBpbiB0aGUgY29uZmlnIGZpbGUuCi0gIC8vCi0gIC8vCVRoZSBmb2xsb3dpbmcgbWV0aG9kcyBzaW1wbHkgYWxsb3cgdGhlIHZhbHVlcyB0byBiZSBvdmVyLXJpZGRlbi4KLSAgLy8KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHB1YmxpYyB2b2lkIHNldHd3d1Jvb3QoU3RyaW5nIG5ld1Jvb3QpCi0gIHsKLSAgICAgIHRyeSB7Ci0JCUZpbGUgd3d3RGlyID0gbmV3IEZpbGUobmV3Um9vdCk7Ci0JCXd3d1Jvb3QgPSB3d3dEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpICsgIi8iOyAvLyROT04tTkxTLTEkCi0JCXd3d1Jvb3QgPSB3d3dSb290LnJlcGxhY2UoJ1xcJyAsICcvJyk7Ci0JCXN0aXBMZW5ndGggPSB3d3dSb290Lmxlbmd0aCgpLTE7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCX0KLSAgfQotCi0gIHZvaWQgc2V0UmVsYXRpdmVQYXRoKFN0cmluZyBuZXdQYXRoKQotICB7Ci0JcmVsYXRpdmVwYXRoID0gbmV3UGF0aDsKLSAgfQotICAKLSAgLyoqCi0gICAqIHNldCB0aGUgaW5kZXggdGl0bGUKLSAgICogCi0gICAqIEBwYXJhbSB0aXRsZSBTdHJpbmcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEluZGV4VGl0bGUoU3RyaW5nIHRpdGxlKQotICB7Ci0JICBpbmRleHRpdGxlID0gdGl0bGU7Ci0gIH0gIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Eb2N1bWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjgzZjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1jbGFzcyBEb2N1bWVudAotewotICAgIC8vVGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudAotICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlPW51bGw7Ci0KLSAgICAvL1RoZSB1cmwgdG8gdGhlIGRvY3VtZW50Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsPW51bGw7Ci0gICAvLyBwcml2YXRlIEFuY2hvciBhbmNob3I9bnVsbDsKLQotICAgIC8vVGhlIHBhcmVudCBLZXlXb3JkCi0gICAgcHJpdmF0ZSBLZXlXb3JkIHBhcmVudE09bnVsbDsKLQotICAgIERvY3VtZW50KFN0cmluZyB0aXRsZSwgU3RyaW5nIHVybCkKLSAgICB7Ci0gICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOwotICAgICAgIHRoaXMudXJsID0gIHVybC5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldEtleVdvcmQoS2V5V29yZCBrZXkpCi0gICAgewotICAgICAgIHBhcmVudE0gPSBrZXk7Ci0gICAgfQotICAgIFN0cmluZyBnZXRUaXRsZSgpCi0gICAgewotICAgICAgIHJldHVybiB0aXRsZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0VXJsKCkKLSAgICB7Ci0gICAgCWludCBmaXJzdCA9IHVybC5pbmRleE9mKCIjIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBpZihwYXJlbnRNIT1udWxsICYmIGZpcnN0IDwgMCkKLSAgICAgICAgewotICAgICAgICAgICByZXR1cm4gdXJsICs9IiMiICsgcGFyZW50TS5nZXRBbmNob3IoKTsgLy8kTk9OLU5MUy0xJCAKLSAgICAgICAgfQotCi0JCWlmIChmaXJzdCA+IDAgJiYgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkgPiAwKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCXJldHVybiB1cmwuc3Vic3RyaW5nKDAsIGZpcnN0ICsgdXJsLmluZGV4T2YoIiMiLCBmaXJzdCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotICAgICAgIHJldHVybiB1cmw7Ci0gICAgfQotCi0gICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCkKLSAgICB7Ci0gICAgICAgIGlmKG91dFA9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvY3VtZW50LnByaW50XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgdG90YWxVcmwgPSB1cmw7Ci0gICAgICAgIFN0cmluZyB0bXBUaXRsZT1udWxsOwotCi0gICAgICAgICAgIHRtcFRpdGxlICA9IHRpdGxlOwotICAgICAgICAgICBpZihwYXJlbnRNIT1udWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgdG90YWxVcmwrPSIjIiArIHBhcmVudE0uZ2V0QW5jaG9yKCk7IC8vJE5PTi1OTFMtMSQgCi0gICAgICAgICAgIH0KLQotCi0gICAgICAgIGlmKHRtcFRpdGxlPT1udWxsIHx8IHRtcFRpdGxlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHRtcFRpdGxlID0gIjxGT05UIENPTE9SPVwiIzAwOTkzM1wiPkhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORzwvRk9OVD4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGFyZ2V0PW51bGw7Ci0gICAgICAgIGlmKCFLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFRhcmdldCgpLmVxdWFscygiICIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgdGFyZ2V0ID0gIiBUQVJHRVQ9XCIiICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRUYXJnZXQoKSArICJcIiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotCi0gICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxBIEhSRUY9XCIiICsgdG90YWxVcmwgKyAiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBpZih0YXJnZXQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCB0YXJnZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPiIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgdG1wVGl0bGUgKyAiPC9BPiIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Gb250T2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvRm9udE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzMwNGVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9Gb250T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotCi0KLWNsYXNzIEZvbnRPYmplY3QKLXsKLSAgU3RyaW5nIG5hbWUgPSBudWxsOwotICBTdHJpbmcgc3R5bGUgPSBudWxsOwotICBTdHJpbmcgc2l6ZSA9IG51bGw7Ci0gIFN0cmluZyBzdHlsZVNoZWV0ID0gbnVsbDsKLQotICBGb250T2JqZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgc3R5bGUsIFN0cmluZyBzaXplKQotICB7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLnN0eWxlID0gc3R5bGU7Ci0gICAgdGhpcy5zaXplID0gc2l6ZTsKLSAgfQotCi0gIEZvbnRPYmplY3QoU3RyaW5nIHN0eWxlU2hlZXQpCi0gIHsKLSAgICB0aGlzLnN0eWxlU2hlZXQgPSBzdHlsZVNoZWV0OwotICB9Ci0KLSAgU3RyaW5nIGdldFN0eWxlU2hlZXQoKQotICB7Ci0gICAgcmV0dXJuIHN0eWxlU2hlZXQ7Ci0gIH0KLQotICBib29sZWFuIGlzQm9sZCgpCi0gIHsKLSAgICByZXR1cm4gc3R5bGUuZXF1YWxzSWdub3JlQ2FzZShEZWYuQm9sZCk7Ci0gIH0KLQotICBib29sZWFuIGlzSXRhbGljKCkKLSAgewotICAgIHJldHVybiBzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKERlZi5JdGFsaWMpOwotICB9Ci0KLSAgU3RyaW5nIGdldFNpemUoKQotICB7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHZvaWQgcHJpbnQoU3RyaW5nQnVmZmVyIG91dFApCi0gIHsKLSAgICBpZihzdHlsZVNoZWV0IT1udWxsKQotICAgIHsKLSAgICAgICAgb3V0UC5hcHBlbmQoc3R5bGVTaGVldCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgb3V0UC5hcHBlbmQobmFtZSArICJcdCIgKyBzdHlsZSArICJcdCIgKyBzaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIG91dFAuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSGVscE1lc3NhZ2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSGVscE1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzFkNDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0hlbHBNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotY2xhc3MgSGVscE1lc3NhZ2VzCi17Ci0KLSAgc3RhdGljIFN0cmluZyBFWENFUFRJT04gPSAiRXhjZXB0aW9uOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQkFEX09VVFBVVF9TVFJFQU0gPSAiQmFkIG91dHB1dCBzdHJlYW0hIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJBRF9QQVJTRVIgPSAiQmFkIHBhcnNlciBvYmplY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIElOUFVUX1BBUkFNRVRFUl9OVUxMID0gIklucHV0IHBhcmFtZXRlciBpcyBudWxsISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlZBTElEX1BBUkFNRVRFUl9OQU1FID0gIk5vIHZhbGlkIHBhcmFtZXRlciBuYW1lZCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVhDRVBUSU9OID0gIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGZpbGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfVVJMID0gIk1pc3NpbmcgdXJsICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xBQkVMID0gIk1pc3NpbmcgbGFiZWwgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfTk9ERSA9ICJNaXNzaW5nIG5vZGUgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRV9GQUlMRUQgPSAiRXJyb3IgcmVhZGluZyBmaWxlICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXUklURV9GSUxFID0gIldyaXRlcyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV1JJVEVfRVJST1IgPSAiRXJyb3Igd3JpdGluZyBmaWxlOiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkcgPSAiUGFyYW1ldGVyIG1pc3Npbmc6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBQQVJBTUVURVJfTk9UX05VTUJFUiA9ICIgaGF2ZSB0byBiZSBhIG51bWJlciwgdGhlIHZhbHVlIGlzIG5vdCBhIG51bWJlciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUgPSAiVmFsdWUgbWlzc2luZyBmb3IgcGFyYW1ldGVyICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGT05UX0FORF9TVFlMRV9NSVNTSU5HID0gIkJvdGggb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT19ESVJFQ1RPUlkgPSAiIGlzIG5vdCBhIHJlYWRhYmxlIGRpcmVjdG9yeSEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRElSRUNUT1JZX05PVF9QQVJTRUQgPSAiRG9lcyBub3QgcGFyc2UgZGlyZWN0b3J5ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBOT1RfRU5PVUdIX0lOUFVUID0gIk5vdCBlbm91Z2ggaW5wdXQsIG9wZXJhdGlvbiBjYW5jZWxlZCEiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgSU5DT1JSRUNUX0hFQURFUkZJTEUgPSAiSGVhZGVyIGZpbGUgcHJvYmFibHkgaW5jb3JyZWN0ISI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTkNPUlJFQ1RfRk9PVEVSRklMRSA9ICJGb290ZXIgZmlsZSBwcm9iYWJseSBpbmNvcnJlY3QhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfU1lOVEFYX0VSUk9SID0gIiBpcyBub3QgYSB2YWxpZCBrZXkgd29yZCEgSGF2ZSB0byBiZWdpbiB3aXRoICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBLRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gIiBjb250YWluaW5nIGtleXdvcmRzIGNvbnRhaW5zIHN5bnRheCBlcnJvcnMhIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIFJFTEFURURfS0VZV09SRF9OT1RfRk9VTkQgPSAiIHJlZmZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcga2V5d29yZCBkb2VzIG5vdCBleGlzdCAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgUEFSU0VfRElSRUNUT1JZID0gIlBhcnNlcyBkaXJlY3Rvcnk6ICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUQUtFX0FfV0hJTEUgPSAiSXQgbWF5IHRha2UgYSB3aGlsZSAuLi4iOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgVElUTEVfQU5DSE9SX01JU1NJTkcgPSAiVGl0bGUgYW5kL29yIGFuY2hvciB0ZXh0IGlzIG1pc3NpbmchIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfUkVTUE9OU0VfRklMRSA9ICJFcnJvcjogTWlzc2luZyAtciByZXNwb25zZSBmaWxlIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE5PX09GX0NIQVJBQ1RFUlNfUkVBRCA9ICIgY2hhcnMgcmVhZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9fT0ZfRklMRVNfQ0hFQ0tFRCA9ICIgZmlsZXMgY2hlY2tlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgU0VDT05EID0gIiBzICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBXT1JEUyA9ICIgd29yZHMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ09NUElMRUQgPSAiQ29tcGlsZWQgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIERPQ1VNRU5UU19DT05BVElOSU5HID0gIiBkb2N1bWVudHMsIGNvbnRhaW5pbmcgIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEJZVEVTX1NUT1JFRCA9ICIgYnl0ZXMsIHN0b3JlZCBpbiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgV0VCX0RBVEFCQVNFID0gIldlYiBkYXRhYmFzZSBvZiAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQ0RST01fREFUQUJBU0UgPSAiQ0QtUk9NIGRhdGFiYXNlIG9mICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBCWVRFUyA9ICAiYnl0ZXMiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgQllURVNfQU5EID0gICJieXRlcywgYW5kICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBGQVRBTF9FUlJPUiA9ICJGYXRhbCBFcnJvcjogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIEZJTEVfRE9FU19OT1RfRVhJU1QgPSAiRXJyb3I6IENvdWxkbid0IGZpbmQgZmlsZTogIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIE1JU1NJTkdfRl9GSUxFID0gIkVycm9yOiBNaXNzaW5nIC1mIGZpbGVuYW1lIjsgLy8kTk9OLU5MUy0xJAotICBzdGF0aWMgU3RyaW5nIENBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gIkVycm9yOiBjb3VsZG4ndCBjcmVhdGUgY2Fub25pY2FsIGZpbGVwYXRoIGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gICJEb2N1bWVudCBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBEQVRBX0RFUEVOREVOQ1lfTElTVCA9ICAiRGF0YSBkZXBlbmRhbmN5IGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBFWFRFUk5BTF9MSU5LX0xJU1QgPSAgIkV4dGVybmFsIGxpbmtzIGxpc3QgZm9yICI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBNSVNTSU5HX0xJTktfTElTVCA9ICAiTWlzc2luZyBsaW5rcyBsaXN0IGZvciAiOyAvLyROT04tTkxTLTEkCi0gIHN0YXRpYyBTdHJpbmcgTk9USElOR19UT19ETyA9ICAiRXJyb3I6IG5vdGhpbmcgdG8gZG86IC1uYiAtbmggLW5sIC1udCI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTlRFUk1FRElBVEVfREFUQV9GSUxFID0gICJJbnRlcm1lZGlhdGUgZGF0YTogZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBUT09fTUFOWV9GSUxFUyA9ICAiRXJyb3I6IFRvbyBtYW55IGZpbGVzIGZvciB0aGUgc2VhcmNoIGFwcGxldCBkYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLSAgc3RhdGljIFN0cmluZyBJTExFR0FMX05VTUVSSUNfVkFMVUUgPSAiRXJyb3I6IElsbGVnYWwgbnVtZXJpYyB2YWx1ZSAtaW0gIjsgLy8kTk9OLU5MUy0xJAotCi0gIHN0YXRpYyB2b2lkIGxvYWRIZWxwTWVzc2FnZXMoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgY2hhcmFjdGVyc2V0KQotICB7Ci0gICAgICAgU3RyaW5nIGhlbHBUZXh0cyA9IE1pc2NTdGF0aWMubG9hZEZpbGUoZmlsZU5hbWUsY2hhcmFjdGVyc2V0KTsKLSAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscFRleHRzLCAiXG5cdCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICB3aGlsZShwYXJzZXIuaGFzTW9yZVRva2VucygpKQotICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcGFyYW0gPSBwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgICAgSGVscE1lc3NhZ2VzLmFkZFZhbHVlKHBhcmFtLCAiICIgKyB2YWx1ZSArICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgfQotCi0gIHN0YXRpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyBwYXJhbSwgU3RyaW5nIHZhbHVlKQotICB7Ci0KLSAgICBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlBVVF9QQVJBTUVURVJfTlVMTCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSUxMRUdBTF9OVU1FUklDX1ZBTFVFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSUxMRUdBTF9OVU1FUklDX1ZBTFVFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiSU5URVJNRURJQVRFX0RBVEFfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLklOVEVSTUVESUFURV9EQVRBX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJUT09fTUFOWV9GSUxFUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRPT19NQU5ZX0ZJTEVTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfRklMRVNfQ0hFQ0tFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX09GX0ZJTEVTX0NIRUNLRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RISU5HX1RPX0RPIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9USElOR19UT19ETyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOVEVSTUVESUFURV9EQVRBX0ZJTEUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5JTlRFUk1FRElBVEVfREFUQV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRfREVQRU5ERU5DWV9MSVNUID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiREFUQV9ERVBFTkRFTkNZX0xJU1QiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5EQVRBX0RFUEVOREVOQ1lfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkVYVEVSTkFMX0xJTktfTElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkVYVEVSTkFMX0xJTktfTElTVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfTElOS19MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MSU5LX0xJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXT1JEUyIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldPUkRTID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQ09NUElMRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5DT01QSUxFRCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRPQ1VNRU5UU19DT05BVElOSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRE9DVU1FTlRTX0NPTkFUSU5JTkcgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCWVRFU19TVE9SRUQiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFU19TVE9SRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXRUJfREFUQUJBU0UiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5XRUJfREFUQUJBU0UgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDRFJPTV9EQVRBQkFTRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNEUk9NX0RBVEFCQVNFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQllURVMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5CWVRFUyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkJZVEVTX0FORCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJZVEVTX0FORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk1JU1NJTkdfRl9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19GX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJDQU5PTklDQUxfRklMRV9QQVRIX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkNBTk9OSUNBTF9GSUxFX1BBVEhfRkFJTEVEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTk9fT0ZfQ0hBUkFDVEVSU19SRUFEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9fT0ZfQ0hBUkFDVEVSU19SRUFEID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiRklMRV9ET0VTX05PVF9FWElTVCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZJTEVfRE9FU19OT1RfRVhJU1QgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGQVRBTF9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkZBVEFMX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiU0VDT05EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuU0VDT05EID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiQkFEX1BBUlNFUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9QQVJTRVIgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19SRVNQT05TRV9GSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19SRVNQT05TRV9GSUxFID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiVElUTEVfQU5DSE9SX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5USVRMRV9BTkNIT1JfTUlTU0lORyA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIktFWVdPUkRfRklMRV9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX0ZJTEVfU1lOVEFYX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiS0VZV09SRF9TWU5UQVhfRVJST1IiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlBBUlNFX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlBBUlNFX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIlRBS0VfQV9XSElMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLlRBS0VfQV9XSElMRSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9IRUFERVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0hFQURFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJSRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuUkVMQVRFRF9LRVlXT1JEX05PVF9GT1VORCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIklOQ09SUkVDVF9GT09URVJGSUxFIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5DT1JSRUNUX0ZPT1RFUkZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJOT1RfRU5PVUdIX0lOUFVUIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTk9UX0VOT1VHSF9JTlBVVCA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIk5PX0RJUkVDVE9SWSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk5PX0RJUkVDVE9SWSA9IHZhbHVlOwotICAgIH0KLSAgICBlbHNlIGlmKHBhcmFtLmVxdWFsc0lnbm9yZUNhc2UoIkRJUkVDVE9SWV9OT1RfUEFSU0VEIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRElSRUNUT1JZX05PVF9QQVJTRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJCQURfT1VUUFVUX1NUUkVBTSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRVhDRVBUSU9OIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiT1BFTl9GSUxFX0ZBSUxFRCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLk9QRU5fRklMRV9GQUlMRUQgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJXUklURV9FUlJPUiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0VSUk9SID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiV1JJVEVfRklMRSIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiTUlTU0lOR19VUkwiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX1VSTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX0xBQkVMIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuTUlTU0lOR19MQUJFTCAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJNSVNTSU5HX05PREUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5NSVNTSU5HX05PREUgID0gdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkciKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX01JU1NJTkdfVkFMVUUiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTUlTU0lOR19WQUxVRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJGT05UX0FORF9TVFlMRV9NSVNTSU5HIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuRk9OVF9BTkRfU1RZTEVfTUlTU0lORyAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgIGVsc2UgaWYocGFyYW0uZXF1YWxzSWdub3JlQ2FzZSgiUEFSQU1FVEVSX05PVF9OVU1CRVIiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIEhlbHBNZXNzYWdlcy5QQVJBTUVURVJfTk9UX05VTUJFUiAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZihwYXJhbS5lcXVhbHNJZ25vcmVDYXNlKCJJTlZBTElEX1BBUkFNRVRFUl9OQU1FIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBIZWxwTWVzc2FnZXMuSU5WQUxJRF9QQVJBTUVURVJfTkFNRSAgPSB2YWx1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBwYXJhbWV0ZXIgIiArIHBhcmFtKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0lPLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlNzAyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSU8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LkZvbnQ7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgQ2xhc3Mgd2l0aCBvbmx5IGNsYXNzIG1ldGhvZHMgdGhhdCBzaW1wbGlmaWVzIHNvbWUgY29tbXVuaWNhdGlvbnMKLSogIHdpdGggYSB3d3ctc2VydmVyIGFuZCBhbHNvIG91dHB1dCB0byB0aGUgSmF2YSBDb25zb2xlIFdpbmRvdy4KLSoKLSogIER1ZSB0byBzZWN1cml0eSBsaW1pdGF0aW9ucywgdGhlIG9ubHkgd3d3LXNlcnZlciByZWFjaGFibGUsCi0qICBpcyB0aGUgc2VydmVyIGZyb20gd2hpY2ggdGhlIGN1cnJlbnQgYXBwbGV0IGlzIGxvYWRlZCBmcm9tLgotKgotKiAgVGhpcyBjbGFzcyB1c2VzIHRoZSBFcnJvcldpbmRvdyBjbGFzcyBmb3Igc2hvd2luZyBlcnJvciBtZXNzYWdlcy4KLSoKLSogQHNlZSBydXB0b29scy5pby5FcnJvcldpbmRvdwotKgotKiBAdmVyc2lvbiAxLjAKLSogQGF1dGhvciBSYXRpb25hbCBTb2Z0d2FyZQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY2xhc3MgSU8KLXsKLSAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWdPbj1mYWxzZTsKLQotICAgLyoqCi0gICAqICBDbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgc2V0IG9mIHN0cmluZyBkZWxpbWl0ZXJzIHRoYXQgY2FuIGJlCi0gICAqICB1c2VkIHdoZW4gdG9rZW5pemluZyBhIHRleHQgc3RyaW5nLgotICAgKgotICAgKi8KLSAgIHN0YXRpYyBTdHJpbmcgZ2V0RGVsaW0oKQotICAgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgfQotCi0gICAvKioKLSAgICogIENsYXNzIG1ldGhvZCB0aGF0IGNvbnRyb2xzIGlmIGRlYnVnIGluZm8gc2hhbGwgYmUgc2hvd2VkIG9yIG5vdAotICAgKiAgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cuCi0gICAqCi0gICAqIEBwYXJhbSBpc09uIElmIDxiPnRydWU8L2I+IHRoZW4gZGVidWcgaW5mbyB3aWxsIGJlIHNob3dlZC4KLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBkZWJ1Zyhib29sZWFuIGlzT24pCi0gICB7Ci0gICAgICAgIGRlYnVnT24gPSBpc09uOwotICAgfQotCi0KLSAgIC8qKgotICAgKiAgUHJpbnQgRXJyb3IgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cKLSAgICoKLSAgICogQHBhcmFtIHN0ciBTdHJpbmcgdG8gcHJpbnQKLSAgICoKLSAgICovCi0gICBzdGF0aWMgdm9pZCBwcmludEVycm9yKCBTdHJpbmcgc3RyICkKLSAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXJyb3I6IiArIHN0ciApOyAvLyROT04tTkxTLTEkCi0gICB9Ci0KLSAgIC8qKgotICAgKiAgUHJpbnQgRGVidWcgbWVzc2FnZXMgaW4gdGhlIEphdmEgQ29uc29sZSBXaW5kb3cgaWYgdGhlIGRlYnVnIGZsYWcKLSAgICogIGlzIHNldCAoc2V0RGVidWcgbWV0aG9kKQotICAgKgotICAgKiBAcGFyYW0gc3RyIFN0cmluZyB0byBwcmludAotICAgKgotICAgKi8KLSAgIHN0YXRpYyB2b2lkIHByaW50RGVidWcoIFN0cmluZyBzdHIgKQotICAgewotICAgICAgICBpZiAoZGVidWdPbikKLSAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEZWJ1ZzoiICsgc3RyICk7IC8vJE5PTi1OTFMtMSQKLSAgIH0KLQotICAgc3RhdGljIENvbG9yIGdldENvbG9yKFN0cmluZyBzUEJHKQotICAgewotICAgICAgICAgLy8gQ2hlY2sgaWYgYSBwcmUtZGVmaW5lZCBjb2xvciBpcyBzcGVjaWZpZWQuCi0gICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibGFjayIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ibGFjayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJibHVlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmJsdWUpOwotICAgICAgaWYgKHNQQkcuZXF1YWxzSWdub3JlQ2FzZSgiY3lhbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5jeWFuKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImRhcmtHcmF5IikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLmRhcmtHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoImdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IuZ3JheSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJncmVlbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci5ncmVlbik7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJsaWdodEdyYXkiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubGlnaHRHcmF5KTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIm1hZ2VudGEiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IubWFnZW50YSk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJvcmFuZ2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3Iub3JhbmdlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInBpbmsiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucGluayk7Ci0gICAgICBpZiAoc1BCRy5lcXVhbHNJZ25vcmVDYXNlKCJyZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4oQ29sb3IucmVkKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoIndoaXRlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuKENvbG9yLndoaXRlKTsKLSAgICAgIGlmIChzUEJHLmVxdWFsc0lnbm9yZUNhc2UoInllbGxvdyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybihDb2xvci55ZWxsb3cpOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgIC8vIElmIHRoZSBjb2xvciBpcyBzcGVjaWZpZWQgaW4gSFRNTCBmb3JtYXQsIGJ1aWxkIGl0IGZyb20gdGhlIHJlZCwgZ3JlZW4gYW5kIGJsdWUgdmFsdWVzCi0gICAgICBpbnQgaVJlZCA9IDI1NTsKLSAgICAgIGludCBpQmx1ZSA9IDI1NTsKLSAgICAgIGludCBpR3JlZW4gPSAyNTU7Ci0gICAgICBpZiAoc1BCRy5sZW5ndGgoKSA9PSA3ICYmIHNQQkcuY2hhckF0KDApID09ICcjJykKLSAgICAgIHsKLSAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoMSwzKSwxNik7Ci0gICAgICAgIGlHcmVlbiA9IEludGVnZXIucGFyc2VJbnQoc1BCRy5zdWJzdHJpbmcoNSw3KSwxNik7Ci0gICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzUEJHLnN1YnN0cmluZygzLDUpLDE2KTsKLSAgICAgICAgcmV0dXJuKG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKSk7Ci0gICAgICB9Ci0KLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc1BCRywgIiwiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHNSZWQgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc0dyZWVuID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgU3RyaW5nIHNCbHVlID0gcGFyc2VyLm5leHRUb2tlbigpOwotICAgICAgICAgICAgaVJlZCA9IEludGVnZXIucGFyc2VJbnQoc1JlZC50cmltKCkpOwotICAgICAgICAgICAgaUdyZWVuID0gSW50ZWdlci5wYXJzZUludChzR3JlZW4udHJpbSgpKTsKLSAgICAgICAgICAgIGlCbHVlID0gSW50ZWdlci5wYXJzZUludChzQmx1ZS50cmltKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvcihpUmVkLCBpR3JlZW4sIGlCbHVlKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldENvbG9yXG5FeGNlcHRpb24gMToiICsgZTEudG9TdHJpbmcoKSArIHNQQkcpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlMikKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJTy5nZXRDb2xvclxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkgKyBzUEJHKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgcmV0dXJuIENvbG9yLmJsYWNrOwotICAgIH0KLQotICAgIHN0YXRpYyBGb250IGdldEZvbnQoU3RyaW5nIHNQQkcpCi0gICAgIHsKLSAgICAgICAgU3RyaW5nIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBzdHlsZSA9ICJQTEFJTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW50IHNpemUgPSAxMjsKLSAgICAgICAgaW50IHJlYWxTdHlsZT1Gb250LlBMQUlOOwotICAgICAgICBzUEJHID0gc1BCRy50cmltKCk7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNQQkcsICIsIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgZm9udCA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgZm9udCA9IGZvbnQudHJpbSgpOwotICAgICAgICAgICBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJBcmlhbCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQXJpYWwiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiQ291cmllciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGZvbnQgPSAiQ291cmllciI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJEaWFsb2ciKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgIGZvbnQgPSAiRGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICBlbHNlIGlmIChmb250LmVxdWFsc0lnbm9yZUNhc2UoIkhlbHZldGljYSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgZm9udCA9ICJIZWx2ZXRpY2EiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGVsc2UgaWYgKGZvbnQuZXF1YWxzSWdub3JlQ2FzZSgiU3ltYm9sIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlN5bWJvbCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgZWxzZSBpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKCJUaW1lc1JvbWFuIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICBmb250ID0gIlRpbWVzUm9tYW4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgc3R5bGUgPSBwYXJzZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgIHN0eWxlID0gc3R5bGUudHJpbSgpOwotICAgICAgICAgICBpZihzdHlsZS5lcXVhbHNJZ25vcmVDYXNlKCJJVEFMSUMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVhbFN0eWxlPUZvbnQuSVRBTElDOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgaWYoc3R5bGUuZXF1YWxzSWdub3JlQ2FzZSgiQk9MRElUQUxJQyIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICByZWFsU3R5bGU9Rm9udC5CT0xEICsgRm9udC5CT0xEOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHNpemUgPSBuZXcgSW50ZWdlcihwYXJzZXIubmV4dFRva2VuKCkudHJpbSgpKS5pbnRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUxKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklPLmdldEZvbnRcbkV4Y2VwdGlvbiAxOiIgKyBlMS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZTIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSU8uZ2V0Rm9udFxuRXhjZXB0aW9uIDI6IiArIGUyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICByZXR1cm4gbmV3IEZvbnQoZm9udCwgcmVhbFN0eWxlLCBzaXplKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvSmFyUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWIyMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0phclJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLS8qKgotICogSmFyUmVzb3VyY2VzOiBKYXJSZXNvdXJjZXMgbWFwcyBhbGwgcmVzb3VyY2VzIGluY2x1ZGVkIGluIGEKLSAqIFppcCBvciBKYXIgZmlsZS4gQWRkaXRpb25hbHksIGl0IHByb3ZpZGVzIGEgbWV0aG9kIHRvIGV4dHJhY3Qgb25lCi0gKiBhcyBhIGJsb2IuCi0gKi8KLWZpbmFsIGNsYXNzIEphclJlc291cmNlcyB7Ci0KLSAgIC8vIGV4dGVybmFsIGRlYnVnIGZsYWcKLSAgIGJvb2xlYW4gZGVidWdPbj1mYWxzZTsKLQotICAgLy8gamFyIHJlc291cmNlIG1hcHBpbmcgdGFibGVzCi0gICBwcml2YXRlIEhhc2h0YWJsZSBodEphckNvbnRlbnRzPW5ldyBIYXNodGFibGUoKTsKLQotICAgLy8gYSBqYXIgZmlsZQotICAgcHJpdmF0ZSBTdHJpbmcgamFyRmlsZU5hbWU7Ci0KLSAgIC8qKgotICAgICogY3JlYXRlcyBhIEphclJlc291cmNlcy4gSXQgZXh0cmFjdHMgYWxsIHJlc291cmNlcyBmcm9tIGEgSmFyCi0gICAgKiBpbnRvIGFuIGludGVybmFsIGhhc2h0YWJsZSwga2V5ZWQgYnkgcmVzb3VyY2UgbmFtZXMuCi0gICAgKiBAcGFyYW0gamFyRmlsZU5hbWUgYSBqYXIgb3IgemlwIGZpbGUKLSAgICAqLwotICAgSmFyUmVzb3VyY2VzKFN0cmluZyBqYXJGaWxlTmFtZSkgewotICAgICAgdGhpcy5qYXJGaWxlTmFtZT1qYXJGaWxlTmFtZTsKLSAgICAgIGluaXQoKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBFeHRyYWN0cyBhIGphciByZXNvdXJjZSBhcyBhIGJsb2IuCi0gICAgKiBAcGFyYW0gbmFtZSBhIHJlc291cmNlIG5hbWUuCi0gICAgKi8KLSAgIGJ5dGVbXSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewotICAgICAgcmV0dXJuIChieXRlW10paHRKYXJDb250ZW50cy5nZXQobmFtZSk7Ci0gICB9Ci0KLSAgIGJ5dGVbXSBnZXRSZXNvdXJjZSgpCi0gICB7Ci0gICAgICBFbnVtZXJhdGlvbiBrZXlzID0gaHRKYXJDb250ZW50cy5rZXlzKCk7Ci0gICAgICByZXR1cm4gKGJ5dGVbXSlodEphckNvbnRlbnRzLmdldChrZXlzLm5leHRFbGVtZW50KCkpOwotICAgfQotCi0vKioKLSAgKiBpbml0aWFsaXplcyBpbnRlcm5hbCBoYXNoIHRhYmxlcyB3aXRoIEphciBmaWxlIHJlc291cmNlcy4KLSAgKi8KLXByaXZhdGUgdm9pZCBpbml0KCkgewotICB0cnkgewotICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIEphciBBcmNoaXZlICIgKyBqYXJGaWxlTmFtZSk7Ci0JICBEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgaWYoamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuSHR0cCkgfHwgamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuSHR0cHMpfHwgamFyRmlsZU5hbWUuc3RhcnRzV2l0aChEZWYuRmlsZSkpCi0gICAgICB7Ci0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbmluZyB0aGUgSmFyIEZpbGUgYXMgYSBVUkwgc3RyZWFtIik7Ci0JCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbSggbmV3IFVSTChqYXJGaWxlTmFtZSkub3BlblN0cmVhbSgpICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiT3BlbmluZyB0aGUgSmFyIEZpbGUgYXMgYSBsb2NhbCBmaWxlIHN0cmVhbSIpOwotICAgICAgICBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oIG5ldyBGaWxlSW5wdXRTdHJlYW0oamFyRmlsZU5hbWUpKTsKLSAgICAgIH0KLSAgICAgIC8vIGV4dHJhY3QgcmVzb3VyY2VzIGFuZCBwdXQgdGhlbSBpbnRvIHRoZSBoYXNodGFibGUuCi0gICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcz1uZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbik7Ci0gICAgICBaaXBJbnB1dFN0cmVhbSB6aXM9bmV3IFppcElucHV0U3RyZWFtKGJpcyk7Ci0gICAgICBaaXBFbnRyeSB6ZT1udWxsOwotICAgICAgd2hpbGUgKCh6ZT16aXMuZ2V0TmV4dEVudHJ5KCkpIT1udWxsKQotICAgICAgewotICAgICAgICBpZiAoemUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGVidWdPbikgewotICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgICAgICJ6ZS5nZXROYW1lKCk9Iit6ZS5nZXROYW1lKCkrIiwiKyJnZXRTaXplKCk9Iit6ZS5nZXRTaXplKCkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgICAgICAgKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc2l6ZT0oaW50KXplLmdldFNpemUoKTsKLSAgICAgICAgLy8gLTEgbWVhbnMgdW5rbm93biBzaXplLgotCQlpZiAoIHNpemUgPT0gLTEgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBSZXR1cm5lZCBzaXplIG9mIHppcCBmaWxlIGlzIC0xLiBGaWxlbmFtZTogIiArIHplLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0gICAgICAgIGJ5dGVbXSBiPW5ldyBieXRlWyhpbnQpc2l6ZV07Ci0gICAgICAgIGludCByYj0wOwotICAgICAgICBpbnQgY2h1bms9MDsKLSAgICAgICAgd2hpbGUgKCgoaW50KXNpemUgLSByYikgPiAwKSB7Ci0gICAgICAgICAgIGNodW5rPXppcy5yZWFkKGIscmIsKGludClzaXplIC0gcmIpOwotICAgICAgICAgICBpZiAoY2h1bms9PS0xKSB7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgfQotICAgICAgICAgICByYis9Y2h1bms7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYWRkIHRvIGludGVybmFsIHJlc291cmNlIGhhc2h0YWJsZQotICAgICAgICBodEphckNvbnRlbnRzLnB1dCh6ZS5nZXROYW1lKCksYik7Ci0gICAgICAgIGlmIChkZWJ1Z09uKSB7Ci0gICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAgICAgIHplLmdldE5hbWUoKSsiICByYj0iK3JiKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAiLHNpemU9IitzaXplKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAiLGNzaXplPSIremUuZ2V0Q29tcHJlc3NlZFNpemUoKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgIH0KLSAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImRvbmUuIik7IC8vJE5PTi1OTFMtMSQKLSAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICB9Ci19Ci0KLSAgIC8qKgotICAgICogRHVtcHMgYSB6aXAgZW50cnkgaW50byBhIHN0cmluZy4KLSAgICAqIEBwYXJhbSB6ZSBhIFppcEVudHJ5Ci0gICAgKi8KLSAgIHByaXZhdGUgU3RyaW5nIGR1bXBaaXBFbnRyeShaaXBFbnRyeSB6ZSkgewotICAgICAgIFN0cmluZ0J1ZmZlciBzYj1uZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgaWYgKHplLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICBzYi5hcHBlbmQoImQgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNiLmFwcGVuZCgiZiAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCk9PVppcEVudHJ5LlNUT1JFRCkgewotICAgICAgICAgIHNiLmFwcGVuZCgic3RvcmVkICAgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNiLmFwcGVuZCgiZGVmYWx0ZWQgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICB9Ci0gICAgICAgc2IuYXBwZW5kKHplLmdldE5hbWUoKSk7Ci0gICAgICAgc2IuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgc2IuYXBwZW5kKCIiK3plLmdldFNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBpZiAoemUuZ2V0TWV0aG9kKCk9PVppcEVudHJ5LkRFRkxBVEVEKSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCIvIit6ZS5nZXRDb21wcmVzc2VkU2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICByZXR1cm4gKHNiLnRvU3RyaW5nKCkpOwotICAgfQotCi19CS8vIEVuZCBvZiBKYXJSZXNvdXJjZXMgY2xhc3MuCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTAwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotY2xhc3MgS2V5V29yZAotewotICAgcHJpdmF0ZSBTdHJpbmcga2V5V29yZD1udWxsOwotICAgcHJpdmF0ZSBWZWN0b3IgbXlLZXlXb3Jkcz1udWxsOwotICAgcHJpdmF0ZSBWZWN0b3IgbXlEb2N1bWVudHM9bnVsbDsKLSAgIHByaXZhdGUgU3BlY0tleVdvcmQgbXlTcGVjS2V5V29yZD1udWxsOwotICAgcHJpdmF0ZSBLZXlXb3JkIHBhcmVudE09bnVsbDsKLSAgIEtleVdvcmREZWYgZGVmID0gbnVsbDsKLSAgIAotICAgS2V5V29yZChLZXlXb3JkRGVmIGRlZikKLSAgIHsKLQkgICB0aGlzLmRlZiA9IGRlZjsKLQkgICBrZXlXb3JkID0gZGVmLmdldEtleSgpOwotICAgfQotCi0gICBwcml2YXRlIEtleVdvcmQoS2V5V29yZERlZiBkZWYsIFN0cmluZyBrZXlXb3JkLCBLZXlXb3JkIGtleSkKLSAgIHsKLQkgICB0aGlzLmRlZiA9IGRlZjsKLQkgICB0aGlzLmtleVdvcmQgPSBrZXlXb3JkOwotCSAgIHRoaXMucGFyZW50TSA9IGtleTsKLQkgICAKLSAgIH0KLQotICAgU3RyaW5nIGdldEtleVdvcmQoKQotICAgewotICAgICByZXR1cm4ga2V5V29yZDsKLSAgIH0KLQotICAgdm9pZCBhZGRLZXlXb3JkKEtleVdvcmREZWYgZGVmLCBTdHJpbmcga2V5LCBEb2N1bWVudCBkb2MpCi0gICB7CSAgIAotICAgICBpbnQgaW5kZXggPSBNaXNjU3RhdGljLmdldEluZGV4KGtleSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsIDApOwotICAgICAvL0lmIHRoZSBib3R0b20gb2YgdGhlIGtleXdvcmQgaXMgcmVhY2hlZAotICAgICBpZihpbmRleD09LTEpCi0gICAgIHsKLSAgICAgICAgYWRkRG9jdW1lbnQoZG9jKTsKLSAgICAgfQotICAgICBlbHNlCi0gICAgIHsKLSAgICAgICAgaW50IGluZGV4MiA9ICBNaXNjU3RhdGljLmdldEluZGV4KGtleSwgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsIGluZGV4KzEpOwotICAgICAgICBTdHJpbmcgbmV4dEtleVdvcmQ9bnVsbDsKLSAgICAgICAgaWYoaW5kZXgyIT0tMSkKLSAgICAgICAgewotICAgICAgICAgICBuZXh0S2V5V29yZCA9IGtleS5zdWJzdHJpbmcoaW5kZXgrMSxpbmRleDIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG5leHRLZXlXb3JkID0ga2V5LnN1YnN0cmluZyhpbmRleCsxKTsKLSAgICAgICAgfQotCi0gICAgICAgIEtleVdvcmQgdG1wS2V5ID0gY3JlYXRlS2V5V29yZChkZWYsIG5leHRLZXlXb3JkKTsKLSAgICAgICAgaWYodG1wS2V5IT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdG1wS2V5LmFkZEtleVdvcmQoZGVmLCBrZXkuc3Vic3RyaW5nKGluZGV4KzEpLCBkb2MpOwotICAgICAgICB9Ci0gICAgIH0KLSAgIH0KLQotICAgdm9pZCBzZXRTcGVjS2V5V29yZChTdHJpbmcgcmVsYXRlZEtleSwgYm9vbGVhbiBzZWUpCi0gICB7Ci0gICAgIElPLnByaW50RGVidWcoInNldFNwZWNLZXlXb3JkICIgKyByZWxhdGVkS2V5KTsgLy8kTk9OLU5MUy0xJAotICAgICBteVNwZWNLZXlXb3JkID0gbmV3IFNwZWNLZXlXb3JkKHJlbGF0ZWRLZXksIHNlZSk7Ci0gICB9Ci0KLSAgIHZvaWQgaW5zZXJ0U3BlY0tleVdvcmQoU3RyaW5nIHNwZWNLZXlXb3JkU3RyaW5nLCBTdHJpbmcgcmVsYXRlZEtleVdvcmQpCi0gICB7Ci0KLSAgICAgIGJvb2xlYW4gZm91bmQ9ZmFsc2U7Ci0gICAgICBpbnQgaT0wOwotICAgICAgU3RyaW5nIGZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nOwotICAgICAgaW50IHBvcyA9IHNwZWNLZXlXb3JkU3RyaW5nLmluZGV4T2YoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2UsMCk7Ci0gICAgICBpZihwb3MhPS0xKQotICAgICAgewotICAgICAgICBmaXJzdEtleVdvcmQgPSBzcGVjS2V5V29yZFN0cmluZy5zdWJzdHJpbmcoMCxwb3MpOwotICAgICAgfQotCi0gICAgICB3aGlsZSghZm91bmQgJiYgbXlLZXlXb3JkcyE9bnVsbCAmJiBpPG15S2V5V29yZHMuc2l6ZSgpKQotICAgICAgewotICAgICAgICAgS2V5V29yZCB0bXBLID0gIChLZXlXb3JkKW15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgaWYoZmlyc3RLZXlXb3JkLmVxdWFscyh0bXBLLmdldEtleVdvcmQoKSkpCi0gICAgICAgICB7Ci0KLSAgICAgICAgIGZvdW5kPXRydWU7Ci0gICAgICAgICBpZihwb3MhPS0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcEsuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcuc3Vic3RyaW5nKHBvcysxKSwgcmVsYXRlZEtleVdvcmQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgdG1wSy5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgZmFsc2UpOwotICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgICBpZighZm91bmQpCi0gICAgICB7Ci0gICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpPTA7Ci0gICAgICAgICBLZXlXb3JkIG5ld0tleVdvcmQyID0gbmV3IEtleVdvcmQobnVsbCwgZmlyc3RLZXlXb3JkLCB0aGlzKTsKLSAgICAgICAgIElPLnByaW50RGVidWcoIm5ldyBrZXl3b3JkICIgKyBmaXJzdEtleVdvcmQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICBpZihwb3M9PS0xKQotICAgICAgICAgewotICAgICAgICAgICBuZXdLZXlXb3JkMi5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgbmV3S2V5V29yZDIuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcuc3Vic3RyaW5nKHBvcysxKSwgcmVsYXRlZEtleVdvcmQpOwotICAgICAgICAgfQotICAgICAgICAgaWYobXlLZXlXb3Jkcz09bnVsbCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIElPLnByaW50RGVidWcoIm15S2V5V29yZHMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgbXlLZXlXb3JkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIHdoaWxlKGluZGV4PT0tMSAmJiBpPG15S2V5V29yZHMuc2l6ZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgS2V5V29yZCB0bXBLID0gIChLZXlXb3JkKW15S2V5V29yZHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkuCi0gICAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpLgotICAgICAgICAgICAgICAgICAgY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpPT0wKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSkhPTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS5jb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkpPjApCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaS0xOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmKGluZGV4IT0tMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAgbXlLZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIGluZGV4KTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG15S2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBteUtleVdvcmRzLnNpemUoKSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICB9Ci0KLSAgIHByaXZhdGUgS2V5V29yZCBjcmVhdGVLZXlXb3JkKEtleVdvcmREZWYgZGVmLCBTdHJpbmcga2V5KQotICAgewotCi0gICAgIGlmKG15S2V5V29yZHM9PW51bGwpCi0gICAgIHsKLSAgICAgICAgbXlLZXlXb3JkcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgS2V5V29yZCBuZXdLZXlXb3JkID0gbmV3IEtleVdvcmQoZGVmLCBrZXksIHRoaXMpOwotICAgICAgICBteUtleVdvcmRzLmFkZEVsZW1lbnQobmV3S2V5V29yZCk7Ci0gICAgICAgIHJldHVybiBuZXdLZXlXb3JkOwotICAgICB9Ci0gICAgIGVsc2UKLSAgICAgewotICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpbnQgaT0wOwotICAgICAgICAgIEtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChkZWYsIGtleSwgdGhpcyk7Ci0gICAgICAgICB3aGlsZShpbmRleD09LTEgJiYgaTxteUtleVdvcmRzLnNpemUoKSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIEtleVdvcmQgdG1wSyA9ICAoS2V5V29yZClteUtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQotCi0gICAgICAgICAgICBpZihuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS4KLSAgICAgICAgICAgICAgICBjb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkuCi0gICAgICAgICAgICAgICAgY29tcGFyZVRvKHRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpPT0wKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKSkhPTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGlmKG5ld0tleVdvcmQyLmdldEtleVdvcmQoKS5jb21wYXJlVG8odG1wSy5nZXRLZXlXb3JkKCkpPDApCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaSsxOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0bXBLOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgIH0KLQotICAgICAgICAgaWYoaW5kZXghPS0xKQotICAgICAgICAgewotICAgICAgICAgICAgICBteUtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotICAgICAgICAgICAgICByZXR1cm4gbmV3S2V5V29yZDI7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICB7Ci0gICAgICAgICAgICBteUtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgbXlLZXlXb3Jkcy5zaXplKCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ld0tleVdvcmQyOwotICAgICAgICAgfQotCi0gICAgIH0KLSAgIH0KLQotICAgcHJpdmF0ZSB2b2lkIGFkZERvY3VtZW50KERvY3VtZW50IGRvYykKLSAgIHsKLSAgICBkb2Muc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgIGlmKG15RG9jdW1lbnRzPT1udWxsKQotICAgICAgewotICAgICAgICAgbXlEb2N1bWVudHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICBteURvY3VtZW50cy5hZGRFbGVtZW50KGRvYyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBpbnQgaW5kZXg9LTE7Ci0gICAgICAgICBpbnQgaT0wOwotICAgICAgICAgd2hpbGUoaW5kZXg9PS0xICYmIGk8bXlEb2N1bWVudHMuc2l6ZSgpKQotICAgICAgICAgewotICAgICAgICAgICAgRG9jdW1lbnQgdG1wRCA9ICAoRG9jdW1lbnQpbXlEb2N1bWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgaWYoZG9jLmdldFRpdGxlKCkuY29tcGFyZVRvKHRtcEQuZ2V0VGl0bGUoKSk8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgICB9Ci0KLSAgICAgICAgIGlmKGluZGV4IT0tMSkKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAgbXlEb2N1bWVudHMuaW5zZXJ0RWxlbWVudEF0KGRvYywgaW5kZXgpOwotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICAgbXlEb2N1bWVudHMuaW5zZXJ0RWxlbWVudEF0KGRvYywgbXlEb2N1bWVudHMuc2l6ZSgpKTsKLSAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLQotICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IGxldmVsKQotICAgewotICAgICBpZihvdXRQPT1udWxsKQotICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJLZXlXb3JkOnByaW50XG4iICsgSGVscE1lc3NhZ2VzLkJBRF9PVVRQVVRfU1RSRUFNKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludFN0YXJ0KG91dFAsbGV2ZWwrMSk7Ci0gICAgICBpZihsZXZlbD09MCkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEEgTkFNRT1cIiIgKyBrZXlXb3JkKyAiXCI+IDwvQT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgICBNaXNjU3RhdGljLnByaW50U3BhY2Uob3V0UCwgbGV2ZWwqNCk7Ci0gICAgICBpZihsZXZlbCE9MCkKLSAgICAgIHsKLSAgICAgICAgTWlzY1N0YXRpYy5wcmludFNwYWNlKG91dFAsMik7Ci0gICAgICB9Ci0gICAgICBpZihteURvY3VtZW50cyE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYoIUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0U2hvd0RvY3VtZW50VGl0bGUoKSAmJiAhS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRNdWxpdERvY3VtZW50S2V5d29yZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgRG9jdW1lbnQgdG1wRCA9IChEb2N1bWVudCkgIG15RG9jdW1lbnRzLmVsZW1lbnRBdCgwKTsKLSAgICAgICAgICB0bXBELnNldEtleVdvcmQodGhpcyk7Ci0gICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPEEgSFJFRj1cIiIgKyB0bXBELmdldFVybCgpICsgIlwiIFRBUkdFVD1cIiIgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFRhcmdldCgpICsiXCI+IiArIGtleVdvcmQgKyAiPC9BPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0TXVsaXREb2N1bWVudEtleXdvcmQoKSkKLSAgICAgICAgewotICAgICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgICAgICBEb2N1bWVudCB0bXBEID0gKERvY3VtZW50KSAgbXlEb2N1bWVudHMuZWxlbWVudEF0KDApOwotICAgICAgICAgICB0bXBELnNldEtleVdvcmQodGhpcyk7Ci0gICAgICAgICAgIHRtcEQucHJpbnQob3V0UCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgICAgTWlzY1N0YXRpYy5wcmludFNwYWNlKG91dFAsIDEpOwotCi0gICAgICAgICBmb3IoaW50IGk9MDtpPG15RG9jdW1lbnRzLnNpemUoKTtpKyspCi0gICAgICAgICB7Ci0gICAgICAgICAgICBEb2N1bWVudCB0bXBEID0gKERvY3VtZW50KSAgbXlEb2N1bWVudHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgIHRtcEQuc2V0S2V5V29yZCh0aGlzKTsKLSAgICAgICAgICAgIHRtcEQucHJpbnQob3V0UCk7Ci0gICAgICAgICAgICBpZihpIT1teURvY3VtZW50cy5zaXplKCktMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiLCAiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCAiXG4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIGtleVdvcmQpOwotICAgICAgfQotICAgICAgaWYobXlTcGVjS2V5V29yZCE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgbXlTcGVjS2V5V29yZC5wcmludChvdXRQKTsKLSAgICAgIH0KLQotICAgICAgaWYoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRTdHlsZVNoZWV0KERlZi5EZWZhdWx0U3R5bGUpPT1udWxsKQotICAgICAgewotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QlI+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoucHJpbnRFbmQob3V0UCxsZXZlbCsxKTsKLSAgICAgIGlmKG15S2V5V29yZHMhPW51bGwpCi0gICAgICB7Ci0KLSAgICAgICAgIGludCB0bXBMID0gbGV2ZWwrMTsKLSAgICAgICAgIGZvcihpbnQgaT0wO2k8bXlLZXlXb3Jkcy5zaXplKCk7aSsrKQotICAgICAgICAgewotICAgICAgICAgICAgS2V5V29yZCB0bXBLID0gKEtleVdvcmQpICBteUtleVdvcmRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIHRtcEsucHJpbnQob3V0UCwgdG1wTCk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgIH0KLQotICAgU3RyaW5nIGdldEFuY2hvcigpCi0gICB7Ci0JICAgaWYgKCB0aGlzLmRlZiAhPSBudWxsKQotICAgICAgewotICAgICAgICAgcmV0dXJuIHRoaXMuZGVmLmdldEFuY2hvcigpOwotICAgICAgfQotCSAgIAotICAgICAgaWYocGFyZW50TSE9bnVsbCkKLSAgICAgIHsKLSAgICAgICAgIHJldHVybiBwYXJlbnRNLmdldEFuY2hvcigpOwotICAgICAgfQotICAgICAgIAotICAgICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gICB9Ci0gICAKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRGVmLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZERlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ1MGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRGVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotLyoqCi0gKiB0aGlzIGNsYXNzIGRlZmluZXMgYSBrZXkgd29yZAotICoKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgIDEuMAotICovCi1jbGFzcyBLZXlXb3JkRGVmIHsKLQotCXByaXZhdGUgU3RyaW5nIGFuY2hvcjsKLQlwcml2YXRlIFN0cmluZyBrZXk7Ci0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgU3RyaW5nIGtleVdvcmRTdHJpbmc7Ci0KLQlLZXlXb3JkRGVmKFN0cmluZyBhbmNob3IpCi0JewotCQl0aGlzKGFuY2hvciwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JS2V5V29yZERlZihTdHJpbmcgYW5jaG9yLCBTdHJpbmcga2V5LCBTdHJpbmcgdGV4dCkKLQl7Ci0JCXRoaXMuYW5jaG9yID0gYW5jaG9yOwotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJCi0JCWlmICggdGhpcy50ZXh0ID09IG51bGwgKQotCQl7Ci0JCQl0aGlzLnRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdGhpcy5rZXlXb3JkU3RyaW5nID0gS2V5V29yZFN0YXRpYy5jb252ZXJ0S2V5V29yZCh0aGlzLmFuY2hvciwgdGhpcy5rZXksIHRoaXMudGV4dCk7Ci0JCWlmICggdGhpcy5rZXkgPT0gbnVsbCB8fCB0aGlzLmtleS5lcXVhbHMoIiIpICkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLmtleVdvcmRTdHJpbmcuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSk7Ci0JCQlpZiAoIGluZGV4IDwgMCApCi0JCQl7Ci0JCQkJdGhpcy5rZXkgPSB0aGlzLmtleVdvcmRTdHJpbmc7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGhpcy5rZXkgPSB0aGlzLmtleVdvcmRTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlTdHJpbmcgZ2V0QW5jaG9yKCkKLQl7Ci0JCXJldHVybiBhbmNob3I7Ci0JfQotCQotCVN0cmluZyBnZXRLZXkoKQotCXsKLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4ga2V5V29yZFN0cmluZzsKLQl9Ci0KLQotCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkRmlsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmFkNTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vL1JlcHJlc2VudHMgYSBodG1sIGZpbGUgdGhhdCBjb250YWlucyBrZXl3b3JkcwotY2xhc3MgS2V5V29yZEZpbGUKLXsKLSAgICBwcml2YXRlIFN0cmluZyB0aXRsZT1udWxsOwotICAgIHByaXZhdGUgU3RyaW5nIHVybD1udWxsOwotCi0gICAgcHJpdmF0ZSBpbnQgbmV4dEtleVdvcmQ9MDsKLSAgICBwcml2YXRlIExpc3Qga2V5V29yZFZlY3Rvcj1udWxsOwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIENvbnN0cnVjdG9yLgotICAgIEtleVdvcmRGaWxlKFN0cmluZyB0aXRsZSwgU3RyaW5nIHVybCwgTGlzdCBrZXlXb3JkcykgLy8gbGlzdCBvZiBLZXlXb3JkRGVmIG9iamVjdAotICAgIHsKLSAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7Ci0gICAgICAgdGhpcy51cmwgPSB1cmw7Ci0gICAgICAgdGhpcy5rZXlXb3JkVmVjdG9yID0gIGtleVdvcmRzOwotICAgIH0KLSAgICAJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBLZXlXb3JkRGVmIGdldE5leHRLZXlXb3JkKCkKLSAgICB7Ci0gICAgICAgaWYobmV4dEtleVdvcmQ8a2V5V29yZFZlY3Rvci5zaXplKCkpCi0gICAgICAgewotICAgIAkgICBLZXlXb3JkRGVmIG5leHQgPSAoS2V5V29yZERlZilrZXlXb3JkVmVjdG9yLmdldChuZXh0S2V5V29yZCk7Ci0gICAgICAgIG5leHRLZXlXb3JkKys7Ci0gICAgICAgIGlmKG5leHQhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICB9Ci0gICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIERvY3VtZW50IGdldERvY3VtZW50KFN0cmluZyBrZXlXb3JkLCBpbnQgbm9PZkRvYykKLSAgICB7Ci0KLSAgICAgICAgaWYobm9PZkRvYz4xKQotICAgICAgICB7Ci0gICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBEb2N1bWVudCh0aXRsZSwgdXJsKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkM2MyNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIEtleVdvcmRIb2xkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBsYW5nID0gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRMYW5ndWFnZSgpOwotCi0JcHJpdmF0ZSBWZWN0b3Iga2V5V29yZEZpbGVzID0gbnVsbDsKLQotCXByaXZhdGUgVmVjdG9yIGtleVdvcmRzID0gbnVsbDsKLQotCUtleVdvcmRIb2xkZXIoKSB7Ci0JCWtleVdvcmRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQl9Ci0KLQl2b2lkIGFkZChLZXlXb3JkRmlsZSBrZXkpIHsKLQkJa2V5V29yZEZpbGVzLmFkZEVsZW1lbnQoa2V5KTsKLQl9Ci0KLQl2b2lkIGRpdmlkZSgpIHsKLQkJaWYgKGtleVdvcmRGaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRGaWxlcy5zaXplKCk7IGkrKykgewotCQkJCVN0cmluZyBuZXh0S2V5V29yZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJS2V5V29yZEZpbGUgdG1wID0gKEtleVdvcmRGaWxlKSBrZXlXb3JkRmlsZXMuZWxlbWVudEF0KGkpOwotCQkJCXdoaWxlIChuZXh0S2V5V29yZCAhPSBudWxsKSB7Ci0JCQkJCW5leHRLZXlXb3JkID0gbnVsbDsKLQkJCQkJS2V5V29yZERlZiBkZWYgPSB0bXAuZ2V0TmV4dEtleVdvcmQoKTsKLQkJCQkJaWYgKGRlZiAhPSBudWxsKSB7Ci0JCQkJCQluZXh0S2V5V29yZCA9IGRlZi50b1N0cmluZygpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKG5leHRLZXlXb3JkICE9IG51bGwpIHsKLQotCQkJCQkJaW50IG5vT2ZEb2MgPSAxOwotCQkJCQkJRG9jdW1lbnQgdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCXdoaWxlICh0bXBEICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgaW5kZXggPSBNaXNjU3RhdGljCi0JCQkJCQkJCQkuZ2V0SW5kZXgoCi0JCQkJCQkJCQkJCW5leHRLZXlXb3JkLAotCQkJCQkJCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZSwKLQkJCQkJCQkJCQkJMCk7Ci0JCQkJCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJCQkJCWluZGV4ID0gbmV4dEtleVdvcmQubGVuZ3RoKCk7Ci0JCQkJCQkJfQotCi0JCQkJCQkJS2V5V29yZCB0bXBLID0gY3JlYXRlS2V5V29yZChkZWYpOwotCQkJCQkJCWlmICh0bXBLICE9IG51bGwgJiYgdG1wRCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRtcEsuYWRkS2V5V29yZChkZWYsIG5leHRLZXlXb3JkLCB0bXBEKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlub09mRG9jKys7Ci0JCQkJCQkJdG1wRCA9IHRtcC5nZXREb2N1bWVudChuZXh0S2V5V29yZCwgbm9PZkRvYyk7Ci0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgS2V5V29yZCBjcmVhdGVLZXlXb3JkKEtleVdvcmREZWYgZGVmKSB7Ci0KLQkJaWYgKGtleVdvcmRzID09IG51bGwpIHsKLQkJCWtleVdvcmRzID0gbmV3IFZlY3RvcigpOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkID0gbmV3IEtleVdvcmQoZGVmKTsKLQkJCWtleVdvcmRzLmFkZEVsZW1lbnQobmV3S2V5V29yZCk7Ci0JCQlyZXR1cm4gbmV3S2V5V29yZDsKLQkJfSBlbHNlIHsKLQkJCWludCBpbmRleCA9IC0xOwotCQkJaW50IGkgPSAwOwotCQkJS2V5V29yZCBuZXdLZXlXb3JkMiA9IG5ldyBLZXlXb3JkKGRlZik7Ci0JCQlTdHJpbmcgc3RyMiA9IG5ld0tleVdvcmQyLmdldEtleVdvcmQoKTsKLQotCQkJd2hpbGUgKGluZGV4ID09IC0xICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCVN0cmluZyBzdHIgPSB0bXBLLmdldEtleVdvcmQoKTsKLQkJCQlpbnQgY21wID0gc3RyMi50b1VwcGVyQ2FzZSgpLmNvbXBhcmVUbyhzdHIudG9VcHBlckNhc2UoKSk7Ci0JCQkJaWYgKGNtcCA8IDApIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCX0gZWxzZSBpZiAoY21wID09IDApIHsKLQkJCQkJaW50IGNtcDIgPSBzdHIyLmNvbXBhcmVUbyhzdHIpOwotCQkJCQlpZiAoY21wMiAhPSAwKSB7Ci0JCQkJCQkKLQkJCQkJCS8vIHRoaXMgaXMgd3JvbmcsIHdpbGwgcHV0IHRoZSBlbnRyeSB0byB0aGUgcHJldmlvdXMgaXRlbQotLy8JCQkJCQlpZiAoY21wMiA+IDApIHsKLS8vCQkJCQkJCWluZGV4ID0gaTsKLS8vCQkJCQkJfSBlbHNlIHsKLS8vCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0vLwkJCQkJCX0KLQkJCQkJCWlmIChjbXAyIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiB0bXBLOwotCQkJCQl9Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQotCQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkJaW5kZXggPSBrZXlXb3Jkcy5zaXplKCk7Ci0JCQl9Ci0JCQlrZXlXb3Jkcy5pbnNlcnRFbGVtZW50QXQobmV3S2V5V29yZDIsIGluZGV4KTsKLQkJCQotCQkJcmV0dXJuIG5ld0tleVdvcmQyOwotCi0JCX0KLQl9Ci0KLQl2b2lkIHJlYWRTcGVjS2V5V29yZHMoU3RyaW5nVG9rZW5pemVyIHBhcnNlcikgewotCQl3aGlsZSAocGFyc2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHNwZWNLZXlXb3JkU3RyaW5nID0gcGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCA9IHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlLZXlXb3JkRGVmIHNwZWNLZXlEZWYgPSBuZXcgS2V5V29yZERlZihzcGVjS2V5V29yZFN0cmluZyk7Ci0JCQlLZXlXb3JkRGVmIHJlbGF0ZWRLZXlEZWYgPSBuZXcgS2V5V29yZERlZihyZWxhdGVkS2V5V29yZCk7Ci0KLQkJCXNwZWNLZXlXb3JkU3RyaW5nID0gc3BlY0tleURlZi50b1N0cmluZygpOwotCQkJcmVsYXRlZEtleVdvcmQgPSByZWxhdGVkS2V5V29yZC50b1N0cmluZygpOwotCi0JCQlpZiAoc3BlY0tleVdvcmRTdHJpbmcgIT0gbnVsbCAmJiByZWxhdGVkS2V5V29yZCAhPSBudWxsCi0JCQkJCSYmIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKHNwZWNLZXlXb3JkU3RyaW5nLCByZWxhdGVkS2V5V29yZCkpIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJaW50IGkgPSAwOwotCQkJCVN0cmluZyBmaXJzdEtleVdvcmQgPSBzcGVjS2V5V29yZFN0cmluZzsKLQkJCQlpbnQgcG9zID0gc3BlY0tleVdvcmRTdHJpbmcuaW5kZXhPZigKLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoubGV2ZWxTZXBhcmF0b3JSZXBsYWNlLCAwKTsKLQkJCQlpZiAocG9zICE9IC0xKSB7Ci0JCQkJCWZpcnN0S2V5V29yZCA9IHNwZWNLZXlXb3JkU3RyaW5nLnN1YnN0cmluZygwLCBwb3MpOwotCQkJCX0KLQkJCQlJTy5wcmludERlYnVnKCJmaXJzdEtleVdvcmQgIiArIGZpcnN0S2V5V29yZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAoIWZvdW5kICYmIGkgPCBrZXlXb3Jkcy5zaXplKCkpIHsKLQkJCQkJSU8ucHJpbnREZWJ1ZygiaG9sZGVyIGluIGZpcnN0IHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlLZXlXb3JkIHRtcEsgPSAoS2V5V29yZCkga2V5V29yZHMuZWxlbWVudEF0KGkpOwotCQkJCQlpZiAoZmlyc3RLZXlXb3JkLmVxdWFscyh0bXBLLmdldEtleVdvcmQoKSkpIHsKLQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJaWYgKHBvcyAhPSAtMSkgewotCQkJCQkJCXRtcEsuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJCS5zdWJzdHJpbmcocG9zICsgMSksIHJlbGF0ZWRLZXlXb3JkKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdG1wSy5zZXRTcGVjS2V5V29yZChyZWxhdGVkS2V5V29yZCwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQlJTy5wcmludERlYnVnKCIhZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQkJCQkJaSA9IDA7Ci0JCQkJCUtleVdvcmQgbmV3S2V5V29yZDIgPSBuZXcgS2V5V29yZChzcGVjS2V5RGVmKTsKLQkJCQkJaWYgKHBvcyA9PSAtMSkgewotCQkJCQkJbmV3S2V5V29yZDIuc2V0U3BlY0tleVdvcmQocmVsYXRlZEtleVdvcmQsIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbmV3S2V5V29yZDIuaW5zZXJ0U3BlY0tleVdvcmQoc3BlY0tleVdvcmRTdHJpbmcKLQkJCQkJCQkJLnN1YnN0cmluZyhwb3MgKyAxKSwgcmVsYXRlZEtleVdvcmQpOwotCQkJCQl9Ci0JCQkJCXdoaWxlIChpbmRleCA9PSAtMSAmJiBpIDwga2V5V29yZHMuc2l6ZSgpKSB7Ci0JCQkJCQlJTy5wcmludERlYnVnKCJob2xkZXIgaW4gc2Vjb25kIHdoaWxlICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJS2V5V29yZCB0bXBLID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkudG9VcHBlckNhc2UoKS5jb21wYXJlVG8oCi0JCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkpIDwgMCkgewotCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCX0gZWxzZSBpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLnRvVXBwZXJDYXNlKCkKLQkJCQkJCQkJLmNvbXBhcmVUbyh0bXBLLmdldEtleVdvcmQoKS50b1VwcGVyQ2FzZSgpKSA9PSAwKSB7Ci0KLQkJCQkJCQlpZiAobmV3S2V5V29yZDIuZ2V0S2V5V29yZCgpLmNvbXBhcmVUbygKLQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSAhPSAwKSB7Ci0JCQkJCQkJCWlmIChuZXdLZXlXb3JkMi5nZXRLZXlXb3JkKCkuY29tcGFyZVRvKAotCQkJCQkJCQkJCXRtcEsuZ2V0S2V5V29yZCgpKSA+IDApIHsKLQkJCQkJCQkJCWluZGV4ID0gaTsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCWluZGV4ID0gaSAtIDE7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpKys7Ci0JCQkJCX0KLQotCQkJCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQkJCWtleVdvcmRzLmluc2VydEVsZW1lbnRBdChuZXdLZXlXb3JkMiwgaW5kZXgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJa2V5V29yZHMuaW5zZXJ0RWxlbWVudEF0KG5ld0tleVdvcmQyLCBrZXlXb3Jkcy5zaXplKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlbGF0ZWRLZXlXb3JkRXhpc3RzKFN0cmluZyBzcGVjS2V5V29yZFN0cmluZywKLQkJCVN0cmluZyByZWxhdGVkS2V5V29yZCkgewotCQlpZiAoa2V5V29yZHMgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCi0JCQl3aGlsZSAoaSA8IGtleVdvcmRzLnNpemUoKSkgewotCQkJCUtleVdvcmQgdG1wSyA9IChLZXlXb3JkKSBrZXlXb3Jkcy5lbGVtZW50QXQoaSk7Ci0JCQkJaWYgKHRtcEsuZ2V0S2V5V29yZCgpLmVxdWFscyhyZWxhdGVkS2V5V29yZCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWkrKzsKLQkJCX0KLQkJfQotCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVsYXRlZEtleVdvcmQKLQkJCQkrIEhlbHBNZXNzYWdlcy5SRUxBVEVEX0tFWVdPUkRfTk9UX0ZPVU5EICsgc3BlY0tleVdvcmRTdHJpbmcpOwotCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQl2b2lkIHByaW50KCkgewotCi0JCWlmIChLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpICE9IG51bGwpIHsKLQkJCXByaW50RnJhbWVzZXQoKTsKLQkJCXByaW50SW5kZXgoKTsKLQkJfQotCQlwcmludEtleVdvcmRzKCk7Ci0JfQotCi0JLy8gUHJpbnRzIHRoZSBodG1sZmlsZSBjb250YWluaW5nIHRoZSBmcmFtZXNldAotCXByaXZhdGUgdm9pZCBwcmludEZyYW1lc2V0KCkgewotCQl0cnkgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJZmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJZmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0JCQl9Ci0KLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotCQkJaWYgKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0Q2hhcmFjdGVyU2V0KCkgIT0gbnVsbCkgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpLAotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCW91dFAgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihIZWxwTWVzc2FnZXMuV1JJVEVfRklMRQotCQkJCQkrIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldE1haW5SZXN1bHRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvL01pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwhRE9DVFlQRSBIVE1MIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkXCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPGh0bWwgbGFuZz1cIiIgKyBsYW5nICsgIlwiIHhtbDpsYW5nPVwiIiArIGxhbmcgKyAiXCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxoZWFkPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KG91dFAsCi0JCQkJCQkJIjxNRVRBIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCI+XG4iKTsgLy8kTk9OLU5MUy0xJCAgICAgICAgICAKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KAotCQkJCQkJCW91dFAsCi0JCQkJCQkJIjx0aXRsZT4iICsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFRpdGxlKCkgKyAiPC90aXRsZT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjwvaGVhZD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGtleVdvcmRzRmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBrZXlXb3JkUGF0aCA9IEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0UmVsYXRpdmVQYXRoKCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCk7Ci0KLQkJCUZpbGUgaW5keGVGaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4UmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBpbmRleFBhdGggPSBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFJlbGF0aXZlUGF0aCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFJlc3VsdEZpbGUoKTsKLQkJCU1pc2NTdGF0aWMKLQkJCQkJLnByaW50KAotCQkJCQkJCW91dFAsCi0JCQkJCQkJIjxmcmFtZXNldCByb3dzPVwiIiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhIZWlnaHQoKSArICIsKlwiPlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8ZnJhbWUgbmFtZT1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEluZGV4VGFyZ2V0KCkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXCIgdGl0bGU9XCJOYXZpZ2F0aW9uIGJhclwiIHNyYz1cIiIgKyBpbmRleFBhdGggLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJKyAiXCIgbWFyZ2luaGVpZ2h0PVwiMlwiIG1hcmdpbndpZHRoPVwiMlwiIHNjcm9sbGluZz1cImF1dG9cIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljCi0JCQkJCS5wcmludCgKLQkJCQkJCQlvdXRQLAotCQkJCQkJCSI8ZnJhbWUgbmFtZT1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleVdvcmRUYXJnZXQoKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkrICJcIiB0aXRsZT1cIkNvbnRlbnRzXCIgc3JjPVwiIiArIGtleVdvcmRQYXRoIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgIlwiIG1hcmdpbmhlaWdodD1cIjBcIiBtYXJnaW53aWR0aD1cIjJcIiBzY3JvbGxpbmc9XCJhdXRvXCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9mcmFtZXNldD5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dFAuY2xvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oIktleVdvcmRIb2xkZXI6cHJpbnRGcmFtZXNldFxuIiArIEhlbHBNZXNzYWdlcy5FWENFUFRJT04gKyBlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyBQcmludHMgdGhlIGh0bWwgZmlsZSB3aXRoIHRoZSBzaG9ydGN1dHMgdG8gZWFjaCBhbmNob3IgaW4gdGhlIGtleXdvcmRmaWxlCi0JcHJpdmF0ZSB2b2lkIHByaW50SW5kZXgoKSB7Ci0JCXRyeSB7Ci0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRJbmRleFJlc3VsdEZpbGUoKSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlmaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCQlmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCX0KLQotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFA7Ci0JCQlpZiAoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSAhPSBudWxsKSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCi0JCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldENoYXJhY3RlclNldCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5XUklURV9GSUxFCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkKLQkJCQkJKyAiIiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0SW5kZXhSZXN1bHRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGRcIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8aHRtbCBsYW5nPVwiIiArIGxhbmcgKyAiXCIgeG1sOmxhbmc9XCIiICsgbGFuZyArICJcIj5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPGhlYWQ+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJTWlzY1N0YXRpYwotCQkJCQkucHJpbnQob3V0UCwKLQkJCQkJCQkiPE1FVEEgaHR0cC1lcXVpdj1cIkNvbnRlbnQtVHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIj5cbiIpOyAvLyROT04tTkxTLTEkICAgICAgICAgIAotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9oZWFkPjxCT0RZPlxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJU3RyaW5nIGJlZ2luQ2hhciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5V29yZHMgIT0gbnVsbCkgewotCQkJCUZpbGUga2V5V29yZHNGaWxlID0gbmV3IEZpbGUoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJLmdldFd3d1Jvb3QoKQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCkpOwotCQkJCVN0cmluZyBwYXRoID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRSZWxhdGl2ZVBhdGgoKQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleXdvcmRSZXN1bHRGaWxlKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVdvcmRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUtleVdvcmQgdG1wID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJU3RyaW5nIGZpcnN0TCA9IHRtcC5nZXRLZXlXb3JkKCkuc3Vic3RyaW5nKDAsIDEpCi0JCQkJCQkJLnRvVXBwZXJDYXNlKCk7Ci0KLQkJCQkJaWYgKGZpcnN0TC5jb21wYXJlVG8oYmVnaW5DaGFyKSAhPSAwKSB7Ci0JCQkJCQliZWdpbkNoYXIgPSBmaXJzdEw7Ci0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBIUkVGPVwiIiArIHBhdGggKyAiIyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgYmVnaW5DaGFyKTsKLQkJCQkJCU1pc2NTdGF0aWMKLQkJCQkJCQkJLnByaW50KAotCQkJCQkJCQkJCW91dFAsCi0JCQkJCQkJCQkJIlwiIFRBUkdFVD1cIiIgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEtleVdvcmRUYXJnZXQoKSArICJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGJlZ2luQ2hhcik7Ci0JCQkJCQlNaXNjU3RhdGljLnByaW50KG91dFAsICI8L0E+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJTWlzY1N0YXRpYy5wcmludChvdXRQLCAiPC9CT0RZPjwvaHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJb3V0UC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVycgotCQkJCQkucHJpbnRsbigiS2V5V29yZEhvbGRlcjpwcmludEluZGV4XG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8vIFByaW50cyB0aGUga2V5d29yZGZpbGUKLQlwcml2YXRlIHZvaWQgcHJpbnRLZXlXb3JkcygpIHsKLQotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dFA7Ci0KLQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0V3d3Um9vdCgpCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJCWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJfQotCi0JCQlpZiAoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSAhPSBudWxsKSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCi0JCQkJCQlLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldENoYXJhY3RlclNldCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5XUklURV9GSUxFCi0JCQkJCSsgS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRXd3dSb290KCkgKyAiIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXl3b3JkUmVzdWx0RmlsZSgpKTsKLQkJCVN0cmluZyBoZWFkZXJGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRIZWFkZXJGaWxlKCksIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJCWlmIChoZWFkZXJGaWxlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLk5vbmUpKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKEhlbHBNZXNzYWdlcy5JTkNPUlJFQ1RfSEVBREVSRklMRQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEhlYWRlckZpbGUoKSk7Ci0JCQl9Ci0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGhlYWRlckZpbGUpOwotCi0JCQlTdHJpbmcgYmVnaW5DaGFyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXlXb3JkcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlXb3Jkcy5zaXplKCk7IGkrKykgewotCi0JCQkJCUtleVdvcmQgdG1wID0gKEtleVdvcmQpIGtleVdvcmRzLmVsZW1lbnRBdChpKTsKLQkJCQkJU3RyaW5nIGZpcnN0TCA9IHRtcC5nZXRLZXlXb3JkKCkuc3Vic3RyaW5nKDAsIDEpCi0JCQkJCQkJLnRvVXBwZXJDYXNlKCk7Ci0KLQkJCQkJaWYgKGZpcnN0TC5jb21wYXJlVG8oYmVnaW5DaGFyKSAhPSAwKSB7Ci0JCQkJCQliZWdpbkNoYXIgPSBmaXJzdEw7Ci0JCQkJCQlGb250T2JqZWN0IGZzID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkuZ2V0U3R5bGVTaGVldChEZWYuSGVhZExpbmVTdHlsZSk7Ci0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCWZzID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJLmdldFN0eWxlU2hlZXQoRGVmLkRlZmF1bHRTdHlsZSk7Ci0JCQkJCQl9Ci0JCQkJCQlGb250T2JqZWN0IGYgPSBudWxsOwotCQkJCQkJRm9udE9iamVjdCBmciA9IGZzOwotCQkJCQkJaWYgKGZzID09IG51bGwpIHsKLQkJCQkJCQlmID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJLmdldEZvbnQoRGVmLkhlYWRMaW5lRm9udCk7Ci0JCQkJCQkJaWYgKGYgPT0gbnVsbCkgewotCQkJCQkJCQlmID0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iagotCQkJCQkJCQkJCS5nZXRGb250KERlZi5EZWZhdWx0Rm9udCk7Ci0JCQkJCQkJfQotCQkJCQkJCWZyID0gZjsKLQkJCQkJCX0KLQkJCQkJCUtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoucHJpbnRTdGFydChvdXRQLCBmcik7Ci0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxCUj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJTWlzY1N0YXRpYwotCQkJCQkJCQkucHJpbnQoCi0JCQkJCQkJCQkJb3V0UCwKLQkJCQkJCQkJCQkiPEEgTkFNRT1cIiIgKyBiZWdpbkNoYXIgKyAiXCI+IiArIGJlZ2luQ2hhciArICI8L0E+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlpZiAoZnMgPT0gbnVsbCkgewotCQkJCQkJCU1pc2NTdGF0aWMucHJpbnQob3V0UCwgIjxCUj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5wcmludEVuZChvdXRQLCBmcik7Ci0JCQkJCX0KLQkJCQkJdG1wLnByaW50KG91dFAsIDApOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBmb290ZXJGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRGb290ZXJGaWxlKCksIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJCWlmIChmb290ZXJGaWxlLmVxdWFsc0lnbm9yZUNhc2UoRGVmLk5vbmUpKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKEhlbHBNZXNzYWdlcy5JTkNPUlJFQ1RfRk9PVEVSRklMRQotCQkJCQkJKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldEZvb3RlckZpbGUoKSk7Ci0JCQl9Ci0JCQlNaXNjU3RhdGljLnByaW50KG91dFAsIGZvb3RlckZpbGUpOwotCQkJb3V0UC5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVycgotCQkJCQkucHJpbnRsbigiS2V5V29yZEhvbGRlcjpwcmludEtleVdvcmRzXG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTYyMTkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0vLyBEZWJ1Zy4vLyBpbXBvcnQgamF2YXguc3dpbmcuKjsKLQotY2xhc3MgS2V5V29yZEluZGV4Ci17Ci0vLyBwcml2YXRlIHN0YXRpYyBLZXlXb3JkSG9sZGVyIGhvbGRlciA9IG5ldyBLZXlXb3JkSG9sZGVyKCk7Ci0KLQotLy8gIHByaXZhdGUgc3RhdGljIERlZmluaXRpb25PYmplY3QgZGVmT2JqPW51bGw7Ci0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmZpbGUgPSBudWxsOwotLy8gIHByaXZhdGUgc3RhdGljIFN0cmluZyBjaGFyU2V0ID0gbnVsbDsgCi0vLyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhlbHBGaWxlID0gbnVsbDsKLS8vICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3dVc2FnZSA9IGZhbHNlOwotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjQzMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRJbmRleEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLS8qKgotICoKLSAqIFRoaXMgZXhjZXB0aW9uIGlzIHVzZWQgYnkgYWxsIGNsYXNzZXMgdGhhdCBhcmUgaW52b2x2ZWQgd2l0aCB0aGUga2V5d29yZGluZGV4Ci0gKgotICovCi0KLQotY2xhc3MgS2V5V29yZEluZGV4RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyByZWFzb247Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBDbGFzcyBDb25zdHJ1Y3Rvci4KLQlLZXlXb3JkSW5kZXhFeGNlcHRpb24oU3RyaW5nIGV4Y2VwdGlvbk5hbWUsIFN0cmluZyBleGNlcHRpb25SZWFzb24pCi0JewotCQlzdXBlciggZXhjZXB0aW9uUmVhc29uICk7Ci0JCW5hbWUJPSBleGNlcHRpb25OYW1lOwotCQlyZWFzb24JPSBleGNlcHRpb25SZWFzb247Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleGNlcHRpb24uCi0JU3RyaW5nIGdldEV4Y2VwdGlvbk5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmV0dXJuIHRoZSByZWFzb24gZm9yIHRoZSBleGNlcHRpb24uCi0JU3RyaW5nIGdldEV4Y2VwdGlvblJlYXNvbigpCi0JewotCQlyZXR1cm4gcmVhc29uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJcmV0dXJuIG5hbWUgKyAiOiIgKyByZWFzb247IC8vJE5PTi1OTFMtMSQKLQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkSW5kZXhIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ5YjU3Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvS2V5V29yZEluZGV4SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgS2V5V29yZEluZGV4SGVscGVyIHsKLQlLZXlXb3JkSG9sZGVyIGhvbGRlciA9IG5ldyBLZXlXb3JkSG9sZGVyKCk7Ci0KLQlzdGF0aWMgRGVmaW5pdGlvbk9iamVjdCBkZWZPYmogPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmZpbGUgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoYXJTZXQgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhlbHBGaWxlID0gbnVsbDsKLQotCS8vIENvbnN0cnVjdG9yCi0JS2V5V29yZEluZGV4SGVscGVyKCkgewotCi0JCWRlZmZpbGUgPSBudWxsOwotCQkvLyBkbyBub3RoaW5nCi0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBwRGVmZmlsZQotCSAqIEBwYXJhbSBwQ2hhclNldAotCSAqIEBwYXJhbSBwSGVscEZpbGUKLQkgKi8KLQlwdWJsaWMgS2V5V29yZEluZGV4SGVscGVyKFN0cmluZyBwRGVmZmlsZSwgU3RyaW5nIHBDaGFyU2V0LCBTdHJpbmcgcEhlbHBGaWxlKSB7Ci0JCWRlZmZpbGUgPSBwRGVmZmlsZTsKLQkJY2hhclNldCA9IHBDaGFyU2V0OwotCQloZWxwRmlsZSA9IHBIZWxwRmlsZTsKLQl9Ci0KLQl2b2lkIHNldERlZmZpbGUoU3RyaW5nIHBGaWxlKSB7Ci0KLQkJZGVmZmlsZSA9IHBGaWxlOwotCi0JfQotCi0Jdm9pZCBzZXRDaGFyU2V0KFN0cmluZyBwQ2hhclNldCkgewotCi0JCWNoYXJTZXQgPSBwQ2hhclNldDsKLQotCX0KLQotCXZvaWQgc2V0SGVscEZpbGUoU3RyaW5nIHBIZWxwRmlsZSkgewotCi0JCWhlbHBGaWxlID0gcEhlbHBGaWxlOwotCi0JfQotCi0JLyoqCi0JICogbG9hZCB0aGUgZGVmaW5pdGlvbiBvYmplY3QgCi0JICogCi0JICogQHBhcmFtIHB1YkRpciBTdHJpbmcKLQkgKiBAcmV0dXJuIERlZmluaXRpb25PYmplY3QKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBEZWZpbml0aW9uT2JqZWN0IGxvYWREZWZpbml0aW9uKFN0cmluZyBwdWJEaXIpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGVmZmlsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgS2V5V29yZEluZGV4RXhjZXB0aW9uKAotCQkJCQkiS2V5V29yZEluZGV4SGVscGVyOmV4ZWN1dGUoKSIsIFN0cmluZ0RlZmluaXRpb25zLkVSUk9SX0RFRklOSVRJT05fRklMRV9OT1RfRk9VTkQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoaGVscEZpbGUgIT0gbnVsbCkgewotCQkJSGVscE1lc3NhZ2VzLmxvYWRIZWxwTWVzc2FnZXMoaGVscEZpbGUsIGNoYXJTZXQpOwotCQl9Ci0KLQkJZGVmT2JqID0gbmV3IERlZmluaXRpb25PYmplY3QocHViRGlyLCBkZWZmaWxlLCBjaGFyU2V0KTsKLQotCQlyZXR1cm4gZGVmT2JqOwotCX0KLQotCS8qKgotCSAqIGV4ZWN1dGUgdGhlIGtleXdvcmQgaW5kZXggZ2VuZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBJUHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBLZXlXb3JkSW5kZXhFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEtleVdvcmRJbmRleEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBDaGVjayBpZiBlbm91Z2ggaW5wdXQgaW4gZGVmaW5pdGlvbmZpbGUKLQkJaWYgKGRlZk9iai5lbm91Z2hJbnB1dCgpKSB7Ci0JCQlGaWxlIHRvcERpciA9IG5ldyBGaWxlKGRlZk9iai5nZXRXd3dSb290KCkpOwotCi0JCQkvLyBUaGUgd3d3Um9vdCBoYXZlIHRvIGJlIGEgZGlyZWN0b3J5Ci0JCQlpZiAodG9wRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLlBBUlNFX0RJUkVDVE9SWQotCQkJCQkJKyBkZWZPYmouZ2V0V3d3Um9vdCgpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLlRBS0VfQV9XSElMRSk7Ci0JCQkJcmVhZERpcih0b3BEaXIsIG1vbml0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgS2V5V29yZEluZGV4RXhjZXB0aW9uKAotCQkJCQkJIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQlEZWYuU3RhcnREaXIKLQkJCQkJCQkJKyAiOiAiICsgZGVmT2JqLmdldFd3d1Jvb3QoKSArIEhlbHBNZXNzYWdlcy5OT19ESVJFQ1RPUlkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gU3BsaXRzIGFuZCBzb3J0cyB0aGUga2V5d29yZHMKLQkJCWhvbGRlci5kaXZpZGUoKTsKLQotCQkJU3RyaW5nIHNwZWNLZXlXb3Jkc0ZpbGUgPSBkZWZPYmouZ2V0S2V5V29yZEZpbGUoKTsKLQkJCWlmIChzcGVjS2V5V29yZHNGaWxlICE9IG51bGwpIHsKLQkJCQkvLyBSZWFkcyB0aGUgc3BlY2tleXdvcmRmaWxlCi0JCQkJU3RyaW5nIHNwZWNLZXlXb3JkcyA9IE1pc2NTdGF0aWMubG9hZEZpbGUoc3BlY0tleVdvcmRzRmlsZSwKLQkJCQkJCWRlZk9iai5nZXRDaGFyYWN0ZXJTZXQoKSk7Ci0JCQkJaWYgKCFzcGVjS2V5V29yZHMuZXF1YWxzKERlZi5Ob25lKSkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcGVjS2V5V29yZHMsCi0JCQkJCQkJIlx0XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlob2xkZXIucmVhZFNwZWNLZXlXb3JkcyhwYXJzZXIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oCi0JCQkJCQkJIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJc3BlY0tleVdvcmRzRmlsZQotCQkJCQkJCQkJKyBIZWxwTWVzc2FnZXMuS0VZV09SRF9GSUxFX1NZTlRBWF9FUlJPUik7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBQcmludCB0aGUgS2V5V29yZEluZGV4SGVscGVyCi0JCQlob2xkZXIucHJpbnQoKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBLZXlXb3JkSW5kZXhFeGNlcHRpb24oIktleVdvcmRJbmRleEhlbHBlcjpleGVjdXRlKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCUhlbHBNZXNzYWdlcy5OT1RfRU5PVUdIX0lOUFVUKTsKLQkJfQotCi0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gUmVjdXJzaXZlbHkgcHJvY2VzcyBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgZGlyZWN0b3J5IGhlaXJhcmNoeS4KLQlwcml2YXRlIHZvaWQgcmVhZERpcihGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdHJpbmcgZmlsZXNbXSA9IGZpbGUubGlzdCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotCQkJdHJ5IHsKLQkJCQlmaWxlUGF0aCA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIktleVdvcmRJbmRleEhlbHBlcjpyZWFkRGlyXG4iICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCUZpbGUgdG1wID0gbmV3IEZpbGUoZmlsZVBhdGggKyAiLyIgKyBmaWxlc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKHRtcC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJLy8gSWYgdGhlIGZpbGUgaXMgYSBkaXJlY3RvcnkKLQkJCQlTdHJpbmcgdG1wUGF0aCA9IHRtcC5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQl0cnkgewotCQkJCQl0bXBQYXRoID0gdG1wLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0ub3V0Ci0JCQkJCQkJLnByaW50bG4oIktleVdvcmRJbmRleEhlbHBlcjpyZWFkRGlyXG4iICsgSGVscE1lc3NhZ2VzLkVYQ0VQVElPTiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJLy8gT24gcGMgdGhlIHNlcGFyYXRvciBtYXkgYmUgXCBhbmQgbm90IC8KLQkJCQl0bXBQYXRoID0gdG1wUGF0aC5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQkJaWYgKCFkZWZPYmouaXNJblN0b3BkaXIodG1wUGF0aCkpIHsKLQkJCQkJLy8gSWYgbm90IGluIHN0b3BkaXIKLQkJCQkJcmVhZERpcih0bXAsIG1vbml0b3IpOwotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIHsKLQkJCQkJdHJ5IHsKLQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKEhlbHBNZXNzYWdlcy5ESVJFQ1RPUllfTk9UX1BBUlNFRAotCQkJCQkJCQkrIHRtcC5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkucHJpbnRsbigiS2V5V29yZEluZGV4SGVscGVyOnJlYWREaXJcbiIgKyBIZWxwTWVzc2FnZXMuRVhDRVBUSU9OICsgZS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQkvLyBQYXJzZSBhbGwgdGhlIGZpbGVzIHdoaWNoIGhhdmUgb25lIG9mIHRoZSBleHRlbnNpb25zIHdlIGFyZQotCQkJLy8gaW50ZXJlc3RlZCBpbi4KLQkJCWVsc2UgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKCIuaHRtIikgfHwgZmlsZXNbaV0uZW5kc1dpdGgoIi5odG1sIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXx8IGZpbGVzW2ldLmVuZHNXaXRoKCIuc2h0bWwiKSB8fCBmaWxlc1tpXS5lbmRzV2l0aCgiLnNodG0iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl7Ci0JCQkJbG9hZEZpbGUoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArIGZpbGVzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBQYXJzZSBlYWNoIG9mIHRoZSBmb3VuZCBmaWxlcyBhbmQgZXh0cmFjdCB0aGUga2V5d29yZHMgZnJvbSB0aGVtLgotCXByaXZhdGUgdm9pZCBsb2FkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGh0bWxGaWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShmaWxlTmFtZSwgZGVmT2JqCi0JCQkJLmdldENoYXJhY3RlclNldCgpKTsKLQkJaWYgKGh0bWxGaWxlICE9IG51bGwgJiYgaHRtbEZpbGUubGVuZ3RoKCkgPiAwKSAKLQkJewotCQkJTGlzdCBrZXlXb3JkID0gS2V5V29yZFN0YXRpYy5nZXRLZXlXb3JkcyhodG1sRmlsZSk7Ci0JCQlpZiAoa2V5V29yZCAhPSBudWxsICYmIGtleVdvcmQuc2l6ZSgpID4gMCApIHsKLQkJCQlJTy5wcmludERlYnVnKCJrZXl3b3JkICIgKyBrZXlXb3JkKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyB0aXRsZSA9IE1pc2NTdGF0aWMuZ2V0VGl0bGUoaHRtbEZpbGUpOwotCi0JCQkJLy8gQWRkcyBhIGZpbGUgd2l0aCBrZXl3b3JkcyB0byB0aGUgaG9sZGVyIG9iamVjdAotCQkJCWhvbGRlci5hZGQobmV3IEtleVdvcmRGaWxlKHRpdGxlLCBkZWZPYmouZ2V0UmVsYXRpdmVQYXRoKCkKLQkJCQkJCSsgIiIgKyBmaWxlTmFtZS5zdWJzdHJpbmcoZGVmT2JqLmdldFd3d1Jvb3RMZW5ndGgoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWtleVdvcmQpKTsKLQkJCQkKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigia2V5d29yZHM9IiArIGtleVdvcmQuc2l6ZSgpICArICIgZmlsZTogIiArIGZpbGVOYW1lKTsKLQkJCX0KLQkJCQotCQl9Ci0JCQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRTdGF0aWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9LZXlXb3JkU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZjc4YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L0tleVdvcmRTdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci0KLQotY2xhc3MgS2V5V29yZFN0YXRpYyB7Ci0KLQkvLyBub3RlOiBwYXR0ZXJuIHdpdGggW14+XSBkb2VzIG5vdCBtYXRjaCB3aGVuIHRoZXJlIGFyZSBub24tZW5nbGlzaAotCS8vIGNoYXJhY3RlcnMsIG1heWJlIGl0J3MgYSBqcmUgYnVnPwotCXN0YXRpYyBmaW5hbCBQYXR0ZXJuIHBfaW5kZXhfcmVmID0gUGF0dGVybi5jb21waWxlKAotCQkJIjxhXFxzKz8oLio/KT4iLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQkvLyAiPGFcXHMrPyhbXj5dKj8obmFtZVxccyo9XFxzKlwiWEVffGNsYXNzXFxzKj1cXHMqXCJpbmRleCkuKj8pPiIsCi0JLy8gUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFIHwgUGF0dGVybi5ET1RBTEwpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBnZXQgdGhlIGtleSB3b3JkcyB3aXRoIGtleSBhbmQgdGV4dCBkZXNjcmlwdGlvbi4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZgotCSAqIGluZGV4IGZvcm1hdDogMS4gb2xkIGZvcm1hdDogPGEgbmFtZT0iS0VZX19URVhUIiAuLi4+IDIuIG5ldyBmb3JtYXQ6IDxhCi0JICogY2xhc3M9ImluZGV4IiBuYW1lPSJib29rbWFyayIga2V5PSJLRVkiIHRleHQ9IlRFWFQiIC4uLj4gVEVYVCBwYXJ0IGlzCi0JICogb3B0aW9uYWwKLQkgKi8KLQlzdGF0aWMgTGlzdCBnZXRLZXlXb3JkcyhTdHJpbmcgcmVhbFN0cmluZykgewotCQlpZiAocmVhbFN0cmluZyA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmdldEtleVdvcmRzXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlMaXN0IGFuY2hvcnMgPSBuZXcgQXJyYXlMaXN0KDIpOyAvLyROT04tTkxTLTEkCi0KLQkJTWF0Y2hlciBtID0gcF9pbmRleF9yZWYubWF0Y2hlcihyZWFsU3RyaW5nKTsKLQkJd2hpbGUgKG0uZmluZCgpKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlcyA9IG0uZ3JvdXAoMSk7Ci0JCQlpZiAoYXR0cmlidXRlcy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCU1hcCBhdHRyTWFwID0gUmVzb3VyY2VIZWxwZXIuZ2V0VGFnQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCVN0cmluZyBrZXlXb3JkID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfTkFNRSk7Ci0JCQlpZiAoa2V5V29yZCA9PSBudWxsIHx8IGtleVdvcmQubGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgY2xzID0gKFN0cmluZykgYXR0ck1hcC5nZXQoUmVzb3VyY2VIZWxwZXIuVEFHX0FUVFJfQ0xBU1MpOwotCQkJU3RyaW5nIGtleSA9IG51bGw7Ci0JCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQlpZiAoKGNscyAhPSBudWxsKQotCQkJCQkmJiBjbHMuZXF1YWxzKFJlc291cmNlSGVscGVyLlRBR19BVFRSX1ZBTFVFX0lOREVYKSkgewotCQkJCWtleSA9IChTdHJpbmcpIGF0dHJNYXAuZ2V0KFJlc291cmNlSGVscGVyLlRBR19BVFRSX0tFWSk7Ci0JCQkJdGV4dCA9IChTdHJpbmcpIGF0dHJNYXAuZ2V0KFJlc291cmNlSGVscGVyLlRBR19BVFRSX1RFWFQpOwotCQkJfQotCQkJLy8gVGhlIGdldEtleVdvcmRQcmVmaXgoKSByZXR1cm5zIHRoZSB0YWcgd2hpY2ggaXMgdXNlZCB0byBkZWxpbWl0Ci0JCQkvLyBrZXl3b3Jkcy4KLQkJCS8vIEN1cnJlbnRseSB0aGlzIHRhZyBpcyBYRSBhbmQgaXMgZGVmaW5lZCBpbiBrZXl3b3JkY29uZmlnLnR4dAotCQkJaWYgKChrZXkgIT0gbnVsbCkKLQkJCQkJfHwga2V5V29yZC5zdGFydHNXaXRoKEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmoKLQkJCQkJCQkuZ2V0S2V5V29yZFByZWZpeCgpKSkgewotCQkJCWFuY2hvcnMuYWRkKG5ldyBLZXlXb3JkRGVmKGtleVdvcmQsIGtleSwgdGV4dCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhbmNob3JzOwotCi0JfQotCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0S2V5V29yZChTdHJpbmcga2V5V29yZCkgewotCQlyZXR1cm4gY29udmVydEtleVdvcmQoa2V5V29yZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0S2V5V29yZChTdHJpbmcga2V5V29yZCwgU3RyaW5nIGtleSwgU3RyaW5nIHRleHQpIHsKLQotCQlpZiAoa2V5V29yZCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmNvbnZlcnRLZXlXb3JkXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSU8ucHJpbnREZWJ1ZygiY29udmVydEtleVdvcmQgIiArIGtleVdvcmQpOyAvLyBFcnJvciBpZiB3ZSBnZXQgYSBrZXl3b3JkIC8vJE5PTi1OTFMtMSQKLQkJLy8gdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZQotCQkvLyB0YWcuIC8vJE5PTi1OTFMtMSQKLQkJaWYgKChrZXkgIT0gbnVsbCkgJiYgKGtleS5sZW5ndGgoKSA+IDApKSB7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBrZXk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBrZXkgKyBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmxldmVsU2VwYXJhdG9yUmVwbGFjZQotCQkJCQkJKyB0ZXh0OwotCQkJfQotCQl9Ci0KLQkJaWYgKCFrZXlXb3JkLnN0YXJ0c1dpdGgoS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5nZXRLZXlXb3JkUHJlZml4KCkpKSB7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCJLZXlXb3JkU3RhdGljOmNvbnZlcnRLZXlXb3JkXG4iICsga2V5V29yZCArIEhlbHBNZXNzYWdlcy5LRVlXT1JEX1NZTlRBWF9FUlJPUiArIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0S2V5V29yZFByZWZpeCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBSZW1vdmUgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5V29yZCAobmFtZWx5IFhFXykuCi0JCVN0cmluZyB0bXBLID0ga2V5V29yZC5zdWJzdHJpbmcoMyk7Ci0JCVN0cmluZyB0bXAgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgaSA9IDA7Ci0JCWludCBwb3MgPSAwOwotCQl3aGlsZSAoaSAhPSAtMSkgewotCQkJLy8gZ2V0S2V5V29yZExldmVsU2VwYXJhdG9yKCkgaXMgaGFyZC1jb2RlZCBhcyBfXwotCQkJaSA9IHRtcEsuaW5kZXhPZihLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqCi0JCQkJCS5nZXRLZXlXb3JkTGV2ZWxTZXBhcmF0b3IoKSwgcG9zKTsKLQkJCWlmIChpICE9IC0xKSB7Ci0JCQkJLy8gSW5zZXJ0IGEgc2VwYXJhdG9yIGJldHdlZW4ga2V5d29yZHMsIHdoaWNoIGluIHRoaXMgY2FzZSBpcwotCQkJCS8vIHRoZSAiOiIKLQkJCQl0bXAgKz0gdG1wSy5zdWJzdHJpbmcocG9zLCBpKTsKLQkJCQl0bXAgKz0gS2V5V29yZEluZGV4SGVscGVyLmRlZk9iai5sZXZlbFNlcGFyYXRvclJlcGxhY2U7Ci0JCQkJcG9zID0gaSArIDI7Ci0JCQl9IGVsc2UgewotCQkJCXRtcCArPSB0bXBLLnN1YnN0cmluZyhwb3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0bXAucmVwbGFjZSgnXycsICcgJyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L01pc2NTdGF0aWMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9NaXNjU3RhdGljLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZTM3MmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L01pc2NTdGF0aWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5zZXJ2aWNlcy5pbmRleDsKLQotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLkZpbGVVdGlsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIE1pc2NTdGF0aWMKLXsKLSAgc3RhdGljIEhhc2h0YWJsZSB0d29WYWx1ZUZpbGU9bnVsbDsKLSAgc3RhdGljIFN0cmluZyB0b3BEaXI9bnVsbDsKLSAgc3RhdGljIGludCB0b3BEaXJMPTA7Ci0KLSAgc3RhdGljIGJvb2xlYW4gc3BlY2NoYXJmb3VuZD1mYWxzZTsKLSAgc3RhdGljIGJvb2xlYW4gdG1wc3BlY2NoYXJmb3VuZD1mYWxzZTsKLQotICBzdGF0aWMgbG9uZyBkaWZmOwotCi0gIC8vUmVhZHMgYSBmaWxlIHdoZXJlIGVhY2ggcm93IGNvbnRhaW5zIHR3byB2YWx1ZXMgc2VwYXJhdGVkIHdpdGggXHQgc2lnbgotICAvLyBUaGUgc3ludGF4IG9mIGVhY2ggbGluZSBjYW4gYmUgZWlnaHRlcgotICAvLyB2YWx1ZSAgdmFsdWUKLSAgLy8gb3IKLSAgLy8gInZhbHVlIiAgICAidmFsdWUiCi0gIC8vCi0gIC8vIFRoZSBzeW50YXggbXVzdCBiZSB0aGUgc2FtZSBmb3IgZWFjaCByb3cgaW4gdGhlIGZpbGUuCi0gIHN0YXRpYyBib29sZWFuIHJlYWRUd29WYWx1ZUZpbGUoU3RyaW5nIGZpbGUsIFN0cmluZyBjaGFyYWN0ZXJTZXQpCi0gIHsKLSAgICAgICBJTy5wcmludERlYnVnKCJyZWFkVHdvVmFsdWVGaWxlICIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBpZihmaWxlPT1udWxsKQotICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpyZWFkVHdvVmFsdWVGaWxlIiArIEhlbHBNZXNzYWdlcy5JTlBVVF9QQVJBTUVURVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICB9Ci0gICAgICAgSU8ucHJpbnREZWJ1ZygiYmVmb3JlIGxvYWRmaWxlICIgICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3RyaW5nIGluZmlsZSA9IGxvYWRGaWxlKGZpbGUsY2hhcmFjdGVyU2V0KTsKLSAgICBJTy5wcmludERlYnVnKCJhZnRlciBsb2FkZmlsZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZighaW5maWxlLmVxdWFscyhEZWYuTm9uZSkpCi0gICAgICB7Ci0gICAgICAgaWYoaW5maWxlLmNoYXJBdCgwKT09JyInKQotICAgICAgIHsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHBhcnNlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgIGluZmlsZSwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICB0d29WYWx1ZUZpbGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgIHsKLQotICAgICAgICAgICBTdHJpbmcgbGluZSA9IHBhcnNlci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgaW50IGZpcnN0Rm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgaW50IHNlY29uZEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCBmaXJzdEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaW50IHRoaXJkRm51dHQgPSBnZXRJbmRleChsaW5lLCJcIiIsIHNlY29uZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgIGludCBmb3J0aEZudXR0ID0gZ2V0SW5kZXgobGluZSwiXCIiLCB0aGlyZEZudXR0KzEpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgICAgaWYoZmlyc3RGbnV0dD09LTEgfHwgc2Vjb25kRm51dHQ9PS0xIHx8Ci0gICAgICAgICAgICAgICB0aGlyZEZudXR0PT0tMSB8fCBmb3J0aEZudXR0PT0tMSkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgU3RyaW5nIGRlZiA9IGxpbmUuc3Vic3RyaW5nKGZpcnN0Rm51dHQrMSwgc2Vjb25kRm51dHQpOwotICAgICAgICAgICBTdHJpbmcgdGV4dCA9IGxpbmUuc3Vic3RyaW5nKHRoaXJkRm51dHQrMSwgZm9ydGhGbnV0dCk7Ci0gICAgICAgICAgIHR3b1ZhbHVlRmlsZS5wdXQoZGVmLHRleHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBTdHJpbmdUb2tlbml6ZXIgcGFyc2VyID0gbmV3IFN0cmluZ1Rva2VuaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgaW5maWxlLCAiXHRcbiIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgIHR3b1ZhbHVlRmlsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgIHdoaWxlKHBhcnNlci5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICAgICB7Ci0gICAgICAgICAgICB0d29WYWx1ZUZpbGUucHV0KHBhcnNlci5uZXh0VG9rZW4oKS50cmltKCkscGFyc2VyLm5leHRUb2tlbigpLnRyaW0oKSk7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm5zIHRoZSB0ZXh0IHdpdGhpbiB0aGUgdGl0bGUgdGFncyBpbiB0aGUgaW5wdXQgc3RyaW5nCi0gIHN0YXRpYyBTdHJpbmcgZ2V0VGl0bGUoU3RyaW5nIHJlYWxTdHJpbmcpCi0gIHsKLSAgICAgIGlmKHJlYWxTdHJpbmc9PW51bGwpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpnZXRUaXRsZSIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICBTdHJpbmcgdXBwZXJTdHJpbmcgPSByZWFsU3RyaW5nLnRvVXBwZXJDYXNlKCk7Ci0gICAgIGludCB0aXRsZVN0YXJ0ID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICJUSVRMRSIsMCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgaWYodGl0bGVTdGFydCE9LTEpCi0gICAgIHsKLSAgICAgICAgaW50IHRpdGxlU3RhcnRFbmRUID0gZ2V0SW5kZXgodXBwZXJTdHJpbmcsICI+Iix0aXRsZVN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZih0aXRsZVN0YXJ0RW5kVCE9LTEpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnQgdGl0bGVFbmQgPSBnZXRJbmRleCh1cHBlclN0cmluZywgIjwvVElUTEUiLHRpdGxlU3RhcnRFbmRUKzEpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgaWYodGl0bGVFbmQhPS0xKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IHJlYWxTdHJpbmcuc3Vic3RyaW5nKHRpdGxlU3RhcnRFbmRUKzEsdGl0bGVFbmQpLnRyaW0oKTsKLSAgICAgICAgICAgIHJldHVybiB0aXRsZTsKLSAgICAgICAgICAgfQotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy9SZXR1cm4gdGhlIGluZGV4IHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBmaXJzdCBvY2N1cmFuY2Ugb2YgdGhlIHN0aW5nIG1hdGNoCi0gIC8vIHN0YXJ0cy4gU2VhcmNoZXMgZnJvbSB0aGUgaW5kZXggZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIHN0YXJ0Ci0gIHN0YXRpYyBpbnQgZ2V0SW5kZXgoU3RyaW5nIHN0ciwgU3RyaW5nIG1hdGNoLCBpbnQgc3RhcnQpCi0gIHsKLSAgICAgaWYoc3RyPT1udWxsKQotICAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6Z2V0SW5kZXhcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgfQotCi0gICAgICBpZihtYXRjaD09bnVsbCkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOmdldEluZGV4XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gLTE7Ci0gICAgIH0KLSAgICAgaW50IGZvdW5kID0gc3RyLmluZGV4T2YobWF0Y2gudG9VcHBlckNhc2UoKSwgc3RhcnQpOwotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaC50b0xvd2VyQ2FzZSgpLCBzdGFydCk7Ci0gICAgIH0KLQotICAgICBpZihmb3VuZD09LTEpCi0gICAgIHsKLSAgICAgICAgZm91bmQgPSBzdHIuaW5kZXhPZihtYXRjaCwgc3RhcnQpOwotICAgICB9Ci0gICAgIHJldHVybiBmb3VuZDsKLSAgfQotICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0KLSAgIHN0YXRpYyBib29sZWFuIHByaW50KE91dHB1dFN0cmVhbVdyaXRlciBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50XG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICBvdXRQLndyaXRlKHN0ciwwLHN0ci5sZW5ndGgoKSk7Ci0gICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnQiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLQotICAgLy8gUHJpbnRzIHRoZSBhIHN0cmluZyB0byBhIERhdGFPdXRwdXRTdHJlYW0gaW4gVVRGIGZvcm1hdAotICAgc3RhdGljIGJvb2xlYW4gcHJpbnRVVEYoRGF0YU91dHB1dFN0cmVhbSBvdXRQLCBTdHJpbmcgc3RyKQotICAgewotICAgIGlmKG91dFA9PW51bGwpCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6cHJpbnRVVEZcbiIgKyBIZWxwTWVzc2FnZXMuQkFEX09VVFBVVF9TVFJFQU0pOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgfQotICAgICBpZihzdHI9PW51bGwpCi0gICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGXG4iICsgSGVscE1lc3NhZ2VzLklOUFVUX1BBUkFNRVRFUl9OVUxMKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgIH0KLSAgICAgICB0cnkKLSAgICAgICAgewotCi0gICAgICAgICBvdXRQLndyaXRlVVRGKHN0cik7Ci0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnByaW50VVRGIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgfQotCi0KLSAgc3RhdGljIHZvaWQgcHJpbnRTcGFjZShPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCwgaW50IG5vT2ZTcGFjZSkKLSAgIHsKLSAgICAgIGZvcihpbnQgaT0wO2k8bm9PZlNwYWNlO2krKykKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgIG91dFAud3JpdGUoIiZuYnNwOyIsMCw2KTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpwcmludFNwYWNlIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgfQotCi0gICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgLy8gUmVhZCBhIGZpbGUgYW5kIHJldHVybiBpdCBhcyBhIGNvbmNhdGVuYXRlZCBzdHJpbmcuCi0gICBzdGF0aWMgU3RyaW5nIGxvYWRGaWxlKFN0cmluZyBmaWxlTmFtZSxTdHJpbmcgY2hhcmFjdGVyc2V0KQotICAgewkgIAotCSAgIHRyeQotCSAgIHsKLQkJICAgcmV0dXJuIEZpbGVVdGlsLnJlYWRGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSwgY2hhcmFjdGVyc2V0KS50b1N0cmluZygpOyAgIAotCSAgIH0KLQkgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotCSAgIHsKLQkJICAgOwotCSAgIH0KLQkgICAKLQkgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLSAgIC8vIENvbnZlcnRzIGFsbCBsZXR0ZXJzIGxpa2UgXHVmZmZkLFx1ZmZmZCxcdWZmZmQgdG8gc3BlY2lhbCBjb2RlcwotICAgc3RhdGljIHZvaWQgc3BlY0NoYXIoU3RyaW5nIGluLCBTdHJpbmcgb3V0LCBTdHJpbmcgY2hhcmFjdGVyc2V0KQotICAgewotICAgICBpZihpbj09bnVsbCkKLSAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXJcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICAgfQotCi0gICAgIGlmKG91dD09bnVsbCkKLSAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXJcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICAgICBTdHJpbmcgdG1wRmlsZSA9ICIxM2Q4NC5od3IiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBpbmZpbGUgPSBudWxsOwotICAgICAgICBTdHJpbmcgdG1wSW5maWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZShpbixjaGFyYWN0ZXJzZXQpOwotICAgICAgICBib29sZWFuIHdyaXRlUmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLQotICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UDsKLSAgICAgICAgICAgaWYoY2hhcmFjdGVyc2V0IT1udWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBGaWxlKSxjaGFyYWN0ZXJzZXQpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICB3cml0ZVJlc3VsdCAgPSBNaXNjU3RhdGljLnByaW50KG91dFAsdG1wSW5maWxlKTsKLSAgICAgICAgICAgaWYoIXdyaXRlUmVzdWx0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzY1N0YXRpYzpzcGVjQ2hhciIgKyBIZWxwTWVzc2FnZXMuV1JJVEVfRVhDRVBUSU9OICsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpbik7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgb3V0UC5jbG9zZSgpOwotICAgICAgICAgfQotICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJNaXNjU3RhdGljOnNwZWNDaGFyIiArIEhlbHBNZXNzYWdlcy5XUklURV9FWENFUFRJT04gKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgIGUpOwotICAgICAgICAgfQotCi0gICAgICAgICAgIGlmKHdyaXRlUmVzdWx0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaW5maWxlID0gTWlzY1N0YXRpYy5sb2FkRmlsZSh0bXBGaWxlLGNoYXJhY3RlcnNldCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgaW5maWxlPW51bGw7Ci0gICAgICAgICAgIH0KLQotCi0KLQotICAgICAgICBpZihpbmZpbGUhPW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdGZpbGU9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICAgICAgIGZvcihpbnQgaT0wO2k8aW5maWxlLmxlbmd0aCgpO2krKykKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wc3BlY2NoYXJmb3VuZD1mYWxzZTsKLSAgICAgICAgICAgICAgICBjaGFyIHQgPSBpbmZpbGUuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmKHQhPScmJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKCh0PidhJyAmJiB0PCd6JykgfHwgKHQ+J0EnICYmIHQ8J1onKSB8fCAodD4nMCcgJiYgdDwnOScpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHQ9PSc8JyB8fCB0PT0nPicgfHwgdD09Jy8nIHx8IHQ9PScuJyB8fCB0PT0nPScgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgdD09Jy0nIHx8IHQ9PSclJyB8fCB0PT0nQCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGZpbGUuYXBwZW5kKHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGZpbGUuYXBwZW5kKE1pc2NTdGF0aWMudG9TcGVjQ2hhcih0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBjaGFyIHQyID0gaW5maWxlLmNoYXJBdChpKzEpOwotICAgICAgICAgICAgICAgICAgIGlmKHQyPT0nICcgfHwgdDI9PSdcbicpCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ZmlsZS5hcHBlbmQoIiZhbXA7Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgIHRtcHNwZWNjaGFyZm91bmQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICByZXN1bHRmaWxlLmFwcGVuZChNaXNjU3RhdGljLnRvU3BlY0NoYXIodCkpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYodG1wc3BlY2NoYXJmb3VuZD09dHJ1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgc3BlY2NoYXJmb3VuZD10cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICBpZihzcGVjY2hhcmZvdW5kKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oSGVscE1lc3NhZ2VzLldSSVRFX0ZJTEUgKyBvdXQpOwotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvdXRQOwotICAgICAgICAgICAgICAgIGlmKGNoYXJhY3RlcnNldCE9bnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBvdXRQID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpLGNoYXJhY3RlcnNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgb3V0UCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE1pc2NTdGF0aWMucHJpbnQob3V0UCwgcmVzdWx0ZmlsZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBvdXRQLmNsb3NlKCk7Ci0gICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgc3BlY2NoYXJmb3VuZD1mYWxzZTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk1pc2NTdGF0aWM6c3BlY0NoYXIiICsgSGVscE1lc3NhZ2VzLldSSVRFX0VYQ0VQVElPTiArIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgRmlsZSB0bXAgPSBuZXcgRmlsZSh0bXBGaWxlKTsKLSAgICAgICAgICAgICAgdG1wLmRlbGV0ZSgpOwotCi0gICAgIH0KLSAgIH0KLQotICAgLy9jb252ZXJ0cyBhIGNoYXJhY3RlciB0byBhIHNwZWNpYWwgY29kZSBpZiBuZWVkZWQKLSAgIHN0YXRpYyBTdHJpbmcgdG9TcGVjQ2hhcihjaGFyIHRva2VuKQotICAgewotICAgICAgICB0bXBzcGVjY2hhcmZvdW5kPXRydWU7Ci0gICAgICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICAgcmV0dXJuICImYXJpbmc7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCSAgICAgIHJldHVybiAiJkFyaW5nOyI7IC8vJE5PTi1OTFMtMSQKLQkgICAgfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImQXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCSAgICB7Ci0JCSByZXR1cm4gIiZhdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZPdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZvdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJkVhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZFZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgICByZXR1cm4gIiZVdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJmFhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZBYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImYWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmVhY3V0ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZlZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWFjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmV1bWw7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImb2FjdXRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZvZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZ1YWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImdWdyYXZlOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJIHsKLQkJCXJldHVybiAiJnV1bWw7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkgaWYodG9rZW49PSdcdWZmZmQnKQotCQkgewotCQkJcmV0dXJuICImeXVtbDsiOyAvLyROT04tTkxTLTEkCi0JCSB9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImYWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJkFjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJcmV0dXJuICImRWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgIHJldHVybiAiJnVjaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImVWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImb2NpcmM7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCSBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJk9jaXJjOyI7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImaWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZBRWxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZhZWxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImSWNpcmM7IjsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZBZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLSAgICAgICAgewotCSAgICAgICByZXR1cm4gIiZBdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJmF0aWxkZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCSByZXR1cm4gIiZFVEg7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQkgcmV0dXJuICImZXRoOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJIHJldHVybiAiJklncmF2ZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgICByZXR1cm4gIiZOdGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkgICAgaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZudGlsZGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImT3RpbGRlOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJm90aWxkZTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCQlyZXR1cm4gIiZzemxpZzsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCSAgICBpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJlRIT1JOOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJnRob3JuOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0gICAgICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgIHJldHVybiAiJk9zbGFzaDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodG9rZW49PSdcdWZmZmQnKQotCQl7Ci0JCSAgcmV0dXJuICImb3NsYXNoOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJICByZXR1cm4gIiZPZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJICByZXR1cm4gIiZVZ3JhdmU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICByZXR1cm4gIiZpdW1sOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JICAgIGlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJICByZXR1cm4gIiZZYWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkgICByZXR1cm4gIiZ5YWN1dGU7IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJkNjZWRpbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZih0b2tlbj09J1x1ZmZmZCcpCi0JCXsKLQkJCXJldHVybiAiJmNjZWRpbDsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvKmlmKHRva2VuPT0nXHVmZmZkJykKLQkJewotCQkJcmV0dXJuICImZnJhYzEyOyI7Ci0JCX0qLwotCi0gICAgICAgIHRtcHNwZWNjaGFyZm91bmQgPSBmYWxzZTsKLQkJcmV0dXJuIG5ldyBDaGFyYWN0ZXIodG9rZW4pLnRvU3RyaW5nKCk7Ci0KLSAgICAgfQotCi0gICAgICAvKioKLSAgKiBUcmltcyBkb3VibGUgcXVvdGVzIGZyb20gYW4gYXJndW1lbnQuCi0gICogQHBhcmFtIHN0cgl0aGUgc3RyaW5nIHRvIHRyaW0uCi0gICogQHJldHVybiB0aGUgdHJpbW1lZCBzdHJpbmcuCi0gKiovCi0KLSBzdGF0aWMgU3RyaW5nIHRyaW1RdW90ZXMoU3RyaW5nIHN0cikgewotCi0gIGludCBsZW4gPSBzdHIubGVuZ3RoKCk7Ci0gIGlmKGxlbiA8PSAwKSByZXR1cm4gc3RyOwotCi0gIGlmKHN0ci5jaGFyQXQobGVuIC0gMSkgPT0gJyInKSBzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotICBpZihzdHIuY2hhckF0KDApID09ICciJykgc3RyID0gc3RyLnN1YnN0cmluZygxKTsKLQotICByZXR1cm4gc3RyOwotICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvT1MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9PUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTU1NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9PUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLQotZmluYWwgY2xhc3MgT1MKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93czk4ID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3M5NSA9IGZhbHNlOwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNXaW5kb3dzTlQgPSBmYWxzZTsKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWFjaW50b3NoID0gZmFsc2U7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzOwotCi0gICAgICAgIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGlmKHMuZXF1YWxzKCJXaW5kb3dzIE5UIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgICAgaXNXaW5kb3dzTlQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocy5lcXVhbHMoIldpbmRvd3MgOTUiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgICBpc1dpbmRvd3M5NSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZihzLmVxdWFscygiV2luZG93cyA5OCIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzV2luZG93czk4ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzLmVxdWFscygiTWFjaW50b3NoIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCSBzLmVxdWFscygibWFjb3MiKSB8fAkJLy9BcHBsZXQgVmlld2VyIC8vJE5PTi1OTFMtMSQKLQkJCQkgcy5lcXVhbHMoIk1hYyBPUyIpIHx8CQkvL05ldHNjYXBlIC8vJE5PTi1OTFMtMSQKLQkJCQkgcy5lcXVhbHMoIk1hY09TIikpCQkJLy9JbnRlcm5ldCBFeHBsb2RlciAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzTWFjaW50b3NoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgT1MoKQotICAgIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChpc1dpbmRvd3M5NSgpIHx8IGlzV2luZG93c05UKCkgfHwgaXNXaW5kb3dzOTgpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzV2luZG93czk1KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNXaW5kb3dzOTUpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzV2luZG93c05UKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNXaW5kb3dzTlQpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGlzTWFjaW50b3NoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaXNNYWNpbnRvc2gpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3BlY0tleVdvcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9TcGVjS2V5V29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQxZmVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9pbmRleC9TcGVjS2V5V29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcuc2VydmljZXMuaW5kZXg7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotLy9BIGtleXdvcmQgZGVmaW5lZCBpbiBhIHNlcGFyYXRlIGZpbGUKLS8vVGhpcyBrZXl3b3JkIHJlZmZlcnMgdG8gYSBrZXl3b3JkIGRlZmluZWQgaW4gYSBodG1sIGZpbGUKLWNsYXNzIFNwZWNLZXlXb3JkCi17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVsYXRlZEtleVdvcmQ9bnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2VlPXRydWU7Ci0KLSAgICBTcGVjS2V5V29yZChTdHJpbmcgcmVsYXRlZEtleVdvcmQsIGJvb2xlYW4gbW9kZSkKLSAgICB7Ci0gICAgICAgIGlmKHJlbGF0ZWRLZXlXb3JkPT1udWxsKQotICAgICAgICB7Ci0gICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiU3BlY0tleVdvcmQ6U3BlY0tleVdvcmRcbiIgKyBIZWxwTWVzc2FnZXMuSU5QVVRfUEFSQU1FVEVSX05VTEwpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICB0aGlzLnJlbGF0ZWRLZXlXb3JkID0gcmVsYXRlZEtleVdvcmQ7Ci0gICAgICAgdGhpcy5zZWUgPSBtb2RlOwotICAgIH0KLQotICAgIC8vUHJpbnRzIHRoZSBrZXl3b3JkCi0gICAgdm9pZCBwcmludChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0UCkKLSAgICB7Ci0gICAgICBpZihvdXRQPT1udWxsKQotICAgICAgewotICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTcGVjS2V5V29yZDpwcmludFxuIiArIEhlbHBNZXNzYWdlcy5CQURfT1VUUFVUX1NUUkVBTSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmKHJlbGF0ZWRLZXlXb3JkIT1udWxsKQotICAgICAgewotICAgICAgIGlmKHNlZSkKLSAgICAgICB7Ci0gICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsIEtleVdvcmRJbmRleEhlbHBlci5kZWZPYmouZ2V0U2VlKCkpOwotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgTWlzY1N0YXRpYy5wcmludChvdXRQLCBLZXlXb3JkSW5kZXhIZWxwZXIuZGVmT2JqLmdldFNlZUFsc28oKSk7Ci0gICAgICAgfQotICAgICAgICBNaXNjU3RhdGljLnByaW50KG91dFAsICI8QSBIUkVGPVwiIyIgKyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgcmVsYXRlZEtleVdvcmQgKyAiXCI+IiArIHJlbGF0ZWRLZXlXb3JkICsgIjwvQT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIGlzU2VlKCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIHNlZTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L1N0cmluZ0RlZmluaXRpb25zLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3RyaW5nRGVmaW5pdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZjNmQ4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvU3RyaW5nRGVmaW5pdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLmluZGV4OwotCi0vKipDbGFzc2VzIHVzZWQgZm9yIGFsbCBzdHJpbmcgbWVzc2FnZXMgdGhhdCBtYXkgbmVlZCB0byBiZSBsb2NhbGl6ZWQKLSAqLwotY2xhc3MgU3RyaW5nRGVmaW5pdGlvbnMKLXsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9ERUZJTklUSU9OX0ZJTEVfTk9UX0ZPVU5EID0gIlRoZSBjb25maWd1cmF0aW9uL2RlZmluaXRpb24gZmlsZXMgaGFzIG5vdCBiZWVuIGRlZmluZWQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL2luZGV4L3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NzFkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvaW5kZXgvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyB0aGUgaW5kZXggYW5kIGdsb3NzYXJ5IHBhZ2VzIGluIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWM2ZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGFuZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHB1Ymxpc2hpbmcgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL1N0b3BXb3JkUmVhZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvc2VydmljZXMvc2VhcmNoL1N0b3BXb3JkUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNjRjNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9TdG9wV29yZFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnNlcnZpY2VzLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGluIGEgY29uZmlndXJhdGlvbiBmaWxlIG9mIHN0b3Agd29yZHMKLSAqIGFuZCBwcm92aWRlcyB0aGUgc3RvcCB3b3JkcyBhcyBhIGxpc3QuIDxicj4KLSAqLwotY2xhc3MgU3RvcFdvcmRSZWFkZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgX3N0b3B3b3JkcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgU3RvcFdvcmRSZWFkZXIoKQotCXsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgc2V0IG9mIHN0b3B3b3JkcyBmcm9tIHRoZSBnaXZlbiBmaWxlLgotCSAqLwotCXN0YXRpYyBTdHJpbmdbXSBnZXRTdG9wd29yZHMoIFN0cmluZyBmaWxlcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lICkKLQl7Ci0JCWlmKCBudWxsID09IF9zdG9wd29yZHMgKQotCQl7Ci0JCQlfc3RvcHdvcmRzID0gbmV3IFZlY3RvcigpOwotCi0JICAgIAl0cnkKLSAJICAgCQl7Ci0JCQkJLy8gcmVhZCBpbiB0aGUgZmlsZQotCQkJCVN0cmluZyBmdWxsRmlsZW5hbWUgPSBmaWxlcGF0aCArCi0JCQkJCQkJCQkgIEZpbGUuc2VwYXJhdG9yICsKLQkJIAkJCQkJCQkgIGZpbGVuYW1lOwotCQkgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZ1bGxGaWxlbmFtZSApOwotCQkJCUlucHV0U3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggaW5TdHJlYW0gKTsKLQkJCQlCdWZmZXJlZFJlYWRlciByZWFkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHN0cmVhbVJlYWRlcik7Ci0vKgkgIAkgICAgCWNoYXJbXSBjaGFyUmVhZCA9IG5ldyBjaGFyWyBpblN0cmVhbS5hdmFpbGFibGUoKSBdOwotCSAgICAgICAgCXN0cmVhbVJlYWRlci5yZWFkKCBjaGFyUmVhZCApOwotCSAgICAgICAgCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyggY2hhclJlYWQgKTsKLSovCi0KLQkJCQlTdHJpbmcgd29yZCA9IHJlYWQucmVhZExpbmUoKTsKLQkJCQl3aGlsZSAod29yZCAhPSBudWxsKQotCQkJCXsKLQkJCQkJX3N0b3B3b3Jkcy5hZGQod29yZCk7Ci0JCQkJCXdvcmQgPSByZWFkLnJlYWRMaW5lKCk7Ci0JCQkJfQotCi0JICAgICAgICAJLy8gY2xvc2Ugc3RyZWFtCi0JICAgICAgICAJcmVhZC5jbG9zZSgpOwotCSAgICAgICAgCXN0cmVhbVJlYWRlci5jbG9zZSgpOwotCSAgICAgICAgCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkgICAgICAgIAkvLyBwYXJzZUNvbnRlbnQKLS8vCSAgICAgICAgCXBhcnNlQ29udGVudCggY29udGVudCwgX3N0b3B3b3JkcyApOwotCQkJfQotCQkJY2F0Y2goIEV4Y2VwdGlvbiBlICkKLQkJCXsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJT2JqZWN0W10gc3RvcE9iamVjdHMgPSBfc3RvcHdvcmRzLnRvQXJyYXkoKTsKLQkJU3RyaW5nW10gc3RvcFN0cmluZ3MgPSBuZXcgU3RyaW5nWyBzdG9wT2JqZWN0cy5sZW5ndGggXTsKLQkJZm9yKCBpbnQgaSA9IDA7IGkgPCBzdG9wT2JqZWN0cy5sZW5ndGg7IGkrKyApCi0JCXsKLQkJCXN0b3BTdHJpbmdzWyBpIF0gPSAoU3RyaW5nKXN0b3BPYmplY3RzWyBpIF07Ci0JCX0KLQkJcmV0dXJuKCBzdG9wU3RyaW5ncyApOwotCi0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBjb250ZW50IGludG8gc3RvcHdvcmRzLgotCSAqLwotLyoKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhcnNlQ29udGVudCggU3RyaW5nIGNvbnRlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBfc3RvcHdvcmRzICkKLQl7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCBjb250ZW50LAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiICkgKTsKLQkJd2hpbGUoIHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSApCi0JCXsKLQkJCV9zdG9wd29yZHMuYWRkRWxlbWVudCggdG9rZW5pemVyLm5leHRFbGVtZW50KCkgKTsKLQkJfQotCX0KLSovCi19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy9zZXJ2aWNlcy9zZWFyY2gvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmI2NzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3NlcnZpY2VzL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBpbmRleGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9QdWJsaXNoaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMwMzU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL1B1Ymxpc2hpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi54bWwuWFNMVFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLnNlcnZpY2VzLkRpYWdyYW1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmxheW91dC51dGlsLlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubGF5b3V0LnV0aWwuWG1sSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuUmVzb3VyY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnBlcnNpc3RlbmNlLnV0aWwuUGVyc2lzdGVuY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzOwotCi0vKioKLSAqIEhlbHBlciB1dGlsaXRpZXMgZm9yIHB1Ymxpc2hpbmcuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFB1Ymxpc2hpbmdVdGlsIHsKLQotCS8qKgotCSAqIFppcHMgdGhlIGNvbnRlbnQgb2YgYSBkaXJlY3RvcnkgaW50byBhIEpBUiBmaWxlLgotCSAqIDxwPgotCSAqIE5vbi1zdWItZm9sZGVycyBhcmUgaW5jbHVkZWQuCi0JICogCi0JICogQHBhcmFtIGphckRpcgotCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSB0byBiZSB6aXBwZWQKLQkgKiBAcGFyYW0gamFyRmlsZQotCSAqICAgICAgICAgICAgdGhlIG91dHB1dCBKQVIgZmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgY3JlYXRpbmcgdGhlIEpBUiBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGphckZpbGVzKEZpbGUgamFyRGlyLCBGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGVbXSBmaWxlcyA9IGphckRpci5saXN0RmlsZXMoKTsKLQkJaWYgKGphckZpbGUuZXhpc3RzKCkpIHsKLQkJCWphckZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gYlN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKLQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShqYXJGaWxlKSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBwZXJTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKGJTdHJlYW0pOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzQwOTZdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGN1cnJlbnRGaWxlID0gZmlsZXNbaV07Ci0JCQlpZiAoY3VycmVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJWmlwRW50cnkgY3VyckVudHJ5ID0gbmV3IFppcEVudHJ5KGN1cnJlbnRGaWxlLmdldE5hbWUoKSk7Ci0JCQl6aXBwZXJTdHJlYW0ucHV0TmV4dEVudHJ5KGN1cnJFbnRyeSk7Ci0JCQlCdWZmZXJlZElucHV0U3RyZWFtIGJpU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oY3VycmVudEZpbGUpKTsKLQkJCXdoaWxlIChiaVN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQlpbnQgbnVtID0gYmlTdHJlYW0ucmVhZChieXRlcyk7Ci0JCQkJemlwcGVyU3RyZWFtLndyaXRlKGJ5dGVzLCAwLCBudW0pOwotCQkJfQotCQkJYmlTdHJlYW0uY2xvc2UoKTsKLQkJCXppcHBlclN0cmVhbS5jbG9zZUVudHJ5KCk7Ci0JCX0KLQkJemlwcGVyU3RyZWFtLmNsb3NlKCk7Ci0JCWJTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgY29udGVudCBmb3IgYSBnaXZlbiBYTUwgZWxlbWVudCBhbmQgWFNMIGZpbGUgcGF0aAotCSAqIAotCSAqIEBwYXJhbSB4bWxFbGVtZW50Ci0JICogICAgICAgICAgICBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgWE1MIHJlcHJlc2VudGF0aW9uIGZvciBhIG1ldG9kCi0JICogICAgICAgICAgICBlbGVtZW50Ci0JICogQHBhcmFtIHhzbFBhdGgKLQkgKiAgICAgICAgICAgIHBhdGggdG8gYSBYU0wgZmlsZQotCSAqIEByZXR1cm4gdGhlIG91dHB1dCBIVE1MCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SHRtbChYbWxFbGVtZW50IHhtbEVsZW1lbnQsIFN0cmluZyB4c2xQYXRoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBzZXQgdGhlIGxhbmd1YWdlIGF0dHJpYnV0ZQotCQkJTG9jYWxlIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQlTdHJpbmcgbGFuZyA9IGxvY2FsZS5nZXRMYW5ndWFnZSgpOwotCQkJeG1sRWxlbWVudC5zZXRBdHRyaWJ1dGUoImxhbmciLCBsYW5nKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlVUkwgdXJsID0gbmV3IFVSTChQdWJsaXNoaW5nUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbnN0YWxsVVJMKCksCi0JCQkJCXhzbFBhdGgpOwotCQkJaWYgKHVybCA9PSBudWxsKSB7Ci0JCQkJUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoCi0JCQkJCQkiVW5hYmxlIHRvIGFjY2VzcyBYU0wgdGVtcGxhdGUgIiArIHhzbFBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyB4c2xVUkkgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCkuZ2V0UGF0aCgpOwotCi0JCQlTdHJpbmdCdWZmZXIgeG1sID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJeG1sLmFwcGVuZChYbWxIZWxwZXIuWE1MX0hFQURFUikuYXBwZW5kKHhtbEVsZW1lbnQudG9YbWwoKSk7Ci0KLQkJCVByb3BlcnRpZXMgeHNsUGFyYW1zID0gUHVibGlzaGluZ1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJvcGVydGllcygKLQkJCQkJIi94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBnZW5lcmF0ZSB0aGUgSFRNTAotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oeHNsVVJJLCB4bWwudG9TdHJpbmcoKSwgeHNsUGFyYW1zLCBzdyk7Ci0JCQlzdy5mbHVzaCgpOwotCi0JCQkvLyB1cmxzIGFyZSBlbmNvZGVkIGluIFhTTFQgb3V0cHV0LCBkZWNvZGUgaXQKLQkJCXJldHVybiBSZXNvdXJjZUhlbHBlcgotCQkJCQkuZGVjb2RlVXJsc0luQ29udGVudChzdy5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVB1Ymxpc2hpbmdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKAotCQkJCQkiVW5hYmxlIHRvIGdlbmVyYXRlIEhUTUwiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGEgdmlldyB0aGF0IHJlZmVyZW5jZXMgYSBwcm9jZXNzLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWcKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcHJvY2VzcwotCSAqICAgICAgICAgICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcwotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udGFpbnMgYSB2aWV3IHRoYXQKLQkgKiAgICAgICAgIHJlZmVyZW5jZXMgYSBwcm9jZXNzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1ZhbGlkUHJvY2Vzc1ZpZXcoTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCQlQcm9jZXNzIHByb2Nlc3MpIHsKLQkJZm9yIChJdGVyYXRvcjxDb250ZW50Q2F0ZWdvcnk+IHZpZXdzID0gY29uZmlnLmdldFByb2Nlc3NWaWV3cygpCi0JCQkJLml0ZXJhdG9yKCk7IHZpZXdzLmhhc05leHQoKTspIHsKLQkJCUNvbnRlbnRDYXRlZ29yeSB2aWV3ID0gdmlld3MubmV4dCgpOwotCQkJaWYgKHZpZXcgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KSB2aWV3OwotCQkJCWZvciAoSXRlcmF0b3I8RGVzY3JpYmFibGVFbGVtZW50PiBpdCA9IGNjCi0JCQkJCQkuZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50IGVsZW1lbnQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJCQkJaWYgKCgoUHJvY2VzcykgZWxlbWVudCkuZ2V0R3VpZCgpID09IHByb2Nlc3MuZ2V0R3VpZCgpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmxvYWRSZXNvdXJjZXMoQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCQotCQkvL1J1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7Ci0JCS8vbG9uZyBtMSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmZyZWVNZW1vcnkoKS8xMDAwMDAwOwotCQlQZXJzaXN0ZW5jZVV0aWwudW5sb2FkKHJlc291cmNlcyk7Ci0JCS8vUnVudGltZS5nZXRSdW50aW1lKCkuZ2MoKTsJCQotCQkvL2xvbmcgbTIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCkvMTAwMDAwMDsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgTG9uZy50b1N0cmluZyhtMi1tMSkgKyAiIE1CIGZyZWVkIGJ5IHVubG9hZGluZyByZXNvdXJjZXMiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzcG9zZURpYWdyYW1NYW5hZ2VycyhDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBtZ3JzLCBDb2xsZWN0aW9uPERpYWdyYW1NYW5hZ2VyPiBrZWVwbGlzdCkgewotCQlmb3IgKCBJdGVyYXRvcjxEaWFncmFtTWFuYWdlcj4gaXQgPSBtZ3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlEaWFncmFtTWFuYWdlciBtZ3IgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIGtlZXBsaXN0ID09IG51bGwgfHwgIWtlZXBsaXN0LmNvbnRhaW5zKG1ncikgKSB7Ci0JCQkJbWdyLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cENsaWVudFRpbWVvdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cENsaWVudFRpbWVvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNDM2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBDbGllbnRUaW1lb3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgc3VuLm5ldC53d3cuaHR0cC5IdHRwQ2xpZW50OwotLy9pbXBvcnQgc3VuLm5ldC4qOwotLy9pbXBvcnQgc3VuLm5ldC53d3cuKjsKLWNsYXNzIEh0dHBDbGllbnRUaW1lb3V0IGV4dGVuZHMgSHR0cENsaWVudAotewotCXByaXZhdGUgaW50IHRpbWVvdXQgPSAwIDsKLQotICAgIEh0dHBDbGllbnRUaW1lb3V0KFVSTCB1cmwsIFN0cmluZyBwcm94eSwgaW50IHByb3h5UG9ydCwgaW50IHRpbWVvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJc3VwZXIodXJsLCBwcm94eSwgcHJveHlQb3J0KTsKLQkJX3NldFRpbWVvdXQodGltZW91dCk7Ci0KLQl9Ci0KLSAgICBIdHRwQ2xpZW50VGltZW91dChVUkwgdXJsLCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlzdXBlcih1cmwsIChTdHJpbmcpbnVsbCwgLTEpOwotCQlzZXRUaW1lb3V0KHRpbWVvdXQpOwotICAgIH0KLQotCXByaXZhdGUgdm9pZCBfc2V0VGltZW91dChpbnQgaSkKLSAgICAJdGhyb3dzIFNvY2tldEV4Y2VwdGlvbgotCXsKLSAgICAJdGhpcy50aW1lb3V0ID0gaTsKLSAgICAJc2VydmVyU29ja2V0LnNldFNvVGltZW91dChpKSA7Ci0gCX0KLQotICAgIC8qIFRoaXMgY2xhc3MgaGFzIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgSFRUUC4gIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KLSAgICAgKiBnZXQgYW4gSHR0cENsaWVudCB0byB0aGUgc3BlY2lmZWQgVVJMLiAgSWYgdGhlcmUncyBjdXJyZW50bHkgYW4KLSAgICAgKiBhY3RpdmUgSHR0cENsaWVudCB0byB0aGF0IHNlcnZlci9wb3J0LCB5b3UnbGwgZ2V0IHRoYXQgb25lLgotCSAqCi0JICogbm8gbG9uZ2VyIHN5bmNyaG9uaXplZCAtLSBpdCBzbG93cyB0aGluZ3MgZG93biB0b28gbXVjaAotCSAqIHN5bmNocm9uaXplIGF0IGEgaGlnaGVyIGxldmVsCi0gICAgICovCi0gICAgc3RhdGljIEh0dHBDbGllbnRUaW1lb3V0IEdldE5ldyhVUkwgdXJsLCBpbnQgdGltZW91dCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvKiBzZWUgaWYgb25lJ3MgYWxyZWFkeSBhcm91bmQgKi8KLQkJSHR0cENsaWVudFRpbWVvdXQgcmV0ID0gKEh0dHBDbGllbnRUaW1lb3V0KSBrYWMuZ2V0KHVybCk7Ci0JCWlmIChyZXQgPT0gbnVsbCkgewotCSAgICAJcmV0ID0gbmV3IEh0dHBDbGllbnRUaW1lb3V0ICh1cmwsIHRpbWVvdXQpOyAgLy8gQ1RPUiBjYWxsZWQgb3BlblNlcnZlcigpCi0JCX0gZWxzZSB7Ci0JICAgIAlyZXQudXJsID0gdXJsOwotCQl9Ci0JCS8vIGRvbid0IGtub3cgaWYgd2UncmUga2VlcGluZyBhbGl2ZSB1bnRpbCB3ZSBwYXJzZSB0aGUgaGVhZGVycwotCQkvLyBmb3Igbm93LCBrZWVwaW5nQWxpdmUgaXMgZmFsc2UKLQkJcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuU2VydmVyKFN0cmluZyBzLCBpbnQgaSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBkb0Nvbm5lY3QocywgaSk7Ci0gICAgICAgIHNlcnZlck91dHB1dCA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc2VydmVyU29ja2V0LmdldE91dHB1dFN0cmVhbSgpKSk7Ci0gICAgICAgIHNlcnZlclNvY2tldC5zZXRUY3BOb0RlbGF5KHRydWUpOwotICAgICAgICBzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KHRpbWVvdXQpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTNmMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51dGlsLmh0dHA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAwOS8yMS8yMDAxCi0gKi8KLXB1YmxpYyBjbGFzcyBIdHRwUmVzcG9uc2UgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DT09LSUVfTkFNRSA9ICJTTVNFU1NJT04iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgY2xhc3MgQ29va2llIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCXByaXZhdGUgU3RyaW5nIGRvbWFpbjsKLQkJcHJpdmF0ZSBTdHJpbmcgcGF0aDsKLQotCQlDb29raWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJfQotCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0KLQkJU3RyaW5nIGdldERvbWFpbigpIHsKLQkJCXJldHVybiBkb21haW47Ci0JCX0KLQotCQl2b2lkIHNldERvbWFpbihTdHJpbmcgZG9tYWluKSB7Ci0JCQl0aGlzLmRvbWFpbiA9IGRvbWFpbjsKLQkJfQotCi0JCVN0cmluZyBnZXRQYXRoKCkgewotCQkJcmV0dXJuIHBhdGg7Ci0JCX0KLQotCQl2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJCXRoaXMucGF0aCA9IHBhdGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCSAgICAJdHJ5IHsKLQkgICAgICAgIAlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkgICAgCX0KLQkgICAgCWNhdGNoKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkgICAgICAgIAlyZXR1cm4gbnVsbDsKLQkgICAgCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIihuYW1lPSIrbmFtZSsiLCB2YWx1ZT0iK3ZhbHVlKyIsIGRvbWFpbj0iK2RvbWFpbisiLCBwYXRoPSIrcGF0aCsiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci0JfQotCQlwcml2YXRlIGludCBzdGF0dXM7Ci0JCXByaXZhdGUgUHJvcGVydGllcyBoZWFkZXJzOwotCQlwcml2YXRlIFZlY3RvciBjb29raWVzOwotCi0JCXByaXZhdGUgU3RyaW5nIGRhdGE7Ci0KLQkJSHR0cFJlc3BvbnNlKGludCBzdGF0dXMsIFByb3BlcnRpZXMgaGVhZGVycywgVmVjdG9yIGNvb2tpZXMsIFN0cmluZyBkYXRhKSB7Ci0JCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJCXRoaXMuaGVhZGVycyA9IGhlYWRlcnM7Ci0JCQl0aGlzLmNvb2tpZXMgPSBjb29raWVzOwotCQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJfQotCi0JCWludCBnZXRTdGF0dXMoKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJUHJvcGVydGllcyBnZXRIZWFkZXJzKCkgewotCQkJcmV0dXJuIGhlYWRlcnM7Ci0JCX0KLQotCQlWZWN0b3IgZ2V0Q29va2llcygpIHsKLQkJCXJldHVybiBjb29raWVzOwotCQl9Ci0KLQkJU3RyaW5nIGdldERhdGEoKSB7Ci0JCQlyZXR1cm4gZGF0YTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKHN0YXR1cz0iK3N0YXR1cysiLCBoZWFkZXJzPSIraGVhZGVycysiLCBjb29raWVzPSIrY29va2llcysiLCBkYXRhPSIrZGF0YSsiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyNDA5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBUaW1lb3V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotaW1wb3J0IGphdmEubmV0LlVSTFN0cmVhbUhhbmRsZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlckZhY3Rvcnk7Ci0KLWNsYXNzIEh0dHBUaW1lb3V0RmFjdG9yeSBpbXBsZW1lbnRzIFVSTFN0cmVhbUhhbmRsZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBpbnQgdGltZW91dDsKLQlIdHRwVGltZW91dEZhY3RvcnkoaW50IHRpbWVvdXQpIHsgdGhpcy50aW1lb3V0ID0gdGltZW91dDsgfQotCXB1YmxpYyBVUkxTdHJlYW1IYW5kbGVyIGNyZWF0ZVVSTFN0cmVhbUhhbmRsZXIoU3RyaW5nIHN0cikKLQl7Ci0JCUh0dHBUaW1lb3V0SGFuZGxlciBoYW5kbGVyID0gbmV3IEh0dHBUaW1lb3V0SGFuZGxlcigpOwotCQloYW5kbGVyLnNldFRpbWVvdXQodGltZW91dCk7Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvSHR0cFRpbWVvdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTNhMWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVGltZW91dEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1jbGFzcyBIdHRwVGltZW91dEhhbmRsZXIgZXh0ZW5kcyBzdW4ubmV0Lnd3dy5wcm90b2NvbC5odHRwLkhhbmRsZXIgaW1wbGVtZW50cyBUaW1lb3V0SGFuZGxlcgotewotCXByaXZhdGUgaW50IHRpbWVvdXQgPSAwOwotCi0JSHR0cFRpbWVvdXRIYW5kbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUh0dHBUaW1lb3V0SGFuZGxlcihpbnQgdGltZW91dCkgewotCQl0aGlzKCk7Ci0JCXRoaXMudGltZW91dCA9IHRpbWVvdXQ7Ci0JfQotCi0gICAgcHJvdGVjdGVkIGphdmEubmV0LlVSTENvbm5lY3Rpb24gb3BlbkNvbm5lY3Rpb24oVVJMIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0KHUsIHRoaXMsIHRpbWVvdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKLSAgICAJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0UHJveHkoKSB7IHJldHVybiBwcm94eTsgfQkJLy8gYnJlYWtpbmcgZW5jYXBzdWxhdGlvbgotICAgIGludCBnZXRQcm94eVBvcnQoKSB7IHJldHVybiBwcm94eVBvcnQ7IH0gICAgLy8gYnJlYWtpbmcgZW5jYXBzdWxhdGlvbgotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVVJMQ29ubmVjdGlvblRpbWVvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4NjYxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVUkxDb25uZWN0aW9uVGltZW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IHN1bi5uZXQud3d3Lmh0dHAuSHR0cENsaWVudDsKLQotY2xhc3MgSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0IGV4dGVuZHMgc3VuLm5ldC53d3cucHJvdG9jb2wuaHR0cC5IdHRwVVJMQ29ubmVjdGlvbgotewotCXByaXZhdGUgaW50IHRpbWVvdXQ7Ci0JcHJpdmF0ZSBIdHRwVGltZW91dEhhbmRsZXIgdGltZW91dEhhbmRsZXI7Ci0KLSAgCUh0dHBVUkxDb25uZWN0aW9uVGltZW91dChVUkwgdSwgSHR0cFRpbWVvdXRIYW5kbGVyIGhhbmRsZXIsIGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0gICAgCXN1cGVyKHUsIGhhbmRsZXIpOwotCQl0aGlzLnRpbWVvdXQgPSB0aW1lb3V0OwotCQl0aW1lb3V0SGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JSHR0cFVSTENvbm5lY3Rpb25UaW1lb3V0KFVSTCB1LCAgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBpbnQgdGltZW91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotICAgIAlzdXBlcih1LCBob3N0LCBwb3J0KTsKLSAgICAJdGhpcy50aW1lb3V0ID0gdGltZW91dDsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGNvbm5lY3RlZCkgewotCSAgICAJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JICAgIAlpZiAoImh0dHAiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkgLyogJiYgIWZhaWxlZE9uY2UgPC0gUFJJVkFURSAqLyApIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGZvciBzYWZldHkncyBzYWtlLCBhcyByZXBvcnRlZCBieSBLTEdyb3VwCi0JCQkJc3luY2hyb25pemVkICh1cmwpIHsKLQkJCQkJaHR0cCA9IEh0dHBDbGllbnRUaW1lb3V0LkdldE5ldyh1cmwsIHRpbWVvdXQpOwotCQkJCX0KLQkgICAgCX0KLQkgICAgCWVsc2UgewotCQkJCS8vIG1ha2Ugc3VyZSB0byBjb25zdHJ1Y3QgbmV3IGNvbm5lY3Rpb24gaWYgZmlyc3QKLQkJCQkvLyBhdHRlbXB0IGZhaWxlZAotCQkJCWh0dHAgPSBuZXcgSHR0cENsaWVudFRpbWVvdXQodXJsLCB0aW1lb3V0SGFuZGxlci5nZXRQcm94eSgpLCB0aW1lb3V0SGFuZGxlci5nZXRQcm94eVBvcnQoKSwgdGltZW91dCk7Ci0JICAgIAl9Ci0JICAgIAlwcyA9IChQcmludFN0cmVhbSlodHRwLmdldE91dHB1dFN0cmVhbSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JICAgIAl0aHJvdyBlOwotCQl9Ci0JCS8vIHRoaXMgd2FzIG1pc3NpbmcgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbgotCQljb25uZWN0ZWQgPSB0cnVlOwotCX0KLQotICAgIHByb3RlY3RlZCBIdHRwQ2xpZW50IGdldFByb3hpZWRDbGllbnQoVVJMIHVybCwgU3RyaW5nIHMsIGludCBpKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiAoSHR0cENsaWVudCluZXcgSHR0cENsaWVudFRpbWVvdXQodXJsLCBzLCBpLCB0aW1lb3V0KTsKLSAgICB9Ci0KLQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmV3IEh0dHBDbGllbnQgb2JqZWN0LCBieXBhc3NpbmcgdGhlIGNhY2hlIG9mCi0gICAgICogSFRUUCBjbGllbnQgb2JqZWN0cy9jb25uZWN0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1cmwJdGhlIFVSTCBiZWluZyBhY2Nlc3NlZAotICAgICAqLwotICAgIHByb3RlY3RlZCBIdHRwQ2xpZW50IGdldE5ld0NsaWVudChVUkwgdXJsKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiAoSHR0cENsaWVudCkobmV3IEh0dHBDbGllbnRUaW1lb3V0ICh1cmwsIChTdHJpbmcpbnVsbCwgLTEsIHRpbWVvdXQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL0h0dHBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzQ1NTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9IdHRwVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnV0aWwuaHR0cDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuQXV0aGVudGljYXRvcjsKLWltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5QYXNzd29yZEF1dGhlbnRpY2F0aW9uOwotaW1wb3J0IGphdmEubmV0LlByb3h5OwotaW1wb3J0IGphdmEubmV0LlNvY2tldDsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxTdHJlYW1IYW5kbGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLm5ldC5wcm94eS5JUHJveHlEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLlB1Ymxpc2hpbmdSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgMDkvMjEvMjAwMQotICovCi1wdWJsaWMgY2xhc3MgSHR0cFV0aWwgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkvKioKLQkgKiBEbyBhIEdFVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoU29ja2V0IHNvY2ssIFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJaW50IHJlc3BTdGF0dXM7Ci0JCVByb3BlcnRpZXMgcmVzcEhlYWRlcnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlWZWN0b3IgcmVzcENvb2tpZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCVN0cmluZyByZXNwID0gbnVsbDsKLQkJRGF0YU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQlEYXRhSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGhvc3QgPSBzb2NrLmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdE5hbWUoKTsKLQkJCWludCBwb3J0ID0gc29jay5nZXRQb3J0KCk7Ci0JCQlvdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShzb2NrLmdldE91dHB1dFN0cmVhbSgpKTsKLQkJCWluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrLmdldElucHV0U3RyZWFtKCkpKTsKLQkJCW91dC53cml0ZUJ5dGVzKCJHRVQgIiArIHVybCArICIgSFRUUC8xLjFcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlQnl0ZXMoIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvdXQud3JpdGVCeXRlcygiVXNlci1BZ2VudDogTW96aWxsYS80LjBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC53cml0ZUJ5dGVzKCJDb250ZW50LUxlbmd0aDogMFxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc2VuZCBhZGRpb25hbCBoZWFkZXJzIGlmIGFueQotCQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJCUVudW1lcmF0aW9uIG5hbWVzID0gaGVhZGVycy5rZXlzKCk7Ci0JCQkJd2hpbGUobmFtZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiSG9zdCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiVXNlci1BZ2VudCIpIHx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1MZW5ndGgiKSkgY29udGludWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCW91dC53cml0ZUJ5dGVzKG5hbWUgKyAiOiAiICsgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC5mbHVzaCgpOwotCQkJU3RyaW5nIGxpbmU7Ci0JCQlib29sZWFuIGVuZEZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgY29udGVudExlbiA9IC0xOwotCQkJZmluYWwgU3RyaW5nIGNvbnRlbnRMZW5IZWFkZXIgPSAiY29udGVudC1sZW5ndGg6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBjb250ZW50TGVuSGVhZGVyTGVuID0gY29udGVudExlbkhlYWRlci5sZW5ndGgoKTsKLQkJCVN0cmluZyBodHRwUmVzcCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIHJlYWQgdGhlIGZpcnN0IGxpbmUKLQkJCWxpbmUgPSBpbi5yZWFkTGluZSgpOwotCQkJLy9sb2dnZXIuZGVidWcoImxpbmU9IitsaW5lKTsKLQkJCWlmKGxpbmUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUHVibGlzaGluZ1Jlc291cmNlcy5zZXJ2ZXJFcnJvcl9tc2cpOyAKLQkJCX0KLQkJCWh0dHBSZXNwICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lKTsKLQkJCXRyeSB7Ci0JCQkJLy8gc2tpcCB0aGUgZmlyc3QgdG9rZW4gd2hpY2ggaXMgIkhUVFAvMS4xIiBvciAiSFRUUC8xLjAiCi0JCQkJdG9rZW5zLm5leHRUb2tlbigpOwotCQkJCXJlc3BTdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KHRva2Vucy5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2csIChuZXcgT2JqZWN0W117aG9zdCwgSW50ZWdlci50b1N0cmluZyhwb3J0KSwgbGluZX0pKSk7IAotCQkJfQotCi0JCQkvLyByZWFkIHRoZSBoZWFkZXJzCi0JCQl3aGlsZSgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkvL2xvZ2dlci5kZWJ1ZygibGluZT0iK2xpbmUpOwotCQkJCWh0dHBSZXNwICs9IGxpbmUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCQkJaWYobGluZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuZEZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWludCBpZCA9IGxpbmUuaW5kZXhPZigiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGlkID4gMCkgewotCQkJCQlTdHJpbmcgaGVhZGVyID0gbGluZS5zdWJzdHJpbmcoMCwgaWQpLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmKGxpbmUubGVuZ3RoKCkgPiBpZCArIDIpIHsKLQkJCQkJCXZhbHVlID0gbGluZS5zdWJzdHJpbmcoaWQgKyAyKTsKLQkJCQkJfQotCi0JCQkJCWlmKGhlYWRlci5lcXVhbHNJZ25vcmVDYXNlKCJzZXQtY29va2llIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQkJCXJlc3BDb29raWVzLmFkZEVsZW1lbnQoY29va2llKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQkJfQotCi0JCQkJCS8vcmVzcEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBjb250ZW50TGVuU3RyID0gcmVzcEhlYWRlcnMuZ2V0UHJvcGVydHkoImNvbnRlbnQtbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnRMZW5TdHIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRMZW4gPSAtMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRlbnRMZW4gPSBJbnRlZ2VyLnBhcnNlSW50KGNvbnRlbnRMZW5TdHIpOwotCQkJfQotCQkJaWYoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrK0JFR0lOIEhFQURFUlMrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihodHRwUmVzcCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKytFTkQgSEVBREVSUysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYoIWVuZEZvdW5kKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihOTFMuYmluZChQdWJsaXNoaW5nUmVzb3VyY2VzLmludmFsaWRIdHRwUmVzcG9uc2VFcnJvcl9tc2csIChuZXcgT2JqZWN0W117aG9zdCwgSW50ZWdlci50b1N0cmluZyhwb3J0KSwgaHR0cFJlc3B9KSkpOyAKLQkJCX0KLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50TGVuPSIrY29udGVudExlbik7Ci0JCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJCS8qCi0JCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCQlpbi5yZWFkRnVsbHkoYnVmZik7Ci0JCQkJcmVzcCA9IG5ldyBTdHJpbmcoYnVmZik7Ci0JCQkJKi8KLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbTWF0aC5taW4oMjA0OCwgY29udGVudExlbildOwotCQkJCWludCBudW07Ci0JCQkJd2hpbGUoKG51bSA9IGluLnJlYWQoYnVmZikpICE9IC0xKSB7Ci0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCQlpZihuIDw9IG51bSkgewotCQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG4pOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG51bSk7Ci0JCQkJfQotCQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJaW50IG51bTsKLQkJCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIm51bT0iK251bSk7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJCX0KLQkJCQlyZXNwID0gYm9zLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgeyBpbi5jbG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7ICB9Ci0JCQl0cnkgeyBvdXQuY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkgeyAgfQotCQl9Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0KLQkvKioKLQkgKiBEbyBhIEdFVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvR2V0KFN0cmluZyBob3N0LCBpbnQgcG9ydCwgU3RyaW5nIHVybCwgaW50IHRpbWVvdXQsIFByb3BlcnRpZXMgaGVhZGVycykgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJU29ja2V0IHNvY2sgPSBudWxsOwotCQl0cnkgewotCQkJc29jayA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQlzb2NrLnNldFNvVGltZW91dCh0aW1lb3V0KTsKLQkJCXJldHVybiBkb0dldChzb2NrLCB1cmwsIGhlYWRlcnMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdHJ5IHsgc29jay5jbG9zZSgpOyB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7fQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGhhbmRsZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIFVSTFN0cmVhbUhhbmRsZXIgZ2V0SGFuZGxlcihpbnQgdGltZW91dCkgewotCQlJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKHRpbWVvdXQpOwotCQlVUkxTdHJlYW1IYW5kbGVyIGhhbmRsZXIgPSAoVVJMU3RyZWFtSGFuZGxlciloYW5kbGVyTWFwLmdldChrZXkpOwotCQlpZihoYW5kbGVyID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZChoYW5kbGVyTWFwKSB7Ci0JCQkJaWYoKGhhbmRsZXIgPSAoVVJMU3RyZWFtSGFuZGxlciloYW5kbGVyTWFwLmdldChrZXkpKSA9PSBudWxsKSB7Ci0JCQkJCWhhbmRsZXIgPSBuZXcgSHR0cFRpbWVvdXRIYW5kbGVyKHRpbWVvdXQpOwotCQkJCQloYW5kbGVyTWFwLnB1dChrZXksIGhhbmRsZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIEdFVAotCSAqCi0JICogQHJldHVybiByZXNwb25zZQotCSAqIEBleGNlcHRpb24gPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvR2V0KFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycywgaW50IHRpbWVvdXQpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvR2V0KG5ldyBVUkwoKFVSTCkgbnVsbCwgdXJsLCBnZXRIYW5kbGVyKHRpbWVvdXQpKSwgaGVhZGVycyk7Ci0JfQotCQotCS8qKgotCSAqIERvIGEgR0VUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0JcHVibGljIHN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoU3RyaW5nIHVybCwgUHJvcGVydGllcyBoZWFkZXJzLAotCQkJaW50IHRpbWVvdXQsIElQcm94eURhdGEgcHJveHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZG9HZXQobmV3IFVSTCgoVVJMKSBudWxsLCB1cmwsIGdldEhhbmRsZXIodGltZW91dCkpLCBoZWFkZXJzLAotCQkJCXByb3h5KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3h5QXV0aGVudGljYXRvciBleHRlbmRzIEF1dGhlbnRpY2F0b3IgewotCQlwcml2YXRlIFN0cmluZyB1c2VybmFtZSwgcGFzc3dvcmQ7Ci0KLQkJcHVibGljIFByb3h5QXV0aGVudGljYXRvcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewotCQkJdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwotCQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBhc3N3b3JkQXV0aGVudGljYXRpb24gZ2V0UGFzc3dvcmRBdXRoZW50aWNhdGlvbigpIHsKLQkJCXJldHVybiBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvbih1c2VybmFtZSwgcGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRG8gYSBHRVQKLQkgKiAKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbgotCSAqICAgICAgICAgPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqLwotCXN0YXRpYyBIdHRwUmVzcG9uc2UgZG9HZXQoVVJMIHVybCwgUHJvcGVydGllcyBoZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRvR2V0KHVybCwgaGVhZGVycywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIERvIGEgR0VUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0KG9yIGEgcHJveHkpCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb0dldChVUkwgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIElQcm94eURhdGEgcHJveHkpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IG51bGw7Ci0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkgKiBGb3IgVXNpbmcgUHJveHkKLQkJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JCWlmIChwcm94eSAhPSBudWxsKSB7Ci0JCQlQcm94eS5UeXBlIHByb3h5VHlwZSA9IG51bGw7Ci0JCQlpZiAocHJveHkuZ2V0VHlwZSgpLmVxdWFscyhJUHJveHlEYXRhLkhUVFBfUFJPWFlfVFlQRSkpIHsKLQkJCQlwcm94eVR5cGUgPSBQcm94eS5UeXBlLkhUVFA7Ci0JCQl9IGVsc2UgaWYgKHByb3h5LmdldFR5cGUoKS5lcXVhbHMoSVByb3h5RGF0YS5IVFRQU19QUk9YWV9UWVBFKSkgewotCQkJCXByb3h5VHlwZSA9IFByb3h5LlR5cGUuSFRUUDsKLQkJCX0gZWxzZSBpZiAocHJveHkuZ2V0VHlwZSgpLmVxdWFscyhJUHJveHlEYXRhLlNPQ0tTX1BST1hZX1RZUEUpKSB7Ci0JCQkJcHJveHlUeXBlID0gUHJveHkuVHlwZS5TT0NLUzsKLQkJCX0KLQotCQkJUHJveHkgcHJveHlTZXJ2ZXIgPSBuZXcgUHJveHkocHJveHlUeXBlLCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoCi0JCQkJCXByb3h5LmdldEhvc3QoKSwgcHJveHkuZ2V0UG9ydCgpKSk7Ci0JCQlpZiAocHJveHkuaXNSZXF1aXJlc0F1dGhlbnRpY2F0aW9uKCkpIHsKLQkJCQlBdXRoZW50aWNhdG9yLnNldERlZmF1bHQobmV3IFByb3h5QXV0aGVudGljYXRvcihwcm94eQotCQkJCQkJLmdldFVzZXJJZCgpLCBwcm94eS5nZXRQYXNzd29yZCgpKSk7Ci0JCQl9IGVsc2UgewotCQkJCUF1dGhlbnRpY2F0b3Iuc2V0RGVmYXVsdChudWxsKTsKLQkJCX0KLQkJCWNvbm4gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbihwcm94eVNlcnZlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb25uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJfQotCQkKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKLQkJLy9jb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsgLy9KREsxLjMKLQkJY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsgLy8kTk9OLU5MUy0xJAotCQljb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0JCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJRW51bWVyYXRpb24gbmFtZXMgPSBoZWFkZXJzLmtleXMoKTsKLQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIb3N0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVc2VyLUFnZW50IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpKSBjb250aW51ZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShuYW1lLCBoZWFkZXJzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlpbnQgcmVzcFN0YXR1cyA9IGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCVN0cmluZyBuYW1lOwotCQlmb3IoaW50IGkgPSAxOyAobmFtZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGRLZXkoaSkpICE9IG51bGw7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gY29ubi5nZXRIZWFkZXJGaWVsZChuYW1lKTsKLQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlIdHRwUmVzcG9uc2UuQ29va2llIGNvb2tpZSA9IHBhcnNlQ29va2llKHZhbHVlKTsKLQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzcEhlYWRlcnMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWludCBjb250ZW50TGVuID0gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotCQlTdHJpbmcgcmVzcCA9IG51bGw7Ci0JCWlmKGNvbnRlbnRMZW4gPiAwKSB7Ci0JCQkvKgotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCWluLnJlYWRGdWxseShidWZmKTsKLQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJKi8KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW01hdGgubWluKDIwNDgsIGNvbnRlbnRMZW4pXTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCWlmKG4gPD0gbnVtKSB7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJaW50IG51bTsKLQkJCXdoaWxlKChudW0gPSBpbi5yZWFkKGJ1ZmYpKSAhPSAtMSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50ICA6IiArcmVzcCk7Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBQT1NUCi0JICoKLQkgKiBAcmV0dXJuIHJlc3BvbnNlCi0JICogQGV4Y2VwdGlvbiA8bGk+IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb24gY291bGQgbm90IGNvbm5lY3QgdG8gaG9zdDpwb3J0Ci0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSW50ZXJydXB0ZWRJT0V4Y2VwdGlvbiB0aW1lb3V0IGV4Y2VlZGVkCi0JICogICAgICAgICAgICA8bGk+IGphdmEuaW8uSU9FeGNlcHRpb24gSS9PIGVycm9yCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoU3RyaW5nIHVybCwgUHJvcGVydGllcyBoZWFkZXJzLCBQcm9wZXJ0aWVzIGRhdGEsIGludCB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZG9Qb3N0KG5ldyBVUkwoKFVSTCludWxsLCB1cmwsIGdldEhhbmRsZXIodGltZW91dCkpLCBoZWFkZXJzLCBkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBEbyBhIFBPU1QKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKi8KLQlzdGF0aWMgSHR0cFJlc3BvbnNlIGRvUG9zdChVUkwgdXJsLCBQcm9wZXJ0aWVzIGhlYWRlcnMsIFByb3BlcnRpZXMgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24uc2V0Rm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKLQkJSHR0cFVSTENvbm5lY3Rpb24gY29ubiA9IChIdHRwVVJMQ29ubmVjdGlvbil1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJLy9jb25uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsgLy9KREsxLjMKLQkJY29ubi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7IC8vJE5PTi1OTFMtMSQKLQkJY29ubi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQljb25uLnNldERvT3V0cHV0KHRydWUpOwotCQljb25uLnNldERvSW5wdXQodHJ1ZSk7Ci0JCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJaWYoaGVhZGVycyAhPSBudWxsICYmIGhlYWRlcnMuc2l6ZSgpID4gMCkgewotCQkJRW51bWVyYXRpb24gbmFtZXMgPSBoZWFkZXJzLmtleXMoKTsKLQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKW5hbWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJIb3N0IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJVc2VyLUFnZW50IikgfHwgbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LUxlbmd0aCIpKSBjb250aW51ZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQljb25uLnNldFJlcXVlc3RQcm9wZXJ0eShuYW1lLCBoZWFkZXJzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGNvbm4uZ2V0T3V0cHV0U3RyZWFtKCkpOwotCi0JCVN0cmluZyBjb250ZW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJRW51bWVyYXRpb24gZW51ID0gZGF0YS5wcm9wZXJ0eU5hbWVzKCk7Ci0JCXdoaWxlKGVudS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWVudS5uZXh0RWxlbWVudCgpOwotCQkJY29udGVudCArPSAobmFtZSArICI9IiArIFVSTEVuY29kZXIuZW5jb2RlKGRhdGEuZ2V0UHJvcGVydHkobmFtZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYoZW51Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJY29udGVudCArPSAiJiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZihjb250ZW50Lmxlbmd0aCgpID4gMCkgewotCQkJb3V0LndyaXRlQnl0ZXMoY29udGVudCk7Ci0JCX0KLQotCQlpbnQgcmVzcFN0YXR1cyA9IGNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7Ci0JCVN0cmluZyBuYW1lOwotCQlmb3IoaW50IGkgPSAxOyAobmFtZSA9IGNvbm4uZ2V0SGVhZGVyRmllbGRLZXkoaSkpICE9IG51bGw7IGkrKykgewotCQkJU3RyaW5nIHZhbHVlID0gY29ubi5nZXRIZWFkZXJGaWVsZChuYW1lKTsKLQkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgic2V0LWNvb2tpZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlIdHRwUmVzcG9uc2UuQ29va2llIGNvb2tpZSA9IHBhcnNlQ29va2llKHZhbHVlKTsKLQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQlyZXNwQ29va2llcy5hZGRFbGVtZW50KGNvb2tpZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzcEhlYWRlcnMucHV0KG5hbWUudG9Mb3dlckNhc2UoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCWludCBjb250ZW50TGVuID0gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjb25uLmdldElucHV0U3RyZWFtKCkpOwotCQlTdHJpbmcgcmVzcCA9IG51bGw7Ci0JCWlmKGNvbnRlbnRMZW4gPiAwKSB7Ci0JCQkvKgotCQkJYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtjb250ZW50TGVuXTsKLQkJCWluLnJlYWRGdWxseShidWZmKTsKLQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJKi8KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlW01hdGgubWluKDIwNDgsIGNvbnRlbnRMZW4pXTsKLQkJCWludCBudW07Ci0JCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibnVtPSIrbnVtKTsKLQkJCQlpbnQgbiA9IGNvbnRlbnRMZW4gLSBib3Muc2l6ZSgpOwotCQkJCWlmKG4gPD0gbnVtKSB7Ci0JCQkJCWJvcy53cml0ZShidWZmLCAwLCBuKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYoY29udGVudExlbiA8IDApIHsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlieXRlW10gYnVmZiA9IG5ldyBieXRlWzIwNDhdOwotCQkJaW50IG51bTsKLQkJCXdoaWxlKChudW0gPSBpbi5yZWFkKGJ1ZmYpKSAhPSAtMSkgewotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJudW09IitudW0pOwotCQkJCWJvcy53cml0ZShidWZmLCAwLCBudW0pOwotCQkJfQotCQkJcmVzcCA9IGJvcy50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHJlc3BTdGF0dXMsIHJlc3BIZWFkZXJzLCByZXNwQ29va2llcywgcmVzcCk7Ci0JfQotCi0JLyoqCi0JICogRG8gYSBQT1NUIHVzaW5nIGxvdyBsZXZlbCBzb2NrZXQgdG8gaGF2ZSBjb250cm9sIG92ZXIgdGltZW91dAotCSAqCi0JICogQHJldHVybiByZXNwb25zZQotCSAqIEBleGNlcHRpb24gPGxpPiBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uIGNvdWxkIG5vdCBjb25uZWN0IHRvIGhvc3Q6cG9ydAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLkludGVycnVwdGVkSU9FeGNlcHRpb24gdGltZW91dCBleGNlZWRlZAotCSAqICAgICAgICAgICAgPGxpPiBqYXZhLmlvLklPRXhjZXB0aW9uIEkvTyBlcnJvcgotCSAqICAgICAgICAgICAgPGxpPiBDYXRhSHR0cEV4Y2VwdGlvbiBpbnZhbGlkIHJlc3BvbnNlIGZyb20gc2VydmVyCi0JICovCi0Jc3RhdGljIEh0dHBSZXNwb25zZSBkb1Bvc3QoU29ja2V0IHNvY2ssIFN0cmluZyB1cmwsIFByb3BlcnRpZXMgaGVhZGVycywgUHJvcGVydGllcyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uCi0JewotCQlpbnQgcmVzcFN0YXR1czsKLQkJUHJvcGVydGllcyByZXNwSGVhZGVycyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCVZlY3RvciByZXNwQ29va2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJU3RyaW5nIHJlc3AgPSBudWxsOwotCQlEYXRhT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCURhdGFJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgaG9zdCA9IHNvY2suZ2V0SW5ldEFkZHJlc3MoKS5nZXRIb3N0TmFtZSgpOwotCQkJaW50IHBvcnQgPSBzb2NrLmdldFBvcnQoKTsKLQkJCW91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHNvY2suZ2V0T3V0cHV0U3RyZWFtKCkpOwotCQkJaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2suZ2V0SW5wdXRTdHJlYW0oKSkpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJRW51bWVyYXRpb24gZW51ID0gZGF0YS5wcm9wZXJ0eU5hbWVzKCk7Ci0JCQl3aGlsZShlbnUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpZW51Lm5leHRFbGVtZW50KCk7Ci0JCQkJY29udGVudCArPSAobmFtZSArICI9IiArIFVSTEVuY29kZXIuZW5jb2RlKGRhdGEuZ2V0UHJvcGVydHkobmFtZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGVudS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQljb250ZW50ICs9ICImIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCS8vbG9nZ2VyLmRlYnVnKCJwb3N0ZGF0YT0iK2NvbnRlbnQpOwotCQkJb3V0LndyaXRlQnl0ZXMoIlBPU1QgIiArIHVybCArICIgSFRUUC8xLjFcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3V0LndyaXRlQnl0ZXMoIkhvc3Q6ICIgKyBob3N0ICsgIjoiICsgcG9ydCArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlvdXQud3JpdGVCeXRlcygiVXNlci1BZ2VudDogTW96aWxsYS80LjBcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCS8vb3V0LndyaXRlQnl0ZXMoIkFjY2VwdDogdGV4dC9odG1sIik7Ci0JCQlvdXQud3JpdGVCeXRlcygiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCW91dC53cml0ZUJ5dGVzKCJDb250ZW50LUxlbmd0aDogIiArIGNvbnRlbnQubGVuZ3RoKCkgKyAiXHJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vIHNlbmQgYWRkaW9uYWwgaGVhZGVycyBpZiBhbnkKLQkJCWlmKGhlYWRlcnMgIT0gbnVsbCAmJiBoZWFkZXJzLnNpemUoKSA+IDApIHsKLQkJCQlFbnVtZXJhdGlvbiBuYW1lcyA9IGhlYWRlcnMua2V5cygpOwotCQkJCXdoaWxlKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZyluYW1lcy5uZXh0RWxlbWVudCgpOwotCQkJCQlpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkhvc3QiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlVzZXItQWdlbnQiKSB8fCBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkNvbnRlbnQtTGVuZ3RoIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXx8IG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1UeXBlIikpIGNvbnRpbnVlOyAvLyROT04tTkxTLTEkCi0JCQkJCW91dC53cml0ZUJ5dGVzKG5hbWUgKyAiOiAiICsgaGVhZGVycy5nZXRQcm9wZXJ0eShuYW1lKSArICJcclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCW91dC53cml0ZUJ5dGVzKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJb3V0LndyaXRlQnl0ZXMoY29udGVudCk7Ci0JCQl9Ci0JCQlvdXQuZmx1c2goKTsKLQkJCVN0cmluZyBsaW5lOwotCQkJYm9vbGVhbiBlbmRGb3VuZCA9IGZhbHNlOwotCQkJaW50IGNvbnRlbnRMZW4gPSAtMTsKLQkJCWZpbmFsIFN0cmluZyBjb250ZW50TGVuSGVhZGVyID0gImNvbnRlbnQtbGVuZ3RoOiAiOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgY29udGVudExlbkhlYWRlckxlbiA9IGNvbnRlbnRMZW5IZWFkZXIubGVuZ3RoKCk7Ci0JCQlTdHJpbmcgaHR0cFJlc3AgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyByZWFkIHRoZSBmaXJzdCBsaW5lCi0JCQlsaW5lID0gaW4ucmVhZExpbmUoKTsKLQkJCS8vbG9nZ2VyLmRlYnVnKCJsaW5lPSIrbGluZSk7Ci0JCQlpZihsaW5lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFB1Ymxpc2hpbmdSZXNvdXJjZXMuc2VydmVyRXJyb3JfbXNnKTsgCi0JCQl9Ci0JCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSk7Ci0JCQl0cnkgewotCQkJCS8vIHNraXAgdGhlIGZpcnN0IHRva2VuIHdoaWNoIGlzICJIVFRQLzEuMSIgb3IgIkhUVFAvMS4wIgotCQkJCXRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCQlyZXNwU3RhdHVzID0gSW50ZWdlci5wYXJzZUludCh0b2tlbnMubmV4dFRva2VuKCkpOwotCQkJfQotCQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGxpbmV9KSkpOyAKLQkJCX0KLQotCQkJLy8gcmVhZCB0aGUgaGVhZGVycwotCQkJd2hpbGUoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJLy9sb2dnZXIuZGVidWcoImxpbmU9IitsaW5lKTsKLQkJCQlodHRwUmVzcCArPSBsaW5lICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGxpbmUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmRGb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpbnQgaWQgPSBsaW5lLmluZGV4T2YoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZihpZCA+IDApIHsKLQkJCQkJU3RyaW5nIGhlYWRlciA9IGxpbmUuc3Vic3RyaW5nKDAsIGlkKS50b0xvd2VyQ2FzZSgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZihsaW5lLmxlbmd0aCgpID4gaWQgKyAyKSB7Ci0JCQkJCQl2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGlkICsgMik7Ci0JCQkJCX0KLQotCQkJCQlpZihoZWFkZXIuZXF1YWxzKCJzZXQtY29va2llIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBwYXJzZUNvb2tpZSh2YWx1ZSk7Ci0JCQkJCQlpZihjb29raWUgIT0gbnVsbCkgewotCQkJCQkJCXJlc3BDb29raWVzLmFkZEVsZW1lbnQoY29va2llKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJlc3BIZWFkZXJzLnB1dChoZWFkZXIsIHZhbHVlKTsKLQkJCQkJfQotCi0JCQkJCS8vcmVzcEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBjb250ZW50TGVuU3RyID0gcmVzcEhlYWRlcnMuZ2V0UHJvcGVydHkoImNvbnRlbnQtbGVuZ3RoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGNvbnRlbnRMZW5TdHIgPT0gbnVsbCkgewotCQkJCWNvbnRlbnRMZW4gPSAwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udGVudExlbiA9IEludGVnZXIucGFyc2VJbnQoY29udGVudExlblN0cik7Ci0JCQl9Ci0JCQlpZihERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrQkVHSU4gSEVBREVSUysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKGh0dHBSZXNwKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKysrK0VORCBIRUFERVJTKysrKyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZighZW5kRm91bmQgfHwgY29udGVudExlbiA9PSAtMSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTkxTLmJpbmQoUHVibGlzaGluZ1Jlc291cmNlcy5pbnZhbGlkSHR0cFJlc3BvbnNlRXJyb3JfbXNnLCAobmV3IE9iamVjdFtde2hvc3QsIEludGVnZXIudG9TdHJpbmcocG9ydCksIGh0dHBSZXNwfSkpKTsgCi0JCQl9Ci0JCQlpZihjb250ZW50TGVuID4gMCkgewotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbY29udGVudExlbl07Ci0JCQkJaW4ucmVhZEZ1bGx5KGJ1ZmYpOwotCQkJCXJlc3AgPSBuZXcgU3RyaW5nKGJ1ZmYpOwotCQkJfQotCQkJZWxzZSBpZihjb250ZW50TGVuU3RyID09IG51bGwpIHsKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJaW50IG51bTsKLQkJCQl3aGlsZSgobnVtID0gaW4ucmVhZChidWZmKSkgIT0gLTEpIHsKLQkJCQkJYm9zLndyaXRlKGJ1ZmYsIDAsIG51bSk7Ci0JCQkJfQotCQkJCXJlc3AgPSBib3MudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7IGluLmNsb3NlKCk7IH0gY2F0Y2goRXhjZXB0aW9uIGUpIHt9Ci0JCQl0cnkgeyBvdXQuY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJfQotCQlyZXR1cm4gbmV3IEh0dHBSZXNwb25zZShyZXNwU3RhdHVzLCByZXNwSGVhZGVycywgcmVzcENvb2tpZXMsIHJlc3ApOwotCX0KLQotCS8qKgotCSAqIERvIGEgUE9TVCB1c2luZyBsb3cgbGV2ZWwgc29ja2V0IHRvIGhhdmUgY29udHJvbCBvdmVyIHRpbWVvdXQKLQkgKgotCSAqIEByZXR1cm4gcmVzcG9uc2UKLQkgKiBAZXhjZXB0aW9uIDxsaT4gamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbiBjb3VsZCBub3QgY29ubmVjdCB0byBob3N0OnBvcnQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIHRpbWVvdXQgZXhjZWVkZWQKLQkgKiAgICAgICAgICAgIDxsaT4gamF2YS5pby5JT0V4Y2VwdGlvbiBJL08gZXJyb3IKLQkgKiAgICAgICAgICAgIDxsaT4gQ2F0YUh0dHBFeGNlcHRpb24gaW52YWxpZCByZXNwb25zZSBmcm9tIHNlcnZlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlIGRvUG9zdChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB1cmwsIGludCB0aW1lb3V0LAotCQlQcm9wZXJ0aWVzIGhlYWRlcnMsIFByb3BlcnRpZXMgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbgotCXsKLQkJU29ja2V0IHNvY2sgPSBudWxsOwotCQl0cnkgewotCQkJc29jayA9IG5ldyBTb2NrZXQoaG9zdCwgcG9ydCk7Ci0JCQlzb2NrLnNldFNvVGltZW91dCh0aW1lb3V0KTsKLQkJCXJldHVybiBkb1Bvc3Qoc29jaywgdXJsLCBoZWFkZXJzLCBkYXRhKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7IHNvY2suY2xvc2UoKTsgfSBjYXRjaChFeGNlcHRpb24gZSkge30KLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyBhIHF1ZXJ5IHN0cmluZyBhbmQgVVJMLWRlY29kZXMgdGhlIHBhcmFtZXRlciB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcCBwYXJzZVF1ZXJ5U3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHIsICImIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWludCBtYXhJZCA9IHN0ci5sZW5ndGgoKSAtIDE7Ci0JCXdoaWxlKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLQkJCWludCBpZCA9IHRva2VuLmluZGV4T2YoJz0nKTsKLQkJCWlmKGlkID09IC0xKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIGlmKGlkID09IDAgfHwgaWQgPT0gbWF4SWQpIHsKLQkJCQltYXAucHV0KHRva2VuLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1hcC5wdXQodG9rZW4uc3Vic3RyaW5nKDAsIGlkKSwgdXJsRGVjb2RlKHRva2VuLnN1YnN0cmluZyhpZCArIDEpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGNvb2tpZSBmcm9tIHRoZSB2YWx1ZSBvZiByZXNwb25zZSBoZWFkZXIgU2V0LUNvb2tpZQotCSAqLwotICAgIHB1YmxpYyBzdGF0aWMgSHR0cFJlc3BvbnNlLkNvb2tpZSBwYXJzZUNvb2tpZShTdHJpbmcgc3RyKSB7Ci0gICAgCS8vbG9nZ2VyLmRlYnVnKHN0cik7Ci0gICAgCWludCBpZCA9IHN0ci5pbmRleE9mKCc9Jyk7Ci0gICAgCWlmKGlkIDw9IDApIHJldHVybiBudWxsOwotICAgIAlTdHJpbmcgbmFtZSA9IHN0ci5zdWJzdHJpbmcoMCwgaWQpOwotICAgIAlpbnQgZnJvbUlkID1uYW1lLmxlbmd0aCgpICsgMTsKLSAgICAJaW50IHRvSWQgPSBzdHIuaW5kZXhPZigiOyIpOyAvLyROT04tTkxTLTEkCi0gICAgCVN0cmluZyB2YWx1ZTsKLSAgICAJU3RyaW5nIHRoZVJlc3QgPSBudWxsOwotICAgIAlpZih0b0lkID09IC0xKSB7Ci0gICAgCQl2YWx1ZSA9IHN0ci5zdWJzdHJpbmcoZnJvbUlkKTsKLSAgICAJfQotICAgIAllbHNlIHsKLSAgICAJCXZhbHVlID0gc3RyLnN1YnN0cmluZyhmcm9tSWQsIHRvSWQpOwotICAgIAkJaWYodG9JZCA8IHN0ci5sZW5ndGgoKSAtIDEpIHsKLSAgICAJCQl0aGVSZXN0ID0gc3RyLnN1YnN0cmluZyh0b0lkICsgMSk7Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSBuZXcgSHR0cFJlc3BvbnNlLkNvb2tpZShuYW1lLCB2YWx1ZSk7Ci0gICAgCWlmKHRoZVJlc3QgIT0gbnVsbCkgewotICAgIAkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGhlUmVzdCwgIjsiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJd2hpbGUodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgIAkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgCQkJaWQgPSB0b2tlbi5pbmRleE9mKCc9Jyk7Ci0gICAgCQkJaWYoaWQgPD0gMCkgY29udGludWU7Ci0gICAgCQkJbmFtZSA9IHRva2VuLnN1YnN0cmluZygwLCBpZCk7Ci0gICAgCQkJaWYoaWQgPT0gdG9rZW4ubGVuZ3RoKCkgLSAxKSB7Ci0gICAgCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCQl9Ci0gICAgCQkJZWxzZSB7Ci0gICAgCQkJCXZhbHVlID0gdG9rZW4uc3Vic3RyaW5nKGlkICsgMSk7Ci0gICAgCQkJfQotICAgIAkJCWlmKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiZG9tYWluIikpIHsgLy8kTk9OLU5MUy0xJAotICAgIAkJCQljb29raWUuc2V0RG9tYWluKHZhbHVlKTsKLSAgICAJCQl9Ci0gICAgCQkJZWxzZSBpZihuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInBhdGgiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgCQkJCWNvb2tpZS5zZXRQYXRoKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0gICAgICAgIH0KLQotICAgIAlyZXR1cm4gY29va2llOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlcyB0aGUgY29va2llcyBmcm9tIHRoZSB2YWx1ZSBvZiByZXF1ZXN0IGhlYWRlciBDb29raWUKLSAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIEh0dHBSZXNwb25zZS5Db29raWUgb2JqZWN0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gcGFyc2VDb29raWVzKFN0cmluZyBzdHIpIHsKLSAgICAJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc3RyLCAiOyIpOyAvLyROT04tTkxTLTEkCi0gICAgCVZlY3RvciBjb29raWVzID0gbmV3IFZlY3RvcigpOwotICAgIAl3aGlsZSh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgCQlTdHJpbmcgdG9rZW4gPSB0b2tlbnMubmV4dFRva2VuKCkudHJpbSgpOwotICAgIAkJaW50IGlkID0gdG9rZW4uaW5kZXhPZignPScpOwotICAgIAkJaWYoaWQgPT0gLTEpIGNvbnRpbnVlOwotICAgIAkJU3RyaW5nIG5hbWUgPSB0b2tlbi5zdWJzdHJpbmcoMCwgaWQpOwotICAgIAkJU3RyaW5nIHZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAJCWlmKGlkIDwgdG9rZW4ubGVuZ3RoKCkgLSAxKSB7Ci0gICAgCQkJdmFsdWUgPSB0b2tlbi5zdWJzdHJpbmcoaWQgKyAxKTsKLSAgICAJCX0KLSAgICAJCWlmKERFQlVHKSBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSsiPSIrdmFsdWUpOyAvLyROT04tTkxTLTEkCi0gICAgCQljb29raWVzLmFkZEVsZW1lbnQobmV3IEh0dHBSZXNwb25zZS5Db29raWUobmFtZSwgdmFsdWUpKTsKLSAgICAJfQotICAgIAlyZXR1cm4gY29va2llcy5lbGVtZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQ29va2llU3RyaW5nKEVudW1lcmF0aW9uIGNvb2tpZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUoY29va2llcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSHR0cFJlc3BvbnNlLkNvb2tpZSBjb29raWUgPSAoSHR0cFJlc3BvbnNlLkNvb2tpZSljb29raWVzLm5leHRFbGVtZW50KCk7Ci0JCQlzdHJCdWYuYXBwZW5kKGNvb2tpZS5nZXROYW1lKCkpLmFwcGVuZCgnPScpLmFwcGVuZChjb29raWUuZ2V0VmFsdWUoKSkuYXBwZW5kKCI7ICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN0ckJ1Zi50b1N0cmluZygpOwotICAgIH0KLQotCS8qKgotCSogVGhpcyB1dGlsaXR5IG1ldGhvZCBpcyBmb3IgY29udmVydGluZyBmcm9tCi0JKiBhIE1JTUUgZm9ybWF0IGNhbGxlZCAiPGNvZGU+eC13d3ctZm9ybS11cmxlbmNvZGVkPC9jb2RlPiIKLQkqIHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotCSogPHA+Ci0JKiBUbyBjb252ZXJ0IHRvIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiwgZWFjaCBjaGFyYWN0ZXIgaXMgZXhhbWluZWQgaW4gdHVybjoKLQkqIDx1bD4KLQkqIDxsaT5UaGUgQVNDSUkgY2hhcmFjdGVycyAnPGNvZGU+YTwvY29kZT4nIHRocm91Z2ggJzxjb2RlPno8L2NvZGU+JywKLQkqICc8Y29kZT5BPC9jb2RlPicgdGhyb3VnaCAnPGNvZGU+WjwvY29kZT4nLCBhbmQgJzxjb2RlPjA8L2NvZGU+JwotCSogdGhyb3VnaCAnPGNvZGU+OTwvY29kZT4nIHJlbWFpbiB0aGUgc2FtZS4KLQkqIDxsaT5UaGUgcGx1cyBzaWduICc8Y29kZT4rPC9jb2RlPidpcyBjb252ZXJ0ZWQgaW50byBhCi0JKiBzcGFjZSBjaGFyYWN0ZXIgJzxjb2RlPiZuYnNwOzwvY29kZT4nLgotCSogPGxpPlRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgcmVwcmVzZW50ZWQgYnkgMy1jaGFyYWN0ZXIKLQkqIHN0cmluZ3Mgd2hpY2ggYmVnaW4gd2l0aCB0aGUgcGVyY2VudCBzaWduLAotCSogIjxjb2RlPiU8aT54eTwvaT48L2NvZGU+Iiwgd2hlcmUgPGk+eHk8L2k+IGlzIHRoZSB0d28tZGlnaXQKLQkqIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsb3dlciA4LWJpdHMgb2YgdGhlIGNoYXJhY3Rlci4KLQkqIDwvdWw+Ci0JKgotCSovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRGVjb2RlKFN0cmluZyBzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxzLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcilJbnRlZ2VyLnBhcnNlSW50KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuc3Vic3RyaW5nKGkrMSxpKzMpLDE2KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFVuZG8gY29udmVyc2lvbiB0byBleHRlcm5hbCBlbmNvZGluZwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgYnl0ZVtdIGlucHV0Qnl0ZXMgPSByZXN1bHQuZ2V0Qnl0ZXMoIjg4NTlfMSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGlucHV0Qnl0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbihkb0dldChhcmdzWzBdLCBudWxsLCAwKSk7Ci0gICAgCVN0cmluZyB1cmwgPSBhcmdzWzBdOwotICAgIAlTdHJpbmcgdWlkID0gYXJnc1sxXTsKLSAgICAJU3RyaW5nIGVtYWlsID0gYXJnc1syXTsKLSAgICAJUHJvcGVydGllcyBkYXRhID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAJZGF0YS5wdXQoInVpZCIsIHVpZCk7IC8vJE5PTi1OTFMtMSQKLSAgICAJZGF0YS5wdXQoImVtYWlsIiwgZW1haWwpOyAvLyROT04tTkxTLTEkCi0gICAgCVN5c3RlbS5vdXQucHJpbnRsbihkb1Bvc3QodXJsLCBudWxsLCBkYXRhLCAwKSk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL1RpbWVvdXRIYW5kbGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL1RpbWVvdXRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmY2RlYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvaHR0cC9UaW1lb3V0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudXRpbC5odHRwOwotCi1pbnRlcmZhY2UgVGltZW91dEhhbmRsZXIgewotICAgIHZvaWQgc2V0VGltZW91dChpbnQgdGltZW91dCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9odHRwL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGRjZjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3NyYy9vcmcvZWNsaXBzZS9lcGYvcHVibGlzaGluZy91dGlsL2h0dHAvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgY2hlY2tpbmcgZXh0ZXJuYWwgbGlua3MgaW4gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy9zcmMvb3JnL2VjbGlwc2UvZXBmL3B1Ymxpc2hpbmcvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTVlMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcvc3JjL29yZy9lY2xpcHNlL2VwZi9wdWJsaXNoaW5nL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIHB1Ymxpc2hpbmcgc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGVkQm9va21hcmtzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQzMTcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9QdWJsaXNoZWRCb29rbWFya3MueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JaW5kZW50PSJ5ZXMiLz4KLTwhLS0gdGhpcyBtZXNzIHVwIHRoZSBsYXlvdXQuIGRpc2FibGUgaXQgYmVmb3JlIHRoZSBsYXlvdXQgY3NzcyBpcyBmaXhlZC4KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0tLT4KLQotCTx4c2w6cGFyYW0gbmFtZT0id2hlcmVBbUlUZXh0Ii8+Ci0JPHhzbDpwYXJhbSBuYW1lPSJ0cmVlU2V0c1RleHQiLz4KLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSJCb29rbWFya3MiPgotCQotPHhzbDp0ZXh0IGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiPgotCTwhW0NEQVRBWwotPCEtLQotCTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0JImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotLS0+Ci1dXT4KLTwveHNsOnRleHQ+Ci0KLQotCQk8aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8aGVhZD4KLQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotYm9keSB7Ci0gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotICAgICAgICBmb250LXNpemU6IDEwcHQ7Ci0gICAgICAgIG1hcmdpbi1sZWZ0OiAwcHg7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogMHB4OwotICAgICAgICBtYXJnaW4tdG9wOiAwcHg7Ci0gICAgICAgIG1hcmdpbi1ib3R0b206IDBweDsKLSAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi10ZC5tZW51IHsKLSAgICAgICAgYmFja2dyb3VuZDojMDA2Njk5OwotfQotCi1zcGFuLm1lbnUgewotICAgICAgICBjdXJzb3IgOiBoYW5kOwotICAgICAgICBmb250LXNpemU6IDhwdDsKLSAgICAgICAgY29sb3I6ICNmZmZmZmY7Ci0gICAgICAgIHdoaXRlLXNwYWNlOm5vd3JhcDsKLSAgICAgICAgcGFkZGluZy1yaWdodDogMC41ZW07Ci0gICAgICAgIGJvcmRlci1yaWdodDogMnB4IHNvbGlkICNmZmZmZmY7Ci19Ci0KLXNwYW4ubWVudSBpbWcgewotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotfQotCi10ZC50YWIgewotICAgICAgICBiYWNrZ3JvdW5kOiNmZmZmZmY7Ci0gICAgICAgIHBhZGRpbmctdG9wOiAxcHg7Ci0gICAgICAgIHBhZGRpbmctYm90dG9tOiAxcHg7Ci19Ci0KLXNwYW4udGFiLCBzcGFuLnNlbGVjdGVkVGFiIHsKLQljdXJzb3I6IHBvaW50ZXI7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKLSAgICAgICAgd2hpdGUtc3BhY2U6bm93cmFwOwotICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07Ci19Ci0KLXNwYW4udGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojYzBjMGMwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNjY2NjY2OwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjNjY2NjY2OwotfQotCi1zcGFuLnNlbGVjdGVkVGFiIHsKLSAgICAgICAgYmFja2dyb3VuZDojZTBlMGUwOwotICAgICAgICBib3JkZXItdG9wOiAgIDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYTBhMGEwOwotICAgICAgICBib3JkZXItbGVmdDogIDFweCBzb2xpZCAjYTBhMGEwOwotfQotCi10ZC50cmVlIHsKLSAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM5OTk5OTk7Ci19Ci08L3N0eWxlPgotCQkJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJvb2ttYXJrdmlld3MuanMiPgotPC9zY3JpcHQ+Ci0JCQkJPHNjcmlwdD4KLWZ1bmN0aW9uIGNoZWNrS2V5KGUsIGZ1bmMpIHsKLSAgICAgICAgaWYgKHdpbmRvdy5ldmVudCkgewotICAgICAgICAgICAgICAgIGtleSA9IHdpbmRvdy5ldmVudC5rZXlDb2RlOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IHdpbmRvdy5ldmVudC5zcmNFbGVtZW50OwotICAgICAgICB9IGVsc2UgaWYgKGUpIHsKLSAgICAgICAgICAgICAgICBrZXkgPSBlLndoaWNoOwotICAgICAgICAgICAgICAgIHRhcmdldCA9IGUudGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtleT09MTMgfHwga2V5PT0zMikgewotICAgICAgICAgICAgICAgIGZ1bmModGFyZ2V0KTsKLSAgICAgICAgfQotfQotPC9zY3JpcHQ+Ci0JCQk8L2hlYWQ+Ci0JCQk8Ym9keSBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBvbmxvYWQ9ImluaXQoKTsiPgotCQkJCTx0YWJsZSBjZWxsc3BhY2luZz0iMXB4IiBjZWxscGFkZGluZz0iMHB4IiBib3JkZXI9IjAiIGhlaWdodD0iMTAwJSIgd2lkdGg9IjEwMCUiPgotCQkJCQk8IS0tIGFkZCB0aGUgdGFiIG1lbnVzIC0tPgotCQkJCQk8dHI+Ci0JCQkJCQk8dGQgY2xhc3M9Im1lbnUiPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQkJPHNwYW4gY2xhc3M9Im1lbnUiIHRhYmluZGV4PSIxIiBvbmNsaWNrPSJ3aGVyZUFtSSgpOyIgb25rZXlwcmVzcz0iY2hlY2tLZXkoZXZlbnQsIHdoZXJlQW1JKTsiPgotCQkJCQkJCQk8aW1nIGFsdD0iIiB0aXRsZT0iIiBzcmM9ImltYWdlcy9uaV93aGVyZS5naWYiLz4KLQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3aGVyZUFtSVRleHQiLz4KLQkJCQkJCQk8L3NwYW4+Ci0JCQkJCQkJPHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLQkJCQkJCQk8c3BhbiBjbGFzcz0ibWVudSIgdGFiaW5kZXg9IjEiIG9uY2xpY2s9InRvZ1ZpZXdzKCk7IiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgdG9nVmlld3MpOyI+Ci0JCQkJCQkJCTxpbWcgYWx0PSIiIHRpdGxlPSIiIHNyYz0iaW1hZ2VzL2FjdGlvbl91bmhpZGUuZ2lmIi8+Ci0JCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdHJlZVNldHNUZXh0Ii8+Ci0JCQkJCQkJPC9zcGFuPgotCQkJCQkJCTx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCQk8IS0tIGxvYWQgdGhlIHRhYnMgLS0+Ci0JCQkJCTx0cj4KLQkJCQkJCTx0ZCBjbGFzcz0idGFiIj4KLQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJCb29rbWFyayI+Ci0JCQkJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0icG9zIj4KLQkJCQkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwb3NpdGlvbigpLTEiLz4KLQkJCQkJCQkJPC94c2w6dmFyaWFibGU+Ci0JCQkJCQkJCTxzcGFuIGNsYXNzPSJ0YWIiIGlkPSJ0YWJ7JHBvc30iIHRhYmluZGV4PSIxIiBvbmtleXByZXNzPSJjaGVja0tleShldmVudCwgZGlzcGxheVRyZWUpOyIgb25jbGljaz0iZGlzcGxheVRyZWUodGhpcyk7Ij4KLQkJCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InVybCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB1cmwiLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJpc0RlZmF1bHRWaWV3Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGRlZmF1bHQiLz48L3hzbDphdHRyaWJ1dGU+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0YWJOYW1lIi8+JiMxNjA7PC9zcGFuPgotCQkJCQkJCQk8eHNsOnRleHQ+Ci08L3hzbDp0ZXh0PgotCQkJCQkJCTwveHNsOmZvci1lYWNoPgotCQkJCQkJPC90ZD4KLQkJCQkJPC90cj4KLQkJCQkJPCEtLSBwbGFjZWhvbGRlciBmb3IgdGhlIGNvbnRlbnQgdHJlZSAtLT4KLQkJCQkJPHRyIGhlaWdodD0iMTAwJSI+Ci0JCQkJCQk8dGQgY2xhc3M9InRyZWUiPgotCQkJCQkJCTxpZnJhbWUgbmFtZT0ib3J5X3RvYyIgdGl0bGU9IiIgc3R5bGU9InZpc2liaWxpdHk6dmlzaWJsZSIgdGFiaW5kZXg9IjEiIGZyYW1lYm9yZGVyPSJubyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc2Nyb2xsaW5nPSJhdXRvIi8+Ci0JCQkJCQk8L3RkPgotCQkJCQk8L3RyPgotCQkJCTwvdGFibGU+Ci0JCQk8L2JvZHk+Ci0JCTwvaHRtbD4KLQk8L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGluZ1JlcG9ydC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvUHVibGlzaGluZ1JlcG9ydC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOTA5NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL1B1Ymxpc2hpbmdSZXBvcnQueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJzZWxlY3RlZENvbmZpZ3VyYXRpb25UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImRldGFpbEluZm9UZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InNob3dFcnJvclRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibG9nc1dhcm5pbmdUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBhZ2VzTm90SW5zdGFsbGVkVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbnZhbGlkRXh0ZXJuYWxUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im5vbkV4aXN0aW5nVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVmZXJlbmNlc1RpdGxlVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nUmVmZXJlbmNlc1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9Im1pc3NpbmdSZXNvdXJjZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ib3duZXJSZXNvdXJjZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ib3duZXJFbGVtZW50VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJtaXNzaW5nRWxlbWVudFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iaW52YWxpZEVsZW1lbnRUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImludmFsaWRFbGVtZW50TGlua3NUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InBsZWFzZUNoZWNrVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwbGVhc2VGaW5kVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJwdWJsaXNoaW5nUmVwb3J0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzdW1tYXJ5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbmZvVGV4dCIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IlB1Ymxpc2hpbmdSZXBvcnQiPgotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bGluayB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi8uLi9jc3MvZGVmYXVsdC5jc3MiIHJlbD0iU3R5bGVTaGVldCIvPgotPHNjcmlwdCBzcmM9Ii4vLi4vc2NyaXB0cy9Db250ZW50UGFnZVJlc291cmNlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSIuLy4uL3NjcmlwdHMvQ29udGVudFBhZ2VTZWN0aW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij48L3NjcmlwdD4KLTxzY3JpcHQgc3JjPSIuLy4uL3NjcmlwdHMvY29udGVudFBhZ2UuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJCQkJYmFja1BhdGggPSAnLi4vJzsKLQkJCQkJaW1nUGF0aCA9ICcuLi9pbWFnZXMvJzsKLQkJCQkJdmFyIG5vZGVJbmZvPW51bGw7Ci0JCQkJCWNvbnRlbnRQYWdlLnByZWxvYWQoaW1nUGF0aCwgYmFja1BhdGgsIG5vZGVJbmZvLCAgJycsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCTwvc2NyaXB0PgotPC9oZWFkPgotCi08Ym9keT4KLTxoMj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHB1Ymxpc2hpbmdSZXBvcnRUZXh0Ii8+PC9oMj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc3VtbWFyeVRleHQiLz48L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dCIvPjo8cC8+Ci0KLTxiPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InB1YkRpci9AcGF0aCIvPgotPC9iPgotCi08cC8+Ci0KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGV0YWlsSW5mb1RleHQiLz46Ci08dWw+Ci08bGk+Ci08YT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImVycm9yTG9nL0BwYXRoIi8+Ci08L3hzbDphdHRyaWJ1dGU+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0iZXJyb3JMb2cvQG5hbWUiLz4KLTwvYT4KLSAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2hvd0Vycm9yVGV4dCIvPiA8L2xpPgotPGxpPgotPGE+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ3YXJuaW5nTG9nL0BwYXRoIi8+Ci08L3hzbDphdHRyaWJ1dGU+Ci08eHNsOnZhbHVlLW9mIHNlbGVjdD0id2FybmluZ0xvZy9AbmFtZSIvPgotPC9hPgotIC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsb2dzV2FybmluZ1RleHQiLz4gPC9saT4KLTwvdWw+Ci0KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFnZXNOb3RJbnN0YWxsZWRUZXh0Ii8+Ci0KLTwvZGl2PgotCi0KLTx4c2w6aWYgdGVzdD0idmFsaWRhdG9ySW5mby9pbnZhbGlkRXh0ZXJuYWxMaW5rcyI+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnZhbGlkRXh0ZXJuYWxUZXh0Ii8+OjwvZGl2PgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08cC8+Ci08dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSI+Ci0JPHRib2R5PgotCQk8dHI+Ci0JCQk8dGg+VXJsPC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbmZvVGV4dCIvPjwvdGg+Ci0JCTwvdHI+Ci0JCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ2YWxpZGF0b3JJbmZvL2ludmFsaWRFeHRlcm5hbExpbmtzL2VudHJ5Ij4KLQkJPHRyPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+PC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4mIzE2MDs8L3RkPgotCQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3hzbDppZj4KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL2ludmFsaWRSZWZlcmVuY2VzIGFuZCBjb3VudCh2YWxpZGF0b3JJbmZvL2ludmFsaWRSZWZlcmVuY2VzL2VudHJ5KSA+IDAiPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRpbnZhbGlkRWxlbWVudExpbmtzVGV4dCIvPjo8L2Rpdj4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHAvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRub25FeGlzdGluZ1RleHQiLz48YnIvPgotPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwbGVhc2VGaW5kVGV4dCIvPgotPHAvPgotPHRhYmxlIGNsYXNzPSJzZWN0aW9uVGFibGUiPgotCTx0Ym9keT4KLQkJPHRyPgotCQkJPHRoPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW52YWxpZEVsZW1lbnRUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbGlkYXRvckluZm8vaW52YWxpZFJlZmVyZW5jZXMvZW50cnkiPgotCQk8dHI+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBlbGVtZW50Ii8+ICg8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz4pPC90ZD4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG93bmVyIi8+PC90ZD4KLQkJPC90cj4KLQk8L3hzbDpmb3ItZWFjaD4KLQk8L3Rib2R5PgotPC90YWJsZT4KLTwvZGl2PgotPC94c2w6aWY+Ci0KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL21pc3NpbmdSZWZlcmVuY2VzIGFuZCBjb3VudCh2YWxpZGF0b3JJbmZvL21pc3NpbmdSZWZlcmVuY2VzL2VudHJ5KSA+IDAiPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uSGVhZGluZyI+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1JlZmVyZW5jZXNUaXRsZVRleHQiLz46PC9kaXY+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTxwLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1JlZmVyZW5jZXNUZXh0Ii8+PGJyLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGxlYXNlQ2hlY2tUZXh0Ii8+Ci08cC8+Ci08dGFibGUgY2xhc3M9InNlY3Rpb25UYWJsZSI+Ci0JPHRib2R5PgotCQk8dHI+Ci0JCQk8dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRtaXNzaW5nRWxlbWVudFRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyRWxlbWVudFRleHQiLz48L3RoPgotCQk8L3RyPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0idmFsaWRhdG9ySW5mby9taXNzaW5nUmVmZXJlbmNlcy9lbnRyeSI+Ci0JCTx0cj4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVsZW1lbnQiLz48L3RkPgotCQkJPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAb3duZXIiLz48L3RkPgotCQk8L3RyPgotCTwveHNsOmZvci1lYWNoPgotCTwvdGJvZHk+Ci08L3RhYmxlPgotPC9kaXY+Ci08L3hzbDppZj4KLQotPHhzbDppZiB0ZXN0PSJ2YWxpZGF0b3JJbmZvL21pc3NpbmdSZXNvdXJjZXMgYW5kIGNvdW50KHZhbGlkYXRvckluZm8vbWlzc2luZ1Jlc291cmNlcy9lbnRyeSkgPiAwIj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbkhlYWRpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1Jlc291cmNlRmlsZXNUaXRsZVRleHQiLz46PC9kaXY+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTxwLz4KLTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbWlzc2luZ1Jlc291cmNlRmlsZXNUZXh0Ii8+PGJyLz4KLTxwLz4KLTx0YWJsZSBjbGFzcz0ic2VjdGlvblRhYmxlIj4KLQk8dGJvZHk+Ci0JCTx0cj4KLQkJCTx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG1pc3NpbmdSZXNvdXJjZVRleHQiLz48L3RoPjx0aD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG93bmVyUmVzb3VyY2VUZXh0Ii8+PC90aD48dGg+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRvd25lckVsZW1lbnRUZXh0Ii8+PC90aD4KLQkJPC90cj4KLQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InZhbGlkYXRvckluZm8vbWlzc2luZ1Jlc291cmNlcy9lbnRyeSI+Ci0JCTx0cj4KLQkJCTx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVybCIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByZXNvdXJjZSIvPjwvdGQ+Ci0JCQk8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBvd25lciIvPjwvdGQ+Ci0JCTwvdHI+Ci0JPC94c2w6Zm9yLWVhY2g+Ci0JPC90Ym9keT4KLTwvdGFibGU+Ci08L2Rpdj4KLTwveHNsOmlmPgotCi0KLTwvYm9keT4KLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci0JCQkJY29udGVudFBhZ2Uub25sb2FkKCk7Ci08L3NjcmlwdD4KLTwvaHRtbD4KLQotCi08L3hzbDp0ZW1wbGF0ZT4KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvYm9va21hcmsueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2Jvb2ttYXJrLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlYzFmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvYm9va21hcmsueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczpmbz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvRm9ybWF0Ij4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLQk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudCI+Ci0JCTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTxoZWFkPgotCQkJCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci0JCQkJPHRpdGxlPkNvbnRlbnRzPC90aXRsZT4KLQkJCQk8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0qIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDlwdDsKLQltYXJnaW46IDA7Ci0JcGFkZGluZzogMDsKLX0KLQotQk9EWSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogV2luZG93OwotCWZvbnQ6IGljb247Ci0JbWFyZ2luOjA7Ci0JcGFkZGluZzowOwotCWJvcmRlcjowOwotfQotCi1VTCB7Ci0JYm9yZGVyLXdpZHRoOjA7Ci0JbWFyZ2luLWxlZnQ6MTVweDsKLX0KLQotI3Jvb3QgewotCW1hcmdpbi10b3A6NXB4OwotCW1hcmdpbi1sZWZ0OjVweDsKLX0KLQotVUwuZXhwYW5kZWQgewotCWRpc3BsYXk6YmxvY2s7Ci19Ci0KLVVMLmNvbGxhcHNlZCB7Ci0JZGlzcGxheTogbm9uZTsKLX0KLQotTEkgewotCW1hcmdpbi10b3A6M3B4OwotCWxpc3Qtc3R5bGUtaW1hZ2U6bm9uZTsKLQlsaXN0LXN0eWxlLXR5cGU6bm9uZTsKLQkJd2hpdGUtc3BhY2U6IG5vd3JhcDsKLX0KLQotSU1HIHsKLQl2ZXJ0aWNhbC1hbGlnbjogdG9wOwotCWJvcmRlcjowcHg7Ci0JbWFyZ2luOjBweDsKLQlwYWRkaW5nOjBweDsKLQltYXJnaW4tcmlnaHQ6NHB4OwotfQotCi0KLUEgewotCXRleHQtZGVjb3JhdGlvbjpub25lOwotCWNvbG9yOiMyNTgKLQlwYWRkaW5nLXJpZ2h0OjJweDsKLQkvKiB0aGlzIHdvcmtzIGluIGllNS41LCBidXQgbm90IGluIGllNS4wICAqLwotCXdoaXRlLXNwYWNlOiBub3dyYXA7Ci19Ci0KLUE6aG92ZXJ7Ci0JdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsKLX0KLQotQS5hY3RpdmV7Ci0JYmFja2dyb3VuZDpIaWdobGlnaHQ7Ci0JY29sb3I6SGlnaGxpZ2h0VGV4dDsKLQl3aWR0aDoxMDAlOwotfQotCi1BLmFjdGl2ZTpob3ZlcnsKLQl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOwotCWJhY2tncm91bmQ6SGlnaGxpZ2h0OwotCWNvbG9yOkhpZ2hsaWdodFRleHQ7Ci0Jd2lkdGg6MTAwJTsKLX0KLQotCi0KLS5oIHsKLQl2aXNpYmlsaXR5OmhpZGRlbjsKLX0KLQotPC9zdHlsZT4KLQkJCQk8YmFzZSB0YXJnZXQ9Im9yeV9kb2MiLz4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQotLy8gUHJlbG9hZCBpbWFnZXMKLW1pbnVzID0gbmV3IEltYWdlKCk7Ci1taW51cy5zcmMgPSAiaW1hZ2VzIisiL21pbnVzLmdpZiI7Ci1wbHVzID0gbmV3IEltYWdlKCk7Ci1wbHVzLnNyYyA9ICJpbWFnZXMiKyIvcGx1cy5naWYiOwotYWx0VG9waWNDbG9zZWQgPSAiVG9waWNcdTAwMjBjbG9zZWQiOwotYWx0VG9waWNPcGVuID0gIlRvcGljXHUwMDIwb3BlbiI7Ci08L3NjcmlwdD4KLQkJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9InRvYy5qcyIvPgotCQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0idHJlZS5qcyIvPgotCQkJPC9oZWFkPgotCQkJPGJvZHkgZGlyPSJsdHIiIG9ubG9hZD0ic2V0TG9hZGVkKCk7Ij4KLQkJCQk8dWwgZGlyPSJsdHIiIGNsYXNzPSJleHBhbmRlZCIgaWQ9InJvb3QiPgotCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iRWxlbWVudCIvPgotCQkJCQkJPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhcmVudElkIiBzZWxlY3Q9IicnIi8+Ci0JCQkJCTwveHNsOmNhbGwtdGVtcGxhdGU+Ci0JCQkJPC91bD4KLQkJCTwvYm9keT4KLQkJPC9odG1sPgotCTwveHNsOnRlbXBsYXRlPgotCTx4c2w6dGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQk8eHNsOnBhcmFtIG5hbWU9Im5vZGUiLz4KLQkJPHhzbDpwYXJhbSBuYW1lPSJwYXJlbnRJZCIvPgotCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGUiPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJuYW1lIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpZCI+Ci0JCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBub2RlSWQiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJndWlkIj4KLQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGd1aWQiLz4KLQkJCTwveHNsOnZhcmlhYmxlPgotCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJpY29udXJsIj4uL2ltYWdlcy88eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNsb3NlZEljb25OYW1lIi8+Ci0JCQk8L3hzbDp2YXJpYWJsZT4KLQkJCTx4c2w6dmFyaWFibGUgbmFtZT0idXJsIj4uLy4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIi8+Ci0JCQk8L3hzbDp2YXJpYWJsZT4KLQkJCTxsaT4KLQkJCQk8eHNsOmNob29zZT4KLQkJCQkJPHhzbDp3aGVuIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCAiPgotCQkJCQkJPGltZyBzcmM9ImltYWdlcy9wbHVzLmdpZiIgY2xhc3M9ImNvbGxhcHNlZCIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJPC94c2w6d2hlbj4KLQkJCQkJPHhzbDpvdGhlcndpc2U+Ci0JCQkJCQk8IS0tIDxzcGFuIHN0eWxlPSJ3aWR0aDoxMiI+PC9zcGFuPiAtLT4KLQkJCQkJCTxpbWcgc3JjPSJpbWFnZXMvbm9wbHVzLmdpZiIgY2xhc3M9ImNvbGxhcHNlZCIgYWx0PSIiIHRpdGxlPSIiLz4KLQkJCQkJPC94c2w6b3RoZXJ3aXNlPgotCQkJCTwveHNsOmNob29zZT4KLQkJCQk8YSBpZD0ieyRpZH0iIHBhcmVudElkPSJ7JHBhcmVudElkfSIgZ3VpZD0ieyRndWlkfSIgaHJlZj0ieyR1cmx9Ij4KLQkJCQkJPGltZyBzcmM9InskaWNvbnVybH0iIGFsdD0iIiB0aXRsZT0iIi8+Ci0JCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPgotCQkJCTwvYT4KLQkJCQk8eHNsOmlmIHRlc3Q9ImNvdW50KEVsZW1lbnQpID4gMCAiPgotCQkJCQk8dWwgY2xhc3M9ImNvbGxhcHNlZCI+Ci0JCQkJCQk8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icHJvY2Vzc05vZGUiPgotCQkJCQkJCTx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IkVsZW1lbnQiLz4KLQkJCQkJCQk8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFyZW50SWQiIHNlbGVjdD0iJGlkIi8+Ci0JCQkJCQk8L3hzbDpjYWxsLXRlbXBsYXRlPgotCQkJCQk8L3VsPgotCQkJCTwveHNsOmlmPgotCQkJPC9saT4KLQkJPC94c2w6Zm9yLWVhY2g+Ci0JPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2VsZW1lbnRVcmxzLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9lbGVtZW50VXJscy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZDI4NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2VsZW1lbnRVcmxzLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotPHhzbDpvdXRwdXQgb21pdC14bWwtZGVjbGFyYXRpb249InllcyIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvRWxlbWVudFVybHMiPgotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImVsZW1lbnRVcmwiPmNvbnRlbnRQYWdlLnByb2Nlc3NQYWdlLmVsZW1lbnRVcmxzWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5vZGVJZCIvPiJdID0gWyI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHRleHQiLz4iLCI8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHVybCIvPiJdOwotPC94c2w6Zm9yLWVhY2g+CQkKLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeS54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvZ2xvc3NhcnkueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmFkZDRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLTx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZ2xvc3NhcnlUZXh0Ii8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ikdsb3NzYXJ5Ij4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2xvc3NhcnlUZXh0Ii8+IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPgotPGRsPgotCi08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbSI+Ci08ZHQ+Ci08Yj4KLTxhPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaWQiPl9HTE9TU0FSWV9JVEVNXzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT4KLTx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz4KLTwvYT4KLTwvYj4KLTwvZHQ+Ci0KLTxkZD4KLTx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJAY29udGVudCIvPgkKLTwvZGQ+Ci08L3hzbDpmb3ItZWFjaD4KLQotPC9kbD4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0JCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeV9pbmRleC54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmVjODcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X2luZGV4LnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotCi08eHNsOnRlbXBsYXRlIG1hdGNoPSJHbG9zc2FyeSI+Ci0KLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxtZXRhIG5hbWU9Im1ldGFfdGFnZ2VkIiBjb250ZW50PSJ0cnVlIi8+Ci08dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxmcmFtZXNldCByb3dzPSIyNSwqIj4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9uYXYiIHNyYz0ibmF2aWcuaHRtIiBzY3JvbGxpbmc9ImF1dG8iIG1hcmdpbmhlaWdodD0iMiIgbWFyZ2lud2lkdGg9IjIiIHRpdGxlPSJOYXZpZ2F0aW9uIEFyZWEiLz4KLTxmcmFtZSBuYW1lPSJnbG9zc2FyeV9kb2MiIHNyYz0iLi4vZ2xvc3NhcnkuaHRtIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIyIiBzY3JvbGxpbmc9ImF1dG8iIHRpdGxlPSJDb250ZW50IEFyZWEiLz4KLTwvZnJhbWVzZXQ+Ci08L2h0bWw+Ci0KLTwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X25hdmlnLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9nbG9zc2FyeV9uYXZpZy54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDc2YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2dsb3NzYXJ5X25hdmlnLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJ0aXRsZSIvPgotPHhzbDpwYXJhbSBuYW1lPSJnbG9zc2FyeVRleHQiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iR2xvc3NhcnkiPgotCi08aHRtbD4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz4gLSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IHRleHQ9IiMwMDAwMDAiIGJnY29sb3I9IiNmZmZmZmYiPgotPGZvbnQgZmFjZT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiI+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtW0BuYXZpZ2F0aW9uLW1hcms9J3RydWUnXSI+Ci08YSAgdGFyZ2V0PSJnbG9zc2FyeV9kb2MiPgotPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+Li4vZ2xvc3NhcnkuaHRtIzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+PHhzbDp0ZXh0PgotPC94c2w6dGV4dD4KLTwveHNsOmZvci1lYWNoPgotPC9mb250PgotPC9ib2R5PgotPC9odG1sPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXgueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGI5ZGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleC54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnRlbXBsYXRlIG1hdGNoPSIvUHVibGlzaGluZ09wdGlvbiI+Ci0KLTx4c2w6dmFyaWFibGUgbmFtZT0idGl0bGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdGl0bGUiLz48L3hzbDp2YXJpYWJsZT4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCi08aGVhZD4KLTx0aXRsZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Ci08bWV0YSBuYW1lPSJtZXRhX3RhZ2dlZCIgY29udGVudD0idHJ1ZSIvPgotCi08IS0tIGluY2x1ZGUgYWRkaXRpb25hbCBtZXRhIHRhZ3MgaWYgYW55IC0tPgotPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Im1ldGFUYWdzL21ldGFUYWciPgotPG1ldGE+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+Ci08eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb250ZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNvbnRlbnQiLz48L3hzbDphdHRyaWJ1dGU+Ci08L21ldGE+Ci08L3hzbDpmb3ItZWFjaD4KLQotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IVtDREFUQVsKLTwhLS0KLXZhciB0b3VyID0gMDsKLQotZnVuY3Rpb24gZ2V0Q29va2llIChuYW1lKSAKLXsKLSAgdmFyIGRjb29raWUgPSBkb2N1bWVudC5jb29raWU7IAotICB2YXIgY25hbWUgPSBuYW1lICsgIj0iOwotICB2YXIgY2xlbiA9IGRjb29raWUubGVuZ3RoOwotICB2YXIgY2JlZ2luID0gMDsKLSAgd2hpbGUgKGNiZWdpbiA8IGNsZW4pIAotICB7Ci0gICAgdmFyIHZiZWdpbiA9IGNiZWdpbiArIGNuYW1lLmxlbmd0aDsKLSAgICBpZiAoZGNvb2tpZS5zdWJzdHJpbmcoY2JlZ2luLCB2YmVnaW4pID09IGNuYW1lKSAKLSAgICB7IAotICAgICAgdmFyIHZlbmQgPSBkY29va2llLmluZGV4T2YgKCI7IiwgdmJlZ2luKTsKLSAgICAgIGlmICh2ZW5kID09IC0xKSAKLSAgICAgIHsKLSAgICAgICAgdmVuZCA9IGNsZW47Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdW5lc2NhcGUoZGNvb2tpZS5zdWJzdHJpbmcodmJlZ2luLCB2ZW5kKSk7Ci0gICAgfQotCi0gICAgY2JlZ2luID0gZGNvb2tpZS5pbmRleE9mKCIgIiwgY2JlZ2luKSArIDE7Ci0gICAgaWYgKGNiZWdpbiA9PSAwKSAKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGw7Ci0gfQotCi1mdW5jdGlvbiBmaXhVcmwodXJsKQotewotCWlmICggdXJsID09IG51bGwgKQotCXsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JdmFyIGluZHggPSB1cmwuaW5kZXhPZigiZmlsZTovLy8iKTsKLQlpZiAoIGluZHggPj0wICkKLQl7Ci0JCXVybCA9IHVybC5zdWJzdHJpbmcoaW5keCs4LCB1cmwubGVuZ3RoKTsKLQl9Ci0JZWxzZQotCXsKLQkJaW5keCA9IHVybC5pbmRleE9mKCJmaWxlOi8vIik7Ci0JCWlmICggaW5keCA+PTAgKQotCQl7Ci0JCQl1cmwgPSB1cmwuc3Vic3RyaW5nKGluZHgrNywgdXJsLmxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQl1cmwgPSB1cmwucmVwbGFjZSgvXFwvZywgIi8iKTsKLQotICAgcmV0dXJuIHVuZXNjYXBlKHVybCk7Ci19Ci0KLS8vIC0tPgotXV0+Ci08L3NjcmlwdD4KLTwvaGVhZD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotdmFyIGJhbm5lcmhlaWdodCA9IDIxICsgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZUhlaWdodCIvPjsKLTx4c2w6Y2hvb3NlPgotCTx4c2w6d2hlbiB0ZXN0PSJAdXNlQXBwbGV0PSd0cnVlJyI+Ci12YXIgdG9jX2ZyYW1lID0gIm9yeV90b2MiOwotdmFyIHRvY191cmwgPSAiYXBwbGV0L215cnVwdHJlZS5odG0iOwotdmFyIGRlZmF1bHRfcGFnZV91cmwgPSAic3BzY3JlZW4uaHRtIjsKLQk8L3hzbDp3aGVuPgotCTx4c2w6b3RoZXJ3aXNlPgotdmFyIHRvY19mcmFtZSA9ICJvcnlfdG9jX2ZyYW1lIjsKLXZhciB0b2NfdXJsID0gIm5vYXBwbGV0L1B1Ymxpc2hlZEJvb2ttYXJrcy5odG1sIjsKLXZhciBkZWZhdWx0X3BhZ2VfdXJsID0gZ2V0Q29va2llKCJydXBfb3J5X2RvYyIpOwotaWYgKCBkZWZhdWx0X3BhZ2VfdXJsID09IG51bGwgKQotewotCWRlZmF1bHRfcGFnZV91cmwgPSAiYWJvdXQ6YmxhbmsiOwotfQotCTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwhW0NEQVRBWwotICBpZigobmF2aWdhdG9yLmFwcE5hbWUgPT0gIk5ldHNjYXBlIiAmJiBwYXJzZUludChuYXZpZ2F0b3IuYXBwVmVyc2lvbikgPj0gNCApIHx8IAotICAgICAgKG5hdmlnYXRvci5hcHBOYW1lID09ICJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIiICYmIHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpCi0gIHsKLSAgICBkb2N1bWVudC53cml0ZSgiICA8ZnJhbWVzZXQgIGZyYW1lYm9yZGVyPVwiMFwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgcm93cz1cIiIgKyBiYW5uZXJoZWlnaHQgKyAiLCpcIj5cbiIpOwotICAgIGRvY3VtZW50LndyaXRlKCIgICAgPGZyYW1lIHNyYz1cInRvcG5hdi5odG1cIiBub3Jlc2l6ZSBuYW1lPVwib3J5X2J1dHRvblwiIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cIm5vXCIgbWFyZ2luaGVpZ2h0PVwiMFwiIG1hcmdpbndpZHRoPVwiMFwiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lc2V0IGNvbHM9XCIyMDUsKlwiIGZyYW1lYm9yZGVyPVwiMVwiIGZyYW1lc3BhY2luZz1cIjFcIiBib3JkZXI9XCIxXCIgPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGUoIiAgICAgIDxmcmFtZSBzcmM9XCIiICsgdG9jX3VybCArICJcIiBuYW1lPVwiIiArIHRvY19mcmFtZSArICJcIiBmcmFtZWJvcmRlcj1cIjFcIiBzY3JvbGxpbmc9XCJub1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiPGZyYW1lIG5hbWU9XCJvcnlfZG9jXCIgc3JjPVwiIiArIGRlZmF1bHRfcGFnZV91cmwgKyAiXCIgIGZyYW1lYm9yZGVyPVwiMFwiIHNjcm9sbGluZz1cInllc1wiPlxuIik7Ci0gICAgZG9jdW1lbnQud3JpdGVsbigiICAgPC9mcmFtZXNldD4iKTsKLSAgICBkb2N1bWVudC53cml0ZWxuKCIgICA8L2ZyYW1lc2V0PiIpOwotCi0gIH0KLSAgZWxzZQotICB7Ci0gICAgcGFyZW50LmxvY2F0aW9uID0gImFwcGxldC9icm93c2VyLmh0bSI7Ci0gIH0KLV1dPgotCi0gIDwvc2NyaXB0PgotCi08Ym9keT4KLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIDxici8+Ci0gICAgICA8YnIvPgotCTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjQiPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMSUiPgotICAgICAgPHA+JiMxNjA7PC9wPgotICAgIDwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi0KLTwvYm9keT4KLQotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleF9jb250ZW50cy54c2wgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfY29udGVudHMueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGRkMGE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9pbmRleF9jb250ZW50cy54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci0KLTx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgCi0JZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAKLQlkb2N0eXBlLXN5c3RlbT0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIgCi0JaW5kZW50PSJ5ZXMiLz4KLQkKLTx4c2w6cGFyYW0gbmFtZT0idGl0bGUiLz4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iSW5kZXgiPgotCQkKLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiLz4KLTxsaW5rIHJlbD0iU3R5bGVTaGVldCIgaHJlZj0iaW5kZXguY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTx0aXRsZT5JbmRleCAtIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzAwNDA4MCIgdmxpbms9IiM4MDAwRkYiIGFsaW5rPSIjMDAwMEZGIj4KLTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJpdGVtIj4KLTx4c2w6Y2hvb3NlPgotCTx4c2w6d2hlbiB0ZXN0PSJAbmF2aWdhdGlvbi1tYXJrPSd0cnVlJyAiPgotCTxQIENMQVNTPSJpbmRleGhlYWRpbmciPgotCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+Ci0gICA8L1A+Ci0JPC94c2w6d2hlbj4KLQk8eHNsOm90aGVyd2lzZT4KLQk8UCBDTEFTUz0iaW5kZXhsZXZlbDEiPgotCTxhPjx4c2w6YXR0cmlidXRlIG5hbWU9Im5hbWUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOmF0dHJpYnV0ZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHByZXNlbnRhdGlvbk5hbWUiLz48L2E+Ci0gICA8L1A+Ci0gICA8UCBDTEFTUz0iaW5kZXhsZXZlbDIiPiYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOyYjMTYwOwotICAgPGEgVEFSR0VUPSJvcnlfZG9jIj4KLSAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAdXJsIiAvPjwveHNsOmF0dHJpYnV0ZT4KLQk8eHNsOnZhbHVlLW9mIGRpc2FibGUtb3V0cHV0LWVzY2FwaW5nPSJ5ZXMiIHNlbGVjdD0iQGNvbnRlbnQiLz48L2E+PC9QPgotCTwveHNsOm90aGVyd2lzZT4KLTwveHNsOmNob29zZT4KLTwveHNsOmZvci1lYWNoPgotPC9ib2R5PgotPC9odG1sPgotCi08L3hzbDp0ZW1wbGF0ZT4KLQkKLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL2luZGV4X25hdmlnLnhzbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkYTc0OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvaW5kZXhfbmF2aWcueHNsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnBhcmFtIG5hbWU9InRpdGxlIi8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9IkluZGV4Ij4KLQotPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIvPgotPHRpdGxlPkdsb3NzYXJ5IC0gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSB0ZXh0PSIjMDAwMDAwIiBiZ2NvbG9yPSIjZmZmZmZmIj4KLTxmb250IGZhY2U9IkFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08eHNsOmZvci1lYWNoIHNlbGVjdD0iaXRlbVtAbmF2aWdhdGlvbi1tYXJrPSd0cnVlJ10iPgotPGEgIHRhcmdldD0ia2V5d29yZF90Ij4KLTx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmNvbnRlbnRzLmh0bSM8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3hzbDphdHRyaWJ1dGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwcmVzZW50YXRpb25OYW1lIi8+PC9hPjx4c2w6dGV4dD4KLTwveHNsOnRleHQ+Ci08L3hzbDpmb3ItZWFjaD4KLTwvZm9udD4KLTwvYm9keT4KLTwvaHRtbD4KLQotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvcmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNTE4YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgVGhlIFVJIHRleHQgaW4gdGhlIFhTTCBzdHlsZXNoZWV0cy4KLQotc2VsZWN0ZWRDb25maWd1cmF0aW9uVGV4dD1UaGUgU2VsZWN0ZWQgY29uZmlndXJhdGlvbiBpcyBwdWJsaXNoZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbgotZGV0YWlsSW5mb1RleHQ9RGV0YWlsIGluZm9ybWF0aW9uIGlzIGxvZ2dlZCBpbnRvIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gdGhlIGxvZ3MgZm9sZGVyCi1zaG93RXJyb3JUZXh0PXNob3cgYW55IGVycm9yIG9jY3VycmVkIGR1cmluZyBwdWJsaXNoaW5nLgotbG9nc1dhcm5pbmdUZXh0PWxvZ3MgYWxsIHdhcm5pbmcgbWVzc2FnZXMgc3VjaCBhcyBtaXNzaW5nIHJlZmVyZW5jZXMsIGJyb2tlbiBsaW5rcywgYW5kIHVucHVibGlzaGVkIGNhdGVnb3JpZXMgd2l0aCBubyBjYXRlZ29yaXplZCBlbGVtZW50cy4KLXBhZ2VzTm90SW5zdGFsbGVkVGV4dD1JbiB0aGUgcGFnZXNfbm90X2luc3RhbGxlZCBmb2xkZXIsIHlvdSB3aWxsIGZpbmQgYWxsIG9mIHRoZSBtaXNzaW5nIHJlZmVyZW5jZXMgaW4gdGhpcyBjb25maWd1cmF0aW9uLgotaW52YWxpZEV4dGVybmFsVGV4dD1JbnZhbGlkIGV4dGVybmFsIGxpbmtzIGlkZW50aWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KLW93bmVyRWxlbWVudFRleHQ9T3duZXIgRWxlbWVudAotbm9uRXhpc3RpbmdUZXh0PVRoZSBvd25lciBlbGVtZW50cyByZWZlciB0byBub24tZXhpc3RpbmcgZWxlbWVudHMuIE1heWJlIHRoZSBlbGVtZW50cyB3ZXJlIGRlbGV0ZWQgZnJvbSB0aGUgbGlicmFyeSBhZnRlciB0aGUgZWxlbWVudCBsaW5rcyB3ZXJlIGNyZWF0ZWQuIFBsZWFzZSBmaW5kIHRoZSBvd25lciBlbGVtZW50cyBhbmQgZml4IHRoZXNlIGludmFsaWQgcmVmZXJlbmNlcy4KLW1pc3NpbmdSZWZlcmVuY2VzVGl0bGVUZXh0PU1pc3NpbmcgUmVmZXJlbmNlcwotbWlzc2luZ1JlZmVyZW5jZXNUZXh0PVRoZSBvd25lciBlbGVtZW50cyByZWZlciB0byAgbWlzc2luZyBlbGVtZW50cyAgaW4gdGhlIHNlbGVjdGVkIGNvbmZpZ3VyYXRpb24uIFBsZWFzZSBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIGFuZCBmaXggdGhlIG1pc3NpbmcgcmVmZXJlbmNlcy4gICAgICAgICAgICAgICAgICAgCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RpdGxlVGV4dD1NaXNzaW5nIFJlc291cmNlIEZpbGVzCi1taXNzaW5nUmVzb3VyY2VGaWxlc1RleHQ9VGhlIG93bmVyIGVsZW1lbnRzIHJlZmVyIHRvIG1pc3NpbmcgcmVzb3VyY2UgZmlsZXMuIFRob3NlIHJlc291cmNlIGZpbGVzIGFyZSByZWZlcmVuY2VkIGluIHRoZSBlbGVtZW50cycgY29udGVudCBvciBpbiB0aGUgYXNzb2NpYXRlZCBhdHRhY2htZW50cy4KLW1pc3NpbmdSZXNvdXJjZVRleHQ9TWlzc2luZyBSZXNvdXJjZQotb3duZXJSZXNvdXJjZVRleHQ9T3duZXIgUmVzb3VyY2UKLW1pc3NpbmdFbGVtZW50VGV4dD1NaXNzaW5nIEVsZW1lbnQKLWludmFsaWRFbGVtZW50VGV4dD1JbnZhbGlkIEVsZW1lbnQKLWludmFsaWRFbGVtZW50TGlua3NUZXh0PUludmFsaWQgRWxlbWVudCBMaW5rcwotcGxlYXNlQ2hlY2tUZXh0PVBsZWFzZSBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBjbG9zdXJlIGFuZCBmaXggdGhlIG1pc3NpbmcgcmVmZXJlbmNlcy4KLXBsZWFzZUZpbmRUZXh0PVBsZWFzZSBmaW5kIHRoZSBvd25lciBlbGVtZW50cyBhbmQgZml4IHRoZXNlIGludmFsaWQgcmVmZXJlbmNlcy4KLWdsb3NzYXJ5VGV4dD1HbG9zc2FyeQotaW5kZXhUZXh0PUluZGV4Ci1mZWVkYmFja1RleHQ9RmVlZGJhY2sKLWFib3V0VGV4dD1BYm91dAotc2VhcmNoVGV4dD1TZWFyY2gKLXByaW50VGV4dD1QcmludAotc3VtbWFyeVRleHQ9U3VtbWFyeQotcHVibGlzaGluZ1JlcG9ydFRleHQ9UHVibGlzaGluZyBSZXBvcnQ6Ci13aGVyZUFtSVRleHQ9V2hlcmUgYW0gSQotdHJlZVNldHNUZXh0PVRyZWUgU2V0cwotCi1zZWFyY2hUaXRsZVRleHQ9UHJvY2VzcyBTZWFyY2gKLWxhYmVsMVRleHQ9Ci1sYWJlbDJUZXh0PQotbGFiZWwzVGV4dD0KLWxhYmxlNFRleHQ9Ci1zZWFyY2hCdXR0b25UZXh0PVNlYXJjaAotc2VhcmNoRXhwcmVzc2lvblRleHQ9KiA9IGFueSBzdHJpbmcsID8gPSBhbnkgY2hhcmFjdGVyLCAiIiA9IHBocmFzZSwgQU5ELCBPUiwgTk9UID0gYm9vbGVhbiBvcGVyYXRvcnMKLQotZGV0YWlsc1RleHQ9RGV0YWlscwotaW5mb1RleHQ9SW5mbwotbWVzc2dlVGV4dD1NZXNzYWdlCi1kZXNjcmlwdGlvblRleHQ9RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy94c2wvc2VhcmNoLnhzbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9zZWFyY2gueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjA2NTg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC9zZWFyY2gueHNsCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiPgotCi08eHNsOm91dHB1dCBtZXRob2Q9Imh0bWwiIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiAKLQlkb2N0eXBlLXB1YmxpYz0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iIAotCWRvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIiAKLQlpbmRlbnQ9InllcyIvPgotCQotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hUaXRsZVRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGFiZWwxVGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJsYWJlbDJUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImxhYmVsM1RleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0ibGFibGU0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hCdXR0b25UZXh0Ii8+Ci0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9TZWFyY2giPgotCTx4c2w6dmFyaWFibGUgbmFtZT0id2ViQXBwTmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB3ZWJBcHBOYW1lIi8+PC94c2w6dmFyaWFibGU+Ci0JPGh0bWw+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJsYW5nIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmciLz48L3hzbDphdHRyaWJ1dGU+Ci0JCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ4bWw6bGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQk8aGVhZD4KLQkJPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2VhcmNoVGl0bGVUZXh0Ii8+PC90aXRsZT4KLQkJPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSIuLy4uL2Nzcy9kZWZhdWx0LmNzcyIgdHlwZT0idGV4dC9jc3MiLz4KLQkJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLQkJPCFbQ0RBVEFbCi0JCQotCQkJLy8gc2hvdWxkIG5vdCBoYXJkIGNvZGUgdGhlIHdlYiBhcHAgbmFtZSBoZXJlLCB1c2VyIGNhbiBjaGFuZ2UgdGhlIGFwcCBuYW1lCi0JCQkvL3ZhciB3ZWJBcHBOYW1lPSAnPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3ZWJBcHBOYW1lIi8+JzsKLQkJCQotCQkJLy8gdGhlIG9wZW5lbnIgaXMgdGhlIHRvcG5hdgotCQkJLy8gdGhpcyBtZXRob2QgaXMgZGVmaW5lZCBpbiB0b3BuYXYuanMKLQkJCXZhciBiYXNlVXJsID0gd2luZG93Lm9wZW5lci5nZXRCYXNlVXJsKCk7Ci0KLQkJCWZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3QoKSB7Ci0gICAgIAkJCXRyeSB7Ci0gICAgICAgCQkJCXJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKLSAgICAJIAkJfSBjYXRjaCAodHJ5TXMpIHsKLQkgICAgICAgCQkJdHJ5IHsKLSAgICAgICAgIAkJCQlyZXF1ZXN0ID0gbmV3IEFjdGl2ZVhPYmplY3QoIk1zeG1sMi5YTUxIVFRQIik7Ci0gICAgICAJCQkJfSBjYXRjaCAob3RoZXJNcykgewotICAgICAgICAJIAkJCXRyeSB7Ci0gICAgCSAgICAgICAJCQkJcmVxdWVzdCA9IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOwotCSAgICAgICAgIAkJCX0gY2F0Y2ggKGZhaWxlZCkgewotICAgICAgICAgICAJCQkJCXJlcXVlc3QgPSBudWxsOwotICAgICAgICAgCQkJCX0KLSAgICAgICAJCQkJfQotICAgICAJCQl9Ci0JCQl9Ci0KLQkJICAgCWZ1bmN0aW9uIGRvU2VhcmNoKCkgewotCQkgICAJCXZhciBzZWFyY2hTdHJpbmcgPSBkb2N1bWVudC5zZWFyY2hGb3JtLnNlYXJjaElucHV0LnZhbHVlOwotCQkgICAJCXZhciByZXN1bHRzUGVyUGFnZSA9IGRvY3VtZW50LnNlYXJjaEZvcm0uc2VhcmNoU2NvcGVTaXplUGVyUGFnZS52YWx1ZTsKLQkJICAgCQl2YXIgdXJsID0gYmFzZVVybCArICJcL1NlYXJjaFNlcnZsZXQ/c2VhcmNoU3RyaW5nPSIgKyBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoU3RyaW5nKSArICImaGl0c1BlclBhZ2U9IiArIHJlc3VsdHNQZXJQYWdlOwotICAgICAJCQljcmVhdGVSZXF1ZXN0KCk7Ci0gICAgIAkJCXJlcXVlc3Qub3BlbigiR0VUIiwgbWFrZVVuaXF1ZSh1cmwpLCB0cnVlKTsKLSAgICAgCQkJcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB1cGRhdGVQYWdlOwotICAgICAJCQlyZXF1ZXN0LnNlbmQobnVsbCk7ICAgIAkJCSAgIAkJCSAgIAotICAJCQl9Ci0KLQkJCWZ1bmN0aW9uIHVwZGF0ZVBhZ2UoKSB7Ci0gICAgCQkJaWYgKHJlcXVlc3QucmVhZHlTdGF0ZSA9PSA0KSB7Ci0gICAgCQkJCXZhciByRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvbnRhaW5lciIpOwotCQkJCQlpZiAockRpdiAhPSBudWxsKSAKLQkJCQkJCXJEaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyRGl2KTsKLSAgICAgIAkJCQlyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Ci0gICAgICAJCQkJckRpdi5zZXRBdHRyaWJ1dGUoImlkIiwgImNvbnRhaW5lciIpOwotCQkJCQlyRGl2LmlubmVySFRNTCA9IHJlcXVlc3QucmVzcG9uc2VUZXh0OwotCQkJCQl2YXIgcmVzdWx0c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXN1bHRzIik7Ci0JCQkJCXJlc3VsdHNDb250YWluZXIuYXBwZW5kQ2hpbGQockRpdik7Ci0gICAgCQkJfSAgICAJCQkKLSAgCQkJfQotICAJCQkKLSAgCQkJZnVuY3Rpb24gZ2V0UHJldk5leHRQYWdlKHVybCkgewkJCQkKLQkJCQljcmVhdGVSZXF1ZXN0KCk7Ci0KLSAgICAgCQkJcmVxdWVzdC5vcGVuKCJHRVQiLCBtYWtlVW5pcXVlKHVybCksIHRydWUpOwotICAgICAJCQlyZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHVwZGF0ZVBhZ2U7Ci0gICAgIAkJCXJlcXVlc3Quc2VuZChudWxsKTsJCQkJCi0JCQl9Ci0JCQkKLQkJCWZ1bmN0aW9uIG1ha2VVbmlxdWUodXJsKSB7Ci0JCQkJLy8gbm90ZSBzb21lIGJyb3dzZXIgc3VjaCBhcyBJRSB3aWxsIHRyeSB0byBkZXRlcm1pbmUgaWYgdGhlIGNhY2hlZCBwYWdlIGlzIHVwIHRvIGRhdGUgb3Igbm90LAotCQkJCS8vIGFuZCBtYXkgbm90IGlzc3VlIGEgcmVxdWVzdCBmb3IgdGhlIHNhbWUgdXJsCi0JCQkJLy8gZm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgdGhlIHNhbWUgdXJsIHRvIGdldCBuZXh0IG9yIHByZXZpb3VzIHBhZ2UsIAotCQkJCS8vIHRoZSBzdWJzZXF1ZW50IGNhbGxzIGZvciBuZXh0IG9yIHByZXZpb3VzIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgotCQkJCS8vIHlvdSBuZWVkIHRvIHNldCB0aGUgTGFzdCBNb2RpZmllZCBoZWFkZXIgdG8gbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGxvYWRlZC4KLQkJCQkvLyB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIGFsbHdheXMgaXNzdWUgYSBkaWZmZXJlbnQgdXJsIGJ5IGFwcGVuZGluZyB0aGUgcmVxdWVzdCB0aW1lCi0JCQkJCi0JCQkJdmFyIHQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKLQkJCQl1cmwgPSB1cmwgKyAiJnRpbWVSZXF1ZXN0ZWQ9IiArIHQ7Ci0KLQkJCQlyZXR1cm4gdXJsOwotCQkJfQotCQkJCV1dPgotCQk8L3NjcmlwdD4KLQkJPC9oZWFkPgotCQk8Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KLQkJCTxmb3JtIGlkPSJzZWFyY2hGb3JtIiBuYW1lPSJzZWFyY2hGb3JtIiBhY3Rpb249ImphdmFzY3JpcHQ6ZG9TZWFyY2goKTsiID4KLQkJCQk8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJsZWZ0Ij4KLQkJCQkJPHRyPgotCQkJCQkJPHRkPgotCQkJCQkJCTxpbnB1dCB1Y2ZpcnN0PSJmYWxzZSIgdHJpbT0idHJ1ZSIgdmFsdWU9IiIgbmFtZT0ic2VhcmNoU3RyaW5nIiB0eXBlPSJ0ZXh0IiBpZD0ic2VhcmNoSW5wdXQiLz4KLQkJCQkJCTwvdGQ+Ci0JCQkJCQk8dGQ+Ci0JCQkJCQkJPGlucHV0IHZhbHVlPSJTZWFyY2giIGNhcHRpb249IiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIgaWQ9InNlYXJjaEJ1dHRvbiIgdHlwZT0iYnV0dG9uIiAgb25DbGljaz0iZG9TZWFyY2goKTsgcmV0dXJuIGZhbHNlOyIvPgotCQkJCQkJPC90ZD4KLQkJCQkJCTx0ZD4KLQkJCQkJCQk8c2VsZWN0IG5hbWU9InNlYXJjaFNjb3BlU2l6ZVBlclBhZ2UiIGlkPSJzZWFyY2hTY29wZVNpemVQZXJQYWdlIiBvbkNoYW5nZT0iZG9TZWFyY2goKTsgcmV0dXJuIGZhbHNlOyI+Ci0JCQkJCQkJCTxvcHRpb24gc2VsZWN0ZWQ9InNlbGVjdGVkIiB2YWx1ZT0iMTAiPjEwPC9vcHRpb24+Ci0JCQkJCQkJCTxvcHRpb24gdmFsdWU9IjIwIj4yMDwvb3B0aW9uPgotCQkJCQkJCQk8b3B0aW9uIHZhbHVlPSI1MCI+NTA8L29wdGlvbj4KLQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMTAwIj4xMDA8L29wdGlvbj4KLQkJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iMjAwIj4yMDA8L29wdGlvbj4KLQkJCQkJCQk8L3NlbGVjdD4KLQkJCQkJCTwvdGQ+Ci0JCQkJCTwvdHI+Ci0JCQkJPC90YWJsZT4KLQkJCTwvZm9ybT4KLQkJCTxici8+PGJyLz4KLQkJCTxkaXYgaWQ9InJlc3VsdHMiPjwvZGl2PgkJCQotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci08L3hzbDpzdHlsZXNoZWV0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nL3hzbC90b3BuYXYueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYzIxMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcveHNsL3RvcG5hdi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM6Zm89Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML0Zvcm1hdCI+Ci0KLTx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIAotCWRvY3R5cGUtcHVibGljPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgCi0JZG9jdHlwZS1zeXN0ZW09Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiIAotCWluZGVudD0ieWVzIi8+Ci0JCi08eHNsOnBhcmFtIG5hbWU9Imdsb3NzYXJ5VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJpbmRleFRleHQiLz4KLTx4c2w6cGFyYW0gbmFtZT0iZmVlZGJhY2tUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9ImFib3V0VGV4dCIvPgotPHhzbDpwYXJhbSBuYW1lPSJzZWFyY2hUZXh0Ii8+Ci08eHNsOnBhcmFtIG5hbWU9InByaW50VGV4dCIvPgotCi0KLTx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii9QdWJsaXNoaW5nT3B0aW9uIj4KLQotPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aXRsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0aXRsZSIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXJJbWFnZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZSIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJiYW5uZXJJbWFnZUhlaWdodCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBiYW5uZXJJbWFnZUhlaWdodCIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJhbGxvd0FwcGxldFNlYXJjaCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBhbGxvd0FwcGxldFNlYXJjaCIvPjwveHNsOnZhcmlhYmxlPgotPHhzbDp2YXJpYWJsZSBuYW1lPSJzaG93R2xvc3NhcnkiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2hvd0dsb3NzYXJ5Ii8+PC94c2w6dmFyaWFibGU+Ci08eHNsOnZhcmlhYmxlIG5hbWU9InNob3dJbmRleCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzaG93SW5kZXgiLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0iZmVlZGJhY2tVcmwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmVlZGJhY2tVcmwiLz48L3hzbDp2YXJpYWJsZT4KLTx4c2w6dmFyaWFibGUgbmFtZT0ic2VydmVyU2lkZVNlYXJjaCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzZXJ2ZXJTaWRlU2VhcmNoIi8+PC94c2w6dmFyaWFibGU+Ci0KLTxodG1sPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGFuZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsYW5nIi8+PC94c2w6YXR0cmlidXRlPgotCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ieG1sOmxhbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGFuZyIvPjwveHNsOmF0dHJpYnV0ZT4KLTxoZWFkPgotPHRpdGxlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L3RpdGxlPgotCi08c2NyaXB0IGxhbmd1YWdlPSJqYXZhc2NyaXB0IiBzcmM9InNjcmlwdHMvY29tbW9uLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgc3JjPSJzY3JpcHRzL3NjcmlwdHMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9InNjcmlwdHMvdG9wbmF2LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLXZhciBmZWVkYmFja191cmw9ICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZlZWRiYWNrVXJsIi8+JzsKLTwvc2NyaXB0PgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLQotLmJhbm5lciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk5OTk5OTsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ltYWdlcy88eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGJhbm5lckltYWdlIi8+Jyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQl3aWR0aDogMTAwJTsKLQloZWlnaHQ6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkYmFubmVySW1hZ2VIZWlnaHQiLz5weDsKLX0KLS50b3BiYXJkaXZpZGVyIHsgCi0JIGJhY2tncm91bmQtY29sb3I6ICNkMGQwZDAgCi0gfQotPC9zdHlsZT4KLQotPC9oZWFkPgotCi08Ym9keSBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIj4KLQotIDxmb3JtIGFjdGlvbj0iIyIgbmFtZT0iZm9ybVRvcGZyYW1lIj4KLSAgPHRhYmxlIGNsYXNzPSJiYW5uZXIiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiA+Ci0gICAgPHRyPgotCSAgPHRkPgotICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYWxpZ249InJpZ2h0IiBzdW1tYXJ5PSIiPgotICAgICAgICAgIDx0cj4KLQkJCSAgPHhzbDppZiB0ZXN0PSIkc2hvd0dsb3NzYXJ5PSd0cnVlJyAiPgotICAgCQkJPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3Blbkdsb3NzYXJ5KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPjxpbWcgc3JjPSIuL2ltYWdlcy9uaV9nbG9zc2FyeS5naWYiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMCIgYm9yZGVyPSIwIiBhbHQ9InskZ2xvc3NhcnlUZXh0fSIgdGl0bGU9InskZ2xvc3NhcnlUZXh0fSIgLz48L2E+PC90ZD4KLQkJCTx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuR2xvc3NhcnkoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnbG9zc2FyeVRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIgLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BiYXJkaXZpZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIgLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIiAvPjwvdGQ+ICAgICAgICAgICAgICAgICAgCi0JCQk8L3hzbDppZj4KLQkJCTx4c2w6aWYgdGVzdD0iJHNob3dJbmRleD0ndHJ1ZScgIj4KLSAgCQkJPHRkPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkluZGV4KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPgotCQkJPGltZyBzcmM9Ii4vaW1hZ2VzL25pX2luZGV4LmdpZiIgd2lkdGg9IjE3IiBoZWlnaHQ9IjkiIGJvcmRlcj0iMCIgYWx0PSJ7JGluZGV4VGV4dH0iIHRpdGxlPSJ7JGluZGV4VGV4dH0iIC8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9ImphdmFzY3JpcHQ6b3BlbkluZGV4KCk7IiBjbGFzcz0idG9wcmlnaHRuYXYiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5kZXhUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BiYXJkaXZpZGVyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgIDwveHNsOmlmPgotCi0JCQk8dGQ+PGEgaHJlZj0iSmF2YVNjcmlwdDpzZW5kRmVlZGJhY2soZmVlZGJhY2tfdXJsKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+Ci0JCQk8aW1nIHNyYz0iLi9pbWFnZXMvbmlfZmVlZGJhY2suZ2lmIiB3aWR0aD0iMTgiIGhlaWdodD0iMTAiIGJvcmRlcj0iMCIgYWx0PSJ7JGZlZWRiYWNrVGV4dH0iIHRpdGxlPSJ7JGZlZWRiYWNrVGV4dH0iLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+Ci0JCQkJPGEgaHJlZj0iSmF2YVNjcmlwdDpzZW5kRmVlZGJhY2soZmVlZGJhY2tfdXJsKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRmZWVkYmFja1RleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idG9wYmFyZGl2aWRlciI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMTEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLQkJCTx0ZD48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQobnVsbCkiIGNsYXNzPSJ0b3ByaWdodG5hdiIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3BlbignYWJvdXQuaHRtJywnYWJvdXQnLCdoZWlnaHQ9MjUwLHdpZHRoPTI1MCxzdGF0dXM9bm8scmVzaXphYmxlPXllcycpOyI+Ci0gICAgICAgICAgICAgIDxpbWcgc3JjPSIuL2ltYWdlcy9uaV9hYm91dC5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMCIgYm9yZGVyPSIwIiBhbHQ9InskYWJvdXRUZXh0fSIgdGl0bGU9InskYWJvdXRUZXh0fSIvPjwvYT48L3RkPgotICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQobnVsbCkiIGNsYXNzPSJ0b3ByaWdodG5hdiIgb25jbGljaz0iamF2YXNjcmlwdDp3aW5kb3cub3BlbignYWJvdXQuaHRtJywnYWJvdXQnLCdoZWlnaHQ9MjUwLHdpZHRoPTI1MCxzdGF0dXM9bm8scmVzaXphYmxlPXllcycpOyI+JiMxNjA7PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRhYm91dFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4gCi0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIAotICA8IS0tIHRvb2xiYXIgZ29lcyBoZXJlIC0tPgotPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci0gICAgPHRyPgotICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZWJnIiA+Ci0JICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJyaWdodCIgIHN1bW1hcnk9IiI+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjUiIGhlaWdodD0iMjAiIGFsdD0iaW1hZ2UiIHRpdGxlPSJpbWFnZSIvPjwvdGQ+Ci0JCQk8dGQ+Ci0gICAgICAgICAgICA8Zm9udCBzaXplPSIxIj4KLQkJCTwvZm9udD4KLSAgICAgICAgICAgIDwvdGQ+Ci0gPHhzbDppZiB0ZXN0PSIkYWxsb3dBcHBsZXRTZWFyY2g9J3RydWUnICI+Ci0JCQk8dGQ+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIyMCIgYWx0PSJpbWFnZSIgdGl0bGU9ImltYWdlIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iOCIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblNlYXJjaCgpOyIgY2xhc3M9InRvcHJpZ2h0bmF2Ij48aW1nIHNyYz0iLi9pbWFnZXMvbmlfc2VhcmNoLmdpZiIgd2lkdGg9IjE3IiBoZWlnaHQ9IjE3IiBib3JkZXI9IjAiIGFsdD0ieyRzZWFyY2hUZXh0fSIgdGl0bGU9Inskc2VhcmNoVGV4dH0iLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+PGEgaHJlZj0iSmF2YVNjcmlwdDpvcGVuU2VhcmNoKCk7IiAgY2xhc3M9InRvcHJpZ2h0bmF2Z3JleSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRzZWFyY2hUZXh0Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIxMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkPjxpbWcgc3JjPSIuL2ltYWdlcy9zaGltLmdpZiIgd2lkdGg9IjEwIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgIDwveHNsOmlmPgotICAgIDx4c2w6aWYgdGVzdD0iJHNlcnZlclNpZGVTZWFyY2g9J3RydWUnICI+Ci0JCQk8dGQ+JiMxNjA7PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iNSIgaGVpZ2h0PSIyMCIgYWx0PSJpbWFnZSIgdGl0bGU9ImltYWdlIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCIgY2xhc3M9ImhlYWRlcm1lZGxpc3QiPiYjMTYwOzwvdGQ+Ci0JCQk8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iOCIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgICAgICAgICAgPHRkIGNsYXNzPSJ0b3BmcmFtZXNoYWRvdyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1laGlnaGxpZ2h0MiI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotCQkgICAgPHRkPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblByb2Nlc3NTZWFyY2goKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PGltZyBzcmM9Ii4vaW1hZ2VzL25pX3NlYXJjaC5naWYiIHdpZHRoPSIxNyIgaGVpZ2h0PSIxNyIgYm9yZGVyPSIwIiBhbHQ9Inskc2VhcmNoVGV4dH0iIHRpdGxlPSJ7JHNlYXJjaFRleHR9Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9IkphdmFTY3JpcHQ6b3BlblByb2Nlc3NTZWFyY2goKTsiICBjbGFzcz0idG9wcmlnaHRuYXZncmV5Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNlYXJjaFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSI1IiBoZWlnaHQ9IjExIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMTAiIGhlaWdodD0iMSIgYWx0PSIiIHRpdGxlPSIiLz48L3RkPgotICAgPC94c2w6aWY+Ci0gICAgICAgICAgICA8dGQgY2xhc3M9InRvcGZyYW1lc2hhZG93Ij48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZCBjbGFzcz0idG9wZnJhbWVoaWdobGlnaHQyIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iSmF2YVNjcmlwdDpwcmludFBhZ2UoKTsiIGNsYXNzPSJ0b3ByaWdodG5hdiI+PGltZyBzcmM9Ii4vaW1hZ2VzL25pX3ByaW50LmdpZiIgd2lkdGg9IjE2IiBoZWlnaHQ9IjE3IiBib3JkZXI9IjAiIGFsdD0ieyRwcmludFRleHR9IiB0aXRsZT0ieyRwcmludFRleHR9Ii8+PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPjxhIGhyZWY9IkphdmFTY3JpcHQ6cHJpbnRQYWdlKCk7IiAgY2xhc3M9InRvcHJpZ2h0bmF2Z3JleSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRwcmludFRleHQiLz48L2E+PC90ZD4KLSAgICAgICAgICAgIDx0ZD48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxMCIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90YWJsZT4KLQkgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgY2xhc3M9InRvcGZyYW1lc2hhZG93IiBjb2xzcGFuPSIzIj48aW1nIHNyYz0iLi9pbWFnZXMvc2hpbS5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGFsdD0iIiB0aXRsZT0iIi8+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBjbGFzcz0iYmdibGFjayIgY29sc3Bhbj0iMyI+PGltZyBzcmM9Ii4vaW1hZ2VzL3NoaW0uZ2lmIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBhbHQ9IiIgdGl0bGU9IiIvPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSA8L2Zvcm0+Ci0KLTwvYm9keT4KLQotPC9odG1sPgotCi0KLTwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhMTEwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyM2Q5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IAotIG9yZy5lY2xpcHNlLmVwZi5yY3AudWksCi0gb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWk7dmlzaWJpbGl0eTo9cmVleHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWksCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lZGl0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLnVpLmlkZSwKLSBvcmcuZWNsaXBzZS51aS5pbnRybywKLSBvcmcuZWNsaXBzZS5oZWxwLnVpLAotIG9yZy5lY2xpcHNlLmhlbHAud2ViYXBwLAotIG9yZy5lY2xpcHNlLnRvbWNhdCwKLSBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvYWJvdXQubWFwcGluZ3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRmZGRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLSMgVXN1YWxseSBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZS4KLQotMD1AYnVpbGQtSURACi0xPTEuNS4wCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MWRkYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pLFwKLSAgICAgICAgICAgICAgIHNwbGFzaC5ibXAsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi0gICAgICAgICAgICAgICAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZWQ2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbXBvc2VyLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmNvbXBvc2VyIiBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5NYWluQXBwbGljYXRpb24iIHVzZUZlYXR1cmVzPSJ0cnVlIj4KLQotICAgPGFib3V0SW5mbz4KLSAgICAgIDxpbWFnZSBwYXRoPSJpY29ucy9hYm91dC5naWYiLz4KLSAgICAgIDx0ZXh0PgotICAgICAgICAgJWFib3V0VGV4dAotICAgICAgPC90ZXh0PgotICAgPC9hYm91dEluZm8+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJkZWZhdWx0Ii8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8cHJvZ3JhbUFyZ3M+LWRhdGEgQHVzZXIuaG9tZS9FUEYvd29ya3NwYWNlLjE1ME0yIC1kZWZhdWx0bGlicmFyeSBPcGVuVVA8L3Byb2dyYW1BcmdzPgotICAgICAgPHZtQXJncz4tWG1zNjRtIC1YbXg1MTJtPC92bUFyZ3M+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPHdpbmRvd0ltYWdlcyBpMTY9Ii9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYiIGkzMj0iL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmIi8+Ci0KLSAgIDxzcGxhc2gKLSAgICAgIHN0YXJ0dXBQcm9ncmVzc1JlY3Q9IjAsMjgwLDQ1NSwxNSIKLSAgICAgIHN0YXJ0dXBNZXNzYWdlUmVjdD0iNywyMjAsNDQxLDIwIgotICAgICAgc3RhcnR1cEZvcmVncm91bmRDb2xvcj0iQzhENUVBIiAvPgotICAgPGxhdW5jaGVyIG5hbWU9ImVwZiI+Ci0gICAgICA8c29sYXJpcy8+Ci0gICAgICA8d2luIHVzZUljbz0iZmFsc2UiPgotICAgICAgICAgPGJtcC8+Ci0gICAgICA8L3dpbj4KLSAgIDwvbGF1bmNoZXI+Ci0KLSAgIDx2bT4KLSAgIDwvdm0+Ci0KLSAgIDxwbHVnaW5zPgotICAgPC9wbHVnaW5zPgotCi0gICA8ZmVhdHVyZXM+Ci0gICAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZSIgdmVyc2lvbj0iMS4yLjAucXVhbGlmaWVyIi8+Ci0gICA8L2ZlYXR1cmVzPgotCi08L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbmZpZy9yY3BfcGFja2FnaW5nL2NvbmZpZy5pbmkgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2NvbmZpZy9yY3BfcGFja2FnaW5nL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYjI5MzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9jb25maWcvcmNwX3BhY2thZ2luZy9jb25maWcuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyBFY2xpcHNlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBmaWxlCi0jIFRoaXMgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgbWVyZ2VkIGludG8gdGhlIAotIyBTeXN0ZW0gcHJvcGVydGllcyBvbiBzeXN0ZW0gc3RhcnR1cC4gIFRoZSB2YWx1ZXMgY29udHJvbCB0aGUgd2F5IHRoZSAKLSMgcnVudGltZSBpcyBzdHJ1Y3R1cmVkIGFuZCBydW5zLgotCi0jIE5vdGU6ICBPbmx5IHBsYXRmb3JtOi9iYXNlLyBhbmQgZmlsZTogVVJMcyBhcmUgc3VwcG9ydGVkLiAgSW4gZ2VuZXJhbCB0aGUgCi0jIFVSTHMgZ2l2ZW4gbWF5IGluY2x1ZGUgYSB2ZXJzaW9uIG51bWJlciAoZS5nLiwgLi4uL2xvY2F0aW9uXzEuMi4zKS4gIAotIyBJZiBhIHZlcnNpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIHN5c3RlbSBiaW5kcwotIyB0byB0aGUgbG9jYXRpb24gd2hpY2ggbWF0Y2hlcyBleGFjdGx5IG9yIHRvIHRoZSB2ZXJzaW9uZWQgbG9jYXRpb24gd2l0aCB0aGUKLSMgbGF0ZXN0IHZlcnNpb24gbnVtYmVyLiAgSWYgYSB2ZXJzaW9uIG51bWJlciBpcyBnaXZlbiB0aGVuIG9ubHkgZXhhY3QgbWF0Y2hlcwotIyBhcmUgY29uc2lkZXJlZC4KLQotIyBUaGUgVVJMIGZvciB0aGUgcnVudGltZSBlbnRyeSBwb2ludC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0jIHBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaSAKLSNvc2dpLmZyYW1ld29yaz1wbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kKLQotIyBUaGUgY2xhc3NwYXRoIGZvciB0aGUgZnJhbWV3b3JrIGZvdW5kIGF0IHRoZSBvc2dpLmZyYW1ld29yayBsb2NhdGlvbi4gIFRoaXMgCi0jIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGNvbnRhaW5zIGVpdGhlciBVUkxzIG9yIHNpbXBsZSBlbGVtZW50IG5hbWVzLiAgU2ltcGxlCi0jIG5hbWVzIGFyZSBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBpbnN0YWxsIGRpcmVjdG9yeS4gIAotIyBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBuZWVkIG5vdCBiZSBzZXQgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlIGZyYW1ld29yayBpdHNlbGYuCi0jIFZlcnNpb24gbWF0Y2ggc2VhcmNoaW5nIGlzIG5vdCBkb25lIGZvciBVUkxzIGxpc3RlZCBoZXJlLgotI29zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYXRpb25zIHRvIHNlYXJjaCBmb3IgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZSAoc3BsYXNoLmJtcCkuCi0jIEZvciBlYWNoIGxpc3QgZWxlbWVudCBhIHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHBhdHRlcm4gbmwvPGxvY2FsZT4gaXMgc2VhcmNoZWQuCi0jIFRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGZpbGUuICBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgotI29zZ2kuc3BsYXNoUGF0aD0KLQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZS4gIElmIHRoaXMgdmFsdWUgaXMgc2V0IGF0IHN5c3RlbSBzdGFydHVwIGl0IGlzIHVzZWQgCi0jIGluIGZhdm91ciBvZiB0aGUgb3NnaS5zcGxhc2hQYXRoIHNlYXJjaGluZyBvdXRsaW5lZCBhYm92ZS4gIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0IAotIyB0aGUgc2VhcmNoaW5nIGlzIGRvbmUgYW5kIHRoaXMga2V5IGlzIGJvdW5kIHRvIHRoZSByZXN1bHQgb2YgdGhlIHNlYXJjaC4KLSNvc2dpLnNwbGFzaExvY2F0aW9uID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYnVuZGxlcyB3aGljaCBhcmUgYXV0b21hdGljYWxseSBpbnN0YWxsZWQgYW5kIG9wdGlvbmFsbHkgc3RhcnRlZAotIyBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAgYW5kIHJ1bm5pbmcuICBFYWNoIGVudHJ5IGlmIG9mIHRoZSBmb3JtCi0jICAgICA8VVJMIHwgc2ltcGxlIGJ1bmRsZSBsb2NhdGlvbj5bQCBbPHN0YXJ0bGV2ZWw+XSBbIjpzdGFydCJdXQotIyBJZiB0aGUgc3RhcnRsZXZlbCBpcyBvbWl0dGVkIHRoZW4gdGhlIGZyYW1ld29yayB3aWxsIHVzZSB0aGUgZGVmYXVsdCBzdGFydCBsZXZlbCBmb3IgdGhlIGJ1bmRsZS4KLSMgSWYgdGhlICJzdGFydCIgdGFnIGlzIGFkZGVkIHRoZW4gdGhlIGJ1bmRsZSB3aWxsIGJlIG1hcmtlZCBhcyBzdGFydGVkIGFmdGVyIGJlaW5nIGluc3RhbGxlZC4KLSMgU2ltcGxlIGJ1bmRsZSBsb2NhdGlvbnMgYXJlIGludGVyZXByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgZnJhbWV3b3JrJ3MgcGFyZW50IGRpcmVjdG9yeS4KLSMgVGhlIHN0YXJ0bGV2ZWwgaW5kaWNhdGVzIHRoZSBPU0dpIHN0YXJ0IGxldmVsIGF0IHdoaWNoIHRoZSBidW5kbGUgc2hvdWxkIHJ1bi4KLSMgSWYgdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCB0aGUgc3lzdGVtIGNvbXB1dGVzIGFuIGFwcHJvcHJpYXRlIGRlZmF1bHQuCi0jb3NnaS5idW5kbGVzPW9yZy5lY2xpcHNlLmNvcmUucnVudGltZUAyOnN0YXJ0LGNvbS5pYm0ucm1jLmxpYnJhcnksb3JnLmVjbGlwc2UudWkuaWRlLG9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyLG9yZy5lY2xpcHNlLmhlbHAuYmFzZSxvcmcuZWNsaXBzZS51cGRhdGUudWksY29tLmlibS51bWEsY29tLmlibS51bWEuY29yZSxjb20uaWJtLnVtYWYuZWNvcmUsY29tLmlibS50bmd1aS5lZGl0LG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLG9yZy5lY2xpcHNlLmVtZixvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLG9yZy5lY2xpcHNlLmVtZi5lZGl0LG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLG9yZy5lY2xpcHNlLnVpLG9yZy5lY2xpcHNlLnVpLmlkZQotCi0jIFRoZSBwcm9kdWN0IHRvIHJ1bi4gIEEgZ2l2ZW4gRWNsaXBzZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG1hbnkgcHJvZHVjdHMuCi0jIFRoZSBwcm9kdWN0IGlkZW50aWZpZWQgd2lsbCBzdXBwbHkgdGhlIGJyYW5kaW5nICh3aW5kb3cgaWNvbnMsIHRpdGxlIGJhciB0ZXh0KSBldGMgCi0jIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4gIAotI2VjbGlwc2UucHJvZHVjdD1vcmcuZWNsaXBzZS5wbGF0Zm9ybQotCi0jIFRoZSBhcHBsaWNhdGlvbiB0byBydW4uICBUaGUgdmFsdWUgc3BlY2lmaWVkIGhlcmUgaXMgdGhlIGlkIG9mIHRoZSBhcHBsaWNhdGlvbiBleHRlbnNpb24KLSMgdGhlIHJ1bnRpbWUgd2lsbCBmaW5kLCBpbnN0YW50aWF0ZSBhbmQgZXhlY3V0ZSBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAuICBOb3RlIHRoYXQgdHlwaWNhbGx5IAotIyB0aGUgaWRlbnRpZmllZCBlY2xpcHNlLnByb2R1Y3QgZGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uCi1lY2xpcHNlLmFwcGxpY2F0aW9uPW9yZy5lY2xpcHNlLmVwZi5yY3AudWkuTWFpbkFwcGxpY2F0aW9uCi0KLSMgVGhlIGJ1aWxkIGlkZW50aWZpZXIKLWVjbGlwc2UuYnVpbGRJZD1NMjAwNDA5MTYxMTI1Ci0KLSMgRW5kIG9mIGZpbGUgbWFya2VyIC0gbXVzdCBiZSBoZXJlCi1lb2Y9ZW9mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9lY2xpcHNlMzIucG5nIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYWJvdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9hYm91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGI4NzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9hYm91dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2FwcGxpY2F0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYXBwbGljYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyOTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvYXBwbGljYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9lY2xpcHNlLnBuZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZWNsaXBzZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTc1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9lY2xpcHNlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZXRvb2wxNi9oZWxwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZXRvb2wxNi9oZWxwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDMwMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvaGVscC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9ldG9vbDE2L3NlYXJjaF9tZW51LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBmNWQ4My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyOTEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvaWNvbnMvZnVsbC9vYmozMi9wcm9kdWN0MzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajMyL3Byb2R1Y3QzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9mdWxsL29iajMyL3Byb2R1Y3QzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL25ld19jb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9pY29ucy9uZXdfY29uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlYTg5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL2ljb25zL25ld19jb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZGY2NzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgQ29tcG9zZXIgUkNQIFVJCi1wcm9kdWN0TmFtZT1FUEYgQ29tcG9zZXIKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIEFib3V0IHRleHQKLWFib3V0VGV4dD1FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyXG5cCi1cblwKLVZlcnNpb246IHsxfVxuXAotQnVpbGQgTGFiZWw6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbgotCi0jIENhdGVnb3J5Ci1tZXRob2RDYXRlZ29yeU5hbWU9TWV0aG9kCi0KLSMgVmlld3MKLXdlbGNvbWVWaWV3TmFtZT1XZWxjb21lCi0KLSMgQWN0aW9ucwotZ2xvYmFsQWN0aW9uU2V0PUdsb2JhbCBBY3Rpb24gU2V0Ci1uZXdBY3Rpb249Jk5ldwotbmV3QWN0aW9uVG9vbHRpcD1OZXcKLW9wZW5BY3Rpb249Jk9wZW4uLi4KLW9wZW5BY3Rpb25Ub29sdGlwPU9wZW4KLXNlYXJjaEFjdGlvbj0mU2VhcmNoLi4uCi1zZWFyY2hBY3Rpb25Ub29sdGlwPVNlYXJjaAotd2VsY29tZUFjdGlvbj0mV2VsY29tZQotd2VsY29tZUFjdGlvblRvb2xUaXA9V2VsY29tZQotCi0jIFRvb2x0aXBzCi1zaG9ydGN1dC5vdmVydmlldy50b29sdGlwPVJldHVybiB0byBPdmVydmlldyBwYWdlCi1zaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcD1SZXR1cm4gdG8gVHV0b3JpYWwgcGFnZQotc2hvcnRjdXQuZmlyc3RzdGVwcy50b29sdGlwPVJldHVybiB0byBGaXJzdCBTdGVwcyBwYWdlCi1zaG9ydGN1dC53ZWJyZXNvdXJjZXMudG9vbHRpcD1SZXR1cm4gdG8gV2ViIFJlc291cmNlcyBwYWdlICAgICAgIAotCi0jQWN0aW9uIFNldAotYWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gSGVscCBTeXN0ZW0gVG9vbGJhciBBY3Rpb25zCi1hY3Rpb25TZXQubGFiZWwgPSBIZWxwIFN5c3RlbQotc2VhcmNoQWN0aW9uLmxhYmVsID0gUyZlYXJjaCBIZWxwCi1zZWFyY2hBY3Rpb24udG9vbHRpcCA9IFNlYXJjaCBIZWxwCi1keW5hbWljSGVscEFjdGlvbi5sYWJlbCA9ICZEeW5hbWljIEhlbHAgCi1keW5hbWljSGVscEFjdGlvbi50b29sdGlwID0gRHluYW1pYyBIZWxwCi0KLSNBY3Rpdml0aWVzL0NhcGFiaWxpdGllcwotYWN0aXZpdHkuZ2VuZXJhbD1JbXBvcnQgYW5kIEV4cG9ydCBQcm9qZWN0cyBhbmQgUmVzb3VyY2VzCi1hY3Rpdml0eS5nZW5lcmFsLmRlc2M9VXNlIHRoZSBzdGFuZGFyZCBFY2xpcHNlIEltcG9ydC9FeHBvcnQgUHJvamVjdC9SZXNvdXJjZXMgY2FwYWJpbGl0aWVzLgotYWN0aXZpdHkudGVhbS5jdnM9Q1ZTIFN1cHBvcnQKLWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2M9VXNlIHRoZSBDb25jdXJyZW50IFZlcnNpb25zIFN5c3RlbSAoQ1ZTKSB0byBtYW5hZ2UgcmVzb3VyY2VzLgotYWN0aXZpdHkudGVhbT1Db3JlIFRlYW0gU3VwcG9ydAotYWN0aXZpdHkudGVhbS5kZXNjPVNoYXJlIHByb2plY3RzIHVzaW5nIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBzeXN0ZW1zLgotCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbD1HZW5lcmFsCi1hY3Rpdml0eS5jYXQuZ2VuZXJhbC5kZXNjPVVzZSB0aGUgc3RhbmRhcmQgRWNsaXBzZSBjYXBhYmlsaXRpZXMuCi1hY3Rpdml0eS5jYXQudGVhbT1UZWFtCi1hY3Rpdml0eS5jYXQudGVhbS5kZXNjPVVzZSBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgc3lzdGVtcyB0byBtYW5hZ2UgcmVzb3VyY2VzLgotCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzID0gQ2FwYWJpbGl0aWVzCi1QcmVmZXJlbmNlUGFnZXMuQ2FwYWJpbGl0aWVzLmFjdGl2aXR5TmFtZSA9ICZDYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuY2F0ZWdvcnlOYW1lID0gJkNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5hY3Rpdml0eVByb21wdEJ1dHRvbiA9ICZQcm9tcHQgd2hlbiBlbmFibGluZyBjYXBhYmlsaXRpZXMKLVByZWZlcmVuY2VQYWdlcy5DYXBhYmlsaXRpZXMuYWN0aXZpdHlQcm9tcHRCdXR0b25Ub29sdGlwID0gUHJvbXB0IHdoZW4gYSBmZWF0dXJlIGlzIGZpcnN0IHVzZWQgdGhhdCByZXF1aXJlcyBlbmFibGVtZW50IG9mIGNhcGFiaWxpdGllcwotUHJlZmVyZW5jZVBhZ2VzLkNhcGFiaWxpdGllcy5jYXB0aW9uTWVzc2FnZSA9IENhcGFiaWxpdGllcyBhbGxvdyB5b3UgdG8gZW5hYmxlIG9yIGRpc2FibGUgdmFyaW91cyBwcm9kdWN0IGNvbXBvbmVudHMuICBUaGVzZSBjYXBhYmlsaXRpZXMgYXJlIGdyb3VwZWQgYWNjb3JkaW5nIHRvIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcy4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmN2JmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9Ik1haW5BcHBsaWNhdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLk1haW5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9ImNvbXBvc2VyIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcm9kdWN0cyI+Ci0gICAgICA8cHJvZHVjdAotICAgICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVwZi5yY3AudWkuTWFpbkFwcGxpY2F0aW9uIgotICAgICAgICAgICAgbmFtZT0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciI+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9InByZWZlcmVuY2VDdXN0b21pemF0aW9uIgotICAgICAgICAgICAgICAgdmFsdWU9InBsdWdpbl9jdXN0b21pemF0aW9uLmluaSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwRm9yZWdyb3VuZENvbG9yIgotICAgICAgICAgICAgICAgdmFsdWU9IkM4RDVFQSIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJzdGFydHVwTWVzc2FnZVJlY3QiCi0gICAgICAgICAgICAgICB2YWx1ZT0iNywyMjAsNDQxLDIwIi8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9InN0YXJ0dXBQcm9ncmVzc1JlY3QiCi0gICAgICAgICAgICAgICB2YWx1ZT0iMCwyODAsNDU1LDE1Ii8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFib3V0SW1hZ2UiCi0gICAgICAgICAgICAgICB2YWx1ZT0iaWNvbnMvYWJvdXQuZ2lmIi8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFib3V0VGV4dCIKLSAgICAgICAgICAgICAgIHZhbHVlPSIlYWJvdXRUZXh0Ii8+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9IndpbmRvd0ltYWdlcyIKLSAgICAgICAgICAgICAgIHZhbHVlPSJpY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmLGljb25zL2Z1bGwvb2JqMzIvcHJvZHVjdDMyLmdpZiIvPgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJhcHBOYW1lIgotICAgICAgICAgICAgICAgdmFsdWU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgIDwvcHJvZHVjdD4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgIG5hbWU9ImVkaXQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iT3BlbiBhIG1ldGhvZCBlbGVtZW50IgotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnMub3BlbkVsZW1lbnQiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0gICAgICA8YWN0aW9uU2V0Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGlvblNldC5kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLnVpLmFjdGlvbnMiCi0gICAgICAgICAgICBsYWJlbD0iJWFjdGlvblNldC5sYWJlbCIKLSAgICAgICAgICAgIHZpc2libGU9InRydWUiPgotICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuaGVscC51aS5pbnRlcm5hbC5TZWFyY2hBY3Rpb24iCi0gICAgICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL2V0b29sMTYvc2VhcmNoX21lbnUuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkuc2VhcmNoIgotICAgICAgICAgICAgICAgbGFiZWw9IiVzZWFyY2hBY3Rpb24ubGFiZWwiCi0gICAgICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9ncm91cC5oZWxwIgotICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCi0gICAgICAgICAgICAgICB0b29sYmFyUGF0aD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmZpbGUvYnVpbGQuZ3JvdXAiCi0gICAgICAgICAgICAgICB0b29sdGlwPSIlc2VhcmNoQWN0aW9uLnRvb2x0aXAiLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5oZWxwLnVpLmludGVybmFsLkR5bmFtaWNIZWxwQWN0aW9uIgotICAgICAgICAgICAgICAgaWNvbj0iJG5sJC9pY29ucy9ldG9vbDE2L2hlbHAuZ2lmIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAudWkuZHluYW1pY0hlbHAiCi0gICAgICAgICAgICAgICBsYWJlbD0iJWR5bmFtaWNIZWxwQWN0aW9uLmxhYmVsIgotICAgICAgICAgICAgICAgbWVudWJhclBhdGg9ImhlbHAvZ3JvdXAuaGVscCIKLSAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgotICAgICAgICAgICAgICAgdG9vbGJhclBhdGg9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC5maWxlL2J1aWxkLmdyb3VwIgotICAgICAgICAgICAgICAgdG9vbHRpcD0iJWR5bmFtaWNIZWxwQWN0aW9uLnRvb2x0aXAiLz4KLSAgICAgIDwvYWN0aW9uU2V0PgotICAgPC9leHRlbnNpb24+Ci0gICAKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgICAJPGFjdGl2aXR5Ci0gCQkJaWQ9ImFjdGl2aXR5LmV4dGVybmFsdG9vbCIKLSAJCQluYW1lPSJoaWRlRXh0ZXJuYWx0b29sTWVudXMiPgotIAkJPC9hY3Rpdml0eT4KLSAJCTxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0JIAkJYWN0aXZpdHlJZD0iYWN0aXZpdHkuZXh0ZXJuYWx0b29sIgotCQkJcGF0dGVybj0ib3JnXC5lY2xpcHNlXC51aVwuZXh0ZXJuYWx0b29scy9vcmdcLmVjbGlwc2VcLnVpXC5leHRlcm5hbHRvb2xzXC5FeHRlcm5hbFRvb2xNZW51RGVsZWdhdGUuKiI+Ci0gCQk8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjZkZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9wbHVnaW5fY3VzdG9taXphdGlvbi5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1vcmcuZWNsaXBzZS51aS9ET0NLX1BFUlNQRUNUSVZFX0JBUj1UT1BfUklHSFQKLW9yZy5lY2xpcHNlLnVpL2luaXRpYWxGYXN0Vmlld0JhckxvY2F0aW9uPXJpZ2h0Ci1vcmcuZWNsaXBzZS51aS9TSE9XX1RSQURJVElPTkFMX1NUWUxFX1RBQlM9ZmFsc2UKLW9yZy5lY2xpcHNlLnVpL09QRU5fTkVXX1BFUlNQRUNUSVZFPU9QRU5fUEVSU1BFQ1RJVkVfUkVQTEFDRQotb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkvYXBwbmFtZT1FUEYKLW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQvQUNUSVZJVFlfREVUQUlMX0RJQUdSQU1fVEFTS1NfUEVSX1JPVz01Ci1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpL0FERF9ST0xFX1RBU0tTX0JPWF9CR19DT0xPUl9SR0I9MjU1LDI1NSwxNTYKLW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkvQUREX1dQX0JPWF9CR19DT0xPUl9SR0I9MjU1LDI1NSwyMDUKLW9yZy5lY2xpcHNlLnRlYW0uY29yZS9pZ25vcmVfZmlsZXM9LmxvY2tcbnRydWVcbgotb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS9QVUJMSVNIX05FV19ESUFHUkFNPXRydWUKLW9yZy5lY2xpcHNlLnVpL1NIT1dfUFJPR1JFU1NfT05fU1RBUlRVUD10cnVlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NwbGFzaC5ibXAgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NwbGFzaC5ibXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWVlNDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcGxhc2guYm1wCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQWN0aW9uQmFyQWR2aXNvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQWN0aW9uQmFyQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRlZDUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFjdGlvbkJhckFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5BdXRob3JpbmdVSUhlbHBDb250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLlZpZXdIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLk5ld1dpemFyZE1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLlVJQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnMuVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db250cmlidXRpb25JdGVtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3RvcnkuSVdvcmtiZW5jaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREVBY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JSURFQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyMjsKLQotLyoqCi0gKiBDcmVhdGVzLCBhZGRzIGFuZCBkaXNwb3NlcyB0aGUgYWN0aW9ucyBhZGRlZCB0byBhIHdvcmtiZW5jaCB3aW5kb3cuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1haW5BY3Rpb25CYXJBZHZpc29yIGV4dGVuZHMgQWN0aW9uQmFyQWR2aXNvciB7Ci0KLQkvLyBBbGwgYWN0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCBpbiBtYWtlQWN0aW9ucyBhbmQgcmVmZXJlbmNlZCBpbiB0aGUKLQkvLyBmaWxsIG1ldGhvZHMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhY3Rpb25zIGFyZW4ndCByZWNyZWF0ZWQKLQkvLyB3aGVuIGZpbGxBY3Rpb25CYXJzIGlzIGNhbGxlZCB3aXRoIEZJTExfUFJPWFkuCi0KLQkvLyBGaWxlIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV3QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBjbG9zZUFsbEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHNhdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQXNBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlQWxsQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gcmV2ZXJ0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbW92ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHJlbmFtZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBpbXBvcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBleHBvcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZXhpdEFjdGlvbjsKLQotCS8vIEVkaXQgYWN0aW9ucy4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBvcGVuRWxlbWVudEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHVuZG9BY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZWRvQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3V0QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY29weUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHBhc3RlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZGVsZXRlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gc2VsZWN0QWxsQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZmluZEFjdGlvbjsKLQotCS8vIE5hdmlnYXRlIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gZ29JbnRvQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHByZXZpb3VzQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gYmFja0FjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGZvcndhcmRBY3Rpb247Ci0KLQkvLyBXaW5kb3cgYWN0aW9ucy4KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBvcGVuTmV3V2luZG93QWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gb3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3VzdG9taXplUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBzYXZlUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiByZXNldFBlcnNwZWN0aXZlQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY2xvc2VQZXJzcGVjdGl2ZUFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIGNsb3NlQWxsUGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmVmZXJlbmNlc0FjdGlvbjsKLQotCS8vIFdpbmRvdyBuYXZpZ2F0aW9uIGFjdGlvbnMuCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dEVkaXRvckFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHByZXZpb3VzRWRpdG9yQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbmV4dFBhcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c1BhcnRBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBuZXh0UGVyc3BlY3RpdmVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBwcmV2aW91c1BlcnNwZWN0aXZlQWN0aW9uOwotCi0JLy8gSGVscCBhY3Rpb25zLgotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIHdlbGNvbWVBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBoZWxwQ29udGVudHNBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBhYm91dEFjdGlvbjsKLQotCXByb3RlY3RlZCBJV29ya2JlbmNoQWN0aW9uIG5ld1dpemFyZERyb3BEb3duQWN0aW9uOwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gbG9ja1Rvb2xCYXJBY3Rpb247Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaEFjdGlvbiBlZGl0QWN0aW9uU2V0QWN0aW9uOwotCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIG1haW5IZWxwTWVudTsKLQotCXByb3RlY3RlZCBNZW51TWFuYWdlciBtYWluRmlsZU1lbnU7Ci0KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgaW50ZXJuYWxNZW51OwotCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hXaW5kb3cgd2luZG93OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJlcgotCSAqICAgICAgICAgICAgdGhlIGFjdGlvbiBiYXIgY29uZmlndXJlcgotCSAqLwotCXB1YmxpYyBNYWluQWN0aW9uQmFyQWR2aXNvcihJQWN0aW9uQmFyQ29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyZXIpOwotCQl3aW5kb3cgPSBjb25maWd1cmVyLmdldFdpbmRvd0NvbmZpZ3VyZXIoKS5nZXRXaW5kb3coKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRkIHRoZSB3b3JrYmVuY2ggd2luZG93LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRXaW5kb3coKSB7Ci0JCXJldHVybiB3aW5kb3c7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI21ha2VBY3Rpb25zKGZpbmFsCi0JICogICAgICBJV29ya2JlbmNoV2luZG93IHdpbmRvdykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucyhmaW5hbCBJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybjsKLQotCQkvLyBDcmVhdGVzIHRoZSBhY3Rpb25zIGFuZCByZWdpc3RlcnMgdGhlbS4gUmVnaXN0ZXJpbmcgaXMgbmVlZGVkIHRvCi0JCS8vIGVuc3VyZSB0aGF0IGtleSBiaW5kaW5ncyB3b3JrLiBUaGUgY29ycmVzcG9uZGluZyBjb21tYW5kcyBrZXkKLQkJLy8gYmluZGluZ3MgYXJlIGRlZmluZWQgaW4gdGhlIHBsdWdpbi54bWwgZmlsZS4gUmVnaXN0ZXJpbmcgYWxzbwotCQkvLyBwcm92aWRlcyBhdXRvbWF0aWMgZGlzcG9zYWwgb2YgdGhlIGFjdGlvbnMgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZC4KLQotCQluZXdBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FVy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV3QWN0aW9uKTsKLQotCQljbG9zZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ0xPU0UuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGNsb3NlQWN0aW9uKTsKLQotCQljbG9zZUFsbEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuQ0xPU0VfQUxMLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZUFsbEFjdGlvbik7Ci0KLQkJc2F2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuU0FWRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoc2F2ZUFjdGlvbik7Ci0KLQkJc2F2ZUFzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5TQVZFX0FTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzYXZlQXNBY3Rpb24pOwotCi0JCXNhdmVBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkVfQUxMLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihzYXZlQWxsQWN0aW9uKTsKLQotCQlyZXZlcnRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFVkVSVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmV2ZXJ0QWN0aW9uKTsKLQotCQltb3ZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5NT1ZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihtb3ZlQWN0aW9uKTsKLQotCQlyZW5hbWVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlJFTkFNRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocmVuYW1lQWN0aW9uKTsKLQotCQlyZWZyZXNoQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRUZSRVNILmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihyZWZyZXNoQWN0aW9uKTsKLQotCQlpbXBvcnRBY3Rpb24gPSBVSUFjdGlvbkZhY3RvcnkuVUlfSU1QT1JULmNyZWF0ZSh3aW5kb3cpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGltcG9ydEFjdGlvbiwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GSUxFX0lNUE9SVF9DT05URVhUKTsKLQkJcmVnaXN0ZXIoaW1wb3J0QWN0aW9uKTsKLQotCQlleHBvcnRBY3Rpb24gPSBVSUFjdGlvbkZhY3RvcnkuVUlfRVhQT1JULmNyZWF0ZSh3aW5kb3cpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGV4cG9ydEFjdGlvbiwKLQkJCQlBdXRob3JpbmdVSUhlbHBDb250ZXh0cy5GSUxFX0VYUE9SVF9DT05URVhUKTsKLQkJcmVnaXN0ZXIoZXhwb3J0QWN0aW9uKTsKLQotCQlwcm9wZXJ0aWVzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUk9QRVJUSUVTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihwcm9wZXJ0aWVzQWN0aW9uKTsKLQotCQlleGl0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihleGl0QWN0aW9uKTsKLQotCQlvcGVuRWxlbWVudEFjdGlvbiA9IFVJQWN0aW9uRmFjdG9yeS5PUEVOX0VMRU1FTlQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG9wZW5FbGVtZW50QWN0aW9uKTsKLQotCQl1bmRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5VTkRPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcih1bmRvQWN0aW9uKTsKLQotCQlyZWRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5SRURPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihyZWRvQWN0aW9uKTsKLQotCQljdXRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNVVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoY3V0QWN0aW9uKTsKLQotCQljb3B5QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DT1BZLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihjb3B5QWN0aW9uKTsKLQotCQlwYXN0ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUEFTVEUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHBhc3RlQWN0aW9uKTsKLQotCQlkZWxldGVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkRFTEVURS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZGVsZXRlQWN0aW9uKTsKLQotCQlzZWxlY3RBbGxBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHNlbGVjdEFsbEFjdGlvbik7Ci0KLQkJZmluZEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRklORC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZmluZEFjdGlvbik7Ci0KLQkJZ29JbnRvQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5HT19JTlRPLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihnb0ludG9BY3Rpb24pOwotCi0JCW5leHRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk5FWFQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5leHRBY3Rpb24pOwotCi0JCXByZXZpb3VzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJldmlvdXNBY3Rpb24pOwotCi0JCWJhY2tBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkJBQ0suY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGJhY2tBY3Rpb24pOwotCi0JCWZvcndhcmRBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkZPUldBUkQuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGZvcndhcmRBY3Rpb24pOwotCi0JCW9wZW5OZXdXaW5kb3dBY3Rpb24gPSBBY3Rpb25GYWN0b3J5Lk9QRU5fTkVXX1dJTkRPVy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIob3Blbk5ld1dpbmRvd0FjdGlvbik7Ci0KLQkJbmV4dEVkaXRvckFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKG5leHRFZGl0b3JBY3Rpb24pOwotCi0JCXByZXZpb3VzRWRpdG9yQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19FRElUT1IuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZXZpb3VzRWRpdG9yQWN0aW9uKTsKLQotCQluZXh0UGFydEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QQVJULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihuZXh0UGFydEFjdGlvbik7Ci0KLQkJcHJldmlvdXNQYXJ0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QQVJULmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihwcmV2aW91c1BhcnRBY3Rpb24pOwotCi0JCW5leHRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuTkVYVF9QRVJTUEVDVElWRS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV4dFBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlwcmV2aW91c1BlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5QUkVWSU9VU19QRVJTUEVDVElWRQotCQkJCS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIocHJldmlvdXNQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJb3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uID0gY3JlYXRlVE5HT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKHdpbmRvdyk7Ci0JCW9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbi5zZXRUZXh0KFJDUFVJUmVzb3VyY2VzLm90aGVyTWVudUl0ZW1fdGV4dCk7Ci0JCXJlZ2lzdGVyKG9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbik7Ci0KLQkJY3VzdG9taXplUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkVESVRfQUNUSU9OX1NFVFMKLQkJCQkuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKGN1c3RvbWl6ZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlzYXZlUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LlNBVkVfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHNhdmVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0KLQkJcmVzZXRQZXJzcGVjdGl2ZUFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUkVTRVRfUEVSU1BFQ1RJVkUuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHJlc2V0UGVyc3BlY3RpdmVBY3Rpb24pOwotCi0JCWNsb3NlUGVyc3BlY3RpdmVBY3Rpb24gPSBBY3Rpb25GYWN0b3J5LkNMT1NFX1BFUlNQRUNUSVZFLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQljbG9zZUFsbFBlcnNwZWN0aXZlQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5DTE9TRV9BTExfUEVSU1BFQ1RJVkVTCi0JCQkJLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihjbG9zZUFsbFBlcnNwZWN0aXZlQWN0aW9uKTsKLQotCQlwcmVmZXJlbmNlc0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFRkVSRU5DRVMuY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHByZWZlcmVuY2VzQWN0aW9uKTsKLQotCQl3ZWxjb21lQWN0aW9uID0gVUlBY3Rpb25GYWN0b3J5LlNIT1dfSU5UUk8uY3JlYXRlKHdpbmRvdyk7Ci0JCXJlZ2lzdGVyKHdlbGNvbWVBY3Rpb24pOwotCQlJbWFnZURlc2NyaXB0b3IgaW1nRGVzID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEltYWdlRGVzY3JpcHRvcigKLQkJCQkiZnVsbC9vYmoxNi9wcm9kdWN0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JCXdlbGNvbWVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKGltZ0Rlcyk7Ci0KLQkJaGVscENvbnRlbnRzQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5IRUxQX0NPTlRFTlRTLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3RlcihoZWxwQ29udGVudHNBY3Rpb24pOwotCi0JCWFib3V0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5BQk9VVC5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoYWJvdXRBY3Rpb24pOwotCi0JCS8vIEZJWE1FISBGaWx0ZXIgb3V0IFByb2plY3QuLi4gZnJvbSB0aGUgZHJvcC1kb3duIG1lbnUuCi0JCW5ld1dpemFyZERyb3BEb3duQWN0aW9uID0gSURFQWN0aW9uRmFjdG9yeS5ORVdfV0laQVJEX0RST1BfRE9XTgotCQkJCS5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIobmV3V2l6YXJkRHJvcERvd25BY3Rpb24pOwotCi0JCWxvY2tUb29sQmFyQWN0aW9uID0gQWN0aW9uRmFjdG9yeS5MT0NLX1RPT0xfQkFSLmNyZWF0ZSh3aW5kb3cpOwotCQlyZWdpc3Rlcihsb2NrVG9vbEJhckFjdGlvbik7Ci0KLQkJZWRpdEFjdGlvblNldEFjdGlvbiA9IEFjdGlvbkZhY3RvcnkuRURJVF9BQ1RJT05fU0VUUy5jcmVhdGUod2luZG93KTsKLQkJcmVnaXN0ZXIoZWRpdEFjdGlvblNldEFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yI2ZpbGxNZW51QmFyKElNZW51TWFuYWdlcgotCSAqICAgICAgbWVudUJhcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudUJhcihJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlpZiAoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5pc0Nsb3NpbmcoKSkKLQkJCXJldHVybjsKLQkJbWFpbkZpbGVNZW51ID0gY3JlYXRlRmlsZU1lbnUobWVudUJhcik7Ci0JCW1lbnVCYXIuYWRkKG1haW5GaWxlTWVudSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZUVkaXRNZW51KG1lbnVCYXIpKTsKLQotCQlJTWVudU1hbmFnZXIgbmF2TWFuYWdlciA9IGNyZWF0ZU5hdmlnYXRlTWVudShtZW51QmFyKTsKLQkJbWVudUJhci5hZGQobmF2TWFuYWdlcik7Ci0JCW5hdk1hbmFnZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJbWVudUJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW1lbnVCYXIuYWRkKGNyZWF0ZVdpbmRvd01lbnUobWVudUJhcikpOwotCi0JCW1haW5IZWxwTWVudSA9IGNyZWF0ZUhlbHBNZW51KG1lbnVCYXIpOwotCQltZW51QmFyLmFkZChtYWluSGVscE1lbnUpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEZpbGUgbWVudSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBNZW51TWFuYWdlciBnZXRGaWxlTWVudU1hbmFnZXIoKSB7Ci0JCXJldHVybiBtYWluRmlsZU1lbnU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSGVscCBtZW51IG1hbmFnZXIuCi0JICovCi0JcHVibGljIE1lbnVNYW5hZ2VyIGdldEhlbHBNZW51TWFuYWdlcigpIHsKLQkJcmV0dXJuIG1haW5IZWxwTWVudTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLkFjdGlvbkJhckFkdmlzb3IjZmlsbENvb2xCYXIoSUNvb2xCYXJNYW5hZ2VyCi0JICogICAgICBjb29sQmFyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb29sQmFyKElDb29sQmFyTWFuYWdlciBjb29sQmFyKSB7Ci0JCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmlzQ2xvc2luZygpKQotCQkJcmV0dXJuOwotCQljb29sQmFyLmFkZChjcmVhdGVGaWxlVG9vbGJhcihjb29sQmFyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRmlsZSBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVGaWxlTWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBmaWxlTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5maWxlTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRklMRSk7Ci0JCWZpbGVNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5GSUxFX1NUQVJUKSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBOZXcgc3ViIG1lbnUsIHVzaW5nIHRoZSBzYW1lIGlkIGZvciBpdCBhcyB0aGUgTmV3IGFjdGlvbi4KLQkJU3RyaW5nIG5ld1RleHQgPSBSQ1BVSVJlc291cmNlcy5maWxlTmV3TWVudUl0ZW1fdGV4dDsKLQkJU3RyaW5nIG5ld0lkID0gQWN0aW9uRmFjdG9yeS5ORVcuZ2V0SWQoKTsKLQkJTWVudU1hbmFnZXIgbmV3TWVudSA9IG5ldyBNZW51TWFuYWdlcihuZXdUZXh0LCBuZXdJZCkgewotCQkJcHVibGljIFN0cmluZyBnZXRNZW51VGV4dCgpIHsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0TWVudVRleHQoKTsKLQkJCX0KLQkJfTsKLQkJbmV3TWVudS5hZGQobmV3IFNlcGFyYXRvcihuZXdJZCkpOwotCQluZXdNZW51LmFkZChuZXcgTmV3V2l6YXJkTWVudShnZXRXaW5kb3coKSwgbnVsbCkpOwotCQluZXdNZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCWZpbGVNZW51LmFkZChuZXdNZW51KTsKLQkJZmlsZU1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19FWFQpKTsKLQotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJTWVudU1hbmFnZXIgb3BlblN1Yk1lbnUgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMuZmlsZU9wZW5NZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuT1BFTl9FWFQpOwotCQlvcGVuU3ViTWVudQotCQkJCS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCW9wZW5TdWJNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmaWxlTWVudS5hZGQob3BlblN1Yk1lbnUpOwotCi0JCWZpbGVNZW51LmFkZChjbG9zZUFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChjbG9zZUFsbEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlmaWxlTWVudS5hZGQoc2F2ZUFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChzYXZlQXNBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQoc2F2ZUFsbEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChyZXZlcnRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKG1vdmVBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQocmVuYW1lQWN0aW9uKTsKLQkJZmlsZU1lbnUuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKGltcG9ydEFjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChleHBvcnRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKHByb3BlcnRpZXNBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZmlsZU1lbnUuYWRkKGV4aXRBY3Rpb24pOwotCQlmaWxlTWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRklMRV9FTkQpKTsKLQotCQlyZXR1cm4gZmlsZU1lbnU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgRWRpdCBtZW51LgotCSAqLwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBjcmVhdGVFZGl0TWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBlZGl0TWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5lZGl0TWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5FRElUX1NUQVJUKSk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJZWRpdE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWVkaXRNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoIm9wZW5ncm91cCIpKTsgLy8kTk9OLU5MUy0xJAotCQllZGl0TWVudS5hZGQob3BlbkVsZW1lbnRBY3Rpb24pOwotCQllZGl0TWVudS5hZGQoY3V0QWN0aW9uKTsKLQkJZWRpdE1lbnUuYWRkKGNvcHlBY3Rpb24pOwotCQllZGl0TWVudS5hZGQocGFzdGVBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZWRpdE1lbnUuYWRkKGRlbGV0ZUFjdGlvbik7Ci0JCWVkaXRNZW51LmFkZChzZWxlY3RBbGxBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZWRpdE1lbnUuYWRkKGZpbmRBY3Rpb24pOwotCQllZGl0TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuRURJVF9FTkQpKTsKLQkJcmV0dXJuIGVkaXRNZW51OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIE5hdmlnYXRlIG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZU5hdmlnYXRlTWVudShJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlNZW51TWFuYWdlciBuYXZNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLm5hdmlnYXRlTWVudUl0ZW1fdGV4dCwKLQkJCQlJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fTkFWSUdBVEUpOwotCQluYXZNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJbmF2TWVudS5hZGQoZ29JbnRvQWN0aW9uKTsKLQkJbmF2TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbmF2TWVudS5hZGQobmV4dEFjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKHByZXZpb3VzQWN0aW9uKTsKLQkJbmF2TWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbmF2TWVudS5hZGQoYmFja0FjdGlvbik7Ci0JCW5hdk1lbnUuYWRkKGZvcndhcmRBY3Rpb24pOwotCQluYXZNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5XQl9FTkQpKTsKLQkJcmV0dXJuIG5hdk1lbnU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgV2luZG93IG1lbnUuCi0JICovCi0JcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIGNyZWF0ZVdpbmRvd01lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgd2luZG93TWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy53aW5kb3dNZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9XSU5ET1cpOwotCQl3aW5kb3dNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5XQl9TVEFSVCkpOwotCQl3aW5kb3dNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQotCQlNZW51TWFuYWdlciBjaGFuZ2VQZXJzcE1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoCi0JCQkJUkNQVUlSZXNvdXJjZXMud2luZG93T3BlblBlcnNwZWN0aXZlTWVudUl0ZW1fdGV4dCwKLQkJCQkib3BlblBlcnNwZWN0aXZlIik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY2hhbmdlUGVyc3BNZW51SXRlbSA9IENvbnRyaWJ1dGlvbkl0ZW1GYWN0b3J5LlBFUlNQRUNUSVZFU19TSE9SVExJU1QKLQkJCQkuY3JlYXRlKGdldFdpbmRvdygpKTsKLQkJY2hhbmdlUGVyc3BNZW51TWdyLmFkZChjaGFuZ2VQZXJzcE1lbnVJdGVtKTsKLQkJd2luZG93TWVudS5hZGQoY2hhbmdlUGVyc3BNZW51TWdyKTsKLQkJTWVudU1hbmFnZXIgc2hvd1ZpZXdNZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLndpbmRvd1Nob3dWaWV3TWVudUl0ZW1fdGV4dCwgInNob3dWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2hvd1ZpZXdNZW51ID0gQ29udHJpYnV0aW9uSXRlbUZhY3RvcnkuVklFV1NfU0hPUlRMSVNUCi0JCQkJLmNyZWF0ZShnZXRXaW5kb3coKSk7Ci0JCXNob3dWaWV3TWVudU1nci5hZGQoc2hvd1ZpZXdNZW51KTsKLQkJd2luZG93TWVudS5hZGQoc2hvd1ZpZXdNZW51TWdyKTsKLQotCQl3aW5kb3dNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl3aW5kb3dNZW51LmFkZChjdXN0b21pemVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKHNhdmVQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKHJlc2V0UGVyc3BlY3RpdmVBY3Rpb24pOwotCQl3aW5kb3dNZW51LmFkZChjbG9zZVBlcnNwZWN0aXZlQWN0aW9uKTsKLQkJd2luZG93TWVudS5hZGQoY2xvc2VBbGxQZXJzcGVjdGl2ZUFjdGlvbik7Ci0JCXdpbmRvd01lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXdpbmRvd01lbnUuYWRkKHByZWZlcmVuY2VzQWN0aW9uKTsKLQkJd2luZG93TWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuV0JfRU5EKSk7Ci0JCXJldHVybiB3aW5kb3dNZW51OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUludGVybmFsTWVudShmaW5hbCBJTWVudU1hbmFnZXIgaGVscE1tZW51KSB7Ci0JCWludGVybmFsTWVudSA9IG5ldyBNZW51TWFuYWdlcigKLQkJCQlSQ1BVSVJlc291cmNlcy5tYWluQWN0aW9uQmFyQWR2aXNvcl9EaWFnbm9zaXMsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWludGVybmFsTWVudS5hZGQobmV3IEFjdGlvbigKLQkJCQlSQ1BVSVJlc291cmNlcy5tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaykgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVZpZXdIZWxwZXIuY2hlY2tMaWJyYXJ5SGVhbHRoKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIEhlbHAgbWVudS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgY3JlYXRlSGVscE1lbnUoSU1lbnVNYW5hZ2VyIG1lbnVCYXIpIHsKLQkJTWVudU1hbmFnZXIgaGVscE1tZW51ID0gbmV3IE1lbnVNYW5hZ2VyKAotCQkJCVJDUFVJUmVzb3VyY2VzLmhlbHBNZW51SXRlbV90ZXh0LAotCQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9IRUxQKTsKLQkJaGVscE1tZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5IRUxQX1NUQVJUKSk7Ci0JCWhlbHBNbWVudS5hZGQod2VsY29tZUFjdGlvbik7Ci0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKGhlbHBDb250ZW50c0FjdGlvbik7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC5oZWxwIikpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAuYXNzaXN0IikpOyAvLyROT04tTkxTLTEkCi0KLQkJaGVscE1tZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcigiZ3JvdXAudG9vbHMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC51cGRhdGVzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gTWVudSBpdGVtcyBmb3IgaW50ZXJuYWwgdG9vbAotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKCJncm91cC5pbnRlcm5hbCIpKTsgLy8kTk9OLU5MUy0xJAotCQljcmVhdGVJbnRlcm5hbE1lbnUoaGVscE1tZW51KTsKLQotCQloZWxwTW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCWhlbHBNbWVudS5hZGQoYWJvdXRBY3Rpb24pOwotCQloZWxwTW1lbnUuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkhFTFBfRU5EKSk7Ci0KLQkJcmV0dXJuIGhlbHBNbWVudTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBGaWxlIHRvb2xiYXIuCi0JICovCi0JcHJvdGVjdGVkIElUb29sQmFyTWFuYWdlciBjcmVhdGVGaWxlVG9vbGJhcihJQ29vbEJhck1hbmFnZXIgY29vbEJhcikgewotCQlJQWN0aW9uQmFyQ29uZmlndXJlcjIgYWN0aW9uQmFyQ29uZmlndXJlciA9IChJQWN0aW9uQmFyQ29uZmlndXJlcjIpIGdldEFjdGlvbkJhckNvbmZpZ3VyZXIoKTsKLQkJSU1lbnVNYW5hZ2VyIHBvcFVwTWVudSA9IG5ldyBNZW51TWFuYWdlcigpOwotCQlwb3BVcE1lbnUuYWRkKG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGxvY2tUb29sQmFyQWN0aW9uKSk7Ci0JCXBvcFVwTWVudS5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZWRpdEFjdGlvblNldEFjdGlvbikpOwotCQljb29sQmFyLnNldENvbnRleHRNZW51TWFuYWdlcihwb3BVcE1lbnUpOwotCi0JCWNvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJSURFQWN0aW9uQ29uc3RhbnRzLkdST1VQX0ZJTEUpKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIGZpbGVUb29sQmFyID0gYWN0aW9uQmFyQ29uZmlndXJlcgotCQkJCS5jcmVhdGVUb29sQmFyTWFuYWdlcigpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk5FV19HUk9VUCkpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3V2l6YXJkRHJvcERvd25BY3Rpb24pOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTkVXX0VYVCkpOwotCQlmaWxlVG9vbEJhci5hZGQobmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0FWRV9HUk9VUCkpOwotCQlmaWxlVG9vbEJhci5hZGQoc2F2ZUFjdGlvbik7Ci0JCWZpbGVUb29sQmFyLmFkZChzYXZlQWxsQWN0aW9uKTsKLQkJZmlsZVRvb2xCYXIuYWRkKG5ldyBHcm91cE1hcmtlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNBVkVfRVhUKSk7Ci0JCWZpbGVUb29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJcmV0dXJuIGZpbGVUb29sQmFyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGN1c3RvbSBvcGVuIHBlcnNwZWN0aXZlIGRpYWxvZwotCSAqIAotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlVE5HT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uKAotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24od2luZG93KTsKLQkJYWN0aW9uLnNldElkKCJvcGVuUGVyc3BlY3RpdmVEaWFsb2ciKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQXBwbGljYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbkFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NThjOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnV0aWxzLkNvbW1hbmRMaW5lUnVuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5MaWJyYXJ5VUlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRyb2xzIGFsbCBhc3BlY3RzIG9mIHRoZSBhcHBsaWNhdGlvbidzIGV4ZWN1dGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCQotCS8vIERhdGEgbW9kZSBjb25zdGFudHMgZm9yIHVzZXIsIGNvbmZpZ3VyYXRpb24gYW5kIGRhdGEgbG9jYXRpb25zLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIkBub25lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT19ERUZBVUxUID0gIkBub0RlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfSE9NRSA9ICJAdXNlci5ob21lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0RJUiA9ICJAdXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9VU0VSX0hPTUUgPSAidXNlci5ob21lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVVNFUl9ESVIgPSAidXNlci5kaXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0YXJ0KG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQpCi0JICovCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKGRpc3BsYXksIFNXVC5PTl9UT1ApOwotCQl0cnkgewotCQkJYm9vbGVhbiBub0xvY2sgPSBmYWxzZTsKLQkJCVN0cmluZ1tdIGFwcEFyZ3MgPSBQbGF0Zm9ybS5nZXRBcHBsaWNhdGlvbkFyZ3MoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXBwQXJncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1saWJyYXJ5IikgJiYgaSA8IChhcHBBcmdzLmxlbmd0aCAtIDEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gYXBwQXJnc1tpICsgMV07Ci0JCQkJCWxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLnNldENvbW1hbmRMaW5lTGlicmFyeShsb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGFwcEFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLWRlZmF1bHRsaWJyYXJ5IikgJiYgaSA8IChhcHBBcmdzLmxlbmd0aCAtIDEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gYXBwQXJnc1tpICsgMV07Ci0JCQkJCWxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlMaWJyYXJ5VUlNYW5hZ2VyLnNldENvbW1hbmRMaW5lRGVmYXVsdExpYnJhcnkobG9jYXRpb24pOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1ub2xvY2siKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCW5vTG9jayA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChhcHBBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1iYXRjaCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQ29tbWFuZExpbmVSdW5VdGlsLmdldEluc3RhbmNlKCkuc2V0TmVlZFRvUnVuKHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFub0xvY2sgJiYgIWNoZWNrV29ya3NwYWNlTG9jayhzaGVsbCkpIHsKLQkJCQlQbGF0Zm9ybS5lbmRTcGxhc2goKTsKLQkJCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JCQl9Ci0KLQkJCWludCByZXR1cm5Db2RlID0gY3JlYXRlV29ya2JlbmNoQWR2aXNvcihkaXNwbGF5KTsKLQkJCWlmIChyZXR1cm5Db2RlID09IFBsYXRmb3JtVUkuUkVUVVJOX1JFU1RBUlQpIHsKLQkJCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfUkVTVEFSVDsKLQkJCX0KLQkJCXJldHVybiBJQXBwbGljYXRpb24uRVhJVF9PSzsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQkJc2hlbGwuZGlzcG9zZSgpOwotCQkJfQotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uI3N0b3AoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWZpbmFsIElXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSB3b3JrYmVuY2guZ2V0RGlzcGxheSgpOwotCQlkaXNwbGF5LnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXdvcmtiZW5jaC5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgd29ya2JlbmNoIGFkdmlzb3IuCi0JICovCi0JcHJvdGVjdGVkIGludCBjcmVhdGVXb3JrYmVuY2hBZHZpc29yKERpc3BsYXkgZGlzcGxheSkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5jcmVhdGVBbmRSdW5Xb3JrYmVuY2goZGlzcGxheSwKLQkJCQluZXcgTWFpbldvcmtiZW5jaEFkdmlzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRoZSB3b3Jrc3BhY2UgbG9jayB0aGF0IGlzIHVzZWQgdG8gcHJldmVudCBhIGxpYnJhcnkgYmVlbiBvcGVuZWQKLQkgKiBtdWx0aXBsZSB0aW1lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1dvcmtzcGFjZUxvY2soU2hlbGwgc2hlbGwpIHsKLQkJTG9jYXRpb24gd29ya3NwYWNlTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRJbnN0YW5jZUxvY2F0aW9uKCk7Ci0JCVN0cmluZyBhcHBOYW1lID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpLmdldE5hbWUoKTsKLQkJdHJ5IHsKLQkJCWlmICh3b3Jrc3BhY2VMb2NhdGlvbi5sb2NrKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBOTFMuYmluZCgKLQkJCQkJUkNQVUlSZXNvdXJjZXMud29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlLCBhcHBOYW1lKSwgTkxTCi0JCQkJCS5iaW5kKFJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlLCBhcHBOYW1lKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVJDUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcigKLQkJCQkJTkxTCi0JCQkJCQkJLmJpbmQoUkNQVUlSZXNvdXJjZXMud29ya3NwYWNlQ2Fubm90TG9ja01lc3NhZ2UsCi0JCQkJCQkJCQlhcHBOYW1lKSwgZSk7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbihzaGVsbCwgTkxTLmJpbmQoCi0JCQkJCVJDUFVJUmVzb3VyY2VzLndvcmtzcGFjZUNhbm5vdExvY2tUaXRsZSwgYXBwTmFtZSksIGUKLQkJCQkJLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogdGFrZW4gZnJvbSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5Mb2NhdGlvbk1hbmFnZXIuYnVpbGRMb2NhdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyB0cmltbWVkTG9jYXRpb24gPSBsb2NhdGlvbi50cmltKCk7Ci0JCVN0cmluZyByZXN1bHQgPSB0cmltbWVkTG9jYXRpb247Ci0JCWlmICh0cmltbWVkTG9jYXRpb24uZXF1YWxzSWdub3JlQ2FzZShOT05FKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodHJpbW1lZExvY2F0aW9uLmVxdWFsc0lnbm9yZUNhc2UoTk9fREVGQVVMVCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRyaW1tZWRMb2NhdGlvbi5zdGFydHNXaXRoKFVTRVJfSE9NRSkpIHsKLQkJCVN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVVNFUl9IT01FLCBQUk9QX1VTRVJfSE9NRSk7Ci0JCQlyZXN1bHQgPSBuZXcgRmlsZShiYXNlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfSBlbHNlIGlmICh0cmltbWVkTG9jYXRpb24uc3RhcnRzV2l0aChVU0VSX0RJUikpIHsKLQkJCVN0cmluZyBiYXNlID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVVNFUl9ESVIsIFBST1BfVVNFUl9ESVIpOwotCQkJcmVzdWx0ID0gbmV3IEZpbGUoYmFzZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN1YnN0aXR1dGVWYXIoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHZhciwgU3RyaW5nIHByb3ApIHsKLQkJU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3AsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gdmFsdWUgKyBzb3VyY2Uuc3Vic3RyaW5nKHZhci5sZW5ndGgoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hBZHZpc29yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL01haW5Xb3JrYmVuY2hBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMjk5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoQWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS51dGlscy5Db21tYW5kTGluZVJ1blV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmlkZS5JREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUubW9kZWwuV29ya2JlbmNoQWRhcHRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDcmVhdGVzIHRoZSB3aW5kb3cgYWR2aXNvciBhbmQgc3BlY2lmaWVzIHRoZSBwZXJzcGVjdGl2ZSBpZCBmb3IgdGhlIGluaXRpYWwKLSAqIHdpbmRvdy4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluV29ya2JlbmNoQWR2aXNvciBleHRlbmRzIFdvcmtiZW5jaEFkdmlzb3IgewotCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQlwcml2YXRlIHZvaWQgZGVjbGFyZVdvcmtiZW5jaEltYWdlKEJ1bmRsZSBpZGVCdW5kbGUsIFN0cmluZyBzeW1ib2xpY05hbWUsCi0JCQlTdHJpbmcgcGF0aCwgYm9vbGVhbiBzaGFyZWQpIHsKLQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoaWRlQnVuZGxlLCBuZXcgUGF0aChwYXRoKSwgbnVsbCk7Ci0JCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKLQkJZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpLmRlY2xhcmVJbWFnZShzeW1ib2xpY05hbWUsIGRlc2MsIHNoYXJlZCk7Ci0JfQotCi0JLyoqCi0JICogRGVjbGFyZXMgYWxsIElERS1zcGVjaWZpYyB3b3JrYmVuY2ggaW1hZ2VzIHRoYXQgYXJlIHVzZWQgYnkgc29tZSBidW5kbGVkCi0JICogcGx1Z2lucwotCSAqIAotCSAqIEBzZWUgSVdvcmtiZW5jaENvbmZpZ3VyZXIjZGVjbGFyZUltYWdlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlY2xhcmVXb3JrYmVuY2hJbWFnZXMoKSB7Ci0JCWZpbmFsIFN0cmluZyBJQ09OU19QQVRIID0gIiRubCQvaWNvbnMvZnVsbC8iOy8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIFBBVEhfT0JKRUNUID0gSUNPTlNfUEFUSCArICJvYmoxNi8iOyAvLyBNb2RlbCBvYmplY3QgLy8gaWNvbnMvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBQQVRIX0VUT09MID0gSUNPTlNfUEFUSCArICJldG9vbDE2LyI7IC8vIEVuYWJsZWQgdG9vbGJhciBpY29ucy4vLyROT04tTkxTLTEkCi0KLQkJQnVuZGxlIGlkZUJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UudWkuaWRlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLCBJREUuU2hhcmVkSW1hZ2VzLklNR19PQkpfUFJPSkVDVCwKLQkJCQlQQVRIX09CSkVDVCArICJwcmpfb2JqLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0JCQkJSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1RfQ0xPU0VELCBQQVRIX09CSkVDVAotCQkJCQkJKyAiY3Byal9vYmouZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0VSUk9SX1BBVEgsIFBBVEhfT0JKRUNUCi0JCQkJCQkrICJlcnJvcl90c2suZ2lmIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlKGlkZUJ1bmRsZSwKLQkJCQlJREVJbnRlcm5hbFdvcmtiZW5jaEltYWdlcy5JTUdfT0JKU19XQVJOSU5HX1BBVEgsIFBBVEhfT0JKRUNUCi0JCQkJCQkrICJ3YXJuX3Rzay5naWYiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlkZWNsYXJlV29ya2JlbmNoSW1hZ2UoaWRlQnVuZGxlLAotCQkJCUlERUludGVybmFsV29ya2JlbmNoSW1hZ2VzLklNR19PQkpTX0lORk9fUEFUSCwgUEFUSF9PQkpFQ1QKLQkJCQkJCSsgImluZm9fdHNrLmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkICAJICAJCi0JCWRlY2xhcmVXb3JrYmVuY2hJbWFnZShpZGVCdW5kbGUsCi0JCQkJSURFSW50ZXJuYWxXb3JrYmVuY2hJbWFnZXMuSU1HX0VUT09MX1BST0JMRU1fQ0FURUdPUlksCi0JCQkJUEFUSF9FVE9PTCArICJwcm9ibGVtX2NhdGVnb3J5LmdpZiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaEFkdmlzb3IjaW5pdGlhbGl6ZShJV29ya2JlbmNoQ29uZmlndXJlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElXb3JrYmVuY2hDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJbG9nZ2VyID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQlzdXBlci5pbml0aWFsaXplKGNvbmZpZ3VyZXIpOwotCQljb25maWd1cmVyLnNldFNhdmVBbmRSZXN0b3JlKHRydWUpOwotCi0JCS8vIFJlbWVtYmVyIHRoZSBpbnN0YWxsIGRpciBhbmQgaGFuZGxlIHRoZSAtbGlicmFyeSBjb21tYW5kIGxpbmUKLQkJLy8gcGFyYW1ldGVyLgotCQlTdHJpbmcgYXBwU3RhcnREaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKLQkJbG9nZ2VyLmxvZ0luZm8oUkNQVUlSZXNvdXJjZXMuc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dCArIGFwcFN0YXJ0RGlyKTsgCi0KLQkJZGVjbGFyZVdvcmtiZW5jaEltYWdlcygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI2NyZWF0ZVdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIpCi0JICovCi0JcHVibGljIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgY3JlYXRlV29ya2JlbmNoV2luZG93QWR2aXNvcigKLQkJCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJcmV0dXJuIG5ldyBNYWluV29ya2JlbmNoV2luZG93QWR2aXNvcihjb25maWd1cmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpIHsKLQkJaWYgKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuaXNDbG9zaW5nKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3ByZVN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVN0YXJ0dXAoKSB7Ci0JCXN1cGVyLnByZVN0YXJ0dXAoKTsKLQkJV29ya2JlbmNoQWRhcHRlckJ1aWxkZXIucmVnaXN0ZXJBZGFwdGVycygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3ByZVNodXRkb3duKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcmVTaHV0ZG93bigpIHsKLQkJLy8gUmVtZW1iZXIgd2hldGhlciB0aGUgd2VsY29tZSB2aWV3IGV4aXN0cyBvciBub3QgYmVmb3JlIGV4aXRpbmcuCi0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKGFjdGl2ZVdpbmRvdyAhPSBudWxsKSB7Ci0KLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCWlmIChwYWdlIGluc3RhbmNlb2YgV29ya2JlbmNoUGFnZSkgewotCQkJCQlJVmlld1JlZmVyZW5jZVtdIHZ3UmVmTGlzdCA9IHBhZ2UuZ2V0Vmlld1JlZmVyZW5jZXMoKTsKLQotCQkJCQlib29sZWFuIGludHJvVmlld0V4aXN0cyA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZ3UmVmTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHZ3UmVmTGlzdFtpXS5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJIm9yZy5lY2xpcHNlLnVpLmludGVybmFsLmludHJvdmlldyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpbnRyb1ZpZXdFeGlzdHMgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJCS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCQkJc3RvcmUKLQkJCQkJCQkuc2V0VmFsdWUoCi0JCQkJCQkJCQkid2VsY29tZV9pbnRyb192aWV3X2V4aXN0cyIsIGludHJvVmlld0V4aXN0cyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwb3N0U2h1dGRvd24oKQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RTaHV0ZG93bigpIHsKLQkJdHJ5IHsKLQkJCS8vIFNhdmUgdGhlIHdvcmtzcGFjZSBhbmQgcmVtb3ZlIC5zbmFwIGZpbGUgaW4gdGhlCi0JCQkvLyB3b3Jrc3BhY2VcLm1ldGFkYXRhXC5wbHVnaW5zXG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIGZvbGRlci4KLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5zYXZlKHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hBZHZpc29yI3Bvc3RTdGFydHVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3N0U3RhcnR1cCgpIHsKLQkJQ29tbWFuZExpbmVSdW5VdGlsIHJ1blV0aWwgPSBDb21tYW5kTGluZVJ1blV0aWwuZ2V0SW5zdGFuY2UoKTsKLQkJaWYgKHJ1blV0aWwuaXNOZWVkVG9SdW4oKSkgewotCQkJcnVuVXRpbC5leGVjdXRlKFBsYXRmb3JtLmdldEFwcGxpY2F0aW9uQXJncygpKTsKLQotCQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBnZXRXb3JrYmVuY2hDb25maWd1cmVyKCkKLQkJCQkJLmdldFdvcmtiZW5jaCgpOwotCQkJd29ya2JlbmNoLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJd29ya2JlbmNoLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlzdXBlci5wb3N0U3RhcnR1cCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoV2luZG93QWR2aXNvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9NYWluV29ya2JlbmNoV2luZG93QWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M2MTIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNwZWN0aXZlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5Xb3JrYmVuY2hFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uQWN0aW9uQmFyQWR2aXNvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JQWN0aW9uQmFyQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoQ29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5JV29ya2JlbmNoV2luZG93Q29uZmlndXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLkFjdGlvblNldENvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuUGx1Z2luQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRyby5JSW50cm9QYXJ0OwotCi0vKioKLSAqIFRoZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyB3b3JrYmVuY2ggd2luZG93IGFkdmlzb3IuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKiBmaXggdG8gaGlkZSB0aGUgd29ya2luZyBzZXQgYW5kIGV4dGVybmFsIHRvb2wgYmFyIGJ1dHRvbnMgQCAyMDA3LTA2LTE0Ci0gKi8KLXB1YmxpYyBjbGFzcyBNYWluV29ya2JlbmNoV2luZG93QWR2aXNvciBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmdbXSBmaWxlTWVudVJlbW92YWxMaXN0ID0gewotCQkJIm9yZy5lY2xpcHNlLnVpLm9wZW5Mb2NhbEZpbGUiLCAvLyROT04tTkxTLTEkCi0JCQkib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0Lm5ld1RleHRFZGl0b3IiLCAvLyROT04tTkxTLTEkCi0JCQkib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0Lm9wZW5FeHRlcm5hbEZpbGUiLCAvLyROT04tTkxTLTEkCi0JCQkiY29udmVyc3RMaW5lRGVsaW1pdGVyc1RvIiAvLyROT04tTkxTLTEkCi0JfTsKLQotCXByb3RlY3RlZCBNYWluQWN0aW9uQmFyQWR2aXNvciBtYWluQWN0aW9uQmFyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCUFOTk9UQVRJT05OQVZJR0FUSU9OX0lECQk9ICJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlXT1JLSU5HU0VUQUNUSU9OU0VUX0lECQk9ICJvcmcuZWNsaXBzZS51aS5Xb3JraW5nU2V0QWN0aW9uU2V0IjsJCQkJCQkJLy8kTk9OLU5MUy0xJAotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCUVYVEVSTkFMVE9PTFNTRVRfSUQJCQk9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbHNTZXQiOwkJCQkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJUGVyc3BlY3RpdmVMaXN0ZW5lciBwZXJzcGVjdGl2ZUxpc3RlbmVyID0gbmV3IElQZXJzcGVjdGl2ZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwZXJzcGVjdGl2ZUNoYW5nZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlLCBTdHJpbmcgY2hhbmdlSWQpIHsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGVyc3BlY3RpdmVBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSwKLQkJCQlJUGVyc3BlY3RpdmVEZXNjcmlwdG9yIHBlcnNwZWN0aXZlKSB7Ci0JCQkvLyBkbyBub3Qgc2hvdyB0aGUgV29ya2luZ1NldHNhY3Rpb25TZXQgdG9vbGJhciBidXR0b25zCi0JCQlwYWdlLmhpZGVBY3Rpb25TZXQoV09SS0lOR1NFVEFDVElPTlNFVF9JRCk7IAotCQkJLy8gZG8gbm90IHNob3cgdGhlIEV4dGVybmFsIFRvb2xzIGJ1dHRvbiBvbiB0aGUgdG9vbGJhcgotLy8JCQlwYWdlLmhpZGVBY3Rpb25TZXQoRVhURVJOQUxUT09MU1NFVF9JRCk7Ci0JCQlwYWdlLmhpZGVBY3Rpb25TZXQoQU5OT1RBVElPTk5BVklHQVRJT05fSUQpOwkKLQkJfQotCX07Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJlcgotCSAqICAgICAgICAgICAgQW4gb2JqZWN0IGZvciBjb25maWd1cmluZyB0aGUgd29ya2JlbmNoIHdpbmRvdy4KLQkgKi8KLQlwdWJsaWMgTWFpbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoSVdvcmtiZW5jaFdpbmRvd0NvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlzdXBlcihjb25maWd1cmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IjY3JlYXRlQWN0aW9uQmFyQWR2aXNvcihJQWN0aW9uQmFyQ29uZmlndXJlcikKLQkgKi8KLQlwdWJsaWMgQWN0aW9uQmFyQWR2aXNvciBjcmVhdGVBY3Rpb25CYXJBZHZpc29yKAotCQkJSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQltYWluQWN0aW9uQmFyID0gbmV3IE1haW5BY3Rpb25CYXJBZHZpc29yKGNvbmZpZ3VyZXIpOwotCQlyZXR1cm4gbWFpbkFjdGlvbkJhcjsKLQl9Ci0KLQkvKioKLQkgKiBhZGQgb3BlcmF0aW9ucyB0byBiZSBwZXJmb3JtZWQgYXQgcG9zdFdpbmRvd0NyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RXaW5kb3dDcmVhdGUoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCU9iamVjdCBkYXRhID0gY29uZmlndXJlci5nZXREYXRhKCJpc1Jlc3RvcmVkV29ya2JlbmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJY29uZmlndXJlci5nZXRXaW5kb3coKS5nZXRTaGVsbCgpLnNldExvY2F0aW9uKDMwLCAzMCk7Ci0JCQljb25maWd1cmVyLmdldFdpbmRvdygpLmdldFNoZWxsKCkuc2V0U2l6ZSgxMDI0LCA3NjApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5Xb3JrYmVuY2hXaW5kb3dBZHZpc29yI3ByZVdpbmRvd09wZW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHByZVdpbmRvd09wZW4oKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd0Nvb2xCYXIodHJ1ZSk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd1BlcnNwZWN0aXZlQmFyKHRydWUpOwotCQljb25maWd1cmVyLnNldFNob3dTdGF0dXNMaW5lKHRydWUpOwotCQljb25maWd1cmVyLnNldFNob3dQcm9ncmVzc0luZGljYXRvcih0cnVlKTsKLQkJY29uZmlndXJlci5zZXRUaXRsZShSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RyaW5nKCJwcm9kdWN0TmFtZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uV29ya2JlbmNoQWR2aXNvciNwb3N0V2luZG93T3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgcG9zdFdpbmRvd09wZW4oKSB7Ci0JCWlmIChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmlzQ2xvc2luZygpKSAgICAgCi0JCQlyZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCWNvbmZpZ3VyZXIuZ2V0V2luZG93KCkuZ2V0U2hlbGwoKS5zZXRJbWFnZSgKLQkJCQlSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U2hhcmVkSW1hZ2UoImZ1bGwvb2JqMTYvcHJvZHVjdC5naWYiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlNZW51TWFuYWdlciBmaWxlTW1lbnUgPSBtYWluQWN0aW9uQmFyLmdldEZpbGVNZW51TWFuYWdlcigpOwotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zID0gZmlsZU1tZW51LmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChuZWVkVG9SZW1vdmVGcm9tKGl0ZW1zW2ldLmdldElkKCksIGZpbGVNZW51UmVtb3ZhbExpc3QpKQotCQkJCWZpbGVNbWVudS5yZW1vdmUoaXRlbXNbaV0pOwotCQl9Ci0KLQkJLy8gdGhpcyBpcyBhIGhhY2sgdG8gY2hhbmdlIHRoZSBIZWxwIHwgU29mdHdhcmUgVXBkYXRlcyB8IE1hbmFnZQotCQkvLyBDb25maWd1cmF0aW9ucyB0byBNYW5hZ2UgU29mdHdhcmUgQ29uZmlndXJhdGlvbi4uLgotCQlNZW51TWFuYWdlciBoZWxwTW1lbnUgPSBtYWluQWN0aW9uQmFyLmdldEhlbHBNZW51TWFuYWdlcigpOwotCQlpdGVtcyA9IGhlbHBNbWVudS5nZXRJdGVtcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXRlbXNbaV0gaW5zdGFuY2VvZiBBY3Rpb25TZXRDb250cmlidXRpb25JdGVtKSB7Ci0JCQkJQWN0aW9uU2V0Q29udHJpYnV0aW9uSXRlbSBlbGVtZW50ID0gKEFjdGlvblNldENvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW1zW2ldOwotCQkJCWlmIChlbGVtZW50LmdldElkKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUudWkudXBkYXRlTWVudSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gY29udHJpYk1lbnVNZ3IgPSBlbGVtZW50LmdldElubmVySXRlbSgpOwotCQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIHN1Yk1lbnVJdGVtcyA9ICgoTWVudU1hbmFnZXIpIGNvbnRyaWJNZW51TWdyKQotCQkJCQkJCS5nZXRJdGVtcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN1Yk1lbnVJdGVtcy5sZW5ndGg7IGorKykgewotCQkJCQkJSUNvbnRyaWJ1dGlvbkl0ZW0gaW5uZXJJdGVtID0gKChBY3Rpb25TZXRDb250cmlidXRpb25JdGVtKSBzdWJNZW51SXRlbXNbal0pCi0JCQkJCQkJCS5nZXRJbm5lckl0ZW0oKTsKLQkJCQkJCWlmIChpbm5lckl0ZW0gaW5zdGFuY2VvZiBQbHVnaW5BY3Rpb25Db250cmlidXRpb25JdGVtCi0JCQkJCQkJCSYmIGlubmVySXRlbS5nZXRJZCgpLmVxdWFscygKLQkJCQkJCQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLmNvbmZpZ01hbmFnZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKFBsdWdpbkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGlubmVySXRlbSkKLQkJCQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQkJCQlhY3Rpb24KLQkJCQkJCQkJCS5zZXRUZXh0KFJDUFVJUmVzb3VyY2VzLm1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dCk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmFkZFBlcnNwZWN0aXZlTGlzdGVuZXIocGVyc3BlY3RpdmVMaXN0ZW5lcik7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJLy8gZG8gbm90IHNob3cgdGhlIFdvcmtpbmdTZXRzYWN0aW9uU2V0IHRvb2xiYXIgYnV0dG9ucwotCQlwYWdlLmhpZGVBY3Rpb25TZXQoV09SS0lOR1NFVEFDVElPTlNFVF9JRCk7IAotCQkvLyBkbyBub3Qgc2hvdyB0aGUgRXh0ZXJuYWwgVG9vbHMgYnV0dG9uIG9uIHRoZSB0b29sYmFyCi0vLwkJcGFnZS5oaWRlQWN0aW9uU2V0KEVYVEVSTkFMVE9PTFNTRVRfSUQpOwotCQlwYWdlLmhpZGVBY3Rpb25TZXQoQU5OT1RBVElPTk5BVklHQVRJT05fSUQpOwkKLQkJCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb1JlbW92ZUZyb20oU3RyaW5nIGlkLCBTdHJpbmdbXSBsaXN0KSB7Ci0JCWJvb2xlYW4gcmMgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsaXN0W2ldLmVxdWFscyhpZCkpIHsKLQkJCQlyYyA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qKgotCSAqIGFkZCBjdXN0b20gb3BlcmF0aW9ucyBhdCBwb3N0V2luZG93UmVzdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIHBvc3RXaW5kb3dSZXN0b3JlKCkgdGhyb3dzIFdvcmtiZW5jaEV4Y2VwdGlvbiB7Ci0JCUlXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIgPSBnZXRXaW5kb3dDb25maWd1cmVyKCk7Ci0JCWNvbmZpZ3VyZXIuc2V0RGF0YSgiaXNSZXN0b3JlZFdvcmtiZW5jaCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JLyoqCi0JKiBDdXN0b21pemUgb3BlbkludHJvIHRvIGF2b2lkIGFuIEVjbGlwc2UgYnVnCi0JKiBDdXN0b21pemVzIGl0IHNvIGl0IHdpbGwgb3BlbiBpbiB0aGUgc3RhbmRieSBtb2RlIGlmIHRoaXMgaXMgYSByZXN0b3JlZAotCSogc2Vzc2lvbiBhbmQgdGhlIGxhc3Qgc2Vzc2lvbiBoYWQgdGhlIEludHJvVmlldyBvcGVuLCBvdGhlcndpc2UgY2xvc2UgaXQKLQkqIAotCSovCi0JcHVibGljIHZvaWQgb3BlbkludHJvKCkgewotCQlzdXBlci5vcGVuSW50cm8oKTsKLQotCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotCQlPYmplY3QgZGF0YSA9IGNvbmZpZ3VyZXIuZ2V0RGF0YSgiaXNSZXN0b3JlZFdvcmtiZW5jaCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCS8vIGlmIG5vdCByZXN0b3JlZCB3b3Jrc3BhY2UsIGp1c3QgZXhlYyB0aGUgZGVmYXVsdCBpbiBzdXBlci4KLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGFsd2F5cyBhbGxvd3MgdGhlIGludHJvIHZpZXcgdG8gb3BlbiBmaXJzdCwgYW5kIHRoZW4gcHV0IGl0IGludG8KLQkJLy8gc3RhbmRieSBtb2RlCi0JCS8vIG90aGVyd2lzZSBvdGhlciBmYXN0IHZpZXdzIHN1Y2ggYXMgc2VhcmNoIGhlbHAgd2lsbCBiZSBvcGVuLWVkIGFzCi0JCS8vIGZ1bGwgbW9kZQotCQkvLyBldmVuIHRoZSB3ZWxjb21lIHBhZ2UgaXMgY2xvc2VkLgotCQkvLyBpZiAoaXNJbnRyb1ZpZXdFeGlzdHNJbkxhc3RTZXNzaW9uKCkpIHsKLQkJSVdvcmtiZW5jaENvbmZpZ3VyZXIgd2JDb25maWcgPSBnZXRXaW5kb3dDb25maWd1cmVyKCkKLQkJCQkuZ2V0V29ya2JlbmNoQ29uZmlndXJlcigpOwotCQlJSW50cm9QYXJ0IGludHJvUGFydCA9IHdiQ29uZmlnLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpCi0JCQkJLmdldEludHJvKCk7Ci0JCXdiQ29uZmlnLmdldFdvcmtiZW5jaCgpLmdldEludHJvTWFuYWdlcigpLnNldEludHJvU3RhbmRieShpbnRyb1BhcnQsCi0JCQkJdHJ1ZSk7Ci0JCS8vIH0gZWxzZSB7Ci0JCWlmICghaXNJbnRyb1ZpZXdFeGlzdHNJbkxhc3RTZXNzaW9uKCkpIHsKLQkJCWNsb3NlSW50cm9WaWV3KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnRyb1ZpZXdFeGlzdHNJbkxhc3RTZXNzaW9uKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUkNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gc3RvcmUuZ2V0Qm9vbGVhbigid2VsY29tZV9pbnRyb192aWV3X2V4aXN0cyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlSW50cm9WaWV3KCkgewotCQl0cnkgewotCQkJSVZpZXdQYXJ0IHZwID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmZpbmRWaWV3KAotCQkJCQkJCSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pbnRyb3ZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKQotCQkJCQkuZ2V0QWN0aXZlUGFnZSgpLmhpZGVWaWV3KHZwKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhZDNmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1JDUFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUkNQIFVJIHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUkNQVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUkNQVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUkNQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBSQ1BVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9SQ1BVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ4YWZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUkNQVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGZpbmFsIGNsYXNzIFJDUFVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFJDUFVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgUkNQVUlSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsZU5ld01lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlT3Blbk1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0TWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hdmlnYXRlTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaE1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWd1cmF0aW9uTWVudUl0ZW1fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdpbmRvd01lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aW5kb3dPcGVuUGVyc3BlY3RpdmVNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2luZG93U2hvd1ZpZXdNZW51SXRlbV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaGVscE1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXdEcm9wRG93bl90b29sdGlwX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvdGhlck1lbnVJdGVtX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmVBY3Rpb25fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9wZW5Ccm93c2luZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlZGl0QWN0aW9uX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1cGdyYWRlTGlicmFyeUFjdGlvbl90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RhcnR1cF9kaXJfbG9nX2luZm9fdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtzcGFjZUNhbm5vdExvY2tUaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFpbkFjdGlvbkJhckFkdmlzb3JfRGlhZ25vc2lzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFpbkFjdGlvbkJhckFkdmlzb3JfSGVhbHRoQ2hlY2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSQ1BVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTMwNjcyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIEZpbGUgTWVudQotZmlsZU1lbnVJdGVtX3RleHQ9JkZpbGUKLWZpbGVOZXdNZW51SXRlbV90ZXh0PSZOZXcKLWZpbGVPcGVuTWVudUl0ZW1fdGV4dD1PJnBlbgotCi0jIEVkaXQgTWVudQotZWRpdE1lbnVJdGVtX3RleHQ9JkVkaXQKLQotIyBOYXZpZ2F0ZSBNZW51Ci1uYXZpZ2F0ZU1lbnVJdGVtX3RleHQ9Jk5hdmlnYXRlCi0KLSMgU2VhcmNoIE1lbnUKLXNlYXJjaE1lbnVJdGVtX3RleHQ9JlNlYXJjaAotCi0jIENvbmZpZ3VyYXRpb24gTWVudQotY29uZmlndXJhdGlvbk1lbnVJdGVtX3RleHQ9JkNvbmZpZ3VyYXRpb24KLQotIyBXaW5kb3cgTWVudQotd2luZG93TWVudUl0ZW1fdGV4dD0mV2luZG93Ci13aW5kb3dPcGVuUGVyc3BlY3RpdmVNZW51SXRlbV90ZXh0PSZPcGVuIFBlcnNwZWN0aXZlCi13aW5kb3dTaG93Vmlld01lbnVJdGVtX3RleHQ9U2hvdyAmVmlldwotCi0jIEhlbHAgTWVudQotaGVscE1lbnVJdGVtX3RleHQ9JkhlbHAKLQotIyBOZXcgRHJvcCBEb3duIE1lbnUKLW5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dD1OZXcKLW90aGVyTWVudUl0ZW1fdGV4dD1PdGhlci4uLgotCi0jIE9wZW4gUGVyc3BlY3RpdmUgQWN0aW9ucwotb3BlbkF1dGhvcmluZ1BlcnNwZWN0aXZlQWN0aW9uX3RleHQ9QXV0aG9yaW5nCi1vcGVuQnJvd3NpbmdQZXJzcGVjdGl2ZUFjdGlvbl90ZXh0PUJyb3dzaW5nCi0KLSMgTWlzYyBBY3Rpb25zCi1lZGl0QWN0aW9uX3RleHQ9JkVkaXQKLXVwZ3JhZGVMaWJyYXJ5QWN0aW9uX3RleHQ9VXBncmFkZSBNZXRob2QgTGlicmFyeSBmcm9tIEkxIHRvIEkyLi4uCi0KLXN0YXJ0dXBfZGlyX2xvZ19pbmZvX3RleHQ9SU5GTzogQXBwbGljYXRpb24gc3RhcnQgZGlyZWN0b3J5ID0KLW1lbnVfaGVscF9zb2Z0d2FyZV91cGRhdGVzX21hbmFnZV9zb2Z0d2FyZV9jb25maWdfdGV4dD0mTWFuYWdlIFNvZnR3YXJlIENvbmZpZ3VyYXRpb24uLi4KLQotd29ya3NwYWNlQ2Fubm90TG9ja1RpdGxlPUNhbm5vdCBzdGFydCB7MH0KLXdvcmtzcGFjZUNhbm5vdExvY2tNZXNzYWdlPXswfSBjYW5ub3QgYmUgc3RhcnRlZCB3aGlsZSBhbm90aGVyIGluc3RhbmNlIGlzIHJ1bm5pbmcuICBTd2l0Y2ggdG8gdGhlIHJ1bm5pbmcgaW5zdGFuY2Ugb3IgY2xvc2UgaXQgYW5kIHJlc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGFnYWluLgotbWFpbkFjdGlvbkJhckFkdmlzb3JfRGlhZ25vc2lzPURpYWdub3NpcyBhbmQgUmVwYWlyIFRvb2xzCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9IZWFsdGhDaGVjaz1QZXJmb3JtIEhlYWx0aCBDaGVjayBvbiBMaWJyYXJ5Li4uCi1tYWluQWN0aW9uQmFyQWR2aXNvcl9SZW1vdmVSZWZlcmVuY2U9UmVtb3ZlIFJlZmVyZW5jZXMgdG8gSW52YWxpZCBPYmplY3RzLi4uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZjkyZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0FjdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi0vKioKLSAqIERlZmluZXMgdGhlIG1lbnUgYW5kIHRvb2xiYXIgcGF0aHMgZm9yIGFkZGluZyBhY3Rpb25zLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnN0YW50cyB7Ci0KLQkvKioKLQkgKiBGaWxlID4gTmV3IG1lbnUgZ3JvdXAgbmFtZSBmb3IgYWRkaW5nIE5ldyBhY3Rpb25zCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXID0gIm5ldyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZpbGUgPiBPcGVuIG1lbnUgZ3JvdXAgbmFtZSBmb3IgYWRkaW5nIE9wZW4gYWN0aW9ucwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU4gPSAib3BlbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNlYXJjaCBtZW51IGdyb3VwIG5hbWVzIGZvciBhZGRpbmcgU2VhcmNoIGFjdGlvbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0ggPSAic2VhcmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX1NUQVJUID0gInNlYXJjaFN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX0VORCA9ICJzZWFyY2hFbmQiOyAvLyROT04tTkxTLTEkIAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvSW50cm9kdWN0aW9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvSW50cm9kdWN0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWY2ZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL0ludHJvZHVjdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JbnRyb0FjdGlvbjsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgd2VsY29tZSBzY3JlZW4gZm9yIHRoZSBhcHBsaWNhdGlvbi4KLSAqIAotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEludHJvZHVjdGlvbkFjdGlvbiBleHRlbmRzIEludHJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHdpbmRvdwotCSAqICAgICAgICAgICAgdGhlIHdvcmtiZW5jaCB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgSW50cm9kdWN0aW9uQWN0aW9uKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXN1cGVyKHdpbmRvdyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhpcyBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiBhbiBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltZ0Rlc2NyaXB0b3IgPSBSQ1BVSVBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKCJmdWxsL29iajE2L3Byb2R1Y3QuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGltZ0Rlc2NyaXB0b3I7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3QnV0dG9uQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvTmV3QnV0dG9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NmEyMzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld0J1dHRvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLkxpYnJhcnlVSVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5SQ1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudUl0ZW07Ci0KLS8qKgotICogRGlzcGxheXMgYSBkcm9wIGRvd24gY29tYm8gZm9yIGNyZWF0aW5nIG5ldyBtZXRob2QgbGlicmFyeSwgcGx1Zy1pbiBhbmQKLSAqIGNvbmZpZ3VyYXRpb24uIFRoaXMgYWN0aW9uIGlzIGludm9rZWQgdmlhIHRoZSBOZXcgYnV0dG9uIG9uIHRoZSBzeXN0ZW0KLSAqIHRvb2xiYXIuCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdCdXR0b25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJTWVudUNyZWF0b3IgewotCi0JcHJpdmF0ZSBNZW51IGZpbGVOZXdEcm9wZG93biA9IG51bGw7Ci0KLQkvKiBTaGVsbC1TaGFyaW5nCi0JcHJpdmF0ZSBOZXdMaWJyYXJ5QWN0aW9uIG5ld0xpYnJhcnlBY3Rpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBOZXdQbHVnaW5BY3Rpb24gbmV3UGx1Z2luQWN0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgTmV3Q29uZmlndXJhdGlvbkFjdGlvbiBuZXdDb25maWd1cmF0aW9uQWN0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgTmV3V2l6YXJkQWN0aW9uIG5ld1dpemFyZEFjdGlvbiA9IG51bGw7Ci0JKi8KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE5ld0J1dHRvbkFjdGlvbigpIHsKLQkJc2V0SWQoImZpbGVOZXdEcm9wZG93biIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRvb2xUaXBUZXh0KFJDUFVJUmVzb3VyY2VzLm5ld0Ryb3BEb3duX3Rvb2x0aXBfdGV4dCk7Ci0KLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IFJDUFVJUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoIm5ld19jb24uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvcik7Ci0KLQkJc2V0TWVudUNyZWF0b3IodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUoQ29udHJvbCkKLQkgKi8KLQlwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0JCWlmIChmaWxlTmV3RHJvcGRvd24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGZpbGVOZXdEcm9wZG93bjsKLQkJfQotCi0JCWZpbGVOZXdEcm9wZG93biA9IG5ldyBNZW51KHBhcmVudCk7Ci0JCU1lbnVJdGVtIG5ld0xpYnJhcnlNSXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5QVVNIKTsKLQkJbmV3TGlicmFyeU1JdGVtLnNldFRleHQoTGlicmFyeVVJVGV4dC5URVhUX01FVEhPRF9MSUJBUkFSWSk7Ci0JCW5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5TRVBBUkFUT1IpOwotCQlNZW51SXRlbSBuZXdQbHVnaW5NSXRlbSA9IG5ldyBNZW51SXRlbShmaWxlTmV3RHJvcGRvd24sIFNXVC5QVVNIKTsKLQkJbmV3UGx1Z2luTUl0ZW0uc2V0VGV4dChMaWJyYXJ5VUlUZXh0LlRFWFRfTUVUSE9EX1BMVUdJTik7Ci0JCU1lbnVJdGVtIG5ld0NvbmZpZ01JdGVtID0gbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlBVU0gpOwotCQluZXdDb25maWdNSXRlbS5zZXRUZXh0KExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09ORklHVVJBVE9OKTsKLQkJbmV3IE1lbnVJdGVtKGZpbGVOZXdEcm9wZG93biwgU1dULlNFUEFSQVRPUik7Ci0JCU1lbnVJdGVtIG5ld090aGVyTUl0ZW0gPSBuZXcgTWVudUl0ZW0oZmlsZU5ld0Ryb3Bkb3duLCBTV1QuUFVTSCk7Ci0JCW5ld090aGVyTUl0ZW0uc2V0VGV4dChSQ1BVSVJlc291cmNlcy5vdGhlck1lbnVJdGVtX3RleHQpOwotCi0JCS8qIFNoZWxsLVNoYXJpbmcJCQotCQluZXdMaWJyYXJ5QWN0aW9uID0gbmV3IE5ld0xpYnJhcnlBY3Rpb24oKTsKLQkJbmV3UGx1Z2luQWN0aW9uID0gbmV3IE5ld1BsdWdpbkFjdGlvbigpOwotCQluZXdDb25maWd1cmF0aW9uQWN0aW9uID0gbmV3IE5ld0NvbmZpZ3VyYXRpb25BY3Rpb24oKTsKLQkJaWYgKG5ld1dpemFyZEFjdGlvbiA9PSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoV2luZG93IHdiV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQluZXdXaXphcmRBY3Rpb24gPSBuZXcgTmV3V2l6YXJkQWN0aW9uKHdiV2luZG93KTsKLQkJfQotCi0JCW5ld0xpYnJhcnlNSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbmV3TGlicmFyeUFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQluZXdQbHVnaW5NSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbmV3UGx1Z2luQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJbmV3Q29uZmlnTUl0ZW0uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQkJCW5ld0NvbmZpZ3VyYXRpb25BY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3T3RoZXJNSXRlbS5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7Ci0JCQkJbmV3V2l6YXJkQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQkJKi8KLQotCQlyZXR1cm4gZmlsZU5ld0Ryb3Bkb3duOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KE1lbnUpCi0JICovCi0JcHVibGljIE1lbnUgZ2V0TWVudShNZW51IHBhcmVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCS8qCi0JCWlmIChuZXdXaXphcmRBY3Rpb24gPT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3YldpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJbmV3V2l6YXJkQWN0aW9uID0gbmV3IE5ld1dpemFyZEFjdGlvbih3YldpbmRvdyk7Ci0JCX0KLQkJbmV3V2l6YXJkQWN0aW9uLnJ1bigpOwotCQkqLwotCX0KLQotCS8qKgotCSAqIGRpc3Bvc2UgdGhlIGZpbGVOZXdEcm9wZG93biBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZmlsZU5ld0Ryb3Bkb3duICE9IG51bGwpIHsKLQkJCWZpbGVOZXdEcm9wZG93bi5kaXNwb3NlKCk7Ci0JCQlmaWxlTmV3RHJvcGRvd24gPSBudWxsOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld1dpemFyZE1lbnUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9OZXdXaXphcmRNZW51LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGQ0NDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL05ld1dpemFyZE1lbnUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZU5ld1dpemFyZE1lbnU7Ci0KLS8qKgotICogUG9wdWxhdGVzIHRoZSBGaWxlID4gTmV3IG1lbnUgd2l0aCBuZXcgd2l6YXJkcyBjYXRlZ29yaXplZCB1bmRlcgotICogIm9yZy5lY2xpcHNlLmVwZi51aS5uZXdXaXphcmRzLmNhdGVnb3J5Ii4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdXaXphcmRNZW51IGV4dGVuZHMgQmFzZU5ld1dpemFyZE1lbnUgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB3aXphcmQgc2hvcnRjdXQgbWVudSBmb3IgdGhlIElERS4KLQkgKiAKLQkgKiBAcGFyYW0gd2luZG93Ci0JICogICAgICAgICAgICB0aGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIG1lbnUKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBjb250cmlidXRpb24gaXRlbSBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBOZXdXaXphcmRNZW51KElXb3JrYmVuY2hXaW5kb3cgd2luZG93LCBTdHJpbmcgaWQpIHsKLQkJc3VwZXIod2luZG93LCBpZCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkJhc2VOZXdXaXphcmRNZW51I2FkZEl0ZW1zKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJdGVtcyhMaXN0IGxpc3QpIHsKLQkJaWYgKGFkZFNob3J0Y3V0cyhsaXN0KSkgewotCQkJLy8gQWRkIGEgc2VwYXJhdG9yIGFmdGVyIHRoZSBNZXRob2QgQ09uZmlndXJhdGlvbiBtZW51IGl0ZW0uCi0JCQlpZiAobGlzdC5zaXplKCkgPiAzKSB7Ci0JCQkJbGlzdC5hZGQoMywgbmV3IFNlcGFyYXRvcigpKTsKLQkJCX0KLQkJCWxpc3QuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQkJbGlzdC5hZGQobmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oZ2V0U2hvd0RpYWxvZ0FjdGlvbigpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlBY3Rpb25GYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlBY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjFlNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJQWN0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbHYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uICBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5SZXRhcmdldEFjdGlvbjsKLQotLyoqCi0gKiBDcmVhdGVzIGFjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlIEVQRiBDb21wb3NlciB3b3JrYmVuY2guCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVSUFjdGlvbkZhY3RvcnkgZXh0ZW5kcyBBY3Rpb25GYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIFVJQWN0aW9uRmFjdG9yeShTdHJpbmcgYWN0aW9uSWQpIHsKLQkJc3VwZXIoYWN0aW9uSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGN1c3RvbWl6ZWQgU0hPV19JTlRSTyBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgU0hPV19JTlRSTyA9IG5ldyBBY3Rpb25GYWN0b3J5KCJpbnRybyIpIHsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgSVdvcmtiZW5jaEFjdGlvbiBjcmVhdGUoSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUlXb3JrYmVuY2hBY3Rpb24gYWN0aW9uID0gbmV3IEludHJvZHVjdGlvbkFjdGlvbih3aW5kb3cpOwotCQkJYWN0aW9uLnNldElkKGdldElkKCkpOwotCQkJcmV0dXJuIGFjdGlvbjsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBjdXN0b21pemVkIE9QRU5fRUxFTUVOVCBhY3Rpb24gdGhhdCBpcyBlcXVhdmlsZW50IHRvIHRoZSBFRElUIG1lbnUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgT1BFTl9FTEVNRU5UID0gbmV3IEFjdGlvbkZhY3RvcnkoImVkaXQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIElXb3JrYmVuY2hBY3Rpb24gY3JlYXRlKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlSZXRhcmdldEFjdGlvbiBhY3Rpb24gPSBuZXcgUmV0YXJnZXRBY3Rpb24oIk9wZW5FbGVtZW50IiwgIC8vJE5PTi1OTFMtMSQKLQkJCQkJUkNQVUlSZXNvdXJjZXMuZWRpdE1lbnVJdGVtX3RleHQpOwotCQkJd2luZG93LmdldFBhcnRTZXJ2aWNlKCkuYWRkUGFydExpc3RlbmVyKGFjdGlvbik7Ci0JCQlhY3Rpb24KLQkJCQkJLnNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zLm9wZW5FbGVtZW50Iik7ICAvLyROT04tTkxTLTEkCi0JCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IHdpbmRvdy5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0U2hhcmVkSW1hZ2VzKCk7Ci0JCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWSkpOwotCQkJYWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKHNoYXJlZEltYWdlcwotCQkJCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfQ09QWV9ESVNBQkxFRCkpOwotCi0JCQlyZXR1cm4gYWN0aW9uOwotCQl9Ci0JfTsKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBjdXN0b21pemVkIElNUE9SVCBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFjdGlvbkZhY3RvcnkgVUlfSU1QT1JUID0gbmV3IEFjdGlvbkZhY3RvcnkoImltcG9ydCIpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCQlJV29ya2JlbmNoQWN0aW9uIGFjdGlvbiA9IG5ldyBVSUltcG9ydFJlc291cmNlc0FjdGlvbih3aW5kb3cpOwotCQkJCQlhY3Rpb24uc2V0SWQoZ2V0SWQoKSk7Ci0JCQkJCXJldHVybiBhY3Rpb247Ci0JCQkJfQotCX07Ci0JCQotCS8qKgotCSAqIFdvcmtiZW5jaCBhY3Rpb24gKGlkICJleHBvcnQiKTogT3BlbnMgdGhlIGV4cG9ydCB3aXphcmQuIFRoaXMgYWN0aW9uCi0JICogbWFpbnRhaW5zIGl0cyBlbmFibGVtZW50IHN0YXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWN0aW9uRmFjdG9yeSBVSV9FWFBPUlQgPSBuZXcgQWN0aW9uRmFjdG9yeSgiZXhwb3J0IikgeyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBJV29ya2JlbmNoQWN0aW9uIGNyZWF0ZShJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJaWYgKHdpbmRvdyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJSVdvcmtiZW5jaEFjdGlvbiBhY3Rpb24gPSBuZXcgVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24od2luZG93KTsKLQkJCWFjdGlvbi5zZXRJZChnZXRJZCgpKTsKLQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQl9OwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL2FjdGlvbnMvVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUV4cG9ydFJlc291cmNlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmNiOTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUV4cG9ydFJlc291cmNlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbHYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uICBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLndpemFyZHMuVUlFeHBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5FeHBvcnRSZXNvdXJjZXNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgQmluZ3h1ZSBYdQotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbiBleHRlbmRzIEV4cG9ydFJlc291cmNlc0FjdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1dJWkFSRF9XSURUSCA9IDQ3MDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX0hFSUdIVCA9IDU1MDsKLQotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggd2luZG93OyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBoYXMgYmVlbgotCSAqIDxjb2RlPmRpc3Bvc2U8L2NvZGU+ZC4KLQkgKi8KLQlwcml2YXRlIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICovCi0JcHVibGljIFVJRXhwb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXRoaXMod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3b3JrYmVuY2gKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKi8KLQlwdWJsaWMgVUlFeHBvcnRSZXNvdXJjZXNBY3Rpb24oSVdvcmtiZW5jaCB3b3JrYmVuY2gsIFN0cmluZyBsYWJlbCkgewotCQl0aGlzKHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSwgbGFiZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqLwotCXB1YmxpYyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQl0aGlzKHdpbmRvdywgV29ya2JlbmNoTWVzc2FnZXMuRXhwb3J0UmVzb3VyY2VzQWN0aW9uX3RleHQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogQHBhcmFtIHdpbmRvdwotCSAqIEBwYXJhbSBsYWJlbAotCSAqLwotCXB1YmxpYyBVSUV4cG9ydFJlc291cmNlc0FjdGlvbihJV29ya2JlbmNoV2luZG93IHdpbmRvdywgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHdpbmRvdywgbGFiZWwpOwotCQl0aGlzLndvcmtiZW5jaFdpbmRvdyA9IHdpbmRvdzsKLQl9Ci0KLQlwdWJsaWMgVUlFeHBvcnRXaXphcmQgZ2V0VUlFeHBvcnRXaXphcmQoKSB7Ci0JCXJldHVybiBuZXcgVUlFeHBvcnRXaXphcmQoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW52b2tlIHRoZSBFeHBvcnQgd2l6YXJkcyBzZWxlY3Rpb24gV2l6YXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKHdvcmtiZW5jaFdpbmRvdyA9PSBudWxsKSB7Ci0JCQkvLyBhY3Rpb24gaGFzIGJlZW4gZGlzcG9zZWQKLQkJCXJldHVybjsKLQkJfQotCQlVSUV4cG9ydFdpemFyZCB3aXphcmQgPSBnZXRVSUV4cG9ydFdpemFyZCgpOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb25Ub1Bhc3M7Ci0JCS8vIGdldCB0aGUgY3VycmVudCB3b3JrYmVuY2ggc2VsZWN0aW9uCi0JCUlTZWxlY3Rpb24gd29ya2JlbmNoU2VsZWN0aW9uID0gd29ya2JlbmNoV2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKQotCQkJCS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHdvcmtiZW5jaFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHdvcmtiZW5jaFNlbGVjdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXNlbGVjdGlvblRvUGFzcyA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQotCQl3aXphcmQuaW5pdCh3b3JrYmVuY2hXaW5kb3cuZ2V0V29ya2JlbmNoKCksIHNlbGVjdGlvblRvUGFzcyk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3b3JrYmVuY2hTZXR0aW5ncyA9IFdvcmtiZW5jaFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHdpemFyZFNldHRpbmdzID0gd29ya2JlbmNoU2V0dGluZ3MKLQkJCQkuZ2V0U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCWlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotCQkJd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbigiRXhwb3J0UmVzb3VyY2VzQWN0aW9uIik7ICAvLyROT04tTkxTLTEkCi0JCXdpemFyZC5zZXREaWFsb2dTZXR0aW5ncyh3aXphcmRTZXR0aW5ncyk7Ci0JCXdpemFyZC5zZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0KLQkJU2hlbGwgcGFyZW50ID0gd29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHBhcmVudCwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKAotCQkJCU1hdGgubWF4KFNJWklOR19XSVpBUkRfV0lEVEgsIGRpYWxvZy5nZXRTaGVsbCgpLmdldFNpemUoKS54KSwKLQkJCQlTSVpJTkdfV0laQVJEX0hFSUdIVCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nLmdldFNoZWxsKCksCi0JCQkJSVdvcmtiZW5jaEhlbHBDb250ZXh0SWRzLkVYUE9SVF9XSVpBUkQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSUltcG9ydFJlc291cmNlc0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJSW1wb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWVmMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJSW1wb3J0UmVzb3VyY2VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkcy5VSUltcG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkltcG9ydFJlc291cmNlc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5JV29ya2JlbmNoSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2JlbmNoUGx1Z2luOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24gZXh0ZW5kcyBJbXBvcnRSZXNvdXJjZXNBY3Rpb24gewotCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpJTkdfV0laQVJEX1dJRFRIID0gNDcwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19XSVpBUkRfSEVJR0hUID0gNTUwOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gd29ya2JlbmNoCi0JICovCi0JcHVibGljIFVJSW1wb3J0UmVzb3VyY2VzQWN0aW9uKElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCXRoaXMod29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgVUlJbXBvcnRSZXNvdXJjZXNBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc3VwZXIod2luZG93KTsKLQkJdGhpcy53b3JrYmVuY2hXaW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JcHVibGljIFVJSW1wb3J0V2l6YXJkIGdldFVJSW1wb3J0V2l6YXJkKCkgewotCQlyZXR1cm4gbmV3IFVJSW1wb3J0V2l6YXJkKCk7Ci0JfQotCQotCS8qKgotCSAqIEludm9rZSB0aGUgSW1wb3J0IHdpemFyZHMgc2VsZWN0aW9uIFdpemFyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgewotCQkJLy8gYWN0aW9uIGhhcyBiZWVuIGRpc3Bvc2VkCi0JCQlyZXR1cm47Ci0JCX0KLQkJVUlJbXBvcnRXaXphcmQgd2l6YXJkID0gZ2V0VUlJbXBvcnRXaXphcmQoKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uVG9QYXNzOwotCQkvLyBnZXQgdGhlIGN1cnJlbnQgd29ya2JlbmNoIHNlbGVjdGlvbgotCQlJU2VsZWN0aW9uIHdvcmtiZW5jaFNlbGVjdGlvbiA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkKLQkJCQkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmICh3b3JrYmVuY2hTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0aW9uVG9QYXNzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB3b3JrYmVuY2hTZWxlY3Rpb247Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb25Ub1Bhc3MgPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0KLQkJd2l6YXJkLmluaXQod29ya2JlbmNoV2luZG93LmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb25Ub1Bhc3MpOwotCQlJRGlhbG9nU2V0dGluZ3Mgd29ya2JlbmNoU2V0dGluZ3MgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyB3aXphcmRTZXR0aW5ncyA9IHdvcmtiZW5jaFNldHRpbmdzCi0JCQkJLmdldFNlY3Rpb24oIkltcG9ydFJlc291cmNlc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh3aXphcmRTZXR0aW5ncyA9PSBudWxsKQotCQkJd2l6YXJkU2V0dGluZ3MgPSB3b3JrYmVuY2hTZXR0aW5ncwotCQkJCQkuYWRkTmV3U2VjdGlvbigiSW1wb3J0UmVzb3VyY2VzQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJd2l6YXJkLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLQkJd2l6YXJkLnNldEZvcmNlUHJldmlvdXNBbmROZXh0QnV0dG9ucyh0cnVlKTsKLQotCQlTaGVsbCBwYXJlbnQgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2cocGFyZW50LCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFNpemUoCi0JCQkJTWF0aC5tYXgoU0laSU5HX1dJWkFSRF9XSURUSCwgZGlhbG9nLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpLAotCQkJCVNJWklOR19XSVpBUkRfSEVJR0hUKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2cuZ2V0U2hlbGwoKSwKLQkJCQlJV29ya2JlbmNoSGVscENvbnRleHRJZHMuSU1QT1JUX1dJWkFSRCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9VSU9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMTdkMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL1VJT3BlblBlcnNwZWN0aXZlRGlhbG9nQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGx2MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS51dGlsLlBlcnNwZWN0aXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzcGVjdGl2ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLlNlbGVjdFBlcnNwZWN0aXZlRGlhbG9nOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24gZXh0ZW5kcyBPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24gewotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3c7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSB3aW5kb3cKLQkgKi8KLQlwdWJsaWMgVUlPcGVuUGVyc3BlY3RpdmVEaWFsb2dBY3Rpb24oSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cpIHsKLQkJc3VwZXIod2luZG93KTsKLQkJdGhpcy53b3JrYmVuY2hXaW5kb3cgPSB3aW5kb3c7Ci0JfQotCi0JIC8qKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVNlbGVjdFBlcnNwZWN0aXZlRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3RQZXJzcGVjdGl2ZURpYWxvZygKLQkJCQl3b3JrYmVuY2hXaW5kb3cuZ2V0U2hlbGwoKSwgd29ya2JlbmNoV2luZG93LmdldFdvcmtiZW5jaCgpCi0JCQkJCQkuZ2V0UGVyc3BlY3RpdmVSZWdpc3RyeSgpKTsKLQkJZGxnLm9wZW4oKTsKLQkJaWYgKGRsZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93LkNBTkNFTCkKLQkJCXJldHVybjsKLQkJSVBlcnNwZWN0aXZlRGVzY3JpcHRvciBkZXNjID0gZGxnLmdldFNlbGVjdGlvbigpOwotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlQZXJzcGVjdGl2ZVV0aWwub3BlblBlcnNwZWN0aXZlKGRlc2MuZ2V0SWQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl3b3JrYmVuY2hXaW5kb3cgPSBudWxsOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvYWN0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGU3NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9hY3Rpb25zL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGFjdGlvbnMgZm9yIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkY2VkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHN0YW5kYWxvbmUgUkNQLWJhc2VkIEVQRiBDb21wb3Nlci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDg3NWViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5XaXphcmRDYXRlZ29yaWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLkV4cG9ydFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldpemFyZENvbGxlY3Rpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmRpYWxvZ3MuV29ya2JlbmNoV2l6YXJkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5BZGFwdGFibGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuSVdpemFyZENhdGVnb3J5OwotCi0vKioKLSAqIFVJRXhwb3J0IGNsYXNzIHdpbGwgZmlsdGVyIG91dCB0aGUgd2l6YXJkIGNhdGVnb3JpZXMgd2hpY2ggYXJlIG5vdCByZWxhdGVkIAotICogdG8gRVBGLiBVSUV4cG9ydCBhbGxvd3Mgb25seSBVbkNhdGVnb3JpemVkIDxsaW5rPldpemFyZHNSZWdpc3RyeVJlYWRlci5VTkNBVEVHT1JJWkVEX1dJWkFSRF9DQVRFR09SWTwvbGluaz4KLSAqIGNhdGVnb3J5ICAoPGxpbms+b3JnLmVjbGlwc2UudWkuT3RoZXJzPC9saW5rPikKLSAqIGFuZCBmaWx0ZXJzIGFzIHdlbGwgaW4gT3RoZXJzIGNhdGVnb3J5IHdpemFyZHMgbGlzdC4gIAotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVSUV4cG9ydFdpemFyZCBleHRlbmRzIEV4cG9ydFdpemFyZCB7Ci0KLQlwcm90ZWN0ZWQgQWRhcHRhYmxlTGlzdCBnZXRBdmFpbGFibGVFeHBvcnRXaXphcmRzKCkgewotCQkvLyBUT0RPOiBleHBvcnRzIGFyZSBzdGlsbCBmbGF0IC0gd2UgbmVlZCB0byBnZXQgYXQgdGhlIGZsYXQgbGlzdC4gQWxsCi0JCS8vIHdpemFyZHMgd2lsbCBiZSBpbiB0aGUgIm90aGVyIiBjYXRlZ29yeS4KLQkJSVdpemFyZENhdGVnb3J5IHJvb3QgPSBXb3JrYmVuY2hQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldEV4cG9ydFdpemFyZFJlZ2lzdHJ5KCkuZ2V0Um9vdENhdGVnb3J5KCk7Ci0JCVdpemFyZENvbGxlY3Rpb25FbGVtZW50IGNhdGVnb3J5ID0gKFdpemFyZENvbGxlY3Rpb25FbGVtZW50KSByb290Ci0JCQkJLmZpbmRDYXRlZ29yeShuZXcgUGF0aChXaXphcmRDYXRlZ29yaWVzLkVYUE9SVF9XSVpBUkRTX0NBVEVHT1JZKSk7Ci0JCQotCQlBZGFwdGFibGVMaXN0IHJlc3VsdDsKLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBjYXRlZ29yeS5nZXRXaXphcmRBZGFwdGFibGVMaXN0KCk7Ci0KLQkJQWRhcHRhYmxlTGlzdCBmaWx0ZXJlZFJlc3VsdCA9IGRvRmlsdGVyKHJlc3VsdCk7Ci0JCWlmKGZpbHRlcmVkUmVzdWx0LnNpemUoKSA+IDApewotCQkJcmV0dXJuIGZpbHRlcmVkUmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIGZpbHRlciBvdXQgbm9uLWFsbG93YWJsZSBleHBvcnQgd2l6YXJkIGNhdGVnb3JpZXMKLQkgKiBAcGFyYW0gbGlzdAotCSAqIEByZXR1cm4gQWRhcHRhYmxlTGlzdAotCSAqLwotCXB1YmxpYyBBZGFwdGFibGVMaXN0IGRvRmlsdGVyKEFkYXB0YWJsZUxpc3QgbGlzdCl7Ci0JCUxpc3QgZXh0ZW5zaW9ucyA9IFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuZ2V0SW5zdGFuY2UoKS5nZXRQYWdlUHJvdmlkZXJzKCk7Ci0JCUFkYXB0YWJsZUxpc3QgZmlsdGVyZWRSZXN1bHQgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotCQlPYmplY3RbXSBvYmpzID0gbGlzdC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCVdvcmtiZW5jaFdpemFyZEVsZW1lbnQgb2JqID0gKFdvcmtiZW5jaFdpemFyZEVsZW1lbnQpIG9ianNbaV07Ci0JCQlTdHJpbmcgaWQgPSBvYmouZ2V0SWQoKTsKLQkJCWlmKCFleHRlbnNpb25zLmlzRW1wdHkoKSAmJiBleHRlbnNpb25zLmNvbnRhaW5zKGlkKSl7Ci0JCQkJZmlsdGVyZWRSZXN1bHQuYWRkKG9iaik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkUmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk5N2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9VSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUGx1Z2luOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlICdvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyIgZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBjb250cmlidXRpbmcgcGx1Zy1pbiB0byBhZGQgaXRzIGV4cG9ydCB3aXphcmRzCi0gKiB0byB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyIEV4cG9ydCB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiZXhwb3J0V2l6YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFycmF5TGlzdCBleHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFVJRXhwb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBVSUV4cG9ydFdpemFyZEV4dGVuc2lvblBvaW50KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVUlFeHBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFnZVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBzcGVjaWZpZWQgdmlhIHRoZQotCSAqICJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRFeHRlbnNpb24oKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlleHRlbnNpb25zTGlzdC5hZGQoaWQpOwotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlSQ1BVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIkZhaWxlZCB0byBleHBvcnQgaW1wb3J0IGNvbnRyaWJ1dGlvbiBleHRlbnNpb24gcG9pbnRzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzYTBlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yY3AudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuV2l6YXJkQ2F0ZWdvcmllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JrYmVuY2hQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5JbXBvcnRXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZGlhbG9ncy5XaXphcmRDb2xsZWN0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5kaWFsb2dzLldvcmtiZW5jaFdpemFyZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuQWRhcHRhYmxlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLklXaXphcmRDYXRlZ29yeTsKLQotLyoqCi0gKiBVSUltcG9ydCBjbGFzcyB3aWxsIGZpbHRlciBvdXQgdGhlIHdpemFyZCBjYXRlZ29yaWVzIHdoaWNoIGFyZSBub3QgcmVsYXRlZCB0bwotICogRVBGLiBVSUltcG9ydCBhbGxvd3Mgb25seSBVbkNhdGVnb3JpemVkCi0gKiA8bGluaz5XaXphcmRzUmVnaXN0cnlSZWFkZXIuVU5DQVRFR09SSVpFRF9XSVpBUkRfQ0FURUdPUlk8L2xpbms+IGNhdGVnb3J5ICg8bGluaz5vcmcuZWNsaXBzZS51aS5PdGhlcnM8L2xpbms+KQotICogYW5kIGZpbHRlcnMgYXMgd2VsbCBpbiBPdGhlcnMgY2F0ZWdvcnkgd2l6YXJkcyBsaXN0LgotICogCi0gKiBAYXV0aG9yIEJpbmd4dWUgWHUKLSAqIEBhdXRob3IgU2hhc2hpZGhhciBLYW5ub29yaQotICogQGF1dG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVUlJbXBvcnRXaXphcmQgZXh0ZW5kcyBJbXBvcnRXaXphcmQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1wb3J0IHdpemFyZHMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBpbnZvY2F0aW9uLiBBbHNvIGZpbHRlcgotCSAqIGltcG9ydCB3aXphcmQgbGlzdCBvZiB1bmNhdGVnb3JpemVkIChvcmcuZWNsaXBzZS51aS5PdGhlcnMpCi0JICovCi0JcHJvdGVjdGVkIEFkYXB0YWJsZUxpc3QgZ2V0QXZhaWxhYmxlSW1wb3J0V2l6YXJkcygpIHsKLQkJLy8gVE9ETzogaW1wb3J0cyBhcmUgc3RpbGwgZmxhdCAtIHdlIG5lZWQgdG8gZ2V0IGF0IHRoZSBmbGF0IGxpc3QuIEFsbAotCQkvLyB3aXphcmRzIHdpbGwgYmUgaW4gdGhlICJvdGhlciIgY2F0ZWdvcnkuCi0JCUlXaXphcmRDYXRlZ29yeSByb290ID0gV29ya2JlbmNoUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCS5nZXRJbXBvcnRXaXphcmRSZWdpc3RyeSgpLmdldFJvb3RDYXRlZ29yeSgpOwotCQlXaXphcmRDb2xsZWN0aW9uRWxlbWVudCBjYXRlZ29yeSA9IChXaXphcmRDb2xsZWN0aW9uRWxlbWVudCkgcm9vdAotCQkJCS5maW5kQ2F0ZWdvcnkobmV3IFBhdGgoV2l6YXJkQ2F0ZWdvcmllcy5JTVBPUlRfV0laQVJEU19DQVRFR09SWSkpOwotCQlBZGFwdGFibGVMaXN0IHJlc3VsdDsKLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXN1bHQgPSBuZXcgQWRhcHRhYmxlTGlzdCgpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBjYXRlZ29yeS5nZXRXaXphcmRBZGFwdGFibGVMaXN0KCk7Ci0KLQkJQWRhcHRhYmxlTGlzdCBmaWx0ZXJlZFJlc3VsdCA9IGRvRmlsdGVyKHJlc3VsdCk7Ci0JCWlmIChmaWx0ZXJlZFJlc3VsdC5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gZmlsdGVyZWRSZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBGaWx0ZXIgb3V0IG5vbi1hbGxvd2FibGUgaW1wb3J0IHdpemFyZCBjYXRlZ29yaWVzCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiBAcmV0dXJuIEFkYXB0YWJsZUxpc3QKLQkgKi8KLQlwdWJsaWMgQWRhcHRhYmxlTGlzdCBkb0ZpbHRlcihBZGFwdGFibGVMaXN0IGxpc3QpIHsKLQkJTGlzdCBleHRlbnNpb25zID0gVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5nZXRJbnN0YW5jZSgpCi0JCQkJLmdldFBhZ2VQcm92aWRlcnMoKTsKLQkJQWRhcHRhYmxlTGlzdCBmaWx0ZXJlZFJlc3VsdCA9IG5ldyBBZGFwdGFibGVMaXN0KCk7Ci0JCU9iamVjdFtdIG9ianMgPSBsaXN0LmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7IGkrKykgewotCQkJV29ya2JlbmNoV2l6YXJkRWxlbWVudCBvYmogPSAoV29ya2JlbmNoV2l6YXJkRWxlbWVudCkgb2Jqc1tpXTsKLQkJCVN0cmluZyBpZCA9IG9iai5nZXRJZCgpOwotCQkJaWYgKCFleHRlbnNpb25zLmlzRW1wdHkoKSAmJiBleHRlbnNpb25zLmNvbnRhaW5zKGlkKSkgewotCQkJCWZpbHRlcmVkUmVzdWx0LmFkZChvYmopOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL1VJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1NWY1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmNwL3VpL3dpemFyZHMvVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJjcC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmNwLnVpLlJDUFVJUGx1Z2luOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlICdvcmcuZWNsaXBzZS5lcGYudWkuaW1wb3J0V2l6YXJkcyIgZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYSBjb250cmlidXRpbmcgcGx1Zy1pbiB0byBhZGQgaXRzIGltcG9ydCB3aXphcmRzCi0gKiB0byB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyIEltcG9ydCB3aXphcmQgcGFnZS4KLSAqIAotICogQGF1dGhvciBTaGFzaGlkaGFyIEthbm5vb3JpCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgewotCi0JLyoqCi0JICogVGhlIGV4dGVuc2lvbiBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUVTUEFDRSA9ICJvcmcuZWNsaXBzZS5lcGYudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZXh0ZW5zaW9uIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUgPSAiaW1wb3J0V2l6YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBleHRlbnNpb24gQXR0cmlidXRlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfUFJPVklERVJfRVhURU5TSU9OX0FUVFJfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEFycmF5TGlzdCBleHRlbnNpb25zTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKFVJSW1wb3J0V2l6YXJkRXh0ZW5zaW9uUG9pbnQuY2xhc3MpIHsKLQkJCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJCQlpbnN0YW5jZSA9IG5ldyBVSUltcG9ydFdpemFyZEV4dGVuc2lvblBvaW50KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVUlJbXBvcnRXaXphcmRFeHRlbnNpb25Qb2ludCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFsbCB0aGUgcGFnZSBwcm92aWRlcnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFnZVByb3ZpZGVycygpIHsKLQkJcmV0dXJuIGV4dGVuc2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBjb25maWd1cmF0aW9uIHByb3ZpZGVycyBzcGVjaWZpZWQgdmlhIHRoZQotCSAqICJjb20uaWJtLnByb2Nlc3MucGFnZVByb3ZpZGVycyIgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRFeHRlbnNpb24oKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KAotCQkJCVBBR0VfUFJPVklERVJTX0VYVEVOU0lPTl9OQU1FU1BBQ0UsCi0JCQkJUEFHRV9QUk9WSURFUlNfRVhURU5TSU9OX05BTUUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY29uZmlnRWxlbWVudHMgPSBleHRlbnNpb24KLQkJCQkJCS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gY29uZmlnRWxlbWVudHNbal07Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgaWQgPSBjb25maWdFbGVtZW50Ci0JCQkJCQkJCS5nZXRBdHRyaWJ1dGUoUEFHRV9QUk9WSURFUl9FWFRFTlNJT05fQVRUUl9JRCk7Ci0JCQkJCQlleHRlbnNpb25zTGlzdC5hZGQoaWQpOwotCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlSQ1BVSVBsdWdpbgotCQkJCQkJCQkuZ2V0RGVmYXVsdCgpCi0JCQkJCQkJCS5nZXRMb2dnZXIoKQotCQkJCQkJCQkubG9nRXJyb3IoCi0JCQkJCQkJCQkJIkZhaWxlZCB0byBleHBvcnQgaW1wb3J0IGNvbnRyaWJ1dGlvbiBleHRlbnNpb24gcG9pbnRzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9yY3AvdWkvd2l6YXJkcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDBlN2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3JjcC91aS93aXphcmRzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGV4cG9ydCBhbmQgaW1wb3J0IHdpemFyZHMgVUkgbWFuYWdlbWVudCBpbiB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmMGY0MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1MTgzYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnJjcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI0M2YwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVmZWF0dXJlUGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnJjcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM5OTA4Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY0ZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lZmVhdHVyZVRleHQKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWFwcGxpY2F0aW9uXzMyLmdpZgotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLWFwcE5hbWU9JWZlYXR1cmVOYW1lCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotd2VsY29tZVBhZ2U9JG5sJC93ZWxjb21lLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGZkZGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotIyBVc3VhbGx5IGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLgotCi0wPUBidWlsZC1JREAKLTE9MS41LjAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExMjIwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDguICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9hcHBsaWNhdGlvbl8zMi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYnVpbGQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwNTI5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBubC8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhcHBsaWNhdGlvbl8zMi5naWYsXAotICAgICAgICAgICAgICAgd2VsY29tZS54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGEvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZGEvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkNzUxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RhL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ5Z2dlZXRpa2V0OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RlL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2RlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTJhMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9kZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiAtIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkLUtlbm5zYXR6OiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9lcy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFiMDI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZXMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1SQ1AgZGUgRVBGCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lcdTAwZjNuOiB7MX0gXG5cCi1FdGlxdWV0YSBkZSBidWlsZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgQ29sYWJvcmFkb3JlcyBkZSBFY2xpcHNlIHkgb3Ryb3MgMjAwMCwgMjAwNy4gIFJlc2VydmFkb3MgdG9kb3MgbG9zIGRlcmVjaG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9mci9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9mci9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjgyMGVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvZnIvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotVmVyc2lvbiA6IHsxfSBcblwKLUxpYmVsbFx1MDBlOSBkZSB2ZXJzaW9uIDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvaXQvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvaXQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNmZTFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2l0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9UkNQIEVQRgotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNpb25lOiB7MX0gXG5cCi1FdGljaGV0dGEgYnVpbGQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGUgYWx0cmkgMjAwMCwgMjAwNy4gIFR1dHRpIGkgZGlyaXR0aSByaXNlcnZhdGkuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2phL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2phL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTg1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9qYS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTMwZDBcdTMwZmNcdTMwYjhcdTMwZTdcdTMwZjM6IHsxfSBcblwKLVx1MzBkM1x1MzBlYlx1MzBjOVx1MzBmYlx1MzBlOVx1MzBkOVx1MzBlYjogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avbmwva28vYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3Avbmwva28vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmZDU1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL2tvL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVx1YmM4NFx1YzgwNDogezF9IFxuXAotXHViZTRjXHViNGRjIFx1YjgwOFx1Yzc3NFx1YmUxNDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblwKLVxuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgVGhlIGFib3ZlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNoaXBwZWQgZm9yIHRyYW5zbGF0aW9uLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcHQvQlIvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMDZmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3B0L0JSL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIERvIG5vdCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZSBsYXN0IGxpbmUgY29udGFpbmluZzoKLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIEluc3RlYWQsIGVpdGhlciByZWRlZmluZSBhbiBleGlzdGluZyBwcm9wZXJ0eSwgb3IgY3JlYXRlIGEgbmV3IHByb3BlcnR5LAotIyBhcHBlbmQgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgYW5kIGNoYW5nZSB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBuYW1lLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotZmVhdHVyZU5hbWU9RVBGIFJDUAotCi1mZWF0dXJlVGV4dD1FUEYgUkNQXG5cCi1cblwKLVZlcnNcdTAwZTNvOiB7MX0gXG5cCi1Db25zdHJ1XHUwMGU3XHUwMGUzbzogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgY29udHJpYnVpZG9yZXMgRWNsaXBzZSBlIG91dHJvcyAyMDAwLCAyMDA3LiBUb2RvcyBvcyBEaXJlaXRvcyBSZXNlcnZhZG9zLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC9ydS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDE0MmE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvcnUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotXHUwNDEyXHUwNDM1XHUwNDQwXHUwNDQxXHUwNDM4XHUwNDRmOiB7MX0gXG5cCi1cdTA0MWFcdTA0M2VcdTA0M2NcdTA0M2ZcdTA0M2VcdTA0M2RcdTA0M2VcdTA0MzJcdTA0M2FcdTA0MzA6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIFx1MDQxMlx1MDQ0MVx1MDQzNSBcdTA0M2ZcdTA0NDBcdTA0MzBcdTA0MzJcdTA0MzAgXHUwNDM3XHUwNDMwXHUwNDQ5XHUwNDM4XHUwNDQ5XHUwNDM1XHUwNDNkXHUwNDRiLlxuXAotXG4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9DTi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzA1MjlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AvbmwvemgvQ04vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUkNQCi0KLWZlYXR1cmVUZXh0PUVQRiBSQ1BcblwKLVxuXAotXHU3MjQ4XHU2NzJjXHVmZjFhezF9IFxuXAotXHU1ZGU1XHU0ZjVjXHU3MjQ4XHU2NzJjXHU2ODA3XHU3YjdlXHVmZjFhezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDAwLCAyMDA3LiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiBcbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL25sL3poL1RXL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MDc5ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9ubC96aC9UVy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBEbyBub3QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUgbGFzdCBsaW5lIGNvbnRhaW5pbmc6Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBJbnN0ZWFkLCBlaXRoZXIgcmVkZWZpbmUgYW4gZXhpc3RpbmcgcHJvcGVydHksIG9yIGNyZWF0ZSBhIG5ldyBwcm9wZXJ0eSwKLSMgYXBwZW5kIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIGFuZCBjaGFuZ2UgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgbmFtZS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWZlYXR1cmVOYW1lPUVQRiBSQ1AKLQotZmVhdHVyZVRleHQ9RVBGIFJDUFxuXAotXG5cCi1cdTcyNDhcdTY3MmNcdWZmMWF7MX1cblwKLVx1NWVmYVx1N2Y2ZVx1NmExOVx1N2M2NFx1ZmYxYXswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwMCwgMjAwNy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5cCi1cbgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBzaGlwcGVkIGZvciB0cmFuc2xhdGlvbi4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5ZmUxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1mZWF0dXJlUGx1Z2luTmFtZT1FUEYgUkNQIEZlYXR1cmUKLWZlYXR1cmVQbHVnaW5OYW1lTkw9RVBGIFJDUCBGZWF0dXJlIChOTDEpCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC93ZWxjb21lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0MGQwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwL3dlbGNvbWUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+IAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsiPgotCi08aW50cm8+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrCi08L2ludHJvPgotCi08aXRlbT48Yj5XaGF0IGlzIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcms/PC9iPgotCQotPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBNb3JlPC9iPgotCi08L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRmMjBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIj4KLQkJPGF0dHJpYnV0ZXM+Ci0JCTwvYXR0cmlidXRlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhdHRyaWJ1dGVzPgotCQk8L2F0dHJpYnV0ZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YXR0cmlidXRlcz4KLQkJPC9hdHRyaWJ1dGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkZDg5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVHVybiBvbiBkZWJ1ZyB0cmFjZSBmb3IgdGhlIFJpY2ggVGV4dCBwbHVnLWluCi1vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yjc5YTc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGJlYTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dAotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogcmljaHRleHQuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS51aS5mb3Jtczt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWk7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLAotIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlcwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk5MDg2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQuaW5pIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhNWQ1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWZlYXR1cmVUZXh0Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1hcHBsaWNhdGlvbl8zMi5naWYKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi1hcHBOYW1lPSVmZWF0dXJlTmFtZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0Lm1hcHBpbmdzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTU5MjdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotIyBVc3VhbGx5IGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLgotCi0wPUBidWlsZC1JREAKLTE9MS41LjAuMApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2Fib3V0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3M2U2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRG8gbm90IGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlIGxhc3QgbGluZSBjb250YWluaW5nOgotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgSW5zdGVhZCwgZWl0aGVyIHJlZGVmaW5lIGFuIGV4aXN0aW5nIHByb3BlcnR5LCBvciBjcmVhdGUgYSBuZXcgcHJvcGVydHksCi0jIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbmQgY2hhbmdlIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IG5hbWUuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1mZWF0dXJlTmFtZT1FUEYgUmljaHRleHQKLQotZmVhdHVyZVRleHQ9RVBGIFJpY2h0ZXh0XG5cCi1cblwKLVZlcnNpb246IHsxfSBcblwKLUJ1aWxkIExhYmVsOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDcuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuXAotXG5cCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyBUaGUgYWJvdmUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2hpcHBlZCBmb3IgdHJhbnNsYXRpb24uCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2FwcGxpY2F0aW9uXzMyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9hcHBsaWNhdGlvbl8zMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2FwcGxpY2F0aW9uXzMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwN2I2NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UucmljaHRleHQuamFyID0gc3JjLwotb3V0cHV0LnJpY2h0ZXh0LmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHJpY2h0ZXh0LmphcixcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHJ0ZS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uXzMyLmdpZgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZEltYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzA4YThhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRMaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMTExOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRMaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkT3JkZXJlZExpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWU0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0FkZFRhYmxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg4NDYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQWRkVW5vcmRlcmVkTGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDRlYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQm9sZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0JvbGQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGM1OTg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQm9sZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0NsZWFyQ29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjY0MTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9DbGVhckNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Db3B5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ29weS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YmM2NWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9Db3B5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvQ3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MzE0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0N1dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0ZpbmRSZXBsYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY4ODcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvRmluZFJlcGxhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9JbmRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzZlMTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSW5kZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvSXRhbGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliNWE0NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L0l0YWxpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L091dGRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9PdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjZGEzZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L091dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3NjY4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvUGFzdGVQbGFpblRleHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWEyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1YnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjMxYWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdWJzY3JpcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9TdXBlcnNjcmlwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1cGVyc2NyaXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiMjY2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1N1cGVyc2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2R0b29sMTYvVGlkeUhUTUwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9UaWR5SFRNTC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmM5ZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9UaWR5SFRNTC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1VuZGVybGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9kdG9vbDE2L1VuZGVybGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTk2NDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZHRvb2wxNi9VbmRlcmxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRJbWFnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0NTIxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZEltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA4ZGNmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkTGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRMaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5MTk0YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZExpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRPcmRlcmVkTGlzdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4MTRjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZE9yZGVyZWRMaXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQWRkVGFibGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjg4NTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRUYWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9BZGRVbm9yZGVyZWRMaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRmZGZjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0FkZFVub3JkZXJlZExpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQm9sZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGY5ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Cb2xkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ2xlYXJDb250ZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ2xlYXJDb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1ODMyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NsZWFyQ29udGVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9Db3B5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyYWNlZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0NvcHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DdXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9DdXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTg2MzVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvQ3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvRmluZFJlcGxhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjU3ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9GaW5kUmVwbGFjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0luZGVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0luZGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTk1ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JbmRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JdGFsaWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9JdGFsaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBjZDExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSXRhbGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlDZW50ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWFiZjA1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUNlbnRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlGdWxsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTBhM2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeUZ1bGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9KdXN0aWZ5TGVmdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1NDY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlMZWZ0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeVJpZ2h0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvSnVzdGlmeVJpZ2h0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwNWFmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L0p1c3RpZnlSaWdodC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9PdXRkZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2Yjk0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L091dGRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkMzlhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1Bhc3RlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvUGFzdGVQbGFpblRleHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Zjk4OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9QYXN0ZVBsYWluVGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N0cmlrZVRocm91Z2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdHJpa2VUaHJvdWdoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEwMzU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1N0cmlrZVRocm91Z2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdWJzY3JpcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzBmNzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3Vic2NyaXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvU3VwZXJzY3JpcHQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODY2MzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9TdXBlcnNjcmlwdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvaWNvbnMvZnVsbC9ldG9vbDE2L1RpZHlIVE1MLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVGlkeUhUTUwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYyNDEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVGlkeUhUTUwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L2ljb25zL2Z1bGwvZXRvb2wxNi9VbmRlcmxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQ3NmQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9pY29ucy9mdWxsL2V0b29sMTYvVW5kZXJsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MzI2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFJpY2ggVGV4dAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFRIRSBGT0xMT1dJTkcgUFJPUEVSVElFUyBTSE9VTEQgTk9UIEJFIFRSQU5TTEFURUQhISEKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgVGhlIEhUTUwgZmlsZSB1c2VkIHRvIHJlbmRlciB0aGUgUmljaCBUZXh0IEVkaXRvci4KLVJpY2hUZXh0LmVkaXRvckhUTUw9cnRlLmh0bQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDliNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvYmxhbmsuaHRtIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ibGFuay5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOTcyN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ibGFuay5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgotCi08aHRtbD4KLTxoZWFkPgotCTx0aXRsZT48L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzZjOWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotIAlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLSAJZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbjogM3B4OwotCXBhZGRpbmc6IDBweDsgCQotfQotCi1wIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLWgxIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IGxhcmdlOwotfQotCi1oMiB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxNTAlOwotfQotCi1oMyB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci19Ci0KLWg0LCBoNSwgaDYgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotfQotCi1hOmxpbmsgewotCWNvbG9yOiAjMDAzMzk5OwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWE6YWN0aXZlIHsKLQljb2xvcjogIzAwMzM5OTsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWE6dmlzaXRlZCB7Ci0JY29sb3I6ICMwMDMzOTk7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYTpob3ZlciB7Ci0JY29sb3I6ICNmZjAwMDA7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1vbCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKLQltYXJnaW4tbGVmdDogMzBweDsKLX0KLQotb2wgbGkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0Ci19Ci0KLXVsIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi1sZWZ0OiAzMHB4OwotCW1hcmdpbi10b3A6IDBweDsKLX0KLQotdWwgbGkgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10YWJsZSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKLQliYWNrZ3JvdW5kOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsJCi19Ci0KLXRib2R5IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JdmFsaWduOiBiYXNlbGluZTsKLX0KLQotdGggewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi10ZCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotfQotCi10ZCB1bCB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCW1hcmdpbi1ib3R0b206IDBweDsKLQltYXJnaW4tbGVmdDogMzBweDsKLX0KLQotLnBhZ2VUaXRsZSB7Ci0JYmFja2dyb3VuZDogIzk5OTljYzsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LXNpemU6IDEycHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JcGFkZGluZy1ib3R0b206IDVweDsKLQlwYWRkaW5nLWxlZnQ6IDEwcHg7Ci0JcGFkZGluZy1yaWdodDogMTBweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLS5wYWdlVGl0bGVTZXBhcmF0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0JcGFkZGluZzogMHB4OwotfQotCi0udGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjNWM4MWE3OwotCWNvbG9yOiAjZmZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsgCi0JZm9udC1zaXplOiAxMXB4OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uYWN0aXZlVGFiIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjYzhkN2UzOwotCWNvbG9yOiAjMjkzZDZiOwkKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6bGluaywgYS50YWI6YWN0aXZlLCBhLnRhYjp2aXNpdGVkIHsKLQljb2xvcjogI2ZmZmZmZjsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IAotCWZvbnQtc2l6ZTogMTFweDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotYS50YWI6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwkKLX0KLQotLm92ZXJ2aWV3IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQlwYWRkaW5nLWxlZnQ6IDIwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotfQotCi0ub3ZlcnZpZXdUYWJsZSB7Ci0JYmFja2dyb3VuZDogI2ZmZmZmZjsKLQl3aWR0aDogMTAwJTsJCi19Ci0KLS5vdmVydmlld1RhYmxlIHRkIHsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXBhZGRpbmctbGVmdDogNXB4OwotCXBhZGRpbmctcmlnaHQ6IDVweDsKLQlwYWRkaW5nLXRvcDogNXB4OwotfQotCi0ub3ZlcnZpZXdTZXBhcmF0b3IgewotCWJhY2tncm91bmQtY29sb3I6ICMwMDAwMDA7Ci0JcGFkZGluZzogMHB4OwotfQotCi0uZXhwYW5kQ29sbGFwc2VUZXh0IHsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JcGFkZGluZy1sZWZ0OiA1cHg7Ci0JcGFkZGluZy1yaWdodDogNXB4OwotfQotCi0uZXhwYW5kQ29sbGFwc2VMaW5rIHsKLQljb2xvcjogIzMzMzMzMzsKLQlwYWRkaW5nLWJvdHRvbTogNXB4OwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmV4cGFuZENvbGxhcHNlTGluazpob3ZlciB7Ci0JY29sb3I6ICMwMDAwZmY7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5leHBhbmRDb2xsYXBzZUxpbms6dmlzaXRlZCB7Ci0JY29sb3I6ICMzMzMzMzM7Ci19Ci0KLS5zZWN0aW9uSGVhZGluZyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzk4YjFjNDsKLQljb2xvcjogI2ZmZmZmZjsKLQljdXJzb3I6IGhhbmQ7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXBhZGRpbmctYm90dG9tOiAycHg7Ci0JcGFkZGluZy1sZWZ0OiAycHg7Ci0JcGFkZGluZy10b3A6IDJweDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5zZWN0aW9uQ29udGVudCB7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnNlY3Rpb25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JcGFkZGluZy1ib3R0b206IDEwcHg7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDEwcHg7Ci0JcGFkZGluZy10b3A6IDEwcHg7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS5zZWN0aW9uVGFibGVIZWFkaW5nIHsKLQliYWNrZ3JvdW5kOiAjZWVlOwotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCWNvbG9yOiAjMzMzMzMzOwotCWhlaWdodDogMjA7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl3aWR0aDogMjAlOwotfQotCi0uc2VjdGlvblRhYmxlQ2VsbCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAxcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci19Ci0KLS5icmVha2Rvd25UYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAxcHg7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmJyZWFrZG93blRhYmxlIHRoIHsKLQliYWNrZ3JvdW5kOiAjZWVlOwotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMXB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCWNvbG9yOiAjMzMzMzMzOwotCWhlaWdodDogMjA7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLmJyZWFrZG93blRhYmxlIHRkIHsKLQlib3JkZXItYm90dG9tOiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItbGVmdDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXJpZ2h0OiAjY2NjIHNvbGlkIDFweDsKLQlib3JkZXItdG9wOiAjY2NjIHNvbGlkIDBweDsKLX0KLQotLmRlZmF1bHRUYWJsZSB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JcGFkZGluZy1ib3R0b206IDBweDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAwcHg7Ci0JcGFkZGluZy10b3A6IDBweDsKLQl3aWR0aDogMTAwJTsKLX0KLQotLmRlZmF1bHRUYWJsZSB0ZCB7Ci0JYm9yZGVyLWJvdHRvbTogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLWxlZnQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1yaWdodDogI2NjYyBzb2xpZCAwcHg7Ci0JYm9yZGVyLXRvcDogI2NjYyBzb2xpZCAwcHg7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotLnN1YlNlY3Rpb25IZWFkaW5nIHsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3ViU2VjdGlvbkNvbnRlbnQgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0uc3RlcEhlYWRpbmcgewotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6ICMyOTNkNmI7Ci0JY3Vyc29yOiBoYW5kOwotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQlwYWRkaW5nLWJvdHRvbTogMnB4OwotCXBhZGRpbmctbGVmdDogMnB4OwotCXBhZGRpbmctdG9wOiAycHg7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0uc3RlcENvbnRlbnQgewotCWJvcmRlci1ib3R0b206ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci1sZWZ0OiAjY2NjIHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICNjY2Mgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICNjY2Mgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiA1cHg7Ci0JcGFkZGluZy1sZWZ0OiAwcHg7Ci0JcGFkZGluZy1yaWdodDogMHB4OwotCXBhZGRpbmctdG9wOiAwcHg7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5zdGVwVGFibGUgewotCWJvcmRlci1ib3R0b206ICM5OTk5OTkgc29saWQgMXB4OwotCWJvcmRlci1sZWZ0OiAjOTk5OTk5IHNvbGlkIDBweDsKLQlib3JkZXItcmlnaHQ6ICM5OTk5OTkgc29saWQgMHB4OwotCWJvcmRlci10b3A6ICM5OTk5OTkgc29saWQgMHB4OwotCXBhZGRpbmctYm90dG9tOiAyMHB4OwotCXBhZGRpbmctbGVmdDogMTBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAxMHB4OwotCXdpZHRoOiAxMDAlOwotfQotCi0uc3RlcFRhYmxlIHRkIHsKLQlib3JkZXI6ICNjY2Mgc29saWQgMHB4OwotfQotCi0uc3RlcFNlcGFyYXRvciB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2NjY2NjYzsKLQlwYWRkaW5nOiAwcHg7Ci19Ci0KLS5iYWNrVG9Ub3BMaW5rIHsKLQljb2xvcjogI2ZmZmZmOwotCWZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBhcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDhwdDsKLQlmb250LXdlaWdodDogbm9ybWFsOwkKLQltYXJnaW46IDBweDsKLQlwYWRkaW5nLWJvdHRvbTogMTBweDsKLQl0ZXh0LWFsaWduOiBtaWRkbGU7CQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLmJhY2tUb1RvcExpbms6aG92ZXIgewotCWNvbG9yOiAjOTY5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYmFja1RvVG9wTGluazp2aXNpdGVkIHsKLQljb2xvcjogIzVjODFhNzsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7CQotfQotCi0uY29weXJpZ2h0IHsKLQljb2xvcjogIzcwODBiMDsKLQlmb250LWZhbWlseTogdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiA4cHQ7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlwYWRkaW5nLWxlZnQ6IDBweDsKLQlwYWRkaW5nLXJpZ2h0OiAxMHB4OwotCXBhZGRpbmctdG9wOiAyNXB4OwotCXRleHQtYWxpZ246IGxlZnQ7Ci0Jd2lkdGg6IDEwMCU7Ci19Ci0KLS52ZXJzaW9uSW5mbyB7Ci0JY29sb3I6ICM3MDgwYjA7Ci0JZm9udC1mYW1pbHk6IHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogOHB0OwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JcGFkZGluZy1sZWZ0OiAxMHB4OwotCXBhZGRpbmctcmlnaHQ6IDBweDsKLQlwYWRkaW5nLXRvcDogMjVweDsKLQl0ZXh0LWFsaWduOiByaWdodDsKLX0KLQotLnF1b3RlIHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uY29kZVNhbXBsZSB7Ci0JZm9udC1mYW1pbHk6IGNvdXJpZXI7Ci0JZm9udC1zaXplOiAxMHB0OwkJCi19Ci0KLS5lbGVtZW50TGluayB7Ci0JZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAxMHB0OwkKLQljb2xvcjogIzAwMDBmZjsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFR5cGUgewotCWZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMTBwdDsKLQljb2xvcjogIzAwMDBmZjsKLX0KLQotLmVsZW1lbnRMaW5rV2l0aFVzZXJUZXh0IHsKLQlmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDEwcHQ7Ci0JY29sb3I6ICMwMDAwZmY7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1MWNiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvcnRlL3J0ZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQk8aGVhZD4KLQkJPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9InJ0ZS5qcyI+PC9zY3JpcHQ+CQkKLQk8L2hlYWQ+Ci0JPGJvZHkgbGVmdE1hcmdpbj0iMCIgdG9wTWFyZ2luPSIwIiBtYXJnaW5oZWlnaHQ9IjAiIG1hcmdpbndpZHRoPSIwIiBzY3JvbGw9Im5vIiBzdHlsZT0ib3ZlcmZsb3c6IGhpZGRlbiI+Ci0JCTxpZnJhbWUgaWQ9InJ0ZSIgbmFtZT0icnRlIiBzdHlsZT0iYm9yZGVyOiBub25lOyIgZnJhbWVib3JkZXI9IjAiIHNjcm9sbGluZz0iYXV0byIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PC9pZnJhbWU+Ci0JCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KLQkJCWluaXRFZGl0b3IoJ3J0ZScsICdydGUuY3NzJywgbnVsbCk7Ci0JCTwvc2NyaXB0PgotCTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLmpzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTBjYmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEBhdXRob3IgS2VsdmluIExvdwotLy8gQHNpbmNlIDEuMAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE5vdGU6IE1vemlsbGEvRmlyZWZveCBkb2VzIG5vdCBhbGxvdyB1bnByaXZpbGVnZWQgc2NyaXB0cyB0byBpbnZva2UgdGhlIGN1dCwKLS8vIGNvcHkgYW5kIHBhc3RlIGNvbW1hbmRzLiBUaGUgSmF2YXNjcmlwdCBtdXN0IGVpdGhlciBiZSBzaWduZWQKLS8vIChzZWUgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9zZWN1cml0eS9jb21wb25lbnRzL3NpZ25lZC1zY3JpcHRzLmh0bWwpLAotLy8gb3IgdGhlIHVzZXJzIG11c3QgY2hhbmdlIHRoZWlyIHByZWZlcmVuY2VzCi0vLyAoc2VlIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvZWRpdG9yL21pZGFzZGVtby9zZWN1cml0eXByZWZzLmh0bWwpLgotLy8gQWx0ZXJuYXRpdmVseSwgdGhlIHVzZXJzIGNhbiB1c2UgdGhlIGN0cmwteCwgY3RybC1jIGFuZCBjdHJsLXYga2V5cy4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZhciBTVEFUVVNfTk9QID0gMDsKLXZhciBTVEFUVVNfSU5JVElBTElaRUQgPSAxOwotdmFyIFNUQVRVU19NT0RJRklFRCA9IDI7Ci12YXIgU1RBVFVTX0dFVF9URVhUID0gMzsKLXZhciBTVEFUVVNfS0VZX0RPV04gPSA0OwotdmFyIFNUQVRVU19LRVlfVVAgPSA1OwotdmFyIFNUQVRVU19TRUxFQ1RfVEVYVCA9IDY7Ci12YXIgU1RBVFVTX1NFTEVDVF9DT05UUk9MID0gNzsKLXZhciBTVEFUVVNfU0VMRUNUX05PTkUgPSA4OwotdmFyIFNUQVRVU19FWEVDX0NNRCA9IDk7Ci12YXIgU1RBVFVTX1JFRk9STUFUX0xJTktTID0gMTA7Ci0KLXZhciBLRVlfQVJST1dfRE9XTiA9IDQwOwotdmFyIEtFWV9BUlJPV19MRUZUID0gMzc7Ci12YXIgS0VZX0FSUk9XX1JJR0hUID0gMzk7Ci12YXIgS0VZX0FSUk9XX1VQID0gMzg7Ci12YXIgS0VZX0JBQ0tTUEFDRSA9IDg7Ci12YXIgS0VZX0VORCA9IDM1OwotdmFyIEtFWV9IT01FID0gMzY7Ci12YXIgS0VZX1BBR0VfRE9XTiA9IDM0OwotdmFyIEtFWV9QQUdFX1VQID0gMzM7Ci12YXIgS0VZX1RBQiA9IDk7Ci12YXIgS0VZX0MgPSA2NzsKLXZhciBLRVlfRiA9IDcwOwotdmFyIEtFWV9TID0gODM7Ci12YXIgS0VZX1YgPSA4NjsKLXZhciBLRVlfWCA9IDg4OwotdmFyIEtFWV9aID0gOTA7Ci0KLXZhciBDTURfQ09QWSA9ICJjb3B5IjsKLXZhciBDTURfQ1VUID0gImN1dCI7Ci12YXIgQ01EX0ZJTkRfVEVYVCA9ICJmaW5kVGV4dCI7Ci12YXIgQ01EX1BBU1RFID0gInBhc3RlIjsKLXZhciBDTURfU0FWRSA9ICJzYXZlIjsKLXZhciBDTURfU0FWRV9BTEwgPSAic2F2ZUFsbCI7Ci0KLXZhciBUQUJMRV9IRUFERVJTX05PTkUgPSAwOwotdmFyIFRBQkxFX0hFQURFUlNfQ09MUyA9IDE7Ci12YXIgVEFCTEVfSEVBREVSU19ST1dTID0gMjsKLXZhciBUQUJMRV9IRUFERVJTX0JPVEggPSAzOwotCi12YXIgQk9MRCA9IDE7Ci12YXIgSVRBTElDID0gQk9MRCA8PCAxOwotdmFyIFVOREVSTElORSA9IElUQUxJQyA8PCAxOwotdmFyIFNVQlNDUklQVCA9IFVOREVSTElORSA8PCAxOwotdmFyIFNVUEVSU0NSSVBUID0gU1VCU0NSSVBUIDw8IDE7Ci0KLQotdmFyIGVkaXRvcklkOwotdmFyIGVkaXRvckNTUzsKLXZhciBiYXNlSFJFRjsKLXZhciBzdXBwb3J0UmljaFRleHRFZGl0aW5nID0gdHJ1ZTsKLXZhciBlZGl0b3JEb2M7Ci12YXIgc2VsZWN0aW9uOwotdmFyIHNlbGVjdGlvblJhbmdlOwotdmFyIHJlYWRPbmx5ID0gZmFsc2U7Ci12YXIgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLXZhciBtb2RpZmllZCA9IGZhbHNlOwotdmFyIGNoZWNrUmVzaXplRWxlbWVudDsKLXZhciBzZWxlY3Rpb25JbmZvID0gbnVsbDsKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIGVkaXRvci4KLWZ1bmN0aW9uIGluaXRFZGl0b3IoaWQsIGNzcywgYmFzZVVSTCkgewotCWVkaXRvcklkID0gaWQ7Ci0JZWRpdG9yQ1NTID0gY3NzOwotCWJhc2VIUkVGID0gYmFzZVVSTDsKLQl0cnkgewotCQllbmFibGVSaWNoVGV4dEVkaXRpbmcoJycpOwotCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCXNldFN0YXR1cyhTVEFUVVNfSU5JVElBTElaRUQsIG51bGwpOwotCX0KLQljYXRjaCAoZSkgewotCQlzdXBwb3J0UmljaFRleHRFZGl0aW5nID0gZmFsc2U7Ci0JfQotfQotCi0vLyBIYW5kbGVzIHRoZSBrZXkgZXZlbnRzLgotZnVuY3Rpb24ga2V5UHJlc3NlZChldmVudCkgewotCXZhciBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKLQlpZiAoa2V5Q29kZSA9PSAwICYmICFkb2N1bWVudC5hbGwpIHsKLQkJa2V5Q29kZSA9IGV2ZW50LmNoYXJDb2RlOwotCQlzd2l0Y2ggKGtleUNvZGUpIHsKLQkJCWNhc2UgOTk6Ci0JCQkJa2V5Q29kZSA9IEtFWV9DOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMDI6Ci0JCQkJa2V5Q29kZSA9IEtFWV9GOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMTU6Ci0JCQkJa2V5Q29kZSA9IEtFWV9TOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMTg6Ci0JCQkJa2V5Q29kZSA9IEtFWV9WOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMjA6Ci0JCQkJa2V5Q29kZSA9IEtFWV9YOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMjI6Ci0JCQkJa2V5Q29kZSA9IEtFWV9aOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCXZhciBjdHJsS2V5ID0gZXZlbnQuY3RybEtleTsKLQl2YXIgc2hpZnRLZXkgPSBldmVudC5zaGlmdEtleTsKLQkKLQlzd2l0Y2goa2V5Q29kZSkgewotCQljYXNlIEtFWV9BUlJPV19ET1dOOgotCQljYXNlIEtFWV9BUlJPV19MRUZUOgotCQljYXNlIEtFWV9BUlJPV19SSUdIVDoKLQkJY2FzZSBLRVlfQVJST1dfVVA6Ci0JCWNhc2UgS0VZX0VORDoKLQkJY2FzZSBLRVlfSE9NRToKLQkJY2FzZSBLRVlfUEFHRV9ET1dOOgotCQljYXNlIEtFWV9QQUdFX1VQOgotCQljYXNlIEtFWV9UQUI6Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfQkFDS1NQQUNFOgotCQkJaWYgKCFyZWFkT25seSkgewotCQkJCXNldFRpbWVvdXQoInNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOyIsIDEwKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9DOgotCQkJaWYgKGN0cmxLZXkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfQ09QWSk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwkJCQotCQljYXNlIEtFWV9GOgotCQkJaWYgKGN0cmxLZXkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQkJfQotCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9GSU5EX1RFWFQpOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfUzoKLQkJCWlmICghcmVhZE9ubHkgJiYgY3RybEtleSkgewotCQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQkJZXZlbnQua2V5Q29kZSA9IC0xOwotCQkJCQlldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCQl9Ci0JCQkJaWYgKHNoaWZ0S2V5KSB7Ci0JCQkJCXNldFN0YXR1cyhTVEFUVVNfS0VZX0RPV04sIENNRF9TQVZFX0FMTCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZXRTdGF0dXMoU1RBVFVTX0tFWV9ET1dOLCBDTURfU0FWRSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9CQkJCi0JCQlicmVhazsKLQkJY2FzZSBLRVlfVjoKLQkJCWlmIChjdHJsS2V5KSB7CQkKLQkJCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCWV2ZW50LmtleUNvZGUgPSAtMTsKLQkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKLQkJCQkJaWYgKCFyZWFkT25seSkgewotCQkJCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1BBU1RFKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCFyZWFkT25seSkgewotCQkJCQkJLy8gV29ya2Fyb3VuZCBNb3ppbGxhL0ZpcmVmb3ggcGFzdGUgaXNzdWVzLgotCQkJCQkJc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX1BBU1RFKTsiLCAxMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfWDoKLQkJCWlmIChjdHJsS2V5KSB7Ci0JCQkJc2V0U3RhdHVzKFNUQVRVU19LRVlfRE9XTiwgQ01EX0NVVCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEtFWV9aOgotCQkJaWYgKCFyZWFkT25seSAmJiBjdHJsS2V5KSB7Ci0JCQkJc2V0VGltZW91dCgic2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7IiwgMTApOwotCQkJfQotCQkJZWxzZSBpZiAoIWRvY3VtZW50LmFsbCAmJiByZWFkT25seSkgewotCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0JCQl9CQkJCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlmICghZG9jdW1lbnQuYWxsICYmIHJlYWRPbmx5KSB7Ci0JCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKLQkJCX0KLQl9Ci19Ci0KLWZ1bmN0aW9uIHNlbENoYW5nZWQoZXZlbnQpIHsKLQl1cGRhdGVTZWxlY3Rpb24oKTsKLX0KLQotZnVuY3Rpb24gZW5hYmxlUmljaFRleHRFZGl0aW5nKGh0bWwpIHsKLQl2YXIgZG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JZG9jLmRlc2lnbk1vZGUgPSAib24iOwotCQotCXZhciBodG1sU3JjID0gJzxodG1sPjxoZWFkPjx0aXRsZT48L3RpdGxlPic7Ci0JCi0JaWYgKGVkaXRvckNTUyAhPSBudWxsICYmIGVkaXRvckNTUyAhPSAnJykgewotCQlodG1sU3JjICs9ICc8bGluayByZWw9IlN0eWxlU2hlZXQiIGhyZWY9IicgKyBlZGl0b3JDU1MgKyAnIiB0eXBlPSJ0ZXh0L2NzcyIvPic7Ci0JfQotCQotCWlmIChiYXNlSFJFRiAhPSBudWxsICYmIGJhc2VIUkVGICE9ICcnKSB7CQotCQlodG1sU3JjICs9ICc8YmFzZSBocmVmPSInICsgYmFzZUhSRUYgKyAnIi8+JzsKLQl9Ci0JCi0JaWYgKCFkb2N1bWVudC5hbGwgJiYgaHRtbCA9PSAnJykgewotCQkvLyBNb3ppbGxhL0ZpcmVmb3ggd2lsbCBvbmx5IGRpc3BsYXkgdGhlIGNhcmV0IGlmIDxici8+IGlzIGFkZGVkIHRvIHRoZSBIVE1MIGJvZHkuCi0JCS8vIEFkZGluZyA8YnIvPiBhbHNvIGVuYWJsZXMgdGhlIGJhY2tzcGFjZSBhbmQgZGVsZXRlIGtleSBieSBkZWZhdWx0LiBPdGhlcndpc2UsIHRoZQotCQkvLyB1c2VyIG5lZWQgdG8gZW50ZXIgc29tZSB0ZXh0IGJlZm9yZSB0aGVzZSAyIGtleXMgc3RhcnQgdG8gZnVuY3Rpb24uCi0JCWh0bWwgPSAiPGJyIC8+IjsKLQl9Ci0JCi0JaHRtbFNyYyArPSAnPC9oZWFkPjxib2R5PicgKyBodG1sICsgJzwvYm9keT48L2h0bWw+JzsKLQkKLQlkb2Mub3BlbigpOwotCWRvYy53cml0ZShodG1sU3JjKTsKLQlkb2MuY2xvc2UoKTsKLQkKLQltb2RpZmllZCA9IGZhbHNlOwotCi0JaWYgKCJhdHRhY2hFdmVudCIgaW4gZG9jKSB7Ci0JCWRvYy5hdHRhY2hFdmVudCgib25rZXlkb3duIiwga2V5UHJlc3NlZCk7Ci0JCWRvYy5hdHRhY2hFdmVudCgib25zZWxlY3Rpb25jaGFuZ2UiLCBzZWxDaGFuZ2VkKTsKLQkJLy8gZm9yIERuRCAoaW50ZXJuYWwpCi0JCWRvYy5ib2R5LmF0dGFjaEV2ZW50KCJvbmRyb3AiLCBjaGVja01vZGlmaWVkKTsKLQkJLy8gZm9yIGltYWdlL3RhYmxlIHJlc2l6aW5nOgotCQlkb2MuYm9keS5hdHRhY2hFdmVudCgib25yZXNpemVlbmQiLCBjaGVja01vZGlmaWVkKTsKLQl9CQotCWlmICgiYWRkRXZlbnRMaXN0ZW5lciIgaW4gZG9jKSB7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJrZXlwcmVzcyIsIGtleVByZXNzZWQsIHRydWUpOwotCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcigia2V5cHJlc3MiLCBzZWxDaGFuZ2VkLCBmYWxzZSk7Ci0JCWRvYy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwgc2VsQ2hhbmdlZCwgZmFsc2UpOwotCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcigiZHJhZ2Ryb3AiLCBjaGVja01vZGlmaWVkLCBmYWxzZSk7Ci0JCQotCQkvLyBjaGVjayBtb3VzZXVwIGV2ZW50IGZvciBpbWFnZS90YWJsZSByZXNpemluZwotCQlkb2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsIGNoZWNrTW9kaWZpZWQsIGZhbHNlKTsKLQl9Ci0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLX0KLQotLy8gdGhpcyBvbmUgaXMgZm9yIG1vZGlmaWNhdGlvbiBjaGVjayBvbiBkcmFnIG4gZHJvcCB3aXRoaW4gdGhlIFJURQotLy8gY2hlY2tNb2RpZmllZCBsaXN0ZW5lcgotZnVuY3Rpb24gY2hlY2tNb2RpZmllZChldmVudCkgewotCXNldFRpbWVvdXQoInNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOyIsIDEwKTsKLX0KLQotLy8gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IuCi1mdW5jdGlvbiBzZXRIZWlnaHQoaGVpZ2h0KSB7Ci0JaWYgKGluaXRpYWxpemVkKSB7Ci0JCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5oZWlnaHQgPSBoZWlnaHQgKyAicHgiOwotCX0KLX0KLQotLy8gU2V0cyB0aGUgc3RhdHVzLgotLy8gTm90ZTogQnkgZGVmYXVsdCwgRmlyZWZveCBkaXNhYmxlcyBjaGFuZ2VzIHRvIHRoZSBzdGF0dXMgYmFyLiBGb3IgdGhpcyB0byB3b3JrLCB0aGUgdXNlcgotLy8gbXVzdCBzZXQgdGhlIGdsb2JhbCBwcmVmZXJlbmNlICJkb20uZGlzYWJsZV93aW5kb3dfc3RhdHVzX2NoYW5nZSIgdG8gZmFsc2UuCi0vLyBGb3IgRmlyZWZveCAxLjAueCwgdGhpcyBzZXR0aW5nIGNhbiBiZSBtYWRlIGluIC91c3IvZmlyZWZveC0xLjAuNy9kZWZhdWx0cy9wcmVmL2ZpcmVmb3guanMuCi1mdW5jdGlvbiBzZXRTdGF0dXModHlwZSwgdmFsdWUpIHsKLQl2YXIgc3RhdHVzID0gJyQkJCcgKyB0eXBlOwotCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9ICcnKSB7Ci0JCXN0YXR1cyArPSAoJyQnICsgdmFsdWUpOwkJCi0JfQotCXdpbmRvdy5zdGF0dXMgPSBzdGF0dXM7Ci0Jd2luZG93LnN0YXR1cyA9ICckJCQnICsgU1RBVFVTX05PUDsKLX0KLQotLy8gUmV0dXJucyB0aGUgSFRNTCBzb3VyY2UuCi1mdW5jdGlvbiBnZXRIVE1MKCkgewotCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JaWYgKGh0bWwgPT0gIjxQPiZuYnNwOzwvUD4iKSB7Ci0JCWh0bWwgPSAiIjsKLQl9Ci0JaWYgKGh0bWwgIT0gbnVsbCAmJiBodG1sICE9ICcnKSB7Ci0JCXZhciByZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKSgvcmVzb3VyY2VzLykoW15cIl0rKVwiIiwgImciKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeCwgIlwiLi9yZXNvdXJjZXMvJDNcIiIpOwotCQlyZWdFeCA9IG5ldyBSZWdFeHAoIlwiZmlsZVw6KFtePV0qKS8jKFteXCJdKylcIiIsICJnIik7Ci0JCWh0bWwgPSBodG1sLnJlcGxhY2UocmVnRXgsICJcIiMkMlwiIik7Ci0JfQotCXJldHVybiBodG1sOwotfQotCi0vL1JldHVybnMgdGhlIEhUTUwgc291cmNlIHRvIHRoZSBKYXZhIGxheWVyCi1mdW5jdGlvbiBnZXRUZXh0KCkgewotCXZhciBodG1sID0gZ2V0SFRNTCgpOwotCXNldFN0YXR1cyhTVEFUVVNfR0VUX1RFWFQsIGh0bWwpOwotCXJldHVybiBodG1sOwotfQotCi1mdW5jdGlvbiBzZXRJbm5lckhUTUwoaHRtbCkgewotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJLy8gSUUgaGFzIHByb2JsZW0gc2V0dGluZyBjb21wbGV4IEhUTUwgc2V0IHZpYSBkb2MuYm9keS5pbm5lckhUTUwuCi0JCWVuYWJsZVJpY2hUZXh0RWRpdGluZyhodG1sKTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChodG1sID09ICcnKSB7Ci0JCQkvLyBNb3ppbGxhL0ZpcmVmb3ggd2lsbCBvbmx5IGRpc3BsYXkgdGhlIGNhcmV0IGlmIDxici8+IGlzIGFkZGVkIHRvIHRoZSBIVE1MIGJvZHkuCi0JCQlodG1sID0gIjxici8+IjsKLQkJfQotCQl2YXIgZG9jID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCWlmIChkb2MuYm9keSAhPSBudWxsKSB7Ci0JCQlkb2MuYm9keS5pbm5lckhUTUwgPSBodG1sOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gTW96aWxsYS9GaXJlZm94IGNhbiB0YWtlIGEgd2hpbGUgdG8gaW5pdGlhbGl6ZSBkb2N1bWVudC5ib2R5Ci0JCQkvLyBhZnRlciBkb2N1bWVudC53cml0ZSgpLgotCQkJdHJ5IHsKLQkJCQlzZXRUaW1lb3V0KCJzZXRJbm5lckhUTUwoJyIgKyBodG1sICsgIicpOyIsIDEwKTsKLQkJCX0KLQkJCWNhdGNoIChlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgdGhlIEhUTUwgc291cmNlLgotZnVuY3Rpb24gc2V0VGV4dChodG1sKSB7Ci0JaWYgKHN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJaHRtbCA9IGRlY29kZVN0cmluZyhodG1sKTsKLQkJc2VsZWN0aW9uSW5mbyA9IGdldFNlbGVjdGlvbkluZm8oKTsKLQkJc2V0SW5uZXJIVE1MKGh0bWwpOwotCQlpZiAoc2VsZWN0aW9uSW5mbyAhPSBudWxsKSB7Ci0JCQlzZXRUaW1lb3V0KCJzZXRTZWxlY3Rpb24oc2VsZWN0aW9uSW5mbyk7IiwgMTApOwotCQl9Ci0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCX0KLX0KLQotZnVuY3Rpb24gc2V0U2VsZWN0aW9uKHNlbGVjdGlvbkluZm8pIHsKLQlpZiAoIXN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJcmV0dXJuOwotCX0KLQkKLQljb250ZW50V2luZG93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3c7Ci0JZWRpdG9yRG9jID0gY29udGVudFdpbmRvdy5kb2N1bWVudDsKLQkKLQl0cnkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQl2YXIgc3RhcnRPZmZzZXQgPSBzZWxlY3Rpb25JbmZvLnN0YXJ0OwotCQkJdmFyIGxlbiA9IHNlbGVjdGlvbkluZm8ubGVuOwotCQkJaWYgKHN0YXJ0T2Zmc2V0ID09IDAgJiYgbGVuID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl2YXIgdGVtcFJhbmdlID0gZWRpdG9yRG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7Ci0JCQl0ZW1wUmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzdGFydE9mZnNldCk7Ci0JCQl0ZW1wUmFuZ2UuY29sbGFwc2UoKTsKLQkJCXRlbXBSYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBsZW4pOwotCQkJdGVtcFJhbmdlLnNlbGVjdCgpOwotCQkJdGVtcFJhbmdlLnNjcm9sbEludG9WaWV3KCk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3Rpb24gPSB0aGlzLndpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJCXZhciBzdGFydENvbnRhaW5lciA9IHNlbGVjdGlvbkluZm8uc3RhcnRDb250YWluZXI7Ci0JCQl2YXIgc3RhcnQgPSBzZWxlY3Rpb25JbmZvLnN0YXJ0OwotCQkJdmFyIGVuZENvbnRhaW5lciA9IHNlbGVjdGlvbkluZm8uZW5kQ29udGFpbmVyOwotCQkJdmFyIGVuZCA9IHNlbGVjdGlvbkluZm8uZW5kOwotCQkJdmFyIHRlbXBSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7Ci0JCQl0ZW1wUmFuZ2Uuc2V0U3RhcnQoc3RhcnRDb250YWluZXIsIHN0YXJ0KTsKLQkJCXRlbXBSYW5nZS5zZXRFbmQoZW5kQ29udGFpbmVyLCBlbmQpOwotCQkJc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpOwotCQkJc2VsZWN0aW9uLmFkZFJhbmdlKHRlbXBSYW5nZSk7Ci0JCQljb250ZW50V2luZG93LmZvY3VzKCk7Ci0JCX0KLQl9IGNhdGNoIChlKSB7Ci0JfQotfQotCi1mdW5jdGlvbiBnZXRTZWxlY3Rpb25JbmZvKCkgewotCWlmICghc3VwcG9ydFJpY2hUZXh0RWRpdGluZykgewotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQllZGl0b3JEb2MgPSBjb250ZW50V2luZG93LmRvY3VtZW50OwotCQotCXZhciB0ZW1wU2VsUmFuZ2U7Ci0JdHJ5IHsKLQkgICAgaWYgKGRvY3VtZW50LmFsbCkgewotCQkJc2VsZWN0aW9uID0gZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJCXRlbXBTZWxSYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJfQotCQkJLy8gbGVuZ3RoIG9mIHNlbGVjdGlvbgotCQkJdmFyIHRlbXBTZWxMZW4gPSB0ZW1wU2VsUmFuZ2UudGV4dC5sZW5ndGg7Ci0JCQkvLyBjcmVhdGUgbmV3IHJhbmdlCi0JCQl2YXIgdGVtcFJhbmdlID0gZWRpdG9yRG9jLmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7Ci0JCQkvLyBzZXQgZW5kIG9mIG5ldyByYW5nZSB0byBzdGFydCBvZiBzZWxlY3Rpb24KLQkJCS8vIHRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGVtcFNlbFJhbmdlIGlzIG5vdCBpbiBlZGl0b3IuZG9jLmJvZHkgKGllLCBhdCB0aGUgc3RhcnQgb2YgdGhlIFJURSkuCi0JCQl0ZW1wUmFuZ2Uuc2V0RW5kUG9pbnQoIkVuZFRvU3RhcnQiLCB0ZW1wU2VsUmFuZ2UpOwotCQkJLy8gbGVuZ3RoIG9mIG5ldyByYW5nZSBpcyB0aGUgc3RhcnQgb2Zmc2V0Ci0JCQl2YXIgdGVtcFRleHQgPSB0ZW1wUmFuZ2UudGV4dDsKLQkJCS8vIElFIGNvdW50cyBuZXdsaW5lcyBhcyAyIGNoYXJhY3RlcnMgZm9yIGxlbmd0aCBwcm9wZXJ0eSwgYnV0IHRoZXkgY291bnQgYXMgMSB3aGVuIHVzaW5nIG1vdmVTdGFydCBzbyByZW1vdmUgdGhlIFxyIHRvIG1ha2UgdGhlIGNvdW50IHRoZSBzYW1lCi0JCQl0ZW1wVGV4dCA9IHRlbXBUZXh0LnJlcGxhY2UoL1xyL2csICIiKTsKLQkJCXZhciBzdGFydE9mZnNldCA9IHRlbXBUZXh0Lmxlbmd0aDsKLQkJCQotCQkJcmV0dXJuIHtzdGFydDpzdGFydE9mZnNldCwgbGVuOnRlbXBTZWxMZW59OwotCSAgICB9IGVsc2UgewotCQkJc2VsZWN0aW9uID0gY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJCXRlbXBTZWxSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KHNlbGVjdGlvbi5yYW5nZUNvdW50IC0gMSkuY2xvbmVSYW5nZSgpOwotCQkJfQotCQkJcmV0dXJuIHtzdGFydENvbnRhaW5lcjogdGVtcFNlbFJhbmdlLnN0YXJ0Q29udGFpbmVyLCBzdGFydDp0ZW1wU2VsUmFuZ2Uuc3RhcnRPZmZzZXQsIAotCQkJCWVuZENvbnRhaW5lcjogdGVtcFNlbFJhbmdlLmVuZENvbnRhaW5lciwgZW5kOnRlbXBTZWxSYW5nZS5lbmRPZmZzZXR9OwotCSAgICB9Ci0JfSBjYXRjaCAoZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLS8vIERlY29kZXMgdGhlIEhUTUwgcGFzc2VkIGZyb20gdGhlIEphdmEgbGF5ZXIuCi1mdW5jdGlvbiBkZWNvZGVTdHJpbmcoc3RyKSB7Ci0JaWYgKHN0ciAhPSBudWxsICYmIHN0ciAhPSAnJykgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlzdHIgPSBzdHIucmVwbGFjZSgvJXNxJS9nLCAiJyIpOwotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVFT0wlL2csICJcbiIpOwotCQl9Ci0JCWVsc2UgewotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVzcSUvZywgIiZhcG9zOyIpOwotCQkJc3RyID0gc3RyLnJlcGxhY2UoLyVFT0wlL2csICIiKTsKLQkJCXN0ciA9IHN0ci5yZXBsYWNlKC9cbi9nLCAiIik7Ci0JCX0KLQl9Ci0JcmV0dXJuIHN0cjsKLX0KLQotLy8gdXBkYXRlcyBzZWxlY3Rpb24gd2l0aG91dCBub3RpZnlpbmcgdGhlIEphdmEgbGF5ZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotZnVuY3Rpb24gaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSB7Ci0JaWYgKCFzdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQllZGl0b3JEb2MgPSBjb250ZW50V2luZG93LmRvY3VtZW50OwotCQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJc2VsZWN0aW9uID0gZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJcmVmb3JtYXRFbGVtZW50TGlua3MoKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJc2VsZWN0aW9uID0gY29udGVudFdpbmRvdy5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KHNlbGVjdGlvbi5yYW5nZUNvdW50IC0gMSkuY2xvbmVSYW5nZSgpOwotCQkJaWYgKHNlbGVjdGlvblJhbmdlLnN0YXJ0Q29udGFpbmVyLm5vZGVOYW1lID09ICJIVE1MIiAmJgotCQkJCQlzZWxlY3Rpb25SYW5nZS5lbmRDb250YWluZXIubm9kZU5hbWUgPT0gIkhUTUwiKSB7Ci0JCQkJLy8gTW96aWxsYSBzZWxlY3RzIHRoZSB3aG9sZSBkb2N1bWVudCB3aGVuIHRoZXJlJ3Mgbm8gUlRFIGNvbnRlbnQsIHNvIHNlbGVjdCBqdXN0IHRoZSBib2R5Ci0JCQkJc2VsZWN0aW9uUmFuZ2UgPSBlZGl0b3JEb2MuY3JlYXRlUmFuZ2UoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zZXRTdGFydChlZGl0b3JEb2MuYm9keSwgMCk7Ci0JCQkJc2VsZWN0aW9uUmFuZ2Uuc2V0RW5kKGVkaXRvckRvYy5ib2R5LCAwKTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVXBkYXRlcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHNlbGVjdGlvbiByYW5nZS4KLWZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvbigpIHsKLQlpZiAoIXN1cHBvcnRSaWNoVGV4dEVkaXRpbmcpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0JCi0JY29udGVudFdpbmRvdyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93OwotCWVkaXRvckRvYyA9IGNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7Ci0JCi0JdmFyIHRlbXBTZWxSYW5nZTsKLQl2YXIgc2VsT2Zmc2V0U3RhcnQgPSAwOwotCXZhciBzZWxlY3RlZFRleHQgPSAiIjsKLQl2YXIgZm9udE5hbWUgPSAiIjsKLQl2YXIgZm9udFNpemUgPSAiIjsKLQl2YXIgYmxvY2tTdHlsZSA9ICIiOwotCXZhciB0ZXh0RmxhZ3MgPSAwOwotCQotCQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJc2VsZWN0aW9uID0gZWRpdG9yRG9jLnNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpOwotCQkJaWYgKHNlbGVjdGlvblJhbmdlICE9IG51bGwgJiYgc2VsZWN0aW9uLnR5cGUgIT0gIkNvbnRyb2wiKSB7Ci0JCQkJdGVtcFNlbFJhbmdlID0gc2VsZWN0aW9uUmFuZ2UuZHVwbGljYXRlKCk7Ci0JCQl9Ci0JCQlyZWZvcm1hdEVsZW1lbnRMaW5rcygpOwotCQl9Ci0JfQotCWVsc2UgewotCQlzZWxlY3Rpb24gPSBjb250ZW50V2luZG93LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoc2VsZWN0aW9uLnJhbmdlQ291bnQgLSAxKS5jbG9uZVJhbmdlKCk7Ci0JCQl0ZW1wU2VsUmFuZ2UgPSBzZWxlY3Rpb25SYW5nZS5jbG9uZVJhbmdlKCk7Ci0JCX0KLQl9Ci0JaWYgKHRlbXBTZWxSYW5nZSAhPSBudWxsKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJaWYgKHNlbGVjdGlvblJhbmdlLnRleHQpIHsKLQkJCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0aW9uUmFuZ2UudGV4dDsKLQkJCQl9Ci0JCQkJLyogZm9yIGdldHRpbmcgc2VsZWN0aW9uIG9mZnNldCAtIGNvbW1lbnRlZCBiZWNhdXNlIHdlIGNhbid0IHNlbGVjdCB0aGUKLQkJCQkgKiBwcm9wZXIgbG9jYXRpb24gaW4gdGhlIEhUTUwgc291cmNlIHRhYiBiZWNhdXNlIEpUaWR5J3MgcmVmb3JtYXR0aW5nIG9mIHRoZSBIVE1MCi0JCQkJdmFyIGh0bWwgPSBnZXRIVE1MKCk7Ci0JICAgICAgICAgICAgdmFyIHRlbXBTZWxMZW4gPSB0ZW1wU2VsUmFuZ2UuaHRtbFRleHQubGVuZ3RoOwkJCQotCSAgICAgICAgICAgIHRlbXBTZWxSYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIC1odG1sLmxlbmd0aCk7Ci0JICAgICAgICAgICAgc2VsT2Zmc2V0U3RhcnQgPSB0ZW1wU2VsUmFuZ2UuaHRtbFRleHQubGVuZ3RoIC0gdGVtcFNlbExlbjsKLQkgICAgICAgICAgICAqLwotCQkJCXZhciBzZWxQYXJlbnQgPSB0ZW1wU2VsUmFuZ2UucGFyZW50RWxlbWVudCgpOwotCQkJCWZvbnROYW1lID0gdGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250TmFtZScpOwotCQkJCWZvbnRTaXplID0gdGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250U2l6ZScpOwotCQkJCWJsb2NrU3R5bGUgPSB0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2Zvcm1hdEJsb2NrJyk7Ci0JCQkJaWYgKGJsb2NrU3R5bGUgPT0gIk5vcm1hbCIpIHsKLQkJCQkJaWYgKHNlbFBhcmVudC5jbGFzc05hbWUgPT0gInF1b3RlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cXVvdGU+IjsKLQkJCQkJfSBlbHNlIGlmIChzZWxQYXJlbnQuY2xhc3NOYW1lID09ICJjb2RlU2FtcGxlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8Y29kZT4iOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDMiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGgzPiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDQiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg0PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJIZWFkaW5nIDUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg1PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICIiIHx8IGJsb2NrU3R5bGUgPT0gbnVsbCkgewotCQkJCQlibG9ja1N0eWxlID0gIjxwPiI7Ci0JCQkJfQotCQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ2JvbGQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBCT0xEOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdpdGFsaWMnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBJVEFMSUM7Ci0JCQkJfQotCQkJCWlmICh0ZW1wU2VsUmFuZ2UucXVlcnlDb21tYW5kVmFsdWUoJ3VuZGVybGluZScpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IFVOREVSTElORTsKLQkJCQl9Ci0JCQkJaWYgKHRlbXBTZWxSYW5nZS5xdWVyeUNvbW1hbmRWYWx1ZSgnc3Vic2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gU1VCU0NSSVBUOwotCQkJCX0KLQkJCQlpZiAodGVtcFNlbFJhbmdlLnF1ZXJ5Q29tbWFuZFZhbHVlKCdzdXBlcnNjcmlwdCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IFNVUEVSU0NSSVBUOwotCQkJCX0KLQkJCQlzZXRTdGF0dXMoU1RBVFVTX1NFTEVDVF9URVhULCAvKiBzZWxPZmZzZXRTdGFydCArICIkIiArICovCi0JCQkJCQlmb250TmFtZSArICIkIiArIGZvbnRTaXplICsgIiQiICsgYmxvY2tTdHlsZSArICIkIiArIHRleHRGbGFncyArICIkIiArIHNlbGVjdGVkVGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzZWxlY3Rpb25SYW5nZSAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGVkVGV4dCA9IHNlbGVjdGlvblJhbmdlLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXZhciBzZWxQYXJlbnQgPSBzZWxlY3Rpb24uZm9jdXNOb2RlOwotCQkJCWZvbnROYW1lID0gZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb250TmFtZScpOwotCQkJCWlmIChmb250TmFtZSA9PSAiIikgewotCQkJCQlmb250TmFtZSA9ICJkZWZhdWx0IjsKLQkJCQl9Ci0JCQkJZm9udFNpemUgPSBlZGl0b3JEb2MucXVlcnlDb21tYW5kVmFsdWUoJ2ZvbnRTaXplJyk7Ci0JCQkJaWYgKGZvbnRTaXplID09ICIiKSB7Ci0JCQkJCWZvbnRTaXplID0gImRlZmF1bHQiOwotCQkJCX0KLQkJCQlibG9ja1N0eWxlID0gZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFZhbHVlKCdmb3JtYXRCbG9jaycpOwotCQkJCWlmIChibG9ja1N0eWxlID09ICJwIikgewotCQkJCQlpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJxdW90ZSIpIHsKLQkJCQkJCWJsb2NrU3R5bGUgPSAiPHF1b3RlPiI7Ci0JCQkJCX0gZWxzZSBpZiAoc2VsUGFyZW50LnBhcmVudE5vZGUuY2xhc3NOYW1lID09ICJjb2RlU2FtcGxlIikgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8Y29kZT4iOwotCQkJCQl9IGVsc2UgewotCQkJCQkJYmxvY2tTdHlsZSA9ICI8cD4iOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICJoMyIpIHsKLQkJCQkJYmxvY2tTdHlsZSA9ICI8aDM+IjsKLQkJCQl9IGVsc2UgaWYgKGJsb2NrU3R5bGUgPT0gImg0IikgewotCQkJCQlibG9ja1N0eWxlID0gIjxoND4iOwotCQkJCX0gZWxzZSBpZiAoYmxvY2tTdHlsZSA9PSAiaDUiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPGg1PiI7Ci0JCQkJfSBlbHNlIGlmIChibG9ja1N0eWxlID09ICIiKSB7Ci0JCQkJCWJsb2NrU3R5bGUgPSAiPHA+IjsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgnYm9sZCcpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IEJPTEQ7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ2l0YWxpYycpID09IHRydWUpIHsKLQkJCQkJdGV4dEZsYWdzIHw9IElUQUxJQzsKLQkJCQl9Ci0JCQkJaWYgKGVkaXRvckRvYy5xdWVyeUNvbW1hbmRTdGF0ZSgndW5kZXJsaW5lJykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gVU5ERVJMSU5FOwotCQkJCX0KLQkJCQlpZiAoZWRpdG9yRG9jLnF1ZXJ5Q29tbWFuZFN0YXRlKCdzdWJzY3JpcHQnKSA9PSB0cnVlKSB7Ci0JCQkJCXRleHRGbGFncyB8PSBTVUJTQ1JJUFQ7Ci0JCQkJfQotCQkJCWlmIChlZGl0b3JEb2MucXVlcnlDb21tYW5kU3RhdGUoJ3N1cGVyc2NyaXB0JykgPT0gdHJ1ZSkgewotCQkJCQl0ZXh0RmxhZ3MgfD0gU1VQRVJTQ1JJUFQ7Ci0JCQkJfQotCQkJCXNldFN0YXR1cyhTVEFUVVNfU0VMRUNUX1RFWFQsIC8qIHNlbE9mZnNldFN0YXJ0ICsgIiQiICsgKi8KLQkJCQkJCWZvbnROYW1lICsgIiQiICsgZm9udFNpemUgKyAiJCIgKyBibG9ja1N0eWxlICsgIiQiICsgdGV4dEZsYWdzICsgIiQiICsgc2VsZWN0ZWRUZXh0KTsKLQkJCX0KLQkJfSBjYXRjaCAoZSkgeyB9Ci0JfQkKLQotCXJldHVybiB0cnVlOwotfQotCi0vLyBTZXRzIGZvY3VzIHRvIHRoaXMgZWRpdG9yLgotZnVuY3Rpb24gc2V0Rm9jdXMoKSB7Ci0JaWYgKCFzdXBwb3J0UmljaFRleHRFZGl0aW5nKSB7Ci0JCXJldHVybjsKLQl9CQotCWNvbnRlbnRXaW5kb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlZGl0b3JJZCkuY29udGVudFdpbmRvdzsKLQljb250ZW50V2luZG93LmZvY3VzKCk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7CQotfQotCi0vLyBSZWZvcm1hdHMgZWxlbWVudCBsaW5rcyBjcmVhdGVkIHZpYSBkcmFnICYgZHJvcC4KLWZ1bmN0aW9uIHJlZm9ybWF0RWxlbWVudExpbmtzKCkgewotCXZhciBsaW5rc1JlZm9ybWF0dGVkID0gMDsKLQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0EnKTsKLQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCWlmIChlbGVtZW50LmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpID09ICdlbGVtZW50bGluaycgfHwKLQkJCQllbGVtZW50LmNsYXNzTmFtZS50b0xvd2VyQ2FzZSgpID09ICdlbGVtZW50bGlua3dpdGh0eXBlJyB8fAotCQkJCWVsZW1lbnQuY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2VsZW1lbnRsaW5rd2l0aHVzZXJ0ZXh0JykgewotIAkJCWlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBlbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZCAhPSBudWxsICYmCi0gCQkJCWVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkLmZpcnN0Q2hpbGQgIT0gbnVsbCkgewotIAkJCQl2YXIgbGlua1RleHQgPSBlbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5maXJzdENoaWxkLm5vZGVWYWx1ZTsKLSAJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpOwotIAkJCQllbGVtZW50LmFwcGVuZENoaWxkKGVkaXRvckRvYy5jcmVhdGVUZXh0Tm9kZShsaW5rVGV4dCkpOwotIAkJCQlsaW5rc1JlZm9ybWF0dGVkKys7Ci0gCQkJfQotCQl9Ci0JfQotCWlmIChsaW5rc1JlZm9ybWF0dGVkID4gMCkgewotCQlzZXRTdGF0dXMoU1RBVFVTX1JFRk9STUFUX0xJTktTLCBudWxsKTsKLQl9Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBmb3JtYXRUZXh0KGNvbW1hbmQsIG9wdGlvbikgewotCWlmICghcmVhZE9ubHkgJiYgaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKGNvbW1hbmQsIGZhbHNlLCBvcHRpb24pKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCQotCQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JCX0KLQl9Ci19Ci0KLS8vIEFkZHMgSFRNTC4KLWZ1bmN0aW9uIGFkZEhUTUwoaHRtbCkgewotCWlmICghcmVhZE9ubHkgJiYgaHRtbCAhPSAiIikgIHsKLQkJaHRtbCA9IGRlY29kZVN0cmluZyhodG1sKTsKLQkJaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCQlpZiAoc2VsZWN0aW9uUmFuZ2UudGV4dCAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvblJhbmdlLnBhc3RlSFRNTChodG1sKTsKLQkJCQkJc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0JCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvblJhbmdlLmRlbGV0ZUNvbnRlbnRzKCk7Ci0JCQkJdmFyIGRvY3VtZW50RnJhZ21lbnQgPSBzZWxlY3Rpb25SYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbCk7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudEZyYWdtZW50KTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gQWRkcyBhbiBpbWFnZS4KLWZ1bmN0aW9uIGFkZEltYWdlKHVybCwgaGVpZ2h0LCB3aWR0aCwgYWx0KSB7Ci0JaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGRvY3VtZW50LmFsbCkgewotCQkJaWYgKHVybCAhPSBudWxsICYmIHVybCAhPSAnJykgewotCQkJCWZvcm1hdFRleHQoJ2luc2VydGltYWdlJywgdXJsKTsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb24udHlwZSA9PSAnQ29udHJvbCcgJiYgc2VsZWN0aW9uUmFuZ2UgIT0gbnVsbCkgewotCQkJCWlmIChoZWlnaHQgIT0gbnVsbCAmJiBoZWlnaHQgIT0gJycpIHNlbGVjdGlvblJhbmdlLml0ZW0oKS5oZWlnaHQgPSBoZWlnaHQ7Ci0JCQkJaWYgKHdpZHRoICE9IG51bGwgJiYgd2lkdGggIT0gJycpIHNlbGVjdGlvblJhbmdlLml0ZW0oKS53aWR0aCA9IHdpZHRoOwotCQkJCWlmIChhbHQgIT0gbnVsbCkgc2VsZWN0aW9uUmFuZ2UuaXRlbSgpLmFsdCA9IGFsdDsJCQotCQkJfQotCQl9IGVsc2UgewotCQkJdmFyIFNUQVJUX01BUktFUiA9ICJBXy1fLV8iOwotCQkJdmFyIEVORF9NQVJLRVIgPSAiOi46LjoiOwotCQkJCS8vIG1hcmsgaW1nIGxpbmtzIHdpdGggU1RBUlRfTUFSS0VSICsgaWQgKyBFTkRfTUFSS0VSIGluIHRoZSBpZCwgZm9yIGxhdGVyIHJlY292ZXJ5Ci0JCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJZWxlbWVudC5pZCA9IFNUQVJUX01BUktFUiArIGVsZW1lbnQuaWQgKyBFTkRfTUFSS0VSOwotCQkJfQotCQkJaWYgKHVybCAhPSBudWxsICYmIHVybCAhPSAnJykgewotCQkJCWZvcm1hdFRleHQoJ2luc2VydGltYWdlJywgdXJsKTsKLQkJCX0KLQkJCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCQkJdmFyIHJlZ0V4SUQgPSBuZXcgUmVnRXhwKFNUQVJUX01BUktFUiArICIoLio/KSIgKyBFTkRfTUFSS0VSKTsKLQkJCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJCXZhciBtYXRjaEFycmF5ID0gaWQubWF0Y2gocmVnRXhJRCk7Ci0JCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCXZhciBuZXdJZCA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQkJaWYgKG5ld0lkLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJZWxlbWVudC5pZCA9IG5ld0lkOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpZCcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vIGlkLCBtdXN0IGJlIHRoZSBuZXcgaW1nCi0JCQkJCQlpZiAoaGVpZ2h0ICE9IG51bGwgJiYgaGVpZ2h0ICE9ICcnKSBlbGVtZW50LmhlaWdodCA9IGhlaWdodDsKLQkJCQkJCWlmICh3aWR0aCAhPSBudWxsICYmIHdpZHRoICE9ICcnKSBlbGVtZW50LndpZHRoID0gd2lkdGg7Ci0JCQkJCQlpZiAoYWx0ICE9IG51bGwpIGVsZW1lbnQuYWx0ID0gYWx0OwkJCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci0JfQotfQotCi0vLyBBZGRzIGEgaG9yaXpvbnRhbCBsaW5lLgotZnVuY3Rpb24gYWRkTGluZSgpIHsKLQlmb3JtYXRUZXh0KCdpbnNlcnRob3Jpem9udGFscnVsZScsIG51bGwpOwotfQotCi0vLyBBZGRzIGEgbGluay4KLWZ1bmN0aW9uIGFkZExpbmsodXJsKSB7Ci0JaWYgKCFyZWFkT25seSAmJiB1cmwgIT0gbnVsbCAmJiB1cmwgIT0gJycgJiYgaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlpZiAoc2VsZWN0aW9uUmFuZ2UudGV4dCA9PSBudWxsIHx8IHNlbGVjdGlvblJhbmdlLnRleHQgPT0gJycpIHsKLQkJCQlzZWxlY3Rpb25SYW5nZS50ZXh0ID0gdXJsOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQkJZWxzZSBpZiAoc2VsZWN0aW9uUmFuZ2UuZXhlY0NvbW1hbmQoJ2NyZWF0ZWxpbmsnLCBmYWxzZSwgdXJsKSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbiA9PSAiIikgewkJCi0JCQkJdmFyIHVybFRleHROb2RlID0gZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKHVybCk7Ci0JCQkJaW5zZXJ0Tm9kZUF0U2VsZWN0aW9uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvckZyYW1lSWQpLmNvbnRlbnRXaW5kb3csIHVybFRleHROb2RlKTsKLQkJCX0JCQkKLQkJCWlmIChlZGl0b3JEb2MuZXhlY0NvbW1hbmQoJ2NyZWF0ZWxpbmsnLCBmYWxzZSwgdXJsKSkgewotCQkJCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQkJCXNldFN0YXR1cyhTVEFUVVNfTU9ESUZJRUQsIG51bGwpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBBZGRzIGFuIG9yZGVyZWQgbGlzdC4KLWZ1bmN0aW9uIGFkZE9yZGVyZWRMaXN0KCkgewotCWZvcm1hdFRleHQoJ2luc2VydG9yZGVyZWRsaXN0JywgbnVsbCk7Ci19Ci0KLS8vIEFkZHMgYSB0YWJsZS4KLWZ1bmN0aW9uIGFkZFRhYmxlKHJvd3MsIGNvbHMsIHdpZHRoLCBzdW1tYXJ5LCBjYXB0aW9uLCB0YWJsZWhlYWRlcnMpIHsKLQlpZiAocmVhZE9ubHkpIHJldHVybjsKLQlpZiAocm93cyA9PSAwKSByb3dzID0gMjsKLQlpZiAoY29scyA9PSAwKSBjb2xzID0gMjsKLQlpZiAod2lkdGggPT0gMCkgd2lkdGggPSAiODUlIjsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQl2YXIgdGFibGUgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKLQkJdGFibGUuY2VsbFBhZGRpbmcgPSAiMiI7Ci0JCXRhYmxlLmNlbGxTcGFjaW5nID0gIjAiOwotCQl0YWJsZS5ib3JkZXIgPSAiMSI7Ci0JCXRhYmxlLndpZHRoID0gd2lkdGg7Ci0JCXRhYmxlLnRpdGxlID0gIiI7Ci0JCWlmIChzdW1tYXJ5ICE9IG51bGwgJiYgc3VtbWFyeSAhPSAnJykgewotCQkJdGFibGUuc3VtbWFyeSA9IHN1bW1hcnk7Ci0JCX0KLQkJaWYgKGNhcHRpb24gIT0gbnVsbCAmJiBjYXB0aW9uICE9ICcnKSB7Ci0JCQl0YWJsZS50aXRsZSA9IGNhcHRpb247Ci0JCQl0YWJsZS5jcmVhdGVDYXB0aW9uKCk7Ci0JCQl2YXIgY2FwdGlvbk5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUoY2FwdGlvbik7Ci0JCQl0YWJsZS5jYXB0aW9uLmFwcGVuZENoaWxkKGNhcHRpb25Ob2RlKTsKLQkJfQotCQl0Ym9keSA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IHJvd3M7IGkrKykgewotCQkJdHIgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidHIiKTsKLQkJCWZvciAodmFyIGogPSAwOyBqIDwgY29sczsgaisrKSB7Ci0JCQkJaWYgKGkgPT0gMCAmJiAodGFibGVoZWFkZXJzID09IFRBQkxFX0hFQURFUlNfQ09MUyB8fCB0YWJsZWhlYWRlcnMgPT0gVEFCTEVfSEVBREVSU19CT1RIKSkgewotCQkJCQl0aCA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJ0aCIpOwotCQkJCQl0aC5zY29wZSA9ICJjb2wiOwotCQkJCQl0aC5pZCA9ICIiOwotCQkJCQl0aC5hYmJyID0gdGguaWQ7Ci0JCQkJCXZhciBoZWFkZXJOb2RlID0gZWRpdG9yRG9jLmNyZWF0ZVRleHROb2RlKHRoLmlkKTsKLQkJCQkJdGguYXBwZW5kQ2hpbGQoaGVhZGVyTm9kZSk7Ci0JCQkJCWlmICghZG9jdW1lbnQuYWxsKSB7Ci0JCQkJCQliciA9IGVkaXRvckRvYy5jcmVhdGVFbGVtZW50KCJiciIpOwotCQkJCQkJdGguYXBwZW5kQ2hpbGQoYnIpOwotCQkJCQl9Ci0JCQkJCXRyLmFwcGVuZENoaWxkKHRoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaiA9PSAwICYmICh0YWJsZWhlYWRlcnMgPT0gVEFCTEVfSEVBREVSU19ST1dTIHx8IHRhYmxlaGVhZGVycyA9PSBUQUJMRV9IRUFERVJTX0JPVEgpKSB7Ci0JCQkJCXRoID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoInRoIik7Ci0JCQkJCXRoLnNjb3BlID0gInJvdyI7Ci0JCQkJCXRoLmlkID0gIiI7Ci0JCQkJCXRoLmFiYnIgPSB0aC5pZDsKLQkJCQkJdmFyIGhlYWRlck5vZGUgPSBlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUodGguaWQpOwotCQkJCQl0aC5hcHBlbmRDaGlsZChoZWFkZXJOb2RlKTsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0aC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGQgPSBlZGl0b3JEb2MuY3JlYXRlRWxlbWVudCgidGQiKTsKLQkJCQkJaWYgKCFkb2N1bWVudC5hbGwpIHsKLQkJCQkJCWJyID0gZWRpdG9yRG9jLmNyZWF0ZUVsZW1lbnQoImJyIik7Ci0JCQkJCQl0ZC5hcHBlbmRDaGlsZChicik7Ci0JCQkJCX0KLQkJCQkJdHIuYXBwZW5kQ2hpbGQodGQpOwotCQkJCX0KLQkJCX0KLQkJCXRib2R5LmFwcGVuZENoaWxkKHRyKTsKLSAgICAJfQotCQl0YWJsZS5hcHBlbmRDaGlsZCh0Ym9keSk7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJCXNlbGVjdGlvblJhbmdlLnBhcmVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZCh0YWJsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5pbnNlcnROb2RlKHRhYmxlKTsKLQkJfQotCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7CQkJCi0JfQotfQotCi0vLyBBZGRzIGFuIHVub3JkZXJlZCBsaXN0LgotZnVuY3Rpb24gYWRkVW5vcmRlcmVkTGlzdCgpIHsKLQlmb3JtYXRUZXh0KCdpbnNlcnR1bm9yZGVyZWRsaXN0JywgbnVsbCk7Ci19Ci0KLS8vIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBiYWNrQ29sb3IoY29sb3IpIHsKLQlpZiAoY29sb3IgIT0gbnVsbCAmJiBjb2xvciAhPSAnJykgewotCQlmb3JtYXRUZXh0KCdiYWNrY29sb3InLCBjb2xvcik7Ci0JfQotfQotCi0vLyBUb2dnbGVzIHRoZSAnYm9sZCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gYm9sZCgpIHsKLQlmb3JtYXRUZXh0KCdib2xkJywgbnVsbCk7Ci19Ci0KLS8vIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gY29weSgpIHsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZWRpdG9yRG9jLmV4ZWNDb21tYW5kKCdjb3B5JywgZmFsc2UsIG51bGwpKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJfQotCX0KLX0KLQotLy8gQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gY3V0KCkgewotCWZvcm1hdFRleHQoJ2N1dCcsIG51bGwpOwotfQotCi0vLyBEZWxldGVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gZGVsZXRlVGV4dCgpIHsKLQlmb3JtYXRUZXh0KCdkZWxldGUnLCBudWxsKTsKLX0KLQotLy8gRmluZHMgdGV4dC4KLWZ1bmN0aW9uIGZpbmRUZXh0KHRleHQsIGRpciwgb3B0aW9ucykgewotCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PSAiIikgewotCQlyZXR1cm47Ci0JfQotCWVsc2UgewotCQl0ZXh0ID0gZGVjb2RlU3RyaW5nKHRleHQpOwotCX0KLQkKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJCWlmIChzZWxlY3Rpb25SYW5nZS5maW5kVGV4dCh0ZXh0LCBkaXIsIG9wdGlvbnMpKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2Uuc2Nyb2xsSW50b1ZpZXcoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5zZWxlY3QoKTsKLQkJCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCX0KLQkJfQotCQllbHNlIHsJCi0JCQkvLyBmaW5kKHRleHQsIGNhc2VTZW5zaXRpdmUsIGJhY2t3YXJkcywgd3JhcEFyb3VuZCwgd2hvbGVXb3JkLCBzZWFyY2hJbkZyYW1lcywgc2hvd0RpYWxvZykKLQkJCXZhciBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKLQkJCXZhciBiYWNrd2FyZHMgPSBmYWxzZTsKLQkJCXZhciB3aG9sZVdvcmQgPSB0cnVlOwotCQkJaWYgKChvcHRpb25zICYgNCkgPT0gMCkgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCQkJaWYgKGRpciA9PSAtMSkgYmFja3dhcmRzID0gdHJ1ZTsKLQkJCWlmICgob3B0aW9ucyAmIDIpID09IDApIHdob2xlV29yZCA9IGZhbHNlOwotCQkJaWYgKGNvbnRlbnRXaW5kb3cuZmluZCh0ZXh0LCBjYXNlU2Vuc2l0aXZlLCBiYWNrd2FyZHMsIGZhbHNlLCB3aG9sZVdvcmQsIGZhbHNlLCBmYWxzZSkpIHsKLQkJCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGZvcmVDb2xvcihjb2xvcikgewotCWlmIChjb2xvciAhPSBudWxsICYmIGNvbG9yICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2ZvcmVjb2xvcicsIGNvbG9yKTsKLQl9Ci19Ci0KLS8vIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQgdXNpbmcgdGhlIGdpdmVuIEhUTUwgaGVhZGluZyB0YWcuCi1mdW5jdGlvbiBmb3JtYXRCbG9jayh0YWcpIHsKLQlpZiAodGFnICE9IG51bGwgJiYgdGFnICE9ICcnKSB7Ci0JCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgdGFnKTsKLQl9Ci19Ci0KLQotdmFyIElOREVOVEVEX0xJU1RfQkFEX0hUTUxfSUUgPSAiPC9saT4uKjxsaSBzdHlsZT1cImxpc3Qtc3R5bGU6IG5vbmVcIj4iOwotdmFyIElOREVOVEVEX0xJU1RfQkFEX0hUTUxfTU9aID0gIjwvbGk+Lio8bGkgc3R5bGU9XCJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7IGxpc3Qtc3R5bGUtaW1hZ2U6IG5vbmU7IGxpc3Qtc3R5bGUtcG9zaXRpb246IG91dHNpZGU7XCI+IjsKLQotLy8gSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGluZGVudCgpIHsKLQlmb3JtYXRUZXh0KCdpbmRlbnQnLCBudWxsKTsKLQkvLyBmaXggZm9yIHN1Yi1saXN0cwotCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlodG1sID0gaHRtbC5yZXBsYWNlKElOREVOVEVEX0xJU1RfQkFEX0hUTUxfSUUsICIiKTsKLQl9IGVsc2UgewotCQkvLyBmaXJlZm94IHNvbWV0aW1lcyBwdXRzIHRoZSBzYW1lIGFzIElFLCBzb21ldGltZXMgbW9yZSBqdW5rCi0JCWh0bWwgPSBodG1sLnJlcGxhY2UoSU5ERU5URURfTElTVF9CQURfSFRNTF9JRSwgIiIpOwotCQlodG1sID0gaHRtbC5yZXBsYWNlKElOREVOVEVEX0xJU1RfQkFEX0hUTUxfTU9aLCAiIik7Ci0JfQotCXNldFRleHQoaHRtbCk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdpdGFsaWMnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGl0YWxpYygpIHsKLQlmb3JtYXRUZXh0KCdpdGFsaWMnLCBudWxsKTsKLX0KLQotLy8gQ2VudGVyIGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlDZW50ZXIoKSB7Ci0JZm9ybWF0VGV4dCgnanVzdGlmeWNlbnRlcicsIG51bGwpOwotfQotCi0vLyBGdWxseSBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBqdXN0aWZ5RnVsbCgpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5ZnVsbCcsIG51bGwpOwotfQotCi0vLyBMZWZ0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlMZWZ0KCkgewotCWZvcm1hdFRleHQoJ2p1c3RpZnlsZWZ0JywgbnVsbCk7Ci19Ci0KLS8vIFJpZ2h0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIGp1c3RpZnlSaWdodCgpIHsKLQlmb3JtYXRUZXh0KCdqdXN0aWZ5cmlnaHQnLCBudWxsKTsKLX0KLQotLy8gT3V0ZGVudHMgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBvdXRkZW50KCkgewotCWZvcm1hdFRleHQoJ291dGRlbnQnLCBudWxsKTsKLX0KLQotLy8gUGFzdGVzIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkLgotZnVuY3Rpb24gcGFzdGUoc291cmNlVVJMKSB7Ci0JaWYgKHNvdXJjZVVSTCA9PSBudWxsKSB7Ci0JCXNvdXJjZVVSTCA9ICIiOwotCX0KLQllbHNlIHsKLQkJc291cmNlVVJMID0gZGVjb2RlU3RyaW5nKHNvdXJjZVVSTCk7Ci0JfQotCWlmIChkb2N1bWVudC5hbGwpIHsKLQkJdmFyIFNUQVJUX01BUktFUiA9ICJBXy1fLV8iOwotCQl2YXIgRU5EX01BUktFUiA9ICI6LjouOiI7Ci0JCS8vIG1hcmsgaW1nIGFuZCA8YSAvPiBsaW5rcyB3aXRoIFNUQVJUX01BUktFUiArIHNyYy9ocmVmICsgRU5EX01BUktFUiBpbiB0aGUgaWQsIGZvciBsYXRlciByZWNvdmVyeQotCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQlmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCWVsZW1lbnQuaWQgPSBTVEFSVF9NQVJLRVIgKyBlbGVtZW50LnNyYyArIEVORF9NQVJLRVIgKyBpZDsKLQkJfQotCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKLQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJdmFyIGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQllbGVtZW50LmlkID0gU1RBUlRfTUFSS0VSICsgZWxlbWVudC5ocmVmICsgRU5EX01BUktFUiArIGlkOwotCQl9Ci0KLQkJLy8gY2hhbmdlIHRoZSA8YmFzZT4gb2YgdGhlIGRvY3VtZW50Ci0JCXZhciBvbGRCYXNlSFJFRiA9IGVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWY7Ci0JCWVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWYgPSBzb3VyY2VVUkw7Ci0KLQkJZm9ybWF0VGV4dCgncGFzdGUnLCBudWxsKTsKLQkJCi0JCS8vIHJlc3RvcmUgPGJhc2U+Ci0JCWVkaXRvckRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdLmhyZWYgPSBvbGRCYXNlSFJFRjsKLQl9Ci0JZWxzZSB7Ci0JCXNldFN0YXR1cyhTVEFUVVNfRVhFQ19DTUQsIDEpOwotCQlzZXRTdGF0dXMoU1RBVFVTX01PRElGSUVELCBudWxsKTsKLQl9Ci0JaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJdHJ5IHsKLQkJCXZhciByZWdFeFJlcyA9IG5ldyBSZWdFeHAoImZpbGVcOihbXj1dKykoL3Jlc291cmNlcy8pKC4rKSIsICJnIik7Ci0JCQl2YXIgcmVnRXhSZWYgPSBuZXcgUmVnRXhwKCIoLispKCMuKykiKTsKLQkJCXZhciByZWdFeCA9IG5ldyBSZWdFeHAoImZpbGVcOihbXj1dKykvKFteL10rKSIsICJnIik7CQotCQkJdmFyIHJlZ0V4SUQgPSBuZXcgUmVnRXhwKFNUQVJUX01BUktFUiArICIoLio/KSIgKyBFTkRfTUFSS0VSICsgIiguKj8pIik7Ci0JCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpOwotCQkJZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXZhciBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkJdmFyIGlkID0gZWxlbWVudC5pZDsKLQkJCQlpZiAoaWQgIT0gbnVsbCAmJiBpZCAhPSAnJykgewotCQkJCQlSZWdFeHAubGFzdEluZGV4PTA7Ci0JCQkJCXZhciBtYXRjaEFycmF5ID0gaWQubWF0Y2gocmVnRXhJRCk7Ci0JCQkJCWlmIChtYXRjaEFycmF5ICE9IG51bGwgJiYgbWF0Y2hBcnJheS5sZW5ndGggPiAxKSB7Ci0JCQkJCQllbGVtZW50LnNyYyA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQlpZiAobWF0Y2hBcnJheS5sZW5ndGggPiAyICYmIG1hdGNoQXJyYXlbMl0ubGVuZ3RoID4gMCkgewotCQkJCQkJCWVsZW1lbnQuaWQgPSBtYXRjaEFycmF5WzJdOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7Ci0JCQkJCQl9Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQl2YXIgc3JjID0gZWxlbWVudC5zcmM7Ci0JCQkJaWYgKHNyYyAhPSBudWxsICYmIHNyYyAhPSAnJykgewotCQkJCQlpZiAoc3JjLmluZGV4T2YoJ2Fib3V0Oi4vcmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCS8vIGZpeCBmb3IgSUUgNyB3aGVuIHBhc3RpbmcgZnJvbSBhbm90aGVyIFJURQotCQkJCQkJLy8gSUU3IHJlc29sdmVzIHRoZXNlIGFzICJhYm91dDouL3Jlc291cmNlcy88ZmlsZT4iCi0JCQkJCQkvLyBzbyByZW1vdmUgdGhlICJhYm91dDouIgotCQkJCQkJc3JjID0gc3JjLnJlcGxhY2UoImFib3V0OiIsICIiKTsKLQkJCQkJfQotCQkJCQlpZiAoc3JjLmluZGV4T2YoJ2Fib3V0OnJlc291cmNlcycpICE9IC0xKSB7Ci0JCQkJCQkvLyBmaXggZm9yIElFIDcgd2hlbiBwYXN0aW5nIGZyb20gYW5vdGhlciBSVEUKLQkJCQkJCS8vIElFNyBzb21ldGltZXMgcmVzb2x2ZXMgdGhlc2UgYXMgImFib3V0OnJlc291cmNlcy88ZmlsZT4iCi0JCQkJCQkvLyBzbyByZW1vdmUgdGhlICJhYm91dDoiIGFuZCBwdXQgaW4gIi4vIgotCQkJCQkJc3JjID0gc3JjLnJlcGxhY2UoImFib3V0OiIsICIuLyIpOwotCQkJCQl9Ci0JCQkJCWlmIChzcmMuaW5kZXhPZigncmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCWVsZW1lbnQuc3JjID0gc3JjLnJlcGxhY2UocmVnRXhSZXMsICIuL3Jlc291cmNlcy8kMyIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJZWxlbWVudC5zcmMgPSBzcmMucmVwbGFjZShyZWdFeCwgIi4vcmVzb3VyY2VzLyQyIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl2YXIgZWxlbWVudHMgPSBlZGl0b3JEb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTsKLQkJCWZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQl2YXIgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCXZhciBpZCA9IGVsZW1lbnQuaWQ7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQgIT0gJycpIHsKLQkJCQkJUmVnRXhwLmxhc3RJbmRleD0wOwotCQkJCQl2YXIgbWF0Y2hBcnJheSA9IGlkLm1hdGNoKHJlZ0V4SUQpOwotCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMSkgewotCQkJCQkJZWxlbWVudC5ocmVmID0gbWF0Y2hBcnJheVsxXTsKLQkJCQkJCWlmIChtYXRjaEFycmF5Lmxlbmd0aCA+IDIgJiYgbWF0Y2hBcnJheVsyXS5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJZWxlbWVudC5pZCA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXZhciBocmVmID0gZWxlbWVudC5ocmVmOwotCQkJCWlmIChocmVmICE9IG51bGwgJiYgaHJlZiAhPSAnJykgewotCQkJCQkvLyBmaXggc2VsZi1yZWZlcmVuY2luZyBocmVmcwotCQkJCQlpZiAoaHJlZi5pbmRleE9mKCcjJykgIT0gLTEpIHsKLQkJCQkJCVJlZ0V4cC5sYXN0SW5kZXg9MDsKLQkJCQkJCXZhciBtYXRjaEFycmF5ID0gaHJlZi5tYXRjaChyZWdFeFJlZik7Ci0JCQkJCQlpZiAobWF0Y2hBcnJheSAhPSBudWxsICYmIG1hdGNoQXJyYXkubGVuZ3RoID4gMikgewotCQkJCQkJCXZhciBocmVmRmlsZSA9IG1hdGNoQXJyYXlbMV07Ci0JCQkJCQkJdmFyIHJlZiA9IG1hdGNoQXJyYXlbMl07Ci0JCQkJCQkJaWYgKGhyZWZGaWxlID09IHNvdXJjZVVSTCkgewotCQkJCQkJCQllbGVtZW50LmhyZWYgPSByZWY7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBmaXggaHJlZnMgYWxyZWFkeSBpbiByZXNvdXJjZXMKLQkJCQkJaWYgKGhyZWYuaW5kZXhPZigncmVzb3VyY2VzJykgIT0gLTEpIHsKLQkJCQkJCWVsZW1lbnQuaHJlZiA9IGhyZWYucmVwbGFjZShyZWdFeFJlcywgIi4vcmVzb3VyY2VzLyQzIik7Ci0JCQkJCX0KLQkJCQkJLy8gZml4IGhyZWZzIG5vdCBpbiByZXNvdXJjZXMKLQkJCQkJZWxzZSB7Ci0JCQkJCQllbGVtZW50LmhyZWYgPSBocmVmLnJlcGxhY2UocmVnRXgsICIuL3Jlc291cmNlcy8kMiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChlKSB7Ci0JCX0KLQl9Ci19Ci0KLS8vIFJlZG8gdGhlIHByZXZpb3VzIGNvbW1hbmQuCi1mdW5jdGlvbiByZWRvKCkgewotCWZvcm1hdFRleHQoJ3JlZG8nLCBudWxsKTsKLX0KLQotLy8gUmVkbyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLWZ1bmN0aW9uIHJlbW92ZUZvcm1hdCgpIHsKLQlmb3JtYXRUZXh0KCdyZW1vdmVmb3JtYXQnLCBudWxsKTsKLX0KLQotCi0KLWZ1bmN0aW9uIF9yZXBsYWNlQWxsVGV4dChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpIHsKLQkvLyB0aGlzIGlzIElFIG9ubHkKLQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCXZhciB0ZW1wUmFuZ2UgPSAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKLQkJdGVtcFJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLTEwMDAwMDAwMDAwKTsKLQkJZG8gewotCQkJdGVtcFJhbmdlLmNvbGxhcHNlKCk7Ci0JCQlpZiAodGVtcFJhbmdlLmZpbmRUZXh0KGZpbmRUZXh0LCAxMDAwMDAwMDAwMCwgb3B0aW9ucykpIHsKLQkJCQl0ZW1wUmFuZ2UudGV4dCA9IHJlcGxhY2VUZXh0OwotCQkJCXRlbXBSYW5nZS5zZWxlY3QoKTsKLQkJCX0gZWxzZSB7CQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAodHJ1ZSk7Ci0JfQotfQotCi0vLyBSZXBsYWNlcyBhbGwgdGV4dC4KLWZ1bmN0aW9uIHJlcGxhY2VBbGxUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgb3B0aW9ucykgewotCWlmIChyZWFkT25seSB8fCBmaW5kVGV4dCA9PSBudWxsIHx8IGZpbmRUZXh0ID09ICIiKSB7Ci0JCXJldHVybjsKLQl9Ci0JZWxzZSB7Ci0JCWZpbmRUZXh0ID0gZGVjb2RlU3RyaW5nKGZpbmRUZXh0KTsKLQl9Ci0JaWYgKHJlcGxhY2VUZXh0ID09IG51bGwpIHsKLQkJcmVwbGFjZVRleHQgPSAiIjsKLQl9Ci0JZWxzZSB7Ci0JCXJlcGxhY2VUZXh0ID0gZGVjb2RlU3RyaW5nKHJlcGxhY2VUZXh0KTsKLQl9Ci0JCi0JaWYgKGRvY3VtZW50LmFsbCkgewotCQkvLyBUT0RPOiBNb3ZlIHRoZSBpbnNlcnRpb24gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBIVE1MCi0JCS8vIGFuZCBwZXJmb3JtIGEgc2VhcmNoIGFuZCByZXBsYWNlIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4gCi0JCV9yZXBsYWNlQWxsVGV4dChmaW5kVGV4dCwgcmVwbGFjZVRleHQsIG9wdGlvbnMpOwotCX0KLQllbHNlIHsKLQkJLy8gVE9ETzogRW11bGF0ZSB0aGUgSUUgaW1wbGVtZW50YXRpb24uCi0JCXZhciBodG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWRpdG9ySWQpLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw7Ci0JCXZhciBvcHRpb25TdHIgPSAiL2ciOwotCQlpZiAoKG9wdGlvbnMgJiA0KSA9PSAwKSB7Ci0JCQlvcHRpb25TdHIgKz0gImkiOwotCQl9Ci0JCXZhciByZWdFeHAgPSBldmFsKCIvIiArIGZpbmRUZXh0ICsgb3B0aW9uU3RyKTsKLQkJaHRtbCA9IGh0bWwucmVwbGFjZShyZWdFeHAsIHJlcGxhY2VUZXh0KTsKLQkJc2V0VGV4dChodG1sKTsKLQl9Ci0JCi0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci19Ci0KLS8vIFJlcGxhY2VzIHRleHQuCi1mdW5jdGlvbiByZXBsYWNlVGV4dChyZXBsYWNlVGV4dCwgZGlyLCBvcHRpb25zKSB7Ci0JaWYgKHJlYWRPbmx5IHx8ICFpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHJlcGxhY2VUZXh0ID09IG51bGwpIHsKLQkJcmVwbGFjZVRleHQgPSAiIjsKLQl9Ci0JZWxzZSB7Ci0JCXJlcGxhY2VUZXh0ID0gZGVjb2RlU3RyaW5nKHJlcGxhY2VUZXh0KTsKLQl9Ci0JaWYgKGRvY3VtZW50LmFsbCkgewotCQlzZWxlY3Rpb25SYW5nZS50ZXh0ID0gcmVwbGFjZVRleHQ7Ci0JCWlmIChyZXBsYWNlVGV4dCAhPSAiIikgewotCQkJc2VsZWN0aW9uUmFuZ2UubW92ZVN0YXJ0KCJ3b3JkIiwgLTEpOwotCQkJc2VsZWN0aW9uUmFuZ2Uuc2VsZWN0KCk7Ci0JCQlzZWxlY3Rpb25SYW5nZS5jb2xsYXBzZShkaXIgPCAwKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJc2VsZWN0aW9uUmFuZ2UuZGVsZXRlQ29udGVudHMoKTsKLQkJc2VsZWN0aW9uUmFuZ2UuaW5zZXJ0Tm9kZShlZGl0b3JEb2MuY3JlYXRlVGV4dE5vZGUocmVwbGFjZVRleHQpKTsKLQl9Ci0Jc2V0U3RhdHVzKFNUQVRVU19FWEVDX0NNRCwgMSk7Ci0Jc2V0U3RhdHVzKFNUQVRVU19NT0RJRklFRCwgbnVsbCk7Ci19Ci0KLS8vIFNlbGVjdHMgYWxsIHRleHQuCi1mdW5jdGlvbiBzZWxlY3RBbGwoKSB7Ci0JaWYgKGludGVybmFsVXBkYXRlU2VsZWN0aW9uKCkpIHsKLQkJaWYgKGVkaXRvckRvYy5leGVjQ29tbWFuZCgnc2VsZWN0YWxsJywgZmFsc2UsIG51bGwpKSB7Ci0JCQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsKLQkJfQotCX0KLX0KLQotLy8gU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHNldEZvbnROYW1lKG5hbWUpIHsKLQlpZiAoaW50ZXJuYWxVcGRhdGVTZWxlY3Rpb24oKSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAobmFtZSA9PSAnJykgewotCQkJCWZvcm1hdFRleHQoJ3JlbW92ZUZvcm1hdCcpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3JtYXRUZXh0KCdmb250bmFtZScsIG5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc2V0Rm9udFNpemUoc2l6ZSkgewotCWlmIChpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCWlmIChzaXplICE9IG51bGwpIHsKLQkJCWlmIChzaXplID09ICcnKSB7Ci0JCQkJZm9ybWF0VGV4dCgncmVtb3ZlRm9ybWF0Jyk7Ci0JCQl9IGVsc2UgewotCQkJCWZvcm1hdFRleHQoJ2ZvbnRzaXplJywgc2l6ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8vIFNldHMgdGhlIGZvbnQgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc2V0Rm9udFN0eWxlKHN0eWxlKSB7IAotCWlmICghcmVhZE9ubHkgJiYgc3R5bGUgIT0gbnVsbCAmJiBzdHlsZSAhPSAnJyAmJiBpbnRlcm5hbFVwZGF0ZVNlbGVjdGlvbigpKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UuZXhlY0NvbW1hbmQoInJlbW92ZWZvcm1hdCIpOwotCQkJCXNlbGVjdGlvblJhbmdlLnBhcmVudEVsZW1lbnQoKS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzTmFtZSIpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChlKSB7Ci0JCX0KLQkJaWYgKHN0eWxlID09ICI8cXVvdGU+IikgewotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLmNsYXNzTmFtZSA9ICJxdW90ZSI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZWxlY3Rpb24uZm9jdXNOb2RlLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gInF1b3RlIjsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzdHlsZSA9PSAiPGNvZGU+IikgewotCQkJZm9ybWF0VGV4dCgnZm9ybWF0YmxvY2snLCAnPHA+Jyk7Ci0JCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQkJc2VsZWN0aW9uUmFuZ2UucGFyZW50RWxlbWVudCgpLmNsYXNzTmFtZSA9ICJjb2RlU2FtcGxlIjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNlbGVjdGlvbi5mb2N1c05vZGUucGFyZW50Tm9kZS5jbGFzc05hbWUgPSAiY29kZVNhbXBsZSI7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoIWRvY3VtZW50LmFsbCAmJiBzdHlsZSA9PSAiPHA+IikgewotCQkJCS8vIEEgaGFjayB0byBnZXQgcmlkIG9mIHRoZSAiY2xhc3NOYW1lIiBhdHRyaWJ1dGUgaW4gTW96aWxsYS9GaXJlZm94LgotCQkJCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgJzxoND4nKTsKLQkJCX0KLQkJCWZvcm1hdFRleHQoJ2Zvcm1hdGJsb2NrJywgc3R5bGUpOwotCQl9Ci0JfQotfQotCi0vLyBTZXRzIHdoZXRoZXIgdGhlIGNvbnRlbnQgY2FuIGJlIGVkaXRlZC4KLWZ1bmN0aW9uIHNldEVkaXRhYmxlKGVkaXRhYmxlKSB7Ci0JdmFyIGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVkaXRvcklkKS5jb250ZW50V2luZG93LmRvY3VtZW50OwotICAgIGlmIChlZGl0YWJsZSAhPSBudWxsICYmIGVkaXRhYmxlID09ICd0cnVlJykgewotCQlpZiAoZG9jdW1lbnQuYWxsKSB7Ci0JCQlkb2MuYm9keS5jb250ZW50RWRpdGFibGUgPSAidHJ1ZSI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MuZGVzaWduTW9kZSA9ICJvbiI7Ci0JCX0KLQkJcmVhZE9ubHkgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChkb2N1bWVudC5hbGwpIHsJCQotCQkJZG9jLmJvZHkuY29udGVudEVkaXRhYmxlID0gImZhbHNlIjsKLQkJfQotCQllbHNlIHsKLQkJCWRvYy5kZXNpZ25Nb2RlID0gIm9mZiI7Ci0JCX0KLQkJcmVhZE9ubHkgPSB0cnVlOwotCX0KLQlzZXRTdGF0dXMoU1RBVFVTX0VYRUNfQ01ELCAxKTsJCi19Ci0KLS8vIFRvZ2dsZXMgdGhlICdzdHJpa2UtdGhyb3VnaCcgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotZnVuY3Rpb24gc3RyaWtlVGhyb3VnaCgpIHsKLQlmb3JtYXRUZXh0KCdzdHJpa2V0aHJvdWdoJywgc2l6ZSk7Ci19Ci0KLS8vIFRvZ2dsZXMgdGhlICdzdWJzY3JpcHQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLWZ1bmN0aW9uIHN1YnNjcmlwdCgpIHsKLQlmb3JtYXRUZXh0KCdzdWJzY3JpcHQnLCBudWxsKTsKLX0KLQotLy8gVG9nZ2xlcyB0aGUgJ3N1cGVyc2NyaXB0JyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiBzdXBlcnNjcmlwdCgpIHsKLQlmb3JtYXRUZXh0KCdzdXBlcnNjcmlwdCcsIG51bGwpOwotfQotCi0vLyBUb2dnbGVzIHRoZSAndW5kZXJsaW5lJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi1mdW5jdGlvbiB1bmRlcmxpbmUoKSB7Ci0JZm9ybWF0VGV4dCgndW5kZXJsaW5lJywgbnVsbCk7Ci19Ci0KLS8vIENvbnZlcnRzIGEgbGluayB0byBub3JtYWwgdGV4dC4KLWZ1bmN0aW9uIHVubGluaygpIHsKLQlmb3JtYXRUZXh0KCd1bmxpbmsnLCBudWxsKTsKLX0KLQotZnVuY3Rpb24gT2JqVG9TdHJpbmcob2JqZWN0KSB7Ci0JdmFyIHJldCA9ICJPYmplY3QgIiArIG9iamVjdC5uYW1lICsgIiBpcyBbXG4iOwotCWZvciAodmFyIHByb3AgaW4gb2JqZWN0KSB7Ci0JCXJldCArPSAiICAiICsgcHJvcCArICIgaXMgIiArIG9iamVjdFtwcm9wXSArICI7XG4iOwotCX0KLQlyZXR1cm4gcmV0ICsgIl0iOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUueHNsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3J0ZS9ydGUueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkxNGZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9ydGUvcnRlLnhzbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLQotPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKLQl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KLQotPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL3J0ZSI+Ci0JPHhzbDp2YXJpYWJsZSBuYW1lPSJydGVfaWQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz48L3hzbDp2YXJpYWJsZT4KLQk8eHNsOnZhcmlhYmxlIG5hbWU9InJ0ZV9qcyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBqcyIvPjwveHNsOnZhcmlhYmxlPgotCTxodG1sPgotCQk8aGVhZD4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JHJ0ZV9qc30iPjwvc2NyaXB0PgotCQk8L2hlYWQ+Ci0JCTxib2R5IGxlZnRNYXJnaW49IjAiIHRvcE1hcmdpbj0iMCIgbWFyZ2luaGVpZ2h0PSIwIiBtYXJnaW53aWR0aD0iMCIgc2Nyb2xsPSJubyIgc3R5bGU9Im92ZXJmbG93OiBoaWRkZW4iPgotCQkJPGlmcmFtZSBpZD0ieyRydGVfaWR9IiBuYW1lPSJ7JHJ0ZV9pZH0iIHN0eWxlPSJib3JkZXI6IG5vbmU7IiBmcmFtZWJvcmRlcj0iMCIgc2Nyb2xsaW5nPSJhdXRvIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48L2lmcmFtZT4KLQkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0JCQkJaW5pdEVkaXRvcignPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBpZCIvPicsICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGNzcyIvPicsICc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGJhc2VVUkwiLz4nKTsKLQkJCTwvc2NyaXB0PgotCQk8L2JvZHk+Ci0JPC9odG1sPgotPC94c2w6dGVtcGxhdGU+Ci0KLTwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZmNjQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5GaW5kUmVwbGFjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBjb250cm9sLgotICogPHA+Ci0gKiBBIHJpY2ggdGV4dCBjb250cm9sIGlzIGFuIGVkaXRhYmxlIHVzZXIgaW50ZXJmYWNlIG9iamVjdCB0aGF0IGRpc3BsYXlzIHJpY2gKLSAqIHRleHQgYW5kIGltYWdlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmljaFRleHQgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJyaWNoVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YQotCSAqICAgICAgICAgICAgdGhlIGxheW91dCBkYXRhIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHJldHVybiB0aGlzIGNvbnRyb2wncyBsYXlvdXQgZGF0YQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGF5b3V0RGF0YSgpOwotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKTsKLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBmb2N1cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgY29udHJvbCBoYXMgdGhlIHVzZXItaW50ZXJmYWNlIGZvY3VzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRm9jdXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgdGV4dCBhbmQgaW1hZ2UgbGlua3MuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyBpbiB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhc2VQYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGlzIGVkaWF0YmxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVkaXRhYmxlIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBlZGl0YWJsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRhYmxlIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0TW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGlmaWVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZAotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVkIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBtb2RpZmllZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIGEgbWFya3VwIGxhbmd1YWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgYmFjayB0byB0aGUgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlVGV4dCgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGVkaXRvciBjb250ZW50IGhhcyBiZWVuIG1vZGlmaWVkLiBJZiBpdCBoYXMgYmVlbgotCSAqIG1vZGlmaWVkLCBub3RpZnkgdGhlIG1vZGlmeSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgY2hlY2tNb2RpZnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBjdXJyZW50IHNlbGVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5SaWNoVGV4dFNlbGVjdGlvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIFJpY2hUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMgbm90Ci0JICogICAgICAgICBiZWVuIHNldAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQuIFRoZSBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZQotCSAqIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpOwotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gcmljaCB0ZXh0IGNvbW1hbmQgd2l0aCBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW1zCQlhbiBhcnJheSBvZiBwYXJhbWV0ZXJzIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZ1tdIHBhcmFtcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RpZnkgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE1vZGlmeUxpc3RlbmVyPiBnZXRNb2RpZnlMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiB0aGUgY29udGVudCBvZiB0aGlzIGNvbnRyb2wgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGhlbHAgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkCi0JICogd2hlbiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIHRvCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpOwotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMKLQkgKiAgICAgICAgIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8UmljaFRleHRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCSAqIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgVVJMIG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVVJMIGdldENvcHlVUkwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0IGNvcGllZAotCSAqIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVVSTCgpOwotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpOwotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBjb250cm9sIGhhcyBiZWVuIGRpc3Bvc2VkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb250cm9sIGlzIGRpc3Bvc2VkIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb250cm9sJ3MgRmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBGaW5kUmVwbGFjZUFjdGlvbiB0byB1c2UKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5kUmVwbGFjZUFjdGlvbihGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbFRleHQgdmFyaWFibGUsIHdoaWNoIHN0b3JlcyB3aGF0IGlzIHNhdmVkIG9uIGRpc2sKLQkgKiBAcGFyYW0gdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTVlYWE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgZWRpdG9yLgotICogPHA+Ci0gKiBBIHJpY2ggdGV4dCBlZGl0b3IgaXMgYSBjb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugb2JqZWN0IHRoYXQgaW5jbHVkZXMgYSB0b29sCi0gKiBiYXIsIGEgdGFiIGZvbGRlciBmb3IgZW50ZXJpbmcgdGhlIHJpY2ggdGV4dCBjb250ZW50LCBhbmQgYSB0YWIgZm9sZGVyIGZvcgotICogdmlld2luZyBhbmQgbW9kaWZ5aW5nIHRoZSByaWNoIHRleHQgY29udGVudCBpbiBhIG1hcmt1cCBsYW5ndWFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0RWRpdG9yIGV4dGVuZHMgSVJpY2hUZXh0IHsKLQotCS8qKgotCSAqIEZpbGxzIHRoZSB0b29sIGJhciB3aXRoIHJpY2ggdGV4dCBhY3Rpb24gaXRlbXMuCi0JICogCi0JICogQHBhcmFtIHRvb2xCYXIKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGVkaXRvciB0b29sIGJhcgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUb29sQmFyKElSaWNoVGV4dFRvb2xCYXIgdG9vbEJhcik7Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSByaWNoIHRleHQgb3IgdGhlIG1hcmt1cCBsYW5ndWFnZSB0YWIuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICA8Y29kZT4wPC9jb2RlPiBmb3IgdGhlIHJpY2ggdGV4dCB0YWIsIDxjb2RlPjE8L2NvZGU+IGZvcgotCSAqICAgICAgICAgICAgdGhlIG1hcmt1cCBsYW5ndWFnZSB0YWIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBGaW5kUmVwbGFjZUFjdGlvbiB0byB1c2UKLQkgKiBAcGFyYW0gZmluZFJlcGxhY2VBY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaW5kUmVwbGFjZUFjdGlvbihGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L0lSaWNoVGV4dFRvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhNTNkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9JUmljaFRleHRUb29sQmFyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dENvbWJvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Ub29sQmFyTWFuYWdlcjsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJpY2ggdGV4dCBlZGl0b3IgdG9vbGJhci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0VG9vbEJhciB7Ci0KLQkKLQkvKioKLQkgKiBBZGRzIGEgYnV0dG9uIGFjdGlvbiB0byB0aGUgdG9vbCBiYXIuCi0JICogCi0JICogQHBhcmFtIGFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIGJ1dHRvbiBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKElBY3Rpb24gYWN0aW9uKTsKLQotCS8qKgotCSAqIEFkZHMgYSBjb21ibyBhY3Rpb24gdG8gdGhlIHRvb2wgYmFyLgotCSAqIAotCSAqIEBwYXJhbSBhY3Rpb24KLQkgKiAgICAgICAgICAgIHRoZSBjb21ibyBhY3Rpb24gdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKFJpY2hUZXh0Q29tYm9BY3Rpb24gaXRlbSk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgc2VwYXJhdG9yIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRvb2xiYXIgc3RhdGUuCi0JICogPHA+Ci0JICogRW5hYmxlcy9kaXNhYmxlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JICogUmljaFRleHRFZGl0b3IgdGFiIChSaWNoVGV4dCB2cy4gSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIG5vbi1SZWFkT25seSBjb21tYW5kcwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVRvb2xCYXIoYm9vbGVhbiBlbmFibGVkKTsKLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0b29sYmFyIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbGJhck1ncigpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYWJjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBCRUdJTiBOTyBUUkFOU0xBVElPTgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHQ9YXJpYWwsIGhlbHZldGljYSwgc2Fucy1zZXJpZgotIyAhISBETyBOT1QgVFJBTlNMQVRFIFRIRSBGT0xMT1dJTkcgTElORSAhIQotZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHRfTW96aWxsYT1hcmlhbCxoZWx2ZXRpY2Esc2Fucy1zZXJpZgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRU5EIE5PIFRSQU5TTEFUSU9OCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLQotIyBGb250IFN0eWxlIE5hbWVzCi1mb250U3R5bGVfbm9ybWFsPU5vcm1hbAotZm9udFN0eWxlX3NlY3Rpb25IZWFkaW5nPVNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3N1YnNlY3Rpb25IZWFkaW5nPVN1YnNlY3Rpb24gSGVhZGluZwotZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nPVN1YiBTdWJzZWN0aW9uIEhlYWRpbmcKLWZvbnRTdHlsZV9xdW90ZT1RdW90ZQotZm9udFN0eWxlX2NvZGVTYW1wbGU9Q29kZSBTYW1wbGUKLQotIyBIVE1MIEJsb2NrIFRhZ3MKLWJsb2NrVGFnX3BhcmFncmFwaD1QYXJhZ3JhcGgKLWJsb2NrVGFnX2hlYWRpbmcxPUhlYWRpbmcgMQotYmxvY2tUYWdfaGVhZGluZzI9SGVhZGluZyAyCi1ibG9ja1RhZ19oZWFkaW5nMz1IZWFkaW5nIDMKLWJsb2NrVGFnX2hlYWRpbmc0PUhlYWRpbmcgNAotYmxvY2tUYWdfaGVhZGluZzU9SGVhZGluZyA1Ci1ibG9ja1RhZ19oZWFkaW5nNj1IZWFkaW5nIDYKLWJsb2NrVGFnX2FkZHJlc3M9QWRkcmVzcwotYmxvY2tUYWdfcHJlZm9ybWF0dGVkVGV4dD1QcmVmb3JtYXR0ZWQgVGV4dAotCi0jIEhUTUwgRm9udCBOYW1lcwotZm9udE5hbWVfZGVmYXVsdD1EZWZhdWx0Ci1mb250TmFtZV9hcmlhbD1BcmlhbAotZm9udE5hbWVfY291cmllck5ldz1Db3VyaWVyIE5ldwotZm9udE5hbWVfdGltZXNOZXdSb21hbj1UaW1lcyBOZXcgUm9tYW4KLWZvbnROYW1lX3ZlcmRhbmE9VmVyZGFuYQotCi0jIFJpY2ggVGV4dCBFZGl0b3IgVG9vbCBCdXR0b25zCi1hZGRIb3Jpem9udGFsQmFyQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBIb3Jpem9udGFsIEJhcgotYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIEltYWdlCi1hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBMaW5lCi1hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0PUFkZCBMaW5rCi1hZGRPcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dD1BZGQgT3JkZXJlZCBMaXN0Ci1hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dD1BZGQgVGFibGUKLWFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ9QWRkIFVub3JkZXJlZCBMaXN0Ci1ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0PUJvbGQKLWNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dD1DbGVhciBDb250ZW50Ci1jb3B5QWN0aW9uX3Rvb2xUaXBUZXh0PUNvcHkKLWN1dEFjdGlvbl90b29sVGlwVGV4dD1DdXQKLWZpbmRSZXBsYWNlQWN0aW9uX3Rvb2xUaXBUZXh0PUZpbmQvUmVwbGFjZQotaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0PUluZGVudAotaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0PUl0YWxpYwotanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IENlbnRlcgotanVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ9SnVzdGlmeSBGdWxsCi1qdXN0aWZ5TGVmdEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IExlZnQKLWp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dD1KdXN0aWZ5IFJpZ2h0Ci1vdXRkZW50QWN0aW9uX3Rvb2xUaXBUZXh0PU91dGRlbnQKLXBhc3RlQWN0aW9uX3Rvb2xUaXBUZXh0PVBhc3RlCi1wYXN0ZVBsYWluVGV4dEFjdGlvbl90b29sVGlwVGV4dD1QYXN0ZSBhcyBwbGFpbiB0ZXh0Ci1zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQ9U3Vic2NyaXB0Ci1zdXBlcnNjcmlwdEFjdGlvbl90b29sVGlwVGV4dD1TdXBlcnNjcmlwdAotdW5kZXJsaW5lQWN0aW9uX3Rvb2xUaXBUZXh0PVVuZGVybGluZQotdGlkeV9jbGVhbl90ZXh0PURlZmF1bHQgQ2xlYW4KLXRpZHlfY2xlYW5lcl90ZXh0PUNsZWFuIE1TIEhUTUwKLXRpZHlfY2xlYW5lc3RfdGV4dD1DbGVhbiBXb3JkIDIwMDAgSFRNTAotdGlkeV9jbGVhbl90b29sVGlwVGV4dD1DbGVhbiB3aXRoIEpUaWR5IHVzaW5nIGRlZmF1bHQgb3B0aW9ucwotdGlkeV9jbGVhbmVyX3Rvb2xUaXBUZXh0PUNsZWFuIEhUTUwgb2YgTVMgSFRNTAotdGlkeV9jbGVhbmVzdF90b29sVGlwVGV4dD1DbGVhbiBXb3JkIDIwMDAgSFRNTAotCi0KLSMgUmljaCBUZXh0IEVkaXRvciBDb21ib2JveGVzCi1mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ9U2V0IEZvbnQgU3R5bGUKLWJsb2NrVGFnQWN0aW9uX3Rvb2xUaXBUZXh0PVNldCBCbG9jayBUYWcKLWZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0PVNldCBGb250Ci1mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWU9RGVmYXVsdCBmb250Ci1mb250U2l6ZUFjdGlvbl90b29sVGlwVGV4dD1TZXQgRm9udCBTaXplCi0KLSMgUmljaCBUZXh0IEVkaXRvciBDb250ZXh0IE1lbnUgSXRlbXMKLWN1dEFjdGlvbl90ZXh0PSZDdXQKLWNvcHlBY3Rpb25fdGV4dD1DJm9weQotcGFzdGVBY3Rpb25fdGV4dD0mUGFzdGUKLXBhc3RlUGxhaW5UZXh0QWN0aW9uX3RleHQ9UGFzdGUgJmFzIHBsYWluIHRleHQKLQotIyBSaWNoIFRleHQgRWRpdG9yIFRhYnMKLXJpY2hUZXh0VGFiX3RleHQ9UmljaCBUZXh0Ci1yaWNoVGV4dFRhYl90b29sVGlwVGV4dD1FZGl0IGNvbnRlbnQgaW4gcmljaCB0ZXh0Ci1odG1sVGFiX3RleHQ9SFRNTAotaHRtbFRhYl90b29sVGlwVGV4dD1FZGl0IGNvbnRlbnQgaW4gSFRNTAotCi0jIEFkZCBEaWFsb2dzCi1hZGRJbWFnZURpYWxvZ190aXRsZT1BZGQgSW1hZ2UKLWFkZExpbmtEaWFsb2dfdGl0bGU9QWRkIExpbmsKLWFkZFRhYmxlRGlhbG9nX3RpdGxlPUFkZCBUYWJsZQotZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU9RmluZC9SZXBsYWNlCi11cmxMYWJlbF90ZXh0PVVSTDoKLXN1bW1hcnlMYWJlbF90ZXh0PVN1bW1hcnk6Ci1jYXB0aW9uTGFiZWxfdGV4dD1DYXB0aW9uOgotcm93c0xhYmVsX3RleHQ9Um93czoKLWNvbHVtbnNMYWJlbF90ZXh0PUNvbHVtbnM6Ci13aWR0aExhYmVsX3RleHQ9V2lkdGg6Ci10YWJsZVN0eWxlTGFiZWxfdGV4dD1TdHlsZToKLXRhYmxlSGVhZGVyTm9uZV90ZXh0PVRhYmxlIHdpdGggbm8gaGVhZGVycwotdGFibGVIZWFkZXJDb2xzX3RleHQ9VGFibGUgd2l0aCBjb2x1bW4gaGVhZGVycwotdGFibGVIZWFkZXJSb3dzX3RleHQ9VGFibGUgd2l0aCByb3cgaGVhZGVycwotdGFibGVIZWFkZXJCb3RoX3RleHQ9VGFibGUgd2l0aCBjb2x1bW4gYW5kIHJvdyBoZWFkZXJzCi1icm93c2VCdXR0b25fdGV4dD1Ccm93c2UuLi4KLQotIyBDbGVhciBFZGl0b3IgQ29udGVudCBEaWFsb2cKLWNsZWFyQ29udGVudERpYWxvZ190aXRsZT1DbGVhciBFZGl0b3IgQ29udGVudCBDb25maXJtYXRpb24KLWNsZWFyQ29udGVudERpYWxvZ190ZXh0PURvIHlvdSByZWFsbHkgd2FudCB0byBjbGVhciB0aGUgY29udGVudCBvZiB0aGlzIHJpY2ggdGV4dCBlZGl0b3I/Ci0KLSMgRmluZC9SZXBsYWNlIERpYWxvZwotZmluZExhYmVsX3RleHQ9RmluZDoKLXJlcGxhY2VMYWJlbF90ZXh0PVJlcGxhY2Ugd2l0aDoKLW9wdGlvbnNHcm91cF90ZXh0PU9wdGlvbnMKLWNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0PUNhc2Ugc2Vuc2l0aXZlCi13aG9sZVdvcmRDaGVja2JveF90ZXh0PVdob2xlIHdvcmQKLWRpcmVjdGlvbkdyb3VwX3RleHQ9RGlyZWN0aW9uCi1mb3J3YXJkUmFkaW9CdXR0b25fdGV4dD1Gb3J3YXJkCi1iYWNrd2FyZFJhZGlvQnV0dG9uX3RleHQ9QmFja3dhcmQKLWZpbmRCdXR0b25fdGV4dD1GaW5kCi1yZXBsYWNlQnV0dG9uX3RleHQ9UmVwbGFjZQotcmVwbGFjZUZpbmRCdXR0b25fdGV4dD1SZXBsYWNlL0ZpbmQKLXJlcGxhY2VhbGxCdXR0b25fdGV4dD1SZXBsYWNlIEFsbAotIyB0YWtlbiBmcm9tIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yCi1GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbD1TdHJpbmcgTm90IEZvdW5kCi0KLSMgUHJlZmVyZW5jZSBQYWdlCi1tYXhDaGFyc1BlckxpbmVMYWJlbF90ZXh0PU1heGltdW0gY2hhcmFjdGVycyBwZXIgbGluZToKLWluZGVudEhUTUxDaGVja2JveF90ZXh0PUluZGVudCBIVE1MIHRhZ3MKLWluZGVudFNpemVMYWJlbF90ZXh0PUluZGVudCBTaXplOgotdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0PVVSTCBEaXNwbGF5IE5hbWU6Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODRmM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uaHRtbC5IVE1MRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24ueG1sLlhTTFRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVQbGFpblRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Ccm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLkxvY2F0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5Mb2NhdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5icm93c2VyLlN0YXR1c1RleHRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5TdGF0dXNUZXh0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCBjb250cm9sIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIFNXVCA8Y29kZT5Ccm93c2VyPC9jb2RlPgotICogY29udHJvbCBhbmQgREhUTUwgKEhUTUwsIENTUyBhbmQgSmF2YVNjcmlwdCkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dCBpbXBsZW1lbnRzIElSaWNoVGV4dCB7Ci0KLQkvLyBFbmNvZGVkIHNpbmdsZSBxdW90ZS4gQWxsIHNpbmdsZSBxdW90ZXMgbmVlZCB0byBiZSBzcGVjaWFsbHkgZW5jb2RlZCB0bwotCS8vIGF2b2lkIEphdmFTY3JpcHQgZXJyb3Igd2hlbiBjYWxsaW5nIEJyb3dzZS5leGVjdXRlQ29tbWFuZCgpLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPREVEX1NJTkdMRV9RVU9URSA9ICIlc3ElIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ERURfTkVXTElORSA9ICIlRU9MJSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFUVVNfUFJFRklYID0gIiQkJCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfUFJFRklYX0xFTkdUSCA9IFNUQVRVU19QUkVGSVgubGVuZ3RoKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PUCA9IDA7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0lOSVRJQUxJWkVEID0gMTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTU9ESUZJRUQgPSAyOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19HRVRfVEVYVCA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0tFWV9ET1dOID0gNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfS0VZX1VQID0gNTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfU0VMRUNUX1RFWFQgPSA2OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19TRUxFQ1RfQ09OVFJPTCA9IDc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX1NFTEVDVF9OT05FID0gODsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRVhFQ19DTUQgPSA5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19SRUZPUk1BVF9MSU5LUyA9IDEwOwotCi0JLy8gVGhlIGRlZmF1bHQgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyBsaW5rcyAoPGhyZWY+LCA8aW1nPiwgZXRjLikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CQVNFX1BBVEggPSBTeXN0ZW0KLQkJCS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikgLy8kTk9OLU5MUy0xJAotCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIikgKyAicnRlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvLyBJZiB0cnVlLCBsb2cgZGVidWdnaW5nIGluZm8uCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVidWc7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBsb2dnZXIuCi0JcHJvdGVjdGVkIExvZ2dlciBsb2dnZXI7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBTV1QgQnJvd3NlciB1c2VkIGZvciBsb2FkaW5nIHRoZSBKYXZhU2NyaXB0L0RIVE1MIGVkaXRvci4KLQlwcm90ZWN0ZWQgQnJvd3NlciBlZGl0b3I7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBPbGVDb250cm9sU2l0ZSBmb3IgdGhlIFNXVCBCcm93c2VyIChXaW4zMiBvbmx5KS4KLQlwcm90ZWN0ZWQgQ29udHJvbCBlZGl0b3JDb250cm9sOwotCi0JLy8gVGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JLy8gY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgY29weVVSTDsKLQotCS8vIFRoZSBjb250ZXh0IG1lbnUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udHJvbC4KLQlwcm90ZWN0ZWQgTWVudSBjb250ZXh0TWVudTsKLQotCS8vIFRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgc3VwcG9ydGluZyBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKLQlwcm90ZWN0ZWQgU3RyaW5nIHJ0ZUZvbGRlcjsKLQotCS8vIFRoZSBVUkwgdGhhdCBwb2ludHMgdG8gdGhlIHN1cHBvcnRpbmcgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzLgotCXByb3RlY3RlZCBTdHJpbmcgcnRlVVJMOwotCi0JLy8gVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotCS8vIFRoZSBESFRNTCBpbml0aWFsaXphdGlvbiBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkOwotCi0JLy8gVGhlIGluaXRpYWwgZm9jdXMuCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWRXaXRoRm9jdXM7Ci0KLQkvLyBUaGUgY29udHJvbCdzIGluaXRpYWwgdGV4dC4gVGhpcyBpcyB1c2VkIHRvIGNhY2hlIHRoZSBIVE1MIHNvdXJjZSBwYXNzZWQKLQkvLyBpbiB2aWEgc2V0VGV4dCgpd2hpbGUgdGhlIERIVE1MIGluaXRpYWxpemF0aW9uIGlzIGhhcHBlbmluZy4KLQlwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxUZXh0OwotCi0JLy8gVGhlIGNvbnRyb2wncyBjdXJyZW50IHRleHQuCi0JcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIGVkaXRhYmxlIGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZWRpdGFibGUgPSB0cnVlOwotCi0JLy8gVGhlIGNvbnRyb2wncyBtb2RpZmljYXRpb24gZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtb2RpZmllZDsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBhbmQgb2JqZWN0IHNlbGVjdGlvbiBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGhhc1NlbGVjdGlvbjsKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBzZWxlY3Rpb24KLQlwcm90ZWN0ZWQgUmljaFRleHRTZWxlY3Rpb24gcmljaFRleHRTZWxlY3Rpb24gPSBuZXcgUmljaFRleHRTZWxlY3Rpb24oKTsKLQotCS8vIEphdmFTY3JpcHQgY29tbWFuZCBleGVjdXRpb24gc3RhdHVzIGNvZGUuCi0JcHJvdGVjdGVkIGludCBzdGF0dXMgPSAwOwotCi0JLy8gVGhlIEhUTUwgc291cmNlIGZvcm1hdHRlci4KLQlwcm90ZWN0ZWQgSFRNTEZvcm1hdHRlciBodG1sRm9ybWF0dGVyOwotCi0JLy8gVGhlIFNXVCBldmVudCBsaXN0ZW5lcnMuCi0JcHJvdGVjdGVkIE1hcDxMaXN0ZW5lciwgUmljaFRleHRMaXN0ZW5lcj4gbGlzdGVuZXJzOwotCi0JLy8gVGhlIG1vZGlmeSBsaXN0ZW5lcnMuCi0JcHJvdGVjdGVkIExpc3Q8TW9kaWZ5TGlzdGVuZXI+IG1vZGlmeUxpc3RlbmVyczsKLQotCS8vIFRoZSBjb250cm9sJ3MgZWRpdCBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIG5vdGlmeWluZ01vZGlmeUxpc3RlbmVycyA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2xzJ3MgZm9jdXMgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNGb2N1cyA9IGZhbHNlOwotCi0JLy8gVGhlIGNvbnRyb2xzJ3MgcHJvY2Vzc2luZyBKYXZhU2NyaXB0IGV2ZW50IGZsYWcuCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc2luZ0pTRXZlbnQgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9scydzIHByb2Nlc3NpbmcgTU9ESUZJRUQgSmF2YVNjcmlwdCBldmVudCBmbGFnLgotCXByb3RlY3RlZCBib29sZWFuIGNoZWNraW5nTW9kaWZ5RXZlbnQgPSBmYWxzZTsKLQotCS8vIFRoZSBjb250cm9sJ3MgZmluZC9yZXBsYWNlIHRleHQgYWN0aW9uCi0JcHJvdGVjdGVkIEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uOwotCQotCS8vIFRoZSBjb250cm9sJ3MgSUUgZmxhZwotCXByb3RlY3RlZCBib29sZWFuIGlzSUUgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBzdHlsZSBmb3IgdGhpcyBjb250cm9sCi0JICogQHBhcmFtIGJhc2VQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MKLQkgKi8KLQlwdWJsaWMgUmljaFRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJZGVidWcgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQkJbG9nZ2VyID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCQlmaW5kUmVwbGFjZUFjdGlvbiA9IG5ldyBGaW5kUmVwbGFjZUFjdGlvbih0aGlzKTsKLQkJcnRlRm9sZGVyID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAicnRlLyI7IC8vJE5PTi1OTFMtMSQJCQotCQlydGVVUkwgPSBYTUxVdGlsLmVzY2FwZSgiZmlsZTovLyIgKyBydGVGb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCXNldEJhc2VQYXRoKGJhc2VQYXRoKTsKLQotCQl0cnkgewotCQkJZWRpdG9yID0gbmV3IEJyb3dzZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiUmljaFRleHQiLCAiYmFzZVBhdGg9IiArIGJhc2VQYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQllZGl0b3Iuc2V0RGF0YShQUk9QRVJUWV9OQU1FLCB0aGlzKTsKLQkJCWluaXQocGFyZW50LCBzdHlsZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllZGl0b3IgPSBudWxsOwotCQkJU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gY3JlYXRlIFJpY2hUZXh0IHdpdGggYmFzZVBhdGg9IiArIGJhc2VQYXRoOyAvLyROT04tTkxTLTEkCi0JCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgc3R5bGUgZm9yIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdGhpcyhwYXJlbnQsIHN0eWxlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYXNlIHBhdGggZm9yIHJlc29sdmluZyBsaW5rcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRCYXNlUGF0aChTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aCAhPSBudWxsICYmIHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWCkpIHsKLQkJCQliYXNlUGF0aCA9IEZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWAotCQkJCQkJKyBGaWxlVXRpbC5hcHBlbmRTZXBhcmF0b3IocGF0aC5zdWJzdHJpbmcoCi0JCQkJCQkJCUZpbGVVdGlsLlVOQ19QQVRIX1BSRUZJWF9MRU5HVEgpLnJlcGxhY2UoJ1xcJywKLQkJCQkJCQkJJy8nKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQliYXNlUGF0aCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihwYXRoKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQliYXNlUGF0aCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihERUZBVUxUX0JBU0VfUEFUSCkucmVwbGFjZSgKLQkJCQkJJ1xcJywgJy8nKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIGluaXRpYWx6aW5nIHRoaXMgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWFkZFN0YXR1c1RleHRMaXN0ZW5lcigpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiYWRkZWQgc3RhdHVzIHRleHQgbGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCVN0cmluZyBlZGl0b3JIVE1MID0gZ2VuZXJhdGVFZGl0b3JIVE1MKCk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJnZW5lcmF0ZWQgZWRpdG9yIEhUTUwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWVkaXRvci5zZXRUZXh0KGVkaXRvckhUTUwpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAibG9hZGVkIGVkaXRvciBIVE1MIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQljb250ZXh0TWVudSA9IG5ldyBNZW51KHBhcmVudC5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJCWVkaXRvci5zZXRNZW51KGNvbnRleHRNZW51KTsKLQkJCWZpbGxDb250ZXh0TWVudShjb250ZXh0TWVudSk7Ci0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgiaW5pdCIsICJhZGRlZCBjb250ZXh0IG1lbnUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCWFkZExpc3RlbmVycygpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImluaXQiLCAiYWRkZWQgbGlzdGVuZXJzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlodG1sRm9ybWF0dGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJpbml0IiwgImluc3RhbnRpYXRlZCBIVE1MRm9ybWF0dGVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZWRpdG9yID0gbnVsbDsKLQkJCWRpc3Bvc2UoKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGlzIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYXlvdXQgZGF0YS4KLQkgKiAKLQkgKiBAcGFyYW0gbGF5b3V0RGF0YQotCSAqICAgICAgICAgICAgdGhlIGxheW91dCBkYXRhIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExheW91dERhdGEoT2JqZWN0IGxheW91dERhdGEpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhpcyBjb250cm9sJ3MgbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldExheW91dERhdGEoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIGVkaXRvci5nZXRMYXlvdXREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChkZWJ1ZykgewotCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInNldEZvY3VzLCBlZGl0YWJsZT0iICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQlpZiAoIWVkaXRvci5pc0ZvY3VzQ29udHJvbCgpKSB7Ci0JCQkJCWlmICghUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gV29ya2Fyb3VuZCBmb3IgTW96aWxsYSBhbmQgRmlyZWZveCByaWNoIHRleHQgZWRpdG9yIGZvY3VzCi0JCQkJCQkvLyBpc3N1ZS4KLQkJCQkJCWVkaXRvci5zZXRGb2N1cygpOwotCQkJCQl9Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9DVVMpOwotCQkJCX0KLQkJCQloYXNGb2N1cyA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWluaXRpYWxpemVkV2l0aEZvY3VzID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRlbGxzIHRoZSBjb250cm9sIGl0IGRvZXMgbm90IGhhdmUgZm9jdXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qmx1cigpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlwcmludERlYnVnTWVzc2FnZSgic2V0Qmx1ciwgZWRpdGFibGU9IiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQkJaGFzRm9jdXMgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5pdGlhbGl6ZWRXaXRoRm9jdXMgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udHJvbCBoYXMgZm9jdXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaGFzIHRoZSB1c2VyLWludGVyZmFjZSBmb2N1cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCXJldHVybiBoYXNGb2N1czsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIGluIHRoaXMgY29udHJvbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVBhdGgoKSB7Ci0JCXJldHVybiBiYXNlUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBiYXNlIFVSTCBvZiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgd2hvc2UgY29udGVudCB3YXMgbGFzdAotCSAqIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJhc2UgVVJMIG9mIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgVVJMIGdldENvcHlVUkwoKSB7Ci0JCXJldHVybiBjb3B5VVJMOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0IGNvcGllZAotCSAqIHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVVSTCgpIHsKLQkJdHJ5IHsKLQkJCWNvcHlVUkwgPSBuZXcgRmlsZShiYXNlUGF0aCkudG9VUkwoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWNvcHlVUkwgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBpcyBlZGl0YWJsZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEVkaXRhYmxlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIGVkaXRhYmxlCi0JICogICAgICAgICAgICB0aGUgZWRpdGFibGUgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCXRoaXMuZWRpdGFibGUgPSBlZGl0YWJsZTsKLQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0VESVRBQkxFLCAiIiArIGVkaXRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZGlmaWVkKCkgewotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kaWZpZWQgc3RhdGUuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVkCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZWQgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RpZmllZChib29sZWFuIG1vZGlmaWVkKSB7Ci0JCXRoaXMubW9kaWZpZWQgPSBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByaWNoIHRleHQgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByaWNoIHRleHQgY29udGVudCBmb3JtYXR0ZWQgaW4gYSBtYXJrdXAgbGFuZ3VhZ2UKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBpbml0aWFsaXplZCkgewotCQkJdHJ5IHsKLQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuR0VUX1RFWFQpOwotCQkJCWlmIChjdXJyZW50VGV4dCAhPSBudWxsICYmIGN1cnJlbnRUZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJCQljdXJyZW50VGV4dCA9IGN1cnJlbnRUZXh0LnJlcGxhY2VBbGwoCi0JCQkJCQkJIjxQPiZuYnNwOzwvUD4iLCAiPGJyLz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkJCi0JCQkJCWN1cnJlbnRUZXh0ID0gdGlkeVRleHQoY3VycmVudFRleHQpOwotCQkJCQljdXJyZW50VGV4dCA9IGZvcm1hdEhUTUwoY3VycmVudFRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN1cnJlbnRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCXByaW50RGVidWdNZXNzYWdlKCJnZXRUZXh0IiwgInRleHQ9IiwgY3VycmVudFRleHQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJcmV0dXJuIGN1cnJlbnRUZXh0OwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRIVE1MKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBmb3JtYXR0ZWRUZXh0OwotCQl0cnkgewotCQkJLy8gQ2FsbCBKVGlkeSB0byBmb3JtYXQgdGhlIHNvdXJjZSB0byBYSFRNTC4KLQkJCWZvcm1hdHRlZFRleHQgPSBodG1sRm9ybWF0dGVyLmZvcm1hdEhUTUwodGV4dCk7Ci0JCQlpZiAoaHRtbEZvcm1hdHRlci5nZXRMYXN0RXJyb3JTdHIoKSAhPSBudWxsKSB7Ci0JCQkJbG9nZ2VyLmxvZ0Vycm9yKGh0bWxGb3JtYXR0ZXIuZ2V0TGFzdEVycm9yU3RyKCkpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlZFRleHQ7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIGEgbWFya3VwIGxhbmd1YWdlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKCJzZXRUZXh0IiwgInRleHQ9IiwgdGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlTdHJpbmcgbmV3VGV4dCA9IHRleHQ7Ci0JCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQkJbmV3VGV4dCA9IHRpZHlUZXh0KG5ld1RleHQpOwotCQkJCS8vIENhbGwgSlRpZHkgdG8gZm9ybWF0IHRoZSBzb3VyY2UgdG8gWEhUTUwuCi0JCQkJbmV3VGV4dCA9IGZvcm1hdEhUTUwobmV3VGV4dCk7Ci0JCQl9IGVsc2UgewotCQkJCW5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoaW5pdGlhbGl6ZWQpIHsKLQkJCQltb2RpZmllZCA9ICFuZXdUZXh0LmVxdWFscyhjdXJyZW50VGV4dCk7Ci0JCQl9Ci0JCQlpbml0aWFsVGV4dCA9IG5ld1RleHQ7Ci0JCQlpZiAoaW5pdGlhbFRleHQuZXF1YWxzKCIiKSAmJiAhaXNJRSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaW5pdGlhbFRleHQgPSAiPGJyIC8+IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoZGVidWcpIHsKLQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCSJzZXRUZXh0IiwgIm1vZGlmaWVkPSIgKyBtb2RpZmllZCArICIsIG5ld1RleHQ9IiwgbmV3VGV4dCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0KLQkJCWlmIChpbml0aWFsaXplZCkgewotCQkJCXRyeSB7Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfVEVYVCwgbmV3VGV4dCk7Ci0JCQkJCWV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRURJVEFCTEUsICIiICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWN1cnJlbnRUZXh0ID0gbmV3VGV4dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByaWNoIHRleHQgY29udGVudCBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVUZXh0KCkgewotCQlzZXRUZXh0KGluaXRpYWxUZXh0KTsKLQkJbW9kaWZpZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzZWxlY3RlZCB0ZXh0IG9yIDxjb2RlPiIiPC9jb2RlPiBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgaGFzU2VsZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFRleHQoKSB7Ci0JCS8vIGV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5HRVRfU0VMRUNURURfVEVYVCk7Ci0JCXJldHVybiByaWNoVGV4dFNlbGVjdGlvbi5nZXRUZXh0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2dldFNlbGVjdGVkKCkKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0ZWQoKSB7Ci0JCXJldHVybiByaWNoVGV4dFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBoYXMgbm90Ci0JICogICAgICAgICBiZWVuIHNldAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGF0YShTdHJpbmcga2V5KSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmdldERhdGEoa2V5KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb3BlcnR5IG5hbWUgYW5kIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0RGF0YShrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBKYXZhU2NyaXB0LgotCSAqIAotCSAqIEBwYXJhbSBzY3JpcHQKLQkgKiAgICAgICAgICAgIHRoZSBKYXZhU2NyaXB0IHRvIGV4ZWN1dGUKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIHNjcmlwdAotCSAqLwotCXByb3RlY3RlZCBpbnQgZXhlY3V0ZShmaW5hbCBTdHJpbmcgc2NyaXB0KSB7Ci0JCXN0YXR1cyA9IDA7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBzY3JpcHQgIT0gbnVsbCAmJiBzY3JpcHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWlmICghaXNJRSAmJiBwcm9jZXNzaW5nSlNFdmVudCkgewotCQkJCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWVkaXRvci5leGVjdXRlKHNjcmlwdCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVkaXRvci5leGVjdXRlKHNjcmlwdCk7Ci0JCQkJfQotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZXhlY3V0ZSIsIHNjcmlwdCk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gIkZhaWxlZCB0byBleGVjdXRlICIgKyBzY3JpcHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQlsb2dnZXIubG9nRXJyb3IobXNnLCBlKTsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImV4ZWN1dGUiLCBtc2cpOyAvLyROT04tTkxTLTEkCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kLiBUaGUgc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUKLQkgKiBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcuCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQlzdGF0dXMgPSAwOwotCQlpZiAoY29tbWFuZCAhPSBudWxsICYmIGNvbW1hbmQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5DTEVBUl9DT05URU5UKSkgewotCQkJU3RyaW5nIG9sZEluaXRpYWxUZXh0ID0gaW5pdGlhbFRleHQ7Ci0JCQlzZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdGlhbFRleHQgPSBvbGRJbml0aWFsVGV4dDsKLQkJCXN0YXR1cyA9IDE7Ci0JCQltb2RpZmllZCA9IHRydWU7Ci0JCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IGV4ZWN1dGUoY29tbWFuZCArICIoKTsiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYSBzaW5nbGUgcGFyYW1ldGVyLiBUaGUKLQkgKiBzdXBwb3J0ZWQgY29tbWFuZCBzdHJpbmdzIGFyZSBkZWZpbmVkIGluIDxjb2RlPlJpY2hUZXh0Q29tbWFuZDxjb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0JY29tbWFuZAkJYSByaWNoIHRleHQgY29tbWFuZCBzdHJpbmcKLQkgKiBAcGFyYW0JcGFyYW0JCWEgcGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4JYSBzdGF0dXMgY29kZSByZXR1cm5lZCBieSB0aGUgZXhlY3V0ZWQgY29tbWFuZAotCSAqLwotCXB1YmxpYyBpbnQgZXhlY3V0ZUNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIFN0cmluZyBwYXJhbSkgewotCQlpZiAocGFyYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIGV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiBleGVjdXRlKGNvbW1hbmQgKyAiKCciICsgZm9ybWF0VGV4dChwYXJhbSkgKyAiJyk7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGFuIGFycmF5IG9mIHBhcmFtZXRlcnMuIFRoZQotCSAqIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlIGRlZmluZWQgaW4gPGNvZGU+UmljaFRleHRDb21tYW5kPGNvZGU+LgotCSAqIAotCSAqIEBwYXJhbQljb21tYW5kCQlhIHJpY2ggdGV4dCBjb21tYW5kIHN0cmluZwotCSAqIEBwYXJhbQlwYXJhbXMJCWFuIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nW10gcGFyYW1zKSB7Ci0JCWlmIChwYXJhbXMgPT0gbnVsbCB8fCBwYXJhbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBleGVjdXRlQ29tbWFuZChjb21tYW5kKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBwYXJhbXNMZW5ndGggPSBwYXJhbXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtc0xlbmd0aDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQoJ1wnJykuYXBwZW5kKGZvcm1hdFRleHQocGFyYW1zW2ldKSkuYXBwZW5kKCdcJycpOwotCQkJaWYgKGkgPCBwYXJhbXNMZW5ndGggLSAxKSB7Ci0JCQkJc2IuYXBwZW5kKCcsJyk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHBhcmFtID0gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGV4ZWN1dGUoY29tbWFuZCArICIoIiArIHBhcmFtICsgIik7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbnRleHRNZW51ICE9IG51bGwgJiYgIWNvbnRleHRNZW51LmlzRGlzcG9zZWQoKSkgewotCQkJY29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJY29udGV4dE1lbnUgPSBudWxsOwotCQl9Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQlsaXN0ZW5lcnMgPSBudWxsOwotCQl9Ci0JCWlmIChtb2RpZnlMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJbW9kaWZ5TGlzdGVuZXJzLmNsZWFyKCk7Ci0JCQltb2RpZnlMaXN0ZW5lcnMgPSBudWxsOwotCQl9Ci0JCWlmIChodG1sRm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCWh0bWxGb3JtYXR0ZXIgPSBudWxsOwotCQl9Ci0JCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIGVkaXRvci5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhbiBpdGVyYXRvciBmb3IgcmV0cmlldmluZyB0aGUgbW9kaWZ5IGxpc3RlbmVycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxNb2RpZnlMaXN0ZW5lcj4gZ2V0TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbW9kaWZ5TGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICoga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5hZGRLZXlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIGtleXMgYXJlIHByZXNzZWQgYW5kIHJlbGVhc2VkIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUtleUxpc3RlbmVyKEtleUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZUtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBjb250ZW50IG9mIHRoaXMgY29udHJvbCBpcyBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbAotCQkJCSYmICFtb2RpZnlMaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKSB7Ci0JCQltb2RpZnlMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBjb250cm9sIGlzIG1vZGlmaWVkLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbAotCQkJCSYmIG1vZGlmeUxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQkJCW1vZGlmeUxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmZWQgd2hlbgotCSAqIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmFkZERpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZpZWQKLQkgKiB3aGVuIHRoaXMgY29udHJvbCBpcyBkaXNwb3NlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5yZW1vdmVEaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuYWRkSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gaGVscCBldmVudHMgYXJlIGdlbmVyYXRlZCBmb3IgdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLnJlbW92ZUhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudCBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZWRpdG9yICE9IG51bGwgJiYgIWxpc3RlbmVycy5jb250YWluc0tleShsaXN0ZW5lcikpIHsKLQkJCWlmIChldmVudFR5cGUgIT0gU1dULlNFTEVDVEVEKSB7Ci0JCQkJaWYgKGVkaXRvckNvbnRyb2wgPT0gbnVsbAotCQkJCQkJfHwgKGV2ZW50VHlwZSAhPSBTV1QuQWN0aXZhdGUKLQkJCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5EZWFjdGl2YXRlCi0JCQkJCQkJCSYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNJbiAmJiBldmVudFR5cGUgIT0gU1dULkZvY3VzT3V0KSkgewotCQkJCQllZGl0b3IuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCQkJfQotCQkJfQotCQkJbGlzdGVuZXJzLnB1dChsaXN0ZW5lciwgbmV3IFJpY2hUZXh0TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcikpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZAotCSAqIHdoZW4gYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIGV2ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvcgotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXZlbnQKLQkgKiAgICAgICAgICAgIG9jY3VycwotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKGludCBldmVudFR5cGUsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBsaXN0ZW5lcnMuY29udGFpbnNLZXkobGlzdGVuZXIpKSB7Ci0JCQlpZiAoZWRpdG9yQ29udHJvbCA9PSBudWxsCi0JCQkJCXx8IChldmVudFR5cGUgIT0gU1dULkFjdGl2YXRlCi0JCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5EZWFjdGl2YXRlCi0JCQkJCQkJJiYgZXZlbnRUeXBlICE9IFNXVC5Gb2N1c0luICYmIGV2ZW50VHlwZSAhPSBTV1QuRm9jdXNPdXQpKSB7Ci0JCQkJZWRpdG9yLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQkJfQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBldmVudCBsaXN0ZW5lcnMgYXR0YWNoZWQgdG8gdGhpcyBjb250cm9sLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzCi0JICogICAgICAgICBjb250cm9sCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFJpY2hUZXh0TGlzdGVuZXI+IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIGxpc3RlbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIG1vbml0b3IgZXZlbnRzIGFuZCBzdGF0dXMgc2VudCBieSB0aGUgdW5kZXJseWluZwotCSAqIERIVE1MIGVkaXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGF0dXNUZXh0TGlzdGVuZXIoKSB7Ci0JCWVkaXRvci5hZGRTdGF0dXNUZXh0TGlzdGVuZXIobmV3IFN0YXR1c1RleHRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoYW5nZWQoU3RhdHVzVGV4dEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGV2ZW50VGV4dCA9IGV2ZW50LnRleHQ7Ci0JCQkJaW50IGV2ZW50VGV4dExlbmd0aCA9IGV2ZW50VGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoZXZlbnRUZXh0LnN0YXJ0c1dpdGgoU1RBVFVTX1BSRUZJWCkKLQkJCQkJCSYmIGV2ZW50VGV4dExlbmd0aCA+IFNUQVRVU19QUkVGSVhfTEVOR1RIKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9jZXNzaW5nSlNFdmVudCA9IHRydWU7Ci0JCQkJCQlpbnQgZW5kU3RhdHVzSW5kZXggPSBTVEFUVVNfUFJFRklYX0xFTkdUSCArIDE7Ci0JCQkJCQlpZiAoZXZlbnRUZXh0Lmxlbmd0aCgpID4gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAxCi0JCQkJCQkJCSYmIENoYXJhY3Rlci5pc0RpZ2l0KGV2ZW50VGV4dAotCQkJCQkJCQkJCS5jaGFyQXQoZW5kU3RhdHVzSW5kZXgpKSkgewotCQkJCQkJCWVuZFN0YXR1c0luZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgc3RhdHVzVHlwZSA9IEludGVnZXIucGFyc2VJbnQoZXZlbnRUZXh0LnN1YnN0cmluZygKLQkJCQkJCQkJU1RBVFVTX1BSRUZJWF9MRU5HVEgsIGVuZFN0YXR1c0luZGV4KSk7Ci0JCQkJCQlzd2l0Y2ggKHN0YXR1c1R5cGUpIHsKLQkJCQkJCWNhc2UgU1RBVFVTX05PUDoKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0lOSVRJQUxJWkVEOgotCQkJCQkJCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJCQkJCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19JTklUSUFMSVpFRCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoIVBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCS8vIFdvcmthcm91bmQgTW96aWxsYSdhIElGUkFNRQotCQkJCQkJCQkJLy8gaGVpZ2h0IGlzc3VlLgotCQkJCQkJCQkJZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9IRUlHSFQsCi0JCQkJCQkJCQkJCSIiICsgZWRpdG9yLmdldEJvdW5kcygpLmhlaWdodCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJfQotCQkJCQkJCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX1RFWFQsCi0JCQkJCQkJCQkJY3VycmVudFRleHQpOwotCQkJCQkJCQlpZiAoaW5pdGlhbGl6ZWRXaXRoRm9jdXMpIHsKLQkJCQkJCQkJCXNldEZvY3VzKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKCFlZGl0YWJsZSkgewotCQkJCQkJCQkJZXhlY3V0ZUNvbW1hbmQoCi0JCQkJCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5TRVRfRURJVEFCTEUsCi0JCQkJCQkJCQkJCSIiICsgZWRpdGFibGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19NT0RJRklFRDoKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCQkJInN0YXR1c1RleHRMaXN0ZW5lciIsICJTVEFUVVNfTU9ESUZJRUQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19HRVRfVEVYVDoKLQkJCQkJCQlpZiAoZXZlbnRUZXh0TGVuZ3RoID49IFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMikgewotCQkJCQkJCQljdXJyZW50VGV4dCA9IGV2ZW50VGV4dAotCQkJCQkJCQkJCS5zdWJzdHJpbmcoU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQljdXJyZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfR0VUX1RFWFQsIGN1cnJlbnRUZXh0PSIsIGN1cnJlbnRUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0tFWV9ET1dOOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKSB7Ci0JCQkJCQkJCVN0cmluZyBjbWQgPSBldmVudFRleHQKLQkJCQkJCQkJCQkuc3Vic3RyaW5nKFNUQVRVU19QUkVGSVhfTEVOR1RIICsgMik7Ci0JCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJIlNUQVRVU19LRVlfRE9XTiwgY21kPSIgKyBjbWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLkNPUFkpKSB7Ci0JCQkJCQkJCQlzZXRDb3B5VVJMKCk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuQ1VUKSkgewotCQkJCQkJCQkJc2V0Q29weVVSTCgpOwotCQkJCQkJCQkJQ3V0QWN0aW9uIGFjdGlvbiA9IG5ldyBDdXRBY3Rpb24oCi0JCQkJCQkJCQkJCVJpY2hUZXh0LnRoaXMpOwotCQkJCQkJCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAoY21kCi0JCQkJCQkJCQkJLmVxdWFscyhSaWNoVGV4dENvbW1hbmQuRklORF9URVhUKSkgewotCQkJCQkJCQkJZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5leGVjdXRlKAotCQkJCQkJCQkJCQlSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5QQVNURSkpIHsKLQkJCQkJCQkJCVBhc3RlQWN0aW9uIGFjdGlvbiA9IG5ldyBQYXN0ZUFjdGlvbigKLQkJCQkJCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJCQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCQkJCQkJfSBlbHNlIGlmIChjbWQuZXF1YWxzKFJpY2hUZXh0Q29tbWFuZC5TQVZFKSkgewotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKQotCQkJCQkJCQkJCQkuZG9TYXZlKG51bGwpOwotCQkJCQkJCQl9IGVsc2UgaWYgKGNtZC5lcXVhbHMoUmljaFRleHRDb21tYW5kLlNBVkVfQUxMKSkgewotCQkJCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkJCQkJCQkJLmdldEFjdGl2ZVBhZ2UoKS5zYXZlQWxsRWRpdG9ycygKLQkJCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19LRVlfVVA6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19LRVlfVVAsIG1vZGlmaWVkPSIgKyBtb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQkJY2hlY2tNb2RpZnkoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX1NFTEVDVF9URVhUOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAyKSB7Ci0JCQkJCQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBldmVudFRleHQuc3Vic3RyaW5nKAotCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMikuc3BsaXQoCi0JCQkJCQkJCQkJIlxcJCIsIDUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlyaWNoVGV4dFNlbGVjdGlvbi5zZXRGb250TmFtZShzdHJpbmdzWzBdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZvbnRTaXplKHN0cmluZ3NbMV0pOwotCQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0QmxvY2tTdHlsZShzdHJpbmdzWzJdKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldEZsYWdzKEludGVnZXIKLQkJCQkJCQkJCQkJLnBhcnNlSW50KHN0cmluZ3NbM10pKTsKLQkJCQkJCQkJCXJpY2hUZXh0U2VsZWN0aW9uLnNldFRleHQoc3RyaW5nc1s0XSk7Ci0JCQkJCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkJInNlbGVjdGlvblN0YXR1c0xpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkiY3VycmVudCBzZWxlY3Rpb24gaXM9IiArIHJpY2hUZXh0U2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCQkJCQkJaWYgKGhhc0ZvY3VzKCkpCi0JCQkJCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNFTEVDVEVELCBuZXcgRXZlbnQoKSk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJcmljaFRleHRTZWxlY3Rpb24uc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJaGFzU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfU0VMRUNUX1RFWFQsIHNlbGVjdGVkVGV4dD0iLCByaWNoVGV4dFNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBTVEFUVVNfU0VMRUNUX0NPTlRST0w6Ci0JCQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQkJCXByaW50RGVidWdNZXNzYWdlKCJzdGF0dXNUZXh0TGlzdGVuZXIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJIlNUQVRVU19TRUxFQ1RfQ09OVFJPTCwgY29udHJvbCBzZWxlY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWhhc1NlbGVjdGlvbiA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFNUQVRVU19TRUxFQ1RfTk9ORToKLQkJCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoInN0YXR1c1RleHRMaXN0ZW5lciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkiU1RBVFVTX1NFTEVDVF9OT05FLCBubyBzZWxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQloYXNTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX0VYRUNfQ01EOgotCQkJCQkJCWlmIChldmVudFRleHRMZW5ndGggPj0gU1RBVFVTX1BSRUZJWF9MRU5HVEggKyAzKSB7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlzdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KGV2ZW50VGV4dAotCQkJCQkJCQkJCQkuc3Vic3RyaW5nKAotCQkJCQkJCQkJCQkJCVNUQVRVU19QUkVGSVhfTEVOR1RIICsgMiwKLQkJCQkJCQkJCQkJCQlTVEFUVVNfUFJFRklYX0xFTkdUSCArIDMpKTsKLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCXN0YXR1cyA9IC0xOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChkZWJ1ZyAmJiBzdGF0dXMgIT0gMSkgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgic3RhdHVzVGV4dExpc3RlbmVyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCSJTVEFUVVNfRVhFQ19DTUQsIHN0YXR1cz0iICsgc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgU1RBVFVTX1JFRk9STUFUX0xJTktTOgotCQkJCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJCQlwcmludERlYnVnTWVzc2FnZSgKLQkJCQkJCQkJCQkic3RhdHVzVGV4dExpc3RlbmVyIiwgIlNUQVRVU19SRUZPUk1BVF9MSU5LUyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKFBsYXRmb3JtLmdldE9TKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCS8vIFdvcmthcm91bmQgdGhlIGRyYWcgYW5kIGRyb3AgaXNzdWUgd2l0aCBEQkNTCi0JCQkJCQkJCS8vIGNoYXJhY3RlcnMuCi0JCQkJCQkJCWlmIChtb2RpZmllZCkgewotCQkJCQkJCQkJc2V0VGV4dChnZXRUZXh0KCkpOwotCQkJCQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlwcm9jZXNzaW5nSlNFdmVudCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgdGhlIEhUTUwgc291cmNlIGZvciB0aGUgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIEhUTUwgc291cmNlIGZvciB0aGUgZWRpdG9yCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0ZUVkaXRvckhUTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGVzY2FwZWRCYXNlUGF0aCA9IGJhc2VQYXRoOwotCQlpZiAoZXNjYXBlZEJhc2VQYXRoLnN0YXJ0c1dpdGgoRmlsZVV0aWwuVU5DX1BBVEhfUFJFRklYKSkKLQkJCWVzY2FwZWRCYXNlUGF0aCA9IGVzY2FwZWRCYXNlUGF0aC5yZXBsYWNlRmlyc3QoCi0JCQkJCSJeXFxcXFxcXFwiLCAiXFxcXFxcXFxcXFxcXFxcXCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZXNjYXBlZEJhc2VQYXRoID0gWE1MVXRpbAotCQkJCS5lc2NhcGUoImZpbGU6Ly8iICsgZXNjYXBlZEJhc2VQYXRoLnJlcGxhY2VBbGwoIiciLCAiXFxcXCciKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCVN0cmluZyBlc2NhcGVkUnRlVVRMID0gcnRlVVJMLnJlcGxhY2VBbGwoIiZhcG9zOyIsICIlMjciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJU3RyaW5nQnVmZmVyIHJ0ZVhNTCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcnRlWE1MLmFwcGVuZCgiPHJ0ZSBpZD1cIiIpLmFwcGVuZCgicnRlIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLmFwcGVuZCgiXCIgY3NzPVwiIikuYXBwZW5kKGVzY2FwZWRSdGVVVEwgKyAicnRlLmNzcyIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS5hcHBlbmQoIlwiIGpzPVwiIikuYXBwZW5kKGVzY2FwZWRSdGVVVEwgKyAicnRlLmpzIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJLmFwcGVuZCgiXCIgYmFzZVVSTD1cIiIpLmFwcGVuZChlc2NhcGVkQmFzZVBhdGgpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKCJcIi8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nV3JpdGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJWFNMVFByb2Nlc3Nvci50cmFuc2Zvcm0oCi0JCQkJcnRlRm9sZGVyICsgInJ0ZS54c2wiLCBydGVYTUwudG9TdHJpbmcoKSwgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRmlsbHMgdGhlIGNvbnRleHQgbWVudSB3aXRoIG1lbnUgaXRlbXMuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRNZW51Ci0JICogICAgICAgICAgICBhIGNvbnRleHQgbWVudSBjb250YWluaW5nIHJpY2ggdGV4dCBhY3Rpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KE1lbnUgY29udGV4dE1lbnUpIHsKLQkJZmluYWwgTWVudUl0ZW0gY3V0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljdXRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY3V0QWN0aW9uX3RleHQpOwotCQljdXRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDdXRBY3Rpb24gYWN0aW9uID0gbmV3IEN1dEFjdGlvbihSaWNoVGV4dC50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dC50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIGNvcHlJdGVtID0gbmV3IE1lbnVJdGVtKGNvbnRleHRNZW51LCBTV1QuUFVTSCk7Ci0JCWNvcHlJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90ZXh0KTsKLQkJY29weUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvcHlBY3Rpb24gYWN0aW9uID0gbmV3IENvcHlBY3Rpb24oUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKFJpY2hUZXh0LnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0LnRoaXMpOwotCQkJfQotCQl9KTsKLQotCQlmaW5hbCBNZW51SXRlbSBwYXN0ZVBsYWluVGV4dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRJbWFnZShSaWNoVGV4dEltYWdlcy5JTUdfUEFTVEVfUExBSU5fVEVYVCk7Ci0JCXBhc3RlUGxhaW5UZXh0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVQbGFpblRleHRBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlUGxhaW5UZXh0QWN0aW9uKAotCQkJCQkJUmljaFRleHQudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHQudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlnZXRTZWxlY3RlZFRleHQoKTsKLQkJCQljdXRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUgJiYgaGFzU2VsZWN0aW9uKTsKLQkJCQljb3B5SXRlbS5zZXRFbmFibGVkKGhhc1NlbGVjdGlvbik7Ci0JCQkJcGFzdGVJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJCXBhc3RlUGxhaW5UZXh0SXRlbS5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBsaXN0ZW5lcnMgdG8gbWFuYWdlIHRoZSBhY3RpdmF0aW9uIGFuZCBmb2N1cyBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlzdGVuZXJzKCkgewotCQllZGl0b3JDb250cm9sID0gZ2V0Q29udHJvbFNpdGUoZWRpdG9yKTsKLQkJaWYgKGVkaXRvckNvbnRyb2wgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkiaW5pdCIsICJlZGl0b3JDb250cm9sPSIgKyBlZGl0b3JDb250cm9sLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCS8vIG9ubHkgSUUgKHdpbjMyKSBoYXMgdGhlIGVkaXRvckNvbnRyb2wgIT0gbnVsbAotCQkJaXNJRSA9IHRydWU7Ci0JCQkKLQkJCWVkaXRvckNvbnRyb2wuYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiYWN0aXZhdGVMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2V0Rm9jdXMoKTsKLQkJCQkJbm90aWZ5TGlzdGVuZXJzKFNXVC5BY3RpdmF0ZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZGVhY3RpdmF0ZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzZXRCbHVyKCk7Ci0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuRGVhY3RpdmF0ZSwgZXZlbnQpOwotCQkJCX0KLQkJCX0pOwotCi0JCQllZGl0b3JDb250cm9sLmFkZExpc3RlbmVyKFNXVC5Gb2N1c0luLCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkJaWYgKGRlYnVnKSB7Ci0JCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZm9jdXNJbkxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlleGVjdXRlQ29tbWFuZCgidXBkYXRlU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQJCQkJCQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkZvY3VzSW4sIGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yQ29udHJvbC5hZGRMaXN0ZW5lcihTV1QuS2V5VXAsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCQlpbnQga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7Ci0JCQkJCWludCBzdGF0ZU1hc2sgPSBldmVudC5zdGF0ZU1hc2s7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCSJrZXlVcExpc3RlbmVyIiwgImtleUNvZGU9IiArIGtleUNvZGUgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJKyAiLCBzdGF0ZU1hc2s9IiArIHN0YXRlTWFzayArICIsIGVkaXRhYmxlPSIgKyBlZGl0YWJsZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWlmICgoc3RhdGVNYXNrICYgU1dULkNUUkwpID4gMAotCQkJCQkJCXx8IChzdGF0ZU1hc2sgJiBTV1QuQUxUKSA+IDAKLQkJCQkJCQl8fCAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgPiAwICYmIGtleUNvZGUgPT0gc3RhdGVNYXNrKSkgewotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJCWlmIChlZGl0YWJsZSkgewotCQkJCQkJc3dpdGNoIChldmVudC5rZXlDb2RlKSB7Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfTEVGVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfVVA6Ci0JCQkJCQljYXNlIFNXVC5FTkQ6Ci0JCQkJCQljYXNlIFNXVC5IT01FOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9VUDoKLQkJCQkJCWNhc2UgU1dULlRBQjoKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWNoZWNrTW9kaWZ5KCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQkJZWRpdG9yLmFkZExvY2F0aW9uTGlzdGVuZXIobmV3IExvY2F0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGFuZ2luZyhMb2NhdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIERlYWN0aXZhdGUgdGhlIGxpbmtzIGluIHRoZSBjb250ZW50IHBhZ2UgaW4gcmVhZG9ubHkKLQkJCQkJLy8gbW9kZS4KLQkJCQkJZXZlbnQuZG9pdCA9IGVkaXRhYmxlOwotCQkJCX0KLQkJCX0pOwotCQl9IGVsc2UgewotCQkJZWRpdG9yLmFkZExpc3RlbmVyKFNXVC5BY3RpdmF0ZSwgbmV3IExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImFjdGl2YXRlTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWVkaXRvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLmtleUNvZGUgPT0gU1dULlRBQikgewotCQkJCQkJaWYgKChlLnN0YXRlTWFzayAmIFNXVC5TSElGVCkgIT0gMCkgewotCQkJCQkJCWVkaXRvci50cmF2ZXJzZShTV1QuVFJBVkVSU0VfVEFCX1BSRVZJT1VTKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZWRpdG9yLnRyYXZlcnNlKFNXVC5UUkFWRVJTRV9UQUJfTkVYVCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJaWYgKCFlZGl0YWJsZSkgewotCQkJCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJCWlmICgoZS5zdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgPiAwCi0JCQkJCQkJfHwgKGUuc3RhdGVNYXNrICYgU1dULkFMVCkgPiAwKQotCQkJCQkJcmV0dXJuOwotCQkJCQlpZiAoZWRpdGFibGUpIHsKLQkJCQkJCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCQkJCQljYXNlIFNXVC5BUlJPV19ET1dOOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfTEVGVDoKLQkJCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUOgotCQkJCQkJY2FzZSBTV1QuQVJST1dfVVA6Ci0JCQkJCQljYXNlIFNXVC5FTkQ6Ci0JCQkJCQljYXNlIFNXVC5IT01FOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9ET1dOOgotCQkJCQkJY2FzZSBTV1QuUEFHRV9VUDoKLQkJCQkJCWNhc2UgU1dULlNISUZUOgotCQkJCQkJY2FzZSBTV1QuVEFCOgotCQkJCQkJCWJyZWFrOwotCQkJCQkJZGVmYXVsdDoKLQkJCQkJCQljaGVja01vZGlmeSgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQllZGl0b3IuYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZSkgewotCQkJCWlmIChkZWJ1ZykgewotCQkJCQlwcmludERlYnVnTWVzc2FnZSgiZGlzcG9zZUxpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQJCQkJCQkKLQkJCQl9Ci0JCQkJZGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQotCQlsaXN0ZW5lcnMgPSBuZXcgSGFzaHRhYmxlPExpc3RlbmVyLCBSaWNoVGV4dExpc3RlbmVyPigpOwotCQltb2RpZnlMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PE1vZGlmeUxpc3RlbmVyPigpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSByaWNoIHRleHQgZXZlbnQgbGlzdGVuZXJzLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgU1dUIGV2ZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUsIEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZXZlbnQuZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQkJZXZlbnQud2lkZ2V0ID0gZWRpdG9yOwotCi0JCQlmb3IgKEl0ZXJhdG9yPFJpY2hUZXh0TGlzdGVuZXI+IGkgPSBsaXN0ZW5lcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCVJpY2hUZXh0TGlzdGVuZXIgbGlzdGVuZXIgPSBpLm5leHQoKTsKLQkJCQlpZiAobGlzdGVuZXIuZ2V0RXZlbnRUeXBlKCkgPT0gZXZlbnRUeXBlKSB7Ci0JCQkJCWlmIChkZWJ1ZykgewotCQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkJCSJub3RpZnlMaXN0ZW5lcnMiLCAibm90aWZ5aW5nIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIgKyAiLCBldmVudFR5cGU9IiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCQotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmdldExpc3RlbmVyKCkuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJCQkibm90aWZ5TGlzdGVuZXJzIiwgIm5vdGlmaWVkIGxpc3RlbmVyLCAiICsgbGlzdGVuZXIgKyAiLCBldmVudFR5cGU9IiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIG1vZGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgcmljaCB0ZXh0IGVkaXRvciBjb250ZW50IGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5TW9kaWZ5TGlzdGVuZXJzKCkgewotCQlub3RpZnlpbmdNb2RpZnlMaXN0ZW5lcnMgPSB0cnVlOwotCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCWV2ZW50LmRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJZXZlbnQud2lkZ2V0ID0gZWRpdG9yOwotCi0JCWZvciAoSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGkgPSBtb2RpZnlMaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaQotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lciA9IGkubmV4dCgpOwotCQkJaWYgKGRlYnVnKSB7Ci0JCQkJcHJpbnREZWJ1Z01lc3NhZ2UoCi0JCQkJCQkibm90aWZ5TW9kaWZ5TGlzdGVuZXJzIiwgIm5vdGlmeWluZyBsaXN0ZW5lciwgIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJfQotCQkJbGlzdGVuZXIubW9kaWZ5VGV4dChuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpKTsKLQkJCWlmIChkZWJ1ZykgewotCQkJCXByaW50RGVidWdNZXNzYWdlKAotCQkJCQkJIm5vdGlmeU1vZGlmeUxpc3RlbmVycyIsICJub3RpZmllZCBsaXN0ZW5lciwgIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQkJfQotCQl9Ci0KLQkJbm90aWZ5aW5nTW9kaWZ5TGlzdGVuZXJzID0gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0I2NoZWNrTW9kaWZ5KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGlmeSgpIHsKLQkJdHJ5IHsKLQkJCWlmICghY2hlY2tpbmdNb2RpZnlFdmVudCkgewotCQkJCWNoZWNraW5nTW9kaWZ5RXZlbnQgPSB0cnVlOwotCQkJCWlmIChtb2RpZmllZCkgewotCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWlzSUUgJiYgcHJvY2Vzc2luZ0pTRXZlbnQpIHsKLQkJCQkJCURpc3BsYXkuZ2V0Q3VycmVudCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlpZiAoIWdldFRleHQoKS5lcXVhbHMoaW5pdGlhbFRleHQpKSB7Ci0JCQkJCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWYgKCFnZXRUZXh0KCkuZXF1YWxzKGluaXRpYWxUZXh0KSkgewotCQkJCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQkJCQlub3RpZnlNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImNoZWNrTW9kaWZ5IiwgIm1vZGlmaWVkPSIgKyBtb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQljaGVja2luZ01vZGlmeUV2ZW50ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHByb3ZpZGVzIGFuIG9wcG9ydHVuaXR5IGZvciBhIHN1YiBjbGFzcyB0byB0aWR5IHVwIHRoZSByaWNoIHRleHQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0aWR5VGV4dChTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIHRoZSB0ZXh0IGZvciBjb25zdW1wdGlvbiBieSB0aGUgSmF2YVNjcmlwdC9ESFRNTCBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHJpY2ggdGV4dCBlbmNvZGVkIGluIEhUTUwgZm9ybWF0Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmb3JtYXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgdGV4dFNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRTaXplOyBpKyspIHsKLQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoY2gpIHsKLQkJCWNhc2UgJ1xyJzoKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1x0JzoKLQkJCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcbic6Ci0JCQkJcmVzdWx0LmFwcGVuZChFTkNPREVEX05FV0xJTkUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXCcnOgotCQkJCXJlc3VsdC5hcHBlbmQoRU5DT0RFRF9TSU5HTEVfUVVPVEUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnXFwnOgotCQkJCXJlc3VsdC5hcHBlbmQoIlxcXFwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hpbGQgPGNvZGU+T2xlQ29udHJvbFNpdGU8L2NvZGU+IGNvbnRhaW5lZCB3aXRoaW4gdGhlCi0JICogZ2l2ZW4gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JICogICAgICAgICAgICBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0LCBwcmVzdW1hYmx5IGEKLQkgKiAgICAgICAgICAgIDxjb2RlPkJyb3dzZXI8L2NvZGU+Ci0JICogQHJldHVybiBhbiA8Y29kZT5PbGVDb250cm9sU2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgZ2V0Q29udHJvbFNpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoUGxhdGZvcm0uZ2V0T1MoKS5lcXVhbHMoIndpbjMyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJQ29udHJvbFtdIGNvbnRyb2xzID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGNvbnRyb2xDbGFzcyA9IGNvbnRyb2xzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmIChjb250cm9sQ2xhc3MuZXF1YWxzKCJvcmcuZWNsaXBzZS5zd3QuYnJvd3Nlci5XZWJTaXRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gY29udHJvbHNbaV07Ci0JCQkJfSBlbHNlIGlmIChjb250cm9sc1tpXSBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJCQlyZXR1cm4gZ2V0Q29udHJvbFNpdGUoKENvbXBvc2l0ZSkgY29udHJvbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnLCBTdHJpbmcgdGV4dCkgewotCQlTdHJpbmdCdWZmZXIgc3RyQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzdHJCdWYuYXBwZW5kKCJSaWNoVGV4dFsiKS5hcHBlbmQoZWRpdG9yLmhhbmRsZSkuYXBwZW5kKCddJykgLy8kTk9OLU5MUy0xJAotCQkJCS5hcHBlbmQoJy4nKS5hcHBlbmQobWV0aG9kKTsKLQkJaWYgKG1zZyAhPSBudWxsICYmIG1zZy5sZW5ndGgoKSA+IDApIHsKLQkJCXN0ckJ1Zi5hcHBlbmQoIjogIikuYXBwZW5kKG1zZyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCdcbicpLmFwcGVuZCh0ZXh0KTsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyQnVmKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbXNnKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlYnVnTWVzc2FnZShTdHJpbmcgbWV0aG9kKSB7Ci0JCXByaW50RGVidWdNZXNzYWdlKG1ldGhvZCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEZpbmRSZXBsYWNlQWN0aW9uIGdldEZpbmRSZXBsYWNlQWN0aW9uKCkgewotCQlyZXR1cm4gZmluZFJlcGxhY2VBY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmluZFJlcGxhY2VBY3Rpb24oRmluZFJlcGxhY2VBY3Rpb24gZmluZFJlcGxhY2VBY3Rpb24pIHsKLQkJaWYgKGZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLmZpbmRSZXBsYWNlQWN0aW9uICE9IG51bGwKLQkJCQkJJiYgdGhpcy5maW5kUmVwbGFjZUFjdGlvbiAhPSBmaW5kUmVwbGFjZUFjdGlvbikgewotCQkJCXRoaXMuZmluZFJlcGxhY2VBY3Rpb24uZGlzcG9zZSgpOwotCQkJfQotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbiA9IGZpbmRSZXBsYWNlQWN0aW9uOwotCQkJdGhpcy5maW5kUmVwbGFjZUFjdGlvbi5zZXRSaWNoVGV4dCh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXNldFRleHQodGV4dCk7Ci0JCWluaXRpYWxUZXh0ID0gdGV4dCA9PSBudWxsID8gIiIgOiB0ZXh0OyAvLyROT04tTkxTLTEkCi0JCW1vZGlmaWVkID0gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRDb21tYW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ZjdmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLS8qKgotICogRGVmaW5lcyB0aGUgZWRpdGluZyBjb21tYW5kcyBzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgcmljaCB0ZXh0IGNvbnRyb2wgYW5kCi0gKiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRDb21tYW5kIHsKLQotCS8qKgotCSAqIEFkZHMgYSBIVE1MIGZyYWdtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9IVE1MID0gImFkZEhUTUwiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogQWRkcyBhbiBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSU1BR0UgPSAiYWRkSW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgaG9yaXpvbnRhbCBsaW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9MSU5FID0gImFkZExpbmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgbGluay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfTElOSyA9ICJhZGRMaW5rIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5zZXJ0cyB0ZXh0IG92ZXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9URVhUID0gImluc2VydFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGFuIG9yZGVyZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfT1JERVJFRF9MSVNUID0gImFkZE9yZGVyZWRMaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQWRkcyBhIHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9UQUJMRSA9ICJhZGRUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYW4gdW5vcmRlcmVkIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1VOT1JERVJFRF9MSVNUID0gImFkZFVub3JkZXJlZExpc3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfQ09MT1IgPSAiYmFja0NvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0xEID0gImJvbGQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHJpY2ggdGV4dCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0NPTlRFTlQgPSAiY2xlYXJDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29waWVzIHRoZSBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWSA9ICJjb3B5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVVCA9ICJjdXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURSA9ICJkZWxldGVUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRmluZHMgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5EX1RFWFQgPSAiZmluZFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZXRzIHRoZSBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfVEVYVCA9ICJnZXRUZXh0IjsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SR1JPVU5EX0NPTE9SID0gImZvcmVDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZvcm1hdHMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX0JMT0NLID0gImZvcm1hdEJsb2NrIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfU0VMRUNURURfVEVYVCA9ICJnZXRTZWxlY3RlZFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRlbnRzIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICJpbmRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVRBTElDID0gIml0YWxpYyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENlbnRlciBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9DRU5URVIgPSAianVzdGlmeUNlbnRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZ1bGx5IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0ZVTEwgPSAianVzdGlmeUZ1bGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMZWZ0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUSUZZX0xFRlQgPSAianVzdGlmeUxlZnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSaWdodCBqdXN0aWZpZXMgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlVTVElGWV9SSUdIVCA9ICJqdXN0aWZ5UmlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPdXRkZW50cyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRERU5UID0gIm91dGRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQYXN0ZXMgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTVEUgPSAicGFzdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFX0FMTF9URVhUID0gInJlcGxhY2VBbGxUZXh0IjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFX1RFWFQgPSAicmVwbGFjZVRleHQiOyAvLyROT04tTkxTLTEkCQkKLQotCS8qKgotCSAqIFJlZG9lcyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPID0gInJlZG8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjdXJyZW50IGZvcm1hdHRpbmcgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0ZPUk1BVCA9ICJyZW1vdmVGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTYXZlcyB0aGUgZWRpdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FWRSA9ICJzYXZlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2F2ZXMgYWxsIGVkaXRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0FMTCA9ICJzYXZlQWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2VsZWN0cyBhbGwgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfQUxMID0gInNlbGVjdEFsbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfTkFNRSA9ICJzZXRGb250TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0ZPTlRfU0laRSA9ICJzZXRGb250U2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGZvbnQgc3R5bGUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT05UX1NUWUxFID0gInNldEZvbnRTdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgd2hldGhlciB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9FRElUQUJMRSA9ICJzZXRFZGl0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgZm9jdXMgdG8gdGhpcyBjb250cm9sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9GT0NVUyA9ICJzZXRGb2N1cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldHMgdGhlIGhlaWdodCBvZiB0aGlzIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX0hFSUdIVCA9ICJzZXRIZWlnaHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBIVE1MIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfVEVYVCA9ICJzZXRUZXh0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVG9nZ2xlcyB0aGUgJ3N0cmlrZS10aHJvdWdoJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSUtFX1RIUk9VR0ggPSAic3RyaWtlVGhyb3VnaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHN1YnNjcmlwdCBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCU0NSSVBUID0gInN1YnNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHN1cGVyc2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlNDUklQVCA9ICJzdXBlcnNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRvZ2dsZXMgdGhlIHVuZGVybGluZSBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFVuZG9lcyB0aGUgcHJldmlvdXMgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRPID0gInVuZG8iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIGxpbmsgdG8gbm9ybWFsIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5MSU5LID0gInVubGluayI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGFlNDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLlBhcmFtZXRlcml6ZWRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMub3BlcmF0aW9ucy5JVW5kb0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRmluZFJlcGxhY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuUGFzdGVQbGFpblRleHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5TV1RLZXlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0Vmlld2VyVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNUYWJGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DVGFiSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlZpZXdGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkhUTUxUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JS2V5QmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkub3BlcmF0aW9ucy5PcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5vcGVyYXRpb25zLlJlZG9BY3Rpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuVW5kb0FjdGlvbkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JUmVhZE9ubHlEZXBlbmRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JV29ya2JlbmNoQWN0aW9uRGVmaW5pdGlvbklkczsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBUaGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIHVzZXMgWEhUTUwgYXMgdGhlIHVuZGVybHlpbmcgbWFya3VwIGxhbmd1YWdlIGZvcgotICogdGhlIHJpY2ggdGV4dCBjb250ZW50LiBJdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIDxjb2RlPlZpZXdGb3JtPC9jb2RlPgotICogY29udHJvbCB3aXRoIGEgdG9vbCBiYXIgYXQgdGhlIHRvcCwgYSB0YWIgZm9sZGVyIHRoYXQgY29udGFpbnMgYQotICogPGNvZGU+UmljaFRleHQ8L2NvZGU+IGNvbnRyb2wgZm9yIGVudGVyaW5nIHRoZSByaWNoIHRleHQgY29udGVudCwgYW5kIGEgdGFiCi0gKiBmb2xlciB0aGF0IGNvbnRhaW5zIGEgPGNvZGU+U3R5bGVUZXh0PC9jb2RlPiBjb250cm9sIGZvciB2aWV3aW5nIGFuZAotICogbW9kaWZ5aW5nIHRoZSBYSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvciBpbXBsZW1lbnRzIElSaWNoVGV4dEVkaXRvciB7Ci0KLQkvLyBUaGUgSFRNTCB0YWIgbmFtZS4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1RBQl9OQU1FID0gUmljaFRleHRSZXNvdXJjZXMuaHRtbFRhYl90ZXh0OwotCi0JLy8gSWYgdHJ1ZSwgbG9nIGRlYnVnZ2luZyBpbmZvLgotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnOwotCi0JLy8gVGhlIHBsdWctaW4gbG9nZ2VyLgotCXByb3RlY3RlZCBMb2dnZXIgbG9nZ2VyOwotCi0JLy8gVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MgKDxocmVmPiwgPGltZz4sIGV0Yy4pLgotCXByb3RlY3RlZCBTdHJpbmcgYmFzZVBhdGg7Ci0KLQkvLyBUaGUgZWRpdG9yIGZvcm0uCi0JcHJvdGVjdGVkIFZpZXdGb3JtIGZvcm07Ci0KLQkvLyBUaGUgZWRpdG9yIHRvb2wgYmFyLgotCXByb3RlY3RlZCBJUmljaFRleHRUb29sQmFyIHRvb2xCYXI7Ci0KLQkvLyBUaGUgZWRpdG9yIGNvbnRlbnQuCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250ZW50OwotCi0JLy8gVGhlIGVkaXRvciB0YWIgZm9sZGVyLgotCXByb3RlY3RlZCBDVGFiRm9sZGVyIHRhYkZvbGRlcjsKLQotCS8vIFRoZSByaWNoIHRleHQgdGFiCi0JcHJvdGVjdGVkIENUYWJJdGVtIHJpY2hUZXh0VGFiOwotCi0JLy8gVGhlIEhUTUwgc291cmNlIHRhYgotCXByb3RlY3RlZCBDVGFiSXRlbSBodG1sVGFiOwotCi0JLy8gVGhlIGVtYmVkZGVkIHJpY2ggdGV4dCBjb250cm9sLgotCXByb3RlY3RlZCBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBUaGUgdW5kZXJseWluZyBIVE1MIHRleHQgZWRpdG9yLgotCXByb3RlY3RlZCBUZXh0Vmlld2VyIHNvdXJjZVZpZXdlcjsKLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGN1cnJlbnREb2M7Ci0JCi0JLy8gRHJvcCBzdXBwb3J0Ci0JcHJvdGVjdGVkIERyb3BUYXJnZXQgc291cmNlRWRpdERyb3BUYXJnZXQ7Ci0KLQkvLyBIVE1MIGVkaXRvcidzIGNvbnRleHQgbWVudQotCXByb3RlY3RlZCBNZW51IGNvbnRleHRNZW51OwotCi0JLy8gSGFzIHRoZSBIVE1MIHNvdXJjZSBiZWVuIG1vZGlmaWVkPwotCXByb3RlY3RlZCBib29sZWFuIHNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0KLQkvLyBUaGUgZWRpdG9yJ3MgZWRpdGFibGUgZmxhZy4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlZGl0YWJsZSA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBPcGVyYXRpb25IaXN0b3J5QWN0aW9uSGFuZGxlciB1bmRvQWN0aW9uOwotCQotCXByaXZhdGUgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIgcmVkb0FjdGlvbjsKLQkKLQlwcml2YXRlIElFZGl0b3JTaXRlIGVkaXRvclNpdGU7Ci0KLQkvKiogVGhlIGFjdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBlZGl0b3IuICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQWN0aW9uPiBmQWN0aW9ucz0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQWN0aW9uPigxMCk7Ci0JCi0JLyoqIFRoZSB2ZXJpZnkga2V5IGxpc3RlbmVyIGZvciBhY3RpdmF0aW9uIGNvZGUgdHJpZ2dlcmluZy4gKi8KLQlwcml2YXRlIEFjdGl2YXRpb25Db2RlVHJpZ2dlciBmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyPSBuZXcgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCk7Ci0JCi0JLyoqIFRoZSBlZGl0b3IncyBhY3Rpb24gYWN0aXZhdGlvbiBjb2Rlcy4gKi8KLQlwcml2YXRlIExpc3QgZkFjdGl2YXRpb25Db2Rlcz0gbmV3IEFycmF5TGlzdCgyKTsKLQkKLQlmaW5hbCBJVW5kb01hbmFnZXIgdW5kb01hbmFnZXI9IG5ldyBUZXh0Vmlld2VyVW5kb01hbmFnZXIoMTApOwotCQotCS8qKgotCSAqIFRoZSBrZXkgYmluZGluZyBzY29wZXMgb2YgdGhpcyBlZGl0b3IuCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZktleUJpbmRpbmdTY29wZXM7Ci0KLQkKLQlwcm90ZWN0ZWQgSURvY3VtZW50TGlzdGVuZXIgc291cmNlRWRpdERvY3VtZW50TGlzdGVuZXI9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJc291cmNlTW9kaWZpZWQgPSB0cnVlOwotCQkJaWYgKHJpY2hUZXh0ICE9IG51bGwgJiYgcmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dCkgewotCQkJCXJpY2hUZXh0Lm5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQkJfQotCQl9Ci0JfTsKLQotCi0JLy8gVGhlIGRlYWN0aXZhdGUgbGlzdGVuZXIgZm9yIHRoZSBzb3VyY2VFZGl0IGNvbnRyb2wuCi0JcHJvdGVjdGVkIExpc3RlbmVyIHNvdXJjZUVkaXREZWFjdGl2YXRlTGlzdGVuZXIgPSBuZXcgTGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCQl1cGRhdGVSaWNoVGV4dChzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKSk7Ci0JCQkJc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JCQkJc291cmNlTW9kaWZpZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvLyBUaGUga2V5IGxpc3RlbmVyIGZvciB0aGUgc291cmNlRWRpdCBjb250cm9sLgotCXByb3RlY3RlZCBLZXlMaXN0ZW5lciBzb3VyY2VFZGl0S2V5TGlzdGVuZXIgPSBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJT2JqZWN0IGFkYXB0ZXIgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFkYXB0ZXIoCi0JCQkJCUlCaW5kaW5nU2VydmljZS5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIgaW5zdGFuY2VvZiBJQmluZGluZ1NlcnZpY2UpIHsKLQkJCQlpbnQgYWNjZWwgPSBTV1RLZXlTdXBwb3J0Ci0JCQkJCQkuY29udmVydEV2ZW50VG9Vbm1vZGlmaWVkQWNjZWxlcmF0b3IoZSk7Ci0JCQkJS2V5U3Ryb2tlIHN0cm9rZSA9IFNXVEtleVN1cHBvcnQKLQkJCQkJCS5jb252ZXJ0QWNjZWxlcmF0b3JUb0tleVN0cm9rZShhY2NlbCk7Ci0JCQkJS2V5U2VxdWVuY2Ugc2VxID0gS2V5U2VxdWVuY2UuZ2V0SW5zdGFuY2Uoc3Ryb2tlKTsKLQkJCQlCaW5kaW5nIGJpbmQgPSAoKElCaW5kaW5nU2VydmljZSkgYWRhcHRlcikuZ2V0UGVyZmVjdE1hdGNoKHNlcSk7Ci0JCQkJaWYgKGJpbmQgIT0gbnVsbCkgewotCQkJCQlQYXJhbWV0ZXJpemVkQ29tbWFuZCBjb21tYW5kID0gYmluZAotCQkJCQkJCS5nZXRQYXJhbWV0ZXJpemVkQ29tbWFuZCgpOwotCQkJCQlpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgY21kSWQgPSBjb21tYW5kLmdldElkKCk7Ci0JCQkJCQlpZiAoY21kSWQgIT0gbnVsbAotCQkJCQkJCQkmJiBjbWRJZAotCQkJCQkJCQkJCS5lcXVhbHMoIm9yZy5lY2xpcHNlLnVpLmVkaXQuZmluZFJlcGxhY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmljaFRleHQuZ2V0RmluZFJlcGxhY2VBY3Rpb24oKS5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXRoaXMocGFyZW50LCBzdHlsZSwgZWRpdG9yU2l0ZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIGVkaXRvciBzdHlsZQotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgbGlua3MKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlLCBTdHJpbmcgYmFzZVBhdGgpIHsKLQkJdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoOwotCQl0aGlzLmVkaXRvclNpdGUgPSBlZGl0b3JTaXRlOwotCQlkZWJ1ZyA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQlsb2dnZXIgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCk7Ci0JCWluaXQocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0b3Igc3R5bGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQl0cnkgewotCQkJZm9ybSA9IG5ldyBWaWV3Rm9ybShwYXJlbnQsIHN0eWxlKTsKLQkJCWZvcm0ubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWZvcm0ubWFyZ2luV2lkdGggPSAwOwotCi0JCQl0b29sQmFyID0gbmV3IFJpY2hUZXh0VG9vbEJhcihmb3JtLCBTV1QuRkxBVCwgdGhpcyk7Ci0KLQkJCWNvbnRlbnQgPSBuZXcgQ29tcG9zaXRlKGZvcm0sIFNXVC5GTEFUKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCXRhYkZvbGRlciA9IGNyZWF0ZUVkaXRvclRhYkZvbGRlcihjb250ZW50LCBzdHlsZSk7Ci0KLQkJCWZvcm0uc2V0VG9wQ2VudGVyKCgoUmljaFRleHRUb29sQmFyKXRvb2xCYXIpLmdldFRvb2xiYXJNZ3IoKS5nZXRDb250cm9sKCkpOwotCQkJZm9ybS5zZXRUb3BMZWZ0KCgoUmljaFRleHRUb29sQmFyKXRvb2xCYXIpLmdldFRvb2xiYXJNZ3JDb21ibygpLmdldENvbnRyb2woKSk7Ci0JCQlmb3JtLnNldENvbnRlbnQoY29udGVudCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dnZXIubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmb3JtIGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9ybSBjb250cm9sCi0JICovCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGZvcm07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgZW1iZWRkZWQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqLwotCXB1YmxpYyBJUmljaFRleHQgZ2V0UmljaFRleHRDb250cm9sKCkgewotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGxheW91dERhdGEKLQkgKiAgICAgICAgICAgIHRoZSBsYXlvdXQgZGF0YSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXREYXRhKE9iamVjdCBsYXlvdXREYXRhKSB7Ci0JCWlmIChmb3JtICE9IG51bGwpIHsKLQkJCWZvcm0uc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxheW91dCBkYXRhLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXRvcidzIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCkgewotCQlpZiAoZm9ybSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybS5nZXRMYXlvdXREYXRhKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmb2N1cyB0byB0aGlzIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEZvY3VzKCk7Ci0JCX0KLQkJc2V0U2VsZWN0aW9uKDApOwotCQlpZiAodG9vbEJhciAhPSBudWxsICYmIHRhYkZvbGRlciAhPSBudWxsKSB7Ci0JCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZWxscyB0aGUgY29udHJvbCBpdCBkb2VzIG5vdCBoYXZlIGZvY3VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJsdXIoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRCbHVyKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBlZGl0b3IgaGFzIGZvY3VzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBlZGl0b3IgaGFzIHRoZSB1c2VyLWludGVyZmFjZSBmb2N1cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZvY3VzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0Lmhhc0ZvY3VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgdGhlIFJpY2ggVGV4dCBvciBIVE1MIHRhYi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIDxjb2RlPjA8L2NvZGU+IGZvciB0aGUgUmljaCBUZXh0IHRhYiwgPGNvZGU+MTwvY29kZT4gZm9yCi0JICogICAgICAgICAgICB0aGUgSFRNTCB0YWIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGludCBpbmRleCkgewotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24oaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzZSBwYXRoIHVzZWQgZm9yIHJlc29sdmluZyB0ZXh0IGFuZCBpbWFnZSBsaW5rcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBiYXNlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzIHNwZWNpZmllZCB3aXRoIDxocmVmPiwKLQkgKiAgICAgICAgIDxpbWc+LCBldGMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlUGF0aCgpIHsKLQkJcmV0dXJuIGJhc2VQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhc2UgVVJMIG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aG9zZSBjb250ZW50IHdhcyBsYXN0Ci0JICogY29waWVkIHRvIHRoZSBjbGlwYm9hcmQuCi0JICogCi0JICogQHJldHVybiB0aGUgYmFzZSBVUkwgb2YgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0Q29weVVSTCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRDb3B5VVJMKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYmFzZSBVUkwgb2YgdGhlIHJpY2ggdGV4dCBjb250cm9sIHdob3NlIGNvbnRlbnQgd2FzIGxhc3QgY29waWVkCi0JICogdG8gdGhlIGNsaXBib2FyZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3B5VVJMKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Q29weVVSTCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZWRpdGFibGUgc3RhdGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBjYW4gYmUgZWRpdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RWRpdGFibGUoKSB7Ci0JCXJldHVybiBlZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlZGl0YWJsZSBzdGF0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHRoZSBlZGl0YWJsZSBzdGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJdGhpcy5lZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlpZiAodG9vbEJhciAhPSBudWxsICYmIHRhYkZvbGRlciAhPSBudWxsKSB7Ci0JCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQl9Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRFZGl0YWJsZShlZGl0YWJsZSk7Ci0JCX0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlzb3VyY2VWaWV3ZXIuc2V0RWRpdGFibGUoZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gbW9kaWZpZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29udGVudCBoYXMgYmVlbiBtb2RpZmllZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldE1vZGlmaWVkKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1vZGlmaWVkIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBtb2RpZmllZAotCSAqICAgICAgICAgICAgdGhlIG1vZGlmaWVkIHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kaWZpZWQoYm9vbGVhbiBtb2RpZmllZCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0TW9kaWZpZWQobW9kaWZpZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHJldHVybiB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgZm9ybWF0dGVkIGluIFhIVE1MCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCXNldFRleHQoZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKSk7Ci0JCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCX0KLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmljaCB0ZXh0IGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSByaWNoIHRleHQgY29udGVudCBpbiBYSFRNTCBmb3JtYXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQl9Ci0JCXNvdXJjZU1vZGlmaWVkID0gZmFsc2U7Ci0JCWlmICh0YWJGb2xkZXIgIT0gbnVsbCkgewotCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCXRvb2xCYXIudXBkYXRlVG9vbEJhcihlZGl0YWJsZSk7Ci0JCQl9Ci0JCQlpZiAoZ2V0U291cmNlRWRpdCgpICE9IG51bGwpIHsKLQkJCQlyZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQljdXJyZW50RG9jLnNldCh0ZXh0KTsKLQkJCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCWN1cnJlbnREb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChjdXJyZW50RG9jICE9IG51bGwpIHsKLQkJCWN1cnJlbnREb2MucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQjY2hlY2tNb2RpZnkoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNoZWNrTW9kaWZ5KCkgewotCQlyaWNoVGV4dC5jaGVja01vZGlmeSgpOwotCQlpZiAoc291cmNlTW9kaWZpZWQpIHsKLQkJCW5vdGlmeU1vZGlmeUxpc3RlbmVycygpOwotCQl9Ci0JCWlmIChkZWJ1ZykgewotCQkJcHJpbnREZWJ1Z01lc3NhZ2UoImNoZWNrTW9kaWZ5IiwgIm1vZGlmaWVkPSIgKyBzb3VyY2VNb2RpZmllZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSByaWNoIHRleHQgY29udGVudCBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3RvcmVUZXh0KCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVzdG9yZVRleHQoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dCNnZXRTZWxlY3RlZCgpCi0JICovCi0JcHVibGljIFJpY2hUZXh0U2VsZWN0aW9uIGdldFNlbGVjdGVkKCkgewotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpIHsKLQkJCVN0cmluZyBIVE1Mc291cmNlID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmNsZWFyKCk7Ci0JCQlyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLnNldFRleHQoSFRNTHNvdXJjZS5zdWJzdHJpbmcoc2VsU3RhcnRJbmRleCwgc2VsRW5kSW5kZXggKyAxKSk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0LmdldFNlbGVjdGVkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaGFzIG5vdAotCSAqICAgICAgICAgYmVlbiBzZXQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZ2V0RGF0YShrZXkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldHMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0RGF0YShrZXksIHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZC4gVGhlIHN1cHBvcnRlZCBjb21tYW5kIHN0cmluZ3MgYXJlCi0JICogZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHJldHVybglhIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBleGVjdXRlZCBjb21tYW5kCi0JICovCi0JcHVibGljIGludCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBnaXZlbiByaWNoIHRleHQgY29tbWFuZCB3aXRoIGEgc2luZ2xlIHBhcmFtZXRlci4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtCQlhIHBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmcgcGFyYW0pIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBwYXJhbSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGdpdmVuIHJpY2ggdGV4dCBjb21tYW5kIHdpdGggYW4gYXJyYXkgb2YgcGFyYW1ldGVycy4gVGhlCi0JICogc3VwcG9ydGVkIGNvbW1hbmQgc3RyaW5ncyBhcmUgZGVmaW5lZCBpbiA8Y29kZT5SaWNoVGV4dENvbW1hbmQ8Y29kZT4uCi0JICogCi0JICogQHBhcmFtCWNvbW1hbmQJCWEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtCXBhcmFtcwkJYW4gYXJyYXkgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuCWEgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIGV4ZWN1dGVkIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgaW50IGV4ZWN1dGVDb21tYW5kKFN0cmluZyBjb21tYW5kLCBTdHJpbmdbXSBwYXJhbXMpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5leGVjdXRlQ29tbWFuZChjb21tYW5kLCBwYXJhbXMpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhpcyBlZGl0b3IuCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGNvbnRleHRNZW51ICE9IG51bGwgJiYgIWNvbnRleHRNZW51LmlzRGlzcG9zZWQoKSkgewotCQkJY29udGV4dE1lbnUuZGlzcG9zZSgpOwotCQkJY29udGV4dE1lbnUgPSBudWxsOwotCQl9Ci0JCWlmIChzb3VyY2VFZGl0RHJvcFRhcmdldCAhPSBudWxsKSB7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldC5kaXNwb3NlKCk7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldCA9IG51bGw7Ci0JCX0KLQkJaWYgKGZBY3RpdmF0aW9uQ29kZVRyaWdnZXIgIT0gbnVsbCkgewotCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bmluc3RhbGwoKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXI9IG51bGw7Ci0JCX0KLQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJZ2V0U291cmNlRWRpdCgpLnJlbW92ZUxpc3RlbmVyKFNXVC5EZWFjdGl2YXRlLAotCQkJCQlzb3VyY2VFZGl0RGVhY3RpdmF0ZUxpc3RlbmVyKTsKLQkJCWdldFNvdXJjZUVkaXQoKS5yZW1vdmVLZXlMaXN0ZW5lcihzb3VyY2VFZGl0S2V5TGlzdGVuZXIpOwotCQkJc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lciA9IG51bGw7Ci0JCQlzb3VyY2VFZGl0S2V5TGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCQotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCXNvdXJjZVZpZXdlcj0gbnVsbDsKLQkJfQotCi0JCWlmIChmQWN0aW9ucyAhPSBudWxsKSB7Ci0JCQlmQWN0aW9ucy5jbGVhcigpOwotCQkJZkFjdGlvbnM9IG51bGw7Ci0JCX0KLQkJaWYgKGZBY3RpdmF0aW9uQ29kZXMgIT0gbnVsbCkgewotCQkJZkFjdGl2YXRpb25Db2Rlcy5jbGVhcigpOwotCQkJZkFjdGl2YXRpb25Db2Rlcz0gbnVsbDsKLQkJfQotCi0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5kaXNwb3NlKCk7Ci0JCQlyaWNoVGV4dCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGNvbnRyb2wgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGNvbnRyb2wgaXMgZGlzcG9zZWQgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJldHVybiByaWNoVGV4dC5pc0Rpc3Bvc2VkKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kaWZ5IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciByZXRyaWV2aW5nIHRoZSBtb2RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE1vZGlmeUxpc3RlbmVyPiBnZXRNb2RpZnlMaXN0ZW5lcnMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5nZXRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBrZXlzIGFyZSBwcmVzc2VkIGFuZCByZWxlYXNlZCB3aXRoaW4gdGhpcyBlZGl0b3IuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5TGlzdGVuZXIoS2V5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZEtleUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4ga2V5cyBhcmUgcHJlc3NlZCBhbmQgcmVsZWFzZWQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHdoaWNoIHNob3VsZCBubyBsb25nZXIgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVLZXlMaXN0ZW5lcihLZXlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZCB3aGVuCi0JICogdGhlIGNvbnRlbnQgb2YgdGhpcyBlZGl0b3IgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGNvbnRlbnQgb2YgdGhpcyBlZGl0b3IgaXMgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5yZW1vdmVNb2RpZnlMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0ZW5lciB0byB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZCB3aGVuCi0JICogdGhpcyBlZGl0b3IgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhpcyBlZGl0b3IgaXMgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRIZWxwTGlzdGVuZXIoSGVscExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5hZGRIZWxwTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbGxlY3Rpb24gb2YgbGlzdGVuZXJzIHdobyB3aWxsIGJlIG5vdGlmaWVkCi0JICogd2hlbiBoZWxwIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGZvciB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vdGlmaWVkCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlSGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQucmVtb3ZlSGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIG9mIGxpc3RlbmVycyB3aG8gd2lsbCBiZSBub3RpZmVkIHdoZW4KLQkgKiBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSBvY2N1cnMgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB3aGljaCBzaG91bGQgYmUgbm90aWZpZWQgd2hlbiB0aGUgZXZlbnQgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMgd2hvIHdpbGwgYmUgbm90aWZlZAotCSAqIHdoZW4gYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgb2NjdXJzIHdpdGhpbiB0aGlzIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnRUeXBlCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBldmVudCB0byBsaXN0ZW4gZm9yCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgd2hpY2ggc2hvdWxkIG5vIGxvbmdlciBiZSBub3RpZmllZCB3aGVuIHRoZSBldmVudAotCSAqICAgICAgICAgICAgb2NjdXJzCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoaW50IGV2ZW50VHlwZSwgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHJldHJpZXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzCi0JICogICAgICAgICBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8UmljaFRleHRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJpY2hUZXh0LmdldExpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBtb2RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHJpY2ggdGV4dCBlZGl0b3IgY29udGVudCBoYXMKLQkgKiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeU1vZGlmeUxpc3RlbmVycygpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7Ci0JCQlldmVudC5kaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCQlldmVudC53aWRnZXQgPSByaWNoVGV4dC5nZXRDb250cm9sKCk7Ci0KLQkJCWZvciAoSXRlcmF0b3I8TW9kaWZ5TGlzdGVuZXI+IGkgPSBnZXRNb2RpZnlMaXN0ZW5lcnMoKTsgaSAhPSBudWxsICYmIGkuaGFzTmV4dCgpOykgewotCQkJCU1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyID0gaS5uZXh0KCk7Ci0JCQkJbGlzdGVuZXIubW9kaWZ5VGV4dChuZXcgTW9kaWZ5RXZlbnQoZXZlbnQpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSB0b29sIGJhciB3aXRoIGFjdGlvbiBpdGVtcy4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbEJhcgotCSAqICAgICAgICAgICAgYSB0b29sIGJhciBjb250YWluIHJpY2ggdGV4dCBhY3Rpb25zCi0JICovCi0JcHVibGljIHZvaWQgZmlsbFRvb2xCYXIoSVJpY2hUZXh0VG9vbEJhciB0b29sQmFyKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdW5kZXJseWluZyByaWNoIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdXNlZCBmb3IgcmVzb2x2aW5nIGxpbmtzCi0JICovCi0JcHJvdGVjdGVkIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLAotCQkJU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBuZXcgUmljaFRleHQocGFyZW50LCBzdHlsZSwgYmFzZVBhdGgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGVkaXRvciB0YWIgZm9sZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSBuZXcgZWRpdG9yIHRvb2xiYXIKLQkgKi8KLQlwcm90ZWN0ZWQgQ1RhYkZvbGRlciBjcmVhdGVFZGl0b3JUYWJGb2xkZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCUNUYWJGb2xkZXIgZm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuRkxBVCB8IFNXVC5CT1RUT00pOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUNvbXBvc2l0ZSByaWNoVGV4dENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZm9sZGVyLCBTV1QuRkxBVCk7Ci0JCUdyaWRMYXlvdXQgcmljaFRleHRDb21wb3NpdGVMYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCXJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJcmljaFRleHRDb21wb3NpdGUuc2V0TGF5b3V0KHJpY2hUZXh0Q29tcG9zaXRlTGF5b3V0KTsKLQkJcmljaFRleHRDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJcmljaFRleHQgPSBjcmVhdGVSaWNoVGV4dENvbnRyb2wocmljaFRleHRDb21wb3NpdGUsIHN0eWxlLCBiYXNlUGF0aCk7Ci0JCXJpY2hUZXh0LnNldERhdGEoUFJPUEVSVFlfTkFNRSwgdGhpcyk7Ci0JCXJpY2hUZXh0LmdldEZpbmRSZXBsYWNlQWN0aW9uKCkuc2V0UmljaFRleHQodGhpcyk7Ci0KLQkJcmljaFRleHRUYWIgPSBuZXcgQ1RhYkl0ZW0oZm9sZGVyLCBTV1QuRkxBVCk7Ci0JCXJpY2hUZXh0VGFiLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucmljaFRleHRUYWJfdGV4dCk7Ci0JCXJpY2hUZXh0VGFiLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0KTsKLQkJcmljaFRleHRUYWIuc2V0Q29udHJvbChyaWNoVGV4dENvbXBvc2l0ZSk7Ci0KLQkJQ29tcG9zaXRlIGh0bWxDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGZvbGRlciwgU1dULkZMQVQpOwotCQlodG1sQ29tcG9zaXRlLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQotCQlzb3VyY2VWaWV3ZXIgPSBuZXcgVGV4dFZpZXdlcihodG1sQ29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5NVUxUSQotCQkJCXwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwpOwotCQlzb3VyY2VWaWV3ZXIuc2V0VW5kb01hbmFnZXIodW5kb01hbmFnZXIpOwotCQlzZXREb2N1bWVudChudWxsKTsKLQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCWdldFNvdXJjZUVkaXQoKS5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgc291cmNlRWRpdERlYWN0aXZhdGVMaXN0ZW5lcik7Ci0JCWdldFNvdXJjZUVkaXQoKS5hZGRLZXlMaXN0ZW5lcihzb3VyY2VFZGl0S2V5TGlzdGVuZXIpOwotCQljb250ZXh0TWVudSA9IG5ldyBNZW51KHBhcmVudC5nZXRTaGVsbCgpLCBTV1QuUE9QX1VQKTsKLQkJZ2V0U291cmNlRWRpdCgpLnNldE1lbnUoY29udGV4dE1lbnUpOwotCQkvLyBGSVhNRSEgVGhpcyBvcGVucyB1cCBhIGNhbiBvZiB3b3JtcywgZXNwZWNpYWxseSB3aXRoIERCQ1MgY2hhcmFjdGVycy4KLQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzk0MzIuIAotCQkvL2FkZERyb3BTdXBwb3J0VG9TdHlsZWRUZXh0KCk7Ci0JCWZpbGxDb250ZXh0TWVudShjb250ZXh0TWVudSk7Ci0JCQotCQkKLQkJaHRtbFRhYiA9IG5ldyBDVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLQkJaHRtbFRhYi5zZXRUZXh0KEhUTUxfVEFCX05BTUUpOwotCQlodG1sVGFiLnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmh0bWxUYWJfdG9vbFRpcFRleHQpOyAKLQkJaHRtbFRhYi5zZXRDb250cm9sKGh0bWxDb21wb3NpdGUpOwotCi0JCWZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ1RhYkl0ZW0gaXRlbSA9IChDVGFiSXRlbSkgZXZlbnQuaXRlbTsKLQkJCQlpZiAoaXRlbS5nZXRUZXh0KCkuZXF1YWxzKEhUTUxfVEFCX05BTUUpKSB7Ci0JCQkJCXJlbW92ZU1vZGlmeUxpc3RlbmVycygpOwotCQkJCQljdXJyZW50RG9jLnNldChnZXRUZXh0KCkpOwotCQkJCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQkJCQlhZGRNb2RpZnlMaXN0ZW5lcnMoKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXVwZGF0ZVJpY2hUZXh0KGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCkpOwotCQkJCQlzZXRNb2RpZmllZCh0cnVlKTsKLQkJCQkJaWYgKHRvb2xCYXIgIT0gbnVsbCkgewotCQkJCQkJdG9vbEJhci51cGRhdGVUb29sQmFyKGVkaXRhYmxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZpbGxUb29sQmFyKHRvb2xCYXIpOwotCQkKLQkJaW5pdGlhbGl6ZUFjdGl2YXRpb25Db2RlVHJpZ2dlcigpOwotCQljcmVhdGVBY3Rpb25zKCk7Ci0JCQotCQlmb2xkZXIuc2V0U2VsZWN0aW9uKDApOwotCi0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLQkJfQotCQkvLyBjbGVhbiB1cCBvbGQgZG9jCi0JCXVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJSURvY3VtZW50IG9sZERvYyA9IHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAob2xkRG9jICE9IG51bGwpIHsKLQkJCW9sZERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHNvdXJjZUVkaXREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGhvb2sgdXAgbmV3IGRvYwotCQljdXJyZW50RG9jID0gZG9jOwotCQlzb3VyY2VWaWV3ZXIuc2V0RG9jdW1lbnQoY3VycmVudERvYyk7Ci0JCWN1cnJlbnREb2MuYWRkRG9jdW1lbnRMaXN0ZW5lcihzb3VyY2VFZGl0RG9jdW1lbnRMaXN0ZW5lcik7Ci0JCXVuZG9NYW5hZ2VyLmNvbm5lY3Qoc291cmNlVmlld2VyKTsKLQkJaWYgKHVuZG9BY3Rpb24gIT0gbnVsbCkgewotCQkJdW5kb0FjdGlvbi5zZXRDb250ZXh0KGdldFVuZG9Db250ZXh0KCkpOwotCQl9Ci0JCWlmIChyZWRvQWN0aW9uICE9IG51bGwpIHsKLQkJCXJlZG9BY3Rpb24uc2V0Q29udGV4dChnZXRVbmRvQ29udGV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBIVE1MIHNvdXJjZSBlZGl0IGNvbnRyb2wuCi0JICogCi0JICogQHJldHVybiBhIDxjb2RlPlN0eWxlVGV4dDwvY29kZT4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0IGdldFNvdXJjZUVkaXQoKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0cyB0ZXh0IGF0IHRoZSBzZWxlY3Rpb24gKG92ZXJ3cml0aW5nIHRoZSBzZWxlY3Rpb24pLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEhUTUwoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpID09IDApIAotCQkJcmV0dXJuOwotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IHJpY2hUZXh0VGFiKSB7Ci0JCQlleGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsIHRleHQpOwotCQl9IGVsc2UgaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb24oKSA9PSBodG1sVGFiKSB7Ci0JCQlTdHJpbmcgb2xkSFRNTCA9IGdldFNvdXJjZUVkaXQoKS5nZXRUZXh0KCk7Ci0JCQlQb2ludCBzZWwgPSBzb3VyY2VWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpOwotCQkJaW50IHNlbFN0YXJ0SW5kZXggPSBzZWwueDsKLQkJCWludCBzZWxFbmRJbmRleCA9IHNlbC54ICsgc2VsLnkgLSAxOwotCQkJU3RyaW5nIG5ld0hUTUwgPSBvbGRIVE1MLnN1YnN0cmluZygwLCBzZWxTdGFydEluZGV4KSArIHRleHQKLQkJCQkJKyBvbGRIVE1MLnN1YnN0cmluZyhzZWxFbmRJbmRleCArIDEpOwotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQljdXJyZW50RG9jLnNldChuZXdIVE1MKTsKLQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJdXBkYXRlUmljaFRleHQobmV3SFRNTCk7Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBJbnNlcnRzIGFuIGltYWdlIGF0IHRoZSBzZWxlY3Rpb24gKG92ZXJ3cml0aW5nIHRoZSBzZWxlY3Rpb24pLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEltYWdlKFN0cmluZyBpbWFnZVVSTCwgU3RyaW5nIGhlaWdodCwgU3RyaW5nIHdpZHRoLCBTdHJpbmcgYWx0VGFnKSB7Ci0JCWlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gcmljaFRleHRUYWIpIHsKLQkJCWV4ZWN1dGVDb21tYW5kKAotCQkJCQlSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCWltYWdlVVJMLAotCQkJCQkJCWhlaWdodCwgd2lkdGgsIGFsdFRhZyB9KTsKLQkJfSBlbHNlIGlmICh0YWJGb2xkZXIuZ2V0U2VsZWN0aW9uKCkgPT0gaHRtbFRhYikgewotCQkJU3RyaW5nQnVmZmVyIGltYWdlTGluayA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCS8vIG9yZGVyIG9mIHRoZXNlIGF0dHJpYnV0ZXMgaXMgdGhlIHNhbWUgYXMgSlRpZHknZWQgSFRNTAotCQkJaW1hZ2VMaW5rLmFwcGVuZCgiPGltZyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaGVpZ2h0Lmxlbmd0aCgpID4gMCkgewotCQkJCWltYWdlTGluay5hcHBlbmQoIiBoZWlnaHQ9XCIiICsgaGVpZ2h0ICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaWYgKGFsdFRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlpbWFnZUxpbmsuYXBwZW5kKCIgYWx0PVwiIiArIGFsdFRhZyArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWltYWdlTGluay5hcHBlbmQoIiBzcmM9XCIiICsgaW1hZ2VVUkwgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAod2lkdGgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIHdpZHRoPVwiIiArIHdpZHRoICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJaW1hZ2VMaW5rLmFwcGVuZCgiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBvbGRIVE1MID0gZ2V0U291cmNlRWRpdCgpLmdldFRleHQoKTsKLQkJCVBvaW50IHNlbCA9IHNvdXJjZVZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpbnQgc2VsU3RhcnRJbmRleCA9IHNlbC54OwotCQkJaW50IHNlbEVuZEluZGV4ID0gc2VsLnggKyBzZWwueSAtIDE7Ci0JCQlTdHJpbmcgbmV3SFRNTCA9IG9sZEhUTUwuc3Vic3RyaW5nKDAsIHNlbFN0YXJ0SW5kZXgpICsgaW1hZ2VMaW5rLnRvU3RyaW5nKCkKLQkJCQkJKyBvbGRIVE1MLnN1YnN0cmluZyhzZWxFbmRJbmRleCArIDEpOwotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQljdXJyZW50RG9jLnNldChuZXdIVE1MKTsKLQkJCWFkZE1vZGlmeUxpc3RlbmVycygpOwotCQkJdXBkYXRlUmljaFRleHQobmV3SFRNTCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgSFRNTCB0YWIgaXMgc2VsZWN0ZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgSFRNTCB0YWIgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNIVE1MVGFiU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbigpID09IGh0bWxUYWIpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBjb250ZXh0IG1lbnUgd2l0aCBtZW51IGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0TWVudQotCSAqICAgICAgICAgICAgYSBjb250ZXh0IG1lbnUgY29udGFpbmluZyByaWNoIHRleHQgYWN0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZXh0TWVudShNZW51IGNvbnRleHRNZW51KSB7Ci0JCWZpbmFsIE1lbnVJdGVtIGN1dEl0ZW0gPSBuZXcgTWVudUl0ZW0oY29udGV4dE1lbnUsIFNXVC5QVVNIKTsKLQkJY3V0SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmN1dEFjdGlvbl90ZXh0KTsKLQkJY3V0SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ3V0QWN0aW9uIGFjdGlvbiA9IG5ldyBDdXRBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCQlmaW5hbCBNZW51SXRlbSBjb3B5SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQljb3B5SXRlbS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNvcHlBY3Rpb25fdGV4dCk7IAotCQljb3B5SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29weUFjdGlvbiBhY3Rpb24gPSBuZXcgQ29weUFjdGlvbihSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCQlhY3Rpb24uZXhlY3V0ZShSaWNoVGV4dEVkaXRvci50aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlSXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZUl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZUFjdGlvbl90ZXh0KTsgCi0JCXBhc3RlSXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUGFzdGVBY3Rpb24gYWN0aW9uID0gbmV3IFBhc3RlQWN0aW9uKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJCWFjdGlvbi5leGVjdXRlKFJpY2hUZXh0RWRpdG9yLnRoaXMpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZpbmFsIE1lbnVJdGVtIHBhc3RlUGxhaW5UZXh0SXRlbSA9IG5ldyBNZW51SXRlbShjb250ZXh0TWVudSwgU1dULlBVU0gpOwotCQlwYXN0ZVBsYWluVGV4dEl0ZW0uc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5wYXN0ZVBsYWluVGV4dEFjdGlvbl90ZXh0KTsKLQkJcGFzdGVQbGFpblRleHRJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlQYXN0ZVBsYWluVGV4dEFjdGlvbiBhY3Rpb24gPSBuZXcgUGFzdGVQbGFpblRleHRBY3Rpb24oUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQkJYWN0aW9uLmV4ZWN1dGUoUmljaFRleHRFZGl0b3IudGhpcyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTWVudUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbWVudUhpZGRlbihNZW51RXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gZ2V0U2VsZWN0ZWQoKS5nZXRUZXh0KCk7Ci0JCQkJYm9vbGVhbiBzZWxlY3Rpb24gPSBzZWxlY3RlZFRleHQubGVuZ3RoKCkgPiAwOwotCQkJCWN1dEl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSAmJiBzZWxlY3Rpb24pOwotCQkJCWNvcHlJdGVtLnNldEVuYWJsZWQoc2VsZWN0aW9uKTsKLQkJCQlwYXN0ZUl0ZW0uc2V0RW5hYmxlZChlZGl0YWJsZSk7Ci0JCQkJcGFzdGVQbGFpblRleHRJdGVtLnNldEVuYWJsZWQoZWRpdGFibGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb250ZW50IG9mIHRoZSByaWNoIHRleHQgY29udHJvbCB3aXRob3V0IHVwZGF0aW5nIHRoZSBIVE1MCi0JICogc291cmNlIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSBIVE1MIHNvdXJjZSBlZGl0b3IgdG8gc3luYyB1cCBpdHMKLQkgKiBjb250ZW50IHdpdGggdGhlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgcmljaCB0ZXh0IGNvbnRlbnQgaW4gWEhUTUwgZm9ybWF0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJpY2hUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRUZXh0KHRleHQpOwotCQkJcmljaFRleHQuY2hlY2tNb2RpZnkoKTsKLQkJfQotCQlzb3VyY2VNb2RpZmllZCA9IGZhbHNlOwotCQlpZiAodGFiRm9sZGVyICE9IG51bGwpIHsKLQkJCWlmICh0b29sQmFyICE9IG51bGwpIHsKLQkJCQl0b29sQmFyLnVwZGF0ZVRvb2xCYXIoZWRpdGFibGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGREcm9wU3VwcG9ydFRvU3R5bGVkVGV4dCgpIHsKLQkJLy8gdGhpcyBmdW5jdGlvbiBiYXNlZCBoZWF2aWx5IG9uIHRoZSBleGFtcGxlIGF0OgotCQkvLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2FydGljbGVzL0FydGljbGUtU1dULURORC9ETkQtaW4tU1dULmh0bWwKLQkJCi0JCSAJLy8gQWxsb3cgZGF0YSB0byBiZSBjb3BpZWQgdG8gdGhlIGRyb3AgdGFyZ2V0Ci0JCQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX01PVkUgfCAgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0RFRkFVTFQ7Ci0JCQlzb3VyY2VFZGl0RHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KGdldFNvdXJjZUVkaXQoKSwgb3BlcmF0aW9ucyk7Ci0JCSAKLQkJCS8vIFJlY2VpdmUgZGF0YSBpbiBUZXh0IG9yIEhUTUwgZm9ybWF0Ci0JCQlmaW5hbCBUZXh0VHJhbnNmZXIgdGV4dFRyYW5zZmVyID0gVGV4dFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlmaW5hbCBIVE1MVHJhbnNmZXIgaHRtbFRyYW5zZmVyID0gSFRNTFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQlUcmFuc2ZlcltdIHR5cGVzID0gbmV3IFRyYW5zZmVyW10ge2h0bWxUcmFuc2ZlciwgdGV4dFRyYW5zZmVyfTsKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LnNldFRyYW5zZmVyKHR5cGVzKTsKLQkJCSAKLQkJCXNvdXJjZUVkaXREcm9wVGFyZ2V0LmFkZERyb3BMaXN0ZW5lcihuZXcgRHJvcFRhcmdldExpc3RlbmVyKCkgewotCQkJICBwdWJsaWMgdm9pZCBkcmFnRW50ZXIoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkgICAgIGlmIChldmVudC5kZXRhaWwgPT0gRE5ELkRST1BfREVGQVVMVCkgewotCQkJICAgICAgICAgaWYgKChldmVudC5vcGVyYXRpb25zICYgRE5ELkRST1BfQ09QWSkgIT0gMCkgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX0NPUFk7Ci0JCQkgICAgICAgICB9IGVsc2UgewotCQkJICAgICAgICAgICAgIGV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkgICAgICAgICB9Ci0JCQkgICAgIH0KLQkJCSAgICAgaWYgKCFnZXRFZGl0YWJsZSgpKSB7Ci0JCSAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICB9Ci0JCQkgICAgIC8vIHdpbGwgYWNjZXB0IHRleHQgYnV0IHByZWZlciB0byBoYXZlIEhUTUwgZHJvcHBlZAotCQkJICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmRhdGFUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJICAgICAgICAgaWYgKGh0bWxUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuZGF0YVR5cGVzW2ldKSl7Ci0JCQkgICAgICAgICAgICAgZXZlbnQuY3VycmVudERhdGFUeXBlID0gZXZlbnQuZGF0YVR5cGVzW2ldOwotCQkJICAgICAgICAgICAgIGJyZWFrOwotCQkJICAgICAgICAgfQotCQkJICAgICB9Ci0JCQkgICB9Ci0JCQkgICBwdWJsaWMgdm9pZCBkcmFnT3ZlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgZXZlbnQuZmVlZGJhY2sgPSBETkQuRkVFREJBQ0tfU0VMRUNUIHwgRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUiB8IERORC5GRUVEQkFDS19TQ1JPTEw7Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdPcGVyYXRpb25DaGFuZ2VkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJICAgICAgICBpZiAoZXZlbnQuZGV0YWlsID09IERORC5EUk9QX0RFRkFVTFQpIHsKLQkJCSAgICAgICAgICAgIGlmICgoZXZlbnQub3BlcmF0aW9ucyAmIERORC5EUk9QX0NPUFkpICE9IDApIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCQkJICAgICAgICAgICAgfSBlbHNlIHsKLQkJCSAgICAgICAgICAgICAgICBldmVudC5kZXRhaWwgPSBETkQuRFJPUF9OT05FOwotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICB9Ci0JCQkgICAgfQotCQkJICAgIHB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICB9Ci0JCQkgICAgcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCSAgICAgICAgaWYgKHRleHRUcmFuc2Zlci5pc1N1cHBvcnRlZFR5cGUoZXZlbnQuY3VycmVudERhdGFUeXBlKSB8fCAKLQkJCSAgICAgICAgCQlodG1sVHJhbnNmZXIuaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmN1cnJlbnREYXRhVHlwZSkpIHsKLQkJCSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gKFN0cmluZylldmVudC5kYXRhOwotCQkJICAgICAgICAgICAgYWRkSFRNTCh0ZXh0KTsKLQkJCSAgICAgICAgfQotCQkJICAgIH0KLQkJCX0pOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwbGF5cyB0aGUgZ2l2ZW4gZGVidWcgbWVzc2FnZSB0byB0aGUgY29uc29sZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnREZWJ1Z01lc3NhZ2UoU3RyaW5nIG1ldGhvZCwgU3RyaW5nIG1zZywgU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3RyQnVmLmFwcGVuZCgiUmljaFRleHRFZGl0b3JbIikuYXBwZW5kKHJpY2hUZXh0LmdldENvbnRyb2woKS5oYW5kbGUpLmFwcGVuZCgnXScpIC8vJE5PTi1OTFMtMSQKLQkJCQkuYXBwZW5kKCcuJykuYXBwZW5kKG1ldGhvZCk7Ci0JCWlmIChtc2cgIT0gbnVsbCAmJiBtc2cubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzdHJCdWYuYXBwZW5kKCI6ICIpLmFwcGVuZChtc2cpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpID4gMCkgewotCQkJc3RyQnVmLmFwcGVuZCgnXG4nKS5hcHBlbmQodGV4dCk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKHN0ckJ1Zik7Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIGdpdmVuIGRlYnVnIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50RGVidWdNZXNzYWdlKFN0cmluZyBtZXRob2QsIFN0cmluZyBtc2cpIHsKLQkJcHJpbnREZWJ1Z01lc3NhZ2UobWV0aG9kLCBtc2csIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgRmluZFJlcGxhY2VBY3Rpb24gZ2V0RmluZFJlcGxhY2VBY3Rpb24oKSB7Ci0JCXJldHVybiByaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbmRSZXBsYWNlQWN0aW9uKEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGaW5kUmVwbGFjZUFjdGlvbihmaW5kUmVwbGFjZUFjdGlvbik7Ci0JCQlyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpLnNldFJpY2hUZXh0KHRoaXMpOwotCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LnNldEluaXRpYWxUZXh0KHRleHQpOwotCQl9Ci0JCWlmIChnZXRTb3VyY2VFZGl0KCkgIT0gbnVsbCkgewotCQkJcmVtb3ZlTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCQlzZXREb2N1bWVudChuZXcgRG9jdW1lbnQodGV4dCkpOwotCQkJYWRkTW9kaWZ5TGlzdGVuZXJzKCk7Ci0JCX0KLQotCX0KLQkKLQkKLQkvKioKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2dldFVuZG9Db250ZXh0KCkKLQkgKiBSZXR1cm5zIHRoaXMgZWRpdG9yJ3Mgdmlld2VyJ3MgdW5kbyBtYW5hZ2VyIHVuZG8gY29udGV4dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHVuZG8gY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXZhaWxhYmxlCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgSVVuZG9Db250ZXh0IGdldFVuZG9Db250ZXh0KCkgewotCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb242KSB7Ci0JCQlJVW5kb01hbmFnZXIgdW5kb01hbmFnZXI9ICgoSVRleHRWaWV3ZXJFeHRlbnNpb242KXNvdXJjZVZpZXdlcikuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCWlmICh1bmRvTWFuYWdlciBpbnN0YW5jZW9mIElVbmRvTWFuYWdlckV4dGVuc2lvbikKLQkJCQlyZXR1cm4gKChJVW5kb01hbmFnZXJFeHRlbnNpb24pdW5kb01hbmFnZXIpLmdldFVuZG9Db250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCWNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpOwotCQkvLyBzZWxlY3QgYWxsCi0JCUFjdGlvbiBzZWxlY3RBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZ2V0U291cmNlRWRpdCgpLnNlbGVjdEFsbCgpOwotCQkJfQotCQl9OwotCQlzZWxlY3RBbGxBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlNFTEVDVF9BTEwpOwotCQlyZWdpc3RlckFjdGlvbihBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwgc2VsZWN0QWxsQWN0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIGZyb20gb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjY3JlYXRlVW5kb1JlZG9BY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVVbmRvUmVkb0FjdGlvbnMoKSB7Ci0JCUlVbmRvQ29udGV4dCB1bmRvQ29udGV4dD0gZ2V0VW5kb0NvbnRleHQoKTsKLQkJaWYgKHVuZG9Db250ZXh0ICE9IG51bGwpIHsKLQkJCS8vIFVzZSBhY3Rpb25zIHByb3ZpZGVkIGJ5IGdsb2JhbCB1bmRvL3JlZG8KLQkJCQotCQkJLy8gQ3JlYXRlIHRoZSB1bmRvIGFjdGlvbgotCQkJdW5kb0FjdGlvbj0gbmV3IFVuZG9BY3Rpb25IYW5kbGVyKGdldEVkaXRvclNpdGUoKSwgdW5kb0NvbnRleHQpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh1bmRvQWN0aW9uLCBJQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuVU5ET19BQ1RJT04pOwotCQkJdW5kb0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuVU5ETyk7Ci0JCQlyZWdpc3RlckFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPLCB1bmRvQWN0aW9uKTsKLQotCQkJLy8gQ3JlYXRlIHRoZSByZWRvIGFjdGlvbi4KLQkJCXJlZG9BY3Rpb249IG5ldyBSZWRvQWN0aW9uSGFuZGxlcihnZXRFZGl0b3JTaXRlKCksIHVuZG9Db250ZXh0KTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVkb0FjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLlJFRE9fQUNUSU9OKTsKLQkJCXJlZG9BY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLlJFRE8pOwotCQkJcmVnaXN0ZXJBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgcmVkb0FjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yU2l0ZSBnZXRFZGl0b3JTaXRlKCkgewotCQlyZXR1cm4gZWRpdG9yU2l0ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgZ2l2ZW4gdW5kby9yZWRvIGFjdGlvbiB1bmRlciB0aGUgZ2l2ZW4gSUQgYW5kCi0JICogZW5zdXJlcyB0aGF0IHByZXZpb3VzbHkgaW5zdGFsbGVkIGFjdGlvbnMgZ2V0IGRpc3Bvc2VkLiBJdAotCSAqIGFsc28gdGFrZXMgY2FyZSBvZiByZS1yZWdpc3RlcmluZyB0aGUgbmV3IGFjdGlvbiB3aXRoIHRoZQotCSAqIGdsb2JhbCBhY3Rpb24gaGFuZGxlci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uSWQJdGhlIGFjdGlvbiBpZCB1bmRlciB3aGljaCB0byByZWdpc3RlciB0aGUgYWN0aW9uCi0JICogQHBhcmFtIGFjdGlvbgl0aGUgYWN0aW9uIHRvIHJlZ2lzdGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgdm9pZCByZWdpc3RlckFjdGlvbihTdHJpbmcgYWN0aW9uSWQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlBY3Rpb24gb2xkQWN0aW9uPSBnZXRBY3Rpb24oYWN0aW9uSWQpOwotCQlpZiAob2xkQWN0aW9uIGluc3RhbmNlb2YgT3BlcmF0aW9uSGlzdG9yeUFjdGlvbkhhbmRsZXIpCi0JCQkoKE9wZXJhdGlvbkhpc3RvcnlBY3Rpb25IYW5kbGVyKW9sZEFjdGlvbikuZGlzcG9zZSgpOwotCi0JCXNldEFjdGlvbihhY3Rpb25JZCwgYWN0aW9uKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGFjdGlvbkJhcnM9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpCi0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoYWN0aW9uSWQsIGFjdGlvbik7Ci0JfQotCi0JCi0JLyoKLQkgKiBAc2VlIElUZXh0RWRpdG9yI2dldEFjdGlvbihTdHJpbmcpCi0JICovCi0JcHVibGljIElBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JRCkgewotCQlhc3NlcnQgYWN0aW9uSUQgIT0gbnVsbDsKLQkJSUFjdGlvbiBhY3Rpb249IChJQWN0aW9uKSBmQWN0aW9ucy5nZXQoYWN0aW9uSUQpOwotCi0vLwkJaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0vLwkJCWFjdGlvbj0gZmluZENvbnRyaWJ1dGVkQWN0aW9uKGFjdGlvbklEKTsKLS8vCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotLy8JCQkJc2V0QWN0aW9uKGFjdGlvbklELCBhY3Rpb24pOwotLy8JCX0KLQotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBJVGV4dEVkaXRvciNzZXRBY3Rpb24oU3RyaW5nLCBJQWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uSUQsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCWFzc2VydCBhY3Rpb25JRCAhPSBudWxsOwotCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCWFjdGlvbj0gKElBY3Rpb24pIGZBY3Rpb25zLnJlbW92ZShhY3Rpb25JRCk7Ci0JCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci51bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oYWN0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCWZBY3Rpb25zLnB1dChhY3Rpb25JRCwgYWN0aW9uKTsKLQkJCWZBY3RpdmF0aW9uQ29kZVRyaWdnZXIucmVnaXN0ZXJBY3Rpb25Gb3JLZXlBY3RpdmF0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGl2YXRpb24gY29kZSB0cmlnZ2VyLgotCSAqCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKCkgewotCQlmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyLmluc3RhbGwoKTsKLQkJZkFjdGl2YXRpb25Db2RlVHJpZ2dlci5zZXRTY29wZXMoZktleUJpbmRpbmdTY29wZXMpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIGtleSB2ZXJpZnkgbGlzdGVuZXIgZm9yIHRyaWdnZXJpbmcgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0JY2xhc3MgQWN0aXZhdGlvbkNvZGVUcmlnZ2VyIGltcGxlbWVudHMgVmVyaWZ5S2V5TGlzdGVuZXIgewotCi0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIHRyaWdnZXIgaGFzIGJlZW4gaW5zdGFsbGVkLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSW5zdGFsbGVkPSBmYWxzZTsKLQkJLyoqCi0JCSAqIFRoZSBrZXkgYmluZGluZyBzZXJ2aWNlIHRvIHVzZS4KLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHJpdmF0ZSBJS2V5QmluZGluZ1NlcnZpY2UgZktleUJpbmRpbmdTZXJ2aWNlOwotCQkKLQkJLyoKLQkJICogQHNlZSBWZXJpZnlLZXlMaXN0ZW5lciN2ZXJpZnlLZXkob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHZlcmlmeUtleShWZXJpZnlFdmVudCBldmVudCkgewotCi0JCQlBY3Rpb25BY3RpdmF0aW9uQ29kZSBjb2RlPSBudWxsOwotCQkJaW50IHNpemU9IGZBY3RpdmF0aW9uQ29kZXMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCWNvZGU9IChBY3Rpb25BY3RpdmF0aW9uQ29kZSkgZkFjdGl2YXRpb25Db2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKGNvZGUubWF0Y2hlcyhldmVudCkpIHsKLQkJCQkJSUFjdGlvbiBhY3Rpb249IGdldEFjdGlvbihjb2RlLmZBY3Rpb25JZCk7Ci0JCQkJCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCi0JCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkKLQkJCQkJCQkoKElVcGRhdGUpIGFjdGlvbikudXBkYXRlKCk7Ci0KLQkJCQkJCWlmICghYWN0aW9uLmlzRW5hYmxlZCgpICYmIGFjdGlvbiBpbnN0YW5jZW9mIElSZWFkT25seURlcGVuZGVudCkgewotCQkJCQkJCUlSZWFkT25seURlcGVuZGVudCBkZXBlbmRlbnQ9IChJUmVhZE9ubHlEZXBlbmRlbnQpIGFjdGlvbjsKLQkJCQkJCQlib29sZWFuIHdyaXRhYmxlPSBkZXBlbmRlbnQuaXNFbmFibGVkKHRydWUpOwotCQkJCQkJCWlmICh3cml0YWJsZSkgewotCQkJCQkJCQlldmVudC5kb2l0PSBmYWxzZTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCQkJZXZlbnQuZG9pdD0gZmFsc2U7Ci0JCQkJCQkJYWN0aW9uLnJ1bigpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBJbnN0YWxscyB0aGlzIHRyaWdnZXIgb24gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKCkgewotCQkJaWYgKCFmSXNJbnN0YWxsZWQpIHsKLQotCQkJCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbikgewotCQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbiBlPSAoSVRleHRWaWV3ZXJFeHRlbnNpb24pIHNvdXJjZVZpZXdlcjsKLQkJCQkJZS5wcmVwZW5kVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3R5bGVkVGV4dCB0ZXh0PSBzb3VyY2VWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQkJCQl0ZXh0LmFkZFZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJCX0KLQotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gZ2V0RWRpdG9yU2l0ZSgpLmdldEtleUJpbmRpbmdTZXJ2aWNlKCk7Ci0JCQkJZklzSW5zdGFsbGVkPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFVuaW5zdGFsbHMgdGhpcyB0cmlnZ2VyIGZyb20gdGhlIGVkaXRvcidzIHRleHQgd2lkZ2V0LgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCQlpZiAoZklzSW5zdGFsbGVkKSB7Ci0KLQkJCQlpZiAoc291cmNlVmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24pIHsKLQkJCQkJSVRleHRWaWV3ZXJFeHRlbnNpb24gZT0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uKSBzb3VyY2VWaWV3ZXI7Ci0JCQkJCWUucmVtb3ZlVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQkJfSBlbHNlIGlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCQlTdHlsZWRUZXh0IHRleHQ9IHNvdXJjZVZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJCQkJdGV4dC5yZW1vdmVWZXJpZnlLZXlMaXN0ZW5lcihmQWN0aXZhdGlvbkNvZGVUcmlnZ2VyKTsKLQkJCQl9Ci0KLQkJCQlmSXNJbnN0YWxsZWQ9IGZhbHNlOwotCQkJCWZLZXlCaW5kaW5nU2VydmljZT0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGFjdGlvbiBmb3Iga2V5IGFjdGl2YXRpb24uCi0JCSAqIEBwYXJhbSBhY3Rpb24gdGhlIGFjdGlvbiB0byBiZSByZWdpc3RlcmVkCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQWN0aW9uRm9yS2V5QWN0aXZhdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQkJaWYgKGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBnaXZlbiBhY3Rpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3Iga2V5IGFjdGl2YXRpb24KLQkJICogQHBhcmFtIGFjdGlvbiB0aGUgYWN0aW9uIHRvIGJlIHVucmVnaXN0ZXJlZAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyQWN0aW9uRnJvbUtleUFjdGl2YXRpb24oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCWlmIChhY3Rpb24uZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkgIT0gbnVsbCkKLQkJCQlmS2V5QmluZGluZ1NlcnZpY2UudW5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIGtleSBiaW5kaW5nIHNjb3BlcyBmb3IgdGhpcyBlZGl0b3IuCi0JCSAqIEBwYXJhbSBrZXlCaW5kaW5nU2NvcGVzIHRoZSBrZXkgYmluZGluZyBzY29wZXMKLQkJICogQHNpbmNlIDIuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2NvcGVzKFN0cmluZ1tdIGtleUJpbmRpbmdTY29wZXMpIHsKLQkJCWlmIChrZXlCaW5kaW5nU2NvcGVzICE9IG51bGwgJiYga2V5QmluZGluZ1Njb3Blcy5sZW5ndGggPiAwKQotCQkJCWZLZXlCaW5kaW5nU2VydmljZS5zZXRTY29wZXMoa2V5QmluZGluZ1Njb3Blcyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmVwcmVzZW50YXRpb24gb2YgYWN0aW9uIGFjdGl2YXRpb24gY29kZXMuCi0JICovCi0Jc3RhdGljIGNsYXNzIEFjdGlvbkFjdGl2YXRpb25Db2RlIHsKLQotCQkvKiogVGhlIGFjdGlvbiBpZC4gKi8KLQkJcHVibGljIFN0cmluZyBmQWN0aW9uSWQ7Ci0JCS8qKiBUaGUgY2hhcmFjdGVyLiAqLwotCQlwdWJsaWMgY2hhciBmQ2hhcmFjdGVyOwotCQkvKiogVGhlIGtleSBjb2RlLiAqLwotCQlwdWJsaWMgaW50IGZLZXlDb2RlPSAtMTsKLQkJLyoqIFRoZSBzdGF0ZSBtYXNrLiAqLwotCQlwdWJsaWMgaW50IGZTdGF0ZU1hc2s9IFNXVC5ERUZBVUxUOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IGFjdGlvbiBhY3RpdmF0aW9uIGNvZGUgZm9yIHRoZSBnaXZlbiBhY3Rpb24gaWQuCi0JCSAqIEBwYXJhbSBhY3Rpb25JZCB0aGUgYWN0aW9uIGlkCi0JCSAqLwotCQlwdWJsaWMgQWN0aW9uQWN0aXZhdGlvbkNvZGUoU3RyaW5nIGFjdGlvbklkKSB7Ci0JCQlmQWN0aW9uSWQ9IGFjdGlvbklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3RpdmF0aW9uIGNvZGUgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmVyaWZ5IGV2ZW50LgotCQkgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHRlc3QgZm9yIG1hdGNoaW5nCi0JCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGFjdGl2YXRpb24gY29kZSBtYXRjaGVzIDxjb2RlPmV2ZW50PC9jb2RlPgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhWZXJpZnlFdmVudCBldmVudCkgewotCQkJcmV0dXJuIChldmVudC5jaGFyYWN0ZXIgPT0gZkNoYXJhY3RlciAmJgotCQkJCQkJKGZLZXlDb2RlID09IC0xIHx8IGV2ZW50LmtleUNvZGUgPT0gZktleUNvZGUpICYmCi0JCQkJCQkoZlN0YXRlTWFzayA9PSBTV1QuREVGQVVMVCB8fCBldmVudC5zdGF0ZU1hc2sgPT0gZlN0YXRlTWFzaykpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEVkaXRvckZvcm0uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODUxYTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0RWRpdG9yRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WaWV3Rm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSBmb3IgbGF5aW5nIG91dCB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yIGluIGFuIEVjbGlwc2UgZm9ybS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dEVkaXRvckZvcm0gZXh0ZW5kcyBWaWV3Rm9ybSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgdGhlIHN0eWxlIGZvciB0aGlzIGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRFZGl0b3JGb3JtKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzI2dldERhdGEoU3RyaW5nIGtleSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldERhdGEoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIpKSB7Ci0JCQkvLyBSZXR1cm4gYSB0ZXh0IGJvcmRlciB0byBnZXQgdGhlIEZvcm1Ub29sa2l0J3MgQm9yZGVyUGFpbnRlciB0bwotCQkJLy8gcGFpbnQgYSBib3JkZXIgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotCQkJcmV0dXJuIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREYXRhKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dEZvcm1Ub29sa2l0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGYwMDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRGb3JtVG9vbGtpdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7Ci0KLS8qKgotICogQSBoZWxwZXIgdG9vbGtpdCBmb3IgY3JlYXRpbmcgYSByaWNoIHRleHQgY29udHJvbCBhbmQgZWRpdG9yIHRoYXQgY2FuIGJlCi0gKiBhZGRlZCB0byBhbiBFY2xpcHNlIGZvcm0uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRGb3JtVG9vbGtpdCB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dCBjcmVhdGVSaWNoVGV4dChGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlJUmljaFRleHQgcmljaFRleHQgPSBuZXcgUmljaFRleHQocGFyZW50LCB0b29sa2l0LmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpKTsKLQkJcmljaFRleHQuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0VGV4dCh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJpY2ggdGV4dCBlZGl0b3IgYW5kIGFkYXB0cyBpdCB0byBiZSB1c2VkIGluIGEgZm9ybS4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbGtpdAotCSAqICAgICAgICAgICAgdGhlIGZvcm0gdG9vbGtpdAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCB0ZXh0IGZvciB0aGUgdmlld2VyCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICB0aGUgaW5pdGlhbCBzdHlsZSBmb3IgdGhlIHZpZXdlcgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgdGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHJlZnMKLQkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPklSaWNoVGV4dDwvY29kZT4gaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSaWNoVGV4dEVkaXRvciBjcmVhdGVSaWNoVGV4dEVkaXRvcihGb3JtVG9vbGtpdCB0b29sa2l0LAotCQkJQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSwgSUVkaXRvclNpdGUgZWRpdG9yU2l0ZSkgewotCQlJUmljaFRleHRFZGl0b3IgcmljaFRleHRFZGl0b3IgPSBuZXcgUmljaFRleHRFZGl0b3IocGFyZW50LCB0b29sa2l0Ci0JCQkJLmdldEJvcmRlclN0eWxlKCkKLQkJCQl8IHN0eWxlIHwgdG9vbGtpdC5nZXRPcmllbnRhdGlvbigpLCBlZGl0b3JTaXRlKTsKLQkJcmljaFRleHRFZGl0b3IuZ2V0Q29udHJvbCgpLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLAotCQkJCUZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHRFZGl0b3Iuc2V0SW5pdGlhbFRleHQodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJpY2hUZXh0RWRpdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0SW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZmVkNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFNoYXJlZCBpbWFnZXMgdXNlZCBieSB0aGUgZGVmYXVsdCByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0SW1hZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFVE9PTDE2ID0gImZ1bGwvZXRvb2wxNi8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRPT0wxNiA9ICJmdWxsL2R0b29sMTYvIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJpY2hUZXh0UGx1Z2luIHJpY2hUZXh0UGx1Z2luID0gUmljaFRleHRQbHVnaW4KLQkJCS5nZXREZWZhdWx0KCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfSU1BR0UgPSBFVE9PTDE2ICsgIkFkZEltYWdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5FID0gRVRPT0wxNiArICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9MSU5LID0gRVRPT0wxNiArICJBZGRMaW5rLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QgPSBFVE9PTDE2Ci0JCQkrICJBZGRPcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9BRERfVEFCTEUgPSBFVE9PTDE2ICsgIkFkZFRhYmxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCA9IEVUT09MMTYKLQkJCSsgIkFkZFVub3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfQk9MRCA9IEVUT09MMTYgKyAiQm9sZC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DTEVBUl9DT05URU5UID0gRVRPT0wxNgotCQkJKyAiQ2xlYXJDb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9DT1BZID0gRVRPT0wxNiArICJDb3B5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0NVVCA9IEVUT09MMTYgKyAiQ3V0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0ZJTkRfUkVQTEFDRSA9IEVUT09MMTYKLQkJCSsgIkZpbmRSZXBsYWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lOREVOVCA9IEVUT09MMTYgKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0lUQUxJQyA9IEVUT09MMTYgKyAiSXRhbGljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX0pVU1RJRllfQ0VOVEVSID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeUNlbnRlci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0ZVTEwgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5RnVsbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX0xFRlQgPSBFVE9PTDE2Ci0JCQkrICJKdXN0aWZ5TGVmdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9KVVNUSUZZX1JJR0hUID0gRVRPT0wxNgotCQkJKyAiSnVzdGlmeVJpZ2h0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19QQVRIX09VVERFTlQgPSBFVE9PTDE2ICsgIk91dGRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfUEFTVEUgPSBFVE9PTDE2ICsgIlBhc3RlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9QQVNURV9QTEFJTl9URVhUID0gRVRPT0wxNiArICJQYXN0ZVBsYWluVGV4dC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCA9IEVUT09MMTYKLQkJCSsgIlN0cmlrZVRocm91Z2guZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfU1VCU0NSSVBUID0gRVRPT0wxNiArICJTdWJzY3JpcHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1BBVEhfU1VQRVJTQ1JJUFQgPSBFVE9PTDE2Ci0JCQkrICJTdXBlcnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9VTkRFUkxJTkUgPSBFVE9PTDE2ICsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfUEFUSF9USURZID0gRVRPT0wxNiArICJUaWR5SFRNTC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfUEFTVEUpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1BBU1RFX1BMQUlOX1RFWFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQpOwkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1NVQlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIElNR19TVVBFUlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBJTUdfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShJTUdfUEFUSF9VTkRFUkxJTkUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgSU1HX1RJRFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKElNR19QQVRIX1RJRFkpOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9JTUFHRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9MSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9MSU5LID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX0xJTkspOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX09SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQUREX1RBQkxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0FERF9VTk9SREVSRURfTElTVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19CT0xEID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ0xFQVJfQ09OVEVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DT1BZID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfQ09QWSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19DVVQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfRklORF9SRVBMQUNFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0lOREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX0lOREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19JVEFMSUMgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0NFTlRFUik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19KVVNUSUZZX0ZVTEwgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX0ZVTEwpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfSlVTVElGWV9MRUZUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9KVVNUSUZZX1JJR0hUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX09VVERFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9PVVRERU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIElNR19ERVNDX1BBU1RFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfUEFTVEVfUExBSU5fVEVYVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1BBU1RFX1BMQUlOX1RFWFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVFJJS0VfVEhST1VHSCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19TVUJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVUJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfU1VQRVJTQ1JJUFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBJTUdfREVTQ19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihJTUdfUEFUSF9VTkRFUkxJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgSU1HX0RFU0NfVElEWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElNR19QQVRIX1RJRFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0lNQUdFID0gRFRPT0wxNgotCQkJKyAiQWRkSW1hZ2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUgPSBEVE9PTDE2Ci0JCQkrICJBZGRMaW5lLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LID0gRFRPT0wxNgotCQkJKyAiQWRkTGluay5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkT3JkZXJlZExpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1RBQkxFID0gRFRPT0wxNgotCQkJKyAiQWRkVGFibGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQUREX1VOT1JERVJFRF9MSVNUID0gRFRPT0wxNgotCQkJKyAiQWRkVW5vcmRlcmVkTGlzdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9CT0xEID0gRFRPT0wxNiArICJCb2xkLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQgPSBEVE9PTDE2Ci0JCQkrICJDbGVhckNvbnRlbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0NPUFkgPSBEVE9PTDE2ICsgIkNvcHkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfQ1VUID0gRFRPT0wxNiArICJDdXQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfRklORF9SRVBMQUNFID0gRFRPT0wxNgotCQkJKyAiRmluZFJlcGxhY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSU5ERU5UID0gRFRPT0wxNgotCQkJKyAiSW5kZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX0lUQUxJQyA9IERUT09MMTYKLQkJCSsgIkl0YWxpYy5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9KVVNUSUZZX0NFTlRFUiA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlDZW50ZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUZ1bGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUID0gRFRPT0wxNgotCQkJKyAiSnVzdGlmeUxlZnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCA9IERUT09MMTYKLQkJCSsgIkp1c3RpZnlSaWdodC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9PVVRERU5UID0gRFRPT0wxNgotCQkJKyAiT3V0ZGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9QQVNURSA9IERUT09MMTYgKyAiUGFzdGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfUEFTVEVfUExBSU5fVEVYVCA9IERUT09MMTYgKyAiUGFzdGVQbGFpblRleHQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0ggPSBEVE9PTDE2Ci0JCQkrICJTdHJpa2VUaHJvdWdoLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1NVQlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1YnNjcmlwdC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCA9IERUT09MMTYKLQkJCSsgIlN1cGVyc2NyaXB0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBESVNBQkxFRF9JTUdfUEFUSF9USURZID0gRFRPT0wxNiArICJUaWR5SFRNTC5naWYiOyAvLyROT04tTkxTLTEkCi0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSA9IERUT09MMTYKLQkJCSsgIlVuZGVybGluZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9JTUFHRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19BRERfTElORSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQUREX0xJTkUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX0xJTksgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0FERF9PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1RBQkxFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVEFCTEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQUREX1VOT1JERVJFRF9MSVNUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfQk9MRCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19DTEVBUl9DT05URU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DTEVBUl9DT05URU5UKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0NPUFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9DVVQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfRklORF9SRVBMQUNFID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9GSU5EX1JFUExBQ0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSU5ERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9JVEFMSUMpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfSlVTVElGWV9DRU5URVIgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfQ0VOVEVSKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfRlVMTCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9MRUZUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX0pVU1RJRllfUklHSFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfUklHSFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfT1VUREVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfUEFTVEUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZSBESVNBQkxFRF9JTUdfU1RSSUtFX1RIUk9VR0ggPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1NUUklLRV9USFJPVUdIKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVQlNDUklQVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0U2hhcmVkSW1hZ2UoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2UgRElTQUJMRURfSU1HX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRTaGFyZWRJbWFnZShESVNBQkxFRF9JTUdfUEFUSF9TVVBFUlNDUklQVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlIERJU0FCTEVEX0lNR19VTkRFUkxJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldFNoYXJlZEltYWdlKERJU0FCTEVEX0lNR19QQVRIX1VOREVSTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfSU1BR0UgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfSU1BR0UpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTkUgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfTElORSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfTElOSyA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9MSU5LKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfT1JERVJFRF9MSVNUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0FERF9UQUJMRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0FERF9UQUJMRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19BRERfVU5PUkRFUkVEX0xJU1QgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9BRERfVU5PUkRFUkVEX0xJU1QpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQk9MRCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0JPTEQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NMRUFSX0NPTlRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ09QWSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0NPUFkpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfQ1VUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfQ1VUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0ZJTkRfUkVQTEFDRSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0ZJTkRfUkVQTEFDRSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19JTkRFTlQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9JTkRFTlQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSVRBTElDID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSVRBTElDKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfQ0VOVEVSID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9DRU5URVIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfSlVTVElGWV9GVUxMID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9GVUxMKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX0pVU1RJRllfTEVGVCA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX0pVU1RJRllfTEVGVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19KVVNUSUZZX1JJR0hUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfSlVTVElGWV9SSUdIVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19PVVRERU5UID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfT1VUREVOVCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBESVNBQkxFRF9JTUdfREVTQ19QQVNURSA9IHJpY2hUZXh0UGx1Z2luCi0JCQkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERJU0FCTEVEX0lNR19QQVRIX1BBU1RFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1BBU1RFX1BMQUlOX1RFWFQgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9QQVNURV9QTEFJTl9URVhUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NUUklLRV9USFJPVUdIID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1RSSUtFX1RIUk9VR0gpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfU1VCU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VCU0NSSVBUKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1NVUEVSU0NSSVBUID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfU1VQRVJTQ1JJUFQpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRElTQUJMRURfSU1HX0RFU0NfVU5ERVJMSU5FID0gcmljaFRleHRQbHVnaW4KLQkJCS5nZXRJbWFnZURlc2NyaXB0b3IoRElTQUJMRURfSU1HX1BBVEhfVU5ERVJMSU5FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERJU0FCTEVEX0lNR19ERVNDX1RJRFkgPSByaWNoVGV4dFBsdWdpbgotCQkJLmdldEltYWdlRGVzY3JpcHRvcihESVNBQkxFRF9JTUdfUEFUSF9USURZKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRMaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjIyMDQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIExpc3RlbnMgdG8gYSByaWNoIHRleHQgZWRpdGluZyBldmVudC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dExpc3RlbmVyIHsKLQotCXByaXZhdGUgaW50IGV2ZW50VHlwZTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBldmVudCB0eXBlCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgZXZlbnQgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRMaXN0ZW5lcihpbnQgZXZlbnRUeXBlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUuCi0JICogCi0JICogQHJldHVybiB0aGUgZXZlbnQgdHlwZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXZlbnRUeXBlKCkgewotCQlyZXR1cm4gZXZlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTNjYWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUmljaCBUZXh0IHBsdWctaW4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmljaFRleHRQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUmljaFRleHRQbHVnaW4gcGx1Z2luOwotCi0JLy8gVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIHBsdWctaW4gd2FzIHN0YXJ0ZWQuCi0JcHJpdmF0ZSBEYXRlIHN0YXJ0VGltZTsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFJpY2hUZXh0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJc3RhcnRUaW1lID0gbmV3IERhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0b3AoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBSaWNoVGV4dFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIHBsdWctaW4gd2FzIHN0YXJ0ZWQuCi0JICovCi0JcHVibGljIERhdGUgZ2V0U3RhcnRUaW1lKCkgewotCQlyZXR1cm4gc3RhcnRUaW1lOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0UmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjNlNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBSaWNoVGV4dCByZXNvdXJjZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSaWNoVGV4dFJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBSaWNoVGV4dFJlc291cmNlcy5jbGFzcwotCQkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAkKLQotCXByaXZhdGUgUmljaFRleHRSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZS4KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdF9Nb3ppbGxhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfbm9ybWFsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfc3Vic2VjdGlvbkhlYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFN0eWxlX3N1YlN1YnNlY3Rpb25IZWFkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnRTdHlsZV9xdW90ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVfY29kZVNhbXBsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19wYXJhZ3JhcGg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfaGVhZGluZzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdfYWRkcmVzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBibG9ja1RhZ19wcmVmb3JtYXR0ZWRUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfYXJpYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVfY291cmllck5ldzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250TmFtZV90aW1lc05ld1JvbWFuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvbnROYW1lX3ZlcmRhbmE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkSG9yaXpvbnRhbEJhckFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRJbWFnZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmtBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkT3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVGFibGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVW5vcmRlcmVkTGlzdEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBib2xkQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQ29udGVudEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb3B5QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1dEFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUmVwbGFjZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaXRhbGljQWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGp1c3RpZnlDZW50ZXJBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeUZ1bGxBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcganVzdGlmeVJpZ2h0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3Vic2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN1cGVyc2NyaXB0QWN0aW9uX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmxvY2tUYWdBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udE5hbWVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9udFNpemVBY3Rpb25fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3V0QWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weUFjdGlvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhc3RlQWN0aW9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFzdGVQbGFpblRleHRBY3Rpb25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByaWNoVGV4dFRhYl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJpY2hUZXh0VGFiX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGh0bWxUYWJfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBodG1sVGFiX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZEltYWdlRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZExpbmtEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkVGFibGVEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJlcGxhY2VEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdXJsRGlzcGxheU5hbWVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVybExhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3VtbWFyeUxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwdGlvbkxhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcm93c0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29sdW1uc0xhYmVsX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgd2lkdGhMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlU3R5bGVMYWJlbF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyTm9uZV90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyQ29sc190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyUm93c190ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlSGVhZGVyQm90aF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJyb3dzZUJ1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsZWFyQ29udGVudERpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGVhckNvbnRlbnREaWFsb2dfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvcHRpb25zR3JvdXBfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3aG9sZVdvcmRDaGVja2JveF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRpcmVjdGlvbkdyb3VwX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmFja3dhcmRSYWRpb0J1dHRvbl90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUZpbmRCdXR0b25fdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBsYWNlYWxsQnV0dG9uX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZFJlcGxhY2VfU3RhdHVzX25vTWF0Y2hfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF4Q2hhcnNQZXJMaW5lTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRIVE1MQ2hlY2tib3hfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbmRlbnRTaXplTGFiZWxfdGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aWR5X2NsZWFuX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVyX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVzdF90ZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5fdG9vbFRpcFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGlkeV9jbGVhbmVyX3Rvb2xUaXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpZHlfY2xlYW5lc3RfdG9vbFRpcFRleHQ7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBSaWNoVGV4dFJlc291cmNlcy5jbGFzcyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGI3ZjRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L1JpY2hUZXh0U2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0OwotCi0vKioKLSAqIE1vZGVscyBhIHRleHQgc2VsZWN0aW9uIGluIGEgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLSAqIAotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFNlbGVjdGlvbiB7Ci0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uLgotCXByb3RlY3RlZCBTdHJpbmcgdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIG9mZnNldAotCXByb3RlY3RlZCBpbnQgb2Zmc2V0U3RhcnQgPSAwOwotCi0JLy8gVGhlIGNvbnRyb2wncyB0ZXh0IHNlbGVjdGlvbiBmb250Ci0JcHJvdGVjdGVkIFN0cmluZyBmb250TmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgY29udHJvbCdzIHRleHQgc2VsZWN0aW9uIGZvbnQgc2l6ZQotCS8vIGNvdWxkIGJlIGluIHBvaW50IHNpemUgKDEycHQpLCBvciBIVE1MIHNpemUgKDEtNykKLQlwcm90ZWN0ZWQgU3RyaW5nIGZvbnRTaXplID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IHN0eWxlCi0JcHJvdGVjdGVkIFN0cmluZyBibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBjb250cm9sJ3MgdGV4dCBjdXJyZW50IGZsYWdzCi0JcHJvdGVjdGVkIGludCBmbGFncyA9IDA7Ci0KLQkvLyBUZXh0IHN0YXR1cyBmbGFncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPTEQgPSAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRBTElDID0gQk9MRCA8PCAxOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5ERVJMSU5FID0gSVRBTElDIDw8IDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVUJTQ1JJUFQgPSBVTkRFUkxJTkUgPDwgMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNVUEVSU0NSSVBUID0gU1VCU0NSSVBUIDw8IDE7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrU3R5bGUoKSB7Ci0JCXJldHVybiBibG9ja1N0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJsb2NrU3R5bGUoU3RyaW5nIGJsb2NrU3R5bGUpIHsKLQkJdGhpcy5ibG9ja1N0eWxlID0gYmxvY2tTdHlsZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZsYWdzKCkgewotCQlyZXR1cm4gZmxhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmxhZ3MoaW50IGZsYWdzKSB7Ci0JCXRoaXMuZmxhZ3MgPSBmbGFnczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnROYW1lKCkgewotCQlyZXR1cm4gZm9udE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udE5hbWUoU3RyaW5nIGZvbnROYW1lKSB7Ci0JCXRoaXMuZm9udE5hbWUgPSBmb250TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplKCkgewotCQlyZXR1cm4gZm9udFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rm9udFNpemUoU3RyaW5nIGZvbnRTaXplKSB7Ci0JCXRoaXMuZm9udFNpemUgPSBmb250U2l6ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldFN0YXJ0KCkgewotCQlyZXR1cm4gb2Zmc2V0U3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0U3RhcnQoaW50IG9mZnNldFN0YXJ0KSB7Ci0JCXRoaXMub2Zmc2V0U3RhcnQgPSBvZmZzZXRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JvbGQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBCT0xEKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSXRhbGljKCkgewotCQlyZXR1cm4gKGZsYWdzICYgSVRBTElDKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVW5kZXJMaW5lKCkgewotCQlyZXR1cm4gKGZsYWdzICYgVU5ERVJMSU5FKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3Vic2NyaXB0KCkgewotCQlyZXR1cm4gKGZsYWdzICYgU1VCU0NSSVBUKSAhPSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3VwZXJzY3JpcHQoKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBTVVBFUlNDUklQVCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBpbmZvCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlvZmZzZXRTdGFydCA9IDA7Ci0JCWZvbnROYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlibG9ja1N0eWxlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZmxhZ3MgPSAwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzdHIgPSAiVGV4dDogIiArIHRleHQgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc3RyICs9ICJmb250TmFtZTogIiArIGZvbnROYW1lICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZm9udFNpemU6ICIgKyBmb250U2l6ZSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlzdHIgKz0gImJsb2NrU3R5bGU6ICIgKyBibG9ja1N0eWxlICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXN0ciArPSAiZmxhZ3M6ICIgKyBmbGFncyArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gc3RyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvUmljaFRleHRUb29sQmFyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExNjJkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9SaWNoVGV4dFRvb2xCYXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLklSaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5SaWNoVGV4dENvbWJvQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IHJpY2ggdGV4dCB0b29sIGJhciBpbXBsZW1lbnRhdGlvbi4KLSAqIAotICogU3BsaXQgaW50byAyIHRvb2xiYXJzIChvbmUgZm9yIENDb21ib3MsIG9uZSBmb3IgYnV0dG9ucykgZm9yIHRhYmJpbmcgcHVycG9zZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRvb2xCYXIgaW1wbGVtZW50cyBJUmljaFRleHRUb29sQmFyIHsKLQotCS8vIFRoZSBwYXJlbnQgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBJZiB0cnVlLCBhZGQgYSBuZXcgdG9vbCBiYXIuCi0JcHJpdmF0ZSBib29sZWFuIGFkZFRvb2xCYXIgPSB0cnVlOwotCi0JLy8gVGhlIGN1cnJlbnQgdG9vbCBiYXIgbWFuYWdlciB1c2VkIHRvIHBvcHVsYXRlIHRoZSB0b29sIGFjdGlvbnMuCi0JcHJpdmF0ZSBUb29sQmFyTWFuYWdlciB0b29sYmFyTWdyOwotCQotCS8vIFRoZSBjdXJyZW50IHRvb2wgYmFyIG1hbmFnZXIgdXNlZCB0byBwb3B1bGF0ZSB0aGUgdG9vbCBhY3Rpb25zLgotCXByaXZhdGUgVG9vbEJhck1hbmFnZXIgdG9vbGJhck1nckNvbWJvOwotCi0JLy8gVGhlIGFjdGlvbiBpdGVtcyBpbiB0aGUgdG9vbCBiYXIocykuCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYWN0aW9uSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQotCXByaXZhdGUgc3RhdGljIGludCBsYXN0V2lkdGggPSAtMTsKLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHBhcmVudDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIGJhciBzdHlsZQotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRvb2xCYXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQotCQlhZGRUb29sQmFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWN0aW9uKGZpbmFsIElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQkJCXRvb2xiYXJNZ3IuYWRkKGl0ZW0pOwotCQkJdG9vbGJhck1nci51cGRhdGUodHJ1ZSk7Ci0JCQlhY3Rpb25JdGVtcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY29tYm8gYWN0aW9uIHRvIHRoZSB0b29sIGJhci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aW9uCi0JICogICAgICAgICAgICB0aGUgYWN0aW9uIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGlvbihmaW5hbCBSaWNoVGV4dENvbWJvQWN0aW9uIGl0ZW0pIHsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJaXRlbS5pbml0KCk7Ci0JCQl0b29sYmFyTWdyQ29tYm8uYWRkKGl0ZW0pOyAgICAgICAgICAgIAotCQkJdG9vbGJhck1nckNvbWJvLnVwZGF0ZSh0cnVlKTsKLQkJCWFjdGlvbkl0ZW1zLmFkZChpdGVtKTsgICAgICAgICAgIAotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHNlcGFyYXRvciB0byB0aGUgdG9vbCBiYXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VwYXJhdG9yKCkgewotCQl0b29sYmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHRvb2xiYXIgc3RhdGUuCi0JICogPHA+Ci0JICogRW5hYmxlcy9kaXNhYmxlcyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0JICogUmljaFRleHRFZGl0b3IgdGFiIChSaWNoVGV4dCB2cy4gSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdGFibGUKLQkgKiAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBub24tUmVhZE9ubHkgY29tbWFuZHMKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sQmFyKGJvb2xlYW4gZWRpdGFibGUpIHsKLQkJYm9vbGVhbiByaWNoVGV4dE1vZGUgPSB0cnVlOwotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCSYmICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5pc0hUTUxUYWJTZWxlY3RlZCgpKSB7Ci0JCQlyaWNoVGV4dE1vZGUgPSBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25JdGVtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBpdGVtID0gaS5uZXh0KCk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFRvb2xJdGVtKSB7Ci0JCQkJYm9vbGVhbiBlbmFibGVkVG9vbEl0ZW0gPSB0cnVlOwotCQkJCVRvb2xJdGVtIHRvb2xJdGVtID0gKFRvb2xJdGVtKSBpdGVtOwotCQkJCUlSaWNoVGV4dEFjdGlvbiBhY3Rpb24gPSAoSVJpY2hUZXh0QWN0aW9uKSB0b29sSXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsICYmICFlZGl0YWJsZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblJlYWRPbmx5TW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIXJpY2hUZXh0TW9kZQotCQkJCQkJJiYgYWN0aW9uLmRpc2FibGVJblNvdXJjZU1vZGUoKSkgewotCQkJCQllbmFibGVkVG9vbEl0ZW0gPSBmYWxzZTsKLQkJCQl9Ci0JCQkJdG9vbEl0ZW0uc2V0RW5hYmxlZChlbmFibGVkVG9vbEl0ZW0pOwotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQlpZiAocmljaFRleHRNb2RlICYmIGVkaXRhYmxlKSB7Ci0JCQkJCSgoQ29tYm8pIGl0ZW0pLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKChDb21ibykgaXRlbSkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCWJvb2xlYW4gZW5hYmxlZFRvb2xJdGVtID0gdHJ1ZTsKLQkJCQlSaWNoVGV4dEFjdGlvbiBhY3Rpb24gPSAoUmljaFRleHRBY3Rpb24pICgoQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgaXRlbSkKLQkJCQkJCS5nZXRBY3Rpb24oKTsKLQkJCQlpZiAoYWN0aW9uICE9IG51bGwgJiYgIWVkaXRhYmxlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkpIHsKLQkJCQkJZW5hYmxlZFRvb2xJdGVtID0gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiAhcmljaFRleHRNb2RlCi0JCQkJCQkmJiBhY3Rpb24uZGlzYWJsZUluU291cmNlTW9kZSgpKSB7Ci0JCQkJCWVuYWJsZWRUb29sSXRlbSA9IGZhbHNlOwotCQkJCX0KLQkJCQlhY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkVG9vbEl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHRvb2wgYmFyLCBpZiBuZWNlc3NhcnksIHRvIGNvbnRhaW4gYSBidXR0b24gYWN0aW9uIG9yIHNlcGFyYXRvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sQmFyKCkgewotCQlpZiAoYWRkVG9vbEJhcikgewotCQkJdG9vbGJhck1nckNvbWJvID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5XUkFQIHwgU1dULkZMQVQgfCBwYXJlbnQuZ2V0U3R5bGUoKSk7Ci0JCQl0b29sYmFyTWdyQ29tYm8uY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJdG9vbGJhck1nciA9IG5ldyBUb29sQmFyTWFuYWdlcihTV1QuV1JBUCB8IFNXVC5GTEFUIHwgcGFyZW50LmdldFN0eWxlKCkpOwotCQkJdG9vbGJhck1nci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQlhZGRUb29sQmFyID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVG9vbEJhck1hbmFnZXIgZ2V0VG9vbGJhck1ncigpIHsKLQkJcmV0dXJuIHRvb2xiYXJNZ3I7Ci0JfQotCi0JcHVibGljIFRvb2xCYXJNYW5hZ2VyIGdldFRvb2xiYXJNZ3JDb21ibygpIHsKLQkJcmV0dXJuIHRvb2xiYXJNZ3JDb21ibzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkSW1hZ2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwMjkyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZEltYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZEltYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGFuIGltYWdlIHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkSW1hZ2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBBZGRJbWFnZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkSW1hZ2VBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlBZGRJbWFnZURpYWxvZyBkaWFsb2cgPSBuZXcgQWRkSW1hZ2VEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCVN0cmluZyBpbWFnZVVSTCA9IGRpYWxvZy5nZXRJbWFnZSgpLmdldFVSTCgpOwotCQkJCWlmIChpbWFnZVVSTC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcmljaFRleHQKLQkJCQkJCQkuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9JTUFHRSwgaW1hZ2VVUkwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZExpbmVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NhZGE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGluZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGEgaG9yaXpvbnRhbCBiYXIgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRMaW5lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQWRkTGluZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5lQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5FKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkTGlua0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjhlYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRMaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZExpbmtEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEFkZHMgYSBsaW5rIHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlua0FjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZExpbmtBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9MSU5LKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX0xJTkspOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRMaW5rQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJQWRkTGlua0RpYWxvZyBkaWFsb2cgPSBuZXcgQWRkTGlua0RpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKQotCQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgcmljaFRleHQuZ2V0QmFzZVBhdGgoKSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJU3RyaW5nIGxpbmtVUkwgPSBkaWFsb2cuZ2V0TGluaygpLmdldFVSTCgpOwotCQkJCWlmIChsaW5rVVJMLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0xJTkssIGxpbmtVUkwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9BZGRPcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTQyYTAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkT3JkZXJlZExpc3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogQWRkcyBhbiBvcmRlcmVkIGxpc3QgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRPcmRlcmVkTGlzdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZE9yZGVyZWRMaXN0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfT1JERVJFRF9MSVNUKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfQUREX09SREVSRURfTElTVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZE9yZGVyZWRMaXN0QWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX09SREVSRURfTElTVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVGFibGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2NzE2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFRhYmxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzLkFkZFRhYmxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBZGRzIGEgdGFibGUgdG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUYWJsZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZFRhYmxlQWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfVEFCTEUpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19BRERfVEFCTEUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRUYWJsZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJQWRkVGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFRhYmxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpCi0JCQkJCS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQlUYWJsZSB0YWJsZSA9IGRpYWxvZy5nZXRUYWJsZSgpOwotCQkJCWludCByb3dzID0gdGFibGUuZ2V0Um93cygpOwotCQkJCWludCBjb2xzID0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQkJCVN0cmluZyB3aWR0aCA9IHRhYmxlLmdldFdpZHRoKCk7Ci0JCQkJaW50IHRhYmxlaGVhZGVycyA9IHRhYmxlLmdldFRhYmxlSGVhZGVycygpOwotCQkJCVN0cmluZyBzdW1tYXJ5ID0gdGFibGUuZ2V0U3VtbWFyeSgpOwotCQkJCVN0cmluZyBjYXB0aW9uID0gdGFibGUuZ2V0Q2FwdGlvbigpOwotCQkJCWlmIChyb3dzID4gMCAmJiBjb2xzID4gMCkgewotCQkJCQlyaWNoVGV4dAotCQkJCQkJCS5leGVjdXRlQ29tbWFuZCgKLQkJCQkJCQkJCVJpY2hUZXh0Q29tbWFuZC5BRERfVEFCTEUsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJCQkJCQkiIiArIHJvd3MsICIiICsgY29scywgIiIgKyB3aWR0aCwgc3VtbWFyeSwgY2FwdGlvbiwgIiIgKyB0YWJsZWhlYWRlcnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0FkZFVub3JkZXJlZExpc3RBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIwNTU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQWRkVW5vcmRlcmVkTGlzdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBBZGRzIGFuIHVub3JkZXJlZCBsaXN0IHRvIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEFkZFVub3JkZXJlZExpc3RBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmFkZFVub3JkZXJlZExpc3RBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfVU5PUkRFUkVEX0xJU1QpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jhc2VSaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNTczNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0Jhc2VSaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCByaWNoIHRleHQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSaWNoVGV4dEFjdGlvbiBpbXBsZW1lbnRzIElCYXNlUmljaFRleHRBY3Rpb24gewotCi0JcHJvdGVjdGVkIFN0cmluZyB0b29sVGlwVGV4dDsKLQotCXByb3RlY3RlZCBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgQmFzZVJpY2hUZXh0QWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRvb2xUaXBUZXh0Ci0JICogICAgICAgICAgICB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwVGV4dCkgewotCQl0aGlzLnRvb2xUaXBUZXh0ID0gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbmFibGUgdGhlIGFjdGlvbi4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGlzYWJsZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9CbG9ja1RhZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWI4ZmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQmxvY2tUYWdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuQmxvY2tUYWc7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrVGFnQWN0aW9uIGV4dGVuZHMgUmljaFRleHRDb21ib0FjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCbG9ja1RhZ0FjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ0FjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJldHVybkxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLlBBUkFHUkFQSC5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzEuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR18yLmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfMy5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5IRUFESU5HXzQuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuTGlzdC5hZGQoQmxvY2tUYWcuSEVBRElOR181LmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLkhFQURJTkdfNi5nZXROYW1lKCkpOwotCQlyZXR1cm5MaXN0LmFkZChCbG9ja1RhZy5BRERSRVNTLmdldE5hbWUoKSk7Ci0JCXJldHVybkxpc3QuYWRkKEJsb2NrVGFnLlBSRUZPUk1BVFRFRF9URVhULmdldE5hbWUoKSk7Ci0KLQkJcmV0dXJuIHJldHVybkxpc3Q7Ci0JfQotCQotCQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWQgPSBnZXRDQ29tYm9TZWxlY3Rpb24oKTsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GT1JNQVRfQkxPQ0ssIHNlbGVjdGVkKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQm9sZEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmM2NDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvbGRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBCb2xkQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19DSEVDS19CT1gpOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0JPTEQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5ib2xkQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJc2V0Q2hlY2tlZChyaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmlzQm9sZCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DbGVhckNvbnRlbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ2xlYXJDb250ZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlODM1MDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9DbGVhckNvbnRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIENsZWFycyB0aGUgY29udGVudCBvZiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENsZWFyQ29udGVudEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENsZWFyQ29udGVudEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQ0xFQVJfQ09OVEVOVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NMRUFSX0NPTlRFTlQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5jbGVhckNvbnRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgcyByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldE1zZ0RpYWxvZygpLmRpc3BsYXlQcm9tcHQoCi0JCQkJCVJpY2hUZXh0UmVzb3VyY2VzLmNsZWFyQ29udGVudERpYWxvZ190aXRsZSwKLQkJCQkJUmljaFRleHRSZXNvdXJjZXMuY2xlYXJDb250ZW50RGlhbG9nX3RleHQpKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNMRUFSX0NPTlRFTlQpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0NvcHlBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYyZjZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ29weUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotCi0vKioKLSAqIENvcGllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sIHRvIHRoZSBjbGlwYm9hcmQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29weUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIENvcHlBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0NPUFkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19DT1BZKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuY29weUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KS5nZXRTb3VyY2VFZGl0KCk7Ci0JCQkJc3R5bGVkVGV4dC5jb3B5KCk7Ci0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LnNldENvcHlVUkwoKTsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQ09QWSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0N1dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODI4ODgzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvQ3V0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci0KLS8qKgotICogQ3V0cyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgdG8gdGhlIGNsaXBib2FyZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDdXRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0NVVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX0NVVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmN1dEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KQotCQkJCQkJLmdldFNvdXJjZUVkaXQoKTsKLQkJCQlzdHlsZWRUZXh0LmN1dCgpOwotCQkJfSBlbHNlIHsKLQkJCQlyaWNoVGV4dC5zZXRDb3B5VVJMKCk7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkNVVCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0ZpbmRSZXBsYWNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTM1ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9GaW5kUmVwbGFjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuRmluZFJlcGxhY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEZpbmRzIGFuZCByZXBsYWNlcyB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRmluZFJlcGxhY2VBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBGaW5kcyB0ZXh0IHN1YiBhY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklORF9URVhUID0gMTsKLQotCS8qKgotCSAqIFJlcGxhY2VzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX1RFWFQgPSAyOwotCi0JLyoqCi0JICogUmVwbGFjZXMgYW5kIGZpbmRzIHRleHQgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0ZJTkRfVEVYVCA9IDM7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgc3ViIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0FMTF9URVhUID0gNDsKLQotCS8qKgotCSAqIEZpbmQgbWF0Y2ggaW4gYSBmb3J3YXJkIGRpcmVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX01BVENIID0gMTsKLQotCS8qKgotCSAqIEZpbmQgbWF0Y2ggaW4gYSBiYWNrd2FyZCBkaXJlY3Rpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1dBUkRfTUFUQ0ggPSAtMTsKLQotCS8qKgotCSAqIFdob2xlIHdvcmQgbWF0Y2guCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hPTEVfV09SRF9NQVRDSCA9IDI7Ci0KLQkvKioKLQkgKiBDYXNlIHNlbnNpdGl2ZSBtYXRjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNFX1NFTlNJVElWRV9NQVRDSCA9IDQ7Ci0KLQkvLyBFbmNvZGVkIHNpbmdsZSBxdW90ZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RFRF9TSU5HTEVfUVVPVEUgPSAiJXNxJSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCi0JcHJpdmF0ZSBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3VuZE1hdGNoID0gZmFsc2U7Ci0JCi0JLy8gdGhlIGRpYWxvZyBpbnN0YW5jZQotCXByb3RlY3RlZCBGaW5kUmVwbGFjZURpYWxvZyBkaWFsb2c7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfRklORF9SRVBMQUNFKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfRklORF9SRVBMQUNFKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZmluZFJlcGxhY2VBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmICh0aGlzLnJpY2hUZXh0ID09IG51bGwpCi0JCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JCWlmICh0aGlzLnJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGRpYWxvZyAhPSBudWxsKSB7Ci0JCQkJCWRpYWxvZy5zZXRGaW5kT25seSghdGhpcy5yaWNoVGV4dC5nZXRFZGl0YWJsZSgpKTsKLQkJCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaWFsb2cgPSBuZXcgRmluZFJlcGxhY2VEaWFsb2coRGlzcGxheQotCQkJCQkJCS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKSwgdGhpcywgIXRoaXMucmljaFRleHQKLQkJCQkJCQkuZ2V0RWRpdGFibGUoKSk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIG1hdGNoIGlzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEZvdW5kTWF0Y2goKSB7Ci0JCXJldHVybiBmb3VuZE1hdGNoOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHN1YkFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIHN1YiBhY3Rpb24gdG8gZXhlY3V0ZQotCSAqIEBwYXJhbSBmaW5kVGV4dAotCSAqICAgICAgICAgICAgdGhlIGZpbmQgdGV4dAotCSAqIEBwYXJhbSByZXBsYWNlVGV4dAotCSAqICAgICAgICAgICAgdGhlIHJlcGxhY2UgdGV4dAotCSAqIEBwYXJhbSBtYXRjaERpcgotCSAqICAgICAgICAgICAgdGhlIG1hdGNoIGRpcmVjdGlvbjsgdGhlIHZhbHVlIGNhbiBlaXRoZXIgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPkZJTkRfRk9SV0FSRDwvY29kZT4gb3IgPGNvZGU+RklORF9CQUNLV0FSRDwvY29kZT4uCi0JICogQHBhcmFtIG1hdGNoT3B0aW9ucwotCSAqICAgICAgICAgICAgdGhlIG1hdGNoIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oaW50IHN1YkFjdGlvbiwgU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hEaXIsIGludCBtYXRjaE9wdGlvbnMpIHsKLQkJc3R5bGVkVGV4dCA9IG51bGw7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yCi0JCQkJJiYgKChSaWNoVGV4dEVkaXRvcikgcmljaFRleHQpLmlzSFRNTFRhYlNlbGVjdGVkKCkpIHsKLQkJCXN0eWxlZFRleHQgPSAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuZ2V0U291cmNlRWRpdCgpOwotCQl9Ci0JCWlmIChzdHlsZWRUZXh0ID09IG51bGwpIHsKLQkJCWlmIChmaW5kVGV4dC5pbmRleE9mKCInIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZpbmRUZXh0ID0gZmluZFRleHQucmVwbGFjZUFsbCgiJyIsIEVOQ09ERURfU0lOR0xFX1FVT1RFKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHJlcGxhY2VUZXh0LmluZGV4T2YoIiciKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVwbGFjZVRleHQgPSByZXBsYWNlVGV4dC5yZXBsYWNlQWxsKCInIiwgRU5DT0RFRF9TSU5HTEVfUVVPVEUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJdHJ5IHsKLQkJCWZvdW5kTWF0Y2ggPSBmYWxzZTsKLQkJCWludCBzdGF0dXMgPSAwOwotCQkJc3dpdGNoIChzdWJBY3Rpb24pIHsKLQkJCWNhc2UgRklORF9URVhUOgotCQkJCXN0YXR1cyA9IGZpbmRUZXh0KGZpbmRUZXh0LCBtYXRjaERpciwgbWF0Y2hPcHRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVQTEFDRV9URVhUOgotCQkJCXN0YXR1cyA9IHJlcGxhY2VUZXh0KHJlcGxhY2VUZXh0LCBtYXRjaERpciwgbWF0Y2hPcHRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVQTEFDRV9GSU5EX1RFWFQ6Ci0JCQkJc3RhdHVzID0gcmVwbGFjZUZpbmRUZXh0KGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgbWF0Y2hEaXIsCi0JCQkJCQltYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFX0FMTF9URVhUOgotCQkJCXJlcGxhY2VBbGwoZmluZFRleHQsIHJlcGxhY2VUZXh0LCBtYXRjaE9wdGlvbnMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN0YXR1cyA+IDApCi0JCQkJZm91bmRNYXRjaCA9IHRydWU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc2NhcGVzIHRoZSBnaXZlbiB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0ZXh0IHRvIGJlIGVzY2FwZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IHRleHRTaXplID0gdGV4dC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0U2l6ZTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gdGV4dC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICc8JzoKLQkJCQlzYi5hcHBlbmQoWE1MVXRpbC5YTUxfTFQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAnPic6Ci0JCQkJc2IuYXBwZW5kKFhNTFV0aWwuWE1MX0dUKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJyYnOgotCQkJCXNiLmFwcGVuZChYTUxVdGlsLlhNTF9BTVApOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzYi5hcHBlbmQoY2gpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRUZXh0KFN0cmluZyBmaW5kVGV4dCwgaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoZmluZFRleHQsIG1hdGNoRGlyLAotCQkJCQltYXRjaE9wdGlvbnMpOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gcmljaFRleHQKLQkJCQkJLmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GSU5EX1RFWFQsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJZmluZFRleHQsICIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCi0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcml2YXRlIGludCByZXBsYWNlVGV4dChTdHJpbmcgcmVwbGFjZVRleHQsIGludCBtYXRjaERpciwgaW50IG1hdGNoT3B0aW9ucykgewotCQlpbnQgc3RhdHVzID0gMDsKLQkJaWYgKHN0eWxlZFRleHQgIT0gbnVsbCkgewotCQkJc3RhdHVzID0gc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KHJlcGxhY2VUZXh0KTsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IHJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX1RFWFQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7IHJlcGxhY2VUZXh0LAotCQkJCQkJCSIiICsgbWF0Y2hEaXIsICIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVwbGFjZUZpbmRUZXh0KFN0cmluZyBmaW5kVGV4dCwgU3RyaW5nIHJlcGxhY2VUZXh0LAotCQkJaW50IG1hdGNoRGlyLCBpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWludCBzdGF0dXMgPSAwOwotCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQlzdHlsZWRUZXh0UmVwbGFjZVRleHRBbmRTZWxlY3QocmVwbGFjZVRleHQpOwotCQkJc3RhdHVzID0gc3R5bGVkVGV4dEZpbmRUZXh0QW5kU2VsZWN0KGZpbmRUZXh0LCBtYXRjaERpciwKLQkJCQkJbWF0Y2hPcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX1RFWFQsIG5ldyBTdHJpbmdbXSB7Ci0JCQkJCXJlcGxhY2VUZXh0LCAiIiArIG1hdGNoRGlyLCAiIiArIG1hdGNoT3B0aW9ucyB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzdGF0dXMgPSByaWNoVGV4dAotCQkJCQkuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkZJTkRfVEVYVCwgbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQlmaW5kVGV4dCwgIiIgKyBtYXRjaERpciwgIiIgKyBtYXRjaE9wdGlvbnMgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VBbGwoU3RyaW5nIGZpbmRUZXh0LCBTdHJpbmcgcmVwbGFjZVRleHQsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlQWxsKGZpbmRUZXh0LCByZXBsYWNlVGV4dCwgbWF0Y2hPcHRpb25zKTsKLQkJfSBlbHNlIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5SRVBMQUNFX0FMTF9URVhULAotCQkJCQluZXcgU3RyaW5nW10geyBlc2NhcGUoZmluZFRleHQpLCBlc2NhcGUocmVwbGFjZVRleHQpLAotCQkJCQkJCSIiICsgbWF0Y2hPcHRpb25zIH0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBzdHlsZWRUZXh0RmluZFRleHRBbmRTZWxlY3QoU3RyaW5nIGZpbmRUZXh0LCBpbnQgbWF0Y2hEaXIsCi0JCQlpbnQgbWF0Y2hPcHRpb25zKSB7Ci0JCVBvaW50IHNlbGVjdGlvbk9mZnNldCA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTsKLQkJaW50IGZpcnN0U2VsZWN0ZWRPZmZzZXQgPSBzZWxlY3Rpb25PZmZzZXQueDsKLQkJaW50IGxhc3RTZWxlY3RlZE9mZnNldCA9IHNlbGVjdGlvbk9mZnNldC54ICsgc2VsZWN0aW9uT2Zmc2V0LnkgLSAxOwotCQlTdHJpbmcgaHRtbFRleHQgPSBzdHlsZWRUZXh0LmdldFRleHQoKTsKLQkJaW50IGluZGV4T2ZNYXRjaCA9IC0xOwotCQlpZiAoKG1hdGNoT3B0aW9ucyAmIENBU0VfU0VOU0lUSVZFX01BVENIKSA9PSAwKSB7Ci0JCQkvLyBUT0RPOiB1c2UgdG9VcHBlckNhc2UoTG9jYWxlKSBvbmNlIGxpYnJhcnkgaGFzIGxvY2FsZSBhdHRyaWJ1dGUKLQkJCWh0bWxUZXh0ID0gaHRtbFRleHQudG9VcHBlckNhc2UoKTsKLQkJCWZpbmRUZXh0ID0gZmluZFRleHQudG9VcHBlckNhc2UoKTsKLQkJfQotCQlkbyB7Ci0JCQlpZiAoaW5kZXhPZk1hdGNoICE9IC0xKSB7Ci0JCQkJbGFzdFNlbGVjdGVkT2Zmc2V0ID0gaW5kZXhPZk1hdGNoICsgMTsKLQkJCQlmaXJzdFNlbGVjdGVkT2Zmc2V0ID0gaW5kZXhPZk1hdGNoIC0gMTsKLQkJCX0KLQkJCWlmIChtYXRjaERpciA9PSBGT1JXQVJEX01BVENIKSB7Ci0JCQkJaW5kZXhPZk1hdGNoID0gaHRtbFRleHQuaW5kZXhPZihmaW5kVGV4dCwKLQkJCQkJCWxhc3RTZWxlY3RlZE9mZnNldCArIDEpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBodG1sVGV4dC5sYXN0SW5kZXhPZihmaW5kVGV4dCwKLQkJCQkJCWZpcnN0U2VsZWN0ZWRPZmZzZXQgLSAxKTsKLQkJCX0KLQkJfSB3aGlsZSAoaW5kZXhPZk1hdGNoICE9IC0xCi0JCQkJJiYgKChtYXRjaE9wdGlvbnMgJiBXSE9MRV9XT1JEX01BVENIKSA9PSBXSE9MRV9XT1JEX01BVENIKQotCQkJCSYmIGlzUGFydE9mV29yZChodG1sVGV4dCwgaW5kZXhPZk1hdGNoLCBmaW5kVGV4dC5sZW5ndGgoKSkpOwotCQlpZiAoaW5kZXhPZk1hdGNoICE9IC0xKSB7Ci0JCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKGluZGV4T2ZNYXRjaCwgZmluZFRleHQubGVuZ3RoKCkpOwotCQkJc3R5bGVkVGV4dC5zaG93U2VsZWN0aW9uKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc2VsZWN0ZWRUZXh0ID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb25UZXh0KCk7Ci0JCQlpZiAoKG1hdGNoT3B0aW9ucyAmIENBU0VfU0VOU0lUSVZFX01BVENIKSA9PSAwKSB7Ci0JCQkJc2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0LnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0ZWRUZXh0LmVxdWFscyhmaW5kVGV4dCkpIHsKLQkJCQlpbmRleE9mTWF0Y2ggPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblJhbmdlKCkueDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXhPZk1hdGNoOwotCi0JfQotCi0JcHJpdmF0ZSBpbnQgc3R5bGVkVGV4dFJlcGxhY2VUZXh0QW5kU2VsZWN0KFN0cmluZyByZXBsYWNlVGV4dCkgewotCQlQb2ludCBzZWxlY3Rpb25PZmZzZXQgPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvblJhbmdlKCk7Ci0JCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb25PZmZzZXQueCwgc2VsZWN0aW9uT2Zmc2V0LnksCi0JCQkJcmVwbGFjZVRleHQpOwotCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbk9mZnNldC54LCByZXBsYWNlVGV4dC5sZW5ndGgoKSk7Ci0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0eWxlZFRleHRSZXBsYWNlQWxsKFN0cmluZyBmaW5kVGV4dCwgU3RyaW5nIHJlcGxhY2VUZXh0LAotCQkJaW50IG1hdGNoT3B0aW9ucykgewotCQlzdHlsZWRUZXh0LnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwotCQl3aGlsZSAoc3R5bGVkVGV4dEZpbmRUZXh0QW5kU2VsZWN0KGZpbmRUZXh0LCBGT1JXQVJEX01BVENILAotCQkJCW1hdGNoT3B0aW9ucykgIT0gLTEpIHsKLQkJCXN0eWxlZFRleHRSZXBsYWNlVGV4dEFuZFNlbGVjdChyZXBsYWNlVGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNXb3JkQ2hhcihjaGFyIGMpIHsKLQkJaWYgKENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoYykpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhcnRPZldvcmQoU3RyaW5nIHRleHQsIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoaW5kZXggPiAwKQotCQkJaWYgKGlzV29yZENoYXIodGV4dC5jaGFyQXQoaW5kZXggLSAxKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpID49IGluZGV4ICsgbGVuZ3RoKQotCQkJaWYgKGlzV29yZENoYXIodGV4dC5jaGFyQXQoaW5kZXggKyBsZW5ndGgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJUmljaFRleHQgZ2V0UmljaFRleHQoKSB7Ci0JCXJldHVybiByaWNoVGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSaWNoVGV4dChJUmljaFRleHQgcmljaFRleHQpIHsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGlhbG9nICE9IG51bGwpIHsKLQkJCWRpYWxvZy5jbG9zZSgpOwotCQkJZGlhbG9nID0gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250TmFtZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzFjNWFmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udE5hbWVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udE5hbWVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dENvbWJvQWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnROYW1lQWN0aW9uKGZpbmFsIElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJLy8gZ2V0IHN5c3RlbSBmb250cwotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBmb250U2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlGb250RGF0YVtdIGZvbnRzID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Rm9udExpc3QobnVsbCwgdHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyBpKyspIHsKLQkJCWZvbnRTZXQuYWRkKCgoRm9udERhdGEpIGZvbnRzW2ldKS5nZXROYW1lKCkpOwotCQl9Ci0JCWlucHV0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWlucHV0LmFkZChSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWUpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGZvbnRTZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgZm9udE5hbWUgPSBpdGVyLm5leHQoKTsKLQkJCWlucHV0LmFkZChmb250TmFtZSk7Ci0JCX0KLQkJCi0JCS8vIGFkZCBsaXN0ZW5lcgotCQlyaWNoVGV4dC5hZGRMaXN0ZW5lcihTV1QuU0VMRUNURUQsIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIGZvbnROYW1lID0gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRGb250TmFtZSgpOwotCQkJCWlmIChmb250TmFtZQotCQkJCQkJLmVxdWFscyhSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9DU1NfRGVmYXVsdCkKLQkJCQkJCXx8IGZvbnROYW1lCi0JCQkJCQkJCS5lcXVhbHMoUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVBY3Rpb25fQ1NTX0RlZmF1bHRfTW96aWxsYSkKLQkJCQkJCXx8IGZvbnROYW1lLmVxdWFscygiZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9udE5hbWUgPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZUFjdGlvbl9EZWZhdWx0Rm9udE5hbWU7Ci0JCQkJfQotCQkJCWludCBpbmRleCA9IGZpbmRGb250TmFtZUluSXRlbXMoZm9udE5hbWUpOwotCQkJCXNldE5vdGlmeUxpc3RlbmVycyhmYWxzZSk7Ci0JCQkJZ2V0Q0NvbWJvKCkuc2VsZWN0KGluZGV4KTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnModHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRGb250TmFtZUluSXRlbXMoU3RyaW5nIGZvbnROYW1lKSB7Ci0JCWludCBpbmRleCA9IC0xOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGlucHV0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGZvbnQgPSBpdGVyLm5leHQoKTsKLQkJCWluZGV4Kys7Ci0JCQlpZiAoZm9udC5lcXVhbHNJZ25vcmVDYXNlKGZvbnROYW1lKSkgewotCQkJCXJldHVybiBpbmRleDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNlbGVjdGVkID0gZ2V0Q0NvbWJvU2VsZWN0aW9uKCk7Ci0JCQlpZiAoc2VsZWN0ZWQuZXF1YWxzKFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lQWN0aW9uX0RlZmF1bHRGb250TmFtZSkpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCBzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U2l6ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYThmY2IxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFNpemVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBTZXRzIHRoZSBmb250IHNpemUgZm9yIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U2l6ZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRm9udFNpemVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0KTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuZm9udFNpemVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlpbnB1dCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JCWlucHV0LmFkZCgiRGVmYXVsdCIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiMSIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiMiIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiMyIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNCIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNSIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNiIpOyAvLyROT04tTkxTLTEkCi0JCWlucHV0LmFkZCgiNyIpOyAvLyROT04tTkxTLTEkCQkKLQkJLy8gYWRkIGxpc3RlbmVyCi0JCXJpY2hUZXh0LmFkZExpc3RlbmVyKFNXVC5TRUxFQ1RFRCwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBtb3ppbGxhIHJldHVybnMgImRlZmF1bHQiIGlmIG5vIHNpemUgaXMgYXBwbGllZAotCQkJCS8vIElFIHJldHVybnMgMiBpZiBubyBzaXplIGlzIGFwcGxpZWQKLQkJCQlTdHJpbmcgZm9udFNpemUgPSByaWNoVGV4dC5nZXRTZWxlY3RlZCgpLmdldEZvbnRTaXplKCk7Ci0JCQkJaW50IGluZGV4ID0gLTE7Ci0JCQkJaWYgKGZvbnRTaXplLmVxdWFscygiZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5kZXggPSAwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbmRleCA9IEludGVnZXIucGFyc2VJbnQoZm9udFNpemUpOwotCQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbGVhdmUgaW5kZXggYXQgLTEgc28gbm90aGluZyBpcyBzZWxlY3RlZAotCQkJCQl9Ci0JCQkJfQotCQkJCXNldE5vdGlmeUxpc3RlbmVycyhmYWxzZSk7Ci0JCQkJZ2V0Q0NvbWJvKCkuc2VsZWN0KGluZGV4KTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnModHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNlbGVjdGVkID0gZ2V0Q0NvbWJvU2VsZWN0aW9uKCk7Ci0JCQlpZiAoIkRlZmF1bHQiLmVxdWFscyhzZWxlY3RlZCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9TSVpFLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNFVF9GT05UX1NJWkUsCi0JCQkJCQlzZWxlY3RlZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldElucHV0KCkgewotCQlyZXR1cm4gaW5wdXQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvRm9udFN0eWxlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjVhZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9Gb250U3R5bGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuRm9udFN0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogU2V0cyB0aGUgZm9udCBzdHlsZSBmb3IgdGhlIHNlbGVjdGVkIHRleHQgaW4gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTdHlsZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0Q29tYm9BY3Rpb24gewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEZvbnRTdHlsZUFjdGlvbihmaW5hbCBJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkKLQkJaW5wdXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5OT1JNQUwuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5TRUNUSU9OX0hFQURJTkcuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5TVUJTRUNUSU9OX0hFQURJTkcuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5TVUJfU1VCU0VDVElPTl9IRUFESU5HLmdldE5hbWUoKSk7Ci0JCWlucHV0LmFkZChGb250U3R5bGUuUVVPVEUuZ2V0TmFtZSgpKTsKLQkJaW5wdXQuYWRkKEZvbnRTdHlsZS5DT0RFX1NBTVBMRS5nZXROYW1lKCkpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBibG9ja1N0eWxlID0gcmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5nZXRCbG9ja1N0eWxlKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBGb250U3R5bGUuZ2V0Rm9udFN0eWxlTmFtZShibG9ja1N0eWxlKTsKLQkJCQkKLQkJCQlpbnQgaW5kZXggPSAoKExpc3Q8U3RyaW5nPilpbnB1dCkuaW5kZXhPZihuYW1lKTsKLQkJCQlzZXROb3RpZnlMaXN0ZW5lcnMoZmFsc2UpOwotCQkJCWdldENDb21ibygpLnNlbGVjdChpbmRleCk7Ci0JCQkJc2V0Tm90aWZ5TGlzdGVuZXJzKHRydWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBzZWxlY3RlZCA9IGdldENDb21ib1NlbGVjdGlvbigpOwotCQkJU3RyaW5nIHZhbHVlID0gRm9udFN0eWxlLmdldEZvbnRTdHlsZVZhbHVlKHNlbGVjdGVkKTsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9TVFlMRSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JQmFzZVJpY2hUZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTliYjA0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lCYXNlUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi0vKioKLSAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgYSByaWNoIHRleHQgYWN0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQmFzZVJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0b29sIHRpcCBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdG9vbFRpcFRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0b29sIHRpcCB0ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRvb2xUaXBUZXh0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuYWJsZWQgc3RhdHVzIG9mIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmFibGVkLCA8Y29kZT5mYWxzZTwvY29kZT4gaWYgbm90Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOwotCi0JLyoqCi0JICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVkCi0JICogICAgICAgICAgICBJZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5hYmxlIHRoZSBhY3Rpb24uIGlmCi0JICogICAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4sIGRpc2FibGUgaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzBhNTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGJ1dHRvbiBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0QWN0aW9uIGV4dGVuZHMgSUJhc2VSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZm9yIHRoZSBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXREaXNhYmxlZEltYWdlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSBkaXNhYmxlZCBpbWFnZSBmb3IgdGhlIGFjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2UoSW1hZ2UgaW1hZ2UpOwotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHJlYWRvbmx5IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluUmVhZE9ubHlNb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KTsKLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBhY3Rpb24ncyBUb29sSXRlbQotCSAqIEBwYXJhbSB0b29sSXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xJdGVtKFRvb2xJdGVtIHRvb2xJdGVtKTsKLQkKLQkvKioKLQkgKiBHZXRzIHRoZSBTV1QgVG9vbEl0ZW0gU3R5bGUgdG8gYmUgdXNlZCBmb3IgdGhpcyBhY3Rpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0eWxlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0Q29tYm9BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSVJpY2hUZXh0Q29tYm9BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlOGViYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0lSaWNoVGV4dENvbWJvQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuYWN0aW9ucy5DQ29tYm9Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgcmljaCB0ZXh0IGNvbWJvIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqIAotICogQGRlcHJlY2F0ZWQgdW51c2VkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJpY2hUZXh0Q29tYm9BY3Rpb24gZXh0ZW5kcyBJQmFzZVJpY2hUZXh0QWN0aW9uIHsKLQotLy8JLyoqCi0vLwkgKiBBZGRzIGFuIGl0ZW0uCi0vLwkgKiAKLS8vCSAqIEBwYXJhbSBpdGVtCi0vLwkgKiAgICAgICAgICAgIHRoZSBpdGVtIHRvIGJlIGFkZGVkCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIGFkZEl0ZW0oU3RyaW5nIGl0ZW0pOwotLy8KLS8vCS8qKgotLy8JICogUmV0dXJucyBhbGwgaXRlbXMuCi0vLwkgKiAKLS8vCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgaXRlbXMKLS8vCSAqLwotLy8JcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQsIGludCBpbmRleCk7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKTsKLQkKLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCk7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aW9uJ3MgQ29udHJpYnV0aW9uSXRlbQotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGlvbkl0ZW0oQ0NvbWJvQ29udHJpYnV0aW9uSXRlbSBpdGVtKTsKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSW5kZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZDY0ZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9JbmRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluZGVudEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEluZGVudEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSU5ERU5UKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfSU5ERU5UKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuaW5kZW50QWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLklOREVOVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTg3YzQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgJ2l0YWxpYycgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGFsaWNBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJdGFsaWNBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19JVEFMSUMpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5pdGFsaWNBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXNldENoZWNrZWQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5pc0l0YWxpYygpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLklUQUxJQyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlDZW50ZXJBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUNlbnRlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjFiOTc0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUNlbnRlckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBDZW50ZXIganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeUNlbnRlckFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEp1c3RpZnlDZW50ZXJBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfQ0VOVEVSKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuanVzdGlmeUNlbnRlckFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5KVVNUSUZZX0NFTlRFUik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUZ1bGxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUyYjExNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlGdWxsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIEZ1bGx5IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEp1c3RpZnlGdWxsQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSnVzdGlmeUZ1bGxBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfRlVMTCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmp1c3RpZnlGdWxsQWN0aW9uX3Rvb2xUaXBUZXh0KTsgCi0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfRlVMTCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUxlZnRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeUxlZnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5MTU5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL0p1c3RpZnlMZWZ0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIExlZnQganVzdGlmaWVzIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnVzdGlmeUxlZnRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBKdXN0aWZ5TGVmdEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9MRUZUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuanVzdGlmeUxlZnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9MRUZUKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9KdXN0aWZ5UmlnaHRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeVJpZ2h0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZTA4NTYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvSnVzdGlmeVJpZ2h0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0vKioKLSAqIFJpZ2h0IGp1c3RpZmllcyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEp1c3RpZnlSaWdodEFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEp1c3RpZnlSaWdodEFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9SSUdIVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmp1c3RpZnlSaWdodEFjdGlvbl90b29sVGlwVGV4dCk7IAotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5KVVNUSUZZX1JJR0hUKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9PdXRkZW50QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL091dGRlbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhOTU3My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL091dGRlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogSW5kZW50cyB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE91dGRlbnRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBPdXRkZW50QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihyaWNoVGV4dCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19PVVRERU5UKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfT1VUREVOVCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLm91dGRlbnRBY3Rpb25fdG9vbFRpcFRleHQpOyAKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuT1VUREVOVCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxOGRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZWFiaWxpdHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5DbGlwYm9hcmRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5OZXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuSFRNTFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogUGFzdGVzIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkIG9udG8gYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXN0ZUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0VfVVJMID0gIlNvdXJjZVVSTDoiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNX0VYVCA9ICIuaHRtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfRVhUID0gIi5odG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBIUkVGX1JFRkVSRU5DRVMgPSBQYXR0ZXJuCi0JCQkuY29tcGlsZSgKLQkJCQkJImhyZWZcXHMqPVxccypcIiguKj8pXCIiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUGF0dGVybiBwX2ltYWdlX3JlZiA9IFBhdHRlcm4KLQkJCS5jb21waWxlKAotCQkJCQkiKDwoaW1nfGlmcmFtZSkuKj9zcmNcXHMqPVxccypcIikoLio/KShcIikiLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUgfCBQYXR0ZXJuLkRPVEFMTCk7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHNvdXJjZVVSTFN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExvZ2dlciBsb2dnZXI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFU09VUkNFUyA9ICJyZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBQYXN0ZUFjdGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIocmljaFRleHQsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pOwotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfUEFTVEUpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19QQVNURSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnBhc3RlQWN0aW9uX3Rvb2xUaXBUZXh0KTsKLQkJbG9nZ2VyID0gUmljaFRleHRQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiBzb3VyY2UgZWRpdCBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQljb3B5TGlua1Jlc291cmNlcyhyaWNoVGV4dCk7Ci0JCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcgotCQkJCQkmJiAoKFJpY2hUZXh0RWRpdG9yKSByaWNoVGV4dCkuaXNIVE1MVGFiU2VsZWN0ZWQoKSkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9ICgoUmljaFRleHRFZGl0b3IpIHJpY2hUZXh0KQotCQkJCQkJLmdldFNvdXJjZUVkaXQoKTsKLQkJCQlzdHlsZWRUZXh0LnBhc3RlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5QQVNURSwgc291cmNlVVJMU3RyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvcGllcyB0aGUgbGluayByZXNvdXJjZXMuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29weUxpbmtSZXNvdXJjZXMoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXRyeSB7Ci0JCQlzb3VyY2VVUkxTdHIgPSBDbGlwYm9hcmRVdGlsLmdldEhUTUxTb3VyY2VVUkwoKTsKLQkJCUNsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJCVN0cmluZyBodG1sID0gKFN0cmluZykgY2xpcGJvYXJkLmdldENvbnRlbnRzKEhUTUxUcmFuc2ZlcgotCQkJCQkuZ2V0SW5zdGFuY2UoKSk7Ci0JCQlpZiAoaHRtbCAhPSBudWxsICYmIGh0bWwubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJU3RyaW5nIGJhc2VQYXRoID0gcmljaFRleHQuZ2V0QmFzZVBhdGgoKTsKLQkJCQlVUkwgc291cmNlVVJMID0gbnVsbDsKLQkJCQlpZiAoc291cmNlVVJMU3RyID09IG51bGwgfHwgc291cmNlVVJMU3RyLmxlbmd0aCgpID09IDAKLQkJCQkJCXx8IHNvdXJjZVVSTFN0ci5lcXVhbHMoImFib3V0OmJsYW5rIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzb3VyY2VVUkwgPSByaWNoVGV4dC5nZXRDb3B5VVJMKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc291cmNlVVJMID0gbmV3IFVSTChzb3VyY2VVUkxTdHIpOwotCQkJCX0KLQotCQkJCU1hdGNoZXIgbWF0Y2hlciA9IEhSRUZfUkVGRVJFTkNFUy5tYXRjaGVyKGh0bWwpOwotCQkJCXdoaWxlIChtYXRjaGVyLmZpbmQoKSkgewotCQkJCQlTdHJpbmcgaHJlZiA9IE5ldFV0aWwuZGVjb2RlVVJMKG1hdGNoZXIuZ3JvdXAoMSkpOwotCQkJCQl0cnkgewotCQkJCQkJVVJMIGhyZWZVUkwgPSBuZXcgVVJMKHNvdXJjZVVSTCwgaHJlZik7Ci0JCQkJCQlTdHJpbmcgc2NoZW1lID0gaHJlZlVSTC5nZXRQcm90b2NvbCgpOwotCQkJCQkJaWYgKHNjaGVtZSAhPSBudWxsCi0JCQkJCQkJCSYmIHNjaGVtZQotCQkJCQkJCQkJCS5lcXVhbHNJZ25vcmVDYXNlKE5ldFV0aWwuRklMRV9TQ0hFTUUpKSB7Ci0JCQkJCQkJU3RyaW5nIHVybCA9IGhyZWZVUkwuZ2V0UGF0aCgpOwotCQkJCQkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKE5ldFV0aWwuZGVjb2RlVVJMKHVybCkpOwotCQkJCQkJCUZpbGUgdGd0RmlsZSA9IG51bGw7Ci0JCQkJCQkJRmlsZSB0Z3REaXIgPSBudWxsOwotCQkJCQkJCWlmIChocmVmLnN0YXJ0c1dpdGgoIiMiKSB8fCBzb3VyY2VVUkwuc2FtZUZpbGUoaHJlZlVSTCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl9IGVsc2UgaWYgKGhyZWYuc3RhcnRzV2l0aChSRVNPVVJDRVMpIHx8IGhyZWYuc3RhcnRzV2l0aCgiLi8iICsgUkVTT1VSQ0VTKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRndEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCwgaHJlZik7Ci0JCQkJCQkJCXRndERpciA9IHRndEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCVN0cmluZyByZXNQYXRoID0gZ2V0U3ViZGlyZWN0b3J5T2ZSZXNvdXJjZXMoaHJlZik7Ci0JCQkJCQkJCXRndEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCArIFJFU09VUkNFUywgcmVzUGF0aCk7Ci0JCQkJCQkJCXRndERpciA9IHRndEZpbGU7Ci0JCQkJCQkJfQotCQkJCQkJCXRndERpci5ta2RpcnMoKTsKLQkJCQkJCQlGaWxlVXRpbC5jb3B5RmlsZShzcmNGaWxlLCB0Z3REaXIpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nZ2VyLmxvZ0Vycm9yKGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJbWF0Y2hlciA9IHBfaW1hZ2VfcmVmLm1hdGNoZXIoaHRtbCk7Ci0JCQkJd2hpbGUgKG1hdGNoZXIuZmluZCgpKSB7Ci0JCQkJCVN0cmluZyBzcmMgPSBOZXRVdGlsLmRlY29kZVVSTChtYXRjaGVyLmdyb3VwKDMpKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSTCBzcmNVUkwgPSBuZXcgVVJMKHNvdXJjZVVSTCwgc3JjKTsKLQkJCQkJCVN0cmluZyBzY2hlbWUgPSBzcmNVUkwuZ2V0UHJvdG9jb2woKTsKLQkJCQkJCWlmIChzY2hlbWUgIT0gbnVsbAotCQkJCQkJCQkmJiBzY2hlbWUuZXF1YWxzSWdub3JlQ2FzZShOZXRVdGlsLkZJTEVfU0NIRU1FKSkgewotCQkJCQkJCUZpbGUgc3JjRmlsZSA9IG51bGw7Ci0JCQkJCQkJU3RyaW5nIGF1dGhvcml0eSA9IHNyY1VSTC5nZXRBdXRob3JpdHkoKTsKLQkJCQkJCQlpZiAoYXV0aG9yaXR5ICE9IG51bGwpIHsKLQkJCQkJCQkJc3JjRmlsZSA9IG5ldyBGaWxlKE5ldFV0aWwuZGVjb2RlVVJMKGF1dGhvcml0eSArIHNyY1VSTC5nZXRQYXRoKCkpKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlzcmNGaWxlID0gbmV3IEZpbGUoTmV0VXRpbC5kZWNvZGVVUkwoc3JjVVJMLmdldFBhdGgoKSkpOwotCQkJCQkJCX0KLQkJCQkJCQlGaWxlIHRndEZpbGUgPSBudWxsOwotCQkJCQkJCUZpbGUgdGd0RGlyID0gbnVsbDsKLQkJCQkJCQlpZiAoc3JjLnN0YXJ0c1dpdGgoUkVTT1VSQ0VTKSB8fCBzcmMuc3RhcnRzV2l0aCgiLi8iICsgUkVTT1VSQ0VTKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXRndEZpbGUgPSBuZXcgRmlsZShiYXNlUGF0aCwgc3JjKTsKLQkJCQkJCQkJdGd0RGlyID0gdGd0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJU3RyaW5nIHJlc1BhdGggPSBnZXRTdWJkaXJlY3RvcnlPZlJlc291cmNlcyhzcmMpOwotCQkJCQkJCQl0Z3RGaWxlID0gbmV3IEZpbGUoYmFzZVBhdGggKyBSRVNPVVJDRVMsIHJlc1BhdGgpOwotCQkJCQkJCQl0Z3REaXIgPSB0Z3RGaWxlOwotCQkJCQkJCX0KLQkJCQkJCQl0Z3REaXIubWtkaXJzKCk7Ci0JCQkJCQkJRmlsZVV0aWwuY29weUZpbGUoc3JjRmlsZSwgdGd0RGlyKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgZ2l2ZW4gSFRNTCBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZCBhbmQgcmV0dXJucyB0aGUgc291cmNlCi0JICogVVJMLgotCSAqIAotCSAqIEBwYXJhbSBodG1sQ29udGVudAotCSAqICAgICAgICAgICAgdGhlIEhUTUwgY29udGVudCBmcm9tIHRoZSBjbGlwYm9hcmQKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgVVJMIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VVUkwoU3RyaW5nIGh0bWxDb250ZW50KSB7Ci0JCVN0cmluZyBzb3VyY2VVUkwgPSBudWxsOwotCQlpbnQgc291cmNlVVJMSW5kZXggPSBodG1sQ29udGVudC5pbmRleE9mKFNPVVJDRV9VUkwpOwotCQlpZiAoc291cmNlVVJMSW5kZXggPiAwKSB7Ci0JCQlzb3VyY2VVUkwgPSBodG1sQ29udGVudC5zdWJzdHJpbmcoc291cmNlVVJMSW5kZXgKLQkJCQkJKyBTT1VSQ0VfVVJMLmxlbmd0aCgpKTsKLQkJCXNvdXJjZVVSTCA9IHNvdXJjZVVSTC5zdWJzdHJpbmcoMCwgc291cmNlVVJMCi0JCQkJCS5pbmRleE9mKEZpbGVVdGlsLkxJTkVfU0VQKSk7Ci0JCQlpZiAoc291cmNlVVJMLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSFRNX0VYVCkKLQkJCQkJfHwgc291cmNlVVJMLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoSFRNTF9FWFQpKSB7Ci0JCQkJc291cmNlVVJMID0gc291cmNlVVJMLnN1YnN0cmluZygwLCBzb3VyY2VVUkwuaW5kZXhPZihGaWxlVXRpbAotCQkJCQkJLmdldEZpbGVOYW1lKHNvdXJjZVVSTCkpIC0gMSk7Ci0JCQkJc291cmNlVVJMID0gc291cmNlVVJMLnJlcGxhY2UoJ1xcJywgJy8nKTsKLQkJCX0KLQkJCXNvdXJjZVVSTCA9IEZpbGVVdGlsLmFwcGVuZFNlcGFyYXRvcihzb3VyY2VVUkwsICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc291cmNlVVJMOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3ViZGlyZWN0b3J5T2ZSZXNvdXJjZXMoU3RyaW5nIHBhdGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWludCByZXNfaWR4ID0gcGF0aC5pbmRleE9mKFJFU09VUkNFUyk7Ci0JCWlmIChyZXNfaWR4ICE9IC0xKSB7Ci0JCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gbmV3IFN0YWNrPFN0cmluZz4oKTsKLQkJCUZpbGUgcmVsYXRpdmUgPSBuZXcgRmlsZShwYXRoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQl3aGlsZSAoIXJlbGF0aXZlLmdldE5hbWUoKS5lcXVhbHMoUkVTT1VSQ0VTKSkgewotCQkJCXN0YWNrLnB1c2gocmVsYXRpdmUuZ2V0TmFtZSgpKTsKLQkJCQlyZWxhdGl2ZSA9IHJlbGF0aXZlLmdldFBhcmVudEZpbGUoKTsKLQkJCX0KLQkJCXdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0ICsgKFN0cmluZylzdGFjay5wb3AoKSArIEZpbGUuc2VwYXJhdG9yOwotCQkJfQotCQl9IAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVQbGFpblRleHRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUGFzdGVQbGFpblRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjNzFjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1Bhc3RlUGxhaW5UZXh0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgUGFzdGVQbGFpblRleHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUGFzdGVQbGFpblRleHRBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1BBU1RFX1BMQUlOX1RFWFQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19QQVNURV9QTEFJTl9URVhUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMucGFzdGVQbGFpblRleHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQlzZXRFbmFibGVkKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgYWN0aW9uIHNob3VsZCBiZSBkaXNhYmxlZCB3aGVuIHRoZQotCSAqIHJpY2ggdGV4dCBlZGl0b3IgaXMgaW4gc291cmNlIGVkaXQgbW9kZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkaXNhYmxlSW5Tb3VyY2VNb2RlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgdGV4dCBmcm9tIGNsaXBib2FyZAotCQkJQ2xpcGJvYXJkIGNsaXBib2FyZCA9IG5ldyBDbGlwYm9hcmQoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBjbGlwYm9hcmQuZ2V0Q29udGVudHMoVGV4dFRyYW5zZmVyCi0JCQkJCS5nZXRJbnN0YW5jZSgpKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCQl0ZXh0ID0gU3RyVXRpbC5jb252ZXJ0TmV3bGluZXNUb0hUTUwodGV4dCk7Ci0JCQkJaWYgKHJpY2hUZXh0IGluc3RhbmNlb2YgUmljaFRleHRFZGl0b3IpIHsKLQkJCQkJKChSaWNoVGV4dEVkaXRvcilyaWNoVGV4dCkuYWRkSFRNTCh0ZXh0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0hUTUwsIHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVmYmMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xJdGVtOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIHJpY2ggdGV4dCBhY3Rpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCXByb3RlY3RlZCBUb29sSXRlbSB0b29sSXRlbTsKLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxJQWN0aW9uPiBmTWVudUFjdGlvbnMgPSBuZXcgTGlua2VkSGFzaFNldDxJQWN0aW9uPigpOwotCQotICAgIHByb3RlY3RlZCBJTWVudUNyZWF0b3IgbWVudUNyZWF0b3IgPSBuZXcgSU1lbnVDcmVhdG9yKCkgewotCi0gICAgCXByaXZhdGUgTWVudU1hbmFnZXIgZHJvcERvd25NZW51TWdyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIHRoZSBtZW51IG1hbmFnZXIgZm9yIHRoZSBkcm9wLWRvd24uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlRHJvcERvd25NZW51TWdyKCkgewotICAgICAgICAgICAgaWYgKGRyb3BEb3duTWVudU1nciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxJQWN0aW9uPiBpdGVyID0gZ2V0TWVudUFjdGlvbnMoKS5pdGVyYXRvcigpO2l0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIAlJQWN0aW9uIGl0ZW0gPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyLmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvciNnZXRNZW51KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVudSBnZXRNZW51KENvbnRyb2wgcGFyZW50KSB7Ci0gICAgICAgICAgICBjcmVhdGVEcm9wRG93bk1lbnVNZ3IoKTsKLSAgICAgICAgICAgIHJldHVybiBkcm9wRG93bk1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yI2dldE1lbnUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudSkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLSAgICAgICAgICAgIGNyZWF0ZURyb3BEb3duTWVudU1ncigpOwotICAgICAgICAgICAgTWVudSBtZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLSAgICAgICAgICAgIElDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBkcm9wRG93bk1lbnVNZ3IuZ2V0SXRlbXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gaXRlbXNbaV07Ci0gICAgICAgICAgICAgICAgSUNvbnRyaWJ1dGlvbkl0ZW0gbmV3SXRlbSA9IGl0ZW07Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBBY3Rpb25Db250cmlidXRpb25JdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0gPSBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW0pLmdldEFjdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3SXRlbS5maWxsKG1lbnUsIC0xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtZW51OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IjZGlzcG9zZSgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaWYgKGRyb3BEb3duTWVudU1nciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZHJvcERvd25NZW51TWdyLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICBkcm9wRG93bk1lbnVNZ3IgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0QWN0aW9uKElSaWNoVGV4dCByaWNoVGV4dCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKG51bGwsIHN0eWxlKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkIHdoZW4gdGhlCi0JICogcmljaCB0ZXh0IGVkaXRvciBpcyBpbiByZWFkb25seSBtb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblJlYWRPbmx5TW9kZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBzaG91bGQgYmUgZGlzYWJsZWQgd2hlbiB0aGUKLQkgKiByaWNoIHRleHQgZWRpdG9yIGlzIGluIHNvdXJjZSBlZGl0IG1vZGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VG9vbEl0ZW0oVG9vbEl0ZW0gdG9vbEl0ZW0pIHsKLQkJdGhpcy50b29sSXRlbSA9IHRvb2xJdGVtOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWV4ZWN1dGUocmljaFRleHQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPElBY3Rpb24+IGdldE1lbnVBY3Rpb25zKCkgewotCQlyZXR1cm4gZk1lbnVBY3Rpb25zOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb25Ub01lbnUoSUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1lbnVBY3Rpb25zLmFkZChhY3Rpb24pOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1JpY2hUZXh0Q29tYm9BY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRDb21ib0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI5NmQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvUmljaFRleHRDb21ib0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLmFjdGlvbnMuQ0NvbWJvQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgcmljaCB0ZXh0IGNvbWJvIGFjdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJpY2hUZXh0Q29tYm9BY3Rpb24gZXh0ZW5kcyBDQ29tYm9Db250cmlidXRpb25JdGVtIHsKLQkKLQlwcm90ZWN0ZWQgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCXByb3RlY3RlZCBTdHJpbmcgdG9vbFRpcFRleHQ7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnMgPSBmYWxzZTsKLQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJpY2hUZXh0Ci0JICogICAgICAgICAgICBhIHJpY2ggdGV4dCBjb250cm9sCi0JICovCi0JcHVibGljIFJpY2hUZXh0Q29tYm9BY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgUmljaFRleHRDb21ib0FjdGlvbihJUmljaFRleHQgcmljaFRleHQsIGludCBzdHlsZSkgewotCQlzdXBlcihTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQgfCBTV1QuQk9SREVSIHwgc3R5bGUpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpOwotCQotCXB1YmxpYyBhYnN0cmFjdCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SW5wdXQoKTsKLQkKLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzZXRJbnB1dChnZXRJbnB1dCgpKTsKLQkJc2V0Tm90aWZ5TGlzdGVuZXJzKHRydWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENDb21ib1NlbGVjdGlvbigpIHsKLQkJaWYgKGdldENDb21ibygpICE9IG51bGwpIHsKLQkJCWludCBpbmRleCA9IGdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlyZXR1cm4gZ2V0Q0NvbWJvKCkuZ2V0SXRlbShpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRvb2wgdGlwIGZvciB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRvb2wgdGlwIHRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdG9vbCB0aXAgZm9yIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHRvb2xUaXBUZXh0Ci0JICogICAgICAgICAgICB0aGUgdG9vbCB0aXAgdGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0b29sVGlwVGV4dCkgewotCQl0aGlzLnRvb2xUaXBUZXh0ID0gdG9vbFRpcFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5hYmxlZCBzdGF0dXMgb2YgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGVuYWJsZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBlbmFibGUgdGhlIGFjdGlvbi4gaWYKLQkgKiAgICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgZGlzYWJsZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaWYgKG5vdGlmeUxpc3RlbmVycykgewotCQkJZXhlY3V0ZShyaWNoVGV4dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdGlmeUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5vdGlmeUxpc3RlbmVyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb3RpZnlMaXN0ZW5lcnMoYm9vbGVhbiBub3RpZnlMaXN0ZW5lcnMpIHsKLQkJdGhpcy5ub3RpZnlMaXN0ZW5lcnMgPSBub3RpZnlMaXN0ZW5lcnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvU3Vic2NyaXB0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWMwZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSBzdWJzY3JpcHQgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJzY3JpcHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19TVUJTQ1JJUFQpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19TVUJTQ1JJUFQpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy5zdWJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXNldENoZWNrZWQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5pc1N1YnNjcmlwdCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlNVQlNDUklQVCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1cGVyc2NyaXB0QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1N1cGVyc2NyaXB0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjQ0ZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9TdXBlcnNjcmlwdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlIHN1cGVyc2NyaXB0IGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dCBpbiBhIHJpY2ggdGV4dAotICogY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN1cGVyc2NyaXB0QWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3VwZXJzY3JpcHRBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19TVVBFUlNDUklQVCk7Ci0JCXNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLkRJU0FCTEVEX0lNR19ERVNDX1NVUEVSU0NSSVBUKTsKLQkJc2V0VG9vbFRpcFRleHQoUmljaFRleHRSZXNvdXJjZXMuc3VwZXJzY3JpcHRBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXNldENoZWNrZWQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5pc1N1cGVyc2NyaXB0KCkpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgYWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgYSByaWNoIHRleHQgY29udHJvbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VQRVJTQ1JJUFQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlY2UxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLkhUTUxGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLQotLyoqCi0gKiBSdW5zIEpUaWR5IG9uIHRoZSBIVE1MCi0gKiAKLSAqIEBhdXRob3IgSmVmZiBIYXJkeQotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgVGlkeUFjdGlvbiBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQkKLQlib29sZWFuIGZvcmNlT3V0cHV0ID0gZmFsc2U7Ci0JYm9vbGVhbiBtYWtlQmFyZSA9IGZhbHNlOwotCWJvb2xlYW4gd29yZDIwMDAgPSBmYWxzZTsKLQkKLQkvLyBUaGUgSFRNTCBzb3VyY2UgZm9ybWF0dGVyLgotCXByb3RlY3RlZCBIVE1MRm9ybWF0dGVyIGh0bWxGb3JtYXR0ZXI7Ci0KLQkKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRpZHlBY3Rpb24oSVJpY2hUZXh0IHJpY2hUZXh0LCBib29sZWFuIGZvcmNlT3V0cHV0LCBib29sZWFuIG1ha2VCYXJlLCBib29sZWFuIHdvcmQyMDAwKSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKLQkJdGhpcy5mb3JjZU91dHB1dCA9IGZvcmNlT3V0cHV0OwotCQl0aGlzLm1ha2VCYXJlID0gbWFrZUJhcmU7Ci0JCXRoaXMud29yZDIwMDAgPSB3b3JkMjAwMDsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1RJRFkpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19USURZKTsKLQkJaHRtbEZvcm1hdHRlciA9IG5ldyBIVE1MRm9ybWF0dGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCS8vIGdldCBjdXJyZW50IHRleHQKLQkJU3RyaW5nIGh0bWw7Ci0JCWlmIChyaWNoVGV4dCBpbnN0YW5jZW9mIFJpY2hUZXh0RWRpdG9yKSB7Ci0JCQlodG1sID0gKChSaWNoVGV4dEVkaXRvcilyaWNoVGV4dCkuZ2V0VGV4dCgpOwotCQl9IGVsc2UgewotCQkJaHRtbCA9IHJpY2hUZXh0LmdldFRleHQoKTsKLQkJfQotCQkvLyBjYWxsIEpUaWR5IHdpdGggdGhlIG9wdGlvbnMKLQkJdHJ5IHsKLQkJCWh0bWwgPSBodG1sRm9ybWF0dGVyLmZvcm1hdEhUTUwoaHRtbCwgZmFsc2UsIGZvcmNlT3V0cHV0LCBtYWtlQmFyZSwgd29yZDIwMDApOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCVJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCQkvLyBzZXQgdGV4dAotCQlpZiAocmljaFRleHQgaW5zdGFuY2VvZiBSaWNoVGV4dEVkaXRvcikgewotCQkJKChSaWNoVGV4dEVkaXRvcilyaWNoVGV4dCkuc2V0VGV4dChodG1sKTsKLQkJfSBlbHNlIHsKLQkJCXJpY2hUZXh0LnNldFRleHQoaHRtbCk7Ci0JCX0KLQkJcmljaFRleHQuY2hlY2tNb2RpZnkoKTsKLQkJCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGRpc2FibGVJblNvdXJjZU1vZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb25Hcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9UaWR5QWN0aW9uR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4Y2FiMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL1RpZHlBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci0KLS8qKgotICogUnVucyBKVGlkeSBvbiB0aGUgSFRNTAotICogCi0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFRpZHlBY3Rpb25Hcm91cCBleHRlbmRzIFJpY2hUZXh0QWN0aW9uIHsKLQkKLQlUaWR5QWN0aW9uIHRpZHlBY3Rpb25EZWZhdWx0OwotCVRpZHlBY3Rpb24gdGlkeUFjdGlvbkNsZWFuTVM7Ci0JVGlkeUFjdGlvbiB0aWR5QWN0aW9uQ2xlYW5Xb3JkMjAwMDsKLQotCXB1YmxpYyBUaWR5QWN0aW9uR3JvdXAoSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0RST1BfRE9XTl9NRU5VKTsKLQkJLy8gVE9ETyBuZWVkIGltYWdlCi0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19USURZKTsKLQkJLy8gVE9ETyBuZWVkIGltYWdlCi0vLwkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuRElTQUJMRURfSU1HX0RFU0NfUEFTVEUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuX3RleHQpOwotCQkKLQkJY3JlYXRlQWN0aW9ucygpOwotCQlzZXRNZW51Q3JlYXRvcihtZW51Q3JlYXRvcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQl0aWR5QWN0aW9uRGVmYXVsdCA9IG5ldyBUaWR5QWN0aW9uKHJpY2hUZXh0LCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQl0aWR5QWN0aW9uRGVmYXVsdC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5fdGV4dCk7Ci0JCXRpZHlBY3Rpb25EZWZhdWx0LnNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRpZHlfY2xlYW5fdG9vbFRpcFRleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5NUyA9IG5ldyBUaWR5QWN0aW9uKHJpY2hUZXh0LCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0JCXRpZHlBY3Rpb25DbGVhbk1TLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMudGlkeV9jbGVhbmVyX3RleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5NUy5zZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuZXJfdG9vbFRpcFRleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5Xb3JkMjAwMCA9IG5ldyBUaWR5QWN0aW9uKHJpY2hUZXh0LCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkJdGlkeUFjdGlvbkNsZWFuV29yZDIwMDAuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuZXN0X3RleHQpOwotCQl0aWR5QWN0aW9uQ2xlYW5Xb3JkMjAwMC5zZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy50aWR5X2NsZWFuZXN0X3Rvb2xUaXBUZXh0KTsKLQkJYWRkQWN0aW9uVG9NZW51KHRpZHlBY3Rpb25EZWZhdWx0KTsKLQkJYWRkQWN0aW9uVG9NZW51KHRpZHlBY3Rpb25DbGVhbk1TKTsKLQkJYWRkQWN0aW9uVG9NZW51KHRpZHlBY3Rpb25DbGVhbldvcmQyMDAwKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJUmljaFRleHQgcmljaFRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkKLQkJLy8gY2FsbCBub3JtYWwgY2xlYW4KLQkJdGlkeUFjdGlvbkRlZmF1bHQuZXhlY3V0ZShyaWNoVGV4dCk7Ci0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZGlzYWJsZUluU291cmNlTW9kZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9VbmRlcmxpbmVBY3Rpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlN2RiMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvYWN0aW9ucy9VbmRlcmxpbmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSB1bmRlcmxpbmUgYXR0cmlidXRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgcmljaCB0ZXh0IGNvbnRyb2wuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKZWZmIEhhcmR5Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmRlcmxpbmVBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBVbmRlcmxpbmVBY3Rpb24oZmluYWwgSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKHJpY2hUZXh0LCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19VTkRFUkxJTkUpOwotCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5ESVNBQkxFRF9JTUdfREVTQ19VTkRFUkxJTkUpOwotCQlzZXRUb29sVGlwVGV4dChSaWNoVGV4dFJlc291cmNlcy51bmRlcmxpbmVBY3Rpb25fdG9vbFRpcFRleHQpOwotCQkvLyBhZGQgbGlzdGVuZXIKLQkJcmljaFRleHQuYWRkTGlzdGVuZXIoU1dULlNFTEVDVEVELCBuZXcgTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJCXNldENoZWNrZWQocmljaFRleHQuZ2V0U2VsZWN0ZWQoKS5pc1VuZGVyTGluZSgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmljaFRleHQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbnRyb2wKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLlVOREVSTElORSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9hY3Rpb25zL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Q5ZTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2FjdGlvbnMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgZWRpdGluZyBhY3Rpb25zIGZvciB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZEltYWdlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZEltYWdlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNmE2MzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRJbWFnZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQcm9tcHRzIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIGltYWdlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqICZsdDtpbWFnZSZndDsgdGFnIGluIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFkZEltYWdlRGlhbG9nIGV4dGVuZHMgQmFzZURpYWxvZyB7Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKLQotCXByb3RlY3RlZCBUZXh0IHVybFRleHQ7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGJyb3dzZUJ1dHRvbjsKLQotCXByb3RlY3RlZCBTZWxlY3Rpb25BZGFwdGVyIGJyb3dzZVNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJCQkJLmdldEFjdGl2ZVNoZWxsKCksIFNXVC5PUEVOKTsKLQkJCWRpYWxvZwotCQkJCQkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10gewotCQkJCQkJCSIqLmdpZiIsICIqLmpwZyIsICIqLmJtcCIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTdHJpbmcgaW1hZ2VGaWxlID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChpbWFnZUZpbGUgIT0gbnVsbCAmJiBpbWFnZUZpbGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoaW1hZ2VGaWxlKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgdXJsID0gZmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJCXVybFRleHQuc2V0VGV4dCh1cmwpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWxvZ2dlci5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIHVybFRleHRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQodXJsVGV4dC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID4gMCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHVibGljIEFkZEltYWdlRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQotCQlMYWJlbCB1cmxMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy51cmxMYWJlbF90ZXh0KTsKLQkJdXJsVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJdXJsVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdXJsVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih1cmxUZXh0TGlzdGVuZXIpOwotCi0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJyb3dzZUJ1dHRvbl90ZXh0KTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJyb3dzZVNlbGVjdGlvbkFkYXB0ZXIpOwotCi0JCXN1cGVyLmdldFNoZWxsKCkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5hZGRJbWFnZURpYWxvZ190aXRsZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmxUZXh0LmdldFRleHQoKTsKLQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJCWltYWdlLnNldFVSTCh1cmwpOwotCQl9Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHVzZXIgc3BlY2lmaWVkIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGNvZGU+SW1hZ2U8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkTGlua0RpYWxvZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRMaW5rRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzZmMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9BZGRMaW5rRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIEhUTUwKLSAqICZsdDthJmd0OyB0YWcgaW4gdGhlIHJpY2ggdGV4dCBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkTGlua0RpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJvdGVjdGVkIExpbmsgbGluayA9IG5ldyBMaW5rKCk7Ci0KLQlwcm90ZWN0ZWQgVGV4dCB1cmxUZXh0OwotCi0JcHJvdGVjdGVkIFN0cmluZyBiYXNlUGF0aDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY29tcG9zaXRlOwotCi0JcHJvdGVjdGVkIExhYmVsIHVybExhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgdXJsRGlzcGxheU5hbWVUZXh0OwotCi0JcHJvdGVjdGVkIExhYmVsIHVybERpc3BsYXlOYW1lTGFiZWw7Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgdXJsVGV4dE1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh1cmxUZXh0LmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPiAwKTsKLQkJCX0KLQkJfQotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgQWRkTGlua0RpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyBiYXNlUGF0aCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQl1cmxMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdXJsTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy51cmxMYWJlbF90ZXh0KTsKLQkJdXJsVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDMwMDsKLQkJdXJsVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdXJsVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcih1cmxUZXh0TW9kaWZ5TGlzdGVuZXIpOwotCi0JCXVybERpc3BsYXlOYW1lTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXVybERpc3BsYXlOYW1lTGFiZWwuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy51cmxEaXNwbGF5TmFtZUxhYmVsX3RleHQpOwotCQl1cmxEaXNwbGF5TmFtZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBncmlkRGF0YTIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEyLndpZHRoSGludCA9IDMwMDsKLQkJdXJsRGlzcGxheU5hbWVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEyKTsKLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkTGlua0RpYWxvZ190aXRsZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihwYXJlbnQpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyB1cmwgPSB1cmxUZXh0LmdldFRleHQoKTsKLQkJaWYgKHVybCAhPSBudWxsICYmIHVybC5sZW5ndGgoKSA+IDApIHsKLQkJCWxpbmsuc2V0VVJMKHVybCk7Ci0JCQlsaW5rLnNldE5hbWUodXJsRGlzcGxheU5hbWVUZXh0LmdldFRleHQoKSk7Ci0JCX0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgbGluay4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPkxpbms8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBMaW5rIGdldExpbmsoKSB7Ci0JCXJldHVybiBsaW5rOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkVGFibGVEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQWRkVGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4M2QzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0FkZFRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFByb21wdHMgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBIVE1MCi0gKiAmbHQ7dGFibGUmZ3Q7IHRhZyBpbiB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRUYWJsZURpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUk9XUyA9IDI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT0xVTU5TID0gMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dJRFRIID0gIjg1JSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRBQkxFX1NUWUxFX0xBQkVMUyA9IHsKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyTm9uZV90ZXh0LAotCQkJUmljaFRleHRSZXNvdXJjZXMudGFibGVIZWFkZXJDb2xzX3RleHQsCi0JCQlSaWNoVGV4dFJlc291cmNlcy50YWJsZUhlYWRlclJvd3NfdGV4dCwKLQkJCVJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlSGVhZGVyQm90aF90ZXh0LCB9OwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSgpOwotCi0JcHJpdmF0ZSBUZXh0IHJvd3NUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IGNvbHNUZXh0OwotCi0JcHJpdmF0ZSBUZXh0IHdpZHRoVGV4dDsKLQotCXByaXZhdGUgQ29tYm8gdGFibGVUeXBlQ29tYm87Ci0KLQlwcml2YXRlIFRleHQgc3VtbWFyeVRleHQ7Ci0KLQlwcml2YXRlIFRleHQgY2FwdGlvblRleHQ7Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWludCByb3dzID0gSW50ZWdlci5wYXJzZUludChyb3dzVGV4dC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCQkJaW50IGNvbHMgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbHNUZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCQlTdHJpbmcgd2lkdGggPSB3aWR0aFRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChyb3dzID4gMCAmJiBjb2xzID4gMAotCQkJCQkJCSYmIHdpZHRoLmxlbmd0aCgpID4gMCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBBZGRUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQotCQlMYWJlbCByb3dzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXJvd3NMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnJvd3NMYWJlbF90ZXh0KTsKLQotCQlyb3dzVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXJvd3NUZXh0LnNldFRleHRMaW1pdCgyKTsKLQkJcm93c1RleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfUk9XUyk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCXJvd3NUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCXJvd3NUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBjb2xzTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbHNMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNvbHVtbnNMYWJlbF90ZXh0KTsKLQotCQljb2xzVGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWNvbHNUZXh0LnNldFRleHRMaW1pdCgyKTsKLQkJY29sc1RleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfQ09MVU1OUyk7IC8vJE5PTi1OTFMtMSQKLQkJewotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMCi0JCQkJCXwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJCWNvbHNUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl9Ci0JCWNvbHNUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCB3aWR0aExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl3aWR0aExhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMud2lkdGhMYWJlbF90ZXh0KTsKLQotCQl3aWR0aFRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl3aWR0aFRleHQuc2V0VGV4dCgiIiArIERFRkFVTFRfV0lEVEgpOyAvLyROT04tTkxTLTEkCi0JCXsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTAotCQkJCQl8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCQl3aWR0aFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQkJd2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQlMYWJlbCBoZWFkZXJUeXBlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWhlYWRlclR5cGVMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnRhYmxlU3R5bGVMYWJlbF90ZXh0KTsKLQotCQl0YWJsZVR5cGVDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJdGFibGVUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRhYmxlVHlwZUNvbWJvLnNldEl0ZW1zKFRBQkxFX1NUWUxFX0xBQkVMUyk7Ci0JCXRhYmxlVHlwZUNvbWJvLnNldFRleHQoVEFCTEVfU1RZTEVfTEFCRUxTWzBdKTsKLQotCQlMYWJlbCBzdW1tYXJ5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXN1bW1hcnlMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnN1bW1hcnlMYWJlbF90ZXh0KTsKLQkJc3VtbWFyeVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJc3VtbWFyeVRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlMYWJlbCBjYXB0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNhcHRpb25MYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNhcHRpb25MYWJlbF90ZXh0KTsKLQkJY2FwdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQl7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwKLQkJCQkJfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQkJY2FwdGlvblRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCX0KLQotCQlzdXBlci5nZXRTaGVsbCgpLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuYWRkVGFibGVEaWFsb2dfdGl0bGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZyByb3dzVmFsdWUgPSByb3dzVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChyb3dzVmFsdWUgIT0gbnVsbCAmJiByb3dzVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWludCByb3dzID0gSW50ZWdlci5wYXJzZUludChyb3dzVmFsdWUpOwotCQkJCXRhYmxlLnNldFJvd3Mocm93cyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRhYmxlLnNldFJvd3MoREVGQVVMVF9ST1dTKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyBjb2xzVmFsdWUgPSBjb2xzVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChjb2xzVmFsdWUgIT0gbnVsbCAmJiBjb2xzVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCWludCBjb2xzID0gSW50ZWdlci5wYXJzZUludChjb2xzVmFsdWUpOwotCQkJCXRhYmxlLnNldENvbHVtbnMoY29scyk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRhYmxlLnNldENvbHVtbnMoREVGQVVMVF9DT0xVTU5TKTsKLQkJCX0KLQkJfQotCi0JCVN0cmluZyB3aWR0aFZhbHVlID0gd2lkdGhUZXh0LmdldFRleHQoKTsKLQkJaWYgKHdpZHRoVmFsdWUgIT0gbnVsbCAmJiB3aWR0aFZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJdGFibGUuc2V0V2lkdGgod2lkdGhWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0YWJsZS5zZXRXaWR0aChERUZBVUxUX1dJRFRIKTsKLQkJfQotCi0JCXRhYmxlLnNldFN1bW1hcnkoc3VtbWFyeVRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCXRhYmxlLnNldENhcHRpb24oY2FwdGlvblRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCXRhYmxlLnNldFRhYmxlSGVhZGVycyh0YWJsZVR5cGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB1c2VyIHNwZWNpZmllZCB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPlRhYmxlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgVGFibGUgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0Jhc2VEaWFsb2cuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2MzOWM4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2RpYWxvZ3MvQmFzZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2VhYmlsaXR5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIGRpYWxvZ3MgdXNlZCBieSB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCS8vIEEgbG9nZ2VyIGZvciBsb2dnaW5nIHJ1bnRpbWUgd2FybmluZ3MgYW5kIGVycm9ycy4KLQlwcm90ZWN0ZWQgTG9nZ2VyIGxvZ2dlcjsKLQotCS8vIFRoZSBPSyBidXR0b24uCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCS8vIFRoZSBDYW5jZWwgYnV0dG9uLgotCXByb3RlY3RlZCBCdXR0b24gY2FuY2VsQnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHVibGljIEJhc2VEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWxvZ2dlciA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb21wb3NpdGUuZ2V0TGF5b3V0RGF0YSgpOwotCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDEwOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgdGhlIE9LIGJ1dHRvbi4KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIE9LIGJ1dHRvbi4KLQkJb2tCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7Ci0KLQkJLy8gU2V0IGhlbHAgY29udGV4dCBmb3IgdGhlIENhbmNlbCBidXR0b24uCi0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0ZpbmRSZXBsYWNlRGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL0ZpbmRSZXBsYWNlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjQwMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9GaW5kUmVwbGFjZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkZpbmRSZXBsYWNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogUHJvbXB0cyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBzZWFyY2ggYW5kIHJlcGxhY2Ugc3RyaW5ncyBhbmQgb3B0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaW5kUmVwbGFjZURpYWxvZyBleHRlbmRzIEJhc2VEaWFsb2cgewotCi0JcHJpdmF0ZSBGaW5kUmVwbGFjZUFjdGlvbiBmaW5kUmVwbGFjZUFjdGlvbjsKLQotCXByaXZhdGUgYm9vbGVhbiBmaW5kT25seTsKLQotCXByaXZhdGUgVGV4dCBmaW5kVGV4dDsKLQotCXByaXZhdGUgVGV4dCByZXBsYWNlVGV4dDsKLQotCXByaXZhdGUgQnV0dG9uIHNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbjsKLQotCXByaXZhdGUgQnV0dG9uIHNlYXJjaEJhY2t3YXJkUmFkaW9CdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiBjYXNlU2Vuc2l0aXZlQ2hlY2tib3g7Ci0KLQlwcml2YXRlIEJ1dHRvbiB3aG9sZVdvcmRDaGVja2JveDsKLQotCXByaXZhdGUgQnV0dG9uIGZpbmRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiByZXBsYWNlQnV0dG9uOwotCi0JcHJpdmF0ZSBCdXR0b24gcmVwbGFjZUZpbmRCdXR0b247Ci0KLQlwcml2YXRlIEJ1dHRvbiByZXBsYWNlQWxsQnV0dG9uOwotCi0JcHJpdmF0ZSBMYWJlbCBzdGF0dXNMYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBmaW5kUmVwbGFjZUFjdGlvbgotCSAqICAgICAgICAgICAgdGhlIEZpbmQgYW5kIFJlcGxhY2UgYWN0aW9uCi0JICogQHBhcmFtIGZpbmRPbmx5Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZGlzYWJsZSB0aGUgcmVwbGFjZSBhbmQgcmVwbGFjZSBhbGwKLQkgKiAgICAgICAgICAgIGZ1bmN0aW9uYWxpdGllcwotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZURpYWxvZyhTaGVsbCBwYXJlbnQsIEZpbmRSZXBsYWNlQWN0aW9uIGZpbmRSZXBsYWNlQWN0aW9uLAotCQkJYm9vbGVhbiBmaW5kT25seSkgewotCQlzdXBlcihwYXJlbnQpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5ESUFMT0dfVFJJTSB8IFNXVC5NT0RFTEVTUyB8IGdldERlZmF1bHRPcmllbnRhdGlvbigpKTsKLQkJc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotCQl0aGlzLmZpbmRSZXBsYWNlQWN0aW9uID0gZmluZFJlcGxhY2VBY3Rpb247Ci0JCXRoaXMuZmluZE9ubHkgPSBmaW5kT25seTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0KLQkJQ29tcG9zaXRlIHRleHRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl0ZXh0Q29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl0ZXh0Q29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGZpbmRMYWJlbCA9IG5ldyBMYWJlbCh0ZXh0Q29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZpbmRMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZpbmRMYWJlbF90ZXh0KTsKLQkJZmluZFRleHQgPSBuZXcgVGV4dCh0ZXh0Q29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjAwOwotCQlmaW5kVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJZmluZFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKGZpbmRCdXR0b24gIT0gbnVsbCkgewotCQkJCQlmaW5kQnV0dG9uCi0JCQkJCQkJLnNldEVuYWJsZWQoZmluZFRleHQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCQlpZiAocmVwbGFjZUFsbEJ1dHRvbiAhPSBudWxsICYmICFmaW5kT25seSkgewotCQkJCQlyZXBsYWNlQWxsQnV0dG9uLnNldEVuYWJsZWQoZmluZFRleHQuZ2V0VGV4dCgpLnRyaW0oKQotCQkJCQkJCS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJTGFiZWwgcmVwbGFjZUxhYmVsID0gbmV3IExhYmVsKHRleHRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcmVwbGFjZUxhYmVsLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMucmVwbGFjZUxhYmVsX3RleHQpOwotCQlyZXBsYWNlVGV4dCA9IG5ldyBUZXh0KHRleHRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlyZXBsYWNlVGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJaWYgKGZpbmRPbmx5KSB7Ci0JCQlyZXBsYWNlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXJlcGxhY2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJaWYgKHJlcGxhY2VCdXR0b24gIT0gbnVsbCkgewotCQkJCQkJcmVwbGFjZUJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uCi0JCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQl9Ci0JCQkJCWlmIChyZXBsYWNlRmluZEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uCi0JCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlDb21wb3NpdGUgb3B0aW9uc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW9wdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJb3B0aW9uc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlHcm91cCBkaXJlY3Rpb25Hcm91cCA9IG5ldyBHcm91cChvcHRpb25zQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRpcmVjdGlvbkdyb3VwLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZGlyZWN0aW9uR3JvdXBfdGV4dCk7Ci0JCWRpcmVjdGlvbkdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlkaXJlY3Rpb25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc2VhcmNoRm9yd2FyZFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihkaXJlY3Rpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJc2VhcmNoRm9yd2FyZFJhZGlvQnV0dG9uCi0JCQkJLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMuZm9yd2FyZFJhZGlvQnV0dG9uX3RleHQpOwotCQlzZWFyY2hGb3J3YXJkUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlzZWFyY2hCYWNrd2FyZFJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihkaXJlY3Rpb25Hcm91cCwgU1dULlJBRElPKTsKLQkJc2VhcmNoQmFja3dhcmRSYWRpb0J1dHRvbgotCQkJCS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJhY2t3YXJkUmFkaW9CdXR0b25fdGV4dCk7Ci0KLQkJR3JvdXAgb3B0aW9uc0dyb3VwID0gbmV3IEdyb3VwKG9wdGlvbnNDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJb3B0aW9uc0dyb3VwLnNldFRleHQoUmljaFRleHRSZXNvdXJjZXMub3B0aW9uc0dyb3VwX3RleHQpOwotCQlvcHRpb25zR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0JCW9wdGlvbnNHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJY2FzZVNlbnNpdGl2ZUNoZWNrYm94ID0gbmV3IEJ1dHRvbihvcHRpb25zR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWNhc2VTZW5zaXRpdmVDaGVja2JveAotCQkJCS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmNhc2VTZW5zaXRpdmVDaGVja2JveF90ZXh0KTsKLQkJd2hvbGVXb3JkQ2hlY2tib3ggPSBuZXcgQnV0dG9uKG9wdGlvbnNHcm91cCwgU1dULkNIRUNLKTsKLQkJd2hvbGVXb3JkQ2hlY2tib3guc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy53aG9sZVdvcmRDaGVja2JveF90ZXh0KTsKLQotCQlzdGF0dXNMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc3RhdHVzTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmZpbmRSZXBsYWNlRGlhbG9nX3RpdGxlKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDEsCi0JCQkJUmljaFRleHRSZXNvdXJjZXMuZmluZEJ1dHRvbl90ZXh0LCB0cnVlKTsKLQkJZmluZEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDEpOwotCQlmaW5kQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJZmluZFJlcGxhY2VBY3Rpb24ucnVuKEZpbmRSZXBsYWNlQWN0aW9uLkZJTkRfVEVYVCwKLQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksIGdldE1hdGNoRGlyZWN0aW9uKCksCi0JCQkJCQlnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJaWYgKCFmaW5kT25seSkgewotCQkJCQlyZXBsYWNlQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24uZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmaW5kUmVwbGFjZUFjdGlvbgotCQkJCQkJCS5nZXRGb3VuZE1hdGNoKCkpOwotCQkJCX0KLQkJCQlpZiAoZmluZFJlcGxhY2VBY3Rpb24uZ2V0Rm91bmRNYXRjaCgpKSB7Ci0JCQkJCXN0YXR1c0xhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJc3RhdHVzTGFiZWwKLQkJCQkJCQkuc2V0VGV4dChSaWNoVGV4dFJlc291cmNlcy5GaW5kUmVwbGFjZV9TdGF0dXNfbm9NYXRjaF9sYWJlbCk7Ci0JCQkJfQotCQkJCWZpbmRCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAyLAotCQkJCVJpY2hUZXh0UmVzb3VyY2VzLnJlcGxhY2VCdXR0b25fdGV4dCwgZmFsc2UpOwotCQlyZXBsYWNlQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgMik7Ci0JCWlmICghZmluZE9ubHkpIHsKLQkJCXJlcGxhY2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWZpbmRSZXBsYWNlQWN0aW9uLnJ1bihGaW5kUmVwbGFjZUFjdGlvbi5SRVBMQUNFX1RFWFQsCi0JCQkJCQkJZ2V0RmluZFRleHQoKSwgZ2V0UmVwbGFjZVRleHQoKSwKLQkJCQkJCQlnZXRNYXRjaERpcmVjdGlvbigpLCBnZXRNYXRjaE9wdGlvbnMoKSk7Ci0JCQkJCXJlcGxhY2VCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAzLAotCQkJCVJpY2hUZXh0UmVzb3VyY2VzLnJlcGxhY2VGaW5kQnV0dG9uX3RleHQsIGZhbHNlKTsKLQkJcmVwbGFjZUZpbmRCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyAzKTsKLQkJaWYgKCFmaW5kT25seSkgewotCQkJcmVwbGFjZUZpbmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWZpbmRSZXBsYWNlQWN0aW9uLnJ1bihGaW5kUmVwbGFjZUFjdGlvbi5SRVBMQUNFX0ZJTkRfVEVYVCwKLQkJCQkJCQlnZXRGaW5kVGV4dCgpLCBnZXRSZXBsYWNlVGV4dCgpLAotCQkJCQkJCWdldE1hdGNoRGlyZWN0aW9uKCksIGdldE1hdGNoT3B0aW9ucygpKTsKLQkJCQkJcmVwbGFjZUJ1dHRvbi5zZXRFbmFibGVkKGZpbmRSZXBsYWNlQWN0aW9uLmdldEZvdW5kTWF0Y2goKSk7Ci0JCQkJCXJlcGxhY2VGaW5kQnV0dG9uLnNldEVuYWJsZWQoZmluZFJlcGxhY2VBY3Rpb24KLQkJCQkJCQkuZ2V0Rm91bmRNYXRjaCgpKTsKLQkJCQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0Rm9jdXMoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTElFTlRfSUQgKyA0LAotCQkJCVJpY2hUZXh0UmVzb3VyY2VzLnJlcGxhY2VhbGxCdXR0b25fdGV4dCwgZmFsc2UpOwotCQlyZXBsYWNlQWxsQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0xJRU5UX0lEICsgNCk7Ci0JCWlmICghZmluZE9ubHkpIHsKLQkJCXJlcGxhY2VBbGxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWZpbmRSZXBsYWNlQWN0aW9uLnJ1bihGaW5kUmVwbGFjZUFjdGlvbi5SRVBMQUNFX0FMTF9URVhULAotCQkJCQkJCWdldEZpbmRUZXh0KCksIGdldFJlcGxhY2VUZXh0KCksCi0JCQkJCQkJZ2V0TWF0Y2hEaXJlY3Rpb24oKSwgZ2V0TWF0Y2hPcHRpb25zKCkpOwotCQkJCQlyZXBsYWNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZXBsYWNlRmluZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVwbGFjZUFsbEJ1dHRvbi5zZXRGb2N1cygpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIENhbmNlbCBidXR0b24uCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCWNhbmNlbEJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCk7Ci0KLQkJZmluZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVwbGFjZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVwbGFjZUZpbmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJlcGxhY2VBbGxCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgZmluZCB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpbmQgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFRleHQoKSB7Ci0JCXJldHVybiBmaW5kVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdXNlciBzcGVjaWZpZWQgcmVwbGFjZSB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlcGxhY2UgdGV4dAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwbGFjZVRleHQoKSB7Ci0JCXJldHVybiByZXBsYWNlVGV4dC5nZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBtYXRjaCBkaXJlY3Rpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT5GSU5EX0ZPUldBUkQ8L2NvZGU+IG9yIDxjb2RlPkZJTkRfQkFDS1dBUkQ8L2NvZGU+Ci0JICovCi0JcHVibGljIGludCBnZXRNYXRjaERpcmVjdGlvbigpIHsKLQkJcmV0dXJuIHNlYXJjaEZvcndhcmRSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKSA/IEZpbmRSZXBsYWNlQWN0aW9uLkZPUldBUkRfTUFUQ0gKLQkJCQk6IEZpbmRSZXBsYWNlQWN0aW9uLkJBQ0tXQVJEX01BVENIOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRleHQgbWF0Y2ggb3B0aW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IG1hdGNoIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1hdGNoT3B0aW9ucygpIHsKLQkJaW50IG9wdGlvbnMgPSAwOwotCQlpZiAod2hvbGVXb3JkQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkgewotCQkJb3B0aW9ucyB8PSBGaW5kUmVwbGFjZUFjdGlvbi5XSE9MRV9XT1JEX01BVENIOwotCQl9Ci0JCWlmIChjYXNlU2Vuc2l0aXZlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgPT0gdHJ1ZSkgewotCQkJb3B0aW9ucyB8PSBGaW5kUmVwbGFjZUFjdGlvbi5DQVNFX1NFTlNJVElWRV9NQVRDSDsKLQkJfQotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIGZpbmQgb25seSBvcHRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBmaW5kIG9ubHkgb3B0aW9uIGlzIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmRPbmx5KCkgewotCQlyZXR1cm4gZmluZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmluZCBvbmx5IG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmluZE9ubHksCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgZW5hYmxlIHRoZSBmaW5kIG9ubHkgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluZE9ubHkoYm9vbGVhbiBmaW5kT25seSkgewotCQl0aGlzLmZpbmRPbmx5ID0gZmluZE9ubHk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvZGlhbG9ncy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1ZGQxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9kaWFsb2dzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIGVkaXRpbmcgZGlhbG9ncyBmb3IgdGhlIHJpY2ggdGV4dCBjb250cm9sIGFuZCBlZGl0b3IuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9CbG9ja1RhZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9CbG9ja1RhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM3OTBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvQmxvY2tUYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogTW9kZWxzIGEgSFRNTCBibG9jayB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUYWcgewotCi0JLy8gVGhlIHVzZXIgZnJpZW5kbHkgbmFtZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFSQUdSQVBIID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfcGFyYWdyYXBoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSEVBRElOR18xID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfaGVhZGluZzE7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9IRUFESU5HXzIgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19oZWFkaW5nMjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfMyA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmczOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfSEVBRElOR180ID0gUmljaFRleHRSZXNvdXJjZXMuYmxvY2tUYWdfaGVhZGluZzQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9IRUFESU5HXzUgPSBSaWNoVGV4dFJlc291cmNlcy5ibG9ja1RhZ19oZWFkaW5nNTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0hFQURJTkdfNiA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2hlYWRpbmc2OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQUREUkVTUyA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX2FkZHJlc3M7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUkVGT1JNQVRURURfVEVYVCA9IFJpY2hUZXh0UmVzb3VyY2VzLmJsb2NrVGFnX3ByZWZvcm1hdHRlZFRleHQ7Ci0KLQkvLyBUaGUgaW50ZXJuYWwgdmFsdWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QQVJBR1JBUEggPSAiPHA+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMSA9ICI8aDE+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMiA9ICI8aDI+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfMyA9ICI8aDM+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNCA9ICI8aDQ+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNSA9ICI8aDU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0hFQURJTkdfNiA9ICI8aDY+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0FERFJFU1MgPSAiPGFkZHJlc3M+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BSRUZPUk1BVFRFRF9URVhUID0gIjxwcmU+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICZsdDtwJmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBQQVJBR1JBUEggPSBuZXcgQmxvY2tUYWcoTkFNRV9QQVJBR1JBUEgsCi0JCQlWQUxVRV9QQVJBR1JBUEgpOwotCi0JLyoqCi0JICogJmx0O2gxJmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzEgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzEsCi0JCQlWQUxVRV9IRUFESU5HXzEpOwotCi0JLyoqCi0JICogJmx0O2gyJmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzIgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzIsCi0JCQlWQUxVRV9IRUFESU5HXzIpOwotCi0JLyoqCi0JICogJmx0O2gzJmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzMgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzMsCi0JCQlWQUxVRV9IRUFESU5HXzMpOwotCi0JLyoqCi0JICogJmx0O2g0Jmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzQgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzQsCi0JCQlWQUxVRV9IRUFESU5HXzQpOwotCi0JLyoqCi0JICogJmx0O2g1Jmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzUgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzUsCi0JCQlWQUxVRV9IRUFESU5HXzUpOwotCi0JLyoqCi0JICogJmx0O2g2Jmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBIRUFESU5HXzYgPSBuZXcgQmxvY2tUYWcoTkFNRV9IRUFESU5HXzYsCi0JCQlWQUxVRV9IRUFESU5HXzYpOwotCi0JLyoqCi0JICogJmx0O2FkZHJlc3MmZ3Q7IHRhZy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEJsb2NrVGFnIEFERFJFU1MgPSBuZXcgQmxvY2tUYWcoTkFNRV9BRERSRVNTLAotCQkJVkFMVUVfQUREUkVTUyk7Ci0KLQkvKioKLQkgKiAmbHQ7cHJlJmd0OyB0YWcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBCbG9ja1RhZyBQUkVGT1JNQVRURURfVEVYVCA9IG5ldyBCbG9ja1RhZygKLQkJCU5BTUVfUFJFRk9STUFUVEVEX1RFWFQsIFZBTFVFX1BSRUZPUk1BVFRFRF9URVhUKTsKLQotCS8vIEEgbGlzdCBvZiA8Y29kZT5CbG9ja1RhZzwvY29kZT4gb2JqZWN0cy4KLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBMaXN0PEJsb2NrVGFnPiBCTE9DS19UQUdTID0gbmV3IEFycmF5TGlzdDxCbG9ja1RhZz4oKTsKLQlzdGF0aWMgewotCQlCTE9DS19UQUdTLmFkZChQQVJBR1JBUEgpOwotCQlCTE9DS19UQUdTLmFkZChIRUFESU5HXzEpOwotCQlCTE9DS19UQUdTLmFkZChIRUFESU5HXzIpOwotCQlCTE9DS19UQUdTLmFkZChIRUFESU5HXzMpOwotCQlCTE9DS19UQUdTLmFkZChIRUFESU5HXzQpOwotCQlCTE9DS19UQUdTLmFkZChIRUFESU5HXzUpOwotCQlCTE9DS19UQUdTLmFkZChIRUFESU5HXzYpOwotCQlCTE9DS19UQUdTLmFkZChBRERSRVNTKTsKLQkJQkxPQ0tfVEFHUy5hZGQoUFJFRk9STUFUVEVEX1RFWFQpOwotCX0KLQotCS8vIFRoZSBibG9jayB0YWcgbmFtZS4KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLy8gVGhlIGJsb2NrIHRhZyB2YWx1ZS4KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBibG9jayB0YWcgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGJsb2NrIHRhZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBCbG9ja1RhZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBibG9jayB0YWcgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBibG9jayB0YWcgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYmxvY2sgdGFnIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGJsb2NrIHRhZyB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSA8Y29kZT5CbG9ja1RhZzwvY29kZT4gb2JqZWN0IHRoYXQgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbgotCSAqIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgYW4gaW5kZXggaW50byB0aGUgPGNvZGU+QmxvY2tUYWc8L2NvZGU+IGxpc3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QmxvY2tUYWc8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmxvY2tUYWcgZ2V0QmxvY2tUYWcoaW50IGluZGV4KSB7Ci0JCUJsb2NrVGFnIHJlc3VsdCA9IChCbG9ja1RhZykgQkxPQ0tfVEFHUy5nZXQoaW5kZXgpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIFBBUkFHUkFQSDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnROYW1lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ZvbnROYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2EzZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9Gb250TmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBNb2RlbHMgYSBIVE1MIGZvbnQgbmFtZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250TmFtZSB7Ci0KLQkvLyBUaGUgdXNlciBmcmllbmRseSBuYW1lcy4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9ERUZBVUxUID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfZGVmYXVsdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0FSSUFMID0gUmljaFRleHRSZXNvdXJjZXMuZm9udE5hbWVfYXJpYWw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9DT1VSSUVSX05FVyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX2NvdXJpZXJOZXc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9USU1FU19ORVdfUk9NQU4gPSBSaWNoVGV4dFJlc291cmNlcy5mb250TmFtZV90aW1lc05ld1JvbWFuOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfVkVSREFOQSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnROYW1lX3ZlcmRhbmE7Ci0KLQkvLyBUaGUgaW50ZXJuYWwgdmFsdWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9ERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9BUklBTCA9ICJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0NPVVJJRVJfTkVXID0gIkNvdXJpZXIgTmV3LCBDb3VyaWVyLCBtb25vIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RJTUVTX05FV19ST01BTiA9ICJUaW1lcyBOZXcgUm9tYW4sIFRpbWVzLCBzZXJpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9WRVJEQU5BID0gIlZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IGZvbnQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBERUZBVUxUID0gbmV3IEZvbnROYW1lKE5BTUVfREVGQVVMVCwKLQkJCVZBTFVFX0RFRkFVTFQpOwotCi0JLyoqCi0JICogQXJpYWwgZm9udC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIEFSSUFMID0gbmV3IEZvbnROYW1lKE5BTUVfQVJJQUwsIFZBTFVFX0FSSUFMKTsKLQotCS8qKgotCSAqIENvdXJpZXIgTmV3IGZvbnQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBDT1VSSUVSX05FVyA9IG5ldyBGb250TmFtZShOQU1FX0NPVVJJRVJfTkVXLAotCQkJVkFMVUVfQ09VUklFUl9ORVcpOwotCi0JLyoqCi0JICogVGltZXMgTmV3IFJvbWFuIGZvbnQuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250TmFtZSBUSU1FU19ORVdfUk9NQU4gPSBuZXcgRm9udE5hbWUoCi0JCQlOQU1FX1RJTUVTX05FV19ST01BTiwgVkFMVUVfVElNRVNfTkVXX1JPTUFOKTsKLQotCS8qKgotCSAqIFZlcmRhbmEgZm9udC4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnROYW1lIFZFUkRBTkEgPSBuZXcgRm9udE5hbWUoTkFNRV9WRVJEQU5BLAotCQkJVkFMVUVfVkVSREFOQSk7Ci0KLQkvLyBBIGxpc3Qgb2YgPGNvZGU+Rm9udE5hbWU8L2NvZGU+IG9iamVjdHMuCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgTGlzdDxGb250TmFtZT4gRk9OVF9OQU1FUyA9IG5ldyBBcnJheUxpc3Q8Rm9udE5hbWU+KCk7Ci0Jc3RhdGljIHsKLQkJRk9OVF9OQU1FUy5hZGQoREVGQVVMVCk7Ci0JCUZPTlRfTkFNRVMuYWRkKEFSSUFMKTsKLQkJRk9OVF9OQU1FUy5hZGQoQ09VUklFUl9ORVcpOwotCQlGT05UX05BTUVTLmFkZChUSU1FU19ORVdfUk9NQU4pOwotCQlGT05UX05BTUVTLmFkZChWRVJEQU5BKTsKLQl9Ci0KLQkvLyBUaGUgZm9udCBuYW1lLgotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvLyBUaGUgZm9udCB2YWx1ZS4KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBmb250IG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBmb250IHZhbHVlCi0JICovCi0JcHVibGljIEZvbnROYW1lKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZvbnQgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZvbnQgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9udCB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSA8Y29kZT5Gb250TmFtZTwvY29kZT4gb2JqZWN0IHRoYXQgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbgotCSAqIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgYW4gaW5kZXggaW50byB0aGUgPGNvZGU+Rm9udE5hbWU8L2NvZGU+IGxpc3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Rm9udE5hbWU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRm9udE5hbWUgZ2V0Rm9udE5hbWUoaW50IGluZGV4KSB7Ci0JCUZvbnROYW1lIHJlc3VsdCA9IChGb250TmFtZSkgRk9OVF9OQU1FUy5nZXQoaW5kZXgpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIERFRkFVTFQ7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9Gb250U3R5bGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvRm9udFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2E4ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9Gb250U3R5bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIE1vZGVscyBhIEhUTUwgZm9udCBzdHlsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGb250U3R5bGUgewotCi0JLy8gVGhlIHVzZXIgZnJpZW5kbHkgbmFtZXMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfTk9STUFMID0gUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlX25vcm1hbDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFQ1RJT05fSEVBRElORyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9zZWN0aW9uSGVhZGluZzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NVQlNFQ1RJT05fSEVBRElORyA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9zdWJzZWN0aW9uSGVhZGluZzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NVQl9TVUJTRUNUSU9OX0hFQURJTkcgPSBSaWNoVGV4dFJlc291cmNlcy5mb250U3R5bGVfc3ViU3Vic2VjdGlvbkhlYWRpbmc7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9RVU9URSA9IFJpY2hUZXh0UmVzb3VyY2VzLmZvbnRTdHlsZV9xdW90ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0NPREVfU0FNUExFID0gUmljaFRleHRSZXNvdXJjZXMuZm9udFN0eWxlX2NvZGVTYW1wbGU7Ci0KLQkvLyBUaGUgaW50ZXJuYWwgdmFsdWVzLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9OT1JNQUwgPSAiPHA+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1NFQ1RJT05fSEVBRElORyA9ICI8aDM+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1NVQlNFQ1RJT05fSEVBRElORyA9ICI8aDQ+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1NVQl9TVUJTRUNUSU9OX0hFQURJTkcgPSAiPGg1PiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9RVU9URSA9ICI8cXVvdGU+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0NPREVfU0FNUExFID0gIjxjb2RlPiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEZvbnQgc3R5bGUgZm9yIG5vcm1hbCB0ZXh0LgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIE5PUk1BTCA9IG5ldyBGb250U3R5bGUoTkFNRV9OT1JNQUwsCi0JCQlWQUxVRV9OT1JNQUwpOwotCi0JLyoqCi0JICogRm9udCBzdHlsZSBmb3Igc2VjdGlvbiBoZWFkaW5nLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNFQ1RJT05fSEVBRElORyA9IG5ldyBGb250U3R5bGUoCi0JCQlOQU1FX1NFQ1RJT05fSEVBRElORywgVkFMVUVfU0VDVElPTl9IRUFESU5HKTsKLQotCS8qKgotCSAqIEZvbnQgc3R5bGUgZm9yIHN1YiBzZWN0aW9uIGhlYWRpbmcuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250U3R5bGUgU1VCU0VDVElPTl9IRUFESU5HID0gbmV3IEZvbnRTdHlsZSgKLQkJCU5BTUVfU1VCU0VDVElPTl9IRUFESU5HLCBWQUxVRV9TVUJTRUNUSU9OX0hFQURJTkcpOwotCS8qKgotCSAqIEZvbnQgc3R5bGUgZm9yIHN1YiBzdWIgc2VjdGlvbiBoZWFkaW5nLgotCSAqLwotCXN0YXRpYyBwdWJsaWMgZmluYWwgRm9udFN0eWxlIFNVQl9TVUJTRUNUSU9OX0hFQURJTkcgPSBuZXcgRm9udFN0eWxlKAotCQkJTkFNRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HLCBWQUxVRV9TVUJfU1VCU0VDVElPTl9IRUFESU5HKTsKLQotCS8qKgotCSAqIEZvbnQgc3R5bGUgZm9yIHF1b3RhdGlvbnMuCi0JICovCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBGb250U3R5bGUgUVVPVEUgPSBuZXcgRm9udFN0eWxlKE5BTUVfUVVPVEUsIFZBTFVFX1FVT1RFKTsKLQotCS8qKgotCSAqIEZvbnQgc3R5bGUgZm9yIGRpc3BsYXlpbmcgcHJvZ3JhbSBjb2Rlcy4KLQkgKi8KLQlzdGF0aWMgcHVibGljIGZpbmFsIEZvbnRTdHlsZSBDT0RFX1NBTVBMRSA9IG5ldyBGb250U3R5bGUoTkFNRV9DT0RFX1NBTVBMRSwKLQkJCVZBTFVFX0NPREVfU0FNUExFKTsKLQotCS8vIEEgbGlzdCBvZiA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdHMuCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgTGlzdDxGb250U3R5bGU+IEZPTlRfU1RZTEVTID0gbmV3IEFycmF5TGlzdDxGb250U3R5bGU+KCk7Ci0Jc3RhdGljIHsKLQkJRk9OVF9TVFlMRVMuYWRkKE5PUk1BTCk7Ci0JCUZPTlRfU1RZTEVTLmFkZChTRUNUSU9OX0hFQURJTkcpOwotCQlGT05UX1NUWUxFUy5hZGQoU1VCU0VDVElPTl9IRUFESU5HKTsKLQkJRk9OVF9TVFlMRVMuYWRkKFNVQl9TVUJTRUNUSU9OX0hFQURJTkcpOwotCQlGT05UX1NUWUxFUy5hZGQoUVVPVEUpOwotCQlGT05UX1NUWUxFUy5hZGQoQ09ERV9TQU1QTEUpOwotCX0KLQotCS8vIFRoZSBmb250IHN0eWxlIG5hbWUuCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8vIFRoZSBmb250IHN0eWxlIHZhbHVlLgotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgc3R5bGUgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIGZvbnQgc3R5bGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgRm9udFN0eWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZvbnQgc3R5bGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmb250IHN0eWxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGZvbnQgc3R5bGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9udCBzdHlsZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdCB0aGF0IGlzIG1hcHBlZCB0byB0aGUgZ2l2ZW4KLQkgKiBpbmRleC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGFuIGluZGV4IGludG8gdGhlIDxjb2RlPkZvbnRTdHlsZTwvY29kZT4gbGlzdAotCSAqIEByZXR1cm4gYSA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRm9udFN0eWxlIGdldEZvbnRTdHlsZShpbnQgaW5kZXgpIHsKLQkJRm9udFN0eWxlIHJlc3VsdCA9IChGb250U3R5bGUpIEZPTlRfU1RZTEVTLmdldChpbmRleCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gTk9STUFMOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgPGNvZGU+Rm9udFN0eWxlPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUKLQkgKiBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9uZSBvZiB0aGUgRm9udFN0eWxlcwotCSAqIEByZXR1cm4gYSBkaXNwbGF5IG5hbWUgb2YgYSBGb250U3R5bGUsIG9yIG51bGwgaWYgbm9uZSBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvbnRTdHlsZU5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWZvciAoSXRlcmF0b3I8Rm9udFN0eWxlPiBpdGVyID0gRk9OVF9TVFlMRVMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGb250U3R5bGUgc3R5bGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChzdHlsZS5nZXRWYWx1ZSgpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQlyZXR1cm4gc3R5bGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5Gb250U3R5bGU8L2NvZGU+IG9iamVjdCB3aXRoIHRoZQotCSAqIGdpdmVuIGRpc3BsYXkgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgb25lIG9mIHRoZSBGb250U3R5bGVzCi0JICogQHJldHVybiBhIHZhbHVlIG9mIGEgRm9udFN0eWxlLCBvciBudWxsIGlmIG5vbmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb250U3R5bGVWYWx1ZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEZvbnRTdHlsZT4gaXRlciA9IEZPTlRfU1RZTEVTLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRm9udFN0eWxlIHN0eWxlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoc3R5bGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBzdHlsZS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvSW1hZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhYjJhMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotLyoqCi0gKiBNb2RlbHMgYSBzaW1wbGlmaWVkIEhUTUwgJmx0O2ltYWdlJmd0OyB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2UgewotCi0JLy8gVGhlIGltYWdlIFVSTC4KLQlwcml2YXRlIFN0cmluZyB1cmwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UoKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW1hZ2UgVVJMLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIFVSTAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGltYWdlIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgVVJMCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJMKFN0cmluZyB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9odG1sL0xpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWMyMTBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWw7Ci0KLS8qKgotICogTW9kZWxzIGEgc2ltcGxpZmllZCBIVE1MICZsdDtsaW5rJmd0OyB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGluayB7Ci0KLQkvLyBUaGUgbGluayBuYW1lLgotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIGxpbmsgVVJMLgotCXByaXZhdGUgU3RyaW5nIHVybCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBMaW5rKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxpbmsgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsaW5rIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaW5rIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBsaW5rIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGluayBVUkwuCi0JICogCi0JICogQHJldHVybiB0aGUgbGluayBVUkwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaW5rIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsCi0JICogICAgICAgICAgICB0aGUgbGluayBVUkwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQkvKioKLQkgKiBAR2V0cyB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGxpbmsuCi0JICogCi0JICogQHJldHVybiB0aGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGxpbmsKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvSFRNTCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9UYWJsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYwZDQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbDsKLQotLyoqCi0gKiBNb2RlbHMgYSBzaW1wbGlmaWVkIEhUTUwgJmx0O3RhYmxlJmd0OyB0YWcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGFibGUgewotCi0JLyoqCi0JICogQSB0YWJsZSB3aXRoIG5vIGhlYWRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEFCTEVfSEVBREVSU19OT05FID0gMDsKLQotCS8qKgotCSAqIEEgdGFibGUgd2l0aCBjb2x1bW4gaGVhZGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUQUJMRV9IRUFERVJTX0NPTFMgPSAxOwotCi0JLyoqCi0JICogQSB0YWJsZSB3aXRoIHJvdyBoZWFkZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0hFQURFUlNfUk9XUyA9IDI7Ci0KLQkvKioKLQkgKiBBIHRhYmxlIHdpdGggYm90aCBjb2x1bW4gYW5kIHJvdyBoZWFkZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX0hFQURFUlNfQk9USCA9IDM7Ci0KLQkvLyBUaGUgbnVtYmVyIG9mIHJvd3MuCi0JcHJpdmF0ZSBpbnQgcm93cyA9IDI7Ci0KLQkvLyBUaGUgbnVtYmVyIG9mIGNvbHVtbnMuCi0JcHJpdmF0ZSBpbnQgY29scyA9IDI7Ci0KLQkvLyBUaGUgdGFibGUgd2lkdGguCi0JcHJpdmF0ZSBTdHJpbmcgd2lkdGggPSAiODUlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHR5cGUgb2YgdGFibGVoZWFkZXJzIGZvciB0aGlzIHRhYmxlLgotCXByaXZhdGUgaW50IHRhYmxlSGVhZGVycyA9IDA7Ci0KLQkvLyBUaGUgdGFibGUgc3VtbWFyeS4KLQlwcml2YXRlIFN0cmluZyBzdW1tYXJ5OwotCi0JLy8gVGhlIHRhYmxlIGNhcHRpb24uCi0JcHJpdmF0ZSBTdHJpbmcgY2FwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFRhYmxlKCkgewotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0YWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm93cwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Um93cygpIHsKLQkJcmV0dXJuIHJvd3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSByb3dzCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHJvd3MKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3dzKGludCByb3dzKSB7Ci0JCXRoaXMucm93cyA9IHJvd3M7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zCi0JICovCi0JcHVibGljIGludCBnZXRDb2x1bW5zKCkgewotCQlyZXR1cm4gY29sczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUuCi0JICogCi0JICogQHBhcmFtIGNvbHMKLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1ucwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbnMoaW50IGNvbHMpIHsKLQkJdGhpcy5jb2xzID0gY29sczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YWJsZSB3aWR0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdGFibGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdpZHRoKCkgewotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgd2lkdGguCi0JICogCi0JICogQHBhcmFtIHdpZHRoCi0JICogICAgICAgICAgICB0aGUgd2lkdGggb2YgdGhlIHRhYmxlCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YWJsZSBjYXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhYmxlIGNhcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb24oKSB7Ci0JCXJldHVybiBjYXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIGNhcHRpb24uCi0JICogCi0JICogQHBhcmEgY2FwdGlvbiB0aGUgdGFibGUgY2FwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhcHRpb24oU3RyaW5nIGNhcHRpb24pIHsKLQkJdGhpcy5jYXB0aW9uID0gY2FwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YWJsZSBzdW1tYXJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRhYmxlIHN1bW1hcnkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKSB7Ci0JCXJldHVybiBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRhYmxlIHN1bW1hcnkuCi0JICogCi0JICogQHBhcmFtIHN1bW1hcnkKLQkgKiAgICAgICAgICAgIHRoZSB0YWJsZSBzdW1tYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3VtbWFyeShTdHJpbmcgc3VtbWFyeSkgewotCQl0aGlzLnN1bW1hcnkgPSBzdW1tYXJ5OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhYmxlIGhlYWRlcnMgc3R5bGUuCi0JICogCi0JICogQHJldHVybiB0aGUgaW50ZWdlciB3aXRoIHZhbHVlIHJlcHJlc2VudGluZwotCSAqICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19OT05FPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfQ09MUzwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX1JPV1M8L2NvZGU+IG9yCi0JICogICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX0JPVEg8L2NvZGU+Ci0JICovCi0JcHVibGljIGludCBnZXRUYWJsZUhlYWRlcnMoKSB7Ci0JCXJldHVybiB0YWJsZUhlYWRlcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdGFibGUgaGVhZGVycyBzdHlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGFibGVIZWFkZXJzCi0JICogICAgICAgICAgICBhbiBpbnRlZ2VyIHdpdGggdmFsdWUgcmVwcmVzZW50aW5nCi0JICogICAgICAgICAgICA8Y29kZT5UQUJMRV9IRUFERVJTX05PTkU8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+VEFCTEVfSEVBREVSU19DT0xTPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfUk9XUzwvY29kZT4gb3IKLQkgKiAgICAgICAgICAgIDxjb2RlPlRBQkxFX0hFQURFUlNfQk9USDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZUhlYWRlcnMoaW50IHRhYmxlSGVhZGVycykgewotCQl0aGlzLnRhYmxlSGVhZGVycyA9IHRhYmxlSGVhZGVyczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L2h0bWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDcwN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvaHRtbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGRkYzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgYW5kIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTFiMDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoZSBQcmVmZXJlbmNlIHBhZ2UgZm9yIHRoZSByaWNoIHRleHQgZWRpdG9yLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vZGlmeUxpc3RlbmVyIHsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBzdG9yZTsKLQotCXByaXZhdGUgVGV4dCBsaW5lV2lkdGhUZXh0OwotCi0JcHJpdmF0ZSBCdXR0b24gaW5kZW50Q2hlY2tib3g7Ci0KLQlwcml2YXRlIFRleHQgaW5kZW50U2l6ZVRleHQ7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQlzdG9yZSA9IFJpY2hUZXh0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUNvbXBvc2l0ZSB3aWR0aENvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdpZHRoQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQl3aWR0aENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsaW5lV2lkdGhMYWJlbCA9IG5ldyBMYWJlbCh3aWR0aENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsaW5lV2lkdGhMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLm1heENoYXJzUGVyTGluZUxhYmVsX3RleHQpOyAKLQotCQlsaW5lV2lkdGhUZXh0ID0gbmV3IFRleHQod2lkdGhDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlsaW5lV2lkdGhUZXh0LnNldFRleHQoc3RvcmUuZ2V0U3RyaW5nKFJpY2hUZXh0UHJlZmVyZW5jZXMuTElORV9XSURUSCkpOwotCQlsaW5lV2lkdGhUZXh0LnNldFRleHRMaW1pdCgzKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMjU7Ci0JCWxpbmVXaWR0aFRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWxpbmVXaWR0aFRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQl9Ci0JCX0pOwotCi0JCUNvbXBvc2l0ZSBpbmRlbnRDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlpbmRlbnRDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCWluZGVudENvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlpbmRlbnRDaGVja2JveCA9IG5ldyBCdXR0b24oaW5kZW50Q29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlpbmRlbnRDaGVja2JveC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmluZGVudEhUTUxDaGVja2JveF90ZXh0KTsgCi0JCWluZGVudENoZWNrYm94LnNldFNlbGVjdGlvbihzdG9yZQotCQkJCS5nZXRCb29sZWFuKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5UKSk7Ci0KLQkJbmV3IExhYmVsKGluZGVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCUxhYmVsIGluZGVudFNpemVMYWJlbCA9IG5ldyBMYWJlbChpbmRlbnRDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlpbmRlbnRTaXplTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWluZGVudFNpemVMYWJlbC5zZXRUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmluZGVudFNpemVMYWJlbF90ZXh0KTsgCi0KLQkJaW5kZW50U2l6ZVRleHQgPSBuZXcgVGV4dChpbmRlbnRDb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlpbmRlbnRTaXplVGV4dAotCQkJCS5zZXRUZXh0KHN0b3JlLmdldFN0cmluZyhSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVF9TSVpFKSk7Ci0JCWluZGVudFNpemVUZXh0LnNldFRleHRMaW1pdCgxKTsKLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gMTA7Ci0JCWluZGVudFNpemVUZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlpbmRlbnRTaXplVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UucGVyZm9ybURlZmF1bHRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJbGluZVdpZHRoVGV4dC5zZXRUZXh0KHN0b3JlCi0JCQkJLmdldERlZmF1bHRTdHJpbmcoUmljaFRleHRQcmVmZXJlbmNlcy5MSU5FX1dJRFRIKSk7Ci0JCWluZGVudENoZWNrYm94LnNldFNlbGVjdGlvbihzdG9yZQotCQkJCS5nZXREZWZhdWx0Qm9vbGVhbihSaWNoVGV4dFByZWZlcmVuY2VzLklOREVOVCkpOwotCQlpbmRlbnRTaXplVGV4dC5zZXRUZXh0KHN0b3JlCi0JCQkJLmdldERlZmF1bHRTdHJpbmcoUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlRfU0laRSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZS5wZXJmb3JtT2sKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCVN0cmluZyBsaW5lV2lkdGhWYWx1ZSA9IGxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpOwotCQlpZiAobGluZVdpZHRoVmFsdWUgIT0gbnVsbCAmJiBsaW5lV2lkdGhWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IGxpbmVXaWR0aCA9IEludGVnZXIucGFyc2VJbnQobGluZVdpZHRoVmFsdWUpOwotCQkJCXN0b3JlLnNldFZhbHVlKFJpY2hUZXh0UHJlZmVyZW5jZXMuTElORV9XSURUSCwgbGluZVdpZHRoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGluZGVudFZhbHVlID0gaW5kZW50Q2hlY2tib3guZ2V0U2VsZWN0aW9uKCk7Ci0JCXN0b3JlLnNldFZhbHVlKFJpY2hUZXh0UHJlZmVyZW5jZXMuSU5ERU5ULCBpbmRlbnRWYWx1ZSk7Ci0KLQkJU3RyaW5nIGluZGVudFNpemVWYWx1ZSA9IGluZGVudFNpemVUZXh0LmdldFRleHQoKTsKLQkJaWYgKGluZGVudFNpemVWYWx1ZSAhPSBudWxsICYmIGluZGVudFNpemVWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJaW50IGluZGVudFNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGluZGVudFNpemVWYWx1ZSk7Ci0JCQkJc3RvcmUuc2V0VmFsdWUoUmljaFRleHRQcmVmZXJlbmNlcy5JTkRFTlRfU0laRSwgaW5kZW50U2l6ZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyI21vZGlmeVRleHQoTW9kaWZ5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9SaWNoVGV4dFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MmVhZTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotCi0vKioKLSAqIFByZWZlcmVuY2VzIGZvciB0aGUgcmljaCB0ZXh0IGVkaXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFByZWZlcmVuY2VzIHsKLQotCS8qKgotCSAqIHJpY2ggdGV4dCBFZGl0b3IgcHJlZmVyZW5jZSBrZXlzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfV0lEVEggPSAiaHRtbEVkaXRvci5saW5lV2lkdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlQgPSAiaHRtbEVkaXRvci5pbmRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRfU0laRSA9ICJodG1sRWRpdG9yLmluZGVudFNpemUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcyhJUHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCXN0b3JlLnNldERlZmF1bHQoTElORV9XSURUSCwgMTIwKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJTkRFTlQsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElOREVOVF9TSVpFLCA0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3ByZWZlcmVuY2VzL1JpY2hUZXh0UHJlZmVyZW5jZXNJbml0aWFsaXplci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTU2ZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvUmljaFRleHRQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLQotLyoqCi0gKiBUaGUgcmljaCB0ZXh0IHByZWZlcmVuY2VzIGluaXRpYWxpemVyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0UHJlZmVyZW5jZXNJbml0aWFsaXplciBleHRlbmRzCi0JCUFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBSaWNoVGV4dFBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCVJpY2hUZXh0UHJlZmVyZW5jZXMuaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcyhzdG9yZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YTc1ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0L3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvcHJlZmVyZW5jZXMvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgcHJlZmVyZW5jZSBzdXBwb3J0IGZvciB0aGUgcmljaCB0ZXh0IGNvbnRyb2wgYW5kIGVkaXRvci4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzk2YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIyBUdXJuIG9uIGRlYnVnIHRyYWNlIGZvciB0aGUgU2VhcmNoIFVJIHBsdWctaW4KLW9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8ucHJvamVjdCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTU1MjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhN2NiY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2Uuc2VhcmNoO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSwKLSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkucHJlZmVyZW5jZXMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjFkYzZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RTZWFyY2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzBmNDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9pY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmMTkzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBQbHVnLWluCi1wbHVnaW5OYW1lPUVQRiBTZWFyY2ggVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jIE1ldGhvZCBTZWFyY2ggRGlhbG9nCi1tZXRob2RTZWFyY2hEaWFsb2dMYWJlbD1NZXRob2QgU2VhcmNoCi0KLSAgICAgICAgICAgICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMjBmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im9wZXJhdGlvbiIgbmFtZT0iTWV0aG9kIFNlYXJjaCBPcGVyYXRpb24iIHNjaGVtYT0ic2NoZW1hL29wZXJhdGlvbi5leHNkIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJzZWFyY2hJbnB1dEZhY3RvcmllcyIgbmFtZT0iTWV0aG9kIFNlYXJjaCBJbnB1dCBGYWN0b3JpZXMiIHNjaGVtYT0ic2NoZW1hL3NlYXJjaElucHV0RmFjdG9yaWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5IiBuYW1lPSJTZWFyY2ggU2NvcGUgR3JvdXAgRmFjdG9yeSIgc2NoZW1hPSJzY2hlbWEvc2VhcmNoU2NvcGVHcm91cEZhY3RvcnkuZXhzZCIvPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ic2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5IiBuYW1lPSJTZWFyY2ggUmVzdWx0IFByb3ZpZGVyIEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL3NlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeS5leHNkIi8+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnNlYXJjaC5zZWFyY2hQYWdlcyI+Ci0gICAgICA8cGFnZSBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuTWV0aG9kU2VhcmNoUGFnZSIgICAgICAKLSAgICAgICAgICAgIGxhYmVsPSIlbWV0aG9kU2VhcmNoRGlhbG9nTGFiZWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L01ldGhvZFNlYXJjaC5naWYiCi0gICAgICAgICAgICBzaXplSGludD0iMjUwLDE2MCIKLSAgICAgICAgICAgIHRhYlBvc2l0aW9uPSIwIgotICAgICAgICAgICAgZXh0ZW5zaW9ucz0iKjoxIgotICAgICAgICAgICAgc2hvd1Njb3BlU2VjdGlvbj0iZmFsc2UiCQkKLSAgICAgICAgICAgIGNhblNlYXJjaEVuY2xvc2luZ1Byb2plY3RzPSJmYWxzZSI+Ci0gICAgICA8L3BhZ2U+ICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJNZXRob2RTZWFyY2hQYWdlIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnNlYXJjaC5zZWFyY2hSZXN1bHRWaWV3UGFnZXMiPgotICAgICAgPHZpZXdQYWdlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5NZXRob2RTZWFyY2hSZXN1bHRQYWdlIgotCQkJc2VhcmNoUmVzdWx0Q2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoUmVzdWx0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuTWV0aG9kU2VhcmNoUmVzdWx0UGFnZSI+Ci0gICAgICA8L3ZpZXdQYWdlPgotICAgPC9leHRlbnNpb24+ICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvb3BlcmF0aW9uLmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9vcGVyYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1YzE5MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9vcGVyYXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpIiBpZD0ib3BlcmF0aW9uIiBuYW1lPSJNZXRob2QgU2VhcmNoIE9wZXJhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im9wZXJhdGlvbiIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ib3BlcmF0aW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JTWV0aG9kU2VhcmNoT3BlcmF0aW9uIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hJbnB1dEZhY3Rvcmllcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zY2hlbWEvc2VhcmNoSW5wdXRGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0MzM5ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hJbnB1dEZhY3Rvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiIGlkPSJzZWFyY2hJbnB1dEZhY3RvcmllcyIgbmFtZT0iTWV0aG9kIFNlYXJjaCBJbnB1dCBGYWN0b3JpZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmYWN0b3J5Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5JTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmE0ZjJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkiIGlkPSJzZWFyY2hSZXN1bHRDb250ZW50UHJvdmlkZXJGYWN0b3J5IiBuYW1lPSJTZWFyY2ggUmVzdWx0IENvbnRlbnQgUHJvdmlkZXIgRmFjdG9yeSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaFNjb3BlR3JvdXBGYWN0b3J5LmV4c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NjaGVtYS9zZWFyY2hTY29wZUdyb3VwRmFjdG9yeS5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdmYzA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc2NoZW1hL3NlYXJjaFNjb3BlR3JvdXBGYWN0b3J5LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aSIgaWQ9InNlYXJjaFNjb3BlVmlld2VyRmFjdG9yeSIgbmFtZT0iU2VhcmNoU2NvcGVWaWV3ZXIgRmFjdG9yeSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGNob2ljZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9jaG9pY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMTNmODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9NZXRob2RTZWFyY2hQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklNZXRob2RTZWFyY2hTY29wZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoSW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLk1ldGhvZFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWwuTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5wcmVmZXJlbmNlcy5TZWFyY2hVSVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUGFnZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIERpc3BsYXlzIHRoZSBNZXRob2QgU2VhcmNoIHBhZ2UgaW4gdGhlIFNlYXJjaCBkaWFsb2cuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFBhZ2UgZXh0ZW5kcyBEaWFsb2dQYWdlIGltcGxlbWVudHMgSVNlYXJjaFBhZ2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VBUkNIX1BBR0VfSUQgPSBNZXRob2RTZWFyY2hQYWdlLmNsYXNzCi0JCQkuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxJTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5PiBzZWFyY2hJbnB1dEZhY3RvcmllczsKLQotCXByaXZhdGUgQ29tYm8gc2VhcmNoU3RyaW5nQ29tYm87Ci0KLQlwcml2YXRlIENvbWJvIG5hbWVQYXR0ZXJuQ29tYm87Ci0KLQlwcml2YXRlIEJ1dHRvbiBjYXNlU2Vuc2l0aXZlQ2hlY2tib3g7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIHNlYXJjaFNjb3BlVmlld2VyOwotCi0JcHJpdmF0ZSBJU2VhcmNoUGFnZUNvbnRhaW5lciBjb250YWluZXI7Ci0KLQlwcml2YXRlIExpc3Q8SU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uPiBhZGRpdGlvbmFsU2VhcmNoSW5wdXRzID0gbmV3IEFycmF5TGlzdDxJTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24+KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBzZWFyY2hTdHJpbmdMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc2VhcmNoU3RyaW5nTGFiZWwuc2V0VGV4dChTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hTdHJpbmdMYWJlbF90ZXh0KTsgCi0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCXNlYXJjaFN0cmluZ0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzZWFyY2hTdHJpbmdDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJU3RyaW5nIHNhdmVkU2VhcmNoU3RyaW5nID0gU2VhcmNoVUlQcmVmZXJlbmNlcy5nZXRTZWFyY2hTdHJpbmcoKTsKLQkJaWYgKHNhdmVkU2VhcmNoU3RyaW5nICE9IG51bGwgJiYgc2F2ZWRTZWFyY2hTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzZWFyY2hTdHJpbmdDb21iby5zZXRUZXh0KHNhdmVkU2VhcmNoU3RyaW5nKTsKLQkJfQotCi0JCWNhc2VTZW5zaXRpdmVDaGVja2JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3guc2V0VGV4dChTZWFyY2hVSVJlc291cmNlcy5jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dCk7IAotCQljYXNlU2Vuc2l0aXZlQ2hlY2tib3guc2V0U2VsZWN0aW9uKFNlYXJjaFVJUHJlZmVyZW5jZXMKLQkJCQkuZ2V0Q2FzZVNlbnNpdGl2ZSgpKTsKLQotCQlMYWJlbCBlbGVtZW50TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllbGVtZW50TmFtZUxhYmVsLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuZWxlbWVudE5hbWVMYWJlbF90ZXh0KTsgCi0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCW5hbWVQYXR0ZXJuQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW5hbWVQYXR0ZXJuQ29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCVN0cmluZyBzYXZlZE5hbWVQYXR0ZXJuID0gU2VhcmNoVUlQcmVmZXJlbmNlcy5nZXROYW1lUGF0dGVybigpOwotCQlpZiAoc2F2ZWROYW1lUGF0dGVybiAhPSBudWxsICYmIHNhdmVkTmFtZVBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0JCQluYW1lUGF0dGVybkNvbWJvLnNldFRleHQoc2F2ZWROYW1lUGF0dGVybik7Ci0JCX0gCi0vLwkJZWxzZSB7Ci0vLwkJCW5hbWVQYXR0ZXJuQ29tYm8uc2V0VGV4dCgiKiIpOyAvLyROT04tTkxTLTEkCi0vLwkJfQotCi0JCW5hbWVQYXR0ZXJuQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29udGFpbmVyLnNldFBlcmZvcm1BY3Rpb25FbmFibGVkKGdldFNlYXJjaEJ1dHRvbkVuYWJsZWQoKSk7Ci0JCQl9Ci0JCX0pOwotCQluYW1lUGF0dGVybkNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQljb250YWluZXIuc2V0UGVyZm9ybUFjdGlvbkVuYWJsZWQoZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCi0JCWNvbGxlY3RDb250cmlidXRlZFNlYXJjaElucHV0cyhjb21wb3NpdGUpOwotCQkKLQkJc2VhcmNoU2NvcGVWaWV3ZXIgPSBjcmVhdGVTZWFyY2hTY29wZUdyb3VwKGNvbXBvc2l0ZSkuZ2V0U2VhcmNoU2NvcGVWaWV3ZXIoKTsKLQotCQljb250YWluZXIuc2V0UGVyZm9ybUFjdGlvbkVuYWJsZWQoZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTWV0aG9kU2VhcmNoU2NvcGVHcm91cCBjcmVhdGVTZWFyY2hTY29wZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJT2JqZWN0IGV4dCA9IEV4dGVuc2lvbk1hbmFnZXIuZ2V0RXh0ZW5zaW9uKFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJZCgpLCAic2VhcmNoU2NvcGVHcm91cEZhY3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihleHQgaW5zdGFuY2VvZiBJTWV0aG9kU2VhcmNoU2NvcGVHcm91cEZhY3RvcnkpIHsKLQkJCUlNZXRob2RTZWFyY2hTY29wZUdyb3VwIGdyb3VwID0gKChJTWV0aG9kU2VhcmNoU2NvcGVHcm91cEZhY3RvcnkpIGV4dCkuY3JlYXRlU2VhcmNoU2NvcGVHcm91cChwYXJlbnQpOwotCQkJaWYoZ3JvdXAgIT0gbnVsbCkgewotCQkJCXJldHVybiBncm91cDsKLQkJCX0KLQkJfQotCQlHcm91cCBzZWFyY2hTY29wZUdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlzZWFyY2hTY29wZUdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBzZWFyY2hTY29wZUdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJc2VhcmNoU2NvcGVHcm91cEdyaWREYXRhLmhlaWdodEhpbnQgPSAyMDA7Ci0JCXNlYXJjaFNjb3BlR3JvdXAuc2V0TGF5b3V0RGF0YShzZWFyY2hTY29wZUdyb3VwR3JpZERhdGEpOwotCQlzZWFyY2hTY29wZUdyb3VwLnNldFRleHQoU2VhcmNoVUlSZXNvdXJjZXMuc2NvcGVHcm91cF90ZXh0KTsgCi0JCWZpbmFsIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIHZpZXdlciA9IG5ldyBNZXRob2RTZWFyY2hTY29wZVZpZXdlcihzZWFyY2hTY29wZUdyb3VwLCBTV1QuQk9SREVSKTsKLQkJcmV0dXJuIG5ldyBJTWV0aG9kU2VhcmNoU2NvcGVHcm91cCgpIHsKLQotCQkJcHVibGljIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIGdldFNlYXJjaFNjb3BlVmlld2VyKCkgewotCQkJCXJldHVybiB2aWV3ZXI7Ci0JCQl9Ci0JCQkKLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PElNZXRob2RTZWFyY2hJbnB1dEZhY3Rvcnk+IGdldFNlYXJjaElucHV0RmFjdG9yaWVzKCkgewotCQlpZiAoc2VhcmNoSW5wdXRGYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJc2VhcmNoSW5wdXRGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0PElNZXRob2RTZWFyY2hJbnB1dEZhY3Rvcnk+KCk7Ci0JCQkvLyBQcm9jZXNzIHRoZSBjb250cmlidXRvcnMuCi0JCQkvLwotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0KLQkJCQkJLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeQotCQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJCQkJInNlYXJjaElucHV0RmFjdG9yaWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQkJT2JqZWN0IGV4dCA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZUlkZW50aWZpZXIoKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkJLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkJLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQlleHQgPSBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQkJaWYgKGV4dCBpbnN0YW5jZW9mIElNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkpIHsKLQkJCQkJCQkJCXNlYXJjaElucHV0RmFjdG9yaWVzCi0JCQkJCQkJCQkJCS5hZGQoKElNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkpIGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VhcmNoSW5wdXRGYWN0b3JpZXM7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RDb250cmlidXRlZFNlYXJjaElucHV0cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZvciAoSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeSBmYWN0b3J5IDogZ2V0U2VhcmNoSW5wdXRGYWN0b3JpZXMoKSkgewotCQkJdHJ5IHsKLQkJCQlJTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24gc2VhcmNoSW5wdXQgPSBmYWN0b3J5LmNyZWF0ZVNlYXJjaElucHV0KHBhcmVudCk7Ci0JCQkJaWYoc2VhcmNoSW5wdXQgIT0gbnVsbCkgewotCQkJCQlhZGRpdGlvbmFsU2VhcmNoSW5wdXRzIC5hZGQoc2VhcmNoSW5wdXQpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFBhZ2UjcGVyZm9ybUFjdGlvbigpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUFjdGlvbigpIHsKLQkJTWV0aG9kTGlicmFyeSBsaWJyYXJ5ID0gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCQlpZiAobGlicmFyeSA9PSBudWxsKSB7Ci0JCQlTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TXNnRGlhbG9nKCkuZGlzcGxheUVycm9yKAotCQkJCQlTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hFcnJvcl90aXRsZSwgCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX21zZywgCi0JCQkJCVNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaEVycm9yX3JlYXNvbik7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmdDb21iby5nZXRUZXh0KCkudHJpbSgpOwotCQlTdHJpbmcgbmFtZVBhdHRlcm4gPSBuYW1lUGF0dGVybkNvbWJvLmdldFRleHQoKS50cmltKCk7Ci0JCWlmKFN0clV0aWwuaXNCbGFuayhuYW1lUGF0dGVybikpIHsKLQkJCW5hbWVQYXR0ZXJuID0gIioiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTWV0aG9kU2VhcmNoU2NvcGUgc2VhcmNoU2NvcGUgPSBzZWFyY2hTY29wZVZpZXdlci5nZXRTZWFyY2hTY29wZSgpOwotCQlNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dCA9IG5ldyBNZXRob2RTZWFyY2hJbnB1dChzZWFyY2hTdHJpbmcsCi0JCQkJbmFtZVBhdHRlcm4sIGNhc2VTZW5zaXRpdmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSwgZmFsc2UsCi0JCQkJZmFsc2UsIHNlYXJjaFNjb3BlKTsKLQkJaWYoIWFkZGl0aW9uYWxTZWFyY2hJbnB1dHMuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKElNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbiBpbnB1dCA6IGFkZGl0aW9uYWxTZWFyY2hJbnB1dHMpIHsKLQkJCQlzZWFyY2hJbnB1dC5nZXRBZGRpdGlvbmFsSW5wdXQoKS5wdXRBbGwoaW5wdXQuZ2V0SW5wdXQoKSk7Ci0JCQl9Ci0JCX0KLQkJTWV0aG9kU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSBuZXcgTWV0aG9kU2VhcmNoUXVlcnkoc2VhcmNoSW5wdXQpOwotCQlOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLQkJTmV3U2VhcmNoVUkucnVuUXVlcnlJbkJhY2tncm91bmQoc2VhcmNoUXVlcnkpOwotCQlTZWFyY2hVSVByZWZlcmVuY2VzLnNldFNlYXJjaFN0cmluZyhzZWFyY2hTdHJpbmdDb21iby5nZXRUZXh0KCkpOwotCQlTZWFyY2hVSVByZWZlcmVuY2VzLnNldE5hbWVQYXR0ZXJuKG5hbWVQYXR0ZXJuQ29tYm8uZ2V0VGV4dCgpKTsKLQkJU2VhcmNoVUlQcmVmZXJlbmNlcy5zZXRDYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmVDaGVja2JveAotCQkJCS5nZXRTZWxlY3Rpb24oKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hQYWdlI3NldENvbnRhaW5lcihJU2VhcmNoUGFnZUNvbnRhaW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoSVNlYXJjaFBhZ2VDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklSZXBsYWNlUGFnZSNwZXJmb3JtUmVwbGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybVJlcGxhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbmFibGVkIHN0YXR1cyBvZiB0aGUgU2VhcmNoIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8Y29kZT4gaWYgdGhlIFNlYXJjaCBidXR0b24gc2hvdWxkIGJlIGVuYWJsZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2V0U2VhcmNoQnV0dG9uRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL01ldGhvZFNlYXJjaFJlc3VsdFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUmVzdWx0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTM5Y2JlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvTWV0aG9kU2VhcmNoUmVzdWx0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1BlcnNwZWN0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuQnJvd3NpbmdQZXJzcGVjdGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmVkaXRvcnMuRWRpdG9yQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLnZpZXdzLkNvbnRlbnRWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkudXRpbC5QZXJzcGVjdGl2ZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLklTZWFyY2hSZXN1bHRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5NZXRob2RFbGVtZW50Vmlld1NvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLlNlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbC5TZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsLlNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuTmV3U2VhcmNoVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogRGlzcGxheXMgdGhlIE1ldGhvZCBTZWFyY2ggcmVzdWx0IGluIHRoZSBTZWFyY2ggdmlldy4gVGhlIHNlYXJjaCByZXN1bHQKLSAqIGNhbiBiZSBkaXNwbGF5ZWQgaW4gYSBoaWVyYXJjaGljYWwgb3IgZmxhdCB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hSZXN1bHRQYWdlIGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UKLQkJaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyOwotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUmVzdWx0UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbGFiZWxQcm92aWRlciA9IGNyZWF0ZUxhYmVsUHJvdmlkZXIoKTsKLQkJCi0JCS8vIENsZWFyIHRoZSBzZWFyY2ggcmVzdWx0IHdoZW4gdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgaXMgY2xvc2VkIGJ5IHRoZSB1c2VyLgotCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmFkZExpc3RlbmVyKG5ldyBMaWJyYXJ5U2VydmljZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbGlicmFyeUNsb3NlZChNZXRob2RMaWJyYXJ5IGxpYnJhcnkpIHsKLQkJCQlNZXRob2RTZWFyY2hSZXN1bHRQYWdlLnRoaXMuZ2V0SW5wdXQoKS5yZW1vdmVBbGwoKTsKLQkJCX0JCQkKLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNpc0xheW91dFN1cHBvcnRlZChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMYXlvdXRTdXBwb3J0ZWQoaW50IGxheW91dCkgewotCQlyZXR1cm4gKChsYXlvdXQgJiBGTEFHX0xBWU9VVF9GTEFUKSAhPSAwIHx8IChsYXlvdXQgJiBGTEFHX0xBWU9VVF9UUkVFKSAhPSAwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSBnZXRTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSkgRXh0ZW5zaW9uTWFuYWdlci5nZXRFeHRlbnNpb24oCi0JCQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksCi0JCQkJInNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjcmVhdGVDb250ZW50UHJvdmlkZXIoVmlld2VyIHZpZXdlcikgewotCQlJU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkoKTsKLQkJaWYodmlld2VyIGluc3RhbmNlb2YgVHJlZVZpZXdlcikgewotCQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY3AgPSBudWxsOwotCQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJY3AgPSBmYWN0b3J5LmNyZWF0ZVRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJCX0KLQkJCXJldHVybiBjcCAhPSBudWxsID8gY3AgOiBuZXcgU2VhcmNoUmVzdWx0VHJlZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCWVsc2UgaWYodmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpIHsKLQkJCUlTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNwID0gbnVsbDsKLQkJCWlmKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWNwID0gZmFjdG9yeS5jcmVhdGVUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCQkJfQotCQkJcmV0dXJuIGNwICE9IG51bGwgPyBjcCA6IG5ldyBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHsKLQkJSUxhYmVsUHJvdmlkZXIgbHAgPSBudWxsOwotCQlJU2VhcmNoUmVzdWx0UHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkoKTsKLQkJaWYoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlscCA9IGZhY3RvcnkuY3JlYXRlTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBscCAhPSBudWxsID8gbHAgOiBuZXcgU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY29uZmlndXJlVHJlZVZpZXdlcihUcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRyZWVWaWV3ZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJY29udGVudFByb3ZpZGVyID0gY3JlYXRlQ29udGVudFByb3ZpZGVyKHZpZXdlcik7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRTb3J0ZXIobmV3IE1ldGhvZEVsZW1lbnRWaWV3U29ydGVyKCkpOwotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY29uZmlndXJlVGFibGVWaWV3ZXIoVGFibGVWaWV3ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVGFibGVWaWV3ZXIoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0JCWNvbnRlbnRQcm92aWRlciA9IGNyZWF0ZUNvbnRlbnRQcm92aWRlcih2aWV3ZXIpOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl2aWV3ZXIuc2V0U29ydGVyKG5ldyBNZXRob2RFbGVtZW50Vmlld1NvcnRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2VsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gb2JqZWN0cykgewotCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWlmIChjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJKChTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpCi0JCQkJCQkuZWxlbWVudHNDaGFuZ2VkKG9iamVjdHMpOwotCQkJfSBlbHNlIGlmIChjb250ZW50UHJvdmlkZXIgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRUYWJsZUNvbnRlbnRQcm92aWRlcikgewotCQkJCSgoU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcikKLQkJCQkJCS5lbGVtZW50c0NoYW5nZWQob2JqZWN0cyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNjbGVhcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChjb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRlbnRQcm92aWRlciBpbnN0YW5jZW9mIFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcikuY2xlYXIoKTsKLQkJCX0gZWxzZSBpZiAoY29udGVudFByb3ZpZGVyIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIpIHsKLQkJCQkoKFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyKSBjb250ZW50UHJvdmlkZXIpLmNsZWFyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI3Nob3dNYXRjaChNYXRjaCwKLQkgKiAgICAgIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IGN1cnJlbnRPZmZzZXQsIGludCBjdXJyZW50TGVuZ3RoLAotCQkJYm9vbGVhbiBhY3RpdmF0ZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJaWYgKG1hdGNoLmdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgYWN0aXZhdGUpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IChNZXRob2RFbGVtZW50KSBtYXRjaC5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoUGVyc3BlY3RpdmVVdGlsCi0JCQkJCS5pc0FjdGl2ZVBlcnNwZWN0aXZlKEJyb3dzaW5nUGVyc3BlY3RpdmUuUEVSU1BFQ1RJVkVfSUQpKSB7Ci0JCQkJUGVyc3BlY3RpdmVVdGlsCi0JCQkJCQkub3BlblBlcnNwZWN0aXZlKEF1dGhvcmluZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKTsKLQkJCQlJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkJLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJCUlWaWV3UGFydCB2aWV3ID0gYWN0aXZlUGFnZQotCQkJCQkJCS5maW5kVmlldyhOZXdTZWFyY2hVSS5TRUFSQ0hfVklFV19JRCk7Ci0JCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJCWFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoTmV3U2VhcmNoVUkuU0VBUkNIX1ZJRVdfSUQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZGlzcGxheUVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERpc3BsYXlzIHRoZSBNZXRob2QgZWRpdG9yIGZvciB0aGUgc2VsZWN0ZWQgTWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUVkaXRvcihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJRWRpdG9yQ2hvb3Nlci5nZXRJbnN0YW5jZSgpLm9wZW5FZGl0b3IoCi0JCQkJCVVtYVV0aWwuZ2V0UHJvY2Vzc0NvbXBvbmVudChlbGVtZW50KSk7Ci0JCX0gZWxzZSB7Ci0JCQlFZGl0b3JDaG9vc2VyLmdldEluc3RhbmNlKCkub3BlbkVkaXRvcihlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyI3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChQZXJzcGVjdGl2ZVV0aWwKLQkJCQkuaXNBY3RpdmVQZXJzcGVjdGl2ZShCcm93c2luZ1BlcnNwZWN0aXZlLlBFUlNQRUNUSVZFX0lEKSkgewotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCU9iamVjdFtdIHNlbGVjdGVkRWxlbWVudHMgPSBzZWwudG9BcnJheSgpOwotCQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzICE9IG51bGwgJiYgc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWlmIChzZWxlY3RlZEVsZW1lbnRzWzBdIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlkaXNwbGF5SFRNTFBhZ2UoKE1ldGhvZEVsZW1lbnQpIHNlbGVjdGVkRWxlbWVudHNbMF0pOwotCQkJCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcGxheXMgdGhlIEhUTUwgY29udGVudCBwYWdlIGZvciB0aGUgc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIENvbnRlbnQgdmlldyBjYW5ub3QgYmUgZGlzcGxheWVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcGxheUhUTUxQYWdlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkKLQkJCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkKLQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQlJVmlld1BhcnQgdmlldyA9IGFjdGl2ZVBhZ2UuZmluZFZpZXcoQ29udGVudFZpZXcuVklFV19JRCk7Ci0JCQlpZiAodmlldyA9PSBudWxsKSB7Ci0JCQkJdmlldyA9IGFjdGl2ZVBhZ2Uuc2hvd1ZpZXcoQ29udGVudFZpZXcuVklFV19JRCk7Ci0JCQl9Ci0JCQlpZiAodmlldyAhPSBudWxsKSB7Ci0JCQkJKChDb250ZW50VmlldykgdmlldykuZGlzcGxheUhUTUxDb250ZW50UGFnZShlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmY0NDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgTWV0aG9kIFNlYXJjaCBQYWdlCi1zZWFyY2hTdHJpbmdMYWJlbF90ZXh0PVRleHQgKCogPSBhbnkgc3RyaW5nLCA/ID0gYW55IGNoYXJhY3Rlcik6Ci1jYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dD1DYXNlIHNlbnNpdGl2ZQotZWxlbWVudE5hbWVMYWJlbF90ZXh0PU1ldGhvZCBlbGVtZW50IG5hbWUgb3IgcHJlc2VudGF0aW9uIG5hbWUgcGF0dGVybjoKLXNjb3BlR3JvdXBfdGV4dD1TY29wZQotcm9sZUNoZWNrYm94X3RleHQ9Um9sZQotdGFza0NoZWNrYm94X3RleHQ9VGFzawotd29ya1Byb2R1Y3RDaGVja2JveF90ZXh0PVdvcmsgUHJvZHVjdAotCi0jIE1ldGhvZCBTZWFyY2ggUXVlcnkKLXNlYXJjaFF1ZXJ5X3RleHQ9TWV0aG9kIFNlYXJjaAotCi0jIE1ldGhvZCBTZWFyY2ggUHJvZ3Jlc3MgRGlhbG9nCi1zY2FuTGlicmFyeVRhc2tfbmFtZT1TY2FubmluZyBtZXRob2QgbGlicmFyeS4uLgotc2NhbkVsZW1lbnRUYXNrX25hbWU9U2Nhbm5pbmcgbWV0aG9kIGVsZW1lbnQgJyd7MH0nJy4uLgotCi0jIE1ldGhvZCBTZWFyY2ggRXJyb3IgRGlhbG9nCi1zZWFyY2hFcnJvcl90aXRsZT1NZXRob2QgU2VhcmNoCi1zZWFyY2hFcnJvcl9tc2c9SVVQUzAxMDBFOiBTZWFyY2ggb3BlcmF0aW9uIGNhbm5vdCBwcm9jZWVkLgotc2VhcmNoRXJyb3JfcmVhc29uPU5vIG1ldGhvZCBsaWJyYXJ5IGlzIGN1cnJlbnRseSBvcGVuZWQuXG5cbk9wZW4gYSBtZXRob2QgbGlicmFyeSBhbmQgdHJ5IGFnYWluLgotCi0jIE1ldGhvZCBTZWFyY2ggUmVzdWx0Ci1zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudD1NZXRob2QgQ29udGVudAotc2VhcmNoUmVzdWx0X2NvbnRlbnRQYWNrYWdlcz1Db250ZW50IFBhY2thZ2VzCi1zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzPVN0YW5kYXJkIENhdGVnb3JpZXMKLXNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lcz1EaXNjaXBsaW5lcwotc2VhcmNoUmVzdWx0X2RvbWFpbnM9RG9tYWlucwotc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM9V29yayBQcm9kdWN0IFR5cGVzCi1zZWFyY2hSZXN1bHRfcm9sZVNldHM9Um9sZSBTZXRzCi1zZWFyY2hSZXN1bHRfdG9vbHM9VG9vbHMKLXNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzPUN1c3RvbSBDYXRlZ29yaWVzCi1zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzPVByb2Nlc3Nlcwotc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJucz1DYXBhYmlsaXR5IFBhdHRlcm5zCi1zZWFyY2hSZXN1bHRfZGVsaXZlcnlQcm9jZXNzZXM9RGVsaXZlcnkgUHJvY2Vzc2VzCi1zZWFyY2hSZXN1bHRfbWF0Y2g9Jyd7MH0nJyAtIDEgbWF0Y2gKLXNlYXJjaFJlc3VsdF9tYXRjaGVzPScnezB9JycgLSB7MX0gbWF0Y2hlcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzMzN2ZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpLkFic3RyYWN0UGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBTZWFyY2ggVUkgcGx1Zy1pbiBhY3RpdmF0b3IuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VhcmNoVUlQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9TZWFyY2hVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzBkMzJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvU2VhcmNoVUlSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBTZWFyY2ggVUkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNlYXJjaFVJUmVzb3VyY2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBCVU5ETEVfTkFNRSA9IFNlYXJjaFVJUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFN0cmluZ0xhYmVsX3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXNlU2Vuc2l0aXZlQ2hlY2tib3hfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnROYW1lTGFiZWxfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjb3BlR3JvdXBfdGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJvbGVDaGVja2JveF90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGFza0NoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB3b3JrUHJvZHVjdENoZWNrYm94X3RleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hRdWVyeV90ZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2NhbkxpYnJhcnlUYXNrX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzY2FuRWxlbWVudFRhc2tfbmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaEVycm9yX3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoRXJyb3JfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X21ldGhvZENvbnRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfY29udGVudFBhY2thZ2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3N0YW5kYXJkQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9kb21haW5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X3dvcmtQcm9kdWN0VHlwZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfcm9sZVNldHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfdG9vbHM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfY3VzdG9tQ2F0ZWdvcmllczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlYXJjaFJlc3VsdF9wcm9jZXNzZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZWFyY2hSZXN1bHRfY2FwYWJpbGl0eVBhdHRlcm5zOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X21hdGNoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VhcmNoUmVzdWx0X21hdGNoZXM7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTZWFyY2hVSVJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTZWFyY2hVSVJlc291cmNlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlLgotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hJbnB1dEV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQyZGYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuNQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kU2VhcmNoSW5wdXRFeHRlbnNpb24gewotCU1hcDw/LCA/PiBnZXRJbnB1dCgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoSW5wdXRGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwZjA4ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hJbnB1dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlYXJjaElucHV0RmFjdG9yeSB7Ci0JSU1ldGhvZFNlYXJjaElucHV0RXh0ZW5zaW9uIGNyZWF0ZVNlYXJjaElucHV0KENvbXBvc2l0ZSBjb21wb3NpdGUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoT3BlcmF0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmZmJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlYXJjaE9wZXJhdGlvbiB7Ci0Jdm9pZCBleGVjdXRlKE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0LCBJU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHJlc3VsdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFF1ZXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzhlZGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBzZWFyY2ggcXVlcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0aG9kU2VhcmNoUXVlcnkgZXh0ZW5kcyBJU2VhcmNoUXVlcnkgewotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoU2NvcGVHcm91cC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoU2NvcGVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzRhNTVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXAgewotCU1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIGdldFNlYXJjaFNjb3BlVmlld2VyKCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hTY29wZUdyb3VwRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9JTWV0aG9kU2VhcmNoU2NvcGVHcm91cEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc3NmUwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lNZXRob2RTZWFyY2hTY29wZUdyb3VwRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIExpY2Vuc2VkIE1hdGVyaWFscyAtIFByb3BlcnR5IG9mIElCTQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwNy0yMDA4LiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogCi0gKiBOb3RlIHRvIFUuUy4gR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0czoKLSAqIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUKLSAqIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSA3LjUKLSAqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZFNlYXJjaFNjb3BlR3JvdXBGYWN0b3J5IHsKLQkKLQlJTWV0aG9kU2VhcmNoU2NvcGVHcm91cCBjcmVhdGVTZWFyY2hTY29wZUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBiNTAxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdENvbGxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIG1ldGhvZCBzZWFyY2ggcmVzdWx0IGNvbGxlY3Rvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFJlc3VsdENvbGxlY3RvciB7Ci0KLQkvKioKLQkgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIG9iamVjdCB0byBzZWUgaWYgdGhlcmUgaXMgYSBtYXRjaCBpbiB0aGUgc2VhcmNoCi0JICogY3JpdGVyaWEuCi0JICogCi0JICogQHBhcmFtIG1hdGNoCi0JICogICAgICAgICAgICBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgbWV0aG9kIGVsZW1lbnQgdG8gbWF0Y2gKLQkgKi8KLQl2b2lkIGFjY2VwdChPYmplY3QgbWF0Y2gpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL0lTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWI2NmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvSVNlYXJjaFJlc3VsdFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hSZXN1bHRQcm92aWRlckZhY3RvcnkgewotCUlUcmVlQ29udGVudFByb3ZpZGVyIGNyZWF0ZVRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkKLQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjcmVhdGVUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCQotCUlMYWJlbFByb3ZpZGVyIGNyZWF0ZUxhYmVsUHJvdmlkZXIoKTsKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kRWxlbWVudFZpZXdTb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjNDFjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZEVsZW1lbnRWaWV3U29ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci0KLS8qKgotICogU29ydHMgdGhlIG1ldGhvZCBlbGVtZW50cyBpbiBhIHNwZWNpZmljIG9yZGVyIGZvciBkaXNwbGF5IGluIHRoZSBTZWFyY2gKLSAqIHZpZXcuCi0gKiA8cD4KLSAqIFRoZSBtZXRob2QgZWxlbWVudHMgYXJlIHNvcnRlZCBieSB0eXBlcy4gV2l0aGluIGVhY2ggdHlwZSwgdGhlIGVsZW1lbnRzIGFyZQotICogc29ydGVkIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRWaWV3U29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRWaWV3U29ydGVyKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXIjY29tcGFyZShWaWV3ZXIsIE9iamVjdCwKLQkgKiAgICAgIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYgKGUxIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQlpZiAoIShlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9IGVsc2UgaWYgKCEoZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBSb2xlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgUm9sZSkpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBUYXNrKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFRhc2spKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgUm9sZSB8fCBlMiBpbnN0YW5jZW9mIFRhc2spIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMiBpbnN0YW5jZW9mIFdvcmtQcm9kdWN0KSkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEd1aWRhbmNlKSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUgfHwgZTIgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTIgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCVN0cmluZyBuYW1lMSA9IGUxLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBuYW1lMiA9IGUyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghbmFtZTEuZXF1YWxzKG5hbWUyKSkgewotCQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgQ29udGVudENhdGVnb3J5KSB7Ci0JCQlpZiAoZTIgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4gfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZQotCQkJCQl8fCBlMiBpbnN0YW5jZW9mIFJvbGUgfHwgZTIgaW5zdGFuY2VvZiBUYXNrCi0JCQkJCXx8IGUyIGluc3RhbmNlb2YgV29ya1Byb2R1Y3QgfHwgZTIgaW5zdGFuY2VvZiBHdWlkYW5jZSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5Ci0JCQkJCSYmICEoZTIgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoIShlMSBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KQotCQkJCQkmJiBlMiBpbnN0YW5jZW9mIEN1c3RvbUNhdGVnb3J5KSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIENvbnRlbnRDYXRlZ29yeSkgewotCQkJCVN0cmluZyBuYW1lMSA9IGUxLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBuYW1lMiA9IGUyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCWlmICghbmFtZTEuZXF1YWxzKG5hbWUyKSkgewotCQkJCQlyZXR1cm4gY29sbGF0b3IuY29tcGFyZShuYW1lMSwgbmFtZTIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUHJvY2VzcykgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlICYmICEoZTIgaW5zdGFuY2VvZiBQcm9jZXNzKSkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgUHJvY2VzcykpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJaWYgKGUyIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luIHx8IGUyIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJldHVybiAxOwotCQkJfSBlbHNlIGlmIChlMiBpbnN0YW5jZW9mIFByb2Nlc3MgJiYgIShlMSBpbnN0YW5jZW9mIFByb2Nlc3MpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfSBlbHNlIGlmICghKGUyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCWlmIChlMiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBlMiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UKLQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCB8fCBlMiBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBQaGFzZSkgewotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgUGhhc2UpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgSXRlcmF0aW9uKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgUGhhc2UpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgSXRlcmF0aW9uKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgUGhhc2UgfHwgZTIgaW5zdGFuY2VvZiBJdGVyYXRpb24pIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgTWlsZXN0b25lKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgTWlsZXN0b25lKSkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlMSBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yKSB7Ci0JCQkJaWYgKGUyIGluc3RhbmNlb2YgQWN0aXZpdHkgfHwgZTIgaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWlmICghKGUyIGluc3RhbmNlb2YgUm9sZURlc2NyaXB0b3IpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUxIGluc3RhbmNlb2YgVGFza0Rlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZQotCQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcikgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoZTEgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpIHsKLQkJCQlpZiAoZTIgaW5zdGFuY2VvZiBBY3Rpdml0eSB8fCBlMiBpbnN0YW5jZW9mIE1pbGVzdG9uZQotCQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBSb2xlRGVzY3JpcHRvcgotCQkJCQkJfHwgZTIgaW5zdGFuY2VvZiBUYXNrRGVzY3JpcHRvcikgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJaWYgKCEoZTIgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdERlc2NyaXB0b3IpKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBlMSwgZTIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hIZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NjIzNDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuRXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS41Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoSGVscGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElNZXRob2RTZWFyY2hPcGVyYXRpb24gbmV3U2VhcmNoT3BlcmF0aW9uKCkgewotCQlPYmplY3QgZXh0ID0gRXh0ZW5zaW9uTWFuYWdlci5jcmVhdGVFeHRlbnNpb24oU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldElkKCksICJvcGVyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZihleHQgaW5zdGFuY2VvZiBJTWV0aG9kU2VhcmNoT3BlcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKElNZXRob2RTZWFyY2hPcGVyYXRpb24pIGV4dDsKLQkJfQotCQlyZXR1cm4gbmV3IE1ldGhvZFNlYXJjaE9wZXJhdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSW5wdXQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoSW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwNzZlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaElucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBzZWFyY2ggc3RyaW5ncyBhbmQgb3B0aW9ucyB0aGF0IGFyZSB1c2VkIGFzIGlucHV0cyB0byBhCi0gKiBtZXRob2Qgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaElucHV0IHsKLQotCXByaXZhdGUgU3RyaW5nIHNlYXJjaFN0cmluZzsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWVQYXR0ZXJuOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gd2hvbGVXb3JkOwotCi0JcHJpdmF0ZSBib29sZWFuIHJlZ0V4cDsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoU2NvcGUgc2VhcmNoU2NvcGU7Ci0KLQlwcml2YXRlIE1hcDxPYmplY3QsIE9iamVjdD4gYWRkaXRpb25hbElucHV0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VhcmNoU3RyaW5nCi0JICogICAgICAgICAgICBhIHNlYXJjaCBzdHJpbmcKLQkgKiBAcGFyYW0gbmFtZVBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQgbmFtZSBwYXR0ZXJuCi0JICogQHBhcmFtIGNhc2VTZW5zaXRpdmUKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBtYWtlIHRoZSBzZWFyY2ggY2FzZSBzZW5zaXRpdmUKLQkgKiBAcGFyYW0gd2hvbGVXb3JkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VhcmNoIGZvciB3aG9sZSB3b3JkIG9ubHkKLQkgKiBAcGFyYW0gcmVnRXhwCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VhcmNoIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbgotCSAqIEBwYXJhbSBzZWFyY2hTY29wZQotCSAqICAgICAgICAgICAgYSBzZWFyY2ggc2NvcGUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoSW5wdXQoU3RyaW5nIHNlYXJjaFN0cmluZywgU3RyaW5nIG5hbWVQYXR0ZXJuLAotCQkJYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBib29sZWFuIHdob2xlV29yZCwgYm9vbGVhbiByZWdFeHAsCi0JCQlNZXRob2RTZWFyY2hTY29wZSBzZWFyY2hTY29wZSkgewotCQl0aGlzLnNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZzsKLQkJdGhpcy5uYW1lUGF0dGVybiA9IG5hbWVQYXR0ZXJuOwotCQl0aGlzLmNhc2VTZW5zaXRpdmUgPSBjYXNlU2Vuc2l0aXZlOwotCQl0aGlzLndob2xlV29yZCA9IHdob2xlV29yZDsKLQkJdGhpcy5yZWdFeHAgPSByZWdFeHA7Ci0JCXRoaXMuc2VhcmNoU2NvcGUgPSBzZWFyY2hTY29wZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggc3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlYXJjaCBzdHJpbmcgdG8gbG9vayBmb3IgdGhlIE1ldGhvZCBlbGVtZW50IGNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaFN0cmluZygpIHsKLQkJcmV0dXJuIHNlYXJjaFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIHBhdHRlcm4uCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBwYXR0ZXJuIHVzZWQgdG8gbWF0Y2ggdGhlIE1ldGhvZCBlbGVtZW50IG5hbWVzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lUGF0dGVybigpIHsKLQkJcmV0dXJuIG5hbWVQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIHNlYXJjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWFyY2ggaXMgY2FzZSBzZW5zaXRpdmUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gY2FzZVNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3aG9sZSB3b3JkIG9wdGlvbiBvZiB0aGUgc2VhcmNoLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNlYXJjaCBpcyBiYXNlZCBvbiB3aG9sZSB3b3JkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0V2hvbGVXb3JkKCkgewotCQlyZXR1cm4gd2hvbGVXb3JkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcHRpb24gb2YgdGhlIHNlYXJjaC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzZWFyY2ggaXMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UmVndWxhckV4cHJlc3Npb24oKSB7Ci0JCXJldHVybiByZWdFeHA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIHNjb3BlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNlYXJjaCBzY29wZQotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZSBnZXRTZWFyY2hTY29wZSgpIHsKLQkJcmV0dXJuIHNlYXJjaFNjb3BlOwotCX0KLQotCXB1YmxpYyBNYXA8T2JqZWN0LCBPYmplY3Q+IGdldEFkZGl0aW9uYWxJbnB1dCgpIHsKLQkJaWYoYWRkaXRpb25hbElucHV0ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxJbnB1dCA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOwotCQl9Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5wdXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MzZiZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnhtbC5BYnN0cmFjdFNBWFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFVdGlsOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogUGVyZm9ybXMgYSBtZXRob2Qgc2VhcmNoIGJ5IGl0ZXJhdGluZyB0aGUgY3VycmVudCBtZXRob2QgbGlicmFyeSBhbmQgcGFyc2luZwotICogdGhlIGNvbnRlbnQgZWxlbWVudCBYTUkgZmlsZXMgd2hlcmUgbmVjZXNzYXJ5LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hPcGVyYXRpb24gaW1wbGVtZW50cyBJTWV0aG9kU2VhcmNoT3BlcmF0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FOX0xJQlJBUllfVEVYVCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNjYW5MaWJyYXJ5VGFza19uYW1lOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FOX0VMRU1FTlRfVEVYVCA9IFNlYXJjaFVJUmVzb3VyY2VzLnNjYW5FbGVtZW50VGFza19uYW1lOyAKLQotCXByaXZhdGUgYm9vbGVhbiBkZWJ1ZzsKLQotCXByb3RlY3RlZCBNZXRob2RTZWFyY2hJbnB1dCBzZWFyY2hJbnB1dDsKLQotCXByaXZhdGUgSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQ7Ci0KLQlwcml2YXRlIFN0cmluZyBzZWFyY2hTdHJpbmc7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FzZVNlbnNpdGl2ZTsKLQotCXByaXZhdGUgYm9vbGVhbiByZWdFeHA7Ci0KLQlwcml2YXRlIFBhdHRlcm4gc2VhcmNoU3RyaW5nUGF0dGVybjsKLQotCXByaXZhdGUgUGF0dGVybiBlbGVtZW50TmFtZVBhdHRlcm47Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnRTY2FubmVyIGVsZW1lbnRTY2FubmVyOwotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyc2VkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3I7Ci0KLQkvLyBTY2FucyB0aGUgY29udGVudCBlbGVtZW50IFhNSSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhIE1ldGhvZCBlbGVtZW50IHRvCi0JLy8gbG9vayBmb3IgdGhlIHNlYXJjaCBzdHJpbmcuCi0JcHJpdmF0ZSBjbGFzcyBNZXRob2RFbGVtZW50U2Nhbm5lciBleHRlbmRzIEFic3RyYWN0U0FYUGFyc2VyIHsKLQotCQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZWxlbWVudDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkJICovCi0JCXB1YmxpYyBNZXRob2RFbGVtZW50U2Nhbm5lcigpIHsKLQkJCXN1cGVyKG51bGwsIGZhbHNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQYXJzZXMgdGhlIGNvbnRlbnQgWE1JIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBlbGVtZW50Ci0JCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFyc2UoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJU3RyaW5nIGVsZW1lbnRDb250ZW50UGF0aCA9IGdldEVsZW1lbnRQYXRoKGVsZW1lbnQpOwotCQkJU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBlbGVtZW50LmdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWlmIChzZWFyY2hTdHJpbmdQYXR0ZXJuLm1hdGNoZXIoYnJpZWZEZXNjcmlwdGlvbikuZmluZCgpKSB7Ci0JCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCX0KLQkJCWlmIChlbGVtZW50Q29udGVudFBhdGggIT0gbnVsbAotCQkJCQkmJiAhcGFyc2VkRmlsZXMuY29udGFpbnMoZWxlbWVudENvbnRlbnRQYXRoKSkgewotCQkJCXN1cGVyLnBhcnNlKGVsZW1lbnRDb250ZW50UGF0aCk7Ci0JCQkJcGFyc2VkRmlsZXMuYWRkKGVsZW1lbnRDb250ZW50UGF0aCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBBYnN0cmFjdFNBWFBhcnNlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywKLQkJICogICAgICBBdHRyaWJ1dGVzKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkwsIFN0cmluZyBsb2NhbE5hbWUsCi0JCQkJU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotCQkJCWlmICghbmFtZS5lcXVhbHMoImJyaWVmRGVzY3JpcHRpb24iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JCQkJCWlmIChzZWFyY2hTdHJpbmdQYXR0ZXJuLm1hdGNoZXIodmFsdWUpLmZpbmQoKSkgewotCQkJCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIEFic3RyYWN0U0FYUGFyc2VyI2VuZEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSTCwgU3RyaW5nIGxvY2FsTmFtZSwKLQkJCQlTdHJpbmcgcW5hbWUpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHN0ckJ1Zi50b1N0cmluZygpOwotCQkJaWYgKHNlYXJjaFN0cmluZ1BhdHRlcm4ubWF0Y2hlcih2YWx1ZSkuZmluZCgpKSB7Ci0JCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCX0KLQkJCXN0ckJ1Zi5zZXRMZW5ndGgoMCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHNlYXJjaFN0cmluZwotCSAqICAgICAgICAgICAgYSBzZWFyY2ggc3RyaW5nCi0JICogQHBhcmFtIG5hbWVQYXR0ZXJuCi0JICogICAgICAgICAgICBhIG5hbWUgcGF0dGVybgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHJlc3VsdCBjb2xsZWN0b3IKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoT3BlcmF0aW9uKE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0LAotCQkJSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQpIHsKLQkJaW5pdGlhbGl6ZShzZWFyY2hJbnB1dCwgcmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kU2VhcmNoT3BlcmF0aW9uKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0LAotCQkJSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQpIHsKLQkJdGhpcy5zZWFyY2hJbnB1dCA9IHNlYXJjaElucHV0OwotCQl0aGlzLnJlc3VsdCA9IHJlc3VsdDsKLQotCQljYXNlU2Vuc2l0aXZlID0gc2VhcmNoSW5wdXQuZ2V0Q2FzZVNlbnNpdGl2ZSgpOwotCQlyZWdFeHAgPSBzZWFyY2hJbnB1dC5nZXRSZWd1bGFyRXhwcmVzc2lvbigpOwotCQllbGVtZW50TmFtZVBhdHRlcm4gPSBNZXRob2RTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oc2VhcmNoSW5wdXQKLQkJCQkuZ2V0TmFtZVBhdHRlcm4oKSwgZmFsc2UsIGZhbHNlKTsKLQotCQlkZWJ1ZyA9IFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCi0JCXNlYXJjaFN0cmluZyA9IHNlYXJjaElucHV0LmdldFNlYXJjaFN0cmluZygpOwotCQlpZiAoc2VhcmNoU3RyaW5nID09IG51bGwpCi0JCQlzZWFyY2hTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2VhcmNoU3RyaW5nLmxlbmd0aCgpID4gMCAmJiAhc2VhcmNoU3RyaW5nLmVxdWFscygiKiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWVsZW1lbnRTY2FubmVyID0gbmV3IE1ldGhvZEVsZW1lbnRTY2FubmVyKCk7Ci0JCQlzZWFyY2hTdHJpbmdQYXR0ZXJuID0gTWV0aG9kU2VhcmNoUGF0dGVybi5jcmVhdGVQYXR0ZXJuKAotCQkJCQlzZWFyY2hTdHJpbmcsIGNhc2VTZW5zaXRpdmUsIHJlZ0V4cCk7Ci0JCX0KLQotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQKLQkJCQkJLnByaW50bG4oIk1ldGhvZFNlYXJjaE9wZXJhdGlvbiBjb25zdHJ1Y3Rvcjogc2VhcmNoU3RyaW5nPSIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSsgc2VhcmNoU3RyaW5nCi0JCQkJCQkJKyAiLCBlbGVtZW50TmFtZVBhdHRlcm49IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJKyBzZWFyY2hJbnB1dC5nZXROYW1lUGF0dGVybigpCi0JCQkJCQkJKyAiLCBjYXNlU2Vuc2l0aXZlPSIgKyBjYXNlU2Vuc2l0aXZlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPE1ldGhvZFBsdWdpbj4gZ2V0U2VhcmNoYWJsZU1ldGhvZFBsdWdpbnMoKSB7Ci0JCXJldHVybiBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW5zKExpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGVzIHRoZSBzZWFyY2ggb3BlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiAgICAgICAgICAgIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdGhpcy5wcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JCXRoaXMucHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhTQ0FOX0xJQlJBUllfVEVYVCwgNzUwMCk7Ci0KLQkJLy8gSXRlcmF0ZSB0aGUgTWV0aG9kIFBsdWdpbiB0byBsb29rIGZvciBlbGVtZW50cyB0aGF0IG1hdGNoIHRoZSBuYW1lCi0JCS8vIHBhdHRlcm4uCi0JCUNvbGxlY3Rpb248TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zID0gZ2V0U2VhcmNoYWJsZU1ldGhvZFBsdWdpbnMoKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRob2RQbHVnaW4+IGkgPSBtZXRob2RQbHVnaW5zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpCi0JCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgaS5uZXh0KCk7Ci0JCQltYXRjaFBhdHRlcm4obWV0aG9kUGx1Z2luKTsKLQotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlOwotCQkJaWYgKHNlYXJjaElucHV0LmdldFNlYXJjaFNjb3BlKCkuaW5jbHVkZUNvcmVDb250ZW50KCkpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNvcmVDb250ZW50UGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLlNUQU5EQVJEX0NBVEVHT1JZKSkgewotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQuZGlzY2lwbGluZURlZmluaXRpb25QYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmRvbWFpblBhdGgpOwotCQkJCXNlYXJjaE1ldGhvZFBhY2thZ2VzKG1ldGhvZFBhY2thZ2UpOwotCQkJCW1ldGhvZFBhY2thZ2UgPSBVbWFVdGlsLmZpbmRNZXRob2RQYWNrYWdlKG1ldGhvZFBsdWdpbiwKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkRFRkFVTFQud29ya1Byb2R1Y3RUeXBlUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5yb2xlU2V0UGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC50b29sUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLkNVU1RPTV9DQVRFR09SWSkpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmN1c3RvbUNhdGVnb3J5UGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLkNBUEFCSUxJVFlfUEFUVEVSTikpIHsKLQkJCQltZXRob2RQYWNrYWdlID0gVW1hVXRpbC5maW5kTWV0aG9kUGFja2FnZShtZXRob2RQbHVnaW4sCi0JCQkJCQlNb2RlbFN0cnVjdHVyZS5ERUZBVUxULmNhcGFiaWxpdHlQYXR0ZXJuUGF0aCk7Ci0JCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMobWV0aG9kUGFja2FnZSk7Ci0JCQl9Ci0KLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoCi0JCQkJCU1ldGhvZFNlYXJjaFNjb3BlLkRFTElWRVJZX1BST0NFU1MpKSB7Ci0JCQkJbWV0aG9kUGFja2FnZSA9IFVtYVV0aWwuZmluZE1ldGhvZFBhY2thZ2UobWV0aG9kUGx1Z2luLAotCQkJCQkJTW9kZWxTdHJ1Y3R1cmUuREVGQVVMVC5kZWxpdmVyeVByb2Nlc3NQYXRoKTsKLQkJCQlzZWFyY2hNZXRob2RQYWNrYWdlcyhtZXRob2RQYWNrYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGEgTWV0aG9kIFBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIG1ldGhvZFBhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBhY2thZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hNZXRob2RQYWNrYWdlcyhNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2UgPT0gbnVsbAotCQkJCXx8IG1ldGhvZFBhY2thZ2UuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCU1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG1ldGhvZFBhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkvLyBBZGQgdGhlIGFzc29jaWF0ZWQgQ2FwYWJpbGl0eVBhdHRlcm4gb3IgRGVsaXZlcnlQcm9jZXNzIHRvIHRoZQotCQkJLy8gc2VhcmNoIHJlc3VsdC4KLQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBtZXRob2RQYWNrYWdlOwotCQkJbWF0Y2hQYXR0ZXJuKHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpKTsKLQkJfSBlbHNlIGlmICghaXNJbnRlcm5hbFByb2Nlc3NQYWNrYWdlKG1ldGhvZFBhY2thZ2UpKSB7Ci0JCQltYXRjaFBhdHRlcm4obWV0aG9kUGFja2FnZSk7Ci0JCX0KLQotCQlMaXN0IGNoaWxkUGFja2FnZXMgPSBtZXRob2RQYWNrYWdlLmdldENoaWxkUGFja2FnZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gY2hpbGRQYWNrYWdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJc2VhcmNoTWV0aG9kUGFja2FnZXMoKE1ldGhvZFBhY2thZ2UpIGkubmV4dCgpKTsKLQkJfQotCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSkgbWV0aG9kUGFja2FnZTsKLQkJCUxpc3QgY29udGVudEVsZW1lbnRzID0gY29udGVudFBhY2thZ2UuZ2V0Q29udGVudEVsZW1lbnRzKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGogPSBjb250ZW50RWxlbWVudHMuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCkKLQkJCQkJJiYgIXByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk7KSB7Ci0JCQkJQ29udGVudEVsZW1lbnQgY29udGVudEVsZW1lbnQgPSAoQ29udGVudEVsZW1lbnQpIGoubmV4dCgpOwotCQkJCW1hdGNoUGF0dGVybihjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgQXJ0aWZhY3QpIHsKLQkJCQkJc2VhcmNoQ29udGFpbmVkQXJ0aWZhY3RzKChBcnRpZmFjdCkgY29udGVudEVsZW1lbnQpOwotCQkJCX0gZWxzZSBpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBEaXNjaXBsaW5lKSB7Ci0JCQkJCXNlYXJjaFN1YkRpc2NpcGxpbmVzKChEaXNjaXBsaW5lKSBjb250ZW50RWxlbWVudCk7Ci0JCQkJfSBlbHNlIGlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQkJCXNlYXJjaFN1YlByYWN0aWNlcygoUHJhY3RpY2UpIGNvbnRlbnRFbGVtZW50KTsKLQkJCQl9IGVsc2UgaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQkJCXNlYXJjaFN1YkRvbWFpbnMoKERvbWFpbikgY29udGVudEVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChtZXRob2RQYWNrYWdlIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKSBtZXRob2RQYWNrYWdlOwotCQkJTGlzdCBwcm9jZXNzRWxlbWVudHMgPSBwcm9jZXNzUGFja2FnZS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaiA9IHByb2Nlc3NFbGVtZW50cy5pdGVyYXRvcigpOyBqLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgai5uZXh0KCk7Ci0vLwkJCQlpZiAoIShwcm9jZXNzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5KSkgewotCQkJCQltYXRjaFBhdHRlcm4ocHJvY2Vzc0VsZW1lbnQpOwotLy8JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBhbiBpbnRlcm5hbCBQcm9jZXNzCi0JICogUGFja2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZQotCSAqICAgICAgICAgICAgYSBtZXRob2Qgb3IgcHJvY2VzcyBwYWNrYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBpcyBhbiBpbnRlcm5hbCBwcm9jZXNzCi0JICogICAgICAgICBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbnRlcm5hbFByb2Nlc3NQYWNrYWdlKE1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSkgewotCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlKSB7Ci0JCQlpZiAoVW1hVXRpbC5nZXRQcm9jZXNzQ29tcG9uZW50KG1ldGhvZFBhY2thZ2UpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIGNvbnRhaW5lZCBhcnRpZmFjdHMgb2YgYW4gYXJ0aWZhY3QuCi0JICogCi0JICogQHBhcmFtIGFydGlmYWN0Ci0JICogICAgICAgICAgICBhbiBhcnRpZmFjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNlYXJjaENvbnRhaW5lZEFydGlmYWN0cyhBcnRpZmFjdCBhcnRpZmFjdCkgewotCQlpZiAoYXJ0aWZhY3QgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuaXRlcmF0b3IoKTsgaQotCQkJCQkuaGFzTmV4dCgpCi0JCQkJCSYmICFwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOykgewotCQkJCUFydGlmYWN0IGNvbnRhaW5lZEFydGlmYWN0ID0gKEFydGlmYWN0KSBpLm5leHQoKTsKLQkJCQltYXRjaFBhdHRlcm4oY29udGFpbmVkQXJ0aWZhY3QpOwotCQkJCXNlYXJjaENvbnRhaW5lZEFydGlmYWN0cyhjb250YWluZWRBcnRpZmFjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2hlcyB0aGUgc3ViIGRpc2NpcGxpbmVzIG9mIGEgZGlzY2lwbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzY2lwbGluZQotCSAqICAgICAgICAgICAgYSBkaXNjaXBsaW5lCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoU3ViRGlzY2lwbGluZXMoRGlzY2lwbGluZSBkaXNjaXBsaW5lKSB7Ci0JCWlmIChkaXNjaXBsaW5lICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGRpc2NpcGxpbmUuZ2V0U3ViZGlzY2lwbGluZSgpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlEaXNjaXBsaW5lIHN1YkRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSkgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YkRpc2NpcGxpbmUpOwotCQkJCXNlYXJjaFN1YkRpc2NpcGxpbmVzKHN1YkRpc2NpcGxpbmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIHN1YiBwcmFjdGljZXMgb2YgYSBwcmFjdGljZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJhY3RpY2UKLQkgKiAgICAgICAgICAgIGEgcHJhY3RpY2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZWFyY2hTdWJQcmFjdGljZXMoUHJhY3RpY2UgcHJhY3RpY2UpIHsKLQkJaWYgKHByYWN0aWNlICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHByYWN0aWNlLmdldFN1YlByYWN0aWNlcygpLml0ZXJhdG9yKCk7IGkKLQkJCQkJLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlQcmFjdGljZSBzdWJQcmFjdGljZSA9IChQcmFjdGljZSkgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YlByYWN0aWNlKTsKLQkJCQlzZWFyY2hTdWJQcmFjdGljZXMoc3ViUHJhY3RpY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoZXMgdGhlIHN1YiBkb21haW5zIG9mIGEgZG9tYWluLgotCSAqIAotCSAqIEBwYXJhbSBkb21haW4KLQkgKiAgICAgICAgICAgIGEgZG9tYWluCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2VhcmNoU3ViRG9tYWlucyhEb21haW4gZG9tYWluKSB7Ci0JCWlmIChkb21haW4gIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gZG9tYWluLmdldFN1YmRvbWFpbnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKQotCQkJCQkmJiAhcHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTspIHsKLQkJCQlEb21haW4gc3ViRG9tYWluID0gKERvbWFpbikgaS5uZXh0KCk7Ci0JCQkJbWF0Y2hQYXR0ZXJuKHN1YkRvbWFpbik7Ci0JCQkJc2VhcmNoU3ViRG9tYWlucyhzdWJEb21haW4pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgdG8gdGhlIHNlYXJjaCByZXN1bHQgY29sbGVjdGlvbiBpZiBpdHMgbmFtZQotCSAqIG9yIHByZXNlbnRhdGlvbiBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgcGF0dGVybi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1hdGNoUGF0dGVybihNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChzZWFyY2hJbnB1dC5nZXRTZWFyY2hTY29wZSgpLmluY2x1ZGUoZWxlbWVudCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyB0YXNrTmFtZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFNDQU5fRUxFTUVOVF9URVhULAotCQkJCQkJbmV3IE9iamVjdFtdIHsgbmFtZSB9KTsKLQkJCQlwcm9ncmVzc01vbml0b3Iuc2V0VGFza05hbWUodGFza05hbWUpOwotCQkJCWJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQkJCVN0cmluZyBwcmVzZW50YXRpb25OYW1lID0gKChEZXNjcmliYWJsZUVsZW1lbnQpIGVsZW1lbnQpCi0JCQkJCQkJLmdldFByZXNlbnRhdGlvbk5hbWUoKTsKLQkJCQkJZm91bmRNYXRjaCA9IChuYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuLm1hdGNoZXIoCi0JCQkJCQkJbmFtZSkubWF0Y2hlcygpKQotCQkJCQkJCXx8IChwcmVzZW50YXRpb25OYW1lICE9IG51bGwgJiYgZWxlbWVudE5hbWVQYXR0ZXJuCi0JCQkJCQkJCQkubWF0Y2hlcihwcmVzZW50YXRpb25OYW1lKS5tYXRjaGVzKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvdW5kTWF0Y2ggPSAobmFtZSAhPSBudWxsICYmIGVsZW1lbnROYW1lUGF0dGVybi5tYXRjaGVyKAotCQkJCQkJCW5hbWUpLm1hdGNoZXMoKSk7Ci0JCQkJfQotCQkJCWlmIChmb3VuZE1hdGNoKSB7Ci0JCQkJCWlmIChzZWFyY2hTdHJpbmcubGVuZ3RoKCkgPT0gMCB8fCBzZWFyY2hTdHJpbmcuZXF1YWxzKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmVzdWx0LmFjY2VwdChlbGVtZW50KTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZWxlbWVudFNjYW5uZXIucGFyc2UoZWxlbWVudCk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGNvbnRlbnQgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kCi0JICogZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnRQYXRoKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGVzY3JpYmFibGVFbGVtZW50KSB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgZWxlbWVudDsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBkZXNjcmliYWJsZUVsZW1lbnQKLQkJCQkJLmdldFByZXNlbnRhdGlvbigpOwotCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5lUmVzb3VyY2UoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLQkJfQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJVVJJIHJlc291cmNlVVJJID0gcmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlpZiAocmVzb3VyY2VVUkkgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvdXJjZVVSSS50b0ZpbGVTdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKE1ldGhvZFNlYXJjaElucHV0IHNlYXJjaElucHV0LAotCQkJSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpbml0aWFsaXplKHNlYXJjaElucHV0LCByZXN1bHQpOwotCQlleGVjdXRlKG1vbml0b3IpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoUGF0dGVybi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hQYXR0ZXJuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzYxMTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOwotCi0vKioKLSAqIFBhdHRlcm4gY29udHJ1Y3RvciBmb3IgYSBtZXRob2Qgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFBhdHRlcm4gewotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIEFsbAotCSAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBzaG91bGQgYmUgc3RhdGljLgotCSAqLwotCXByaXZhdGUgTWV0aG9kU2VhcmNoUGF0dGVybigpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEKLQkgKiA8Y29kZT5QYXR0ZXJuPGNvZGU+IG9iamVjdCBmcm9tIHRoZSBwYXR0ZXJuIHN0cmluZyB1c2VkIGluIE1ldGhvZCBTZWFyY2guCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHBhdHRlcm4gc3RyaW5nCi0JICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIGNyZWF0ZSBhIGNhc2UgaW5zZW5zaXR2ZSBwYXR0ZXJuCi0JICogQHBhcmFtIGlzUmVnZXhTZWFyY2gKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCB0cmVhdCB0aGUgcGF0dGVybiBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuCi0JICogQHJldHVybiBhIG5ldyA8Y29kZT5QYXR0ZXJuPGNvZGU+IG9iamVjdAotCSAqIEB0aHJvd3MgPGNvZGU+UGF0dGVyblN5bnRheEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGF0dGVybiBjcmVhdGVQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLAotCQkJYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIGJvb2xlYW4gaXNSZWdleFNlYXJjaCkKLQkJCXRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKLQkJaWYgKCFpc1JlZ2V4U2VhcmNoKSB7Ci0JCQlwYXR0ZXJuID0gdG9SZWdleFBhdHRlcm4ocGF0dGVybik7Ci0JCX0KLQotCQlpZiAoIWlzQ2FzZVNlbnNpdGl2ZSkgewotCQkJcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwYXR0ZXJuLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUKLQkJCQkJfCBQYXR0ZXJuLlVOSUNPREVfQ0FTRSB8IFBhdHRlcm4uTVVMVElMSU5FKTsKLQkJfQotCi0JCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybiwgUGF0dGVybi5NVUxUSUxJTkUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgcGF0dGVybiBzdHJpbmcgd2l0aCAnKicgYW5kICc/JyBpbnRvIGEgcmVndWxhciBleHByZXNzaW9uCi0JICogcGF0dGVybiBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHBhdHRlcm4KLQkgKiAgICAgICAgICAgIGEgcGF0dGVybiBzdHJpbmcKLQkgKiBAcmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvUmVnZXhQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7Ci0JCWludCBwYXR0ZXJuTGVuZ3RoID0gcGF0dGVybi5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIocGF0dGVybkxlbmd0aCk7Ci0KLQkJYm9vbGVhbiBlc2NhcGVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gcXVvdGluZyA9IGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybkxlbmd0aDsgaSsrKSB7Ci0JCQljaGFyIGNoID0gcGF0dGVybi5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQljYXNlICcqJzoKLQkJCQlpZiAoIWVzY2FwZWQpIHsKLQkJCQkJaWYgKHF1b3RpbmcpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlxdW90aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0LmFwcGVuZCgiLioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWVzY2FwZWQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJz8nOgotCQkJCWlmICghZXNjYXBlZCkgewotCQkJCQlpZiAocXVvdGluZykgewotCQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxFIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXF1b3RpbmcgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXN1bHQuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllc2NhcGVkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdcXCc6Ci0JCQkJaWYgKCFlc2NhcGVkKSB7Ci0JCQkJCWVzY2FwZWQgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVzY2FwZWQgPSBmYWxzZTsKLQkJCQkJaWYgKHF1b3RpbmcpIHsKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlxdW90aW5nID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoIXF1b3RpbmcpIHsKLQkJCQkJcmVzdWx0LmFwcGVuZCgiXFxRIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcXVvdGluZyA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChlc2NhcGVkICYmIGNoICE9ICcqJyAmJiBjaCAhPSAnPycgJiYgY2ggIT0gJ1xcJykgewotCQkJCQlyZXN1bHQuYXBwZW5kKCdcXCcpOwotCQkJCX0KLQkJCQlyZXN1bHQuYXBwZW5kKGNoKTsKLQkJCQllc2NhcGVkID0gKGNoID09ICdcXCcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHF1b3RpbmcpIHsKLQkJCXJlc3VsdC5hcHBlbmQoIlxcRSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFF1ZXJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTlhZGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci0KLS8qKgotICogRW5jYXBzdWxhdGVzIHRoZSBzZWFyY2ggc3RyaW5ncyBhbmQgb3B0aW9ucyBmb3IgYSBtZXRob2Qgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFF1ZXJ5IGltcGxlbWVudHMgSVNlYXJjaFF1ZXJ5IHsKLQotCXByaXZhdGUgTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQ7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcKLQkgKiAgICAgICAgICAgIGEgc2VhcmNoIHN0cmluZwotCSAqIEBwYXJhbSBuYW1lUGF0dGVybgotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCBuYW1lIHBhdHRlcm4KLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoUXVlcnkoTWV0aG9kU2VhcmNoSW5wdXQgc2VhcmNoSW5wdXQpIHsKLQkJdGhpcy5zZWFyY2hJbnB1dCA9IHNlYXJjaElucHV0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9jZXNzTW9uaXRvcikgewotCQlmaW5hbCBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0ID0gKE1ldGhvZFNlYXJjaFJlc3VsdCkgZ2V0U2VhcmNoUmVzdWx0KCk7Ci0JCXNlYXJjaFJlc3VsdC5yZW1vdmVBbGwoKTsKLQkJSVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHQgPSBuZXcgSVNlYXJjaFJlc3VsdENvbGxlY3RvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjY2VwdChPYmplY3QgbWF0Y2gpIHsKLQkJCQlpZiAobWF0Y2ggaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50Ci0JCQkJCQkmJiAhVG5nVXRpbC5pc1ByZWRlZmluZWQoKE1ldGhvZEVsZW1lbnQpIG1hdGNoKSkgewotCQkJCQlPYmplY3RbXSBtYXRjaGVzID0gc2VhcmNoUmVzdWx0LmdldE1hdGNoZXMobWF0Y2gpOwotCQkJCQlpZiAobWF0Y2hlcyA9PSBudWxsIHx8IG1hdGNoZXMubGVuZ3RoID09IDApIHsKLQkJCQkJCXNlYXJjaFJlc3VsdC5hZGRNYXRjaChuZXcgTWF0Y2gobWF0Y2gsIE1hdGNoLlVOSVRfTElORSwKLQkJCQkJCQkJMSwgMSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotLy8JCU1ldGhvZFNlYXJjaE9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgTWV0aG9kU2VhcmNoT3BlcmF0aW9uKAotLy8JCQkJc2VhcmNoSW5wdXQsIHJlc3VsdCk7Ci0vLwkJb3BlcmF0aW9uLmV4ZWN1dGUocHJvY2Vzc01vbml0b3IpOwotCQlJTWV0aG9kU2VhcmNoT3BlcmF0aW9uIG9wID0gTWV0aG9kU2VhcmNoSGVscGVyLm5ld1NlYXJjaE9wZXJhdGlvbigpOwotCQlvcC5leGVjdXRlKHNlYXJjaElucHV0LCByZXN1bHQsIHByb2Nlc3NNb25pdG9yKTsKLQkJcHJvY2Vzc01vbml0b3IuZG9uZSgpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjZ2V0TGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hRdWVyeV90ZXh0OyAKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUmVydW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJaWYgKHNlYXJjaFJlc3VsdCA9PSBudWxsKSB7Ci0JCQlzZWFyY2hSZXN1bHQgPSBuZXcgTWV0aG9kU2VhcmNoUmVzdWx0KHRoaXMpOwotCQl9Ci0JCXJldHVybiBzZWFyY2hSZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaElucHV0IGdldFNlYXJjaElucHV0KCkgewotCQlyZXR1cm4gc2VhcmNoSW5wdXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFJlc3VsdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxNjMxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuU2VhcmNoVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGUgbWV0aG9kIHNlYXJjaCByZXN1bHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2VhcmNoUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IGltcGxlbWVudHMKLQkJSUVkaXRvck1hdGNoQWRhcHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFUQ0hfTEFCRUwgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfbWF0Y2g7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BVENIRVNfTEFCRUwgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfbWF0Y2hlczsgCi0KLQkvLyBUaGUgc2VhcmNoIHF1ZXJ5LgotCXByaXZhdGUgTWV0aG9kU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBzZWFyY2hRdWVyeQotCSAqICAgICAgICAgICAgYSBtZXRob2Qgc2VhcmNoIHF1ZXJ5Ci0JICovCi0JcHVibGljIE1ldGhvZFNlYXJjaFJlc3VsdChNZXRob2RTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSkgewotCQl0aGlzLnNlYXJjaFF1ZXJ5ID0gc2VhcmNoUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRRdWVyeSgpCi0JICovCi0JcHVibGljIElTZWFyY2hRdWVyeSBnZXRRdWVyeSgpIHsKLQkJcmV0dXJuIHNlYXJjaFF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIFNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZURlc2NyaXB0b3IoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kU2VhcmNoLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdCNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJLy8gVE9ETzogRGlzcGxheSBzZWFyY2ggcmVzdWx0IGluIHRoZSBmb3JtOgotCQkvLyAgICAnY2FuZGlkYXRlJyAtIDYgbWF0Y2hlcyBpbiA0IGVsZW1lbnRzLgotCQlTdHJpbmcgc2VhcmNoU3RyaW5nID0gc2VhcmNoUXVlcnkuZ2V0U2VhcmNoSW5wdXQoKS5nZXRTZWFyY2hTdHJpbmcoKTsKLQkJaW50IG1hdGNoQ291bnQgPSBnZXRNYXRjaENvdW50KCk7Ci0JCWlmIChtYXRjaENvdW50ID09IDEpIHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChNQVRDSF9MQUJFTCwKLQkJCQkJbmV3IE9iamVjdFtdIHsgc2VhcmNoU3RyaW5nIH0pOwkJCi0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoTUFUQ0hFU19MQUJFTCwgbmV3IE9iamVjdFtdIHsKLQkJCQkJc2VhcmNoU3RyaW5nLCAiIiArIG1hdGNoQ291bnQgfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQjZ2V0VG9vbHRpcCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sdGlwKCkgewotCQlyZXR1cm4gZ2V0TGFiZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCNnZXRFZGl0b3JNYXRjaEFkYXB0ZXIoKQotCSAqLwotCXB1YmxpYyBJRWRpdG9yTWF0Y2hBZGFwdGVyIGdldEVkaXRvck1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQjZ2V0RmlsZU1hdGNoQWRhcHRlcigpCi0JICovCi0JcHVibGljIElGaWxlTWF0Y2hBZGFwdGVyIGdldEZpbGVNYXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNpc1Nob3duSW5FZGl0b3IoTWF0Y2gsCi0JICogICAgICBJRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRWRpdG9yTWF0Y2hBZGFwdGVyI2NvbXB1dGVDb250YWluZWRNYXRjaGVzKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCwKLQkgKiAgICAgIElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyBNYXRjaFtdIGNvbXB1dGVDb250YWluZWRNYXRjaGVzKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQsCi0JCQlJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL01ldGhvZFNlYXJjaFNjb3BlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMWRjMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkuTGlicmFyeVVJVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoZSBtZXRob2Qgc2VhcmNoIHNjb3BlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RTZWFyY2hTY29wZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gIlJvb3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfQ09OVEVOVCA9IExpYnJhcnlVSVRleHQuVEVYVF9NRVRIT0RfQ09OVEVOVDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUk9MRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0sgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfVEFTSzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVCA9IExpYnJhcnlVSVRleHQuVEVYVF9XT1JLX1BST0RVQ1Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRSA9IExpYnJhcnlVSVRleHQuVEVYVF9HVUlEQU5DRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLTElTVCA9IExpYnJhcnlVSVRleHQuVEVYVF9DSEVDS0xJU1Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05DRVBUID0gTGlicmFyeVVJVGV4dC5URVhUX0NPTkNFUFQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTGlicmFyeVVJVGV4dC5URVhUX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFID0gTGlicmFyeVVJVGV4dC5URVhUX0VYQU1QTEU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlERUxJTkUgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfR1VJREVMSU5FOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJBQ1RJQ0UgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJBQ1RJQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUkVQT1JUOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0FCTEVfQVNTRVQgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUkVVU0FCTEVfQVNTRVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0FETUFQID0gTGlicmFyeVVJVGV4dC5URVhUX1JPQURNQVA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUSU5HX01BVEVSSUFMID0gTGlicmFyeVVJVGV4dC5URVhUX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURSA9IExpYnJhcnlVSVRleHQuVEVYVF9URU1QTEFURTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREVGSU5JVElPTiA9IExpYnJhcnlVSVRleHQuVEVYVF9URVJNX0RFRklOSVRJT047Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUiA9IExpYnJhcnlVSVRleHQuVEVYVF9UT09MX01FTlRPUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFUEFQRVIgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfV0hJVEVQQVBFUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0NBVEVHT1JZID0gTGlicmFyeVVJVGV4dC5URVhUX1NUQU5EQVJEX0NBVEVHT1JZOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JZID0gTGlicmFyeVVJVGV4dC5URVhUX0NVU1RPTV9DQVRFR09SWTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1MgPSBMaWJyYXJ5VUlUZXh0LlRFWFRfUFJPQ0VTUzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTiA9IExpYnJhcnlVSVRleHQuVEVYVF9DQVBBQklMSVRZX1BBVFRFUk47Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTID0gTGlicmFyeVVJVGV4dC5URVhUX0RFTElWRVJZX1BST0NFU1M7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxFQ2xhc3MsIFN0cmluZz4gZWxlbWVudFNlYXJjaFNjb3BlID0gbmV3IEhhc2hNYXA8RUNsYXNzLCBTdHJpbmc+KCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxFQ2xhc3M+PiBzY29wZVRvRUNsYXNzZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248RUNsYXNzPj4oKTsKLQotCXN0YXRpYyB7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCksIFJPT1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCksIE1FVEhPRF9DT05URU5UKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlKCksIFJPTEUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2soKSwgVEFTSyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3QoKSwgV09SS19QUk9EVUNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZSgpLCBXT1JLX1BST0RVQ1QpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE91dGNvbWUoKSwgV09SS19QUk9EVUNUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpLCBHVUlEQU5DRSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2hlY2tsaXN0KCksIENIRUNLTElTVCk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpLCBDT05DRVBUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQlFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCksIEVYQU1QTEUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRlbGluZSgpLCBHVUlERUxJTkUpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCksIFBSQUNUSUNFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSwgUkVQT1JUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXVzYWJsZUFzc2V0KCksIFJFVVNBQkxFX0FTU0VUKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2FkbWFwKCksIFJPQURNQVApOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCVNVUFBPUlRJTkdfTUFURVJJQUwpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlbXBsYXRlKCksIFRFTVBMQVRFKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZXJtRGVmaW5pdGlvbigpLCBURVJNX0RFRklOSVRJT04pOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xNZW50b3IoKSwgVE9PTF9NRU5UT1IpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSwgV0hJVEVQQVBFUik7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5KCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbigpLCBTVEFOREFSRF9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlKCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0KCksIFNUQU5EQVJEX0NBVEVHT1JZKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2woKSwgU1RBTkRBUkRfQ0FURUdPUlkpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCksIENVU1RPTV9DQVRFR09SWSk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BhY2thZ2UoKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQaGFzZSgpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRJdGVyYXRpb24oKSwgUFJPQ0VTUyk7Ci0JCWVsZW1lbnRTZWFyY2hTY29wZS5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5KCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksIFBST0NFU1MpOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLCBQUk9DRVNTKTsKLQkJZWxlbWVudFNlYXJjaFNjb3BlLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXBhYmlsaXR5UGF0dGVybigpLCBDQVBBQklMSVRZX1BBVFRFUk4pOwotCQllbGVtZW50U2VhcmNoU2NvcGUucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpLCBERUxJVkVSWV9QUk9DRVNTKTsKLQkJCi0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoUk9MRSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGUoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFRBU0ssIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChXT1JLX1BST0RVQ1QsIEFycmF5cy5hc0xpc3QobmV3IEVDbGFzc1tdIHsKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpCi0JCX0pKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChDSEVDS0xJU1QsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDaGVja2xpc3QoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KENPTkNFUFQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25jZXB0KCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChFWEFNUExFLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChHVUlERUxJTkUsICBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGVsaW5lKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChQUkFDVElDRSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChSRVBPUlQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXBvcnQoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFJFVVNBQkxFX0FTU0VULCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoUk9BRE1BUCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvYWRtYXAoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFNVUFBPUlRJTkdfTUFURVJJQUwsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFRFTVBMQVRFLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFRFUk1fREVGSU5JVElPTiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChUT09MX01FTlRPUiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRvb2xNZW50b3IoKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KFdISVRFUEFQRVIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCkpKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChTVEFOREFSRF9DQVRFR09SWSwgQXJyYXlzLmFzTGlzdChuZXcgRUNsYXNzW10gewotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmcoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREb21haW4oKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0KCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldEdyb3VwaW5nKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbCgpCi0JCX0pKTsKLQkJc2NvcGVUb0VDbGFzc2VzTWFwLnB1dChDVVNUT01fQ0FURUdPUlksIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeSgpKSk7Ci0JCXNjb3BlVG9FQ2xhc3Nlc01hcC5wdXQoQ0FQQUJJTElUWV9QQVRURVJOLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSkpOwotCQlzY29wZVRvRUNsYXNzZXNNYXAucHV0KERFTElWRVJZX1BST0NFU1MsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3MoKSkpOwotCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgTWV0aG9kU2VhcmNoU2NvcGUgSU5DTFVERV9BTExfU0VBUkNIX1NDT1BFID0gbmV3IE1ldGhvZFNlYXJjaFNjb3BlKHNjb3BlVG9FQ2xhc3Nlc01hcC5rZXlTZXQoKS50b0FycmF5KCkpOwotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gc2VhcmNoU2NvcGUgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQotCXByaXZhdGUgQXJyYXlMaXN0PEVDbGFzcz4gc2VsZWN0ZWRUeXBlczsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZShPYmplY3RbXSBlbGVtZW50VHlwZXMpIHsKLQkJdGhpcyhlbGVtZW50VHlwZXMsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUoT2JqZWN0W10gZWxlbWVudFR5cGVzLCBib29sZWFuIGluY2x1ZGVSb290KSB7Ci0JCWlmKGluY2x1ZGVSb290KSB7Ci0JCQlzZWFyY2hTY29wZS5hZGQoUk9PVCk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCU9iamVjdCBlbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlc1tpXTsKLQkJCXNlYXJjaFNjb3BlLmFkZChlbGVtZW50VHlwZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBjb3JlIG1ldGhvZCBlbGVtZW50IGlzIGluY2x1ZGVkIGluIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIGNvcmUgbWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlCi0JICogICAgICAgICBzZWFyY2ggc2NvcGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlQ29yZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBzZWFyY2hTY29wZS5jb250YWlucyhST0xFKSB8fCBzZWFyY2hTY29wZS5jb250YWlucyhUQVNLKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFdPUktfUFJPRFVDVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhHVUlEQU5DRSkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhDSEVDS0xJU1QpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoQ09OQ0VQVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKEVYQU1QTEUpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoR1VJREVMSU5FKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFBSQUNUSUNFKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFJFUE9SVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhSRVVTQUJMRV9BU1NFVCkKLQkJCQl8fCBzZWFyY2hTY29wZS5jb250YWlucyhST0FETUFQKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFNVUFBPUlRJTkdfTUFURVJJQUwpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVEVNUExBVEUpCi0JCQkJfHwgc2VhcmNoU2NvcGUuY29udGFpbnMoVEVSTV9ERUZJTklUSU9OKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFRPT0xfTUVOVE9SKQotCQkJCXx8IHNlYXJjaFNjb3BlLmNvbnRhaW5zKFdISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBNZXRob2QgZWxlbWVudCBpcyBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoIHNjb3BlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgaW5jbHVkZWQgaW4gdGhlCi0JICogICAgICAgICBzZWFyY2ggc2NvcGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgc2VhcmNoU2NvcGVOYW1lID0gKFN0cmluZykgZWxlbWVudFNlYXJjaFNjb3BlLmdldChlbGVtZW50Ci0JCQkJLmVDbGFzcygpKTsKLQkJcmV0dXJuIHNlYXJjaFNjb3BlLmNvbnRhaW5zKHNlYXJjaFNjb3BlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IHR5cGUgaXMgaW5jbHVkZWQgaW4gdGhlIHNlYXJjaAotCSAqIHNjb3BlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IHR5cGUgaXMgaW5jbHVkZWQKLQkgKiAgICAgICAgIGluIHRoZSBzZWFyY2ggc2NvcGUsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFN0cmluZyBzZWFyY2hTY29wZU5hbWUpIHsKLQkJcmV0dXJuIHNlYXJjaFNjb3BlLmNvbnRhaW5zKHNlYXJjaFNjb3BlTmFtZSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb248RUNsYXNzPiBnZXRTZWxlY3RlZFR5cGVzKCkgewotCQlpZiAoc2VsZWN0ZWRUeXBlcyA9PSBudWxsKSB7Ci0JCQlzZWxlY3RlZFR5cGVzID0gbmV3IEFycmF5TGlzdDxFQ2xhc3M+KCk7Ci0JCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbGxlY3Rpb248RUNsYXNzPj4gZW50cnkgOiBzY29wZVRvRUNsYXNzZXNNYXAKLQkJCQkJLmVudHJ5U2V0KCkpIHsKLQkJCQlpZiAoc2VhcmNoU2NvcGUuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJCXNlbGVjdGVkVHlwZXMuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRUeXBlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZVRleHQoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUVDbGFzc2lmaWVyIGNscyA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVyKHR5cGVOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnRTZWFyY2hTY29wZS5nZXQoY2xzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYoc2VhcmNoU2NvcGUgPT0gbnVsbCAmJiBzZWFyY2hTY29wZS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBTdHJVdGlsLkVNUFRZX1NUUklORzsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc3RyQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbWF4ID0gc2VhcmNoU2NvcGUuc2l6ZSgpIC0gMTsKLQkJZm9yKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzdHJCdWZmZXIuYXBwZW5kKHNlYXJjaFNjb3BlLmdldChpKSkuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJcmV0dXJuIHN0ckJ1ZmZlci5hcHBlbmQoc2VhcmNoU2NvcGUuZ2V0KG1heCkpLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZVZpZXdlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9NZXRob2RTZWFyY2hTY29wZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzcxOTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvTWV0aG9kU2VhcmNoU2NvcGVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBEaXNwbGF5cyB0aGUgc2VhcmNoYWJsZSBtZXRob2QgZWxlbWVudHMsIG9yZ2FuaXplZCBieSB0eXBlcywgaW4gYSB0cmVlIHZpZXcuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNlYXJjaFNjb3BlVmlld2VyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gTWV0aG9kU2VhcmNoU2NvcGUuUk9PVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfQ09OVEVOVCA9IE1ldGhvZFNlYXJjaFNjb3BlLk1FVEhPRF9DT05URU5UOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEUgPSBNZXRob2RTZWFyY2hTY29wZS5ST0xFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0sgPSBNZXRob2RTZWFyY2hTY29wZS5UQVNLOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfUFJPRFVDVCA9IE1ldGhvZFNlYXJjaFNjb3BlLldPUktfUFJPRFVDVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEQU5DRSA9IE1ldGhvZFNlYXJjaFNjb3BlLkdVSURBTkNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLTElTVCA9IE1ldGhvZFNlYXJjaFNjb3BlLkNIRUNLTElTVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05DRVBUID0gTWV0aG9kU2VhcmNoU2NvcGUuQ09OQ0VQVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gTWV0aG9kU2VhcmNoU2NvcGUuRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWEFNUExFID0gTWV0aG9kU2VhcmNoU2NvcGUuRVhBTVBMRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlERUxJTkUgPSBNZXRob2RTZWFyY2hTY29wZS5HVUlERUxJTkU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJBQ1RJQ0UgPSBNZXRob2RTZWFyY2hTY29wZS5QUkFDVElDRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlQgPSBNZXRob2RTZWFyY2hTY29wZS5SRVBPUlQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVVU0FCTEVfQVNTRVQgPSBNZXRob2RTZWFyY2hTY29wZS5SRVVTQUJMRV9BU1NFVDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST0FETUFQID0gTWV0aG9kU2VhcmNoU2NvcGUuUk9BRE1BUDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQT1JUSU5HX01BVEVSSUFMID0gTWV0aG9kU2VhcmNoU2NvcGUuU1VQUE9SVElOR19NQVRFUklBTDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURSA9IE1ldGhvZFNlYXJjaFNjb3BlLlRFTVBMQVRFOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFUk1fREVGSU5JVElPTiA9IE1ldGhvZFNlYXJjaFNjb3BlLlRFUk1fREVGSU5JVElPTjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUT09MX01FTlRPUiA9IE1ldGhvZFNlYXJjaFNjb3BlLlRPT0xfTUVOVE9SOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFUEFQRVIgPSBNZXRob2RTZWFyY2hTY29wZS5XSElURVBBUEVSOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0NBVEVHT1JZID0gTWV0aG9kU2VhcmNoU2NvcGUuU1RBTkRBUkRfQ0FURUdPUlk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0NBVEVHT1JZID0gTWV0aG9kU2VhcmNoU2NvcGUuQ1VTVE9NX0NBVEVHT1JZOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1MgPSBNZXRob2RTZWFyY2hTY29wZS5QUk9DRVNTOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUEFUVEVSTiA9IE1ldGhvZFNlYXJjaFNjb3BlLkNBUEFCSUxJVFlfUEFUVEVSTjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJVkVSWV9QUk9DRVNTID0gTWV0aG9kU2VhcmNoU2NvcGUuREVMSVZFUllfUFJPQ0VTUzsKLQotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByb290TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXN0YXRpYyB7Ci0JCXJvb3RMaXN0LmFkZChNRVRIT0RfQ09OVEVOVCk7Ci0JCXJvb3RMaXN0LmFkZChQUk9DRVNTKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gbWV0aG9kQ29udGVudExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQlzdGF0aWMgewotCQltZXRob2RDb250ZW50TGlzdC5hZGQoUk9MRSk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChUQVNLKTsKLQkJbWV0aG9kQ29udGVudExpc3QuYWRkKFdPUktfUFJPRFVDVCk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChHVUlEQU5DRSk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChTVEFOREFSRF9DQVRFR09SWSk7Ci0JCW1ldGhvZENvbnRlbnRMaXN0LmFkZChDVVNUT01fQ0FURUdPUlkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBndWlkYW5jZUxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQlzdGF0aWMgewotCQlndWlkYW5jZUxpc3QuYWRkKENIRUNLTElTVCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoQ09OQ0VQVCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoRVhBTVBMRSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoR1VJREVMSU5FKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChQUkFDVElDRSk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoUkVQT1JUKTsKLQkJZ3VpZGFuY2VMaXN0LmFkZChSRVVTQUJMRV9BU1NFVCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoUk9BRE1BUCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoVEVNUExBVEUpOwotCQlndWlkYW5jZUxpc3QuYWRkKFRFUk1fREVGSU5JVElPTik7Ci0JCWd1aWRhbmNlTGlzdC5hZGQoVE9PTF9NRU5UT1IpOwotCQlndWlkYW5jZUxpc3QuYWRkKFdISVRFUEFQRVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBwcm9jZXNzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXN0YXRpYyB7Ci0JCXByb2Nlc3NMaXN0LmFkZChDQVBBQklMSVRZX1BBVFRFUk4pOwotCQlwcm9jZXNzTGlzdC5hZGQoREVMSVZFUllfUFJPQ0VTUyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGhhc0NoaWxkcmVuTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCXN0YXRpYyB7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoUk9PVCk7Ci0JCWhhc0NoaWxkcmVuTGlzdC5hZGQoTUVUSE9EX0NPTlRFTlQpOwotCQloYXNDaGlsZHJlbkxpc3QuYWRkKEdVSURBTkNFKTsKLQkJaGFzQ2hpbGRyZW5MaXN0LmFkZChQUk9DRVNTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2hlY2tib3hUcmVlVmlld2VyIHZpZXdlcjsKLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdmlld2VyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdlckNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50ID09IFJPT1QpIHsKLQkJCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oUk9PVCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4ocGFyZW50KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50ID09IFJPT1QpIHsKLQkJCQlyZXR1cm4gcm9vdExpc3QudG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gTUVUSE9EX0NPTlRFTlQpIHsKLQkJCQlyZXR1cm4gbWV0aG9kQ29udGVudExpc3QudG9BcnJheSgpOwotCQkJfSBlbHNlIGlmIChwYXJlbnQgPT0gR1VJREFOQ0UpIHsKLQkJCQlyZXR1cm4gZ3VpZGFuY2VMaXN0LnRvQXJyYXkoKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50ID09IFBST0NFU1MpIHsKLQkJCQlyZXR1cm4gcHJvY2Vzc0xpc3QudG9BcnJheSgpOwotCQkJfQotCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgY2hpbGQpIHsKLQkJCWlmIChyb290TGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gUk9PVDsKLQkJCX0KLQkJCWlmIChtZXRob2RDb250ZW50TGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gTUVUSE9EX0NPTlRFTlQ7Ci0JCQl9IGVsc2UgaWYgKGd1aWRhbmNlTGlzdC5jb250YWlucyhjaGlsZCkpIHsKLQkJCQlyZXR1cm4gR1VJREFOQ0U7Ci0JCQl9IGVsc2UgaWYgKHByb2Nlc3NMaXN0LmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCXJldHVybiBQUk9DRVNTOwotCQkJfQotCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlyZXR1cm4gaGFzQ2hpbGRyZW5MaXN0LmNvbnRhaW5zKHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIGFyZzAsIE9iamVjdCBhcmcxLCBPYmplY3QgYXJnMikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgdmlld2VyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZpZXdlckxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJcmV0dXJuIG9iai50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRQYXJlbnRHcmF5ZWQoT2JqZWN0IHNlbGVjdGVkRWxlbWVudCkgewotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjcCA9IChJVHJlZUNvbnRlbnRQcm92aWRlcikgdmlld2VyLmdldENvbnRlbnRQcm92aWRlcigpOwotCQlPYmplY3QgcGFyZW50ID0gY3AuZ2V0UGFyZW50KHNlbGVjdGVkRWxlbWVudCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gUk9PVCkgewotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBjcC5nZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJYm9vbGVhbiBncmF5ZWQgPSBmYWxzZTsKLQkJCWJvb2xlYW4gY2hlY2tlZCA9IGZhbHNlOwotCQkJZm9yIChPYmplY3QgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJCWlmKCFjaGVja2VkKSB7Ci0JCQkJCWNoZWNrZWQgPSB2aWV3ZXIuZ2V0Q2hlY2tlZChjaGlsZCk7Ci0JCQkJCWlmKGNoZWNrZWQgJiYgZ3JheWVkKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXZpZXdlci5nZXRDaGVja2VkKGNoaWxkKSB8fCB2aWV3ZXIuZ2V0R3JheWVkKGNoaWxkKSkgewotCQkJCQlpZihjaGVja2VkKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCQlncmF5ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjaGVja1BhcmVudChPYmplY3Qgc2VsZWN0ZWRFbGVtZW50KSB7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCU9iamVjdCBwYXJlbnQgPSBjcC5nZXRQYXJlbnQoc2VsZWN0ZWRFbGVtZW50KTsKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCAhPSBST09UKSB7Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGNwLmdldENoaWxkcmVuKHBhcmVudCk7Ci0JCQlib29sZWFuIGdyYXllZCA9IGZhbHNlOwotCQkJZm9yIChPYmplY3QgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJCWlmICghdmlld2VyLmdldENoZWNrZWQoY2hpbGQpIHx8IHZpZXdlci5nZXRHcmF5ZWQoY2hpbGQpKSB7Ci0JCQkJCWdyYXllZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChncmF5ZWQpIHsKLQkJCQl2aWV3ZXIuc2V0R3JheUNoZWNrZWQocGFyZW50LCB0cnVlKTsKLQkJCQkKLQkJCQkvLyBjaGVjayBhbGwgb3RoZXIgcGFyZW50cyBncmF5ZWQgYXMgd2VsbAotCQkJCS8vCi0JCQkJZm9yKHBhcmVudCA9IGNwLmdldFBhcmVudChwYXJlbnQpOyBwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgIT0gUk9PVDsgcGFyZW50ID0gY3AuZ2V0UGFyZW50KHBhcmVudCkpIHsKLQkJCQkJdmlld2VyLnNldEdyYXlDaGVja2VkKHBhcmVudCwgdHJ1ZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2aWV3ZXIuc2V0Q2hlY2tlZChwYXJlbnQsIHRydWUpOwotCQkJCXZpZXdlci5zZXRQYXJlbnRzR3JheWVkKHNlbGVjdGVkRWxlbWVudCwgZmFsc2UpOwotCQkJCWNoZWNrUGFyZW50KHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBNZXRob2RTZWFyY2hTY29wZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJdmlld2VyID0gbmV3IENoZWNrYm94VHJlZVZpZXdlcihwYXJlbnQsIHN0eWxlKTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJdmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVmlld2VyQ29udGVudFByb3ZpZGVyKCkpOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVmlld2VyTGFiZWxQcm92aWRlcigpKTsKLQkJdmlld2VyLnNldElucHV0KFJPT1QpOwotCQl2aWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLQkJdmlld2VyLnNldFN1YnRyZWVDaGVja2VkKE1FVEhPRF9DT05URU5ULCB0cnVlKTsKLQkJdmlld2VyLnNldFN1YnRyZWVDaGVja2VkKFBST0NFU1MsIHRydWUpOwotCQl2aWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCU9iamVjdCBzZWxlY3RlZEVsZW1lbnQgPSBldmVudC5nZXRFbGVtZW50KCk7Ci0JCQkJdmlld2VyLnNldFN1YnRyZWVDaGVja2VkKHNlbGVjdGVkRWxlbWVudCwgZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQlpZiAoIWV2ZW50LmdldENoZWNrZWQoKSkgewotCQkJCQlpZihzaG91bGRQYXJlbnRHcmF5ZWQoc2VsZWN0ZWRFbGVtZW50KSkgewotCQkJCQkJdmlld2VyLnNldFBhcmVudHNHcmF5ZWQoc2VsZWN0ZWRFbGVtZW50LCB0cnVlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUlUcmVlQ29udGVudFByb3ZpZGVyIGNwID0gKElUcmVlQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQkJCQlPYmplY3QgcGFyZW50ID0gY3AuZ2V0UGFyZW50KHNlbGVjdGVkRWxlbWVudCk7Ci0JCQkJCQlpZihwYXJlbnQgIT0gbnVsbCkgewotCQkJCQkJCXZpZXdlci5zZXRHcmF5Q2hlY2tlZChwYXJlbnQsIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQl2aWV3ZXIuc2V0R3JheUNoZWNrZWQoc2VsZWN0ZWRFbGVtZW50LCBmYWxzZSk7Ci0JCQkJCS8vIHNldCBncmF5IHRvIGZhbHNlIGZvciBpdGVtcyB0aGF0IGFyZSB1bmNoZWNrZWQKLQkJCQkJLy8KLQkJCQkJZm9yIChPYmplY3QgZWxlbWVudCA6IHZpZXdlci5nZXRHcmF5ZWRFbGVtZW50cygpKSB7Ci0JCQkJCQlpZighdmlld2VyLmdldENoZWNrZWQoZWxlbWVudCkpIHsKLQkJCQkJCQl2aWV3ZXIuc2V0R3JheWVkKGVsZW1lbnQsIGZhbHNlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSB7CQkKLQkJCQkJY2hlY2tQYXJlbnQoc2VsZWN0ZWRFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIG1ldGhvZCBlbGVtZW50IHR5cGVzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2VsZWN0ZWQgbWV0aG9kIGVsZW1lbnQgdHlwZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kU2VhcmNoU2NvcGUgZ2V0U2VhcmNoU2NvcGUoKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kU2VhcmNoU2NvcGUodmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdExhYmVsUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I2YmQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpLnByb3ZpZGVyLkFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoZSBsYWJlbCBwcm92aWRlciBmb3IgdGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0IHRyZWUgYW5kIHRhYmxlIHZpZXdlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoUmVzdWx0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIoVG5nVXRpbC51bWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTZWFyY2hSZXN1bHRMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTGFiZWxQcm92aWRlciNnZXRUZXh0KE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFNlYXJjaFJlc3VsdFVJRm9sZGVyKSBvYmopLmdldE5hbWUoKTsKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChNZXRob2RFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRUZXh0KG9iaik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2VhcmNoUmVzdWx0VUlGb2xkZXIpIHsKLQkJCXJldHVybiAoKFNlYXJjaFJlc3VsdFVJRm9sZGVyKSBvYmopLmdldEltYWdlKCk7Ci0JCX0KLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2Uob2JqKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VGFibGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxMDM0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdGFibGUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFRhYmxlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMKLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfTElTVCA9IG5ldyBPYmplY3RbMF07Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHJpdmF0ZSBNZXRob2RTZWFyY2hSZXN1bHQgc2VhcmNoUmVzdWx0OwotCi0JLyoqCi0JICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZFNlYXJjaFJlc3VsdCkgewotCQkJcmV0dXJuICgoTWV0aG9kU2VhcmNoUmVzdWx0KSBpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCAhPSBudWxsICYmIG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQl0YWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCQkJc2VhcmNoUmVzdWx0ID0gKE1ldGhvZFNlYXJjaFJlc3VsdCkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbGVtZW50c0NoYW5nZWQoT2JqZWN0W10gdXBkYXRlZEVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VhcmNoUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodGFibGVWaWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkgewotCQkJCQl0YWJsZVZpZXdlci5yZWZyZXNoKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGFibGVWaWV3ZXIuYWRkKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0YWJsZVZpZXdlci5yZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyZmEyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL1NlYXJjaFJlc3VsdFRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5TZWFyY2hVSVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBUaGUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIG1ldGhvZCBzZWFyY2ggcmVzdWx0IHRyZWUgdmlld2VyLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hSZXN1bHRUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0NPTlRFTlQgPSAiQ29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DT1JFX0NPTlRFTlQgPSAiQ29yZUNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ0FURUdPUklFUyA9ICJDYXRlZ29yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RJU0NJUExJTkVTID0gIkRpc2NpcGxpbmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBLR19OQU1FX0RPTUFJTlMgPSAiRG9tYWlucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9XT1JLX1BST0RVQ1RfVFlQRVMgPSAiV1AgVHlwZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfUk9MRVNFVFMgPSAiUm9sZVNldHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfVE9PTFMgPSAiVG9vbHMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtHX05BTUVfQ1VTVE9NX0NBVEVHT1JJRVMgPSAiQ3VzdG9tQ2F0ZWdvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9DQVBBQklMSVRZX1BBVFRFUk5TID0gIkNhcGFiaWxpdHlQYXR0ZXJucyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRV9ERUxJVkVSWV9QUk9DRVNTRVMgPSAiRGVsaXZlcnlQcm9jZXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX0NPTlRFTlQgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfbWV0aG9kQ29udGVudDsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QQUNLQUdFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9jb250ZW50UGFja2FnZXM7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU5EQVJEX0NBVEVHT1JJRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfc3RhbmRhcmRDYXRlZ29yaWVzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDSVBMSU5FUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9kaXNjaXBsaW5lczsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9NQUlOUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9kb21haW5zOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLX1BST0RVQ1RfVFlQRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfd29ya1Byb2R1Y3RUeXBlczsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRVNFVFMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfcm9sZVNldHM7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X3Rvb2xzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fQ0FURUdPUklFUyA9IFNlYXJjaFVJUmVzb3VyY2VzLnNlYXJjaFJlc3VsdF9jdXN0b21DYXRlZ29yaWVzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTRVMgPSBTZWFyY2hVSVJlc291cmNlcy5zZWFyY2hSZXN1bHRfcHJvY2Vzc2VzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX1BBVFRFUk5TID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2NhcGFiaWxpdHlQYXR0ZXJuczsgCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSVZFUllfUFJPQ0VTU0VTID0gU2VhcmNoVUlSZXNvdXJjZXMuc2VhcmNoUmVzdWx0X2RlbGl2ZXJ5UHJvY2Vzc2VzOyAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0xJU1QgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwcml2YXRlIE1ldGhvZFNlYXJjaFJlc3VsdCBzZWFyY2hSZXN1bHQ7Ci0KLQlwcml2YXRlIE1hcDxPYmplY3QsIFNldDxPYmplY3Q+PiBlbGVtZW50TWFwOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9ICgoTWV0aG9kU2VhcmNoUmVzdWx0KSBpbnB1dEVsZW1lbnQpCi0JCQkJCS5nZXRFbGVtZW50cygpOwotCQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCQl9Ci0JCQllbGVtZW50TWFwID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBTZXQ8T2JqZWN0Pj4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbnNlcnQoZWxlbWVudHNbaV0sIGZhbHNlKTsKLQkJCX0KLQotCQkJaW5zZXJ0VUlGb2xkZXJzKGlucHV0RWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0RWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCAhPSBudWxsICYmIG5ld0lucHV0IGluc3RhbmNlb2YgTWV0aG9kU2VhcmNoUmVzdWx0KSB7Ci0JCQl0cmVlVmlld2VyID0gKFRyZWVWaWV3ZXIpIHZpZXdlcjsKLQkJCXNlYXJjaFJlc3VsdCA9IChNZXRob2RTZWFyY2hSZXN1bHQpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHVwZGF0ZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHNlYXJjaFJlc3VsdC5nZXRNYXRjaENvdW50KHVwZGF0ZWRFbGVtZW50c1tpXSkgPiAwKSB7Ci0JCQkJaWYgKHRyZWVWaWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkgewotCQkJCQlpbnNlcnQodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZW1vdmUodXBkYXRlZEVsZW1lbnRzW2ldLCB0cnVlKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRyZWVWaWV3ZXIucmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnRNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVNUFRZX0xJU1Q7Ci0JCX0KLQkJU2V0PE9iamVjdD4gY2hpbGRyZW4gPSBlbGVtZW50TWFwLmdldChwYXJlbnRFbGVtZW50KTsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCXJldHVybiBFTVBUWV9MSVNUOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTZWFyY2hSZXN1bHRVSUZvbGRlcikgewotCQkJcmV0dXJuICgoU2VhcmNoUmVzdWx0VUlGb2xkZXIpIGVsZW1lbnQpLmdldFBhcmVudCgpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzUGFja2FnZSkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlPYmplY3QgcGFyZW50ID0gcHJvY2Vzc1BhY2thZ2UuZUNvbnRhaW5lcigpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50IHByb2Nlc3NDb21wb25lbnQgPSAoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50OwotCQkJCXJldHVybiBwcm9jZXNzQ29tcG9uZW50LmdldFByb2Nlc3MoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJTWV0aG9kUGFja2FnZSBtZXRob2RQYWNrYWdlID0gKE1ldGhvZFBhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlPYmplY3QgcGFyZW50ID0gbWV0aG9kUGFja2FnZS5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJCU1ldGhvZFBhY2thZ2UgcGFyZW50UGFja2FnZSA9IG1ldGhvZFBhY2thZ2UuZ2V0UGFyZW50UGFja2FnZSgpOwotCQkJcmV0dXJuIHBhcmVudFBhY2thZ2U7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0KSB7Ci0JCQlBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgZWxlbWVudDsKLQkJCUFydGlmYWN0IGNvbnRhaW5lckFydGlmYWN0ID0gYXJ0aWZhY3QuZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJCWlmIChjb250YWluZXJBcnRpZmFjdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lckFydGlmYWN0OwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gVW1hVXRpbC5nZXRDb250ZW50UGFja2FnZShhcnRpZmFjdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByYWN0aWNlKSB7Ci0JCQlQcmFjdGljZSBwcmFjdGljZSA9IChQcmFjdGljZSkgZWxlbWVudDsKLQkJCXJldHVybiBwcmFjdGljZS5nZXRDb250YWluZXIoKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZSkgewotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gZGlzY2lwbGluZS5nZXRDb250YWluZXIoKTsJCQkKLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRG9tYWluKSB7Ci0JCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgZWxlbWVudDsKLQkJCXJldHVybiBkb21haW4uZ2V0Q29udGFpbmVyKCk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gVW1hVXRpbC5nZXRDb250ZW50UGFja2FnZSgoQ29udGVudEVsZW1lbnQpIGVsZW1lbnQpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7Ci0JCQlQcm9jZXNzIHByb2Nlc3MgPSAoUHJvY2VzcykgZWxlbWVudDsKLQkJCVByb2Nlc3NQYWNrYWdlIHBhcmVudCA9IChQcm9jZXNzUGFja2FnZSkgcHJvY2Vzcy5lQ29udGFpbmVyKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGFyZW50LmVDb250YWluZXIoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gVW1hVXRpbAotCQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2UoKFByb2Nlc3NFbGVtZW50KSBlbGVtZW50KTsKLQkJCWlmIChwcm9jZXNzUGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50UGFja2FnZSA9IChQcm9jZXNzUGFja2FnZSkgcHJvY2Vzc1BhY2thZ2UKLQkJCQkJCS5nZXRQYXJlbnRQYWNrYWdlKCk7Ci0JCQkJaWYgKHBhcmVudFBhY2thZ2UgIT0gbnVsbCkgewotCQkJCQlpZiAocGFyZW50UGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwYXJlbnRQYWNrYWdlOwotCQkJCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCQl9Ci0JCQkJCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IHByb2Nlc3NFbGVtZW50cyA9IHBhcmVudFBhY2thZ2UuZ2V0UHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQkJCWZvciAoUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgOiBwcm9jZXNzRWxlbWVudHMpIHsKLQkJCQkJCWlmIChwcm9jZXNzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJCSYmIHByb2Nlc3NFbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCQkJcGFyZW50UGFja2FnZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBQcm9jZXNzRWxlbWVudCkgewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSBVbWFVdGlsCi0JCQkJCS5nZXRQcm9jZXNzUGFja2FnZSgoUHJvY2Vzc0VsZW1lbnQpIGVsZW1lbnQpOwotCQkJaWYgKHByb2Nlc3NQYWNrYWdlICE9IG51bGwpIHsKLQkJCQlpZiAocHJvY2Vzc1BhY2thZ2UgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KSBwcm9jZXNzUGFja2FnZTsKLQkJCQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnQuZ2V0UHJvY2VzcygpOwotCQkJCX0KLQkJCQlMaXN0PFByb2Nlc3NFbGVtZW50PiBwcm9jZXNzRWxlbWVudHMgPSBwcm9jZXNzUGFja2FnZS5nZXRQcm9jZXNzRWxlbWVudHMoKTsKLQkJCQlmb3IgKFByb2Nlc3NFbGVtZW50IHByb2Nlc3NFbGVtZW50IDogcHJvY2Vzc0VsZW1lbnRzKSB7Ci0JCQkJCWlmIChwcm9jZXNzRWxlbWVudCBpbnN0YW5jZW9mIEFjdGl2aXR5Ci0JCQkJCQkJJiYgcHJvY2Vzc0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscygKLQkJCQkJCQkJCXByb2Nlc3NQYWNrYWdlLmdldE5hbWUoKSkpIHsKLQkJCQkJCXJldHVybiBwcm9jZXNzRWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyI2hhc0NoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnQoT2JqZWN0IGNoaWxkLCBib29sZWFuIHJlZnJlc2hWaWV3ZXIpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChjaGlsZCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJaWYgKGluc2VydENoaWxkKHBhcmVudCwgY2hpbGQpKSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5hZGQocGFyZW50LCBjaGlsZCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocmVmcmVzaFZpZXdlcikgewotCQkJCQl0cmVlVmlld2VyLnJlZnJlc2gocGFyZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2hpbGQgPSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBnZXRQYXJlbnQoY2hpbGQpOwotCQl9Ci0JCWlmIChpbnNlcnRDaGlsZChzZWFyY2hSZXN1bHQsIGNoaWxkKSkgewotCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQl0cmVlVmlld2VyLmFkZChzZWFyY2hSZXN1bHQsIGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGluc2VydENoaWxkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBjaGlsZCkgewotCQlTZXQ8T2JqZWN0PiBjaGlsZHJlbiA9IGVsZW1lbnRNYXAuZ2V0KHBhcmVudCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQljaGlsZHJlbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWVsZW1lbnRNYXAucHV0KHBhcmVudCwgY2hpbGRyZW4pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbi5hZGQoY2hpbGQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlcGxhY2UoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkLCBPYmplY3QgbmV3Q2hpbGQpIHsKLQkJaW5zZXJ0KG5ld0NoaWxkLCBmYWxzZSk7Ci0JCWVsZW1lbnRNYXAucHV0KG5ld0NoaWxkLCBlbGVtZW50TWFwLmdldChjaGlsZCkpOwotCQllbGVtZW50TWFwLnJlbW92ZShjaGlsZCk7Ci0JCVNldDxPYmplY3Q+IGNoaWxkcmVuID0gZWxlbWVudE1hcC5nZXQocGFyZW50KTsKLQkJY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gcmVmcmVzaFZpZXdlcikgewotCQlpZiAoaGFzQ2hpbGRyZW4oZWxlbWVudCkpIHsKLQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJdHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHNlYXJjaFJlc3VsdC5nZXRNYXRjaENvdW50KGVsZW1lbnQpID09IDApIHsKLQkJCQllbGVtZW50TWFwLnJlbW92ZShlbGVtZW50KTsKLQkJCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KGVsZW1lbnQpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVGcm9tU2libGluZ3MoZWxlbWVudCwgcGFyZW50KTsKLQkJCQkJcmVtb3ZlKHBhcmVudCwgcmVmcmVzaFZpZXdlcik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVtb3ZlRnJvbVNpYmxpbmdzKGVsZW1lbnQsIHNlYXJjaFJlc3VsdCk7Ci0JCQkJCWlmIChyZWZyZXNoVmlld2VyKSB7Ci0JCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlZnJlc2hWaWV3ZXIpIHsKLQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUZyb21TaWJsaW5ncyhPYmplY3QgZWxlbWVudCwgT2JqZWN0IHBhcmVudCkgewotCQlTZXQ8T2JqZWN0PiBzaWJsaW5ncyA9IGVsZW1lbnRNYXAuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyAhPSBudWxsKSB7Ci0JCQlzaWJsaW5ncy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VUlGb2xkZXJzKE1ldGhvZFBsdWdpbiBlbGVtZW50KSB7Ci0JCVNlYXJjaFJlc3VsdFVJRm9sZGVyIG1ldGhvZENvbnRlbnRGb2xkZXIgPSBuZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJTUVUSE9EX0NPTlRFTlQsIEV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvQ29udGVudCIpKSwgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJU2VhcmNoUmVzdWx0VUlGb2xkZXIgcHJvY2Vzc2VzRm9sZGVyID0gbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCVBST0NFU1NFUywgRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Qcm9jZXNzZXMiKSksIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCU9iamVjdFtdIG1ldGhvZFBhY2thZ2VzID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgbWV0aG9kUGFja2FnZXMubGVuZ3RoOyBqKyspIHsKLQkJCU9iamVjdCBtZXRob2RQYWNrYWdlID0gbWV0aG9kUGFja2FnZXNbal07Ci0JCQlpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlCi0JCQkJCSYmICgoQ29udGVudFBhY2thZ2UpIG1ldGhvZFBhY2thZ2UpLmdldE5hbWUoKQotCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfQ09OVEVOVCkpIHsKLQkJCQlPYmplY3RbXSBwYWNrYWdlcyA9IGdldENoaWxkcmVuKG1ldGhvZFBhY2thZ2UpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcGFja2FnZXMubGVuZ3RoOyBrKyspIHsKLQkJCQkJT2JqZWN0IHBrZyA9IHBhY2thZ2VzW2tdOwotCQkJCQlpZiAocGtnIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQkJCWlmICgoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKS5lcXVhbHMoCi0JCQkJCQkJCVBLR19OQU1FX0NPUkVfQ09OVEVOVCkpIHsKLQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCXBrZywKLQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJQ09OVEVOVF9QQUNLQUdFUywKLQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvTWV0aG9kUGFja2FnZXMiKSksIG1ldGhvZENvbnRlbnRGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfSBlbHNlIGlmICgoKENvbnRlbnRQYWNrYWdlKSBwa2cpLmdldE5hbWUoKQotCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0NBVEVHT1JJRVMpKSB7Ci0JCQkJCQkJU2VhcmNoUmVzdWx0VUlGb2xkZXIgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyID0gbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJU1RBTkRBUkRfQ0FURUdPUklFUywKLQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9TdGFuZGFyZENhdGVnb3JpZXMiKSksIG1ldGhvZENvbnRlbnRGb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU2VhcmNoUmVzdWx0VUlGb2xkZXIgY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciA9IG5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCUNVU1RPTV9DQVRFR09SSUVTLAotCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0N1c3RvbUNhdGVnb3JpZXMiKSksIG1ldGhvZENvbnRlbnRGb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJT2JqZWN0W10gY29udGVudFBhY2thZ2VzID0gZ2V0Q2hpbGRyZW4ocGtnKTsKLQkJCQkJCQlmb3IgKGludCBsID0gMDsgbCA8IGNvbnRlbnRQYWNrYWdlcy5sZW5ndGg7IGwrKykgewotCQkJCQkJCQlPYmplY3QgY29udGVudFBhY2thZ2UgPSBjb250ZW50UGFja2FnZXNbbF07Ci0JCQkJCQkJCWlmIChjb250ZW50UGFja2FnZSBpbnN0YW5jZW9mIENvbnRlbnRQYWNrYWdlKSB7Ci0JCQkJCQkJCQlTdHJpbmcgcGtnTmFtZSA9ICgoQ29udGVudFBhY2thZ2UpIGNvbnRlbnRQYWNrYWdlKQotCQkJCQkJCQkJCQkuZ2V0TmFtZSgpOwotCQkJCQkJCQkJaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9DVVNUT01fQ0FURUdPUklFUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoY3VzdG9tQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQllbGVtZW50TWFwLnB1dChjdXN0b21DYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJZWxlbWVudE1hcC5nZXQoY29udGVudFBhY2thZ2UpKTsKLQkJCQkJCQkJCX0gZWxzZSBpZiAocGtnTmFtZQotCQkJCQkJCQkJCQkuZXF1YWxzKFBLR19OQU1FX0RJU0NJUExJTkVTKSkgewotCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlESVNDSVBMSU5FUywKLQkJCQkJCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCQkJCQkuZ2V0SW1hZ2UoImZ1bGwvb2JqMTYvRGlzY2lwbGluZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ET01BSU5TKSkgewotCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlET01BSU5TLAotCQkJCQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Eb21haW5zIikpLCBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfSBlbHNlIGlmIChwa2dOYW1lCi0JCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfV09SS19QUk9EVUNUX1RZUEVTKSkgewotCQkJCQkJCQkJCWluc2VydCgKLQkJCQkJCQkJCQkJCXN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlciwKLQkJCQkJCQkJCQkJCWZhbHNlKTsKLQkJCQkJCQkJCQlyZXBsYWNlKAotCQkJCQkJCQkJCQkJZWxlbWVudCwKLQkJCQkJCQkJCQkJCWNvbnRlbnRQYWNrYWdlLAotCQkJCQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCQkJCQlXT1JLX1BST0RVQ1RfVFlQRVMsCi0JCQkJCQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZXMiKSksIHN0YW5kYXJkQ2F0ZWdvcmllc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl9IGVsc2UgaWYgKHBrZ05hbWUKLQkJCQkJCQkJCQkJLmVxdWFscyhQS0dfTkFNRV9ST0xFU0VUUykpIHsKLQkJCQkJCQkJCQlpbnNlcnQoCi0JCQkJCQkJCQkJCQlzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIsCi0JCQkJCQkJCQkJCQlmYWxzZSk7Ci0JCQkJCQkJCQkJcmVwbGFjZSgKLQkJCQkJCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCQkJCQljb250ZW50UGFja2FnZSwKLQkJCQkJCQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJCQkJCQkJUk9MRVNFVFMsCi0JCQkJCQkJCQkJCQkJCUV4dGVuZGVkSW1hZ2VSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEltYWdlKExpYnJhcnlFZGl0UGx1Z2luLklOU1RBTkNFCi0JCQkJCQkJCQkJCQkJCQkJLmdldEltYWdlKCJmdWxsL29iajE2L1JvbGVzIikpLCBzdGFuZGFyZENhdGVnb3JpZXNGb2xkZXIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfSBlbHNlIGlmIChwa2dOYW1lCi0JCQkJCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfVE9PTFMpKSB7Ci0JCQkJCQkJCQkJaW5zZXJ0KAotCQkJCQkJCQkJCQkJc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyLAotCQkJCQkJCQkJCQkJZmFsc2UpOwotCQkJCQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCQkJCQllbGVtZW50LAotCQkJCQkJCQkJCQkJY29udGVudFBhY2thZ2UsCi0JCQkJCQkJCQkJCQluZXcgU2VhcmNoUmVzdWx0VUlGb2xkZXIoCi0JCQkJCQkJCQkJCQkJCVRPT0xTLAotCQkJCQkJCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9Ub29scyIpKSwgc3RhbmRhcmRDYXRlZ29yaWVzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQllbGVtZW50TWFwLnJlbW92ZShwa2cpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHBrZyBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCQkJJiYgKChQcm9jZXNzUGFja2FnZSkgcGtnKS5nZXROYW1lKCkuZXF1YWxzKAotCQkJCQkJCQkJUEtHX05BTUVfQ0FQQUJJTElUWV9QQVRURVJOUykpIHsKLQkJCQkJCXJlcGxhY2UoCi0JCQkJCQkJCWVsZW1lbnQsCi0JCQkJCQkJCXBrZywKLQkJCQkJCQkJbmV3IFNlYXJjaFJlc3VsdFVJRm9sZGVyKAotCQkJCQkJCQkJCUNBUEFCSUxJVFlfUEFUVEVSTlMsCi0JCQkJCQkJCQkJRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoTGlicmFyeUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybnMiKSksIHByb2Nlc3Nlc0ZvbGRlcikpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJU2V0PE9iamVjdD4gY2hpbGRyZW4gPSAoU2V0PE9iamVjdD4pIGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpOwotCQkJCWNoaWxkcmVuLnJlbW92ZShtZXRob2RQYWNrYWdlKTsKLQkJCX0gZWxzZSBpZiAobWV0aG9kUGFja2FnZSBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlCi0JCQkJCSYmICgoUHJvY2Vzc1BhY2thZ2UpIG1ldGhvZFBhY2thZ2UpLmdldE5hbWUoKQotCQkJCQkJCS5lcXVhbHMoUEtHX05BTUVfREVMSVZFUllfUFJPQ0VTU0VTKSkgewotCQkJCXJlcGxhY2UoCi0JCQkJCQllbGVtZW50LAotCQkJCQkJbWV0aG9kUGFja2FnZSwKLQkJCQkJCW5ldyBTZWFyY2hSZXN1bHRVSUZvbGRlcigKLQkJCQkJCQkJREVMSVZFUllfUFJPQ0VTU0VTLAotCQkJCQkJCQlFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJCQkJCQkJCS5nZXRJbWFnZSgiZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NlcyIpKSwgcHJvY2Vzc2VzRm9sZGVyKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydHMgdGhlIFVJIGZvbGRlcnMgaW50byB0aGUgc2VhcmNoIHJlc3VsdCB0cmVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydFVJRm9sZGVycyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luKSB7Ci0JCQkJaW5zZXJ0VUlGb2xkZXJzKChNZXRob2RQbHVnaW4pIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRVSUZvbGRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9pbnRlcm5hbC9TZWFyY2hSZXN1bHRVSUZvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTFiN2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvU2VhcmNoUmVzdWx0VUlGb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuRXh0ZW5kZWRJbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuTGlicmFyeUVkaXRQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIE1vZGVscyBhIFVJIGZvbGRlciBpbiB0aGUgbWV0aG9kIHNlYXJjaCByZXN1bHQgdHJlZSB2aWV3LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJlc3VsdFVJRm9sZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlIERFRkFVTFRfSU1BR0UgPSBFeHRlbmRlZEltYWdlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShMaWJyYXJ5RWRpdFBsdWdpbi5JTlNUQU5DRQotCQkJLmdldEltYWdlKCJmdWxsL29iajE2L0ZvbGRlciIpKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7Ci0KLQlwcml2YXRlIE9iamVjdCBwYXJlbnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBmb3IgdGhlIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoUmVzdWx0VUlGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCBERUZBVUxUX0lNQUdFLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBhIG5hbWUgZm9yIHRoZSBmb2xkZXIKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IG9iamVjdAotCSAqLwotCXB1YmxpYyBTZWFyY2hSZXN1bHRVSUZvbGRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzKG5hbWUsIERFRkFVTFRfSU1BR0UsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBuYW1lIGZvciB0aGUgZm9sZGVyCi0JICogQHBhcmFtIGltYWdlCi0JICogICAgICAgICAgICBhbiBpbWFnZSBmb3IgdGhlIGZvbGRlcgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIFNlYXJjaFJlc3VsdFVJRm9sZGVyKFN0cmluZyBuYW1lLCBJbWFnZSBpbWFnZSwgT2JqZWN0IHBhcmVudCkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmltYWdlID0gaW1hZ2U7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUuCi0JICogCi0JICogQHJldHVybiB0aGUgZm9sZGVyIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGZvciBhIFVJIGZvbGRlcgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IG9iamVjdCBmb3IgdGhlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBvYmplY3QKLQkgKiBAcmV0dXJuIHRoZSBnaXZlbiBwYXJlbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBzZXRQYXJlbnQoT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZvbGRlciBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL2ludGVybmFsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmNiYzJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdWkvaW50ZXJuYWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3Igc2VhcmNoaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1NjEyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3Igc2VhcmNoaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9TZWFyY2hVSVByZWZlcmVuY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL1NlYXJjaFVJUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxZTU3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL1NlYXJjaFVJUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLlNlYXJjaFVJUGx1Z2luOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIFNlYXJjaCBVSSBwcmVmZXJlbmNlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoVUlQcmVmZXJlbmNlcyB7Ci0KLQkvKioKLQkgKiBUaGUgU2VhcmNoIFVJIHByZWZlcmVuY2Uga2V5cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUFSQ0hfU1RSSU5HID0gInNlYXJjaFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUEFUVEVSTiA9ICJuYW1lUGF0dGVybiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfU0VOU0lUSVZFID0gImNhc2VTZW5zaXRpdmUiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2F2ZWQgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZWFyY2hTdHJpbmcoKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCVNFQVJDSF9TVFJJTkcpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IHNlYXJjaCBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFNlYXJjaFN0cmluZyhTdHJpbmcgc2VhcmNoU3RyaW5nKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZSgKLQkJCQlTRUFSQ0hfU1RSSU5HLCBzZWFyY2hTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIG5hbWUgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZVBhdHRlcm4oKSB7Ci0JCXJldHVybiBTZWFyY2hVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKAotCQkJCU5BTUVfUEFUVEVSTik7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1cnJlbnQgbmFtZSBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZVBhdHRlcm4oU3RyaW5nIG5hbWVQYXR0ZXJuKSB7Ci0JCVNlYXJjaFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShOQU1FX1BBVFRFUk4sCi0JCQkJbmFtZVBhdHRlcm4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNhdmVkIGFzZSBzZW5zaXRpdmUgb3B0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oCi0JCQkJQ0FTRV9TRU5TSVRJVkUpOwotCX0KLQotCS8qKgotCSAqIFNhdmVzIHRoZSBjdXJyZW50IGNhc2Ugc2Vuc2l0aXZlIG9wdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJU2VhcmNoVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKAotCQkJCUNBU0VfU0VOU0lUSVZFLCBjYXNlU2Vuc2l0aXZlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91aS9wcmVmZXJlbmNlcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwMzllZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3VpL3ByZWZlcmVuY2VzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHByZWZlcmVuY2Ugc3VwcG9ydCBmb3Igc2VhcmNoaW5nIGEgbWV0aG9kIGxpYnJhcnkuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGE1M2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYuc2VhcmNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjU3OWU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaAotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5TZWFyY2hQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IGNvbS5pYm0uaWN1LAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuYXBhY2hlLmx1Y2VuZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5zZWFyY2gsCi0gb3JnLmVjbGlwc2UuaGVscC5iYXNlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gsCi0gb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpcywKLSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q2ZjU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmM3MDMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFNlYXJjaAotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0dlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjZlN2MxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBzZWFyY2ggaW5kZXggZ2VuZXJhdGlvbiBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uIGV4dGVuZHMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2NTM3NDA1MjExNDUxMTc3MTEwTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSByb290Q2F1c2UKLQkgKiAgICAgICAgICAgIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlKSB7Ci0JCXN1cGVyKHJvb3RDYXVzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBnaXZlbiB0aGUgZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JNc2cKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JcHVibGljIEdlbmVyYXRlU2VhcmNoSW5kZXhFeGNlcHRpb24oU3RyaW5nIGVycm9yTXNnKSB7Ci0JCXN1cGVyKGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIocm9vdENhdXNlLCBlcnJvck1zZyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JU2VhcmNoU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9JU2VhcmNoU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDlhMjE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSVNlYXJjaFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhpdEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uU2VhcmNoUXVlcnk7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBTZXJ2aWNlIEFQSS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlYXJjaFNlcnZpY2UgewotCi0JLyoqCi0JICogU2VhcmNoZXMgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHNlYXJjaFF1ZXJ5Ci0JICogICAgICAgICAgICBhIGNvbmZpZ3VyYXRpb24gc2VhcmNoIHF1ZXJ5Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoQ29uZmlndXJhdGlvbihTdHJpbmcgcGF0aCwKLQkJCUNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSW5kZXhCdWlsZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL0luZGV4QnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjc5MDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvSW5kZXhCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5jamsuQ0pLQW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXguSW5kZXhXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUuRlNEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpcy5UZXh0QW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlscy5KYXJDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHMuTEhUTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51dGlscy5VTkNVdGlsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIG1haW4gY2xhc3MgdGhhdCBjcmVhdGVzIHRoZSBJbmRleCBmcm9tIHRoZSBmaWxlCi0gKiBhc3NvY2lhdGlvbnMgaW4gdGhlIHByb2Nlc3MgbGF5b3V0LgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhCdWlsZGVyIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9GSUxFX05BTUUgPSAidmVyc2lvbi50eHQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0RFTElNSVRFUiA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRG9jdW1lbnQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX0RFU0NSSVBUSU9OX0ZJRUxEID0gImJyaWVmRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9GSUVMRCA9ICJjb250ZW50cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GSUVMRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFRF9GSUVMRCA9ICJtb2RpZmllZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0ZJRUxEID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MRV9GSUVMRCA9ICJyb2xlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTU1BUllfRklFTEQgPSAic3VtbWFyeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZJRUxEID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0ZJRUxEID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRV9GSUVMRCA9ICJ0aXRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTUFfRUxFTUVOVF9UWVBFX0ZJRUxEID0gInVtYS50eXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQUxfQ09OVEVOVCA9ICJnZW5lcmFsX2NvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBMaXN0IG9mIFVNQSBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc2VhcmNoIGluZGV4LgotCXByaXZhdGUgc3RhdGljIExpc3QgTk9fU0VBUkNIRUFCTEVfVU1BX0VMRU1FTlRTID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoInN1bW1hcnkiKTsgLy8kTk9OLU5MUy0xJAotCQlOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMuYWRkKCJ3b3JrcHJvZHVjdGRlc2NyaXB0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMuYWRkKCJ0YXNrZGVzY3JpcHRvciIpOyAvLyROT04tTkxTLTEkCi0JCU5PX1NFQVJDSEVBQkxFX1VNQV9FTEVNRU5UUy5hZGQoInJvbGVkZXNjcmlwdG9yIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBBIGxpc3Qgb2YgdG9wIGxldmVsIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIHNlYXJjaAotCS8vIGluZGV4LgotCXB1YmxpYyBzdGF0aWMgTGlzdCBkaXJzVG9Ta2lwID0gbmV3IEFycmF5TGlzdCgpOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBEaXJlY3RvcnkgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGluZGV4Rm9sZGVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwcm9kdWN0TmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZpbGVzVG9Ta2lwID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIEluZGV4QnVpbGRlcihTdHJpbmcgcHVibGlzaERpcikgewotCQlpbnQgYXBwbGV0SW5kZXggPSAtMTsKLQkJaWYgKHB1Ymxpc2hEaXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlhcHBsZXRJbmRleCA9IHB1Ymxpc2hEaXIuaW5kZXhPZihGaWxlLnNlcGFyYXRvciArICJhcHBsZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBEaXJlY3RvcnkgPSBVTkNVdGlsLmNvbnZlcnRGaWxlbmFtZSgoYXBwbGV0SW5kZXggPiAtMSkgPyBwdWJsaXNoRGlyCi0JCQkJLnN1YnN0cmluZygwLCBhcHBsZXRJbmRleCArIDEpIDogcHVibGlzaERpcik7Ci0JCVN0cmluZyBzaXRlTmFtZSA9IHBEaXJlY3RvcnkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JCWludCBpbmRleCA9IHNpdGVOYW1lLmxlbmd0aCgpOwotCQlpZiAoc2l0ZU5hbWUuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbmRleCA9IGluZGV4IC0gMTsKLQkJfQotCi0JCWludCBpbmRleDIgPSBzaXRlTmFtZS5sYXN0SW5kZXhPZigiLyIsIGluZGV4IC0gMSk7IC8vJE5PTi1OTFMtMSQKLQotCQlwcm9kdWN0TmFtZSA9IHNpdGVOYW1lLnN1YnN0cmluZyhpbmRleDIgKyAxLCBpbmRleCk7Ci0KLQkJLy8gY3JlYXRlIHRoZSBpbmRleAotCQlTdHJpbmdCdWZmZXIgc2VhcmNoRm9sZGVyID0gbmV3IFN0cmluZ0J1ZmZlcihwRGlyZWN0b3J5KTsKLQkJaWYgKCFzZWFyY2hGb2xkZXIudG9TdHJpbmcoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXNlYXJjaEZvbGRlci5hcHBlbmQoRmlsZS5zZXBhcmF0b3IpOwotCQl9Ci0JCXNlYXJjaEZvbGRlci5hcHBlbmQoInNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5kZXhGb2xkZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNlYXJjaEZvbGRlci50b1N0cmluZygpKTsKLQkJaW5kZXhGb2xkZXIuYXBwZW5kKEZpbGUuc2VwYXJhdG9yKS5hcHBlbmQoImluZGV4Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlkaXJzVG9Ta2lwLmFkZChwRGlyZWN0b3J5ICsgImFwcGxldCIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiY3NzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJleHRfaGVscCIpOyAvLyROT04tTkxTLTEkCQkKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJpY29ucyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAiaW1hZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJpbmRleCIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAibG9ncyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAibWFudWFscyIpOyAvLyROT04tTkxTLTEkCQkKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJub2FwcGxldCIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAicGFnZXNfbm90X2luc3RhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAicHJvY2VzcyIpOyAvLyROT04tTkxTLTEkCQkKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJzY3JpcHRzIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJzdHlsZXNoZWV0cyIpOyAvLyROT04tTkxTLTEkCi0JCWRpcnNUb1NraXAuYWRkKHBEaXJlY3RvcnkgKyAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJZGlyc1RvU2tpcC5hZGQocERpcmVjdG9yeSArICJzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbGVzVG9Ta2lwLmFkZCgiX2Rlc2MuaHRtIik7ICAvLyROT04tTkxTLTEkCi0JCWZpbGVzVG9Ta2lwLmFkZCgiX3dicy5odG0iKTsgLy8kTk9OLU5MUy0xJAotCQlmaWxlc1RvU2tpcC5hZGQoIl90YnMuaHRtIik7IC8vJE5PTi1OTFMtMSQKLQkJZmlsZXNUb1NraXAuYWRkKCJfd3Bicy5odG0iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVJbmRleChib29sZWFuIGphckl0KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAoSW5kZXhCdWlsZGVyLmNsYXNzKSB7Ci0JCQkKLQkJCWlmIChpbmRleEZvbGRlciA9PSBudWxsIHx8IHBEaXJlY3RvcnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCQkiSW52YWxpZCBpbmRleEZvbGRlciBvciBwRGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJCi0JCQlib29sZWFuIGpha28gPSBmYWxzZTsKLQkJCUxvY2FsZSBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotCQkJU3RyaW5nIGxhbmcgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKLQkJCWlmIChsYW5nLmVxdWFscyhMb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKSkgfHwKLQkJCQlsYW5nLmVxdWFscyhMb2NhbGUuS09SRUEuZ2V0TGFuZ3VhZ2UoKSkpIHsKLQkJCQlqYWtvID0gdHJ1ZTsKLQkJCX0KLQkJCUFuYWx5emVyIGFuYWx5emVyID0gamFrbyA/IG5ldyBDSktBbmFseXplcigpIDogbmV3IFRleHRBbmFseXplcigpOwotCQkJCi0JCQl0cnkgewotCQkJCS8vIFJBTURpcmVjdG9yeSByYW1EaXIgPSBuZXcgUkFNRGlyZWN0b3J5KCk7Ci0JCQkJSW5kZXhXcml0ZXIgZnNXcml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoRlNEaXJlY3RvcnkKLQkJCQkJCS5nZXREaXJlY3RvcnkoaW5kZXhGb2xkZXIudG9TdHJpbmcoKSwgdHJ1ZSksCi0JCQkJCQlhbmFseXplciwgdHJ1ZSk7Ci0KLQkJCQkvLyBJbmRleFdyaXRlciByYW1Xcml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIocmFtRGlyLAotCQkJCS8vIG5ldyBUZXh0QW5hbHl6ZXIoKSwgdHJ1ZSk7Ci0KLQkJCQlpZiAoKGZzV3JpdGVyICE9IG51bGwpKSB7Ci0JCQkJCS8vIGZzV3JpdGVyLm1lcmdlRmFjdG9yID0gMTAwMDsKLQkJCQkJLy8gZnNXcml0ZXIubWF4TWVyZ2VEb2NzID0gMTAwMDA7Ci0JCQkJCWZzV3JpdGVyLnNldE1heEZpZWxkTGVuZ3RoKDEwMDAwMDApOwotCi0JCQkJCWluZGV4RG9jcyhuZXcgRmlsZShwRGlyZWN0b3J5KSwgZnNXcml0ZXIpOwotCi0JCQkJCS8vIGZzV3JpdGVyLmFkZEluZGV4ZXMobmV3IERpcmVjdG9yeVtdIHsgcmFtRGlyIH0pOwotCQkJCQlmc1dyaXRlci5vcHRpbWl6ZSgpOwotCQkJCQkvLyByYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJZnNXcml0ZXIuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSB0aGUgdmVyc2lvbiBmaWxlLgotCQkJRGF0ZSB0b2RheSA9IG5ldyBEYXRlKCk7Ci0JCQlsb25nIG1pbGxpc2Vjb25kcyA9IHRvZGF5LmdldFRpbWUoKTsKLQotCQkJaWYgKCFqYXJJdCkgewotCQkJCXRyeSB7Ci0JCQkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihpbmRleEZvbGRlciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkJKyBWRVJTSU9OX0ZJTEVfTkFNRSk7Ci0JCQkJCUJ1ZmZlcmVkV3JpdGVyIGJ3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGZ3KTsKLQkJCQkJYncud3JpdGUocHJvZHVjdE5hbWUgKyBWRVJTSU9OX0RFTElNSVRFUiArIG1pbGxpc2Vjb25kcwotCQkJCQkJCSsgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGFuYWx5emVyIGluc3RhbmNlb2YgQ0pLQW5hbHl6ZXIpIHsKLQkJCQkJCWJ3LndyaXRlKCJDSktBbmFseXplciIgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJYncuY2xvc2UoKTsKLQkJCQkJZncuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJdGhyb3cgbmV3IFNlYXJjaFNlcnZpY2VFeGNlcHRpb24oCi0JCQkJCQkJU2VhcmNoUmVzb3VyY2VzLmNyZWF0ZVNlYXJjaEluZGV4RXJyb3IpOwotCQkJCX0KLQotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvLyBqYXIgdXAgdGhlIGNyZWF0ZWQgaW5kZXguCi0JCQlKYXJDcmVhdG9yLmphckZvbGRlcihpbmRleEZvbGRlci50b1N0cmluZygpKTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJpbmRleCBKYXJyZWQgc3VjY2Vzc2Z1bGx5Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJdHJ5IHsKLQkJCQkvLyBkZWxldGUgdGhlIGZpbGVzIG5vdyB0aGF0IHRoZXkndmUgYmVlbiBqYXJyZWQuCi0JCQkJRmlsZSBpbmRleERpciA9IG5ldyBGaWxlKGluZGV4Rm9sZGVyLnRvU3RyaW5nKCkpOwotCQkJCUZpbGVbXSBmaWxlcyA9IGluZGV4RGlyLmxpc3RGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJRmlsZSB0ZW1wRmlsZSA9IGZpbGVzW2ldOwotCQkJCQlpZiAoIXRlbXBGaWxlLmdldE5hbWUoKS5lcXVhbHMoSmFyQ3JlYXRvci5JTkRFWF9KQVIpKSB7Ci0JCQkJCQl0ZW1wRmlsZS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFN0cmluZyBydXBOYW1lID0gcHVibGlzaERpci5zdWJzdHJpbmcoaW5kZXgpOwotCQkJCUZpbGUgbmV3SW5kZXhKYXIgPSBuZXcgRmlsZShpbmRleEZvbGRlciArIEZpbGUuc2VwYXJhdG9yCi0JCQkJCQkrIEphckNyZWF0b3IuSU5ERVhfSkFSKTsKLQkJCQlpZiAobmV3SW5kZXhKYXIuZXhpc3RzKCkpIHsKLQkJCQkJU3RyaW5nIGZpbGVTaXplID0gIiIgKyBuZXdJbmRleEphci5sZW5ndGgoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoaW5kZXhGb2xkZXIgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkJCSsgVkVSU0lPTl9GSUxFX05BTUUpOwotCQkJCQlCdWZmZXJlZFdyaXRlciBidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihmdyk7Ci0JCQkJCWJ3LndyaXRlKHByb2R1Y3ROYW1lICsgVkVSU0lPTl9ERUxJTUlURVIgKyBtaWxsaXNlY29uZHMKLQkJCQkJCQkrIFZFUlNJT05fREVMSU1JVEVSICsgZmlsZVNpemUgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoYW5hbHl6ZXIgaW5zdGFuY2VvZiBDSktBbmFseXplcikgewotCQkJCQkJYncud3JpdGUoIkNKS0FuYWx5emVyIiArICJcbiIpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlidy5jbG9zZSgpOwotCQkJCQlmdy5jbG9zZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKAotCQkJCQkJCVNlYXJjaFJlc291cmNlcy5jcmVhdGVTZWFyY2hJbmRleEVycm9yKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQl0aHJvdyBuZXcgU2VhcmNoU2VydmljZUV4Y2VwdGlvbigKLQkJCQkJCVNlYXJjaFJlc291cmNlcy5jcmVhdGVTZWFyY2hJbmRleEVycm9yKTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmRleCB0aGUgYWN0dWFsIGRvY3VtZW50cyBzcGVjaWZpZWQgYnkgdGhlIGZpbGVzIGFuZCByZWN1cnNpdmVseSBnZXQgYWxsCi0JICogZmlsZSBpbiB0aGUgc3BlY2lmaWVkIGZvbGRlciBmaWxlCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGV4RG9jcyhGaWxlIGZpbGUsIEluZGV4V3JpdGVyIHdyaXRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChkaXJzVG9Ta2lwLmNvbnRhaW5zKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGZpbGVzVG9Ta2lwLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBmaWxlVG9Ta2lwID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmluZGV4T2YoZmlsZVRvU2tpcCkgPiAtMSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpbmRleERvY3MobmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pLCB3cml0ZXIpOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzSHRtbERvYyhmaWxlKSkgewotCQkJaWYgKHNob3VsZEJlRXhjbHVkZWQoZmlsZSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQl0cnkgewotCQkJCQotCQkJCURvY3VtZW50IGRvYyA9IGdldEhUTUxEb2N1bWVudChmaWxlKTsJCQotCQkJCQotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQl3cml0ZXIuYWRkRG9jdW1lbnQoZG9jKTsJCQkJCi0JCQkJfQotCQkJCQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImluZGV4RG9jcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBUaGUgZmlsZSB0byBiZSB2ZXJpZmllZC4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmaWxlIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQotCSAqICAgICAgICAgc2VhcmNoIGluZGV4LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRCZUV4Y2x1ZGVkKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlpZiAocERpcmVjdG9yeS5zdGFydHNXaXRoKHBhdGgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSHRtbERvYyhGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldFBhdGgoKTsKLQkJcmV0dXJuIHBhdGguZW5kc1dpdGgoIi5odG1sIikgfHwgcGF0aC5lbmRzV2l0aCgiLmh0bSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNOb1NlYXJjaGFibGVEb2N1bWVudChQcm9wZXJ0aWVzIG1ldGFUYWdzKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IG1ldGFUYWdzLmdldFByb3BlcnR5KFVNQV9FTEVNRU5UX1RZUEVfRklFTEQpOwotCQkKLQkJLy8gdmFsdWUgPT0gbnVsbCBpcyB0cmVhdGVkIGFzIGdlbmVyYWwgZG9jdW1lbnQKLQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKSAmJiBOT19TRUFSQ0hFQUJMRV9VTUFfRUxFTUVOVFMuY29udGFpbnModmFsdWUpOwotCX0KLQkKLQljaGFyW10gY2J1ZiA9IG5ldyBjaGFyWzEwMjRdOwotCWludCBza2lwQ291bnQgPSAwOwotCQotCXByaXZhdGUgRG9jdW1lbnQgZ2V0SFRNTERvY3VtZW50KEZpbGUgZmlsZSkgewotCQlEb2N1bWVudCBsdWNlbmVEb2N1bWVudCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIGlucHV0ID0gbnVsbDsKLQkJUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkKLQkJCWlucHV0ID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0KLQkJCUxIVE1MUGFyc2VyIHBhcnNlciA9IG5ldyBMSFRNTFBhcnNlcihpbnB1dCk7Ci0KLQkJCXJlYWRlciA9IHBhcnNlci5nZXRSZWFkZXIoKTsKLQkJCWlmICggcmVhZGVyID09IG51bGwgKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVByb3BlcnRpZXMgbWV0YVRhZ3MgPSBwYXJzZXIuZ2V0TWV0YVRhZ3MoKTsKLQkJCWlmICggaXNOb1NlYXJjaGFibGVEb2N1bWVudChtZXRhVGFncykgKSB7Ci0JCQkJCi0JCQkJLy8gdGhlIExIVE1MUGFyc2VyIHRocmVhZCB3aWxsIG5vdCBlbmQgaWYgdGhlIHJlYWRlciBpcyBub3QgcHJvY2Vzc2VkCi0JCQkJLy8gY2F1c2luZyBtYWpvciByZXNvdXJjZSBsZWFrCi0JCQkJd2hpbGUgKCByZWFkZXIucmVhZChjYnVmKSA+IDAgKSB7Ci0JCQkJCTsKLQkJCQl9CQkJCi0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oICsrc2tpcENvdW50ICsgIiBmaWxlIHNraXBwZWQ6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlwYXJzZXIgPSBudWxsOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlsdWNlbmVEb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCi0JCQlTdHJpbmcgdXJsID0gZmlsZS5nZXRQYXRoKCkucmVwbGFjZShGaWxlLnBhdGhTZXBhcmF0b3JDaGFyLCAnLycpOwotCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlVuSW5kZXhlZChVUkxfRklFTEQsIHVybCkpOwotCQkJCi0JCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dChDT05URU5UX0ZJRUxELCByZWFkZXIpKTsKLQkJCQotCQkJU3RyaW5nIHRpdGxlID0gcGFyc2VyLmdldFRpdGxlKCk7Ci0JCQlpZiAodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkvLyBXb3JrYXJvdW5kIGEgTGludXggc3BlY2lmaWMgaXNzdWUuCi0JCQkJdGl0bGUgPSB0aXRsZS5yZXBsYWNlQWxsKCJcXHhhMCIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5LZXl3b3JkKFRJVExFX0ZJRUxELCB0aXRsZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJU3RyaW5nIHN1bW1hcnkgPSBwYXJzZXIuZ2V0U3VtbWFyeSgpOwotCQkJaWYgKHN1bW1hcnkuc3RhcnRzV2l0aCh0aXRsZSkgJiYgc3VtbWFyeS5sZW5ndGgoKSA+IHRpdGxlLmxlbmd0aCgpKSB7Ci0JCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLktleXdvcmQoU1VNTUFSWV9GSUVMRCwgc3VtbWFyeQotCQkJCQkJLnN1YnN0cmluZyh0aXRsZS5sZW5ndGgoKSArIDEpKSk7Ci0JCQl9IGVsc2UKLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuS2V5d29yZChTVU1NQVJZX0ZJRUxELCBwYXJzZXIKLQkJCQkJCS5nZXRTdW1tYXJ5KCkpKTsKLQotCQkJZm9yIChFbnVtZXJhdGlvbiBuYW1lcyA9IG1ldGFUYWdzLnByb3BlcnR5TmFtZXMoKTsgbmFtZXMKLQkJCQkJLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyB0YWdOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAodGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0YWdOYW1lLmVxdWFscyhST0xFX0ZJRUxEKSkgewotCQkJCQkJU3RyaW5nIHJvbGVOYW1lID0gbWV0YVRhZ3MuZ2V0UHJvcGVydHkodGFnTmFtZSk7Ci0JCQkJCQlpZiAocm9sZU5hbWUgIT0gbnVsbCkgewotCQkJCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KHRhZ05hbWUsIHJvbGVOYW1lKSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlTdHJpbmcgdGFnVmFsdWUgPSBtZXRhVGFncy5nZXRQcm9wZXJ0eSh0YWdOYW1lKTsKLQkJCQkJCWlmICh0YWdWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJbHVjZW5lRG9jdW1lbnQuYWRkKEZpZWxkLlRleHQodGFnTmFtZSwgdGFnVmFsdWUpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGx1Y2VuZURvY3VtZW50LmdldEZpZWxkKFJPTEVfRklFTEQpID09IG51bGwpIHsKLQkJCQkvLyBEZWZhdWx0IHRvICJuYSIgdG8gc3VwcG9ydCBzZWFyY2hpbmcgZm9yIGZpbGVzIHdpdGhvdXQKLQkJCQkvLyByb2xlIG1ldGEgdGFncy4KLQkJCQlsdWNlbmVEb2N1bWVudC5hZGQoRmllbGQuVGV4dChST0xFX0ZJRUxELCAiTk9SVVBST0xFIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCUZpZWxkIHVtYVR5cGVGaWVsZCA9IGx1Y2VuZURvY3VtZW50Ci0JCQkJCS5nZXRGaWVsZChVTUFfRUxFTUVOVF9UWVBFX0ZJRUxEKTsKLQkJCWlmICh1bWFUeXBlRmllbGQgPT0gbnVsbCkgewotCQkJCS8vIERlZmF1bHQgdG8gZ2VuZXJhbCBjb250ZW50LgotCQkJCWx1Y2VuZURvY3VtZW50LmFkZChGaWVsZC5UZXh0KFVNQV9FTEVNRU5UX1RZUEVfRklFTEQsCi0JCQkJCQlHRU5FUkFMX0NPTlRFTlQpKTsKLQkJCX0gCi0KLQkJCXBhcnNlciA9IG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsdWNlbmVEb2N1bWVudCA9IG51bGw7Ci0JCQlTZWFyY2hQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZ2dlcigpLmxvZ0Vycm9yKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGx1Y2VuZURvY3VtZW50OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI4ODBmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgSW5kZXhpbmcgcHJvZ3Jlc3MgbW9uaXRvcgotaW5kZXhDb25maWdGaWxlc1Rhc2tfbmFtZT1JbmRleGluZyBjb25maWd1cmF0aW9uIGZpbGVzLi4uCi0KLSMgRXJyb3IgRGV0YWlscwotY3JlYXRlU2VhcmNoSW5kZXhFcnJvcj1UaGUgc2VhcmNoIGluZGV4IGZpbGUgd2FzIG5vdCBjcmVhdGVkLgotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MmE5MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi0vKioKLSAqIFNpZ25hbHMgdGhhdCBhIHNlYXJjaCBjb25maWd1cmF0aW9uIG9wZXJhdGlvbiBoYXMgZmFpbGVkLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY1Mzc0MDUyMTE0NTExNzcxMTBMOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJc3VwZXIocm9vdENhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSBlcnJvciBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoZXJyb3JNc2cpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbiBhbmQgdGhlCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9vdENhdXNlCi0JICogICAgICAgICAgICB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hDb25maWd1cmF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UsIFN0cmluZyBlcnJvck1zZykgewotCQlzdXBlcihyb290Q2F1c2UsIGVycm9yTXNnKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxZDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uQWJzdHJhY3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIFNlYXJjaCBwbHVnLWluIGFjdGl2YXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZWFyY2hQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdEFjdGl2YXRvciB7Ci0KLQkvLyBUaGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VhcmNoUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFNlYXJjaFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgcGx1Zy1pbiBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNlYXJjaFBsdWdpbiBnZXREZWZhdWx0KCkgewkKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWI3Yjc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIHJlc291cmNlIGJ1bmRsZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZWFyY2hSZXNvdXJjZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEJVTkRMRV9OQU1FID0gU2VhcmNoUmVzb3VyY2VzLmNsYXNzLmdldFBhY2thZ2UoKQotCQkJLmdldE5hbWUoKQotCQkJKyAiLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU2VhcmNoSW5kZXhFcnJvcjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFNlYXJjaFJlc291cmNlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTZWFyY2hSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmZjYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9TZWFyY2hTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLldhclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IaXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZTsKLQotLyoqCi0gKiBUaGUgU2VhcmNoIFNlcnZpY2UgaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VhcmNoU2VydmljZSBpbXBsZW1lbnRzIElTZWFyY2hTZXJ2aWNlIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VhcmNoU2VydmljZSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZWFyY2hTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkIChTZWFyY2hTZXJ2aWNlLmNsYXNzKSB7Ci0JCQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCQkJaW5zdGFuY2UgPSBuZXcgU2VhcmNoU2VydmljZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IHRoaXMgY2xhc3MgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBTZWFyY2hTZXJ2aWNlKCkgewotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIGEgcHVibGlzaGVkIENvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBzZWFyY2hRdWVyeQotCSAqICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2VhcmNoIHF1ZXJ5Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoQ29uZmlndXJhdGlvbihTdHJpbmcgcGF0aCwKLQkJCUNvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZSBzZXJ2aWNlID0gbmV3IENvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlKAotCQkJCXBhdGgpOwotCQlzZXJ2aWNlLmluZGV4KCk7Ci0JCXJldHVybiBzZXJ2aWNlLnNlYXJjaChzZWFyY2hRdWVyeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY3JlYXRlSW5kZXgoU3RyaW5nIHB1Ymxpc2hEaXIpIHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSW5kZXhCdWlsZGVyIHNlcnZpY2UgPSBuZXcgSW5kZXhCdWlsZGVyKHB1Ymxpc2hEaXIpOwotCQlyZXR1cm4gc2VydmljZS5jcmVhdGVJbmRleCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjcmVhdGVJbmRleChTdHJpbmcgcHVibGlzaERpciwgYm9vbGVhbiBqYXJJdCkKLQkJCXRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJSW5kZXhCdWlsZGVyIHNlcnZpY2UgPSBuZXcgSW5kZXhCdWlsZGVyKHB1Ymxpc2hEaXIpOwotCQlyZXR1cm4gc2VydmljZS5jcmVhdGVJbmRleChqYXJJdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlV0FSKFN0cmluZyBwdWJsaXNoRGlyLCBTdHJpbmcgd2ViQXBwTmFtZSkgewotCQl0cnkgewotCQkJRmlsZSB3YXJGaWxlID0gbnVsbDsKLQkJCWlmICh3ZWJBcHBOYW1lLmVuZHNXaXRoKCIud2FyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXdhckZpbGUgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCB3ZWJBcHBOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2FyRmlsZSA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsIHdlYkFwcE5hbWUgKyAiLndhciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlXYXJVdGlsLmJ1aWxkV2FyRmlsZSh3YXJGaWxlLmdldEFic29sdXRlUGF0aCgpLCBwdWJsaXNoRGlyLCBudWxsKTsKLQkJCUZpbGUgbG9nc0RpciA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsICJsb2dzIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgY3NzRGlyID0gbmV3IEZpbGUocHVibGlzaERpciwgImNzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIHNjcmlwdHNEaXIgPSBuZXcgRmlsZShwdWJsaXNoRGlyLCAic2NyaXB0cyIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGltYWdlc0RpciA9IG5ldyBGaWxlKHB1Ymxpc2hEaXIsICJpbWFnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdDxGaWxlPiBmaWxlc05vdFRvRGVsZXRlID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQkJZmlsZXNOb3RUb0RlbGV0ZS5hZGQobG9nc0Rpcik7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZChjc3NEaXIpOwotCQkJZmlsZXNOb3RUb0RlbGV0ZS5hZGQoc2NyaXB0c0Rpcik7Ci0JCQlmaWxlc05vdFRvRGVsZXRlLmFkZChpbWFnZXNEaXIpOwotCQkJZmlsZXNOb3RUb0RlbGV0ZS5hZGQod2FyRmlsZSk7Ci0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhwdWJsaXNoRGlyLCBmaWxlc05vdFRvRGVsZXRlKTsKLQkJCWZpbGVzTm90VG9EZWxldGUuY2xlYXIoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL1NlYXJjaFNlcnZpY2VFeGNlcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVhMmMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvU2VhcmNoU2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBTZWFyY2ggU2VydmljZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC05MDYzMzAyMTgwODY5MTU3MzE2TDsKLQotCS8qKgotCSAqIFRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIFRocm93YWJsZSByb290Q2F1c2U7Ci0KLQkvKioKLQkgKiBUaGUgZXJyb3IgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTXNnOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKFRocm93YWJsZSByb290Q2F1c2UpIHsKLQkJdGhpcyhyb290Q2F1c2UsIHJvb3RDYXVzZS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZ2l2ZW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIGVycm9yTXNnCi0JICogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXB1YmxpYyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uKFN0cmluZyBlcnJvck1zZykgewotCQl0aGlzKG51bGwsIGVycm9yTXNnKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGdpdmVuIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24gYW5kIHRoZQotCSAqIGVycm9yIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHJvb3RDYXVzZQotCSAqICAgICAgICAgICAgdGhlIHJvb3QgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlcnJvck1zZwotCSAqICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgU2VhcmNoU2VydmljZUV4Y2VwdGlvbihUaHJvd2FibGUgcm9vdENhdXNlLCBTdHJpbmcgZXJyb3JNc2cpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290Q2F1c2UgPSByb290Q2F1c2U7Ci0JCXRoaXMuZXJyb3JNc2cgPSBlcnJvck1zZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByb290IGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcm9vdCBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCi0JICovCi0JcHVibGljIFRocm93YWJsZSBnZXRSb290Q2F1c2UoKSB7Ci0JCXJldHVybiByb290Q2F1c2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvU3RvcFdvcmRzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzM1MjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9TdG9wV29yZHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotIyBTZWFyY2ggU3RvcCBXb3JkcwotU2VhcmNoLnN0b3BXb3Jkcz1cCi1hLCBhYm91dCwgYW4sIGFuZCwgYXJlLCBhcywgYXQsIGJlLCBidXQsIGJ5LCBmb3IsIGZyb20sIGhvdywgXAotaSwgaWYsIGluLCBpbnRvLCBpcywgaXQsIG5vLCBub3QsIG9mLCBvbiwgb3IsIHMsIHN1Y2gsIFwKLXQsIHRoYXQsIHRoZSwgdGhlaXIsIHRoZW4sIHRoZXJlLCB0aGVzZSwgdGhleSwgdGhpcywgdG8sIFwKLXdhcywgd2hhdCwgd2hlbiwgd2hlcmUsIHdobywgd2lsbCwgd2l0aAotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEFuYWx5emVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRBbmFseXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTgwM2UxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dEFuYWx5emVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmFuYWx5c2lzOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5BbmFseXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbTsKLQotLyoqCi0gKiBBIHRleHQgYW5hbHl6ZXIgdGhhdCBoYW5kbGVzIFVuaWNvZGUgNC4xIGNoYXJhY3RlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGV4dEFuYWx5emVyIGV4dGVuZHMgQW5hbHl6ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGV4dEFuYWx5emVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuQW5hbHl6ZXIjdG9rZW5TdHJlYW0oU3RyaW5nLCBSZWFkZXIpCi0JICovCi0JcHVibGljIGZpbmFsIFRva2VuU3RyZWFtIHRva2VuU3RyZWFtKFN0cmluZyBmaWVsZE5hbWUsIFJlYWRlciByZWFkZXIpIHsKLQkJVG9rZW5TdHJlYW0gcmVzdWx0ID0gbmV3IFRleHRUb2tlbml6ZXIocmVhZGVyKTsKLQkJcmV0dXJuIG5ldyBUZXh0RmlsdGVyKHJlc3VsdCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9UZXh0RmlsdGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5ZGRkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guYW5hbHlzaXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuU3RvcEFuYWx5emVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLlN0b3BGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5TdHJVdGlsOwotCi0vKioKLSAqIEEgdGV4dCBmaWx0ZXIgdGhhdCBoYW5kbGVzIFVuaWNvZGUgNC4xIGNoYXJhY3RlcnMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dEZpbHRlciBleHRlbmRzIFRva2VuRmlsdGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFNldCBzdG9wV29yZHMgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVGV4dEZpbHRlcihUb2tlblN0cmVhbSBpbikgewotCQlzdXBlcihpbik7Ci0JCWlmIChzdG9wV29yZHMgPT0gbnVsbCkgewotCQkJbG9hZFN0b3BXb3JkcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlblN0cmVhbSNuZXh0KCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgVG9rZW4gbmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoVG9rZW4gdG9rZW4gPSBpbnB1dC5uZXh0KCk7IHRva2VuICE9IG51bGw7IHRva2VuID0gaW5wdXQubmV4dCgpKSB7Ci0JCQlTdHJpbmcgdG9rZW5UZXh0ID0gdG9rZW4udGVybVRleHQoKTsKLQkJCWlmICghc3RvcFdvcmRzLmNvbnRhaW5zKHRva2VuVGV4dCkpIHsKLQkJCQlyZXR1cm4gdG9rZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHN0b3Agd29yZHMgZGVmaW5lZCBpbiB0aGUgU3RvcFdvcmRzLnByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFN0b3BXb3JkcygpIHsKLQkJU3RyaW5nW10gd29yZHMgPSBudWxsOwotCQl0cnkgewotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKFRleHRGaWx0ZXIuY2xhc3MKLQkJCQkJLmdldFBhY2thZ2UoKS5nZXROYW1lKCkKLQkJCQkJKyAiLlN0b3BXb3JkcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJU3RyaW5nIHByb3BlcnR5ID0gYnVuZGxlLmdldFN0cmluZygiU2VhcmNoLnN0b3BXb3JkcyIpOyAvLyROT04tTkxTLTEkCi0JCQl3b3JkcyA9IFN0clV0aWwuc3BsaXQocHJvcGVydHksICIgLCIpOyAvLyROT04tTkxTLTEkCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXdvcmRzID0gU3RvcEFuYWx5emVyLkVOR0xJU0hfU1RPUF9XT1JEUzsKLQkJfQotCQlzdG9wV29yZHMgPSBTdG9wRmlsdGVyLm1ha2VTdG9wU2V0KHdvcmRzKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL1RleHRUb2tlbml6ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWYzMzViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvYW5hbHlzaXMvVGV4dFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5Ub2tlbml6ZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkJyZWFrSXRlcmF0b3I7Ci0KLS8qKgotICogQSB0ZXh0IHRva2VuaXplciB0aGF0IHVzZXMgSUNVNEogdG8gc2VnbWVudCB0ZXh0IGludG8gd29yZHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGV4dFRva2VuaXplciBleHRlbmRzIFRva2VuaXplciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsKLQotCXByaXZhdGUgQnJlYWtJdGVyYXRvciBpdGVyYXRvcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqICAgICAgICAgICAgdGhlIHRleHQgc291cmNlCi0JICovCi0JcHVibGljIFRleHRUb2tlbml6ZXIoUmVhZGVyIHJlYWRlcikgewotCQlzdXBlcihyZWFkZXIpOwotCQlTdHJpbmdCdWZmZXIgdGV4dEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoQlVGRkVSX1NJWkUpOwotCQljaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbQlVGRkVSX1NJWkVdOwotCQlpbnQgY2hhcnNSZWFkOwotCQl0cnkgewotCQkJd2hpbGUgKChjaGFyc1JlYWQgPSByZWFkZXIucmVhZChidWZmZXIsIDAsIEJVRkZFUl9TSVpFKSkgPiAwKSB7Ci0JCQkJdGV4dEJ1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBjaGFyc1JlYWQpOwotCQkJfQotCQkJdGV4dCA9IHRleHRCdWZmZXIudG9TdHJpbmcoKTsKLQkJCWl0ZXJhdG9yID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsKLQkJCWl0ZXJhdG9yLnNldFRleHQodGV4dCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWl0ZXJhdG9yID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuVG9rZW5TdHJlYW0jbmV4dCgpCi0JICovCi0JcHVibGljIGZpbmFsIFRva2VuIG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXRlcmF0b3IgIT0gbnVsbCkgewotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgc3RhcnQgPSBpdGVyYXRvci5jdXJyZW50KCk7Ci0JCQkJaW50IGVuZCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZW5kICE9IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJCQlTdHJpbmcgdG9rZW5UZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGVuZCkudG9Mb3dlckNhc2UoKTsKLQkJCQkJaWYgKCF0b2tlblRleHQuZXF1YWxzKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHRva2VuVGV4dC5lbmRzV2l0aCgiJ3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJdG9rZW5UZXh0ID0gdG9rZW5UZXh0LnN1YnN0cmluZygwLCB0b2tlblRleHQKLQkJCQkJCQkJCS5sZW5ndGgoKSAtIDIpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG5ldyBUb2tlbih0b2tlblRleHQsIDAsIHRva2VuVGV4dC5sZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9hbmFseXNpcy9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmNDJmOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2FuYWx5c2lzL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSB0ZXh0IGFuYWx5c2VyLCB0b2tlbml6ZXIgYW5kIGZpbHRlciBmb3IgaW5kZXhpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhpdEVudHJ5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vQ29uZmlndXJhdGlvbkhpdEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDgxNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25IaXRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIHNlYXJjaCBoaXQgZW50cnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkhpdEVudHJ5IHsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0KLQlwcml2YXRlIFN0cmluZyBicmllZkRlc2M7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIHRoZSBpZCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHR5cGUuCi0JICogCi0JICogQHJldHVybiB0aGUgdHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBicmVpZiBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBicmllZiBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjKCkgewotCQlyZXR1cm4gYnJpZWZEZXNjOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBicmllZkRlc2MKLQkgKiAgICAgICAgICAgIHRoZSBicmllZiBkZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCcmllZkRlc2MoU3RyaW5nIGJyaWVmRGVzYykgewotCQl0aGlzLmJyaWVmRGVzYyA9IGJyaWVmRGVzYzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwuCi0JICogCi0JICogQHJldHVybiB0aGUgVVJMCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgVVJMLgotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiAgICAgICAgICAgIHRoZSBVUkwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyB1cmwpIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL0NvbmZpZ3VyYXRpb25TZWFyY2hRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmZmNGQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9Db25maWd1cmF0aW9uU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi0vKioKLSAqIFRoZSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbiBzZWFyY2ggcXVlcnkuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfQlJJRUZfREVTQyA9ICJicmllZkRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0ZVTExfREVTQyA9ICJmdWxsRGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBIYXNodGFibGUgcXVlcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uU2VhcmNoUXVlcnkoKSB7Ci0JCXF1ZXJ5ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlxdWVyeS5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBxdWVyeSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgc2VhcmNoIHF1ZXJ5IHN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlTdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJRW51bWVyYXRpb24ga2V5cyA9IHF1ZXJ5LmtleXMoKTsKLQotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCXNiLmFwcGVuZChrZXkgKyAiOigiICsgcXVlcnkuZ2V0KGtleSkgKyAiKSAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpZiAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCXNiLmFwcGVuZCgiQU5EICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGVybShTdHJpbmcgdGVybSwgU3RyaW5nIGNyaXQpIHsKLQkJcXVlcnkucHV0KGNyaXQsIHRlcm0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJc2V0VGVybSh0eXBlLCBDQVRFR09SWV9UWVBFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXNldFRlcm0obmFtZSwgQ0FURUdPUllfTkFNRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjKFN0cmluZyBkZXNjKSB7Ci0JCXNldFRlcm0oZGVzYywgQ0FURUdPUllfQlJJRUZfREVTQyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RnVsbERlc2MoU3RyaW5nIGRlc2MpIHsKLQkJc2V0VGVybShkZXNjLCBDQVRFR09SWV9GVUxMX0RFU0MpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9Db25maWd1cmF0aW9uU2VhcmNoU2VydmljZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDExZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC9jb25maWd1cmF0aW9uL2ludGVybmFsL0NvbmZpZ3VyYXRpb25TZWFyY2hTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQuRGF0ZUZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkRvY3VtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LkZpZWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkluZGV4V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLlF1ZXJ5UGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5IaXRzOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5JbmRleFNlYXJjaGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5RdWVyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guU2VhcmNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5odG1sLkhUTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5HZW5lcmF0ZVNlYXJjaEluZGV4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5zZWFyY2guU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLlNlYXJjaFNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5hbmFseXNpcy5UZXh0QW5hbHl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IaXRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5OwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBzZWFyY2hpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uU2VhcmNoU2VydmljZSB7Ci0KLQkvKioKLQkgKiBEb2N1bWVudCBmaWVsZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRklFTEQgPSAiYnJpZWZEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklFTEQgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0ZJRUxEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJRURfRklFTEQgPSAibW9kaWZpZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0ZJRUxEID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST0xFX0ZJRUxEID0gInJvbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVU1NQVJZX0ZJRUxEID0gInN1bW1hcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZJRUxEID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfRklFTEQgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIEhUTUwgcGFyc2VyLgotCXByaXZhdGUgSFRNTFBhcnNlciBwYXJzZXI7Ci0KLQkvLyBUaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGRvY3VtZW50cyB0byBiZSBpbmRleGVkLgotCXByaXZhdGUgU3RyaW5nIGRvY0RpciA9IG51bGw7Ci0KLQkvLyBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbmRleCBmaWxlcyB3aWxsIGJlIGdlbmVyYXRlZC4KLQlwcml2YXRlIFN0cmluZyBpbmRleERpciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2NEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UoU3RyaW5nIGRvY0RpcikgewotCQlTdHJpbmcgdXNlckhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBoYXNoQ29kZSA9IE1hdGguYWJzKGRvY0Rpci5oYXNoQ29kZSgpKTsKLQkJU3RyaW5nIGluZGV4UGF0aCA9IHVzZXJIb21lICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkrICJydXAiICsgRmlsZS5zZXBhcmF0b3IgKyBoYXNoQ29kZSArIEZpbGUuc2VwYXJhdG9yICsgImluZGV4IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNldERpcnMoZG9jRGlyLCBpbmRleFBhdGgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGRvY0RpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBpbmRleERpcgotCSAqICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGluZGV4ZXMKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UoU3RyaW5nIGRvY0RpciwgU3RyaW5nIGluZGV4RGlyKSB7Ci0JCXNldERpcnMoZG9jRGlyLCBpbmRleERpcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgY29uZmlndXJhdGlvbiBhbmQgaW5kZXggZGlyZWN0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBkb2NEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gaW5kZXhEaXIKLQkgKiAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBpbmRleGVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlycyhTdHJpbmcgZG9jRGlyLCBTdHJpbmcgaW5kZXhEaXIpIHsKLQkJdGhpcy5kb2NEaXIgPSBkb2NEaXI7Ci0JCXRoaXMuaW5kZXhEaXIgPSBpbmRleERpcjsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHNlYXJjaCBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VhcmNoIHF1ZXJ5LgotCSAqIAotCSAqIEBwYXJhbSBxdWVyeQotCSAqICAgICAgICAgICAgdGhlIHNlYXJjaCBxdWVyeSBzdHJpbmcKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25IaXRFbnRyeTwvY29kZT4gb2JqZWN0cwotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uSGl0RW50cnlbXSBzZWFyY2goQ29uZmlndXJhdGlvblNlYXJjaFF1ZXJ5IHF1ZXJ5KQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gc2VhcmNoKHF1ZXJ5LmdldFF1ZXJ5U3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIGEgc2VhcmNoIG9uIHRoZSBnaXZlbiBxdWVyeSBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHFzdHIKLQkgKiAgICAgICAgICAgIGEgTHVjZW5lIGNvbXBhdGlibGUgcXVlcnkgc3RyaW5nCi0JICogQHJldHVybiBhbiBhcnJheSBvZiA8Y29kZT5Db25maWd1cmF0aW9uSGl0RW50cnk8L2NvZGU+IG9iamVjdHMKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkhpdEVudHJ5W10gc2VhcmNoKFN0cmluZyBxc3RyKQotCQkJdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlTZWFyY2hlciBzZWFyY2hlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzZWFyY2hlciA9IG5ldyBJbmRleFNlYXJjaGVyKGluZGV4RGlyKTsKLQkJCVF1ZXJ5IHF1ZXJ5ID0gUXVlcnlQYXJzZXIucGFyc2UocXN0ciwgQ09OVEVOVF9GSUVMRCwKLQkJCQkJbmV3IFRleHRBbmFseXplcigpKTsKLQotCQkJSGl0cyBsaGl0cyA9IHNlYXJjaGVyLnNlYXJjaChxdWVyeSk7Ci0JCQlDb25maWd1cmF0aW9uSGl0RW50cnlbXSBoaXRzID0gbmV3IENvbmZpZ3VyYXRpb25IaXRFbnRyeVtsaGl0cwotCQkJCQkubGVuZ3RoKCldOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhpdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlEb2N1bWVudCBkb2MgPSBsaGl0cy5kb2MoaSk7Ci0JCQkJaGl0c1tpXSA9IG5ldyBDb25maWd1cmF0aW9uSGl0RW50cnkoKTsKLQkJCQloaXRzW2ldLnNldE5hbWUoZG9jLmdldChOQU1FX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRVcmwoZG9jLmdldChVUkxfRklFTEQpKTsKLQkJCQloaXRzW2ldLnNldEJyaWVmRGVzYyhkb2MuZ2V0KEJSSUVGX0RFU0NSSVBUSU9OX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRJZChkb2MuZ2V0KElEX0ZJRUxEKSk7Ci0JCQkJaGl0c1tpXS5zZXRUeXBlKGRvYy5nZXQoVFlQRV9GSUVMRCkpOwotCQkJfQotCQkJcmV0dXJuIGhpdHM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU2VhcmNoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzZWFyY2hlciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc2VhcmNoZXIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIG9mIHRoZSBpbmRleCBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpbmRleCBkYXRhYmFzZSBhbHJlYWR5IGV4aXN0cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGluZGV4RXhpc3RzKCkgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZShpbmRleERpcikubGlzdEZpbGVzKCk7Ci0JCXJldHVybiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggIT0gMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSBleGVjdXRpbmcgdGhlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGluZGV4KCkgdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24gewotCQlpbmRleChudWxsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc2VhcmNoIGluZGV4LgotCSAqIAotCSAqIEBwYXJhbSByZWluZGV4Ci0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgcGVyZm9ybXMgYSByZWluZGV4Ci0JICogQHRocm93cyBTZWFyY2hTZXJ2aWNlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGV4ZWN1dGluZyB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgaW5kZXgoYm9vbGVhbiByZWluZGV4KSB0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCWluZGV4KG51bGwsIHJlaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGluZGV4IGRhdGFiYXNlLgotCSAqIAotCSAqIEBwYXJhbSBwbQotCSAqICAgICAgICAgICAgYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHBhcmFtIHJlaW5kZXgKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBwZXJmb3JtcyBhIHJlaW5kZXgKLQkgKiBAdGhyb3dzIFNlYXJjaFNlcnZpY2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgZXhlY3V0aW5nIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRleChJUHJvZ3Jlc3NNb25pdG9yIHBtLCBib29sZWFuIHJlaW5kZXgpCi0JCQl0aHJvd3MgU2VhcmNoU2VydmljZUV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAoQ29uZmlndXJhdGlvblNlYXJjaFNlcnZpY2UuY2xhc3MpIHsKLQkJCWlmIChpbmRleERpciA9PSBudWxsIHx8IGRvY0RpciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBpbmRleERpciBvciBkb2NEaXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlpZiAoIXJlaW5kZXggJiYgaW5kZXhFeGlzdHMoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCQlwbS5iZWdpblRhc2soU2VhcmNoUmVzb3VyY2VzLmluZGV4Q29uZmlnRmlsZXNUYXNrX25hbWUsCi0JCQkJCQlnZXRUb3RhbERvY3NUb0luZGV4KGRvY0RpcikpOyAKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlkZWxldGVBbGxJbmRleERpcnMoKTsKLQkJCQluZXcgRmlsZShpbmRleERpcikubWtkaXJzKCk7Ci0JCQkJSW5kZXhXcml0ZXIgd3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKGluZGV4RGlyLAotCQkJCQkJbmV3IFRleHRBbmFseXplcigpLCB0cnVlKTsKLQkJCQl3cml0ZXIubWF4RmllbGRMZW5ndGggPSAxMDAwMDAwOwotCQkJCXBhcnNlciA9IG5ldyBIVE1MUGFyc2VyKCk7Ci0JCQkJaW5kZXhEb2NzKG5ldyBGaWxlKGRvY0RpciksIHdyaXRlciwgcG0pOwotCQkJCXdyaXRlci5vcHRpbWl6ZSgpOwotCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgR2VuZXJhdGVTZWFyY2hJbmRleEV4Y2VwdGlvbihlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCQkJcG0uZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgYWxsIGV4aXN0aW5nIGluZGV4IGRhdGFiYXNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVBbGxJbmRleERpcnMoKSB7Ci0JCUZpbGUgcGFyZW50ID0gbmV3IEZpbGUoaW5kZXhEaXIpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZVtdIGZpbGVzID0gcGFyZW50Lmxpc3RGaWxlcygpOwotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUZpbGVbXSBmaWxlID0gZmlsZXNbaV0ubGlzdEZpbGVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmlsZS5sZW5ndGg7IGorKykgewotCQkJCQkJZmlsZVtqXS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQlmaWxlc1tpXS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgZmlsZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzZWFyY2ggaW5kZXguCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBuYW1lCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgc2VhcmNoIGluZGV4LAotCSAqICAgICAgICAgaW5jbHVkaW5nIGFsbCBzdWItZGlyZWN0b3JpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUb3RhbERvY3NUb0luZGV4KFN0cmluZyBkaXIpIHsKLQkJaW50IHRvdGFsID0gMDsKLQkJRmlsZSBkaXJGaWxlID0gbmV3IEZpbGUoZGlyKTsKLQkJRmlsZSBmaWxlc1tdID0gZGlyRmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGZpbGVzID09IG51bGwpIHsKLQkJCXJldHVybiB0b3RhbDsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNYTUlEb2MoZmlsZXNbaV0pKSB7Ci0JCQkJdG90YWwrKzsKLQkJCX0gZWxzZSBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCXRvdGFsICs9IGdldFRvdGFsRG9jc1RvSW5kZXgoZmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0b3RhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgaW5kZXhlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgdmVyaWZpZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGluZGV4ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWE1JRG9jKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZS5nZXRQYXRoKCkuZW5kc1dpdGgoIi54bWkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBpbmRleGVkLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICB0aGUgZmlsZSB0byBiZSB2ZXJpZmllZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgaW5kZXhlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sT3JUZXh0RG9jKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgcGF0aCA9IGZpbGUuZ2V0UGF0aCgpOwotCQlyZXR1cm4gcGF0aC5lbmRzV2l0aCgiLmh0bWwiKSB8fCBwYXRoLmVuZHNXaXRoKCIuaHRtIikgfHwgcGF0aC5lbmRzV2l0aCgiLnR4dCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCS8qKgotCSAqIEEgcmVjdXJzaXZlIGZ1bmN0aW9uIHRvIGluZGV4IGZpbGVzLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIGRpcmVjdG9yeSBvciBmaWxlIHRvIGJlIGluZGV4ZWQKLQkgKiBAcGFyYW0gd3JpdGVyCi0JICogICAgICAgICAgICB0aGUgaW5kZXggd3JpdGVyCi0JICogQHBhcmFtIHBtCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleERvY3MoRmlsZSBmaWxlLCBJbmRleFdyaXRlciB3cml0ZXIsIElQcm9ncmVzc01vbml0b3IgcG0pCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImFwcGxldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWluZGV4RG9jcyhuZXcgRmlsZShmaWxlLCBmaWxlc1tpXSksIHdyaXRlciwgcG0pOwotCQkJfQotCQl9IGVsc2UgaWYgKGlzSHRtbE9yVGV4dERvYyhmaWxlKSkgewotCQkJaWYgKHBtICE9IG51bGwpIHsKLQkJCQlwbS5zdWJUYXNrKGZpbGUuZ2V0TmFtZSgpKTsKLQkJCQlwbS53b3JrZWQoMSk7Ci0JCQl9Ci0JCQlpZiAoc2hvdWxkQmVFeGNsdWRlZChmaWxlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCURvY3VtZW50IGRvYyA9IGdldEhUTUxEb2N1bWVudChmaWxlKTsKLQkJCXdyaXRlci5hZGREb2N1bWVudChkb2MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyA8b2NkZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBpbmRleGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgYSBmaWxlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBpbmRleGluZwotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEJlRXhjbHVkZWQoRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBwID0gZmlsZS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCXJldHVybiBkb2NEaXIuc3RhcnRzV2l0aChwKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb2N1bWVudCBvYmplY3Qgb2YgYSBIVE1MIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIHRoZSBIVE1MIGZpbGUgdG8gYmUgaW5kZXhlZAotCSAqIEByZXR1cm4gYSBkb2N1bWVudCBvYmplY3QKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBwYXJzaW5nIHRoZSBIVE1MIGZpbGUKLQkgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgdGhlIG9wZXJhdGlvbiBpcyBpbnRlcnJ1cHRlZCBieSBhIHVzZXIKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0SFRNTERvY3VtZW50KEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlEb2N1bWVudCBkb2MgPSBuZXcgRG9jdW1lbnQoKTsKLQkJZG9jLmFkZChGaWVsZC5VbkluZGV4ZWQoVVJMX0ZJRUxELCBmaWxlLmdldFBhdGgoKS5yZXBsYWNlKAotCQkJCUZpbGUucGF0aFNlcGFyYXRvckNoYXIsICcvJykpKTsKLQkJZG9jLmFkZChGaWVsZC5LZXl3b3JkKE1PRElGSUVEX0ZJRUxELCBEYXRlRmllbGQudGltZVRvU3RyaW5nKGZpbGUKLQkJCQkubGFzdE1vZGlmaWVkKCkpKSk7Ci0KLQkJdHJ5IHsKLQkJCXBhcnNlci5wYXJzZShmaWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCWRvYy5hZGQoRmllbGQuVGV4dChDT05URU5UX0ZJRUxELCBwYXJzZXIuZ2V0VGV4dCgpKSk7Ci0JCWRvYy5hZGQoRmllbGQuVW5JbmRleGVkKFNVTU1BUllfRklFTEQsIHBhcnNlci5nZXRTdW1tYXJ5KCkpKTsKLQotCQlQcm9wZXJ0aWVzIG1ldGFUYWdzID0gcGFyc2VyLmdldE1ldGFUYWdzKCk7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IG1ldGFUYWdzLnByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJZG9jLmFkZChGaWVsZC5UZXh0KHRhZ05hbWUsIG1ldGFUYWdzLmdldFByb3BlcnR5KHRhZ05hbWUpKSk7Ci0JCX0KLQotCQlpZiAoZG9jLmdldEZpZWxkKFJPTEVfRklFTEQpID09IG51bGwpIHsKLQkJCWRvYy5hZGQoRmllbGQuVGV4dChST0xFX0ZJRUxELCAiTk9SVVBST0xFIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gZG9jOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vaW50ZXJuYWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTA3YWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9pbnRlcm5hbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHNlYXJjaGluZyBhIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDdjNGIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBzZWFyY2hpbmcgYSBwdWJsaXNoZWQgY29uZmlndXJhdGlvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGZjYTk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBzZWFyY2ggc2VydmljZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0phckNyZWF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvSmFyQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjE1N2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvSmFyQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07Ci0KLXB1YmxpYyBjbGFzcyBKYXJDcmVhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVYX0pBUiA9ICJpbmRleC5qYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWphckZvbGRlcihhcmdzWzBdKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgamFyRm9sZGVyKFN0cmluZyBmb2xkZXJuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImF0dGVtcHRpbmcgdG8gamFyIHN0dWZmIik7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgamFyRGlyID0gbmV3IEZpbGUoZm9sZGVybmFtZSk7Ci0JCQlGaWxlIGphckZpbGUgPSBuZXcgRmlsZShmb2xkZXJuYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBJTkRFWF9KQVIpOwotCi0JCQlqYXJGaWxlcyhqYXJEaXIsIGphckZpbGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIGluIHRoZSBqYXIgdGhpbmd5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbWV0aG9kIHRvIGphciB0aGUgc3BlY2lmaWVkIGRpciBpbnRvIGEgamFyIGZpbGUuIG5vbi1zdWItZm9sZGVycyB3aWxsIGJlCi0JICogamFyZWQuCi0JICogCi0JICogQHBhcmFtIGphckRpcgotCSAqIEBwYXJhbSBqYXJGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBqYXJGaWxlcyhGaWxlIGphckRpciwgRmlsZSBqYXJGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSBqYXJEaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChqYXJGaWxlLmV4aXN0cygpKSB7Ci0JCQlqYXJGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JCUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oCi0JCQkJamFyRmlsZSkpOwotCQlaaXBPdXRwdXRTdHJlYW0gemlwcGVyU3RyZWFtID0gbmV3IFppcE91dHB1dFN0cmVhbShiU3RyZWFtKTsKLQotCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVs0MDk2XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBjdXJyZW50RmlsZSA9IGZpbGVzW2ldOwotCQkJaWYgKGN1cnJlbnRGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVppcEVudHJ5IGN1cnJFbnRyeSA9IG5ldyBaaXBFbnRyeShjdXJyZW50RmlsZS5nZXROYW1lKCkpOwotCQkJemlwcGVyU3RyZWFtLnB1dE5leHRFbnRyeShjdXJyRW50cnkpOwotCQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBiaVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oCi0JCQkJCWN1cnJlbnRGaWxlKSk7Ci0JCQl3aGlsZSAoYmlTdHJlYW0uYXZhaWxhYmxlKCkgPiAwKSB7Ci0JCQkJaW50IG51bSA9IGJpU3RyZWFtLnJlYWQoYnl0ZXMpOwotCQkJCXppcHBlclN0cmVhbS53cml0ZShieXRlcywgMCwgbnVtKTsKLQkJCX0KLQkJCWJpU3RyZWFtLmNsb3NlKCk7Ci0JCQl6aXBwZXJTdHJlYW0uY2xvc2VFbnRyeSgpOwotCQl9Ci0JCXppcHBlclN0cmVhbS5jbG9zZSgpOwotCQliU3RyZWFtLmNsb3NlKCk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvTEhUTUxQYXJzZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gvc3JjL29yZy9lY2xpcHNlL2VwZi9zZWFyY2gvdXRpbHMvTEhUTUxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY2OWIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL0xIVE1MUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIEEgSFRNTCBwYXJzZXIgdXNlZCBmb3IgZXh0cmFjdGluZyB0aGUgbWV0YSB0YWdzIGFuZCB0ZXh0IGZyb20gYSBIVE1MCi0gKiBkb2N1bWVudC4KLSAqIAotICogVE9ETzogSW1wbGVtZW50IG91ciBvd24gSFRNTCBwYXJzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBMSFRNTFBhcnNlciBleHRlbmRzIG9yZy5hcGFjaGUubHVjZW5lLmRlbW8uaHRtbC5IVE1MUGFyc2VyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExIVE1MUGFyc2VyKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIExIVE1MUGFyc2VyKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTEhUTUxQYXJzZXIoUmVhZGVyIHN0cmVhbSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgSFRNTCBtZXRhIHRhZ3MuCi0JICovCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0TWV0YVRhZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldE1ldGFUYWdzKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVhZGVyIGZvciB0aGUgSFRNTCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlYWRlcigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIEhUTUwgdGl0bGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuZ2V0VGl0bGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyBhIHN1bW1hcnkgb2YgdGhlIEhUTCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1bW1hcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN1cGVyLmdldFN1bW1hcnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlYXJjaC91dGlscy9VTkNVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL1VOQ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwNWM3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VhcmNoL3V0aWxzL1VOQ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBVTkNVdGlsIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfRklMRV9QUkVGSVggPSAiZmlsZTovIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVggPSAiZmlsZTovLyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVRTQ0FQRV9VTkNfRklMRV9QUkVGSVggPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DX0ZJTEVfT05MWSA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNfU0VQQVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIEFjY291bnRzIGZvciBuZXRzY2FwZSB1bmMgZmlsZSBwcmVmaXguIENvbnZlcnRzIHRvIHN0YW5kYXJkIG9uZS4KLQkgKiBJZiBub3QgTmV0c2NhcGUsIG5vdGhpbmcgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBoYW5kbGVOZXRzY2FwZUZpbGVQcmVmaXgoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJU3RyaW5nIGNvbnZlcnRlZE5hbWUgPSBudWxsOwotCi0JCWlmIChmaWxlbmFtZS5zdGFydHNXaXRoKE5FVFNDQVBFX1VOQ19GSUxFX1BSRUZJWCkpCi0JCXsKLQkJCWNvbnZlcnRlZE5hbWUgPQotCQkJCUFMVEVSTkFURV9VTkNfRklMRV9QUkVGSVgKLQkJCQkJKyBmaWxlbmFtZS5zdWJzdHJpbmcoCi0JCQkJCQlORVRTQ0FQRV9VTkNfRklMRV9QUkVGSVgubGVuZ3RoKCksCi0JCQkJCQlmaWxlbmFtZS5sZW5ndGgoKSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQljb252ZXJ0ZWROYW1lID0gZmlsZW5hbWU7Ci0JCX0KLQotCQlyZXR1cm4gKGNvbnZlcnRlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZXMgVVJMIHBhdGhzIGZvciBNb3ppbGxhIChhbmQgb3RoZXIgYnJvd3NlcnMpIG92ZXIgVU5DLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGhhbmRsZVVSTEZvclVOQyhVUkwgb3JpZ2luYWxVcmwpCi0JewotCQkvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhIG92ZXIgVU5DCi0JCVVSTCBuZXdVcmwgPSBudWxsOwotCQl0cnkKLQkJewotCQkJaWYgKG9yaWdpbmFsVXJsLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiZmlsZTovLyIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJLy8gY2hhbmdlICJmaWxlOi8vIiB0byAiZmlsZTovLy8vLyIKLQkJCQlTdHJpbmcgZXh0cmFjdGVkU3RyaW5nID0gb3JpZ2luYWxVcmwudG9TdHJpbmcoKS5zdWJzdHJpbmcoNSk7Ci0JCQkJbmV3VXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiLy8vIiArIGV4dHJhY3RlZFN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbmV3VXJsID0gb3JpZ2luYWxVcmw7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpCi0JCXsKLQkJCW5ld1VybCA9IG9yaWdpbmFsVXJsOwotCQl9Ci0KLQkJcmV0dXJuIChuZXdVcmwpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBVTkMgZmlsZSB0byBhIHJlZ3VsYXIsIHBsYXRmb3JtLWRlcGVuZGVudCBvbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLQl7Ci0JCVN0cmluZyBjb252ZXJ0ZWROYW1lID0gbnVsbDsKLQotCQkvLyByZW1vdmUgYW55IFVSTCBwcmVmaXhlcwotCQlTdHJpbmcgdGVtcE5hbWUgPSBudWxsOwotCQlpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aChVTkNfRklMRV9QUkVGSVgpKQotCQl7Ci0JCQl0ZW1wTmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhVTkNfRklMRV9QUkVGSVgubGVuZ3RoKCksIGZpbGVuYW1lLmxlbmd0aCgpKTsKLQkJCWludCBpbmRleCA9IHRlbXBOYW1lLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJewotCQkJCS8vIG9uIFVuaXgsIGFkZCBzZXBhcmF0b3IgYmFjayB0byBmaXJzdCBjaGFyYWN0ZXIKLQkJCQl0ZW1wTmFtZSA9IFVOQ19TRVBBUkFUT1IgKyB0ZW1wTmFtZTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCXsKLQkJCXRlbXBOYW1lID0gZmlsZW5hbWU7Ci0JCX0KLQotCQkvLyBjb252ZXJ0IGFueSBVTkMgc2VwYXJhdG9ycyB0byB0aGUgc3lzdGVtIGRlZmF1bHQgb25lCi0JCWNvbnZlcnRlZE5hbWUgPQotCQkJdGVtcE5hbWUucmVwbGFjZShVTkNfU0VQQVJBVE9SLmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApKTsKLQotCQlyZXR1cm4gKGNvbnZlcnRlZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBmaWxlbmFtZSB0byBhIFVOQyBmaWxlbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZW5hbWVUb1VOQyhTdHJpbmcgZmlsZW5hbWUpCi0JewotCQkvLyBjb252ZXJ0IGFueSBVTkMgc2VwYXJhdG9ycyB0byB0aGUgc3lzdGVtIGRlZmF1bHQgb25lCi0JCVN0cmluZyBjb252ZXJ0ZWROYW1lID0KLQkJCWZpbGVuYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApLCBVTkNfU0VQQVJBVE9SLmNoYXJBdCgwKSk7Ci0JCVN0cmluZyBmaW5hbE5hbWUgPSBjb252ZXJ0RmlsZVNlcGFyYXRvcihjb252ZXJ0ZWROYW1lKTsKLQkJcmV0dXJuIChmaW5hbE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIHRoZSBVUkwgdG8gb25lIHdoaWNoIGNhbiB0aGF0IG1hdGNoZXMgYSBVTkMgY29udmVudGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9VTkMoU3RyaW5nIHVybCkKLQl7Ci0JCVN0cmluZyBjb252ZXJ0ZWRVcmwgPSBudWxsOwotCQlpZiAodXJsLnN0YXJ0c1dpdGgoQUxURVJOQVRFX1VOQ19GSUxFX1BSRUZJWCkpCi0JCXsKLQkJCWNvbnZlcnRlZFVybCA9Ci0JCQkJVU5DX0ZJTEVfUFJFRklYCi0JCQkJCSsgdXJsLnN1YnN0cmluZyhBTFRFUk5BVEVfVU5DX0ZJTEVfUFJFRklYLmxlbmd0aCgpLCB1cmwubGVuZ3RoKCkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJY29udmVydGVkVXJsID0gdXJsOwotCQl9Ci0JCXJldHVybiAoY29udmVydGVkVXJsKTsKLQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlICIlMjAiIHRoYXQgaXMgdXNlZCBieSBzb21lIGJyb3dzZXJzIGZvciBzcGFjZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0RmlsZVNwYWNpbmcoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJLy8gbm93IHJlbW92ZSBhbnkgIiUyMCIKLQkJaW50IHN0YXJ0ID0gMDsKLQkJU3RyaW5nIG5ld0ZpbGVuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0YXJ0IDwgZmlsZW5hbWUubGVuZ3RoKCkpCi0JCXsKLQkJCWludCBpbmRleCA9IGZpbGVuYW1lLmluZGV4T2YoIiUyMCIsIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGluZGV4ID09IC0xKQotCQkJewotCQkJCWluZGV4ID0gZmlsZW5hbWUubGVuZ3RoKCk7Ci0JCQl9Ci0JCQluZXdGaWxlbmFtZSArPSBmaWxlbmFtZS5zdWJzdHJpbmcoc3RhcnQsIGluZGV4KTsKLQkJCW5ld0ZpbGVuYW1lICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJc3RhcnQgPSBpbmRleCArIDM7Ci0JCX0KLQotCQluZXdGaWxlbmFtZSA9IG5ld0ZpbGVuYW1lLnRyaW0oKTsKLQotCQlyZXR1cm4gKG5ld0ZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSAiJTVDIiB0aGF0IGlzIHVzZWQgYnkgc29tZSBicm93c2VycyBmb3IgZmlsZSBzZXBhcmF0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydEZpbGVTZXBhcmF0b3IoU3RyaW5nIGZpbGVuYW1lKQotCXsKLQkJLy8gcmVtb3ZlIGFueSAiJTVDIgotCQlpbnQgc3RhcnQgPSAwOwotCQlTdHJpbmcgbmV3RmlsZW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3RhcnQgPCBmaWxlbmFtZS5sZW5ndGgoKSkKLQkJewotCQkJaW50IGluZGV4ID0gZmlsZW5hbWUuaW5kZXhPZigiJTVDIiwgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQl7Ci0JCQkJLy9pbmRleCA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQkJCW5ld0ZpbGVuYW1lID0gZmlsZW5hbWUudHJpbSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbmV3RmlsZW5hbWUgKz0gZmlsZW5hbWUuc3Vic3RyaW5nKHN0YXJ0LCBpbmRleCk7Ci0JCQluZXdGaWxlbmFtZSArPSBVTkNfU0VQQVJBVE9SOwotCQkJc3RhcnQgPSBpbmRleCArIDM7Ci0JCX0KLQotCQluZXdGaWxlbmFtZSA9IG5ld0ZpbGVuYW1lLnRyaW0oKTsKLQotCQkvLyBhbHNvIGlmIGZpbGUgc2VwYXJhdG9yIGVxdWFscyB1bmMgc2VwYXJhdG9yLCByZW1vdmUgYW55IFdpbmRvd3MKLQkJLy8gc3BlY2lmaWMgIlwiCi0JCVN0cmluZyB3aW5kb3dzRmlsZVNlcGFyYXRvciA9ICJcXCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFGaWxlLnNlcGFyYXRvci5lcXVhbHMod2luZG93c0ZpbGVTZXBhcmF0b3IpCi0JCQkmJiBGaWxlLnNlcGFyYXRvci5lcXVhbHMoVU5DX1NFUEFSQVRPUikpCi0JCXsKLQkJCS8vIG9uIFVuaXgKLQkJCW5ld0ZpbGVuYW1lID0KLQkJCQluZXdGaWxlbmFtZS5yZXBsYWNlKAotCQkJCQl3aW5kb3dzRmlsZVNlcGFyYXRvci5jaGFyQXQoMCksCi0JCQkJCVVOQ19TRVBBUkFUT1IuY2hhckF0KDApKTsKLQkJfQotCQlyZXR1cm4gKG5ld0ZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGZpbGUgbmFtZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCSAqIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3VmZml4LiAgQW4gZXhhbXBsZSBvZiBhIAotCSAqIHN1ZmZpeCBpcyAiLmRhdCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBWZWN0b3IgZ2V0RmlsZUxpc3QoU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIHN1ZmZpeCkKLQl7Ci0JCWlmIChkaXJlY3Rvcnkuc3RhcnRzV2l0aCgiaHR0cCIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIHJlbW90ZSBkaXJlY3RvcnksIHVzZSB0aGlzIGluc3RlYWQKLQkJCXJldHVybiAoZ2V0RmlsZUxpc3RGcm9tUmVtb3RlKGRpcmVjdG9yeSwgc3VmZml4KSk7Ci0JCX0KLQotCQlTdHJpbmcgdGVtcERpciA9IFVOQ1V0aWwuY29udmVydEZpbGVuYW1lKGRpcmVjdG9yeSk7Ci0JCUZpbGUgZG9jdW1lbnREaXJlY3RvcnkgPSBuZXcgRmlsZShVTkNVdGlsLmNvbnZlcnRGaWxlU3BhY2luZyh0ZW1wRGlyKSk7Ci0JCVN0cmluZ1tdIGZpbGVOYW1lTGlzdCA9IGRvY3VtZW50RGlyZWN0b3J5Lmxpc3QoKTsKLQotCQkvLyBub3cgcGFyc2UgYW5kIG9ubHkgdGFrZSB0aG9zZSB0aGF0IGVuZCB3aXRoIHRoZSBwcm9wZXIgc3VmZml4Ci0JCVZlY3RvciBmaW5hbExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZU5hbWVMaXN0Lmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlpZiAoZmlsZU5hbWVMaXN0W2ldLmVuZHNXaXRoKHN1ZmZpeCkpCi0JCQl7Ci0JCQkJZmluYWxMaXN0LmFkZEVsZW1lbnQoZmlsZU5hbWVMaXN0W2ldKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoZmluYWxMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGFwcGxpY2FibGUgZGVmYXVsdCBydXAgZmlsZXMgZnJvbSByZW1vdGUgZGlyZWN0b3J5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIFZlY3RvciBnZXRGaWxlTGlzdEZyb21SZW1vdGUoU3RyaW5nIGRpcmVjdG9yeSwgU3RyaW5nIHN1ZmZpeCkKLQl7Ci0JCVZlY3RvciBmaWxlbmFtZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXRyeQotCQl7Ci0JCQkvLyBnZXQgdGhlIGxpc3RpbmcgdXNpbmcgYSBVUkwKLQkJCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKGRpcmVjdG9yeSk7Ci0JCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IHJlbW90ZVVybC5vcGVuU3RyZWFtKCk7Ci0JCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IGM7Ci0JCQl3aGlsZSAoKGMgPSBpblN0cmVhbS5yZWFkKCkpICE9IC0xKQotCQkJewotCQkJCXJlc3VsdC5hcHBlbmQoKGNoYXIpIGMpOwotCQkJfQotCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQkJLy8gY29udmVydCBzdHJpbmcgdG8gdXBwZXIgY2FzZSB0byBoYW5kbGUgbXVsdGlwbGUgc2VydmVyIHR5cGVzIHN1Y2ggYXMgQXBhY2hlCi0JCQlTdHJpbmcgZGlyZWN0b3J5UmVzdWx0ID0gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiaHJlZiIsICJIUkVGIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjwvYSIsICI8L0EiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPHR0PiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlkaXJlY3RvcnlSZXN1bHQgPSBkaXJlY3RvcnlSZXN1bHQucmVwbGFjZUFsbCgiPC90dD4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjxUVD4iLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZGlyZWN0b3J5UmVzdWx0ID0gZGlyZWN0b3J5UmVzdWx0LnJlcGxhY2VBbGwoIjwvVFQ+IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJLy8gcGFyc2UgdGhlIGNvbnRlbnQKLQkJCS8vU3RyaW5nVG9rZW5pemVyIGxpbmVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKCByZXN1bHQudG9TdHJpbmcoKSApOwotCQkJU3RyaW5nVG9rZW5pemVyIGxpbmVUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRpcmVjdG9yeVJlc3VsdCk7Ci0JCQlWZWN0b3IgbGluZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCQl0cnkKLQkJCXsKLQkJCQl3aGlsZSAodHJ1ZSkKLQkJCQl7Ci0JCQkJCWxpbmVUb2tlbml6ZXIubmV4dFRva2VuKCJSRUYiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlsaW5lVG9rZW5pemVyLm5leHRUb2tlbigiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgbGluZSA9IGxpbmVUb2tlbml6ZXIubmV4dFRva2VuKCJcIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJLy8gc3RyaXAgb3V0ICI8L0EiOyBuZWVkZWQgdGhpcyBiZWNhdXNlIFN0cmluZ1Rva2VuaXplcgotCQkJCQkvLyBoYXMgcHJvYmxlbXMgcGFyc2luZyBmaWxlbmFtZXMgdGhhdCBiZWluZyB3aXRoICJBIgotCQkJCQlpbnQgaW5kZXggPSBsaW5lLmluZGV4T2YoIjwvQSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbmRleCAhPSAtMSAmJiBpbmRleCAhPSAwKQotCQkJCQl7Ci0JCQkJCQlTdHJpbmcgZmlsZW5hbWUgPSBsaW5lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JCQkJCQlsaW5lcy5hZGRFbGVtZW50KGZpbGVuYW1lKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWxpbmVzLmFkZEVsZW1lbnQobGluZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBuZSkKLQkJCXsKLQkJCQkvLyBkbyBub3RoaW5nLCBlbmQgb2YgY29udGVudAotCQkJfQotCi0JCQkvLyBwYXJzZSBlYWNoIGxpbmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyBpKyspCi0JCQl7Ci0JCQkJU3RyaW5nIGxpbmUgPSAoU3RyaW5nKSBsaW5lcy5lbGVtZW50QXQoaSk7Ci0KLQkJCQlpZiAobGluZS5lbmRzV2l0aChzdWZmaXgpKQotCQkJCXsKLQkJCQkJLy8gd2Ugd2FudCB0aGlzCi0JCQkJCWZpbGVuYW1lcy5hZGRFbGVtZW50KGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpCi0JCXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIChmaWxlbmFtZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDViNDEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS5zc2UubW9kZWwuc3RydWN0dXJlZGJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGQ4OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIFNlcnZpY2VzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5BY3RpdmF0b3IKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLAotIG9yZy5lY2xpcHNlLmVwZi51bWEKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OTU0MTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OGJjNWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbi1wb2ludAotICAgICAgICAgaWQ9InNlcnZpY2VQcm92aWRlcnMiCi0gICAgICAgICBuYW1lPSJFUEYgU2VydmljZXMiCi0gICAgICAgICBzY2hlbWE9InNjaGVtYS9zZXJ2aWNlUHJvdmlkZXJzLmV4c2QiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc2NoZW1hL3NlcnZpY2VQcm92aWRlcnMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zY2hlbWEvc2VydmljZVByb3ZpZGVycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjhiNjk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zY2hlbWEvc2VydmljZVByb3ZpZGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcyI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzIiBpZD0ic2VydmljZVByb3ZpZGVycyIgbmFtZT0iRVBGIFNlcnZpY2UgUHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEV4dGVuc2lvbiBwb2ludCBmb3IgY29udHJpYnV0aW5nIHNlcnZpY2VzIGxpa2UgYWNjZXNzIGNvbnRyb2xsZXIsIGZpbGUgbWFuYWdlciwgbGlicmFyeSBwZXJzaXN0ZXIuLi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYWNjZXNzQ29udHJvbGxlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ibGlicmFyeVBlcnNpc3RlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWxlTWFuYWdlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYWNjZXNzQ29udHJvbGxlciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0iY2xhc3MiLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUFjY2Vzc0NvbnRyb2xsZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaWJyYXJ5UGVyc2lzdGVyIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IGxhYmVsQXR0cmlidXRlPSJ0eXBlIi8+Ci0gICAgICAgICA8L2FwcEluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsZU1hbmFnZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy5JRmlsZU1hbmFnZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjEKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklBY2Nlc3NDb250cm9sbGVyCi1vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUZpbGVNYW5hZ2VyCi1vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMuSUxpYnJhcnlQZXJzaXN0ZXIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0FjdGl2YXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzkyOWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFjdGl2YXRvcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JQWNjZXNzQ29udHJvbGxlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUFjY2Vzc0NvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1NTgxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JQWNjZXNzQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLS8qKgotICogQ29udHJvbHMgYWNjZXNzIHRvIGxpYnJhcnkgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUgLSBPY3QgOSwgMjAwNgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY2Nlc3NDb250cm9sbGVyIHsKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGNhbGxlciBjYW4gbW9kaWZ5IHRoZSBnaXZlbiBFT2JqZWN0cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdHMgY29sbGVjdGlvbiBvZiB0aGUgRU9iamVjdHMgdG8gY2hlY2sKLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgY2FsbGVyIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJU3RhdHVzIGNoZWNrTW9kaWZ5KENvbGxlY3Rpb248RU9iamVjdD4gZU9iamVjdHMsIE9iamVjdCBjb250ZXh0KTsKLQkKLQlJU3RhdHVzIGNoZWNrTW9kaWZ5KFJlc291cmNlW10gcmVzb3VyY2VzLCBPYmplY3QgY29udGV4dCk7Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVCYXNlZExpYnJhcnlQZXJzaXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MTliNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JRmlsZUJhc2VkTGlicmFyeVBlcnNpc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBmaWxlLWJhc2VkIE1ldGhvZCBMaWJyYXJ5IFBlcnNpc3Rlci4KLSAqIDxwPgotICogQSBNZXRob2QgTGlicmFyeSBQZXJzaXN0ZXIgaXMgcmVzcG9uc2libGUgZm9yIHBlcnNpc3RpbmcgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0gKiBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlQmFzZWRMaWJyYXJ5UGVyc2lzdGVyIGV4dGVuZHMgSUxpYnJhcnlQZXJzaXN0ZXIgewotCi0JLyoqCi0JICogR2V0cyB0aGUgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50J3MgZm9sZGVyIHJlbGF0aXZlIHRvIGl0cyBwbHVnLWluIG9yCi0JICogbGlicmFyeSBmb2xkZXIuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgcmVsYXRpdmUgcGF0aCBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb2xkZXJSZWxhdGl2ZVBhdGgoTWV0aG9kRWxlbWVudCBlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgYSBtZXRob2QgZWxlbWVudCdzIGZvbGRlci4KLQkgKiAKLQkgKiBAcGFyYW0gZSBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgYWJzb2x1dGUgcGF0aAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9sZGVyQWJzb2x1dGVQYXRoKE1ldGhvZEVsZW1lbnQgZSk7Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgZmlsZSBleHRlbnNpb24gb2YgYSBtZXRob2QgZWxlbWVudCdzIHJlc291cmNlIGZpbGUuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgZmlsZSBleHRlbnNpb24gbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbihPYmplY3QgZSk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IHN0b3JlcyBpdHMgY29udGVudCBpbiBhIGZvbGRlciBuYW1lZAotCSAqIGFmdGVyIGl0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgc3RvcmVzIGl0cyBjb250ZW50IGluIGEKLQkgKiAgICAgICAgIGZvbGRlciBuYW1lZCBhZnRlciBpdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc093bkZvbGRlcihPYmplY3QgZSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBmb2xkZXIgZm9yIHRoZSBtZXRob2QgcGx1Z2luIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBnaXZlbiBtZXRob2QgbGlicmFyeS4KLQkgKiAgCi0JICogQHBhcmFtIHBsdWdpbk5hbWUgdGhlIG5hbWUgb2YgbWV0aG9kIHBsdWdpbgotCSAqIEBwYXJhbSBsaWJyYXJ5IHRoZSBsaWJyYXJ5IHdoZXJlIHRoZSBtZXRob2QgcGx1Z2luIGZvbGRlciB3aWxsIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBtZXRob2QgcGx1Z2luIGZvbGRlcgotCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiBmb2xkZXIgY3JlYXRpb24gZmFpbGVkCi0JICovCi0JcHVibGljIEZpbGUgY3JlYXRlTWV0aG9kUGx1Z2luRm9sZGVyKFN0cmluZyBwbHVnaW5OYW1lLCBNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHN0b3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHJldHVybiB0aGUgZGVmYXVsdCBmb2xkZXIgdG8gc3RvcmUgbWV0aG9kIGNvbmZpZ3VyYXRpb24gb3IgbnVsbAotCSAqIEBleGNlcHRpb24gUnVudGltZUV4Y2VwdGlvbiBpZiBmYWlsZWQKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXREZWZhdWx0TWV0aG9kQ29uZmlndXJhdGlvbkZvbGRlcihNZXRob2RMaWJyYXJ5IGxpYnJhcnkpOwotCQotCS8qKgotCSAqIFNldHMgdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHN0b3JlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGxpYnJhcnkuCi0JICogCi0JICogQHBhcmFtIGxpYnJhcnkgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0JICogQHBhcmFtIGZpbGUgdGhlIGRlZmF1bHQgZm9sZGVyIHRvIHN0b3JlIG1ldGhvZCBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE1ldGhvZENvbmZpZ3VyYXRpb25Gb2xkZXIoTWV0aG9kTGlicmFyeSBsaWJyYXJ5LCBGaWxlIGZpbGUpOwotCQotCS8qKgotCSAqIEdldHMgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHJlc291cmNlIGZvbGRlciBvZiB0aGUgZWxlbWVudCBpbiB0aGUgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aCBvZiB0aGUgZWxlbWVudCdzIHJlc291cmNlIGZvbGRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VGb2xkZXJQYXRoKE1ldGhvZEVsZW1lbnQgZSk7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUZpbGVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JRmlsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyNTczYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9JRmlsZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgRmlsZSBNYW5hZ2VyLgotICogPHA+Ci0gKiBBIEZpbGUgTWFuYWdlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgdGhlIFhNSSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKiBtZXRob2QgZWxlbWVudHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVNYW5hZ2VyIHsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBtZXRob2QgZWxlbWVudCBwYXRoIGNhbiBiZSBtb2RpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYWJzb2x1dGUgcGF0aCB0byBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDwvY29kZT4gdGhhdCBpcyB0byBiZQotCSAqICAgICAgICAgICAgdXNlZCB0byBwYXJlbnQgYW55IGRpYWxvZ3Mgd2l0aCB0aGUgdXNlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIGlmIHRoZXJlIGlzIG5vIFVJIGNvbnRleHQgKGRlY2xhcmVkIGFzIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRvIGF2b2lkIGFueSBkaXJlY3QgcmVmZXJlbmNlcyBvbiB0aGUgU1dUIGNvbXBvbmVudCkKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGNoZWNrTW9kaWZ5KFN0cmluZyBwYXRoLCBPYmplY3QgY29udGV4dCk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kIGVsZW1lbnQgcGF0aCBjYW4gYmUgbW9kaWZpZWQuCi0JICogCi0JICogQHBhcmFtIHBhdGhzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiBwYXRoIGZyYWdtZW50cyB0aGF0IHBvaW50IHRvIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsPC9jb2RlPiB0aGF0IGlzIHRvIGJlCi0JICogICAgICAgICAgICB1c2VkIHRvIHBhcmVudCBhbnkgZGlhbG9ncyB3aXRoIHRoZSB1c2VyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAgICAgICAgaWYgdGhlcmUgaXMgbm8gVUkgY29udGV4dCAoZGVjbGFyZWQgYXMgYW4gPGNvZGU+T2JqZWN0PC9jb2RlPgotCSAqICAgICAgICAgICAgdG8gYXZvaWQgYW55IGRpcmVjdCByZWZlcmVuY2VzIG9uIHRoZSBTV1QgY29tcG9uZW50KQotCSAqIEByZXR1cm4gYSBzdGF0dXMgb2JqZWN0Ci0JICovCi0JcHVibGljIElTdGF0dXMgY2hlY2tNb2RpZnkoU3RyaW5nW10gcGF0aHMsIE9iamVjdCBjb250ZXh0KTsKLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGdpdmVuIG1ldGhvZCBlbGVtZW50IHBhdGguCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFic29sdXRlIHBhdGggdG8gYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRlbGV0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBkZWxldGUoU3RyaW5nIHBhdGgpOwotCi0JLyoqCi0JICogUmVuYW1lcyB0aGUgcGF0aCBvZiBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvbGRGaWxlCi0JICogICAgICAgICAgICBhIDxjb2RlPkZpbGU8L2NvZGU+IG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgbWV0aG9kIGVsZW1lbnQncwotCSAqICAgICAgICAgICAgb2xkIHBhdGgKLQkgKiBAcGFyYW0gbmV3RmlsZQotCSAqICAgICAgICAgICAgYSA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3QgdGhhdCBjb250YWlucyBhIG1ldGhvZCBlbGVtZW50J3MKLQkgKiAgICAgICAgICAgIG5ldyBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVuYW1pbmcgaXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbmFtZShGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSk7Ci0KLQkvKioKLQkgKiBNb3ZlcyBhIG1ldGhvZCBlbGVtZW50IHRvIGEgbmV3IGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvbGRQYXRoCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50J3Mgb2xkIHBhdGgKLQkgKiBAcGFyYW0gbmV3TmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudCdzIG5ldyBwYXRoCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW92ZSBpcyBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIGJvb2xlYW4gbW92ZShTdHJpbmcgb2xkUGF0aCwgU3RyaW5nIG5ld1BhdGgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUxpYnJhcnlQZXJzaXN0ZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcy9zcmMvb3JnL2VjbGlwc2UvZXBmL3NlcnZpY2VzL0lMaWJyYXJ5UGVyc2lzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjJlM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvSUxpYnJhcnlQZXJzaXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuc2VydmljZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIE1ldGhvZCBMaWJyYXJ5IFBlcnNpc3Rlci4KLSAqIDxwPgotICogQSBNZXRob2QgTGlicmFyeSBQZXJzaXN0ZXIgaXMgcmVzcG9uc2libGUgZm9yIHBlcnNpc3RpbmcgdGhlIG1ldGhvZCBsaWJyYXJ5Ci0gKiBjb250ZW50LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZSAtIE9jdCA5LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxpYnJhcnlQZXJzaXN0ZXIgewotCS8qKgotCSAqIFNhdmVzIGFuIGV4aXN0aW5nIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgYSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JLyoqCi0JICogU2F2ZXMgdGhlIGdpdmVuIE1ldGhvZEVsZW1lbnQgaW4gaXRzIG93biByZXNvdXJjZS4gVGhlIHNwZWNpZmllZCBNZXRob2RFbGVtZW50IG11c3QgYmUgcGFydCBvZiBhIGxpYnJhcnkKLQkgKiBhbmQgaXQgaXMgYWxsb3dlZCB0byBoYXZlIGl0cyBvd24gcmVzb3VyY2UsIHRvIHdoaWNoIG5vIG90aGVyIHJlc291cmNlIHJlZmVycy4gSW4gb3RoZXIgd29yZHMsIGNhbGxpbmcgCi0JICoge0BsaW5rICNoYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihPYmplY3QpfSBvbiB0aGUgZ2l2ZW4gTWV0aG9kRWxlbWVudCBtdXN0IHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHRocm93cyBFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoTWV0aG9kRWxlbWVudCBlKTsKLQkKLQkvKioKLQkgKiBEZWxldGVzIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoQ29sbGVjdGlvbjxNZXRob2RFbGVtZW50PiBlbGVtcyk7Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsb2NhdGlvbiBvZiBhIHJlc291cmNlIGFuZCBzYXZlcyBhbGwgdGhlIHJlc291cmNlcyB0aGF0IGhhdmUKLQkgKiBiZWVuIGNoYW5nZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGlzIGFkanVzdG1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICBhIHJlc291cmNlCi0JICovCi0JcHVibGljIHZvaWQgYWRqdXN0TG9jYXRpb24oUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JLyoqCi0JICogR2V0cyBhIGxpc3Qgb2Ygd2FybmluZ3MgYXNzb2NpYXRlZCB3aXRoIGEgcmVzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBhIGxpc3Qgb2YgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiBvYmplY3RzCi0JICovCi0JcHVibGljIExpc3QgZ2V0V2FybmluZ3MoKTsKLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGVsZW1lbnQgY2FuIGhhdmUgaXRzIG93biByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG1ldGhvZCBlbGVtZW50IGlzIG93bmVkIGJ5IGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZShPYmplY3QgZSk7Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBlbGVtZW50IGNhbiBoYXZlIGl0cyBvd24gcmVzb3VyY2UsIHdoaWNoIG5vIG90aGVyIHJlc291cmNlIHJlZmVycyB0by4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPd25SZXNvdXJjZVdpdGhvdXRSZWZlcnJlcihPYmplY3QgZSk7Ci0JCi0JLyoqCi0JICogQ2hlY2tzIGlmIDxjb2RlPmNvbnRhaW5lclJlc291cmNlPC9jb2RlPiBjb250YWlucyA8Y29kZT5yZXNvdXJjZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHBhcmFtIGNvbnRhaW5lclJlc291cmNlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGlzIGNvbnRhaW5lZCBieSA8Y29kZT5jb250YWluZXJSZXNvdXJjZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KFJlc291cmNlIHJlc291cmNlLCBSZXNvdXJjZSBjb250YWluZXJSZXNvdXJjZSk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBmYWlsIHNhZmUgbWV0aG9kIGxpYnJhcnkgcGVyc2lzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpYnJhcnkKLQkgKiBwZXJzaXN0ZXIuCi0JICogCi0JICogQHJldHVybiBhIGZhaWwgc2FmZSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZXIKLQkgKi8KLQlwdWJsaWMgRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIGdldEZhaWxTYWZlUGVyc2lzdGVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBGYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgZXh0ZW5kcwotCQkJSUxpYnJhcnlQZXJzaXN0ZXIgewotCQkvKioKLQkJICogRGlyZWN0IHBlcnNpc3RlciB0byBvdmVyd3JpdGUgZHVyaW5nIHNhdmUgd2l0aG91dCBjaGVja2luZyBvbiBjaGFuZ2UgY29uZmxpY3RzLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OU19PVkVSV1JJVEFCTEVfUkVTT1VSQ0VTID0gIk9WRVJXUklUQUJMRV9SRVNPVVJDRVMiOyAvLyROT04tTkxTLTEkCi0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gSUQuCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIElECi0JCSAqLwotCQlTdHJpbmcgZ2V0Q3VycmVudFR4SUQoKTsKLQotCQkvKioKLQkJICogQWRqdXN0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIHJlc291cmNlIGFuZCBzYXZlIGFsbCB0aGUgcmVzb3VyY2VzCi0JCSAqIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgYXMgdGhlIHJlc3VsdCBvZiB0aGlzIGFkanVzdG1lbnQuIFRoaXMgY2FsbAotCQkgKiBuZWVkcyBhIG5ldyB0cmFuc2FjdGlvbiBhbmQgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgY29tbWl0dGVkIGluIHRoaXMKLQkJICogbWV0aG9kLgotCQkgKiAKLQkJICogQHBhcmFtIHJlc291cmNlcwotCQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZXMgd2hvc2UgbG9jYXRpb25zIG5lZWQgdG8gYmUgYWRqdXN0ZWQKLQkJICovCi0JCXZvaWQgYWRqdXN0TG9jYXRpb24oQ29sbGVjdGlvbiByZXNvdXJjZXMpOwotCi0JCS8qKgotCQkgKiBDb21taXRzIHRoZSB0cmFuc2FjdGlvbi4KLQkJICovCi0JCXZvaWQgY29tbWl0KCk7Ci0KLQkJLyoqCi0JCSAqIFJvbGwgYmFja3MgdGhlIHRyYW5zYWN0aW9uLgotCQkgKi8KLQkJdm9pZCByb2xsYmFjaygpOwotCQkKLQkJLyoqCi0JCSAqIEdldHMgc2F2ZSBvcHRpb25zLgotCQkgKiAKLQkJICogQHJldHVybgotCQkgKi8KLQkJTWFwIGdldFNhdmVPcHRpb25zKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9TZXJ2aWNlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzL3NyYy9vcmcvZWNsaXBzZS9lcGYvc2VydmljZXMvU2VydmljZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4NDQzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VydmljZXMvc3JjL29yZy9lY2xpcHNlL2VwZi9zZXJ2aWNlcy9TZXJ2aWNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLkNvbW1vblBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBhY2Nlc3MgdGhlIGV4dGVuc2lvbnMgY29udHJpYnV0ZWQgdG8gZXh0ZW5zdGlvbiBwb2ludAotICogIm9yZy5lY2xpcHNlLmVwZi51bWEuc2VydmljZXMiLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VydmljZXMgewotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBlcnNpc3RlckRlc2NyaXB0b3IgewotCQlTdHJpbmcgcGx1Z2luSWQ7Ci0JCVN0cmluZyB0eXBlOwotCQlTdHJpbmcgY2xhc3NOYW1lOwotCQlib29sZWFuIGlzRGVmYXVsdDsKLQkJaW50IHZlcnNpb247Ci0JCUlMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlcjsKLQl9Ci0JCi0JLyoqCi0JICogUGVyc2lzdGVuY2UgdHlwZSBmb3IgWE1JLWZpbGUtYmFzZWQgbGlicmFyeQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSV9QRVJTSVNURU5DRV9UWVBFID0gInhtaSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG5hbWVzcGFjZSA9IEFjdGl2YXRvci5QTFVHSU5fSUQ7IAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBleHRlbnNpb25Qb2ludE5hbWUgPSAic2VydmljZVByb3ZpZGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIElBY2Nlc3NDb250cm9sbGVyIGFjY2Vzc0NvbnRyb2xsZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgSUZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyOwotCXByaXZhdGUgc3RhdGljIExpc3Q8UGVyc2lzdGVyRGVzY3JpcHRvcj4gcGVyc2lzdGVyRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PFBlcnNpc3RlckRlc2NyaXB0b3I+KCk7CQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFBlcnNpc3RlckRlc2NyaXB0b3I+IHR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRQZXJzaXN0ZW5jZVR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBPYmplY3QgZ2V0U2VydmljZShTdHJpbmcgc2VydmljZU5hbWUpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQobmFtZXNwYWNlLCBleHRlbnNpb25Qb2ludE5hbWUpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotCQkJaW50IHZlcnNpb24gPSAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQlpZihzZXJ2aWNlTmFtZS5lcXVhbHMoY29uZmlnRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpbnQgb3RoZXJWZXJzaW9uID0gcGFyc2VWZXJzaW9uKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZihvdGhlclZlcnNpb24gPiB2ZXJzaW9uKSB7Ci0JCQkJCQkJY2xhc3NOYW1lID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCQkJCXZlcnNpb24gPSBvdGhlclZlcnNpb247Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBidW5kbGUubG9hZENsYXNzKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgcGFyc2VWZXJzaW9uKFN0cmluZyBzdHIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHN0cik7Ci0JCX0KLQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAwOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUGVyc2lzdGVyRGVzY3JpcHRvcj4gZ2V0VHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAoKSB7Ci0JCU1hcDxTdHJpbmcsIFBlcnNpc3RlckRlc2NyaXB0b3I+IHR5cGVUb1BlcnNpc3RlckRlc2NyaXB0b3JNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBlcnNpc3RlckRlc2NyaXB0b3I+KCk7Ci0JCVN0cmluZyBzZXJ2aWNlTmFtZSA9ICJsaWJyYXJ5UGVyc2lzdGVyIjsgLy8kTk9OLU5MUy0xJAotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChuYW1lc3BhY2UsIGV4dGVuc2lvblBvaW50TmFtZSk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCUlFeHRlbnNpb24gZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBleHRlbnNpb24uZ2V0TmFtZXNwYWNlSWRlbnRpZmllcigpOwotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsZW1lbnRzID0gZXh0ZW5zaW9uCi0JCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdFbGVtZW50cy5sZW5ndGg7IGorKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCA9IGNvbmZpZ0VsZW1lbnRzW2pdOwotCQkJCQlpZihzZXJ2aWNlTmFtZS5lcXVhbHMoY29uZmlnRWxlbWVudC5nZXROYW1lKCkpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVBlcnNpc3RlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBQZXJzaXN0ZXJEZXNjcmlwdG9yKCk7Ci0JCQkJCQkJZGVzY3JpcHRvci5wbHVnaW5JZCA9IHBsdWdpbklkOwotCQkJCQkJCWRlc2NyaXB0b3IudHlwZSA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCi0JCQkJCQkJZGVzY3JpcHRvci5jbGFzc05hbWUgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWRlc2NyaXB0b3IuaXNEZWZhdWx0ID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImRlZmF1bHQiKSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkJCi0JCQkJCQkJZGVzY3JpcHRvci52ZXJzaW9uID0gcGFyc2VWZXJzaW9uKGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKCJ2ZXJzaW9uIikpOyAvLyROT04tTkxTLTEkCQkJCQkJCQotCQkJCQkJCXBlcnNpc3RlckRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQkJCQlpZihkZXNjcmlwdG9yLnR5cGUgIT0gbnVsbCkgewotCQkJCQkJCQlQZXJzaXN0ZXJEZXNjcmlwdG9yIGRlc2MgPSB0eXBlVG9QZXJzaXN0ZXJEZXNjcmlwdG9yTWFwLmdldChkZXNjcmlwdG9yLnR5cGUpOwotCQkJCQkJCQlpZihkZXNjICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmKGRlc2MudmVyc2lvbiA8IGRlc2NyaXB0b3IudmVyc2lvbikgewotCQkJCQkJCQkJCXR5cGVUb1BlcnNpc3RlckRlc2NyaXB0b3JNYXAucHV0KGRlc2NyaXB0b3IudHlwZSwgZGVzY3JpcHRvcik7Ci0JCQkJCQkJCQkJaWYoZGVzY3JpcHRvci5pc0RlZmF1bHQpIHsKLQkJCQkJCQkJCQkJZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9IGRlc2NyaXB0b3IudHlwZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZWxzZSBpZihkZXNjLmlzRGVmYXVsdCkgewotCQkJCQkJCQkJCQlkZWZhdWx0UGVyc2lzdGVuY2VUeXBlID0gbnVsbDsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQl0eXBlVG9QZXJzaXN0ZXJEZXNjcmlwdG9yTWFwLnB1dChkZXNjcmlwdG9yLnR5cGUsIGRlc2NyaXB0b3IpOwotCQkJCQkJCQkJaWYoZGVzY3JpcHRvci5pc0RlZmF1bHQpIHsKLQkJCQkJCQkJCQlkZWZhdWx0UGVyc2lzdGVuY2VUeXBlID0gZGVzY3JpcHRvci50eXBlOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiB0eXBlVG9QZXJzaXN0ZXJEZXNjcmlwdG9yTWFwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElBY2Nlc3NDb250cm9sbGVyIGdldEFjY2Vzc0NvbnRyb2xsZXIoKSB7Ci0JCWlmKGFjY2Vzc0NvbnRyb2xsZXIgPT0gbnVsbCkgewotCQkJYWNjZXNzQ29udHJvbGxlciA9IChJQWNjZXNzQ29udHJvbGxlcikgZ2V0U2VydmljZSgiYWNjZXNzQ29udHJvbGxlciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGFjY2Vzc0NvbnRyb2xsZXI7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgdGhlIGxpYnJhcnkgcGVyc2lzdGVyIG9mIHRoZSBnaXZlbiB0eXBlCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJTGlicmFyeVBlcnNpc3RlciBnZXRMaWJyYXJ5UGVyc2lzdGVyKFN0cmluZyB0eXBlKSB7Ci0JCWlmKHR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwID09IG51bGwpIHsKLQkJCXR5cGVUb0xpYnJhcnlQZXJzaXN0ZXJEZXNjcmlwdG9yTWFwID0gZ2V0VHlwZVRvTGlicmFyeVBlcnNpc3RlckRlc2NyaXB0b3JNYXAoKTsKLQkJfQotCQlQZXJzaXN0ZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSB0eXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcC5nZXQodHlwZSk7Ci0JCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJaWYoZGVzY3JpcHRvci5wZXJzaXN0ZXIgPT0gbnVsbCkgewotCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZGVzY3JpcHRvci5wbHVnaW5JZCk7Ci0JCQkJdHJ5IHsKLQkJCQkJZGVzY3JpcHRvci5wZXJzaXN0ZXIgPSAoSUxpYnJhcnlQZXJzaXN0ZXIpIGJ1bmRsZS5sb2FkQ2xhc3MoZGVzY3JpcHRvci5jbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZGVzY3JpcHRvci5wZXJzaXN0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUxpYnJhcnlQZXJzaXN0ZXIgZ2V0RGVmYXVsdExpYnJhcnlQZXJzaXN0ZXIoKSB7Ci0JCXJldHVybiBnZXRMaWJyYXJ5UGVyc2lzdGVyKGdldERlZmF1bHRMaWJyYXJ5UGVyc2lzdGVuY2VUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXREZWZhdWx0TGlicmFyeVBlcnNpc3RlbmNlVHlwZSgpIHsKLQkJaWYoZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlnZXRUeXBlVG9MaWJyYXJ5UGVyc2lzdGVyRGVzY3JpcHRvck1hcCgpOwotCQkJaWYoZGVmYXVsdFBlcnNpc3RlbmNlVHlwZSA9PSBudWxsICYmIGdldExpYnJhcnlQZXJzaXN0ZXIoWE1JX1BFUlNJU1RFTkNFX1RZUEUpICE9IG51bGwpIHsKLQkJCQkvLyBubyBwZXJzaXN0ZXIgaXMgc2V0IGFzIGRlZmF1bHQsIGNob29zZSBYTUkgYXMgZGVmYXVsdCBwZXJzaXN0ZW5jZSB0eXBlCi0JCQkJLy8KLQkJCQlkZWZhdWx0UGVyc2lzdGVuY2VUeXBlID0gWE1JX1BFUlNJU1RFTkNFX1RZUEU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRQZXJzaXN0ZW5jZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsZU1hbmFnZXIgZ2V0RmlsZU1hbmFnZXIoKSB7Ci0JCWlmKGZpbGVNYW5hZ2VyID09IG51bGwpIHsKLQkJCWZpbGVNYW5hZ2VyID0gKElGaWxlTWFuYWdlcikgZ2V0U2VydmljZSgiZmlsZU1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmaWxlTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMTFlNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVpLmludHJvPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjY4NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI0ZyaSBEZWMgMDEgMTY6MDI6NDEgUFNUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZDNiOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51aS5pbnRybzsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UudWkuaW50cm8KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlYjg1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGNzcy8sXAotICAgICAgICAgICAgICAgaGVscC8sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIGludHJvQ29udGVudC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB3ZWxjb21lLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9jb25mLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvY29uZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTI1Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YjViOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qCi0gKiBmaXJzdHN0ZXBzLmNzcyBpcyBhIHRlbXBsYXRlIGZvciB0aGUgZ3JvdXAgc3BlY2lmaWMgY3NzIHNldHRpbmdzCi0gKi8KLSAKLS8qCi0gKiBiYWNrZ3JvdW5kIHdhdGVybWFyayAtIGdyb3VwIHNwZWNpZmljCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9maXJzdGVwc193dHIuanBnKTsKLX0KLQotLyoKLSAqIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAtIFRoaXMgaXMgZ3JvdXAgc3BlY2lmaWMKLSAqLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3N0ZXBzIGltZywgI25hdmlnYXRpb24tbGlua3MgYSNzdGVwczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmKTsgfQotCi0vKiAKLSAqIFNldCB1cCB0aGUgT3ZlcnZpZXcgbGlua3MgdG8gYmUgZGlzcGxheWVkIGluIHR3byBjb2x1bW5zCi0gKiB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLgotICovCi0KLSNzdGVwcy1saW5rcyB7CXRleHQtYWxpZ24gOiBsZWZ0Owl3aWR0aCA6IDc2MHB4OwkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JbWFyZ2luIDogMHB4IGF1dG87fQotI3N0ZXBzLWxpbmtzIGEgeyAJd2lkdGggOiAzNzBweDsJdGV4dC1hbGlnbiA6IGxlZnQ7IAltYXJnaW4tbGVmdCA6IDVweDsJbWFyZ2luLXJpZ2h0IDogNXB4OwltYXJnaW4tdG9wIDogNXB4OwltYXJnaW4tYm90dG9tIDogLTIwcHg7CXZlcnRpY2FsLWFsaWduIDogdG9wO30KLSNzdGVwcy1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfQotI3N0ZXBzLWxpbmtzIGEgaW1nIHsJaGVpZ2h0IDogNTdweDsJd2lkdGggOiA1N3B4Owl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTt9CQotI3N0ZXBzLWxpbmtzIGEgLmxpbmstbGFiZWwgewlkaXNwbGF5IDogYmxvY2s7CXdpZHRoIDogMzAwcHg7CXBvc2l0aW9uIDogcmVsYXRpdmU7CXRvcCA6IC01MHB4OwlsZWZ0IDogNjBweDt9Ci0jc3RlcHMtbGlua3MgYSBwIC50ZXh0IHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNDVweDsJbGVmdCA6IDUzcHg7fQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQKLSAgIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zICovCi0jc3RlcHMtbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0KLSNzdGVwcy1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9Ci0jc3RlcHMtbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSNzdGVwcy1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9Ci0KLWEjYmFzaWNzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZik7IH0KLWEjYmFzaWNzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nob3Zfb2JqLmdpZik7IH0KLQotYSN0ZWFtIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmKTsgfQotYSN0ZWFtOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cGhvdl9vYmouZ2lmKTsgfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZmlyc3RzdGVwcy9maXJzdHN0ZXBzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5N2ZmMzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0ZXBzLmxheW91dC5uY29sdW1ucyA9IDIKLXN0ZXBzLnBhZ2UtY29udGVudC5sYXlvdXQudnNwYWNpbmcgPSA0MAotCi1zdGVwcy5wYWdlLWNvbnRlbnQuc3RlcHMtbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotc3RlcHMucGFnZS1jb250ZW50LnN0ZXBzLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDM1Ci0KLXN0ZXBzLnN1YnRpdGxlLWlkID0gc3RlcHMvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKLXN0ZXBzLmRlc2NyaXB0aW9uLWlkID0gc3RlcHMvcGFnZS1jb250ZW50L3BhZ2UtZGVzY3JpcHRpb24KLQotc3RlcHMucGFnZS1jb250ZW50LnN0ZXBzLWxpbmtzLmVwZi1zdGVwcy10d28ubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5lcGYtc3RlcHMtZm91ci5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZgotc3RlcHMucGFnZS1jb250ZW50LnN0ZXBzLWxpbmtzLmVwZi1zdGVwcy1vbmUubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKLXN0ZXBzLnBhZ2UtY29udGVudC5zdGVwcy1saW5rcy5lcGYtc3RlcHMtdGhyZWUubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKLSNuZXdzLm5ldy1hbmQtbm90ZXdvcnRoeS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYKLSNuZXdzLm1pZ3JhdGlvbi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmCi0jbmV3cy51cGRhdGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKLSNuZXdzLmVjbGlwc2UubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS8xeDF0cmFucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlLzF4MXRyYW5zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhZjQzOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlLzF4MXRyYW5zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFjYWRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmRjdXJ2ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmRjdXJ2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjU3ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZGN1cnZlMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOGIwY2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kY3VydmUyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYnJhbmRtYXJrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvYnJhbmRtYXJrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZDlkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2JyYW5kbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2NvbnRlbnRfYmFja2dyb3VuZC5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2NvbnRlbnRfYmFja2dyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwM2M2ZDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9jb250ZW50X2JhY2tncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9maXJzdGVwc193dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9maXJzdGVwc193dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQzZDIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvZmlyc3RlcHNfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvaGFuZGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvaGFuZGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhODg5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL2hhbmRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL25ld19iYWNrZ3JvdW5kY3VydmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfYmFja2dyb3VuZGN1cnZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0NDBhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL25ld19iYWNrZ3JvdW5kY3VydmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfY29udGVudF9iYWNrZ3JvdW5kLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvbmV3X2NvbnRlbnRfYmFja2dyb3VuZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxM2U1NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9uZXdfY29udGVudF9iYWNrZ3JvdW5kLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvb3ZlcnZpZXdfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvb3ZlcnZpZXdfd3RyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzZTQ4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL292ZXJ2aWV3X3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3BhZ2Vfd29yZG1hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9wYWdlX3dvcmRtYXJrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZTU0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3BhZ2Vfd29yZG1hcmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yYXRpb25hbGFkdmFudGFnZS5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3JhdGlvbmFsYWR2YW50YWdlLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzMjVkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3JhdGlvbmFsYWR2YW50YWdlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvcmV0dXNlcl93dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yZXR1c2VyX3d0ci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTQyZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9yZXR1c2VyX3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NhbXBsZXNfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2FtcGxlc193dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU3MDNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2FtcGxlc193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24xLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NzUxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24xLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTE0OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb24zLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQyNGU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2VjdGlvbjMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS9zZWN0aW9uNC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb240LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4ZDRhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3NlY3Rpb240LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvdHV0b3JpYWxzX3d0ci5qcGcgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3R1dG9yaWFsc193dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzRjN2MwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2UvdHV0b3JpYWxzX3d0ci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2NvbnRlbnRwYWdlL3dlYnJzcmNfd3RyLmpwZyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2VicnNyY193dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDAyZjJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2VicnNyY193dHIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93aGF0c25ld193dHIuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93aGF0c25ld193dHIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmE0MmRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd2hhdHNuZXdfd3RyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvY29udGVudHBhZ2Uvd29yZG1hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93b3JkbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGU1NDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9jb250ZW50cGFnZS93b3JkbWFyay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2JhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM4MWNiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZGI2M2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWU1OGIxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0NTI5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9mb3J3YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGE0ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9mb3J3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvaG9tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2hvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTYwZjhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvaG9tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlNWMwZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTljZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM5ZGY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3BzcGJyd3NlLmpiZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcHNwYnJ3c2UuamJmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE1YTg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcHNwYnJ3c2UuamJmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTQzODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxMmU3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3JldHVzZXI3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2IzMWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGVkMWQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxOTEyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM3Mi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4ZDYxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMWFkNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODFjMmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMmM2Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93YjQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljOTRjOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ODZlZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmNmYzIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmZiOWJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4c2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRhODQzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3doYXRzbmV3NDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc3Mi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YmY2ZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvYmFjay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2JhY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGQwOTI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvYmFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2ZvcndhcmQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlNThiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9vdmVydmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL292ZXJ2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjN2IwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL292ZXJ2aWV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk5N2IyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3Jlc3RvcmVfd2VsY29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3NhbXBsZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC9zYW1wbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmM2NhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2R0b29sL3NhbXBsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC90dXRvcmlhbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC90dXRvcmlhbHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzgyNmE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvdHV0b3JpYWxzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZHRvb2wvd2hhdHNuZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC93aGF0c25ldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTZjOTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9kdG9vbC93aGF0c25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2JhY2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9iYWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMDkyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2JhY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTFhZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJiNGU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5YTgxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9mb3J3YXJkLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZm9yd2FyZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTU4YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9mb3J3YXJkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvaG9tZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2hvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTAxZDEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvaG9tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmU2MjlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YmU3NjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2QyMWUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThkOWI0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXN0b3JlX3dlbGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXN0b3JlX3dlbGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzM2YmNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmVzdG9yZV93ZWxjb21lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNlZTM2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3JldHVzZXI0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ODUxNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDhzZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDhhYmFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvcmV0dXNlcjcyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk1ODg0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjU5MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDc1ZDkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmZjM1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFscy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOGQ3ZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNmMxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OHNlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNTNlMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlkYjg4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MmM0NDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzE2LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzE2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4NTAwNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmMxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NzJhNTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDhzZWwuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNjYzk4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzQ4c2VsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzcyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5OTdkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM3Mi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDIyMzI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDBkN2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzQ4LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OHNlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDhzZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTlmYTBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2hhdHNuZXc0OHNlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NzIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzcyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwMDkzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9hZC10LXBvcnRhbGFwcGxpY2F0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYzk0YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9hZC10LXBvcnRhbGFwcGxpY2F0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2FkLXQtcG9ydGFsYXBwbGljYXRpb25ob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzAyZDIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvYWQtdC1wb3J0YWxhcHBsaWNhdGlvbmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxMzJhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2NvbW11bml0eV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjJhNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTU2YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1jb25maWdwdWJsaXNoaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2hob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI4NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2hob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2RhNDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZGhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1tZXRob2Rob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ2OTFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZGhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI2OTkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0YzljYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4NTFkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDgxYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcnVwb3Zob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91ci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5NWM3Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXRvdXJob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91cmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MTk3MDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91cmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1zdGVwcy1vbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZmZTgyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1zdGVwcy1vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25laG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLXN0ZXBzLW9uZWhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzRmNzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtc3RlcHMtb25laG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEwYThkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZWhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZWhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOThiMzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGZfcmVzb3VyY2Vob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mZWF0dXJlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mZWF0dXJlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjRmZDQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZmVhdHVyZXNob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmZGYwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZlYXR1cmVzaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGMzMjk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2FkdmFwcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZGViOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2E1NmMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWJob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZGV2d2ViaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUyODQxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNTZjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ZpcnN0c3RlcHNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjg0MTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFiODUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2hlbHAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscGhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiYTI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTI1NDNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWJob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNkZGNhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9pbXBvcnR3ZWJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTU2YzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYmhvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9uZXd3ZWJob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTI4NDE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9vdmVydmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTJmOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXdob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfb3ZlcnZpZXdob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA2YmQxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3aG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3JpY2hyZXBvcnRzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2YTU0Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0c2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0c2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYTVhZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfcmljaHJlcG9ydHNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDNjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9zYW1wbGVzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMDMwYmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlc2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyN2Q1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3R1dG9yaWFsc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTcxZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzdlYjkzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3dlYi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWJob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4NmRkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWJob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2hhdHNuZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdhOGU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3aG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3aG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNzMxNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93aGF0c25ld2hvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfc2FtcGxlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Zjc2MmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXNob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTA5N2E2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV9zYW1wbGVzaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFscy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjA0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHNob3YuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTJhMWU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwMGQ1MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTlmNTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGxldF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlhOTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWFwcGxldF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhYXBwbGV0aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRhM2RiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFhcHBsZXRob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhZGV2X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTI2YTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9qYXZhZGV2X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2phdmFkZXZob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldmhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmI0N2QzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvamF2YWRldmhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyZmU4OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L21pZ3JhdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZWhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzRlMmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YjgxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5M2U2M2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljMGIyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzA1NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHNob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2hlbHAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZiNDYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwaG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyNGY0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfaGVscGhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfbW92aWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNmOTk5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfbW92aWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllaG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9tb3ZpZWhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTU3ZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX21vdmllaG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlldy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFiYjE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXdob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3aG92LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyNzg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfb3ZlcnZpZXdob3YuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1OTg3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93ZWJob3YuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYmhvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MTk3ZGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYmhvdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiYWZiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3aG92LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ld2hvdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMGU1MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3doYXRzbmV3aG92LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGx1Z2luX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTJkMmM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGx1Z2luX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbmhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9wbHVnaW5ob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlOGNjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3BsdWdpbmhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9yY3BhcHBfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMGFiNTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9yY3BhcHBfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3JjcGFwcGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQ4MGE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcmNwYXBwaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGU1NmZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVwdXJwaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0ODFlMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmQxMDRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3ZDZiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXJlZGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zY3JpcHRfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGI3Y2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zY3JpcHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0aG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3NjcmlwdGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjcyMDNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2NyaXB0aG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3N3dGFwcF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhOWEzMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3N3dGFwcF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc3d0YXBwaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZmJiNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zd3RhcHBob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udF9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOWE5MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGQxMjE3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9tZXRoY29udGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzOWFiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbmF2dWlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aWhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTAxYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMmZmYzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3B1YmV4cGhvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFiMWEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjdkMjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udGhvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkNTdkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udGhvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jX29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyNjc0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY2hvdl9vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jaG92X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTA3OGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmJkN2Q2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwaG92X29iai5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZjgxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDhiMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc2hvdl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmEwYWNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdXBkYXRlc2hvdl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjgyNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nob3Zfb2JqLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nob3Zfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwYmU5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5ZmNmMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JhY2tncm91bmQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kX2VjbGlwc2UuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kX2VjbGlwc2UuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjlmY2YzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9lY2xpcHNlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvYmFja2dyb3VuZF9vbGQuanBnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kX29sZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMGFjZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kX29sZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFyay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZjI1ZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9icmFuZG1hcmtfZWNsaXBzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFya19lY2xpcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmMjVmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2JyYW5kbWFya19lY2xpcHNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvZG90cy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL2RvdHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI5M2VlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvcm9vdHBhZ2UvZG90cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL3N0YW5kYnlfd29yZG1hcmsuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9yb290cGFnZS9zdGFuZGJ5X3dvcmRtYXJrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3YjE1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL2dyYXBoaWNzL3Jvb3RwYWdlL3N0YW5kYnlfd29yZG1hcmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9zd3QvZm9ybV9iYW5uZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9ncmFwaGljcy9zd3QvZm9ybV9iYW5uZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjMGIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvZ3JhcGhpY3Mvc3d0L2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjA0NWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21jX3ZzX3AuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tY192c19wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjZjFjMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL21jX3ZzX3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tZXRob2RhdXRob3JpbmcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvbWV0aG9kYXV0aG9yaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDYwZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9tZXRob2RhdXRob3JpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTx0aXRsZT5NZXRob2QgQ29udGVudCBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+TWV0aG9kIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9oMz4KLTxwPk1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyByb2xlcywgdGhlIHRhc2tzIHRoYXQgdGhleSBwZXJmb3JtLCB0aGUgd29yayBwcm9kdWN0cwotICB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZCBieSB0aG9zZSB0YXNrcywgYW5kIHN1cHBvcnRpbmcgZ3VpZGFuY2UuPC9wPgotPHA+PGltZyBzcmM9Im1jLmdpZiI+PC9wPgotPHA+VGhlIGZpZ3VyZSBhYm92ZSBkZXBpY3RzIHR5cGljYWwgc291cmNlcyBmb3IgbWV0aG9kIGNvbnRlbnQsIGFzIHdlbGwgYXMgaG93Ci0gIHRoZSBtZXRob2QgY29udGVudCBpcyByZXByZXNlbnRlZCBpbiBSTUMuIE1hbnkgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhcmUgZGVzY3JpYmVkCi0gIGluIHB1YmxpY2F0aW9ucyBzdWNoIGFzIGJvb2tzLCBhcnRpY2xlcywgdHJhaW5pbmcgbWF0ZXJpYWwsIHN0YW5kYXJkcyBhbmQgcmVndWxhdGlvbnMsCi0gIGFuZCBvdGhlciBmb3JtcyBvZiBkb2N1bWVudGF0aW9uLiBUaGVzZSBzb3VyY2VzIHVzdWFsbHkgZG9jdW1lbnQgbWV0aG9kcyBieQotICBwcm92aWRpbmcgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHdheSBvZiBhY2hpZXZpbmcgYSBzcGVjaWZpYwotICBkZXZlbG9wbWVudCBnb2FsIHVuZGVyIGdlbmVyYWwgY2lyY3Vtc3RhbmNlcy4gU29tZSBleGFtcGxlcyBhcmU6IHRyYW5zZm9ybWluZwotICBhIHJlcXVpcmVtZW50cyBkb2N1bWVudCBpbnRvIGFuIGFuYWx5c2lzIG1vZGVsOyBkZWZpbmluZyBhbiBhcmNoaXRlY3R1cmFsIG1lY2hhbmlzbQotICBiYXNlZCBvbiBmdW5jdGlvbmFsIGFuZCBub24tZnVuY3Rpb25hbCByZXF1aXJlbWVudHM7IGNyZWF0aW5nIGEgcHJvamVjdCBwbGFuCi0gIGZvciBhIGRldmVsb3BtZW50IGl0ZXJhdGlvbjsgZGVmaW5pbmcgYSBxdWFsaXR5IGFzc3VyYW5jZSBwbGFuIGZvciBmdW5jdGlvbmFsCi0gIHJlcXVpcmVtZW50czsgcmVkZXNpZ25pbmcgYSBidXNpbmVzcyBvcmdhbml6YXRpb24gYmFzZWQgb24gYSBuZXcgc3RyYXRlZ2ljIGRpcmVjdGlvbiwKLSAgYW5kIHNvIG9uLjwvcD4KLTxwPlJNQyB0YWtlcyBjb250ZW50IHN1Y2ggYXMgdGhhdCBkZXNjcmliZWQgYWJvdmUsIGFuZCBzdHJ1Y3R1cmVzIGl0IGluIGEgc3BlY2lmaWMKLSAgc2NoZW1hIG9mIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlLiBUaGlzIHNjaGVtYSBzdXBwb3J0cyB0aGUKLSAgb3JnYW5pemF0aW9uIG9mIGxhcmdlIGFtb3VudHMgb2YgZGVzY3JpcHRpb25zIGZvciBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCBwcm9jZXNzZXMuCi0gIFN1Y2ggbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBkbyBub3QgaGF2ZSB0byBiZSBsaW1pdGVkIHRvIHNvZnR3YXJlIGVuZ2luZWVyaW5nLAotICBidXQgY2FuIGFsc28gY292ZXIgb3RoZXIgZGVzaWduIGFuZCBlbmdpbmVlcmluZyBkaXNjaXBsaW5lcyBzdWNoIGFzIG1lY2hhbmljYWwKLSAgZW5naW5lZXJpbmcsIGJ1c2luZXNzIHRyYW5zZm9ybWF0aW9uLCBzYWxlcyBjeWNsZXMsIGFuZCBzbyBvbi48L3A+Ci08cD4gVGhlIFJNQyBzY3JlZW4gY2FwdHVyZSBpbiB0aGUgZmlndXJlIGFib3ZlIHNob3dzIGhvdyBzdWNoIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzCi0gIGFyZSBvcmdhbml6ZWQgaW4gdHJlZSBicm93c2VycyBvbiB0aGUgbGVmdC4gVGhlc2UgdHJlZSBicm93c2Vycywgc2ltaWxhciB0bwotICBhIGxpYnJhcnksIHByb3ZpZGUgZGlmZmVyZW50IGluZGV4ZXMgb2YgdGhlIGF2YWlsYWJsZSBlbGVtZW50cyBmb3IgcmFwaWQgYWNjZXNzLgotICBUaGUgc2NyZWVuIGNhcHR1cmUgc2hvd3Mgb24gdGhlIHJpZ2h0IGFuIGV4YW1wbGUgb2YgYSB0YXNrIHByZXNlbnRhdGlvbi4gVGhpcwotICB0YXNrIHByZXNlbnRhdGlvbiBkZWZpbmVzIHRoZSB0YXNrIGluIHRlcm1zIG9mIHN0ZXBzIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQKLSAgdG8gYWNoaWV2ZSB0aGUgdGFzaydzIHB1cnBvc2UuIFlvdSBjYW4gc2VlIHRoYXQgdGhlIHRhc2sgaGFzIHZhcmlvdXMgcmVsYXRpb25zaGlwcywKLSAgc3VjaCBhcyByZWxhdGlvbnNoaXBzIHRvIHBlcmZvcm1pbmcgcm9sZXMgYXMgd2VsbCBhcyB3b3JrIHByb2R1Y3RzIHRoYXQgc2VydmUKLSAgYXMgaW5wdXRzIGFuZCBvdXRwdXRzIHRvIHRoZSB0YXNrLiBGaW5kIG91dCBtb3JlIGRldGFpbHMgb24gdGFza3MsIHJvbGUsIGFuZAotICB3b3JrIHByb2R1Y3RzIGluIHRoZSBvbmxpbmUgaGVscCA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+aGVyZTwvYT4uCi0gIEluIGFkZGl0aW9uIHRvIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMsIFJNQyBzdXBwb3J0cyB0aGUgYWRkaXRpb24gb2YKLSAgZ3VpZGFuY2UgZWxlbWVudHMuIEd1aWRhbmNlIGFyZSBzdXBwbGVtZW50YXJ5IGZyZWUtZm9ybSBkb2N1bWVudGF0aW9uIHN1Y2ggYXMKLSAgd2hpdGVwYXBlcnMsIGNvbmNlcHQgZGVzY3JpcHRpb25zLCBndWlkZWxpbmVzLCB0ZW1wbGF0ZXMsIGV4YW1wbGVzLCBhbmQgc28gb24uPC9wPgotPHA+Uk1DIHByb3ZpZGVzIHZhcmlvdXMgZm9ybS1iYXNlZCBlZGl0b3JzIHRvIGNyZWF0ZSBuZXcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMuCi0gIERvY3VtZW50IHlvdXIgdGFzaywgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIGFuZCBndWlkYW5jZSBlbGVtZW50cyB1c2luZyBpbnR1aXRpdmUKLSAgcmljaC10ZXh0IGVkaXRvcnMgdGhhdCBhbGxvdyB5b3UgdG8gY29weSBhbmQgcGFzdGUgdGV4dCBmcm9tIG90aGVyIHNvdXJjZXMgc3VjaAotICBhcyB3ZWIgcGFnZXMgb3IgZG9jdW1lbnRzLiBVc2Ugc2ltcGxlIGRpYWxvZ3MgdG8gZXN0YWJsaXNoIHJlbGF0aW9uc2hpcHMgYmV0d2VlbgotICBjb250ZW50IGVsZW1lbnRzLjwvcD4KLTxwPlJNQyBvcmdhbml6ZXMgY29udGVudCBpbiBwaHlzaWNhbCBjb250ZW50IHBhY2thZ2VzIHRoYXQgYWxsb3cgeW91IHRvIG1hbmFnZQotICB5b3VyIGNvbnRlbnQgaW4gY29uZmlndXJhYmxlIHVuaXRzLiBSTUMgYWxzbyBhbGxvd3MgeW91IHRvIGNhdGVnb3JpemUgeW91ciBjb250ZW50Ci0gIGJhc2VkIG9uIGEgc2V0IG9mIHByZWRlZmluZWQgY2F0ZWdvcmllcyAoZm9yIGV4YW1wbGUsIGNhdGVnb3JpemUgeW91ciB0YXNrcwotICBpbnRvIGRldmVsb3BtZW50IGRpc2NpcGxpbmVzLCBvciB5b3VyIHdvcmsgcHJvZHVjdHMgaW50byBkb21haW5zKSBvciBjcmVhdGUKLSAgeW91ciBvd24gY2F0ZWdvcml6YXRpb24gc2NoZW1lcyBmb3IgeW91ciBjb250ZW50IHdpdGggeW91ciBvd24gdXNlci1kZWZpbmVkCi0gIGNhdGVnb3JpZXMgdGhhdCBhbGxvdyB5b3UgdG8gaW5kZXggY29udGVudCBpbiBhbnkgd2F5IHlvdSB3YW50LjwvcD4KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gbWV0aG9kIGNvbnRlbnQgYXV0aG9yaW5nIHNlZSB0aGUgb25saW5lIGhlbHA6PC9wPgotPGRpdiBhbGlnbj0ibGVmdCI+Ci08dWw+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+TWV0aG9kCi0gICAgICBBdXRob3JpbmcgT3ZlcnZpZXc8L2E+PC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmZGM5ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPGh0bWw+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxoZWFkPgotPHRpdGxlPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+SW50cm9kdWN0aW9uIHRvIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgKEVQRikgQ29tcG9zZXI8L2gzPgotPHA+V2VsY29tZSB0byBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIChFUEYpIENvbXBvc2VyLiBFUEYgQ29tcG9zZXIgaXMgYSB0b29sIHBsYXRmb3JtIHRoYXQgZW5hYmxlcwotICBwcm9jZXNzIGVuZ2luZWVycyBhbmQgbWFuYWdlcnMgdG8gaW1wbGVtZW50LCBkZXBsb3ksIGFuZCBtYWludGFpbiBwcm9jZXNzZXMKLSAgZm9yIG9yZ2FuaXphdGlvbnMgb3IgaW5kaXZpZHVhbCBwcm9qZWN0cy4gVHlwaWNhbGx5LCB0d28ga2V5IHByb2JsZW1zIG5lZWQgdG8KLSAgYmUgYWRkcmVzc2VkIHRvIHN1Y2Nlc3NmdWxseSBkZXBsb3kgbmV3IHByb2Nlc3Nlcy48L3A+Ci08cD4gRmlyc3QsIGRldmVsb3BtZW50IHRlYW1zIG5lZWQgdG8gYmUgZWR1Y2F0ZWQgb24gdGhlIG1ldGhvZHMgYXBwbGljYWJsZSB0bwotICB0aGUgcm9sZXMgdGhhdCB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuIFNvZnR3YXJlIGRldmVsb3BlcnMgdHlwaWNhbGx5IG5lZWQKLSAgdG8KLSAgbGVhcm4KLSAgaG93Ci0gIHRvCi0gIGRvIGFuYWx5c2lzIGFuZCBkZXNpZ24sIHRlc3RlcnMgbmVlZCB0byBsZWFybiBob3cgdG8gdGVzdCBpbXBsZW1lbnRhdGlvbnMgYWdhaW5zdAotICAgcmVxdWlyZW1lbnRzLCBtYW5hZ2VycyBuZWVkIHRvIGxlYXJuIGhvdyB0byBtYW5hZ2UgdGhlIHByb2plY3Qgc2NvcGUgYW5kIGNoYW5nZSwKLQotICBhbmQgc28gb24uIFNvbWUgb3JnYW5pemF0aW9ucyBhc3N1bWUgdGhhdCBkZXZlbG9wZXJzIGltcGxpY2l0bHkga25vdyBob3cgdG8KLSAgIGRvIHN1Y2ggd29yayB3aXRob3V0IGRvY3VtZW50aW5nIHRoZWlyIG1ldGhvZHMsIGJ1dCBtYW55IG9yZ2FuaXphdGlvbnMgd2FudAotCi0gIHRvIGVzdGFibGlzaCBjb21tb24gYW5kIHJlZ3VsYXRlZCBwcmFjdGljZXMsIHRvIGRyaXZlIHNwZWNpZmljIGltcHJvdmVtZW50Ci0gIG9iamVjdGl2ZXMsICBhbmQgdG8gbWVldCBjb21wbGlhbmNlIHN0YW5kYXJkcy48L3A+Ci08cD4gU2Vjb25kLCBkZXZlbG9wbWVudCB0ZWFtcyBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRvIGFwcGx5IHRoZXNlIG1ldGhvZHMgdGhyb3VnaG91dAotICBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gVGhhdCBpcywgdGhleSBuZWVkIHRvIGRlZmluZSBvciBzZWxlY3QgYSBkZXZlbG9wbWVudAotICBwcm9jZXNzLiBGb3IKLQotICBleGFtcGxlLCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCBtZXRob2RzIGhhdmUgdG8gYmUgYXBwbGllZCBkaWZmZXJlbnRseSBpbgotICBlYXJseSAgcGhhc2VzIG9mIGEgcHJvamVjdCB3aGVyZSB0aGUgZm9jdXMgaXMgb24gZWxpY2l0YXRpb24gb2Ygc3Rha2Vob2xkZXIKLSAgbmVlZHMgYW5kCi0gIHJlcXVpcmVtZW50cyBhbmQgc2NvcGluZyBhIHZpc2lvbiwgdGhhbiBpbiBsYXRlciBwaGFzZXMgd2hlcmUgdGhlIGZvY3VzIGlzCi0gIG9uICBtYW5hZ2luZyByZXF1aXJlbWVudHMgdXBkYXRlcyBhbmQgY2hhbmdlcyBhbmQgcGVyZm9ybWluZyBpbXBhY3QgYW5hbHlzaXMKLSAgb2YKLSAgdGhlc2UgcmVxdWlyZW1lbnRzIGNoYW5nZXMuIFRlYW1zIGFsc28gbmVlZCBjbGVhciB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUKLSAgZGlmZmVyZW50ICB0YXNrcyBvZiB0aGUgbWV0aG9kcyByZWxhdGUgdG8gZWFjaCBvdGhlciwgZm9yIGV4YW1wbGUsIGhvdyB0aGUKLSAgY2hhbmdlIG1hbmFnZW1lbnQKLSAgbWV0aG9kIGltcGFjdHMgdGhlIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50IG1ldGhvZCBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZwotICAgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4gRXZlbiBzZWxmLW9yZ2FuaXppbmcgdGVhbXMgbmVlZCB0byBkZWZpbmUKLSAgYQotICBwcm9jZXNzIHRoYXQgZ2l2ZXMgYXQgbWluaW11bSBzb21lIGd1aWRhbmNlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgd2lsbCBiZQotICBzY29wZWQgIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSwgd2hlbiBtaWxlc3RvbmVzIHdpbGwgYmUgYWNoaWV2ZWQgYW5kIHZlcmlmaWVkLAotICBhbmQKLSAgc28gb24uIDwvcD4KLTxwPlRvIHRoYXQgZW5kLCBFUEYgQ29tcG9zZXIgaGFzIHR3byBtYWluIHB1cnBvc2VzOiA8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij48dWw+Ci0gIDxsaT5UbyBwcm92aWRlIGEga25vd2xlZGdlIGJhc2Ugb2YgaW50ZWxsZWN0dWFsIGNhcGl0YWwgd2hpY2ggeW91IGNhbiBicm93c2UsCi0gICAgbWFuYWdlIGFuZCBkZXBsb3kuIFRoaXMgY29udGVudCBjYW4gaW5jbHVkZSBleHRlcm5hbGx5IGRldmVsb3BlZCBjb250ZW50LAotICAgIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgY2FuIGluY2x1ZGUgeW91ciBvd24gY29udGVudCBpbmNsdWRpbmcgb2Ygd2hpdGVwYXBlcnMsCi0gICAgZ3VpZGVsaW5lcywgdGVtcGxhdGVzLCBwcmluY2lwbGVzLCBiZXN0IHByYWN0aWNlcywgaW50ZXJuYWwgcHJvY2VkdXJlcyBhbmQKLSAgICByZWd1bGF0aW9ucywgdHJhaW5pbmcgbWF0ZXJpYWwsIGFuZCBhbnkgb3RoZXIgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgeW91cgotICAgIG1ldGhvZHMuIFRoaXMga25vd2xlZGdlIGJhc2UgY2FuIHVzZWQgZm9yIHJlZmVyZW5jZSBhbmQgZWR1Y2F0aW9uLiBJdCBhbHNvCi0gICAgZm9ybXMgdGhlIGJhc2lzIGZvciBkZXZlbG9waW5nIHByb2Nlc3NlcyAodGhlIHNlY29uZCBwdXJwb3NlKS4gRVBGIENvbXBvc2VyIGlzIGRlc2lnbmVkCi0gICAgdG8gYmUgYSBjb250ZW50IG1hbmFnZW1lbnQgc3lzdGVtIHRoYXQgcHJvdmlkZXMgYSBjb21tb24gbWFuYWdlbWVudCBzdHJ1Y3R1cmUKLSAgICBhbmQgbG9vayBhbmQgZmVlbCBmb3IgYWxsIG9mIHlvdXIgY29udGVudCwgcmF0aGVyIHRoYW4gYmVpbmcgYSBkb2N1bWVudCBtYW5hZ2VtZW50Ci0gICAgc3lzdGVtIGluIHdoaWNoIHlvdSB3b3VsZCBzdG9yZSBhbmQgYWNjZXNzIGhhcmQgdG8gbWFpbnRhaW4gbGVnYWN5IGRvY3VtZW50cwotICAgIGFsbCBpbiB0aGVpciBvd24gc2hhcGVzIGFuZCBmb3JtYXRzLiBBbGwgY29udGVudCBtYW5hZ2VkIGluIEVQRiBDb21wb3NlciBjYW4gYmUgcHVibGlzaGVkCi0gICAgdG8gaHRtbCBhbmQgZGVwbG95ZWQgdG8gV2ViIHNlcnZlcnMgZm9yIGRpc3RyaWJ1dGVkIHVzYWdlLjxicj4KLSAgPC9saT4KLSAgPGxpPlRvIHByb3ZpZGUgcHJvY2VzcyBlbmdpbmVlcmluZyBjYXBhYmlsaXRpZXMgYnkgc3VwcG9ydGluZyBwcm9jZXNzIGVuZ2luZWVycwotICAgIGFuZCBwcm9qZWN0IG1hbmFnZXJzIGluIHNlbGVjdGluZywgdGFpbG9yaW5nLCBhbmQgcmFwaWRseSBhc3NlbWJsaW5nIHByb2Nlc3NlcwotICAgIGZvciB0aGVpciBjb25jcmV0ZSBkZXZlbG9wbWVudCBwcm9qZWN0cy4gRVBGIENvbXBvc2VyIHByb3ZpZGVzIGNhdGFsb2dzIG9mIHByZS1kZWZpbmVkCi0gICAgcHJvY2Vzc2VzIGZvciB0eXBpY2FsIHByb2plY3Qgc2l0dWF0aW9ucyB0aGF0IGNhbiBiZSBhZGFwdGVkIHRvIGluZGl2aWR1YWwKLSAgICBuZWVkcy4gSXQgYWxzbyBwcm92aWRlcyBwcm9jZXNzIGJ1aWxkaW5nIGJsb2NrcywgY2FsbGVkIGNhcGFiaWxpdHkgcGF0dGVybnMsCi0gICAgdGhhdCByZXByZXNlbnQgYmVzdCBkZXZlbG9wbWVudCBwcmFjdGljZXMgZm9yIHNwZWNpZmljIGRpc2NpcGxpbmVzLCB0ZWNobm9sb2dpZXMsCi0gICAgb3IgbWFuYWdlbWVudCBzdHlsZXMuIFRoZXNlIGJ1aWxkaW5nIGJsb2NrcyBmb3JtIGEgdG9vbGtpdCBmb3IgcXVpY2sgYXNzZW1ibHkKLSAgICBvZiBwcm9jZXNzZXMgYmFzZWQgb24gcHJvamVjdC1zcGVjaWZpYyBuZWVkcy4gRVBGIENvbXBvc2VyIGFsc28gYWxsb3dzIHlvdSB0byBzZXQgdXAKLSAgICB5b3VyIG93biBvcmdhbml6YXRpb24tc3BlY2lmaWMgY2FwYWJpbGl0eSBwYXR0ZXJuIGxpYnJhcmllcy4gRmluYWxseSwgdGhlCi0gICAgcHJvY2Vzc2VzIGNyZWF0ZWQgd2l0aCBFUEYgQ29tcG9zZXIgY2FuIGJlIHB1Ymxpc2hlZCBhbmQgZGVwbG95ZWQgYXMgV2ViIHNpdGVzLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08aDM+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcidzIEtleSBDYXBhYmlsaXRpZXM8L2gzPgotPHA+SUJNIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBuZXcga2V5IGNhcGFiaWxpdGllczo8L3A+Ci0gIDxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+IFByb3ZpZGVzIGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0b29scyBmb3IgYXV0aG9yaW5nLCBjb25maWd1cmluZywgdmlld2luZywKLSAgICBhbmQgcHVibGlzaGluZyBkZXZlbG9wbWVudCBwcm9jZXNzZXMuPC9saT4KLSAgPGxpPiBQcm92aWRlcyBqdXN0LWluLXRpbWUgZ2VuZXJhdGlvbiBvZiBwdWJsaWNhdGlvbiBwcmV2aWV3cyBpbiBkZWRpY2F0ZWQgYnJvd3NpbmcKLSAgICBwZXJzcGVjdGl2ZSB0aGF0IGFsbG93cyByYXBpZCBjb25maWd1cmF0aW9uIHN3aXRjaGluZy48L2xpPgotICA8bGk+IE1hbmFnZXMgbWV0aG9kIGNvbnRlbnQgdXNpbmcgc2ltcGxlIGZvcm0tYmFzZWQgdXNlciBpbnRlcmZhY2VzLiBUaGVyZWZvcmUsCi0gICAgVU1MIG1vZGVsaW5nIHNraWxscyBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkLjwvbGk+Ci0gIDxsaT4gUHJvdmlkZXMgaW50dWl0aXZlIHJpY2ggdGV4dCBlZGl0b3JzIGZvciBjcmVhdGluZyBpbGx1c3RyYXRpdmUgY29udGVudAotICAgIGRlc2NyaXB0aW9ucy4gRWRpdG9ycyBhbGxvdyB1c2Ugb2Ygc3R5bGVzLCBpbWFnZXMsIHRhYmxlcywgaHlwZXJsaW5rcywgYW5kCi0gICAgZGlyZWN0IGh0bWwgZWRpdGluZy48L2xpPgotICA8bGk+QWxsb3dzIGNyZWF0aW5nIHByb2Nlc3NlcyB3aXRoIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9ycyBhbmQgd29ya2Zsb3cKLSAgICBkaWFncmFtcyB0aHJvdWdoIHVzZSBvZiBtdWx0aS1wcmVzZW50YXRpb24gcHJvY2VzcyBlZGl0b3JzLiBCcmVha2Rvd24gc3RydWN0dXJlCi0gICAgZWRpdG9yIHN1cHBvcnRzIGRpZmZlcmVudCBwcm9jZXNzIHZpZXdzOiB3b3JrLWJyZWFrZG93biB2aWV3LCB3b3JrIHByb2R1Y3QKLSAgICB1c2FnZSB2aWV3LCBhbmQgdGVhbSBhbGxvY2F0aW9uIHZpZXcuIEVQRiBDb21wb3NlciBhdXRvbWF0aWNhbGx5IHN5bmNocm9uaXplcyBhbGwgcHJlc2VudGF0aW9ucwotICAgIHdpdGggcHJvY2VzcyBjaGFuZ2VzLiA8L2xpPgotICA8bGk+UHJvdmlkZXMgc3VwcG9ydCBmb3IgbWFueSBhbHRlcm5hdGl2ZSBsaWZlY3ljbGUKLSAgICBtb2RlbHMuIEZvciBleGFtcGxlLCB3YXRlcmZhbGwsIGluY3JlbWVudGFsLCBvciBpdGVyYXRpdmUgbW9kZWxzIGNhbiBiZSBjcmVhdGVkCi0gICAgd2l0aCB0aGUgc2FtZSBvdmVybGFwcGluZyBtZXRob2QgY29udGVudC48L2xpPgotICA8bGk+SW1wcm92ZWQgcmV1c2UgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzLiBUaGUgcGx1Zy1pbiBtZWNoYW5pc21zIGZyb20KLSAgICBwYXN0IHZlcnNpb25zIGhhdmUgYmVlbiBleHRlbmRlZCB0byBzdXBwb3J0IGV4dGVuc2lvbnMgZm9yIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwvbGk+Ci0gIDxsaT5TdXBwb3J0cyByZXVzYWJsZSBkeW5hbWljYWxseS1saW5rZWQgcHJvY2VzcyBwYXR0ZXJucyBvZiBiZXN0IHByYWN0aWNlcwotICAgIGZvciByYXBpZCBwcm9jZXNzIGFzc2VtYmx5IHZpYSBkcmFnLWFuZC1kcm9wLjwvbGk+Ci08L3VsPgotPC9kaXY+Ci08aDM+S2V5IFRlcm1pbm9sb2d5IGFuZCBDb25jZXB0czwvaDM+Ci08cD5UbyBlZmZlY3RpdmVseSB3b3JrIHdpdGggRVBGIENvbXBvc2VyLCB5b3UgbmVlZCB0byB1bmRlcnN0YW5kIGEgZmV3IGNvbmNlcHRzCi0gIHRoYXQgYXJlIHVzZWQgdG8gb3JnYW5pemUgdGhlIGNvbnRlbnQuIFRoZSBwYWdlcyA8YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvbWV0aG9kYXV0aG9yaW5nb3ZlcnZpZXcuaHRtbCI+TWV0aG9kCi0gIENvbnRlbnQgQXV0aG9yaW5nIE92ZXJ2aWV3PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj5Qcm9jZXNzCi0gIEF1dGhvcmluZyBPdmVydmlldzwvYT4gY29udGFpbiBtb3JlIGRldGFpbCBhbmQgY29uY3JldGUgZXhhbXBsZXMgb2YgaG93IHRvIHdvcmsKLSAgaW4gdGhlIHRvb2wuIFRoaXMgcGFnZSBwcm92aWRlcyB5b3Ugd2l0aCBhIGdlbmVyYWwgb3ZlcnZpZXcgb2YgdGhlc2UgY29uY2VwdHMuPC9wPgotPHA+VGhlIG1vc3QgZnVuZGFtZW50YWwgcHJpbmNpcGxlIGluIEVQRiBDb21wb3NlciBpcyB0aGUgc2VwYXJhdGlvbiBvZiByZXVzYWJsZSBjb3JlIG1ldGhvZAotICBjb250ZW50IGZyb20gaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gVGhpcyBkaXJlY3RseSByZWxhdGVzIGJhY2sgdG8gdGhlCi0gIHR3byBwdXJwb3NlcyBvZiBFUEYgQ29tcG9zZXIgZGVzY3JpYmVkIGluIHRoZSBmaXJzdCBzZWN0aW9uLiBBbG1vc3QgYWxsIG9mIEVQRiBDb21wb3NlcidzIGNvbmNlcHRzCi0gIGFyZSBjYXRlZ29yaXplZCBhbG9uZyB0aGlzIHNlcGFyYXRpb24uIE1ldGhvZCBjb250ZW50IGRlc2NyaWJlcyB3aGF0IGlzIHRvIGJlCi0gIHByb2R1Y2VkLCB0aGUgbmVjZXNzYXJ5IHNraWxscyByZXF1aXJlZCBhbmQgdGhlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZGVzY3JpYmluZwotICBob3cgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkLiBUaGVzZSBtZXRob2QgY29udGVudCBkZXNjcmlwdGlvbnMKLSAgYXJlIGluZGVwZW5kZW50IG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiBQcm9jZXNzZXMgZGVzY3JpYmUgdGhlIGRldmVsb3BtZW50Ci0gIGxpZmVjeWNsZS4gUHJvY2Vzc2VzIHRha2UgdGhlIG1ldGhvZCBjb250ZW50IGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZAotICBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy48L3A+Ci08cD48aW1nIHNyYz0idW1hX2h1bXAuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIHNob3dzIGhvdyB0aGlzIHNlcGFyYXRpb24gaXMgZGVwaWN0ZWQgaW4gQmFzaWMgVW5pZmllZAotICBQcm9jZXNzLiBNZXRob2QgY29udGVudCwgZGVzY3JpYmluZyBob3cgZGV2ZWxvcG1lbnQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQsCi0gIGlzIGNhdGVnb3JpemVkIGJ5IGRpc2NpcGxpbmVzIGFsb25nIHRoZSB5LWF4aXMgb2YgdGhlIGRpYWdyYW0uIFRoZSB3b3JrIGRlc2NyaWJlZAotICBpbiBhIHByb2Nlc3MgaXMgc2VlbiBhbG9uZyB0aGUgeC1heGlzIHJlcHJlc2VudGluZyB0aGUgdGltZWxpbmUuIFRoaXMgaXMgdGhlCi0gIGxpZmVjeWNsZSBvZiBhIGRldmVsb3BtZW50IHByb2plY3QuIEl0IGV4cHJlc3NlcyB3aGVuIHdoYXQgd29yayB3aWxsIGJlIHBlcmZvcm1lZC4KLSAgVGhlIGdyYXBoIGluIHRoZSBpbGx1c3RyYXRpb24gcmVwcmVzZW50cyBhbiBlc3RpbWF0ZWQgd29ya2xvYWQgZm9yIGVhY2ggZGlzY2lwbGluZS4KLSAgQXMgeW91IHNlZSwgZm9yIGV4YW1wbGUsIG9uZSBuZXZlciBzdG9wcyB3b3JraW5nIG9uIHJlcXVpcmVtZW50cyBpbiBSVVAsIGJ1dAotICB0aGVyZSBhcmUgY2VydGFpbmx5IHBlYWsgdGltZXMgaW4gd2hpY2ggbW9zdCBvZiB0aGUgcmVxdWlyZW1lbnRzIGVsaWNpdGF0aW9uCi0gIGFuZCBkZXNjcmlwdGlvbiB3b3JrIGlzIHBlcmZvcm1lZC4gVGhlcmUgYXJlIGFsc28gdGltZXMgYXQgd2hpY2ggYSBkb3dud2FyZAotICB0cmVuZCBuZWVkcyB0byBiZSBvYnNlcnZlZCB3aGVyZSBmZXdlciBhbmQgZmV3ZXIgcmVxdWlyZW1lbnRzIGNoYW5nZXMgaGF2ZSB0bwotICBiZSBwcm9jZXNzZWQgdG8gYnJpbmcgdGhlIHByb2plY3QgdG8gYSBjbG9zZS4gVGhpcyBhdm9pZHMgd2hhdCBpcyByZWZlcnJlZCB0bwotICBhcyBmZWF0dXJlIGNyZWVwIGluIHdoaWNoIHJlcXVpcmVtZW50cyB3b3JrIHJlbWFpbnMgY29uc3RhbnQgb3IgZXZlbiBpbmNyZWFzZXMuCi0gIEhlbmNlLCBhIGxpZmVjeWNsZSAocHJvY2VzcykgZXhwcmVzc2VzIHRoZSB2YXJpYW5jZXMgb2Ygd29yayBwZXJmb3JtZWQgaW4gdGhlCi0gIHZhcmlvdXMgZGlzY2lwbGluZXMgKG1ldGhvZCBjb250ZW50KS48L3A+Ci08cD48aW1nIHNyYz0ibWNfdnNfcC5naWYiPjwvcD4KLTxwPlRoZSBwaWN0dXJlIGFib3ZlIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiB0aGUga2V5IGVsZW1lbnRzIHVzZWQgaW4gRVBGIENvbXBvc2VyIGFuZCBob3cKLSAgdGhleSByZWxhdGUgdG8gbWV0aG9kIGNvbnRlbnQgb3IgcHJvY2Vzcy4gQXMgeW91IHNlZSwgbWV0aG9kIGNvbnRlbnQgaXMgcHJpbWFyaWx5Ci0gIGV4cHJlc3NlZCB1c2luZyB3b3JrIHByb2R1Y3RzLCByb2xlcywgdGFza3MsIGFuZCBndWlkYW5jZS4gR3VpZGFuY2UsIHN1Y2ggYXMKLSAgY2hlY2tsaXN0cywgZXhhbXBsZXMsIG9yIHJvYWRtYXBzLCBjYW4gYWxzbyBiZSBkZWZpbmVkIHRvIHByb3ZpZGUgZXhlbXBsYXJ5Ci0gIHdhbGt0aHJvdWdocyBvZiBhIHByb2Nlc3MuIE9uIHRoZSByaWdodC1oYW5kIHNpZGUgb2YgdGhlIGRpYWdyYW0sIHlvdSBzZWUgdGhlCi0gIGVsZW1lbnRzIHVzZWQgdG8gcmVwcmVzZW50IHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuIFRoZSBtYWluIGVsZW1lbnQgaXMgdGhlIGFjdGl2aXR5Ci0gIHRoYXQgY2FuIGJlIG5lc3RlZCB0byBkZWZpbmUgYnJlYWtkb3duIHN0cnVjdHVyZXMgYXMgd2VsbCBhcyByZWxhdGVkIHRvIGVhY2gKLSAgb3RoZXIgdG8gZGVmaW5lIGEgZmxvdyBvZiB3b3JrLiBBY3Rpdml0aWVzIGFsc28gY29udGFpbiBkZXNjcmlwdG9ycyB0aGF0IHJlZmVyZW5jZQotICBtZXRob2QgY29udGVudC4gQWN0aXZpdGllcyBhcmUgdXNlZCB0byBkZWZpbmUgcHJvY2Vzc2VzIG9mIHdoaWNoIEVQRiBDb21wb3NlciBzdXBwb3J0Ci0gIHR3byBtYWluIGtpbmRzOiBkZWxpdmVyeSBwcm9jZXNzZXMgYW5kIGNhcGFiaWxpdHkgcGF0dGVybnMuIERlbGl2ZXJ5IHByb2Nlc3NlcwotICByZXByZXNlbnQgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBwcm9jZXNzIHRlbXBsYXRlIGZvciBwZXJmb3JtaW5nIG9uZSBzcGVjaWZpYwotICB0eXBlIG9mIHByb2plY3QuIFRoZXkgZGVzY3JpYmUgYSBjb21wbGV0ZSBlbmQtdG8tZW5kIHByb2plY3QgbGlmZWN5Y2xlIGFuZCBhcmUKLSAgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzLiBDYXBhYmlsaXR5Ci0gIHBhdHRlcm5zIGFyZSBwcm9jZXNzZXMgdGhhdCBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYQotICBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgZGlzY2lwbGluZSBvciBhIGJlc3QgcHJhY3RpY2UuIFRoZXkgYXJlIGFsc28KLSAgdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgZGVsaXZlcnkgcHJvY2Vzc2VzIG9yIGxhcmdlciBjYXBhYmlsaXR5Ci0gIHBhdHRlcm5zLiBUaGlzIGVuc3VyZXMgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlaXIga2V5IGJlc3QgcHJhY3RpY2VzCi0gIGluIHByb2Nlc3MgYXV0aG9yaW5nIGFjdGl2aXRpZXMgaW4gRVBGIENvbXBvc2VyLiA8L3A+Ci0KLTxwPkZvciBtb3JlIGRldGFpbHMgb24gRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3Nlciwgc2VlIHRoZSBvbmxpbmUgaGVscDo8L3A+Ci08ZGl2IGFsaWduPSJsZWZ0Ij4KLTx1bD4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9hYm91dGVwZmNvbXBvc2VyLmh0bWwiPk92ZXJ2aWV3PC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvc3RhbmRhcmRtZXRob2RsaWJyYXJ5b3ZlcnZpZXcuaHRtbCI+R2V0dGluZwotICAgICAgU3RhcnRlZDwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9vdmVydmlldy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3L292ZXJ2aWV3LmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExNTU0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL292ZXJ2aWV3L292ZXJ2aWV3LmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvY29udGVudHBhZ2Uvb3ZlcnZpZXdfd3RyLmpwZyk7Ci19Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldyBpbWcsICNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6aG92ZXIgaW1nIHsgCi0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZik7IAotCX0KLQotCi1pZnJhbWUgewotCXBvc2l0aW9uOnJlbGF0aXZlOwotCXRvcDoxNnB4OwotCXdpZHRoOjEwMCU7Ci0JaGVpZ2h0OjEwMCU7Ci0JcGFkZGluZy1sZWZ0OjEwcHg7Ci0JfQotCQotLyogbW96aWxsYSBzY3JvbGxiYXIgYXBwZWFyaW5nIG9mZiBwYWdlIGZpeCAqLwotI3BhZ2UtY29udGVudCA+IGlmcmFtZSB7Ci0Jd2lkdGg6IDk4JTsKLQlwYWRkaW5nLWxlZnQ6IDIlOwotfQkKLQotCi0vKiAKLSAqIFNldCB1cCB0aGUgT3ZlcnZpZXcgbGlua3MgdG8gYmUgZGlzcGxheWVkIGluIHR3byBjb2x1bW5zCi0gKiB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLgotICovCi0KLSNvdmVydmlldy1saW5rcyB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0Jd2lkdGggOiA3NjBweDsKLQkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8KLQltYXJnaW4gOiAwcHggYXV0bzsKLQotfQotCi0jb3ZlcnZpZXctbGlua3MgYSB7IAotCXdpZHRoIDogMzcwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodCA6IDVweDsKLQltYXJnaW4tdG9wIDogNXB4OwotCW1hcmdpbi1ib3R0b20gOiAtMjBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDsKLX0KLQotI292ZXJ2aWV3LWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9Ci0KLSNvdmVydmlldy1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTdweDsKLQl3aWR0aCA6IDU3cHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci0JCQotfQkKLQotI292ZXJ2aWV3LWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTUwcHg7Ci0JbGVmdCA6IDYwcHg7Ci19Ci0KLSNvdmVydmlldy1saW5rcyBhID4gLmxpbmstbGFiZWwgeyBsZWZ0OiA2NXB4OyB9Ci0KLSNvdmVydmlldy1saW5rcyBhIHAgLnRleHQgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTQ1cHg7Ci0JbGVmdCA6IDUzcHg7Ci19Ci0KLSNvdmVydmlldy1saW5rcyBhIHAgPiAudGV4dCB7IGxlZnQ6IDU4cHg7IH0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLwotI292ZXJ2aWV3LWxpbmtzID4gYSB7IAl3aWR0aCA6IDcwMHB4OyB9Ci0jb3ZlcnZpZXctbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI292ZXJ2aWV3LWxpbmtzIGEgcCA+IC50ZXh0IHsgd2lkdGggOiA3MDBweDsgfQotCi0jb3ZlcnZpZXctbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQotCi1hI2Jhc2ljcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzX29iai5naWYpOyB9Ci1hI2Jhc2ljczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3diYmFzaWNzaG92X29iai5naWYpOyB9Ci0KLWEjdGVhbSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZik7IH0KLWEjdGVhbTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBob3Zfb2JqLmdpZik7IH0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvb3ZlcnZpZXcvc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MTNjZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9vdmVydmlldy9zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotb3ZlcnZpZXcubGF5b3V0Lm5jb2x1bW5zID0gMgotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmxheW91dC52c3BhY2luZyA9IDM1Ci1vdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MubGF5b3V0Lm5jb2x1bW5zID0gMgotCi1vdmVydmlldy5zdWJ0aXRsZS1pZCA9IG92ZXJ2aWV3L3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCi1vdmVydmlldy5kZXNjcmlwdGlvbi1pZCA9IG92ZXJ2aWV3L3BhZ2UtY29udGVudC9wYWdlLWRlc2NyaXB0aW9uCi0KLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5lcGYtb3YtcnVwb3YubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1ydXBvdi5naWYKLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5lcGYtb3YtbWV0aG9kLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kLmdpZgotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLmVwZi1vdi1wcm9jZXNzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzcy5naWYKLW92ZXJ2aWV3LnBhZ2UtY29udGVudC5vdmVydmlldy1saW5rcy5lcGYtb3YtY29uZmlncHVibGlzaC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2guZ2lmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjJiN2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHJvY2Vzc2F1dGhvcmluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wcm9jZXNzYXV0aG9yaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMjQyZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wcm9jZXNzYXV0aG9yaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08dGl0bGU+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+UHJvY2VzcyBBdXRob3JpbmcgT3ZlcnZpZXc8L2gzPgotPHA+QSBkZXZlbG9wbWVudCBwcm9jZXNzIGRlZmluZXMgc2VxdWVuY2VzIG9mIHRhc2tzIHBlcmZvcm1lZCBieSByb2xlcyBhbmQgd29yawotICBwcm9kdWN0cyBwcm9kdWNlZCBvdmVyIHRpbWUuPC9wPgotPHA+PGltZyBzcmM9InAuZ2lmIj48L3A+Ci08cD5UaGUgZmlndXJlIGFib3ZlIHNob3dzIHRoYXQgcHJvY2Vzc2VzIGFyZSB0eXBpY2FsbHkgZXhwcmVzc2VkIGFzIHdvcmtmbG93cwotICBvciBicmVha2Rvd24gc3RydWN0dXJlcy4gRGVmaW5pbmcgYSBzdHJpY3Qgc2VxdWVuY2UgYXMgaW4gYSB3YXRlcmZhbGwgbW9kZWwKLSAgaXMgYXMgbXVjaCBhIHByb2Nlc3MgYXMgZGVmaW5pbmcgc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyBpbiBpdGVyYXRpb25zIG9mIHBhcmFsbGVsCi0gIHdvcmsuIFRoZXkganVzdCByZXByZXNlbnQgZGlmZmVyZW50IGRldmVsb3BtZW50IGFwcHJvYWNoZXMuIEhlbmNlLCBmb3IgZGVmaW5pbmcKLSAgYSBwcm9jZXNzLCBvbmUgY2FuIHRha2UgbWV0aG9kIGNvbnRlbnQgYW5kIGNvbWJpbmUgaXQgaW50byBzdHJ1Y3R1cmVzIHRoYXQgc3BlY2lmeQotICBob3cgdGhlIHdvcmsgc2hhbGwgYmUgb3JnYW5pemVkIG92ZXIgdGltZSwgdG8gbWVldCB0aGUgbmVlZHMgb2YgYSBwYXJ0aWN1bGFyCi0gIHR5cGUgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdCAoc3VjaCBhcyBzb2Z0d2FyZSBmb3IgYSBvbmxpbmUgc3lzdGVtIHZlcnN1cyBzb2Z0d2FyZQotICBhbmQgaGFyZHdhcmUgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSkuIFJNQyBzdXBwb3J0cyBwcm9jZXNzZXMgYmFzZWQgb24gZGlmZmVyZW50Ci0gIGRldmVsb3BtZW50IGFwcHJvYWNoZXMgYWNyb3NzIG1hbnkgZGlmZmVyZW50IGxpZmVjeWNsZSBtb2RlbHMsIGluY2x1ZGluZyB3YXRlcmZhbGwsCi0gIGluY3JlbWVudGFsLCBhbmQgaXRlcmF0aXZlIGxpZmVjeWNsZXMuIFJNQyBhbHNvIHN1cHBvcnRzIGRpZmZlcmVudCBwcmVzZW50YXRpb25zCi0gIGZvciBwcm9jZXNzLCBzdWNoIGFzIHdvcmstYnJlYWtkb3duIHN0cnVjdHVyZSBvciB3b3JrZmxvdyBwcmVzZW50YXRpb25zLiBZb3UKLSAgY2FuIGFsc28gZGVmaW5lIHByb2Nlc3NlcyBpbiBSTUMgdGhhdCB1c2UgYSBtaW5pbWFsIHNldCBvZiBtZXRob2QgY29udGVudCB0bwotICBkZWZpbmUgcHJvY2Vzc2VzIGZvciBhZ2lsZSwgc2VsZi1vcmdhbml6aW5nIHRlYW1zLjwvcD4KLTxwPiBUaGUgUk1DIHNjcmVlbiBjYXB0dXJlIGFib3ZlIHNob3dzIGFuIGV4YW1wbGUgb2YgYSBwcm9jZXNzIHByZXNlbnRlZCBhcyBhCi0gIGJyZWFrZG93biBzdHJ1Y3R1cmUgb2YgbmVzdGVkIGFjdGl2aXRpZXMgYXMgd2VsbCBhcyBhIHdvcmtmbG93IG9yIGFjdGl2aXR5IGRpYWdyYW0KLSAgZm9yIG9uZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LCB0aGUgaW5jZXB0aW9uIHBoYXNlLiBJdCBhbHNvIGluZGljYXRlcyB3aXRoIHRoZQotICB0d28gYmx1ZSBhcnJvd3MgdGhhdCB0aGUgcGFydGljdWxhciBtZXRob2QgY29udGVudCB0YXNrICZxdW90O0RldGFpbCBhIFVzZSBDYXNlJnF1b3Q7Ci0gIGhhcyBiZWVuIGFwcGxpZWQgaW4gdGhlIHByb2Nlc3MgdHdpY2U7IGZpcnN0bHkgaW4gdGhlIGluY2VwdGlvbiBwaGFzZSB1bmRlcgotICB0aGUgYWN0aXZpdHkgJnF1b3Q7RGVmaW5lIHRoZSBTeXN0ZW0sJnF1b3Q7IGFuZCBzZWNvbmRseSwgaW4gdGhlIGVsYWJvcmF0aW9uCi0gIHBoYXNlIGluIHRoZSBhY3Rpdml0eSAmcXVvdDtSZWZpbmUgdGhlIHN5c3RlbSBkZWZpbml0aW9uJnF1b3Q7LiBZb3Ugc2VlIGJlbG93Ci0gIGVhY2ggb2YgdGhlc2UgdGFzayBhcHBsaWNhdGlvbnMsIHJlZmVycmVkIHRvIGFzIGEgdGFzayBkZXNjcmlwdG9ycyBpbiBSTUMsIGxpc3RzCi0gIG9mIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFzIHdlbGwgYXMgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gSWYgeW91Ci0gIGxvb2sgY2xvc2VseSwgeW91IHNlZSB0aGF0IHRoZXNlIGxpc3RzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggb2YgdGhlc2UgdHdvIHRhc2sKLSAgZGVzY3JpcHRvcnMsIGV4cHJlc3NpbmcgZGlmZmVyZW5jZXMgaW4gcGVyZm9ybWluZyB0aGUgJnF1b3Q7RGV0YWlsIGEgVXNlIENhc2UmcXVvdDsKLSAgbWV0aG9kIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZS4gWW91IHNlZSBkaWZmZXJlbnQgcm9sZXMgaW52b2x2ZWQgYW5kIGNoYW5nZXMKLSAgaW4gdGhlIGxpc3Qgb2YgaW5wdXRzIHRvIGJlIGNvbnNpZGVyZWQgYW5kIG91dHB1dHMgdG8gYmUgcHJvZHVjZWQgb3IgdXBkYXRlZC4KLSAgVGhlc2UgY2hhbmdlcyB3ZXJlIGRlZmluZWQgYnkgdGhlIGF1dGhvciB0aGF0IGNyZWF0ZWQgdGhpcyBwcm9jZXNzIHRvIGV4cHJlc3MKLSAgdGhlIGV4YWN0IGZvY3VzIG9mIHRoZSB0YXNrIHBlcmZvcm1hbmNlIGZvciBlYWNoIG9jY3VycmVuY2UuIEluIGFkZGl0aW9uIHRvCi0gIHVwZGF0aW5nIHRoZSByb2xlcywgaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzIGZvciBhIHRhc2sgZGVzY3JpcHRvciwgeW91Ci0gIGNhbiBhbHNvIHByb3ZpZGUgYWRkaXRpb25hbCB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUgZXhhY3QKLSAgc3RlcHMgb2YgdGhlIHRhc2sgdGhhdCBzaG91bGQgYW5kIHNob3VsZCBub3QgYmUgcGVyZm9ybWVkIGZvciB0aGlzIHBhcnRpY3VsYXIKLSAgb2NjdXJyZW5jZSBvZiB0aGUgdGFzay48L3A+Ci08cD5STUMgcHJvdmlkZXMgeW91IHdpdGggYSBwcm9jZXNzIGVkaXRvciB0aGF0IHN1cHBvcnRzIGRpZmZlcmVudCBicmVha2Rvd24gc3RydWN0dXJlCi0gIHZpZXdzIGFzIHdlbGwgYXMgZ3JhcGhpY2FsIHByb2Nlc3MgcHJlc2VudGF0aW9ucy4gQXMgYSBwcm9jZXNzIGF1dGhvciwgeW91IHR5cGljYWxseQotICBzdGFydCBieSBjcmVhdGluZyBhbiBhY3Rpdml0eSBicmVha2Rvd24sIGRpdmlkaW5nIGFuZCBicmVha2luZyB5b3VyIHByb2Nlc3MKLSAgZG93biBpbnRvIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGhpZ2gtbGV2ZWwgYWN0aXZpdGllcy4gSW5zdGVhZCBvZiBjcmVhdGluZwotICB5b3VyIGFjdGl2aXRpZXMgaW4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZWRpdG9yLCB5b3UgY2FuIGFsdGVybmF0aXZlbHkgd29yawotICBpbiBhIGdyYXBoaWNhbCBhY3Rpdml0eSBkaWFncmFtIGVkaXRvciB0aGF0IGFsbG93cyB5b3UgdG8gZ3JhcGhpY2FsbHkgY3JlYXRlCi0gIGEgd29ya2Zsb3cgZm9yIHlvdXIgYWN0aXZpdGllcy4gVG8gYXNzaWduIG1ldGhvZCBjb250ZW50IHRvIHlvdXIgcHJvY2VzcywgeW91Ci0gIHRoZW4gaGF2ZSB0aGUgY2hvaWNlIG9mIHdvcmtpbmcgaW4gZGlmZmVyZW50IHByb2Nlc3Mgdmlld3MgKHdvcmsgYnJlYWtkb3duIHN0cnVjdHVyZSwKLSAgd29yayBwcm9kdWN0IHVzYWdlLCBvciB0ZWFtIGFsbG9jYXRpb24gdmlldykuIEVhY2ggdmlldyBzdXBwb3J0cyBhIGRpZmZlcmVudAotICBhcHByb2FjaCBmb3IgY3JlYXRpbmcgYSBwcm9jZXNzLiBZb3UgY2FuIGRlZmluZSB0aGUgd29yayB0byBiZSBkb25lLCBkZWZpbmUKLSAgdGhlIHJlc3VsdHMgdG8gYmUgcHJvZHVjZWQsIG9yIGRlZmluZSByZXNwb25zaWJpbGl0aWVzIGZvciB5b3VyIHJvbGVzLiBJZiByZXF1ZXN0ZWQsCi0gIHRoZSBlZGl0b3IgdXBkYXRlcyB0aGUgb3RoZXIgcHJvY2VzcyB2aWV3cyBzZW1pLWF1dG9tYXRpY2FsbHkgdXNpbmcgd2l6YXJkcwotICB0aGF0IHByb21wdCB5b3UgZm9yIGRlY2lzaW9ucyBvbiBzZWxlY3RpbmcgbWV0aG9kIGNvbnRlbnQgZWxlbWVudHMuPC9wPgotPHA+Rm9yIG1vcmUgZGV0YWlscyBvbiBwcm9jZXNzIGF1dGhvcmluZyBzZWUgdGhlIG9ubGluZSBoZWxwOjwvcD4KLTxkaXYgYWxpZ249ImxlZnQiPgotPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3Byb2Nlc3NhdXRob3JpbmdvdmVydmlldy5odG1sIj5Qcm9jZXNzCi0gIEF1dGhvcmluZyBPdmVydmlldzwvYT48L2xpPgotPC91bD4KLTwvZGl2PgotPHA+Jm5ic3A7PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wdWIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wdWIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTNlOGQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHViLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvcHVibGlzaGluZy5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wdWJsaXNoaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzA4MmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9wdWJsaXNoaW5nLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08aHRtbD4KLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotPGhlYWQ+Ci08dGl0bGU+Q29uZmlndXJhdGlvbiBhbmQgUHVibGlzaGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMz5NZXRob2QgQ29uZmlndXJhdGlvbnMgT3ZlcnZpZXc8L2gzPgotPHA+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBzaGlwcyB3aXRoIGEgbG90IG9mIGNvbnRlbnQgb3V0IG9mIHRoZSBib3guIEl0IGluY2x1ZGVzCi0gIHRoZSBPcGVuIFVuaWZpZWQgUHJvY2VzcyAoT3BlblVQKSBmcmFtZXdvcmsgYW5kIHZhcmlvdXMgcGx1Zy1pbnMgZXh0ZW5kaW5nCi0gIE9wZW5VUC9CYXNpYy4gTm8gb3JnYW5pemF0aW9uIG9yIHByb2plY3QgcmVxdWlyZXMgYWxsIG9mIHRoaXMKLSAgZG9jdW1lbnRhdGlvbiBhbGwgYXQgb25jZSwgYnV0IHdvdWxkIHdvcmsgd2l0aCBhIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBzdWJzZXRzLjwvcD4KLTxwPiBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIChFUEYpIENvbXBvc2VyIG1hbmFnZXMgZm9yIHRoYXQgcHVycG9zZSBzby1jYWxsZWQgbWV0aG9kCi0gIGNvbmZpZ3VyYXRpb25zLCB3aGljaCBhbGxvdyB5b3UgdG8gc3BlY2lmeSB3b3JraW5nIHNldHMgb2YgY29udGVudCBhbmQgcHJvY2Vzc2VzCi0gIGZvciBhIHNwZWNpZmljIGNvbnRleHQsIHN1Y2ggYXMgYSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZSBSVVAgZnJhbWV3b3JrIHRoYXQKLSAgeW91IHdhbnQgdG8gcHVibGlzaCBhbmQgZGVwbG95IGZvciBhIGdpdmVuIHNvZnR3YXJlIHByb2plY3Qgb3IgYXMgYSBmb3VuZGF0aW9uCi0gIGZvciBhIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbi4gQWxsIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIgYXJlIG9yZ2FuaXplZAotICBpbiBtZXRob2QgcGx1Zy1pbnMsIHdoaWNoIGFyZSBvcmdhbml6ZWQgaW50byBtZXRob2QgcGFja2FnZXMuIEEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgaXMgc2ltcGx5IGEgc2VsZWN0aW9uIG9mIHRoZSBtZXRob2QgcGx1Zy1pbnMgYW5kIHBhY2thZ2VzLjwvcD4KLTxwPjxpbWcgc3JjPSJjc3MvY29uZi5naWYiPjwvcD4KLTxwPllvdSBjcmVhdGUgYW5kIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBjb25maWd1cmF0aW9uIGVkaXRvciBkZXBpY3RlZAotICBpbiB0aGUgZmlndXJlIGFib3ZlLiBZb3UgY291bGQgc3RhcnQgY3JlYXRpbmcgeW91ciBvd24gbWV0aG9kIGNvbmZpZ3VyYXRpb24KLSAgYnkgY29weWluZyBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgc2hpcCB3aXRoIEVQRiBDb21wb3NlciBhbmQgbW9kaWZ5IGl0IHRvIGZpdAotICB5b3VyIHNwZWNpZmljIG5lZWRzLiBZb3UgY2FuIGFkZCBvciByZW1vdmUgd2hvbGUgbWV0aG9kIHBsdWctaW5zIGFzIHdlbGwgYXMKLSAgbWFrZSBzZWxlY3Rpb24gd2l0aCBlYWNoIHBsdWctaW4gYnkgY2hlY2tpbmcgb3IgdW4tY2hlY2tpbmcgcGFja2FnZXMuIDwvcD4KLTxwPiBZb3UgY2FuIHVzZSB0aGUgcmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gYXMgeW91ciB3b3JraW5nIHNldCBmb3IgeW91ciBFUEYgQ29tcG9zZXIKLSAgd29yay4gVGhlIGFjdHVhbCBjb250ZW50IG9mIHRoZSBjb25maWd1cmF0aW9uLCBpLmUuIHRoZSBpbmNsdWRlZCBtZXRob2QgY29udGVudAotICBhbmQgcHJvY2VzcyBlbGVtZW50cyBhcmUgYWx3YXlzIGFjY2Vzc2libGUgaW4gdGhlIENvbmZpZ3VyYXRpb24gdmlldy4gVXNlIHRoZQotICBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgdG8gc2VsZWN0IHRoZSBjdXJyZW50bHkgdXNlZCBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08aDM+UHVibGlzaGluZyBPdmVydmlldzwvaDM+Ci08cD5NZXRob2QgY29uZmlndXJhdGlvbnMgYXJlIHRoZSBiYXNpcyBmb3IgcHVibGlzaGluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLgotICBBIHB1Ymxpc2hlZCBjb25maWd1cmF0aW9uIGlzIGFuIGh0bWwgV2ViIHNpdGUgdGhhdCBwcmVzZW50cyBhbGwgdGhlIG1ldGhvZAotICBjb250ZW50IGFuZCBwcm9jZXNzZXMgb2YgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9uIGluIGEgbmF2aWdhYmxlIGFuZCBzZWFyY2hhYmxlCi0gIHdheS4gSXQgdXNlcyB0aGUgcmVsYXRpb25zaGlwcyBlc3RhYmxpc2hlZCBkdXJpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3MKLSAgYXV0aG9yaW5nIHRvIGdlbmVyYXRlIGh5cGVybGlua3MgYmV0d2VlbiBlbGVtZW50cyBhcyB3ZWxsIGFzIHByb3ZpZGVzIHRyZWUKLSAgYnJvd3NlcnMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24gdmlldyBhbmQgdXNlci1kZWZpbmVkIGNhdGVnb3JpemF0aW9ucyBvZgotICB0aGUgY29udGVudC4gVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBhbiBleGFtcGxlIG9mIHRoZSBwdWJsaXNoZWQgJ0NsYXNzaWMgUlVQJwotICBtZXRob2QgY29uZmlndXJhdGlvbi48L3A+Ci08cD48aW1nIHNyYz0iY3NzL3B1Yi5naWYiPjwvcD4KLTxwPkZvciBwdWJsaXNoaW5nIHNpbXBseSBjcmVhdGUgYW5kIHNlbGVjdCBhIGNvbmZpZ3VyYXRpb24uIFRoZSBwdWJsaWNhdGlvbiB3aXphcmQKLSAgd2lsbCBkbyB0aGUgcmVzdCBmb3IgeW91IGFuZCBvbmx5IHB1Ymxpc2ggY29udGVudCB0aGF0IGlzIHBhcnQgb2YgdGhlIG1ldGhvZAotICBjb25maWd1cmF0aW9uLiBJdCB3aWxsIGFsc28gYXV0b21hdGljYWxseSBhZG9wdCBjb250ZW50IHRvIHRoZSBjb25maWd1cmF0aW9uCi0gIHN1Y2ggYXMgcmVtb3ZpbmcKLSAgcmVmZXJlbmNlcyBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyB0byBlbGVtZW50cyBvdXRzaWRlIG9mIHRoZSBjb25maWd1cmF0aW9uCi0gIG9yIHJlbW92aW5nIGFjdGl2aXRpZXMgZnJvbSB5b3VyIHByb2Nlc3NlcyB0aGF0IG9ubHkgY29udGFpbiB3b3JrIGRlZmluZWQgb3V0c2lkZQotICBvZiB0aGUgY29uZmlndXJhdGlvbiBzZXQuIEhlbmNlLCBwdWJsaXNoaW5nIHdpbGwgb25seSBpbmNsdWRlIHRoZSBjb250ZW50IHRoYXQKLSAgeW91IHJlYWxseSBuZWVkLiBZb3UgY2FuIGFsd2F5cyBwcmV2aWV3IGEgcHVibGlzaGVkIGNvbmZpZ3VyYXRpb24gdXNpbmcgRVBGIENvbXBvc2VyJ3MKLWJyb3dzaW5nIHBlcnNwZWN0aXZlLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvcm9vdC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3QuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFkNDhmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvcm9vdC5jc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3Rfc3d0LnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3Jvb3Rfc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZWQ2OTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9yb290X3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5vdmVydmlldy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnN0ZXBzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzcyLmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc2FtcGxlcy5saW5rLWljb249IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9zYW1wbGVzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5uZXdzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93aGF0c25ldzcyLmdpZgotcm9vdC5hY3Rpb24tbGlua3Mud29ya2JlbmNoLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93YjQ4LmdpZgotCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5vdmVydmlldy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLndlYi5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM3Mi5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnNhbXBsZXMuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNzIuZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5uZXdzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc3Mi5naWYKLXJvb3QuYWN0aW9uLWxpbmtzLndvcmtiZW5jaC5ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmCi0KLQotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcuc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL292ZXJ2aWV3NDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5zdGVwcy5zbWFsbC1saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5zbWFsbC1saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIuc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnNhbXBsZXMuc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm5ld3Muc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDguZ2lmCi1yb290LmFjdGlvbi1saW5rcy53b3JrYmVuY2guc21hbGwtbGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmCi0KLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm92ZXJ2aWV3LnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvb3ZlcnZpZXc0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnN0ZXBzLnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnR1dG9yaWFscy5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2VicnNyYzQ4LmdpZgotcm9vdC5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc2FtcGxlcy5zbWFsbC1ob3Zlci1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYKLXJvb3QubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLm5ld3Muc21hbGwtaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4LmdpZgotcm9vdC5hY3Rpb24tbGlua3Mud29ya2JlbmNoLnNtYWxsLWhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYKLQotcm9vdC5sYXlvdXQubmNvbHVtbnMgPSAxCi1yb290LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5sYXlvdXQuaHNwYWNpbmcgPSA0MAotcm9vdC5sYXlvdXQudnNwYWNpbmcgPSAzNQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zYW1wbGVzL3NhbXBsZXMuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zYW1wbGVzL3NhbXBsZXMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTEyNjczLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zYW1wbGVzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLWJvZHkgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvY29udGVudHBhZ2Uvc2FtcGxlc193dHIuanBnKTsKLX0KLQotLnBhZ2UgeyBtaW4taGVpZ2h0IDogNzAwcHg7IH0KLQotLyogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXMgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDhzZWwuZ2lmKTsgfQotCi0vKiBMYXkgb3V0IHRoZSByZWFsIGNvbnRlbnQgb2YgdGhlIHNhbXBsZXMgcGFnZTogKi8KLQotLnNhbXBsZXMtZ3JvdXAgewotCXdpZHRoIDogNzUwcHg7Ci0JLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCQotCW1hcmdpbiA6IDBweCBhdXRvOwotCW1hcmdpbi1ib3R0b20gOiAxMHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLS5zYW1wbGVzLWdyb3VwIEg0IHsgbWFyZ2luLXRvcCA6IDEwcHg7IH0KLQotLnNhbXBsZS1saW5rIHsgCi0Jd2lkdGggOiAzNjBweDsKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JbWFyZ2luLWxlZnQgOiA1cHg7Ci0JbWFyZ2luLXJpZ2h0IDogNXB4OwotCW1hcmdpbi10b3AgOiAxMHB4OwotCW1hcmdpbi1ib3R0b20gOiAtMzBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDsKLX0KLQotLyogc3BlY2lhbGl6ZSB0aGUgc3d0IHNhbXBsZXMgZ3JvdXAgdG8gYmUgc3ByZWFkIG92ZXIgb25seSAxIGNvbHVtbiAqLwotI3N3dCAuc2FtcGxlLWxpbmsgeyAKLQl3aWR0aCA6IDcyMHB4OwotfQotCi0uc2FtcGxlcy1ncm91cCA+IC5zYW1wbGUtbGluayB7Ci0JZmxvYXQgOiBsZWZ0OwotCWhlaWdodCA6IDE1MHB4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0KLS5zYW1wbGUtbGluayAubGluay1sYWJlbCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNTBweDsKLQlsZWZ0IDogNjBweDsKLX0KLQotI3N3dCAuc2FtcGxlLWxpbmsgLmxpbmstbGFiZWwgewotCXdpZHRoIDogNjAwcHg7CQotfSAKLQotLnNhbXBsZS1saW5rIHAgLnRleHQgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTQ1cHg7Ci0JbGVmdCA6IDUzcHg7Ci19Ci0KLSNzd3QgLnNhbXBsZS1saW5rIC50ZXh0IHsKLQl3aWR0aCA6IDYyMHB4OwkKLX0gCi0KLS5zYW1wbGUtbGluayBpbWcgewotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0uc2FtcGxlLWxpbms6aG92ZXIgeyBib3JkZXItcmlnaHQgOiAwcHg7IH0KLQotCi0jc3d0IC5zYW1wbGUtbGluayBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkX29iai5naWYpOwotfQotCi0jc3d0IC5zYW1wbGUtbGluazpob3ZlciBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcmVkaG92X29iai5naWYpOwotfQotCi0jd29ya2JlbmNoIC5zYW1wbGUtbGluayBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycF9vYmouZ2lmKTsKLX0KLQotI3dvcmtiZW5jaCAuc2FtcGxlLWxpbms6aG92ZXIgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3NhbXBsZXB1cnBob3Zfb2JqLmdpZik7Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2FtcGxlcy9zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0MDAyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3NhbXBsZXMvc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotc2FtcGxlcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvc2FtcGxlcHVycF9vYmouZ2lmCi1zYW1wbGVzLnBhZ2UtY29udGVudC5zd3Quc3d0LWV4YW1wbGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9zYW1wbGVyZWRfb2JqLmdpZgotCi1zYW1wbGVzLnBhZ2UtY29udGVudC5sYXlvdXQudnNwYWNpbmcgPSA0MAotc2FtcGxlcy5wYWdlLWNvbnRlbnQuc3d0LmxheW91dC5uY29sdW1ucyA9IDIKLXNhbXBsZXMucGFnZS1jb250ZW50LnN3dC5sYXlvdXQudnNwYWNpbmcgPSAzMAotc2FtcGxlcy5wYWdlLWNvbnRlbnQuc3d0LmxheW91dC5oc3BhY2luZyA9IDMwCi1zYW1wbGVzLnBhZ2UtY29udGVudC53b3JrYmVuY2gubGF5b3V0Lm5jb2x1bW5zID0gMgotc2FtcGxlcy5wYWdlLWNvbnRlbnQud29ya2JlbmNoLmxheW91dC52c3BhY2luZyA9IDMwCi1zYW1wbGVzLnBhZ2UtY29udGVudC53b3JrYmVuY2gubGF5b3V0LmhzcGFjaW5nID0gMzAKLQotZGVzY3JpcHRpb24tc3R5bGUtaWQgPSBncm91cC1kZXNjcmlwdGlvbgotc2FtcGxlcy5zdWJ0aXRsZS1pZCA9IHNhbXBsZXMvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKLXNhbXBsZXMuZGVzY3JpcHRpb24taWQgPSBzYW1wbGVzL3BhZ2UtY29udGVudC9wYWdlLWRlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zaGFyZWQuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zaGFyZWQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTNjNmE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qIAotICogU2V0IHVwIGdlbmVyYWwgZm9udHMsIHNpemVzIGFuZCBjb2xvcnMgCi0gKi8KLWJvZHkgeyBmb250LWZhbWlseSA6IEFyaWFsLCBzYW5zLXNlcmlmOyB9Ci0KLUgxLCBIMiwgSDMsIEg0LCBwLCBhIHsgY29sb3IgOiAjNEQ0RDREOyB9Ci0KLS5pbnRyby1oZWFkZXIgSDEgewotCWZvbnQtc2l6ZSA6IDE2cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi1oMiB7Ci0JZm9udC1zaXplIDogMTNwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICM3Qjg2OTQ7Ci19Ci0KLS5wYWdlLXRpdGxlIHsKLQlmb250LXNpemUgOiAxNHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogIzhDOTZBMjsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi0ucGFnZS1kZXNjcmlwdGlvbiB7IAotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotSDQgLmRpdi1sYWJlbCB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLWEgewotCWZvbnQtd2VpZ2h0IDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb24gOiBub25lOwotCWNvbG9yIDogIzRENEQ0RDsKLX0KLQotYSAubGluay1sYWJlbCB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZm9udC1zaXplIDogOXB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotYSAudGV4dCB7Ci0JZm9udC1zaXplIDogOHB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotfQotCi1wIC5ncm91cC1kZXNjcmlwdGlvbiB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLX0KLQotCi0vKiAKLSAqIFNldCB1cCBvdGhlciBnZW5lcmFsIHByb3BlcnRpZXMgbGlrZSBwYWRkaW5nL21hcmdpbnMKLSAqLwotaHRtbCwgYm9keSB7IHdpZHRoIDogMTAwJTsgaGVpZ2h0IDogMTAwJTsgfQotCi1odG1sLCBib2R5LCBkaXYsIGgxLCBoNCwgcCwgYSB7IG1hcmdpbiA6IDBweDsgcGFkZGluZyA6IDBweDsgfQotCi0uaW50cm8taGVhZGVyIEgxIHsgcGFkZGluZy10b3AgOiAxMHB4OyBtYXJnaW4tbGVmdCA6IDEwcHg7IH0KLQotLyogRm9yIHJlZ3VsYXIgZGl2IGxhYmVscyAqLwotI3BhZ2UtY29udGVudCBkaXYgSDQgewotCXBhZGRpbmcgOiAxMHB4OwotCW1hcmdpbi1ib3R0b20gOiA1cHg7Ci19Ci0KLS8qIEZvciB0aGUgbWFpbiBwYWdlIGNvbnRlbnQncyBkaXYgbGFiZWwgKi8KLSNwYWdlLWNvbnRlbnQgI2NvbnRlbnQtaGVhZGVyIEg0IHsKLQlwYWRkaW5nLWJvdHRvbSA6IDEwcHg7Ci0JcGFkZGluZy10b3AgOiAwcHg7Ci19Ci0KLS8qIHNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSdzIG1haW4gY29udGVudC1oZWFkZXIgbGFiZWwuCi0gICBNb3ppbGxhIDEuNCBuZWVkcyBtb3JlIHJvb20gYXQgdGhlIHRvcCAqLwotI3BhZ2UtY29udGVudCA+ICNjb250ZW50LWhlYWRlciBINCB7IHBhZGRpbmctdG9wIDogMTBweDsgfQotCi0vKiBOZWVkZWQgaW4gSUUgdG8gZ2V0IHNoaWZ0K3RhYiB0byBzaG93IHRoZSBhY3RpdmUgaW1hZ2UgcHJvcGVybHkgKi8KLWE6YWN0aXZlIHsKLQlib3JkZXIgOiBzb2xpZCAwcHg7Ci19Ci0KLWEgaW1nIHsKLQlib3JkZXItd2lkdGggOiAwOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotfQotCi0vKgotICogdG8gZ2V0IHNjcm9sbGJhcnMgd29ya2luZyBpbiBib3RoIElFIGFuZCBNb3ppbGxhCi0gKi8KLWh0bWwsYm9keSB7IG92ZXJmbG93OiBhdXRvOyB9Ci1odG1sPmJvZHkgeyBvdmVyZmxvdzogdmlzaWJsZTsgfQotCi0vKgotICogU2V0IHVwIHRoZSBib2R5LCBkZWNvcmF0aXZlIGJhY2tncm91bmQsIGFuZCBuYXZpZ2F0aW9uIGZvciB0aGUgY29udGVudCAKLSAqIHBhZ2VzLiAKLSAqIE5vdGU6IHRoZSByb290IHBhZ2UgaGFuZGxlcyBpdHMgb3duIGJhY2tncm91bmQgYW5kIG5hdmlnYXRpb247IHRoZXNlCi0gKiBzZXR0aW5ncyBwcmltYXJpbHkgYXBwbHkgdG8gdGhlIGNvbnRlbnQgcGFnZXMKLSAqLwotYm9keSB7Ci0JYmFja2dyb3VuZC1jb2xvciA6ICNGRkZGRkY7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSByaWdodDsKLQliYWNrZ3JvdW5kLWF0dGFjaG1lbnQgOiBmaXhlZDsKLX0KLQotI2JhY2tncm91bmQtaW1hZ2UgewotCXdpZHRoIDogMTAwJTsKLQloZWlnaHQgOiAxNjRweDsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuanBnKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogdG9wIGxlZnQ7CQotCXBvc2l0aW9uIDogYWJzb2x1dGU7Ci0JdG9wIDogMHB4OwotCXotaW5kZXggOiAtMTAwOwotfQotCi0jY3VydmUtaW1hZ2UgeyAKLQl3aWR0aCA6IDEwMCU7Ci0JaGVpZ2h0IDogMTY0cHg7Ci0JcG9zaXRpb24gOiBhYnNvbHV0ZTsKLQl0b3AgOiAwcHg7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmdpZik7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBjZW50ZXI7Ci0JbWFyZ2luIDogMDsKLQlwYWRkaW5nIDogMDsKLX0KLQotLmludHJvLWhlYWRlciB7CWJhY2tncm91bmQtY29sb3IgOiB0cmFuc3BhcmVudDsgei1pbmRleCA6IDEwMDt9Ci0KLWJvZHksIC5wYWdlewotCW1pbi13aWR0aCA6IDc3MHB4OwotCS8qIHNpbmNlIElFIGRvZXNuJ3Qgc3VwcG9ydCBtaW4td2lkdGgsIHRyeSBleHByZXNzaW9uICovCi0Jd2lkdGg6ZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgNzcwPyAiNzcwcHgiOiAiYXV0byIgKTsKLQltaW4taGVpZ2h0IDogNDI1cHg7Ci0JaGVpZ2h0IDogMTAwJTsKLQloZWlnaHQgOiBleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IDwgNDI1PyAiNDI1cHgiOiAiMTAwJSIgKTsKLX0KLQotLnBhZ2UgeyAKLQltaW4taGVpZ2h0IDogNDc1cHg7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9iYWNrZ3JvdW5kLmpwZyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiByZXBlYXQteDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogdG9wIGxlZnQ7Ci19Ci0KLSNwYWdlLWNvbnRlbnQgewotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiBib3R0b20gcmlnaHQ7Ci0JaGVpZ2h0IDogNzAlOwotfQotCi0vKiAKLSAqIExheSBvdXQgdGhlIG5hdmlnYXRpb24gbGlua3MgCi0gKiAoUm9vdCBwYWdlIGRvZXMgc29tZXRoaW5nIHNpbWlsYXIgZm9yIGl0cyBuYXZpZ2F0aW9uKQotICovCi0jbmF2aWdhdGlvbi1saW5rcyB7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQlsZWZ0IDogMTBweDsKLQl0b3AgOiA1cHg7Ci0JaGVpZ2h0IDogNjA7Ci0Jd2lkdGggOiA5OCU7Ci19Ci0KLQotI25hdmlnYXRpb24tbGlua3MgYSB7Ci0JcGFkZGluZy1sZWZ0IDogNXB4OwotCXBhZGRpbmctcmlnaHQgOiA1cHg7Ci0JZmxvYXQgOiBsZWZ0OwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1MnB4OwotCXdpZHRoIDogNTJweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSAubGluay1sYWJlbCB7IGRpc3BsYXkgOiBibG9jazsgbWFyZ2luLXRvcCA6IDVweDt9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLnRleHQgeyBkaXNwbGF5IDogbm9uZTsgfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhOmhvdmVyLCAKLSNuYXZpZ2F0aW9uLWxpbmtzIGE6Zm9jdXMgCi0jbmF2aWdhdGlvbi1saW5rcyBhOmFjdGl2ZSB7IGJvcmRlci1yaWdodCA6IDBweDt9Ci0KLS8qIHByb3BlcnRpZXMgZm9yIGVhY2ggb2YgdGhlIG5hdmlnYXRpb24tbGlua3MgICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6Zm9jdXMgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFscyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmFjdGl2ZSBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczpmb2N1cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4LmdpZik7IH0KLS8qI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzOmFjdGl2ZSBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6Zm9jdXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvc2FtcGxlczQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9yZXR1c2VyNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvcmV0dXNlcjQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9yZXR1c2VyNDhzZWwuZ2lmKTsgfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dlYjphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDhzZWwuZ2lmKTsgfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3N0ZXBzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3N0ZXBzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvZmlyc3RlcHM0OC5naWYpOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3N0ZXBzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDhzZWwuZ2lmKTsgfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCB7IHBvc2l0aW9uIDogYWJzb2x1dGU7ICByaWdodCA6IDBweDsgdG9wIDogLTM1cHg7IHRleHQtYWxpZ24gOiByaWdodDt9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCAubGluay1sYWJlbCB7IHZpc2liaWxpdHkgOiBoaWRkZW47IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmhvdmVyIC5saW5rLWxhYmVsIHsgdmlzaWJpbGl0eSA6IHZpc2libGU7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoIC50ZXh0IHsgZGlzcGxheSA6IG5vbmU7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2I0OC5naWYpOyB3aWR0aCA6IDUzcHg7IGhlaWdodCA6IDUzcHg7fQotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2g6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2g6Zm9jdXMgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN3b3JrYmVuY2g6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2I0OC5naWYpOyB9Ci0KLS8qIAotICogTGF5IG91dCB0aGUgcGFnZSB0aXRsZSBhbmQgZGVzY3JpcHRpb24gCi0gKi8KLWgxLCBwIHsgbWFyZ2luLWxlZnQgOiAxMHB4OyB9IC8qIHJlcXVpcmVkIGluIG1vemlsbGEgc28gdGhlIHBhZ2UgZGVzY3JpcHRpb24gaXMgcHJvcGVybHkgaW5kZW50ZWQgKi8KLQotLyogcG9zaXRpb24gdGhlIHBhZ2UgY29udGVudCBzbyB0aGF0IHRoZSBwYWdlIHRpdGxlIG92ZXJsYXlzIHRoZSBib3R0b20KLSAqIG9mIHRoZSBiYWNrZ3JvdW5kIGltYWdlLCBidXQgbWFrZSBzdXJlIHRoZSBjb250ZW50IGlzIGFsd2F5cyBvbiB0b3AgCi0gKiAodXNpbmcgei1pbmRleCkgKi8KLSNwYWdlLWNvbnRlbnQgewotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLQltYXJnaW4tdG9wIDogMzVweDsKLX0KLQotLnBhZ2UgPiAjcGFnZS1jb250ZW50IHsgbWFyZ2luLXRvcCA6IDUwcHg7IH0KLQotI3BhZ2UtY29udGVudCBwIHsgCi0JcGFkZGluZy1ib3R0b20gOiAxNXB4OyAKLQl0ZXh0LWFsaWduIDogbGVmdDsgCi0JZmxvYXQgOiBub25lOwotCWNsZWFyIDogYm90aDsKLX0KLQotI3BhZ2UtY29udGVudCAjY29udGVudC1oZWFkZXIgSDQsIC5wYWdlLWRlc2NyaXB0aW9uIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQltYXJnaW4tcmlnaHQgOiAxMHB4OwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLS5wYWdlLWRlc2NyaXB0aW9uIHsKLQl0ZXh0LWFsaWduIDogbGVmdDsKLQltYXJnaW4tcmlnaHQgOiAxMHB4OwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLS8qCi0gKiBOYXZpZ2F0aW9uIExpbmtzIChiYWNrLCBmb3J3YXJkIGFuZCBob21lKQotICovCi0KLSNuYXYtbGlua3MgewotCXdpZHRoIDogOTglOwotCXBvc2l0aW9uIDogYWJzb2x1dGU7Ci0JbGVmdCA6IDBweDsKLQl0b3AgOiA2NXB4OwotfQotCi1hI2JhY2sgeyAKLQlwb3NpdGlvbiA6IGFic29sdXRlOyAKLQl0b3AgOiA2NXB4OwotCXJpZ2h0IDogMjBweDsKLQl0ZXh0LWFsaWduIDogcmlnaHQ7ICAKLX0KLQotYSNiYWNrIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9iYWNrLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci19Ci0KLWEjYmFjazpob3ZlciBpbWcsCi1hI2JhY2s6Zm9jdXMgaW1nLAotYSNiYWNrOmFjdGl2ZSBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvYmFjay5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLX0KLQotYSNmb3J3YXJkIHsgCi0JcG9zaXRpb24gOiBhYnNvbHV0ZTsgCi0JdG9wIDogNjVweDsKLQlyaWdodCA6IC04cHg7Ci0JdGV4dC1hbGlnbiA6IHJpZ2h0OyAgCi19Ci0KLWEjZm9yd2FyZCBpbWcgewotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZm9yd2FyZC5naWYpOyAKLQloZWlnaHQgOiA1NnB4OwotCXdpZHRoIDogNTZweDsKLQl0ZXh0LWFsaWduIDogY2VudGVyOwotfQotCi1hI2ZvcndhcmQ6aG92ZXIgaW1nLAotYSNmb3J3YXJkOmZvY3VzIGltZywKLWEjZm9yd2FyZDphY3RpdmUgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2ZvcndhcmQuZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci19Ci0KLWEjaG9tZSB7IAotCXBvc2l0aW9uIDogYWJzb2x1dGU7IAotCXRvcCA6IDY1cHg7Ci0JcmlnaHQgOiA2MHB4OwotCXRleHQtYWxpZ24gOiByaWdodDsgIAotfQotCi1hI2hvbWUgaW1nIHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL2hvbWUuZ2lmKTsgCi0JaGVpZ2h0IDogNTZweDsKLQl3aWR0aCA6IDU2cHg7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLX0KLQotYSNob21lOmhvdmVyIGltZywKLWEjaG9tZTpmb2N1cyBpbWcsCi1hI2hvbWU6YWN0aXZlIGltZyB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9ob21lLmdpZik7IAotCWhlaWdodCA6IDU2cHg7Ci0Jd2lkdGggOiA1NnB4OwotfQotCi0KLS8qIGhpZGUgdGhlIGxpbmsgYW5kIGRlc2NyaXB0aW9uIHVudGlsIHVzZXJzIGhvdmVyIG92ZXIgdGhlIGxpbmsgKi8KLSNuYXYtbGlua3MgYSBwIC50ZXh0LCAjbmF2LWxpbmtzIGEgLmxpbmstbGFiZWwgeyBkaXNwbGF5IDogbm9uZTsgfQotCi0jbmF2LWxpbmtzIGE6aG92ZXIgLmxpbmstbGFiZWwsCi0jbmF2LWxpbmtzIGE6Zm9jdXMgLmxpbmstbGFiZWwsCi0jbmF2LWxpbmtzIGE6YWN0aXZlIC5saW5rLWxhYmVsIHsgZGlzcGxheSA6IGJsb2NrOyB3aWR0aCA6IDE2ZW07IH0KLQotI25hdi1saW5rcyBhOmhvdmVyIHAgLnRleHQsCi0jbmF2LWxpbmtzIGE6Zm9jdXMgcCAudGV4dCwKLSNuYXYtbGlua3MgYTphY3RpdmUgcCAudGV4dCB7CWRpc3BsYXkgOiBibG9jazsgd2lkdGggOiAxNmVtOyB9Ci0KLSNuYXYtbGlua3MgYTpob3ZlciwKLSNuYXYtbGlua3MgYTpmb2N1cywKLSNuYXYtbGlua3MgYTphY3RpdmUgeyBib3JkZXItcmlnaHQgOiAwcHg7IH0KLQotLyoKLSAqIFRyYW5zaXRpb24gcGFnZSBjc3Mgc2V0dGluZ3MKLSAqLwotCi0jdC1saW5rcyB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0Jd2lkdGggOiA3NjBweDsKLQkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JCi0JbWFyZ2luOiAwcHggYXV0bzsKLX0KLQotI3QtbGlua3MgYSB7IAotCXdpZHRoIDogMzcwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCW1hcmdpbi1sZWZ0IDogNXB4OwotCW1hcmdpbi1yaWdodCA6IDVweDsKLQltYXJnaW4tdG9wIDogNXB4OwotCW1hcmdpbi1ib3R0b20gOiAtMjBweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDsKLX0KLQotI3QtbGlua3MgPiBhIHsgdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7IH0KLQotI3QtbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDU3cHg7Ci0Jd2lkdGggOiA1N3B4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0jdC1saW5rcyBhIC5saW5rLWxhYmVsIHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC01MHB4OwotCWxlZnQgOiA2MHB4OwotfQotCi0jdC1saW5rcyBhIHAgLnRleHQgewotCWRpc3BsYXkgOiBibG9jazsKLQl3aWR0aCA6IDMwMHB4OwotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JdG9wIDogLTQ1cHg7Ci0JbGVmdCA6IDUzcHg7Ci19Ci0KLS8qIAotICogU3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhLCBiZWNhdXNlIHRoZSBsaW5rcyBhcmUgZGlzcGxheWVkCi0gKiBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAKLSAqLwotCi0jdC1saW5rcyA+IGEgeyAJd2lkdGggOiA3MDBweDsgfQotI3QtbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI3QtbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSN0LWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KLQotCi0vKioqIEJhY2t1cCBMaW5rIEltYWdlICoqKi8KLQotYSN0LWxpbmtzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYpOyB9Ci1hI3QtbGlua3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9uZXdob3Zfb2JqLmdpZik7IH0KLQotYSNmb2xkZXJfc3RlcHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI2ZvbGRlcl9zdGVwczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9maXJzdHN0ZXBzaG92LmdpZik7IH0KLQotYSNmb2xkZXJfbmV3d2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX25ld3dlYi5naWYpOyB9Ci1hI2ZvbGRlcl9uZXd3ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfbmV3d2ViaG92LmdpZik7IH0KLQotYSNmb2xkZXJfaW1wb3J0d2ViIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2ltcG9ydHdlYi5naWYpOyB9Ci1hI2ZvbGRlcl9pbXBvcnR3ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaW1wb3J0d2ViaG92LmdpZik7IH0KLQotYSNmb2xkZXJfaGVscCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9oZWxwLmdpZik7IH0KLWEjZm9sZGVyX2hlbHA6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfaGVscGhvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX292ZXJ2aWV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3LmdpZik7IH0KLWEjZm9sZGVyX292ZXJ2aWV3OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX292ZXJ2aWV3aG92LmdpZik7IH0KLQotYSNmb2xkZXJfYWR2YXBwcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9hZHZhcHBzLmdpZik7IH0KLWEjZm9sZGVyX2FkdmFwcHM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfYWR2YXBwc2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX2RldndlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9kZXZ3ZWIuZ2lmKTsgfQotYSNmb2xkZXJfZGV2d2ViOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX2RldndlYmhvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX3NhbXBsZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfc2FtcGxlcy5naWYpOyB9Ci1hI2ZvbGRlcl9zYW1wbGVzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3NhbXBsZXNob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl90dXRvcmlhbHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfdHV0b3JpYWxzLmdpZik7IH0KLWEjZm9sZGVyX3R1dG9yaWFsczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl90dXRvcmlhbHNob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl93ZWIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9mb2xkZXJfd2ViLmdpZik7IH0KLWEjZm9sZGVyX3dlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl93ZWJob3YuZ2lmKTsgfQotCi1hI2ZvbGRlcl9yaWNocmVwb3J0cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0cy5naWYpOyB9Ci1hI2ZvbGRlcl9yaWNocmVwb3J0czpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2ZvbGRlcl9yaWNocmVwb3J0c2hvdi5naWYpOyB9Ci0KLWEjZm9sZGVyX3doYXRzbmV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3LmdpZik7IH0KLWEjZm9sZGVyX3doYXRzbmV3OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZm9sZGVyX3doYXRzbmV3aG92LmdpZik7IH0KLQotYSNnYWxsZXJ5X3NhbXBsZXMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXMuZ2lmKTsgfQotYSNnYWxsZXJ5X3NhbXBsZXM6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3NhbXBsZXNob3YuZ2lmKTsgfQotCi1hI2dhbGxlcnlfdHV0b3JpYWxzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZ2FsbGVyeV90dXRvcmlhbHMuZ2lmKTsgfQotYSNnYWxsZXJ5X3R1dG9yaWFsczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzaG92LmdpZik7IH0KLQotYSNwYWdlX3N0ZXBzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZik7IH0KLWEjcGFnZV9zdGVwczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjcGFnZV9oZWxwIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwLmdpZik7IH0KLWEjcGFnZV9oZWxwOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9oZWxwaG92LmdpZik7IH0KLQotYSNwYWdlX292ZXJ2aWV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9vdmVydmlldy5naWYpOyB9Ci1hI3BhZ2Vfb3ZlcnZpZXc6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX292ZXJ2aWV3aG92LmdpZik7IH0KLQotYSNwYWdlX3dlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2ViLmdpZik7IH0KLWEjcGFnZV93ZWI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX3dlYmhvdi5naWYpOyB9Ci0KLWEjcGFnZV93aGF0c25ldyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2Vfd2hhdHNuZXcuZ2lmKTsgfQotYSNwYWdlX3doYXRzbmV3OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV93aGF0c25ld2hvdi5naWYpOyB9Ci0KLWEjZXBmX3Jlc291cmNlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlLmdpZik7IH0KLWEjZXBmX3Jlc291cmNlOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmX3Jlc291cmNlaG92LmdpZik7IH0KLQotYSNlcGYtb3YtdG91ciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi10b3VyLmdpZik7IH0KLWEjZXBmLW92LXRvdXI6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtdG91cmhvdi5naWYpOyB9Ci0KLWEjZXBmLW92LXJ1cG92IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92LmdpZik7IH0KLWEjZXBmLW92LXJ1cG92OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LXJ1cG92aG92LmdpZik7IH0KLQotYSNlcGYtb3YtbWV0aG9kIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LW1ldGhvZC5naWYpOyB9Ci1hI2VwZi1vdi1tZXRob2Q6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtbWV0aG9kaG92LmdpZik7IH0KLQotYSNlcGYtb3YtcHJvY2VzcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2VwZi1vdi1wcm9jZXNzLmdpZik7IH0KLWEjZXBmLW92LXByb2Nlc3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtcHJvY2Vzc2hvdi5naWYpOyB9Ci0KLWEjZXBmLW92LWNvbmZpZ3B1Ymxpc2ggaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9lcGYtb3YtY29uZmlncHVibGlzaC5naWYpOyB9Ci1hI2VwZi1vdi1jb25maWdwdWJsaXNoOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvZXBmLW92LWNvbmZpZ3B1Ymxpc2hob3YuZ2lmKTsgfQotCi1hI2VwZi1zdGVwcy1vbmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9wYWdlX2ZpcnN0c3RlcHMuZ2lmKTsgfQotYSNlcGYtc3RlcHMtb25lOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZik7IH0KLQotYSNlcGYtc3RlcHMtdHdvIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZik7IH0KLWEjZXBmLXN0ZXBzLXR3bzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwc2hvdi5naWYpOyB9Ci0KLWEjZXBmLXN0ZXBzLXRocmVlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzLmdpZik7IH0KLWEjZXBmLXN0ZXBzLXRocmVlOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZik7IH0KLQotYSNlcGYtc3RlcHMtZm91ciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3BhZ2VfZmlyc3RzdGVwcy5naWYpOyB9Ci1hI2VwZi1zdGVwcy1mb3VyOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvcGFnZV9maXJzdHN0ZXBzaG92LmdpZik7IH0KLQotYSNlcGYtdHV0LWdhbGxlcnkgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC9nYWxsZXJ5X3R1dG9yaWFscy5naWYpOyB9Ci1hI2VwZi10dXQtZ2FsbGVyeTpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L2dhbGxlcnlfdHV0b3JpYWxzaG92LmdpZik7IH0KLQotYSNlcGYtdHV0LWVsZW1lbnQgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X21ldGhjb250X29iai5naWYpOyB9Ci1hI2VwZi10dXQtZWxlbWVudDpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRob3Zfb2JqLmdpZik7IH0KLQotYSNlcGYtdHV0LW5hdmlnYXRlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aV9vYmouZ2lmKTsgfQotYSNlcGYtdHV0LW5hdmlnYXRlOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9uYXZ1aWhvdl9vYmouZ2lmKTsgfQotCi1hI2VwZi10dXQtY29udGVudCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfcmVtZXRoY29udF9vYmouZ2lmKTsgfQotYSNlcGYtdHV0LWNvbnRlbnQ6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3JlbWV0aGNvbnRob3Zfb2JqLmdpZik7IH0KLQotYSNlcGYtdHV0LXByb2Nlc3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9vYmo0OC90X3dvcmtwcm9jX29iai5naWYpOyB9Ci1hI2VwZi10dXQtcHJvY2Vzczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3Rfd29ya3Byb2Nob3Zfb2JqLmdpZik7IH0KLQotYSNlcGYtdHV0LXB1YmV4cCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwX29iai5naWYpOyB9Ci1hI2VwZi10dXQtcHViZXhwOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9wdWJleHBob3Zfb2JqLmdpZik7IH0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc2hhcmVkX2VjbGlwc2UuY3NzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zaGFyZWRfZWNsaXBzZS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNDQ0ZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zaGFyZWRfZWNsaXBzZS5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqLwotCi0vKiAKLSAqIFNldCB1cCBnZW5lcmFsIGZvbnRzLCBzaXplcyBhbmQgY29sb3JzIAotICovCi1ib2R5IHsgZm9udC1mYW1pbHkgOiBBcmlhbCwgc2Fucy1zZXJpZjsgfQotCi1IMSwgSDIsIEgzLCBINCwgcCwgYSB7IGNvbG9yIDogIzRENEQ0RDsgfQotCi0uaW50cm8taGVhZGVyIEgxIHsKLQlmb250LXNpemUgOiAxNnB0OwotCWZvbnQtd2VpZ2h0IDogbm9ybWFsOwotCWNvbG9yIDogI0U1RTVFNTsKLX0KLQotaDIgewotCWZvbnQtc2l6ZSA6IDEzcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjN0I4Njk0OwotfQotLyogRm9yIHJlZ3VsYXIgZGl2IGxhYmVscyAqLwotSDQgLmRpdi1sYWJlbCB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci19Ci0KLS8qIEZvciB0aGUgbWFpbiBwYWdlIGNvbnRlbnQncyB0aXRsZSAqLwotI2NvbnRlbnQtaGVhZGVyIEg0IC5kaXYtbGFiZWwgewotCWZvbnQtc2l6ZSA6IDE0cHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci0JY29sb3IgOiAjOEM5NkEyOwotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLS5wYWdlLWRlc2NyaXB0aW9uIHsgCi0JZm9udC1zaXplIDogMTBwdDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCi1hIHsKLQlmb250LXdlaWdodCA6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uIDogbm9uZTsKLQljb2xvciA6ICM0RDRENEQ7Ci19Ci0KLWEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCWZvbnQtc2l6ZSA6IDlwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLWEgLnRleHQgewotCWZvbnQtc2l6ZSA6IDhwdDsKLQlmb250LXdlaWdodCA6IG5vcm1hbDsKLX0KLQotcCAuZ3JvdXAtZGVzY3JpcHRpb24gewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiBub3JtYWw7Ci19Ci0KLQotLyogCi0gKiBTZXQgdXAgb3RoZXIgZ2VuZXJhbCBwcm9wZXJ0aWVzIGxpa2UgcGFkZGluZy9tYXJnaW5zCi0gKi8KLWh0bWwsIGJvZHkgeyB3aWR0aCA6IDEwMCU7IGhlaWdodCA6IDEwMCU7IH0KLQotaHRtbCwgYm9keSwgZGl2LCBoMSwgaDQsIHAsIGEgeyBtYXJnaW4gOiAwcHg7IHBhZGRpbmcgOiAwcHg7IH0KLQotLmludHJvLWhlYWRlciBIMSB7IHBhZGRpbmctdG9wIDogMTBweDsgbWFyZ2luLWxlZnQgOiAxMHB4OyB9Ci0KLS8qIEZvciByZWd1bGFyIGRpdiBsYWJlbHMgKi8KLSNwYWdlLWNvbnRlbnQgZGl2IEg0IHsKLQlwYWRkaW5nIDogMTBweDsKLQlwYWRkaW5nLWJvdHRvbSA6IDBweDsKLX0KLQotLyogRm9yIHRoZSBtYWluIHBhZ2UgY29udGVudCdzIGRpdiBsYWJlbCAqLwotI3BhZ2UtY29udGVudCAjY29udGVudC1oZWFkZXIgSDQgewotCXBhZGRpbmctYm90dG9tIDogMTBweDsKLQlwYWRkaW5nLXRvcCA6IDBweDsKLX0KLQotLyogc3BlY2lhbCBjYXNlIGZvciBNb3ppbGxhJ3MgbWFpbiBjb250ZW50LWhlYWRlciBsYWJlbC4KLSAgIE1vemlsbGEgMS40IG5lZWRzIG1vcmUgcm9vbSBhdCB0aGUgdG9wICovCi0jcGFnZS1jb250ZW50ID4gI2NvbnRlbnQtaGVhZGVyIEg0IHsgcGFkZGluZy10b3AgOiAxMHB4OyB9Ci0KLS8qIE5lZWRlZCBpbiBJRSB0byBnZXQgc2hpZnQrdGFiIHRvIHNob3cgdGhlIGFjdGl2ZSBpbWFnZSBwcm9wZXJseSAqLwotYTphY3RpdmUgewotCWJvcmRlciA6IHNvbGlkIDBweDsKLX0KLQotYSBpbWcgewotCWJvcmRlci13aWR0aCA6IDA7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci19Ci0KLS8qCi0gKiB0byBnZXQgc2Nyb2xsYmFycyB3b3JraW5nIGluIGJvdGggSUUgYW5kIE1vemlsbGEKLSAqLwotaHRtbCxib2R5IHsgb3ZlcmZsb3c6IGF1dG87IH0KLWh0bWw+Ym9keSB7IG92ZXJmbG93OiB2aXNpYmxlOyB9Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGJvZHksIGRlY29yYXRpdmUgYmFja2dyb3VuZCwgYW5kIG5hdmlnYXRpb24gZm9yIHRoZSBjb250ZW50IAotICogcGFnZXMuIAotICogTm90ZTogdGhlIHJvb3QgcGFnZSBoYW5kbGVzIGl0cyBvd24gYmFja2dyb3VuZCBhbmQgbmF2aWdhdGlvbjsgdGhlc2UKLSAqIHNldHRpbmdzIHByaW1hcmlseSBhcHBseSB0byB0aGUgY29udGVudCBwYWdlcwotICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWNvbG9yIDogI0ZGRkZGRjsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogYm90dG9tIHJpZ2h0OwotfQotCi0jYmFja2dyb3VuZC1pbWFnZSB7Ci0Jd2lkdGggOiAxMDAlOwotCW1pbi13aWR0aCA6IDc3MHB4OwotCWhlaWdodCA6IDE2NHB4OwotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2UvYmFja2dyb3VuZC5qcGcpOwotCWJhY2tncm91bmQtcmVwZWF0IDogbm8tcmVwZWF0OwotCWJhY2tncm91bmQtcG9zaXRpb24gOiB0b3AgbGVmdDsJCi0JcG9zaXRpb24gOiBhYnNvbHV0ZTsKLQl0b3AgOiAwcHg7Ci0Jei1pbmRleCA6IC0xMDA7Ci19Ci0KLSNjdXJ2ZS1pbWFnZSB7IAotCXdpZHRoIDogMTAwJTsKLQloZWlnaHQgOiAxNjRweDsKLQlwb3NpdGlvbiA6IGFic29sdXRlOwotCXRvcCA6IDBweDsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL2JhY2tncm91bmQuZ2lmKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogdG9wIGNlbnRlcjsKLQltYXJnaW4gOiAwOwotCXBhZGRpbmcgOiAwOwotfQotCi0uaW50cm8taGVhZGVyIHsJYmFja2dyb3VuZC1jb2xvciA6IHRyYW5zcGFyZW50OyB6LWluZGV4IDogMTAwO30KLQotYm9keSwgLnBhZ2V7Ci0JbWluLXdpZHRoIDogNzcwcHg7Ci0JLyogc2luY2UgSUUgZG9lc24ndCBzdXBwb3J0IG1pbi13aWR0aCwgdHJ5IGV4cHJlc3Npb24gKi8KLQl3aWR0aDpleHByZXNzaW9uKGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGggPCA3NzA/ICI3NzBweCI6ICJhdXRvIiApOwotCW1pbi1oZWlnaHQgOiA0MjVweDsKLQloZWlnaHQgOiAxMDAlOwotCWhlaWdodCA6IGV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgPCA0MjU/ICI0MjVweCI6ICIxMDAlIiApOwotfQotCi0ucGFnZSB7IAotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvY29udGVudHBhZ2Uvd29yZG1hcmsuZ2lmKTsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogYm90dG9tIGxlZnQ7Ci0JbWluLWhlaWdodCA6IDQ3NXB4OwotfQotCi0jcGFnZS1jb250ZW50IHsKLQliYWNrZ3JvdW5kLXJlcGVhdCA6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uIDogYm90dG9tIHJpZ2h0OwotCWhlaWdodCA6IDcwJTsKLX0KLQotLyogCi0gKiBMYXkgb3V0IHRoZSBuYXZpZ2F0aW9uIGxpbmtzIAotICogKFJvb3QgcGFnZSBkb2VzIHNvbWV0aGluZyBzaW1pbGFyIGZvciBpdHMgbmF2aWdhdGlvbikKLSAqLwotI25hdmlnYXRpb24tbGlua3MgewotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JbGVmdCA6IDEwcHg7Ci0JdG9wIDogNXB4OwotCWhlaWdodCA6IDYwOwotCXdpZHRoIDogOTglOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIHsKLQlwYWRkaW5nLWxlZnQgOiA1cHg7Ci0JcGFkZGluZy1yaWdodCA6IDVweDsKLQlmbG9hdCA6IGxlZnQ7Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLX0KLQotI25hdmlnYXRpb24tbGlua3MgYSBpbWcgewotCWhlaWdodCA6IDUycHg7Ci0Jd2lkdGggOiA1MnB4OwotCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOwotfQotCi0jbmF2aWdhdGlvbi1saW5rcyBhIC5saW5rLWxhYmVsIHsgZGlzcGxheSA6IGJsb2NrOyBtYXJnaW4tdG9wIDogNXB4O30KLQotI25hdmlnYXRpb24tbGlua3MgYSAudGV4dCB7IGRpc3BsYXkgOiBub25lOyB9Ci0KLSNuYXZpZ2F0aW9uLWxpbmtzIGE6aG92ZXIsIAotI25hdmlnYXRpb24tbGlua3MgYTpmb2N1cyAKLSNuYXZpZ2F0aW9uLWxpbmtzIGE6YWN0aXZlIHsgYm9yZGVyLXJpZ2h0IDogMHB4O30KLQotLyogcHJvcGVydGllcyBmb3IgZWFjaCBvZiB0aGUgbmF2aWdhdGlvbi1saW5rcyAgKi8KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXcgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldzQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjb3ZlcnZpZXc6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzpmb2N1cyBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3OmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6aG92ZXIgaW1nLAotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHM6YWN0aXZlIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjdHV0b3JpYWxzOmZvY3VzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNDguZ2lmKTsgfQotLyojbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OHNlbC5naWYpOyB9Ki8KLQotI25hdmlnYXRpb24tbGlua3MgYSNzYW1wbGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZik7IH0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczpob3ZlciBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI3NhbXBsZXM6YWN0aXZlIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczpmb2N1cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjc2FtcGxlczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9zYW1wbGVzNDhzZWwuZ2lmKTsgfSovCi0KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDguZ2lmKTsgfQotI25hdmlnYXRpb24tbGlua3MgYSNuZXdzOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czpmb2N1cyBpbWcsCi0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OC5naWYpOyB9Ci0vKiNuYXZpZ2F0aW9uLWxpbmtzIGEjbmV3czphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4c2VsLmdpZik7IH0qLwotCi0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCB7IHBvc2l0aW9uIDogYWJzb2x1dGU7ICByaWdodCA6IDBweDsgdG9wIDogLTM1cHg7IHRleHQtYWxpZ24gOiByaWdodDt9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCAudGV4dCB7IGRpc3BsYXkgOiBub25lOyB9Ci0jbmF2aWdhdGlvbi1saW5rcyBhI3dvcmtiZW5jaCBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3diNDguZ2lmKTsgd2lkdGggOiA1M3B4OyBoZWlnaHQgOiA1M3B4O30KLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmhvdmVyIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmZvY3VzIGltZywKLSNuYXZpZ2F0aW9uLWxpbmtzIGEjd29ya2JlbmNoOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3diNDguZ2lmKTsgfQotCi0vKiAKLSAqIExheSBvdXQgdGhlIHBhZ2UgdGl0bGUgYW5kIGRlc2NyaXB0aW9uIAotICovCi1oMSwgcCB7IG1hcmdpbi1sZWZ0IDogMTBweDsgfSAvKiByZXF1aXJlZCBpbiBtb3ppbGxhIHNvIHRoZSBwYWdlIGRlc2NyaXB0aW9uIGlzIHByb3Blcmx5IGluZGVudGVkICovCi0KLS8qIHBvc2l0aW9uIHRoZSBwYWdlIGNvbnRlbnQgc28gdGhhdCB0aGUgcGFnZSB0aXRsZSBvdmVybGF5cyB0aGUgYm90dG9tCi0gKiBvZiB0aGUgYmFja2dyb3VuZCBpbWFnZSwgYnV0IG1ha2Ugc3VyZSB0aGUgY29udGVudCBpcyBhbHdheXMgb24gdG9wIAotICogKHVzaW5nIHotaW5kZXgpICovCi0jcGFnZS1jb250ZW50IHsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotCXRleHQtYWxpZ24gOiBjZW50ZXI7Ci0JbWFyZ2luLXRvcCA6IDM1cHg7Ci19Ci0KLS5wYWdlID4gI3BhZ2UtY29udGVudCB7IG1hcmdpbi10b3AgOiA1MHB4OyB9Ci0KLSNwYWdlLWNvbnRlbnQgcCB7IAotCXBhZGRpbmctYm90dG9tIDogMTVweDsgCi0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCWZsb2F0IDogbm9uZTsKLQljbGVhciA6IGJvdGg7Ci19Ci0KLSNwYWdlLWNvbnRlbnQgI2NvbnRlbnQtaGVhZGVyIEg0LCAucGFnZS1kZXNjcmlwdGlvbiB7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7Ci0JbWFyZ2luLXJpZ2h0IDogMTBweDsKLQlmbG9hdCA6IG5vbmU7Ci0JY2xlYXIgOiBib3RoOwotfQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfcm9vdC5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfcm9vdC5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDUyMTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy9zdGFuZGJ5X3Jvb3QuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotLyogCi0gKiBTZXQgdXAgZ2VuZXJhbCBmb250IGNvbG91cnMsIHNpemVzLCBldGMuICBTb21lIG9mIHRoZXNlIHdpbGwgb3ZlcnJpZGUKLSAqIHNldHRpbmdzIGZyb20gdGhlIHNoYXJlZCBDU1MgCi0gKi8KLS5pbnRyby1oZWFkZXIgSDEgewotCWZvbnQtc2l6ZSA6IDE1cHQ7Ci19Ci0KLSNwYWdlLWxpbmtzIGEgLmxpbmstbGFiZWwsICNhY3Rpb24tbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZm9udC1zaXplIDogMTBwdDsKLQlmb250LXdlaWdodCA6IDYwMDsKLQljb2xvciA6ICNFNUU1RTU7Ci19Ci0KLSNwYWdlLWxpbmtzIGEgcCAudGV4dCwgI2FjdGlvbi1saW5rcyBhIHAgLnRleHQgewotCWZvbnQtc2l6ZSA6IDEwcHQ7Ci0JZm9udC13ZWlnaHQgOiA1MDA7Ci0JY29sb3IgOiAjRTVFNUU1OwotfQotCi0vKgotICogU2V0IHVwIHRoZSBjb250ZW50IGZvciB0aGUgc3RhbmRieSBwYWdlLgotICovCi1ib2R5IHsKLQltaW4td2lkdGggOiAyMzBweDsKLQkvKiBzaW5jZSBJRSBkb2Vzbid0IHN1cHBvcnQgbWluLXdpZHRoLCB1c2UgZXhwcmVzc2lvbiAqLwotCXdpZHRoOmV4cHJlc3Npb24oZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCA8IDIzMD8gIjIzMHB4IjogImF1dG8iICk7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9yb290cGFnZS9iYWNrZ3JvdW5kLmpwZyk7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IHRvcCBsZWZ0OwotCWJhY2tncm91bmQtY29sb3IgOiAjNzE2OUQxOwotfQotCi0ucGFnZSB7IAotCWJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3Mvcm9vdHBhZ2UvYnJhbmRtYXJrLmdpZik7Ci0JYmFja2dyb3VuZC1yZXBlYXQgOiBuby1yZXBlYXQ7Ci0JYmFja2dyb3VuZC1wb3NpdGlvbiA6IGJvdHRvbSBsZWZ0OwotCW1pbi13aWR0aCA6IDIzMHB4OwotCS8qIHNpbmNlIElFIGRvZXNuJ3Qgc3VwcG9ydCBtaW4td2lkdGgsIHVzZSBleHByZXNzaW9uICovCi0Jd2lkdGg6ZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgMjMwPyAiMjMwcHgiOiAiYXV0byIgKTsKLSAJbWluLWhlaWdodCA6IDYxMHB4OwotCWhlaWdodCA6IDEwMCU7Ci0JaGVpZ2h0IDogZXhwcmVzc2lvbihkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCA8IDQ1MD8gIjQ1MHB4IjogIjEwMCUiICk7Ci19Ci0KLS8qIAotICogU2V0IHVwIHRoZSBuYXZpZ2F0aW9uIGJhci4gIEl0IHNob3VsZCBiZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlCi0gKiBvZiB0aGUgcGFnZQotICovCi0KLSNsaW5rcy1iYWNrZ3JvdW5kIHsgCi0Jd2lkdGggOiAxMDAlOyAKLSAJbWFyZ2luLXRvcCA6IDEwJTsgCi0JbWFyZ2luLWJvdHRvbSA6IGF1dG87Ci0JdGV4dC1hbGlnbiA6IGNlbnRlcjsKLX0KLQotI3BhZ2UtbGlua3MgYSB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMjIwcHg7Ci0JdGV4dC1hbGlnbiA6IGxlZnQ7IAotCW1hcmdpbi1sZWZ0IDogYXV0bzsKLQltYXJnaW4tcmlnaHQgOiBhdXRvOwotCW1hcmdpbi10b3AgOiAwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0jcGFnZS1saW5rcyBhIHNwYW4sICNwYWdlLWxpbmtzIGEgcCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMTYwcHg7Ci0JbWFyZ2luIDogMHB4OwotCXBhZGRpbmcgOiAwcHg7Ci19Ci0KLSNwYWdlLWxpbmtzIGEgLmxpbmstbGFiZWwgewotCXBvc2l0aW9uIDogcmVsYXRpdmU7Ci0JbGVmdCA6IDYwcHg7Ci0JdG9wIDogLTUwcHg7Ci19Ci0KLSNwYWdlLWxpbmtzIGEgcCAudGV4dCB7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQlsZWZ0IDogNjBweDsKLQl0b3AgOiAtNTBweDsKLQotfQotCi0jcGFnZS1saW5rcyBhIGltZyB7Ci0JaGVpZ2h0IDogNTJweDsKLQl3aWR0aCA6IDUycHg7Ci0JdmVydGljYWwtYWxpZ24gOiBtaWRkbGU7Ci19Ci0KLSNwYWdlLWxpbmtzIGE6aG92ZXIsCi0jcGFnZS1saW5rcyBhOmZvY3VzLAotI3BhZ2UtbGlua3MgYTphY3RpdmUgIHsgYm9yZGVyIDogMHB4OyB9Ci0KLSNwYWdlLWxpbmtzIGE6aG92ZXIgcCwKLSNwYWdlLWxpbmtzIGE6Zm9jdXMgcCwKLSNwYWdlLWxpbmtzIGE6YWN0aXZlIHAgIHsgbWFyZ2luIDogMHB4OyBwYWRkaW5nIDogMHB4OyB9Ci0KLS8qIHByb3BlcnRpZXMgZm9yIGVhY2ggb2YgdGhlIHBhZ2UtbGlua3MgICovCi1hI292ZXJ2aWV3IGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc0OC5naWYpOyB9Ci1hI292ZXJ2aWV3OmhvdmVyIGltZywKLWEjb3ZlcnZpZXc6Zm9jdXMgaW1nLAotYSNvdmVydmlldzphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzQ4LmdpZik7IH0KLWEjc3RlcHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC9maXJzdGVwczQ4LmdpZik7IH1hI3N0ZXBzOmhvdmVyIGltZyxhI3N0ZXBzOmZvY3VzIGltZyxhI3N0ZXBzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL2ZpcnN0ZXBzNDguZ2lmKTsgfQotYSN0dXRvcmlhbHMgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci1hI3R1dG9yaWFsczpob3ZlciBpbWcsCi1hI3R1dG9yaWFsczpmb2N1cyBpbWcsCi1hI3R1dG9yaWFsczphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC90dXRvcmlhbHM0OC5naWYpOyB9Ci1hI3dlYiBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3dlYnJzcmM0OC5naWYpOyB9YSN3ZWI6aG92ZXIgaW1nLGEjd2ViOmZvY3VzIGltZyxhI3dlYjphY3RpdmUgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNDguZ2lmKTsgfQotYSNzYW1wbGVzIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvZXRvb2wvc2FtcGxlczQ4LmdpZik7IH0KLWEjc2FtcGxlczpob3ZlciBpbWcsCi1hI3NhbXBsZXM6Zm9jdXMgaW1nLAotYSNzYW1wbGVzOmFjdGl2ZSBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL3NhbXBsZXM0OC5naWYpOyB9Ci0KLWEjbmV3cyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2V0b29sL3doYXRzbmV3NDguZ2lmKTsgfQotYSNuZXdzOmhvdmVyIGltZywKLWEjbmV3czpmb2N1cyBpbWcsCi1hI25ld3M6YWN0aXZlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvd2hhdHNuZXc0OC5naWYpOyB9Ci0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc3RhbmRieV9zd3QucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvc3RhbmRieV9zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3MjMxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3N0YW5kYnlfc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy5vdmVydmlldy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvb3ZlcnZpZXc3Mi5naWYKLXN0YW5kYnkubGlua3MtYmFja2dyb3VuZC5wYWdlLWxpbmtzLnN0ZXBzLmxpbmstaWNvbj0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL2ZpcnN0ZXBzNzIuZ2lmCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy50dXRvcmlhbHMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL2V0b29sL3R1dG9yaWFsczcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mud2ViLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC93ZWJyc3JjNzIuZ2lmCi0KLQotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Mub3ZlcnZpZXcuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9vdmVydmlldzcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3Muc3RlcHMuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC9maXJzdGVwczcyLmdpZgotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MudHV0b3JpYWxzLmhvdmVyLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvY3Rvb2wvdHV0b3JpYWxzNzIuZ2lmCi1zdGFuZGJ5LmxpbmtzLWJhY2tncm91bmQucGFnZS1saW5rcy53ZWIuaG92ZXItaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9jdG9vbC93ZWJyc3JjNzIuZ2lmCi0KLQotc3RhbmRieS5saW5rcy1iYWNrZ3JvdW5kLnBhZ2UtbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzAKLXN0YW5kYnkubGF5b3V0LnZzcGFjaW5nID0gMzUKLXN0YW5kYnkuc2hvdy1saW5rLWRlc2NyaXB0aW9uID0gZmFsc2UKLXN0YW5kYnkuc2hvdy1ob21lLXBhZ2UtbmF2aWdhdGlvbiA9IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXBsYWNlaG9sZGVyLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXItcGxhY2Vob2xkZXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NGJmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXItcGxhY2Vob2xkZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTxodG1sPgotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08aGVhZD4KLTx0aXRsZT5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIFRvdXI8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDM+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBUb3VyPC9oMz4KLTxici8+Ci08aDU+IEZsYXNoIGJhc2VkIG11bHRpbWVkaWEgY29udGVudCwgdG8gYmUgcHJvZHVjZWQ8L2g1PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLXN3dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNmZTNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci1zd3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLnBkZS5saW5rLWljb24gPSBjc3MvbmV3X2dyYXBoaWNzL29ial80OC9wbHVnaW5fb2JqLmdpZgotCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnBkZS5sYXlvdXQubmNvbHVtbnMgPSAyCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnBkZS5yY3AubGluay1pY29uID0gY3NzL25ld19ncmFwaGljcy9vYmpfNDgvcmNwYXBwX29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQucGRlLnBkZS1oZWxsby13b3JsZC5saW5rLWljb24gPSBjc3MvbmV3X2dyYXBoaWNzL29ial80OC9wbHVnaW5fb2JqLmdpZgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5wZGUuZmVhdHVyZXMubGluay1pY29uID0gY3NzL25ld19ncmFwaGljcy9vYmpfNDgvZmVhdHVyZXNfb2JqLmdpZgotCi1uZXdzLmxheW91dC5uY29sdW1ucyA9IDIKLW92ZXJ2aWV3LmxheW91dC5uY29sdW1ucyA9IDIKLW92ZXJ2aWV3LmxheW91dC5saW5rLXZzcGFjaW5nID0gNDAKLWZpcnN0c3RlcHMubGF5b3V0Lm5jb2x1bW5zID0gMQotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5sYXlvdXQubmNvbHVtbnMgPSAyCi1zYW1wbGVzLnBhZ2UtY29udGVudC5sYXlvdXQubmNvbHVtbnMgPSAyCi13ZWJyZXMucGFnZS1jb250ZW50LmxheW91dC5uY29sdW1ucyA9IDEKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdG91ci5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZWE2NWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybChncmFwaGljcy9jb250ZW50cGFnZS9vdmVydmlld193dHIuanBnKTsKLX0KLQotLnBhZ2UgeyBtaW4taGVpZ2h0IDogNzAwcHg7IH0KLQotLyogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI292ZXJ2aWV3IGltZywgI25hdmlnYXRpb24tbGlua3MgYSNvdmVydmlldzpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2ljb25zL2N0b29sL292ZXJ2aWV3NDhzZWwuZ2lmKTsgfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90b3VyLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjYWRjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3RvdXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGRpdiBpZD0id2VsY29tZS1iYW5uZXIiPgotIAk8T0JKRUNUIGNsYXNzaWQ9ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIgY29kZWJhc2U9Imh0dHA6Ly9kb3dubG9hZC5tYWNyb21lZGlhLmNvbS9wdWIvc2hvY2t3YXZlL2NhYnMvZmxhc2gvc3dmbGFzaC5jYWIjdmVyc2lvbj02LDAsMCwwIiBXSURUSD0iNzgwIiBIRUlHSFQ9IjQyNSIgaWQ9InRvdXIiIEFMSUdOPSIiPgotCTxQQVJBTSBOQU1FPW1vdmllIFZBTFVFPSJjc3MvdG91ci90b3VyLnN3ZiI+Ci0gCTxQQVJBTSBOQU1FPXF1YWxpdHkgVkFMVUU9aGlnaD4KLSAJPFBBUkFNIE5BTUU9Ymdjb2xvciBWQUxVRT0jRkZGRkZGPgotIAk8UEFSQU0gTkFNRT1GbGFzaFZhcnMgVkFMVUU9InRvdXJwYXRoPWNzcy90b3VyIj4KLSAJPEVNQkVEIHNyYz0iY3NzL3RvdXIvdG91ci5zd2YiIGZsYXNodmFycz0idG91cnBhdGg9Y3NzL3RvdXIiIHF1YWxpdHk9aGlnaCBiZ2NvbG9yPSNGRkZGRkYgIFdJRFRIPSI3ODAiIEhFSUdIVD0iNDI1IiBOQU1FPSJ0b3VyIiBBTElHTj0iIiBUWVBFPSJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIgUExVR0lOU1BBR0U9Imh0dHA6Ly93d3cubWFjcm9tZWRpYS5jb20vZ28vZ2V0Zmxhc2hwbGF5ZXIiPjwvRU1CRUQ+Ci0JPC9PQkpFQ1Q+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3N3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90dXRvcmlhbHMvc3d0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjc4NzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90dXRvcmlhbHMvc3d0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi10dXRvcmlhbHMubGF5b3V0Lm5jb2x1bW5zID0gMgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC5sYXlvdXQudnNwYWNpbmcgPSA0MAotCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzNQotCi10dXRvcmlhbHMuc3VidGl0bGUtaWQgPSB0dXRvcmlhbHMvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKLXR1dG9yaWFscy5kZXNjcmlwdGlvbi1pZCA9IHR1dG9yaWFscy9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgotCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5lcGYtdHV0LW5hdmlnYXRlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC90X25hdnVpX29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmVwZi10dXQtcHJvY2Vzcy5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF93b3JrcHJvY19vYmouZ2lmCi10dXRvcmlhbHMucGFnZS1jb250ZW50LnR1dG9yaWFscy1saW5rcy5lcGYtdHV0LWVsZW1lbnQubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfbWV0aGNvbnRfb2JqLmdpZgotdHV0b3JpYWxzLnBhZ2UtY29udGVudC50dXRvcmlhbHMtbGlua3MuZXBmLXR1dC1wdWJleHAubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RfcHViZXhwX29iai5naWYKLXR1dG9yaWFscy5wYWdlLWNvbnRlbnQudHV0b3JpYWxzLWxpbmtzLmVwZi10dXQtY29udGVudC5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdF9yZW1ldGhjb250X29iai5naWYKLSNvdmVydmlldy5wYWdlLWNvbnRlbnQub3ZlcnZpZXctbGlua3MuYmFzaWNzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmCi0jb3ZlcnZpZXcucGFnZS1jb250ZW50Lm92ZXJ2aWV3LWxpbmtzLnRlYW0ubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3RlYW1zdXBfb2JqLmdpZgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90dXRvcmlhbHMvdHV0b3JpYWxzLmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3MvdHV0b3JpYWxzL3R1dG9yaWFscy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTk0YjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy90dXRvcmlhbHMvdHV0b3JpYWxzLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9jb250ZW50cGFnZS90dXRvcmlhbHNfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDcwMHB4OyB9Ci0KLS8qIHNob3cgdGhlICJzZWxlY3RlZCIgaW1hZ2UgZm9yIHRoaXMgcGFnZSAqLwotI25hdmlnYXRpb24tbGlua3MgYSN0dXRvcmlhbHMgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI3R1dG9yaWFsczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL2N0b29sL3R1dG9yaWFsczQ4c2VsLmdpZik7IH0KLQotLyogCi0gKiBTZXQgdXAgdGhlIGNvbnRlbnQgb2YgdGhlIHR1dG9yaWFscyBwYWdlIGludG8gdHdvCi0gKiBjb2x1bW5zIHRoYXQgYXJlIGNlbnRlcmVkIGluIHRoZSBwYWdlCi0gKi8KLQotCi0jdHV0b3JpYWxzLWxpbmtzIHsJdGV4dC1hbGlnbiA6IGxlZnQ7CXdpZHRoIDogNzYwcHg7CS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwltYXJnaW4gOiAwcHggYXV0bzt9I3R1dG9yaWFscy1saW5rcyBhIHsgCXdpZHRoIDogMzcwcHg7CXRleHQtYWxpZ24gOiBsZWZ0OyAJbWFyZ2luLWxlZnQgOiA1cHg7CW1hcmdpbi1yaWdodCA6IDVweDsJbWFyZ2luLXRvcCA6IDVweDsJbWFyZ2luLWJvdHRvbSA6IC0yMHB4Owl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDt9I3R1dG9yaWFscy1saW5rcyA+IGEgeyB2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsgfSN0dXRvcmlhbHMtbGlua3MgYSBpbWcgewloZWlnaHQgOiA1N3B4Owl3aWR0aCA6IDU3cHg7CXZlcnRpY2FsLWFsaWduIDogbWlkZGxlO30JI3R1dG9yaWFscy1saW5rcyBhIC5saW5rLWxhYmVsIHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNTBweDsJbGVmdCA6IDYwcHg7fSN0dXRvcmlhbHMtbGlua3MgYSBwIC50ZXh0IHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNDVweDsJbGVmdCA6IDUzcHg7fS8qIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZCAgIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zICovI3R1dG9yaWFscy1saW5rcyA+IGEgeyAJd2lkdGggOiA3MDBweDsgfSN0dXRvcmlhbHMtbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfSN0dXRvcmlhbHMtbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9I3R1dG9yaWFscy1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9YSNiYXNpY3MgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC93YmJhc2ljc19vYmouZ2lmKTsgfWEjYmFzaWNzOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvd2JiYXNpY3Nob3Zfb2JqLmdpZik7IH1hI3RlYW0gaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC90ZWFtc3VwX29iai5naWYpOyB9YSN0ZWFtOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvdGVhbXN1cGhvdl9vYmouZ2lmKTsgfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy91bWFfaHVtcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3VtYV9odW1wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzMGZiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3VtYV9odW1wLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5jc3MgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjNhNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICovCi0KLS8qCi0gKiB3ZWJyZXNvdXJjZXMuY3NzIGlzIGEgdGVtcGxhdGUgZm9yIHRoZSBncm91cCBzcGVjaWZpYyBjc3Mgc2V0dGluZ3MKLSAqLwotIAotLyoKLSAqIGJhY2tncm91bmQgd2F0ZXJtYXJrIC0gZ3JvdXAgc3BlY2lmaWMKLSAqLwotCi1ib2R5IHsKLQliYWNrZ3JvdW5kLWltYWdlIDogdXJsKGdyYXBoaWNzL2NvbnRlbnRwYWdlL3dlYnJzcmNfd3RyLmpwZyk7Ci19Ci0KLS5wYWdlIHsgbWluLWhlaWdodCA6IDcwMHB4OyB9Ci0KLS8qCi0gKiBzaG93IHRoZSAic2VsZWN0ZWQiIGltYWdlIGZvciB0aGlzIHBhZ2UgLSBUaGlzIGlzIGdyb3VwIHNwZWNpZmljCi0gKi8KLQotI25hdmlnYXRpb24tbGlua3MgYSN3ZWIgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI3dlYjpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL2N0b29sL3dlYnJzcmM0OHNlbC5naWYpOyB9Ci0KLS8qIAotICogU2V0IHVwIHRoZSBPdmVydmlldyBsaW5rcyB0byBiZSBkaXNwbGF5ZWQgaW4gdHdvIGNvbHVtbnMKLSAqIHRoYXQgYXJlIGNlbnRlcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhZ2UuCi0gKi8KLQotI3dlYi1saW5rcyB7CXRleHQtYWxpZ24gOiBsZWZ0Owl3aWR0aCA6IDc2MHB4OwkvKiBUbyBjZW50ZXIgaW4gTW96IChoYXZlIHRvIHVzZSB0ZXh0LWFsaWduIGZvciBJRSkgKi8JbWFyZ2luIDogMHB4IGF1dG87fQotI3dlYi1saW5rcyBhIHsgCXdpZHRoIDogMzcwcHg7CXRleHQtYWxpZ24gOiBsZWZ0OyAJbWFyZ2luLWxlZnQgOiA1cHg7CW1hcmdpbi1yaWdodCA6IDVweDsJbWFyZ2luLXRvcCA6IDVweDsJbWFyZ2luLWJvdHRvbSA6IC0yMHB4Owl2ZXJ0aWNhbC1hbGlnbiA6IHRvcDt9Ci0jd2ViLWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9Ci0jd2ViLWxpbmtzIGEgaW1nIHsJaGVpZ2h0IDogNTdweDsJd2lkdGggOiA1N3B4Owl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTt9CQotI3dlYi1saW5rcyBhIC5saW5rLWxhYmVsIHsJZGlzcGxheSA6IGJsb2NrOwl3aWR0aCA6IDMwMHB4Owlwb3NpdGlvbiA6IHJlbGF0aXZlOwl0b3AgOiAtNTBweDsJbGVmdCA6IDYwcHg7fQotI3dlYi1saW5rcyBhIHAgLnRleHQgewlkaXNwbGF5IDogYmxvY2s7CXdpZHRoIDogMzAwcHg7CXBvc2l0aW9uIDogcmVsYXRpdmU7CXRvcCA6IC00NXB4OwlsZWZ0IDogNTNweDt9Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgTW96aWxsYSwgYmVjYXVzZSB0aGUgbGlua3MgYXJlIGRpc3BsYXllZAotICAgaW4gMSB2ZXJ0aWNhbCBjb2x1bW4gaW5zdGVhZCBvZiAyIGNlbnRlcmVkIGNvbHVtbnMgKi8KLSN3ZWItbGlua3MgPiBhIHsgCXdpZHRoIDogNzAwcHg7IH0KLSN3ZWItbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI3dlYi1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0KLQotI3dlYi1saW5rcyBhOmhvdmVyIHsgYm9yZGVyLXJpZ2h0IDogNXB4OyB9CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGFiYjliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi13ZWIubGF5b3V0Lm5jb2x1bW5zID0gMgotd2ViLnBhZ2UtY29udGVudC5sYXlvdXQudnNwYWNpbmcgPSA0MAotCi13ZWIucGFnZS1jb250ZW50LndlYi1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCi13ZWIucGFnZS1jb250ZW50LndlYi1saW5rcy5sYXlvdXQudnNwYWNpbmcgPSAzNQotCi13ZWIuc3VidGl0bGUtaWQgPSB3ZWIvcGFnZS1jb250ZW50L3BhZ2UtdGl0bGUKLXdlYi5kZXNjcmlwdGlvbi1pZCA9IHdlYi9wYWdlLWNvbnRlbnQvcGFnZS1kZXNjcmlwdGlvbgotCi13ZWIucGFnZS1jb250ZW50LndlYi1saW5rcy5lcGZfcmVzb3VyY2UubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L2VwZl9yZXNvdXJjZS5naWYKLQotI25ld3MubmV3LWFuZC1ub3Rld29ydGh5LmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZgotI25ld3MubWlncmF0aW9uLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlX29iai5naWYKLSNuZXdzLnVwZGF0ZXMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZgotI25ld3MuZWNsaXBzZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3N3dC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2Nzcy93aGF0c25ldy9zd3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2ZGRiNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3N3dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLW5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMzAKLQotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5uZXctYW5kLW5vdGV3b3J0aHkubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLm1pZ3JhdGlvbi5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLnVwZGF0ZXMubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZgotbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy5lY2xpcHNlLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlfb2JqLmdpZgotCi1uZXdzLnBhZ2UtY29udGVudC5ub3Rld29ydGh5LWxpbmtzLmxheW91dC5uY29sdW1ucyA9IDIKLW5ld3MucGFnZS1jb250ZW50Lm5vdGV3b3J0aHktbGlua3MubGF5b3V0LnZzcGFjaW5nID0gMTUgCi1uZXdzLnBhZ2UtY29udGVudC5uZXdzLWxpbmtzLmxheW91dC52c3BhY2luZyA9IDE1IAotbmV3cy5wYWdlLWNvbnRlbnQubGF5b3V0LnZzcGFjaW5nID0gNDAgCi0KLW5ld3MubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCi0KLW5ld3Muc3VidGl0bGUtaWQgPSBuZXdzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vY3NzL3doYXRzbmV3L3doYXRzbmV3LmNzcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2hhdHNuZXcvd2hhdHNuZXcuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDUzNjBhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9jc3Mvd2hhdHNuZXcvd2hhdHNuZXcuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKgotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKi8KLQotYm9keSB7Ci0JYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9jb250ZW50cGFnZS93aGF0c25ld193dHIuanBnKTsKLX0KLQotLnBhZ2UgeyBtaW4taGVpZ2h0IDogNTAwcHg7IH0KLQotLyogc2hvdyB0aGUgInNlbGVjdGVkIiBpbWFnZSBmb3IgdGhpcyBwYWdlICovCi0jbmF2aWdhdGlvbi1saW5rcyBhI25ld3MgaW1nLCAjbmF2aWdhdGlvbi1saW5rcyBhI25ld3M6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9jdG9vbC93aGF0c25ldzQ4c2VsLmdpZik7IH0KLQotLyogCi0gKiBTZXQgdXAgdGhlIGNvbnRlbnQgb2YgdGhlIFdoYXRzIE5ldyBwYWdlIHRvIGJlIGRpc3BsYXllZCBpbiAKLSAqIHR3byBjb2x1bW5zIHRoYXQgYXJlIGNlbnRlcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHBhZ2UuCi0gKi8KLQotI25vdGV3b3J0aHktbGlua3MgewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCXdpZHRoIDogNzYwcHg7Ci0JLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCQotCW1hcmdpbjogMHB4IGF1dG87Ci19Ci0KLSNub3Rld29ydGh5LWxpbmtzIGEgeyAKLQl3aWR0aCA6IDM3MHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiA1cHg7Ci0JbWFyZ2luLXRvcCA6IDVweDsKLQltYXJnaW4tYm90dG9tIDogLTIwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLSNub3Rld29ydGh5LWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9Ci0KLSNub3Rld29ydGh5LWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1N3B4OwotCXdpZHRoIDogNTdweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI25vdGV3b3J0aHktbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNTBweDsKLQlsZWZ0IDogNjBweDsKLX0KLQotI25vdGV3b3J0aHktbGlua3MgYSBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQKLSAgIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zICovCi0jbm90ZXdvcnRoeS1saW5rcyA+IGEgeyB3aWR0aCA6IDcwMHB4OyB9Ci0jbm90ZXdvcnRoeS1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9Ci0jbm90ZXdvcnRoeS1saW5rcyBhIHAgPiAudGV4dCB7IHdpZHRoIDogNzAwcHg7IH0KLQotI25vdGV3b3J0aHktbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQotCi0jbm90ZXdvcnRoeS1saW5rcyBhIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3X29iai5naWYpOyB9Ci0jbm90ZXdvcnRoeS1saW5rcyBhOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYpOyB9Ci0KLQotI25ld3MtbGlua3MgewotCXRleHQtYWxpZ24gOiBsZWZ0OwotCXdpZHRoIDogNzYwcHg7Ci0JLyogVG8gY2VudGVyIGluIE1veiAoaGF2ZSB0byB1c2UgdGV4dC1hbGlnbiBmb3IgSUUpICovCQotCW1hcmdpbjogMHB4IGF1dG87Ci19Ci0KLSNuZXdzLWxpbmtzIGEgeyAKLQl3aWR0aCA6IDM3MHB4OwotCXRleHQtYWxpZ24gOiBsZWZ0OyAKLQltYXJnaW4tbGVmdCA6IDVweDsKLQltYXJnaW4tcmlnaHQgOiA1cHg7Ci0JbWFyZ2luLXRvcCA6IDVweDsKLQltYXJnaW4tYm90dG9tIDogLTIwcHg7Ci0JdmVydGljYWwtYWxpZ24gOiB0b3A7Ci19Ci0KLSNuZXdzLWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9Ci0KLSNuZXdzLWxpbmtzIGEgaW1nIHsKLQloZWlnaHQgOiA1N3B4OwotCXdpZHRoIDogNTdweDsKLQl2ZXJ0aWNhbC1hbGlnbiA6IG1pZGRsZTsKLX0KLQotI25ld3MtbGlua3MgYSAubGluay1sYWJlbCB7Ci0JZGlzcGxheSA6IGJsb2NrOwotCXdpZHRoIDogMzAwcHg7Ci0JcG9zaXRpb24gOiByZWxhdGl2ZTsKLQl0b3AgOiAtNTBweDsKLQlsZWZ0IDogNjBweDsKLX0KLQotI25ld3MtbGlua3MgYSBwIC50ZXh0IHsKLQlkaXNwbGF5IDogYmxvY2s7Ci0Jd2lkdGggOiAzMDBweDsKLQlwb3NpdGlvbiA6IHJlbGF0aXZlOwotCXRvcCA6IC00NXB4OwotCWxlZnQgOiA1M3B4OwotfQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQKLSAgIGluIDEgdmVydGljYWwgY29sdW1uIGluc3RlYWQgb2YgMiBjZW50ZXJlZCBjb2x1bW5zICovCi0jbmV3cy1saW5rcyA+IGEgeyAJd2lkdGggOiA3MDBweDsgfQotI25ld3MtbGlua3MgYSA+IC5saW5rLWxhYmVsIHsgd2lkdGggOiA3MDBweDsgfQotI25ld3MtbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9Ci0KLSNuZXdzLWxpbmtzIGE6aG92ZXIgeyBib3JkZXItcmlnaHQgOiA1cHg7IH0KLQotYSNuZXctYW5kLW5vdGV3b3J0aHkgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZik7IH0KLWEjbmV3LWFuZC1ub3Rld29ydGh5OmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYpOyB9Ci0KLWEjbWlncmF0aW9uIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbWlncmF0ZV9vYmouZ2lmKTsgfQotYSNtaWdyYXRpb246aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9taWdyYXRlaG92X29iai5naWYpOyB9Ci0KLWEjdXBkYXRlcyBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNfb2JqLmdpZik7IH0KLWEjdXBkYXRlczpob3ZlciBpbWcgeyBiYWNrZ3JvdW5kLWltYWdlIDogdXJsKC4uL2dyYXBoaWNzL2ljb25zL29iajQ4L3VwZGF0ZXNob3Zfb2JqLmdpZik7IH0KLQotYSNlY2xpcHNlIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYpOyB9Ci1hI2VjbGlwc2U6aG92ZXIgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9jb21tdW5pdHlob3Zfb2JqLmdpZik7IH0KLQotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaGVscC9ib29rLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9oZWxwL2Jvb2sueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FhMGE2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9oZWxwL2Jvb2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCEtLSAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICBDb250cmlidXRvcnM6Ci0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLS0+Ci08dG9jIGxhYmVsPSJFUEYgQ29tcG9zZXIgSGVscCBQYWdlIiAgdG9waWM9Imh0bWwvYm9vay5odG1sIj4KLQk8dG9waWMgbGFiZWw9IkVQRiBPdmVydmlldyIgaHJlZj0iaHRtbC9vdmVydmlldy5odG1sIi8+Ci0JPHRvcGljIGxhYmVsPSJFUEYgVHV0b3JpYWwiIGhyZWY9Imh0bWwvdHV0b3JpYWwzLmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ljb25zL2Z1bGwvb2JqMTYvcHJvZHVjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjMjkxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkuaW50cm8vaWNvbnMvZnVsbC9vYmoxNi9wcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9pbnRyb0NvbnRlbnQueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ludHJvQ29udGVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNjI5MWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL2ludHJvQ29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Ci08IS0tIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gICAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gICAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgIENvbnRyaWJ1dG9yczoKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0tLT4KLTxpbnRyb0NvbnRlbnQ+Ci0KLSAgICA8cGFnZSBhbHQtc3R5bGU9ImNzcy9yb290X3N3dC5wcm9wZXJ0aWVzIiBzdHlsZT0iY3NzL3Jvb3QuY3NzIiBpZD0icm9vdCIgc3R5bGUtaWQ9InBhZ2UiPgotICAgICAgICA8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0gICAgICAgIDxncm91cCBpZD0ibGlua3MtYmFja2dyb3VuZCI+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtbGlua3MiPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJPdmVydmlldyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9b3ZlcnZpZXciIGlkPSJvdmVydmlldyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5GaW5kIG91dCB3aGF0IEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgaXMgYWxsIGFib3V0PC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iVHV0b3JpYWxzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD10dXRvcmlhbHMiIGlkPSJ0dXRvcmlhbHMiIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGV0IHVzIGd1aWRlIHlvdSB0aHJvdWdoIEVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgdHV0b3JpYWxzPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8IS0tIEZpcnN0IFN0ZXBzIC0tPgotCQkJCTxsaW5rIGxhYmVsPSJGaXJzdCBTdGVwcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9c3RlcHMiIGlkPSJzdGVwcyIgc3R5bGUtaWQ9ImxlZnQiPgotCQkJCQk8dGV4dD5TdGFydCB3b3JraW5nIG9uIHlvdXIgb3duIG1ldGhvZCBwbHVnLWluLjwvdGV4dD4KLQkJCQk8L2xpbms+Ci0gICAgICAgICAgICAgICAgPCEtLSBXZWIgUmVzb3VyY2VzIC0tPgotCQkJCTxsaW5rIGxhYmVsPSJXZWIgUmVzb3VyY2VzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD13ZWIiIGlkPSJ3ZWIiIHN0eWxlLWlkPSJyaWdodCI+Ci0JCQkJCTx0ZXh0PkZpbmQgaW5mb3JtYXRpb24gb24gdGhlIHdlYjwvdGV4dD4KLQkJCQk8L2xpbms+ICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIDxncm91cCBpZD0iYWN0aW9uLWxpbmtzIj4KLSAgICAgICAgICAgIDxsaW5rIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3N3aXRjaFRvTGF1bmNoQmFyIiBsYWJlbD0iV29ya2JlbmNoIiBpZD0id29ya2JlbmNoIj4KLSAgICAgICAgICAgICAgICA8dGV4dD5HbyB0byB0aGUgd29ya2JlbmNoPC90ZXh0PgotICAgICAgICAgICAgPC9saW5rPgotICAgICAgICA8L2dyb3VwPgotICAgIDwvcGFnZT4KLQotICAgIDxwYWdlIGFsdC1zdHlsZT0iY3NzL3N0YW5kYnlfc3d0LnByb3BlcnRpZXMiIHN0eWxlPSJjc3Mvc3RhbmRieV9yb290LmNzcyIgaWQ9InN0YW5kYnkiIHN0eWxlLWlkPSJwYWdlIj4KLSAgICAgICAgPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotICAgICAgICA8Z3JvdXAgaWQ9ImxpbmtzLWJhY2tncm91bmQiPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJwYWdlLWxpbmtzIj4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iT3ZlcnZpZXciIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPW92ZXJ2aWV3JmFtcDtzdGFuZGJ5PWZhbHNlIiBpZD0ib3ZlcnZpZXciIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RmluZCBvdXQgd2hhdCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIGlzIGFsbCBhYm91dDwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IlR1dG9yaWFscyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9dHV0b3JpYWxzJmFtcDtzdGFuZGJ5PWZhbHNlIiBpZD0idHV0b3JpYWxzIiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxldCB1cyBndWlkZSB5b3UgdGhyb3VnaCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyIHR1dG9yaWFsczwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0JCQkJPGxpbmsgbGFiZWw9IkZpcnN0IFN0ZXBzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1zdGVwcyZhbXA7c3RhbmRieT1mYWxzZSIgaWQ9InN0ZXBzIiBzdHlsZS1pZD0ibGVmdCI+Ci0JCQkJCTx0ZXh0PlN0YXJ0IHdvcmtpbmcgb24geW91ciBvd24gbWV0aG9kIHBsdWctaW48L3RleHQ+Ci0JCQkJPC9saW5rPgotCQkJCTxsaW5rIGxhYmVsPSJXZWIgUmVzb3VyY2VzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD13ZWImYW1wO3N0YW5kYnk9ZmFsc2UiIGlkPSJ3ZWIiIHN0eWxlLWlkPSJyaWdodCI+Ci0JCQkJCTx0ZXh0PkZpbmQgaW5mb3JtYXRpb24gb24gdGhlIHdlYjwvdGV4dD4KLQkJCQk8L2xpbms+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICA8L2dyb3VwPgotICAgIDwvcGFnZT4KLQotICAgIDxwYWdlIHN0eWxlPSJjc3Mvb3ZlcnZpZXcvb3ZlcnZpZXcuY3NzIiBhbHQtc3R5bGU9ImNzcy9vdmVydmlldy9zd3QucHJvcGVydGllcyIgaWQ9Im92ZXJ2aWV3IiBzdHlsZS1pZD0icGFnZSI+Ci0gICAgICAgIDx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLSAgICAgICAgPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8Z3JvdXAgaWQ9ImN1cnZlLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8Z3JvdXAgaWQ9Im5hdmlnYXRpb24tbGlua3MiIGZpbHRlcmVkRnJvbT0ic3d0Ij4KLSAgICAgICAgICAgIDxncm91cCBpZD0icGFnZS1saW5rcyI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9Ik92ZXJ2aWV3IiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1vdmVydmlldyIgaWQ9Im92ZXJ2aWV3IiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkZpbmQgb3V0IHdoYXQgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBpcyBhbGwgYWJvdXQ8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJUdXRvcmlhbHMiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXR1dG9yaWFscyIgaWQ9InR1dG9yaWFscyIgc3R5bGUtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZXQgdXMgZ3VpZGUgeW91IHRocm91Z2ggRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBlbmQtdG8tZW5kIHR1dG9yaWFsczwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IkZpcnN0IFN0ZXBzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1zdGVwcyIgaWQ9InN0ZXBzIiBzdHlsZS1pZD0ibGVmdCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlN0YXJ0IHdvcmtpbmcgb24geW91ciBvd24gbWV0aG9kIHBsdWctaW48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJXZWIgUmVzb3VyY2VzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD13ZWIiIGlkPSJ3ZWIiIHN0eWxlLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RmluZCBvdXQgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgd2ViPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9ImFjdGlvbi1saW5rcyI+Ci0gICAgICAgICAgICAgICAgPGxpbmsgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc3dpdGNoVG9MYXVuY2hCYXIiIGxhYmVsPSJXb3JrYmVuY2giIGlkPSJ3b3JrYmVuY2giPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5HbyB0byB0aGUgd29ya2JlbmNoPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgIAotICAgICAgICA8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiIGZpbHRlcmVkRnJvbT0ic3d0Ij5PVkVSVklFVzwvdGV4dD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSIgZmlsdGVyZWRGcm9tPSJodG1sIj5PVkVSVklFVzwvdGV4dD4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLWRlc2NyaXB0aW9uIiBpZD0icGFnZS1kZXNjcmlwdGlvbiI+V2VsY29tZSEgVGFrZSBhIGZldyBtaW51dGVzIHRvIGJlY29tZSBmYW1pbGlhciB3aXRoIEVQRiBDb21wb3Nlci48L3RleHQ+Ci0gICAgICAgICAgICA8Z3JvdXAgaWQ9Im92ZXJ2aWV3LWxpbmtzIj4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPiAgICAgICAKLQkJCQk8bGluayAKLQkJCQkJbGFiZWw9IkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXIgT3ZlcnZpZXciIAotCQkJCQl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC9vdmVydmlldy9hX3Byb2R1Y3Rfb3ZlcnZpZXcuaHRtbCZhbXA7ZW1iZWRUYXJnZXQ9cGFnZS1jb250ZW50IiAgIAotCQkJCQlpZD0iZXBmLW92LXJ1cG92Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+UmVhZCBhYm91dCBFY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyJ3MgcHVycG9zZSBhbmQgaXRzIGtleSBjb25jZXB0cy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iTWV0aG9kczogVGhlIHJldXNhYmxlIGJ1aWxkaW5nIGJsb2NrcyIgCi0gICAgICAgICAgICAgICAgCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL292ZXJ2aWV3L2FfbWV0aG9kX2NvbnRlbnRfYXV0aG9yaW5nX292ZXJ2aWV3Lmh0bWwmYW1wO2VtYmVkVGFyZ2V0PXBhZ2UtY29udGVudCIgICAKLSAgICAgICAgICAgICAgICAJaWQ9ImVwZi1vdi1tZXRob2QiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5SZWFkIGFib3V0IHRoZSByb2xlIGFuZCByZXByZXNlbnRhdGlvbiBvZiBtZXRob2QgY29udGVudCBlbGVtZW50cyBpbiBFUEYgQ29tcG9zZXIuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICA8bGluayAKLSAgICAgICAgICAgICAgICAJbGFiZWw9IkF1dGhvcmluZyBQcm9jZXNzZXMiCi0gICAgICAgICAgICAgICAgCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL292ZXJ2aWV3L2FfcHJvY2Vzc19hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCZhbXA7ZW1iZWRUYXJnZXQ9cGFnZS1jb250ZW50IiAKLSAgICAgICAgICAgICAgICAJaWQ9ImVwZi1vdi1wcm9jZXNzIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+UmVhZCBhYm91dCB0aGUgcm9sZSBhbmQgcmVwcmVzZW50YXRpb24gb2YgcHJvY2Vzc2VzIGluIEVQRiBDb21wb3Nlci48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iQ29uZmlndXJhdGlvbiBhbmQgUHVibGlzaGluZyIgCi0gICAgICAgICAgICAgIAkJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvb3ZlcnZpZXcvYV9tZXRob2RfY29uZmlndXJhdGlvbnNfb3ZlcnZpZXcuaHRtbCZhbXA7ZW1iZWRUYXJnZXQ9cGFnZS1jb250ZW50IiAgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtb3YtY29uZmlncHVibGlzaCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlJlYWQgYWJvdXQgY29uZmlndXJpbmcgYW5kIHB1Ymxpc2hpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBFUEYgQ29tcG9zZXIuPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8Z3JvdXAgaWQ9InN0ZXAtbGlua3MiPgotICAgICAgICAgICAgCQk8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPgotICAgICAgICAgICAgCQk8YW5jaG9yIGlkPSJlbmRBbmNob3IiLz4KLSAgICAgICAgICAgIAk8L2dyb3VwPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0gICAgCi0gICAgPHBhZ2Ugc3R5bGU9ImNzcy90b3VyLmNzcyIgYWx0LXN0eWxlPSJjc3MvdG91ci1zd3QucHJvcGVydGllcyIgaWQ9ImVwZi10b3VyIiBzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBUT1VSPC90ZXh0PgotCQkJPGh0bWwgaWQ9ImVwZi10b3VyIiBzcmM9ImNzcy90b3VyLXBsYWNlaG9sZGVyLmh0bWwiIHR5cGU9ImlubGluZSI+Ci0JCQk8L2h0bWw+CQotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLQk8cGFnZSBzdHlsZT0iY3NzL3RvdXIuY3NzIiBhbHQtc3R5bGU9ImNzcy90b3VyLXN3dC5wcm9wZXJ0aWVzIiBpZD0iZXBmLW92ZXJ2aWV3IiBzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciBPdmVydmlldzwvdGV4dD4KLQkJCTxodG1sIGlkPSJlcGYtb3ZlcnZpZXciIHNyYz0iY3NzL3Byb2R1Y3Rfb3ZlcnZpZXcuaHRtbCIgdHlwZT0iaW5saW5lIj4KLQkJCTwvaHRtbD4JCi0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotCTxwYWdlIHN0eWxlPSJjc3MvdG91ci5jc3MiIGFsdC1zdHlsZT0iY3NzL3RvdXItc3d0LnByb3BlcnRpZXMiIGlkPSJlcGYtbWV0aG9kcyIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPk1ldGhvZHM6IFRoZSByZXVzYWJsZSBidWlsZGluZyBibG9ja3M8L3RleHQ+Ci0JCQk8aHRtbCBpZD0iZXBmLW1ldGhvZHMiIHNyYz0iY3NzL21ldGhvZF9hdXRob3Jpbmdfb3ZlcnZpZXcuaHRtbCIgdHlwZT0iaW5saW5lIj4KLQkJCTwvaHRtbD4JCi0JCTwvZ3JvdXA+Ci0JPC9wYWdlPgotCQotCTxwYWdlIHN0eWxlPSJjc3MvdG91ci5jc3MiIGFsdC1zdHlsZT0iY3NzL3RvdXItc3d0LnByb3BlcnRpZXMiIGlkPSJlcGYtcHJvY2Vzc2VzIiBzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+QXV0aG9yaW5nIFByb2Nlc3NlczwvdGV4dD4KLQkJCTxodG1sIGlkPSJlcGYtcHJvY2Vzc2VzIiBzcmM9ImNzcy9wcm9jZXNzX2F1dGhvcmluZ19vdmVyaXZldy5odG1sIiB0eXBlPSJpbmxpbmUiPgotCQkJPC9odG1sPgkKLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0JPHBhZ2Ugc3R5bGU9ImNzcy90b3VyLmNzcyIgYWx0LXN0eWxlPSJjc3MvdG91ci1zd3QucHJvcGVydGllcyIgaWQ9ImVwZi1jb25maWdwdWJsaXNoIiBzdHlsZS1pZD0icGFnZSI+Ci0JCTx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLQkJPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotCQk8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0JCTxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+Q29uZmlndXJhdGlvbiBhbmQgUHVibGlzaGluZzwvdGV4dD4KLQkJCTxodG1sIGlkPSJlcGYtcHJvY2Vzc2VzIiBzcmM9ImNzcy9wdWJsaXNoaW5nLmh0bWwiIHR5cGU9ImlubGluZSI+Ci0JCQk8L2h0bWw+CQotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLQk8IS0tIEZJUlNUIFNURVBTIFNDQUZGT0xESU5HIC0tPgotCTxwYWdlIAotCQlzdHlsZT0iY3NzL2ZpcnN0c3RlcHMvZmlyc3RzdGVwcy5jc3MiIAotCQlhbHQtc3R5bGU9ImNzcy9maXJzdHN0ZXBzL2ZpcnN0c3RlcHMucHJvcGVydGllcyIgCi0JCWlkPSJzdGVwcyIgCi0JCXN0eWxlLWlkPSJwYWdlIj4KLQkJPHRpdGxlIHN0eWxlLWlkPSJpbnRyby1oZWFkZXIiPkVjbGlwc2UgUHJvY2VzcyBGcmFtZXdvcmsgQ29tcG9zZXI8L3RpdGxlPgotCQk8Z3JvdXAgaWQ9ImJhY2tncm91bmQtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxncm91cCBpZD0iY3VydmUtaW1hZ2UiIGZpbHRlcmVkRnJvbT0ic3d0Ii8+Ci0JCTxpbmNsdWRlIHBhdGg9Im92ZXJ2aWV3L25hdmlnYXRpb24tbGlua3MiLz4KLQkJPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgotCQkJPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5GSVJTVCBTVEVQUzwvdGV4dD4KLQkJCTx0ZXh0IHN0eWxlLWlkPSJwYWdlLWRlc2NyaXB0aW9uIiBpZD0icGFnZS1kZXNjcmlwdGlvbiI+U3RhcnQgd29ya2luZyBvbiB5b3VyIG93biBtZXRob2QgcGx1Zy1pbi48L3RleHQ+Ci0JCQk8Z3JvdXAgaWQ9InN0ZXBzLWxpbmtzIj4gICAgICAgICAgICAgICAKLQkJCSAgICA8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPgotCQkJICAgIDxsaW5rIGxhYmVsPSJDcmVhdGUgeW91ciBvd24gTWV0aG9kIFBsdWctaW4iIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL29wZW5DaGVhdHNoZWV0Vmlldz9pbnB1dD1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmNyZWF0ZW1ldGhvZHBsdWdpbiZhbXA7dG9nZ2xlPXRydWUiIGlkPSJlcGYtc3RlcHMtdHdvIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+U3RhcnQgYnVpbGRpbmcgYSBtZXRob2QgcGx1Zy1pbiB1c2luZyBhIHdpemFyZC48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJDcmVhdGUgeW91ciBvd24gTWV0aG9kIENvbmZpZ3VyYXRpb24iIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL29wZW5DaGVhdHNoZWV0Vmlldz9pbnB1dD1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmNoZWF0c2hlZXRzLmNyZWF0ZW1ldGhvZGNvbmZpZ3VyYXRpb24mYW1wO3RvZ2dsZT10cnVlIiBpZD0iZXBmLXN0ZXBzLWZvdXIiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5UaGlzIGNoZWF0c2hlZXQgZ3VpZGVzIHlvdSB0aG91Z2ggdGhlIHN0ZXBzIG9mIGNyZWF0aW5nIHlvdXIgb3duIG1ldGhvZCBjb25maWd1cmF0aW9uLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IkFkZCBuZXcgTWV0aG9kIENvbnRlbnQgc3VjaCBhcyBSb2xlcywgVGFzayIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vb3BlbkNoZWF0c2hlZXRWaWV3P2lucHV0PW9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuY2hlYXRzaGVldHMuYWRkbmV3bWV0aG9kY29udGVudCZhbXA7dG9nZ2xlPXRydWUiIGlkPSJlcGYtc3RlcHMtb25lIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+VGhpcyBjaGVhdHNoZWV0IGd1aWRlcyB5b3UgdGhvdWdoIHRoZSBzdGVwcyBvZiBjcmVhdGluZyB5b3VyIG93biBtZXRob2QgY29udGVudC48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJDcmVhdGUgYSBQcm9jZXNzIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQ2hlYXRzaGVldFZpZXc/aW5wdXQ9b3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5jaGVhdHNoZWV0cy5jcmVhdGVhcHJvY2VzcyZhbXA7dG9nZ2xlPXRydWUiIGlkPSJlcGYtc3RlcHMtdGhyZWUiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5UaGlzIGNoZWF0c2hlZXQgdGFrZXMgeW91IHRocm91Z2ggdGhlIHN0ZXBzIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSBwcm9jZXNzLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+ICAKLQkJCQk8Z3JvdXAgaWQ9InN0ZXAtbGlua3MiPgotCQkJCQk8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPgotICAgICAgICAgICAgCQk8YW5jaG9yIGlkPSJlbmRBbmNob3IiLz4KLQkJCQk8L2dyb3VwPgotCQkgICAJPC9ncm91cD4KLQkJPC9ncm91cD4KLQk8L3BhZ2U+Ci0JCi0gICAgPHBhZ2Ugc3R5bGU9ImNzcy90dXRvcmlhbHMvdHV0b3JpYWxzLmNzcyIgYWx0LXN0eWxlPSJjc3MvdHV0b3JpYWxzL3N3dC5wcm9wZXJ0aWVzIiBpZD0idHV0b3JpYWxzIiBzdHlsZS1pZD0icGFnZSI+Ci0gICAgICAgIDx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLSAgICAgICAgPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8Z3JvdXAgaWQ9ImN1cnZlLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0gICAgICAgIDxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLSAgICAgICAgICAgIDx0ZXh0IHN0eWxlLWlkPSJwYWdlLXRpdGxlIiBpZD0icGFnZS10aXRsZSI+VFVUT1JJQUxTPC90ZXh0PgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtZGVzY3JpcHRpb24iIGlkPSJwYWdlLWRlc2NyaXB0aW9uIj5MZWFybiBob3cgeW91IGNhbiB1c2UgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlciB0byBkZWxpdmVyIHByYWN0aWNhbCwgY3VzdG9taXplZCwgYW5kIGNvbnNpc3RlbnQgcHJvY2VzcyBndWlkYW5jZSB0byB5b3VyIHByb2plY3QgdGVhbS48L3RleHQ+Ci0JCQk8Z3JvdXAgaWQ9InR1dG9yaWFscy1saW5rcyI+ICAgICAgICAgICAgICAgCi0JCQkgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLQkJCQk8bGluayAKLQkJCQkJbGFiZWw9IkV4cGxvcmUgdGhlIHVzZXIgaW50ZXJmYWNlIiAKLQkJCQkJdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jL2h0bWwvdHV0b3JpYWxzL3R1dDFfaW50cm8uaHRtJmFtcDsiIAotCQkJCQlpZD0iZXBmLXR1dC1uYXZpZ2F0ZSIKLQkJCQkJY2xhc3MtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSB1c2VyIGludGVyZmFjZTogcGVyc3BlY3RpdmVzLCB2aWV3cywgYW5kIHNlYXJjaC48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iV29ya2luZyB3aXRoIHByb2Nlc3NlcyIgCi0gICAgICAgICAgICAgICAgCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXQ1X2ludHJvLmh0bSZhbXA7IiAKLSAgICAgICAgICAgICAgICAJaWQ9ImVwZi10dXQtcHJvY2VzcyI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxlYXJuIGhvdyB0byBjcmVhdGUgYW5kIHJldXNlIGNhcGFiaWxpdHkgcGF0dGVybnMgYW5kIGRlbGl2ZXJ5IHByb2Nlc3Nlcy48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iQ3JlYXRlIG1ldGhvZCBjb250ZW50ICIgCi0gICAgICAgICAgICAgICAgCXVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYy9odG1sL3R1dG9yaWFscy90dXQyX2ludHJvLmh0bSZhbXA7IiAKLSAgICAgICAgICAgICAgICAJaWQ9ImVwZi10dXQtZWxlbWVudCIKLSAgICAgICAgICAgICAgICAJY2xhc3MtaWQ9ImxlZnQiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5MZWFybiBob3cgdG8gdXNlIHRoZSBlZGl0b3JzIHRvIGNyZWF0ZSByb2xlcywgdGFza3MsIHdvcmsgcHJvZHVjdHMgYW5kIGd1aWRhbmNlLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgCi0gICAgICAgICAgICAgICAgCWxhYmVsPSJQdWJsaXNoaW5nIGFuZCBFeHBvcnRpbmciIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0NF9pbnRyby5odG0mYW1wOyIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtdHV0LXB1YmV4cCI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxlYXJuIGhvdyB0byBwdWJsaXNoIGNvbmZpZ3VyYXRpb25zIHRvIGEgd2ViIHNpdGUgYW5kIGhvdyB0byBleHBvcnQgcHJvY2Vzc2VzIHRvIGEgcGxhbm5pbmcgdG9vbC48L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIDxsaW5rIAotICAgICAgICAgICAgICAgIAlsYWJlbD0iUmV1c2UgbWV0aG9kIGNvbnRlbnQiIAotICAgICAgICAgICAgICAgIAl1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5lcGYuaGVscC5kb2MvaHRtbC90dXRvcmlhbHMvdHV0M19pbnRyby5odG0mYW1wOyIgCi0gICAgICAgICAgICAgICAgCWlkPSJlcGYtdHV0LWNvbnRlbnQiCi0gICAgICAgICAgICAgICAgCWNsYXNzLWlkPSJsZWZ0Ij4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+TGVhcm4gaG93IHRvIGV4dGVuZCwgcmVwbGFjZSwgYW5kIGNvbnRyaWJ1dGUgdG8gYmFzZSBjb250ZW50IGVsZW1lbnRzLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0JCQkJPGdyb3VwIGlkPSJzdGVwLWxpbmtzIj4KLQkJCQkJPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIAkJPGFuY2hvciBpZD0iZW5kQW5jaG9yIi8+Ci0JCQkJPC9ncm91cD4KLQkJICAgCTwvZ3JvdXA+ICAgCQotICAgICAgICA8L2dyb3VwPgotICAgICAgICAKLSAgICA8L3BhZ2U+Ci0KLSAgICA8IS0tIFdFQiBSRVNPVVJDRVMgU0NBRkZPTERJTkcgLS0+Ci0JPHBhZ2UgCi0JCXN0eWxlPSJjc3Mvd2VicmVzb3VyY2VzL3dlYnJlc291cmNlcy5jc3MiIGFsdC1zdHlsZT0iY3NzL3dlYnJlc291cmNlcy93ZWJyZXNvdXJjZXMucHJvcGVydGllcyIgaWQ9IndlYiIgc3R5bGUtaWQ9InBhZ2UiPgotCQk8dGl0bGUgc3R5bGUtaWQ9ImludHJvLWhlYWRlciI+RWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayBDb21wb3NlcjwvdGl0bGU+Ci0JCTxncm91cCBpZD0iYmFja2dyb3VuZC1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGdyb3VwIGlkPSJjdXJ2ZS1pbWFnZSIgZmlsdGVyZWRGcm9tPSJzd3QiLz4KLQkJPGluY2x1ZGUgcGF0aD0ib3ZlcnZpZXcvbmF2aWdhdGlvbi1saW5rcyIvPgotCQk8Z3JvdXAgaWQ9InBhZ2UtY29udGVudCI+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS10aXRsZSIgaWQ9InBhZ2UtdGl0bGUiPldFQiBSRVNPVVJDRVM8L3RleHQ+Ci0JCQk8dGV4dCBzdHlsZS1pZD0icGFnZS1kZXNjcmlwdGlvbiIgaWQ9InBhZ2UtZGVzY3JpcHRpb24iPkluIGFkZGl0aW9uIHRvIGluZm9ybWF0aW9uIGluIHRoZSBXZWxjb21lIGFuZCB0aGUgSGVscCwgdGhlIFdlYiBwcm92aWRlcyB5b3Ugd2l0aCB0aXBzLCBhcnRpY2xlcywgdXBkYXRlcywgYW5kIHJlZmVyZW5jZXMgdG8gaW5kdXN0cnkgc3RhbmRhcmRzLiA8L3RleHQ+Ci0JCQk8Z3JvdXAgaWQ9IndlYi1saW5rcyI+Ci0JCQkJICAgPGxpbmsKLQkgICAgICAgICAgICAgICAgICAgICBsYWJlbD0iRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yayIKLQkgICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9vcGVuQnJvd3Nlcj91cmw9aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiCi0JICAgICAgICAgICAgICAgICAgICAgaWQ9ImVwZl9yZXNvdXJjZSI+Ci0JICAgICAgICAgICAgICAgICAgPHRleHQ+Q2VudHJhbCBsb2NhdGlvbiBmb3IgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgRWNsaXBzZSBQcm9jZXNzIEZyYW1ld29yazwvdGV4dD4KLQkgICAgICAgICAgICAgICA8L2xpbms+Ci0JCQk8L2dyb3VwPgotCQk8L2dyb3VwPgotCTwvcGFnZT4KLQkKLSAgICA8cGFnZSBzdHlsZT0iY3NzL3NhbXBsZXMvc2FtcGxlcy5jc3MiIGFsdC1zdHlsZT0iY3NzL3NhbXBsZXMvc3d0LnByb3BlcnRpZXMiIGlkPSJzYW1wbGVzIiBzdHlsZS1pZD0icGFnZSI+Ci0gICAgICAgIDx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLSAgICAgICAgPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8Z3JvdXAgaWQ9ImN1cnZlLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0gICAgICAgIDxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLSAgICAgICAgICAgIDxncm91cCBpZD0iY29udGVudC1oZWFkZXIiIGxhYmVsPSJTQU1QTEVTIiBmaWx0ZXJlZEZyb209InN3dCI+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIiBmaWx0ZXJlZEZyb209Imh0bWwiPlNBTVBMRVM8L3RleHQ+Ci0gICAgICAgICAgICA8dGV4dCBzdHlsZS1pZD0icGFnZS1kZXNjcmlwdGlvbiIgaWQ9InBhZ2UtZGVzY3JpcHRpb24iPkV4cGxvcmUgRWNsaXBzZSBieSBpbnN0YWxsaW5nIHByZWZhYnJpY2F0ZWQgc2FtcGxlcyAobWF5IHJlcXVpcmUgSW50ZXJuZXQgY29ubmVjdGlvbikuPC90ZXh0PgotICAgICAgICAgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgICAgICAgIDxncm91cCBsYWJlbD0iU1dUIiBpZD0ic3d0IiBzdHlsZS1pZD0ic2FtcGxlcy1ncm91cCI+Ci0gICAgICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9Imdyb3VwLWRlc2NyaXB0aW9uIj5SdW4gU1dUIHNhbXBsZXMgdXNpbmcgZWl0aGVyIHRoZSBzdGFuZGFsb25lIFNXVCBsYXVuY2hlciBvciBhcyBhbiBpbnRlZ3JhdGVkIHdvcmtiZW5jaCB2aWV3LjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iV29ya2JlbmNoIHZpZXdzIGFuZCBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vcnVuQWN0aW9uP3BsdWdpbklkPW9yZy5lY2xpcHNlLnBkZS51aSZhbXA7Y2xhc3M9b3JnLmVjbGlwc2UucGRlLnVpLmludGVybmFsLnNhbXBsZXMuU2hvd1NhbXBsZUFjdGlvbiZhbXA7aWQ9b3JnLmVjbGlwc2Uuc2RrLnNhbXBsZXMuc3d0LmV4YW1wbGVzIiBpZD0ic3d0LWV4YW1wbGVzIiBzdHlsZS1pZD0ic2FtcGxlLWxpbmsiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5UaGUgU1dUIEV4YW1wbGUgbGF1bmNoZXIgd2lsbCBhbGxvdyB5b3UgdG8gbGF1bmNoIGEgY29sbGVjdGlvbiBvZiBTV1QgZXhhbXBsZXMuICBTb21lIG9mIHRoZSBleGFtcGxlcyBjYW4gYmUgcnVuIGluZGVwZW5kZW50IG9mIHRoZSBlY2xpcHNlIHBsYXRmb3JtIGFuZCBvdGhlcnMgd2lsbCBiZSBhdmFpbGFibGUgYXMgdmlld3MgaW5zaWRlIHRoZSB3b3JrYmVuY2guPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJzd3RHcm91cEFuY2hvciIvPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDxncm91cCBsYWJlbD0iV29ya2JlbmNoIiBpZD0id29ya2JlbmNoIiBzdHlsZS1pZD0ic2FtcGxlcy1ncm91cCI+Ci0gICAgICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9Imdyb3VwLWRlc2NyaXB0aW9uIj5UaGUgZm9sbG93aW5nIHNhbXBsZXMgZGVtb25zdHJhdGUgaG93IHRvIHRpZ2h0bHkgaW50ZWdyYXRlIGludG8gdGhlIEVjbGlwc2Ugd29ya2JlbmNoLjwvdGV4dD4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iTXVsdGktcGFnZSBlZGl0b3IiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS5wZGUudWkmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnBkZS51aS5pbnRlcm5hbC5zYW1wbGVzLlNob3dTYW1wbGVBY3Rpb24mYW1wO2lkPW9yZy5lY2xpcHNlLnNkay5zYW1wbGVzLm11bHRpcGFnZWVkaXRvciIgaWQ9Im11bHRpLXBhZ2UtZWRpdG9yIiBzdHlsZS1pZD0ic2FtcGxlLWxpbmsiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5TaG93cyBob3cgdG8gY3JlYXRlIGFuIGVkaXRvciB3aXRoIG11bHRpcGxlIHBhZ2VzPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iUHJvcGVydHkgc2hlZXQgYW5kIG91dGxpbmUiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3J1bkFjdGlvbj9wbHVnaW5JZD1vcmcuZWNsaXBzZS5wZGUudWkmYW1wO2NsYXNzPW9yZy5lY2xpcHNlLnBkZS51aS5pbnRlcm5hbC5zYW1wbGVzLlNob3dTYW1wbGVBY3Rpb24mYW1wO2lkPW9yZy5lY2xpcHNlLnNkay5zYW1wbGVzLnByb3BlcnR5c2hlZXQiIGlkPSJwcm9wZXJ0eS1zaGVldCIgc3R5bGUtaWQ9InNhbXBsZS1saW5rIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+RGVtb25zdHJhdGVzIGhvdyB0byB1c2UgcHJvcGVydHkgc2hlZXQgYW5kIG91dGxpbmUgdmlld3M8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJSZWFkbWUgdG9vbCIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vcnVuQWN0aW9uP3BsdWdpbklkPW9yZy5lY2xpcHNlLnBkZS51aSZhbXA7Y2xhc3M9b3JnLmVjbGlwc2UucGRlLnVpLmludGVybmFsLnNhbXBsZXMuU2hvd1NhbXBsZUFjdGlvbiZhbXA7aWQ9b3JnLmVjbGlwc2Uuc2RrLnNhbXBsZXMucmVhZG1ldG9vbCIgaWQ9InJlYWRtZXRvb2wiIHN0eWxlLWlkPSJzYW1wbGUtbGluayI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PlNob3dzIGhvdyB0byBjcmVhdGUgeW91ciBvd24gZXh0ZW5zaW9uIHBvaW50czwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0iamR0QW5jaG9yIi8+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0id29ya2JlbmNoR3JvdXBBbmNob3IiLz4KLSAgICAgICAgICAgIDwvZ3JvdXA+Ci0gICAgICAgICAgICA8YW5jaG9yIGlkPSJlbmRBbmNob3IiLz4KLSAgICAgICAgPC9ncm91cD4KLSAgICA8L3BhZ2U+Ci0KLSAgICA8cGFnZSBzdHlsZT0iY3NzL3doYXRzbmV3L3doYXRzbmV3LmNzcyIgYWx0LXN0eWxlPSJjc3Mvd2hhdHNuZXcvc3d0LnByb3BlcnRpZXMiIGlkPSJuZXdzIiBzdHlsZS1pZD0icGFnZSI+Ci0gICAgICAgIDx0aXRsZSBzdHlsZS1pZD0iaW50cm8taGVhZGVyIj5FY2xpcHNlIFByb2Nlc3MgRnJhbWV3b3JrIENvbXBvc2VyPC90aXRsZT4KLSAgICAgICAgPGdyb3VwIGlkPSJiYWNrZ3JvdW5kLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8Z3JvdXAgaWQ9ImN1cnZlLWltYWdlIiBmaWx0ZXJlZEZyb209InN3dCIvPgotICAgICAgICA8aW5jbHVkZSBwYXRoPSJvdmVydmlldy9uYXZpZ2F0aW9uLWxpbmtzIi8+Ci0gICAgICAgIDxncm91cCBpZD0icGFnZS1jb250ZW50Ij4KLSAgICAgICAgICAgIDxncm91cCBpZD0iY29udGVudC1oZWFkZXIiIGxhYmVsPSJXSEFUJ1MgTkVXIiBmaWx0ZXJlZEZyb209InN3dCI+Ci0gICAgICAgICAgICA8L2dyb3VwPgotICAgICAgICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIiBmaWx0ZXJlZEZyb209Imh0bWwiPldIQVQnUyBORVc8L3RleHQ+Ci0gICAgICAgICAgICA8YW5jaG9yIGlkPSJiZWdpbkFuY2hvciIvPgotICAgICAgICAgICAgPGdyb3VwIGlkPSJub3Rld29ydGh5LWxpbmtzIiBsYWJlbD0iTmV3IGFuZCBOb3Rld29ydGh5Ij4KLSAgICAgICAgICAgICAgICA8bGluayBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvd2hhdHNOZXcvcGxhdGZvcm1fd2hhdHNuZXcuaHRtbCIgaWQ9InBsYXRmb3JtLW5vdGV3b3J0aHkiIHN0eWxlLWlkPSJub3Rld29ydGh5LWxpbmsiPgotICAgICAgICAgICAgICAgICAgICA8dGV4dD5GaW5kIG91dCBhYm91dCB0aGUgbWFqb3IgbmV3IGZlYXR1cmVzIGluIHRoaXMgcmVsZWFzZTwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0iamR0QW5jaG9yIi8+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0icGRlQW5jaG9yIi8+Ci0gICAgICAgICAgICAgICAgPGFuY2hvciBpZD0iZ2VuZXJhbEFuY2hvciIvPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDxncm91cCBpZD0ibmV3cy1saW5rcyIgbGFiZWw9IkdlbmVyYWwiPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJNaWdyYXRpb24gZnJvbSB0aGUgcHJldmlvdXMgcmVsZWFzZSIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd0hlbHBUb3BpYz9pZD0vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdi9wb3J0aW5nL2VjbGlwc2VfM18wX3BvcnRpbmdfZ3VpZGUuaHRtbCIgaWQ9Im1pZ3JhdGlvbiI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkxlYXJuIHdoYXQgeW91IG5lZWQgdG8gZG8gdG8gbWFrZSB5b3VyIG9sZCBjb2RlIHdvcmsgaW4gRWNsaXBzZSAzLjE8L3RleHQ+Ci0gICAgICAgICAgICAgICAgPC9saW5rPgotICAgICAgICAgICAgICAgIDxsaW5rIGxhYmVsPSJOZXcgVXBkYXRlcyIgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vcnVuQWN0aW9uP3BsdWdpbklkPW9yZy5lY2xpcHNlLnVpLmlkZSZhbXA7Y2xhc3M9b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuaWRlLnVwZGF0ZS5JbnN0YWxsV2l6YXJkQWN0aW9uIiBpZD0idXBkYXRlcyI+Ci0gICAgICAgICAgICAgICAgICAgIDx0ZXh0PkdldCB0aGUgbGF0ZXN0IHVwZGF0ZXMgZnJvbSBFY2xpcHNlLm9yZzwvdGV4dD4KLSAgICAgICAgICAgICAgICA8L2xpbms+Ci0gICAgICAgICAgICAgICAgPGxpbmsgbGFiZWw9IkVjbGlwc2UgY29tbXVuaXR5IiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciIGlkPSJlY2xpcHNlIj4KLSAgICAgICAgICAgICAgICAgICAgPHRleHQ+Sm9pbiB0aGUgY29tbXVuaXR5LCByZWFkIGFydGljbGVzIGFuZCBuZXdzIG9uIEVjbGlwc2Uub3JnPC90ZXh0PgotICAgICAgICAgICAgICAgIDwvbGluaz4KLSAgICAgICAgICAgICAgICA8YW5jaG9yIGlkPSJsaW5rc0FuY2hvciIvPgotICAgICAgICAgICAgPC9ncm91cD4KLSAgICAgICAgICAgIDxhbmNob3IgaWQ9ImVuZEFuY2hvciIvPgotICAgICAgICA8L2dyb3VwPgotICAgIDwvcGFnZT4KLSAgICAKLTwvaW50cm9Db250ZW50PgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3BsdWdpbi5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQ1ZmMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgSW50cm9kdWN0aW9uCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzJmZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmludHJvIj4KLSAgICAgIDxpbnRybwotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZy5DdXN0b21pemFibGVJbnRyb1BhcnQiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9mdWxsL29iajE2L3Byb2R1Y3QuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbnRybyIvPgotICAgICAgICAgPGludHJvUHJvZHVjdEJpbmRpbmcKLSAgICAgICAgICAgICAgIGludHJvSWQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbnRybyIKLSAgICAgICAgICAgICAgIHByb2R1Y3RJZD0ib3JnLmVjbGlwc2UuZXBmLnJjcC51aS5jb21wb3NlciIvPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWciPgotICAgICAgPGNvbmZpZwotICAgICAgICAgICAgY29udGVudD0iJG5sJC9pbnRyb0NvbnRlbnQueG1sIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLmNvbmZpZyIKLSAgICAgICAgICAgIGludHJvSWQ9Im9yZy5lY2xpcHNlLmVwZi51aS5pbnRybyI+Ci0gICAgICAgICA8cHJlc2VudGF0aW9uIGhvbWUtcGFnZS1pZD0icm9vdCIgc3RhbmRieS1wYWdlLWlkPSJzdGFuZGJ5Ij4KLSAgICAgICAgICAgCTxpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAJICAJICAgd3M9IndpbjMyLGd0ayIKLSAgICAgICAgICAgCSAgCSAgIHN0eWxlPSJjc3Mvc2hhcmVkLmNzcyIKLSAgICAgICAgICAgCSAgCSAgIGtpbmQ9Imh0bWwiCi0gICAgICAgICAgIAkgIAkgICBvcz0id2luMzIsbGludXgiPgotICAgICAgICAgICAJPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDxpbXBsZW1lbnRhdGlvbiBraW5kPSJzd3QiLz4KLSAgICAgICAgICAgICAgIDxsYXVuY2hCYXIKLSAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uPSJyaWdodCIKLSAgICAgICAgICAgICAgICAgICAgIGJnPSIjZGVkY2Y1Ij4KLSAgICAgICAgICAgICAgIDxoYW5kbGUKLSAgICAgICAgICAgICAgICAgICAgIGNsb3NlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgaW1hZ2U9ImNzcy9ncmFwaGljcy9jb250ZW50cGFnZS9oYW5kbGUuZ2lmIi8+Ci0gICAgICAgICAgICAgICA8c2hvcnRjdXQKLSAgICAgICAgICAgICAgICAgICAgIGljb249ImNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC9vdmVydmlldy5naWYiCi0gICAgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvcnRjdXQub3ZlcnZpZXcudG9vbHRpcCIKLSAgICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPW92ZXJ2aWV3Ii8+Ci0gICAgICAgICAgICAgICA8c2hvcnRjdXQKLSAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVzaG9ydGN1dC50dXRvcmlhbHMudG9vbHRpcCIKLSAgICAgICAgICAgICAgICAgICAgIGljb249ImNzcy9ncmFwaGljcy9pY29ucy9ldG9vbC90dXRvcmlhbHMuZ2lmIgotICAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwOi8vb3JnLmVjbGlwc2UudWkuaW50cm8vc2hvd1BhZ2U/aWQ9dHV0b3JpYWxzIi8+Ci0gICAgICAgICAgICAgICA8c2hvcnRjdXQKLSAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9IiVzaG9ydGN1dC5maXJzdHN0ZXBzLnRvb2x0aXAiCi0gICAgICAgICAgICAgICAgICAgICBpY29uPSJjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvZmlyc3RlcHM0OC5naWYiCi0gICAgICAgICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93UGFnZT9pZD1zdGVwcyIvPgotICAgICAgICAgICAgICAgPHNob3J0Y3V0Ci0gICAgICAgICAgICAgICAgICAgICB0b29sdGlwPSIlc2hvcnRjdXQud2VicmVzb3VyY2VzLnRvb2x0aXAiCi0gICAgICAgICAgICAgICAgICAgICBpY29uPSJjc3MvZ3JhcGhpY3MvaWNvbnMvZXRvb2wvd2VicnNyYzE2LmdpZiIKLSAgICAgICAgICAgICAgICAgICAgIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dQYWdlP2lkPXdlYiIvPgotICAgICAgICAgICAgPC9sYXVuY2hCYXI+Ci0gICAgICAgICA8L3ByZXNlbnRhdGlvbj4KLSAgICAgIDwvY29uZmlnPgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pbnRyby5jb25maWdFeHRlbnNpb24iPgotICAgICAgPGFjdGlvbgotICAgICAgICAgICAgbmFtZT0ib3BlbkNoZWF0c2hlZXRWaWV3IgotICAgICAgICAgICAgcmVwbGFjZXM9InJ1bkFjdGlvbj9jbGFzcz1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuT3BlbkNoZWF0c2hlZXRWaWV3JmFtcDtwbHVnaW5JZD1vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3dlbGNvbWUueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvL3dlbGNvbWUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTM2MjhlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS5pbnRyby93ZWxjb21lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PiAKLTwhLS0gCi0gICAgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAgQ29udHJpYnV0b3JzOgotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS0tPgotCi08d2VsY29tZVBhZ2UgCi0JdGl0bGU9IkVjbGlwc2UgUGxhdGZvcm0iCi0JZm9ybWF0PSJub3dyYXAiPgotCTxpbnRybz5UaGlzIHBhZ2Ugd2lsbCBoZWxwIGZhbWlsaWFyaXplIHlvdSB3aXRoIHRoZSBFY2xpcHNlIFdvcmtiZW5jaC4KLVRvIGdldCBzdGFydGVkLCByZWFkIHRoZSBzZWN0aW9ucyBiZWxvdyBhbmQgY2xpY2sgb24gdGhlIHJlbGF0ZWQgbGlua3MuIDwvaW50cm8+Ci0KLTxpdGVtPjxiPkluc3RhbGxlZCBGZWF0dXJlcyA8L2I+Ci1UbyBmaW5kIG91dCBtb3JlIGFib3V0IHRoZSBmZWF0dXJlcyBpbnN0YWxsZWQgaW4geW91ciB3b3JrYmVuY2gsIGNob29zZSA8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5pZGUiICBjbGFzcz0ib3JnLmVjbGlwc2UudWkuYWN0aW9ucy5RdWlja1N0YXJ0QWN0aW9uIj5IZWxwID4gV2VsY29tZS4uLjwvYWN0aW9uPgotYW5kIHNlbGVjdCB0aGUgZmVhdHVyZSB5b3UgYXJlIGludGVyZXN0ZWQgaW4uPC9pdGVtPgotCi08aXRlbT48Yj5QZXJzcGVjdGl2ZXMsIHZpZXdzIGFuZCBlZGl0b3JzIDwvYj4KLUEgd2luZG93IGNvbnRhaW5zIG9uZSBvciBtb3JlIHBlcnNwZWN0aXZlcy4gQSBwZXJzcGVjdGl2ZSBjb25zaXN0cyBvZiB2aWV3cyAoZS5nLiBOYXZpZ2F0b3IpIAotYW5kIGVkaXRvcnMgZm9yIHdvcmtpbmcgd2l0aCB5b3VyIHJlc291cmNlcy4KLQotVGhlIHNob3J0Y3V0IGJhciBhdCB0aGUgZmFyIGxlZnQgb2YgdGhlIHdpbmRvdyBhbGxvd3MgeW91IHRvIG9wZW4gbmV3IHBlcnNwZWN0aXZlcyBhbmQgbW92ZQotYmV0d2VlbiBwZXJzcGVjdGl2ZXMgdGhhdCBhcmUgYWxyZWFkeSBvcGVuLiBUaGUgcGVyc3BlY3RpdmUgeW91IGFyZSBjdXJyZW50bHkgd29ya2luZyB3aXRoIAotaXMgc2hvd24gaW4gdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cgYW5kIGluIHRoZSBzaG9ydGN1dCBiYXIgYXMgYSBwdXNoZWQtaW4gaWNvbi48L2l0ZW0+Ci0KLTxpdGVtPjxiPkNvbmZpZ3VyaW5nIHlvdXIgcGVyc3BlY3RpdmVzPC9iPgotWW91IGNhbiBtb3ZlIHZpZXdzIGFuZCBlZGl0b3JzIGFyb3VuZCB0aGUgd29ya2JlbmNoIGJ5IGRyYWdnaW5nIHRoZWlyIHRpdGxlYmFycy4gWW91IGNhbgotYWxzbyBhZGQgbW9yZSB2aWV3cyB0byB5b3VyIGN1cnJlbnQgcGVyc3BlY3RpdmUgYnkgdXNpbmcgV2luZG93ID4gU2hvdyBWaWV3LiAKLVRvIHJlc2V0IHRoZSBwZXJzcGVjdGl2ZSB0byBpdHMgb3JpZ2luYWwgc3RhdGUsIGNob29zZSA8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aSIgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5SZXNldFBlcnNwZWN0aXZlQWN0aW9uIj5XaW5kb3cgPiBSZXNldCBQZXJzcGVjdGl2ZTwvYWN0aW9uPi4gCi0KLU9uY2UgeW91IGhhdmUgYXJyYW5nZWQgeW91ciBwZXJzcGVjdGl2ZSwgeW91IGNhbiBzYXZlIGl0IHVzaW5nIFdpbmRvdyA+IFNhdmUgUGVyc3BlY3RpdmUgQXMuLi4uIAotWW91IGNhbiBjdXN0b21pemUgdGhlIHZpZXdzLCBwZXJzcGVjdGl2ZXMgYW5kIE5ldyBtZW51IG9wZXJhdGlvbnMgdGhhdCBzaG93IHVwIGZvciAKLXlvdXIgcGVyc3BlY3RpdmUuIFRvIGRvIHRoaXMgY2hvb3NlIDxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpIiAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLkVkaXRBY3Rpb25TZXRzQWN0aW9uIj5XaW5kb3cgPiBDdXN0b21pemUgUGVyc3BlY3RpdmUuLi48L2FjdGlvbj4gLiAgQSB2aWV3IGNhbgotYWRkaXRpb25hbGx5IGJlIGNvbnZlcnRlZCBpbnRvIGEgRmFzdCBWaWV3IGJ5IGRyYWdnaW5nIGl0IHRvIHRoZSBzaG9ydGN1dCBiYXIgKGF0IHRoZSAKLWZhciBsZWZ0IG9mIHRoZSB3aW5kb3cpLiA8L2l0ZW0+IAotCi08aXRlbT48Yj5Kb2luIGEgQ1ZTIHRlYW08L2I+Ci1UbyBqb2luIGEgQ1ZTIGRldmVsb3BtZW50IHRlYW0sIG9wZW4gdGhlIDxhY3Rpb24gcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnVpIiBjbGFzcz0ib3JnLmVjbGlwc2UudGVhbS5pbnRlcm5hbC5jY3ZzLnVpLmFjdGlvbnMuU2hvd0NWU1BlcnNwZWN0aXZlQWN0aW9uIj5DVlMgUmVwb3NpdG9yeSBFeHBsb3JpbmcgcGVyc3BlY3RpdmU8L2FjdGlvbj4uIE5leHQsIHNwZWNpZnkKLXRoZSBsb2NhdGlvbiBvZiB5b3VyIENWUyByZXBvc2l0b3J5LiBUbyBkbyB0aGlzLCBjaG9vc2UgPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiIGNsYXNzPSJvcmcuZWNsaXBzZS50ZWFtLmludGVybmFsLmNjdnMudWkucmVwby5OZXdDVlNSZXBvc2l0b3J5QWN0aW9uIj5OZXcgPiBSZXBvc2l0b3J5IExvY2F0aW9uLi4uPC9hY3Rpb24+IGZyb20gdGhlCi1DVlMgUmVwb3NpdG9yaWVzIHZpZXcgcG9wdXAgbWVudS4gV2hlbiB0aGUgbG9jYXRpb24gd2l6YXJkIG9wZW5zLCBmaWxsIGluIHRoZSBkZXRhaWxzIG9mIHlvdXIKLUNWUyByZXBvc2l0b3J5IGFuZCBjbGljayBGaW5pc2guIAotCi1BIHJlcG9zaXRvcnkgbG9jYXRpb24gd2lsbCBhcHBlYXIgaW4gdGhlIENWUyBSZXBvc2l0b3JpZXMgdmlldy4gRXhwYW5kIHRoZSBsb2NhdGlvbiwgdGhlbiBleHBhbmQKLXRoZSBIRUFEIGJyYW5jaC4gWW91IHdpbGwgc2VlIGEgbGlzdCBvZiB0aGUgbW9kdWxlcyBpbiB0aGF0IHJlcG9zaXRvcnkuIFNlbGVjdCBhIG1vZHVsZSBhbmQgY2hvb3NlIAotPGI+Q2hlY2tvdXQgYXMgUHJvamVjdDwvYj4gZnJvbSB0aGUgY29udGV4dCBtZW51LiBUaGlzIHdpbGwgY2hlY2tvdXQgdGhlIG1vZHVsZSBmcm9tIHRoZSBDVlMgCi1yZXBvc2l0b3J5IGFuZCBjcmVhdGUgYSBwcm9qZWN0IGJ5IHRoYXQgbmFtZSBpbiB5b3VyIHdvcmtzcGFjZS48L2l0ZW0+Ci0KLTxpdGVtPjxiPlJ1bm5pbmcgYW4gQW50IEJ1aWxkZmlsZTwvYj4KLVRvIHJ1biBhbiBBbnQgYnVpbGRmaWxlLCBjbGljayBvbiBSdW4gPiBFeHRlcm5hbCBUb29scyA+IEV4dGVybmFsIFRvb2xzLi4uLiBTZWxlY3QgQW50IEJ1aWxkIGFzIHRoZSBsYXVuY2gKLWNvbmZpZ3VyYXRpb24gdHlwZSBhbmQgY2xpY2sgTmV3LiBJZGVudGlmeSB0aGUgYnVpbGRmaWxlIGluIHRoZSBMb2NhdGlvbiBmaWVsZCBhbmQgdGhlbiBjbGljayBSdW4uPC9pdGVtPgotCi08aXRlbT48Yj5MZWFybiBtb3JlIDwvYj4KLVRvIGxlYXJuIG1vcmUgeW91IGNhbiBicm93c2UgdGhlIDx0b3BpYyBpZD0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3RvYy54bWwiPldvcmtiZW5jaCBVc2VyIEd1aWRlPC90b3BpYz4uIEJyb3dzZSB0aGUgPHRvcGljIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWFudGljb25zLmh0bSI+RXh0ZXJuYWwgVG9vbHMgYW5kIEFudCBJY29uczwvdG9waWM+Ci1zZWN0aW9uIHRvIHJlY29nbml6ZSB0aGUgdmFyaW91cyBFeHRlcm5hbCBUb29scyBhbmQgQW50IGVsZW1lbnRzLiA8L2l0ZW0+Ci0KLTwvd2VsY29tZVBhZ2U+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvLmNsYXNzcGF0aCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLy5wcm9qZWN0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmExMTA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjA3MDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYudWkuRVBGVUlQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsCi0gb3JnLmVjbGlwc2UudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYudWksCi0gb3JnLmVjbGlwc2UuZXBmLnVpLmFjdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXBmLnVpLmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnMsCi0gb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmVwZi51aS51dGlsLAotIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZmZlMTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9wbHVnaW4ucHJvcGVydGllcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE4MGVhNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyBWaWV3cwotdmlld0NhdGVnb3J5TmFtZT1NZXRob2QgQXV0aG9yaW5nCi0KLSMgV2l6YXJkcwotd2l6YXJkQ2F0ZWdvcnlOYW1lPU1ldGhvZCBBdXRob3JpbmcKLQotIyBBY3Rpb24gU2V0Ci1hY3Rpb25TZXRMYWJlbD1NZXRob2QgQXV0aG9yaW5nCi0KLSMgUHJlZmVyZW5jZSBQYWdlcwotcm9vdFByZWZlcmVuY2VQYWdlTmFtZT1NZXRob2QKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3BsdWdpbi54bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4MGJhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkudmlld3MiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnVpLnZpZXdzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJXZpZXdDYXRlZ29yeU5hbWUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQgPSAib3JnLmVjbGlwc2UuZXBmLnVpLm5ld1dpemFyZHMuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSIld2l6YXJkQ2F0ZWdvcnlOYW1lIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmV4cG9ydFdpemFyZHMiPgotICAgICAgPGNhdGVnb3J5Ci0gICAgICAgICAgICBpZCA9ICJvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcy5jYXRlZ29yeSIKLSAgICAgICAgICAgIG5hbWU9IiV3aXphcmRDYXRlZ29yeU5hbWUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaW1wb3J0V2l6YXJkcyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGlkID0gIm9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzLmNhdGVnb3J5IgotICAgICAgICAgICAgbmFtZT0iJXdpemFyZENhdGVnb3J5TmFtZSI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJleHBvcnRXaXphcmRzIgotICAgICAgICAgbmFtZT0iRVBGIEV4cG9ydCBXaXphcmRzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvRXhwb3J0V2l6YXJkcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24tcG9pbnQKLSAgICAgICAgIGlkPSJpbXBvcnRXaXphcmRzIgotICAgICAgICAgbmFtZT0iRVBGIEltcG9ydCBXaXphcmRzIgotICAgICAgICAgc2NoZW1hPSJzY2hlbWEvSW1wb3J0V2l6YXJkcy5leHNkIi8+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlcy5Sb290UHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzLlJvb3RQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIG5hbWU9IiVyb290UHJlZmVyZW5jZVBhZ2VOYW1lIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc2NoZW1hL0V4cG9ydFdpemFyZHMuZXhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvRXhwb3J0V2l6YXJkcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODkzOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvRXhwb3J0V2l6YXJkcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVwZi51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXBmLnVpIiBpZD0iZXhwb3J0V2l6YXJkcyIgbmFtZT0iRVBGIEV4cG9ydCBXaXphcmRzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEVuYWJsZXMgYSBwbHVnLWluIHRvIGNvbnRyaWJ1dGUgYW4gZXhwb3J0IHdpemFyZCB0byB0aGUgc3RhbmRhbG9uZSBSQ1AtYmFzZWQgRVBGIENvbXBvc2VyIFVJLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ3aXphcmQiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0id2l6YXJkIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIDEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRoZSBleHRlbnNpb24gcG9pbnQgY2FuIGJlIHVzZWQ6IAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYudWkuZXhwb3J0V2l6YXJkcyZxdW90OyZndDsKLSAgICAgICZsdDt3aXphcmQgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkud2l6YXJkcy5FeHBvcnRNU1BXaXphcmQmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zY2hlbWEvSW1wb3J0V2l6YXJkcy5leHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NjaGVtYS9JbXBvcnRXaXphcmRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMDc4MzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NjaGVtYS9JbXBvcnRXaXphcmRzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXBmLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcGYudWkiIGlkPSJpbXBvcnRXaXphcmRzIiBuYW1lPSJFUEYgSW1wb3J0IFdpemFyZHMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRW5hYmxlcyBhIHBsdWctaW4gdG8gY29udHJpYnV0ZSBhbiBpbXBvcnQgd2l6YXJkIHRvIHRoZSBzdGFuZGFsb25lIFJDUC1iYXNlZCBFUEYgQ29tcG9zZXIgVUkuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9IndpemFyZCIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ3aXphcmQiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgdXNlZDogCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzJnF1b3Q7Jmd0OwotICAgICAgJmx0O3dpemFyZCBpZD0mcXVvdDtvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC53aXphcmRzLkltcG9ydFhNTFdpemFyZCZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvRVBGVUlQbHVnaW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTE4MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvRVBGVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEVQRiBVSSBwbHVnLWluIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIEVQRlVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEVQRlVJUGx1Z2luIHBsdWdpbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEVQRlVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBFUEZVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUmVzb3VyY2VzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9FUEZVSVJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ4MzFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL0VQRlVJUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBFUEYgVUkgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFUEZVSVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBFUEZVSVJlc291cmNlcy5jbGFzcy5nZXRQYWNrYWdlKCkKLQkJCS5nZXROYW1lKCkKLQkJCSsgIi5SZXNvdXJjZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEVQRlVJUmVzb3VyY2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZUNvbmZsaWN0X3RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfbXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX2ZpbGVOYW1lX3NlbGVjdEFjdGlvbl9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZV9kZXN0aW5hdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19maWxlTmFtZUNvbmZsaWN0X25vdGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVfcmVwbGFjZV9tc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfZmlsZU5hbWVfdW5pcXVlX21zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGludGVybmFsRXJyb3JfcmVhc29uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5pdGlhbGl6ZVdpemFyZEVycm9yX3JlYXNvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRpYWxpemVXaXphcmRQYWdlc0Vycm9yX3JlYXNvbjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEVQRlVJUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOTAzMTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbkNvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgRmlsZSBOYW1lIENvbmZsaWN0IERpYWxvZwotRGlhbG9nX2ZpbGVOYW1lQ29uZmxpY3RfdGl0bGU9RmlsZSBOYW1lIENvbmZsaWN0Ci1EaWFsb2dfZmlsZU5hbWVDb25mbGljdF9tc2c9SVVQVTAyMDBXOiBUaGUgZmlsZSAnJ3swfScnIGFscmVhZHkgZXhpc3RzIGluIHRoZSBtZXRob2QgbGlicmFyeSByZXNvdXJjZSBmb2xkZXIgJyd7MX0nJy4KLURpYWxvZ19maWxlTmFtZUNvbmZsaWN0X25vdGU9Tm90ZTogQW5vdGhlciBtZXRob2QgZWxlbWVudCBtaWdodCByZWZlcmVuY2UgdGhpcyBmaWxlLgotRGlhbG9nX2ZpbGVOYW1lX3JlcGxhY2VfbXNnPVJlcGxhY2UgZXhpc3RpbmcgZmlsZSB3aXRoIG5ldyBmaWxlCi1EaWFsb2dfZmlsZU5hbWVfdW5pcXVlX21zZz1TcGVjaWZ5IHVuaXF1ZSBuYW1lIGZvciB0aGlzIG5ldyBmaWxlCi1EaWFsb2dfZmlsZU5hbWVfc2VsZWN0QWN0aW9uX2xhYmVsPVNlbGVjdCBhY3Rpb246Ci0KLSMgRXJyb3IgTWVzc2FnZXMKLWludGVybmFsRXJyb3JfcmVhc29uPUFuIGludGVybmFsIGVycm9yIGhhcyBvY2N1cnJlZC5cblxuQ2xpY2sgRGV0YWlscyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLWluaXRpYWxpemVXaXphcmRFcnJvcl9yZWFzb249VGhlIHdpemFyZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgY29ycmVjdGx5LgotaW5pdGlhbGl6ZVdpemFyZFBhZ2VzRXJyb3JfcmVhc29uPU9uZSBvciBtb3JlIHdpemFyZCBwYWdlcyBoYXZlIG5vdCBiZWVuIGluaXRpYWxpemVkIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2FjdGlvbnMvQ0NvbWJvQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvYWN0aW9ucy9DQ29tYm9Db250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODFmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvYWN0aW9ucy9DQ29tYm9Db250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db29sQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07Ci0KLS8qKgotICogV3JhcHMgYSBDQ29tYm8gaW4gYSBDb250cmlidXRpb25JdGVtIGZvciB1c2UgaW4gYSB0b29sYmFyCi0gKiAKLSAqIERvZXMgbm90IHVzZSBhIENvbWJvVmlld2VyIGJlY2F1c2Ugb2YgdGFiYmluZyBpc3N1ZXMgLSBzZWUgYnVnIDc4ODg1Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDQ29tYm9Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcm90ZWN0ZWQgQ0NvbWJvIENDb21ibzsKLQotCXByb3RlY3RlZCBUb29sSXRlbSB0b29sSXRlbTsKLQotCXByb3RlY3RlZCBDb29sSXRlbSBjb29sSXRlbTsKLQkKLQlwcm90ZWN0ZWQgaW50IHN0eWxlOwotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPFN0cmluZz4gaW5wdXQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBDQ29tYm9Db250cmlidXRpb25JdGVtKGludCBzdHlsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnN0eWxlID0gc3R5bGU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5Db250cmlidXRpb25JdGVtI2ZpbGwob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKFRvb2xCYXIgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJdG9vbEl0ZW0gPSBuZXcgVG9vbEl0ZW0ocGFyZW50LCBTV1QuU0VQQVJBVE9SKTsKLQkJQ29udHJvbCBib3ggPSBjcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCXRvb2xJdGVtLnNldENvbnRyb2woYm94KTsKLQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IENDb21iby5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCQl0b29sSXRlbS5zZXRXaWR0aChwcmVmZXJyZWRTaXplLngpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvb2xCYXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgZmlsbChDb29sQmFyIGNvb2xCYXIsIGludCBpbmRleCkgewotCQlDb250cm9sIGJveCA9IGNyZWF0ZUNvbnRyb2woY29vbEJhcik7Ci0KLQkJaWYgKGluZGV4ID49IDApIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04sIGluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWNvb2xJdGVtID0gbmV3IENvb2xJdGVtKGNvb2xCYXIsIFNXVC5EUk9QX0RPV04pOwotCQl9Ci0KLQkJLy8gU2V0IHRoZSBiYWNrIHJlZmVyZW5jZS4KLQkJY29vbEl0ZW0uc2V0RGF0YSh0aGlzKTsKLQotCQkvLyBBZGQgdGhlIHRvb2xiYXIgdG8gdGhlIENvb2xJdGVtIHdpZGdldC4KLQkJY29vbEl0ZW0uc2V0Q29udHJvbChib3gpOwotCi0JCS8vIElmIHRoZSB0b29sYmFyIGl0ZW0gZXhpc3RzIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb29sIGl0ZW0uCi0JCVBvaW50IHRvb2xCYXJTaXplID0gYm94LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJLy8gU2V0IHRoZSBwcmVmZXJyZWQgc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgdG9vbGJhciBwbHVzIHRyaW0uCi0JCWNvb2xJdGVtLnNldE1pbmltdW1TaXplKHRvb2xCYXJTaXplKTsKLQkJY29vbEl0ZW0uc2V0UHJlZmVycmVkU2l6ZSh0b29sQmFyU2l6ZSk7Ci0JCWNvb2xJdGVtLnNldFNpemUodG9vbEJhclNpemUpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJpYnV0aW9uSXRlbSNmaWxsKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbnRyb2wuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChmaW5hbCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNDb21ibyA9IG5ldyBDQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0JCUNDb21iby5zZXRWaXNpYmxlSXRlbUNvdW50KDEwKTsKLQkJQ0NvbWJvLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCUNDb21iby5zZXRJdGVtcyhpbnB1dC50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKLQkJQ0NvbWJvLmFkZERpc3Bvc2VMaXN0ZW5lcigKLQkJCQluZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWRpc3Bvc2UoKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCUNDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlwZXJmb3JtU2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJcmV0dXJuIENDb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldFNlbGVjdGlvbkluZGV4KCkgewotCQlyZXR1cm4gQ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KENvbGxlY3Rpb248U3RyaW5nPiBpbnB1dCkgewotCQl0aGlzLmlucHV0ID0gaW5wdXQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyaWJ1dGlvbkl0ZW0jZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBDQ29tYm8gZ2V0Q0NvbWJvKCkgewotCQlyZXR1cm4gQ0NvbWJvOwotCX0KLQotCXB1YmxpYyBUb29sSXRlbSBnZXRUb29sSXRlbSgpIHsKLQkJcmV0dXJuIHRvb2xJdGVtOwotCX0KLQotCXB1YmxpYyBDb29sSXRlbSBnZXRDb29sSXRlbSgpIHsKLQkJcmV0dXJuIGNvb2xJdGVtOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2RpYWxvZ3MvUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9kaWFsb2dzL1JlbmFtZUZpbGVDb25mbGljdERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzEzNjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2RpYWxvZ3MvUmVuYW1lRmlsZUNvbmZsaWN0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkuRVBGVUlSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBEaXNwbGF5cyBhIGRpYWxvZyB0aGF0IHByb21wdHMgdGhlIHVzZXIgdG8gcmVuYW1lIGEgZmlsZSBwYXRoLgotICogCi0gKiBAYXV0aG9yIFNoYXNoaWRoYXIgS2Fubm9vcmkKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFJlbmFtZUZpbGVDb25mbGljdERpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0KLQkvKioKLQkgKiBUaGUgT0sgYnV0dG9uLgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQkvKioKLQkgKiBUaGUgQ2FuY2VsIGJ1dHRvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBvdmVyd3JpdGUgYnV0dG9uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBvdmVyV3JpdGVCdXR0b247Ci0KLQlwcml2YXRlIFRleHQgY3RybF9maWxlTmFtZTsKLQlwcml2YXRlIGludCBPVkVSX1dSSVRFX0lEID0gMjI7Ci0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZVN0cjsKLQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBidXR0b25fcmVwbGFjZTsKLQlwcml2YXRlIEJ1dHRvbiBidXR0b25fdW5pcXVlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBSZW5hbWVGaWxlQ29uZmxpY3REaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBEaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IChHcmlkTGF5b3V0KSBkaWFsb2dBcmVhLmdldExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDEwOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgZGlhbG9nQXJlYS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gMTA7Ci0JCWdyaWREYXRhLndpZHRoSGludCA9IDQ1MDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCi0JCS8vIENyZWF0ZSBtZXNzYWdlIGFyZWEuCi0KLQkJSW1hZ2UgaW1hZ2UgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKTsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCUxhYmVsIGltYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5VTEwpOwotCQkJaW1hZ2Uuc2V0QmFja2dyb3VuZChpbWFnZUxhYmVsLmdldEJhY2tncm91bmQoKSk7Ci0JCQlpbWFnZUxhYmVsLnNldEltYWdlKGltYWdlKTsKLQkJCWltYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoCi0JCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSCi0JCQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQkJfQotCi0JCUxhYmVsIG1lc3NhZ2UgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULldSQVApOwotCQlpZiAobWVzc2FnZVN0ciAhPSBudWxsKSB7Ci0JCQltZXNzYWdlLnNldFRleHQobWVzc2FnZVN0cik7Ci0JCX0KLQkJR3JpZERhdGEgZGF0YTEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQltZXNzYWdlLnNldExheW91dERhdGEoZGF0YTEpOwotCi0JCUxhYmVsIGVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJTGFiZWwgbm90ZSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCW5vdGUuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVDb25mbGljdF9ub3RlKTsKLQkJR3JpZERhdGEgZGF0YTIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTIuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlub3RlLnNldExheW91dERhdGEoZGF0YTIpOwotCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZGF0YTMgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YTMuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlkYXRhMy5oZWlnaHRIaW50ID0gMTA7Ci0JCWVtcHR5LnNldExheW91dERhdGEoZGF0YTMpOwotCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJTGFiZWwgc2VsZWN0QWN0aW9uID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJc2VsZWN0QWN0aW9uLnNldFRleHQoRVBGVUlSZXNvdXJjZXMuRGlhbG9nX2ZpbGVOYW1lX3NlbGVjdEFjdGlvbl9sYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGE0ID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGE0Lmhvcml6b250YWxTcGFuID0gMjsKLQkJc2VsZWN0QWN0aW9uLnNldExheW91dERhdGEoZGF0YTQpOwotCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlidXR0b25fcmVwbGFjZSA9IG5ldyBCdXR0b24oZGlhbG9nQXJlYSwgU1dULlJBRElPKTsKLQkJLy8gTGFiZWwgcmVwbGFjZV9sYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCS8vIHJlcGxhY2VfbGFiZWwuc2V0VGV4dChFUEZVSVJlc291cmNlcy5EaWFsb2dfZmlsZU5hbWVfcmVwbGFjZV9tc2cpOwotCQlidXR0b25fcmVwbGFjZS5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZV9yZXBsYWNlX21zZyk7Ci0JCWJ1dHRvbl9yZXBsYWNlLnNldFNlbGVjdGlvbih0cnVlKTsKLQotCQllbXB0eSA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWVtcHR5LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnV0dG9uX3VuaXF1ZSA9IG5ldyBCdXR0b24oZGlhbG9nQXJlYSwgU1dULlJBRElPKTsKLQkJLy8gTGFiZWwgdW5pcXVlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQkvLyB1bmlxdWVMYWJlbC5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZV91bmlxdWVfbXNnKTsKLQkJYnV0dG9uX3VuaXF1ZS5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZV91bmlxdWVfbXNnKTsKLQkJYnV0dG9uX3VuaXF1ZS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBhcmVhLiAtLSBUT0RPOiBmaW5kIGRpZmZlcmVudCB3YXkgaW5zdGVhZCBvZiBlbXB0eQotCQkvLyBsYWJlbHMuCi0JCWVtcHR5ID0gbmV3IExhYmVsKGRpYWxvZ0FyZWEsIFNXVC5OT05FKTsKLQkJZW1wdHkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW1wdHkgPSBuZXcgTGFiZWwoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQllbXB0eS5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQljdHJsX2ZpbGVOYW1lID0gbmV3IFRleHQoZGlhbG9nQXJlYSwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdyaWREYXRhMSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlncmlkRGF0YTEud2lkdGhIaW50ID0gMjAwOwotCQlncmlkRGF0YTEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVI7Ci0JCWN0cmxfZmlsZU5hbWUuc2V0TGF5b3V0RGF0YShncmlkRGF0YTEpOwotCQlpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJY3RybF9maWxlTmFtZS5zZXRUZXh0KGZpbGVOYW1lKTsKLQkJCWN0cmxfZmlsZU5hbWUuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJY3RybF9maWxlTmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAob2tCdXR0b24gIT0gbnVsbCkgewotCQkJCQlva0J1dHRvbgotCQkJCQkJCS5zZXRFbmFibGVkKGN0cmxfZmlsZU5hbWUuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA+IDApOwotCQkJCX0KLQkJCQlmaWxlTmFtZSA9IGN0cmxfZmlsZU5hbWUuZ2V0VGV4dCgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbl9yZXBsYWNlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY3RybF9maWxlTmFtZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCQl9KTsKLQotCQlidXR0b25fdW5pcXVlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJY3RybF9maWxlTmFtZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCWZpbGVOYW1lID0gY3RybF9maWxlTmFtZS5nZXRUZXh0KCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzdGluYXRpb24gKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lKTsKLQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCX0KLQkJfSk7Ci0KLQkJc3VwZXIuZ2V0U2hlbGwoKS5zZXRUZXh0KEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZUNvbmZsaWN0X3RpdGxlKTsgCi0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaWFsb2cgYnV0dG9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBPSyBidXR0b24uCi0JCS8vIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIE9WRVJfV1JJVEVfSUQsCi0JCS8vIEVQRlVJUmVzb3VyY2VzLkRpYWxvZ19maWxlTmFtZV9vdmVyV3JpdGUsIHRydWUpOwotCi0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsCi0JCQkJdHJ1ZSk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBPSyBidXR0b24uCi0JCW9rQnV0dG9uID0gc3VwZXIuZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBDYW5jZWwgYnV0dG9uLgotCQljYW5jZWxCdXR0b24gPSBzdXBlci5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQpOwotCi0JCS8vIFNldCBoZWxwIGNvbnRleHQgZm9yIHRoZSBvdmVyd3JpdGUgYnV0dG9uCi0JCS8vIG92ZXJXcml0ZUJ1dHRvbiA9IHN1cGVyLmdldEJ1dHRvbihPVkVSX1dSSVRFX0lEKTsKLQotCQkvLyBva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGUgT0sgYnV0dG9uIGlzIHNlbGVjdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRmlsZSBOYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbGVQYXRoKFN0cmluZyBmaWxlTmFtZSkgewotCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBPVkVSX1dSSVRFX0lEKSB7Ci0JCQlvdmVyV3JpdGVQcmVzc2VkKCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG92ZXJXcml0ZVByZXNzZWQoKSB7Ci0JCXNldFJldHVybkNvZGUoT1ZFUl9XUklURV9JRCk7Ci0JCWNsb3NlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2FuY2VsUHJlc3NlZCgpIHsKLQkJZmlsZU5hbWUgPSBudWxsOwotCQlzdXBlci5jYW5jZWxQcmVzc2VkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlU3RyKCkgewotCQlyZXR1cm4gbWVzc2FnZVN0cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlU3RyKFN0cmluZyBtZXNzYWdlU3RyKSB7Ci0JCXRoaXMubWVzc2FnZVN0ciA9IG1lc3NhZ2VTdHI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oU3RyaW5nIGRlc3RpbmF0aW9uKSB7Ci0JCXRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL2VkaXRvcnMvSU1ldGhvZEVkaXRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvZWRpdG9ycy9JTWV0aG9kRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMmZlMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvZWRpdG9ycy9JTWV0aG9kRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLmVkaXRvcnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGhvZEVkaXRvciB7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3ByZWZlcmVuY2VzL0Jhc2VQcmVmZXJlbmNlUGFnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvQmFzZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MmYyNzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvQmFzZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRVBGIHByZWZlcmVuY2UgcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmFzZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cwotCQlJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChJV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGlsZCBjb21wb3NpdGUgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIDxwPgotCSAqIFRoZSBjaGlsZCBjb21wb3NpdGUgd2lsbCBiZSBpbmRlbnRlZCBmcm9tIHRoZSBwYXJlbnQgY29tcG9zaXRlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29tcG9zaXRlIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUNoaWxkR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBHcm91cCBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUdyaWRMYXlvdXRHcm91cChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgZ3JvdXAgd2lsbCB0YWtlIHVwCi0JICogQHBhcmFtIGVxdWFsQ29sdW1uV2lkdGgKLQkgKiAgICAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gY2VsbHMgc2hvdWxkIGJlIHNhbWUgd2lkdGggb3IKLQkgKiAgICAgICAgICAgIG5vdAotCSAqIEByZXR1cm4gYSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBHcm91cCBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uLCBib29sZWFuIGVxdWFsQ29sdW1uV2lkdGgpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlR3JpZExheW91dEdyb3VwKHBhcmVudCwgdGV4dCwgY29sdW1uLAotCQkJCWVxdWFsQ29sdW1uV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgbGFiZWwgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxhYmVsKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHJlYWRvbmx5IHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByZWFkb25seSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQljb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbgotCSAqIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgbXVsdGktbGluZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlTXVsdGlMaW5lVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDb21ib2JveChwYXJlbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbWJvIGNyZWF0ZUNvbWJvYm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ29tYm9ib3gocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3guCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hlY2tib3gocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZUNoZWNrYm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByYWRpbyBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcGFyYW0gc2VsZWN0ZWQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZWxlY3QgdGhlIHJhZGlvIGJ1dHRvbiBieSBkZWZhdWx0Ci0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uLCBib29sZWFuIHNlbGVjdGVkKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVJhZGlvQnV0dG9uKHBhcmVudCwgdGV4dCwgY29sdW1uLCBzZWxlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByYWRpbyBidXR0b24gdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHRWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dFZpZXdlciBjcmVhdGVUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0Vmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSB0ZXh0IHZpZXdlciB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiBhIDxjb2RlPlRleHRWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dFZpZXdlciBjcmVhdGVUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dFZpZXdlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UYWJsZVZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUYWJsZVZpZXdlciBjcmVhdGVUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGFibGVWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNoZWNrYm94VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcihwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwKLQkJCQljb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcihwYXJlbnQsIDM2MCwgMTc1LCBjb2x1bW4pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MaXN0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExpc3RWaWV3ZXIgY3JlYXRlTGlzdFZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxpc3RWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgbGluZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+TGFiZWw8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgTGFiZWwgY3JlYXRlTGluZShDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUxpbmUocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgdGV4dCBjb250cm9sIGhhcyBzb21lIHRleHQuCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGNvbnRyb2wKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0ZXh0IGNvbnRyb2wgaGFzIHNvbWUgdGV4dCwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNOb25FbXB0eVRleHQoVGV4dCBjb250cm9sKSB7Ci0JCXJldHVybiBTV1RVdGlsLmlzTm9uRW1wdHlUZXh0KGNvbnRyb2wpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvcHJlZmVyZW5jZXMvUm9vdFByZWZlcmVuY2VQYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9wcmVmZXJlbmNlcy9Sb290UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5NWIzYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS9wcmVmZXJlbmNlcy9Sb290UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoZSByb290IHByZWZlcmVuY2UgcGFnZS4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBSb290UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBCYXNlUHJlZmVyZW5jZVBhZ2UgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgMyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybU9rKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvdXRpbC9TV1RVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS91dGlsL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1MmQ3Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS91dGlsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MaXN0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBjcmVhdGUgU1dUIHdpZGdldHMgZm9yIHRoZSBFUEYgVUkuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaGVscHMgdG8gcHJvdmlkZSBhIGNvbW1vbiBsb29rIGFuZCBmZWVsIGZvciBhbGwgRVBGIGZvcm1zLAotICogZGlhbG9ncywgd2l6YXJkcyBhbmQgcHJlZmVyZW5jZSBwYWdlcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQotCS8qKgotCSAqIFByZXZlbnRzIGV4dGVybmFsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBjbGFzcy4gQWxsIG1ldGhvZHMgaW4gdGhpcyBjbGFzcwotCSAqIHNob3VsZCBiZSBkZWNsYXJlZCBzdGF0aWMuCi0JICovCi0JcHJpdmF0ZSBTV1RVdGlsKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb21wb3NpdGUgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29tcG9zaXRlIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlIGNyZWF0ZUdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1uLCBmYWxzZSkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoaWxkIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogPHA+Ci0JICogVGhlIGNoaWxkIGNvbXBvc2l0ZSB3aWxsIGJlIGluZGVudGVkIGZyb20gdGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KGNvbHVtbiwgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkoKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKSkubWFyZ2luVG9wID0gLTM7Ci0JCSgoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpKS5tYXJnaW5MZWZ0ID0gMTM7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgZ3JvdXAgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEdyb3VwIGNyZWF0ZUdyaWRMYXlvdXRHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4pIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW4sIGZhbHNlKSk7Ci0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlncm91cC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGdyb3VwCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgZ3JvdXAgd2lsbCB0YWtlIHVwCi0JICogQHBhcmFtIGVxdWFsQ29sdW1uV2lkdGgKLQkgKiAgICAgICAgICAgIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBjb2x1bW4gY2VsbHMgc2hvdWxkIGJlIHNhbWUgd2lkdGggb3IKLQkgKiAgICAgICAgICAgIG5vdAotCSAqIEByZXR1cm4gYSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBHcm91cCBjcmVhdGVHcmlkTGF5b3V0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uLCBib29sZWFuIGVxdWFsQ29sdW1uV2lkdGgpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dChjb2x1bW4sIGVxdWFsQ29sdW1uV2lkdGgpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxhYmVsIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGNvbHVtbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdmVydGljYWxseSBhbGlnbmVkIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVWZXJ0aWNhbGx5QWxpZ25lZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiByZWFkb25seSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0ZXh0LnNldFRleHQoZGVmYXVsdFRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZWZhdWx0VGV4dCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5XUkFQCi0JCQkJfCBTV1QuVl9TQ1JPTEwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsCi0JCQlpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgIiIsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50LCBpbnQgY29sdW1uKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQsCi0JCQlpbnQgd2lkdGhIaW50KSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQpIHsKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdGV4dC5zZXRUZXh0KGRlZmF1bHRUZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsICIiLCBTV1QuREVGQVVMVCwgY29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uCi0JICogY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSBtdWx0aS1saW5lIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRleHQgY3JlYXRlTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuV1JBUAotCQkJCXwgU1dULlZfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGNvbWJvYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tYm8gY3JlYXRlQ29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbWJvPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbWJvIGNyZWF0ZVJlYWRPbmx5Q29tYm9ib3goQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVJ8U1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib2JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDb21ib2JveChwYXJlbnQsIDEpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBidXR0b24uCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5PTkUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3guCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4pIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQ2hlY2tib3gocGFyZW50LCB0ZXh0LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJhZGlvIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBzZWxlY3RlZAotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHNlbGVjdCB0aGUgcmFkaW8gYnV0dG9uIGJ5IGRlZmF1bHQKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwKLQkJCWludCBjb2x1bW4sIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5SQURJTyk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlyYWRpb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGVkKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZVJhZGlvQnV0dG9uKHBhcmVudCwgdGV4dCwgMSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHRWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dFZpZXdlciBjcmVhdGVUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsCi0JCQlpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlUZXh0Vmlld2VyIHRleHRWaWV3ZXIgPSBuZXcgVGV4dFZpZXdlcihwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkKLQkJCQl8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5SRUFEX09OTFkpOwotCQlTdHlsZWRUZXh0IHRleHRXaWRnZXQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCXRleHRXaWRnZXQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0Vmlld2VyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSB0ZXh0IHZpZXdlciB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHJldHVybiBhIDxjb2RlPlRleHRWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dFZpZXdlciBjcmVhdGVUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHRWaWV3ZXIocGFyZW50LCBTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORyB8IEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94IHRhYmxlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNoZWNrYm94VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2hlY2tib3hUYWJsZVZpZXdlciBjcmVhdGVDaGVja2JveFRhYmxlVmlld2VyKAotCQkJQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJQ2hlY2tib3hUYWJsZVZpZXdlciBjaGVja2JveFRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlcgotCQkJCS5uZXdDaGVja0xpc3QocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZJTEwgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCVRhYmxlIHRhYmxlID0gY2hlY2tib3hUYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbjsKLQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjaGVja2JveFRhYmxlVmlld2VyOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MaXN0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RWaWV3ZXIgY3JlYXRlTGlzdFZpZXdlcihDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJTGlzdFZpZXdlciBsaXN0Vmlld2VyID0gbmV3IExpc3RWaWV3ZXIocGFyZW50LCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW47Ci0JCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCWxpc3RWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGlzdFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxpbmUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExhYmVsIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMCi0JCQkJfCBTV1QuQk9MRCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uOwotCQlsaW5lLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGluZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgdGV4dCBjb250cm9sCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGV4dCBjb250cm9sIGhhcyBzb21lIHRleHQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTm9uRW1wdHlUZXh0KFRleHQgY29udHJvbCkgewotCQlTdHJpbmcgdGV4dCA9IGNvbnRyb2wuZ2V0VGV4dCgpOwotCQlyZXR1cm4gdGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCgpID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9CYXNlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGUzYzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9CYXNlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVpLkVQRlVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIGV4dGVuc2libGUgRVBGIHdpemFyZHMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIAotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVdpemFyZCBleHRlbmRzIFdpemFyZCB7Ci0KLQkvLyBUaGUgY3VycmVudCB3b3JrYmVuY2guCi0JcHJvdGVjdGVkIElXb3JrYmVuY2ggd29ya2JlbmNoOwotCi0JLy8gVGhlIGN1cnJlbnQgb2JqZWN0IHNlbGVjdGlvbi4KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JLy8gQW4gZXh0ZW5kZXIgb2YgdGhpcyB3aXphcmQuCi0JcHJvdGVjdGVkIElXaXphcmRFeHRlbmRlciB3aXphcmRFeHRlbmRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEJhc2VXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkI2luaXQoSVdvcmtiZW5jaCwKLQkgKiAgICAgIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLndvcmtiZW5jaCA9IHdvcmtiZW5jaDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0KLQkJcHJvY2Vzc1dpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnQoKTsKLQotCQlpbml0aWFsaXplRXh0ZW5kZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRXh0ZW5kZXIoKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQl3aXphcmRFeHRlbmRlci5pbml0KHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd2l6YXJkIGV4dGVuZGVyIHNwZWNpZmljIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3aXphcmQgZXh0ZW5kZXIgc3BlY2lmaWMgZXh0ZW5zaW9uIHBvaW50IElECi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGV4dGVuZGVyIG9mIHRoaXMgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5JV2l6YXJkRXh0ZW5kZXI8L2NvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhlcmUgaXMgbm8gZXh0ZW5kZXIKLQkgKi8KLQlwdWJsaWMgSVdpemFyZEV4dGVuZGVyIGdldFdpemFyZEV4dGVuZGVyKCkgewotCQlyZXR1cm4gd2l6YXJkRXh0ZW5kZXI7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkI2dldE5leHRQYWdlKElXaXphcmRQYWdlKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCUlXaXphcmRQYWdlIG5leHRQYWdlID0gbnVsbDsKLQkJaWYgKHdpemFyZEV4dGVuZGVyICE9IG51bGwpIHsKLQkJCW5leHRQYWdlID0gd2l6YXJkRXh0ZW5kZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0JCX0KLQkJaWYgKG5leHRQYWdlID09IG51bGwpIHsKLQkJCW5leHRQYWdlID0gc3VwZXIuZ2V0TmV4dFBhZ2UocGFnZSk7Ci0JCX0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCWlmICh3aXphcmRFeHRlbmRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gd2l6YXJkRXh0ZW5kZXIuY2FuRmluaXNoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNhbkZpbmlzaCgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlpZiAod2l6YXJkRXh0ZW5kZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHdpemFyZEV4dGVuZGVyLmRvRmluaXNoKCk7Ci0JCX0KLQkJcmV0dXJuIGRvRmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGZpbmlzaCBvcGVyYXRpb24uCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmluaXNoIG9wZXJhdGlvbiBpcyBleGVjdXRlZAotCSAqICAgICAgICAgc3VjY2Vzc2Z1bGx5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGFsbG93IG92ZXJyaWRlIHRoZSBleHRlbmRlci4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgdG8gcmV0dXJuIHRoZQotCSAqIGRlZmF1bHRFeHRlbmRlcgotCSAqIAotCSAqIEBwYXJhbSBkZWZhdWx0RXh0ZW5kZXIKLQkgKiBAcmV0dXJuIElXaXphcmRFeHRlbmRlcgotCSAqLwotCXByb3RlY3RlZCBJV2l6YXJkRXh0ZW5kZXIgY3JlYXRlV2l6YXJkRXh0ZW5kZXIoCi0JCQlJV2l6YXJkRXh0ZW5kZXIgZGVmYXVsdEV4dGVuZGVyKSB7Ci0JCXJldHVybiBkZWZhdWx0RXh0ZW5kZXI7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIHRoZSB3aXphcmQgZXh0ZW5kZXIgc3BjaWZpYyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1dpemFyZEV4dGVuZGVyRXh0ZW5zaW9uUG9pbnQoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLQkJU3RyaW5nIGV4dGVuc2lvblBvaW50SWQgPSBnZXRXaXphcmRFeHRlbmRlckV4dGVuc2lvblBvaW50SWQoKTsKLQkJaWYgKGV4dGVuc2lvblBvaW50SWQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSUV4dGVuc2lvblBvaW50IGV4dGVuc2lvblBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkKLQkJCQkuZ2V0RXh0ZW5zaW9uUG9pbnQoZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCWlmIChleHRlbnNpb25Qb2ludCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV07Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbGVtZW50cyA9IGV4dGVuc2lvbgotCQkJCQkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWdFbGVtZW50c1tqXTsKLQkJCQl0cnkgewotCQkJCQlJV2l6YXJkRXh0ZW5kZXIgZXh0ZW5kZXIgPSAoSVdpemFyZEV4dGVuZGVyKSBjb25maWdFbGVtZW50Ci0JCQkJCQkJLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHdpemFyZEV4dGVuZGVyID09IG51bGwpIHsKLQkJCQkJCXdpemFyZEV4dGVuZGVyID0gY3JlYXRlV2l6YXJkRXh0ZW5kZXIoZXh0ZW5kZXIpOwotCi0JCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZENvbmZpZ0VsZW1lbnRzID0gY29uZmlnRWxlbWVudAotCQkJCQkJCQkuZ2V0Q2hpbGRyZW4oIndpemFyZFBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjaGlsZENvbmZpZ0VsZW1lbnRzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkQ29uZmlnRWxlbWVudCA9IGNoaWxkQ29uZmlnRWxlbWVudHNba107Ci0JCQkJCQkJSVdpemFyZFBhZ2Ugd2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyB0eXBlID0gY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgdGFyZ2V0ID0gY2hpbGRDb25maWdFbGVtZW50Ci0JCQkJCQkJCQkuZ2V0QXR0cmlidXRlKCJ0YXJnZXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBpbnNlcnQgPSBjaGlsZENvbmZpZ0VsZW1lbnQKLQkJCQkJCQkJCS5nZXRBdHRyaWJ1dGUoImluc2VydCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHdpemFyZFBhZ2UgIT0gbnVsbCAmJiB0eXBlICE9IG51bGwKLQkJCQkJCQkJCSYmIHR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJCWlmICh0eXBlLmVxdWFscygicmVwbGFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXdpemFyZEV4dGVuZGVyCi0JCQkJCQkJCQkJCS5hZGRSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihuZXcgUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJCQkJd2l6YXJkUGFnZSwgdGFyZ2V0KSk7Ci0JCQkJCQkJCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoIm5ldyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWJvb2xlYW4gaW5zZXJ0QWZ0ZXIgPSB0cnVlOwotCQkJCQkJCQkJaWYgKGluc2VydCAhPSBudWxsCi0JCQkJCQkJCQkJCSYmIGluc2VydC5lcXVhbHMoImJlZm9yZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQlpbnNlcnRBZnRlciA9IGZhbHNlOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJd2l6YXJkRXh0ZW5kZXIKLQkJCQkJCQkJCQkJLmFkZE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24obmV3IE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQkJCQkJCQkJCQkJd2l6YXJkUGFnZSwgdGFyZ2V0LAotCQkJCQkJCQkJCQkJCWluc2VydEFmdGVyKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUVQRlVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2dnZXIoKS5sb2dFcnJvcihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgbmV3IHdpemFyZCBwYWdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXROZXdXaXphcmRQYWdlcyhMaXN0PElXaXphcmRQYWdlPiB3aXphcmRQYWdlcykgewotCQlMaXN0PElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uPiBjb250cmlidXRpb25zID0gd2l6YXJkRXh0ZW5kZXIKLQkJCQkuZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKTsKLQkJaWYgKGNvbnRyaWJ1dGlvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvcjxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4gaXQgPSBjb250cmlidXRpb25zCi0JCQkJCS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24gPSAoTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbikgaXQKLQkJCQkJCS5uZXh0KCk7Ci0JCQkJSVdpemFyZFBhZ2UgbmV3V2l6YXJkUGFnZSA9IChJV2l6YXJkUGFnZSkgY29udHJpYnV0aW9uCi0JCQkJCQkuZ2V0V2l6YXJkUGFnZSgpOwotCQkJCVN0cmluZyB0YXJnZXRXaXphcmRQYWdlTmFtZSA9IGNvbnRyaWJ1dGlvbgotCQkJCQkJLmdldFRhcmdldFdpemFyZFBhZ2UoKTsKLQkJCQlpZiAodGFyZ2V0V2l6YXJkUGFnZU5hbWUgIT0gbnVsbCkgewotCQkJCQlpbnQgdG90YWxQYWdlcyA9IHdpemFyZFBhZ2VzLnNpemUoKTsKLQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJZm9yIChJdGVyYXRvcjxJV2l6YXJkUGFnZT4gaXRlciA9IHdpemFyZFBhZ2VzLml0ZXJhdG9yKCk7IHdpemFyZFBhZ2VzCi0JCQkJCQkJLnNpemUoKSA9PSB0b3RhbFBhZ2VzCi0JCQkJCQkJJiYgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlJV2l6YXJkUGFnZSBwYWdlID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlpZiAocGFnZS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldFdpemFyZFBhZ2VOYW1lKSkgewotCQkJCQkJCWlmIChjb250cmlidXRpb24uZ2V0SW5zZXJ0QWZ0ZXIoKSkgewotCQkJCQkJCQl3aXphcmRQYWdlcy5hZGQoaW5kZXggKyAxLCBuZXdXaXphcmRQYWdlKTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQl3aXphcmRQYWdlcy5hZGQoaW5kZXgsIG5ld1dpemFyZFBhZ2UpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWluZGV4Kys7Ci0JCQkJCX0KLQkJCQkJaWYgKHdpemFyZFBhZ2VzLnNpemUoKSA9PSB0b3RhbFBhZ2VzKSB7Ci0JCQkJCQl3aXphcmRQYWdlcy5hZGQobmV3V2l6YXJkUGFnZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZFBhZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvQmFzZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczZTYyMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0Jhc2VXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudWkudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEVQRiB3aXphcmQgcGFnZXMuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQGF1dGhvciBCaW5neHVlIFh1Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIEJhc2VXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihwYWdlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCBwYWdlIG5hbWUKLQkgKiBAcGFyYW0gdGl0bGUKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSB0aXRsZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCBwYWdlIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIHRpdGxlSW1hZ2UKLQkgKiAgICAgICAgICAgIHRoZSB3aXphcmQgcGFnZSB0aXRsZSBpbWFnZQotCSAqLwotCXB1YmxpYyBCYXNlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2NyaXB0aW9uLAotCQkJSW1hZ2VEZXNjcmlwdG9yIHRpdGxlSW1hZ2UpIHsKLQkJc3VwZXIocGFnZU5hbWUsIHRpdGxlLCB0aXRsZUltYWdlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCW9uRW50ZXJQYWdlKG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiBlbnRlcmluZyB0aGlzIHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGEgZGF0YSBpbml0aWFsaXphdGlvbiBvYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBvbkVudGVyUGFnZShPYmplY3Qgb2JqKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZSNnZXROZXh0UGFnZSgpCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKCkgewotCQlJV2l6YXJkUGFnZSBuZXh0UGFnZSA9IHN1cGVyLmdldE5leHRQYWdlKCk7Ci0JCWlmIChuZXh0UGFnZSAhPSBudWxsICYmIG5leHRQYWdlIGluc3RhbmNlb2YgQmFzZVdpemFyZFBhZ2UpIHsKLQkJCXRyeSB7Ci0JCQkJKChCYXNlV2l6YXJkUGFnZSkgbmV4dFBhZ2UpLm9uRW50ZXJQYWdlKGdldE5leHRQYWdlRGF0YSgpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHRQYWdlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRhdGEgaW5pdGlhbGl6YXRpb24gb2JqZWN0IGZvciB0aGUgbmV4dCB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxjb2RlPk9iamVjdDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5leHRQYWdlRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbXBvc2l0ZSB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb21wb3NpdGUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21wb3NpdGUgY3JlYXRlR3JpZExheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9zaXRlIHdpdGggYSBncmlkIGxheW91dC4KLQkgKiA8cD4KLQkgKiBUaGUgY2hpbGQgY29tcG9zaXRlIHdpbGwgYmUgaW5kZW50ZWQgZnJvbSB0aGUgcGFyZW50IGNvbXBvc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbXBvc2l0ZSB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENvbXBvc2l0ZSBjcmVhdGVDaGlsZEdyaWRMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQ2hpbGRHcmlkTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCBhIGdyaWQgbGF5b3V0LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBncm91cCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVHcmlkTGF5b3V0R3JvdXAocGFyZW50LCB0ZXh0LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBncm91cCB3aXRoIGEgZ3JpZCBsYXlvdXQuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBncm91cAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGdyb3VwIHdpbGwgdGFrZSB1cAotCSAqIEBwYXJhbSBlcXVhbENvbHVtbldpZHRoCi0JICogICAgICAgICAgICBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29sdW1uIGNlbGxzIHNob3VsZCBiZSBzYW1lIHdpZHRoIG9yCi0JICogICAgICAgICAgICBub3QKLQkgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgR3JvdXAgY3JlYXRlR3JpZExheW91dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBlcXVhbENvbHVtbldpZHRoKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUdyaWRMYXlvdXRHcm91cChwYXJlbnQsIHRleHQsIGNvbHVtbiwKLQkJCQllcXVhbENvbHVtbldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxhYmVsIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIGNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxhYmVsIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBsYWJlbAotCSAqIEByZXR1cm4gYSA8Y29kZT5MYWJlbDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB2ZXJ0aWNhbGx5IGFsaWduZWQgbGFiZWwgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVZlcnRpY2FsbHlBbGlnbmVkTGFiZWwocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0LCB3aWR0aEhpbnQsCi0JCQkJaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGhlaWdodEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgaGVpZ2h0IChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwKLQkJCWludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsCi0JCQkJLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSB3aWR0aEhpbnQKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJyZWQgd2lkdGggKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGRlZmF1bHRUZXh0LAotCQkJaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHJlYWRvbmx5IHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZGVmYXVsdFRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dChwYXJlbnQsIGRlZmF1bHRUZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPlRleHQ8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGV4dCBjcmVhdGVFZGl0YWJsZVRleHQoQ29tcG9zaXRlIHBhcmVudCwKLQkJCVN0cmluZyBkZWZhdWx0VGV4dCwgaW50IHdpZHRoSGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVFZGl0YWJsZVRleHQocGFyZW50LCBkZWZhdWx0VGV4dCwgd2lkdGhIaW50LAotCQkJCWNvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gZGVmYXVsdFRleHQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQsIGludCB3aWR0aEhpbnQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlZGl0YWJsZSB0ZXh0IGNvbnRyb2wuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVkaXRhYmxlIHRleHQgY29udHJvbCB0aGF0IG9ubHkgdGFrZXMgdXAgb25lIGNvbHVtbiBjZWxsLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGRlZmF1bHRUZXh0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlRWRpdGFibGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQsCi0JCQlTdHJpbmcgZGVmYXVsdFRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlRWRpdGFibGVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgZWRpdGFibGUgdGV4dCBjb250cm9sIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uCi0JICogY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGV4dDwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBUZXh0IGNyZWF0ZUVkaXRhYmxlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUVkaXRhYmxlVGV4dChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkb25seSBtdWx0aS1saW5lIHRleHQgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBkZWZhdWx0VGV4dAotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0PC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHQgY3JlYXRlTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGRlZmF1bHRUZXh0LCBpbnQgd2lkdGhIaW50LCBpbnQgaGVpZ2h0SGludCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVNdWx0aUxpbmVUZXh0KHBhcmVudCwgZGVmYXVsdFRleHQsIHdpZHRoSGludCwKLQkJCQloZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3guCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib2JveChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNvbWJvYm94KHBhcmVudCwgY29sdW1uKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBjb21ib2JveCB3aXRoIHJlYWRvbmx5IHN0eWxlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q29tYm88L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQ29tYm8gY3JlYXRlUmVhZE9ubHlDb21ib2JveChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVJlYWRPbmx5Q29tYm9ib3gocGFyZW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gY29tYm9ib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5Db21ibzwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ib2JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNvbWJvYm94KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNoZWNrYm94LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlQ2hlY2tib3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsCi0JCQlpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94KHBhcmVudCwgdGV4dCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0Ci0JICogICAgICAgICAgICB0aGUgdGV4dCBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgPGNvZGU+QnV0dG9uPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEJ1dHRvbiBjcmVhdGVDaGVja2JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVDaGVja2JveChwYXJlbnQsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGNvbnRyb2wgd2lsbCB0YWtlIHVwCi0JICogQHBhcmFtIHNlbGVjdGVkCi0JICogICAgICAgICAgICBpZiA8Y29kZT50cnVlPC9jb2RlPiwgc2VsZWN0IHRoZSByYWRpbyBidXR0b24gYnkgZGVmYXVsdAotCSAqIEByZXR1cm4gYSA8Y29kZT5CdXR0b248L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LAotCQkJaW50IGNvbHVtbiwgYm9vbGVhbiBzZWxlY3RlZCkgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVSYWRpb0J1dHRvbihwYXJlbnQsIHRleHQsIGNvbHVtbiwgc2VsZWN0ZWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gcmFkaW8gYnV0dG9uIHRoYXQgb25seSB0YWtlcyB1cCBvbmUgY29sdW1uIGNlbGwuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dAotCSAqICAgICAgICAgICAgdGhlIHRleHQgZm9yIHRoZSBjb250cm9sCi0JICogQHJldHVybiBhIDxjb2RlPkJ1dHRvbjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LAotCQkJaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIFNXVFV0aWwuY3JlYXRlVGV4dFZpZXdlcihwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZG9ubHkgdGV4dCB2aWV3ZXIgdGhhdCBvbmx5IHRha2VzIHVwIG9uZSBjb2x1bW4gY2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gYSA8Y29kZT5UZXh0Vmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFRleHRWaWV3ZXIgY3JlYXRlVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRleHRWaWV3ZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoSGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCB3aWR0aCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gaGVpZ2h0SGludAotCSAqICAgICAgICAgICAgdGhlIHByZWZlcnJlZCBoZWlnaHQgKGluIHBpeGVscykgZm9yIHRoZSBjb250cm9sCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+VGFibGVWaWV3ZXI8L2NvZGU+IG9iamVjdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVGFibGVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkJCWludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZVRhYmxlVmlld2VyKHBhcmVudCwgd2lkdGhIaW50LCBoZWlnaHRIaW50LCBjb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjaGVja2JveCB0YWJsZSB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkdGhIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIHdpZHRoIChpbiBwaXhlbHMpIGZvciB0aGUgY29udHJvbAotCSAqIEBwYXJhbSBoZWlnaHRIaW50Ci0JICogICAgICAgICAgICB0aGUgcHJlZmVycmVkIGhlaWdodCAoaW4gcGl4ZWxzKSBmb3IgdGhlIGNvbnRyb2wKLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvbHVtbiBjZWxscyB0aGF0IHRoZSBjb250cm9sIHdpbGwgdGFrZSB1cAotCSAqIEByZXR1cm4gYSA8Y29kZT5DaGVja2JveFRhYmxlVmlld2VyPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIENoZWNrYm94VGFibGVWaWV3ZXIgY3JlYXRlQ2hlY2tib3hUYWJsZVZpZXdlcigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQsIGludCBoZWlnaHRIaW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCB3aWR0aEhpbnQsIGhlaWdodEhpbnQsCi0JCQkJY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY2hlY2tib3ggdGFibGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIGNvbHVtbgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW4gY2VsbHMgdGhhdCB0aGUgY29udHJvbCB3aWxsIHRha2UgdXAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+Q2hlY2tib3hUYWJsZVZpZXdlcjwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBDaGVja2JveFRhYmxlVmlld2VyIGNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBTV1RVdGlsLmNyZWF0ZUNoZWNrYm94VGFibGVWaWV3ZXIocGFyZW50LCAzNjAsIDE3NSwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjb2x1bW4KLQkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1uIGNlbGxzIHRoYXQgdGhlIGxpbmUgd2lsbCB0YWtlIHVwCi0JICogQHJldHVybiBhIDxjb2RlPkxhYmVsPC9jb2RlPiBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIExhYmVsIGNyZWF0ZUxpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbikgewotCQlyZXR1cm4gU1dUVXRpbC5jcmVhdGVMaW5lKHBhcmVudCwgY29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIHRleHQgY29udHJvbCBoYXMgc29tZSB0ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICogICAgICAgICAgICB0aGUgdGV4dCBjb250cm9sCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdGV4dCBjb250cm9sIGhhcyBzb21lIHRleHQsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTm9uRW1wdHlUZXh0KFRleHQgY29udHJvbCkgewotCQlyZXR1cm4gU1dUVXRpbC5pc05vbkVtcHR5VGV4dChjb250cm9sKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvSU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvSU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkZjZkNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIG5ldyB3aXphcmQgcGFnZSBjb250cmlidXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uIHsKLQotCS8qKgotCSAqIEdldHMgdGhlIG5ldyB3aXphcmQgcGFnZSB0aGF0IGlzIGJlaW5nIGFkZGVkIHRvIGEgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdGhhdCBpcyB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvcgotCSAqIGluc2VydGluZyB0aGUgbmV3IHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgYmFzZSB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0V2l6YXJkUGFnZSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zZXJ0aW9uIG9wdGlvbiBmb3IgdGhlIG5ldyB3aXphcmQgcGFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBuZXcgd2l6YXJkIHBhZ2Ugc2hvdWxkIGJlIGluc2VydGVkCi0JICogICAgICAgICBhZnRlciB0aGUgdGFyZ2V0IHdpemFyZCBwYWdlOyA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgc2hvdWxkCi0JICogICAgICAgICBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIHRhcmdldCB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEluc2VydEFmdGVyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODdiZDEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvSVJlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHJlcGxhY2Ugd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24gewotCi0JLyoqCi0JICogR2V0cyB0aGUgd2l6YXJkIHBhZ2UgdGhhdCByZXBsYWNlcyBhIHNwZWNpZmljIHdpemFyZCBwYWdlIGluIGEgd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5JV2l6YXJkUGFnZTwvY29kZT4gb2JqZWN0Ci0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFdpemFyZFBhZ2UoKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHBhZ2UgdGhhdCBpcyBzaG91bGQgYmUgcmVwbGFjZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBiYXNlIHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRXaXphcmRQYWdlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvSVdpemFyZEV4dGVuZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL0lXaXphcmRFeHRlbmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGZlNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvSVdpemFyZEV4dGVuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotCi0vKioKLSAqIFRoZSBpbnRlcmZhY2UgZm9yIGEgZ2VuZXJpYyB3aXphcmQgZXh0ZW5kZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElXaXphcmRFeHRlbmRlciB7Ci0KLQkvKioKLQkgKiBHaXZlcyB0aGUgd2l6YXJkIGV4dGVuZGVyIGEgY2hhbmNlIHRvIHBlcmZvcm0gc29tZSBpbml0aWFsaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KFdpemFyZCB3aXphcmQpOwotCi0JLyoqCi0JICogR2l2ZXMgdGhlIHdpemFyZCBleHRlbmRlciBhIGNoYW5jZSB0byBzYXZlIHJlZmVyZW5jZXMgdG8gd2l6YXJkIHBhZ2VzLgotCSAqIAotCSAqIEBwYXJhbSB3aXphcmRQYWdlcwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIG9mIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBvd25lZCBieSB0aGUgd2l6YXJkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdFdpemFyZFBhZ2VzKExpc3Q8SVdpemFyZFBhZ2U+IHdpemFyZFBhZ2VzKTsKLQotCS8qKgotCSAqIEFkZHMgYSByZXBsYWNlIHdpemFyZCBwYWdlIGNvbnRyaWJpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udHJpYnV0aW9uCi0JICogICAgICAgICAgICB0aGUgcmVwbGFjZSB3aXphcmQgcGFnZSBjb250cmlidXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbigKLQkJCUlSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24pOwotCi0JLyoqCi0JICogR2V0cyB0aGUgd2l6YXJkIHBhZ2UgdGhhdCByZXBsYWNlcyBhIGJhc2Ugd2l6YXJkIHBhZ2UuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGJhc2Ugd2l6YXJkIHRvIGJlIHJlcGxhY2VkCi0JICogQHJldHVybiBhIDxjb2RlPklXaXphcmRQYWdlPC9jb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8KLQkgKiAgICAgICAgIHJlcGxhY2VtZW50IHBhZ2UgaXMgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldFJlcGxhY2VXaXphcmRQYWdlKFN0cmluZyB0YXJnZXQpOwotCi0JLyoqCi0JICogQWRkcyBhIG5ldyB3aXphcmQgcGFnZSBjb250cmlidXRpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRyaWJ1dGlvbgotCSAqICAgICAgICAgICAgdGhlIG5ldyB3aXphcmQgcGFnZSBjb250cmlidXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKAotCQkJSU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uKTsKLQotCS8qKgotCSAqIEdldHMgYW4gYXJyYXkgb2YgbmV3IHdpemFyZCBwYWdlcyB0byBiZSBhZGRlZCB0byBhIGJhc2Ugd2l6YXJkLgotCSAqIAotCSAqIEByZXR1cm4gYW4gY29sbGVjdGlvbiBvZiA8Y29kZT5OZXdXaXphcmRQYWdlRXhldG5zaW9uPC9jb2RlPiBvYmplY3RzIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMaXN0PElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uPiBnZXROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9ucygpOwotCi0JLyoqCi0JICogQWxsb3dzIGEgd2l6YXJkIGV4dGVuZGVyIHRvIGNvbnRyb2wgdGhlIGZsb3cgb2YgdGhlIHdpemFyZCBwYWdlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgd2l6YXJkIHBhZ2UKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpOwotCi0JLyoqCi0JICogQWxsb3dzIGEgd2l6YXJkIGV4dGVuZGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB3aXphcmQgY291bGQgYmUgZmluaXNoZWQKLQkgKiB3aXRob3V0IGZ1cnRoZXIgdXNlciBpbnRlcmFjdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB3aXphcmQgY291bGQgYmUgZmluaXNoZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKTsKLQotCS8qKgotCSAqIEFsbG93cyBhIHdpemFyZCBleHRlbmRlciB0byBwZXJmb3JtIHRoZSBmaW5pc2ggb3BlcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZpbmlzaCBvcGVyYXRpb24gaXMgZXhlY3V0ZWQKLQkgKiAgICAgICAgIHN1Y2Nlc3NmdWxseQotCSAqLwotCXB1YmxpYyBib29sZWFuIGRvRmluaXNoKCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9OZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwN2I1OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9OZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBuZXcgd2l6YXJkIHBhZ2UgY29udHJpYnV0aW9uIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24gaW1wbGVtZW50cyBJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiB7Ci0KLQlwcml2YXRlIElXaXphcmRQYWdlIHBhZ2U7Ci0KLQlwcml2YXRlIFN0cmluZyB0YXJnZXQ7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5zZXJ0QWZ0ZXIgPSB0cnVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB3aXphcmQgcGFnZQotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRoYXQgaXMgdXNlZCBhcyBhIHJlZmVyZW5jZQotCSAqICAgICAgICAgICAgZm9yIGluc2VyaW5nIHRoZSBuZXcgd2l6YXJkIHBhZ2UKLQkgKiBAcGFyYW0gaW5zZXJ0QWZ0ZXIKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBpbnNlcnQgdGhlIG5ldyB3aXphcmQgcGFnZSBhZnRlciB0aGUKLQkgKiAgICAgICAgICAgIHRhcmdldCB3aXphcmQgcGFnZTsgaWYgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpbnNlcnQgdGhlIG5ldwotCSAqICAgICAgICAgICAgd2l6YXJkIHBhZ2UgYmVmb3JlIHRoZSB0YXJnZXQgd2l6YXJkIHBhZ2UKLQkgKi8KLQlwdWJsaWMgTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihJV2l6YXJkUGFnZSBwYWdlLCBTdHJpbmcgdGFyZ2V0LAotCQkJYm9vbGVhbiBpbnNlcnRBZnRlcikgewotCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQkJdGhpcy5pbnNlcnRBZnRlciA9IGluc2VydEFmdGVyOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBwYWdlLgotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKCkgewotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRoYXQgaXMgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IKLQkgKiBpbnNlcnRpbmcgdGhlIG5ldyB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0V2l6YXJkUGFnZSgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbnNlcnRpb24gb3B0aW9uIGZvciB0aGUgbmV3IHdpemFyZCBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG5ldyB3aXphcmQgcGFnZSBzaG91bGQgYmUgaW5zZXJ0ZWQKLQkgKiAgICAgICAgIGFmdGVyIHRoZSB0YXJnZXQgd2l6YXJkIHBhZ2U7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQKLQkgKiAgICAgICAgIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgdGFyZ2V0IHdpemFyZCBwYWdlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0SW5zZXJ0QWZ0ZXIoKSB7Ci0JCXJldHVybiBpbnNlcnRBZnRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5YjFkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1JlcGxhY2VXaXphcmRQYWdlQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCByZXBsYWNlbWVudCB3aXphcmQgcGFnZSBjb250cmlidXRpb24gaW1wbGVtZW50YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMgotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24gaW1wbGVtZW50cwotCQlJUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24gewotCi0JcHJpdmF0ZSBJV2l6YXJkUGFnZSBwYWdlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFnZQotCSAqICAgICAgICAgICAgdGhlIHdpemFyZCBwYWdlIHRoYXQgcmVwbGFjZXMgYSBzcGVjaWZpYyB3aXphcmQgcGFnZSBpbiBhCi0JICogICAgICAgICAgICB3aXphcmQKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYmFzZSB3aXphcmQgcGFnZSB0aGF0IGlzIHNob3VsZCBiZSByZXBsYWNlZAotCSAqLwotCXB1YmxpYyBSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihJV2l6YXJkUGFnZSBwYWdlLCBTdHJpbmcgdGFyZ2V0KSB7Ci0JCXRoaXMucGFnZSA9IHBhZ2U7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdpemFyZCBwYWdlIHRoYXQgcmVwbGFjZXMgYSBzcGVjaWZpYyB3aXphcmQgcGFnZSBpbiBhIHdpemFyZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+SVdpemFyZFBhZ2U8L2NvZGU+IG9iamVjdAotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRXaXphcmRQYWdlKCkgewotCQlyZXR1cm4gcGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBiYXNlIHdpemFyZCBwYWdlIHRoYXQgaXMgc2hvdWxkIGJlIHJlcGxhY2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZWQgYmFzZSB3aXphcmQgcGFnZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0V2l6YXJkUGFnZSgpIHsKLQkJcmV0dXJuIHRhcmdldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51aS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VpL3dpemFyZHMvV2l6YXJkQ2F0ZWdvcmllcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9XaXphcmRDYXRlZ29yaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjBhZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9XaXphcmRDYXRlZ29yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkczsKLQotLyoqCi0gKiBUaGUgRVBGIHdpemFyZCBjYXRlZ29yaWVzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZENhdGVnb3JpZXMgewotCi0JLyoqCi0JICogVGhlIE5ldyBXaXphcmRzIENhdGVnb3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19XSVpBUkRTX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLmVwZi51aS5uZXdXaXphcmRzLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIEV4cG9ydCBXaXphcmRzIENhdGVnb3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVF9XSVpBUkRTX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLmVwZi51aS5leHBvcnRXaXphcmRzLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIEltcG9ydCBXaXphcmRzIENhdGVnb3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUE9SVF9XSVpBUkRTX0NBVEVHT1JZID0gIm9yZy5lY2xpcHNlLmVwZi51aS5pbXBvcnRXaXphcmRzLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1dpemFyZEV4dGVuZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkvc3JjL29yZy9lY2xpcHNlL2VwZi91aS93aXphcmRzL1dpemFyZEV4dGVuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YzUwODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpL3NyYy9vcmcvZWNsaXBzZS9lcGYvdWkvd2l6YXJkcy9XaXphcmRFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgd2l6YXJkIGV4dGVuZGVyIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIFdpemFyZEV4dGVuZGVyIGltcGxlbWVudHMgSVdpemFyZEV4dGVuZGVyIHsKLQotCXByb3RlY3RlZCBXaXphcmQgd2l6YXJkOwotCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElXaXphcmRQYWdlPiByZXBsYWNlV2l6YXJkUGFnZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElXaXphcmRQYWdlPigpOwotCi0JcHJvdGVjdGVkIExpc3Q8SU5ld1dpemFyZFBhZ2VDb250cmlidXRpb24+IG5ld1dpemFyZFBhZ2VDb250cmliaXRpb25zID0gbmV3IEFycmF5TGlzdDxJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbj4oKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFdpemFyZEV4dGVuZGVyKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyI2luaXQoV2l6YXJkKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoV2l6YXJkIHdpemFyZCkgewotCQl0aGlzLndpemFyZCA9IHdpemFyZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNpbml0KFdpemFyZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0V2l6YXJkUGFnZXMoTGlzdDxJV2l6YXJkUGFnZT4gd2l6YXJkUGFnZXMpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNhZGRSZXBsYWNlV2l6YXJkUGFnZUNvbnRyaWJ1dGlvbihJUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgYWRkUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQlJUmVwbGFjZVdpemFyZFBhZ2VDb250cmlidXRpb24gY29udHJpYnV0aW9uKSB7Ci0JCXJlcGxhY2VXaXphcmRQYWdlcy5wdXQoY29udHJpYnV0aW9uLmdldFRhcmdldFdpemFyZFBhZ2UoKSwgY29udHJpYnV0aW9uCi0JCQkJLmdldFdpemFyZFBhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjZ2V0UmVwbGFjZVdpemFyZFBhZ2UoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRSZXBsYWNlV2l6YXJkUGFnZShTdHJpbmcgdGFyZ2V0KSB7Ci0JCXJldHVybiAoSVdpemFyZFBhZ2UpIHJlcGxhY2VXaXphcmRQYWdlcy5nZXQodGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNhZGROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE5ld1dpemFyZFBhZ2VDb250cmlidXRpb24oCi0JCQlJTmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbiBjb250cmlidXRpb24pIHsKLQkJbmV3V2l6YXJkUGFnZUNvbnRyaWJpdGlvbnMuYWRkKGNvbnRyaWJ1dGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudWkud2l6YXJkcy5JV2l6YXJkRXh0ZW5kZXIjZ2V0TmV3V2l6YXJkUGFnZUNvbnRyaWJ1dGlvbnMoKQotCSAqLwotCXB1YmxpYyBMaXN0PElOZXdXaXphcmRQYWdlQ29udHJpYnV0aW9uPiBnZXROZXdXaXphcmRQYWdlQ29udHJpYnV0aW9ucygpIHsKLQkJcmV0dXJuIG5ld1dpemFyZFBhZ2VDb250cmliaXRpb25zOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyI2dldE5leHRQYWdlKElXaXphcmRQYWdlKQotCSAqLwotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXROZXh0UGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCS8vIExldCB0aGUgYmFzZSB3aXphcmQgZHJpdmVzIHRoZSBwYWdlIGZsb3cuCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVpLndpemFyZHMuSVdpemFyZEV4dGVuZGVyI2NhbkZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51aS53aXphcmRzLklXaXphcmRFeHRlbmRlciNkb0ZpbmlzaCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODU5YTdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY3YmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZQotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDk4NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRmNGMxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFVNQSBFY29yZSBFeHRlbnNpb24KLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lNb2RlbE9iamVjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JTW9kZWxPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjODJlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lNb2RlbE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIHN1cHBvcnRlZCBieSBhbGwgVU1BIG1vZGVsIG9iamVjdHMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGR5bmFtaWMgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHN1cHBvcnQgYmV0d2VlbgotICogbW9kZWwgb2JqZWN0cyB0aHJvdWdoIHRoZSB1c2Ugb2Ygb3Bwb3NpdGUgZmVhdHVyZXMuIEl0IGFsc28gYWxsb3dzIHRoZQotICogZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUsIGFzIGRlZmluZWQgaW4gYSBtZXRhbCBtb2RlbCwgdG8gYmUgb3ZlcndyaXR0ZW4uCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsT2JqZWN0IGV4dGVuZHMgRURhdGFPYmplY3QgewotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYSB3YXkgdG8gcXVlcnkgdGhlIG92ZXJyaWRlbiBkZWZhdWx0IHZhbHVlIGRlZmluZWQgaW4gdGhlCi0JICogbWV0YS1tb2RlbCBmb3IgYSBVTUEgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGEgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHZhbHVlIG9mIGFuIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBvcHBvc2l0ZSBmZWF0dXJlCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShPcHBvc2l0ZUZlYXR1cmUgZmVhdHVyZSk7Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gYSBjb2xsZWN0aW9uIG9mIG9wcG9zaXRlIGZlYXR1cmVzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0T3Bwb3NpdGVGZWF0dXJlcygpOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lQcm94eVJlc29sdXRpb25MaXN0ZW5lci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiMDdmOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lQcm94eVJlc29sdXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHByb3h5IHJlc29sdXRpb24gbGlzdGVuZXIgYXR0YWNoZWQgdG8gYSBVTUEgcmVzb3VyY2Ugc2V0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm94eVJlc29sdXRpb25MaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBSZWNlaXZlcyBub3RpZmljYXRpb24gb2YgYW4gZXhjZXB0aW9uIHRoYXQgaGFzIG9jY3VycmVkIHdoaWxlIHJlc29sdmluZyBhCi0JICogcHJveHkgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHRoYXQgaGFzIG9jY3VycmVkCi0JICovCi0Jdm9pZCBub3RpZnlFeGNlcHRpb24oRXhjZXB0aW9uIGUpOwotCi0JLyoqCi0JICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHRoYXQgYSBwcm94eSBoYXMgYmVlbiByZXNvbHZlZCBzdWNjZXNzZnVsbHkuCi0JICogCi0JICogQHBhcmFtIHByb3h5Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdAotCSAqIEBwYXJhbSByZXNvbHZlZAotCSAqICAgICAgICAgICAgdGhlIHJlc29sdmVkIG9iamVjdAotCSAqLwotCXZvaWQgcHJveHlSZXNvbHZlZChPYmplY3QgcHJveHksIE9iamVjdCByZXNvbHZlZCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVVtYVJlc291cmNlU2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL0lVbWFSZXNvdXJjZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA3NWEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvSVVtYVJlc291cmNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0KLS8qKgotICogVGhlIGludGVyZmFjZSBmb3IgYSBVTUEgcmVzb3VyY2Ugc2V0LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVbWFSZXNvdXJjZVNldCBleHRlbmRzIFJlc291cmNlU2V0IHsKLQotCS8qKgotCSAqIEdldHMgdGhlIG1vZGVsIG9iamVjdCByZXNvbHZlZCBieSBhIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKiAgICAgICAgICAgIHRoZSBwcm94eSByZXNvbHZlcgotCSAqIEBwYXJhbSB1cmkKLQkgKiAgICAgICAgICAgIHRoZSBVUkkgdXNlZCB0byByZXNvbHZlIHRoZSBwcm94eQotCSAqIEBwYXJhbSBsb2FkT25EZW1hbmQKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBjcmVhdGUgYW5kIGxvYWQgdGhlIHJlc291cmNlIGlmIGl0Ci0JICogICAgICAgICAgICBkb2VzIG5vdCBleGlzdHMKLQkgKiBAcmV0dXJuIHRoZSBtb2RlbCBvYmplY3QgcmVzb2x2ZWQgYnkgdGhlIFVSSQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I2dldEVPYmplY3QoRU9iamVjdCwgVVJJLCBib29sZWFuKQotCSAqLwotCUVPYmplY3QgZ2V0RU9iamVjdChFT2JqZWN0IHJlc29sdmVyLCBVUkkgdXJpLCBib29sZWFuIGxvYWRPbkRlbWFuZCk7Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvUmVzb2x2ZUV4Y2VwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9SZXNvbHZlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDliZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9SZXNvbHZlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLldyYXBwZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYW4gZXJyb3IgaGFzIG9jY3VycmVkIHdoaWxlIHJlc29sdmluZyBhIHByb3h5IG9iamVjdC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlc29sdmVFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyNTg0MTI4MTU4MTQ2MzYwODFMOwotCi0JcHJpdmF0ZSBFT2JqZWN0IHByb3h5OwotCi0JcHJpdmF0ZSBFT2JqZWN0IHJlc29sdmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJveHkKLQkgKiAgICAgICAgICAgIGEgcHJveHkgb2JqZWN0Ci0JICogQHBhcmFtIG1zZwotCSAqICAgICAgICAgICAgYW4gZXJyb3IgbWVzc2FnZQotCSAqIEBwYXJhbSByZXNvbHZlcgotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHJlc29sdmVyCi0JICovCi0JcHVibGljIFJlc29sdmVFeGNlcHRpb24oRU9iamVjdCBwcm94eSwgU3RyaW5nIG1zZywgRU9iamVjdCByZXNvbHZlcikgewotCQlzdXBlcihtc2csIG51bGwpOwotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCXRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgYSBwcm94eSBvYmplY3QKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIHRoYXQgd2FzIHRocm93bgotCSAqLwotCXB1YmxpYyBSZXNvbHZlRXhjZXB0aW9uKEVPYmplY3QgcHJveHksIEV4Y2VwdGlvbiBleGNlcHRpb24sIEVPYmplY3QgcmVzb2x2ZXIpIHsKLQkJc3VwZXIoZXhjZXB0aW9uKTsKLQkJdGhpcy5wcm94eSA9IHByb3h5OwotCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJveHkgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb3h5IG9iamVjdAotCSAqLwotCXB1YmxpYyBFT2JqZWN0IGdldFByb3h5KCkgewotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJveHkgcmVzb2x2ZXIuCi0JICogCi0JICogQHJldHVybiB0aGUgcHJveHkgcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRSZXNvbHZlcigpIHsKLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgUmVzb2x2ZUV4Y2VwdGlvbikgewotCQkJUmVzb2x2ZUV4Y2VwdGlvbiByZSA9IChSZXNvbHZlRXhjZXB0aW9uKSBvYmo7Ci0JCQlpZiAoKHJlc29sdmVyID09IHJlLnJlc29sdmVyKSB8fCAocmVzb2x2ZXIgPT0gbnVsbCAmJiByZS5yZXNvbHZlciA9PSBudWxsKSkgewotCQkJCWlmIChwcm94eSA9PSByZS5wcm94eSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKHByb3h5IGluc3RhbmNlb2YgSW50ZXJuYWxFT2JqZWN0KSB7Ci0JCQkJCVVSSSB1cmkgPSAoKEludGVybmFsRU9iamVjdCkgcHJveHkpLmVQcm94eVVSSSgpOwotCQkJCQlpZiAodXJpICE9IG51bGwgJiYgcmUucHJveHkgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QpIHsKLQkJCQkJCXJldHVybiB1cmkuZXF1YWxzKCgoSW50ZXJuYWxFT2JqZWN0KSByZS5wcm94eSkKLQkJCQkJCQkJLmVQcm94eVVSSSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7Ci0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWlmIChwcm94eSBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdCkgewotCQkJaW50IGhjID0gcmVzb2x2ZXIgPT0gbnVsbCA/IDAgOiByZXNvbHZlci5oYXNoQ29kZSgpOwotCQkJVVJJIHVyaSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKEludGVnZXIudG9TdHJpbmcoaGMpICsgdXJpKS5oYXNoQ29kZSgpOwotCQkJfQotCQkJcmV0dXJuIGhjOwotCQl9Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL011bHRpUmVzb3VyY2VFT2JqZWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvTXVsdGlSZXNvdXJjZUVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MxM2E4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvTXVsdGlSZXNvdXJjZUVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlLkludGVybmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JUHJveHlSZXNvbHV0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JVW1hUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5SZXNvbHZlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5EZWZhdWx0VmFsdWVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0OwotCi0vKioKLSAqIFRoZSBiYXNlIGNsYXNzIGZvciBhbGwgVU1BIG1vZGVsIG9iamVjdHMuCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIEVNRiBzdG9yZXMgbW9kZWwgb2JqZWN0cyByZWxhdGVkIHZpYSBhIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcAotICogaW4gYSBzaW5nbGUgWE1JIGZpbGUuIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgZGVmYXVsdCBFTUYgcGVyc2lzdGVuY2UgYmVoYXZpb3IKLSAqIGJ5IHByb3ZpZGluZyBhIG1lY2hhbmlzbSBmb3IgdGhlIGNvbnRhaW5pbmcgYW5kIGNvbnRhaW5lZCBvYmplY3RzIHRvIGJlCi0gKiBzdG9yZWQgaW4gc2VwYXJhdGUgWE1JIGZpbGVzLiBDb250YWluZWQgb2JqZWN0cyBhcmUgbGF6eSBsb2FkZWQsIHdoZW4KLSAqIHJlcXVpcmVkLCBzaW1pbGFyIHRvIHRoZSBwcm94eSBvYmplY3QgYmVoYXZpb3Igb2YgRU1GJ3Mgc3RhbmRhcmQgcmVzb3VyY2UKLSAqIGltcGxlbWVudGF0aW9uLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlSZXNvdXJjZUVPYmplY3QgZXh0ZW5kcyBFRGF0YU9iamVjdEltcGwgaW1wbGVtZW50cwotCQlJTW9kZWxPYmplY3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1ODEyNjk0NzE1MzA5NzI3M0w7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRWYWx1ZU1hbmFnZXIgZGVmYXVsdFZhbHVlTWFuYWdlciA9IERlZmF1bHRWYWx1ZU1hbmFnZXIuSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmZWF0dXJlLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIGZvciBtaWdyYXRpb24gdXNlIG9ubHkuIERvIG5vdCBjYWxsIHRoaXMKLQkgKiBtZXRob2QgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBmZWF0dXJlIHNpbmNlIGl0IHdpbGwgc2xvdyBkb3duCi0JICogdGhlIGxvYWRpbmcgb2YgYSBtZXRob2QgbGlicmFyeS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYSBmZWF0dXJlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZQotCSAqICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIHNldERlZmF1bHRWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwKLQkJCU9iamVjdCBkZWZhdWx0VmFsdWUpIHsJCQotCQlzZXREZWZhdWx0VmFsdWUoZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCksIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlkZWZhdWx0VmFsdWVNYW5hZ2VyLnNldERlZmF1bHRWYWx1ZSh0eXBlLCBmZWF0dXJlLCBkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhIGZlYXR1cmUuCi0JICogPHA+Ci0JICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgZm9yIG1pZ3JhdGlvbiB1c2Ugb25seS4gRG8gbm90IGNhbGwgdGhpcwotCSAqIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIGZlYXR1cmUgc2luY2UgaXQgd2lsbCBzbG93IGRvd24KLQkgKiB0aGUgbG9hZGluZyBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWRlZmF1bHRWYWx1ZU1hbmFnZXIucmVtb3ZlRGVmYXVsdFZhbHVlKGZlYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFQ2xhc3MgdHlwZSkgewotCQlkZWZhdWx0VmFsdWVNYW5hZ2VyLnJlbW92ZURlZmF1bHRWYWx1ZShmZWF0dXJlLCB0eXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBtYXAgb2YgZW50cmllcyBvZiBPcHBvc2l0ZUZlYXR1cmUgLyBPcHBvc2l0ZUZlYXR1cmUncyB2YWx1ZQotCSAqLwotCXByaXZhdGUgTWFwIG9wcG9zaXRlRmVhdHVyZU1hcDsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNPcHBvc2l0ZUZlYXR1cmUgPSB0cnVlOwotCi0JcHJpdmF0ZSBCb29sZWFuIG5vdGlmeU9wcG9zaXRlID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZCA9IHRydWU7Ci0KLQkvKioKLQkgKiBDaGVja3MgdGhlIHZhbGlkaXR5IG9mIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgaXMgdmFsaWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgb3Bwb3NpdGVBZGQoT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QodGhpcywgb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JCWlmICghbGlzdC5jb250YWlucyhvYmplY3QpKSB7Ci0JCQlsaXN0LmFkZChvYmplY3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgb3Bwb3NpdGVSZW1vdmUoT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9iamVjdCkgewotCQlMaXN0IGxpc3QgPSAoTGlzdCkgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QodGhpcywgb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIGxpc3QpOwotCQl9Ci0JCWxpc3QucmVtb3ZlKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIHByb3h5IG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICBhIHByb3h5IG9iamVjdCB0byByZXNvbHZlCi0JICogQHJldHVybiB0aGUgcmVzb2x2ZWQgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCByZXNvbHZlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEludGVybmFsRU9iamVjdAotCQkJCSYmICgoSW50ZXJuYWxFT2JqZWN0KSBvYmplY3QpLmVJc1Byb3h5KCkpIHsKLQkJCXJldHVybiBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwbGFjZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLAotCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZSAhPSBudWxsICYmICFuZXdWYWx1ZS5lSXNQcm94eSgpICYmIG5ld1ZhbHVlICE9IG9sZFZhbHVlKSB7Ci0JCQlib29sZWFuIG5vdGlmeSA9IGVEZWxpdmVyKCk7Ci0JCQl0cnkgewotCQkJCWVTZXREZWxpdmVyKGZhbHNlKTsKLQkJCQlFY29yZVV0aWwucmVwbGFjZSh0aGlzLCBmZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJQ29tbW9uUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aVJlc291cmNlRU9iamVjdC5yZXBsYWNlKCk6Iik7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICBvYmplY3Q6ICIgKyB0aGlzKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGZlYXR1cmU6ICIgKyBmZWF0dXJlKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIHByb3h5OiAiICsgb2xkVmFsdWUpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgcmVzb2x2ZWQ6ICIgKyBuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQllU2V0RGVsaXZlcihub3RpZnkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQmFzaWNOb3RpZmllckltcGwjZU5vdGlmeShvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24pCi0JICovCi0JcHVibGljIHZvaWQgZU5vdGlmeShOb3RpZmljYXRpb24gbXNnKSB7Ci0JCS8qCi0JCSAqIGlmKCFPcHBvc2l0ZUZlYXR1cmUuaXNEZWxpdmVyT25SZXNvbHZlKCkgJiYgbXNnLmdldEV2ZW50VHlwZSgpID09Ci0JCSAqIE5vdGlmaWNhdGlvbi5SRVNPTFZFKSB7IHJldHVybjsgfQotCQkgKi8KLQotCQlpZiAobXNnLmdldEV2ZW50VHlwZSgpID09IE5vdGlmaWNhdGlvbi5SRVNPTFZFKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCU9iamVjdCBmID0gbXNnLmdldEZlYXR1cmUoKTsKLQkJaWYgKGYgaW5zdGFuY2VvZiBFU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZShmZWF0dXJlKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCkgewotCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG9sZE90aGVyRW5kOwotCQkJCU11bHRpUmVzb3VyY2VFT2JqZWN0IG90aGVyRW5kOwotCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCQkJb2xkT3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW9sZE90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG9sZE90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvbGRPdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJb2xkT3RoZXJFbmQub3Bwb3NpdGVSZW1vdmUob3Bwb3NpdGVGZWF0dXJlLCBtc2cKLQkJCQkJCQkJCS5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXROZXdWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQlyZXBsYWNlKGZlYXR1cmUsIG1zZy5nZXROZXdWYWx1ZSgpLCBvdGhlckVuZCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAob3RoZXJFbmQgIT0gbnVsbCkgewotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uQUREX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXROZXdWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBvYmo7Ci0JCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgb2JqLCBvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlQWRkKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKQotCQkJCQkJCW90aGVyRW5kLm9wcG9zaXRlUmVtb3ZlKG9wcG9zaXRlRmVhdHVyZSwgbXNnCi0JCQkJCQkJCQkuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBOb3RpZmljYXRpb24uUkVNT1ZFX01BTlk6Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSAoKENvbGxlY3Rpb24pIG1zZy5nZXRPbGRWYWx1ZSgpKQotCQkJCQkJCQkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGl0ZXIubmV4dCgpOwotCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5vcHBvc2l0ZVJlbW92ZShvcHBvc2l0ZUZlYXR1cmUsIG1zZwotCQkJCQkJCQkJLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlzd2l0Y2ggKG1zZy5nZXRFdmVudFR5cGUoKSkgewotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BRERfTUFOWToKLQkJCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9ICgoQ29sbGVjdGlvbikgbXNnLmdldE5ld1ZhbHVlKCkpCi0JCQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG9iajsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBvYmosIG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5nZXQoCi0JCQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkJLy8gcmVtb3ZlIG90aGVyRW5kIGZyb20gdGFyZ2V0IGZlYXR1cmUgb2YKLQkJCQkJCQkJCS8vIG9sZFZhbHVlCi0JCQkJCQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlCi0JCQkJCQkJCQkJCS5lR2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYpKQotCQkJCQkJCQkJCQkucmVtb3ZlKG90aGVyRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBtc2cuZ2V0Tm90aWZpZXIoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRV9NQU5ZOgotCQkJCQkJZm9yIChJdGVyYXRvciBpdGVyID0gKChDb2xsZWN0aW9uKSBtc2cuZ2V0T2xkVmFsdWUoKSkKLQkJCQkJCQkJLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCQl9Ci0JCQkJCQkJb3RoZXJFbmQuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KAotCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIE5vdGlmaWNhdGlvbi5BREQ6Ci0JCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE5ld1ZhbHVlKCk7Ci0JCQkJCQlpZiAob3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc29sdmUob3RoZXJFbmQpOwotCQkJCQkJCXJlcGxhY2UoZmVhdHVyZSwgbXNnLmdldE5ld1ZhbHVlKCksIG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJRU9iamVjdCBvbGRWYWx1ZSA9IChFT2JqZWN0KSBvdGhlckVuZAotCQkJCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmdldCgKLQkJCQkJCQkJCQkJb3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyByZW1vdmUgb3RoZXJFbmQgZnJvbSB0YXJnZXQgZmVhdHVyZSBvZgotCQkJCQkJCQkvLyBvbGRWYWx1ZQotCQkJCQkJCQkoKENvbGxlY3Rpb24pIG9sZFZhbHVlCi0JCQkJCQkJCQkJLmVHZXQoKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZikpCi0JCQkJCQkJCQkJLnJlbW92ZShvdGhlckVuZCk7Ci0JCQkJCQkJfQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbXNnLmdldE5vdGlmaWVyKCkpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlNFVDoKLQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBtc2cuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUucmVzb2x2ZU93bmVyKCkpIHsKLQkJCQkJCQlvdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzb2x2ZShvdGhlckVuZCk7Ci0JCQkJCQkJcmVwbGFjZShmZWF0dXJlLCBtc2cuZ2V0TmV3VmFsdWUoKSwgb3RoZXJFbmQpOwotCQkJCQkJfQotCQkJCQkJaWYgKG90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQlFT2JqZWN0IG9sZFZhbHVlID0gKEVPYmplY3QpIG90aGVyRW5kCi0JCQkJCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KAotCQkJCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCQkJCQkJCWlmIChvbGRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCS8vIHNldCB0aGUgdGFyZ2V0IGZlYXR1cmUgb2Ygb2xkVmFsdWUgdG8gbnVsbAotCQkJCQkJCQlvbGRWYWx1ZS5lU2V0KChFU3RydWN0dXJhbEZlYXR1cmUpIGYsIG51bGwpOwotCQkJCQkJCX0KLQkJCQkJCQlvdGhlckVuZC5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5wdXQoCi0JCQkJCQkJCQlvcHBvc2l0ZUZlYXR1cmUsIG1zZy5nZXROb3RpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZjsKLQkJCQkJCQlpZighdGFyZ2V0RmVhdHVyZS5pc01hbnkoKSkgewotCQkJCQkJCQlvbGRPdGhlckVuZCA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgbXNnLmdldE9sZFZhbHVlKCk7Ci0JCQkJCQkJCWlmKG9sZE90aGVyRW5kICE9IG51bGwpIHsKLQkJCQkJCQkJCW9sZE90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChvcHBvc2l0ZUZlYXR1cmUsIG51bGwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgTm90aWZpY2F0aW9uLlJFTU9WRToKLQkJCQkJCS8vIGNhc2UgTm90aWZpY2F0aW9uLlVOU0VUOgotCQkJCQkJb3RoZXJFbmQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIG1zZy5nZXRPbGRWYWx1ZSgpOwotCQkJCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5yZXNvbHZlT3duZXIoKSkgewotCQkJCQkJCW90aGVyRW5kID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByZXNvbHZlKG90aGVyRW5kKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChvdGhlckVuZCAhPSBudWxsKQotCQkJCQkJCW90aGVyRW5kLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dCgKLQkJCQkJCQkJCW9wcG9zaXRlRmVhdHVyZSwgbnVsbCk7Ci0JCQkJCQlicmVhazsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJc3VwZXIuZU5vdGlmeShtc2cpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5CYXNpY05vdGlmaWVySW1wbCNlTm90aWZpY2F0aW9uUmVxdWlyZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVOb3RpZmljYXRpb25SZXF1aXJlZCgpIHsKLQkJaWYgKCFlRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVJlc291cmNlIHJlc291cmNlID0gZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5lRGVsaXZlcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChub3RpZnlPcHBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlpZiAoT3Bwb3NpdGVGZWF0dXJlLmZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJbm90aWZ5T3Bwb3NpdGUgPSBCb29sZWFuLkZBTFNFOwotCQkJfSBlbHNlIHsKLQkJCQlDb2xsZWN0aW9uIGZlYXR1cmVzID0gT3Bwb3NpdGVGZWF0dXJlLmZlYXR1cmVPcHBvc2l0ZUZlYXR1cmVNYXAKLQkJCQkJCS5rZXlTZXQoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCWlmIChmZWF0dXJlcy5jb250YWlucyhpdGVyLm5leHQoKSkpIHsKLQkJCQkJCW5vdGlmeU9wcG9zaXRlID0gQm9vbGVhbi5UUlVFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG5vdGlmeU9wcG9zaXRlID09IG51bGwpIHsKLQkJCQkJbm90aWZ5T3Bwb3NpdGUgPSBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobm90aWZ5T3Bwb3NpdGUuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLmVOb3RpZmljYXRpb25SZXF1aXJlZCgpOwotCX0KLQotCS8qCi0JICogcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkUmVzb3VyY2VzKCkgeyBMaXN0IGNoaWxkcmVuID0gZUNvbnRlbnRzKCk7IGludAotCSAqIHNpemUgPSBjaGlsZHJlbi5zaXplKCk7IGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JICogTXVsdGlSZXNvdXJjZUVPYmplY3QgY2hpbGQgPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGNoaWxkcmVuLmdldChpKTsKLQkgKiBSZXNvdXJjZSByZXNvdXJjZSA9IGNoaWxkLmVSZXNvdXJjZSgpOyBpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSAhPQotCSAqIGVSZXNvdXJjZSgpKSB7IGNoaWxkLnJlbW92ZUNoaWxkUmVzb3VyY2VzKCk7IH0gKChJbnRlcm5hbEVMaXN0KQotCSAqIHJlc291cmNlLmdldENvbnRlbnRzKCkpLmJhc2ljUmVtb3ZlKHRoaXMsIG51bGwpOwotCSAqIGNoaWxkLmVQcm9wZXJ0aWVzKCkuc2V0RVJlc291cmNlKG51bGwpOyB9IH0KLQkqLwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbikKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsCi0JCQlpbnQgbmV3Q29udGFpbmVyRmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVJlc291cmNlLkludGVybmFsIG9sZFJlc291cmNlID0gdGhpcy5lRGlyZWN0UmVzb3VyY2UoKTsKLQkJUmVzb3VyY2UuSW50ZXJuYWwgbmV3UmVzb3VyY2UgPSBuZXdDb250YWluZXIgPT0gbnVsbCA/IG51bGwKLQkJCQk6IG5ld0NvbnRhaW5lci5lSW50ZXJuYWxSZXNvdXJjZSgpOwotCQkvLyBpZiAob2xkUmVzb3VyY2UgIT0gbmV3UmVzb3VyY2UgJiYgb2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkvLyByZW1vdmVDaGlsZFJlc291cmNlcygpOwotCQkvLyB9Ci0KLQkJaW50IG9sZEluZGV4ID0gLTE7Ci0JCWludCBvbGRTaXplID0gLTE7Ci0JCWlmIChvbGRSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlvbGRJbmRleCA9IG9sZFJlc291cmNlLmdldENvbnRlbnRzKCkuaW5kZXhPZih0aGlzKTsKLQkJCW9sZFNpemUgPSBvbGRSZXNvdXJjZS5nZXRDb250ZW50cygpLnNpemUoKTsKLQkJfQotCi0JCU5vdGlmaWNhdGlvbkNoYWluIG1lc3NhZ2VzID0gc3VwZXIuZUJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwKLQkJCQluZXdDb250YWluZXJGZWF0dXJlSUQsIG1zZ3MpOwotCQlpZiAob2xkUmVzb3VyY2UgIT0gbmV3UmVzb3VyY2UgJiYgb2xkUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJLy8gcmVtb3ZlIGFueSBuZXdseSBhZGRlZCBNb2RpZmljYXRpb25UcmFja2luZ0FkYXB0ZXJzIGZyb20gdGhpcwotCQkJLy8gb2JqZWN0J3MgYWRhcHRlciBsaXN0Ci0JCQkvLwotCQkJaWYgKG5ld1Jlc291cmNlICE9IG51bGwpCi0JCQkJbmV3UmVzb3VyY2UuZGV0YWNoZWQodGhpcyk7Ci0KLQkJCS8vIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHNlbWFudGljOiBNdWx0aVJlc291cmNlRU9iamVjdCBpcyBhbGxvd2VkIHRvCi0JCQkvLyBiZSBvd25lZCBieSBib3RoIGNvbnRhaW5lciBhbmQgcmVzb3VyY2UuCi0JCQkvLyBBZGQgdGhpcyBvYmplY3QgYmFjayB0byB0aGUgb2xkIHJlc291cmNlLgotCQkJLy8KLQkJCUJhc2ljRUxpc3QgY29udGVudHMgPSAoKEJhc2ljRUxpc3QpIG9sZFJlc291cmNlLmdldENvbnRlbnRzKCkpOwotCQkJaWYgKG9sZFNpemUgIT0gY29udGVudHMuc2l6ZSgpKSB7Ci0JCQkJLy8gdGhpcyBvYmplY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzCi0JCQkJLy8gYWRkIGl0IGJhY2sKLQkJCQkvLwotCQkJCWlmIChjb250ZW50cy5pc0VtcHR5KCkpIHsKLQkJCQkJLy8gdGhpcyB3aWxsIGZsYWcgcmVzb3VyY2UgYXMgbG9hZGVkCi0JCQkJCS8vCi0JCQkJCWNvbnRlbnRzLmNsZWFyKCk7Ci0JCQkJCWNvbnRlbnRzLnNldERhdGEoMSwgbmV3IE9iamVjdFtdIHsgdGhpcyB9KTsKLQkJCQl9IGVsc2UgewotCQkJCQlPYmplY3RbXSBkYXRhID0gY29udGVudHMudG9BcnJheSgpOwotCQkJCQlPYmplY3RbXSBuZXdEYXRhID0gbmV3IE9iamVjdFtkYXRhLmxlbmd0aCArIDFdOwotCQkJCQlpZiAob2xkSW5kZXggPiAwKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIG5ld0RhdGEsIDAsIG9sZEluZGV4KTsKLQkJCQkJfQotCQkJCQluZXdEYXRhW29sZEluZGV4XSA9IHRoaXM7Ci0JCQkJCWlmIChvbGRJbmRleCA8IGRhdGEubGVuZ3RoKSB7Ci0JCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9sZEluZGV4LCBuZXdEYXRhLCBvbGRJbmRleCArIDEsCi0JCQkJCQkJCWRhdGEubGVuZ3RoIC0gb2xkSW5kZXgpOwotCQkJCQl9Ci0JCQkJCWNvbnRlbnRzLnNldERhdGEobmV3RGF0YS5sZW5ndGgsIG5ld0RhdGEpOwotCQkJCX0KLQkJCX0KLQkJCWVTZXRSZXNvdXJjZShvbGRSZXNvdXJjZSk7Ci0JCQkvLyBkb24ndCBoYXZlIHRvIHJlLWF0dGFjaCB0aGlzIG9iamVjdCB0byBvbGRSZXNvdXJjZSBzaW5jZSBpdCB3YXMKLQkJCS8vIG5vdCBkZXR0YWNoZWQgaW4gc3VwZXIgbWV0aG9kCi0JCQkvLwotCQkJLy8gb2xkUmVzb3VyY2UuYXR0YWNoZWQodGhpcyk7Ci0KLQkJCS8vIGlmKG5ld1Jlc291cmNlICE9IG51bGwpIG5ld1Jlc291cmNlLmF0dGFjaGVkKHRoaXMpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250YWluZXIgYW5kIGNvbnRhaW5lciBmZWF0dXJlIElEIGZvciB0aGlzIG9iamVjdCBvbmx5IGlmIGl0IGlzCi0JICogbm90IGNvbnRhaW5lZCBieSBhbnkgY29udGFpbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuQmFzaWNFT2JqZWN0SW1wbCNlQmFzaWNTZXRDb250YWluZXIob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsCi0JCQlpbnQgbmV3Q29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCUVPYmplY3QgY29udGFpbmVyID0gZUludGVybmFsQ29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgIT0gbnVsbCAmJiAhY29udGFpbmVyLmVJc1Byb3h5KCkpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLmVCYXNpY1NldENvbnRhaW5lcihuZXdDb250YWluZXIsIG5ld0NvbnRhaW5lckZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VCYXNpY1NldENvbnRhaW5lcihvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGVCYXNpY1NldENvbnRhaW5lcihJbnRlcm5hbEVPYmplY3QgbmV3Q29udGFpbmVyLAotCQkJaW50IG5ld0NvbnRhaW5lckZlYXR1cmVJRCkgewotCQlzdXBlci5lQmFzaWNTZXRDb250YWluZXIobmV3Q29udGFpbmVyLCBuZXdDb250YWluZXJGZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRhaW5pbmcgcmVzb3VyY2UgZm9yIHRoaXMgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSByZXMKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0UmVzb3VyY2UoUmVzb3VyY2UuSW50ZXJuYWwgcmVzKSB7Ci0JCWVQcm9wZXJ0aWVzKCkuc2V0RVJlc291cmNlKHJlcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5CYXNpY0VPYmplY3RJbXBsI2VEaXJlY3RSZXNvdXJjZSgpCi0JICovCi0JcHVibGljIEludGVybmFsIGVEaXJlY3RSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmVEaXJlY3RSZXNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIG9iamVjdCByZXByZXNlbnRlZCBieSBwcm94eS4gUHJveHkgY2hhaW5zIGFyZQotCSAqIGZvbGxvd2VkLiBJZiByZXNvdXJjZVNldCBpcyBudWxsLCB0aGUgZ2xvYmFsIHBhY2thZ2UgcmVnaXN0cnkgaXMKLQkgKiBjb25zdWx0ZWQgdG8gb2J0YWluIGEgcGFja2FnZSByZWdpc3RlcmVkIGFnYWluc3QgdGhlIHByb3h5IFVSSSwgbGVzcyBpdHMKLQkgKiBmcmFnbWVudCwgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBkZWZhdWx0IHJlc291cmNlIHNldCBpbXBsZW1lbnRhdGlvbidzCi0JICogZmFsbGJhY2sgYmVoYXZpb3VyLgotCSAqIAotCSAqIEBwYXJhbSBwcm94eQotCSAqICAgICAgICAgICAgdGhlIHByb3h5IHRvIGJlIHJlc29sdmVkLgotCSAqIEBwYXJhbSByZXNvdXJjZVNldAotCSAqICAgICAgICAgICAgdGhlIHJlc291cmNlIHNldCBpbiB3aGljaCB0byByZXNvbHZlLgotCSAqIEByZXR1cm4gdGhlIHJlc29sdmVkIG9iamVjdCwgb3IgdGhlIHByb3h5IGlmIHVuYWJsZSB0byByZXNvbHZlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI3Jlc29sdmUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsCi0JICogICAgICBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQpCi0JICovCi0JcHJpdmF0ZSBFT2JqZWN0IHJlc29sdmVQcm94eShFT2JqZWN0IHByb3h5KSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCi0JCVVSSSBwcm94eVVSSSA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcm94eSkuZVByb3h5VVJJKCk7Ci0JCWlmIChwcm94eVVSSSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUVPYmplY3QgcmVzb2x2ZWRPYmplY3QgPSBudWxsOwotCi0JCQkJaWYgKHJlc291cmNlU2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKHJlc291cmNlU2V0IGluc3RhbmNlb2YgSVVtYVJlc291cmNlU2V0KSB7Ci0JCQkJCQlyZXNvbHZlZE9iamVjdCA9ICgoSVVtYVJlc291cmNlU2V0KSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLmdldEVPYmplY3QodGhpcywgcHJveHlVUkksIHRydWUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzb2x2ZWRPYmplY3QgPSByZXNvdXJjZVNldC5nZXRFT2JqZWN0KHByb3h5VVJJLCB0cnVlKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCUVQYWNrYWdlIGVQYWNrYWdlID0gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJCQkuZ2V0RVBhY2thZ2UocHJveHlVUkkudHJpbUZyYWdtZW50KCkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChlUGFja2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVQYWNrYWdlLmVSZXNvdXJjZSgpOwotCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQlyZXNvbHZlZE9iamVjdCA9IHJlc291cmNlLmdldEVPYmplY3QocHJveHlVUkkKLQkJCQkJCQkJCS5mcmFnbWVudCgpLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHJlc29sdmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJaWYocmVzb2x2ZWRPYmplY3QgIT0gcHJveHkpIHsKLS8vCQkJCQkJcmV0dXJuIHJlc29sdmVQcm94eShyZXNvbHZlZE9iamVjdCk7Ci0JCQkJCQlyZXR1cm4gcmVzb2x2ZWRPYmplY3Q7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkKLQkJCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCQkoU3RyaW5nKSBudWxsLCB0aGlzKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCWlmIChyZXNvdXJjZVNldCBpbnN0YW5jZW9mIElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgewotCQkJCQkoKElQcm94eVJlc29sdXRpb25MaXN0ZW5lcikgcmVzb3VyY2VTZXQpCi0JCQkJCQkJLm5vdGlmeUV4Y2VwdGlvbihuZXcgUmVzb2x2ZUV4Y2VwdGlvbihwcm94eSwKLQkJCQkJCQkJCWV4Y2VwdGlvbiwgdGhpcykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJveHk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KEludGVybmFsRU9iamVjdCBwcm94eSkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IHByb3h5LmVDb250YWluZXIoKTsKLQkJaW50IGZlYXR1cmVJRCA9IHByb3h5LmVDb250YWluZXJGZWF0dXJlSUQoKTsKLQkJRU9iamVjdCByZXN1bHQgPSBudWxsOwotCi0JCXJlc3VsdCA9IHJlc29sdmVQcm94eShwcm94eSk7Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIE11bHRpUmVzb3VyY2VFT2JqZWN0KSB7Ci0JCQlpZiAocHJveHkuZUlzUHJveHkoKSAmJiByZXN1bHQgPT0gcHJveHkpIHsKLQkJCQkvLyBwcm94eSBjb3VsZCBub3QgYmUgcmVzb2x2ZWQKLQkJCQkvLwotCQkJCSgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJlc3VsdCkudmFsaWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS52YWxpZCA9IHRydWU7Ci0KLQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KS5lU2V0Q29udGFpbmVyKAotCQkJCQkJCShJbnRlcm5hbEVPYmplY3QpIGNvbnRhaW5lciwgZmVhdHVyZUlEKTsKLQkJCQl9Ci0KLQkJCQkvLyBtZXJnZSB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBtYXAKLQkJCQkvLwotCQkJCWlmIChyZXN1bHQgIT0gcHJveHkpIHsKLQkJCQkJaWYocHJveHkgaW5zdGFuY2VvZiBNdWx0aVJlc291cmNlRU9iamVjdCkgewotCQkJCQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgbXlPYmogPSAoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHByb3h5OwotCi0JCQkJCQlpZiAobXlPYmoub3Bwb3NpdGVGZWF0dXJlTWFwICE9IG51bGwKLQkJCQkJCQkJJiYgIW15T2JqLm9wcG9zaXRlRmVhdHVyZU1hcC5pc0VtcHR5KCkpIHsKLQkJCQkJCQlNYXAgbmV3TWFwID0gKChNdWx0aVJlc291cmNlRU9iamVjdCkgcmVzdWx0KQotCQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBteU9iai5nZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKQotCQkJCQkJCQkJLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQkJCQlpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkKLQkJCQkJCQkJCS5nZXRLZXkoKTsKLQkJCQkJCQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQkJCQkJCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBuZXdNYXAKLQkJCQkJCQkJCQkuZ2V0KG9wcG9zaXRlRmVhdHVyZSk7Ci0JCQkJCQkJCQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCQl2YWx1ZXMuYWRkQWxsKChDb2xsZWN0aW9uKSBlbnRyeQotCQkJCQkJCQkJCQkJCS5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCW5ld01hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLCBlbnRyeQotCQkJCQkJCQkJCQkJLmdldFZhbHVlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCW15T2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmNsZWFyKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZVJlc291cmNlKCkgIT0gbnVsbCA/IGVSZXNvdXJjZSgpCi0JCQkJCQkJLmdldFJlc291cmNlU2V0KCkgOiBudWxsOwotCQkJCQlpZiAocmVzb3VyY2VTZXQgaW5zdGFuY2VvZiBJUHJveHlSZXNvbHV0aW9uTGlzdGVuZXIpIHsKLQkJCQkJCSgoSVByb3h5UmVzb2x1dGlvbkxpc3RlbmVyKSByZXNvdXJjZVNldCkucHJveHlSZXNvbHZlZCgKLQkJCQkJCQkJcHJveHksIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgY3JlYXRlT3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gT3Bwb3NpdGVGZWF0dXJlLmNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcAotCQkJCS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlDbGFzcyBjbHMgPSAoQ2xhc3MpIGVudHJ5LmdldEtleSgpOwotCQkJaWYgKGNscy5pc0luc3RhbmNlKHRoaXMpKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbikgZW50cnkuZ2V0VmFsdWUoKSkKLQkJCQkJCS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCW1hcC5wdXQoaXRlcmF0b3IubmV4dCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG1hcC5pc0VtcHR5KCkpIHsKLQkJCWhhc09wcG9zaXRlRmVhdHVyZSA9IGZhbHNlOwotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcwotCSAqLwotCXB1YmxpYyBNYXAgZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgewotCQlpZiAob3Bwb3NpdGVGZWF0dXJlTWFwID09IG51bGwgJiYgaGFzT3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCQlvcHBvc2l0ZUZlYXR1cmVNYXAgPSBjcmVhdGVPcHBvc2l0ZUZlYXR1cmVNYXAoKTsKLQkJfQotCQlpZihvcHBvc2l0ZUZlYXR1cmVNYXAgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJfQotCQlyZXR1cm4gb3Bwb3NpdGVGZWF0dXJlTWFwOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG9wcG9zaXRlIGZlYXR1cmUgbWFwLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgb3Bwb3NpdGUgZmVhdHVyZXMgbWFwcGVkIHRvIHRoZWlyIHZhbHVlcyBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhbnkgb3Bwb3NpdGUKLQkgKiAgICAgICAgIGZlYXR1cmUgb3IgdGhlIG1hcCBoYXMgbm90IGJlZW4gY3JlYXRlZAotCSAqLwotCXB1YmxpYyBNYXAgYmFzaWNHZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKSB7Ci0JCXJldHVybiBvcHBvc2l0ZUZlYXR1cmVNYXA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqICAgICAgICAgICAgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgb3Bwb3NpdGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoT3Bwb3NpdGVGZWF0dXJlIGZlYXR1cmUpIHsKLQkJT2JqZWN0IHZhbHVlID0gZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkuZ2V0KGZlYXR1cmUpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlSZXNvdXJjZUVPYmplY3QuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoKToiKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZmVhdHVyZTogIiArIGZlYXR1cmUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiB2YWx1ZTogIiArIHZhbHVlKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgdGhpczogIiArIHRoaXMpOwotCi0JCWlmIChmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCi0JCQlyZXR1cm4gKChPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCkgdmFsdWUpCi0JCQkJCS5nZXRVbm1vZGlmaWFibGVMaXN0KCk7Ci0JCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBFT2JqZWN0Ci0JCQkJJiYgKChFT2JqZWN0KSB2YWx1ZSkuZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJZ2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkucHV0KGZlYXR1cmUsIG51bGwpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbEVPYmplY3QKLQkJCQkmJiAoKEludGVybmFsRU9iamVjdCkgdmFsdWUpLmVJc1Byb3h5KCkpIHsKLQkJCUVPYmplY3QgcmVzb2x2ZWQgPSBlUmVzb2x2ZVByb3h5KChJbnRlcm5hbEVPYmplY3QpIHZhbHVlKTsKLQkJCWlmIChyZXNvbHZlZCAhPSB2YWx1ZSkgewotCQkJCWdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLnB1dChmZWF0dXJlLCByZXNvbHZlZCk7Ci0JCQkJdmFsdWUgPSByZXNvbHZlZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzb3VyY2UgYXQgYSBnaXZlbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBsb2NhdGlvbgotCSAqIEByZXR1cm4gYSByZXNvdXJjZSBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJSVdvcmtzcGFjZVJvb3Qgd29ya3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZTsKLQkJRmlsZSBmaWxlID0gIG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZihyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHBhcmVudFJlc291cmNlID0gZ2V0UmVzb3VyY2VGb3JMb2NhdGlvbihmaWxlCi0JCQkJCQkuZ2V0UGFyZW50KCkpOwotCQkJCWlmKHBhcmVudFJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBhcmVudFJlc291cmNlLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfT05FLCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlDb21tb25QbHVnaW4uSU5TVEFOQ0UubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJlc291cmNlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldENvbnRhaW5lckZvckxvY2F0aW9uKHBhdGgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLS8vCS8qIChub24tSmF2YWRvYykKLS8vCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0vLwkgKi8KLS8vCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0vLwkJaWYoYWRhcHRlciA9PSBJUmVzb3VyY2UuY2xhc3MpIHsKLS8vCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlUmVzb3VyY2UoKTsKLS8vCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotLy8JCQkJcmV0dXJuIGdldFJlc291cmNlRm9yTG9jYXRpb24ocmVzb3VyY2UuZ2V0VVJJKCkudG9GaWxlU3RyaW5nKCkpOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBudWxsOwotLy8JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIG9wcG9zaXRlIGZlYXR1cmVzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3lzdGVtLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21BbGxPcHBvc2l0ZUZlYXR1cmVzKCkgewotCQkvLyBmaW5kIGFsbCBmZWF0dXJlcyB0aGF0IGhhdmUgb3Bwb3NpdGUgZmVhdHVyZXMgYW5kIGNsZWFyIHRob3NlCi0JCS8vIGZlYXR1cmVzLiBUaGlzIHdpbGwgcmVtb3ZlIHRoZSByZWZlcmVuY2VzIHRvCi0JCS8vIHVubG9hZGVkIG9iamVjdCBieSB0aG9zZSBvcHBvc2l0ZSBmZWF0dXJlcwotCQkvLwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlID0gT3Bwb3NpdGVGZWF0dXJlLmdldE9wcG9zaXRlRmVhdHVyZShyZWYpOwotCQkJaWYob3Bwb3NpdGVGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlpZihyZWYuaXNNYW55KCkpIHsKLQkJCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVHZXQocmVmLCBmYWxzZSk7CQkJCQkKLQkJCQkJaWYoIWxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlpZighb3Bwb3NpdGVGZWF0dXJlLnJlc29sdmVPd25lcigpKSB7Ci0JCQkJCQkJbGlzdC5jbGVhcigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZihsaXN0IGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgewotCQkJCQkJCUxpc3QgYmFzaWNMaXN0ID0gKChJbnRlcm5hbEVMaXN0KWxpc3QpLmJhc2ljTGlzdCgpOwotCQkJCQkJCWZvcihpbnQgaSA9IGJhc2ljTGlzdC5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJCQkJCQlFT2JqZWN0IGUgPSAoRU9iamVjdCkgYmFzaWNMaXN0LmdldChpKTsKLQkJCQkJCQkJaWYoIWUuZUlzUHJveHkoKSkgewotCQkJCQkJCQkJbGlzdC5yZW1vdmUoZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUVPYmplY3QgZSA9IChFT2JqZWN0KSBlR2V0KHJlZiwgZmFsc2UpOwotCQkJCQlpZihlICE9IG51bGwgJiYgIWUuZUlzUHJveHkoKSkgewotCQkJCQkJZVNldChyZWYsIG51bGwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldE9wcG9zaXRlRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBnZXRPcHBvc2l0ZUZlYXR1cmVNYXAoKS5rZXlTZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0I2dldERlZmF1bHRWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCgpLmdldChmZWF0dXJlKTsKLQkJaWYodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBmZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZU1hbmFnZXIuZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKGVDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgYSBmZWF0dXJlIHdob3NlIGRlZmF1bHQgdmFsdWUgaGFzIGJlZW4gb3ZlcnJpZGVuLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBhIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZSgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU1hcCBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoKTsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwLnJlbW92ZShmZWF0dXJlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYXNzaWduIGRlZmF1bHQgdmFsdWVzIHRoYXQgYXJlIGRlZmluZWQgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBmb3IgdGhpcyBjbGFzcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYXNzaWduRGVmYXVsdFZhbHVlcygpIHsKLQkJZGVmYXVsdFZhbHVlTWFuYWdlci5hc3NpZ25EZWZhdWx0VmFsdWVzKHRoaXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlKAotCQkJaW50IGZlYXR1cmVJRCkgewotCQlNYXAgZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKCk7Ci0JCWlmKCFmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuaXNFbXB0eSgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgKLQkJCQkJZmVhdHVyZUlEKTsKLQkJCWlmKGZlYXR1cmUgIT0gbnVsbCAmJiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuY29udGFpbnNLZXkoZmVhdHVyZSkpIHsKLQkJCQlyZXR1cm4gZmVhdHVyZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZVNldCgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCU9iamVjdCBkZWZhdWx0VmFsdWUgPSBnZXREZWZhdWx0VmFsdWUoZmVhdHVyZSk7Ci0JCU9iamVjdCB2YWx1ZSA9IGVHZXQoZmVhdHVyZSwgZmFsc2UpOwotCQlpZihmZWF0dXJlLmlzTWFueSgpKSB7Ci0JCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAhKChDb2xsZWN0aW9uKSB2YWx1ZSkuaXNFbXB0eSgpCi0JCQkmJiB2YWx1ZSAhPSBkZWZhdWx0VmFsdWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFZhbHVlID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIWRlZmF1bHRWYWx1ZQotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQkKLS8vCQkvLyBBbHdheXMgcmV0dXJuIHRydWUgc28gdGhlIGZlYXR1cmUgKHdpdGggZGVmYXVsdCB2YWx1ZSBvdmVycmlkZW4pCi0vLwkJLy8gd2lsbCBiZSBzYXZlZCByZWdhcmRsZXNzIHRoYXQgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IHZhbHVlIG9yIG5vdC4KLS8vCQkvLwotLy8JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlNjIyNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL2ltcGwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGZvciB0aGUgVU1BIEVjb3JlIGV4dGVuc2lvbi4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNhOTA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgRWNvcmUgZXh0ZW5zaW9uLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9EZWZhdWx0VmFsdWVNYW5hZ2VyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRGVmYXVsdFZhbHVlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZmNjdmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9EZWZhdWx0VmFsdWVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRWYWx1ZU1hbmFnZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVmYXVsdFZhbHVlTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0VmFsdWVNYW5hZ2VyKCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAgPSAKLQkJbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PigpOwotCQotCXByaXZhdGUgZmluYWwgTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0Pj4gdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcCA9Ci0JCW5ldyBIYXNoTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSxPYmplY3Q+PigpOwotCi0JcHJpdmF0ZSBmaW5hbCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBmZWF0dXJlVG9UeXBlZFN0YXRpY0RlZmF1bHRWYWx1ZXNNYXAgPSAKLQkJbmV3IEhhc2hNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PigpOwotCQotCXByaXZhdGUgZmluYWwgTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0Pj4gdHlwZVRvRmVhdHVyZVN0YXRpY0RlZmF1bHRWYWx1ZU1hcCA9Ci0JCW5ldyBIYXNoTWFwPEVDbGFzcywgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSxPYmplY3Q+PigpOwotCi0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHVzZVN0YXRpYzsKLQkKLQlwcm90ZWN0ZWQgRGVmYXVsdFZhbHVlTWFuYWdlcigpIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZVN0YXRpYyhib29sZWFuIHVzZVN0YXRpYykgewotCQl0aGlzLnVzZVN0YXRpYyA9IHVzZVN0YXRpYzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVc2VTdGF0aWMoKSB7Ci0JCXJldHVybiB1c2VTdGF0aWM7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKEVDbGFzcyB0eXBlLCAKLQkJCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE1hcDxFQ2xhc3MsIE9iamVjdD4+IGZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcCwKLQkJCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKSB7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwOwotCQlpZihmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuaXNFbXB0eSgpKSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSBuZXcgSGFzaE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4oKTsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4+IGl0ZXIgPSAKLQkJCQlmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBNYXA8RUNsYXNzLCBPYmplY3Q+PiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYodHlwZS5nZXRGZWF0dXJlSUQoZmVhdHVyZSkgIT0gLTEpIHsKLQkJCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0JCQkJCUVDbGFzcyBzZWxlY3RlZFR5cGUgPSB0eXBlOwotCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PEVDbGFzcywgT2JqZWN0Pj4gaXRlcmF0b3IgPSBlbnRyeS5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5PEVDbGFzcywgT2JqZWN0PiBlbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlFQ2xhc3MgY3VycmVudFR5cGUgPSBlbnQuZ2V0S2V5KCk7Ci0JCQkJCQlpZihjdXJyZW50VHlwZS5pc1N1cGVyVHlwZU9mKHR5cGUpICYmIAotCQkJCQkJCQkoc2VsZWN0ZWRUeXBlID09IG51bGwgfHwgc2VsZWN0ZWRUeXBlLmlzU3VwZXJUeXBlT2YoY3VycmVudFR5cGUpKSkgewotCQkJCQkJCXNlbGVjdGVkVHlwZSA9IGN1cnJlbnRUeXBlOwotCQkJCQkJCWRlZmF1bHRWYWx1ZSA9IGVudC5nZXRWYWx1ZSgpOwotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZihmb3VuZCkgewotCQkJCQkJT2JqZWN0IHN0YXRpY0RlZmF1bHRWYWx1ZSA9IGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcC5nZXQoZmVhdHVyZSk7Ci0JCQkJCQlpZihzdGF0aWNEZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotCQkJCQkJCXN0YXRpY0RlZmF1bHRWYWx1ZSA9IGZlYXR1cmUuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZigoZGVmYXVsdFZhbHVlID09IG51bGwgJiYgIHN0YXRpY0RlZmF1bHRWYWx1ZSAhPSBudWxsKQotCQkJCQkJCQl8fCAoZGVmYXVsdFZhbHVlICE9IG51bGwgJiYgIWRlZmF1bHRWYWx1ZS5lcXVhbHMoc3RhdGljRGVmYXVsdFZhbHVlKSkpIHsKLQkJCQkJCQlmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAucHV0KGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAuaXNFbXB0eSgpKSB7Ci0JCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gQ29sbGVjdGlvbnMuRU1QVFlfTUFQOwotCQkJfQotCQl9Ci0JCXJldHVybiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXA7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBnZXRGZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAoRUNsYXNzIHR5cGUpIHsKLQkJaWYodXNlU3RhdGljKSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKHR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGdldEZlYXR1cmVUb0R5bmFtaWNEZWZhdWx0VmFsdWVNYXAodHlwZSk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb0R5bmFtaWNEZWZhdWx0VmFsdWVNYXAoRUNsYXNzIHR5cGUpIHsKLQkJTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgT2JqZWN0PiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPSB0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwLmdldCh0eXBlKTsKLQkJaWYoZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID09IG51bGwpIHsKLQkJCWZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IGdldEZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCh0eXBlLCBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAsCi0JCQkJCWdldEZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCh0eXBlKSk7Ci0JCQl0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwLnB1dCh0eXBlLCBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXApOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXA7Ci0JfQkKLQkKLQlwcml2YXRlIHN5bmNocm9uaXplZCBNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGdldEZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcChFQ2xhc3MgdHlwZSkgewotCQlNYXA8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCA9IHR5cGVUb0ZlYXR1cmVTdGF0aWNEZWZhdWx0VmFsdWVNYXAuZ2V0KHR5cGUpOwotCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgPT0gbnVsbCkgewotCQkJZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKHR5cGUsIGZlYXR1cmVUb1R5cGVkU3RhdGljRGVmYXVsdFZhbHVlc01hcCwKLQkJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCXR5cGVUb0ZlYXR1cmVTdGF0aWNEZWZhdWx0VmFsdWVNYXAucHV0KHR5cGUsIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCX0KLQkJcmV0dXJuIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcDsKLQl9Ci0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZWZhdWx0VmFsdWUoRUNsYXNzIHR5cGUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgZGVmYXVsdFZhbHVlLAotCQkJTWFwPEVTdHJ1Y3R1cmFsRmVhdHVyZSwgTWFwPEVDbGFzcywgT2JqZWN0Pj4gZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwICkgCi0JewotCQlpZighZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuaXNTdXBlclR5cGVPZih0eXBlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1hcDxFQ2xhc3MsIE9iamVjdD4gdHlwZVRvRGVmYXVsdFZhbHVlTWFwID0gZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLmdldChmZWF0dXJlKTsKLQkJaWYodHlwZVRvRGVmYXVsdFZhbHVlTWFwID09IG51bGwpIHsKLQkJCS8vIHRoaXMgbWFwIG11c3QgYmUgc29ydGVkIGZyb20gc3ViIHR5cGUgdG8gc3VwZXIgdHlwZQotCQkJLy8KLQkJCXR5cGVUb0RlZmF1bHRWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwPEVDbGFzcywgT2JqZWN0PigpOwotCQkJZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwLnB1dChmZWF0dXJlLCB0eXBlVG9EZWZhdWx0VmFsdWVNYXApOwotCQl9Ci0JCXR5cGVUb0RlZmF1bHRWYWx1ZU1hcC5wdXQodHlwZSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHNldERlZmF1bHRWYWx1ZShFQ2xhc3MgdHlwZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBkZWZhdWx0VmFsdWUpIHsKLQkJc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSwgZmVhdHVyZVRvVHlwZWREZWZhdWx0VmFsdWVzTWFwKTsKLQkJCi0JCS8vIGNsZWFyIHR5cGVUb0ZlYXR1cmVEZWZhdWx0VmFsdWVNYXAgc28gdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSByZWNhbGN1bGF0ZWQgZm9yIGVhY2ggY2xhc3MKLQkJLy8KLQkJdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcC5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIHZvaWQgc2V0U3RhdGljRGVmYXVsdFZhbHVlKEVDbGFzcyB0eXBlLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlzZXREZWZhdWx0VmFsdWUodHlwZSwgZmVhdHVyZSwgZGVmYXVsdFZhbHVlKTsKLQkJc2V0RGVmYXVsdFZhbHVlKHR5cGUsIGZlYXR1cmUsIGRlZmF1bHRWYWx1ZSwgZmVhdHVyZVRvVHlwZWRTdGF0aWNEZWZhdWx0VmFsdWVzTWFwKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWZlYXR1cmVUb1R5cGVkRGVmYXVsdFZhbHVlc01hcC5yZW1vdmUoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlRGVmYXVsdFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFQ2xhc3MgdHlwZSkgewotCQlhc3NlcnQgZmVhdHVyZS5nZXRFQ29udGFpbmluZ0NsYXNzKCkuaXNTdXBlclR5cGVPZih0eXBlKTsKLQkJTWFwPEVDbGFzcywgT2JqZWN0PiB0eXBlVG9EZWZhdWx0VmFsdWVNYXAgPSBmZWF0dXJlVG9UeXBlZERlZmF1bHRWYWx1ZXNNYXAuZ2V0KGZlYXR1cmUpOwotCQlpZih0eXBlVG9EZWZhdWx0VmFsdWVNYXAgIT0gbnVsbCkgewotCQkJdHlwZVRvRGVmYXVsdFZhbHVlTWFwLnJlbW92ZSh0eXBlKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdHlwZVRvRmVhdHVyZURlZmF1bHRWYWx1ZU1hcCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHJlY2FsY3VsYXRlZCBmb3IgZWFjaCBjbGFzcwotCQkvLwotCQl0eXBlVG9GZWF0dXJlRGVmYXVsdFZhbHVlTWFwLmNsZWFyKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzaWduRGVmYXVsdFZhbHVlcyhFT2JqZWN0IGVPYmplY3QsIE1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKSB7Ci0JCWlmKGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvcjxNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+PiBpdGVyID0gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwCi0JCQkJLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnk8RVN0cnVjdHVyYWxGZWF0dXJlLCBPYmplY3Q+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0JCQllT2JqZWN0LmVTZXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NpZ25EZWZhdWx0VmFsdWVzKEVPYmplY3QgZU9iamVjdCkgewotCQlFQ2xhc3MgdHlwZSA9IGVPYmplY3QuZUNsYXNzKCk7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKHR5cGUpOwotCQlhc3NpZ25EZWZhdWx0VmFsdWVzKGVPYmplY3QsIGZlYXR1cmVUb1N0YXRpY0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCU1hcDxFU3RydWN0dXJhbEZlYXR1cmUsIE9iamVjdD4gZmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwID0gZ2V0RmVhdHVyZVRvRGVmYXVsdFZhbHVlTWFwKGVPYmplY3QuZUNsYXNzKCkpOwotCQlpZihmZWF0dXJlVG9EZWZhdWx0VmFsdWVNYXAgIT0gZmVhdHVyZVRvU3RhdGljRGVmYXVsdFZhbHVlTWFwKSB7Ci0JCQlhc3NpZ25EZWZhdWx0VmFsdWVzKGVPYmplY3QsIGZlYXR1cmVUb0RlZmF1bHRWYWx1ZU1hcCk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRXZlbnRUeXBlcy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL0V2ZW50VHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyMTUzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvRXZlbnRUeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi0vKioKLSAqIERlZmluZXMgYWRkaXRpb25hbCBub3RpZmljYXRpb24gZXZlbnQgdHlwZXMuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXZlbnRUeXBlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQUtFX1BST1hZID0gTm90aWZpY2F0aW9uLkVWRU5UX1RZUEVfQ09VTlQgKyAxOwotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDYyYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLS8qKgotICogU3VwcG9ydHMgdGhlIHJldmVyc2UgdHJhdmVyc2FsIG9mIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9wcG9zaXRlRmVhdHVyZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc01hbnk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZU93bmVyID0gdHJ1ZTsKLQotCXByaXZhdGUgQ2xhc3Mgb3duZXJDbGFzczsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWxpdmVyT25SZXNvbHZlOwotCi0JLyoqCi0JICogTWFwcyBzb3VyY2UgbW9kZWwgb2JqZWN0cyB0byBPcHBvc2l0ZUZlYXR1cmUgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBjbGFzc09wcG9zaXRlRmVhdHVyZXNNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogTWFwcyBFU3RydWN0dXJhbEZlYXR1cmUgb2JqZWN0cyB0byBPcHBvc2l0ZUZlYXR1cmUgb2JqZWN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE1hcCBmZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyQ2xhc3MKLQkgKiAgICAgICAgICAgIHRoZSBtb2RlbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSB0YXJnZXRGZWF0dXJlCi0JICogICAgICAgICAgICB0aGUgZmVhdHVyZSB3aGljaCB0aGlzIG9wcG9zaXRlIGZlYXR1cmUgaXMgYmFzZWQgb24KLQkgKiBAcGFyYW0gaXNNYW55Ci0JICogICAgICAgICAgICBpZiA8dHJ1ZT4sIHRoZSBtdWx0aXBsaWNpdHkgb2YgdGhlIGFzc29jaWF0aW9uIGlzIHVuYm91bmRlZAotCSAqIEBwYXJhbSByZXNvbHZlT3duZXIKLQkgKiAgICAgICAgICAgIGlmIDx0cnVlPiwgcmVzb2x2ZSB0aGUgb3duZXIgY2xhc3MgaWYgaXQgaXMgYSBwcm94eQotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmUoQ2xhc3Mgb3duZXJDbGFzcywgU3RyaW5nIG5hbWUsCi0JCQlFU3RydWN0dXJhbEZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwgYm9vbGVhbiBpc01hbnksCi0JCQlib29sZWFuIHJlc29sdmVPd25lcikgewotCQl0aGlzLm93bmVyQ2xhc3MgPSBvd25lckNsYXNzOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnRhcmdldEZlYXR1cmUgPSB0YXJnZXRGZWF0dXJlOwotCQl0aGlzLmlzTWFueSA9IGlzTWFueTsKLQkJdGhpcy5yZXNvbHZlT3duZXIgPSByZXNvbHZlT3duZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJDbGFzcwotCSAqICAgICAgICAgICAgdGhlIG1vZGVsIGNsYXNzIHRoYXQgb3ducyB0aGlzIG9wcG9zaXRlIGZlYXR1cmUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICogQHBhcmFtIHRhcmdldEZlYXR1cmUKLQkgKiAgICAgICAgICAgIHRoZSBmZWF0dXJlIHdoaWNoIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZSBpcyBiYXNlZCBvbgotCSAqIEBwYXJhbSBpc01hbnkKLQkgKiAgICAgICAgICAgIGlmIDx0cnVlPiwgdGhlIG11bHRpcGxpY2l0eSBvZiB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZShDbGFzcyBvd25lckNsYXNzLCBTdHJpbmcgbmFtZSwKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSB0YXJnZXRGZWF0dXJlLCBib29sZWFuIGlzTWFueSkgewotCQl0aGlzKG93bmVyQ2xhc3MsIG5hbWUsIHRhcmdldEZlYXR1cmUsIGlzTWFueSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbW9kYWwgY2xhc3MgdGhhdCBvd25zIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb2RhbCBjbGFzcyB0aGF0IG93bnMgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlCi0JICovCi0JcHVibGljIENsYXNzIGdldE93bmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBvd25lckNsYXNzOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyB1bmJvdW5kZWQuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYXNzb2NpYXRpb24gaXMgdW5ib3VuZGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNYW55KCkgewotCQlyZXR1cm4gaXNNYW55OwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5hbWUgb2YgdGhpcyBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wcG9zaXRlIGZlYXR1cmUgbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZmVhdHVyZSB3aGljaCB0aGlzIG9wcG9zaXRlIGZlYXR1cmUgaXMgYmFzZWQgb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb3JpZ2luYWwgZmVhdHVyZSBnZW5lcmF0ZWQgYnkgRU1GCi0JICovCi0JcHVibGljIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRUYXJnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gdGFyZ2V0RmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBJRCBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBJRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RmVhdHVyZUlEKCkgewotCQlyZXR1cm4gLTEgLSB0YXJnZXRGZWF0dXJlLmdldEZlYXR1cmVJRCgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBvd25lciBjbGFzcyBvZiB0aGlzIG9wcG9zaXRlIGZlYXR1cmUsIGlmIHByb3hpZWQsCi0JICogc2hvdWxkIGJlIHJlc29sdmVkIHdoZW4gdGhlIHRhcmdldCBmZWF0dXJlIGlzIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIDx0cnVlPiBpZiB0aGUgb3duZXIgY2xhc3MsIGlmIHByb3hpZWQsIHNob3VsZCBiZSByZXNvbHZlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlc29sdmVPd25lcigpIHsKLQkJcmV0dXJuIHJlc29sdmVPd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb3Bwb3NpdGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIEEgPGNvZGU+U3RyaW5nPC9jb2RlPiBjb250YWluaW5nIHRoZSBrZXkgYXR0cmlidXRlcyBvZiB0aGlzCi0JICogICAgICAgICBvcHBvc2l0ZSBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lICsgIlt0YXJnZXRGZWF0dXJlPSIgKyB0YXJnZXRGZWF0dXJlIC8vJE5PTi1OTFMtMSQKLQkJCQkrICIsIGlzTWFueT0iICsgaXNNYW55ICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIG9wcG9zaXRlIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIG9wcG9zaXRlIGZlYXR1cmUgdG8gcmVnaXN0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJPcHBvc2l0ZUZlYXR1cmUoCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCUNsYXNzIGNscyA9IG9wcG9zaXRlRmVhdHVyZS5nZXRPd25lckNsYXNzKCk7Ci0JCVNldCBmZWF0dXJlcyA9IChTZXQpIGNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcC5nZXQoY2xzKTsKLQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCWZlYXR1cmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWNsYXNzT3Bwb3NpdGVGZWF0dXJlc01hcC5wdXQoY2xzLCBmZWF0dXJlcyk7Ci0JCX0KLQkJZmVhdHVyZXMuYWRkKG9wcG9zaXRlRmVhdHVyZSk7Ci0KLQkJZmVhdHVyZU9wcG9zaXRlRmVhdHVyZU1hcC5wdXQob3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKSwKLQkJCQlvcHBvc2l0ZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gYSBwcm94eSBvd25lciBjbGFzcyBpcyByZXNvbHZlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG5vdGlmaWNhdGlvbiBpcyBiZWluZyBzZW50IHdoZW4gYSBwcm94eQotCSAqICAgICAgICAgb3duZXIgY2xhc3MgaXMgcmVzb2x2ZWQKLQkgKi8KLQkvKgotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0RlbGl2ZXJPblJlc29sdmUoKSB7Ci0JCXJldHVybiBkZWxpdmVyT25SZXNvbHZlOwotCX0KLQkqLwotCi0JLyoqCi0JICogRW5hYmxlcyBub3RpZmljYXRpb24gd2hlbiBhIHByb3h5IG93bmVyIGNsYXNzIGlzIHJlc29sdmVkLgotCSAqIAotCSAqIEBwYXJhbSBlbmFibGVOb3RpZmljYXRpb24KLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCBzZW5kIG5vdGlmaWNhdGlvbiB3aGVuIGEgcHJveHkgb3duZXIKLQkgKiAgICAgICAgICAgIGNsYXNzIGlzIHJlc29sdmVkCi0JICovCi0JLyoKLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgc2V0RGVsaXZlck9uUmVzb2x2ZShib29sZWFuIGVuYWJsZU5vdGlmaWNhdGlvbikgewotCQlkZWxpdmVyT25SZXNvbHZlID0gZW5hYmxlTm90aWZpY2F0aW9uOwotCX0KLQkqLwotCi0JLyoqCi0JICogR2V0cyB0aGUgb3Bwb3NpdGUgZmVhdHVyZSBmb3IgdGhlIGdpdmVuIGZlYXR1cmUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIEVNRiA8Y29kZT5FU3RydWN0dXJhbEZlYXR1cmU8L2NvZGU+IGZlYXR1cmUKLQkgKiBAcmV0dXJuIGFuIG9wcG9zaXRlIGZlYXR1cmUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmVhdHVyZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIGdldE9wcG9zaXRlRmVhdHVyZSgKLQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiAoT3Bwb3NpdGVGZWF0dXJlKSBmZWF0dXJlT3Bwb3NpdGVGZWF0dXJlTWFwLmdldChmZWF0dXJlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWNvcmUvdXRpbC9PcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyMWJlNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci0KLS8qKgotICogTm90aWZpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcHBvc2l0ZSBmZWF0dXJlLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uIGV4dGVuZHMgTm90aWZpY2F0aW9uSW1wbCB7Ci0KLQlwcml2YXRlIE9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmU7Ci0KLQlwcml2YXRlIE9iamVjdCBub3RpZmllcjsKLQotCS8qKgotCSAqIEBwYXJhbSBldmVudFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIGV2ZW50Ci0JICogQHBhcmFtIG9wcG9zaXRlRmVhdHVyZQotCSAqICAgICAgICAgICAgdGhlIG9wcG9zaXRlIGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICB0aGUgb2xkIHZhbHVlCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpdGlvbiBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCi0JICogQHBhcmFtIHdhc1NldAotCSAqLwotCXB1YmxpYyBPcHBvc2l0ZUZlYXR1cmVOb3RpZmljYXRpb24oT2JqZWN0IG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLAotCQkJT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsCi0JCQlpbnQgcG9zaXRpb24sIGJvb2xlYW4gd2FzU2V0KSB7Ci0JCXN1cGVyKGV2ZW50VHlwZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3NpdGlvbiwgd2FzU2V0KTsKLQkJdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwotCQl0aGlzLm9wcG9zaXRlRmVhdHVyZSA9IG9wcG9zaXRlRmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9wcG9zaXRlIGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm90aWZpY2F0aW9uCi0JICovCi0JcHVibGljIE9wcG9zaXRlRmVhdHVyZSBnZXRPcHBzaXRlRmVhdHVyZSgpIHsKLQkJcmV0dXJuIG9wcG9zaXRlRmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uSW1wbCNnZXROb3RpZmllcigpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXROb3RpZmllcigpIHsKLQkJcmV0dXJuIG5vdGlmaWVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL09wcG9zaXRlRmVhdHVyZVJlc29sdmluZ0VMaXN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1MzRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5Ob3RpZnlpbmdMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiBBIGxpc3QgZm9yIHJlc29sdmluZyBtdWx0aS12YWx1ZWQgb3Bwb3NpdGUgZmVhdHVyZXMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcHBvc2l0ZUZlYXR1cmVSZXNvbHZpbmdFTGlzdCBleHRlbmRzIE5vdGlmeWluZ0xpc3RJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2OTAxOTg3NjMwMDAwNTE3NjhMOwotCi0JcHJpdmF0ZSBNdWx0aVJlc291cmNlRU9iamVjdCBvd25lcjsKLQotCXByaXZhdGUgT3Bwb3NpdGVGZWF0dXJlIG9wcG9zaXRlRmVhdHVyZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG93bmVyCi0JICogICAgICAgICAgICB0aGUgb3duZXIgb2YgYW4gb3Bwb3NpdGUgZmVhdHVyZQotCSAqIEBwYXJhbSBvcHBvc2l0ZUZlYXR1cmUKLQkgKiAgICAgICAgICAgIGFuIG9wcG9zaXRlIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgT3Bwb3NpdGVGZWF0dXJlUmVzb2x2aW5nRUxpc3QoTXVsdGlSZXNvdXJjZUVPYmplY3Qgb3duZXIsCi0JCQlPcHBvc2l0ZUZlYXR1cmUgb3Bwb3NpdGVGZWF0dXJlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5vcHBvc2l0ZUZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmeWluZ0xpc3RJbXBsI2dldE5vdGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5vdGlmaWVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEVPYmplY3QgcmVzb2x2ZVByb3h5KEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gZU9iamVjdC5lSXNQcm94eSgpID8gb3duZXIKLQkJCQkuZVJlc29sdmVQcm94eSgoSW50ZXJuYWxFT2JqZWN0KSBlT2JqZWN0KSA6IGVPYmplY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIE5vdGlmaWNhdGlvbkltcGwgY3JlYXRlTm90aWZpY2F0aW9uKGludCBldmVudFR5cGUsCi0JCQlPYmplY3Qgb2xkT2JqZWN0LCBPYmplY3QgbmV3T2JqZWN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gd2FzU2V0KSB7Ci0JCXJldHVybiBuZXcgT3Bwb3NpdGVGZWF0dXJlTm90aWZpY2F0aW9uKG93bmVyLCBldmVudFR5cGUsCi0JCQkJb3Bwb3NpdGVGZWF0dXJlLCBvbGRPYmplY3QsIG5ld09iamVjdCwgaW5kZXgsIHdhc1NldCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RpZmljYXRpb25SZXF1aXJlZCgpIHsKLQkJcmV0dXJuIG93bmVyLmVOb3RpZmljYXRpb25SZXF1aXJlZCgpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZShpbnQgaW5kZXgsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkpCi0JCQlyZXR1cm4gb2JqZWN0OwotCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgb2JqZWN0OwotCQlFT2JqZWN0IHJlc29sdmVkID0gcmVzb2x2ZVByb3h5KGVPYmplY3QpOwotCQlpZiAocmVzb2x2ZWQgIT0gZU9iamVjdCkgewotCQkJT2JqZWN0IG9sZE9iamVjdCA9IGRhdGFbaW5kZXhdOwotCQkJYXNzaWduKGluZGV4LCB2YWxpZGF0ZShpbmRleCwgcmVzb2x2ZWQpKTsKLQotCQkJZGlkU2V0KGluZGV4LCByZXNvbHZlZCwgb2xkT2JqZWN0KTsKLQotCQkJLy8gaWYgKGlzTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCS8vIHsKLQkJCS8vIG93bmVyLmVOb3RpZnkoY3JlYXRlTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBlT2JqZWN0LAotCQkJLy8gcmVzb2x2ZWQsIGluZGV4LCBmYWxzZSkpOwotCQkJLy8gfQotCi0JCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZU9iamVjdDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZURhbmdsaW5nT2JqZWN0cygpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmouZVJlc291cmNlKCkgPT0gbnVsbCkgewotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSBsaXN0IHRoYXQgc3RvcmVzIHRoZSBvcHBvc2l0ZSBmZWF0dXJlIHZhbHVlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0VW5tb2RpZmlhYmxlTGlzdCgpIHsKLQkJcmVtb3ZlRGFuZ2xpbmdPYmplY3RzKCk7Ci0JCXJldHVybiBuZXcgVW5tb2RpZmlhYmxlRUxpc3Qoc2l6ZSwgZGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lY29yZS91dGlsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlZmU1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2Vjb3JlL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgdGhlIFVNQSBFY29yZSBleHRlbnNpb24uCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvSGVhZGVyLmphdmFqZXRpbmMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9IZWFkZXIuamF2YWpldGluYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwNTY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9IZWFkZXIuamF2YWpldGluYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkNmU1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlL3RlbXBsYXRlcy9tb2RlbC9DbGFzcy5qYXZhamV0CisrKyAvZGV2L251bGwKQEAgLTEsMjAxMCArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmVjb3JlLnRlbXBsYXRlcy5tb2RlbCIgaW1wb3J0cz0iamF2YS51dGlsLiogb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUuZ2VubW9kZWwuKiIgY2xhc3M9IkNsYXNzIiB2ZXJzaW9uPSIkSWQ6IENsYXNzLmphdmFqZXQsdiAxLjIgMjAwOC8wMS8yMiAwMTo1MjozMyBwbGUgRXhwICQiICU+Ci08JQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKi8KLSU+Ci08JWZpbmFsIEdlbkNsYXNzIGdlbkNsYXNzID0gKEdlbkNsYXNzKSgoT2JqZWN0W10pYXJndW1lbnQpWzBdOyBmaW5hbCBHZW5QYWNrYWdlIGdlblBhY2thZ2UgPSBnZW5DbGFzcy5nZXRHZW5QYWNrYWdlKCk7IGZpbmFsIEdlbk1vZGVsIGdlbk1vZGVsPWdlblBhY2thZ2UuZ2V0R2VuTW9kZWwoKTslPgotPCVmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsxXSk7IGZpbmFsIGJvb2xlYW4gaXNJbXBsZW1lbnRhdGlvbiA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMl0pOyU+Ci08JWZpbmFsIFN0cmluZyBwdWJsaWNTdGF0aWNGaW5hbEZsYWcgPSBpc0ltcGxlbWVudGF0aW9uID8gInB1YmxpYyBzdGF0aWMgZmluYWwgIiA6ICIiOyU+Ci08JWZpbmFsIFN0cmluZyBzaW5nbGVXaWxkY2FyZCA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPD8+IiA6ICIiOyU+Ci08JWZpbmFsIFN0cmluZyBuZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24gPSBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiIC0gIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChudWxsKSA6ICIiOyU+Ci08JWZpbmFsIFN0cmluZyBwb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24gPSBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChudWxsKSA6ICIiOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSIuLi9IZWFkZXIuamF2YWpldGluYyIlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldEludGVyZmFjZVBhY2thZ2VOYW1lKCklPjsKLTwlfSBlbHNlIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldENsYXNzUGFja2FnZU5hbWUoKSU+OwotPCV9JT4KLQotPCVnZW5Nb2RlbC5tYXJrSW1wb3J0TG9jYXRpb24oc3RyaW5nQnVmZmVyLCBnZW5QYWNrYWdlKTslPgotCi08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj48JT1nZW5DbGFzcy5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTwlaWYgKGdlbkNsYXNzLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiA8JT1nZW5DbGFzcy5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLSAgPCV9JT4KLTwlfSU+Ci0gKiA8L3VsPgotICogPC9wPgotPCV9JT4KLSAqCi08JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkpIHslPgotICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5DbGFzcy5nZXRDbGFzc2lmaWVyQWNjZXNzb3JOYW1lKCklPigpCi08JX0lPgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5DbGFzcy5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0gKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLTwlfSBlbHNlIHslPgotICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci08JX19IGlmIChmaXJzdCkgeyU+Ci0gKiBAbW9kZWwKLTwlfX0lPgotPCVpZiAoZ2VuQ2xhc3MubmVlZHNSb290RXh0ZW5kc0ludGVyZmFjZUV4dGVuZHNUYWcoKSkgeyU+Ci0gKiBAZXh0ZW5kcyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoZ2VuTW9kZWwuZ2V0Um9vdEV4dGVuZHNJbnRlcmZhY2UoKSklPgotPCV9JT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9IGVsc2UgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLTwlaWYgKCFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKSkgeyU+Ci0gKiAgIDxsaT57QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci08JX0lPgotICogPC91bD4KLTwlfSU+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci1wdWJsaWM8JWlmIChnZW5DbGFzcy5pc0Fic3RyYWN0KCkpIHslPiBhYnN0cmFjdDwlfSU+IGNsYXNzIDwlPWdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpLnRyaW0oKSU+PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzKCklPjwlPWdlbkNsYXNzLmdldENsYXNzSW1wbGVtZW50cygpJT4KLTwlfSBlbHNlIHslPgotcHVibGljIGludGVyZmFjZSA8JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VOYW1lKCklPjwlPWdlbkNsYXNzLmdldFR5cGVQYXJhbWV0ZXJzKCkudHJpbSgpJT48JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VFeHRlbmRzKCklPgotPCV9JT4KLXsKLTwlaWYgKGdlbk1vZGVsLmhhc0NvcHlyaWdodEZpZWxkKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCTwlPXB1YmxpY1N0YXRpY0ZpbmFsRmxhZyU+PCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBjb3B5cmlnaHQgPSA8JT1nZW5Nb2RlbC5nZXRDb3B5cmlnaHRGaWVsZExpdGVyYWwoKSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCkgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5TdHJpbmciKSU+IG1vZkRyaXZlck51bWJlciA9ICI8JT1nZW5Nb2RlbC5nZXREcml2ZXJOdW1iZXIoKSU+Ijs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzSmF2YUlPU2VyaWFsaXphYmxlKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQotICA8JX0lPgotICA8JXsgTGlzdDxTdHJpbmc+IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyU+Ci0gICAgICA8JWZvciAoU3RyaW5nIGVWaXJ0dWFsSW5kZXhCaXRGaWVsZCA6IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMpIHslPgotCS8qKgotCSAqIEEgYml0IGZpZWxkIHJlcHJlc2VudGluZyB0aGUgaW5kaWNlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmUgdmFsdWVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9ZVZpcnR1YWxJbmRleEJpdEZpZWxkJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzTW9kZWxSb290KCkgJiYgZ2VuTW9kZWwuaXNCb29sZWFuRmxhZ3NFbmFibGVkKCkgJiYgZ2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzUmVzZXJ2ZWRCaXRzKCkgPT0gLTEpIHslPgotCS8qKgotCSAqIEEgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5Nb2RlbC5nZXRCb29sZWFuRmxhZ3NGaWVsZCgpJT4gPSAwOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldERlY2xhcmVkRmllbGRHZW5GZWF0dXJlcygpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgfHwgZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEludGVybmFsVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzQXJyYXlBY2Nlc3NvcnMoKSAmJiBnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHsgU3RyaW5nIHJhd0xpc3RJdGVtVHlwZSA9IGdlbkZlYXR1cmUuZ2V0UmF3TGlzdEl0ZW1UeXBlKCk7IGludCBpbmRleCA9IHJhd0xpc3RJdGVtVHlwZS5pbmRleE9mKCdbJyk7IFN0cmluZyBoZWFkID0gcmF3TGlzdEl0ZW1UeXBlOyBTdHJpbmcgdGFpbCA9ICIiOyBpZiAoaW5kZXggIT0gLTEpIHsgaGVhZCA9IHJhd0xpc3RJdGVtVHlwZS5zdWJzdHJpbmcoMCwgaW5kZXgpOyB0YWlsID0gcmF3TGlzdEl0ZW1UeXBlLnN1YnN0cmluZyhpbmRleCk7IH0gJT4KLQkvKioKLQkgKiBUaGUgZW1wdHkgdmFsdWUgZm9yIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIGFycmF5IGFjY2Vzc29yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKS5jb250YWlucygiPCIpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgPCV9JT4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPXJhd0xpc3RJdGVtVHlwZSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWSA9IG5ldyA8JT1oZWFkJT4gWzBdPCU9dGFpbCU+OwotCi0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpICYmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkgfHwgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAoIWdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkgfHwgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpKSkgeyBTdHJpbmcgc3RhdGljRGVmYXVsdFZhbHVlID0gZ2VuRmVhdHVyZS5nZXRTdGF0aWNEZWZhdWx0VmFsdWUoKTslPgotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiBnZW5GZWF0dXJlLmlzTGlzdERhdGFUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc1NldERlZmF1bHRWYWx1ZSgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgPCV9JT4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCVpZiAoIiIuZXF1YWxzKHN0YXRpY0RlZmF1bHRWYWx1ZSkpIHslPjsgLy8gVE9ETyBUaGUgZGVmYXVsdCB2YWx1ZSBsaXRlcmFsICI8JT1nZW5GZWF0dXJlLmdldEVjb3JlRmVhdHVyZSgpLmdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKSU+IiBpcyBub3QgdmFsaWQuPCV9IGVsc2UgeyU+ID0gPCU9c3RhdGljRGVmYXVsdFZhbHVlJT47PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKHN0YXRpY0RlZmF1bHRWYWx1ZSklPjwlfSU+Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgPiAzMSAmJiBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICAgIDwlfSU+Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHID0gMSA8JT0iPDwgIiArIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPjsKLQotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSA8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChudWxsKSU+ID0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPi5nZXRGZWF0dXJlSUQoPCU9Z2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmdldCgwKS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuZ2V0KDApKSU+OwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyU+Ci0gICAgPCVpZiAocmV2ZXJzZUZlYXR1cmUgIT0gbnVsbCAmJiByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmhhc09mZnNldENvcnJlY3Rpb24oKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChnZW5GZWF0dXJlKSU+ID0gPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRDbGFzc2lmaWVyQWNjZXNzb3IoKSU+LmdldEZlYXR1cmVJRCg8JT1yZXZlcnNlRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KSAtIDwlPXJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+OwotCi0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JWlmIChnZW5Nb2RlbC5pc1B1YmxpY0NvbnN0cnVjdG9ycygpKSB7JT5wdWJsaWM8JX0gZWxzZSB7JT5wcm90ZWN0ZWQ8JX0lPiA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+KCkKLQl7Ci0JCXN1cGVyKCk7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRGbGFnR2VuRmVhdHVyZXMoInRydWUiKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MiKSU+IGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPjsKLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9yZWZsZWN0aXZlRGVsZWdhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5nZXRGZWF0dXJlRGVsZWdhdGlvbigpID09IEdlbkRlbGVnYXRpb25LaW5kLlJFRkxFQ1RJVkVfTElURVJBTCAmJiAoZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKSA9PSBudWxsIHx8IGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkuZ2V0R2VuTW9kZWwoKS5nZXRGZWF0dXJlRGVsZWdhdGlvbigpICE9IEdlbkRlbGVnYXRpb25LaW5kLlJFRkxFQ1RJVkVfTElURVJBTCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgaW50IGVTdGF0aWNGZWF0dXJlQ291bnQoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkgPT0gbnVsbCA/IDAgOiBnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpLmdldEFsbEdlbkZlYXR1cmVzKCkuc2l6ZSgpJT47Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9yZWZsZWN0aXZlRGVsZWdhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlbmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7JT4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiAoaXNJbXBsZW1lbnRhdGlvbiA/IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuRmVhdHVyZXMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSA8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSA8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4gbGlzdCA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgcmV0dXJuIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKS5jb250YWlucygiPCIpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShudWxsKS5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pPCV9JT48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsIHx8IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKSkgcmV0dXJuIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKS5jb250YWlucygiPCIpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShudWxsKS5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pPCV9JT48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZOwotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0JCWxpc3Quc2hyaW5rKCk7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSlsaXN0LmRhdGEoKTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4KQotCXsKLQkJcmV0dXJuIDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT48JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmdldChpbmRleCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JaW50IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPkxlbmd0aCgpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIGludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKQotCXsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuc2l6ZSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsID8gMCA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LnNpemUoKTsKLSAgICAgIDwlfSU+Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JewotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0RGF0YShuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+Lmxlbmd0aCwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBlbGVtZW50KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGVsZW1lbnQpCi0JewotCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0dldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyBHZW5GZWF0dXJlIGtleUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldE1hcEVudHJ5VHlwZUdlbkNsYXNzKCkuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5VmFsdWVGZWF0dXJlKCk7ICU+Ci0JICogVGhlIGtleSBpcyBvZiB0eXBlIDwlaWYgKGtleUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT5saXN0IG9mIHtAbGluayA8JT1rZXlGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRUeXBlKGdlbkNsYXNzKSU+fTwlfSU+LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSA8JWlmICh2YWx1ZUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT5saXN0IG9mIHtAbGluayA8JT12YWx1ZUZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+fTwlfSBlbHNlIHslPntAbGluayA8JT12YWx1ZUZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcyklPn08JX0lPiwKLSAgICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpICYmICEoZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkgJiYgIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpKSkpIHsKLVN0cmluZyB0eXBlTmFtZSA9IGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKTsgU3RyaW5nIGhlYWQgPSB0eXBlTmFtZTsgU3RyaW5nIHRhaWwgPSAiIjsgaW50IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZignPCcpOyBpZiAoaW5kZXggPT0gLTEpIHsgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCdbJyk7IH0gCi1pZiAoaW5kZXggIT0gLTEpIHsgaGVhZCA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7IHRhaWwgPSB0eXBlTmFtZS5zdWJzdHJpbmcoaW5kZXgpLnJlcGxhY2VBbGwoIjwiLCAiJmx0OyIpOyB9Ci0lPgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayA8JT1oZWFkJT59PCU9dGFpbCU+LgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1NldERlZmF1bHRWYWx1ZSgpKSB7JT4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT48JT1nZW5GZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpJT48L2NvZGU+LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpICE9IG51bGwpIHslPgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPn0uCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpICYmICFnZW5GZWF0dXJlLmdldFJldmVyc2UoKS5nZXRHZW5DbGFzcygpLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VHZW5GZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7ICU+Ci0gICAgICA8JWlmICghcmV2ZXJzZUdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayA8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nLgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICA8JWlmICghZ2VuRmVhdHVyZS5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLSAgICA8JX0lPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA8JT1nZW5GZWF0dXJlLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgICA8JX0lPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpICE9IG51bGwpIHslPgotCSAqIEBzZWUgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0UmF3SW1wb3J0ZWRCb3VuZFR5cGUoKSU+KQotICAgIDwlfSU+Ci0gICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlblBhY2thZ2UuZ2V0UXVhbGlmaWVkUGFja2FnZUludGVyZmFjZU5hbWUoKSU+I2dldDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUFjY2Vzc29yTmFtZSgpJT4oKQotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSA8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuRmVhdHVyZS5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICAgIDwlfX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCi08JX0gZWxzZSB7JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiAoKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSB8fCBnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc1VuY2hlY2tlZENhc3QoKSB8fCBnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpIHx8IGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgfHwgZ2VuRmVhdHVyZS5pc0xpc3REYXRhVHlwZSgpICYmIGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pZUdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldyA8JT1nZW5DbGFzcy5nZXRMaXN0Q29uc3RydWN0b3IoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT47Ci0gICAgICAgIDwlfSU+Ci0JCX0KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCU9Z2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpID8gIi5tYXAoKSIgOiAiIiU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVDb250YWluZXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+KTsKLSAgICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lQXNFT2JqZWN0KCklPi5lSXNQcm94eSgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXROb25FT2JqZWN0SW50ZXJuYWxUeXBlQ2FzdChnZW5DbGFzcyklPmVSZXNvbHZlUHJveHkob2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0JCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQkJCXsKLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBudWxsKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSAgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBudWxsKTsKLSAgICAgICAgICA8JX0lPgotCQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpCi0JCQkJewotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQkJbXNncyA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJCW1zZ3MgPSAgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgICA8JX0lPgotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uUkVTT0xWRSwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotCQkJfQotCQl9Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2Ugey8vdm9sYXRpbGUlPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lQXNFT2JqZWN0KCklPi5lSXNQcm94eSgpID8gPCU9Z2VuRmVhdHVyZS5nZXROb25FT2JqZWN0SW50ZXJuYWxUeXBlQ2FzdChnZW5DbGFzcyklPmVSZXNvbHZlUHJveHkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pIDogPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotICAgICAgICA8JVN0cmluZyBmZWF0dXJlTWFwRW50cnlUZW1wbGF0ZUFyZ3VtZW50ID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8IiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpICsgIi5FbnRyeT4iIDogIiI7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEVmZmVjdGl2ZUZlYXR1cmVNYXBXcmFwcGVyQ2xhc3MoKSU+KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS48JT1mZWF0dXJlTWFwRW50cnlUZW1wbGF0ZUFyZ3VtZW50JT5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikpOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS48JT1mZWF0dXJlTWFwRW50cnlUZW1wbGF0ZUFyZ3VtZW50JT5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+PCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKSA9PSBudWxsIHx8ICFnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpLmlzT2JqZWN0VHlwZSgpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KTwlfSU+KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPjwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPik8JX0lPmdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQkvLyBUaGUgbGlzdCBpcyBleHBlY3RlZCB0byBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCBhbmQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nCi0JCS8vIHNvIGl0J3MgbGlrZWx5IHRoYXQgYW4gYXBwcm9wcmlhdGUgc3ViY2xhc3Mgb2Ygb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+RWNvcmVFTWFwPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT5CYXNpY0ZlYXR1cmVNYXA8JX0gZWxzZSB7JT5FY29yZUVMaXN0PCV9JT4gc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgIDwlfSU+Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljR2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillSW50ZXJuYWxDb250YWluZXIoKTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBmYWxzZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoZ2VuQ2xhc3MpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBtc2dzKTsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBudWxsIDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotICAgICAgICA8JX0lPgotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY0FkZCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBjb250YWluZWQgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IHRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCB0byBrZWVwIHRoZSBjb250YWlubWVudCByZWxhdGlvbnNoaXAgaW4gc3luY2gKLQkJLy8gLT4gZG8gbm90IG1vZGlmeSBvdGhlciBmZWF0dXJlcwotCQkvLyAtPiByZXR1cm4gbXNncywgYWZ0ZXIgYWRkaW5nIGFueSBnZW5lcmF0ZWQgTm90aWZpY2F0aW9uIHRvIGl0IChpZiBpdCBpcyBudWxsLCBhIE5vdGlmaWNhdGlvbkNoYWluIG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgZmlyc3QpCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7ICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotCSAqIEBzZWUgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHsgJT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiB2YWx1ZSk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiAmJiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpKQotCQl7Ci0JCQlpZiAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwiKSU+LmlzQW5jZXN0b3IodGhpcywgPCU9Z2VuRmVhdHVyZS5nZXRFT2JqZWN0Q2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSkKLQkJCQl0aHJvdyBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiklPigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgfHwgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICA8JX0lPgotCQkJbXNncyA9IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sICFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCkpOwotICAgICAgICAgIDwlfSU+Ci0JCX0KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7IGVsc2UgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+IW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljVW5zZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsVW5zZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLSAgICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHVuc2V0IHRoZSBjb250YWluZWQgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IHRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCB0byBrZWVwIHRoZSBjb250YWlubWVudCByZWxhdGlvbnNoaXAgaW4gc3luY2gKLQkJLy8gLT4gZG8gbm90IG1vZGlmeSBvdGhlciBmZWF0dXJlcwotCQkvLyAtPiByZXR1cm4gbXNncywgYWZ0ZXIgYWRkaW5nIGFueSBnZW5lcmF0ZWQgTm90aWZpY2F0aW9uIHRvIGl0IChpZiBpdCBpcyBudWxsLCBhIE5vdGlmaWNhdGlvbkNoYWluIG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgZmlyc3QpCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzLmJhc2ljVW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0UmF3SW1wb3J0ZWRCb3VuZFR5cGUoKSU+KQotICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy91bnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVVuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGU8JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS51bnNldCgpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgfHwgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbnVsbCwgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgPCV9JT4KLQkJfQotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsVW5zZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogbnVsbDwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbnVsbCwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7IGVsc2UgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHVuc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNJc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQuCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0UmF3SW1wb3J0ZWRCb3VuZFR5cGUoKSU+KQotICAgIDwlfSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWJvb2xlYW4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIGJvb2xlYW4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gZUlzU2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4uVW5zZXR0YWJsZTwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmlzU2V0KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmlzRW1wdHkoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB3aGV0aGVyIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuRmVhdHVyZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9Ly9mb3IlPgotPCV9fS5ydW4oKTslPgotPCVmb3IgKEdlbk9wZXJhdGlvbiBnZW5PcGVyYXRpb24gOiAoaXNJbXBsZW1lbnRhdGlvbiA/IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuT3BlcmF0aW9ucygpIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRHZW5PcGVyYXRpb25zKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0RvY3VtZW50YXRpb24oKSB8fCBnZW5PcGVyYXRpb24uaGFzUGFyYW1ldGVyRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAgICA8JWlmIChnZW5PcGVyYXRpb24uaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8JT1nZW5PcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgPCV9JT4KLSAgICA8JWZvciAoR2VuUGFyYW1ldGVyIGdlblBhcmFtZXRlciA6IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuUGFyYW1ldGVyLmhhc0RvY3VtZW50YXRpb24oKSkgeyBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IGdlblBhcmFtZXRlci5nZXREb2N1bWVudGF0aW9uKCIiKTslPgotICAgICAgICA8JWlmIChkb2N1bWVudGF0aW9uLmNvbnRhaW5zKCJcbiIpIHx8IGRvY3VtZW50YXRpb24uY29udGFpbnMoIlxyIikpIHslPgotCSAqIEBwYXJhbSA8JT1nZW5QYXJhbWV0ZXIuZ2V0TmFtZSgpJT4KLQkgKiAgIDwlPWdlblBhcmFtZXRlci5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JICogQHBhcmFtIDwlPWdlblBhcmFtZXRlci5nZXROYW1lKCklPiA8JT1nZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICA8JX0lPgotICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbk9wZXJhdGlvbi5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci0gIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICA8JX19IGlmIChmaXJzdCkgeyU+Ci0JICogQG1vZGVsCi0gIDwlfX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2VuT3BlcmF0aW9uLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9nZW5PcGVyYXRpb24uYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5PcGVyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT48JT1nZW5PcGVyYXRpb24uZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPig8JT1nZW5PcGVyYXRpb24uZ2V0UGFyYW1ldGVycyhnZW5DbGFzcyklPik8JT1nZW5PcGVyYXRpb24uZ2V0VGhyb3dzKGdlbkNsYXNzKSU+OwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuT3BlcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+PCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cyhnZW5DbGFzcyklPgotCXsKLSAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0JvZHkoKSkgeyU+Ci0JCTwlPWdlbk9wZXJhdGlvbi5nZXRCb2R5KGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgPCV9IGVsc2UgaWYgKGdlbk9wZXJhdGlvbi5pc0ludmFyaWFudCgpKSB7R2VuQ2xhc3Mgb3BDbGFzcyA9IGdlbk9wZXJhdGlvbi5nZXRHZW5DbGFzcygpOyBTdHJpbmcgZGlhZ25vc3RpY3MgPSBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCk7IFN0cmluZyBjb250ZXh0ID0gZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpOyU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyAtPiBzcGVjaWZ5IHRoZSBjb25kaXRpb24gdGhhdCB2aW9sYXRlcyB0aGUgaW52YXJpYW50Ci0JCS8vIC0+IHZlcmlmeSB0aGUgZGV0YWlscyBvZiB0aGUgZGlhZ25vc3RpYywgaW5jbHVkaW5nIHNldmVyaXR5IGFuZCBtZXNzYWdlCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCWlmIChmYWxzZSkKLQkJewotCQkJaWYgKDwlPWRpYWdub3N0aWNzJT4gIT0gbnVsbCkKLQkJCXsKLQkJCQk8JT1kaWFnbm9zdGljcyU+LmFkZAotCQkJCQkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYyIpJT4KLQkJCQkJCSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljIiklPi5FUlJPUiwKLQkJCQkJCSA8JT1vcENsYXNzLmdldEdlblBhY2thZ2UoKS5nZXRJbXBvcnRlZFZhbGlkYXRvckNsYXNzTmFtZSgpJT4uRElBR05PU1RJQ19TT1VSQ0UsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LjwlPW9wQ2xhc3MuZ2V0T3BlcmF0aW9uSUQoZ2VuT3BlcmF0aW9uKSU+LAotCQkJCQkJIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbiIpJT4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR2VuZXJpY0ludmFyaWFudF9kaWFnbm9zdGljIiwgbmV3IE9iamVjdFtdIHsgIjwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPiIsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvciIpJT4uZ2V0T2JqZWN0TGFiZWwodGhpcywgPCU9Y29udGV4dCU+KSB9KSw8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKDIpJT4KLQkJCQkJCSBuZXcgT2JqZWN0IFtdIHsgdGhpcyB9KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0gIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24uVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9Ly9mb3IlPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1VuY2hlY2tlZENhc3QoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JWJyZWFrOyB9JT4KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VBZGQoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHsgU3RyaW5nIGNhc3QgPSAiKCIgICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IikgKyAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgPyAiKSIgOiAiPCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSArICI+KSgiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IikgKyAiPD8+KSIpOyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1jYXN0JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAoPCU9Y2FzdCU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPmJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT48JX0lPigpOwotICAgIDwlfSU+Ci0JCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KW90aGVyRW5kLCBtc2dzKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUludmVyc2VSZW1vdmVHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlSW52ZXJzZVJlbW92ZSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+PCU9c2luZ2xlV2lsZGNhcmQlPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+PCU9c2luZ2xlV2lsZGNhcmQlPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+PCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSAmJiAhZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG51bGwsIG1zZ3MpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpIHslPgotICA8JUdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUdldEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFR2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQm9vbGVhblR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5tYXAoKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCk7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmdldFdyYXBwZXIoKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1VuY2hlY2tlZENhc3QoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+LlNldHRpbmcpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmFkZEFsbCgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT48JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT48PyBleHRlbmRzIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+PjwlfSU+KW5ld1ZhbHVlKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoKDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPiluZXdWYWx1ZSkuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKSA9PSBudWxsIHx8ICFnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpLmlzT2JqZWN0VHlwZSgpIHx8ICFnZW5GZWF0dXJlLmdldFJhd1R5cGUoKS5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRUeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPik8JX0lPm5ld1ZhbHVlKTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLQkJfQotICA8JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCWVEeW5hbWljU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVVbnNldEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2VVbnNldC5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVVbnNldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5jbGVhcigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5jbGVhcigpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiludWxsKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuOwotICA8JX0lPgotCQl9Ci0gIDwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCWVEeW5hbWljVW5zZXQoZmVhdHVyZUlEKTsKLSAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZVVuc2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2VJc1NldC5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpICYmIGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JWJyZWFrOyB9JT4KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQkJCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5mZWF0dXJlTWFwKCkuaXNFbXB0eSgpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gITwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuaXNFbXB0eSgpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGw7Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSAhPSBudWxsOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkgIT0gbnVsbDsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGw7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKSAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPikgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2Ugey8vZGF0YXR5cGUlPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPik7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGZlYXR1cmVJRCk7Ci08JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAoIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkgfHwgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkpIHslPgotICA8JWlmICghZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gICAgPCV9JT4KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8JT1zaW5nbGVXaWxkY2FyZCU+IGJhc2VDbGFzcykKLQl7Ci0gICAgPCVmb3IgKEdlbkNsYXNzIG1peGluR2VuQ2xhc3MgOiBnZW5DbGFzcy5nZXRNaXhpbkdlbkNsYXNzZXMoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9bWl4aW5HZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJCXsKLSAgICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBtaXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1taXhpbkdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OwotICAgICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgICA8JX0lPgotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotICA8JX0lPgotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczwlPXNpbmdsZVdpbGRjYXJkJT4gYmFzZUNsYXNzKQotCXsKLSAgPCVmb3IgKEdlbkNsYXNzIG1peGluR2VuQ2xhc3MgOiBnZW5DbGFzcy5nZXRNaXhpbkdlbkNsYXNzZXMoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9bWl4aW5HZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IG1peGluR2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQkJY2FzZSA8JT1taXhpbkdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjsKLSAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICA8JX0lPgotICA8JWlmIChnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1nZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJCXsKLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBPYmplY3RbXSBlVmlydHVhbFZhbHVlcygpCi0JewotCQlyZXR1cm4gPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbFZhbHVlcyhPYmplY3RbXSBuZXdWYWx1ZXMpCi0JewotCQk8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT4gPSBuZXdWYWx1ZXM7Ci0JfQotCi0gIDwlfSU+Ci0gIDwleyBMaXN0PFN0cmluZz4gZVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0gICAgPCVpZiAoIWVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuaXNFbXB0eSgpKSB7IExpc3Q8U3RyaW5nPiBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0QWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIGludCBlVmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0KQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQlyZXR1cm4gPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPjsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCB2b2lkIGVTZXRWaXJ0dWFsSW5kZXhCaXRzKGludCBvZmZzZXQsIGludCBuZXdJbmRleEJpdHMpCi0JewotCQlzd2l0Y2ggKG9mZnNldCkKLQkJewotICAgICAgPCVmb3IgKGludCBpID0gMDsgaSA8IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuc2l6ZSgpOyBpKyspIHslPgotCQkJY2FzZSA8JT1pJT4gOgotCQkJCTwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT4gPSBuZXdJbmRleEJpdHM7Ci0JCQkJYnJlYWs7Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICFnZW5DbGFzcy5nZXRUb1N0cmluZ0dlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gIDwleyBib29sZWFuIGZpcnN0ID0gdHJ1ZTslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRUb1N0cmluZ0dlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCQlyZXN1bHQuYXBwZW5kKCIgKDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXN1bHQuYXBwZW5kKCIsIDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWlmIChlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pKSByZXN1bHQuYXBwZW5kKGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlpZiAoPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+KDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0PCV9JT4pIHJlc3VsdC5hcHBlbmQoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKXslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPikpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXN1bHQuYXBwZW5kKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIGtleUZlYXR1cmUgPSBnZW5DbGFzcy5nZXRNYXBFbnRyeUtleUZlYXR1cmUoKTsgR2VuRmVhdHVyZSB2YWx1ZUZlYXR1cmUgPSBnZW5DbGFzcy5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyU+Ci08JVN0cmluZyBvYmplY3RUeXBlID0gZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuT2JqZWN0Iik7JT4KLTwlU3RyaW5nIGtleVR5cGUgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8ga2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSA6IG9iamVjdFR5cGU7JT4KLTwlU3RyaW5nIHZhbHVlVHlwZSA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyB2YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcykgOiBvYmplY3RUeXBlOyU+Ci08JVN0cmluZyBlTWFwVHlwZSA9IGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSArIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjwiICsga2V5VHlwZSArICIsICIgKyB2YWx1ZVR5cGUgKyAiPiIgOiAiIik7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGhhc2ggPSAtMTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGFzaCgpCi0JewotCQlpZiAoaGFzaCA9PSAtMSkKLQkJewotCQkJPCU9b2JqZWN0VHlwZSU+IHRoZUtleSA9IGdldEtleSgpOwotCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkKLQl7Ci0JCXRoaXMuaGFzaCA9IGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWtleVR5cGUlPiBnZXRLZXkoKQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KGdldFR5cGVkS2V5KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkS2V5KCk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KDwlPWtleVR5cGUlPiBrZXkpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkS2V5KCkuYWRkQWxsKDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pPCV9JT5rZXkpOwotICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+Ci0JCXNldFR5cGVkS2V5KGtleSk7Ci0gIDwlfSBlbHNlIGlmIChrZXlGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJc2V0VHlwZWRLZXkoKCg8JT1rZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pa2V5KS48JT1rZXlGZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJc2V0VHlwZWRLZXkoKDwlPWtleUZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWtleSk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPXZhbHVlVHlwZSU+IGdldFZhbHVlKCkKLQl7Ci0gIDwlaWYgKHZhbHVlRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oZ2V0VHlwZWRWYWx1ZSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPXZhbHVlVHlwZSU+IHNldFZhbHVlKDwlPXZhbHVlVHlwZSU+IHZhbHVlKQotCXsKLQkJPCU9dmFsdWVUeXBlJT4gb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOwotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJZ2V0VHlwZWRWYWx1ZSgpLmNsZWFyKCk7Ci0JCWdldFR5cGVkVmFsdWUoKS5hZGRBbGwoPCVpZiAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPik8JX0lPnZhbHVlKTsKLSAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPgotCQlzZXRUeXBlZFZhbHVlKHZhbHVlKTsKLSAgPCV9IGVsc2UgaWYgKHZhbHVlRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKCg8JT12YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPil2YWx1ZSkuPCU9dmFsdWVGZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoPCU9dmFsdWVGZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPil2YWx1ZSk7Ci0gIDwlfSU+Ci0JCXJldHVybiBvbGRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIDwlfSU+Ci0JcHVibGljIDwlPWVNYXBUeXBlJT4gZ2V0RU1hcCgpCi0JewotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiklPiBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7Ci0JCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiAoPCU9ZU1hcFR5cGUlPiljb250YWluZXIuZUdldChlQ29udGFpbm1lbnRGZWF0dXJlKCkpOwotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2luc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci19IC8vPCU9aXNJbnRlcmZhY2UgPyAiICIgKyBnZW5DbGFzcy5nZXRJbnRlcmZhY2VOYW1lKCkgOiBnZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+Ci08JS8vIFRPRE8gZml4IHRoZSBzcGFjZSBhYm92ZSU+Ci08JWdlbk1vZGVsLmVtaXRTb3J0ZWRJbXBvcnRzKCk7JT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzL21vZGVsL0NsYXNzLmphdmFqZXQub3JnIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldC5vcmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MjZhMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMvbW9kZWwvQ2xhc3MuamF2YWpldC5vcmcKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIwICswLDAgQEAKLTwlQCBqZXQgcGFja2FnZT0ib3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmUudGVtcGxhdGVzLm1vZGVsIiBpbXBvcnRzPSJqYXZhLnV0aWwuKiBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZS5nZW5tb2RlbC4qIiBjbGFzcz0iQ2xhc3MiIHZlcnNpb249IiRJZDogQ2xhc3MuamF2YWpldCx2IDEuNzAgMjAwNy8wNi8xOCAxOTozNToyMSBlbWVya3MgRXhwICQiICU+Ci08JQotLyoqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKi8KLSU+Ci08JWZpbmFsIEdlbkNsYXNzIGdlbkNsYXNzID0gKEdlbkNsYXNzKSgoT2JqZWN0W10pYXJndW1lbnQpWzBdOyBmaW5hbCBHZW5QYWNrYWdlIGdlblBhY2thZ2UgPSBnZW5DbGFzcy5nZXRHZW5QYWNrYWdlKCk7IGZpbmFsIEdlbk1vZGVsIGdlbk1vZGVsPWdlblBhY2thZ2UuZ2V0R2VuTW9kZWwoKTslPgotPCVmaW5hbCBib29sZWFuIGlzSW50ZXJmYWNlID0gQm9vbGVhbi5UUlVFLmVxdWFscygoKE9iamVjdFtdKWFyZ3VtZW50KVsxXSk7IGZpbmFsIGJvb2xlYW4gaXNJbXBsZW1lbnRhdGlvbiA9IEJvb2xlYW4uVFJVRS5lcXVhbHMoKChPYmplY3RbXSlhcmd1bWVudClbMl0pOyU+Ci08JWZpbmFsIFN0cmluZyBwdWJsaWNTdGF0aWNGaW5hbEZsYWcgPSBpc0ltcGxlbWVudGF0aW9uID8gInB1YmxpYyBzdGF0aWMgZmluYWwgIiA6ICIiOyU+Ci08JWZpbmFsIFN0cmluZyBzaW5nbGVXaWxkY2FyZCA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyAiPD8+IiA6ICIiOyU+Ci08JWZpbmFsIFN0cmluZyBuZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24gPSBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiIC0gIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChudWxsKSA6ICIiOyU+Ci08JWZpbmFsIFN0cmluZyBwb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24gPSBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChudWxsKSA6ICIiOyU+Ci08JUAgaW5jbHVkZSBmaWxlPSIuLi9IZWFkZXIuamF2YWpldGluYyIlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldEludGVyZmFjZVBhY2thZ2VOYW1lKCklPjsKLTwlfSBlbHNlIHslPgotcGFja2FnZSA8JT1nZW5QYWNrYWdlLmdldENsYXNzUGFja2FnZU5hbWUoKSU+OwotPCV9JT4KLQotPCVnZW5Nb2RlbC5tYXJrSW1wb3J0TG9jYXRpb24oc3RyaW5nQnVmZmVyLCBnZW5QYWNrYWdlKTslPgotCi08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj48JT1nZW5DbGFzcy5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLTwlaWYgKGdlbkNsYXNzLmhhc0RvY3VtZW50YXRpb24oKSkgeyU+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiA8JT1nZW5DbGFzcy5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLTwlfSU+Ci0gKgotPCVpZiAoIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRHZXRWaXNpYmlsaXR5KCkpIHslPgotICogICA8bGk+e0BsaW5rIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+IDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59PC9saT4KLSAgPCV9JT4KLTwlfSU+Ci0gKiA8L3VsPgotICogPC9wPgotPCV9JT4KLSAqCi08JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkpIHslPgotICogQHNlZSA8JT1nZW5QYWNrYWdlLmdldFF1YWxpZmllZFBhY2thZ2VJbnRlcmZhY2VOYW1lKCklPiNnZXQ8JT1nZW5DbGFzcy5nZXRDbGFzc2lmaWVyQWNjZXNzb3JOYW1lKCklPigpCi08JX0lPgotPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNb2RlbFRhZ3MoKSkgeyBib29sZWFuIGZpcnN0ID0gdHJ1ZTsgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3RyaW5nVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihnZW5DbGFzcy5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0gKiBAbW9kZWwgPCU9bW9kZWxJbmZvJT4KLTwlfSBlbHNlIHslPgotICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci08JX19IGlmIChmaXJzdCkgeyU+Ci0gKiBAbW9kZWwKLTwlfX0lPgotPCVpZiAoZ2VuQ2xhc3MubmVlZHNSb290RXh0ZW5kc0ludGVyZmFjZUV4dGVuZHNUYWcoKSkgeyU+Ci0gKiBAZXh0ZW5kcyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoZ2VuTW9kZWwuZ2V0Um9vdEV4dGVuZHNJbnRlcmZhY2UoKSklPgotPCV9JT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotPCV9IGVsc2UgeyU+Ci0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+PCU9Z2VuQ2xhc3MuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLTwlaWYgKCFnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKSkgeyU+Ci0gKiAgIDxsaT57QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fTwvbGk+Ci08JX0lPgotICogPC91bD4KLTwlfSU+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci1wdWJsaWM8JWlmIChnZW5DbGFzcy5pc0Fic3RyYWN0KCkpIHslPiBhYnN0cmFjdDwlfSU+IGNsYXNzIDwlPWdlbkNsYXNzLmdldENsYXNzTmFtZSgpJT48JT1nZW5DbGFzcy5nZXRUeXBlUGFyYW1ldGVycygpLnRyaW0oKSU+PCU9Z2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzKCklPjwlPWdlbkNsYXNzLmdldENsYXNzSW1wbGVtZW50cygpJT4KLTwlfSBlbHNlIHslPgotcHVibGljIGludGVyZmFjZSA8JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VOYW1lKCklPjwlPWdlbkNsYXNzLmdldFR5cGVQYXJhbWV0ZXJzKCkudHJpbSgpJT48JT1nZW5DbGFzcy5nZXRJbnRlcmZhY2VFeHRlbmRzKCklPgotPCV9JT4KLXsKLTwlaWYgKGdlbk1vZGVsLmhhc0NvcHlyaWdodEZpZWxkKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCTwlPXB1YmxpY1N0YXRpY0ZpbmFsRmxhZyU+PCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuU3RyaW5nIiklPiBjb3B5cmlnaHQgPSA8JT1nZW5Nb2RlbC5nZXRDb3B5cmlnaHRGaWVsZExpdGVyYWwoKSU+OzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuZ2V0RHJpdmVyTnVtYmVyKCkgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEubGFuZy5TdHJpbmciKSU+IG1vZkRyaXZlck51bWJlciA9ICI8JT1nZW5Nb2RlbC5nZXREcml2ZXJOdW1iZXIoKSU+Ijs8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzSmF2YUlPU2VyaWFsaXphYmxlKCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHsgU3RyaW5nIGVWaXJ0dWFsVmFsdWVzRmllbGQgPSBnZW5DbGFzcy5nZXRFVmlydHVhbFZhbHVlc0ZpZWxkKCk7JT4KLSAgPCVpZiAoZVZpcnR1YWxWYWx1ZXNGaWVsZCAhPSBudWxsKSB7JT4KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIG9mIG5vbi1wcmltaXRpdmUgZmVhdHVyZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIDwlPWVWaXJ0dWFsVmFsdWVzRmllbGQlPjsKLQotICA8JX0lPgotICA8JXsgTGlzdDxTdHJpbmc+IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMgPSBnZW5DbGFzcy5nZXRFVmlydHVhbEluZGV4Qml0RmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTslPgotICAgIDwlaWYgKCFlVmlydHVhbEluZGV4Qml0RmllbGRzLmlzRW1wdHkoKSkgeyU+Ci0gICAgICA8JWZvciAoU3RyaW5nIGVWaXJ0dWFsSW5kZXhCaXRGaWVsZCA6IGVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMpIHslPgotCS8qKgotCSAqIEEgYml0IGZpZWxkIHJlcHJlc2VudGluZyB0aGUgaW5kaWNlcyBvZiBub24tcHJpbWl0aXZlIGZlYXR1cmUgdmFsdWVzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9ZVZpcnR1YWxJbmRleEJpdEZpZWxkJT47Ci0KLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzTW9kZWxSb290KCkgJiYgZ2VuTW9kZWwuaXNCb29sZWFuRmxhZ3NFbmFibGVkKCkgJiYgZ2VuTW9kZWwuZ2V0Qm9vbGVhbkZsYWdzUmVzZXJ2ZWRCaXRzKCkgPT0gLTEpIHslPgotCS8qKgotCSAqIEEgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5Nb2RlbC5nZXRCb29sZWFuRmxhZ3NGaWVsZCgpJT4gPSAwOwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldERlY2xhcmVkRmllbGRHZW5GZWF0dXJlcygpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2RlY2xhcmVkRmllbGRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgfHwgZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEludGVybmFsVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQotICAgICAgPCV9JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzQXJyYXlBY2Nlc3NvcnMoKSAmJiBnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHsgU3RyaW5nIHJhd0xpc3RJdGVtVHlwZSA9IGdlbkZlYXR1cmUuZ2V0UmF3TGlzdEl0ZW1UeXBlKCk7IGludCBpbmRleCA9IHJhd0xpc3RJdGVtVHlwZS5pbmRleE9mKCdbJyk7IFN0cmluZyBoZWFkID0gcmF3TGlzdEl0ZW1UeXBlOyBTdHJpbmcgdGFpbCA9ICIiOyBpZiAoaW5kZXggIT0gLTEpIHsgaGVhZCA9IHJhd0xpc3RJdGVtVHlwZS5zdWJzdHJpbmcoMCwgaW5kZXgpOyB0YWlsID0gcmF3TGlzdEl0ZW1UeXBlLnN1YnN0cmluZyhpbmRleCk7IH0gJT4KLQkvKioKLQkgKiBUaGUgZW1wdHkgdmFsdWUgZm9yIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIGFycmF5IGFjY2Vzc29yLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBcnJheUFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKS5jb250YWlucygiPCIpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgPCV9JT4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPXJhd0xpc3RJdGVtVHlwZSU+W10gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VFTVBUWV9BUlJBWSA9IG5ldyA8JT1oZWFkJT4gWzBdPCU9dGFpbCU+OwotCi0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5oYXNFRGVmYXVsdCgpICYmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkgfHwgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiAoIWdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkgfHwgIWdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpKSkgeyBTdHJpbmcgc3RhdGljRGVmYXVsdFZhbHVlID0gZ2VuRmVhdHVyZS5nZXRTdGF0aWNEZWZhdWx0VmFsdWUoKTslPgotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpIDxlbT48JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+PC9lbT59JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiBnZW5GZWF0dXJlLmlzTGlzdERhdGFUeXBlKCkgJiYgZ2VuRmVhdHVyZS5pc1NldERlZmF1bHRWYWx1ZSgpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgPCV9JT4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+PCVpZiAoIiIuZXF1YWxzKHN0YXRpY0RlZmF1bHRWYWx1ZSkpIHslPjsgLy8gVE9ETyBUaGUgZGVmYXVsdCB2YWx1ZSBsaXRlcmFsICI8JT1nZW5GZWF0dXJlLmdldEVjb3JlRmVhdHVyZSgpLmdldERlZmF1bHRWYWx1ZUxpdGVyYWwoKSU+IiBpcyBub3QgdmFsaWQuPCV9IGVsc2UgeyU+ID0gPCU9c3RhdGljRGVmYXVsdFZhbHVlJT47PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKHN0YXRpY0RlZmF1bHRWYWx1ZSklPjwlfSU+Ci0KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgPiAzMSAmJiBnZW5DbGFzcy5nZXRGbGFnSW5kZXgoZ2VuRmVhdHVyZSkgJSAzMiA9PSAwKSB7JT4KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIHNldCBvZiBiaXQgZmxhZ3MgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgYm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCB3aGV0aGVyIHVuc2V0dGFibGUgZmVhdHVyZXMgaGF2ZSBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBpbnQgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICAgIDwlfSU+Ci0JLyoqCi0JICogVGhlIGZsYWcgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHID0gMSA8JT0iPDwgIiArIGdlbkNsYXNzLmdldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyICU+OwotCi0gICAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCA8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPjsKLQotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotICAgICAgICA8JWlmIChnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpID4gMzEgJiYgZ2VuQ2xhc3MuZ2V0RVNldEZsYWdJbmRleChnZW5GZWF0dXJlKSAlIDMyID09IDApIHslPgotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgc2V0IG9mIGJpdCBmbGFncyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBvZiBib29sZWFuIGF0dHJpYnV0ZXMgYW5kIHdoZXRoZXIgdW5zZXR0YWJsZSBmZWF0dXJlcyBoYXZlIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGludCA8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ID0gMDsKLQotICAgICAgICA8JX0lPgotCS8qKgotCSAqIFRoZSBmbGFnIHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSA8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+IDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+IGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRyA9IDEgPCU9Ijw8ICIgKyBnZW5DbGFzcy5nZXRFU2V0RmxhZ0luZGV4KGdlbkZlYXR1cmUpICUgMzIgJT47Ci0KLSAgICAgIDwlfSBlbHNlIHslPgotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPiA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCi0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9kZWNsYXJlZEZpZWxkR2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSAmJiAhZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChudWxsKSU+ID0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPi5nZXRGZWF0dXJlSUQoPCU9Z2VuQ2xhc3MuZ2V0SW1wbGVtZW50ZWRHZW5GZWF0dXJlcygpLmdldCgwKS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkuZ2V0KDApKSU+OwotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSkgeyU+Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRlZEdlbkZlYXR1cmVzKCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyU+Ci0gICAgPCVpZiAocmV2ZXJzZUZlYXR1cmUgIT0gbnVsbCAmJiByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpLmhhc09mZnNldENvcnJlY3Rpb24oKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IDwlPWdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChnZW5GZWF0dXJlKSU+ID0gPCU9cmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKS5nZXRRdWFsaWZpZWRDbGFzc2lmaWVyQWNjZXNzb3IoKSU+LmdldEZlYXR1cmVJRCg8JT1yZXZlcnNlRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KSAtIDwlPXJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCkuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+OwotCi0gICAgPCV9JT4KLSAgPCV9JT4KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQk8JWlmIChnZW5Nb2RlbC5pc1B1YmxpY0NvbnN0cnVjdG9ycygpKSB7JT5wdWJsaWM8JX0gZWxzZSB7JT5wcm90ZWN0ZWQ8JX0lPiA8JT1nZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+KCkKLQl7Ci0JCXN1cGVyKCk7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRGbGFnR2VuRmVhdHVyZXMoInRydWUiKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gIDwlfSU+Ci0gICAgCi0gLy9VTUEtLT4KLSAJCXJlYXNzaWduRGVmYXVsdFZhbHVlcygpOwotIC8vVU1BPC0tCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3MiKSU+IGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkQ2xhc3NpZmllckFjY2Vzc29yKCklPjsKLQl9Ci0KLTwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9yZWZsZWN0aXZlRGVsZWdhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiBnZW5Nb2RlbC5nZXRGZWF0dXJlRGVsZWdhdGlvbigpID09IEdlbkRlbGVnYXRpb25LaW5kLlJFRkxFQ1RJVkVfTElURVJBTCAmJiAoZ2VuQ2xhc3MuZ2V0Q2xhc3NFeHRlbmRzR2VuQ2xhc3MoKSA9PSBudWxsIHx8IGdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkuZ2V0R2VuTW9kZWwoKS5nZXRGZWF0dXJlRGVsZWdhdGlvbigpICE9IEdlbkRlbGVnYXRpb25LaW5kLlJFRkxFQ1RJVkVfTElURVJBTCkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgaW50IGVTdGF0aWNGZWF0dXJlQ291bnQoKQotCXsKLQkJcmV0dXJuIDwlPWdlbkNsYXNzLmdldENsYXNzRXh0ZW5kc0dlbkNsYXNzKCkgPT0gbnVsbCA/IDAgOiBnZW5DbGFzcy5nZXRDbGFzc0V4dGVuZHNHZW5DbGFzcygpLmdldEFsbEdlbkZlYXR1cmVzKCkuc2l6ZSgpJT47Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9yZWZsZWN0aXZlRGVsZWdhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlbmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7JT4KLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiAoaXNJbXBsZW1lbnRhdGlvbiA/IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuRmVhdHVyZXMoKSA6IGdlbkNsYXNzLmdldERlY2xhcmVkR2VuRmVhdHVyZXMoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotICA8JWlmIChnZW5Nb2RlbC5pc0FycmF5QWNjZXNzb3JzKCkgJiYgZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5GZWF0dXJlLmlzTWFwVHlwZSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSA8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCk7Ci0KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSA8JT1nZW5GZWF0dXJlLmdldEdldEFycmF5QWNjZXNzb3IoKSU+KCkKLQl7Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0JCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4gbGlzdCA9ICg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgcmV0dXJuIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKS5jb250YWlucygiPCIpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShudWxsKS5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pPCV9JT48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsIHx8IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LmlzRW1wdHkoKSkgcmV0dXJuIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgJiYgIWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKS5jb250YWlucygiPCIpICYmICFnZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShudWxsKS5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+W10pPCV9JT48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUVNUFRZX0FSUkFZOwotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0IiklPjwlPWdlbkZlYXR1cmUuZ2V0TGlzdFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+IGxpc3QgPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdCIpJT48JT1nZW5GZWF0dXJlLmdldExpc3RUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0JCWxpc3Quc2hyaW5rKCk7Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSlsaXN0LmRhdGEoKTsKLQl9Ci0KLSAgICA8JX0lPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICAgIDwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4KQotCXsKLQkJcmV0dXJuIDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT4pPCV9JT48JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmdldChpbmRleCk7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0JaW50IGdldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPkxlbmd0aCgpOwotCi0gICAgPCV9IGVsc2UgeyU+Ci0JcHVibGljIGludCBnZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT5MZW5ndGgoKQotCXsKLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuc2l6ZSgpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsID8gMCA6IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+LnNpemUoKTsKLSAgICAgIDwlfSU+Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpJT5bXSBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPltdIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pCi0JewotCQkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRUxpc3QiKSU+PCU9Z2VuRmVhdHVyZS5nZXRMaXN0VGVtcGxhdGVBcmd1bWVudHMoZ2VuQ2xhc3MpJT4pPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0RGF0YShuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+Lmxlbmd0aCwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0JfQotCi0gICAgPCV9JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgICA8JWlmICghaXNJbXBsZW1lbnRhdGlvbikgeyU+Ci0Jdm9pZCBzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oaW50IGluZGV4LCA8JT1nZW5GZWF0dXJlLmdldExpc3RJdGVtVHlwZShnZW5DbGFzcyklPiBlbGVtZW50KTsKLQotICAgIDwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihpbnQgaW5kZXgsIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+IGVsZW1lbnQpCi0JewotCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0dldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvYj48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyBHZW5GZWF0dXJlIGtleUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldE1hcEVudHJ5VHlwZUdlbkNsYXNzKCkuZ2V0TWFwRW50cnlLZXlGZWF0dXJlKCk7IEdlbkZlYXR1cmUgdmFsdWVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRNYXBFbnRyeVR5cGVHZW5DbGFzcygpLmdldE1hcEVudHJ5VmFsdWVGZWF0dXJlKCk7ICU+Ci0JICogVGhlIGtleSBpcyBvZiB0eXBlIDwlaWYgKGtleUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT5saXN0IG9mIHtAbGluayA8JT1rZXlGZWF0dXJlLmdldFF1YWxpZmllZExpc3RJdGVtVHlwZShnZW5DbGFzcyklPn08JX0gZWxzZSB7JT57QGxpbmsgPCU9a2V5RmVhdHVyZS5nZXRUeXBlKGdlbkNsYXNzKSU+fTwlfSU+LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSA8JWlmICh2YWx1ZUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT5saXN0IG9mIHtAbGluayA8JT12YWx1ZUZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+fTwlfSBlbHNlIHslPntAbGluayA8JT12YWx1ZUZlYXR1cmUuZ2V0VHlwZShnZW5DbGFzcyklPn08JX0lPiwKLSAgICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpICYmICEoZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1ldGFEYXRhKCkgJiYgIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0Ii5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRMaXN0SXRlbVR5cGUoZ2VuQ2xhc3MpKSkpIHsKLVN0cmluZyB0eXBlTmFtZSA9IGdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkTGlzdEl0ZW1UeXBlKGdlbkNsYXNzKTsgU3RyaW5nIGhlYWQgPSB0eXBlTmFtZTsgU3RyaW5nIHRhaWwgPSAiIjsgaW50IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZignPCcpOyBpZiAoaW5kZXggPT0gLTEpIHsgaW5kZXggPSB0eXBlTmFtZS5pbmRleE9mKCdbJyk7IH0gCi1pZiAoaW5kZXggIT0gLTEpIHsgaGVhZCA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7IHRhaWwgPSB0eXBlTmFtZS5zdWJzdHJpbmcoaW5kZXgpLnJlcGxhY2VBbGwoIjwiLCAiJmx0OyIpOyB9Ci0lPgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayA8JT1oZWFkJT59PCU9dGFpbCU+LgotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1NldERlZmF1bHRWYWx1ZSgpKSB7JT4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT48JT1nZW5GZWF0dXJlLmdldERlZmF1bHRWYWx1ZSgpJT48L2NvZGU+LgotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpICE9IG51bGwpIHslPgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIDwlPWdlbkZlYXR1cmUuZ2V0VHlwZUdlbkVudW0oKS5nZXRRdWFsaWZpZWROYW1lKCklPn0uCi0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpICYmICFnZW5GZWF0dXJlLmdldFJldmVyc2UoKS5nZXRHZW5DbGFzcygpLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VHZW5GZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7ICU+Ci0gICAgICA8JWlmICghcmV2ZXJzZUdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkR2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayA8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9cmV2ZXJzZUdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nLgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2V0R2VuRmVhdHVyZS5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAgICA8JWlmICghZ2VuRmVhdHVyZS5oYXNEb2N1bWVudGF0aW9uKCkpIHslPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLSAgICA8JX0lPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiA8JT1nZW5GZWF0dXJlLmdldERvY3VtZW50YXRpb24oZ2VuTW9kZWwuZ2V0SW5kZW50YXRpb24oc3RyaW5nQnVmZmVyKSklPgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAgICA8JX0lPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpICE9IG51bGwpIHslPgotCSAqIEBzZWUgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDaGFuZ2VhYmxlKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0UmF3SW1wb3J0ZWRCb3VuZFR5cGUoKSU+KQotICAgIDwlfSU+Ci0gICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NFTUZNZXRhRGF0YSgpKSB7JT4KLQkgKiBAc2VlIDwlPWdlblBhY2thZ2UuZ2V0UXVhbGlmaWVkUGFja2FnZUludGVyZmFjZU5hbWUoKSU+I2dldDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUFjY2Vzc29yTmFtZSgpJT4oKQotICAgIDwlfSU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSAmJiAhZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCkuZ2V0R2VuQ2xhc3MoKS5pc01hcEVudHJ5KCkpIHsgR2VuRmVhdHVyZSByZXZlcnNlR2VuRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyAlPgotICAgICAgPCVpZiAoIXJldmVyc2VHZW5GZWF0dXJlLmlzU3VwcHJlc3NlZEdldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSA8JT1yZXZlcnNlR2VuRmVhdHVyZS5nZXRHZW5DbGFzcygpLmdldFF1YWxpZmllZEludGVyZmFjZU5hbWUoKSU+IzwlPXJldmVyc2VHZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzRU1GTW9kZWxUYWdzKCkpIHsgYm9vbGVhbiBmaXJzdCA9IHRydWU7IGZvciAoU3RyaW5nVG9rZW5pemVyIHN0cmluZ1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2VuRmVhdHVyZS5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0JICogICAgICAgIDwlPW1vZGVsSW5mbyU+Ci0gICAgPCV9fSBpZiAoZmlyc3QpIHslPgotCSAqIEBtb2RlbAotICAgIDwlfX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9IGVsc2UgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvZ2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9nZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotCi08JX0gZWxzZSB7JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSAmJiAoKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSB8fCBnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc1VuY2hlY2tlZENhc3QoKSB8fCBnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpIHx8IGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgfHwgZ2VuRmVhdHVyZS5pc0xpc3REYXRhVHlwZSgpICYmIGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpKSB7JT4KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPig8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pZUdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSU+Ci0JCWlmICg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9PSBudWxsKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQllVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG5ldyA8JT1nZW5DbGFzcy5nZXRMaXN0Q29uc3RydWN0b3IoZ2VuRmVhdHVyZSklPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotCQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBuZXcgPCU9Z2VuQ2xhc3MuZ2V0TGlzdENvbnN0cnVjdG9yKGdlbkZlYXR1cmUpJT47Ci0gICAgICAgIDwlfSU+Ci0JCX0KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+PCU9Z2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpID8gIi5tYXAoKSIgOiAiIiU+OwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyU+Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pIHJldHVybiBudWxsOwotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVDb250YWluZXIoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjwlaWYgKGdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSU+KTsKLSAgICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lQXNFT2JqZWN0KCklPi5lSXNQcm94eSgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLQkJCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXROb25FT2JqZWN0SW50ZXJuYWxUeXBlQ2FzdChnZW5DbGFzcyklPmVSZXNvbHZlUHJveHkob2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPik7Ci0JCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikKLQkJCXsKLSAgICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRWZmZWN0aXZlQ29udGFpbnMoKSkgeyU+Ci0JCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkpIHslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBudWxsLCBudWxsKTsKLSAgICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSAgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBudWxsKTsKLSAgICAgICAgICA8JX0lPgotCQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpCi0JCQkJewotICAgICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQkJbXNncyA9IG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4uZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQkJCW1zZ3MgPSAgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPi5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgICA8JX0lPgotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCQkJZVZpcnR1YWxTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uUkVTT0xWRSwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pKTsKLSAgICAgICAgICA8JX0lPgotCQkJfQotCQl9Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiBnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT48JWlmIChnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXR1cm4gKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMDsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2Ugey8vdm9sYXRpbGUlPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkgJiYgIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSBiYXNpY0dldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpOwotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lQXNFT2JqZWN0KCklPi5lSXNQcm94eSgpID8gPCU9Z2VuRmVhdHVyZS5nZXROb25FT2JqZWN0SW50ZXJuYWxUeXBlQ2FzdChnZW5DbGFzcyklPmVSZXNvbHZlUHJveHkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pIDogPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkpIHslPgotICAgICAgICA8JVN0cmluZyBmZWF0dXJlTWFwRW50cnlUZW1wbGF0ZUFyZ3VtZW50ID0gZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCA/ICI8IiArIGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpICsgIi5FbnRyeT4iIDogIiI7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZEVmZmVjdGl2ZUZlYXR1cmVNYXBXcmFwcGVyQ2xhc3MoKSU+KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKS48JT1mZWF0dXJlTWFwRW50cnlUZW1wbGF0ZUFyZ3VtZW50JT5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPikpOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS48JT1mZWF0dXJlTWFwRW50cnlUZW1wbGF0ZUFyZ3VtZW50JT5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkubGlzdCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4pOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5saXN0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KDwlfSU+PCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKSA9PSBudWxsIHx8ICFnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpLmlzT2JqZWN0VHlwZSgpKSB7JT4oPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KTwlfSU+KCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpLmdldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIHRydWUpPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KS48JT1nZW5GZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCk8JX0lPjsKLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPig8JX0lPjwlaWYgKGdlbkZlYXR1cmUuZ2V0VHlwZUdlbkRhdGFUeXBlKCkgPT0gbnVsbCB8fCAhZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKS5pc09iamVjdFR5cGUoKSkgeyU+KDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPik8JX0lPmdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgdHJ1ZSk8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pLjwlPWdlbkZlYXR1cmUuZ2V0UHJpbWl0aXZlVmFsdWVGdW5jdGlvbigpJT4oKTwlfSU+OwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQkvLyBUaGUgbGlzdCBpcyBleHBlY3RlZCB0byBpbXBsZW1lbnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCBhbmQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nCi0JCS8vIHNvIGl0J3MgbGlrZWx5IHRoYXQgYW4gYXBwcm9wcmlhdGUgc3ViY2xhc3Mgb2Ygb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+RWNvcmVFTWFwPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNGZWF0dXJlTWFwVHlwZSgpKSB7JT5CYXNpY0ZlYXR1cmVNYXA8JX0gZWxzZSB7JT5FY29yZUVMaXN0PCV9JT4gc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgIDwlfSU+Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljR2V0KCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi08JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7IC8vQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCV9JT4KLQlwdWJsaWMgPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSByZXR1cm4gbnVsbDsKLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillSW50ZXJuYWxDb250YWluZXIoKTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkuZ2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgZmFsc2UpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4pZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKS5nZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBmYWxzZSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNHZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IGRvIG5vdCBwZXJmb3JtIHByb3h5IHJlc29sdXRpb24KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzL2Jhc2ljR2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgPCV9JT4KLSAgPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkZlYXR1cmUuaXNCYXNpY1NldCgpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci0JcHVibGljIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRJbnRlcm5hbFR5cGUoZ2VuQ2xhc3MpJT4gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NvbnRhaW5lcigpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wcmUuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBtc2dzKTsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljU2V0R2VuRmVhdHVyZS5wb3N0Lmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JCXJldHVybiBtc2dzOwotICAgIDwlfSBlbHNlIGlmICghZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnByZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJT2JqZWN0IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSBlVmlydHVhbFNldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+IHw9IDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNVbnNldHRhYmxlKCkpIHslPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4gbm90aWZpY2F0aW9uID0gbmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBudWxsIDogb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPiFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFID8gbnVsbCA6IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pOwotICAgICAgICA8JX0lPgotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0gICAgICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvYmFzaWNTZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkJcmV0dXJuIG1zZ3M7Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuZmVhdHVyZU1hcCgpKS5iYXNpY0FkZCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG1zZ3MpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwpZ2V0PCU9ZGVsZWdhdGVGZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKSkuYmFzaWNBZGQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUuVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gc2V0IHRoZSBjb250YWluZWQgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IHRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCB0byBrZWVwIHRoZSBjb250YWlubWVudCByZWxhdGlvbnNoaXAgaW4gc3luY2gKLQkJLy8gLT4gZG8gbm90IG1vZGlmeSBvdGhlciBmZWF0dXJlcwotCQkvLyAtPiByZXR1cm4gbXNncywgYWZ0ZXIgYWRkaW5nIGFueSBnZW5lcmF0ZWQgTm90aWZpY2F0aW9uIHRvIGl0IChpZiBpdCBpcyBudWxsLCBhIE5vdGlmaWNhdGlvbkNoYWluIG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgZmlyc3QpCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNTZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRTZXRWaXNpYmlsaXR5KCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7ICU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4uCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VudW1UeXBlKCkpIHslPgotCSAqIEBzZWUgPCU9Z2VuRmVhdHVyZS5nZXRUeXBlR2VuRW51bSgpLmdldFF1YWxpZmllZE5hbWUoKSU+Ci0gICAgPCV9JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSB7JT4KLQkgKiBAc2VlICNpc1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpCi0gICAgICA8JX0lPgotICAgICAgPCVpZiAoIWdlbkZlYXR1cmUuaXNTdXBwcmVzc2VkVW5zZXRWaXNpYmlsaXR5KCkpIHslPgotCSAqIEBzZWUgI3Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLQkgKiBAc2VlICM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHsgJT4KLQl2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiB2YWx1ZSk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KQotCXsKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL3NldEdlbkZlYXR1cmUucHJlLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVNldCg8JT1nZW5GZWF0dXJlLmdldFF1YWxpZmllZEZlYXR1cmVBY2Nlc3NvcigpJT4sIDwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPm5ldyA8JT1nZW5GZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oPCV9JT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+KTwlfSU+KTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaXNWb2xhdGlsZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSkgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gZUludGVybmFsQ29udGFpbmVyKCkgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiAmJiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpKQotCQl7Ci0JCQlpZiAoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWwiKSU+LmlzQW5jZXN0b3IodGhpcywgPCU9Z2VuRmVhdHVyZS5nZXRFT2JqZWN0Q2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KSkKLQkJCQl0aHJvdyBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiklPigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSk7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotCQkJPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiluZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+KS5lSW52ZXJzZUFkZCh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPig8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLSAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgfHwgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0gICAgICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzQmlkaXJlY3Rpb25hbCgpKSB7JT4KLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG51bGwsIG1zZ3MpOwotICAgICAgICA8JX0gZWxzZSB7IEdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJCW1zZ3MgPSAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCIpJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gbnVsbCkKLQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KW5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pLmVJbnZlcnNlQWRkKHRoaXMsIDwlPXRhcmdldENsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChyZXZlcnNlRmVhdHVyZSklPjwlPXJldmVyc2VPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPXRhcmdldENsYXNzLmdldEltcG9ydGVkSW50ZXJmYWNlTmFtZSgpJT4uY2xhc3MsIG1zZ3MpOwotICAgICAgICA8JX0lPgotCQkJbXNncyA9IGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0SW50ZXJuYWxUeXBlQ2FzdCgpJT5uZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJZWxzZQotCQl7Ci0gICAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSBlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgICAgPCV9JT4KLQkJCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gfD0gPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCQlib29sZWFuIG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0ID0gPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDsKLSAgICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sIG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4sICFvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCkpOwotICAgICAgICAgIDwlfSU+Ci0JCX0KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiwgbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPikpOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9ICg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDA7Ci0gICAgICAgICAgPCV9JT4KLQkJaWYgKG5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4pIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7IGVsc2UgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBuZXc8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+OwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRJbnRlcm5hbFR5cGVDYXN0KCklPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT47Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gPSA8JT1nZW5GZWF0dXJlLmdldEludGVybmFsVHlwZUNhc3QoKSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjsKLSAgICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlib29sZWFuIGlzU2V0Q2hhbmdlID0gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9PSBFVklSVFVBTF9OT19WQUxVRTsKLSAgICAgICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICAgICAgPCV9JT4KLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgICA8JX0lPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gdHJ1ZTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPmlzU2V0Q2hhbmdlPCV9IGVsc2UgeyU+IW9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID09IEVWSVJUVUFMX05PX1ZBTFVFID8gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gOiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9IGVsc2UgeyU+b2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlfSU+LCA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPjwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9zZXRHZW5GZWF0dXJlLnBvc3QuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5oYXNEZWxlZ2F0ZUZlYXR1cmUoKSkgeyBHZW5GZWF0dXJlIGRlbGVnYXRlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0RGVsZWdhdGVGZWF0dXJlKCk7JT4KLSAgICAgIDwlaWYgKGRlbGVnYXRlRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmZlYXR1cmVNYXAoKSkuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPiwgPCVpZiAoZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+bmV3IDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPig8JX0lPm5ldzwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4pPCV9JT4pOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5zZXQoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+LCA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5uZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlfSU+bmV3PCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPjwlaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPik8JX0lPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3Mvc2V0R2VuRmVhdHVyZS5UT0RPLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzZXQgdGhlICc8JT1nZW5GZWF0dXJlLmdldEZvcm1hdHRlZE5hbWUoKSU+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPgotCQkvLyBFbnN1cmUgdGhhdCB5b3UgcmVtb3ZlIEBnZW5lcmF0ZWQgb3IgbWFyayBpdCBAZ2VuZXJhdGVkIE5PVAotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLTwlQCBlbmQgJT48JS8vQ2xhc3Mvc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuRmVhdHVyZS5pc0Jhc2ljVW5zZXQoKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jJT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MpCi0JewotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsVW5zZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZFR5cGUoZ2VuQ2xhc3MpJT4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+OwotCQk8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9IG51bGw7Ci0gICAgICA8JX0lPgotICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICA8JX0lPgotICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPiBub3RpZmljYXRpb24gPSBuZXcgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbCIpJT4odGhpcywgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb24iKSU+LlVOU0VULCA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPmlzU2V0Q2hhbmdlID8gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA6IG51bGw8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+PCV9JT4sIG51bGwsIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLSAgICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2Jhc2ljVW5zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHVuc2V0IHRoZSBjb250YWluZWQgJzwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT4nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+Ci0JCS8vIC0+IHRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCB0byBrZWVwIHRoZSBjb250YWlubWVudCByZWxhdGlvbnNoaXAgaW4gc3luY2gKLQkJLy8gLT4gZG8gbm90IG1vZGlmeSBvdGhlciBmZWF0dXJlcwotCQkvLyAtPiByZXR1cm4gbXNncywgYWZ0ZXIgYWRkaW5nIGFueSBnZW5lcmF0ZWQgTm90aWZpY2F0aW9uIHRvIGl0IChpZiBpdCBpcyBudWxsLCBhIE5vdGlmaWNhdGlvbkNoYWluIG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgZmlyc3QpCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9iYXNpY1Vuc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JUAgZW5kICU+PCUvL0NsYXNzLmJhc2ljVW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXQoKSAmJiAoaXNJbXBsZW1lbnRhdGlvbiB8fCAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci08JWlmIChpc0ludGVyZmFjZSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy91bnNldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkSW50ZXJmYWNlTmFtZSgpJT4jPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4gPGVtPjwlPWdlbkZlYXR1cmUuZ2V0Rm9ybWF0dGVkTmFtZSgpJT48L2VtPn0nIDwlPWdlbkZlYXR1cmUuZ2V0RmVhdHVyZUtpbmQoKSU+LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICA8JWlmICghZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRJc1NldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICA8JX0lPgotCSAqIEBzZWUgIzwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkKLSAgPCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0UmF3SW1wb3J0ZWRCb3VuZFR5cGUoKSU+KQotICA8JX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy91bnNldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQl2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0KLTwlfSBlbHNlIHslPgotCXB1YmxpYyB2b2lkIHVuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkKLQl7Ci0gICAgPCVpZiAoZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpKSB7JT4KLQkJZVVuc2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCkgKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+LlVuc2V0dGFibGU8JT1zaW5nbGVXaWxkY2FyZCU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS51bnNldCgpOwotICAgICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNCaWRpcmVjdGlvbmFsKCkgfHwgZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICAgICAgPCV9JT4KLQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0JCXsKLQkJCTwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW4iKSU+IG1zZ3MgPSBudWxsOwotICAgICAgICA8JWlmICghZ2VuRmVhdHVyZS5pc0JpZGlyZWN0aW9uYWwoKSkgeyU+Ci0JCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgICAgIDwlfSBlbHNlIHsgR2VuRmVhdHVyZSByZXZlcnNlRmVhdHVyZSA9IGdlbkZlYXR1cmUuZ2V0UmV2ZXJzZSgpOyBHZW5DbGFzcyB0YXJnZXRDbGFzcyA9IHJldmVyc2VGZWF0dXJlLmdldEdlbkNsYXNzKCk7IFN0cmluZyByZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiA9IHRhcmdldENsYXNzLmhhc09mZnNldENvcnJlY3Rpb24oKSA/ICIgKyAiICsgZ2VuQ2xhc3MuZ2V0T2Zmc2V0Q29ycmVjdGlvbkZpZWxkKHJldmVyc2VGZWF0dXJlKSA6ICIiOyU+Ci0JCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCA8JT10YXJnZXRDbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQocmV2ZXJzZUZlYXR1cmUpJT48JT1yZXZlcnNlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT10YXJnZXRDbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzLCBtc2dzKTsKLSAgICAgICAgPCV9JT4KLQkJCW1zZ3MgPSBiYXNpY1Vuc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UKLQkJewotICAgICAgICA8JWlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSAoPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRykgIT0gMDsKLSAgICAgICAgICA8JX0lPgotCQkJPCU9Z2VuQ2xhc3MuZ2V0RVNldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmPSB+PCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJCWJvb2xlYW4gb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQgPSA8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0OwotICAgICAgICAgIDwlfSU+Ci0JCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgIDwlfSU+Ci0gICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbnVsbCwgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPkVTZXQpKTsKLSAgICAgICAgPCV9JT4KLQkJfQotICAgICAgPCV9IGVsc2UgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gPSAoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwOwotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgJiYgIWdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQlPYmplY3Qgb2xkPCU9Z2VuRmVhdHVyZS5nZXRDYXBOYW1lKCklPiA9IGVWaXJ0dWFsVW5zZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSBlbHNlIHslPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJYm9vbGVhbiBpc1NldENoYW5nZSA9IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gIT0gRVZJUlRVQUxfTk9fVkFMVUU7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9ICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc05vdGlmaWNhdGlvbigpKSB7JT4KLQkJYm9vbGVhbiBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldCA9IDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1JlZmVyZW5jZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gbnVsbDsKLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLSAgICAgICAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQk8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUc7Ci0gICAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJPCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldCA9IGZhbHNlOwotICAgICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlaWYgKCFnZW5Nb2RlbC5pc1N1cHByZXNzTm90aWZpY2F0aW9uKCkpIHslPgotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsIiklPih0aGlzLCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbiIpJT4uVU5TRVQsIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+aXNTZXRDaGFuZ2UgPyBvbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+IDogbnVsbDwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgbnVsbCwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT5pc1NldENoYW5nZTwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT5FU2V0PCV9JT4pKTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlpZiAoPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pIDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiB8PSA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7IGVsc2UgPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICY9IH48JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUc7Ci0gICAgICAgICAgPCV9IGVsc2UgaWYgKCFnZW5Nb2RlbC5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkgfHwgZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgICA8JWlmICghZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpIHx8IGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotICAgICAgICAgICAgPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCTwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJj0gfjwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FU0VURkxBRzsKLSAgICAgICAgICAgIDwlfSBlbHNlIHslPgotCQk8JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICA8JX0lPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgICAgPCVpZiAoIWdlbk1vZGVsLmlzU3VwcHJlc3NOb3RpZmljYXRpb24oKSkgeyU+Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGwiKSU+KHRoaXMsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uIiklPi5VTlNFVCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT5pc1NldENoYW5nZSA/IG9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT4gOiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjwlfSBlbHNlIHslPm9sZDwlPWdlbkZlYXR1cmUuZ2V0Q2FwTmFtZSgpJT48JX0lPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4sIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+aXNTZXRDaGFuZ2U8JX0gZWxzZSB7JT5vbGQ8JT1nZW5GZWF0dXJlLmdldENhcE5hbWUoKSU+RVNldDwlfSU+KSk7Ci0gICAgICAgICAgPCV9JT4KLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaGFzRGVsZWdhdGVGZWF0dXJlKCkpIHsgR2VuRmVhdHVyZSBkZWxlZ2F0ZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldERlbGVnYXRlRmVhdHVyZSgpOyU+Ci0gICAgICA8JWlmIChkZWxlZ2F0ZUZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKWdldDwlPWRlbGVnYXRlRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkpLmNsZWFyKDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvdW5zZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHVuc2V0IHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4KLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL3Vuc2V0R2VuRmVhdHVyZS50b2RvLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICAgIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGVuZCAlPjwlLy9DbGFzcy91bnNldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNJc1NldCgpICYmIChpc0ltcGxlbWVudGF0aW9uIHx8ICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZElzU2V0VmlzaWJpbGl0eSgpKSkgeyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLTwlaWYgKGlzSW50ZXJmYWNlKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2lzU2V0R2VuRmVhdHVyZS5qYXZhZG9jLm92ZXJyaWRlLmphdmFqZXRpbmMiIGZhaWw9ImFsdGVybmF0aXZlIiAlPgotPCVAIHN0YXJ0ICU+Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRJbnRlcmZhY2VOYW1lKCklPiM8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPiA8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+fScgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0LgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLmphdmFkb2MuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPjwvZW0+JyA8JT1nZW5GZWF0dXJlLmdldEZlYXR1cmVLaW5kKCklPiBpcyBzZXQuCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0NoYW5nZWFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1N1cHByZXNzZWRVbnNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotICAgIDwlfSU+Ci0JICogQHNlZSAjPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKQotICAgIDwlaWYgKCFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzQ2hhbmdlYWJsZSgpICYmICFnZW5GZWF0dXJlLmlzU3VwcHJlc3NlZFNldFZpc2liaWxpdHkoKSkgeyU+Ci0JICogQHNlZSAjc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KDwlPWdlbkZlYXR1cmUuZ2V0UmF3SW1wb3J0ZWRCb3VuZFR5cGUoKSU+KQotICAgIDwlfSU+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUuamF2YWRvYy5vdmVycmlkZS5qYXZhamV0aW5jJT4KLTwlfSBlbHNlIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotPCVpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyAvL0NsYXNzL2lzU2V0R2VuRmVhdHVyZS5hbm5vdGF0aW9ucy5pbnNlcnQuamF2YWpldGluYyU+Ci08JUAgaW5jbHVkZSBmaWxlPSJDbGFzcy9pc1NldEdlbkZlYXR1cmUuYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMiIGZhaWw9InNpbGVudCIgJT4KLTwlfSU+Ci08JX0lPgotPCVpZiAoIWlzSW1wbGVtZW50YXRpb24pIHslPgotCWJvb2xlYW4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLQotPCV9IGVsc2UgeyU+Ci0JcHVibGljIGJvb2xlYW4gaXNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKQotCXsKLSAgICA8JWlmIChnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkpIHslPgotCQlyZXR1cm4gZUlzU2V0KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmlzVm9sYXRpbGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pOwotICAgICAgICA8JX0lPgotCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdCIpJT4uVW5zZXR0YWJsZTwlPXNpbmdsZVdpbGRjYXJkJT4pPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pLmlzU2V0KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmV0dXJuIGVWaXJ0dWFsSXNTZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPik7Ci0gICAgICAgIDwlfSBlbHNlIGlmIChnZW5DbGFzcy5pc0VTZXRGbGFnKGdlbkZlYXR1cmUpKSB7JT4KLQkJcmV0dXJuICg8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0VW5jYXBOYW1lKCklPkVTZXQ7Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmhhc0RlbGVnYXRlRmVhdHVyZSgpKSB7IEdlbkZlYXR1cmUgZGVsZWdhdGVGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXREZWxlZ2F0ZUZlYXR1cmUoKTslPgotICAgICAgPCVpZiAoZGVsZWdhdGVGZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbCkoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcilnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5mZWF0dXJlTWFwKCkpLmlzRW1wdHkoPCU9Z2VuRmVhdHVyZS5nZXRRdWFsaWZpZWRGZWF0dXJlQWNjZXNzb3IoKSU+KTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXR1cm4gISgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbClnZXQ8JT1kZWxlZ2F0ZUZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigpKS5pc0VtcHR5KDwlPWdlbkZlYXR1cmUuZ2V0UXVhbGlmaWVkRmVhdHVyZUFjY2Vzc29yKCklPik7Ci0gICAgICA8JX0lPgotICAgIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLlRPRE8ub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkJLy8gVE9ETzogaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiB3aGV0aGVyIHRoZSAnPCU9Z2VuRmVhdHVyZS5nZXRGb3JtYXR0ZWROYW1lKCklPicgPCU9Z2VuRmVhdHVyZS5nZXRGZWF0dXJlS2luZCgpJT4gaXMgc2V0Ci0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotPCVAIGVuZCAlPjwlLy9DbGFzcy9pc1NldEdlbkZlYXR1cmUudG9kby5vdmVycmlkZS5qYXZhamV0aW5jJT4KLSAgICA8JX0lPgotCX0KLQotPCV9JT4KLTwlQCBlbmQgJT48JS8vQ2xhc3MvaXNTZXRHZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotICA8JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuRmVhdHVyZS5pbnNlcnQuamF2YWpldGluYyIgZmFpbD0ic2lsZW50IiAlPgotPCVAIGVuZCAlPjwlLy9DbGFzcy9nZW5GZWF0dXJlLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9Ly9mb3IlPgotPCV9fS5ydW4oKTslPgotPCVmb3IgKEdlbk9wZXJhdGlvbiBnZW5PcGVyYXRpb24gOiAoaXNJbXBsZW1lbnRhdGlvbiA/IGdlbkNsYXNzLmdldEltcGxlbWVudGVkR2VuT3BlcmF0aW9ucygpIDogZ2VuQ2xhc3MuZ2V0RGVjbGFyZWRHZW5PcGVyYXRpb25zKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotPCVpZiAoaXNJbnRlcmZhY2UpIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyIgZmFpbD0iYWx0ZXJuYXRpdmUiICU+Ci08JUAgc3RhcnQgJT4KLQkvKioKLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2dlbk9wZXJhdGlvbi5qYXZhZG9jLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0RvY3VtZW50YXRpb24oKSB8fCBnZW5PcGVyYXRpb24uaGFzUGFyYW1ldGVyRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAgICA8JWlmIChnZW5PcGVyYXRpb24uaGFzRG9jdW1lbnRhdGlvbigpKSB7JT4KLQkgKiA8JT1nZW5PcGVyYXRpb24uZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgPCV9JT4KLSAgICA8JWZvciAoR2VuUGFyYW1ldGVyIGdlblBhcmFtZXRlciA6IGdlbk9wZXJhdGlvbi5nZXRHZW5QYXJhbWV0ZXJzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuUGFyYW1ldGVyLmhhc0RvY3VtZW50YXRpb24oKSkgeyBTdHJpbmcgZG9jdW1lbnRhdGlvbiA9IGdlblBhcmFtZXRlci5nZXREb2N1bWVudGF0aW9uKCIiKTslPgotICAgICAgICA8JWlmIChkb2N1bWVudGF0aW9uLmNvbnRhaW5zKCJcbiIpIHx8IGRvY3VtZW50YXRpb24uY29udGFpbnMoIlxyIikpIHslPgotCSAqIEBwYXJhbSA8JT1nZW5QYXJhbWV0ZXIuZ2V0TmFtZSgpJT4KLQkgKiAgIDwlPWdlblBhcmFtZXRlci5nZXREb2N1bWVudGF0aW9uKGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JICogQHBhcmFtIDwlPWdlblBhcmFtZXRlci5nZXROYW1lKCklPiA8JT1nZW5QYXJhbWV0ZXIuZ2V0RG9jdW1lbnRhdGlvbihnZW5Nb2RlbC5nZXRJbmRlbnRhdGlvbihzdHJpbmdCdWZmZXIpKSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICA8JX0lPgotICA8JWlmICghZ2VuTW9kZWwuaXNTdXBwcmVzc0VNRk1vZGVsVGFncygpKSB7IGJvb2xlYW4gZmlyc3QgPSB0cnVlOyBmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJpbmdUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdlbk9wZXJhdGlvbi5nZXRNb2RlbEluZm8oKSwgIlxuXHIiKTsgc3RyaW5nVG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTsgKSB7IFN0cmluZyBtb2RlbEluZm8gPSBzdHJpbmdUb2tlbml6ZXIubmV4dFRva2VuKCk7IGlmIChmaXJzdCkgeyBmaXJzdCA9IGZhbHNlOyU+Ci0JICogQG1vZGVsIDwlPW1vZGVsSW5mbyU+Ci0gIDwlfSBlbHNlIHslPgotCSAqICAgICAgICA8JT1tb2RlbEluZm8lPgotICA8JX19IGlmIChmaXJzdCkgeyU+Ci0JICogQG1vZGVsCi0gIDwlfX0lPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZ2VuT3BlcmF0aW9uLmphdmFkb2Mub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0gZWxzZSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLTwlaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHsgLy9DbGFzcy9nZW5PcGVyYXRpb24uYW5ub3RhdGlvbnMuaW5zZXJ0LmphdmFqZXRpbmMlPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmFubm90YXRpb25zLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JX0lPgotPCV9JT4KLTwlaWYgKCFpc0ltcGxlbWVudGF0aW9uKSB7JT4KLQk8JT1nZW5PcGVyYXRpb24uZ2V0VHlwZVBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT48JT1nZW5PcGVyYXRpb24uZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPig8JT1nZW5PcGVyYXRpb24uZ2V0UGFyYW1ldGVycyhnZW5DbGFzcyklPik8JT1nZW5PcGVyYXRpb24uZ2V0VGhyb3dzKGdlbkNsYXNzKSU+OwotCi08JX0gZWxzZSB7JT4KLQlwdWJsaWMgPCU9Z2VuT3BlcmF0aW9uLmdldFR5cGVQYXJhbWV0ZXJzKGdlbkNsYXNzKSU+PCU9Z2VuT3BlcmF0aW9uLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5PcGVyYXRpb24uZ2V0TmFtZSgpJT4oPCU9Z2VuT3BlcmF0aW9uLmdldFBhcmFtZXRlcnMoZ2VuQ2xhc3MpJT4pPCU9Z2VuT3BlcmF0aW9uLmdldFRocm93cyhnZW5DbGFzcyklPgotCXsKLSAgPCVpZiAoZ2VuT3BlcmF0aW9uLmhhc0JvZHkoKSkgeyU+Ci0JCTwlPWdlbk9wZXJhdGlvbi5nZXRCb2R5KGdlbk1vZGVsLmdldEluZGVudGF0aW9uKHN0cmluZ0J1ZmZlcikpJT4KLSAgPCV9IGVsc2UgaWYgKGdlbk9wZXJhdGlvbi5pc0ludmFyaWFudCgpKSB7R2VuQ2xhc3Mgb3BDbGFzcyA9IGdlbk9wZXJhdGlvbi5nZXRHZW5DbGFzcygpOyBTdHJpbmcgZGlhZ25vc3RpY3MgPSBnZW5PcGVyYXRpb24uZ2V0R2VuUGFyYW1ldGVycygpLmdldCgwKS5nZXROYW1lKCk7IFN0cmluZyBjb250ZXh0ID0gZ2VuT3BlcmF0aW9uLmdldEdlblBhcmFtZXRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpOyU+Ci0JCS8vIFRPRE86IGltcGxlbWVudCB0aGlzIG1ldGhvZAotCQkvLyAtPiBzcGVjaWZ5IHRoZSBjb25kaXRpb24gdGhhdCB2aW9sYXRlcyB0aGUgaW52YXJpYW50Ci0JCS8vIC0+IHZlcmlmeSB0aGUgZGV0YWlscyBvZiB0aGUgZGlhZ25vc3RpYywgaW5jbHVkaW5nIHNldmVyaXR5IGFuZCBtZXNzYWdlCi0JCS8vIEVuc3VyZSB0aGF0IHlvdSByZW1vdmUgQGdlbmVyYXRlZCBvciBtYXJrIGl0IEBnZW5lcmF0ZWQgTk9UCi0JCWlmIChmYWxzZSkKLQkJewotCQkJaWYgKDwlPWRpYWdub3N0aWNzJT4gIT0gbnVsbCkKLQkJCXsKLQkJCQk8JT1kaWFnbm9zdGljcyU+LmFkZAotCQkJCQkobmV3IDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYyIpJT4KLQkJCQkJCSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljIiklPi5FUlJPUiwKLQkJCQkJCSA8JT1vcENsYXNzLmdldEdlblBhY2thZ2UoKS5nZXRJbXBvcnRlZFZhbGlkYXRvckNsYXNzTmFtZSgpJT4uRElBR05PU1RJQ19TT1VSQ0UsCi0JCQkJCQkgPCU9b3BDbGFzcy5nZXRHZW5QYWNrYWdlKCkuZ2V0SW1wb3J0ZWRWYWxpZGF0b3JDbGFzc05hbWUoKSU+LjwlPW9wQ2xhc3MuZ2V0T3BlcmF0aW9uSUQoZ2VuT3BlcmF0aW9uKSU+LAotCQkJCQkJIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbiIpJT4uSU5TVEFOQ0UuZ2V0U3RyaW5nKCJfVUlfR2VuZXJpY0ludmFyaWFudF9kaWFnbm9zdGljIiwgbmV3IE9iamVjdFtdIHsgIjwlPWdlbk9wZXJhdGlvbi5nZXROYW1lKCklPiIsIDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFZhbGlkYXRvciIpJT4uZ2V0T2JqZWN0TGFiZWwodGhpcywgPCU9Y29udGV4dCU+KSB9KSw8JT1nZW5Nb2RlbC5nZXROb25OTFMoKSU+PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKDIpJT4KLQkJCQkJCSBuZXcgT2JqZWN0IFtdIHsgdGhpcyB9KSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0gIDwlfSBlbHNlIHslPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvaW1wbGVtZW50ZWRHZW5PcGVyYXRpb24uVE9ETy5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCQkvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcyBtZXRob2QKLQkJLy8gRW5zdXJlIHRoYXQgeW91IHJlbW92ZSBAZ2VuZXJhdGVkIG9yIG1hcmsgaXQgQGdlbmVyYXRlZCBOT1QKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci08JUAgZW5kICU+PCUvL0NsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLnRvZG8ub3ZlcnJpZGUuamF2YWpldGluYyU+Ci0gIDwlfSU+Ci0JfQotCi08JX0lPgotPCVAIGluY2x1ZGUgZmlsZT0iQ2xhc3MvZ2VuT3BlcmF0aW9uLmluc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci08JUAgZW5kICU+PCUvL0NsYXNzL2ltcGxlbWVudGVkR2VuT3BlcmF0aW9uLm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9Ly9mb3IlPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUludmVyc2VBZGRHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1VuY2hlY2tlZENhc3QoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JWJyZWFrOyB9JT4KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUludmVyc2VBZGQoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPiBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSW52ZXJzZUFkZEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgPCVpZiAoZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHsgU3RyaW5nIGNhc3QgPSAiKCIgICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IikgKyAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkgPyAiKSIgOiAiPCIgKyBnZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSArICI+KSgiICsgZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0IikgKyAiPD8+KSIpOyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1jYXN0JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiAoPCU9Y2FzdCU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzQ29udGFpbmVyKCkpIHslPgotCQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQmFzaWNTZXQoKSkgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPilvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+IDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ID0gPCVpZiAoZ2VuRmVhdHVyZS5pc1Jlc29sdmVQcm94aWVzKCkpIHslPmJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+PCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT48JX0lPigpOwotICAgIDwlfSU+Ci0JCQkJaWYgKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGwpCi0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0VmZmVjdGl2ZUNvbnRhaW5zKCkpIHslPgotCQkJCQltc2dzID0gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+KTwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbnVsbCwgbXNncyk7Ci0gICAgPCV9IGVsc2UgeyBHZW5GZWF0dXJlIHJldmVyc2VGZWF0dXJlID0gZ2VuRmVhdHVyZS5nZXRSZXZlcnNlKCk7IEdlbkNsYXNzIHRhcmdldENsYXNzID0gcmV2ZXJzZUZlYXR1cmUuZ2V0R2VuQ2xhc3MoKTsgU3RyaW5nIHJldmVyc2VPZmZzZXRDb3JyZWN0aW9uID0gdGFyZ2V0Q2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpID8gIiArICIgKyBnZW5DbGFzcy5nZXRPZmZzZXRDb3JyZWN0aW9uRmllbGQocmV2ZXJzZUZlYXR1cmUpIDogIiI7JT4KLQkJCQkJbXNncyA9ICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IiklPik8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPikuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci0gICAgPCV9JT4KLQkJCQlyZXR1cm4gYmFzaWNTZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKDwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KW90aGVyRW5kLCBtc2dzKTsKLSAgPCV9JT4KLTwlfSU+Ci0JCX0KLTwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUludmVyc2VSZW1vdmVHZW5GZWF0dXJlcygpKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBlSW52ZXJzZVJlbW92ZSg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiKSU+IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCA8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluIiklPiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJewotPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVJbnZlcnNlUmVtb3ZlR2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRWZmZWN0aXZlU3VwcHJlc3NFTUZUeXBlcygpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+PCU9c2luZ2xlV2lsZGNhcmQlPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSU+LkludGVybmFsTWFwVmlldzwlPWdlbkZlYXR1cmUuZ2V0SW1wb3J0ZWRNYXBUZW1wbGF0ZUFyZ3VtZW50cyhnZW5DbGFzcyklPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5lTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+PCU9c2luZ2xlV2lsZGNhcmQlPikoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3QiKSU+PCU9c2luZ2xlV2lsZGNhcmQlPik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNDb250YWluZXIoKSAmJiAhZ2VuRmVhdHVyZS5pc0Jhc2ljU2V0KCkpIHslPgotCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPiwgbXNncyk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLQkJCQlyZXR1cm4gYmFzaWNVbnNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPihtc2dzKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KG51bGwsIG1zZ3MpOwotICA8JX0lPgotPCV9JT4KLQkJfQotPCVpZiAoZ2VuTW9kZWwuaXNNaW5pbWFsUmVmbGVjdGl2ZU1ldGhvZHMoKSkgeyU+Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLTwlfSBlbHNlIHslPgotCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyR2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbiIpJT4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci08JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckdlbkZlYXR1cmVzKCkpIHslPgotICA8JUdlbkZlYXR1cmUgcmV2ZXJzZUZlYXR1cmUgPSBnZW5GZWF0dXJlLmdldFJldmVyc2UoKTsgR2VuQ2xhc3MgdGFyZ2V0Q2xhc3MgPSByZXZlcnNlRmVhdHVyZS5nZXRHZW5DbGFzcygpOyBTdHJpbmcgcmV2ZXJzZU9mZnNldENvcnJlY3Rpb24gPSB0YXJnZXRDbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgPyAiICsgIiArIGdlbkNsYXNzLmdldE9mZnNldENvcnJlY3Rpb25GaWVsZChyZXZlcnNlRmVhdHVyZSkgOiAiIjslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLQkJCQlyZXR1cm4gZUludGVybmFsQ29udGFpbmVyKCkuZUludmVyc2VSZW1vdmUodGhpcywgPCU9dGFyZ2V0Q2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKHJldmVyc2VGZWF0dXJlKSU+PCU9cmV2ZXJzZU9mZnNldENvcnJlY3Rpb24lPiwgPCU9dGFyZ2V0Q2xhc3MuZ2V0SW1wb3J0ZWRJbnRlcmZhY2VOYW1lKCklPi5jbGFzcywgbXNncyk7Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKG1zZ3MpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLTwlfSU+Ci0JfQotCi08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmIGdlbkNsYXNzLmltcGxlbWVudHNBbnkoZ2VuQ2xhc3MuZ2V0RUdldEdlbkZlYXR1cmVzKCkpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFR2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICA8JWlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzQm9vbGVhblR5cGUoKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiBuZXcgPCU9Z2VuRmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpOwotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSAmJiAhZ2VuRmVhdHVyZS5pc0xpc3RUeXBlKCkpIHslPgotCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuICgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKTsKLQkJCQllbHNlIHJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpOwotICAgIDwlfSBlbHNlIHslPgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0JCQkJZWxzZSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5tYXAoKTsKLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpKSB7JT4KLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiAoKDwlPWdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcCIpJT4uSW50ZXJuYWwuV3JhcHBlcik8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpKS5mZWF0dXJlTWFwKCk7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKTsKLQkJCQlyZXR1cm4gKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmdldFdyYXBwZXIoKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCk7Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci08JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotPCV9JT4KLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmICFnZW5Nb2RlbC5pc1JlZmxlY3RpdmVEZWxlZ2F0aW9uKCkgJiYgZ2VuQ2xhc3MuaW1wbGVtZW50c0FueShnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkpIHslPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RVNldEdlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1VuY2hlY2tlZENhc3QoKSAmJiAhZ2VuRmVhdHVyZS5pc0ZlYXR1cmVNYXBUeXBlKCkgJiYgIWdlbkZlYXR1cmUuaXNNYXBUeXBlKCkpIHslPgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgPCVicmVhazsgfSU+Ci0gICAgPCV9JT4KLSAgPCV9JT4KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRDwlPW5lZ2F0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KQotCQl7Ci0gIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQljYXNlIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OgotICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNXcmFwcGVkRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzRmVhdHVyZU1hcFR5cGUoKSkgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLnNldChuZXdWYWx1ZSk7Ci0gICAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc01hcFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbkZlYXR1cmUuaXNFZmZlY3RpdmVTdXBwcmVzc0VNRlR5cGVzKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlIiklPi5TZXR0aW5nKSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcCIpJT4uSW50ZXJuYWxNYXBWaWV3PCU9Z2VuRmVhdHVyZS5nZXRJbXBvcnRlZE1hcFRlbXBsYXRlQXJndW1lbnRzKGdlbkNsYXNzKSU+KTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmVNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+LlNldHRpbmcpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuc2V0KG5ld1ZhbHVlKTsKLSAgICAgICAgPCV9JT4KLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuY2xlYXIoKTsKLQkJCQk8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpLmFkZEFsbCgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT48JWlmIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwKSB7JT48PyBleHRlbmRzIDwlPWdlbkZlYXR1cmUuZ2V0TGlzdEl0ZW1UeXBlKGdlbkNsYXNzKSU+PjwlfSU+KW5ld1ZhbHVlKTsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgaWYgKGdlbkZlYXR1cmUuaXNQcmltaXRpdmVUeXBlKCkpIHslPgotCQkJCXNldDwlPWdlbkZlYXR1cmUuZ2V0QWNjZXNzb3JOYW1lKCklPigoKDwlPWdlbkZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPiluZXdWYWx1ZSkuPCU9Z2VuRmVhdHVyZS5nZXRQcmltaXRpdmVWYWx1ZUZ1bmN0aW9uKCklPigpKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCVpZiAoZ2VuRmVhdHVyZS5nZXRUeXBlR2VuRGF0YVR5cGUoKSA9PSBudWxsIHx8ICFnZW5GZWF0dXJlLmdldFR5cGVHZW5EYXRhVHlwZSgpLmlzT2JqZWN0VHlwZSgpIHx8ICFnZW5GZWF0dXJlLmdldFJhd1R5cGUoKS5lcXVhbHMoZ2VuRmVhdHVyZS5nZXRUeXBlKGdlbkNsYXNzKSkpIHslPig8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPik8JX0lPm5ld1ZhbHVlKTsKLSAgICA8JX0lPgotCQkJCXJldHVybjsKLSAgPCV9JT4KLQkJfQotICA8JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCWVEeW5hbWljU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotICA8JX0lPgotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVVbnNldEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2VVbnNldC5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLSAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IGdlbkNsYXNzLmdldEVVbnNldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjoKLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotCQkJCSgoPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwIiklPi5JbnRlcm5hbC5XcmFwcGVyKTwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkpLmZlYXR1cmVNYXAoKS5jbGVhcigpOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKS5jbGVhcigpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJdW5zZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oKTsKLSAgICA8JX0gZWxzZSBpZiAoIWdlbkZlYXR1cmUuaGFzRURlZmF1bHQoKSkgeyU+Ci0JCQkJc2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiludWxsKTsKLSAgICA8JX0gZWxzZSB7JT4KLQkJCQlzZXQ8JT1nZW5GZWF0dXJlLmdldEFjY2Vzc29yTmFtZSgpJT4oPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4pOwotICAgIDwlfSU+Ci0JCQkJcmV0dXJuOwotICA8JX0lPgotCQl9Ci0gIDwlaWYgKGdlbk1vZGVsLmlzTWluaW1hbFJlZmxlY3RpdmVNZXRob2RzKCkpIHslPgotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCWVEeW5hbWljVW5zZXQoZmVhdHVyZUlEKTsKLSAgPCV9JT4KLQl9Ci0KLTwlQCBlbmQgJT48JS8vQ2xhc3MvZVVuc2V0Lm92ZXJyaWRlLmphdmFqZXRpbmMlPgotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgIWdlbk1vZGVsLmlzUmVmbGVjdGl2ZURlbGVnYXRpb24oKSAmJiBnZW5DbGFzcy5pbXBsZW1lbnRzQW55KGdlbkNsYXNzLmdldEVJc1NldEdlbkZlYXR1cmVzKCkpKSB7JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2VJc1NldC5vdmVycmlkZS5qYXZhamV0aW5jIiBmYWlsPSJhbHRlcm5hdGl2ZSIgJT4KLTwlQCBzdGFydCAlPgotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4KLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0RUlzU2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSAmJiAhZ2VuRmVhdHVyZS5pc1dyYXBwZWRGZWF0dXJlTWFwVHlwZSgpICYmICFnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpICYmIGdlbkZlYXR1cmUuaXNGaWVsZCgpICYmIGdlbkNsYXNzLmdldEltcGxlbWVudGluZ0dlbk1vZGVsKGdlbkZlYXR1cmUpLmlzVmlydHVhbERlbGVnYXRpb24oKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICA8JWJyZWFrOyB9JT4KLSAgICA8JX0lPgotICA8JX0lPgotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0vL1VNQS0tPgotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUiKSU+IGZlYXR1cmUgPSBnZXRGZWF0dXJlV2l0aE92ZXJyaWRlbkRlZmF1bHRWYWx1ZShmZWF0dXJlSUQpOwotCQlpZihmZWF0dXJlICE9IG51bGwpIHsKLQkJCXJldHVybiBpc0ZlYXR1cmVXaXRoT3ZlcnJpZGVuRGVmYXVsdFZhbHVlU2V0KGZlYXR1cmUpOwotCQl9Ci0vL1VNQTwtLQkJCi0JCXN3aXRjaCAoZmVhdHVyZUlEPCU9bmVnYXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pCi0JCXsKLTwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRFSXNTZXRHZW5GZWF0dXJlcygpKSB7JT4KLQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46Ci0gIDwlaWYgKGdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpKSB7JT4KLSAgICA8JWlmIChnZW5GZWF0dXJlLmlzV3JhcHBlZEZlYXR1cmVNYXBUeXBlKCkpIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc1ZvbGF0aWxlKCkpIHslPgotCQkJCXJldHVybiAhKCg8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAiKSU+LkludGVybmFsLldyYXBwZXIpPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSkuZmVhdHVyZU1hcCgpLmlzRW1wdHkoKTsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5mZWF0dXJlTWFwKCkuaXNFbXB0eSgpOwotICAgICAgPCV9JT4KLSAgICA8JX0gZWxzZSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsICYmICE8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPi5pc0VtcHR5KCk7Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KTsKLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCAmJiAhPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4uaXNFbXB0eSgpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gITwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkuaXNFbXB0eSgpOwotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0gZWxzZSBpZiAoZ2VuRmVhdHVyZS5pc1Vuc2V0dGFibGUoKSkgeyU+Ci0JCQkJcmV0dXJuIGlzU2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCk7Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUmVzb2x2ZVByb3hpZXMoKSkgeyU+Ci0gICAgPCVpZiAoZ2VuQ2xhc3MuaXNGaWVsZChnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+ICE9IG51bGw7Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+KSAhPSBudWxsOwotICAgICAgPCV9IGVsc2UgeyU+Ci0JCQkJcmV0dXJuIGJhc2ljR2V0PCU9Z2VuRmVhdHVyZS5nZXRBY2Nlc3Nvck5hbWUoKSU+KCkgIT0gbnVsbDsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2UgaWYgKCFnZW5GZWF0dXJlLmhhc0VEZWZhdWx0KCkpIHslPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQlyZXR1cm4gZVZpcnR1YWxHZXQoPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPikgIT0gbnVsbDsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEdldEFjY2Vzc29yKCklPigpICE9IG51bGw7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSBlbHNlIGlmIChnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpIHx8IGdlbkZlYXR1cmUuaXNFbnVtVHlwZSgpKSB7JT4KLSAgICA8JWlmIChnZW5DbGFzcy5pc0ZpZWxkKGdlbkZlYXR1cmUpKSB7JT4KLSAgICAgIDwlaWYgKGdlbkNsYXNzLmlzRmxhZyhnZW5GZWF0dXJlKSkgeyU+Ci0JCQkJcmV0dXJuICgoPCU9Z2VuQ2xhc3MuZ2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VGTEFHKSAhPSAwKSAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSBlbHNlIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9IGVsc2UgeyU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzRW51bVR5cGUoKSAmJiBnZW5GZWF0dXJlLmlzRmllbGQoKSAmJiBnZW5DbGFzcy5nZXRJbXBsZW1lbnRpbmdHZW5Nb2RlbChnZW5GZWF0dXJlKS5pc1ZpcnR1YWxEZWxlZ2F0aW9uKCkpIHslPgotCQkJCXJldHVybiBlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPikgIT0gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT47Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSAhPSA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPjsKLSAgICAgIDwlfSU+Ci0gICAgPCV9JT4KLSAgPCV9IGVsc2Ugey8vZGF0YXR5cGUlPgotICAgIDwlaWYgKGdlbkNsYXNzLmlzRmllbGQoZ2VuRmVhdHVyZSkpIHslPgotCQkJCXJldHVybiA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPiA9PSBudWxsID8gPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4gIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRTYWZlTmFtZSgpJT4pOwotICAgIDwlfSBlbHNlIHslPgotICAgICAgPCVpZiAoZ2VuRmVhdHVyZS5pc0ZpZWxkKCkgJiYgZ2VuQ2xhc3MuZ2V0SW1wbGVtZW50aW5nR2VuTW9kZWwoZ2VuRmVhdHVyZSkuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7JT4KLQkJCQk8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPiA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiA9ICg8JT1nZW5GZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPillVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+LCA8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPik7Ci0JCQkJcmV0dXJuIDwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+ID09IG51bGwgPyA8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPiAhPSBudWxsIDogITwlPWdlbkZlYXR1cmUuZ2V0RURlZmF1bHQoKSU+LmVxdWFscyg8JT1nZW5GZWF0dXJlLmdldFNhZmVOYW1lKCklPik7Ci0gICAgICA8JX0gZWxzZSB7JT4KLQkJCQlyZXR1cm4gPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT4gPT0gbnVsbCA/IDwlPWdlbkZlYXR1cmUuZ2V0R2V0QWNjZXNzb3IoKSU+KCkgIT0gbnVsbCA6ICE8JT1nZW5GZWF0dXJlLmdldEVEZWZhdWx0KCklPi5lcXVhbHMoPCU9Z2VuRmVhdHVyZS5nZXRHZXRBY2Nlc3NvcigpJT4oKSk7Ci0gICAgICA8JX0lPgotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotCQl9Ci08JWlmIChnZW5Nb2RlbC5pc01pbmltYWxSZWZsZWN0aXZlTWV0aG9kcygpKSB7JT4KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGZlYXR1cmVJRCk7Ci08JX0lPgotCX0KLQotPCVAIGVuZCAlPjwlLy9DbGFzcy9lSXNTZXQub3ZlcnJpZGUuamF2YWpldGluYyU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAoIWdlbkNsYXNzLmdldE1peGluR2VuRmVhdHVyZXMoKS5pc0VtcHR5KCkgfHwgZ2VuQ2xhc3MuaGFzT2Zmc2V0Q29ycmVjdGlvbigpICYmICFnZW5DbGFzcy5nZXRHZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkpIHslPgotICA8JWlmICghZ2VuQ2xhc3MuZ2V0TWl4aW5HZW5GZWF0dXJlcygpLmlzRW1wdHkoKSkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gICAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gICAgPCV9JT4KLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8JT1zaW5nbGVXaWxkY2FyZCU+IGJhc2VDbGFzcykKLQl7Ci0gICAgPCVmb3IgKEdlbkNsYXNzIG1peGluR2VuQ2xhc3MgOiBnZW5DbGFzcy5nZXRNaXhpbkdlbkNsYXNzZXMoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9bWl4aW5HZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJCXsKLSAgICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBtaXhpbkdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkpIHslPgotCQkJCWNhc2UgPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT46IHJldHVybiA8JT1taXhpbkdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OwotICAgICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgICA8JX0lPgotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotICA8JX0lPgotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczwlPXNpbmdsZVdpbGRjYXJkJT4gYmFzZUNsYXNzKQotCXsKLSAgPCVmb3IgKEdlbkNsYXNzIG1peGluR2VuQ2xhc3MgOiBnZW5DbGFzcy5nZXRNaXhpbkdlbkNsYXNzZXMoKSkgeyU+Ci0JCWlmIChiYXNlQ2xhc3MgPT0gPCU9bWl4aW5HZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0gICAgPCVmb3IgKEdlbkZlYXR1cmUgZ2VuRmVhdHVyZSA6IG1peGluR2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQkJY2FzZSA8JT1taXhpbkdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+OiByZXR1cm4gPCU9Z2VuQ2xhc3MuZ2V0UXVhbGlmaWVkRmVhdHVyZUlEKGdlbkZlYXR1cmUpJT48JT1wb3NpdGl2ZU9mZnNldENvcnJlY3Rpb24lPjsKLSAgICA8JX0lPgotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotICA8JX0lPgotICA8JWlmIChnZW5DbGFzcy5oYXNPZmZzZXRDb3JyZWN0aW9uKCkgJiYgIWdlbkNsYXNzLmdldEdlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkJaWYgKGJhc2VDbGFzcyA9PSA8JT1nZW5DbGFzcy5nZXRJbXBvcnRlZEludGVyZmFjZU5hbWUoKSU+LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQ8JT1uZWdhdGl2ZU9mZnNldENvcnJlY3Rpb24lPikKLQkJCXsKLSAgICA8JWZvciAoR2VuRmVhdHVyZSBnZW5GZWF0dXJlIDogZ2VuQ2xhc3MuZ2V0R2VuRmVhdHVyZXMoKSkgeyU+Ci0JCQkJY2FzZSA8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjogcmV0dXJuIDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT47Ci0gICAgPCV9JT4KLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLSAgPCV9JT4KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotPCV9JT4KLTwlaWYgKGlzSW1wbGVtZW50YXRpb24gJiYgZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpKSB7IFN0cmluZyBlVmlydHVhbFZhbHVlc0ZpZWxkID0gZ2VuQ2xhc3MuZ2V0RVZpcnR1YWxWYWx1ZXNGaWVsZCgpOyU+Ci0gIDwlaWYgKGVWaXJ0dWFsVmFsdWVzRmllbGQgIT0gbnVsbCkgeyU+Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCBPYmplY3RbXSBlVmlydHVhbFZhbHVlcygpCi0JewotCQlyZXR1cm4gPCU9ZVZpcnR1YWxWYWx1ZXNGaWVsZCU+OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotICA8JWlmIChnZW5Nb2RlbC51c2VDbGFzc092ZXJyaWRlQW5ub3RhdGlvbigpKSB7JT4KLQlAT3ZlcnJpZGUKLSAgPCV9JT4KLQlwcm90ZWN0ZWQgdm9pZCBlU2V0VmlydHVhbFZhbHVlcyhPYmplY3RbXSBuZXdWYWx1ZXMpCi0JewotCQk8JT1lVmlydHVhbFZhbHVlc0ZpZWxkJT4gPSBuZXdWYWx1ZXM7Ci0JfQotCi0gIDwlfSU+Ci0gIDwleyBMaXN0PFN0cmluZz4gZVZpcnR1YWxJbmRleEJpdEZpZWxkcyA9IGdlbkNsYXNzLmdldEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOyU+Ci0gICAgPCVpZiAoIWVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuaXNFbXB0eSgpKSB7IExpc3Q8U3RyaW5nPiBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzID0gZ2VuQ2xhc3MuZ2V0QWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHJvdGVjdGVkIGludCBlVmlydHVhbEluZGV4Qml0cyhpbnQgb2Zmc2V0KQotCXsKLQkJc3dpdGNoIChvZmZzZXQpCi0JCXsKLSAgICAgIDwlZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxFVmlydHVhbEluZGV4Qml0RmllbGRzLnNpemUoKTsgaSsrKSB7JT4KLQkJCWNhc2UgPCU9aSU+IDoKLQkJCQlyZXR1cm4gPCU9YWxsRVZpcnR1YWxJbmRleEJpdEZpZWxkcy5nZXQoaSklPjsKLSAgICAgIDwlfSU+Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0gIDwlaWYgKGdlbk1vZGVsLnVzZUNsYXNzT3ZlcnJpZGVBbm5vdGF0aW9uKCkpIHslPgotCUBPdmVycmlkZQotICA8JX0lPgotCXByb3RlY3RlZCB2b2lkIGVTZXRWaXJ0dWFsSW5kZXhCaXRzKGludCBvZmZzZXQsIGludCBuZXdJbmRleEJpdHMpCi0JewotCQlzd2l0Y2ggKG9mZnNldCkKLQkJewotICAgICAgPCVmb3IgKGludCBpID0gMDsgaSA8IGFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuc2l6ZSgpOyBpKyspIHslPgotCQkJY2FzZSA8JT1pJT4gOgotCQkJCTwlPWFsbEVWaXJ0dWFsSW5kZXhCaXRGaWVsZHMuZ2V0KGkpJT4gPSBuZXdJbmRleEJpdHM7Ci0JCQkJYnJlYWs7Ci0gICAgICA8JX0lPgotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotICAgIDwlfSU+Ci0gIDwlfSU+Ci08JX0lPgotPCVpZiAoaXNJbXBsZW1lbnRhdGlvbiAmJiAhZ2VuTW9kZWwuaXNSZWZsZWN0aXZlRGVsZWdhdGlvbigpICYmICFnZW5DbGFzcy5nZXRUb1N0cmluZ0dlbkZlYXR1cmVzKCkuaXNFbXB0eSgpKSB7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlQ2xhc3NPdmVycmlkZUFubm90YXRpb24oKSkgeyU+Ci0JQE92ZXJyaWRlCi0gIDwlfSU+Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0gIDwleyBib29sZWFuIGZpcnN0ID0gdHJ1ZTslPgotICAgIDwlZm9yIChHZW5GZWF0dXJlIGdlbkZlYXR1cmUgOiBnZW5DbGFzcy5nZXRUb1N0cmluZ0dlbkZlYXR1cmVzKCkpIHslPgotICAgICAgPCVpZiAoZmlyc3QpIHsgZmlyc3QgPSBmYWxzZTslPgotCQlyZXN1bHQuYXBwZW5kKCIgKDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSBlbHNlIHslPgotCQlyZXN1bHQuYXBwZW5kKCIsIDwlPWdlbkZlYXR1cmUuZ2V0TmFtZSgpJT46ICIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgIDwlfSU+Ci0gICAgICA8JWlmIChnZW5GZWF0dXJlLmlzVW5zZXR0YWJsZSgpICYmICFnZW5GZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0gICAgICAgIDwlaWYgKGdlbk1vZGVsLmlzVmlydHVhbERlbGVnYXRpb24oKSAmJiAhZ2VuRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCWlmIChlVmlydHVhbElzU2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pKSByZXN1bHQuYXBwZW5kKGVWaXJ0dWFsR2V0KDwlPWdlbkNsYXNzLmdldFF1YWxpZmllZEZlYXR1cmVJRChnZW5GZWF0dXJlKSU+PCU9cG9zaXRpdmVPZmZzZXRDb3JyZWN0aW9uJT4pKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlpZiAoPCVpZiAoZ2VuQ2xhc3MuaXNFU2V0RmxhZyhnZW5GZWF0dXJlKSkgeyU+KDwlPWdlbkNsYXNzLmdldEVTZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRVNFVEZMQUcpICE9IDA8JX0gZWxzZSB7JT48JT1nZW5GZWF0dXJlLmdldFVuY2FwTmFtZSgpJT5FU2V0PCV9JT4pIHJlc3VsdC5hcHBlbmQoKDwlPWdlbkNsYXNzLmdldEZsYWdzRmllbGQoZ2VuRmVhdHVyZSklPiAmIDwlPWdlbkZlYXR1cmUuZ2V0VXBwZXJOYW1lKCklPl9FRkxBRykgIT0gMCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOzwlPWdlbk1vZGVsLmdldE5vbk5MUygpJT4KLSAgICAgICAgICA8JX0gZWxzZSB7JT4KLQkJaWYgKDwlaWYgKGdlbkNsYXNzLmlzRVNldEZsYWcoZ2VuRmVhdHVyZSkpIHslPig8JT1nZW5DbGFzcy5nZXRFU2V0RmxhZ3NGaWVsZChnZW5GZWF0dXJlKSU+ICYgPCU9Z2VuRmVhdHVyZS5nZXRVcHBlck5hbWUoKSU+X0VTRVRGTEFHKSAhPSAwPCV9IGVsc2UgeyU+PCU9Z2VuRmVhdHVyZS5nZXRVbmNhcE5hbWUoKSU+RVNldDwlfSU+KSByZXN1bHQuYXBwZW5kKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7PCU9Z2VuTW9kZWwuZ2V0Tm9uTkxTKCklPgotICAgICAgICAgIDwlfSU+Ci0gICAgICAgIDwlfSU+Ci0gICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgPCVpZiAoZ2VuTW9kZWwuaXNWaXJ0dWFsRGVsZWdhdGlvbigpICYmICFnZW5GZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJcmVzdWx0LmFwcGVuZChlVmlydHVhbEdldCg8JT1nZW5DbGFzcy5nZXRRdWFsaWZpZWRGZWF0dXJlSUQoZ2VuRmVhdHVyZSklPjwlPXBvc2l0aXZlT2Zmc2V0Q29ycmVjdGlvbiU+PCVpZiAoIWdlbkZlYXR1cmUuaXNMaXN0VHlwZSgpICYmICFnZW5GZWF0dXJlLmlzUmVmZXJlbmNlVHlwZSgpKXslPiwgPCU9Z2VuRmVhdHVyZS5nZXRFRGVmYXVsdCgpJT48JX0lPikpOwotICAgICAgICA8JX0gZWxzZSB7JT4KLSAgICAgICAgICA8JWlmIChnZW5DbGFzcy5pc0ZsYWcoZ2VuRmVhdHVyZSkpIHslPgotCQlyZXN1bHQuYXBwZW5kKCg8JT1nZW5DbGFzcy5nZXRGbGFnc0ZpZWxkKGdlbkZlYXR1cmUpJT4gJiA8JT1nZW5GZWF0dXJlLmdldFVwcGVyTmFtZSgpJT5fRUZMQUcpICE9IDApOwotICAgICAgICAgIDwlfSBlbHNlIHslPgotCQlyZXN1bHQuYXBwZW5kKDwlPWdlbkZlYXR1cmUuZ2V0U2FmZU5hbWUoKSU+KTsKLSAgICAgICAgICA8JX0lPgotICAgICAgICA8JX0lPgotICAgICAgPCV9JT4KLSAgICA8JX0lPgotICA8JX0lPgotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLTwlfSU+Ci08JWlmIChpc0ltcGxlbWVudGF0aW9uICYmIGdlbkNsYXNzLmlzTWFwRW50cnkoKSkgeyBHZW5GZWF0dXJlIGtleUZlYXR1cmUgPSBnZW5DbGFzcy5nZXRNYXBFbnRyeUtleUZlYXR1cmUoKTsgR2VuRmVhdHVyZSB2YWx1ZUZlYXR1cmUgPSBnZW5DbGFzcy5nZXRNYXBFbnRyeVZhbHVlRmVhdHVyZSgpOyU+Ci08JVN0cmluZyBvYmplY3RUeXBlID0gZ2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLmxhbmcuT2JqZWN0Iik7JT4KLTwlU3RyaW5nIGtleVR5cGUgPSBnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8ga2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSA6IG9iamVjdFR5cGU7JT4KLTwlU3RyaW5nIHZhbHVlVHlwZSA9IGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTAgPyB2YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcykgOiBvYmplY3RUeXBlOyU+Ci08JVN0cmluZyBlTWFwVHlwZSA9IGdlbk1vZGVsLmdldEltcG9ydGVkTmFtZSgib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVNYXAiKSArIChnZW5Nb2RlbC5nZXRDb21wbGlhbmNlTGV2ZWwoKS5nZXRWYWx1ZSgpID49IEdlbkpES0xldmVsLkpESzUwID8gIjwiICsga2V5VHlwZSArICIsICIgKyB2YWx1ZVR5cGUgKyAiPiIgOiAiIik7JT4KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGhhc2ggPSAtMTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SGFzaCgpCi0JewotCQlpZiAoaGFzaCA9PSAtMSkKLQkJewotCQkJPCU9b2JqZWN0VHlwZSU+IHRoZUtleSA9IGdldEtleSgpOwotCQkJaGFzaCA9ICh0aGVLZXkgPT0gbnVsbCA/IDAgOiB0aGVLZXkuaGFzaENvZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaChpbnQgaGFzaCkKLQl7Ci0JCXRoaXMuaGFzaCA9IGhhc2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPWtleVR5cGUlPiBnZXRLZXkoKQotCXsKLSAgPCVpZiAoa2V5RmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9a2V5RmVhdHVyZS5nZXRPYmplY3RUeXBlKGdlbkNsYXNzKSU+KGdldFR5cGVkS2V5KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJcmV0dXJuIGdldFR5cGVkS2V5KCk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KDwlPWtleVR5cGUlPiBrZXkpCi0JewotICA8JWlmIChrZXlGZWF0dXJlLmlzTGlzdFR5cGUoKSkgeyU+Ci0JCWdldFR5cGVkS2V5KCkuYWRkQWxsKDwlaWYgKCFnZW5Nb2RlbC51c2VHZW5lcmljcygpKSB7JT4oPCU9Z2VuTW9kZWwuZ2V0SW1wb3J0ZWROYW1lKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpJT4pPCV9JT5rZXkpOwotICA8JX0gZWxzZSBpZiAoZ2VuTW9kZWwuZ2V0Q29tcGxpYW5jZUxldmVsKCkuZ2V0VmFsdWUoKSA+PSBHZW5KREtMZXZlbC5KREs1MCkgeyU+Ci0JCXNldFR5cGVkS2V5KGtleSk7Ci0gIDwlfSBlbHNlIGlmIChrZXlGZWF0dXJlLmlzUHJpbWl0aXZlVHlwZSgpKSB7JT4KLQkJc2V0VHlwZWRLZXkoKCg8JT1rZXlGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4pa2V5KS48JT1rZXlGZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJc2V0VHlwZWRLZXkoKDwlPWtleUZlYXR1cmUuZ2V0SW1wb3J0ZWRUeXBlKGdlbkNsYXNzKSU+KWtleSk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPXZhbHVlVHlwZSU+IGdldFZhbHVlKCkKLQl7Ci0gIDwlaWYgKHZhbHVlRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXJldHVybiBuZXcgPCU9dmFsdWVGZWF0dXJlLmdldE9iamVjdFR5cGUoZ2VuQ2xhc3MpJT4oZ2V0VHlwZWRWYWx1ZSgpKTsKLSAgPCV9IGVsc2UgeyU+Ci0JCXJldHVybiBnZXRUeXBlZFZhbHVlKCk7Ci0gIDwlfSU+Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIDwlPXZhbHVlVHlwZSU+IHNldFZhbHVlKDwlPXZhbHVlVHlwZSU+IHZhbHVlKQotCXsKLQkJPCU9dmFsdWVUeXBlJT4gb2xkVmFsdWUgPSBnZXRWYWx1ZSgpOwotICA8JWlmICh2YWx1ZUZlYXR1cmUuaXNMaXN0VHlwZSgpKSB7JT4KLQkJZ2V0VHlwZWRWYWx1ZSgpLmNsZWFyKCk7Ci0JCWdldFR5cGVkVmFsdWUoKS5hZGRBbGwoPCVpZiAoIWdlbk1vZGVsLnVzZUdlbmVyaWNzKCkpIHslPig8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoImphdmEudXRpbC5Db2xsZWN0aW9uIiklPik8JX0lPnZhbHVlKTsKLSAgPCV9IGVsc2UgaWYgKGdlbk1vZGVsLmdldENvbXBsaWFuY2VMZXZlbCgpLmdldFZhbHVlKCkgPj0gR2VuSkRLTGV2ZWwuSkRLNTApIHslPgotCQlzZXRUeXBlZFZhbHVlKHZhbHVlKTsKLSAgPCV9IGVsc2UgaWYgKHZhbHVlRmVhdHVyZS5pc1ByaW1pdGl2ZVR5cGUoKSkgeyU+Ci0JCXNldFR5cGVkVmFsdWUoKCg8JT12YWx1ZUZlYXR1cmUuZ2V0T2JqZWN0VHlwZShnZW5DbGFzcyklPil2YWx1ZSkuPCU9dmFsdWVGZWF0dXJlLmdldFByaW1pdGl2ZVZhbHVlRnVuY3Rpb24oKSU+KCkpOwotICA8JX0gZWxzZSB7JT4KLQkJc2V0VHlwZWRWYWx1ZSgoPCU9dmFsdWVGZWF0dXJlLmdldEltcG9ydGVkVHlwZShnZW5DbGFzcyklPil2YWx1ZSk7Ci0gIDwlfSU+Ci0JCXJldHVybiBvbGRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLSAgPCVpZiAoZ2VuTW9kZWwudXNlR2VuZXJpY3MoKSkgeyU+Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIDwlfSU+Ci0JcHVibGljIDwlPWVNYXBUeXBlJT4gZ2V0RU1hcCgpCi0JewotCQk8JT1nZW5Nb2RlbC5nZXRJbXBvcnRlZE5hbWUoIm9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0IiklPiBjb250YWluZXIgPSBlQ29udGFpbmVyKCk7Ci0JCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiAoPCU9ZU1hcFR5cGUlPiljb250YWluZXIuZUdldChlQ29udGFpbm1lbnRGZWF0dXJlKCkpOwotCX0KLQotPCV9JT4KLTwlQCBpbmNsdWRlIGZpbGU9IkNsYXNzL2luc2VydC5qYXZhamV0aW5jIiBmYWlsPSJzaWxlbnQiICU+Ci19IC8vPCU9aXNJbnRlcmZhY2UgPyAiICIgKyBnZW5DbGFzcy5nZXRJbnRlcmZhY2VOYW1lKCkgOiBnZW5DbGFzcy5nZXRDbGFzc05hbWUoKSU+Ci08JS8vIFRPRE8gZml4IHRoZSBzcGFjZSBhYm92ZSU+Ci08JWdlbk1vZGVsLmVtaXRTb3J0ZWRJbXBvcnRzKCk7JT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTllZmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1NWIwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLUNsYXNzUGF0aDogdW1hZWRpdC5qYXIKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYuZWRpdDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLAotIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5kb21haW4sCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luJEltcGxlbWVudGF0aW9uCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODJlMGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLXNvdXJjZS51bWFlZGl0LmphciA9IHNyYy8KLW91dHB1dC51bWFlZGl0LmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHVtYWVkaXQuamFyLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotCi0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX0FydGlmYWN0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX0FydGlmYWN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUFydGlmYWN0X2NvbnRhaW5lZEFydGlmYWN0c19BcnRpZmFjdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUJyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX1BsYW5uaW5nRGF0YS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUJyZWFrZG93bkVsZW1lbnRfcGxhbm5pbmdEYXRhX1BsYW5uaW5nRGF0YS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjllMjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVCcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9QbGFubmluZ0RhdGEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU2VjdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIwNmMyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbl9zZWN0aW9uc19TZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX1N0ZXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OGNkOGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RGVzY3JpcHRpb25fc2VjdGlvbnNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDZiMGZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTEwNTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1JvbGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50RWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9UYXNrRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTQwZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudEVsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUNhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRGlzY2lwbGluZUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX0Rpc2NpcGxpbmVHcm91cGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTNjMWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Eb21haW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Eb21haW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI4OTI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1JvbGVTZXRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0Q2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Sb2xlU2V0R3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfUm9sZVNldEdyb3VwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfVG9vbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5ZTlmMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRDYXRlZ29yaWVzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50Q2F0ZWdvcmllc19Xb3JrUHJvZHVjdFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VjYWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudENhdGVnb3JpZXNfV29ya1Byb2R1Y3RUeXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQXR0YWNobWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BdHRhY2htZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1Njg1Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19BdHRhY2htZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ2hlY2tsaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2NWYyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DaGVja2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfQ29uY2VwdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Db25jZXB0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmODRkYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Db25jZXB0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyYWJsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0Rpc2NpcGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRGlzY2lwbGluZUdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRG9tYWluLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1NTRjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiMzRjNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGluZ01ldHJpYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTWV0cmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxZjgzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTWV0cmljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNb2RlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW5nTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NThkYWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0VzdGltYXRpbmdNb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfRXhhbXBsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19FeGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5NDRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19FeGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0d1aWRlbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19HdWlkZWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX0d1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfSXRlcmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxMWU0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19JdGVyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfS2luZC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19LaW5kLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmNzE1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19LaW5kLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX091dGNvbWUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfT3V0Y29tZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDM1MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfT3V0Y29tZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QaGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19QaGFzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNjBiZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUGhhc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJhY3RpY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjMyNTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmVwb3J0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JlcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZjNlMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmVwb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JldXNhYmxlQXNzZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmV1c2FibGVBc3NldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MmNmZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUmV1c2FibGVBc3NldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2FkbWFwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvYWRtYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTFiYzVkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvYWRtYXAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1JvbGVTZXQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0R3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfUm9sZVNldEdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhM2Y2Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Sb2xlU2V0R3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfU3RlcC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0NzYyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N1cHBvcnRpbmdNYXRlcmlhbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19TdXBwb3J0aW5nTWF0ZXJpYWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWEyMWVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UYXNrLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rhc2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzNiMmI4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rhc2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVjaG5pcXVlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGM1YjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVjaG5pcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZXJtRGVmaW5pdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UZXJtRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWJmZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVGVybURlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Ub29sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1Rvb2xNZW50b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbE1lbnRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWI4NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVG9vbE1lbnRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19UcmFpbmluZ0NsYXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nQ2xhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTMyOTUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nQ2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdNb2R1bGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVHJhaW5pbmdNb2R1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY3MTUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1RyYWluaW5nTW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1VzZXJEZWZpbmVkQ2F0ZWdvcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfVXNlckRlZmluZWRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19XaGl0ZXBhcGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1doaXRlcGFwZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI0ODAwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1doaXRlcGFwZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY1MjMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ29udGVudFBhY2thZ2VfY29udGVudEVsZW1lbnRzX1dvcmtQcm9kdWN0R3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdFR5cGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDb250ZW50UGFja2FnZV9jb250ZW50RWxlbWVudHNfV29ya1Byb2R1Y3RUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlY2FjMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUNvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19Xb3JrUHJvZHVjdFR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19DdXN0b21DYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNDc5ODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVDdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX0N1c3RvbUNhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxOGVjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Db250ZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNmIwZmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZWQyYzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9QcmFjdGljZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Qcm9jZXNzRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGVzY3JpYmFibGVFbGVtZW50X3ByZXNlbnRhdGlvbl9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1FbGVtZW50X3Byb3BlcnR5X1Byb3BlcnR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJhN2I1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfUHJvcGVydHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtTGlua192aWV3cG9ydF9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1MaW5rX3ZpZXdwb3J0X1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3MzRjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1MaW5rX3ZpZXdwb3J0X1BvaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWU5ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpYWdyYW1fbmFtZXNwYWNlX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmMjI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV9uYW1lc3BhY2VfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWYzYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX25hbWVzcGFjZV9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlhZ3JhbV92aWV3cG9pbnRfUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX3ZpZXdwb2ludF9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDU4ZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEaWFncmFtX3ZpZXdwb2ludF9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURpc2NpcGxpbmVfc3ViZGlzY2lwbGluZV9EaXNjaXBsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX0Rpc2NpcGxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjliMzEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRGlzY2lwbGluZV9zdWJkaXNjaXBsaW5lX0Rpc2NpcGxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVEb21haW5fc3ViZG9tYWluX0RvbWFpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5fRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5fRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbnNfRG9tYWluLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRG9tYWluX3N1YmRvbWFpbnNfRG9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyODkyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZURvbWFpbl9zdWJkb21haW5zX0RvbWFpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVsbGlwc2VfY2VudGVyX1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWxsaXBzZV9jZW50ZXJfUG9pbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRlOWFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRWxsaXBzZV9jZW50ZXJfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpbmdDb25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1MTY4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25Db25kZXJhdGlvbnNfRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfZXN0aW1hdGlvbkNvbmRlcmF0aW9uc19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYzg0ZTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uQ29uZGVyYXRpb25zX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25NZXRyaWNfRXN0aW1hdGluZ01ldHJpYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlX2VzdGltYXRpb25NZXRyaWNfRXN0aW1hdGluZ01ldHJpYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZDMwYmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV9lc3RpbWF0aW9uTWV0cmljX0VzdGltYXRpbmdNZXRyaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV91c2VkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVfdXNlZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MWQwYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0ZV91c2VkRXN0aW1hdGluZ1BhcmFtZXRlcl9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVkTWV0aG9kRWxlbWVudF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRlZE1ldGhvZEVsZW1lbnRfZXN0aW1hdGVfRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODQ0YmY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGVkTWV0aG9kRWxlbWVudF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdNb2RlbF9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUVzdGltYXRpbmdNb2RlbF9vd25lZEVzdGltYXRpbmdQYXJhbWV0ZXJfU3VtbWl0RXN0aW1hdGluZ1BhcmFtZXRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlM2I5OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nTW9kZWxfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nUGFyYW1ldGVyT3duZXJfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVFc3RpbWF0aW5nUGFyYW1ldGVyT3duZXJfb3duZWRFc3RpbWF0aW5nUGFyYW1ldGVyX0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDcyMjBiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyX293bmVkRXN0aW1hdGluZ1BhcmFtZXRlcl9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhDb25uZWN0b3JfcG9zaXRpb25fUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaENvbm5lY3Rvcl9wb3NpdGlvbl9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzM2MmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaENvbm5lY3Rvcl9wb3NpdGlvbl9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWRnZV93YXlwb2ludHNfUG9pbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVkZ2Vfd2F5cG9pbnRzX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1NGU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWRnZV93YXlwb2ludHNfUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfYW5jaG9yYWdlX0dyYXBoQ29ubmVjdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2FuY2hvcmFnZV9HcmFwaENvbm5lY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMDM3NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfYW5jaG9yYWdlX0dyYXBoQ29ubmVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmU0MGM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRGlhZ3JhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5Y2Q4NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW1MaW5rLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9EaWFncmFtTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmN2VlNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0RpYWdyYW1MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9FbGxpcHNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9FbGxpcHNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2ZTYyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfRWxsaXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhDb25uZWN0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoQ29ubmVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwMzc2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhDb25uZWN0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoRWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhFZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5MTg4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfR3JhcGhFZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9HcmFwaE5vZGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoTm9kZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNjUyMDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0dyYXBoTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfSW1hZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX0ltYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmOTllNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfSW1hZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1BvbHlsaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qb2x5bGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjE1YzUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1BvbHlsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qcm9wZXJ0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJhN2I1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9Qcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfUmVmZXJlbmNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9SZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzAzNzYxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjA2MDQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9UZXh0RWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVGV4dEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY1MjAzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9UZXh0RWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9jb250YWluZWRfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjI3YjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfY29udGFpbmVkX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfbGlua19EaWFncmFtTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9saW5rX0RpYWdyYW1MaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3ZWU1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9saW5rX0RpYWdyYW1MaW5rLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3Bvc2l0aW9uX1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3Bvc2l0aW9uX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkNDA3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9wb3NpdGlvbl9Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmU0MGM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyMDYwNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoRWxlbWVudF9zZW1hbnRpY01vZGVsX1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2YyN2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlR3JhcGhFbGVtZW50X3NlbWFudGljTW9kZWxfVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoTm9kZV9zaXplX0RpbWVuc2lvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZUdyYXBoTm9kZV9zaXplX0RpbWVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZDkyODkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVHcmFwaE5vZGVfc2l6ZV9EaW1lbnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVLaW5kX2FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjFmYmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVLaW5kX2FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9tZXRob2RFbGVtZW50UHJvcGVydHlfTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9tZXRob2RFbGVtZW50UHJvcGVydHlfTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIyYzNlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZEVsZW1lbnRfb3duZWRSdWxlc19Db25zdHJhaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2QzMmY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX0NvbnN0cmFpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X21ldGhvZE1vZGVsc19NZXRob2RNb2RlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kTW9kZWxzX01ldGhvZE1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI4MmMzOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kTW9kZWxzX01ldGhvZE1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX01ldGhvZFBsdWdpbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19NZXRob2RQbHVnaW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjgyYzM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9tZXRob2RQbHVnaW5zX01ldGhvZFBsdWdpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19NZXRob2RDb25maWd1cmF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4OTYwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZExpYnJhcnlfcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zX01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19Qcm9jZXNzRmFtaWx5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfUHJvY2Vzc0ZhbWlseS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NjdkNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RMaWJyYXJ5X3ByZWRlZmluZWRDb25maWd1cmF0aW9uc19Qcm9jZXNzRmFtaWx5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kTW9kZWxfbWV0aG9kUGFja2FnZXNfQ29udGVudFBhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RNb2RlbF9tZXRob2RQYWNrYWdlc19Qcm9jZXNzUGFja2FnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkOGMyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZE1vZGVsX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBhY2thZ2VfY2hpbGRQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQYWNrYWdlX2NoaWxkUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Db250ZW50UGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZU1ldGhvZFBsdWdpbl9tZXRob2RQYWNrYWdlc19Qcm9jZXNzQ29tcG9uZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWFjNTlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NDb21wb25lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVNZXRob2RQbHVnaW5fbWV0aG9kUGFja2FnZXNfUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX1Byb2Nlc3NQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9seWxpbmVfd2F5cG9pbnRzX1BvaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUG9seWxpbmVfd2F5cG9pbnRzX1BvaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3MDNkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVBvbHlsaW5lX3dheXBvaW50c19Qb2ludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByYWN0aWNlX3N1YlByYWN0aWNlX1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VfUHJhY3RpY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZXNfUHJhY3RpY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcmFjdGljZV9zdWJQcmFjdGljZXNfUHJhY3RpY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJhY3RpY2Vfc3ViUHJhY3RpY2VzX1ByYWN0aWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9pbnRlcmZhY2VJT19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTgyMjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnNfVGFza0Rlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWZmYmIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NDb21wb25lbnRfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWMxYTA4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0NvbXBvbmVudF9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjBkZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQWN0aXZpdHlEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDFkMjE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0FydGlmYWN0RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0NvbnRlbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjIzNDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fQ29udGVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9HdWlkYW5jZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjA5Y2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUHJhY3RpY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fUm9sZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlODg5Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NFbGVtZW50X3ByZXNlbnRhdGlvbl9Sb2xlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1Rhc2tEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fVGFza0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc0VsZW1lbnRfcHJlc2VudGF0aW9uX1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzRWxlbWVudF9wcmVzZW50YXRpb25fV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX09CU19PQlMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9PQlNfT0JTLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlOGE2MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX09CU19PQlMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9QQlNfUEJTLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfUEJTX1BCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2FiNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9QQlNfUEJTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV0JTX1dCUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dCU19XQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTJjYzUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfV0JTX1dCUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dvcmtPcmRlcl9Xb3JrT3JkZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9Xb3JrT3JkZXJfV29ya09yZGVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmYWMzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX1dvcmtPcmRlcl9Xb3JrT3JkZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19BY3Rpdml0eS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmZiYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19EZWxpdmVyeVByb2Nlc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19JdGVyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfSXRlcmF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19NaWxlc3RvbmVzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX01pbGVzdG9uZXMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19QaGFzZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1BoYXNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2MGJkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOWI3OGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Jlc291cmNlRGVmaW5pdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1Jlc291cmNlRGVmaW5pdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTg2ZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19SZXNvdXJjZURlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19Sb2xlRGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGUyNmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9icmVha2Rvd25FbGVtZW50c19UZWFtUHJvZmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1RlYW1Qcm9maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfYnJlYWtkb3duRWxlbWVudHNfV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxODIyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2JyZWFrZG93bkVsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX0RpYWdyYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9kaWFncmFtc19EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkODU1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX2RpYWdyYW1zX0RpYWdyYW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQWN0aXZpdHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfQWN0aXZpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0FjdGl2aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Db21wb3NpdGVSb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NvbXBvc2l0ZVJvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjAyOTE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0NvbXBvc2l0ZVJvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0l0ZXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19NaWxlc3RvbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfTWlsZXN0b25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2MTVlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19NaWxlc3RvbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BsYW5uaW5nRGF0YS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19QbGFubmluZ0RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNlMjYwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1BsYW5uaW5nRGF0YS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Byb2Nlc3NDb250cmlidXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1ZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzFhMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfUm9sZURlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjhjN2I4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1JvbGVEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1Rhc2tEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTI2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UYXNrRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UZWFtUHJvZmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfVGVhbVByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya09yZGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtPcmRlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNDFmM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfV29ya09yZGVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NFbGVtZW50c19Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc0VsZW1lbnRzX1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfQ2FwYWJpbGl0eVBhdHRlcm4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDM2Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfRGVsaXZlcnlQcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIwOTVkOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc0NvbnRyaWJ1dGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW4uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkYTU1ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVByb2Nlc3NQYWNrYWdlX3Byb2Nlc3NfUHJvY2Vzc1BsYW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUHJvY2Vzc1BhY2thZ2VfcHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmOWI3OGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVQcm9jZXNzUGFja2FnZV9wcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1RyYW5zaXRpb25fVHJhbnNpdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9UcmFuc2l0aW9uX1RyYW5zaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDMxYzU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1RyYW5zaXRpb25fVHJhbnNpdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfUHNldWRvU3RhdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1BzZXVkb1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM2OGU2YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVJlZ2lvbl9WZXJ0ZXhfUHNldWRvU3RhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1N0YXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjUwNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1N0YXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlUmVnaW9uX1ZlcnRleF9WZXJ0ZXguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1ZlcnRleC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYTM3NmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVSZWdpb25fVmVydGV4X1ZlcnRleC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU2VjdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVNlY3Rpb25fc3ViU2VjdGlvbnNfU2VjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4M2NlOTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1NlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1N0ZXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTZWN0aW9uX3N1YlNlY3Rpb25zX1N0ZXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdlZmM0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU2VjdGlvbl9zdWJTZWN0aW9uc19TdGVwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlU3RhdGVNYWNoaW5lX1JlZ2lvbl9SZWdpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZU1hY2hpbmVfUmVnaW9uX1JlZ2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YWI3ZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZU1hY2hpbmVfUmVnaW9uX1JlZ2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlX1JlZ2lvbl9SZWdpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVTdGF0ZV9SZWdpb25fUmVnaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3NmRiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVN0YXRlX1JlZ2lvbl9SZWdpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX2VzdGltYXRlX0VzdGltYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NDRiZjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUYXNrX2VzdGltYXRlX0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19zdGVwc19TdGVwLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlVGFza19zdGVwc19TdGVwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhNDlkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRhc2tfc3RlcHNfU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRlYW1Qcm9maWxlX3N1YlRlYW1fVGVhbVByb2ZpbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUZWFtUHJvZmlsZV9zdWJUZWFtX1RlYW1Qcm9maWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OWZlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRlYW1Qcm9maWxlX3N1YlRlYW1fVGVhbVByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVUcmFpbmluZ0NsYXNzX3RyYWluaW5nTW9kdWxlc19UcmFpbmluZ01vZHVsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRyYWluaW5nQ2xhc3NfdHJhaW5pbmdNb2R1bGVzX1RyYWluaW5nTW9kdWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmNWVmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVRyYWluaW5nQ2xhc3NfdHJhaW5pbmdNb2R1bGVzX1RyYWluaW5nTW9kdWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9Db25zdHJhaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcG9zdGNvbmRpdGlvbl9Db25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NDRkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fQ29uc3RyYWludC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtEZWZpbml0aW9uX3ByZWNvbmRpdGlvbl9Db25zdHJhaW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk0NGQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL2N0b29sMTYvQ3JlYXRlV29ya0RlZmluaXRpb25fcHJlY29uZGl0aW9uX0NvbnN0cmFpbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvY3Rvb2wxNi9DcmVhdGVXb3JrUHJvZHVjdF9lc3RpbWF0ZV9Fc3RpbWF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc2ZWIxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9jdG9vbDE2L0NyZWF0ZVdvcmtQcm9kdWN0X2VzdGltYXRlX0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YyMGRlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BY3Rpdml0eURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjIwZGViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWdncmVnYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FnZ3JlZ2F0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZGM1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQWdncmVnYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwYWVkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMWQyMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZDIxOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9BcnRpZmFjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0F0dGFjaG1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXR0YWNobWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YThhZjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQXR0YWNobWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRhYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWY4NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NhcGFiaWxpdHlQYXR0ZXJuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVmZmJiMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3QuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2hlY2tsaXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmNmQ4Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DaGVja2xpc3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ2xhc3NpZmllci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DbGFzc2lmaWVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE3ZGM3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DbGFzc2lmaWVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29tcG9zaXRlUm9sZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25jZXB0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY4NGRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbmNlcHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29uc3RyYWludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25zdHJhaW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3NDE0ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db25zdHJhaW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50Q2F0ZWdvcnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTczMWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRDYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUyMjQ2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50RGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29udGVudEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTE1NTkxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMzExZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db250ZW50UGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Db3JlRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzcwYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTdkYzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0N1c3RvbUNhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMTA1NjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExMDU2My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjQwMzYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RlbGl2ZXJ5UHJvY2Vzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNDAzNjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpYmFibGVFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaWJhYmxlRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YWY4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpYmFibGVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2OTI1Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhOGFmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1FbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpYWdyYW1FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU3MzFmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtTGluay5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaWFncmFtTGluay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NzNhNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlhZ3JhbUxpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGltZW5zaW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RpbWVuc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZDNiNzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGltZW5zaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Rpc2NpcGxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmQ0NzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1M2MxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9EaXNjaXBsaW5lR3JvdXBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWluLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0RvbWFpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjg5MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRG9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MDQxZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FbGxpcHNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsbGlwc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY4ODFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VsbGlwc2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJkMjFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRlZE1ldGhvZEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGVkTWV0aG9kRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YWY4YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGVkTWV0aG9kRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ0NvbnNpZGVyYXRpb25zLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjODRlNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nQ29uc2lkZXJhdGlvbnMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ01ldHJpYy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0MDk3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTWV0cmljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNb2RlbC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nTW9kZWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWYyODA0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdNb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM5NTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpbmdQYXJhbWV0ZXJPd25lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTU1OTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRXN0aW1hdGluZ1BhcmFtZXRlck93bmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM4NGU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9FeGFtcGxlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjk0NGZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0V4YW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRnVsZmlsbGFibGVFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWY4NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvRnVsZmlsbGFibGVFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoQ29ubmVjdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoQ29ubmVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5ZWJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaENvbm5lY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVkZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5YmM3NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaEVkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGZiOGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3JhcGhFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoTm9kZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaE5vZGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ1NTFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoTm9kZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HcmFwaGljUHJpbWl0aXZlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoaWNQcmltaXRpdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQyMjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0dyYXBoaWNQcmltaXRpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY0NGY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0d1aWRhbmNlRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZjQ0ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkZWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvR3VpZGVsaW5lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNDRmNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9HdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSW1hZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvSW1hZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2YzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0ltYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9JdGVyYXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzExZTQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0l0ZXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9LaW5kLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0tpbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjU2YzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0tpbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGVhZkVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTGVhZkVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY4ODFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L0xlYWZFbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZENvbmZpZ3VyYXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODk2MDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZiMzBlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTRmZTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZExpYnJhcnkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTMxMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kTGlicmFyeS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQYWNrYWdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEzMTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODJjMzkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWV0aG9kUGx1Z2luLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFBsdWdpbl9ncmV5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2M2FkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RQbHVnaW5fZ3JleS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9NZXRob2RVbml0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFVuaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTliYzc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01ldGhvZFVuaXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L01pbGVzdG9uZXMuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjE1ZWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTWlsZXN0b25lcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lZEVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZWRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhZjhhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9OYW1lZEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZXNwYWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L05hbWVzcGFjZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ODM2NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvTmFtZXNwYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L09CUy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PQlMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmI4MmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L09CUy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9PdXRjb21lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzAzNTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L091dGNvbWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUEJTLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ODM2NGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUEJTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMGFlZGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlYWJsZUVsZW1lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGFja2FnZWFibGVFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA2ODgxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QYWNrYWdlYWJsZUVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUGhhc2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDYwYmQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BoYXNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nRGF0YS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QbGFubmluZ0RhdGEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGM5NTNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BsYW5uaW5nRGF0YS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2ludC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qb2ludC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNTAwZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9pbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9seWxpbmUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUG9seWxpbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzJhYWFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BvbHlsaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDljYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9QcmFjdGljZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzIwOWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ByYWN0aWNlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzcy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnQuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250ZXh0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzQ29udHJpYnV0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NDb250cmlidXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYWM1OWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYzU5Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzRmFtaWx5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjY5MjU2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQ4YzJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQYWNrYWdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFuLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb2Nlc3NQbGFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmOGFmYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNmUzYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvcGVydHkuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUHJvcGVydHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzZlM2IyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Byb3BlcnR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BzZXVkb1N0YXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1BzZXVkb1N0YXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmYjMwZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Qc2V1ZG9TdGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWZlcmVuY2UuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5ZWJiZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVnaW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlZ2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNjU5NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVnaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXBvcnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJjODVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JlcG9ydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmVzb3VyY2VEZWZpbml0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiMzUxZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXNvdXJjZURlZmluaXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUmV1c2FibGVBc3NldC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyY2ZmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9SZXVzYWJsZUFzc2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvYWRtYXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWJjNWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9hZG1hcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmU4ODk2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTg4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZURlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVEZXNjcmlwdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4YzdiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk5ZmVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldENhdGVnb3J5LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRDYXRlZ29yeS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YTNmNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvUm9sZVNldENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRHcm91cGluZy5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Sb2xlU2V0R3JvdXBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGEzZjY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1JvbGVTZXRHcm91cGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZWN0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzllYmJmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU2VtYW50aWNNb2RlbEJyaWRnZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZW1hbnRpY01vZGVsQnJpZGdlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4NTRlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TZW1hbnRpY01vZGVsQnJpZGdlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxNzU1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTc1NWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGVNYWNoaW5lLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0YXRlTWFjaGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGFhYjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RhdGVNYWNoaW5lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N0ZXAuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RlcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWY4NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3RlcC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9TdW1taXRFc3RpbWF0aW5nUGFyYW1ldGVyLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTczMWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1bW1pdEVzdGltYXRpbmdQYXJhbWV0ZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1N1cHBvcnRpbmdNYXRlcmlhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTIxZWMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvU3VwcG9ydGluZ01hdGVyaWFsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2suZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2IyYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFzay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYjJiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UYXNrRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRlMjZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rhc2tEZXNjcmlwdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlYW0uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtUHJvZmlsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZWFtUHJvZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOTlmZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVhbVByb2ZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlY2huaXF1ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODY2ZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVjaG5pcXVlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2MzI1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZW1wbGF0ZURlc2NyaXB0aW9uLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYzMjUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RlbXBsYXRlRGVzY3JpcHRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVGVybURlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFiZmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rlcm1EZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RleHRFbGVtZW50LmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RleHRFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0NTUxYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UZXh0RWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2wuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjFiODVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1Rvb2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVG9vbE1lbnRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxYjg1YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Ub29sTWVudG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1RyYWluaW5nQ2xhc3MuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdDbGFzcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDEwZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdDbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ01vZHVsZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFpbmluZ01vZHVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTZjMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhaW5pbmdNb2R1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHJhbnNpdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFuc2l0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhYzRmZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9UcmFuc2l0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1R5cGUuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjhhZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWFkNWRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1VNQVNlbWFudGljTW9kZWxCcmlkZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVXNlckRlZmluZWRDYXRlZ29yeS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY0Nzk4MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Vc2VyRGVmaW5lZENhdGVnb3J5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZhcmlhYmlsaXR5RWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WYXJpYWJpbGl0eUVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc0MTRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1ZhcmlhYmlsaXR5RWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WZXJ0ZXguZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvVmVydGV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1YzcwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9WZXJ0ZXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV0JTLmdpZiBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dCUy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTZjMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV0JTLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1doaXRlcGFwZXIuZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjQ4MDAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV2hpdGVwYXBlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrQnJlYWtkb3duRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYWM0ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0JyZWFrZG93bkVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0RlZmluaXRpb24uZ2lmIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya0RlZmluaXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTI0ZjNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtEZWZpbml0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtPcmRlci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrT3JkZXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRhYWIwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtPcmRlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdC5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDBmM2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3QuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE4MjI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdEd1aWRlbGluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1N2ZhNjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RHdWlkZWxpbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L2ljb25zL2Z1bGwvb2JqMTYvV29ya1Byb2R1Y3RTaGFwZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFNoYXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0MGYzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFNoYXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZS5naWYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvaWNvbnMvZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VjYWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9pY29ucy9mdWxsL29iajE2L1dvcmtQcm9kdWN0VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTk1MmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEVNRiBVTUEgRWRpdCBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCi1fVUlfQ3JlYXRlQ2hpbGRfdGV4dCA9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQyID0gezF9IHswfQotX1VJX0NyZWF0ZUNoaWxkX3RleHQzID0gezF9Ci1fVUlfQ3JlYXRlQ2hpbGRfdG9vbHRpcCA9IENyZWF0ZSBOZXcgezB9IFVuZGVyIHsxfSBGZWF0dXJlCi1fVUlfQ3JlYXRlQ2hpbGRfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgY2hpbGQgb2YgdHlwZSB7MH0gZm9yIHRoZSB7MX0gZmVhdHVyZSBvZiB0aGUgc2VsZWN0ZWQgezJ9LgotX1VJX0NyZWF0ZVNpYmxpbmdfZGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgc2libGluZyBvZiB0eXBlIHswfSBmb3IgdGhlIHNlbGVjdGVkIHsyfSwgdW5kZXIgdGhlIHsxfSBmZWF0dXJlIG9mIHRoZWlyIHBhcmVudC4KLQotX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiA9IFRoZSB7MH0gb2YgdGhlIHsxfQotCi1fVUlfQ2xhc3NpZmllcl90eXBlID0gQ2xhc3NpZmllcgotX1VJX1R5cGVfdHlwZSA9IFR5cGUKLV9VSV9FbGVtZW50X3R5cGUgPSBFbGVtZW50Ci1fVUlfTmFtZWRFbGVtZW50X3R5cGUgPSBOYW1lZCBFbGVtZW50Ci1fVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUgPSBQYWNrYWdlYWJsZSBFbGVtZW50Ci1fVUlfUGFja2FnZV90eXBlID0gUGFja2FnZQotX1VJX05hbWVzcGFjZV90eXBlID0gTmFtZXNwYWNlCi1fVUlfTWV0aG9kRWxlbWVudF90eXBlID0gTWV0aG9kIEVsZW1lbnQKLV9VSV9Db25zdHJhaW50X3R5cGUgPSBDb25zdHJhaW50Ci1fVUlfQ29udGVudEVsZW1lbnRfdHlwZSA9IENvbnRlbnQgRWxlbWVudAotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlID0gRGVzY3JpYmFibGUgRWxlbWVudAotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlID0gQ29udGVudCBEZXNjcmlwdGlvbgotX1VJX1NlY3Rpb25fdHlwZSA9IFNlY3Rpb24KLV9VSV9Sb2xlX3R5cGUgPSBSb2xlCi1fVUlfV29ya1Byb2R1Y3RfdHlwZSA9IFdvcmsgUHJvZHVjdAotX1VJX1Rhc2tfdHlwZSA9IFRhc2sKLV9VSV9Xb3JrRGVmaW5pdGlvbl90eXBlID0gV29yayBEZWZpbml0aW9uCi1fVUlfU3RlcF90eXBlID0gU3RlcAotX1VJX0d1aWRhbmNlX3R5cGUgPSBHdWlkYW5jZQotX1VJX0FydGlmYWN0X3R5cGUgPSBBcnRpZmFjdAotX1VJX0RlbGl2ZXJhYmxlX3R5cGUgPSBEZWxpdmVyYWJsZQotX1VJX091dGNvbWVfdHlwZSA9IE91dGNvbWUKLV9VSV9NZXRob2RQYWNrYWdlX3R5cGUgPSBNZXRob2QgUGFja2FnZQotX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUgPSBDb250ZW50IFBhY2thZ2UKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUgPSBBcnRpZmFjdCBEZXNjcmlwdGlvbgotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSA9IFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbgotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSA9IERlbGl2ZXJhYmxlIERlc2NyaXB0aW9uCi1fVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUgPSBSb2xlIERlc2NyaXB0aW9uCi1fVUlfVGFza0Rlc2NyaXB0aW9uX3R5cGUgPSBUYXNrIERlc2NyaXB0aW9uCi1fVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlID0gR3VpZGFuY2UgRGVzY3JpcHRpb24KLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUgPSBQcmFjdGljZSBEZXNjcmlwdGlvbgotX1VJX1BvaW50X3R5cGUgPSBQb2ludAotX1VJX0dyYXBoRWxlbWVudF90eXBlID0gR3JhcGggRWxlbWVudAotX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUgPSBEaWFncmFtIEVsZW1lbnQKLV9VSV9EaWFncmFtTGlua190eXBlID0gRGlhZ3JhbSBMaW5rCi1fVUlfR3JhcGhDb25uZWN0b3JfdHlwZSA9IEdyYXBoIENvbm5lY3RvcgotX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSA9IFNlbWFudGljIE1vZGVsIEJyaWRnZQotX1VJX0RpbWVuc2lvbl90eXBlID0gRGltZW5zaW9uCi1fVUlfUmVmZXJlbmNlX3R5cGUgPSBSZWZlcmVuY2UKLV9VSV9Qcm9wZXJ0eV90eXBlID0gUHJvcGVydHkKLV9VSV9HcmFwaEVkZ2VfdHlwZSA9IEdyYXBoIEVkZ2UKLV9VSV9EaWFncmFtX3R5cGUgPSBEaWFncmFtCi1fVUlfR3JhcGhOb2RlX3R5cGUgPSBHcmFwaCBOb2RlCi1fVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSA9IFNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50Ci1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlID0gVU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZQotX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUgPSBDb3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZQotX1VJX0xlYWZFbGVtZW50X3R5cGUgPSBMZWFmIEVsZW1lbnQKLV9VSV9UZXh0RWxlbWVudF90eXBlID0gVGV4dCBFbGVtZW50Ci1fVUlfSW1hZ2VfdHlwZSA9IEltYWdlCi1fVUlfR3JhcGhpY1ByaW1pdGl2ZV90eXBlID0gR3JhcGhpYyBQcmltaXRpdmUKLV9VSV9Qb2x5bGluZV90eXBlID0gUG9seWxpbmUKLV9VSV9FbGxpcHNlX3R5cGUgPSBFbGxpcHNlCi1fVUlfQWN0aXZpdHlfdHlwZSA9IEFjdGl2aXR5Ci1fVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSA9IFdvcmsgQnJlYWtkb3duIEVsZW1lbnQKLV9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUgPSBCcmVha2Rvd24gRWxlbWVudAotX1VJX01pbGVzdG9uZV90eXBlID0gTWlsZXN0b25lCi1fVUlfSXRlcmF0aW9uX3R5cGUgPSBJdGVyYXRpb24KLV9VSV9QaGFzZV90eXBlID0gUGhhc2UKLV9VSV9UZWFtUHJvZmlsZV90eXBlID0gVGVhbSBQcm9maWxlCi1fVUlfUm9sZURlc2NyaXB0b3JfdHlwZSA9IFJvbGUgRGVzY3JpcHRvcgotX1VJX1dvcmtPcmRlcl90eXBlID0gV29yayBPcmRlcgotX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUgPSBQcm9jZXNzIEVsZW1lbnQKLV9VSV9QbGFubmluZ0RhdGFfdHlwZSA9IFBsYW5uaW5nIERhdGEKLV9VSV9EZXNjcmlwdG9yX3R5cGUgPSBEZXNjcmlwdG9yCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUgPSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcgotX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUgPSBUYXNrIERlc2NyaXB0b3IKLV9VSV9Db21wb3NpdGVSb2xlX3R5cGUgPSBDb21wb3NpdGUgUm9sZQotX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlID0gQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24KLV9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUgPSBBY3Rpdml0eSBEZXNjcmlwdGlvbgotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBEZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUgPSBQcm9jZXNzIERlc2NyaXB0aW9uCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUgPSBEZXNjcmlwdG9yIERlc2NyaXB0aW9uCi1fVUlfQ29uY2VwdF90eXBlID0gQ29uY2VwdAotX1VJX0NoZWNrbGlzdF90eXBlID0gQ2hlY2tsaXN0Ci1fVUlfRXhhbXBsZV90eXBlID0gRXhhbXBsZQotX1VJX0d1aWRlbGluZV90eXBlID0gR3VpZGVsaW5lCi1fVUlfUmVwb3J0X3R5cGUgPSBSZXBvcnQKLV9VSV9UZW1wbGF0ZV90eXBlID0gVGVtcGxhdGUKLV9VSV9TdXBwb3J0aW5nTWF0ZXJpYWxfdHlwZSA9IFN1cHBvcnRpbmcgTWF0ZXJpYWwKLV9VSV9Ub29sTWVudG9yX3R5cGUgPSBUb29sIE1lbnRvcgotX1VJX1doaXRlcGFwZXJfdHlwZSA9IFdoaXRlcGFwZXIKLV9VSV9UZXJtRGVmaW5pdGlvbl90eXBlID0gVGVybSBEZWZpbml0aW9uCi1fVUlfUHJhY3RpY2VfdHlwZSA9IFByYWN0aWNlCi1fVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUgPSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zCi1fVUlfUmV1c2FibGVBc3NldF90eXBlID0gUmV1c2FibGUgQXNzZXQKLV9VSV9TdGF0ZV90eXBlID0gU3RhdGUKLV9VSV9WZXJ0ZXhfdHlwZSA9IFZlcnRleAotX1VJX1JlZ2lvbl90eXBlID0gUmVnaW9uCi1fVUlfU3RhdGVNYWNoaW5lX3R5cGUgPSBTdGF0ZSBNYWNoaW5lCi1fVUlfVHJhbnNpdGlvbl90eXBlID0gVHJhbnNpdGlvbgotX1VJX1BzZXVkb1N0YXRlX3R5cGUgPSBQc2V1ZG8gU3RhdGUKLV9VSV9EaXNjaXBsaW5lX3R5cGUgPSBEaXNjaXBsaW5lCi1fVUlfQ29udGVudENhdGVnb3J5X3R5cGUgPSBDb250ZW50IENhdGVnb3J5Ci1fVUlfUm9sZVNldF90eXBlID0gUm9sZSBTZXQKLV9VSV9Eb21haW5fdHlwZSA9IERvbWFpbgotX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlID0gV29yayBQcm9kdWN0IEtpbmQKLV9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSA9IERpc2NpcGxpbmUgR3JvdXBpbmcKLV9VSV9Ub29sX3R5cGUgPSBUb29sCi1fVUlfUm9sZVNldEdyb3VwaW5nX3R5cGUgPSBSb2xlIFNldCBHcm91cGluZwotX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUgPSBDdXN0b20gQ2F0ZWdvcnkKLV9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSA9IERlbGl2ZXJ5IFByb2Nlc3MKLV9VSV9Qcm9jZXNzX3R5cGUgPSBQcm9jZXNzCi1fVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSA9IENhcGFiaWxpdHkgUGF0dGVybgotX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUgPSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlCi1fVUlfUm9hZG1hcF90eXBlID0gUm9hZG1hcAotX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSA9IFByb2Nlc3MgQ29tcG9uZW50Ci1fVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSA9IFByb2Nlc3MgUGFja2FnZQotX1VJX1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfdHlwZSA9IFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZQotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUgPSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yCi1fVUlfTWV0aG9kUGx1Z2luX3R5cGUgPSBNZXRob2QgUGx1Zy1pbgotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlID0gVmFyaWFiaWxpdHkgRWxlbWVudAotX1VJX01ldGhvZFVuaXRfdHlwZSA9IE1ldGhvZCBVbml0Ci1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlID0gTWV0aG9kIENvbmZpZ3VyYXRpb24KLV9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUgPSBQcm9jZXNzIEZhbWlseQotX1VJX01ldGhvZExpYnJhcnlfdHlwZSA9IE1ldGhvZCBMaWJyYXJ5Ci1fVUlfVW5rbm93bl90eXBlID0gT2JqZWN0Ci0KLV9VSV9Vbmtub3duX2RhdGF0eXBlPSBWYWx1ZQotCi1fVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSA9IE5hbWUKLV9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSA9IEdVSUQKLV9VSV9NZXRob2RFbGVtZW50X2JyaWVmRGVzY3JpcHRpb25fZmVhdHVyZSA9IEJyaWVmIERlc2NyaXB0aW9uCi1fVUlfTWV0aG9kRWxlbWVudF9vd25lZFJ1bGVzX2ZlYXR1cmUgPSBPd25lZCBSdWxlcwotX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlID0gU3VwcHJlc3NlZAotX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlID0gT3JkZXJpbmcgR3VpZGUKLV9VSV9Db25zdHJhaW50X2JvZHlfZmVhdHVyZSA9IEJvZHkKLV9VSV9Db250ZW50RWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUgPSBTdXBwb3J0aW5nIE1hdGVyaWFscwotX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUgPSBDb25jZXB0cyBBbmQgUGFwZXJzCi1fVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlID0gQ2hlY2tsaXN0cwotX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSA9IEd1aWRlbGluZXMKLV9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlID0gRXhhbXBsZXMKLV9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSA9IEFzc2V0cwotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24gTmFtZQotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9wcmVzZW50YXRpb25fZmVhdHVyZSA9IFByZXNlbnRhdGlvbgotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSA9IFNoYXBlaWNvbgotX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlID0gTm9kZWljb24KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbWFpbkRlc2NyaXB0aW9uX2ZlYXR1cmUgPSBNYWluIERlc2NyaXB0aW9uCi1fVUlfQ29udGVudERlc2NyaXB0aW9uX3NlY3Rpb25zX2ZlYXR1cmUgPSBTZWN0aW9ucwotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9rZXlDb25zaWRlcmF0aW9uc19mZWF0dXJlID0gS2V5IENvbnNpZGVyYXRpb25zCi1fVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlID0gU2VjdGlvbiBOYW1lCi1fVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSA9IFNlY3Rpb24gRGVzY3JpcHRpb24KLV9VSV9TZWN0aW9uX3N1YlNlY3Rpb25zX2ZlYXR1cmUgPSBTdWIgU2VjdGlvbnMKLV9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBQcmVkZWNlc3NvcgotX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSA9IE1vZGlmaWVzCi1fVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlID0gUmVzcG9uc2libGUgRm9yCi1fVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlID0gUmVwb3J0cwotX1VJX1dvcmtQcm9kdWN0X3RlbXBsYXRlc19mZWF0dXJlID0gVGVtcGxhdGVzCi1fVUlfV29ya1Byb2R1Y3RfdG9vbE1lbnRvcnNfZmVhdHVyZSA9IFRvb2wgTWVudG9ycwotX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlID0gRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucwotX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSA9IFBlcmZvcm1lZCBCeQotX1VJX1Rhc2tfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IE1hbmRhdG9yeSBJbnB1dAotX1VJX1Rhc2tfb3V0cHV0X2ZlYXR1cmUgPSBPdXRwdXQKLV9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUgPSBBZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5Ci1fVUlfVGFza19vcHRpb25hbElucHV0X2ZlYXR1cmUgPSBPcHRpb25hbCBJbnB1dAotX1VJX1Rhc2tfc3RlcHNfZmVhdHVyZSA9IFN0ZXBzCi1fVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlID0gVG9vbCBNZW50b3JzCi1fVUlfVGFza19lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfZmVhdHVyZSA9IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMKLV9VSV9Xb3JrRGVmaW5pdGlvbl9wcmVjb25kaXRpb25fZmVhdHVyZSA9IFByZWNvbmRpdGlvbgotX1VJX1dvcmtEZWZpbml0aW9uX3Bvc3Rjb25kaXRpb25fZmVhdHVyZSA9IFBvc3Rjb25kaXRpb24KLV9VSV9BcnRpZmFjdF9jb250YWluZXJBcnRpZmFjdF9mZWF0dXJlID0gQ29udGFpbmVyIEFydGlmYWN0Ci1fVUlfQXJ0aWZhY3RfY29udGFpbmVkQXJ0aWZhY3RzX2ZlYXR1cmUgPSBDb250YWluZWQgQXJ0aWZhY3RzCi1fVUlfRGVsaXZlcmFibGVfZGVsaXZlcmVkV29ya1Byb2R1Y3RzX2ZlYXR1cmUgPSBEZWxpdmVyZWQgV29yayBQcm9kdWN0cwotX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUgPSBHbG9iYWwKLV9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUgPSBSZXVzZWQgUGFja2FnZXMKLV9VSV9NZXRob2RQYWNrYWdlX3BhcmVudFBhY2thZ2VfZmVhdHVyZSA9IFBhcmVudCBQYWNrYWdlCi1fVUlfTWV0aG9kUGFja2FnZV9jaGlsZFBhY2thZ2VzX2ZlYXR1cmUgPSBDaGlsZCBQYWNrYWdlcwotX1VJX0NvbnRlbnRQYWNrYWdlX2NvbnRlbnRFbGVtZW50c19mZWF0dXJlID0gQ29udGVudCBFbGVtZW50cwotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fYnJpZWZPdXRsaW5lX2ZlYXR1cmUgPSBCcmllZiBPdXRsaW5lCi1fVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9yZXByZXNlbnRhdGlvbk9wdGlvbnNfZmVhdHVyZSA9IFJlcHJlc2VudGF0aW9uIE9wdGlvbnMKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSA9IEV4dGVybmFsIElkCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBQdXJwb3NlCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlID0gSW1wYWN0IE9mIE5vdCBIYXZpbmcKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUgPSBSZWFzb25zIEZvciBOb3QgTmVlZGluZwotX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fZXh0ZXJuYWxEZXNjcmlwdGlvbl9mZWF0dXJlID0gRXh0ZXJuYWwgRGVzY3JpcHRpb24KLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0aW9uX3BhY2thZ2luZ0d1aWRhbmNlX2ZlYXR1cmUgPSBQYWNrYWdpbmcgR3VpZGFuY2UKLV9VSV9Sb2xlRGVzY3JpcHRpb25fc2tpbGxzX2ZlYXR1cmUgPSBTa2lsbHMKLV9VSV9Sb2xlRGVzY3JpcHRpb25fYXNzaWdubWVudEFwcHJvYWNoZXNfZmVhdHVyZSA9IEFzc2lnbm1lbnQgQXBwcm9hY2hlcwotX1VJX1JvbGVEZXNjcmlwdGlvbl9zeW5vbnltc19mZWF0dXJlID0gU3lub255bXMKLV9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlID0gUHVycG9zZQotX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZlcwotX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSA9IEF0dGFjaG1lbnRzCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlID0gQWRkaXRpb25hbCBJbmZvCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9wcm9ibGVtX2ZlYXR1cmUgPSBQcm9ibGVtCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9iYWNrZ3JvdW5kX2ZlYXR1cmUgPSBCYWNrZ3JvdW5kCi1fVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlID0gR29hbHMKLV9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FwcGxpY2F0aW9uX2ZlYXR1cmUgPSBBcHBsaWNhdGlvbgotX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlID0gTGV2ZWxzIE9mIEFkb3B0aW9uCi1fVUlfUG9pbnRfeF9mZWF0dXJlID0gWAotX1VJX1BvaW50X3lfZmVhdHVyZSA9IFkKLV9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSA9IFBvc2l0aW9uCi1fVUlfR3JhcGhFbGVtZW50X2NvbnRhaW5lZF9mZWF0dXJlID0gQ29udGFpbmVkCi1fVUlfR3JhcGhFbGVtZW50X2xpbmtfZmVhdHVyZSA9IExpbmsKLV9VSV9HcmFwaEVsZW1lbnRfYW5jaG9yYWdlX2ZlYXR1cmUgPSBBbmNob3JhZ2UKLV9VSV9HcmFwaEVsZW1lbnRfc2VtYW50aWNNb2RlbF9mZWF0dXJlID0gU2VtYW50aWMgTW9kZWwKLV9VSV9EaWFncmFtRWxlbWVudF9pc1Zpc2libGVfZmVhdHVyZSA9IElzIFZpc2libGUKLV9VSV9EaWFncmFtRWxlbWVudF9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcgotX1VJX0RpYWdyYW1FbGVtZW50X3JlZmVyZW5jZV9mZWF0dXJlID0gUmVmZXJlbmNlCi1fVUlfRGlhZ3JhbUVsZW1lbnRfcHJvcGVydHlfZmVhdHVyZSA9IFByb3BlcnR5Ci1fVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlID0gWm9vbQotX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUgPSBWaWV3cG9ydAotX1VJX0RpYWdyYW1MaW5rX2dyYXBoRWxlbWVudF9mZWF0dXJlID0gR3JhcGggRWxlbWVudAotX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW0KLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSA9IEdyYXBoIEVkZ2UKLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlID0gUHJlc2VudGF0aW9uCi1fVUlfU2VtYW50aWNNb2RlbEJyaWRnZV9ncmFwaEVsZW1lbnRfZmVhdHVyZSA9IEdyYXBoIEVsZW1lbnQKLV9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX2RpYWdyYW1fZmVhdHVyZSA9IERpYWdyYW0KLV9VSV9EaW1lbnNpb25fd2lkdGhfZmVhdHVyZSA9IFdpZHRoCi1fVUlfRGltZW5zaW9uX2hlaWdodF9mZWF0dXJlID0gSGVpZ2h0Ci1fVUlfUmVmZXJlbmNlX2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBJcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uCi1fVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSA9IFJlZmVyZW5jZWQKLV9VSV9Qcm9wZXJ0eV9rZXlfZmVhdHVyZSA9IEtleQotX1VJX1Byb3BlcnR5X3ZhbHVlX2ZlYXR1cmUgPSBWYWx1ZQotX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSA9IEFuY2hvcgotX1VJX0dyYXBoRWRnZV93YXlwb2ludHNfZmVhdHVyZSA9IFdheXBvaW50cwotX1VJX0RpYWdyYW1fem9vbV9mZWF0dXJlID0gWm9vbQotX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUgPSBWaWV3cG9pbnQKLV9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUgPSBEaWFncmFtIExpbmsKLV9VSV9EaWFncmFtX25hbWVzcGFjZV9mZWF0dXJlID0gTmFtZXNwYWNlCi1fVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSA9IFNpemUKLV9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlID0gVHlwZSBJbmZvCi1fVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUgPSBFbGVtZW50Ci1fVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlID0gRWxlbWVudAotX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSA9IFRleHQKLV9VSV9JbWFnZV91cmlfZmVhdHVyZSA9IFVyaQotX1VJX0ltYWdlX21pbWVUeXBlX2ZlYXR1cmUgPSBNaW1lIFR5cGUKLV9VSV9Qb2x5bGluZV9jbG9zZWRfZmVhdHVyZSA9IENsb3NlZAotX1VJX1BvbHlsaW5lX3dheXBvaW50c19mZWF0dXJlID0gV2F5cG9pbnRzCi1fVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUgPSBSYWRpdXMgWAotX1VJX0VsbGlwc2VfcmFkaXVzWV9mZWF0dXJlID0gUmFkaXVzIFkKLV9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUgPSBSb3RhdGlvbgotX1VJX0VsbGlwc2Vfc3RhcnRBbmdsZV9mZWF0dXJlID0gU3RhcnQgQW5nbGUKLV9VSV9FbGxpcHNlX2VuZEFuZ2xlX2ZlYXR1cmUgPSBFbmQgQW5nbGUKLV9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlID0gQ2VudGVyCi1fVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSA9IEJyZWFrZG93biBFbGVtZW50cwotX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUgPSBSb2FkbWFwcwotX1VJX0FjdGl2aXR5X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSA9IFN1cHBvcnRpbmcgTWF0ZXJpYWxzCi1fVUlfQWN0aXZpdHlfY2hlY2tsaXN0c19mZWF0dXJlID0gQ2hlY2tsaXN0cwotX1VJX0FjdGl2aXR5X2NvbmNlcHRzX2ZlYXR1cmUgPSBDb25jZXB0cwotX1VJX0FjdGl2aXR5X2V4YW1wbGVzX2ZlYXR1cmUgPSBFeGFtcGxlcwotX1VJX0FjdGl2aXR5X2d1aWRlbGluZXNfZmVhdHVyZSA9IEd1aWRlbGluZXMKLV9VSV9BY3Rpdml0eV9yZXVzYWJsZUFzc2V0c19mZWF0dXJlID0gUmV1c2FibGUgQXNzZXRzCi1fVUlfQWN0aXZpdHlfaXNFbmFjdGFibGVfZmVhdHVyZSA9IElzIEVuYWN0YWJsZQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlID0gSXMgUmVwZWF0YWJsZQotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzT25nb2luZ19mZWF0dXJlID0gSXMgT25nb2luZwotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSA9IElzIEV2ZW50IERyaXZlbgotX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUgPSBMaW5rIFRvIFByZWRlY2Vzc29yCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSA9IFByZWZpeAotX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUgPSBJcyBQbGFubmVkCi1fVUlfQnJlYWtkb3duRWxlbWVudF9oYXNNdWx0aXBsZU9jY3VycmVuY2VzX2ZlYXR1cmUgPSBIYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2lzT3B0aW9uYWxfZmVhdHVyZSA9IElzIE9wdGlvbmFsCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlID0gUHJlc2VudGVkIEFmdGVyCi1fVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSA9IFByZXNlbnRlZCBCZWZvcmUKLV9VSV9CcmVha2Rvd25FbGVtZW50X3BsYW5uaW5nRGF0YV9mZWF0dXJlID0gUGxhbm5pbmcgRGF0YQotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUgPSBTdXBlciBBY3Rpdml0eQotX1VJX1RlYW1Qcm9maWxlX3RlYW1Sb2xlc19mZWF0dXJlID0gVGVhbSBSb2xlcwotX1VJX1RlYW1Qcm9maWxlX3N1cGVyVGVhbV9mZWF0dXJlID0gU3VwZXIgVGVhbQotX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSA9IFN1YiBUZWFtCi1fVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlID0gUm9sZQotX1VJX1JvbGVEZXNjcmlwdG9yX21vZGlmaWVzX2ZlYXR1cmUgPSBNb2RpZmllcwotX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUgPSBSZXNwb25zaWJsZSBGb3IKLV9VSV9Xb3JrT3JkZXJfbGlua1R5cGVfZmVhdHVyZSA9IExpbmsgVHlwZQotX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUgPSBQcmVkCi1fVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlID0gU3RhcnQgRGF0ZQotX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUgPSBGaW5pc2ggRGF0ZQotX1VJX1BsYW5uaW5nRGF0YV9yYW5rX2ZlYXR1cmUgPSBSYW5rCi1fVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSA9IElzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZQotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSA9IEFjdGl2aXR5IEVudHJ5IFN0YXRlCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RXhpdFN0YXRlX2ZlYXR1cmUgPSBBY3Rpdml0eSBFeGl0IFN0YXRlCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBXb3JrIFByb2R1Y3QKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlID0gSW1wYWN0ZWQgQnkKLV9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlID0gSW1wYWN0cwotX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9kZWxpdmVyYWJsZVBhcnRzX2ZlYXR1cmUgPSBEZWxpdmVyYWJsZSBQYXJ0cwotX1VJX1Rhc2tEZXNjcmlwdG9yX1Rhc2tfZmVhdHVyZSA9IFRhc2sKLV9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlID0gQWRkaXRpb25hbCBQZXJmb3JtZXIKLV9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUgPSBBc3Npc3RlZCBCeQotX1VJX1Rhc2tEZXNjcmlwdG9yX2V4dGVybmFsSW5wdXRfZmVhdHVyZSA9IEV4dGVybmFsIElucHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3JfbWFuZGF0b3J5SW5wdXRfZmVhdHVyZSA9IE1hbmRhdG9yeSBJbnB1dAotX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSA9IE9wdGlvbmFsIElucHV0Ci1fVUlfVGFza0Rlc2NyaXB0b3Jfb3V0cHV0X2ZlYXR1cmUgPSBPdXRwdXQKLV9VSV9UYXNrRGVzY3JpcHRvcl9wZXJmb3JtZWRQcmltYXJpbHlCeV9mZWF0dXJlID0gUHJpbWFyeSBQZXJmb3JtZXIKLV9VSV9UYXNrRGVzY3JpcHRvcl9zZWxlY3RlZFN0ZXBzX2ZlYXR1cmUgPSBTZWxlY3RlZCBTdGVwcwotX1VJX0NvbXBvc2l0ZVJvbGVfYWdncmVnYXRlZFJvbGVzX2ZlYXR1cmUgPSBBZ2dyZWdhdGVkIFJvbGVzCi1fVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSA9IFVzYWdlIEd1aWRhbmNlCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUgPSBQdXJwb3NlCi1fVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSA9IEFsdGVybmF0aXZlcwotX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25faG93dG9TdGFmZl9mZWF0dXJlID0gSG93dG8gU3RhZmYKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9zY2FsZV9mZWF0dXJlID0gU2NhbGUKLV9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzX2ZlYXR1cmUgPSBQcm9qZWN0IENoYXJhY3RlcmlzdGljcwotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlID0gUmlzayBMZXZlbAotX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSA9IEVzdGltYXRpbmcgVGVjaG5pcXVlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlID0gUHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlCi1fVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSA9IFR5cGUgT2YgQ29udHJhY3QKLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlID0gRXh0ZXJuYWwgSWQKLV9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fc2NvcGVfZmVhdHVyZSA9IFNjb3BlCi1fVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSA9IFVzYWdlIE5vdGVzCi1fVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlID0gUmVmaW5lZCBEZXNjcmlwdGlvbgotX1VJX1ByYWN0aWNlX3N1YlByYWN0aWNlc19mZWF0dXJlID0gU3ViIFByYWN0aWNlcwotX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUgPSBDb250ZW50IFJlZmVyZW5jZXMKLV9VSV9QcmFjdGljZV9hY3Rpdml0eVJlZmVyZW5jZXNfZmVhdHVyZSA9IEFjdGl2aXR5IFJlZmVyZW5jZXMKLV9VSV9TdGF0ZV9Xb3JrUHJvZHVjdF9mZWF0dXJlID0gV29yayBQcm9kdWN0Ci1fVUlfU3RhdGVfUmVnaW9uX2ZlYXR1cmUgPSBSZWdpb24KLV9VSV9TdGF0ZV9zdWJtYWNoaW5lX2ZlYXR1cmUgPSBTdWJtYWNoaW5lCi1fVUlfVmVydGV4X2NvbnRhaW5lcl9mZWF0dXJlID0gQ29udGFpbmVyCi1fVUlfVmVydGV4X291dGdvaW5nX2ZlYXR1cmUgPSBPdXRnb2luZwotX1VJX1ZlcnRleF9pbmNvbWluZ19mZWF0dXJlID0gSW5jb21pbmcKLV9VSV9SZWdpb25fVmVydGV4X2ZlYXR1cmUgPSBWZXJ0ZXgKLV9VSV9SZWdpb25fVHJhbnNpdGlvbl9mZWF0dXJlID0gVHJhbnNpdGlvbgotX1VJX1JlZ2lvbl9TdGF0ZV9mZWF0dXJlID0gU3RhdGUKLV9VSV9SZWdpb25fU3RhdGVNYWNoaW5lX2ZlYXR1cmUgPSBTdGF0ZSBNYWNoaW5lCi1fVUlfU3RhdGVNYWNoaW5lX1JlZ2lvbl9mZWF0dXJlID0gUmVnaW9uCi1fVUlfVHJhbnNpdGlvbl9Xb3JrRGVmaW5pdGlvbl9mZWF0dXJlID0gV29yayBEZWZpbml0aW9uCi1fVUlfVHJhbnNpdGlvbl9jb250YWluZXJfZmVhdHVyZSA9IENvbnRhaW5lcgotX1VJX1RyYW5zaXRpb25fc291cmNlX2ZlYXR1cmUgPSBTb3VyY2UKLV9VSV9UcmFuc2l0aW9uX3RhcmdldF9mZWF0dXJlID0gVGFyZ2V0Ci1fVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlID0gVGFza3MKLV9VSV9EaXNjaXBsaW5lX3N1YmRpc2NpcGxpbmVfZmVhdHVyZSA9IFN1YmRpc2NpcGxpbmUKLV9VSV9EaXNjaXBsaW5lX3JlZmVyZW5jZVdvcmtmbG93c19mZWF0dXJlID0gUmVmZXJlbmNlIFdvcmtmbG93cwotX1VJX1JvbGVTZXRfcm9sZXNfZmVhdHVyZSA9IFJvbGVzCi1fVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gV29yayBQcm9kdWN0cwotX1VJX0RvbWFpbl9zdWJkb21haW5zX2ZlYXR1cmUgPSBTdWJkb21haW5zCi1fVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlID0gV29yayBQcm9kdWN0cwotX1VJX0Rpc2NpcGxpbmVHcm91cGluZ19kaXNjaXBsaW5lc19mZWF0dXJlID0gRGlzY2lwbGluZXMKLV9VSV9Ub29sX3Rvb2xNZW50b3JzX2ZlYXR1cmUgPSBUb29sIE1lbnRvcnMKLV9VSV9Sb2xlU2V0R3JvdXBpbmdfcm9sZVNldHNfZmVhdHVyZSA9IFJvbGUgU2V0cwotX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSA9IENhdGVnb3JpemVkIEVsZW1lbnRzCi1fVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlID0gU3ViIENhdGVnb3JpZXMKLV9VSV9EZWxpdmVyeVByb2Nlc3NfZWR1Y2F0aW9uTWF0ZXJpYWxzX2ZlYXR1cmUgPSBFZHVjYXRpb24gTWF0ZXJpYWxzCi1fVUlfRGVsaXZlcnlQcm9jZXNzX2NvbW11bmljYXRpb25zTWF0ZXJpYWxzX2ZlYXR1cmUgPSBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbHMKLV9VSV9Qcm9jZXNzX2luY2x1ZGVzUGF0dGVybnNfZmVhdHVyZSA9IEluY2x1ZGVzIFBhdHRlcm5zCi1fVUlfUHJvY2Vzc19kZWZhdWx0Q29udGV4dF9mZWF0dXJlID0gRGVmYXVsdCBDb250ZXh0Ci1fVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSA9IFZhbGlkIENvbnRleHQKLV9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUgPSBCYXNlZCBPbiBQcm9jZXNzZXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X2ludGVyZmFjZXNfZmVhdHVyZSA9IEludGVyZmFjZXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50X3Byb2Nlc3NfZmVhdHVyZSA9IFByb2Nlc3MKLV9VSV9Qcm9jZXNzUGFja2FnZV9wcm9jZXNzRWxlbWVudHNfZmVhdHVyZSA9IFByb2Nlc3MgRWxlbWVudHMKLV9VSV9Qcm9jZXNzUGFja2FnZV9kaWFncmFtc19mZWF0dXJlID0gRGlhZ3JhbXMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZVNwZWNpZmljYXRpb25zX2ZlYXR1cmUgPSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnMKLV9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX2ludGVyZmFjZUlPX2ZlYXR1cmUgPSBJbnRlcmZhY2UgSU8KLV9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9Qcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBQcm9jZXNzIENvbXBvbmVudAotX1VJX01ldGhvZFBsdWdpbl91c2VyQ2hhbmdlYWJsZV9mZWF0dXJlID0gVXNlciBDaGFuZ2VhYmxlCi1fVUlfTWV0aG9kUGx1Z2luX21ldGhvZFBhY2thZ2VzX2ZlYXR1cmUgPSBNZXRob2QgUGFja2FnZXMKLV9VSV9NZXRob2RQbHVnaW5fYmFzZXNfZmVhdHVyZSA9IEJhc2VzCi1fVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5VHlwZV9mZWF0dXJlID0gVmFyaWFiaWxpdHkgVHlwZQotX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50X2ZlYXR1cmUgPSBWYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50Ci1fVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUgPSBBdXRob3JzCi1fVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUgPSBDaGFuZ2UgRGF0ZQotX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSA9IENoYW5nZSBEZXNjcmlwdGlvbgotX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlID0gVmVyc2lvbgotX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUgPSBDb3B5cmlnaHQgU3RhdGVtZW50Ci1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSA9IE1ldGhvZCBQbHVnLWluIFNlbGVjdGlvbgotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fbWV0aG9kUGFja2FnZVNlbGVjdGlvbl9mZWF0dXJlID0gTWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uCi1fVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSA9IFByb2Nlc3MgVmlld3MKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2RlZmF1bHRWaWV3X2ZlYXR1cmUgPSBEZWZhdWx0IFZpZXcKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX2Jhc2VDb25maWd1cmF0aW9uc19mZWF0dXJlID0gQmFzZSBDb25maWd1cmF0aW9ucwotX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSA9IERlbGl2ZXJ5IFByb2Nlc3NlcwotX1VJX01ldGhvZExpYnJhcnlfbWV0aG9kUGx1Z2luc19mZWF0dXJlID0gTWV0aG9kIFBsdWctaW5zCi1fVUlfTWV0aG9kTGlicmFyeV9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnNfZmVhdHVyZSA9IFByZWRlZmluZWQgQ29uZmlndXJhdGlvbnMKLV9VSV9Vbmtub3duX2ZlYXR1cmUgPSBVbnNwZWNpZmllZAotCi1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb1N0YXJ0X2xpdGVyYWwgPSBmaW5pc2hUb1N0YXJ0Ci1fVUlfV29ya09yZGVyVHlwZV9maW5pc2hUb0ZpbmlzaF9saXRlcmFsID0gZmluaXNoVG9GaW5pc2gKLV9VSV9Xb3JrT3JkZXJUeXBlX3N0YXJ0VG9TdGFydF9saXRlcmFsID0gc3RhcnRUb1N0YXJ0Ci1fVUlfV29ya09yZGVyVHlwZV9zdGFydFRvRmluaXNoX2xpdGVyYWwgPSBzdGFydFRvRmluaXNoCi1fVUlfUHNldWRvU3RhdGVLaW5kX2luaXRpYWxfbGl0ZXJhbCA9IGluaXRpYWwKLV9VSV9Qc2V1ZG9TdGF0ZUtpbmRfam9pbl9saXRlcmFsID0gam9pbgotX1VJX1BzZXVkb1N0YXRlS2luZF9mb3JrX2xpdGVyYWwgPSBmb3JrCi1fVUlfUHNldWRvU3RhdGVLaW5kX2p1bmN0aW9uX2xpdGVyYWwgPSBqdW5jdGlvbgotX1VJX1BzZXVkb1N0YXRlS2luZF9jaG9pY2VfbGl0ZXJhbCA9IGNob2ljZQotX1VJX1BzZXVkb1N0YXRlS2luZF9lbnRyeVBvaW50X2xpdGVyYWwgPSBlbnRyeVBvaW50Ci1fVUlfUHNldWRvU3RhdGVLaW5kX2V4aXRQb2ludF9saXRlcmFsID0gZXhpdFBvaW50Ci1fVUlfUHNldWRvU3RhdGVLaW5kX3Rlcm1pbmF0ZV9saXRlcmFsID0gdGVybWluYXRlCi1fVUlfVmFyaWFiaWxpdHlUeXBlX25hX2xpdGVyYWwgPSBuYQotX1VJX1ZhcmlhYmlsaXR5VHlwZV9jb250cmlidXRlc19saXRlcmFsID0gY29udHJpYnV0ZXMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc19saXRlcmFsID0gZXh0ZW5kcwotX1VJX1ZhcmlhYmlsaXR5VHlwZV9yZXBsYWNlc19saXRlcmFsID0gcmVwbGFjZXMKLV9VSV9WYXJpYWJpbGl0eVR5cGVfbG9jYWxDb250cmlidXRpb25fbGl0ZXJhbCA9IGxvY2FsQ29udHJpYnV0aW9uCi1fVUlfVmFyaWFiaWxpdHlUeXBlX2xvY2FsUmVwbGFjZW1lbnRfbGl0ZXJhbCA9IGxvY2FsUmVwbGFjZW1lbnQKLV9VSV9BcnRpZmFjdERlc2NyaXB0b3JfdHlwZSA9IEFydGlmYWN0IERlc2NyaXB0b3IKLV9VSV9EZWxpdmVyYWJsZURlc2NyaXB0b3JfdHlwZSA9IERlbGl2ZXJhYmxlIERlc2NyaXB0b3IKLV9VSV9PdXRjb21lRGVzY3JpcHRvcl90eXBlID0gT3V0Y29tZSBEZXNjcmlwdG9yCi1fVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3R5cGUgPSBNZXRob2QgRWxlbWVudCBQcm9wZXJ0eQotX1VJX01ldGhvZEVsZW1lbnRfbWV0aG9kRWxlbWVudFByb3BlcnR5X2ZlYXR1cmUgPSBNZXRob2QgRWxlbWVudCBQcm9wZXJ0eQotX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV92YWx1ZV9mZWF0dXJlID0gVmFsdWUKLV9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlID0gU3VidHJhY3RlZCBDYXRlZ29yeQotX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYWRkZWRDYXRlZ29yeV9mZWF0dXJlID0gQWRkZWQgQ2F0ZWdvcnkKLV9VSV9WYXJpYWJpbGl0eVR5cGVfZXh0ZW5kc1JlcGxhY2VzX2xpdGVyYWwgPSBleHRlbmRzUmVwbGFjZXMKLV9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uX2ZlYXR1cmUgPSBSZXByZXNlbnRhdGlvbgotX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fbm90YXRpb25fZmVhdHVyZSA9IE5vdGF0aW9uCi1fVUlfQ29udGVudEVsZW1lbnRfdGVybURlZmluaXRpb25fZmVhdHVyZSA9IFRlcm0gRGVmaW5pdGlvbgotX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9leHRlcm5hbElkX2ZlYXR1cmUgPSBFeHRlcm5hbCBJZAotX1VJX0tpbmRfdHlwZSA9IEtpbmQKLV9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSA9IEZ1bGZpbGxhYmxlIEVsZW1lbnQKLV9VSV9DbGFzc2lmaWVyX2lzQWJzdHJhY3RfZmVhdHVyZSA9IElzIEFic3RyYWN0Ci1fVUlfTWV0aG9kRWxlbWVudF9wcmVzZW50YXRpb25OYW1lX2ZlYXR1cmUgPSBQcmVzZW50YXRpb24gTmFtZQotX1VJX01ldGhvZEVsZW1lbnRfa2luZF9mZWF0dXJlID0gS2luZAotX1VJX0tpbmRfYXBwbGljYWJsZU1ldGFDbGFzc19mZWF0dXJlID0gQXBwbGljYWJsZSBNZXRhIENsYXNzCi1fVUlfS2luZF9pc1ByaW1hcnlLaW5kX2ZlYXR1cmUgPSBJcyBQcmltYXJ5IEtpbmQKLV9VSV9Db250ZW50RWxlbWVudF90ZXJtZGVmaW5pdGlvbl9mZWF0dXJlID0gVGVybWRlZmluaXRpb24KLV9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSA9IEZ1bGZpbGxzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUgPSBDaGVja2xpc3RzCi1fVUlfQnJlYWtkb3duRWxlbWVudF9jb25jZXB0c19mZWF0dXJlID0gQ29uY2VwdHMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUgPSBFeGFtcGxlcwotX1VJX0JyZWFrZG93bkVsZW1lbnRfZ3VpZGVsaW5lc19mZWF0dXJlID0gR3VpZGVsaW5lcwotX1VJX0JyZWFrZG93bkVsZW1lbnRfcmV1c2FibGVBc3NldHNfZmVhdHVyZSA9IFJldXNhYmxlIEFzc2V0cwotX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlID0gU3VwcG9ydGluZyBNYXRlcmlhbHMKLV9VSV9NaWxlc3RvbmVfcmVxdWlyZWRSZXN1bHRzX2ZlYXR1cmUgPSBSZXF1aXJlZCBSZXN1bHRzCi1fVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3dvcmtQcm9kdWN0X2ZlYXR1cmUgPSBXb3JrIFByb2R1Y3QKLV9VSV9Sb2xlRGVzY3JpcHRvcl9yb2xlX2ZlYXR1cmUgPSBSb2xlCi1fVUlfVGFza0Rlc2NyaXB0b3JfdGFza19mZWF0dXJlID0gVGFzawotX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX19wcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUgPSBwcm9jZXNzIENvbXBvbmVudAotX1VJX0JyZWFrZG93bkVsZW1lbnRfdGVtcGxhdGVzX2ZlYXR1cmUgPSBUZW1wbGF0ZXMKLV9VSV9CcmVha2Rvd25FbGVtZW50X3JlcG9ydHNfZmVhdHVyZSA9IFJlcG9ydHMKLV9VSV9CcmVha2Rvd25FbGVtZW50X2VzdGltYXRpb25jb25zaWRlcmF0aW9uc19mZWF0dXJlID0gRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zCi1fVUlfQnJlYWtkb3duRWxlbWVudF90b29sbWVudG9yX2ZlYXR1cmUgPSBUb29sbWVudG9yCi1fVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9fdHlwZSA9IEFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvCi1fVUlfS2luZF9hcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19mZWF0dXJlID0gQXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm8KLV9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSA9IExvbmcgUHJlc2VudGF0aW9uIE5hbWUKLV9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19pc1ByaW1hcnlFeHRlbnNpb25fZmVhdHVyZSA9IElzIFByaW1hcnkgRXh0ZW5zaW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvcGx1Z2luLnhtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDYyZjA5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1Mjo1NCBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0gICAgCi0gIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0Lml0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3JpZXMiPgotICAgIDxmYWN0b3J5IAotICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyLlVtYUl0ZW1Qcm92aWRlckFkYXB0ZXJGYWN0b3J5IiAKLSAgICAgICBzdXBwb3J0ZWRUeXBlcyA9IAotICAgICAgICAgIm9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyCi0gICAgICAgICAgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZSIgLz4KLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvY29tbWFuZC9NZXRob2RFbGVtZW50Q3JlYXRlQ29weUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3OWVlMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmNvbW1hbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ29weUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbi5UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW47Ci0KLS8qKgotICogQSBjb21tYW5kIHRoYXQgY3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNvcHkgb2YgYSBtZXRob2QgZWxlbWVudC4gVGhlCi0gKiBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBleGVjdXRlZCB1c2luZwotICoge0BsaW5rIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmR9LgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kIGV4dGVuZHMgQ3JlYXRlQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgY29waWVkCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKiAgICAgICAgICAgIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvcGllZCBvYmplY3RzCi0JICogICAgICAgICAgICBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjb3BpZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudENyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLCBFT2JqZWN0IG93bmVyLAotCQkJSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJc3VwZXIoZG9tYWluLCBvd25lciwgY29weUhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzdWx0IG9mIHRoZSBjb3B5IG9wZXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBjb3BpZWQgbWV0aG9kIGVsZW1lbnQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZG9HZXRSZXN1bHQoKSB7Ci0JCUNvbGxlY3Rpb24gY29sbGVjdGlvbiA9IHN1cGVyLmRvR2V0UmVzdWx0KCk7Ci0KLQkJaWYgKGRvbWFpbiBpbnN0YW5jZW9mIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbikgewotCQkJKChUcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4pIGRvbWFpbikuYWRkQ29weUluZm8oCi0JCQkJCWNvbGxlY3Rpb24sIGNvcHlIZWxwZXIpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL01ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjlkYWZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuSW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29weUNvbW1hbmQuSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmRvbWFpbi5FZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiBBIGNvbW1hbmQgdGhhdCB0YWtlcyBhbiB1bmluaXRpYWxpemVkIGNvcHkgb2YgYSBtZXRob2QgZWxlbWVudCBhbmQgc2V0cyBhIG5ldwotICogR1VJRC4gSWYgdGhlIG9yaWdpbmFsIGVsZW1lbnQgaXMgYSA8Y29kZT5Db250ZW50RWxlbWVudDwvY29kZT4gd2l0aCBhIHZhbGlkCi0gKiA8Y29kZT5Db250ZW50RGVzY3JpcHRpb248L2NvZGU+LCBhIGNvcHkgb2YgdGhlCi0gKiA8Y29kZT5Db250ZW50RGVzY3JpcHRpb248L2NvZGU+IGlzIGFsc28gY3JlYXRlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRJbml0aWFsaXplQ29weUNvbW1hbmQgZXh0ZW5kcyBJbml0aWFsaXplQ29weUNvbW1hbmQgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9tYWluCi0JICogICAgICAgICAgICB0aGUgZWRpdGluZyBkb21haW4KLQkgKiBAcGFyYW0gb3duZXIKLQkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgY29waWVkCi0JICogQHBhcmFtIGNvcHlIZWxwZXIKLQkgKiAgICAgICAgICAgIGEgaGVscGVyIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGNvcGllZCBvYmplY3RzCi0JICogICAgICAgICAgICBhbmQgdGhlaXIgYXNzb2NpYXRlZCBjb3BpZXMKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChFZGl0aW5nRG9tYWluIGRvbWFpbiwKLQkJCUVPYmplY3Qgb3duZXIsIEhlbHBlciBjb3B5SGVscGVyKSB7Ci0JCXN1cGVyKGRvbWFpbiwgb3duZXIsIGNvcHlIZWxwZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Jbml0aWFsaXplQ29weUNvbW1hbmQjZG9FeGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCXN1cGVyLmRvRXhlY3V0ZSgpOwotCi0JCS8vIGdlbmVyYXRlIG5ldyBHVUlEIGZvciB0aGUgY29weQotCQkvLwotCQlpZiAoY29weSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCU1ldGhvZEVsZW1lbnQgZSA9ICgoTWV0aG9kRWxlbWVudCkgY29weSk7Ci0JCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJCUVPYmplY3QgZUNvbnRhaW5lciA9IGUuZUNvbnRhaW5lcigpOwotCQkJCWlmIChlQ29udGFpbmVyIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKChNZXRob2RFbGVtZW50KSBlQ29udGFpbmVyKQotCQkJCQkJCS5nZXRHdWlkKCkpKTsKLQkJCQl9IGVsc2UgewotCQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQkJCVVtYUVkaXRQbHVnaW4uSU5TVEFOQ0UKLQkJCQkJCQkubG9nKCJNZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOiBlQ29udGFpbmVyIG5vdCBpbml0aWFsaXplZCBmb3IgIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllLnNldEd1aWQoVW1hVXRpbC5nZW5lcmF0ZUdVSUQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVyYXRlcyBvdmVyIHRoZSByZWZlcmVuY2VzIG9mIHRoZSBvd25lciBvYmplY3QgYW5kIHNldHMgdGhlbQotCSAqIGFjY29yZGluZ2x5IGluIHRoZSBjb3B5LiBJbmNsdWRlcyBjb3Bpbmcgb2Ygb3Bwb3NpdGUgZmVhdHVyZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvQ29weVJlZmVyZW5jZXMoKSB7Ci0JCWlmIChvd25lciBpbnN0YW5jZW9mIENvbnRlbnREZXNjcmlwdGlvbikgewotCQkJc3VwZXIuY29weVJlZmVyZW5jZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIHJlZmVyZW5jZXMgPSBnZXRSZWZlcmVuY2VzVG9Db3B5KCkuaXRlcmF0b3IoKTsgcmVmZXJlbmNlcwotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlFUmVmZXJlbmNlIHJlZmVyZW5jZSA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLm5leHQoKTsKLQkJCWlmICghcmVmZXJlbmNlLmlzQ2hhbmdlYWJsZSgpIHx8IHJlZmVyZW5jZS5pc0Rlcml2ZWQoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlFUmVmZXJlbmNlIHJldmVyc2VSZWZlcmVuY2UgPSByZWZlcmVuY2UuZ2V0RU9wcG9zaXRlKCk7Ci0KLQkJCU9iamVjdCB2YWx1ZSA9IG93bmVyLmVHZXQocmVmZXJlbmNlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSBPcHBvc2l0ZUZlYXR1cmUKLQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZShyZWZlcmVuY2UpOwotCQkJYm9vbGVhbiBjb3BpZWRUYXJnZXRSZXF1aXJlZCA9IHJldmVyc2VSZWZlcmVuY2UgIT0gbnVsbAotCQkJCQl8fCByZWZlcmVuY2UuaXNDb250YWlubWVudCgpCi0JCQkJCXx8IChvcHBvc2l0ZUZlYXR1cmUgIT0gbnVsbCAmJiAhb3Bwb3NpdGVGZWF0dXJlLmlzTWFueSgpKTsKLQkJCS8vICJtYW55IiBvcHBvc2l0ZSBmZWF0dXJlIGRvZXMgbm90IHJlcXVpcmUgY29waWVkIHRhcmdldCwgaXQgaXMKLQkJCS8vIHRyZWF0ZWQgYXMgYSByZWd1bGFyIG5vbi1jb250YWlubWVudCByZWZlcmVuY2UKLQkJCS8vIFRPRE86IGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBhcmUgbm90IGF1dG9tYXRpY2FsbHkgY29waWVkIGluCi0JCQkvLyBFTUYgaW1wbGVtZW50YXRpb24KLQkJCWlmIChyZWZlcmVuY2UuaXNNYW55KCkpIHsKLQkJCQlMaXN0IHZhbHVlTGlzdCA9IChMaXN0KSB2YWx1ZTsKLQkJCQlpZiAoIXZhbHVlTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkJRUxpc3QgY29weUxpc3QgPSAoRUxpc3QpIGNvcHkuZUdldChyZWZlcmVuY2UpOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKEl0ZXJhdG9yIHZhbHVlSXRlciA9IHZhbHVlTGlzdC5pdGVyYXRvcigpOyB2YWx1ZUl0ZXIKLQkJCQkJCQkuaGFzTmV4dCgpOyArK2luZGV4KSB7Ci0JCQkJCQlFT2JqZWN0IG9iamVjdCA9IG51bGw7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW9iamVjdCA9IChFT2JqZWN0KSB2YWx1ZUl0ZXIubmV4dCgpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlVbWFFZGl0UGx1Z2luLklOU1RBTkNFLmxvZyhlKTsKLQkJCQkJCX0KLQkJCQkJCUVPYmplY3QgdGFyZ2V0ID0gY29weUhlbHBlci5nZXRDb3B5VGFyZ2V0KG9iamVjdCwKLQkJCQkJCQkJY29waWVkVGFyZ2V0UmVxdWlyZWQpOwotCQkJCQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJaWYgKHJldmVyc2VSZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCWludCBwb3NpdGlvbiA9IGNvcHlMaXN0LmluZGV4T2YodGFyZ2V0KTsKLQkJCQkJCQlpZiAocG9zaXRpb24gPT0gLTEpIHsKLQkJCQkJCQkJY29weUxpc3QuYWRkKGluZGV4LCB0YXJnZXQpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWNvcHlMaXN0Lm1vdmUoaW5kZXgsIHRhcmdldCk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb3B5TGlzdC5hZGQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJRU9iamVjdCB0YXJnZXQgPSBjb3B5SGVscGVyLmdldENvcHlUYXJnZXQoKEVPYmplY3QpIHZhbHVlLAotCQkJCQkJY29waWVkVGFyZ2V0UmVxdWlyZWQpOwotCQkJCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJCQljb3B5LmVTZXQocmVmZXJlbmNlLCB0YXJnZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvcHlSZWZlcmVuY2VzKCkgewotCQlkb0NvcHlSZWZlcmVuY2VzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9jb21tYW5kL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDFlYjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2NvbW1hbmQvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgY29tbWFuZHMgZm9yIGNvcHlpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9UcmFjZWFibGVBZGFwdGVyRmFjdG9yeUVkaXRpbmdEb21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0OGRkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvZWRpdC9kb21haW4vVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0LmRvbWFpbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci0KLS8qKgotICogQSB0cmFjZWFibGUgYWRhcHRlciBmYWN0b3J5IGVkaXRpbmcgZG9tYWluIHVzZWQgZm9yIGNvcHlpbmcgbWV0aG9kIGVsZW1lbnRzLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIGV4dGVuZHMKLQkJQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluIHsKLQotCS8vIE1hcHMgY29waWVkIG1ldGhvZCBlbGVtZW50cyB0byB0aGVpciBvcmlnaW5hbCBjb3VudGVycGFydHMuCi0JLy8gTm90ZTogQ29waWVkIGVsZW1lbnRzIGFyZSBjb3BpZXMgb2YgdGhlIGNsaXBib2FyZCBjb3BpZXMuCi0JcHJpdmF0ZSBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PiBjb3B5VG9PcmlnaW5hbE1hcCA9IG51bGw7Ci0KLQkvLyBNYXBzIG9yaWdpbmFsIGVsZW1lbnRzIHRvIHRoZWlyIGNsaXBib2FyZCBjb3BpZXMuCi0JcHJpdmF0ZSBNYXA8T2JqZWN0LCBPYmplY3Q+IG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBudWxsOwotCQotCXByaXZhdGUgTWFwPEVPYmplY3QsIEVPYmplY3Q+IGNsaXBib2FyZFRvT3JpZ2luYWxNYXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyRmFjdG9yeQotCSAqICAgICAgICAgICAgYW4gYWRhcHRlciBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBhZGFwdGVyIHRvIHdoaWNoIGNhbGxzCi0JICogICAgICAgICAgICBhcmUgZGVsZWdhdGVkCi0JICogQHBhcmFtIGNvbW1hbmRTdGFjawotCSAqICAgICAgICAgICAgYSBjb21tYW5kIHN0YWNrCi0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIGNvbW1hbmRTdGFjayk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlckZhY3RvcnkKLQkgKiAgICAgICAgICAgIGFuIGFkYXB0ZXIgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgYWRhcHRlciB0byB3aGljaCBjYWxscwotCSAqICAgICAgICAgICAgYXJlIGRlbGVnYXRlZAotCSAqIEBwYXJhbSBjb21tYW5kU3RhY2sKLQkgKiAgICAgICAgICAgIGEgY29tbWFuZCBzdGFjawotCSAqIEBwYXJhbSByZXNvdXJjZVRvUmVhZE9ubHlNYXAKLQkgKiAgICAgICAgICAgIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGRvbWFpbiBpcyByZWFkIG9ubHkKLQkgKi8KLQlwdWJsaWMgVHJhY2VhYmxlQWRhcHRlckZhY3RvcnlFZGl0aW5nRG9tYWluKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LAotCQkJQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaywgTWFwIHJlc291cmNlVG9SZWFkT25seU1hcCkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSwgY29tbWFuZFN0YWNrLCByZXNvdXJjZVRvUmVhZE9ubHlNYXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICogICAgICAgICAgICBhbiBhZGFwdGVyIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgdG8gd2hpY2ggY2FsbHMKLQkgKiAgICAgICAgICAgIGFyZSBkZWxlZ2F0ZWQKLQkgKiBAcGFyYW0gY29tbWFuZFN0YWNrCi0JICogICAgICAgICAgICBhIGNvbW1hbmQgc3RhY2sKLQkgKiBAcGFyYW0gcmVzb3VyY2VTZXQKLQkgKiAgICAgICAgICAgIGEgcmVzb3VyY2Ugc2V0Ci0JICovCi0JcHVibGljIFRyYWNlYWJsZUFkYXB0ZXJGYWN0b3J5RWRpdGluZ0RvbWFpbihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSwKLQkJCUNvbW1hbmRTdGFjayBjb21tYW5kU3RhY2ssIFJlc291cmNlU2V0IHJlc291cmNlU2V0KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5LCBjb21tYW5kU3RhY2ssIHJlc291cmNlU2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIGNvbnRhaW5pbmcgdGhlIGNvcGllZCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgb3JpZ2luYWwKLQkgKiBjb3VudGVycGFydHMuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBjb3BpZWQgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIG9yaWdpbmFsCi0JICogICAgICAgICBjb3VudGVycGFydHMKLQkgKi8KLQlwdWJsaWMgTWFwPD8sID8+IGdldENvcHlUb09yaWdpbmFsTWFwKCkgewotCQlpZiAoY29weVRvT3JpZ2luYWxNYXAgPT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKLQkJfQotCQlyZXR1cm4gY29weVRvT3JpZ2luYWxNYXA7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZWxlbWVudHMgbWFwcGVkIHRvIHRoZWlyIGNvcGllZCAKLQkgKiBjb3VudGVycGFydHMgb24gY2xpcGJvYXJkCi0JICogCi0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBvcmlnaW5hbCBlbGVtZW50cyBtYXBwZWQgdG8gdGhlaXIgY29waWVkIAotCSAqICAgICAgICAgY291bnRlcnBhcnRzCi0JICovCi0JcHVibGljIE1hcCBnZXRPcmlnaW5hbFRvQ2xpcGJvYXJkTWFwKCkgewotCQlpZiAob3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9PSBudWxsKSB7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQlyZXR1cm4gb3JpZ2luYWxUb0NsaXBib2FyZE1hcDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IHRoZSBDcmVhdGVDb3B5Q29tbWFuZC4gQWRkcyBpbmZvbWF0aW9uIHRvIGNvbnN0cnVjdCBtYXBzIHRoYXQKLQkgKiBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBtZXRob2QgZWxlbWVudHMgYW5kIHRoZWlyIGNvcGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gYwotCSAqICAgICAgICAgICAgYSBjb2xsZWN0aW9uIHRvIHN0b3JlIHRoZSBtYXBwaW5nIGluZm8KLQkgKiBAcGFyYW0gY29weUhlbHBlcgotCSAqICAgICAgICAgICAgYSBoZWxwZXIgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgY29waWVkIG9iamVjdHMKLQkgKiAgICAgICAgICAgIGFuZCB0aGVpciBhc3NvY2lhdGVkIGNvcGllcwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvcHlJbmZvKENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJaWYgKGlzTmV3Q29weShjLCBjb3B5SGVscGVyKSkgewotCQkJYWRkTmV3Q29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWNoYWluQ29weShjLCBjb3B5SGVscGVyKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgZWxlbWVudCB0aGF0IGlzIGJlaW5nIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROZXdDb3B5KENvbGxlY3Rpb24gYywgSGVscGVyIGNvcHlIZWxwZXIpIHsKLQkJLy8gdGhpcyBtZWFucyB3ZSBhcmUgY29weWluZyB0aGUgQ29sbGVjdGlvbiBjIHRvIHRoZSBjbGlwYm9hcmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlpZihjbGlwYm9hcmRUb09yaWdpbmFsTWFwID09IG51bGwpIHsKLQkJCWNsaXBib2FyZFRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcDxFT2JqZWN0LCBFT2JqZWN0PigpOwotCQl9Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBjb3B5SGVscGVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJRU9iamVjdCBrZXkgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0JCQlFT2JqZWN0IHZhbHVlID0gKEVPYmplY3QpIGNvcHlIZWxwZXIuZ2V0KGtleSk7Ci0JCQlvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLnB1dChrZXksIHZhbHVlKTsKLQkJCWNsaXBib2FyZFRvT3JpZ2luYWxNYXAucHV0KHZhbHVlLCBrZXkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG1hcCBmcm9tIHRoZSBjb3BpZWQgZWxlbWVudHMgdG8gdGhlaXIgb3JpZ2luYWwgY291bnRlcnBhcnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFpbkNvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBjaGFpbiB0aGUgbWFwcyAtIGNoYW5nZSB0aGUgY29weVRvT3JpZ2luYWxNYXAKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJaWYgKGNvcHlUb09yaWdpbmFsTWFwID09IG51bGwpCi0JCQkJY29weVRvT3JpZ2luYWxNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJSXRlcmF0b3IgaXRlciA9IG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvMkNLZXkgPSBpdGVyLm5leHQoKTsKLQkJCQlPYmplY3QgbzJDVmFsdWUgPSBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwLmdldChvMkNLZXkpOwotCQkJCU9iamVjdCBjb3B5VmFsdWUgPSBjb3B5SGVscGVyLmdldChvMkNWYWx1ZSk7Ci0JCQkJaWYgKGNvcHlWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGVycm9yCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAobzJDS2V5IGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkKLQkJCQkJY29weVRvT3JpZ2luYWxNYXAucHV0KGNvcHlWYWx1ZSwgbzJDS2V5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc05ld0NvcHkoQ29sbGVjdGlvbiBjLCBIZWxwZXIgY29weUhlbHBlcikgewotCQkvLyBvcmlnaW5hbFRvQ2xpcGJvYXJkTWFwIHdhcyBzZXQgdG8gbnVsbCBhdCBzdGFydCBvZiBjb3B5IGNvbW1hbmQKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGl0ZXJhdGUgdGhyb3VnaCBjb3B5SGVscGVyIG1hcCwgc2VlIGlmIGFueSBjb3B5SGVscGVyIGtleXMgYXJlIG8yQwotCQkvLyB2YWx1ZXMsIHdoaWNoIG1lYW5zIHdlIGFyZSBjb3B5aW5nIGNsaXBib2FyZAotCQlJdGVyYXRvciBpdGVyID0gY29weUhlbHBlci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBjbGlwS2V5ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIW9yaWdpbmFsVG9DbGlwYm9hcmRNYXAuY29udGFpbnNWYWx1ZShjbGlwS2V5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgY29weSBtYXBzLiBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGhpbiB0aGUgY29weSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRDb3B5TWFwcygpIHsKLQkJaWYgKG9yaWdpbmFsVG9DbGlwYm9hcmRNYXAgIT0gbnVsbCkgewotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcC5jbGVhcigpOwotCQkJb3JpZ2luYWxUb0NsaXBib2FyZE1hcCA9IG51bGw7Ci0JCX0KLQkJaWYoY2xpcGJvYXJkVG9PcmlnaW5hbE1hcCAhPSBudWxsKSB7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwLmNsZWFyKCk7Ci0JCQljbGlwYm9hcmRUb09yaWdpbmFsTWFwID0gbnVsbDsKLQkJfQotCQlpZiAoY29weVRvT3JpZ2luYWxNYXAgIT0gbnVsbCkgewotCQkJY29weVRvT3JpZ2luYWxNYXAuY2xlYXIoKTsKLQkJCWNvcHlUb09yaWdpbmFsTWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBNYXA8RU9iamVjdCwgRU9iamVjdD4gZ2V0Q2xpcGJvYXJkVG9PcmlnaW5hbE1hcCgpIHsKLQkJcmV0dXJuIGNsaXBib2FyZFRvT3JpZ2luYWxNYXA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9lZGl0L2RvbWFpbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWVhNzMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2VkaXQvZG9tYWluL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPGh0bWw+Ci08Ym9keT4KLVByb3ZpZGVzIHRoZSBkZWZhdWx0IGVkaXRpbmcgZG9tYWluIGZvciB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMmFhMTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIb3d0b1N0YWZmUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3B1cnBvc2VfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFsdGVybmF0aXZlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFsdGVybmF0aXZlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2FsdGVybmF0aXZlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEhvd3RvIFN0YWZmIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSG93dG9TdGFmZlByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX2hvd3RvU3RhZmZfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBBY3Rpdml0eURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FjdGl2aXR5RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHlEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BY3Rpdml0eUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNDc5NGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FjdGl2aXR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSb2FkbWFwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRnVsZmlsbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGdWxmaWxsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfZnVsZmlsbHNfZmVhdHVyZSIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyZWFrZG93bkVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X2JyZWFrZG93bkVsZW1lbnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfZmVhdHVyZSIsICJfVUlfQWN0aXZpdHlfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9hZG1hcHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2FkbWFwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BY3Rpdml0eV9yb2FkbWFwc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FjdGl2aXR5X3JvYWRtYXBzX2ZlYXR1cmUiLCAiX1VJX0FjdGl2aXR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX1JPQURNQVBTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQWN0aXZpdHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQWN0aXZpdHkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQWN0aXZpdHkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQWN0aXZpdHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FjdGl2aXR5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBY3Rpdml0eS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnN0cmFpbnQoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGMwMDJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ2xhc3NpZmllckl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzUHJpbWFyeUV4dGVuc2lvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgUHJpbWFyeSBFeHRlbnNpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1ByaW1hcnlFeHRlbnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9faXNQcmltYXJ5RXh0ZW5zaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXBwbGljYWJsZU1ldGFDbGFzc0luZm9faXNQcmltYXJ5RXh0ZW5zaW9uX2ZlYXR1cmUiLCAiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjYzYjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEJyaWVmT3V0bGluZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVwcmVzZW50YXRpb25PcHRpb25zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTm90YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJyaWVmIE91dGxpbmUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCcmllZk91dGxpbmVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9icmllZk91dGxpbmVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX2JyaWVmT3V0bGluZV9mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVwcmVzZW50YXRpb24gT3B0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcHJlc2VudGF0aW9uT3B0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uT3B0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25PcHRpb25zX2ZlYXR1cmUiLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXByZXNlbnRhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcHJlc2VudGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fcmVwcmVzZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3JlcHJlc2VudGF0aW9uX2ZlYXR1cmUiLCAiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTm90YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX25vdGF0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQXJ0aWZhY3REZXNjcmlwdGlvbl9ub3RhdGlvbl9mZWF0dXJlIiwgIl9VSV9BcnRpZmFjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEFydGlmYWN0RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQXJ0aWZhY3REZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChBcnRpZmFjdERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9BcnRpZmFjdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmNkODAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0FydGlmYWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3RJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQXJ0aWZhY3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQXJ0aWZhY3QiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQXJ0aWZhY3QpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQXJ0aWZhY3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0FydGlmYWN0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChBcnRpZmFjdC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXJ0aWZhY3QoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNTJlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXNhZ2VHdWlkYW5jZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVXNhZ2UgR3VpZGFuY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2FnZUd1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl91c2FnZUd1aWRhbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3VzYWdlR3VpZGFuY2VfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9CcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYmM5MjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcmVmaXhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzUGxhbm5lZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSXNPcHRpb25hbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlc2VudGVkQWZ0ZXJQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByZXNlbnRlZEJlZm9yZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwZXJBY3Rpdml0aWVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb25jZXB0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRXhhbXBsZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJldXNhYmxlQXNzZXRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwb3J0aW5nTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpb25jb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVG9vbG1lbnRvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlZml4IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlZml4UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlZml4X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVmaXhfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgUGxhbm5lZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzUGxhbm5lZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2lzUGxhbm5lZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaXNQbGFubmVkX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBIYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfaGFzTXVsdGlwbGVPY2N1cnJlbmNlc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBPcHRpb25hbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzT3B0aW9uYWxQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9pc09wdGlvbmFsX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlc2VudGVkIEFmdGVyIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGVkQWZ0ZXJQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRBZnRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQWZ0ZXJfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVzZW50ZWQgQmVmb3JlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGVkQmVmb3JlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcHJlc2VudGVkQmVmb3JlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9wcmVzZW50ZWRCZWZvcmVfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwZXIgQWN0aXZpdGllcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cGVyQWN0aXZpdGllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X3N1cGVyQWN0aXZpdGllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfc3VwZXJBY3Rpdml0aWVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoZWNrbGlzdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGVja2xpc3RzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb25jZXB0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbmNlcHRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfY29uY2VwdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2NvbmNlcHRzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeGFtcGxlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfZXhhbXBsZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkZWxpbmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZGVsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9CcmVha2Rvd25FbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmV1c2FibGUgQXNzZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmV1c2FibGVBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9yZXVzYWJsZUFzc2V0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmV1c2FibGVBc3NldHNfZmVhdHVyZSIsICJfVUlfQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQnJlYWtkb3duRWxlbWVudF9zdXBwb3J0aW5nTWF0ZXJpYWxzX2ZlYXR1cmUiLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZW1wbGF0ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF90ZW1wbGF0ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3RlbXBsYXRlc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcG9ydHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXBvcnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmVwb3J0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfcmVwb3J0c19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQnJlYWtkb3duRWxlbWVudF9lc3RpbWF0aW9uY29uc2lkZXJhdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X2VzdGltYXRpb25jb25zaWRlcmF0aW9uc19mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRvb2xtZW50b3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sbWVudG9yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdG9vbG1lbnRvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0JyZWFrZG93bkVsZW1lbnRfdG9vbG1lbnRvcl9mZWF0dXJlIiwgIl9VSV9CcmVha2Rvd25FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1IsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChCcmVha2Rvd25FbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEJyZWFrZG93bkVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUGxhbm5pbmdEYXRhKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVmMzUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDYXBhYmlsaXR5UGF0dGVybi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DYXBhYmlsaXR5UGF0dGVybiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDYXBhYmlsaXR5UGF0dGVybikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DYXBhYmlsaXR5UGF0dGVybl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ2FwYWJpbGl0eVBhdHRlcm5fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DaGVja2xpc3RJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DaGVja2xpc3RJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5MmNhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2hlY2tsaXN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDaGVja2xpc3QuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ2hlY2tsaXN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENoZWNrbGlzdCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DaGVja2xpc3RfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NoZWNrbGlzdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NsYXNzaWZpZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3MjE3ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ2xhc3NpZmllckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2lmaWVySXRlbVByb3ZpZGVyIGV4dGVuZHMgVHlwZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENsYXNzaWZpZXJJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgQWJzdHJhY3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0Fic3RyYWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiwgIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ2xhc3NpZmllcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDbGFzc2lmaWVyLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZGU4NjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZ2dyZWdhdGVkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFnZ3JlZ2F0ZWQgUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZ2dyZWdhdGVkUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29tcG9zaXRlUm9sZV9hZ2dyZWdhdGVkUm9sZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db21wb3NpdGVSb2xlX2FnZ3JlZ2F0ZWRSb2xlc19mZWF0dXJlIiwgIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb21wb3NpdGVSb2xlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbXBvc2l0ZVJvbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29tcG9zaXRlUm9sZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db21wb3NpdGVSb2xlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uY2VwdEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzQxODNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db25jZXB0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbmNlcHRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbmNlcHRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgQ29uY2VwdC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Db25jZXB0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbmNlcHQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ29uY2VwdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnN0cmFpbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MGIyMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29uc3RyYWludEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdHJhaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQm9keVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQm9keSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJvZHlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29uc3RyYWludF9ib2R5X2ZlYXR1cmUiLCAiX1VJX0NvbnN0cmFpbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05TVFJBSU5UX19CT0RZLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnN0cmFpbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29uc3RyYWludCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb25zdHJhaW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnN0cmFpbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKENvbnN0cmFpbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg0MGVkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDb250ZW50Q2F0ZWdvcnkpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudENhdGVnb3J5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50Q2F0ZWdvcnlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODA1NDkwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWFpbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeHRlcm5hbElkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRLZXlDb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTG9uZ1ByZXNlbnRhdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1haW4gRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYWluRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX21haW5EZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl9tYWluRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBJZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsSWRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudERlc2NyaXB0aW9uX2V4dGVybmFsSWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fZXh0ZXJuYWxJZF9mZWF0dXJlIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLZXkgQ29uc2lkZXJhdGlvbnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRLZXlDb25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fa2V5Q29uc2lkZXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIExvbmcgUHJlc2VudGF0aW9uIE5hbWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMb25nUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RGVzY3JpcHRpb25fbG9uZ1ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfQ29udGVudERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDb250ZW50RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvQ29udGVudERlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnREZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Db250ZW50RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnREZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudERlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3RlcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQxMDg1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFZhcmlhYmlsaXR5VHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3VwcG9ydGluZ01hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29uY2VwdHNBbmRQYXBlcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoZWNrbGlzdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEd1aWRlbGluZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEV4YW1wbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3NldHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRlcm1kZWZpbml0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29uY2VwdHMgQW5kIFBhcGVycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbmNlcHRzQW5kUGFwZXJzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2NvbmNlcHRzQW5kUGFwZXJzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfY29uY2VwdHNBbmRQYXBlcnNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGVja2xpc3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hlY2tsaXN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9jaGVja2xpc3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ29udGVudEVsZW1lbnRfY2hlY2tsaXN0c19mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEd1aWRlbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHdWlkZWxpbmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X2d1aWRlbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9ndWlkZWxpbmVzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXhhbXBsZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFeGFtcGxlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9leGFtcGxlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X2V4YW1wbGVzX2ZlYXR1cmUiLCAiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFzc2V0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2V0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF9hc3NldHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0FTU0VUUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlcm1kZWZpbml0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGVybWRlZmluaXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfdGVybWRlZmluaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Db250ZW50RWxlbWVudF90ZXJtZGVmaW5pdGlvbl9mZWF0dXJlIiwgIl9VSV9Db250ZW50RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdXBwb3J0aW5nIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRpbmdNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfc3VwcG9ydGluZ01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvbnRlbnRFbGVtZW50X3N1cHBvcnRpbmdNYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoQ29udGVudEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfQ29udGVudEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0NvbnRlbnRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChDb250ZW50RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWRhM2RkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db250ZW50UGFja2FnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvbnRlbnRQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvbnRlbnRQYWNrYWdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvbnRlbnRQYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvbnRlbnRQYWNrYWdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db250ZW50UGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoQ29udGVudFBhY2thZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlS2luZCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25jZXB0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDaGVja2xpc3QoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUd1aWRlbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhhbXBsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmV1c2FibGVBc3NldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVybURlZmluaXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBcnRpZmFjdCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVwb3J0KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZW1wbGF0ZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbE1lbnRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZWxpdmVyYWJsZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlT3V0Y29tZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2hpdGVwYXBlcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFzaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRG9tYWluKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmVHcm91cGluZygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzY2lwbGluZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9hZG1hcCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVG9vbCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDdXN0b21DYXRlZ29yeSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJhY3RpY2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGIxZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfZWxlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX2VsZW1lbnRfZmVhdHVyZSIsICJfVUlfQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQ0NmZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9DdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ3VzdG9tQ2F0ZWdvcnlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2F0ZWdvcml6ZWRFbGVtZW50c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2F0ZWdvcml6ZWQgRWxlbWVudHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXRlZ29yaXplZEVsZW1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0N1c3RvbUNhdGVnb3J5X2NhdGVnb3JpemVkRWxlbWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9DdXN0b21DYXRlZ29yeV9jYXRlZ29yaXplZEVsZW1lbnRzX2ZlYXR1cmUiLCAiX1VJX0N1c3RvbUNhdGVnb3J5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1YiBDYXRlZ29yaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3ViQ2F0ZWdvcmllc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV9zdWJDYXRlZ29yaWVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfQ3VzdG9tQ2F0ZWdvcnlfc3ViQ2F0ZWdvcmllc19mZWF0dXJlIiwgIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBDdXN0b21DYXRlZ29yeS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9DdXN0b21DYXRlZ29yeSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChDdXN0b21DYXRlZ29yeSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9DdXN0b21DYXRlZ29yeV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfQ3VzdG9tQ2F0ZWdvcnlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjRhMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEV4dGVybmFsRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFBhY2thZ2luZ0d1aWRhbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFeHRlcm5hbCBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVybmFsRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9leHRlcm5hbERlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGFja2FnaW5nIEd1aWRhbmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFja2FnaW5nR3VpZGFuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl9wYWNrYWdpbmdHdWlkYW5jZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25fcGFja2FnaW5nR3VpZGFuY2VfZmVhdHVyZSIsICJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiMThlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciBleHRlbmRzIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGVsaXZlcmVkV29ya1Byb2R1Y3RzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBEZWxpdmVyZWQgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlbGl2ZXJlZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyYWJsZV9kZWxpdmVyZWRXb3JrUHJvZHVjdHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcmFibGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyYWJsZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EZWxpdmVyYWJsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChEZWxpdmVyYWJsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyYWJsZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcmFibGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNzBhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSaXNrTGV2ZWxQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEVzdGltYXRpbmdUZWNobmlxdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFByb2plY3RNZW1iZXJFeHBlcnRpc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFR5cGVPZkNvbnRyYWN0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTY2FsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjYWxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3NjYWxlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fc2NhbGVfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9qZWN0IENoYXJhY3RlcmlzdGljcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByb2plY3RDaGFyYWN0ZXJpc3RpY3NQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdENoYXJhY3RlcmlzdGljc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Byb2plY3RDaGFyYWN0ZXJpc3RpY3NfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSaXNrIExldmVsIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmlza0xldmVsUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3Jpc2tMZXZlbF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGluZyBUZWNobmlxdWUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFc3RpbWF0aW5nVGVjaG5pcXVlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX2VzdGltYXRpbmdUZWNobmlxdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9lc3RpbWF0aW5nVGVjaG5pcXVlX2ZlYXR1cmUiLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvamVjdE1lbWJlckV4cGVydGlzZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fcHJvamVjdE1lbWJlckV4cGVydGlzZV9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIE9mIENvbnRyYWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU9mQ29udHJhY3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZU9mQ29udHJhY3RfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlT2ZDb250cmFjdF9mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmODhkOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEVkdWNhdGlvbk1hdGVyaWFsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEVkdWNhdGlvbiBNYXRlcmlhbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFZHVjYXRpb25NYXRlcmlhbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVsaXZlcnlQcm9jZXNzX2VkdWNhdGlvbk1hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19lZHVjYXRpb25NYXRlcmlhbHNfZmVhdHVyZSIsICJfVUlfRGVsaXZlcnlQcm9jZXNzX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENvbW11bmljYXRpb25zIE1hdGVyaWFscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbW11bmljYXRpb25zTWF0ZXJpYWxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RlbGl2ZXJ5UHJvY2Vzc19jb21tdW5pY2F0aW9uc01hdGVyaWFsc19mZWF0dXJlIiwgIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZWxpdmVyeVByb2Nlc3MuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVsaXZlcnlQcm9jZXNzIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlbGl2ZXJ5UHJvY2Vzcykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZWxpdmVyeVByb2Nlc3NfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RlbGl2ZXJ5UHJvY2Vzc190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQxNWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaWJhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNBYnN0cmFjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGROb2RlaWNvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgQWJzdHJhY3QgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0Fic3RyYWN0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0NsYXNzaWZpZXJfaXNBYnN0cmFjdF9mZWF0dXJlIiwgIl9VSV9DbGFzc2lmaWVyX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2hhcGVpY29uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2hhcGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9zaGFwZWljb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfc2hhcGVpY29uX2ZlYXR1cmUiLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBOb2RlaWNvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGVpY29uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF9ub2RlaWNvbl9mZWF0dXJlIiwgIl9VSV9EZXNjcmliYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGVzY3JpYmFibGVFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0Rlc2NyaWJhYmxlRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpYmFibGVFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE0M2Y0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzCi0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmluZWQgRGVzY3JpcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZpbmVkRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3JlZmluZWREZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl9yZWZpbmVkRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvckRlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEZXNjcmlwdG9yRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGVzY3JpcHRvckRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EZXNjcmlwdG9yRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxYWFjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EZXNjcmlwdG9yX2lzU3luY2hyb25pemVkV2l0aFNvdXJjZV9mZWF0dXJlIiwgIl9VSV9EZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTFmMjFhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZElzVmlzaWJsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBWaXNpYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNWaXNpYmxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1FbGVtZW50X2lzVmlzaWJsZV9mZWF0dXJlIiwgIl9VSV9EaWFncmFtRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2UgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbUVsZW1lbnRfcmVmZXJlbmNlX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9wZXJ0eSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2RjZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpYWdyYW1JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbUl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRGlhZ3JhbUxpbmtQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZpZXdwb2ludFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWm9vbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV96b29tX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19aT09NLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmlld3BvaW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlld3BvaW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fdmlld3BvaW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlhZ3JhbV92aWV3cG9pbnRfZmVhdHVyZSIsICJfVUlfRGlhZ3JhbV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fX1ZJRVdQT0lOVCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpYWdyYW0gTGluayBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERpYWdyYW1MaW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1fZGlhZ3JhbUxpbmtfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtX2RpYWdyYW1MaW5rX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19ESUFHUkFNX0xJTkssIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaWFncmFtLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0RpYWdyYW0iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0UsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9fTkFNRVNQQUNFLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFkKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX19OQU1FU1BBQ0U7Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlhZ3JhbUxpbmtJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjU0NjUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaWFncmFtTGlua0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmt9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1MaW5rSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRab29tUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWaWV3cG9ydFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGlhZ3JhbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgWm9vbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFpvb21Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfem9vbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX3pvb21fZmVhdHVyZSIsICJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0xJTktfX1pPT00sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmlld3BvcnQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaWV3cG9ydFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaWFncmFtTGlua192aWV3cG9ydF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0RpYWdyYW1MaW5rX3ZpZXdwb3J0X2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERpYWdyYW0gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaWFncmFtUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX2RpYWdyYW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaWFncmFtTGlua19kaWFncmFtX2ZlYXR1cmUiLCAiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LX19ESUFHUkFNLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlhZ3JhbUxpbmsuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlhZ3JhbUxpbmsiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRGlhZ3JhbUxpbmspIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlhZ3JhbUxpbmtfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RpYWdyYW1MaW5rX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaWFncmFtTGluay5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGltZW5zaW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGltZW5zaW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkY2Y0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0RpbWVuc2lvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaW1lbnNpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdpZHRoUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRIZWlnaHRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFdpZHRoIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV2lkdGhQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGltZW5zaW9uX3dpZHRoX2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fV0lEVEgsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSGVpZ2h0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSGVpZ2h0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0RpbWVuc2lvbl9oZWlnaHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaW1lbnNpb25faGVpZ2h0X2ZlYXR1cmUiLCAiX1VJX0RpbWVuc2lvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJTUVOU0lPTl9fSEVJR0hULCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIERpbWVuc2lvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaW1lbnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvdWJsZSBsYWJlbFZhbHVlID0gKChEaW1lbnNpb24pIG9iamVjdCkuZ2V0V2lkdGgoKTsKLQkJU3RyaW5nIGxhYmVsID0gbGFiZWxWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGxhYmVsVmFsdWUudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0RpbWVuc2lvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGltZW5zaW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChEaW1lbnNpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYxM2JkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9EaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGlzY2lwbGluZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREaXNjaXBsaW5lc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfZGlzY2lwbGluZXNfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZUdyb3VwaW5nX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEaXNjaXBsaW5lR3JvdXBpbmcuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRGlzY2lwbGluZUdyb3VwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc2NpcGxpbmVHcm91cGluZykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lR3JvdXBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVHcm91cGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0Rpc2NpcGxpbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI5MjNiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRGlzY2lwbGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGlzY2lwbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGFza3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZVdvcmtmbG93c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGFza3MgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYXNrc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9EaXNjaXBsaW5lX3Rhc2tzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZV90YXNrc19mZWF0dXJlIiwgIl9VSV9EaXNjaXBsaW5lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fVEFTS1MsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWZlcmVuY2UgV29ya2Zsb3dzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVmZXJlbmNlV29ya2Zsb3dzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rpc2NpcGxpbmVfcmVmZXJlbmNlV29ya2Zsb3dzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGlzY2lwbGluZV9yZWZlcmVuY2VXb3JrZmxvd3NfZmVhdHVyZSIsICJfVUlfRGlzY2lwbGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRGlzY2lwbGluZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9EaXNjaXBsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERpc2NpcGxpbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfRGlzY2lwbGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRGlzY2lwbGluZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURpc2NpcGxpbmUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Eb21haW5JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4NTE0MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRG9tYWluSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRG9tYWluSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Eb21haW5fd29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRG9tYWluX3dvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9Eb21haW5fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1dPUktfUFJPRFVDVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1NVQkRPTUFJTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBEb21haW4uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRG9tYWluIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKERvbWFpbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Eb21haW5fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0RvbWFpbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoRG9tYWluLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9NQUlOX19TVUJET01BSU5TLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZURvbWFpbigpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNWI2ZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm92aWRlckFkYXB0ZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBJdGVtUHJvdmlkZXJBZGFwdGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0VsZW1lbnRfdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VsbGlwc2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhNjg0Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRWxsaXBzZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsbGlwc2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQ2VudGVyUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSYWRpdXNYUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSYWRpdXNZUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSb3RhdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3RhcnRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRW5kQW5nbGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENlbnRlciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENlbnRlclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX2NlbnRlcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0VsbGlwc2VfY2VudGVyX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19DRU5URVIsIHRydWUsIGZhbHNlLCB0cnVlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1hQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNYX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSYWRpdXMgWSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJhZGl1c1lQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9yYWRpdXNZX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19SQURJVVNfWSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb3RhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJvdGF0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2Vfcm90YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9FbGxpcHNlX3JvdGF0aW9uX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19ST1RBVElPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdGFydCBBbmdsZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0QW5nbGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9zdGFydEFuZ2xlX2ZlYXR1cmUiLCAiX1VJX0VsbGlwc2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5FTExJUFNFX19TVEFSVF9BTkdMRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFbmQgQW5nbGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRBbmdsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9FbGxpcHNlX2VuZEFuZ2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRWxsaXBzZV9lbmRBbmdsZV9mZWF0dXJlIiwgIl9VSV9FbGxpcHNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRV9fRU5EX0FOR0xFLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEVsbGlwc2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvRWxsaXBzZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFbGxpcHNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0VsbGlwc2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0VsbGlwc2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEVsbGlwc2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTUwZmEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9FeGFtcGxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDg1MGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0V4YW1wbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXhhbXBsZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBFeGFtcGxlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0V4YW1wbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoRXhhbXBsZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9FeGFtcGxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9GdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9GdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzODA5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvRnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlEZXNjcmliYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZ1bGZpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgRnVsZmlsbGFibGVFbGVtZW50LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0Z1bGZpbGxhYmxlRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChGdWxmaWxsYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4MDQxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciBleHRlbmRzIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoQ29ubmVjdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEdyYXBoRWRnZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR3JhcGggRWRnZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdyYXBoRWRnZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaENvbm5lY3Rvcl9ncmFwaEVkZ2VfZmVhdHVyZSIsICJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBHcmFwaENvbm5lY3Rvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaENvbm5lY3RvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaENvbm5lY3Rvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaENvbm5lY3Rvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhDb25uZWN0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWRnZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThhNDlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQW5jaG9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBbmNob3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbmNob3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX2FuY2hvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0dyYXBoRWRnZV9hbmNob3JfZmVhdHVyZSIsICJfVUlfR3JhcGhFZGdlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fQU5DSE9SLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3JhcGhFZGdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0dyYXBoRWRnZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHcmFwaEVkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3JhcGhFZGdlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKEdyYXBoRWRnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VER0VfX1dBWVBPSU5UUywgVW1hRmFjdG9yeS5lSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVQb2ludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVECi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fTElOSwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0dyYXBoRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU4YTQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHcmFwaEVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUG9zaXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQb3NpdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HcmFwaEVsZW1lbnRfcG9zaXRpb25fZmVhdHVyZSIsICJfVUlfR3JhcGhFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04sIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19MSU5LKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChHcmFwaEVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhOb2RlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZWZlcmVuY2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb3BlcnR5KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaWFncmFtTGluaygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlR3JhcGhDb25uZWN0b3IoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoRWRnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUZXh0RWxlbWVudCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW1hZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVELAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBvbHlsaW5lKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbGxpcHNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTkssIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlRGlhZ3JhbUxpbmsoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUdyYXBoQ29ubmVjdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaE5vZGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU5NGEyMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhOb2RlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3JhcGhOb2RlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNpemVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFNpemUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTaXplUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0dyYXBoTm9kZV9zaXplX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfR3JhcGhOb2RlX3NpemVfZmVhdHVyZSIsICJfVUlfR3JhcGhOb2RlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfTk9ERV9fU0laRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEdyYXBoTm9kZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HcmFwaE5vZGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhOb2RlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0dyYXBoTm9kZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3JhcGhOb2RlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWQotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRAotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlRfX0xJTksKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjk0Y2VhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HcmFwaGljUHJpbWl0aXZlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoaWNQcmltaXRpdmVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3JhcGhpY1ByaW1pdGl2ZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9HcmFwaGljUHJpbWl0aXZlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzNlZmQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBdHRhY2htZW50cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF0dGFjaG1lbnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fYXR0YWNobWVudHNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9HdWlkYW5jZURlc2NyaXB0aW9uX2F0dGFjaG1lbnRzX2ZlYXR1cmUiLCAiX1VJX0d1aWRhbmNlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgR3VpZGFuY2VEZXNjcmlwdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkYW5jZURlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEd1aWRhbmNlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvR3VpZGFuY2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjA1OGM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkYW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChHdWlkYW5jZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9HdWlkYW5jZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGFuY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRlbGluZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0d1aWRlbGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGNlYjY5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9HdWlkZWxpbmVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGVsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIEd1aWRlbGluZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9HdWlkZWxpbmUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoR3VpZGVsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0d1aWRlbGluZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfR3VpZGVsaW5lX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JbWFnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTNhZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0ltYWdlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSW1hZ2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBMZWFmRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEltYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFVyaSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVyaVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV91cmlfZmVhdHVyZSIsICJfVUlfSW1hZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5JTUFHRV9fVVJJLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWltZSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWltZVR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfbWltZVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9JbWFnZV9taW1lVHlwZV9mZWF0dXJlIiwgIl9VSV9JbWFnZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLklNQUdFX19NSU1FX1RZUEUsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSW1hZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvSW1hZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoSW1hZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSW1hZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX0ltYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChJbWFnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JdGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9JdGVyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3NWE0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvSXRlcmF0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSXRlcmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQWN0aXZpdHlJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJdGVyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgSXRlcmF0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L0l0ZXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChJdGVyYXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfSXRlcmF0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9JdGVyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9LaW5kSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvS2luZEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY2YWQ3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9LaW5kSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgS2luZC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9LaW5kIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKEtpbmQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfS2luZF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfS2luZF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoS2luZC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9MZWFmRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjRjZTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL0xlYWZFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGVhZkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKExlYWZFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX0xlYWZFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9MZWFmRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNzQxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTWV0aG9kUGx1Z2luU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNZXRob2RQYWNrYWdlU2VsZWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcm9jZXNzVmlld3NQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZERlZmF1bHRWaWV3UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCYXNlQ29uZmlndXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1YnRyYWN0ZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBsdWdpbiBTZWxlY3Rpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRob2RQbHVnaW5TZWxlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9tZXRob2RQbHVnaW5TZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBsdWdpblNlbGVjdGlvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0aG9kUGFja2FnZVNlbGVjdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX21ldGhvZFBhY2thZ2VTZWxlY3Rpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9jZXNzIFZpZXdzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvY2Vzc1ZpZXdzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fcHJvY2Vzc1ZpZXdzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9wcm9jZXNzVmlld3NfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVmYXVsdCBWaWV3IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFZpZXdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9kZWZhdWx0Vmlld19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fZGVmYXVsdFZpZXdfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlIENvbmZpZ3VyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZUNvbmZpZ3VyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fYmFzZUNvbmZpZ3VyYXRpb25zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl9iYXNlQ29uZmlndXJhdGlvbnNfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VidHJhY3RlZCBDYXRlZ29yeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YnRyYWN0ZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX3N1YnRyYWN0ZWRDYXRlZ29yeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fc3VidHJhY3RlZENhdGVnb3J5X2ZlYXR1cmUiLCAiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGVkIENhdGVnb3J5IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWRkZWRDYXRlZ29yeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RDb25maWd1cmF0aW9uX2FkZGVkQ2F0ZWdvcnlfZmVhdHVyZSIsICJfVUlfTWV0aG9kQ29uZmlndXJhdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZENvbmZpZ3VyYXRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNZXRob2RDb25maWd1cmF0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZENvbmZpZ3VyYXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTQ2ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db3B5Q29tbWFuZC5IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQuZG9tYWluLkVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5jb21tYW5kLk1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQuY29tbWFuZC5NZXRob2RFbGVtZW50SW5pdGlhbGl6ZUNvcHlDb21tYW5kOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRHdWlkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVzZW50YXRpb25OYW1lUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRCcmllZkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRLaW5kUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBwcmVzc2VkUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRPcmRlcmluZ0d1aWRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBHdWlkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkR3VpZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X2d1aWRfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19HVUlELCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRhdGlvbiBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlc2VudGF0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RFbGVtZW50X3ByZXNlbnRhdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfTWV0aG9kRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCcmllZiBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEJyaWVmRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9icmllZkRlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgS2luZCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEtpbmRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudF9raW5kX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudF9raW5kX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fS0lORCwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFN1cHByZXNzZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdXBwcmVzc2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfc3VwcHJlc3NlZF9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3JkZXJpbmcgR3VpZGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcmRlcmluZ0d1aWRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZEVsZW1lbnRfb3JkZXJpbmdHdWlkZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0dVSUQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM6Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFksCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLy8KLQkvLyBTdGFydCBjdXN0b20gY29kZSAvLwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS8vCi0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBjcmVhdGVJbml0aWFsaXplQ29weUNvbW1hbmQoRWRpdGluZ0RvbWFpbiBkb21haW4sCi0JCQlFT2JqZWN0IG93bmVyLCBIZWxwZXIgaGVscGVyKSB7Ci0JCXJldHVybiBuZXcgTWV0aG9kRWxlbWVudEluaXRpYWxpemVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGNyZWF0ZUNyZWF0ZUNvcHlDb21tYW5kKEVkaXRpbmdEb21haW4gZG9tYWluLAotCQkJRU9iamVjdCBvd25lciwgSGVscGVyIGhlbHBlcikgewotCQlyZXR1cm4gbmV3IE1ldGhvZEVsZW1lbnRDcmVhdGVDb3B5Q29tbWFuZChkb21haW4sIG93bmVyLCBoZWxwZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwZjdiMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlQYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kRWxlbWVudFByb3BlcnR5X3ZhbHVlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RFbGVtZW50UHJvcGVydHkuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvTWV0aG9kRWxlbWVudFByb3BlcnR5IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RFbGVtZW50UHJvcGVydHlfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX01ldGhvZEVsZW1lbnRQcm9wZXJ0eV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzZmYjYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBNZXRob2RMaWJyYXJ5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01ldGhvZExpYnJhcnkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kTGlicmFyeSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9NZXRob2RMaWJyYXJ5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RMaWJyYXJ5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RMaWJyYXJ5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0ZhbWlseSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTY2ZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmV1c2VkUGFja2FnZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEdsb2JhbCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEdsb2JhbFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQYWNrYWdlX2dsb2JhbF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFBhY2thZ2VfZ2xvYmFsX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJldXNlZCBQYWNrYWdlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJldXNlZFBhY2thZ2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFBhY2thZ2VfcmV1c2VkUGFja2FnZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQYWNrYWdlX3JldXNlZFBhY2thZ2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBhY2thZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFBhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGFja2FnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kUGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjI0MzFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW59IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZFVuaXRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVXNlckNoYW5nZWFibGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEJhc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2VyIENoYW5nZWFibGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRVc2VyQ2hhbmdlYWJsZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RQbHVnaW5fdXNlckNoYW5nZWFibGVfZmVhdHVyZSIsICJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhc2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQmFzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kUGx1Z2luX2Jhc2VzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFBsdWdpbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE1ldGhvZFBsdWdpbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9NZXRob2RQbHVnaW4iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoTWV0aG9kUGx1Z2luKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX01ldGhvZFBsdWdpbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kUGx1Z2luX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChNZXRob2RQbHVnaW4uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NZXRob2RVbml0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NmRkMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL01ldGhvZFVuaXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVW5pdEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RVbml0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENoYW5nZURlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRDb3B5cmlnaHRTdGF0ZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEF1dGhvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdXRob3JzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfYXV0aG9yc19mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGFuZ2VEYXRlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGF0ZV9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIENoYW5nZSBEZXNjcmlwdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9NZXRob2RVbml0X2NoYW5nZURlc2NyaXB0aW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZlcnNpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWZXJzaW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfdmVyc2lvbl9mZWF0dXJlIiwgIl9VSV9NZXRob2RVbml0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVRfX1ZFUlNJT04sIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ29weXJpZ2h0IFN0YXRlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9NZXRob2RVbml0X2NvcHlyaWdodFN0YXRlbWVudF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE1ldGhvZFVuaXQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTWV0aG9kVW5pdC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9NaWxlc3RvbmVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ViY2M4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTWlsZXN0b25lSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNaWxlc3RvbmVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1pbGVzdG9uZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSZXF1aXJlZFJlc3VsdHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlcXVpcmVkIFJlc3VsdHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXF1aXJlZFJlc3VsdHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3JlcXVpcmVkUmVzdWx0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01pbGVzdG9uZV9yZXF1aXJlZFJlc3VsdHNfZmVhdHVyZSIsICJfVUlfTWlsZXN0b25lX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgTWlsZXN0b25lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L01pbGVzdG9uZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChNaWxlc3RvbmUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfTWlsZXN0b25lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9NaWxlc3RvbmVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVkRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFmNjhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9OYW1lZEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTmFtZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTmFtZWRFbGVtZW50X25hbWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9OYW1lZEVsZW1lbnRfbmFtZV9mZWF0dXJlIiwgIl9VSV9OYW1lZEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FLCB0cnVlLCBmYWxzZSwKLQkJCQkJCWZhbHNlLCBJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsCi0JCQkJCQludWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE5hbWVkRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9OYW1lZEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX05hbWVkRWxlbWVudF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoTmFtZWRFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZXNwYWNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvTmFtZXNwYWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZDc4M2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL05hbWVzcGFjZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZWRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTmFtZXNwYWNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKE5hbWVzcGFjZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9OYW1lc3BhY2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX05hbWVzcGFjZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvT3V0Y29tZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL091dGNvbWVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiOWU2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvT3V0Y29tZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRjb21lSXRlbVByb3ZpZGVyIGV4dGVuZHMgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPdXRjb21lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIE91dGNvbWUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvT3V0Y29tZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChPdXRjb21lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX091dGNvbWVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX091dGNvbWVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmFlYjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTmFtZXNwYWNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQYWNrYWdlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BhY2thZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BhY2thZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1BhY2thZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGQ4NWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE5hbWVkRWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhY2thZ2VhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQYWNrYWdlYWJsZUVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGFja2FnZWFibGVFbGVtZW50X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QYWNrYWdlYWJsZUVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BoYXNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGhhc2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiMmNhZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUGhhc2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VJdGVtUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpdml0eUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBoYXNlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBoYXNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BoYXNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBoYXNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BoYXNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QaGFzZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmY2ZjIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGF9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFN0YXJ0RGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRmluaXNoRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUmFua1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RhcnQgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfc3RhcnREYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGxhbm5pbmdEYXRhX3N0YXJ0RGF0ZV9mZWF0dXJlIiwgIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZpbmlzaCBEYXRlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmluaXNoRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfZmluaXNoRGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BsYW5uaW5nRGF0YV9maW5pc2hEYXRlX2ZlYXR1cmUiLCAiX1VJX1BsYW5uaW5nRGF0YV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJhbmsgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSYW5rUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BsYW5uaW5nRGF0YV9yYW5rX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUGxhbm5pbmdEYXRhX3JhbmtfZmVhdHVyZSIsICJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUExBTk5JTkdfREFUQV9fUkFOSywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5JTlRFR1JBTF9WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUGxhbm5pbmdEYXRhLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BsYW5uaW5nRGF0YSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQbGFubmluZ0RhdGEpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUGxhbm5pbmdEYXRhX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QbGFubmluZ0RhdGFfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBsYW5uaW5nRGF0YS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCBmYWxzZSwgdHJ1ZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1BvaW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9pbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3MzU3YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9pbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvdmlkZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgSXRlbVByb3ZpZGVyQWRhcHRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFhQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFggZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BvaW50X3hfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qb2ludF94X2ZlYXR1cmUiLCAiX1VJX1BvaW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9JTlRfX1gsIHRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBZIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkWVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2ludF95X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUG9pbnRfeV9mZWF0dXJlIiwgIl9VSV9Qb2ludF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UX19ZLCB0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUG9pbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUG9pbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCURvdWJsZSBsYWJlbFZhbHVlID0gKChQb2ludCkgb2JqZWN0KS5nZXRYKCk7Ci0JCVN0cmluZyBsYWJlbCA9IGxhYmVsVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBsYWJlbFZhbHVlLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qb2ludF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUG9pbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFBvaW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUG9seWxpbmVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2x5bGluZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmZkNzlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qb2x5bGluZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvbHlsaW5lSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvbHlsaW5lSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZENsb3NlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2xvc2VkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2xvc2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1BvbHlsaW5lX2Nsb3NlZF9mZWF0dXJlIiwgIl9VSV9Qb2x5bGluZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBPTFlMSU5FX19DTE9TRUQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkVfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFBvbHlsaW5lLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1BvbHlsaW5lIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFBvbHlsaW5lKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1BvbHlsaW5lX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qb2x5bGluZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUG9seWxpbmUuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19XQVlQT0lOVFM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QT0xZTElORV9fV0FZUE9JTlRTLCBVbWFGYWN0b3J5LmVJTlNUQU5DRQotCQkJCQkJLmNyZWF0ZVBvaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YxZWEzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBZGRpdGlvbmFsSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJvYmxlbVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQmFja2dyb3VuZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkR29hbHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFwcGxpY2F0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRMZXZlbHNPZkFkb3B0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBBZGRpdGlvbmFsIEluZm8gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2FkZGl0aW9uYWxJbmZvX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hZGRpdGlvbmFsSW5mb19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcm9ibGVtIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3Byb2JsZW1fZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEJhY2tncm91bmQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCYWNrZ3JvdW5kUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYmFja2dyb3VuZF9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgR29hbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRHb2Fsc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX2dvYWxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9nb2Fsc19mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFwcGxpY2F0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXBwbGljYXRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl9hcHBsaWNhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fYXBwbGljYXRpb25fZmVhdHVyZSIsICJfVUlfUHJhY3RpY2VEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBMZXZlbHMgT2YgQWRvcHRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMZXZlbHNPZkFkb3B0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlRGVzY3JpcHRpb25fbGV2ZWxzT2ZBZG9wdGlvbl9mZWF0dXJlIiwgIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcmFjdGljZURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlRGVzY3JpcHRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJhY3RpY2VEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZURlc2NyaXB0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9QcmFjdGljZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzVhMGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ByYWN0aWNlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRDb250ZW50UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWN0aXZpdHlSZWZlcmVuY2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb250ZW50IFJlZmVyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50UmVmZXJlbmNlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV9jb250ZW50UmVmZXJlbmNlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1ByYWN0aWNlX2NvbnRlbnRSZWZlcmVuY2VzX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFjdGl2aXR5IFJlZmVyZW5jZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpdml0eVJlZmVyZW5jZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJhY3RpY2VfYWN0aXZpdHlSZWZlcmVuY2VzX2ZlYXR1cmUiLCAiX1VJX1ByYWN0aWNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByYWN0aWNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1ByYWN0aWNlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByYWN0aWNlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ByYWN0aWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9QcmFjdGljZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJhY3RpY2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByYWN0aWNlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJlYjgwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3J9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJRGVzY3JpcHRvckl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZF9wcm9jZXNzQ29tcG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBwcm9jZXNzIENvbXBvbmVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZF9wcm9jZXNzQ29tcG9uZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX19wcm9jZXNzQ29tcG9uZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnRfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyYzg4Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlMsCi0JCQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDc2MTU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkQXV0aG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGF0ZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZENvcHlyaWdodFN0YXRlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW50ZXJmYWNlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXV0aG9ycyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEF1dGhvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9hdXRob3JzX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQVVUSE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDaGFuZ2UgRGF0ZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENoYW5nZURhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEYXRlX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQ2hhbmdlIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbmdlRGVzY3JpcHRpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF9jaGFuZ2VEZXNjcmlwdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX01ldGhvZFVuaXRfY2hhbmdlRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmVyc2lvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZlcnNpb25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF92ZXJzaW9uX2ZlYXR1cmUiLCAiX1VJX01ldGhvZFVuaXRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfVU5JVF9fVkVSU0lPTiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBDb3B5cmlnaHQgU3RhdGVtZW50IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29weXJpZ2h0U3RhdGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX01ldGhvZFVuaXRfY29weXJpZ2h0U3RhdGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfTWV0aG9kVW5pdF9jb3B5cmlnaHRTdGF0ZW1lbnRfZmVhdHVyZSIsICJfVUlfTWV0aG9kVW5pdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW50ZXJmYWNlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEludGVyZmFjZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc0NvbXBvbmVudF9pbnRlcmZhY2VzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFByb2Nlc3NDb21wb25lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0NvbXBvbmVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9jZXNzQ29tcG9uZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NDb21wb25lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb2Nlc3NDb21wb25lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIHRydWUsIGZhbHNlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwZmMxYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlBY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRVc2FnZU5vdGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTY29wZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNjb3BlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl9zY29wZV9mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBVc2FnZSBOb3RlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFVzYWdlTm90ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0Rlc2NyaXB0aW9uX3VzYWdlTm90ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdXNhZ2VOb3Rlc19mZWF0dXJlIiwgIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc0Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFByb2Nlc3NEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWU4NDk5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0VsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0VsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVlZTdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGREZWxpdmVyeVByb2Nlc3Nlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVsaXZlcnlQcm9jZXNzZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc0ZhbWlseV9kZWxpdmVyeVByb2Nlc3Nlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Byb2Nlc3NGYW1pbHlfZGVsaXZlcnlQcm9jZXNzZXNfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc0ZhbWlseV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9jZXNzRmFtaWx5LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Byb2Nlc3NGYW1pbHkiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc0ZhbWlseSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Qcm9jZXNzRmFtaWx5X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTM2NTVhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9jZXNzSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc30gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0l0ZW1Qcm92aWRlciBleHRlbmRzIEFjdGl2aXR5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJbmNsdWRlc1BhdHRlcm5zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGREZWZhdWx0Q29udGV4dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkVmFsaWRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbmNsdWRlcyBQYXR0ZXJucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEluY2x1ZGVzUGF0dGVybnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc19pbmNsdWRlc1BhdHRlcm5zX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUywgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIERlZmF1bHQgQ29udGV4dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NfZGVmYXVsdENvbnRleHRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzX2RlZmF1bHRDb250ZXh0X2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYWxpZCBDb250ZXh0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRDb250ZXh0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NfdmFsaWRDb250ZXh0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvY2Vzc192YWxpZENvbnRleHRfZmVhdHVyZSIsICJfVUlfUHJvY2Vzc190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc190eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNjg2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2V9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyIGV4dGVuZHMgTWV0aG9kUGFja2FnZUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQYWNrYWdlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzcGVjaWZpZXMgaG93IHRvIGltcGxlbWVudCB7QGxpbmsgI2dldENoaWxkcmVufSBhbmQgaXMgdXNlZCB0byBkZWR1Y2UgYW4gYXBwcm9wcmlhdGUgZmVhdHVyZSBmb3IgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5BZGRDb21tYW5kfSwge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuUmVtb3ZlQ29tbWFuZH0gb3IKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Nb3ZlQ29tbWFuZH0gaW4ge0BsaW5rICNjcmVhdGVDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRVN0cnVjdHVyYWxGZWF0dXJlPiBnZXRDaGlsZHJlbkZlYXR1cmVzKAotCQkJT2JqZWN0IG9iamVjdCkgewotCQlpZiAoY2hpbGRyZW5GZWF0dXJlcyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRDaGlsZHJlbkZlYXR1cmVzKG9iamVjdCk7Ci0JCQljaGlsZHJlbkZlYXR1cmVzCi0JCQkJCS5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc1BhY2thZ2UuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc1BhY2thZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc1BhY2thZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BhY2thZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NQYWNrYWdlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChQcm9jZXNzUGFja2FnZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQWN0aXZpdHkoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBsYW5uaW5nRGF0YSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV29ya09yZGVyKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNaWxlc3RvbmUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSXRlcmF0aW9uKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQaGFzZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVGVhbVByb2ZpbGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVUYXNrRGVzY3JpcHRvcigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlUm9sZSgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSkpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTLAotCQkJCVVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUywKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVMsCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlhZ3JhbSgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4N2Q4MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciBleHRlbmRzIFByb2Nlc3NJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRCYXNlZE9uUHJvY2Vzc2VzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBCYXNlZCBPbiBQcm9jZXNzZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCYXNlZE9uUHJvY2Vzc2VzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX2Jhc2VkT25Qcm9jZXNzZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9iYXNlZE9uUHJvY2Vzc2VzX2ZlYXR1cmUiLCAiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ3JlYXRlQ2hpbGRDb21tYW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUNoaWxkVGV4dChPYmplY3Qgb3duZXIsIE9iamVjdCBmZWF0dXJlLAotCQkJT2JqZWN0IGNoaWxkLCBDb2xsZWN0aW9uPD8+IHNlbGVjdGlvbikgewotCQlPYmplY3QgY2hpbGRGZWF0dXJlID0gZmVhdHVyZTsKLQkJT2JqZWN0IGNoaWxkT2JqZWN0ID0gY2hpbGQ7Ci0KLQkJYm9vbGVhbiBxdWFsaWZ5ID0gY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04KLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0KLQkJaWYgKHF1YWxpZnkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmcoIl9VSV9DcmVhdGVDaGlsZF90ZXh0MiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VHlwZVRleHQoY2hpbGRPYmplY3QpLAotCQkJCQkJCWdldEZlYXR1cmVUZXh0KGNoaWxkRmVhdHVyZSksIGdldFR5cGVUZXh0KG93bmVyKSB9KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0Q3JlYXRlQ2hpbGRUZXh0KG93bmVyLCBmZWF0dXJlLCBjaGlsZCwgc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUHJvcGVydHlJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTUyZDEzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Qcm9wZXJ0eUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5SXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRLZXlQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFZhbHVlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBLZXkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRLZXlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUHJvcGVydHlfa2V5X2ZlYXR1cmUiLCAiX1VJX1Byb3BlcnR5X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFlfX0tFWSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFZhbHVlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfdmFsdWVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Qcm9wZXJ0eV92YWx1ZV9mZWF0dXJlIiwgIl9VSV9Qcm9wZXJ0eV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlBST1BFUlRZX19WQUxVRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBQcm9wZXJ0eS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Qcm9wZXJ0eSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChQcm9wZXJ0eSkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Qcm9wZXJ0eV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUHJvcGVydHlfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFByb3BlcnR5LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVmZXJlbmNlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYTNiMmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlZmVyZW5jZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlSXRlbVByb3ZpZGVyIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZWZlcmVuY2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlZmVyZW5jZWRQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb24gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9SZWZlcmVuY2VfaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb25fZmVhdHVyZSIsICJfVUlfUmVmZXJlbmNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFJlZmVyZW5jZWQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZlcmVuY2VkUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JlZmVyZW5jZV9yZWZlcmVuY2VkX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUmVmZXJlbmNlX3JlZmVyZW5jZWRfZmVhdHVyZSIsICJfVUlfUmVmZXJlbmNlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVmZXJlbmNlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JlZmVyZW5jZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSZWZlcmVuY2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUmVmZXJlbmNlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9SZWZlcmVuY2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlZmVyZW5jZS5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVwb3J0SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUmVwb3J0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZjc2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JlcG9ydEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXBvcnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUmVwb3J0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JlcG9ydCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSZXBvcnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUmVwb3J0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9SZXBvcnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9SZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNWIzNTIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSZXVzYWJsZUFzc2V0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JldXNhYmxlQXNzZXQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoUmV1c2FibGVBc3NldCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9SZXVzYWJsZUFzc2V0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9SZXVzYWJsZUFzc2V0X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2FkbWFwSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9hZG1hcEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTZiNWY2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2FkbWFwSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXBJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9hZG1hcC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2FkbWFwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvYWRtYXApIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9hZG1hcF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9hZG1hcF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NWNmYjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFNraWxsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQXNzaWdubWVudEFwcHJvYWNoZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN5bm9ueW1zUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTa2lsbHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTa2lsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX3NraWxsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl9za2lsbHNfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTLCB0cnVlLAotCQkJCQkJZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFzc2lnbm1lbnQgQXBwcm9hY2hlcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFzc2lnbm1lbnRBcHByb2FjaGVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdGlvbl9hc3NpZ25tZW50QXBwcm9hY2hlc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3lub255bXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTeW5vbnltc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRpb25fc3lub255bXNfZmVhdHVyZSIsICJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9sZURlc2NyaXB0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1JvbGVEZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlRGVzY3JpcHRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJvbGVEZXNjcmlwdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzExNTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIgZXh0ZW5kcyBEZXNjcmlwdG9ySXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUm9sZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlc3BvbnNpYmxlRm9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSb2xlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9sZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl9Sb2xlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZURlc2NyaXB0b3JfUm9sZV9mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZGlmaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfbW9kaWZpZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl9tb2RpZmllc19mZWF0dXJlIiwgIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZXNwb25zaWJsZSBGb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNwb25zaWJsZUZvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl9yZXNwb25zaWJsZUZvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3Jlc3BvbnNpYmxlRm9yX2ZlYXR1cmUiLCAiX1VJX1JvbGVEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlRGVzY3JpcHRvci5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlRGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlRGVzY3JpcHRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlRGVzY3JpcHRvcl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZURlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2ZhZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZUl0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRGdWxmaWxsc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFJlc3BvbnNpYmxlRm9yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBGdWxmaWxscyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF9mdWxmaWxsc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF9mdWxmaWxsc19mZWF0dXJlIiwgIl9VSV9GdWxmaWxsYWJsZUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE1vZGlmaWVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZV9tb2RpZmllc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVfbW9kaWZpZXNfZmVhdHVyZSIsICJfVUlfUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX01PRElGSUVTLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKLQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVzcG9uc2libGUgRm9yIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzcG9uc2libGVGb3JQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZV9yZXNwb25zaWJsZUZvcl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1JvbGVfcmVzcG9uc2libGVGb3JfZmVhdHVyZSIsICJfVUlfUm9sZV90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUiwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFJvbGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChSb2xlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDExODdhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Sb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmd9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlU2V0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZSBTZXRzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUm9sZVNldHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZVNldEdyb3VwaW5nX3JvbGVTZXRzX2ZlYXR1cmUiLCAiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBSb2xlU2V0R3JvdXBpbmcuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvUm9sZVNldEdyb3VwaW5nIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVTZXRHcm91cGluZykgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0R3JvdXBpbmdfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1JvbGVTZXRHcm91cGluZ190eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1JvbGVTZXRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0OTY1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvUm9sZVNldEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSb2xlc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Sb2xlU2V0X3JvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfUm9sZVNldF9yb2xlc19mZWF0dXJlIiwgIl9VSV9Sb2xlU2V0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfX1JPTEVTLCB0cnVlLCBmYWxzZSwgdHJ1ZSwKLQkJCQkJCW51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgUm9sZVNldC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Sb2xlU2V0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFJvbGVTZXQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfUm9sZVNldF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfUm9sZVNldF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlY3Rpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjOTk5OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2VjdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRTZWN0aW9uTmFtZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VjdGlvbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU2VjdGlvbiBOYW1lIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VjdGlvbk5hbWVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfU2VjdGlvbl9zZWN0aW9uTmFtZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlY3Rpb25fc2VjdGlvbk5hbWVfZmVhdHVyZSIsICJfVUlfU2VjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NFQ1RJT05fTkFNRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWN0aW9uIERlc2NyaXB0aW9uIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VjdGlvbkRlc2NyaXB0aW9uUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1NlY3Rpb25fc2VjdGlvbkRlc2NyaXB0aW9uX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9zZWN0aW9uRGVzY3JpcHRpb25fZmVhdHVyZSIsICJfVUlfU2VjdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT04sIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHJlZGVjZXNzb3IgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcmVkZWNlc3NvclByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3ByZWRlY2Vzc29yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfU2VjdGlvbl9wcmVkZWNlc3Nvcl9mZWF0dXJlIiwgIl9VSV9TZWN0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTl9fUFJFREVDRVNTT1IsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcy5hZGQoVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMpOwotCQl9Ci0JCXJldHVybiBjaGlsZHJlbkZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFU3RydWN0dXJhbEZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKE9iamVjdCBvYmplY3QsIE9iamVjdCBjaGlsZCkgewotCQkvLyBDaGVjayB0aGUgdHlwZSBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZmVhdHVyZSB0byB1c2UgZm9yCi0JCS8vIGFkZGluZyAoc2VlIHtAbGluayBBZGRDb21tYW5kfSkgaXQgYXMgYSBjaGlsZC4KLQotCQlyZXR1cm4gc3VwZXIuZ2V0Q2hpbGRGZWF0dXJlKG9iamVjdCwgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTZWN0aW9uLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1NlY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU2VjdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9TZWN0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChTZWN0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU2VjdGlvbigpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRUNUSU9OX19TVUJfU0VDVElPTlMsIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJCQkuY3JlYXRlU3RlcCgpKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MTkxMGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1NlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBleHRlbmRzIERpYWdyYW1FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRQcmVzZW50YXRpb25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFByZXNlbnRhdGlvbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFByZXNlbnRhdGlvblByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TZW1hbnRpY01vZGVsQnJpZGdlX3ByZXNlbnRhdGlvbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfcHJlc2VudGF0aW9uX2ZlYXR1cmUiLCAiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTZW1hbnRpY01vZGVsQnJpZGdlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1NlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjIzY2EzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFR5cGVJbmZvUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUeXBlIEluZm8gZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlSW5mb1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlSW5mb19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGVJbmZvX2ZlYXR1cmUiLCAiX1VJX1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCkgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N0ZXBJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzYjIyZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvU3RlcEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXB9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN0ZXBJdGVtUHJvdmlkZXIgZXh0ZW5kcyBTZWN0aW9uSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RlcEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgU3RlcC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TdGVwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFN0ZXApIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfU3RlcF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU3RlcF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoU3RlcC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlmaXJlTm90aWZ5Q2hhbmdlZChuZXcgVmlld2VyTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uCi0JCQkJCS5nZXROb3RpZmllcigpLCB0cnVlLCBmYWxzZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQotCQluZXdDaGlsZERlc2NyaXB0b3JzLmFkZChjcmVhdGVDaGlsZFBhcmFtZXRlcigKLQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQlVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb25zdHJhaW50KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNyZWF0ZUNoaWxkQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVDaGlsZFRleHQoT2JqZWN0IG93bmVyLCBPYmplY3QgZmVhdHVyZSwKLQkJCU9iamVjdCBjaGlsZCwgQ29sbGVjdGlvbjw/PiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGNoaWxkRmVhdHVyZSA9IGZlYXR1cmU7Ci0JCU9iamVjdCBjaGlsZE9iamVjdCA9IGNoaWxkOwotCi0JCWJvb2xlYW4gcXVhbGlmeSA9IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUwotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OCi0JCQkJfHwgY2hpbGRGZWF0dXJlID09IFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCi0JCWlmIChxdWFsaWZ5KSB7Ci0JCQlyZXR1cm4gZ2V0U3RyaW5nKCJfVUlfQ3JlYXRlQ2hpbGRfdGV4dDIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBPYmplY3RbXSB7IGdldFR5cGVUZXh0KGNoaWxkT2JqZWN0KSwKLQkJCQkJCQlnZXRGZWF0dXJlVGV4dChjaGlsZEZlYXR1cmUpLCBnZXRUeXBlVGV4dChvd25lcikgfSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldENyZWF0ZUNoaWxkVGV4dChvd25lciwgZmVhdHVyZSwgY2hpbGQsIHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1N1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzg4M2NjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9TdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFN1cHBvcnRpbmdNYXRlcmlhbC5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9TdXBwb3J0aW5nTWF0ZXJpYWwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoU3VwcG9ydGluZ01hdGVyaWFsKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1N1cHBvcnRpbmdNYXRlcmlhbF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfU3VwcG9ydGluZ01hdGVyaWFsX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAxZjJjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQdXJwb3NlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHVycG9zZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fcHVycG9zZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UsIHRydWUsCi0JCQkJCQlmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWx0ZXJuYXRpdmVzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWx0ZXJuYXRpdmVzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl9hbHRlcm5hdGl2ZXNfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRpb25fYWx0ZXJuYXRpdmVzX2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUYXNrRGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRhc2tEZXNjcmlwdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdGlvbl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoVGFza0Rlc2NyaXB0aW9uLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmZhZjYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrRGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRhc2tQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBc3Npc3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFeHRlcm5hbElucHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRQZXJmb3JtZWRQcmltYXJpbHlCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU2VsZWN0ZWRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX0Rlc2NyaXB0b3JfaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRGVzY3JpcHRvcl9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2VfZmVhdHVyZSIsICJfVUlfRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUYXNrIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFza1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9UYXNrX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfVGFza19mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fVEFTSywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQXNzaXN0ZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBc3Npc3RlZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX2Fzc2lzdGVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl9hc3Npc3RlZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSwgdHJ1ZSwKLQkJCQkJCWZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEV4dGVybmFsIElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXh0ZXJuYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9leHRlcm5hbElucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfZXh0ZXJuYWxJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYW5kYXRvcnkgSW5wdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrRGVzY3JpcHRvcl9tYW5kYXRvcnlJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBPcHRpb25hbCBJbnB1dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE9wdGlvbmFsSW5wdXRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfb3B0aW9uYWxJbnB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3V0cHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX291dHB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrRGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVULCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUGVyZm9ybWVkIFByaW1hcmlseSBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBlcmZvcm1lZFByaW1hcmlseUJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX3BlcmZvcm1lZFByaW1hcmlseUJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza0Rlc2NyaXB0b3JfcGVyZm9ybWVkUHJpbWFyaWx5QnlfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTZWxlY3RlZCBTdGVwcyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFNlbGVjdGVkU3RlcHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3Jfc2VsZWN0ZWRTdGVwc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tEZXNjcmlwdG9yX3NlbGVjdGVkU3RlcHNfZmVhdHVyZSIsICJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGFza0Rlc2NyaXB0b3IuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFza0Rlc2NyaXB0b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGFza0Rlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGFza0Rlc2NyaXB0b3JfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tEZXNjcmlwdG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUYXNrRGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGFza0l0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjRmNzc4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UYXNrSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkU3RlcHNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFBlcmZvcm1lZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFBlcmZvcm1lZEJ5UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfcGVyZm9ybWVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX3BlcmZvcm1lZEJ5X2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19QRVJGT1JNRURfQlksIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBNYW5kYXRvcnkgSW5wdXQgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYW5kYXRvcnlJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX21hbmRhdG9yeUlucHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19tYW5kYXRvcnlJbnB1dF9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fTUFOREFUT1JZX0lOUFVULCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgT3V0cHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3V0cHV0UHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfb3V0cHV0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19vdXRwdXRfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09VVFBVVCwgdHJ1ZSwgZmFsc2UsIHRydWUsCi0JCQkJCQludWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnkgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeV9mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSwKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIE9wdGlvbmFsIElucHV0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3B0aW9uYWxJbnB1dFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UYXNrX29wdGlvbmFsSW5wdXRfZmVhdHVyZSIsICJfVUlfVGFza190eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX09QVElPTkFMX0lOUFVULCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3RlcHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGVwc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX3N0ZXBzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza19zdGVwc19mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fU1RFUFMsIHRydWUsIGZhbHNlLCB0cnVlLAotCQkJCQkJbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUb29sIE1lbnRvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX3Rvb2xNZW50b3JzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGFza190b29sTWVudG9yc19mZWF0dXJlIiwgIl9VSV9UYXNrX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fVE9PTF9NRU5UT1JTLCB0cnVlLCBmYWxzZSwKLQkJCQkJCXRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVzdGltYXRpb25Db25zaWRlcmF0aW9uc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UYXNrX2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rhc2tfZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX2ZlYXR1cmUiLCAiX1VJX1Rhc2tfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyBob3cgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0Q2hpbGRyZW59IGFuZCBpcyB1c2VkIHRvIGRlZHVjZSBhbiBhcHByb3ByaWF0ZSBmZWF0dXJlIGZvciBhbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkFkZENvbW1hbmR9LCB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5SZW1vdmVDb21tYW5kfSBvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLk1vdmVDb21tYW5kfSBpbiB7QGxpbmsgI2NyZWF0ZUNvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFU3RydWN0dXJhbEZlYXR1cmU+IGdldENoaWxkcmVuRmVhdHVyZXMoCi0JCQlPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChjaGlsZHJlbkZlYXR1cmVzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldENoaWxkcmVuRmVhdHVyZXMob2JqZWN0KTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OKTsKLQkJCWNoaWxkcmVuRmVhdHVyZXMKLQkJCQkJLmFkZChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTik7Ci0JCX0KLQkJcmV0dXJuIGNoaWxkcmVuRmVhdHVyZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVTdHJ1Y3R1cmFsRmVhdHVyZSBnZXRDaGlsZEZlYXR1cmUoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGNoaWxkKSB7Ci0JCS8vIENoZWNrIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQgb2JqZWN0IGFuZCByZXR1cm4gdGhlIHByb3BlciBmZWF0dXJlIHRvIHVzZSBmb3IKLQkJLy8gYWRkaW5nIChzZWUge0BsaW5rIEFkZENvbW1hbmR9KSBpdCBhcyBhIGNoaWxkLgotCi0JCXJldHVybiBzdXBlci5nZXRDaGlsZEZlYXR1cmUob2JqZWN0LCBjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRhc2suZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGFzayIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUYXNrKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rhc2tfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rhc2tfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFRhc2suY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1Mjc1MDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlYW1Qcm9maWxlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGVhbVJvbGVzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRTdXBlclRlYW1Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFN1YlRlYW1Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIFRlYW0gUm9sZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZWFtUm9sZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVGVhbVByb2ZpbGVfdGVhbVJvbGVzX2ZlYXR1cmUiLCAiX1VJX1RlYW1Qcm9maWxlX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgU3VwZXIgVGVhbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1cGVyVGVhbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9UZWFtUHJvZmlsZV9zdXBlclRlYW1fZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBTdWIgVGVhbSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFN1YlRlYW1Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfc3ViVGVhbV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RlYW1Qcm9maWxlX3N1YlRlYW1fZmVhdHVyZSIsICJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCB0cnVlLAotCQkJCQkJZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGVhbVByb2ZpbGUuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGVhbVByb2ZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGVhbVByb2ZpbGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGVhbVByb2ZpbGVfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1RlYW1Qcm9maWxlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZW1wbGF0ZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTQ5YjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RlbXBsYXRlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBHdWlkYW5jZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBsYXRlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRlbXBsYXRlLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1RlbXBsYXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFRlbXBsYXRlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1RlbXBsYXRlX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9UZW1wbGF0ZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYwYWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyIGV4dGVuZHMgR3VpZGFuY2VJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZXJtRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUZXJtRGVmaW5pdGlvbi5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9UZXJtRGVmaW5pdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUZXJtRGVmaW5pdGlvbikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9UZXJtRGVmaW5pdGlvbl90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVGVybURlZmluaXRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1RleHRFbGVtZW50SXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxOGQxZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50fSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIExlYWZFbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVGV4dFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVGV4dCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVGV4dEVsZW1lbnRfdGV4dF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1RleHRFbGVtZW50X3RleHRfZmVhdHVyZSIsICJfVUlfVGV4dEVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5URVhUX0VMRU1FTlRfX1RFWFQsIHRydWUsIGZhbHNlLAotCQkJCQkJZmFsc2UsIEl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwKLQkJCQkJCW51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVGV4dEVsZW1lbnQuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVGV4dEVsZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVGV4dEVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVGV4dEVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1RleHRFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChUZXh0RWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVF9fVEVYVDoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmODk2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVG9vbEl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb29sSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbEl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVG9vbCBNZW50b3JzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9vbE1lbnRvcnNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVG9vbF90b29sTWVudG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1Rvb2xfdG9vbE1lbnRvcnNfZmVhdHVyZSIsICJfVUlfVG9vbF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfX1RPT0xfTUVOVE9SUywgdHJ1ZSwgZmFsc2UsCi0JCQkJCQl0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFRvb2wuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvVG9vbCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChUb29sKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1Rvb2xfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0JCXN1cGVyLm5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQ29tbWFuZFBhcmFtZXRlcn1zIGRlc2NyaWJpbmcgdGhlIGNoaWxkcmVuCi0JICogdGhhdCBjYW4gYmUgY3JlYXRlZCB1bmRlciB0aGlzIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycygKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDaGlsZERlc2NyaXB0b3JzLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCXN1cGVyLmNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKG5ld0NoaWxkRGVzY3JpcHRvcnMsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBsb2NhdG9yIGZvciB0aGlzIGl0ZW0gcHJvdmlkZXIncyByZXNvdXJjZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBVbWFFZGl0UGx1Z2luLklOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Ub29sTWVudG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjMyM2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1Rvb2xNZW50b3JJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckl0ZW1Qcm92aWRlciBleHRlbmRzIEd1aWRhbmNlSXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBUb29sTWVudG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1Rvb2xNZW50b3IiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVG9vbE1lbnRvcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Ub29sTWVudG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Ub29sTWVudG9yX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UeXBlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVHlwZUl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmZhOTEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9UeXBlSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGV9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFR5cGVJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgaW1wbGVtZW50cwotCQlJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFR5cGUpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVHlwZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwMWRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIGV4dGVuZHMKLQkJU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLAotCQlJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV9lbGVtZW50X2ZlYXR1cmUiLCAiX1VJX1VNQVNlbWFudGljTW9kZWxCcmlkZ2VfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9VTUFTZW1hbnRpY01vZGVsQnJpZGdlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFVNQVNlbWFudGljTW9kZWxCcmlkZ2UpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVU1BU2VtYW50aWNNb2RlbEJyaWRnZV90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hRWRpdFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1VtYUVkaXRQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMWNkMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hRWRpdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uRU1GUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgY2VudHJhbCBzaW5nbGV0b24gZm9yIHRoZSBVbWEgZWRpdCBwbHVnaW4uCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbWFFZGl0UGx1Z2luIGV4dGVuZHMgRU1GUGx1Z2luIHsKLQkvKioKLQkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzaW5nbGV0b24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVbWFFZGl0UGx1Z2luIElOU1RBTkNFID0gbmV3IFVtYUVkaXRQbHVnaW4oKTsKLQotCS8qKgotCSAqIEtlZXAgdHJhY2sgb2YgdGhlIHNpbmdsZXRvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbXBsZW1lbnRhdGlvbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGluc3RhbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFFZGl0UGx1Z2luKCkgewotCQlzdXBlcihuZXcgUmVzb3VyY2VMb2NhdG9yW10ge30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UGx1Z2luUmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBwbHVnaW4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1wbGVtZW50YXRpb24gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIEVjbGlwc2UgPGI+UGx1Z2luPC9iPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxlbWVudGF0aW9uIGV4dGVuZHMgRWNsaXBzZVBsdWdpbiB7Ci0JCS8qKgotCQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIEltcGxlbWVudGF0aW9uKCkgewotCQkJc3VwZXIoKTsKLQotCQkJLy8gUmVtZW1iZXIgdGhlIHN0YXRpYyBpbnN0YW5jZS4KLQkJCS8vCi0JCQlwbHVnaW4gPSB0aGlzOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvVW1hSXRlbVByb3ZpZGVyQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ4MzRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9VbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNoYW5nZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWRBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSURpc3Bvc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSU5vdGlmeUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5VbWFBZGFwdGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBmYWN0b3J5IHRoYXQgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBpbnRlcmZhY2VzIG5lZWRlZCB0byBzdXBwb3J0IFZpZXdlcnMuCi0gKiBUaGUgYWRhcHRlcnMgZ2VuZXJhdGVkIGJ5IHRoaXMgZmFjdG9yeSBjb252ZXJ0IEVNRiBhZGFwdGVyIG5vdGlmaWNhdGlvbnMgaW50byBjYWxscyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkIGZpcmVOb3RpZnlDaGFuZ2VkfS4KLSAqIFRoZSBhZGFwdGVycyBhbHNvIHN1cHBvcnQgRWNsaXBzZSBwcm9wZXJ0eSBzaGVldHMuCi0gKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGUgYWRhcHRlcnMgYXJlIHNoYXJlZCBhbW9uZyBtdWx0aXBsZSBpbnN0YW5jZXMuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSBleHRlbmRzIFVtYUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMKLQkJQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSwgSUNoYW5nZU5vdGlmaWVyLCBJRGlzcG9zYWJsZSB7Ci0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhpcyBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2VkQWRhcHRlckZhY3RvcnkgcGFyZW50QWRhcHRlckZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JQ2hhbmdlTm90aWZpZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJQ2hhbmdlTm90aWZpZXIgY2hhbmdlTm90aWZpZXIgPSBuZXcgQ2hhbmdlTm90aWZpZXIoKTsKLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgdHlwZXMgY2hlY2tlZCBieSB7QGxpbmsgI2lzRmFjdG9yeUZvclR5cGUgaXNGYWN0b3J5Rm9yVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248T2JqZWN0PiBzdXBwb3J0ZWRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFJdGVtUHJvdmlkZXJBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCXN1cHBvcnRlZFR5cGVzLmFkZChJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuY2xhc3MpOwotCQlzdXBwb3J0ZWRUeXBlcy5hZGQoSUl0ZW1MYWJlbFByb3ZpZGVyLmNsYXNzKTsKLQkJc3VwcG9ydGVkVHlwZXMuYWRkKElJdGVtUHJvcGVydHlTb3VyY2UuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VJdGVtUHJvdmlkZXIgcGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VBZGFwdGVyKCkgewotCQlpZiAocGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwYWNrYWdlSXRlbVByb3ZpZGVyID0gbmV3IFBhY2thZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50SXRlbVByb3ZpZGVyIGNvbnN0cmFpbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25zdHJhaW50QWRhcHRlcigpIHsKLQkJaWYgKGNvbnN0cmFpbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uc3RyYWludEl0ZW1Qcm92aWRlciA9IG5ldyBDb25zdHJhaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnN0cmFpbnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgbWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kRWxlbWVudFByb3BlcnR5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBLaW5kSXRlbVByb3ZpZGVyIGtpbmRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVLaW5kQWRhcHRlcigpIHsKLQkJaWYgKGtpbmRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJa2luZEl0ZW1Qcm92aWRlciA9IG5ldyBLaW5kSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGtpbmRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZUl0ZW1Qcm92aWRlciByb2xlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tJdGVtUHJvdmlkZXIgdGFza0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2t9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlpZiAodGFza0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0YXNrSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGFza0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdGVwSXRlbVByb3ZpZGVyIHN0ZXBJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdGVwQWRhcHRlcigpIHsKLQkJaWYgKHN0ZXBJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJc3RlcEl0ZW1Qcm92aWRlciA9IG5ldyBTdGVwSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHN0ZXBJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SXRlbVByb3ZpZGVyIGFydGlmYWN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJaWYgKGFydGlmYWN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFydGlmYWN0SXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFydGlmYWN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlciA9IG5ldyBXb3JrUHJvZHVjdEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciBmdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUZ1bGZpbGxhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCWlmIChmdWxmaWxsYWJsZUVsZW1lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IEZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciBkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBPdXRjb21lSXRlbVByb3ZpZGVyIG91dGNvbWVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJaWYgKG91dGNvbWVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJb3V0Y29tZUl0ZW1Qcm92aWRlciA9IG5ldyBPdXRjb21lSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG91dGNvbWVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50SXRlbVByb3ZpZGVyIHBvaW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBvaW50QWRhcHRlcigpIHsKLQkJaWYgKHBvaW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXBvaW50SXRlbVByb3ZpZGVyID0gbmV3IFBvaW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHBvaW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtTGlua0l0ZW1Qcm92aWRlciBkaWFncmFtTGlua0l0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaWFncmFtTGlua0FkYXB0ZXIoKSB7Ci0JCWlmIChkaWFncmFtTGlua0l0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaWFncmFtTGlua0l0ZW1Qcm92aWRlciA9IG5ldyBEaWFncmFtTGlua0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkaWFncmFtTGlua0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhDb25uZWN0b3JBZGFwdGVyKCkgewotCQlpZiAoZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIgPSBuZXcgR3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaW1lbnNpb25JdGVtUHJvdmlkZXIgZGltZW5zaW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaW1lbnNpb25BZGFwdGVyKCkgewotCQlpZiAoZGltZW5zaW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRpbWVuc2lvbkl0ZW1Qcm92aWRlciA9IG5ldyBEaW1lbnNpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGltZW5zaW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlSXRlbVByb3ZpZGVyIHJlZmVyZW5jZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpIHsKLQkJaWYgKHJlZmVyZW5jZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZWZlcmVuY2VJdGVtUHJvdmlkZXIgPSBuZXcgUmVmZXJlbmNlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlZmVyZW5jZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlJdGVtUHJvdmlkZXIgcHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvcGVydHlBZGFwdGVyKCkgewotCQlpZiAocHJvcGVydHlJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvcGVydHlJdGVtUHJvdmlkZXIgPSBuZXcgUHJvcGVydHlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydHlJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIgZ3JhcGhFZGdlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCkgewotCQlpZiAoZ3JhcGhFZGdlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWdyYXBoRWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBHcmFwaEVkZ2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3JhcGhFZGdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1JdGVtUHJvdmlkZXIgZGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaWFncmFtSXRlbVByb3ZpZGVyID0gbmV3IERpYWdyYW1JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlhZ3JhbUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoTm9kZUl0ZW1Qcm92aWRlciBncmFwaE5vZGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoTm9kZUFkYXB0ZXIoKSB7Ci0JCWlmIChncmFwaE5vZGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3JhcGhOb2RlSXRlbVByb3ZpZGVyID0gbmV3IEdyYXBoTm9kZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBncmFwaE5vZGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYgKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyIHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJaWYgKHVtYVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBVTUFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiB1bWFTZW1hbnRpY01vZGVsQnJpZGdlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRleHRFbGVtZW50SXRlbVByb3ZpZGVyIHRleHRFbGVtZW50SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRleHRFbGVtZW50QWRhcHRlcigpIHsKLQkJaWYgKHRleHRFbGVtZW50SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRleHRFbGVtZW50SXRlbVByb3ZpZGVyID0gbmV3IFRleHRFbGVtZW50SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHRFbGVtZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZUl0ZW1Qcm92aWRlciBpbWFnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJbWFnZUFkYXB0ZXIoKSB7Ci0JCWlmIChpbWFnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlpbWFnZUl0ZW1Qcm92aWRlciA9IG5ldyBJbWFnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9seWxpbmVJdGVtUHJvdmlkZXIgcG9seWxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9seWxpbmVBZGFwdGVyKCkgewotCQlpZiAocG9seWxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcG9seWxpbmVJdGVtUHJvdmlkZXIgPSBuZXcgUG9seWxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcG9seWxpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxsaXBzZUl0ZW1Qcm92aWRlciBlbGxpcHNlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKSB7Ci0JCWlmIChlbGxpcHNlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVsbGlwc2VJdGVtUHJvdmlkZXIgPSBuZXcgRWxsaXBzZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBlbGxpcHNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBY3Rpdml0eUl0ZW1Qcm92aWRlciBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eUl0ZW1Qcm92aWRlciA9IG5ldyBBY3Rpdml0eUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhY3Rpdml0eUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1pbGVzdG9uZUl0ZW1Qcm92aWRlciBtaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCWlmIChtaWxlc3RvbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJbWlsZXN0b25lSXRlbVByb3ZpZGVyID0gbmV3IE1pbGVzdG9uZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBtaWxlc3RvbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JdGVtUHJvdmlkZXIgaXRlcmF0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlpZiAoaXRlcmF0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWl0ZXJhdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBJdGVyYXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gaXRlcmF0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUl0ZW1Qcm92aWRlciBwaGFzZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQaGFzZUFkYXB0ZXIoKSB7Ci0JCWlmIChwaGFzZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwaGFzZUl0ZW1Qcm92aWRlciA9IG5ldyBQaGFzZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwaGFzZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlpZiAodGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIgPSBuZXcgVGVhbVByb2ZpbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVhbVByb2ZpbGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID0gbmV3IFJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJ9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVySXRlbVByb3ZpZGVyIHdvcmtPcmRlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtPcmRlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIgPSBuZXcgV29ya09yZGVySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtPcmRlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlciBwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKSB7Ci0JCWlmIChwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyID0gbmV3IFBsYW5uaW5nRGF0YUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyID0gbmV3IFRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlciBjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29tcG9zaXRlUm9sZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgPSBuZXcgQ29tcG9zaXRlUm9sZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb21wb3NpdGVSb2xlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFjdGl2aXR5RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoZGVzY3JpcHRvckRlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SXRlbVByb3ZpZGVyIGNvbmNlcHRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJaWYgKGNvbmNlcHRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJY29uY2VwdEl0ZW1Qcm92aWRlciA9IG5ldyBDb25jZXB0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmNlcHRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDaGVja2xpc3RJdGVtUHJvdmlkZXIgY2hlY2tsaXN0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCkgewotCQlpZiAoY2hlY2tsaXN0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWNoZWNrbGlzdEl0ZW1Qcm92aWRlciA9IG5ldyBDaGVja2xpc3RJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tsaXN0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4YW1wbGVJdGVtUHJvdmlkZXIgZXhhbXBsZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlpZiAoZXhhbXBsZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlleGFtcGxlSXRlbVByb3ZpZGVyID0gbmV3IEV4YW1wbGVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZXhhbXBsZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUl0ZW1Qcm92aWRlciBndWlkZWxpbmVJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKSB7Ci0JCWlmIChndWlkZWxpbmVJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZ3VpZGVsaW5lSXRlbVByb3ZpZGVyID0gbmV3IEd1aWRlbGluZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBndWlkZWxpbmVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlcG9ydEl0ZW1Qcm92aWRlciByZXBvcnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCWlmIChyZXBvcnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmVwb3J0SXRlbVByb3ZpZGVyID0gbmV3IFJlcG9ydEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByZXBvcnRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBsYXRlSXRlbVByb3ZpZGVyIHRlbXBsYXRlSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJaWYgKHRlbXBsYXRlSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRlbXBsYXRlSXRlbVByb3ZpZGVyID0gbmV3IFRlbXBsYXRlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyIHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXIgPSBuZXcgU3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckl0ZW1Qcm92aWRlciB0b29sTWVudG9ySXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCWlmICh0b29sTWVudG9ySXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JJdGVtUHJvdmlkZXIgPSBuZXcgVG9vbE1lbnRvckl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0b29sTWVudG9ySXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQlpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3aGl0ZXBhcGVySXRlbVByb3ZpZGVyID0gbmV3IFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd2hpdGVwYXBlckl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlpZiAodGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgPSBuZXcgVGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdGVybURlZmluaXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvQWRhcHRlcigpIHsKLQkJaWYgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyID0gbmV3IEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJdGVtUHJvdmlkZXIgcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlpZiAocHJhY3RpY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJhY3RpY2VJdGVtUHJvdmlkZXIgPSBuZXcgUHJhY3RpY2VJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJhY3RpY2VJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXR9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlciByZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmV1c2FibGVBc3NldEFkYXB0ZXIoKSB7Ci0JCWlmIChyZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgPSBuZXcgUmV1c2FibGVBc3NldEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByZXVzYWJsZUFzc2V0SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVJdGVtUHJvdmlkZXIgZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCkgewotCQlpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzY2lwbGluZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SXRlbVByb3ZpZGVyIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZVNldEl0ZW1Qcm92aWRlciA9IG5ldyBSb2xlU2V0SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVTZXRJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JdGVtUHJvdmlkZXIgZG9tYWluSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEb21haW5BZGFwdGVyKCkgewotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRvbWFpbkl0ZW1Qcm92aWRlciA9IG5ldyBEb21haW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZG9tYWluSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGV9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlciBkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IERpc2NpcGxpbmVHcm91cGluZ0l0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRvb2xJdGVtUHJvdmlkZXIgdG9vbEl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2x9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlpZiAodG9vbEl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0b29sSXRlbVByb3ZpZGVyID0gbmV3IFRvb2xJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gdG9vbEl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nfSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCWlmIChyb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyID0gbmV3IFJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyID0gbmV3IEN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciBjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKSB7Ci0JCWlmIChjYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlciA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIgZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc0l0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXB9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9hZG1hcEl0ZW1Qcm92aWRlciByb2FkbWFwSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCWlmIChyb2FkbWFwSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJvYWRtYXBJdGVtUHJvdmlkZXIgPSBuZXcgUm9hZG1hcEl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiByb2FkbWFwSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50UGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBDb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudH0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyIHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZX0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlQWRhcHRlcigpIHsKLQkJaWYgKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIgbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbkl0ZW1Qcm92aWRlciA9IG5ldyBNZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbkl0ZW1Qcm92aWRlciBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChzZWN0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXNlY3Rpb25JdGVtUHJvdmlkZXIgPSBuZXcgU2VjdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBzZWN0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlpZiAoYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlhcnRpZmFjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IEFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZGVsaXZlcmFibGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgUm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKHRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciB0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmICh0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJdGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID0gbmV3IFRhc2tEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiB0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb259IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciBndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCWlmIChndWlkYW5jZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCWd1aWRhbmNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcigKLQkJCQkJdGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBvbmUgYWRhcHRlciB1c2VkIGZvciBhbGwge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbn0gaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyIHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJaWYgKHByYWN0aWNlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcHJhY3RpY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKAotCQkJCQl0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgbWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbkl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uSXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIoCi0JCQkJCXRoaXMpOwotCQl9Ci0KLQkJcmV0dXJuIG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBrZWVwcyB0cmFjayBvZiB0aGUgb25lIGFkYXB0ZXIgdXNlZCBmb3IgYWxsIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHl9IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlciBwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhpcyBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0ZhbWlseUFkYXB0ZXIoKSB7Ci0JCWlmIChwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXByb2Nlc3NGYW1pbHlJdGVtUHJvdmlkZXIgPSBuZXcgUHJvY2Vzc0ZhbWlseUl0ZW1Qcm92aWRlcih0aGlzKTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIG9uZSBhZGFwdGVyIHVzZWQgZm9yIGFsbCB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5fSBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlpZiAobWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlciA9PSBudWxsKSB7Ci0JCQltZXRob2RMaWJyYXJ5SXRlbVByb3ZpZGVyID0gbmV3IE1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIodGhpcyk7Ci0JCX0KLQotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUl0ZW1Qcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHJvb3QgYWRhcHRlciBmYWN0b3J5IHRoYXQgY29udGFpbnMgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5IGdldFJvb3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudEFkYXB0ZXJGYWN0b3J5ID09IG51bGwgPyB0aGlzIDogcGFyZW50QWRhcHRlckZhY3RvcnkKLQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBzZXRzIHRoZSBjb21wb3NlZCBhZGFwdGVyIGZhY3RvcnkgdGhhdCBjb250YWlucyB0aGlzIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50QWRhcHRlckZhY3RvcnkoCi0JCQlDb21wb3NlZEFkYXB0ZXJGYWN0b3J5IHBhcmVudEFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXRoaXMucGFyZW50QWRhcHRlckZhY3RvcnkgPSBwYXJlbnRBZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiBzdXBwb3J0ZWRUeXBlcy5jb250YWlucyh0eXBlKSB8fCBzdXBlci5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc3Vic3RpdHV0ZXMgdGhlIGZhY3RvcnkgaXRzZWxmIGFzIHRoZSBrZXkgZm9yIHRoZSBhZGFwdGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gc3VwZXIuYWRhcHQobm90aWZpZXIsIHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgYWRhcHQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IHR5cGUpIHsKLQkJaWYgKGlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuYWRhcHQob2JqZWN0LCB0eXBlKTsKLQkJCWlmICghKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykKLQkJCQkJfHwgKCgoQ2xhc3M8Pz4pIHR5cGUpLmlzSW5zdGFuY2UoYWRhcHRlcikpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBsaXN0ZW5lci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTm90aWZ5Q2hhbmdlZExpc3RlbmVyIG5vdGlmeUNoYW5nZWRMaXN0ZW5lcikgewotCQljaGFuZ2VOb3RpZmllci5hZGRMaXN0ZW5lcihub3RpZnlDaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmVtb3ZlcyBhIGxpc3RlbmVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElOb3RpZnlDaGFuZ2VkTGlzdGVuZXIgbm90aWZ5Q2hhbmdlZExpc3RlbmVyKSB7Ci0JCWNoYW5nZU5vdGlmaWVyLnJlbW92ZUxpc3RlbmVyKG5vdGlmeUNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkZWxlZ2F0ZXMgdG8ge0BsaW5rICNjaGFuZ2VOb3RpZmllcn0gYW5kIHRvIHtAbGluayAjcGFyZW50QWRhcHRlckZhY3Rvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJY2hhbmdlTm90aWZpZXIuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQotCQlpZiAocGFyZW50QWRhcHRlckZhY3RvcnkgIT0gbnVsbCkgewotCQkJcGFyZW50QWRhcHRlckZhY3RvcnkuZmlyZU5vdGlmeUNoYW5nZWQobm90aWZpY2F0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgZGlzcG9zZXMgYWxsIG9mIHRoZSBpdGVtIHByb3ZpZGVycyBjcmVhdGVkIGJ5IHRoaXMgZmFjdG9yeS4gCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHBhY2thZ2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29uc3RyYWludEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29uc3RyYWludEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChraW5kSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlraW5kSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29udGVudERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc3VwcG9ydGluZ01hdGVyaWFsSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHNlY3Rpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXNlY3Rpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY29uY2VwdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29uY2VwdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjaGVja2xpc3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNoZWNrbGlzdEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChndWlkZWxpbmVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWd1aWRlbGluZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChleGFtcGxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlleGFtcGxlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJldXNhYmxlQXNzZXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGVybURlZmluaXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRlcm1EZWZpbml0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhcnRpZmFjdEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYXJ0aWZhY3RJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGZ1bGZpbGxhYmxlRWxlbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZnVsZmlsbGFibGVFbGVtZW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJlcG9ydEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcmVwb3J0SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRlbXBsYXRlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0ZW1wbGF0ZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0b29sTWVudG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0b29sTWVudG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJhYmxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyYWJsZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChvdXRjb21lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlvdXRjb21lSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN0ZXBJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXN0ZXBJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod2hpdGVwYXBlckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJd2hpdGVwYXBlckl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0YXNrSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0YXNrSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYXJ0aWZhY3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9sZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlyb2xlRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0YXNrRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcmFjdGljZURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVTZXRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJvbGVTZXRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZG9tYWluSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkb21haW5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdFR5cGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlzY2lwbGluZUdyb3VwaW5nSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaXNjaXBsaW5lR3JvdXBpbmdJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlzY2lwbGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGlzY2lwbGluZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJYWN0aXZpdHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocGxhbm5pbmdEYXRhSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwbGFubmluZ0RhdGFJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya09yZGVySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrT3JkZXJJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocm9hZG1hcEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9hZG1hcEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmICh0b29sSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0b29sSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHJvbGVTZXRHcm91cGluZ0l0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZVNldEdyb3VwaW5nSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGN1c3RvbUNhdGVnb3J5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQljdXN0b21DYXRlZ29yeUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb250ZW50UGFja2FnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29udGVudFBhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWlsZXN0b25lSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltaWxlc3RvbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAod29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoaXRlcmF0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlpdGVyYXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocGhhc2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBoYXNlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHRlYW1Qcm9maWxlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQl0ZWFtUHJvZmlsZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyb2xlRGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcm9sZURlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGFza0Rlc2NyaXB0b3JJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRhc2tEZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNvbXBvc2l0ZVJvbGVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGVsaXZlcnlQcm9jZXNzSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyeVByb2Nlc3NJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoY2FwYWJpbGl0eVBhdHRlcm5JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWNhcGFiaWxpdHlQYXR0ZXJuSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZENvbmZpZ3VyYXRpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAobWV0aG9kUGx1Z2luSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQltZXRob2RQbHVnaW5JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHByYWN0aWNlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcmFjdGljZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlhY3Rpdml0eURlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXByb2Nlc3NEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChkZXNjcmlwdG9yRGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudEl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzUGFja2FnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc1BhY2thZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGlhZ3JhbUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZGlhZ3JhbUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChncmFwaE5vZGVJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCWdyYXBoTm9kZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChyZWZlcmVuY2VJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXJlZmVyZW5jZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9wZXJ0eUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvcGVydHlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocG9pbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXBvaW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGRpYWdyYW1MaW5rSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaWFncmFtTGlua0l0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChncmFwaENvbm5lY3Rvckl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZ3JhcGhDb25uZWN0b3JJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZ3JhcGhFZGdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlncmFwaEVkZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZGltZW5zaW9uSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlkaW1lbnNpb25JdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAodGV4dEVsZW1lbnRJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCXRleHRFbGVtZW50SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGltYWdlSXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlpbWFnZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwb2x5bGluZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJcG9seWxpbmVJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCQlpZiAoZWxsaXBzZUl0ZW1Qcm92aWRlciAhPSBudWxsKQotCQkJZWxsaXBzZUl0ZW1Qcm92aWRlci5kaXNwb3NlKCk7Ci0JCWlmIChwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyICE9IG51bGwpCi0JCQlwcm9jZXNzRmFtaWx5SXRlbVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJaWYgKG1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIgIT0gbnVsbCkKLQkJCW1ldGhvZExpYnJhcnlJdGVtUHJvdmlkZXIuZGlzcG9zZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1ZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTdkNTc5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9WYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5Db21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSXRlbVByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5WaWV3ZXJOb3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnR9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFZhcmlhYmlsaXR5RWxlbWVudEl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50UHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFyaWFiaWxpdHlUeXBlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF92YXJpYWJpbGl0eVR5cGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlUeXBlX2ZlYXR1cmUiLCAiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgVmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudCBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnRfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudF9mZWF0dXJlIiwgIl9VSV9WYXJpYWJpbGl0eUVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1ZhcmlhYmlsaXR5RWxlbWVudF90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfVmFyaWFiaWxpdHlFbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9XaGl0ZXBhcGVySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV2hpdGVwYXBlckl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTBjOGJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9XaGl0ZXBhcGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXJ9IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdoaXRlcGFwZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb25jZXB0SXRlbVByb3ZpZGVyIGltcGxlbWVudHMKLQkJSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXaGl0ZXBhcGVyLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1doaXRlcGFwZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV2hpdGVwYXBlcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9XaGl0ZXBhcGVyX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9XaGl0ZXBhcGVyX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrQnJlYWtkb3duRWxlbWVudEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZDY2OGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlCcmVha2Rvd25FbGVtZW50SXRlbVByb3ZpZGVyIGltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsCi0JCUlTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwgSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya0JyZWFrZG93bkVsZW1lbnRJdGVtUHJvdmlkZXIoQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoYWRhcHRlckZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgcHJvcGVydHkgZGVzY3JpcHRvcnMgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PElJdGVtUHJvcGVydHlEZXNjcmlwdG9yPiBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KTsKLQotCQkJYWRkSXNSZXBlYXRhYmxlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRJc09uZ29pbmdQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZElzRXZlbnREcml2ZW5Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZExpbmtUb1ByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJcyBSZXBlYXRhYmxlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXNSZXBlYXRhYmxlUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzUmVwZWF0YWJsZV9mZWF0dXJlIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSXMgT25nb2luZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzT25nb2luZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrQnJlYWtkb3duRWxlbWVudF9pc09uZ29pbmdfZmVhdHVyZSIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIElzIEV2ZW50IERyaXZlbiBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZElzRXZlbnREcml2ZW5Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfaXNFdmVudERyaXZlbl9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2lzRXZlbnREcml2ZW5fZmVhdHVyZSIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGluayBUbyBQcmVkZWNlc3NvciBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpbmtUb1ByZWRlY2Vzc29yUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X2xpbmtUb1ByZWRlY2Vzc29yX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfbGlua1RvUHJlZGVjZXNzb3JfZmVhdHVyZSIsICJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya0JyZWFrZG93bkVsZW1lbnRfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtCcmVha2Rvd25FbGVtZW50X3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzA5ZDEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtEZWZpbml0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9ufSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlciBleHRlbmRzIE1ldGhvZEVsZW1lbnRJdGVtUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwgSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLAotCQlJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsIElJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrRGVmaW5pdGlvbkl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCX0KLQkJcmV0dXJuIGl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc3BlY2lmaWVzIGhvdyB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRDaGlsZHJlbn0gYW5kIGlzIHVzZWQgdG8gZGVkdWNlIGFuIGFwcHJvcHJpYXRlIGZlYXR1cmUgZm9yIGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWRkQ29tbWFuZH0sIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLlJlbW92ZUNvbW1hbmR9IG9yCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuTW92ZUNvbW1hbmR9IGluIHtAbGluayAjY3JlYXRlQ29tbWFuZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZ2V0Q2hpbGRyZW5GZWF0dXJlcygKLQkJCU9iamVjdCBvYmplY3QpIHsKLQkJaWYgKGNoaWxkcmVuRmVhdHVyZXMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0Q2hpbGRyZW5GZWF0dXJlcyhvYmplY3QpOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQkJY2hpbGRyZW5GZWF0dXJlcwotCQkJCQkuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OKTsKLQkJfQotCQlyZXR1cm4gY2hpbGRyZW5GZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENoaWxkRmVhdHVyZShPYmplY3Qgb2JqZWN0LCBPYmplY3QgY2hpbGQpIHsKLQkJLy8gQ2hlY2sgdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBjaGlsZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcHJvcGVyIGZlYXR1cmUgdG8gdXNlIGZvcgotCQkvLyBhZGRpbmcgKHNlZSB7QGxpbmsgQWRkQ29tbWFuZH0pIGl0IGFzIGEgY2hpbGQuCi0KLQkJcmV0dXJuIHN1cGVyLmdldENoaWxkRmVhdHVyZShvYmplY3QsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya0RlZmluaXRpb24pIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya0RlZmluaXRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtEZWZpbml0aW9uX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCi0JCXN3aXRjaCAobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChXb3JrRGVmaW5pdGlvbi5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCi0JCW5ld0NoaWxkRGVzY3JpcHRvcnMuYWRkKGNyZWF0ZUNoaWxkUGFyYW1ldGVyKAotCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0KLQkJbmV3Q2hpbGREZXNjcmlwdG9ycy5hZGQoY3JlYXRlQ2hpbGRQYXJhbWV0ZXIoCi0JCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29uc3RyYWludCgpKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5DcmVhdGVDaGlsZENvbW1hbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlQ2hpbGRUZXh0KE9iamVjdCBvd25lciwgT2JqZWN0IGZlYXR1cmUsCi0JCQlPYmplY3QgY2hpbGQsIENvbGxlY3Rpb248Pz4gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBjaGlsZEZlYXR1cmUgPSBmZWF0dXJlOwotCQlPYmplY3QgY2hpbGRPYmplY3QgPSBjaGlsZDsKLQotCQlib29sZWFuIHF1YWxpZnkgPSBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVMKLQkJCQl8fCBjaGlsZEZlYXR1cmUgPT0gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTgotCQkJCXx8IGNoaWxkRmVhdHVyZSA9PSBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQotCQlpZiAocXVhbGlmeSkgewotCQkJcmV0dXJuIGdldFN0cmluZygiX1VJX0NyZWF0ZUNoaWxkX3RleHQyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgT2JqZWN0W10geyBnZXRUeXBlVGV4dChjaGlsZE9iamVjdCksCi0JCQkJCQkJZ2V0RmVhdHVyZVRleHQoY2hpbGRGZWF0dXJlKSwgZ2V0VHlwZVRleHQob3duZXIpIH0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRDcmVhdGVDaGlsZFRleHQob3duZXIsIGZlYXR1cmUsIGNoaWxkLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrT3JkZXJJdGVtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4MDA3MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya09yZGVySXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBpdGVtIHByb3ZpZGVyIGFkYXB0ZXIgZm9yIGEge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyfSBvYmplY3QuCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrT3JkZXJJdGVtUHJvdmlkZXIgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEl0ZW1Qcm92aWRlciBpbXBsZW1lbnRzCi0JCUlFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRMaW5rVHlwZVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkUHJlZFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgTGluayBUeXBlIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTGlua1R5cGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya09yZGVyX2xpbmtUeXBlX2ZlYXR1cmUiLCAiX1VJX1dvcmtPcmRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfX0xJTktfVFlQRSwgdHJ1ZSwgZmFsc2UsCi0JCQkJCQlmYWxzZSwgSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLAotCQkJCQkJbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBQcmVkIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJlZFByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrT3JkZXJfcHJlZF9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtPcmRlcl9wcmVkX2ZlYXR1cmUiLCAiX1VJX1dvcmtPcmRlcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfX1BSRUQsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBXb3JrT3JkZXIuZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya09yZGVyIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtPcmRlcikgb2JqZWN0KS5nZXROYW1lKCk7Ci0JCXJldHVybiBsYWJlbCA9PSBudWxsIHx8IGxhYmVsLmxlbmd0aCgpID09IDAgPyBnZXRTdHJpbmcoIl9VSV9Xb3JrT3JkZXJfdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtPcmRlcl90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQotCQlzd2l0Y2ggKG5vdGlmaWNhdGlvbi5nZXRGZWF0dXJlSUQoV29ya09yZGVyLmNsYXNzKSkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkl0ZW1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTVkNjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuVmlld2VyTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb259IG9iamVjdC4KLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgZXh0ZW5kcwotCQlDb250ZW50RGVzY3JpcHRpb25JdGVtUHJvdmlkZXIgaW1wbGVtZW50cyBJRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlciwKLQkJSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyLCBJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlJdGVtTGFiZWxQcm92aWRlciwgSUl0ZW1Qcm9wZXJ0eVNvdXJjZSB7Ci0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RzIGFuIGluc3RhbmNlIGZyb20gYSBmYWN0b3J5IGFuZCBhIG5vdGlmaWVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEltcGFjdE9mTm90SGF2aW5nUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZWFzb25zRm9yTm90TmVlZGluZ1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUHVycG9zZSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFB1cnBvc2VQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9wdXJwb3NlX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgSW1wYWN0IE9mIE5vdCBIYXZpbmcgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbXBhY3RPZk5vdEhhdmluZ1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX2ltcGFjdE9mTm90SGF2aW5nX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdGlvbl9pbXBhY3RPZk5vdEhhdmluZ19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywKLQkJCQkJCXRydWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkJCUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IuR0VORVJJQ19WQUxVRV9JTUFHRSwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBSZWFzb25zIEZvciBOb3QgTmVlZGluZyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlYXNvbnNGb3JOb3ROZWVkaW5nUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fcmVhc29uc0Zvck5vdE5lZWRpbmdfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uX3JlYXNvbnNGb3JOb3ROZWVkaW5nX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uZ2lmLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0SW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gb3ZlcmxheUltYWdlKG9iamVjdCwgZ2V0UmVzb3VyY2VMb2NhdG9yKCkuZ2V0SW1hZ2UoCi0JCQkJImZ1bGwvb2JqMTYvV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0aW9uKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRpb25fdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCWZpcmVOb3RpZnlDaGFuZ2VkKG5ldyBWaWV3ZXJOb3RpZmljYXRpb24obm90aWZpY2F0aW9uLCBub3RpZmljYXRpb24KLQkJCQkJLmdldE5vdGlmaWVyKCksIGZhbHNlLCB0cnVlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOWI5OWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLlZpZXdlck5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySXRlbVByb3ZpZGVyIGV4dGVuZHMgRGVzY3JpcHRvckl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRvckl0ZW1Qcm92aWRlcihBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeSkgewotCQlzdXBlcihhZGFwdGVyRmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3Q8SUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I+IGdldFByb3BlcnR5RGVzY3JpcHRvcnMoT2JqZWN0IG9iamVjdCkgewotCQlpZiAoaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMgPT0gbnVsbCkgewotCQkJc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhvYmplY3QpOwotCi0JCQlhZGRBY3Rpdml0eUVudHJ5U3RhdGVQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZEFjdGl2aXR5RXhpdFN0YXRlUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRXb3JrUHJvZHVjdFByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW1wYWN0ZWRCeVByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkSW1wYWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQkJYWRkRGVsaXZlcmFibGVQYXJ0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpdml0eUVudHJ5U3RhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2FjdGl2aXR5RW50cnlTdGF0ZV9mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9hY3Rpdml0eUVudHJ5U3RhdGVfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIGZhbHNlLAotCQkJCQkJSXRlbVByb3BlcnR5RGVzY3JpcHRvci5HRU5FUklDX1ZBTFVFX0lNQUdFLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEFjdGl2aXR5IEV4aXQgU3RhdGUgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpdml0eUV4aXRTdGF0ZVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfYWN0aXZpdHlFeGl0U3RhdGVfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUsCi0JCQkJCQl0cnVlLCBmYWxzZSwgZmFsc2UsCi0JCQkJCQlJdGVtUHJvcGVydHlEZXNjcmlwdG9yLkdFTkVSSUNfVkFMVUVfSU1BR0UsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0IGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkV29ya1Byb2R1Y3RQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0X2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QsCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBhY3RlZCBCeSBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcGFjdGVkQnlQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2ltcGFjdGVkQnlfZmVhdHVyZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlnZXRTdHJpbmcoCi0JCQkJCQkJCSJfVUlfUHJvcGVydHlEZXNjcmlwdG9yX2Rlc2NyaXB0aW9uIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0ZWRCeV9mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlksCi0JCQkJCQl0cnVlLCBmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBJbXBhY3RzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wYWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfaW1wYWN0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9pbXBhY3RzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgRGVsaXZlcmFibGUgUGFydHMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWxpdmVyYWJsZVBhcnRzUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0RGVzY3JpcHRvcl9kZWxpdmVyYWJsZVBhcnRzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX2RlbGl2ZXJhYmxlUGFydHNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0RGVzY3JpcHRvciIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIGFkYXB0ZWQgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIGxhYmVsID0gKChXb3JrUHJvZHVjdERlc2NyaXB0b3IpIG9iamVjdCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbGFiZWwgPT0gbnVsbCB8fCBsYWJlbC5sZW5ndGgoKSA9PSAwID8gZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3REZXNjcmlwdG9yX3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdERlc2NyaXB0b3JfdHlwZSIpICsgIiAiICsgbGFiZWw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlcyBtb2RlbCBub3RpZmljYXRpb25zIGJ5IGNhbGxpbmcge0BsaW5rICN1cGRhdGVDaGlsZHJlbn0gdG8gdXBkYXRlIGFueSBjYWNoZWQKLQkgKiBjaGlsZHJlbiBhbmQgYnkgY3JlYXRpbmcgYSB2aWV3ZXIgbm90aWZpY2F0aW9uLCB3aGljaCBpdCBwYXNzZXMgdG8ge0BsaW5rICNmaXJlTm90aWZ5Q2hhbmdlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0JCXVwZGF0ZUNoaWxkcmVuKG5vdGlmaWNhdGlvbik7Ci0KLQkJc3dpdGNoIChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcykpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJZmlyZU5vdGlmeUNoYW5nZWQobmV3IFZpZXdlck5vdGlmaWNhdGlvbihub3RpZmljYXRpb24sIG5vdGlmaWNhdGlvbgotCQkJCQkuZ2V0Tm90aWZpZXIoKSwgZmFsc2UsIHRydWUpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9Xb3JrUHJvZHVjdEl0ZW1Qcm92aWRlci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YzUwY2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0SXRlbVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JRWRpdGluZ0RvbWFpbkl0ZW1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1Qcm9wZXJ0eVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC5wcm92aWRlci5JU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGl0ZW0gcHJvdmlkZXIgYWRhcHRlciBmb3IgYSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RJdGVtUHJvdmlkZXIgZXh0ZW5kcyBDb250ZW50RWxlbWVudEl0ZW1Qcm92aWRlcgotCQlpbXBsZW1lbnRzIElFZGl0aW5nRG9tYWluSXRlbVByb3ZpZGVyLCBJU3RydWN0dXJlZEl0ZW1Db250ZW50UHJvdmlkZXIsCi0JCUlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciwgSUl0ZW1MYWJlbFByb3ZpZGVyLCBJSXRlbVByb3BlcnR5U291cmNlIHsKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdHMgYW4gaW5zdGFuY2UgZnJvbSBhIGZhY3RvcnkgYW5kIGEgbm90aWZpZXIuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0SXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZEZ1bGZpbGxzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRSZXBvcnRzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJCWFkZFRvb2xNZW50b3JzUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCk7Ci0JCQlhZGRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNQcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gaXRlbVByb3BlcnR5RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIGEgcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgdGhlIEZ1bGZpbGxzIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRnVsZmlsbHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfRnVsZmlsbGFibGVFbGVtZW50X2Z1bGZpbGxzX2ZlYXR1cmUiLCAiX1VJX0Z1bGZpbGxhYmxlRWxlbWVudF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTLAotCQkJCQkJdHJ1ZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgUmVwb3J0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlcG9ydHNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfcmVwb3J0c19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X3JlcG9ydHNfZmVhdHVyZSIsICJfVUlfV29ya1Byb2R1Y3RfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1JFUE9SVFMsIHRydWUsIGZhbHNlLAotCQkJCQkJdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUZW1wbGF0ZXMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUZW1wbGF0ZXNQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlpdGVtUHJvcGVydHlEZXNjcmlwdG9ycwotCQkJCS5hZGQoY3JlYXRlSXRlbVByb3BlcnR5RGVzY3JpcHRvcigKLQkJCQkJCSgoQ29tcG9zZWFibGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpCi0JCQkJCQkJCS5nZXRSb290QWRhcHRlckZhY3RvcnkoKSwKLQkJCQkJCWdldFJlc291cmNlTG9jYXRvcigpLAotCQkJCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RfdGVtcGxhdGVzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19URU1QTEFURVMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBUb29sIE1lbnRvcnMgZmVhdHVyZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb29sTWVudG9yc1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF90b29sTWVudG9yc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X3Rvb2xNZW50b3JzX2ZlYXR1cmUiLCAiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMsIHRydWUsCi0JCQkJCQlmYWxzZSwgdHJ1ZSwgbnVsbCwgbnVsbCwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIHRoZSBFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIGZlYXR1cmUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJaXRlbVByb3BlcnR5RGVzY3JpcHRvcnMKLQkJCQkuYWRkKGNyZWF0ZUl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3IoCi0JCQkJCQkoKENvbXBvc2VhYmxlQWRhcHRlckZhY3RvcnkpIGFkYXB0ZXJGYWN0b3J5KQotCQkJCQkJCQkuZ2V0Um9vdEFkYXB0ZXJGYWN0b3J5KCksCi0JCQkJCQlnZXRSZXNvdXJjZUxvY2F0b3IoKSwKLQkJCQkJCWdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWdldFN0cmluZygKLQkJCQkJCQkJIl9VSV9Qcm9wZXJ0eURlc2NyaXB0b3JfZGVzY3JpcHRpb24iLCAiX1VJX1dvcmtQcm9kdWN0X2VzdGltYXRpb25Db25zaWRlcmF0aW9uc19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdF90eXBlIiksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0LmdpZi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG92ZXJsYXlJbWFnZShvYmplY3QsIGdldFJlc291cmNlTG9jYXRvcigpLmdldEltYWdlKAotCQkJCSJmdWxsL29iajE2L1dvcmtQcm9kdWN0IikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iamVjdCkgewotCQlTdHJpbmcgbGFiZWwgPSAoKFdvcmtQcm9kdWN0KSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0X3R5cGUiKSA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdF90eXBlIikgKyAiICIgKyBsYWJlbDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVzIG1vZGVsIG5vdGlmaWNhdGlvbnMgYnkgY2FsbGluZyB7QGxpbmsgI3VwZGF0ZUNoaWxkcmVufSB0byB1cGRhdGUgYW55IGNhY2hlZAotCSAqIGNoaWxkcmVuIGFuZCBieSBjcmVhdGluZyBhIHZpZXdlciBub3RpZmljYXRpb24sIHdoaWNoIGl0IHBhc3NlcyB0byB7QGxpbmsgI2ZpcmVOb3RpZnlDaGFuZ2VkfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJdXBkYXRlQ2hpbGRyZW4obm90aWZpY2F0aW9uKTsKLQkJc3VwZXIubm90aWZ5Q2hhbmdlZChub3RpZmljYXRpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVkaXQuY29tbWFuZC5Db21tYW5kUGFyYW1ldGVyfXMgZGVzY3JpYmluZyB0aGUgY2hpbGRyZW4KLQkgKiB0aGF0IGNhbiBiZSBjcmVhdGVkIHVuZGVyIHRoaXMgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3ROZXdDaGlsZERlc2NyaXB0b3JzKAotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NoaWxkRGVzY3JpcHRvcnMsIE9iamVjdCBvYmplY3QpIHsKLQkJc3VwZXIuY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMobmV3Q2hpbGREZXNjcmlwdG9ycywgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3IgZm9yIHRoaXMgaXRlbSBwcm92aWRlcidzIHJlc291cmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcigpIHsKLQkJcmV0dXJuIFVtYUVkaXRQbHVnaW4uSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDQ2NTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Byb3ZpZGVyL1dvcmtQcm9kdWN0VHlwZUl0ZW1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLkNvbXBvc2VhYmxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklJdGVtUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVN0cnVjdHVyZWRJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LnByb3ZpZGVyLklUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgaXRlbSBwcm92aWRlciBhZGFwdGVyIGZvciBhIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZX0gb2JqZWN0LgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SXRlbVByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUVkaXRpbmdEb21haW5JdGVtUHJvdmlkZXIsIElTdHJ1Y3R1cmVkSXRlbUNvbnRlbnRQcm92aWRlciwKLQkJSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyLCBJSXRlbUxhYmVsUHJvdmlkZXIsIElJdGVtUHJvcGVydHlTb3VyY2UgewotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0cyBhbiBpbnN0YW5jZSBmcm9tIGEgZmFjdG9yeSBhbmQgYSBub3RpZmllci4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlSXRlbVByb3ZpZGVyKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIHByb3BlcnR5IGRlc2NyaXB0b3JzIGZvciB0aGUgYWRhcHRlZCBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxJSXRlbVByb3BlcnR5RGVzY3JpcHRvcj4gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChpdGVtUHJvcGVydHlEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQlzdXBlci5nZXRQcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCk7Ci0KLQkJCWFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihvYmplY3QpOwotCQl9Ci0JCXJldHVybiBpdGVtUHJvcGVydHlEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkZHMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciB0aGUgV29yayBQcm9kdWN0cyBmZWF0dXJlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFdvcmtQcm9kdWN0c1Byb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCWl0ZW1Qcm9wZXJ0eURlc2NyaXB0b3JzCi0JCQkJLmFkZChjcmVhdGVJdGVtUHJvcGVydHlEZXNjcmlwdG9yKAotCQkJCQkJKChDb21wb3NlYWJsZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdGVyRmFjdG9yeSkKLQkJCQkJCQkJLmdldFJvb3RBZGFwdGVyRmFjdG9yeSgpLAotCQkJCQkJZ2V0UmVzb3VyY2VMb2NhdG9yKCksCi0JCQkJCQlnZXRTdHJpbmcoIl9VSV9Xb3JrUHJvZHVjdFR5cGVfd29ya1Byb2R1Y3RzX2ZlYXR1cmUiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZ2V0U3RyaW5nKAotCQkJCQkJCQkiX1VJX1Byb3BlcnR5RGVzY3JpcHRvcl9kZXNjcmlwdGlvbiIsICJfVUlfV29ya1Byb2R1Y3RUeXBlX3dvcmtQcm9kdWN0c19mZWF0dXJlIiwgIl9VSV9Xb3JrUHJvZHVjdFR5cGVfdHlwZSIpLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUywKLQkJCQkJCXRydWUsIGZhbHNlLCB0cnVlLCBudWxsLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByZXR1cm5zIFdvcmtQcm9kdWN0VHlwZS5naWYuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvdmVybGF5SW1hZ2Uob2JqZWN0LCBnZXRSZXNvdXJjZUxvY2F0b3IoKS5nZXRJbWFnZSgKLQkJCQkiZnVsbC9vYmoxNi9Xb3JrUHJvZHVjdFR5cGUiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBhZGFwdGVkIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICgoV29ya1Byb2R1Y3RUeXBlKSBvYmplY3QpLmdldE5hbWUoKTsKLQkJcmV0dXJuIGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCA/IGdldFN0cmluZygiX1VJX1dvcmtQcm9kdWN0VHlwZV90eXBlIikgOiAvLyROT04tTkxTLTEkCi0JCQkJZ2V0U3RyaW5nKCJfVUlfV29ya1Byb2R1Y3RUeXBlX3R5cGUiKSArICIgIiArIGxhYmVsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXMgbW9kZWwgbm90aWZpY2F0aW9ucyBieSBjYWxsaW5nIHtAbGluayAjdXBkYXRlQ2hpbGRyZW59IHRvIHVwZGF0ZSBhbnkgY2FjaGVkCi0JICogY2hpbGRyZW4gYW5kIGJ5IGNyZWF0aW5nIGEgdmlld2VyIG5vdGlmaWNhdGlvbiwgd2hpY2ggaXQgcGFzc2VzIHRvIHtAbGluayAjZmlyZU5vdGlmeUNoYW5nZWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQl1cGRhdGVDaGlsZHJlbihub3RpZmljYXRpb24pOwotCQlzdXBlci5ub3RpZnlDaGFuZ2VkKG5vdGlmaWNhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGRzIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWRpdC5jb21tYW5kLkNvbW1hbmRQYXJhbWV0ZXJ9cyBkZXNjcmliaW5nIHRoZSBjaGlsZHJlbgotCSAqIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdE5ld0NoaWxkRGVzY3JpcHRvcnMoCi0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q2hpbGREZXNjcmlwdG9ycywgT2JqZWN0IG9iamVjdCkgewotCQlzdXBlci5jb2xsZWN0TmV3Q2hpbGREZXNjcmlwdG9ycyhuZXdDaGlsZERlc2NyaXB0b3JzLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbG9jYXRvciBmb3IgdGhpcyBpdGVtIHByb3ZpZGVyJ3MgcmVzb3VyY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gVW1hRWRpdFBsdWdpbi5JTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcHJvdmlkZXIvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Y4ZWJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9wcm92aWRlci9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpdGVtIHByb3ZpZGVycyBmb3IgZGlzcGxheWluZyBhbmQgZWRpdGluZyB0aGUgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjVhYzA2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmUyN2ZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudW1hPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWVjN2FkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnVtYTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlO3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLAotIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmFmZDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1ODA5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIgbnNQcmVmaXg9ImNvbS5pYm0udW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2xhc3NpZmllciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9UeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgQ2xhc3NpZmllci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHlwZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVzcGFjZSAjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgY2xhc3MgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gaXMgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMgTWV0aG9kIEVsZW1lbnQgaXMgdGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgY2xhc3NlcyBhbmQgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgZXZlcnkgb3RoZXIgZWxlbWVudCB0eXBlIG9mIHRoaXMgbW9kZWwuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4gIE1ldGhvZCBFbGVtZW50IGluaGVyaXRzIHRoZSBOYW1lIGF0dHJpYnV0ZSBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQncyBzdXBlciBjbGFzcy4gIEV2ZXJ5IGVsZW1lbnQgZGVmaW5lZCBhcyBhIFVNQSBpbnN0YW5jZSBpcyBkZXJpdmVkIGZyb20gTW9kZWwgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGluLXN0YW5jZSBpcyBhdCBsZWFzdCBkZWZpbmVkIGJ5IGEgdW5pcXVlIGlkLCBhIG5hbWUsIGFzIHdlbGwgYXMgYnJpZWYgZGVzY3JpcHRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imd1aWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im93bmVkUnVsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQgIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHNBbmRQYXBlcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hlY2tsaXN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imd1aWRlbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0d1aWRlbGluZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleGFtcGxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXhhbXBsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3NldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JldXNhYmxlQXNzZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub2RlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTZWN0aW9uIGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlY2Vzc29yIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAmI3hEOyYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibW9kaWZpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0IiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4mI3hEOyYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRlIiBlVHlwZT0iIy8vRXN0aW1hdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRhc2siIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUYXNrIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uJiN4RDsmI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEQ7JiN4QTtBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAmI3hEOyYjeEE7Rm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldmVsb3AgVXNlIENhc2UgTW9kZWwmcXVvdDsgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAmcXVvdDttZXRob2QmcXVvdDsgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRCeSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N0ZXAiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRlIiBlVHlwZT0iIy8vRXN0aW1hdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEQ7JiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGVwIiBlU3VwZXJUeXBlcz0iIy8vU2VjdGlvbiAjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuJiN4RDsmI3hBO0EgU3RlcCBkZXNjcmliZXMgYSBtZWFuaW5nZnVsIGFuZCBjb25zaXN0IHBhcnQgb2YgdGhlIG92ZXJhbGwgd29yayBkZXNjcmliZWQgZm9yIGEgVGFzay4gIFRoZSBjb2xsZWN0aW9uIG9mIFN0ZXBzIGRlZmluZWQgZm9yIGEgVGFzayByZXByZXNlbnRzIGFsbCB0aGUgd29yayB0aGF0IHNob3VsZCBiZSBkb25lIHRvIGFjaGlldmUgdGhlIG92ZXJhbGwgZGV2ZWxvcG1lbnQgZ29hbCBvZiB0aGUgVGFzay4gIE5vdCBhbGwgc3RlcHMgYXJlIG5lY2Vzc2FyaWx5IHBlcmZvcm1lZCBlYWNoIHRpbWUgYSBUYXNrIGlzIGludm9rZWQgaW4gYSBQcm9jZXNzIChzZWUgVGFzayBEZXNjcmlwdG9yKSwgc28gdGhleSBjYW4gYWxzbyBiZSBleHByZXNzZWQgaW4gdGhlIGZvcm0gb2YgYWx0ZXJuYXRlICdmbG93cycgb2Ygd29yay4gIERpZmZlcmVudCB3YXlzIG9mIGFjaGlldmluZyB0aGUgc2FtZSBkZXZlbG9wbWVudCBnb2FsIGNhbiB0aGVuIGJlICdhc3NlbWJsZWQnIGJ5IHNlbGVjdGluZyBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIHN0ZXBzIHdoZW4gYXBwbHlpbmcgdGhlIFRhc2sgaW4gYSBQcm9jZXNzLiAgVHlwaWNhbCBraW5kcyBvZiBzdGVwcyBhIFRhc2sgYXV0aG9yIHNob3VsZCBjb25zaWRlciBhcmU6IFRoaW5raW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyB1bmRlcnN0YW5kIHRoZSBuYXR1cmUgb2YgdGhlIHRhc2ssIGdhdGhlcnMgYW5kIGV4YW1pbmVzIHRoZSBpbnB1dCBhcnRpZmFjdHMsIGFuZCBmb3JtdWxhdGVzIHRoZSBvdXRjb21lLiBQZXJmb3JtaW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBjcmVhdGUgb3IgdXBkYXRlIHNvbWUgYXJ0aWZhY3RzLiBSZXZpZXdpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGluc3BlY3RzIHRoZSByZXN1bHRzIGFnYWluc3Qgc29tZSBjcml0ZXJpYS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGFuY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEQ7JiN4QTtBcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgJnF1b3Q7b3duJnF1b3Q7IGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBlVHlwZT0iIy8vQXJ0aWZhY3QiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkQXJ0aWZhY3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BcnRpZmFjdCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iT3V0Y29tZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdsb2JhbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGFyZW50UGFja2FnZSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vTWV0aG9kUGFja2FnZS9wYXJlbnRQYWNrYWdlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNFdmVudERyaXZlbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrT3JkZXIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVmaXgiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1BsYW5uZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNPcHRpb25hbCBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iIy8vQnJlYWtkb3duRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgZVR5cGU9IiMvL1BsYW5uaW5nRGF0YSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3Jtc0FkZGl0aW9uYWxseSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0c0luIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrZWRPbkJ5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1zQXNPd25lciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRhc2siIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9wZXJmb3Jtc0FkZGl0aW9uYWxseSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Sb2xlRGVzY3JpcHRvci9hc3Npc3RzSW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXRUbyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVPcHBvc2l0ZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL09wdGlvbmFsSW5wdXRUbyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivb3V0cHV0RnJvbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIgotICAgICAgICBlT3Bwb3NpdGU9IiMvL1JvbGVEZXNjcmlwdG9yL3BlcmZvcm1zQXNPd25lciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrZWRPbkJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvbW9kaWZpZXMiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dEZyb20iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiCi0gICAgICAgIGVPcHBvc2l0ZT0iIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEQ7JiN4QTtBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJob3d0b1N0YWZmIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3MiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmlza0xldmVsIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY29wZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZmluZWREZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbmNlcHQgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDaGVja2xpc3QiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEVzdGltYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbk1ldHJpYyIgZVR5cGU9IiMvL0VzdGltYXRpbmdNZXRyaWMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25kZXJhdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBNZXRyaWMgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZyYjeEQ7JiN4QTtob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuJiN4RDsmI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXQiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRvbWFpbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRG9tYWluIGlzIGEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LiYjeEQ7JiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RvbWFpbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZVNldHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVTZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuJiN4RDsmI3hBO0EgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb21tdW5pY2F0aW9uc01hdGVyaWFscyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3MiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdENvbnRleHQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbGlkQ29udGV4dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4mI3hEOyYjeEE7QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3MiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hEOyYjeEE7QW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4RDsmI3hBO1VNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc0VsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFza0Rlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZUlPIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4mI3hEOyYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4RDsmI3hBO1NwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb250cmlidXRpb24gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBleHRlcm5hbGx5IGRlZmluZXMgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIHRvIGFuIGV4aXN0aW5nIFByb2Nlc3Mgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIGV4aXN0aW5nIFByb2Nlc3MuICBJdCBhY2hpZXZlcyB0aGlzIGJ5IGRlc2NyaWJpbmcgdGhlc2UgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIGluIGEgc2VwYXJhdGUgUHJvY2VzcyBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSdzIGVsZW1lbnRzIHJlbGF0ZSB0byB0aGUgb3RoZXIgUHJvY2VzcycgZWxlbWVudHMgdXNpbmcgQ29udHJpYnV0ZXMgYW5kIFJlcGxhY2UgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb25zLiAgUHJvY2VzcyBDb250cmlidXRpb25zIGFyZSBub3JtYWxseSBwYWNrYWdlZCB3aXRoIE1ldGhvZCBQbHVnaW5zIHRoYXQgZXh0ZW5kIGV4aXN0aW5nIE1ldGhvZCBQbHVnaW4gd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiYjeEQ7JiN4QTtBIFByb2Nlc3MgQ29udHJpYnV0aW9uIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgYXBwbGllcyB0aGUgc2VtYW50aWNzIG9mIHRoZSBDb250cmlidXRlcyBhbmQgUmVwbGFjZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gb24gUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIENvbnRyaWJ1dGlvbiBpcyBhIGtpbmQgb2YgJ3Byb2Nlc3MgcGx1Zy1pbicgdGhhdCAncGx1Z3MnIGFkZGl0aW9uYWwgYnJlYWtkb3duIHN0cnVjdHVyZXMgaW50byBhbiBleGl0aW5nIHByb2Nlc3MgYW5kIHRoZXJlZm9yZSB1cGRhdGVzIGl0IGEtcG9zdGVyaW9yaSB3aXRoIG5ldyBvciBjaGFuZ2VkIGNhcGFiaWxpdGllcy4gIFR5cGljYWwgYXBwbGljYXRpb25zIG9mIFByb2Nlc3MgQ29udHJpYnV0aW9ucyBhcmUgTWV0aG9kIFBsdWdpbnMgdGhhdCBhZGQgY29udGVudCBmcm9tIHNwZWNpZmljIGFyZWFzIHRvIGFuIGV4aXN0aW5nIGRvbWFpbi4gIEluIGFkZGl0aW9uIHRvIGp1c3QgY29udHJpYnV0aW5nIG5ldyBtZXRob2QgY29udGVudCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgVGFzayBhbmQgV29yayBQcm9kdWN0cywgUHJvY2VzcyBDb250cmlidXRpb25zIGNhbiBhbHNvIGRlZmluZSB3aGVyZSBpbiB0aGUgUHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgd2l0aCB0aGlzIG1ldGhvZCBjb250ZW50IHRob3NlIG5ldyBhZGRpdGlvbnMgc2hvdWxkIGJlIGFwcGxpZWQuICBNb3Jlb3ZlciwgaXQgYWxsb3dzIGRlZmluaW5nIHdob2xlIG5ldyBvciBjaGFuZ2VkIEFjdGl2aXRpZXMgd2l0aGluIHRoZXNlIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZVByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMi91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2OTA1OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4yL3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgY29weXJpZ2h0VGV4dD0iSUJNIFJhdGlvbmFsIFNvZnR3YXJlIgotICAgIG1vZGVsRGlyZWN0b3J5PSIvY29tLmlibS51bWEvc3JjIiBlZGl0RGlyZWN0b3J5PSIvY29tLmlibS51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL2NvbS5pYm0udW1hLmVkaXRvci9zcmMiCi0gICAgbW9kZWxQbHVnaW5JRD0iY29tLmlibS51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvY29tLmlibS51bWEuZWNvcmUvdGVtcGxhdGVzIiBydW50aW1lSmFyPSJ0cnVlIgotICAgIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9ImNvbS5pYm0udW1hLnByb3ZpZGVyLlVtYUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9ImNvbS5pYm0udW1hLnByZXNlbnRhdGlvbi5VbWFFZGl0b3JQbHVnaW4iIG5vbk5MU01hcmtlcnM9InRydWUiCi0gICAgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRURhdGFPYmplY3QiIHJvb3RFeHRlbmRzQ2xhc3M9ImNvbS5pYm0udW1hZi5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSI+Ci0gIDxmb3JlaWduTW9kZWw+QzpcSG9tZVxwaFROR1xUTkdfZG9jc1xPT0FEXENvbnRlbnRBcmNoaXRlY3R1cmVcTW9kZWxzXFVNQTAyXFVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUubWRsPC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9ImNvbS5pYm0iIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NsYXNzaWZpZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UeXBlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29uc3RyYWludC9ib2R5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdHNBbmRQYXBlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3VpZGVsaW5lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvYXNzZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9yZXNwb25zaWJsZUZvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvcmVwb3J0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3RlbXBsYXRlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svcGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3N0ZXBzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3Bvc3Rjb25kaXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RlcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9PdXRjb21lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9nbG9iYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3JldXNlZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcGFyZW50UGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2V4dGVybmFsSWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL2V4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL3BhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9hc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2JhY2tncm91bmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2dvYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2ludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3Bvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvaXNWaXNpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9wcm9wZXJ0eSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay92aWV3cG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaW1lbnNpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi9oZWlnaHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkva2V5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vdmlld3BvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQvdHlwZUluZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoaWNQcmltaXRpdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2x5bGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9seWxpbmUvY2xvc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1BvbHlsaW5lL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGxpcHNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JvdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9zdGFydEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9lbmRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2NlbnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yb2FkbWFwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yZXVzYWJsZUFzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBZGRpdGlvbmFsbHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9hc3Npc3RzSW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcGVyZm9ybXNBc093bmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvcHJlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL1Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvcGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9zZWxlY3RlZFN0ZXBzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9leHRlcm5hbElucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0VG8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci93b3JrZWRPbkJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL09wdGlvbmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vdXRwdXRGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbXBvc2l0ZVJvbGUvYWdncmVnYXRlZFJvbGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd3RvU3RhZmYiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3NjYWxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdENoYXJhY3RlcmlzdGljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Jpc2tMZXZlbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL2VzdGltYXRpbmdUZWNobmlxdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vdHlwZU9mQ29udHJhY3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vZXh0ZXJuYWxJZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRlbGluZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRXN0aW1hdGUvZXN0aW1hdGlvbk1ldHJpYyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uQ29uZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VzdGltYXRpbmdNZXRyaWMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVybURlZmluaXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL3N1YlByYWN0aWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2NvbnRlbnRSZWZlcmVuY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvYWN0aXZpdHlSZWZlcmVuY2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldC9yb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2wiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rvb2wvdG9vbE1lbnRvcnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvcm9sZVNldHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5L2NhdGVnb3JpemVkRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yaWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZWRPblByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2FkbWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZUlPIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvci9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3VzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9tZXRob2RQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi9iYXNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29udHJpYnV0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29udHJpYnV0aW9uL2Jhc2VQcm9jZXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFVuaXQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvYXV0aG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L3ZlcnNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RVbml0L2NvcHlyaWdodFN0YXRlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NGYW1pbHkvZGVsaXZlcnlQcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvbWV0aG9kUGx1Z2lucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3ByZWRlZmluZWRDb25maWd1cmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy9wcm9wZXJ0aWVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiM2Y5Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3Byb3BlcnRpZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1Ob24tTkxTIE1hcmtlcnM6CXRydWUKLUNvbnRhaW5tZW50IFByb3hpZXM6CXRydWUKLVN1cHByZXNzIEVNRiBNZXRhZGF0YToJZmFsc2UKLVJvb3QgRXh0ZW5kcyBDbGFzczoJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0Ci1Sb290IEV4dGVuZHMgSW50ZXJmYWNlOglvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdAotQ29kZSBGb3JtYXR0aW5nOgl0cnVlCi1EeW5hbWljIFRlbXBsYXRlczoJdHJ1ZQotVGVtcGxhdGUgRGlyZWN0b3J5Ogkvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjMvdW1hLmVjb3JlIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzU3NzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMjI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmVwZi51bWEiPgotICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iMDMiLz4KLSAgPC9lQW5ub3RhdGlvbnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRGF0ZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgb2YgdGhlIHR5cGUgRGF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVXJpIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5uZXQuVVJJIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEYXRhIHR5cGUgdXNlZCBmb3IgYXR0cmlidXRlcyBvZiBtZXRhLW1vZGVsIGNsYXNzZXMgdGhhdCBwb2ludCB0byByZXNvdXJjZXMgc3VjaCBhcyBmaWxlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVW5saW1pdGVkTmF0dXJhbCIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlN0cmluZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJGbG9hdCIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5GbG9hdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNsYXNzaWZpZXIiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9OYW1lc3BhY2UgIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZXNwYWNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVzcGFjZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgRXh0ZW5kcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpYmFibGVFbGVtZW50ICMvL1ZhcmlhYmlsaXR5RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db25jZXB0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoZWNrbGlzdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NoZWNrbGlzdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJndWlkZWxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HdWlkZWxpbmUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCAjLy9DbGFzc2lmaWVyIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gJnF1b3Q7cnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCZxdW90OyB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAmcXVvdDtqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50JnF1b3Q7IHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgJnF1b3Q7QXJjaGl0ZWN0dXJlIERvY3VtZW50JnF1b3Q7LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9kZWljb24iIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBvcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXBvcnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGVtcGxhdGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UZW1wbGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvdXRwdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0ZXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdGVwIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sTWVudG9ycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVG9vbE1lbnRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXb3JrIERlZmluaXRpb24gaXMgYW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4mI3hEOyYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVjb25kaXRpb24iIGVUeXBlPSIjLy9Db25zdHJhaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEQ7JiN4QTtBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3QiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4mI3hEOyYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgZVR5cGU9IiMvL0FydGlmYWN0IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lZEFydGlmYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXJ0aWZhY3QiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJhYmxlIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZGVsaXZlcmFibGUgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik91dGNvbWUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQYWNrYWdlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGFja2FnZSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnbG9iYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNlZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNoaWxkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IFBhY2thZ2UgaXMgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZk91dGxpbmUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIGVUeXBlPSIjLy9BY3Rpdml0eSIKLSAgICAgICAgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4RDsmI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd3RvU3RhZmYiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGRlbGl2ZXJ5IHBhdHRlcm5zIGFuZCBtb2RlbHMuIEl0IGlzIHVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VOb3RlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmaW5lZERlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXhhbXBsZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFeGFtcGxlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkZWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1ByYWN0aWNlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJldXNhYmxlQXNzZXQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nJiN4RDsmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VibWFjaGluZSIgZVR5cGU9IiMvL1N0YXRlTWFjaGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJWZXJ0ZXgiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGVUeXBlPSIjLy9SZWdpb24iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dGdvaW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY29taW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UcmFuc2l0aW9uIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vdGFyZ2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZ2lvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlZlcnRleCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVmVydGV4IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlRyYW5zaXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1RyYW5zaXRpb24vY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlN0YXRlIiBlVHlwZT0iIy8vU3RhdGUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TdGF0ZS9SZWdpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iU3RhdGVNYWNoaW5lIiBlVHlwZT0iIy8vU3RhdGVNYWNoaW5lIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU3RhdGVNYWNoaW5lL1JlZ2lvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdGF0ZU1hY2hpbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlJlZ2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVnaW9uIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRyYW5zaXRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrRGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya0RlZmluaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUmVnaW9uIiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vUmVnaW9uL1RyYW5zaXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic291cmNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vVmVydGV4IiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXJnZXQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJ0ZXgiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L2luY29taW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBzZXVkb1N0YXRlIiBlU3VwZXJUeXBlcz0iIy8vVmVydGV4Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJQc2V1ZG9TdGF0ZUtpbmQiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iaW5pdGlhbCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iam9pbiIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZvcmsiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJqdW5jdGlvbiIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImNob2ljZSIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImVudHJ5UG9pbnQiIHZhbHVlPSI1Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleGl0UG9pbnQiIHZhbHVlPSI2Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJ0ZXJtaW5hdGUiIHZhbHVlPSI3Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hEOyYjeEE7QSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YXNrcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2VXb3JrZmxvd3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4RDsmI3hBO0RvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlzY2lwbGluZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVTZXRHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUm9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlU2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZVNldCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDdXN0b20gQ2F0ZWdvcnkgaXMgYSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2F0ZWdvcml6ZWRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkNhdGVnb3JpZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlbGl2ZXJ5IFByb2Nlc3NlcyBpcyBhIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4mI3hEOyYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVkdWNhdGlvbk1hdGVyaWFscyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4mI3hEOyYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DYXBhYmlsaXR5UGF0dGVybiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEQ7JiN4QTtBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZTomI3hEOyYjeEE7LSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hEOyYjeEE7LSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLiYjeEQ7JiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZWRPblByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2VzcyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2FkbWFwIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLiYjeEQ7JiN4QTtBbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSAjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4mI3hEOyYjeEE7VU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICZxdW90O2JsYWNrIGJveCZxdW90Oy4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgJnF1b3Q7cmVhbGl6YXRpb24mcXVvdDsgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3MiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb2Nlc3MgUGFja2FnZSBpcyBhIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LiYjeEQ7JiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZVNwZWNpZmljYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLiYjeEQ7JiN4QTtWYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5RWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJuYSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY29udHJpYnV0ZXMiIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJleHRlbmRzIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0icmVwbGFjZXMiIHZhbHVlPSIzIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiIHZhbHVlPSI1Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2ZXJzaW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VDb25maWd1cmF0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuMy91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3MGU1Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC4zL3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYyIKLSAgICBlZGl0RGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0L3NyYyIgZWRpdG9yRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIGVkaXRQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcm92aWRlci5VbWFFZGl0UGx1Z2luIgotICAgIGVkaXRvclBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLnByZXNlbnRhdGlvbi5VbWFFZGl0b3JQbHVnaW4iIG5vbk5MU01hcmtlcnM9InRydWUiCi0gICAgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuSU1vZGVsT2JqZWN0IiByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLmltcGwuTXVsdGlSZXNvdXJjZUVPYmplY3QiCi0gICAgcm9vdEltcGxlbWVudHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uSW50ZXJuYWxFRGF0YU9iamVjdCIgc3VwcHJlc3NFTUZUeXBlcz0idHJ1ZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckludGVyZmFjZT0iY29tbW9uai5zZG8uU2VxdWVuY2UiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJuYWxJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5FU2VxdWVuY2UiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJDbGFzcz0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkJhc2ljRVNlcXVlbmNlIiBjb2RlRm9ybWF0dGluZz0idHJ1ZSIKLSAgICBjb250YWlubWVudFByb3hpZXM9InRydWUiPgotICA8Zm9yZWlnbk1vZGVsPkM6XEhvbWVccGhUTkdcVE5HX2RvY3NcT09BRFxDb250ZW50QXJjaGl0ZWN0dXJlXE1vZGVsc1xVTUEwM1xVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlLm1kbDwvZm9yZWlnbk1vZGVsPgotICA8c3RhdGljUGFja2FnZXM+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9TRE88L3N0YXRpY1BhY2thZ2VzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0NPTU1PTkpfU0RPPW9yZy5lY2xpcHNlLmVtZi5jb21tb25qLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfRUNPUkVfU0RPPW9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBlY29yZVBhY2thZ2U9InVtYS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9GaW5pc2giLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9zdGFydFRvRmluaXNoIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvaW5pdGlhbCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvam9pbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZm9yayIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvanVuY3Rpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2Nob2ljZSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZW50cnlQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvZXhpdFBvaW50Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC90ZXJtaW5hdGUiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyBlY29yZUVudW09InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9uYSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvY29udHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL3JlcGxhY2VzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxSZXBsYWNlbWVudCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRmxvYXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvc2hhcGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24va2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJSZWFkb25seSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9zdGVwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0ZXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVyQXJ0aWZhY3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQXJ0aWZhY3QvY29udGFpbmVkQXJ0aWZhY3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZS9kZWxpdmVyZWRXb3JrUHJvZHVjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL3BhcmVudFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9leHRlcm5hbERlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGVEZXNjcmlwdGlvbi9wYWNrYWdpbmdHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9za2lsbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vYXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc3lub255bXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vR3VpZGFuY2VEZXNjcmlwdGlvbi9hdHRhY2htZW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9wcm9ibGVtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9iYWNrZ3JvdW5kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9nb2FscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYXBwbGljYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9pbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC95Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9wb3NpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvY29udGFpbmVkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2lzVmlzaWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcHJvcGVydHkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3pvb20iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvdmlld3BvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3RvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2dyYXBoRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2Uvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW0iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpYWdyYW0vem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL3ZpZXdwb2ludCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vZGlhZ3JhbUxpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhOb2RlL3NpemUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9MZWFmRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UZXh0RWxlbWVudC90ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0ltYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS91cmkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9JbWFnZS9taW1lVHlwZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaGljUHJpbWl0aXZlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUG9seWxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvbHlsaW5lL2Nsb3NlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxsaXBzZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRWxsaXBzZS9jZW50ZXIiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2NvbmNlcHRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9ndWlkZWxpbmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcmV1c2FibGVBc3NldHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9pc1BsYW5uZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEFmdGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRCZWZvcmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdGllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NaWxlc3RvbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QaGFzZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1RlYW1Qcm9maWxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS90ZWFtUm9sZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdXBlclRlYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9Sb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9IlJlYWRvbmx5IiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya09yZGVyL3ByZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9zdGFydERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvVGFzayIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYXNzaXN0ZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2V4dGVybmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vdXRwdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3NlbGVjdGVkU3RlcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3VzYWdlTm90ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1JlZ2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL3N1Ym1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmVydGV4Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9pbmNvbWluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWdpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHJhbnNpdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9Xb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViZGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9wcm9jZXNzVmlld3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2RlZmF1bHRWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5lbXggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L1VuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODZlNGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5lbXgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLXh0b29sczJfdW5pdmVyc2FsX3R5cGVfbWFuYWdlci0tPgotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMubW1pLnVpLnNpZ25hdHVyZXMuZGlhZ3JhbSIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9IlJhdGlvbmFsIE1vZGVsaW5nIFBsYXRmb3JtIChjb20uaWJtLnh0b29scy5ybXApIiB1cmw9IiIgdmVyc2lvbj0iNy4wLjAiLz48L3NpZ25hdHVyZT4/PgotPD9jb20uaWJtLnh0b29scy5lbWYuY29yZS5zaWduYXR1cmUgPHNpZ25hdHVyZSBpZD0iY29tLmlibS54dG9vbHMudW1sLm1zbC5tb2RlbCIgdmVyc2lvbj0iNy4wLjAiPjxmZWF0dXJlIGRlc2NyaXB0aW9uPSIiIG5hbWU9ImNvbS5pYm0ueHRvb2xzLnJ1bWwuZmVhdHVyZSIgdXJsPSIiIHZlcnNpb249IjcuMC4wIi8+PC9zaWduYXR1cmU+Pz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6RGVmYXVsdD0iaHR0cDovLy9zY2hlbWFzL0RlZmF1bHQvMSIgeG1sbnM6RWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi9zY2hlbWFzL0Vjb3JlLzMiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiB4bWxuczpub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9nbWYvcnVudGltZS8xLjAuMC9ub3RhdGlvbiIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIiB4bWxuczp1bWxub3RhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tL3h0b29scy8xLjUuMi9VbWxub3RhdGlvbiIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vL3NjaGVtYXMvRGVmYXVsdC8xIHBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfSU44azhNbUJFZHFCY04xUjZFdldVdz9EZWZhdWx0L0RlZmF1bHQ/IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi9zY2hlbWFzL0Vjb3JlLzMgcGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyI+Ci0gIDx1bWw6TW9kZWwgeG1pOmlkPSIzQURDN0I3NDAyMkQiIG5hbWU9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmUiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfQlROcUFPeGhFZHVIamUzcFBhaE40QSIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIi8+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9QNG9zWU9vZUVkdVZBN3Z0NXFiSUpRIiBhbm5vdGF0ZWRFbGVtZW50PSIzQURDN0I3NDAyMkQiPgotICAgICAgPGJvZHk+T3BlbiBJc3N1ZSBhbmQgVG9Eb3M6JiN4RDsKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0mI3hEOwotLSBJc3N1ZTogVU1MIDIuMCBuYW1pbmcgY29udmVudGlvbnMgZG9lcyBub3QgYWxsb3cgcGx1cmFsIHJvbGUgbmFtZXMmI3hEOwotLSBzeW5jIHVwIG5hbWVzIHRvIFVJIG5hbWVzOyBlLmcuIFBhY2thZ2luZyBJbnN0cnVjdGlvbnMmI3hEOwotLSBtYWtlIEFjdGl2aXR5IHRvIEJyZWFrZG93biBFbGVtZW50IGFnZ3JlZ2F0aW9uIGEgY29tcG9zaXRpb24mI3hEOwotLSBBZGQgSW5kZXgsIExpdGVyYXR1cmUgUmVmZXJlbmNlcyB0byBtZXRhLW1vZGVsJiN4RDsKLSYjeEQ7Ci1WZXJzaW9uIDIuMCBjaGFuZ2VzOiYjeEQ7Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7Ci0tIG5vdCBzdGFydGVkLCB5ZXQmI3hEOwotJiN4RDsKLVZlcnNpb24gMS4wLjQgY2hhbmdlczomI3hEOwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSYjeEQ7Ci0tIE1vdmVkIGV4dGVybmFsSWQgdXAgZnJvbSBXb3JrIFByb2R1Y3QgYW5kIFByb2Nlc3MgZGVzY3JpcHRpb24gJiN4RDsKLSAgdG8gdGhlIGdlbmVyYWwgY29udGVudCBkZXNjcmlwdGlvbiYjeEQ7Ci0tIEFkZGVkIGFzc29jaWF0aW9uIGJldHdlZW4gY29udGVudCBlbGVtZW50IGFuZCB0ZXJtIGRlZmluaXRpb24gdG8gYWxsb3cgYXNzaWduaW5nJiN4RDsKLSAgZ2xvc3NheSB0ZXJtcyBhcyBndWlkYW5jZSYjeEQ7Ci0tIEFkZGVkIHR3byBuZXcgYXR0cmlidXRlcyBmb3IgQXJ0aWZhY3QgRGVzY3JpcHRpb246ICYjeEQ7Ci0gIHJlcHJlc2VudGF0aW9uIGFuZCBub3RhdGlvbiYjeEQ7Ci0tIEFkZGVkIGFkZGl0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENvbmZpZ3VyYXRpb24gYW5kIENhdGVnb3JpZXMgdG8gJiN4RDsKLSAgbW9kZWwgY29uZmlndXJhdGlvbiBzcGVjaWZpY2F0aW9ucyB3aXRoIGNhdGVnb3JpZXMgYW5kIG5lZ2F0aXZlIHNldHMmI3hEOwotLSBNYWRlIERvbWFpbiB0byBXb3JrIFByb2R1Y3QgYXNzb2NpYXRpb24gbWFueS10by1tYW55JiN4RDsKLS0gTWFkZSBNZXRob2QgUGFja2FnZSBuZXN0aW5nIGFzc29jaWF0aW9uIHVuaWRpcmVjdGlvbmFsJiN4RDsKLS0gQWRkZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5IGZvciBkZWZpbmluZyBhcHBsaWNhdGlvbiBzcGVjaWZpYyBhdHRyaWJ1dGVzICYjeEQ7Ci0gIHN1Y2ggYXMgcHVibGljYXRpb24gZmxhZ3MgYW5kIGZsYWdnaW5nIHVzZXIgcGx1Zy1pbnMmI3hEOwotLSBDaGFuZ2VkIDEuLiogbXVsdGlwbGljaXRpZXMgZm9yIHN0YW5kYXJkIGNhdGVnb3JpZXMgdG8gKiYjeEQ7Ci0mI3hEOwotVmVyc2lvbiAxLjAuMyBjaGFuZ2VzOiYjeEQ7Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJiN4RDsKLTA3LzI2LzA2JiN4RDsKLS0gQ29ycmVjdGVkIGRlZmF1bHQgdmFsdWUgb2YgTWV0aG9kUGx1Z2luOjpVc2VyQ2hhbmdlYWJsZSB0byB0cnVlJiN4RDsKLTA3LzA2LzA2JiN4RDsKLS0gUmVtb3ZlZCBFc3RpbWF0ZSAgIGFuZCBFc3RpbWF0aW9uIE1ldHJpYyBHdWlkYW5jZSBlbGVtZW50czsgJiN4RDsKLSAgb25seSBrZXB0IEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbiYjeEQ7Ci0wNi8yMC8wNiYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZyb20gZGlzY2lwbGluZSB0byBhY3Rpdml0eSB0byBtYW55IHRvIG1hbnkmI3hEOwotMDYvMTUvMDYmI3hEOwotLSBDaGFuZ2VkIG11bHRpcGxpY2l0eSBvZiByb2xlIGRlc2NyaXB0b3IgdG8gd29yayBwcm9kdWN0cyBkZXNjcmlwdG9yIHRvICYjeEQ7Ci0gIG1hbnkgdG8gbWFueSYjeEQ7Ci0wNi8xMy8wNiYjeEQ7Ci0tIEFkZGVkIGRpcmVjdGlvbnMgdG8gZGVzY3JpcHRvciBhc3NvY2lhdGlvbnMgdG8gYXZvaWQgdGhhdCBkZXNjcmlwdG9ycyYjeEQ7Ci0gIGFkZGVkIHRvIGFuIGFjdGl2aXR5IHZpYSBsb2NhbCBjb250cmlidXRpb24gbW9kaWZ5IGluaGVyaXRlZCBkZXNjcmlwdG9ycyYjeEQ7Ci0wNS8wMS8yMDA2JiN4RDsKLS0gTW92ZWQgVU1MMiBEaWFncmFtIEludGVyY2hhbmdlIHRvIHRvcC1sZXZlbCBwYWNrYWdlJiN4RDsKLS0gQ2hhbmdlZCBtdWx0aXBsaWNpdHkgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHRvIGFjdGl2aXRpZXMgdG8gMSYjeEQ7Ci0tIE1hZGUgTWV0aG9kIENvbmZpZ3VyYXRpb24gYSBNZXRob2QgVW5pdCYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZvciBUYXNrIHRvIERpc2NpcGxpbmU6IGEgVGFzayBjYW4gbm93IGJlIGNhdGVnb3JpemVkJiN4RDsKLSAgYnkgbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIHRvIGFsbG93IG1vZGVsaW5nIHJlcGxhY2luZyBkaXNjaXBsaW5lcyYjeEQ7Ci0tIENoYW5nZWQgbXVsdGlwbGljaXR5IGZvciBSb2xlIHRvIFdQOiBhIFdQIGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgJiN4RDsKLSAgcmVzcG9uc2libGUgUm9sZSB0byBhbGxvdyBtb2RlbGluZyByZXBsYWNpbmcgcm9sZXMmI3hEOwotLSBOZXN0aW5nIG9mIGRpc2NpcGxpbmVzJiN4RDsKLS0gUmVtb3ZlZCAmcXVvdDt3b3JrZWRPbkJ5JnF1b3Q7IGRlcnJpdmVkIHByb3BlcnR5IGZvciBSb2xlRGVzY3JpcHRvciB0byBXUDsmI3hEOwotICBtb2RpZmllcyBwcm9wZXJ0eSBpcyBzdWZmaWNpZW50JiN4RDsKLS0gYWRkZWQgdHdvIG1vcmUgdmFyaWFiaWxpdHkgdHlwZXMgdXNlZCBieSBhY3Rpdml0aWVzOiBsb2NhbENvbnRyaWJ1dGlvbiYjeEQ7Ci0gIGFuZCBsb2NhbFJlcGxhY2VtZW50OyB0aGlzIGNoYW5nZSBpcyBvbmx5IHRlbXBvcmFyaWx5IHRvIG1pbmltaXplIG1pZ3JhdGlvbnMmI3hEOwotICBpc3N1ZXM6IGluIHRoZSBmdXR1cmUgdGhlc2UgbmVlZCB0byBiZSBtb2RlbGVkIGFzIGluIFNQRU0yIGFzIGEgc2VwZXJhdGUgJiN4RDsKLSAgQWN0aXZpdHlVc2UgY2xhc3MgYW5kIEFjdGl2aXR5VXNlVHlwZSBlbnVtZXJhdGlvbiYjeEQ7Ci0tIENyZWF0ZWQgQWN0aXZpdHkgc3BlY2lhbGl6YXRpb24gdGhhdCBhZGRzIGlzRW5hY3RhYmxlPWZhbHNlIGF0dHJpYnV0ZSBpbiYjeEQ7Ci0gIHRoZSBwYWNrYWdlIFByb2Nlc3MgLS0+IFdvcmtmbG93IHBhY2thZ2UmI3hEOwotLSBBZGRlZCBkaXJlY3QgYXNzb2NpYXRpb25zIGZyb20gV1AgYW5kIFRhc2sgdG8gRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJiN4RDsKLSAgdW50aWwgRXN0aW1hdGUgaXMgdXNlZDsgYWxsb3dzIGxpbmtpbmcgb2YgY29uc2lkZXJhdG9ucyB0byB0aGVzZSBlbGVtZW50cyYjeEQ7Ci0tIFJlbW92ZWQgUHJvY2VzcyBDb250cmlidXRpb24gYXMgaXQgaXMgcmVkdW5kYW50IHdpdGggY3JlYXRpbmcgZXh0ZW5kcyAmI3hEOwotICBiZXR3ZWVuIFByb2Nlc3NlcyBkaXJlY3RseTwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9HaTNkeGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgIDxpbXBvcnRlZFBhY2thZ2UgeG1pOnR5cGU9InVtbDpNb2RlbCIgaHJlZj0icGF0aG1hcDovL1VNTF9MSUJSQVJJRVMvVU1MUHJpbWl0aXZlVHlwZXMubGlicmFyeS51bWwjXzAiLz4KLSAgICA8L3BhY2thZ2VJbXBvcnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFGNjZCMDE1NSIgbmFtZT0iVU1MMkRpYWdyYW1JbnRlcmNoYW5nZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d6MmdIdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxNTFGNzFFMDNFNyI+Ci0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUY3MUUwM0U3IiB0eXBlPSJDbGFzcyIgbmFtZT0iRGlhZ3JhbXMiPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBBMzcwMTFCIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhFZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc5NiIgeT0iOTgzOCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRjc0RDAwOTEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWEpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWEwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhJZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzY2NSIgeT0iMTI4NjkiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MEUwMEIwIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhOT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI2MjMxIiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhNZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjMzNSIgeT0iMzEzMiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDk4MjAzQkEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5WWFJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NTYiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5WWFFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOVlhRdWZYRWR1cUhvT0piVVJaUnciIHg9IjY3NDciIHk9IjQ2NDgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBBMTIwMjQ1Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhWT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjAxIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5WWFgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY2NiIgeT0iMTAyODciLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOVlhoLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzY4IiBoZWlnaHQ9IjExNjgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJRS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJRi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSUdlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOVlhoT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITlZYaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjE0MSIgeT0iMjk3MSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlGRDAxN0MiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5mSVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MTIiIGhlaWdodD0iMTA2NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkliZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5mSVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklZdWZYRWR1cUhvT0piVVJaUnciIHg9IjQzODUiIHk9IjEwMjM2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITmZJbC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc2MCIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkltT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSW5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSW51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJbi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSW9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklvdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITmZJbE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSWxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMxNDgiIHk9IjY5NDIiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBBMjYwMkY4Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOb1NNLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODc4IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TT3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NPLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1B1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOb1NNT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TTWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjIzMyIgeT0iNjY4MCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5vU1p1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM4NDMiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NhLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NiLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TY2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5vU1ktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMTMzIiB5PSIxNTQyNiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE5vU21lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwODEiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU20tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU24tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TcE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5vU2x1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NsLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzYzIiB5PSIxMjQyMCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURNLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ2NDAzNDEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeUROdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE55RE4tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjUyMTUiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlET09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEUXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE55RE5PZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeUROZWZYRWR1cUhvT0piVVJaUnciIHg9IjM1MzkiIHk9IjE3ODY0Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITnlEVU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg0NCIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEVy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE55RFRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzYyNyIgeT0iMjA4MDIiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFENzEwMDBCIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeURZT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTIxIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RGEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeURYZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEWHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc4OSIgeT0iMTgxMTAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0MkEwMUZBIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeURuT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzg3IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55RHAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeURtZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjQ0MSIgeT0iMTA3MDEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0MzYwMjNEIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOeURyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzM2IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON004T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdNOGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON004dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TTgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOeURxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEcXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjUwNyIgeT0iMTM5NDgiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNOU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0M0YwMDE5Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON00tT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON00tdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdNX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdNX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON01fdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdNXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05BT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05BdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON005ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdNOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTM4MyIgeT0iMTM4NDMiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0NDYwMDM3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05DT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTk3IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05DdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdORGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05EdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdORC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05FT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdORWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05FdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05CZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyODg3OSIgeT0iMTM4NTEiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1MDkwMDM4Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05HT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDU0IiBoZWlnaHQ9IjMzMDIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdORy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05IdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05JT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITjdOSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05JdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hON05GZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdORnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzMTM5NCIgeT0iMTc0NDkiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05LT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05LdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tk1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05NLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdOSmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43Tkp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MjAiIHk9IjIwMTE4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNTAxMDE4MSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdOT09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDA4MCIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TlBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TlAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43TlFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05RLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdOTmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43Tk51ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjcwNjciIHk9IjE3NDU4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITjdObU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTA5NiIgaGVpZ2h0PSIxOTgxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43Tm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdObnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05vLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdObGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05sdWZYRWR1cUhvT0piVVJaUnciIHg9IjExODUzIiB5PSI2NjAiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOcmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hON05zZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMTUwIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTk4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FOTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FOTllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5OXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FOTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0U5LU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRTktZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITjdOcnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TnItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE4MjciIHk9IjIwODcwIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOS11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxRDgyMDI5QSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FOV9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IT0U5X3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRTlfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1DZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IT0U5LS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FOV9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA2NDIiIHk9IjE4MjExIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d6MmdJT2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIGFsbW9zdCBleGFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVU1MIDIuMCBEaWFncmFtIEludGVyY2hhbmdlIE1ldGEtTW9kZWwuICBTb21lIGV4dGVuc2lvbnMgaGFkIGJlZW4gYWRkZWQsIGUuZy4gZGVycml2aW5nIGFsbCBub24tdmFsdWUgY2xhc3NlcyBmcm9tIE1ldGhvZEVsZW1lbnQuIEFub3RoZXIgbWlub3IgZGlmZmVyZW5jZSB0byB0aGUgc3RhbmRhcmQgaXMgdGhhdCBSb3NlL0VNRiBkbyBub3Qgc3VwcG9ydCBhdHRyaWJ1dGUgYXJyYXlzLCB3aGljaCBoYXMgYmVlbiBtb2RlbGVkIGhlcmUgd2l0aCBhc3NvY2lhdGlvbnMuICBGb3IgZG9jdW1lbnRhdGlvbiBvZiB0aGUgaW5kaXZpZHVhbCBjbGFzc2VzIHNlZSB0aGUgc3RhbmRhcmQgZG9jdW1lbnQgYXQgd3d3LnVtbC5vcmcuIi8+Ci0gICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITlZYWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODUwMzk2IiBzb3VyY2U9Il9ITlZYVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYSU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWFp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5WWFpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjciIHk9Ii0yMjkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOVlhhLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUwIiB5PSItNDQ5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzc4IiB5PSIxMzM3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITlZYZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5WWGVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg2MDI2RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITlZYZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOVlhmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5WWGdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOVlhndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITlZYZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOVlhZZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITlZYWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTEwLCA1MjQsIC04LCAtMTk2NF0kWy0xMTAsIDIwNDgsIC04LCAtNDQwXSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZklHdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiIHNvdXJjZT0iX0hOVlhNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJSHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzQ5IiB5PSIxODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSUplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc4IiB5PSItMjgwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSUtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDUwIiB5PSIxODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklLLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzMiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJTXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSU9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSVBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZklPdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5mSUctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZklIT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMTE1LCAyNjIsIDgwMDksIDQxNF0kWy04OTQwLCAyNjIsIDIxODQsIDQxNF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITmZJUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkMwMjQxIiBzb3VyY2U9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5mSVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgyIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3MCIgeT0iMjIxIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzc3IiB5PSItMjAzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJEMDE1RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJV2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZklQdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITmZJUC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE4NCwgNDMxLCA0MTE0LCAtMTQ0N10kWy0zMTE1LCA0MzEsIDMxODMsIC0xNDQ3XSRbLTMxMTUsIDIwMzIsIDMxODMsIDE1Ml0kWy01MDIwLCAyMDMyLCAxMjc4LCAxNTJdIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5mSWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYyMDM2MCIgc291cmNlPSJfSE5mSVlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWFVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOZklkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkllT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00MjMiIHk9Ii0yMTkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwIiB5PSIzMzEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MSIgeT0iLTIzNiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTYyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ5OSIgeT0iMjk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITmZJaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSWlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJak9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMzAxNjIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSWtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZklrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZkljZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITmZJY3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDU2LCAzMywgLTY0NjgsIC0xNl0kWzY4MjQsIDMzLCAtMTEwMCwgLTE2XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZklvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1ODAxMUYiIHNvdXJjZT0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwNDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJcS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTIiIHk9IjM5MCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJcnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDMiIHk9Ii05NTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZklzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MCIgeT0iLTM4OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDNBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5mSXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMwMyIgeT0iLTExNjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkl1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOZkl2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITmZJdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkl2LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5mSXd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDAzQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5mSXhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOZkl3LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5mSXBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZklwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00NzQsIC01ODQsIC0yNzAsIDMzNzhdJFstNDc0LCAtMzM3OCwgLTI3MCwgNTg0XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOZkl4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUyOTAxNTAiIHNvdXJjZT0iX0hOVlhVT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOZkl5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITmZJeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITmZJeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOZkl4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOZkl5T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExMCwgLTU0MSwgLTY1MSwgMjc2MF0kWzYwOSwgLTI3MjYsIC0xNTIsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFMkIwMjFCIiBzb3VyY2U9Il9ITlZYRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9TQk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITm9TQmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTQ4LCAtNTg0LCAzODI2LCAyMzExXSRbLTM4MTAsIC0yMzE5LCA5NjUsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITm9TQy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TRE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0MwMEQ3IiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITmZJWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU0VPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3OSIgeT0iLTI3MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TRi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDkiIHk9Ii0zMzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTQiIHk9Ii00NTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NIZWZYRWR1cUhvT0piVVJaUnciIHg9Ijg4OCIgeT0iMTE5NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU0l1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU0p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxN0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0tPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TTHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU0xPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITm9TRGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU0R1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzODAsIDMxMywgNzMwNiwgLTI5MzddJFstODIyOSwgMzEzLCA0NTcsIC0yOTM3XSRbLTgyMjksIDI3MTcsIDQ1NywgLTUzM10iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITm9TUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDUwMzlGIiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TTC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5vU1EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU1ItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMyMiIgeT0iMjIwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NTdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk5OSIgeT0iLTI1NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NUZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NSIgeT0iMzEzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTciIHk9Ii0zMzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5RSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TVi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NXLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ2MDI5QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5vU1llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1NYLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU1FPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NRZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzODAsIC0xMTAsIC03NzYzLCAtNTldJFs3NzA0LCAtMTEwLCAtMTQzOSwgLTU5XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOb1NjdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5NzAzMDIiIHNvdXJjZT0iX0hOZklrLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITm9TZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzEwMyIgeT0iLTI2MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TZmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE4MCIgeT0iMjM4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzUxOCIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TZy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDYyIiB5PSItMzU1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9TaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITm9Tak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU2l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk5MDAwMyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Tai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TanVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOb1NsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9Ta3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOb1NjLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NkT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzgwLCAtNDA2LCA5MywgLTg4OTBdJFstMTA4NTQsIC00MDYsIC05MzgxLCAtODg5MF0kWy0xMDg1NCwgODA4NSwgLTkzODEsIC0zOTddJFstMzM5NSwgODA4NSwgLTE5MjEsIC0zOTddIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU3BlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTNBMDNDQiIgc291cmNlPSJfSE5vU2xlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5WWEVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU3B1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5vU3AtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTc5NSwgMCwgMTk5OF0kWzAsIC0yMjE4LCAwLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU3JPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5vU3JlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5vU3J1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNURCMDMwMSIgc291cmNlPSJfSE5vU2xlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU0wtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1NzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOb1NzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1N0dWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MzMiIHk9IjMzOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITm9TdWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkxIiB5PSItMjk3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOb1N1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9TdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE5vU3ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzY1IiB5PSI0NTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5vU3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITm9Td09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOb1N2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2NSIgeT0iLTEzMTMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURDZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE55REQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeUREZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5vU3ItZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOb1NzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1NDAsIDAsIC0yODI3LCA1NzQwXSRbNDI4NCwgMCwgLTg0LCA1NzQwXSRbNDI4NCwgLTQ5NTMsIC04NCwgNzg3XSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOeURFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxNzAxNEQiIHNvdXJjZT0iX0hOb1NsZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlERnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlERk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlER09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI5IiB5PSItNDQ4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMTAxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTIiIHk9IjkxNiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURIdWZYRWR1cUhvT0piVVJaUnciIHg9IjU2OSIgeT0iLTI4OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFDMTgwMEZGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU0OSIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlESnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55REtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlES3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55REtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlESy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlETGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlETE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RE1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlETU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOeURFZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITnlERXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQsIDc4NywgNjE2MywgLTIwMDZdJFstODQsIDI0MjksIDYxNjMsIC0zNjRdJFstNDMyNiwgMjQyOSwgMTkyMSwgLTM2NF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITnlEUS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzFEQTAwMUI3IiBzb3VyY2U9Il9ITnlETS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RFNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE55RFItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITnlEUk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITnlEUmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjI1LCAtNTg0LCAtNTI4MywgMTg1NF0kWzUyNTcsIC0xODYyLCAtMTY1MSwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOeURTdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOeURTLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOeURiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBMzAxODkiIHNvdXJjZT0iX0hOeURYT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOb1NZdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITnlEY09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOeURiZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOeURidWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjEwLCAtNTQxLCA0NzgzLCAyMDk5XSRbLTQ2OTAsIC0yMDY1LCAxMzAzLCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE55RGMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE55RGRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE55RGRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDEyMyIgc291cmNlPSJfSE55RFhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE55RFRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOeURlZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURmZWZYRWR1cUhvT0piVVJaUnciIHg9IjYxIiB5PSIzMTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURnT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEZy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk4IiB5PSIyODgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDMyQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hOeURodWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yOTgiIHk9Ii0xMTAwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITnlEai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE55RGplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDM0MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITnlEa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEa2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOeURsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzMkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE55RGx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOeURsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITnlEbGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOeURkdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOeURkLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUzMywgMCwgLTIxNTldJFswLCAyMTUwLCAwLCAtNTQxXSIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05ST2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiIHNvdXJjZT0iX0hON05OT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05KT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05SLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05TLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOVE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NSIgeT0iLTI2MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNzQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE43TlQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAzNkEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05VdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzUiIHk9Ii00MTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05WZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNzAiIHk9IjExNTIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05XdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05XLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hON05YdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ITjdOWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05YLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05ZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tll1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05ZT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE43Tlp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hON05aT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TlJlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TlJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgNTc1LCAwLCAtMjM3MF0kWzAsIDI0NDYsIDAsIC00OTldIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE43TlotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzNTFCMDNFMSIgc291cmNlPSJfSE43TkZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE43TkJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05iZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hON05hLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE43TmFPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE43TmFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk4MiwgLTE2NTksIDE3NjEsIDMwMTRdJFstMjQxMywgLTQwOTcsIDMzMCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05idWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05iLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05jT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUxODAzMjgiIHNvdXJjZT0iX0hON05OT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05CT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05jZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05jdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NiwgLTU4NCwgLTEwODMsIDMwMjJdJFsxMDQ5LCAtMzAzMSwgLTIyMCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05kLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05lT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05lZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzY5RjAwOEMiIHNvdXJjZT0iX0hOeURxT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOeURtT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05mT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOZmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05ldWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05lLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYyNiwgLTU4NCwgLTI4NzgsIDI1NjVdJFsyODQ0LCAtMjU3MywgLTY2MCwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05nT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hON05nZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hON05ndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMzZBMTAyRDMiIHNvdXJjZT0iX0hON005T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOeURtT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hON05oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITjdOaHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hON05nLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hON05oT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEyNywgLTc5NSwgLTQzMSwgMjU1Nl0kWzQ0OCwgLTI3NzcsIC0xMTAsIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOaWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOaXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOaS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM2QTQwMjkyIiBzb3VyY2U9Il9ITjdOQk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TmtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TmotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOak9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOamVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTA4LCAtNTg0LCAyMjM1LCAyNTY1XSRbLTIyNDMsIC0yNTczLCA0OTksIDU3NV0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOa3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITjdOay1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITjdOcE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMjEyN0EwMThEIiBzb3VyY2U9Il9ITmZJWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITjdOcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE43TnF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE43TnFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITjdOcGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITjdOcHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDU2LCAtMzcyLCAtNzIzMCwgMjg3OF0kWzU3MDYsIC0xNDA1LCAtMjk4MCwgMTg0NV0kWzc3MzAsIC0yNjc1LCAtOTU2LCA1NzVdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TnEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE43TnJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE9FLUN1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMxREE1MDI2OCIgc291cmNlPSJfSE9FOS11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5vU1l1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1FT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hPRS1EdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE9FLUMtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hPRS1ET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2OSwgLTU0MSwgMTYsIDIyMDFdJFsxNjksIC0yMTY3LCAxNiwgNTc1XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1FZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1FdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1FLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNDAzMjciIHNvdXJjZT0iX0hPRTktdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05yZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1GdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDMiIHk9Ii0zODEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1IdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1JdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IT0UtSWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjYiIHk9Ii0zNTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1KT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNTQiIHk9Ijk4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1KLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1MT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hPRS1LLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNTAxQTMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtTWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLUwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzJGQzUwMTk4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1OT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSE9FLU0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtRk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtRmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MzMsIDAsIC0yMTA4XSRbMCwgMjExNiwgMCwgLTUyNF0iLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtTnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFNDk0REQwMkM5IiBzb3VyY2U9Il9ITm9TWXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLU8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLU91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtTi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLU9PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE5MjEsIDE5NCwgLTMxOTEsIDEyNjQwXSRbLTEwMDQxLCAxOTQsIC0xMTMxMSwgMTI2NDBdJFstMTAwNDEsIC0xMjg4NiwgLTExMzExLCAtNDQwXSRbLTkxNCwgLTEyODg2LCAtMjE4NCwgLTQ0MF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtUGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtUHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtUC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMjEyNDgwMDFGIiBzb3VyY2U9Il9ITlZYUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtUU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTc1LCAtNzg3LCAtNTcyMywgMTA5Ml0kWzU3NSwgLTIwMzIsIC01NzIzLCAtMTUyXSRbNDExNCwgLTIwMzIsIC0yMTg0LCAtMTUyXSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1SdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hPRS1SLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hPRS1TT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUyMTIzNzAxOEUiIHNvdXJjZT0iX0hOVlhnLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hON05sT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1TLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hPRS1TZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IT0UtU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTAxLCAtNTg0LCAtMTUyLCAxOTU1XSRbLTEwMSwgLTE1NDksIC0xNTIsIDk5MF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtVC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtVU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtVWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzA5MzUwMDQ4IiBzb3VyY2U9Il9ITlZYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtVXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxMTUsIC00NjUsIDgwMDksIC0zMTNdJFstODk0MCwgLTQ2NSwgMjE4NCwgLTMxM10iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtV2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtV3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzY4REIwM0U0IiBzb3VyY2U9Il9ITmZJay1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVh1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtVy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzIxLCAtNTc1LCA1MjQsIDMzODZdJFszMjEsIC0zMzc4LCA1MjQsIDU4NF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMjJGRTYwMTExIiBzb3VyY2U9Il9ITm9TTC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLVotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtWk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLVplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkzLCAtNzg3LCA5MjU0LCAzMTI0XSRbLTkzLCAtMTQxMywgOTI1NCwgMjQ5N10kWy04MzU2LCAtMTQxMywgOTkwLCAyNDk3XSRbLTgzNTYsIC0zMzI3LCA5OTAsIDU4NF0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtYXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtYS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IT0UtYk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzM0OUMwMTcxIiBzb3VyY2U9Il9ITnlEbU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITlZYZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLWNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IT0UtYmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE9FLWJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM5NywgLTQ3NiwgMTM1OTksIDcyMjNdJFstMzk3LCAtNTcxNSwgMTM1OTksIDE5ODRdJFstMTM1MjAsIC01NzE1LCA0NzYsIDE5ODRdJFstMTM1MjAsIC03MTk3LCA0NzYsIDUwMl0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtYy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IT0UtZE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTIxNkU0MDFFMyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlR5cGVzIj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IT0UtZWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTk2NCIgaGVpZ2h0PSIxOTY0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1ldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1nZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IT0UtZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1nLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hPRS1kdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IT0UtZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDUiIHk9IjY0MyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1oZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUyMEIxQzAyRTEiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1pT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE9FLWllZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NjAiIGhlaWdodD0iMTk2NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0UtaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1qT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hPRS1qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPRS1qdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE9FLWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9FLWtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT0Uta2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE9PdThPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IT091OGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hPT3U4dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IT0UtaHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE9FLWgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI5MyIgeT0iNTkyIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d6MmdJdWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGVzZSB0d3AgZGF0YSB0eXBlIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBkaWFtZ3JhbSBpbnRlcmNoYW5nZS4gIFRoZXkgbWlnaHQgYmUgcmVwbGFjZWQgd2l0aCB0eXBlcyBvZiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0gYXMgbG9uZyBhcyB0aGUgYWxsb3cgdGhlIHNhbWUgdHlwZSBvZiBzZXJpYWxpemF0aW9uIGZvciBwZXJzaXN0ZW5jeS4iLz4KLSAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgIDwvY29udGVudHM+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3g2bVlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFGNjZCMDE1NSI+Ci0gICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU1Nzc0MDAyM0QiIGltcG9ydGVkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3g2bVp1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIi8+Ci0gICAgICA8L3BhY2thZ2VJbXBvcnQ+Ci0gICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il95a3c4d094WkVkdU9Ock1SZ216NDhBIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNjIiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIiBuYW1lPSJQb2ludCI+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzNzVGMzAyNUUiIG5hbWU9IngiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTM3NUZDMDJEOSIgbmFtZT0ieSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgbmFtZT0iR3JhcGhFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTM2OERCMDNFNCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MjBCNkEwM0EzIiBuYW1lPSJwb3NpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EiIG5hbWU9ImNvbnRhaW5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwNzU4MDExRiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUMiIG5hbWU9ImxpbmsiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwQTI2MDJGOCIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU0NTAzOUYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZFLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTcwIiBuYW1lPSJhbmNob3JhZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwOUZEMDE3QyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU3QzAwRDciPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZHdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIiBuYW1lPSJzZW1hbnRpY01vZGVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzE2OTcwMzAyIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2TnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZOZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MjBCMUMwMkUxIiBuYW1lPSJEaW1lbnNpb24iPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1Mzc2MDUwMTU1IiBuYW1lPSJ3aWR0aCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1Mzc2MEUwMTZDIiBuYW1lPSJoZWlnaHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTIxMjM3MDE4RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA2OTgwMTg3IiBuYW1lPSJpc1Zpc2libGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HelowTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA3NTkwMDQ0IiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDc1ODAxMUYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxUZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIiBuYW1lPSJyZWZlcmVuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwOTBFMDBCMCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxWT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIiBuYW1lPSJwcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzA5ODIwM0JBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwOUJDMDI0MSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFdPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MEUwMEIwIiBuYW1lPSJSZWZlcmVuY2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5MzUwMDQ4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkxNjAwMjYiIG5hbWU9ImlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3RLVUZjT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzOTAyMTEiIG5hbWU9InJlZmVyZW5jZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6amxVZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pqbFVPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDk4MjAzQkEiIG5hbWU9IlByb3BlcnR5Ij4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTIxMjQ4MDAxRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QTkwMDgxIiBuYW1lPSJrZXkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfdnNsVlFleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il92c2xWUU95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3ZrUFJrT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUFEMDIzNSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRGZsVHdleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9EZmxUd095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0RXQzlRT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDlGRDAxN0MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTIxMjdBMDE4RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFN0UwMTdBIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU3QzAwRDciPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZIZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkhPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiIgbmFtZT0iZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEExMjAyNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBGRjIwMzYwIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2SWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEExMjAyNDUiIG5hbWU9IkdyYXBoRWRnZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUyOTAxNTAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUxRjdGQTAyOTUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2NCIgbmFtZT0iYW5jaG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMDlGRDAxN0MiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzBGRjIwMzYwIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HenN2Sk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6c3ZJLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIyIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkIiIG5hbWU9IndheXBvaW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNDg1MDM5NiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdktPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2Si1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwQTI2MDJGOCIgbmFtZT0iRGlhZ3JhbUxpbmsiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMjJGRTYwMTExIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUNEQjAxRjAiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxQ0U0MDJEOSIgbmFtZT0idmlld3BvcnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlFIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMEU0NTAzOUYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZGdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDA0NyIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBFMzQwMTU2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNURCMDMwMSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdk11ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2TWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwQTM3MDExQiIgbmFtZT0iR3JhcGhOb2RlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTJCMDIxQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTFGN0ZBMDI5NSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1QUIwMEE5IiBuYW1lPSJzaXplIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUyMEIxQzAyRTEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiIG5hbWU9IkRpYWdyYW0iPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFM0EwM0NCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzBBMzcwMTFCIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVDNTAwMTAiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2Q0VUl3ZXlPRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZDRVSXdPeU9FZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1Q0MwMjY5IiBuYW1lPSJ2aWV3cG9pbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE1REQwMDNEIiBuYW1lPSJkaWFncmFtTGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzBBMjYwMkY4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNURCMDMwMSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdkwtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYiIG5hbWU9Im5hbWVzcGFjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxQzE3MDE0RCI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdlBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2UE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUU0OTRERDAyQzkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUyMTdDMTAzQkUiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxRDNBMDBDQSIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1BfMHpJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfUF8weklPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9SUXZCWU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3RkEwMjk1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMxNjk3MDMwMiI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdk9lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2T09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAxMDEiIG5hbWU9ImRpYWdyYW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMUMxNzAxNEQiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdlAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxRDY0MDM0MSIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEQTAwMUI3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzE2NkEwMjAyIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMUQ5MzAzNTMiIG5hbWU9InR5cGVJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2JoYjFJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfYmhiMUlPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9iUmZVb095SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFENzEwMDBCIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxREEzMDE4OSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMxNjZBMDIwMiIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIiBuYW1lPSJlbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMTIzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HejJnRS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6MmdFdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFEODIwMjlBIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMURBNTAyNjgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMTY2QTAyMDIiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCIgbmFtZT0iZWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMyRkM0MDMyNyI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pzdlJPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HenN2US1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDJBMDFGQSIgbmFtZT0iTGVhZkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM0OUMwMTcxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MjE3QzEwM0JFIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM0MzYwMjNEIiBuYW1lPSJUZXh0RWxlbWVudCI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzY5RjAwOEMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMzQyQTAxRkEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNUNDMDM0NSIgbmFtZT0idGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9IbGx4d2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0hsbHh3T3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfSFdzYUlPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDNGMDAxOSIgbmFtZT0iSW1hZ2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2QTEwMkQzIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzM0MkEwMUZBIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzVEMzAxRTciIG5hbWU9InVyaSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95cVI3MGV5T0VkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lxUjcwT3lPRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeWdTNVlPeU9FZHVGS0pvdkJMNjRYUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2OEEwMTg2IiBuYW1lPSJtaW1lVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9abVVCc2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1ptVUJzT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWmVhcDhPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNDQ2MDAzNyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzZBNDAyOTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MTUzMzQyQTAxRkEiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUwMTAxODEiIG5hbWU9IlBvbHlsaW5lIj4KLSAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTE4MDMyOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxNTMzNDQ2MDAzNyIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM2RTkwM0RCIiBuYW1lPSJjbG9zZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HempsUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzZBIiBuYW1lPSJ3YXlwb2ludHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTFGNzREMDA5MSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6MmdHdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3oyZ0dlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjIiLz4KLSAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUwOTAwMzgiIG5hbWU9IkVsbGlwc2UiPgotICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1MUIwM0UxIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDE1MzM0NDYwMDM3Ii8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUyMzAwMjEiIG5hbWU9ImNlbnRlciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MUY3NEQwMDkxIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzUyOTAwODQiIG5hbWU9InJhZGl1c1giIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX0FVcThJT3gzRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNTMxMDM1NiIgbmFtZT0icmFkaXVzWSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1M0QwMzcyIiBuYW1lPSJyb3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfQVVxOElPeDNFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzM1NDcwMzRFIiBuYW1lPSJzdGFydEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU1NjAyRjUiIG5hbWU9ImVuZEFuZ2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA3NTgwMTFGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMDc1OTAwM0EgXzNBREM3Qjc0MDIyRDQxNTMwNzU5MDA0NCIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMDkzODAzNDYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwOTM5MDIxMSBfM0FEQzdCNzQwMjJENDE1MzA5MzkwMjEzIi8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwOUJDMDI0MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVDIF8zQURDN0I3NDAyMkQ0MTUzMDlCRDAxNUUiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzA5QkQwMTVFIiBuYW1lPSJfZGlhZ3JhbUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxNTIxN0MxMDNCRSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMwOUJDMDI0MSI+Ci0gICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3pqbFctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HempsV3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICA8L293bmVkRW5kPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMwRTQ1MDM5RiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzBFNDYwMjlDIF8zQURDN0I3NDAyMkQ0MTUzMEU0NjAyOUUiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzBFN0MwMEQ3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMEU3RTAxNzAgXzNBREM3Qjc0MDIyRDQxNTMwRTdFMDE3QSIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMEZGMjAzNjAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMwRkYzMDE2MiBfM0FEQzdCNzQwMjJENDE1MzBGRjMwMTY0Ii8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNDg1MDM5NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZCIF8zQURDN0I3NDAyMkQ0MTUzMTQ4NjAyNkQiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzE0ODYwMjZEIiBuYW1lPSJfZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEExMjAyNDUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMTQ4NTAzOTYiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZLLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdkt1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMTVEQjAzMDEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMxNUREMDAzRCBfM0FEQzdCNzQwMjJENDE1MzE1REQwMDQ3Ii8+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMxNjk3MDMwMiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzE2OTkwMDAxIF8zQURDN0I3NDAyMkQ0MTUzMTY5OTAwMDMiLz4KLSAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzFDMTcwMTREIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTUzMUMxODAwRkYgXzNBREM3Qjc0MDIyRDQxNTMxQzE4MDEwMSIvPgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMkZDNDAzMjciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDE5OCBfM0FEQzdCNzQwMjJENDE1MzJGQzUwMUEzIj4KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkM1MDFBMyIgbmFtZT0iX2NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMUQ4MjAyOUEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMkZDNDAzMjciPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6c3ZSLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3pzdlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICA8L293bmVkRW5kPgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMyRkUzMDEyMyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzJDIF8zQURDN0I3NDAyMkQ0MTUzMkZFMzAzNDAiPgotICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMzQwIiBuYW1lPSJfdU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDE1MzFENzEwMDBCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzJGRTMwMTIzIj4KLSAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HejJnRnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d6MmdGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM2QSBfM0FEQzdCNzQwMjJENDE1MzM1OEIwMzc0Ij4KLSAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzNThCMDM3NCIgbmFtZT0iX3BvbHlsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMzUwMTAxODEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTUzMzU4QjAxNjEiPgotICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d6MmdIZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3oyZ0hPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERTYyMDAxQ0YiIG5hbWU9IlVNTDJJbmZyYXN0cnVjdHVyZU1pbmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HeHcxYXVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MURGMkM0MzAxNTEiPgotICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREYyQzQzMDE1MSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOQ2N0LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1FZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkxtRk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkNjdE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzU1IiB5PSI4NjMiIHdpZHRoPSIyNTQwIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtRmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hOTG1HZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5MbUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOTG1HLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkxtSGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkxtSHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITkxtRnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5MbUYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzA5OCIgeT0iODYzIiB3aWR0aD0iMzIyNyIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d4dzFiT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgIDwvY29udGVudHM+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3d1VG9PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjIwMDFDRiI+Ci0gICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE2MkIwMzZGIiBuYW1lPSJQcmltaXRpdmVUeXBlcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3hkNmNPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIi8+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3c0RWt1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNjJCMDM2RiI+Ci0gICAgICAgICAgPGJvZHk+MDA8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1IiBuYW1lPSJEYXRlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3NEVsZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSIgbmFtZT0iVXJpIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d4Qk9nZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPgotICAgICAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgbmFtZT0iU3RyaW5nIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2k3RlRvT2lmRWR1UWJ1WTZVd01TUWciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgPGJvZHk+QSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluIHNvbWUgc3VpdGFibGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsLiBDaGFyYWN0ZXIgc2V0cyBtYXkgaW5jbHVkZSBub24tUm9tYW4gYWxwaGFiZXRzIGFuZCBjaGFyYWN0ZXJzLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQzRjA5ODlCOTAyOTAiIG5hbWU9IlNldCIvPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0YwOTg5OUMwMEVBIiBuYW1lPSJTZXF1ZW5jZSIvPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIiBuYW1lPSJJbnRlZ2VyIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX2RVYzZvT29GRWR1T0JQUUEyaEtxVVEiIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQzQ0EwMTBBNDAwN0IiPgotICAgICAgICAgICAgPGJvZHk+QW4gaW50ZWdlciBpcyBhIHByaW1pdGl2ZSB0eXBlIHJlcHJlc2VudGluZyBpbnRlZ2VyIHZhbHVlcy48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyIgbmFtZT0iQm9vbGVhbiI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il81R2NZQWVpZUVkdVFidVk2VXdNU1FnIiBhbm5vdGF0ZWRFbGVtZW50PSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICA8Ym9keT5BIEJvb2xlYW4gdHlwZSBpcyB1c2VkIGZvciBsb2dpY2FsIGV4cHJlc3Npb24sIGNvbnNpc3Rpbmcgb2YgdGhlIHByZWRlZmluZWQgdmFsdWVzIHRydWUgYW5kIGZhbHNlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIiBuYW1lPSJEb3VibGUiLz4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGODY5MDEyRSIgbmFtZT0iQ29uc3RydWN0cyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3h3MVotZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFEREU2MzYwMDA0Ij4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjM2MDAwNCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJjdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hNNHJkdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjkzIiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJnZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE00cmMtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE00cmRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkzNyIgeT0iOTk2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERUNCNTAwOTgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hNNHJodWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hNNHJpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cml1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE00cmotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hNNHJrZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE00cmctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE00cmhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY1IiB5PSI2ODI0IiB3aWR0aD0iMTUyNCIgaGVpZ2h0PSI3NjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE00cmt1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITTRybGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSE00cmx1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjS2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY0t1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITTRyay1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITTRybE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTUiIHk9IjkyMjAiIHdpZHRoPSIyMzY0IiBoZWlnaHQ9IjkwNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjT09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjUS1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NOZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NOdWZYRWR1cUhvT0piVVJaUnciIHg9IjkyMjAiIHk9IjUzMDAiIHdpZHRoPSIzMTMyIiBoZWlnaHQ9IjcxMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjU09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1QtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSE5DY1VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NVLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSE5DY1JlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY1J1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI0OSIgeT0iMjY2NyIgd2lkdGg9IjMyODYiIGhlaWdodD0iMTEyNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjYy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjZnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NjT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NjZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3MTUiIHk9IjUzNTAiIHdpZHRoPSI0MTQxIiBoZWlnaHQ9IjY1OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITkNjbGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NuZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hOQ2NudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NuLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITkNjb09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hOQ2NrdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NrLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk0OTEiIHk9Ijg2NjEiIHdpZHRoPSIyMjIwIiBoZWlnaHQ9IjgyNyIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3h3MWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NLLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjhCRDAyOEYiIHNvdXJjZT0iX0hNNHJrdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY0x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY01PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NMLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NMT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY0xlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU0MSwgMCwgMTg0NV0kWzAsIC0xODQ1LCAwLCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjTXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NNLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjVk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQUYwMjAyIiBzb3VyY2U9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITTRyY3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjVmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NWdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC03OTUsIC00MiwgMTQ5MF0kWzMzLCAtMTc0NCwgLTE2LCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjVy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NYT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjWGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY5MTIwM0MwIiBzb3VyY2U9Il9ITTRyZ3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjUk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY1ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjWHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NYLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2OCwgLTU1MCwgLTQyNTgsIDMzNjFdJFszOTIwLCAtMzEyNCwgLTEwMDcsIDc4N10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NaT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY1plZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkI0NTAzRDUiIHNvdXJjZT0iX0hOQ2NOT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NST2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NaLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY2FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0NiwgLTU1MCwgMjg2MSwgMTgzN10kWy0yNDcyLCAtMTYwMCwgMTIzNiwgNzg3XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2JlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjYnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY2YtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEQ0MDIxMSIgc291cmNlPSJfSE5DY2ItZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY1JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NoZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY2ctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY2dPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjZ2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTUwLCAwLCAxODg4XSRbMCwgLTE2NTEsIDAsIDc4N10iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NodWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY2gtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hOQ2NpT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjcxQjAzQTgiIHNvdXJjZT0iX0hNNHJndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hOQ2NiLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY2plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hOQ2NqT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hOQ2NpZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSE5DY2l1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzYyLCAtMjM3LCAtNDE2NSwgMTIzNl0kWzMwOTAsIC05MzEsIC0xODM3LCA1NDFdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjai1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NrT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ITkNjb2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0EwMEU5IiBzb3VyY2U9Il9ITkNja2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITkNjTk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSE5DY3AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITkNjcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITkNjb3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hOQ2NvLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NDEsIDAsIDI4MTBdJFswLCAtMjgxMCwgMCwgNTQxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY3FPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITkNjcWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSE5DY3F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQkNGMDJBOSIgc291cmNlPSJfSE5DY2tlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSE5DY2ItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITkNjci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hOQ2NzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSE5DY3J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSE5DY3EtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITkNjck9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjAxLCAtNTQxLCAzMTA3LCAyNzYwXSRbLTMwOTgsIC0yNzYwLCA2MDksIDU0MV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hOQ2NzZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSE5DY3N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjU4MDE1NyIgbmFtZT0iQ2xhc3NpZmllciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeGQ2ZHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ij4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY4QkQwMjhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFNjY4MDBDRSIgbmFtZT0iRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yYy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU2NjgwMENFIj4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1IiBuYW1lPSJOYW1lZEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERUNBRjAyMDIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY2ODAwQ0UiLz4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZDOEUwMEI2IiBuYW1lPSJuYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRWdzeWdleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0Vnc3lnT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9FWXBwd095SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1IiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERFQ0I1MDA5OCIgbmFtZT0iVHlwZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HeG5yZi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ij4KLSAgICAgICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREY3MUIwM0E4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ii8+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGOTEyMDNDMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiIG5hbWU9IlBhY2thZ2UiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3hucmhPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRERGQkNBMDBFOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCIvPgotICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURERkJDRjAyQTkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZBNDQwM0E4IiBuYW1lPSJOYW1lc3BhY2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3h3MVpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTQ0MDNBOCI+Ci0gICAgICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFEREZCNDUwM0Q1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREUwNjIwMkQ1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2RDA0MDBGMSIgbmFtZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3dVRtdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjU2NEZBMDA5NSI+Ci0gICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTY0RkEwMDk1IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpdC1mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGRpYWdyYW1zIGZvciBwcm9jZXNzIHZpc3VhbGl6YXRpb24gYmFzZWQgb24gdGhlIFVNTDIgZGlhZ3JhbSBpbnRlcmNoYW5nZSBzdGFuZGFyZC4gIENvbnRhaW5zIGRpYWdyYW1zIGZvciB3b3JrZmxvd3MsIHdvcmsgcHJvZHVjdCBkZXBlbmRlbmNpZXMsIGFuZCB0ZWFtIGJyZWFrZG93bnMuIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyNzA3IiB5PSI0NDYxIiB3aWR0aD0iNzUyNiIgaGVpZ2h0PSIyMDQ4Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l2T2ZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgaG93IGNvcmUgY29udGVudCBlbGVtZW50cyBjYW4gYmUgb3JnYW5pemVkIGZvciBpbnN0YW50aWF0aW9uIGluIHByb2Nlc3Nlcy4gIFByb2Nlc3NlcyBoYXZlIGxvY2FsIHNjaGVtZXMgZmFjaWxpdGF0aW5nIHJlZGVmaW5pdGlvbiBvZiByZWxhdGlvbnNoaXBzIGJldHdlZW4gUm9sZXMsIFRhc2tzLCBhbmQgV29ya1Byb2R1Y3RzLiBUaGVyZSBhcmUgdHdvIG1haW4gdmFyaWF0aW9ucyBvZiBwcm9jZXNzIGRlZmluZWQ6IERlbGl2ZXJ5IFByb2Nlc3Nlcywgd2hpY2ggZGVzY3JpYmVzIGVuZC10by1lbmQgd2F5cyBvZiBkb2luZyBhICZxdW90O3Byb2plY3QmcXVvdDsgYXMgd2VsbCBhcyBDYXBhYmlsaXR5IFBhdHRlcm5zLCB3aGljaCBwcm92aWRlIHJldXN1YWJsZSBwYXJ0cyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbXBvc2UgRGVsaXZlcnkgUHJvY2Vzc2VzLiYjeEE7IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l2ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyNzQ5IiB5PSI3Njg3IiB3aWR0aD0iNzAzNSIgaGVpZ2h0PSI0NTQ2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l3ZWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMgYSBwbHVnaW4gbWVjaGFuaXNtIHdoaWNoIHJlbGllcyBvbiBwYWNrYWdpbmcgYXMgd2VsbCBhcyBuZXcgcmVsYXRpb25zaGlwIHR5cGVzIGZvciBjb250ZW50IGFuZCBwcm9jZXNzIGVsZW1lbnRzIHRoYXQgYWxsb3cgZGVjbGFyaW5nIGNoYW5nZSBkZWx0YXMgd2l0aG91dCBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIHNvdXJjZS4iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSExHaXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE3IiB5PSIyODUzIiB3aWR0aD0iNjU0NCIgaGVpZ2h0PSIyMzExIi8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2l4dWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZGVzY3JpcHRpb249IkRlZmluZXMga2V5IGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgV29ya1Byb2R1Y3RzLCBUYXNrcywgdGhlaXIgYXR0cmlidXRlcywgYW5kIHRoZWlyIGRlZmF1bHQgcmVsYXRpb25zaGlwcy4gQWxzbyBkZWZpbmVzIGEgYmFzaWMgbWVjaGFuaXNtcyB0byBvcmdhbml6ZSBjb3JlIGNvbnRlbnQgaW4gcGFja2FnZXMuIiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2l4LWZYRWR1cUhvT0piVVJaUnciIHg9IjYzNCIgeT0iOTgyNyIgd2lkdGg9IjYyODIiIGhlaWdodD0iMjgwMiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2l6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ITEdpeS1mWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGRlc2NyaXB0aW9uPSJEZWZpbmVzIGhvdyBwbHVnaW5zIGFyZSBmdXJ0aGVyIHBhY2thZ2VkIGluIGxpYnJhcmllcyBhcyB3ZWxsIGFzIGRlZmluZXMgdGhlIGNvbmNlcHQgb2YgY29uZmlndXJhdGlvbnMgZXh0ZW5kaW5nIHRoZSBwbHVnaW4gbWVjaGFtaXNtLiIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITEdpek9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjcwNyIgeT0iMTQ5MCIgd2lkdGg9IjYyOTkiIGhlaWdodD0iMTY5MyIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNZZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQkYiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc1plZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNhdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNZdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzWS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDkzNSIgeT0iODczNyIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNhLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc2ItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNkT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNiT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzYmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDgzIiB5PSIyNzk0IiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVGV4dCI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGlhZ3JhbU5hbWUiPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNkdWZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iMTIiIGJvbGQ9InRydWUiIGRlc2NyaXB0aW9uPSJJQk0gVW5pZmllZCBNZXRob2RzIEFyY2hpdGVjdHVyZSB2MS4wLjQ6IENvbmNlcHR1YWwgTWV0YS1Nb2RlbCIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTUiIHk9IjQ1NyIgd2lkdGg9IjEzOTE5IiBoZWlnaHQ9IjUyNCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNmLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5OTRCRjAyODIiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc2ctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNoLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNpT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNnT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODEwMSIgeT0iNDU3MiIgd2lkdGg9IjM3MjUiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNrLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0IiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc2wtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc21lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHNuT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNsT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzbGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTAyIiB5PSIxMDM0NiIgd2lkdGg9IjM2MTUiIGhlaWdodD0iMTcxMCIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNxLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwM0IiPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSExQc3ItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITFBzc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExQc3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMUHNzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hMUHN0T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMUHNyT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ITFBzcmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTI4MiIgeT0iMTQxMyIgd2lkdGg9IjM0NzkiIGhlaWdodD0iMTcwMSIvPgotICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd3VUbk9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIFVNQSBNZXRhLU1vZGVsIGlzIHN0cnVjdHVyZWQgYXMgZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0uICBUaGUgc3RydWN0dXJlIGRpdmlkZXMgdGhlIG1vZGVsIGluIGxvZ2ljYWwgdW5pdHMuICBFYWNoIHVuaXQgZXh0ZW5kcyB0aGUgdW5pdHMgaXQgZGVwZW5kcyB1cG9uIHByb3ZpZGluZyBhZGRpdGlvbmFsIHN0cnVjdHVyZXMgYW5kIGNhcGFiaWxpdGllcy4gIE92ZXJhbGwgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20gYXBwbGllZCB0byB0aGUgcGFja2FnZXMgcmVhbGl6ZXMgYSBncmFkdWFsIGV4dGVuc2lvbiBvZiB0aGUgY2FwYWJpbGl0aWVzIG1vZGVsZWQgdW5pdCBieSB1bml0LiAgQXMgYSByZXN1bHQsIHVuaXRzIGRlZmluZWQgb24gYSBsb3dlciBsYXllciBjYW4gYmUgcmVhbGl6ZWQgYnkgYSBVTUEgc3Vic2V0LWltcGxlbWVudGF0aW9uIHdpdGhvdXQgdGhlIGhpZ2hlciBsZXZlbCB1bml0cy4gIEZvciBleGFtcGxlLCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgY291bGQgYmUgYmFzZWQganVzdCBvbiB0aGUgTWV0aG9kIENvcmUgYW5kIE1ldGhvZCBQbHVnaW4gcGFja2FnZXMgd2l0aG91dCB1c2luZyB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLiAgSG93ZXZlciwgaWYgdGhlIFByb2Nlc3MgcGFja2FnZSB3b3VsZCBiZSBpbmNsdWRlZCBhcyB3ZWxsIGZvciB0aGUgaW1wbGVtZW50YXRpb24gdGhlbiBhZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBQcm9jZXNzIHBhY2thZ2Ugd291bGQgYmUgbWVyZ2VkIGludG8gdGhlIE1ldGhvZCBQbHVnaW4gcGFja2FnZS4iLz4KLSAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpdS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzWWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzZS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBzZk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzUyMiwgLTMyMSwgNTg3NSwgNTldJFstNzQ2NywgLTMyMSwgMTkzMCwgNTldIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2ZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc2Z1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l0dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNmLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHNpdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc2ktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM3NjcsIDAsIDI3MzQsIDc2XSRbLTQ2MzksIDAsIDE4NjIsIDc2XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNqT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hMUHNqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9ITEdpd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ITFBzYS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ITFBzai1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ITFBza09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMjY4LCAtNjM1LCAtMzQzNywgLTQ1N10kWzQ3NjYsIC02MzUsIC0xOTM4LCAtNDU3XSIvPgotICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNrZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hMUHNrdWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4wODQ3MTUwMiwwLjgxMDg1OTIpIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l4ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHNwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExQc3FPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDM4NSwgNjM1LCAtMTgxMSwgLTIwM10kWzMxNDEsIDQ1NywgLTMwNTYsIC0zODFdIi8+Ci0gICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3FlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExQc3F1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExQc3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hMR2l5dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hMUHNxLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMUHN5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hMUHN5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MTAzLCAtOTMsIDE3MzUsIC0xNl0kWy0zMTU4LCAtOTMsIDU2ODEsIC0xNl0iLz4KLSAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITFBzeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doRXVBdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQwNDAwRjEiPgotICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCRiIgbmFtZT0iUHJvY2VzcyI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR29PZTZ1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDBGRDg1NkIwMjc2Ij4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ4NTZCMDI3NiIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdxdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3ci1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd3AtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd3FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MCIgeT0iMTE0NTYiIHdpZHRoPSIzMzk4IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd3NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ4NTQ2MDBEOCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19laFFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX2VoUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfZWhSdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX1V3c2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3c3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzg5IiB5PSI4MzM0IiB3aWR0aD0iMjU0MCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhSLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfZWhTLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfZWhUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19laFQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX2VoVU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19laFNPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19laFNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzUxMSIgeT0iNTUwNSIgd2lkdGg9IjMwOTYiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX25yUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX3hjTWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR194Y051ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfbnJRLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfbnJST2ZYRWR1cUhvT0piVVJaUnciIHg9IjMyOTkiIHk9Ii0zMTEiIHdpZHRoPSIzNTIwIiBoZWlnaHQ9IjE2ODQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1NlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR194Y1RlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR194Y1VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNVdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX3hjU3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX3hjUy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTU0IiB5PSIyNDcwIiB3aWR0aD0iNDIwOSIgaGVpZ2h0PSIxNjg0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hb09lN09mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ifFVNQSBzZXBhcmF0ZXMgcmV1c2FibGUgY29yZSBtZXRob2QgY29udGVudCBmcm9tIGl0cyBhcHBsaWNhdGlvbiBpbiBwcm9jZXNzZXMuICBBIERldmVsb3BtZW50IFByb2Nlc3MgZGVmaW5lcyB0aGUgc3RydWN0dXJlZCB3b3JrIGRlZmluaXRpb25zIHRoYXQgbmVlZCB0byBiZSBwZXJmb3JtZWQgdG8gZGV2ZWxvcCBhIHN5c3RlbSwgZS5nLiBieSBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGZvbGxvd3MgdGhlIHByb2Nlc3MuICBTdWNoIHN0cnVjdHVyZWQgd29yayBkZWZpbml0aW9ucyBkZWxpbmVhdGUgdGhlIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFsb25nIGEgdGltZWxpbmUgb3IgbGlmZWN5Y2xlIGFuZCBvcmdhbml6ZSBpdCBpbiBzbyBjYWxsZWQgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUYXNrcyAoYXMgdGhleSBoYXZlIGJlZW4gaW50cm9kdWNlZCBhcyBwYXJ0IG9mIHRoZSBjb3JlIG1ldGhvZCBjb250ZW50KSBwcm92aWRlIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgZm9yIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBwZXJmb3JtZWQgdG8gYWNoaWV2ZSBhIHBhcnRpY3VsYXIgZGV2ZWxvcG1lbnQgZ29hbC4gIEEgVGFzayBkb2VzIG5vdCBsb29rIGF0IHRoZSAnYmlnIHBpY3R1cmUnIG9mIGhvdyB0aGUgd29yayBkZXNjcmliZWQgcmVsYXRlcyB0byBvdGhlciBUYXNrJ3Mgd29yay4gIFRoZXkgaGF2ZSBiZWVuIGRlZmluZWQgYXMgcmV1c2FibGUgY29yZSBtZXRob2QgY29udGVudCBpbmRlcGVuZGVudCBvZiB0aGVpciBwbGFjZW1lbnQgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgQWxsIHRoYXQgaXMgZGVmaW5lZCBmb3IgYSBUYXNrIGFyZSB0aGUgdHlwZXMgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cywgdGhlIGNvbmNyZXRlIHN0ZXBzIHRvIHBlcmZvcm0sIGFzIHdlbGwgYXMgd2hhdCBza2lsbHMgYXJlIHJlcXVpcmVkIHRvIHBlcmZvcm0gdGhlIHdvcmsgKHJvbGVzKS4gIFdoaWNoIFRhc2tzIGhhdmUgdG8gcHJlY2VkZSBhbmQgc3VjY2VlZCBhIFRhc2sgYXMgd2VsbCBhcyB3aGF0IHN0ZXBzIHRvIGZvY3VzIG9uIGF0IHdoYXQgcG9pbnQgb2YgdGltZSBpbiB0aGUgbGlmZWN5Y2xlIGFyZSBpbnRlbnRpb25hbGx5IG5vdCBkZWZpbmVkIGZvciBjb3JlIG1ldGhvZCBjb250ZW50LiAgVGhlIGdvYWwgaXMgcHJvdmlkZSBUYXNrcyB0aGF0IGNhbiBiZSByZXVzZWQgZm9yIG1hbnkgZGlmZmVyZW50IGRldmVsb3BtZW50IHNpdHVhdGlvbnMuJiN4QTt8VGhlIHNjb3BlIG9mIGEgcHJvY2VzcyBpcyB0byBwcm92aWRlIGV4dGVuZGVkIGFzIHdlbGwgYXMgY29uY3JldGUgd29yayBzdHJ1Y3R1cmVzIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHNpdHVhdGlvbi4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIHRha2VzIHJldXNhYmxlIGNvcmUgbWV0aG9kIGVsZW1lbnRzIHN1Y2ggYXMgVGFza3MgYW5kIFdvcmsgUHJvZHVjdHMgYW5kIHJlbGF0ZXMgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRvIGRvIHNvLCBVTUEncyBQcm9jZXNzIFBhY2thZ2UgcHJvdmlkZXMgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgcmVmbGVjdCB0aGUgaW5kdXN0cmllcyBiZXN0IHByYWN0aWNlcy4gIFRoaXMgc2VjdGlvbiBkZWZpbmVzIEJyZWFrZG93biBzdHJ1Y3R1cmUgbWV0YS1tb2RlbHMgdGhhdCBjb21wcmlzZSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgYnJlYWtkb3duIGVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgd2hpY2ggYXJlIGhpZ2hlciBsZXZlbCBncm91cGluZ3Mgb2Ygd29yayBjb21wcmlzaW5nIG9mIFRhc2tzIG9yIG90aGVyIEFjdGl2aXRpZXMgZGVmaW5pbmcgc2VxdWVuY2VzIGFuZCBjb25kaXRpb25zIG9uIFRhc2tzLiAgSW4gZmFjdCwgYSBwcm9jZXNzIGlzIGRlZmluZWQgYXMgYSBzcGVjaWFsIGtpbmQgb2YgQWN0aXZpdHkgaXRzZWxmLiAgVGhpcyBicmVha2Rvd24gc3RydWN0dXJlcyBtZXRhLW1vZGVsIGhhcyBiZWVuIGRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbmNyZXRlIGxpZmVjeWNsZSBtb2RlbHMgdGhlIHByb2Nlc3MgZW5naW5lZXIgd2FudHMgdG8gZXhwcmVzcyB3aXRoIHRoZW0uICBJbiBvdGhlciB3b3JkcyB0aGUgbWV0YS1tb2RlbCBpcyBhYmxlIHRvIHJlcHJlc2VudCAnZGlmZmVyZW50IHR5cGVzIG9mJyB3YXRlcmZhbGwgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgaXRlcmF0aXZlIG9yIGluY3JlbWVudGFsIHByb2Nlc3MgbW9kZWxzLiAgRmluYWxseSwgVU1BIGVuYWJsZXMgZGlmZmVyZW50IHR5cGUgb2YgcHJlc2VudGF0aW9ucyBmb3IgYnJlYWtkb3duIHN0cnVjdHVyZXMsIGFzIGlsbHVzdHJhdGVkIHdpdGggZXhhbXBsZSBpbiB0aGUgc2VjdGlvbnMgYmVsb3csIHN1Y2ggYXMgcHJvamVjdCBwbGFuLWxpa2Ugc3RydWN0dXJlZCBsaXN0LCB3b3JrZmxvdyBvciBhY3Rpdml0eSBkaWFncmFtcywgYW5kIHN0YXRpYyBzdHJ1Y3R1cmUgZGlhZ3JhbXMgc2hvdyBpbnB1dHMvb3V0cHV0cyB0byB3b3JrIGFzIHdlbGwgYXMgcGVyZm9ybWluZyByb2xlcy4gIFVNQSdzIFByb2Nlc3MgcGFja2FnZSBleHRlbmRzIHRoZSBjb25jZXB0cyBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIHRocm91Z2ggcGFja2FnZSBtZXJnZSBhcyBkZXBpY3RlZCBpbiB0aGUgZGlhZ3JhbS4gIEJyZWFrZG93biBtZXJnZXMgdGhlIHdob2xlIG9mIE1ldGhvZCBDb3JlIGJ5IG1lcmdpbmcgdGhlIE1ldGhvZCBQYWNrYWdlIHBhY2thZ2UuICBQcm9jZXNzIGlzIHNwZWNpZmllZCBpbiBVTUEgd2l0aCB0aGUgZm9sbG93aW5nIGZpdmUgcGFja2FnZXMuICBUaGUgQnJlYWtkb3duIHBhY2thZ2UgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYnJlYWtkb3duIGVsZW1lbnRzIHRoYXQgZm9ybSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFByb2Nlc3MgVHlwZXMgZGVmaW5lIFByb2Nlc3NlcyBhcyBzcGVjaWFsIEFjdGl2aXRpZXMgKGRlZmluZWQgaW4gYnJlYWtkb3duIGVsZW1lbnRzKSBhbmQgaW50cm9kdWNlIGRpZmZlcmVudCB0eXBlcyBvZiBQcm9jZXNzZXMgc3VjaCBhcyBEZWxpdmVyeSBQcm9jZXNzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMuICBQcm9jZXNzIFBhY2thZ2UgcmVmaW5lcyB0aGUgTWV0aG9kIFBhY2thZ2UgY29uY2VwdHMgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSB3aXRoIG5ldyBwYWNrYWdlcyB0aGF0IG9yZ2FuaXplIHByb2Nlc3NlcyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBQcm9jZXNzIERlc2NyaXB0aW9ucyBwcm92aWRlcyBwcm9jZXNzIHNwZWNpZmljIGNvbnRlbnQgZGVzY3JpcHRpb25zIGV4dGVuZGluZyB0aGUgdGF4b25vbXkgYmFzZWQgb24gdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gY2xhc3MgZGVmaW5lZCBpbiBNZXRob2QgQ29yZS4gIEZpbmFsbHksIFdvcmtmbG93IGRlZmluZXMgaG93IHByb2Nlc3MgY2FuIGJlIGVuYWN0ZWQgYnkgcHJvdmlkaW5nIGV4dGVuZGVkIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFsbG93IGNyZWF0aW5nIG1vZGVscyBmaXQgZm9yIGluc3RhbnRpYXRpb24gb24gdGhlIE0wIGxldmVsLiAgSW4gb3RoZXIgd29yZHMsIGl0IHByb3ZpZGVzIGEgbWV0YS1zY2hlbWEgZm9yIHdvcmtmbG93IG1vZGVscyB0aGF0IGNhbiBydW4gaW4gYSB3b3JrZmxvdyBzaW11bGF0b3Igc3VjaCBhcyBJQk0gV2Vic3BoZXJlIEJ1c2luZXNzIEludGVncmF0aW9uIE1vZGVsZXIuJiN4QTsiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9EeG55c094TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfRHhMR3dPeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfR19Vd3NPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19Vd3B1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55cy14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9EeG55dGV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0R4bnl0LXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRHhueXR1eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0R4bnl0T3hNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0R4bnlzZXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRHhueXN1eE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMywgMzIsIC02LCAtODVdJFsxMSwgMTUwLCAyLCAzM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRm9QV0VleE1FZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX0ZvUFdFT3hNRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0dfZWhSLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfVXdzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRm9QV0ZPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRm9QV0Z1eE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Gb1BXR094TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ZvUFdGLXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9Gb1BXRmV4TUVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9Gb1BXRXV4TUVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ZvUFdFLXhNRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzIsIDMyLCAtOCwgLTkxXSRbMTEsIDE1NSwgMSwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ladF9NZXhNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9JWnRfTU94TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9HX3hjU2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX2VoUi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9OT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ladF9OdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSVp0X09PeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JWnRfTi14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVp0X05leE1FZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSVp0X011eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JWnRfTS14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9Ils4MSwgMTcsIC0xMjcsIC0xNF0kWzE1NywgNjMsIC01MSwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX3IwVlJJZXhoRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9yMFZSSU94aEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9HX25yUXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX3hjU2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKT3hoRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3IwVlJKdXhoRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfcjBWUktPeGhFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9yMFZSSi14aEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfcjBWUkpleGhFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfcjBWUkl1eGhFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9yMFZSSS14aEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstNjgsIDMsIDM0MCwgLTIwXSRbLTMyOCwgMTgsIDgwLCAtNV0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGNTA5MDIwNiIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjWmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX3hjYWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX3hjYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNidWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfeGNjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfeGNjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX3hjZE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfeGNadWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfeGNaLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MjE2IiB5PSIzMTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183Tk5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TlAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODc2IiB5PSIxODA5NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05TT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05TZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05TdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05TLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05UT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05UZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05UdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05RZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05RdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMTA3IiB5PSIxODAyNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05XT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05XZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05XLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05YZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05VdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODUwIiB5PSIxODA2OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdOWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05hT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05hZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05hLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05ZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05ZdWZYRWR1cUhvT0piVVJaUnciIHg9IjMzNjEiIHk9Ijg3NzEiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183TmRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTAxIiB5PSI4Nzc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05nT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN05oT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tml1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TmpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TmplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05qLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TmdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183Tmd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM3IiB5PSIxMTA2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HXzdObmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdObi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05vZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05vdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05vLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05wT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05wZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN05wdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05wLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOcU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfN05tdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfN05tLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxMzIiIHk9IjExMDU3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05zdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfN050dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN050LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN051T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN051ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TnYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfN053ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR183TnMtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTMwNCIgeT0iMTM0MDIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tnd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR183Tnh1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183TnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HXzdOei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR183TjBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HXzdOdy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdOeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDMyMCIgeT0iMTEwNjUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWElPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWEpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWEwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg0NCIgeT0iMTM0MDIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFFWE5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWFAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQUVYTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MzE1IiB5PSIxMTA2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhUT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhRZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhRdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0Mzc2IiB5PSIxNTY4MCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYYi1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYZXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhiT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhiZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMDEzIiB5PSIxMTA2NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYamVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYa2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY0MSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhsdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVhtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYbk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhqdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhqLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0Mzc2IiB5PSIxMzQwMiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQUVYcy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQ1NSIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBRVh2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQUVYdnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBRVhzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhzZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNTg5IiB5PSI2NDM0Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBRVh3LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVh4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFFWHlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSUktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lKZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFFWHdPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWHdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODkyMyIgeT0iNjQzNCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQU9JUE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjk0NiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lRLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0lSZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JUi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBT0lPZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lPdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzQ0IiB5PSI0MTU3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0laLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ljdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSVpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTYwMzUiIHk9Ijg3NzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSWdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JZmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDgzIiB5PSI4Nzc5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lqT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBT0lrT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSWx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSWwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBT0ltLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEFPSWplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSWp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0MDAiIHk9IjY0MzQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEFPSXplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQU9JMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEFPSTJPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQU9JeXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JeS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjAyMiIgeT0iMjE3NSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR29PZTd1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyB0aGUgdGF4b25vbXkgb2YgYWxsIHRoZSBtYWluIGNsYXNzZXMgb2YgdGhlIFByb2Nlc3MgcGFja2FnZS4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HXzdOa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTYwIiBzb3VyY2U9Il9HXzdOZ09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR183Tmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HXzdObE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HXzdOa2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfN05rdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MCwgLTUyNCwgLTIyODYsIDE3NjFdJFsyMjUyLCAtMTc2MSwgLTY5NCwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR183TmwtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdObU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR183TnFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfR183Tm1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR183TllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HXzdOcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfN05yLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR183TnJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR183TnF1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HXzdOcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTQzLCAtNTMzLCA0NjUsIDE3NTJdJFstNDc0LCAtMTc2MSwgMTM1LCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HXzdOc09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfN05zZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HXzdOTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYVWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhVdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNDMsIC01MjQsIC00MDg5LCAxODExXSRbNDAzOCwgLTE4MTEsIC0xMTkzLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhXT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYV2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HXzdOUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWFgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYWGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYV3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhXLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ0OCwgLTUyNCwgLTE1ODMsIDE4MTFdJFsxNTY2LCAtMTgxMSwgLTQ2NSwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWFlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYWWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFFWFl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RSIgc291cmNlPSJfR183TlVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFFWFFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFFWFp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFFWFktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQUVYWk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDU3LCAtNTI0LCAxNTc0LCAxODExXSRbLTE1NzQsIC0xODExLCA0NTcsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhhZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhlLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0dfN05zdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhhLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhmLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhmT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWGZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODEyLCAtNTI0LCAtMjg5NSwgMTgxMV0kWzI4NzAsIC0xODIwLCAtODM4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYZ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQUVYaE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9IQUVYSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBRVhpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWGl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQUVYaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQUVYaGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBRVhodWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI0NSwgLTUyNCwgLTkyMiwgMTgxMV0kWzg5NywgLTE4MjAsIC0yNzAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhpLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFFWGpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBRVhuZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0hBRVhRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVhqZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFFWG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQUVYby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBRVhvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBRVhudWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFFWG4tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTc1Ml0kWzAsIC0xNzY5LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQUVYcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBRVhwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JSi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lLT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNTksIC00NTcsIC00OTM2LCAxODc5XSRbNDcwNywgLTE4MTEsIC0xMzg4LCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lMdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JTC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HXzdOY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQUVYdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSU5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JTU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lNZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc3OCwgLTUyNCwgLTI3NzcsIDE4MTFdJFsyNzQzLCAtMTgxMSwgLTgxMiwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSU51ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JTi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSVNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOTFGMDA2MSIgc291cmNlPSJfSEFFWHYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSU9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lUdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSVRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSVNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MjgsIC01MzMsIC0yNDcyLCAxNzUyXSRbMjQ0NiwgLTE3NjksIC03NTMsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lULWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0lVZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUVGOTAwRTIiIHNvdXJjZT0iX0hBRVhyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0lVdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSVUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUzMywgMCwgMTc1Ml0kWzAsIC0xNzY5LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JV09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lXZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JV3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9IQUVYTU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HXzdOWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JWHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JVy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lYT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MzksIC01MjQsIDMyMjUsIDE3NjFdJFstMzE5MSwgLTE3NjEsIDk3MywgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSVllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSWMtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfSEFFWGEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSVktZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0llZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSWQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSWRPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9JZGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4MjEsIC01MjQsIC0yODg3LCAxNzYxXSRbMjgzNiwgLTE3NjksIC04NzIsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSWUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0luT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ2RDAwODgiIHNvdXJjZT0iX0hBT0lqT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lPT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0lvT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0luZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSW51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTYzNSwgLTUzMywgMjEwOCwgMTc1Ml0kWy0yMTI1LCAtMTc2OSwgNjE4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9Jby1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0lwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9JcGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9IQUVYYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0lxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9JcHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0lwLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy04MDQsIC01MjQsIDI3NTEsIDE3NjFdJFstMjc0MywgLTE3NjksIDgxMiwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JcmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFPSXJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfSEFFWE1PZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEFPSWZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9Jcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFPSXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFPSXItZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQU9Jc09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0MzEsIC01MjQsIC0xNDk4LCAxNzYxXSRbMTQ4MSwgLTE3NjksIC00NDgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBT0l0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBRVh2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQU9JdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBT0l1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBT0l1T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFPSXVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTgxMV0kWzAsIC0xODExLCAwLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQU9JdnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQU9Jd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9IQU9JWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HX3hjWmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBT0l4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFPSXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQU9JeE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQU9Jd2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBT0l3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMiwgLTMxOCwgMTg1MywgODE3NV0kWzIxMiwgLTM4MzcsIDE4NTMsIDQ2NTZdJFstMTUwOCwgLTgxNzYsIDEzMywgMzE3XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFPSXgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjg3MDAzMjU1LDAuNDY1NDA4OCkiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBT0l5T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQVg1SU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBzb3VyY2U9Il9IQU9JT09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQU9JeWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQVg1Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQVg1SWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBWDVJdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE0NTZdJFswLCAtMTQ2NCwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1S09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEFYNUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfSEFPSXllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR194Y1plZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBWDVMLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEFYNUxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEFYNUt1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQVg1Sy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MjQsIC01MjQsIC0xNDA1LCAxMzU0XSRbMTM4MCwgLTEzNTQsIC01NTAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBWDVNT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBWDVNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0dfN053dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBT0lmT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEFYNU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQVg1T09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBWDVOdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBWDVNLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEFYNU5PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTUyNCwgNjYwLCAxNzYxXSRbLTY3NywgLTE3NjksIDE4NiwgNTE2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEFYNU9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQVg1T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2hPZkF1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCRiI+Ci0gICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4IiBuYW1lPSJCcmVha2Rvd24iPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR2s5SWdPZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFGMDVFQ0QwMzkwIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDVFQ0QwMzkwIiB0eXBlPSJDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzFNajVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIwODIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxTWo1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxTWo3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMU1qNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMU1qNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxTWo0dWZYRWR1cUhvT0piVVJaUnciIHg9IjkyMjAiIHk9IjEwODc5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMU1qOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFNajgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzFNajlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0NzAiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0MU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0MXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMVZ0Mk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDJ1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzFNajhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFNajh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgyMyIgeT0iMTU3OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQyLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMVZ0My1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzFWdDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzFWdDZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxVnQ2dWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cxVnQzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFWdDNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzI5MSIgeT0iMTMzMTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEswZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMThLMWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEsyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEsydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEszT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEszdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLNE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMThLMHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLMC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNTQ3IiB5PSIxNTc5OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cxOEs1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLN09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThLN3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4SzctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzE4SzR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLNC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzODA0IiB5PSIxMzMxNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyRlV0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjY5IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVXNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzY5OSIgeT0iMTA4NzkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMkZVeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjY3NSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlV6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlV6LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyRlV3ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVXd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2ODAiIHk9IjEzMzE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVX09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJGVkFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZWQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJGVV9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVV91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI0MjAiIHk9IjE1Nzk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJQRnVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NDMiIGhlaWdodD0iOTkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZ2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZ2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEZ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGdy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMlBGdGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEZ0dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzY0IiB5PSIxNDI5MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyUEY5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRi1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRi11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlBGX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRl91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRl8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJQRjhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBGOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MDU1IiB5PSIxMDk4NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyUEdCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdET2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQR0RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEdELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyUEdBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJQR0F1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTc2MiIgeT0iNzIxMyIgd2lkdGg9IjM4NTkiIGhlaWdodD0iMTIxOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyWTIyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNDM4IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTIydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJZMjVPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJZMjF1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkyMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjI1NiIgeT0iNzUyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyWTNGZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTQ2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMmlBcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkzRS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDAwNyIgeT0iNTU0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyaUF2dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODI3IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQXgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUF5ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyaUF1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUF2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyNTYiIHk9IjExNTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMmlBenVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDI2NyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUExT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUExdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJpQTEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyaUEyZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyaUF5LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQXpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk4MSIgeT0iODI4OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQTJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUEzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyaUEzdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMTUwIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnhvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeG9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeG8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4cE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4cHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ4cU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeHF1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzJpQTItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMmlBM09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTUzMyIgeT0iNTcwNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cycnh5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4eS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeHotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeDBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJyeDAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycngxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cycnh4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnh5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMDAiIHk9IjI4MzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMnJ4X3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5QXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5Qk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5Q09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5Q2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMnJ4LS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4X09mWEVkdXFIb09KYlVSWlJ3IiB4PSI5Nzg3IiB5PSIzMDM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzJyeUlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NjIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnlJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5Sk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlKZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5S09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cycnlLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5S3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMnJ5Sy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMnJ5SGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnlIdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTgiIHk9IjEwMjE5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2s5SWd1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBCcmVha2Rvd24gcGFja2FnZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBicmVha2Rvd24gZWxlbWVudHMgdGhhdCBmb3JtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlIGRpYWdyYW0gc2hvd3MgdGhlIHRheG9ub215IG9mIHRoZSBtYWluIGNsYXNzZXMuICBJdCBwcmVzZW50IHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdHkgYW5kIERlc2NyaXB0b3IgYXMgd2VsbCBhcyB0aGVpciBrZXkgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cxVnQ2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0cxVnQyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0N3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxVnQ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMVZ0OGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzFWdDctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cxVnQ3T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzFWdDdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUyLCAtNDU3LCAwLCAyMDgyXSRbMTUyLCAtMjA5MSwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMVZ0OHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzFWdDgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMXlad09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBzb3VyY2U9Il9HMU1qOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMVZ0Mi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5Wnh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cxeVp4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMXlaeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTAiIHk9IjQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxeVp5LWZYRWR1cUhvT0piVVJaUnciIHg9Ii03MCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVp6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzF5WnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaenVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDYiIHk9IjIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxeVowT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMXlaMGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOEt5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOEt4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4S3ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4S3pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3l1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEt6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzE4SzBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S3p1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cxeVp3ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzF5Wnd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTU1OCwgLTUwLCAxOTMwXSRbMCwgLTIwNDAsIC01MCwgNDQ4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzE4SzhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRzE4SzBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Szl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEs5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMThLOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Sy1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4Sy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4Sy1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ4IiB5PSI0NTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOEtfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThLX09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzIiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThLX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4S18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc2IiB5PSIyMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TEEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzE4TEF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMQi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMQmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMThMQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMThMQ2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzE4TERPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cxOExEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExEZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMThMRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cxOExFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cxOExFZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMThLOHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cxOEs4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM3MiwgLTU1OCwgLTY0MywgMTkzMF0kWzM3MiwgLTIwNDgsIC02NDMsIDQ0MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyRlUwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0cyRlV3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJGVTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyRlUwZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZVMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTg0LCAtNDU3LCAyNzE3LCAyMDgyXSRbLTI3MTcsIC0yMDkxLCA1ODQsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJGVTEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyRlUyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJGVTJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgc291cmNlPSJfRzJGVXdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJGVXNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlUzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMkZVM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0xMzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE4MyIgeT0iMTEwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVNS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzY4IiB5PSItMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlU2dWZYRWR1cUhvT0piVVJaUnciIHg9IjcyIiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVTctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVTdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlU5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZVOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVOS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVOWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVS1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVS11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMkZVLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZVLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJGVTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMkZVMi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MzYsIC00NDgsIC01MzMsIDIwOTFdJFs3MzYsIC0yMDkxLCAtNTMzLCA0NDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMkZWRE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HMkZVX09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyRlZFT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjQiIHk9IjQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZGdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZGLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NCIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTciIHk9IjE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMkZWSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OSIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyRlZKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyRlZKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyRlZKT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMkZWSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJGVktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJGVkt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJGVktPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRnNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyRlZEZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJGVkR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI0NSwgLTU2NywgNjE4LCAxOTIxXSRbLTI0NSwgLTIwNDgsIDYxOCwgNDQwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJQRnhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgc291cmNlPSJfRzJQRnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJGVV9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBGeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRnplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRnpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3OSIgeT0iLTIzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEZ6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEZ6LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwOSIgeT0iNjciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBGMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU4NyIgeT0iLTM1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEYydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEYyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEYzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyUEYzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyUEYzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRjR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEY1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzJQRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzJQRjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyUEZ4ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJQRnh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQzLCA0OTEsIDM4NTIsIC0xMDgzXSRbMTQzLCAxMjk1LCAzODUyLCAtMjc5XSRbLTE3MDEsIDEyOTUsIDIwMDYsIC0yNzldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlBGNS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGOTRBQjkwMDE1IiBzb3VyY2U9Il9HMlBGdE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMkZVd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBGN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQRjdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyUEY2LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlBGNk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJQRjZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzODAsIC0yODcsIDMxOTEsIDYyNl0kWy0zMjM0LCAtNjYwLCAxMzM3LCAyNTRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyUEY3dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlBGNy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyUEdFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlBHRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzMzgiIHk9Ii03NzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlBHR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHR09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM4IiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHRy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDMiIHk9IjIzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyUEdIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJQR0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlBHSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzkiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NSIgeT0iLTEyNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkycy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkydE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkydXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkydU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ2T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkydi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTJ3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTJ3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlBHRWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyUEdFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzE4LCAzODEsIDE5MzgsIC0zMTI0XSRbLTQxMDYsIDM4MSwgLTQ0OCwgLTMxMjRdJFstNDEwNiwgMzA1NiwgLTQ0OCwgLTQ0OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyWTJ3LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0cxTWo0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTJ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMngtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyWTJ4T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMlkyeGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTIsIC00NTcsIC0xMDY2LCAzMDQ4XSRbOTk5LCAtMjg5NSwgLTIyMCwgNjA5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZMnktZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMlkyek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HMkZVc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMnotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyWTIwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkyemVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJZMnp1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ0MCwgLTQ1NywgMjkxMiwgMzA0OF0kWy0yNzY4LCAtMjg5NSwgNTg0LCA2MDldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyWTIwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkyMU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyWTI1ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiIHNvdXJjZT0iX0cyUEdBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyWTIxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJZMjZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTI4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyOE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTUxIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTI4LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yODciIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTMwIiB5PSIzMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZMl9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkyX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMlkyXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMlkyX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTNBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTNBZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMlkzQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyWTNCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyWTNCZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMlkyNXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTI1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3MTgsIDE1MiwgLTQyNzUsIDBdJFs0Nzc1LCAxNTIsIC0xMjE5LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJZM0NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzE4SzRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzFNajRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJZM0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyWTNEdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMlkzRE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJZM0NlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cyWTNDdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYxOCwgLTQ1NywgLTI5ODgsIDIwODJdJFsyOTQ2LCAtMjA5MSwgLTY2MCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMlkzRC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJZM0VPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMmlBcU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U5MUYwMDYxIiBzb3VyY2U9Il9HMlBHQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJpQXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyaUFyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMmlBcWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJpQXF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTYxOCwgMCwgMTIxMF0kWzAsIC0xMzgwLCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyaUFyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBc09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cyaUFzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUVGOTAwRTIiIHNvdXJjZT0iX0cyWTIxZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyWTNFZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyaUF0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMmlBdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJpQXRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cyaUFzdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMmlBcy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTIyNywgLTQyMywgNDc2NiwgMTU1N10kWy00NjIyLCAtMTUzMiwgMTM3MSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMmlBdU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJpQXVlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4cS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VENkQwMDg4IiBzb3VyY2U9Il9HMmlBMnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4c09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnhyLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4ck9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeHJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwODMsIC0xNTIsIDQ3NTgsIDYwOV0kWy00MzY4LCAtNTc1LCAxNDczLCAxODZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnhzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4cy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnh0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0cxOEs0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4dXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeHVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnh0ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4dHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM3LCAtNDU3LCAyMzAyLCA0NjczXSRbLTIzMjgsIC00NjgyLCAyMTEsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeHZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzJpQXl1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJQR0FPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycnh3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4d2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeHZ1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4di1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MTQsIC00NDgsIC02NDUxLCA0NjVdJFs5MTQsIC0xMjc4LCAtNjQ1MSwgLTM2NF0kWzU2NDcsIC0xMjc4LCAtMTcxOCwgLTM2NF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeHhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnh4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeDF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkYzMDI2RSIgc291cmNlPSJfRzJyeHh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJpQXV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycngzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4MnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeDEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4Mk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDIyLCAtNTI0LCAtMzMwMiwgMTE1MV0kWzMzMDIsIC0xMTg1LCAtMTQyMiwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4M2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ4My1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HMlBGOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBeXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycng0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ4NE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeDRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY0MywgLTQ1NywgMzA2NCwgMjEzM10kWy0zMDczLCAtMjE0MiwgNjM1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycng1dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4NS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycng2T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyOTAxRkQiIHNvdXJjZT0iX0cyUEY4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cycnh4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4Ni1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ4N3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzJyeDdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycng2ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzJyeDZ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1MiwgLTEzMiwgNDM5MiwgNzkxMV0kWy02NTM1LCAtMTMyLCAtMTE5MSwgNzkxMV0kWy02NTM1LCAtNzcyNSwgLTExOTEsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeDctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycng4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzJyeDhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfRzE4SzBlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzJyeHh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cycng5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMnJ4OWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzJyeDh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ4OC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjExNywgLTIxMiwgOTI2LCAxMjkzOF0kWy01MjEzLCAtMjEyLCAtMjE3MCwgMTI5MzhdJFstNTIxMywgLTEzMjU2LCAtMjE3MCwgLTEwNl0kWy00NTc4LCAtMTMyNTYsIC0xNTM1LCAtMTA2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ4LU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeC1lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ5Q3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBzb3VyY2U9Il9HMlkzRWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMnJ4LXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnlEdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ5Qy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnlET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NDgsIC0xMDEsIDE5ODldJFswLCAtMTkzMCwgLTEwMSwgNTA4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ5RWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzJyeUV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMnJ5RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9HMnJ4LXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMmlBdXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMnJ5R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzJyeUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cycnlGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMnJ5Rk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0cycnlGZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDc1LCAtNTI0LCAyODM2LCAxMzU0XSRbLTI4MzYsIC0xMzYzLCAxMDc1LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cycnlHdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMnJ5Ry1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0cycnlMT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkIxRUMxQjAzNDkiIHNvdXJjZT0iX0cycnlIT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0cyaUF5dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpby1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaW9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0cycnlMZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMnJ5THVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjAsIC00NTcsIC03NDUsIDE0NzNdJFs3MjgsIC0xNDgxLCAtMjM3LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0cyMWlwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMjFpcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVDNTEzMDIwMyIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25TdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMjFpcC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ie0l0ZXJhdGlvbi5wcmVmaXggPSAmcXVvdDtJdGVyYXRpb24mcXVvdDt9JiN4QTsiIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDkyMSIgeT0iMTM4NTkiIHdpZHRoPSIzMTc1IiBoZWlnaHQ9IjEyNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzIxaXJPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IntQaGFzZS5wcmVmaXggPSAmcXVvdDtQaGFzZSZxdW90O30mI3hBOyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyMWlyZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzU0IiB5PSIxMzg1OSIgd2lkdGg9IjI4MDIiIGhlaWdodD0iMTI0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWlzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyMWl0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzIxaXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyMWl2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyMWlzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzIxaXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1ODEiIHk9IjEyMDU2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzIxaXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzIxaXhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyMWl4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1za2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2xPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zbC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc21PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc21lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzIxaXdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMjFpd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTE1MSIgeT0iMTIxMDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zbnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc24tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zbS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXNuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzNzc1IiB5PSI4MTQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zcXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzItc3J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItc3VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzItc3EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMi1zck9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDE5MCIgeT0iMTM5MzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN1dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMi1zdnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXN3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXN4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zeWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HMi1zdS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXN2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMzUxIiB5PSIxMTcwMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0cyLXM4ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItcy1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItcy11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0cyLXNfT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXM3dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItczctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2NTgiIHk9IjcwMjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXNfZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lka09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM0lka2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNJZGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czSWRsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkVudW1lcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM0lkbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czSWRtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0cyLXNfdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzItc18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTQ1OSIgeT0iMTIzNDciIHdpZHRoPSIzMjM0IiBoZWlnaHQ9IjI3MTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM1JuaS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5qdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5rT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jua2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5rdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5sT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JubGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JubHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM1JuaU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5pZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5MTI2IiB5PSI4MTM2IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIyMTE2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzNSbnJlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Juc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm5zdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm50T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czUm50dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JudC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JudU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM1JucXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JucS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjgxNCIgeT0iMTg4OCIgd2lkdGg9Ijc1MjYiIGhlaWdodD0iMjgyNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czYll3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXpPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNiWXZ1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2JZdi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzYwIiB5PSIxMDM2MyIgd2lkdGg9IjcyMzAiIGhlaWdodD0iMTUyNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0czYlkwZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzNiWXp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzNiWXotZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY2NCIgeT0iMzc1MCIgd2lkdGg9IjU5NDMiIGhlaWdodD0iMjM1MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsR1NZZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgdGhlIHZpZXcgb24gQnJlYWtkb3duIEVsZW1lbnRzIGZyb20gYSB3b3JrIGJyZWFrZG93biBwZXJzcGVjdGl2ZSBjYWxsZWQgV0JTIChXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUpIHRoYXQgaW5jbHVkZXMgVGFza3MgYW5kIEFjdGl2aXRpZXMgKGJ1dCBhbHNvIHRoZSBub3Rpb24gb2YgTWlsZXN0b25lcyB0aGF0IGRvIG5vdCByZXByZXNlbnQgd29yaykuICBVTUEgYWxzbyBkZWZpbmVzIHR3byBtb3JlIHZpZXdzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgYXMgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgYW5kIFRlYW0gUHJvZmlsZSBCcmVha2Rvd24gU3RydWN0dXJlLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMi1zeXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HMi1zcXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItc3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0cyLXN6dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDQiIHk9IjQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMxZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDMiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNSIgeT0iMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXMzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0cyLXMyLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk4IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzItczVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzItczR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0cyLXM1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMi1zNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zNk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzItczYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMi1zN09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMi1zNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzItc3ktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HMi1zek9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzMsIC01NTgsIDE2LCAyNTkwXSRbLTMzLCAtMjY1OCwgMTYsIDQ5MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czSWRuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9HMjFpcS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNJZG5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czSWRudWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC02MjYsIDAsIDEyNTNdJFswLCAtMTM4OCwgMCwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuZ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JuZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlQXR0YWNobWVudCIgc291cmNlPSJfRzIxaXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzIxaXNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Q29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm5nLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JuaE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjUsIC02MjYsIDI1LCAxMzAzXSRbLTQyLCAtMTQzOSwgOCwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbmh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1JubC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HMjFpc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Jubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5tLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1JubU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbm1lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI4NywgLTQ5OSwgMTY0MiwgMjg1M10kWy0xMzI5LCAtMjI5NCwgNjAxLCAxMDU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JubnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNSbm4tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM1Jub09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HMjFpd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JucGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czUm5wT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM1Jub2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbm91ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg2LCAtNDk5LCAtMTE4NSwgMjkwNF0kWzkzOSwgLTIzNDUsIC00MzEsIDEwNThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm5wLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JucU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm51ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiIHNvdXJjZT0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Judk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm52dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1Judi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JudmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDgiIHk9Ii0yNzg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI0IiB5PSItNTc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JueGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbnhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0OSIgeT0iLTUwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm54dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JueC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTU2IiB5PSItMjQxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbnl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0NSIgeT0iMzM0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbnotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbnplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNSbjAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNSbjBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM1JuMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuMmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbnV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM1JudS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNzU3LCAtNjYyLCAzNzU3LCAtNjYyXSRbNjEzOCwgLTY2MiwgNjEzOCwgLTY2Ml0kWzYxMzgsIC0yMzI5LCA2MTM4LCAtMjMyOV0kWzUwMiwgLTIzMjksIDUwMiwgLTIzMjldJFs1MDIsIC0xNDI5LCA1MDIsIC0xNDI5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNSbjNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzItc211ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNSbnFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm4zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNSbjRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm40dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JuNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNSbjNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czUm4zdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUxNiwgLTQ5OSwgLTUyNzQsIDQ4MzRdJFs0MjMzLCAtMzkyMCwgLTE1NTcsIDE0MTNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czUm40LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM1JuNU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czUm41ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0czUm5xZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czUm5oLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czUm42dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM1JuNmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzYzIiB5PSI5MjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM1JuN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM1JuN2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4NCIgeT0iMzM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjI5IiB5PSItMjcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlloZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MTAiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjMiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllpLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllqLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWWxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlltT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czUm41dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNSbjUtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzc1NywgODIwLCAzODEwLCAtNTA1NF0kWzY4MjYsIDgyMCwgNjg3OSwgLTUwNTRdJFs2ODI2LCA1Nzk0LCA2ODc5LCAtODBdJFsxMzQ5LCA1Nzk0LCAxNDAyLCAtODBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2JZbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYlludWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ5IiB5PSI1NDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNTMiIHk9IjUzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllxLWZYRWR1cUhvT0piVVJaUnciIHg9IjQyOCIgeT0iLTMyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYllzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYllzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czYll0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYllzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDI2NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYll1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWXZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWXV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czYlltLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNiWW5PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM3NTcsIC03NjcsIC0zNzU3LCAtNzY3XSRbLTUxMDcsIC03NjcsIC01MTA3LCAtNzY3XSRbLTUxMDcsIC0yMzI5LCAtNTEwNywgLTIzMjldJFstODQ3LCAtMjMyOSwgLTg0NywgLTIzMjldJFstODQ3LCAtMTQyOSwgLTg0NywgLTE0MjldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2JZM2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIiBzb3VyY2U9Il9HM2JZdmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czYlk0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZNWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY2IiB5PSIxNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNTgiIHk9Ii0xNjI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czYlk2LWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MCIgeT0iMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUzIiB5PSItNTA4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlk5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzNiWTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNiWTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czYlktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2JZLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNiWV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2JZXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2JZX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNiWTN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM2JZMy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE4NSwgLTc2MiwgLTE4NDUsIDU0MzVdJFstMTE4NSwgLTUwMjAsIC0xODQ1LCAxMTc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSmdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCIgc291cmNlPSJfRzNiWXZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpoT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc1MCIgeT0iMTAyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEppZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEppT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjgiIHk9Ii0xNzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEppLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMzQiIHk9IjE3NzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk0IiB5PSItMTU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzNsSmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY5IiB5PSI2MzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM2xKbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM2xKbU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpuT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czbEpvdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czbEpvT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKZ2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEpndWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM5NywgLTc2MiwgLTI2MiwgNTQzNV0kWzM5NywgLTUwMjksIC0yNjIsIDExNjhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKby1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMi1zbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpwLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEpwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1LCAtNDk5LCAtMjUsIDMwNTZdJFsyNSwgLTMwNzMsIC0yNSwgNDgyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKck9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HMi1zdXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEpzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKcmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQxNCwgLTQ5OSwgNTY4MSwgNjc2NF0kWy01MTA1LCAtNjA4NywgOTkwLCAxMTc2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKcy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HM1JuaC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEp1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKdHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSnQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MDUsIC01MTYsIDEwNDgxLCAzNzUwXSRbLTg5MTUsIC0zMjAwLCAyOTcxLCAxMDY2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKdk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM2xKdnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HM2JZemVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM1JucWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSndlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM2xKdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czbEp3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM2xKdi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzNsSndPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjk3MSwgLTQwNiwgLTg5NjYsIDEyMTldJFs4MTcwLCAtMTExNywgLTM3NjcsIDUwOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzNsSnhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp4dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzNsSngtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzItczdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzNiWXplZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzNsSnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czbEp6ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM2xKeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzNsSnlPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czbEp5ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NTMsIC00OTksIDMyMDgsIDIwOTFdJFstMjE1OSwgLTE0MTMsIDE4MDMsIDExNzZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0czbEp6dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM2xKei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjVGMUU4MDI4MyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRlYW1CcmVha2Rvd25TdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM3VUY2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0ie1JvbGVEZXNjcmlwdG9yLm1vZGlmaWVzID0gUm9sZS5wZXJmb3Jtc0FzT3duZXIub3V0cHV0IHVuaW9uIFJvbGUucGVyZm9ybXNBZGRpdGlvbmFsbHkub3V0cHV0IHVuaW9uIFJvbGUuYXNzaXN0c0luLm91dHB1dH0iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDcyNiIgeT0iMTczNzAiIHdpZHRoPSI2MTQ3IiBoZWlnaHQ9IjE4NTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HM3VUZWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUaE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM3VUZHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVRkLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0OTc3IiB5PSI4ODkwIiB3aWR0aD0iMjg2MSIgaGVpZ2h0PSIxNzM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzN1VGllZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9Ijc1ODYiIGhlaWdodD0iMjY0MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VGplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUa2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czdVRrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUbE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HM3VUaHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVRoLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5OTIiIHk9IjQwNjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HMzRFamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVsZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RWx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVsLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0czNEVpdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzM0RWktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MDUiIHk9IjEyOTU0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzM0RXB1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RXNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzM0RW8tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HMzRFcE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2Njk3IiB5PSI4NTU5IiB3aWR0aD0iMjczMiIgaGVpZ2h0PSIyMTg0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRCMWZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMWlPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRCMWV1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzI2IiB5PSIxMzIxNiIgd2lkdGg9IjMxNDYiIGhlaWdodD0iMjQyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0QjJCT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIyQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMkItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMkNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjJDdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMkMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX1llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19ZLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0QjJBZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMkF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMCIgeT0iMTU2MjkiIHdpZHRoPSIzNzkzIiBoZWlnaHQ9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNEtfYU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19iLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19jZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNEtfWmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S19adWZYRWR1cUhvT0piVVJaUnciIHg9IjQxMzEiIHk9IjE3MzMxIiB3aWR0aD0iNDIzMyIgaGVpZ2h0PSIxMzAzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xHU1ktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBhIHByb2Nlc3MgZnJvbSBhIFRlYW0gYW5kIFJvbGUgcGVyc3BlY3RpdmUgY2FsbGVkIFRCUyAoVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlKS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzN1VGxlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzN1VGhlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HM3VUbWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VG5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM3OCIgeT0iMzgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VG9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ5NSIgeT0iMzk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czdVRvLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDUzIiB5PSIxOTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUcHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc1IiB5PSItMjc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzN1VHItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzN1VHJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVRzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HM3VUdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUdGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzN1VGx1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM3VUbC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcyNSwgLTI2LCAtMjcyNSwgLTI2XSRbLTU2ODgsIC0yNiwgLTU2ODgsIC0yNl0kWy01Njg4LCAtMjkzNywgLTU2ODgsIC0yOTM3XSRbLTE1ODcsIC0yOTM3LCAtMTU4NywgLTI5MzddJFstMTU4NywgLTEwNTgsIC0xNTg3LCAtMTA1OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0czdVR1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czdVR2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzN1VHZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czdVR1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HM3VUdXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTMxLCAtODcyLCAzNjkxLCAzNDk2XSRbLTMyMzQsIC0zMDQ4LCAxMzg4LCAxMzIwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HM3VUdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzN1VHdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HM3VUd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzN1VHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czdVR4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HM3VUeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HM3VUeWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQ1IiB5PSItNDI3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5MCIgeT0iMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDU5IiB5PSItMjA3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RWQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc1IiB5PSIyMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HMzRFZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEVnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEVpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEVodWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HM3VUd3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czdVR3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2OTksIC0yNiwgMjY5OSwgLTI2XSRbNTg3NCwgLTI2LCA1ODc0LCAtMjZdJFs1ODc0LCAtMjk2MywgNTg3NCwgLTI5NjNdJFsxNDAyLCAtMjk2MywgMTQwMiwgLTI5NjNdJFsxNDAyLCAtMTA1OCwgMTQwMiwgLTEwNThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMzRFbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HMzRFaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUZGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RW5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RW4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEVuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HMzRFbXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0czNEVtLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMTMsIC04NzIsIDExMDksIDMxOTFdJFstMTEzNCwgLTMyMDAsIDI4NywgODYzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HMzRFb09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzM0RW9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HMzRFc3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBzb3VyY2U9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0czNEV0dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzYiIHk9IjIzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcxNCIgeT0iLTMzMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFd09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzYwIiB5PSIyNDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HMzRFdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEV5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEV5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0czNEV6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0czNEV5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HMzRFemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzM0RXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RTBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RXp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEUwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0czNEUwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzM0RTFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzM0RTB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0czNEVzLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzM0RXRPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExNzYsIDQyLCAtMTE3NiwgNDJdJFstMjU3MywgNDIsIC0yNTczLCA0Ml0kWy0yNTczLCAtMTc2MSwgLTI1NzMsIC0xNzYxXSRbLTUwLCAtMTc2MSwgLTUwLCAtMTc2MV0kWy01MCwgLTEwOTIsIC01MCwgLTEwOTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HM3VUaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjFkT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxY2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMWN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTk5LCAtMTEwMCwgLTI5MTIsIDMxNjZdJFsyNjgzLCAtMjk0NiwgLTEyMjcsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjFkLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxZU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjFpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NyIgeT0iLTMyMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFrZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzIiIHk9Ii0xOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFsT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NyIgeT0iMjkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFsLWZYRWR1cUhvT0piVVJaUnciIHg9IjgyNCIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NDYiIHk9IjMzOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFuZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0QjFvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjFvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjFpdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMWktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM5NywgLTk1NiwgLTg5NjYsIC0zNDddJFs4MjM4LCAtOTU2LCAtMjEyNSwgLTM0N10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjFyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czNEVpZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjFzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNEIxc09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM3IiB5PSItMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg2OCIgeT0iLTM3NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0QjF0LWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MCIgeT0iLTM4MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM4IiB5PSIxNTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxdmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzM3IiB5PSItOTczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMXh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMXhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjF4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxenVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxek9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMXJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MywgMTIxMCwgLTEwMjcwLCAxODIwXSRbOTMsIDIwNTcsIC0xMDI3MCwgMjY2N10kWzkyNzksIDIwNTcsIC0xMDgzLCAyNjY3XSRbOTI3OSwgMjU0LCAtMTA4MywgODYzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRCMXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0czdVRjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0QjFyT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNEIxME9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRCMTBlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg3MiwgLTExNTksIDEwMjQsIDEzNTRdJFstMTg5NiwgLTI1MTQsIDAsIDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0QjEwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxMC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0QjExT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0czdVRkZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRCMTJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0QjExZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDMyLCAtMTIxOSwgLTc5MDcsIDM0NTRdJFs0MDIxLCAtNDY1NiwgLTQ5MTksIDE2XSRbNzUwMSwgLTQ2NzMsIC0xNDM5LCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEIxMi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRCMTNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEIxM2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HMzRFb3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0QjE0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjYiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgzIiB5PSItMTEwOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkwIiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2IiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjE5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRCMTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRCMTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0QjEtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEIxLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxLWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRCMV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEIxXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEIxX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRCMTN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEIxMy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MywgLTEyMTAsIC0zMTMsIDM1NjRdJFs5MywgLTM2ODMsIC0zMTMsIDEwOTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNEtfZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HNEtfWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNEIxZWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0S19lT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfZk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTAiIHk9Ii0zNzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItODAiIHk9Ii0zNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MyIgeT0iLTM2MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19oT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NCIgeT0iLTMzOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19oLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19pdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19pT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0S19qdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19qT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2tPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX2x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX2xPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0S19kZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRLX2R1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjIwLCAtNjYwLCAtOTk5LCAyODk1XSRbNzg3LCAtMjM0NSwgLTQzMSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0S19sLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCQzAzMEQiIHNvdXJjZT0iX0c0QjJBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0S19aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX20tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0S19uLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjQiIHk9Ii0yNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjUiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19wT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzYiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA5MyIgeT0iMzgxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRLX3NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRLX3ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S19zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfcy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRLX3VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNEtfdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNEtfdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRLX21PZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfbWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTA4LCA1MjQsIC0zNzU5LCAtMTMwM10kWy01MDgsIDE5MTMsIC0zNzU5LCA4NF0kWzExMzQsIDE5MTMsIC0yMTE2LCA4NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0S191dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIHNvdXJjZT0iX0c0QjJBT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0QjFlZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0S192LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNEtfd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRLX3Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0S191LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNEtfdk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzQ2LCAtNTMzLCAtMzEyNCwgMTE5M10kWzMwNjQsIC0xMTkzLCAtMTQwNSwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNEtfd2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRLX3d1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1QzMwRjAwMjYiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdEJyZWFrZG93blN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3WU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRVd1pPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Wi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3YWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3YS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3YmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRVd1llZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3WXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MzY2IiB5PSI1OTIzIiBoZWlnaHQ9Ijk1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0VXdkT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdmT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdmLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0VXdjZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE4OSIgeT0iMTM2OTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3Zy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNFV3aE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd2plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdqdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdqLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0VXdnZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTE0MyIgeT0iMTAzMjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNGQ2ZmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Z2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Zy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2aGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2aC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2aU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNGQ2ZXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0ZDZlLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MDg3IiB5PSIxMzE4MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0ZDZ1ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI3MzY2IiBoZWlnaHQ9IjI0MzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2dnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2d09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNndlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2d3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNnhPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRkNnR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2dC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzMzIiB5PSIyMzg3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFllZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgdmlldyBvbiBhIHByb2Nlc3MgZnJvbSBhIFdvcmsgUHJvZHVjdCBwZXJzcGVjdGl2ZSBjYWxsZWQgV1BCUyAoV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUpLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNFV3a09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNFV3Z09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRVd2xPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwODIiIHk9IjI0MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdtT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExOTgiIHk9Ii0yOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdtLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxIiB5PSIyODEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3bmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXduLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd251ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2MSIgeT0iLTk5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdvZWZYRWR1cUhvT0piVVJaUnciIHg9IjU5NyIgeT0iLTc2MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXdxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXdxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3cS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXdzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRVd3N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0VXdrZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRVd2t1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4MjAsIC04NDYsIC0xODIwLCAtODQ2XSRbLTE4MjAsIC0xOTcyLCAtMTgyMCwgLTE5NzJdJFstNjE4OSwgLTE5NzIsIC02MTg5LCAtMTk3Ml0kWy02MTg5LCAwLCAtNjE4OSwgMF0kWy0yMTkyLCAwLCAtMjE5MiwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0VXdzLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNFV3dC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk4IiB5PSIzMDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3dk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3dS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjkxIiB5PSItMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3dnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTA1IiB5PSIyOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRVd3dlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MjgiIHk9IjI5MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXd4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd4T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03NjAiIHk9Ii0yNTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3eWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3eC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNFV3emVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNFV3eS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRVd3p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0VXcwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXcwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXd6LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNFV3MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0VXcxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0VXcwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNFV3dE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0VXd0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMjIsIC0yMTEsIDIyMjIsIC0yMTFdJFs1OTgwLCAtMjExLCA1OTgwLCAtMjExXSRbNTk4MCwgLTIwODcsIDU5ODAsIC0yMDg3XSRbOTUyLCAtMjA4NywgOTUyLCAtMjA4N10kWzk1MiwgLTY4OCwgOTUyLCAtNjg4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRVdzF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2VWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRVdzEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNFV3Mk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjA5LCAtNjg4LCAtNzY4LCAzOTQyXSRbLTYwOSwgLTQxNTQsIC03NjgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNlZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZWZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNlZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENyIgc291cmNlPSJfRzRVd2NPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd2dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2V3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY5IiB5PSItNDgyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNllPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNlllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2Wk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA0IiB5PSItMjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNlp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZaLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MSIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZiT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2YmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDZjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDZidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNmVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZWLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2V09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTc1LCAwLCAzOTk2XSRbMCwgLTM3MjUsIDAsIDg0Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0ZDZpZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c0VXdnT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0ZDZlZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2ai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2amVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzQ4IiB5PSItNDQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQzIiB5PSItMjczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzcxIiB5PSI1NTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNmwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU1IiB5PSIyOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2bXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDI3IiB5PSItMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNm5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNm8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNm9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2cHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2cC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2cGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNGQ2cS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNGQ2cWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNml1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0ZDZpLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3OTQsIDg0NiwgLTcyNDcsIC0xNjQyXSRbNTI4MywgMjQ4MCwgLTM3NTksIC04XSRbNzY2MiwgMjQ4MCwgLTEzODAsIC04XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNnJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzRkNmVlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2c09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRkNnJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNGQ2cnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzksIC0zMTcsIDg5OTYsIDY0MzBdJFstNzksIC02NzczLCA4OTk2LCAtMjZdJFstNzkzOCwgLTY3NzMsIDExMzcsIC0yNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRkNnMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0ZDZ0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRkNnhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgc291cmNlPSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDZ5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNGQ2eWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNnplZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI4MSIgeT0iNzYxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNnotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjBPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1MCIgeT0iNTA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYwLWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NTgiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYxdWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NCIgeT0iLTMzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDYyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYyZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDYzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0ZDYzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0ZDYzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNGQ2NE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRkNjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0ZDY1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRkNjUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRkNjVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0ZDZ4dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRkNngtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM2ODMsIC00NzQsIC0zNjgzLCAtNDc0XSRbLTUxMTMsIC00NzQsIC01MTEzLCAtNDc0XSRbLTUxMTMsIC0yMTQyLCAtNTExMywgLTIxNDJdJFstMTc2MSwgLTIxNDIsIC0xNzYxLCAtMjE0Ml0kWy0xNzYxLCAtMTIxOSwgLTE3NjEsIC0xMjE5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzRuclVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzRVd1lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzRkNnRlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzRuclVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNG5yVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDk5LCAtNTAsIDMwMDVdJFswLCAtMjI4NiwgLTUwLCAxMjE5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5yVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzRucldPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNG5yV2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIiBzb3VyY2U9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNGQ2dGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRuclgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTkiIHk9Ii03MzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTE5IiB5PSI3MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yWi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM1IiB5PSItMjM0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBFMDIzNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzRucmF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzQwIiB5PSIyODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yYmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5yYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNG5yY2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJkZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0bnJlZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNG5yV3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0bnJXLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzM2ODMsIC0zMDQsIDM2ODMsIC0zMDRdJFs0NzMyLCAtMzA0LCA0NzMyLCAtMzA0XSRbNDczMiwgLTIxMDgsIDQ3MzIsIC0yMTA4XSRbMTI3MCwgLTIxMDgsIDEyNzAsIC0yMTA4XSRbMTI3MCwgLTEyMTksIDEyNzAsIC0xMjE5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExQzFDRTMwM0QzIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGVhbUJyZWFrZG93blN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0bnJnT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJodWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJpT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucmllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0bnJpLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0bnJmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzRucmZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE3MDkiIHk9IjY3NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0bnJrT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDgyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNG5ybWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzRucm0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRucmplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5yanVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MTcyIiB5PSIxNzg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzRucnFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0bnJxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1UtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1YtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y1dPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzRucnB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNG5ycC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI2OCIgeT0iMzY2NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0eGNpZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNqLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNrZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNrLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGNsT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0eGNodWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTkyNiIgeT0iMzY2NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0eGN4ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzQzIiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3llZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjeXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3plZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjenVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3otZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzBPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzR4Y3d1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjdy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTQzIiB5PSI2NzIyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzR4YzN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4YzZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4YzZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzR4YzItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNHhjM09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDkyIiB5PSI1MTMwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgdmlldyBvbiB0aGUgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIG9ubHkgdGhlIGtleSBjbGFzc2VzIGFuZCByZWxhdGlvbnNoaXBzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNG5ybk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhGIiBzb3VyY2U9Il9HNG5yak9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNG5yb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzRucm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0bnJvT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNG5ybmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzRucm51ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTA0MSwgLTE4NiwgLTUxNTYsIDg4MF0kWzQ0ODcsIC03NzgsIC0xNzEwLCAyODddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0bnJvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNG5ycE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNXZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIHNvdXJjZT0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJwZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNZZWZYRWR1cUhvT0piVVJaUnciIHg9IjgwNiIgeT0iMjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjWk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTQiIHk9Ii05MzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y1otZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4NCIgeT0iMzExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2F1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1IiB5PSItMzA5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNjT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzR4Y2MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y2NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjZGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzR4Y1d1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNHhjVy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTQzLCAwLCAxMTQzLCAwXSRbMjY0MSwgMCwgMjY0MSwgMF0kWzI2NDEsIDE5MTMsIDI2NDEsIDE5MTNdJFswLCAxOTEzLCAwLCAxOTEzXSRbMCwgNDQ4LCAwLCA0NDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjZk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBzb3VyY2U9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5yZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y2d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNnT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjZmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y2Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTQ1NywgMCwgMjQ4OV0kWzAsIC0yNDU1LCAwLCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c0eGNnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjaE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGNsZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0bnJqT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4Y21lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGNsdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y2wtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDQ4LCAwLCAxNDMwXSRbLTUwLCAtMTQzMCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjbk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4Y25lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjbnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIiBzb3VyY2U9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNG5ycGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y29lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0eGNvdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjcHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkiIHk9IjIzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzR4Y3FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODIyIiB5PSItMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGNyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNCIgeT0iLTE4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGNydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjci1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjkiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjdE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjc3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNHhjdU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNHhjdHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzR4Y3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGN1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGN1dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjdi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0eGN3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0eGN2dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNHhjbi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4Y29PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTMzNywgMCwgLTQ4MDksIDBdJFs0OTk1LCAwLCAtMTE1MSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c0eGMwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUY5NEFCOTAwMTUiIHNvdXJjZT0iX0c0eGN3ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0eGNoZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0eGMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNHhjMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzR4YzFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGMwdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4YzAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDk5LCAwLCAyNTk5XSRbLTUwLCAtMjY1MCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNHhjMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzR4YzJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNHhjNnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIiBzb3VyY2U9Il9HNHhjMnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNHhjaGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c0Nm1RZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM1IiB5PSI0MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1TZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtU09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1TLWZYRWR1cUhvT0piVVJaUnciIHg9IjM5MSIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1UdWZYRWR1cUhvT0piVVJaUnciIHg9IjIwNCIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1VLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1VZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1WLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1WZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1YdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bVgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bVhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c0eGM2LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzR4YzdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTMzLCAtMzE3LCAtNTUyOSwgMTEzOF0kWzEzMywgLTE2MTMsIC01NTI5LCAtMTU4XSRbNDEyOCwgLTE2MTMsIC0xNTM0LCAtMTU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzQ2bVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJDMDMwRCIgc291cmNlPSJfRzR4Y3dlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzR4YzJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1adWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2OCIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1hLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDYiIHk9IjM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1iZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzIiB5PSItMTUzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzQ2bWNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODAiIHk9IjE0NzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNDZtZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNDZtZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwRTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1mdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1mT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMERGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1ndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c0Nm1nT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNDZtWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c0Nm1ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNTM1LCAwLCA0MTU0LCAxNjE0XSRbLTU1NTYsIDAsIDEzMywgMTYxNF0kWy01NTU2LCAtMTI5NiwgMTMzLCAzMThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNDYxQzAyRjciIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdEJyZWFrZG93blN0cnVjdHVyZSAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c0Nm1oLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1pZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1pLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1qZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1qLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzQ2bWtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1rZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c0Nm1rdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c0Nm1oT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzQ2bWhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDcwNyIgeT0iOTczIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzQ2bWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzQ2bWwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c0Nm1tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYUi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWFNlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzQ2bWxPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNDZtbGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTk2IiB5PSIzMTE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVFWFYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWFctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhYT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYWXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNUVYVk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhWZWZYRWR1cUhvT0piVVJaUnciIHg9IjQwOTciIHk9IjU0NjkiIHdpZHRoPSI0OTE5IiBoZWlnaHQ9IjIxNzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNUVYcmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYcy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVh0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYdU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNUVYcXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhxLWZYRWR1cUhvT0piVVJaUnciIHg9IjUwNzEiIHk9IjExMTQyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRFplZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhIHNpbXBsaWZpZWQgdmlldyBvbiB0aGUgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUgb25seSB0aGUga2V5IGNsYXNzZXMgYW5kIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1RVhTdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c0Nm1rLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c0Nm1nLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWFR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1RVhTLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYVE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDk5LCAwLCAxNjM0XSRbMCwgLTE2MzQsIDAsIDQ5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVFWFVlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1RVhVdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVFWFktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyIgc291cmNlPSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVFWFUtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1RVhaLWZYRWR1cUhvT0piVVJaUnciIHg9IjQxNyIgeT0iMTA2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhhLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwNyIgeT0iNjgzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI2MSIgeT0iNzk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MjciIHk9IjI5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzgiIHk9Ii0yODIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYZS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhmLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1RVhoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhnLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNUVYWk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1RVhaZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI0NjAsIC04MCwgMjQ2MCwgLTgwXSRbNDk3NCwgLTgwLCA0OTc0LCAtODBdJFs0OTc0LCAyNDA3LCA0OTc0LCAyNDA3XSRbMTU4NywgMjQwNywgMTU4NywgMjQwN10kWzE1ODcsIDEwODUsIDE1ODcsIDEwODVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWGl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMzgiIHk9Ii0zMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYanVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjkiIHk9IjI1OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWGtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI5IiB5PSItMzEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWGstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhsT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04MTMiIHk9IjE2NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1RVhsLWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MyIgeT0iNzM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWG5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWG11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWG9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWG51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVhvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYb3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNUVYcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYcHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWGgtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYaU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTgzNywgMTA4MywgLTE4MzcsIDEwODNdJFstMTgzNywgMjM2MiwgLTE4MzcsIDIzNjJdJFstNDAyMSwgMjM2MiwgLTQwMjEsIDIzNjJdJFstNDAyMSwgLTIzNywgLTQwMjEsIC0yMzddJFstMjQ1NSwgLTIzNywgLTI0NTUsIC0yMzddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNUVYdWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNUVYcWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVFWHZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjEiIHk9Ii02NDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYd2VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iMTk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzMiIHk9Ii03NDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNUVYeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVh5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA3IiB5PSItMjAyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk4IiB5PSIxMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWHp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWHotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWHplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVgwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVFWDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVFWDAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVFWDBlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1RVgxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JUWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNUVYMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNU9JUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVFWHV1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNUVYdS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAxMDc1LCAtMTYwLCAtNDAwNF0kWy0yNjIsIDQ1ODgsIC0xNjAsIC00OTFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNU9JUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HNUVYVS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNU9JUi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1T0lTT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MiwgLTEwOTIsIC05MywgMTg1NF0kWy00MiwgLTI0NTUsIC05MywgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNU9JVC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNUVYcWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNDZtay1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lVLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNU9JVU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1T0lVZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzODAsIC0xNiwgMTIyNywgODAwOV0kWzcxMjgsIC0xNiwgNjk3NiwgODAwOV0kWzcxMjgsIC04MDg1LCA2OTc2LCAtNTldJFsxMTU5LCAtODA4NSwgMTAwNywgLTU5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNU9JVnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVPSVYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNDk0NjAzMUUiIHR5cGU9IkNsYXNzIiBuYW1lPSJXb3JrQnJlYWtkb3duU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JV09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSVhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSVotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSVdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JV3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTk0IiB5PSI2NTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0liZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSWFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JYXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTYyIiB5PSI0MzI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVPSWgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVPSWVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNU9JZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDMwIiB5PSI2NjM4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JaU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVPSWpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NTkiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0lqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Ja09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Ja3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JbC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JaWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0lpdWZYRWR1cUhvT0piVVJaUnciIHg9IjMyMDAiIHk9IjY2OTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0ltT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNU9Jbk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVPSW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1T0luLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1T0lwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNU9JcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNU9JcC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNU9JbWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1T0ltdWZYRWR1cUhvT0piVVJaUnciIHg9IjMzODYiIHk9IjE1MzIiIHdpZHRoPSI1OTI2IiBoZWlnaHQ9IjEwMDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNVhTUGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjIxOCIgaGVpZ2h0PSI4NDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1WFNPdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ5NyIgeT0iNDM1MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1WFNjT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU2UtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVYU2JlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTYnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MjgzIiB5PSI4NjUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTanVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzVYU2t1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NjIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2stZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1WFNtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTbmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNVhTai1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNrT2ZYRWR1cUhvT0piVVJaUnciIHg9IjkxNjUiIHk9IjY1NjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbFFEWi1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBpcyBhIHNpbXBsaWZpZWQgcmVwcmVzZW50YXRpb24gb2YgYSBXQlMgb25seSBzaG93aW5nIGtleSBlbGVtZW50cyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU01PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzVPSWFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU05lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNOdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTTk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU01lZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTTXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDQ4LCAyNTQsIDIyOTRdJFswLCAtMjI0MywgMjU0LCA0OTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNOLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTT09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNTZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiIHNvdXJjZT0iX0c1T0ltT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzAiIHk9Ijc5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNVZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yODciIHk9Ii0yNjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTVk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1WFNWLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NSIgeT0iLTE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNXZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTV3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVYU1ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVYU1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTWmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNVhTYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNVhTYWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU1N1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTUy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjk2MywgLTEwMSwgLTIyMCwgLTI4NDRdJFstMzU5OCwgLTEwMSwgLTg1NSwgLTI4NDRdJFstMzU5OCwgMjMxOSwgLTg1NSwgLTQyM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFNmT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyQTAiIHNvdXJjZT0iX0c1T0lpT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNPZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU2dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFNmZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU2Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTM4MSwgLTQ0OCwgMjI4LCAxODM3XSRbLTM4MSwgLTE4NjIsIDIyOCwgNDIzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTZy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNVhTaGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HNU9JZU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNVhTT2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU2ktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1WFNpZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNVhTaHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1WFNoLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzU1NiwgLTMxOCwgLTY2MSwgMTk1OF0kWzU1NiwgLTE5NTgsIC02NjEsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU2pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNqZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU251ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzVYU2p1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU28tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTb3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU24tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTb09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzY0LCA0NDgsIDE5NzIsIC0xNjg0XSRbLTM2NCwgMTYzNCwgMTk3MiwgLTQ5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3BlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3AtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSW1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3FPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTcWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNTM0LCAtMzE4LCAyNzc4LCA2NjQxXSRbMTUzNCwgLTY0ODIsIDI3NzgsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3J1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFNyLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRzVYU09lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVYU2JPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFNzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTdE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3NlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTc3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MjYsIDMxOCwgLTMyMDIsIC0zOTk1XSRbOTI2LCAxMzIzLCAtMzIwMiwgLTI5OTBdJFsyMzI4LCAxMzIzLCAtMTgwMCwgLTI5OTBdJFsyMzI4LCAzOTk1LCAtMTgwMCwgLTMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzVYU3QtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN1T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVYU3VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRzVPSVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVPSWFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVYU3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNVhTdmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVYU3V1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNVhTdS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDA2LCAtNDU3LCAzNTUsIDE3NzhdJFstNDA2LCAtMTc4NiwgMzU1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN3T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTd2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1WFN3dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0c1T0lXT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1WFNiT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1WFN4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNVhTeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVYU3h1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c1WFN3LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzVYU3hPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMxNywgMzE3LCAtMzk3LCAtMTc3M10kWy0zMTcsIDE3NzIsIC0zOTcsIC0zMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c1WFN5ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNVhTeXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE1ODBGMDBDNCIgdHlwZT0iQ2xhc3MiIG5hbWU9IkRlc2NyaXB0b3JSZWxhdGlvbnNoaXBzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhETS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfRzVoRE1lZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4IiBkZXNjcmlwdGlvbj0ie1JvbGVEZXNjcmlwdG9yLm1vZGlmaWVzID0gUm9sZS5wZXJmb3Jtc0FzT3duZXIub3V0cHV0IHVuaW9uIFJvbGUucGVyZm9ybXNBZGRpdGlvbmFsbHkub3V0cHV0IHVuaW9uIFJvbGUuYXNzaXN0c0luLm91dHB1dH0iIGxpbmVDb2xvcj0iMCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNWhETXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc3MSIgeT0iMjM3OSIgd2lkdGg9IjU1MDMiIGhlaWdodD0iMTc1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRE5lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1aERPZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhET3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVoRFF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERST2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1aEROdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVoRE4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzMzMjQiIHk9IjU3NDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNWhEU2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVoRFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1aERUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNWhEVWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1aERVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOSWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNWhEUnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1aERSLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MTcwIiB5PSIxNTEzOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1cU5KdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5LdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5MT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5MdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5NT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5NZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c1cU5JLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5OTEiIHk9IjQ2MjIiIHdpZHRoPSI0NDQ1IiBoZWlnaHQ9IjM4NjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNXFOV2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5YdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5ZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5ZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOWk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNXFOVnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5WLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2ODgyIiB5PSI4NzIwIiB3aWR0aD0iNDQ0NSIgaGVpZ2h0PSI0ODE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzV6LVdPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3NTkiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1XZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LVktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzV6LVZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotVnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkyIiB5PSIxMDI2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c1ei1hT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1hdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzV6LVplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotWnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTc4IiB5PSI0MjkyIiB3aWR0aD0iNjUxMCIgaGVpZ2h0PSIzOTIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xRRGFlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byBhbGwgRGVzY3JpcHRvciB0eXBlcyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UsIHRoZWlyIGF0dHJpYnV0ZXMgYW5kIGFzc29jaWF0aW9ucy4gIFdlIHNlZSB0aGF0IGVhY2ggRGVzY3JpcHRvciB0cmFjZXMgYmFjayB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgdGhleSByZWZlciB0by4gIERlc2NyaXB0b3JzIGFsc28gZGVmaW5lIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zIHRoYW4gdGhlIGFzc29jaWF0aW9ucyBkZWZpbmVkIGFtb25nc3QgdGhlIGNvcmUgY29udGVudCBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBFeHRlcm5hbCBJbnB1dHMgYmV0d2VlbiBUYXNrcyBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFyZSBub3QgZGVmaW5lZCBpbiBDb3JlIE1ldGhvZCBDb250ZW50LCBiZWNhdXNlIGl0IGV4cHJlc3NlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcyBhbmQgbm90IGF2YWlsYWJsZS9rbm93biBmb3IgbWV0aG9kIGNvbnRlbnQuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5NdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiIHNvdXJjZT0iX0c1aEROZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5OLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOT09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzVxTk51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5PdWZYRWR1cUhvT0piVVJaUnciIHg9IjQiIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5QT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDY2IiB5PSItMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5RT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMCIgeT0iMTI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5RLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSIzNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOUnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOU3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5VT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5UdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5WT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5VdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOTS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5OT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODc5LCAtMjUsIDQxMTQsIC0yNzldJFstMzc3NiwgLTI1LCAyMjE4LCAtMjc5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTlplZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5hZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTciIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOYmVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODk1IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5jZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOY09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MjIiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOYy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzUiIHk9IjE5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5kZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5kdWZYRWR1cUhvT0piVVJaUnciIHg9IjgzNSIgeT0iLTIzMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOZmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5nLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5nZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1cU5oLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5oZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXFOWnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1cU5aLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIC0xNDIyLCAtNzg5MCwgMzE0OV0kWzg2NTIsIC0xNDIyLCAtMTQ1NiwgMzE0OV0kWzg2NTIsIC0yNjQxLCAtMTQ1NiwgMTkzMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1cU5pT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiIHNvdXJjZT0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXFOak9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIxNSIgeT0iLTMyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5rZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5rT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTIwIiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOay1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE1OCIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1cU5sdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3ODMiIHk9Ii0xMzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFObXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFObWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODE3IiB5PSIxMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTm51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTm5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5uLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTm9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzVxTm91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTm9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5vLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXFOcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTmllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOaXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCAxODk2LCAtNzg5MCwgNjQ2OF0kWzExNzE3LCAxODk2LCAxNjA4LCA2NDY4XSRbMTE3MTcsIC0yNjQxLCAxNjA4LCAxOTMwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzVxTnEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTkl1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU5zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c1cU5yLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0yNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXFOcy1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM2MyIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjEyIiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXFOdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1cU51dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIzNiIgeT0iNDMzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzVxTnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzVxTnZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjI2IiB5PSIxMTEwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LUtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LUp1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1LZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzVxTnJPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXFOcmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMjE4LCA1OSwgLTc4OTAsIDQ2MzFdJFs5Nzg3LCA1OSwgLTMyMSwgNDYzMV0kWzk3ODcsIC0yNjQxLCAtMzIxLCAxOTMwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzV6LU1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCIgc291cmNlPSJfRzVoRFJlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LU9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iODIiIHk9Ii00MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1QT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MCIgeT0iNTc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1QLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjciIHk9Ii0yMzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotUi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotUmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotU2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1UdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1ULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1UZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei1VLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1VZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotTXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1ei1NLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzNSwgLTU1OCwgODQsIDQwMTNdJFsxMzUsIC0yMTY3LCA4NCwgMjQwNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1ei1kT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjAiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNXotZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA3MyIgeT0iMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1IiB5PSIyNzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1mLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MCIgeT0iLTg2NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1nZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE1NiIgeT0iLTM1OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1oT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1oZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzEiIHk9Ii0xMTU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzV6LWp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LWpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1qLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXota2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXota3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXota09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzV6LWRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNXotZHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNTE0LCAtMTk1NSwgMjUxNCwgLTE5NTVdJFsyNTE0LCAtMzUyMiwgMjUxNCwgLTM1MjJdJFstOTIyLCAtMzUyMiwgLTkyMiwgLTM1MjJdJFstOTIyLCAtMTk1NSwgLTkyMiwgLTE5NTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNXotbC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzV6LW0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OSIgeT0iLTgzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1uLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04MTkiIHk9Ii00NDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LW8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1vdWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSIzMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei1wdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk5IiB5PSItMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzV6LXFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkxIiB5PSIzNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotcXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNXotc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNXotc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNXotci1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzV6LXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1ei10T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1ei10ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1ei1zLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZJZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNXotbU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1ei1tZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNzAwLCAtMTk1NSwgLTI3MDAsIC0xOTU1XSRbLTI3MDAsIC0yNjc1LCAtMjcwMCwgLTI2NzVdJFstNzM4MiwgLTI2NzUsIC03MzgyLCAtMjY3NV0kWy03MzgyLCAtODU1LCAtNzM4MiwgLTg1NV0kWy0zMjUxLCAtODU1LCAtMzI1MSwgLTg1NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZKT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Si1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2S09mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjIiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2TE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4MiIgeT0iLTM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dkwtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDQwIiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dk11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTY0MCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZOZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1NSIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE4OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dk9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dk91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dk9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dlB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dlBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2UXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2UnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Uk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dkplZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2SnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIxOCwgNDU3LCAxNTU2MSwgNzYyXSRbLTE0NTI4LCA0NTcsIDMyNTEsIDc2Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZSLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c1cU5JdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2U3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2Uy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NzAiIHk9Ii0yNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4MiIgeT0iLTMyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZVdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zODIiIHk9IjI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2VmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMyIiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dldPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc2IiB5PSIyODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2V3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2WGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Vy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2WWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2WC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2YU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZaLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2U09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZTZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjE4LCAtMTEwMCwgMTU1NjEsIC03OTVdJFstMTQ1MjgsIC0xMTAwLCAzMjUxLCAtNzk1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzU5dmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0c1aERNT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1OXZSLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkNvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2YS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzU5dmJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTEwLCA4NzIsIC0yMDMsIC0xMzI5XSRbMzEzLCAyMjAxLCAwLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNTl2YmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzU5dmJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNTl2Yi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5IiBzb3VyY2U9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzU5dmMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI5IiB5PSItMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dmQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ3NiIgeT0iMTk1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ZXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDU5IiB5PSItMTE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2ZmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTgiIHk9Ii0yOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Zi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Z2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Z09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNjA3IiB5PSIyNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2Z3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2aGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2Zy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2aWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2aC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZpLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2anVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2a09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c1OXZrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZqLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNTl2Y09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c1OXZjZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyMTgsIDE5NTUsIC01NDUyLCAtMjkyMV0kWzIyMTgsIDM2OTksIC01NDUyLCAtMTE3Nl0kWzU0NTIsIDM2OTksIC0yMjE4LCAtMTE3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c1OXZrdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiIHNvdXJjZT0iX0c1ei1aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c1cU5WZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNTl2bHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjciIHk9Ii0yNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2bXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI5OSIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwMTkiIHk9IjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2bi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dm9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5MyIgeT0iLTE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c1OXZvLWZYRWR1cUhvT0piVVJaUnciIHg9IjUwNCIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzU5dnJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzU5dnF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c1OXZyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNTl2ci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2c09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2cnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzU5dnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNTl2dE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNTl2c3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzU5dmstZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNTl2bE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjY0NiwgMTk1OCwgLTEwMzE4LCAtMjkxMF0kWy0yNjQ2LCA1ODIxLCAtMTAzMTgsIDk1M10kWzU0NTAsIDU4MjEsIC0yMjIyLCA5NTNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNkc1RU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIiBzb3VyY2U9Il9HNXFOVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1RmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZHNUZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxMCIgeT0iMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4MjMiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzNiIgeT0iLTMxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjM3IiB5PSIyMDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1SWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MyIgeT0iOTc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNUt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNUtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1TE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1TXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1TU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZHNUVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1RXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjIyMiwgMzE4LCA1NDUwLCA1MTg2XSRbLTkwNDgsIDMxOCwgLTEzNzYsIDUxODZdJFstOTA0OCwgLTI5MTAsIC0xMzc2LCAxOTU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZHNU0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiIgc291cmNlPSJfRzVxTlZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzV6LVpPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2RzVOLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNDMiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVPLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDYyIiB5PSIyNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVQdWZYRWR1cUhvT0piVVJaUnciIHg9IjMyNyIgeT0iLTIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1UWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDAzIiB5PSIxODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Uk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2NTYiIHk9IjEwMjQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1U2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Ui1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNkc1VGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1Uy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVULWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVWZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVVLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNkc1Tk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2RzVOZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjE4LCA4LCA1NDUyLCA0ODg1XSRbLTc5OTIsIDgsIC0zMjEsIDQ4ODVdJFstNzk5MiwgLTI5MjEsIC0zMjEsIDE5NTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNkc1VnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBzb3VyY2U9Il9HNXotVk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNXotWk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2RzVXdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0RBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNkc1WHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjE3IiB5PSI0MjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVZZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjYiIHk9Ii0xMTcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1WmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVaT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzNiIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVaLWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NCIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzViT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVhdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1YmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzViLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2RzVjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2RzVidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNkc1Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZHNWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2RzVkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZHNWVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZHNWR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2RzVWLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNkc1V09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTY3LCAtNjg1OCwgNDAwNF0kWzMzLCAtMjI5NCwgLTY4MjQsIDIyNzddJFszNTk4LCAtMzQ5NiwgLTMyNTksIDEwNzVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTFDNENDNTAyNjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yUmVsYXRpb25zaGlwcyAoc2ltcGxpZmllZCkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2UXFGT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFHT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFHdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcUhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFILWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2UXFFZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcUV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3MDUiIHk9IjI0OTciIHdpZHRoPSIzMjM0IiBoZWlnaHQ9IjEyMDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNlFxSk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxS09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNlFxSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2UXFJdWZYRWR1cUhvT0piVVJaUnciIHg9IjYwMSIgeT0iMjM3MCIgd2lkdGg9IjQ3OTIiIGhlaWdodD0iMTc2MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2UXFldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJFdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYkUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJGT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJGZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2UXFkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZRcWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODc3OSIgeT0iNjMyNCIgd2lkdGg9IjMzNjkiIGhlaWdodD0iMTc3OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dsWk5VZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gcHJvdmlkZXMgYSBzaW1wbGlmaWVkIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgRGVzY3JpcHRvciB0eXBlcyBkZWZpbmVkIGluIHRoaXMgUHJvY2VzcyBwYWNrYWdlIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIG5vdCBzaG93aW5nIGNsYXNzIGF0dHJpYnV0ZXMgb3IgYXNzb2NpYXRpb24gcm9sZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2UXFNT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiIHNvdXJjZT0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjciIHk9IjI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFPT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTI0IiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcU8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA5IiB5PSItNDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNlFxU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFUT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFVT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNlFxTWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2UXFNdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjE3LCA5MywgMTI3MDgsIC01OV0kWy0xMTkyOSwgOTMsIDIzOTYsIC01OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2UXFVLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiIHNvdXJjZT0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNlFxVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxODIiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFXLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjYiIHk9Ii01MjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNlFxWHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzk1IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA1MCIgeT0iLTEwMDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcVpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFaLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2UXFiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2UXFhLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNlFxYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZRcWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2UXFkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZRcWRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZRcWMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2UXFWT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZRcVZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ2NSwgLTYwMSwgMTM4NTksIC03NTNdJFstNDY1LCAtMTkzMCwgMTM4NTksIC0yMDgyXSRbLTEzOTYxLCAtMTkzMCwgMzY0LCAtMjA4Ml0kWy0xMzk2MSwgLTcyOCwgMzY0LCAtODgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYkZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTIyIiB5PSIyNjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODI3IiB5PSI5MDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjcwOSIgeT0iMjEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiTE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiS3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYkxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiTHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYk1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJNdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJOdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiRi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJHT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIC04MjEsIC01MTczLCAzMjkzXSRbNTQ2OSwgLTgyMSwgLTEzODgsIDMyOTNdJFs1NDY5LCAtMzUxMywgLTEzODgsIDYwMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2YWJPZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzM0YiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFFT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmFiUGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDAiIHk9IjI5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJRZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDI0IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJSLWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTQiIHk9Ii0xNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiU2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJUdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJUZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJVZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYlctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYldlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJPdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYk8tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY4NCwgNjYwLCAtNTE3MywgNDc3NV0kWzgwODUsIDY2MCwgMTIyNywgNDc3NV0kWzgwODUsIC0zNTEzLCAxMjI3LCA2MDFdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFiWE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzUzIiBzb3VyY2U9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxRU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYllPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg5NSIgeT0iMzg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYlplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYlpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMzciIHk9Ii05NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiWi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJhdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk4NSIgeT0iMzkxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJiZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiY09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmFiZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJldWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJlT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJmT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiWGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJYdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2ODQsIC0xMTgsIC01MTczLCAzOTk2XSRbNTgzMywgLTExOCwgLTEwMjQsIDM5OTZdJFs2NTQ0LCAtNTksIC0zMTMsIDQwNTVdJFs2NTQ0LCAtMzUxMywgLTMxMywgNjAxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZhYmYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSIgc291cmNlPSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2YWJnLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTgiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiaC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk2IiB5PSItNjc3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiaS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYml1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmFiamVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTMiIHk9Ii0yMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFiai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYmtPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJsZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJrLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2YWJtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFibXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZhYm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZhYm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2YWJnT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZhYmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYzNCwgODgwLCAtNTgzMywgLTMwODFdJFsxNjM0LCAxODcxLCAtNTgzMywgLTIwOTFdJFs2NzIyLCAxODcxLCAtNzQ1LCAtMjA5MV0kWzY3MjIsIDMwNzMsIC03NDUsIC04ODldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNmFib3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIiBzb3VyY2U9Il9HNlFxSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNlFxZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmFicC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZhYnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZhYnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNiIgeT0iLTI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2YWJxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2YWJxdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzE2IiB5PSItMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTE5IiB5PSItMzEzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxDT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsQy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsRWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxFLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxGLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmFiby1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2YWJwT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xOTQ3LCA4ODAsIC05NDE0LCAtMzA4MV0kWy0xOTQ3LCA0NDYxLCAtOTQxNCwgNDk5XSRbMTM1LCA0NDM2LCAtNzMzMiwgNDc0XSRbNTc4MiwgNDQzNiwgLTE2ODQsIDQ3NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2amxHdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIHNvdXJjZT0iX0c2UXFkdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2UXFJT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmpsSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjczIiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsSXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIwMyIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsS09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUzIiB5PSIxODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbEstZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxOT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxNdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbE4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbE9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZqbFBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZqbE91ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2amxHLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZqbEhPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE2ODQsIC0zMzgsIDU3ODIsIDM2MjNdJFstODM4MiwgLTMzOCwgLTkxNCwgMzYyM10kWy04MzgyLCAtMzA4MSwgLTkxNCwgODgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZqbFBlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFBMDA0QiIgc291cmNlPSJfRzZRcWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZRcUlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2amxRZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MDMiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxSZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NzUiIHk9Ii0yMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxTLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzMCIgeT0iMjExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyODEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxUdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjk1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNmpsVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2amxYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2amxYZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNmpsUHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2amxQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDczLCAtODg5LCA1OTk0LCAzMDczXSRbLTE0NzMsIC0xMjYxLCA1OTk0LCAyNzAwXSRbLTY5NTksIC0xMjYxLCA1MDgsIDI3MDBdJFstNjk1OSwgLTMwODEsIDUwOCwgODgwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFNzkwNTQwMjI1IiB0eXBlPSJDbGFzcyIgbmFtZT0iQWN0aXZpdHkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2amxaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI2ODkxIiBoZWlnaHQ9IjI0MjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNmpsWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbFotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2amxhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZqbGJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNmpsYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V0FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZqbFllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNmpsWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzE0IiB5PSIxNTgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V0J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXRWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNnRXQS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdCT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY2MjkiIHk9IjcyNzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdOZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNnRXT2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY1OSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdST2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdOdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V04tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgwNiIgeT0iOTEwMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1R1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdVdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdXT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V1ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdYZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2dFdULWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V1VPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjE0NiIgeT0iOTEwMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1otZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2dFdhLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjUwIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdiT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXY09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXZE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V2R1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V2FPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODE5IiB5PSI1MDM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzZ0V2plZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2xlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNnRXbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V21PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzZ0V2l1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2Njg4IiB5PSI1MDcyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xaTlUtZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBrZXkgYXR0cmlidXRlcyBhbmQgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciBBY3Rpdml0eSBpbiB0aGUgUHJvY2VzcyBCcmVha2Rvd24gcGFja2FnZS4gIE9uZSBjYW4gc2VlIHRoYXQgdGhlIGNvbmNlcHRzIG9mIFBoYXNlIGFuZCBJdGVyYXRpb24gaGF2ZSBiZWVuIGRlZmluZWQgYXMgc3BlY2lhbCBBY3Rpdml0aWVzLiAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V0V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzZqbFlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdGdWZYRWR1cUhvT0piVVJaUnciIHg9Ii03NDkiIHk9IjE1OTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXR3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDc5IiB5PSItMjQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HNnRXSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTM5IiB5PSIxNjkyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdJT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzNiIgeT0iMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQxNCIgeT0iLTM0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdKdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2dFdMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c2dFdLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V01PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzZ0V05PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzZ0V011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdFLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V0ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg1MiwgMTA1OCwgMzcwNCwgLTM4OTBdJFsxODUyLCA1MDAxLCAzNzA0LCA1M10kWy05MjYsIDUwMDEsIDkyNiwgNTNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HNnRXTmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXUnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V1ItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMwNCwgLTQ1NywgOTE0LCAxMzcxXSRbLTkyMiwgLTEzODAsIDI5NiwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXVE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1RlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXWHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HNnRXVHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdZdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXWC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V1lPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzA0LCAtNDU3LCAtOTY1LCAxMzcxXSRbOTQ4LCAtMTM4MCwgLTMyMSwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V1p1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HNnRXZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HNnRXQXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNnRXWi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2dFdlLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HNnRXZU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c2dFdlZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTMsIDUzLCAyNTEzLCAyMjc2XSRbLTQ0NDUsIDUzLCAtOTc5LCAyMjc2XSRbLTQ0NDUsIC0xOTA1LCAtOTc5LCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdmdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNnRXZi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c2dFdnT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c2dFdaLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2amxZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFdoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNnRXaHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzZ0V2hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c2dFdnZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzZ0V2d1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTI3LCAtNDQ4LCAtNTY2NCwgMjI5NF0kWzEyNywgLTI2MjQsIC01NjY0LCAxMThdJFsyMzQ1LCAtMjYyNCwgLTM0NDUsIDExOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzZ0V2gtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2dFdpT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzZ0V21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRzZ0V0F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzZ0V2llZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzZ0V251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2dFduLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNnRXbmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzZ0V211ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HNnRXbS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNSwgLTQ1NywgLTEwOTIsIDE3MjddJFsyNSwgLTE2NjcsIC0xMDkyLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c2MmY4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNjJmOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MkQ0MDA3RSIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uQW5kQnJlYWtkb3duIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI1NDAyMjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HNjJmOXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTE2NCIgaGVpZ2h0PSIyMDY1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmYtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJmLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZi0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmZfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZl9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmZfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZl8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdBT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdBZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c2MmY4LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzYyZjlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU4MDciIHk9IjExODcwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ0J1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjczODIiIGhlaWdodD0iMTE4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnQ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnRWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnQS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdCT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUxOTgiIHk9IjExODUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzYyZ0Z1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTEwMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c2MmdILWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNjJnRS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c2MmdGT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjMwIiB5PSIxNTMyNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0l1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdKdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzE4IiBoZWlnaHQ9IjE2MjUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0xPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ0x1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ01lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ0ktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0Njk5IiB5PSIxNTI5MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ011ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdOdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjc1IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ00tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnTk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzYyIiB5PSIxNTI5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1F1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c2MmdSdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjM1IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNjJnUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c2MmdTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNjJnVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzYyZ1VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzYyZ1VlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzYyZ1EtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNjJnUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTY4IiB5PSIxNTI5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUThPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVE5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjE1MjQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FROWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVEtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FRX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUV91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUV8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUThlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUTh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTczMzkiIHk9IjUwODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg0NCIgaGVpZ2h0PSIxMDY2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSQ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSRC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FSQWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzM2MCIgeT0iOTM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSR2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdBUkhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5OTciIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJKdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSSi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSS09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN0FSR3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJHLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc3NDciIHk9IjUzODQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN0FSTGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNjg3NCIgaGVpZ2h0PSIyNTA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUk51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJPT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3QVJLdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUkstZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTc1NyIgeT0iNzg0MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3QVJQZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTU3IiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0FSUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdBUk91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxODkzMSIgeT0iODUzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0I5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0I5dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NzA3IiBoZWlnaHQ9IjE1NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tCOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0ItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0ItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQl9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQl91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tCXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0FlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQjgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQjlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY4NSIgeT0iMjkyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAzMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0NHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxOTMwIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDSWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdLQ0ktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQ0ZlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDRnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzAyNyIgeT0iMTUzNDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGUgYSBnZW5lcmFsIG92ZXJ2aWV3IHRvIHRoZSB0YXhvbm9teSBkZWZpbmVkIGluIFByb2Nlc3MgQnJlYWtkb3duIHByZXNlbnRpbmcgdGhlIHR3byBrZXkgYWJzdHJhY3Rpb25zIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGFuZCBCcmVha2Rvd24gRWxlbWVudCB3aXRoIHRoZWlyIG1vc3QgaW1wb3J0YW50IHN1Yi1jbGFzc2VzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBzb3VyY2U9Il9HN0FROE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FSQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSRWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJFdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NjIsIC03NzAsIDM1NTYsIDM1OThdJFstMzc5MywgLTM4MzUsIDUyNCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSRi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUkdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSU2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HN0FSS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUlRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY1IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzU4IiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJWT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3NiIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSVi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MjkiIHk9Ii0yNjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN0FSV3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItODgiIHk9IjM1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJYdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJYZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3QVJZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3QVJZZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUlotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUlplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdBUmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdBUmFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJTdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSUy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNDM3LCAwLCAtNzA3OCwgMF0kWzk3MjgsIDAsIC03ODcsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSYk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HN0FST2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJmOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSY2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSYmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJidWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTgsIDU1MCwgMTIwMiwgLTMyNTldJFstMTE4LCAyNzY4LCAxMjAyLCAtMTA0MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJkT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdBUmRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRzdBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUThPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0FSZWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdBUmR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSZC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4LCAtNTU4LCA2MTgsIDI2OTJdJFs4LCAtMjQ4OSwgNjE4LCA3NjJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJmT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJmdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJHZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJmLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdBUmdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTAsIC0xMjUzLCAwLCAxODk2XSRbNTAsIC0yNTkwLCAwLCA1NThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3QVJoZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3QVJoLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTIzQjAwMDIiIHNvdXJjZT0iX0c2MmdFdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmY4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3QVJqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSamVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdBUmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3QVJpT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0FSaWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5MTQsIC01NTgsIC00MDY0LCAyMzg3XSRbMzIwMCwgLTE5MTMsIC0xNzc4LCAxMDMyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0FSanVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdBUmotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN0FSa09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HNjJnRXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HNjJnQXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0FSbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdBUmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3QVJsT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN0FSa2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3QVJrdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTAwLCAtNTUwLCAzNDIwLCAyODUzXSRbLTExMDAsIC0yODE5LCAzNDIwLCA1ODRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0I4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tCOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NBdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIHNvdXJjZT0iX0c3QVJHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3S0I4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ0J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NBLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDQk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2OTQsIC01NjcsIC0yMDk5LCAxNjY3XSRbMTgwMywgLTE0NTYsIC05OTAsIDc3OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0NlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NDdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0MtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfRzdLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUkFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0VPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0RPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDRGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5NTYsIC03ODcsIC0xNzg2LCAxNDQ3XSRbMjA3NCwgLTE3MDEsIC02NjgsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0V1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NFLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzdLQ0ZPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0plZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NKdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01NjcsIDAsIDIzNzldJFswLCAtMTkxMywgMCwgMTAzMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ0stZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NMT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ0xlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzIzMDE5QSIgc291cmNlPSJfRzYyZjh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NNLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDTWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ0x1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3S0NMLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNDk3LCAtMTA0MSwgNjY5NywgMjc2OF0kWy02MTQ2LCAtMjU1NiwgMzA0OCwgMTI1M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ05PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NOZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdLQ051ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzYyZ0F1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdBUktlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ08tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NQT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdLQ04tZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDT09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI3LCAtNTkyLCAtNDMxLCAyNzYwXSRbLTEyNywgLTIwOTksIC00MzEsIDEyNTNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NQZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NQLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIHNvdXJjZT0iX0c2MmdJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NRT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ1FlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM1LCAtODEyLCAtMTg5NiwgMjg0NF0kWzEzNSwgLTMwNjQsIC0xODk2LCA1OTJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NSdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDUi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NTT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0UiIHNvdXJjZT0iX0c2MmdRdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3QVJLZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1RPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NTZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN0tDU3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC00NzcsIC01MTA2LCA2NDAyXSRbLTI2LCAtMzM2MSwgLTUxMDYsIDM1MThdJFszNTQ2LCAtNTgyMSwgLTE1MzQsIDEwNThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NULWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN0tDVU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3S0NVZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c2MmdNdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c2MmdBdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3S0NVdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdLQ1UtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjcsIC01NTAsIDE2OTMsIDI4NTNdJFs2NywgLTI4MTksIDE2OTMsIDU4NF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdLQ1dPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3S0NXZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0U4QzgwMDU2IiB0eXBlPSJDbGFzcyIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3S0NYdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3S0NYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN0tDWWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDWS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdLQ1p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN0tDWi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdLQ1ctZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN0tDWE9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NjYxIiB5PSI3MTcxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTDV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEw1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RMNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTDhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdUTDQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTDVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODg5OCIgeT0iNDQ4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdUTDl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VEwtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VEwtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VExfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RMX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VExfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNQWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RMOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VEw5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg4MDUiIHk9IjUyNDAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1DLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RNRC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM4NiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1FdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1GT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1GdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1HT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNR3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN1RNRE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTUiIHk9IjI5ODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN1RNS09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzU4OSIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1LdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1MT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1MdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTUwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1NT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdUTU1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1NdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1NLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3VE1KZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1KdWZYRWR1cUhvT0piVVJaUnciIHg9Ijg1NjgiIHk9IjI5NjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIHRoZSBnZW5lcmFsIGRlZmluaXRpb24gb2YgUHJvY2VzcyBFbGVtZW50LiAgUHJvY2VzcyBFbGVtZW50IGlzIGRlcnJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgZGVmaW5lIGluIENvcmUgTWV0aG9kIENvbnRlbnQuICBKdXN0IGxpa2UgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gZm9yIG1ldGhvZCBjb250ZW50IFByb2Nlc3MgRWxlbWVudCBjb250YWlucyBhIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBjYW4gY29tcHJvc2Ugb2YgYSBudW1iZXIgb2YgYXR0cmlidXRlcyBjb250YWluaW5nIHRleHR1YWwgZGVzY3JwdGlvbnMgZm9yIHRoZSBQcm9jZXNzIEVsZW1lbnQuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1BdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIHNvdXJjZT0iX0c3S0NXdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VEw4dWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1CLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNQ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTUJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3VE1BLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTUJPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDU3LCAwLCAxNDczXSRbLTUwLCAtMTQ4MSwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNQ2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTUN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNRy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBzb3VyY2U9Il9HN1RNQy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RMNHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTUllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1ILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNSE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1IZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIC03ODIzLCAyMDE1XSRbMCwgLTE0MzksIC03ODIzLCAxMTAwXSRbNjQwMCwgLTIzNDUsIC0xNDIyLCAxOTRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1JdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNSS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3VE1OT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0c3VE1DLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3VE1KT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1PZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdUTU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1PLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1QZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1QT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMyIgeT0iMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1RT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDYiIHk9Ii0yODkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdUTVF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDAiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1ST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDkiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNU09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN1RNVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN1RNVE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1VZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1VdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1VT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3VE1WdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3VE1WT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNTmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN1RNTnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjkzLCAtMjUsIC02MTgwLCAyNV0kWzYwNzksIC0yNSwgLTE3OTQsIDI1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdUTVYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzJCMDFDQSIgc291cmNlPSJfRzdUTUpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdUTDR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1XdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3VE1YZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN1RNVy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdUTVdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdUTVdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNDkxLCAwLCAxOTk4XSRbLTUwLCAtMTk3MiwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN1RNWHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN1RNWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDQzEwMzFFIiBzb3VyY2U9Il9HN1RMOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN1RNSk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN1RNWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdUTVp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3VE1aT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN1RNWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3VE1ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgsIC00NDgsIC00MiwgMTc4Nl0kWzgsIC0xNzUyLCAtNDIsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdUTVotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3VE1hT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFQTEwMjg1IiB0eXBlPSJDbGFzcyIgbmFtZT0iU2VsZWN0ZWRUYXNrU3RlcHMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3Yzg1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTc5IiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjODdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3Yzg3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3Yzg0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjODR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iNTM4OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3Yzg5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzOTc5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M4OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3Yzg5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjODktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzgtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOC1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzgtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOC0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzhfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOF9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzhfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzhfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3Yzg4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjODh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUwOSIgeT0iMzY0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3YzlEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3YzlDdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjUzNiIgeT0iNzYwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3YzlIZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5SHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlJZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdjOUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3YzlLT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3YzlHdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdjOUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM1NDYiIHk9Ijc1NjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQtdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN210X3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVBLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Qk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Q09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211Q2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN210LS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXRfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0MDUiIHk9IjM5NTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVFLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN211Ri1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Ry1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVIT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVIdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211SXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN211Rk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVGZWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMjg4IiB5PSIxMjY4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzdtdUotZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211TE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211TU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdU11ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzdtdUpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN211SmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzk0NCIgeT0iMTM1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3bXVZLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDAzIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVaLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVhZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdWJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXViZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVidWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3bXVZT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdVllZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzc5NyIgeT0iMTM1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djMzT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3YzNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2MzUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2MzJlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwIiB5PSIxMzg4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR2xpLVZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IkEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24gZGVwaWN0ZWQgaW4gdGhlIGRpYWdyYW0uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvIChzZWUgQ29udHJpYnV0aW9uIGluIHBhY2thZ2UgUGx1Z2luIGZvciBkZXRhaWxzKS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzdjOUFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4NDlFMDAwMSIgc291cmNlPSJfRzdjODRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzdjODhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3YzlCdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN2M5Qk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzdjOUFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3YzlBdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MzMsIDAsIDE3MDFdJFswLCAtMTcxOCwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN2M5Qi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdjOUNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN2M5S2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9HN2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN2M5R2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdjOUwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3YzlMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN2M5TU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdjOU1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0NiIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN210NWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTMiIHk9IjI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ2T2ZYRWR1cUhvT0piVVJaUnciIHg9IjQyMyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ2LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210N3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXQ4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXQ3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN210OHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdDlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdDllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQ5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXQtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdC1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdDktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3YzlLdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN2M5Sy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODQ1LCAwLCAtMTA3MDEsIDBdJFsxMDY5MywgMCwgLTE4NTQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211Q3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBzb3VyY2U9Il9HN2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN210LXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdURlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdUVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVEdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211Qy1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdURPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMzA4MV0kWzAsIC0zMDkwLCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3bXVFZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211RXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVNLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODMwRTAxNTAiIHNvdXJjZT0iX0c3YzlHZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211TnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211T2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdU4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVOT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdU5lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtNTE2LCAwLCA1NjgxXSRbLTUwLCAtNTY3MiwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN211T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzdtdU8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HN211UE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIiBzb3VyY2U9Il9HN211RS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN211SS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3bXVRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211Uk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjMiIHk9Ijk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzNzVFMDUwMTc1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211U09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iMTM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTczMiIgeT0iLTMwMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVVT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3bXVWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzdtdVh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzdtdVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3bXVQZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzdtdVB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzNjMsIC03NiwgNDg4NSwgMjVdJFstNDg1MSwgLTc2LCAxMzk3LCAyNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3bXVlT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3bXVJLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211ZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzdtdWZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVnT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3OSIgeT0iLTE3NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3bXVnLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzEiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3bXVoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211aHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzkiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211aWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjIxIiB5PSIyNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211amVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211anVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211ak9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzdtdWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN211a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN211a3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN211a09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djMwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMwZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djMxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HN211ZWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3bXVldWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3MDEsIDI1LCAtNDE0MCwgMjVdJFs0NDQ1LCAyNSwgLTEzOTcsIDI1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzd2MzZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfRzdtdC11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2MzJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2MzdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3YzN09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzd2MzZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN3YzNnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTE2LCAtNTAsIDIwNzRdJFswLCAtMjEwOCwgLTUwLCA0ODJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djM3LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HN3YzOE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djM4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIHNvdXJjZT0iX0c3bXVYLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djMyT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djM5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2MzllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djMtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djMtZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MiIgeT0iMTUyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2My0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djNfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3YzX09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODciIHk9Ii0yMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3YzX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2M18tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE5OSIgeT0iMjQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c3djRBdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MyIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NEJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzd2NENlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0RC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0RGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0RS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HN3Y0RWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzd2Mzh1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3djM4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzEwLCAwLCA0ODkzLCAwXSRbLTQ4MDksIDAsIDE3OTQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkQzMTJGMjAzNTgiIHR5cGU9IkNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Ri1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HN3Y0R09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjA2NSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0R2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NEllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c3djRGZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NEZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAyNSIgeT0iNDg4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c3djRLT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzI2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Sy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NExPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NEx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HN3Y0TWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NE11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzd2NE0tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzd2NEplZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HN3Y0SnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzk3IiB5PSI3Mzk5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzd2NFFlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwMTMiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzd2NFF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0UmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3djRSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8wZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8wLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvMWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HN3Y0UHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3djRQLWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMDM1IiB5PSI3MzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzc1bzJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NzUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW8zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW8zLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW80ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c3NW80LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HNzVvNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HNzVvNWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HNzVvMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c3NW8yT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijg3MjAiIHk9IjczNzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOEN5emVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3l6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeTF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4Q3kyT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4Q3l5dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeXktZlhFZHVxSG9PSmJVUlpSdyIgeD0iODM1NiIgeT0iMTQ4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4Q3k1dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5N2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOEN5Ny1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeThPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhDeThlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhDeTQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOEN5NU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MTIxIiB5PSI0NTgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhNajFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQyNjciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWoxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWoyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWoyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWozZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOE1qMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWowdWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NzMiIHk9IjI0NDYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HbGktVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c3djROT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMDMiIHNvdXJjZT0iX0c3djRKT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3djRPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HN3Y0T3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzd2NE9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c3djROZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HN3Y0TnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0OTEsIC00NTcsIC0yMzAyLCAyMDMyXSRbMjI2MCwgLTIwNDAsIC01MzMsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzd2NE8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c3djRQT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzc1bzV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2MCIgc291cmNlPSJfRzc1bzF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzd2NEZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW82ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzc1bzYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c3NW83T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HNzVvNnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzc1bzUtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c3NW82T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDIwMzJdJFswLCAtMjA0MCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HNzVvN2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzc1bzd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOEN5d09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HN3Y0UGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HN3Y0Rk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5eGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeXh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3l4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOEN5d2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhDeXd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTYyNiwgLTQ1NywgMjgyNywgMjAzMl0kWy0yODE5LCAtMjA0MCwgNjM1LCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3l4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOEN5eU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4Q3kyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0c3djRGT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4Q3l5ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3kzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5My1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhDeTNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3kydWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOEN5Mi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAyOTQ2XSRbMCwgLTI5NTQsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhDeTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4Q3k0ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhDeTh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBFRiIgc291cmNlPSJfRzhDeXllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhDeTR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3k5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4Q3k5dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NzciIHk9IjcwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3ktLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3ktdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNTMiIHk9Ii0xNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN5X09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3lfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOEN5X2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDeV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOEN6QWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3pBT2ZYRWR1cUhvT0piVVJaUnciIHg9IjMxNiIgeT0iMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhDekF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4Q3pCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4Q3pBLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qd09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qd2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOE1qeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOE1qeGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNanlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWp5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4TWp5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4TWp6LWZYRWR1cUhvT0piVVJaUnciIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhNanplZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc3IiB5PSItMTI0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4Q3k4LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhDeTlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExNjQsIDMxNywgMTk4NCwgLTI3NzhdJFstMTE2NCwgMzE3NSwgMTk4NCwgODBdJFstMjIyMiwgMzE3NSwgOTI2LCA4MF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4TWo0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOTI4MjAzOTIiIHNvdXJjZT0iX0c4Q3k0dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4TWowT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qNXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNajVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4TWo0ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOE1qNHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzAyLCAtNDU3LCAyNTk5LCAxNjc2XSRbLTI2MTYsIC0xNjg0LCA2ODUsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWo2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhNajZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgc291cmNlPSJfRzd2NEpPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhNajBPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWo3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOE1qN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhNajZ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4TWo2LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNDcsIC00NTcsIDMzMTAsIDQ0NzBdJFstMzMyNywgLTQ0NzgsIDMzMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qOE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhNajhlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOE1qOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HOE1qME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOEN5eWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNajllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNai1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4TWo5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOE1qOC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhNajlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjEzMywgLTMzMCwgLTQzMTgsIDYzNV0kWzQ3NDEsIC03MjgsIC0xNzEwLCAyMzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4TWotZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOE1qLXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaGhaOU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg1NDYwMEQ4Ij4KLSAgICAgICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfRHhMR3dPeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIiBuYW1lPSJBY3Rpdml0eSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dockstdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsUC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsUHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIiBuYW1lPSJNaWxlc3RvbmUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaDBVNU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIiBuYW1lPSJJdGVyYXRpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaDBVNk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NCIj4KLSAgICAgICAgICAgICAgPGJvZHk+SXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLikKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0NBIiBuYW1lPSJQaGFzZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0doLUY0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICA8Ym9keT5QaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgbmFtZT0iVGVhbVByb2ZpbGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaC1GNS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDYzIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIiBuYW1lPSJ0ZWFtUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HajVfa3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HajVfa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyIgbmFtZT0ic3VwZXJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd2stZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1IiBuYW1lPSJzdWJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd2x1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd2xlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgwMDU3MDI3NiIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpSDI0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MDA1NzAyNzYiPgotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIE9yZGVyIHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQikgYmVsb3cpIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IChyZWZlcnJlZCB0byBhcyAoQSkgYmVsb3cpIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxOUVEMDFFRCIgbmFtZT0iZmluaXNoVG9TdGFydCI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lIMjV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxOUVEMDFFRCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgYW5kICZxdW90O1BhaW50IGZlbmNlLCZxdW90OyAmcXVvdDtQYWludCBmZW5jZSZxdW90OyBjYW4ndCBzdGFydCB1bnRpbCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxQzcyMDNDNyIgbmFtZT0iZmluaXNoVG9GaW5pc2giPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpUkEwZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA4MUM3MjAzQzciPgotICAgICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgYW5kICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCwmcXVvdDsgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsJnF1b3Q7IGNhbid0IGZpbmlzaCB1bnRpbCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGZpbmlzaGVzLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA4MUJFODAyOTYiIG5hbWU9InN0YXJ0VG9TdGFydCI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lSQTFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxQkU4MDI5NiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGFuZCAmcXVvdDtMZXZlbCBjb25jcmV0ZSwmcXVvdDsgJnF1b3Q7TGV2ZWwgY29uY3JldGUmcXVvdDsgY2FuJ3QgYmVnaW4gdW50aWwgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGJlZ2lucy4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODFDNTEwMTNDIiBuYW1lPSJzdGFydFRvRmluaXNoIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaVJBMS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODFDNTEwMTNDIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCIgbmFtZT0iV29ya09yZGVyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2lheDB1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDgxODc5MDI4OCI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotKE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4M0VENkQwMDg4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwODE4RUUwMDlGIiBuYW1lPSJsaW5rVHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwODAwNTcwMjc2Ij4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWF4MXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwODE4RUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2lheDJPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmluaXNoVG9TdGFydDwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMSIgbmFtZT0icHJlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drOUljLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drOUljdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIiBuYW1lPSJQbGFubmluZ0RhdGEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWF4MnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RTYwMkMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+UGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRUY5MDBFMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNThEMDBEOSIgbmFtZT0ic3RhcnREYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpa2kwLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU4RDAwRDkiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE1OUEwMTI5IiBuYW1lPSJmaW5pc2hEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpa2kxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTU5QTAxMjkiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNzVDMDNEQiIgbmFtZT0icmFuayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaWtpMmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE3NUMwM0RCIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2l0c3d1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiI+Ci0gICAgICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVDMzk4MDAzMjQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciLz4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRTkxRjAwNjEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjgzRThBMTAzNDEiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQjYiIG5hbWU9InByZWZpeCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaXRzeC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0I2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3FXZTkwZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3FXZTkwT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3JIRUdNT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0NBIiBuYW1lPSJpc1BsYW5uZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpM2R3dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQ0EiPgotICAgICAgICAgICAgICAgIDxib2R5PkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLQotCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfR2kzZHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDQiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dpM2R4LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDQiPgotICAgICAgICAgICAgICAgIDxib2R5Pkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV0YWlsIFVzZSBDYXNlJnF1b3Q7IHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLgotPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dpM2R5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDA2QTZCMDFGQiIgbmFtZT0iaXNPcHRpb25hbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2kzZHktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDA2QTZCMDFGQiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HaTNkemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjYiIG5hbWU9InByZXNlbnRlZEFmdGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tEd25PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tEd20tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyMzQiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhnLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5IiBuYW1lPSJwbGFubmluZ0RhdGEiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTlBNEU2MDJDMSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTRGODAyMEEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMCIgbmFtZT0ic3VwZXJBY3Rpdml0aWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbE8tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiIG5hbWU9IkRlc2NyaXB0b3IiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HakFuc2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAKLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODE0MkJCMDNCNSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqQW50ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbnQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiIG5hbWU9InJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002ai1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002anVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5RCIgbmFtZT0ibW9kaWZpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE5QyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NqT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE3RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drelhjLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drelhjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pBbnUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi0KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjNCMDAwMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCIgbmFtZT0idGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drRHdxT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drRHdwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIyIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZsZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIiBuYW1lPSJhc3Npc3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOEIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUMiIG5hbWU9ImV4dGVybmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha1dyak9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha1dyaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNkQ3NUFCMDI4MSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djZy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQyIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drZ2NtT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drZ2NsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ4IiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NCIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtaGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3MyIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMzc1RTA0MDM5MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvT2U0LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvT2U0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqQW53T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTJBNUY4NjAyRjYiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HaktZcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEyQTVGODYwMkY2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9LYzFad095SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9LY3Jvd095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9LVllHNE95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxM0VDMDE4MDM0MCIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pLWXR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxM0VDMDE4MDM0MCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ZdHNYb2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ZdHNYb095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9ZaEIwb095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSIgbmFtZT0id29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha002aHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha002aGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSIgbmFtZT0iaW1wYWN0ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JsZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIiBuYW1lPSJpbXBhY3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcm1PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtZi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2IiBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pLWXVlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRjA2QjY1MDBFNiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjk0QUI5MDAxNSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBERiIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HalVKcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyNTQwMjI3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEVGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0MwIiBuYW1lPSJpc1JlcGVhdGFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dqZFRvLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzQzAiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HamRUcGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzRDUiIG5hbWU9ImlzT25nb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pkVHAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNENSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dqZFRxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNERSIgbmFtZT0iaXNFdmVudERyaXZlbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2pkVHEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNERSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotCi0KLTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9HamRUcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiIG5hbWU9ImxpbmtUb1ByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWYtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFOEExMDM0MSIgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HamRUci1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgPGJvZHk+UHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUNDMTAzMUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ham5Fby1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhZ2dyZWdhdGlvbiBhc3NvY2lhdGlvbiBzcGVjaWZpZXMgdGhlIHJvbGVzIG9mIHRlYW0gbWVtYmVycyB3aXRoIFJvbGUgRGVzY3JpcHRvcnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIiBuYW1lPSJfdGVhbVByb2ZpbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA2MyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dqbkVwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dqbkVwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNTIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2o1X2xPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBhIFN1Yi1UZWFtIHRvIGl0cyBTdXBlci1UZWFtLCBpLmUuIHRoZSBUZWFtIHRoYXQgaXQgaXMgcGFydCBvZi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJCNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha0R3bU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkI1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIgaXMgcmVkdW5kYW50IHRvIHRoZSBhc3NvY2lhdGlvbiBwcmVzZW50ZWRCZWZvcmUuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjgiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyQjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3bi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3bnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drRHdvZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBUYXNrIERlc2NyaXB0b3IgY2FuIHJlZmVyZW5jZSBvbmx5IG9uIFRhc2suICBIb3dldmVyLCBhIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSIgbmFtZT0idGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha0R3cGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha0R3cE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDggXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEQSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drRHdxdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzRDciPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFdvcmsgUHJvZHVjdC4gIEhvd2V2ZXIsIGEgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNEOCIgbmFtZT0id29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q3Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNmctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNkQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002aU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgZGVzY3JpcHRvciB0byB0aGUgY29yZSBjb250ZW50IGVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRXZlcnkgUm9sZSBEZXNjcmlwdG9yIGNhbiByZWZlcmVuY2Ugb25seSBvbmUgUm9sZS4gIEhvd2V2ZXIsIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTZCIiBuYW1lPSJyb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDE2QSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drTTZqT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drTTZpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiIG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjIgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMyQiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drTTZrZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMjEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIG5lY2Vzc2FyeSB0byBjb21wbGV0ZSB0aGUgcmVmZXJyZWQgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBzaG93IHVwIGFzIHNjaGVkdWxlZCByZXNvdXJjZXMgb24gYSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMkIiIG5hbWU9InBlcmZvcm1zQWRkaXRpb25hbGx5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzIxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tNNm1PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tNNmwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiIgbmFtZT0iQXNzaXN0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzQwIF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha002bXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgaGF2ZSBiZWVuIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgbWF5IHByb3ZpZGUgaW5mb3JtYXRpb24gb3IgYXNzaXN0YW5jZSBoZWxwZnVsLCBidXQgbm90IG1hbmRhdG9yeSB0byB0aGUgY29tcGxldGlvbiBvZiB0aGUgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBub3Qgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNDIiIG5hbWU9ImFzc2lzdHNJbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0drV3JodWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0drV3JoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNUIiIG5hbWU9IkV4dGVybmFsSW5wdXQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QyBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVFIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tXcmlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1QiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgc3BlY2lmaWMgdG8gYSBwcm9jZXNzLCBpLmUuIG5vIGRlZmF1bHRzIHdpbGwgYmUgZGVmaW5lZCBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIFdvcmsgUHJvZHVjdHMgdXNlZCBhcyBpbnB1dHMgdGhhdCBhcmUgbm90IHByb2R1Y2VkIGJ5IFRhc2tzIHdpdGhpbiB0aGUgc2FtZSBQcm9jZXNzLCBidXQgYnkgYW5vdGhlciBleHRlcm5hbCBwcm9jZXNzIG9yIGFuIHVua25vd24gc291cmNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI1RSIgbmFtZT0iZXh0ZXJuYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjVCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tXcmotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tXcmp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCIgbmFtZT0iSW1wYWN0c0RlcGVuZGVuY3kiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMSBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDIzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2tXcmtlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAyMCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzZW1pLWZvcm1hbGx5IHNwZWNpZnkgdHJhY2VhYmlsaXR5IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBXb3JrIFByb2R1Y3RzIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW4gQWN0aXZpdHkuICBBIGxpbmsgZnJvbSBvbmUgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgdG8gYW5vdGhlciBpbmRpY2F0ZXMgdGhhdCBvbmUgV29yayBQcm9kdWN0IGlzIHJlcXVpcmVkIGFzIGlucHV0IHRvIGEgVGFzayB0aGF0IHByb2R1Y2VzIHRoZSByZWxhdGVkIFdvcmsgUHJvZHVjdCAoJ2ltcGFjdHMnIHJvbGUgZW5kKS4gIEl0IHdvdWxkIGFsc28gbWVhbiB0aGF0IGEgY2hhbmdlIG9uIG9uZSBXb3JrIFByb2R1Y3QgaW5zdGFuY2UgbWF5IGFmZmVjdCBhIGNoYW5nZSBvbiB0aGUgcmVsYXRlZCBwcm9kdWN0LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIiBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE2RDc1QUIwMjgxIF8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha1dybXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE2RDc1QUEwMDRCIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBtYW5kYXRvcnkgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTZENzVBQjAyOTUiIG5hbWU9Im1hbmRhdG9yeUlucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTZENzVBQTAwNEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha2djaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha2djaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIiBuYW1lPSJNb2RpZmllcyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlEIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUMiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlcml2ZWQgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgTW9kaWZpZXMgYXNzb2NpYXRpb24gZGVmaW5lZCBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgYW5kIFRhc2tzIGluIENvcmUgTWV0aG9kIENvbnRlbnQuICBUaGUgc2FtZSBkZXJpdmF0aW9uIHJ1bGUgYXMgZm9yIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudHMgYXBwbGllcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxOUYiIG5hbWU9Il9yb2xlRGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTlDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2otZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2p1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyOSIgbmFtZT0iT3B0aW9uYWxJbnB1dCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjJBIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyMkMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha2dja2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBvcHRpb25hbCBmb3IgdGhlIFRhc2sgdG8gYmUgcGVyZm9ybWVkLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIyQSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjI5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2tnY2xlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2tnY2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDIzRCIgbmFtZT0iT3V0cHV0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyNDYgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI0OCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drZ2NtdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyM0QiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dHMgZm9yIHBlcmZvcm1pbmcgdGhlIHJlZmVycmVkIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjQ2IiBuYW1lPSJvdXRwdXRGcm9tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjNEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWMtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwQyIgbmFtZT0iUGFja2FnZWRXUCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3BtZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4KLSAgICAgICAgICAgICAgPGJvZHk+SWYgYSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciByZWZlcnMgYXQgdGhlICdkZWxpdmVyYWJsZScgcm9sZSBlbmQgdG8gYSBEZWxpdmVyYWJsZSBXb3JrIFByb2R1Y3QgdGhlbiB0aGlzIGFzc29jaWF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgRGVsaXZlcmFibGUncyBXb3JrIFByb2R1Y3QgcGFydHMuICBBcyBpbmRpY2F0ZWQgZm9yIERlbGl2ZXJhYmxlIGluIHRoZSBDb3JlIE1ldGhvZCBDb250ZW50IHBhY2thZ2UsIHRoaXMgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIHRoZSAnZGVsaXZlcmVkV29ya1Byb2R1Y3RzJyBhc3NvY2lhdGlvbiBvZiB0aGUgV29yayBQcm9kdWN0LCB3aGljaCBzdG9yZXMgdGhlIHJlY29tbWVuZGVkIGRlbGl2ZXJhYmxlIHBhcnRzLCBidXQgY2FuIGJlIGN1c3RvbWl6ZWQgZm9yIGV2ZXJ5IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiIG5hbWU9ImRlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2twbWZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2twbWUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1MyIgbmFtZT0iUHJpbWFyeVBlcmZvcm1zIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTQgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDM1NiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drcG1nZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBmb3IgdGhlIG9uZSByb2xlIHJlc3BvbnNpYmxlIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdGFzay4gIEFuIGluc3RhbmNlIG9mIHRoaXMgcm9sZSB3b3VsZCBzaG93IHVwIGFzIGEgc2NoZWR1bGVkIHJlc291cmNlIG9uIGEgY29ycmVzcG9uZGluZyBwcm9qZWN0IHBsYW4gZ2VuZXJhdGVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzU2IiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzNTMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3BtaU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3BtaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIiBuYW1lPSJSZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdGIF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxODgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3BtaXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTdFIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHJlc3BvbnNpYmlsaXR5IGZvciBXb3JrIFByb2R1Y3QgaW5zdGFuY2VzLiAgSXQgaW5kaWNhdGVzIG93bmVyc2hpcCBhbmQgZm9yIGV4YW1wbGUgd291bGQgZGVmaW5lIHRoZSBSb2xlIHRoYXQgYW5zd2VycyB0byBtYW5hZ2VtZW50IHF1ZXN0aW9ucyBhYm91dCB0aGUgcXVhbGl0eSB3b3JrIHByb2R1Y3QuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTg4IiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA4QiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxN0UiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUYwNkJCRTAwREYgXzNBREM3Qjc0MDIyRDQxRjA2QkJFMDBFOSI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGMDZCQkUwMEU5IiBuYW1lPSJfY29tcG9zaXRlUm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFGMDZCNjUwMEU2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFGMDZCQkMwMzBEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2t6WGZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2t6WGZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RjBDMDI4MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIxRThGMEUwMjM0IF8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Ha3pYZi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThGMEMwMjgxIj4KLSAgICAgICAgICAgICAgPGJvZHk+QnJlYWtkb3duIHN0cnVjdHVyZXMgYXJlIG5lc3RlZCBzdHJ1Y3R1cmVzIChzZWUgc3VwZXJBY3Rpdml0aWVzIGFzc29jaWF0aW9uKSBwcmVzZW50ZWQgbm9ybWFsbHkgYXMgaW5kZW50ZWQgbGlzdHMuICBXaXRoaW4gdGhpcyBuZXN0aW5nIGNoaWxkcmVuIG9uIHRoZSBzYW1lIGxldmVsIGFyZSBub3Qgc3BlY2lmaWNhbGx5IG9yZGVyZWQuICBIb3dldmVyLCBhIHVzZXIgb2YgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIHdvdWxkIGV4cGVjdCB0byBvcmRlciBlbGVtZW50cyB3aXRoaW4gYSBsaXN0LiAgVGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwcmVzZW50YXRpb24gc2VxdWVuY2UgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQWZ0ZXIuICBUaGlzIHJlZHVuZGFuY3kgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBQcm9jZXNzIENvbnRyaWJ1dGlvbnMgKHNlZSBwbHVnaW5zKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEYwRTAyNjYiIG5hbWU9Il9icmVha2Rvd25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFOEYwQzAyODEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Ha3pYaHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Ha3pYaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTEgXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0drelhpT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQzODAwQTAiPgotICAgICAgICAgICAgICA8Ym9keT5UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHN1Y2Nlc3NvciBXb3JrIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDM4MDBBMiIgbmFtZT0ibGlua1RvU3VjY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTA4MTg3OTAyODgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI4MEVEMzgwMEEwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2s5SWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2s5SWRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODBFRDQwMDBDRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENFIF8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0YiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HazlJZU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4MEVENDAwMENEIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHByZWRlY2Vzc29yLiAgRXZlcnkgV29yayBCcmVha2Rvd24gRWxlbWVudCBjYW4gaGF2ZSBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIGl0LiAgU3BlY2lmaWMgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgV29yayBPcmRlciwgd2hpY2ggZGVmaW5lcyB0aGUga2luZCBvZiBwcmVkZWNlc3NvciBhbm90aGVyIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgcmVwcmVzZW50cyBmb3IgYW5vdGhlci48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0UiIG5hbWU9InN1Y2MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgwRUQ0MDAwQ0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HazlJZk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HazlJZS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiIG5hbWU9IlByb2Nlc3NUeXBlcyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HbWxnTi1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MUUxMDA3QzAzMUYiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDA3QzAzMUYiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4TWotLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTkyOUU5OTAyOUMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOE1qX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhNal8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkRlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlNoYXBlU3R5bGUiIHhtaTppZD0iX0c4TWpfT2ZYRWR1cUhvT0piVVJaUnciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogUHJvY2Vzc1R5cGVzIC8gUHJvY2Vzc0JyZWFrZG93biIgbGluZUNvbG9yPSI0MTk0MzY4Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhNal9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE3OSIgeT0iOTYyNiIgd2lkdGg9IjQ0NDUiIGhlaWdodD0iMTEwOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXdPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1V4T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1V4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVXp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVXotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVXdlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdVd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjkwIiB5PSIxMDI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhXVTFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5OTciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1UzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdVMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOFdVMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1UwdWZYRWR1cUhvT0piVVJaUnciIHg9IjY0MjAiIHk9Ijc3NDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOFdVX2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUyMSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdVX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1VfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZBZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZCZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZCLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZDT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1UtdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVS0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI4OSIgeT0iNzc0NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1ZEZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZFZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZFLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZGLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4V1ZHT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4V1ZDdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVkMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjY1NyIgeT0iMjg1MyIgd2lkdGg9IjIxMTYiIGhlaWdodD0iMzI3NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4V1ZXLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWWk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVlp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhXVldPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWV2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkxNCIgeT0iNzc5NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtbGdPZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgUHJvY2VzcyBUeXBlcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIFByb2Nlc3MuICBBcyBkZXBpY3RlZCBpbiB0aGlzIGRpYWdyYW0sIGl0IGRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHR5cGVzIG9mIHByb2Nlc3NlcyBuZWVkZWQgdG8gcmVwcmVzZW50IGJ1aWxkaW5nIGJsb2NrcyBmb3Igb3RoZXIgcHJvY2Vzc2VzIChDYXBhYmlsaXR5IFBhdHRlcm4pLCBjb21wbGV0ZSBlbmQtdG8tZW5kIHByb2Nlc3NlcyAoRGVsaXZlcnkgUHJvY2VzcyksIG9yIHByb2Nlc3NlcyB0aGF0IGhhdmUgYmVlbiByZWR1Y2VkIHRvIHRoZSBlc3NlbnRpYWwgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IGZvciBleHBvcnRpbmcgYW5kIHBsYW5uaW5nIGEgcHJvamVjdCB3aXRoIGEgdGhpcmQtcGFydHkgcGxhbm5pbmcgdG9vbCAoUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSkuICAoTm90ZSwgdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWctaW4gd2lsbCBwcm92aWRlIGFub3RoZXIgdHlwZSBvZiBQcm9jZXNzIGNhbGxlZCBQcm9jZXNzIENvbnRyaWJ1dGlvbi4pICBUaGUgUHJvY2VzcyBUeXBlcyBwYWNrYWdlIGFsc28gZGVmaW5lcyBwcm9jZXNzLXNwZWNpZmljIGV4dGVuc2lvbiB0byBHdWlkYW5jZSBUeXBlcyBhcyB3ZWxsIENhdGVnb3JpZXMuICBXaGVyZWFzIHRoZSBCcmVha2Rvd24gcGFja2FnZSBkZWZpbmVkIHRoZSBiYXNpYyBwaWVjZXMgZm9yIGRlc2NyaWJpbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMsIHRoaXMgcGFja2FnZSB0YWtlcyB0aGVzZSBwaWVjZXMgYW5kIHBsYWNlcyB0aGVtIGludG8gaGlnaGVyIG9yZ2FuaXphdGlvbiBzdHJ1Y3R1cmVzIGZvciBicmVha2Rvd246IFByb2Nlc3Nlcy4gIEEgcHJvY2VzcyBpcyBkZWZpbmVkIGFzIGEgc3BlY2lhbCBBY3Rpdml0eSBhbmQgdGhlcmVmb3JlIGNvbnN0aXR1dGVzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhIGJyZWFrZG93bi4gIEhvd2V2ZXIsIFByb2Nlc3MgY29udGFpbnMgc3BlY2lhbCBwcm9wZXJ0aWVzIGFuZCBleHRlbmRlZCBzZW1hbnRpY3MgdGhhbiBBY3Rpdml0eS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVkdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiIgc291cmNlPSJfRzhXVS1lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZILWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVklPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYyMyIgeT0iMjI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkpPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ4NyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWSi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTEiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4V1ZLdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNzEyIiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAyQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVkx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVkwtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVkxlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhXVk0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhXVk1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWTmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVk91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOFdWTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOFdWT2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVkd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWRy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODcyLCAtNDU3LCAtNTAzNywgMzI1MV0kWy04NzIsIC00NTIxLCAtNTAzNywgLTgxMl0kWzMxMDcsIC00NTIxLCAtMTA1OCwgLTgxMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4V1ZQT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIHNvdXJjZT0iX0c4V1UtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4V1ZDZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWUXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhXVlFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZQZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVlB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMxLCAtNDQ4LCAtMzIzNCwgMzI1OV0kWzkzMSwgLTI2NTAsIC0zMjM0LCAxMDU4XSRbMzEwNywgLTI2NTAsIC0xMDU4LCAxMDU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOFdWUS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOFdWUmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTEwIiBzb3VyY2U9Il9HOFdVME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOFdWU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4V1ZTZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOFdWUnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4V1ZSLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xOTQsIC00NTcsIDgsIDMyNTFdJFstMTk0LCAtMjA3NCwgOCwgMTYzNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVXdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZVZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWVXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhXVlQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOFdWVU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTgsIC0xNjQyLCAtMzMsIDI0MjFdJFsxMTgsIC0zNjE1LCAtMzMsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhXVlZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4V1ZWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhXVlotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCIgc291cmNlPSJfRzhXVkNlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhXVlYtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhXVmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4V1ZiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOFdWYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5OSIgeT0iMzIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzMSIgeT0iMzY0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZldU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV0LWZYRWR1cUhvT0piVVJaUnciIHg9IjQ5MyIgeT0iLTE3NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV1dWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MjUiIHk9IjMxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZld09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ZmV3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ZmV3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZleE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ZmV5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhmZXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhmZXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4V1ZhT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzhXVmFlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTA1OCwgMTE4NSwgLTU2OTgsIC0yNTczXSRbMjc2OCwgMTE4NSwgLTM5ODcsIC0yNTczXSRbMjc2OCwgMzcxNiwgLTM5ODcsIC00Ml0kWzUxOTgsIDM3MTYsIC0xNTU3LCAtNDJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOGZlek9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMjhEIiBzb3VyY2U9Il9HOFdWVi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOFdWQ2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOGZlMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhmZTB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ZmUwT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOGZlemVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ZmV6dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMsIC00NDgsIDY1NTMsIDMzMTBdJFstMjAzLCAtMzI0MiwgNjU1MywgNTE2XSRbLTU2OTgsIC0zMjQyLCAxMDU4LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4ZmUwLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOGZlMU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxOTI5RTk5MDI5QyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlByb2Nlc3NCcmVha2Rvd24iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4cFB0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUHZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4cFBzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUHN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTIyMCIgeT0iMTE5NjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUHhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFB4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFB6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFB3dWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NDU5IiB5PSI0OTY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUDFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE2NzYiIGhlaWdodD0iOTMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFAxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQMnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQM09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFAzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQMy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFAwdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTMxIiB5PSI2MDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHBQNU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQNnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQN09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFA3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBQNy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHBQNGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4cFA0dWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMzQ0IiB5PSI4ODIyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0QzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzhwUF9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzhwUUNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzhwUC11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkwMyIgeT0iNTA3MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekF1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjI1IiBoZWlnaHQ9Ijg5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QXctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QXRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBdHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM4OSIgeT0iMjEzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4ekEydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekEzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QTQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekE1ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4ekExLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QTJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODY1MiIgeT0iMTUyMzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE3LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpBOC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekE5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekEtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBLWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekEtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBLS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekFfT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBX2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpBX3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpBOE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekE4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NjQiIHk9IjE1MjE0IiB3aWR0aD0iNDYzMSIgaGVpZ2h0PSIxMTc2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDhCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzh6Qkp1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCTC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6Qk1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzh6QkktZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpCSk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQ4OCIgeT0iMTUxMjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOHpCTnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qk4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCUWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOHpCTS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzU0IiB5PSIxMTk5NiIgd2lkdGg9IjI3MDkiIGhlaWdodD0iMjIzNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c4OEs3dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjUwIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4SzktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEstT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEstZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c4OEs2LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4SzdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE5NDYiIHk9IjY4NDEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExET2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhMRU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM1MyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMRy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HODhMRGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExEdWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3OTUiIHk9IjI5MjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExKZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMS09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HODhMS2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM1MyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExMdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OExNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhMTk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HODhMSnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExKLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODkxIiB5PSIyODI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkllZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgbWFpbiBzdHJ1Y3R1cmUgdXNlZCB0byByZXByZXNlbnQgYSBwcm9jZXNzLiAgQSBwcm9jZXNzIGlzIHJlcHJlc2VudGVkIGJ5IGEgYnJlYWtkb3duIG9mIEFjdGl2aXRpZXMsIHdoaWNoIGhhcyAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzhwUDhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RiIgc291cmNlPSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFA5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHBQOU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzhwUDhlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4cFA4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzYwOSwgLTU0MSwgLTMwNDgsIDI2MDddJFszMDIyLCAtMjYyNCwgLTYzNSwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHBQOS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzhwUC1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHBRQ2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBzb3VyY2U9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzhwUURlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQiIHk9IjY2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFFZWZYRWR1cUhvT0piVVJaUnciIHg9Ii05ODEiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFFLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzhwUUZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzYyIiB5PSItMzE5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFGLWZYRWR1cUhvT0piVVJaUnciIHg9IjExODUiIHk9IjIyOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFHdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NjQiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRSGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHBRSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHBRSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHBRSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzhwUUpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4cFFKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4cFFKLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4cFFKZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBc09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEYwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekFzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekFzZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHBRQ3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4cFFDLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xODc5LCAtMjM4LCAtMTUwOCwgMzUxOV0kWy00NDQ1LCAtMjM4LCAtNDA3NCwgMzUxOV0kWy00NDQ1LCAtMzY1MiwgLTQwNzQsIDEwNV0kWy0xMzIzLCAtMzY1MiwgLTk1MiwgMTA1XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzh6QXhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzhwUDBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzh6QXRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekF5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOHpBeU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QXhlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekF4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDQ2NSwgMCwgLTE4MjBdJFswLCAxODI4LCAwLCAtNDU3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBeS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QXpPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzAzIiBzb3VyY2U9Il9HOHpBMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpBNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QTdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekE2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpBNS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekE2T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI5NiwgLTUyNCwgLTgsIDI3MjZdJFsyOTYsIC0yNzE3LCAtOCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOHpBN2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzh6QTd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpBXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBDIiBzb3VyY2U9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpBNy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzh6QkEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg3NiIgeT0iMzkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkItZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMiIgeT0iNjM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCQ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjIiIHk9Ii0zNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg2NyIgeT0iMTcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QkVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwMiIgeT0iLTExMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOHpCR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6Qkd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJHLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4ekJJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJILWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOHpCQU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4ekJBZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE3NywgNTg0LCAxNzcsIDU4NF0kWzE3NywgMjQ0NiwgMTc3LCAyNDQ2XSRbLTM0NjIsIDI0NDYsIC0zNDYyLCAyNDQ2XSRbLTM0NjIsIDM5NywgLTM0NjIsIDM5N10kWy0xOTk4LCAzOTcsIC0xOTk4LCAzOTddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOHpCUXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDUyIiBzb3VyY2U9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHpCTXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4ekJSdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCU3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjciIHk9IjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOHpCVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4ekJUZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NDciIHk9IjI2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4ekJULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOHpCVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItODA3IiB5PSItMjkwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE1MSIgeT0iMjQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzh6QlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzh6QldPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzh6QlZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S291ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzg4S28tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S29lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLcGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA1MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3F1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLcWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzh6QlEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOHpCUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMzU0LCAwLCAxMzU0LCAwXSRbMzM5NSwgMCwgMzM5NSwgMF0kWzMzOTUsIC0xOTIxLCAzMzk1LCAtMTkyMV0kWzE4NiwgLTE5MjEsIDE4NiwgLTE5MjFdJFsxODYsIC0xMTE3LCAxODYsIC0xMTE3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4S3JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDAzRSIgc291cmNlPSJfRzh6Qk11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUDRPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEtzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLc09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4S3JlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEtydWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMTI2LCAtMTEyNiwgMjQyOSwgMjQyOV0kWy0zMDMxLCAtMzAzMSwgNTI0LCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEtzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEt0ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwM0YiIHNvdXJjZT0iX0c4ekJJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4ekJNdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLdWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTczIiB5PSItNDk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3ZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMyIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTI3IiB5PSIzMzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzg4S3ctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9IjIxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEt4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjciIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S3pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HODhLei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HODhLemVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEswdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEswLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEswZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMDQwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c4OEsxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c4OEsxZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLdHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEt0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1MDgsIC0yNywgLTIxOTYsIDIzMDJdJFszNTQ1LCAtMjcsIC0xNTksIDIzMDJdJFszNTQ1LCAtMTIxNywgLTE1OSwgMTExMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OEsyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxNjAiIHNvdXJjZT0iX0c4ekJJdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFBzT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEszZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4SzNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OEsyZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhLMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTY3LCAtNTI0LCAyODg3LCAyNjI0XSRbLTI4NzAsIC0yNjE2LCA1ODQsIDUzM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OEs0T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4SzRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDNENiIgc291cmNlPSJfRzh6QTctZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzhwUHNPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4SzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OEs1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhLNWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4SzR1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEs0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzcyOCwgLTU5MiwgLTM0MzcsIDI3MDldJFszNDcxLCAtMjc2OCwgLTY5NCwgNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhLNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4SzZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhLLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyODIwMzkyIiBzb3VyY2U9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4S19lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhLXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OEtfdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhLLS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OEtfT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDUxNiwgLTEwMSwgLTEyNjFdJFswLCAxMjUzLCAtMTAxLCAtNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjMwMTlBIiBzb3VyY2U9Il9HODhLNnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQNE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TENlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMQk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzgsIDMxOCwgLTIxMiwgLTE2NjddJFstMjM4LCAxNjY3LCAtMjEyLCAtMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMQ3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TEMtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HODhMSE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HODhMRE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOHBQLWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TEl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c4OExJT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HODhMSGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzg4TEh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzI4LCA1MjQsIC0yMjY5LCAtMTYwOF0kWzIyNjAsIDE2MDgsIC03MzYsIC01MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExJLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMSk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c4OExOZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyOUYiIHNvdXJjZT0iX0c4OExKZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c4cFAtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HODhMTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzg4TE9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c4OExOdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HODhMTi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzUzLCA1MjQsIDIzNDUsIC0xNzEwXSRbLTIzODcsIDE3MTAsIDcxMSwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c4OExQZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzg4TFB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQjFFQzFCMDM0OSIgc291cmNlPSJfRzhwUHdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzg4SzZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzg4TFEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c4OExST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HODhMUXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzg4TFAtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c4OExRT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NjUsIDUxNiwgMjQ4OSwgLTEzNjNdJFstMjUwNiwgMTM0NiwgOTQ4LCAtNTMzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HODhMUmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzg4TFJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1RjY3ODAwNDUiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzR3VpZGFuY2UiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN29PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5RjdwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNjc2IiBoZWlnaHQ9IjkxNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjdwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3B1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3FPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3cWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3F1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3cS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3JPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOUY3cmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGN3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGN3ItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlGN29lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOUY3b3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDQ3IiB5PSIxMzE1NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5RjcxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlGNzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjcydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjczT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlGNzNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5RjczdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5RjczLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5RjcwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlGNzB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODEyIiB5PSIxNTExMyIgaGVpZ2h0PSIxNjY3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOUY3NE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQRmstZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRmwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRm5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRm51ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQRmtPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGa2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTM0NiIgeT0iMTAxNjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZuLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUU4NjAxN0UiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBGby1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTY1OSIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZxLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRnJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZyZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZydWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEZvT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRm9lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExNTkiIHk9Ijg2NDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBGdk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGdnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEZ4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGeHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBGeC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBGdWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBGdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE5MiIgeT0iMTE0ODAiIHdpZHRoPSI0MzM2IiBoZWlnaHQ9IjUzOTMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdEdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVBHRXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHRnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHR09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHSGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVBHRC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVBHRU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE4NCIgeT0iMjUzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5OSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5UEdJdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0stZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdMT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEdMZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5UEdILWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEdJT2ZYRWR1cUhvT0piVVJaUnciIHg9IjExMTg0IiB5PSIzNzUwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlQR011ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI5MjkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR05PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR051ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHTi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR09PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkya2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMmstZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlQR0wtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQR01PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTExODQiIHk9IjQ5NjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOVkybU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkyOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkybnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOVkybGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkybHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTE4NCIgeT0iNjE4OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5WTJxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyOTI5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5WTJwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5WTJwdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMTg0IiB5PSI3NDA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlZMnVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkydS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkydmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkydi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMnctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlZMnRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkydHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTAwIiB5PSIyNTA2IiB3aWR0aD0iMjM3OSIgaGVpZ2h0PSI5NjI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkktZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byB0aGUgZGlmZmVyZW50IFByb2Nlc3Mtc3BlY2lmaWMgR3VpZGFuY2UgVHlwZXMgYWRkZWQgdG8gdGhlIEd1aWRhbmNlIFR5cGVzIGFscmVhZHkgZGVmaW5lZCBpbiBDb3JlIE1ldGhvZCBDb250ZW50IGZvciBQcm9jZXNzZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5UEZ5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiIHNvdXJjZT0iX0c5UEZ1T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlQRnpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZ6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYwT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03MzIiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYwLWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3OCIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYxdWZYRWR1cUhvT0piVVJaUnciIHg9Ijc0MiIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGMmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjEiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEYzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEYzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5UEY0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEY0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQRjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRjZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5UEZ5ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlQRnl1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE1MDcsIDI0MTMsIDg5MDYsIDU4NF0kWy04OTQwLCAyNDEzLCAxNDczLCA1ODRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOVBGNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIiBzb3VyY2U9Il9HOVBGdU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOUY3ME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5UEY3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGOC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzMyIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEY5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBGOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA2IiB5PSIzMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBGLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEYtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRi1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzQyIiB5PSItNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRi0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEZfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5UEZfT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM2MSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQRl91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0FlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQRl8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlQR0JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlQR0EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5UEdCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTMxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVBHQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEyRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlQR0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVBHRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVBHQy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlQRjdPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVBGN2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjE3MCwgOTc5LCA4ODM3LCAtMjkxXSRbLTk0NDYsIDk3OSwgMTU2MSwgLTI5MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTJ4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5Rjc0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMnlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNzkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJ6T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MTkiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJ6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMnotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMyIgeT0iLTE5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NjQiIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTIxZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1IiB5PSItMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZMjN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZMjNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTIzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyNHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA2NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkyNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlZMnhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HOVkyeHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMTg1LCAzMzM1LCAtODYxOSwgODRdJFs4ODIyLCAzMzM1LCAtOTgyLCA4NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTI1LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiIHNvdXJjZT0iX0c5UEZuLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyN2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZMjYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI3LWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NDIiIHk9Ii0yNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkyOHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZMjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlFRkYwMTlBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTI5ZWZYRWR1cUhvT0piVVJaUnciIHg9IjY4OSIgeT0iLTI0NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTI5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTItZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTItT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02ODMiIHk9IjE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTJfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTJfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTItLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkyX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNBZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTJfLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDFBNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0EtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlZM0NlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0ItZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5WTI2T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlZMjZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgyOSwgMCwgODg3MywgMTc3OF0kWy04NTE3LCAwLCAxMTg1LCAxNzc4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlZM0N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlQRnVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNFT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOVkzRHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc3MCIgeT0iMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM0ZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzR09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTkiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNHLWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NTIiIHk9Ii0yNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzSU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOVkzSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzSXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM0plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNKdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5WTNMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNLdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkzQy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTNET2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIDQ2MzEsIC05MjI4LCAtMjIyNl0kWzg5MDYsIDQ2MzEsIC0xNTA3LCAtMjIyNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5WTNMZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5UEdEdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlZM01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNOZWZYRWR1cUhvT0piVVJaUnciIHg9Ii04NTQiIHk9IjI5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNOLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlZM09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5WTNPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5WTNQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlZM08tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUyIiB5PSIyOTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzgiIHk9Ii0xODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOVkzUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlua09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlua2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOVkzUWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOWlubGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluay1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5sLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlubk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5uZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5tLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOVkzTHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5WTNMLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExODUsIC00Mjc1LCAtOTE3NywgLThdJFs4ODk4LCAtNDI3NSwgLTE0NjQsIC04XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbm51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlQR0h1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5vZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5wT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlub3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkzMCIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlucXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluck9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjAiIHk9IjI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5yLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMCIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW50T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5zdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW50LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW51T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW50dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWludWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFCNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbnZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW52ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW52LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbndPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW5uLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbm9PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTMwNDgsIC05MTc3LCAwXSRbODg5OCwgLTMwNDgsIC0xNDY0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbndlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlQR0x1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW54LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWlueGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkwNSIgeT0iMzEyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbnktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbnpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW56dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluei1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MDEiIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4wZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4wdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOCIgeT0iLTI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4xT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4xLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4xZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4yLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4yZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk1MDMyQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW40T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW40dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpbjQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW53dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbnctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTE4MjgsIC05MTc3LCAwXSRbODg5OCwgLTE4MjgsIC0xNDY0LCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlpbjVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyIgc291cmNlPSJfRzlZMnRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlZMmxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW41LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW42dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOWluNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg3OSIgeT0iMzYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpbjctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW44ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpbjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWluOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2NzUiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW45T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW45dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW45ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEyNSIgeT0iLTM0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW45LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW4tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW4tdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW4tT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW5fZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW5fdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW5fT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWluXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJFNCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9BLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyREEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9CZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW41ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpbjV1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgLTYwOSwgLTkxNzcsIDBdJFs4ODk4LCAtNjA5LCAtMTQ2NCwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW9CLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RTAxNzgiIHNvdXJjZT0iX0c5WTJ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5WTJwT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9ET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpb0MtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9EdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDhCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOWlvRXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9GZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MCIgeT0iMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0dPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI5MCIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9HdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9IZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9HLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9JT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5aW9JZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5aW9ILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlGMDA4QiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9KdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9LT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlpb0tlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlpb0otZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW9DT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpb0NlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE4NSwgNjA5LCAtOTE3NywgMF0kWzg4OTgsIDYwOSwgLTE0NjQsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOWlvS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOUY3b09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOVkydE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlpb01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5aW9MdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOWlvSy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5aW9MT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzg0LCAtNDY1LCA4NCwgNTgzM10kWzg0LCAtMTQ5OCwgODQsIDQ4MDBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9NZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOWlvTXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5aW9NLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0c5RjcwT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5RjdvT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5aW9PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOWlvT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlpb04tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5aW9OT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlpb05lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUzLCAtMzE4LCAtNTMsIDE2NDBdJFstNTMsIC0xNjQxLCAtNTMsIDMxN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlpb091ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5aW9PLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRCQ0QwMzFBIiB0eXBlPSJDbGFzcyIgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3dzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4ay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HOXJ4bE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTcyNyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4bGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeGwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeG5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnhuLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5cnhrZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlyeGt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iMzQ4NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cnhwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTc0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4cC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4cmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlyeHItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlyeG9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4b3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI3Njg0IiB5PSIxNjU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRCRUUwMERDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlyeHZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NjIiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4di1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4d2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4eGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cnh4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4eC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4eU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOXJ4dXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cnh1LWZYRWR1cUhvT0piVVJaUnciIHg9IjkzNiIgeT0iMTc2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5cngtZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMTE1IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeF9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4X3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaWhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlyeDl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4OS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2OTEzIiB5PSI1NjIxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkplZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgdGhlIGNhdGVnb3J5IGRpc2NpcGxpbmUgaGFzIGJlZW4gZXh0ZW5kZWQgaW4gdGhpcyBwYWNrYWdlIHdpdGggYW4gYWRkaXRvbmFsIGFzc29jYXRpb24gdG8gQWN0aXZpdHkgcHJvdmlkaW5nIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGRlc2NyaWJlZCBieSB0aGUgRGlzY2lwbGluZS4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzlyeHNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRUQ2MDJBRSIgc291cmNlPSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeG9PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnhzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cnh0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOXJ4dE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzlyeHNlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5cnhzdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDEzNzFdJFswLCAtMTM4MCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOXJ4dC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzlyeHVPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOXJ4MHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIiBzb3VyY2U9Il9HOXJ4dWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOXJ4b09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5cngxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Mi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4MnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NiIgeT0iMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4M3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cngzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMyIgeT0iMjk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEwRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlyeDQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExNTUiIHk9Ii0yMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4Nk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4Ni1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOXJ4N09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOXJ4NnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlyeDdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5cng3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng3dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjRDM0IwMTBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOXJ4OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5cng5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5cng4dWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOXJ4MC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5cngxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzkzMSwgLTI1LCAtNTY3MiwgNzZdJFs1ODE2LCAtMjUsIC03ODcsIDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRzkxaWh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzlyeDllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlyeGtPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRzkxaWgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5MWlpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIDAsIDE2NzZdJFswLCAtMTY4NCwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOTFpamVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRzkxaWp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzQ0U5RjAyOTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzV29ya0RlZmluaXRpb24iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjU0MDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWlyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjY3IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWlzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWlxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTEzMCIgeT0iMzM0NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWl2T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaXhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWl4LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWl1ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg1MyIgeT0iNzYwOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5MWl6T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWl6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkwdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkxT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5MWkxLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5MWl5ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzkxaXl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzE3IiB5PSI3NjA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzkxaTNPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3MjYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5MWkzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOTFpMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOTFpNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzkxaTV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzkxaTUtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzkxaTJlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOTFpMnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1OTAxIiB5PSI1NjMwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVGplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ua09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9Ua3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVG1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVGl1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVGktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjg1MyIgeT0iMTI2OCIgaGVpZ2h0PSIxMzc1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVG5lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3OTQiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RudWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ub09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9Ub3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVG8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UcHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHFPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVG11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVG0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA3NzgiIHk9IjEyNjgiIGhlaWdodD0iMTMyMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0c5X1Q4LWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxNTkxIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9ULU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVC1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9ULXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVC0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9UX09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVF9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVF91ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRzlfVDhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HOV9UOGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzg5IiB5PSI2OTc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMERDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVUEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VET2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VRHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VQU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VBZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5MjUiIHk9IjEwMTQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDlGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRzlfVUUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE3MjciIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VR2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VHdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VRy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1VIT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HOV9VSHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HOV9VRU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VFZWZYRWR1cUhvT0piVVJaUnciIHg9IjY2NTciIHk9Ijg1NTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1VLT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkY2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg0NCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRlZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZGV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRlLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRmT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0c5X1VLZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVUt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA2NCIgeT0iMTAyMTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRqLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzRDMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlka3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkay1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjMxOSIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRtdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkbmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkbnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlka09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRrZWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MzYiIHk9IjQ0MzgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRxT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLUlkck9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzM4NiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkc09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWRzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctSWR0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkdC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLUlkcWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRxdWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNjUxIiB5PSIzMzQ0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkM09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1JZDRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjIzMTkiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQ0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLUlkNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1JZDYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1JZDNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkM3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTkzIiB5PSI1NjMwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR212UkotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9UZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTkyM0IwMDAyIiBzb3VyY2U9Il9HOTFpMk9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVGh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1RoT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9UZ2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVGd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUyNCwgMCwgMTc2MV0kWzAsIC0xNzY5LCAwLCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1RoLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9UaU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1RxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiIHNvdXJjZT0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVHJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1RzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9Uc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UdE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R0LWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOCIgeT0iMjU5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU3OCIgeT0iLTE3NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R2ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Ud09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1R3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1R3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1R5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVHktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVHllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1RxdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1RxLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIwOTAsIDYwOSwgLTUzNDUsIDYzNV0kWzU4MjEsIDYwOSwgLTE2MTQsIDYzNV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0c5X1R6T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiIHNvdXJjZT0iX0c5X1RpZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1RtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9Uei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRzlfVDBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QwLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HOV9UMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjAyIiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1QydWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MCIgeT0iMTU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4OCIgeT0iLTE3MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1QzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q0T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0c5X1Q1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0c5X1Q1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9UNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVDZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0c5X1Q3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRzlfVDd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRzlfVDdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0c5X1R6ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0c5X1R6dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NDUsIC0zODksIC01NjIxLCAtMzg5XSRbNjA3MCwgLTM4OSwgLTEzOTcsIC0zODldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HOV9VSC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBzb3VyY2U9Il9HOV9VRC1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UNy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HOV9VSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRzlfVUplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0c5X1VJLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HOV9VSU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRzlfVUllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU1MCwgLTQ1NywgMjE0MiwgMTc3OF0kWy0yMTUwLCAtMTc4NiwgNTQxLCA0NDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0c5X1VKdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HOV9VSi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWRmZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMTAiIHNvdXJjZT0iX0c5X1VLT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0c5X1VELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZGdlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWRmdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkZi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMzAsIC00NTcsIC0xMzk3LCAxODI4XSRbMTM3MSwgLTE4MzcsIC0zNTUsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRoZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZGh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgc291cmNlPSJfRzlfVF8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzlfVUQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZGktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWRqT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZGgtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWRpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yODcsIC00NTcsIDExMzQsIDE4MjhdJFstMTE1MSwgLTE4MzcsIDI3MCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkamVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZGp1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkbi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMkEwIiBzb3VyY2U9Il9HOTFpeU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWRvLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkb09mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZG9lZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTkyLCAtNTI0LCAtMjA5OSwgMTgxMV0kWzIwODIsIC0xODIwLCAtNjA5LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWRwdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkcC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctSWR1T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjhDRDMyMzAxOUEiIHNvdXJjZT0iX0c5MWlxT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctSWRxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1JZHZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctSWR1ZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLUlkdXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTMzLCAwLCAtMjk0NiwgMF0kWzMzNzgsIDAsIC0xNzAxLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkdi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkd2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HOTFpdU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWR4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkd3VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR3LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMzUsIC01MTYsIC04NCwgMTgyMF0kWy0xMzUsIC0xODIwLCAtODQsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZHlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWR5ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1JZHl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5MjgyMDM5MiIgc291cmNlPSJfRy1JZGotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRzkxaXFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWR6ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctSWQwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLUlkenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1JZHktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWR6T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MCwgLTUyNCwgLTIyMzUsIDE3MTBdJFsyMjA5LCAtMTcxOCwgLTY4NSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkMC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4Q0QzMjkwMUZEIiBzb3VyY2U9Il9HLUlkai1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOV9UaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWQxLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkMU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctSWQxZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMjEsIC01MTYsIC03MjgsIDM1NDddJFstMzIxLCAtMzU0NywgLTcyOCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkMnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1JZDItZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLUlkN09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJCMUVDMUIwMzQ5IiBzb3VyY2U9Il9HLUlkM09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HOTFpcU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLUlkOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1JZDh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctSWQ4T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLUlkN2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1JZDd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTY0MywgLTUyNCwgMjE1MCwgMTc2MV0kWy0yMTY3LCAtMTc2OSwgNjI2LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctSWQ4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLUlkOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFOEYyMDEyNSIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uVGF4b25vbXkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09jLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09kT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09kdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09lT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2VlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09ldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09mT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09mdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09mLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09jZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2N1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODgyMiIgeT0iMTAwNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNEMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09oT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09odWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09pT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09pdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09qT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT2plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09qdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09qLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09nZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT2d1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MSIgeT0iMjg4NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT21lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU09uZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09uLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09vZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT291ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09vLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3BPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09wZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09wLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU09xT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09tdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT20tZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAwNiIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU090ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctU090dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU091T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU091dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU092T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3ZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU092dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TT3YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU093T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU093ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctU09zLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3RPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU0MjkiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU083dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLVNPOHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjcyNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU085ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPOXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU085LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPLU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU08tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU08tLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLVNPX2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLVNPNy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU084T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzAyIiB5PSI3MDc5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1iWWUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlloT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWJZaHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWJZZU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYlllZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02MzQiIHk9IjQ3NTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllrT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLWJZbE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTcyNyIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlltT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlltdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlluT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWW5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlludWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlluLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYllrZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWWt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU1NiIgeT0iNjY1NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYllyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYll1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYllxdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1MSIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXd1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNDQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctYll4dWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMzE5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll6T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWXotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlkwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYlkwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctYll3LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTY5OCIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dtNUNJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT2tPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOENEMzI5MDFGRCIgc291cmNlPSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09rLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09sdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPbE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT2tlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU09rdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExNTksIC0zMzgsIC01NTk2LCAxNTQwXSRbNDkwMiwgLTEzNzEsIC0xODU0LCA1MDhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09sLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPbU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctU09xZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0ctU09tZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctU09jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU09ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1TT3JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU09xdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPcS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAzMjM0XSRbMCwgLTMyNDIsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3NPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctU09zZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1TT3d1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfRy1TT3N1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2NPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU094ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU095T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLVNPeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1TT3ctZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctU094T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NDUsIC01MjQsIDQ3NDEsIDMyODVdJFstNDc0MSwgLTMyOTMsIDc0NSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLVNPeWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1TT3l1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPeS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TT3p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzBlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU096LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwIiB5PSIzNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3NiIgeT0iLTI5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08yLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08zZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08zT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01MTciIHk9IjIzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU08zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU080T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU080ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU08zLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU081T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctU081ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU080LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNPNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TTzZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU082dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU083T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1TTzdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1TTzYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU096T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNPemVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg1NCwgLTI1LCAzNjMyLCAyNV0kWy0zNjQwLCAtNDIsIDE4NDUsIDhdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLVNPX3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBEIiBzb3VyY2U9Il9HLVNPc3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPN3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1TUEJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctU1BBdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLVNQQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLVNQQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjgiIHk9IjM5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctU1BDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctU1BDZWZYRWR1cUhvT0piVVJaUnciIHg9Ii01MyIgeT0iLTM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTMiIHk9IjIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMzBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWJZWmVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzOCIgeT0iLTM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllaLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllhdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYllhT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlliZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctYllidWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctYlliT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYlljLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAzMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1iWWR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1iWWRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctU09fLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLVNQQU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCA1MTYsIDAsIC0xNjY3XSRbMCwgMTY1OSwgMCwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctYllvT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkVENjAyQUUiIHNvdXJjZT0iX0ctYllrT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctYllkLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYllwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZcHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy1iWXBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctYllvZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWJZb3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNDU3LCAwLCAxNDIyXSRbMCwgLTE0MzAsIDAsIDQ0OF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXAtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYllxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1iWXVlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDJBMCIgc291cmNlPSJfRy1iWXFlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1TT2dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctYll2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWJZdmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1iWXV1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctYll1LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDEzNTRdJFswLCAtMTM2MywgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZd09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy1iWXdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWJZMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjlGIiBzb3VyY2U9Il9HLWJZd3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLVNPZ09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWJZMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1iWTJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctYlkxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWJZMC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1iWTFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgxMiwgLTUyNCwgMjEzMywgMTM1NF0kWy0yMTQyLCAtMTM2MywgODA0LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctYlkyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLWJZMnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbGktV2VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDg5MUYwMkNEIj4KLSAgICAgICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfRm9QV0VPeE1FZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRkQ4NTQ2MDBEOCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3IiBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2Vi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExMCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMzEiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbE51ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbE5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsc3ZXLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZFRDYwMkFFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUEzRjMwMUUyIiBuYW1lPSJpbmNsdWRlc1BhdHRlcm5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFNSIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbHN2WC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMTciIG5hbWU9ImJhc2VkT25Qcm9jZXNzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbF9xVU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbF9xVC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMyIiBuYW1lPSJSb2FkbWFwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xzdlktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9hZG1hcCBpcyBhIHNwZWNpYWwgR3VpZGFuY2UgVHlwZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMTA1ODIwMzdDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIG5hbWU9IkFjdGl2aXR5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4KLUV4dGVuZHMgQWN0aXZpdHkgd2l0aCBhbiBhc3NvY2lhdGlvbiB0byBSb2FkbWFwLiAgVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGFsc28gcGFydGljaXBhdGVzIGluIHRoZSBleHRlbnNpb24gb2YgdGhlIERpc2NpcGxpbmUgY2F0ZWdvcnkuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUiIG5hbWU9InJvYWRtYXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzIiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21KYlN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21KYlNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDMiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXTS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxMyIgbmFtZT0iY2hlY2tsaXN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dQT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUE5IiBuYW1lPSJjb25jZXB0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dSZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdJLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdJdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkRBIiBuYW1lPSJndWlkZWxpbmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0xPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0stZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwODkiIG5hbWU9InJldXNhYmxlQXNzZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ05lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ05PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyIgbmFtZT0iRGlzY2lwbGluZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsMTVSLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEJFRTAwREMiPgotICAgICAgICAgICAgICA8Ym9keT5EaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuCi1UYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xSZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUU4NjAxN0UiIG5hbWU9IlByYWN0aWNlIj4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxOUEiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RUZFMDFDQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwREMiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2wxNVRlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBEQyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDI4RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOUEzRjIwMjM4IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMzAxRTIgXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dsX3FRLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTNGMjAyMzgiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIHRyYWNlYWJpbGl0eSBmb3IgYSBQcm9jZXNzIGRvY3VtZW50aW5nIHdoaWNoIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSBiZWVuIHVzZWQgZm9yIGRlZmluaW5nIHRoZSBwcm9jZXNzLiAgSXQgZG9jdW1lbnRzIGFwcGxpY2F0aW9ucyBvZiBhIHBhdHRlcm4gdGhyb3VnaCBjb3B5IGFzIHdlbGwgYXMgcGF0dGVybiBiaW5kaW5nLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBM0YzMDFFQyIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBM0YyMDIzOCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dsX3FTdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dsX3FTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMDAwRTYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAxMDAxNyBfM0FEQzdCNzQwMjJENDExOUE0MDEwMDJCIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR2xfcVRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTlBNDAwMDBFNiI+Ci0gICAgICAgICAgICAgIDxib2R5PklmIHRoZSBQbGFuIGhhcyBiZWVuIGNyZWF0ZWQgYmFzZWQgb24gb25lIG9yIG1vcmUgcHJvY2Vzc2VzIChpLmUuIG90aGVyIFBsYW5zLCBDYXBhYmlsaXR5IFBhdHRlcm5zLCBhIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIGFueSBjb21iaW5hdGlvbiBvZiB0aGVzZSksIHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBjYXB0dXJlcyBhIHRyYWNlIGJhY2sgdG8gdGhlc2Ugc291cmNlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE5QTQwMTAwMkIiIG5hbWU9Il9wcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEU1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExOUE0MDAwMEU2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR2xfcVUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR2xfcVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDExOUE0RjkwMDY5IF8zQURDN0I3NDAyMkQ0MTE5QTRGOTAwNzMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbF9xVmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOUE0RjgwMjBBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhlIFBsYW5uaW5nRGF0YSBjbGFzcyBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTlBNEY5MDA3MyIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMTlBNEY4MDIwQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU2MUEwMzk2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQzAwNjUgXzNBREM3Qjc0MDIyRDQwRkQ1NjFDMDA3OSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJSdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENTYxQTAzOTYiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGFuIEFjdGl2aXR5IHRvIHplcm8gb3IgbW9yZXMgaW5zdGFuY2VzIG9mIHRoZSBSb2FkbWFwIGd1aWRhbmNlIHR5cGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU2MUMwMDc5IiBuYW1lPSJhY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRkQ1NjFBMDM5NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtSmJUZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtSmJUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTFBIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDExRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJULWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IHByb3ZpZGUgZWR1Y2F0aW9uIG1hdGVyaWFsIGZvciB0ZWFjaGluZyBzdGFrZWhvbGRlcnMgc3VjaCBhcyBwcm9qZWN0IG1hbmFnZXJzIG9uIGhvdyB0byBwZXJmb3JtIHByb2plY3RzIHRoYXQgZm9sbG93IHRoaXMgRGVsaXZlcnkgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUIiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMUEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbUpiVS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbUpiVXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMTJFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYgXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDEzMSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtSmJXT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIGd1aWRhbmNlIGRvY3VtZW50cyB0aGF0IGhhdmUgYmVlbiByZWxhdGVkIHRvIGEgRGVsaXZlcnkgUHJvY2VzcyBpbnN0YW5jZSB0byBkZXNjcmliZSBhbmQgY2hhcmFjdGVyaXplIGl0cyBmZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzLiBUaGVzZSBkb2N1bWVudHMgY2FuIGJlIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMgc3VjaCBhcyBpbnRlcm5hbCBtYXJrZXRpbmcgY29tbXVuaWNhdGlvbnMsIHNhbGVzIHRyYWluaW5nIGFuZCBnZW5lcmFsIG1ldGhvZCBlZHVjYXRpb24uICBFeGFtcGxlcyBmb3IgQ29tbXVuaWNhdGlvbnMgTWF0ZXJpYWwgYXJlIEhpZ2hsaWdodCBEb2N1bWVudCwgRmFjdCBTaGVldCwgYW5kIERlbGl2ZXJ5IFByb2Nlc3MgU3BlY2lmaWNhdGlvbiBPdmVydmlldy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkYiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAxMkUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbVNsTS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbVNsTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEZGRDMwMEVGIiBuYW1lPSJCcmVha2Rvd25OZXN0aW5nIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRjAgXzNBREM3Qjc0MDIyRDQxRTBGRkQzMDBGMSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtU2xPT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRkZEMzAwRUYiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb24gcmVwcmVzZW50cyBicmVha2Rvd24gc3RydWN0dXJlIG5lc3RpbmcuICBJdCBkZWZpbmVzIGFuIG4tbGV2ZWwgaGllcmFyY2h5IG9mIEFjdGl2aXRpZXMgZ3JvdXBpbmcgdG9nZXRoZXIgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4KLVRoZSBzdXBlckFjdGl2aXRpZXMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBvZiBhIEJyZWFrZG93biBFbGVtZW50IHRvIGlzIHBhcmVudCBBY3Rpdml0eS4gVGhlIGJyZWFrZG93bkVsZW1lbnRzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gZnJvbSBhbiBBY3Rpdml0eSB0byBpdHMgbmVzdGVkIEJyZWFrZG93biBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxMjRDM0EwMjRFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQjAxMEYgXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtU2xRZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyNEMzQTAyNEUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIG9uZSBtb3JlIHJlZmVyZW5jZSB3b3JrZmxvd3MgZm9yIGEgRGlzY2lwbGluZS4gIFRoZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGRlZmluZSB0aGUgbW9zdCB0eXBpY2FsIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgYSBEaXNjaXBsaW5lLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTI0QzNCMDEzNyIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMTI0QkVFMDBEQyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMTI0QzNBMDI0RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtU2xTT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtU2xSLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRTAxQ0EiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RUZGMDE5QSBfM0FEQzdCNzQwMjJENDI3QTlFRkYwMUE0Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUVGRjAxQTQiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTlFODYwMTdFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlFRkUwMUNBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21TbFQtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21TbFR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUwMDMyNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGNTIwMDQzIF8zQURDN0I3NDAyMkQ0MjdBOUY1MjAwNDUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbVNsVWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGNTAwMzI1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gYmUgdXNlZCB0byBsaW5rIGFsbCBraW5kcyBvZiBnZW5lcmFsIGd1aWRhbmNlIHRvIHRoZSBBY3Rpdml0eSB0aGF0IGlzIGJlaW5nIG1hbmFnZWQgYXMgZ2VuZXJhbCBTdXBwb3J0aW5nIE1hdGVyaWFsLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjUyMDA0NSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUUwRkU5MzAwNzciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBOUY1MDAzMjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbWNXTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbWNXTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOEMwMEM1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4RDAwMTMgXzNBREM3Qjc0MDIyRDQyN0E5RjhEMDAxRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtY1dPT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY4QzAwQzUiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LSAob3IgUHJvY2Vzcy0pIHNwZWNpZmljIGNoZWNrIHBvaW50cy4gIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiByZXZpZXdzIGFuZCBpbnNwZWN0aW9ucyBvbiB0aGUgd29yayBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOEQwMDFEIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5RjhDMDBDNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtY1dQLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtY1dQdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MDAyNTIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkxMDFBOSBfM0FEQzdCNzQwMjJENDI3QTlGOTEwMUI0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21jV1FlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5RjkwMDI1MiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBjb25jZXB0cyBvciB3aGl0ZXBhcGVycyB0byB0aGUgQWN0aXZpdHkgcHJvdmlkaW5nIGltcG9ydGFudCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgZG9pbmcgdGhlIHdvcmsgZGVzY3JpYmVkIGJ5IHRoZSBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5MTAxQjQiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTAwMjUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21jV1NPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21jV1ItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzIyIF8zQURDN0I3NDAyMkQ0MjdBOUY5NTAzMkMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWNXU3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOTQwM0I3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjYW4gcHJvdmlkZSByZWZlcmVuY2VzIHRvIGV4YW1wbGVzIHJlbGV2YW50IHRvIHRoaXMgc3BlY2lmaWMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiAgPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTlGOTUwMzJDIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTBGRTkzMDA3NyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk0MDNCNyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dtbGdKdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dtbGdKZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5OTAzODMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlBMDJEQSBfM0FEQzdCNzQwMjJENDI3QTlGOUEwMkU0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR21sZ0tPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E5Rjk5MDM4MyI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktc3BlY2lmaWMgR3VpZGVsaW5lcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5QTAyRTQiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOTkwMzgzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR21sZ0wtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR21sZ0x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E5RjlFMDE3OCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTlGOUYwMDg5IF8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbWxnTWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZWZlcnMgdG8gUmV1c2FibGUgQXNzZXRzIHNwZWNpZmljIHRvIHRoaXMgQWN0aXZpdHkgKG9yIFByb2Nlc3MpLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBOUY5RjAwOEIiIG5hbWU9Il9hY3Rpdml0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFMEZFOTMwMDc3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTlGOUUwMTc4Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0IiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HblZ1SHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY1N0RDODAxOTciPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY1N0RDODAxOTciIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSlpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEphZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEphLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpiZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKYnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKYi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLWxKWWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTcyIiB5PSIxOTgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSnV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKdi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSndPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKd2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSnhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSnQtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKdU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MjY2IiB5PSI1OTI4IiB3aWR0aD0iNDA0NyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSnl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMzEiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEp5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSngtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKeU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNzUxIiB5PSI5MTM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy1sSjJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEoyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSjVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy1sSjEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTA2IiB5PSI2MTI5IiB3aWR0aD0iMzMxOCIgaGVpZ2h0PSIxNzY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR25WdUlPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyB0aGUgZGVmaW5pdGlvbiBvZiBQcm9jZXNzIFBhY2thZ2UgYW5kIHdoYXQgZWxlbWVudHMgaXQgY2FuIHN0b3JlLiAgVGhlIFByb2Nlc3MgUGFja2FnZSBwYWNrYWdlIGV4dGVuZHMgTWV0aG9kIFBhY2thZ2Ugd2l0aCB0aGUgbmV3IGNvbmNlcHQgb2YgUHJvY2VzcyBQYWNrYWdlLiAgV2hlcmVhcyB0aGUgc3BlY2lhbCBNZXRob2QgUGFja2FnZSBDb250ZW50IFBhY2thZ2VzIHN0b3JlcyBjb3JlIGNvbnRlbnQgZWxlbWVudHMsIHRoZSBQcm9jZXNzIHBhY2thZ2UgaXMgc3BlY2lhbGl6ZWQgaW4gc3RvcmluZyBQcm9jZXNzIEVsZW1lbnRzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCB2ZXJzdXMgUHJvY2VzcyBQYWNrYWdlcyBlbmZvcmNlcyB0aGUgc2VwYXJhdGlvbiBvZiBtZXRob2QgY29udGVudCB2ZXJzdXMgaXRzIGFwcGxpY2F0aW9uIGluIHByb2Nlc3Nlcy4gIE1ldGhvZCBjb250ZW50IGlzIGludGVuZGVkIGJlIHJldXNlZCBpbiBtYW55IHByb2Nlc3Nlcy4gIFRoZXJlZm9yZSwgc3RvcmluZyBtZXRob2QgY29udGVudCBhbmQgcHJvY2VzcyBlbGVtZW50cyBpbiB0aGUgc2FtZSBwYWNrYWdlIHdvdWxkIGVhc2lseSB2aW9sYXRlIHRoaXMgcHJpbmNpcGxlIGFuZCBwcm9jZXNzIG1vZGVscyB3b3VsZCBiZSBiZWNvbWUgdW5uZWNlc3NhcmlseSBjb2hlc2l2ZS4gIFRoZXJlZm9yZSwgVU1BIGVuZm9yY2VzIHRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgYW5kIFByb2Nlc3MgYnkgbm90IGFsbG93aW5nIHRvIHN0b3JlIHRoZW0gaW4gdGhlIHNhbWUgdHlwZSBvZiBwYWNrYWdlLiAiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy1sSmNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSIgc291cmNlPSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSllPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEpkT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MTAiIHk9Ii0zMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzE3IiB5PSItMzkxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MzgiIHk9Ii0zNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMyOCIgeT0iLTI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjM3IiB5PSItMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSmh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy1sSml1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy1sSmlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEppLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKak9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKa09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy1sSmNlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy1sSmN1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODQ3LCA1MDIsIDg0NywgNTAyXSRbODQ3LCAxODAyLCA4NDcsIDE4MDJdJFs2ODgwLCAxODAyLCA2ODgwLCAxODAyXSRbNjg4MCwgMjkxLCA2ODgwLCAyOTFdJFsxNjE0LCAyOTEsIDE2MTQsIDI5MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctbEprLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctbEpZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEptT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLWxKbC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MzciIHk9Ii01MDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKbS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDczIiB5PSItODcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKbnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjg2IiB5PSItMjc3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpvZWZYRWR1cUhvT0piVVJaUnciIHg9IjcxMyIgeT0iLTMwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpwT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii03NzciIHk9Ii0zMzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKcWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLWxKcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLWxKcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctbEpzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEpzZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpyLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctbEp0ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctbEpzLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKbE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLWxKbGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjE0LCA1MywgMTYxNCwgNTNdJFs2ODUzLCA1MywgNjg1MywgNTNdJFs2ODUzLCAtMTkwNSwgNjg1MywgLTE5MDVdJFsyMzksIC0xOTA1LCAyMzksIC0xOTA1XSRbMjM5LCAtNTMwLCAyMzksIC01MzBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLWxKNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwMkU3IiBzb3VyY2U9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLWxKNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy1sSjdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctbEo2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLWxKNS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctbEo2T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY3LCAtODgwLCAxNiwgMzMzNV0kWzY3LCAtMzQwMywgMTYsIDgxMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NllPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy11Nll1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgc291cmNlPSJfRy1sSnR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy1sSjF1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NlotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLXU2WnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy11NlktZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLXU2Wk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzNywgODAsIDMyNTUsIC03OV0kWy0zNjI1LCA4MCwgMTY2NywgLTc5XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLXU2YWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NmF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLXU2YS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzYyIiBzb3VyY2U9Il9HLWxKMXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLWxKeHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Y09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZiLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Y3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLXU2ZWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNyIgeT0iMTUzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZnZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZmLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2Z3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZoZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctdTZnLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2aHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy11NmplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy11NmktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctdTZiT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy11NmJlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODQsIDg4MCwgLTE2LCAtMTgxMV0kWzg0LCAyMTI1LCAtMTYsIC01NjddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTBBQjY2MDAzOUIiIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2a2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2a3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZsLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2bmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2ai1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZrT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQwODkiIHk9Ijc0NzYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZudWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2b2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2b3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11Nm8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2cXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2ck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2cmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2bi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM1MTMiIHk9IjQ1ODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLXU2dS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy11NnZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZ2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2di1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2d2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctdTZ4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2eGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLXU2eHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLXU2dU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctdTZ1ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE1MzkyIiB5PSIyMzUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RVZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RVgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RVVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDY3IiB5PSIxMDMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWFlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEViT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEViZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEViLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RWR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVlT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEVhdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RWEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzMTIiIHk9Ijc0NDIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HLTRFaHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFaXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVpLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFa09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFa2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HLTRFZy1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVoT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE5NTU4IiB5PSI3MzkxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfRy00RTVlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFNnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFN09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFN3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RThPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfRy00RTR1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFNC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUxIiB5PSIxMDMzNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RS11ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA5RiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0ctNEVfdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNjc1IiBoZWlnaHQ9IjExMDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RkFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFVT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFWT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19CMVZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFWdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFWLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0ctNEUtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RV9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA2NTgiIHk9IjE1MzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0IxWE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxWnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxWi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0IxV2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfQjFXdWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMjA5IiB5PSI0MjkyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR25WdUl1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBwcm92aWRlcyBhbiBvdmVydmlldyB0byB0aGUgc3BlY2lmaWNhdGlvbiBvZiBQcm9jZXNzIENvbXBvbmVudHMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctdTZydWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyOEYiIHNvdXJjZT0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZudWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2c2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctdTZzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLXU2dE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy11NnN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctdTZyLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLXU2c09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTU4LCAwLCAyMzM2XSRbMCwgLTIzNDUsIDAsIDU1MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy11NnRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctdTZ0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDMwMyIgc291cmNlPSJfRy00RVVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nmp1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RVllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEVZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03MTEsIC01NTgsIDI4OTUsIDIyODZdJFstMjkxMiwgLTIyOTQsIDY5NCwgNTUwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFWi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RWFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFZWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwM0Q2IiBzb3VyY2U9Il9HLTRFYWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLXU2anVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVmZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HLTRFZXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0ctNEVlLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMyLCA4LCA1MDgwLCAtNDJdJFstNTk2OSwgOCwgMTE0MywgLTQyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFZ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RWdlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9HLTRFa3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIiBzb3VyY2U9Il9HLTRFVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9HLTRFZ3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ctNEVsdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFbXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY4NCIgeT0iLTI5NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0QwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW5lZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyIiB5PSIzMTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RW9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1NyIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVvLWZYRWR1cUhvT0piVVJaUnciIHg9IjY5NSIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVwdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0ctNEVyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEVxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEVzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEVrLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRy00RWxPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM3MSwgLTkzLCAtMTE3MzQsIDI5MDRdJFsxMzA2NCwgLTkzLCAtNDIsIDI5MDRdJFsxMzA2NCwgLTI1MTQsIC00MiwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RXRlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSIgc291cmNlPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy00RWFlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFdWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1MiIgeT0iLTI5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV2LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0ctNEV3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTAxNkIxQjAxRDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM1IiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFeHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgxIiB5PSItMzA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEV6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRy00RXotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfRy00RXplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFMC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFMGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HLTRFMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HLTRFMWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RXR1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFdC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjM4NywgNTAsIDcyMTMsIC01MF0kWy03NTY5LCA1MCwgMjAzMiwgLTUwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfRy00RTJPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDFCRDZBMDIzQiIgc291cmNlPSJfRy00RWd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11Nm51ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRy00RTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEUzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HLTRFM09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfRy00RTJlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFMnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjA5MSwgLTQ4MiwgMTQ2MjEsIDIyNjBdJFstMjA5MSwgLTI0OTcsIDE0NjIxLCAyNDVdJFstMTQ5OTQsIC0yNDk3LCAxNzE4LCAyNDVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEUzLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HLTRFNE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0ctNEU4ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODIxQjAwODciIHNvdXJjZT0iX0ctNEU0ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0ctdTZqdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0ctNEU5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HLTRFOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRy00RTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0ctNEU4dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HLTRFOC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNjIsIC00OTEsIC0xMzEyLCAyMzAyXSRbMTI0NCwgLTIyNDMsIC0zMzAsIDU1MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfRy00RS1PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0ctNEUtZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgc291cmNlPSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy11NnQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxYk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWFlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjFhdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjUzLCAtNDkxLCAzNzI1LCAxNDM5XSRbLTM2OTksIC0xNDM5LCAxMjc4LCA0OTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfQjFiLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX0IxY09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfQjFjZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiIHNvdXJjZT0iX0ctNEVndWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfQjFXT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19CMWRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFlZWZYRWR1cUhvT0piVVJaUnciIHg9IjE5OSIgeT0iLTI5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM3IiB5PSIxMDIzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFmLWZYRWR1cUhvT0piVVJaUnciIHg9IjYyIiB5PSItMTYwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMWd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzAiIHk9IjEwMTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxaGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxaS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxaWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFqZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5NCIgeT0iOTc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0Ixay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixa2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19CMWN1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjFjLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00OTEsIDAsIDI2MDddJFswLCAtMjYxNiwgMCwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMWxPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUyMDA0RCIgc291cmNlPSJfRy00RTRlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFtdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxbU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMW5PZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4NzIiIHk9Ii03NzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixbi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFvdWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MzMiIHk9Ii0zMDAwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTNDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxcXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxcnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixck9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjFzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjFzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjFzT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwNTg5RTMwMTE0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjF0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF0T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX0IxbGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjFsdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMzOCwgNDgyLCAtMTc5NDksIDY1MjddJFszMzgsIDE2NDIsIC0xNzk0OSwgNzY4N10kWzIzNTU0LCAxNjQyLCA1MjY2LCA3Njg3XSRbMjM1NTQsIC02MjU2LCA1MjY2LCAtMjExXSRbMjAwMjMsIC02MjU2LCAxNzM1LCAtMjExXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19CMXQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDM5MDFCQiIgc291cmNlPSJfR19CMVdPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfRy00RS11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0IxdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0JGNDNBMDM5RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfR19CMXYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDE0IiB5PSIxOTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixd2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixd3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMzgiIHk9IjE4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzMkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjF5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjF5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDkiIHk9Ii03MzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0Ixek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0IxeS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMXp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxME9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0IxMGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9HX0Ixei1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19CMTB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfQjExT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjExZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjEwLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0IxMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfQjEyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0dfQjExLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9HX0IxdU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0dfQjF1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNDgyLCAwLCAyMjA5XSRbNTAsIC0yMTQyLCAwLCA1NTBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR201Q0ktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCI+Ci0gICAgICAgICAgICA8Ym9keT4wMzwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX3IwVlJJT3hoRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE2NyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dtNUNMZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IGlzIGEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAmcXVvdDtibGFjayBib3gmcXVvdDsuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICZxdW90O3JlYWxpemF0aW9uJnF1b3Q7IGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCOSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE1MyI+Ci0gICAgICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfb0NRcGNPLWRFZHU1T09lankwNjI0dyIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il9vQ1FwY2UtZEVkdTVPT2VqeTA2MjR3IiBrZXk9ImV4dGVuZCIvPgotICAgICAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICAgIDwvZ2VuZXJhbGl6YXRpb24+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIiBuYW1lPSJpbnRlcmZhY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25DTUl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25DTUllZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIiBuYW1lPSJwcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwOUYiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25WdUUtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25WdUV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODFFMzAzNDIiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR201Q01lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMDU4MUUzMDM0MiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODIxQjAwODciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRTYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5SmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5Sk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01FLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDFCRDZBMDIzQiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBFRiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNEMCIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDAwOSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5RnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5RmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDFEMyIgbmFtZT0iaW50ZXJmYWNlSU8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDA0NSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTAxNkIxQTAzMUUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5SE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTUzIiBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duQ01GLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAyRTciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjMiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI4M0U4QTEwMzQxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duVnVIT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duVnVHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQkEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQiBfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25DTUctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNCQSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSByZWFsaXphdGlvbiByZWxhdGlvbnNoaXBzIGJldHdlZW4gYSBQcm9jZXNzIENvbXBvbmVudCBhbmQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JCIiBuYW1lPSJyZWFsaXplZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0JBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25DTUgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25DTUh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NFIF8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzRDAiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbkNNSk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTEwM0NEIj4KLSAgICAgICAgICAgICAgPGJvZHk+SW5zdGFuY2VzIG9mIHRoaXMgYXNzb2NpYXRpb24gY29udGFpbiB0aGUgbGlzdCBvZiBUYXNrIERlc2NyaXB0b3JzIHRoYXQgcmVwcmVzZW50IGEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkxMDNDRSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNzEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MTAzQ0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hbkw5RS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hbkw5RXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDEwMTZCMUIwMUQzIF8zQURDN0I3NDAyMkQ0MTAxNkIxQjAyMTkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbkw5R09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDEwMTZCMUEwMzFFIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBjb250YWlucyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3QgdHlwZSBpbnN0YW5jZXMgdXNlZCBmb3IgdGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMDE2QjFCMDIxOSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3MSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxMDE2QjFBMDMxRSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0duTDlILWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0duTDlIdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxMTQgXzNBREM3Qjc0MDIyRDQxMDU4OUUzMDEzQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duTDlJZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMjAwNEQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBQcm9jZXNzIENvbXBvbmVudCBpdCByZWZlcnMgdG8uICBBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBleGFjdGx5IG9uZSBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTA1ODlFMzAxM0MiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDEwNTgxRTMwMzQyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDEwNTg5RTIwMDREIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25MOUtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25MOUotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0JGNDM5MDFCQiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzJGIF8zQURDN0I3NDAyMkQ0MjdCRjQzQTAzOUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbkw5S3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBjb250YWlucyBvbmx5IGV4YWN0bHkgb25lIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QkY0M0EwMzlEIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTY3IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QkY0MzkwMUJCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR25WdUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR25WdUZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MyBfM0FEQzdCNzQwMjJENDI4M0VEODkwMzY0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25WdUdPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2MiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBQYWNrYWdlIGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gZGVmaW5lIEJyZWFrZG93biBhbmQgUHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgUHJvY2VzcyBQYWNrYWdlIGluc3RhbmNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyODNFRDg5MDM2NCIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxNTMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjgzRUQ4OTAzNjIiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGMkExQjAyRTciIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbnMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR29PZTUtZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFFRDY4MkIwMTcwIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRDY4MkIwMTcwIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR19MbWV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MzciIGhlaWdodD0iMTk5OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1mLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1nZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1nLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtaGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9HX0xtZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0dfTG1lT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUzOTMiIHk9Ijg4MDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDFCNjAwRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX0xtaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNTE0NyIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1rT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1rdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbWstZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1sT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfTG1sZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfTG1oLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19MbWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM1MyIgeT0iNjM4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbWx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTEwNDU1MDIwOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1tZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1tdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI1NDM1IiBoZWlnaHQ9IjMyNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1uT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbWwtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtbU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NTUwIiB5PSIxNDU0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXB1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1xZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfTG1xdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTM5IiBoZWlnaHQ9IjE5OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX0xtcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1yT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfTG1ydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX0xtcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19MbXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19MbXRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19MbXAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX0xtcU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzQyIiB5PSIxMTk1NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1FPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjQ5MDA4NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDM2IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3U2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1N1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3Uy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1RPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3VGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1R1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1QtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd1FlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3UXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NzUiIHk9Ijg4MjIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9HX1V3Vk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdXdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1ctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdYT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd1hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0dfVXdYLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0dfVXdVZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd1V1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjc1NSIgeT0iMTM5NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2hPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0dfVXdpT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTM4IiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3aWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3amVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3ai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HX1V3a2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2t1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR19Vd2stZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR19Vd2hlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3aHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjU4IiB5PSIzNTk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR29PZTZlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBkZWZpbml0aW9uIG9mIHRleHR1YWwgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSBmb3IgUHJvY2Vzc2VzIHRoYW4gZm9yIE1ldGhvZCBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBUaGUgcmF0aW9uYWxlIGZvciB0aGlzIGNhbiBiZSBmb3VuZCBpbiBwYWNrYWdlIE1ldGhvZCBVbml0cyBpbiB3aGljaCB0aGUgZ3JhbnVsYXJpdHkgb2YgTWV0aG9kIFVuaXRzIGZvciB0aGVzZSBlbGVtZW50cyBoYXMgYmVlbiBkZWZpbmVkIGRpZmZlcmVudGx5LiAgV2hlcmVhcyBhIENvbnRlbnQgRGVzY3JpcHRpb24gTWV0aG9kIFVuaXQgaXMgY3JlYXRlZCBmb3IgZXZlcnkgQ29udGVudCBFbGVtZW50LCBQcm9jZXNzIGlzIG1haW50YWluZWQgYXMgYSB3aG9sZSBpbiBhIFByb2Nlc3MgQ29tcG9uZW50IE1ldGhvZCBVbml0LiAgVGhlcmVmb3JlIHRoZSBwYWNrYWdlIE1ldGhvZCBDb3JlIERlc2NyaXB0aW9uIGNvbnRhaW5zIGEgdGF4b25vbXkgb2Ygc3BlY2lhbCBDb250ZW50IERlc2NyaXB0aW9uIHNwZWNpYWxpemF0aW9uIGFuZCB0aGUgUHJvY2VzcyBEZXNjcmlwdGlvbnMgcGFja2FnZSBjb250YWlucyBleHRlbmRlZCB2ZXJzaW9uIG9mIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlIHdoaWNoIG1lcmdlIG5ldyBhdHRyaWJ1dGVzIGZvciBkZXNjcmlwdGlvbiBpbnRvIHRoZXNlIGNsYXNzZXMgdmlhIHBhY2thZ2UgbWVyZ2UuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OEM4MDAzQkEiIHNvdXJjZT0iX0dfTG1wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1kdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3WnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd1pPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdZZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3WXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtMTAwNywgMCwgMjE0Ml0kWzAsIC0yMTUwLCAwLCA5OTldIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdaLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3YU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXdhZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENBNDAyRDEiIHNvdXJjZT0iX0dfTG1sdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfTG1wdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Yk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3Yi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd2JlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdhdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd2EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUwLCAtMTY0MiwgMCwgMjExNl0kWy01MCwgLTI3NjAsIDAsIDk5OV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2NPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdjZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2N1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0U5MDJDQSIgc291cmNlPSJfR19Vd1FPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3ZHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2MtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3ZE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils4NTUsIC01ODQsIC0xMjc4LCAxODU0XSRbODU1LCAtMTg2MiwgLTEyNzgsIDU3NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd2VlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdldWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfR19Vd2UtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4QzZGMDE5NyIgc291cmNlPSJfR19MbWR1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfR19MbWh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR19Vd2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HX1V3Zi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfR19Vd2ZPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9HX1V3ZmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNDE0LCAtMTAwNywgMTc2OSwgMTgzN10kWy00MTQsIC0yMjc3LCAxNzY5LCA1NjddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0dfVXdndWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3Zy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0dfVXduZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENDQzAzNkEiIHNvdXJjZT0iX0dfTG1odWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0dfVXdoT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3b09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dfVXdvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HX1V3by1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfR19Vd29lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0dfVXdudWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfR19Vd24tZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgsIC01NzUsIC04LCAyMDE1XSRbLTgsIC0xODIwLCAtOCwgNzcwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9HX1V3cE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfR19Vd3BlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25lNER1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYyQTFCMDJFNyI+Ci0gICAgICAgICAgICA8Ym9keT4wNDwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX0ladF9NT3hNRWR1T05yTVJnbXo0OEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEZEODkxRjAyQ0QiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTBEMUI2MDBEOCIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5OENDQzAzNkEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI3RDAwODQiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR25lNEctZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMzc2MjdEMDA4NCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfRllicndleUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfRllicndPeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfRlFZakFPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDExMDM4NyIgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDNkYwMTk3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkU0IiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dub3BCT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyRTQiPgotICAgICAgICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfN0pFVXdleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfN0pFVXdPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfNl9QRFVPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzNTIiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hbnh5OHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzUyIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1pibllJZXlIRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1pibllJT3lIRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1pTLVpnT3lIRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEzNzYyODMwMTVBIiBuYW1lPSJob3d0b1N0YWZmIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHk5ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTM3NjI4MzAxNUEiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfWFRyM3dleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfWFRyM3dPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfWEtKaFFPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTEwNDU1MDIwOCIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4Q0E0MDJEMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRTEwNDc0MDExQSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3MSIgbmFtZT0ic2NhbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR254eS11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM3MSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2NsTTBzZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2NsTTBzT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2NhZUxZT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzdBIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dueHlfZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzN0EiPgotICAgICAgICAgICAgICAgIDxib2R5PkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il82TE96Z2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il82TE96Z095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il82RExxd095SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NCIgbmFtZT0icmlza0xldmVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0duN2o4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODQiPgotICAgICAgICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZ1Z2Um9leUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZ1Z2Um9PeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZzZQczRPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAzODUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ajllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4NSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9ZWndTZ2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9ZWndTZ095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9ZUFVrSU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM4RSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbjdqLU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMzhFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tazdDZ2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tazdDZ095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8tYU1aTU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM5OCIgbmFtZT0idHlwZU9mQ29udHJhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR243ai0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDM5OCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0lMMW5nZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0lMMW5nT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0lFaXNzT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxMDQ3NDAxMUEiIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDODAwM0JBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMTA0MTEwMzg3Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FDIiBuYW1lPSJzY29wZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVOC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FDIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9lRW1WY2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9lRW1WY095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9kN052OE95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDNBRCIgbmFtZT0idXNhZ2VOb3RlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb0ZVOXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwM0FEIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3UxQU5BZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3UxQU5BT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3VyZDJnT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVEN0I0OTAwODYiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OThDRTkwMkNBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFFMEQxQjYwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRDdCNjUwMzk0IiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29GVS0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUQ3QjY1MDM5NCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9IU2VXa2V5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9IU2VXa095SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9IS2JOME95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzNzVFMDQwMzkwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNTAxNzMgXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvRlVfdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPgotICAgICAgICAgICAgICA8Ym9keT5MaXN0IHRoZSBzdGVwcyB0aGF0IGhhdmUgYmVlbiBzZWxlY3RlZCB0byBiZSBwZXJmb3JtZWQgZm9yIHRoZSBpbnN0YW5jZSBvZiB0aGUgVGFzayBEZXNjcmlwdG9yLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzc1RTA1MDE3NSIgbmFtZT0iX3Rhc2tEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwMDkiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjM3NUUwNDAzOTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hb09lNXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hb09lNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiIgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HcEgyd09mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY1N0FDODAzNUUiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNTdBQzgwMzVFIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1BLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQXotQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1DT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LURPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LURlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1ELWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEF6LUFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEF6LUF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM0OTUiIHk9IjM4NDMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LU4tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MDQiIGhlaWdodD0iMTYyNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1QT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1QZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1QdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1QLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBei1RT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1RZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotUXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBei1OT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1OZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MDQiIHk9IjM3MDgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEF6LWplZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXota2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXota3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotbGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotbC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LW1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQXotaXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotaS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDIxOSIgeT0iOTk5Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZELWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBOXZFLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTA2IiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEE5dkhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hBOXZIdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEE5dkVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dkVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAxNzYiIHk9IjY2NDYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ3dWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW1zIHNob3dzIHRoZSBkZWZpbml0aW9uIG9mIE1ldGhvZCBQbHVnaW5zLiBNZXRob2QgUGx1Z2lucyBleHRlbmQgZWFjaCBvdGhlciBhbmQgYXJlIHRoZSBjb250YWluZXIgb2YgYWxsIE1ldGhvZCBQYWNrYWdlcy4iLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3IiBzb3VyY2U9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1GZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBei1GT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk5OCIgeT0iMzE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1HT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ4MiIgeT0iNzY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1IT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEF6LUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM4NyIgeT0iNzc4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotSHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM4MiIgeT0iMjcxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1JZWZYRWR1cUhvT0piVVJaUnciIHg9Ii03OTIiIHk9Ii0zMDMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LUt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1MZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotTHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1MT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1MLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1NT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1FZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1FdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI2MDcsIC0yNDUsIDI2MDcsIC0yNDVdJFs0ODE3LCAtMjQ1LCA0ODE3LCAtMjQ1XSRbNDgxNywgMTgzNywgNDgxNywgMTgzN10kWzU1MCwgMTgzNywgNTUwLCAxODM3XSRbNTUwLCA1NzUsIDU1MCwgNTc1XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotUS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotQU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotUi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1TLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjMiIHk9IjM2NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LVRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1UdWZYRWR1cUhvT0piVVJaUnciIHg9IjExMzkiIHk9Ii0yODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1VT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1VdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1VZWZYRWR1cUhvT0piVVJaUnciIHg9IjQzNiIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjUiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotV3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotVy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotWWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1YLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1ZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1ZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1ST2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1SZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIyNTIsIC0xMjcsIC03MDk1LCAtMjVdJFs2NzM5LCAtMTI3LCAtMjYwNywgLTI1XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDQ5IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQXotYXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1idWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MiIgeT0iLTg1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1jZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjAwIiB5PSItODg3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTI3MSIgeT0iLTIzMyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEF6LWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1lT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjIxIiB5PSIzMjMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEF6LWdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQXotZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotaE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1ndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBei1oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQXotaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQXotaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hBei1odWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBei1aLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1hT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMjUyLCA1MCwgLTIyNTIsIDUwXSRbLTQ0ODcsIDUwLCAtNDQ4NywgNTBdJFstNDQ4NywgMTg2MiwgLTQ0ODcsIDE4NjJdJFstMTIxOSwgMTg2MiwgLTEyMTksIDE4NjJdJFstMTIxOSwgODEyLCAtMTIxOSwgODEyXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQXotbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQXotaWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2QWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQXotbXVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBei1tLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEzMTIsIC04MjEsIC0zNTY0LCAyMTc1XSRbNDAwNCwgLTI0NzIsIC04NzIsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZCT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBOXZCdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBREMwMTAyOEQiIHNvdXJjZT0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBei1pZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2RE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZDdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBOXZCLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg4OSwgLTU4NCwgMzU4MSwgMjMxMV0kWy0zNjQ5LCAtMjM3MCwgODIxLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2RGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZEdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQTl2SC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMENDMEEwMUQ3IiBzb3VyY2U9Il9IQXotTS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQTl2RC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQTl2SS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQTl2SU9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hBOXZJZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE0MTMsIDgxMiwgLTMyNTksIC0xODc5XSRbMzY5MSwgMjExNiwgLTk4MiwgLTU3NV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZKdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEE5dkotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hBOXZLT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjUxOEJENzAxRTMiIHNvdXJjZT0iX0hBei1BT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hBOXZELWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dkxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2THVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZMT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hBOXZLZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEE5dkt1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk5MCwgNTc1LCAzNjgzLCAtMjIxOF0kWy0zNzQyLCAyMjE4LCA5MzEsIC01NzVdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQTl2TC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hBOXZNT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUM1RjAwMkUxIiB0eXBlPSJDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOb3RlIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2TXVmWEVkdXFIb09KYlVSWlJ3IiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiIGRlc2NyaXB0aW9uPSJ7dmFyaWFiaWxpdHlTcGVjaWFsRWxlbWVudC50eXBlKCkgPT0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudC50eXBlKCl9IDoge3ZhcmFiaWxpdHkgY2FuIG9ubHkgYmUgZGVmaW5lZCBiZXR3ZWVuIENvbnRlbnRFbGVtZW50cyBvZiB0aGUgc2FtZSBzdWJ0eXBlLCBlLmcuIFJvbGVzIHdpdGggUm9sZXMsIGJ1dCBub3QgUm9sZXMgYW5kIFRhc2tzfSIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dk0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjcyMyIgeT0iNzc4OCIgd2lkdGg9Ijk1OTYiIGhlaWdodD0iMTYyNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2TnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQTl2T3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjkxMiIgaGVpZ2h0PSI0MTY1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkVudW1lcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2UU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2UWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2UXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2US1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2Uk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hBOXZOLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hBOXZPT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTk1IiB5PSIyMjA1Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDk1MDAxRjUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hBOXZTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0OTYxIiBoZWlnaHQ9IjE1NzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hBOXZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEE5dlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2VHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQTl2VC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQTl2VU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQkhnQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ0EtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQTl2UnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgc2hvd0xpc3RTaWduYXR1cmU9InRydWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEE5dlItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjM4OSIgeT0iMTE1OSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnaWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NjIwMjBGIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQkhnamVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjg3OCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2tlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ2t1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2xlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ2x1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ2wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdtT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJIZ2l1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJIZ2ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA2MyIgeT0iOTczOCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGduT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQkhnbmVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCSGdvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ291ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3BPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3BlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJIZ3B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3AtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCSGdxT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJIZ211ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIHNob3dMaXN0U2lnbmF0dXJlPSJ0cnVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCSGdtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NjYiIHk9IjQxOTQiIHdpZHRoPSI2OTg1IiBoZWlnaHQ9IjE1ODMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FBMEFFMDM5RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJRcVNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxVk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCUXFSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFSLWZYRWR1cUhvT0piVVJaUnciIHg9IjMwMzUiIHk9IjgyOTUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEJRcWEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE1NzQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFjT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFjdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxZHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hCUXFhT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFhZWZYRWR1cUhvT0piVVJaUnciIHg9IjQ1MTciIHk9Ijk3MTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0dwSDJ4T2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGlzIGRpYWdyYW0gc2hvd3MgaG93IGNvbnRlbnQgZWxlbWVudHMgY2FuIGRlZmluZSB2YXJpYXRpb25zIG9mIG9uZSBhbmQgYW5vdGhlci4gICIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCSGdxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTAiIHNvdXJjZT0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJIZ3J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQkhnci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJIZ3JlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyMDMiIHk9Ii0zNDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXA4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcDhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI4NyIgeT0iLTI2NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFwOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXA5T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02MDQiIHk9IjIzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcDl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcC1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTcwNiIgeT0iLTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXAtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFwLXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDIiIHk9IjI4MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFwXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXBfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQlFxQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hCUXFBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcUJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcUNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJIZ3F1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJIZ3EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODU1LCA3ODcsIDg1NSwgNzg3XSRbODU1LCAxNjUxLCA4NTUsIDE2NTFdJFs2NjgwLCAxNjUxLCA2NjgwLCAxNjUxXSRbNjY4MCwgLTUwLCA2NjgwLCAtNTBdJFszNDg4LCAtNTAsIDM0ODgsIC01MF0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZUF0dGFjaG1lbnQiIHNvdXJjZT0iX0hBOXZNZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEJRcURlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEJRcUR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEyNywgLTgyMSwgMTg2LCAxNDM5XSRbLTMxMywgLTIyNjAsIDAsIDBdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxRC1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFFT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQlFxSS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTU4QjYwMThCIiBzb3VyY2U9Il9IQkhnaWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQkhnbWVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcUtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQlFxSi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxSk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxSmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3OTUsIC00NDgsIC0xNzQ0LCA0NzgzXSRbNzk1LCAtNDQ1MywgLTE3NDQsIDc3OF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCUXFLdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcUstZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCUXFYdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQTBEMzAyNDUiIHNvdXJjZT0iX0hCUXFSZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCUXFZdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCUXFYLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCUXFZT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1OSwgLTMxNywgLTE0NTUsIDMzMDddJFsxNTksIC0yODMxLCAtMTQ1NSwgNzkzXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEJRcVplZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQlFxWnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEJRcWQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyIgc291cmNlPSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEJRcVotZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFmZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJRcWUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxZi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI0MzUiIHk9IjE5MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxZ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzIwIiB5PSItMzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzk0IiB5PSI0MDciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCUXFoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMyNSIgeT0iMzM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hCUXFrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEJRcWotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxay1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQlFxbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjcwMUIxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJRcW1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEJRcW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQlFxbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQlFxZU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQlFxZWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3ODcsIDIwMywgNzg3LCAyMDNdJFsxOTEzLCAyMDMsIDE5MTMsIDIwM10kWzE5MTMsIDEzNjMsIDE5MTMsIDEzNjNdJFs4LCAxMzYzLCA4LCAxMzYzXSRbOCwgNDQ4LCA4LCA0NDhdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hCYWE5T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU2MDAxNzAiIHNvdXJjZT0iX0hCUXFaLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hCSGdtZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYTktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQmFhLXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hCYWEtT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hCYWE5ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hCYWE5dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NDgsIDUwLCA0NzMyXSRbMCwgLTQzOTQsIDUwLCA3ODddIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IQmFhLS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hCYWFfT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9KeFBmNGV4WkVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfSnhQZjRPeFpFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEJIZ21lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEE5dlJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9KeFBmNU94WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9KeFBmNXV4WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0p4UGY1LXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9KeFBmNWV4WkVkdU9Ock1SZ216NDhBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9KeFBmNHV4WkVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0p4UGY0LXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWy0yMywgLTMwLCA4OCwgMTAzXSRbLTExNiwgLTE2MCwgLTUsIC0yN10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTU3QjIwMDA4NyIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWFfZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hCYWJBZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hCYWJCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEJhYkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQmFiQnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEJhYV91ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEJhYV8tZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzAxMyIgeT0iNTIzIiB3aWR0aD0iMzE0OCIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T25zT3huRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnMteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX2s5T250T3huRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250ZXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250dXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2s5T250LXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfazlPbnVPeG5FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9rOU9udWV4bkVkdXdPYmtJQTZ4MWdBIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfazlPbnNleG5FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfazlPbnN1eG5FZHV3T2JrSUE2eDFnQSIgeD0iNjMyIiB5PSIzMjIzIiB3aWR0aD0iMzE0OCIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZVT3huRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdlUteG5FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX3p6THZWT3huRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWZXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWdXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3p6THZWLXhuRWR1d09ia0lBNngxZ0EiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfenpMdldPeG5FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il96ekx2V2V4bkVkdXdPYmtJQTZ4MWdBIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfenpMdlVleG5FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfenpMdlV1eG5FZHV3T2JrSUE2eDFnQSIgeD0iNTM5NiIgeT0iMzIyNSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3BIMnh1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxUaGUgTWV0aG9kLVBsdWdpbiBwYWNrYWdlIGRlZmluZXMgZXh0ZW5zaWJpbGl0eSBhbmQgdmFyaWFiaWxpdHkgbWVjaGFuaXNtcyBmb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEl0IHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkgaW4gZGVmaW5pbmcgZGlmZmVyZW50IHZhcmlhbnRzIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYnkgYWxsb3dpbmcgY29udGVudCBhbmQgcHJvY2VzcyBmcmFnbWVudHMgdG8gYmUgcGx1Z2dlZC1pbiBvbiBkZW1hbmQgY3JlYXRpbmcgdGFpbG9yZWQgb3Igc3BlY2lhbGl6ZWQgY29udGVudCBvbmx5IHdoZW4gaXQgaXMgcmVxdWlyZWQgYW5kIHdoaWNoIGNhbiBiZSBtYWludGFpbmVkIGFzIHNlcGFyYXRlIHVuaXRzIHdvcmtlZCBvbiBieSBkaXN0cmlidXRlZCB0ZWFtcy4mI3hBO3xNZXRob2RzIGFuZCBQcm9jZXNzZXMgYXJlIG5ldmVyIGRldmVsb3BlZCBpbiBpc29sYXRpb24uICBNYW55IGNvbmN1cnJlbnQgdGVhbXMgb2YgcHJvY2VzcyBlbmdpbmVlcnMgbWlnaHQgd29yayBvbiBkaWZmZXJlbnQgb3IgdGhlIHNhbWUgcGFydHMgb2YgYSBNZXRob2QgQ29udGVudCBvciBwYXJ0aWN1bGFyIFByb2Nlc3Nlcy4gIFRoZXkgaGF2ZSB0byBlaXRoZXIgY29vcmRpbmF0ZSB0aGVpciB3b3JrIG9yIHByZWZlcmFibHkgdG8gbW9kdWxhcml6ZSBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBkZWZpbml0aW9ucyB0aGF0IHRoZXkgY2FuIHdvcmsgb24gaW4gaXNvbGF0aW9uIHdpdGhvdXQgYW55IHNoYXJlZCByZXNvdXJjZSBwcm9ibGVtcy4mI3hBO3xNb3Jlb3Zlciwgd29yayBvbiBhIGRldmVsb3BtZW50IFByb2Nlc3MgaXMgbmV2ZXIgZmluYWwgYmVjYXVzZSB0aGV5IGhhdmUgdG8gYmUgdGFpbG9yZWQgZm9yIGV2ZXJ5IHNwZWNpZmljIHByb2plY3Qgc2l0dWF0aW9uLiAgVG8gYXZvaWQgZGV2ZWxvcGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgZnJvbSBzY3JhdGNoIGZvciBldmVyeSBzcGVjaWZpYyBwcm9qZWN0IHNpdHVhdGlvbiBhIHRydWx5IHJldXNhYmxlIFByb2Nlc3MgYWxsb3dzIGRlZmluaW5nIG1hbnkgZGlmZmVyZW50IHZhcmlhdGlvbnMgb24gaXQuICBUaGVyZWZvcmUsIHRhaWxvcmluZyBhbmQgZXh0ZW5zaW9uIG9mIHByZS1kZWZpbmVkIHByb2Nlc3NlcyBpcyBhIGtleSByZXF1aXJlbWVudCBmb3Igb3JnYW5pemF0aW9ucyBhZG9wdGluZyBhbmQgaW1wbGVtZW50aW5nIHByb2Nlc3Nlcy4gICBGb3IgZXhhbXBsZSwgaW1hZ2UgYSBzY2VuYXJpbyBpbiB3aGljaCBhIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBwdXJjaGFzZXMgYSB0aGlyZC1wYXJ0eSBEZWxpdmVyeSBQcm9jZXNzIGZyb20gYSBtZXRob2QgdmVuZG9yIGFuZCBpdHMgdW5kZXJseWluZyBtZXRob2QgY29udGVudC4gIFdoaWxlIGltcGxlbWVudGluZyB0aGUgcHJvY2VzcyBpbiB0aGVpciBvcmdhbml6YXRpb24gdGhleSBtaWdodCBkaXNjb3ZlciB0aGF0IHRoZXkgd291bGQgbGlrZSB0byB0YWlsb3IgdGhlIHByb2Nlc3MgdG8gdGhlaXIgcGFydGljdWxhciBuZWVkcyBhbmQgb3JnYW5pemF0aW9uIHNwZWNpZmljIHZhcmlhdGlvbnMuICBJZiB0aGV5IHdvdWxkIGRpcmVjdGx5IG1vZGlmeSB0aGUgcHVyY2hhc2VkIHByb2Nlc3MgdGhleSB3b3VsZCBtaW5nbGUgdGhlaXIgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIHdpdGggdGhlIG9yaWdpbmFsIHByb2Nlc3MuICBJZiBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBwcm9jZXNzIGlzIHJlbGVhc2VkIGJ5IHRoZSB2ZW5kb3IgaXQgd291bGQgYmUgdmVyeSBoYXJkIGZvciB0aGVtIHRvIGZpbmQgYW5kIHJlcHJvZHVjZSB0aGVzZSBjaGFuZ2VzIHRvIHRoZSBuZXcgcHJvY2VzcyB2ZXJzaW9uLiYjeEE7fFRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIG1vZHVsYXJpemF0aW9uIGFuZCBleHRlbnNpYmlsaXR5IG9mIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMgdG8gVU1BLiAgSW4gb3RoZXIgd29yZHMsIGl0IHN1cHBvcnRzIHRhaWxvcmluZyBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzIHdpdGhvdXQgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZW0sIGJ1dCBieSBkZXNjcmliaW5nIGNoYW5nZXMgZnJvbSBhIHNlcGFyYXRlIHVuaXQgY2FsbGVkIGEgTWV0aG9kIFBsdWctaW4uICBUaGlzIG5ldyBjYXBhYmlsaXR5IGlzIGFjaGlldmVkIGJ5IGFkZGluZyBuZXcgY29uY2VwdHMgdG8gdGhlIG1ldGEtbW9kZWw6ICYjeEE7fC0gQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQbHVnaW5zLiAgTWV0aG9kIFBsdWdpbnMgYXJlIGNvbnRhaW5lcnMgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGlzIHBhcnQgb2YgZXhhY3RseSBvbmUgTWV0aG9kIFBsdWdpbiwgaS5lLiBNZXRob2QgUGx1Z2lucyBwYXJ0aXRpb24gdGhlIHNwYWNlIG9mIGFsbCBNZXRob2QgRWxlbWVudHMuICAmI3hBO3wtIE1ldGhvZCBQbHVnaW5zIGNhbiBkZWZpbmUgZXh0ZW5zaW9ucyB0byBvdGhlciBNZXRob2QgUGx1Z2lucy4gIE9uZSBNZXRob2QgUGx1Z2luIGNhbiBkZWZpbmUgZXh0ZW5zaW9ucyBmb3IgbWFueSBvdGhlciBQbHVnaW5zIGFuZCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBQbHVnaW5zLiYjeEE7fC0gVGhlIE1ldGhvZCBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIGFkZHMgYSBuZXcgc2V0IG9mIHJlbGF0aW9uc2hpcHMgYW5kIHNlbWFudGljcyB0byBzcGVjaWZpYyBNZXRob2QgRWxlbWVudHMgdGhhdCBkZWZpbmUgaG93IHRoZXNlIE1ldGhvZCBFbGVtZW50cyBjYW4gZXh0ZW5kIGVhY2ggb3RoZXIgYWNyb3NzIHRoZSBib3VuZGFyeSBvZiBNZXRob2QgUGx1Z2lucyBvciBNZXRob2QgUGFja2FnZXMgKHRvIGFsbG93IG1vZHVsYXJpemF0aW9uIGV2ZW4gd2l0aGluIG9uZSBNZXRob2QgUGx1Z2luKS4mI3hBO3xUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlZmluZSB0aGUgZGV0YWlsZWQgcnVsZXMgZm9yIHRoZXNlIGV4dGVuc2lvbnMgZm9yIHNwZWNpZmljIE1ldGhvZCBFbGVtZW50cy4mI3hBOyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JuSWVFZXhaRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9SbkllRU94WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IQmFhX2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9rOU9uc094bkVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVGT3haRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JuSWVGdXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUm5JZUdPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SbkllRi14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUm5JZUZleFpFZHVPTnJNUmdtejQ4QSIgeD0iLTI3IiB5PSI4OTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JuSWVFdXhaRWR1T05yTVJnbXo0OEEiIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1JuSWVFLXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzAsIDU1NiwgMjM4MSwgLTIxNDNdJFstMjM4MSwgMjE0MywgMCwgLTU1Nl0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfdzN2TnNleHVFZHVNMTR1bldhcVA1USIgZWxlbWVudD0iX3czdk5zT3h1RWR1TTE0dW5XYXFQNVEiIHNvdXJjZT0iX0hCYWFfZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX3p6THZVT3huRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnRPeHVFZHVNMTR1bldhcVA1USIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfdzN2TnR1eHVFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il93M3ZOdU94dUVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3czdk50LXh1RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il93M3ZOdGV4dUVkdU0xNHVuV2FxUDVRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il93M3ZOc3V4dUVkdU0xNHVuV2FxUDVRIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il93M3ZOcy14dUVkdU0xNHVuV2FxUDVRIiBwb2ludHM9Ils4LCAyMSwgLTgzLCAtODFdJFszNSwgMTIzLCAtNTYsIDIxXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQNE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMEZCIj4KLSAgICAgICAgICA8Ym9keT4wMzwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUm5JZUVPeFpFZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxRTBEMEVEMDEwNCIvPgotICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX3czdk5zT3h1RWR1TTE0dW5XYXFQNVEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiLz4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQOHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4KLSAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQURDMDEwMjhEIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNTE4QkQ3MDFFMyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSIvPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUFFNzA3MzAzQjgiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9Hb1lQOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiIG5hbWU9Im1ldGhvZFBhY2thZ2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ1Ij4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUZ3ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1Gd09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFQSIgbmFtZT0iYmFzZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28tRnl1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvLUZ5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDk2MjAyMEYiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvWVAtZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDk2MjAyMEYiPgotICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLgotQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4KLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4QjYwMThCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSIgbmFtZT0iTWV0aG9kRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb1lQX3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5NTAwMUY1Ij4KLSAgICAgICAgICAgIDxib2R5Pk1ldGhvZCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gYWRkcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdmlhIHBhY2thZ2UgbWVyZ2UgdG8gTWV0aG9kIEVsZW1lbnQgZGVmaW5lZCBpbiBNZXRob2QgQ29yZSBuZWVkZWQgZm9yIHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaWJpbGl0eSBjYXBhYmlsaXRpZXMgaW50cm9kdWNlcyBpbiB0aGlzIHBhY2thZ2UuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MThBQ0EwQTAwRUIiIG5hbWU9InN1cHByZXNzZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBNC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE4QUNBMEEwMEVCIj4KLSAgICAgICAgICAgICAgPGJvZHk+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il9Hb2lBNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJfNUdjWUFPaWVFZHVRYnVZNlV3TVNRZyI+Ci0gICAgICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIzOEU5NEQwMDNGIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb2lBNS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIzOEU5NEQwMDNGIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzlyUVBrZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il85clFQa095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOWh0NUVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjZCMDAyMDJFQyIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE2dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAwMjAyRUMiPgotICAgICAgICAgICAgPGJvZHk+VmFyaWFiaWxpdHkgVHlwZSBpcyBhbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUM2QTMwMzM4IiBuYW1lPSJuYSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvaUE3ZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY5QzZBMzAzMzgiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMUYwM0MwIiBuYW1lPSJjb250cmlidXRlcyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvckswdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxRjAzQzAiPgotICAgICAgICAgICAgICA8Ym9keT5Db250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxODAxRTAiIG5hbWU9ImV4dGVuZHMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hb3JLMWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNkIwMTgwMUUwIj4KLSAgICAgICAgICAgICAgPGJvZHk+RXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLgotYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IGVsZW1lbnQgYXJlIGluaGVyaXRlZCBhbmQgdXNlZCB0byBwb3B1bGF0ZSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBhdHRyaWJ1dGVzLiAgSWYgdGhlIHNwZWNpYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgaW5oZXJpdGVkIHZhbHVlcyBhcmUgaWdub3JlZC4gIAotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuCi0KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNkIwMUMwMjg2IiBuYW1lPSJyZXBsYWNlcyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvcksyT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY2QjAxQzAyODYiPgotICAgICAgICAgICAgICA8Ym9keT5SZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LgotCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NjI4RTRCMDEzMyIgbmFtZT0ibG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NjI4RTVFMDEzQiIgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDVDOEQ2NzAwMkE5IiBuYW1lPSJleHRlbmRzUmVwbGFjZXMiLz4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzN1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSI+Ci0gICAgICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi1WYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotVmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLgotVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfSnhQZjRPeFpFZHVPTnJNUmdtejQ4QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxREU0OTUwMDFGNSIvPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY2QjBFNjAzQzciIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGNkIwMDIwMkVDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR29ySzR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjZCMEU2MDNDNyI+Ci0gICAgICAgICAgICAgIDxib2R5PklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0dvMDcwZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Ym9keT5uYTwvYm9keT4KLSAgICAgICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMiIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GMC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRjB1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiIG5hbWU9IlNlY3Rpb24iPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28wNzAtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCI+Ci0gICAgICAgICAgICA8Ym9keT5TZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiAKLUZvciBleGFtcGxlLCB3aGVuIGEgVGFzayBjb250cmlidXRlcyB0byBhbm90aGVyIFRhc2sgaXRzIFByZXNlbnRhdGlvbiBhc3NvY2lhdGlvbiBpcyBjb250cmlidXRlZCBpbmNsdWRpbmcgaXRzIFNlY3Rpb25zIChpLmUuIGl0cyBTdGVwcyksIHdoaWNoIGFyZSBtb2RlbGVkIGFzIHBhcnRzIG9mIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgU2VjdGlvbnMgY2FuIGJlIG5lc3RlZCBhbmQgdGhlcmVmb3JlIFRhc2sgRGVzY3JpcHRpb25zIGNhbiBiZSBmbGV4aWJseSBvcmdhbml6ZWQgaW4gU3RlcHMgd2l0aCBzdWItU3RlcHMuICBTZWN0aW9ucyBhcmUgVmFyaWFiaWxpdHkgRWxlbWVudHMgdGhlbXNlbHZlcywgc28gdGhleSBjYW4gY29udHJpYnV0ZSB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBtb2RlbCBhIFRhc2sgc3RlcCBhcyBhIFNlY3Rpb24gaW5zdGFuY2Ugd2l0aG91dCByZWxhdGluZyBpdCB0byBhIFRhc2sgRGVzY3JpcHRpb24gdGhhdCBkaXJlY3RseSBjb250cmlidXRlcyB0byAob3IgcmVwbGFjZXMpIGFub3RoZXIgU2VjdGlvbiB3aGljaCBpcyBwYXJ0IG9mIGEgVGFzayBEZXNjcmlwdGlvbi4gIFRoaXMgY29udHJpYnV0aW9uIChvciByZXBsYWNlbWVudCkgd291bGQgYWRkIG5ldyBkZXNjcmlwdGlvbiB0ZXh0IHRvIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uIChvciByZXBsYWNlIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uKS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0byBjb250cmlidXRlIG5ldyBDaGVjayBMaXN0IGl0ZW1zIG9yZ2FuaXplZCBhcyBTZWN0aW9ucyB0byBhbiBleGlzdGluZyBDaGVjayBMaXN0IChkZWZpbmVkIGFzIGd1aWRhbmNlKS4gIAotCi08L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk1NTYwMDE3MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyMUU4ODY4MDNFNSIvPgotICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEiIG5hbWU9InByZWRlY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjc5NTU0NTAxMzQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIj4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYyZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1GMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIiBuYW1lPSJBY3Rpdml0eSI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HbzA3Mk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QUEwQUUwMzlEIj4KLSAgICAgICAgICAgIDxib2R5PkFjdGl2aXR5IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIGV4dGVuZCBBY3Rpdml0eSB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiYjeEQ7Ci1BY3Rpdml0eSBpbmhlcml0cyB0aGUgc2VtYW50aWNzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2hpY2ggcHJvdmlkZXMga2V5IG1lY2hhbmlzbSB0byBlbmFibGUgZHluYW1pYyBiaW5kaW5nIG9mIENhcGFiaWxpdHkgUGF0dGVybnMgaW4gUHJvY2Vzc2VzIGFzIHdlbGwgYXMgUHJvY2VzcyBDb250cmlidXRpb25zLiAgVmFyaWFiaWxpdHkgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHdheSBmb3IgQWN0aXZpdGllczomI3hEOwotLSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuJiN4RDsKLS0gUmVwbGFjZTogVG8gcmVwbGFjZSBhbiBBY3Rpdml0eSBvZiBhbiBhcHBsaWVkIENhcGFiaWxpdHkgUGF0dGVybiBvciBhbiBleGlzdGluZyBwcm9jZXNzIGZvciB3aGljaCBvbmUgZGV2ZWxvcHMgYSBQcm9jZXNzIENvbnRyaWJ1dGlvbiAob3IgYSBjb21iaW5hdGlvbiBvZiBib3RoKSBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IGFuZCBzcGVjaWZ5IHRoZSByZXBsYWNlIHZhcmlhYmlsaXR5IHNwZWNpYWxpemF0aW9uIGJldHdlZW4gdGhlbS4mI3hEOwotLSBDb250cmlidXRlOiBUbyBjb250cmlidXRlIG5ldyBCcmVha2Rvd24gRWxlbWVudHMgdG8gYW4gZXhpc3RpbmcgQWN0aXZpdHkgb25lIHdvdWxkIGRlZmluZSBhbiBBY3Rpdml0eSB3aXRoIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlbGF0ZXMgdmlhIHRoZSBDb250cmlidXRlcyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiB0byB0aGlzIGV4aXN0aW5nIEFjdGl2aXR5LiAgVGhlIGNvbnRyaWJ1dGluZyBBY3Rpdml0eSdzIEJyZWFrZG93biBFbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBjb250cmlidXRlZCBBY3Rpdml0eS4mI3hEOwotJiN4RDsKLTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QUEwRDMwMjQ1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTg4NjgwM0U1Ii8+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2IF8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDgiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28wNzNlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSI+Ci0gICAgICAgICAgICA8Ym9keT5UaGlzIGNvbXBvc2l0aW9uIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhhdCBldmVyeSBNZXRob2QgUGFja2FnZSAoZWl0aGVyIENvbnRlbnQgUGFja2FnZSwgUHJvY2VzcyBQYWNrYWdlLCBvciBQcm9jZXNzIENvbXBvbmVudCkgaXMgcGFydCBvZiBleGFjdGx5IG9uZSBNZXRob2QgUGx1Z2luLjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ2IiBuYW1lPSJfbWV0aG9kUGx1Z2luIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDUiPgotICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR28wNzRlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dvMDc0T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkU3IiBuYW1lPSJFeHRlbnNpb24iIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCBfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkVBIj4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dvLUZ3LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRTciPgotICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGhvdyBNZXRob2QgUGx1Z2lucyBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucy4gIFRoZSBleHRlbmRpbmcgcGx1Zy1pbiBjb250YWlucyBuZXcgbWV0aG9kIGVsZW1lbnRzLCBleHRlbmRzIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cyBhbmQgcHJvY2Vzc2VzIHVzaW5nIGNvbnRlbnQgZWxlbWVudCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIChlLmcuIGNvbnRyaWJ1dGlvbiwgcmVwbGFjZSwgZXRjLiksIHByb3ZpZGVzIGFkZGl0aW9uYWwgRGVsaXZlcnkgYW5kIENhcGFiaWxpdHkgUHJvY2Vzc2VzIGZvciBhIE1ldGhvZCBGcmFtZXdvcmssIGV0Yy48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFOCIgbmFtZT0icGx1Z2lucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJFNyI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GeC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRnh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIF8zQURDN0I3NDAyMkQ0MURFNTg3QTAzQTIiPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR28tRnpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1ODdBMDNBMCI+Ci0gICAgICAgICAgICA8Ym9keT5UaGlzIDEtdG8tbWFueSBhc3NvY2lhdGlvbiBkZWZpbmVzIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgdGhhdCBhIG51bWJlciBvZiBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgcmVwcmVzZW50IGEgdmFyaWF0aW9uIG9mIGV4YWN0bHkgb25lIG90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0ExIiBuYW1lPSJ2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjFFODg2ODAzRTUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTU4N0EwM0EwIj4KLSAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dvLUYwT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hby1Gei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFOEU2NzAxQjEgXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyI+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hby1GMWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRThFNjUwMjEzIj4KLSAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSBvcmRlciBpbiB3aGljaCBjb250cmlidXRlZCBTZWN0aW9ucyBzaGFsbCBiZSBpbnNlcnRlZCBpbnRvIGFuICBleGlzdGluZyBsaXN0IG9mIFNlY3Rpb25zIG1haW50YWluZWQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbi48L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU4RTY3MDFCQyIgbmFtZT0iX3NlY3Rpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyNzk1NTQ1MDEzNCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU4RTY1MDIxMyI+Ci0gICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hby1GM09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR28tRjItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdCIiBuYW1lPSJNZXRob2RDb3JlIj4KLSAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HdlBGMHVmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY4N0I0RTAzNEEiPgotICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCNEUwMzRBIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZjZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmN3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGY3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhmNS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhmNk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NjIzIiB5PSIxNDUxOCIgd2lkdGg9IjQ0MDIiIGhlaWdodD0iMTY4NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGY4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhmOU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGYtT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZi1lZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGY4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGY4dWZYRWR1cUhvT0piVVJaUnciIHg9IjEwODM5IiB5PSIxMTQwMCIgd2lkdGg9IjQ0MzIiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGZfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhmX3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdBdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ0EtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGYtLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGZfT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDgiIHk9IjgyNDIiIHdpZHRoPSI0NTM3IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ0NPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnRE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdEZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnQmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnQnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NjA4IiB5PSI0OTQwIiB3aWR0aD0iNDUzNyIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNDc4RTAwMEQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJSGdKT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ0tPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhnS2VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElIZ0llZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElIZ0l1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzYwOCIgeT0iMjIxOSIgd2lkdGg9IjQxMTQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTQ5RUEwMUUyIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISUhnTHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnTWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJSGdNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElIZ00tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJSGdLLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJSGdMT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNjgiIHk9IjY5NzQiIHdpZHRoPSI0NzIwIiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1QtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFMjgwMDI1RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElIZ1UtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhnVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJSGdXT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISUhnVU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISUhnVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3OCIgeT0iODE3OCIgd2lkdGg9IjM4NDEiIGhlaWdodD0iMTY4NCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UU94ZEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0R3VRLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il94NEd1Uk94ZEVkdUhqZTNwUGFoTjRBIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UmV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1UnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il94NEd1Ui14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3g0UDRNT3hkRWR1SGplM3BQYWhONEEiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfeDRQNE1leGRFZHVIamUzcFBhaE40QSIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX3g0R3VRZXhkRWR1SGplM3BQYWhONEEiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX3g0R3VRdXhkRWR1SGplM3BQYWhONEEiIHg9Ijk2MjMiIHk9IjE3NDg3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDVEJrT3g1RWR1NS12VmpsZlZzZlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNUQmsteDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1pDVEJsT3g1RWR1NS12VmpsZlZzZlEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrT3g1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrZXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1pDY3lrdXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfWkNjeWsteDVFZHU1LXZWamxmVnNmUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9aQ2N5bE94NUVkdTUtdlZqbGZWc2ZRIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfWkNUQmtleDVFZHU1LXZWamxmVnNmUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfWkNUQmt1eDVFZHU1LXZWamxmVnNmUSIgeD0iMTQyNjUiIHk9IjE3NDg3Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdlBGMU9mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgZGVmaW5lcyB0aGUgZnVuZGFtZW50YWwgY29uY2VwdHMgZm9yIGRlc2NyaWJpbmcgYW5kIG9yZ2FuaXppbmcgbWV0aG9kIGNvbnRlbnQuICBUaGUgcGFja2FnZSBpdHNlbGYgcHJvdmlkZXMgbGF5ZXJzIGFzIGRlcGljdGVkIGluIGRpYWdyYW0gdGhhdCBncmFkdWFsbHkgZXh0ZW5kIHRoZSBjb3JlIGNvbmNlcHRzIHdpdGggbW9yZSBhbmQgbW9yZSBjYXBhYmlsaXRpZXMgKGkuZS4gc3VwcG9ydGluZyBjbGFzc2VzLCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIGFuZCByZWxhdGlvbnNoaXBzKS4gVGhlIEJhc2ljIEVsZW1lbnRzIHBhY2thZ2UgZGVmaW5lcyB0aGUgcm9vdCBlbGVtZW50IGZyb20gd2hpY2ggYWxsIGNsYXNzZXMgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGhhdmUgYmVlbiBkZXJpdmVkLiAgQ29yZSBDb250ZW50IEVsZW1lbnRzIGRlZmluZXMgdGhlIGNvcmUgZWxlbWVudHMgb2YgZXZlcnkgbWV0aG9kIHN1Y2ggYXMgcm9sZXMsIHRhc2tzLCBhbmQgd29yayBwcm9kdWN0cy4gIFRoZSBuZXh0IGxheWVyIGFkZHMgZGlmZmVyZW50IHR5cGVzIG9mIGd1aWRhbmNlIHRvIHRoZSBjb3JlIGVsZW1lbnRzIHN1Y2ggYXMgd29yayBwcm9kdWN0IHRlbS1wbGF0ZXMsIGd1aWRlbGluZXMsIG9yIGNoZWNrbGlzdHMuICBUaGUgQ2F0ZWdvcmllcyBwYWNrYWdlIHByb3ZpZGVzIHByZS1kZWZpbmVkIGFzIHdlbGwgYXMgdXNlci1kZWZpbmFibGUgY2F0ZWdvcml6YXRpb25zIG9mIGNvcmUgY29udGVudCBlbGVtZW50cyBhcyB3ZWxsIGFzIGd1aWRhbmNlIHR5cGVzLiAgVGhlIE1ldGhvZCBDb250ZW50IERlc2NyaXB0aW9ucyBhZGRzIHByb3BlcnRpZXMgZm9yIGRldGFpbGVkIGNvbnRlbnQgZGVzY3JpcHRpb25zIHRvIHRoZSBlbGVtZW50cyBkZWZpbmVkIGJlbG93LiAgVGhlc2UgZGVzY3JpcHRpb25zIGFyZSBvcHRpb25hbCBhZGRpdGlvbnMsIHdoaWNoIGFuIGltcGxlbWVudGVyIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBmcmVlIHRvIGNob29zZSBmcm9tLiAgRmluYWxseSwgTWV0aG9kIFBhY2thZ2UgZGUtZmluZXMgaG93IHRoZSBlbGVtZW50cyBkZWZpbmVkIGluIGFsbCBmb3VyIGxheWVycyBiZWxvdyBjYW4gYmUgb3JnYW5pemVkIGluIHBhY2thZ2UgaGllcmFyY2hpZXMuIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfVVI5V3NPb1dFZHVPQlBRQTJoS3FVUSIgZWxlbWVudD0iX1VSemxzT29XRWR1T0JQUUEyaEtxVVEiIHNvdXJjZT0iX0hJSGdULWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVI5V3Mtb1dFZHVPQlBRQTJoS3FVUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVVI5V3Rlb1dFZHVPQlBRQTJoS3FVUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9VUjlXdC1vV0VkdU9CUFFBMmhLcVVRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1VSOVd0dW9XRWR1T0JQUUEyaEtxVVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9VUjlXdE9vV0VkdU9CUFFBMmhLcVVRIiB4PSItNzc2IiB5PSItMTA2NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfVVI5V3Nlb1dFZHVPQlBRQTJoS3FVUSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9VUjlXc3VvV0VkdU9CUFFBMmhLcVVRIiBwb2ludHM9IlstMzQsIDMyLCAxNDksIC05MF0kWy0xMDksIDExOSwgNzQsIC0zXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9OMTlsY2V4TUVkdU9Ock1SZ216NDhBIiBlbGVtZW50PSJfTjE5bGNPeE1FZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZjhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZE94TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9OMTlsZHV4TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX04xOWxlT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTjE5bGQteE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX04xOWxkZXhNRWR1T05yTVJnbXo0OEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX04xOWxjdXhNRWR1T05yTVJnbXo0OEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfTjE5bGMteE1FZHVPTnJNUmdtejQ4QSIgcG9pbnRzPSJbMiwgMzMsIDAsIC04NV0kWzIsIDE1MCwgMCwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0NzRVFJT3hkRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9DcjZmSU94ZEVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhmOE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmNXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NzRVFJLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0NzRVFKZXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQ3NFUUoteGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9Dc0VRSnV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQ3NFUUpPeGRFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfQ3NFUUlleGRFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9Dc0VRSXV4ZEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstMTg1LCA4NzMsIC0yMTQzLCAtNTQyNF0kWy0xODUsIDM2NTEsIC0yMTQzLCAtMjY0Nl0kWzEyNDQsIDU0MjQsIC03MTQsIC04NzNdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9oVjFsRU94NUVkdTUtdlZqbGZWc2ZRIiBpZD0iKDAuNDYxNjQyNiwwLjc3NTY1NjM0KSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9kZHR0c094ZEVkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfZGRqOHNPeGRFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0JPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZi11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0cy14ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9kZHR0dGV4ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2RkdHR0LXhkRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZGR0dHR1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2RkdHR0T3hkRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2RkdHRzZXhkRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfZGR0dHN1eGRFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbMiwgMzIsIDIsIC05Ml0kWzE2LCAxNTcsIDE2LCAzM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZWFXOElleGRFZHVIamUzcFBhaE40QSIgZWxlbWVudD0iX2VhVzhJT3hkRWR1SGplM3BQYWhONEEiIHNvdXJjZT0iX0hJSGdCT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJSGY4T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZWFXOEpPeGRFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZWFXOEp1eGRFZHVIamUzcFBhaE40QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lYVc4S094ZEVkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2VhVzhKLXhkRWR1SGplM3BQYWhONEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lYVc4SmV4ZEVkdUhqZTNwUGFoTjRBIiB4PSItMTQ4OCIgeT0iLTgxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZWFXOEl1eGRFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9lYVc4SS14ZEVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlsxNTM1LCA4NDYsIC0xNjQwLCAtNTYxMF0kWzM0MTMsIDE4NzgsIDIzOCwgLTQ1NzhdJFszNDEzLCA1OTAwLCAyMzgsIC01NTZdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1ZQUjNNT3hlRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9WUElHTU94ZUVkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnS3VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhmLXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNNLXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1ZQUjNOZXhlRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVlBSM04teGVFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9WUFIzTnV4ZUVkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVlBSM05PeGVFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfVlBSM01leGVFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9WUFIzTXV4ZUVkdUhqZTNwUGFoTjRBIiBwb2ludHM9IlstOTAsIDExLCAyMzksIC0xXSRbLTI0NSwgNDMsIDg0LCAzMV0iLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX1d0ZEZZT3hlRWR1SGplM3BQYWhONEEiIGlkPSIoMC43NzE2NTUyNiwwLjc0MzQzNjc1KSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9SS0VEWWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfUktFRFlPeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZ0t1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SS0VEWk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SS0VEWnV4Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JLRURhT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUktFRFoteGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1JLRURaZXhnRWR1SGplM3BQYWhONEEiIHg9Ii00ODEiIHk9Ii00ODciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JLRURZdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUktFRFkteGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTIwOTAsIDQ3NiwgMzk0MywgLTQyODddJFstNjA1OSwgMTQwMywgLTI2LCAtMzM2MF0kWy02MDU5LCA0MjA3LCAtMjYsIC01NTZdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1JxR09VZXhnRWR1SGplM3BQYWhONEEiIGVsZW1lbnQ9Il9ScUdPVU94Z0VkdUhqZTNwUGFoTjRBIiBzb3VyY2U9Il9ISUhnSU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISUhnQk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09WT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxR09WdXhnRWR1SGplM3BQYWhONEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnFHT1dPeGdFZHVIamUzcFBhaE40QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScUdPVi14Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUnFHT1ZleGdFZHVIamUzcFBhaE40QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfUnFHT1V1eGdFZHVIamUzcFBhaE40QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ScUdPVS14Z0VkdUhqZTNwUGFoTjRBIiBwb2ludHM9Ils2LCAzMywgLTIsIC03MF0kWzk1LCAxMTAsIDg3LCA3XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9TTFZUSWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfU0xWVElPeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZ0lPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElIZ1QtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTFZUSk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TTFZUSnV4Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NMVlRLT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU0xWVEoteGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1NMVlRKZXhnRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1NMVlRJdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfU0xWVEkteGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbMTkzMSwgODczLCAtNDcxMCwgLTUxMDddJFs2NjE0LCAyOTkwLCAtMjcsIC0yOTkwXSRbNjYxNCwgNTQyNCwgLTI3LCAtNTU2XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ub3lUTWV4Z0VkdUhqZTNwUGFoTjRBIiBlbGVtZW50PSJfbm95VE1PeGdFZHVIamUzcFBhaE40QSIgc291cmNlPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfeDRHdVFPeGRFZHVIamUzcFBhaE40QSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ub3lUTk94Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ub3lUTnV4Z0VkdUhqZTNwUGFoTjRBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX25veVRPT3hnRWR1SGplM3BQYWhONEEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfbm95VE4teGdFZHVIamUzcFBhaE40QSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX25veVROZXhnRWR1SGplM3BQYWhONEEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX25veVRNdXhnRWR1SGplM3BQYWhONEEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfbm95VE0teGdFZHVIamUzcFBhaE40QSIgcG9pbnRzPSJbLTcsIDMzLCAtNiwgLTcwXSRbLTcsIDEzMSwgLTYsIDI4XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9jNjJuZ094NUVkdTUtdlZqbGZWc2ZRIiBlbGVtZW50PSJfYzZ0ZGtPeDVFZHU1LXZWamxmVnNmUSIgc291cmNlPSJfSElIZjV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfWkNUQmtPeDVFZHU1LXZWamxmVnNmUSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuZy14NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9jNjJuaGV4NUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX2M2Mm5oLXg1RWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfYzYybmh1eDVFZHU1LXZWamxmVnNmUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX2M2Mm5oT3g1RWR1NS12VmpsZlZzZlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX2M2Mm5nZXg1RWR1NS12VmpsZlZzZlEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfYzYybmd1eDVFZHU1LXZWamxmVnNmUSIgcG9pbnRzPSJbNDEsIDMzLCAtMTM0LCAtNzRdJFs5MSwgMTA4LCAtODQsIDFdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0QzNzAxRUQiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUTdlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ1MjEiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJROXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJROS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUS1PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJRNnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJRNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjA1MCIgeT0iMTEwMTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUS1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJRX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUV9lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5OTYiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJRLXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJRLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc3OSIgeT0iMTEwMTgiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUkRlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM3MDgiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSRXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSRk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSRnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSRi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJSQ3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJSQy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MzA4IiB5PSI4MzQ4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJHZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJIZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzA4IiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJLT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUkd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkctZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1MTYiIHk9IjExMDE4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJLZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUkxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJUlJMZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MDEzIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJUlJNT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUk51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJUlJPT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElSUkt1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElSUkstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIwNDIiIHk9IjgzNTYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElSUlBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0NzAiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElSUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISVJSUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISVJSUi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElSUlNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISVJST3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISVJSTy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc2NiIgeT0iODM0OCIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFhNy1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWE5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWE5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWEtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEtZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFhLXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWE3T2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWE3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjIxNTA3IiB5PSI4MzU2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJYWJRZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDY0IiBoZWlnaHQ9IjEwODMiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYlN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYlMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJUT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSElhYlB1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYlAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUwNSIgeT0iNTY3MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWFiYXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJidWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJiLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJjT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJjZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJjdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJYWJjLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJkT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJYWJaLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJYWJhT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwMjAiIHk9IjMwMTAiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElhYmV1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiZ3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWFiZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFiaE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElhYmhlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWFiZC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiZU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTkzIiB5PSIzMTciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTDEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMM09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMM3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMMy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtMNE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTDR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtMMU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMMWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjY2NiIgeT0iNTY2MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01FLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNRk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQzNyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01HT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01HZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01HdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01HLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01IT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01IZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01IdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01FZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01FdWZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NjMiIHk9IjMwMDMiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUtlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSElrTUxlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMwMTQiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTU9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNS3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNSy1mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTA0IiB5PSIzMDEwIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01TLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hJa01ULWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNVk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNVi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNV09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNV2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSElrTVd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISWtNVE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNVGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjQ0MyIgeT0iMjk5MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISWtNYU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01iZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01iLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01jT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hJa01jZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01jdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISWtNYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hJa01aZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01adWZYRWR1cUhvT0piVVJaUnciIHg9IjE2NzEwIiB5PSIzMDA5IiB3aWR0aD0iNDQxNyIgaGVpZ2h0PSI5NzkiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDRPb2xFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNC1vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfZUhPMDVPb2xFZHVWQTd2dDVxYklKUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDVlb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDV1b2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhPMDUtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNk9vbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNmVvbEVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wNnVvbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wNi1vbEVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wN09vbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9lSE8wN2VvbEVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSE8wN3VvbEVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfZUhPMDctb2xFZHVWQTd2dDVxYklKUSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9lSE8wNGVvbEVkdVZBN3Z0NXFiSUpRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9lSE8wNHVvbEVkdVZBN3Z0NXFiSUpRIiB4PSIzMzE5IiB5PSI4MzU4Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdlBGMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYTBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgc291cmNlPSJfSElSUTZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWExdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYTBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFhMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01MDMsIC00Nzg5LCAyMTY5XSRbNDc1NSwgLTIxOTYsIC04LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhMS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWEyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFhMmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9ISVJRLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISVJST2VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWEzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElhYTMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFhM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFhMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWEyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTI3LCAyMTY5XSRbLTgsIC0yMTk2LCAtOCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElhYTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElhYTR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA0QSIgc291cmNlPSJfSElSUkdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWFhNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWE2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElhYTV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElhYTQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWFhNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYsIC01MDMsIDQ3MTAsIDIxNjldJFstNDc0NCwgLTIxOTYsIC04LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWFhNmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJYWE2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWFiaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1QUUwMkNFIiBzb3VyY2U9Il9ISWFiWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJYWJpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWFiaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWFiaC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJYWJpT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMiwgLTgxNDksIDIxNzBdJFs4MTM2LCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0wwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDB1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0w0LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMUQiIHNvdXJjZT0iX0hJUlJDZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa0w1LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0w1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTDVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAzLCAtNzExOCwgMjE2OV0kWzcwOTcsIC0yMTk2LCA2LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMNnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0w2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtMN09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA3IiBzb3VyY2U9Il9ISVJSS2VmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWtMMC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0w4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTDh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtMOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtMN2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa0w3dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMywgLTIzODIsIDIxNjldJFsyMzYxLCAtMjE5NiwgNiwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTDgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtMOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTDllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNEOSIgc291cmNlPSJfSElSUk9lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtMLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa0wtLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTC1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTDl1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtMOS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDMsIDIzNTQsIDIxNjldJFstMjM3NSwgLTIxOTYsIDYsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa0xfT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTF9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa0xfdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMkYiIHNvdXJjZT0iX0hJYWE2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNQk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01BdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa0xfLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTUFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTAzLCA3MDkxLCAyMTY5XSRbLTcxMTEsIC0yMTk2LCA2LCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNQmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01CdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9ISWtNRU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01JLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTUp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNSk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNSWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01JdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNiwgLTUwMiwgLTQ0MTgsIDIxNzBdJFs0NDA2LCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01KLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTUtPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01PZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIHNvdXJjZT0iX0hJYWJQZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJa01LZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTVB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01QZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01PdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01PLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMzgsIC01MDMsIC0yMzgsIDIxNzBdJFstMjM4LCAtMjE5NywgLTIzOCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVFPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNUWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTVF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFENUY4MDM4RSIgc291cmNlPSJfSElrTUtlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElhYmR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01TT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTVEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISWtNUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC01MDIsIC01ODIsIDIxNzBdJFs1NjksIC0yMTk2LCAxNCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTVNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNU3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSElrTVctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSElrTDAtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSElrTVMtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNWU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01ZZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSElrTVgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSElrTVhPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTVhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEzMywgLTUwMywgLTEzMywgMjE3MF0kWy0xMzMsIC0yMTk3LCAtMTMzLCA0NzZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNWXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01ZLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISWtNZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9ISWtNUy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISWFiZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01kLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hJa01lZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISWtNZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISWtNZGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hJa01kdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNywgLTUwMiwgMzUxOSwgMjE3MF0kWy0zNTMyLCAtMjE5NiwgMTQsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hJa01lLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hJa01mZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hJa01aT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hJYWJkdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElrTWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISWtNZy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hJa01nZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hJa01mdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSElrTWYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI3LCAtNTAyLCA4MTQ5LCAyMTcwXSRbLTgxNjIsIC0yMTk2LCAxNCwgNDc2XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSElrTWhPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISWtNaGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfZUhZbDRPb2xFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iX0QzYjhvT29rRWR1VkE3dnQ1cWJJSlEiIHNvdXJjZT0iX2VITzA0T29sRWR1VkE3dnQ1cWJJSlEiIHRhcmdldD0iX0hJa0wwLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDQtb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfZUhZbDVlb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9lSFlsNXVvbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfZUhZbDVPb2xFZHVWQTd2dDVxYklKUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfZUhZbDRlb2xFZHVWQTd2dDVxYklKUSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9lSFlsNHVvbEVkdVZBN3Z0NXFiSUpRIiBwb2ludHM9IlsxNzQ2LCAtMTU5LCAtODY3OSwgODQ2XSRbODc4NCwgLTg0NywgLTE2NDEsIDE1OF0iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BIMnlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3QiI+Ci0gICAgICAgICAgPGJvZHk+MDE8L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIiBuYW1lPSJHdWlkYW5jZVR5cGVzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dxVUp0ZWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ5RkYzMDAwRSI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ5RkYzMDAwRSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQjNHNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUUwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUTBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUTNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEIzRzRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQjNHNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODAyNSIgeT0iMTgzODEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVEzZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FRNGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUTR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVE1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVE2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FRNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FRN09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FRM3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVEzLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDYxIiB5PSIyMzE0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJJZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUkpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUktPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUkt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJLLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJMT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJIdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUkgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0NTIiIHk9IjE5Nzc4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUk1lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk5lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk4tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FST09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FST3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUk8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlBPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUkx1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSTC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDk1MiIgeT0iMTc2NjkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSU3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSVmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0FSUi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJTT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE0NTg4IiB5PSIxNTg0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDQVJXdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJYdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJZT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJZdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUlktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDQVJaZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJWLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUldPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1NzEiIHk9IjE0MTY0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSWnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENBUmF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0FSYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENBUlotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0FSYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDUyOCIgeT0iMTI1ODkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJkdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0FSZXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSI5MzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUmZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDQVJndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENBUmctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0IwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDQVJkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENBUmVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM2NzMiIHk9IjEwNjA4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENLQjF1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0IxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tCMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQjRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENLQjAtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tCMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM3NiIgeT0iMjEyNDIiIHdpZHRoPSIzNTY0IiBoZWlnaHQ9IjIxMTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ0tDQ2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NEdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NFT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDRk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ0tDQnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDS0NCLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NzQiIHk9IjEwMTkzIiB3aWR0aD0iMzQ1NCIgaGVpZ2h0PSIxMzc1OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDVHpZT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6WWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelplZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHphT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUemFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHphdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHphLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDVHpYZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUelh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwODciIHk9IjQ4MTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpiT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Yi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ1R6Y09mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUemNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Y3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6ZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6ZHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4d09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzh3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4d3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4dy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ1R6YmVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpidWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MjE1IiB5PSIzNDQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSENjOHlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzh5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4eS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4emVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOHp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4ei1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M4MGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSENjOHhlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M4eHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM1MSIgeT0iNTk4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDYzgyT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjODRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg0dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzg0LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDYzgxZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENjODF1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ5MjUiIHk9IjUyNzQiIHdpZHRoPSIyOTg4IiBoZWlnaHQ9IjM2NzQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlFT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ2M5Rk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5RnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5R09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5R3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlHLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5SHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5SC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQ2M5RWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDYzlFdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NjYiIHk9IjI3OTQiIHdpZHRoPSIzNTczIiBoZWlnaHQ9IjY5MDgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQ210NU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDMwMSIgaGVpZ2h0PSI5OTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQ3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDbXQ0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI5ODciIHk9Ijc5OTIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcVVKdC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGFsbCBndWlkYW5jZSB0eXBlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyB0byBvdGhlciBjb250ZW50IGVsZW1lbnRzLiAgQXNzb2NpYXRpb25zIGFuZCBtdWx0aXBsaWNpdGllcyBoYXZlIGJlZW4gcHJlZGVmaW5lZCBvbiB0aGF0IGxldmVsIG9mIGRldGFpbCB0byBlbnN1cmUgdGhhdCBndWlkYW5jZSBpcyBvbmx5IHJlbGF0ZWQgdG8gYXBwcm9wcmlhdGUgY29udGVudCBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBVTUEgZGVmaW5lcyB0aGF0IG9ubHkgb24gY2hlY2tsaXN0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggb25lIGNvbnRlbnQgZWxlbWVudCBhdCBhIHRpbWUuICBPdGhlciBwYWNrYWdlcyBhZGQgdmFyaWFiaWxpdHkgY2FwYWJpbGl0aWVzIHRvIGNoZWNrbGlzdHMgKGFuZCBvdGhlciBjb250ZW50IGVsZW1lbnRzKSB0aGF0IGFsbG93cyB0byBkeW5hbWljYWxseSBwcm92aWRlIGFkZGl0aW9uYWwgY2hlY2sgcG9pbnRzIG9yIGV2ZW4gY2hlY2sgcG9pbnQgZ3JvdXBpbmdzIHRvIGNoZWNrIGxpc3Qgc28gdGhhdCBhbiBhc3NvY2lhdGVkIGNoZWNrIGxpc3QgYWx3YXlzIGNvbnRhaW5zIHRoZSByaWdodCBjaGVjayBwb2ludHMgd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgcGFydGljdWxhciBtZXRob2QgY29uZmlndXJhdGlvbiBvciBwcm9jZXNzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ0FSUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMEIwIiBzb3VyY2U9Il9IQjNHNE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FSTGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0FSUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENBUlEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDQVJRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0FSUHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENBUlAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwODMsIC0yNDUsIDIyMTgsIDQ2NV0kWy0yNDU1LCAtNTMzLCA4NDYsIDE3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSENBUlJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hDQVJSZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQjR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiIgc291cmNlPSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tCNXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I2dWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0I3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0I4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM0MiIgeT0iNDU3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjgtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk1IiB5PSItNDcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQi1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0ItZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQl9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQi11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0JfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tCXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDQU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tCX3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDQXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENLQjQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ0tCNU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNzc4LCA4LCAxNzc4LCA4XSRbMzM3OCwgOCwgMzM3OCwgOF0kWzMzNzgsIDI1OTAsIDMzNzgsIDI1OTBdJFs4MDQsIDI1OTAsIDgwNCwgMjU5MF0kWzgwNCwgMTA1OCwgODA0LCAxMDU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQ0ZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCIgc291cmNlPSJfSENBUkhlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NHLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDR2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0hlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgwNSIgeT0iLTI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDgyIiB5PSIyNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ0ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0NiIgeT0iLTM3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDSnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NjEiIHk9IjM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NLLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NLZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NMZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ011ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ00tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ01lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ04tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ05lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDS0NGdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ0YtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4MDMsIC0xMDEsIDExMDQ5LCAzMDk4XSRbLTExMjM1LCAtMTAxLCAxNjE3LCAzMDk4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENLQ1FlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSIgc291cmNlPSJfSENBUkxlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ0tDUmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1NlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEwNDEiIHk9Ii0yODAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NUT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYzNSIgeT0iMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NULWZYRWR1cUhvT0piVVJaUnciIHg9Ijk3NSIgeT0iLTQ1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0OTIiIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NWdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NWZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NXZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1hlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NZdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENLQ1ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ1llZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDS0NRdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0NiwgNTksIDExNTQ4LCAxMTI2XSRbLTEwNzc4LCA1OSwgMTYxNywgMTEyNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDS0NaT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiIHNvdXJjZT0iX0hDQVJSdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENLQ2FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NiT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii05MzYiIHk9Ii0yNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NiLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTkiIHk9IjE4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MzciIHk9Ii00NTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENLQ2RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc5IiB5PSIzMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ0tDZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ0tDZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENLQ2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDS0NnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NnT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ0tDaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDS0NodWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDS0NoT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ0tDWmVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDS0NadWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NTYsIDE2LCAxMTE4NCwgLTc0NV0kWy0xMDUyNCwgMTYsIDE2MTcsIC03NDVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R5ME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIiBzb3VyY2U9Il9IQ0FSVnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHkxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5Mk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTE0IiB5PSIxNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5MnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIxMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHkyLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xOTUiIHk9Ii0yOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5M2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHkzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUeTN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAzOSIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5NGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTM4IiB5PSIyNDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5NXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5NU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R5NnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R5Nk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMTAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHk3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHk4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHk4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ1R5MGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDVHkwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MjIsIDMzLCAxMTE2NywgLTI0MDRdJFstMTA0NzMsIDMzLCAxNjE3LCAtMjQwNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDVHk4LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiIHNvdXJjZT0iX0hDQVJadWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDS0NCZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5OXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHktT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5LWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENUeTktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHktdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHlfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHktLWZYRWR1cUhvT0piVVJaUnciIHg9Ii05NTEiIHk9Ii00NTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R5X2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHlfdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMDYiIHk9IjIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6QWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTkyIiB5PSItMzM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpCT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMjIiIHk9IjMwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpDZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpEZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpDLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6RHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUekZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHk5T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUeTllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTkxNCwgLTQyLCAxMTEyNSwgLTQwNTVdJFstMTA0MjIsIC00MiwgMTYxNywgLTQwNTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IQ1R6RnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIiBzb3VyY2U9Il9IQ0tDQmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IQ0FSZHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDVHpHdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA2MiIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDk5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUekllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUekplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4OTMiIHk9Ii0xMDIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6SnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5M0YwMDQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6Si1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1MzciIHk9IjIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDVHpNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUek0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUek11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUek9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUek51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDVHpGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENUekdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTYxNywgLTYwMzYsIC0xMDA2NiwgLTQyXSRbMTAyNzAsIC02MDM2LCAtMTQxMywgLTQyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENUek9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCIgc291cmNlPSJfSENLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ1R6UGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExMzIiIHk9IjEzNyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDVHpST2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00MzgiIHk9Ii00MzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelItZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQ0IiB5PSIxOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0ExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6U3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzc4IiB5PSItMjYxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUelV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENUelUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENUelVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDVHpWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ1R6VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6VmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENUeld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ1R6Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ1R6V2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENUek91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ1R6Ty1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTc3OCwgLTUwLCAxMDk3MiwgNTE4MV0kWy0xMTEzMywgLTUwLCAxNjE3LCA1MTgxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjODdlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCIgc291cmNlPSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjODFPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M4OGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjODl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjODllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTczMiIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzg5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOC1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjQiIHk9IjMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzgtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M4LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NzgiIHk9Ii0yNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M4X2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOF91ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE2IiB5PSItMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOUItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5Qy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Q2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOURPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5RC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5RGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjODd1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M4Ny1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxMDQxLCAtMTAxLCAtOTk4MiwgLTc2Ml0kWzk1MzMsIC0xMDEsIC0xNDkwLCAtNzYyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOUlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSIgc291cmNlPSJfSENUelhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M5Sk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI1NSIgeT0iLTI3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzcyIiB5PSI0MTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOUx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyNCIgeT0iLTI3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5TXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5TWVmWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iMzMxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOU51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU5PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENjOU91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5UGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5UHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5UE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5UXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5UU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSENjOUllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IQ2M5SXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzYyLCAtNjcsIDEwODcxLCAtMTAzMl0kWy05OTU2LCAtNjcsIDE2NzYsIC0xMDMyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOVEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyIgc291cmNlPSJfSENUemJPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlTZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ2M5Ui1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkwNSIgeT0iLTMxMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENjOVR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEyNiIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlVZWZYRWR1cUhvT0piVVJaUnciIHg9IjEwOTQiIHk9IjI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTQiIHk9Ii0zNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5V09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5V2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ2M5WGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ2M5Vy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENjOVh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDYzlZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlYLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ2M5Wk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDYzlaZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDYzlZLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ2M5Uk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDYzlSZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05MjIsIC01OSwgMTA3NjEsIC0yMzk2XSRbLTEwMDA3LCAtNTksIDE2NzYsIC0yMzk2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENjOWItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCIgc291cmNlPSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOHhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ210d2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk5NSIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXR5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210eXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXR6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHktZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTAxIiB5PSItMTEwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdHotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdHp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjAiIHk9IjMyMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXQxLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210Mk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDJlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdDMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdDNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDYzljT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENjOWNlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTY3NiwgMjAzLCAtMTAyNjEsIDBdJFsxMDg5NiwgMjAzLCAtMTA0MSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hDbXQ4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjYiIHNvdXJjZT0iX0hDbXQ0T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDYzgxT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210OXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSENtdDlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQ5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXQtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQtT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii02OTciIHk9Ii0yMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ210LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdF9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXQtLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MzciIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXRfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ210X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI4NDIiIHk9Ii0yMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzg0IiB5PSIzNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211QmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211QnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Qk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211Q2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQ211Q3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Q09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVEZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVEdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVET2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211RWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVFT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IQ210OGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hDbXQ4dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxNTAsIC0xNiwgLTkxMjcsIDEzNTRdJFs5Nzg3LCAtMTYsIC0xNDkwLCAxMzU0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSENtdUUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSIgc291cmNlPSJfSENtdDRPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENjOUVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQ211Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4OSIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5NSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdUlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVJZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc4MyIgeT0iLTQ1NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211SmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IQ211Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNzciIHk9IjM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDbXVMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hDbXVLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQ211THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSENtdU1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdU1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdUwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDbXVOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSENtdU5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSENtdU0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hDbXVGT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSENtdUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNTAsIDAsIDk1MzMsIDIyMzVdJFstMTAwMDcsIDAsIDE2NzYsIDIyMzVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il8tZzdMc08wb0VkdXRDTEVDTjk2Qk53IiBlbGVtZW50PSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyIgc291cmNlPSJfSENLQ0JlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSENBUTNlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0xzLTBvRWR1dENMRUNOOTZCTnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THRlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x0dTBvRWR1dENMRUNOOTZCTnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXy1nN0x0TzBvRWR1dENMRUNOOTZCTnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdC0wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THVlMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THVPMG9FZHV0Q0xFQ045NkJOdyIgeD0iLTQ3NyIgeT0iMjYzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THV1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMdk8wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THUtMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x2ZTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXy1lMWhBTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x2LTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THZ1MG9FZHV0Q0xFQ045NkJOdyIgeD0iMzE3IiB5PSIyMzciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMd08wb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWc3THd1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWc3THdlMG9FZHV0Q0xFQ045NkJOdyIgeD0iLTY2NyIgeT0iLTIwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1nN0x3LTBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8tZ0J6MHUwb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tZzdMeGUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il8tZzdMeHUwb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il8tZzdMeE8wb0VkdXRDTEVDTjk2Qk53IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHNPMG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHN1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWhFOHMtMG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWhFOHNlMG9FZHV0Q0xFQ045NkJOdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh0TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLWhFOHR1MG9FZHV0Q0xFQ045NkJOdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfLWhFOHQtMG9FZHV0Q0xFQ045NkJOdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfLWhFOHRlMG9FZHV0Q0xFQ045NkJOdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXy1oRTh1TzBvRWR1dENMRUNOOTZCTnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8taEU4dXUwb0VkdXRDTEVDTjk2Qk53IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1oRTh1LTBvRWR1dENMRUNOOTZCTnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iXy1oRTh1ZTBvRWR1dENMRUNOOTZCTnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il8tZzdMc2Uwb0VkdXRDTEVDTjk2Qk53IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iXy1nN0xzdTBvRWR1dENMRUNOOTZCTnciIHBvaW50cz0iWzY1LCA1NywgLTI2MiwgLTE4NF0kWzI3MCwgMjQ1LCAtNTcsIDRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OUZFNzAzQzEiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTlBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1b3RPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW90ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3ZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1b3YtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1b3NlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvc3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjkzNyIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW93T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IQzVveE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1b3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW94LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW95ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVveXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW95LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW96ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDNW93dWZYRWR1cUhvT0piVVJaUnciIHg9IjI5MzU2IiB5PSIxMDAxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hDNW8xT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8xdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8yT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8ydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8zT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW8zdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hDNW8zLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hDNW8wZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEM1bzB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIwNTYiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEM1bzVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW81ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IQzVvNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvNmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvNi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IQzVvN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEM1bzd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEM1bzctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEM1bzRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IQzVvNHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTkxNyIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hDNW84T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERac09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERac2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERacy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERadS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERadk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IQzVvOGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hDNW84dWZYRWR1cUhvT0piVVJaUnciIHg9IjQ5MSIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERad09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERad2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFp4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFp5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERadnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFp2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijk5MTciIHk9IjEwMDAyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaemVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjBlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFowdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaMU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaMnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWjNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWnp1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaei1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDQwMCIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFozZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERaNGVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERFo2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaNi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaN09mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaM3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFozLWZYRWR1cUhvT0piVVJaUnciIHg9IjY2MTgiIHk9IjEwMDExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUNCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEREWjhlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFo4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERaOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaOXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWjktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWi1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERaLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREWi0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREWl9PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEREWjd1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERaNy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjM3MyIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERFpfZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhQWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhQy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhRE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERaX3VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERFpfLWZYRWR1cUhvT0piVVJaUnciIHg9IjI5MTY0IiB5PSIxMTcyOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hERGFHdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEREYUktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFKZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hERGFGLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDMzMSIgeT0iMTAwMTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFKdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRERhS3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYUstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFMZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hERGFNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhTk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRERhTmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRERhSi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhS09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTgyNyIgeT0iNDgzNSIgd2lkdGg9IjM0NzkiIGhlaWdodD0iMTEwMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWozZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNzc2IiBoZWlnaHQ9IjExMzQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qM3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWozLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo1ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNajV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWo1LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWo2T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hETWoydWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWoyLWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NTA4IiB5PSI3MzQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qLS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNal91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERNal8tZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MDIiIGhlaWdodD0iOTk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtBdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRE1rQ3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRE1qX09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWpfZWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNzM5IiB5PSIxMDAyMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hETWtHT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjEwNjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtHdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0hlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0gtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERNa0llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hETWtJLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hETWtGZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWtGdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1ODUwIiB5PSIyODUzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3RU9vVkVkdU9CUFFBMmhLcVVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Utb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfODIxd0ZPb1ZFZHVPQlBRQTJoS3FVUSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzgyMXdGZW9WRWR1T0JQUUEyaEtxVVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0Z1b1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3Ri1vVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0dPb1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3R2VvVkVkdU9CUFFBMmhLcVVRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0d1b1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3Ry1vVkVkdU9CUFFBMmhLcVVRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0hPb1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il84MjF3SGVvVkVkdU9CUFFBMmhLcVVRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0h1b1ZFZHVPQlBRQTJoS3FVUSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfODIxd0gtb1ZFZHVPQlBRQTJoS3FVUSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfODIxd0Vlb1ZFZHVPQlBRQTJoS3FVUSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il84MjF3RXVvVkVkdU9CUFFBMmhLcVVRIiB4PSIxNTE5NSIgeT0iMTAwMDkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HcWQ2a2VmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UgZGVmaW5lcyBhIG51bWJlciBvZiBwcmUtZGVmaW5lZCBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcyB0aGF0IGNhbiBiZSByZWxhdGVkIHRvIHNwZWNpZmljIGNvbnRlbnQgZWxlbWVudHMuICBHdWlkYW5jZSBpcyBhIGNvbnRlbnQgZWxlbWVudCBpdHNlbGYsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGFzc29jaWF0ZSBndWlkYW5jZSB0byBndWlkYW5jZS4gVGhpcyBkaWFncmFtIHNob3dzIHRoZSB0YXhvbm9teSBvZiBhbGwgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFEZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwQjAiIHNvdXJjZT0iX0hERFpfZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hDNW93T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYUVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFEdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYUQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTMxOCwgMCwgMTc3M10kWzAsIC0xNzczLCAwLCAzMThdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFGT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRERhRmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGNDY2RjAxMTkiIHNvdXJjZT0iX0hDNW84T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVN1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFSLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhU09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils5NTIsIC0zMTcsIC0xMjAzOSwgNDAyMl0kWzExNTYyLCAtMzg2MiwgLTE0MjksIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFUdWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4xOTM5NjI0NCwwLjM4NzEyOTcyKSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEREYVQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0NjczMDA1NSIgc291cmNlPSJfSEREYUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFWZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRERhVS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEREYVVPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hERGFVZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc0MCwgLTMxNywgLTkzMTQsIDQwMjJdJFs4OTQyLCAtMzg2MiwgLTExMTIsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFWLWZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4xNTYxNjgzLDAuNzkyNjQ1NikiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hERGFXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY0RDJBQjAzQ0EiIHNvdXJjZT0iX0hERFozZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hERGFYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEREYVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hERGFXZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRERhV3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1NTUsIC0zMTcsIC02OTU5LCA0MDIyXSRbNjY5MywgLTM4NjIsIC04MjEsIDQ3N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEREYVgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hERGFZT2ZYRWR1cUhvT0piVVJaUnciIGlkPSIoMC4yODIxNDg4LDAuNzY2MDg3ODMpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRERhWWVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjQ2N0IwMjVEIiBzb3VyY2U9Il9IRERadmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEREYVpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRERhWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNam9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hERGFaZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRERhWXVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEREYVktZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMzcwLCAtMzE3LCAtNDYzMSwgNDAyMl0kWzQ0NDUsIC0zODYyLCAtNTU2LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWpvZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNam8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5QiIgc291cmNlPSJfSEREWjdlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNajJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpxZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1qcC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNanBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hETWpwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE4NSwgLTMxNywgLTIzODIsIDQwMjJdJFsyMjc2LCAtMzg2MiwgLTI5MSwgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qcXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWpyT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOTAiIHNvdXJjZT0iX0hDNW80T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qci1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWpzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNanNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWpyZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qcnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjcsIC0zMTcsIDM3MCwgNDAyMl0kWy0zNDQsIC0zODYyLCA1MywgNDc3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qcy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNanRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9IigwLjQ3NzA2MjA1LDAuNzY2MDg3ODMpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qdGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVGIiBzb3VyY2U9Il9IQzVvME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qdHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanQtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwNiwgLTMxNywgMTM0OSwgNDAyMl0kWy0xMjk3LCAtMzg2MiwgMTU4LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp2T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qdmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNTk2NjI0NywwLjc5MjY0NTYpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qdnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDkxIiBzb3VyY2U9Il9IRERaemVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNandlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qdi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNandPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2NSwgLTMxNywgMzQzOSwgNDAyMl0kWy0zMzA3LCAtMzg2MiwgMzk3LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp4ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qeHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNjkwNzUzNSwwLjc5MjY0NTYpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qeC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVFIiBzb3VyY2U9Il9IQzVvc09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNanplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWp5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qeU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNanllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQyMywgLTMxNywgNTQyNCwgNDAyMl0kWy01MjEyLCAtMzg2MiwgNjM1LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWp6dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuNzY2MzQxOCwwLjU3NzExOTUpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDU2IiBzb3VyY2U9Il9IQzVvd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWoxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qMGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJUcmVlIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNajB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTU4MiwgLTMxNywgNzQ4NywgNDAyMl0kWy03MTcwLCAtMzg2MiwgODk5LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWoxLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qMk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuODY2ODg4NSwwLjc5MjY0NTYpIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRE1qNmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTFEIiBzb3VyY2U9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRERhSnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1qN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNajctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hETWo3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRE1qNnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1qNi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODAsIC01MDIsIDAsIDEzNTBdJFstODAsIC0xMjk2LCAwLCA1NTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWo4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1qOGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hETWtDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjJGQTBDMzAwN0MiIHNvdXJjZT0iX0hETWotLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hETWoyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRE1rRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERNa0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hETWtET2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRE1rRGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzY4LCAtMzE4LCA5Nzg5LCAzOTk1XSRbLTkzOTMsIC0zODM2LCAxMTY0LCA0NzddIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hETWtFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iKDAuODg1OTA0NDMsMC41NzcxMTk1KSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERNa0pPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzRBMDMwNiIgc291cmNlPSJfSEREYUp1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERNa0ZPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERNa0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hETWtLdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRE1rS09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERNa0plZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERNa0p1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTI2LCAtNTU1LCAwLCAxNTg4XSRbLTI2LCAtMTgyNSwgMCwgMzE4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRE1rSy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSERNa0xPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il84MjF3SU9vVkVkdU9CUFFBMmhLcVVRIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGNEExRDYwMjQ1IiBzb3VyY2U9Il84MjF3RU9vVkVkdU9CUFFBMmhLcVVRIiB0YXJnZXQ9Il9IRE1qMmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0ktb1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il84MjF3SmVvVkVkdU9CUFFBMmhLcVVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfODIxd0p1b1ZFZHVPQlBRQTJoS3FVUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfODIxd0pPb1ZFZHVPQlBRQTJoS3FVUSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iXzgyMXdJZW9WRWR1T0JQUUEyaEtxVVEiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il84MjF3SXVvVkVkdU9CUFFBMmhLcVVRIiBwb2ludHM9Ils3OSwgLTMxNywgLTEyNDQsIDUyMTNdJFsxMjE3LCAtNTA1MywgLTEwNiwgNDc3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwSDJ5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiPgotICAgICAgICAgICAgPGJvZHk+MDM8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9OMTlsY094TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiIG5hbWU9IkNvbmNlcHQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcFJueHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwNTYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSIgbmFtZT0iQ2hlY2tsaXN0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbnl1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE5QSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA1RSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUEzIiBuYW1lPSJFeGFtcGxlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3BSbnp1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyI+Ci0gICAgICAgICAgICAgIDxib2R5PkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDVGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiIG5hbWU9Ikd1aWRlbGluZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwUm4wdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQTQiPgotICAgICAgICAgICAgICA8Ym9keT5BIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0NjdCMDI1RCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3IiBuYW1lPSJSZXBvcnQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4cy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUI4IiBuYW1lPSJUZW1wbGF0ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA5MSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGF4dS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+U3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDY2RjAxMTkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgbmFtZT0iVG9vbE1lbnRvciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwOUIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFFMCIgbmFtZT0iV2hpdGVwYXBlciI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwYXh3LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxRTAiPgotICAgICAgICAgICAgICA8Ym9keT5XaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwQjAiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTkiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFGMyIgbmFtZT0iVGVybURlZmluaXRpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpcy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjREMkFCMDNDQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBuYW1lPSJQcmFjdGljZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2l0LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjQ2NzMwMDU1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzcwIiBuYW1lPSJzdWJQcmFjdGljZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRkQ0RUI0MDJCQiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZcGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZcE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENDcwMEZCIiBuYW1lPSJXb3JrUHJvZHVjdCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwa2l1LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFdvcmsgUHJvZHVjdCAoZGVmaW5lZCBpbiBDb250ZW50IEVsZW1lbnRzKSBwcm92aWRpbmcgYWRkaXRvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTMiIG5hbWU9InJlcG9ydHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFCNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPci1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPcnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRSIgbmFtZT0idGVtcGxhdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQjgiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWWx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0MiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QUJDODgwMkQwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSm8tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUp0T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUVFMTAxMTEiIG5hbWU9IlRhc2siPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcGtpdi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBUYXNrIChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDYiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FLWW4tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FLWW51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjgiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxVUpyZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxVUpyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MyIgbmFtZT0ic3VwcG9ydGluZ01hdGVyaWFscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RxT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RwLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjkxIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTk5IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RzZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIiBuYW1lPSJjaGVja2xpc3RzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOUEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFERTVENzMwMjBFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHV1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEUiIG5hbWU9Imd1aWRlbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBNCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPcHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNyIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFBMyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUJPdU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUJPdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA0OSIgbmFtZT0iYXNzZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjEzQzkxMzAyQzUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSm5PZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8tZTFoQU8wb0VkdXRDTEVDTjk2Qk53IiBuYW1lPSJ0ZXJtRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUYzIiBhc3NvY2lhdGlvbj0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tZ0J6MGUwb0VkdXRDTEVDTjk2Qk53IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tZ0J6ME8wb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5MTMwMkM1IiBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3B1VHUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTNDOTEzMDJDNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMkZBMEMzMDA3QyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1IiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcHVUdi1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUQ1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9ucyBxdWFsaWZ5IHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGNEExRDYwMjQ1IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkRBIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyNzAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjczIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3AzZG9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MCI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudHMgY2FuIGJlIHJlbGF0ZWQgdG8gYW55IG51bWJlciBvZiBTdXBwb3J0aW5nIE1hdGVyaWFsIGd1aWRhbmNlIGVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI3MSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjcwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3AzZHBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3AzZHBPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhGIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOTEiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcDNkcXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjhFIj4KLSAgICAgICAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50cyBjYW4gcmVmZXIgdG8gYW55IG51bWJlciBvZiBDb25jZXB0IGd1aWRhbmNlLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyOEYiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDI4RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dwM2RydWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dwM2RyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiBfM0FEQzdCNzQwMjJENDFERTVENzMwMjEwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3AzZHMtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRSI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGNoZWNrIHBvaW50cyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBjb250ZW50IGVsZW1lbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHdvcmsgcHJvZHVjdHMuCi0KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RDczMDIwRiIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURGNDFBNTAxQjYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUQ3MzAyMEUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcDNkdC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcDNkdHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTRDIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEQgXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0RSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dwM2R2T2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNURENzAxNEMiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBkZXRhaWxlZCBHdWlkZWxpbmVzIHJlbGF0ZWQgdG8gdGhpcyBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVERDcwMTREIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1REQ3MDE0QyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk9vLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9vdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU0NDAzRTEiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMiBfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UzIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3FPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUmVwb3J0IGV4dHJhY3RzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIFdvcmsgUHJvZHVjdDsgbm9ybWFsbHkgZGlyZWN0bHkgZnJvbSBhIHRvb2wgdGhhdCBtYWludGFpbnMgdGhlIFdvcmsgUHJvZHVjdHMuIEZvciBleGFtcGxlLCBhIFJlcG9ydCBjYW4gcHJlc2VudCBkZXRhaWxzIG9mIGFuIEFydGlmYWN0IG9yIGEgc2V0IG9mIEFydGlmYWN0cyBmb3IgdXNlIGluIGEgdGVjaG5pY2FsIHJldmlldy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNDQwM0UyIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RDQ3MDBGQiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTQ0MDNFMSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk9yT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk9xLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU1NTAwQzUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNiBfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3NlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGEgc2FtcGxlIG9mIHdoYXQgdGhlIHdvcmsgcHJvZHVjdCBtYXkgbG9vayBsaWtlLCBhbiBhY3R1YWwgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVFNTUwMEM2IiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREY0MUE1MDFCNiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RTU1MDBDNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxQk90ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxQk90T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCBfM0FEQzdCNzQwMjJENDFERTVFNjEwMkNFIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FCT3V1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDQyI+Ci0gICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGRldGFpbGVkIGd1aWRhbmNlIG9uIGhvdyB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QgaW5kZXBlbmRlbnQgb2YgYSBzcGVjaWZpYyBzZXQgb2YgdGFza3Mgb3IgV0JTLiAgTWF5IGNvbnRhaW4gc3BlY2lmaWMgYWxnb3JpdGhtcyBvciBhbHRlcm5hdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaGVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RTYxMDJDRCIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURFNUU2MTAyQ0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcUtZay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcUtZa3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTVGRjcwMzA0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDUgXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxS1ltT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNUZGNzAzMDQiPgotICAgICAgICAgICAgICA8Ym9keT5MaW5rcyBUYXNrcyB3aXRoIFRvb2wgTWVudG9ycyB3aGljaCBhcmUgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvdyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBwZXJmb3JtIHRoZSBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU1RUUxMDExMSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxREU1RkY3MDMwNCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxS1luT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxS1ltLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNDAyMzYiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI1MDM3MCBfM0FEQzdCNzQwMjJENDBGRDU4QjUwMzdBIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FLWW9lZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRkQ1OEI0MDIzNiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIGJlIGNvbXBvc2VkIG9mIG90aGVyIFByYWN0aWNlcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENThCNTAzN0EiIG5hbWU9Il9wcmFjdGljZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGRDRFQjQwMkJCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGRDU4QjQwMjM2Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMSBfM0FEQzdCNzQwMjJENDFERjQxQzYwM0EyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3FLWXFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIHJlZmVyZW5jZSBhbnkgQ29udGVudCBFbGVtZW50LiAgVGhlIGFzc29jaWF0aW9uIGV4cHJlc3NlcyB0aGF0IHRoaXMgQ29udGVudCBFbGVtZW50IGlzIHBhcnQgb2Ygb3IgYmVsb25ncyB0byB0aGlzIFByYWN0aWNlLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREY0MUM2MDNBMiIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEZENEVCNDAyQkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MURGNDFDNjAzQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKbHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwNDkgXzNBREM3Qjc0MDIyRDQyMTNDOTNGMDA5OSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxVUptT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRDAzMjEiPgotICAgICAgICAgICAgICA8Ym9keT5BIHdvcmsgcHJvZHVjdCBpcyByZWxhdGVkIHRvIG9uZSBvciBtb3JlIGFzc2V0cyB0byA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEzQzkzRjAwOTkiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxM0M5M0QwMzIxIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSm4tZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSm51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg4MDJEMCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QUJDODkwMzdDIF8zQURDN0I3NDAyMkQ0MjdBQkM4OTAzN0UiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0FCQzg5MDM3RSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBQkM4ODAyRDAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKcHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NEQ4RjUxNDAyMjcgXzNBREM3Qjc0MDIyRDQ0RDhGNTE0MDIyOCI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI3IiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERTVFRTEwMTExIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDREOEY1MTQwMjI2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3FVSnF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3FVSnFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDREOEY1MTgwMEY2IF8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjciPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0RDhGNTE4MDBGNiIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNUQ0NzAwRkIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NEQ4RjUxODAwRjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcVVKc2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcVVKc09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfLWQ4d01PMG9FZHV0Q0xFQ045NkJOdyIgbWVtYmVyRW5kPSJfLWUxaEFPMG9FZHV0Q0xFQ045NkJOdyBfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfLWdCejB1MG9FZHV0Q0xFQ045NkJOdyIgbmFtZT0iIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFERjQxQTUwMUI2IiBhc3NvY2lhdGlvbj0iXy1kOHdNTzBvRWR1dENMRUNOOTZCTnciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8tZ0J6MU8wb0VkdXRDTEVDTjk2Qk53IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8tZ0J6MC0wb0VkdXRDTEVDTjk2Qk53Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNSIgbmFtZT0iQ2F0ZWdvcmllcyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9HcmdjYy1mWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEY0OEZDRTAwNjAiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY0OEZDRTAwNjAiIHR5cGU9IkNsYXNzIiBuYW1lPSJDYXRlZ29yaXphdGlvbnMiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1VzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEV1V0T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERXVXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V2LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEV1VzZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERXVXN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU2MTIiIHk9Ijk4ODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V3T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVdy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRFdVeE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDAxMyIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERXVXhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1V4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVeXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEV1V6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRFdVenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRFdVei1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVd2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRFdVd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDI5NCIgeT0iMTM0MTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGb09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRGdGb2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRm91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGby1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0ZwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0ZxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGck9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRFdVMGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEV1UwdWZYRWR1cUhvT0piVVJaUnciIHg9IjIxMTkyIiB5PSI5OTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSERnRjktZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRi0tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGX09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRl9lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRl8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdHQU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0FlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0F1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSERnRjlPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdGOWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjI3MiIgeT0iOTkzMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0p1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEZ0dLdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NDcwIiBoZWlnaHQ9IjExMTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dMdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0wtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dNT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR01lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dNdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR00tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dOT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dOZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEZ0dKLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dLT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3MTI3IiB5PSIxMzQxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEcFBtdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQbS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBudWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUG4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBvT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUG9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUG8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBwT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBwZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEcFBsLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERwUG1PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjk3NTEiIHk9Ijk5MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB5ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQ0IiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQemVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAxT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFAxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQMk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHBQeXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQeS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDQ1OSIgeT0iMTMyMzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQM09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRHBQM2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFA1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQNS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHBQNk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRHBQMnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEcFAyLWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NjYxIiB5PSI5OTMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSER6QW51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBb2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QW91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBcGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QXFlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QW0tZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBbk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjM3NCIgeT0iMzk0NSIgd2lkdGg9IjQyMzMiIGhlaWdodD0iMjE3NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekE1T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTcyIiBoZWlnaHQ9IjExNjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QTdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekE3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEekE0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEekE0dWZYRWR1cUhvT0piVVJaUnciIHg9IjM4ODU0IiB5PSIxMzMwMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QThPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEekE5T2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDE0IiBoZWlnaHQ9Ijg5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekE5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QS1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBLWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QS11ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpBX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QV91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QV8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSER6QThlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBOHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzODc3NyIgeT0iMTAwMTYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhsT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNEUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRDh4bU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4bnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhuLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4b09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4b3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4by1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRDh4bGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHhsdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0MDMiIHk9Ijk5MzEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhyZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4c09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRDh4c2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxMTE3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4dS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4dk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRDh4cnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh4ci1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5NDQ4IiB5PSIxMjY2NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hEOHh3ZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eHl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHh5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHh6T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hEOHh2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEQ4eHYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTEwMDYiIHk9Ijk5MTQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1Yi1FT29qRWR1VkE3dnQ1cWJJSlEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQU9vakVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il85dWxJQWVvakVkdVZBN3Z0NXFiSUpRIiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfOXVsSUF1b2pFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQS1vakVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzl1bElCT29qRWR1VkE3dnQ1cWJJSlEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQmVvakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElCdW9qRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQi1vakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElDT29qRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQ2VvakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXzl1bElDdW9qRWR1VkE3dnQ1cWJJSlEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il85dWxJQy1vakVkdVZBN3Z0NXFiSUpRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il85dWxJRE9vakVkdVZBN3Z0NXFiSUpRIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il85dWItRWVvakVkdVZBN3Z0NXFiSUpRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iXzl1Yi1FdW9qRWR1VkE3dnQ1cWJJSlEiIHg9IjE2ODI3IiB5PSIyMDg5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3JnY2RlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxUaGUgQ2F0ZWdvcmllcyBwYWNrYWdlIGNvbnRhaW5zIGNsYXNzZXMgdGhhdCBwcm92aWRlIGRpZmZlcmVudCB3YXlzIHRvIGxvZ2ljYWxseSBjYXRlZ29yaXplIGNvbnRlbnQgZWxlbWVudHMuICBJbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBjYXRlZ29yaWVzIHRoYXQgaGF2ZSBiZWVuIHByZWRlZmluZWQgZm9yIG1vc3QgY29udGVudCBlbGVtZW50IHR5cGVzIGluIHRoaXMgbWV0YS1tb2RlbCwgaXQgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdHkgZm9yIHVzZXJzIHRvIGRlZmluZSB0aGVpciBvd24gY3VzdG9tIGNhdGVnb3JpZXMgb24gY29udGVudCBlbGVtZW50cy4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4gVGhpcyBkaWFncmFtIHNob3dzIHRoZSB0YXhvbm9teSBvZiBhbGwgcHJlLWRlZmluZWQvc3RhbmRhcmQgY2F0ZWdvcnkgbWV0YS1jbGFzc2VzIGFzIHdlbGwgYXMgdGhlIGRlZmluaXRpb24gZm9yIEN1c3RvbSBDYXRlZ29yeSBjbGFzc2VzLCB3aGljaCBjYW4gYmUgZGVmaW5lZCBieSB0aGUgdXNlciB0byBjYXRlZ29yaXplcyBhbnkgQ29udGVudCBFbGVtZW50IGFzIHdlbGwgYXMgY2FuIGJlIG5lc3RlZCB3aXRoIG90aGVyIENhdGVnb3JpZXMgKGkuZS4gb3RoZXIgY2F0ZWdvcmllcyBjYW4gYmUgZGVmaW5lZCB0byBiZSBhIHN1Yi1jYXRlZ29yeSBvZiBhbnkgY3VzdG9tIGNhdGVnb3J5KS4mI3hBO3wmI3hBOyIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdGcmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2IiBzb3VyY2U9Il9IRFdVME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRFdVc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0ZzZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGdGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMCIgeT0iLTI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDA5IiB5PSIyNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGdXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg4IiB5PSItMjcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc0OCIgeT0iLTU5MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0Z4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0Z4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRnl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Z6dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRnotZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRnplZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0ZydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERnRnItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg1NSwgLTQyLCA0MDIxLCA4XSRbLTMzMTgsIC00MiwgMTU1NywgOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEZ0YwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiIHNvdXJjZT0iX0hEV1V3T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEV1UwT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGMXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERnRjFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0YyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMCIgeT0iNDQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGMi1mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OCIgeT0iLTYzNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0YzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGM3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTIzIiB5PSI0ODIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGNHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGNGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjQxIiB5PSItODA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnRjZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnRjZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0Y2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdGN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGN3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGN09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnRjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRGdGOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdGOE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERnRjBlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdGMHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAtNTY3LCAtOCwgMjk4OF0kWy0yNjIsIC0zMDczLCAtOCwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERnR0EtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCIgc291cmNlPSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0NPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dDZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRGdHQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0MtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTk5IiB5PSItMjYyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTExOSIgeT0iMzE2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0VPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0V1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0ZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTExOCIgeT0iLTMyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dHZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHR3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dHLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR0lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0llZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0gtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERnR0plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR0ktZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0dCT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERnR0JlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg1NSwgNzYsIC04NTUsIDc2XSRbLTMxODMsIDc2LCAtMzE4MywgNzZdJFstMzE4MywgMTQ2NCwgLTMxODMsIDE0NjRdJFstNDA2LCAxNDY0LCAtNDA2LCAxNDY0XSRbLTQwNiwgNDgyLCAtNDA2LCA0ODJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRGdHTnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3IiBzb3VyY2U9Il9IRGdHSnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRGdGOC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR09lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1BPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEZ0dPdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTEiIHk9IjE1MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dRT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1FlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzA0IiB5PSItMTA4MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERnR1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRGdHUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMiIgeT0iLTI0MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dSLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zOTkiIHk9Ijc5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEZ0dULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEZ0dVT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEZ0dUdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRGdHVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUGtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUGtlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERnR1V1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUGxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUGstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEZ0dOLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRGdHT09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMzU1LCAtNTY3LCAxODc5LCAyOTg4XSRbLTE5MzAsIC0zMDczLCAzMDQsIDQ4Ml0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEcFBwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTkiIHNvdXJjZT0iX0hEZ0dKdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEcFBsdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSERwUHF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFByZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFByLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBydWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMSIgeT0iLTEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQc3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODUxIiB5PSIxMDcxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB0T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii00IiB5PSItMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHQtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTAyNSIgeT0iMTM4NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQdmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFB3T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFB2dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQd2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUHctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUHd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFB4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSERwUHlPZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQeHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSERwUHAtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEcFBxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI5NiwgLTU2NywgLTE2ODQsIDI5ODhdJFsxNzAxLCAtMzA3MywgLTI3OSwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSERwUDZlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOSIgc291cmNlPSJfSERwUHllZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSERwUDJlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA3LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHBQN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwIiB5PSItMzczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFA5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHBQOU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTciIHk9IjExNTkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBQOXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFAtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUDktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIyIiB5PSItMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUC1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSERwUC0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSERwUC11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIiIHk9IjU3NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEcFBfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEcFBfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFBfZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHBRQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekFrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEcFFBZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QWxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QWxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QWstZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QW1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QWwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEcFA2dWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSERwUDYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTMwNCwgLTU1MCwgLTUwLCAzMTA3XSRbLTMwNCwgLTMxNzUsIC01MCwgNDgyXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjcxMjk1MDE3RiIgc291cmNlPSJfSERXVXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekFzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBcnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXEtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekFyT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzExMCwgLTQ5MSwgLTEyMTAsIDQ4NDJdJFsxMDMyLCAtNDI1MCwgLTI4NywgMTA4M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXNlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekFzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OCIgc291cmNlPSJfSERXVTBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBd09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXZlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekF2dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zMzAsIC00OTEsIDMyMjUsIDQ4OTNdJFstMjg1MywgLTQzMDEsIDcwMiwgMTA4M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSER6QXctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF4T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSER6QXhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NiIgc291cmNlPSJfSERnRjgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QXl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekF5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpBeWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QXh1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekF4LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NzAsIC00OTEsIDc4NjUsIDQ4OTNdJFstNjg5MSwgLTQzMDEsIDE3NDQsIDEwODNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekF6T2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBemVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekF6dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTgiIHNvdXJjZT0iX0hEcFBsdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekF6LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBME9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE0MywgLTQ5MSwgMTE3MDksIDQ4OTNdJFstMTA3MzUsIC00NTA0LCAyMTE2LCA4ODBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekExZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBMXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekExLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjgiIHNvdXJjZT0iX0hEcFAyZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBMnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekEzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpBM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QTItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekEyT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpBMmVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzcwLCAtMzU1LCAxNjM5OSwgNTAyOV0kWy01MDQ2LCAtMjMwMiwgMTIxMjQsIDMwODFdJFstMTUwNTMsIC00ODUxLCAyMTE2LCA1MzNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekEzdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpBMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBRTAyOTgiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QkJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEekJBZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpCQXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTM5LCAtNDU3LCAyMDg1MywgNDk3OF0kWy04Mjg4LCAtMzkzNywgMTM1MDQsIDE0OThdJFstMTk2NzYsIC01MjA3LCAyMTE2LCAyMjhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEekJCLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRHpCQ09mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJDZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekFtdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSER6QkRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJFZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMDU4IiB5PSIyNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCRS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCRk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJGLWZYRWR1cUhvT0piVVJaUnciIHg9IjMxNzciIHk9IjkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6Qkd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUyNiIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QkhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSER6QkktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSER6QkllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDM2NTIwM0I3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCSnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QktPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qkt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCSy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCS2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSER6QkN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRHpCQy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszMywgLTQ0OCwgMjE4MjcsIDQ5ODZdJFszMywgLTU3NTcsIDIxODI3LCAtMzIxXSRbLTE5Njc2LCAtNTc1NywgMjExNiwgLTMyMV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hEekJMT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiIHNvdXJjZT0iX0hEekE4T2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hEekE0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRHpCTU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTAwIiB5PSItMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJOT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE3MiIgeT0iMzgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCTi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIzIiB5PSItMTYwOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDM3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6Qk8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTAiIHk9IjQwNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJQZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02OSIgeT0iLTE4NDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwM0NGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCUU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRHpCUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRHpCUnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRHpCUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSER6QlItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEekJTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEekJTdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEekJTT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4a09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHhrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHhrZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRHpCTGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hEekJMdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCA0NDAsIC0yNTQsIC0zMTY2XSRbNTAsIDMwMTQsIC0yNTQsIC01OTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh4cE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU0IiBzb3VyY2U9Il9IRDh4bE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4cWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eHF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHhxT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh4cGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eHB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTE3NiwgLTQ5MSwgLTEyMjg1LCA0ODkzXSRbMTEzMzYsIC00NTQ2LCAtMjEyNSwgODM4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRDh4cS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eHJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh4emVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1IiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRDh4bE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDAtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHgwZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4MWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODQiIHk9Ii0zNDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4MS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjU1OSIgeT0iMzE5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4M09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgyLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjkiIHk9IjI4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHgzdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMDMyIiB5PSItMzgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eDUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eDVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHg2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4NnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4Ni1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4NmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh4Ny1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4N2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eHp1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4ei1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTMxLCAtMTE4LCA1OTc3LCAtMTE4XSRbLTUyODMsIC0xMTgsIDE2MjUsIC0xMThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh4OE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRDh4cmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eDl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHg5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4OS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4LWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4LU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI5OSIgeT0iLTE4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHgtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh4X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eC0tZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTYiIHk9Ijg5OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHhfZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eF8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh4X3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY5IiB5PSItMTg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUFlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM1OSIgeT0iNjcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eUN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUNPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5RHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5RE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRDh5RXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRDh5RU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEQ4eDhlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRDh4OHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNjYyLCAzMTgsIDIzOCwgLTE5MzFdJFstNjYyLCAxOTMyLCAyMzgsIC0zMTddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRDh5RS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTNCIiBzb3VyY2U9Il9IRDh4dmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRHpBbXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5R09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hEOHlGLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRDh5Rk9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eUZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNjAxLCAtNTA4LCAtNTk1MiwgNDg3Nl0kWzUyMTUsIC00MzAxLCAtMTMzNywgMTA4M10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEQ4eUd1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hEOHlHLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEQ4eUhPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiIgc291cmNlPSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEQ4eHZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlILWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRDh5SU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlKT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5S2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eUt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM0NCIgeT0iLTIwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlMZWZYRWR1cUhvT0piVVJaUnciIHg9IjU5NCIgeT0iLTk3MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlNdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlNT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5TS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hEOHlOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hEOHlOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRDh5Ti1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEQ4eU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eU91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eU9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hEOHlQZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEQ4eVB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEQ4eVBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hEOHlIZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEQ4eUh1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDE0LCA0OTksIDQxNCwgNDk5XSRbNDE0LCAxNDMwLCA0MTQsIDE0MzBdJFsyMTUwLCAxNDMwLCAyMTUwLCAxNDMwXSRbMjE1MCwgLTQyLCAyMTUwLCAtNDJdJFs5MzEsIC00MiwgOTMxLCAtNDJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9EM2x0b09va0VkdVZBN3Z0NXFiSUpRIiBlbGVtZW50PSJfRDNiOG9Pb2tFZHVWQTd2dDVxYklKUSIgc291cmNlPSJfSER6QW11ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfOXViLUVPb2pFZHVWQTd2dDVxYklKUSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRvLW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRDNsdHBlb2tFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0QzbHRwdW9rRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0QzbHRwT29rRWR1VkE3dnQ1cWJJSlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9EM2x0b2Vva0VkdVZBN3Z0NXFiSUpRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfRDNsdG91b2tFZHVWQTd2dDVxYklKUSIgcG9pbnRzPSJbLTUsIC00MSwgLTQsIDU5XSRbLTYzLCAtMTA0LCAtNjIsIC00XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxZDZrLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiPgotICAgICAgICAgICAgPGJvZHk+MDQ8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfZGRqOHNPeGRFZHVIamUzcFBhaE40QSIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTkwIi8+Ci0gICAgICAgICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfZWFXOElPeGRFZHVIamUzcFBhaE40QSIgaW1wb3J0ZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIG5hbWU9IkRpc2NpcGxpbmUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcW5FaC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjI3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTNCIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIiBuYW1lPSJ0YXNrcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyZ2NhdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyZ2NhZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjUwMjY2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2NlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY2NPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCIgbmFtZT0iUm9sZVNldCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVpLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTVDIiBuYW1lPSJyb2xlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1OSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1pdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1pZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIG5hbWU9IkRvbWFpbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVqLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiPgotICAgICAgICAgICAgICA8Ym9keT5Eb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTdBIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcTZtay1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcTZta3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NyIgbmFtZT0ic3ViZG9tYWlucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdjT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxbkVrLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiPgotICAgICAgICAgICAgICA8Ym9keT5Xb3JrIFByb2R1Y3QgVHlwZSBpcyBhIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgJnF1b3Q7Q2xhc3MgRGlhZ3JhbSZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICZxdW90O1NwZWNpZmljYXRpb24mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiIG5hbWU9IndvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dyRHdlZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dyRHdlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFnT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPgotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX0QzYjhvT29rRWR1VkE3dnQ1cWJJSlEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSIgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWhPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSI+Ci0gICAgICAgICAgICAgIDxib2R5PkRpc2NpcGxpbmUgR3JvdXBpbmdzIGFyZSB1c2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICZxdW90O1NvZnR3YXJlIERpc2NpcGxpbmVzJnF1b3Q7IHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQmcXVvdDsgb3IgJnF1b3Q7VGVzdGluZyZxdW90OzsgJnF1b3Q7SVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCZxdW90OyB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICZxdW90O0lUIE9wZXJhdGlvbmFsIFNlcnZpY2VzJnF1b3Q7LCAmcXVvdDtJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzJnF1b3Q7LCBvciAmcXVvdDtJVCBFbmFibGluZyBTZXJ2aWNlcyZxdW90Oy4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFOCIgbmFtZT0iZGlzY2lwbGluZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hck5oZHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU4IiBuYW1lPSJUb29sIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3F3MWlPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDFDQiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyWU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5IiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcXcxak9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjU5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjcxMjk1MDE3RiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxOSIgbmFtZT0icm9sZVNldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIzMCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyYWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcldyYU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCQTIwMDlDIiBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxdzFrT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiPgotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCQUUwMjk4IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjQ0Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCREYwMzdGIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JXcmItZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JXcmJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQiIG5hbWU9InN1YkNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjWWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE1QyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dxNm1nLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNTkiPgotICAgICAgICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IGNhdGVnb3JpemVzIG1hbnkgUm9sZXMgYW5kIGEgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gbWF5IFJvbGUgU2V0cy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNUEiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzAiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTU5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3E2bWgtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3E2bWh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc4IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxN0EiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcTZtak9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTc3Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSBXb3JrIFByb2R1Y3RzLiBBIFdvcmsgUHJvZHVjdCBiZWxvbmdzIGF0IG1vc3QgdG8gb25lIERvbWFpbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxNzgiIG5hbWU9ImRvbWFpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjMxIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE3NyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dxNm1rT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dxNm1qLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NSBfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk3Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3E2bWxlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDE5NCI+Ci0gICAgICAgICAgICAgIDxib2R5PkRvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIFN1YmRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIG9ubHkgdG8gYmUgY2F0ZWdvcml6ZWQgYXQgdGhlIGxlYWYtbGV2ZWwuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMTk1IiBuYW1lPSJfZG9tYWluIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMzEiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxOTQiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFBOSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxQUMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HckR3Y3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIHplcm8gb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUFBIiBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyM0EiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUE5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JEd2R1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JEd2RlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFFNSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU2IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HckR3ZS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUU1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgZ3JvdXAgbWFueSBEaXNjaXBsaW5lcy4gIEEgRGlzY2lwbGluZSBjYW4gYmUgaW4gbWFueSBEaXNjaXBsaW5lIEdyb3Vwcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTYiIG5hbWU9ImRpc2NpcGxpbmVHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRTUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hck5oYy1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oY3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMUY5IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDFGQyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyTmhlT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPgotICAgICAgICAgICAgICA8Ym9keT5BIFRvb2wgTWVudG9yIGRlc2NyaWJlcyB3b3JrIHdpdGggZXhhY3RseSBvbmUgVG9vbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRkEiIG5hbWU9InRvb2wiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAxRjkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hck5oZk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hck5oZS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDIxNiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE3IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcldyWXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMjE2Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBSb2xlIFNldCBHcm91cGluZyBjb250YWlucyBtYW55IFJvbGUgU2V0cy4gUm9sZSBTZXRzIGNhbiBiZSBpbiBtYW55IFJvbGUgU2V0IEdyb3VwaW5ncy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTciIG5hbWU9InJvbGVTZXRHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI1OSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAyMTYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyWnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcldyWmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFCREVCREUwMjNEIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzN0YgXzNBREM3Qjc0MDIyRDQxQkRFQkRGMDNDRiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JhLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPgotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGdyb3VwcyB0b2dldGhlciBhbnkgbnVtYmVyIG9mIENvbnRlbnRFbGVtZW50cyBpbmNsdWRpbmcgb3RoZXIgQ29udGVudENhdGVnb3J5LiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJERUJERjAzQ0YiIG5hbWU9ImN1c3RvbUNhdGVnb3JpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxQkRFQkEyMDA5QyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUJERUJERTAyM0QiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcldyY3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcldyY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwRDM2NTAwMzNGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MjAzQUQgXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyV3JkT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPgotICAgICAgICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGNhbiBoYXZlIGFueSBudW1iZXIgb2YgQ29udGVudENhdGVnb3JpZXMgZGVmaW5lZCBhcyBuZXN0ZWQgc3ViQ2F0ZWdvcmllcy4gIFRoZXJlZm9yZSwgb25lIGNvdWxkIG5lc3QgQ3VzdG9tQ2F0ZWdvcmllcyBpbnRvIG4tbGV2ZWwgaGllcmFyY2hpZXMuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzNjUyMDNCNyIgbmFtZT0iX2N1c3RvbUNhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUJERUJBMjAwOUMiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjBEMzY1MDAzM0YiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HcmdjWk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HcmdjWS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk4OEIyMDBFQiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVDIF8zQURDN0I3NDAyMkQ0Mjc5ODhCMjAwRUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcmdjWnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4KLSAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgVGFzayBzaG91bGQgYmUgcmVsYXRlZCB0byBleGFjdGx5IG9uZSBEaXNjaXBsaW5lLiAgRm9yIGxlZ2FjeSByZWFzb25zIHRoaXMgaXMgbm90IGVuZm9yY2VkIChlLmcuIEdTIE1ldGhvZCBkb2VzIG5vdCBkZWZpbmUgRGlzY2lwbGluZXMsIHlldCkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVEIiBuYW1lPSJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3OTg4QjIwMEVCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3JnY2JlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3JnY2JPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDQ1QTU5MjcwMzZEIF8zQURDN0I3NDAyMkQ0NDVBNTkyNzAzNkYiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI3MDM2RiIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDIyNyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ0NUE1OTI1MDI2NiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiIgbmFtZT0iQmFzaWNFbGVtZW50cyI+Ci0gICAgICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9Hc1owU2VmWEVkdXFIb09KYlVSWlJ3IiBzb3VyY2U9InVtbDIuZGlhZ3JhbXMiIHJlZmVyZW5jZXM9Il8zQURDN0I3NDAyMkQ0MEYzNkQ2NjAyRkIiPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkQ2NjAyRkIiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3Zy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN2dlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlVNTDIgSW5mcmFzdHJ1Y3R1cmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3Z3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI0NDE5IiB5PSI1MTYiIHdpZHRoPSI4ODM5IiBoZWlnaHQ9IjcwOTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdoZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTY1ODAxNTciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRUY3aWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3amVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ai1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3a2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFRjdrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ay1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3bE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRUY3aHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFRjdoLWZYRWR1cUhvT0piVVJaUnciIHg9IjEwNDk4IiB5PSI2MzMzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREU4MzMwMUE1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN21PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVGN21lZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQzNjgiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN20tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3bk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN25lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3bnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN24tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3b09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN29lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3b3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3BPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN2x1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3bC1mWEVkdXFIb09KYlVSWlJ3IiB4PSI1Mzg0IiB5PSIzNTk4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3cGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREVDQjUwMDk4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3FPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVGN3FlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI1NzMiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjdxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRUY3ck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3JlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3cnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3ItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3c09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRUY3c3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVGN3MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVGN3RPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVGN3B1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3cC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5OCIgeT0iNDQxMSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2plZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFMDYyMDJENSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFUHNrZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyODEwIiBoZWlnaHQ9IjE1NDAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBza3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2xPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2wtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc21lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzbXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc20tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQc25PZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVQc2p1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzai1mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MjE0IiB5PSIxMTA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc3MtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzNTIiIGhlaWdodD0iMTA4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3RlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzdnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNzZWZYRWR1cUhvT0piVVJaUnciIHg9IjkyOTYiIHk9IjEyMTU4Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQc3ctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHN4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc3gtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHN6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzenVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzd09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHN3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjM5NzkiIHk9IjE2NDQyIiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIxNTU3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQczl1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQxODIiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzLWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQcy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHMtLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHNfLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0QU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0QWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVBzOC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHM5T2ZYRWR1cUhvT0piVVJaUnciIHg9IjEwNTU3IiB5PSI5OTM5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTRBOTcwMTIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVQdEQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRGT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0RmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Ri1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFUHRHT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0R2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVB0R3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVB0RE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHREZWZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MjgiIHk9IjEzOTQ0IiB3aWR0aD0iNDU1NSIgaGVpZ2h0PSIxNDgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyci1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMnMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0ODkiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ1T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ1dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkydnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyc09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJzZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxOTEiIHk9IjExMjA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkydi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMnctZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQwODAiIGhlaWdodD0iMTE1MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJ4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMngtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyeS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJ6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyemVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyenVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyd09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJ3ZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzMTIiIHk9IjEzNDQ1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVZMjAtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyMi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTIzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyM2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyM3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRVkyME9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTIwZWZYRWR1cUhvT0piVVJaUnciIHg9IjU1MzciIHk9Ijc5NTgiIHdpZHRoPSI0MDY0IiBoZWlnaHQ9IjE1NTciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hc1owUy1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIGxvd2VzdCBsZXZlbCBwYWNrYWdlIGluIE1ldGhvZCBDb3JlIGRlZmluZXMgdGhlIGNsYXNzIE1ldGhvZCBFbGVtZW50IGZyb20gd2hpY2ggYWxsIG90aGVyIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiBhcmUgZGVyaXZlZCBmcm9tLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYS1zdHJ1Y3R1cmUgTGlicmFyeSBlbGVtZW50IFBhY2thZ2VhYmxlIEVsZW1lbnRzLiAgVGhpcyBwYWNrYWdlIGFsc28gZGVmaW5lcyBrZXkgYmFzaWMgZWxlbWVudHMgdXNlZCB0byBkZS1maW5lIGFuZCBzdHJ1Y3R1cmUgbWV0aG9kIGNvbnRlbnQgdHlwZXMuICBFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiBBIE1vZGVsIEVsZW1lbnQgaXMgcGFydCBvZiBhIG1ldGhvZCBtb2RlbCBhbmQgZXZlcnkgbWV0aG9kIG1vZGVsIHBhcnQgaXMgYSBNZXRob2QgRWxlbWVudC4gIEV2ZXJ5IE1ldGhvZCBFbGVtZW50IGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVGN3RlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEJEMDI4RiIgc291cmNlPSJfSEVGN2hlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFRjd1T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNnZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRUY3dWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVGN3R1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRUY3dC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTMzLCAwLCAxMzk3XSRbMCwgLTE0MTMsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2d1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNnLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQc2hPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGNzFCMDNBOCIgc291cmNlPSJfSEVGN3BlZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2xlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNpdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVBzaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQc2hlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHNodWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMjk1LCAtMjU0LCAyOTIxLCA1NThdJFstMjAzMiwgLTM5NywgMjE4NCwgNDE0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzaS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQc2pPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVBzbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4RDQwMjExIiBzb3VyY2U9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzamVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc29PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQc28tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHNvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVBzbnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFUHNuLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzUwLCAtNTI0LCAwLCAxNzEwXSRbNTAsIC0xNDY0LCAwLCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNwT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHNwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERjkxMjAzQzAiIHNvdXJjZT0iX0hFRjdwZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHNqZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHNxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzck9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQc3F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFUHNwLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzcU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNzExLCAtNTI0LCAzNDU0LCAyNTIzXSRbLTMxMTUsIC0yMjc3LCAxMDQ5LCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFUHNyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVBzcnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFUHN6LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVQczAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHMxLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMiIgeT0iNjI2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczJ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzciIHk9IjI4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHMzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzM2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNDc5IiB5PSI1NjIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzMy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE1MCIgeT0iMzA2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVQczZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQczUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHM2dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVBzN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQczhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVBzOGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVBzNy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQczBPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVBzMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODEyLCA3NzgsIC04MTIsIDc3OF0kWy04MTIsIDE3MTgsIC04MTIsIDE3MThdJFstMzYxNSwgMTcxOCwgLTM2MTUsIDE3MThdJFstMzYxNSwgODQsIC0zNjE1LCA4NF0kWy0yMjY5LCA4NCwgLTIyNjksIDg0XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVQdEF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzI3MDEwNiIgc291cmNlPSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVGN2hlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRDT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVB0QnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQdEEtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVB0Qk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTI0MywgLTUwMywgMCwgMzI4MF0kWy0xMjQzLCAtMzQ2NiwgMCwgMzE3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVB0Q2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVQdEN1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVB0Ry1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBzb3VyY2U9Il9IRVB0Qy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzdi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEllZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFUHRILWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0Sk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVB0SS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDIiIHk9IjM4OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVQdEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFUHRKdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMTQiIHk9Ii0zNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVB0S09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFUHRLdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVQdEtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ2IiB5PSIxNDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyY2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNTIxIiB5PSItMjA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMmV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkyZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVQdEhPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVB0SGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0NzYsIDcxNCwgNDEyNywgLTE4MjZdJFs0NzYsIDI2MTksIDQxMjcsIDc5XSRbLTE0MDIsIDI2MTksIDIyNDksIDc5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVZMmctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEVQdEMtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVQczh1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJodWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRVkyaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMml1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzNCIgeT0iLTI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzUyIiB5PSIxNzYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkya09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMmtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5IiB5PSItMTQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMmstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJsT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI3NCIgeT0iLTM0OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJtZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFWTJuZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFWTJtLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkybnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMm9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJvdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMnBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMm8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTJoT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZMmhlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjI3NywgNTksIC00NjUsIDQyMjRdJFs0MzE4LCA1OSwgMTU3NCwgNDIyNF0kWzQzMTgsIC0zNTg5LCAxNTc0LCA1NzVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkycHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRVBzci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkycS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTJxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkycC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTJxT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQ1NywgLTU1MCwgLTEyMTksIDE2MzRdJFs0NTcsIC0xNjA4LCAtMTIxOSwgNTc1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkycmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMnJ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkyMy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFQzMzNEYwMTk4IiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRUY3bGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTI0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkyNE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTI0ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC03ODcsIDAsIDM4MzVdJFswLCAtNDEwNiwgMCwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkyNXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZMjUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkyNk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIiBzb3VyY2U9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyci1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFWTI3T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyNy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMjhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkyOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMjgtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTI5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMjktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkyOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2IiB5PSItMTY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMi1lZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3IiB5PSIxMDkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZMl9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZMl91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZMl9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTJfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVZM0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVZM0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkzQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkzQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0ItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVZM0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRVkzQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRVkzQ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVZMjZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRVkyNnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjAzOCwgMTU5LCAxNTgsIC0yODA0XSRbLTI2OTksIDE1OSwgLTUwMywgLTI4MDRdJFstMjY5OSwgMjQ2MCwgLTUwMywgLTUwM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTNDLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVBRTAyQ0UiIHNvdXJjZT0iX0hFWTJyLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZM0QtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTNET2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0RlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTQxLCAtNTc1LCAtMTU5MSwgMjQ3Ml0kWzU0MSwgLTIyNzcsIC0xNTkxLCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFWTNFdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFWTNGT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIHNvdXJjZT0iX0hFUHN2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFWTNHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRVkzR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVZM0dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFWTNGZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVZM0Z1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbODk5LCAtNzk0LCAtNDI0LCA3Njk5XSRbODk5LCAtNzcyNiwgLTQyNCwgNzY3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRVkzRy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVZM0hPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRVkzSGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9IRVBzOHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRVkyei1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5jZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRVkzSHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFWTNILWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDkxLCA4NCwgMjk4OCwgMTg2Ml0kWy0zNDM3LCA4NCwgMTY0MiwgMTg2Ml0kWy0zNDM3LCAtOTk5LCAxNjQyLCA3NzhdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5kT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hFUHRDLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5kLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbmVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE3MDEsIC03MzYsIDYzNSwgNTIwN10kWy0xNzAxLCAtNTE3MywgNjM1LCA3NzBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFaW5mZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWluZnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5mLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwQzAwQTYiIHNvdXJjZT0iX0hFWTJ6LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFWTJ2LWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluZ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5oT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5odWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluaWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRWluaXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDA1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluanVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5qZWZYRWR1cUhvT0piVVJaUnciIHg9IjY4MiIgeT0iMTc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAwNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbmtPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjgyIiB5PSItMjAzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMzciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5sT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5rLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5tT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW5tZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFaW5sLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlubXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbm5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbm0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5udWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVpbm9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVpbm4tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5nT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbmdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMzgsIC00NzYsIDE5MDUsIC01Njg4XSRbLTUxMDcsIC00NzYsIC0xMTY0LCAtNTY4OF0kWy01MTA3LCA0NzA5LCAtMTE2NCwgLTUwM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFaW5vdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTVFNjY3QTAwRDkiIHNvdXJjZT0iX0hFWTJ2LWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFRjdsZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVpbnB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFaW5vLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVpbnBPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIzMjgsIC0xNTksIC02MDMyLCA5ODY5XSRbLTI2NzEsIC0xNTksIC02Mzc1LCA5ODY5XSRbLTI2NzEsIC0xMDEzMywgLTYzNzUsIC0xMDVdJFsxNzQ3LCAtMTAxMzMsIC0xOTU3LCAtMTA1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRWlucWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVpbnF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTlllZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiI+Ci0gICAgICAgICAgICA8Ym9keT4wMTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX25veVRNT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURERjg2OTAxMkUiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX2M2dGRrT3g1RWR1NS12VmpsZlZzZlEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MTE5QTYyQjAzNkYiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgbmFtZT0iTWV0aG9kRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dycU5aLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVDMzM0RjAxOTgiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNTAiIG5hbWU9Imd1aWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3JxTmEtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1MCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il82OUFXRWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il82OUFXRU95RkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84elVYY095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA0NyIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcnFOYnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDQ3Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX1I4SVpzZXlGRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX1I4SVpzT3lGRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX1RHQ29FT3lGRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1RTkwMDA4IiBuYW1lPSJvd25lZFJ1bGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MjdBODU3QjAzMzMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUiIG5hbWU9Im1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDU1RTYyMDIwMzJBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NUU2NTBDMDBBNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzWjBSLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzWjBSdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyI+Ci0gICAgICAgICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyelhWdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICA8Ym9keT5Db250ZW50IERlc2NyaXB0aW9uIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwMDU4M0IwMUU2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjMyMTkwMDI5IiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFd1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREYzMjE5MDAyOSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8zVTExTWV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8zVTExTU95SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8zTnNFVU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCIgbmFtZT0ic2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEU2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEU09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBuYW1lPSJTZWN0aW9uIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3J6WFhlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NTYyNDAxN0UiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjI1RDAyMzQiIG5hbWU9InNlY3Rpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlVLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjI1RDAyMzQiPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9vMVZVSWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9vMVZVSU95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9vdGI4WU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0REYzMDAzQSIgbmFtZT0ic2VjdGlvbkRlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dyOUlWdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERGMzAwM0EiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il81UFZMOGV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il81UFZMOE95SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il81SHV2SU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiIgbmFtZT0ic3ViU2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc1FEVXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc1FEVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBuYW1lPSJDb25zdHJhaW50Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3I5SVdlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUFFMDJDRSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4QTFGMDJGMyIgbmFtZT0iYm9keSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HcjlJWGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QThBMUYwMkYzIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfOHBpVDRleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfOHBpVDRPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfOGdjcFVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NHNVV1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgIDxib2R5PkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDMjcwMTA2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREU2NTgwMTU3Ii8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGOUFCOTgwMkI5IiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzRzVWLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY5QUI5ODAyQjkiPgotICAgICAgICAgICAgICAgIDxib2R5PkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuCi08L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il80WHdMRWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il80WHdMRU95RkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il81c1pDd095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiIgbmFtZT0icHJlc2VudGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NaMFEtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NaMFF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NUU2MjAyMDMyQSIgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjY3QTAwRDkiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MURERTgzMzAxQTUiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTVFNjVDODAyMTgiIG5hbWU9InZhbHVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9keXI3Z2V5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9keXI3Z095R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9kbnpoTU95R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1RTcwMDUyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFOTAwMDggXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzRzVYZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODVFNzAwNTIiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBFbGVtZW50IGNhbiBvd24gbWFueSBDb25zdHJhaW50cyBkZWZpbmluZyBydWxlcyBmb3IgdGhpcyBlbGVtZW50LjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4NUU5MDAwQSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4NUU3MDA1MiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTREQUMwMUEwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQgXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzUURSZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgRGVzY3JpcHRpb24gY2FuIG9wdGlvbmFsbHkgYmUgc3RydWN0dXJlIGludG8gU2VjdGlvbnMuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZSB0byBkZWNvbXBvc2VkIFNlY3Rpb24gaW50byBhIGhpZXJhcmNoeSBvZiBTZWN0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciIG5hbWU9Il9jb250ZW50RGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxREU0QTk3MDEyMyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzUURUT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiBfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFR1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNCMDMxOSI+Ci0gICAgICAgICAgICAgIDxib2R5PlNlY3Rpb25zIGNhbiBiZSBmdXJ0aGVyIGRlY29tcG9zZWQgaW50byBuIGxldmVscyBvZiBzdWItc2VjdGlvbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0IiBuYW1lPSJfc2VjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NRRFZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NRRFZPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkQiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSBfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NRRFYtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRGVzY3JpYmFibGUgRWxlbWVudCBjYW4gY29udGFpbiBhIENvbnRlbnQgRGVzY3JpcHRpb24gZWxlbWVudCB0aGF0IHN0b3JlcyB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBmb3IgdGhpcyBDb250ZW50IEVsZW1lbnQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIGludGVuZGVkIHRvIGJlIHJlZmluZWQgd2l0aCBzdWItY2xhc3NlcyBhZGRpbmcgbW9yZSBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzLiAgQW55IG9mIHRoZXNlIHN1Yi10eXBlcyBjYW4gYmUgcmVsYXRlZCB0byBhIENvbnRlbnQgRWxlbWVudC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkUiIG5hbWU9Il9kZXNjcmliYWJsZUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzWjBRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzUURXdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0NTVFNjUwRDAwMDUgXzNBREM3Qjc0MDIyRDQ1NUU2NTBEMDAzNyI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDU1RTY1MEQwMDM3IiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1RTY1MEMwMEE2Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0IiBuYW1lPSJDb3JlQ29udGVudEVsZW1lbnRzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d0VE1NLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5xLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRWluci1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVpbnNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWluc2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFaW5zdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWlucy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW50T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRWludGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFaW50dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZY09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1ljZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZY3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZYy1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRWluck9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFaW5yZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3MjM5IiB5PSI4NTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWWVPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1llZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWWctZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWWRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZZHVmWEVkdXFIb09KYlVSWlJ3IiB4PSI2MDg2IiB5PSI3ODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1loT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZaU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZak9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lqZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZanVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZa09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lrZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZa3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZay1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZaGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lodWZYRWR1cUhvT0piVVJaUnciIHg9IjU1ODgiIHk9IjExMTUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWW1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4MjgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1ltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1luZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1luLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZbGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1lsdWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDQzIiB5PSIxMTE1MiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFc1lxT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lyT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1lzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1lzLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1lwZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWXB1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjMwNTAiIHk9Ijg1NTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRXNZdU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjAzMiIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l3T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWXdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l3LWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFc1l0ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVzWXR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTcyMjYiIHk9IjExMTUyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWXlPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI0NTUiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1l5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZek9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZenVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1l6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZME9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFc1kwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZMC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRXNZeGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1l4dWZYRWR1cUhvT0piVVJaUnciIHg9IjExNDQ4IiB5PSI4NTYxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWTJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1kyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZMi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNZNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWTQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWTFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZMXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1NTkxIiB5PSI4NTU5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVzWkEtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pCT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaQ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkNlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaQ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRXNaRE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVzWkR1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVzWkFPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaQWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTg4MiIgeT0iNTk3NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWEtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlidWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFMWliLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWljLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlkZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlkLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWllZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlldWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWliT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQxNSIgeT0iNTk2NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFMWlmLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNzk0IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlnLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWloZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWloLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEUxaWlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlpdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hFMWlmT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaWZlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzgzIiB5PSIzMzYzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEUxaW1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NTgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWluZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWluLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpb09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWlvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpby1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpbGVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlsdWZYRWR1cUhvT0piVVJaUnciIHg9IjU1OTMiIHk9IjMzODAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUI5MDAwRkMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRTFpdXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWl2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpd09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpd3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFMWl3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRTFpeGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRTFpdC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWl1T2ZYRWR1cUhvT0piVVJaUnciIHg9IjExNDM3IiB5PSIzMzY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3RUTU5lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBDb3JlIENvbnRlbnQgRWxlbWVudHMgcGFja2FnZSBkZWZpbmVzIHRoZSBjb3JlIGVsZW1lbnRzIG9mIGV2ZXJ5IG1ldGhvZCBzdWNoIGFzIHJvbGVzLCB0YXNrcywgYW5kIHdvcmsgcHJvZHVjdHMuICBUaGlzIGRpYWdyYW0gc2hvd3MgYSB0YXhvbm9teSBvZiB0aGUgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGlzIHBhY2thZ2UuICBBbGwgQ29yZSBDb250ZW50IEVsZW1lbnRzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgU3RlcCwgYXJlIGRlcml2ZWQgZnJvbSBDb250ZW50IEVsZW1lbnQuICBTdGVwIGlzIG5vdCBhIENvbnRlbnQgRWxlbWVudCwgYmVjYXVzZSBpdCBpcyBkZWZpbmVkIGFzIGEgc3BlY2lhbCBTZWN0aW9uIHdoaWNoIHdhcyBkZWZpbmVkIGluIHRoZSBsYXN0IFNlY3Rpb24gYXMgYSBwYXJ0IG9mIENvbnRlbnQgRGVzY3JpcHRpb24uICBJbiBvdGhlciB3b3JkcywgU3RlcCBhbHJlYWR5IGlzIGEgZGVzY3JpcHRpb24gZm9yIGNvbnRlbnQgYW5kIHRoZXJlIGRvZXMgbm90IHJlcXVpcmUgYmVpbmcgYSBDb250ZW50IEVsZW1lbnQgd2l0aCBpdHMgb3duIENvbnRlbnQgRGVzY3JpcHRpb24gcGFydC4gIFN0ZXAgYW5kIFRhc2sgYXJlIGRlcml2ZWQgZnJvbSBhIG5ldyBhYnN0cmFjdGlvbiBpbnRyb2R1Y2VkIGluIHRoaXMgcGFja2FnZSBjYWxsIFdvcmsgRGVmaW5pdGlvbiwgd2hpY2ggcmVwcmVzZW50cyBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgdW5pdHMgb2Ygd29yay4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWTVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAwRiIgc291cmNlPSJfSEVzWWhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1k2dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNZNk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWTVlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1k1dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtNTgyMiwgMjA5MF0kWzU4MjAsIC0yMDkxLCAtMSwgNTAyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZNi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTdPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZN2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9IRXNZbE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWTgtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1k4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZN3VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWTctZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIC0xLCAyMDkwXSRbLTEsIC0yMDkxLCAtMSwgNTAyXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNZOU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWTllZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNZOXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9IRXNZdE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZeE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNZLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWV9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1ktdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNZOS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWS1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgNTgyMCwgMjA5MF0kWy01ODIxLCAtMjA5MSwgLTEsIDUwMl0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWV9lZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1lfdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWkQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgc291cmNlPSJfSEVpbnEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pGZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWkVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pFZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MDMsIDU4MDcsIDIwOTBdJFstNTgyMSwgLTIwOTAsIC0xNCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRXNaRnVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWkYtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRXNaR09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA3IiBzb3VyY2U9Il9IRXNZcE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRXNaSGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFc1pIT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRXNaR2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVzWkd1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgMTE2MjgsIDIwOTBdJFstMTE2NDIsIC0yMDkwLCAtMTQsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVzWkgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFc1pJT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVzWkllZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgc291cmNlPSJfSEVzWTFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVzWkp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFc1pKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRXNaSmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVzWkl1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFc1pJLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtNTgzNSwgMjA5MF0kWzU4MjAsIC0yMDkwLCAtMTQsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaVlPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlZZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaVl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNEOSIgc291cmNlPSJfSEVzWXhPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVzWV8tZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaVotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlhT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpWnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaVktZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlaT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMTQsIDIwOTBdJFstMSwgLTIwOTAsIC0xNCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWF1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpaS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBzb3VyY2U9Il9IRTFpYS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpZS1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaWtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWlqLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpak9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaWplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEsIC01MDMsIDIxNDMsIDIwOTBdJFstMjE0NCwgLTIwOTAsIDAsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaWt1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlrLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXBPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgc291cmNlPSJfSEVzWTFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlxdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpcU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaXBlZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMSwgNDY4M10kWy0xLCAtNDY4MywgLTEsIDUwM10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWlyT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEUxaXJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfSEUxaWEtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEUxaWxPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWlzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRTFpc2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEUxaXJ1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWlyLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xLCAtNTAzLCAtMzE3NiwgMjA5MF0kWzMxNzQsIC0yMDkwLCAtMSwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpdE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaXRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpeHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNEEwMzA2IiBzb3VyY2U9Il9IRXNZXy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaXpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWl5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpeC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaXlPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0LCAtNTAzLCAyMjQsIDIwOTBdJFstMjUyLCAtMjA5MCwgLTE0LCA1MDNdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hFMWl6ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpenVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFMWl6LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0hFMWlsT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFc1lkT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFMWkxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpMWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEUxaTAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFMWkwT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRTFpMGVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMSwgLTUwMywgMCwgMjA5MF0kWy0xLCAtMjA5MCwgMCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpMXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTEtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpMk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9IRTFpZS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWkzT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpMmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEUxaTJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTUwMywgLTUzMTgsIDIwOTBdJFs1MzE4LCAtMjA5MCwgMCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpMy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRTFpNGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9IRTFpdHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRXNZZE9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRTFpNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEUxaTUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFMWk1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRTFpNHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFMWk0LWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNCwgLTUwMywgNTU4MywgMjA5MF0kWy01NTk3LCAtMjA5MCwgMCwgNTAzXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRTFpNk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEUxaTZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNzBBMzAxNTIiIHR5cGU9IkNsYXNzIiBuYW1lPSJTdHJ1Y3R1cmUiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjQ4RERDMDJDNyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVFllZlhFZHVxSG9PSmJVUlpSdyIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogQ29yZUNvbnRlbnRFbGVtZW50cyAvIFRheG9ub215IiBsaW5lQ29sb3I9IjAiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRV9UWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDE2IiB5PSIxMzYwNSIgd2lkdGg9IjQzMDgiIGhlaWdodD0iMTEzNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVFplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTm90ZSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMkVEMjEzMDMyQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkRpYWdyYW1OYW1lIj4KLSAgICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVFp1ZlhFZHVxSG9PSmJVUlpSdyIgdW5kZXJsaW5lPSJ0cnVlIiBkZXNjcmlwdGlvbj0iQ2xhc3MgRGlhZ3JhbTogQ29yZUNvbnRlbnRFbGVtZW50cyAvIFdvcmtQcm9kdWN0cyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVFotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA0OSIgeT0iMTIwOTAiIHdpZHRoPSI0MTUzIiBoZWlnaHQ9IjExMjYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVGEtZlhFZHVxSG9PSmJVUlpSdyIgZm9udE5hbWU9IkFyaWFsIiBkZXNjcmlwdGlvbj0ie1JvbGUubW9kaWZpZXMgPSBSb2xlLnBlcmZvcm1zLm91dHB1dH0mI3hBO2tlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBSVVAmI3hBOyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RiT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUwMjkiIHk9IjEwNTE1IiB3aWR0aD0iNjkwOCIgaGVpZ2h0PSIxMTI2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEVfVGMtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZXVmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1RmT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UZnVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRV9UY09mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RjZWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTgiIHk9Ijk2NSIgd2lkdGg9IjMzOTUiIGhlaWdodD0iMjY1MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hFX1RnLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RoZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RoLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGlPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RpZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGl1ZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9Uak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVGp1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEVfVGdPZlhFZHVxSG9PSmJVUlpSdyIgaXRhbGljPSJ0cnVlIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RnZWZYRWR1cUhvT0piVVJaUnciIHg9IjE3NzU0IiB5PSI4MDc3IiB3aWR0aD0iMzcwOCIgaGVpZ2h0PSIyMDQwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZKRVpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZKRVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNDA1MyIgeT0iMTM4MCIgd2lkdGg9IjIxODQiIGhlaWdodD0iMTYxNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGSkVkT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVlT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVldWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWUtZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFZmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWZ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWYtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZKRWNlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFY3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzg0NyIgeT0iMTA2NiIgd2lkdGg9IjMzMTgiIGhlaWdodD0iMjM0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dFZWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJ8TWV0aG9kIGNvbnRlbnQgaXMgZnVuZGFtZW50YWxseSBkZXNjcmliZWQgYnkgZGVmaW5pbmcgVGFza3MgZGVzY3JpYmVkIHdpdGggU3RlcHMgdGhhdCBoYXZlIFdvcmsgUHJvZHVjdHMgYXMgaW5wdXQgYW5kIG91dHB1dCBhbmQgd2hpY2ggYXJlIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIFRoZSBkaWFncmFtIGRlcGljdHMgdGhlc2UgY29yZSBlbGVtZW50cyB3aXRoIHRoZWlyIHJlbGF0aW9uc2hpcHMuICBUaGUgcmVsYXRpb25zaGlwcyBhcmUgbGFiZWxlZCB3aXRoIGEgJnF1b3Q7RGVmYXVsdF8mcXVvdDsgcHJlZml4LCBiZWNhdXNlIHRoZXkgZGVzY3JpYmUgdGhlICdzdGFuZGFyZCcgb3IgJ25vcm1hbCcgd2F5IG9mIHBlcmZvcm1pbmcgdGhlIG1ldGhvZCBkZXNjcmliZWQ7IGkuZS4gZG9pbmcgdGhlIHdvcmsgdW5kZXIgJ25vcm1hbCcgY2lyY3Vtc3RhbmNlcywgd2l0aCAnbm9ybWFsJyBiZWluZyB3aGF0IHRoZSBtZXRob2QgYXV0aG9yIHBlcmNlaXZlcyBhcyB0aGUgbW9zdCBnZW5lcmFsIGNhc2UuICBIb3dldmVyLCBkaWZmZXJlbnQgcHJvY2Vzc2VzIHdvdWxkIGFwcGx5IHRoZXNlIGVsZW1lbnRzIGluIGRpZmZlcmVudCBwYXJ0cyBvZiBhIGxpZmVjeWNsZSBkaWZmZXJlbnRseSBhbmQgdGhlbiBuZWVkIHRvIGRlZmluZSBjaGFuZ2VzIG9uIHRoZXNlIHJlbGF0aW9uc2hpcHMuICBGb3IgZXhhbXBsZSwgaWYgYSBUYXNrIGlzIHBlcmZvcm1lZCBpbiBtb3JlIHRoZW4gb25lIGl0ZXJhdGlvbiBvZiBhbiBpdGVyYXRpdmUgbGlmZWN5Y2xlIG1vZGVsIGRpZmZlcmVudCBSb2xlcyBjb3VsZCBiZSBhZGRlZCB0byAob3IgcmVtb3ZlZCBmcm9tKSBwZXJmb3JtaW5nIHRoZSBUYXNrIGFzIHdlbGwgYXMgZGlmZmVyZW50IGlucHV0cyBtaWdodCBiZSBjb25zaWRlcmVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZS4gIFN1Y2ggY2hhbmdlcyB3b3VsZCBiZSBkZWZpbmVkIG9uIHByb2Nlc3Mgc3BlY2lmaWMgRGVzY3JpcHRvcnMgdGhhdCByZWZlcmVuY2UgYW5kIGhhdmUgYmVlbiBkZWZpbmVkIGJhc2VkIG9uIHRoZXNlIGNvcmUgY29udGVudCBlbGVtZW50cyAoc2VlIFByb2Nlc3MgZm9yIG1vcmUgZGV0YWlscykuJiN4QTsiLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEVfVGotZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNSIgc291cmNlPSJfSEVfVGYtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEVfVGItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVGxPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hFX1RrLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTIiIHk9IjMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RsLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNzYxIiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RtdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODM5IiB5PSItMzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UbnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RuZWZYRWR1cUhvT0piVVJaUnciIHg9IjI1MjUiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RuLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1RvT2ZYRWR1cUhvT0piVVJaUnciIHg9IjI1NjgiIHk9Ii0xMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVG91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVG8tZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVHFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1RxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Uck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9UcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UcS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRV9Uc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9Uci1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVfVGtPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRV9Ua2VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTg1NCwgNjUxLCAxMzg0MywgNzQ1OV0kWy0xNjI2NCwgNjUxLCAtNTY3LCA3NDU5XSRbLTE2MjY0LCAtNTQ4NiwgLTU2NywgMTMyMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hFX1RzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGVBdHRhY2htZW50IiBzb3VyY2U9Il9IRV9UYXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9Uai1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEVfVHMtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIi8+Ci0gICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hFX1R0T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy00MjMsIC01NjcsIDU4NCwgNzYyXSRbLTEwMDcsIC0xMzI5LCAwLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRV9UdGVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEVfVHR1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRV9UdC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5IiBzb3VyY2U9Il9IRV9UZi1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Udk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEVfVHUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTMzOSIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI0MzciIHk9IjI4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9Udy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5MyIgeT0iLTMwNCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRV9UeGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTUwIiB5PSItMzIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVHllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVHlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOCIgeT0iMTc5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1R6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1R6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hFX1QwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hFX1R6LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRV9UMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEVfVDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVDFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVDAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hFX1QyT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEVfVDJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEVfVDEtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hFX1R1T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEVfVHVlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE4NTQsIC0yMTEsIDEzODQzLCA2NTk1XSRbLTE0NzkxLCAtMjExLCA5MDUsIDY1OTVdJFstMTQ3OTEsIC01NDg2LCA5MDUsIDEzMjBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRkpFZ09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBzb3VyY2U9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRV9UYi1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZKRWhPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNjYiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVoLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVpT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDM4IiB5PSIyNzkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVpLWZYRWR1cUhvT0piVVJaUnciIHg9Ii03ODIiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTIyMSIgeT0iMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWt1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWtlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM1IiB5PSItMzIyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRWxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRWx1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRWxPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRW11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRW1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFbnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFbk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRW9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFb3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFb09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZKRWdlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFZ3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTY1OSwgNjYwLCAxMzkzNiwgNjA5XSRbLTEzOTAyLCA2NjAsIDE2OTMsIDYwOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkVvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiIHNvdXJjZT0iX0hFX1RiLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFcC1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTQ4IiB5PSItMjcyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXEtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMTIiIHk9Ii0yNjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkVydWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NDEiIHk9IjMxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkVzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFc2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDU3IiB5PSItMTk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDJGRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXRPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzIyIiB5PSIzMTIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFdmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV3ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV2LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkV4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkV3LWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRkpFcE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGSkVwZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2OTMsIC03NzAsIC0xMzkwMiwgLTcxOV0kWzEzOTM2LCAtNzcwLCAtMTY1OSwgLTcxOV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkV4dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkV5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFeXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjc1IiB5PSIyMTExIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRXotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRXp1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYzNyIgeT0iLTI4MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUwT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM4MCIgeT0iMTUyMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUwLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI1NjkiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFMS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTA3OSIgeT0iMTY0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkUzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUydWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFM2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkUzLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkU0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkUzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTR1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZKRTZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGSkV4LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRkpFeU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2MjYsIC0xMDI0LCA3MjgsIDU4MzNdJFsyMjg2LCAtMzY5OSwgMjM4NywgMzE1OF0kWzc3OCwgLTU2ODksIDg4MCwgMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGSkU2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiIHNvdXJjZT0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRkpFN2VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTcxIiB5PSItMTQ2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NzMiIHk9IjI3OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkU4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRTlPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTc2IiB5PSItNzczIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkU5LWZYRWR1cUhvT0piVVJaUnciIHg9IjY3MiIgeT0iMzA5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRS1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRS0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZKRS11ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTc4NSIgeT0iLTEwNjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFX09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpFX3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpFXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpFX2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRkpGQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRkpGQWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZKRkJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGSkZCdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZCLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkZCZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRkpGQ3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGSkZDLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGSkZDZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRkpFNnVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZKRTYtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg3MiwgLTEwMjQsIC03NzAsIDU4MzNdJFstMzExNSwgLTM2OTksIC0zMDE0LCAzMTU4XSRbLTEyMzYsIC01Njg5LCAtMTEzNCwgMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGU09VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiIHNvdXJjZT0iX0hGSkVjT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hFX1RmLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09WZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRlNPVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDciIHk9Ii0xMjYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPV09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjk2IiB5PSItMjc4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPVy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODAiIHk9Ii0yNTMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09YLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1h1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDU2IiB5PSItMzQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1lPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT1l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT1llZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2MCIgeT0iLTE2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09ZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09aZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09adWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09aT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09hdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09hT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPYS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2J1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2JPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09iLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09jZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZTT2N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2NPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGU09VZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZTT1V1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTg0LCAxMTY4LCAtMTg2LCAtNTY4OV0kWy04NCwgNTgzMywgLTE4NiwgLTEwMjRdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRlNPYy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9IRkpFY09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRkpFWU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2VlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09kLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2UtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2ZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZTT2Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09nT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2d1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPZ2VmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjYiIHk9IjMyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09nLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09oZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09oT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0zNzEiIHk9Ii0zMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPaWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPamVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRlNPaS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT2p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09rT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09rZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09qLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPa3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGU09rLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRlNPZE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGU09kZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE2NTksIC01MCwgLTM5NzksIDBdJFs0NTQ2LCAtNTAsIC0xMDkyLCAwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEwQUVFQzYwMENBIiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RydWN0dXJlIChzaW1wbGlmaWVkKSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT21lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZTT211ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGU09tLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT25PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT251ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZTT29PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPb2VmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGU09vLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRlNPcE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRlNPcGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRlNPbC1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGU09tT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE1MTUiIHk9IjkxNCIgd2lkdGg9IjMxNzUiIGhlaWdodD0iMjY0MSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9VLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGYl9WT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9WdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9XT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1ctZlhFZHVxSG9PSmJVUlpSdyIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZiX1gtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZiX1VlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfVXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTQ3MiIgeT0iOTE0IiB3aWR0aD0iNTkwOSIgaGVpZ2h0PSIyNjQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZiX3F1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9xLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3J1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfci1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfc2VmWEVkdXFIb09KYlVSWlJ3IiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfc3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9zLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfdGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRmJfcC1mWEVkdXFIb09KYlVSWlJ3IiBpdGFsaWM9InRydWUiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX3FPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE0NzIiIHk9IjU0MTAiIHdpZHRoPSI1OTA5IiBoZWlnaHQ9IjI1OTAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRS1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHByb3ZpZGVzIGEgc2ltcGxpZmllZCBvdmVydmlldyB0byB0aGUgY29yZSBjb250ZW50IHN0cnVjdHVyZSBub3Qgc2hvd2luZyBhdHRyaWJ1dGVzIGFuZCBvbmx5IHRoZSBtb3N0IGltcG9ydGFudCBhc3NvY2lhdGlvbnMgYXMgd2VsbCBhcyBvbWl0dGluZyBhc3NvY2lhdGlvbiByb2xlIG5hbWVzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmJfWU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4IiBzb3VyY2U9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX1p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX1pPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM3IiB5PSIyNzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItNzgxIiB5PSIyMjEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9iT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9idWZYRWR1cUhvT0piVVJaUnciIHg9IjU0NyIgeT0iMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2NPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9jdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9jZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzBCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfZXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfZU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2UtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9mZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9mdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9mT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9ndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9nT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfWWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl9ZdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTU0LCAtNjc3LCA4MzczLCAtNjc3XSRbLTk3NDUsIC02NzcsIDE1ODMsIC02NzddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmJfZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIiBzb3VyY2U9Il9IRlNPbHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZiX2gtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzI2IiB5PSItMzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2l1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2ktZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTYwNCIgeT0iLTIyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9qZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9qdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfa09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9rdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX2tlZlhFZHVxSG9PSmJVUlpSdyIgeD0iODI1IiB5PSItMTcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX2stZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9sZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9sT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMzU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbC1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX211ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfbk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfbmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfbS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX251ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl9vT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9vZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9uLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfcE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl9wZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl9vLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfaE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl9oZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE1ODMsIDM4MSwgLTk3NDUsIDM4MV0kWzgzNzMsIDM4MSwgLTI5NTQsIDM4MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGYl90dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiIHNvdXJjZT0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGU09sdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl91LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfdk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmJfdXVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTE5NyIgeT0iLTM4MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl92LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl92dWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNTgxIiB5PSItMjQ1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZiX3dlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl93LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfeE9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzQ2IiB5PSItMzk4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3h1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl95T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl94LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfeS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfek9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfeXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiX3plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfME9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfenVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8wLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8xT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl8wdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8yT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl8xdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfdC1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl91T2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTU0LCAtOCwgODM3MywgNDQ2MV0kWy0xMjI4NSwgLTgsIC05NTYsIDQ0NjFdJFstMTIyODUsIC0zMTQ5LCAtOTU2LCAxMzIwXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZiXzJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCIgc291cmNlPSJfSEZiX3B1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZiX1VPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8zT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl8zLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGYl8zZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xODMiIHk9Ijg0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl80T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl80dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl80ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNjgiIHk9Ii0yMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl81ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfNk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl81LWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSItMTM2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl82LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl82dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0E4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfN3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfN2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfOHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmJfOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmJfOGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZiXzlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGYl85dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl85LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl85ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfLU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmJfLXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGYl8tLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGYl8tZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmJfMnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hGYl8yLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy02NywgLTEyOTUsIC02NywgMzE3NV0kWy02NywgLTMxNDksIC02NywgMTMyMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hGbEpRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiIHNvdXJjZT0iX0hGYl9wdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGYl9VT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKUk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3MiIgeT0iLTE1NjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKU09mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU0IiB5PSIxNDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKUy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpUdWZYRWR1cUhvT0piVVJaUnciIHg9IjUzIiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpWZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpWdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpWT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpXdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpXT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSlh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSlhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSll1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSllPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpRZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSlF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIxNzUsIC0xMjk1LCAtMjE3NSwgMzE3NV0kWy0yMTc1LCAtMzE1OCwgLTIxNzUsIDEzMTJdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKWS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIiBzb3VyY2U9Il9IRmJfVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmJfcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSlp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSlotZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTU2NCIgeT0iLTIyNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRmxKYS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQiIHk9IjEzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpidWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ1IiB5PSIxMTAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKYy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI1RSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEplT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEplZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEpkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGbEpmZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGbEplLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNzdGODRBMDI3MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpndWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpoT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZsSmctZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGbEpaT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSlplZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTk0NywgMTMxMiwgMTk0NywgLTMxNThdJFsxOTQ3LCAzMTc1LCAxOTQ3LCAtMTI5NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMkVEMjEzMDMyQiIgdHlwZT0iQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0cyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKaHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZsSml1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEppLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSmxlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZsSmgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRmxKaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4MTI4IiB5PSIzOTIwIiB3aWR0aD0iMzg2MCIgaGVpZ2h0PSIyMDE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEZsSm11ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEptLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKbi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSm91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRmxKby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZsSnBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEZsSmwtZlhFZHVxSG9PSmJVUlpSdyIgaXRhbGljPSJ0cnVlIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEptT2ZYRWR1cUhvT0piVVJaUnciIHg9IjgxMjgiIHk9IjgyMSIgd2lkdGg9IjM4NjAiIGhlaWdodD0iMjAxNSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnItZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE4NSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEpzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hGbEpzLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKdE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGbEp0ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZTT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hGbEpzT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZsSnNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI1OTgiIHk9IjM5MjAiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZkZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRnU2ZWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2ZmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZmdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Zi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZnT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Z2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGdTZndWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Zy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2aE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRnU2ZHVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZkLWZYRWR1cUhvT0piVVJaUnciIHg9IjM3MDgiIHk9IjM5MjAiIHdpZHRoPSIzODYwIiBoZWlnaHQ9IjIwMTUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdGNXRmVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iQSBzaW1wbGlmaWVkIG92ZXJ2aWV3IHRvIFdvcmsgUHJvZHVjdHMuIFdvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciBBcnRpZmFjdHMsIE91dGNvbWVzLCBhbmQgRGVsaXZlcmFibGVzLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRmxKcHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDRBIiBzb3VyY2U9Il9IRmxKaHVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRmxKcS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZsSnJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGbEpxdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRmxKcC1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZsSnFPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTEwMTYsIDAsIDIwODJdJFswLCAtMjA5MSwgMCwgMTAwN10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZsSnJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hGbEpydWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEZ1NlNlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCIgc291cmNlPSJfSEZsSmx1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEZsSnItZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZUZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MzMiIHk9IjEwNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2VWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTk5IiB5PSIyMzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZWT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIwNTMiIHk9Ii0yODciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZXT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzc3IiB5PSItNDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NldlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGdTZXdWZYRWR1cUhvT0piVVJaUnciIHg9IjEyMyIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NlhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nlh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1NlktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NlllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDMwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2WnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2Wi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2WmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2YS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2YWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1NlN1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2Uy1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxOTMwLCA0MiwgLTI1NDAsIC0zMDU2XSRbNDA4OSwgNDIsIC0zODEsIC0zMDU2XSRbNDA4OSwgMjA5MSwgLTM4MSwgLTEwMDddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2Yk9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJDIiBzb3VyY2U9Il9IRmxKci1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2Y2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZjT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2YmVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NmJ1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0NTYsIC0xMDE2LCAzMDE0LCAyMDgyXSRbLTMwMDUsIC0yMDkxLCAxNDY0LCAxMDA3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2Yy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NmRPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2aGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIiBzb3VyY2U9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2aXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEZ1NmllZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY4IiB5PSItMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM1OSIgeT0iMjgyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2a09mWEVkdXFIb09KYlVSWlJ3IiB4PSItNTkiIHk9Ii0zMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2a3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1NmstZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQwMSIgeT0iNzY4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nmx1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQxMyIgeT0iNzM4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nm0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZuT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1Nm51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEZ1Nm4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEZ1Nm5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGdTZvT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2by1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2b2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRnU2cC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRnU2cGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEZ1Nmh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRnU2aC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils2NjAsIDEwMDcsIDY2MCwgMTAwN10kWzY2MCwgMjU1NiwgNjYwLCAyNTU2XSRbLTM4NjksIDI1NTYsIC0zODY5LCAyNTU2XSRbLTM4NjksIDIyMCwgLTM4NjksIDIyMF0kWy0xOTMwLCAyMjAsIC0xOTMwLCAyMjBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRnU2cU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBzb3VyY2U9Il9IRnU2ZGVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRmxKbHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRnU2cmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEZ1NnJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGdTZyT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRnU2cWVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEZ1NnF1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTQyMiwgLTEwMTYsIC0yOTk3LCAyMDgyXSRbMjk2MywgLTIwOTEsIC0xNDU2LCAxMDA3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRnU2ci1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEZ1NnNPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODYyNzAxQTYiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXNrc0FuZFN0ZXBzIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyUk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyUnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJTZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJTLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJRdWZYRWR1cUhvT0piVVJaUnciIHg9IjI1OTAiIHk9IjUxOTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJVT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NEE2NjAzNjgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRyVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyV09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyV3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyWC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyVWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJVdWZYRWR1cUhvT0piVVJaUnciIHg9IjEzOTcwIiB5PSI1MTU2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0cmgtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4NzgiIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJpT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyaXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyak9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyanVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRya09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmt1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEY0cmhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyaGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTUxIiB5PSIyOTgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEY0cmwtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI2NTgiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cm1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJtdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJudWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRybi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyb2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyb3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRybE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJsZWZYRWR1cUhvT0piVVJaUnciIHg9IjcxNTQiIHk9IjY3NjQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNENGMzAxQUUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IRjRycC1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjc5NCIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRycmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJydWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyci1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJzT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyc2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyc3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRycE9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJwZWZYRWR1cUhvT0piVVJaUnciIHg9IjEzNDg3IiB5PSI3NDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR0IxTWVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzQwMyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxUE9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IRjRyMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHIyT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc0NDIiIHk9Ijc0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQjkwMDBGQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHQjFaT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9Ijk5MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFaZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxYmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdCMWItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdCMVllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxWXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3NDUiIHk9Ijg4MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0Y1dGLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEY0cllPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiIgc291cmNlPSJfSEY0clFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJZLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJadWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRjRyWk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0clotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJhT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJhLWZYRWR1cUhvT0piVVJaUnciIHg9IjQxIiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJidWZYRWR1cUhvT0piVVJaUnciIHg9IjQ2MCIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmNlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTgxIiB5PSItMjg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmRPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJkLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cmV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cmVPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJlLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cmdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRjRyZ3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRyZ09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEY0clllZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRjRyWXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NjIsIC02NywgLTEwNjE3LCAtMTZdJFsxMDYxNywgLTY3LCAtNzYyLCAtMTZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRjRycy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0IwMzE5IiBzb3VyY2U9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cnVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hGNHJ0LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRydS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDYyIiB5PSIyNTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRydmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IRjRydnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzYwIiB5PSItMzM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cndPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzYyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ3ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTIiIHk9IjQ1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjQ3NiIgeT0iLTMzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJ5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ4LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyeXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHJ6T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hGNHJ6ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hGNHJ5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRjRyenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEY0cjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cjBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cnotZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIwdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hGNHIxT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEY0cjFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEY0cjAtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hGNHJ0T2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEY0cnRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTM5NywgMTY5LCAxMzk3LCAxNjldJFsyNTczLCAxNjksIDI1NzMsIDE2OV0kWzI1NzMsIDE0ODEsIDI1NzMsIDE0ODFdJFs1NDEsIDE0ODEsIDU0MSwgMTQ4MV0kWzU0MSwgNTI0LCA1NDEsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFQZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBQzAxQTAiIHNvdXJjZT0iX0hGNHIxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJvLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxUS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMVFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFST2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFSdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFSZWZYRWR1cUhvT0piVVJaUnciIHg9IjQwMCIgeT0iLTE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFSLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFTT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMjUiIHk9Ii0zNDgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMVMtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIiIHk9Ii0xNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxVHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjI1IiB5PSIyMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxVWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxVmVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFXLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFXZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxWHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFYZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxUHVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFQLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzE5MDUsIDEwNiwgLTMxNDksIDEwNl0kWzQxMjgsIDEwNiwgLTkyNiwgMTA2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMWNPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEY0cjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdCMVlPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFkdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjA1IiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFlLWZYRWR1cUhvT0piVVJaUnciIHg9Ijc3MiIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFmZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxZnVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTYxIiB5PSIxOTQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdCMWdlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ0IiB5PSIzNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxZy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxaHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxaE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0IxaXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR0IxaU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFqdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFqT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHQjFrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHQjFrT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxY2VmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFjdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNzAxLCA1MCwgNDkwMiwgLTUwXSRbLTQ4MDksIDUwLCAxNzk0LCAtNTBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0Ixay1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzJGIiBzb3VyY2U9Il9IRjRyUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyZy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMWx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxbU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMW1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFsLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0IxbE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFsZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNSwgLTQ5MSwgLTI1LCAxNjkzXSRbLTI1LCAtMTY1OSwgLTI1LCA1MjRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFtdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxbS1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFuT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMxODAwQjgiIHNvdXJjZT0iX0hGNHJRT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hGNHJrLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFvZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixb3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMW9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFuZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0IxbnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3NjIsIDE4NiwgLTUxMzAsIC0xMzM3XSRbNDU1NSwgMTE2OCwgLTEzMzcsIC0zNTVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjFvLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0IxcE9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHQjFwZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM0QTAzMDYiIHNvdXJjZT0iX0hGNHJnLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHQjFZT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjFxdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0IxcS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdCMXFlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHQjFwdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdCMXAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjUsIC01MjQsIDc2LCAxNjA4XSRbMjUsIC0xNjQyLCA3NiwgNDkxXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR0Ixck9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR0IxcnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBzb3VyY2U9Il9IRjRyVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRjRyby1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0Ixcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHQjFzdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR0Ixci1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjFzT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIxMSwgLTQ4MiwgLTcwMiwgMzg4Nl0kWzIxMSwgLTM4NDMsIC03MDIsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXRlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF0dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdCMXQtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MzIzMDBGRSIgc291cmNlPSJfSEY0clVPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEY0cmstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF1dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdCMXZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHQjF2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0IxdS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdCMXVPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHQjF1ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy03NzAsIDIwMywgNDcxNSwgLTEzNzFdJFstNDE1NywgMTE3NiwgMTMyOSwgLTM5N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdCMXZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHQjF2LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg1NEQwMkJGIiB0eXBlPSJDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU1PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1NLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHTG1OT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1OdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1PT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbU91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtUGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVB1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdMbVAtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEdMbU1lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR0xtTXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDk3MiIgeT0iOTQ4IiB3aWR0aD0iMjg1MyIgaGVpZ2h0PSIyMjY5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdMbVJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHTG1SZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtUi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdMbVNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1TZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtU3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1TLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtVE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHTG1UZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR0xtVHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR0xtVC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR0xtUWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHTG1RdWZYRWR1cUhvT0piVVJaUnciIHg9IjI4NDEiIHk9Ijg5NyIgd2lkdGg9IjMzNjQiIGhlaWdodD0iMjI2OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHZWhaLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhhLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhiZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhiLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaGNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhjZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHZWhjdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHZWhaT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaFplZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTkwMiIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHZWhnT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZ2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0ktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0plZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NKdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdvU0otZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NLZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHZWhmZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdlaGZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTcwNiIgeT0iNDc1NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0bUhFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdMbVVPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIgc291cmNlPSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbU1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhJT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhJLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoSWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhKZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhLT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoS3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyQ0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaEstZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU3IiB5PSIyNzAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoTHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODI2IiB5PSItMjU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJEOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaE0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaE51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaE4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaE5lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkQ5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoTy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoT2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDJDRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoUC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoUGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdMbVVlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR0xtVXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNDMwLCAtNTc1LCAtNjE4OSwgLTYyNl0kWzYxOTcsIC01NzUsIC0xNDIyLCAtNjI2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEdlaFFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCIgc291cmNlPSJfSEdMbVFPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdMbU1PZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhRLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhSdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR2VoUk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhTT2ZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhTdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHZWhTLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyREUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTgyIiB5PSIzMDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkRFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoVWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItODc2IiB5PSItMjIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJFOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEdlaFd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdlaFdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHZWhXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoWHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoWE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaFllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR2VoWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR2VoWU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEdlaFFlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR2VoUXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjY3LCA2MDksIC02MTkxLCA1NTZdJFs2NDI5LCA2MDksIC0xNDI5LCA1NTZdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR2VoYy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgzMTgwMEI4IiBzb3VyY2U9Il9IR2VoWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR0xtUU9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR2VoZU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdlaGVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHZWhkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR2VoZE9mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEdlaGRlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjYyLCAtNDU3LCAtMTkyMSwgMzI1MV0kWzE1MDcsIC0yNTczLCAtNjc3LCAxMTM0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR2VoZXVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEdlaGUtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IR29TS3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBzb3VyY2U9Il9IR2VoWS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IR2VoZk9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU0xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU01PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU00tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU05PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TTnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU05lZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDYzIiB5PSItMjk0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU04tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TT2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NPT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTAiIHk9IjI1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NPdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NPLWZYRWR1cUhvT0piVVJaUnciIHg9Ii01NzciIHk9Ii0yODUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjBFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TUHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1FlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TUk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TUXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1JlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NTT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NSdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TU2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NTdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR29TSy1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHb1NMT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY2MSwgNTMsIC0zMTc1LCA1M10kWzMxMjIsIDUzLCAtNzE0LCA1M10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NUZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODMyMzAwRkUiIHNvdXJjZT0iX0hHZWhmT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHTG1RT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NVdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdvU1VlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHb1NUdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR29TVC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMjYyLCAtNDU3LCAxODIwLCAzMjUxXSRbLTE0NDcsIC0yNTczLCA2MzUsIDExMzRdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHb1NWT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IR29TVmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc1owVGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk0Ij4KLSAgICAgICAgICAgIDxib2R5PjAyPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfQ3I2ZklPeGRFZHVIamUzcFBhaE40QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBuYW1lPSJSb2xlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NaMFZPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDciIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNkMiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjgiIG5hbWU9Im1vZGlmaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xS09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xSi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQyIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMDkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTWVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xTU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBuYW1lPSJUYXNrIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLU0tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgVGFzayBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMyRiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4MzE4MDBCOCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwOSIgbmFtZT0icGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5NiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnTi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNBOCIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzOUQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnUS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnUXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCRSIgbmFtZT0ib3V0cHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3MyZ1RPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3MyZ1MtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAzNTciIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDExN0NGNUMwMUNDIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcU91ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcU9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNUUiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiTnVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwMyIgbmFtZT0ic3RlcHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCIgaXNEZXJpdmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0VE1JLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0VE1JdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiIG5hbWU9IldvcmtQcm9kdWN0IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLU9PZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0Q5IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyREEiIG5hbWU9Ikd1aWRhbmNlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NpLVBPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJEQSI+Ci0gICAgICAgICAgICAgIDxib2R5Pkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDExRCIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIiBuYW1lPSJBcnRpZmFjdCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzaS1RT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxN0YiPgotICAgICAgICAgICAgICA8Ym9keT5BcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDBGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTdGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAxMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJKT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJJLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEzIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDE3RiIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiSi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1IiBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzc3ZNLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxODUiPgotICAgICAgICAgICAgICA8Ym9keT5BIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyQkMiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMzAiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0SmJNT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0SmJMLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOEYiIG5hbWU9Ik91dGNvbWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc3N2Ti1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMThGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QW4gb3V0Y29tZSBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDA0QSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTRBNjYwMzY4IiBuYW1lPSJTdGVwIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Nzdk8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0QTY2MDM2OCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLgotQSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTgzMEUwMTUwIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDIxRTRDRjMwMUFFIi8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgzMjMwMEZFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3NzdlFPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiI+Ci0gICAgICAgICAgICAgIDxib2R5PldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTgyRjMwMjZFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIiBuYW1lPSJwcmVjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4NTdCMDMzMyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAwNjEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdFRNS3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdFRNS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTg1N0IwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0VE1NZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0VE1NT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiIG5hbWU9IkRlZmF1bHRfUHJpbWFyeVBlcmZvcm1lciIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA5IF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMEIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnTS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzA4Ij4KLSAgICAgICAgICAgICAgPGJvZHk+Um9sZXMgY2FuIGJlIGRlZmluZWQgdG8gcGVyZm9ybSBtYW55IFRhc2tzLCBidXQgZXZlcnkgVGFzayBtYXkgaGF2ZSBvbmx5IG9uZSBSb2xlIHRoYXQgaXMgYnkgZGVmYXVsdCB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgb2YgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDMwQiIgbmFtZT0icGVyZm9ybXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzMDgiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HczJnT3VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HczJnT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIiBuYW1lPSJEZWZhdWx0X01hbmRhdG9yeUlucHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlFIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQTgiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnUE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMzlEIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG1hbmRhdG9yeSBpbnB1dHMgZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDM5RCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdRT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkIiIG5hbWU9IkRlZmF1bHRfT3V0cHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JDIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAzQkUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HczJnUmVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwM0JCIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG91dHB1dHMgb2YgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQyIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjlFIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDNCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dzMmdTZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0dzMmdTT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MzAwRjUiIG5hbWU9IkRlZmF1bHRfTW9kaWZpZXMiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiBfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4IiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc19xSWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBkZXJpdmVkIGZyb20gdGhlIGZhY3QgdGhhdCBSb2xlcyBwZXJmb3JtIFRhc2tzIHRoYXQgaGF2ZSBXb3JrIFByb2R1Y3RzIG9mIHRoYXQgcGFydGljdWxhciB0eXBlIGFzIG91dHB1dHMuICAvbW9kaWZpZXMgcHJvdmlkZXMgYWxsIHRoZSB0eXBlcyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgdGhlIFJvbGUgcHJvZHVjZXMgb3IgbW9kaWZpZXMgdmlhIG9uZSBvZiB0aGUgVGFza3MgZGVmaW5lZCB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIFJvbGUsIGVpdGhlciBhcyBwcmltYXJ5IG9yIGFkZGl0aW9uYWwgcGVyZm9ybWVyLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDBGNiIgbmFtZT0ibW9kaWZpZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjk2IiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUplZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcUpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwOSIgbmFtZT0iRGVmYXVsdF9SZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTBBIF8zQURDN0I3NDAyMkQ0MEYzNkM5MzAxMEMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hc19xS3VmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5Ij4KLSAgICAgICAgICAgICAgPGJvZHk+UmVzcG9uc2liaWxpdHkgZm9yIGEgd29yayBwcm9kdWN0IGluZGljYXRlcyB0aGUgcm9sZSdzIG93bmVyc2hpcCBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgd29yayBwcm9kdWN0IHR5cGUuICBGb3IgZXhhbXBsZSwgdGhlIHJvbGUgcmVzcG9uc2libGUgZm9yIGEgd29yayBwcm9kdWN0IGFuc3dlcnMgdG8gbWFuYWdlbWVudCBhYm91dCBpdHMgcXVhbGl0eSBzdGF0ZS4gIEJlaW5nIHJlc3BvbnNpYmxlIGZvciB0aGUgd29yayBwcm9kdWN0IGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgcm9sZSBpcyB0aGUgb25seSBvbmUgbW9kaWZ5aW5nIGl0LCBidXQgbWFrZXMgdWx0aW1hdGUgZGVjaXNpb25zIGFib3V0IGFjY2VwdGluZyBvciByZWplY3RpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucyB3aGVuIHJldmlld2luZyB0aGVzZSBtb2RpZmljYXRpb25zLiAgRXZlcnkgd29yayBwcm9kdWN0IGhhcyBub25lIG9yIG9uZSByb2xlIHJlc3BvbnNpYmxlIHJvbGUuIDwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkzMDEwQSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTYiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMTA5Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3NfcUx1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3NfcUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxMTdDRjVDMDFDQyIgbmFtZT0iRGVmYXVsdF9BZGRpdGlvbmFsUGVyZm9ybWVyIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1RDAyRkQgXzNBREM3Qjc0MDIyRDQxMTdDRjVEMDM1NyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0dzX3FNLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgYWRkaXRpb25hbCByb2xlcyB0aGF0IGJ5IGRlZmF1bHQgY2FuIGJlIGFzc2lnbmVkIHRvIGhlbHAgY29tcGxldGluZyBhIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExN0NGNUQwMkZEIiBuYW1lPSJoZWxwc1BlcmZvcm1pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTE3Q0Y1QzAxQ0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hc19xTi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hc19xTnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIiBuYW1lPSJDb21wb3NpdGlvbiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDExIF8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMTMiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiSU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDEwIj4KLSAgICAgICAgICAgICAgPGJvZHk+QXJ0aWZhY3QgdHlwZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgcGh5c2ljYWxseSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBpcyBjb21wb3NlZCBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRCIgbmFtZT0iRGVmYXVsdERlbGl2ZXJlZFdQIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkUgXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAzMCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0SmJLZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM5MjAwMkQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGRlZmluZXMgdGhlIGRlZmF1bHQgcGFydHMgb2YgYSBkZWxpdmVyYWJsZSwgaS5lLiB0aGUgdHlwZXMgb2Ygd29yayBwcm9kdWN0cyBhIERlbGl2ZXJhYmxlIGNvbXByaXNlcyBvZi4gIFRoaXMgYWdncmVnYXRpb24gY2FuIGJlIG92ZXJyaWRkZW4gaW4gYSBQcm9jZXNzLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzkyMDAyRSIgbmFtZT0iX2RlbGl2ZXJhYmxlIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTg1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDOTIwMDJEIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3RKYkxlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3RKYkxPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNzdGODQ5MDEzMSIgbmFtZT0iRGVmYXVsdF9PcHRpb25hbElucHV0cyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjVFIF8zQURDN0I3NDAyMkQ0MTc3Rjg0QTAyNzIiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdEpiTXVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE3N0Y4NDkwMTMxIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBsaW5rcyB0byB6ZXJvIG9yIG1hbnkgZGVmaW5pdGlvbnMgb2YgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBkZWZpbmVkIGFzIG9wdGlvbmFsIGlucHV0cyBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE3N0Y4NEEwMjcyIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI5RSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MTc3Rjg0OTAxMzEiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdEpiT2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdEpiT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTYyRDMwMDNGIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMDMgXzNBREM3Qjc0MDIyRDQyNzk2MkQ0MDIwRSIgaXNEZXJpdmVkPSJ0cnVlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RKYk8tZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk2MkQzMDAzRiI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBpcyBhIHNob3J0Y3V0IGZvciBuYXZpZ2F0aW9uIGFsb25nIHRoZSBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzIENvbnRlbnRFbGVtZW50LnByZXNlbnRhdGlvbi5zZWN0aW9ucy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NjJENDAyMEUiIG5hbWU9Il90YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOUUiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc5NjJEMzAwM0YiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyN0E4N0U5MDA2MSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMkNGIF8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdFRNSnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiBhZGRzIGFuIG9wdGlvbmFsIHByZS1jb25kaXRpb24gdG8gYSBXb3JrIERlZmluaXRpb24uICBBIHByZS1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIHN0YXJ0LiBGb3IgZXhhbXBsZSwgYSBwcmUtY29uZGl0aW9uIGZvciBhIFRhc2sgY291bGQgZGVmaW5lIHRoYXQgYW4gaW5wdXQgV29yayBQcm9kdWN0IG5lZWRzIHRvIGJlIGluIGEgc3BlY2lmaWMgc3RhdGUgb3IgdGhhdCBvdGhlciByZWxhdGVkIHdvcmsgbXVzdCBiZSBpbiBhIGNlcnRhaW4gc3RhdGUgKGUuZy4gJ0lucHV0IGRvY3VtZW50IFggaGFzIGJlZW4gcmV2aWV3ZWQgYW5kIHNpZ25lZCBieSBjdXN0b21lciBBTkQgVGFzayAmcXVvdDtNYW5hZ2VtZW50IFJldmlldyZxdW90OyBpcyBjb21wbGV0ZScpIGJlZm9yZSB0aGUgVGFzayBjYW4gYmVnaW4uCi08L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODdFOTAyRDkiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg3RTkwMDYxIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAxMTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDJERSBfM0FEQzdCNzQwMjJENDI3QTg4MzQwMkU4Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RUTUxlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyN0E4ODM0MDExMCI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwb3N0LWNvbmRpdGlvbiB0byBhIFdvcmsgRGVmaW5pdGlvbi4gIEEgcG9zdC1jb25kaXRpb24gZGVmaW5lcyBhbnkga2luZCBvZiBjb25zdHJhaW50IHRoYXQgbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgd29yayBkZXNjcmliZWQgZm9yIHRoZSBXb3JrIERlZmluaXRpb24gY2FuIGJlIGRlY2xhcmVkIGNvbXBsZXRlZCBvciBmaW5pc2hlZCBhbmQgd2hpY2ggb3RoZXIgV29yayBEZWZpbml0aW9ucyBtaWdodCBkZXBlbmQgdXBvbiAoZS5nLiBmb3IgdGhlaXIgcHJlLWNvbmRpdGlvbnMpLiAgRm9yIGV4YW1wbGUsIGEgcG9zdC1jb25kaXRpb24gZm9yIGEgVGFzayBjb3VsZCBkZWZpbmUgdGhhdCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIHRvIGJlIHRoZSBvdXRwdXQgbXVzdCBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIGJlZm9yZSB0aGUgVGFzayBjYW4gZW5kIChlLmcuICdVc2UgQ2FzZSBtdXN0IGJlIGluIHN0YXRlIGZ1bGx5IGRlc2NyaWJlZCBhbmQgcmV2aWV3ZWQgYnkgU3lzdGVtIEFuYWx5c3QnKS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjdBODgzNDAyRTgiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3QTg4MzQwMTEwIi8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTQ3OEUwMDBEIiBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d0NUNCLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRTA5OUI4MDAwOSI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTA5OUI4MDAwOSIgdHlwZT0iQ2xhc3MiIG5hbWU9IlN0cnVjdHVyZSI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TVnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEdvU1d1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU1h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NZZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NZLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TWk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TWmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IR29TVi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHb1NXT2ZYRWR1cUhvT0piVVJaUnciIHg9IjY0MyIgeT0iMTcxOCIgd2lkdGg9IjQ3MTUiIGhlaWdodD0iMjk2MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y05lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNPT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHeGNPZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjT3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1BPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNQZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1B1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNRZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNST2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNOdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y04tZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTE1IiB5PSI3NDQyIiB3aWR0aD0iMzU5NiIgaGVpZ2h0PSIyNDMxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1VlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEd4Y1V1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzNTIiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNVLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjVmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1dPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjV2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1d1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1hPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y1hlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y1QtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjVU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTc1IiB5PSI3ODUwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3Q1Q0NlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249Ik1ldGhvZCBQYWNrYWdlIGlzIGRlZmluZWQgYXMgYW4gYWJzdHJhY3QgY2xhc3MuICBJdHMgc3BlY2lhbGl6YXRpb24sIENvbnRlbnQgUGFja2FnZSwgZGVmaW5lcyB0aGUgcmVkZWZpbml0aW9uIG9mIHRoZSBVTUwgcGFja2FnZSB0byBjb250YWluIG9ubHkgQ29udGVudCBFbGVtZW50cy4gIE1ldGhvZCBQYWNrYWdlcyBjYW4gYmUgZGVmaW5lZCBhcyBnbG9iYWwgKGkuZS4gYW55IGVsZW1lbnQgaW4gYW55IG90aGVyIHBhY2thZ2UgY2FuIGFjY2VzcyBpdHMgY29udGVudHMpLiAgVGhleSBjYW4gYmUgbmVzdGVkIGFzIHdlbGwgYXMgZGVmaW5lIGRlcGVuZGVuY2llcyB0byBvdGhlciBwYWNrYWdlcyAodmlhIHRoZSByZXVzZWRQYWNrYWdlcyBhc3NvY2lhdGlvbikuIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHb1NadWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIHNvdXJjZT0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NhLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEdvU2F1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NiZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NidWZYRWR1cUhvT0piVVJaUnciIHg9IjExNTUiIHk9Ii0zMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2N1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NDgiIHk9Ii0zMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TYy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEdvU2RPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE0NzIiIHk9IjIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NkdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NkLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMTQiIHk9Ii0zOTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TZi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR29TZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR29TZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEdvU2dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHb1NnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHb1NoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NndWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR29TaGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjRU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNFZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHb1NodWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IR29TWi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHb1NhT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzIzNTMsIC01NjcsIDIzNTMsIC01NjddJFs2MjE0LCAtNTY3LCA2MjE0LCAtNTY3XSRbNjIxNCwgLTIzMjgsIDYyMTQsIC0yMzI4XSRbMTMxMiwgLTIzMjgsIDEzMTIsIC0yMzI4XSRbMTMxMiwgLTE0ODEsIDEzMTIsIC0xNDgxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEd4Y0V1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSIgc291cmNlPSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEdvU1Z1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHeGNGdWZYRWR1cUhvT0piVVJaUnciIHg9IjI5NyIgeT0iMTUwMyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNHdWZYRWR1cUhvT0piVVJaUnciIHg9IjY5NyIgeT0iNjI3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0hPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNzI1IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjSC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTkxNyIgeT0iMjgwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNJLWZYRWR1cUhvT0piVVJaUnciIHg9IjE0MCIgeT0iMTM4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNKLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNLT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNKdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHeGNMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjTGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y0wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y01PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y0x1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNNZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y05PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y011ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHeGNFLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y0ZPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjM1MywgNjA5LCAyMzUzLCA2MDldJFs2MTgwLCA2MDksIDYxODAsIDYwOV0kWzYxODAsIDI4MDIsIDYxODAsIDI4MDJdJFsxNDczLCAyODAyLCAxNDczLCAyODAyXSRbMTQ3MywgMTQ4MSwgMTQ3MywgMTQ4MV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHeGNSZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAzQUYiIHNvdXJjZT0iX0hHeGNOZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHb1NWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNTdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjUy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y1NlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHeGNSdWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEd4Y1ItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0MywgLTEzOTcsIC0yNDUsIDQyNDFdJFstMTQzLCAtNDE1NywgLTI0NSwgMTQ4MV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEd4Y1RPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHeGNUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEd4Y1h1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQiIgc291cmNlPSJfSEd4Y05lZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEd4Y1R1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNZZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNaT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1plZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y1otZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y1p1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI4IiB5PSIzMjMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNhdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjYWVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMTY2IiB5PSItMzQ4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2EtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hHeGNiT2ZYRWR1cUhvT0piVVJaUnciIHg9Ii04IiB5PSIyOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjYnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjY09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjYi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTUxIiB5PSItMjU1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2MtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2N1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNkZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEd4Y2VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEd4Y2R1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjZXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IR3hjZ09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9IR3hjZnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEd4Y1gtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IR3hjWU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxNjA4LCAtMTM1LCAtNTE0NywgLTMzXSRbNTA4MCwgLTEzNSwgLTE2NzYsIC0zM10iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMzYwRTcyMDAzNyIgdHlwZT0iQ2xhc3MiIG5hbWU9IlRheG9ub215Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5vdGUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJEaWFncmFtTmFtZSI+Ci0gICAgICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEd4Y2hlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRGVzY3JpcHRpb24iPgotICAgICAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246U2hhcGVTdHlsZSIgeG1pOmlkPSJfSEd4Y2d1ZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlVNTDIgSW5mcmFzdHJ1Y3R1cmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIvPgotICAgICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IR3hjZy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMDE1IiB5PSI2MDEiIHdpZHRoPSI3MDQ0IiBoZWlnaHQ9IjgxNDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHeGNodWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERTA2MjAyRDUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IR3hjaWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IR3hjaXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05FdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdORS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05GZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05GLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05HZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05HdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHeGNoLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEd4Y2lPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzM2MSIgeT0iMTM2MyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGQTM2MDJDMSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05IdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05ILWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tkl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05JLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TkpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05KZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tkp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05KLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TktPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05LZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05LdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05IT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TkhlZlhFZHVxSG9PSmJVUlpSdyIgeD0iNTU5NCIgeT0iNjExOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERFODMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05MdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05MLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MzY4IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05NZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05NLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05OZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk51ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05OLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3Tk9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05PZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05PdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05MT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TkxlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY5MiIgeT0iNDM2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05QdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05QLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzAyIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05RLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05SZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05SLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TlNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05TZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hHN05TdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hHN05QT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TlBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE1OSIgeT0iOTIyOCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tlp1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05hZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05hdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTIyIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05hLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOYmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOYi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOY2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TlotZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOYU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzOTc5IiB5PSIxMTU0MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05pLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hHN05qT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNDU0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05qZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOa2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdOay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IRzdObGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmx1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEc3TmwtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEc3TmllZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOaXVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDEzIiB5PSIxMzQ3MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d0NUNDLWZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTWV0aG9kIFBhY2thZ2UgcGFja2FnZSBkZWZpbmVzIGhvdyB0aGUgbWV0aG9kIGVsZW1lbnRzIGNhbiBiZSBwaHlzaWNhbGx5IG9yZ2FuaXplZCBpbiBwYWNrYWdlIGhpZXJhcmNoaWVzLiAgSXQgcmV1c2VkIHRoZSBwYWNrYWdlIGNvbmNlcHQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZSBMaWJyYXJ5LCBidXQgcmVkZWZpbmVzIGl0IHRvIHJlc3RyaWN0IENvbnRlbnQgUGFja2FnZXMgdG8gb25seSBjb250YWluIENvbnRlbnQgRWxlbWVudHMgYW5kIG5vdCBhbnkgUGFja2FnZWFibGUgRWxlbWVudHMgKFRCRDogdXBkYXRlIGRpYWdyYW0gd2l0aCB7cmVkZWZpbmVzfSBjb25zdHJhaW50ISkuIFRoZSBkaWFncmFtIHNob3dzIHRoZSBvdmVyYWxsIHRheG9ub215IGlzIHdoaWNoIE1ldGhvZCBQYWNrYWdlIGlzIGRlZmluZWQgYXMgYW4gYWJzdHJhY3QgY2xhc3MuICIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOUy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREZCQ0YwMkE5IiBzb3VyY2U9Il9IRzdORy1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOSy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TlVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05ULWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOVE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05UZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy05NzksIC03OSwgOTc5LCAxOTU4XSRbLTE5ODUsIC03OSwgLTI3LCAxOTU4XSRbLTE5ODUsIC0xNzE5LCAtMjcsIDMxOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlV1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05VLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TlZPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRERGOEQ0MDIxMSIgc291cmNlPSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEd4Y2h1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TldlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOV09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3TlZlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOVnVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstODQsIC01MTYsIDE2LCAyMjI2XSRbLTg0LCAtMTk3MiwgMTYsIDc3MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TlctZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05YT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEc3TlhlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUMzMzRGMDE5OCIgc291cmNlPSJfSEc3Tk8tZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEc3TkstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05ZT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tll1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05ZLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IRzdOWWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEc3Tlh1ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IRzdOWC1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1MCwgLTUyNCwgLTEwMTYsIDQzNTFdJFs1MCwgLTQzNjAsIC0xMDE2LCA1MTZdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hHN05aT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOWmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hHN05kdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQ0MwQTAxRDciIHNvdXJjZT0iX0hHN05adWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hHN05HLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hHN05lLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOZk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEc3TmV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hHN05kLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEc3TmVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzc4LCAtNDQ4LCAtMzg5LCA0NjMxXSRbNzc4LCAtNDU2MywgLTM4OSwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOZmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TmZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdOZi1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBzb3VyY2U9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOTy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tmd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdOaE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3TmhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05nLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdOZ09mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05nZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xMDA3LCAtNDQ4LCA5MjIsIDE3ODZdJFstMTAwNywgLTE3MTgsIDkyMiwgNTE2XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdOaHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3TmgtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IRzdObU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBzb3VyY2U9Il9IRzdOaU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IRzdOWnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IRzdObmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEc3Tm51ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hHN05uT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IRzdObWVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hHN05tdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NDgsIDAsIDE0ODFdJFswLCAtMTQ4MSwgMCwgNDQ4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IRzdObi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEc3Tm9PZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSEUtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0NzhFMDAwRCI+Ci0gICAgICAgICAgICA8Ym9keT4wNTwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JLRURZT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1JxR09VT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyMjUiLz4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1NMVlRJT3hnRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MkRERTI4MDAyNUQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgbmFtZT0iTWV0aG9kUGFja2FnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhHLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxM0YiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBQYWNrYWdlIGlzIGFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMENDMEEwMUQ3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIi8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUQ1RjgwMzhFIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDEyRkE4NTQwMzBFIiBuYW1lPSJnbG9iYWwiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzVHY1lBT2llRWR1UWJ1WTZVd01TUWciPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0bUhJT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTJGQTg1NDAzMEUiPgotICAgICAgICAgICAgICAgIDxib2R5Pk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX0d0bUhJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QyIgbmFtZT0icmV1c2VkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEzRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSRS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSRXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0NUNCdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0NUNCZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMkIiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3RtSEpPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEyQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwM0FGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBDIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2QyIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdHZSQi1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdHZSQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEMgXzNBREM3Qjc0MDIyRDQxRTBDMDExMDAwRCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0dlJBLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEIiPgotICAgICAgICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBjb250YWlucyBDb250ZW50IEVsZW1lbnRzLiAgQSBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2UgY2FuIGJlIHBhcnQgb2Ygb25seSBvbmUgcGFja2FnZSBpbnN0YW5jZS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUwQzAxMTAwMEQiIG5hbWU9Il9jb250ZW50UGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTJCIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFMEMwMTEwMDBCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3R2UkN1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3R2UkNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwNDkiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSBfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDRDIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3R2UkRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSI+Ci0gICAgICAgICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIGEgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSB0d28gcGFja2FnZXMgaXQgY29ubmVjdHMuICBUaGUgcGFja2FnZSBhdCB0aGUgdXNpbmdQYWNrYWdlIGVuZCBkZXBlbmRzIG9uIHRoZSBwYWNrYWdlIGF0IHRoZSByZXVzZWRQYWNrYWdlIGVuZC4gIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IGluIHRoZSBmb3JtZXIgcGFja2FnZSBpcyB1c2luZyBhbiBlbGVtZW50IGluIHRoZSBsYXRlciBpbiBhIHJlbGF0aW9uc2hpcCBzdWNoIGFzIGEgVGFzayBpcyB1c2luZyBhIFdvcmsgUHJvZHVjdHMgYXMgYW4gaW5wdXQuICBSZWZsZXhpdmUgcmV1c2VkUGFja2FnZSBsaW5rcyAoaS5lLiBhIHBhY2thZ2UgdGhhdCBkZXBlbmRzIG9uIGl0c2VsZikgYXJlIG5vdCBhbGxvd2VkLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0QSIgbmFtZT0idXNpbmdQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDA0OSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d0dlJFT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d0dlJELWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiIG5hbWU9IlBhY2thZ2VOZXN0aW5nIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzYgXzNBREM3Qjc0MDIyRDQwRjM2QzYxMDAzOCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d0dlJGZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MTAwMzUiPgotICAgICAgICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGJlIG5lc3RlZCwgaS5lLiBhIHBhY2thZ2UgY2FuIGJlIHBhcnQgb2YgYW5vdGhlciBwYWNrYWdlLiAgTmVzdGVkIHBhY2thZ2VzIGRvIG5vdCBuZWVkIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsIGUuZy4gYSBDb250ZW50IFBhY2thZ2UgY2FuIGJlIGRlZmluZWQgaW5zaWRlIGEgUHJvY2VzcyBQYWNrYWdlIChkZWZpbmUgZm9yIHRoZSBQcm9jZXNzIHBhcnQgb2YgdGhpcyBtb2RlbCkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM2IiBuYW1lPSJfbWV0aG9kUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNjEwMDM1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Q1Q0EtZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Q1Q0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNDlFQTAxRTIiIG5hbWU9Ik1ldGhvZENvcmVEZXNjcmlwdGlvbnMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3V5WjRlZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFERTRBQjQwMDk4Ij4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERTRBQjQwMDk4IiB0eXBlPSJDbGFzcyIgbmFtZT0iTWFpbiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUyMjEwMUQyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ3NTgiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1GZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1HZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtR3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1HLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1IZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtSC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtRWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1FdWZYRWR1cUhvT0piVVJaUnciIHg9IjY0NjAiIHk9IjE2MzE1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUyNUMwMTM3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLUpPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0MDIiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1KZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtSi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLUtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1LZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1LLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1MZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtTC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtSWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1JdWZYRWR1cUhvT0piVVJaUnciIHg9IjE4NjIiIHk9IjE2MjgxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERjM2MzYwMTA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLU5PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM5MjgiIGhlaWdodD0iMzI2OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1OZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1PZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtT3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1PLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1QZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtUC1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtTWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1NdWZYRWR1cUhvT0piVVJaUnciIHg9IjIyMTY1IiB5PSIxMjk0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVFPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU1MzE5MDM1MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1RLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIRS1ST2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0OTk1IiBoZWlnaHQ9IjE5OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1SdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1TT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtUy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISEUtVGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhFLVFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISEUtUXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjI4NSIgeT0iMTI5MjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1VT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNTM1MTAwMTMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtVk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzExNSIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtVnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1WLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1XdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1YT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLVhlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1YdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1YLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1VZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLVV1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iODc1NCIgeT0iMTI5MjgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1ZT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURGMzYyMDAwOUEiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISEUtWk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMTUxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLVplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1aLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtYU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1hdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1iT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhFLWJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIRS1idWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIRS1iLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIRS1ZZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhFLVl1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTc5NTciIHk9IjEyOTM3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISEUtY09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhFLWMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhFLWRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ4NzYiIGhlaWdodD0iMjQyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lCT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lCdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lDT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQ2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JQ3VmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISEUtY2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIRS1jdWZYRWR1cUhvT0piVVJaUnciIHg9IjM0NTQiIHk9IjEyOTExIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhPSUQtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI4MjciIGhlaWdodD0iMTA0OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JRk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUZlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JRnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUd1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSURPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSURlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMwNjQiIHk9Ijk5OSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lIdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lILWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0NTU1IiBoZWlnaHQ9IjExNTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lJZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUplZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUotZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JS09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUtlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSUt1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSUhPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JSGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTk0NiIgeT0iODU2OCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0Q0YzMDFBRSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0liZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIT0lidWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JYi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ljT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ljdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISE9JZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSWVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhPSWEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSWJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTk1MzIiIHk9IjM1MTMiIHdpZHRoPSI1MTMwIiBoZWlnaHQ9IjIyMTgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURFNEE5NzAxMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISE9JcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDE4MiIgaGVpZ2h0PSIxNTQwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSXEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0l0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0l0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIT0lwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lxT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNDM3IiB5PSI0MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVCOTAwMEZDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhYNU51ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjQ0ODciIGhlaWdodD0iMTU0MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1T2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNU91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVQLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1UU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1UWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISFg1TS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1Tk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI0NzE1IiB5PSI0MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNEMwMzg0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhYNWN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM1ODkiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVkLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1ZXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Zk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1ZmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISFg1Yi1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVjT2ZYRWR1cUhvT0piVVJaUnciIHg9IjUxNjQiIHk9IjgzMDUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdXlaNC1mWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhlIE1ldGhvZCBDb3JlIERlc2NyaXB0aW9ucyBwYWNrYWdlIGRlZmluZXMgdGhlIGV4YWN0IG5hdHVyZSBvZiB0ZXh0dWFsIGRlc2NyaXB0aW9ucyB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgZm9yIENvbnRlbnQgRWxlbWVudHMuICBUaGUgZGVjbGFyYXRpb25zIGZvciB0aGVzZSBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGZhY3RvcmVkIGludG8gdGhpcyBzZXBhcmF0ZSBwYWNrYWdlLCBiZWNhdXNlIGV2ZXJ5IGltcGxlbWVudGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBtaWdodCBkZWNpZGUgdG8gZGVmaW5lIGEgZGlmZmVyZW50IHNldCBvZiBkZXNjcmlwdGlvbiBhdHRyaWJ1dGVzIGZvciB0aGVpciBDb250ZW50IEVsZW1lbnRzLiAgSG93ZXZlciwgb25seSB0aGUgZGVzY3JpcHRpb24gYXR0cmlidXRlcyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZSBhcmUgdGhlIHN0YW5kYXJkaXplZCBzZXQgZm9yIElCTSdzIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZSBhbmQgYXJlIHN1cHBvcnRlZCBmb3IgbWV0aG9kIGNvbnRlbnQgaW50ZXJjaGFuZ2UgKGkuZS4gaW1wb3J0L2V4cG9ydCBzY2VuYXJpb3MgZm9yIGRpZmZlcmVudCBjb250ZW50IHNvdXJjZXMpLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JSy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwODUwMzgzIiBzb3VyY2U9Il9ISEUtUU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSUx1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JTU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lMLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JTE9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lMZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDMsIC05OTksIDM1NSwgMzc3Nl0kWy0yMDMsIC00MTk5LCAzNTUsIDU3NV0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSU11ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lNLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSU5PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkFFMDc1MDNDNyIgc291cmNlPSJfSEhFLWNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSUctZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSU9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lPdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISE9JT09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSU5lZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lOdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC0xMjE5LCAtODMzMSwgMzc1OV0kWzgsIC0yODk1LCAtODMyMiwgMjA4Ml0kWzYwNDUsIC00NDE5LCAtMjI4NiwgNTU4XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JTy1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JUGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTg0OUUwMDAxIiBzb3VyY2U9Il9ISEUtVU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lRZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JUHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMCwgLTc5NSwgLTM5MTEsIDM3NzZdJFs4LCAtMTc2OSwgLTM5MDMsIDI4MDJdJFszMDczLCAtMzk5NiwgLTgzOCwgNTc1XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JUk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSVJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JUnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQUUwODgwMTNGIiBzb3VyY2U9Il9ISEUtWU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JRy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JUy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSVRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lTdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JUi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSVNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTgsIC01ODQsIDU1MjgsIDM3ODRdJFstMTYsIC0xNjc2LCA1NTIwLCAyNjkyXSRbLTQzNTEsIC0zNzkzLCAxMTg1LCA1NzVdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lUZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lULWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3QjAxQUMiIHNvdXJjZT0iX0hIRS1JT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lVT2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JVWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils0ODIsIC03OTUsIC0xMzQ2LCAyMTUwXSRbMTA2NiwgLTE3MzUsIC03NjIsIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lWdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JVi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lXT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA3RDAzNjQiIHNvdXJjZT0iX0hIRS1FT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIRS1jT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVhPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lXZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JV3VmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTA1OCwgLTEyMTksIDE4ODgsIDIxODRdJFstMTg5NiwgLTIxOTIsIDEwNDksIDEyMTBdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lYLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JWU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lZZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4QjAwQUEiIHNvdXJjZT0iX0hIRS1NT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lHLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ladWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JWi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSVplZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0lZdWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9JWS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOCwgLTE2NDIsIDk4OTcsIDM3OTNdJFstMTYsIC0zODAxLCA5ODg5LCAxNjM0XSRbLTc2MjgsIC01MDYzLCAyMjc3LCAzNzJdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lhT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISE9JYWVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIT0lldWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzQjAzMTkiIHNvdXJjZT0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lhdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lmLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JZ09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhPSWZ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lnLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lndWZYRWR1cUhvT0piVVJaUnciIHg9IjI1IiB5PSItMTY2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTRFM0QwMzY0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JaHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWhlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0loLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISE9JaU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyODIiIHk9IjM2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lpdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lpLWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MjEiIHk9IjQwOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lqdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Ja2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0lrLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIT0lsT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIT0lrdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9JbGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0RTNEMDM2NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSWwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSW1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSWx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ltZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNEUzRDAzNjIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIT0ltLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhPSW5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhPSW11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIT0llLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIT0lmT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzI1NjUsIDU5MiwgMjU2NSwgNTkyXSRbMzE0OSwgNTkyLCAzMTQ5LCA1OTJdJFszMTQ5LCAxODg4LCAzMTQ5LCAxODg4XSRbMTE5MywgMTg4OCwgMTE5MywgMTg4OF0kWzExOTMsIDExMDksIDExOTMsIDExMDldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISE9JbmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTU2MjQwMTdFIiBzb3VyY2U9Il9ISE9JYXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISE9Jb3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhPSW8tZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIT0lvZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISE9JbnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISE9Jbi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTc3LCAtMTEwOSwgNzQ0MiwgMTk4OV0kWy0xNzcsIC0zMTQ5LCA3NDQyLCAtNTBdJFstNjIwNiwgLTMxNDksIDE0MTMsIC01MF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhPSXBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIT0lwZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhPSXR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFDMDFBMCIgc291cmNlPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhPSWF1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1QWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUJlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjQ5IiB5PSIyNzEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Qi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjFFNERBRDAwNTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1Q09mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVDLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zIiB5PSIzMDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1RHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItNjgwIiB5PSItMjIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA1NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhYNUYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNUZlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVHT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxRTREQUQwMDU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1R3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1R2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMUU0REFEMDA0RCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNUh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1SC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1SGVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhPSXQtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMTI2MzIyNTYiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEhPSXVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjA5MSwgOTMsIC01NDc3LCAyNDVdJFs1MDAzLCA5MywgLTI1NjUsIDI0NV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIWDVJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjAwNTgzQjAxRTYiIHNvdXJjZT0iX0hIT0lwdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIT0lDLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1SnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhYNUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIWDVJZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIWDVJdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy01MCwgLTc3MCwgMCwgMjQ4MF0kWy01MCwgLTI3MjYsIDAsIDUyNF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNUotZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIWDVLT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhYNVF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRCIgc291cmNlPSJfSEhPSXB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhYNU11ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVSZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVTT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISFg1UnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhYNVN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4IiB5PSIyMjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVUZWZYRWR1cUhvT0piVVJaUnciIHg9IjgyOCIgeT0iLTI2MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVULWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyOTRFQzYwMDJCRSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItOTIiIHk9IjE3OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVVdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Vk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjIiIHk9Ii0zNTUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Vi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1V09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1VnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISFg1WE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISFg1V3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNVhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjk0RUM2MDAyQkYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIWDVYLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVYdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDNjAwMkJFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1WS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIWDVaT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIWDVZdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1US1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjEyNjMyMjU2IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIWDVST2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yMDk5LCAwLCA1NDY5LCAwXSRbLTUzMjUsIDAsIDIyNDMsIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISFg1WmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI5NEVDMkIwMUNBIiBzb3VyY2U9Il9ISFg1TXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISE9JQy1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISFg1YXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhYNWEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIWDVhZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISFg1WnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIxMjYzMjI1NiIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISFg1Wi1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyNSwgLTc3MCwgLTc0OTMsIDI0ODBdJFsyNSwgLTMyNTEsIC03NDkzLCAwXSRbNjEwNCwgLTMyNTEsIC0xNDEzLCAwXSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISFg1Yk9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEhYNWJlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Q1Q0RlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxREU0OUVBMDFFMiI+Ci0gICAgICAgICAgICA8Ym9keT4wNjwvYm9keT4KLSAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICA8cGFja2FnZU1lcmdlIHhtaTppZD0iX1ZQSUdNT3hlRWR1SGplM3BQYWhONEEiIG1lcmdlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxOTAiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MjIxMDFEMiIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwN0QwMzY0IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDBBIiBuYW1lPSJicmllZk91dGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3Q1Q0dPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HbmRWa2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HbmRWa095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9HZmo5ME95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDAwQiIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pBZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMEIiPgotICAgICAgICAgICAgICAgIDxib2R5PkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9uc25Za2V5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9uc25Za095SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9uaVZiTU95SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ2MTFEQjJGMDIwRCIgbmFtZT0icmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzJFRXc0ZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzJFRXc0T3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzE4TFpJT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDYxMURCNEQwMjQ4IiBuYW1lPSJub3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfUEJpbDhleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfUEJpbDhPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfTzRjVVVPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MjVDMDEzNyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGQUUwN0IwMUFDIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFERTUzNkEwMEQ4Ii8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDE0IiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pDT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwMTQiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzZwcjhBZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzZwcjhBT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzZiclZNT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDFFIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6Qy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDFFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfZXVsakVleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfZXVsakVPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfZWt3Um9PeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MzE5MDM1MCIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4NTAzODMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNzgiIG5hbWU9InNraWxscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUN6RU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDc4Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfLU9YUndleUlFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfLU9YUndPeUlFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfLURlM2NPeUlFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwODIiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1Q3pFLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwODIiPgotICAgICAgICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9wdFhJVWV5SEVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9wdFhJVU95SEVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9wbDUxY095SEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNEIzNzdEMDI3MiIgbmFtZT0ic3lub255bXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMODh1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNEIzNzdEMDI3MiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfN3FXdTBleUdFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfN3FXdTBPeUdFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfN2cwWVVPeUdFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxREU1MzUxMDAxMyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5ODQ5RTAwMDEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwOEQiIG5hbWU9InB1cnBvc2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMODktZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA4RCI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0JHX3pJZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0JHX3pJT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0NLZjNnT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDk2IiBuYW1lPSJhbHRlcm5hdGl2ZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VMOC11ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA5NiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0FBemZ3ZXlKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0FBemZ3T3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX180NklBT3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MURFNTM2QTAwRDgiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkFFMDc1MDNDNyIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyNzk3Rjc0MDM5MiIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBCNCIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0OHVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEI0Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2FrbTE4ZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2FrbTE4T3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2FjczNJT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJFIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0OWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJFIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX2JaOGlnZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX2JaOGlnT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX2JSbWUwT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJGIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdVZ0LU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEJGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9CQUkxMGV5SkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9CQUkxME95SkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9BMzc4RU95SkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjM2MjAwMDlBIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4ODAxM0YiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUJFMjUxODAwRDIiIG5hbWU9ImF0dGFjaG1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnRfZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUJFMjUxODAwRDIiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il83OFZrd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il83OFZrd095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il83MUx6NE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFERjM2MzYwMTA5IiBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZBRTA4QjAwQUEiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0Mjc5N0Y3NDAzOTIiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwNjAxMzgiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1VnVBdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEYwNjAxMzgiPgotICAgICAgICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0dac1VjT3lKRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0daaktnT3lKRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX0dTMkZrT3lKRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRFRjAwMjdGIiBuYW1lPSJwcm9ibGVtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmU4dWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENEVGMDAyN0YiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il80V18xd2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il80V18xd095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il80T1czSU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ0RUY4MDE5MiIgbmFtZT0iYmFja2dyb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlOWVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRFRjgwMTkyIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfQ2MtQU1leUpFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfQ2MtQU1PeUpFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfQ1NQVzRPeUpFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEZENUQ1MzAxMUQiIG5hbWU9ImdvYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1ZmUtT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEZENUQ1MzAxMUQiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzBVVURjZXlJRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzBVVURjT3lJRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzBMWUo0T3lJRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGRDRGMDEwMjA2IiBuYW1lPSJhcHBsaWNhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdWZlLS1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDRGMDEwMjA2Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il84MHFUNGV5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il84MHFUNE95SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il84dHpkOE95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRkQ1RDNFMDMyNSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdW9vNE9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGRDVEM0UwMzI1Ij4KLSAgICAgICAgICAgICAgICA8Ym9keT5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3RlNEhrZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3RlNEhrT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3VFYkVvT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFREU0QzAzODQiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b280LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREU0QzAzODQiPgotICAgICAgICAgICAgICA8Ym9keT5UaGlzIGRlZmluaXRpb24gb2YgQ29udGVudCBFbGVtZW50IGV4dGVuZHMgdGhlIENvbnRlbnQgRWxlbWVudCBkZWZpbml0aW9uIHZpYSBwYWNrYWdlIG1lcmdlIHdpdGggcmVmZXJlbmNlcyB0byBpY29ucyB0aGF0IGFyZSB1c2VkIGZvciBwcmVzZW50aW5nIENvbnRlbnQgRWxlbWVudHMgaW4gYSBVTUEtYmFzZWQgbW9kZWxpbmcgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyB3aGVuIHB1Ymxpc2hpbmcgQ29udGVudCBFbGVtZW50cyBpbnRvIGRvY3VtZW50YXRpb24gcHJlc2VudGF0aW9uIChlLmcuIGRvY3VtZW50IG9yIGh0bWwgcGFnZXMpLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTM3MDM0MyIgbmFtZT0ic2hhcGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTEzRUEyOTAyRkUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b281LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUU0OTUzNzAzNDMiPgotICAgICAgICAgICAgICAgIDxib2R5PkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9KWkhyUWV5UEVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9KWkhyUU95UEVkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9KT2lMNE95UEVkdUZLSm92Qkw2NFhRIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTNDMDMxOSIgbmFtZT0ibm9kZWljb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxMTNFQTI5MDJGRSI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3VvbzZ1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTQ5NTNDMDMxOSI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9GajFid2V5UEVkdUZLSm92Qkw2NFhRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9GajFid095UEVkdUZLSm92Qkw2NFhRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9HUmxTa095UEVkdUZLSm92Qkw2NFhRIiB0eXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3OTdGNzQwMzkyIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDBBQSIgbmFtZT0iZXh0ZXJuYWxJZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdUw4Xy1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMEFBIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfaG80VWdleUhFZHU1LXZWamxmVnNmUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfaG80VWdPeUhFZHU1LXZWamxmVnNmUSIvPgotICAgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfaGZWLUFPeUhFZHU1LXZWamxmVnNmUSIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyIgdmFsdWU9IiIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc3RTcxNjAzN0YiIG5hbWU9ImtleUNvbnNpZGVyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d1b283LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTc3RTcxNjAzN0YiPgotICAgICAgICAgICAgICAgIDxib2R5PktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il8xTU10c2V5SUVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il8xTU10c095SUVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il8xRFotRU95SUVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFMjgwMDI1RCIgbmFtZT0iV29ya1Byb2R1Y3RTdGF0ZXMiPgotICAgICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3ZGVS1PZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDJEREU5RkUwMDNBIj4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREU5RkUwMDNBIiB0eXBlPSJDbGFzcyIgbmFtZT0iTWV0aG9kTGluayI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMkJDIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocUJPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxQi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxQ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxQy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocURPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUQtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhocUFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxOTAyIiB5PSI1Mzg5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRU9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocUZPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUdPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxSGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocUgtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhocUVlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxRXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIzNDIwIiB5PSIzMzgyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxUS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocVItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxVE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxVHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxVU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVV1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhocVJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1BhcmVudD0iTmFtZSIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISGhxUmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MTk3IiB5PSIxMTgwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhocVYtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjE4NzkiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFXdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxVy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFYT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxWXVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISGhxVk9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIaHFWZWZYRWR1cUhvT0piVVJaUnciIHg9IjUyMDciIHk9IjMzNjEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9HdkZVLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIaHFJT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiIHNvdXJjZT0iX0hIaHFFT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIaHFBT2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxSnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocUpPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxS2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxS09mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxS3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxSy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocUxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFMdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMTQiIHk9Ii0zOTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocU11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocU1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFNLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFOdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFOT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIaHFPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFPT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocVBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocVBPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxODIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFRZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocVF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocVFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIaHFJZWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISGhxSXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlszNDcsIDQ0OCwgLTEyNzgsIC0xNjM0XSRbMTIxMCwgMTU1NywgLTQxNCwgLTUyNF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIaHFZLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAwM0MiIHNvdXJjZT0iX0hIaHFVLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIaHFRLWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxWnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhocVotZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFhdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxYS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxYmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxYnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxY3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIaHFjZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMDQiIHk9IjUxOSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFjLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocWVlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWQtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhocWZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhocWUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIaHFmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISGhxZ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZi1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhocWhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISGhxaGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISGhxZy1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEhocVpPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIaHFaZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0zNDcsIC00NTcsIDEyMjcsIDE2NzZdJFstMTIwMiwgLTE2MTcsIDM3MiwgNTE2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICAgIDxjb250ZW50cyB4bWk6dHlwZT0ibm90YXRpb246RGlhZ3JhbSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDM0YwMDM5IiB0eXBlPSJDbGFzcyIgbmFtZT0iU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXo4T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM4MTAzMjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6OC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISHF6OU9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjM3MCIgaGVpZ2h0PSI5MDUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHF6OWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXo5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxejktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXotT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxei1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXotdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxei0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXpfT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxel9lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcXpfdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcXpfLWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIcXo4ZWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxejh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTY4NSIgeT0iMTMyNjciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUREQzAzMTgiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISHEwQk9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzE2NiIgaGVpZ2h0PSI0NTg4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMENPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkVudW1lcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBDdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMERPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBEZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMER1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxMEFlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwQXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMTI1IiB5PSI2NzQ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhxMEUtZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2OTEiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBGT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwRnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEYtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwR09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEdlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwR3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEctZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwSE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEhlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEh1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxMEVPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwRWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgzMyIgeT0iMjM2NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIcTBJLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwSk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMEp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBKLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEtPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBLZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMEt1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBLLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEhxMExPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBMZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBMdWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIcTBJT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEhxMEllZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTQ2MjMiIHk9IjEwNjQ4IiB3aWR0aD0iMjM3MyIgaGVpZ2h0PSIxNTc0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEhxMFZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBWLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwV2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwVy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwazhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBrOGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwazh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBrOC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwazlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwazllZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEhxMFUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwVk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4ODMxIiB5PSIxMDQ5MCIgd2lkdGg9IjE3NjkiIGhlaWdodD0iMTU3NCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIMGxTZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjkxIiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsU3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxUZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxULWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxVZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbFV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxVLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxWT2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hIMGxSdWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEgwbFItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTUwNyIgeT0iMTMxOTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxWZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsV09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISDBsV2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsVy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxYT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxZT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxZdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsWS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsWk9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISDBsVnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxWLWZYRWR1cUhvT0piVVJaUnciIHg9IjExMjI2IiB5PSI1MDQ2IiB3aWR0aD0iMzA5NSIgaGVpZ2h0PSIxOTA1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEgwbGN1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxjLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsZGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGR1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsZC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGVPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsZWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGV1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsZS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGZPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEgwbGZlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEgwbGItZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsY09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMTY3NSIgeT0iODMzMSIgd2lkdGg9IjE4MjciIGhlaWdodD0iMTIxOSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkktZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hIOXZKLWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMDE1IiBoZWlnaHQ9Ijg5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dktlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkstZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2TE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkxlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2THVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkwtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2TU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dk1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dk11ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEg5dkpPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2SmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI3MTIwIiB5PSIxMzI2NyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2UEYwZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEhxMEwtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyIgc291cmNlPSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBOZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISHEwTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME51ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxME4tZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5NiIgeT0iMzQzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxME9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBPLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwT3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTg0IiB5PSI5NzUiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyM0IiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBQdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFBlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjgwIiB5PSItMzA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEhxMFFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4IiB5PSIyMjciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwUk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwUmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwU09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISHEwU2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISHEwUi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEhxMFN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIcTBUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBUZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBTLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISHEwVU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIcTBVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIcTBULWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISHEwTU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIcTBNZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzY3NywgLTc5NSwgMzYyMywgNzI4MV0kWzY3NywgLTgyMjEsIDM2MjMsIC0xNDNdJFstMTEwMCwgLTgyMjEsIDE4NDUsIC0xNDNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBrOXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRTEwMzhDIiBzb3VyY2U9Il9ISHF6OE9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgway1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBrLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwa19PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGstdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBrOS1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEgway1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIwMywgLTQ1NywgODYzLCAxOTgxXSRbLTcyOCwgLTE2NTEsIDMzOCwgNzg3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDBrX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEgwa191ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBrXy1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEIwMTlCIiBzb3VyY2U9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwSC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxBLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsQi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItNDQ1IiB5PSItMjA0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbENlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxDLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsQ3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxODIiIHk9IjIxMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbER1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MDMiIHk9Ii0xNzgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRU9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMTU2IiB5PSIyMTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTREIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsRk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsRmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsR09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsR2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsRi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNEQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxIZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxHLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsSU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxILWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsQU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxBZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc4NywgLTU1OCwgLTQ5MDIsIC01NThdJFs0NzY2LCAtNTU4LCAtOTIyLCAtNTU4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwbEl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk0MDNCQiIgc291cmNlPSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEotZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxLT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsSnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbEstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbEt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTM5NCIgeT0iMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbExPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxMdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsTGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI4MCIgeT0iLTIyOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsTU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIzNjkiIHk9IjI3MSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxOT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxNLWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yMTUiIHk9Ii0yMjgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsT09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsTnVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbE9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsTy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsT3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbFBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNUEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxQLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxRT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxQdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsUS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxST2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxRdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsSS1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxKT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzc5NCwgNTU1LCAtNDg5NSwgNTU1XSRbNDc2MywgNTU1LCAtOTI2LCA1NTVdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBsWmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDNjgwMDkyIiBzb3VyY2U9Il9ISDBsVmVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwRC1mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsYXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIMGxhZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsWnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxaLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC05NDgsIC01MCwgMTg0NV0kWzAsIC0yMjg2LCAtNTAsIDUwOF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEgwbGJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hIMGxiZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEgwbGZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDA3OCIgc291cmNlPSJfSEgwbGJ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMEgtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxnZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDBsZ3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEgwbGh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjE4IiB5PSIyOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsaU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxpZWZYRWR1cUhvT0piVVJaUnciIHg9IjY1OCIgeT0iLTI5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsak9mWEVkdXFIb09KYlVSWlJ3IiB4PSI2MiIgeT0iLTE1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxqdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxrT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxqLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsa2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkZBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsbE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsa3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbGxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDBsbU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDBsbHVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEgwbG1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIMGxtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxuT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxtdWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMkY4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDBsbi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIMGxvT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIMGxudWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDBsZi1mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIMGxnT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzgyMSwgNTksIC0yMTc1LCAtMjI3N10kWzI4NTMsIDU5LCAtMTQzLCAtMjI3N10kWzI4NTMsIDE1NDksIC0xNDMsIC03ODddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDBsb2VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMTY0IiBzb3VyY2U9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISHEwVXVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXU0ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1NWVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNjUiIHk9Ii0zMDYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1NS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc4NSIgeT0iMjE5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1N09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXU2LWZYRWR1cUhvT0piVVJaUnciIHg9IjIwMCIgeT0iMTM1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dTd1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMyIiB5PSItNzE0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dThPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dThlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXU5T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dTktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dTllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXUtT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl1LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl1LS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1LWVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dV9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dV91ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl1Xy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl1X2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEgwbG91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDBsby1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstOTI2LCAyMTIsIDE4NzksIC0yMTQzXSRbLTMwNjksIDIxMiwgLTI2NCwgLTIxNDNdJFstMzA2OSwgMTU2MSwgLTI2NCwgLTc5NF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIOXZBT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRDAxMDAiIHNvdXJjZT0iX0hIMGxWZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIMGxidWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2QS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2QnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dkJPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZCLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZDZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZDT2ZYRWR1cUhvT0piVVJaUnciIHg9IjM3NiIgeT0iMzgxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZET2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Qy1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjQiIHk9Ii0xMTM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2RC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZEdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMCIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkVlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTUzIiB5PSItNzY3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkZPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dkd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dkdPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxRkUwMEU3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2SHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2SE9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dkllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2SXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2SU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dkFlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDl2QXVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMTIsIDk1MywgMTA2LCAtMTk4NF0kWzIxMiwgMjMyOCwgMTA2LCAtNjA5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEg5dk0tZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFRURGMDExMiIgc291cmNlPSJfSEg5dkktZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEhxMFV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dk9PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZPZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISDl2Ti1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dk5PZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hIOXZOZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzMwNCwgLTQ1NywgLTEzNzEsIDE5ODFdJFsxMTE3LCAtMTY1MSwgLTU1OCwgNzg3XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISDl2T3VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEg5dk8tZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDl2UE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjEwMkQ1IiBzb3VyY2U9Il9ISDl2SS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISDBsUmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZRT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2US1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Uk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZSLWZYRWR1cUhvT0piVVJaUnciIHg9IjgzIiB5PSItMjg3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Uy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xMzUiIHk9Ii0yOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2VGVmWEVkdXFIb09KYlVSWlJ3IiB4PSItMzExIiB5PSI1OTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMThDIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2VXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2VU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2VmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISDl2VnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2Vk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dlYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZXdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZXT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2Vy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZYdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZYT2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISDl2UGVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEg5dlB1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTEwMTYsIDAsIDM3NTksIDBdJFstMjkyOSwgMCwgMTg0NSwgMF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hIOXZYLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzOTAxODYiIHNvdXJjZT0iX0hIOXZJLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hIMGxWZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2WXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZaT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2WmVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEg5dlktZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZadWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZhT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZaLWZYRWR1cUhvT0piVVJaUnciIHg9Ii05MzMiIHk9Ii0yODMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2YWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZhdWZYRWR1cUhvT0piVVJaUnciIHg9Ii00MjMiIHk9Ii0xNjQxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2YnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZiZWZYRWR1cUhvT0piVVJaUnciIHg9IjExMzYiIHk9IjMzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZiLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZjZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZjT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQzMyIgeT0iLTI0NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZjdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNjAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZkZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZjLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ZHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZlT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hIOXZlZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZkLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ZXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dmZlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmUtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZmdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZnT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dmdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmYtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hIOXZZT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEg5dlllZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTQ3NiwgLTMxOCwgLTUzNzEsIDcyNzZdJFstNDc2LCAtODQ2NywgLTUzNzEsIC04NzNdJFszMzM0LCAtODQ2NywgLTE1NjEsIC04NzNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISDl2Z3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDgwMTQwIiBzb3VyY2U9Il9ISDl2SS1mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISDBsYnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hIOXZodWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2aS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2aXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISDl2ak9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZqZWZYRWR1cUhvT0piVVJaUnciIHg9Ii00NDkiIHk9IjQ3NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZqLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2a09mWEVkdXFIb09KYlVSWlJ3IiB4PSI3ODgiIHk9IjI1MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZrdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZsT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hIOXZrLWZYRWR1cUhvT0piVVJaUnciIHg9Ii04IiB5PSItMjQ2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmxlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dmwtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dm1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dmx1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEg5dm0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEg5dm5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEg5dm11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hIOXZuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISUhmNE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISDl2bnVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNDQyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSElIZjVPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISUhmNWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISUhmNC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEg5dmctZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISDl2aE9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTU5LCAtMzE4LCAtNDg2OSwgNDMzOV0kWy0xNTksIC01NjA5LCAtNDg2OSwgLTk1Ml0kWzQyNjAsIC01NjA5LCAtNDUwLCAtOTUyXSRbNDI2MCwgLTUyNjYsIC00NTAsIC02MDldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il9DblE1a094bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJDbGFzcyIgbmFtZT0iVGF4b25vbXkiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU1PeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlNLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0U3MDlOT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9FNzA5TmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlOdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfRTcwOU4teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlPT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTcwOU9leG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlPdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTcwOU8teG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlQT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfRTcwOVBleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0U3MDlQdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0U3MDlQLXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0U3MDlNZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfRTcwOU11eG1FZHV3T2JrSUE2eDFnQSIgeD0iODQxMiIgeT0iNzE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQZ094bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREVDNEUwMEIzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGcteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfR0FGUGhPeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0dBRlBoZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGh1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9HQUZQaC14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGlPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HQUZQaWV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGl1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HQUZQaS14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGpPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9HQUZQamV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfR0FGUGp1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfR0FGUGoteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfR0FGUGdleG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9HQUZQZ3V4bUVkdXdPYmtJQTZ4MWdBIiB4PSI0NTc2IiB5PSI1NzQxIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0TU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3QTgyRDMwMTdGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE0teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSXRodE5PeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0aHROZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE51eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0Ti14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE9PeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JdGh0T2V4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodE91eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JdGh0Ty14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodFBPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9JdGh0UGV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRodFB1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSXRodFAteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSXRodE1leG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JdGh0TXV4bUVkdXdPYmtJQTZ4MWdBIiB4PSI0NDY5IiB5PSIzMzg1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJWU94bUVkdXdPYmtJQTZ4MWdBIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSVkteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfTGVRSVpPeG1FZHV3T2JrSUE2eDFnQSIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xlUUlaZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSVp1eG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MZVFJWi14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWFPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MZVFJYWV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWF1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MZVFJYS14bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWJPeG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MZVFJYmV4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTGVRSWJ1eG1FZHV3T2JrSUE2eDFnQSIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfTGVRSWIteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfTGVRSVlleG1FZHV3T2JrSUE2eDFnQSIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9MZVFJWXV4bUVkdXdPYmtJQTZ4MWdBIiB4PSIxMDg3MiIgeT0iMzM4NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEVPeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhFLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1JxeDhGT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ScXg4RmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhGdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUnF4OEYteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhHT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUnF4OEdleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhHdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUnF4OEcteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhIT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfUnF4OEhleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JxeDhIdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1JxeDhILXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1JxeDhFZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfUnF4OEV1eG1FZHV3T2JrSUE2eDFnQSIgeD0iODA5NiIgeT0iMzM2MCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEFPeG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hBLXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX1RRc3hCT3htRWR1d09ia0lBNngxZ0EiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9UUXN4QmV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hCdXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfVFFzeEIteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hDT3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVFFzeENleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hDdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVFFzeEMteG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hET3htRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfVFFzeERleG1FZHV3T2JrSUE2eDFnQSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1RRc3hEdXhtRWR1d09ia0lBNngxZ0EiIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX1RRc3hELXhtRWR1d09ia0lBNngxZ0EiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX1RRc3hBZXhtRWR1d09ia0lBNngxZ0EiIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfVFFzeEF1eG1FZHV3T2JrSUE2eDFnQSIgeD0iMTMxNDgiIHk9IjMzODUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9DblE1a2V4bUVkdXdPYmtJQTZ4MWdBIi8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0l0aHRRT3htRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjdBODJGMzAyNkUiIHNvdXJjZT0iX0l0aHRNT3htRWR1d09ia0lBNngxZ0EiIHRhcmdldD0iX0U3MDlNT3htRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdGh0US14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVNT3htRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9JdHJlTWV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JdGh0Uk94bUVkdXdPYmtJQTZ4MWdBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSXRodFFleG1FZHV3T2JrSUE2eDFnQSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0l0aHRRdXhtRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWzI5MSwgLTMxOCwgLTE1MzUsIDE2MTRdJFsxMzc2LCAtMTQ1NiwgLTQ1MCwgNDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSXRyZU11eG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyRERFQzY4MDA5MiIgc291cmNlPSJfR0FGUGdPeG1FZHV3T2JrSUE2eDFnQSIgdGFyZ2V0PSJfSXRodE1PeG1FZHV3T2JrSUE2eDFnQSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVOZXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSXRyZU4teG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0l0cmVPT3htRWR1d09ia0lBNngxZ0EiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0l0cmVOdXhtRWR1d09ia0lBNngxZ0EiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9JdHJlTS14bUVkdXdPYmtJQTZ4MWdBIiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0l0cmVOT3htRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWzUzLCAtMzQzLCA1MywgMjAzOF0kWzUzLCAtMjA2MywgNTMsIDMxOF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX09PUGp3ZXhtRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il9PT1Bqd094bUVkdXdPYmtJQTZ4MWdBIiBzb3VyY2U9Il9MZVFJWU94bUVkdXdPYmtJQTZ4MWdBIiB0YXJnZXQ9Il9FNzA5TU94bUVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfT09QanhPeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9PT1BqeHV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfT09QangteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfT09QanhleG1FZHV3T2JrSUE2eDFnQSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX09PUGp3dXhtRWR1d09ia0lBNngxZ0EiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9PT1Bqdy14bUVkdXdPYmtJQTZ4MWdBIiBwb2ludHM9IlstNDIzLCAtMzQ0LCAyNTQwLCAyMDExXSRbLTIzNTUsIC0xODc5LCA2MDgsIDQ3Nl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX1dFSFQwZXhtRWR1d09ia0lBNngxZ0EiIGVsZW1lbnQ9Il9XRUhUME94bUVkdXdPYmtJQTZ4MWdBIiBzb3VyY2U9Il9ScXg4RU94bUVkdXdPYmtJQTZ4MWdBIiB0YXJnZXQ9Il9FNzA5TU94bUVkdXdPYmtJQTZ4MWdBIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV0VIVDFPeG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XRUhUMXV4bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfV0VIVDEteG1FZHV3T2JrSUE2eDFnQSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfV0VIVDFleG1FZHV3T2JrSUE2eDFnQSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1dFSFQwdXhtRWR1d09ia0lBNngxZ0EiIHJvdXRpbmc9IlRyZWUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9XRUhUMC14bUVkdXdPYmtJQTZ4MWdBIiBwb2ludHM9IlstNzksIC0zMTcsIDEwODUsIDM4OTBdJFstMTAzMiwgLTM3MzEsIDEzMiwgNDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfV2VWeHNleG1FZHV3T2JrSUE2eDFnQSIgZWxlbWVudD0iX1dlVnhzT3htRWR1d09ia0lBNngxZ0EiIHNvdXJjZT0iX1RRc3hBT3htRWR1d09ia0lBNngxZ0EiIHRhcmdldD0iX0U3MDlNT3htRWR1d09ia0lBNngxZ0EiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XZVZ4dE94bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1dlVnh0dXhtRWR1d09ia0lBNngxZ0EiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9XZVZ4dC14bUVkdXdPYmtJQTZ4MWdBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9XZVZ4dGV4bUVkdXdPYmtJQTZ4MWdBIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfV2VWeHN1eG1FZHV3T2JrSUE2eDFnQSIgcm91dGluZz0iVHJlZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1dlVnhzLXhtRWR1d09ia0lBNngxZ0EiIHBvaW50cz0iWy0zNDQsIC0zNDQsIDM5OTUsIDM5NjldJFstMzg2MywgLTM4MzcsIDQ3NiwgNDc2XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8cGFja2FnZUltcG9ydCB4bWk6aWQ9Il9VUnpsc09vV0VkdU9CUFFBMmhLcVVRIiBpbXBvcnRlZFBhY2thZ2U9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyOTQiLz4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCIgbmFtZT0iU3RhdGUiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRURGMDExMiIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4MiIgbmFtZT0id29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDJCQyIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdXlaX2VmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdXlaX09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MiIG5hbWU9InJlZ2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMEQ4MDE0MCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU2T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzVFIiBuYW1lPSJzdWJtYWNoaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYxMzkwMTg2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTdlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQUMzMDFBNSIgbmFtZT0iVHJhbnNpdGlvbiI+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfV0VIVDBPeG1FZHV3T2JrSUE2eDFnQSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDIzQiIgbmFtZT0id29ya0RlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyN0E4MkQzMDE3RiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUMyNTAwM0MiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdTdqMHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdTdqMGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRkEiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDA3OCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlUxdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlUxZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCIgbmFtZT0ic291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREVGOEIwMTlCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTNlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTNPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzVBIiBuYW1lPSJ0YXJnZXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUY5NDAzQkIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVNU9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVNC1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzRFMDBCMyIgbmFtZT0iU3RhdGVNYWNoaW5lIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUM2ODAwOTIiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MjdBODJEMzAxN0YiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUiIG5hbWU9InJlZ2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMUZEMDEwMCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU5T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU4LWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVDN0MwMTA5IiBuYW1lPSJWZXJ0ZXgiPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX1dlVnhzT3htRWR1d09ia0lBNngxZ0EiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTYiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREYxQzQwMzMzIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRUVFMDE2NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d1N2oydWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d1N2oyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOEMwMTQzIiBuYW1lPSJvdXRnb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRjhCMDE5QiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlUydWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlUyZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOTUwMzU4IiBuYW1lPSJpbmNvbWluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRjk0MDNCQiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlU0ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlU0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUM4MTAzMjMiIG5hbWU9IlBzZXVkb1N0YXRlIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFMTAzOEMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MkRERUM3QzAxMDkiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6RW51bWVyYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRERDMDMxOCIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVERjYwMkVFIiBuYW1lPSJpbml0aWFsIi8+Ci0gICAgICAgICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRTM0MDI4OSIgbmFtZT0iam9pbiIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUUzOTAyQ0MiIG5hbWU9ImZvcmsiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFM0UwMTFBIiBuYW1lPSJqdW5jdGlvbiIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUU0NDAxRUIiIG5hbWU9ImNob2ljZSIvPgotICAgICAgICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MkRERUU0OTAxM0UiIG5hbWU9ImVudHJ5UG9pbnQiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFNTAwMjkzIiBuYW1lPSJleGl0UG9pbnQiLz4KLSAgICAgICAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFNTYwMDg5IiBuYW1lPSJ0ZXJtaW5hdGUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMUM0MDMzMyIgbmFtZT0iUmVnaW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il9PT1Bqd094bUVkdXdPYmtJQTZ4MWdBIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMzk0IiBuYW1lPSJ2ZXJ0ZXgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQzdDMDEwOSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAxNjQiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdTdqMS1mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdTdqMXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGOCIgbmFtZT0idHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFRUYxMDA3OCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2RlUwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2RlUwdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYwRDkwM0Q2IiBuYW1lPSJzdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBMDUwMDA4IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERGMEQ4MDE0MCIvPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyIgbmFtZT0ic3RhdGVNYWNoaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MkRERUM0RTAwQjMiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJEREYxRkQwMTAwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZGVTktZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZGVTl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzIxMDJENSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVDMjIwMTgyIF8zQURDN0I3NDAyMkQ0MkRERUMyMjAxOEMiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzIyMDE4QyIgbmFtZT0ic3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERUMyMTAyRDUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJEREVDMjUwMjNCIF8zQURDN0I3NDAyMkQ0MkRERUMyNTAyNDUiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDI0NSIgbmFtZT0idHJhbnNpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDJEREVBQzMwMUE1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyRERFQzI1MDAzQyIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRUUwMTY0IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUVFRTAzOTQgXzNBREM3Qjc0MDIyRDQyRERFRUVFMDM5NiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVFRjEwMDc4IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUVGMTAyRjggXzNBREM3Qjc0MDIyRDQyRERFRUYxMDJGQSIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOEIwMTlCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUY4QzAxNDMgXzNBREM3Qjc0MDIyRDQyRERFRjhDMDE0RCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREVGOTQwM0JCIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERUY5NTAzNTggXzNBREM3Qjc0MDIyRDQyRERFRjk1MDM1QSIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYwRDgwMTQwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERjBEOTAzQ0MgXzNBREM3Qjc0MDIyRDQyRERGMEQ5MDNENiIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxMzkwMTg2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERjEzQTAzNUUgXzNBREM3Qjc0MDIyRDQyRERGMTNBMDM2MCI+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxM0EwMzYwIiBuYW1lPSJzdWJNYWNoaW5lU3RhdGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQyRERFQTA1MDAwOCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MkRERjEzOTAxODYiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdkZVOE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdkZVNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJEREYxRkQwMTAwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MkRERjFGRTAwRTUgXzNBREM3Qjc0MDIyRDQyRERGMUZFMDBFNyIvPgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDAzQiIgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfR3diWXB1ZlhFZHVxSG9PSmJVUlpSdyIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIiByZWZlcmVuY2VzPSJfM0FEQzdCNzQwMjJENDFGRkRBMjUwMEZEIj4KLSAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkZEQTI1MDBGRCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFprT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWmstZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLRFpsT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpsLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWm1PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RabWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtEWmtlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtEWmt1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDM4MSIgeT0iNDc0OSIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RabXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURCMzgwMTFFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpuZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RabnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rabi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rab09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rab2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFpvdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWm8tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFptLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFpuT2ZYRWR1cUhvT0piVVJaUnciIHg9IjQzODEiIHk9IjE0NTEiIHdpZHRoPSI0Mjg0IiBoZWlnaHQ9IjE2NzYiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmNPeHdFZHVNMTR1bldhcVA1USIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTFFOTk2MDA5RCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2Yy14d0VkdU0xNHVuV2FxUDVRIiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfLV9UNmRPeHdFZHVNMTR1bldhcVA1USIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmRleHdFZHVNMTR1bldhcVA1USIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmR1eHdFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfLV9UNmQteHdFZHVNMTR1bldhcVA1USIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8tX1Q2ZU94d0VkdU0xNHVuV2FxUDVRIiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iXy1fVDZlZXh3RWR1TTE0dW5XYXFQNVEiIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il8tX1Q2Y2V4d0VkdU0xNHVuV2FxUDVRIiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il8tX1Q2Y3V4d0VkdU0xNHVuV2FxUDVRIiB4PSIxNDUzIiB5PSI4MDQxIiB3aWR0aD0iNDI4NCIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpnT3h4RWR1TTE0dW5XYXFQNVEiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwRkIiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemcteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0xBcXpoT3h4RWR1TTE0dW5XYXFQNVEiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpoZXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpodXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXpoLXh4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemlPeHhFZHVNMTR1bldhcVA1USIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9MQXF6aWV4eEVkdU0xNHVuV2FxUDVRIiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfTEFxemdleHhFZHVNMTR1bldhcVA1USIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfTEFxemd1eHhFZHVNMTR1bldhcVA1USIgeD0iNzM1NCIgeT0iODA0MCIgd2lkdGg9IjQyODQiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXFPZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoZSBNZXRob2QgTGlicmFyeSBwYWNrYWdlIGRlZmluZXMgY2FwYWJpbGl0aWVzIGFyb3VuZCBtYW5hZ2luZyB3aG9sZSBsaWJyYXJpZXMgb2YgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4gIEl0IGFkZHJlc3NlcyByZXF1aXJlbWVudHMgYXJvdW5kIHBoeXNpY2FsbHkgc2VwYXJhdGluZyBkZXNjcmlwdGlvbnMgb2YgQ29udGVudCBFbGVtZW50cyBmcm9tIHRoZWlyIG1vZGVsZWQgcmVsYXRpb25zaGlwcyBkZWZpbmluZyBzZXBhcmF0ZSB1bml0cyBvZiBjb250cm9sLiAgSXQgYWxzbyBhZGRyZXNzZXMgdGhlIGNvbmNlcm4gb2Ygc2NhbGluZyB0byBsYXJnZSBNZXRob2QgTGlicmFyaWVzIGJ5IGRlZmluaW5nIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGRlZmluZSB2aXNpYmlsaXR5IHNwYWNlcyBvciB3b3JraW5nIHNldHMgZm9yIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGFsbG93aW5nIGEgUHJvY2VzcyBFbmdpbmVlciB0byBmb2N1cyBvbiByZWxldmFudCBwYXJ0cyBvZiBMaWJyYXJ5IGluc3RlYWQgb2Ygc2VlaW5nIHRoZSB3aG9sZSBsaWJyYXJ5IGFsbCBhdCBvbmNlLiAgQnkgZGVmaW5pbmcgQ29uZmlndXJhdGlvbnMgYXMgc3Vic2V0cyBvZiBQbHVnaW5zIGFuZCBNZXRob2QgUGFja2FnZXMgdGhhdCBzaGFsbCBiZSBjb25zaWRlcmVkIGZvciBwcm9jZXNzIGF1dGhvcmluZyBvbmx5LCBDb25maWd1cmF0aW9ucyBhbHNvIGRlZmluZSB0aGUgc3BhY2Ugb2YgdmFyaWFiaWxpdHkgaW50ZXJwcmV0YXRpb24gdG8gYXZvaWQgY29uZmxpY3RzIGFtb25nc3QgJ2NvbXBldGluZycgY29udGVudCAoZS5nLiBjb250ZW50IHRoYXQgcmVwbGFjZXMgdGhlIHNhbWUgZWxlbWVudHMpLiIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0FfX19vZXhNRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il9BX19fb094TUVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9IS0RabXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0Raa09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wT3hNRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0FfX19wdXhNRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfQV9fX3FPeE1FZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9BX19fcC14TUVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfQV9fX3BleE1FZHVPTnJNUmdtejQ4QSIgeT0iLTUzMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfQV9fX291eE1FZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9BX19fby14TUVkdU9Ock1SZ216NDhBIiBwb2ludHM9IlstMTQsIDg2MCwgLTE0LCAtMjQzNV0kWy0xNCwgMjQ0OCwgLTE0LCAtODQ3XSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9MQXF6a2V4eEVkdU0xNHVuV2FxUDVRIiBlbGVtZW50PSJfR05rQjhPeFNFZHVPTnJNUmdtejQ4QSIgc291cmNlPSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfTEFxemdPeHhFZHVNMTR1bldhcVA1USI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6bE94eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9MQXF6bHV4eEVkdU0xNHVuV2FxUDVRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0xBcXptT3h4RWR1TTE0dW5XYXFQNVEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfTEFxemwteHhFZHVNMTR1bldhcVA1USIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0xBcXpsZXh4RWR1TTE0dW5XYXFQNVEiIHg9IjQyNCIgeT0iLTY0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfTEFxemt1eHhFZHVNMTR1bldhcVA1USIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9MQXF6ay14eEVkdU0xNHVuV2FxUDVRIiBwb2ludHM9IlstMTQsIDg0NiwgLTI5NzcsIC0yNDQ3XSRbMjk1MCwgMjQzMywgLTEzLCAtODYwXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9SY3FmTWV4MEVkdTUtdlZqbGZWc2ZRIiBlbGVtZW50PSJfUmNxZk1PeDBFZHU1LXZWamxmVnNmUSIgc291cmNlPSJfSEtEWmtPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfLV9UNmNPeHdFZHVNMTR1bldhcVA1USI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SY3pwSU94MEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9SY3pwSXV4MEVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1JjenBKT3gwRWR1NS12VmpsZlZzZlEiIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfUmN6cEkteDBFZHU1LXZWamxmVnNmUSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX1JjenBJZXgwRWR1NS12VmpsZlZzZlEiIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX1JjcWZNdXgwRWR1NS12VmpsZlZzZlEiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfUmNxZk0teDBFZHU1LXZWamxmVnNmUSIgcG9pbnRzPSJbLTIzLCAzMiwgODgsIC05Ml0kWy04NywgMTU3LCAyNCwgMzNdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZERDU1MTAzN0MiIHR5cGU9IkNsYXNzIiBuYW1lPSJUYXhvbm9teSI+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI4MCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rac09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWnNlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMxMTUiIGhlaWdodD0iMTExNyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWnRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RadHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RadU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RadXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWnZPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RacnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0Raci1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMjkyMCIgeT0iMTAxNiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0Rad2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjQ3MiIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rad3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0Rady1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaeE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp4LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp5ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFp5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFp5LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0Raek9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFp2dWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFp2LWZYRWR1cUhvT0piVVJaUnciIHg9IjMwODEiIHk9IjM0MzciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjF1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtEWjJ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaM3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaMy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNE9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaNGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtEWjVlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS0RaMS1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS0RaMk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzc1NCIgeT0iNTc4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS0RaNnVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjU3MyIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaN2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo3dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo4T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLRFo4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLRFo5T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS0RaOWVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLRFo1LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dQYXJlbnQ9Ik5hbWUiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFo2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc2MDMiIHk9Ijc5NjciLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2tPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTgwMDI1MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lay1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOS2xPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0MzciIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2xlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS2wtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lbk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LbmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LbnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS24tZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05La2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05La3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNTk5IiB5PSI1NzgyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktxZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MURERkEzNjAyQzEiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3JPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLTktyZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyMjE4IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktydWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3N1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3MtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3RPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3RlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3R1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3QtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkt1T2ZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEtOS3F1ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS3EtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA4MjgiIHk9IjM0NDUiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3VlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ldk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOS3ZlZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM2MDYiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3Z1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3dPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ld2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05Ld3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Ldy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LeE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LeGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LeHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LeC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOS3lPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LdXVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LdS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNzAzOSIgeT0iMzQ3MSIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMHVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9IS05LMXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LMmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTksydWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTksyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkszT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkszZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkszdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLTkszLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTks0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LNGVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLTkswLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTksxT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijc1OTQiIHk9IjU3ODIiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDEwNCI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEtOSy1PZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjI3NDMiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy11ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSy0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LX2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LX3VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05LXy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MQU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9IS05MQWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEtOTEEtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9IS05LOWVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93UGFyZW50PSJOYW1lIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LOXVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMzEwNiIgeT0iNTc4MiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLRFp6ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg5MTAzQUQiIHNvdXJjZT0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFpyZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjBPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWjB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaMC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFowZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLRFp6dWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtEWnotZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTIzNiwgLTMwNCwgLTg5MjMsIDIwODJdJFs4NTkzLCAtMjAzMiwgLTE1NjYsIDM1NV0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLRFoxT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtEWjFlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLRFo5dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDNTAzQTEiIHNvdXJjZT0iX0hLRFo1dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWi1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtEWi0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS0RaX09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLRFotdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLRFo5LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtEWi1PZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTUzMywgLTUyNCwgNDAzOCwgMzk5Nl0kWy00MDM4LCAtMzk5NiwgNTMzLCA1MjRdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS0RaX2VmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLRFpfdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05Lb09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUUwQzkwMTk0IiBzb3VyY2U9Il9IS05La09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RadmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTktwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOS3B1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05LcE9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05Lb2VmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTktvdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDE4MTFdJFswLCAtMTgxMSwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOS3AtZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LcU9mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOS3llZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2MyIgc291cmNlPSJfSEtEWjF1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtOS3VlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05Lek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LenVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkt6LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOS3plZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOS3l1ZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05LeS1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlswLCAtNTI0LCAwLCAxODExXSRbMCwgLTE4MjAsIDAsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkswT2ZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzBlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTks0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZGREY4MjAxNjYiIHNvdXJjZT0iX0hLTkswdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLRFp2ZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LNk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTks1dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTks0LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOSzVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTExMjYsIC01MjQsIDM5NTMsIDE4MTFdJFstMzkzNywgLTE4MTEsIDExNDMsIDUyNF0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks2ZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOSzZ1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hLTks2LWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjUxOEM5MzAwOEYiIHNvdXJjZT0iX0hLTkswdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLTktxZWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOSzhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05LOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLTks3LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hLTks3T2ZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEtOSzdlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNTU4LCAtNTI0LCAtMTk4MSwgMTgxMV0kWzE5NjQsIC0xODIwLCAtNTc1LCA1MTZdIi8+Ci0gICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05LOHVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTks4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9IS05MRGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGQURDMDEwMjhEIiBzb3VyY2U9Il9IS05LOU9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9IS0RacmVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxFT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxFdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEtOTEUtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9IS05MRWVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9IS05MRHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLTkxELWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC01MjQsIDAsIDQxOTldJFswLCAtNDE2NSwgMCwgNTU4XSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEZPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9IS05MRmVmWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEtOTEZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNTE4QkQ3MDFFMyIgc291cmNlPSJfSEtOSzlPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEtOS3FlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9IS05MRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLTkxIT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEtOTEd1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEtOTEYtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9IS05MR09mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstNTY3LCAtNTI0LCAxOTcyLCAxODExXSRbLTE5ODEsIC0xODIwLCA1NTgsIDUxNl0iLz4KLSAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hLTkxIZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEtOTEh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2UEYydWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwM0IiPgotICAgICAgICAgIDxib2R5PjA0PC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlBhY2thZ2UiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEQjM4MDExRSIgbmFtZT0iTGlicmFyeUNvbmZpZ3VyYXRpb25zIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d2LXN4dWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQwRjM2RDdCMDMwNSI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2RDdCMDMwNSIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnlBbmRDb25maWd1cmF0aW9ucyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBM3hPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTN4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3h1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3lPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3l1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3pPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM3p1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBM3otZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBM3dlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkEzd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDgzIiB5PSIzODEwIiB3aWR0aD0iMzcyNSIgaGVpZ2h0PSIyMzM2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBMzFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBMzBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkEzMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxNDM5IiB5PSI5MTI3Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0QS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNEItZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNENlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Q3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEMtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNERlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEQtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0RU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEVlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNEV1ZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNEJPZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0QmVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDA1IiB5PSI5OSIgd2lkdGg9IjUxMzAiIGhlaWdodD0iMjIyNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE51ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRPZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKQTRPdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNTg5IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Ty1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRQdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRRT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRRdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNFEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRST2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRSZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKQTROLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpBNE9PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTU5ODUiIHk9Ijc0NTkiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0U2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISkE0U3VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRUZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VHVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRVZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRVLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0Vk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0VmVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISkE0Ui1mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKQTRTT2ZYRWR1cUhvT0piVVJaUnciIHg9Ijk0NzQiIHk9IjEwOTMwIiB3aWR0aD0iNDEyMyIgaGVpZ2h0PSIxMTA5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpBNFd1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRXLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0WGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNFh1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0WC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktCcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnRPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQnRlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpBNFYtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0V09mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDMzNiIgeT0iMzgxMCIgd2lkdGg9IjQ0NjYiIGhlaWdodD0iMjMzNiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxEaWFncmFtU3R5bGUiIHhtaTppZD0iX0d2LXN5T2ZYRWR1cUhvT0piVVJaUnciIGRlc2NyaXB0aW9uPSJUaGUgTGlicmFyeSBDb25maWd1cmF0aW9ucyBwYWNrYWdlIGFkZHMgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgZm9yIHBhY2thZ2luZyBNZXRob2QgUGx1Z2lucyBhbmQgc2NhbGluZyBtZXRob2QgYW5kIHByb2Nlc3MgYXV0aG9yaW5nIHdvcmsuICBJdCBkZWZpbmVzIHRoZSBrZXkgY29uY2VwdCBvZiBMaWJyYXJ5IHdoaWNoIGNvbXByaXNlcyBvZiBNZXRob2QgUGx1Z2lucyBhcyB3ZWxsIGFzIE1ldGhvZCBDb25maWd1cmF0aW9ucy4gIEEgTGlicmFyeSByZXByZXNlbnRzIHRoZSBvdmVyYWxsIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgYWxsIE1ldGhvZCBFbGVtZW50cy4gIExpYnJhcmllcyByZXByZXNlbnQgYSBzZXBhcmF0ZSBNZXRob2QgJ3VuaXZlcnNlJywgaS5lLiBhIE1ldGhvZCBMaWJyYXJ5IGNhbm5vdCByZWZlcmVuY2UgZWxlbWVudHMgZnJvbSBhbm90aGVyIE1ldGhvZCBMaWJyYXJ5LiAgQSBDb25maWd1cmF0aW9uIGlzIGEgc3Vic2V0IG9mIFBsdWdpbnMgYW5kIE1ldGhvZCBQYWNrYWdlcywgaS5lLiBzZWxlY3Rpb25zIG9mIE1ldGhvZCBQbHVnaW5zIHdpdGggYSBzZWxlY3RlZCBzdWJzZXQgb2YgTWV0aG9kIFBhY2thZ2VzLiAgVGhleSBhcmUgdXNlZCB0byBkZWZpbmUgd29ya2luZyBzZXRzIGZvciBwcm9jZXNzIGF1dGhvcmluZyBwcm92aWRpbmcgYSBwcm9jZXNzIGVuZ2luZWVyIG9ubHkgd2l0aCBsaXN0cyBvZiBlbGVtZW50cyB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBwcm9jZXNzIHdpdGhpbiBzdWNoIGEgQ29uZmlndXJhdGlvbi4gIENvbmZpZ3VyYXRpb25zIGFsc28gZGVmaW5lIHRoZSBzcGFjZSBvZiB2YXJpYWJpbGl0eSBpbnRlcnByZXRhdGlvbiB0byBhdm9pZCBjb25mbGljdHMgYW1vbmdzdCAnY29tcGV0aW5nJyBjb250ZW50IChlLmcuIGNvbnRlbnQgdGhhdCByZXBsYWNlcyB0aGUgc2FtZSBlbGVtZW50cykgYXMgd2VsbCBhcyBkZWZpbmUgc2V0cyBvZiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzIGZvciBleHBvcnQgYW5kIGRpc3RyaWJ1dGlvbi4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpBMzRPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENSIgc291cmNlPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM1dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkEzNU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iODQiIHk9Ii0zOTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzNnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM2LWZYRWR1cUhvT0piVVJaUnciIHg9IjE2MCIgeT0iMTYyNiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzN3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjc4IiB5PSItMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM2MDAyRDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTM4ZWZYRWR1cUhvT0piVVJaUnciIHg9IjE0NiIgeT0iMzU2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzgtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJEOCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMzllZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMzl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMzlPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTM5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBMy1lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBMy11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBMy1PZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTMtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNjAwMkQ4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkEzX2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkEzX3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkEzX09mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBM18tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzYwMDJENiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISkE0QXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISkE0QU9mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpBMzRlZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISkEzNHVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils1OSwgLTU3NSwgNTksIDQxNDhdJFs1OSwgLTM1NjQsIDU5LCAxMTU5XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpBNEUtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiIgc291cmNlPSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNEEtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRGdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRHZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISkE0Ri1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEctZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwNCIgeT0iLTE2OSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEh1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE3MCIgeT0iMTM4MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMzk2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNEktZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRKZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRKT2ZYRWR1cUhvT0piVVJaUnciIHg9IjEyNyIgeT0iLTM0NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRKdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRLT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRLZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRKLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0S3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKQTRMZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKQTRLLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISkE0THVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpBNE1PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNE1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNEwtZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTRNdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKQTROT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpBNE5lZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpBNE0tZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKQTRGT2ZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpBNEZlZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTMsIC0xMTY4LCAtNDQ3OCwgMjMzNl0kWzkzLCAtMzM3OCwgLTQ0NzgsIDEyN10kWzIwMDYsIC0zMzc4LCAtMjU2NSwgMTI3XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQnR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSIgc291cmNlPSJfSEpBM3dPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J2T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktCdXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQnZ1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTE4NSIgeT0iLTI1NCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCd3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQndlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTM5MCIgeT0iMjM3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQnctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjI5NiIgeT0iLTExOCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J4dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjE2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCeU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCeC1mWEVkdXFIb09KYlVSWlJ3IiB4PSIyOTYiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0J6T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J5dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCemVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0J6LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0IwT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0J6dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCMGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjB1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0J0LWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQnVPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTg2MiwgNjAxLCAtNzg0MCwgNjAxXSRbNzg0MCwgNjAxLCAtMTg2MiwgNjAxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQjJlZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSIgc291cmNlPSJfSEpBMzBPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjN1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0IzLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktCM2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjRlZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTg0MCIgeT0iMjc5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I1ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNU9mWEVkdXFIb09KYlVSWlJ3IiB4PSI4NTMiIHk9Ii0yMDMiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTE2MSIgeT0iLTE2MCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I2ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCNi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktCNnVmWEVkdXFIb09KYlVSWlJ3IiB4PSI1MDEiIHk9IjM1NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I3ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCOE9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0I4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0I4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0I4ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCOU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQjl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQjktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQjllZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0ItT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0ItdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQi0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQi1lZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0IydWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQjItZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMTUwNywgLTE1MiwgLTgxOTUsIDQ1NzJdJFs4MDUxLCAtMTUyLCAtMTY1MSwgNDU3Ml0kWzgwNTEsIC0zNTU2LCAtMTY1MSwgMTE2OF0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0JfT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiIHNvdXJjZT0iX0hKQTRBLWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktCXy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQ0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NBLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDQk9mWEVkdXFIb09KYlVSWlJ3IiB5PSIzOTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NDT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDQi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0NlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkxIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDQy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NDdWZYRWR1cUhvT0piVVJaUnciIHg9IjE1NyIgeT0iMTY5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0RPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0R1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjI1IiB5PSItMjIzNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NELWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTMiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NFZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NFdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NFT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NGZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NGdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NGT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDRi1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0dlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0dPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NHLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NIZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ0h1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0hPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKS0JfZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpLQl91ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbMjU2NSwgMTAxLCAtMjU2NSwgLTM0MDNdJFs1MDQ2LCAxMDEsIC04NCwgLTM0MDNdJFs1MDQ2LCAyMzM2LCAtODQsIC0xMTY4XSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpLQ0gtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNE51ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NJdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0pPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NKZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISktDSS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0p1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0tPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ0otZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTIwOCIgeT0iMjI4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0tlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDS3VmWEVkdXFIb09KYlVSWlJ3IiB4PSItMjA4IiB5PSItMTM1NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NMT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ0x1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTGVmWEVkdXFIb09KYlVSWlJ3IiB4PSI0MjAiIHk9Ii0xNjkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ01lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ01PZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjY4IiB5PSIzNTYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDTk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDTmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ051ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDT09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDT2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDTi1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ091ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NQZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NPLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTExIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKS0NRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NQLWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktDSU9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0NJZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzEyNDQsIDExNjQsIC0zMDk1LCAtMTYxNF0kWzEyNDQsIDI2NDYsIC0zMDk1LCAtMTMyXSRbMzQxMywgMjY0NiwgLTkyNiwgLTEzMl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0NRdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTROdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDUmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NSLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDU09mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpLQ1J1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NTZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NTLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NTdWZYRWR1cUhvT0piVVJaUnciIHg9Ii0yNjUiIHk9IjI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NUT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1RlZlhFZHVxSG9PSmJVUlpSdyIgeD0iMzk1IiB5PSItMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1QtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDVWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NVT2ZYRWR1cUhvT0piVVJaUnciIHg9IjYyMSIgeT0iMTUyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1V1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKS0NVLWZYRWR1cUhvT0piVVJaUnciIHg9IjI2NSIgeT0iMzQ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1YtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1dPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1Z1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NXZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpLQ1hPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpLQ1d1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKS0NYZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTgwIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISktDWC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDWHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1llZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpLQ1ktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISktDWk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISktDWXVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpLQ1EtZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISktDUk9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsxODYyLCAzNjQsIC0zMjY4LCAtMjYzM10kWzUwNzEsIDM2NCwgLTU5LCAtMjYzM10kWzUwNzEsIDI0ODAsIC01OSwgLTUxNl0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKS0NaZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiIHNvdXJjZT0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5c09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlzdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5cy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUeXNlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl0T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl0dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl0ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0zMiIgeT0iLTI2MiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl0LWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXVlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl1T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5dXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl2T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUeXUtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI3OSIgeT0iLTE4NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl2LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl2dWZYRWR1cUhvT0piVVJaUnciIHg9IjIzNCIgeT0iLTE0OTEiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5d09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5d3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5dy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5d2VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5eHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5eC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5eGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeXlPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHl5dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHl5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl5ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5ek9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5enVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHl6LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHl6ZWZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISktDWnVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKS0NaLWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNDA1LCAtMTE2OCwgLTE0MDUsIC0xMTY4XSRbLTE0MDUsIC0xOTg5LCAtMTQwNSwgLTE5ODldJFstMzQ5NiwgLTE5ODksIC0zNDk2LCAtMTk4OV0kWy0zNDk2LCAtMzg5LCAtMzQ5NiwgLTM4OV0kWy0xODYyLCAtMzg5LCAtMTg2MiwgLTM4OV0iLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKVHkwT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTYiIHNvdXJjZT0iX0hKQTRSdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKQTRWdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5MXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpUeTFPZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkxLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHkyT2ZYRWR1cUhvT0piVVJaUnciIHg9IjE2MyIgeT0iMTcwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHkzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5Mi1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjY5IiB5PSIxMjU0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5My1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHkzdWZYRWR1cUhvT0piVVJaUnciIHg9IjM1NyIgeT0iLTE0MyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJGcm9tUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5NGVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyMzAiIHk9Ii0zNDciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1F1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk4Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5NXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5NU9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTUtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVF1YWxpZmllckxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5NmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJRdWFsaWZpZXJDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR5NnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5Nk9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTYtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHk3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk3dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk3T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5Ny1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5OGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tQ29uc3RyYWludENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHk4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHk4T2ZYRWR1cUhvT0piVVJaUnciIHk9IjEwNTgiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISlR5MGVmWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKVHkwdWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzQyMywgLTU1OCwgLTY5NCwgNTk0M10kWzQyMywgLTUzNDIsIC02OTQsIDExNTldIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR5OC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeTl1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5LU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeS1lZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHk5LWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5LXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5X09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5LS1mWEVkdXFIb09KYlVSWlJ3IiB4PSItMzU1IiB5PSIxNDQiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR5X2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHlfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR5X3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMzk3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDQ1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6QXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpBZWZYRWR1cUhvT0piVVJaUnciIHg9Ii0xNDQiIHk9IjE5NSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpBLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpCZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpCT2ZYRWR1cUhvT0piVVJaUnciIHg9IjIyMCIgeT0iOTk5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekJ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA1OSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekItZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpDdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUekRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekMtZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpEdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6RU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6RWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6RC1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekZPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6RmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6RS1mWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUeTlPZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR5OWVmWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlstMTE0MywgMTE1OSwgLTI1LCAtNTM0Ml0kWy0xMTQzLCA1OTQzLCAtMjUsIC01NThdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISlR6RnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIiBzb3VyY2U9Il9ISkE0VnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISkE0UnVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6Ry1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekhPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKVHpHdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb011bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6SHVmWEVkdXFIb09KYlVSWlJ3IiB4PSItOTI0IiB5PSItMjAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeklPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDU2Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6SXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekllZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpJLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6Sk9mWEVkdXFIb09KYlVSWlJ3IiB4PSI3OTYiIHk9IjkzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUekp1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUektPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUekotZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTA5MCIgeT0iLTU4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpLZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpLLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpMT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpMLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKVHpNT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpMdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6TWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUek0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUek5PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUek11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpOZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNDIiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpOLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUek9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUek51ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKVHpGLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpUekdPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNDIsIDExNjgsIDExNTksIC01MzM0XSRbNDIsIDUwODAsIDExNTksIC0xNDIyXSRbMjIxOCwgNTA4MCwgMzMzNSwgLTE0MjJdJFsyMjE4LCA2MTgwLCAzMzM1LCAtMzIxXSRbOTM5LCA2MTgwLCAyMDU3LCAtMzIxXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEpUek9lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZBMDMxNyIgc291cmNlPSJfSEpBNFZ1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEpBNFJ1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpQLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISlR6UGVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpRZWZYRWR1cUhvT0piVVJaUnciIHk9IjM5NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpRLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKVHpST2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6UnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpTT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelItZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTI2MSIgeT0iMTQ0Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelNlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelN1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iNDc0IiB5PSIyNjU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelRPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3QSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelR1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelRlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpVT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUelV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpUelUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpUelVlZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKVHpWT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISlR6VnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6VmVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeldPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpUeld1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISlR6Vy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISlR6V2VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEpUek91ZlhFZHVxSG9PSmJVUlpSdyIgcm91dGluZz0iUmVjdGlsaW5lYXIiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISlR6Ty1mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9Ils3MTEsIDExNjgsIDE4MjgsIC01MzM0XSRbNzExLCA0MzM0LCAxODI4LCAtMjE2N10kWzM4NTIsIDQzMzQsIDQ5NjksIC0yMTY3XSRbMzg1MiwgNjczOSwgNDk2OSwgMjM3XSRbOTM5LCA2NzM5LCAyMDU3LCAyMzddIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTc2QTNFQzAwMjciIHR5cGU9IkNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpzT2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqcy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISmRqdE9mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGp2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqdnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqdi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISmRqc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGpzdWZYRWR1cUhvT0piVVJaUnciIHg9IjY2OCIgeT0iOTE0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqd09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMDc3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanctZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpkanhPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGp4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanh1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqeC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanlPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqeWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanl1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqeS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanpPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqemVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkanp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkanotZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkandlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRqd3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI5MTEwIiB5PSIzNzc2IiB3aWR0aD0iMzI4MiIgaGVpZ2h0PSIxMDgzIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEpkajFPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGoxZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajF1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqMS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqMi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajNPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISmRqM2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkajMtZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEpkajBlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISmRqMHVmWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDI0IiB5PSIzODYwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3dIMm9lZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249IlRoaXMgZGlhZ3JhbSBzaG93cyBob3cgcHJvY2Vzc2VzIGFyZSBwYWNrYWdlZCBpbiBtZXRob2RsaWJyYXJ5IGFuZCByZWxhdGVkIHRvIGNvbmZpZ3VyYXRpb25zLiIvPgotICAgICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISmRqNE9mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0IiBzb3VyY2U9Il9ISmRqd09mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEpkajVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTY5OSIgeT0iLTMzMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo2T2ZYRWR1cUhvT0piVVJaUnciIHg9Ii01NSIgeT0iMjA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo3T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUm9sZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISmRqNi1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxMDQ5IiB5PSItMjI5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkajdlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1Ij4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5Ii8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo3dWZYRWR1cUhvT0piVVJaUnciIHg9IjMzOSIgeT0iLTI4OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo4ZWZYRWR1cUhvT0piVVJaUnciIHg9Ii02NjkiIHk9IjIzMCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGo5ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGo5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGo5T2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqOS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGotZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKZGotdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKZGotT2ZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRqLS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpkal9lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpkal91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpkal9PZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGpfLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKZGtBZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEpka0F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEpka0FPZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKZGo0ZWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEpkajR1ZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTE0NTYsIDMzLCA2NjcxLCAzM10kWy02NzE0LCAzMywgMTQxMywgMzNdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISmRrQS1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjYzIiBzb3VyY2U9Il9ISmRqME9mWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISmRqc09mWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0J1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISmRrQ09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEpka0NlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKZGtCLWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISmRrQk9mWEVkdXFIb09KYlVSWlJ3IiByb3V0aW5nPSJSZWN0aWxpbmVhciIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKZGtCZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIC00NTcsIC01MCwgMjQ4OV0kWzAsIC0yNDg5LCAtNTAsIDQ1N10iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEpka0N1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKZGtDLWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2WVB5LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFREIzODAxMUUiPgotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9BX19fb094TUVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdllQM09mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NDU2NUJCMTAxNUYiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMUQiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTA0IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2aUExT2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2aUEwLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMTNGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0NSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh4dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh4ZWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5OCIgbmFtZT0icHJvY2Vzc1ZpZXdzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk2Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3plZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3pPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNDUiIG5hbWU9ImRlZmF1bHRWaWV3IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDIxMjkxQ0QwMThCIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwNzBlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwNzBPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE3IiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zdHVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA0MiIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyNDQiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDU1OEVGN0MwMzUzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3ZlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3ZPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyNzAiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI0NCIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zeE9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9Hdi1zdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZZUDRPZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNBQiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgRGVsaXZlcnkgTW9kZWwgRmFtaWx5IGlzIGEgY29udmVuaWVudCBncm91cGluZyBvZiBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgb2YgaW50ZXJlc3QgdG8gc29tZSBzcGVjaWZpYyB1c2VyIGNvbW11bml0eS48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjMiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciIG5hbWU9ImRlbGl2ZXJ5UHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAwNzciIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHotZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTU4MDE1MiIgbmFtZT0iUHJvY2VzcyIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUF3LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiPgotICAgICAgICAgICAgICA8Ym9keT5Qcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLgotVGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4KLTwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMiIgbmFtZT0iZGVmYXVsdENvbnRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3dmVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3dk9mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxODAiIG5hbWU9InZhbGlkQ29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE3RSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd4dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd4ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RDAzQjUiIG5hbWU9Ik1ldGhvZExpYnJhcnkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdmlBeC1mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1Ij4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRkRGODIwMTY2IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1Ii8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDIwMDYwQ0UwMzM3IiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMjgwIi8+Ci0gICAgICAgICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfM0FEQzdCNzQwMjJENDI1MThDOTMwMDhGIiBnZW5lcmFsPSJfM0FEQzdCNzQwMjJENDFEREZBMzYwMkMxIi8+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1IiBuYW1lPSJtZXRob2RQbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxMDQiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgyIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeDF1ZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeDFlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjg3QkY2MDEyNiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDdzLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDdzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjFEIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZpQXplZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNSI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgc2VsZWN0aW9uIG9mIHBhY2thZ2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBjb25maWd1cmF0aW9uLjwvYm9keT4KLSAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDIxNiIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyMTUiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdmlBMGVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdmlBME9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYgXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI0OCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2aUExdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDUiPgotICAgICAgICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNDYiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwcml2YXRlIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjQ1Ij4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3ZyeHctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3ZyeHd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY1IF8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjciPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9HdnJ4eU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjY0Ij4KLSAgICAgICAgICAgICAgPGJvZHk+RGVsaXZlcnkgUHJvY2VzcyBjYW4gYmUgb3JnYW5pemVkIGluIG1hbnkgUHJvY2VzcyBGYW1pbGllcy48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyNjUiIG5hbWU9InByb2Nlc3NGYW1pbGllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0FCIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI2NCI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2cnh6T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2cnh5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAyODIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MyBfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjg1Ij4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3ZyeDBlZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgTWV0aG9kIExpYnJhcnkgcGh5c2ljYWxseSBjb21wcmlzZXMgb2YgTWV0aG9kIFBsdWdpbnMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMjgzIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDI4MiIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2IiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNzAwOTEgXzNBREM3Qjc0MDIyRDQwRjg3QkY3MDA5MyI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2cngyT2ZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEY4N0JGNjAxMjYiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHN0b3JlcyBhIHNldCBvZiBwcmVkZWZpbmVkIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGFyZSByZWd1bGFybHkgdXNlZCBieSB0aGUgbGlicmFyeSBhdXRob3JzIChlLmcuIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHRoZXkgc2hpcCB0byB0aGVpciB1c2VycykuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGODdCRjcwMDkzIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNUQwM0I1IiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDBGODdCRjYwMTI2Ii8+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMSBfM0FEQzdCNzQwMjJENDFFRjA5OTgwMTEyIj4KLSAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3YwN3R1ZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRUYwOTk4MDExMCI+Ci0gICAgICAgICAgICAgIDxib2R5PkEgUHJvY2VzcyBoYXMgZXhhY3RseSBvbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW4gd2hpY2ggdGhlIHByb2Nlc3MgaGFzIGJlZW4gY3JlYXRlZC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTEiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MUVGMDk1ODAxNTIiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MUVGMDk5ODAxMTAiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9HdjA3dXVmWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3dWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0YgXzNBREM3Qjc0MDIyRDQxRUYwOTlGMDE4MCI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2MDd2LWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUVGMDk5RjAxN0UiPgotICAgICAgICAgICAgICA8Ym9keT5BIFByb2Nlc3MgY2FuIGhhdmUgbWFueSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHZlcmlmaWVkIHRvIGFsc28gcHJvZHVjZSB2YWxpZCByZXN1bHRzLiAgUHJvY2VzcyBFbGVtZW50cyAoZS5nLiBEZXNjcmlwdG9ycykgdGhhdCByZWZlciB0byBjb250ZW50IHBhY2thZ2VzIHRoYXQgYXJlIGRlZmluZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2Ygc3VjaCBhIGNvbmZpZ3VyYXRpb24gd291bGQgbm90IGJlIHNob3duIGluIHRoZSBwcm9jZXNzIHdoZW4gcHVibGlzaGVkIG9yIHVzZWQgdW5kZXIgc3VjaCBhIGNvbmZpZ3VyYXRpb24uICBUaGlzIGFsbG93cyB0byBlYXNpbHkgcmVtb3ZlIGNvbnRlbnQgZnJvbSBhIHByb2Nlc3MgYnkgcmVtb3ZpbmcgY29udGVudCBwYWNrYWdlcyB0byBmcm9tIHRoZSByZWxhdGVkIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdGIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFFRjA5NTgwMTUyIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDFFRjA5OUYwMTdFIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3YwN3ctZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3YwN3d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDIwRDNGMDAwMzk3IF8zQURDN0I3NDAyMkQ0MjBEM0YwMDAzOTgiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NyIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyMEQzRjAwMDM5NiI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2MDd5dWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2MDd5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFDRDAxOEIiIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQyMTI5MUQwMDA0NSBfM0FEQzdCNzQwMjJENDIxMjkxRDAwMDU5Ij4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MjEyOTFEMDAwNTkiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0MjEyOTFDRDAxOEIiPgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9Hdi1zc09mWEVkdXFIb09KYlVSWlJ3IiB2YWx1ZT0iKiIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9HdjA3MC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIiBtZW1iZXJFbmQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1NjAyQTcgXzNBREM3Qjc0MDIyRDQyNzZDRTU2MDJBOSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d2LXNzdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0Mjc2Q0U1MjAzQjAiPgotICAgICAgICAgICAgICA8Ym9keT5UaGUgZGVmaW5pdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBjb25maWd1cmF0aW9ucy4gIEZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gQSBjb3VsZCBiZSBkZWZpbmVkIGFzIHRoZSBzdXBlcnNldCBvZiBjb25maWd1cmF0aW9ucyBCLCBDLCBhbmQgRCBwbHVzIGFkZCBtb3JlIHNlbGVjdGVkIFBsdWdpbnMgYW5kIFBhY2thZ2VzLiAgSW4gc3VjaCBhIGNhc2UgQSB3b3VsZCBsaXN0IEIsIEMsIGFuZCBEIGFzIGl0cyBiYXNlQ29uZmlndXJhdGlvbnMuICBJZiBhbnkgb2YgdGhlc2UgYmFzZSBjb25maWd1cmF0aW9ucyBjaGFuZ2VzIGFsbCB1cGRhdGVzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWQgZm9yIEEgYXMgd2VsbCByZWR1Y2luZyBtYWludGFpbmFiaWxpdHkgb3ZlcmhlYWQgZm9yIG92ZXJsYXBwaW5nL2RlcGVuZGVudCBjb25maWd1cmF0aW9ucy4gPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDI3NkNFNTYwMkE5IiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDBGMzZDNTcwMEVGIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDI3NkNFNTIwM0IwIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3Ytc3VlZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3Ytc3VPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEVuZD4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDU1OEVGN0UwMDQyIF8zQURDN0I3NDAyMkQ0NTU4RUY3RTAwNTYiPgotICAgICAgICAgICAgPG93bmVkRW5kIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQ1NThFRjdFMDA1NiIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzU3MDBFRiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQ1NThFRjdDMDM1MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d2LXN3T2ZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d2LXN2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciIG1lbWJlckVuZD0iXzNBREM3Qjc0MDIyRDQ1NTkwMDZCMDI3MCBfM0FEQzdCNzQwMjJENDU1OTAwNkIwMjdBIj4KLSAgICAgICAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0NTU5MDA2QjAyN0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il8zQURDN0I3NDAyMkQ0NTU5MDA2QTAzMTciLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRERCNjAzMDYiIG5hbWU9Ik1ldGhvZFVuaXRzIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3YllvLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxRkVERTA5MDNCMCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVERTA5MDNCMCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZW9PZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVERTc1MDA0RSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKd2VwT2ZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIyNTczIiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VwZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlcC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXFPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlcWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXF1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlcS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXJPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlcmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXJ1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZXItZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZW9lZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndlb3VmWEVkdXFIb09KYlVSWlJ3IiB4PSI1ODg3IiB5PSI2MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlc09mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZXRPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjM0NTQiIGhlaWdodD0iOTA1Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZXRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldHVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2V0LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V1ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldXVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2V2ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndldnVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndldi1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndlc2VmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2VzdWZYRWR1cUhvT0piVVJaUnciIHg9IjkwMjIiIHk9IjYwMDQiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U2ZWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlN09mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISndlN2VmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMjgyNyIgaGVpZ2h0PSIxMDQ5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZTd1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlNy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2U4T2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOC1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOWVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKd2U5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndlOS1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndlLU9mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISndlNnVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKd2U2LWZYRWR1cUhvT0piVVJaUnciIHg9Ijc5ODQiIHk9IjE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZS1lZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyNzk0N0U1MDE3OCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKd2VfZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMzg2IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2VfdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZV8tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmQU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkFlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkJlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmQnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkItZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEp3ZkNPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZS11ZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndlLS1mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTExIiB5PSI2MDA0Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmRXVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUUwMUMxIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEp3ZkZ1ZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjMzMTgiIGhlaWdodD0iMTAzMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKd2ZGLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3ZkdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISndmR2VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEp3Zkd1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISndmRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UG9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UG91ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZQby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHBPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHBlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEp3ZkUtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISndmRk9mWEVkdXFIb09KYlVSWlJ3IiB4PSIyMjAiIHk9IjI5ODgiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZQcXVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iNDUzOCIgaGVpZ2h0PSIyNDIxIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQck9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlByZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQcnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHItZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBzT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHNlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlBzdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UHMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlB0ZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlBwLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHFPZlhFZHVxSG9PSmJVUlpSdyIgeD0iNzE3OSIgeT0iMjM0NSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUZ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVEMDNCNSI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFHZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hKNlFHdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzNjA2IiBoZWlnaHQ9IjEwMzIiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRRy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFIT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUhlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFIdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFJT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUllZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFJdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UUktZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFKT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFKZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hKNlFGLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UUdPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTMwMzAiIHk9IjU5MzUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFMLWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1NzAwRUYiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISjZRTS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMzYwNiIgaGVpZ2h0PSIxMDMyIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UU5PZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFOdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTi1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iQXR0cmlidXRlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFPT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRT2VmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iT3BlcmF0aW9uQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFPdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRTy1mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU2lnbmFsQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlFQT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRUGVmWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iU3RydWN0dXJlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISjZRUHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISjZRTU9mWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9IlRleHQiIHNob3dMaXN0VmlzaWJpbGl0eT0iVGV4dCIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFNZWZYRWR1cUhvT0piVVJaUnciIHg9IjE2ODQwIiB5PSI1OTM1Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTERpYWdyYW1TdHlsZSIgeG1pOmlkPSJfR3diWXBlZlhFZHVxSG9PSmJVUlpSdyIgZGVzY3JpcHRpb249InxNZXRob2QgYW5kIFByb2Nlc3MgQXV0aG9yaW5nIGlzIG5vdCBkb25lIGluIGlzb2xhdGlvbiBieSBhIHNpbmdsZSBwcm9jZXNzIGVuZ2luZWVyLiAgRXNwZWNpYWxseSwgd2hlbiBsYXJnZSBzY2FsZSBNZXRob2QgTGlicmFyaWVzIHNoYWxsIGJlIG1haW50YWluZWQgaXQgaXMgaW1wb3J0YW50IHRvIGRlZmluZSB0aGUgcmlnaHQgbW9kdWxhcml6YXRpb24gcHJpbmNpcGxlcyB0aGF0IGFsbG93IGNvbmN1cnJlbnQgZGV2ZWxvcG1lbnQgb2YgbGFyZ2Ugc2NhbGUgcHJvY2VzcyBlbmdpbmVlcmluZyB0ZWFtcy4gIE1ldGhvZCBQbHVnaW5zIHdlcmUgYSBmaXJzdCBzdGVwIG9mIG1vZHVsYXJpemF0aW9uLiAgSG93ZXZlciwgZXZlbiB3b3JraW5nIHdpdGggTWV0aG9kIFBsdWdpbnMgY2FuIG9ubHkgc2NhbGUgaW4gbGltaXRlZCB3YXlzIHN1cHBvcnRpbmcgb25seSB2ZXJ5IHNtYWxsIGF1dGhvcmluZyB0ZWFtcy4gIEZvciBsYXJnZXIgc2NhbGUgbWV0aG9kIGxpYnJhcmllcyBjb25jdXJyZW50IGFjY2VzcyBhbmQgd29ya2luZyBldmVuIHdpdGhpbiBhIE1ldGhvZCBQbHVnaW4gaXMgcmVxdWlyZWQuICBUbyBhZGRyZXNzIHRoZXNlIHJlcXVpcmVtZW50cyB0aGUgTWV0aG9kIFVuaXRzIHBhY2thZ2UgZXh0ZW5kcyBNZXRob2QgRWxlbWVudHMgdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCBhIG5ldyBjYXBhYmlsaXR5IGRlZmluZWQgYXMgTWV0aG9kIFVuaXQuICBBIE1ldGhvZCBVbml0IGlzIGEgdW5pdCBvZiBjb250cm9sIHRoYXQgY2FuIGJlIHdvcmtlZCBvbiBieSBvbmUgcHJvY2VzcyBlbmdpbmVlciBhbmQgY2FuIHNlcnZlIGFzIG9uZSB1bml0IG9mIHZlcnNpb24gY29udHJvbC4mI3hBO3xUaGUgZGlhZ3JhbSBzaG93cyB0aGF0IGZvdXIgdHlwZXMgb2YgTWV0aG9kIFVuaXRzIGhhdmUgYmVlbiBkZWZpbmVkLiAgQ29udGVudCBEZXNjcmlwdGlvbiByZXByZXNlbnRpbmcgYWxsIG1ham9yIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrLCBBcnRpZmFjdCwgR3VpZGVsaW5lLCBvciBXaGl0ZXBhcGVyIHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuICBXaGVyZWFzIGV2ZXJ5IENvbnRlbnQgRWxlbWVudCdzIENvbnRlbnQgRGVzY3JpcHRpb24gY2FuIGJlIHNlZW4gYXMgYW4gZWxlbWVudCB0aGF0IGNhbiBiZSBtYWludGFpbmVkIGluIGlzb2xhdGlvbiwgUHJvY2Vzc2VzIGFyZSBrZXB0IGFuZCBtYW5hZ2VkIGFzIGEgd2hvbGUuICBJZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgbmVlZHMgdG8gYmUgc3BsaXQgYW5kIGhhbmRsZWQgYXMgc2VwYXJhdGUgdW5pdHMgb2YgY29udHJvbCB0aGVuIG5ldyBwcm9jZXNzZXMgc3VjaCBhcyBDYXBhYmlsaXR5IFBhdHRlcm5zIHdpbGwgYmUgY3JlYXRlZCBmb3Igc3VjaCBhIHJlZmFjdG9yaW5nLiAgSGVuY2UsIGV4YWN0bHkgb25lIGluc3RhbmNlIG9mIFByb2Nlc3Mgc2hhbGwgYmUgc3RvcmVkIGluIGFuIGluc3RhbmNlIG9mIFByb2Nlc3MgQ29tcG9uZW50LCB3aGljaCBpcyBkZWZpbmVkIHRvIGJlIHRoZSBjb250YWluZXIgZm9yIGEgUHJvY2VzcyBhbmQgdGhlcmVmb3JlIGl0cyBNZXRob2QgVW5pdC4gIEZpbmFsbHksIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgTGlicmFyaWVzIGFyZSBkZWZpbmVkIGFzIE1ldGhvZCBVbml0cy4gIFdoZXJlYXMsIHRoZSBmb3JtZXIgc3RvcmVzIGFsbCAnbW9kZWxlZCcgZWxlbWVudHMgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyBzdWNoIGFzIGFsbCBDb250ZW50IEVsZW1lbnRzIChvbmx5IHRoZSBkZXNjcmlwdGlvbiBjbGFzc2VzIGFyZSBtYWludGFpbmVkIGFzIHNlcGFyYXRlIHVuaXRzKSwgdGhlIGxhdGVyIGRlZmluZXMgYSBNZXRob2QgVW5pdCB0byBzdG9yZSByZWZlcmVuY2VzIHRvIHRoZSBNZXRob2QgUGx1Z2lucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBMaWJyYXJ5IGFzIHdlbGwgYXMgTWV0aG9kIENvbmZpZ3VyYXRpb25zLiYjeEE7Ii8+Ci0gICAgICAgICAgICAgIDxlbGVtZW50IHhzaTpuaWw9InRydWUiLz4KLSAgICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iX0hKNlB0dWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDNTAzQTEiIHNvdXJjZT0iX0hKd2VvT2ZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hKNlBwdWZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQdWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lTGFiZWwiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB1LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQdk9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEo2UHV1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlB0LWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9Ik5vbmUiLz4KLSAgICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9ISjZQdU9mWEVkdXFIb09KYlVSWlJ3IiBwb2ludHM9IlsyMDMsIC00NTcsIC0xMTE3LCAyMzg3XSRbNzQ1LCAtMTYzNCwgLTU3NSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHZlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB2dWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UHYtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM5MDE5NCIgc291cmNlPSJfSEp3ZXNPZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB3dWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHhPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB4ZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQdy1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UHdPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB3ZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yOTYsIC00NTcsIDE0ODEsIDIzODddJFstMTAzMiwgLTE2MzQsIDc0NSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UHh1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlB4LWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UHlPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRkVEODkxMDNBRCIgc291cmNlPSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEp3ZTZlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB5LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UHplZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlB6dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQek9mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UHllZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSI0MTk0MzY4IiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlB5dWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0yNSwgLTEyMTksIDI1LCAxNjI1XSRbLTUwLCAtMjMxOSwgMCwgNTI0XSIvPgotICAgICAgICAgICAgICAgIDxzb3VyY2VBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZQei1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0QW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UDBPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZQMGVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDI3OTQ4MDAwMUFFIiBzb3VyY2U9Il9ISndlLWVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQMXVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDEtZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlAxZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZQMHVmWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UDAtZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbNzAyLCAtNDU3LCAtMzc2NywgMjM4N10kWzI1NTYsIC0xNjM0LCAtMTkxMywgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UDJPZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlAyZWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UDJ1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyIgc291cmNlPSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEp3ZkV1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDMtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA0T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZQM3VmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI2NCIgeT0iLTIxMiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA1T2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJUb1JvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDV1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Sb2xlIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA1ZWZYRWR1cUhvT0piVVJaUnciIHk9Ii0zOTciLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQNS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tTXVsdGlwbGljaXR5TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA2ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDZPZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTQ0IiB5PSItMjg5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDZ1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDdPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDYtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTEzMDAiIHk9IjIyMSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA3ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA3LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlA4T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA3dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOGVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJGcm9tUXVhbGlmaWVyTGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlA4LWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlF1YWxpZmllckNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MTGlzdENvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hKNlA5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0hKNlA4dWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZQOWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDIwOSI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UDktZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UC1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UDl1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50TGFiZWwiIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MkE3RDUzMDAxRTEiPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlAtLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21Db25zdHJhaW50Q29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEo2UF9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEo2UC11ZlhFZHVxSG9PSmJVUlpSdyIgeT0iMTA1OCIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hKNlAyLWZYRWR1cUhvT0piVVJaUnciIHJvdXRpbmc9IlJlY3RpbGluZWFyIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UDNPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTIyNjksIC01MCwgNTMwMCwgMF0kWy01OTA5LCAtNTAsIDE2NTksIDBdIi8+Ci0gICAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICAgIDxlZGdlcyB4bWk6aWQ9Il9ISjZRSnVmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRkRGODIwMTY2IiBzb3VyY2U9Il9ISjZRRnVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISjZQcHVmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUtlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZUxhYmVsIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISjZRSy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UUxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hKNlFLdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9ISjZRSi1mWEVkdXFIb09KYlVSWlJ3IiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJOb25lIi8+Ci0gICAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSEo2UUtPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbLTk1NiwgLTUyNCwgNDQyOCwgMjM3MF0kWy0zMTE1LCAtMTY4NCwgMjI2OSwgMTIxMF0iLz4KLSAgICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSEo2UUxlZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgICAgPHRhcmdldEFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFMdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEo2UVAtZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQ0NTY1QkIxMDE1RiIgc291cmNlPSJfSEo2UUwtZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEo2UHB1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFRdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEo2UVJPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hKNlFSZWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISjZRUS1mWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEo2UVFPZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hKNlFRZWZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWy0xNjE3LCAtNTI0LCA3NTc3LCAyMzcwXSRbLTY5MjUsIC0yMTg0LCAyMjY5LCA3MTFdIi8+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZUFuY2hvciB4bWk6dHlwZT0ibm90YXRpb246SWRlbnRpdHlBbmNob3IiIHhtaTppZD0iX0hKNlFSdWZYRWR1cUhvT0piVVJaUnciIGlkPSJhbmNob3I1MCIvPgotICAgICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ISjZRUi1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICAgIDwvY29udGVudHM+Ci0gICAgICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd0gycGVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDFGRUREQjYwMzA2Ij4KLSAgICAgICAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfR05rQjhPeFNFZHVPTnJNUmdtejQ4QSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDBGQiIvPgotICAgICAgICAgIDxwYWNrYWdlTWVyZ2UgeG1pOmlkPSJfUmNxZk1PeDBFZHU1LXZWamxmVnNmUSIgbWVyZ2VkUGFja2FnZT0iXzNBREM3Qjc0MDIyRDQxNTFFOTk2MDA5RCIvPgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFNzUwMDRFIiBuYW1lPSJNZXRob2RQbHVnaW4iPgotICAgICAgICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVFMEM1MDNBMSIgZ2VuZXJhbD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIvPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDFGRURFODAwMjUyIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRTBDOTAxOTQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxRkVEODgxMDFCNSIgbmFtZT0iTWV0aG9kVW5pdCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3SDJzLWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiPgotICAgICAgICAgICAgICA8Ym9keT5BIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L2JvZHk+Ci0gICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUZFRDg5MTAzQUQiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAyODAiLz4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNUIiIG5hbWU9ImF1dGhvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDNDQTAxMEIxMDNDMyI+Ci0gICAgICAgICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfR3dIMnQtZlhFZHVxSG9PSmJVUlpSdyIgYW5ub3RhdGVkRWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1QiI+Ci0gICAgICAgICAgICAgICAgPGJvZHk+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwvYm9keT4KLSAgICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iXzVkR05FZXlHRWR1NS12VmpsZlZzZlEiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iXzVkR05FT3lHRWR1NS12VmpsZlZzZlEiLz4KLSAgICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iXzVVVGRjT3lHRWR1NS12VmpsZlZzZlEiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiIHZhbHVlPSIiLz4KLSAgICAgICAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICAgICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDY0IiBuYW1lPSJjaGFuZ2VEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEY0NDk4RDAxODUiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5vdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNjQiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC9ib2R5PgotICAgICAgICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfVVotUThleU1FZHVGS0pvdkJMNjRYUSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfVVotUThPeU1FZHVGS0pvdkJMNjRYUSIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiPgotICAgICAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3Um5wZWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNkUiPgotICAgICAgICAgICAgICAgIDxib2R5PlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9OR2U1WWV5RkVkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9OR2U1WU95RkVkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9POVpYc095RkVkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA2RiIgbmFtZT0idmVyc2lvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIj4KLSAgICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucU9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDBGMzZDNUYwMDZGIj4KLSAgICAgICAgICAgICAgICA8Ym9keT5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L2JvZHk+Ci0gICAgICAgICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il9zV1RWOGV5R0VkdTUtdlZqbGZWc2ZRIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il9zV1RWOE95R0VkdTUtdlZqbGZWc2ZRIi8+Ci0gICAgICAgICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il9zTVU2a095R0VkdTUtdlZqbGZWc2ZRIiB0eXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQjEwM0MzIiB2YWx1ZT0iIi8+Ci0gICAgICAgICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTMwMDFFMSIgbmFtZT0iY29weXJpZ2h0U3RhdGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RTAxQzEiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3diWW9lZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IjEiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3diWW9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyNzk0N0U1MDE3OCIgbmFtZT0iQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgICAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0Mjc5NDgwMDAxQUUiIGdlbmVyYWw9Il8zQURDN0I3NDAyMkQ0MUZFRDg4MTAxQjUiLz4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMUUxIF8zQURDN0I3NDAyMkQ0MkE3RDUzMDAyMDkiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd1JucnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDJBN0Q1MkYwMjQzIj4KLSAgICAgICAgICAgICAgPGJvZHk+QSBNZXRob2QgVW5pdCBjYW4gaGF2ZSBleGFjdGx5IG9uZSBDb3B5cmlnaHQgU3RhdGVtZW50IHNlY3VyaW5nIHRoZSBpbnRlbGxlY3R1YWwgY2FwaXRhbCBpdCByZXByZXNlbnRzLiAgSXQgd2lsbCBiZSBwdWJsaXNoZWQgd2l0aCB0aGUgcmVzcGVjdGl2ZSBjb25jcmV0ZSBFbGVtZW50LiAgTm90ZSwgdGhhdCBDb3B5cmlnaHQgU3RhdGVtZW50cyBmb3IgTWV0aG9kIExpYnJhcmllcyBhbmQgTWV0aG9kIFBsdWdpbnMgZGVmaW5lIHRoZSBkZWZhdWx0IHN0YXRlbWVudCBmb3IgaXRzIGNvbnRhaW5lZCBlbGVtZW50cywgd2hpY2ggY2FuIGJlICdvdmVyd3JpdHRlbicgd2l0aCByZXZpc2VkIHN0YXRlbWVudHMgZm9yIGV2ZXJ5IENvbnRlbnQgRGVzY3JpcHRpb24gb3IgUHJvY2VzcyBDb21wb25lbnQuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDJBN0Q1MzAwMjA5IiBuYW1lPSJfbWV0aG9kVW5pdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfM0FEQzdCNzQwMjJENDFGRUQ4ODEwMUI1IiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQyQTdENTJGMDI0MyI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX25yRjhVZXlNRWR1RktKb3ZCTDY0WFEiIHZhbHVlPSIqIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX25yRjhVT3lNRWR1RktKb3ZCTDY0WFEiLz4KLSAgICAgICAgICAgIDwvb3duZWRFbmQ+Ci0gICAgICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UGFja2FnZSIgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDExOTk0QkYwMjgyIiBuYW1lPSJQcm9jZXNzRGlhZ3JhbXMiPgotICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3dVRsLWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxNTMzNjEyMDE1MSI+Ci0gICAgICAgICAgPGNvbnRlbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpEaWFncmFtIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzMzYxMjAxNTEiIHR5cGU9IkNsYXNzIiBuYW1lPSJNYWluIj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4d3VmWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MUY2NkIwMTU1Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh4ZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ISzh4eHVmWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eC1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eU9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4eWVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHh5dWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHktZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHh3LWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hLOHh4T2ZYRWR1cUhvT0piVVJaUnciIHg9IjE4MjAiIHk9IjM4NTIiIHdpZHRoPSI0OTU0IiBoZWlnaHQ9IjE3OTQiLz4KLSAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHpPZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQwRjM2QzVFMDI2MiI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ei1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJJbWFnZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246U2l6ZSIgeG1pOmlkPSJfSEs4eDBPZlhFZHVxSG9PSmJVUlpSdyIgd2lkdGg9IjEzMjAiIGhlaWdodD0iMTMyMCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDAtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4MU9mWEVkdXFIb09KYlVSWlJ3IiB2aXNpYmxlPSJmYWxzZSIgdHlwZT0iUGFja2FnZUNvbnRlbnRzIj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHgxZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiIGNvbGxhcHNlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZVN0eWxlIiB4bWk6aWQ9Il9ISzh4emVmWEVkdXFIb09KYlVSWlJ3IiBzaG93TGlzdFN0ZXJlb3R5cGU9Ik5vbmUiIHNob3dMaXN0VmlzaWJpbGl0eT0iTm9uZSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4enVmWEVkdXFIb09KYlVSWlJ3IiB4PSIyNjQxIiB5PSI3MzY2IiB3aWR0aD0iMzE0OSIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgxdWZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDJlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHgydWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgyLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgzT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHgzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eDN1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4My1mWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eDEtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eDJPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjU1NiIgeT0iNjY4IiB3aWR0aD0iMzUzMCIgaGVpZ2h0PSIxODYyIi8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHg0T2ZYRWR1cUhvT0piVVJaUnciIGVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MUUwRDBFRDAxMDQiPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWNPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iSW1hZ2VDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hMR2ljZWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIxMzIwIiBoZWlnaHQ9IjEzMjAiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2ljdWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2ljLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lkT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlBhcmVudCIvPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWRlZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlBhY2thZ2VDb250ZW50cyI+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ITEdpZHVmWEVkdXFIb09KYlVSWlJ3IiBjYW5vbmljYWw9ImZhbHNlIiBjb2xsYXBzZWQ9InRydWUiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eDRlZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJOb25lIiBzaG93TGlzdFZpc2liaWxpdHk9Ik5vbmUiIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eDR1ZlhFZHVxSG9PSmJVUlpSdyIgeD0iOTQ1NyIgeT0iMjAzMiIgd2lkdGg9IjMzMzUiIGhlaWdodD0iMTY3NiIvPgotICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZC1mWEVkdXFIb09KYlVSWlJ3IiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDFEREY4NjkwMTJFIj4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lldWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpTaXplIiB4bWk6aWQ9Il9ITEdpZS1mWEVkdXFIb09KYlVSWlJ3IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSIxMzIwIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZk9mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZmVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpZnVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lmLWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJQYWNrYWdlQ29udGVudHMiPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSExHaWdPZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIgY29sbGFwc2VkPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hMR2llT2ZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iTm9uZSIgc2hvd0xpc3RWaXNpYmlsaXR5PSJOb25lIiBsaW5lQ29sb3I9IjQxOTQzNjgiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2llZWZYRWR1cUhvT0piVVJaUnciIHg9IjQxMTQiIHk9IjEwODIwIiB3aWR0aD0iNDg3NiIgaGVpZ2h0PSIxNjc2Ii8+Ci0gICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd3VUbWVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVGhpcyBkaWFncmFtIHNob3dzIGhvdyB1bWEgZGlhZ3JhbXMgYXJlIGJhc2VkIG9uIHRoZSB1bWwyIGRpYWdyYW0gaW50ZXJjaGFuZ2UuICBUaGUgbWV0aG9kIG1vZGVsIHBhY2thZ2UgYWNjZXNzZXMgdGhlc2UgZGlhZ3JhbXMsIGJlY2F1c2UgdGhlIHByb2Nlc3MgcGFja2FnZXMgZGVmaW5lZCBpbiBtZXRob2QgbW9kZWxzIHBhY2thZ2UvY29udGFpbiB0aGUgZGlhZ3JhbXMuIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCB4c2k6bmlsPSJ0cnVlIi8+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSExHaWl1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTU3NzQwMDIzRCIgc291cmNlPSJfSEs4eHd1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSExHaWQtZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpamVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJLaW5kTGFiZWwiPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ITEdpai1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hMR2lrZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IktpbmQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSExHaWtPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0hMR2lqdWZYRWR1cUhvT0piVVJaUnciIHk9Ii0xODYiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MQ29ubmVjdG9yU3R5bGUiIHhtaTppZD0iX0hMR2lpLWZYRWR1cUhvT0piVVJaUnciIGxpbmVDb2xvcj0iNDE5NDM2OCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSExHaWpPZlhFZHVxSG9PSmJVUlpSdyIgcG9pbnRzPSJbOTQ4LCA4OTcsIC0xNDM5LCAtNjAxMV0kWzIzNjIsIDIxMjUsIC0yNSwgLTQ3ODNdJFsyMzcwLCA1NzU3LCAtMTYsIC0xMTUxXSIvPgotICAgICAgICAgICAgICA8c291cmNlQW5jaG9yIHhtaTp0eXBlPSJub3RhdGlvbjpJZGVudGl0eUFuY2hvciIgeG1pOmlkPSJfSExHaWt1ZlhFZHVxSG9PSmJVUlpSdyIgaWQ9ImFuY2hvcjUwIi8+Ci0gICAgICAgICAgICAgIDx0YXJnZXRBbmNob3IgeG1pOnR5cGU9Im5vdGF0aW9uOklkZW50aXR5QW5jaG9yIiB4bWk6aWQ9Il9ITEdpay1mWEVkdXFIb09KYlVSWlJ3IiBpZD0iYW5jaG9yNTAiLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfU2F2WWtlb2xFZHVWQTd2dDVxYklKUSIgZWxlbWVudD0iX1NhdllrT29sRWR1VkE3dnQ1cWJJSlEiIHNvdXJjZT0iX0hLOHgxdWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLOHg0T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2F2WWxPb2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfU2F2WWx1b2xFZHVWQTd2dDVxYklKUSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9TYXZZbU9vbEVkdVZBN3Z0NXFiSUpRIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX1NhdllsLW9sRWR1VkE3dnQ1cWJJSlEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9TYXZZbGVvbEVkdVZBN3Z0NXFiSUpRIiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il9TYXZZa3VvbEVkdVZBN3Z0NXFiSUpRIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX1NhdllrLW9sRWR1VkE3dnQ1cWJJSlEiIHBvaW50cz0iWzY4LCAxOCwgLTE4OSwgLTMwXSRbMjIyLCA4MSwgLTM1LCAzM10iLz4KLSAgICAgICAgICAgIDwvZWRnZXM+Ci0gICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfeWxEM3NPeFpFZHVPTnJNUmdtejQ4QSIgZWxlbWVudD0iX3lrdzh3T3haRWR1T05yTVJnbXo0OEEiIHNvdXJjZT0iX0hLOHh3dWZYRWR1cUhvT0piVVJaUnciIHRhcmdldD0iX0hLOHh6T2ZYRWR1cUhvT0piVVJaUnciPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeWxEM3MteFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZExhYmVsIj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfeWxEM3RleFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il95bEQzdC14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJLaW5kIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX3lsRDN0dXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il95bEQzdE94WkVkdU9Ock1SZ216NDhBIiB5PSIxMzQ5Ii8+Ci0gICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTENvbm5lY3RvclN0eWxlIiB4bWk6aWQ9Il95bEQzc2V4WkVkdU9Ock1SZ216NDhBIiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX3lsRDNzdXhaRWR1T05yTVJnbXo0OEEiIHBvaW50cz0iWzIsIDM1LCA1LCAtOTZdJFsxOCwgMTYzLCAyMSwgMzJdIi8+Ci0gICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPGVkZ2VzIHhtaTppZD0iXzJEMXJzZXhaRWR1T05yTVJnbXo0OEEiIGVsZW1lbnQ9Il8yRDFyc094WkVkdU9Ock1SZ216NDhBIiBzb3VyY2U9Il9ISzh4MXVmWEVkdXFIb09KYlVSWlJ3IiB0YXJnZXQ9Il9ISzh4d3VmWEVkdXFIb09KYlVSWlJ3Ij4KLSAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJEMXJ0T3haRWR1T05yTVJnbXo0OEEiIHR5cGU9IktpbmRMYWJlbCI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iXzJEMXJ0dXhaRWR1T05yTVJnbXo0OEEiIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfMkQxcnVPeFpFZHVPTnJNUmdtejQ4QSIgdHlwZT0iS2luZCIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il8yRDFydC14WkVkdU9Ock1SZ216NDhBIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfMkQxcnRleFpFZHVPTnJNUmdtejQ4QSIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfMkQxcnN1eFpFZHVPTnJNUmdtejQ4QSIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iVGV4dCIvPgotICAgICAgICAgICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il8yRDFycy14WkVkdU9Ock1SZ216NDhBIiBwb2ludHM9Ils3LCAzNiwgOCwgLTgzXSRbOTMsIDExNiwgOTQsIC0zXSIvPgotICAgICAgICAgICAgPC9lZGdlcz4KLSAgICAgICAgICA8L2NvbnRlbnRzPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd2JZcnVmWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDExOTk0QkYwMjgyIj4KLSAgICAgICAgICA8Ym9keT4wNTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQYWNrYWdlIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiIG5hbWU9IlVNQURpYWdyYW1zIj4KLSAgICAgICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0d3dVRsT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0idW1sMi5kaWFncmFtcyIgcmVmZXJlbmNlcz0iXzNBREM3Qjc0MDIyRDQxNTFFOUUzMDFCOCI+Ci0gICAgICAgICAgICA8Y29udGVudHMgeG1pOnR5cGU9Im5vdGF0aW9uOkRpYWdyYW0iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTFFOUUzMDFCOCIgdHlwZT0iQ2xhc3MiIG5hbWU9Ik1haW4iPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGR1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMwRTM0MDE1NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhlZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHhldWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSI0MjUwIiBoZWlnaHQ9IjEwNDkiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4ZS1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJTdGVyZW90eXBlIi8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhmT2ZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGZlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUGFyZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhmdWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJBdHRyaWJ1dGVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhnT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJPcGVyYXRpb25Db21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGdlZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhndWZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTaWduYWxDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGctZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhoT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJTdHJ1Y3R1cmVDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxTaGFwZUNvbXBhcnRtZW50U3R5bGUiIHhtaTppZD0iX0hLOHhoZWZYRWR1cUhvT0piVVJaUnciIGNhbm9uaWNhbD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlU3R5bGUiIHhtaTppZD0iX0hLOHhkLWZYRWR1cUhvT0piVVJaUnciIHNob3dMaXN0U3RlcmVvdHlwZT0iVGV4dCIgc2hvd0xpc3RWaXNpYmlsaXR5PSJUZXh0IiBsaW5lQ29sb3I9IjAiIHNob3dTdGVyZW90eXBlPSJUZXh0Ii8+Ci0gICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSEs4eGVPZlhFZHVxSG9PSmJVUlpSdyIgeD0iMjIxOSIgeT0iMzgwNCIvPgotICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGh1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxRTFGQUYxMDM3NiI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhpZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkltYWdlQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOlNpemUiIHhtaTppZD0iX0hLOHhpdWZYRWR1cUhvT0piVVJaUnciIHdpZHRoPSIzMDY0IiBoZWlnaHQ9IjkwNSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhpLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlN0ZXJlb3R5cGUiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGpPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iTmFtZSIvPgotICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4amVmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJQYXJlbnQiLz4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGp1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IkF0dHJpYnV0ZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4ai1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGtPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9Ik9wZXJhdGlvbkNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4a2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGt1ZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlNpZ25hbENvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4ay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eGxPZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlN0cnVjdHVyZUNvbXBhcnRtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTFNoYXBlQ29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eGxlZlhFZHVxSG9PSmJVUlpSdyIgY2Fub25pY2FsPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MU2hhcGVTdHlsZSIgeG1pOmlkPSJfSEs4eGgtZlhFZHVxSG9PSmJVUlpSdyIgc2hvd0xpc3RTdGVyZW90eXBlPSJUZXh0IiBzaG93TGlzdFZpc2liaWxpdHk9IlRleHQiIGxpbmVDb2xvcj0iMCIgc2hvd1N0ZXJlb3R5cGU9IlRleHQiLz4KLSAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4aU9mWEVkdXFIb09KYlVSWlJ3IiB4PSIxNTg1IiB5PSI5NTEiLz4KLSAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgPHN0eWxlcyB4bWk6dHlwZT0idW1sbm90YXRpb246VU1MRGlhZ3JhbVN0eWxlIiB4bWk6aWQ9Il9Hd3VUbHVmWEVkdXFIb09KYlVSWlJ3IiBkZXNjcmlwdGlvbj0iVU1BIHN1cHBvcnRzIHRocmVlIHR5cGVzIG9mIGRpYWdyYW1zLiBIb3dldmVyLCB0aGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgZGVmaW5lIHRoZSBzeW50YXggb2YgdGhlc2UgZGlhZ3JhbXMsIGJ1dCByYXRoZXIgcmVsaWVzIG9uIGEgdG9vbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGV4YWN0IHByZXNlbnRhdGlvbiBvZiB0aGUgdGhyZWUgZGlhZ3JhbXMuICBVdGlsemluZyB0aGUgVU1MMiBEaWFncmFtIEludGVyY2hhbmdlIHNwZWNpZmljYXRpb24gdGhpcyBzcGVjaWZpY2F0aW9uIHByb3ZpZGVzIGFsbCBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCBhbmQgcGVyc2lzdCB0aGVzZSBkaWFncmFtcy4iLz4KLSAgICAgICAgICAgICAgPGVsZW1lbnQgeHNpOm5pbD0idHJ1ZSIvPgotICAgICAgICAgICAgICA8ZWRnZXMgeG1pOmlkPSJfSEs4eGx1ZlhFZHVxSG9PSmJVUlpSdyIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSIgc291cmNlPSJfSEs4eGh1ZlhFZHVxSG9PSmJVUlpSdyIgdGFyZ2V0PSJfSEs4eGR1ZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhtZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9Ik5hbWVMYWJlbCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG0tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iU3RlcmVvdHlwZSIvPgotICAgICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhuT2ZYRWR1cUhvT0piVVJaUnciIHZpc2libGU9ImZhbHNlIiB0eXBlPSJOYW1lIi8+Ci0gICAgICAgICAgICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9ISzh4bXVmWEVkdXFIb09KYlVSWlJ3IiB5PSItMTg2Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG5lZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG4tZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9NdWx0aXBsaWNpdHkiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eG51ZlhFZHVxSG9PSmJVUlpSdyIgeD0iMTg3IiB5PSItMzM5Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eG9PZlhFZHVxSG9PSmJVUlpSdyIgdmlzaWJsZT0iZmFsc2UiIHR5cGU9IlRvUm9sZUxhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4b3VmWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb1JvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eG9lZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTM5NyIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhvLWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21NdWx0aXBsaWNpdHlMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHBlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbU11bHRpcGxpY2l0eSIvPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4cE9mWEVkdXFIb09KYlVSWlJ3IiB4PSItMjI5IiB5PSItMjU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHB1ZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGVMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHFPZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbVJvbGUiLz4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHAtZlhFZHVxSG9PSmJVUlpSdyIgeD0iLTI0MCIgeT0iOTAzIi8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHFlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iVG9RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBRCI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHEtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHF1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhyZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IkZyb21RdWFsaWZpZXJMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHItZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iUXVhbGlmaWVyQ29tcGFydG1lbnQiPgotICAgICAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxMaXN0Q29tcGFydG1lbnRTdHlsZSIgeG1pOmlkPSJfSEs4eHNPZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpMb2NhdGlvbiIgeG1pOmlkPSJfSEs4eHJ1ZlhFZHVxSG9PSmJVUlpSdyIgeT0iLTE4NiIvPgotICAgICAgICAgICAgICAgIDwvY2hpbGRyZW4+Ci0gICAgICAgICAgICAgICAgPGNoaWxkcmVuIHhtaTppZD0iX0hLOHhzZWZYRWR1cUhvT0piVVJaUnciIHR5cGU9IlRvQ29uc3RyYWludExhYmVsIiBlbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIj4KLSAgICAgICAgICAgICAgICAgIDxjaGlsZHJlbiB4bWk6aWQ9Il9ISzh4cy1mWEVkdXFIb09KYlVSWlJ3IiB0eXBlPSJUb0NvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4dE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4c3VmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHRlZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRMYWJlbCIgZWxlbWVudD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDNBMyI+Ci0gICAgICAgICAgICAgICAgICA8Y2hpbGRyZW4geG1pOmlkPSJfSEs4eHQtZlhFZHVxSG9PSmJVUlpSdyIgdHlwZT0iRnJvbUNvbnN0cmFpbnRDb21wYXJ0bWVudCI+Ci0gICAgICAgICAgICAgICAgICAgIDxzdHlsZXMgeG1pOnR5cGU9InVtbG5vdGF0aW9uOlVNTExpc3RDb21wYXJ0bWVudFN0eWxlIiB4bWk6aWQ9Il9ISzh4dU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gICAgICAgICAgICAgICAgICA8L2NoaWxkcmVuPgotICAgICAgICAgICAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9ISzh4dHVmWEVkdXFIb09KYlVSWlJ3IiB5PSIxMDU4Ii8+Ci0gICAgICAgICAgICAgICAgPC9jaGlsZHJlbj4KLSAgICAgICAgICAgICAgICA8c3R5bGVzIHhtaTp0eXBlPSJ1bWxub3RhdGlvbjpVTUxDb25uZWN0b3JTdHlsZSIgeG1pOmlkPSJfSEs4eGwtZlhFZHVxSG9PSmJVUlpSdyIgbGluZUNvbG9yPSIwIiBzaG93U3RlcmVvdHlwZT0iTm9uZSIvPgotICAgICAgICAgICAgICAgIDxiZW5kcG9pbnRzIHhtaTp0eXBlPSJub3RhdGlvbjpSZWxhdGl2ZUJlbmRwb2ludHMiIHhtaTppZD0iX0hLOHhtT2ZYRWR1cUhvT0piVVJaUnciIHBvaW50cz0iWzAsIDQ0OCwgMCwgLTMxMDddJFswLCAzMDIyLCAwLCAtNTMzXSIvPgotICAgICAgICAgICAgICA8L2VkZ2VzPgotICAgICAgICAgICAgPC9jb250ZW50cz4KLSAgICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX0d3YllzdWZYRWR1cUhvT0piVVJaUnciIGFubm90YXRlZEVsZW1lbnQ9Il8zQURDN0I3NDAyMkQ0MTUxRTk5NjAwOUQiPgotICAgICAgICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il9TYXZZa09vbEVkdVZBN3Z0NXFiSUpRIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDFFMEQwRUQwMTA0Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VNZXJnZSB4bWk6aWQ9Il8yRDFyc094WkVkdU9Ock1SZ216NDhBIiBtZXJnZWRQYWNrYWdlPSJfM0FEQzdCNzQwMjJENDE1MUY2NkIwMTU1Ii8+Ci0gICAgICAgICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MUUxRkFGMTAzNzYiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLSAgICAgICAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQTMiIG5hbWU9ImRpYWdyYW1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il8zQURDN0I3NDAyMkQ0MTUzMEUzNDAxNTYiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwMUVBIj4KLSAgICAgICAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfR3d1VGtPZlhFZHVxSG9PSmJVUlpSdyIgdmFsdWU9IioiLz4KLSAgICAgICAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfR3draW4tZlhFZHVxSG9PSmJVUlpSdyIvPgotICAgICAgICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgICAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSIgbWVtYmVyRW5kPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0EzIF8zQURDN0I3NDAyMkQ0MTUzM0RFNzAzQUQiPgotICAgICAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il9Hd2tpbk9mWEVkdXFIb09KYlVSWlJ3IiBhbm5vdGF0ZWRFbGVtZW50PSJfM0FEQzdCNzQwMjJENDE1MzNERTcwMUVBIj4KLSAgICAgICAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB0aGUgb25seSBtZW1iZXIgb2YgdGhlIHVtYWRpYWdyYW1zIHBhY2thZ2UuICBJdCBkZWZpbmVzIHRoYXQgRGlhZ3JhbXMgY2FuIGJlIHBhY2thZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuPC9ib2R5PgotICAgICAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgICAgICA8b3duZWRFbmQgeG1pOmlkPSJfM0FEQzdCNzQwMjJENDE1MzNERTcwM0FEIiBuYW1lPSJfcHJvY2Vzc1BhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iXzNBREM3Qjc0MDIyRDQxRTFGQUYxMDM3NiIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iXzNBREM3Qjc0MDIyRDQxNTMzREU3MDFFQSI+Ci0gICAgICAgICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX0d3dVRrLWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX0d3dVRrdWZYRWR1cUhvT0piVVJaUnciIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICA8L293bmVkRW5kPgotICAgICAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgICAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2RwbWtlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dkelhrT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfeXpVNThZaW5FZHF0dmJuZkIyTF81dyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9TdGFuZGFyZC5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2R6WGtlZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dkelhrdWZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfYV9TM3dOV0xFZGl5NElxUDh3aGpGQT9EZWZhdWx0PyIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfR2R6WGstZlhFZHVxSG9PSmJVUlpSdyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX0dkelhsT2ZYRWR1cUhvT0piVVJaUnciIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlcGxveW1lbnQuZXB4I19JcmRBVU1tQkVkcUJjTjFSNkV2V1V3P0RlcGxveW1lbnQvRGVwbG95bWVudD8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfdmpidXdPdkhFZGlEWDViamkwaVZTQT9EZXBsb3ltZW50PyIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICAgIDxwcm9maWxlQXBwbGljYXRpb24geG1pOmlkPSJfZ3FPUW9BQjJFZHVlcS1WaUxZaWV5USI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX2dxT1FvUUIyRWR1ZXEtVmlMWWlleVEiIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyLzIuMC4wL1VNTCI+Ci0gICAgICAgIDxyZWZlcmVuY2VzIHhtaTp0eXBlPSJlY29yZTpFUGFja2FnZSIgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfdnktSFVZaW5FZHF0dmJuZkIyTF81dyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8YXBwbGllZFByb2ZpbGUgaHJlZj0icGF0aG1hcDovL1VNTF9QUk9GSUxFUy9FY29yZS5wcm9maWxlLnVtbCNfMCIvPgotICAgIDwvcHJvZmlsZUFwcGxpY2F0aW9uPgotICA8L3VtbDpNb2RlbD4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaE9mQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaEV1QXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2hZUUFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2hPZkF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0docks4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doaFo5T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaDBVNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaHJLLXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2gwVTVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gwVTVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0doLUY0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0doMFU2T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaC1GNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaC1GNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lIMjRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2gtRjUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpSDI1T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpSDI0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaUgyNS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaUgyNXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lSQTB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lSQTBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpUkExZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpUkExT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWF4ME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaVJBMS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lheDAtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lheDB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpYXgxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpYXgxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaWtpME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWF4MnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2lraTFPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2lraTAtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpa2kxLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpa2kxdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaXRzd09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaWtpMmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2l0c3ctZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2l0c3d1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpdHN4LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaTNkdy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaTNkd3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2kzZHlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2kzZHgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dpM2R6T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dpM2R5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HakFuc3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFuc2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pBbnVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pBbnQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqQW52T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqQW51LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HaktZc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HakFud09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pLWXRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pLWXMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqS1l0LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqS1l0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HalVKc09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HaktZdWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVG9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pVSnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqZFRwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRvLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HamRUcU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HamRUcC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2pkVHJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2pkVHEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dqbkVvT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dqZFRyLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ham5FcE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ham5Fby1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tEd2tPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2o1X2xPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drRHdtZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drRHdtT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha0R3b3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha0R3b2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tNNmdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tEd3F1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drTTZpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drTTZpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha002a3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha002a2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tXcmdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tNNm11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drV3JpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drV3JpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha1dya3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha1dya2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2tnY2dPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tXcm11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drZ2NpZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drZ2NpT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha2dja3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha2dja2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2twbWNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2tnY211ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drcG1lZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drcG1lT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Ha3BtZ3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3BtZ2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2t6WGNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2twbWl1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0drelhnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0drelhmLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HazlJY09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Ha3pYaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2s5SWVlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2s5SWVPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsaS1XZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbHN2V09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2Vi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xzdlhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xzdlctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsc3ZZT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsc3ZYLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbDE1UU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbHN2WS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2wxNVJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2wxNVEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsMTVTT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsMTVSLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbF9xUU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbDE1VGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR2xfcVJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR2xfcVEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dsX3FUZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dsX3FUT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbUpiUU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbF9xVmVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21KYlItZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21KYlJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtSmJVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtSmJULWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbVNsTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbUpiV09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21TbE9lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21TbE9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtU2xRdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtU2xRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWNXTU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbVNsVWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21jV09lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21jV09PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtY1dRdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtY1dRZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbWxnSU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbWNXU3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR21sZ0tlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR21sZ0tPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dtbGdNdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtbGdNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbTVDSk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbTVDSS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR201Q0x1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR201Q0xlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01FT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dtNUNNZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbkNNRk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNRS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25DTUdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25DTUYtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duQ01IT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duQ01HLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbkw5RU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbkNNSk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25MOUdlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25MOUdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duTDlJdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duTDlJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HblZ1RU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbkw5S3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR25WdUdlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25WdUdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duZTRELWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duZTREdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbm9wQU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbmU0Ry1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eThPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR25vcEJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dueHk4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHk4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hbnh5OXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hbnh5OWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR254eS0tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR254eS11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2o4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dueHlfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqOC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR243ajl1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR243ajllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0duN2otZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0duN2otT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbjdqX09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbjdqLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29GVTlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVTgtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvRlU5LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvRlU5dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb0ZVX09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb0ZVLS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29PZTRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29GVV91ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvWVA0ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVA0T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb1lQOC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb1lQOHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ZUC11ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ZUC1lZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvWVBfdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb2lBNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29pQTZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29pQTUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvaUE2LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvaUE2dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLME9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb2lBN2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzAtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzB1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvcksxdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcksxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hb3JLMmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hb3JLMk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR29ySzMtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR29ySzN1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDcwT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvcks0dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HbzA3MU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HbzA3MC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28wNzJlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28wNzJPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvMDczdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvMDczZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hby1GeE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hby1Gdy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR28tRnplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR28tRnpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dvLUYxdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dvLUYxZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcEgyeWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcEgyeU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbndPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BIMnktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwUm54LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm54dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcFJueS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcFJueXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BSbnotZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BSbnp1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXhzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwUm4wdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4dE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4cy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BheHVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHQtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwYXh2T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwYXh1LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGF4d09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGF4di1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BheHctZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwa2l0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2lzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcGtpdU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcGtpdC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3BraXZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3BraXUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVRzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwa2l2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcHVUdE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcHVUcy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3B1VHZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3B1VHUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwdVR3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwdVR2LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcDNkb3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkb2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3AzZHEtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3AzZHF1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dwM2R0T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dwM2RzLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUJPb09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcDNkdk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FCT3FlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FCT3FPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxQk9zdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxQk9zZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcUtZa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUJPdXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FLWW1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FLWW1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxS1lvdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxS1lvZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcVVKa09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcUtZcU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FVSm1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FVSm1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVnT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxZDZrLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FaU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5FaC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3FuRWpPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3FuRWktZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxbkVrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxbkVqLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcW5FbE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcW5Fay1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWdlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWdPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxdzFoZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFoT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcXcxaWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcXcxaU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3F3MWplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3F3MWpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1nT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxdzFrT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcTZtaE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcTZtZy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3E2bWplZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3E2bWpPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dxNm1sdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dxNm1sZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HckR3Yy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HckR3Y3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JOaGNPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JEd2UtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyTmhlZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyTmhlT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcldyWS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcldyWXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JXcmJPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JXcmEtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyV3JkZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyV3JkT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcmdjWi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcmdjWnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3JxTll1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTlllZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dycU5hT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dycU5aLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnFOYk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnFOYS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFVPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3JxTmJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyelhVLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhVdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcnpYVi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcnpYVnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3J6WFctZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3J6WFd1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlVT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyelhYZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HcjlJVk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJVS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3I5SVYtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3I5SVZ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dyOUlXdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dyOUlXZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1VU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HcjlJWGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NHNVUtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NHNVV1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzRzVXT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzRzVWLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc0c1WHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc0c1WGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NRRFJ1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NRRFJlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzUURULWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzUURUdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc1FEV09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc1FEVi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NaMFR1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NaMFRlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1NT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzWjBWT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc2ktTk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktTS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NpLU9lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NpLU9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzaS1QZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzaS1QT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2TU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc2ktUU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Nzdk5PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Nzdk0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzc3ZPT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzc3ZOLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc3N2UE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc3N2Ty1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ01PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NzdlFPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzMmdOT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzMmdNLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HczJnUGVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HczJnUE9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3MyZ1J1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3MyZ1JlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0dzX3FJdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0dzX3FJZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hc19xSy1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hc19xS3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3NfcU5PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3NfcU0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0SmJJZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJJT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdEpiS3VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdEpiS2VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RKYk0tZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RKYk11ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0VE1JT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0SmJPLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdFRNSi1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdFRNSnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RUTUx1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RUTUxlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0bUhGT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhFLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdG1ISE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdG1IRy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3RtSEllZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3RtSElPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0dlJBT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0bUhKT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdHZSQk9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdHZSQS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3R2UkRlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3R2UkRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d0NUNBT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d0dlJGZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdDVDRHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdDVDRGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3Q1Q0dlZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3Q1Q0dPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pBdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pBZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUN6Q2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6Q09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VDekRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VDekMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1Q3pFZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1Q3pFT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4OE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUN6RS1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VMODgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMODh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1TDgtT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1TDg5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdUw4LS1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdUw4LXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdDhPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VMOF8tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnQ4LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnQ4dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdVZ0OXVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ0OWVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VWdC1lZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VWdC1PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1VnRfdWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1VnRfZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlOE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdVZ1QXVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZTgtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZTh1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1ZmU5dWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1ZmU5ZWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdWZlLWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdWZlLU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VmZV9PZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VmZS0tZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b280ZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b280T2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdW9vNU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3VvbzZPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3VvbzUtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d1b282LWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d1b282dWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdXlaNE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdW9vNy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZZUHdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZQRjJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2WVB6T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2WVB5LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdllQM2VmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdllQM09mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXdPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZZUDRPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2aUF4T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUF3LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdmlBeU9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdmlBeC1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZpQXp1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZpQXplZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2cnh3T2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2aUExdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdnJ4eWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdnJ4eU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3ZyeDB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3ZyeDBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2MDdzT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2cngyT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdjA3dC1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdjA3dHVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3YwN3dPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3YwN3YtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d2LXNzLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d2LXNzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd0gycHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd0gycGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dIMnRPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dIMnMtZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5vT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3SDJ0LWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1Juby1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1Jub3VmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3dSbnB1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3dSbnBlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3Um5xZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3Um5xT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd1Juci1mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd1JucnVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3diWXItZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3diWXJ1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3a2lrT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3YllzdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9Hd2tpbmVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9Hd2tpbk9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3c0RWtPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3d1VG9PZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d3NEVrLWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d3NEVrdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HdzRFbHVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HdzRFbGVmWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hCT2d1ZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hCT2dlZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJjT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4ZDZkdWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZE9mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yYy1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3hucmQtZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmR1ZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4bnJmT2ZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4bnJlLWZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeG5yZ09mWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeG5yZi1mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfR3h3MVlPZlhFZHVxSG9PSmJVUlpSdyIgYmFzZV9Db21tZW50PSJfR3hucmhPZlhFZHVxSG9PSmJVUlpSdyIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX0d4dzFaZWZYRWR1cUhvT0piVVJaUnciIGJhc2VfQ29tbWVudD0iX0d4dzFaT2ZYRWR1cUhvT0piVVJaUnciLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9HeDZtWWVmWEVkdXFIb09KYlVSWlJ3IiBiYXNlX0NvbW1lbnQ9Il9HeDZtWU9mWEVkdXFIb09KYlVSWlJ3Ii8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfNUdjWUNlaWVFZHVRYnVZNlV3TVNRZyIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Cb29sZWFuIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il81R2NZQU9pZUVkdVFidVk2VXdNU1FnIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfNUdjWURlaWVFZHVRYnVZNlV3TVNRZyIgYmFzZV9Db21tZW50PSJfNUdjWUFlaWVFZHVRYnVZNlV3TVNRZyIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0Jhc3RNT2lmRWR1UWJ1WTZVd01TUWciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzQ0EwMTBCMTAzQzMiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il9pN0ZUb2VpZkVkdVFidVk2VXdNU1FnIiBiYXNlX0NvbW1lbnQ9Il9pN0ZUb09pZkVkdVFidVk2VXdNU1FnIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfV2UtUWtPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImludCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0NBMDEwQTQwMDdCIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfZFVjNm9lb0ZFZHVPQlBRQTJoS3FVUSIgYmFzZV9Db21tZW50PSJfZFVjNm9Pb0ZFZHVPQlBRQTJoS3FVUSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3YxbklzT29GRWR1T0JQUUEyaEtxVVEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJENDBGNDQ5OEQwMTg1Ii8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfN2dIQThPb0ZFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5MaXN0IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il8zQURDN0I3NDAyMkQzRjA5ODk5QzAwRUEiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il9BR19GY09vR0VkdU9CUFFBMmhLcVVRIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJEM0YwOTg5QjkwMjkwIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfRUlkVzBPb0dFZHVPQlBRQTJoS3FVUSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfM0FEQzdCNzQwMjJENDExM0VBMjkwMkZFIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX29naUdvT29IRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjM2QzVGMDA1MCIgaXNJRD0idHJ1ZSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il81MlRmb09vSEVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MEYzNkM1RjAwNDciLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfSkFJQm9Pb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDI3QThBMUYwMkYzIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX0xSYUh3T29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQwRjlBQjk4MDJCOSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9OY2JOME9vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0NTVFNjVDODAyMTgiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfUEZuWk1Pb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDFERjMyMTkwMDI5Ii8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX1JXVENZT29NRWR1T0JQUUEyaEtxVVEiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iXzNBREM3Qjc0MDIyRDQyNzk2MjVEMDIzNCIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il9VRFMwSU9vTUVkdU9CUFFBMmhLcVVRIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il8zQURDN0I3NDAyMkQ0MjFFNERGMzAwM0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfcHd2WUFPb01FZHVPQlBRQTJoS3FVUSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDFEREZDOEUwMEI2Ii8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3A2eDJFT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDI3OTYyRDQwMjAzIi8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iXzFxWHBzT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY2Ii8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iXzRaLURnT29TRWR1T0JQUUEyaEtxVVEiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfM0FEQzdCNzQwMjJENDBGMzZDOTMwMEY4Ii8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfUDRvc1llb2VFZHVWQTd2dDVxYklKUSIgYmFzZV9Db21tZW50PSJfUDRvc1lPb2VFZHVWQTd2dDVxYklKUSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX0NFSUhrT3gzRWR1NS12VmpsZlZzZlEiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRG91YmxlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il9BVXE4SU94M0VkdTUtdlZqbGZWc2ZRIi8+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC40L3VtYS5lY29yZSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI4MzY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsMTIzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVjb3JlOkVQYWNrYWdlIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBuYW1lPSJ1bWEiCi0gICAgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5lcGYudW1hIj4KLSAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IjAzIi8+Ci0gIDwvZUFubm90YXRpb25zPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRhdGUiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuRGF0ZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVyaSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubmV0LlVSSSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlVubGltaXRlZE5hdHVyYWwiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2V0IiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLlNldCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IlNlcXVlbmNlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJJbnRlZ2VyIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iRmxvYXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuRmxvYXQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUeXBlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTmFtZWRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LiAgRGVmaW5lZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGEgbmFtZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZXNwYWNlICMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVzcGFjZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kRWxlbWVudFByb3BlcnR5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHByZXNzZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnN0cmFpbnQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYm9keSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmVzIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hEOyYjeEE7Q29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZXJtRGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVybURlZmluaXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEQ7JiN4QTtUaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UgKHNlZSBTZWN0aW9uIDQuMS40KS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgZVR5cGU9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBlVHlwZT0iIy8vVXJpIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub2RlaWNvbiIgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZSB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iS2V5IENvbnNpZGVyYXRpb25zIHByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJTZWN0aW9ucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZGVjZXNzb3IiIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEQ7JiN4QTtBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIGNoYW5nZWFibGU9ImZhbHNlIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEQ7JiN4QTtBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVwb3J0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmVwb3J0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRlbXBsYXRlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVtcGxhdGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hEOyYjeEE7QSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gJiN4RDsmI3hBO0EgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uICYjeEQ7JiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZEJ5IiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU3RlcCIgY2hhbmdlYWJsZT0iZmFsc2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiCi0gICAgICAgIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBEZWZpbml0aW9uIGlzIGFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuJiN4RDsmI3hBO1dvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iIy8vQ29uc3RyYWludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9IiMvL0NvbnN0cmFpbnQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0ZXAiIGVTdXBlclR5cGVzPSIjLy9TZWN0aW9uICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFN0ZXAgaXMgYSBTZWN0aW9uIGFuZCBXb3JrIERlZmluaXRpb24gdGhhdCBpcyB1c2VkIHRvIG9yZ2FuaXplIFRhc2tzIGludG8gcGFydHMgb3Igc3VidW5pdHMgb2Ygd29yay4gIFN0ZXBzIGluaGVyaXQgdGhlIHN1YlNlY3Rpb25zIGRlY29tcG9zaXRpb24gZnJvbSBTZWN0aW9uIGFuZCBjYW4gdGhlcmVmb3JlIGRlc2NyaWJlIFN1Yi1TdGVwcyBuZXN0ZWQgaW50byBTdGVwcy4mI3hEOyYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFydGlmYWN0IGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVyQXJ0aWZhY3QiIGVUeXBlPSIjLy9BcnRpZmFjdCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXVzZWRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGlsZFBhY2thZ2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50UGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFBhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29udGVudCBQYWNrYWdlIGlzIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RhdGlvbiIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RPZk5vdEhhdmluZyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3lub255bXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudHMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYWNrZ3JvdW5kIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3NpdGlvbiIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGluayIgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2dyYXBoRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3JhZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VtYW50aWNNb2RlbCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1Zpc2libGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWZlcmVuY2UiIGVPcHBvc2l0ZT0iIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydHkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb3BlcnR5IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtTGluayIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iem9vbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvbGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRGlhZ3JhbSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVkZ2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0dyYXBoRWRnZSIgZU9wcG9zaXRlPSIjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlbWFudGljTW9kZWxCcmlkZ2UiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L3NlbWFudGljTW9kZWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbSIgZVR5cGU9IiMvL0RpYWdyYW0iCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJoZWlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVmZXJlbmNlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5IiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaEVkZ2UiIGVTdXBlclR5cGVzPSIjLy9HcmFwaEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhbmNob3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIyIiB1cHBlckJvdW5kPSIyIiBlVHlwZT0iIy8vR3JhcGhDb25uZWN0b3IiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndheXBvaW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjIiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUG9pbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW0iIGVTdXBlclR5cGVzPSIjLy9HcmFwaE5vZGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZpZXdwb2ludCIgZVR5cGU9IiMvL1BvaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtTGluayIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlhZ3JhbUxpbmsiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lc3BhY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgZVR5cGU9IiMvL0RpbWVuc2lvbiIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZUluZm8iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkxlYWZFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGV4dEVsZW1lbnQiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRleHQiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBlVHlwZT0iIy8vVXJpIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbWVUeXBlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhpY1ByaW1pdGl2ZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9MZWFmRWxlbWVudCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvbHlsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhpY1ByaW1pdGl2ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsb3NlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYWRpdXNYIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRG91YmxlT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJhZGl1c1kiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VEb3VibGVPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlbmRBbmdsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRURvdWJsZU9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIGVUeXBlPSIjLy9Qb2ludCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWN0aXZpdHkiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hEOyYjeEE7QWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1JlcGVhdGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09uZ29pbmciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibGlua1RvUHJlZGVjZXNzb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtPcmRlciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWZpeCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4RDsmI3hBOyYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VCb29sZWFuT2JqZWN0IgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgZVR5cGU9IiMvL0JyZWFrZG93bkVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGxhbm5pbmdEYXRhIiBlVHlwZT0iIy8vUGxhbm5pbmdEYXRhIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJdGVyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSXRlcmF0aW9uIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQaGFzZSBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLiYjeEQ7JiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVhbVByb2ZpbGUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuJiN4RDsmI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hEOyYjeEE7SGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVhbVByb2ZpbGUiIGVPcHBvc2l0ZT0iIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGVEZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJSb2xlIiBlVHlwZT0iIy8vUm9sZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjaGFuZ2VhYmxlPSJmYWxzZSIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9TdGFydCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZmluaXNoVG9GaW5pc2giIHZhbHVlPSIxIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgJiN4RDsmI3hBOyhOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKSYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4RDsmI3hBO1Byb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSIjLy9EYXRlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZmluaXNoRGF0ZSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgZVR5cGU9IiMvL0ludGVnZXIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuJiN4RDsmI3hBO0Rlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FQm9vbGVhbk9iamVjdCIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgJiN4RDsmI3hBO0ZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLiYjeEQ7JiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtQcm9kdWN0IiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hEOyYjeEE7QSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uJiN4RDsmI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJUYXNrIiBlVHlwZT0iIy8vVGFzayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXNzaXN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hbmRhdG9yeUlucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBlcmZvcm1lZFByaW1hcmlseUJ5IiBlVHlwZT0iIy8vUm9sZURlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VsZWN0ZWRTdGVwcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vU2VjdGlvbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb21wb3NpdGVSb2xlIiBlU3VwZXJUeXBlcz0iIy8vUm9sZURlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuJiN4RDsmI3hBO0EgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd3RvU3RhZmYiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdENoYXJhY3RlcmlzdGljcyIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpbmdUZWNobmlxdWUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2FnZU5vdGVzIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbmNlcHQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2hlY2tsaXN0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFeGFtcGxlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRlbGluZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSZXBvcnQgaXMgYSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZW1wbGF0ZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VwcG9ydGluZyBNYXRlcmlhbHMgaXMgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV2hpdGVwYXBlciIgZVN1cGVyVHlwZXM9IiMvL0NvbmNlcHQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldoaXRlcGFwZXJzIGFyZSBhIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXJtRGVmaW5pdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUZXJtRGVmaW5pdGlvbnMgZGVmaW5lIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlByYWN0aWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJhY3RpY2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRlbnRSZWZlcmVuY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50RWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FjdGl2aXR5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zIHF1YWxpZnkgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmV1c2FibGVBc3NldCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RhdGUiIGVTdXBlclR5cGVzPSIjLy9WZXJ0ZXgiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJXb3JrUHJvZHVjdCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUmVnaW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWdpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJtYWNoaW5lIiBlVHlwZT0iIy8vU3RhdGVNYWNoaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZlcnRleCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgZVR5cGU9IiMvL1JlZ2lvbiIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9WZXJ0ZXgiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0Z29pbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGVPcHBvc2l0ZT0iIy8vVHJhbnNpdGlvbi9zb3VyY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5jb21pbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RyYW5zaXRpb24iIGVPcHBvc2l0ZT0iIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVnaW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVmVydGV4IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9WZXJ0ZXgiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1ZlcnRleC9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVHJhbnNpdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVHJhbnNpdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vVHJhbnNpdGlvbi9jb250YWluZXIiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iU3RhdGUiIGVUeXBlPSIjLy9TdGF0ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1N0YXRlL1JlZ2lvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJTdGF0ZU1hY2hpbmUiIGVUeXBlPSIjLy9TdGF0ZU1hY2hpbmUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9TdGF0ZU1hY2hpbmUvUmVnaW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN0YXRlTWFjaGluZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUmVnaW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZWdpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1JlZ2lvbi9TdGF0ZU1hY2hpbmUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVHJhbnNpdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrRGVmaW5pdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZXIiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9SZWdpb24iIHRyYW5zaWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9SZWdpb24vVHJhbnNpdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzb3VyY2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9WZXJ0ZXgiIGVPcHBvc2l0ZT0iIy8vVmVydGV4L291dGdvaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhcmdldCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1ZlcnRleCIgZU9wcG9zaXRlPSIjLy9WZXJ0ZXgvaW5jb21pbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHNldWRvU3RhdGUiIGVTdXBlclR5cGVzPSIjLy9WZXJ0ZXgiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlBzZXVkb1N0YXRlS2luZCI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJpbml0aWFsIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJqb2luIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZm9yayIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Imp1bmN0aW9uIiB2YWx1ZT0iMyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iY2hvaWNlIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZW50cnlQb2ludCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4aXRQb2ludCIgdmFsdWU9IjYiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InRlcm1pbmF0ZSIgdmFsdWU9IjciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlzY2lwbGluZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiYjeEQ7JiN4QTtBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhc2tzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRpc2NpcGxpbmUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rpc2NpcGxpbmUiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250ZW50IENhdGVnb3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyb2xlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUm9sZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEb21haW4iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4mI3hEOyYjeEE7RG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id29ya1Byb2R1Y3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJkb21haW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Eb21haW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaXNjaXBsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVTZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlU2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EZXNjcmliYWJsZUVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEQ7JiN4QTtBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LiYjeEQ7JiN4QTtDb3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YWxpZENvbnRleHQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuJiN4RDsmI3hBO0EgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOiYjeEQ7JiN4QTstIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLiYjeEQ7JiN4QTstIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NQYWNrYWdlICMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgaXMgYSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLiYjeEQ7JiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludGVyZmFjZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2VzcyIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3MiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuJiN4RDsmI3hBO0Ega2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1Byb2Nlc3NDb21wb25lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGx1Z2luIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCAjLy9QYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBQbHVnaW4gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuJiN4RDsmI3hBO01ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLiYjeEQ7JiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUJvb2xlYW5PYmplY3QiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVmFyaWFiaWxpdHlFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuJiN4RDsmI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hEOyYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlFbGVtZW50Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJWYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIgdmFsdWU9IjYiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kVW5pdCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBVbml0IGlzIGEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXV0aG9ycyIgZVR5cGU9IiMvL1N0cmluZyIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiBlVHlwZT0iIy8vRGF0ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIENvbmZpZ3VyYXRpb24gaXMgYSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGx1Z2luIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvY2Vzc1ZpZXdzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVmYXVsdFZpZXciIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzZUNvbmZpZ3VyYXRpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YnRyYWN0ZWRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZW14IGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZW14CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjc2OTMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmVteAorKysgL2Rldi9udWxsCkBAIC0xLDMzMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS14dG9vbHMyX3VuaXZlcnNhbF90eXBlX21hbmFnZXItLT4KLTw/Y29tLmlibS54dG9vbHMuZW1mLmNvcmUuc2lnbmF0dXJlIDxzaWduYXR1cmUgaWQ9ImNvbS5pYm0ueHRvb2xzLnVtbC5tc2wubW9kZWwiIHZlcnNpb249IjcuMC4wIj48ZmVhdHVyZSBkZXNjcmlwdGlvbj0iIiBuYW1lPSJjb20uaWJtLnh0b29scy5ydW1sLmZlYXR1cmUiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+Ci08P2NvbS5pYm0ueHRvb2xzLmVtZi5jb3JlLnNpZ25hdHVyZSA8c2lnbmF0dXJlIGlkPSJjb20uaWJtLnh0b29scy5tbWkudWkuc2lnbmF0dXJlcy5kaWFncmFtIiB2ZXJzaW9uPSI3LjAuMCI+PGZlYXR1cmUgZGVzY3JpcHRpb249IiIgbmFtZT0iUmF0aW9uYWwgTW9kZWxpbmcgUGxhdGZvcm0gKGNvbS5pYm0ueHRvb2xzLnJtcCkiIHVybD0iIiB2ZXJzaW9uPSI3LjAuMCIvPjwvc2lnbmF0dXJlPj8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOkRlZmF1bHQ9Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEiIHhtbG5zOkVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvc2NoZW1hcy9FY29yZS8zIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6dW1sPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly8vc2NoZW1hcy9EZWZhdWx0LzEgcGF0aG1hcDovL1VNTDJfTVNMX1BST0ZJTEVTL0RlZmF1bHQuZXB4I19JTjhrOE1tQkVkcUJjTjFSNkV2V1V3P0RlZmF1bHQvRGVmYXVsdD8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy91bWwyL3NjaGVtYXMvRWNvcmUvMyBwYXRobWFwOi8vVU1MX1BST0ZJTEVTL0Vjb3JlLnByb2ZpbGUudW1sI192eS1IVVlpbkVkcXR2Ym5mQjJMXzV3Ij4KLSAgPHVtbDpNb2RlbCB4bWk6aWQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIiBuYW1lPSJ1bWEiPgotICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfSjd0RzBleUNFZHU1LXZWamxmVnNmUSIgc291cmNlPSJ1bWwyLmRpYWdyYW1zIi8+Ci0gICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOE8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOGUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVNTDJJbmZyYXN0cnVjdHVyZU1pbmk6OkNvbnN0cnVjdHMiIHJlZmVyZW5jZXM9Il95eEtmQ3Utc0VkdUg1OUtTSFY4dmdBIF95eEtmRGUtc0VkdUg1OUtTSFY4dmdBIF95eEtmRXUtc0VkdUg1OUtTSFY4dmdBIF95eEtmRC0tc0VkdUg1OUtTSFY4dmdBIF95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIF95eFVQVU8tc0VkdUg1OUtTSFY4dmdBIF95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIF95eFVQV08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE4dS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VU1MMkluZnJhc3RydWN0dXJlTWluaTo6UHJpbWl0aXZlVHlwZXMiIHJlZmVyZW5jZXM9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIF95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIF95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIF95eFVQYXUtc0VkdUg1OUtTSFY4dmdBIF95eFVQYS0tc0VkdUg1OUtTSFY4dmdBIF95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIF95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIF95eFVQY08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE4LS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6QmFzaWNFbGVtZW50cyIgcmVmZXJlbmNlcz0iX3l4dzdSTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdTZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdUdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdVZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdXdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdYLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdaZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdiLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdkZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdmdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdnLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdpTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdodS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdrZS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdsdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdsTy1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdtLS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdtZS1zRWR1SDU5S1NIVjh2Z0EgX3l4NkZNZS1zRWR1SDU5S1NIVjh2Z0EgX3l4NkZNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTlPLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RQbHVnaW4iIHJlZmVyZW5jZXM9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIF95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIF95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIF95N21Nc08tc0VkdUg1OUtTSFY4dmdBIF96R0xGQk8tc0VkdUg1OUtTSFY4dmdBIF96R0xGQnUtc0VkdUg1OUtTSFY4dmdBIF96R0xGQ2Utc0VkdUg1OUtTSFY4dmdBIF96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIF96R0xGRC0tc0VkdUg1OUtTSFY4dmdBIF96R0xGRXUtc0VkdUg1OUtTSFY4dmdBIF96R0xGRi0tc0VkdUg1OUtTSFY4dmdBIF96R0xGSi0tc0VkdUg1OUtTSFY4dmdBIF96R0xGS3Utc0VkdUg1OUtTSFY4dmdBIF96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIF96R0xGTC0tc0VkdUg1OUtTSFY4dmdBIF96R1UyQXUtc0VkdUg1OUtTSFY4dmdBIF96R1UyQU8tc0VkdUg1OUtTSFY4dmdBIF96R1UyQi0tc0VkdUg1OUtTSFY4dmdBIF96R1UyQmUtc0VkdUg1OUtTSFY4dmdBIF96R1UyRE8tc0VkdUg1OUtTSFY4dmdBIF96R1UyQ3Utc0VkdUg1OUtTSFY4dmdBIF96R1UyRWUtc0VkdUg1OUtTSFY4dmdBIF96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDE5ZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6R3VpZGFuY2VUeXBlcyIgcmVmZXJlbmNlcz0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EgX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS02dS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS03ZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS04Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS0tZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS1fTy1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9BdS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9CZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9DZS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9ETy1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9ELS1zRWR1SDU5S1NIVjh2Z0EgX3l6MV9FdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y0Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y0LS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y1LS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y2dS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y3ZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y4Ty1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y4LS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y5dS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3YtZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3ZfLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dCTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dDZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dEdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dFLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dFZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dHTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dGdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dIZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dHLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dJdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dJTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dKLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dMTy1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dLdS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc0dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc0Ty1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc1LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc2LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc2dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc3LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc3dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc4LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc4dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc5LS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc5dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelRsMTl1LXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpNZXRob2RDb3JlOjpNZXRob2RDb3JlRGVzY3JpcHRpb25zIiByZWZlcmVuY2VzPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSBfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSBfeTFNQ3N1LXNFZHVINTlLU0hWOHZnQSBfeTFNQ3QtLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3ZPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3dPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3NPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3h1LXNFZHVINTlLU0hWOHZnQSBfeTFNQ3ktLXNFZHVINTlLU0hWOHZnQSBfeTFNQ3hPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzB1LXNFZHVINTlLU0hWOHZnQSBfeTFNQzEtLXNFZHVINTlLU0hWOHZnQSBfeTFNQzNPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzBPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzQtLXNFZHVINTlLU0hWOHZnQSBfeTFNQzZPLXNFZHVINTlLU0hWOHZnQSBfeTFNQzRlLXNFZHVINTlLU0hWOHZnQSBfeTFNQzctLXNFZHVINTlLU0hWOHZnQSBfeTFNQzlPLXNFZHVINTlLU0hWOHZnQSBfeTFNQy1lLXNFZHVINTlLU0hWOHZnQSBfeTFNQzdlLXNFZHVINTlLU0hWOHZnQSBfeTFNREFPLXNFZHVINTlLU0hWOHZnQSBfeTFNQ191LXNFZHVINTlLU0hWOHZnQSBfeTFNREItLXNFZHVINTlLU0hWOHZnQSBfeTFNRERPLXNFZHVINTlLU0hWOHZnQSBfeTFNREVlLXNFZHVINTlLU0hWOHZnQSBfeTFNREZ1LXNFZHVINTlLU0hWOHZnQSBfeTFNREctLXNFZHVINTlLU0hWOHZnQSBfeTFNRElPLXNFZHVINTlLU0hWOHZnQSBfeTFNREJlLXNFZHVINTlLU0hWOHZnQSBfeTFNREp1LXNFZHVINTlLU0hWOHZnQSBfeTFNREstLXNFZHVINTlLU0hWOHZnQSBfeTFNRE1PLXNFZHVINTlLU0hWOHZnQSBfeTFNRE5lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxOS0tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZExpYnJhcnk6Ok1ldGhvZFVuaXRzIiByZWZlcmVuY2VzPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSBfekRwVmNPLXNFZHVINTlLU0hWOHZnQSBfekdMRkFPLXNFZHVINTlLU0hWOHZnQSBfek43UzFlLXNFZHVINTlLU0hWOHZnQSBfek43UzJ1LXNFZHVINTlLU0hWOHZnQSBfek43UzN1LXNFZHVINTlLU0hWOHZnQSBfek43UzQtLXNFZHVINTlLU0hWOHZnQSBfek43UzZPLXNFZHVINTlLU0hWOHZnQSBfek43UzB1LXNFZHVINTlLU0hWOHZnQSBfek9FY3ctLXNFZHVINTlLU0hWOHZnQSBfek9FY3dlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxLU8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6OkNvcmVDb250ZW50RWxlbWVudHMiIHJlZmVyZW5jZXM9Il95eXpkRk8tc0VkdUg1OUtTSFY4dmdBIF95eXpkRi0tc0VkdUg1OUtTSFY4dmdBIF95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSHUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSk8tc0VkdUg1OUtTSFY4dmdBIF95eXpkSi0tc0VkdUg1OUtTSFY4dmdBIF95eXpkS3Utc0VkdUg1OUtTSFY4dmdBIF95eXpkTGUtc0VkdUg1OUtTSFY4dmdBIF95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIF95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIF95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIF95eXpkT2Utc0VkdUg1OUtTSFY4dmdBIF95eXpkUE8tc0VkdUg1OUtTSFY4dmdBIF95eXpkTnUtc0VkdUg1OUtTSFY4dmdBIF95eXpkUXUtc0VkdUg1OUtTSFY4dmdBIF95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIF95eXpkUmUtc0VkdUg1OUtTSFY4dmdBIF95eXpkU08tc0VkdUg1OUtTSFY4dmdBIF95eXpkVC0tc0VkdUg1OUtTSFY4dmdBIF95eXpkVXUtc0VkdUg1OUtTSFY4dmdBIF95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIF95eXpkVi0tc0VkdUg1OUtTSFY4dmdBIF95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIF95eXpkWE8tc0VkdUg1OUtTSFY4dmdBIF95eXpkV3Utc0VkdUg1OUtTSFY4dmdBIF95eXpkWWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkWC0tc0VkdUg1OUtTSFY4dmdBIF95eXpkWnUtc0VkdUg1OUtTSFY4dmdBIF95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIF95eXpkYS0tc0VkdUg1OUtTSFY4dmdBIF95eXpkYWUtc0VkdUg1OUtTSFY4dmdBIF95eTlPRXUtc0VkdUg1OUtTSFY4dmdBIF95eTlPRU8tc0VkdUg1OUtTSFY4dmdBIF95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIF95eTlPR2Utc0VkdUg1OUtTSFY4dmdBIF95eTlPRi0tc0VkdUg1OUtTSFY4dmdBIF95eTlPSHUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIF95eTlPSS0tc0VkdUg1OUtTSFY4dmdBIF95eTlPSWUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSnUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSk8tc0VkdUg1OUtTSFY4dmdBIF95eTlPS2Utc0VkdUg1OUtTSFY4dmdBIF95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUbDEtZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc1R5cGVzIiByZWZlcmVuY2VzPSJfeXoxLV8tLXNFZHVINTlLU0hWOHZnQSBfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSBfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSBfeS00S00tLXNFZHVINTlLU0hWOHZnQSBfeS00S051LXNFZHVINTlLU0hWOHZnQSBfeS00S01PLXNFZHVINTlLU0hWOHZnQSBfeS00S1BPLXNFZHVINTlLU0hWOHZnQSBfeS00S09lLXNFZHVINTlLU0hWOHZnQSBfeS00S1F1LXNFZHVINTlLU0hWOHZnQSBfeS00S1AtLXNFZHVINTlLU0hWOHZnQSBfeS00S1JlLXNFZHVINTlLU0hWOHZnQSBfeS00S1NlLXNFZHVINTlLU0hWOHZnQSBfeS00S1RPLXNFZHVINTlLU0hWOHZnQSBfeS00S1QtLXNFZHVINTlLU0hWOHZnQSBfeS00S1V1LXNFZHVINTlLU0hWOHZnQSBfeS00S1ZlLXNFZHVINTlLU0hWOHZnQSBfeS00S1dPLXNFZHVINTlLU0hWOHZnQSBfeS00S1ctLXNFZHVINTlLU0hWOHZnQSBfeV9CVUllLXNFZHVINTlLU0hWOHZnQSBfeV9CVUpPLXNFZHVINTlLU0hWOHZnQSBfeV9CVUotLXNFZHVINTlLU0hWOHZnQSBfeV9CVUxPLXNFZHVINTlLU0hWOHZnQSBfeV9CVUt1LXNFZHVINTlLU0hWOHZnQSBfeV9CVU1lLXNFZHVINTlLU0hWOHZnQSBfeV9CVUwtLXNFZHVINTlLU0hWOHZnQSBfeV9CVU51LXNFZHVINTlLU0hWOHZnQSBfeV9CVU5PLXNFZHVINTlLU0hWOHZnQSBfeV9CVU9lLXNFZHVINTlLU0hWOHZnQSBfeV9CVU4tLXNFZHVINTlLU0hWOHZnQSBfeV9CVVB1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVBPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVEtLXNFZHVINTlLU0hWOHZnQSBfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVJ1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVN1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVNPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVR1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVRlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVUtLXNFZHVINTlLU0hWOHZnQSBfeV9CVVVlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVdPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVhlLXNFZHVINTlLU0hWOHZnQSBfeV9CVVctLXNFZHVINTlLU0hWOHZnQSBfeV9CVVl1LXNFZHVINTlLU0hWOHZnQSBfeV9CVVlPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVotLXNFZHVINTlLU0hWOHZnQSBfeV9CVVplLXNFZHVINTlLU0hWOHZnQSBfeV9CVWJPLXNFZHVINTlLU0hWOHZnQSBfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VGwxLXUtc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6Ok1ldGhvZENvcmU6OkNhdGVnb3JpZXMiIHJlZmVyZW5jZXM9Il95Mk9rZy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9raHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIF95Mk9rak8tc0VkdUg1OUtTSFY4dmdBIF95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9ra3Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rbGUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rai0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rcE8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rb2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rcXUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rcC0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rc08tc0VkdUg1OUtTSFY4dmdBIF95Mk9rcmUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rdHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rdWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rcy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rdnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rdk8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rdy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rd2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9reU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9reS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9reWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rME8tc0VkdUg1OUtTSFY4dmdBIF95Mk9renUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMWUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rMnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMk8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rMy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rM2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rNU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rNmUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rN2Utc0VkdUg1OUtTSFY4dmdBIF95Mk9rN08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV80Ty1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6V29ya1Byb2R1Y3RTdGF0ZXMiIHJlZmVyZW5jZXM9Il95M1J0WXUtc0VkdUg1OUtTSFY4dmdBIF95M1J0WmUtc0VkdUg1OUtTSFY4dmdBIF95M1J0YU8tc0VkdUg1OUtTSFY4dmdBIF95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzVXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzVmUtc0VkdUg1OUtTSFY4dmdBIF95M2EzV08tc0VkdUg1OUtTSFY4dmdBIF95M2EzVy0tc0VkdUg1OUtTSFY4dmdBIF95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzWU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzWHUtc0VkdUg1OUtTSFY4dmdBIF95M2EzWmUtc0VkdUg1OUtTSFY4dmdBIF95M2EzYU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzYS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzYnUtc0VkdUg1OUtTSFY4dmdBIF95M2EzY08tc0VkdUg1OUtTSFY4dmdBIF95M2EzZS0tc0VkdUg1OUtTSFY4dmdBIF95M2EzZnUtc0VkdUg1OUtTSFY4dmdBIF95M2EzZ2Utc0VkdUg1OUtTSFY4dmdBIF95M2EzZ3Utc0VkdUg1OUtTSFY4dmdBIF95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaHUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaU8tc0VkdUg1OUtTSFY4dmdBIF95M2EzaC0tc0VkdUg1OUtTSFY4dmdBIF95M2EzaWUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaS0tc0VkdUg1OUtTSFY4dmdBIF95M2Ezak8tc0VkdUg1OUtTSFY4dmdBIF95M2EzamUtc0VkdUg1OUtTSFY4dmdBIF95M2Ezai0tc0VkdUg1OUtTSFY4dmdBIF95M2EzanUtc0VkdUg1OUtTSFY4dmdBIF95M2Eza3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV80ZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kQ29yZTo6TWV0aG9kUGFja2FnZSIgcmVmZXJlbmNlcz0iX3k0ZUFOZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFPTy1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFPLS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFRZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFQdS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFSdS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFSTy1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFTLS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFTZS1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFVTy1zRWR1SDU5S1NIVjh2Z0EgX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelR1XzR1LXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpQcm9jZXNzOjpCcmVha2Rvd24iIHJlZmVyZW5jZXM9Il95N21NdE8tc0VkdUg1OUtTSFY4dmdBIF95N21Nc08tc0VkdUg1OUtTSFY4dmdBIF95N21NdC0tc0VkdUg1OUtTSFY4dmdBIF95N21NdXUtc0VkdUg1OUtTSFY4dmdBIF95N21NdmUtc0VkdUg1OUtTSFY4dmdBIF95N21Ndy0tc0VkdUg1OUtTSFY4dmdBIF95N21NeHUtc0VkdUg1OUtTSFY4dmdBIF95N21NeWUtc0VkdUg1OUtTSFY4dmdBIF95N21Nd08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXb08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXcmUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXc08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXdHUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXdU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXdXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXcy0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXd08tc0VkdUg1OUtTSFY4dmdBIF95N3ZXeGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXeU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXeS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXenUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXMGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXMU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXMS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXM2Utc0VkdUg1OUtTSFY4dmdBIF95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXNHUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXNWUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXNk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXNy0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXOHUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXOWUtc0VkdUg1OUtTSFY4dmdBIF95N3ZXLU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZXLS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXX3Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYQWUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYQk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYQi0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYRGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYRXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYRi0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYR3Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYSGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYSU8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYSnUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYSS0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYTE8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYTC0tc0VkdUg1OUtTSFY4dmdBIF95N3ZYTXUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYTmUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIF95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIF95N3ZYUGUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIF95NzVIb08tc0VkdUg1OUtTSFY4dmdBIF95NzVIcE8tc0VkdUg1OUtTSFY4dmdBIF95NzVIb3Utc0VkdUg1OUtTSFY4dmdBIF95NzVIcWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIcC0tc0VkdUg1OUtTSFY4dmdBIF95NzVIcnUtc0VkdUg1OUtTSFY4dmdBIF95NzVIck8tc0VkdUg1OUtTSFY4dmdBIF95NzVIcy0tc0VkdUg1OUtTSFY4dmdBIF95NzVIc2Utc0VkdUg1OUtTSFY4dmdBIF95NzVIdU8tc0VkdUg1OUtTSFY4dmdBIF95NzVIdHUtc0VkdUg1OUtTSFY4dmdBIF95NzVIdmUtc0VkdUg1OUtTSFY4dmdBIF95NzVIdS0tc0VkdUg1OUtTSFY4dmdBIF95NzVId3Utc0VkdUg1OUtTSFY4dmdBIF95NzVId08tc0VkdUg1OUtTSFY4dmdBIF95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIF95NzVIeWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIF95NzVIenUtc0VkdUg1OUtTSFY4dmdBIF95NzVIek8tc0VkdUg1OUtTSFY4dmdBIF95NzVIMC0tc0VkdUg1OUtTSFY4dmdBIF95NzVIMGUtc0VkdUg1OUtTSFY4dmdBIF95NzVIMk8tc0VkdUg1OUtTSFY4dmdBIF95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIF95NzVIM2Utc0VkdUg1OUtTSFY4dmdBIF95NzVIMi0tc0VkdUg1OUtTSFY4dmdBIF95NzVINHUtc0VkdUg1OUtTSFY4dmdBIF95NzVINE8tc0VkdUg1OUtTSFY4dmdBIF95NzVINS0tc0VkdUg1OUtTSFY4dmdBIF95NzVINWUtc0VkdUg1OUtTSFY4dmdBIF95NzVINi0tc0VkdUg1OUtTSFY4dmdBIF95NzVINnUtc0VkdUg1OUtTSFY4dmdBIF95NzVIOE8tc0VkdUg1OUtTSFY4dmdBIF95NzVIN3Utc0VkdUg1OUtTSFY4dmdBIF95NzVIOWUtc0VkdUg1OUtTSFY4dmdBIF95NzVIOC0tc0VkdUg1OUtTSFY4dmdBIF95NzVILXUtc0VkdUg1OUtTSFY4dmdBIF95NzVILU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV80LS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6TWV0aG9kTGlicmFyeTo6TGlicmFyeUNvbmZpZ3VyYXRpb25zIiByZWZlcmVuY2VzPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSBfelFkQ1ktLXNFZHVINTlLU0hWOHZnQSBfelFkQ1p1LXNFZHVINTlLU0hWOHZnQSBfelFkQ2FlLXNFZHVINTlLU0hWOHZnQSBfelFkQ2JPLXNFZHVINTlLU0hWOHZnQSBfelFkQ2ItLXNFZHVINTlLU0hWOHZnQSBfelFkQ2N1LXNFZHVINTlLU0hWOHZnQSBfelFkQ2RlLXNFZHVINTlLU0hWOHZnQSBfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSBfelFkQ2UtLXNFZHVINTlLU0hWOHZnQSBfelFkQ2VPLXNFZHVINTlLU0hWOHZnQSBfelFkQ2YtLXNFZHVINTlLU0hWOHZnQSBfelFtellPLXNFZHVINTlLU0hWOHZnQSBfelFtemFPLXNFZHVINTlLU0hWOHZnQSBfelFtemEtLXNFZHVINTlLU0hWOHZnQSBfelFtelktLXNFZHVINTlLU0hWOHZnQSBfelFtemNPLXNFZHVINTlLU0hWOHZnQSBfelFtemJ1LXNFZHVINTlLU0hWOHZnQSBfelFtemRlLXNFZHVINTlLU0hWOHZnQSBfelFtemMtLXNFZHVINTlLU0hWOHZnQSBfelFtemV1LXNFZHVINTlLU0hWOHZnQSBfelFtemVPLXNFZHVINTlLU0hWOHZnQSBfelFtemYtLXNFZHVINTlLU0hWOHZnQSBfelFtemZlLXNFZHVINTlLU0hWOHZnQSBfelFtemd1LXNFZHVINTlLU0hWOHZnQSBfelFtemdPLXNFZHVINTlLU0hWOHZnQSBfelFtemhlLXNFZHVINTlLU0hWOHZnQSBfelFtemctLXNFZHVINTlLU0hWOHZnQSBfelFteml1LXNFZHVINTlLU0hWOHZnQSBfelFtemlPLXNFZHVINTlLU0hWOHZnQSBfelFtemp1LXNFZHVINTlLU0hWOHZnQSBfelFtemplLXNFZHVINTlLU0hWOHZnQSBfelFtemt1LXNFZHVINTlLU0hWOHZnQSBfelFtemtlLXNFZHVINTlLU0hWOHZnQSBfelFtemwtLXNFZHVINTlLU0hWOHZnQSBfelFtemxlLXNFZHVINTlLU0hWOHZnQSBfelFtem0tLXNFZHVINTlLU0hWOHZnQSBfelFtem11LXNFZHVINTlLU0hWOHZnQSBfelFtem4tLXNFZHVINTlLU0hWOHZnQSBfelFtem51LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il96VHVfNU8tc0VkdUg1OUtTSFY4dmdBIiBzb3VyY2U9IlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlVuaWZpZWRNZXRob2RBcmNoaXRlY3R1cmU6OlByb2Nlc3M6OlByb2Nlc3NEZXNjcmlwdGlvbnMiIHJlZmVyZW5jZXM9Il96Qlo1d3Utc0VkdUg1OUtTSFY4dmdBIF96Qlo1d08tc0VkdUg1OUtTSFY4dmdBIF96Qlo1eWUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1enUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1MC0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1eC0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1MnUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1My0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1NU8tc0VkdUg1OUtTSFY4dmdBIF96Qlo1NmUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1N3Utc0VkdUg1OUtTSFY4dmdBIF96Qlo1OC0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1Mk8tc0VkdUg1OUtTSFY4dmdBIF96Qlo1LXUtc0VkdUg1OUtTSFY4dmdBIF96Qlo1Xy0tc0VkdUg1OUtTSFY4dmdBIF96Qlo1LU8tc0VkdUg1OUtTSFY4dmdBIF96Qlo2QnUtc0VkdUg1OUtTSFY4dmdBIF96Qlo2Qk8tc0VkdUg1OUtTSFY4dmdBIF96Qlo2RGUtc0VkdUg1OUtTSFY4dmdBIF96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV81ZS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzczo6UHJvY2Vzc1BhY2thZ2UiIHJlZmVyZW5jZXM9Il96RHBWZGUtc0VkdUg1OUtTSFY4dmdBIF96RHBWZU8tc0VkdUg1OUtTSFY4dmdBIF96RHBWY08tc0VkdUg1OUtTSFY4dmdBIF96RHBWZnUtc0VkdUg1OUtTSFY4dmdBIF96RHBWZS0tc0VkdUg1OUtTSFY4dmdBIF96RHBWaE8tc0VkdUg1OUtTSFY4dmdBIF96RHBWaC0tc0VkdUg1OUtTSFY4dmdBIF96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIF96RHBWamUtc0VkdUg1OUtTSFY4dmdBIF96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIF96RHBWa3Utc0VkdUg1OUtTSFY4dmdBIF96RHBWa08tc0VkdUg1OUtTSFY4dmdBIF96RHBWbC0tc0VkdUg1OUtTSFY4dmdBIF96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIF96RHBWbk8tc0VkdUg1OUtTSFY4dmdBIF96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIF96RHBWb2Utc0VkdUg1OUtTSFY4dmdBIF96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIF96RHBWcHUtc0VkdUg1OUtTSFY4dmdBIF96RHBWcE8tc0VkdUg1OUtTSFY4dmdBIF96RHBWcS0tc0VkdUg1OUtTSFY4dmdBIF96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTppZD0iX3pUdV81dS1zRWR1SDU5S1NIVjh2Z0EiIHNvdXJjZT0iVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6VW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZTo6UHJvY2Vzc0RpYWdyYW1zOjpVTUFEaWFncmFtcyIgcmVmZXJlbmNlcz0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EgX3pMaXRNTy1zRWR1SDU5S1NIVjh2Z0EgX3pMaXROZS1zRWR1SDU5S1NIVjh2Z0EgX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfelQ0dzRPLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJVbmlmaWVkTWV0aG9kQXJjaGl0ZWN0dXJlOjpVTUwyRGlhZ3JhbUludGVyY2hhbmdlIiByZWZlcmVuY2VzPSJfekpBV2tlLXNFZHVINTlLU0hWOHZnQSBfekpBV2t1LXNFZHVINTlLU0hWOHZnQSBfekpBV2tPLXNFZHVINTlLU0hWOHZnQSBfekpBV2xlLXNFZHVINTlLU0hWOHZnQSBfekpBV2x1LXNFZHVINTlLU0hWOHZnQSBfekpBV21lLXNFZHVINTlLU0hWOHZnQSBfekpBV25PLXNFZHVINTlLU0hWOHZnQSBfekpBV24tLXNFZHVINTlLU0hWOHZnQSBfekpBV2stLXNFZHVINTlLU0hWOHZnQSBfekpBV28tLXNFZHVINTlLU0hWOHZnQSBfekpBV3BPLXNFZHVINTlLU0hWOHZnQSBfekpBV291LXNFZHVINTlLU0hWOHZnQSBfekpBV3AtLXNFZHVINTlLU0hWOHZnQSBfekpBV3FlLXNFZHVINTlLU0hWOHZnQSBfekpBV3JPLXNFZHVINTlLU0hWOHZnQSBfekpBV3ItLXNFZHVINTlLU0hWOHZnQSBfekpBV3BlLXNFZHVINTlLU0hWOHZnQSBfekpBV3RPLXNFZHVINTlLU0hWOHZnQSBfekpBV3R1LXNFZHVINTlLU0hWOHZnQSBfekpBV3N1LXNFZHVINTlLU0hWOHZnQSBfekpBV3UtLXNFZHVINTlLU0hWOHZnQSBfekpBV3YtLXNFZHVINTlLU0hWOHZnQSBfekpBV3VlLXNFZHVINTlLU0hWOHZnQSBfekpBV3hlLXNFZHVINTlLU0hWOHZnQSBfekpBV3lPLXNFZHVINTlLU0hWOHZnQSBfekpBV3ctLXNFZHVINTlLU0hWOHZnQSBfekpBV3plLXNFZHVINTlLU0hWOHZnQSBfekpBVzBPLXNFZHVINTlLU0hWOHZnQSBfekpBV3ktLXNFZHVINTlLU0hWOHZnQSBfekpLSGt1LXNFZHVINTlLU0hWOHZnQSBfekpLSGstLXNFZHVINTlLU0hWOHZnQSBfekpLSGxPLXNFZHVINTlLU0hWOHZnQSBfekpLSGwtLXNFZHVINTlLU0hWOHZnQSBfekpLSGtPLXNFZHVINTlLU0hWOHZnQSBfekpLSG5PLXNFZHVINTlLU0hWOHZnQSBfekpLSG11LXNFZHVINTlLU0hWOHZnQSBfekpLSG4tLXNFZHVINTlLU0hWOHZnQSBfekpLSG91LXNFZHVINTlLU0hWOHZnQSBfekpLSG8tLXNFZHVINTlLU0hWOHZnQSBfekpLSHB1LXNFZHVINTlLU0hWOHZnQSBfekpLSG5lLXNFZHVINTlLU0hWOHZnQSBfekpLSHEtLXNFZHVINTlLU0hWOHZnQSBfekpLSHItLXNFZHVINTlLU0hWOHZnQSBfekpLSHN1LXNFZHVINTlLU0hWOHZnQSBfekpLSHFlLXNFZHVINTlLU0hWOHZnQSBfekpLSHQtLXNFZHVINTlLU0hWOHZnQSBfekpLSHRlLXNFZHVINTlLU0hWOHZnQSBfekpLSHZlLXNFZHVINTlLU0hWOHZnQSBfekpLSHUtLXNFZHVINTlLU0hWOHZnQSBfekpLSHd1LXNFZHVINTlLU0hWOHZnQSBfekpLSHdPLXNFZHVINTlLU0hWOHZnQSBfekpLSHhlLXNFZHVINTlLU0hWOHZnQSBfekpLSHllLXNFZHVINTlLU0hWOHZnQSBfekpLSHgtLXNFZHVINTlLU0hWOHZnQSBfekpLSHotLXNFZHVINTlLU0hWOHZnQSBfekpLSDAtLXNFZHVINTlLU0hWOHZnQSBfekpLSHplLXNFZHVINTlLU0hWOHZnQSBfekpLSDEtLXNFZHVINTlLU0hWOHZnQSBfekpLSDItLXNFZHVINTlLU0hWOHZnQSBfekpLSDNlLXNFZHVINTlLU0hWOHZnQSBfekpLSDJlLXNFZHVINTlLU0hWOHZnQSBfekpLSDR1LXNFZHVINTlLU0hWOHZnQSBfekpLSDQtLXNFZHVINTlLU0hWOHZnQSBfekpLSDVPLXNFZHVINTlLU0hWOHZnQSBfekpLSDVlLXNFZHVINTlLU0hWOHZnQSBfekpLSDV1LXNFZHVINTlLU0hWOHZnQSBfekpLSDUtLXNFZHVINTlLU0hWOHZnQSBfekpLSDRPLXNFZHVINTlLU0hWOHZnQSBfekpLSDZPLXNFZHVINTlLU0hWOHZnQSBfekpLSDZlLXNFZHVINTlLU0hWOHZnQSBfekpLSDYtLXNFZHVINTlLU0hWOHZnQSBfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSBfekpLSDd1LXNFZHVINTlLU0hWOHZnQSBfekpLSDctLXNFZHVINTlLU0hWOHZnQSBfekpLSDhPLXNFZHVINTlLU0hWOHZnQSBfekpLSDh1LXNFZHVINTlLU0hWOHZnQSBfekpLSDhlLXNFZHVINTlLU0hWOHZnQSBfekpLSDllLXNFZHVINTlLU0hWOHZnQSBfekpLSDl1LXNFZHVINTlLU0hWOHZnQSBfekpUUmdPLXNFZHVINTlLU0hWOHZnQSBfekpUUmd1LXNFZHVINTlLU0hWOHZnQSBfekpUUmdlLXNFZHVINTlLU0hWOHZnQSBfekpUUmh1LXNFZHVINTlLU0hWOHZnQSBfekpUUmhlLXNFZHVINTlLU0hWOHZnQSBfekpUUml1LXNFZHVINTlLU0hWOHZnQSBfekpUUmllLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFktLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDA8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MUNSc08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wNjwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFNTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjA1PC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJGYWtPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDQ8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfSjd0RzBPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8Ym9keT4wMzwvYm9keT4KLSAgICA8L293bmVkQ29tbWVudD4KLSAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdRTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIj4KLSAgICAgIDxib2R5PjAxPC9ib2R5PgotICAgIDwvb3duZWRDb21tZW50PgotICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZEVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX0o3dEcwT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGJvZHk+MDI8L2JvZHk+Ci0gICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPHBhY2thZ2VJbXBvcnQgeG1pOmlkPSJfSjd0RzFPeUNFZHU1LXZWamxmVnNmUSI+Ci0gICAgICA8aW1wb3J0ZWRQYWNrYWdlIHhtaTp0eXBlPSJ1bWw6TW9kZWwiIGhyZWY9InBhdGhtYXA6Ly9VTUxfTElCUkFSSUVTL1VNTFByaW1pdGl2ZVR5cGVzLmxpYnJhcnkudW1sI18wIi8+Ci0gICAgPC9wYWNrYWdlSW1wb3J0PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhLZkN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ2xhc3NpZmllciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4S2ZDLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eEtmQ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhLZkRPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4VVBVTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4S2ZEZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eEtmRHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhLZkRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXhLZkQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTmFtZWRFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhLZkVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhLZkVlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZEZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eEtmRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJuYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXhLZkUtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXhLZkZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXhLZkZlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQYWNrYWdlYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eEtmRi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhLZkZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhLZkdPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4VVBVTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlR5cGUiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQVWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUFVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBUeXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4VVBVdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eFVQVk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQYWNrYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXhVUFZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5VTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eFVQVnUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFdPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4VVBWLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eFVQV08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJOYW1lc3BhY2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eFVQV2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXhVUFdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXhVUFd1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4S2ZELS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUFpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGF0ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBaZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIG9mIHRoZSB0eXBlIERhdGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlVyaSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBaLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGF0YSB0eXBlIHVzZWQgZm9yIGF0dHJpYnV0ZXMgb2YgbWV0YS1tb2RlbCBjbGFzc2VzIHRoYXQgcG9pbnQgdG8gcmVzb3VyY2VzIHN1Y2ggYXMgZmlsZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOlByaW1pdGl2ZVR5cGUiIHhtaTppZD0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN0cmluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBhZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGluIHNvbWUgc3VpdGFibGUgY2hhcmFjdGVyIHNldCB1c2VkIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsLiBDaGFyYWN0ZXIgc2V0cyBtYXkgaW5jbHVkZSBub24tUm9tYW4gYWxwaGFiZXRzIGFuZCBjaGFyYWN0ZXJzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpQcmltaXRpdmVUeXBlIiB4bWk6aWQ9Il95eFVQYXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTZXQiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU2VxdWVuY2UiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iSW50ZWdlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBiZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QW4gaW50ZWdlciBpcyBhIHByaW1pdGl2ZSB0eXBlIHJlcHJlc2VudGluZyBpbnRlZ2VyIHZhbHVlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQm9vbGVhbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4VVBiLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBCb29sZWFuIHR5cGUgaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9uLCBjb25zaXN0aW5nIG9mIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6UHJpbWl0aXZlVHlwZSIgeG1pOmlkPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRG91YmxlIi8+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3Y3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb25zdHJhaW50Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2MtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbnN0cmFpbnQgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3ZE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdkZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJvZHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdkdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ZGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2QtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2VPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N2VlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3aHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdoLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3aWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3aXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3aS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l4dzdqTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l4dzdUdS1zRWR1SDU5S1NIVjh2Z0EgX3l4dzdqdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3amUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIEVsZW1lbnQgY2FuIG93biBtYW55IENvbnN0cmFpbnRzIGRlZmluaW5nIHJ1bGVzIGZvciB0aGlzIGVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXh3N2p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eHc3ak8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eHc3ai0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3WC0tc0VkdUg1OUtTSFY4dmdBIF95eHc3a2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2tPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbnRlbnQgRGVzY3JpcHRpb24gY2FuIG9wdGlvbmFsbHkgYmUgc3RydWN0dXJlIGludG8gU2VjdGlvbnMuICBUaGlzIGFzc29jaWF0aW9uIGlzIHVzZSB0byBkZWNvbXBvc2VkIFNlY3Rpb24gaW50byBhIGhpZXJhcmNoeSBvZiBTZWN0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eHc3a2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudERlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXh3N2otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdrdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdrLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eHc3bE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3Yi0tc0VkdUg1OUtTSFY4dmdBIF95eHc3bHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2xlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdsTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5TZWN0aW9ucyBjYW4gYmUgZnVydGhlciBkZWNvbXBvc2VkIGludG8gbiBsZXZlbHMgb2Ygc3ViLXNlY3Rpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l4dzdsdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXh3N2xPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdsLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdtTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXh3N21lLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXh3N20tLXNFZHVINTlLU0hWOHZnQSBfeXh3N2ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l4dzdtdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3bWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEZXNjcmliYWJsZSBFbGVtZW50IGNhbiBjb250YWluIGEgQ29udGVudCBEZXNjcmlwdGlvbiBlbGVtZW50IHRoYXQgc3RvcmVzIHRleHR1YWwgZGVzY3JpcHRpb25zIGZvciB0aGlzIENvbnRlbnQgRWxlbWVudC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgaW50ZW5kZWQgdG8gYmUgcmVmaW5lZCB3aXRoIHN1Yi1jbGFzc2VzIGFkZGluZyBtb3JlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZXMuICBBbnkgb2YgdGhlc2Ugc3ViLXR5cGVzIGNhbiBiZSByZWxhdGVkIHRvIGEgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l4dzdtLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kZXNjcmliYWJsZUVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95eHc3bWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N25PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N25lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eDZGTU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eHc3VWUtc0VkdUg1OUtTSFY4dmdBIF95eDZGTWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eDZGTWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l4NkZNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkRXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBpcyBhIGNvbnRlbnQgZWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkRS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l5emRGTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1vZGlmaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiIGFzc29jaWF0aW9uPSJfeXl6ZFpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRGZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRGdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRHTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRHZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHdWlkYW5jZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emROTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZE5lLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFydGlmYWN0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZE4tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZE9PLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkT2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZXJBcnRpZmFjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE51LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZE91LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZE8tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkUE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emROdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXk5T0ZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRQZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRQdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRRTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFFlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkUXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRRLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRSTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkUmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJPdXRjb21lIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFJ1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRSZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BbiBvdXRjb21lIGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFItLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l5emRTTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN0ZXAiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkU2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLgotQSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFN1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eXpkUy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya0RlZmluaXRpb24iIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkVGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZFR1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkVC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVjb25kaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdjdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRVTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRVZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZFV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFUtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRWZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfUHJpbWFyeVBlcmZvcm1lciIgbWVtYmVyRW5kPSJfeXl6ZEh1LXNFZHVINTlLU0hWOHZnQSBfeXl6ZFYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRWdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Um9sZXMgY2FuIGJlIGRlZmluZWQgdG8gcGVyZm9ybSBtYW55IFRhc2tzLCBidXQgZXZlcnkgVGFzayBtYXkgaGF2ZSBvbmx5IG9uZSBSb2xlIHRoYXQgaXMgYnkgZGVmYXVsdCB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgb2YgdGhpcyBUYXNrLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5emRWLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBlcmZvcm1zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRWZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkV08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkV2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXl6ZFd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9NYW5kYXRvcnlJbnB1dHMiIG1lbWJlckVuZD0iX3l5emRYTy1zRWR1SDU5S1NIVjh2Z0EgX3l5emRJZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkVy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZFd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgbGlua3MgdG8gemVybyBvciBtYW55IGRlZmluaXRpb25zIG9mIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgZGVmaW5lZCBhcyBtYW5kYXRvcnkgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eXpkWE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l5emRXdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkWGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkWHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXl6ZFgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVmYXVsdF9PdXRwdXRzIiBtZW1iZXJFbmQ9Il95eXpkWWUtc0VkdUg1OUtTSFY4dmdBIF95eXpkSk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZFlPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRYLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3V0cHV0cyBvZiB0aGlzIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXl6ZFllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkWC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZFktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRaTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfTW9kaWZpZXMiIG1lbWJlckVuZD0iX3l5emRadS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRGTy1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5emRaZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBkZXJpdmVkIGZyb20gdGhlIGZhY3QgdGhhdCBSb2xlcyBwZXJmb3JtIFRhc2tzIHRoYXQgaGF2ZSBXb3JrIFByb2R1Y3RzIG9mIHRoYXQgcGFydGljdWxhciB0eXBlIGFzIG91dHB1dHMuICAvbW9kaWZpZXMgcHJvdmlkZXMgYWxsIHRoZSB0eXBlcyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgdGhlIFJvbGUgcHJvZHVjZXMgb3IgbW9kaWZpZXMgdmlhIG9uZSBvZiB0aGUgVGFza3MgZGVmaW5lZCB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIFJvbGUsIGVpdGhlciBhcyBwcmltYXJ5IG9yIGFkZGl0aW9uYWwgcGVyZm9ybWVyLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5emRadS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1vZGlmaWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSIgYXNzb2NpYXRpb249Il95eXpkWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZFotLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZGFPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5emRhZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHRfUmVzcG9uc2libGUiIG1lbWJlckVuZD0iX3l5emRhLS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRGLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkYXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlJlc3BvbnNpYmlsaXR5IGZvciBhIHdvcmsgcHJvZHVjdCBpbmRpY2F0ZXMgdGhlIHJvbGUncyBvd25lcnNoaXAgb2YgYWxsIGluc3RhbmNlcyBvZiB0aGlzIHdvcmsgcHJvZHVjdCB0eXBlLiAgRm9yIGV4YW1wbGUsIHRoZSByb2xlIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdCBhbnN3ZXJzIHRvIG1hbmFnZW1lbnQgYWJvdXQgaXRzIHF1YWxpdHkgc3RhdGUuICBCZWluZyByZXNwb25zaWJsZSBmb3IgdGhlIHdvcmsgcHJvZHVjdCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHJvbGUgaXMgdGhlIG9ubHkgb25lIG1vZGlmeWluZyBpdCwgYnV0IG1ha2VzIHVsdGltYXRlIGRlY2lzaW9ucyBhYm91dCBhY2NlcHRpbmcgb3IgcmVqZWN0aW5nIHRoZXNlIG1vZGlmaWNhdGlvbnMgd2hlbiByZXZpZXdpbmcgdGhlc2UgbW9kaWZpY2F0aW9ucy4gIEV2ZXJ5IHdvcmsgcHJvZHVjdCBoYXMgbm9uZSBvciBvbmUgcm9sZSByZXNwb25zaWJsZSByb2xlLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eXpkYS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZGFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRiTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRiZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPRU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X0FkZGl0aW9uYWxQZXJmb3JtZXIiIG1lbWJlckVuZD0iX3l5OU9FdS1zRWR1SDU5S1NIVjh2Z0EgX3l5emRKLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPRWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgYnkgZGVmYXVsdCBjYW4gYmUgYXNzaWduZWQgdG8gaGVscCBjb21wbGV0aW5nIGEgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJoZWxwc1BlcmZvcm1pbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5OU9FLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5OU9GTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb21wb3NpdGlvbiIgbWVtYmVyRW5kPSJfeXl6ZE9lLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9GdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPRmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QXJ0aWZhY3QgdHlwZXMgY2FuIGJlIGRlZmluZWQgdG8gYmUgcGh5c2ljYWxseSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBpcyBjb21wb3NlZCBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9GLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlZmF1bHREZWxpdmVyZWRXUCIgbWVtYmVyRW5kPSJfeXk5T0dlLXNFZHVINTlLU0hWOHZnQSBfeXl6ZFF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9HTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIHRoZSBkZWZhdWx0IHBhcnRzIG9mIGEgZGVsaXZlcmFibGUsIGkuZS4gdGhlIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMgYSBEZWxpdmVyYWJsZSBjb21wcmlzZXMgb2YuICBUaGlzIGFnZ3JlZ2F0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluIGEgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPR2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95eXpkUC0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXk5T0YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5OU9HdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5OU9HLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWZhdWx0X09wdGlvbmFsSW5wdXRzIiBtZW1iZXJFbmQ9Il95eXpkS3Utc0VkdUg1OUtTSFY4dmdBIF95eTlPSHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXk5T0hlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5OU9ITy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIGxpbmtzIHRvIHplcm8gb3IgbWFueSBkZWZpbml0aW9ucyBvZiBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYXMgb3B0aW9uYWwgaW5wdXRzIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzay48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPSHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0hPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5OU9ILS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5OU9JTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95eTlPSWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95eXpkTGUtc0VkdUg1OUtTSFY4dmdBIF95eTlPSS0tc0VkdUg1OUtTSFY4dmdBIiBpc0Rlcml2ZWQ9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPSXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgZGVyaXZlZCBhc3NvY2lhdGlvbiBpcyBhIHNob3J0Y3V0IGZvciBuYXZpZ2F0aW9uIGFsb25nIHRoZSBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzIENvbnRlbnRFbGVtZW50LnByZXNlbnRhdGlvbi5zZWN0aW9ucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95eTlPSS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l5OU9JZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l5OU9KTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l5emRULS1zRWR1SDU5S1NIVjh2Z0EgX3l5OU9KdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eTlPSmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gYWRkcyBhbiBvcHRpb25hbCBwcmUtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwcmUtY29uZGl0aW9uIGRlZmluZXMgYW55IGtpbmQgb2YgY29uc3RyYWludCB0aGF0IG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIHdvcmsgZGVzY3JpYmVkIGZvciB0aGUgV29yayBEZWZpbml0aW9uIGNhbiBzdGFydC4gRm9yIGV4YW1wbGUsIGEgcHJlLWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGFuIGlucHV0IFdvcmsgUHJvZHVjdCBuZWVkcyB0byBiZSBpbiBhIHNwZWNpZmljIHN0YXRlIG9yIHRoYXQgb3RoZXIgcmVsYXRlZCB3b3JrIG11c3QgYmUgaW4gYSBjZXJ0YWluIHN0YXRlIChlLmcuICdJbnB1dCBkb2N1bWVudCBYIGhhcyBiZWVuIHJldmlld2VkIGFuZCBzaWduZWQgYnkgY3VzdG9tZXIgQU5EIFRhc2sgJnF1b3Q7TWFuYWdlbWVudCBSZXZpZXcmcXVvdDsgaXMgY29tcGxldGUnKSBiZWZvcmUgdGhlIFRhc2sgY2FuIGJlZ2luLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXk5T0p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXk5T0pPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXk5T0otLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXl6ZFV1LXNFZHVINTlLU0hWOHZnQSBfeXk5T0tlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l5OU9LTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eTlPSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBjb21wb3NpdGlvbiBhc3NvY2lhdGlvbiBhZGRzIGFuIG9wdGlvbmFsIHBvc3QtY29uZGl0aW9uIHRvIGEgV29yayBEZWZpbml0aW9uLiAgQSBwb3N0LWNvbmRpdGlvbiBkZWZpbmVzIGFueSBraW5kIG9mIGNvbnN0cmFpbnQgdGhhdCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSB3b3JrIGRlc2NyaWJlZCBmb3IgdGhlIFdvcmsgRGVmaW5pdGlvbiBjYW4gYmUgZGVjbGFyZWQgY29tcGxldGVkIG9yIGZpbmlzaGVkIGFuZCB3aGljaCBvdGhlciBXb3JrIERlZmluaXRpb25zIG1pZ2h0IGRlcGVuZCB1cG9uIChlLmcuIGZvciB0aGVpciBwcmUtY29uZGl0aW9ucykuICBGb3IgZXhhbXBsZSwgYSBwb3N0LWNvbmRpdGlvbiBmb3IgYSBUYXNrIGNvdWxkIGRlZmluZSB0aGF0IGEgd29yayBwcm9kdWN0IGRlZmluZWQgdG8gYmUgdGhlIG91dHB1dCBtdXN0IGJlIGluIGEgc3BlY2lmaWMgc3RhdGUgYmVmb3JlIHRoZSBUYXNrIGNhbiBlbmQgKGUuZy4gJ1VzZSBDYXNlIG11c3QgYmUgaW4gc3RhdGUgZnVsbHkgZGVzY3JpYmVkIGFuZCByZXZpZXdlZCBieSBTeXN0ZW0gQW5hbHlzdCcpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l5OU9LZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il93b3JrRGVmaW5pdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZFRPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l5OU9KLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbmNlcHQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTQtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNoZWNrbGlzdCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS01ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtNU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDaGVja2xpc3QgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTV1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkV4YW1wbGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtNk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkFuIEV4YW1wbGUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTZlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS02dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ikd1aWRlbGluZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MS02LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95ejEtNnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBHdWlkZWxpbmUgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtN08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLTdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUmVwb3J0Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLTd1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS03ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTctLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS04Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRlbXBsYXRlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLThlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS04Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRlbXBsYXRlIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS04dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtOU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxLTllLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRvb2xNZW50b3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtOS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVG9vbCBNZW50b3IgaXMgYSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6MS0tTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95ejEtLWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJXaGl0ZXBhcGVyIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxLS11LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS0tZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5XaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtLS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXoxLTRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXoxLV9PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGVybURlZmluaXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95ejEtX2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXoxLV9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRlcm1EZWZpbml0aW9ucyBkZWZpbmUgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGhleSBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95ejEtX3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya1Byb2R1Y3QiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eXpkTWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PldvcmsgUHJvZHVjdCBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6MV9DTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZE11LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfQ2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXBvcnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtN2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dGdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95ejFfQ3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95ejFfQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6MV9ETy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRlbXBsYXRlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLThPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93SU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0RlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0R1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfRC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0b29sTWVudG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTl1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnNnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXoxX0VPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXoxX0VlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfRXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6X3ZfLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9FLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9GTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUYXNrIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXl6ZEctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxX0ZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l5emRITy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXl6ZEhlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkSHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3JtZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkVmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEgtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZElPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkSWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eXpkV3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZEktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkSk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvdXRwdXQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXl6ZFgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRKZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRKdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEotLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRFZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXk5T0VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l5emRLTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l5emRLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXl6ZEt1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95eTlPSE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXl6ZEstLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXl6ZExPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eXpkTGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGVwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZFNPLXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3l5OU9JZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eXpkTHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eXpkTC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y0Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRvb2xNZW50b3JzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92NGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92NHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXpfdl8tLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95MEpnN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjVPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjVlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el92X2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfdl9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUmV1c2FibGUgQXNzZXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6X3ZfdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95el92Xy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93QU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfdl8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l6X3dBZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkTS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93QXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93Qk8tc0VkdUg1OUtTSFY4dmdBIF95el92NS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0EtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiBiZSByZWxhdGVkIHRvIGFueSBudW1iZXIgb2YgU3VwcG9ydGluZyBNYXRlcmlhbCBndWlkYW5jZSBlbGVtZW50cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93Qk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY29udGVudEVsZW1lbnQiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dCZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dCdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93Qi0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93Q2Utc0VkdUg1OUtTSFY4dmdBIF95el92NnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0NPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Db250ZW50IEVsZW1lbnRzIGNhbiByZWZlciB0byBhbnkgbnVtYmVyIG9mIENvbmNlcHQgZ3VpZGFuY2UuIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dDZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93Qi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0N1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0MtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dEdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93RGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0RPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb3ZpZGVzIGNoZWNrIHBvaW50cyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBjb250ZW50IGVsZW1lbnRzLiAgVGhlc2UgYXJlIHR5cGljYWxseSB1c2VkIGluIHJldmlld3MgYW5kIGluc3BlY3Rpb25zIG9uIHdvcmsgcHJvZHVjdHMuCi0KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dEdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dETy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93RC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93RU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0VlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0UtLXNFZHVINTlLU0hWOHZnQSBfeXpfdjhPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dFdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93RWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBhY2Nlc3MgdG8gZGV0YWlsZWQgR3VpZGVsaW5lcyByZWxhdGVkIHRvIHRoaXMgQ29udGVudCBFbGVtZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3l6X3dFLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3l6X3dFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el93Rk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el93RmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeXpfd0Z1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXpfd0dPLXNFZHVINTlLU0hWOHZnQSBfeXoxX0NlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3dGLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95el93RnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSZXBvcnQgZXh0cmFjdHMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgV29yayBQcm9kdWN0OyBub3JtYWxseSBkaXJlY3RseSBmcm9tIGEgdG9vbCB0aGF0IG1haW50YWlucyB0aGUgV29yayBQcm9kdWN0cy4gRm9yIGV4YW1wbGUsIGEgUmVwb3J0IGNhbiBwcmVzZW50IGRldGFpbHMgb2YgYW4gQXJ0aWZhY3Qgb3IgYSBzZXQgb2YgQXJ0aWZhY3RzIGZvciB1c2UgaW4gYSB0ZWNobmljYWwgcmV2aWV3LiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93R08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93RnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0d1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dHLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dIZS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93SE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlByb3ZpZGVzIGEgc2FtcGxlIG9mIHdoYXQgdGhlIHdvcmsgcHJvZHVjdCBtYXkgbG9vayBsaWtlLCBhbiBhY3R1YWwgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0hlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeXpfd0ctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3dIdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3dILS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95el93SU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el93SXUtc0VkdUg1OUtTSFY4dmdBIF95ejFfRE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXpfd0llLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6X3dJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm92aWRlcyBkZXRhaWxlZCBndWlkYW5jZSBvbiBob3cgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0IGluZGVwZW5kZW50IG9mIGEgc3BlY2lmaWMgc2V0IG9mIHRhc2tzIG9yIFdCUy4gIE1heSBjb250YWluIHNwZWNpZmljIGFsZ29yaXRobXMgb3IgYWx0ZXJuYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2hlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93SXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfd29ya1Byb2R1Y3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93SU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0ktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0pPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dKZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3dKLS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3Y0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93SnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0plLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkxpbmtzIFRhc2tzIHdpdGggVG9vbCBNZW50b3JzIHdoaWNoIGFyZSBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93IGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIHBlcmZvcm0gdGhlIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeXpfd0otLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Rhc2siIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRHdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93SmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfd0tPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfd0tlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3l6X3dLdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6MV9BdS1zRWR1SDU5S1NIVjh2Z0EgX3l6X3dMTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95el93Sy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXpfd0t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJhY3RpY2UgY2FuIGJlIGNvbXBvc2VkIG9mIG90aGVyIFByYWN0aWNlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95el93TE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95el93S3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnNE8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95ejFfQmUtc0VkdUg1OUtTSFY4dmdBIF95MEpnNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTBKZzRlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kwSmc0Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByYWN0aWNlIGNhbiByZWZlcmVuY2UgYW55IENvbnRlbnQgRWxlbWVudC4gIFRoZSBhc3NvY2lhdGlvbiBleHByZXNzZXMgdGhhdCB0aGlzIENvbnRlbnQgRWxlbWVudCBpcyBwYXJ0IG9mIG9yIGJlbG9uZ3MgdG8gdGhpcyBQcmFjdGljZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnNHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJhY3RpY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95MEpnNE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTBKZzQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTBKZzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3l6X3Y5dS1zRWR1SDU5S1NIVjh2Z0EgX3kwSmc1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MEpnNXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTBKZzVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgd29yayBwcm9kdWN0IGlzIHJlbGF0ZWQgdG8gb25lIG9yIG1vcmUgYXNzZXRzIHRvIDwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kwSmc1LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb250ZW50RWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kwSmc1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnNk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnNmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzZ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeXoxX0QtLXNFZHVINTlLU0hWOHZnQSBfeTBKZzYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTBKZzZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmc3Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmc3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnN3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95MEpnNy0tc0VkdUg1OUtTSFY4dmdBIF95el92NC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnNy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGFzayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3kwSmc3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnOE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnOGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTBKZzh1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTBKZzgtLXNFZHVINTlLU0hWOHZnQSBfeXoxX0V1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTBKZzgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3dvcmtQcm9kdWN0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTBKZzh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kwSmc5Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kwSmc5ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95MEpnOXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95el92LWUtc0VkdUg1OUtTSFY4dmdBIF95MEpnOS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95MEpnOS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSIiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kwSmc5dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MEpnLU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MEpnLWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNQ3NPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQ3NlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kxTUM3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1Dc3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJicmllZk91dGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUNzLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1Dc3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN0Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN0dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQ3VPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUN0LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DdWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DdXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DdS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1Ddk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUN2ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUN2dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUN2LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN3Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im5vdGF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQ3dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ3d1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ3ctLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1DeE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1DeGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTFNQzdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUN4dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImV4dGVybmFsRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUN4LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DeHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DeU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DeWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DeXUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DeS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQ3pPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUN5LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DemUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DenUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1Dei0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUMwTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQzBlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DMHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJza2lsbHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUMwLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DMHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzF1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXNzaWdubWVudEFwcHJvYWNoZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUMyTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DMS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzJlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzItLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3lub255bXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUMzZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DM08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DM3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DMy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DNE8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUM0ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNQzR1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1DNC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwdXJwb3NlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DNU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQzQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUM1ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUM1dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUM1LS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUM2Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFsdGVybmF0aXZlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUM2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1DNnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1DNi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1DN08tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kxTUM3ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kxTUM3dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNQzhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUM3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQzhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQzh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQzgtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNQzlPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW1wYWN0T2ZOb3RIYXZpbmciIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUM5ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1DOU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTUM5dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTUM5LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTUMtTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTUMtZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlYXNvbnNGb3JOb3ROZWVkaW5nIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1DLXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNQy1lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNQy0tLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNQ19PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNQ19lLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95MU1DX3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95MU1DXy0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURBTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImF0dGFjaG1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1EQWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURBdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURBLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURCTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTFNREJlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTFNREJ1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1EQi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRENPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURCLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURDZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURDdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURDLS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURETy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2JsZW0iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTUREZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95MU1ERE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNRER1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREVPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREVlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYmFja2dyb3VuZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURFZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ERS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ERk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ERmUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ERnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJnb2FscyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREYtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURGdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURHTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURHZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURHdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURHLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFwcGxpY2F0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ESE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREgtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNRElPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibGV2ZWxzT2ZBZG9wdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNREllLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5Pk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTFNREl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTFNREktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeTFNREpPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3ZS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N2V1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kxTURKZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95eHc3Zk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhLZkN1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdmZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N2Z1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2YtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdmdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3Z08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3Z2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3Z3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3Zy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWLS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXh3N21lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdoTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdoZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNREp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2hhcGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ESi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kxTURLTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kxTURLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3kxTURLdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kxTURLLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im5vZGVpY29uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95MU1ETE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTFNREstLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ETGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ETHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ETC0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tpZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlJvbGVTZXQiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9raXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa2llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBTZXQgb3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgJnF1b3Q7QW5hbHlzdHMmcXVvdDsgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICZxdW90O0J1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCZxdW90OywgJnF1b3Q7U3lzdGVtIEFuYWx5c3QmcXVvdDssIGFzIHdlbGwgYXMgJnF1b3Q7UmVxdWlyZW1lbnRzIFNwZWNpZmllciZxdW90OyByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9raS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2tqTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9ramUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9ranUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa2otLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRG9tYWluIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa2tPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Eb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa2tlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9ra3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2trLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tsTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa2xlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViZG9tYWlucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2otLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa2x1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa2wtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2ttTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2ttZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rbU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBQcm9kdWN0IFR5cGUgaXMgYSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa211LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rbS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l5emRNTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3llLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2tuTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tuZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rbi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa29PLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2tvZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2tvdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rb2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa28tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rcE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaXNjaXBsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9renUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3BlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3B1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kyT2twLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRvb2wiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rcU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3AtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVG9vbCBpcyBhIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3kyT2txZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa3F1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idG9vbE1lbnRvcnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS05dS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2txLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2tyTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95Mk9rcmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rcnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3JlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rci0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2tzTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2syTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rc2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rc3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa3MtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rdE8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3MtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAmcXVvdDtUZXN0aW5nJnF1b3Q7IGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95Mk9rdGUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kyT2t0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdldS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2t0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2t1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTJPa3VlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3ViQ2F0ZWdvcmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa251LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa3V1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa3UtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kyT2t2dS1zRWR1SDU5S1NIVjh2Z0EgX3kyT2tqTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95Mk9rdmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTJPa3ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUm9sZSBTZXQgY2F0ZWdvcml6ZXMgbWFueSBSb2xlcyBhbmQgYSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBpbiBtYXkgUm9sZSBTZXRzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2t2dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVTZXRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9raWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rdi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rd08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3ctLXNFZHVINTlLU0hWOHZnQSBfeTJPa2t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t3dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rd2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEb21haW4gY2F0ZWdvcml6ZXMgbWFueSBXb3JrIFByb2R1Y3RzLiBBIFdvcmsgUHJvZHVjdCBiZWxvbmdzIGF0IG1vc3QgdG8gb25lIERvbWFpbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rdy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPa3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2t4Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2t4ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9reU8tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3gtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2t4dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Eb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBTdWJkb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyBvbmx5IHRvIGJlIGNhdGVnb3JpemVkIGF0IHRoZSBsZWFmLWxldmVsLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2t5Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kb21haW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tqLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95Mk9reHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9reWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9reS0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rbS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPa3l1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2t5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgemVybyBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9reS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdFR5cGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rek8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9remUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPa3p1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPazBPLXNFZHVINTlLU0hWOHZnQSBfeTJPa3BPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2t6LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9renUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBHcm91cGluZ3MgZ3JvdXAgbWFueSBEaXNjaXBsaW5lcy4gIEEgRGlzY2lwbGluZSBjYW4gYmUgaW4gbWFueSBEaXNjaXBsaW5lIEdyb3Vwcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rME8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaXNjaXBsaW5lR3JvdXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rb2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2t6dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rMGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazAtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPazFlLXNFZHVINTlLU0hWOHZnQSBfeTJPa3F1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2sxTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUb29sIE1lbnRvciBkZXNjcmliZXMgd29yayB3aXRoIGV4YWN0bHkgb25lIFRvb2wuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idG9vbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa3AtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rMC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazF1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazEtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rMk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rMnUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rc08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazJlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2syTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFJvbGUgU2V0IEdyb3VwaW5nIGNvbnRhaW5zIG1hbnkgUm9sZSBTZXRzLiBSb2xlIFNldHMgY2FuIGJlIGluIG1hbnkgUm9sZSBTZXQgR3JvdXBpbmdzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kyT2sydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVTZXRHcm91cHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tyZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTJPazJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kyT2syLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kyT2szTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rM2Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rdHUtc0VkdUg1OUtTSFY4dmdBIF95Mk9rMy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazN1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2szZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIEN1c3RvbUNhdGVnb3J5IGdyb3VwcyB0b2dldGhlciBhbnkgbnVtYmVyIG9mIENvbnRlbnRFbGVtZW50cyBpbmNsdWRpbmcgb3RoZXIgQ29udGVudENhdGVnb3J5LiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rMy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjdXN0b21DYXRlZ29yaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rcy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2szZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rNE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rNGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazR1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa3VlLXNFZHVINTlLU0hWOHZnQSBfeTJPazVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2s0LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDdXN0b21DYXRlZ29yeSBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIENvbnRlbnRDYXRlZ29yaWVzIGRlZmluZWQgYXMgbmVzdGVkIHN1YkNhdGVnb3JpZXMuICBUaGVyZWZvcmUsIG9uZSBjb3VsZCBuZXN0IEN1c3RvbUNhdGVnb3JpZXMgaW50byBuLWxldmVsIGhpZXJhcmNoaWVzLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rNU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfY3VzdG9tQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tzLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95Mk9rNHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPazVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPazV1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95Mk9rZy0tc0VkdUg1OUtTSFY4dmdBIF95Mk9rNmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTJPazZPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kyT2s1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5FdmVyeSBUYXNrIHNob3VsZCBiZSByZWxhdGVkIHRvIGV4YWN0bHkgb25lIERpc2NpcGxpbmUuICBGb3IgbGVnYWN5IHJlYXNvbnMgdGhpcyBpcyBub3QgZW5mb3JjZWQgKGUuZy4gR1MgTWV0aG9kIGRvZXMgbm90IGRlZmluZSBEaXNjaXBsaW5lcywgeWV0KS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95Mk9rNmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kyT2s1LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9rNnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9rNi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTJPazdPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTJPa2h1LXNFZHVINTlLU0hWOHZnQSBfeTJPazdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTJPazdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2Rpc2NpcGxpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tnTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95Mk9rN08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJTdGF0ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNSdFllLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kzYTNZLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M1J0WXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNSdFktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNSdFpPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNSdFplLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVnaW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzZWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kzYTNqZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M1J0WnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M1J0Wi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzUnRhTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1Ym1hY2hpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNYdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2p1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzUnRhZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzUnRhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUcmFuc2l0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzVWUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNVdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtEZWZpbml0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNoLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzVS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzVk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzVmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb250YWluZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2l1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNWdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNWLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNXTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNvdXJjZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1d1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTNhM1ctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGFyZ2V0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzWS0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNqTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzWE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzWGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzYTNYdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlN0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTNhM1gtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRUTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzWU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWdpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNlZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeTNhM2t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNZZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNZdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVmVydGV4Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzWk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNaZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM1p1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM1otLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzYU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvdXRnb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2FlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2F1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzYS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbmNvbWluZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1VPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2Ezak8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2JPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2JlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3kzYTNidS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBzZXVkb1N0YXRlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzYi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfeTNhM2NPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2NlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW5pdGlhbCIvPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95M2EzY3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJqb2luIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNjLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImZvcmsiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2RPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ianVuY3Rpb24iLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2RlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hvaWNlIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNkdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVudHJ5UG9pbnQiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfeTNhM2QtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXhpdFBvaW50Ii8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3kzYTNlTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRlcm1pbmF0ZSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTNhM2VlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUmVnaW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95M2EzZXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNlLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZlcnRleCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNhM1ktLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95M2EzaWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzZnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kzYTNpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95M2EzZi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95M2EzZ08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3kzYTNnZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M1J0WU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNqZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95M2EzZ3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGF0ZU1hY2hpbmUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kzYTNYdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTNhM2t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3kzYTNnLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3kzYTNoTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M1J0WXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95M2EzaHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNSdFlPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzaGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95M2EzaC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95M2EzVXUtc0VkdUg1OUtTSFY4dmdBIF95M2EzaU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95M2EzaU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0cmFuc2l0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95M2EzVU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3kzYTNoLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNpZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNlLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNaZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNpdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNmdS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNWZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNpLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNhTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNXTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNqTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNhLS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNXLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNqZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzUnRaZS1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNnZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNqdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzUnRhTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNqLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3kzYTNqLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN1Yk1hY2hpbmVTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTNSdFlPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95M2EzanUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTNhM2tPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTNhM2tlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3kzYTNrdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3kzYTNZTy1zRWR1SDU5S1NIVjh2Z0EgX3kzYTNndS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZFBhY2thZ2UiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBTXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95NGVBTS0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k0ZUFOTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQU5lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ2xvYmFsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NGVBTnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTRlQU5lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTRlQU4tLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQU9PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTRlQVNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFPZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFPdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQU8tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95NGVBVHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVBPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVBlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k0ZUFQdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQVAtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFQdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k0ZUFRTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95NGVBTWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTRlQVFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGVudEVsZW1lbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3k0ZUFSTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NGVBUXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NGVBUS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTRlQVJPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTRlQVFlLXNFZHVINTlLU0hWOHZnQSBfeTRlQVJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFSZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBUk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBDb250ZW50IFBhY2thZ2UgY29udGFpbnMgQ29udGVudCBFbGVtZW50cy4gIEEgQ29udGVudCBFbGVtZW50IGluc3RhbmNlIGNhbiBiZSBwYXJ0IG9mIG9ubHkgb25lIHBhY2thZ2UgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTRlQVJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbnRlbnRQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95NGVBUHUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTRlQVJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k0ZUFSLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k0ZUFTTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTRlQVNlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTRlQVMtLXNFZHVINTlLU0hWOHZnQSBfeTRlQU9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k0ZUFTdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NGVBU2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgYSBkZXBlbmRlbmN5IGJldHdlZW4gdGhlIHR3byBwYWNrYWdlcyBpdCBjb25uZWN0cy4gIFRoZSBwYWNrYWdlIGF0IHRoZSB1c2luZ1BhY2thZ2UgZW5kIGRlcGVuZHMgb24gdGhlIHBhY2thZ2UgYXQgdGhlIHJldXNlZFBhY2thZ2UgZW5kLiAgRm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgaW4gdGhlIGZvcm1lciBwYWNrYWdlIGlzIHVzaW5nIGFuIGVsZW1lbnQgaW4gdGhlIGxhdGVyIGluIGEgcmVsYXRpb25zaGlwIHN1Y2ggYXMgYSBUYXNrIGlzIHVzaW5nIGEgV29yayBQcm9kdWN0cyBhcyBhbiBpbnB1dC4gIFJlZmxleGl2ZSByZXVzZWRQYWNrYWdlIGxpbmtzIChpLmUuIGEgcGFja2FnZSB0aGF0IGRlcGVuZHMgb24gaXRzZWxmKSBhcmUgbm90IGFsbG93ZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTRlQVMtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idXNpbmdQYWNrYWdlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NGVBU2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVRPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVRlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBhY2thZ2VOZXN0aW5nIiBtZW1iZXJFbmQ9Il95NGVBVU8tc0VkdUg1OUtTSFY4dmdBIF95NGVBTy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTRlQVQtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k0ZUFUdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5NZXRob2QgUGFja2FnZXMgY2FuIGJlIG5lc3RlZCwgaS5lLiBhIHBhY2thZ2UgY2FuIGJlIHBhcnQgb2YgYW5vdGhlciBwYWNrYWdlLiAgTmVzdGVkIHBhY2thZ2VzIGRvIG5vdCBuZWVkIHRvIGJlIG9mIHRoZSBzYW1lIHR5cGUsIGUuZy4gYSBDb250ZW50IFBhY2thZ2UgY2FuIGJlIGRlZmluZWQgaW5zaWRlIGEgUHJvY2VzcyBQYWNrYWdlIChkZWZpbmUgZm9yIHRoZSBQcm9jZXNzIHBhcnQgb2YgdGhpcyBtb2RlbCkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTRlQVVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZFBhY2thZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NGVBVHUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTRlQVVlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTRlQVV1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3bU10LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1pbGVzdG9uZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3bU11Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21NdC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU11ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N21NdXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJJdGVyYXRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N21NdS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXV1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pkl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21Ndk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTdtTXZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUGhhc2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N21NdnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU12LS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3bU13ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBUZWFtIFByb2ZpbGUgaXMgYSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTdtTXd1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N21Ndy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0ZWFtUm9sZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTd2WE8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3bU14Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3bU14ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTdtTXh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VwZXJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N21NeC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N21NeU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N21NeWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJUZWFtIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nd08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N21NeXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N21NeS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfeTd2V29PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldvZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXb08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBPcmRlciByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEIpIGJlbG93KSBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCAocmVmZXJyZWQgdG8gYXMgKEEpIGJlbG93KSBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il95N3ZXb3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJmaW5pc2hUb1N0YXJ0Ij4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXby0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V291LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgYW5kICZxdW90O1BhaW50IGZlbmNlLCZxdW90OyAmcXVvdDtQYWludCBmZW5jZSZxdW90OyBjYW4ndCBzdGFydCB1bnRpbCAmcXVvdDtDb25zdHJ1Y3QgZmVuY2UmcXVvdDsgZmluaXNoZXMuIFRoaXMgaXMgdGhlIG1vc3QgY29tbW9uIHR5cGUgb2YgZGVwZW5kZW5jeSBhbmQgdGhlIGRlZmF1bHQgZm9yIGEgbmV3IFdvcmsgT3JkZXIgaW5zdGFuY2UuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3k3dldwTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImZpbmlzaFRvRmluaXNoIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXcGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3BPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBmaW5pc2ggdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIGZpbmlzaGVzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBhbmQgJnF1b3Q7SW5zcGVjdCBlbGVjdHJpY2FsLCZxdW90OyAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwmcXVvdDsgY2FuJ3QgZmluaXNoIHVudGlsICZxdW90O0FkZCB3aXJpbmcmcXVvdDsgZmluaXNoZXMuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3k3dldwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXJ0VG9TdGFydCI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3AtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dldwdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBhbmQgJnF1b3Q7TGV2ZWwgY29uY3JldGUsJnF1b3Q7ICZxdW90O0xldmVsIGNvbmNyZXRlJnF1b3Q7IGNhbid0IGJlZ2luIHVudGlsICZxdW90O1BvdXIgZm91bmRhdGlvbiZxdW90OyBiZWdpbnMuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3k3dldxTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXJ0VG9GaW5pc2giPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldxZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBUaGlzIGRlcGVuZGVuY3kgdHlwZSBjYW4gYmUgdXNlZCBmb3IganVzdC1pbi10aW1lIHNjaGVkdWxpbmcgdXAgdG8gYSBtaWxlc3RvbmUgb3IgdGhlIHByb2plY3QgZmluaXNoIGRhdGUgdG8gbWluaW1pemUgdGhlIHJpc2sgb2YgYSBCcmVha2Rvd24gRWxlbWVudCBmaW5pc2hpbmcgbGF0ZSBpZiBpdHMgZGVwZW5kZW50IEJyZWFrZG93biBFbGVtZW50cyBzbGlwLiBJZiBhIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGUgbWlsZXN0b25lIG9yIHByb2plY3QgZmluaXNoIGRhdGUsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBleGFjdGx5IHdoZW4gYW5kIHlvdSBkb24ndCB3YW50IGEgbGF0ZSBmaW5pc2ggdG8gYWZmZWN0IHRoZSBqdXN0LWluLXRpbWUgQnJlYWtkb3duIEVsZW1lbnQsIHlvdSBjYW4gY3JlYXRlIGFuIFNGIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgQnJlYWtkb3duIEVsZW1lbnQgeW91IHdhbnQgc2NoZWR1bGVkIGp1c3QgaW4gdGltZSAodGhlIHByZWRlY2Vzc29yKSBhbmQgaXRzIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnQgKHRoZSBzdWNjZXNzb3IpLiBUaGVuIGlmIHlvdSB1cGRhdGUgcHJvZ3Jlc3Mgb24gdGhlIHN1Y2Nlc3NvciBCcmVha2Rvd24gRWxlbWVudCwgaXQgd29uJ3QgYWZmZWN0IHRoZSBzY2hlZHVsZWQgZGF0ZXMgb2YgdGhlIHByZWRlY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dldxdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IldvcmtPcmRlciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dldxLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+V29yayBPcmRlciBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi0oTm90ZSwgV29yayBPcmRlciBpcyBub3QgbW9kZWxlZCBhcyBhbiBBc3NvY2lhdGlvbiBDbGFzcyB0byBwcm92aWRlIGEgc3RyYWlnaHRmb3J3YXJkIG1hcHBpbmcgIHRvIFhNSSBhbmQgRU1GLikKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZXck8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dldyZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxpbmtUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXb08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXcnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3JlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dldyLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZpbmlzaFRvU3RhcnQ8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXc08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXc2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXc3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dldzLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld0Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXcy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+UGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dld0ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZYT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3RhcnREYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXdC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3R1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXdU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJmaW5pc2hEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXdWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3VPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmFuayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3UtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld1dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3ZlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5CcmVha2Rvd24gRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2V3YtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXd08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVmaXgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dld3ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXd08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAmcXVvdDtTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyZxdW90OyB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAmcXVvdDtTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMmcXVvdDsgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgJnF1b3Q7Q3VzdG9tZXIuQXJjaGl0ZWN0JnF1b3Q7IHdvdWxkIGRlZmluZSBhICZxdW90O0N1c3RvbWVyJnF1b3Q7IHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAmcXVvdDtBcmNoaXRlY3QmcXVvdDsgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dld3dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dld3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3k3dld4Ty1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dld4ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzUGxhbm5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3h1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLQotCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2V3gtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PnRydWU8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXeU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXeWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2V3lPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2V3l1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNPcHRpb25hbCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2V3pPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dld5LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfeTd2V3plLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PmZhbHNlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2V3p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGVkQWZ0ZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SG91LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dld6LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlcwTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzBlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlc2VudGVkQmVmb3JlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXMHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXMC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlcxTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBsYW5uaW5nRGF0YSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3MtLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzFlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXMS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBlckFjdGl2aXRpZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlcyTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlcyZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGVzY3JpcHRvciIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlcyLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEZXNjcmlwdG9yIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiAKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlczTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzNlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dlczdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3dlc0Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlc0ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2VzR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icm9sZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEVlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIc2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2VzQtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2VzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXNWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtb2RpZmllcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgaXNEZXJpdmVkPSJ0cnVlIiBhc3NvY2lhdGlvbj0iX3k3NUh6Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXNXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXNS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc2Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXNmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXNnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZXN08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgVGFzayBEZXNjcmlwdG9yIGlzIGEgRGVzY3JpcHRvciBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi0KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlc3ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTd2Vzd1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlhLZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXNy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0YXNrIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkR3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhwLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXOE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXOGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc4dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXOC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZXOU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlc5ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFzc2lzdGVkQnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlczLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlc5dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlc5LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2Vy1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVId08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2Vy1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2Vy11LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXLS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2V19PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2V19lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZXX3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJvcHRpb25hbElucHV0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZXXy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYQU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhBZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im91dHB1dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEF1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEEtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYQk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzMtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVINE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEJlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYQi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzZWxlY3RlZFN0ZXBzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pCWjZDLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYQ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYQ2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WEMtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N3ZYRE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2VzJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhEZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WER1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhEZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhELS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3k3dlhFZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhFdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYRS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEV1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYRk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYRmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95N3ZYRnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYRi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZE1PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIck8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYR3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbXBhY3RlZEJ5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYQ3Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYRy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYSE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhIZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImltcGFjdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3dlhIdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3dlhILS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WElPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVsaXZlcmFibGVQYXJ0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WEllLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WEl1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlhJLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYSk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlhKZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WEp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eXpkRWUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg2dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95N3ZYSi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95N3ZYS08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYS3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBpcyBhIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlhLLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N3ZXdk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTd2WExPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNSZXBlYXRhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYTGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WExPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3k3dlhMdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3k3dlhMLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzT25nb2luZyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WE1PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhMLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZYTWUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYTXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95N3ZYTS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTd2WE11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotCi0KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il95N3ZYTk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+ZmFsc2U8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N3ZYTmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3F1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVILU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WE51LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WE4tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WE9lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhPTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAKLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3dlhPdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZYUGUtc0VkdUg1OUtTSFY4dmdBIF95N21Ndy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTd2WFBPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3dlhPLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFnZ3JlZ2F0aW9uIGFzc29jaWF0aW9uIHNwZWNpZmllcyB0aGUgcm9sZXMgb2YgdGVhbSBtZW1iZXJzIHdpdGggUm9sZSBEZXNjcmlwdG9ycy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95N3ZYUGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGVhbVByb2ZpbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU13Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95N3ZYTy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTd2WFB1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTd2WFAtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhvTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3bU14dS1zRWR1SDU5S1NIVjh2Z0EgX3k3bU15ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIb2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SG9PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVsYXRlcyBhIFN1Yi1UZWFtIHRvIGl0cyBTdXBlci1UZWFtLCBpLmUuIHRoZSBUZWFtIHRoYXQgaXQgaXMgcGFydCBvZi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhvdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dld6dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUhwTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIby0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SG91LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyIGlzIHJlZHVuZGFudCB0byB0aGUgYXNzb2NpYXRpb24gcHJlc2VudGVkQmVmb3JlLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHBPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NzVIb3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHBlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhwLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3NUhxZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIcU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFRhc2sgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb24gVGFzay4gIEhvd2V2ZXIsIGEgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzLiAgSW4gdGhlIFVNQSBQcm9maWxlIHRoaXMgYXNzb2NpYXRpb24gaXMgaW5zdGFudGlhdGVkIGJ5IGEgZGVwZW5kZW5jeSByZWxhdGlvbnNoaXAgd2l0aCBhIHRyYWNlIHN0ZXJlb3R5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUhxdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUhxLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIck8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95NzVIcnUtc0VkdUg1OUtTSFY4dmdBIF95N3ZYRi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHJlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUhyTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBjb3JlIGNvbnRlbnQgZWxlbWVudCBpdCByZWZlcnMgdG8uICBFdmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFdvcmsgUHJvZHVjdC4gIEhvd2V2ZXIsIGEgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUhydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IndvcmtQcm9kdWN0RGVzY3JpcHRvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIck8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SHItLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SHNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUhzZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3NUhzLS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlc0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIc3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGRlc2NyaXB0b3IgdG8gdGhlIGNvcmUgY29udGVudCBlbGVtZW50IGl0IHJlZmVycyB0by4gIEV2ZXJ5IFJvbGUgRGVzY3JpcHRvciBjYW4gcmVmZXJlbmNlIG9ubHkgb25lIFJvbGUuICBIb3dldmVyLCBhIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycy4gIEluIHRoZSBVTUEgUHJvZmlsZSB0aGlzIGFzc29jaWF0aW9uIGlzIGluc3RhbnRpYXRlZCBieSBhIGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwIHdpdGggYSB0cmFjZSBzdGVyZW90eXBlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUhzLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUhzZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIdE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIdGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybXMiIG1lbWJlckVuZD0iX3k3dlc4dS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh1Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIdC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SHR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBzcGVjaWZpZXMgZGVzY3JpcHRvcnMgZm9yIGFkZGl0aW9uYWwgcm9sZXMgbmVjZXNzYXJ5IHRvIGNvbXBsZXRlIHRoZSByZWZlcnJlZCBUYXNrLiAgSW5zdGFuY2VzIG9mIHRoZXNlIHJvbGVzIHdvdWxkIHNob3cgdXAgYXMgc2NoZWR1bGVkIHJlc291cmNlcyBvbiBhIGNvcnJlc3BvbmRpbmcgcHJvamVjdCBwbGFuIGdlbmVyYXRlZCBmcm9tIHRoaXMgc3RydWN0dXJlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3k3NUh1Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InBlcmZvcm1zQWRkaXRpb25hbGx5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIdWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIdXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQXNzaXN0cyIgbWVtYmVyRW5kPSJfeTd2VzllLXNFZHVINTlLU0hWOHZnQSBfeTc1SHZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh2Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIdS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyBzcGVjaWZpYyB0byBhIHByb2Nlc3MsIGkuZS4gbm8gZGVmYXVsdHMgaGF2ZSBiZWVuIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBhZGRpdGlvbmFsIHJvbGVzIHRoYXQgbWF5IHByb3ZpZGUgaW5mb3JtYXRpb24gb3IgYXNzaXN0YW5jZSBoZWxwZnVsLCBidXQgbm90IG1hbmRhdG9yeSB0byB0aGUgY29tcGxldGlvbiBvZiB0aGUgVGFzay4gIEluc3RhbmNlcyBvZiB0aGVzZSByb2xlcyB3b3VsZCBub3Qgc2hvdyB1cCBhcyBzY2hlZHVsZWQgcmVzb3VyY2VzIG9uIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIdmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhc3Npc3RzSW4iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh2dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUh2LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVId08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJFeHRlcm5hbElucHV0IiBtZW1iZXJFbmQ9Il95N3ZXLU8tc0VkdUg1OUtTSFY4dmdBIF95NzVId3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SHdlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUh3Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGlzIHNwZWNpZmljIHRvIGEgcHJvY2VzcywgaS5lLiBubyBkZWZhdWx0cyB3aWxsIGJlIGRlZmluZWQgaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgc3BlY2lmaWVzIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHVzZWQgYXMgaW5wdXRzIHRoYXQgYXJlIG5vdCBwcm9kdWNlZCBieSBUYXNrcyB3aXRoaW4gdGhlIHNhbWUgUHJvY2VzcywgYnV0IGJ5IGFub3RoZXIgZXh0ZXJuYWwgcHJvY2VzcyBvciBhbiB1bmtub3duIHNvdXJjZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVId3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SHdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh3LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUh4Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJJbXBhY3RzRGVwZW5kZW5jeSIgbWVtYmVyRW5kPSJfeTd2WEd1LXNFZHVINTlLU0hWOHZnQSBfeTd2WEhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh4dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIeGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNlbWktZm9ybWFsbHkgc3BlY2lmeSB0cmFjZWFiaWxpdHkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFdvcmsgUHJvZHVjdHMgd2l0aGluIHRoZSBzY29wZSBvZiBhbiBBY3Rpdml0eS4gIEEgbGluayBmcm9tIG9uZSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciB0byBhbm90aGVyIGluZGljYXRlcyB0aGF0IG9uZSBXb3JrIFByb2R1Y3QgaXMgcmVxdWlyZWQgYXMgaW5wdXQgdG8gYSBUYXNrIHRoYXQgcHJvZHVjZXMgdGhlIHJlbGF0ZWQgV29yayBQcm9kdWN0ICgnaW1wYWN0cycgcm9sZSBlbmQpLiAgSXQgd291bGQgYWxzbyBtZWFuIHRoYXQgYSBjaGFuZ2Ugb24gb25lIFdvcmsgUHJvZHVjdCBpbnN0YW5jZSBtYXkgYWZmZWN0IGEgY2hhbmdlIG9uIHRoZSByZWxhdGVkIHByb2R1Y3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgbWVtYmVyRW5kPSJfeTd2Vy0tLXNFZHVINTlLU0hWOHZnQSBfeTc1SHllLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh5Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIeC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBtYXBzIHRvIHRoZSByZXNwZWN0aXZlIGFzc29jaWF0aW9uIGluIENvcmUgQ29udGVudCBFbGVtZW50cy4gIEl0IHBvaW50cyB0byBkZXNjcmlwdG9ycyBmb3IgV29yayBQcm9kdWN0cyB0aGF0IGFyZSBtYW5kYXRvcnkgZm9yIHRoZSBUYXNrIHRvIGJlIHBlcmZvcm1lZC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVIeWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtYW5kYXRvcnlJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUh4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIeXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIeS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SHpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTW9kaWZpZXMiIG1lbWJlckVuZD0iX3k3dlc1ZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUh6dS1zRWR1SDU5S1NIVjh2Z0EiIGlzRGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUh6ZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVIek8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBkZXJpdmVkIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIE1vZGlmaWVzIGFzc29jaWF0aW9uIGRlZmluZWQgYmV0d2VlbiBXb3JrIFByb2R1Y3RzIGFuZCBUYXNrcyBpbiBDb3JlIE1ldGhvZCBDb250ZW50LiAgVGhlIHNhbWUgZGVyaXZhdGlvbiBydWxlIGFzIGZvciB0aGUgY29yZSBjb250ZW50IGVsZW1lbnRzIGFwcGxpZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SHp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3JvbGVEZXNjcmlwdG9yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeTc1SHpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUh6LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUgwTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVIMGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJPcHRpb25hbElucHV0IiBtZW1iZXJFbmQ9Il95NzVIMC0tc0VkdUg1OUtTSFY4dmdBIF95N3ZXX3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDB1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG9wdGlvbmFsIGZvciB0aGUgVGFzayB0byBiZSBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDAtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXNi0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgwZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIMU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIMWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDF1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iT3V0cHV0IiBtZW1iZXJFbmQ9Il95NzVIMk8tc0VkdUg1OUtTSFY4dmdBIF95N3ZYQWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTc1SDEtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3NUgxdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIG1hcHMgdG8gdGhlIHJlc3BlY3RpdmUgYXNzb2NpYXRpb24gaW4gQ29yZSBDb250ZW50IEVsZW1lbnRzLiAgSXQgcG9pbnRzIHRvIGRlc2NyaXB0b3JzIGZvciBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIG91dHB1dHMgZm9yIHBlcmZvcm1pbmcgdGhlIHJlZmVycmVkIFRhc2suPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3V0cHV0RnJvbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95NzVIMXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDJlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUgyLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlBhY2thZ2VkV1AiIG1lbWJlckVuZD0iX3k3NUgzZS1zRWR1SDU5S1NIVjh2Z0EgX3k3dlhJTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIM08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PklmIGEgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgcmVmZXJzIGF0IHRoZSAnZGVsaXZlcmFibGUnIHJvbGUgZW5kIHRvIGEgRGVsaXZlcmFibGUgV29yayBQcm9kdWN0IHRoZW4gdGhpcyBhc3NvY2lhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIERlbGl2ZXJhYmxlJ3MgV29yayBQcm9kdWN0IHBhcnRzLiAgQXMgaW5kaWNhdGVkIGZvciBEZWxpdmVyYWJsZSBpbiB0aGUgQ29yZSBNZXRob2QgQ29udGVudCBwYWNrYWdlLCB0aGlzIGFzc29jaWF0aW9uIG92ZXJyaWRlcyB0aGUgJ2RlbGl2ZXJlZFdvcmtQcm9kdWN0cycgYXNzb2NpYXRpb24gb2YgdGhlIFdvcmsgUHJvZHVjdCwgd2hpY2ggc3RvcmVzIHRoZSByZWNvbW1lbmRlZCBkZWxpdmVyYWJsZSBwYXJ0cywgYnV0IGNhbiBiZSBjdXN0b21pemVkIGZvciBldmVyeSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvci4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDNlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGVsaXZlcmFibGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhDdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDItLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUgzdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUgzLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVINE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcmltYXJ5UGVyZm9ybXMiIG1lbWJlckVuZD0iX3k3dlhCTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg0dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVINGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gbWFwcyB0byB0aGUgcmVzcGVjdGl2ZSBhc3NvY2lhdGlvbiBpbiBDb3JlIENvbnRlbnQgRWxlbWVudHMuICBJdCBwb2ludHMgdG8gYSBkZXNjcmlwdG9yIGZvciB0aGUgb25lIHJvbGUgcmVzcG9uc2libGUgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSB0YXNrLiAgQW4gaW5zdGFuY2Ugb2YgdGhpcyByb2xlIHdvdWxkIHNob3cgdXAgYXMgYSBzY2hlZHVsZWQgcmVzb3VyY2Ugb24gYSBjb3JyZXNwb25kaW5nIHByb2plY3QgcGxhbiBnZW5lcmF0ZWQgZnJvbSB0aGlzIHN0cnVjdHVyZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVINHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwZXJmb3Jtc0FzT3duZXIiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTc1SDRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3k3NUg0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3k3NUg1Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95NzVINWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSZXNwb25zaWJsZSIgbWVtYmVyRW5kPSJfeTd2VzZPLXNFZHVINTlLU0hWOHZnQSBfeTc1SDUtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUg1dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVINWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiByZXByZXNlbnRzIHJlc3BvbnNpYmlsaXR5IGZvciBXb3JrIFByb2R1Y3QgaW5zdGFuY2VzLiAgSXQgaW5kaWNhdGVzIG93bmVyc2hpcCBhbmQgZm9yIGV4YW1wbGUgd291bGQgZGVmaW5lIHRoZSBSb2xlIHRoYXQgYW5zd2VycyB0byBtYW5hZ2VtZW50IHF1ZXN0aW9ucyBhYm91dCB0aGUgcXVhbGl0eSB3b3JrIHByb2R1Y3QuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVzcG9uc2libGVSb2xlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXMy0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg1ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVINk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVINmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SDZ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2WEp1LXNFZHVINTlLU0hWOHZnQSBfeTc1SDYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2NvbXBvc2l0ZVJvbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlhJLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NzVINnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDdPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDdlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUg3dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dlcwZS1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg4Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVINy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkJyZWFrZG93biBzdHJ1Y3R1cmVzIGFyZSBuZXN0ZWQgc3RydWN0dXJlcyAoc2VlIHN1cGVyQWN0aXZpdGllcyBhc3NvY2lhdGlvbikgcHJlc2VudGVkIG5vcm1hbGx5IGFzIGluZGVudGVkIGxpc3RzLiAgV2l0aGluIHRoaXMgbmVzdGluZyBjaGlsZHJlbiBvbiB0aGUgc2FtZSBsZXZlbCBhcmUgbm90IHNwZWNpZmljYWxseSBvcmRlcmVkLiAgSG93ZXZlciwgYSB1c2VyIG9mIHRoZXNlIGRhdGEgc3RydWN0dXJlcyB3b3VsZCBleHBlY3QgdG8gb3JkZXIgZWxlbWVudHMgd2l0aGluIGEgbGlzdC4gIFRoaXMgYXNzb2NpYXRpb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlc2VudGF0aW9uIHNlcXVlbmNlIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEJlZm9yZSBpcyByZWR1bmRhbnQgdG8gdGhlIGFzc29jaWF0aW9uIHByZXNlbnRlZEFmdGVyLiAgVGhpcyByZWR1bmRhbmN5IGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgUHJvY2VzcyBDb250cmlidXRpb25zIChzZWUgcGx1Z2lucykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDhPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95NzVIN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTc1SDhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTc1SDh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3k3dldzTy1zRWR1SDU5S1NIVjh2Z0EgX3k3NUg5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95NzVIOU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTc1SDgtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGFzc29jaWF0aW9uIGxpbmtzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCB0byBpdHMgc3VjY2Vzc29yIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeTc1SDllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibGlua1RvU3VjY2Vzc29yIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZXcXUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUg4LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVIOXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIOS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeTc1SC1PLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTc1SC11LXNFZHVINTlLU0hWOHZnQSBfeTd2WE5lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3k3NUgtZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95NzVILU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBsaW5rcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdG8gaXRzIHByZWRlY2Vzc29yLiAgRXZlcnkgV29yayBCcmVha2Rvd24gRWxlbWVudCBjYW4gaGF2ZSBwcmVkZWNlc3NvciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHRvIGl0LiAgU3BlY2lmaWMgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgV29yayBPcmRlciwgd2hpY2ggZGVmaW5lcyB0aGUga2luZCBvZiBwcmVkZWNlc3NvciBhbm90aGVyIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgcmVwcmVzZW50cyBmb3IgYW5vdGhlci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95NzVILXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWNjIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N3ZYS2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3k3NUgtTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95NzVILS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95NzVIX08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3ktNEtNZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEZWxpdmVyeSBQcm9jZXNzZXMgaXMgYSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3ktNEtNdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S00tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVQTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLTk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLTmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtOdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLTi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeS00S1AtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLUU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeS00S1AtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeS00S1FlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLUXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVMLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLUS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLUk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeS00S1JlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUm9hZG1hcCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3ktNEtSdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95LTRLUmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBSb2FkbWFwIGlzIGEgc3BlY2lhbCBHdWlkYW5jZSBUeXBlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95LTRLUi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXl6ZE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGlzY2lwbGluZSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3kyT2tnZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVJTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+RGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIFRhc2tzIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuICBUaGlzIGlzIHRoZSBleHRlbnNpb25zIG9mIERpc2NpcGxpbmUgZGVmaW5lZCBpbiB0aGUgTWV0aG9kIENvcmUgcGFja2FnZSBhZGRpbmcgYW4gYWRkaXRpb25hbCBhc3NvY2lhdGlvbiB0byBBY3Rpdml0aWVzLCB3aGljaCByZXByZXNlbnQgdHlwaWNhbCBzdGFuZGFyZCBvciByZWZlcmVuY2Ugd2F5cyBvZiBtZWFuaW5nZnVsIGdyb3VwaW5ncyBvZiB0aGUgRGlzY2lwbGluZSdzIFRhc2tzIGludG8gd29ya2Zsb3dzLgotVGFza3MgcmVwcmVzZW50IGRlc2NyaXB0aW9ucyBvZiB3b3JrLCB3aGljaCBhcmUgY2F0ZWdvcml6ZWQgYnkgRGlzY2lwbGluZXMuICBUaGUgcmVhc29uIHRoYXQgc2V2ZXJhbCBUYXNrcyBhcmUgYWxsIGNhdGVnb3JpemVkIGJ5IHRoZSBzYW1lIERpc2NpcGxpbmUgaXMgdGhhdCB0aGV5IGFsbCByZXByZXNlbnQgYSBwYXJ0IGluIGFjaGlldmluZyBhIGhpZ2hlciBnb2FsIG9yIHBlcmZvcm1pbmcgd29yayB0aGF0IGlzIGFsbCByZWxhdGVkIHRvIGVhY2ggb3RoZXIuICBFdmVyeSBEaXNjaXBsaW5lIGRlZmluZXMgc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBpdCBjYXRlZ29yaXplcy4gIFN1Y2ggc3RhbmRhcmQgd2F5cyBhcmUgZXhwcmVzcyBieSBBY3Rpdml0aWVzIG9yIENhcGFiaWxpdHkgUGF0dGVybnMgZGVmaW5pbmcgaG93IHRoZSBUYXNrcyBjYXRlZ29yaXplZCBieSB0aGUgRGlzY2lwbGluZSAnd29yayB0b2dldGhlcicgaW4gdGhlIG1vc3QgZ2VuZXJpYyB3YXkuICBUaGVzZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGFyZSBvZnRlbiB1c2VkIGZvciBlZHVjYXRpbmcgYW5kIHRlYWNoaW5nIHByYWN0aXRpb25lcnMuIAotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeTJPa2d1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9rZy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ0YXNrcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXl6ZEd1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95Mk9rNS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTJPa2hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTJPa2hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95Mk9raHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJkaXNjaXBsaW5lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rZ08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3kyT2s3Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95Mk9raC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95Mk9raU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3lfQlVJZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZmVyZW5jZVdvcmtmbG93cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVU08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVUl1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVUktLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByYWN0aWNlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXoxX0FPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByYWN0aWNlIHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAmcXVvdDtNYW5hZ2UgUmlza3MmcXVvdDssICZxdW90O0NvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSZxdW90OywgJnF1b3Q7QXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCZxdW90OywgZXRjLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfeXoxX0FlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l5emRNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95ejFfQXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJQcmFjdGljZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fLS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXpfd0t1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9BLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9CTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXoxX0JlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdWTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzRPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6MV9CdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6MV9CLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeV9CVUpPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWN0aXZpdHlSZWZlcmVuY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVUZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVSmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVSnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeV9CVUotLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVS08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVUotLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3lfQlVLZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVS3Utc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLUE8tc0VkdUg1OUtTSFY4dmdBIF95X0JVTE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVUstLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVLdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIHRyYWNlYWJpbGl0eSBmb3IgYSBQcm9jZXNzIGRvY3VtZW50aW5nIHdoaWNoIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSBiZWVuIHVzZWQgZm9yIGRlZmluaW5nIHRoZSBwcm9jZXNzLiAgSXQgZG9jdW1lbnRzIGFwcGxpY2F0aW9ucyBvZiBhIHBhdHRlcm4gdGhyb3VnaCBjb3B5IGFzIHdlbGwgYXMgcGF0dGVybiBiaW5kaW5nLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVMTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVUt1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVMZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVMdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVTC0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLUXUtc0VkdUg1OUtTSFY4dmdBIF95X0JVTWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVU1PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVMLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5JZiB0aGUgUGxhbiBoYXMgYmVlbiBjcmVhdGVkIGJhc2VkIG9uIG9uZSBvciBtb3JlIHByb2Nlc3NlcyAoaS5lLiBvdGhlciBQbGFucywgQ2FwYWJpbGl0eSBQYXR0ZXJucywgYSBEZWxpdmVyeSBQcm9jZXNzLCBvciBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UpLCB0aGVuIHRoaXMgYXNzb2NpYXRpb24gY2FwdHVyZXMgYSB0cmFjZSBiYWNrIHRvIHRoZXNlIHNvdXJjZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVU1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLUC0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVUwtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVNdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVNLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95N3ZXMU8tc0VkdUg1OUtTSFY4dmdBIF95X0JVTnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVU5lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVOTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGUgUGxhbm5pbmdEYXRhIGNsYXNzIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVU51LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2JyZWFrZG93bkVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVTk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVTi0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLU2Utc0VkdUg1OUtTSFY4dmdBIF95X0JVT2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVU9PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVOLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGxpbmtzIGFuIEFjdGl2aXR5IHRvIHplcm8gb3IgbW9yZXMgaW5zdGFuY2VzIG9mIHRoZSBSb2FkbWFwIGd1aWRhbmNlIHR5cGUuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVU9lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVU4tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVPdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVPLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVBPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeV9CVVB1LXNFZHVINTlLU0hWOHZnQSBfeS00S00tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVQZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVUE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBndWlkYW5jZSBkb2N1bWVudHMgdGhhdCBwcm92aWRlIGVkdWNhdGlvbiBtYXRlcmlhbCBmb3IgdGVhY2hpbmcgc3Rha2Vob2xkZXJzIHN1Y2ggYXMgcHJvamVjdCBtYW5hZ2VycyBvbiBob3cgdG8gcGVyZm9ybSBwcm9qZWN0cyB0aGF0IGZvbGxvdyB0aGlzIERlbGl2ZXJ5IFByb2Nlc3MuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVB1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2RlbGl2ZXJ5UHJvY2VzcyIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3ktNEtNTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVUE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVAtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVFPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVRZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3lfQlVRLS1zRWR1SDU5S1NIVjh2Z0EgX3ktNEtOdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVUXUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZ3VpZGFuY2UgZG9jdW1lbnRzIHRoYXQgaGF2ZSBiZWVuIHJlbGF0ZWQgdG8gYSBEZWxpdmVyeSBQcm9jZXNzIGluc3RhbmNlIHRvIGRlc2NyaWJlIGFuZCBjaGFyYWN0ZXJpemUgaXRzIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMuIFRoZXNlIGRvY3VtZW50cyBjYW4gYmUgdXNlZCBmb3Igc2V2ZXJhbCBwdXJwb3NlcyBzdWNoIGFzIGludGVybmFsIG1hcmtldGluZyBjb21tdW5pY2F0aW9ucywgc2FsZXMgdHJhaW5pbmcgYW5kIGdlbmVyYWwgbWV0aG9kIGVkdWNhdGlvbi4gIEV4YW1wbGVzIGZvciBDb21tdW5pY2F0aW9ucyBNYXRlcmlhbCBhcmUgSGlnaGxpZ2h0IERvY3VtZW50LCBGYWN0IFNoZWV0LCBhbmQgRGVsaXZlcnkgUHJvY2VzcyBTcGVjaWZpY2F0aW9uIE92ZXJ2aWV3LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3lfQlVRLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9kZWxpdmVyeVByb2Nlc3MiIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il95LTRLTU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVFlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVSTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVSZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVUnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJCcmVha2Rvd25OZXN0aW5nIiBtZW1iZXJFbmQ9Il95N3ZXMS0tc0VkdUg1OUtTSFY4dmdBIF95N21NdE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVItLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVSdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGJpZGlyZWN0aW9uYWwgYXNzb2NpYXRpb24gcmVwcmVzZW50cyBicmVha2Rvd24gc3RydWN0dXJlIG5lc3RpbmcuICBJdCBkZWZpbmVzIGFuIG4tbGV2ZWwgaGllcmFyY2h5IG9mIEFjdGl2aXRpZXMgZ3JvdXBpbmcgdG9nZXRoZXIgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgb3RoZXIgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4KLVRoZSBzdXBlckFjdGl2aXRpZXMgcm9sZSBhbGxvd3MgbmF2aWdhdGlvbiBvZiBhIEJyZWFrZG93biBFbGVtZW50IHRvIGlzIHBhcmVudCBBY3Rpdml0eS4gVGhlIGJyZWFrZG93bkVsZW1lbnRzIHJvbGUgYWxsb3dzIG5hdmlnYXRpb24gZnJvbSBhbiBBY3Rpdml0eSB0byBpdHMgbmVzdGVkIEJyZWFrZG93biBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVNPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeV9CVUllLXNFZHVINTlLU0hWOHZnQSBfeV9CVVN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3lfQlVTZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95X0JVU08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBwcm92aWRlcyBvbmUgbW9yZSByZWZlcmVuY2Ugd29ya2Zsb3dzIGZvciBhIERpc2NpcGxpbmUuICBUaGUgcmVmZXJlbmNlIHdvcmtmbG93cyBkZWZpbmUgdGhlIG1vc3QgdHlwaWNhbCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIGEgRGlzY2lwbGluZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVU3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfZGlzY2lwbGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTJPa2dPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3lfQlVTTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95X0JVUy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95X0JVVE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfeV9CVVRlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeV9CVUpPLXNFZHVINTlLU0hWOHZnQSBfeV9CVVR1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3ByYWN0aWNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtXy0tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVULS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVVTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVVWUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVE8tc0VkdUg1OUtTSFY4dmdBIF95X0JVVS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVV1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVVZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBiZSB1c2VkIHRvIGxpbmsgYWxsIGtpbmRzIG9mIGdlbmVyYWwgZ3VpZGFuY2UgdG8gdGhlIEFjdGl2aXR5IHRoYXQgaXMgYmVpbmcgbWFuYWdlZCBhcyBnZW5lcmFsIFN1cHBvcnRpbmcgTWF0ZXJpYWwuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVUtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVWTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVWZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVVnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVC0tc0VkdUg1OUtTSFY4dmdBIF95X0JVV08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVYtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVWdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHByb3ZpZGVzIEFjdGl2aXR5LSAob3IgUHJvY2Vzcy0pIHNwZWNpZmljIGNoZWNrIHBvaW50cy4gIFRoZXNlIGFyZSB0eXBpY2FsbHkgdXNlZCBpbiByZXZpZXdzIGFuZCBpbnNwZWN0aW9ucyBvbiB0aGUgd29yayBwZXJmb3JtZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVXZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVXdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVVy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVXUtc0VkdUg1OUtTSFY4dmdBIF95X0JVWGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVXLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlbGF0ZXMgY29uY2VwdHMgb3Igd2hpdGVwYXBlcnMgdG8gdGhlIEFjdGl2aXR5IHByb3ZpZGluZyBpbXBvcnRhbnQgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIGRvaW5nIHRoZSB3b3JrIGRlc2NyaWJlZCBieSB0aGUgQWN0aXZpdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVVhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVVctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3lfQlVYdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3lfQlVYLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il95X0JVWU8tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il95LTRLVmUtc0VkdUg1OUtTSFY4dmdBIF95X0JVWXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeV9CVVllLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3lfQlVZTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNhbiBwcm92aWRlIHJlZmVyZW5jZXMgdG8gZXhhbXBsZXMgcmVsZXZhbnQgdG8gdGhpcyBzcGVjaWZpYyBBY3Rpdml0eSAob3IgUHJvY2VzcykuICA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVWXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVWU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVVktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVVpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVaZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtXTy1zRWR1SDU5S1NIVjh2Z0EgX3lfQlVaLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVWnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVVplLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcHJvdmlkZXMgQWN0aXZpdHktc3BlY2lmaWMgR3VpZGVsaW5lcy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il95X0JVWi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfYWN0aXZpdHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il95X0JVWmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeV9CVWFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeV9CVWFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3lfQlVhdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3ktNEtXLS1zRWR1SDU5S1NIVjh2Z0EgX3lfQlViTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95X0JVYS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gcmVmZXJzIHRvIFJldXNhYmxlIEFzc2V0cyBzcGVjaWZpYyB0byB0aGlzIEFjdGl2aXR5IChvciBQcm9jZXNzKS4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfeV9CVWJPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2FjdGl2aXR5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfeV9CVWF1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekJaNXdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96Qlo1d2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjV3dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVzYWdlR3VpZGFuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjV3LS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1d3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1eE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1eGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1eHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjV4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pCWjV5Ty1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96Qlo1d08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNXllLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHVycG9zZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekJaNXl1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pCWjV5ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNXktLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNXpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNXplLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNXp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYWx0ZXJuYXRpdmVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1ei0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNXp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1ME8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1MGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1MHUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1MC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJob3d0b1N0YWZmIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1MU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTAtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1MWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1MXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1MS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjUyTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96Qlo1MmUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekJaNS1PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjUydS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNjYWxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1Mi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjUzTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjUzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjUzdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pCWjUzLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjU0Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1My0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTRlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTR1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTQtLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTVPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmlza0xldmVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1NWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1NXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1NS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1Nk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1NmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1NnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1Ni0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1N08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1N2Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1N3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo1Ny0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNTd1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNThPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNThlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTh1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNTgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjU5Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1OC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNTllLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNTl1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekJaNTktLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96Qlo1LU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pCWjUtZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96Qlo1eC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekJaNS11LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2NvcGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjUtLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo1LXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo1X08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo1X2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo1X3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo1Xy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ1c2FnZU5vdGVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96Qlo2QU8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekJaNV8tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96Qlo2QWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96Qlo2QXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96Qlo2QS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pCWjZCTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekJaNkJlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pCWjV3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96Qlo2QnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjZCLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo2QnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pCWjZDTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pCWjZDZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pCWjZDdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekJaNkMtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfeTd2WEItLXNFZHVINTlLU0hWOHZnQSBfekJaNkRlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pCWjZETy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+TGlzdCB0aGUgc3RlcHMgdGhhdCBoYXZlIGJlZW4gc2VsZWN0ZWQgdG8gYmUgcGVyZm9ybWVkIGZvciB0aGUgaW5zdGFuY2Ugb2YgdGhlIFRhc2sgRGVzY3JpcHRvci48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96Qlo2RGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfdGFza0Rlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k3dlc2LS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96Qlo2Qy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekJaNkR1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekJaNkQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pEcFZlLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmZPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZlLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFByb2Nlc3MgQ29tcG9uZW50IGFwcGxpY2F0aW9uIGluIGEgUHJvY2VzcywgaS5lLiB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmluZyB0aGUgUHJvY2Vzcy4gIFRoZSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGNvbXBvbmVudCBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgYW5kIHRvIHByb3ZpZGUgaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcyBzdWNoIGFzIGl0IG93biBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekRwVmZlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dlcydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWZnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pEcFZuLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWZi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWZ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWZ3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmdlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlIGNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekRwVmctLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3k3dld2Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWaE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2VzYtLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWaC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbnRlcmZhY2VJTyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WEN1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmlPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmllLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZrTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZrdS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZkZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWa2Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmtPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gZGVzY3JpYmVzIHRoZSByZWFsaXphdGlvbiByZWxhdGlvbnNoaXBzIGJldHdlZW4gYSBQcm9jZXNzIENvbXBvbmVudCBhbmQgYSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVmt1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVhbGl6ZWRCeSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96RHBWa08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmstLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmxPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZsZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZsLS1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZoTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWbHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVmxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5Pkluc3RhbmNlcyBvZiB0aGlzIGFzc29jaWF0aW9uIGNvbnRhaW4gdGhlIGxpc3Qgb2YgVGFzayBEZXNjcmlwdG9ycyB0aGF0IHJlcHJlc2VudCBhIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWbC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWbGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVm1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVm1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWaC0tc0VkdUg1OUtTSFY4dmdBIF96RHBWbk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVm0tLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZtdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIGNvbnRhaW5zIHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdCB0eXBlIGluc3RhbmNlcyB1c2VkIGZvciB0aGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVm5PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZnZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWbXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVm5lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVm51LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96RHBWZnUtc0VkdUg1OUtTSFY4dmdBIF96RHBWb2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVm9PLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZuLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGlzIGFzc29jaWF0aW9uIHJlcHJlc2VudHMgdGhlIHJlZmVyZW5jZSBmcm9tIHRoZSBkZXNjcmlwdG9yIHRvIHRoZSBQcm9jZXNzIENvbXBvbmVudCBpdCByZWZlcnMgdG8uICBBIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgcmVwcmVzZW50cyBleGFjdGx5IG9uZSBQcm9jZXNzIENvbXBvbmVudC48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96RHBWb2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pEcFZlLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96RHBWbi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVm91LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVm8tLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pEcFZwTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pEcFZlTy1zRWR1SDU5S1NIVjh2Z0EgX3pEcFZwdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96RHBWcGUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekRwVnBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBDb21wb25lbnQgY29udGFpbnMgb25seSBleGFjdGx5IG9uZSBQcm9jZXNzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pEcFZwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzQ29tcG9uZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWY08tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVnBPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pEcFZwLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pEcFZxTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekRwVnFlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekRwVmplLXNFZHVINTlLU0hWOHZnQSBfekRwVnEtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZxdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIFBhY2thZ2UgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cyB3aGljaCBhcmUgdXNlZCB0byBkZWZpbmUgQnJlYWtkb3duIGFuZCBQcm9jZXNzZXMuICBBIFByb2Nlc3MgRWxlbWVudCBpbnN0YW5jZSBjYW4gYmUgcGFydCBvZiBvbmx5IG9uZSBQcm9jZXNzIFBhY2thZ2UgaW5zdGFuY2UuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekRwVnEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3NQYWNrYWdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWaXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekRwVnFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29udGVudEVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3VmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1ZPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3l6X3Y1dS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBDb250ZW50IEVsZW1lbnQgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZETy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il95eHc3Vk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+Q29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLgotQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdWdS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3ZXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRkRlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92NS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dBdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92Nk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92NmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y2dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbmNlcHRzQW5kUGFwZXJzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtNGUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3l6X3dCLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95el92Ni0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95el92N08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l6X3Y3ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeXpfd0RPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y3dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3Y3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdjhPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTZ1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93RWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjhlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjh1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92OC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleGFtcGxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTUtLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95el93Ry0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXpfdjlPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXpfdjllLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95el92OXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJhc3NldHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6X3ZfTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3Y5LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3YtTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXpfdi1lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idGVybURlZmluaXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS1fTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeTBKZzl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l6X3YtdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l6X3YtLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJNZXRob2RFbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1F1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5FdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkR1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5NZXRob2QgRWxlbWVudCBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGFkZHMgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIHZpYSBwYWNrYWdlIG1lcmdlIHRvIE1ldGhvZCBFbGVtZW50IGRlZmluZWQgaW4gTWV0aG9kIENvcmUgbmVlZGVkIGZvciB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2liaWxpdHkgY2FwYWJpbGl0aWVzIGludHJvZHVjZXMgaW4gdGhpcyBwYWNrYWdlLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3l4dzdRLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eEtmRnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1JPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3VpZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1JlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdSTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1J1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1ItLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N1NPLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1NlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1N1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdTZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1MtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1RPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N1RlLXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1R1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ib3duZWRSdWxlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N2N1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eHc3ak8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1QtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1VPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3VWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdodS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXg2Rk1PLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdVdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdVLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VwcHJlc3NlZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkVPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZELS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pHTEZFZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5mYWxzZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZFdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZFLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGRXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHTEZGTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHTEZGZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pHTEZGdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpFbnVtZXJhdGlvbiIgeG1pOmlkPSJfekdMRkYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkdPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pHTEZGLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5WYXJpYWJpbGl0eSBUeXBlIGlzIGFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkdlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibmEiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZHdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGR2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5UaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkctLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29udHJpYnV0ZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZITy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGRy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5Db250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVN0cmluZyB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSBjb25jYXRlbmF0ZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudC4gIE90aGVyIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgYW55IG90aGVyIHR5cGUgc3VjaCBhcyBJbnRlZ2VyLCBEYXRlIGFyZSBpZ25vcmVkLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGtlcHQgYW5kIGFueSBhc3NvY2lhdGlvbiBmcm9tIHRoZSBjb250cmlidXRpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGlnbm9yZWQuCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLgotPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDwvb3duZWRMaXRlcmFsPgotICAgICAgPG93bmVkTGl0ZXJhbCB4bWk6aWQ9Il96R0xGSGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJleHRlbmRzIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGSHUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLgotYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IGVsZW1lbnQgYXJlIGluaGVyaXRlZCBhbmQgdXNlZCB0byBwb3B1bGF0ZSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBhdHRyaWJ1dGVzLiAgSWYgdGhlIHNwZWNpYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgaW5oZXJpdGVkIHZhbHVlcyBhcmUgaWdub3JlZC4gIAotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGluaGVyaXRlZCB0byB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIGl0cyBvd24gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiB0aGUgaW5oZXJpdGVkIG9uZSBpcyBpZ25vcmVkLgotMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuCi0KLTwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8L293bmVkTGl0ZXJhbD4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkgtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmVwbGFjZXMiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZJTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGSC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5SZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczoKLWF0dHJpYnV0ZSB2YWx1ZXM6CVZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIHJlcGxhY2VkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaW5jbHVkaW5nIHVuYXNzaWduZWQgdmFsdWVzLgotVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLTAuLjEtYXNzb2NpYXRpb24gaW5zdGFuY2VzOglUaGUgb25lIGFzc29jaWF0aW9uIGluc3RhbmNlIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIGFzc29jaWF0aW9uIGluc3RhbmNlIGZyb20gdGhlIHJlcGxhY2luZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRpb24gaW5zdGFuY2UgdGhlbiByZXN1bHRpbmcgZWxlbWVudCB3aWxsIGFsc28gbm90IGhhdmUgYW4gYXNzb2NpYXRpb24uCi0wLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczoJQXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LgotCi08L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPC9vd25lZExpdGVyYWw+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZJZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0gICAgICA8b3duZWRMaXRlcmFsIHhtaTppZD0iX3pHTEZJdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxvd25lZExpdGVyYWwgeG1pOmlkPSJfekdMRkktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJWYXJpYWJpbGl0eUVsZW1lbnQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R0xGSmUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZGVyaXZlZCBmcm9tIE1ldGhvZCBFbGVtZW50IHRoYXQgcHJvdmlkZXMgbmV3IGNhcGFiaWxpdGllcyBmb3IgY29udGVudCB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBDb250ZW50IEVsZW1lbnRzIG9yIGFueSBvdGhlciBNZXRob2QgRWxlbWVudCB0aGF0IGRlcml2ZXMgZnJvbSBpdC4gIEl0IGhhcyBiZWVuIHBsYWNlZCBpbi1iZXR3ZWVuIHRoZSBjbGFzc2VzIE1ldGhvZCBFbGVtZW50IGFuZCBDb250ZW50IEVsZW1lbnQgaW4gdGhlIG92ZXJhbGwgVU1BIHRheG9ub215IG9mIGNsYXNzZXMgdXNpbmcgdGhlIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBtZWNoYW5pc20uICBUaGUgYXNzb2NpYXRpb24gVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gc2hhbGwgb25seSBiZSBpbnN0YW50aWF0ZWQgYmV0d2VlbiB0d28gc3ViY2xhc3NlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGUgZWxlbWVudCBvbiB2YXJhaWJpbGl0eVNwZWNpYWxFbGVtZW50IHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBkZWZpbmVzIGEgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlIGRlZmluaW5nIHRoZSBuYXR1cmUgb2YgdGhlIHJlbGF0aW9uc2hpcCB1c2luZyBhIGxpdGVyYWwgZnJvbSB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLVZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIG1ldGEtbW9kZWwgcGFja2FnZSBNZXRob2QgUGx1Z2lucyBhZGRzIHRoZSBjYXBhYmlsaXRpZXMgb2YgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gTWV0aG9kIEVsZW1lbnRzIHRoYXQgZGVyaXZlIGZyb20gaXQuICBCeSBkZWZhdWx0IGFsbCBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZSwgVGFzaywgR3VpZGFuY2UgVHlwZXMsIG9yIEFjdGl2aXRpZXMgYXJlIGRlZmluZWQgdG8gYmUgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi1WYXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVzIHVuaXF1ZSBtZWNoYW5pc21zIGZvciBjdXN0b21pemluZyBtZXRob2QgY29udGVudCB3aXRob3V0IGFjdHVhbGx5IGRpcmVjdGx5IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwgY29udGVudCwgYnV0IGJ5IGp1c3QgYmUgYWJsZSB0byBkZXNjcmliZSB3aXRoIHNlcGFyYXRlIG9iamVjdHMgdGhlIGRpZmZlcmVuY2VzIChhZGRpdGlvbnMsIGNoYW5nZXMsIG9taXNzaW9ucykgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbmFsLiAgVGhpcyBwbHVnLWluIGNvbmNlcHQgYWxsb3dzIHVzZXJzIHRvIGZhY3RvciB0aGVpciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGludGVycmVsYXRlZCB1bml0cyBhbmQgZXZlbiB0byBhcmNoaXRlY3QgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBsYXllcnMgdGhhdCBleHRlbmQgZWFjaCBvdGhlciB3aXRoIG5ldyBjYXBhYmlsaXRpZXMuICBUaGUgcmVzdWx0aW5nIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNpZ24gY2FuIGJlIGR5bmFtaWNhbGx5IGNvbWJpbmVkIGFuZCBhcHBsaWVkIG9uIGRlbWFuZCB1c2luZyB0aGUgaW50ZXJwcmV0YXRpb24gcnVsZXMgZGVmaW5lZCBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudCBTcGVjaWFsaXphdGlvbnMgYXNzZW1ibGluZyB0byBwcm9jZXNzIHByYWN0aXRpb25lcnMgdGhlIG1vc3QgYWNjdXJhdGUgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2NyaXB0aW9ucyBwb3NzaWJsZS4gIEl0IGFsc28gYWxsb3dzIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0byBleHRlbmRzIGFuZCB0YWlsb3IgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyB0aGV5IGRvIG5vdCBvd24gYW5kIHRvIGVhc2lseSB1cGdyYWRlIHRvIG5ld2VyIHZlcnNpb25zIGJ5IHNpbXBseSByZWFwcGx5IHRoZWlyIHBlcnNvbmFsIGNoYW5nZXMgdG8gdGhlc2UgdXBncmFkZXMuCi1WYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgdHdvIHR5cGVzIG9mIHZhcmlhYmlsaXR5IGFuZCBvbmUgdHlwZSBvZiBleHRlbnNpb24gd2hpY2ggYXJlIGZvcm1hbGx5IGRlZmluZWQgZm9yIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRkp1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGSi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZGLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZLTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGSi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5JZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6T3BhcXVlRXhwcmVzc2lvbiIgeG1pOmlkPSJfekdMRktlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+bmE8L2JvZHk+Ci0gICAgICAgIDwvZGVmYXVsdFZhbHVlPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGS3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R0xGSy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R0xGTE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlNlY3Rpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3WS0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRkxlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5TZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiAKLUZvciBleGFtcGxlLCB3aGVuIGEgVGFzayBjb250cmlidXRlcyB0byBhbm90aGVyIFRhc2sgaXRzIFByZXNlbnRhdGlvbiBhc3NvY2lhdGlvbiBpcyBjb250cmlidXRlZCBpbmNsdWRpbmcgaXRzIFNlY3Rpb25zIChpLmUuIGl0cyBTdGVwcyksIHdoaWNoIGFyZSBtb2RlbGVkIGFzIHBhcnRzIG9mIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgU2VjdGlvbnMgY2FuIGJlIG5lc3RlZCBhbmQgdGhlcmVmb3JlIFRhc2sgRGVzY3JpcHRpb25zIGNhbiBiZSBmbGV4aWJseSBvcmdhbml6ZWQgaW4gU3RlcHMgd2l0aCBzdWItU3RlcHMuICBTZWN0aW9ucyBhcmUgVmFyaWFiaWxpdHkgRWxlbWVudHMgdGhlbXNlbHZlcywgc28gdGhleSBjYW4gY29udHJpYnV0ZSB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBtb2RlbCBhIFRhc2sgc3RlcCBhcyBhIFNlY3Rpb24gaW5zdGFuY2Ugd2l0aG91dCByZWxhdGluZyBpdCB0byBhIFRhc2sgRGVzY3JpcHRpb24gdGhhdCBkaXJlY3RseSBjb250cmlidXRlcyB0byAob3IgcmVwbGFjZXMpIGFub3RoZXIgU2VjdGlvbiB3aGljaCBpcyBwYXJ0IG9mIGEgVGFzayBEZXNjcmlwdGlvbi4gIFRoaXMgY29udHJpYnV0aW9uIChvciByZXBsYWNlbWVudCkgd291bGQgYWRkIG5ldyBkZXNjcmlwdGlvbiB0ZXh0IHRvIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uIChvciByZXBsYWNlIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uKS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0byBjb250cmlidXRlIG5ldyBDaGVjayBMaXN0IGl0ZW1zIG9yZ2FuaXplZCBhcyBTZWN0aW9ucyB0byBhbiBleGlzdGluZyBDaGVjayBMaXN0IChkZWZpbmVkIGFzIGd1aWRhbmNlKS4gIAotCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96R0xGTHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekdMRkpPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdaZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNlY3Rpb25OYW1lIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3WnUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1plLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdaLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdhTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3l4dzdhZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InNlY3Rpb25EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N2EtLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95eHc3Yk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95eHc3YmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95eHc3YnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95eHc3Yi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdWJTZWN0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il95eHc3bE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N2NPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N2NlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96R0xGTC0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVkZWNlc3NvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXh3N1l1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekdMRk1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekdMRk1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkFjdGl2aXR5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTdtTXNlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BbiBBY3Rpdml0eSBpcyBhIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLU08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeTdtTXNPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4KLUV4dGVuZHMgQWN0aXZpdHkgd2l0aCBhbiBhc3NvY2lhdGlvbiB0byBSb2FkbWFwLiAgVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGFsc28gcGFydGljaXBhdGVzIGluIHRoZSBleHRlbnNpb24gb2YgdGhlIERpc2NpcGxpbmUgY2F0ZWdvcnkuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekdMRk11LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3k3bU1zTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4mI3hEOwotQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50IHdoaWNoIHByb3ZpZGVzIGtleSBtZWNoYW5pc20gdG8gZW5hYmxlIGR5bmFtaWMgYmluZGluZyBvZiBDYXBhYmlsaXR5IFBhdHRlcm5zIGluIFByb2Nlc3NlcyBhcyB3ZWxsIGFzIFByb2Nlc3MgQ29udHJpYnV0aW9ucy4gIFZhcmlhYmlsaXR5IGlzIHVzZWQgaW4gdGhlIGZvbGxvd2luZyB3YXkgZm9yIEFjdGl2aXRpZXM6JiN4RDsKLS0gRXh0ZW5kOiBUbyBhcHBseSBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBhIHByb2Nlc3Mgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSB3aGljaCBleHRlbmRzIHRoZSBwYXR0ZXJuJ3MgdG9wLWxldmVsIGFjdGl2aXR5LiAgVGhyb3VnaCBleHRlbnNpb24gdGhlIGV4dGVuZGluZyBBY3Rpdml0eSBpbmhlcml0cyB0aGUgcGF0dGVybnMgQnJlYWtkb3duIEVsZW1lbnRzLiYjeEQ7Ci0tIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uJiN4RDsKLS0gQ29udHJpYnV0ZTogVG8gY29udHJpYnV0ZSBuZXcgQnJlYWtkb3duIEVsZW1lbnRzIHRvIGFuIGV4aXN0aW5nIEFjdGl2aXR5IG9uZSB3b3VsZCBkZWZpbmUgYW4gQWN0aXZpdHkgd2l0aCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWxhdGVzIHZpYSB0aGUgQ29udHJpYnV0ZXMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdG8gdGhpcyBleGlzdGluZyBBY3Rpdml0eS4gIFRoZSBjb250cmlidXRpbmcgQWN0aXZpdHkncyBCcmVha2Rvd24gRWxlbWVudHMgd2lsbCBiZSBhZGRlZCB0byB0aGUgY29udHJpYnV0ZWQgQWN0aXZpdHkuJiN4RDsKLSYjeEQ7Ci08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il95N21Nc3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTd2WEtlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3k3bU1zLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eXpkVE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRk0tLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pHTEZKTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95N21NdE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJicmVha2Rvd25FbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2V3ZPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVUnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeTdtTXRlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeTdtTXR1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLU2Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb2FkbWFwcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S1JlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVTi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1N1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1MtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLVE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95ejEtOC0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3lfQlVVZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95LTRLVGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95LTRLVHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3ktNEtULS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoZWNrbGlzdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS01Ty1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtVTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtVZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1V1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY29uY2VwdHMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS00ZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVctLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtVLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1ZlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXhhbXBsZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS01LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfeV9CVVlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3ktNEtWdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3ktNEtWLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1dPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3VpZGVsaW5lcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXoxLTZ1LXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVWmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1d1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95LTRLVy0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZXVzYWJsZUFzc2V0cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXpfdl9PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVYXUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pHVTJBTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pHVTJBdS1zRWR1SDU5S1NIVjh2Z0EgX3pHTEZCdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96R1UyQWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekdVMkFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgY29tcG9zaXRpb24gYXNzb2NpYXRpb24gcmVwcmVzZW50cyB0aGF0IGV2ZXJ5IE1ldGhvZCBQYWNrYWdlIChlaXRoZXIgQ29udGVudCBQYWNrYWdlLCBQcm9jZXNzIFBhY2thZ2UsIG9yIFByb2Nlc3MgQ29tcG9uZW50KSBpcyBwYXJ0IG9mIGV4YWN0bHkgb25lIE1ldGhvZCBQbHVnaW4uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekdVMkF1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZFBsdWdpbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pHVTJBTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R1UyQS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R1UyQk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkV4dGVuc2lvbiIgbWVtYmVyRW5kPSJfekdVMkItLXNFZHVINTlLU0hWOHZnQSBfekdMRkNlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHVTJCdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R1UyQmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZWZpbmVzIGhvdyBNZXRob2QgUGx1Z2lucyBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucy4gIFRoZSBleHRlbmRpbmcgcGx1Zy1pbiBjb250YWlucyBuZXcgbWV0aG9kIGVsZW1lbnRzLCBleHRlbmRzIGV4aXN0aW5nIG1ldGhvZCBlbGVtZW50cyBhbmQgcHJvY2Vzc2VzIHVzaW5nIGNvbnRlbnQgZWxlbWVudCB2YXJpYWJpbGl0eSBtZWNoYW5pc21zIChlLmcuIGNvbnRyaWJ1dGlvbiwgcmVwbGFjZSwgZXRjLiksIHByb3ZpZGVzIGFkZGl0aW9uYWwgRGVsaXZlcnkgYW5kIENhcGFiaWxpdHkgUHJvY2Vzc2VzIGZvciBhIE1ldGhvZCBGcmFtZXdvcmssIGV0Yy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96R1UyQi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwbHVnaW5zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R1UyQ08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R1UyQ2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekdVMkN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiIgbWVtYmVyRW5kPSJfekdVMkRPLXNFZHVINTlLU0hWOHZnQSBfekdMRkt1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHVTJDLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R1UyQ3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyAxLXRvLW1hbnkgYXNzb2NpYXRpb24gZGVmaW5lcyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHRoYXQgYSBudW1iZXIgb2Ygc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIHJlcHJlc2VudCBhIHZhcmlhdGlvbiBvZiBleGFjdGx5IG9uZSBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiAgU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96R1UyRE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJDdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R1UyRGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R1UyRHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekdVMkQtLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekdMRkwtLXNFZHVINTlLU0hWOHZnQSBfekdVMkVlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHVTJFTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R1UyRC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+VGhpcyBhc3NvY2lhdGlvbiBkZXNjcmliZXMgdGhlIG9yZGVyIGluIHdoaWNoIGNvbnRyaWJ1dGVkIFNlY3Rpb25zIHNoYWxsIGJlIGluc2VydGVkIGludG8gYW4gIGV4aXN0aW5nIGxpc3Qgb2YgU2VjdGlvbnMgbWFpbnRhaW5lZCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pHVTJFZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9zZWN0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eHc3WXUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekdVMkQtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHVTJFdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHVTJFLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQb2ludCI+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV2tlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ieCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdrdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkdyYXBoRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpBV2xPLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwb3NpdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdsdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktINk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV2wtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV21PLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJsaW5rIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIa08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g3dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXbXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXbS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVduTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFuY2hvcmFnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3ctLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96SktINy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV25lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV251LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXbi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJzZW1hbnRpY01vZGVsIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g5dS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXb08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXb2Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdvdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpbWVuc2lvbiI+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV28tLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id2lkdGgiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXcE8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJoZWlnaHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpYWdyYW1FbGVtZW50IiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXcHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXh3N1FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdwLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImlzVmlzaWJsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpPcGFxdWVFeHByZXNzaW9uIiB4bWk6aWQ9Il96SkFXcU8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+dHJ1ZTwvYm9keT4KLSAgICAgICAgPC9kZWZhdWx0VmFsdWU+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVdxZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNvbnRhaW5lciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktINk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3F1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3EtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SkFXck8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyZWZlcmVuY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdzdS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdyZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3ItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvcGVydHkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVd1ZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVdzTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVdzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SkFXc3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJSZWZlcmVuY2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVdzLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3RPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBidS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEJvb2xlYW4iIHhtaTppZD0iX3pKQVd0ZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd0dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJlZmVyZW5jZWQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKQVd0LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKQVd1Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV3VlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvcGVydHkiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKQVd1dS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3UtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ia2V5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpBV3Z1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3YtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFsdWUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXd08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXd2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SkFXd3Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKQVd3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXeE8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd4ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktINy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3h1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3gtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBV3lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZ3JhcGhFZGdlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXeS0tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pKS0g4Ty1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXeWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXeXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpBV3ktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SkFXek8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKQVd6ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFuY2hvciIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3ctLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOE8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpBV3p1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjIiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpBV3otLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpBVzBPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKS0g4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SkFXMGUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SkFXMHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0hrTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkRpYWdyYW1MaW5rIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIa2Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpBV3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hrdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Inpvb20iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIay0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2aWV3cG9ydCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2tPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0hsTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImdyYXBoRWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV2stLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIN3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSGxlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSGx1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSGwtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSG1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSG1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIbXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHcmFwaE5vZGUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0htLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SkFXay0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSG5PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2l6ZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV291LXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iRGlhZ3JhbSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSG51LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKS0htdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIbi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ6b29tIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQY08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSG9PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSG9lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIb3Utc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJ2aWV3cG9pbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIby0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaWFncmFtTGluayIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSGtPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SktIOWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHBPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHBlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIcHUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJuYW1lc3BhY2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0hxZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekpUUmdPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hwLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hxTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iU2VtYW50aWNNb2RlbEJyaWRnZSIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHF1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIcS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcmVzZW50YXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIck8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIcmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SktIcnUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktIci0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJncmFwaEVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKQVdrLS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpLSDl1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0hzTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0hzZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHN1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZGlhZ3JhbSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SlRSZ08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHMtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHRPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h0ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIdHUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InR5cGVJbmZvIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHVPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHVlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpLSHV1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIdS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIdk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h2ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImVsZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdRZS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfekpUUmhlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0h2dS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0h2LS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSHdPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0h3ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSHd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZWxlbWVudCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhLZkRlLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96SlRSZ2Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSHctLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSHhPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIeGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJMZWFmRWxlbWVudCIgaXNBYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekpLSHh1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pKQVdwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h4LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlRleHRFbGVtZW50Ij4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIeU8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h5ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InRleHQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIeXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIeS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96SktIek8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0h6ZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkltYWdlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIenUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0h6LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVyaSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUFp1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0gwTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0gwZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pKS0gwdS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQWnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0gwLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1pbWVUeXBlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpLSDFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpLSDFlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfekpLSDF1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96SktIMS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBpc0Fic3RyYWN0PSJ0cnVlIj4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96SktIMk8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekpLSHhlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekpLSDJlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUG9seWxpbmUiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0gydS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIMS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDItLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2xvc2VkIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pKS0gzTy1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDNlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0id2F5cG9pbnRzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pKVFJpZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIM3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIMy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pKS0g0Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IkVsbGlwc2UiPgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pKS0g0ZS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il96SktIMS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDR1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iY2VudGVyIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXa08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekpLSDQtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icmFkaXVzWCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g1Ty1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InJhZGl1c1kiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINWUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJyb3RhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pKS0g1dS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InN0YXJ0QW5nbGUiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBjTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96SktINS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJlbmRBbmdsZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDZPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV2x1LXNFZHVINTlLU0hWOHZnQSBfekpBV3FlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDZlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV3R1LXNFZHVINTlLU0hWOHZnQSBfekpBV3JPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV3ItLXNFZHVINTlLU0hWOHZnQSBfekpLSDYtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpLSDYtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2RpYWdyYW1FbGVtZW50IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96SkFXcGUtc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfekpLSDZ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pKS0g3Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pKS0g3ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDd1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV21lLXNFZHVINTlLU0hWOHZnQSBfekpLSGxPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDctLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV25PLXNFZHVINTlLU0hWOHZnQSBfekpBV3hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDhPLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBV3lPLXNFZHVINTlLU0hWOHZnQSBfekpBV3plLXNFZHVINTlLU0hWOHZnQSIvPgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpLSDhlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpBVzBPLXNFZHVINTlLU0hWOHZnQSBfekpLSDh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpLSDh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX2dyYXBoRWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpBV3ktLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKS0g4ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SktIOC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SktIOU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g5ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0hvLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hsLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKS0g5dS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKQVduLS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hyLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKVFJnTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0hwdS1zRWR1SDU5S1NIVjh2Z0EgX3pKS0hzdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKVFJnZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0h3dS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJndS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pKVFJndS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9jb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSHdPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKVFJnZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SlRSZy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SlRSaE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfekpUUmhlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfekpLSHZlLXNFZHVINTlLU0hWOHZnQSBfekpUUmh1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfekpUUmh1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3VNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pKS0h1LS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96SlRSaGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekpUUmgtLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekpUUmlPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pKVFJpZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pKS0gzZS1zRWR1SDU5S1NIVjh2Z0EgX3pKVFJpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pKVFJpdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wb2x5bGluZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSDJlLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pKVFJpZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96SlRSaS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96SlRSak8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfekRwVmktLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pEcFZpdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96RHBWak8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pEcFZqZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTd2WE9PLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96RHBWcWUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekRwVmp1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekRwVmotLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TGl0TU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkaWFncmFtcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekpLSG5lLXNFZHVINTlLU0hWOHZnQSIgYWdncmVnYXRpb249ImNvbXBvc2l0ZSIgYXNzb2NpYXRpb249Il96TGl0TS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfekxpdE1lLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfekxpdE11LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pMaXRNTy1zRWR1SDU5S1NIVjh2Z0EgX3pMaXROZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TGl0Tk8tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfekxpdE0tLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PlRoaXMgYXNzb2NpYXRpb24gaXMgdGhlIG9ubHkgbWVtYmVyIG9mIHRoZSB1bWFkaWFncmFtcyBwYWNrYWdlLiAgSXQgZGVmaW5lcyB0aGF0IERpYWdyYW1zIGNhbiBiZSBwYWNrYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pMaXROZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9wcm9jZXNzUGFja2FnZSIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pMaXRNLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TGl0TnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TGl0Ti0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pHTEZBZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLgotPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfekdMRkEtLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3l4VVBWTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96TjdTME8tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZCTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOk9wYXF1ZUV4cHJlc3Npb24iIHhtaTppZD0iX3pHTEZCZS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT50cnVlPC9ib2R5PgotICAgICAgICA8L2RlZmF1bHRWYWx1ZT4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfekdMRkJ1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3k0ZUFNZS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfekdVMkFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pHTEZCLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pHTEZDTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pHTEZDZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImJhc2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96R0xGQU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pHVTJCZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96R0xGQ3Utc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96R0xGQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfekRwVmNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pEcFZjZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96RHBWY08tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96RHBWY3Utc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfekRwVml1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOmlkPSJfekRwVmMtLXNFZHVINTlLU0hWOHZnQSIgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3VtbDIvMi4wLjAvVU1MIj4KLSAgICAgICAgICA8ZGV0YWlscyB4bWk6aWQ9Il96RHBWZE8tc0VkdUg1OUtTSFY4dmdBIiBrZXk9ImV4dGVuZCIvPgotICAgICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDwvZ2VuZXJhbGl6YXRpb24+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfek43UzBlLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWZGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJpbnRlcmZhY2VzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96RHBWZ2Utc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pEcFZrTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWZHUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWZC0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96RHBWZU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJwcm9jZXNzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95LTRLT2Utc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pEcFZwTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96RHBWZWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96RHBWZXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Ik1ldGhvZFVuaXQiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTMC0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3pON1MxTy1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95eHc3UWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfek43UzFlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iYXV0aG9ycyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfek43UzF1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pON1MxZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTMS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTMk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96TjdTMmUtc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TjdTMnUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjaGFuZ2VEYXRlIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTMi0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTM08tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTM2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pON1MzdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96TjdTMy0tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek43UzN1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgICAgPGJvZHk+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwvYm9keT4KLSAgICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pON1M0Ty1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pON1M0ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgICAgPGRlZmF1bHRWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxTdHJpbmciIHhtaTppZD0iX3pON1M0dS1zRWR1SDU5S1NIVjh2Z0EiIHR5cGU9Il95eFVQYU8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pON1M0LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9InZlcnNpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pON1M1Ty1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96TjdTNC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgICA8Ym9keT5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96TjdTNWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96TjdTNXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il96TjdTNS0tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96TjdTNk8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l6MS04LS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfek9FY3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pON1M2ZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIxIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pON1M2dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il95eHc3Vi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95eHc3V08tc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeXh3N1YtLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96T0Vjd08tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3l4dzdXdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeXh3N1ctLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3l4dzdXdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PlRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC9ib2R5PgotICAgICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeXh3N1hPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeXh3N1hlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgICA8ZGVmYXVsdFZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFN0cmluZyIgeG1pOmlkPSJfeXh3N1h1LXNFZHVINTlLU0hWOHZnQSIgdHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeXh3N1gtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic2VjdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3l4dzdZdS1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfeXh3N2otLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3l4dzdZTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3l4dzdZZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeTFNRE1PLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iZXh0ZXJuYWxJZCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRE1lLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTURNTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ETXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ETS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ETk8tc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il95MU1ETmUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfeTFNRE51LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3kxTUROZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICAgIDxib2R5PktleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy48L2JvZHk+Ci0gICAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il95MU1ETi0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il95MU1ET08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICAgIDxkZWZhdWx0VmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsU3RyaW5nIiB4bWk6aWQ9Il95MU1ET2Utc0VkdUg1OUtTSFY4dmdBIiB0eXBlPSJfeXhVUGFPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IiIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pPRWN3ZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pON1M2Ty1zRWR1SDU5S1NIVjh2Z0EgX3pPRWN3LS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96T0Vjd3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfek9FY3dlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgTWV0aG9kIFVuaXQgY2FuIGhhdmUgZXhhY3RseSBvbmUgQ29weXJpZ2h0IFN0YXRlbWVudCBzZWN1cmluZyB0aGUgaW50ZWxsZWN0dWFsIGNhcGl0YWwgaXQgcmVwcmVzZW50cy4gIEl0IHdpbGwgYmUgcHVibGlzaGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgY29uY3JldGUgRWxlbWVudC4gIE5vdGUsIHRoYXQgQ29weXJpZ2h0IFN0YXRlbWVudHMgZm9yIE1ldGhvZCBMaWJyYXJpZXMgYW5kIE1ldGhvZCBQbHVnaW5zIGRlZmluZSB0aGUgZGVmYXVsdCBzdGF0ZW1lbnQgZm9yIGl0cyBjb250YWluZWQgZWxlbWVudHMsIHdoaWNoIGNhbiBiZSAnb3ZlcndyaXR0ZW4nIHdpdGggcmV2aXNlZCBzdGF0ZW1lbnRzIGZvciBldmVyeSBDb250ZW50IERlc2NyaXB0aW9uIG9yIFByb2Nlc3MgQ29tcG9uZW50LjwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pPRWN3LS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RVbml0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96TjdTMHUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pPRWN3ZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96T0VjeE8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96T0VjeGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRZENZZS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgQ29uZmlndXJhdGlvbiBpcyBhIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96UWRDWXUtc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfek43UzB1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENZLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfekdMRkFPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16YnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ1pPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ1plLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ1p1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeTRlQU1lLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ1otLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2FPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2FlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvY2Vzc1ZpZXdzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXpqZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDYXUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDYS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENiTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImRlZmF1bHRWaWV3IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXprZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDYmUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDYnUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iMSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDYi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtemxlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENjTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENjZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFkQ2N1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il95Mk9rbnUtc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXptdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UWRDYy0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UWRDZE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRZENkZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9ImFkZGVkQ2F0ZWdvcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3kyT2tudS1zRWR1SDU5S1NIVjh2Z0EiIGFzc29jaWF0aW9uPSJfelFtem51LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRZENkdS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRZENkLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkNsYXNzIiB4bWk6aWQ9Il96UWRDZU8tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJQcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFkQ2VlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRZENlTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfelFkQ2V1LXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDZS0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S01PLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16ZU8tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2ZPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6Q2xhc3MiIHhtaTppZD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9IlByb2Nlc3MiIGlzQWJzdHJhY3Q9InRydWUiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il95LTRLT3Utc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBpcyBhIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuCi08L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFkQ2Z1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5Qcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLgotVGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4KLTwvYm9keT4KLSAgICAgIDwvb3duZWRDb21tZW50PgotICAgICAgPGdlbmVyYWxpemF0aW9uIHhtaTppZD0iX3ktNEtPLS1zRWR1SDU5S1NIVjh2Z0EiIGdlbmVyYWw9Il95N21Nc08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfeS00S1BPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iaW5jbHVkZXNQYXR0ZXJucyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeV9CVUotLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il95X0JVS3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfeS00S1BlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfeS00S1B1LXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEF0dHJpYnV0ZT4KLSAgICAgIDxvd25lZEF0dHJpYnV0ZSB4bWk6aWQ9Il96UWRDZi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgYXNzb2NpYXRpb249Il96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFkQ2dPLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFkQ2dlLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IjEiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFtellPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0idmFsaWRDb250ZXh0IiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16WWUtc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16WXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpDbGFzcyIgeG1pOmlkPSJfelFtelktLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpaTy1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16WS0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8Z2VuZXJhbGl6YXRpb24geG1pOmlkPSJfelFtelplLXNFZHVINTlLU0hWOHZnQSIgZ2VuZXJhbD0iX3pON1MwdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDxnZW5lcmFsaXphdGlvbiB4bWk6aWQ9Il96UW16Wi0tc0VkdUg1OUtTSFY4dmdBIiBnZW5lcmFsPSJfeXhVUFZPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPG93bmVkQXR0cmlidXRlIHhtaTppZD0iX3pRbXphTy1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Im1ldGhvZFBsdWdpbnMiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pHTEZBTy1zRWR1SDU5S1NIVjh2Z0EiIGFnZ3JlZ2F0aW9uPSJjb21wb3NpdGUiIGFzc29jaWF0aW9uPSJfelFtemZlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXphZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXphdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRBdHRyaWJ1dGU+Ci0gICAgICA8b3duZWRBdHRyaWJ1dGUgeG1pOmlkPSJfelFtemEtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBhZ2dyZWdhdGlvbj0iY29tcG9zaXRlIiBhc3NvY2lhdGlvbj0iX3pRbXpnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16Yk8tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16YmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkQXR0cmlidXRlPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemJ1LXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemNPLXNFZHVINTlLU0hWOHZnQSBfelFkQ1ktLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpiLS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16YnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBzZWxlY3Rpb24gb2YgcGFja2FnZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemNPLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InByaXZhdGUiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemJ1LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpjZS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpjdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16ZGUtc0VkdUg1OUtTSFY4dmdBIF96UWRDWnUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemRPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpjLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16ZGUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16Yy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemR1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemQtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXplTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXpldS1zRWR1SDU5S1NIVjh2Z0EgX3pRZENlLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16ZWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemVPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkRlbGl2ZXJ5IFByb2Nlc3MgY2FuIGJlIG9yZ2FuaXplZCBpbiBtYW55IFByb2Nlc3MgRmFtaWxpZXMuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemV1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0icHJvY2Vzc0ZhbWlsaWVzIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDZU8tc0VkdUg1OUtTSFY4dmdBIiBhc3NvY2lhdGlvbj0iX3pRbXplTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16ZS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16Zk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemZlLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemYtLXNFZHVINTlLU0hWOHZnQSBfelFtemFPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRDb21tZW50IHhtaTppZD0iX3pRbXpmdS1zRWR1SDU5S1NIVjh2Z0EiIGFubm90YXRlZEVsZW1lbnQ9Il96UW16ZmUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPGJvZHk+QSBNZXRob2QgTGlicmFyeSBwaHlzaWNhbGx5IGNvbXByaXNlcyBvZiBNZXRob2QgUGx1Z2lucy48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16Zi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kTGlicmFyeSIgdmlzaWJpbGl0eT0icHJpdmF0ZSIgdHlwZT0iX3pRbXpZLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16ZmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16Z08tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16YS0tc0VkdUg1OUtTSFY4dmdBIF96UW16Z3Utc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemdlLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpnTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIE1ldGhvZCBMaWJyYXJ5IHN0b3JlcyBhIHNldCBvZiBwcmVkZWZpbmVkIE1ldGhvZCBDb25maWd1cmF0aW9ucyB0aGF0IGFyZSByZWd1bGFybHkgdXNlZCBieSB0aGUgbGlicmFyeSBhdXRob3JzIChlLmcuIHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IHRoZXkgc2hpcCB0byB0aGVpciB1c2VycykuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemd1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZExpYnJhcnkiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRbXpZLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16Z08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UW16aGUtc0VkdUg1OUtTSFY4dmdBIF96UWRDZi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemhPLXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpnLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5BIFByb2Nlc3MgaGFzIGV4YWN0bHkgb24gZGVmYXVsdCBjb25maWd1cmF0aW9uLiAgVGhpcyBpcyBpbiBtb3N0IGNhc2VzIHRoZSBjb25maWd1cmF0aW9uIGluIHdoaWNoIHRoZSBwcm9jZXNzIGhhcyBiZWVuIGNyZWF0ZWQuPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemhlLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX3Byb2Nlc3MiIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3ktNEtPZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16Zy0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemh1LXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemgtLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRbXppdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXpZTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkQ29tbWVudCB4bWk6aWQ9Il96UW16aWUtc0VkdUg1OUtTSFY4dmdBIiBhbm5vdGF0ZWRFbGVtZW50PSJfelFtemlPLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDxib2R5PkEgUHJvY2VzcyBjYW4gaGF2ZSBtYW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gdmVyaWZpZWQgdG8gYWxzbyBwcm9kdWNlIHZhbGlkIHJlc3VsdHMuICBQcm9jZXNzIEVsZW1lbnRzIChlLmcuIERlc2NyaXB0b3JzKSB0aGF0IHJlZmVyIHRvIGNvbnRlbnQgcGFja2FnZXMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIHRoZSBzY29wZSBvZiBzdWNoIGEgY29uZmlndXJhdGlvbiB3b3VsZCBub3QgYmUgc2hvd24gaW4gdGhlIHByb2Nlc3Mgd2hlbiBwdWJsaXNoZWQgb3IgdXNlZCB1bmRlciBzdWNoIGEgY29uZmlndXJhdGlvbi4gIFRoaXMgYWxsb3dzIHRvIGVhc2lseSByZW1vdmUgY29udGVudCBmcm9tIGEgcHJvY2VzcyBieSByZW1vdmluZyBjb250ZW50IHBhY2thZ2VzIHRvIGZyb20gdGhlIHJlbGF0ZWQgY29uZmlndXJhdGlvbi48L2JvZHk+Ci0gICAgICA8L293bmVkQ29tbWVudD4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16aXUtc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfcHJvY2VzcyIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfeS00S09lLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXppTy1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8dXBwZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxVbmxpbWl0ZWROYXR1cmFsIiB4bWk6aWQ9Il96UW16aS0tc0VkdUg1OUtTSFY4dmdBIiB2YWx1ZT0iKiIvPgotICAgICAgICA8bG93ZXJWYWx1ZSB4bWk6dHlwZT0idW1sOkxpdGVyYWxJbnRlZ2VyIiB4bWk6aWQ9Il96UW16ak8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gICAgICA8L293bmVkRW5kPgotICAgIDwvcGFja2FnZWRFbGVtZW50PgotICAgIDxwYWNrYWdlZEVsZW1lbnQgeG1pOnR5cGU9InVtbDpBc3NvY2lhdGlvbiIgeG1pOmlkPSJfelFtemplLXNFZHVINTlLU0hWOHZnQSIgbWVtYmVyRW5kPSJfelFtemp1LXNFZHVINTlLU0hWOHZnQSBfelFkQ2FlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemp1LXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16amUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtemotLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtemtPLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXprZS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRZENiTy1zRWR1SDU5S1NIVjh2Z0EgX3pRbXprdS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXprdS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtemtlLXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXprLS1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpsTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16bGUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UWRDYi0tc0VkdUg1OUtTSFY4dmdBIF96UW16bC0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZENvbW1lbnQgeG1pOmlkPSJfelFtemx1LXNFZHVINTlLU0hWOHZnQSIgYW5ub3RhdGVkRWxlbWVudD0iX3pRbXpsZS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgICA8Ym9keT5UaGUgZGVmaW5pdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9ucyBvZiBvdGhlciBjb25maWd1cmF0aW9ucy4gIEZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gQSBjb3VsZCBiZSBkZWZpbmVkIGFzIHRoZSBzdXBlcnNldCBvZiBjb25maWd1cmF0aW9ucyBCLCBDLCBhbmQgRCBwbHVzIGFkZCBtb3JlIHNlbGVjdGVkIFBsdWdpbnMgYW5kIFBhY2thZ2VzLiAgSW4gc3VjaCBhIGNhc2UgQSB3b3VsZCBsaXN0IEIsIEMsIGFuZCBEIGFzIGl0cyBiYXNlQ29uZmlndXJhdGlvbnMuICBJZiBhbnkgb2YgdGhlc2UgYmFzZSBjb25maWd1cmF0aW9ucyBjaGFuZ2VzIGFsbCB1cGRhdGVzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgdmFsaWQgZm9yIEEgYXMgd2VsbCByZWR1Y2luZyBtYWludGFpbmFiaWxpdHkgb3ZlcmhlYWQgZm9yIG92ZXJsYXBwaW5nL2RlcGVuZGVudCBjb25maWd1cmF0aW9ucy4gPC9ib2R5PgotICAgICAgPC9vd25lZENvbW1lbnQ+Ci0gICAgICA8b3duZWRFbmQgeG1pOmlkPSJfelFtemwtLXNFZHVINTlLU0hWOHZnQSIgbmFtZT0iX21ldGhvZENvbmZpZ3VyYXRpb24iIHZpc2liaWxpdHk9InB1YmxpYyIgdHlwZT0iX3pRZENZTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5pcXVlPSJmYWxzZSIgYXNzb2NpYXRpb249Il96UW16bGUtc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgICAgPHVwcGVyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsVW5saW1pdGVkTmF0dXJhbCIgeG1pOmlkPSJfelFtem1PLXNFZHVINTlLU0hWOHZnQSIgdmFsdWU9IioiLz4KLSAgICAgICAgPGxvd2VyVmFsdWUgeG1pOnR5cGU9InVtbDpMaXRlcmFsSW50ZWdlciIgeG1pOmlkPSJfelFtem1lLXNFZHVINTlLU0hWOHZnQSIvPgotICAgICAgPC9vd25lZEVuZD4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cGFja2FnZWRFbGVtZW50IHhtaTp0eXBlPSJ1bWw6QXNzb2NpYXRpb24iIHhtaTppZD0iX3pRbXptdS1zRWR1SDU5S1NIVjh2Z0EiIG1lbWJlckVuZD0iX3pRZENjdS1zRWR1SDU5S1NIVjh2Z0EgX3pRbXptLS1zRWR1SDU5S1NIVjh2Z0EiPgotICAgICAgPG93bmVkRW5kIHhtaTppZD0iX3pRbXptLS1zRWR1SDU5S1NIVjh2Z0EiIG5hbWU9Il9tZXRob2RDb25maWd1cmF0aW9uIiB2aXNpYmlsaXR5PSJwdWJsaWMiIHR5cGU9Il96UWRDWU8tc0VkdUg1OUtTSFY4dmdBIiBpc1VuaXF1ZT0iZmFsc2UiIGFzc29jaWF0aW9uPSJfelFtem11LXNFZHVINTlLU0hWOHZnQSI+Ci0gICAgICAgIDx1cHBlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbFVubGltaXRlZE5hdHVyYWwiIHhtaTppZD0iX3pRbXpuTy1zRWR1SDU5S1NIVjh2Z0EiIHZhbHVlPSIqIi8+Ci0gICAgICAgIDxsb3dlclZhbHVlIHhtaTp0eXBlPSJ1bWw6TGl0ZXJhbEludGVnZXIiIHhtaTppZD0iX3pRbXpuZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICAgIDwvb3duZWRFbmQ+Ci0gICAgPC9wYWNrYWdlZEVsZW1lbnQ+Ci0gICAgPHBhY2thZ2VkRWxlbWVudCB4bWk6dHlwZT0idW1sOkFzc29jaWF0aW9uIiB4bWk6aWQ9Il96UW16bnUtc0VkdUg1OUtTSFY4dmdBIiBtZW1iZXJFbmQ9Il96UWRDZGUtc0VkdUg1OUtTSFY4dmdBIF96UW16bi0tc0VkdUg1OUtTSFY4dmdBIj4KLSAgICAgIDxvd25lZEVuZCB4bWk6aWQ9Il96UW16bi0tc0VkdUg1OUtTSFY4dmdBIiBuYW1lPSJfbWV0aG9kQ29uZmlndXJhdGlvbiIgdmlzaWJpbGl0eT0icHVibGljIiB0eXBlPSJfelFkQ1lPLXNFZHVINTlLU0hWOHZnQSIgaXNVbmlxdWU9ImZhbHNlIiBhc3NvY2lhdGlvbj0iX3pRbXpudS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgICA8L3BhY2thZ2VkRWxlbWVudD4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcxZXlDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMXV5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjX3l6VTU4WWluRWRxdHZibmZCMkxfNXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvU3RhbmRhcmQucHJvZmlsZS51bWwjXzAiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcxLXlDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMk95Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZWZhdWx0LmVweCNfSU44azhNbUJFZHFCY04xUjZFdldVdz9EZWZhdWx0L0RlZmF1bHQ/Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVmYXVsdC5lcHgjX2FfUzN3TldMRWRpeTRJcVA4d2hqRkE/RGVmYXVsdD8iLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX0o3dEcyZXlDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9KN3RHMnV5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUwyX01TTF9QUk9GSUxFUy9EZXBsb3ltZW50LmVweCNfSXJkQVVNbUJFZHFCY04xUjZFdldVdz9EZXBsb3ltZW50L0RlcGxveW1lbnQ/Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxhcHBsaWVkUHJvZmlsZSBocmVmPSJwYXRobWFwOi8vVU1MMl9NU0xfUFJPRklMRVMvRGVwbG95bWVudC5lcHgjX3ZqYnV3T3ZIRWRpRFg1YmppMGlWU0E/RGVwbG95bWVudD8iLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgICA8cHJvZmlsZUFwcGxpY2F0aW9uIHhtaTppZD0iX1RfY2NvT3lDRWR1NS12VmpsZlZzZlEiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6aWQ9Il9UX2Njb2V5Q0VkdTUtdlZqbGZWc2ZRIiBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICAgICAgICA8cmVmZXJlbmNlcyB4bWk6dHlwZT0iZWNvcmU6RVBhY2thZ2UiIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjX3Z5LUhVWWluRWRxdHZibmZCMkxfNXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGFwcGxpZWRQcm9maWxlIGhyZWY9InBhdGhtYXA6Ly9VTUxfUFJPRklMRVMvRWNvcmUucHJvZmlsZS51bWwjXzAiLz4KLSAgICA8L3Byb2ZpbGVBcHBsaWNhdGlvbj4KLSAgPC91bWw6TW9kZWw+Ci0gIDxFY29yZTpFUGFja2FnZSB4bWk6aWQ9Il9VOUl6OE95Q0VkdTUtdlZqbGZWc2ZRIiBiYXNlX1BhY2thZ2U9Il9KN3RHME95Q0VkdTUtdlZqbGZWc2ZRIiBwYWNrYWdlTmFtZT0idW1hIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLnVtYSIgbnNVUkk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQVy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eEtmQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhLZkR1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBYZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4S2ZFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXhVUFh1LXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXhLZkV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBYLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4S2ZGLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQWU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQVWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUFllLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4VVBZdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBXZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQY2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQWS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGN1LXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5EYXRlIiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQWk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhVUGMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUFplLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4VVBkTy1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBadS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQZGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQWi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGR1LXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5TdHJpbmciIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBhTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eFVQZC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eFVQYWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFRGF0YVR5cGUgeG1pOmlkPSJfeXhVUGVPLXNFZHVINTlLU0hWOHZnQSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEudXRpbC5TZXQiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eFVQZWUtc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkxpc3QiIGJhc2VfUHJpbWl0aXZlVHlwZT0iX3l4VVBhLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eGRaUU8tc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iaW50IiBiYXNlX1ByaW1pdGl2ZVR5cGU9Il95eFVQYk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXhkWlFlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXhVUGJlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RURhdGFUeXBlIHhtaTppZD0iX3l4ZFpRdS1zRWR1SDU5S1NIVjh2Z0EiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQm9vbGVhbiIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGJ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4ZFpRLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4VVBiLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVEYXRhVHlwZSB4bWk6aWQ9Il95eGRaUk8tc0VkdUg1OUtTSFY4dmdBIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS5sYW5nLkRvdWJsZSIgYmFzZV9QcmltaXRpdmVUeXBlPSJfeXhVUGNPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZNdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdRTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3UXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZOTy1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdSTy1zRWR1SDU5S1NIVjh2Z0EiIGlzSUQ9InRydWUiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3UmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZOdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdTZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGTi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3U3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2Rk9PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N1ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZPZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdXTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2Rk91LXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N1d1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZPLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdXLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3WS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZQZS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdaZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3WnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFQXR0cmlidXRlIHhtaTppZD0iX3l4NkZQLS1zRWR1SDU5S1NIVjh2Z0EiIGlzVW5zZXR0YWJsZT0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l4dzdhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGUU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3YS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlFlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2MtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RUF0dHJpYnV0ZSB4bWk6aWQ9Il95eDZGUXUtc0VkdUg1OUtTSFY4dmdBIiBpc1Vuc2V0dGFibGU9InRydWUiIGJhc2VfUHJvcGVydHk9Il95eHc3ZGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlEtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2R1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZSTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdlLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2RlJlLXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N2Z1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZSdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdmLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPEVjb3JlOkVBdHRyaWJ1dGUgeG1pOmlkPSJfeXg2RlItLXNFZHVINTlLU0hWOHZnQSIgaXNVbnNldHRhYmxlPSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXh3N2lPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZTTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdqZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eDZGU2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eHc3a08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXg2RlN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXh3N2xlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l4NkZTLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l4dzdtdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPS3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkRU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T0stLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZEV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RWNvcmU6RVJlZmVyZW5jZSB4bWk6aWQ9Il95eTlPTE8tc0VkdUg1OUtTSFY4dmdBIiBpc1RyYW5zaWVudD0idHJ1ZSIgYmFzZV9Qcm9wZXJ0eT0iX3l5emRGTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkRy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3l5OU9MdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXl6ZExlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9MLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkTk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T01lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZE4tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9NdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRRTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkUnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T05PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9OZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRUZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPTnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkVnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T04tLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXl6ZFctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9PTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRZTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPT2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eXpkWmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxFY29yZTpFUmVmZXJlbmNlIHhtaTppZD0iX3l5OU9PdS1zRWR1SDU5S1NIVjh2Z0EiIGlzVHJhbnNpZW50PSJ0cnVlIiBiYXNlX1Byb3BlcnR5PSJfeXl6ZFp1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9PLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5emRhdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPRWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1BlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0Z1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9QdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9HTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPSGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeXk5T1FPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXk5T0l1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3l5OU9RZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l5OU9KZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95eTlPUXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95eTlPS08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZy11LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmctLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS00dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnX08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtNWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKZ19lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLTZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmdfdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS02LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpnXy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtN3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEFPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLThlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhBZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS05Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejEtOS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEEtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxLS11LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhCTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MS1fZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95ejFfQU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEJ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXoxX0NPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhCLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6MV9GZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQ08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el92NXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaENlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfdl9lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhDdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dBTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoQy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93QS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaERPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0NPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhEZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dEZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93RXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEQtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0YtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhFTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dITy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95el93SWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEV1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeXpfd0p1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kwSmhFLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3l6X3dLLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MEpoRk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MEpnNGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTBKaEZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTBKZzV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnpzTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxQ1JzTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6c2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1Dcy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQ3VPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnpzLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUN4LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1Dek8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenRlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzAtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp0dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUMyTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DM2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenVPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp1ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUM2ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1DOE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenUtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNQzllLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp2Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUMtdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1EQWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenZ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNRENPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp2LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUREZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6d08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ERXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWendlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREYtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp3dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURITy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6dy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ESWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWenhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNREplLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp4ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTURKLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MVZ6eHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MU1ETE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTFWengtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTFNRE1lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kxVnp5Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kxTUROdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWZ08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95MkZha08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmdlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa2dlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZndS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tpdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWZy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9ra08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa21lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZoZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tuLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rb3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmgtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3FPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZpTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2tydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWaWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rdE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVml1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZpLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t3dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWak8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9reC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmplLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPa3l1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZqdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2t6LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWai0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rMU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmtPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPazJlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3kyWVZrZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3kyT2szdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95MllWa3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95Mk9rNC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTJZVmstLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTJPazZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFVLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFNTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBVk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBTXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQU51LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFWdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFQLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95NGVBVi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NGVBUmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeTRlQVdPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTRlQVN1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k0ZUFXZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k0ZUFULS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0b08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N21Nc2Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNG9lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTdtTXVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRvdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3bU11LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0by0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N21NdnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHBPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTdtTXdlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRwZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldvZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXby0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHAtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3BlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRxTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldwLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0cWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXcWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHF1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3EtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRxLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dldydS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ck8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXdE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHJlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3QtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRydS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld1ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ci0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXdS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHNPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3ZlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzRzZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0c3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXeHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHMtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2V3llLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR0Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dld6Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZXMi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHR1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2VzRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR0LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlc3Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHVlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WER1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR1dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhFLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYSk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHZPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WEt1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR2ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhMZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0dnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYTU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHYtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTd2WE0tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR3Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3dlhPZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0d2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95N3ZYUE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHd1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SG9lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR3LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUhvLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIcU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHhlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHJlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR4dS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUhzdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIdC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHlPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHZPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR5ZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh3ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0eXUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIeHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHktLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SHlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR6Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUh6ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0emUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIMHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNHp1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDEtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzR6LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUgzTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0ME8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVINGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNDBlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SDV1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3k4QzQwdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3k3NUg3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95OEM0MC0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95NzVIOU8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeThDNDFPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeTc1SC1lLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZJTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3ktNEtNZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95LTRLT3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkl1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeS00S1FPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZJLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3ktNEtSdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95LTRLU08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkplLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVUlPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZKdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVLTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGSi0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVSy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRktPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVU1PLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZLZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVOZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGS3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVT08tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkstLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVBlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZMTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVRdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVUi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRkx1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZMLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVVdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTU8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVVi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRk1lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVVhPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3lfTEZNdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3lfQlVZZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il95X0xGTS0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il95X0JVWnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfeV9MRk5PLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfeV9CVWEtLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZFTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjV3LS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2RWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1eXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkV1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNXotLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZFLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjUxTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2Rk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1Mi0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkZlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTRPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZGdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjU1ZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2Ri0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1NnUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkdPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNTctLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZHZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjU5Ty1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2R3Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo1LS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekJaNkctLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekJaNkFPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pCWjZITy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pCWjZCLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96Qlo2SGUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96Qlo2RE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnJPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmNlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZyZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZmTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWcnUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWZ3Utc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnItLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVmktLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZzTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZrZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWc2Utc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWbHUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnN1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVm0tLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pEcFZzLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pEcFZvTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96RHBWdE8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96RHBWcGUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekRwVnRlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekRwVnF1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJGTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZBZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyRmUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGRE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkZ1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkR1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJGLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZFTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyR08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGRS0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkdlLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkdPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJHdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZHdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UyRy0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGSE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkhPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRkh1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJIZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZJTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGSmUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkgtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdMRktPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJJTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHTEZMZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R0xGTXUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkl1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdVMkFlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pHVTJJLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pHVTJCdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96R1UySk8tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96R1UyQy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfekdVMkplLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfekdVMkVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pMaXRPTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pMaXROTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TjdTMC0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3gtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek43UzF1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN5Ty1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pON1MyLS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96T0VjeWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96TjdTMy0tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfek9FY3l1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfek43UzVPLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pPRWN5LS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pPRWN3dS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16b08tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UWRDWWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtem9lLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFkQ2VlLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpvdS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRZENmdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16by0tc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16Wk8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenBPLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemItLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpwZS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpkTy1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cHUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16ZWUtc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenAtLXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemZ1LXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpxTy1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpnZS1zRWR1SDU5S1NIVjh2Z0EiLz4KLSAgPERlZmF1bHQ6RG9jdW1lbnRhdGlvbiB4bWk6aWQ9Il96UW16cWUtc0VkdUg1OUtTSFY4dmdBIiBiYXNlX0NvbW1lbnQ9Il96UW16aE8tc0VkdUg1OUtTSFY4dmdBIi8+Ci0gIDxEZWZhdWx0OkRvY3VtZW50YXRpb24geG1pOmlkPSJfelFtenF1LXNFZHVINTlLU0hWOHZnQSIgYmFzZV9Db21tZW50PSJfelFtemllLXNFZHVINTlLU0hWOHZnQSIvPgotICA8RGVmYXVsdDpEb2N1bWVudGF0aW9uIHhtaTppZD0iX3pRbXpxLS1zRWR1SDU5S1NIVjh2Z0EiIGJhc2VfQ29tbWVudD0iX3pRbXpsdS1zRWR1SDU5S1NIVjh2Z0EiLz4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjQvdW1hLmdlbm1vZGVsIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2Q5NjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNC91bWEuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC9zcmMiIGVkaXRvckRpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdG9yL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS5lcGYudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzIgotICAgIHJ1bnRpbWVKYXI9InRydWUiIGR5bmFtaWNUZW1wbGF0ZXM9InRydWUiIG1vZGVsTmFtZT0iVW1hIiBlZGl0UGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEucHJvdmlkZXIuVW1hRWRpdFBsdWdpbiIKLSAgICBlZGl0b3JQbHVnaW5DbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5wcmVzZW50YXRpb24uVW1hRWRpdG9yUGx1Z2luIiBub25OTFNNYXJrZXJzPSJ0cnVlIgotICAgIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdCIgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IgotICAgIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkludGVybmFsRURhdGFPYmplY3QiIHN1cHByZXNzRU1GVHlwZXM9InRydWUiCi0gICAgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcmZhY2U9ImNvbW1vbmouc2RvLlNlcXVlbmNlIiBmZWF0dXJlTWFwV3JhcHBlckludGVybmFsSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuRVNlcXVlbmNlIgotICAgIGZlYXR1cmVNYXBXcmFwcGVyQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8udXRpbC5CYXNpY0VTZXF1ZW5jZSIgY29kZUZvcm1hdHRpbmc9InRydWUiCi0gICAgY29udGFpbm1lbnRQcm94aWVzPSJ0cnVlIj4KLSAgPGZvcmVpZ25Nb2RlbD5DOlxIb21lXHBoVE5HXFROR19kb2NzXE9PQURcQ29udGVudEFyY2hpdGVjdHVyZVxNb2RlbHNcVU1BMDRcVW5pZmllZE1ldGhvZEFyY2hpdGVjdHVyZS5tZGw8L2ZvcmVpZ25Nb2RlbD4KLSAgPHN0YXRpY1BhY2thZ2VzPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvU0RPPC9zdGF0aWNQYWNrYWdlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9DT01NT05KX1NETz1vcmcuZWNsaXBzZS5lbWYuY29tbW9uai5zZG88L21vZGVsUGx1Z2luVmFyaWFibGVzPgotICA8bW9kZWxQbHVnaW5WYXJpYWJsZXM+RU1GX0VDT1JFX1NETz1vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iVW1hIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuZXBmIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJ1bWEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIGVjb3JlRW51bT0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2luaXRpYWwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2pvaW4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2ZvcmsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2p1bmN0aW9uIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1BzZXVkb1N0YXRlS2luZC9jaG9pY2UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2VudHJ5UG9pbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGVLaW5kL2V4aXRQb2ludCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Qc2V1ZG9TdGF0ZUtpbmQvdGVybWluYXRlIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHNSZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1VubGltaXRlZE5hdHVyYWwiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1N0cmluZyIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2V0Ii8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9TZXF1ZW5jZSIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vSW50ZWdlciIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vRmxvYXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DbGFzc2lmaWVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lc3BhY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2d1aWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvbWV0aG9kRWxlbWVudFByb3BlcnR5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlY3Rpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlY3Rpb24vc2VjdGlvbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3N1YlNlY3Rpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9wcmVkZWNlc3NvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvbW9kaWZpZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdGVtcGxhdGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QvdG9vbE1lbnRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGFzayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0RlZmluaXRpb24vcG9zdGNvbmRpdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lckFydGlmYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2dsb2JhbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvcmV1c2VkUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9jaGlsZFBhY2thZ2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vYnJpZWZPdXRsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9ub3RhdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL2ltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9yZWFzb25zRm9yTm90TmVlZGluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL2V4dGVybmFsRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uL3BhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9hc3NpZ25tZW50QXBwcm9hY2hlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbi9wdXJwb3NlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9HdWlkYW5jZURlc2NyaXB0aW9uL2F0dGFjaG1lbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2JhY2tncm91bmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2dvYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vbGV2ZWxzT2ZBZG9wdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2ludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BvaW50L3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L3Bvc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvaXNWaXNpYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3JlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9wcm9wZXJ0eSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay92aWV3cG9ydCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9kaWFncmFtIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFZGdlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaW1lbnNpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi93aWR0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RpbWVuc2lvbi9oZWlnaHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVmZXJlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkva2V5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVkZ2UvYW5jaG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS93YXlwb2ludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGlhZ3JhbSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vdmlld3BvaW50Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL25hbWVzcGFjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9HcmFwaE5vZGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQvdHlwZUluZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVU1BU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS9lbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoaWNQcmltaXRpdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qb2x5bGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9seWxpbmUvY2xvc2VkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1BvbHlsaW5lL3dheXBvaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FbGxpcHNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JhZGl1c1kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9FbGxpcHNlL3JvdGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9zdGFydEFuZ2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9lbmRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9FbGxpcHNlL2NlbnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yb2FkbWFwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L3N1cHBvcnRpbmdNYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvY29uY2VwdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BY3Rpdml0eS9yZXVzYWJsZUFzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2lzRW5hY3RhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc1JlcGVhdGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc09uZ29pbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc0V2ZW50RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvbGlua1RvUHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQWZ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01pbGVzdG9uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3RlYW1Sb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL1JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iUmVhZG9ubHkiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL21vZGlmaWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya09yZGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvbGlua1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrT3JkZXIvcHJlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1BsYW5uaW5nRGF0YS9maW5pc2hEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3JhbmsiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9kZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi91c2FnZUd1aWRhbmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9ob3d0b1N0YWZmIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3Njb3BlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uL3VzYWdlTm90ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24vcmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbmNlcHQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9FeGFtcGxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVtcGxhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV2hpdGVwYXBlciIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9jb250ZW50UmVmZXJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU3RhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1dvcmtQcm9kdWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL1JlZ2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlL3N1Ym1hY2hpbmUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmVydGV4Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmVydGV4L2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9vdXRnb2luZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1ZlcnRleC9pbmNvbWluZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZWdpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vVmVydGV4Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9UcmFuc2l0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JlZ2lvbi9TdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9SZWdpb24vU3RhdGVNYWNoaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N0YXRlTWFjaGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1N0YXRlTWFjaGluZS9SZWdpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHJhbnNpdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi9Xb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UcmFuc2l0aW9uL2NvbnRhaW5lciIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RyYW5zaXRpb24vc291cmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVHJhbnNpdGlvbi90YXJnZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHNldWRvU3RhdGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaXNjaXBsaW5lL3Rhc2tzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViZGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3dzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Eb21haW4vd29ya1Byb2R1Y3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi9zdWJkb21haW5zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlL3dvcmtQcm9kdWN0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaXNjaXBsaW5lR3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy9kZWZhdWx0Q29udGV4dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3MvdmFsaWRDb250ZXh0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlL2Jhc2VkT25Qcm9jZXNzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9hZG1hcCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvaW50ZXJmYWNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50L3Byb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9wcm9jZXNzRWxlbWVudHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZGlhZ3JhbXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VJTyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvUHJvY2Vzc0NvbXBvbmVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBsdWdpbi91c2VyQ2hhbmdlYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vbWV0aG9kUGFja2FnZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vYmFzZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGx1Z2luU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9tZXRob2RQYWNrYWdlU2VsZWN0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9wcm9jZXNzVmlld3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2RlZmF1bHRWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9iYXNlQ29uZmlndXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3N1YnRyYWN0ZWRDYXRlZ29yeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYWRkZWRDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzRmFtaWx5L2RlbGl2ZXJ5UHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9wcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS9wcm9wZXJ0aWVzLnR4dCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvbW9kZWwvMS4wLjUvcHJvcGVydGllcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYWU4MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS9wcm9wZXJ0aWVzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1vZGVsCi09PT09PQotTm9uLU5MUyBNYXJrZXJzOgl0cnVlCi1Db250YWlubWVudCBQcm94aWVzOgl0cnVlCi1TdXBwcmVzcyBFTUYgTWV0YWRhdGE6CWZhbHNlCi1Sb290IEV4dGVuZHMgQ2xhc3M6CW9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdAotUm9vdCBFeHRlbmRzIEludGVyZmFjZToJb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QKLUNvZGUgRm9ybWF0dGluZzoJdHJ1ZQotRHluYW1pYyBUZW1wbGF0ZXM6CXRydWUKLVRlbXBsYXRlIERpcmVjdG9yeToJL29yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUvdGVtcGxhdGVzCi0KLVBhY2thZ2UgKFVtYSkKLT09PT09PT09PT09PT0KLUJhc2UgUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYWJlOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDEyNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0idW1hIgotICAgIG5zVVJJPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUvdW1hLmVjb3JlIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuZXBmLnVtYSI+Ci0gIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSIwNiYjeEQ7JiN4QTswNSYjeEQ7JiN4QTswNCYjeEQ7JiN4QTswMyYjeEQ7JiN4QTswMSYjeEQ7JiN4QTswMiIvPgotICA8L2VBbm5vdGF0aW9ucz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDbGFzc2lmaWVyIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1R5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBDbGFzc2lmaWVyLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Fic3RyYWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlR5cGUiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9OYW1lZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZWQgRWxlbWVudC4gIERlZmluZWQgdGhhdCBldmVyeSBlbGVtZW50IGhhcyBhIG5hbWUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTdHJpbmciIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuU3RyaW5nIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4gc29tZSBzdWl0YWJsZSBjaGFyYWN0ZXIgc2V0IHVzZWQgdG8gZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZWwuIENoYXJhY3RlciBzZXRzIG1heSBpbmNsdWRlIG5vbi1Sb21hbiBhbHBoYWJldHMgYW5kIGNoYXJhY3RlcnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkJvb2xlYW4iIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLmxhbmcuQm9vbGVhbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBCb29sZWFuIHR5cGUgaXMgdXNlZCBmb3IgbG9naWNhbCBleHByZXNzaW9uLCBjb25zaXN0aW5nIG9mIHRoZSBwcmVkZWZpbmVkIHZhbHVlcyB0cnVlIGFuZCBmYWxzZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL05hbWVzcGFjZSAjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJOYW1lc3BhY2UiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTmFtZWRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJVTUwgMi4wIG1ldGEtY2xhc3MgTmFtZXNwYWNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJEYXRlIiBpbnN0YW5jZUNsYXNzTmFtZT0iamF2YS51dGlsLkRhdGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyBvZiB0aGUgdHlwZSBEYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJVcmkiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLm5ldC5VUkkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRhdGEgdHlwZSB1c2VkIGZvciBhdHRyaWJ1dGVzIG9mIG1ldGEtbW9kZWwgY2xhc3NlcyB0aGF0IHBvaW50IHRvIHJlc291cmNlcyBzdWNoIGFzIGZpbGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RURhdGFUeXBlIiBuYW1lPSJTZXQiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuU2V0Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iU2VxdWVuY2UiIGluc3RhbmNlQ2xhc3NOYW1lPSJqYXZhLnV0aWwuTGlzdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkludGVnZXIiIGluc3RhbmNlQ2xhc3NOYW1lPSJpbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGludGVnZXIgaXMgYSBwcmltaXRpdmUgdHlwZSByZXByZXNlbnRpbmcgaW50ZWdlciB2YWx1ZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IkRvdWJsZSIgaW5zdGFuY2VDbGFzc05hbWU9ImphdmEubGFuZy5Eb3VibGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb25zdHJhaW50IGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJvZHkiIG9yZGVyZWQ9ImZhbHNlIiBlVHlwZT0iIy8vU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBzdG9yZXMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUGFja2FnZWFibGVFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBjbGFzcyBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcyBNZXRob2QgRWxlbWVudCBpcyB0aGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBjbGFzc2VzIGFuZCBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBldmVyeSBvdGhlciBlbGVtZW50IHR5cGUgb2YgdGhpcyBtb2RlbC4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLiAgTWV0aG9kIEVsZW1lbnQgaW5oZXJpdHMgdGhlIE5hbWUgYXR0cmlidXRlIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCdzIHN1cGVyIGNsYXNzLiAgRXZlcnkgZWxlbWVudCBkZWZpbmVkIGFzIGEgVU1BIGluc3RhbmNlIGlzIGRlcml2ZWQgZnJvbSBNb2RlbCBFbGVtZW50LiAgRXZlcnkgTWV0aG9kIEVsZW1lbnQgaW4tc3RhbmNlIGlzIGF0IGxlYXN0IGRlZmluZWQgYnkgYSB1bmlxdWUgaWQsIGEgbmFtZSwgYXMgd2VsbCBhcyBicmllZiBkZXNjcmlwdGlvbi4mI3hEOyYjeEE7TWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3VpZCIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIgaUQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICZxdW90O3J1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQmcXVvdDsgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgJnF1b3Q7ajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCZxdW90OyB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICZxdW90O0FyY2hpdGVjdHVyZSBEb2N1bWVudCZxdW90Oy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3duZWRSdWxlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uc3RyYWludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kRWxlbWVudFByb3BlcnR5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RFbGVtZW50UHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImtpbmQiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0tpbmQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3VwcHJlc3NlZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSBFeHRlbmRzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9yZGVyaW5nR3VpZGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJLaW5kIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRWxlbWVudCBpcyBhIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4mI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiYjeEE7JiN4RDsmI3hBO1RoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLiYjeEQ7JiN4QTtDb250ZW50IEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIG5vdCBkaXJlY3RseSBmcm9tIE1ldGhvZCBFbGVtZW50IGFueW1vcmUuICBUaGlzIGlzIGFjaGlldmVkIHVzaW5nIFVNTCAyLjAgcGFja2FnZSBtZXJnZSBzZW1hbnRpY3MuICBPbmx5IGlmIGFuIGFkb3B0ZXIgb2YgdGhpcyBtZXRhLW1vZGVsIGRlY2lkZXMgdG8gcmVhbGl6ZSBNZXRob2QgUGx1Z2lucywgaGUgd291bGQgZ2V0IHRoZSB2YXJpYWJpbGl0eSBhbmQgZXh0ZW5zaW9uIGNhcGFiaWxpdGllcyBmb3IgYWxsIENvbnRlbnQgRWxlbWVudHMuJiN4QTtDb250ZW50IEVsZW1lbnQgaW5oZXJpdHMgdGhlIHNlbWFudGljcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50LiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb25jZXB0c0FuZFBhcGVycyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29uY2VwdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4YW1wbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9FeGFtcGxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc2V0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZXJtZGVmaW5pdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vVGVybURlZmluaXRpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL0NsYXNzaWZpZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJhYmxlIEVsZW1lbnQgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLiYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlIChzZWUgU2VjdGlvbiA0LjEuNCkuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLiYjeEE7JiN4RDsmI3hBO1RoaXMgZGVmaW5pdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZXh0ZW5kcyB0aGUgQ29udGVudCBFbGVtZW50IGRlZmluaXRpb24gdmlhIHBhY2thZ2UgbWVyZ2Ugd2l0aCByZWZlcmVuY2VzIHRvIGljb25zIHRoYXQgYXJlIHVzZWQgZm9yIHByZXNlbnRpbmcgQ29udGVudCBFbGVtZW50cyBpbiBhIFVNQS1iYXNlZCBtb2RlbGluZyBlbnZpcm9ubWVudCBhcyB3ZWxsIGFzIHdoZW4gcHVibGlzaGluZyBDb250ZW50IEVsZW1lbnRzIGludG8gZG9jdW1lbnRhdGlvbiBwcmVzZW50YXRpb24gKGUuZy4gZG9jdW1lbnQgb3IgaHRtbCBwYWdlcykuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db250ZW50RGVzY3JpcHRpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXBlaWNvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9VcmkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1VyaSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbnRlbnQgRGVzY3JpcHRpb24gaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgc3RvcmUgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4dGVybmFsSWQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciBvciBsYWJlbCB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZWxlbWVudC4gVXNlZCBsaWtlIGEgc3lub255bSB0byB0aGUgbmFtZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ia2V5Q29uc2lkZXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJLZXkgQ29uc2lkZXJhdGlvbnMgcHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvbmdQcmVzZW50YXRpb25OYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RVbml0IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFVuaXQgaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgc2hhbGwgYmUgbWFpbnRhaW5lZCBpbiBhIE1ldGhvZCBMaWJyYXJ5IGFzIGEgc2VwYXJhdGUgdW5pdCBvZiBjb250cm9sLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEYXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5cmlnaHRTdGF0ZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdXBwb3J0aW5nIE1hdGVyaWFscyBpcyBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlNlY3Rpb24iIGVTdXBlclR5cGVzPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU2VjdGlvbiBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4mI3hEOyYjeEE7U2VjdGlvbiBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgZXh0ZW5kcyBTZWN0aW9uIGRlZmluZWQgaW4gTWV0aG9kIENvcmUgOjogQmFzaWMgRWxlbWVudHMgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4gJiN4QTtGb3IgZXhhbXBsZSwgd2hlbiBhIFRhc2sgY29udHJpYnV0ZXMgdG8gYW5vdGhlciBUYXNrIGl0cyBQcmVzZW50YXRpb24gYXNzb2NpYXRpb24gaXMgY29udHJpYnV0ZWQgaW5jbHVkaW5nIGl0cyBTZWN0aW9ucyAoaS5lLiBpdHMgU3RlcHMpLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBwYXJ0cyBvZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIFNlY3Rpb25zIGNhbiBiZSBuZXN0ZWQgYW5kIHRoZXJlZm9yZSBUYXNrIERlc2NyaXB0aW9ucyBjYW4gYmUgZmxleGlibHkgb3JnYW5pemVkIGluIFN0ZXBzIHdpdGggc3ViLVN0ZXBzLiAgU2VjdGlvbnMgYXJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIHNvIHRoZXkgY2FuIGNvbnRyaWJ1dGUgdG8gZWFjaCBvdGhlci4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgbW9kZWwgYSBUYXNrIHN0ZXAgYXMgYSBTZWN0aW9uIGluc3RhbmNlIHdpdGhvdXQgcmVsYXRpbmcgaXQgdG8gYSBUYXNrIERlc2NyaXB0aW9uIHRoYXQgZGlyZWN0bHkgY29udHJpYnV0ZXMgdG8gKG9yIHJlcGxhY2VzKSBhbm90aGVyIFNlY3Rpb24gd2hpY2ggaXMgcGFydCBvZiBhIFRhc2sgRGVzY3JpcHRpb24uICBUaGlzIGNvbnRyaWJ1dGlvbiAob3IgcmVwbGFjZW1lbnQpIHdvdWxkIGFkZCBuZXcgZGVzY3JpcHRpb24gdGV4dCB0byB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbiAob3IgcmVwbGFjZSB0aGUgb3JpZ2luYWwgc3RlcCBkZXNjcmlwdGlvbikuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgdG8gY29udHJpYnV0ZSBuZXcgQ2hlY2sgTGlzdCBpdGVtcyBvcmdhbml6ZWQgYXMgU2VjdGlvbnMgdG8gYW4gZXhpc3RpbmcgQ2hlY2sgTGlzdCAoZGVmaW5lZCBhcyBndWlkYW5jZSkuICAmI3hBOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlY3Rpb25OYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlNlY3Rpb25zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlZhcmlhYmlsaXR5RWxlbWVudCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBhbiBhYnN0cmFjdCBjbGFzcyBkZXJpdmVkIGZyb20gTWV0aG9kIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBuZXcgY2FwYWJpbGl0aWVzIGZvciBjb250ZW50IHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIENvbnRlbnQgRWxlbWVudHMgb3IgYW55IG90aGVyIE1ldGhvZCBFbGVtZW50IHRoYXQgZGVyaXZlcyBmcm9tIGl0LiAgSXQgaGFzIGJlZW4gcGxhY2VkIGluLWJldHdlZW4gdGhlIGNsYXNzZXMgTWV0aG9kIEVsZW1lbnQgYW5kIENvbnRlbnQgRWxlbWVudCBpbiB0aGUgb3ZlcmFsbCBVTUEgdGF4b25vbXkgb2YgY2xhc3NlcyB1c2luZyB0aGUgVU1MIDIuMCBwYWNrYWdlIG1lcmdlIG1lY2hhbmlzbS4gIFRoZSBhc3NvY2lhdGlvbiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiBzaGFsbCBvbmx5IGJlIGluc3RhbnRpYXRlZCBiZXR3ZWVuIHR3byBzdWJjbGFzc2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQgb2YgdGhlIHNhbWUgdHlwZS4gIFRoZSBlbGVtZW50IG9uIHZhcmFpYmlsaXR5U3BlY2lhbEVsZW1lbnQgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwIGRlZmluZXMgYSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUgZGVmaW5pbmcgdGhlIG5hdHVyZSBvZiB0aGUgcmVsYXRpb25zaGlwIHVzaW5nIGEgbGl0ZXJhbCBmcm9tIHRoZSBlbnVtZXJhdGlvbiBWYXJpYWJpbGl0eSBUeXBlLiYjeEE7VmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgbWV0YS1tb2RlbCBwYWNrYWdlIE1ldGhvZCBQbHVnaW5zIGFkZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB2YXJpYXRpb24gYW5kIGV4dGVuc2lvbiB0byBNZXRob2QgRWxlbWVudHMgdGhhdCBkZXJpdmUgZnJvbSBpdC4gIEJ5IGRlZmF1bHQgYWxsIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlLCBUYXNrLCBHdWlkYW5jZSBUeXBlcywgb3IgQWN0aXZpdGllcyBhcmUgZGVmaW5lZCB0byBiZSBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hBO1ZhcmlhYmlsaXR5IGFuZCBleHRlbnNpb24gcHJvdmlkZXMgdW5pcXVlIG1lY2hhbmlzbXMgZm9yIGN1c3RvbWl6aW5nIG1ldGhvZCBjb250ZW50IHdpdGhvdXQgYWN0dWFsbHkgZGlyZWN0bHkgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBjb250ZW50LCBidXQgYnkganVzdCBiZSBhYmxlIHRvIGRlc2NyaWJlIHdpdGggc2VwYXJhdGUgb2JqZWN0cyB0aGUgZGlmZmVyZW5jZXMgKGFkZGl0aW9ucywgY2hhbmdlcywgb21pc3Npb25zKSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwuICBUaGlzIHBsdWctaW4gY29uY2VwdCBhbGxvd3MgdXNlcnMgdG8gZmFjdG9yIHRoZWlyIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gaW50ZXJyZWxhdGVkIHVuaXRzIGFuZCBldmVuIHRvIGFyY2hpdGVjdCBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGluIGxheWVycyB0aGF0IGV4dGVuZCBlYWNoIG90aGVyIHdpdGggbmV3IGNhcGFiaWxpdGllcy4gIFRoZSByZXN1bHRpbmcgbWV0aG9kIGFuZCBwcm9jZXNzIGRlc2lnbiBjYW4gYmUgZHluYW1pY2FsbHkgY29tYmluZWQgYW5kIGFwcGxpZWQgb24gZGVtYW5kIHVzaW5nIHRoZSBpbnRlcnByZXRhdGlvbiBydWxlcyBkZWZpbmVkIGZvciBWYXJpYWJpbGl0eSBFbGVtZW50IFNwZWNpYWxpemF0aW9ucyBhc3NlbWJsaW5nIHRvIHByb2Nlc3MgcHJhY3RpdGlvbmVycyB0aGUgbW9zdCBhY2N1cmF0ZSBtZXRob2QgYW5kIHByb2Nlc3MgZGVzY3JpcHRpb25zIHBvc3NpYmxlLiAgSXQgYWxzbyBhbGxvd3MgcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRvIGV4dGVuZHMgYW5kIHRhaWxvciBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIHRoZXkgZG8gbm90IG93biBhbmQgdG8gZWFzaWx5IHVwZ3JhZGUgdG8gbmV3ZXIgdmVyc2lvbnMgYnkgc2ltcGx5IHJlYXBwbHkgdGhlaXIgcGVyc29uYWwgY2hhbmdlcyB0byB0aGVzZSB1cGdyYWRlcy4mI3hBO1ZhcmlhYmlsaXR5IEVsZW1lbnQgZGVmaW5lcyB0d28gdHlwZXMgb2YgdmFyaWFiaWxpdHkgYW5kIG9uZSB0eXBlIG9mIGV4dGVuc2lvbiB3aGljaCBhcmUgZm9ybWFsbHkgZGVmaW5lZCBmb3IgdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBpbiBpbnN0YW5jZSBvZiB0aGUgdmFyaWFiaWxpdHlTcGVjaWFsaXphdGlvbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byBWYXJpYWJpbGl0eSBFbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlIGV4aXN0cywgdGhlbiB0aGUgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRoZSBlbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxFbGVtZW50IGVuZCBvZiB0aGUgYXNzb2NpYXRpb24gY2hhbmdlcyB0aGUgQ29udGVudCBFbGVtZW50IGF0IHRoZSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IGVuZC4gU2VlIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGVudW1lcmF0aW9uIGNsYXNzIGZvciBkZWZpbml0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiB2YXJpYWJpbGl0eS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9WYXJpYWJpbGl0eUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibmEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGlzIHRoZSBkZWZhdWx0ICZxdW90O25vdCBhc3NpZ25lZCZxdW90OyB2YWx1ZSBvZiBhIFZhcmlhYmlsbGl0eSBFbGVtZW50J3MgdmFyaWFiaWxpdHlUeXBlIGF0dHJpYnV0ZSB3aGljaCBpcyBzZXQgaW4gdGhlIGNhc2Ugbm8gdmFyaWFiaWxpdHkgYXNzb2NpYXRpb24gaXMgcHJlc2VudCBiZXR3ZWVuIHRoZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBvdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50cy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb250cmlidXRlcyBwcm92aWRlcyBhIHdheSBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIGNvbnRyaWJ1dGUgdGhlaXIgcHJvcGVydGllcyBpbnRvIHRoZWlyIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGFsdGVyaW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcywgaS5lLiBpbiBhbiBhZGRpdGl2ZSBmYXNoaW9uLiAgUHJvcGVydGllcyBjb250cmlidXRlZCBhcmU6IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3QgYWZ0ZXIgaW50ZXJwcmV0YXRpb24gb2YgY29udHJpYnV0aW9uIGlzIHRoYXQgdGhlIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCBhbiBhdWdtZW50ZWQgdmFyaWFudCBvZiB0aGUgZWxlbWVudCB0aGF0IGNvbWJpbmVzIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSB3YXkgdGhpcyBjb21iaW5hdGlvbiBpcyByZWFsaXplZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24uICBGb3IgZXhhbXBsZSwgU3RyaW5nIGF0dHJpYnV0ZXMgYXJlIGNvbmNhdGVuYXRlZCByZXNvbHZpbmcgZW1iZWRkZWQgY29tbWFuZHMgZm9yIGRlcGVuZGVudCB0ZXh0IG9yIG1lcmdpbmcgdGV4dCBmcmFnbWVudHMgKGUuZy4gZGVzY3JpcHRpb25zIGZvciBjb250ZW50IGVsZW1lbnRzKS4gIEFkZGl0aW9uYWwgZWxlbWVudHMgaW4gdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIGFkZGVkIChlLmcuIGFkZGl0aW9uYWwgR3VpZGFuY2UgZWxlbWVudHMgb3IgVGFzayBEZXNjcmlwdG9ycyBvZiBhbiBBY3Rpdml0eSkuICBEaWZmZXJlbnQgZWxlbWVudHMgaW4gdG8tb25lIGFzc29jaWF0aW9ucyBhcmUgaWdub3JlZCAoZS5nLiB0aGUgb25lIFByaW1hcnkgUGVyZm9ybWVyIG9mIGEgVGFzaykuICBNdWx0aXBsZSBDb250ZW50IEVsZW1lbnRzIGNhbiBjb250cmlidXRlIHRvIHRoZSBzYW1lIGJhc2UgZWxlbWVudCBhbmQgYWxsIG9mIHRoZXNlIGNvbnRyaWJ1dGlvbnMgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIGJhc2UgaW4gdGhlIHNhbWUgZmFzaGlvbi4gVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczomI3hBO2F0dHJpYnV0ZSB2YWx1ZXM6JiN4OTtTdHJpbmcgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgY29uY2F0ZW5hdGVkIHdpdGggdmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBPdGhlciB2YWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIGFueSBvdGhlciB0eXBlIHN1Y2ggYXMgSW50ZWdlciwgRGF0ZSBhcmUgaWdub3JlZC4mI3hBO1RoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuJiN4QTswLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O1RoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMga2VwdCBhbmQgYW55IGFzc29jaWF0aW9uIGZyb20gdGhlIGNvbnRyaWJ1dGluZyBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaWdub3JlZC4mI3hBOzAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7QXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGFkZGVkIHRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGFzc29jaWF0aW9uIGluc3RhbmNlcyBvZiB0aGUgYmFzZWQtb24gZWxlbWVudC4gIElmIGJvdGggVmFyaWFiaWxpdHkgRWxlbWVudHMgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHRoZW4gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIGFzc29jaWF0aW9uIHdpbGwgcmVtYWluLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXh0ZW5zaW9uIGFsbG93cyBNZXRob2QgUGx1Z2lucyB0byBlYXNpbHkgcmV1c2UgZWxlbWVudHMgZnJvbSBhIEJhc2UgUGx1Z2luIGJ5IHByb3ZpZGluZyBhIGtpbmQgb2YgaW5oZXJpdGFuY2UgZm9yIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBBdHRyaWJ1dGUgdmFsdWVzIGFuZCBBc3NvY2lhdGlvbiBpbnN0YW5jZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgcmVzdWx0IG9mIGludGVycHJldGF0aW9uIGlzIHRoYXQgdGhlIHNwZWNpYWwgZWxlbWVudCBoYXMgdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGUgYmFzZWQtb24gaGFzLCBidXQgbWlnaHQgZGVmaW5lIGl0cyBvd24gYWRkaXRpb25zLiAgSGVuY2UgZXh0ZW5kcyBpcyBub3QgdXNlZCB0byBtb2RpZnkgY29udGVudCBvZiB0aGUgYmFzZSBQbHVnaW4sIGJ1dCB0byBwcm92aWRlIHRoZSBhYmlsaXR5IGZvciB0aGUgZXh0ZW5kaW5nIFBsdWdpbiB0byBkZWZpbmUgaXRzIG93biBjb250ZW50IHdoaWNoIGlzIGEgdmFyaWFudCBvZiBjb250ZW50IGFscmVhZHkgZGVmaW5lZCAoZS5nLiBhIHNwZWNpYWwgdmVyc2lvbiBvZiBhIGdlbmVyaWMgUmV2aWV3IFJlY29yZCBmb3IgYSBzcGVjaWZpYyB0eXBlIG9mIHJldmlldykuICBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB0aGUgYmFzZSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBWYXJpYWJpbGl0eSBFbGVtZW50cyBjYW4gYmUgdXNlZCBzaWRlIGJ5IHNpZGUsIGJ1dCByZWZlciB0byBlYWNoIG90aGVyIHZpYSB0aGUgZXh0ZW5kcyByZWxhdGlvbnNoaXAuICBFeHRlbmRzIGFsc28gcHJvdmlkZXMgdGhlIGtleSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0byBQcm9jZXNzZXM6IEEgcGF0dGVybiBpcyBhcHBsaWVkIGJ5IGRlZmluaW5nIGFuIGV4dGVuZHMgcmVsYXRpb25zaGlwcyBmcm9tIGFuIEFjdGl2aXR5IG9mIHRoZSBhcHBseWluZyBQcm9jZXNzZXMgdG8gdGhlIFBhdHRlcm4uICBUaGUgQWN0aXZpdHkgaW5oZXJpdHMgYXNzb2NpYXRpb25zIGluc3RhbmNlcyBmcm9tIHRoZSBwYXR0ZXJuIGFuZCB0aGUgcGF0dGVybiBhcHBlYXJzIHRvIGJlIHBhcnQgb2YgdGhlIHJlc3VsdGluZyBQcm9jZXNzIGFmdGVyIEludGVycHJldGF0aW9uLiYjeEE7YXR0cmlidXRlIHZhbHVlczomI3g5O1ZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBlbGVtZW50IGFyZSBpbmhlcml0ZWQgYW5kIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudHMgYXR0cmlidXRlcy4gIElmIHRoZSBzcGVjaWFsIGVsZW1lbnQgYXR0cmlidXRlcyBhcmUgYWxyZWFkeSBwb3B1bGF0ZWQgdGhlIGluaGVyaXRlZCB2YWx1ZXMgYXJlIGlnbm9yZWQuICAmI3hBO1RoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuJiN4QTswLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O1RoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgaXRzIG93biBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHRoZSBpbmhlcml0ZWQgb25lIGlzIGlnbm9yZWQuJiN4QTswLi5uLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O0Fzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuJiN4QTsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSZXBsYWNlcyBwcm92aWRlcyBhIHdheSBmb3IgVmFyaWFiaWxpdHkgRWxlbWVudHMgdG8gcmVwbGFjZSBhIGJhc2UgVmFyaWFiaWxpdHkgRWxlbWVudCB3aXRob3V0IGRpcmVjdGx5IGNoYW5naW5nIGFueSBvZiBpdHMgZXhpc3RpbmcgcHJvcGVydGllcy4gIFRoaXMgaXMgaW4gbW9zdCBjYXNlcyB1c2VkIGZvciBNZXRob2QgUGx1Z2lucyB0aGF0IGFpbSB0byByZXBsYWNlIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFzaywgb3IgQWN0aXZpdGllcyB3aXRoIGVpdGhlciBhIGNvbXBsZXRlIG5ldyB2YXJpYW50IG9yIHRvIGNoYW5nZSBmdW5kYW1lbnRhbCByZWxhdGlvbnNoaXBzIG9mIHRoZXNlIGVsZW1lbnRzIChlLmcuIFJvbGUtQXJ0aWZhY3QgcmVzcG9uc2liaWxpdHkpLiAgUHJvcGVydGllcyByZXBsYWNlZCBhcmUgYXR0cmlidXRlIHZhbHVlcyBhbmQgYXNzb2NpYXRpb24gaW5zdGFuY2VzLiAgVGhlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgdGhlIGJhc2UgQ29udGVudCBFbGVtZW50IGlzIGxvZ2ljYWxseSByZXBsYWNlZCB3aXRoIHRoaXMgbmV3IHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdG8gd2hpY2ggYWxsIGluY29taW5nIGFzc29jaWF0aW9ucyBzdGlsbCBwb2ludCBhcyBiZWZvcmUsIGJ1dCB3aGljaCBoYXMgcG90ZW50aWFsbHkgbmV3IGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIG91dGdvaW5nIGFzc29jaWF0aW9uIHByb3BlcnRpZXMuICBUaGlzIHByb3ZpZGVzIGEgdmVyeSBwb3dlcmZ1bCBtZWNoYW5pc20gdG8gcmVwbGFjZSwgZm9yIGV4YW1wbGUsIHdob2xlIEFjdGl2aXRpZXMgaW4gYSBQcm9jZXNzIHdpdGggY29tcGxldGUgbmV3IHJlYWxpemF0aW9ucyBvZiB0aGUgQWN0aXZpdHkuICBGb3IgaW5zdGFuY2UsIHJlcGxhY2luZyBhbiBBY3Rpdml0eSBkb2luZyB1c2UgY2FzZS1iYXNlZCBkZXNpZ24gd2l0aCBhbiBhY3Rpdml0eSBkb2luZyBhZ2lsZSBjb2RlLWNlbnRyaWMgZGV2ZWxvcG1lbnQgZG9pbmcgdGhlIHNhbWUgd29yayB1c2luZyBhIGRpZmZlcmVudCBkZXZlbG9wbWVudCB0ZWNobmlxdWUgdXRpbGl6aW5nIGRpZmZlcmVudCBSb2xlcywgVGFza3MsIGV0Yy4gIEFub3RoZXIgZXhhbXBsZSwgd291bGQgYmUgdG8gcmVwbGFjZSBhbiBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBkYXRhYmFzZSBkZXNpZ24gZm9yIGFuIFJEQk1TIHdpdGggYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBPT0RCTVMuICBBIFZhcmlhYmlsaXR5IEVsZW1lbnQgY2FuIG9ubHkgYmUgcmVwbGFjZWQgYnkgb25lIG90aGVyIGVsZW1lbnQgYXQgYSB0aW1lLiAgRm9yIGV4YW1wbGUsIGlmIHR3byBNZXRob2QgUGx1Z2lucyByZXBsYWNlIHRoZSBzYW1lIGVsZW1lbnQgb25seSBvbmUgTWV0aG9kIFBsdWdpbiBjYW4gYmUgdXNlZCBmb3IgaW50ZXJwcmV0YXRpb24gKHNlZSBjb25jZXB0IG9mIE1ldGhvZCBDb25maWd1cmF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIHJlc29sdmUgc3VjaCBjb25mbGljdHMsIFNlY3Rpb24gNy4xLjIpLiAgVGhlIGZvbGxvd2luZyB0YWJsZSBwcm92aWRlcyB0aGUgZGV0YWlsZWQgbGlzdCBvZiBpbnRlcnByZXRhdGlvbiBydWxlczomI3hBO2F0dHJpYnV0ZSB2YWx1ZXM6JiN4OTtWYWx1ZXMgZnJvbSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGFyZSByZXBsYWNlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50IGluY2x1ZGluZyB1bmFzc2lnbmVkIHZhbHVlcy4mI3hBO1RoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuJiN4QTswLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczomI3g5O1RoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYXNzb2NpYXRpb24gaW5zdGFuY2UgZnJvbSB0aGUgcmVwbGFjaW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIElmIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHJlc3VsdGluZyBlbGVtZW50IHdpbGwgYWxzbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbi4mI3hBOzAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOiYjeDk7QXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgcmVwbGFjZSBhbGwgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LiYjeEE7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZUxpdGVyYWxzPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxDb250cmlidXRpb24iIHZhbHVlPSI0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJsb2NhbFJlcGxhY2VtZW50IiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iZXh0ZW5kc1JlcGxhY2VzIiB2YWx1ZT0iNiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25jZXB0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQ29uY2VwdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENoZWNrbGlzdCBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgR3VpZGVsaW5lIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmV1c2FibGVBc3NldCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJldXNhYmxlIEFzc2V0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hBO2hvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVybURlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIgZVN1cGVyVHlwZXM9IiMvL0NsYXNzaWZpZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1ByaW1hcnlFeHRlbnNpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBcnRpZmFjdCIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBcnRpZmFjdCBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLiYjeEE7QXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICZxdW90O293biZxdW90OyBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lckFydGlmYWN0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0FydGlmYWN0IiBlT3Bwb3NpdGU9IiMvL0FydGlmYWN0L2NvbnRhaW5lZEFydGlmYWN0cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0FydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdCIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL0Z1bGZpbGxhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iV29yayBQcm9kdWN0IGlzIGFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLiYjeEE7QSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suJiN4QTsmI3hEOyYjeEE7VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRvb2xNZW50b3JzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkZ1bGZpbGxhYmxlRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImZ1bGZpbGxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9GdWxmaWxsYWJsZUVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUmVwb3J0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUmVwb3J0IGlzIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVG9vbE1lbnRvciIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgTWVudG9yIGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlbGl2ZXJhYmxlIGlzIGEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGVsaXZlcmVkV29ya1Byb2R1Y3RzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3RlcCIgZVN1cGVyVHlwZXM9IiMvL1NlY3Rpb24gIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgU3RlcCBpcyBhIFNlY3Rpb24gYW5kIFdvcmsgRGVmaW5pdGlvbiB0aGF0IGlzIHVzZWQgdG8gb3JnYW5pemUgVGFza3MgaW50byBwYXJ0cyBvciBzdWJ1bml0cyBvZiB3b3JrLiAgU3RlcHMgaW5oZXJpdCB0aGUgc3ViU2VjdGlvbnMgZGVjb21wb3NpdGlvbiBmcm9tIFNlY3Rpb24gYW5kIGNhbiB0aGVyZWZvcmUgZGVzY3JpYmUgU3ViLVN0ZXBzIG5lc3RlZCBpbnRvIFN0ZXBzLiYjeEE7QSBTdGVwIGRlc2NyaWJlcyBhIG1lYW5pbmdmdWwgYW5kIGNvbnNpc3QgcGFydCBvZiB0aGUgb3ZlcmFsbCB3b3JrIGRlc2NyaWJlZCBmb3IgYSBUYXNrLiAgVGhlIGNvbGxlY3Rpb24gb2YgU3RlcHMgZGVmaW5lZCBmb3IgYSBUYXNrIHJlcHJlc2VudHMgYWxsIHRoZSB3b3JrIHRoYXQgc2hvdWxkIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGUgb3ZlcmFsbCBkZXZlbG9wbWVudCBnb2FsIG9mIHRoZSBUYXNrLiAgTm90IGFsbCBzdGVwcyBhcmUgbmVjZXNzYXJpbHkgcGVyZm9ybWVkIGVhY2ggdGltZSBhIFRhc2sgaXMgaW52b2tlZCBpbiBhIFByb2Nlc3MgKHNlZSBUYXNrIERlc2NyaXB0b3IpLCBzbyB0aGV5IGNhbiBhbHNvIGJlIGV4cHJlc3NlZCBpbiB0aGUgZm9ybSBvZiBhbHRlcm5hdGUgJ2Zsb3dzJyBvZiB3b3JrLiAgRGlmZmVyZW50IHdheXMgb2YgYWNoaWV2aW5nIHRoZSBzYW1lIGRldmVsb3BtZW50IGdvYWwgY2FuIHRoZW4gYmUgJ2Fzc2VtYmxlZCcgYnkgc2VsZWN0aW5nIGRpZmZlcmVudCBjb21iaW5hdGlvbnMgb2Ygc3RlcHMgd2hlbiBhcHBseWluZyB0aGUgVGFzayBpbiBhIFByb2Nlc3MuICBUeXBpY2FsIGtpbmRzIG9mIHN0ZXBzIGEgVGFzayBhdXRob3Igc2hvdWxkIGNvbnNpZGVyIGFyZTogVGhpbmtpbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIHVuZGVyc3RhbmQgdGhlIG5hdHVyZSBvZiB0aGUgdGFzaywgZ2F0aGVycyBhbmQgZXhhbWluZXMgdGhlIGlucHV0IGFydGlmYWN0cywgYW5kIGZvcm11bGF0ZXMgdGhlIG91dGNvbWUuIFBlcmZvcm1pbmcgc3RlcHM6IHdoZXJlIHRoZSBpbmRpdmlkdWFsIHJvbGVzIGNyZWF0ZSBvciB1cGRhdGUgc29tZSBhcnRpZmFjdHMuIFJldmlld2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgaW5zcGVjdHMgdGhlIHJlc3VsdHMgYWdhaW5zdCBzb21lIGNyaXRlcmlhLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtEZWZpbml0aW9uIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEE7V29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWNvbmRpdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9Db25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0Y29uZGl0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldoaXRlcGFwZXIiIGVTdXBlclR5cGVzPSIjLy9Db25jZXB0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4mI3hBO0EgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuICYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4QTtGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgJnF1b3Q7RGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCZxdW90OyBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICZxdW90O21ldGhvZCZxdW90OyBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuJiN4QTsmI3hEOyYjeEE7VGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBUYXNrIChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdGlvbmFsIGFzc29jaWF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im91dHB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N0ZXAiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50ICMvL0Z1bGZpbGxhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBSb2xlIGlzIGEgY29udGVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gICYjeEE7QSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtb2RpZmllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb25PcHRpb25zIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub3RhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhc29uc0Zvck5vdE5lZWRpbmciIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbERlc2NyaXB0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2luZ0d1aWRhbmNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJza2lsbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzeW5vbnltcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRhY2htZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFkZGl0aW9uYWxJbmZvIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2JsZW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhY2tncm91bmQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFwcGxpY2F0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxldmVsc09mQWRvcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvbGUgU2V0IG9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICZxdW90O0FuYWx5c3RzJnF1b3Q7IFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAmcXVvdDtCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QmcXVvdDssICZxdW90O1N5c3RlbSBBbmFseXN0JnF1b3Q7LCBhcyB3ZWxsIGFzICZxdW90O1JlcXVpcmVtZW50cyBTcGVjaWZpZXImcXVvdDsgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29udGVudCBDYXRlZ29yeSBpcyBhbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEb21haW4gaXMgYSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuJiN4QTtEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9IndvcmtQcm9kdWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZG9tYWlucyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRG9tYWluIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAmcXVvdDtDbGFzcyBEaWFncmFtJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90Oywgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ3b3JrUHJvZHVjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY2lwbGluZSBHcm91cGluZ3MgYXJlIHVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgJnF1b3Q7U29mdHdhcmUgRGlzY2lwbGluZXMmcXVvdDsgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgTWFuYWdlbWVudCZxdW90OyBvciAmcXVvdDtUZXN0aW5nJnF1b3Q7OyAmcXVvdDtJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50JnF1b3Q7IHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgJnF1b3Q7SVQgT3BlcmF0aW9uYWwgU2VydmljZXMmcXVvdDssICZxdW90O0lUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMmcXVvdDssIG9yICZxdW90O0lUIEVuYWJsaW5nIFNlcnZpY2VzJnF1b3Q7LiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NpcGxpbmVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaXNjaXBsaW5lIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGlzY2lwbGluZSBpcyBhIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4mI3hBO0EgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC4mI3hBOyYjeEQ7JiN4QTtEaXNjaXBsaW5lIGlzIGEgY2F0ZWdvcml6YXRpb24gb2YgVGFza3MgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4gIFRoaXMgaXMgdGhlIGV4dGVuc2lvbnMgb2YgRGlzY2lwbGluZSBkZWZpbmVkIGluIHRoZSBNZXRob2QgQ29yZSBwYWNrYWdlIGFkZGluZyBhbiBhZGRpdGlvbmFsIGFzc29jaWF0aW9uIHRvIEFjdGl2aXRpZXMsIHdoaWNoIHJlcHJlc2VudCB0eXBpY2FsIHN0YW5kYXJkIG9yIHJlZmVyZW5jZSB3YXlzIG9mIG1lYW5pbmdmdWwgZ3JvdXBpbmdzIG9mIHRoZSBEaXNjaXBsaW5lJ3MgVGFza3MgaW50byB3b3JrZmxvd3MuJiN4QTtUYXNrcyByZXByZXNlbnQgZGVzY3JpcHRpb25zIG9mIHdvcmssIHdoaWNoIGFyZSBjYXRlZ29yaXplZCBieSBEaXNjaXBsaW5lcy4gIFRoZSByZWFzb24gdGhhdCBzZXZlcmFsIFRhc2tzIGFyZSBhbGwgY2F0ZWdvcml6ZWQgYnkgdGhlIHNhbWUgRGlzY2lwbGluZSBpcyB0aGF0IHRoZXkgYWxsIHJlcHJlc2VudCBhIHBhcnQgaW4gYWNoaWV2aW5nIGEgaGlnaGVyIGdvYWwgb3IgcGVyZm9ybWluZyB3b3JrIHRoYXQgaXMgYWxsIHJlbGF0ZWQgdG8gZWFjaCBvdGhlci4gIEV2ZXJ5IERpc2NpcGxpbmUgZGVmaW5lcyBzdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIGl0IGNhdGVnb3JpemVzLiAgU3VjaCBzdGFuZGFyZCB3YXlzIGFyZSBleHByZXNzIGJ5IEFjdGl2aXRpZXMgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBkZWZpbmluZyBob3cgdGhlIFRhc2tzIGNhdGVnb3JpemVkIGJ5IHRoZSBEaXNjaXBsaW5lICd3b3JrIHRvZ2V0aGVyJyBpbiB0aGUgbW9zdCBnZW5lcmljIHdheS4gIFRoZXNlIHJlZmVyZW5jZSB3b3JrZmxvd3MgYXJlIG9mdGVuIHVzZWQgZm9yIGVkdWNhdGluZyBhbmQgdGVhY2hpbmcgcHJhY3RpdGlvbmVycy4gJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idGFza3MiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2siLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViZGlzY2lwbGluZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGlzY2lwbGluZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3dzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9BY3Rpdml0eSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50ICMvL0Z1bGZpbGxhYmxlRWxlbWVudCAjLy9WYXJpYWJpbGl0eUVsZW1lbnQgIy8vV29ya0RlZmluaXRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4mI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiYjeEE7JiN4RDsmI3hBO1RoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IGludHJvZHVjZWQgaW4gdGhlIHBhY2thZ2UgQnJlYWtkb3duIHdpdGggbmV3IGNhcGFiaWxpdGllcyBhbmQgaXMgdGhlIGJhc2lzIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY2xhc3MgUHJvY2Vzcy4mI3hBO0V4dGVuZHMgQWN0aXZpdHkgd2l0aCBhbiBhc3NvY2lhdGlvbiB0byBSb2FkbWFwLiAgVGhpcyBkZWZpbml0aW9uIG9mIEFjdGl2aXR5IGFsc28gcGFydGljaXBhdGVzIGluIHRoZSBleHRlbnNpb24gb2YgdGhlIERpc2NpcGxpbmUgY2F0ZWdvcnkuJiN4QTsmI3hEOyYjeEE7QWN0aXZpdHkgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBpbmhlcml0cyBmcm9tIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gZXh0ZW5kIEFjdGl2aXR5IHdpdGggbmV3IGNhcGFiaWxpdGllcyBmb3IgdmFyaWFiaWxpdHkuJiN4RDsmI3hBO0FjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOiYjeEQ7JiN4QTstIEV4dGVuZDogVG8gYXBwbHkgYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gYSBwcm9jZXNzIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgd2hpY2ggZXh0ZW5kcyB0aGUgcGF0dGVybidzIHRvcC1sZXZlbCBhY3Rpdml0eS4gIFRocm91Z2ggZXh0ZW5zaW9uIHRoZSBleHRlbmRpbmcgQWN0aXZpdHkgaW5oZXJpdHMgdGhlIHBhdHRlcm5zIEJyZWFrZG93biBFbGVtZW50cy4mI3hEOyYjeEE7LSBSZXBsYWNlOiBUbyByZXBsYWNlIGFuIEFjdGl2aXR5IG9mIGFuIGFwcGxpZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIGFuIGV4aXN0aW5nIHByb2Nlc3MgZm9yIHdoaWNoIG9uZSBkZXZlbG9wcyBhIFByb2Nlc3MgQ29udHJpYnV0aW9uIChvciBhIGNvbWJpbmF0aW9uIG9mIGJvdGgpIG9uZSB3b3VsZCBjcmVhdGUgYW4gQWN0aXZpdHkgYW5kIHNwZWNpZnkgdGhlIHJlcGxhY2UgdmFyaWFiaWxpdHkgc3BlY2lhbGl6YXRpb24gYmV0d2VlbiB0aGVtLiYjeEQ7JiN4QTstIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LiYjeEQ7JiN4QTsmI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJyZWFrZG93bkVsZW1lbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvYWRtYXBzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2FkbWFwIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaXMgYSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzT25nb2luZyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLiYjeEE7JiN4QTsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJsaW5rVG9QcmVkZWNlc3NvciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya09yZGVyIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gJnF1b3Q7U1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMmcXVvdDsgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgJnF1b3Q7U29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzJnF1b3Q7IG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICZxdW90O0N1c3RvbWVyLkFyY2hpdGVjdCZxdW90OyB3b3VsZCBkZWZpbmUgYSAmcXVvdDtDdXN0b21lciZxdW90OyBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgJnF1b3Q7QXJjaGl0ZWN0JnF1b3Q7IGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNQbGFubmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuJiN4QTsmI3hBOyYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJKdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICZxdW90O0RldGFpbCBVc2UgQ2FzZSZxdW90OyB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGlzT3B0aW9uYWwgYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVzZW50ZWRBZnRlciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZXNlbnRlZEJlZm9yZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBsYW5uaW5nRGF0YSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9QbGFubmluZ0RhdGEiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9BY3Rpdml0eSIgZU9wcG9zaXRlPSIjLy9BY3Rpdml0eS9icmVha2Rvd25FbGVtZW50cyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGVja2xpc3RzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9DaGVja2xpc3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29uY2VwdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbmNlcHQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZXhhbXBsZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0V4YW1wbGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3VpZGVsaW5lcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJldXNhYmxlQXNzZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9SZXVzYWJsZUFzc2V0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZW1wbGF0ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlbXBsYXRlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlcG9ydHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlcG9ydCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0b29sbWVudG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Ub29sTWVudG9yIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuJiN4QTtQcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUGxhbm5pbmdEYXRhIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBsYW5uaW5nIERhdGEgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hBO1BsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4mI3hBOyhOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic3RhcnREYXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RhdGUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFuayIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9JbnRlZ2VyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya09yZGVyIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgaXMgYSBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEE7KE5vdGUsIFdvcmsgT3JkZXIgaXMgbm90IG1vZGVsZWQgYXMgYW4gQXNzb2NpYXRpb24gQ2xhc3MgdG8gcHJvdmlkZSBhIHN0cmFpZ2h0Zm9yd2FyZCBtYXBwaW5nICB0byBYTUkgYW5kIEVNRi4pJiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxpbmtUeXBlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlZCIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IldvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImZpbmlzaFRvU3RhcnQiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBhbmQgJnF1b3Q7UGFpbnQgZmVuY2UsJnF1b3Q7ICZxdW90O1BhaW50IGZlbmNlJnF1b3Q7IGNhbid0IHN0YXJ0IHVudGlsICZxdW90O0NvbnN0cnVjdCBmZW5jZSZxdW90OyBmaW5pc2hlcy4gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24gdHlwZSBvZiBkZXBlbmRlbmN5IGFuZCB0aGUgZGVmYXVsdCBmb3IgYSBuZXcgV29yayBPcmRlciBpbnN0YW5jZS4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIgdmFsdWU9IjEiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IGZpbmlzaCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgZmluaXNoZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0d28gQnJlYWtkb3duIEVsZW1lbnRzLCAmcXVvdDtBZGQgd2lyaW5nJnF1b3Q7IGFuZCAmcXVvdDtJbnNwZWN0IGVsZWN0cmljYWwsJnF1b3Q7ICZxdW90O0luc3BlY3QgZWxlY3RyaWNhbCZxdW90OyBjYW4ndCBmaW5pc2ggdW50aWwgJnF1b3Q7QWRkIHdpcmluZyZxdW90OyBmaW5pc2hlcy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvU3RhcnQiIHZhbHVlPSIyIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQnJlYWtkb3duIEVsZW1lbnQgKEIpIGNhbm5vdCBzdGFydCB1bnRpbCBCcmVha2Rvd24gRWxlbWVudCAoQSkgc3RhcnRzLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdHdvIEJyZWFrZG93biBFbGVtZW50cywgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGFuZCAmcXVvdDtMZXZlbCBjb25jcmV0ZSwmcXVvdDsgJnF1b3Q7TGV2ZWwgY29uY3JldGUmcXVvdDsgY2FuJ3QgYmVnaW4gdW50aWwgJnF1b3Q7UG91ciBmb3VuZGF0aW9uJnF1b3Q7IGJlZ2lucy4mI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lTGl0ZXJhbHM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJzdGFydFRvRmluaXNoIiB2YWx1ZT0iMyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIFRoaXMgZGVwZW5kZW5jeSB0eXBlIGNhbiBiZSB1c2VkIGZvciBqdXN0LWluLXRpbWUgc2NoZWR1bGluZyB1cCB0byBhIG1pbGVzdG9uZSBvciB0aGUgcHJvamVjdCBmaW5pc2ggZGF0ZSB0byBtaW5pbWl6ZSB0aGUgcmlzayBvZiBhIEJyZWFrZG93biBFbGVtZW50IGZpbmlzaGluZyBsYXRlIGlmIGl0cyBkZXBlbmRlbnQgQnJlYWtkb3duIEVsZW1lbnRzIHNsaXAuIElmIGEgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoZSBtaWxlc3RvbmUgb3IgcHJvamVjdCBmaW5pc2ggZGF0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGV4YWN0bHkgd2hlbiBhbmQgeW91IGRvbid0IHdhbnQgYSBsYXRlIGZpbmlzaCB0byBhZmZlY3QgdGhlIGp1c3QtaW4tdGltZSBCcmVha2Rvd24gRWxlbWVudCwgeW91IGNhbiBjcmVhdGUgYW4gU0YgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBCcmVha2Rvd24gRWxlbWVudCB5b3Ugd2FudCBzY2hlZHVsZWQganVzdCBpbiB0aW1lICh0aGUgcHJlZGVjZXNzb3IpIGFuZCBpdHMgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCAodGhlIHN1Y2Nlc3NvcikuIFRoZW4gaWYgeW91IHVwZGF0ZSBwcm9ncmVzcyBvbiB0aGUgc3VjY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LCBpdCB3b24ndCBhZmZlY3QgdGhlIHNjaGVkdWxlZCBkYXRlcyBvZiB0aGUgcHJlZGVjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VMaXRlcmFscz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9hZG1hcCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4mI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUb29sIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRvb2wgaXMgYSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idG9vbE1lbnRvcnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rvb2xNZW50b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvbGVTZXRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlU2V0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkN1c3RvbUNhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIEN1c3RvbSBDYXRlZ29yeSBpcyBhIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgJnF1b3Q7VGVzdGluZyZxdW90OyBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhdGVnb3JpemVkRWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJDYXRlZ29yaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iTWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV1c2VkUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2hpbGRQYWNrYWdlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kUGFja2FnZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250ZW50RWxlbWVudHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNaWxlc3RvbmUgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXF1aXJlZFJlc3VsdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gICYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiYjeEE7Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuJiN4QTtGb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uJiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iV29ya1Byb2R1Y3QiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vV29ya1Byb2R1Y3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW1wYWN0ZWRCeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlT3Bwb3NpdGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RzIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImltcGFjdHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIgZU9wcG9zaXRlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0ZWRCeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyYWJsZVBhcnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLiYjeEE7RGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuICYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikl0ZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJdGVyYXRpb24gaXMgYSBzcGVjaWFsIEFjdGl2aXR5LCB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4mI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBoYXNlIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4QTtQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZWFtUHJvZmlsZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVGVhbSBQcm9maWxlIGlzIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4mI3hBO1dvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4mI3hBO0hlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZWFtUm9sZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1cGVyVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9UZWFtUHJvZmlsZSIgZU9wcG9zaXRlPSIjLy9UZWFtUHJvZmlsZS9zdWJUZWFtIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YlRlYW0iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1RlYW1Qcm9maWxlIiBlT3Bwb3NpdGU9IiMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUm9sZSBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iUm9sZSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1vZGlmaWVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJlc3BvbnNpYmxlRm9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0b3IiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCAjLy9EZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4mI3hBO0Ega2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLiYjeEE7JiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iVGFzayIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9UYXNrIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhc3Npc3RlZEJ5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlRGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJleHRlcm5hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvcHRpb25hbElucHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3V0cHV0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icGVyZm9ybWVkUHJpbWFyaWx5QnkiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JvbGVEZXNjcmlwdG9yIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbGVjdGVkU3RlcHMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbXBvc2l0ZSBSb2xlIGlzIGEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLiYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWdncmVnYXRlZFJvbGVzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Sb2xlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEE7QSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZWR1Y2F0aW9uTWF0ZXJpYWxzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9TdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LiYjeEE7Q29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLiYjeEE7JiN4RDsmI3hBO1Byb2Nlc3MgaW4gdGhlIHBhY2thZ2UgTGlicmFyeSBDb25maWd1cmF0aW9uIGV4dGVuZHMgdGhlIGNsYXNzIFByb2Nlc3Mgd2l0aCBhc3NvY2lhdGlvbiByZWxhdGluZyBhIFByb2Nlc3MgdG8gb25lIGRlZmF1bHQgYW5kIG1hbnkgb3B0aW9uYWwgdmFsaWQgQ29uZmlndXJhdGlvbnMuJiN4QTtUaGVzZSBjb25maWd1cmF0aW9ucyBkZXNjcmliZSB2YWxpZCBjb250ZXh0cyBmb3IgdGhlIFByb2Nlc3Mgd2l0aGluIGEgTWV0aG9kIExpYnJhcnkgaW5kaWNhdGluZyB1bmRlciB3aGljaCBDb25maWd1cmF0aW9ucyBhIFByb2Nlc3MgaXMgd2VsbCBkZWZpbmVkLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImluY2x1ZGVzUGF0dGVybnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NhcGFiaWxpdHlQYXR0ZXJuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsaWRDb250ZXh0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLiYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4QTstIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLiYjeEE7LSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4mI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBsdWdpbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NWaWV3cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRlZmF1bHRWaWV3IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbnMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3VidHJhY3RlZENhdGVnb3J5IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFBsdWdpbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZFVuaXQgIy8vUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBNZXRob2QgUGx1Z2luIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEE7TWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuJiN4QTtTcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImJhc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4QTtBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4mI3hBOyIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNlZE9uUHJvY2Vzc2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJhY3RpY2UgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICZxdW90O01hbmFnZSBSaXNrcyZxdW90OywgJnF1b3Q7Q29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5JnF1b3Q7LCAmcXVvdDtBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50JnF1b3Q7LCBldGMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViUHJhY3RpY2VzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9QcmFjdGljZSIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0NvbnRlbnRFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFjdGl2aXR5UmVmZXJlbmNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vQWN0aXZpdHkiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNhZ2VHdWlkYW5jZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHVycG9zZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd3RvU3RhZmYiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjYWxlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotICAgICAgICBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyaXNrTGV2ZWwiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW5nVGVjaG5pcXVlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvamVjdE1lbWJlckV4cGVydGlzZSIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlT2ZDb250cmFjdCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjb3BlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL1N0cmluZyIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBlVHlwZT0iIy8vU3RyaW5nIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuICIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciByZXByZXNlbnRzIGEgUHJvY2VzcyBDb21wb25lbnQgYXBwbGljYXRpb24gaW4gYSBQcm9jZXNzLCBpLmUuIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluaW5nIHRoZSBQcm9jZXNzLiAgVGhlIFByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3IgaXMgdXNlZCB0byBlbmNhcHN1bGF0ZSB0aGUgZGV0YWlscyBvZiB0aGUgY29tcG9uZW50IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBhbmQgdG8gcHJvdmlkZSBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzIHN1Y2ggYXMgaXQgb3duIHByZWRlY2Vzc29ycyBhbmQgc3VjY2Vzc29ycy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iX3Byb2Nlc3NDb21wb25lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc1BhY2thZ2UgIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuJiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuJiN4QTsiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1Byb2Nlc3MiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvY2VzcyBQYWNrYWdlIGlzIGEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuJiN4QTtBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLiYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb2Nlc3NFbGVtZW50cyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvY2Vzc0VsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpYWdyYW1zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaWFncmFtIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhOb2RlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZGlhZ3JhbUxpbmsiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBlT3Bwb3NpdGU9IiMvL0RpYWdyYW1MaW5rL2RpYWdyYW0iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZXNwYWNlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiIGNvbnRhaW5tZW50PSJ0cnVlIiBlT3Bwb3NpdGU9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UvZGlhZ3JhbSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9pbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhOb2RlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2l6ZSIgb3JkZXJlZD0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSIjLy9EaW1lbnNpb24iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFbGVtZW50IiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGFpbmVkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBvc2l0aW9uIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL1BvaW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImxpbmsiIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW1MaW5rIiBjb250YWlubWVudD0idHJ1ZSIgZU9wcG9zaXRlPSIjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yYWdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaENvbm5lY3RvciIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vR3JhcGhDb25uZWN0b3IvZ3JhcGhFbGVtZW50Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlbWFudGljTW9kZWwiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSIgY29udGFpbm1lbnQ9InRydWUiIGVPcHBvc2l0ZT0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGlhZ3JhbUVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzVmlzaWJsZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Cb29sZWFuIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbnRhaW5lciIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9HcmFwaEVsZW1lbnQiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFbGVtZW50L2NvbnRhaW5lZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZWZlcmVuY2UiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1JlZmVyZW5jZSIgZU9wcG9zaXRlPSIjLy9SZWZlcmVuY2UvcmVmZXJlbmNlZCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0eSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJlZmVyZW5jZSIgZVN1cGVyVHlwZXM9IiMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24iCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vQm9vbGVhbiIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmVmZXJlbmNlZCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9EaWFncmFtRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9EaWFncmFtRWxlbWVudC9yZWZlcmVuY2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvcGVydHkiIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImtleSIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb2ludCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IngiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InkiIG9yZGVyZWQ9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpYWdyYW1MaW5rIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ6b29tIiBvcmRlcmVkPSJmYWxzZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL0RvdWJsZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2aWV3cG9ydCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Qb2ludCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9kaWFncmFtTGluayIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9saW5rIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkdyYXBoQ29ubmVjdG9yIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFZGdlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9HcmFwaEVkZ2UiIGVPcHBvc2l0ZT0iIy8vR3JhcGhFZGdlL2FuY2hvciIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJncmFwaEVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vR3JhcGhFbGVtZW50IiBlT3Bwb3NpdGU9IiMvL0dyYXBoRWxlbWVudC9hbmNob3JhZ2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3JhcGhFZGdlIiBlU3VwZXJUeXBlcz0iIy8vR3JhcGhFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYW5jaG9yIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iMiIgZVR5cGU9IiMvL0dyYXBoQ29ubmVjdG9yIiBlT3Bwb3NpdGU9IiMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTZW1hbnRpY01vZGVsQnJpZGdlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9EaWFncmFtRWxlbWVudCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRhdGlvbiIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkaWFncmFtIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0RpYWdyYW0iIGVPcHBvc2l0ZT0iIy8vRGlhZ3JhbS9uYW1lc3BhY2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ3JhcGhFbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9IiMvL0dyYXBoRWxlbWVudCIgZU9wcG9zaXRlPSIjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEaW1lbnNpb24iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3aWR0aCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGVpZ2h0IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBQcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2UgY29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiCi0gICAgICAgIG9yZGVyZWQ9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1Rhc2tEZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2VJTyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlSW5mbyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiBlU3VwZXJUeXBlcz0iIy8vU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVsZW1lbnQiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSIgZVN1cGVyVHlwZXM9IiMvL1NlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50IiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0VsZW1lbnQiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTGVhZkVsZW1lbnQiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vRGlhZ3JhbUVsZW1lbnQiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZXh0RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGV4dCIgb3JkZXJlZD0iZmFsc2UiIGVUeXBlPSIjLy9TdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJJbWFnZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXJpIiBvcmRlcmVkPSJmYWxzZSIgZVR5cGU9IiMvL1VyaSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtaW1lVHlwZSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9TdHJpbmciIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHcmFwaGljUHJpbWl0aXZlIiBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0xlYWZFbGVtZW50Ii8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9seWxpbmUiIGVTdXBlclR5cGVzPSIjLy9HcmFwaGljUHJpbWl0aXZlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xvc2VkIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0Jvb2xlYW4iIGRlZmF1bHRWYWx1ZUxpdGVyYWw9InRydWUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0id2F5cG9pbnRzIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMiIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9Qb2ludCIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxsaXBzZSIgZVN1cGVyVHlwZXM9IiMvL0dyYXBoaWNQcmltaXRpdmUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjZW50ZXIiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vUG9pbnQiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWCIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmFkaXVzWSIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSIjLy9Eb3VibGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm90YXRpb24iIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0YXJ0QW5nbGUiIG9yZGVyZWQ9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiBlVHlwZT0iIy8vRG91YmxlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVuZEFuZ2xlIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgbG93ZXJCb3VuZD0iMSIgZVR5cGU9IiMvL0RvdWJsZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRmFtaWx5IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZWxpdmVyeSBNb2RlbCBGYW1pbHkgaXMgYSBjb252ZW5pZW50IGdyb3VwaW5nIG9mIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyBvZiBpbnRlcmVzdCB0byBzb21lIHNwZWNpZmljIHVzZXIgY29tbXVuaXR5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJkZWxpdmVyeVByb2Nlc3NlcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vRGVsaXZlcnlQcm9jZXNzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0ICMvL1BhY2thZ2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQbHVnaW5zIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZWRlZmluZWRDb25maWd1cmF0aW9ucyIKLSAgICAgICAgb3JkZXJlZD0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9tb2RlbC8xLjAuNS91bWEuZ2VubW9kZWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5nZW5tb2RlbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YTBhOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL21vZGVsLzEuMC41L3VtYS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYyIKLSAgICBtb2RlbFBsdWdpbklEPSJvcmcuZWNsaXBzZS51bWEiIHRlbXBsYXRlRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS90ZW1wbGF0ZXMiCi0gICAgcnVudGltZUphcj0idHJ1ZSIgZHluYW1pY1RlbXBsYXRlcz0idHJ1ZSIgbW9kZWxOYW1lPSJVbWEiIG1vZGVsUGx1Z2luQ2xhc3M9IiIKLSAgICBub25OTFNNYXJrZXJzPSJ0cnVlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3QiCi0gICAgcm9vdEV4dGVuZHNDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0IiByb290SW1wbGVtZW50c0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5JbnRlcm5hbEVEYXRhT2JqZWN0IgotICAgIHN1cHByZXNzRU1GVHlwZXM9InRydWUiIGZlYXR1cmVNYXBXcmFwcGVySW50ZXJmYWNlPSJjb21tb25qLnNkby5TZXF1ZW5jZSIgZmVhdHVyZU1hcFdyYXBwZXJJbnRlcm5hbEludGVyZmFjZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby51dGlsLkVTZXF1ZW5jZSIKLSAgICBmZWF0dXJlTWFwV3JhcHBlckNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLnV0aWwuQmFzaWNFU2VxdWVuY2UiIGNvZGVGb3JtYXR0aW5nPSJ0cnVlIgotICAgIGltcG9ydGVySUQ9ImNvbS5pYm0ueHRvb2xzLm1vZGVsZXIudWkud2l6YXJkcy5pbnRlcm5hbC5lY29yZS5pbXBvcnRlci5FbXhJbXBvcnRlcldpemFyZCIKLSAgICBjb250YWlubWVudFByb3hpZXM9InRydWUiIGNvbXBsaWFuY2VMZXZlbD0iNS4wIj4KLSAgPGdlbkFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbC9pbXBvcnRlci9jb20uaWJtLnh0b29scy5tb2RlbGVyLnVpLndpemFyZHMuaW50ZXJuYWwuZWNvcmUuaW1wb3J0ZXIuRW14SW1wb3J0ZXJXaXphcmQiPgotICAgIDxkZXRhaWxzIGtleT0iU1VQRVJfQ0xBU1NfT1JERVIiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJPUEVSQVRJT05fQk9ESUVTIiB2YWx1ZT0iSUdOT1JFIi8+Ci0gICAgPGRldGFpbHMga2V5PSJERVJJVkVEX0ZFQVRVUkVTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iRFVQTElDQVRFX09QRVJBVElPTl9JTkhFUklUQU5DRSIgdmFsdWU9IkRJU0NBUkQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IlJFREVGSU5JTkdfT1BFUkFUSU9OUyIgdmFsdWU9IlJFUE9SVCIvPgotICAgIDxkZXRhaWxzIGtleT0iQU5OT1RBVElPTl9ERVRBSUxTIiB2YWx1ZT0iUFJPQ0VTUyIvPgotICAgIDxkZXRhaWxzIGtleT0iUkVERUZJTklOR19QUk9QRVJUSUVTIiB2YWx1ZT0iUkVQT1JUIi8+Ci0gICAgPGRldGFpbHMga2V5PSJJTlZBUklBTlRfQ09OU1RSQUlOVFMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJEVVBMSUNBVEVfRkVBVFVSRV9JTkhFUklUQU5DRSIgdmFsdWU9IkRJU0NBUkQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkRVUExJQ0FURV9PUEVSQVRJT05TIiB2YWx1ZT0iRElTQ0FSRCIvPgotICAgIDxkZXRhaWxzIGtleT0iQ09NTUVOVFMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJEVVBMSUNBVEVfRkVBVFVSRVMiIHZhbHVlPSJESVNDQVJEIi8+Ci0gICAgPGRldGFpbHMga2V5PSJTVUJTRVRUSU5HX1BST1BFUlRJRVMiIHZhbHVlPSJSRVBPUlQiLz4KLSAgICA8ZGV0YWlscyBrZXk9IkVDT1JFX1RBR0dFRF9WQUxVRVMiIHZhbHVlPSJQUk9DRVNTIi8+Ci0gICAgPGRldGFpbHMga2V5PSJVTklPTl9QUk9QRVJUSUVTIiB2YWx1ZT0iUkVQT1JUIi8+Ci0gIDwvZ2VuQW5ub3RhdGlvbnM+Ci0gIDxmb3JlaWduTW9kZWw+Li4vLi4vVU1BJTIwMS4wLjUlMjAoUlNNKS91bWEuZW14PC9mb3JlaWduTW9kZWw+Ci0gIDxzdGF0aWNQYWNrYWdlcz5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1NETzwvc3RhdGljUGFja2FnZXM+Ci0gIDxtb2RlbFBsdWdpblZhcmlhYmxlcz5FTUZfQ09NTU9OSl9TRE89b3JnLmVjbGlwc2UuZW1mLmNvbW1vbmouc2RvPC9tb2RlbFBsdWdpblZhcmlhYmxlcz4KLSAgPG1vZGVsUGx1Z2luVmFyaWFibGVzPkVNRl9FQ09SRV9TRE89b3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkbzwvbW9kZWxQbHVnaW5WYXJpYWJsZXM+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IlVtYSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmVwZiIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGVjb3JlUGFja2FnZT0idW1hLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbmEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2NvbnRyaWJ1dGVzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9leHRlbmRzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9yZXBsYWNlcyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxDb250cmlidXRpb24iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2xvY2FsUmVwbGFjZW1lbnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHNSZXBsYWNlcyIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09InVtYS5lY29yZSMvL1dvcmtPcmRlclR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvU3RhcnQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0idW1hLmVjb3JlIy8vV29ya09yZGVyVHlwZS9maW5pc2hUb0ZpbmlzaCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL3N0YXJ0VG9GaW5pc2giLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU3RyaW5nIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9Cb29sZWFuIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9EYXRlIi8+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJ1bWEuZWNvcmUjLy9VcmkiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL1NldCIvPgotICAgIDxnZW5EYXRhVHlwZXMgZWNvcmVEYXRhVHlwZT0idW1hLmVjb3JlIy8vU2VxdWVuY2UiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0ludGVnZXIiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9InVtYS5lY29yZSMvL0RvdWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2xhc3NpZmllciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ2xhc3NpZmllci9pc0Fic3RyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVHlwZSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9OYW1lZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL05hbWVkRWxlbWVudC9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BhY2thZ2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL05hbWVzcGFjZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0NvbnN0cmFpbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnN0cmFpbnQvYm9keSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3VpZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvcHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZEVsZW1lbnQvYnJpZWZEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L293bmVkUnVsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9tZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2tpbmQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L3N1cHByZXNzZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50L29yZGVyaW5nR3VpZGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RFbGVtZW50UHJvcGVydHkvdmFsdWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vS2luZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0tpbmQvYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2NvbmNlcHRzQW5kUGFwZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9leGFtcGxlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2Fzc2V0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3Rlcm1kZWZpbml0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9zaGFwZWljb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvbm9kZWljb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vbWFpbkRlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9zZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2tleUNvbnNpZGVyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL2xvbmdQcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vTWV0aG9kVW5pdC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZFVuaXQvY29weXJpZ2h0U3RhdGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGFuY2UiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZWN0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZWN0aW9uL3NlY3Rpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VjdGlvbi9zdWJTZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ZhcmlhYmlsaXR5RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9WYXJpYWJpbGl0eUVsZW1lbnQvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2hlY2tsaXN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3VpZGVsaW5lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRXhhbXBsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JldXNhYmxlQXNzZXQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZXJtRGVmaW5pdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mby9pc1ByaW1hcnlFeHRlbnNpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3QiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZXJBcnRpZmFjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3QiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90b29sTWVudG9ycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0L2VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9GdWxmaWxsYWJsZUVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Z1bGZpbGxhYmxlRWxlbWVudC9mdWxmaWxscyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9SZXBvcnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGVsaXZlcmFibGUvZGVsaXZlcmVkV29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL091dGNvbWUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TdGVwIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtEZWZpbml0aW9uL3ByZWNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1doaXRlcGFwZXIiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9UYXNrIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3BlcmZvcm1lZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9tYW5kYXRvcnlJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2svc3RlcHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZS9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGUvcmVzcG9uc2libGVGb3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9icmllZk91dGxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL3JlcHJlc2VudGF0aW9uT3B0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL25vdGF0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vaW1wYWN0T2ZOb3RIYXZpbmciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uL3JlYXNvbnNGb3JOb3ROZWVkaW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRpb24vc2tpbGxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3N5bm9ueW1zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hZGRpdGlvbmFsSW5mbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vcHJvYmxlbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FwcGxpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9sZXZlbHNPZkFkb3B0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVTZXQvcm9sZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db250ZW50Q2F0ZWdvcnkiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Eb21haW4iPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRG9tYWluL3N1YmRvbWFpbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vV29ya1Byb2R1Y3RUeXBlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3RzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2Rpc2NpcGxpbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rpc2NpcGxpbmUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0Rpc2NpcGxpbmUvdGFza3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9zdWJkaXNjaXBsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlzY2lwbGluZS9yZWZlcmVuY2VXb3JrZmxvd3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQWN0aXZpdHkiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0FjdGl2aXR5L2JyZWFrZG93bkVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQWN0aXZpdHkvcm9hZG1hcHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNFdmVudERyaXZlbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtCcmVha2Rvd25FbGVtZW50L2xpbmtUb1ByZWRlY2Vzc29yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVmaXgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvaXNPcHRpb25hbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQWZ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3ByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3BsYW5uaW5nRGF0YSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvc3VwZXJBY3Rpdml0aWVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jaGVja2xpc3RzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9jb25jZXB0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvZXhhbXBsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2d1aWRlbGluZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JldXNhYmxlQXNzZXRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWxzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC90ZW1wbGF0ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3JlcG9ydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2VzdGltYXRpb25jb25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvdG9vbG1lbnRvciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvc3RhcnREYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUGxhbm5pbmdEYXRhL2ZpbmlzaERhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9QbGFubmluZ0RhdGEvcmFuayIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Xb3JrT3JkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9saW5rVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtPcmRlci9wcmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Ub29sIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Ub29sL3Rvb2xNZW50b3JzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JvbGVTZXRHcm91cGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0N1c3RvbUNhdGVnb3J5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkvc3ViQ2F0ZWdvcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RQYWNrYWdlL2NoaWxkUGFja2FnZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9jb250ZW50RWxlbWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWlsZXN0b25lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NaWxlc3RvbmUvcmVxdWlyZWRSZXN1bHRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9hY3Rpdml0eUV4aXRTdGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9Xb3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9pbXBhY3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZGVsaXZlcmFibGVQYXJ0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0Rlc2NyaXB0b3IvaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0l0ZXJhdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3RlYW1Sb2xlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1cGVyVGVhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1RlYW1Qcm9maWxlL3N1YlRlYW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUm9sZURlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL1JvbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvci9tb2RpZmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9UYXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hc3Npc3RlZEJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL21hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3B0aW9uYWxJbnB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3BlcmZvcm1lZFByaW1hcmlseUJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivc2VsZWN0ZWRTdGVwcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Db21wb3NpdGVSb2xlL2FnZ3JlZ2F0ZWRSb2xlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9lZHVjYXRpb25NYXRlcmlhbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3MvY29tbXVuaWNhdGlvbnNNYXRlcmlhbHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2luY2x1ZGVzUGF0dGVybnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vcHJvY2Vzc1ZpZXdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9kZWZhdWx0VmlldyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9zdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2FkZGVkQ2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kUGx1Z2luL2Jhc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS9iYXNlZE9uUHJvY2Vzc2VzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1ByYWN0aWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2Uvc3ViUHJhY3RpY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9QcmFjdGljZS9hY3Rpdml0eVJlZmVyZW5jZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24vdXNhZ2VHdWlkYW5jZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2FsdGVybmF0aXZlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0FjdGl2aXR5RGVzY3JpcHRpb24vaG93dG9TdGFmZiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vc2NhbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9wcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcmlza0xldmVsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vZXN0aW1hdGluZ1RlY2huaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi90eXBlT2ZDb250cmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi9zY29wZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb2Nlc3NEZXNjcmlwdGlvbi91c2FnZU5vdGVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGVzY3JpcHRvckRlc2NyaXB0aW9uL3JlZmluZWREZXNjcmlwdGlvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IvX3Byb2Nlc3NDb21wb25lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2VzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvcHJvY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzUGFja2FnZS9kaWFncmFtcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtL2RpYWdyYW1MaW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW0vbmFtZXNwYWNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbS96b29tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbS92aWV3cG9pbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhOb2RlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaE5vZGUvc2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0dyYXBoRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWxlbWVudC9jb250YWluZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIHByb3BlcnR5U29ydENob2ljZXM9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvcG9zaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2xpbmsiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFbGVtZW50L2FuY2hvcmFnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaEVsZW1lbnQvc2VtYW50aWNNb2RlbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaWFncmFtRWxlbWVudC9pc1Zpc2libGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvY29udGFpbmVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUVsZW1lbnQvcmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1FbGVtZW50L3Byb3BlcnR5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1JlZmVyZW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL2lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUmVmZXJlbmNlL3JlZmVyZW5jZWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvcGVydHkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L2tleSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1Byb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2ludC94Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vUG9pbnQveSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9EaWFncmFtTGluayI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvem9vbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0RpYWdyYW1MaW5rL3ZpZXdwb3J0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vRGlhZ3JhbUxpbmsvZGlhZ3JhbSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9EaWFncmFtTGluay9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhDb25uZWN0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoQ29ubmVjdG9yL2dyYXBoRWRnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9HcmFwaENvbm5lY3Rvci9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhFZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vR3JhcGhFZGdlL3dheXBvaW50cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0dyYXBoRWRnZS9hbmNob3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL3ByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9TZW1hbnRpY01vZGVsQnJpZGdlL2RpYWdyYW0iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vU2VtYW50aWNNb2RlbEJyaWRnZS9ncmFwaEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vRGltZW5zaW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vd2lkdGgiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9EaW1lbnNpb24vaGVpZ2h0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSB1bWEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlL2ludGVyZmFjZVNwZWNpZmljYXRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50L3R5cGVJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UvZWxlbWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0xlYWZFbGVtZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vVGV4dEVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL1RleHRFbGVtZW50L3RleHQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vSW1hZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL3VyaSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0ltYWdlL21pbWVUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vR3JhcGhpY1ByaW1pdGl2ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL1BvbHlsaW5lIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSB1bWEuZWNvcmUjLy9Qb2x5bGluZS9jbG9zZWQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUG9seWxpbmUvd2F5cG9pbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InVtYS5lY29yZSMvL0VsbGlwc2UiPgotICAgICAgPGdlbkZlYXR1cmVzIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgcHJvcGVydHlTb3J0Q2hvaWNlcz0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL0VsbGlwc2UvY2VudGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNYIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yYWRpdXNZIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgdW1hLmVjb3JlIy8vRWxsaXBzZS9yb3RhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2Uvc3RhcnRBbmdsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHVtYS5lY29yZSMvL0VsbGlwc2UvZW5kQW5nbGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0idW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vUHJvY2Vzc0ZhbWlseS9kZWxpdmVyeVByb2Nlc3NlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJ1bWEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgdW1hLmVjb3JlIy8vTWV0aG9kTGlicmFyeS9tZXRob2RQbHVnaW5zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIHVtYS5lY29yZSMvL01ldGhvZExpYnJhcnkvcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTE2NDg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbi4KLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi0jIFBsdWctaW4KLXBsdWdpbk5hbWU9RVBGIFVNQQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjlkYWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0gICAgICA8cGFja2FnZSAKLSAgICAgICAgICAgIHVyaSA9ICJodHRwOi8vd3d3LmlibS5jb20vdW1hLzEuMC4yL3VtYS5lY29yZSIgCi0gICAgICAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiIC8+Ci0gICAgICA8cGFja2FnZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSIKLSAgICAgICAgICAgIHVyaT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIvPgotICAgICAgPHBhY2thZ2UKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UiCi0gICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiLz4gICAgICAgICAgICAKLSAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ODYyM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEFjdGl2aXR5IGlzIGEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLSAqIEFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotICogCi0gKiBUaGlzIGRlZmluaXRpb24gb2YgQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbnRyb2R1Y2VkIGluIHRoZSBwYWNrYWdlIEJyZWFrZG93biB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgYW5kIGlzIHRoZSBiYXNpcyBmb3IgdGhlIGRlZmluaXRpb24gb2YgdGhlIGNsYXNzIFByb2Nlc3MuCi0gKiBFeHRlbmRzIEFjdGl2aXR5IHdpdGggYW4gYXNzb2NpYXRpb24gdG8gUm9hZG1hcC4gIFRoaXMgZGVmaW5pdGlvbiBvZiBBY3Rpdml0eSBhbHNvIHBhcnRpY2lwYXRlcyBpbiB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBEaXNjaXBsaW5lIGNhdGVnb3J5LgotICogCi0gKiBBY3Rpdml0eSBpbiB0aGUgcGFja2FnZSBNZXRob2QgUGx1Z2luIGluaGVyaXRzIGZyb20gVmFyaWFiaWxpdHkgRWxlbWVudCB0byBleHRlbmQgQWN0aXZpdHkgd2l0aCBuZXcgY2FwYWJpbGl0aWVzIGZvciB2YXJpYWJpbGl0eS4KLSAqIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCB3aGljaCBwcm92aWRlcyBrZXkgbWVjaGFuaXNtIHRvIGVuYWJsZSBkeW5hbWljIGJpbmRpbmcgb2YgQ2FwYWJpbGl0eSBQYXR0ZXJucyBpbiBQcm9jZXNzZXMgYXMgd2VsbCBhcyBQcm9jZXNzIENvbnRyaWJ1dGlvbnMuICBWYXJpYWJpbGl0eSBpcyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5IGZvciBBY3Rpdml0aWVzOgotICogLSBFeHRlbmQ6IFRvIGFwcGx5IGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIGEgcHJvY2VzcyBvbmUgd291bGQgY3JlYXRlIGFuIEFjdGl2aXR5IHdoaWNoIGV4dGVuZHMgdGhlIHBhdHRlcm4ncyB0b3AtbGV2ZWwgYWN0aXZpdHkuICBUaHJvdWdoIGV4dGVuc2lvbiB0aGUgZXh0ZW5kaW5nIEFjdGl2aXR5IGluaGVyaXRzIHRoZSBwYXR0ZXJucyBCcmVha2Rvd24gRWxlbWVudHMuCi0gKiAtIFJlcGxhY2U6IFRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgb2YgYW4gYXBwbGllZCBDYXBhYmlsaXR5IFBhdHRlcm4gb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBmb3Igd2hpY2ggb25lIGRldmVsb3BzIGEgUHJvY2VzcyBDb250cmlidXRpb24gKG9yIGEgY29tYmluYXRpb24gb2YgYm90aCkgb25lIHdvdWxkIGNyZWF0ZSBhbiBBY3Rpdml0eSBhbmQgc3BlY2lmeSB0aGUgcmVwbGFjZSB2YXJpYWJpbGl0eSBzcGVjaWFsaXphdGlvbiBiZXR3ZWVuIHRoZW0uCi0gKiAtIENvbnRyaWJ1dGU6IFRvIGNvbnRyaWJ1dGUgbmV3IEJyZWFrZG93biBFbGVtZW50cyB0byBhbiBleGlzdGluZyBBY3Rpdml0eSBvbmUgd291bGQgZGVmaW5lIGFuIEFjdGl2aXR5IHdpdGggQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVsYXRlcyB2aWEgdGhlIENvbnRyaWJ1dGVzIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHRvIHRoaXMgZXhpc3RpbmcgQWN0aXZpdHkuICBUaGUgY29udHJpYnV0aW5nIEFjdGl2aXR5J3MgQnJlYWtkb3duIEVsZW1lbnRzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGNvbnRyaWJ1dGVkIEFjdGl2aXR5LgotICogCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHkgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50LAotCQlWYXJpYWJpbGl0eUVsZW1lbnQsIFdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnR9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1cGVyQWN0aXZpdGllcyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QnJlYWtkb3duRWxlbWVudD4gZ2V0QnJlYWtkb3duRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvYWRtYXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZG1hcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUm9hZG1hcHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2FkbWFwPiBnZXRSb2FkbWFwcygpOwotCi19IC8vIEFjdGl2aXR5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjExMzhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3d0b1N0YWZmIDxlbT5Ib3d0byBTdGFmZjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWN0aXZpdHlEZXNjcmlwdGlvbiBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1cnBvc2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQdXJwb3NlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG93dG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SG93dG9TdGFmZihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SG93dG9TdGFmZigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3d0byBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SG93dG9TdGFmZihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFjdGl2aXR5RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZmIwYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2dldElzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBleHRlbmRzIENsYXNzaWZpZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1ByaW1hcnlFeHRlbnNpb24oQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQXJ0aWZhY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhNGM4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFydGlmYWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQXJ0aWZhY3QgaXMgYSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLSAqIEFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFydGlmYWN0IGV4dGVuZHMgV29ya1Byb2R1Y3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lciBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0cyA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzCi0JICogQG1vZGVsIG9wcG9zaXRlPSJjb250YWluZWRBcnRpZmFjdHMiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdCBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0I2dldENvbnRhaW5lckFydGlmYWN0IDxlbT5Db250YWluZXIgQXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lckFydGlmYWN0IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdHMoKTsKLQotfSAvLyBBcnRpZmFjdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA5ZGU2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0FydGlmYWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdERlc2NyaXB0aW9uIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJyaWVmT3V0bGluZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm90YXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb3RhdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIEFydGlmYWN0RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQnJlYWtkb3duRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NWM1OWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEJyZWFrZG93biBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBlckFjdGl2aXRpZXMgPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0Q29uY2VwdHMgPGVtPkNvbmNlcHRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXRzIDxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VG9vbG1lbnRvciA8ZW0+VG9vbG1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJyZWFrZG93bkVsZW1lbnQgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi0JICogCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFBsYW5uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzUGxhbm5lZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUGxhbm5lZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUGxhbm5lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1BsYW5uZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc09wdGlvbmFsIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzT3B0aW9uYWwoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzT3B0aW9uYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT3B0aW9uYWwoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGVkQWZ0ZXIoQnJlYWtkb3duRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEJlZm9yZShCcmVha2Rvd25FbGVtZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBsYW5uaW5nRGF0YSBnZXRQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGxhbm5pbmdEYXRhKFBsYW5uaW5nRGF0YSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cyA8ZW0+QnJlYWtkb3duIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdXBlckFjdGl2aXRpZXMoQWN0aXZpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSNnZXRCcmVha2Rvd25FbGVtZW50cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYnJlYWtkb3duRWxlbWVudHMiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHkgZ2V0U3VwZXJBY3Rpdml0aWVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzIDxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0aWVzPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cGVyQWN0aXZpdGllcyhBY3Rpdml0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db25jZXB0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxHdWlkZWxpbmU+IGdldEd1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJldXNhYmxlQXNzZXQ+IGdldFJldXNhYmxlQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBsYXRlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1JlcG9ydHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSZXBvcnQ+IGdldFJlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0VzdGltYXRpb25jb25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2xtZW50b3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sbWVudG9yPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfVG9vbG1lbnRvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xtZW50b3IoKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0Y2QwMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkMzcwZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NhcGFiaWxpdHlQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLSAqIC0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0gKiAtIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotICogLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FwYWJpbGl0eVBhdHRlcm4gZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgewotfSAvLyBDYXBhYmlsaXR5UGF0dGVybgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DaGVja2xpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2hlY2tsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZjhlMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DaGVja2xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ2hlY2tsaXN0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDaGVja2xpc3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ2xhc3NpZmllci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2E4NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9DbGFzc2lmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIENsYXNzaWZpZXIuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyI2dldElzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2xhc3NpZmllcigpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NpZmllciBleHRlbmRzIFR5cGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0Fic3RyYWN0KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXIjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Fic3RyYWN0KEJvb2xlYW4gdmFsdWUpOwotfSAvLyBDbGFzc2lmaWVyCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTg5MWMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi0gKiBBIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZXMgPGVtPkFnZ3JlZ2F0ZWQgUm9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbXBvc2l0ZVJvbGUgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZ2dyZWdhdGVkIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlcygpOwotCi19IC8vIENvbXBvc2l0ZVJvbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uY2VwdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTIxMzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBDb25jZXB0IGlzIGEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uY2VwdCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25jZXB0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDb25jZXB0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGU5ZWFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uc3RyYWludDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ29uc3RyYWludCBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Qm9keTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Qm9keTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Qm9keShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29uc3RyYWludF9Cb2R5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Qm9keSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50I2dldEJvZHkgPGVtPkJvZHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJvZHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJvZHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEJvZHkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb25zdHJhaW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViMTNhMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIENvbnRlbnQgQ2F0ZWdvcnkgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBDb250ZW50Q2F0ZWdvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnREZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1OGU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBEZXNjcmlwdGlvbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudERlc2NyaXB0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIHN0b3JlIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIG9yIGxhYmVsIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBlbGVtZW50LiBVc2VkIGxpa2UgYSBzeW5vbnltIHRvIHRoZSBuYW1lLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXh0ZXJuYWxJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEtleSBDb25zaWRlcmF0aW9ucyBwcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldExvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29udGVudERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzM0YTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29udGVudCBFbGVtZW50IGlzIGEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotICogQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuCi0gKiAKLSAqIFRoaXMgaXMgdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UncyBleHRlbnNpb24gb2YgQ29udGVudCBFbGVtZW50IChkZWZpbmVkIGluIENvbnRlbnQgRWxlbWVudHMpIHByb3ZpZGluZyBhZGRpdG9uYWwgYXNzb2NpYXRpb25zLgotICogQ29udGVudCBFbGVtZW50IGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBub3QgZGlyZWN0bHkgZnJvbSBNZXRob2QgRWxlbWVudCBhbnltb3JlLiAgVGhpcyBpcyBhY2hpZXZlZCB1c2luZyBVTUwgMi4wIHBhY2thZ2UgbWVyZ2Ugc2VtYW50aWNzLiAgT25seSBpZiBhbiBhZG9wdGVyIG9mIHRoaXMgbWV0YS1tb2RlbCBkZWNpZGVzIHRvIHJlYWxpemUgTWV0aG9kIFBsdWdpbnMsIGhlIHdvdWxkIGdldCB0aGUgdmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBDb250ZW50IEVsZW1lbnRzLgotICogQ29udGVudCBFbGVtZW50IGluaGVyaXRzIHRoZSBzZW1hbnRpY3Mgb2YgVmFyaWFiaWxpdHkgRWxlbWVudC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRUZXJtZGVmaW5pdGlvbiA8ZW0+VGVybWRlZmluaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudEVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQsIFZhcmlhYmlsaXR5RWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29uY2VwdHMgQW5kIFBhcGVyczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb25jZXB0PiBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGVja2xpc3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDaGVja2xpc3Q+IGdldENoZWNrbGlzdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HdWlkZWxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3VpZGVsaW5lPiBnZXRHdWlkZWxpbmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGFtcGxlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NldHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UmV1c2FibGVBc3NldD4gZ2V0QXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVybWRlZmluaXRpb248L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9UZXJtZGVmaW5pdGlvbigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRlcm1EZWZpbml0aW9uPiBnZXRUZXJtZGVmaW5pdGlvbigpOwotCi19IC8vIENvbnRlbnRFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmFhNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db250ZW50UGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgUGFja2FnZSBpcyBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRzIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudFBhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudHMoKTsKLQotfSAvLyBDb250ZW50UGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Db3JlU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGI5YjVlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRWxlbWVudCBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvQ3VzdG9tQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMzk4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1c3RvbSBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgQ3VzdG9tIENhdGVnb3J5IGlzIGEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21DYXRlZ29yeSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEZXNjcmliYWJsZUVsZW1lbnQ+IGdldENhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRTdWJDYXRlZ29yaWVzKCk7Ci0KLX0gLy8gQ3VzdG9tQ2F0ZWdvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNTgzZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBkZWxpdmVyYWJsZSBpcyBhIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGUgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpOwotCi19IC8vIERlbGl2ZXJhYmxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmQ5M2M0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdpbmcgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVsaXZlcmFibGVEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTdlYmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVsaXZlcnkgUHJvY2Vzc2VzIGlzIGEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotICogQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbHMgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3MoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcnlQcm9jZXNzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWx9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVkdWNhdGlvbiBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRhYzFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCA8ZW0+UmlzayBMZXZlbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2FsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NhbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmlzayBMZXZlbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Umlza0xldmVsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SaXNrIExldmVsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJpc2tMZXZlbChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZU9mQ29udHJhY3QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EZXNjcmliYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmOGRmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEZXNjcmliYWJsZSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLSAqIFRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZSAoc2VlIFNlY3Rpb24gNC4xLjQpLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4KLSAqIAotICogVGhpcyBkZWZpbml0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBleHRlbmRzIHRoZSBDb250ZW50IEVsZW1lbnQgZGVmaW5pdGlvbiB2aWEgcGFja2FnZSBtZXJnZSB3aXRoIHJlZmVyZW5jZXMgdG8gaWNvbnMgdGhhdCBhcmUgdXNlZCBmb3IgcHJlc2VudGluZyBDb250ZW50IEVsZW1lbnRzIGluIGEgVU1BLWJhc2VkIG1vZGVsaW5nIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2hlbiBwdWJsaXNoaW5nIENvbnRlbnQgRWxlbWVudHMgaW50byBkb2N1bWVudGF0aW9uIHByZXNlbnRhdGlvbiAoZS5nLiBkb2N1bWVudCBvciBodG1sIHBhZ2VzKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmFibGVFbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCwgQ2xhc3NpZmllciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2hhcGVpY29uKFVSSSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFNoYXBlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaGFwZWljb24oVVJJIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9kZWljb24oVVJJKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlVyaSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVSSSBnZXROb2RlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vZGVpY29uKFVSSSB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpYmFibGVFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjY4MTZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgRGVzY3JpcHRvciBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi0gKiBEZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIERlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBjYTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXNjcmlwdG9yRGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBEZXNjcmlwdG9yRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2M2VmOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW0gZXh0ZW5kcyBHcmFwaE5vZGUgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Wm9vbShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbV9ab29tKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRab29tIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRab29tKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9pbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZpZXdwb2ludChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX1ZpZXdwb2ludCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvaW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb2ludDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWaWV3cG9pbnQoUG9pbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW0gTGluazwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlhZ3JhbUxpbms+IGdldERpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lc3BhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZXNwYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtX05hbWVzcGFjZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZGlhZ3JhbSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVzcGFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TmFtZXNwYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSB2YWx1ZSk7Ci0KLX0gLy8gRGlhZ3JhbQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaWFncmFtRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdkZGZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW0gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpYWdyYW1FbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFZpc2libGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzVmlzaWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0SXNWaXNpYmxlIDxlbT5JcyBWaXNpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc1Zpc2libGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzVmlzaWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZXI8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lcjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnRhaW5lcihHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGFpbmVkIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldENvbnRhaW5lcl8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGFpbmVyPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGFpbmVyXygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZX0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InJlZmVyZW5jZWQiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UHJvcGVydHk+IGdldFByb3BlcnR5KCk7Ci0KLX0gLy8gRGlhZ3JhbUVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUxpbmsuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlhZ3JhbUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhY2JlYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RpYWdyYW1MaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGluaygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaWFncmFtTGluayBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5ab29tPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFpvb20oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX1pvb20oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFpvb20oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Wm9vbShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZpZXdwb3J0PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWaWV3cG9ydChQb2ludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19WaWV3cG9ydCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0Vmlld3BvcnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQgPGVtPlZpZXdwb3J0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WaWV3cG9ydDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Vmlld3BvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZpZXdwb3J0KFBvaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluayA8ZW0+TGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0TGluawotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ibGluayIgcmVxdWlyZWQ9InRydWUiIHRyYW5zaWVudD0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGlhZ3JhbShEaWFncmFtKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpYWdyYW1MaW5rX0RpYWdyYW0oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rCi0JICogQG1vZGVsIG9wcG9zaXRlPSJkaWFncmFtTGluayIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtIGdldERpYWdyYW0oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIHZhbHVlKTsKLQotfSAvLyBEaWFncmFtTGluawpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGltZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTUzMjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaW1lbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaW1lbnNpb24oKQotICogQG1vZGVsCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaW1lbnNpb24gZXh0ZW5kcyBJTW9kZWxPYmplY3QgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldpZHRoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaWR0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0V2lkdGgoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9XaWR0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0V2lkdGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uI2dldFdpZHRoIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+V2lkdGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdpZHRoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXaWR0aChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGVpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IZWlnaHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGVpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIZWlnaHQoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpbWVuc2lvbl9IZWlnaHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldEhlaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhlaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SGVpZ2h0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRIZWlnaHQoRG91YmxlIHZhbHVlKTsKLQotfSAvLyBEaW1lbnNpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTA2MTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9EaXNjaXBsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi0gKiBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi0gKiAKLSAqIERpc2NpcGxpbmUgaXMgYSBjYXRlZ29yaXphdGlvbiBvZiBUYXNrcyBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiAgVGhpcyBpcyB0aGUgZXh0ZW5zaW9ucyBvZiBEaXNjaXBsaW5lIGRlZmluZWQgaW4gdGhlIE1ldGhvZCBDb3JlIHBhY2thZ2UgYWRkaW5nIGFuIGFkZGl0aW9uYWwgYXNzb2NpYXRpb24gdG8gQWN0aXZpdGllcywgd2hpY2ggcmVwcmVzZW50IHR5cGljYWwgc3RhbmRhcmQgb3IgcmVmZXJlbmNlIHdheXMgb2YgbWVhbmluZ2Z1bCBncm91cGluZ3Mgb2YgdGhlIERpc2NpcGxpbmUncyBUYXNrcyBpbnRvIHdvcmtmbG93cy4KLSAqIFRhc2tzIHJlcHJlc2VudCBkZXNjcmlwdGlvbnMgb2Ygd29yaywgd2hpY2ggYXJlIGNhdGVnb3JpemVkIGJ5IERpc2NpcGxpbmVzLiAgVGhlIHJlYXNvbiB0aGF0IHNldmVyYWwgVGFza3MgYXJlIGFsbCBjYXRlZ29yaXplZCBieSB0aGUgc2FtZSBEaXNjaXBsaW5lIGlzIHRoYXQgdGhleSBhbGwgcmVwcmVzZW50IGEgcGFydCBpbiBhY2hpZXZpbmcgYSBoaWdoZXIgZ29hbCBvciBwZXJmb3JtaW5nIHdvcmsgdGhhdCBpcyBhbGwgcmVsYXRlZCB0byBlYWNoIG90aGVyLiAgRXZlcnkgRGlzY2lwbGluZSBkZWZpbmVzIHN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgaXQgY2F0ZWdvcml6ZXMuICBTdWNoIHN0YW5kYXJkIHdheXMgYXJlIGV4cHJlc3MgYnkgQWN0aXZpdGllcyBvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGRlZmluaW5nIGhvdyB0aGUgVGFza3MgY2F0ZWdvcml6ZWQgYnkgdGhlIERpc2NpcGxpbmUgJ3dvcmsgdG9nZXRoZXInIGluIHRoZSBtb3N0IGdlbmVyaWMgd2F5LiAgVGhlc2UgcmVmZXJlbmNlIHdvcmtmbG93cyBhcmUgb2Z0ZW4gdXNlZCBmb3IgZWR1Y2F0aW5nIGFuZCB0ZWFjaGluZyBwcmFjdGl0aW9uZXJzLiAKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRTdWJkaXNjaXBsaW5lIDxlbT5TdWJkaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0UmVmZXJlbmNlV29ya2Zsb3dzIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXNrczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhc2tzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfVGFza3MoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUYXNrPiBnZXRUYXNrcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJkaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViZGlzY2lwbGluZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PERpc2NpcGxpbmU+IGdldFN1YmRpc2NpcGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QWN0aXZpdHk+IGdldFJlZmVyZW5jZVdvcmtmbG93cygpOwotCi19IC8vIERpc2NpcGxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Rpc2NpcGxpbmVHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDhjZjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBEaXNjaXBsaW5lIEdyb3VwaW5ncyBhcmUgdXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmVzIDxlbT5EaXNjaXBsaW5lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lR3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY2lwbGluZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlzY2lwbGluZT4gZ2V0RGlzY2lwbGluZXMoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVlMDZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRG9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvbWFpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIERvbWFpbiBpcyBhIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLSAqIERvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFN1YmRvbWFpbnMgPGVtPlN1YmRvbWFpbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW4oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9tYWluIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXREb21haW5fV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZG9tYWluczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmRvbWFpbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWJkb21haW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9TdWJkb21haW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEb21haW4+IGdldFN1YmRvbWFpbnMoKTsKLQotfSAvLyBEb21haW4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTRhZjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5JTW9kZWxPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBJTW9kZWxPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFbGVtZW50IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLX0gLy8gRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FbGxpcHNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3ZTVlYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VsbGlwc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGxpcHNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlIDxlbT5FbmQgQW5nbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsbGlwc2UgZXh0ZW5kcyBHcmFwaGljUHJpbWl0aXZlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYWRpdXMgWDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhZGl1c1goRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUmFkaXVzWCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0UmFkaXVzWCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYWRpdXMgWDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFkaXVzWChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFkaXVzIFk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhZGl1cyBZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSYWRpdXNZKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFbGxpcHNlX1JhZGl1c1koKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJhZGl1c1koKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFkaXVzIFk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJhZGl1c1koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJhZGl1c1koRG91YmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Um90YXRpb24oRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfUm90YXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFJvdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3RhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvdGF0aW9uKERvdWJsZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0QW5nbGUoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEVsbGlwc2VfU3RhcnRBbmdsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0U3RhcnRBbmdsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdGFydCBBbmdsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U3RhcnRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnRBbmdsZShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW5kIEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFbmRBbmdsZShEb3VibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9FbmRBbmdsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkRvdWJsZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb3VibGUgZ2V0RW5kQW5nbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbmQgQW5nbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbmRBbmdsZShEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2VudGVyPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDZW50ZXIoUG9pbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RWxsaXBzZV9DZW50ZXIoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvaW50IGdldENlbnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldENlbnRlciA8ZW0+Q2VudGVyPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DZW50ZXI8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENlbnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2VudGVyKFBvaW50IHZhbHVlKTsKLQotfSAvLyBFbGxpcHNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMTVkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnMgcXVhbGlmeSB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvRXhhbXBsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Yjg3NGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9FeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gRXhhbXBsZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0RXhhbXBsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGFtcGxlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFeGFtcGxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Z1bGZpbGxhYmxlRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9GdWxmaWxsYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjOGU1My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0Z1bGZpbGxhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GdWxmaWxsYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50I2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGdWxmaWxsYWJsZUVsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RnVsZmlsbHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxmaWxsczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCk7Ci0KLX0gLy8gRnVsZmlsbGFibGVFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoQ29ubmVjdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoQ29ubmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZTBjZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaENvbm5lY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBDb25uZWN0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhDb25uZWN0b3IgZXh0ZW5kcyBHcmFwaEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iYW5jaG9yYWdlIiByZXF1aXJlZD0idHJ1ZSIgdHJhbnNpZW50PSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2V9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvciA8ZW0+QW5jaG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyYXBoIEVkZ2U8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFZGdlPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRBbmNob3IKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImFuY2hvciIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8R3JhcGhFZGdlPiBnZXRHcmFwaEVkZ2UoKTsKLQotfSAvLyBHcmFwaENvbm5lY3RvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhFZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODUzYjkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVkZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVkZ2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhFZGdlIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZSA8ZW0+R3JhcGggRWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbmNob3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbmNob3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFZGdlX0FuY2hvcigpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWRnZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZ3JhcGhFZGdlIiBsb3dlcj0iMiIgdXBwZXI9IjIiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PEdyYXBoQ29ubmVjdG9yPiBnZXRBbmNob3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2F5cG9pbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWRnZV9XYXlwb2ludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIGxvd2VyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCk7Ci0KLX0gLy8gR3JhcGhFZGdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzMzU2Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQgPGVtPkNvbnRhaW5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0UG9zaXRpb24gPGVtPlBvc2l0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rIDxlbT5MaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRBbmNob3JhZ2UgPGVtPkFuY2hvcmFnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0U2VtYW50aWNNb2RlbCA8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdyYXBoRWxlbWVudCBleHRlbmRzIERpYWdyYW1FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc2l0aW9uKFBvaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgZ2V0UG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zaXRpb248L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc2l0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3NpdGlvbihQb2ludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8gPGVtPkNvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250YWluZWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50I2dldENvbnRhaW5lcl8KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRhaW5lciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaWFncmFtRWxlbWVudD4gZ2V0Q29udGFpbmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGlua30uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TGluazwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxpbms8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3JhcGhFbGVtZW50X0xpbmsoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImdyYXBoRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxEaWFncmFtTGluaz4gZ2V0TGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3Rvcn0uCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5jaG9yYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5jaG9yYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImdyYXBoRWxlbWVudCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxHcmFwaENvbm5lY3Rvcj4gZ2V0QW5jaG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlbWFudGljTW9kZWwoU2VtYW50aWNNb2RlbEJyaWRnZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0R3JhcGhFbGVtZW50Ci0JICogQG1vZGVsIG9wcG9zaXRlPSJncmFwaEVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZW1hbnRpY01vZGVsQnJpZGdlIGdldFNlbWFudGljTW9kZWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VtYW50aWNNb2RlbChTZW1hbnRpY01vZGVsQnJpZGdlIHZhbHVlKTsKLQotfSAvLyBHcmFwaEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzczN2RhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3JhcGhOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaE5vZGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3JhcGhOb2RlIGV4dGVuZHMgR3JhcGhFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNpemUoRGltZW5zaW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEdyYXBoTm9kZV9TaXplKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaW1lbnNpb24gZ2V0U2l6ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2l6ZShEaW1lbnNpb24gdmFsdWUpOwotCi19IC8vIEdyYXBoTm9kZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HcmFwaGljUHJpbWl0aXZlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoaWNQcmltaXRpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwYzhjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0dyYXBoaWNQcmltaXRpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoaWMgUHJpbWl0aXZlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHcmFwaGljUHJpbWl0aXZlIGV4dGVuZHMgTGVhZkVsZW1lbnQgewotfSAvLyBHcmFwaGljUHJpbWl0aXZlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmM0NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0R3VpZGFuY2UoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBHdWlkYW5jZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhNmU2Ni4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRhbmNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50cyA8ZW0+QXR0YWNobWVudHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRhY2htZW50czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0YWNobWVudHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRhY2htZW50cygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0YWNobWVudHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRhY2htZW50cyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIEd1aWRhbmNlRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0d1aWRlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGIxOGQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvR3VpZGVsaW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIEd1aWRlbGluZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgR3VpZGVsaW5lIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBHdWlkZWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSW1hZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSW1hZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjNjFkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0ltYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JbWFnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldFVyaSA8ZW0+VXJpPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkltYWdlI2dldE1pbWVUeXBlIDxlbT5NaW1lIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRJbWFnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJbWFnZSBleHRlbmRzIExlYWZFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVyaTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vcmk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVyaShVUkkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SW1hZ2VfVXJpKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuVXJpIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVVJJIGdldFVyaSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXJpPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVyaShVUkkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWltZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEltYWdlX01pbWVUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWltZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWltZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBJbWFnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvSXRlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGRiMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9JdGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEl0ZXJhdGlvbiBpcyBhIHNwZWNpYWwgQWN0aXZpdHksIHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotICogSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0SXRlcmF0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZXJhdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gSXRlcmF0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0tpbmQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzA0OWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvS2luZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgS2luZCBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm99LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotfSAvLyBLaW5kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL0xlYWZFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOGY5ZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9MZWFmRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TGVhZiBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRMZWFmRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGVhZkVsZW1lbnQgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci19IC8vIExlYWZFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjBmMGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIE1ldGhvZCBDb25maWd1cmF0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEJhc2VDb25maWd1cmF0aW9ucyA8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlld3MoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFByb2Nlc3NWaWV3cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmlldyhDb250ZW50Q2F0ZWdvcnkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudENhdGVnb3J5IGdldERlZmF1bHRWaWV3KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZpZXcoQ29udGVudENhdGVnb3J5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGVkIENhdGVnb3J5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRBZGRlZENhdGVnb3J5KCk7Ci0KLX0gLy8gTWV0aG9kQ29uZmlndXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzcwYjIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEV2ZXJ5IGNsYXNzIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGlzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzIE1ldGhvZCBFbGVtZW50IGlzIHRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIGNsYXNzZXMgYW5kIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGV2ZXJ5IG90aGVyIGVsZW1lbnQgdHlwZSBvZiB0aGlzIG1vZGVsLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuICBNZXRob2QgRWxlbWVudCBpbmhlcml0cyB0aGUgTmFtZSBhdHRyaWJ1dGUgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50J3Mgc3VwZXIgY2xhc3MuICBFdmVyeSBlbGVtZW50IGRlZmluZWQgYXMgYSBVTUEgaW5zdGFuY2UgaXMgZGVyaXZlZCBmcm9tIE1vZGVsIEVsZW1lbnQuICBFdmVyeSBNZXRob2QgRWxlbWVudCBpbi1zdGFuY2UgaXMgYXQgbGVhc3QgZGVmaW5lZCBieSBhIHVuaXF1ZSBpZCwgYSBuYW1lLCBhcyB3ZWxsIGFzIGJyaWVmIGRlc2NyaXB0aW9uLgotICogTWV0aG9kIEVsZW1lbnQgaW4gdGhlIHBhY2thZ2UgTWV0aG9kIFBsdWdpbiBhZGRzIGFkZGl0aW9uYWwgcHJvcGVydGllcyB2aWEgcGFja2FnZSBtZXJnZSB0byBNZXRob2QgRWxlbWVudCBkZWZpbmVkIGluIE1ldGhvZCBDb3JlIG5lZWRlZCBmb3IgdGhlIHZhcmlhYmlsaXR5IGFuZCBleHRlbnNpYmlsaXR5IGNhcGFiaWxpdGllcyBpbnRyb2R1Y2VzIGluIHRoaXMgcGFja2FnZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEd1aWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfR3VpZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgaWQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHdWlkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R3VpZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3duZWQgUnVsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pd25lZCBSdWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8S2luZD4gZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlIEV4dGVuZHMgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24gdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwcHJlc3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0U3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcmRlcmluZ0d1aWRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjY2IwMjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RFbGVtZW50UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RFbGVtZW50UHJvcGVydHkgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kRWxlbWVudFByb3BlcnR5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZExpYnJhcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRlNThmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW5zIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucyA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kTGlicmFyeSBleHRlbmRzIE1ldGhvZFVuaXQsIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotfSAvLyBNZXRob2RMaWJyYXJ5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDI0MTFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWV0aG9kUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBhY2thZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R2xvYmFsIDxlbT5HbG9iYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcyA8ZW0+UmV1c2VkIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcyA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQYWNrYWdlIGV4dGVuZHMgTWV0aG9kRWxlbWVudCwKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R2xvYmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldEdsb2JhbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldEdsb2JhbCA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2xvYmFsKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX1JldXNlZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0UmV1c2VkUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoaWxkIFBhY2thZ2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoaWxkIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRDaGlsZFBhY2thZ2VzKCk7Ci0KLQlNZXRob2RQYWNrYWdlIGdldFBhcmVudFBhY2thZ2UoKTsKLQotfSAvLyBNZXRob2RQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0ZDhlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWV0aG9kIFBsdWdpbiBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldFVzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldE1ldGhvZFBhY2thZ2VzIDxlbT5NZXRob2QgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldEJhc2VzIDxlbT5CYXNlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQbHVnaW4gZXh0ZW5kcyBNZXRob2RVbml0LCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJ0cnVlIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0VXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXNlckNoYW5nZWFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2lufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2VzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRCYXNlcygpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9NZXRob2RVbml0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5NjAyMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01ldGhvZFVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgVW5pdCBpcyBhIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kVW5pdCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFVuaXRfQXV0aG9ycygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdXRob3JzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURhdGUoRGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EYXRlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGF0ZSBnZXRDaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50IDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwgdmFsdWUpOwotCi19IC8vIE1ldGhvZFVuaXQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL01pbGVzdG9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VjODcxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTWlsZXN0b25lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgTWlsZXN0b25lIGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdHMgPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRNaWxlc3RvbmUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWlsZXN0b25lIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcXVpcmVkIFJlc3VsdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldFJlcXVpcmVkUmVzdWx0cygpOwotfSAvLyBNaWxlc3RvbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZWRFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL05hbWVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTlkZjQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuICBEZWZpbmVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgYSBuYW1lLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXROYW1lZEVsZW1lbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkRWxlbWVudCBleHRlbmRzIEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVkRWxlbWVudF9OYW1lKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIE5hbWVkRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lc3BhY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZWFhMjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lc3BhY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldE5hbWVzcGFjZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZXNwYWNlIGV4dGVuZHMgTmFtZWRFbGVtZW50IHsKLX0gLy8gTmFtZXNwYWNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL091dGNvbWUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvT3V0Y29tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTM1OTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvT3V0Y29tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIG91dGNvbWUgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0T3V0Y29tZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBPdXRjb21lIGV4dGVuZHMgV29ya1Byb2R1Y3QgewotfSAvLyBPdXRjb21lCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQ0NjNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQYWNrYWdlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBhY2thZ2UgZXh0ZW5kcyBOYW1lc3BhY2UsIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci19IC8vIFBhY2thZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BhY2thZ2VhYmxlRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk0N2U1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlYWJsZUVsZW1lbnQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBQYWNrYWdlYWJsZUVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGhhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0MTAzYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaGFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFBoYXNlIGlzIGEgc3BlY2lhbCBBY3Rpdml0eSwgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi0gKiBQaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQaGFzZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQaGFzZSBleHRlbmRzIEFjdGl2aXR5IHsKLX0gLy8gUGhhc2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGxhbm5pbmdEYXRhLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1BsYW5uaW5nRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI5NzY1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUGxhbm5pbmdEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUGxhbm5pbmcgRGF0YSBpcyBhIE1ldGhvZCBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotICogUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotICogKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCkKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsgPGVtPlJhbms8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGEoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGxhbm5pbmdEYXRhIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0YXJ0IERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFN0YXJ0RGF0ZShEYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5EYXRlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURhdGUgZ2V0U3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnREYXRlKERhdGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RmluaXNoRGF0ZShEYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRGF0ZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEYXRlIGdldEZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RmluaXNoRGF0ZShEYXRlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhbms8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJhbmsoaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9SYW5rKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuSW50ZWdlciIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgZ2V0UmFuaygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFuayhpbnQgdmFsdWUpOwotCi19IC8vIFBsYW5uaW5nRGF0YQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2ludC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTBkYWU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLklNb2RlbE9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9pbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludCNnZXRYIDxlbT5YPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkgPGVtPlk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2ludCgpCi0gKiBAbW9kZWwKLSAqIEBleHRlbmRzIElNb2RlbE9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvaW50IGV4dGVuZHMgSU1vZGVsT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFgoRG91YmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvaW50X1goKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Eb3VibGUiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG91YmxlIGdldFgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCA8ZW0+WDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+WDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0WCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0WChEb3VibGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5ZPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRZKERvdWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2ludF9ZKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuRG91YmxlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURvdWJsZSBnZXRZKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkgPGVtPlk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFkoRG91YmxlIHZhbHVlKTsKLQotfSAvLyBQb2ludApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qb2x5bGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTU1NmNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUG9seWxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9seWxpbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvbHlsaW5lKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBvbHlsaW5lIGV4dGVuZHMgR3JhcGhpY1ByaW1pdGl2ZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+InRydWUiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsb3NlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9zZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsb3NlZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFBvbHlsaW5lX0Nsb3NlZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLkJvb2xlYW4iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRDbG9zZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUjZ2V0Q2xvc2VkIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsb3NlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xvc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDbG9zZWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XYXlwb2ludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldheXBvaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQb2x5bGluZV9XYXlwb2ludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIGxvd2VyPSIyIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCk7Ci0KLX0gLy8gUG9seWxpbmUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhMTcyZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ByYWN0aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcmFjdGljZSByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJhY3RpY2UgZXh0ZW5kcyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBQcmFjdGljZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxQcmFjdGljZT4gZ2V0U3ViUHJhY3RpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50UmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjdGl2aXR5IFJlZmVyZW5jZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8QWN0aXZpdHk+IGdldEFjdGl2aXR5UmVmZXJlbmNlcygpOwotCi19IC8vIFByYWN0aWNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWJlNmQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJhY3RpY2VEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEJhY2tncm91bmQgPGVtPkJhY2tncm91bmQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByYWN0aWNlRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvYmxlbTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvYmxlbShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvYmxlbSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2JsZW0oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhY2tncm91bmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEJhY2tncm91bmQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYWNrZ3JvdW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R29hbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRHb2FscygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R29hbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHb2FscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFwcGxpY2F0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gUHJhY3RpY2VEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxZjg3Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgaXMgYSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotICogQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLgotICogCi0gKiBQcm9jZXNzIGluIHRoZSBwYWNrYWdlIExpYnJhcnkgQ29uZmlndXJhdGlvbiBleHRlbmRzIHRoZSBjbGFzcyBQcm9jZXNzIHdpdGggYXNzb2NpYXRpb24gcmVsYXRpbmcgYSBQcm9jZXNzIHRvIG9uZSBkZWZhdWx0IGFuZCBtYW55IG9wdGlvbmFsIHZhbGlkIENvbmZpZ3VyYXRpb25zLgotICogVGhlc2UgY29uZmlndXJhdGlvbnMgZGVzY3JpYmUgdmFsaWQgY29udGV4dHMgZm9yIHRoZSBQcm9jZXNzIHdpdGhpbiBhIE1ldGhvZCBMaWJyYXJ5IGluZGljYXRpbmcgdW5kZXIgd2hpY2ggQ29uZmlndXJhdGlvbnMgYSBQcm9jZXNzIGlzIHdlbGwgZGVmaW5lZC4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm5zIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzIGV4dGVuZHMgQWN0aXZpdHkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBnZXRJbmNsdWRlc1BhdHRlcm5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29udGV4dCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRDb250ZXh0KE1ldGhvZENvbmZpZ3VyYXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldFZhbGlkQ29udGV4dCgpOwotCi19IC8vIFByb2Nlc3MKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTNlZTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIENvbXBvbmVudCBpcyBhIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi0gKiBVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50IGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2UsIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2VzKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U+IGdldEludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE5ZmU0NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBQcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBQcm9jZXNzIENvbXBvbmVudCBhcHBsaWNhdGlvbiBpbiBhIFByb2Nlc3MsIGkuZS4gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5pbmcgdGhlIFByb2Nlc3MuICBUaGUgUHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvciBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIHRoZSBkZXRhaWxzIG9mIHRoZSBjb21wb25lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlIGFuZCB0byBwcm92aWRlIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMgc3VjaCBhcyBpdCBvd24gcHJlZGVjZXNzb3JzIGFuZCBzdWNjZXNzb3JzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgZXh0ZW5kcyBEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5wcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldF9wcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnQgZ2V0X3Byb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0X3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldF9wcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzVkZWNlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZSBjb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucyA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRhc2tEZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlSU8oKTsKLQotfSAvLyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExYTg5NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjb3BlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY29wZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTY29wZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2FnZSBOb3RlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXNhZ2VOb3RlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRVc2FnZU5vdGVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmI0OC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQcm9jZXNzIEVsZW1lbnQgaXMgYSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLSAqIFByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiAKLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0VsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotfSAvLyBQcm9jZXNzRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzRmFtaWx5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NGYW1pbHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4YTA2MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NGYW1pbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBGYW1pbHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlbGl2ZXJ5IE1vZGVsIEZhbWlseSBpcyBhIGNvbnZlbmllbnQgZ3JvdXBpbmcgb2YgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIG9mIGludGVyZXN0IHRvIHNvbWUgc3BlY2lmaWMgdXNlciBjb21tdW5pdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5I2dldERlbGl2ZXJ5UHJvY2Vzc2VzIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRmFtaWx5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NGYW1pbHkgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PERlbGl2ZXJ5UHJvY2Vzcz4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotfSAvLyBQcm9jZXNzRmFtaWx5CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzM1NzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBQcm9jZXNzIFBhY2thZ2UgaXMgYSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLSAqIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8UHJvY2Vzc0VsZW1lbnQ+IGdldFByb2Nlc3NFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW19LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlhZ3JhbXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RGlhZ3JhbT4gZ2V0RGlhZ3JhbXMoKTsKLQotfSAvLyBQcm9jZXNzUGFja2FnZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY2NGRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLSAqIEEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlZE9uUHJvY2Vzc2VzIDxlbT5CYXNlZCBPbiBQcm9jZXNzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZWQgT24gUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8b3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPiBnZXRCYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLX0gLy8gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvcGVydHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0YTAyNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Byb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSA8ZW0+S2V5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFByb3BlcnR5KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5IGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktleTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5LZXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEtleShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvcGVydHlfS2V5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0S2V5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldEtleSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5LZXk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2V5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UHJvcGVydHlfVmFsdWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWZlcmVuY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0YWJhNWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UjZ2V0UmVmZXJlbmNlZCA8ZW0+UmVmZXJlbmNlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZmVyZW5jZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2UgZXh0ZW5kcyBEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbihCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRSZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlZmVyZW5jZWQoRGlhZ3JhbUVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRSZWZlcmVuY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InJlZmVyZW5jZSIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaWFncmFtRWxlbWVudCBnZXRSZWZlcmVuY2VkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2VkPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkKERpYWdyYW1FbGVtZW50IHZhbHVlKTsKLQotfSAvLyBSZWZlcmVuY2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVwb3J0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg3ZDQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUmVwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJlcG9ydCBpcyBhIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJlcG9ydCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvcnQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJlcG9ydApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JldXNhYmxlQXNzZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxZGRhYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JldXNhYmxlQXNzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSZXVzYWJsZSBBc3NldCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi0gKiBob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJldXNhYmxlQXNzZXQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmV1c2FibGVBc3NldCBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gUmV1c2FibGVBc3NldApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2FkbWFwLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwOTA1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvYWRtYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvYWRtYXAgaXMgYSBzcGVjaWFsIEd1aWRhbmNlIFR5cGUgd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLSAqIEFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2FkbWFwKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvYWRtYXAgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJvYWRtYXAKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDM2Y2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFJvbGUgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi0gKiBBIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGUgZXh0ZW5kcyBDb250ZW50RWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3R9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kaWZpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlX01vZGlmaWVzKCkKLQkgKiBAbW9kZWwgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldE1vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0KLX0gLy8gUm9sZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzkwMWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBMaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNraWxsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2tpbGxzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2tpbGxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNraWxscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN5bm9ueW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogTGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTeW5vbnltcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lub255bXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lub255bXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN5bm9ueW1zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTeW5vbnltcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFJvbGVEZXNjcmlwdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE3ZjAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSb2xlIERlc2NyaXB0b3IgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVEZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb2xlKFJvbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Um9sZShSb2xlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TW9kaWZpZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Nb2RpZmllczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9Nb2RpZmllcygpCi0JICogQG1vZGVsIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE1vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0KLX0gLy8gUm9sZURlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvUm9sZVNldC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMjE0YzYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgU2V0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBSb2xlIFNldCBvcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0I2dldFJvbGVzIDxlbT5Sb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZVNldCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0X1JvbGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9sZT4gZ2V0Um9sZXMoKTsKLQotfSAvLyBSb2xlU2V0CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Sb2xlU2V0R3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxZjQ1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldCBHcm91cGluZzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0cyA8ZW0+Um9sZSBTZXRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVTZXRHcm91cGluZyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBTZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgU2V0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvbGUgU2V0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlU2V0PiBnZXRSb2xlU2V0cygpOwotCi19IC8vIFJvbGVTZXRHcm91cGluZwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZWN0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjM2UxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFNlY3Rpb24gaXMgYSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuCi0gKiBTZWN0aW9uIGluIHRoZSBwYWNrYWdlIE1ldGhvZCBQbHVnaW4gaW5oZXJpdHMgZnJvbSBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBleHRlbmRzIFNlY3Rpb24gZGVmaW5lZCBpbiBNZXRob2QgQ29yZSA6OiBCYXNpYyBFbGVtZW50cyB3aXRoIG5ldyBjYXBhYmlsaXRpZXMgZm9yIHZhcmlhYmlsaXR5LiAKLSAqIEZvciBleGFtcGxlLCB3aGVuIGEgVGFzayBjb250cmlidXRlcyB0byBhbm90aGVyIFRhc2sgaXRzIFByZXNlbnRhdGlvbiBhc3NvY2lhdGlvbiBpcyBjb250cmlidXRlZCBpbmNsdWRpbmcgaXRzIFNlY3Rpb25zIChpLmUuIGl0cyBTdGVwcyksIHdoaWNoIGFyZSBtb2RlbGVkIGFzIHBhcnRzIG9mIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgU2VjdGlvbnMgY2FuIGJlIG5lc3RlZCBhbmQgdGhlcmVmb3JlIFRhc2sgRGVzY3JpcHRpb25zIGNhbiBiZSBmbGV4aWJseSBvcmdhbml6ZWQgaW4gU3RlcHMgd2l0aCBzdWItU3RlcHMuICBTZWN0aW9ucyBhcmUgVmFyaWFiaWxpdHkgRWxlbWVudHMgdGhlbXNlbHZlcywgc28gdGhleSBjYW4gY29udHJpYnV0ZSB0byBlYWNoIG90aGVyLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBtb2RlbCBhIFRhc2sgc3RlcCBhcyBhIFNlY3Rpb24gaW5zdGFuY2Ugd2l0aG91dCByZWxhdGluZyBpdCB0byBhIFRhc2sgRGVzY3JpcHRpb24gdGhhdCBkaXJlY3RseSBjb250cmlidXRlcyB0byAob3IgcmVwbGFjZXMpIGFub3RoZXIgU2VjdGlvbiB3aGljaCBpcyBwYXJ0IG9mIGEgVGFzayBEZXNjcmlwdGlvbi4gIFRoaXMgY29udHJpYnV0aW9uIChvciByZXBsYWNlbWVudCkgd291bGQgYWRkIG5ldyBkZXNjcmlwdGlvbiB0ZXh0IHRvIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uIChvciByZXBsYWNlIHRoZSBvcmlnaW5hbCBzdGVwIGRlc2NyaXB0aW9uKS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSB0byBjb250cmlidXRlIG5ldyBDaGVjayBMaXN0IGl0ZW1zIG9yZ2FuaXplZCBhcyBTZWN0aW9ucyB0byBhbiBleGlzdGluZyBDaGVjayBMaXN0IChkZWZpbmVkIGFzIGd1aWRhbmNlKS4gIAotICogCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbiA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb25zIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlY3Rpb24gZXh0ZW5kcyBWYXJpYWJpbGl0eUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZWN0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNlY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2VjdGlvbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU3ViU2VjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFNlY3Rpb24+IGdldFN1YlNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZWRlY2Vzc29yKFNlY3Rpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGdldFByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWRlY2Vzc29yKFNlY3Rpb24gdmFsdWUpOwotCi19IC8vIFNlY3Rpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMDQ2NjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldERpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsIDxlbT5TZW1hbnRpYyBNb2RlbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JhcGhFbGVtZW50KEdyYXBoRWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsCi0JICogQG1vZGVsIG9wcG9zaXRlPSJzZW1hbnRpY01vZGVsIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3JhcGhFbGVtZW50IGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERpYWdyYW0oRGlhZ3JhbSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldE5hbWVzcGFjZQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0ibmFtZXNwYWNlIiB0cmFuc2llbnQ9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbSBnZXREaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpYWdyYW08L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREaWFncmFtKERpYWdyYW0gdmFsdWUpOwotCi19IC8vIFNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmYmEwOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgSW5mbzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIEluZm88L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFR5cGVJbmZvKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGVJbmZvKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50I2dldFR5cGVJbmZvIDxlbT5UeXBlIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgSW5mbzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZUluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGVJbmZvKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvU3RlcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjYyMzEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TdGVwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBTdGVwIGlzIGEgU2VjdGlvbiBhbmQgV29yayBEZWZpbml0aW9uIHRoYXQgaXMgdXNlZCB0byBvcmdhbml6ZSBUYXNrcyBpbnRvIHBhcnRzIG9yIHN1YnVuaXRzIG9mIHdvcmsuICBTdGVwcyBpbmhlcml0IHRoZSBzdWJTZWN0aW9ucyBkZWNvbXBvc2l0aW9uIGZyb20gU2VjdGlvbiBhbmQgY2FuIHRoZXJlZm9yZSBkZXNjcmliZSBTdWItU3RlcHMgbmVzdGVkIGludG8gU3RlcHMuCi0gKiBBIFN0ZXAgZGVzY3JpYmVzIGEgbWVhbmluZ2Z1bCBhbmQgY29uc2lzdCBwYXJ0IG9mIHRoZSBvdmVyYWxsIHdvcmsgZGVzY3JpYmVkIGZvciBhIFRhc2suICBUaGUgY29sbGVjdGlvbiBvZiBTdGVwcyBkZWZpbmVkIGZvciBhIFRhc2sgcmVwcmVzZW50cyBhbGwgdGhlIHdvcmsgdGhhdCBzaG91bGQgYmUgZG9uZSB0byBhY2hpZXZlIHRoZSBvdmVyYWxsIGRldmVsb3BtZW50IGdvYWwgb2YgdGhlIFRhc2suICBOb3QgYWxsIHN0ZXBzIGFyZSBuZWNlc3NhcmlseSBwZXJmb3JtZWQgZWFjaCB0aW1lIGEgVGFzayBpcyBpbnZva2VkIGluIGEgUHJvY2VzcyAoc2VlIFRhc2sgRGVzY3JpcHRvciksIHNvIHRoZXkgY2FuIGFsc28gYmUgZXhwcmVzc2VkIGluIHRoZSBmb3JtIG9mIGFsdGVybmF0ZSAnZmxvd3MnIG9mIHdvcmsuICBEaWZmZXJlbnQgd2F5cyBvZiBhY2hpZXZpbmcgdGhlIHNhbWUgZGV2ZWxvcG1lbnQgZ29hbCBjYW4gdGhlbiBiZSAnYXNzZW1ibGVkJyBieSBzZWxlY3RpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBzdGVwcyB3aGVuIGFwcGx5aW5nIHRoZSBUYXNrIGluIGEgUHJvY2Vzcy4gIFR5cGljYWwga2luZHMgb2Ygc3RlcHMgYSBUYXNrIGF1dGhvciBzaG91bGQgY29uc2lkZXIgYXJlOiBUaGlua2luZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgdW5kZXJzdGFuZCB0aGUgbmF0dXJlIG9mIHRoZSB0YXNrLCBnYXRoZXJzIGFuZCBleGFtaW5lcyB0aGUgaW5wdXQgYXJ0aWZhY3RzLCBhbmQgZm9ybXVsYXRlcyB0aGUgb3V0Y29tZS4gUGVyZm9ybWluZyBzdGVwczogd2hlcmUgdGhlIGluZGl2aWR1YWwgcm9sZXMgY3JlYXRlIG9yIHVwZGF0ZSBzb21lIGFydGlmYWN0cy4gUmV2aWV3aW5nIHN0ZXBzOiB3aGVyZSB0aGUgaW5kaXZpZHVhbCByb2xlcyBpbnNwZWN0cyB0aGUgcmVzdWx0cyBhZ2FpbnN0IHNvbWUgY3JpdGVyaWEuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0U3RlcCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdGVwIGV4dGVuZHMgU2VjdGlvbiwgV29ya0RlZmluaXRpb24gewotfSAvLyBTdGVwCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9TdXBwb3J0aW5nTWF0ZXJpYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxMmEzZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFN1cHBvcnRpbmcgTWF0ZXJpYWxzIGlzIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBTdXBwb3J0aW5nTWF0ZXJpYWwgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFN1cHBvcnRpbmdNYXRlcmlhbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzYjMwMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRhc2sgaXMgYSBjb250ZW50IGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLSAqIEEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotICogQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi0gKiBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LgotICogCi0gKiBUaGlzIGlzIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlJ3MgZXh0ZW5zaW9uIG9mIFRhc2sgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0aW9uYWwgYXNzb2NpYXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFN0ZXBzIDxlbT5TdGVwczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2sgZXh0ZW5kcyBDb250ZW50RWxlbWVudCwgV29ya0RlZmluaXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfUGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlPiBnZXRQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0PiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PdXRwdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdD4gZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxSb2xlPiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19TdGVwcygpCi0JICogQG1vZGVsIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFN0ZXA+IGdldFN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfVG9vbE1lbnRvcnMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxUb29sTWVudG9yPiBnZXRUb29sTWVudG9ycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotfSAvLyBUYXNrCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UYXNrRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllZTU1Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrRGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHVycG9zZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsdGVybmF0aXZlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsdGVybmF0aXZlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBUYXNrRGVzY3JpcHRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGFza0Rlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZjc4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRhc2sgRGVzY3JpcHRvciBpcyBhIERlc2NyaXB0b3IgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIEEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotICogCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTZWxlY3RlZFN0ZXBzIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQsIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFzayhUYXNrKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhc2soVGFzayB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRBc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRNYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE91dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1BlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8Um9sZURlc2NyaXB0b3I+IGdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWxlY3RlZCBTdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWxlY3RlZCBTdGVwczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKQotCSAqIEBtb2RlbCBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTGlzdDxTZWN0aW9uPiBnZXRTZWxlY3RlZFN0ZXBzKCk7Ci0KLX0gLy8gVGFza0Rlc2NyaXB0b3IKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVhbVByb2ZpbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVhbVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1NjdlYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RlYW1Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZWFtIFByb2ZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFRlYW0gUHJvZmlsZSBpcyBhIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi0gKiBXb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi0gKiBIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcyA8ZW0+VGVhbSBSb2xlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZWFtUHJvZmlsZSBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlYW0gUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlYW0gUm9sZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZWFtIFJvbGVzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRUZWFtUm9sZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3VwZXJUZWFtKFRlYW1Qcm9maWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1YlRlYW0iIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVhbVByb2ZpbGUgZ2V0U3VwZXJUZWFtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3VwZXIgVGVhbTwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3VwZXJUZWFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgVGVhbTwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX1N1YlRlYW0oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0KLQkgKiBAbW9kZWwgb3Bwb3NpdGU9InN1cGVyVGVhbSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VGVhbVByb2ZpbGU+IGdldFN1YlRlYW0oKTsKLQotfSAvLyBUZWFtUHJvZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZW1wbGF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGFkYzQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUZW1wbGF0ZSBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGVtcGxhdGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVtcGxhdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFRlbXBsYXRlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rlcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3M2VkY2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVybSBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogVGVybURlZmluaXRpb25zIGRlZmluZSBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUaGV5IGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUZXJtRGVmaW5pdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXJtRGVmaW5pdGlvbiBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVGVybURlZmluaXRpb24KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGV4dEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVGV4dEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlMTExOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1RleHRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGV4dEVsZW1lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dEVsZW1lbnQgZXh0ZW5kcyBMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRleHQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGV4dChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VGV4dEVsZW1lbnRfVGV4dCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRleHRFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2wuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE0ZDQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUb29sIGlzIGEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sI2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRUb29sKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRvb2wgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbF9Ub29sTWVudG9ycygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCk7Ci0KLX0gLy8gVG9vbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Ub29sTWVudG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2xNZW50b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2ZTk1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1Rvb2xNZW50b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBUb29sIE1lbnRvciBpcyBhIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFRvb2xNZW50b3IoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG9vbE1lbnRvciBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVG9vbE1lbnRvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9UeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzY2VhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVTUwgMi4wIG1ldGEtY2xhc3MgVHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VHlwZSgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZSBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci19IC8vIFR5cGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVU1BU2VtYW50aWNNb2RlbEJyaWRnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NTAwMDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VTUFTZW1hbnRpY01vZGVsQnJpZGdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGV4dGVuZHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50KE1ldGhvZEVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTNhMjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBVbWFGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnkgewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgY3JlYXRlUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUtpbmQgY3JlYXRlS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlIGNyZWF0ZVJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFzayBjcmVhdGVUYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN0ZXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0ZXAgY3JlYXRlU3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdCBjcmVhdGVXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGdWxmaWxsYWJsZUVsZW1lbnQgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGUgY3JlYXRlRGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JT3V0Y29tZSBjcmVhdGVPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRhbmNlRGVzY3JpcHRpb24gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWlsZXN0b25lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGhhc2UgY3JlYXRlUGhhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlYW1Qcm9maWxlIGNyZWF0ZVRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2xlRGVzY3JpcHRvciBjcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrT3JkZXIgY3JlYXRlV29ya09yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBsYW5uaW5nRGF0YSBjcmVhdGVQbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBY3Rpdml0eURlc2NyaXB0aW9uIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbmNlcHQgY3JlYXRlQ29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGVja2xpc3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeGFtcGxlIGNyZWF0ZUV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRlbGluZSBjcmVhdGVHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGNyZWF0ZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVwb3J0IGNyZWF0ZVJlcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUb29sTWVudG9yIGNyZWF0ZVRvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZXJtRGVmaW5pdGlvbiBjcmVhdGVUZXJtRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldCBjcmVhdGVSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEb21haW4gY3JlYXRlRG9tYWluKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2wgY3JlYXRlVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVTZXRHcm91cGluZyBjcmVhdGVSb2xlU2V0R3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUN1c3RvbUNhdGVnb3J5IGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnQgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc1BhY2thZ2UgY3JlYXRlUHJvY2Vzc1BhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0ZhbWlseSBjcmVhdGVQcm9jZXNzRmFtaWx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kTGlicmFyeSBjcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBvaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9pbnQgY3JlYXRlUG9pbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaWFncmFtIExpbms8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpYWdyYW1MaW5rIGNyZWF0ZURpYWdyYW1MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHcmFwaENvbm5lY3RvciBjcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EaW1lbnNpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGltZW5zaW9uIGNyZWF0ZURpbWVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVmZXJlbmNlIGNyZWF0ZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb3BlcnR5IGNyZWF0ZVByb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoRWRnZSBjcmVhdGVHcmFwaEVkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUdyYXBoTm9kZSBjcmVhdGVHcmFwaE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRleHQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGV4dEVsZW1lbnQgY3JlYXRlVGV4dEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbWFnZSBjcmVhdGVJbWFnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvbHlsaW5lIGNyZWF0ZVBvbHlsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVsbGlwc2UgY3JlYXRlRWxsaXBzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGdldFVtYVBhY2thZ2UoKTsKLQotfSAvL1VtYUZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVW1hUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjQ0ZWQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9VbWFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDk0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogMDYKLSAqIDA1Ci0gKiAwNAotICogMDMKLSAqIDAxCi0gKiAwMgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidW1hIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41L3VtYS5lY29yZSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5lcGYudW1hIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVW1hUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEVMRU1FTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVF9fTkFNRSA9IEVMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TmFtZWQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IE5BTUVEX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UeXBlSW1wbCA8ZW0+VHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVFlQRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRZUEVfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVFlQRV9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsIDxlbT5DbGFzc2lmaWVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNsYXNzaWZpZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2xhc3NpZmllcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDTEFTU0lGSUVSID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0xBU1NJRklFUl9fTkFNRSA9IFRZUEVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU0lGSUVSX19JU19BQlNUUkFDVCA9IFRZUEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2xhc3NpZmllcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDTEFTU0lGSUVSX0ZFQVRVUkVfQ09VTlQgPSBUWVBFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lc3BhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFX19OQU1FID0gTkFNRURfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5OYW1lc3BhY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgPSBOQU1FRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZUltcGwgPGVtPlBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBBQ0tBR0UgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQQUNLQUdFX19OQU1FID0gTkFNRVNQQUNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTkFNRVNQQUNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0dVSUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX0tJTkQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19CT0RZID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlQgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVCA9IDE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fR1VJRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fS0lORCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsIDxlbT5LaW5kPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBLSU5EID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0dVSUQgPSBDT05URU5UX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0tJTkQgPSBDT05URU5UX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NVUFBSRVNTRUQgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fR1VJREVMSU5FUyA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fRVhBTVBMRVMgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19HVUlEID0gTUVUSE9EX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUyA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19BVVRIT1JTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19WRVJTSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT04gPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORCA9IE1FVEhPRF9VTklUX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IE1FVEhPRF9VTklUX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IE1FVEhPRF9VTklUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNFQ1RJT04gPSAxNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1QgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLID0gMzg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwgPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT04gPSAzNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsIDxlbT5TdGVwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RlcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVEVQID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19FWEFNUExFUyA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1QgPSAyNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkZ1bGZpbGxhYmxlRWxlbWVudEltcGwgPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRnVsZmlsbGFibGVFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJBQkxFID0gMzM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbCA8ZW0+T3V0Y29tZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5PdXRjb21lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQ09NRSA9IDM0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRSA9IDYzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFID0gNjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04gPSA0MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSA0MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSA0MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTiA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTiA9IDQ1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTiA9IDQ2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsIDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UID0gNTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UID0gNTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWSA9IDUzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbCA8ZW0+TWlsZXN0b25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJVEVSQVRJT04gPSA2ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGhhc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUEhBU0UgPSA2OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRSA9IDcwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1IgPSA2NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUiA9IDcxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVIgPSA1ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1IgPSA3MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSA2NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEUgPSA3MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSA4MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT04gPSA4MjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OID0gODQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IDgzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSA4NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsIDxlbT5Db25jZXB0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uY2VwdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05DRVBUID0gMTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDSEVDS0xJU1QgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXhhbXBsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFWEFNUExFID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkZWxpbmVJbXBsIDxlbT5HdWlkZWxpbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEd1aWRlbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlERUxJTkUgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZXBvcnRJbXBsIDxlbT5SZXBvcnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVBPUlQgPSAyOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbCA8ZW0+VGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVNUExBVEUgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19DSEVDS0xJU1RTID0gR1VJREFOQ0VfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0FTU0VUUyA9IEdVSURBTkNFX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX0tJTkQgPSBNRVRIT0RfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX05BTUUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19HVUlEID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFZBUklBQklMSVRZX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19PV05FRF9SVUxFUyA9IFZBUklBQklMSVRZX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFZBUklBQklMSVRZX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0tJTkQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TVVBQUkVTU0VEID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09SREVSSU5HX0dVSURFID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TRUNUSU9OX05BTUUgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OID0gVkFSSUFCSUxJVFlfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWIgU2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NVQl9TRUNUSU9OUyA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19QUkVERUNFU1NPUiA9IFZBUklBQklMSVRZX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2VjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBWQVJJQUJJTElUWV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwgPGVtPlRvb2wgTWVudG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBUT09MX01FTlRPUiA9IDMxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXaGl0ZXBhcGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdISVRFUEFQRVIgPSAzNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbCA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlcm1EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTiA9IDI0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsIDxlbT5QcmFjdGljZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRSA9IDgwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmV1c2FibGVBc3NldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVCA9IDIzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUlkgPSA0ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FID0gNTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbCA8ZW0+Um9sZSBTZXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEVfU0VUID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsIDxlbT5Eb21haW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET01BSU4gPSA0OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEUgPSA1MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbCA8ZW0+VG9vbDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTCA9IDYwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElORyA9IDYxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTUyA9IDc1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1MgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbCA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNhcGFiaWxpdHlQYXR0ZXJuSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTiA9IDc2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvYWRtYXBJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0FETUFQID0gNTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0UgPSA4ODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlQgPSA4NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IDEwMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SID0gODY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTiA9IDc4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IDI1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fTkFNRSA9IENMQVNTSUZJRVJfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfQUJTVFJBQ1QgPSBDTEFTU0lGSUVSX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiA9IENMQVNTSUZJRVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fRkVBVFVSRV9DT1VOVCA9IENMQVNTSUZJRVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fS0lORCA9IENPTlRFTlRfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVFMgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19HVUlERUxJTkVTID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQVNTRVRTID0gQ09OVEVOVF9FTEVNRU5UX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0ZVTEZJTExTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVQT1JUUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVEVNUExBVEVTID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HVUlEID0gV09SS19QUk9EVUNUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0tJTkQgPSBXT1JLX1BST0RVQ1RfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0VYQU1QTEVTID0gV09SS19QUk9EVUNUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1RFUk1ERUZJTklUSU9OID0gV09SS19QUk9EVUNUX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0ZVTEZJTExTID0gV09SS19QUk9EVUNUX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19UT09MX01FTlRPUlMgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcnRpZmFjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fR1VJRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19LSU5EID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBGVUxGSUxMQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFMgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRlVMRklMTEFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19LSU5EID0gR1VJREFOQ0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dVSURFTElORVMgPSBHVUlEQU5DRV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19URVJNREVGSU5JVElPTiA9IEdVSURBTkNFX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRlbXBsYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dVSUQgPSBHVUlEQU5DRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX09XTkVEX1JVTEVTID0gR1VJREFOQ0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0tJTkQgPSBHVUlEQU5DRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19DT05DRVBUU19BTkRfUEFQRVJTID0gR1VJREFOQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1VJREVMSU5FUyA9IEdVSURBTkNFX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fRVhBTVBMRVMgPSBHVUlEQU5DRV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1RFUk1ERUZJTklUSU9OID0gR1VJREFOQ0VfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HVUlEID0gV09SS19QUk9EVUNUX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0tJTkQgPSBXT1JLX1BST0RVQ1RfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ0hFQ0tMSVNUUyA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VYQU1QTEVTID0gV09SS19QUk9EVUNUX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19BU1NFVFMgPSBXT1JLX1BST0RVQ1RfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RFUk1ERUZJTklUSU9OID0gV09SS19QUk9EVUNUX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0ZVTEZJTExTID0gV09SS19QUk9EVUNUX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUkVQT1JUUyA9IFdPUktfUFJPRFVDVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19UT09MX01FTlRPUlMgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dVSUQgPSBXT1JLX1BST0RVQ1RfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX09XTkVEX1JVTEVTID0gV09SS19QUk9EVUNUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0tJTkQgPSBXT1JLX1BST0RVQ1RfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBSRVNTRUQgPSBXT1JLX1BST0RVQ1RfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX1RZUEUgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gV09SS19QUk9EVUNUX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19DT05DRVBUU19BTkRfUEFQRVJTID0gV09SS19QUk9EVUNUX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NIRUNLTElTVFMgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1VJREVMSU5FUyA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVhBTVBMRVMgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQVNTRVRTID0gV09SS19QUk9EVUNUX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RFUk1ERUZJTklUSU9OID0gV09SS19QUk9EVUNUX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRlVMRklMTFMgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1JFUE9SVFMgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19URU1QTEFURVMgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RPT0xfTUVOVE9SUyA9IFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+T3V0Y29tZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX05BTUUgPSBTRUNUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19HVUlEID0gU0VDVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1BSRVNFTlRBVElPTl9OQU1FID0gU0VDVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19CUklFRl9ERVNDUklQVElPTiA9IFNFQ1RJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19PV05FRF9SVUxFUyA9IFNFQ1RJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFQ1RJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX0tJTkQgPSBTRUNUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19TVVBQUkVTU0VEID0gU0VDVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX09SREVSSU5HX0dVSURFID0gU0VDVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1ZBUklBQklMSVRZX1RZUEUgPSBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19TRUNUSU9OX05BTUUgPSBTRUNUSU9OX19TRUNUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfX1NFQ1RJT05fREVTQ1JJUFRJT04gPSBTRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fU1VCX1NFQ1RJT05TID0gU0VDVElPTl9fU1VCX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1RFUF9fUFJFREVDRVNTT1IgPSBTRUNUSU9OX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19QUkVDT05ESVRJT04gPSBTRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVEVQX19QT1NUQ09ORElUSU9OID0gU0VDVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNURVBfRkVBVFVSRV9DT1VOVCA9IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0dVSUQgPSBNRVRIT0RfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX09XTkVEX1JVTEVTID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX05BTUUgPSBDT05DRVBUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19HVUlEID0gQ09OQ0VQVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19CUklFRl9ERVNDUklQVElPTiA9IENPTkNFUFRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PV05FRF9SVUxFUyA9IENPTkNFUFRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTkNFUFRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0tJTkQgPSBDT05DRVBUX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TVVBQUkVTU0VEID0gQ09OQ0VQVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX09SREVSSU5HX0dVSURFID0gQ09OQ0VQVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19JU19BQlNUUkFDVCA9IENPTkNFUFRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTiA9IENPTkNFUFRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TSEFQRUlDT04gPSBDT05DRVBUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OT0RFSUNPTiA9IENPTkNFUFRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19WQVJJQUJJTElUWV9UWVBFID0gQ09OQ0VQVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTkNFUFRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OQ0VQVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTkNFUFRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fQ0hFQ0tMSVNUUyA9IENPTkNFUFRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1VJREVMSU5FUyA9IENPTkNFUFRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0VYQU1QTEVTID0gQ09OQ0VQVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19BU1NFVFMgPSBDT05DRVBUX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1RFUk1ERUZJTklUSU9OID0gQ09OQ0VQVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX0ZFQVRVUkVfQ09VTlQgPSBDT05DRVBUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUFJFQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QT1NUQ09ORElUSU9OID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUEVSRk9STUVEX0JZID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTUFOREFUT1JZX0lOUFVUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1VUUFVUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09QVElPTkFMX0lOUFVUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19TVEVQUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RPT0xfTUVOVE9SUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1VJRCA9IENPTlRFTlRfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fT1dORURfUlVMRVMgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fS0lORCA9IENPTlRFTlRfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX05PREVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HVUlERUxJTkVTID0gQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19FWEFNUExFUyA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19BU1NFVFMgPSBDT05URU5UX0VMRU1FTlRfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19GVUxGSUxMUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Nb2RpZmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTU9ESUZJRVMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19SRVNQT05TSUJMRV9GT1IgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0lORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19HVUlEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0tJTkQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBPdXRsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19OQU1FID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fR1VJRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19LSU5EID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19LSU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0tJTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19HVUlEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fS0lORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dVSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19LSU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb25nIFByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFja2dyb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HVUlEID0gQ09OVEVOVF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFUyA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19LSU5EID0gQ09OVEVOVF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTID0gQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVMgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEVTID0gQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUyA9IENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUk9MRVMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0tJTkQgPSBDT05URU5UX0NBVEVHT1JZX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19XT1JLX1BST0RVQ1RTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1NVQkRPTUFJTlMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRvbWFpbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19LSU5EID0gQ09OVEVOVF9DQVRFR09SWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ0hFQ0tMSVNUUyA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0dVSURFTElORVMgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19BU1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX19BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19URVJNREVGSU5JVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVEFTS1MgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YmRpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19OQU1FID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19HVUlEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUyA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19LSU5EID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fS0lORCA9IFBST0NFU1NfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlEID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fS0lORCA9IEJSRUFLRE9XTl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SID0gQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HVUlEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PV05FRF9SVUxFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fS0lORCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX0FCU1RSQUNUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX05PREVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DSEVDS0xJU1RTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0NPTkNFUFRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19FWEFNUExFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HVUlERUxJTkVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1RFTVBMQVRFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUkVQT1JUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19UT09MTUVOVE9SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19GVUxGSUxMUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUE9TVENPTkRJVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JPQURNQVBTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fR1VJRCA9IFBST0NFU1NfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1dORURfUlVMRVMgPSBQUk9DRVNTX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fS0lORCA9IFBST0NFU1NfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0lTX0FCU1RSQUNUID0gUFJPQ0VTU19FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX05PREVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbms8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19SQU5LID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19HVUlEID0gUFJPQ0VTU19FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19PV05FRF9SVUxFUyA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19LSU5EID0gUFJPQ0VTU19FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1NIQVBFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0xJTktfVFlQRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9fUFJFRCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HVUlEID0gR1VJREFOQ0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PV05FRF9SVUxFUyA9IEdVSURBTkNFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IEdVSURBTkNFX19DT05DRVBUU19BTkRfUEFQRVJTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NIRUNLTElTVFMgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0VYQU1QTEVTID0gR1VJREFOQ0VfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQVNTRVRTID0gR1VJREFOQ0VfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9hZG1hcDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DSEVDS0xJU1RTID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0FTU0VUUyA9IENPTlRFTlRfQ0FURUdPUllfX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXJtZGVmaW5pdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1RPT0xfTUVOVE9SUyA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlEID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19PV05FRF9SVUxFUyA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fS0lORCA9IENPTlRFTlRfQ0FURUdPUllfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0cyBBbmQgUGFwZXJzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQ09OQ0VQVFNfQU5EX1BBUEVSUyA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFRTX0FORF9QQVBFUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlERUxJTkVTID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0VYQU1QTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fVEVSTURFRklOSVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19URVJNREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dVSUQgPSBDT05URU5UX0NBVEVHT1JZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX09XTkVEX1JVTEVTID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0tJTkQgPSBDT05URU5UX0NBVEVHT1JZX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19DT05DRVBUU19BTkRfUEFQRVJTID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0NIRUNLTElTVFMgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJREVMSU5FUyA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fRVhBTVBMRVMgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQVNTRVRTID0gQ09OVEVOVF9DQVRFR09SWV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1RFUk1ERUZJTklUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBDYXRlZ29yaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fS0lORCA9IE1FVEhPRF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19HTE9CQUwgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19HVUlEID0gTUVUSE9EX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PV05FRF9SVUxFUyA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0tJTkQgPSBNRVRIT0RfUEFDS0FHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HVUlEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19PV05FRF9SVUxFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19LSU5EID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBQUkVTU0VEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRUZJWCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19JU19QTEFOTkVEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19TVVBFUl9BQ1RJVklUSUVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NIRUNLTElTVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0NPTkNFUFRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fRVhBTVBMRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dVSURFTElORVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVVTQUJMRV9BU1NFVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fVEVNUExBVEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUkVQT1JUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1RPT0xNRU5UT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTElOS19UT19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NaWxlc3RvbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0NIRUNLTElTVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0VYQU1QTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dVSURFTElORVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fVEVNUExBVEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19SRVBPUlRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1RPT0xNRU5UT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HVUlEID0gREVTQ1JJUFRPUl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PV05FRF9SVUxFUyA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fS0lORCA9IERFU0NSSVBUT1JfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gREVTQ1JJUFRPUl9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBERVNDUklQVE9SX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19DSEVDS0xJU1RTID0gREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0NPTkNFUFRTID0gREVTQ1JJUFRPUl9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWEFNUExFUyA9IERFU0NSSVBUT1JfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HVUlERUxJTkVTID0gREVTQ1JJUFRPUl9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFMgPSBERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1RFTVBMQVRFUyA9IERFU0NSSVBUT1JfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVQT1JUUyA9IERFU0NSSVBUT1JfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19UT09MTUVOVE9SID0gREVTQ1JJUFRPUl9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlkgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1VJRCA9IEFDVElWSVRZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19LSU5EID0gQUNUSVZJVFlfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU0hBUEVJQ09OID0gQUNUSVZJVFlfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX1BMQU5ORUQgPSBBQ1RJVklUWV9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUEVSX0FDVElWSVRJRVMgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0NIRUNLTElTVFMgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DT05DRVBUUyA9IEFDVElWSVRZX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19FWEFNUExFUyA9IEFDVElWSVRZX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0dVSURFTElORVMgPSBBQ1RJVklUWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUkVVU0FCTEVfQVNTRVRTID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVEVNUExBVEVTID0gQUNUSVZJVFlfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1JFUE9SVFMgPSBBQ1RJVklUWV9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQUNUSVZJVFlfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1RPT0xNRU5UT1IgPSBBQ1RJVklUWV9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0xJTktfVE9fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19GVUxGSUxMUyA9IEFDVElWSVRZX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSRUFLRE9XTl9FTEVNRU5UUyA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUk9BRE1BUFMgPSBBQ1RJVklUWV9fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+SXRlcmF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HVUlEID0gQUNUSVZJVFlfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19PV05FRF9SVUxFUyA9IEFDVElWSVRZX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19LSU5EID0gQUNUSVZJVFlfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19TVVBFUl9BQ1RJVklUSUVTID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NIRUNLTElTVFMgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0NPTkNFUFRTID0gQUNUSVZJVFlfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fRVhBTVBMRVMgPSBBQ1RJVklUWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dVSURFTElORVMgPSBBQ1RJVklUWV9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19SRVVTQUJMRV9BU1NFVFMgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fVEVNUExBVEVTID0gQUNUSVZJVFlfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUkVQT1JUUyA9IEFDVElWSVRZX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1RPT0xNRU5UT1IgPSBBQ1RJVklUWV9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTElOS19UT19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fRlVMRklMTFMgPSBBQ1RJVklUWV9fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJFQUtET1dOX0VMRU1FTlRTID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1JPQURNQVBTID0gQUNUSVZJVFlfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBoYXNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0NIRUNLTElTVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19DT05DRVBUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19FWEFNUExFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dVSURFTElORVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUkVVU0FCTEVfQVNTRVRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fVEVNUExBVEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1JFUE9SVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1RPT0xNRU5UT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZWFtIFJvbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFRlYW08L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VCX1RFQU0gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19OQU1FID0gREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HVUlEID0gREVTQ1JJUFRPUl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19PV05FRF9SVUxFUyA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19LSU5EID0gREVTQ1JJUFRPUl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTiA9IERFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUwgPSBERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NIRUNLTElTVFMgPSBERVNDUklQVE9SX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0NPTkNFUFRTID0gREVTQ1JJUFRPUl9fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fRVhBTVBMRVMgPSBERVNDUklQVE9SX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0dVSURFTElORVMgPSBERVNDUklQVE9SX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFMgPSBERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fVEVNUExBVEVTID0gREVTQ1JJUFRPUl9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVQT1JUUyA9IERFU0NSSVBUT1JfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IERFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1RPT0xNRU5UT1IgPSBERVNDUklQVE9SX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JPTEUgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX05BTUUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dVSUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0tJTkQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFRklYID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRJRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19FWEFNUExFUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1VJREVMSU5FUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19URU1QTEFURVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19SRVBPUlRTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fVE9PTE1FTlRPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUkVQRUFUQUJMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19JU19FVkVOVF9EUklWRU4gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19MSU5LX1RPX1BSRURFQ0VTU09SID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIFN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX05BTUUgPSBST0xFX0RFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19HVUlEID0gUk9MRV9ERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19CUklFRl9ERVNDUklQVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19PV05FRF9SVUxFUyA9IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFJPTEVfREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0tJTkQgPSBST0xFX0RFU0NSSVBUT1JfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBQUkVTU0VEID0gUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09SREVSSU5HX0dVSURFID0gUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19BQlNUUkFDVCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRBVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TSEFQRUlDT04gPSBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19OT0RFSUNPTiA9IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRUZJWCA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfUExBTk5FRCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfT1BUSU9OQUwgPSBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQUZURVIgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QTEFOTklOR19EQVRBID0gUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fU1VQRVJfQUNUSVZJVElFUyA9IFJPTEVfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQ0hFQ0tMSVNUUyA9IFJPTEVfREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0NPTkNFUFRTID0gUk9MRV9ERVNDUklQVE9SX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0VYQU1QTEVTID0gUk9MRV9ERVNDUklQVE9SX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1VJREVMSU5FUyA9IFJPTEVfREVTQ1JJUFRPUl9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVVTQUJMRV9BU1NFVFMgPSBST0xFX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUk9MRV9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19URU1QTEFURVMgPSBST0xFX0RFU0NSSVBUT1JfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUkVQT1JUUyA9IFJPTEVfREVTQ1JJUFRPUl9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBST0xFX0RFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fVE9PTE1FTlRPUiA9IFJPTEVfREVTQ1JJUFRPUl9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19ST0xFID0gUk9MRV9ERVNDUklQVE9SX19ST0xFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTU9ESUZJRVMgPSBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1VJRCA9IEFDVElWSVRZX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1dORURfUlVMRVMgPSBBQ1RJVklUWV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0tJTkQgPSBBQ1RJVklUWV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19QTEFOTkVEID0gQUNUSVZJVFlfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUExBTk5JTkdfREFUQSA9IEFDVElWSVRZX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fQ0hFQ0tMSVNUUyA9IEFDVElWSVRZX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DT05DRVBUUyA9IEFDVElWSVRZX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRVhBTVBMRVMgPSBBQ1RJVklUWV9fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1VJREVMSU5FUyA9IEFDVElWSVRZX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFMgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19URU1QTEFURVMgPSBBQ1RJVklUWV9fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JFUE9SVFMgPSBBQ1RJVklUWV9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVE9PTE1FTlRPUiA9IEFDVElWSVRZX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19SRVBFQVRBQkxFID0gQUNUSVZJVFlfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBBQ1RJVklUWV9fTElOS19UT19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fRlVMRklMTFMgPSBBQ1RJVklUWV9fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1JPQURNQVBTID0gQUNUSVZJVFlfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUyA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1VJRCA9IFBST0NFU1NfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fT1dORURfUlVMRVMgPSBQUk9DRVNTX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19LSU5EID0gUFJPQ0VTU19fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUExBTk5JTkdfREFUQSA9IFBST0NFU1NfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdGllczwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1NVUEVSX0FDVElWSVRJRVMgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUSUVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NIRUNLTElTVFMgPSBQUk9DRVNTX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT05DRVBUUyA9IFBST0NFU1NfX0NPTkNFUFRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FWEFNUExFUyA9IFBST0NFU1NfX0VYQU1QTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dVSURFTElORVMgPSBQUk9DRVNTX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTID0gUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IFBST0NFU1NfX1NVUFBPUlRJTkdfTUFURVJJQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVEVNUExBVEVTID0gUFJPQ0VTU19fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1JFUE9SVFMgPSBQUk9DRVNTX19SRVBPUlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb25jb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gUFJPQ0VTU19fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2xtZW50b3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1RPT0xNRU5UT1IgPSBQUk9DRVNTX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19SRVBFQVRBQkxFID0gUFJPQ0VTU19fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfT05HT0lORyA9IFBST0NFU1NfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1IgPSBQUk9DRVNTX19MSU5LX1RPX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19GVUxGSUxMUyA9IFBST0NFU1NfX0ZVTEZJTExTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFBST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IFBST0NFU1NfX0JSRUFLRE9XTl9FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUk9BRE1BUFMgPSBQUk9DRVNTX19ST0FETUFQUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMgPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19OQU1FID0gUFJPQ0VTU19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19PV05FRF9SVUxFUyA9IFBST0NFU1NfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19LSU5EID0gUFJPQ0VTU19fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19TVVBFUl9BQ1RJVklUSUVTID0gUFJPQ0VTU19fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NIRUNLTElTVFMgPSBQUk9DRVNTX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRVhBTVBMRVMgPSBQUk9DRVNTX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dVSURFTElORVMgPSBQUk9DRVNTX19HVUlERUxJTkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fVEVNUExBVEVTID0gUFJPQ0VTU19fVEVNUExBVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUkVQT1JUUyA9IFBST0NFU1NfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1RPT0xNRU5UT1IgPSBQUk9DRVNTX19UT09MTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTElOS19UT19QUkVERUNFU1NPUiA9IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRlVMRklMTFMgPSBQUk9DRVNTX19GVUxGSUxMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRUNPTkRJVElPTiA9IFBST0NFU1NfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJFQUtET1dOX0VMRU1FTlRTID0gUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1JPQURNQVBTID0gUFJPQ0VTU19fUk9BRE1BUFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSU5DTFVERVNfUEFUVEVSTlMgPSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBTElEX0NPTlRFWFQgPSBQUk9DRVNTX19WQUxJRF9DT05URVhUOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19LSU5EID0gTUVUSE9EX1VOSVRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlld3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0dVSUQgPSBNRVRIT0RfVU5JVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1VOSVRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09XTkVEX1JVTEVTID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19LSU5EID0gTUVUSE9EX1VOSVRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19CQVNFUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HVUlEID0gUFJPQ0VTU19fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PV05FRF9SVUxFUyA9IFBST0NFU1NfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0tJTkQgPSBQUk9DRVNTX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQUkVTU0VEID0gUFJPQ0VTU19fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19BQlNUUkFDVCA9IFBST0NFU1NfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TSEFQRUlDT04gPSBQUk9DRVNTX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19OT0RFSUNPTiA9IFBST0NFU1NfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRUZJWCA9IFBST0NFU1NfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUExBTk5FRCA9IFBST0NFU1NfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gUFJPQ0VTU19fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfT1BUSU9OQUwgPSBQUk9DRVNTX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVTRU5URURfQUZURVIgPSBQUk9DRVNTX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9CRUZPUkUgPSBQUk9DRVNTX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQRVJfQUNUSVZJVElFUyA9IFBST0NFU1NfX1NVUEVSX0FDVElWSVRJRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQ0hFQ0tMSVNUUyA9IFBST0NFU1NfX0NIRUNLTElTVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NPTkNFUFRTID0gUFJPQ0VTU19fQ09OQ0VQVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0VYQU1QTEVTID0gUFJPQ0VTU19fRVhBTVBMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1VJREVMSU5FUyA9IFBST0NFU1NfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19SRVVTQUJMRV9BU1NFVFMgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1NVUFBPUlRJTkdfTUFURVJJQUxTID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19URU1QTEFURVMgPSBQUk9DRVNTX19URU1QTEFURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUkVQT1JUUyA9IFBST0NFU1NfX1JFUE9SVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlMgPSBQUk9DRVNTX19FU1RJTUFUSU9OQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbG1lbnRvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVE9PTE1FTlRPUiA9IFBST0NFU1NfX1RPT0xNRU5UT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FVkVOVF9EUklWRU4gPSBQUk9DRVNTX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluayBUbyBQcmVkZWNlc3NvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fTElOS19UT19QUkVERUNFU1NPUiA9IFBST0NFU1NfX0xJTktfVE9fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0ZVTEZJTExTID0gUFJPQ0VTU19fRlVMRklMTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVDT05ESVRJT04gPSBQUk9DRVNTX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJFQUtET1dOX0VMRU1FTlRTID0gUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ST0FETUFQUyA9IFBST0NFU1NfX1JPQURNQVBTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm5zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JTkNMVURFU19QQVRURVJOUyA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0RFRkFVTFRfQ09OVEVYVCA9IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJRCA9IEdVSURBTkNFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fT1dORURfUlVMRVMgPSBHVUlEQU5DRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fS0lORCA9IEdVSURBTkNFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTkNFUFRTX0FORF9QQVBFUlMgPSBHVUlEQU5DRV9fQ09OQ0VQVFNfQU5EX1BBUEVSUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ0hFQ0tMSVNUUyA9IEdVSURBTkNFX19DSEVDS0xJU1RTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HVUlERUxJTkVTID0gR1VJREFOQ0VfX0dVSURFTElORVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19FWEFNUExFUyA9IEdVSURBTkNFX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BU1NFVFMgPSBHVUlEQU5DRV9fQVNTRVRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlcm1kZWZpbml0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fVEVSTURFRklOSVRJT04gPSBHVUlEQU5DRV9fVEVSTURFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByYWN0aWNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1VJRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tJTkQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fS0lORCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU0VDVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0dVSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19LSU5EID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0dVSUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fS0lORCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTlMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gUFJPQ0VTU19ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3d0byBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gUFJPQ0VTU19ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGluZyBUZWNobmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0dVSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TRUNUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0dVSUQgPSBERVNDUklQVE9SX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX09XTkVEX1JVTEVTID0gREVTQ1JJUFRPUl9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fS0lORCA9IERFU0NSSVBUT1JfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREUgPSBERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFRklYID0gREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19JU19QTEFOTkVEID0gREVTQ1JJUFRPUl9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBERVNDUklQVE9SX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUSUVTID0gREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19DSEVDS0xJU1RTID0gREVTQ1JJUFRPUl9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fQ09OQ0VQVFMgPSBERVNDUklQVE9SX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fRVhBTVBMRVMgPSBERVNDUklQVE9SX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19HVUlERUxJTkVTID0gREVTQ1JJUFRPUl9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUyA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1RFTVBMQVRFUyA9IERFU0NSSVBUT1JfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19SRVBPUlRTID0gREVTQ1JJUFRPUl9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUyA9IERFU0NSSVBUT1JfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19UT09MTUVOVE9SID0gREVTQ1JJUFRPUl9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+cHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19HVUlEID0gTUVUSE9EX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFUyA9IE1FVEhPRF9QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0tJTkQgPSBNRVRIT0RfUEFDS0FHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19TVVBQUkVTU0VEID0gTUVUSE9EX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fTkFNRSA9IFBST0NFU1NfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0dVSUQgPSBQUk9DRVNTX1BBQ0tBR0VfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19QQUNLQUdFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09XTkVEX1JVTEVTID0gUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fS0lORCA9IFBST0NFU1NfUEFDS0FHRV9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1NVUFBSRVNTRUQgPSBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HTE9CQUwgPSBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19SRVVTRURfUEFDS0FHRVMgPSBQUk9DRVNTX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGlsZCBQYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NISUxEX1BBQ0tBR0VTID0gUFJPQ0VTU19QQUNLQUdFX19DSElMRF9QQUNLQUdFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UUyA9IFBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0RJQUdSQU1TID0gUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04gPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWSA9IDExMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsIDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUlkgPSAxMTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwgPGVtPlBvaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPSU5UID0gOTU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwgPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlQgPSA5MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fR1VJRCA9IE1FVEhPRF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVMgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19LSU5EID0gTUVUSE9EX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsIDxlbT5HcmFwaCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVCA9IDkxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19QT1NJVElPTiA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX19MSU5LID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwgPGVtPkRpYWdyYW0gTGluazwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESUFHUkFNX0xJTksgPSA5NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCA8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUiA9IDk3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFID0gOTk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsIDxlbT5EaW1lbnNpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESU1FTlNJT04gPSAxMDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsIDxlbT5SZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBSRUZFUkVOQ0UgPSA5MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb3BlcnR5SW1wbCA8ZW0+UHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFkgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHUkFQSF9FREdFID0gOTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaE5vZGVJbXBsIDxlbT5HcmFwaCBOb2RlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERSA9IDkwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19OQU1FID0gR1JBUEhfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fR1VJRCA9IEdSQVBIX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fT1dORURfUlVMRVMgPSBHUkFQSF9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19LSU5EID0gR1JBUEhfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fU1VQUFJFU1NFRCA9IEdSQVBIX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19PUkRFUklOR19HVUlERSA9IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19JU19WSVNJQkxFID0gR1JBUEhfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQ09OVEFJTkVSID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fUkVGRVJFTkNFID0gR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19QUk9QRVJUWSA9IEdSQVBIX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fQ09OVEFJTkVEID0gR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc2l0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9fUE9TSVRJT04gPSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9OT0RFX19MSU5LID0gR1JBUEhfRUxFTUVOVF9fTElOSzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3JhZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX0FOQ0hPUkFHRSA9IEdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZW1hbnRpYyBNb2RlbDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1NFTUFOVElDX01PREVMID0gR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX05PREVfX1NJWkUgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoIE5vZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfTk9ERV9GRUFUVVJFX0NPVU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsIDxlbT5EaWFncmFtPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESUFHUkFNID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX05BTUUgPSBHUkFQSF9OT0RFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19HVUlEID0gR1JBUEhfTk9ERV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhfTk9ERV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX05PREVfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19PV05FRF9SVUxFUyA9IEdSQVBIX05PREVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBIX05PREVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0tJTkQgPSBHUkFQSF9OT0RFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19TVVBQUkVTU0VEID0gR1JBUEhfTk9ERV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX09SREVSSU5HX0dVSURFID0gR1JBUEhfTk9ERV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0lTX1ZJU0lCTEUgPSBHUkFQSF9OT0RFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19DT05UQUlORVIgPSBHUkFQSF9OT0RFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19SRUZFUkVOQ0UgPSBHUkFQSF9OT0RFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1BST1BFUlRZID0gR1JBUEhfTk9ERV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19DT05UQUlORUQgPSBHUkFQSF9OT0RFX19DT05UQUlORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19QT1NJVElPTiA9IEdSQVBIX05PREVfX1BPU0lUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX0xJTksgPSBHUkFQSF9OT0RFX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fQU5DSE9SQUdFID0gR1JBUEhfTk9ERV9fQU5DSE9SQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU0VNQU5USUNfTU9ERUwgPSBHUkFQSF9OT0RFX19TRU1BTlRJQ19NT0RFTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9fU0laRSA9IEdSQVBIX05PREVfX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBMaW5rPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX19ESUFHUkFNX0xJTksgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX05BTUVTUEFDRSA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1pPT00gPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZpZXdwb2ludDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fX1ZJRVdQT0lOVCA9IEdSQVBIX05PREVfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9OT0RFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRUZFUkVOQ0VfX1JFRkVSRU5DRUQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVmZXJlbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST1BFUlRZX19LRVkgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9QRVJUWV9fVkFMVUUgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9JTlRfX1ggPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0lOVF9fWSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9pbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9JTlRfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19HVUlEID0gRElBR1JBTV9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19QUkVTRU5UQVRJT05fTkFNRSA9IERJQUdSQU1fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0JSSUVGX0RFU0NSSVBUSU9OID0gRElBR1JBTV9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19PV05FRF9SVUxFUyA9IERJQUdSQU1fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fS0lORCA9IERJQUdSQU1fRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19TVVBQUkVTU0VEID0gRElBR1JBTV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19PUkRFUklOR19HVUlERSA9IERJQUdSQU1fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fSVNfVklTSUJMRSA9IERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElBR1JBTV9MSU5LX19DT05UQUlORVIgPSBESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fUkVGRVJFTkNFID0gRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19fUFJPUEVSVFkgPSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1pPT00gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Vmlld3BvcnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX1ZJRVdQT1JUID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0RJQUdSQU0gPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJQUdSQU1fTElOS19GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX05BTUUgPSBHUkFQSF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0dVSUQgPSBHUkFQSF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdSQVBIX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX09XTkVEX1JVTEVTID0gR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0tJTkQgPSBHUkFQSF9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1NVUFBSRVNTRUQgPSBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19PUkRFUklOR19HVUlERSA9IEdSQVBIX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0lTX1ZJU0lCTEUgPSBHUkFQSF9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0NPTlRBSU5FUiA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fUkVGRVJFTkNFID0gR1JBUEhfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0NPTlRBSU5FRCA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fUE9TSVRJT04gPSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX0xJTksgPSBHUkFQSF9FTEVNRU5UX19MSU5LOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19BTkNIT1JBR0UgPSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9DT05ORUNUT1JfX1NFTUFOVElDX01PREVMID0gR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWRnZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0NPTk5FQ1RPUl9GRUFUVVJFX0NPVU5UID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fTkFNRSA9IEdSQVBIX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0dVSUQgPSBHUkFQSF9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHUkFQSF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX09XTkVEX1JVTEVTID0gR1JBUEhfRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1JBUEhfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fS0lORCA9IEdSQVBIX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1NVUFBSRVNTRUQgPSBHUkFQSF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fT1JERVJJTkdfR1VJREUgPSBHUkFQSF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fSVNfVklTSUJMRSA9IEdSQVBIX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0NPTlRBSU5FUiA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1JFRkVSRU5DRSA9IEdSQVBIX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fUFJPUEVSVFkgPSBHUkFQSF9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0NPTlRBSU5FRCA9IEdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3NpdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX1BPU0lUSU9OID0gR1JBUEhfRUxFTUVOVF9fUE9TSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGluazwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fTElOSyA9IEdSQVBIX0VMRU1FTlRfX0xJTks7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5jaG9yYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19BTkNIT1JBR0UgPSBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VtYW50aWMgTW9kZWw8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX19TRU1BTlRJQ19NT0RFTCA9IEdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhfRURHRV9fV0FZUE9JTlRTID0gR1JBUEhfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmNob3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBIX0VER0VfX0FOQ0hPUiA9IEdSQVBIX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3JhcGggRWRnZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSF9FREdFX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IERJQUdSQU1fRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBESUFHUkFNX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX19CUklFRl9ERVNDUklQVElPTiA9IERJQUdSQU1fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVMgPSBESUFHUkFNX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQgPSBESUFHUkFNX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IERJQUdSQU1fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREUgPSBESUFHUkFNX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEUgPSBESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRSA9IERJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BST1BFUlRZID0gRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IERJQUdSQU1fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VNQU5USUNfTU9ERUxfQlJJREdFX0ZFQVRVUkVfQ09VTlQgPSBESUFHUkFNX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2lkdGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESU1FTlNJT05fX1dJRFRIID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESU1FTlNJT05fX0hFSUdIVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGltZW5zaW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJTUVOU0lPTl9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1VJRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fT1dORURfUlVMRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19LSU5EID0gQlJFQUtET1dOX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXRpZXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1NVUEVSX0FDVElWSVRJRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0NIRUNLTElTVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19DT05DRVBUUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19FWEFNUExFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dVSURFTElORVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUkVVU0FCTEVfQVNTRVRTID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBQT1JUSU5HX01BVEVSSUFMUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fVEVNUExBVEVTID0gQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1JFUE9SVFMgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1RPT0xNRU5UT1IgPSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIElPPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVCA9IDEwMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19HVUlEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0tJTkQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19TVVBQUkVTU0VEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19DT05UQUlORVIgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19SRUZFUkVOQ0UgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fRElBR1JBTSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19HUkFQSF9FTEVNRU5UID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFID0gMTAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PV05FRF9SVUxFUyA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREUgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVIgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1JFRkVSRU5DRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSAxMDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT05fTkFNRSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fT1dORURfUlVMRVMgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19PUkRFUklOR19HVUlERSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fQ09OVEFJTkVSID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fUkVGRVJFTkNFID0gU0VNQU5USUNfTU9ERUxfQlJJREdFX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUk9QRVJUWSA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0gPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU07Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBTRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfRkVBVFVSRV9DT1VOVCA9IFNFTUFOVElDX01PREVMX0JSSURHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkxlYWZFbGVtZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldExlYWZFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVCA9IDEwNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19OQU1FID0gRElBR1JBTV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0dVSUQgPSBESUFHUkFNX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gRElBR1JBTV9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBESUFHUkFNX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTID0gRElBR1JBTV9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19LSU5EID0gRElBR1JBTV9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBESUFHUkFNX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gRElBR1JBTV9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFID0gRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBMRUFGX0VMRU1FTlRfX0NPTlRBSU5FUiA9IERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19SRUZFUkVOQ0UgPSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTEVBRl9FTEVNRU5UX19QUk9QRVJUWSA9IERJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TGVhZiBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRElBR1JBTV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGV4dEVsZW1lbnRJbXBsIDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGV4dEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGV4dEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UID0gMTA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX05BTUUgPSBMRUFGX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fR1VJRCA9IExFQUZfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBMRUFGX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IExFQUZfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fT1dORURfUlVMRVMgPSBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0tJTkQgPSBMRUFGX0VMRU1FTlRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fU1VQUFJFU1NFRCA9IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX0lTX1ZJU0lCTEUgPSBMRUFGX0VMRU1FTlRfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFWFRfRUxFTUVOVF9fQ09OVEFJTkVSID0gTEVBRl9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVYVF9FTEVNRU5UX19URVhUID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRleHQgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVhUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCA8ZW0+SW1hZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW1hZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgSU1BR0UgPSAxMDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19OQU1FID0gTEVBRl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fR1VJRCA9IExFQUZfRUxFTUVOVF9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19QUkVTRU5UQVRJT05fTkFNRSA9IExFQUZfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBMRUFGX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fT1dORURfUlVMRVMgPSBMRUFGX0VMRU1FTlRfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19LSU5EID0gTEVBRl9FTEVNRU5UX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fU1VQUFJFU1NFRCA9IExFQUZfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19PUkRFUklOR19HVUlERSA9IExFQUZfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgVmlzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19JU19WSVNJQkxFID0gTEVBRl9FTEVNRU5UX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fQ09OVEFJTkVSID0gTEVBRl9FTEVNRU5UX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fUkVGRVJFTkNFID0gTEVBRl9FTEVNRU5UX19SRUZFUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX19QUk9QRVJUWSA9IExFQUZfRUxFTUVOVF9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXJpPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSU1BR0VfX1VSSSA9IExFQUZfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW1lIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJTUFHRV9fTUlNRV9UWVBFID0gTEVBRl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkltYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElNQUdFX0ZFQVRVUkVfQ09VTlQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbCA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhpY1ByaW1pdGl2ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFID0gMTA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fTkFNRSA9IExFQUZfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0dVSUQgPSBMRUFGX0VMRU1FTlRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBMRUFGX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gTEVBRl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTID0gTEVBRl9FTEVNRU5UX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTEVBRl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fS0lORCA9IExFQUZfRUxFTUVOVF9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1NVUFBSRVNTRUQgPSBMRUFGX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fT1JERVJJTkdfR1VJREUgPSBMRUFGX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fSVNfVklTSUJMRSA9IExFQUZfRUxFTUVOVF9fSVNfVklTSUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXI8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUiA9IExFQUZfRUxFTUVOVF9fQ09OVEFJTkVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1JBUEhJQ19QUklNSVRJVkVfX1JFRkVSRU5DRSA9IExFQUZfRUxFTUVOVF9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFkgPSBMRUFGX0VMRU1FTlRfX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgPSBMRUFGX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwgPGVtPlBvbHlsaW5lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBPTFlMSU5FID0gMTA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fTkFNRSA9IEdSQVBISUNfUFJJTUlUSVZFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fR1VJRCA9IEdSQVBISUNfUFJJTUlUSVZFX19HVUlEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1JBUEhJQ19QUklNSVRJVkVfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fT1dORURfUlVMRVMgPSBHUkFQSElDX1BSSU1JVElWRV9fT1dORURfUlVMRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fS0lORCA9IEdSQVBISUNfUFJJTUlUSVZFX19LSU5EOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fU1VQUFJFU1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX09SREVSSU5HX0dVSURFID0gR1JBUEhJQ19QUklNSVRJVkVfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fSVNfVklTSUJMRSA9IEdSQVBISUNfUFJJTUlUSVZFX19JU19WSVNJQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lcjwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fQ09OVEFJTkVSID0gR1JBUEhJQ19QUklNSVRJVkVfX0NPTlRBSU5FUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX19SRUZFUkVOQ0UgPSBHUkFQSElDX1BSSU1JVElWRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQT0xZTElORV9fUFJPUEVSVFkgPSBHUkFQSElDX1BSSU1JVElWRV9fUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX0NMT1NFRCA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUE9MWUxJTkVfX1dBWVBPSU5UUyA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBvbHlsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBPTFlMSU5FX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsIDxlbT5FbGxpcHNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFTExJUFNFID0gMTEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0dVSUQgPSBHUkFQSElDX1BSSU1JVElWRV9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1BSRVNFTlRBVElPTl9OQU1FID0gR1JBUEhJQ19QUklNSVRJVkVfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHUkFQSElDX1BSSU1JVElWRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX09XTkVEX1JVTEVTID0gR1JBUEhJQ19QUklNSVRJVkVfX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LaW5kPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19LSU5EID0gR1JBUEhJQ19QUklNSVRJVkVfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1NVUFBSRVNTRUQgPSBHUkFQSElDX1BSSU1JVElWRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX09SREVSSU5HX0dVSURFID0gR1JBUEhJQ19QUklNSVRJVkVfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFZpc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19JU19WSVNJQkxFID0gR1JBUEhJQ19QUklNSVRJVkVfX0lTX1ZJU0lCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX0NPTlRBSU5FUiA9IEdSQVBISUNfUFJJTUlUSVZFX19DT05UQUlORVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19SRUZFUkVOQ0UgPSBHUkFQSElDX1BSSU1JVElWRV9fUkVGRVJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19QUk9QRVJUWSA9IEdSQVBISUNfUFJJTUlUSVZFX19QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DZW50ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19DRU5URVIgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYWRpdXMgWDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1JBRElVU19YID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX19SQURJVVNfWSA9IEdSQVBISUNfUFJJTUlUSVZFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fUk9UQVRJT04gPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBBbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVMTElQU0VfX1NUQVJUX0FOR0xFID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW5kIEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxMSVBTRV9fRU5EX0FOR0xFID0gR1JBUEhJQ19QUklNSVRJVkVfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RWxsaXBzZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFTExJUFNFX0ZFQVRVUkVfQ09VTlQgPSBHUkFQSElDX1BSSU1JVElWRV9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX05BTUUgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0dVSUQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fR1VJRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX09XTkVEX1JVTEVTID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX09XTkVEX1JVTEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0tJTkQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fS0lORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1NVUFBSRVNTRUQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0FVVEhPUlMgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19DSEFOR0VfREFURSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1ZFUlNJT04gPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ09QWVJJR0hUX1NUQVRFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBWaWV3czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19GQU1JTFlfX1BST0NFU1NfVklFV1MgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fREVGQVVMVF9WSUVXID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9fQkFTRV9DT05GSUdVUkFUSU9OUyA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19TVUJUUkFDVEVEX0NBVEVHT1JZID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19BRERFRF9DQVRFR09SWSA9IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVMgPSBNRVRIT0RfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIEZhbWlseTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZBTUlMWV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0NPTkZJR1VSQVRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19HVUlEID0gTUVUSE9EX1VOSVRfX0dVSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19PV05FRF9SVUxFUyA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19LSU5EID0gTUVUSE9EX1VOSVRfX0tJTkQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0IFN0YXRlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19DT1BZUklHSFRfU1RBVEVNRU5UID0gTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUyA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSX1RZUEUgPSAxMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9UWVBFID0gMTEzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5EYXRlPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERBVEUgPSAxMTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlVyaTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubmV0LlVSSQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFVyaSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBVUkkgPSAxMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlN0cmluZzwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdHJpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU1RSSU5HID0gMTE1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Cb29sZWFuPC9lbT4nIGRhdGEgdHlwZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgamF2YS5sYW5nLkJvb2xlYW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCb29sZWFuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJPT0xFQU4gPSAxMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPlNldDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5TZXQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VUID0gMTE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5TZXF1ZW5jZTwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VxdWVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VRVUVOQ0UgPSAxMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkludGVnZXI8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0SW50ZWdlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJTlRFR0VSID0gMTIxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5Eb3VibGU8L2VtPicgZGF0YSB0eXBlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqYXZhLmxhbmcuRG91YmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG91YmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERPVUJMRSA9IDEyMjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciA8ZW0+Q2xhc3NpZmllcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DbGFzc2lmaWVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDbGFzc2lmaWVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllciNnZXRJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyI2dldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI2dldENsYXNzaWZpZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENsYXNzaWZpZXJfSXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZWFibGVFbGVtZW50IDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TmFtZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRHdWlkIDxlbT5HdWlkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R3VpZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRHdWlkKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0d1aWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRCcmllZkRlc2NyaXB0aW9uIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3duZWQgUnVsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRLaW5kKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X0tpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50I2dldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3JkZXJpbmdHdWlkZSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X09yZGVyaW5nR3VpZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Qm9keTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCNnZXRCb2R5KCkKLQkgKiBAc2VlICNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X0JvZHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHRzQW5kUGFwZXJzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNoZWNrbGlzdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50I2dldENoZWNrbGlzdHMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5HdWlkZWxpbmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZXMgPGVtPkV4YW1wbGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FeGFtcGxlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZXMoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0QXNzZXRzIDxlbT5Bc3NldHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFzc2V0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQjZ2V0QXNzZXRzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRUZXJtZGVmaW5pdGlvbiA8ZW0+VGVybWRlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlcm1kZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudCNnZXRUZXJtZGVmaW5pdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X1Rlcm1kZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCA8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRQcmVzZW50YXRpb24gPGVtPlByZXNlbnRhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0U2hhcGVpY29uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0Tm9kZWljb24gPGVtPk5vZGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9kZWljb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb25zIDxlbT5TZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VjdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9ucygpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEV4dGVybmFsSWQoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSA8ZW0+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRTZWN0aW9uRGVzY3JpcHRpb24gPGVtPlNlY3Rpb24gRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFNlY3Rpb25EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFNlY3Rpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRTZWN0aW9uX1N1YlNlY3Rpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QcmVkZWNlc3NvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvcigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0TW9kaWZpZXMgPGVtPk1vZGlmaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Nb2RpZmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRNb2RpZmllcygpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZV9Nb2RpZmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cyA8ZW0+UmVwb3J0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVwb3J0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0cygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5UZW1wbGF0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9ycygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQgPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudCNnZXRGdWxmaWxscyA8ZW0+RnVsZmlsbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkZ1bGZpbGxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQjZ2V0RnVsZmlsbHMoKQotCSAqIEBzZWUgI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3V0cHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFN0ZXBzIDxlbT5TdGVwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3RlcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0U3RlcHMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfU3RlcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrX1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzayNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZXJBcnRpZmFjdCA8ZW0+Q29udGFpbmVyIEFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVyQXJ0aWZhY3QoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QjZ2V0Q29udGFpbmVkQXJ0aWZhY3RzIDxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQgQXJ0aWZhY3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdCNnZXRDb250YWluZWRBcnRpZmFjdHMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cyA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5PdXRjb21lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5PdXRjb21lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRPdXRjb21lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkdsb2JhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRHbG9iYWwoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2VzIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJldXNlZCBQYWNrYWdlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZSNnZXRDaGlsZFBhY2thZ2VzIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UjZ2V0Q2hpbGRQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50cyA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRzKCkKLQkgKiBAc2VlICNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CcmllZiBPdXRsaW5lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24gPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdXJwb3NlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24gPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U2tpbGxzIDxlbT5Ta2lsbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ta2lsbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcyA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5bm9ueW1zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uI2dldFB1cnBvc2UoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMgPGVtPkF0dGFjaG1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0YWNobWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24jZ2V0QXR0YWNobWVudHMoKQotCSAqIEBzZWUgI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFkZGl0aW9uYWxJbmZvIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BZGRpdGlvbmFsIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9ibGVtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJhY2tncm91bmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Hb2FsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRHb2FscygpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXBwbGljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnRzIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMgPGVtPlJvYWRtYXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2FkbWFwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcHMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9Sb2FkbWFwcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0TGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUGxhbm5lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlN1cGVyIEFjdGl2aXRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3RzIDxlbT5DaGVja2xpc3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DaGVja2xpc3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdHMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDb25jZXB0cyA8ZW0+Q29uY2VwdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbmNlcHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHRzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXhhbXBsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lcyA8ZW0+R3VpZGVsaW5lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+R3VpZGVsaW5lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldHMgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJldXNhYmxlQXNzZXRzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlbXBsYXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRUZW1wbGF0ZXMoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfVGVtcGxhdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlcG9ydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmVwb3J0cygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0VzdGltYXRpb25jb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRUb29sbWVudG9yIDxlbT5Ub29sbWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Ub29sbWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFRvb2xtZW50b3IoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfVG9vbG1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUgPGVtPk1pbGVzdG9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUjZ2V0UmVxdWlyZWRSZXN1bHRzIDxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmUjZ2V0UmVxdWlyZWRSZXN1bHRzKCkKLQkgKiBAc2VlICNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSXRlcmF0aW9uIDxlbT5JdGVyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZSA8ZW0+UGhhc2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRUZWFtUm9sZXMgPGVtPlRlYW0gUm9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRlYW0gUm9sZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFRlYW1Sb2xlcygpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlN1cGVyIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlI2dldFN1cGVyVGVhbSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YiBUZWFtPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3IjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlJvbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPk1vZGlmaWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRNb2RpZmllcygpCi0JICogQHNlZSAjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAc2VlICNnZXRSb2xlRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyIDxlbT5Xb3JrIE9yZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya09yZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MaW5rIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfTGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlByZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlciNnZXRQcmVkKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtPcmRlcl9QcmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFuazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhI2dldFJhbmsoKQotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvciNnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0VGFzaygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldEV4dGVybmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkgPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yI2dldFNlbGVjdGVkU3RlcHMgPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TZWxlY3RlZCBTdGVwczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0U2VsZWN0ZWRTdGVwcygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5IDxlbT5JbXBhY3RlZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RlZEJ5KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW1wYWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlI2dldEFnZ3JlZ2F0ZWRSb2xlcyA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBzZWUgI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG93dG8gU3RhZmY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93dG9TdGFmZigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1NjYWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SaXNrIExldmVsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0KCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjb3BlIDxlbT5TY29wZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjb3BlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXBvcnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUb29sTWVudG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldFN1YlByYWN0aWNlcyA8ZW0+U3ViIFByYWN0aWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFByYWN0aWNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlcyA8ZW0+Q29udGVudCBSZWZlcmVuY2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlI2dldEFjdGl2aXR5UmVmZXJlbmNlcyA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRUYXNrcyA8ZW0+VGFza3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlRhc2tzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFRhc2tzKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1Rhc2tzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFN1YmRpc2NpcGxpbmUgPGVtPlN1YmRpc2NpcGxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YmRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUjZ2V0U3ViZGlzY2lwbGluZSgpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldENvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldCNnZXRSb2xlcyA8ZW0+Um9sZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJvbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0I2dldFJvbGVzKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRSb2xlU2V0X1JvbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiA8ZW0+RG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPldvcmsgUHJvZHVjdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdHMoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluI2dldFN1YmRvbWFpbnMgPGVtPlN1YmRvbWFpbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YmRvbWFpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiNnZXRTdWJkb21haW5zKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3RzIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3RzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZXMgPGVtPkRpc2NpcGxpbmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaXNjaXBsaW5lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmVzKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sIDxlbT5Ub29sPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRvb2woKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sI2dldFRvb2xNZW50b3JzKCkKLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRUb29sX1Rvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Um9sZVNldEdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldHMgPGVtPlJvbGUgU2V0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+Um9sZSBTZXRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldHMoKQotCSAqIEBzZWUgI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5IDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldENhdGVnb3JpemVkRWxlbWVudHMgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3JpZXMgPGVtPlN1YiBDYXRlZ29yaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcmllcygpCi0JICogQHNlZSAjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzIDxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWxzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkKLQkgKiBAc2VlICNnZXREZWxpdmVyeVByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscyA8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybnMgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm5zKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4gPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VkT25Qcm9jZXNzZXMgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlcyA8ZW0+SW50ZXJmYWNlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2VzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudHMgPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb2Nlc3MgRWxlbWVudHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50cygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0RGlhZ3JhbXMgPGVtPkRpYWdyYW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EaWFncmFtczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0RGlhZ3JhbXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+cHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yI2dldF9wcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luI2dldFVzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlcyA8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGFja2FnZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlcygpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbiNnZXRCYXNlcyA8ZW0+QmFzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4jZ2V0QmFzZXMoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFZhcmlhYmlsaXR5RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0I2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlByb2Nlc3MgVmlld3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXdzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRlZmF1bHQgVmlldzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbnMgPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2UgQ29uZmlndXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkgPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QWRkZWRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHkgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzRmFtaWx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5I2dldERlbGl2ZXJ5UHJvY2Vzc2VzIDxlbT5EZWxpdmVyeSBQcm9jZXNzZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSNnZXREZWxpdmVyeVByb2Nlc3NlcygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0ZhbWlseSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW5zIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kUGx1Z2lucygpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5I2dldFByZWRlZmluZWRDb25maWd1cmF0aW9ucyA8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSNnZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50IDxlbT5Qb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WCA8ZW0+WDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFgoKQotCSAqIEBzZWUgI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2ludF9YKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQjZ2V0WSA8ZW0+WTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50I2dldFkoKQotCSAqIEBzZWUgI2dldFBvaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2ludF9ZKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEdyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRQb3NpdGlvbiA8ZW0+UG9zaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Qb3NpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFBvc2l0aW9uKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9Qb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldENvbnRhaW5lZCA8ZW0+Q29udGFpbmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db250YWluZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRDb250YWluZWQoKQotCSAqIEBzZWUgI2dldEdyYXBoRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldExpbmsgPGVtPkxpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkxpbms8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRMaW5rKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9MaW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkFuY2hvcmFnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldEFuY2hvcmFnZSgpCi0JICogQHNlZSAjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50I2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U2VtYW50aWMgTW9kZWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudCNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAc2VlICNnZXRHcmFwaEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50IDxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRJc1Zpc2libGUgPGVtPklzIFZpc2libGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBWaXNpYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRJc1Zpc2libGUoKQotCSAqIEBzZWUgI2dldERpYWdyYW1FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXyA8ZW0+Q29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkNvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0Q29udGFpbmVyXygpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQjZ2V0UmVmZXJlbmNlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUVsZW1lbnRfUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRQcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCNnZXRQcm9wZXJ0eSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbUxpbmsoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRab29tIDxlbT5ab29tPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Wm9vbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Wm9vbSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbUxpbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpYWdyYW1MaW5rX1pvb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5WaWV3cG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0Vmlld3BvcnQoKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19WaWV3cG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluayNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0R3JhcGhFbGVtZW50KCkKLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rI2dldERpYWdyYW0oKQotCSAqIEBzZWUgI2dldERpYWdyYW1MaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19EaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggQ29ubmVjdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhDb25uZWN0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0R3JhcGhDb25uZWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3IjZ2V0R3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJzxlbT5HcmFwaCBFZGdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvciNnZXRHcmFwaEVkZ2UoKQotCSAqIEBzZWUgI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+U2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5HcmFwaCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlI2dldEdyYXBoRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZSNnZXREaWFncmFtIDxlbT5EaWFncmFtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRpYWdyYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2UjZ2V0RGlhZ3JhbSgpCi0JICogQHNlZSAjZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiA8ZW0+RGltZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaW1lbnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0V2lkdGggPGVtPldpZHRoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V2lkdGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRXaWR0aCgpCi0JICogQHNlZSAjZ2V0RGltZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fV2lkdGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24jZ2V0SGVpZ2h0IDxlbT5IZWlnaHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IZWlnaHQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbiNnZXRIZWlnaHQoKQotCSAqIEBzZWUgI2dldERpbWVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGltZW5zaW9uX0hlaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2UgPGVtPlJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZWZlcmVuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmZXJlbmNlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlI2dldFJlZmVyZW5jZWQoKQotCSAqIEBzZWUgI2dldFJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSNnZXRLZXkgPGVtPktleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPktleTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0S2V5KCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlIDxlbT5HcmFwaCBFZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhFZGdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0QW5jaG9yIDxlbT5BbmNob3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkFuY2hvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldEFuY2hvcigpCi0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfQW5jaG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UjZ2V0V2F5cG9pbnRzIDxlbT5XYXlwb2ludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPldheXBvaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlI2dldFdheXBvaW50cygpCi0JICogQHNlZSAjZ2V0R3JhcGhFZGdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfV2F5cG9pbnRzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlhZ3JhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlpvb208L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0Wm9vbSgpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGlhZ3JhbV9ab29tKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQgPGVtPlZpZXdwb2ludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlZpZXdwb2ludDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXRWaWV3cG9pbnQoKQotCSAqIEBzZWUgI2dldERpYWdyYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERpYWdyYW1fVmlld3BvaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtI2dldERpYWdyYW1MaW5rIDxlbT5EaWFncmFtIExpbms8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkRpYWdyYW0gTGluazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbSNnZXREaWFncmFtTGluaygpCi0JICogQHNlZSAjZ2V0RGlhZ3JhbSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlhZ3JhbV9EaWFncmFtTGluaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0jZ2V0TmFtZXNwYWNlKCkKLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREaWFncmFtX05hbWVzcGFjZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUgPGVtPkdyYXBoIE5vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRHcmFwaE5vZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPlNpemU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZSNnZXRTaXplKCkKLQkgKiBAc2VlICNnZXRHcmFwaE5vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEdyYXBoTm9kZV9TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGUgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQjZ2V0VHlwZUluZm8oKQotCSAqIEBzZWUgI2dldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudF9UeXBlSW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldFVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSA8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZSNnZXRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudCA8ZW0+TGVhZiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldExlYWZFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50IDxlbT5UZXh0IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+VGV4dCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGV4dEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCNnZXRUZXh0IDxlbT5UZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGV4dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQjZ2V0VGV4dCgpCi0JICogQHNlZSAjZ2V0VGV4dEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRleHRFbGVtZW50X1RleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UgPGVtPkltYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkltYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0SW1hZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZSNnZXRVcmkgPGVtPlVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVyaTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0VXJpKCkKLQkgKiBAc2VlICNnZXRJbWFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0SW1hZ2VfVXJpKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1pbWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UjZ2V0TWltZVR5cGUoKQotCSAqIEBzZWUgI2dldEltYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRJbWFnZV9NaW1lVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3JhcGhpY1ByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSA8ZW0+UG9seWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9seWxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQb2x5bGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldENsb3NlZCA8ZW0+Q2xvc2VkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xvc2VkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZSNnZXRDbG9zZWQoKQotCSAqIEBzZWUgI2dldFBvbHlsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQb2x5bGluZV9DbG9zZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5XYXlwb2ludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBvbHlsaW5lI2dldFdheXBvaW50cygpCi0JICogQHNlZSAjZ2V0UG9seWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFBvbHlsaW5lX1dheXBvaW50cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlIDxlbT5FbGxpcHNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsbGlwc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFkaXVzIFg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0UmFkaXVzWCgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9SYWRpdXNYKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRSYWRpdXNZIDxlbT5SYWRpdXMgWTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJhZGl1cyBZPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFJhZGl1c1koKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24gPGVtPlJvdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0Um90YXRpb24oKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVsbGlwc2VfUm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldFN0YXJ0QW5nbGUgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhcnQgQW5nbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UjZ2V0U3RhcnRBbmdsZSgpCi0JICogQHNlZSAjZ2V0RWxsaXBzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRFbmRBbmdsZSA8ZW0+RW5kIEFuZ2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW5kIEFuZ2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGxpcHNlI2dldEVuZEFuZ2xlKCkKLQkgKiBAc2VlICNnZXRFbGxpcHNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX0VuZEFuZ2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkNlbnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSNnZXRDZW50ZXIoKQotCSAqIEBzZWUgI2dldEVsbGlwc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldEVsbGlwc2VfQ2VudGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+V29yayBPcmRlciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdvcmtPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS51dGlsLkRhdGUgPGVtPkRhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkRhdGU8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuRGF0ZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuRGF0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldERhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLm5ldC5VUkkgPGVtPlVyaTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+VXJpPC9lbT4nLgotCSAqIEBzZWUgamF2YS5uZXQuVVJJCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubmV0LlVSSSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFVyaSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEubGFuZy5TdHJpbmcgPGVtPlN0cmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U3RyaW5nPC9lbT4nLgotCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW4gPGVtPkJvb2xlYW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkJvb2xlYW48L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuQm9vbGVhbgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLmxhbmcuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldEJvb2xlYW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBqYXZhLnV0aWwuU2V0IDxlbT5TZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPlNldDwvZW0+Jy4KLQkgKiBAc2VlIGphdmEudXRpbC5TZXQKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0iamF2YS51dGlsLlNldCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIGphdmEudXRpbC5MaXN0IDxlbT5TZXF1ZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+U2VxdWVuY2U8L2VtPicuCi0JICogQHNlZSBqYXZhLnV0aWwuTGlzdAotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJqYXZhLnV0aWwuTGlzdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFNlcXVlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+SW50ZWdlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JbnRlZ2VyPC9lbT4nLgotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJpbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXRJbnRlZ2VyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgamF2YS5sYW5nLkRvdWJsZSA8ZW0+RG91YmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5Eb3VibGU8L2VtPicuCi0JICogQHNlZSBqYXZhLmxhbmcuRG91YmxlCi0JICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9ImphdmEubGFuZy5Eb3VibGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVEYXRhVHlwZSBnZXREb3VibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzIHsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwgPGVtPkNsYXNzaWZpZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2xhc3NpZmllcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDTEFTU0lGSUVSID0gZUlOU1RBTkNFLmdldENsYXNzaWZpZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwgPGVtPlR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUWVBFID0gZUlOU1RBTkNFLmdldFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2VhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQQUNLQUdFQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsIDxlbT5QYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBhY2thZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZXNwYWNlSW1wbCA8ZW0+TmFtZXNwYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVzcGFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TmFtZXNwYWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE5BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXROYW1lc3BhY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HdWlkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0dVSUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RFbGVtZW50X093bmVkUnVsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19LSU5EID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfS2luZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwgPGVtPkNvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uc3RyYWludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJvZHk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05TVFJBSU5UX19CT0RZID0gZUlOU1RBTkNFLmdldENvbnN0cmFpbnRfQm9keSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwgPGVtPktpbmQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuS2luZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0S2luZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBLSU5EID0gZUlOU1RBTkNFLmdldEtpbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBLSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyA9IGVJTlNUQU5DRQotCQkJCS5nZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHMgQW5kIFBhcGVyczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0NvbmNlcHRzQW5kUGFwZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NldHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnRFbGVtZW50X0Fzc2V0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVybWRlZmluaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSUJBQkxFX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05URU5UX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9uZyBQcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudERlc2NyaXB0aW9uX0xvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFNlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19TVUJfU0VDVElPTlMgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRUNUSU9OX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwgPGVtPlJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFID0gZUlOU1RBTkNFLmdldFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX19NT0RJRklFUyA9IGVJTlNUQU5DRS5nZXRSb2xlX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19SRVBPUlRTID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX19URU1QTEFURVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRnVsZmlsbGFibGVFbGVtZW50SW1wbCA8ZW0+RnVsZmlsbGFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5GdWxmaWxsYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEZ1bGZpbGxhYmxlRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBGVUxGSUxMQUJMRV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTID0gZUlOU1RBTkNFCi0JCQkJLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2soKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX01BTkRBVE9SWV9JTlBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfX09VVFBVVCA9IGVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PcHRpb25hbElucHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGVwczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fU1RFUFMgPSBlSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX19UT09MX01FTlRPUlMgPSBlSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrRGVmaW5pdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0RFRklOSVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtEZWZpbml0aW9uX1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwgPGVtPlN0ZXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3RlcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3RlcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTVEVQID0gZUlOU1RBTkNFLmdldFN0ZXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZUltcGwgPGVtPkd1aWRhbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCA8ZW0+QXJ0aWZhY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250YWluZXIgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsIDxlbT5EZWxpdmVyYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuT3V0Y29tZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBPVVRDT01FID0gZUlOU1RBTkNFLmdldE91dGNvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fR0xPQkFMID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hpbGQgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudFBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSQUJMRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TeW5vbnltczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdGlvbkltcGwgPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURBTkNFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dGFjaG1lbnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUkFDVElDRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIEluZm88L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdvYWxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fR29hbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsIDxlbT5BY3Rpdml0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQUNUSVZJVFkgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEFDVElWSVRZX19ST0FETUFQUyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19CUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MaW5rIFRvIFByZWRlY2Vzc29yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1ByZWRlY2Vzc29yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWCA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0aWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudF9UZW1wbGF0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfUmVwb3J0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFCi0JCQkJLmdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sbWVudG9yPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUiA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUlMRVNUT05FID0gZUlOU1RBTkNFLmdldE1pbGVzdG9uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTID0gZUlOU1RBTkNFCi0JCQkJLmdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JdGVyYXRpb25JbXBsIDxlbT5JdGVyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSXRlcmF0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGhhc2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBoYXNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBIQVNFID0gZUlOU1RBTkNFLmdldFBoYXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFQU1fUFJPRklMRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGVhbSBSb2xlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgVGVhbTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IGVJTlNUQU5DRQotCQkJCS5nZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwgPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9ERVNDUklQVE9SX19ST0xFID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1vZGlmaWVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBST0xFX0RFU0NSSVBUT1JfX01PRElGSUVTID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFCi0JCQkJLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrT3JkZXJJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX09SREVSID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TGluayBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19PUkRFUl9fTElOS19UWVBFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfT1JERVJfX1BSRUQgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyX1ByZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19FTEVNRU5UID0gZUlOU1RBTkNFLmdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBsYW5uaW5nRGF0YSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQTEFOTklOR19EQVRBID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1JBTksgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCA8ZW0+RGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFRBU0tfREVTQ1JJUFRPUl9fVEFTSyA9IGVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbGVjdGVkIFN0ZXBzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTID0gZUlOU1RBTkNFCi0JCQkJLmdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPU0lURV9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTID0gZUlOU1RBTkNFCi0JCQkJLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhvd3RvIFN0YWZmPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV1RPX1NUQUZGID0gZUlOU1RBTkNFCi0JCQkJLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93dG9TdGFmZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SaXNrIExldmVsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUID0gZUlOU1RBTkNFCi0JCQkJLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NvcGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fU2NvcGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIE5vdGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1JfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29uY2VwdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29uY2VwdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDT05DRVBUID0gZUlOU1RBTkNFLmdldENvbmNlcHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DaGVja2xpc3RJbXBsIDxlbT5DaGVja2xpc3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2hlY2tsaXN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDaGVja2xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsIDxlbT5FeGFtcGxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkV4YW1wbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3VpZGVsaW5lSW1wbCA8ZW0+R3VpZGVsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRlbGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURFTElORSA9IGVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVwb3J0SW1wbCA8ZW0+UmVwb3J0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlcG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVwb3J0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFUE9SVCA9IGVJTlNUQU5DRS5nZXRSZXBvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZW1wbGF0ZUltcGwgPGVtPlRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURU1QTEFURSA9IGVJTlNUQU5DRS5nZXRUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbE1lbnRvcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUb29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V2hpdGVwYXBlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXSElURVBBUEVSID0gZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwgPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVSTV9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlSW1wbCA8ZW0+UHJhY3RpY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgUHJhY3RpY2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUkFDVElDRV9fU1VCX1BSQUNUSUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9TdWJQcmFjdGljZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsIDxlbT5EaXNjaXBsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fVEFTS1MgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZV9UYXNrcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZGlzY2lwbGluZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvd3M8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRDYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfQ0FURUdPUlkgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZVNldEltcGwgPGVtPlJvbGUgU2V0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVTZXRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFJPTEVfU0VUX19ST0xFUyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RG9tYWluKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPTUFJTl9fV09SS19QUk9EVUNUUyA9IGVJTlNUQU5DRS5nZXREb21haW5fV29ya1Byb2R1Y3RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTlMgPSBlSU5TVEFOQ0UuZ2V0RG9tYWluX1N1YmRvbWFpbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTID0gZUlOU1RBTkNFCi0JCQkJLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVHcm91cGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVG9vbEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MID0gZUlOU1RBTkNFLmdldFRvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVE9PTF9fVE9PTF9NRU5UT1JTID0gZUlOU1RBTkNFLmdldFRvb2xfVG9vbE1lbnRvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVF9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGUgU2V0czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50czwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcmllczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWR1Y2F0aW9uIE1hdGVyaWFsczwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyA9IGVJTlNUQU5DRQotCQkJCS5nZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybnM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19fREVGQVVMVF9DT05URVhUID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0FQQUJJTElUWV9QQVRURVJOID0gZUlOU1RBTkNFLmdldENhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIDxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlZCBPbiBQcm9jZXNzZXM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwgPGVtPlJvYWRtYXA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9hZG1hcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9hZG1hcCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0FETUFQID0gZUlOU1RBTkNFLmdldFJvYWRtYXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwgPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QQUNLQUdFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGFja2FnZV9EaWFncmFtcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPnByb2Nlc3MgQ29tcG9uZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JfX3Byb2Nlc3NDb21wb25lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGx1Z2luKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9QTFVHSU4gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfUExVR0lOX19CQVNFUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsIDxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlZhcmlhYmlsaXR5RWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFZBUklBQklMSVRZX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRQotCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsIDxlbT5NZXRob2QgVW5pdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RVbml0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9VTklUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQVVUSE9SUyA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX1ZFUlNJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQgU3RhdGVtZW50PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXdzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0RlZmF1bHRWaWV3KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIENvbmZpZ3VyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUyA9IGVJTlNUQU5DRQotCQkJCS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0ZhbWlseUltcGwgPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NGYW1pbHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NGYW1pbHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19GQU1JTFkgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0ZhbWlseSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2Vzc2VzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTID0gZUlOU1RBTkNFCi0JCQkJLmdldFByb2Nlc3NGYW1pbHlfRGVsaXZlcnlQcm9jZXNzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TID0gZUlOU1RBTkNFCi0JCQkJLmdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2lucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVmaW5lZCBDb25maWd1cmF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwgPGVtPlBvaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvaW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2ludCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQT0lOVCA9IGVJTlNUQU5DRS5nZXRQb2ludCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBPSU5UX19YID0gZUlOU1RBTkNFLmdldFBvaW50X1goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQT0lOVF9fWSA9IGVJTlNUQU5DRS5nZXRQb2ludF9ZKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFbGVtZW50SW1wbCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEdyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zaXRpb248L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9FTEVNRU5UX19QT1NJVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRhaW5lZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9Db250YWluZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbms8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIEdSQVBIX0VMRU1FTlRfX0xJTksgPSBlSU5TVEFOQ0UuZ2V0R3JhcGhFbGVtZW50X0xpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcmFnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFID0gZUlOU1RBTkNFCi0JCQkJLmdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlbWFudGljIE1vZGVsPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwgPGVtPkRpYWdyYW0gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlhZ3JhbUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElBR1JBTV9FTEVNRU5UID0gZUlOU1RBTkNFLmdldERpYWdyYW1FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBWaXNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVyPC9iPjwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSA9IGVJTlNUQU5DRQotCQkJCS5nZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1FbGVtZW50X1Byb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsIDxlbT5EaWFncmFtIExpbms8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUxpbmtJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpYWdyYW1MaW5rKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU1fTElOSyA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGluaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fTElOS19fWk9PTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGlua19ab29tKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9ydDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fVklFV1BPUlQgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYXBoIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UID0gZUlOU1RBTkNFCi0JCQkJLmdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbTwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fTElOS19fRElBR1JBTSA9IGVJTlNUQU5DRS5nZXREaWFncmFtTGlua19EaWFncmFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhDb25uZWN0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEdyYXBoQ29ubmVjdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBIX0NPTk5FQ1RPUiA9IGVJTlNUQU5DRS5nZXRHcmFwaENvbm5lY3RvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5HcmFwaCBFZGdlPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgPGVtPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNFTUFOVElDX01PREVMX0JSSURHRSA9IGVJTlNUQU5DRS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRQotCQkJCS5nZXRTZW1hbnRpY01vZGVsQnJpZGdlX1ByZXNlbnRhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBTRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9HcmFwaEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNID0gZUlOU1RBTkNFCi0JCQkJLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfRGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpbWVuc2lvbkltcGwgPGVtPkRpbWVuc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpbWVuc2lvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBESU1FTlNJT04gPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5XaWR0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJTUVOU0lPTl9fV0lEVEggPSBlSU5TVEFOQ0UuZ2V0RGltZW5zaW9uX1dpZHRoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IZWlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESU1FTlNJT05fX0hFSUdIVCA9IGVJTlNUQU5DRS5nZXREaW1lbnNpb25fSGVpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCA8ZW0+UmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJlZmVyZW5jZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UmVmZXJlbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRSZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBSRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT04gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0UmVmZXJlbmNlX0lzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUkVGRVJFTkNFX19SRUZFUkVOQ0VEID0gZUlOU1RBTkNFLmdldFJlZmVyZW5jZV9SZWZlcmVuY2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvcGVydHlJbXBsIDxlbT5Qcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvcGVydHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19LRVkgPSBlSU5TVEFOQ0UuZ2V0UHJvcGVydHlfS2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWRnZUltcGwgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaEVkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfRURHRSA9IGVJTlNUQU5DRS5nZXRHcmFwaEVkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFuY2hvcjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRURHRV9fQU5DSE9SID0gZUlOU1RBTkNFLmdldEdyYXBoRWRnZV9BbmNob3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgR1JBUEhfRURHRV9fV0FZUE9JTlRTID0gZUlOU1RBTkNFLmdldEdyYXBoRWRnZV9XYXlwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCA8ZW0+RGlhZ3JhbTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREaWFncmFtKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJQUdSQU0gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJQUdSQU1fX1pPT00gPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9ab29tKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WaWV3cG9pbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESUFHUkFNX19WSUVXUE9JTlQgPSBlSU5TVEFOQ0UuZ2V0RGlhZ3JhbV9WaWV3cG9pbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpYWdyYW0gTGluazwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRElBR1JBTV9fRElBR1JBTV9MSU5LID0gZUlOU1RBTkNFLmdldERpYWdyYW1fRGlhZ3JhbUxpbmsoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVzcGFjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERJQUdSQU1fX05BTUVTUEFDRSA9IGVJTlNUQU5DRS5nZXREaWFncmFtX05hbWVzcGFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoTm9kZUltcGwgPGVtPkdyYXBoIE5vZGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaE5vZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1JBUEhfTk9ERSA9IGVJTlNUQU5DRS5nZXRHcmFwaE5vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBHUkFQSF9OT0RFX19TSVpFID0gZUlOU1RBTkNFLmdldEdyYXBoTm9kZV9TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsIDxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8gPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCA8ZW0+VU1BIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0VU1BU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0UgPSBlSU5TVEFOQ0UKLQkJCQkuZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCA9IGVJTlNUQU5DRQotCQkJCS5nZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsIDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTGVhZkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldExlYWZFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIExFQUZfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRMZWFmRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRleHRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUZXh0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBURVhUX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURVhUX0VMRU1FTlRfX1RFWFQgPSBlSU5TVEFOQ0UuZ2V0VGV4dEVsZW1lbnRfVGV4dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkltYWdlSW1wbCA8ZW0+SW1hZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuSW1hZ2VJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEltYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIElNQUdFID0gZUlOU1RBTkNFLmdldEltYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vcmk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBJTUFHRV9fVVJJID0gZUlOU1RBTkNFLmdldEltYWdlX1VyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWltZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgSU1BR0VfX01JTUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRJbWFnZV9NaW1lVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoaWNQcmltaXRpdmVJbXBsIDxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaGljUHJpbWl0aXZlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHcmFwaGljUHJpbWl0aXZlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdSQVBISUNfUFJJTUlUSVZFID0gZUlOU1RBTkNFLmdldEdyYXBoaWNQcmltaXRpdmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2x5bGluZUltcGwgPGVtPlBvbHlsaW5lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQb2x5bGluZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQT0xZTElORSA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xvc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUE9MWUxJTkVfX0NMT1NFRCA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZV9DbG9zZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldheXBvaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUE9MWUxJTkVfX1dBWVBPSU5UUyA9IGVJTlNUQU5DRS5nZXRQb2x5bGluZV9XYXlwb2ludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCA8ZW0+RWxsaXBzZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFbGxpcHNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEVMTElQU0UgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmFkaXVzIFg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19SQURJVVNfWCA9IGVJTlNUQU5DRS5nZXRFbGxpcHNlX1JhZGl1c1goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhZGl1cyBZPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fUkFESVVTX1kgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9SYWRpdXNZKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVMTElQU0VfX1JPVEFUSU9OID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfUm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0YXJ0IEFuZ2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRUxMSVBTRV9fU1RBUlRfQU5HTEUgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbmQgQW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFTExJUFNFX19FTkRfQU5HTEUgPSBlSU5TVEFOQ0UuZ2V0RWxsaXBzZV9FbmRBbmdsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2VudGVyPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRUxMSVBTRV9fQ0VOVEVSID0gZUlOU1RBTkNFLmdldEVsbGlwc2VfQ2VudGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRW51bSBXT1JLX09SREVSX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5EYXRlPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS51dGlsLkRhdGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBEQVRFID0gZUlOU1RBTkNFLmdldERhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPlVyaTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubmV0LlVSSQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRVcmkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgVVJJID0gZUlOU1RBTkNFLmdldFVyaSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+U3RyaW5nPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgamF2YS5sYW5nLlN0cmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRTdHJpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgU1RSSU5HID0gZUlOU1RBTkNFLmdldFN0cmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+Qm9vbGVhbjwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEubGFuZy5Cb29sZWFuCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJvb2xlYW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgQk9PTEVBTiA9IGVJTlNUQU5DRS5nZXRCb29sZWFuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXQ8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLnV0aWwuU2V0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNldCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBTRVQgPSBlSU5TVEFOQ0UuZ2V0U2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5TZXF1ZW5jZTwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIGphdmEudXRpbC5MaXN0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlcXVlbmNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFNFUVVFTkNFID0gZUlOU1RBTkNFLmdldFNlcXVlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JbnRlZ2VyPC9lbT4nIGRhdGEgdHlwZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEludGVnZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgSU5URUdFUiA9IGVJTlNUQU5DRS5nZXRJbnRlZ2VyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5Eb3VibGU8L2VtPicgZGF0YSB0eXBlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBqYXZhLmxhbmcuRG91YmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvdWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVEYXRhVHlwZSBET1VCTEUgPSBlSU5TVEFOQ0UuZ2V0RG91YmxlKCk7Ci0KLQl9Ci0KLX0gLy9VbWFQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvVmFyaWFiaWxpdHlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMmI2N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlZhcmlhYmlsaXR5IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGFuIGFic3RyYWN0IGNsYXNzIGRlcml2ZWQgZnJvbSBNZXRob2QgRWxlbWVudCB0aGF0IHByb3ZpZGVzIG5ldyBjYXBhYmlsaXRpZXMgZm9yIGNvbnRlbnQgdmFyaWF0aW9uIGFuZCBleHRlbnNpb24gdG8gQ29udGVudCBFbGVtZW50cyBvciBhbnkgb3RoZXIgTWV0aG9kIEVsZW1lbnQgdGhhdCBkZXJpdmVzIGZyb20gaXQuICBJdCBoYXMgYmVlbiBwbGFjZWQgaW4tYmV0d2VlbiB0aGUgY2xhc3NlcyBNZXRob2QgRWxlbWVudCBhbmQgQ29udGVudCBFbGVtZW50IGluIHRoZSBvdmVyYWxsIFVNQSB0YXhvbm9teSBvZiBjbGFzc2VzIHVzaW5nIHRoZSBVTUwgMi4wIHBhY2thZ2UgbWVyZ2UgbWVjaGFuaXNtLiAgVGhlIGFzc29jaWF0aW9uIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uIHNoYWxsIG9ubHkgYmUgaW5zdGFudGlhdGVkIGJldHdlZW4gdHdvIHN1YmNsYXNzZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhlIGVsZW1lbnQgb24gdmFyYWliaWxpdHlTcGVjaWFsRWxlbWVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgZGVmaW5lcyBhIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZSBkZWZpbmluZyB0aGUgbmF0dXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgdXNpbmcgYSBsaXRlcmFsIGZyb20gdGhlIGVudW1lcmF0aW9uIFZhcmlhYmlsaXR5IFR5cGUuCi0gKiBWYXJpYWJpbGl0eSBFbGVtZW50IG9mIHRoZSBtZXRhLW1vZGVsIHBhY2thZ2UgTWV0aG9kIFBsdWdpbnMgYWRkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHZhcmlhdGlvbiBhbmQgZXh0ZW5zaW9uIHRvIE1ldGhvZCBFbGVtZW50cyB0aGF0IGRlcml2ZSBmcm9tIGl0LiAgQnkgZGVmYXVsdCBhbGwgQ29udGVudCBFbGVtZW50cyBzdWNoIGFzIFJvbGUsIFRhc2ssIEd1aWRhbmNlIFR5cGVzLCBvciBBY3Rpdml0aWVzIGFyZSBkZWZpbmVkIHRvIGJlIFZhcmlhYmlsaXR5IEVsZW1lbnRzLgotICogVmFyaWFiaWxpdHkgYW5kIGV4dGVuc2lvbiBwcm92aWRlcyB1bmlxdWUgbWVjaGFuaXNtcyBmb3IgY3VzdG9taXppbmcgbWV0aG9kIGNvbnRlbnQgd2l0aG91dCBhY3R1YWxseSBkaXJlY3RseSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQsIGJ1dCBieSBqdXN0IGJlIGFibGUgdG8gZGVzY3JpYmUgd2l0aCBzZXBhcmF0ZSBvYmplY3RzIHRoZSBkaWZmZXJlbmNlcyAoYWRkaXRpb25zLCBjaGFuZ2VzLCBvbWlzc2lvbnMpIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbC4gIFRoaXMgcGx1Zy1pbiBjb25jZXB0IGFsbG93cyB1c2VycyB0byBmYWN0b3IgdGhlaXIgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBpbiBpbnRlcnJlbGF0ZWQgdW5pdHMgYW5kIGV2ZW4gdG8gYXJjaGl0ZWN0IG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgaW4gbGF5ZXJzIHRoYXQgZXh0ZW5kIGVhY2ggb3RoZXIgd2l0aCBuZXcgY2FwYWJpbGl0aWVzLiAgVGhlIHJlc3VsdGluZyBtZXRob2QgYW5kIHByb2Nlc3MgZGVzaWduIGNhbiBiZSBkeW5hbWljYWxseSBjb21iaW5lZCBhbmQgYXBwbGllZCBvbiBkZW1hbmQgdXNpbmcgdGhlIGludGVycHJldGF0aW9uIHJ1bGVzIGRlZmluZWQgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnQgU3BlY2lhbGl6YXRpb25zIGFzc2VtYmxpbmcgdG8gcHJvY2VzcyBwcmFjdGl0aW9uZXJzIHRoZSBtb3N0IGFjY3VyYXRlIG1ldGhvZCBhbmQgcHJvY2VzcyBkZXNjcmlwdGlvbnMgcG9zc2libGUuICBJdCBhbHNvIGFsbG93cyBwcm9jZXNzIHByYWN0aXRpb25lcnMgdG8gZXh0ZW5kcyBhbmQgdGFpbG9yIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgdGhleSBkbyBub3Qgb3duIGFuZCB0byBlYXNpbHkgdXBncmFkZSB0byBuZXdlciB2ZXJzaW9ucyBieSBzaW1wbHkgcmVhcHBseSB0aGVpciBwZXJzb25hbCBjaGFuZ2VzIHRvIHRoZXNlIHVwZ3JhZGVzLgotICogVmFyaWFiaWxpdHkgRWxlbWVudCBkZWZpbmVzIHR3byB0eXBlcyBvZiB2YXJpYWJpbGl0eSBhbmQgb25lIHR5cGUgb2YgZXh0ZW5zaW9uIHdoaWNoIGFyZSBmb3JtYWxseSBkZWZpbmVkIGZvciB0aGUgZW51bWVyYXRpb24gVmFyaWFiaWxpdHkgVHlwZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFZhcmlhYmlsaXR5RWxlbWVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmFyaWFiaWxpdHlFbGVtZW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJuYSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIGluIGluc3RhbmNlIG9mIHRoZSB2YXJpYWJpbGl0eVNwZWNpYWxpemF0aW9uIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIFZhcmlhYmlsaXR5IEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgZXhpc3RzLCB0aGVuIHRoZSB2YXJpYWJpbGl0eVR5cGUgYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdGhlIGVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5U3BlY2lhbEVsZW1lbnQgZW5kIG9mIHRoZSBhc3NvY2lhdGlvbiBjaGFuZ2VzIHRoZSBDb250ZW50IEVsZW1lbnQgYXQgdGhlIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgZW5kLiBTZWUgdGhlIFZhcmlhYmlsaXR5IFR5cGUgZW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaXRpb25zIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHZhcmlhYmlsaXR5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHJlcXVpcmVkPSJ0cnVlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZhcmlhYmlsaXR5RWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gVmFyaWFiaWxpdHlFbGVtZW50CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9WYXJpYWJpbGl0eVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmMDdlMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFZhcmlhYmlsaXR5IFR5cGUgaXMgYW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBWYXJpYWJpbGl0eVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5BKDAsICJuYSIsICJuYSIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ09OVFJJQlVURVMoMSwgImNvbnRyaWJ1dGVzIiwgImNvbnRyaWJ1dGVzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhURU5EUygyLCAiZXh0ZW5kcyIsICJleHRlbmRzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlSRVBMQUNFUygzLCAicmVwbGFjZXMiLCAicmVwbGFjZXMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfQ09OVFJJQlVUSU9OKDQsICJsb2NhbENvbnRyaWJ1dGlvbiIsICJsb2NhbENvbnRyaWJ1dGlvbiIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfUkVQTEFDRU1FTlQoNSwgImxvY2FsUmVwbGFjZW1lbnQiLCAibG9jYWxSZXBsYWNlbWVudCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHMgUmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19SRVBMQUNFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYVEVORFNfUkVQTEFDRVMoNiwgImV4dGVuZHNSZXBsYWNlcyIsICJleHRlbmRzUmVwbGFjZXMiKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgIm5vdCBhc3NpZ25lZCIgdmFsdWUgb2YgYSBWYXJpYWJpbGxpdHkgRWxlbWVudCdzIHZhcmlhYmlsaXR5VHlwZSBhdHRyaWJ1dGUgd2hpY2ggaXMgc2V0IGluIHRoZSBjYXNlIG5vIHZhcmlhYmlsaXR5IGFzc29jaWF0aW9uIGlzIHByZXNlbnQgYmV0d2VlbiB0aGUgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgb3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudHMuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI05BCi0JICogQG1vZGVsIG5hbWU9Im5hIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29udHJpYnV0ZXMgcHJvdmlkZXMgYSB3YXkgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50cyB0byBjb250cmlidXRlIHRoZWlyIHByb3BlcnRpZXMgaW50byB0aGVpciBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBhbHRlcmluZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMsIGkuZS4gaW4gYW4gYWRkaXRpdmUgZmFzaGlvbi4gIFByb3BlcnRpZXMgY29udHJpYnV0ZWQgYXJlOiBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgZWZmZWN0IGFmdGVyIGludGVycHJldGF0aW9uIG9mIGNvbnRyaWJ1dGlvbiBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgbG9naWNhbGx5IHJlcGxhY2VkIHdpdGggYW4gYXVnbWVudGVkIHZhcmlhbnQgb2YgdGhlIGVsZW1lbnQgdGhhdCBjb21iaW5lcyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuICBUaGUgd2F5IHRoaXMgY29tYmluYXRpb24gaXMgcmVhbGl6ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uLiAgRm9yIGV4YW1wbGUsIFN0cmluZyBhdHRyaWJ1dGVzIGFyZSBjb25jYXRlbmF0ZWQgcmVzb2x2aW5nIGVtYmVkZGVkIGNvbW1hbmRzIGZvciBkZXBlbmRlbnQgdGV4dCBvciBtZXJnaW5nIHRleHQgZnJhZ21lbnRzIChlLmcuIGRlc2NyaXB0aW9ucyBmb3IgY29udGVudCBlbGVtZW50cykuICBBZGRpdGlvbmFsIGVsZW1lbnRzIGluIHRvLW1hbnkgYXNzb2NpYXRpb25zIGFyZSBhZGRlZCAoZS5nLiBhZGRpdGlvbmFsIEd1aWRhbmNlIGVsZW1lbnRzIG9yIFRhc2sgRGVzY3JpcHRvcnMgb2YgYW4gQWN0aXZpdHkpLiAgRGlmZmVyZW50IGVsZW1lbnRzIGluIHRvLW9uZSBhc3NvY2lhdGlvbnMgYXJlIGlnbm9yZWQgKGUuZy4gdGhlIG9uZSBQcmltYXJ5IFBlcmZvcm1lciBvZiBhIFRhc2spLiAgTXVsdGlwbGUgQ29udGVudCBFbGVtZW50cyBjYW4gY29udHJpYnV0ZSB0byB0aGUgc2FtZSBiYXNlIGVsZW1lbnQgYW5kIGFsbCBvZiB0aGVzZSBjb250cmlidXRpb25zIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIHRoZSBiYXNlIGluIHRoZSBzYW1lIGZhc2hpb24uIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci0JICogYXR0cmlidXRlIHZhbHVlczoJU3RyaW5nIHZhbHVlcyBmcm9tIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQgYXJlIGNvbmNhdGVuYXRlZCB3aXRoIHZhbHVlcyBmcm9tIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LiAgT3RoZXIgdmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBvZiBhbnkgb3RoZXIgdHlwZSBzdWNoIGFzIEludGVnZXIsIERhdGUgYXJlIGlnbm9yZWQuCi0JICogVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLQkgKiAwLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBrZXB0IGFuZCBhbnkgYXNzb2NpYXRpb24gZnJvbSB0aGUgY29udHJpYnV0aW5nIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBpZ25vcmVkLgotCSAqIDAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgYWRkZWQgdG8gdGhlIGFscmVhZHkgZXhpc3RpbmcgYXNzb2NpYXRpb24gaW5zdGFuY2VzIG9mIHRoZSBiYXNlZC1vbiBlbGVtZW50LiAgSWYgYm90aCBWYXJpYWJpbGl0eSBFbGVtZW50cyByZWZlciB0byB0aGUgc2FtZSBvYmplY3QgdGhlbiBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGUgYXNzb2NpYXRpb24gd2lsbCByZW1haW4uCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTCi0JICogQG1vZGVsIG5hbWU9ImNvbnRyaWJ1dGVzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVEVTX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFeHRlbnNpb24gYWxsb3dzIE1ldGhvZCBQbHVnaW5zIHRvIGVhc2lseSByZXVzZSBlbGVtZW50cyBmcm9tIGEgQmFzZSBQbHVnaW4gYnkgcHJvdmlkaW5nIGEga2luZCBvZiBpbmhlcml0YW5jZSBmb3IgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIEF0dHJpYnV0ZSB2YWx1ZXMgYW5kIEFzc29jaWF0aW9uIGluc3RhbmNlcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgdG8gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudC4gIFRoZSByZXN1bHQgb2YgaW50ZXJwcmV0YXRpb24gaXMgdGhhdCB0aGUgc3BlY2lhbCBlbGVtZW50IGhhcyB0aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIHRoZSBiYXNlZC1vbiBoYXMsIGJ1dCBtaWdodCBkZWZpbmUgaXRzIG93biBhZGRpdGlvbnMuICBIZW5jZSBleHRlbmRzIGlzIG5vdCB1c2VkIHRvIG1vZGlmeSBjb250ZW50IG9mIHRoZSBiYXNlIFBsdWdpbiwgYnV0IHRvIHByb3ZpZGUgdGhlIGFiaWxpdHkgZm9yIHRoZSBleHRlbmRpbmcgUGx1Z2luIHRvIGRlZmluZSBpdHMgb3duIGNvbnRlbnQgd2hpY2ggaXMgYSB2YXJpYW50IG9mIGNvbnRlbnQgYWxyZWFkeSBkZWZpbmVkIChlLmcuIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIGEgZ2VuZXJpYyBSZXZpZXcgUmVjb3JkIGZvciBhIHNwZWNpZmljIHR5cGUgb2YgcmV2aWV3KS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIGFueSBudW1iZXIgb2YgZXh0ZW5kaW5nIFZhcmlhYmlsaXR5IEVsZW1lbnRzIGNhbiBiZSB1c2VkIHNpZGUgYnkgc2lkZSwgYnV0IHJlZmVyIHRvIGVhY2ggb3RoZXIgdmlhIHRoZSBleHRlbmRzIHJlbGF0aW9uc2hpcC4gIEV4dGVuZHMgYWxzbyBwcm92aWRlcyB0aGUga2V5IG1lY2hhbmlzbSBmb3IgYmluZGluZyBDYXBhYmlsaXR5IFBhdHRlcm5zIHRvIFByb2Nlc3NlczogQSBwYXR0ZXJuIGlzIGFwcGxpZWQgYnkgZGVmaW5pbmcgYW4gZXh0ZW5kcyByZWxhdGlvbnNoaXBzIGZyb20gYW4gQWN0aXZpdHkgb2YgdGhlIGFwcGx5aW5nIFByb2Nlc3NlcyB0byB0aGUgUGF0dGVybi4gIFRoZSBBY3Rpdml0eSBpbmhlcml0cyBhc3NvY2lhdGlvbnMgaW5zdGFuY2VzIGZyb20gdGhlIHBhdHRlcm4gYW5kIHRoZSBwYXR0ZXJuIGFwcGVhcnMgdG8gYmUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIFByb2Nlc3MgYWZ0ZXIgSW50ZXJwcmV0YXRpb24uCi0JICogYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IGVsZW1lbnQgYXJlIGluaGVyaXRlZCBhbmQgdXNlZCB0byBwb3B1bGF0ZSB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50cyBhdHRyaWJ1dGVzLiAgSWYgdGhlIHNwZWNpYWwgZWxlbWVudCBhdHRyaWJ1dGVzIGFyZSBhbHJlYWR5IHBvcHVsYXRlZCB0aGUgaW5oZXJpdGVkIHZhbHVlcyBhcmUgaWdub3JlZC4gIAotCSAqIFRoZSBpZGVudGlmeWluZyBhdHRyaWJ1dGVzIGd1aWQgYW5kIG5hbWUgb2YgTWV0aG9kIEVsZW1lbnQgYXJlIGV4ZW1wdCBmcm9tIHRoaXMgcnVsZSBhbmQgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi0JICogMC4uMS1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CVRoZSBvbmUgYXNzb2NpYXRpb24gaW5zdGFuY2Ugb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBJZiB0aGUgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50IGRlZmluZXMgaXRzIG93biBhc3NvY2lhdGlvbiBpbnN0YW5jZSB0aGVuIHRoZSBpbmhlcml0ZWQgb25lIGlzIGlnbm9yZWQuCi0JICogMC4ubi1hc3NvY2lhdGlvbiBpbnN0YW5jZXM6CUFzc29jaWF0aW9uIGluc3RhbmNlcyBkZWZpbmVkIGZvciB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgaW5oZXJpdGVkIHRvIHRoZSBzcGVjaWFsIFZhcmlhYmlsaXR5IEVsZW1lbnQuICBUaGUgc3BlY2lhbCBlbGVtZW50IGNhbiBhZGQgYWRkaXRpb25hbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMuCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0VYVEVORFMKLQkgKiBAbW9kZWwgbmFtZT0iZXh0ZW5kcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRTX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUmVwbGFjZXMgcHJvdmlkZXMgYSB3YXkgZm9yIFZhcmlhYmlsaXR5IEVsZW1lbnRzIHRvIHJlcGxhY2UgYSBiYXNlIFZhcmlhYmlsaXR5IEVsZW1lbnQgd2l0aG91dCBkaXJlY3RseSBjaGFuZ2luZyBhbnkgb2YgaXRzIGV4aXN0aW5nIHByb3BlcnRpZXMuICBUaGlzIGlzIGluIG1vc3QgY2FzZXMgdXNlZCBmb3IgTWV0aG9kIFBsdWdpbnMgdGhhdCBhaW0gdG8gcmVwbGFjZSBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2ssIG9yIEFjdGl2aXRpZXMgd2l0aCBlaXRoZXIgYSBjb21wbGV0ZSBuZXcgdmFyaWFudCBvciB0byBjaGFuZ2UgZnVuZGFtZW50YWwgcmVsYXRpb25zaGlwcyBvZiB0aGVzZSBlbGVtZW50cyAoZS5nLiBSb2xlLUFydGlmYWN0IHJlc3BvbnNpYmlsaXR5KS4gIFByb3BlcnRpZXMgcmVwbGFjZWQgYXJlIGF0dHJpYnV0ZSB2YWx1ZXMgYW5kIGFzc29jaWF0aW9uIGluc3RhbmNlcy4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IHRoZSBiYXNlIENvbnRlbnQgRWxlbWVudCBpcyBsb2dpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGlzIG5ldyB2YXJpYW50IG9mIHRoZSBlbGVtZW50IHRvIHdoaWNoIGFsbCBpbmNvbWluZyBhc3NvY2lhdGlvbnMgc3RpbGwgcG9pbnQgYXMgYmVmb3JlLCBidXQgd2hpY2ggaGFzIHBvdGVudGlhbGx5IG5ldyBhdHRyaWJ1dGUgdmFsdWVzIGFuZCBvdXRnb2luZyBhc3NvY2lhdGlvbiBwcm9wZXJ0aWVzLiAgVGhpcyBwcm92aWRlcyBhIHZlcnkgcG93ZXJmdWwgbWVjaGFuaXNtIHRvIHJlcGxhY2UsIGZvciBleGFtcGxlLCB3aG9sZSBBY3Rpdml0aWVzIGluIGEgUHJvY2VzcyB3aXRoIGNvbXBsZXRlIG5ldyByZWFsaXphdGlvbnMgb2YgdGhlIEFjdGl2aXR5LiAgRm9yIGluc3RhbmNlLCByZXBsYWNpbmcgYW4gQWN0aXZpdHkgZG9pbmcgdXNlIGNhc2UtYmFzZWQgZGVzaWduIHdpdGggYW4gYWN0aXZpdHkgZG9pbmcgYWdpbGUgY29kZS1jZW50cmljIGRldmVsb3BtZW50IGRvaW5nIHRoZSBzYW1lIHdvcmsgdXNpbmcgYSBkaWZmZXJlbnQgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIHV0aWxpemluZyBkaWZmZXJlbnQgUm9sZXMsIFRhc2tzLCBldGMuICBBbm90aGVyIGV4YW1wbGUsIHdvdWxkIGJlIHRvIHJlcGxhY2UgYW4gQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgZGF0YWJhc2UgZGVzaWduIGZvciBhbiBSREJNUyB3aXRoIGFuIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGRhdGFiYXNlIGRlc2lnbiBmb3IgYW4gT09EQk1TLiAgQSBWYXJpYWJpbGl0eSBFbGVtZW50IGNhbiBvbmx5IGJlIHJlcGxhY2VkIGJ5IG9uZSBvdGhlciBlbGVtZW50IGF0IGEgdGltZS4gIEZvciBleGFtcGxlLCBpZiB0d28gTWV0aG9kIFBsdWdpbnMgcmVwbGFjZSB0aGUgc2FtZSBlbGVtZW50IG9ubHkgb25lIE1ldGhvZCBQbHVnaW4gY2FuIGJlIHVzZWQgZm9yIGludGVycHJldGF0aW9uIChzZWUgY29uY2VwdCBvZiBNZXRob2QgQ29uZmlndXJhdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byByZXNvbHZlIHN1Y2ggY29uZmxpY3RzLCBTZWN0aW9uIDcuMS4yKS4gIFRoZSBmb2xsb3dpbmcgdGFibGUgcHJvdmlkZXMgdGhlIGRldGFpbGVkIGxpc3Qgb2YgaW50ZXJwcmV0YXRpb24gcnVsZXM6Ci0JICogYXR0cmlidXRlIHZhbHVlczoJVmFsdWVzIGZyb20gdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBhcmUgcmVwbGFjZWQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpbmNsdWRpbmcgdW5hc3NpZ25lZCB2YWx1ZXMuCi0JICogVGhlIGlkZW50aWZ5aW5nIGF0dHJpYnV0ZXMgZ3VpZCBhbmQgbmFtZSBvZiBNZXRob2QgRWxlbWVudCBhcmUgZXhlbXB0IGZyb20gdGhpcyBydWxlIGFuZCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLQkgKiAwLi4xLWFzc29jaWF0aW9uIGluc3RhbmNlczoJVGhlIG9uZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBhc3NvY2lhdGlvbiBpbnN0YW5jZSBmcm9tIHRoZSByZXBsYWNpbmcgc3BlY2lhbCBWYXJpYWJpbGl0eSBFbGVtZW50LiAgSWYgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uIGluc3RhbmNlIHRoZW4gcmVzdWx0aW5nIGVsZW1lbnQgd2lsbCBhbHNvIG5vdCBoYXZlIGFuIGFzc29jaWF0aW9uLgotCSAqIDAuLm4tYXNzb2NpYXRpb24gaW5zdGFuY2VzOglBc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIHNwZWNpYWwgVmFyaWFiaWxpdHkgRWxlbWVudCByZXBsYWNlIGFsbCBhc3NvY2lhdGlvbiBpbnN0YW5jZXMgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQuCi0JICogCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9InJlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VTX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTgotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9DT05UUklCVVRJT05fVkFMVUUgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUUgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFID0gNjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGVbXSBWQUxVRVNfQVJSQVkgPSBuZXcgVmFyaWFiaWxpdHlUeXBlW10gewotCQkJTkEsIENPTlRSSUJVVEVTLCBFWFRFTkRTLCBSRVBMQUNFUywgTE9DQUxfQ09OVFJJQlVUSU9OLAotCQkJTE9DQUxfUkVQTEFDRU1FTlQsIEVYVEVORFNfUkVQTEFDRVMsIH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFZhcmlhYmlsaXR5VHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMKLQkJCS51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQljYXNlIE5BX1ZBTFVFOgotCQkJcmV0dXJuIE5BOwotCQljYXNlIENPTlRSSUJVVEVTX1ZBTFVFOgotCQkJcmV0dXJuIENPTlRSSUJVVEVTOwotCQljYXNlIEVYVEVORFNfVkFMVUU6Ci0JCQlyZXR1cm4gRVhURU5EUzsKLQkJY2FzZSBSRVBMQUNFU19WQUxVRToKLQkJCXJldHVybiBSRVBMQUNFUzsKLQkJY2FzZSBMT0NBTF9DT05UUklCVVRJT05fVkFMVUU6Ci0JCQlyZXR1cm4gTE9DQUxfQ09OVFJJQlVUSU9OOwotCQljYXNlIExPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFOgotCQkJcmV0dXJuIExPQ0FMX1JFUExBQ0VNRU5UOwotCQljYXNlIEVYVEVORFNfUkVQTEFDRVNfVkFMVUU6Ci0JCQlyZXR1cm4gRVhURU5EU19SRVBMQUNFUzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9XaGl0ZXBhcGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1doaXRlcGFwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlNmQyOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1doaXRlcGFwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXaGl0ZXBhcGVycyBhcmUgYSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V2hpdGVwYXBlcigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXaGl0ZXBhcGVyIGV4dGVuZHMgQ29uY2VwdCB7Ci19IC8vIFdoaXRlcGFwZXIKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0ZTFiOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtCcmVha2Rvd25FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGlzIGEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLSAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrQnJlYWtkb3duRWxlbWVudCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuQm9vbGVhbiIgcmVxdWlyZWQ9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldElzUmVwZWF0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlcGVhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldElzUmVwZWF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElzT25nb2luZyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldElzT25nb2luZyA8ZW0+SXMgT25nb2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT25nb2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09uZ29pbmcoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iZmFsc2UiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiAKLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpCi0JICogQG1vZGVsIGRlZmF1bHQ9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5Cb29sZWFuIiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0SXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRJc0V2ZW50RHJpdmVuIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFdmVudERyaXZlbihCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MaW5rIFRvIFByZWRlY2Vzc29yPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtPcmRlcj4gZ2V0TGlua1RvUHJlZGVjZXNzb3IoKTsKLQotfSAvLyBXb3JrQnJlYWtkb3duRWxlbWVudApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTMwOTFlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgRGVmaW5pdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgRGVmaW5pdGlvbiBpcyBhbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotICogV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotICogCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0RlZmluaXRpb24oKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtEZWZpbml0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9InRydWUiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IHZhbHVlKTsKLQotfSAvLyBXb3JrRGVmaW5pdGlvbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZGY0YmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIE9yZGVyIGlzIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLSAqIChOb3RlLCBXb3JrIE9yZGVyIGlzIG5vdCBtb2RlbGVkIGFzIGFuIEFzc29jaWF0aW9uIENsYXNzIHRvIHByb3ZpZGUgYSBzdHJhaWdodGZvcndhcmQgbWFwcGluZyAgdG8gWE1JIGFuZCBFTUYuKQotICogVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQgPGVtPlByZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXIoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya09yZGVyIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmaW5pc2hUb1N0YXJ0IjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MaW5rIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfTGlua1R5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmaW5pc2hUb1N0YXJ0IiByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtPcmRlclR5cGUgZ2V0TGlua1R5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNnZXRMaW5rVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkPC9iPjwvZW0+JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVkPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZWQoV29ya0JyZWFrZG93bkVsZW1lbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX1ByZWQoKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtCcmVha2Rvd25FbGVtZW50IGdldFByZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyI2dldFByZWQgPGVtPlByZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWQ8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWQoV29ya0JyZWFrZG93bkVsZW1lbnQgdmFsdWUpOwotCi19IC8vIFdvcmtPcmRlcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmNTMxMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtPcmRlclR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgT3JkZXIgcmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChCKSBiZWxvdykgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgKHJlZmVycmVkIHRvIGFzIChBKSBiZWxvdykgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlclR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFdvcmtPcmRlclR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRklOSVNIX1RPX1NUQVJUKDAsICJmaW5pc2hUb1N0YXJ0IiwgImZpbmlzaFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0hfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGSU5JU0hfVE9fRklOSVNIKDEsICJmaW5pc2hUb0ZpbmlzaCIsICJmaW5pc2hUb0ZpbmlzaCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fU1RBUlQoMiwgInN0YXJ0VG9TdGFydCIsICJzdGFydFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fRklOSVNIX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fRklOSVNIKDMsICJzdGFydFRvRmluaXNoIiwgInN0YXJ0VG9GaW5pc2giKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBCcmVha2Rvd24gRWxlbWVudCAoQikgY2Fubm90IHN0YXJ0IHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICJDb25zdHJ1Y3QgZmVuY2UiIGFuZCAiUGFpbnQgZmVuY2UsIiAiUGFpbnQgZmVuY2UiIGNhbid0IHN0YXJ0IHVudGlsICJDb25zdHJ1Y3QgZmVuY2UiIGZpbmlzaGVzLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiB0eXBlIG9mIGRlcGVuZGVuY3kgYW5kIHRoZSBkZWZhdWx0IGZvciBhIG5ldyBXb3JrIE9yZGVyIGluc3RhbmNlLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfVE9fU1RBUlRfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBmaW5pc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICJBZGQgd2lyaW5nIiBhbmQgIkluc3BlY3QgZWxlY3RyaWNhbCwiICJJbnNwZWN0IGVsZWN0cmljYWwiIGNhbid0IGZpbmlzaCB1bnRpbCAiQWRkIHdpcmluZyIgZmluaXNoZXMuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0gKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9GaW5pc2giCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklOSVNIX1RPX0ZJTklTSF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3Qgc3RhcnQgdW50aWwgQnJlYWtkb3duIEVsZW1lbnQgKEEpIHN0YXJ0cy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHR3byBCcmVha2Rvd24gRWxlbWVudHMsICJQb3VyIGZvdW5kYXRpb24iIGFuZCAiTGV2ZWwgY29uY3JldGUsIiAiTGV2ZWwgY29uY3JldGUiIGNhbid0IGJlZ2luIHVudGlsICJQb3VyIGZvdW5kYXRpb24iIGJlZ2lucy4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb1N0YXJ0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX1NUQVJUX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEJyZWFrZG93biBFbGVtZW50IChCKSBjYW5ub3QgZmluaXNoIHVudGlsIEJyZWFrZG93biBFbGVtZW50IChBKSBzdGFydHMuIFRoaXMgZGVwZW5kZW5jeSB0eXBlIGNhbiBiZSB1c2VkIGZvciBqdXN0LWluLXRpbWUgc2NoZWR1bGluZyB1cCB0byBhIG1pbGVzdG9uZSBvciB0aGUgcHJvamVjdCBmaW5pc2ggZGF0ZSB0byBtaW5pbWl6ZSB0aGUgcmlzayBvZiBhIEJyZWFrZG93biBFbGVtZW50IGZpbmlzaGluZyBsYXRlIGlmIGl0cyBkZXBlbmRlbnQgQnJlYWtkb3duIEVsZW1lbnRzIHNsaXAuIElmIGEgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoZSBtaWxlc3RvbmUgb3IgcHJvamVjdCBmaW5pc2ggZGF0ZSwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGV4YWN0bHkgd2hlbiBhbmQgeW91IGRvbid0IHdhbnQgYSBsYXRlIGZpbmlzaCB0byBhZmZlY3QgdGhlIGp1c3QtaW4tdGltZSBCcmVha2Rvd24gRWxlbWVudCwgeW91IGNhbiBjcmVhdGUgYW4gU0YgZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBCcmVha2Rvd24gRWxlbWVudCB5b3Ugd2FudCBzY2hlZHVsZWQganVzdCBpbiB0aW1lICh0aGUgcHJlZGVjZXNzb3IpIGFuZCBpdHMgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudCAodGhlIHN1Y2Nlc3NvcikuIFRoZW4gaWYgeW91IHVwZGF0ZSBwcm9ncmVzcyBvbiB0aGUgc3VjY2Vzc29yIEJyZWFrZG93biBFbGVtZW50LCBpdCB3b24ndCBhZmZlY3QgdGhlIHNjaGVkdWxlZCBkYXRlcyBvZiB0aGUgcHJlZGVjZXNzb3IgQnJlYWtkb3duIEVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX0ZJTklTSAotCSAqIEBtb2RlbCBuYW1lPSJzdGFydFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RPX0ZJTklTSF9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBXb3JrT3JkZXJUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IFdvcmtPcmRlclR5cGVbXSB7Ci0JCQlGSU5JU0hfVE9fU1RBUlQsIEZJTklTSF9UT19GSU5JU0gsIFNUQVJUX1RPX1NUQVJULCBTVEFSVF9UT19GSU5JU0gsIH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8V29ya09yZGVyVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMKLQkJCS51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdvcmtPcmRlclR5cGUgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCWNhc2UgRklOSVNIX1RPX1NUQVJUX1ZBTFVFOgotCQkJcmV0dXJuIEZJTklTSF9UT19TVEFSVDsKLQkJY2FzZSBGSU5JU0hfVE9fRklOSVNIX1ZBTFVFOgotCQkJcmV0dXJuIEZJTklTSF9UT19GSU5JU0g7Ci0JCWNhc2UgU1RBUlRfVE9fU1RBUlRfVkFMVUU6Ci0JCQlyZXR1cm4gU1RBUlRfVE9fU1RBUlQ7Ci0JCWNhc2UgU1RBUlRfVE9fRklOSVNIX1ZBTFVFOgotCQkJcmV0dXJuIFNUQVJUX1RPX0ZJTklTSDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgV29ya09yZGVyVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvV29ya1Byb2R1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4OGVlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBXb3JrIFByb2R1Y3QgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi0gKiBBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4KLSAqIAotICogVGhpcyBpcyB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZSdzIGV4dGVuc2lvbiBvZiBXb3JrIFByb2R1Y3QgKGRlZmluZWQgaW4gQ29udGVudCBFbGVtZW50cykgcHJvdmlkaW5nIGFkZGl0b25hbCBhc3NvY2lhdGlvbnMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlcyA8ZW0+VGVtcGxhdGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3JzIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3QoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3QgZXh0ZW5kcyBDb250ZW50RWxlbWVudCwgRnVsZmlsbGFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnRzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwb3J0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydHM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFJlcG9ydD4gZ2V0UmVwb3J0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcGxhdGVzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wbGF0ZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wbGF0ZXM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8VGVtcGxhdGU+IGdldFRlbXBsYXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3JzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvb2wgTWVudG9yczwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpCi0JICogQG1vZGVsIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotfSAvLyBXb3JrUHJvZHVjdApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiMDRkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hLlN0cmluZyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldEltcGFjdE9mTm90SGF2aW5nIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllMTFkNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUV4aXRTdGF0ZSA8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdHMgPGVtPkltcGFjdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0RGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotCSAqIEZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLQkgKiAKLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWEuU3RyaW5nIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFeGl0IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogR2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY3Rpdml0eUV4aXRTdGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYS5TdHJpbmciIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0V29ya1Byb2R1Y3QoV29ya1Byb2R1Y3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0IGdldFdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yfS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0ZWQgQnk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cwotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iaW1wYWN0cyIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3J9LgotCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkltcGFjdHM8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImltcGFjdGVkQnkiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+JyByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3REZXNjcmlwdG9yCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9Xb3JrUHJvZHVjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMwNzJhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFdvcmsgUHJvZHVjdCBUeXBlIGlzIGEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuCi0gKiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZSNnZXRXb3JrUHJvZHVjdHMgPGVtPldvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3RUeXBlIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3RzPC9iPjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3RzPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0czwvZW0+JyByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCkKLQkgKiBAbW9kZWwgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUxpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpOwotCi19IC8vIFdvcmtQcm9kdWN0VHlwZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0MDdjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsI2dldEhvd3RvU3RhZmYgPGVtPkhvd3RvIFN0YWZmPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgQWN0aXZpdHlEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVycG9zZSA9IFBVUlBPU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx0ZXJuYXRpdmVzKCkgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx0ZXJuYXRpdmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTFRFUk5BVElWRVNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93dG9TdGFmZigpIDxlbT5Ib3d0byBTdGFmZjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG93dG9TdGFmZigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9XVE9fU1RBRkZfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvd3RvU3RhZmYoKSA8ZW0+SG93dG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd3RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaG93dG9TdGFmZiA9IEhPV1RPX1NUQUZGX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1cnBvc2UoKSB7Ci0JCXJldHVybiBwdXJwb3NlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1cnBvc2UoU3RyaW5nIG5ld1B1cnBvc2UpIHsKLQkJU3RyaW5nIG9sZFB1cnBvc2UgPSBwdXJwb3NlOwotCQlwdXJwb3NlID0gbmV3UHVycG9zZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwKLQkJCQkJcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTLAotCQkJCQlvbGRBbHRlcm5hdGl2ZXMsIGFsdGVybmF0aXZlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG93dG9TdGFmZigpIHsKLQkJcmV0dXJuIGhvd3RvU3RhZmY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SG93dG9TdGFmZihTdHJpbmcgbmV3SG93dG9TdGFmZikgewotCQlTdHJpbmcgb2xkSG93dG9TdGFmZiA9IGhvd3RvU3RhZmY7Ci0JCWhvd3RvU3RhZmYgPSBuZXdIb3d0b1N0YWZmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRiwKLQkJCQkJb2xkSG93dG9TdGFmZiwgaG93dG9TdGFmZikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlyZXR1cm4gZ2V0SG93dG9TdGFmZigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlzZXRIb3d0b1N0YWZmKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJc2V0QWx0ZXJuYXRpdmVzKEFMVEVSTkFUSVZFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XVE9fU1RBRkY6Ci0JCQlzZXRIb3d0b1N0YWZmKEhPV1RPX1NUQUZGX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsCi0JCQkJCTogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXJldHVybiBBTFRFUk5BVElWRVNfRURFRkFVTFQgPT0gbnVsbCA/IGFsdGVybmF0aXZlcyAhPSBudWxsCi0JCQkJCTogIUFMVEVSTkFUSVZFU19FREVGQVVMVC5lcXVhbHMoYWx0ZXJuYXRpdmVzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRjoKLQkJCXJldHVybiBIT1dUT19TVEFGRl9FREVGQVVMVCA9PSBudWxsID8gaG93dG9TdGFmZiAhPSBudWxsCi0JCQkJCTogIUhPV1RPX1NUQUZGX0VERUZBVUxULmVxdWFscyhob3d0b1N0YWZmKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwdXJwb3NlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsdGVybmF0aXZlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvd3RvU3RhZmY6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaG93dG9TdGFmZik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTgyOGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWN0aXZpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudHMgPGVtPkJyZWFrZG93biBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRSb2FkbWFwcyA8ZW0+Um9hZG1hcHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxscygpIDxlbT5GdWxmaWxsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdWxmaWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsZmlsbHM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwcmVjb25kaXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHBvc3Rjb25kaXRpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmVha2Rvd25FbGVtZW50cygpIDxlbT5CcmVha2Rvd24gRWxlbWVudHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxCcmVha2Rvd25FbGVtZW50PiBicmVha2Rvd25FbGVtZW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvYWRtYXBzKCkgPGVtPlJvYWRtYXBzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvYWRtYXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9hZG1hcD4gcm9hZG1hcHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGdldEZ1bGZpbGxzKCkgewotCQlpZiAoZnVsZmlsbHMgPT0gbnVsbCkgewotCQkJZnVsZmlsbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4oCi0JCQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFMpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLAotCQkJCQl2YXJpYWJpbGl0eVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQkJaWYgKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJCQlvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LAotCQkJCQkJCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlFbGVtZW50IGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCXByZWNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWNvbmRpdGlvbik7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG9sZFByZWNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByZWNvbmRpdGlvbgotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLAotCQkJCQkJCXByZWNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlY29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UHJlY29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVjb25kaXRpb24obmV3UHJlY29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG51bGwsCi0JCQkJCQkJbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sCi0JCQkJCQkJb2xkUG9zdGNvbmRpdGlvbiwgcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bvc3Rjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTiwgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnRzKCkgewotCQlpZiAoYnJlYWtkb3duRWxlbWVudHMgPT0gbnVsbCkgewotCQkJYnJlYWtkb3duRWxlbWVudHMgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8QnJlYWtkb3duRWxlbWVudD4oCi0JCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUyk7Ci0JCX0KLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvYWRtYXA+IGdldFJvYWRtYXBzKCkgewotCQlpZiAocm9hZG1hcHMgPT0gbnVsbCkgewotCQkJcm9hZG1hcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvYWRtYXA+KFJvYWRtYXAuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTKTsKLQkJfQotCQlyZXR1cm4gcm9hZG1hcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRCcmVha2Rvd25FbGVtZW50cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRCcmVha2Rvd25FbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJcmV0dXJuIGdldFJvYWRtYXBzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCWdldEZ1bGZpbGxzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRnVsZmlsbGFibGVFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQlzZXRQcmVjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCWdldFJvYWRtYXBzKCkuY2xlYXIoKTsKLQkJCWdldFJvYWRtYXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2FkbWFwPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UUzoKLQkJCWdldEJyZWFrZG93bkVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQUzoKLQkJCWdldFJvYWRtYXBzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0ZVTEZJTExTOgotCQkJcmV0dXJuIGZ1bGZpbGxzICE9IG51bGwgJiYgIWZ1bGZpbGxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIHBvc3Rjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFM6Ci0JCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudHMgIT0gbnVsbCAmJiAhYnJlYWtkb3duRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVBTOgotCQkJcmV0dXJuIHJvYWRtYXBzICE9IG51bGwgJiYgIXJvYWRtYXBzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0ZVTEZJTExTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFdvcmtEZWZpbml0aW9uLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhcmlhYmlsaXR5VHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YXJpYWJpbGl0eVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiODNjMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCNnZXRJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIGV4dGVuZHMgQ2xhc3NpZmllckltcGwgaW1wbGVtZW50cwotCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkgPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1ByaW1hcnlFeHRlbnNpb24oKSA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNQcmltYXJ5RXh0ZW5zaW9uID0gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBpc1ByaW1hcnlFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKEJvb2xlYW4gbmV3SXNQcmltYXJ5RXh0ZW5zaW9uKSB7Ci0JCUJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uID0gaXNQcmltYXJ5RXh0ZW5zaW9uOwotCQlpc1ByaW1hcnlFeHRlbnNpb24gPSBuZXdJc1ByaW1hcnlFeHRlbnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQl0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiwKLQkJCQkJb2xkSXNQcmltYXJ5RXh0ZW5zaW9uLCBpc1ByaW1hcnlFeHRlbnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQlyZXR1cm4gZ2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbigoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbihJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCXJldHVybiBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVCA9PSBudWxsID8gaXNQcmltYXJ5RXh0ZW5zaW9uICE9IG51bGwKLQkJCQkJOiAhSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQuZXF1YWxzKGlzUHJpbWFyeUV4dGVuc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNQcmltYXJ5RXh0ZW5zaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzUHJpbWFyeUV4dGVuc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlNjkzNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBBcnRpZmFjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9PVVRMSU5FX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZk91dGxpbmUoKSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZPdXRsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmT3V0bGluZSA9IEJSSUVGX09VVExJTkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uKCkgPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb24oKSA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uID0gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90YXRpb24oKSA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RhdGlvbigpIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb24gPSBOT1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiBicmllZk91dGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyBuZXdCcmllZk91dGxpbmUpIHsKLQkJU3RyaW5nIG9sZEJyaWVmT3V0bGluZSA9IGJyaWVmT3V0bGluZTsKLQkJYnJpZWZPdXRsaW5lID0gbmV3QnJpZWZPdXRsaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLAotCQkJCQlvbGRCcmllZk91dGxpbmUsIGJyaWVmT3V0bGluZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb25PcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgbmV3UmVwcmVzZW50YXRpb25PcHRpb25zKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPSByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JCXJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IG5ld1JlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywKLQkJCQkJb2xkUmVwcmVzZW50YXRpb25PcHRpb25zLCByZXByZXNlbnRhdGlvbk9wdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIG5ld1JlcHJlc2VudGF0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbiA9IHJlcHJlc2VudGF0aW9uOwotCQlyZXByZXNlbnRhdGlvbiA9IG5ld1JlcHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiwKLQkJCQkJb2xkUmVwcmVzZW50YXRpb24sIHJlcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uKFN0cmluZyBuZXdOb3RhdGlvbikgewotCQlTdHJpbmcgb2xkTm90YXRpb24gPSBub3RhdGlvbjsKLQkJbm90YXRpb24gPSBuZXdOb3RhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04sIG9sZE5vdGF0aW9uLAotCQkJCQlub3RhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FOgotCQkJcmV0dXJuIGdldEJyaWVmT3V0bGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXJldHVybiBnZXROb3RhdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCXNldEJyaWVmT3V0bGluZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlzZXRSZXByZXNlbnRhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQlzZXROb3RhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlzZXRCcmllZk91dGxpbmUoQlJJRUZfT1VUTElORV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCXNldFJlcHJlc2VudGF0aW9uKFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXNldE5vdGF0aW9uKE5PVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkU6Ci0JCQlyZXR1cm4gQlJJRUZfT1VUTElORV9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZPdXRsaW5lICE9IG51bGwKLQkJCQkJOiAhQlJJRUZfT1VUTElORV9FREVGQVVMVC5lcXVhbHMoYnJpZWZPdXRsaW5lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJcmV0dXJuIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uT3B0aW9ucyAhPSBudWxsCi0JCQkJCTogIVJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKHJlcHJlc2VudGF0aW9uT3B0aW9ucyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlcHJlc2VudGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUkVQUkVTRU5UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJlcHJlc2VudGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTjoKLQkJCXJldHVybiBOT1RBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbm90YXRpb24gIT0gbnVsbAotCQkJCQk6ICFOT1RBVElPTl9FREVGQVVMVC5lcXVhbHMobm90YXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGJyaWVmT3V0bGluZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChicmllZk91dGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uT3B0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyZXByZXNlbnRhdGlvbk9wdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlcHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub3RhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChub3RhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjcyNTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0FydGlmYWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5BcnRpZmFjdEltcGwjZ2V0Q29udGFpbmVyQXJ0aWZhY3QgPGVtPkNvbnRhaW5lciBBcnRpZmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkFydGlmYWN0SW1wbCNnZXRDb250YWluZWRBcnRpZmFjdHMgPGVtPkNvbnRhaW5lZCBBcnRpZmFjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBBcnRpZmFjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWRBcnRpZmFjdHMoKSA8ZW0+Q29udGFpbmVkIEFydGlmYWN0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250YWluZWRBcnRpZmFjdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxBcnRpZmFjdD4gY29udGFpbmVkQXJ0aWZhY3RzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFydGlmYWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGdldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdCBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChBcnRpZmFjdCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyQXJ0aWZhY3QoCi0JCQlBcnRpZmFjdCBuZXdDb250YWluZXJBcnRpZmFjdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0NvbnRhaW5lckFydGlmYWN0LAotCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRhaW5lckFydGlmYWN0KEFydGlmYWN0IG5ld0NvbnRhaW5lckFydGlmYWN0KSB7Ci0JCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVCAmJiBuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIChFT2JqZWN0KSBuZXdDb250YWluZXJBcnRpZmFjdCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdDb250YWluZXJBcnRpZmFjdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyQXJ0aWZhY3QpLmVJbnZlcnNlQWRkKAotCQkJCQkJdGhpcywgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUywKLQkJCQkJCUFydGlmYWN0LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KG5ld0NvbnRhaW5lckFydGlmYWN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNULAotCQkJCQluZXdDb250YWluZXJBcnRpZmFjdCwgbmV3Q29udGFpbmVyQXJ0aWZhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxBcnRpZmFjdD4gZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlpZiAoY29udGFpbmVkQXJ0aWZhY3RzID09IG51bGwpIHsKLQkJCWNvbnRhaW5lZEFydGlmYWN0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxBcnRpZmFjdD4oCi0JCQkJCUFydGlmYWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTLAotCQkJCQlVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1QpOwotCQl9Ci0JCXJldHVybiBjb250YWluZWRBcnRpZmFjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lckFydGlmYWN0KChBcnRpZmFjdCkgb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDb250YWluZWRBcnRpZmFjdHMoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORVJfQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gYmFzaWNTZXRDb250YWluZXJBcnRpZmFjdChudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMsIEFydGlmYWN0LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb250YWluZXJBcnRpZmFjdCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyQXJ0aWZhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUUzoKLQkJCWdldENvbnRhaW5lZEFydGlmYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRDb250YWluZWRBcnRpZmFjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcnRpZmFjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUOgotCQkJc2V0Q29udGFpbmVyQXJ0aWZhY3QoKEFydGlmYWN0KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FUl9BUlRJRkFDVDoKLQkJCXJldHVybiBiYXNpY0dldENvbnRhaW5lckFydGlmYWN0KCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1RTOgotCQkJcmV0dXJuIGNvbnRhaW5lZEFydGlmYWN0cyAhPSBudWxsICYmICFjb250YWluZWRBcnRpZmFjdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9BcnRpZmFjdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI1YmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwjZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzYWdlR3VpZGFuY2UoKSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXNhZ2VHdWlkYW5jZSA9IFVTQUdFX0dVSURBTkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNhZ2VHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHVzYWdlR3VpZGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNhZ2VHdWlkYW5jZShTdHJpbmcgbmV3VXNhZ2VHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkVXNhZ2VHdWlkYW5jZSA9IHVzYWdlR3VpZGFuY2U7Ci0JCXVzYWdlR3VpZGFuY2UgPSBuZXdVc2FnZUd1aWRhbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSwKLQkJCQkJb2xkVXNhZ2VHdWlkYW5jZSwgdXNhZ2VHdWlkYW5jZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXJldHVybiBnZXRVc2FnZUd1aWRhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXNldFVzYWdlR3VpZGFuY2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCXNldFVzYWdlR3VpZGFuY2UoVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQlyZXR1cm4gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlR3VpZGFuY2UgIT0gbnVsbAotCQkJCQk6ICFVU0FHRV9HVUlEQU5DRV9FREVGQVVMVC5lcXVhbHModXNhZ2VHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodXNhZ2VHdWlkYW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1c2FnZUd1aWRhbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNWFjNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cGVyQWN0aXZpdGllcyA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldENoZWNrbGlzdHMgPGVtPkNoZWNrbGlzdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRDb25jZXB0cyA8ZW0+Q29uY2VwdHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRFeGFtcGxlcyA8ZW0+RXhhbXBsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UmV1c2FibGVBc3NldHMgPGVtPlJldXNhYmxlIEFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRSZXBvcnRzIDxlbT5SZXBvcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRUb29sbWVudG9yIDxlbT5Ub29sbWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVmaXgoKSA8ZW0+UHJlZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZml4KCkgPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCA9IFBSRUZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1BsYW5uZWQoKSA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSVNfUExBTk5FRF9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUGxhbm5lZCgpIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1BsYW5uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUGxhbm5lZCA9IElTX1BMQU5ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBIQVNfTVVMVElQTEVfT0NDVVJSRU5DRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09QVElPTkFMX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzT3B0aW9uYWwoKSA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzT3B0aW9uYWwgPSBJU19PUFRJT05BTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEFmdGVyKCkgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCcmVha2Rvd25FbGVtZW50IHByZXNlbnRlZEFmdGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQmVmb3JlKCkgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJyZWFrZG93bkVsZW1lbnQgcHJlc2VudGVkQmVmb3JlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhbm5pbmdEYXRhKCkgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBlckFjdGl2aXRpZXMoKSA8ZW0+U3VwZXIgQWN0aXZpdGllczwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aXZpdHkgc3VwZXJBY3Rpdml0aWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hlY2tsaXN0cygpIDxlbT5DaGVja2xpc3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoZWNrbGlzdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDaGVja2xpc3Q+IGNoZWNrbGlzdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb25jZXB0cygpIDxlbT5Db25jZXB0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb25jZXB0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbmNlcHQ+IGNvbmNlcHRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhhbXBsZXMoKSA8ZW0+RXhhbXBsZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhhbXBsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFeGFtcGxlPiBleGFtcGxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWRlbGluZXMoKSA8ZW0+R3VpZGVsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkZWxpbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3VpZGVsaW5lPiBndWlkZWxpbmVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV1c2FibGVBc3NldHMoKSA8ZW0+UmV1c2FibGUgQXNzZXRzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldXNhYmxlQXNzZXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UmV1c2FibGVBc3NldD4gcmV1c2FibGVBc3NldHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCkgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IHN1cHBvcnRpbmdNYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wbGF0ZXMoKSA8ZW0+VGVtcGxhdGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRlbXBsYXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRlbXBsYXRlPiB0ZW1wbGF0ZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRzKCkgPGVtPlJlcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJlcG9ydD4gcmVwb3J0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpIDxlbT5Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sbWVudG9yKCkgPGVtPlRvb2xtZW50b3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbG1lbnRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xtZW50b3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0JCXByZWZpeCA9IG5ld1ByZWZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIGlzUGxhbm5lZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1BsYW5uZWQoQm9vbGVhbiBuZXdJc1BsYW5uZWQpIHsKLQkJQm9vbGVhbiBvbGRJc1BsYW5uZWQgPSBpc1BsYW5uZWQ7Ci0JCWlzUGxhbm5lZCA9IG5ld0lzUGxhbm5lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLAotCQkJCQlpc1BsYW5uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgewotCQlyZXR1cm4gaGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKEJvb2xlYW4gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlcykgewotCQlCb29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQloYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gbmV3SGFzTXVsdGlwbGVPY2N1cnJlbmNlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLAotCQkJCQlvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPcHRpb25hbChCb29sZWFuIG5ld0lzT3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJaXNPcHRpb25hbCA9IG5ld0lzT3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMLCBvbGRJc09wdGlvbmFsLAotCQkJCQlpc09wdGlvbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgZ2V0UHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCWlmIChwcmVzZW50ZWRBZnRlciAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlc2VudGVkQWZ0ZXIpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRQcmVzZW50ZWRBZnRlciA9IChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRlZEFmdGVyOwotCQkJcHJlc2VudGVkQWZ0ZXIgPSAoQnJlYWtkb3duRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRQcmVzZW50ZWRBZnRlcik7Ci0JCQlpZiAocHJlc2VudGVkQWZ0ZXIgIT0gb2xkUHJlc2VudGVkQWZ0ZXIpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwKLQkJCQkJCQlvbGRQcmVzZW50ZWRBZnRlciwgcHJlc2VudGVkQWZ0ZXIpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlc2VudGVkQWZ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnQgYmFzaWNHZXRQcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRlZEFmdGVyKEJyZWFrZG93bkVsZW1lbnQgbmV3UHJlc2VudGVkQWZ0ZXIpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBvbGRQcmVzZW50ZWRBZnRlciA9IHByZXNlbnRlZEFmdGVyOwotCQlwcmVzZW50ZWRBZnRlciA9IG5ld1ByZXNlbnRlZEFmdGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIsCi0JCQkJCW9sZFByZXNlbnRlZEFmdGVyLCBwcmVzZW50ZWRBZnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGdldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJaWYgKHByZXNlbnRlZEJlZm9yZSAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlc2VudGVkQmVmb3JlKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlc2VudGVkQmVmb3JlID0gKEludGVybmFsRU9iamVjdCkgcHJlc2VudGVkQmVmb3JlOwotCQkJcHJlc2VudGVkQmVmb3JlID0gKEJyZWFrZG93bkVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlc2VudGVkQmVmb3JlKTsKLQkJCWlmIChwcmVzZW50ZWRCZWZvcmUgIT0gb2xkUHJlc2VudGVkQmVmb3JlKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLAotCQkJCQkJCW9sZFByZXNlbnRlZEJlZm9yZSwgcHJlc2VudGVkQmVmb3JlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQnJlYWtkb3duRWxlbWVudCBiYXNpY0dldFByZXNlbnRlZEJlZm9yZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRlZEJlZm9yZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRCZWZvcmUoQnJlYWtkb3duRWxlbWVudCBuZXdQcmVzZW50ZWRCZWZvcmUpIHsKLQkJQnJlYWtkb3duRWxlbWVudCBvbGRQcmVzZW50ZWRCZWZvcmUgPSBwcmVzZW50ZWRCZWZvcmU7Ci0JCXByZXNlbnRlZEJlZm9yZSA9IG5ld1ByZXNlbnRlZEJlZm9yZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSwKLQkJCQkJb2xkUHJlc2VudGVkQmVmb3JlLCBwcmVzZW50ZWRCZWZvcmUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGxhbm5pbmdEYXRhIGdldFBsYW5uaW5nRGF0YSgpIHsKLQkJaWYgKHBsYW5uaW5nRGF0YSAhPSBudWxsICYmICgoRU9iamVjdCkgcGxhbm5pbmdEYXRhKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUGxhbm5pbmdEYXRhID0gKEludGVybmFsRU9iamVjdCkgcGxhbm5pbmdEYXRhOwotCQkJcGxhbm5pbmdEYXRhID0gKFBsYW5uaW5nRGF0YSkgZVJlc29sdmVQcm94eShvbGRQbGFubmluZ0RhdGEpOwotCQkJaWYgKHBsYW5uaW5nRGF0YSAhPSBvbGRQbGFubmluZ0RhdGEpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3UGxhbm5pbmdEYXRhID0gKEludGVybmFsRU9iamVjdCkgcGxhbm5pbmdEYXRhOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQbGFubmluZ0RhdGEuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1BsYW5uaW5nRGF0YS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQbGFubmluZ0RhdGEKLQkJCQkJCQkuZUludmVyc2VBZGQoCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQkJCQludWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCQlvbGRQbGFubmluZ0RhdGEsIHBsYW5uaW5nRGF0YSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBsYW5uaW5nRGF0YSBiYXNpY0dldFBsYW5uaW5nRGF0YSgpIHsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG5ld1BsYW5uaW5nRGF0YSwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUGxhbm5pbmdEYXRhIG9sZFBsYW5uaW5nRGF0YSA9IHBsYW5uaW5nRGF0YTsKLQkJcGxhbm5pbmdEYXRhID0gbmV3UGxhbm5pbmdEYXRhOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQlvbGRQbGFubmluZ0RhdGEsIG5ld1BsYW5uaW5nRGF0YSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG5ld1BsYW5uaW5nRGF0YSkgewotCQlpZiAobmV3UGxhbm5pbmdEYXRhICE9IHBsYW5uaW5nRGF0YSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGxhbm5pbmdEYXRhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwbGFubmluZ0RhdGEpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BsYW5uaW5nRGF0YSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UGxhbm5pbmdEYXRhKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBsYW5uaW5nRGF0YShuZXdQbGFubmluZ0RhdGEsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBLAotCQkJCQluZXdQbGFubmluZ0RhdGEsIG5ld1BsYW5uaW5nRGF0YSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBnZXRTdXBlckFjdGl2aXRpZXMoKSB7Ci0JCWlmIChzdXBlckFjdGl2aXRpZXMgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHN1cGVyQWN0aXZpdGllcykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFN1cGVyQWN0aXZpdGllcyA9IChJbnRlcm5hbEVPYmplY3QpIHN1cGVyQWN0aXZpdGllczsKLQkJCXN1cGVyQWN0aXZpdGllcyA9IChBY3Rpdml0eSkgZVJlc29sdmVQcm94eShvbGRTdXBlckFjdGl2aXRpZXMpOwotCQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBvbGRTdXBlckFjdGl2aXRpZXMpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCQkJb2xkU3VwZXJBY3Rpdml0aWVzLCBzdXBlckFjdGl2aXRpZXMpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBY3Rpdml0eSBiYXNpY0dldFN1cGVyQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIHN1cGVyQWN0aXZpdGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMoCi0JCQlBY3Rpdml0eSBuZXdTdXBlckFjdGl2aXRpZXMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQWN0aXZpdHkgb2xkU3VwZXJBY3Rpdml0aWVzID0gc3VwZXJBY3Rpdml0aWVzOwotCQlzdXBlckFjdGl2aXRpZXMgPSBuZXdTdXBlckFjdGl2aXRpZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCW9sZFN1cGVyQWN0aXZpdGllcywgbmV3U3VwZXJBY3Rpdml0aWVzKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyQWN0aXZpdGllcyhBY3Rpdml0eSBuZXdTdXBlckFjdGl2aXRpZXMpIHsKLQkJaWYgKG5ld1N1cGVyQWN0aXZpdGllcyAhPSBzdXBlckFjdGl2aXRpZXMpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1cGVyQWN0aXZpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJBY3Rpdml0aWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQkJQWN0aXZpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1N1cGVyQWN0aXZpdGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3VwZXJBY3Rpdml0aWVzKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5BQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTLAotCQkJCQkJQWN0aXZpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3VwZXJBY3Rpdml0aWVzKG5ld1N1cGVyQWN0aXZpdGllcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVMsCi0JCQkJCW5ld1N1cGVyQWN0aXZpdGllcywgbmV3U3VwZXJBY3Rpdml0aWVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q2hlY2tsaXN0PiBnZXRDaGVja2xpc3RzKCkgewotCQlpZiAoY2hlY2tsaXN0cyA9PSBudWxsKSB7Ci0JCQljaGVja2xpc3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDaGVja2xpc3Q+KENoZWNrbGlzdC5jbGFzcywKLQkJCQkJdGhpcywgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCX0KLQkJcmV0dXJuIGNoZWNrbGlzdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q29uY2VwdD4gZ2V0Q29uY2VwdHMoKSB7Ci0JCWlmIChjb25jZXB0cyA9PSBudWxsKSB7Ci0JCQljb25jZXB0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29uY2VwdD4oQ29uY2VwdC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFMpOwotCQl9Ci0JCXJldHVybiBjb25jZXB0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxFeGFtcGxlPiBnZXRFeGFtcGxlcygpIHsKLQkJaWYgKGV4YW1wbGVzID09IG51bGwpIHsKLQkJCWV4YW1wbGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxFeGFtcGxlPihFeGFtcGxlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUyk7Ci0JCX0KLQkJcmV0dXJuIGV4YW1wbGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEd1aWRlbGluZT4gZ2V0R3VpZGVsaW5lcygpIHsKLQkJaWYgKGd1aWRlbGluZXMgPT0gbnVsbCkgewotCQkJZ3VpZGVsaW5lcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8R3VpZGVsaW5lPihHdWlkZWxpbmUuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORVMpOwotCQl9Ci0JCXJldHVybiBndWlkZWxpbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJldXNhYmxlQXNzZXQ+IGdldFJldXNhYmxlQXNzZXRzKCkgewotCQlpZiAocmV1c2FibGVBc3NldHMgPT0gbnVsbCkgewotCQkJcmV1c2FibGVBc3NldHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJldXNhYmxlQXNzZXQ+KAotCQkJCQlSZXVzYWJsZUFzc2V0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMpOwotCQl9Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSB7Ci0JCWlmIChzdXBwb3J0aW5nTWF0ZXJpYWxzID09IG51bGwpIHsKLQkJCXN1cHBvcnRpbmdNYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4oCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRlbXBsYXRlPiBnZXRUZW1wbGF0ZXMoKSB7Ci0JCWlmICh0ZW1wbGF0ZXMgPT0gbnVsbCkgewotCQkJdGVtcGxhdGVzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUZW1wbGF0ZT4oVGVtcGxhdGUuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUyk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSZXBvcnQ+IGdldFJlcG9ydHMoKSB7Ci0JCWlmIChyZXBvcnRzID09IG51bGwpIHsKLQkJCXJlcG9ydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJlcG9ydD4oUmVwb3J0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcmVwb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+IGdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpIHsKLQkJaWYgKGVzdGltYXRpb25jb25zaWRlcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQllc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4oCi0JCQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xtZW50b3IoKSB7Ci0JCWlmICh0b29sbWVudG9yID09IG51bGwpIHsKLQkJCXRvb2xtZW50b3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SKTsKLQkJfQotCQlyZXR1cm4gdG9vbG1lbnRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlpZiAoc3VwZXJBY3Rpdml0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlckFjdGl2aXRpZXMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMsCi0JCQkJCQlBY3Rpdml0eS5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQToKLQkJCXJldHVybiBiYXNpY1NldFBsYW5uaW5nRGF0YShudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJBY3Rpdml0aWVzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJcmV0dXJuIGdldFByZWZpeCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQlyZXR1cm4gZ2V0SXNQbGFubmVkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJcmV0dXJuIGdldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXJldHVybiBnZXRJc09wdGlvbmFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVzZW50ZWRBZnRlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlc2VudGVkQmVmb3JlKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBsYW5uaW5nRGF0YSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0UGxhbm5pbmdEYXRhKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVElFUzoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRTdXBlckFjdGl2aXRpZXMoKTsKLQkJCXJldHVybiBiYXNpY0dldFN1cGVyQWN0aXZpdGllcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOgotCQkJcmV0dXJuIGdldENvbmNlcHRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlyZXR1cm4gZ2V0RXhhbXBsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJcmV0dXJuIGdldEd1aWRlbGluZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFM6Ci0JCQlyZXR1cm4gZ2V0UmV1c2FibGVBc3NldHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCXJldHVybiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTOgotCQkJcmV0dXJuIGdldFRlbXBsYXRlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFUE9SVFM6Ci0JCQlyZXR1cm4gZ2V0UmVwb3J0cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBnZXRFc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJcmV0dXJuIGdldFRvb2xtZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCXNldFByZWZpeCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCXNldElzUGxhbm5lZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXNldElzT3B0aW9uYWwoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQlzZXRQcmVzZW50ZWRBZnRlcigoQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQlzZXRQcmVzZW50ZWRCZWZvcmUoKEJyZWFrZG93bkVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJc2V0UGxhbm5pbmdEYXRhKChQbGFubmluZ0RhdGEpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTOgotCQkJc2V0U3VwZXJBY3Rpdml0aWVzKChBY3Rpdml0eSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVFM6Ci0JCQlnZXRDaGVja2xpc3RzKCkuY2xlYXIoKTsKLQkJCWdldENoZWNrbGlzdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENoZWNrbGlzdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUUzoKLQkJCWdldENvbmNlcHRzKCkuY2xlYXIoKTsKLQkJCWdldENvbmNlcHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25jZXB0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJZ2V0RXhhbXBsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEV4YW1wbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJZ2V0R3VpZGVsaW5lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgR3VpZGVsaW5lPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuY2xlYXIoKTsKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmV1c2FibGVBc3NldD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM6Ci0JCQlnZXRUZW1wbGF0ZXMoKS5jbGVhcigpOwotCQkJZ2V0VGVtcGxhdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUZW1wbGF0ZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVBPUlRTOgotCQkJZ2V0UmVwb3J0cygpLmNsZWFyKCk7Ci0JCQlnZXRSZXBvcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSZXBvcnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJZ2V0VG9vbG1lbnRvcigpLmNsZWFyKCk7Ci0JCQlnZXRUb29sbWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJc2V0SXNQbGFubmVkKElTX1BMQU5ORURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCXNldElzT3B0aW9uYWwoSVNfT1BUSU9OQUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCXNldFByZXNlbnRlZEFmdGVyKChCcmVha2Rvd25FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOgotCQkJc2V0UHJlc2VudGVkQmVmb3JlKChCcmVha2Rvd25FbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJc2V0UGxhbm5pbmdEYXRhKChQbGFubmluZ0RhdGEpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlzZXRTdXBlckFjdGl2aXRpZXMoKEFjdGl2aXR5KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJZ2V0Q2hlY2tsaXN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVFM6Ci0JCQlnZXRDb25jZXB0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCWdldEd1aWRlbGluZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCWdldFJldXNhYmxlQXNzZXRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1RFTVBMQVRFUzoKLQkJCWdldFRlbXBsYXRlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzoKLQkJCWdldFJlcG9ydHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25jb25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUjoKLQkJCWdldFRvb2xtZW50b3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJcmV0dXJuIFBSRUZJWF9FREVGQVVMVCA9PSBudWxsID8gcHJlZml4ICE9IG51bGwgOiAhUFJFRklYX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMocHJlZml4KTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJcmV0dXJuIElTX1BMQU5ORURfRURFRkFVTFQgPT0gbnVsbCA/IGlzUGxhbm5lZCAhPSBudWxsCi0JCQkJCTogIUlTX1BMQU5ORURfRURFRkFVTFQuZXF1YWxzKGlzUGxhbm5lZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJcmV0dXJuIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCA9PSBudWxsID8gaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyAhPSBudWxsCi0JCQkJCTogIUhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQlyZXR1cm4gSVNfT1BUSU9OQUxfRURFRkFVTFQgPT0gbnVsbCA/IGlzT3B0aW9uYWwgIT0gbnVsbAotCQkJCQk6ICFJU19PUFRJT05BTF9FREVGQVVMVC5lcXVhbHMoaXNPcHRpb25hbCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJcmV0dXJuIHByZXNlbnRlZEFmdGVyICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCXJldHVybiBwcmVzZW50ZWRCZWZvcmUgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJcmV0dXJuIHBsYW5uaW5nRGF0YSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRJRVM6Ci0JCQlyZXR1cm4gc3VwZXJBY3Rpdml0aWVzICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBjaGVja2xpc3RzICE9IG51bGwgJiYgIWNoZWNrbGlzdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTOgotCQkJcmV0dXJuIGNvbmNlcHRzICE9IG51bGwgJiYgIWNvbmNlcHRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFUzoKLQkJCXJldHVybiBleGFtcGxlcyAhPSBudWxsICYmICFleGFtcGxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBndWlkZWxpbmVzICE9IG51bGwgJiYgIWd1aWRlbGluZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUUzoKLQkJCXJldHVybiByZXVzYWJsZUFzc2V0cyAhPSBudWxsICYmICFyZXVzYWJsZUFzc2V0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFzdXBwb3J0aW5nTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19URU1QTEFURVM6Ci0JCQlyZXR1cm4gdGVtcGxhdGVzICE9IG51bGwgJiYgIXRlbXBsYXRlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUzoKLQkJCXJldHVybiByZXBvcnRzICE9IG51bGwgJiYgIXJlcG9ydHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0VTVElNQVRJT05DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19UT09MTUVOVE9SOgotCQkJcmV0dXJuIHRvb2xtZW50b3IgIT0gbnVsbCAmJiAhdG9vbG1lbnRvci5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlZml4OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNQbGFubmVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzUGxhbm5lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaGFzTXVsdGlwbGVPY2N1cnJlbmNlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChoYXNNdWx0aXBsZU9jY3VycmVuY2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc09wdGlvbmFsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzT3B0aW9uYWwpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CcmVha2Rvd25FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NhcGFiaWxpdHlQYXR0ZXJuSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTVlZWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXBhYmlsaXR5UGF0dGVybkltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNBUEFCSUxJVFlfUEFUVEVSTjsKLQl9Ci0KLX0gLy9DYXBhYmlsaXR5UGF0dGVybkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNkZGI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENoZWNrbGlzdEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBDaGVja2xpc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENoZWNrbGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNIRUNLTElTVDsKLQl9Ci0KLX0gLy9DaGVja2xpc3RJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ2xhc3NpZmllckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DbGFzc2lmaWVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q3NDliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9DbGFzc2lmaWVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DbGFzc2lmaWVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ2xhc3NpZmllckltcGwjZ2V0SXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc2lmaWVySW1wbCBleHRlbmRzIFR5cGVJbXBsIGltcGxlbWVudHMgQ2xhc3NpZmllciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNBYnN0cmFjdCgpIDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNBYnN0cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0FCU1RSQUNUX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2xhc3NpZmllckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNMQVNTSUZJRVI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0SXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBYnN0cmFjdChCb29sZWFuIG5ld0lzQWJzdHJhY3QpIHsKLQkJQm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJaXNBYnN0cmFjdCA9IG5ld0lzQWJzdHJhY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsCi0JCQkJCWlzQWJzdHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVDoKLQkJCXJldHVybiBnZXRJc0Fic3RyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdChJU19BQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNMQVNTSUZJRVJfX0lTX0FCU1RSQUNUOgotCQkJcmV0dXJuIElTX0FCU1RSQUNUX0VERUZBVUxUID09IG51bGwgPyBpc0Fic3RyYWN0ICE9IG51bGwKLQkJCQkJOiAhSVNfQUJTVFJBQ1RfRURFRkFVTFQuZXF1YWxzKGlzQWJzdHJhY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzQWJzdHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NsYXNzaWZpZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDg4MWUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsI2dldEFnZ3JlZ2F0ZWRSb2xlcyA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZVJvbGVJbXBsIGV4dGVuZHMgUm9sZURlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJQ29tcG9zaXRlUm9sZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZ2dyZWdhdGVkUm9sZXMoKSA8ZW0+QWdncmVnYXRlZCBSb2xlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZ2dyZWdhdGVkUm9sZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlPiBhZ2dyZWdhdGVkUm9sZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlUm9sZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTVBPU0lURV9ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJaWYgKGFnZ3JlZ2F0ZWRSb2xlcyA9PSBudWxsKSB7Ci0JCQlhZ2dyZWdhdGVkUm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGU+KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVMpOwotCQl9Ci0JCXJldHVybiBhZ2dyZWdhdGVkUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRVM6Ci0JCQlyZXR1cm4gZ2V0QWdncmVnYXRlZFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJZ2V0QWdncmVnYXRlZFJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFUzoKLQkJCWdldEFnZ3JlZ2F0ZWRSb2xlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTOgotCQkJcmV0dXJuIGFnZ3JlZ2F0ZWRSb2xlcyAhPSBudWxsICYmICFhZ2dyZWdhdGVkUm9sZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Db21wb3NpdGVSb2xlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbmNlcHRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ4NTU2NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENvbmNlcHQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbmNlcHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05DRVBUOwotCX0KLQotfSAvL0NvbmNlcHRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29uc3RyYWludEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4NDc3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db25zdHJhaW50SW1wbCNnZXRCb2R5IDxlbT5Cb2R5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29uc3RyYWludEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnN0cmFpbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJvZHkoKSA8ZW0+Qm9keTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Qm9keSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Qm9keSgpIDxlbT5Cb2R5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCb2R5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJvZHkgPSBCT0RZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05TVFJBSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKLQkJcmV0dXJuIGJvZHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9keShTdHJpbmcgbmV3Qm9keSkgewotCQlTdHJpbmcgb2xkQm9keSA9IGJvZHk7Ci0JCWJvZHkgPSBuZXdCb2R5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFksIG9sZEJvZHksIGJvZHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJcmV0dXJuIGdldEJvZHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fQk9EWToKLQkJCXNldEJvZHkoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX0JPRFk6Ci0JCQlzZXRCb2R5KEJPRFlfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19CT0RZOgotCQkJcmV0dXJuIEJPRFlfRURFRkFVTFQgPT0gbnVsbCA/IGJvZHkgIT0gbnVsbCA6ICFCT0RZX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoYm9keSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYm9keTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChib2R5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29uc3RyYWludEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWUyZjBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50Q2F0ZWdvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZOwotCX0KLQotfSAvL0NvbnRlbnRDYXRlZ29yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2UwZWQ5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0U2VjdGlvbnMgPGVtPlNlY3Rpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cwotCQlDb250ZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFpbkRlc2NyaXB0aW9uID0gTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25zKCkgPGVtPlNlY3Rpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U2VjdGlvbj4gc2VjdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfSURfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJZCgpIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBleHRlcm5hbElkID0gRVhURVJOQUxfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKSA8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXlDb25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXlDb25zaWRlcmF0aW9ucygpIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX1BSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkgPGVtPkxvbmcgUHJlc2VudGF0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExvbmdQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxvbmdQcmVzZW50YXRpb25OYW1lID0gTE9OR19QUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbWFpbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgbmV3TWFpbkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRNYWluRGVzY3JpcHRpb24gPSBtYWluRGVzY3JpcHRpb247Ci0JCW1haW5EZXNjcmlwdGlvbiA9IG5ld01haW5EZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRNYWluRGVzY3JpcHRpb24sIG1haW5EZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb25zKCkgewotCQlpZiAoc2VjdGlvbnMgPT0gbnVsbCkgewotCQkJc2VjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFNlY3Rpb24+KAotCQkJCQlTZWN0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT05TKTsKLQkJfQotCQlyZXR1cm4gc2VjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbElkKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyBuZXdFeHRlcm5hbElkKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbElkID0gZXh0ZXJuYWxJZDsKLQkJZXh0ZXJuYWxJZCA9IG5ld0V4dGVybmFsSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsIG9sZEV4dGVybmFsSWQsCi0JCQkJCWV4dGVybmFsSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4ga2V5Q29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5Q29uc2lkZXJhdGlvbnMoU3RyaW5nIG5ld0tleUNvbnNpZGVyYXRpb25zKSB7Ci0JCVN0cmluZyBvbGRLZXlDb25zaWRlcmF0aW9ucyA9IGtleUNvbnNpZGVyYXRpb25zOwotCQlrZXlDb25zaWRlcmF0aW9ucyA9IG5ld0tleUNvbnNpZGVyYXRpb25zOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUywKLQkJCQkJb2xkS2V5Q29uc2lkZXJhdGlvbnMsIGtleUNvbnNpZGVyYXRpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb25nUHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIGxvbmdQcmVzZW50YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvbmdQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuZXdMb25nUHJlc2VudGF0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkTG9uZ1ByZXNlbnRhdGlvbk5hbWUgPSBsb25nUHJlc2VudGF0aW9uTmFtZTsKLQkJbG9uZ1ByZXNlbnRhdGlvbk5hbWUgPSBuZXdMb25nUHJlc2VudGF0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FLAotCQkJCQlvbGRMb25nUHJlc2VudGF0aW9uTmFtZSwgbG9uZ1ByZXNlbnRhdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCXJldHVybiBnZXRTZWN0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIGdldEtleUNvbnNpZGVyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIGdldExvbmdQcmVzZW50YXRpb25OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlM6Ci0JCQlnZXRTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRTZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlzZXRLZXlDb25zaWRlcmF0aW9ucygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJc2V0TG9uZ1ByZXNlbnRhdGlvbk5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQlzZXRNYWluRGVzY3JpcHRpb24oTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCWdldFNlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOgotCQkJc2V0RXh0ZXJuYWxJZChFWFRFUk5BTF9JRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQlzZXRLZXlDb25zaWRlcmF0aW9ucyhLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTE9OR19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXNldExvbmdQcmVzZW50YXRpb25OYW1lKExPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IG1haW5EZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIU1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKG1haW5EZXNjcmlwdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OUzoKLQkJCXJldHVybiBzZWN0aW9ucyAhPSBudWxsICYmICFzZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCXJldHVybiBFWFRFUk5BTF9JRF9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxJZCAhPSBudWxsCi0JCQkJCTogIUVYVEVSTkFMX0lEX0VERUZBVUxULmVxdWFscyhleHRlcm5hbElkKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQgPT0gbnVsbCA/IGtleUNvbnNpZGVyYXRpb25zICE9IG51bGwKLQkJCQkJOiAhS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxULmVxdWFscyhrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19MT05HX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIExPTkdfUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGxvbmdQcmVzZW50YXRpb25OYW1lICE9IG51bGwKLQkJCQkJOiAhTE9OR19QUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMobG9uZ1ByZXNlbnRhdGlvbk5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1haW5EZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4dGVybmFsSWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwga2V5Q29uc2lkZXJhdGlvbnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvbmdQcmVzZW50YXRpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGxvbmdQcmVzZW50YXRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29udGVudERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU5MzIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFscyA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q29uY2VwdHNBbmRQYXBlcnMgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0Q2hlY2tsaXN0cyA8ZW0+Q2hlY2tsaXN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRHdWlkZWxpbmVzIDxlbT5HdWlkZWxpbmVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldEV4YW1wbGVzIDxlbT5FeGFtcGxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRBc3NldHMgPGVtPkFzc2V0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRUZXJtZGVmaW5pdGlvbiA8ZW0+VGVybWRlZmluaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50RWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cHBvcnRpbmdNYXRlcmlhbHMoKSA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gc3VwcG9ydGluZ01hdGVyaWFsczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbmNlcHRzQW5kUGFwZXJzKCkgPGVtPkNvbmNlcHRzIEFuZCBQYXBlcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb25jZXB0PiBjb25jZXB0c0FuZFBhcGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoZWNrbGlzdHMoKSA8ZW0+Q2hlY2tsaXN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGVja2xpc3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q2hlY2tsaXN0PiBjaGVja2xpc3RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZGVsaW5lcygpIDxlbT5HdWlkZWxpbmVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEd1aWRlbGluZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxHdWlkZWxpbmU+IGd1aWRlbGluZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGFtcGxlcygpIDxlbT5FeGFtcGxlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGFtcGxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEV4YW1wbGU+IGV4YW1wbGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzZXRzKCkgPGVtPkFzc2V0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSZXVzYWJsZUFzc2V0PiBhc3NldHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXJtZGVmaW5pdGlvbigpIDxlbT5UZXJtZGVmaW5pdGlvbjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZXJtZGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRlcm1EZWZpbml0aW9uPiB0ZXJtZGVmaW5pdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQKLQkJCQk6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCW9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsCi0JCQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwKLQkJCQkJCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoCi0JCQlWYXJpYWJpbGl0eUVsZW1lbnQgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlWYXJpYWJpbGl0eUVsZW1lbnQgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbmNlcHQ+IGdldENvbmNlcHRzQW5kUGFwZXJzKCkgewotCQlpZiAoY29uY2VwdHNBbmRQYXBlcnMgPT0gbnVsbCkgewotCQkJY29uY2VwdHNBbmRQYXBlcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbmNlcHQ+KAotCQkJCQlDb25jZXB0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbmNlcHRzQW5kUGFwZXJzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENoZWNrbGlzdD4gZ2V0Q2hlY2tsaXN0cygpIHsKLQkJaWYgKGNoZWNrbGlzdHMgPT0gbnVsbCkgewotCQkJY2hlY2tsaXN0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q2hlY2tsaXN0PihDaGVja2xpc3QuY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJfQotCQlyZXR1cm4gY2hlY2tsaXN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHdWlkZWxpbmU+IGdldEd1aWRlbGluZXMoKSB7Ci0JCWlmIChndWlkZWxpbmVzID09IG51bGwpIHsKLQkJCWd1aWRlbGluZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEd1aWRlbGluZT4oR3VpZGVsaW5lLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUyk7Ci0JCX0KLQkJcmV0dXJuIGd1aWRlbGluZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RXhhbXBsZT4gZ2V0RXhhbXBsZXMoKSB7Ci0JCWlmIChleGFtcGxlcyA9PSBudWxsKSB7Ci0JCQlleGFtcGxlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXhhbXBsZT4oRXhhbXBsZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTKTsKLQkJfQotCQlyZXR1cm4gZXhhbXBsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UmV1c2FibGVBc3NldD4gZ2V0QXNzZXRzKCkgewotCQlpZiAoYXNzZXRzID09IG51bGwpIHsKLQkJCWFzc2V0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8UmV1c2FibGVBc3NldD4oCi0JCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19BU1NFVFMpOwotCQl9Ci0JCXJldHVybiBhc3NldHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGVybURlZmluaXRpb24+IGdldFRlcm1kZWZpbml0aW9uKCkgewotCQlpZiAodGVybWRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJdGVybWRlZmluaXRpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRlcm1EZWZpbml0aW9uPigKLQkJCQkJVGVybURlZmluaXRpb24uY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTik7Ci0JCX0KLQkJcmV0dXJuIHRlcm1kZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTOgotCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCXJldHVybiBnZXRDb25jZXB0c0FuZFBhcGVycygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJcmV0dXJuIGdldENoZWNrbGlzdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FUzoKLQkJCXJldHVybiBnZXRHdWlkZWxpbmVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJcmV0dXJuIGdldEV4YW1wbGVzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCXJldHVybiBnZXRBc3NldHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVEVSTURFRklOSVRJT046Ci0JCQlyZXR1cm4gZ2V0VGVybWRlZmluaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFZhcmlhYmlsaXR5RWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVFNfQU5EX1BBUEVSUzoKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuY2xlYXIoKTsKLQkJCWdldENvbmNlcHRzQW5kUGFwZXJzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29uY2VwdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCWdldENoZWNrbGlzdHMoKS5jbGVhcigpOwotCQkJZ2V0Q2hlY2tsaXN0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2hlY2tsaXN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJZ2V0R3VpZGVsaW5lcygpLmNsZWFyKCk7Ci0JCQlnZXRHdWlkZWxpbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHdWlkZWxpbmU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJZ2V0RXhhbXBsZXMoKS5jbGVhcigpOwotCQkJZ2V0RXhhbXBsZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEV4YW1wbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCWdldEFzc2V0cygpLmNsZWFyKCk7Ci0JCQlnZXRBc3NldHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJldXNhYmxlQXNzZXQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5jbGVhcigpOwotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUZXJtRGVmaW5pdGlvbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlzZXRWYXJpYWJpbGl0eVR5cGUoVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOgotCQkJZ2V0Q29uY2VwdHNBbmRQYXBlcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTOgotCQkJZ2V0Q2hlY2tsaXN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORVM6Ci0JCQlnZXRHdWlkZWxpbmVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRVM6Ci0JCQlnZXRFeGFtcGxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0FTU0VUUzoKLQkJCWdldEFzc2V0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1RFUk1ERUZJTklUSU9OOgotCQkJZ2V0VGVybWRlZmluaXRpb24oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlICE9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUzoKLQkJCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzICE9IG51bGwKLQkJCQkJJiYgIXN1cHBvcnRpbmdNYXRlcmlhbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTOgotCQkJcmV0dXJuIGNvbmNlcHRzQW5kUGFwZXJzICE9IG51bGwgJiYgIWNvbmNlcHRzQW5kUGFwZXJzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUUzoKLQkJCXJldHVybiBjaGVja2xpc3RzICE9IG51bGwgJiYgIWNoZWNrbGlzdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTOgotCQkJcmV0dXJuIGd1aWRlbGluZXMgIT0gbnVsbCAmJiAhZ3VpZGVsaW5lcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0VYQU1QTEVTOgotCQkJcmV0dXJuIGV4YW1wbGVzICE9IG51bGwgJiYgIWV4YW1wbGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQVNTRVRTOgotCQkJcmV0dXJuIGFzc2V0cyAhPSBudWxsICYmICFhc3NldHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTjoKLQkJCXJldHVybiB0ZXJtZGVmaW5pdGlvbiAhPSBudWxsICYmICF0ZXJtZGVmaW5pdGlvbi5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0U3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJaWYgKHN1cHBvcnRpbmdNYXRlcmlhbHMgPT0gbnVsbCkgewotCQkJc3VwcG9ydGluZ01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPigKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTFMpOwotCQl9Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBWYXJpYWJpbGl0eUVsZW1lbnQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFyaWFiaWxpdHlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vCi0JLy8gU3RhcnQgY3VzdG9tIGNvZGUKLQkvLwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwjc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQlzdXBlci5zZXROYW1lKG5ld05hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQlzdXBlci5zZXROYW1lKG5ld05hbWUpOwotCQlpZiAobmV3TmFtZSAhPSBudWxsICYmICFuZXdOYW1lLmVxdWFscyhvbGROYW1lKSkgewotCQkJcHJlc2VudGF0aW9uLnNldE5hbWUoVW1hVXRpbC5jcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKHRoaXMpKTsKLQkJfQotCX0KLQotfSAvL0NvbnRlbnRFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjJhZmIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnRzIDxlbT5Db250ZW50IEVsZW1lbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cwotCQlDb250ZW50UGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250ZW50RWxlbWVudHMoKSA8ZW0+Q29udGVudCBFbGVtZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDb250ZW50RWxlbWVudD4gY29udGVudEVsZW1lbnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRFbGVtZW50PiBnZXRDb250ZW50RWxlbWVudHMoKSB7Ci0JCWlmIChjb250ZW50RWxlbWVudHMgPT0gbnVsbCkgewotCQkJY29udGVudEVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxDb250ZW50RWxlbWVudD4oCi0JCQkJCUNvbnRlbnRFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0Q29udGVudEVsZW1lbnRzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybiBnZXRDb250ZW50RWxlbWVudHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTOgotCQkJZ2V0Q29udGVudEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCWdldENvbnRlbnRFbGVtZW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUzoKLQkJCXJldHVybiBjb250ZW50RWxlbWVudHMgIT0gbnVsbCAmJiAhY29udGVudEVsZW1lbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29udGVudFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMThjYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0NvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29yZSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCWltcGxlbWVudHMgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIGVsZW1lbnQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRFbGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgZWxlbWVudDsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRFbGVtZW50KTsKLQkJCWlmIChlbGVtZW50ICE9IG9sZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsIG9sZEVsZW1lbnQsCi0JCQkJCWVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT1JFX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTZkNjAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DdXN0b20gQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cyA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0U3ViQ2F0ZWdvcmllcyA8ZW0+U3ViIENhdGVnb3JpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDdXN0b21DYXRlZ29yeUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJQ3VzdG9tQ2F0ZWdvcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIDxlbT5DYXRlZ29yaXplZCBFbGVtZW50czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PiBjYXRlZ29yaXplZEVsZW1lbnRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViQ2F0ZWdvcmllcygpIDxlbT5TdWIgQ2F0ZWdvcmllczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJDYXRlZ29yaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBzdWJDYXRlZ29yaWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEN1c3RvbUNhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ1VTVE9NX0NBVEVHT1JZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERlc2NyaWJhYmxlRWxlbWVudD4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpIHsKLQkJaWYgKGNhdGVnb3JpemVkRWxlbWVudHMgPT0gbnVsbCkgewotCQkJY2F0ZWdvcml6ZWRFbGVtZW50cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGVzY3JpYmFibGVFbGVtZW50PigKLQkJCQkJRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFMpOwotCQl9Ci0JCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0U3ViQ2F0ZWdvcmllcygpIHsKLQkJaWYgKHN1YkNhdGVnb3JpZXMgPT0gbnVsbCkgewotCQkJc3ViQ2F0ZWdvcmllcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudENhdGVnb3J5PigKLQkJCQkJQ29udGVudENhdGVnb3J5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVMpOwotCQl9Ci0JCXJldHVybiBzdWJDYXRlZ29yaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlyZXR1cm4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCXJldHVybiBnZXRTdWJDYXRlZ29yaWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCWdldENhdGVnb3JpemVkRWxlbWVudHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SSUVTOgotCQkJZ2V0U3ViQ2F0ZWdvcmllcygpLmNsZWFyKCk7Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVFM6Ci0JCQlnZXRDYXRlZ29yaXplZEVsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JJRVM6Ci0JCQlnZXRTdWJDYXRlZ29yaWVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UUzoKLQkJCXJldHVybiBjYXRlZ29yaXplZEVsZW1lbnRzICE9IG51bGwKLQkJCQkJJiYgIWNhdGVnb3JpemVkRWxlbWVudHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUzoKLQkJCXJldHVybiBzdWJDYXRlZ29yaWVzICE9IG51bGwgJiYgIXN1YkNhdGVnb3JpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9DdXN0b21DYXRlZ29yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYTIwYTcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKSA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZSA9IFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyBuZXdFeHRlcm5hbERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbERlc2NyaXB0aW9uID0gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IG5ld0V4dGVybmFsRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRFeHRlcm5hbERlc2NyaXB0aW9uLCBleHRlcm5hbERlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHBhY2thZ2luZ0d1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyBuZXdQYWNrYWdpbmdHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkUGFja2FnaW5nR3VpZGFuY2UgPSBwYWNrYWdpbmdHdWlkYW5jZTsKLQkJcGFja2FnaW5nR3VpZGFuY2UgPSBuZXdQYWNrYWdpbmdHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLAotCQkJCQlvbGRQYWNrYWdpbmdHdWlkYW5jZSwgcGFja2FnaW5nR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXJldHVybiBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfREVTQ1JJUFRJT046Ci0JCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0U6Ci0JCQlzZXRQYWNrYWdpbmdHdWlkYW5jZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJc2V0UGFja2FnaW5nR3VpZGFuY2UoUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIEVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbERlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGV4dGVybmFsRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCXJldHVybiBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHBhY2thZ2luZ0d1aWRhbmNlICE9IG51bGwKLQkJCQkJOiAhUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyhwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZXh0ZXJuYWxEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYWNrYWdpbmdHdWlkYW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNTIwYTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcmFibGVJbXBsI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0cyA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBEZWxpdmVyYWJsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IGRlbGl2ZXJlZFdvcmtQcm9kdWN0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0PiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKSB7Ci0JCWlmIChkZWxpdmVyZWRXb3JrUHJvZHVjdHMgPT0gbnVsbCkgewotCQkJZGVsaXZlcmVkV29ya1Byb2R1Y3RzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdD4oCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUyk7Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJlZFdvcmtQcm9kdWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUUzoKLQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZGVsaXZlcmVkV29ya1Byb2R1Y3RzICE9IG51bGwKLQkJCQkJJiYgIWRlbGl2ZXJlZFdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJhYmxlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWE5MTJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwjZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjYWxlID0gU0NBTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1NfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSA8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdENoYXJhY3RlcmlzdGljcyA9IFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJJU0tfTEVWRUxfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmlza0xldmVsID0gUklTS19MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlc3RpbWF0aW5nVGVjaG5pcXVlID0gRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlT2ZDb250cmFjdCgpIDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlT2ZDb250cmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjYWxlKCkgewotCQlyZXR1cm4gc2NhbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoU3RyaW5nIG5ld1NjYWxlKSB7Ci0JCVN0cmluZyBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFLCBvbGRTY2FsZSwKLQkJCQkJc2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gbmV3UHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MsCi0JCQkJCW9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJpc2tMZXZlbCgpIHsKLQkJcmV0dXJuIHJpc2tMZXZlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaXNrTGV2ZWwoU3RyaW5nIG5ld1Jpc2tMZXZlbCkgewotCQlTdHJpbmcgb2xkUmlza0xldmVsID0gcmlza0xldmVsOwotCQlyaXNrTGV2ZWwgPSBuZXdSaXNrTGV2ZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTCwKLQkJCQkJb2xkUmlza0xldmVsLCByaXNrTGV2ZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nIG5ld0VzdGltYXRpbmdUZWNobmlxdWUpIHsKLQkJU3RyaW5nIG9sZEVzdGltYXRpbmdUZWNobmlxdWUgPSBlc3RpbWF0aW5nVGVjaG5pcXVlOwotCQllc3RpbWF0aW5nVGVjaG5pcXVlID0gbmV3RXN0aW1hdGluZ1RlY2huaXF1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUsCi0JCQkJCW9sZEVzdGltYXRpbmdUZWNobmlxdWUsIGVzdGltYXRpbmdUZWNobmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSB7Ci0JCXJldHVybiBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2UpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOwotCQlwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gbmV3UHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFLAotCQkJCQlvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIHR5cGVPZkNvbnRyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyBuZXdUeXBlT2ZDb250cmFjdCkgewotCQlTdHJpbmcgb2xkVHlwZU9mQ29udHJhY3QgPSB0eXBlT2ZDb250cmFjdDsKLQkJdHlwZU9mQ29udHJhY3QgPSBuZXdUeXBlT2ZDb250cmFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNULAotCQkJCQlvbGRUeXBlT2ZDb250cmFjdCwgdHlwZU9mQ29udHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXJldHVybiBnZXRTY2FsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCXJldHVybiBnZXRSaXNrTGV2ZWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJcmV0dXJuIGdldEVzdGltYXRpbmdUZWNobmlxdWUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXJldHVybiBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJcmV0dXJuIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJc2V0U2NhbGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlzZXRSaXNrTGV2ZWwoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCXNldFR5cGVPZkNvbnRyYWN0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCXNldFNjYWxlKFNDQUxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJc2V0Umlza0xldmVsKFJJU0tfTEVWRUxfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUU6Ci0JCQlzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCXNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQlzZXRUeXBlT2ZDb250cmFjdChUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQlyZXR1cm4gU0NBTEVfRURFRkFVTFQgPT0gbnVsbCA/IHNjYWxlICE9IG51bGwgOiAhU0NBTEVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhzY2FsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCXJldHVybiBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdENoYXJhY3RlcmlzdGljcyAhPSBudWxsCi0JCQkJCTogIVBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUw6Ci0JCQlyZXR1cm4gUklTS19MRVZFTF9FREVGQVVMVCA9PSBudWxsID8gcmlza0xldmVsICE9IG51bGwKLQkJCQkJOiAhUklTS19MRVZFTF9FREVGQVVMVC5lcXVhbHMocmlza0xldmVsKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJcmV0dXJuIEVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxUID09IG51bGwgPyBlc3RpbWF0aW5nVGVjaG5pcXVlICE9IG51bGwKLQkJCQkJOiAhRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGVzdGltYXRpbmdUZWNobmlxdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFOgotCQkJcmV0dXJuIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE1lbWJlckV4cGVydGlzZSAhPSBudWxsCi0JCQkJCTogIVBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJcmV0dXJuIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHR5cGVPZkNvbnRyYWN0ICE9IG51bGwKLQkJCQkJOiAhVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVC5lcXVhbHModHlwZU9mQ29udHJhY3QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjYWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNjYWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJpc2tMZXZlbDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyaXNrTGV2ZWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVzdGltYXRpbmdUZWNobmlxdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZXN0aW1hdGluZ1RlY2huaXF1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvamVjdE1lbWJlckV4cGVydGlzZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlT2ZDb250cmFjdDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlT2ZDb250cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZTM4MGUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldEVkdWNhdGlvbk1hdGVyaWFscyA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0ltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJ5UHJvY2VzcyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKSA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFZHVjYXRpb25NYXRlcmlhbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGVkdWNhdGlvbk1hdGVyaWFsczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gY29tbXVuaWNhdGlvbnNNYXRlcmlhbHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdXBwb3J0aW5nTWF0ZXJpYWw+IGdldEVkdWNhdGlvbk1hdGVyaWFscygpIHsKLQkJaWYgKGVkdWNhdGlvbk1hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQllZHVjYXRpb25NYXRlcmlhbHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4oCi0JCQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTKTsKLQkJfQotCQlyZXR1cm4gZWR1Y2F0aW9uTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFN1cHBvcnRpbmdNYXRlcmlhbD4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSB7Ci0JCWlmIChjb21tdW5pY2F0aW9uc01hdGVyaWFscyA9PSBudWxsKSB7Ci0JCQljb21tdW5pY2F0aW9uc01hdGVyaWFscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8U3VwcG9ydGluZ01hdGVyaWFsPigKLQkJCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbW11bmljYXRpb25zTWF0ZXJpYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlyZXR1cm4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCWdldEVkdWNhdGlvbk1hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRFZHVjYXRpb25NYXRlcmlhbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdXBwb3J0aW5nTWF0ZXJpYWw+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFM6Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmNsZWFyKCk7Ci0JCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFN1cHBvcnRpbmdNYXRlcmlhbD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUxTOgotCQkJZ2V0RWR1Y2F0aW9uTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCWdldENvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMUzoKLQkJCXJldHVybiBlZHVjYXRpb25NYXRlcmlhbHMgIT0gbnVsbCAmJiAhZWR1Y2F0aW9uTWF0ZXJpYWxzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMUzoKLQkJCXJldHVybiBjb21tdW5pY2F0aW9uc01hdGVyaWFscyAhPSBudWxsCi0JCQkJCSYmICFjb21tdW5pY2F0aW9uc01hdGVyaWFscy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE1YTRjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS5uZXQuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkNvbnRlbnREZXNjcmlwdGlvbkZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBEZXNjcmliYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzQWJzdHJhY3QoKSA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19BQlNUUkFDVF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0Fic3RyYWN0ID0gSVNfQUJTVFJBQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBVUkkgU0hBUEVJQ09OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNoYXBlaWNvbigpIDxlbT5TaGFwZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXBlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFVSSSBzaGFwZWljb24gPSBTSEFQRUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFVSSSBOT0RFSUNPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb2RlaWNvbigpIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9kZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgbm9kZWljb24gPSBOT0RFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiBpc0Fic3RyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzQWJzdHJhY3QoQm9vbGVhbiBuZXdJc0Fic3RyYWN0KSB7Ci0JCUJvb2xlYW4gb2xkSXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7Ci0JCWlzQWJzdHJhY3QgPSBuZXdJc0Fic3RyYWN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNULCBvbGRJc0Fic3RyYWN0LAotCQkJCQlpc0Fic3RyYWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlc2VudGF0aW9uKAotCQkJQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb250ZW50RGVzY3JpcHRpb24gb2xkUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCQlwcmVzZW50YXRpb24gPSBuZXdQcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRQcmVzZW50YXRpb24sIG5ld1ByZXNlbnRhdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVVJJIGdldFNoYXBlaWNvbigpIHsKLQkJcmV0dXJuIHNoYXBlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaGFwZWljb24oVVJJIG5ld1NoYXBlaWNvbikgewotCQlVUkkgb2xkU2hhcGVpY29uID0gc2hhcGVpY29uOwotCQlzaGFwZWljb24gPSBuZXdTaGFwZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OLCBvbGRTaGFwZWljb24sCi0JCQkJCXNoYXBlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0Tm9kZWljb24oKSB7Ci0JCXJldHVybiBub2RlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlaWNvbihVUkkgbmV3Tm9kZWljb24pIHsKLQkJVVJJIG9sZE5vZGVpY29uID0gbm9kZWljb247Ci0JCW5vZGVpY29uID0gbmV3Tm9kZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04sIG9sZE5vZGVpY29uLAotCQkJCQlub2RlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVzZW50YXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJcmV0dXJuIGdldElzQWJzdHJhY3QoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFByZXNlbnRhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJcmV0dXJuIGdldFNoYXBlaWNvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQlyZXR1cm4gZ2V0Tm9kZWljb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQlzZXRJc0Fic3RyYWN0KChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OOgotCQkJc2V0U2hhcGVpY29uKChVUkkpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oKFVSSSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJc2V0SXNBYnN0cmFjdChJU19BQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKENvbnRlbnREZXNjcmlwdGlvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT046Ci0JCQlzZXRTaGFwZWljb24oU0hBUEVJQ09OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJc2V0Tm9kZWljb24oTk9ERUlDT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCXJldHVybiBJU19BQlNUUkFDVF9FREVGQVVMVCA9PSBudWxsID8gaXNBYnN0cmFjdCAhPSBudWxsCi0JCQkJCTogIUlTX0FCU1RSQUNUX0VERUZBVUxULmVxdWFscyhpc0Fic3RyYWN0KTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBwcmVzZW50YXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCXJldHVybiBTSEFQRUlDT05fRURFRkFVTFQgPT0gbnVsbCA/IHNoYXBlaWNvbiAhPSBudWxsCi0JCQkJCTogIVNIQVBFSUNPTl9FREVGQVVMVC5lcXVhbHMoc2hhcGVpY29uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJcmV0dXJuIE5PREVJQ09OX0VERUZBVUxUID09IG51bGwgPyBub2RlaWNvbiAhPSBudWxsCi0JCQkJCTogIU5PREVJQ09OX0VERUZBVUxULmVxdWFscyhub2RlaWNvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBUeXBlLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ2xhc3NpZmllci5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuQ0xBU1NJRklFUl9fSVNfQUJTVFJBQ1Q7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFR5cGUuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBDbGFzc2lmaWVyLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSX19JU19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzQWJzdHJhY3Q6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNBYnN0cmFjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcGVpY29uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNoYXBlaWNvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbm9kZWljb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobm9kZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwotCS8vIFN0YXJ0IGN1c3RvbSBjb2RlCi0JLy8KLQotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gYmFzaWNHZXRQcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiBwcmVzZW50YXRpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGdldFByZXNlbnRhdGlvbigpIHsKLQkJaWYgKHByZXNlbnRhdGlvbiBpbnN0YW5jZW9mIEVPYmplY3QKLQkJCQkmJiAoKEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUlzUHJveHkoKSkgewotCQkJQ29udGVudERlc2NyaXB0aW9uIG9sZFByZXNlbnRhdGlvbiA9IHByZXNlbnRhdGlvbjsKLQkJCXByZXNlbnRhdGlvbiA9IChDb250ZW50RGVzY3JpcHRpb24pIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdCkgcHJlc2VudGF0aW9uKTsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gb2xkUHJlc2VudGF0aW9uKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCQlvbGRQcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbikpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByZXNlbnRhdGlvbiA9PSBudWxsKSB7Ci0JCQkvLwkJCXNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb25GYWN0b3J5LmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKSk7Ci0JCQlpZiAoZW1wdHlQcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJCWVtcHR5UHJlc2VudGF0aW9uID0gQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeQotCQkJCQkJLmNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbih0aGlzKTsKLQkJCQllbXB0eVByZXNlbnRhdGlvbi5lQWRhcHRlcnMoKS5hZGQoY2hhbmdlTGlzdGVuZXIpOwotCQkJfQotCQkJcmV0dXJuIGVtcHR5UHJlc2VudGF0aW9uOwotCQl9Ci0KLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uKSB7Ci0JCWlmIChuZXdQcmVzZW50YXRpb24gIT0gcHJlc2VudGF0aW9uKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByZXNlbnRhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlc2VudGF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVzZW50YXRpb24obmV3UHJlc2VudGF0aW9uLCBtc2dzKTsKLQotCQkJLy8gY3VzdG9tIGNvZGUKLQkJCS8vCi0JCQllbXB0eVByZXNlbnRhdGlvbiA9IG51bGw7Ci0KLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sCi0JCQkJCW5ld1ByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50RGVzY3JpcHRpb24gZW1wdHlQcmVzZW50YXRpb247Ci0KLQlwcml2YXRlIEFkYXB0ZXIgY2hhbmdlTGlzdGVuZXIgPSBuZXcgQWRhcHRlckltcGwoKSB7Ci0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJc3dpdGNoIChtc2cuZ2V0RXZlbnRUeXBlKCkpIHsKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERDoKLQkJCWNhc2UgTm90aWZpY2F0aW9uLkFERF9NQU5ZOgotCQkJY2FzZSBOb3RpZmljYXRpb24uU0VUOgotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50ID0gKENvbnRlbnREZXNjcmlwdGlvbikgZ2V0VGFyZ2V0KCk7Ci0JCQkJY29udGVudC5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcyk7Ci0KLQkJCQkvLyBlbXB0eVByZXNlbnRhdGlvbiBpcyBtb2RpZmllZCwgY29udmVydCBpdCB0byByZWFsIHByZXNlbnRhdGlvbiBpZiBubyBwcmVzZW50YXRpb24gaXMgc2V0IHlldCAKLQkJCQkvLyBmb3IgdGhlIFByb2Nlc3NFbGVtZW50Ci0JCQkJLy8KLQkJCQlpZiAocHJlc2VudGF0aW9uID09IG51bGwpIHsKLQkJCQkJc2V0UHJlc2VudGF0aW9uKGNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX07Ci19IC8vRGVzY3JpYmFibGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOGE2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZJTkVEX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmluZWREZXNjcmlwdGlvbiA9IFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJlZmluZWREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIG5ld1JlZmluZWREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkUmVmaW5lZERlc2NyaXB0aW9uID0gcmVmaW5lZERlc2NyaXB0aW9uOwotCQlyZWZpbmVkRGVzY3JpcHRpb24gPSBuZXdSZWZpbmVkRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwKLQkJCQkJb2xkUmVmaW5lZERlc2NyaXB0aW9uLCByZWZpbmVkRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldFJlZmluZWREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlZmluZWREZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIVJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmaW5lZERlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNGZhMmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCURlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoQm9vbGVhbiBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpIHsKLQkJQm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIGdldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJcmV0dXJuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlICE9IG51bGwKLQkJCQkJOiAhSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdG9ySW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGMxNmJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaWFncmFtRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGlhZ3JhbSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUVsZW1lbnRJbXBsI2dldElzVmlzaWJsZSA8ZW0+SXMgVmlzaWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1FbGVtZW50SW1wbCNnZXRDb250YWluZXJfIDxlbT5Db250YWluZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UmVmZXJlbmNlIDxlbT5SZWZlcmVuY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtRWxlbWVudEltcGwjZ2V0UHJvcGVydHkgPGVtPlByb3BlcnR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhZ3JhbUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlEaWFncmFtRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNWaXNpYmxlKCkgPGVtPklzIFZpc2libGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzVmlzaWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1ZJU0lCTEVfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc1Zpc2libGUoKSA8ZW0+SXMgVmlzaWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNWaXNpYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc1Zpc2libGUgPSBJU19WSVNJQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlKCkgPGVtPlJlZmVyZW5jZTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSZWZlcmVuY2U+IHJlZmVyZW5jZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnR5KCkgPGVtPlByb3BlcnR5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJvcGVydHk+IHByb3BlcnR5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIGlzVmlzaWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1Zpc2libGUoQm9vbGVhbiBuZXdJc1Zpc2libGUpIHsKLQkJQm9vbGVhbiBvbGRJc1Zpc2libGUgPSBpc1Zpc2libGU7Ci0JCWlzVmlzaWJsZSA9IG5ld0lzVmlzaWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEUsIG9sZElzVmlzaWJsZSwKLQkJCQkJaXNWaXNpYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRDb250YWluZXJfKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldENvbnRhaW5lcigpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUikKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUludGVybmFsQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGFpbmVyKEdyYXBoRWxlbWVudCBuZXdDb250YWluZXIsCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyLAotCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250YWluZXIoR3JhcGhFbGVtZW50IG5ld0NvbnRhaW5lcikgewotCQlpZiAobmV3Q29udGFpbmVyICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUiAmJiBuZXdDb250YWluZXIgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3Q29udGFpbmVyKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0NvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGFpbmVyKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQsCi0JCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVIsIG5ld0NvbnRhaW5lciwKLQkJCQkJbmV3Q29udGFpbmVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UmVmZXJlbmNlPiBnZXRSZWZlcmVuY2UoKSB7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PFJlZmVyZW5jZT4oCi0JCQkJCVJlZmVyZW5jZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UHJvcGVydHk+IGdldFByb3BlcnR5KCkgewotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJcHJvcGVydHkgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFByb3BlcnR5PigKLQkJCQkJUHJvcGVydHkuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJcmV0dXJuIGJhc2ljU2V0Q29udGFpbmVyKChHcmFwaEVsZW1lbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0UmVmZXJlbmNlKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBiYXNpY1NldENvbnRhaW5lcihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0UmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZSgKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJcmV0dXJuIGdldElzVmlzaWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVyXygpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCXJldHVybiBnZXRSZWZlcmVuY2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlyZXR1cm4gZ2V0UHJvcGVydHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJc2V0SXNWaXNpYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUjoKLQkJCXNldENvbnRhaW5lcigoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCWdldFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQlnZXRSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJlZmVyZW5jZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUFJPUEVSVFk6Ci0JCQlnZXRQcm9wZXJ0eSgpLmNsZWFyKCk7Ci0JCQlnZXRQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvcGVydHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19JU19WSVNJQkxFOgotCQkJc2V0SXNWaXNpYmxlKElTX1ZJU0lCTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19DT05UQUlORVI6Ci0JCQlzZXRDb250YWluZXIoKEdyYXBoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRToKLQkJCWdldFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZOgotCQkJZ2V0UHJvcGVydHkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0lTX1ZJU0lCTEU6Ci0JCQlyZXR1cm4gSVNfVklTSUJMRV9FREVGQVVMVCA9PSBudWxsID8gaXNWaXNpYmxlICE9IG51bGwKLQkJCQkJOiAhSVNfVklTSUJMRV9FREVGQVVMVC5lcXVhbHMoaXNWaXNpYmxlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSOgotCQkJcmV0dXJuIGJhc2ljR2V0Q29udGFpbmVyKCkgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fRUxFTUVOVF9fUkVGRVJFTkNFOgotCQkJcmV0dXJuIHJlZmVyZW5jZSAhPSBudWxsICYmICFyZWZlcmVuY2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UX19QUk9QRVJUWToKLQkJCXJldHVybiBwcm9wZXJ0eSAhPSBudWxsICYmICFwcm9wZXJ0eS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaXNWaXNpYmxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzVmlzaWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpYWdyYW1FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVjZmRhZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpYWdyYW08L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXREaWFncmFtTGluayA8ZW0+RGlhZ3JhbSBMaW5rPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0TmFtZXNwYWNlIDxlbT5OYW1lc3BhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtSW1wbCNnZXRab29tIDxlbT5ab29tPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlhZ3JhbUltcGwjZ2V0Vmlld3BvaW50IDxlbT5WaWV3cG9pbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtSW1wbCBleHRlbmRzIEdyYXBoTm9kZUltcGwgaW1wbGVtZW50cyBEaWFncmFtIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpYWdyYW1MaW5rKCkgPGVtPkRpYWdyYW0gTGluazwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtTGluaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW1MaW5rPiBkaWFncmFtTGluazsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWVzcGFjZSgpIDxlbT5OYW1lc3BhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVzcGFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZXNwYWNlOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWk9PTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFpvb20oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgem9vbSA9IFpPT01fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWaWV3cG9pbnQoKSA8ZW0+Vmlld3BvaW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWaWV3cG9pbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCB2aWV3cG9pbnQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJQUdSQU07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRab29tKCkgewotCQlyZXR1cm4gem9vbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRab29tKERvdWJsZSBuZXdab29tKSB7Ci0JCURvdWJsZSBvbGRab29tID0gem9vbTsKLQkJem9vbSA9IG5ld1pvb207Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTSwgb2xkWm9vbSwgem9vbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRWaWV3cG9pbnQoKSB7Ci0JCWlmICh2aWV3cG9pbnQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHZpZXdwb2ludCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZpZXdwb2ludCA9IChJbnRlcm5hbEVPYmplY3QpIHZpZXdwb2ludDsKLQkJCXZpZXdwb2ludCA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRWaWV3cG9pbnQpOwotCQkJaWYgKHZpZXdwb2ludCAhPSBvbGRWaWV3cG9pbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5ULCBvbGRWaWV3cG9pbnQsCi0JCQkJCQkJdmlld3BvaW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZpZXdwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRWaWV3cG9pbnQoKSB7Ci0JCXJldHVybiB2aWV3cG9pbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld3BvaW50KFBvaW50IG5ld1ZpZXdwb2ludCkgewotCQlQb2ludCBvbGRWaWV3cG9pbnQgPSB2aWV3cG9pbnQ7Ci0JCXZpZXdwb2ludCA9IG5ld1ZpZXdwb2ludDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQsIG9sZFZpZXdwb2ludCwgdmlld3BvaW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlhZ3JhbUxpbms+IGdldERpYWdyYW1MaW5rKCkgewotCQlpZiAoZGlhZ3JhbUxpbmsgPT0gbnVsbCkgewotCQkJZGlhZ3JhbUxpbmsgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q8RGlhZ3JhbUxpbms+KAotCQkJCQlEaWFncmFtTGluay5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbUxpbms7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0TmFtZXNwYWNlKCkgewotCQlpZiAobmFtZXNwYWNlICE9IG51bGwgJiYgKChFT2JqZWN0KSBuYW1lc3BhY2UpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGROYW1lc3BhY2UgPSAoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2U7Ci0JCQluYW1lc3BhY2UgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgZVJlc29sdmVQcm94eShvbGROYW1lc3BhY2UpOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBvbGROYW1lc3BhY2UpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3TmFtZXNwYWNlID0gKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGROYW1lc3BhY2UuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKG5ld05hbWVzcGFjZS5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdOYW1lc3BhY2UuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSwKLQkJCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG9sZE5hbWVzcGFjZSwKLQkJCQkJCQluYW1lc3BhY2UpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZW1hbnRpY01vZGVsQnJpZGdlIGJhc2ljR2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE5hbWVzcGFjZSgKLQkJCVNlbWFudGljTW9kZWxCcmlkZ2UgbmV3TmFtZXNwYWNlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCVNlbWFudGljTW9kZWxCcmlkZ2Ugb2xkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQluYW1lc3BhY2UgPSBuZXdOYW1lc3BhY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLAotCQkJCQlvbGROYW1lc3BhY2UsIG5ld05hbWVzcGFjZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU2VtYW50aWNNb2RlbEJyaWRnZSBuZXdOYW1lc3BhY2UpIHsKLQkJaWYgKG5ld05hbWVzcGFjZSAhPSBuYW1lc3BhY2UpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmFtZXNwYWNlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sCi0JCQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdOYW1lc3BhY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld05hbWVzcGFjZSkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNLAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXROYW1lc3BhY2UobmV3TmFtZXNwYWNlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIG5ld05hbWVzcGFjZSwgbmV3TmFtZXNwYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldERpYWdyYW1MaW5rKCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0U6Ci0JCQlpZiAobmFtZXNwYWNlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuYW1lc3BhY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0RGlhZ3JhbUxpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJcmV0dXJuIGJhc2ljU2V0TmFtZXNwYWNlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gZ2V0RGlhZ3JhbUxpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXROYW1lc3BhY2UoKTsKLQkJCXJldHVybiBiYXNpY0dldE5hbWVzcGFjZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXJldHVybiBnZXRab29tKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19WSUVXUE9JTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Vmlld3BvaW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRWaWV3cG9pbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LOgotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5jbGVhcigpOwotCQkJZ2V0RGlhZ3JhbUxpbmsoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEaWFncmFtTGluaz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXNldFpvb20oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJc2V0Vmlld3BvaW50KChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSzoKLQkJCWdldERpYWdyYW1MaW5rKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX05BTUVTUEFDRToKLQkJCXNldE5hbWVzcGFjZSgoU2VtYW50aWNNb2RlbEJyaWRnZSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19aT09NOgotCQkJc2V0Wm9vbShaT09NX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fX1ZJRVdQT0lOVDoKLQkJCXNldFZpZXdwb2ludCgoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTks6Ci0JCQlyZXR1cm4gZGlhZ3JhbUxpbmsgIT0gbnVsbCAmJiAhZGlhZ3JhbUxpbmsuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFOgotCQkJcmV0dXJuIG5hbWVzcGFjZSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fWk9PTToKLQkJCXJldHVybiBaT09NX0VERUZBVUxUID09IG51bGwgPyB6b29tICE9IG51bGwgOiAhWk9PTV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHpvb20pOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9fVklFV1BPSU5UOgotCQkJcmV0dXJuIHZpZXdwb2ludCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHpvb206ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoem9vbSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RpYWdyYW1JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUxpbmtJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlhZ3JhbUxpbmtJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMGZjOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0RpYWdyYW1MaW5rSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaWFncmFtIExpbms8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0Wm9vbSA8ZW0+Wm9vbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXRWaWV3cG9ydCA8ZW0+Vmlld3BvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaWFncmFtTGlua0ltcGwjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpYWdyYW1MaW5rSW1wbCNnZXRHcmFwaEVsZW1lbnQgPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtTGlua0ltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cyBEaWFncmFtTGluayB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Wm9vbSgpIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRab29tKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBaT09NX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFpvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Wm9vbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB6b29tID0gWk9PTV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZpZXdwb3J0KCkgPGVtPlZpZXdwb3J0PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWaWV3cG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvaW50IHZpZXdwb3J0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbSgpIDxlbT5EaWFncmFtPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhZ3JhbSBkaWFncmFtOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpYWdyYW1MaW5rSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElBR1JBTV9MSU5LOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0Wm9vbSgpIHsKLQkJcmV0dXJuIHpvb207Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Wm9vbShEb3VibGUgbmV3Wm9vbSkgewotCQlEb3VibGUgb2xkWm9vbSA9IHpvb207Ci0JCXpvb20gPSBuZXdab29tOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTSwgb2xkWm9vbSwgem9vbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRWaWV3cG9ydCgpIHsKLQkJaWYgKHZpZXdwb3J0ICE9IG51bGwgJiYgKChFT2JqZWN0KSB2aWV3cG9ydCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFZpZXdwb3J0ID0gKEludGVybmFsRU9iamVjdCkgdmlld3BvcnQ7Ci0JCQl2aWV3cG9ydCA9IChQb2ludCkgZVJlc29sdmVQcm94eShvbGRWaWV3cG9ydCk7Ci0JCQlpZiAodmlld3BvcnQgIT0gb2xkVmlld3BvcnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVCwgb2xkVmlld3BvcnQsCi0JCQkJCQkJdmlld3BvcnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdmlld3BvcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0Vmlld3BvcnQoKSB7Ci0JCXJldHVybiB2aWV3cG9ydDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaWV3cG9ydChQb2ludCBuZXdWaWV3cG9ydCkgewotCQlQb2ludCBvbGRWaWV3cG9ydCA9IHZpZXdwb3J0OwotCQl2aWV3cG9ydCA9IG5ld1ZpZXdwb3J0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQsIG9sZFZpZXdwb3J0LCB2aWV3cG9ydCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQsIG5ld0dyYXBoRWxlbWVudCwKLQkJCQkJbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGRpYWdyYW0gIT0gbnVsbCAmJiAoKEVPYmplY3QpIGRpYWdyYW0pLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGREaWFncmFtID0gKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbTsKLQkJCWRpYWdyYW0gPSAoRGlhZ3JhbSkgZVJlc29sdmVQcm94eShvbGREaWFncmFtKTsKLQkJCWlmIChkaWFncmFtICE9IG9sZERpYWdyYW0pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNLCBvbGREaWFncmFtLAotCQkJCQkJCWRpYWdyYW0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlhZ3JhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBiYXNpY0dldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaWFncmFtIG9sZERpYWdyYW0gPSBkaWFncmFtOwotCQlkaWFncmFtID0gbmV3RGlhZ3JhbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sCi0JCQkJCW9sZERpYWdyYW0sIG5ld0RpYWdyYW0pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhZ3JhbShEaWFncmFtIG5ld0RpYWdyYW0pIHsKLQkJaWYgKG5ld0RpYWdyYW0gIT0gZGlhZ3JhbSkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZGlhZ3JhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZGlhZ3JhbSkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fRElBR1JBTV9MSU5LLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdEaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19ESUFHUkFNX0xJTkssIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlhZ3JhbShuZXdEaWFncmFtLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU0sIG5ld0RpYWdyYW0sIG5ld0RpYWdyYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGRpYWdyYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLkRJQUdSQU1fX0RJQUdSQU1fTElOSywgRGlhZ3JhbS5jbGFzcywgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKChEaWFncmFtKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSywgR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJcmV0dXJuIGdldFpvb20oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fVklFV1BPUlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Vmlld3BvcnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZpZXdwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RGlhZ3JhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEdyYXBoRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fWk9PTToKLQkJCXNldFpvb20oKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXNldFZpZXdwb3J0KChQb2ludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1pPT006Ci0JCQlzZXRab29tKFpPT01fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19WSUVXUE9SVDoKLQkJCXNldFZpZXdwb3J0KChQb2ludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlzZXREaWFncmFtKChEaWFncmFtKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOS19fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19aT09NOgotCQkJcmV0dXJuIFpPT01fRURFRkFVTFQgPT0gbnVsbCA/IHpvb20gIT0gbnVsbCA6ICFaT09NX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoem9vbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX1ZJRVdQT1JUOgotCQkJcmV0dXJuIHZpZXdwb3J0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNX0xJTktfX0RJQUdSQU06Ci0JCQlyZXR1cm4gZGlhZ3JhbSAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh6b29tOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHpvb20pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EaWFncmFtTGlua0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaW1lbnNpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGltZW5zaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhhNDcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaW1lbnNpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS5pbXBsLk11bHRpUmVzb3VyY2VFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGltZW5zaW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGltZW5zaW9uSW1wbCNnZXRXaWR0aCA8ZW0+V2lkdGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5EaW1lbnNpb25JbXBsI2dldEhlaWdodCA8ZW0+SGVpZ2h0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGltZW5zaW9uSW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgRGltZW5zaW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXaWR0aCgpIDxlbT5XaWR0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2lkdGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRG91YmxlIFdJRFRIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdpZHRoKCkgPGVtPldpZHRoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXaWR0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB3aWR0aCA9IFdJRFRIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgSEVJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhlaWdodCgpIDxlbT5IZWlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhlaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBoZWlnaHQgPSBIRUlHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElNRU5TSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aChEb3VibGUgbmV3V2lkdGgpIHsKLQkJRG91YmxlIG9sZFdpZHRoID0gd2lkdGg7Ci0JCXdpZHRoID0gbmV3V2lkdGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRElNRU5TSU9OX19XSURUSCwgb2xkV2lkdGgsIHdpZHRoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KERvdWJsZSBuZXdIZWlnaHQpIHsKLQkJRG91YmxlIG9sZEhlaWdodCA9IGhlaWdodDsKLQkJaGVpZ2h0ID0gbmV3SGVpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hULCBvbGRIZWlnaHQsIGhlaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlyZXR1cm4gZ2V0V2lkdGgoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fSEVJR0hUOgotCQkJcmV0dXJuIGdldEhlaWdodCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJc2V0V2lkdGgoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlzZXRIZWlnaHQoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJTUVOU0lPTl9fV0lEVEg6Ci0JCQlzZXRXaWR0aChXSURUSF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX0hFSUdIVDoKLQkJCXNldEhlaWdodChIRUlHSFRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT05fX1dJRFRIOgotCQkJcmV0dXJuIFdJRFRIX0VERUZBVUxUID09IG51bGwgPyB3aWR0aCAhPSBudWxsIDogIVdJRFRIX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMod2lkdGgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElNRU5TSU9OX19IRUlHSFQ6Ci0JCQlyZXR1cm4gSEVJR0hUX0VERUZBVUxUID09IG51bGwgPyBoZWlnaHQgIT0gbnVsbCA6ICFIRUlHSFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhoZWlnaHQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdpZHRoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHdpZHRoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoZWlnaHQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaGVpZ2h0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGltZW5zaW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODNmMDcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Rpc2NpcGxpbmVHcm91cGluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lIEdyb3VwaW5nPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCNnZXREaXNjaXBsaW5lcyA8ZW0+RGlzY2lwbGluZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCURpc2NpcGxpbmVHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjaXBsaW5lcygpIDxlbT5EaXNjaXBsaW5lczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpc2NpcGxpbmU+IGRpc2NpcGxpbmVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERpc2NpcGxpbmVHcm91cGluZ0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkVfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGlzY2lwbGluZT4gZ2V0RGlzY2lwbGluZXMoKSB7Ci0JCWlmIChkaXNjaXBsaW5lcyA9PSBudWxsKSB7Ci0JCQlkaXNjaXBsaW5lcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RGlzY2lwbGluZT4oCi0JCQkJCURpc2NpcGxpbmUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVMpOwotCQl9Ci0JCXJldHVybiBkaXNjaXBsaW5lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCXJldHVybiBnZXREaXNjaXBsaW5lcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWdldERpc2NpcGxpbmVzKCkuY2xlYXIoKTsKLQkJCWdldERpc2NpcGxpbmVzKCkKLQkJCQkJLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUzoKLQkJCWdldERpc2NpcGxpbmVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORVM6Ci0JCQlyZXR1cm4gZGlzY2lwbGluZXMgIT0gbnVsbCAmJiAhZGlzY2lwbGluZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRGlzY2lwbGluZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY5ZjU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0VGFza3MgPGVtPlRhc2tzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0U3ViZGlzY2lwbGluZSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFJlZmVyZW5jZVdvcmtmbG93cyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFza3MoKSA8ZW0+VGFza3M8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFza3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUYXNrPiB0YXNrczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YmRpc2NpcGxpbmUoKSA8ZW0+U3ViZGlzY2lwbGluZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJkaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlzY2lwbGluZT4gc3ViZGlzY2lwbGluZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZVdvcmtmbG93cygpIDxlbT5SZWZlcmVuY2UgV29ya2Zsb3dzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZVdvcmtmbG93cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFjdGl2aXR5PiByZWZlcmVuY2VXb3JrZmxvd3M7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8VGFzaz4gZ2V0VGFza3MoKSB7Ci0JCWlmICh0YXNrcyA9PSBudWxsKSB7Ci0JCQl0YXNrcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VGFzaz4oVGFzay5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLUyk7Ci0JCX0KLQkJcmV0dXJuIHRhc2tzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERpc2NpcGxpbmU+IGdldFN1YmRpc2NpcGxpbmUoKSB7Ci0JCWlmIChzdWJkaXNjaXBsaW5lID09IG51bGwpIHsKLQkJCXN1YmRpc2NpcGxpbmUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPERpc2NpcGxpbmU+KAotCQkJCQlEaXNjaXBsaW5lLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkUpOwotCQl9Ci0JCXJldHVybiBzdWJkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEFjdGl2aXR5PiBnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKSB7Ci0JCWlmIChyZWZlcmVuY2VXb3JrZmxvd3MgPT0gbnVsbCkgewotCQkJcmVmZXJlbmNlV29ya2Zsb3dzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxBY3Rpdml0eT4oCi0JCQkJCUFjdGl2aXR5LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1MpOwotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VXb3JrZmxvd3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQkRJU0NJUExJTkU6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTdWJkaXNjaXBsaW5lKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJcmV0dXJuIGdldFRhc2tzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJcmV0dXJuIGdldFN1YmRpc2NpcGxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlyZXR1cm4gZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0tTOgotCQkJZ2V0VGFza3MoKS5jbGVhcigpOwotCQkJZ2V0VGFza3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFRhc2s+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlnZXRTdWJkaXNjaXBsaW5lKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPV1M6Ci0JCQlnZXRSZWZlcmVuY2VXb3JrZmxvd3MoKS5jbGVhcigpOwotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlnZXRUYXNrcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJESVNDSVBMSU5FOgotCQkJZ2V0U3ViZGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1dTOgotCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3dzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTS1M6Ci0JCQlyZXR1cm4gdGFza3MgIT0gbnVsbCAmJiAhdGFza3MuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCRElTQ0lQTElORToKLQkJCXJldHVybiBzdWJkaXNjaXBsaW5lICE9IG51bGwgJiYgIXN1YmRpc2NpcGxpbmUuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUzoKLQkJCXJldHVybiByZWZlcmVuY2VXb3JrZmxvd3MgIT0gbnVsbCAmJiAhcmVmZXJlbmNlV29ya2Zsb3dzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRG9tYWluSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTdlMGQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb21haW48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Eb21haW5JbXBsI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0U3ViZG9tYWlucyA8ZW0+U3ViZG9tYWluczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERvbWFpbkltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgRG9tYWluIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0cygpIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiB3b3JrUHJvZHVjdHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJkb21haW5zKCkgPGVtPlN1YmRvbWFpbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViZG9tYWlucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERvbWFpbj4gc3ViZG9tYWluczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuRE9NQUlOX19XT1JLX1BST0RVQ1RTKTsKLQkJfQotCQlyZXR1cm4gd29ya1Byb2R1Y3RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PERvbWFpbj4gZ2V0U3ViZG9tYWlucygpIHsKLQkJaWYgKHN1YmRvbWFpbnMgPT0gbnVsbCkgewotCQkJc3ViZG9tYWlucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8RG9tYWluPigKLQkJCQkJRG9tYWluLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YmRvbWFpbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YmRvbWFpbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlyZXR1cm4gZ2V0U3ViZG9tYWlucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTlM6Ci0JCQlnZXRTdWJkb21haW5zKCkuY2xlYXIoKTsKLQkJCWdldFN1YmRvbWFpbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERvbWFpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVFM6Ci0JCQlnZXRXb3JrUHJvZHVjdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU5TOgotCQkJZ2V0U3ViZG9tYWlucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUUzoKLQkJCXJldHVybiB3b3JrUHJvZHVjdHMgIT0gbnVsbCAmJiAhd29ya1Byb2R1Y3RzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOUzoKLQkJCXJldHVybiBzdWJkb21haW5zICE9IG51bGwgJiYgIXN1YmRvbWFpbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Eb21haW5JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzM3Y2FiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbGVtZW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMKLQkJRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVMRU1FTlQ7Ci0JfQotCi19IC8vRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9FbGxpcHNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmI2N2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VsbGlwc2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVsbGlwc2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRDZW50ZXIgPGVtPkNlbnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldFJhZGl1c1ggPGVtPlJhZGl1cyBYPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuRWxsaXBzZUltcGwjZ2V0UmFkaXVzWSA8ZW0+UmFkaXVzIFk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRSb3RhdGlvbiA8ZW0+Um90YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5FbGxpcHNlSW1wbCNnZXRTdGFydEFuZ2xlIDxlbT5TdGFydCBBbmdsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkVsbGlwc2VJbXBsI2dldEVuZEFuZ2xlIDxlbT5FbmQgQW5nbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGxpcHNlSW1wbCBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGltcGxlbWVudHMgRWxsaXBzZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDZW50ZXIoKSA8ZW0+Q2VudGVyPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDZW50ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBjZW50ZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWCgpIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgUkFESVVTX1hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWCgpIDxlbT5SYWRpdXMgWDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSByYWRpdXNYID0gUkFESVVTX1hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWSgpIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgUkFESVVTX1lfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFkaXVzWSgpIDxlbT5SYWRpdXMgWTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFkaXVzWSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSByYWRpdXNZID0gUkFESVVTX1lfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um90YXRpb24oKSA8ZW0+Um90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBST1RBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3RhdGlvbigpIDxlbT5Sb3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgcm90YXRpb24gPSBST1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydEFuZ2xlKCkgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBTVEFSVF9BTkdMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdGFydEFuZ2xlKCkgPGVtPlN0YXJ0IEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRG91YmxlIHN0YXJ0QW5nbGUgPSBTVEFSVF9BTkdMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbmRBbmdsZSgpIDxlbT5FbmQgQW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVuZEFuZ2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBFTkRfQU5HTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW5kQW5nbGUoKSA8ZW0+RW5kIEFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbmRBbmdsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSBlbmRBbmdsZSA9IEVORF9BTkdMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbGxpcHNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRUxMSVBTRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldFJhZGl1c1goKSB7Ci0JCXJldHVybiByYWRpdXNYOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhZGl1c1goRG91YmxlIG5ld1JhZGl1c1gpIHsKLQkJRG91YmxlIG9sZFJhZGl1c1ggPSByYWRpdXNYOwotCQlyYWRpdXNYID0gbmV3UmFkaXVzWDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWCwgb2xkUmFkaXVzWCwgcmFkaXVzWCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0UmFkaXVzWSgpIHsKLQkJcmV0dXJuIHJhZGl1c1k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFkaXVzWShEb3VibGUgbmV3UmFkaXVzWSkgewotCQlEb3VibGUgb2xkUmFkaXVzWSA9IHJhZGl1c1k7Ci0JCXJhZGl1c1kgPSBuZXdSYWRpdXNZOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZLCBvbGRSYWRpdXNZLCByYWRpdXNZKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRSb3RhdGlvbigpIHsKLQkJcmV0dXJuIHJvdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdGF0aW9uKERvdWJsZSBuZXdSb3RhdGlvbikgewotCQlEb3VibGUgb2xkUm90YXRpb24gPSByb3RhdGlvbjsKLQkJcm90YXRpb24gPSBuZXdSb3RhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTiwgb2xkUm90YXRpb24sIHJvdGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRTdGFydEFuZ2xlKCkgewotCQlyZXR1cm4gc3RhcnRBbmdsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEFuZ2xlKERvdWJsZSBuZXdTdGFydEFuZ2xlKSB7Ci0JCURvdWJsZSBvbGRTdGFydEFuZ2xlID0gc3RhcnRBbmdsZTsKLQkJc3RhcnRBbmdsZSA9IG5ld1N0YXJ0QW5nbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEUsIG9sZFN0YXJ0QW5nbGUsIHN0YXJ0QW5nbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG91YmxlIGdldEVuZEFuZ2xlKCkgewotCQlyZXR1cm4gZW5kQW5nbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kQW5nbGUoRG91YmxlIG5ld0VuZEFuZ2xlKSB7Ci0JCURvdWJsZSBvbGRFbmRBbmdsZSA9IGVuZEFuZ2xlOwotCQllbmRBbmdsZSA9IG5ld0VuZEFuZ2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkVMTElQU0VfX0VORF9BTkdMRSwgb2xkRW5kQW5nbGUsIGVuZEFuZ2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldENlbnRlcigpIHsKLQkJaWYgKGNlbnRlciAhPSBudWxsICYmICgoRU9iamVjdCkgY2VudGVyKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ2VudGVyID0gKEludGVybmFsRU9iamVjdCkgY2VudGVyOwotCQkJY2VudGVyID0gKFBvaW50KSBlUmVzb2x2ZVByb3h5KG9sZENlbnRlcik7Ci0JCQlpZiAoY2VudGVyICE9IG9sZENlbnRlcikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsIG9sZENlbnRlciwgY2VudGVyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNlbnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9pbnQgYmFzaWNHZXRDZW50ZXIoKSB7Ci0JCXJldHVybiBjZW50ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2VudGVyKFBvaW50IG5ld0NlbnRlcikgewotCQlQb2ludCBvbGRDZW50ZXIgPSBjZW50ZXI7Ci0JCWNlbnRlciA9IG5ld0NlbnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVIsIG9sZENlbnRlciwgY2VudGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fQ0VOVEVSOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldENlbnRlcigpOwotCQkJcmV0dXJuIGJhc2ljR2V0Q2VudGVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXJldHVybiBnZXRSYWRpdXNYKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXJldHVybiBnZXRSYWRpdXNZKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJCXJldHVybiBnZXRSb3RhdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fU1RBUlRfQU5HTEU6Ci0JCQlyZXR1cm4gZ2V0U3RhcnRBbmdsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJcmV0dXJuIGdldEVuZEFuZ2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXNldENlbnRlcigoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19YOgotCQkJc2V0UmFkaXVzWCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWToKLQkJCXNldFJhZGl1c1koKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlzZXRSb3RhdGlvbigoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19TVEFSVF9BTkdMRToKLQkJCXNldFN0YXJ0QW5nbGUoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJc2V0RW5kQW5nbGUoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX0NFTlRFUjoKLQkJCXNldENlbnRlcigoUG9pbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUkFESVVTX1g6Ci0JCQlzZXRSYWRpdXNYKFJBRElVU19YX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJc2V0UmFkaXVzWShSQURJVVNfWV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19ST1RBVElPTjoKLQkJCXNldFJvdGF0aW9uKFJPVEFUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJc2V0U3RhcnRBbmdsZShTVEFSVF9BTkdMRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19FTkRfQU5HTEU6Ci0JCQlzZXRFbmRBbmdsZShFTkRfQU5HTEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19DRU5URVI6Ci0JCQlyZXR1cm4gY2VudGVyICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5FTExJUFNFX19SQURJVVNfWDoKLQkJCXJldHVybiBSQURJVVNfWF9FREVGQVVMVCA9PSBudWxsID8gcmFkaXVzWCAhPSBudWxsCi0JCQkJCTogIVJBRElVU19YX0VERUZBVUxULmVxdWFscyhyYWRpdXNYKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1JBRElVU19ZOgotCQkJcmV0dXJuIFJBRElVU19ZX0VERUZBVUxUID09IG51bGwgPyByYWRpdXNZICE9IG51bGwKLQkJCQkJOiAhUkFESVVTX1lfRURFRkFVTFQuZXF1YWxzKHJhZGl1c1kpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fUk9UQVRJT046Ci0JCQlyZXR1cm4gUk9UQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJvdGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUk9UQVRJT05fRURFRkFVTFQuZXF1YWxzKHJvdGF0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0VfX1NUQVJUX0FOR0xFOgotCQkJcmV0dXJuIFNUQVJUX0FOR0xFX0VERUZBVUxUID09IG51bGwgPyBzdGFydEFuZ2xlICE9IG51bGwKLQkJCQkJOiAhU1RBUlRfQU5HTEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0QW5nbGUpOwotCQljYXNlIFVtYVBhY2thZ2UuRUxMSVBTRV9fRU5EX0FOR0xFOgotCQkJcmV0dXJuIEVORF9BTkdMRV9FREVGQVVMVCA9PSBudWxsID8gZW5kQW5nbGUgIT0gbnVsbAotCQkJCQk6ICFFTkRfQU5HTEVfRURFRkFVTFQuZXF1YWxzKGVuZEFuZ2xlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyYWRpdXNYOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHJhZGl1c1gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJhZGl1c1k6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmFkaXVzWSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcm90YXRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocm90YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN0YXJ0QW5nbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3RhcnRBbmdsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW5kQW5nbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZW5kQW5nbGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9FbGxpcHNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTk3NjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0VzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cwotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0JfQotCi19IC8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZmNhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRXhhbXBsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGFtcGxlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEV4YW1wbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4YW1wbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FWEFNUExFOwotCX0KLQotfSAvL0V4YW1wbGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRnVsZmlsbGFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0Z1bGZpbGxhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmZDNjYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvRnVsZmlsbGFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5GdWxmaWxsYWJsZUVsZW1lbnRJbXBsI2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEZ1bGZpbGxhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJRnVsZmlsbGFibGVFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZ1bGZpbGxzKCkgPGVtPkZ1bGZpbGxzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bGZpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBmdWxmaWxsczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBGdWxmaWxsYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5GVUxGSUxMQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZ2V0RnVsZmlsbHMoKSB7Ci0JCWlmIChmdWxmaWxscyA9PSBudWxsKSB7Ci0JCQlmdWxmaWxscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigKLQkJCQkJRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkZVTEZJTExBQkxFX0VMRU1FTlRfX0ZVTEZJTExTKTsKLQkJfQotCQlyZXR1cm4gZnVsZmlsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlnZXRGdWxmaWxscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEZ1bGZpbGxhYmxlRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCWdldEZ1bGZpbGxzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9GdWxmaWxsYWJsZUVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhDb25uZWN0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzRiZDMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoQ29ubmVjdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIENvbm5lY3RvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoQ29ubmVjdG9ySW1wbCNnZXRHcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaENvbm5lY3RvckltcGwjZ2V0R3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhDb25uZWN0b3JJbXBsIGV4dGVuZHMgR3JhcGhFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoQ29ubmVjdG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyYXBoRWRnZSgpIDxlbT5HcmFwaCBFZGdlPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyYXBoRWRnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEdyYXBoRWRnZT4gZ3JhcGhFZGdlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoQ29ubmVjdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfQ09OTkVDVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgZ2V0R3JhcGhFbGVtZW50KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEdyYXBoRWxlbWVudCkgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaEVsZW1lbnQgYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlSW50ZXJuYWxDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcmFwaEVsZW1lbnQsCi0JCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQsIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG5ld0dyYXBoRWxlbWVudCkgewotCQlpZiAobmV3R3JhcGhFbGVtZW50ICE9IGVJbnRlcm5hbENvbnRhaW5lcigpCi0JCQkJfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQgJiYgbmV3R3JhcGhFbGVtZW50ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgKEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFLAotCQkJCQkJR3JhcGhFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEdyYXBoRWxlbWVudChuZXdHcmFwaEVsZW1lbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCwgbmV3R3JhcGhFbGVtZW50LAotCQkJCQluZXdHcmFwaEVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHcmFwaEVkZ2U+IGdldEdyYXBoRWRnZSgpIHsKLQkJaWYgKGdyYXBoRWRnZSA9PSBudWxsKSB7Ci0JCQlncmFwaEVkZ2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QuTWFueUludmVyc2U8R3JhcGhFZGdlPigKLQkJCQkJR3JhcGhFZGdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1IpOwotCQl9Ci0JCXJldHVybiBncmFwaEVkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEdyYXBoRWRnZSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgb3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0R3JhcGhFZGdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXJGZWF0dXJlKAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwgR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUobXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuIGdldEdyYXBoRWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldEdyYXBoRWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRToKLQkJCWdldEdyYXBoRWRnZSgpLmNsZWFyKCk7Ci0JCQlnZXRHcmFwaEVkZ2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEdyYXBoRWRnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJZ2V0R3JhcGhFZGdlKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVDoKLQkJCXNldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FREdFOgotCQkJcmV0dXJuIGdyYXBoRWRnZSAhPSBudWxsICYmICFncmFwaEVkZ2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljR2V0R3JhcGhFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vR3JhcGhDb25uZWN0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWRnZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4ZTFlMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdyYXBoIEVkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVkZ2VJbXBsI2dldFdheXBvaW50cyA8ZW0+V2F5cG9pbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhFZGdlSW1wbCNnZXRBbmNob3IgPGVtPkFuY2hvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoRWRnZUltcGwgZXh0ZW5kcyBHcmFwaEVsZW1lbnRJbXBsIGltcGxlbWVudHMgR3JhcGhFZGdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdheXBvaW50cygpIDxlbT5XYXlwb2ludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V2F5cG9pbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UG9pbnQ+IHdheXBvaW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFuY2hvcigpIDxlbT5BbmNob3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QW5jaG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8R3JhcGhDb25uZWN0b3I+IGFuY2hvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHcmFwaEVkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSF9FREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEdyYXBoQ29ubmVjdG9yPiBnZXRBbmNob3IoKSB7Ci0JCWlmIChhbmNob3IgPT0gbnVsbCkgewotCQkJYW5jaG9yID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlPEdyYXBoQ29ubmVjdG9yPigKLQkJCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSk7Ci0JCX0KLQkJcmV0dXJuIGFuY2hvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQb2ludD4gZ2V0V2F5cG9pbnRzKCkgewotCQlpZiAod2F5cG9pbnRzID09IG51bGwpIHsKLQkJCXdheXBvaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UG9pbnQ+KAotCQkJCQlQb2ludC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFMpOwotCQl9Ci0JCXJldHVybiB3YXlwb2ludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEFuY2hvcigpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0V2F5cG9pbnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEFuY2hvcigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX1dBWVBPSU5UUzoKLQkJCXJldHVybiBnZXRXYXlwb2ludHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VER0VfX0FOQ0hPUjoKLQkJCXJldHVybiBnZXRBbmNob3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCWdldFdheXBvaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUG9pbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19BTkNIT1I6Ci0JCQlnZXRBbmNob3IoKS5jbGVhcigpOwotCQkJZ2V0QW5jaG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBHcmFwaENvbm5lY3Rvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFX19XQVlQT0lOVFM6Ci0JCQlnZXRXYXlwb2ludHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJZ2V0QW5jaG9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIHdheXBvaW50cyAhPSBudWxsICYmICF3YXlwb2ludHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRV9fQU5DSE9SOgotCQkJcmV0dXJuIGFuY2hvciAhPSBudWxsICYmICFhbmNob3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhM2VjYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGggRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0Q29udGFpbmVkIDxlbT5Db250YWluZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldFBvc2l0aW9uIDxlbT5Qb3NpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0TGluayA8ZW0+TGluazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkdyYXBoRWxlbWVudEltcGwjZ2V0QW5jaG9yYWdlIDxlbT5BbmNob3JhZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5HcmFwaEVsZW1lbnRJbXBsI2dldFNlbWFudGljTW9kZWwgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR3JhcGhFbGVtZW50SW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb250YWluZWQoKSA8ZW0+Q29udGFpbmVkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnRhaW5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW1FbGVtZW50PiBjb250YWluZWQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3NpdGlvbigpIDxlbT5Qb3NpdGlvbjwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludCBwb3NpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmsoKSA8ZW0+TGluazwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMaW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGlhZ3JhbUxpbms+IGxpbms7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbmNob3JhZ2UoKSA8ZW0+QW5jaG9yYWdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFuY2hvcmFnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEdyYXBoQ29ubmVjdG9yPiBhbmNob3JhZ2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZW1hbnRpY01vZGVsKCkgPGVtPlNlbWFudGljIE1vZGVsPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZW1hbnRpY01vZGVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZSBzZW1hbnRpY01vZGVsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdSQVBIX0VMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGdldFBvc2l0aW9uKCkgewotCQlpZiAocG9zaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHBvc2l0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3NpdGlvbjsKLQkJCXBvc2l0aW9uID0gKFBvaW50KSBlUmVzb2x2ZVByb3h5KG9sZFBvc2l0aW9uKTsKLQkJCWlmIChwb3NpdGlvbiAhPSBvbGRQb3NpdGlvbikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTiwgb2xkUG9zaXRpb24sCi0JCQkJCQkJcG9zaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGJhc2ljR2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3NpdGlvbihQb2ludCBuZXdQb3NpdGlvbikgewotCQlQb2ludCBvbGRQb3NpdGlvbiA9IHBvc2l0aW9uOwotCQlwb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OLCBvbGRQb3NpdGlvbiwgcG9zaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtRWxlbWVudD4gZ2V0Q29udGFpbmVkKCkgewotCQlpZiAoY29udGFpbmVkID09IG51bGwpIHsKLQkJCWNvbnRhaW5lZCA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxEaWFncmFtRWxlbWVudD4oCi0JCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRCwKLQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX0NPTlRBSU5FUik7Ci0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtTGluaz4gZ2V0TGluaygpIHsKLQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJbGluayA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxEaWFncmFtTGluaz4oCi0JCQkJCURpYWdyYW1MaW5rLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTkssCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9MSU5LX19HUkFQSF9FTEVNRU5UKTsKLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxHcmFwaENvbm5lY3Rvcj4gZ2V0QW5jaG9yYWdlKCkgewotCQlpZiAoYW5jaG9yYWdlID09IG51bGwpIHsKLQkJCWFuY2hvcmFnZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0LlJlc29sdmluZzxHcmFwaENvbm5lY3Rvcj4oCi0JCQkJCUdyYXBoQ29ubmVjdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRSwKLQkJCQkJVW1hUGFja2FnZS5HUkFQSF9DT05ORUNUT1JfX0dSQVBIX0VMRU1FTlQpOwotCQl9Ci0JCXJldHVybiBhbmNob3JhZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlbWFudGljTW9kZWxCcmlkZ2UgZ2V0U2VtYW50aWNNb2RlbCgpIHsKLQkJaWYgKHNlbWFudGljTW9kZWwgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHNlbWFudGljTW9kZWwpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRTZW1hbnRpY01vZGVsID0gKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbDsKLQkJCXNlbWFudGljTW9kZWwgPSAoU2VtYW50aWNNb2RlbEJyaWRnZSkgZVJlc29sdmVQcm94eShvbGRTZW1hbnRpY01vZGVsKTsKLQkJCWlmIChzZW1hbnRpY01vZGVsICE9IG9sZFNlbWFudGljTW9kZWwpIHsKLQkJCQlJbnRlcm5hbEVPYmplY3QgbmV3U2VtYW50aWNNb2RlbCA9IChJbnRlcm5hbEVPYmplY3QpIHNlbWFudGljTW9kZWw7Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFNlbWFudGljTW9kZWwuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbnVsbCk7Ci0JCQkJaWYgKG5ld1NlbWFudGljTW9kZWwuZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3U2VtYW50aWNNb2RlbC5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJCVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQkJCW9sZFNlbWFudGljTW9kZWwsIHNlbWFudGljTW9kZWwpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VtYW50aWNNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VtYW50aWNNb2RlbEJyaWRnZSBiYXNpY0dldFNlbWFudGljTW9kZWwoKSB7Ci0JCXJldHVybiBzZW1hbnRpY01vZGVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlbWFudGljTW9kZWwoCi0JCQlTZW1hbnRpY01vZGVsQnJpZGdlIG5ld1NlbWFudGljTW9kZWwsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJU2VtYW50aWNNb2RlbEJyaWRnZSBvbGRTZW1hbnRpY01vZGVsID0gc2VtYW50aWNNb2RlbDsKLQkJc2VtYW50aWNNb2RlbCA9IG5ld1NlbWFudGljTW9kZWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwsCi0JCQkJCW9sZFNlbWFudGljTW9kZWwsIG5ld1NlbWFudGljTW9kZWwpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VtYW50aWNNb2RlbChTZW1hbnRpY01vZGVsQnJpZGdlIG5ld1NlbWFudGljTW9kZWwpIHsKLQkJaWYgKG5ld1NlbWFudGljTW9kZWwgIT0gc2VtYW50aWNNb2RlbCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3U2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U2VtYW50aWNNb2RlbCkuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5ULAotCQkJCQkJU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZW1hbnRpY01vZGVsKG5ld1NlbWFudGljTW9kZWwsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLCBuZXdTZW1hbnRpY01vZGVsLAotCQkJCQluZXdTZW1hbnRpY01vZGVsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0NPTlRBSU5FRDoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldENvbnRhaW5lZCgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldExpbmsoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEFuY2hvcmFnZSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlpZiAoc2VtYW50aWNNb2RlbCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc2VtYW50aWNNb2RlbCkuZUludmVyc2VSZW1vdmUodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTZW1hbnRpY01vZGVsKChTZW1hbnRpY01vZGVsQnJpZGdlKSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDb250YWluZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldExpbmsoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0QW5jaG9yYWdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJcmV0dXJuIGJhc2ljU2V0U2VtYW50aWNNb2RlbChudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJcmV0dXJuIGdldENvbnRhaW5lZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc2l0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19MSU5LOgotCQkJcmV0dXJuIGdldExpbmsoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCXJldHVybiBnZXRBbmNob3JhZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFNlbWFudGljTW9kZWwoKTsKLQkJCXJldHVybiBiYXNpY0dldFNlbWFudGljTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJZ2V0Q29udGFpbmVkKCkuY2xlYXIoKTsKLQkJCWdldENvbnRhaW5lZCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIERpYWdyYW1FbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fUE9TSVRJT046Ci0JCQlzZXRQb3NpdGlvbigoUG9pbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlnZXRMaW5rKCkuY2xlYXIoKTsKLQkJCWdldExpbmsoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpYWdyYW1MaW5rPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJZ2V0QW5jaG9yYWdlKCkuY2xlYXIoKTsKLQkJCWdldEFuY2hvcmFnZSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEdyYXBoQ29ubmVjdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlzZXRTZW1hbnRpY01vZGVsKChTZW1hbnRpY01vZGVsQnJpZGdlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQ09OVEFJTkVEOgotCQkJZ2V0Q29udGFpbmVkKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1BPU0lUSU9OOgotCQkJc2V0UG9zaXRpb24oKFBvaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0xJTks6Ci0JCQlnZXRMaW5rKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX0FOQ0hPUkFHRToKLQkJCWdldEFuY2hvcmFnZSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTDoKLQkJCXNldFNlbWFudGljTW9kZWwoKFNlbWFudGljTW9kZWxCcmlkZ2UpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19DT05UQUlORUQ6Ci0JCQlyZXR1cm4gY29udGFpbmVkICE9IG51bGwgJiYgIWNvbnRhaW5lZC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19QT1NJVElPTjoKLQkJCXJldHVybiBwb3NpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fTElOSzoKLQkJCXJldHVybiBsaW5rICE9IG51bGwgJiYgIWxpbmsuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fQU5DSE9SQUdFOgotCQkJcmV0dXJuIGFuY2hvcmFnZSAhPSBudWxsICYmICFhbmNob3JhZ2UuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUw6Ci0JCQlyZXR1cm4gc2VtYW50aWNNb2RlbCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaEVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0dyYXBoTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiODk2NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhOb2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HcmFwaCBOb2RlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuR3JhcGhOb2RlSW1wbCNnZXRTaXplIDxlbT5TaXplPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhOb2RlSW1wbCBleHRlbmRzIEdyYXBoRWxlbWVudEltcGwgaW1wbGVtZW50cyBHcmFwaE5vZGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGltZW5zaW9uIHNpemU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3JhcGhOb2RlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1JBUEhfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGltZW5zaW9uIGdldFNpemUoKSB7Ci0JCWlmIChzaXplICE9IG51bGwgJiYgKChFT2JqZWN0KSBzaXplKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU2l6ZSA9IChJbnRlcm5hbEVPYmplY3QpIHNpemU7Ci0JCQlzaXplID0gKERpbWVuc2lvbikgZVJlc29sdmVQcm94eShvbGRTaXplKTsKLQkJCWlmIChzaXplICE9IG9sZFNpemUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwgb2xkU2l6ZSwgc2l6ZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaW1lbnNpb24gYmFzaWNHZXRTaXplKCkgewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXplKERpbWVuc2lvbiBuZXdTaXplKSB7Ci0JCURpbWVuc2lvbiBvbGRTaXplID0gc2l6ZTsKLQkJc2l6ZSA9IG5ld1NpemU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRSwgb2xkU2l6ZSwgc2l6ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0U2l6ZSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U2l6ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFX19TSVpFOgotCQkJc2V0U2l6ZSgoRGltZW5zaW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERV9fU0laRToKLQkJCXNldFNpemUoKERpbWVuc2lvbikgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdSQVBIX05PREVfX1NJWkU6Ci0JCQlyZXR1cm4gc2l6ZSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9HcmFwaE5vZGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3JhcGhpY1ByaW1pdGl2ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkwYzBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HcmFwaGljUHJpbWl0aXZlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JhcGhpYyBQcmltaXRpdmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHcmFwaGljUHJpbWl0aXZlSW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCUdyYXBoaWNQcmltaXRpdmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEdyYXBoaWNQcmltaXRpdmVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HUkFQSElDX1BSSU1JVElWRTsKLQl9Ci0KLX0gLy9HcmFwaGljUHJpbWl0aXZlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0NWZkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsI2dldEF0dGFjaG1lbnRzIDxlbT5BdHRhY2htZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCUd1aWRhbmNlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dGFjaG1lbnRzKCkgPGVtPkF0dGFjaG1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUQUNITUVOVFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dGFjaG1lbnRzKCkgPGVtPkF0dGFjaG1lbnRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRhY2htZW50cyA9IEFUVEFDSE1FTlRTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dGFjaG1lbnRzKCkgewotCQlyZXR1cm4gYXR0YWNobWVudHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0YWNobWVudHMoU3RyaW5nIG5ld0F0dGFjaG1lbnRzKSB7Ci0JCVN0cmluZyBvbGRBdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzOwotCQlhdHRhY2htZW50cyA9IG5ld0F0dGFjaG1lbnRzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUywKLQkJCQkJb2xkQXR0YWNobWVudHMsIGF0dGFjaG1lbnRzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTOgotCQkJcmV0dXJuIGdldEF0dGFjaG1lbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXNldEF0dGFjaG1lbnRzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVFM6Ci0JCQlzZXRBdHRhY2htZW50cyhBVFRBQ0hNRU5UU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UUzoKLQkJCXJldHVybiBBVFRBQ0hNRU5UU19FREVGQVVMVCA9PSBudWxsID8gYXR0YWNobWVudHMgIT0gbnVsbAotCQkJCQk6ICFBVFRBQ0hNRU5UU19FREVGQVVMVC5lcXVhbHMoYXR0YWNobWVudHMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dGFjaG1lbnRzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGF0dGFjaG1lbnRzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY0Y2YyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGFuY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHdWlkYW5jZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlHdWlkYW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgR3VpZGFuY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5HVUlEQU5DRTsKLQl9Ci0KLX0gLy9HdWlkYW5jZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBlNzJjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9HdWlkZWxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEd1aWRlbGluZUltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBHdWlkZWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQl9Ci0KLX0gLy9HdWlkZWxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSW1hZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNjJjZDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0ltYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW1hZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwjZ2V0VXJpIDxlbT5Vcmk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5JbWFnZUltcGwjZ2V0TWltZVR5cGUgPGVtPk1pbWUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEltYWdlSW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEltYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVVJJIFVSSV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcmkoKSA8ZW0+VXJpPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcmkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBVUkkgdXJpID0gVVJJX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbWVUeXBlKCkgPGVtPk1pbWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWltZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfVFlQRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWltZVR5cGUoKSA8ZW0+TWltZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaW1lVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtaW1lVHlwZSA9IE1JTUVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklNQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVUkkgZ2V0VXJpKCkgewotCQlyZXR1cm4gdXJpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShVUkkgbmV3VXJpKSB7Ci0JCVVSSSBvbGRVcmkgPSB1cmk7Ci0JCXVyaSA9IG5ld1VyaTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5JTUFHRV9fVVJJLCBvbGRVcmksIHVyaSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBtaW1lVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW1lVHlwZShTdHJpbmcgbmV3TWltZVR5cGUpIHsKLQkJU3RyaW5nIG9sZE1pbWVUeXBlID0gbWltZVR5cGU7Ci0JCW1pbWVUeXBlID0gbmV3TWltZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuSU1BR0VfX01JTUVfVFlQRSwgb2xkTWltZVR5cGUsIG1pbWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX1VSSToKLQkJCXJldHVybiBnZXRVcmkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0TWltZVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0VfX1VSSToKLQkJCXNldFVyaSgoVVJJKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fTUlNRV9UWVBFOgotCQkJc2V0TWltZVR5cGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19VUkk6Ci0JCQlzZXRVcmkoVVJJX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlzZXRNaW1lVHlwZShNSU1FX1RZUEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRV9fVVJJOgotCQkJcmV0dXJuIFVSSV9FREVGQVVMVCA9PSBudWxsID8gdXJpICE9IG51bGwgOiAhVVJJX0VERUZBVUxUCi0JCQkJCS5lcXVhbHModXJpKTsKLQkJY2FzZSBVbWFQYWNrYWdlLklNQUdFX19NSU1FX1RZUEU6Ci0JCQlyZXR1cm4gTUlNRV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBtaW1lVHlwZSAhPSBudWxsCi0JCQkJCTogIU1JTUVfVFlQRV9FREVGQVVMVC5lcXVhbHMobWltZVR5cGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVyaTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1cmkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1pbWVUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKG1pbWVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vSW1hZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwZWU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JdGVyYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRpb25JbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgSXRlcmF0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5JVEVSQVRJT047Ci0JfQotCi19IC8vSXRlcmF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0tpbmRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvS2luZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhYWVkYi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvS2luZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+S2luZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLktpbmRJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEtpbmRJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgS2luZCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvPiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBLaW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCWlmIChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9PSBudWxsKSB7Ci0JCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8QXBwbGljYWJsZU1ldGFDbGFzc0luZm8+KAotCQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0JCX0KLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5jbGVhcigpOwotCQkJZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm8gIT0gbnVsbAotCQkJCQkmJiAhYXBwbGljYWJsZU1ldGFDbGFzc0luZm8uaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9LaW5kSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL0xlYWZFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWEyMzg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9MZWFmRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MZWFmIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMZWFmRWxlbWVudEltcGwgZXh0ZW5kcyBEaWFncmFtRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlMZWFmRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTGVhZkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5MRUFGX0VMRU1FTlQ7Ci0JfQotCi19IC8vTGVhZkVsZW1lbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQ1MzdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbiA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRQcm9jZXNzVmlld3MgPGVtPlByb2Nlc3MgVmlld3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QmFzZUNvbmZpZ3VyYXRpb25zIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0QWRkZWRDYXRlZ29yeSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKSA8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGFja2FnZT4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NWaWV3cygpIDxlbT5Qcm9jZXNzIFZpZXdzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NWaWV3cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gcHJvY2Vzc1ZpZXdzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZpZXcoKSA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRDYXRlZ29yeSBkZWZhdWx0VmlldzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhc2VDb25maWd1cmF0aW9ucygpIDxlbT5CYXNlIENvbmZpZ3VyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2VDb25maWd1cmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGJhc2VDb25maWd1cmF0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRDYXRlZ29yeT4gc3VidHJhY3RlZENhdGVnb3J5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkZWRDYXRlZ29yeSgpIDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRlZENhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29udGVudENhdGVnb3J5PiBhZGRlZENhdGVnb3J5OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfQ09ORklHVVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBsdWdpblNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RQbHVnaW5TZWxlY3Rpb24gPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZFBsdWdpbj4oCi0JCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kUGFja2FnZT4oCi0JCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VTZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Q29udGVudENhdGVnb3J5PiBnZXRQcm9jZXNzVmlld3MoKSB7Ci0JCWlmIChwcm9jZXNzVmlld3MgPT0gbnVsbCkgewotCQkJcHJvY2Vzc1ZpZXdzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDb250ZW50Q2F0ZWdvcnk+KAotCQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1MpOwotCQl9Ci0JCXJldHVybiBwcm9jZXNzVmlld3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBnZXREZWZhdWx0VmlldygpIHsKLQkJaWYgKGRlZmF1bHRWaWV3ICE9IG51bGwgJiYgKChFT2JqZWN0KSBkZWZhdWx0VmlldykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlZmF1bHRWaWV3ID0gKEludGVybmFsRU9iamVjdCkgZGVmYXVsdFZpZXc7Ci0JCQlkZWZhdWx0VmlldyA9IChDb250ZW50Q2F0ZWdvcnkpIGVSZXNvbHZlUHJveHkob2xkRGVmYXVsdFZpZXcpOwotCQkJaWYgKGRlZmF1bHRWaWV3ICE9IG9sZERlZmF1bHRWaWV3KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsCi0JCQkJCQkJb2xkRGVmYXVsdFZpZXcsIGRlZmF1bHRWaWV3KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50Q2F0ZWdvcnkgYmFzaWNHZXREZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIGRlZmF1bHRWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWaWV3KENvbnRlbnRDYXRlZ29yeSBuZXdEZWZhdWx0VmlldykgewotCQlDb250ZW50Q2F0ZWdvcnkgb2xkRGVmYXVsdFZpZXcgPSBkZWZhdWx0VmlldzsKLQkJZGVmYXVsdFZpZXcgPSBuZXdEZWZhdWx0VmlldzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXLAotCQkJCQlvbGREZWZhdWx0VmlldywgZGVmYXVsdFZpZXcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRCYXNlQ29uZmlndXJhdGlvbnMoKSB7Ci0JCWlmIChiYXNlQ29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewotCQkJYmFzZUNvbmZpZ3VyYXRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPigKLQkJCQkJTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJaWYgKHN1YnRyYWN0ZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlzdWJ0cmFjdGVkQ2F0ZWdvcnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbnRlbnRDYXRlZ29yeT4oCi0JCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSk7Ci0JCX0KLQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldEFkZGVkQ2F0ZWdvcnkoKSB7Ci0JCWlmIChhZGRlZENhdGVnb3J5ID09IG51bGwpIHsKLQkJCWFkZGVkQ2F0ZWdvcnkgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PENvbnRlbnRDYXRlZ29yeT4oCi0JCQkJCUNvbnRlbnRDYXRlZ29yeS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBhZGRlZENhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT046Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlyZXR1cm4gZ2V0UHJvY2Vzc1ZpZXdzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERlZmF1bHRWaWV3KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREZWZhdWx0VmlldygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0QmFzZUNvbmZpZ3VyYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCXJldHVybiBnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWToKLQkJCXJldHVybiBnZXRBZGRlZENhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGFja2FnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTOgotCQkJZ2V0UHJvY2Vzc1ZpZXdzKCkuY2xlYXIoKTsKLQkJCWdldFByb2Nlc3NWaWV3cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRDYXRlZ29yeT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQlzZXREZWZhdWx0VmlldygoQ29udGVudENhdGVnb3J5KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCWdldEJhc2VDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRCYXNlQ29uZmlndXJhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlk6Ci0JCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlnZXRBZGRlZENhdGVnb3J5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udGVudENhdGVnb3J5PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCWdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXUzoKLQkJCWdldFByb2Nlc3NWaWV3cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJc2V0RGVmYXVsdFZpZXcoKENvbnRlbnRDYXRlZ29yeSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCWdldEJhc2VDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQlnZXRBZGRlZENhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OOgotCQkJcmV0dXJuIG1ldGhvZFBsdWdpblNlbGVjdGlvbiAhPSBudWxsCi0JCQkJCSYmICFtZXRob2RQbHVnaW5TZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCXJldHVybiBtZXRob2RQYWNrYWdlU2VsZWN0aW9uICE9IG51bGwKLQkJCQkJJiYgIW1ldGhvZFBhY2thZ2VTZWxlY3Rpb24uaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFV1M6Ci0JCQlyZXR1cm4gcHJvY2Vzc1ZpZXdzICE9IG51bGwgJiYgIXByb2Nlc3NWaWV3cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJcmV0dXJuIGRlZmF1bHRWaWV3ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbnMgIT0gbnVsbCAmJiAhYmFzZUNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIHN1YnRyYWN0ZWRDYXRlZ29yeSAhPSBudWxsICYmICFzdWJ0cmFjdGVkQ2F0ZWdvcnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhYWRkZWRDYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01ldGhvZENvbmZpZ3VyYXRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjdmMjZhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0R3VpZCA8ZW0+R3VpZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPd25lZFJ1bGVzIDxlbT5Pd25lZCBSdWxlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0U3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kRWxlbWVudEltcGwgZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3VpZCgpIDxlbT5HdWlkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHdWlkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHVUlEX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEd1aWQoKSA8ZW0+R3VpZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3VpZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBndWlkID0gR1VJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCcmllZkRlc2NyaXB0aW9uKCkgPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE93bmVkUnVsZXMoKSA8ZW0+T3duZWQgUnVsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3duZWRSdWxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnN0cmFpbnQ+IG93bmVkUnVsZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEtpbmQ+IGtpbmQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwcHJlc3NlZCgpIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gU1VQUFJFU1NFRF9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1cHByZXNzZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHN1cHByZXNzZWQgPSBTVVBQUkVTU0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9yZGVyaW5nR3VpZGUoKSA8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb3JkZXJpbmdHdWlkZSA9IE9SREVSSU5HX0dVSURFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R3VpZCgpIHsKLQkJaWYgKGd1aWQgPT0gbnVsbCB8fCBndWlkLmxlbmd0aCgpID09IDApIHsKLQkJCWd1aWQgPSBVbWFVdGlsLmdlbmVyYXRlR1VJRCgpOwotCQl9Ci0JCXJldHVybiBndWlkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0R3VpZChTdHJpbmcgbmV3R3VpZCkgewotCQlTdHJpbmcgb2xkR3VpZCA9IGd1aWQ7Ci0JCWd1aWQgPSBuZXdHdWlkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlELCBvbGRHdWlkLCBndWlkKSk7Ci0KLQkJLy8gc3luY2ggdXAgdGhlIHJlc291cmNlJ3MgSURUb0VPYmplY3RNYXAgYW5kIEVPYmplY3RUb0lETWFwIHdpdGggbmV3R3VpZAotCQkvLwotCQlpZiAoZVJlc291cmNlKCkgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZSkgewotCQkJWE1MUmVzb3VyY2UgcmVzb3VyY2UgPSAoKFhNTFJlc291cmNlKSBlUmVzb3VyY2UoKSk7Ci0JCQlyZXNvdXJjZS5zZXRJRCh0aGlzLCBuZXdHdWlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcgbmV3UHJlc2VudGF0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkUHJlc2VudGF0aW9uTmFtZSA9IHByZXNlbnRhdGlvbk5hbWU7Ci0JCXByZXNlbnRhdGlvbk5hbWUgPSBuZXdQcmVzZW50YXRpb25OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwKLQkJCQkJb2xkUHJlc2VudGF0aW9uTmFtZSwgcHJlc2VudGF0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGJyaWVmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgbmV3QnJpZWZEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQnJpZWZEZXNjcmlwdGlvbiA9IGJyaWVmRGVzY3JpcHRpb247Ci0JCWJyaWVmRGVzY3JpcHRpb24gPSBuZXdCcmllZkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiwKLQkJCQkJb2xkQnJpZWZEZXNjcmlwdGlvbiwgYnJpZWZEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZXMoKSB7Ci0JCWlmIChvd25lZFJ1bGVzID09IG51bGwpIHsKLQkJCW93bmVkUnVsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPENvbnN0cmFpbnQ+KAotCQkJCQlDb25zdHJhaW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCX0KLQkJcmV0dXJuIG93bmVkUnVsZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8TWV0aG9kRWxlbWVudFByb3BlcnR5PiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSB7Ci0JCWlmIChtZXRob2RFbGVtZW50UHJvcGVydHkgPT0gbnVsbCkgewotCQkJbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RFbGVtZW50UHJvcGVydHk+KAotCQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEtpbmQ+IGdldEtpbmQoKSB7Ci0JCWlmIChraW5kID09IG51bGwpIHsKLQkJCWtpbmQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEtpbmQ+KEtpbmQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0tJTkQpOwotCQl9Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFN1cHByZXNzZWQoKSB7Ci0JCXJldHVybiBzdXBwcmVzc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cHByZXNzZWQoQm9vbGVhbiBuZXdTdXBwcmVzc2VkKSB7Ci0JCUJvb2xlYW4gb2xkU3VwcHJlc3NlZCA9IHN1cHByZXNzZWQ7Ci0JCXN1cHByZXNzZWQgPSBuZXdTdXBwcmVzc2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCBvbGRTdXBwcmVzc2VkLAotCQkJCQlzdXBwcmVzc2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gb3JkZXJpbmdHdWlkZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyBuZXdPcmRlcmluZ0d1aWRlKSB7Ci0JCVN0cmluZyBvbGRPcmRlcmluZ0d1aWRlID0gb3JkZXJpbmdHdWlkZTsKLQkJb3JkZXJpbmdHdWlkZSA9IG5ld09yZGVyaW5nR3VpZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLAotCQkJCQlvbGRPcmRlcmluZ0d1aWRlLCBvcmRlcmluZ0d1aWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldE93bmVkUnVsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJcmV0dXJuIGdldEd1aWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRToKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gZ2V0QnJpZWZEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJcmV0dXJuIGdldE93bmVkUnVsZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJcmV0dXJuIGdldEtpbmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJcmV0dXJuIGdldFN1cHByZXNzZWQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXJldHVybiBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HVUlEOgotCQkJc2V0R3VpZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlzZXRQcmVzZW50YXRpb25OYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJZ2V0T3duZWRSdWxlcygpLmNsZWFyKCk7Ci0JCQlnZXRPd25lZFJ1bGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25zdHJhaW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkuY2xlYXIoKTsKLQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19LSU5EOgotCQkJZ2V0S2luZCgpLmNsZWFyKCk7Ci0JCQlnZXRLaW5kKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBLaW5kPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQlzZXRTdXBwcmVzc2VkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU6Ci0JCQlzZXRPcmRlcmluZ0d1aWRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXNldEd1aWQoR1VJRF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQlzZXRQcmVzZW50YXRpb25OYW1lKFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCXNldEJyaWVmRGVzY3JpcHRpb24oQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJZ2V0T3duZWRSdWxlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0tJTkQ6Ci0JCQlnZXRLaW5kKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJc2V0U3VwcHJlc3NlZChTVVBQUkVTU0VEX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCXNldE9yZGVyaW5nR3VpZGUoT1JERVJJTkdfR1VJREVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1VJRDoKLQkJCXJldHVybiBHVUlEX0VERUZBVUxUID09IG51bGwgPyBndWlkICE9IG51bGwgOiAhR1VJRF9FREVGQVVMVAotCQkJCQkuZXF1YWxzKGd1aWQpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb25OYW1lICE9IG51bGwKLQkJCQkJOiAhUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIEJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBicmllZkRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGJyaWVmRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEVTOgotCQkJcmV0dXJuIG93bmVkUnVsZXMgIT0gbnVsbCAmJiAhb3duZWRSdWxlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5ICE9IG51bGwKLQkJCQkJJiYgIW1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fS0lORDoKLQkJCXJldHVybiBraW5kICE9IG51bGwgJiYgIWtpbmQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQlyZXR1cm4gU1VQUFJFU1NFRF9FREVGQVVMVCA9PSBudWxsID8gc3VwcHJlc3NlZCAhPSBudWxsCi0JCQkJCTogIVNVUFBSRVNTRURfRURFRkFVTFQuZXF1YWxzKHN1cHByZXNzZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJcmV0dXJuIE9SREVSSU5HX0dVSURFX0VERUZBVUxUID09IG51bGwgPyBvcmRlcmluZ0d1aWRlICE9IG51bGwKLQkJCQkJOiAhT1JERVJJTkdfR1VJREVfRURFRkFVTFQuZXF1YWxzKG9yZGVyaW5nR3VpZGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGd1aWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ3VpZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJlc2VudGF0aW9uTmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmVzZW50YXRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBicmllZkRlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJyaWVmRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cHByZXNzZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3VwcHJlc3NlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3JkZXJpbmdHdWlkZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChvcmRlcmluZ0d1aWRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDEyZThlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlNZXRob2RFbGVtZW50UHJvcGVydHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTI5ODJkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZFBsdWdpbnMgPGVtPk1ldGhvZCBQbHVnaW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zIDxlbT5QcmVkZWZpbmVkIENvbmZpZ3VyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZExpYnJhcnkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2lucygpIDxlbT5NZXRob2QgUGx1Z2luczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQbHVnaW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGx1Z2luPiBtZXRob2RQbHVnaW5zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkgPGVtPlByZWRlZmluZWQgQ29uZmlndXJhdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQbHVnaW4+IGdldE1ldGhvZFBsdWdpbnMoKSB7Ci0JCWlmIChtZXRob2RQbHVnaW5zID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZFBsdWdpbj4oCi0JCQkJCU1ldGhvZFBsdWdpbi5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpIHsKLQkJaWYgKHByZWRlZmluZWRDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQlwcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZENvbmZpZ3VyYXRpb24+KAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRNZXRob2RQbHVnaW5zKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2lucygpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCWdldE1ldGhvZFBsdWdpbnMoKS5jbGVhcigpOwotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBsdWdpbj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19QUkVERUZJTkVEX0NPTkZJR1VSQVRJT05TOgotCQkJZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU5TOgotCQkJZ2V0TWV0aG9kUGx1Z2lucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fUFJFREVGSU5FRF9DT05GSUdVUkFUSU9OUzoKLQkJCWdldFByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUzoKLQkJCXJldHVybiBtZXRob2RQbHVnaW5zICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpbnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlM6Ci0JCQlyZXR1cm4gcHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIXByZWRlZmluZWRDb25maWd1cmF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01ldGhvZExpYnJhcnlJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjlkZWRhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsI2dldFJldXNlZFBhY2thZ2VzIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRDaGlsZFBhY2thZ2VzIDxlbT5DaGlsZCBQYWNrYWdlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1ldGhvZFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHbG9iYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBHTE9CQUxfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R2xvYmFsKCkgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXVzZWRQYWNrYWdlcygpIDxlbT5SZXVzZWQgUGFja2FnZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV1c2VkUGFja2FnZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQYWNrYWdlPiByZXVzZWRQYWNrYWdlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoaWxkUGFja2FnZXMoKSA8ZW0+Q2hpbGQgUGFja2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hpbGRQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBhY2thZ2U+IGNoaWxkUGFja2FnZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEdsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWwoQm9vbGVhbiBuZXdHbG9iYWwpIHsKLQkJQm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWdsb2JhbCA9IG5ld0dsb2JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMLCBvbGRHbG9iYWwsIGdsb2JhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBhY2thZ2U+IGdldFJldXNlZFBhY2thZ2VzKCkgewotCQlpZiAocmV1c2VkUGFja2FnZXMgPT0gbnVsbCkgewotCQkJcmV1c2VkUGFja2FnZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZFBhY2thZ2U+KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiByZXVzZWRQYWNrYWdlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRDaGlsZFBhY2thZ2VzKCkgewotCQlpZiAoY2hpbGRQYWNrYWdlcyA9PSBudWxsKSB7Ci0JCQljaGlsZFBhY2thZ2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxNZXRob2RQYWNrYWdlPigKLQkJCQkJTWV0aG9kUGFja2FnZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVMpOwotCQl9Ci0JCXJldHVybiBjaGlsZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRDaGlsZFBhY2thZ2VzKCkpLmJhc2ljUmVtb3ZlKAotCQkJCQlvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlyZXR1cm4gZ2V0R2xvYmFsKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJcmV0dXJuIGdldFJldXNlZFBhY2thZ2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJc2V0R2xvYmFsKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRDaGlsZFBhY2thZ2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGFja2FnZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJc2V0R2xvYmFsKEdMT0JBTF9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0VTOgotCQkJZ2V0UmV1c2VkUGFja2FnZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTOgotCQkJZ2V0Q2hpbGRQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQlyZXR1cm4gR0xPQkFMX0VERUZBVUxUID09IG51bGwgPyBnbG9iYWwgIT0gbnVsbCA6ICFHTE9CQUxfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhnbG9iYWwpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUzoKLQkJCXJldHVybiByZXVzZWRQYWNrYWdlcyAhPSBudWxsICYmICFyZXVzZWRQYWNrYWdlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fQ0hJTERfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gY2hpbGRQYWNrYWdlcyAhPSBudWxsICYmICFjaGlsZFBhY2thZ2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChnbG9iYWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZ2xvYmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlI2dldFBhcmVudFBhY2thZ2UoKQotCSAqLwotCXB1YmxpYyBNZXRob2RQYWNrYWdlIGdldFBhcmVudFBhY2thZ2UoKSB7Ci0JCUVPYmplY3QgcGFyZW50ID0gZUNvbnRhaW5lcigpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJcmV0dXJuIChNZXRob2RQYWNrYWdlKSBwYXJlbnQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vTWV0aG9kUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWV0aG9kUGx1Z2luSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2M5OTcwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRNZXRob2RQYWNrYWdlcyA8ZW0+TWV0aG9kIFBhY2thZ2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kUGx1Z2luSW1wbCNnZXRCYXNlcyA8ZW0+QmFzZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RQbHVnaW5JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RQbHVnaW4gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQgPSBCb29sZWFuLlRSVUU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiB1c2VyQ2hhbmdlYWJsZSA9IFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBhY2thZ2VzKCkgPGVtPk1ldGhvZCBQYWNrYWdlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBhY2thZ2U+IG1ldGhvZFBhY2thZ2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzZXMoKSA8ZW0+QmFzZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxNZXRob2RQbHVnaW4+IGJhc2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZFBsdWdpbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0VXNlckNoYW5nZWFibGUoKSB7Ci0JCXJldHVybiB1c2VyQ2hhbmdlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShCb29sZWFuIG5ld1VzZXJDaGFuZ2VhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGUgPSB1c2VyQ2hhbmdlYWJsZTsKLQkJdXNlckNoYW5nZWFibGUgPSBuZXdVc2VyQ2hhbmdlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUsCi0JCQkJCW9sZFVzZXJDaGFuZ2VhYmxlLCB1c2VyQ2hhbmdlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2VzKCkgewotCQlpZiAobWV0aG9kUGFja2FnZXMgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPE1ldGhvZFBhY2thZ2U+KAotCQkJCQlNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0QmFzZXMoKSB7Ci0JCWlmIChiYXNlcyA9PSBudWxsKSB7Ci0JCQliYXNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8TWV0aG9kUGx1Z2luPihNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fQkFTRVMpOwotCQl9Ci0JCXJldHVybiBiYXNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0TWV0aG9kUGFja2FnZXMoKSkuYmFzaWNSZW1vdmUoCi0JCQkJCW90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJcmV0dXJuIGdldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJcmV0dXJuIGdldEJhc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCXNldFVzZXJDaGFuZ2VhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRVM6Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmNsZWFyKCk7Ci0JCQlnZXRNZXRob2RQYWNrYWdlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZFBhY2thZ2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19CQVNFUzoKLQkJCWdldEJhc2VzKCkuY2xlYXIoKTsKLQkJCWdldEJhc2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQbHVnaW4+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFOgotCQkJc2V0VXNlckNoYW5nZWFibGUoVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFUzoKLQkJCWdldE1ldGhvZFBhY2thZ2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJZ2V0QmFzZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQlyZXR1cm4gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUID09IG51bGwgPyB1c2VyQ2hhbmdlYWJsZSAhPSBudWxsCi0JCQkJCTogIVVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVC5lcXVhbHModXNlckNoYW5nZWFibGUpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTOgotCQkJcmV0dXJuIG1ldGhvZFBhY2thZ2VzICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX0JBU0VTOgotCQkJcmV0dXJuIGJhc2VzICE9IG51bGwgJiYgIWJhc2VzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh1c2VyQ2hhbmdlYWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh1c2VyQ2hhbmdlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBsdWdpbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZDE4NDUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL01ldGhvZFVuaXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQgPGVtPkNvcHlyaWdodCBTdGF0ZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RVbml0SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGNoYW5nZURhdGUgPSBDSEFOR0VfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodFN0YXRlbWVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RVbml0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1VOSVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdXRob3JzKCkgewotCQlyZXR1cm4gYXV0aG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdXRob3JzKFN0cmluZyBuZXdBdXRob3JzKSB7Ci0JCVN0cmluZyBvbGRBdXRob3JzID0gYXV0aG9yczsKLQkJYXV0aG9ycyA9IG5ld0F1dGhvcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlMsIG9sZEF1dGhvcnMsIGF1dGhvcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXRDaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gY2hhbmdlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEYXRlKERhdGUgbmV3Q2hhbmdlRGF0ZSkgewotCQlEYXRlIG9sZENoYW5nZURhdGUgPSBjaGFuZ2VEYXRlOwotCQljaGFuZ2VEYXRlID0gbmV3Q2hhbmdlRGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUsIG9sZENoYW5nZURhdGUsCi0JCQkJCWNoYW5nZURhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY2hhbmdlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIG5ld0NoYW5nZURlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRDaGFuZ2VEZXNjcmlwdGlvbiA9IGNoYW5nZURlc2NyaXB0aW9uOwotCQljaGFuZ2VEZXNjcmlwdGlvbiA9IG5ld0NoYW5nZURlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04sCi0JCQkJCW9sZENoYW5nZURlc2NyaXB0aW9uLCBjaGFuZ2VEZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OLCBvbGRWZXJzaW9uLCB2ZXJzaW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gbnVsbAotCQkJCSYmICgoRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkQ29weXJpZ2h0U3RhdGVtZW50ID0gKEludGVybmFsRU9iamVjdCkgY29weXJpZ2h0U3RhdGVtZW50OwotCQkJY29weXJpZ2h0U3RhdGVtZW50ID0gKFN1cHBvcnRpbmdNYXRlcmlhbCkgZVJlc29sdmVQcm94eShvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpOwotCQkJaWYgKGNvcHlyaWdodFN0YXRlbWVudCAhPSBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQsCi0JCQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgYmFzaWNHZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0U3RhdGVtZW50KFN1cHBvcnRpbmdNYXRlcmlhbCBuZXdDb3B5cmlnaHRTdGF0ZW1lbnQpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIG9sZENvcHlyaWdodFN0YXRlbWVudCA9IGNvcHlyaWdodFN0YXRlbWVudDsKLQkJY29weXJpZ2h0U3RhdGVtZW50ID0gbmV3Q29weXJpZ2h0U3RhdGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQlvbGRDb3B5cmlnaHRTdGF0ZW1lbnQsIGNvcHlyaWdodFN0YXRlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJc2V0Q29weXJpZ2h0U3RhdGVtZW50KChTdXBwb3J0aW5nTWF0ZXJpYWwpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCXJldHVybiBBVVRIT1JTX0VERUZBVUxUID09IG51bGwgPyBhdXRob3JzICE9IG51bGwKLQkJCQkJOiAhQVVUSE9SU19FREVGQVVMVC5lcXVhbHMoYXV0aG9ycyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbAotCQkJCQk6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJcmV0dXJuIFZFUlNJT05fRURFRkFVTFQgPT0gbnVsbCA/IHZlcnNpb24gIT0gbnVsbAotCQkJCQk6ICFWRVJTSU9OX0VERUZBVUxULmVxdWFscyh2ZXJzaW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhvcnM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEZXNjcmlwdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kVW5pdEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE3N2NmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9NaWxlc3RvbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1pbGVzdG9uZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwjZ2V0UmVxdWlyZWRSZXN1bHRzIDxlbT5SZXF1aXJlZCBSZXN1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCU1pbGVzdG9uZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXF1aXJlZFJlc3VsdHMoKSA8ZW0+UmVxdWlyZWQgUmVzdWx0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXF1aXJlZFJlc3VsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IHJlcXVpcmVkUmVzdWx0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNaWxlc3RvbmVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRSZXF1aXJlZFJlc3VsdHMoKSB7Ci0JCWlmIChyZXF1aXJlZFJlc3VsdHMgPT0gbnVsbCkgewotCQkJcmVxdWlyZWRSZXN1bHRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTKTsKLQkJfQotCQlyZXR1cm4gcmVxdWlyZWRSZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUUzoKLQkJCXJldHVybiBnZXRSZXF1aXJlZFJlc3VsdHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFRTOgotCQkJZ2V0UmVxdWlyZWRSZXN1bHRzKCkuY2xlYXIoKTsKLQkJCWdldFJlcXVpcmVkUmVzdWx0cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFM6Ci0JCQlnZXRSZXF1aXJlZFJlc3VsdHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFM6Ci0JCQlyZXR1cm4gcmVxdWlyZWRSZXN1bHRzICE9IG51bGwgJiYgIXJlcXVpcmVkUmVzdWx0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL01pbGVzdG9uZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkzMmEyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuTmFtZWRFbGVtZW50SW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZWRFbGVtZW50SW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJTmFtZWRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBOYW1lZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuTkFNRURfRUxFTUVOVF9fTkFNRToKLQkJCXNldE5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9OYW1lc3BhY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZWFjNjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL05hbWVzcGFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZXNwYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTmFtZXNwYWNlSW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlOYW1lc3BhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVTUEFDRTsKLQl9Ci0KLX0gLy9OYW1lc3BhY2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvT3V0Y29tZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDMxMjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgT3V0Y29tZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3V0Y29tZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk9VVENPTUU7Ci0JfQotCi19IC8vT3V0Y29tZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZTdiOTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrYWdlSW1wbCBleHRlbmRzIE5hbWVzcGFjZUltcGwgaW1wbGVtZW50cwotCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QQUNLQUdFOwotCX0KLQotfSAvL1BhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjNjRlZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja2FnZWFibGVFbGVtZW50SW1wbCBleHRlbmRzIE5hbWVkRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhY2thZ2VhYmxlRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBBQ0tBR0VBQkxFX0VMRU1FTlQ7Ci0JfQotCi19IC8vUGFja2FnZWFibGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BoYXNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM2YzlmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QaGFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaGFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBoYXNlSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIFBoYXNlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCX0KLQotfSAvL1BoYXNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDk0YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0U3RhcnREYXRlIDxlbT5TdGFydCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBsYW5uaW5nRGF0YUltcGwjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBsYW5uaW5nRGF0YUltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cwotCQlQbGFubmluZ0RhdGEgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0ZSBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIHN0YXJ0RGF0ZSA9IFNUQVJUX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRlIEZJTklTSF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbmlzaERhdGUoKSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEYXRlIGZpbmlzaERhdGUgPSBGSU5JU0hfREFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFJBTktfRURFRkFVTFQgPSAwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuaygpIDxlbT5SYW5rPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5rKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHJhbmsgPSBSQU5LX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0U3RhcnREYXRlKCkgewotCQlyZXR1cm4gc3RhcnREYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXJ0RGF0ZShEYXRlIG5ld1N0YXJ0RGF0ZSkgewotCQlEYXRlIG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwKLQkJCQkJc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0RmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIGZpbmlzaERhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmluaXNoRGF0ZShEYXRlIG5ld0ZpbmlzaERhdGUpIHsKLQkJRGF0ZSBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsCi0JCQkJCWZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0JCXJldHVybiByYW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmsoaW50IG5ld1JhbmspIHsKLQkJaW50IG9sZFJhbmsgPSByYW5rOwotCQlyYW5rID0gbmV3UmFuazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LLCBvbGRSYW5rLCByYW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXJldHVybiBnZXRTdGFydERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJcmV0dXJuIGdldEZpbmlzaERhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0UmFuaygpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fU1RBUlRfREFURToKLQkJCXNldFN0YXJ0RGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKChEYXRlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJc2V0UmFuaygoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJc2V0U3RhcnREYXRlKFNUQVJUX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlzZXRSYW5rKFJBTktfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsCi0JCQkJCTogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCXJldHVybiBGSU5JU0hfREFURV9FREVGQVVMVCA9PSBudWxsID8gZmluaXNoRGF0ZSAhPSBudWxsCi0JCQkJCTogIUZJTklTSF9EQVRFX0VERUZBVUxULmVxdWFscyhmaW5pc2hEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1JBTks6Ci0JCQlyZXR1cm4gcmFuayAhPSBSQU5LX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHN0YXJ0RGF0ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChzdGFydERhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGZpbmlzaERhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoZmluaXNoRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmFuazogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChyYW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUGxhbm5pbmdEYXRhSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvaW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjRlZDFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qb2ludEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUG9pbnRJbXBsI2dldFggPGVtPlg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qb2ludEltcGwjZ2V0WSA8ZW0+WTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvaW50SW1wbCBleHRlbmRzIE11bHRpUmVzb3VyY2VFT2JqZWN0IGltcGxlbWVudHMgUG9pbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFgoKSA8ZW0+WDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEb3VibGUgWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYKCkgPGVtPlg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEb3VibGUgeCA9IFhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WSgpIDxlbT5ZPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRZKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERvdWJsZSBZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFkoKSA8ZW0+WTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERvdWJsZSB5ID0gWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb2ludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBPSU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgZ2V0WCgpIHsKLQkJcmV0dXJuIHg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0WChEb3VibGUgbmV3WCkgewotCQlEb3VibGUgb2xkWCA9IHg7Ci0JCXggPSBuZXdYOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPSU5UX19YLCBvbGRYLCB4KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvdWJsZSBnZXRZKCkgewotCQlyZXR1cm4geTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRZKERvdWJsZSBuZXdZKSB7Ci0JCURvdWJsZSBvbGRZID0geTsKLQkJeSA9IG5ld1k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUE9JTlRfX1ksIG9sZFksIHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWDoKLQkJCXJldHVybiBnZXRYKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXJldHVybiBnZXRZKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WCgoRG91YmxlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0lOVF9fWToKLQkJCXNldFkoKERvdWJsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19YOgotCQkJc2V0WChYX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UX19ZOgotCQkJc2V0WShZX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1g6Ci0JCQlyZXR1cm4gWF9FREVGQVVMVCA9PSBudWxsID8geCAhPSBudWxsIDogIVhfRURFRkFVTFQuZXF1YWxzKHgpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9JTlRfX1k6Ci0JCQlyZXR1cm4gWV9FREVGQVVMVCA9PSBudWxsID8geSAhPSBudWxsIDogIVlfRURFRkFVTFQuZXF1YWxzKHkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHg6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoeCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9pbnRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUG9seWxpbmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTk1ZDIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1BvbHlsaW5lSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qb2x5bGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCNnZXRDbG9zZWQgPGVtPkNsb3NlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlBvbHlsaW5lSW1wbCNnZXRXYXlwb2ludHMgPGVtPldheXBvaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvbHlsaW5lSW1wbCBleHRlbmRzIEdyYXBoaWNQcmltaXRpdmVJbXBsIGltcGxlbWVudHMgUG9seWxpbmUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb3NlZCgpIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENMT1NFRF9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb3NlZCgpIDxlbT5DbG9zZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2xvc2VkID0gQ0xPU0VEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V2F5cG9pbnRzKCkgPGVtPldheXBvaW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXYXlwb2ludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQb2ludD4gd2F5cG9pbnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBvbHlsaW5lSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUE9MWUxJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2xvc2VkKCkgewotCQlyZXR1cm4gY2xvc2VkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsb3NlZChCb29sZWFuIG5ld0Nsb3NlZCkgewotCQlCb29sZWFuIG9sZENsb3NlZCA9IGNsb3NlZDsKLQkJY2xvc2VkID0gbmV3Q2xvc2VkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQsIG9sZENsb3NlZCwgY2xvc2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8UG9pbnQ+IGdldFdheXBvaW50cygpIHsKLQkJaWYgKHdheXBvaW50cyA9PSBudWxsKSB7Ci0JCQl3YXlwb2ludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFBvaW50PigKLQkJCQkJUG9pbnQuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHdheXBvaW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFdheXBvaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlyZXR1cm4gZ2V0Q2xvc2VkKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJcmV0dXJuIGdldFdheXBvaW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fQ0xPU0VEOgotCQkJc2V0Q2xvc2VkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORV9fV0FZUE9JTlRTOgotCQkJZ2V0V2F5cG9pbnRzKCkuY2xlYXIoKTsKLQkJCWdldFdheXBvaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUG9pbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX0NMT1NFRDoKLQkJCXNldENsb3NlZChDTE9TRURfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCWdldFdheXBvaW50cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPTFlMSU5FX19DTE9TRUQ6Ci0JCQlyZXR1cm4gQ0xPU0VEX0VERUZBVUxUID09IG51bGwgPyBjbG9zZWQgIT0gbnVsbCA6ICFDTE9TRURfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhjbG9zZWQpOwotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkVfX1dBWVBPSU5UUzoKLQkJCXJldHVybiB3YXlwb2ludHMgIT0gbnVsbCAmJiAhd2F5cG9pbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbG9zZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY2xvc2VkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUG9seWxpbmVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzNlOWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByYWN0aWNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QXBwbGljYXRpb24gPGVtPkFwcGxpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURESVRJT05BTF9JTkZPX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBZGRpdGlvbmFsSW5mbygpIDxlbT5BZGRpdGlvbmFsIEluZm88L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gQURESVRJT05BTF9JTkZPX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvYmxlbSgpIDxlbT5Qcm9ibGVtPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9ibGVtKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2JsZW0gPSBQUk9CTEVNX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhY2tncm91bmQoKSA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORF9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZCgpIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhY2tncm91bmQgPSBCQUNLR1JPVU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09BTFNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnb2FscyA9IEdPQUxTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2F0aW9uKCkgPGVtPkFwcGxpY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbiA9IEFQUExJQ0FUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExldmVsc09mQWRvcHRpb24oKSA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGxldmVsc09mQWRvcHRpb24gPSBMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgbmV3QWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nIG9sZEFkZGl0aW9uYWxJbmZvID0gYWRkaXRpb25hbEluZm87Ci0JCWFkZGl0aW9uYWxJbmZvID0gbmV3QWRkaXRpb25hbEluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywKLQkJCQkJb2xkQWRkaXRpb25hbEluZm8sIGFkZGl0aW9uYWxJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9ibGVtKCkgewotCQlyZXR1cm4gcHJvYmxlbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtKFN0cmluZyBuZXdQcm9ibGVtKSB7Ci0JCVN0cmluZyBvbGRQcm9ibGVtID0gcHJvYmxlbTsKLQkJcHJvYmxlbSA9IG5ld1Byb2JsZW07Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0sIG9sZFByb2JsZW0sCi0JCQkJCXByb2JsZW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmQoKSB7Ci0JCXJldHVybiBiYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIG5ld0JhY2tncm91bmQpIHsKLQkJU3RyaW5nIG9sZEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwotCQliYWNrZ3JvdW5kID0gbmV3QmFja2dyb3VuZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCwgb2xkQmFja2dyb3VuZCwKLQkJCQkJYmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R29hbHMoKSB7Ci0JCXJldHVybiBnb2FsczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHb2FscyhTdHJpbmcgbmV3R29hbHMpIHsKLQkJU3RyaW5nIG9sZEdvYWxzID0gZ29hbHM7Ci0JCWdvYWxzID0gbmV3R29hbHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTLCBvbGRHb2FscywgZ29hbHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGRBcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQlhcHBsaWNhdGlvbiA9IG5ld0FwcGxpY2F0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiwKLQkJCQkJb2xkQXBwbGljYXRpb24sIGFwcGxpY2F0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCkgewotCQlyZXR1cm4gbGV2ZWxzT2ZBZG9wdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyBuZXdMZXZlbHNPZkFkb3B0aW9uKSB7Ci0JCVN0cmluZyBvbGRMZXZlbHNPZkFkb3B0aW9uID0gbGV2ZWxzT2ZBZG9wdGlvbjsKLQkJbGV2ZWxzT2ZBZG9wdGlvbiA9IG5ld0xldmVsc09mQWRvcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTiwKLQkJCQkJb2xkTGV2ZWxzT2ZBZG9wdGlvbiwgbGV2ZWxzT2ZBZG9wdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJcmV0dXJuIGdldFByb2JsZW0oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJcmV0dXJuIGdldEJhY2tncm91bmQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCXJldHVybiBnZXRHb2FscygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJcmV0dXJuIGdldEFwcGxpY2F0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJcmV0dXJuIGdldExldmVsc09mQWRvcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXNldEFkZGl0aW9uYWxJbmZvKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJc2V0UHJvYmxlbSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXNldEJhY2tncm91bmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQlzZXRBZGRpdGlvbmFsSW5mbyhBRERJVElPTkFMX0lORk9fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQlzZXRQcm9ibGVtKFBST0JMRU1fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQlzZXRCYWNrZ3JvdW5kKEJBQ0tHUk9VTkRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJc2V0R29hbHMoR09BTFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OOgotCQkJc2V0QXBwbGljYXRpb24oQVBQTElDQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCXNldExldmVsc09mQWRvcHRpb24oTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTzoKLQkJCXJldHVybiBBRERJVElPTkFMX0lORk9fRURFRkFVTFQgPT0gbnVsbCA/IGFkZGl0aW9uYWxJbmZvICE9IG51bGwKLQkJCQkJOiAhQURESVRJT05BTF9JTkZPX0VERUZBVUxULmVxdWFscyhhZGRpdGlvbmFsSW5mbyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCXJldHVybiBQUk9CTEVNX0VERUZBVUxUID09IG51bGwgPyBwcm9ibGVtICE9IG51bGwKLQkJCQkJOiAhUFJPQkxFTV9FREVGQVVMVC5lcXVhbHMocHJvYmxlbSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCXJldHVybiBCQUNLR1JPVU5EX0VERUZBVUxUID09IG51bGwgPyBiYWNrZ3JvdW5kICE9IG51bGwKLQkJCQkJOiAhQkFDS0dST1VORF9FREVGQVVMVC5lcXVhbHMoYmFja2dyb3VuZCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQlyZXR1cm4gR09BTFNfRURFRkFVTFQgPT0gbnVsbCA/IGdvYWxzICE9IG51bGwgOiAhR09BTFNfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhnb2Fscyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQlyZXR1cm4gQVBQTElDQVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGFwcGxpY2F0aW9uICE9IG51bGwKLQkJCQkJOiAhQVBQTElDQVRJT05fRURFRkFVTFQuZXF1YWxzKGFwcGxpY2F0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQlyZXR1cm4gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID09IG51bGwgPyBsZXZlbHNPZkFkb3B0aW9uICE9IG51bGwKLQkJCQkJOiAhTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxULmVxdWFscyhsZXZlbHNPZkFkb3B0aW9uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhZGRpdGlvbmFsSW5mbzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhZGRpdGlvbmFsSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvYmxlbTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcm9ibGVtKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYWNrZ3JvdW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGJhY2tncm91bmQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdvYWxzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGdvYWxzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBsaWNhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxzT2ZBZG9wdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChsZXZlbHNPZkFkb3B0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4ZGJkZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0U3ViUHJhY3RpY2VzIDxlbT5TdWIgUHJhY3RpY2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldENvbnRlbnRSZWZlcmVuY2VzIDxlbT5Db250ZW50IFJlZmVyZW5jZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0QWN0aXZpdHlSZWZlcmVuY2VzIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJhY3RpY2VJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUHJhY3RpY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3ViUHJhY3RpY2VzKCkgPGVtPlN1YiBQcmFjdGljZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViUHJhY3RpY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8UHJhY3RpY2U+IHN1YlByYWN0aWNlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnRlbnRSZWZlcmVuY2VzKCkgPGVtPkNvbnRlbnQgUmVmZXJlbmNlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb250ZW50UmVmZXJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PENvbnRlbnRFbGVtZW50PiBjb250ZW50UmVmZXJlbmNlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5UmVmZXJlbmNlcygpIDxlbT5BY3Rpdml0eSBSZWZlcmVuY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5UmVmZXJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEFjdGl2aXR5PiBhY3Rpdml0eVJlZmVyZW5jZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUkFDVElDRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcmFjdGljZT4gZ2V0U3ViUHJhY3RpY2VzKCkgewotCQlpZiAoc3ViUHJhY3RpY2VzID09IG51bGwpIHsKLQkJCXN1YlByYWN0aWNlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdC5SZXNvbHZpbmc8UHJhY3RpY2U+KAotCQkJCQlQcmFjdGljZS5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YlByYWN0aWNlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudFJlZmVyZW5jZXMoKSB7Ci0JCWlmIChjb250ZW50UmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQljb250ZW50UmVmZXJlbmNlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Q29udGVudEVsZW1lbnQ+KAotCQkJCQlDb250ZW50RWxlbWVudC5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJfQotCQlyZXR1cm4gY29udGVudFJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8QWN0aXZpdHk+IGdldEFjdGl2aXR5UmVmZXJlbmNlcygpIHsKLQkJaWYgKGFjdGl2aXR5UmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlhY3Rpdml0eVJlZmVyZW5jZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PEFjdGl2aXR5PigKLQkJCQkJQWN0aXZpdHkuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMpOwotCQl9Ci0JCXJldHVybiBhY3Rpdml0eVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0VTOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViUHJhY3RpY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gZ2V0U3ViUHJhY3RpY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGdldENvbnRlbnRSZWZlcmVuY2VzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFUzoKLQkJCXJldHVybiBnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJZ2V0U3ViUHJhY3RpY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQcmFjdGljZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRVM6Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQlnZXRDb250ZW50UmVmZXJlbmNlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVM6Ci0JCQlnZXRBY3Rpdml0eVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWN0aXZpdHk+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlnZXRTdWJQcmFjdGljZXMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFUzoKLQkJCWdldENvbnRlbnRSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVM6Ci0JCQlyZXR1cm4gc3ViUHJhY3RpY2VzICE9IG51bGwgJiYgIXN1YlByYWN0aWNlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2VzICE9IG51bGwgJiYgIWNvbnRlbnRSZWZlcmVuY2VzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0VTOgotCQkJcmV0dXJuIGFjdGl2aXR5UmVmZXJlbmNlcyAhPSBudWxsICYmICFhY3Rpdml0eVJlZmVyZW5jZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9QcmFjdGljZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyMzEwNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwjZ2V0X3Byb2Nlc3NDb21wb25lbnQgPGVtPnByb2Nlc3MgQ29tcG9uZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsIGV4dGVuZHMgRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRfcHJvY2Vzc0NvbXBvbmVudCgpIDxlbT5wcm9jZXNzIENvbXBvbmVudDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0X3Byb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50IF9wcm9jZXNzQ29tcG9uZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBnZXRfcHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJaWYgKF9wcm9jZXNzQ29tcG9uZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIF9wcm9jZXNzQ29tcG9uZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkX3Byb2Nlc3NDb21wb25lbnQgPSAoSW50ZXJuYWxFT2JqZWN0KSBfcHJvY2Vzc0NvbXBvbmVudDsKLQkJCV9wcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIGVSZXNvbHZlUHJveHkob2xkX3Byb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKF9wcm9jZXNzQ29tcG9uZW50ICE9IG9sZF9wcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCgKLQkJCQkJCQl0aGlzLAotCQkJCQkJCU5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQsCi0JCQkJCQkJb2xkX3Byb2Nlc3NDb21wb25lbnQsIF9wcm9jZXNzQ29tcG9uZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9wcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50IGJhc2ljR2V0X3Byb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBfcHJvY2Vzc0NvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRfcHJvY2Vzc0NvbXBvbmVudChQcm9jZXNzQ29tcG9uZW50IG5ld19wcm9jZXNzQ29tcG9uZW50KSB7Ci0JCVByb2Nlc3NDb21wb25lbnQgb2xkX3Byb2Nlc3NDb21wb25lbnQgPSBfcHJvY2Vzc0NvbXBvbmVudDsKLQkJX3Byb2Nlc3NDb21wb25lbnQgPSBuZXdfcHJvY2Vzc0NvbXBvbmVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVCwKLQkJCQkJb2xkX3Byb2Nlc3NDb21wb25lbnQsIF9wcm9jZXNzQ29tcG9uZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0X3Byb2Nlc3NDb21wb25lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldF9wcm9jZXNzQ29tcG9uZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UOgotCQkJc2V0X3Byb2Nlc3NDb21wb25lbnQoKFByb2Nlc3NDb21wb25lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9ERVNDUklQVE9SX19QUk9DRVNTX0NPTVBPTkVOVDoKLQkJCXNldF9wcm9jZXNzQ29tcG9uZW50KChQcm9jZXNzQ29tcG9uZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUl9fUFJPQ0VTU19DT01QT05FTlQ6Ci0JCQlyZXR1cm4gX3Byb2Nlc3NDb21wb25lbnQgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWRiNTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENvcHlyaWdodFN0YXRlbWVudCA8ZW0+Q29weXJpZ2h0IFN0YXRlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldEludGVyZmFjZXMgPGVtPkludGVyZmFjZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEltcGwgZXh0ZW5kcyBQcm9jZXNzUGFja2FnZUltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzQ29tcG9uZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhPUlNfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERhdGUgQ0hBTkdFX0RBVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGUgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VEZXNjcmlwdGlvbiA9IENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodFN0YXRlbWVudCgpIDxlbT5Db3B5cmlnaHQgU3RhdGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0U3RhdGVtZW50OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlcygpIDxlbT5JbnRlcmZhY2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRlcmZhY2VzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2VzcygpIDxlbT5Qcm9jZXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0NvbXBvbmVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfQ09NUE9ORU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgZ2V0Q2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIGNoYW5nZURhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlRGF0ZShEYXRlIG5ld0NoYW5nZURhdGUpIHsKLQkJRGF0ZSBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLAotCQkJCQljaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgZ2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlpZiAoY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGwKLQkJCQkmJiAoKEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZENvcHlyaWdodFN0YXRlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGNvcHlyaWdodFN0YXRlbWVudDsKLQkJCWNvcHlyaWdodFN0YXRlbWVudCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIGVSZXNvbHZlUHJveHkob2xkQ29weXJpZ2h0U3RhdGVtZW50KTsKLQkJCWlmIChjb3B5cmlnaHRTdGF0ZW1lbnQgIT0gb2xkQ29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5ULAotCQkJCQkJCW9sZENvcHlyaWdodFN0YXRlbWVudCwgY29weXJpZ2h0U3RhdGVtZW50KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvcHlyaWdodFN0YXRlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGJhc2ljR2V0Q29weXJpZ2h0U3RhdGVtZW50KCkgewotCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodFN0YXRlbWVudChTdXBwb3J0aW5nTWF0ZXJpYWwgbmV3Q29weXJpZ2h0U3RhdGVtZW50KSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBvbGRDb3B5cmlnaHRTdGF0ZW1lbnQgPSBjb3B5cmlnaHRTdGF0ZW1lbnQ7Ci0JCWNvcHlyaWdodFN0YXRlbWVudCA9IG5ld0NvcHlyaWdodFN0YXRlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCwKLQkJCQkJb2xkQ29weXJpZ2h0U3RhdGVtZW50LCBjb3B5cmlnaHRTdGF0ZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPiBnZXRJbnRlcmZhY2VzKCkgewotCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKSB7Ci0JCQlpbnRlcmZhY2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlPigKLQkJCQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyk7Ci0JCX0KLQkJcmV0dXJuIGludGVyZmFjZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCkgewotCQlpZiAocHJvY2VzcyAhPSBudWxsICYmICgoRU9iamVjdCkgcHJvY2VzcykuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJcHJvY2VzcyA9IChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIGVSZXNvbHZlUHJveHkob2xkUHJvY2Vzcyk7Ci0JCQlpZiAocHJvY2VzcyAhPSBvbGRQcm9jZXNzKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Byb2Nlc3MgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcm9jZXNzOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQcm9jZXNzLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW51bGwpOwotCQkJCWlmIChuZXdQcm9jZXNzLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Byb2Nlc3MKLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTLAotCQkJCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG9sZFByb2Nlc3MsCi0JCQkJCQkJcHJvY2VzcykpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MgYmFzaWNHZXRQcm9jZXNzKCkgewotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9jZXNzKAotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIG9sZFByb2Nlc3MgPSBwcm9jZXNzOwotCQlwcm9jZXNzID0gbmV3UHJvY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywKLQkJCQkJb2xkUHJvY2VzcywgbmV3UHJvY2Vzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChuZXdQcm9jZXNzICE9IHByb2Nlc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHByb2Nlc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Byb2Nlc3MpLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbnVsbCwKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvY2VzcyhuZXdQcm9jZXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUywgbmV3UHJvY2VzcywKLQkJCQkJbmV3UHJvY2VzcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXJldHVybiBiYXNpY1NldFByb2Nlc3MobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBnZXRDaGFuZ2VEYXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRDb3B5cmlnaHRTdGF0ZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldENvcHlyaWdodFN0YXRlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRVM6Ci0JCQlyZXR1cm4gZ2V0SW50ZXJmYWNlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJvY2VzcygpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJvY2VzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCXNldEF1dGhvcnMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJc2V0Q2hhbmdlRGF0ZSgoRGF0ZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJc2V0VmVyc2lvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCWdldEludGVyZmFjZXMoKS5jbGVhcigpOwotCQkJZ2V0SW50ZXJmYWNlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJc2V0QXV0aG9ycyhBVVRIT1JTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXNldENoYW5nZURhdGUoQ0hBTkdFX0RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCXNldENoYW5nZURlc2NyaXB0aW9uKENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fVkVSU0lPTjoKLQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUX1NUQVRFTUVOVDoKLQkJCXNldENvcHlyaWdodFN0YXRlbWVudCgoU3VwcG9ydGluZ01hdGVyaWFsKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0VTOgotCQkJZ2V0SW50ZXJmYWNlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCXNldFByb2Nlc3MoKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOgotCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbAotCQkJCQk6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCXJldHVybiBDSEFOR0VfREFURV9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGF0ZSAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9EQVRFX0VERUZBVUxULmVxdWFscyhjaGFuZ2VEYXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsCi0JCQkJCTogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsCi0JCQkJCTogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQlyZXR1cm4gY29weXJpZ2h0U3RhdGVtZW50ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUzoKLQkJCXJldHVybiBpbnRlcmZhY2VzICE9IG51bGwgJiYgIWludGVyZmFjZXMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gTWV0aG9kVW5pdC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVF9TVEFURU1FTlQ6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVF9TVEFURU1FTlQ7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IE1ldGhvZFVuaXQuY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19BVVRIT1JTOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFRfU1RBVEVNRU5UOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFRfU1RBVEVNRU5UOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXV0aG9yczogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChhdXRob3JzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjaGFuZ2VEYXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZlcnNpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzQ29tcG9uZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2ZmFlOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSA8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb25zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGludGVyZmFjZVNwZWNpZmljYXRpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW50ZXJmYWNlSU8oKSA8ZW0+SW50ZXJmYWNlIElPPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludGVyZmFjZUlPKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBpbnRlcmZhY2VJTzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRhc2tEZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpIHsKLQkJaWYgKGludGVyZmFjZVNwZWNpZmljYXRpb25zID09IG51bGwpIHsKLQkJCWludGVyZmFjZVNwZWNpZmljYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxUYXNrRGVzY3JpcHRvcj4oCi0JCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCQl0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbnRlcmZhY2VJTygpIHsKLQkJaWYgKGludGVyZmFjZUlPID09IG51bGwpIHsKLQkJCWludGVyZmFjZUlPID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCQl9Ci0JCXJldHVybiBpbnRlcmZhY2VJTzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9ucygpKQotCQkJCQkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbnRlcmZhY2VJTygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJcmV0dXJuIGdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCXJldHVybiBnZXRJbnRlcmZhY2VJTygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUzoKLQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEludGVyZmFjZVNwZWNpZmljYXRpb25zKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGFza0Rlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCWdldEludGVyZmFjZUlPKCkuY2xlYXIoKTsKLQkJCWdldEludGVyZmFjZUlPKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQlnZXRJbnRlcmZhY2VJTygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT05TOgotCQkJcmV0dXJuIGludGVyZmFjZVNwZWNpZmljYXRpb25zICE9IG51bGwKLQkJCQkJJiYgIWludGVyZmFjZVNwZWNpZmljYXRpb25zLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJcmV0dXJuIGludGVyZmFjZUlPICE9IG51bGwgJiYgIWludGVyZmFjZUlPLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE1NjM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFVzYWdlTm90ZXMgPGVtPlVzYWdlIE5vdGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMKLQkJUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY29wZSgpIDxlbT5TY29wZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NvcGUgPSBTQ09QRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2FnZU5vdGVzKCkgPGVtPlVzYWdlIE5vdGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVc2FnZU5vdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVU0FHRV9OT1RFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZU5vdGVzID0gVVNBR0VfTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5ld1Njb3BlKSB7Ci0JCVN0cmluZyBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiB1c2FnZU5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIG5ld1VzYWdlTm90ZXMpIHsKLQkJU3RyaW5nIG9sZFVzYWdlTm90ZXMgPSB1c2FnZU5vdGVzOwotCQl1c2FnZU5vdGVzID0gbmV3VXNhZ2VOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywgb2xkVXNhZ2VOb3RlcywKLQkJCQkJdXNhZ2VOb3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJcmV0dXJuIGdldFNjb3BlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCXJldHVybiBnZXRVc2FnZU5vdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJc2V0U2NvcGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlzZXRVc2FnZU5vdGVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCXNldFNjb3BlKFNDT1BFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJc2V0VXNhZ2VOb3RlcyhVU0FHRV9OT1RFU19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJcmV0dXJuIFNDT1BFX0VERUZBVUxUID09IG51bGwgPyBzY29wZSAhPSBudWxsIDogIVNDT1BFX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoc2NvcGUpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM6Ci0JCQlyZXR1cm4gVVNBR0VfTk9URVNfRURFRkFVTFQgPT0gbnVsbCA/IHVzYWdlTm90ZXMgIT0gbnVsbAotCQkJCQk6ICFVU0FHRV9OT1RFU19FREVGQVVMVC5lcXVhbHModXNhZ2VOb3Rlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2NvcGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2NvcGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVzYWdlTm90ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQodXNhZ2VOb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzYmZiZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbAotCQlpbXBsZW1lbnRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfRUxFTUVOVDsKLQl9Ci0KLX0gLy9Qcm9jZXNzRWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzRmFtaWx5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MWUxMTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NGYW1pbHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBGYW1pbHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzRmFtaWx5SW1wbCNnZXREZWxpdmVyeVByb2Nlc3NlcyA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0ZhbWlseUltcGwgZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NGYW1pbHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKSA8ZW0+RGVsaXZlcnkgUHJvY2Vzc2VzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RGVsaXZlcnlQcm9jZXNzPiBkZWxpdmVyeVByb2Nlc3NlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzRmFtaWx5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19GQU1JTFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RGVsaXZlcnlQcm9jZXNzPiBnZXREZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJaWYgKGRlbGl2ZXJ5UHJvY2Vzc2VzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxEZWxpdmVyeVByb2Nlc3M+KAotCQkJCQlEZWxpdmVyeVByb2Nlc3MuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUyk7Ci0JCX0KLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2Vzc2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gZ2V0RGVsaXZlcnlQcm9jZXNzZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19GQU1JTFlfX0RFTElWRVJZX1BST0NFU1NFUzoKLQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCWdldERlbGl2ZXJ5UHJvY2Vzc2VzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVsaXZlcnlQcm9jZXNzPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlnZXREZWxpdmVyeVByb2Nlc3NlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZX19ERUxJVkVSWV9QUk9DRVNTRVM6Ci0JCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzZXMgIT0gbnVsbCAmJiAhZGVsaXZlcnlQcm9jZXNzZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzRmFtaWx5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYmJhZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRJbmNsdWRlc1BhdHRlcm5zIDxlbT5JbmNsdWRlcyBQYXR0ZXJuczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NJbXBsI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9jZXNzSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzCi0JCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmNsdWRlc1BhdHRlcm5zKCkgPGVtPkluY2x1ZGVzIFBhdHRlcm5zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVzUGF0dGVybnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4gaW5jbHVkZXNQYXR0ZXJuczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb250ZXh0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRDb250ZXh0KCkgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gdmFsaWRDb250ZXh0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PENhcGFiaWxpdHlQYXR0ZXJuPiBnZXRJbmNsdWRlc1BhdHRlcm5zKCkgewotCQlpZiAoaW5jbHVkZXNQYXR0ZXJucyA9PSBudWxsKSB7Ci0JCQlpbmNsdWRlc1BhdHRlcm5zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxDYXBhYmlsaXR5UGF0dGVybj4oCi0JCQkJCUNhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk5TKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXREZWZhdWx0Q29udGV4dCgpIHsKLQkJaWYgKGRlZmF1bHRDb250ZXh0ICE9IG51bGwgJiYgKChFT2JqZWN0KSBkZWZhdWx0Q29udGV4dCkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZERlZmF1bHRDb250ZXh0ID0gKEludGVybmFsRU9iamVjdCkgZGVmYXVsdENvbnRleHQ7Ci0JCQlkZWZhdWx0Q29udGV4dCA9IChNZXRob2RDb25maWd1cmF0aW9uKSBlUmVzb2x2ZVByb3h5KG9sZERlZmF1bHRDb250ZXh0KTsKLQkJCWlmIChkZWZhdWx0Q29udGV4dCAhPSBvbGREZWZhdWx0Q29udGV4dCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsCi0JCQkJCQkJb2xkRGVmYXVsdENvbnRleHQsIGRlZmF1bHRDb250ZXh0KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RDb25maWd1cmF0aW9uIGJhc2ljR2V0RGVmYXVsdENvbnRleHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGV4dChNZXRob2RDb25maWd1cmF0aW9uIG5ld0RlZmF1bHRDb250ZXh0KSB7Ci0JCU1ldGhvZENvbmZpZ3VyYXRpb24gb2xkRGVmYXVsdENvbnRleHQgPSBkZWZhdWx0Q29udGV4dDsKLQkJZGVmYXVsdENvbnRleHQgPSBuZXdEZWZhdWx0Q29udGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQsIG9sZERlZmF1bHRDb250ZXh0LAotCQkJCQlkZWZhdWx0Q29udGV4dCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+IGdldFZhbGlkQ29udGV4dCgpIHsKLQkJaWYgKHZhbGlkQ29udGV4dCA9PSBudWxsKSB7Ci0JCQl2YWxpZENvbnRleHQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KAotCQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCQl9Ci0JCXJldHVybiB2YWxpZENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlyZXR1cm4gZ2V0SW5jbHVkZXNQYXR0ZXJucygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldERlZmF1bHRDb250ZXh0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREZWZhdWx0Q29udGV4dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCXJldHVybiBnZXRWYWxpZENvbnRleHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlnZXRJbmNsdWRlc1BhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCWdldEluY2x1ZGVzUGF0dGVybnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDYXBhYmlsaXR5UGF0dGVybj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCXNldERlZmF1bHRDb250ZXh0KChNZXRob2RDb25maWd1cmF0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJZ2V0VmFsaWRDb250ZXh0KCkuY2xlYXIoKTsKLQkJCWdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZENvbmZpZ3VyYXRpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlM6Ci0JCQlnZXRJbmNsdWRlc1BhdHRlcm5zKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCXNldERlZmF1bHRDb250ZXh0KChNZXRob2RDb25maWd1cmF0aW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQlnZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOUzoKLQkJCXJldHVybiBpbmNsdWRlc1BhdHRlcm5zICE9IG51bGwgJiYgIWluY2x1ZGVzUGF0dGVybnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJcmV0dXJuIGRlZmF1bHRDb250ZXh0ICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJcmV0dXJuIHZhbGlkQ29udGV4dCAhPSBudWxsICYmICF2YWxpZENvbnRleHQuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2ZmNWRiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50cyA8ZW0+UHJvY2VzcyBFbGVtZW50czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXREaWFncmFtcyA8ZW0+RGlhZ3JhbXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzCi0JCVByb2Nlc3NQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NFbGVtZW50cygpIDxlbT5Qcm9jZXNzIEVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3NFbGVtZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFByb2Nlc3NFbGVtZW50PiBwcm9jZXNzRWxlbWVudHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaWFncmFtcygpIDxlbT5EaWFncmFtczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaWFncmFtcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PERpYWdyYW0+IGRpYWdyYW1zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFByb2Nlc3NFbGVtZW50PiBnZXRQcm9jZXNzRWxlbWVudHMoKSB7Ci0JCWlmIChwcm9jZXNzRWxlbWVudHMgPT0gbnVsbCkgewotCQkJcHJvY2Vzc0VsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxQcm9jZXNzRWxlbWVudD4oCi0JCQkJCVByb2Nlc3NFbGVtZW50LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxEaWFncmFtPiBnZXREaWFncmFtcygpIHsKLQkJaWYgKGRpYWdyYW1zID09IG51bGwpIHsKLQkJCWRpYWdyYW1zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0LlJlc29sdmluZzxEaWFncmFtPigKLQkJCQkJRGlhZ3JhbS5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TKTsKLQkJfQotCQlyZXR1cm4gZGlhZ3JhbXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFByb2Nlc3NFbGVtZW50cygpKS5iYXNpY1JlbW92ZSgKLQkJCQkJb3RoZXJFbmQsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldERpYWdyYW1zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLAotCQkJCQltc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJcmV0dXJuIGdldFByb2Nlc3NFbGVtZW50cygpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUzoKLQkJCXJldHVybiBnZXREaWFncmFtcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVFM6Ci0JCQlnZXRQcm9jZXNzRWxlbWVudHMoKS5jbGVhcigpOwotCQkJZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0RJQUdSQU1TOgotCQkJZ2V0RGlhZ3JhbXMoKS5jbGVhcigpOwotCQkJZ2V0RGlhZ3JhbXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIERpYWdyYW0+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTOgotCQkJZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlnZXREaWFncmFtcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UUzoKLQkJCXJldHVybiBwcm9jZXNzRWxlbWVudHMgIT0gbnVsbCAmJiAhcHJvY2Vzc0VsZW1lbnRzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fRElBR1JBTVM6Ci0JCQlyZXR1cm4gZGlhZ3JhbXMgIT0gbnVsbCAmJiAhZGlhZ3JhbXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Qcm9jZXNzUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ODZkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwjZ2V0QmFzZWRPblByb2Nlc3NlcyA8ZW0+QmFzZWQgT24gUHJvY2Vzc2VzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cwotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkgPGVtPkJhc2VkIE9uIFByb2Nlc3NlczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNlZE9uUHJvY2Vzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8b3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzPiBiYXNlZE9uUHJvY2Vzc2VzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M+IGdldEJhc2VkT25Qcm9jZXNzZXMoKSB7Ci0JCWlmIChiYXNlZE9uUHJvY2Vzc2VzID09IG51bGwpIHsKLQkJCWJhc2VkT25Qcm9jZXNzZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcz4oCi0JCQkJCW9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMpOwotCQl9Ci0JCXJldHVybiBiYXNlZE9uUHJvY2Vzc2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCXJldHVybiBnZXRCYXNlZE9uUHJvY2Vzc2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VEX09OX1BST0NFU1NFUzoKLQkJCWdldEJhc2VkT25Qcm9jZXNzZXMoKS5jbGVhcigpOwotCQkJZ2V0QmFzZWRPblByb2Nlc3NlcygpCi0JCQkJCS5hZGRBbGwoCi0JCQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVM6Ci0JCQlnZXRCYXNlZE9uUHJvY2Vzc2VzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRURfT05fUFJPQ0VTU0VTOgotCQkJcmV0dXJuIGJhc2VkT25Qcm9jZXNzZXMgIT0gbnVsbCAmJiAhYmFzZWRPblByb2Nlc3Nlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Byb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTVmN2UyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Qcm9wZXJ0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvcGVydHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0S2V5IDxlbT5LZXk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Qcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUHJvcGVydHkgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleSgpIDxlbT5LZXk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXkoKSA8ZW0+S2V5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcga2V5ID0gS0VZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBuZXdLZXkpIHsKLQkJU3RyaW5nIG9sZEtleSA9IGtleTsKLQkJa2V5ID0gbmV3S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlBST1BFUlRZX19LRVksIG9sZEtleSwga2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB2YWx1ZTsKLQkJdmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19LRVk6Ci0JCQlyZXR1cm4gZ2V0S2V5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXNldEtleSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fVkFMVUU6Ci0JCQlzZXRWYWx1ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX0tFWToKLQkJCXNldEtleShLRVlfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFlfX1ZBTFVFOgotCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWV9fS0VZOgotCQkJcmV0dXJuIEtFWV9FREVGQVVMVCA9PSBudWxsID8ga2V5ICE9IG51bGwgOiAhS0VZX0VERUZBVUxUCi0JCQkJCS5lcXVhbHMoa2V5KTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST1BFUlRZX19WQUxVRToKLQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVAotCQkJCQkuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChrZXk6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2V5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb3BlcnR5SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2UyMGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5SZWZlcmVuY2VJbXBsI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uIDxlbT5JcyBJbmRpdmlkdWFsIFJlcHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUmVmZXJlbmNlSW1wbCNnZXRSZWZlcmVuY2VkIDxlbT5SZWZlcmVuY2VkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlSW1wbCBleHRlbmRzIERpYWdyYW1FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJlZmVyZW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKSA8ZW0+SXMgSW5kaXZpZHVhbCBSZXByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkgPGVtPklzIEluZGl2aWR1YWwgUmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiA9IElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkKCkgPGVtPlJlZmVyZW5jZWQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEaWFncmFtRWxlbWVudCByZWZlcmVuY2VkOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFRkVSRU5DRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKAotCQkJQm9vbGVhbiBuZXdJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbikgewotCQlCb29sZWFuIG9sZElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JCWlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uID0gbmV3SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OLAotCQkJCQlvbGRJc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiwgaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUVsZW1lbnQgZ2V0UmVmZXJlbmNlZCgpIHsKLQkJaWYgKHJlZmVyZW5jZWQgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHJlZmVyZW5jZWQpLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRSZWZlcmVuY2VkID0gKEludGVybmFsRU9iamVjdCkgcmVmZXJlbmNlZDsKLQkJCXJlZmVyZW5jZWQgPSAoRGlhZ3JhbUVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkUmVmZXJlbmNlZCk7Ci0JCQlpZiAocmVmZXJlbmNlZCAhPSBvbGRSZWZlcmVuY2VkKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRCwgb2xkUmVmZXJlbmNlZCwKLQkJCQkJCQlyZWZlcmVuY2VkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW1FbGVtZW50IGJhc2ljR2V0UmVmZXJlbmNlZCgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVmZXJlbmNlZChEaWFncmFtRWxlbWVudCBuZXdSZWZlcmVuY2VkLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEaWFncmFtRWxlbWVudCBvbGRSZWZlcmVuY2VkID0gcmVmZXJlbmNlZDsKLQkJcmVmZXJlbmNlZCA9IG5ld1JlZmVyZW5jZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELAotCQkJCQlvbGRSZWZlcmVuY2VkLCBuZXdSZWZlcmVuY2VkKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWQoRGlhZ3JhbUVsZW1lbnQgbmV3UmVmZXJlbmNlZCkgewotCQlpZiAobmV3UmVmZXJlbmNlZCAhPSByZWZlcmVuY2VkKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdSZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdSZWZlcmVuY2VkKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlZmVyZW5jZWQobmV3UmVmZXJlbmNlZCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VELCBuZXdSZWZlcmVuY2VkLAotCQkJCQluZXdSZWZlcmVuY2VkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCWlmIChyZWZlcmVuY2VkICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSByZWZlcmVuY2VkKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX0VMRU1FTlRfX1JFRkVSRU5DRSwKLQkJCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldFJlZmVyZW5jZWQoKERpYWdyYW1FbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlyZXR1cm4gYmFzaWNTZXRSZWZlcmVuY2VkKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gZ2V0SXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fUkVGRVJFTkNFRDoKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRSZWZlcmVuY2VkKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlzZXRSZWZlcmVuY2VkKChEaWFncmFtRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRV9fSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTjoKLQkJCXNldElzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKElTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFX19SRUZFUkVOQ0VEOgotCQkJc2V0UmVmZXJlbmNlZCgoRGlhZ3JhbUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX0lTX0lORElWSURVQUxfUkVQUkVTRU5UQVRJT046Ci0JCQlyZXR1cm4gSVNfSU5ESVZJRFVBTF9SRVBSRVNFTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gaXNJbmRpdmlkdWFsUmVwcmVzZW50YXRpb24gIT0gbnVsbAotCQkJCQk6ICFJU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbik7Ci0JCWNhc2UgVW1hUGFja2FnZS5SRUZFUkVOQ0VfX1JFRkVSRU5DRUQ6Ci0JCQlyZXR1cm4gcmVmZXJlbmNlZCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGlzSW5kaXZpZHVhbFJlcHJlc2VudGF0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGI1YTAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVwb3J0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJlcG9ydCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVwb3J0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVQT1JUOwotCX0KLQotfSAvL1JlcG9ydEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTJiMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJldXNhYmxlQXNzZXRJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUmV1c2FibGVBc3NldCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmV1c2FibGVBc3NldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJFVVNBQkxFX0FTU0VUOwotCX0KLQotfSAvL1JldXNhYmxlQXNzZXRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDViZjI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvYWRtYXBJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgUm9hZG1hcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9hZG1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPQURNQVA7Ci0JfQotCi19IC8vUm9hZG1hcEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDg4OTA3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwjZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlSb2xlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNraWxscygpIDxlbT5Ta2lsbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNraWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJTExTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTa2lsbHMoKSA8ZW0+U2tpbGxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2tpbGxzID0gU0tJTExTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhc3NpZ25tZW50QXBwcm9hY2hlcyA9IEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTk9OWU1TX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lub255bXMgPSBTWU5PTllNU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2tpbGxzKCkgewotCQlyZXR1cm4gc2tpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNraWxscyhTdHJpbmcgbmV3U2tpbGxzKSB7Ci0JCVN0cmluZyBvbGRTa2lsbHMgPSBza2lsbHM7Ci0JCXNraWxscyA9IG5ld1NraWxsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMsIG9sZFNraWxscywgc2tpbGxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyBuZXdBc3NpZ25tZW50QXBwcm9hY2hlcykgewotCQlTdHJpbmcgb2xkQXNzaWdubWVudEFwcHJvYWNoZXMgPSBhc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJYXNzaWdubWVudEFwcHJvYWNoZXMgPSBuZXdBc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMsCi0JCQkJCW9sZEFzc2lnbm1lbnRBcHByb2FjaGVzLCBhc3NpZ25tZW50QXBwcm9hY2hlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lub255bXMoKSB7Ci0JCXJldHVybiBzeW5vbnltczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeW5vbnltcyhTdHJpbmcgbmV3U3lub255bXMpIHsKLQkJU3RyaW5nIG9sZFN5bm9ueW1zID0gc3lub255bXM7Ci0JCXN5bm9ueW1zID0gbmV3U3lub255bXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMsIG9sZFN5bm9ueW1zLAotCQkJCQlzeW5vbnltcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXJldHVybiBnZXRTa2lsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCXJldHVybiBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVM6Ci0JCQlyZXR1cm4gZ2V0U3lub255bXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fU0tJTExTOgotCQkJc2V0U2tpbGxzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJc2V0U3lub255bXMoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUzoKLQkJCXNldFNraWxscyhTS0lMTFNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJc2V0QXNzaWdubWVudEFwcHJvYWNoZXMoQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJc2V0U3lub255bXMoU1lOT05ZTVNfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQlyZXR1cm4gU0tJTExTX0VERUZBVUxUID09IG51bGwgPyBza2lsbHMgIT0gbnVsbCA6ICFTS0lMTFNfRURFRkFVTFQKLQkJCQkJLmVxdWFscyhza2lsbHMpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJcmV0dXJuIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9PSBudWxsID8gYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gbnVsbAotCQkJCQk6ICFBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQKLQkJCQkJCQkuZXF1YWxzKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJcmV0dXJuIFNZTk9OWU1TX0VERUZBVUxUID09IG51bGwgPyBzeW5vbnltcyAhPSBudWxsCi0JCQkJCTogIVNZTk9OWU1TX0VERUZBVUxULmVxdWFscyhzeW5vbnltcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoc2tpbGxzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNraWxscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXNzaWdubWVudEFwcHJvYWNoZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYXNzaWdubWVudEFwcHJvYWNoZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN5bm9ueW1zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5bm9ueW1zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWRiNWIzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCNnZXRNb2RpZmllcyA8ZW0+TW9kaWZpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMKLQkJUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZSgpIDxlbT5Sb2xlPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZSByb2xlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiByZXNwb25zaWJsZUZvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBnZXRSb2xlKCkgewotCQlpZiAocm9sZSAhPSBudWxsICYmICgoRU9iamVjdCkgcm9sZSkuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFJvbGUgPSAoSW50ZXJuYWxFT2JqZWN0KSByb2xlOwotCQkJcm9sZSA9IChSb2xlKSBlUmVzb2x2ZVByb3h5KG9sZFJvbGUpOwotCQkJaWYgKHJvbGUgIT0gb2xkUm9sZSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIG9sZFJvbGUsIHJvbGUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBiYXNpY0dldFJvbGUoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGUoUm9sZSBuZXdSb2xlKSB7Ci0JCVJvbGUgb2xkUm9sZSA9IHJvbGU7Ci0JCXJvbGUgPSBuZXdSb2xlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRSwgb2xkUm9sZSwgcm9sZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0TW9kaWZpZXMoKSB7Ci0JCUxpc3QgcGVyZm9ybXMgPSBBc3NvY2lhdGlvbkhlbHBlci5nZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKHRoaXMpOwotCQlJbnRlcm5hbEVMaXN0IG1vZGlmaWVzID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdCgKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MpOwotCQlpZiAocGVyZm9ybXMgIT0gbnVsbCAmJiBwZXJmb3Jtcy5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBwZXJmb3Jtcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlUYXNrRGVzY3JpcHRvciB0ZCA9IChUYXNrRGVzY3JpcHRvcikgaS5uZXh0KCk7Ci0KLQkJCQkvLyBmb3IgZWFjaCB0YXNrLCBnZXQgb3V0cHV0IHdvcmsgcHJvZHVjdDsKLQkJCQlMaXN0IG91dHB1dFdQcyA9IHRkLmdldE91dHB1dCgpOwotCQkJCWlmIChvdXRwdXRXUHMgIT0gbnVsbCAmJiBvdXRwdXRXUHMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0V1BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQgPSAoV29ya1Byb2R1Y3REZXNjcmlwdG9yKSBpdAotCQkJCQkJCQkubmV4dCgpOwotCQkJCQkJaWYgKHdwZCAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtb2RpZmllcy5jb250YWlucyh3cGQpKSB7Ci0JCQkJCQkJCW1vZGlmaWVzLmFkZCh3cGQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCQl9Ci0JCXJldHVybiByZXNwb25zaWJsZUZvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0Um9sZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUzoKLQkJCXJldHVybiBnZXRNb2RpZmllcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJc2V0Um9sZSgoUm9sZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUzoKLQkJCWdldE1vZGlmaWVzKCkuY2xlYXIoKTsKLQkJCWdldE1vZGlmaWVzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQlzZXRSb2xlKChSb2xlKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlnZXRNb2RpZmllcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJcmV0dXJuIHJvbGUgIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I6Ci0JCQlyZXR1cm4gcmVzcG9uc2libGVGb3IgIT0gbnVsbCAmJiAhcmVzcG9uc2libGVGb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLX0gLy9Sb2xlRGVzY3JpcHRvckltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjJjMzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldEZ1bGZpbGxzIDxlbT5GdWxmaWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldE1vZGlmaWVzIDxlbT5Nb2RpZmllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlJvbGVJbXBsI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJvbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsZmlsbHMoKSA8ZW0+RnVsZmlsbHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RnVsZmlsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+IGZ1bGZpbGxzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IHJlc3BvbnNpYmxlRm9yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZ2V0RnVsZmlsbHMoKSB7Ci0JCWlmIChmdWxmaWxscyA9PSBudWxsKSB7Ci0JCQlmdWxmaWxscyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RnVsZmlsbGFibGVFbGVtZW50PigKLQkJCQkJRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJPTEVfX0ZVTEZJTExTKTsKLQkJfQotCQlyZXR1cm4gZnVsZmlsbHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNb2RpZmllcygpIHsKLQkJcmV0dXJuIEFzc29jaWF0aW9uSGVscGVyLmdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0PiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxXb3JrUHJvZHVjdD4oCi0JCQkJCVdvcmtQcm9kdWN0LmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0JCX0KLQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0ZVTEZJTExTOgotCQkJcmV0dXJuIGdldEZ1bGZpbGxzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCXJldHVybiBnZXRNb2RpZmllcygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJZ2V0RnVsZmlsbHMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGdWxmaWxsYWJsZUVsZW1lbnQ+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCWdldE1vZGlmaWVzKCkuY2xlYXIoKTsKLQkJCWdldE1vZGlmaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX19NT0RJRklFUzoKLQkJCWdldE1vZGlmaWVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fTU9ESUZJRVM6Ci0JCQlyZXR1cm4gIWdldE1vZGlmaWVzKCkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJcmV0dXJuIHJlc3BvbnNpYmxlRm9yICE9IG51bGwgJiYgIXJlc3BvbnNpYmxlRm9yLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVF9fRlVMRklMTFM6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuUk9MRV9fRlVMRklMTFM7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vUm9sZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEdyb3VwaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjg3YWNkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldFJvbGVTZXRzIDxlbT5Sb2xlIFNldHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0R3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzCi0JCVJvbGVTZXRHcm91cGluZyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlU2V0cygpIDxlbT5Sb2xlIFNldHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um9sZVNldHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxSb2xlU2V0PiByb2xlU2V0czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0R3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX1NFVF9HUk9VUElORzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlU2V0PiBnZXRSb2xlU2V0cygpIHsKLQkJaWYgKHJvbGVTZXRzID09IG51bGwpIHsKLQkJCXJvbGVTZXRzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlU2V0PihSb2xlU2V0LmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFMpOwotCQl9Ci0JCXJldHVybiByb2xlU2V0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJcmV0dXJuIGdldFJvbGVTZXRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVFM6Ci0JCQlnZXRSb2xlU2V0cygpLmNsZWFyKCk7Ci0JCQlnZXRSb2xlU2V0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZVNldD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJZ2V0Um9sZVNldHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVRTOgotCQkJcmV0dXJuIHJvbGVTZXRzICE9IG51bGwgJiYgIXJvbGVTZXRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZVNldEdyb3VwaW5nSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxOGE4OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvUm9sZVNldEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Sb2xlU2V0SW1wbCNnZXRSb2xlcyA8ZW0+Um9sZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2xlU2V0SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvbGVzKCkgPGVtPlJvbGVzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZT4gcm9sZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfU0VUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGU+IGdldFJvbGVzKCkgewotCQlpZiAocm9sZXMgPT0gbnVsbCkgewotCQkJcm9sZXMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFJvbGU+KFJvbGUuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTKTsKLQkJfQotCQlyZXR1cm4gcm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJcmV0dXJuIGdldFJvbGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFUzoKLQkJCWdldFJvbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX1JPTEVTOgotCQkJcmV0dXJuIHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vUm9sZVNldEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZWN0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3N2RjNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uIDxlbT5TZWN0aW9uIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U3ViU2VjdGlvbnMgPGVtPlN1YiBTZWN0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25JbXBsIGV4dGVuZHMgVmFyaWFiaWxpdHlFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNlY3Rpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbk5hbWUoKSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWN0aW9uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzZWN0aW9uTmFtZSA9IFNFQ1RJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uRGVzY3JpcHRpb24oKSA8ZW0+U2VjdGlvbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25EZXNjcmlwdGlvbiA9IFNFQ1RJT05fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJTZWN0aW9ucygpIDxlbT5TdWIgU2VjdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3ViU2VjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzdWJTZWN0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWRlY2Vzc29yKCkgPGVtPlByZWRlY2Vzc29yPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3Rpb24gcHJlZGVjZXNzb3I7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNFQ1RJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHNlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZyBuZXdTZWN0aW9uTmFtZSkgewotCQlTdHJpbmcgb2xkU2VjdGlvbk5hbWUgPSBzZWN0aW9uTmFtZTsKLQkJc2VjdGlvbk5hbWUgPSBuZXdTZWN0aW9uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUUsIG9sZFNlY3Rpb25OYW1lLAotCQkJCQlzZWN0aW9uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gc2VjdGlvbkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY3Rpb25EZXNjcmlwdGlvbihTdHJpbmcgbmV3U2VjdGlvbkRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRTZWN0aW9uRGVzY3JpcHRpb24gPSBzZWN0aW9uRGVzY3JpcHRpb247Ci0JCXNlY3Rpb25EZXNjcmlwdGlvbiA9IG5ld1NlY3Rpb25EZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX0RFU0NSSVBUSU9OLAotCQkJCQlvbGRTZWN0aW9uRGVzY3JpcHRpb24sIHNlY3Rpb25EZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFN1YlNlY3Rpb25zKCkgewotCQlpZiAoc3ViU2VjdGlvbnMgPT0gbnVsbCkgewotCQkJc3ViU2VjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3QuUmVzb2x2aW5nPFNlY3Rpb24+KAotCQkJCQlTZWN0aW9uLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHN1YlNlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGdldFByZWRlY2Vzc29yKCkgewotCQlpZiAocHJlZGVjZXNzb3IgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWRlY2Vzc29yKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlZGVjZXNzb3IgPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVkZWNlc3NvcjsKLQkJCXByZWRlY2Vzc29yID0gKFNlY3Rpb24pIGVSZXNvbHZlUHJveHkob2xkUHJlZGVjZXNzb3IpOwotCQkJaWYgKHByZWRlY2Vzc29yICE9IG9sZFByZWRlY2Vzc29yKSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SLCBvbGRQcmVkZWNlc3NvciwKLQkJCQkJCQlwcmVkZWNlc3NvcikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBiYXNpY0dldFByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gcHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZGVjZXNzb3IoU2VjdGlvbiBuZXdQcmVkZWNlc3NvcikgewotCQlTZWN0aW9uIG9sZFByZWRlY2Vzc29yID0gcHJlZGVjZXNzb3I7Ci0JCXByZWRlY2Vzc29yID0gbmV3UHJlZGVjZXNzb3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1IsIG9sZFByZWRlY2Vzc29yLAotCQkJCQlwcmVkZWNlc3NvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRTdWJTZWN0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwKLQkJCQkJbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXJldHVybiBnZXRTZWN0aW9uTmFtZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTjoKLQkJCXJldHVybiBnZXRTZWN0aW9uRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiBnZXRTdWJTZWN0aW9ucygpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWRlY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCXNldFNlY3Rpb25OYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlzZXRTZWN0aW9uRGVzY3JpcHRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT05TOgotCQkJZ2V0U3ViU2VjdGlvbnMoKS5jbGVhcigpOwotCQkJZ2V0U3ViU2VjdGlvbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNlY3Rpb24+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXNldFByZWRlY2Vzc29yKChTZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJc2V0U2VjdGlvbk5hbWUoU0VDVElPTl9OQU1FX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlzZXRTZWN0aW9uRGVzY3JpcHRpb24oU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTlM6Ci0JCQlnZXRTdWJTZWN0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXNldFByZWRlY2Vzc29yKChTZWN0aW9uKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJcmV0dXJuIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbk5hbWUgIT0gbnVsbAotCQkJCQk6ICFTRUNUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlY3Rpb25OYW1lKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gc2VjdGlvbkRlc2NyaXB0aW9uICE9IG51bGwKLQkJCQkJOiAhU0VDVElPTl9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NVQl9TRUNUSU9OUzoKLQkJCXJldHVybiBzdWJTZWN0aW9ucyAhPSBudWxsICYmICFzdWJTZWN0aW9ucy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBwcmVkZWNlc3NvciAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNlY3Rpb25OYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHNlY3Rpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZWN0aW9uRGVzY3JpcHRpb246ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vU2VjdGlvbkltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYmM1YTkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NlbWFudGljTW9kZWxCcmlkZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlbWFudGljIE1vZGVsIEJyaWRnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuU2VtYW50aWNNb2RlbEJyaWRnZUltcGwjZ2V0RGlhZ3JhbSA8ZW0+RGlhZ3JhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlNlbWFudGljTW9kZWxCcmlkZ2VJbXBsI2dldEdyYXBoRWxlbWVudCA8ZW0+R3JhcGggRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGV4dGVuZHMgRGlhZ3JhbUVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgU2VtYW50aWNNb2RlbEJyaWRnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGF0aW9uKCkgPGVtPlByZXNlbnRhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRhdGlvbigpIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVzZW50YXRpb24gPSBQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VtYW50aWNNb2RlbEJyaWRnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNFTUFOVElDX01PREVMX0JSSURHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oU3RyaW5nIG5ld1ByZXNlbnRhdGlvbikgewotCQlTdHJpbmcgb2xkUHJlc2VudGF0aW9uID0gcHJlc2VudGF0aW9uOwotCQlwcmVzZW50YXRpb24gPSBuZXdQcmVzZW50YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04sCi0JCQkJCW9sZFByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBnZXRHcmFwaEVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoR3JhcGhFbGVtZW50KSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWxlbWVudCBiYXNpY0dldEdyYXBoRWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChHcmFwaEVsZW1lbnQpIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50LAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0dyYXBoRWxlbWVudCwKLQkJCQlVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCwgbXNncyk7Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyYXBoRWxlbWVudChHcmFwaEVsZW1lbnQgbmV3R3JhcGhFbGVtZW50KSB7Ci0JCWlmIChuZXdHcmFwaEVsZW1lbnQgIT0gZUludGVybmFsQ29udGFpbmVyKCkKLQkJCQl8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCAmJiBuZXdHcmFwaEVsZW1lbnQgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkJIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlSW50ZXJuYWxDb250YWluZXIoKSAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyYXBoRWxlbWVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3R3JhcGhFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UX19TRU1BTlRJQ19NT0RFTCwKLQkJCQkJCUdyYXBoRWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHcmFwaEVsZW1lbnQobmV3R3JhcGhFbGVtZW50LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQsCi0JCQkJCW5ld0dyYXBoRWxlbWVudCwgbmV3R3JhcGhFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEaWFncmFtKSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpYWdyYW0gYmFzaWNHZXREaWFncmFtKCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERpYWdyYW0pIGVJbnRlcm5hbENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldERpYWdyYW0oRGlhZ3JhbSBuZXdEaWFncmFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQltc2dzID0gZUJhc2ljU2V0Q29udGFpbmVyKChJbnRlcm5hbEVPYmplY3QpIG5ld0RpYWdyYW0sCi0JCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sIG1zZ3MpOwotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtKERpYWdyYW0gbmV3RGlhZ3JhbSkgewotCQlpZiAobmV3RGlhZ3JhbSAhPSBlSW50ZXJuYWxDb250YWluZXIoKQotCQkJCXx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNICYmIG5ld0RpYWdyYW0gIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCAoRU9iamVjdCkgbmV3RGlhZ3JhbSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJCSJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEaWFncmFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEaWFncmFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5ESUFHUkFNX19OQU1FU1BBQ0UsIERpYWdyYW0uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlhZ3JhbShuZXdEaWFncmFtLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU0sIG5ld0RpYWdyYW0sCi0JCQkJCW5ld0RpYWdyYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJaWYgKGVJbnRlcm5hbENvbnRhaW5lcigpICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKChEaWFncmFtKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAoZUludGVybmFsQ29udGFpbmVyKCkgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCXJldHVybiBiYXNpY1NldEdyYXBoRWxlbWVudCgoR3JhcGhFbGVtZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0RJQUdSQU06Ci0JCQlyZXR1cm4gYmFzaWNTZXREaWFncmFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJcmV0dXJuIGJhc2ljU2V0R3JhcGhFbGVtZW50KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lckZlYXR1cmUoCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGVJbnRlcm5hbENvbnRhaW5lcigpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuRElBR1JBTV9fTkFNRVNQQUNFLCBEaWFncmFtLmNsYXNzLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVDoKLQkJCXJldHVybiBlSW50ZXJuYWxDb250YWluZXIoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQlVbWFQYWNrYWdlLkdSQVBIX0VMRU1FTlRfX1NFTUFOVElDX01PREVMLAotCQkJCQlHcmFwaEVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyRmVhdHVyZShtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXJldHVybiBnZXRQcmVzZW50YXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fRElBR1JBTToKLQkJCWlmIChyZXNvbHZlKQotCQkJCXJldHVybiBnZXREaWFncmFtKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXREaWFncmFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0R3JhcGhFbGVtZW50KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT046Ci0JCQlzZXRQcmVzZW50YXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19HUkFQSF9FTEVNRU5UOgotCQkJc2V0R3JhcGhFbGVtZW50KChHcmFwaEVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX1BSRVNFTlRBVElPTjoKLQkJCXNldFByZXNlbnRhdGlvbihQUkVTRU5UQVRJT05fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJc2V0RGlhZ3JhbSgoRGlhZ3JhbSkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlzZXRHcmFwaEVsZW1lbnQoKEdyYXBoRWxlbWVudCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRV9fUFJFU0VOVEFUSU9OOgotCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlc2VudGF0aW9uICE9IG51bGwKLQkJCQkJOiAhUFJFU0VOVEFUSU9OX0VERUZBVUxULmVxdWFscyhwcmVzZW50YXRpb24pOwotCQljYXNlIFVtYVBhY2thZ2UuU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNOgotCQkJcmV0dXJuIGJhc2ljR2V0RGlhZ3JhbSgpICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRU1BTlRJQ19NT0RFTF9CUklER0VfX0dSQVBIX0VMRU1FTlQ6Ci0JCQlyZXR1cm4gYmFzaWNHZXRHcmFwaEVsZW1lbnQoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHByZXNlbnRhdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwcmVzZW50YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9TZW1hbnRpY01vZGVsQnJpZGdlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDYxZDZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwjZ2V0VHlwZUluZm8gPGVtPlR5cGUgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbCBleHRlbmRzIFNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCi0JCWltcGxlbWVudHMgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVJbmZvKCkgPGVtPlR5cGUgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfSU5GT19FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUluZm8oKSA8ZW0+VHlwZSBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0eXBlSW5mbyA9IFRZUEVfSU5GT19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUluZm8oKSB7Ci0JCXJldHVybiB0eXBlSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlSW5mbyhTdHJpbmcgbmV3VHlwZUluZm8pIHsKLQkJU3RyaW5nIG9sZFR5cGVJbmZvID0gdHlwZUluZm87Ci0JCXR5cGVJbmZvID0gbmV3VHlwZUluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTywKLQkJCQkJb2xkVHlwZUluZm8sIHR5cGVJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlRfX1RZUEVfSU5GTzoKLQkJCXJldHVybiBnZXRUeXBlSW5mbygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJc2V0VHlwZUluZm8oKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk86Ci0JCQlzZXRUeXBlSW5mbyhUWVBFX0lORk9fRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVF9fVFlQRV9JTkZPOgotCQkJcmV0dXJuIFRZUEVfSU5GT19FREVGQVVMVCA9PSBudWxsID8gdHlwZUluZm8gIT0gbnVsbAotCQkJCQk6ICFUWVBFX0lORk9fRURFRkFVTFQuZXF1YWxzKHR5cGVJbmZvKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlSW5mbzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh0eXBlSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N0ZXBJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlYTY2ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvU3RlcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0ZXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5TdGVwSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlN0ZXBJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGVwSW1wbCBleHRlbmRzIFNlY3Rpb25JbXBsIGltcGxlbWVudHMgU3RlcCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdGVwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU1RFUDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCWlmIChwcmVjb25kaXRpb24gIT0gbnVsbCAmJiAoKEVPYmplY3QpIHByZWNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCXByZWNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWNvbmRpdGlvbik7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG9sZFByZWNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQcmVjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb247Ci0JCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG9sZFByZWNvbmRpdGlvbi5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1ByZWNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQcmVjb25kaXRpb24KLQkJCQkJCQkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQkJfQotCQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLCBvbGRQcmVjb25kaXRpb24sCi0JCQkJCQkJcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQlvbGRQcmVjb25kaXRpb24sIG5ld1ByZWNvbmRpdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBub3RpZmljYXRpb247Ci0JCQllbHNlCi0JCQkJbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24pIHsKLQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBwcmVjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQcmVjb25kaXRpb24pLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTiwgbmV3UHJlY29uZGl0aW9uLAotCQkJCQluZXdQcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcG9zdGNvbmRpdGlvbikuZUlzUHJveHkoKSkgewotCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFBvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJcG9zdGNvbmRpdGlvbiA9IChDb25zdHJhaW50KSBlUmVzb2x2ZVByb3h5KG9sZFBvc3Rjb25kaXRpb24pOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gb2xkUG9zdGNvbmRpdGlvbikgewotCQkJCUludGVybmFsRU9iamVjdCBuZXdQb3N0Y29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUG9zdGNvbmRpdGlvbgotCQkJCQkJLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT04sIG51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1Bvc3Rjb25kaXRpb24uZUludmVyc2VBZGQodGhpcywKLQkJCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwKLQkJCQkJCQltc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLAotCQkJCQkJCXBvc3Rjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlDb25zdHJhaW50IG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3Rjb25kaXRpb24obmV3UG9zdGNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTiwgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QUkVDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQcmVjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJcmV0dXJuIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCXJldHVybiBiYXNpY0dldFBvc3Rjb25kaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuU1RFUF9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TVEVQX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gV29ya0RlZmluaXRpb24uY2xhc3MpIHsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlNURVBfX1BSRUNPTkRJVElPTjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuU1RFUF9fUE9TVENPTkRJVElPTjsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLX0gLy9TdGVwSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9TdXBwb3J0aW5nTWF0ZXJpYWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2I3MTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlNVUFBPUlRJTkdfTUFURVJJQUw7Ci0JfQotCi19IC8vU3VwcG9ydGluZ01hdGVyaWFsSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OTAxZDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cwotCQlUYXNrRGVzY3JpcHRpb24gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVSUE9TRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsIG9sZEFsdGVybmF0aXZlcywKLQkJCQkJYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbAotCQkJCQk6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbHRlcm5hdGl2ZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWx0ZXJuYXRpdmVzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGFza0Rlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rhc2tEZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTFmMDQwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLkRlZmF1bHRWYWx1ZU1hbmFnZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYXNrIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0VGFzayA8ZW0+VGFzazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldFNlbGVjdGVkU3RlcHMgPGVtPlNlbGVjdGVkIFN0ZXBzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0Rlc2NyaXB0b3JJbXBsIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGFza0Rlc2NyaXB0b3IgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ0MTk0MTQ2NjQyNzM5MTA4NjNMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFzayB0YXNrOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGVEZXNjcmlwdG9yPiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lzdGVkQnkoKSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaXN0ZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGVEZXNjcmlwdG9yPiBhc3Npc3RlZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXh0ZXJuYWxJbnB1dCgpIDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbElucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBleHRlcm5hbElucHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuZGF0b3J5SW5wdXQoKSA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBtYW5kYXRvcnlJbnB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9wdGlvbmFsSW5wdXQoKSA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWxJbnB1dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gb3B0aW9uYWxJbnB1dDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE91dHB1dCgpIDxlbT5PdXRwdXQ8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3V0cHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBvdXRwdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZURlc2NyaXB0b3I+IHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VsZWN0ZWRTdGVwcygpIDxlbT5TZWxlY3RlZCBTdGVwczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWxlY3RlZFN0ZXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U2VjdGlvbj4gc2VsZWN0ZWRTdGVwczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCXJldHVybiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKEJvb2xlYW4gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSB7Ci0JCUJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UsCi0JCQkJCW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgZ2V0VGFzaygpIHsKLQkJaWYgKHRhc2sgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHRhc2spLmVJc1Byb3h5KCkpIHsKLQkJCUludGVybmFsRU9iamVjdCBvbGRUYXNrID0gKEludGVybmFsRU9iamVjdCkgdGFzazsKLQkJCXRhc2sgPSAoVGFzaykgZVJlc29sdmVQcm94eShvbGRUYXNrKTsKLQkJCWlmICh0YXNrICE9IG9sZFRhc2spIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLAotCQkJCQkJCVVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLLCBvbGRUYXNrLCB0YXNrKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2sgYmFzaWNHZXRUYXNrKCkgewotCQlyZXR1cm4gdGFzazsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgbmV3VGFzaykgewotCQlUYXNrIG9sZFRhc2sgPSB0YXNrOwotCQl0YXNrID0gbmV3VGFzazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0ssIG9sZFRhc2ssIHRhc2spKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0QXNzaXN0ZWRCeSgpIHsKLQkJaWYgKGFzc2lzdGVkQnkgPT0gbnVsbCkgewotCQkJYXNzaXN0ZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYXNzaXN0ZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEV4dGVybmFsSW5wdXQoKSB7Ci0JCWlmIChleHRlcm5hbElucHV0ID09IG51bGwpIHsKLQkJCWV4dGVybmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJfQotCQlyZXR1cm4gZXh0ZXJuYWxJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlpZiAobWFuZGF0b3J5SW5wdXQgPT0gbnVsbCkgewotCQkJbWFuZGF0b3J5SW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCX0KLQkJcmV0dXJuIG1hbmRhdG9yeUlucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3B0aW9uYWxJbnB1dCgpIHsKLQkJaWYgKG9wdGlvbmFsSW5wdXQgPT0gbnVsbCkgewotCQkJb3B0aW9uYWxJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBvcHRpb25hbElucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0T3V0cHV0KCkgewotCQlpZiAob3V0cHV0ID09IG51bGwpIHsKLQkJCW91dHB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPigKLQkJCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUKTsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJvbGVEZXNjcmlwdG9yPiBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJaWYgKHBlcmZvcm1lZFByaW1hcmlseUJ5ID09IG51bGwpIHsKLQkJCXBlcmZvcm1lZFByaW1hcmlseUJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlRGVzY3JpcHRvcj4oCi0JCQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZFByaW1hcmlseUJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFNlY3Rpb24+IGdldFNlbGVjdGVkU3RlcHMoKSB7Ci0JCWlmIChzZWxlY3RlZFN0ZXBzID09IG51bGwpIHsKLQkJCXNlbGVjdGVkU3RlcHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFNlY3Rpb24+KFNlY3Rpb24uY2xhc3MsCi0JCQkJCXRoaXMsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUyk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkU3RlcHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQlyZXR1cm4gZ2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0VGFzaygpOwotCQkJcmV0dXJuIGJhc2ljR2V0VGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJcmV0dXJuIGdldEFzc2lzdGVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dCgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZXR1cm4gZ2V0T3V0cHV0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlyZXR1cm4gZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFM6Ci0JCQlyZXR1cm4gZ2V0U2VsZWN0ZWRTdGVwcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJc2V0VGFzaygoVGFzaykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFzc2lzdGVkQnkoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCWdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fT1VUUFVUOgotCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCWdldE91dHB1dCgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCWdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuY2xlYXIoKTsKLQkJCWdldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZURlc2NyaXB0b3I+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NFTEVDVEVEX1NURVBTOgotCQkJZ2V0U2VsZWN0ZWRTdGVwcygpLmNsZWFyKCk7Ci0JCQlnZXRTZWxlY3RlZFN0ZXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQlzZXRUYXNrKChUYXNrKSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQlnZXRBc3Npc3RlZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQlnZXRFeHRlcm5hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCWdldFNlbGVjdGVkU3RlcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCXJldHVybiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPT0gbnVsbCA/IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSAhPSBudWxsCi0JCQkJCTogIUlTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVAotCQkJCQkJCS5lcXVhbHMoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCXJldHVybiB0YXNrICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgIT0gbnVsbAotCQkJCQkmJiAhYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCXJldHVybiBhc3Npc3RlZEJ5ICE9IG51bGwgJiYgIWFzc2lzdGVkQnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVDoKLQkJCXJldHVybiBleHRlcm5hbElucHV0ICE9IG51bGwgJiYgIWV4dGVybmFsSW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gbWFuZGF0b3J5SW5wdXQgIT0gbnVsbCAmJiAhbWFuZGF0b3J5SW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCXJldHVybiBvcHRpb25hbElucHV0ICE9IG51bGwgJiYgIW9wdGlvbmFsSW5wdXQuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQlyZXR1cm4gb3V0cHV0ICE9IG51bGwgJiYgIW91dHB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQlyZXR1cm4gcGVyZm9ybWVkUHJpbWFyaWx5QnkgIT0gbnVsbAotCQkJCQkmJiAhcGVyZm9ybWVkUHJpbWFyaWx5QnkuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TRUxFQ1RFRF9TVEVQUzoKLQkJCXJldHVybiBzZWxlY3RlZFN0ZXBzICE9IG51bGwgJiYgIXNlbGVjdGVkU3RlcHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRGVzY3JpcHRvci5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEZXNjcmlwdG9yLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gQmVnaW4gb2YgY3VzdG9tIGNvZGUgCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQlzdGF0aWMgewotCQkvLyBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBCcmVha2Rvd25FbGVtZW50LmlzUGxhbm5lZAotCQkvLwotCQlEZWZhdWx0VmFsdWVNYW5hZ2VyLklOU1RBTkNFLnNldFN0YXRpY0RlZmF1bHRWYWx1ZShVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRUYXNrRGVzY3JpcHRvcigpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci19IC8vVGFza0Rlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGFza0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmUzMWJhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRNYW5kYXRvcnlJbnB1dCA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UYXNrSW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0U3RlcHMgPGVtPlN0ZXBzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGFza0ltcGwjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRhc2tJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgVGFzayB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjb25kaXRpb24oKSA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb25zdHJhaW50IHByZWNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcG9zdGNvbmRpdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcmZvcm1lZEJ5KCkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGU+IHBlcmZvcm1lZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFuZGF0b3J5SW5wdXQoKSA8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IG1hbmRhdG9yeUlucHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3V0cHV0KCkgPGVtPk91dHB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPdXRwdXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrUHJvZHVjdD4gb3V0cHV0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJvbGU+IGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWxJbnB1dCgpIDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3Q+IG9wdGlvbmFsSW5wdXQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUb29sTWVudG9yPiB0b29sTWVudG9yczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UHJlY29uZGl0aW9uLmVJbnRlcm5hbENvbnRhaW5lcigpID09IG51bGwpIHsKLQkJCQkJbXNncyA9IG5ld1ByZWNvbmRpdGlvbgotCQkJCQkJCS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCQl9Ci0JCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQkJbXNncy5kaXNwYXRjaCgpOwotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwKLQkJCQkJCQlwcmVjb25kaXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gcHJlY29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQcmVjb25kaXRpb24gPSBwcmVjb25kaXRpb247Ci0JCXByZWNvbmRpdGlvbiA9IG5ld1ByZWNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1ByZWNvbmRpdGlvbikuZUludmVyc2VBZGQodGhpcywKLQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlY29uZGl0aW9uKG5ld1ByZWNvbmRpdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uCi0JCQkJCQkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTiwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UG9zdGNvbmRpdGlvbi5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLAotCQkJCQkJCW1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sCi0JCQkJCQkJcG9zdGNvbmRpdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUG9zdGNvbmRpdGlvbiA9IHBvc3Rjb25kaXRpb247Ci0JCXBvc3Rjb25kaXRpb24gPSBuZXdQb3N0Y29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLAotCQkJCQlOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sCi0JCQkJCW9sZFBvc3Rjb25kaXRpb24sIG5ld1Bvc3Rjb25kaXRpb24pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbm90aWZpY2F0aW9uOwotCQkJZWxzZQotCQkJCW1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdGNvbmRpdGlvbihDb25zdHJhaW50IG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJaWYgKG5ld1Bvc3Rjb25kaXRpb24gIT0gcG9zdGNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcG9zdGNvbmRpdGlvbikKLQkJCQkJCS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKQotCQkJCQkJLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJLSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdGNvbmRpdGlvbihuZXdQb3N0Y29uZGl0aW9uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9IGVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBuZXdQb3N0Y29uZGl0aW9uLAotCQkJCQluZXdQb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8Um9sZT4gZ2V0UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChwZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlwZXJmb3JtZWRCeSA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZT4oUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0TWFuZGF0b3J5SW5wdXQoKSB7Ci0JCWlmIChtYW5kYXRvcnlJbnB1dCA9PSBudWxsKSB7Ci0JCQltYW5kYXRvcnlJbnB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KAotCQkJCQlXb3JrUHJvZHVjdC5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBtYW5kYXRvcnlJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdD4gZ2V0T3V0cHV0KCkgewotCQlpZiAob3V0cHV0ID09IG51bGwpIHsKLQkJCW91dHB1dCA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8V29ya1Byb2R1Y3Q+KFdvcmtQcm9kdWN0LmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlPiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpIHsKLQkJaWYgKGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxSb2xlPigKLQkJCQkJUm9sZS5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJfQotCQlyZXR1cm4gYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCWlmIChvcHRpb25hbElucHV0ID09IG51bGwpIHsKLQkJCW9wdGlvbmFsSW5wdXQgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQl9Ci0JCXJldHVybiBvcHRpb25hbElucHV0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICovCi0JcHVibGljIExpc3QgZ2V0U3RlcHMoKSB7Ci0JCXJldHVybiBnZXRQcmVzZW50YXRpb24oKS5nZXRTZWN0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHRvb2xNZW50b3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlpZiAoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID09IG51bGwpIHsKLQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPigKLQkJCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMpOwotCQl9Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UHJlY29uZGl0aW9uKCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRQcmVjb25kaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGdldFBlcmZvcm1lZEJ5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCXJldHVybiBnZXRPdXRwdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQlyZXR1cm4gZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIGdldE9wdGlvbmFsSW5wdXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJcmV0dXJuIGdldFN0ZXBzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldFBlcmZvcm1lZEJ5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fTUFOREFUT1JZX0lOUFVUOgotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPdXRwdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJZ2V0T3B0aW9uYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3Q+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCWdldFN0ZXBzKCkuY2xlYXIoKTsKLQkJCWdldFN0ZXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdGVwPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlzZXRQb3N0Y29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCWdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09VVFBVVDoKLQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1BUSU9OQUxfSU5QVVQ6Ci0JCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1NURVBTOgotCQkJZ2V0U3RlcHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQlyZXR1cm4gcG9zdGNvbmRpdGlvbiAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIHBlcmZvcm1lZEJ5ICE9IG51bGwgJiYgIXBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX01BTkRBVE9SWV9JTlBVVDoKLQkJCXJldHVybiBtYW5kYXRvcnlJbnB1dCAhPSBudWxsICYmICFtYW5kYXRvcnlJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQlyZXR1cm4gb3V0cHV0ICE9IG51bGwgJiYgIW91dHB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJcmV0dXJuIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5ICE9IG51bGwKLQkJCQkJJiYgIWFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5LmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJcmV0dXJuIG9wdGlvbmFsSW5wdXQgIT0gbnVsbCAmJiAhb3B0aW9uYWxJbnB1dC5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19TVEVQUzoKLQkJCXJldHVybiAhZ2V0U3RlcHMoKS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gdG9vbE1lbnRvcnMgIT0gbnVsbCAmJiAhdG9vbE1lbnRvcnMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFdvcmtEZWZpbml0aW9uLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IFdvcmtEZWZpbml0aW9uLmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT047Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT047Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi19IC8vVGFza0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZWFtUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1ZGNmNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZWFtIFByb2ZpbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0VGVhbVJvbGVzIDxlbT5UZWFtIFJvbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlYW1Qcm9maWxlSW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsIGltcGxlbWVudHMKLQkJVGVhbVByb2ZpbGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGVhbVJvbGVzKCkgPGVtPlRlYW0gUm9sZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVhbVJvbGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Um9sZURlc2NyaXB0b3I+IHRlYW1Sb2xlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1cGVyVGVhbSgpIDxlbT5TdXBlciBUZWFtPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdXBlclRlYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZSBzdXBlclRlYW07Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJUZWFtKCkgPGVtPlN1YiBUZWFtPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YlRlYW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUZWFtUHJvZmlsZT4gc3ViVGVhbTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxSb2xlRGVzY3JpcHRvcj4gZ2V0VGVhbVJvbGVzKCkgewotCQlpZiAodGVhbVJvbGVzID09IG51bGwpIHsKLQkJCXRlYW1Sb2xlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8Um9sZURlc2NyaXB0b3I+KAotCQkJCQlSb2xlRGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVMpOwotCQl9Ci0JCXJldHVybiB0ZWFtUm9sZXM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlYW1Qcm9maWxlIGdldFN1cGVyVGVhbSgpIHsKLQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsICYmICgoRU9iamVjdCkgc3VwZXJUZWFtKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkU3VwZXJUZWFtID0gKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtOwotCQkJc3VwZXJUZWFtID0gKFRlYW1Qcm9maWxlKSBlUmVzb2x2ZVByb3h5KG9sZFN1cGVyVGVhbSk7Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG9sZFN1cGVyVGVhbSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sIG9sZFN1cGVyVGVhbSwKLQkJCQkJCQlzdXBlclRlYW0pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBiYXNpY0dldFN1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIHN1cGVyVGVhbTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdXBlclRlYW0oVGVhbVByb2ZpbGUgbmV3U3VwZXJUZWFtLAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlUZWFtUHJvZmlsZSBvbGRTdXBlclRlYW0gPSBzdXBlclRlYW07Ci0JCXN1cGVyVGVhbSA9IG5ld1N1cGVyVGVhbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywKLQkJCQkJTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0sCi0JCQkJCW9sZFN1cGVyVGVhbSwgbmV3U3VwZXJUZWFtKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyVGVhbShUZWFtUHJvZmlsZSBuZXdTdXBlclRlYW0pIHsKLQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBzdXBlclRlYW0pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHN1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgc3VwZXJUZWFtKS5lSW52ZXJzZVJlbW92ZSh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJaWYgKG5ld1N1cGVyVGVhbSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3U3VwZXJUZWFtKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNLCBUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkJCW1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3VwZXJUZWFtKG5ld1N1cGVyVGVhbSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfSBlbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNLCBuZXdTdXBlclRlYW0sCi0JCQkJCW5ld1N1cGVyVGVhbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRlYW1Qcm9maWxlPiBnZXRTdWJUZWFtKCkgewotCQlpZiAoc3ViVGVhbSA9PSBudWxsKSB7Ci0JCQlzdWJUZWFtID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0PFRlYW1Qcm9maWxlPigKLQkJCQkJVGVhbVByb2ZpbGUuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTSwKLQkJCQkJVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0pOwotCQl9Ci0JCXJldHVybiBzdWJUZWFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlpZiAoc3VwZXJUZWFtICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBzdXBlclRlYW0pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0sIFRlYW1Qcm9maWxlLmNsYXNzLAotCQkJCQkJbXNncyk7Ci0JCQlyZXR1cm4gYmFzaWNTZXRTdXBlclRlYW0oKFRlYW1Qcm9maWxlKSBvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDxJbnRlcm5hbEVPYmplY3Q+KSAoSW50ZXJuYWxFTGlzdDw/PikgZ2V0U3ViVGVhbSgpKQotCQkJCQkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLAotCQkJaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJcmV0dXJuIGJhc2ljU2V0U3VwZXJUZWFtKG51bGwsIG1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldFN1YlRlYW0oKSkKLQkJCQkJLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJcmV0dXJuIGdldFRlYW1Sb2xlcygpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFN1cGVyVGVhbSgpOwotCQkJcmV0dXJuIGJhc2ljR2V0U3VwZXJUZWFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuIGdldFN1YlRlYW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJCWdldFRlYW1Sb2xlcygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVEZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJc2V0U3VwZXJUZWFtKChUZWFtUHJvZmlsZSkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJZ2V0U3ViVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGVhbVByb2ZpbGU+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTOgotCQkJZ2V0VGVhbVJvbGVzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCXNldFN1cGVyVGVhbSgoVGVhbVByb2ZpbGUpIG51bGwpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVUJfVEVBTToKLQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1RFQU1fUk9MRVM6Ci0JCQlyZXR1cm4gdGVhbVJvbGVzICE9IG51bGwgJiYgIXRlYW1Sb2xlcy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVUEVSX1RFQU06Ci0JCQlyZXR1cm4gc3VwZXJUZWFtICE9IG51bGw7Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJcmV0dXJuIHN1YlRlYW0gIT0gbnVsbCAmJiAhc3ViVGVhbS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1RlYW1Qcm9maWxlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RlbXBsYXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWI4YmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCX0KLQotfSAvL1RlbXBsYXRlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWY2ODAyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UZXJtRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXJtRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZXJtRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGVybURlZmluaXRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5URVJNX0RFRklOSVRJT047Ci0JfQotCi19IC8vVGVybURlZmluaXRpb25JbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVGV4dEVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NWE2YWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1RleHRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXh0IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5UZXh0RWxlbWVudEltcGwjZ2V0VGV4dCA8ZW0+VGV4dDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRleHRFbGVtZW50SW1wbCBleHRlbmRzIExlYWZFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRleHRFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZXh0KCkgPGVtPlRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRleHQoKSA8ZW0+VGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGV4dCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0ZXh0ID0gVEVYVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZXh0RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFWFRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJU3RyaW5nIG9sZFRleHQgPSB0ZXh0OwotCQl0ZXh0ID0gbmV3VGV4dDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQsIG9sZFRleHQsIHRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlyZXR1cm4gZ2V0VGV4dCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlzZXRUZXh0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlzZXRUZXh0KFRFWFRfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5URVhUX0VMRU1FTlRfX1RFWFQ6Ci0JCQlyZXR1cm4gVEVYVF9FREVGQVVMVCA9PSBudWxsID8gdGV4dCAhPSBudWxsIDogIVRFWFRfRURFRkFVTFQKLQkJCQkJLmVxdWFscyh0ZXh0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0ZXh0OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UZXh0RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTRhOGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RSZXNvbHZpbmdFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Ub29sSW1wbCNnZXRUb29sTWVudG9ycyA8ZW0+VG9vbCBNZW50b3JzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgVG9vbCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sTWVudG9ycygpIDxlbT5Ub29sIE1lbnRvcnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VG9vbE1lbnRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxUb29sTWVudG9yPiB0b29sTWVudG9yczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUb29sTWVudG9yPiBnZXRUb29sTWVudG9ycygpIHsKLQkJaWYgKHRvb2xNZW50b3JzID09IG51bGwpIHsKLQkJCXRvb2xNZW50b3JzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxUb29sTWVudG9yPigKLQkJCQkJVG9vbE1lbnRvci5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlMpOwotCQl9Ci0JCXJldHVybiB0b29sTWVudG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUlM6Ci0JCQlyZXR1cm4gZ2V0VG9vbE1lbnRvcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi19IC8vVG9vbEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4Nzc0ZTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1Rvb2xNZW50b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRvb2xNZW50b3JJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVG9vbE1lbnRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfTUVOVE9SOwotCX0KLQotfSAvL1Rvb2xNZW50b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVHlwZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzgyODEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFR5cGVJbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFR5cGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UWVBFOwotCX0KLQotfSAvL1R5cGVJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkOTQ1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5VTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVU1BU2VtYW50aWNNb2RlbEJyaWRnZUltcGwgZXh0ZW5kcyBTZW1hbnRpY01vZGVsQnJpZGdlSW1wbAotCQlpbXBsZW1lbnRzIFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RWxlbWVudCgpIDxlbT5FbGVtZW50PC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBlbGVtZW50OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwgJiYgKChFT2JqZWN0KSBlbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnQ7Ci0JCQllbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGVSZXNvbHZlUHJveHkob2xkRWxlbWVudCk7Ci0JCQlpZiAoZWxlbWVudCAhPSBvbGRFbGVtZW50KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQsCi0JCQkJCQkJb2xkRWxlbWVudCwgZWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50IGJhc2ljR2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChNZXRob2RFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJTWV0aG9kRWxlbWVudCBvbGRFbGVtZW50ID0gZWxlbWVudDsKLQkJZWxlbWVudCA9IG5ld0VsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVCwgb2xkRWxlbWVudCwKLQkJCQkJZWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJcmV0dXJuIGJhc2ljR2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5VTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UOgotCQkJc2V0RWxlbWVudCgoTWV0aG9kRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQ6Ci0JCQlzZXRFbGVtZW50KChNZXRob2RFbGVtZW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVU1BX1NFTUFOVElDX01PREVMX0JSSURHRV9fRUxFTUVOVDoKLQkJCXJldHVybiBlbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1VNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmFiYWM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBVbWFGYWN0b3J5IHsKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFGYWN0b3J5IGluaXQoKSB7Ci0JCXRyeSB7Ci0JCQlVbWFGYWN0b3J5IHRoZVVtYUZhY3RvcnkgPSAoVW1hRmFjdG9yeSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUvdW1hLmVjb3JlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlpZiAodGhlVW1hRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVVtYUZhY3Rvcnk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgVW1hRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQljYXNlIFVtYVBhY2thZ2UuUEFDS0FHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUGFja2FnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29uc3RyYWludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuS0lORDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlS2luZCgpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVNlY3Rpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPTkNFUFQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbmNlcHQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNIRUNLTElTVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUd1aWRlbGluZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRXhhbXBsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUkVVU0FCTEVfQVNTRVQ6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJldXNhYmxlQXNzZXQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVwb3J0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sTWVudG9yKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEZWxpdmVyYWJsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlT3V0Y29tZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RFUDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU3RlcCgpOwotCQljYXNlIFVtYVBhY2thZ2UuV0hJVEVQQVBFUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV2hpdGVwYXBlcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTSzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFzaygpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVJvbGVEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlVGFza0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlU2V0KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET01BSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURvbWFpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlQWN0aXZpdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEE6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlV29ya09yZGVyKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2FkbWFwKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUb29sKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbnRlbnRQYWNrYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1pbGVzdG9uZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVJdGVyYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQaGFzZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZWFtUHJvZmlsZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVSb2xlRGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUYXNrRGVzY3JpcHRvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJ5UHJvY2VzcygpOwotCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpOwotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcmFjdGljZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfREVTQ1JJUFRPUjoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVByb2Nlc3NQYWNrYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESUFHUkFNOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaWFncmFtKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9OT0RFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaE5vZGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlJFRkVSRU5DRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUmVmZXJlbmNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9QRVJUWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUHJvcGVydHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQb2ludCgpOwotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9MSU5LOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVEaWFncmFtTGluaygpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVHcmFwaENvbm5lY3RvcigpOwotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfRURHRToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlR3JhcGhFZGdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT046Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZURpbWVuc2lvbigpOwotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDoKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZVVNQVNlbWFudGljTW9kZWxCcmlkZ2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkNPUkVfU0VNQU5USUNfTU9ERUxfQlJJREdFOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpOwotCQljYXNlIFVtYVBhY2thZ2UuVEVYVF9FTEVNRU5UOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVUZXh0RWxlbWVudCgpOwotCQljYXNlIFVtYVBhY2thZ2UuSU1BR0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUltYWdlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5QT0xZTElORToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlUG9seWxpbmUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0U6Ci0JCQlyZXR1cm4gKEVPYmplY3QpIGNyZWF0ZUVsbGlwc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZOgotCQkJcmV0dXJuIChFT2JqZWN0KSBjcmVhdGVQcm9jZXNzRmFtaWx5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWToKLQkJCXJldHVybiAoRU9iamVjdCkgY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQlkZWZhdWx0OgotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuU1RSSU5HOgotCQkJcmV0dXJuIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuQk9PTEVBTjoKLQkJCXJldHVybiBjcmVhdGVCb29sZWFuRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5EQVRFOgotCQkJcmV0dXJuIGNyZWF0ZURhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlVSSToKLQkJCXJldHVybiBjcmVhdGVVcmlGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFVDoKLQkJCXJldHVybiBjcmVhdGVTZXRGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNFUVVFTkNFOgotCQkJcmV0dXJuIGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5JTlRFR0VSOgotCQkJcmV0dXJuIGNyZWF0ZUludGVnZXJGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkRPVUJMRToKLQkJCXJldHVybiBjcmVhdGVEb3VibGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJZGVmYXVsdDoKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFOgotCQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLlNUUklORzoKLQkJCXJldHVybiBjb252ZXJ0U3RyaW5nVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLkJPT0xFQU46Ci0JCQlyZXR1cm4gY29udmVydEJvb2xlYW5Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuREFURToKLQkJCXJldHVybiBjb252ZXJ0RGF0ZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5VUkk6Ci0JCQlyZXR1cm4gY29udmVydFVyaVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVQ6Ci0JCQlyZXR1cm4gY29udmVydFNldFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5TRVFVRU5DRToKLQkJCXJldHVybiBjb252ZXJ0U2VxdWVuY2VUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQljYXNlIFVtYVBhY2thZ2UuSU5URUdFUjoKLQkJCXJldHVybiBjb252ZXJ0SW50ZWdlclRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5ET1VCTEU6Ci0JCQlyZXR1cm4gY29udmVydERvdWJsZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCWRlZmF1bHQ6Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIGNyZWF0ZVBhY2thZ2UoKSB7Ci0JCVBhY2thZ2VJbXBsIHBhY2thZ2VfID0gbmV3IFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBwYWNrYWdlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBjcmVhdGVDb25zdHJhaW50KCkgewotCQlDb25zdHJhaW50SW1wbCBjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnRJbXBsKCk7Ci0JCXJldHVybiBjb25zdHJhaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEtpbmQgY3JlYXRlS2luZCgpIHsKLQkJS2luZEltcGwga2luZCA9IG5ldyBLaW5kSW1wbCgpOwotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJQ29udGVudERlc2NyaXB0aW9uSW1wbCBjb250ZW50RGVzY3JpcHRpb24gPSBuZXcgQ29udGVudERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKSB7Ci0JCVNlY3Rpb25JbXBsIHNlY3Rpb24gPSBuZXcgU2VjdGlvbkltcGwoKTsKLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGUgY3JlYXRlUm9sZSgpIHsKLQkJUm9sZUltcGwgcm9sZSA9IG5ldyBSb2xlSW1wbCgpOwotCQlyZXR1cm4gcm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFzayBjcmVhdGVUYXNrKCkgewotCQlUYXNrSW1wbCB0YXNrID0gbmV3IFRhc2tJbXBsKCk7Ci0JCXJldHVybiB0YXNrOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdGVwIGNyZWF0ZVN0ZXAoKSB7Ci0JCVN0ZXBJbXBsIHN0ZXAgPSBuZXcgU3RlcEltcGwoKTsKLQkJcmV0dXJuIHN0ZXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkgewotCQlBcnRpZmFjdEltcGwgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RJbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgY3JlYXRlV29ya1Byb2R1Y3QoKSB7Ci0JCVdvcmtQcm9kdWN0SW1wbCB3b3JrUHJvZHVjdCA9IG5ldyBXb3JrUHJvZHVjdEltcGwoKTsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGdWxmaWxsYWJsZUVsZW1lbnQgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50KCkgewotCQlGdWxmaWxsYWJsZUVsZW1lbnRJbXBsIGZ1bGZpbGxhYmxlRWxlbWVudCA9IG5ldyBGdWxmaWxsYWJsZUVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBmdWxmaWxsYWJsZUVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCkgewotCQlEZWxpdmVyYWJsZUltcGwgZGVsaXZlcmFibGUgPSBuZXcgRGVsaXZlcmFibGVJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3V0Y29tZSBjcmVhdGVPdXRjb21lKCkgewotCQlPdXRjb21lSW1wbCBvdXRjb21lID0gbmV3IE91dGNvbWVJbXBsKCk7Ci0JCXJldHVybiBvdXRjb21lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpIHsKLQkJQ29udGVudFBhY2thZ2VJbXBsIGNvbnRlbnRQYWNrYWdlID0gbmV3IENvbnRlbnRQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gY29udGVudFBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpIHsKLQkJQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgYXJ0aWZhY3REZXNjcmlwdGlvbiA9IG5ldyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkgewotCQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gbmV3IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyYWJsZURlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCURlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCVJvbGVEZXNjcmlwdGlvbkltcGwgcm9sZURlc2NyaXB0aW9uID0gbmV3IFJvbGVEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpIHsKLQkJVGFza0Rlc2NyaXB0aW9uSW1wbCB0YXNrRGVzY3JpcHRpb24gPSBuZXcgVGFza0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCUd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGd1aWRhbmNlRGVzY3JpcHRpb24gPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByYWN0aWNlRGVzY3JpcHRpb24gY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbigpIHsKLQkJUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwgcHJhY3RpY2VEZXNjcmlwdGlvbiA9IG5ldyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoKSB7Ci0JCUFjdGl2aXR5SW1wbCBhY3Rpdml0eSA9IG5ldyBBY3Rpdml0eUltcGwoKTsKLQkJcmV0dXJuIGFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNaWxlc3RvbmUgY3JlYXRlTWlsZXN0b25lKCkgewotCQlNaWxlc3RvbmVJbXBsIG1pbGVzdG9uZSA9IG5ldyBNaWxlc3RvbmVJbXBsKCk7Ci0JCXJldHVybiBtaWxlc3RvbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEl0ZXJhdGlvbiBjcmVhdGVJdGVyYXRpb24oKSB7Ci0JCUl0ZXJhdGlvbkltcGwgaXRlcmF0aW9uID0gbmV3IEl0ZXJhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGl0ZXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGhhc2UgY3JlYXRlUGhhc2UoKSB7Ci0JCVBoYXNlSW1wbCBwaGFzZSA9IG5ldyBQaGFzZUltcGwoKTsKLQkJcmV0dXJuIHBoYXNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpIHsKLQkJVGVhbVByb2ZpbGVJbXBsIHRlYW1Qcm9maWxlID0gbmV3IFRlYW1Qcm9maWxlSW1wbCgpOwotCQlyZXR1cm4gdGVhbVByb2ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkgewotCQlSb2xlRGVzY3JpcHRvckltcGwgcm9sZURlc2NyaXB0b3IgPSBuZXcgUm9sZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpIHsKLQkJV29ya09yZGVySW1wbCB3b3JrT3JkZXIgPSBuZXcgV29ya09yZGVySW1wbCgpOwotCQlyZXR1cm4gd29ya09yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQbGFubmluZ0RhdGEgY3JlYXRlUGxhbm5pbmdEYXRhKCkgewotCQlQbGFubmluZ0RhdGFJbXBsIHBsYW5uaW5nRGF0YSA9IG5ldyBQbGFubmluZ0RhdGFJbXBsKCk7Ci0JCXJldHVybiBwbGFubmluZ0RhdGE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdG9yIGNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkgewotCQlUYXNrRGVzY3JpcHRvckltcGwgdGFza0Rlc2NyaXB0b3IgPSBuZXcgVGFza0Rlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiB0YXNrRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVSb2xlIGNyZWF0ZUNvbXBvc2l0ZVJvbGUoKSB7Ci0JCUNvbXBvc2l0ZVJvbGVJbXBsIGNvbXBvc2l0ZVJvbGUgPSBuZXcgQ29tcG9zaXRlUm9sZUltcGwoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gbmV3IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBhY3Rpdml0eURlc2NyaXB0aW9uID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbigpIHsKLQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgcHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSBuZXcgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25jZXB0IGNyZWF0ZUNvbmNlcHQoKSB7Ci0JCUNvbmNlcHRJbXBsIGNvbmNlcHQgPSBuZXcgQ29uY2VwdEltcGwoKTsKLQkJcmV0dXJuIGNvbmNlcHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENoZWNrbGlzdCBjcmVhdGVDaGVja2xpc3QoKSB7Ci0JCUNoZWNrbGlzdEltcGwgY2hlY2tsaXN0ID0gbmV3IENoZWNrbGlzdEltcGwoKTsKLQkJcmV0dXJuIGNoZWNrbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXhhbXBsZSBjcmVhdGVFeGFtcGxlKCkgewotCQlFeGFtcGxlSW1wbCBleGFtcGxlID0gbmV3IEV4YW1wbGVJbXBsKCk7Ci0JCXJldHVybiBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCkgewotCQlHdWlkZWxpbmVJbXBsIGd1aWRlbGluZSA9IG5ldyBHdWlkZWxpbmVJbXBsKCk7Ci0JCXJldHVybiBndWlkZWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCUVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKTsKLQkJcmV0dXJuIGVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydCgpIHsKLQkJUmVwb3J0SW1wbCByZXBvcnQgPSBuZXcgUmVwb3J0SW1wbCgpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZSBjcmVhdGVUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGVJbXBsIHRlbXBsYXRlID0gbmV3IFRlbXBsYXRlSW1wbCgpOwotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN1cHBvcnRpbmdNYXRlcmlhbCBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbEltcGwgc3VwcG9ydGluZ01hdGVyaWFsID0gbmV3IFN1cHBvcnRpbmdNYXRlcmlhbEltcGwoKTsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVG9vbE1lbnRvciBjcmVhdGVUb29sTWVudG9yKCkgewotCQlUb29sTWVudG9ySW1wbCB0b29sTWVudG9yID0gbmV3IFRvb2xNZW50b3JJbXBsKCk7Ci0JCXJldHVybiB0b29sTWVudG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKSB7Ci0JCVdoaXRlcGFwZXJJbXBsIHdoaXRlcGFwZXIgPSBuZXcgV2hpdGVwYXBlckltcGwoKTsKLQkJcmV0dXJuIHdoaXRlcGFwZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCkgewotCQlUZXJtRGVmaW5pdGlvbkltcGwgdGVybURlZmluaXRpb24gPSBuZXcgVGVybURlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IG5ldyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwoKTsKLQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZSBjcmVhdGVQcmFjdGljZSgpIHsKLQkJUHJhY3RpY2VJbXBsIHByYWN0aWNlID0gbmV3IFByYWN0aWNlSW1wbCgpOwotCQlyZXR1cm4gcHJhY3RpY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpIHsKLQkJUmV1c2FibGVBc3NldEltcGwgcmV1c2FibGVBc3NldCA9IG5ldyBSZXVzYWJsZUFzc2V0SW1wbCgpOwotCQlyZXR1cm4gcmV1c2FibGVBc3NldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lSW1wbCBkaXNjaXBsaW5lID0gbmV3IERpc2NpcGxpbmVJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0IGNyZWF0ZVJvbGVTZXQoKSB7Ci0JCVJvbGVTZXRJbXBsIHJvbGVTZXQgPSBuZXcgUm9sZVNldEltcGwoKTsKLQkJcmV0dXJuIHJvbGVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvbWFpbiBjcmVhdGVEb21haW4oKSB7Ci0JCURvbWFpbkltcGwgZG9tYWluID0gbmV3IERvbWFpbkltcGwoKTsKLQkJcmV0dXJuIGRvbWFpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJV29ya1Byb2R1Y3RUeXBlSW1wbCB3b3JrUHJvZHVjdFR5cGUgPSBuZXcgV29ya1Byb2R1Y3RUeXBlSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGRpc2NpcGxpbmVHcm91cGluZyA9IG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2wgY3JlYXRlVG9vbCgpIHsKLQkJVG9vbEltcGwgdG9vbCA9IG5ldyBUb29sSW1wbCgpOwotCQlyZXR1cm4gdG9vbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpIHsKLQkJUm9sZVNldEdyb3VwaW5nSW1wbCByb2xlU2V0R3JvdXBpbmcgPSBuZXcgUm9sZVNldEdyb3VwaW5nSW1wbCgpOwotCQlyZXR1cm4gcm9sZVNldEdyb3VwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnlJbXBsIGN1c3RvbUNhdGVnb3J5ID0gbmV3IEN1c3RvbUNhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2VzcyBjcmVhdGVEZWxpdmVyeVByb2Nlc3MoKSB7Ci0JCURlbGl2ZXJ5UHJvY2Vzc0ltcGwgZGVsaXZlcnlQcm9jZXNzID0gbmV3IERlbGl2ZXJ5UHJvY2Vzc0ltcGwoKTsKLQkJcmV0dXJuIGRlbGl2ZXJ5UHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuSW1wbCBjYXBhYmlsaXR5UGF0dGVybiA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkltcGwoKTsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpIHsKLQkJUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlID0gbmV3IFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpIHsKLQkJUm9hZG1hcEltcGwgcm9hZG1hcCA9IG5ldyBSb2FkbWFwSW1wbCgpOwotCQlyZXR1cm4gcm9hZG1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkgewotCQlQcm9jZXNzQ29tcG9uZW50SW1wbCBwcm9jZXNzQ29tcG9uZW50ID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpIHsKLQkJUHJvY2Vzc1BhY2thZ2VJbXBsIHByb2Nlc3NQYWNrYWdlID0gbmV3IFByb2Nlc3NQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IG5ldyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9ySW1wbCBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCkgewotCQlNZXRob2RQbHVnaW5JbXBsIG1ldGhvZFBsdWdpbiA9IG5ldyBNZXRob2RQbHVnaW5JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgbWV0aG9kQ29uZmlndXJhdGlvbiA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0ZhbWlseSBjcmVhdGVQcm9jZXNzRmFtaWx5KCkgewotCQlQcm9jZXNzRmFtaWx5SW1wbCBwcm9jZXNzRmFtaWx5ID0gbmV3IFByb2Nlc3NGYW1pbHlJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzRmFtaWx5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoKSB7Ci0JCU1ldGhvZExpYnJhcnlJbXBsIG1ldGhvZExpYnJhcnkgPSBuZXcgTWV0aG9kTGlicmFyeUltcGwoKTsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvaW50IGNyZWF0ZVBvaW50KCkgewotCQlQb2ludEltcGwgcG9pbnQgPSBuZXcgUG9pbnRJbXBsKCk7Ci0JCXJldHVybiBwb2ludDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbUxpbmsgY3JlYXRlRGlhZ3JhbUxpbmsoKSB7Ci0JCURpYWdyYW1MaW5rSW1wbCBkaWFncmFtTGluayA9IG5ldyBEaWFncmFtTGlua0ltcGwoKTsKLQkJcmV0dXJuIGRpYWdyYW1MaW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaENvbm5lY3RvciBjcmVhdGVHcmFwaENvbm5lY3RvcigpIHsKLQkJR3JhcGhDb25uZWN0b3JJbXBsIGdyYXBoQ29ubmVjdG9yID0gbmV3IEdyYXBoQ29ubmVjdG9ySW1wbCgpOwotCQlyZXR1cm4gZ3JhcGhDb25uZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpbWVuc2lvbiBjcmVhdGVEaW1lbnNpb24oKSB7Ci0JCURpbWVuc2lvbkltcGwgZGltZW5zaW9uID0gbmV3IERpbWVuc2lvbkltcGwoKTsKLQkJcmV0dXJuIGRpbWVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVmZXJlbmNlIGNyZWF0ZVJlZmVyZW5jZSgpIHsKLQkJUmVmZXJlbmNlSW1wbCByZWZlcmVuY2UgPSBuZXcgUmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gcmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eSBjcmVhdGVQcm9wZXJ0eSgpIHsKLQkJUHJvcGVydHlJbXBsIHByb3BlcnR5ID0gbmV3IFByb3BlcnR5SW1wbCgpOwotCQlyZXR1cm4gcHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEdyYXBoRWRnZSBjcmVhdGVHcmFwaEVkZ2UoKSB7Ci0JCUdyYXBoRWRnZUltcGwgZ3JhcGhFZGdlID0gbmV3IEdyYXBoRWRnZUltcGwoKTsKLQkJcmV0dXJuIGdyYXBoRWRnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKCkgewotCQlEaWFncmFtSW1wbCBkaWFncmFtID0gbmV3IERpYWdyYW1JbXBsKCk7Ci0JCXJldHVybiBkaWFncmFtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHcmFwaE5vZGUgY3JlYXRlR3JhcGhOb2RlKCkgewotCQlHcmFwaE5vZGVJbXBsIGdyYXBoTm9kZSA9IG5ldyBHcmFwaE5vZGVJbXBsKCk7Ci0JCXJldHVybiBncmFwaE5vZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KCkgewotCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEltcGwgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPSBuZXcgU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVU1BU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCB1bWFTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IFVNQVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsKCk7Ci0JCXJldHVybiB1bWFTZW1hbnRpY01vZGVsQnJpZGdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSBjcmVhdGVDb3JlU2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VJbXBsIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlID0gbmV3IENvcmVTZW1hbnRpY01vZGVsQnJpZGdlSW1wbCgpOwotCQlyZXR1cm4gY29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRleHRFbGVtZW50IGNyZWF0ZVRleHRFbGVtZW50KCkgewotCQlUZXh0RWxlbWVudEltcGwgdGV4dEVsZW1lbnQgPSBuZXcgVGV4dEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiB0ZXh0RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgY3JlYXRlSW1hZ2UoKSB7Ci0JCUltYWdlSW1wbCBpbWFnZSA9IG5ldyBJbWFnZUltcGwoKTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb2x5bGluZSBjcmVhdGVQb2x5bGluZSgpIHsKLQkJUG9seWxpbmVJbXBsIHBvbHlsaW5lID0gbmV3IFBvbHlsaW5lSW1wbCgpOwotCQlyZXR1cm4gcG9seWxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVsbGlwc2UgY3JlYXRlRWxsaXBzZSgpIHsKLQkJRWxsaXBzZUltcGwgZWxsaXBzZSA9IG5ldyBFbGxpcHNlSW1wbCgpOwotCQlyZXR1cm4gZWxsaXBzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBjcmVhdGVXb3JrT3JkZXJUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFdvcmtPcmRlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0V29ya09yZGVyVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZhcmlhYmlsaXR5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLQkJCQkJIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERhdGUgY3JlYXRlRGF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERhdGUpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydERhdGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVSSSBjcmVhdGVVcmlGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChVUkkpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFVyaVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZVN0cmluZ0Zyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFN0cmluZ1RvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsCi0JCQlPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gc3VwZXIuY29udmVydFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gY3JlYXRlQm9vbGVhbkZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCVN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIChCb29sZWFuKSBzdXBlci5jcmVhdGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRCb29sZWFuVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2V0IGNyZWF0ZVNldEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKFNldCkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0U2V0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZVNlcXVlbmNlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKExpc3QpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNlcXVlbmNlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBjcmVhdGVJbnRlZ2VyRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKEludGVnZXIpIHN1cGVyLmNyZWF0ZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEludGVnZXJUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEb3VibGUgY3JlYXRlRG91YmxlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLAotCQkJU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gKERvdWJsZSkgc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RG91YmxlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwKLQkJCU9iamVjdCBpbnN0YW5jZVZhbHVlKSB7Ci0JCXJldHVybiBzdXBlci5jb252ZXJ0VG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUGFja2FnZSBnZXRVbWFQYWNrYWdlKCkgewotCQlyZXR1cm4gKFVtYVBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vVW1hRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OWIxOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTU3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNoZWNrbGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db21wb3NpdGVSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29yZVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPi4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBVbWFQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjbGFzc2lmaWVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGFja2FnZWFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbmFtZXNwYWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mga2luZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlY3Rpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrUHJvZHVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrRGVmaW5pdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdGVwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFydGlmYWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG91dGNvbWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kUGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBicmVha2Rvd25FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbGVzdG9uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpdGVyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGhhc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVhbVByb2ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya09yZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBsYW5uaW5nRGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRhc2tEZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb3NpdGVSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uY2VwdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjaGVja2xpc3RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXhhbXBsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBndWlkZWxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlcG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbE1lbnRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB3aGl0ZXBhcGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHRlcm1EZWZpbml0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJldXNhYmxlQXNzZXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb21haW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3RUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvbGVTZXRHcm91cGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjdXN0b21DYXRlZ29yeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjYXBhYmlsaXR5UGF0dGVybkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2FkbWFwRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQbHVnaW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFVuaXRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzRmFtaWx5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZExpYnJhcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9pbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3JhcGhFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1FbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpYWdyYW1MaW5rRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGdyYXBoQ29ubmVjdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGltZW5zaW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlZmVyZW5jZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9wZXJ0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaEVkZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlhZ3JhbUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaE5vZGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBsZWFmRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0ZXh0RWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBpbWFnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBncmFwaGljUHJpbWl0aXZlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvbHlsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVsbGlwc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB3b3JrT3JkZXJUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB2YXJpYWJpbGl0eVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkYXRlRURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHVyaUVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzdHJpbmdFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgYm9vbGVhbkVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBzZXRFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgc2VxdWVuY2VFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRGF0YVR5cGUgaW50ZWdlckVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSBkb3VibGVFRGF0YVR5cGUgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVbWFQYWNrYWdlSW1wbCgpIHsKLQkJc3VwZXIoZU5TX1VSSSwgVW1hRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcwotCSAqIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLiAgU2ltcGxlCi0JICogZGVwZW5kZW5jaWVzIGFyZSBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwKLQkgKiBkZXBlbmRlbnQgcGFja2FnZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuICBUaGlzIG1ldGhvZCBkcml2ZXMKLQkgKiBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQgcGFja2FnZXMgZGlyZWN0bHksIGluIHBhcmFsbGVsCi0JICogd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD5PZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoCi0JICogaGF2ZSBub3QgeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkCi0JICogYW5kIHJlZ2lzdGVyZWQuICBUaGUgcGFja2FnZXMgYXJlIHRoZW4gaW5pdGlhbGl6ZWQgaW4gdHdvIHN0ZXBzOgotCSAqIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgYWxsIG9mIHRoZSBwYWNrYWdlcyBhcmUgY3JlYXRlZCBiZWZvcmUgYW55Ci0JICogYXJlIGluaXRpYWxpemVkLCBzaW5jZSBvbmUgcGFja2FnZSdzIG1ldGEtbW9kZWwgb2JqZWN0cyBtYXkgcmVmZXIgdG8KLQkgKiB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPkludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBVbWFQYWNrYWdlIGluaXQoKSB7Ci0JCWlmIChpc0luaXRlZCkKLQkJCXJldHVybiAoVW1hUGFja2FnZSkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkJLmdldEVQYWNrYWdlKFVtYVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlVbWFQYWNrYWdlSW1wbCB0aGVVbWFQYWNrYWdlID0gKFVtYVBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UKLQkJCQkuZ2V0RVBhY2thZ2UoZU5TX1VSSSkgaW5zdGFuY2VvZiBVbWFQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFCi0JCQkJLmdldEVQYWNrYWdlKGVOU19VUkkpCi0JCQkJOiBuZXcgVW1hUGFja2FnZUltcGwoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVVtYVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVVbWFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVVtYVBhY2thZ2UuZnJlZXplKCk7Ci0KLQkJcmV0dXJuIHRoZVVtYVBhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDbGFzc2lmaWVyKCkgewotCQlyZXR1cm4gY2xhc3NpZmllckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDbGFzc2lmaWVyX0lzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY2xhc3NpZmllckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBuYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIHBhY2thZ2VhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiBwYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudCgpIHsKLQkJcmV0dXJuIG1ldGhvZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25zdHJhaW50KCkgewotCQlyZXR1cm4gY29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb25zdHJhaW50X0JvZHkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29uc3RyYWludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkga2luZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdHNBbmRQYXBlcnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudEVsZW1lbnRfVGVybWRlZmluaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJcmV0dXJuIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTZWN0aW9uKCkgewotCQlyZXR1cm4gc2VjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9ucygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgewotCQlyZXR1cm4gcm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX01vZGlmaWVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3JzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRGdWxmaWxsYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBmdWxmaWxsYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RnVsZmlsbGFibGVFbGVtZW50X0Z1bGZpbGxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2tFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19QZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19TdGVwcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya0RlZmluaXRpb24oKSB7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdGVwKCkgewotCQlyZXR1cm4gc3RlcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEd1aWRhbmNlKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGFydGlmYWN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lckFydGlmYWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFydGlmYWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZWxpdmVyYWJsZSgpIHsKLQkJcmV0dXJuIGRlbGl2ZXJhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Y29tZSgpIHsKLQkJcmV0dXJuIG91dGNvbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCkgewotCQlyZXR1cm4gbWV0aG9kUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGFja2FnZV9DaGlsZFBhY2thZ2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnRQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudFBhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgKLQkJCQkwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHJvbGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGFza0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnRzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHkoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFjdGl2aXR5X1JvYWRtYXBzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdGllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMTMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEJyZWFrZG93bkVsZW1lbnRfVGVtcGxhdGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QnJlYWtkb3duRWxlbWVudF9Fc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDE2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRCcmVha2Rvd25FbGVtZW50X1Rvb2xtZW50b3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDE3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1pbGVzdG9uZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SXRlcmF0aW9uKCkgewotCQlyZXR1cm4gaXRlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGhhc2UoKSB7Ci0JCXJldHVybiBwaGFzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRlYW1Qcm9maWxlKCkgewotCQlyZXR1cm4gdGVhbVByb2ZpbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZURlc2NyaXB0b3JfTW9kaWZpZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya09yZGVyKCkgewotCQlyZXR1cm4gd29ya09yZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrT3JkZXJfUHJlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0VsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiBwbGFubmluZ0RhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfUmFuaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1NlbGVjdGVkU3RlcHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb21wb3NpdGVSb2xlKCkgewotCQlyZXR1cm4gY29tcG9zaXRlUm9sZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd3RvU3RhZmYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb25jZXB0KCkgewotCQlyZXR1cm4gY29uY2VwdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIGNoZWNrbGlzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBleGFtcGxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ3VpZGVsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVwb3J0KCkgewotCQlyZXR1cm4gcmVwb3J0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVtcGxhdGUoKSB7Ci0JCXJldHVybiB0ZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiB0b29sTWVudG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIHdoaXRlcGFwZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MKLQkJCQkuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlKCkgewotCQlyZXR1cm4gcHJhY3RpY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiByZXVzYWJsZUFzc2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGRpc2NpcGxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9UYXNrcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJkaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0KCkgewotCQlyZXR1cm4gcm9sZVNldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlU2V0X1JvbGVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGRvbWFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb21haW5fV29ya1Byb2R1Y3RzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VG9vbCgpIHsKLQkJcmV0dXJuIHRvb2xFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VG9vbF9Ub29sTWVudG9ycygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSB0b29sRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlU2V0R3JvdXBpbmcoKSB7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcmllcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBjdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoCi0JCQkJMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KAotCQkJCTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlZE9uUHJvY2Vzc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gcm9hZG1hcEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQYWNrYWdlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc1BhY2thZ2VfRGlhZ3JhbXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kUGx1Z2luKCkgewotCQlyZXR1cm4gbWV0aG9kUGx1Z2luRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0VmFyaWFiaWxpdHlFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RVbml0KCkgewotCQlyZXR1cm4gbWV0aG9kVW5pdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIG1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKQotCQkJCS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0ZhbWlseSgpIHsKLQkJcmV0dXJuIHByb2Nlc3NGYW1pbHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBwcm9jZXNzRmFtaWx5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCkgewotCQlyZXR1cm4gbWV0aG9kTGlicmFyeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZExpYnJhcnlfUHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIG1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvaW50KCkgewotCQlyZXR1cm4gcG9pbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9pbnRfWCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBwb2ludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBvaW50X1koKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcG9pbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdyYXBoRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfUG9zaXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhFbGVtZW50X0NvbnRhaW5lZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfTGluaygpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWxlbWVudF9TZW1hbnRpY01vZGVsKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkaWFncmFtRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtRWxlbWVudF9Jc1Zpc2libGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Db250YWluZXIoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGlhZ3JhbUxpbmsoKSB7Ci0JCXJldHVybiBkaWFncmFtTGlua0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtTGlua19ab29tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlhZ3JhbUxpbmtfVmlld3BvcnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19HcmFwaEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZGlhZ3JhbUxpbmtFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtTGlua19EaWFncmFtKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaENvbm5lY3RvcigpIHsKLQkJcmV0dXJuIGdyYXBoQ29ubmVjdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBncmFwaENvbm5lY3RvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpIHsKLQkJcmV0dXJuIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpCi0JCQkJLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkKLQkJCQkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGltZW5zaW9uKCkgewotCQlyZXR1cm4gZGltZW5zaW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpbWVuc2lvbl9XaWR0aCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkaW1lbnNpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaW1lbnNpb25fSGVpZ2h0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGRpbWVuc2lvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gcmVmZXJlbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSByZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb3BlcnR5KCkgewotCQlyZXR1cm4gcHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfS2V5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvcGVydHlfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgcHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEdyYXBoRWRnZSgpIHsKLQkJcmV0dXJuIGdyYXBoRWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRHcmFwaEVkZ2VfQW5jaG9yKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGdyYXBoRWRnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEdyYXBoRWRnZV9XYXlwb2ludHMoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhFZGdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZGlhZ3JhbUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaWFncmFtX1pvb20oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZGlhZ3JhbUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERpYWdyYW1fVmlld3BvaW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX0RpYWdyYW1MaW5rKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGRpYWdyYW1FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREaWFncmFtX05hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkaWFncmFtRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaE5vZGUoKSB7Ci0JCXJldHVybiBncmFwaE5vZGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0R3JhcGhOb2RlX1NpemUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZ3JhcGhOb2RlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCgpIHsKLQkJcmV0dXJuIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50X1R5cGVJbmZvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlKCkgewotCQlyZXR1cm4gdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRVTUFTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcwotCQkJCS5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29yZVNlbWFudGljTW9kZWxCcmlkZ2UoKSB7Ci0JCXJldHVybiBjb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb3JlU2VtYW50aWNNb2RlbEJyaWRnZV9FbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzCi0JCQkJLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRMZWFmRWxlbWVudCgpIHsKLQkJcmV0dXJuIGxlYWZFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGV4dEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0ZXh0RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZXh0RWxlbWVudF9UZXh0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHRleHRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGltYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX1VyaSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBpbWFnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEltYWdlX01pbWVUeXBlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGltYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHcmFwaGljUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvbHlsaW5lKCkgewotCQlyZXR1cm4gcG9seWxpbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UG9seWxpbmVfQ2xvc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIHBvbHlsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbGxpcHNlKCkgewotCQlyZXR1cm4gZWxsaXBzZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX1JhZGl1c1goKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZWxsaXBzZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVsbGlwc2VfUmFkaXVzWSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9Sb3RhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbGxpcHNlX0VuZEFuZ2xlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGVsbGlwc2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbGxpcHNlX0NlbnRlcigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBlbGxpcHNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFdvcmtPcmRlclR5cGUoKSB7Ci0JCXJldHVybiB3b3JrT3JkZXJUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0RGF0ZSgpIHsKLQkJcmV0dXJuIGRhdGVFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRVcmkoKSB7Ci0JCXJldHVybiB1cmlFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBzdHJpbmdFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRCb29sZWFuKCkgewotCQlyZXR1cm4gYm9vbGVhbkVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNldCgpIHsKLQkJcmV0dXJuIHNldEVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldFNlcXVlbmNlKCkgewotCQlyZXR1cm4gc2VxdWVuY2VFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVEYXRhVHlwZSBnZXRJbnRlZ2VyKCkgewotCQlyZXR1cm4gaW50ZWdlckVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRURhdGFUeXBlIGdldERvdWJsZSgpIHsKLQkJcmV0dXJuIGRvdWJsZUVEYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hRmFjdG9yeSBnZXRVbWFGYWN0b3J5KCkgewotCQlyZXR1cm4gKFVtYUZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKQotCQkJcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQljbGFzc2lmaWVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKENMQVNTSUZJRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGNsYXNzaWZpZXJFQ2xhc3MsIENMQVNTSUZJRVJfX0lTX0FCU1RSQUNUKTsKLQotCQl0eXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRZUEUpOwotCi0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLQUdFQUJMRV9FTEVNRU5UKTsKLQotCQluYW1lZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRFbGVtZW50RUNsYXNzLCBOQU1FRF9FTEVNRU5UX19OQU1FKTsKLQotCQllbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlQpOwotCi0JCXBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUEFDS0FHRSk7Ci0KLQkJbmFtZXNwYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKE5BTUVTUEFDRSk7Ci0KLQkJY29uc3RyYWludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05TVFJBSU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb25zdHJhaW50RUNsYXNzLCBDT05TVFJBSU5UX19CT0RZKTsKLQotCQltZXRob2RFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fR1VJRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywKLQkJCQlNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19LSU5EKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFKTsKLQotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywKLQkJCQlNRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUUpOwotCi0JCWtpbmRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoS0lORCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoa2luZEVDbGFzcywgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCi0JCWNvbnRlbnRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsCi0JCQkJQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsCi0JCQkJQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUU19BTkRfUEFQRVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19DSEVDS0xJU1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQVNTRVRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19URVJNREVGSU5JVElPTik7Ci0KLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSUJBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTik7Ci0KLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTlMpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNPTlRFTlRfREVTQ1JJUFRJT05fX0xPTkdfUFJFU0VOVEFUSU9OX05BTUUpOwotCi0JCW1ldGhvZFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1VOSVQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19BVVRIT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19WRVJTSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUX1NUQVRFTUVOVCk7Ci0KLQkJc3VwcG9ydGluZ01hdGVyaWFsRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNVUFBPUlRJTkdfTUFURVJJQUwpOwotCi0JCWd1aWRhbmNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdVSURBTkNFKTsKLQotCQlzZWN0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFNFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1NFQ1RJT05fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU0VDVElPTl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU1VCX1NFQ1RJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19QUkVERUNFU1NPUik7Ci0KLQkJdmFyaWFiaWxpdHlFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFZBUklBQklMSVRZX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHZhcmlhYmlsaXR5RWxlbWVudEVDbGFzcywKLQkJCQlWQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0KLQkJY29uY2VwdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05DRVBUKTsKLQotCQljaGVja2xpc3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hFQ0tMSVNUKTsKLQotCQlndWlkZWxpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREVMSU5FKTsKLQotCQlleGFtcGxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVYQU1QTEUpOwotCi0JCXJldXNhYmxlQXNzZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVVU0FCTEVfQVNTRVQpOwotCi0JCXRlcm1EZWZpbml0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFUk1fREVGSU5JVElPTik7Ci0KLQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLAotCQkJCUFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTik7Ci0KLQkJYXJ0aWZhY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1QpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fQ09OVEFJTkVSX0FSVElGQUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVFMpOwotCi0JCXdvcmtQcm9kdWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fUkVQT1JUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3RFQ2xhc3MsIFdPUktfUFJPRFVDVF9fVEVNUExBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19UT09MX01FTlRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0RUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJZnVsZmlsbGFibGVFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEZVTEZJTExBQkxFX0VMRU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlGVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUyk7Ci0KLQkJcmVwb3J0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJFUE9SVCk7Ci0KLQkJdGVtcGxhdGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVNUExBVEUpOwotCi0JCXRvb2xNZW50b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTF9NRU5UT1IpOwotCi0JCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQlkZWxpdmVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhERUxJVkVSQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcmFibGVFQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1RTKTsKLQotCQlvdXRjb21lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVENPTUUpOwotCi0JCXN0ZXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1RFUCk7Ci0KLQkJd29ya0RlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCi0JCXdoaXRlcGFwZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV0hJVEVQQVBFUik7Ci0KLQkJdGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19QRVJGT1JNRURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fT1VUUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRUNsYXNzLCBUQVNLX19PUFRJT05BTF9JTlBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fU1RFUFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tFQ2xhc3MsIFRBU0tfX1RPT0xfTUVOVE9SUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0VDbGFzcywgVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJcm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRUNsYXNzLCBST0xFX19NT0RJRklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUVDbGFzcywgUk9MRV9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFSVElGQUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04pOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcpOwotCi0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UpOwotCi0JCXJvbGVEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyk7Ci0KLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0aW9uRUNsYXNzLCBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCi0JCWd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1VJREFOQ0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlRTKTsKLQotCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk8pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU0pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTik7Ci0KLQkJcm9sZVNldEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX1NFVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZVNldEVDbGFzcywgUk9MRV9TRVRfX1JPTEVTKTsKLQotCQljb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9DQVRFR09SWSk7Ci0KLQkJZG9tYWluRUNsYXNzID0gY3JlYXRlRUNsYXNzKERPTUFJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9tYWluRUNsYXNzLCBET01BSU5fX1dPUktfUFJPRFVDVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvbWFpbkVDbGFzcywgRE9NQUlOX19TVUJET01BSU5TKTsKLQotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUUyk7Ci0KLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkVfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywKLQkJCQlESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FUyk7Ci0KLQkJZGlzY2lwbGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESVNDSVBMSU5FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaXNjaXBsaW5lRUNsYXNzLCBESVNDSVBMSU5FX19UQVNLUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fU1VCRElTQ0lQTElORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XUyk7Ci0KLQkJYWN0aXZpdHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFkpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFjdGl2aXR5RUNsYXNzLCBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1JPQURNQVBTKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCVdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1IpOwotCi0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQlJFQUtET1dOX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUSUVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUxTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fVEVNUExBVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fUkVQT1JUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYnJlYWtkb3duRWxlbWVudEVDbGFzcywKLQkJCQlCUkVBS0RPV05fRUxFTUVOVF9fRVNUSU1BVElPTkNPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fVE9PTE1FTlRPUik7Ci0KLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19FTEVNRU5UKTsKLQotCQlwbGFubmluZ0RhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUExBTk5JTkdfREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwbGFubmluZ0RhdGFFQ2xhc3MsIFBMQU5OSU5HX0RBVEFfX1JBTkspOwotCi0JCXdvcmtPcmRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX09SREVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0xJTktfVFlQRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya09yZGVyRUNsYXNzLCBXT1JLX09SREVSX19QUkVEKTsKLQotCQlyb2FkbWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPQURNQVApOwotCi0JCXRvb2xFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodG9vbEVDbGFzcywgVE9PTF9fVE9PTF9NRU5UT1JTKTsKLQotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVRfR1JPVVBJTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUUyk7Ci0KLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1VTVE9NX0NBVEVHT1JZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywKLQkJCQlDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUklFUyk7Ci0KLQkJbWV0aG9kUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0NISUxEX1BBQ0tBR0VTKTsKLQotCQljb250ZW50UGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX1BBQ0tBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UUyk7Ci0KLQkJbWlsZXN0b25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1JTEVTVE9ORSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWlsZXN0b25lRUNsYXNzLCBNSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVFMpOwotCi0JCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLAotCQkJCVdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTKTsKLQotCQlkZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFU0NSSVBUT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQlpdGVyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSVRFUkFUSU9OKTsKLQotCQlwaGFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSEFTRSk7Ci0KLQkJdGVhbVByb2ZpbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVBTV9QUk9GSUxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19URUFNX1JPTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0ZWFtUHJvZmlsZUVDbGFzcywgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSk7Ci0KLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19NT0RJRklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZURlc2NyaXB0b3JFQ2xhc3MsIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQotCQl0YXNrRGVzY3JpcHRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX1RBU0spOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19PVVRQVVQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fU0VMRUNURURfU1RFUFMpOwotCi0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09NUE9TSVRFX1JPTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIENPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEVTKTsKLQotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTFMpOwotCi0JCXByb2Nlc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0VDbGFzcywgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCk7Ci0KLQkJY2FwYWJpbGl0eVBhdHRlcm5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0FQQUJJTElUWV9QQVRURVJOKTsKLQotCQltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVdTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLAotCQkJCU1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsCi0JCQkJTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZKTsKLQotCQltZXRob2RQbHVnaW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZFBsdWdpbkVDbGFzcywgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX0JBU0VTKTsKLQotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywKLQkJCQlQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFRF9PTl9QUk9DRVNTRVMpOwotCi0JCXByYWN0aWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSQUNUSUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRVMpOwotCi0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSk7Ci0KLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQ1RJVklUWV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dUT19TVEFGRik7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUKTsKLQotCQlwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTKTsKLQotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLAotCQkJCURFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04pOwotCi0JCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1IpOwotCQljcmVhdGVFUmVmZXJlbmNlKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzLAotCQkJCVBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1JfX1BST0NFU1NfQ09NUE9ORU5UKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MpOwotCi0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsCi0JCQkJUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19ESUFHUkFNUyk7Ci0KLQkJZGlhZ3JhbUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhESUFHUkFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRUNsYXNzLCBESUFHUkFNX19ESUFHUkFNX0xJTkspOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FQ2xhc3MsIERJQUdSQU1fX05BTUVTUEFDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVDbGFzcywgRElBR1JBTV9fVklFV1BPSU5UKTsKLQotCQlncmFwaE5vZGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfTk9ERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhOb2RlRUNsYXNzLCBHUkFQSF9OT0RFX19TSVpFKTsKLQotCQlncmFwaEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoR1JBUEhfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19DT05UQUlORUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fUE9TSVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fTElOSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhFbGVtZW50RUNsYXNzLCBHUkFQSF9FTEVNRU5UX19BTkNIT1JBR0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWxlbWVudEVDbGFzcywgR1JBUEhfRUxFTUVOVF9fU0VNQU5USUNfTU9ERUwpOwotCi0JCWRpYWdyYW1FbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU1fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fSVNfVklTSUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUVsZW1lbnRFQ2xhc3MsIERJQUdSQU1fRUxFTUVOVF9fQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkaWFncmFtRWxlbWVudEVDbGFzcywgRElBR1JBTV9FTEVNRU5UX19SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1FbGVtZW50RUNsYXNzLCBESUFHUkFNX0VMRU1FTlRfX1BST1BFUlRZKTsKLQotCQlyZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVGRVJFTkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyZWZlcmVuY2VFQ2xhc3MsCi0JCQkJUkVGRVJFTkNFX19JU19JTkRJVklEVUFMX1JFUFJFU0VOVEFUSU9OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShyZWZlcmVuY2VFQ2xhc3MsIFJFRkVSRU5DRV9fUkVGRVJFTkNFRCk7Ci0KLQkJcHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb3BlcnR5RUNsYXNzLCBQUk9QRVJUWV9fS0VZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9wZXJ0eUVDbGFzcywgUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQlwb2ludEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0lOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9pbnRFQ2xhc3MsIFBPSU5UX19YKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwb2ludEVDbGFzcywgUE9JTlRfX1kpOwotCi0JCWRpYWdyYW1MaW5rRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJQUdSQU1fTElOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fWk9PTSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlhZ3JhbUxpbmtFQ2xhc3MsIERJQUdSQU1fTElOS19fVklFV1BPUlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0RJQUdSQU0pOwotCQljcmVhdGVFUmVmZXJlbmNlKGRpYWdyYW1MaW5rRUNsYXNzLCBESUFHUkFNX0xJTktfX0dSQVBIX0VMRU1FTlQpOwotCi0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0NPTk5FQ1RPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZ3JhcGhDb25uZWN0b3JFQ2xhc3MsIEdSQVBIX0NPTk5FQ1RPUl9fR1JBUEhfRUxFTUVOVCk7Ci0KLQkJZ3JhcGhFZGdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBIX0VER0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGdyYXBoRWRnZUVDbGFzcywgR1JBUEhfRURHRV9fV0FZUE9JTlRTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShncmFwaEVkZ2VFQ2xhc3MsIEdSQVBIX0VER0VfX0FOQ0hPUik7Ci0KLQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTRU1BTlRJQ19NT0RFTF9CUklER0UpOwotCQljcmVhdGVFQXR0cmlidXRlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJU0VNQU5USUNfTU9ERUxfQlJJREdFX19ESUFHUkFNKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLAotCQkJCVNFTUFOVElDX01PREVMX0JSSURHRV9fR1JBUEhfRUxFTUVOVCk7Ci0KLQkJZGltZW5zaW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJTUVOU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGltZW5zaW9uRUNsYXNzLCBESU1FTlNJT05fX1dJRFRIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaW1lbnNpb25FQ2xhc3MsIERJTUVOU0lPTl9fSEVJR0hUKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9TUEVDSUZJQ0FUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTyk7Ci0KLQkJc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0lNUExFX1NFTUFOVElDX01PREVMX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLAotCQkJCVNJTVBMRV9TRU1BTlRJQ19NT0RFTF9FTEVNRU5UX19UWVBFX0lORk8pOwotCi0JCXVtYVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVU1BX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlVTUFfU0VNQU5USUNfTU9ERUxfQlJJREdFX19FTEVNRU5UKTsKLQotCQljb3JlU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT1JFX1NFTUFOVElDX01PREVMX0JSSURHRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0VfX0VMRU1FTlQpOwotCi0JCWxlYWZFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKExFQUZfRUxFTUVOVCk7Ci0KLQkJdGV4dEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVEVYVF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0ZXh0RWxlbWVudEVDbGFzcywgVEVYVF9FTEVNRU5UX19URVhUKTsKLQotCQlpbWFnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJTUFHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoaW1hZ2VFQ2xhc3MsIElNQUdFX19VUkkpOwotCQljcmVhdGVFQXR0cmlidXRlKGltYWdlRUNsYXNzLCBJTUFHRV9fTUlNRV9UWVBFKTsKLQotCQlncmFwaGljUHJpbWl0aXZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEdSQVBISUNfUFJJTUlUSVZFKTsKLQotCQlwb2x5bGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT0xZTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocG9seWxpbmVFQ2xhc3MsIFBPTFlMSU5FX19DTE9TRUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHBvbHlsaW5lRUNsYXNzLCBQT0xZTElORV9fV0FZUE9JTlRTKTsKLQotCQllbGxpcHNlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMTElQU0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX0NFTlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fUkFESVVTX1gpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX1JBRElVU19ZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlbGxpcHNlRUNsYXNzLCBFTExJUFNFX19ST1RBVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZWxsaXBzZUVDbGFzcywgRUxMSVBTRV9fU1RBUlRfQU5HTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGVsbGlwc2VFQ2xhc3MsIEVMTElQU0VfX0VORF9BTkdMRSk7Ci0KLQkJcHJvY2Vzc0ZhbWlseUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0ZBTUlMWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0ZhbWlseUVDbGFzcywKLQkJCQlQUk9DRVNTX0ZBTUlMWV9fREVMSVZFUllfUFJPQ0VTU0VTKTsKLQotCQltZXRob2RMaWJyYXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKG1ldGhvZExpYnJhcnlFQ2xhc3MsCi0JCQkJTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl2YXJpYWJpbGl0eVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFZBUklBQklMSVRZX1RZUEUpOwotCQl3b3JrT3JkZXJUeXBlRUVudW0gPSBjcmVhdGVFRW51bShXT1JLX09SREVSX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBkYXRhIHR5cGVzCi0JCXN0cmluZ0VEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShTVFJJTkcpOwotCQlib29sZWFuRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKEJPT0xFQU4pOwotCQlkYXRlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERBVEUpOwotCQl1cmlFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVVJJKTsKLQkJc2V0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFVCk7Ci0JCXNlcXVlbmNlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFNFUVVFTkNFKTsKLQkJaW50ZWdlckVEYXRhVHlwZSA9IGNyZWF0ZUVEYXRhVHlwZShJTlRFR0VSKTsKLQkJZG91YmxlRURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKERPVUJMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNJbml0aWFsaXplZCkKLQkJCXJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJY2xhc3NpZmllckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFR5cGUoKSk7Ci0JCXR5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJbmFtZWRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RWxlbWVudCgpKTsKLQkJcGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVzcGFjZSgpKTsKLQkJcGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbmFtZXNwYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TmFtZWRFbGVtZW50KCkpOwotCQljb25zdHJhaW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQlraW5kRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2xhc3NpZmllcigpKTsKLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkYW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQlzZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0VmFyaWFiaWxpdHlFbGVtZW50KCkpOwotCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQljb25jZXB0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWNoZWNrbGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlndWlkZWxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXhhbXBsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyZXVzYWJsZUFzc2V0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlcm1EZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvRUNsYXNzLmdldEVTdXBlclR5cGVzKCkKLQkJCQkuYWRkKHRoaXMuZ2V0Q2xhc3NpZmllcigpKTsKLQkJYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRGdWxmaWxsYWJsZUVsZW1lbnQoKSk7Ci0JCWZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpKTsKLQkJcmVwb3J0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRlbXBsYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXRvb2xNZW50b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCW91dGNvbWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJc3RlcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFNlY3Rpb24oKSk7Ci0JCXN0ZXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RFbGVtZW50KCkpOwotCQl3aGl0ZXBhcGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29uY2VwdCgpKTsKLQkJdGFza0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQl0YXNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0RlZmluaXRpb24oKSk7Ci0JCXJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJcm9sZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpKTsKLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpCi0JCQkJLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJcm9sZVNldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJY29udGVudENhdGVnb3J5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCWRvbWFpbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWFjdGl2aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RnVsZmlsbGFibGVFbGVtZW50KCkpOwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFZhcmlhYmlsaXR5RWxlbWVudCgpKTsKLQkJYWN0aXZpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrRGVmaW5pdGlvbigpKTsKLQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXByb2Nlc3NFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkpOwotCQlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJd29ya09yZGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXJvYWRtYXBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJdG9vbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQljb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCW1pbGVzdG9uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQlkZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJaXRlcmF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXBoYXNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHkoKSk7Ci0JCXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpKTsKLQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2VzcygpKTsKLQkJcHJvY2Vzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCXByYWN0aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQoCi0JCQkJdGhpcy5nZXREZXNjcmlwdG9yKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc1BhY2thZ2UoKSk7Ci0JCXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSk7Ci0JCWRpYWdyYW1FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaE5vZGUoKSk7Ci0JCWdyYXBoTm9kZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoRWxlbWVudCgpKTsKLQkJZ3JhcGhFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1FbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJcmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCXByb3BlcnR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWRpYWdyYW1MaW5rRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSk7Ci0JCWdyYXBoQ29ubmVjdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3JhcGhFbGVtZW50KCkpOwotCQlncmFwaEVkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaEVsZW1lbnQoKSk7Ci0JCXNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKQotCQkJCS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCgKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSk7Ci0JCWNvcmVTZW1hbnRpY01vZGVsQnJpZGdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpKTsKLQkJbGVhZkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREaWFncmFtRWxlbWVudCgpKTsKLQkJdGV4dEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJaW1hZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRMZWFmRWxlbWVudCgpKTsKLQkJZ3JhcGhpY1ByaW1pdGl2ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldExlYWZFbGVtZW50KCkpOwotCQlwb2x5bGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEdyYXBoaWNQcmltaXRpdmUoKSk7Ci0JCWVsbGlwc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHcmFwaGljUHJpbWl0aXZlKCkpOwotCQlwcm9jZXNzRmFtaWx5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKTsKLQkJbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZFVuaXQoKSk7Ci0JCW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoCi0JCQkJY2xhc3NpZmllckVDbGFzcywKLQkJCQlDbGFzc2lmaWVyLmNsYXNzLAotCQkJCSJDbGFzc2lmaWVyIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q2xhc3NpZmllcl9Jc0Fic3RyYWN0KCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzQWJzdHJhY3QiLCAiZmFsc2UiLCAxLCAxLCBDbGFzc2lmaWVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcyh0eXBlRUNsYXNzLCBUeXBlLmNsYXNzLAotCQkJCSJUeXBlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlQYWNrYWdlYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkJIlBhY2thZ2VhYmxlRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQluYW1lZEVsZW1lbnRFQ2xhc3MsCi0JCQkJTmFtZWRFbGVtZW50LmNsYXNzLAotCQkJCSJOYW1lZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXROYW1lZEVsZW1lbnRfTmFtZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm5hbWUiLCAiIiwgMCwgMSwgTmFtZWRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQllbGVtZW50RUNsYXNzLAotCQkJCUVsZW1lbnQuY2xhc3MsCi0JCQkJIkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGFja2FnZUVDbGFzcywKLQkJCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UuY2xhc3MsCi0JCQkJIlBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW5hbWVzcGFjZUVDbGFzcywKLQkJCQlOYW1lc3BhY2UuY2xhc3MsCi0JCQkJIk5hbWVzcGFjZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb25zdHJhaW50RUNsYXNzLAotCQkJCUNvbnN0cmFpbnQuY2xhc3MsCi0JCQkJIkNvbnN0cmFpbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Q29uc3RyYWludF9Cb2R5KCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYm9keSIsICIiLCAwLCAxLCBDb25zdHJhaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50RUNsYXNzLAotCQkJCU1ldGhvZEVsZW1lbnQuY2xhc3MsCi0JCQkJIk1ldGhvZEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X0d1aWQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJndWlkIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsIElTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVzZW50YXRpb25OYW1lIiwgIiIsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYnJpZWZEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlcygpLAotCQkJCXRoaXMuZ2V0Q29uc3RyYWludCgpLAotCQkJCW51bGwsCi0JCQkJIm93bmVkUnVsZXMiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kRWxlbWVudFByb3BlcnR5IiwgbnVsbCwgMCwgLTEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9LaW5kKCksCi0JCQkJdGhpcy5nZXRLaW5kKCksCi0JCQkJbnVsbCwKLQkJCQkia2luZCIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkic3VwcHJlc3NlZCIsICJmYWxzZSIsIDEsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkib3JkZXJpbmdHdWlkZSIsICIiLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsCi0JCQkJTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLAotCQkJCSJNZXRob2RFbGVtZW50UHJvcGVydHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkidmFsdWUiLCAiIiwgMCwgMSwgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlraW5kRUNsYXNzLAotCQkJCUtpbmQuY2xhc3MsCi0JCQkJIktpbmQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLAotCQkJCXRoaXMuZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSwKLQkJCQludWxsLAotCQkJCSJhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIsIG51bGwsIDAsIC0xLCBLaW5kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb250ZW50RWxlbWVudEVDbGFzcywKLQkJCQlDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCQkiQ29udGVudEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJzdXBwb3J0aW5nTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLAotCQkJCXRoaXMuZ2V0Q29uY2VwdCgpLAotCQkJCW51bGwsCi0JCQkJImNvbmNlcHRzQW5kUGFwZXJzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3RzKCksCi0JCQkJdGhpcy5nZXRDaGVja2xpc3QoKSwKLQkJCQludWxsLAotCQkJCSJjaGVja2xpc3RzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksCi0JCQkJdGhpcy5nZXRHdWlkZWxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJndWlkZWxpbmVzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlcygpLAotCQkJCXRoaXMuZ2V0RXhhbXBsZSgpLAotCQkJCW51bGwsCi0JCQkJImV4YW1wbGVzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50RWxlbWVudF9Bc3NldHMoKSwKLQkJCQl0aGlzLmdldFJldXNhYmxlQXNzZXQoKSwKLQkJCQludWxsLAotCQkJCSJhc3NldHMiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnRFbGVtZW50X1Rlcm1kZWZpbml0aW9uKCksCi0JCQkJdGhpcy5nZXRUZXJtRGVmaW5pdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInRlcm1kZWZpbml0aW9uIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLAotCQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCQkiRGVzY3JpYmFibGVFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkicHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwKLQkJCQl0aGlzLmdldFVyaSgpLAotCQkJCSJzaGFwZWljb24iLCBudWxsLCAwLCAxLCBEZXNjcmliYWJsZUVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpLAotCQkJCXRoaXMuZ2V0VXJpKCksCi0JCQkJIm5vZGVpY29uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUNvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQ29udGVudERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJtYWluRGVzY3JpcHRpb24iLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlY3Rpb25zIiwgbnVsbCwgMCwgLTEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImV4dGVybmFsSWQiLCAiIiwgMCwgMSwgQ29udGVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImtleUNvbnNpZGVyYXRpb25zIiwgIiIsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRDb250ZW50RGVzY3JpcHRpb25fTG9uZ1ByZXNlbnRhdGlvbk5hbWUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJsb25nUHJlc2VudGF0aW9uTmFtZSIsIG51bGwsIDEsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFVuaXRFQ2xhc3MsCi0JCQkJTWV0aG9kVW5pdC5jbGFzcywKLQkJCQkiTWV0aG9kVW5pdCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQXV0aG9ycygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImF1dGhvcnMiLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJjaGFuZ2VEZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldE1ldGhvZFVuaXRfVmVyc2lvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInZlcnNpb24iLCAiIiwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkiY29weXJpZ2h0U3RhdGVtZW50IiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcywKLQkJCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkJIlN1cHBvcnRpbmdNYXRlcmlhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VFQ2xhc3MsCi0JCQkJR3VpZGFuY2UuY2xhc3MsCi0JCQkJIkd1aWRhbmNlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXNlY3Rpb25FQ2xhc3MsCi0JCQkJU2VjdGlvbi5jbGFzcywKLQkJCQkiU2VjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZWN0aW9uX1NlY3Rpb25OYW1lKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2VjdGlvbk5hbWUiLCAiIiwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRTZWN0aW9uX1NlY3Rpb25EZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNlY3Rpb25EZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fU3ViU2VjdGlvbnMoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJzdWJTZWN0aW9ucyIsIG51bGwsIDAsIC0xLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwKLQkJCQl0aGlzLmdldFNlY3Rpb24oKSwKLQkJCQludWxsLAotCQkJCSJwcmVkZWNlc3NvciIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl2YXJpYWJpbGl0eUVsZW1lbnRFQ2xhc3MsCi0JCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJCSJWYXJpYWJpbGl0eUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eVR5cGUoKSwKLQkJCQkidmFyaWFiaWxpdHlUeXBlIiwgIm5hIiwgMSwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFZhcmlhYmlsaXR5RWxlbWVudF9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksCi0JCQkJdGhpcy5nZXRWYXJpYWJpbGl0eUVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiwgbnVsbCwgMSwgMSwgVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29uY2VwdEVDbGFzcywKLQkJCQlDb25jZXB0LmNsYXNzLAotCQkJCSJDb25jZXB0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljaGVja2xpc3RFQ2xhc3MsCi0JCQkJQ2hlY2tsaXN0LmNsYXNzLAotCQkJCSJDaGVja2xpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWd1aWRlbGluZUVDbGFzcywKLQkJCQlHdWlkZWxpbmUuY2xhc3MsCi0JCQkJIkd1aWRlbGluZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZXhhbXBsZUVDbGFzcywKLQkJCQlFeGFtcGxlLmNsYXNzLAotCQkJCSJFeGFtcGxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyZXVzYWJsZUFzc2V0RUNsYXNzLAotCQkJCVJldXNhYmxlQXNzZXQuY2xhc3MsCi0JCQkJIlJldXNhYmxlQXNzZXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRlcm1EZWZpbml0aW9uRUNsYXNzLAotCQkJCVRlcm1EZWZpbml0aW9uLmNsYXNzLAotCQkJCSJUZXJtRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MsCi0JCQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uY2xhc3MsCi0JCQkJIkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc1ByaW1hcnlFeHRlbnNpb24iLCBudWxsLCAxLCAxLCBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RUNsYXNzLAotCQkJCUFydGlmYWN0LmNsYXNzLAotCQkJCSJBcnRpZmFjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCXRoaXMuZ2V0QXJ0aWZhY3QoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0cygpLAotCQkJCSJjb250YWluZXJBcnRpZmFjdCIsIG51bGwsIDAsIDEsIEFydGlmYWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBcnRpZmFjdF9Db250YWluZWRBcnRpZmFjdHMoKSwKLQkJCQl0aGlzLmdldEFydGlmYWN0KCksCi0JCQkJdGhpcy5nZXRBcnRpZmFjdF9Db250YWluZXJBcnRpZmFjdCgpLAotCQkJCSJjb250YWluZWRBcnRpZmFjdHMiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RUNsYXNzLAotCQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJCSJXb3JrUHJvZHVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9SZXBvcnRzKCksCi0JCQkJdGhpcy5nZXRSZXBvcnQoKSwKLQkJCQludWxsLAotCQkJCSJyZXBvcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZXMoKSwKLQkJCQl0aGlzLmdldFRlbXBsYXRlKCksCi0JCQkJbnVsbCwKLQkJCQkidGVtcGxhdGVzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLAotCQkJCW51bGwsCi0JCQkJImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWZ1bGZpbGxhYmxlRWxlbWVudEVDbGFzcywKLQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsCi0JCQkJIkZ1bGZpbGxhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoKSwKLQkJCQl0aGlzLmdldEZ1bGZpbGxhYmxlRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImZ1bGZpbGxzIiwgbnVsbCwgMCwgLTEsIEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJlcG9ydEVDbGFzcywKLQkJCQlSZXBvcnQuY2xhc3MsCi0JCQkJIlJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGVtcGxhdGVFQ2xhc3MsCi0JCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkJIlRlbXBsYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0b29sTWVudG9yRUNsYXNzLAotCQkJCVRvb2xNZW50b3IuY2xhc3MsCi0JCQkJIlRvb2xNZW50b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcywKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MsCi0JCQkJIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGVsaXZlcmFibGVFQ2xhc3MsCi0JCQkJRGVsaXZlcmFibGUuY2xhc3MsCi0JCQkJIkRlbGl2ZXJhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyZWRXb3JrUHJvZHVjdHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcmFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlvdXRjb21lRUNsYXNzLAotCQkJCU91dGNvbWUuY2xhc3MsCi0JCQkJIk91dGNvbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXN0ZXBFQ2xhc3MsCi0JCQkJU3RlcC5jbGFzcywKLQkJCQkiU3RlcCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0RlZmluaXRpb25FQ2xhc3MsCi0JCQkJV29ya0RlZmluaXRpb24uY2xhc3MsCi0JCQkJIldvcmtEZWZpbml0aW9uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCksCi0JCQkJdGhpcy5nZXRDb25zdHJhaW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya0RlZmluaXRpb25fUG9zdGNvbmRpdGlvbigpLAotCQkJCXRoaXMuZ2V0Q29uc3RyYWludCgpLAotCQkJCW51bGwsCi0JCQkJInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBXb3JrRGVmaW5pdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd2hpdGVwYXBlckVDbGFzcywKLQkJCQlXaGl0ZXBhcGVyLmNsYXNzLAotCQkJCSJXaGl0ZXBhcGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRUNsYXNzLAotCQkJCVRhc2suY2xhc3MsCi0JCQkJIlRhc2siLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19QZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZSgpLAotCQkJCW51bGwsCi0JCQkJInBlcmZvcm1lZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19PdXRwdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrX1N0ZXBzKCksCi0JCQkJdGhpcy5nZXRTdGVwKCksCi0JCQkJbnVsbCwKLQkJCQkic3RlcHMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza19Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQludWxsLAotCQkJCSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVFQ2xhc3MsCi0JCQkJUm9sZS5jbGFzcywKLQkJCQkiUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIm1vZGlmaWVzIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVfUmVzcG9uc2libGVGb3IoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0KCksCi0JCQkJbnVsbCwKLQkJCQkicmVzcG9uc2libGVGb3IiLCBudWxsLCAwLCAtMSwgUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJQXJ0aWZhY3REZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiQXJ0aWZhY3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRBcnRpZmFjdERlc2NyaXB0aW9uX0JyaWVmT3V0bGluZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJyaWVmT3V0bGluZSIsICIiLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicmVwcmVzZW50YXRpb25PcHRpb25zIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlcHJlc2VudGF0aW9uIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJIm5vdGF0aW9uIiwgIiIsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImltcGFjdE9mTm90SGF2aW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlYXNvbnNGb3JOb3ROZWVkaW5nIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJleHRlcm5hbERlc2NyaXB0aW9uIiwgIiIsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInBhY2thZ2luZ0d1aWRhbmNlIiwgIiIsIDAsIDEsIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlSb2xlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlJvbGVEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic2tpbGxzIiwgIiIsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhc3NpZ25tZW50QXBwcm9hY2hlcyIsICIiLCAwLCAxLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkic3lub255bXMiLCAiIiwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0YXNrRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJVGFza0Rlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwdXJwb3NlIiwgIiIsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWx0ZXJuYXRpdmVzIiwgIiIsIDAsIDEsIFRhc2tEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJHdWlkYW5jZURlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudHMoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhdHRhY2htZW50cyIsICIiLCAwLCAxLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIlByYWN0aWNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BZGRpdGlvbmFsSW5mbygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImFkZGl0aW9uYWxJbmZvIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJvYmxlbSIsICIiLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImJhY2tncm91bmQiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiZ29hbHMiLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYXBwbGljYXRpb24iLCAiIiwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJsZXZlbHNPZkFkb3B0aW9uIiwgIiIsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXJvbGVTZXRFQ2xhc3MsCi0JCQkJUm9sZVNldC5jbGFzcywKLQkJCQkiUm9sZVNldCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSb2xlU2V0X1JvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlKCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZXMiLCBudWxsLCAwLCAtMSwgUm9sZVNldC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRDYXRlZ29yeUVDbGFzcywKLQkJCQlDb250ZW50Q2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkNvbnRlbnRDYXRlZ29yeSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkb21haW5FQ2xhc3MsCi0JCQkJRG9tYWluLmNsYXNzLAotCQkJCSJEb21haW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RG9tYWluX1dvcmtQcm9kdWN0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3QoKSwKLQkJCQludWxsLAotCQkJCSJ3b3JrUHJvZHVjdHMiLCBudWxsLCAwLCAtMSwgRG9tYWluLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREb21haW5fU3ViZG9tYWlucygpLAotCQkJCXRoaXMuZ2V0RG9tYWluKCksCi0JCQkJbnVsbCwKLQkJCQkic3ViZG9tYWlucyIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0VHlwZUVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdFR5cGUuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0VHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3RzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIndvcmtQcm9kdWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsCi0JCQkJRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLAotCQkJCSJEaXNjaXBsaW5lR3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksCi0JCQkJdGhpcy5nZXREaXNjaXBsaW5lKCksCi0JCQkJbnVsbCwKLQkJCQkiZGlzY2lwbGluZXMiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGlzY2lwbGluZUVDbGFzcywKLQkJCQlEaXNjaXBsaW5lLmNsYXNzLAotCQkJCSJEaXNjaXBsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpc2NpcGxpbmVfVGFza3MoKSwKLQkJCQl0aGlzLmdldFRhc2soKSwKLQkJCQludWxsLAotCQkJCSJ0YXNrcyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaXNjaXBsaW5lX1N1YmRpc2NpcGxpbmUoKSwKLQkJCQl0aGlzLmdldERpc2NpcGxpbmUoKSwKLQkJCQludWxsLAotCQkJCSJzdWJkaXNjaXBsaW5lIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvd3MoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJbnVsbCwKLQkJCQkicmVmZXJlbmNlV29ya2Zsb3dzIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhY3Rpdml0eUVDbGFzcywKLQkJCQlBY3Rpdml0eS5jbGFzcywKLQkJCQkiQWN0aXZpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0aWVzKCksCi0JCQkJImJyZWFrZG93bkVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRBY3Rpdml0eV9Sb2FkbWFwcygpLAotCQkJCXRoaXMuZ2V0Um9hZG1hcCgpLAotCQkJCW51bGwsCi0JCQkJInJvYWRtYXBzIiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsCi0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIldvcmtCcmVha2Rvd25FbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzUmVwZWF0YWJsZSIsICJmYWxzZSIsIDEsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc09uZ29pbmciLCAiZmFsc2UiLCAxLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzRXZlbnREcml2ZW4iLCAiZmFsc2UiLCAxLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9QcmVkZWNlc3NvcigpLAotCQkJCXRoaXMuZ2V0V29ya09yZGVyKCksCi0JCQkJbnVsbCwKLQkJCQkibGlua1RvUHJlZGVjZXNzb3IiLCBudWxsLCAwLCAtMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlicmVha2Rvd25FbGVtZW50RUNsYXNzLAotCQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkJIkJyZWFrZG93bkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1ByZWZpeCgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByZWZpeCIsICIiLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzUGxhbm5lZCIsICJ0cnVlIiwgMSwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIsICJmYWxzZSIsIDEsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImlzT3B0aW9uYWwiLCAiZmFsc2UiLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSwKLQkJCQl0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVzZW50ZWRBZnRlciIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksCi0JCQkJdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJlc2VudGVkQmVmb3JlIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSwKLQkJCQl0aGlzLmdldFBsYW5uaW5nRGF0YSgpLAotCQkJCW51bGwsCi0JCQkJInBsYW5uaW5nRGF0YSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXRpZXMoKSwKLQkJCQl0aGlzLmdldEFjdGl2aXR5KCksCi0JCQkJdGhpcy5nZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50cygpLAotCQkJCSJzdXBlckFjdGl2aXRpZXMiLCBudWxsLCAxLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdHMoKSwKLQkJCQl0aGlzLmdldENoZWNrbGlzdCgpLAotCQkJCW51bGwsCi0JCQkJImNoZWNrbGlzdHMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLAotCQkJCXRoaXMuZ2V0Q29uY2VwdCgpLAotCQkJCW51bGwsCi0JCQkJImNvbmNlcHRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZXMoKSwKLQkJCQl0aGlzLmdldEV4YW1wbGUoKSwKLQkJCQludWxsLAotCQkJCSJleGFtcGxlcyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwKLQkJCQl0aGlzLmdldEd1aWRlbGluZSgpLAotCQkJCW51bGwsCi0JCQkJImd1aWRlbGluZXMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0cygpLAotCQkJCXRoaXMuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCW51bGwsCi0JCQkJInJldXNhYmxlQXNzZXRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLAotCQkJCXRoaXMuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCksCi0JCQkJbnVsbCwKLQkJCQkic3VwcG9ydGluZ01hdGVyaWFscyIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50X1RlbXBsYXRlcygpLAotCQkJCXRoaXMuZ2V0VGVtcGxhdGUoKSwKLQkJCQludWxsLAotCQkJCSJ0ZW1wbGF0ZXMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9SZXBvcnRzKCksCi0JCQkJdGhpcy5nZXRSZXBvcnQoKSwKLQkJCQludWxsLAotCQkJCSJyZXBvcnRzIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEJyZWFrZG93bkVsZW1lbnRfRXN0aW1hdGlvbmNvbnNpZGVyYXRpb25zKCksCi0JCQkJdGhpcy5nZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwKLQkJCQludWxsLAotCQkJCSJlc3RpbWF0aW9uY29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0QnJlYWtkb3duRWxlbWVudF9Ub29sbWVudG9yKCksCi0JCQkJdGhpcy5nZXRUb29sTWVudG9yKCksCi0JCQkJbnVsbCwKLQkJCQkidG9vbG1lbnRvciIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MsCi0JCQkJUHJvY2Vzc0VsZW1lbnQuY2xhc3MsCi0JCQkJIlByb2Nlc3NFbGVtZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXBsYW5uaW5nRGF0YUVDbGFzcywKLQkJCQlQbGFubmluZ0RhdGEuY2xhc3MsCi0JCQkJIlBsYW5uaW5nRGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCksCi0JCQkJdGhpcy5nZXREYXRlKCksCi0JCQkJInN0YXJ0RGF0ZSIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwKLQkJCQl0aGlzLmdldERhdGUoKSwKLQkJCQkiZmluaXNoRGF0ZSIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSwKLQkJCQl0aGlzLmdldEludGVnZXIoKSwKLQkJCQkicmFuayIsIG51bGwsIDEsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtPcmRlckVDbGFzcywKLQkJCQlXb3JrT3JkZXIuY2xhc3MsCi0JCQkJIldvcmtPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwKLQkJCQl0aGlzLmdldFdvcmtPcmRlclR5cGUoKSwKLQkJCQkibGlua1R5cGUiLCAiZmluaXNoVG9TdGFydCIsIDEsIDEsIFdvcmtPcmRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrT3JkZXJfUHJlZCgpLAotCQkJCXRoaXMuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJwcmVkIiwgbnVsbCwgMSwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9hZG1hcEVDbGFzcywKLQkJCQlSb2FkbWFwLmNsYXNzLAotCQkJCSJSb2FkbWFwIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0b29sRUNsYXNzLAotCQkJCVRvb2wuY2xhc3MsCi0JCQkJIlRvb2wiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VG9vbF9Ub29sTWVudG9ycygpLAotCQkJCXRoaXMuZ2V0VG9vbE1lbnRvcigpLAotCQkJCW51bGwsCi0JCQkJInRvb2xNZW50b3JzIiwgbnVsbCwgMCwgLTEsIFRvb2wuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MsCi0JCQkJUm9sZVNldEdyb3VwaW5nLmNsYXNzLAotCQkJCSJSb2xlU2V0R3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXRzKCksCi0JCQkJdGhpcy5nZXRSb2xlU2V0KCksCi0JCQkJbnVsbCwKLQkJCQkicm9sZVNldHMiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MsCi0JCQkJQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsCi0JCQkJIkN1c3RvbUNhdGVnb3J5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldERlc2NyaWJhYmxlRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImNhdGVnb3JpemVkRWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3JpZXMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJInN1YkNhdGVnb3JpZXMiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltZXRob2RQYWNrYWdlRUNsYXNzLAotCQkJCU1ldGhvZFBhY2thZ2UuY2xhc3MsCi0JCQkJIk1ldGhvZFBhY2thZ2UiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJnbG9iYWwiLCAiZmFsc2UiLCAxLCAxLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJyZXVzZWRQYWNrYWdlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQYWNrYWdlX0NoaWxkUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJjaGlsZFBhY2thZ2VzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNvbnRlbnRQYWNrYWdlRUNsYXNzLAotCQkJCUNvbnRlbnRQYWNrYWdlLmNsYXNzLAotCQkJCSJDb250ZW50UGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkiY29udGVudEVsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQltaWxlc3RvbmVFQ2xhc3MsCi0JCQkJTWlsZXN0b25lLmNsYXNzLAotCQkJCSJNaWxlc3RvbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWlsZXN0b25lX1JlcXVpcmVkUmVzdWx0cygpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkicmVxdWlyZWRSZXN1bHRzIiwgbnVsbCwgMCwgLTEsIE1pbGVzdG9uZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWN0aXZpdHlFbnRyeVN0YXRlIiwgIiIsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJhY3Rpdml0eUV4aXRTdGF0ZSIsICIiLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdCgpLAotCQkJCW51bGwsCi0JCQkJIldvcmtQcm9kdWN0IiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpLAotCQkJCSJpbXBhY3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwKLQkJCQkiaW1wYWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJkZWxpdmVyYWJsZVBhcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJEZXNjcmlwdG9yIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiwgInRydWUiLCAxLCAxLCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWl0ZXJhdGlvbkVDbGFzcywKLQkJCQlJdGVyYXRpb24uY2xhc3MsCi0JCQkJIkl0ZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcGhhc2VFQ2xhc3MsCi0JCQkJUGhhc2UuY2xhc3MsCi0JCQkJIlBoYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQl0ZWFtUHJvZmlsZUVDbGFzcywKLQkJCQlUZWFtUHJvZmlsZS5jbGFzcywKLQkJCQkiVGVhbVByb2ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfVGVhbVJvbGVzKCksCi0JCQkJdGhpcy5nZXRSb2xlRGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJInRlYW1Sb2xlcyIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCksCi0JCQkJdGhpcy5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLAotCQkJCSJzdXBlclRlYW0iLCBudWxsLCAxLCAxLCBUZWFtUHJvZmlsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpLAotCQkJCXRoaXMuZ2V0VGVhbVByb2ZpbGUoKSwKLQkJCQl0aGlzLmdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpLAotCQkJCSJzdWJUZWFtIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MsCi0JCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkJIlJvbGVEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJSb2xlIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX01vZGlmaWVzKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJtb2RpZmllcyIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJyZXNwb25zaWJsZUZvciIsIG51bGwsIDAsIC0xLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXRhc2tEZXNjcmlwdG9yRUNsYXNzLAotCQkJCVRhc2tEZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJUYXNrRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCksCi0JCQkJdGhpcy5nZXRUYXNrKCksCi0JCQkJbnVsbCwKLQkJCQkiVGFzayIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJhc3Npc3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJleHRlcm5hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkibWFuZGF0b3J5SW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwKLQkJCQl0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpLAotCQkJCW51bGwsCi0JCQkJIm9wdGlvbmFsSW5wdXQiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLAotCQkJCXRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLAotCQkJCXRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJwZXJmb3JtZWRQcmltYXJpbHlCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0VGFza0Rlc2NyaXB0b3JfU2VsZWN0ZWRTdGVwcygpLAotCQkJCXRoaXMuZ2V0U2VjdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInNlbGVjdGVkU3RlcHMiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQljb21wb3NpdGVSb2xlRUNsYXNzLAotCQkJCUNvbXBvc2l0ZVJvbGUuY2xhc3MsCi0JCQkJIkNvbXBvc2l0ZVJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZXMoKSwKLQkJCQl0aGlzLmdldFJvbGUoKSwKLQkJCQludWxsLAotCQkJCSJhZ2dyZWdhdGVkUm9sZXMiLCBudWxsLCAwLCAtMSwgQ29tcG9zaXRlUm9sZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywKLQkJCQlEZWxpdmVyeVByb2Nlc3MuY2xhc3MsCi0JCQkJIkRlbGl2ZXJ5UHJvY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWxzKCksCi0JCQkJdGhpcy5nZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSwKLQkJCQludWxsLAotCQkJCSJlZHVjYXRpb25NYXRlcmlhbHMiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbHMoKSwKLQkJCQl0aGlzLmdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLAotCQkJCW51bGwsCi0JCQkJImNvbW11bmljYXRpb25zTWF0ZXJpYWxzIiwgbnVsbCwgMCwgLTEsIERlbGl2ZXJ5UHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NFQ2xhc3MsCi0JCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLAotCQkJCSJQcm9jZXNzIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCksCi0JCQkJdGhpcy5nZXRDYXBhYmlsaXR5UGF0dGVybigpLAotCQkJCW51bGwsCi0JCQkJImluY2x1ZGVzUGF0dGVybnMiLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkiZGVmYXVsdENvbnRleHQiLCBudWxsLCAxLCAxLCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksCi0JCQkJdGhpcy5nZXRNZXRob2RDb25maWd1cmF0aW9uKCksCi0JCQkJbnVsbCwKLQkJCQkidmFsaWRDb250ZXh0IiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLAotCQkJCUNhcGFiaWxpdHlQYXR0ZXJuLmNsYXNzLAotCQkJCSJDYXBhYmlsaXR5UGF0dGVybiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywKLQkJCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJCSJNZXRob2RDb25maWd1cmF0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQbHVnaW5TZWxlY3Rpb24iLCBudWxsLCAxLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQYWNrYWdlKCksCi0JCQkJbnVsbCwKLQkJCQkibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIsIG51bGwsIDEsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3cygpLAotCQkJCXRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2Vzc1ZpZXdzIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJImRlZmF1bHRWaWV3IiwgbnVsbCwgMSwgMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwKLQkJCQludWxsLAotCQkJCSJiYXNlQ29uZmlndXJhdGlvbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9TdWJ0cmFjdGVkQ2F0ZWdvcnkoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJInN1YnRyYWN0ZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwKLQkJCQl0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLAotCQkJCW51bGwsCi0JCQkJImFkZGVkQ2F0ZWdvcnkiLCBudWxsLCAwLCAtMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZFBsdWdpbkVDbGFzcywKLQkJCQlNZXRob2RQbHVnaW4uY2xhc3MsCi0JCQkJIk1ldGhvZFBsdWdpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwKLQkJCQl0aGlzLmdldEJvb2xlYW4oKSwKLQkJCQkidXNlckNoYW5nZWFibGUiLCAidHJ1ZSIsIDEsIDEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZXMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBhY2thZ2UoKSwKLQkJCQludWxsLAotCQkJCSJtZXRob2RQYWNrYWdlcyIsIG51bGwsIDEsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksCi0JCQkJdGhpcy5nZXRNZXRob2RQbHVnaW4oKSwKLQkJCQludWxsLAotCQkJCSJiYXNlcyIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUVDbGFzcywKLQkJCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcywKLQkJCQkiUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZWRPblByb2Nlc3NlcygpLAotCQkJCXRoaXMuZ2V0UHJvY2VzcygpLAotCQkJCW51bGwsCi0JCQkJImJhc2VkT25Qcm9jZXNzZXMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcmFjdGljZUVDbGFzcywKLQkJCQlQcmFjdGljZS5jbGFzcywKLQkJCQkiUHJhY3RpY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2VzKCksCi0JCQkJdGhpcy5nZXRQcmFjdGljZSgpLAotCQkJCW51bGwsCi0JCQkJInN1YlByYWN0aWNlcyIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLAotCQkJCXRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJjb250ZW50UmVmZXJlbmNlcyIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2VzKCksCi0JCQkJdGhpcy5nZXRBY3Rpdml0eSgpLAotCQkJCW51bGwsCi0JCQkJImFjdGl2aXR5UmVmZXJlbmNlcyIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInVzYWdlR3VpZGFuY2UiLCAiIiwgMCwgMSwgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLAotCQkJCUFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsCi0JCQkJIkFjdGl2aXR5RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHVycG9zZSIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiYWx0ZXJuYXRpdmVzIiwgIiIsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3d0b1N0YWZmKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkiaG93dG9TdGFmZiIsICIiLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywKLQkJCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJzY2FsZSIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkicHJvamVjdENoYXJhY3RlcmlzdGljcyIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJyaXNrTGV2ZWwiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fRXN0aW1hdGluZ1RlY2huaXF1ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImVzdGltYXRpbmdUZWNobmlxdWUiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdE1lbWJlckV4cGVydGlzZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInByb2plY3RNZW1iZXJFeHBlcnRpc2UiLCAiIiwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ0eXBlT2ZDb250cmFjdCIsICIiLCAwLCAxLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLAotCQkJCVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywKLQkJCQkiUHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInNjb3BlIiwgIiIsIDAsIDEsIFByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInVzYWdlTm90ZXMiLCAiIiwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsCi0JCQkJRGVzY3JpcHRvckRlc2NyaXB0aW9uLmNsYXNzLAotCQkJCSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInJlZmluZWREZXNjcmlwdGlvbiIsICIiLCAwLCAxLCBEZXNjcmlwdG9yRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yRUNsYXNzLAotCQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yLmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcl9fcHJvY2Vzc0NvbXBvbmVudCgpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudCgpLAotCQkJCW51bGwsCi0JCQkJIl9wcm9jZXNzQ29tcG9uZW50IiwgbnVsbCwgMSwgMSwgUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50LmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlcygpLAotCQkJCXRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpLAotCQkJCW51bGwsCi0JCQkJImludGVyZmFjZXMiLCBudWxsLCAxLCAtMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksCi0JCQkJdGhpcy5nZXRQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2VzcyIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCXByb2Nlc3NQYWNrYWdlRUNsYXNzLAotCQkJCVByb2Nlc3NQYWNrYWdlLmNsYXNzLAotCQkJCSJQcm9jZXNzUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudHMoKSwKLQkJCQl0aGlzLmdldFByb2Nlc3NFbGVtZW50KCksCi0JCQkJbnVsbCwKLQkJCQkicHJvY2Vzc0VsZW1lbnRzIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NQYWNrYWdlX0RpYWdyYW1zKCksCi0JCQkJdGhpcy5nZXREaWFncmFtKCksCi0JCQkJbnVsbCwKLQkJCQkiZGlhZ3JhbXMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc1BhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpYWdyYW1FQ2xhc3MsCi0JCQkJRGlhZ3JhbS5jbGFzcywKLQkJCQkiRGlhZ3JhbSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtX0RpYWdyYW1MaW5rKCksCi0JCQkJdGhpcy5nZXREaWFncmFtTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmtfRGlhZ3JhbSgpLAotCQkJCSJkaWFncmFtTGluayIsIG51bGwsIDAsIC0xLCBEaWFncmFtLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtX05hbWVzcGFjZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZSgpLAotCQkJCXRoaXMuZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9EaWFncmFtKCksCi0JCQkJIm5hbWVzcGFjZSIsIG51bGwsIDEsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RGlhZ3JhbV9ab29tKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkiem9vbSIsIG51bGwsIDAsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1fVmlld3BvaW50KCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInZpZXdwb2ludCIsIG51bGwsIDEsIDEsIERpYWdyYW0uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaE5vZGVFQ2xhc3MsCi0JCQkJR3JhcGhOb2RlLmNsYXNzLAotCQkJCSJHcmFwaE5vZGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhOb2RlX1NpemUoKSwKLQkJCQl0aGlzLmdldERpbWVuc2lvbigpLAotCQkJCW51bGwsCi0JCQkJInNpemUiLCBudWxsLCAxLCAxLCBHcmFwaE5vZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaEVsZW1lbnRFQ2xhc3MsCi0JCQkJR3JhcGhFbGVtZW50LmNsYXNzLAotCQkJCSJHcmFwaEVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCksCi0JCQkJdGhpcy5nZXREaWFncmFtRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnRfQ29udGFpbmVyKCksCi0JCQkJImNvbnRhaW5lZCIsIG51bGwsIDAsIC0xLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X1Bvc2l0aW9uKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJInBvc2l0aW9uIiwgbnVsbCwgMSwgMSwgR3JhcGhFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfTGluaygpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUxpbmsoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1MaW5rX0dyYXBoRWxlbWVudCgpLAotCQkJCSJsaW5rIiwgbnVsbCwgMCwgLTEsIEdyYXBoRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRHcmFwaEVsZW1lbnRfQW5jaG9yYWdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3RvcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCksCi0JCQkJImFuY2hvcmFnZSIsIG51bGwsIDAsIC0xLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFbGVtZW50X1NlbWFudGljTW9kZWwoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2UoKSwKLQkJCQl0aGlzLmdldFNlbWFudGljTW9kZWxCcmlkZ2VfR3JhcGhFbGVtZW50KCksCi0JCQkJInNlbWFudGljTW9kZWwiLCBudWxsLCAxLCAxLCBHcmFwaEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpYWdyYW1FbGVtZW50RUNsYXNzLAotCQkJCURpYWdyYW1FbGVtZW50LmNsYXNzLAotCQkJCSJEaWFncmFtRWxlbWVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X0lzVmlzaWJsZSgpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc1Zpc2libGUiLCAidHJ1ZSIsIDEsIDEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldERpYWdyYW1FbGVtZW50X0NvbnRhaW5lcigpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfQ29udGFpbmVkKCksCi0JCQkJImNvbnRhaW5lciIsIG51bGwsIDAsIDEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9SZWZlcmVuY2UoKSwKLQkJCQl0aGlzLmdldFJlZmVyZW5jZSgpLAotCQkJCXRoaXMuZ2V0UmVmZXJlbmNlX1JlZmVyZW5jZWQoKSwKLQkJCQkicmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsIERpYWdyYW1FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtRWxlbWVudF9Qcm9wZXJ0eSgpLAotCQkJCXRoaXMuZ2V0UHJvcGVydHkoKSwKLQkJCQludWxsLAotCQkJCSJwcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBEaWFncmFtRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcmVmZXJlbmNlRUNsYXNzLAotCQkJCVJlZmVyZW5jZS5jbGFzcywKLQkJCQkiUmVmZXJlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFJlZmVyZW5jZV9Jc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbigpLAotCQkJCXRoaXMuZ2V0Qm9vbGVhbigpLAotCQkJCSJpc0luZGl2aWR1YWxSZXByZXNlbnRhdGlvbiIsICJmYWxzZSIsIDEsIDEsIFJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRSZWZlcmVuY2VfUmVmZXJlbmNlZCgpLAotCQkJCXRoaXMuZ2V0RGlhZ3JhbUVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldERpYWdyYW1FbGVtZW50X1JlZmVyZW5jZSgpLAotCQkJCSJyZWZlcmVuY2VkIiwgbnVsbCwgMSwgMSwgUmVmZXJlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvcGVydHlFQ2xhc3MsCi0JCQkJUHJvcGVydHkuY2xhc3MsCi0JCQkJIlByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFByb3BlcnR5X0tleSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJImtleSIsICIiLCAwLCAxLCBQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRQcm9wZXJ0eV9WYWx1ZSgpLAotCQkJCXRoaXMuZ2V0U3RyaW5nKCksCi0JCQkJInZhbHVlIiwgIiIsIDAsIDEsIFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwb2ludEVDbGFzcywKLQkJCQlQb2ludC5jbGFzcywKLQkJCQkiUG9pbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UG9pbnRfWCgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJIngiLCBudWxsLCAxLCAxLCBQb2ludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UG9pbnRfWSgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInkiLCBudWxsLCAxLCAxLCBQb2ludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCWRpYWdyYW1MaW5rRUNsYXNzLAotCQkJCURpYWdyYW1MaW5rLmNsYXNzLAotCQkJCSJEaWFncmFtTGluayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaWFncmFtTGlua19ab29tKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkiem9vbSIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19WaWV3cG9ydCgpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ2aWV3cG9ydCIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXREaWFncmFtTGlua19EaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtKCksCi0JCQkJdGhpcy5nZXREaWFncmFtX0RpYWdyYW1MaW5rKCksCi0JCQkJImRpYWdyYW0iLCBudWxsLCAxLCAxLCBEaWFncmFtTGluay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0RGlhZ3JhbUxpbmtfR3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9MaW5rKCksCi0JCQkJImdyYXBoRWxlbWVudCIsIG51bGwsIDEsIDEsIERpYWdyYW1MaW5rLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZ3JhcGhDb25uZWN0b3JFQ2xhc3MsCi0JCQkJR3JhcGhDb25uZWN0b3IuY2xhc3MsCi0JCQkJIkdyYXBoQ29ubmVjdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoQ29ubmVjdG9yX0dyYXBoRWRnZSgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFZGdlKCksCi0JCQkJdGhpcy5nZXRHcmFwaEVkZ2VfQW5jaG9yKCksCi0JCQkJImdyYXBoRWRnZSIsIG51bGwsIDAsIC0xLCBHcmFwaENvbm5lY3Rvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhDb25uZWN0b3JfR3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEdyYXBoRWxlbWVudF9BbmNob3JhZ2UoKSwKLQkJCQkiZ3JhcGhFbGVtZW50IiwgbnVsbCwgMSwgMSwgR3JhcGhDb25uZWN0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlncmFwaEVkZ2VFQ2xhc3MsCi0JCQkJR3JhcGhFZGdlLmNsYXNzLAotCQkJCSJHcmFwaEVkZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0R3JhcGhFZGdlX1dheXBvaW50cygpLAotCQkJCXRoaXMuZ2V0UG9pbnQoKSwKLQkJCQludWxsLAotCQkJCSJ3YXlwb2ludHMiLCBudWxsLCAyLCAtMSwgR3JhcGhFZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEdyYXBoRWRnZV9BbmNob3IoKSwKLQkJCQl0aGlzLmdldEdyYXBoQ29ubmVjdG9yKCksCi0JCQkJdGhpcy5nZXRHcmFwaENvbm5lY3Rvcl9HcmFwaEVkZ2UoKSwKLQkJCQkiYW5jaG9yIiwgbnVsbCwgMiwgMiwgR3JhcGhFZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJc2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLAotCQkJCSJTZW1hbnRpY01vZGVsQnJpZGdlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0U2VtYW50aWNNb2RlbEJyaWRnZV9QcmVzZW50YXRpb24oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJwcmVzZW50YXRpb24iLCAiIiwgMCwgMSwgU2VtYW50aWNNb2RlbEJyaWRnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0RpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW0oKSwKLQkJCQl0aGlzLmdldERpYWdyYW1fTmFtZXNwYWNlKCksCi0JCQkJImRpYWdyYW0iLCBudWxsLCAwLCAxLCBTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRTZW1hbnRpY01vZGVsQnJpZGdlX0dyYXBoRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0R3JhcGhFbGVtZW50KCksCi0JCQkJdGhpcy5nZXRHcmFwaEVsZW1lbnRfU2VtYW50aWNNb2RlbCgpLAotCQkJCSJncmFwaEVsZW1lbnQiLCBudWxsLCAwLCAxLCBTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZGltZW5zaW9uRUNsYXNzLAotCQkJCURpbWVuc2lvbi5jbGFzcywKLQkJCQkiRGltZW5zaW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldERpbWVuc2lvbl9XaWR0aCgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJIndpZHRoIiwgbnVsbCwgMSwgMSwgRGltZW5zaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXREaW1lbnNpb25fSGVpZ2h0KCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkiaGVpZ2h0IiwgbnVsbCwgMSwgMSwgRGltZW5zaW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLAotCQkJCSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMoKSwKLQkJCQl0aGlzLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJbnVsbCwKLQkJCQkiaW50ZXJmYWNlU3BlY2lmaWNhdGlvbnMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCksCi0JCQkJdGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQludWxsLAotCQkJCSJpbnRlcmZhY2VJTyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEVDbGFzcywKLQkJCQlTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5jbGFzcywKLQkJCQkiU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0U2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnRfVHlwZUluZm8oKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ0eXBlSW5mbyIsICIiLCAwLCAxLCBTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdW1hU2VtYW50aWNNb2RlbEJyaWRnZUVDbGFzcywKLQkJCQlVTUFTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLAotCQkJCSJVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLAotCQkJCXRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpLAotCQkJCW51bGwsCi0JCQkJImVsZW1lbnQiLCBudWxsLCAxLCAxLCBVTUFTZW1hbnRpY01vZGVsQnJpZGdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJY29yZVNlbWFudGljTW9kZWxCcmlkZ2VFQ2xhc3MsCi0JCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsCi0JCQkJIkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldENvcmVTZW1hbnRpY01vZGVsQnJpZGdlX0VsZW1lbnQoKSwKLQkJCQl0aGlzLmdldEVsZW1lbnQoKSwKLQkJCQludWxsLAotCQkJCSJlbGVtZW50IiwgbnVsbCwgMSwgMSwgQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlsZWFmRWxlbWVudEVDbGFzcywKLQkJCQlMZWFmRWxlbWVudC5jbGFzcywKLQkJCQkiTGVhZkVsZW1lbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJdGV4dEVsZW1lbnRFQ2xhc3MsCi0JCQkJVGV4dEVsZW1lbnQuY2xhc3MsCi0JCQkJIlRleHRFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldFRleHRFbGVtZW50X1RleHQoKSwKLQkJCQl0aGlzLmdldFN0cmluZygpLAotCQkJCSJ0ZXh0IiwgIiIsIDAsIDEsIFRleHRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlpbWFnZUVDbGFzcywKLQkJCQlJbWFnZS5jbGFzcywKLQkJCQkiSW1hZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0SW1hZ2VfVXJpKCksCi0JCQkJdGhpcy5nZXRVcmkoKSwKLQkJCQkidXJpIiwgbnVsbCwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEltYWdlX01pbWVUeXBlKCksCi0JCQkJdGhpcy5nZXRTdHJpbmcoKSwKLQkJCQkibWltZVR5cGUiLCAiIiwgMCwgMSwgSW1hZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlpbml0RUNsYXNzKAotCQkJCWdyYXBoaWNQcmltaXRpdmVFQ2xhc3MsCi0JCQkJR3JhcGhpY1ByaW1pdGl2ZS5jbGFzcywKLQkJCQkiR3JhcGhpY1ByaW1pdGl2ZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwb2x5bGluZUVDbGFzcywKLQkJCQlQb2x5bGluZS5jbGFzcywKLQkJCQkiUG9seWxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0UG9seWxpbmVfQ2xvc2VkKCksCi0JCQkJdGhpcy5nZXRCb29sZWFuKCksCi0JCQkJImNsb3NlZCIsICJ0cnVlIiwgMSwgMSwgUG9seWxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UG9seWxpbmVfV2F5cG9pbnRzKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJIndheXBvaW50cyIsIG51bGwsIDIsIC0xLCBQb2x5bGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoCi0JCQkJZWxsaXBzZUVDbGFzcywKLQkJCQlFbGxpcHNlLmNsYXNzLAotCQkJCSJFbGxpcHNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKAotCQkJCWdldEVsbGlwc2VfQ2VudGVyKCksCi0JCQkJdGhpcy5nZXRQb2ludCgpLAotCQkJCW51bGwsCi0JCQkJImNlbnRlciIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfUmFkaXVzWCgpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInJhZGl1c1giLCBudWxsLCAxLCAxLCBFbGxpcHNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZSgKLQkJCQlnZXRFbGxpcHNlX1JhZGl1c1koKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJyYWRpdXNZIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9Sb3RhdGlvbigpLAotCQkJCXRoaXMuZ2V0RG91YmxlKCksCi0JCQkJInJvdGF0aW9uIiwgbnVsbCwgMSwgMSwgRWxsaXBzZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoCi0JCQkJZ2V0RWxsaXBzZV9TdGFydEFuZ2xlKCksCi0JCQkJdGhpcy5nZXREb3VibGUoKSwKLQkJCQkic3RhcnRBbmdsZSIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKAotCQkJCWdldEVsbGlwc2VfRW5kQW5nbGUoKSwKLQkJCQl0aGlzLmdldERvdWJsZSgpLAotCQkJCSJlbmRBbmdsZSIsIG51bGwsIDEsIDEsIEVsbGlwc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcygKLQkJCQlwcm9jZXNzRmFtaWx5RUNsYXNzLAotCQkJCVByb2Nlc3NGYW1pbHkuY2xhc3MsCi0JCQkJIlByb2Nlc3NGYW1pbHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoCi0JCQkJZ2V0UHJvY2Vzc0ZhbWlseV9EZWxpdmVyeVByb2Nlc3NlcygpLAotCQkJCXRoaXMuZ2V0RGVsaXZlcnlQcm9jZXNzKCksCi0JCQkJbnVsbCwKLQkJCQkiZGVsaXZlcnlQcm9jZXNzZXMiLCBudWxsLCAwLCAtMSwgUHJvY2Vzc0ZhbWlseS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCAhSVNfT1JERVJFRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKAotCQkJCW1ldGhvZExpYnJhcnlFQ2xhc3MsCi0JCQkJTWV0aG9kTGlicmFyeS5jbGFzcywKLQkJCQkiTWV0aG9kTGlicmFyeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbnMoKSwKLQkJCQl0aGlzLmdldE1ldGhvZFBsdWdpbigpLAotCQkJCW51bGwsCi0JCQkJIm1ldGhvZFBsdWdpbnMiLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZSgKLQkJCQlnZXRNZXRob2RMaWJyYXJ5X1ByZWRlZmluZWRDb25maWd1cmF0aW9ucygpLAotCQkJCXRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLAotCQkJCW51bGwsCi0JCQkJInByZWRlZmluZWRDb25maWd1cmF0aW9ucyIsIG51bGwsIDAsIC0xLCBNZXRob2RMaWJyYXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuY2xhc3MsCi0JCQkJIlZhcmlhYmlsaXR5VHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sCi0JCQkJVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX0NPTlRSSUJVVElPTik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkxPQ0FMX1JFUExBQ0VNRU5UKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuRVhURU5EU19SRVBMQUNFUyk7Ci0KLQkJaW5pdEVFbnVtKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5jbGFzcywgIldvcmtPcmRlclR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX0ZJTklTSCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fU1RBUlQpOwotCQlhZGRFRW51bUxpdGVyYWwod29ya09yZGVyVHlwZUVFbnVtLCBXb3JrT3JkZXJUeXBlLlNUQVJUX1RPX0ZJTklTSCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCi0JCWluaXRFRGF0YVR5cGUoc3RyaW5nRURhdGFUeXBlLCBTdHJpbmcuY2xhc3MsCi0JCQkJIlN0cmluZyIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShib29sZWFuRURhdGFUeXBlLCBCb29sZWFuLmNsYXNzLAotCQkJCSJCb29sZWFuIiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKGRhdGVFRGF0YVR5cGUsIERhdGUuY2xhc3MsCi0JCQkJIkRhdGUiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUodXJpRURhdGFUeXBlLCBqYXZhLm5ldC5VUkkuY2xhc3MsCi0JCQkJIlVyaSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShzZXRFRGF0YVR5cGUsIFNldC5jbGFzcywKLQkJCQkiU2V0IiwgSVNfU0VSSUFMSVpBQkxFLCAhSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RURhdGFUeXBlKHNlcXVlbmNlRURhdGFUeXBlLCBMaXN0LmNsYXNzLAotCQkJCSJTZXF1ZW5jZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVEYXRhVHlwZShpbnRlZ2VyRURhdGFUeXBlLCBpbnQuY2xhc3MsCi0JCQkJIkludGVnZXIiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFRGF0YVR5cGUoZG91YmxlRURhdGFUeXBlLCBEb3VibGUuY2xhc3MsCi0JCQkJIkRvdWJsZSIsIElTX1NFUklBTElaQUJMRSwgIUlTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi19IC8vVW1hUGFja2FnZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVmFyaWFiaWxpdHlFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM5ZjJjOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvVmFyaWFiaWxpdHlFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5WYXJpYWJpbGl0eSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuVmFyaWFiaWxpdHlFbGVtZW50SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5WYXJpYWJpbGl0eUVsZW1lbnRJbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwKLQkJaW1wbGVtZW50cyBWYXJpYWJpbGl0eUVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmFyaWFiaWxpdHlUeXBlIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgPSBWYXJpYWJpbGl0eVR5cGUuTkE7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVmFyaWFiaWxpdHlUeXBlIHZhcmlhYmlsaXR5VHlwZSA9IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnQgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5WQVJJQUJJTElUWV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVAotCQkJCTogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUsCi0JCQkJCW9sZFZhcmlhYmlsaXR5VHlwZSwgdmFyaWFiaWxpdHlUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5RWxlbWVudCBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlpZiAodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCAhPSBudWxsCi0JCQkJJiYgKChFT2JqZWN0KSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IChJbnRlcm5hbEVPYmplY3QpIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gKFZhcmlhYmlsaXR5RWxlbWVudCkgZVJlc29sdmVQcm94eShvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWlmICh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULAotCQkJCQkJCW9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsCi0JCQkJCQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eUVsZW1lbnQgYmFzaWNHZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwKLQkJCQkJb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJCXJldHVybiBiYXNpY0dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZSgoVmFyaWFiaWxpdHlUeXBlKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgoVmFyaWFiaWxpdHlFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCXNldFZhcmlhYmlsaXR5VHlwZShWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChWYXJpYWJpbGl0eUVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZSAhPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFyaWFiaWxpdHlUeXBlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ZhcmlhYmlsaXR5RWxlbWVudEltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2NiOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1doaXRlcGFwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV2hpdGVwYXBlckltcGwgZXh0ZW5kcyBDb25jZXB0SW1wbCBpbXBsZW1lbnRzIFdoaXRlcGFwZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCX0KLQotfSAvL1doaXRlcGFwZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmFlNGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya09yZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBCcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0SXNPbmdvaW5nIDxlbT5JcyBPbmdvaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2dldElzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRMaW5rVG9QcmVkZWNlc3NvciA8ZW0+TGluayBUbyBQcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnRJbXBsCi0JCWltcGxlbWVudHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJU19SRVBFQVRBQkxFX0VERUZBVUxUID0gQm9vbGVhbi5GQUxTRTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElzUmVwZWF0YWJsZSgpIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX09OR09JTkdfRURFRkFVTFQgPSBCb29sZWFuLkZBTFNFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNPbmdvaW5nID0gSVNfT05HT0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCA9IEJvb2xlYW4uRkFMU0U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJc0V2ZW50RHJpdmVuKCkgPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUb1ByZWRlY2Vzc29yKCkgPGVtPkxpbmsgVG8gUHJlZGVjZXNzb3I8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1RvUHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxXb3JrT3JkZXI+IGxpbmtUb1ByZWRlY2Vzc29yOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19CUkVBS0RPV05fRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc1JlcGVhdGFibGUoKSB7Ci0JCXJldHVybiBpc1JlcGVhdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNSZXBlYXRhYmxlKEJvb2xlYW4gbmV3SXNSZXBlYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlID0gaXNSZXBlYXRhYmxlOwotCQlpc1JlcGVhdGFibGUgPSBuZXdJc1JlcGVhdGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSwKLQkJCQkJb2xkSXNSZXBlYXRhYmxlLCBpc1JlcGVhdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbmdvaW5nKEJvb2xlYW4gbmV3SXNPbmdvaW5nKSB7Ci0JCUJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlpc09uZ29pbmcgPSBuZXdJc09uZ29pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywKLQkJCQkJb2xkSXNPbmdvaW5nLCBpc09uZ29pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc0V2ZW50RHJpdmVuKEJvb2xlYW4gbmV3SXNFdmVudERyaXZlbikgewotCQlCb29sZWFuIG9sZElzRXZlbnREcml2ZW4gPSBpc0V2ZW50RHJpdmVuOwotCQlpc0V2ZW50RHJpdmVuID0gbmV3SXNFdmVudERyaXZlbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sCi0JCQkJCW9sZElzRXZlbnREcml2ZW4sIGlzRXZlbnREcml2ZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrT3JkZXI+IGdldExpbmtUb1ByZWRlY2Vzc29yKCkgewotCQlpZiAobGlua1RvUHJlZGVjZXNzb3IgPT0gbnVsbCkgewotCQkJbGlua1RvUHJlZGVjZXNzb3IgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtPcmRlcj4oCi0JCQkJCVdvcmtPcmRlci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SKTsKLQkJfQotCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXJldHVybiBnZXRJc1JlcGVhdGFibGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlyZXR1cm4gZ2V0SXNPbmdvaW5nKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gZ2V0SXNFdmVudERyaXZlbigpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTElOS19UT19QUkVERUNFU1NPUjoKLQkJCXJldHVybiBnZXRMaW5rVG9QcmVkZWNlc3NvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJc2V0SXNSZXBlYXRhYmxlKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJc2V0SXNPbmdvaW5nKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5hZGRBbGwoCi0JCQkJCShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrT3JkZXI+KSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCXNldElzUmVwZWF0YWJsZShJU19SRVBFQVRBQkxFX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQlzZXRJc09uZ29pbmcoSVNfT05HT0lOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlzZXRJc0V2ZW50RHJpdmVuKElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19MSU5LX1RPX1BSRURFQ0VTU09SOgotCQkJZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJcmV0dXJuIElTX1JFUEVBVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGlzUmVwZWF0YWJsZSAhPSBudWxsCi0JCQkJCTogIUlTX1JFUEVBVEFCTEVfRURFRkFVTFQuZXF1YWxzKGlzUmVwZWF0YWJsZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOgotCQkJcmV0dXJuIElTX09OR09JTkdfRURFRkFVTFQgPT0gbnVsbCA/IGlzT25nb2luZyAhPSBudWxsCi0JCQkJCTogIUlTX09OR09JTkdfRURFRkFVTFQuZXF1YWxzKGlzT25nb2luZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU46Ci0JCQlyZXR1cm4gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUID09IG51bGwgPyBpc0V2ZW50RHJpdmVuICE9IG51bGwKLQkJCQkJOiAhSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxULmVxdWFscyhpc0V2ZW50RHJpdmVuKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0xJTktfVE9fUFJFREVDRVNTT1I6Ci0JCQlyZXR1cm4gbGlua1RvUHJlZGVjZXNzb3IgIT0gbnVsbCAmJiAhbGlua1RvUHJlZGVjZXNzb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzUmVwZWF0YWJsZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc1JlcGVhdGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT25nb2luZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpc09uZ29pbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRXZlbnREcml2ZW46ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoaXNFdmVudERyaXZlbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtCcmVha2Rvd25FbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NjNjE1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBEZWZpbml0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBXb3JrRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtEZWZpbml0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENvbnN0cmFpbnQgcHJlY29uZGl0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludCBwb3N0Y29uZGl0aW9uOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtEZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19ERUZJTklUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFByZWNvbmRpdGlvbigpIHsKLQkJaWYgKHByZWNvbmRpdGlvbiAhPSBudWxsICYmICgoRU9iamVjdCkgcHJlY29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlY29uZGl0aW9uID0gKEludGVybmFsRU9iamVjdCkgcHJlY29uZGl0aW9uOwotCQkJcHJlY29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUHJlY29uZGl0aW9uKTsKLQkJCWlmIChwcmVjb25kaXRpb24gIT0gb2xkUHJlY29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1ByZWNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHByZWNvbmRpdGlvbjsKLQkJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gb2xkUHJlY29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG51bGwpOwotCQkJCWlmIChuZXdQcmVjb25kaXRpb24uZUludGVybmFsQ29udGFpbmVyKCkgPT0gbnVsbCkgewotCQkJCQltc2dzID0gbmV3UHJlY29uZGl0aW9uLmVJbnZlcnNlQWRkKHRoaXMsCi0JCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLAotCQkJCQkJCW9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uc3RyYWludCBiYXNpY0dldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVjb25kaXRpb24oQ29uc3RyYWludCBuZXdQcmVjb25kaXRpb24sCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnN0cmFpbnQgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCW9sZFByZWNvbmRpdGlvbiwgbmV3UHJlY29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWNvbmRpdGlvbihDb25zdHJhaW50IG5ld1ByZWNvbmRpdGlvbikgewotCQlpZiAobmV3UHJlY29uZGl0aW9uICE9IHByZWNvbmRpdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlY29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwcmVjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTiwKLQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZWNvbmRpdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3UHJlY29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZWNvbmRpdGlvbihuZXdQcmVjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OLCBuZXdQcmVjb25kaXRpb24sCi0JCQkJCW5ld1ByZWNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCWlmIChwb3N0Y29uZGl0aW9uICE9IG51bGwgJiYgKChFT2JqZWN0KSBwb3N0Y29uZGl0aW9uKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUG9zdGNvbmRpdGlvbiA9IChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb247Ci0JCQlwb3N0Y29uZGl0aW9uID0gKENvbnN0cmFpbnQpIGVSZXNvbHZlUHJveHkob2xkUG9zdGNvbmRpdGlvbik7Ci0JCQlpZiAocG9zdGNvbmRpdGlvbiAhPSBvbGRQb3N0Y29uZGl0aW9uKSB7Ci0JCQkJSW50ZXJuYWxFT2JqZWN0IG5ld1Bvc3Rjb25kaXRpb24gPSAoSW50ZXJuYWxFT2JqZWN0KSBwb3N0Y29uZGl0aW9uOwotCQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBvbGRQb3N0Y29uZGl0aW9uLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBudWxsKTsKLQkJCQlpZiAobmV3UG9zdGNvbmRpdGlvbi5lSW50ZXJuYWxDb250YWluZXIoKSA9PSBudWxsKSB7Ci0JCQkJCW1zZ3MgPSBuZXdQb3N0Y29uZGl0aW9uCi0JCQkJCQkJLmVJbnZlcnNlQWRkKAotCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCUVPUFBPU0lURV9GRUFUVVJFX0JBU0UKLQkJCQkJCQkJCQkJLSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQkJCW51bGwsIG1zZ3MpOwotCQkJCX0KLQkJCQlpZiAobXNncyAhPSBudWxsKQotCQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwKLQkJCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBvc3Rjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnN0cmFpbnQgYmFzaWNHZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKENvbnN0cmFpbnQgbmV3UG9zdGNvbmRpdGlvbiwKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJQ29uc3RyYWludCBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQlvbGRQb3N0Y29uZGl0aW9uLCBuZXdQb3N0Y29uZGl0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5vdGlmaWNhdGlvbjsKLQkJCWVsc2UKLQkJCQltc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oQ29uc3RyYWludCBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IHBvc3Rjb25kaXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3Rjb25kaXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIHBvc3Rjb25kaXRpb24pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsCi0JCQkJCQlFT1BQT1NJVEVfRkVBVFVSRV9CQVNFCi0JCQkJCQkJCS0gVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04sCi0JCQkJCQludWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0Y29uZGl0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdQb3N0Y29uZGl0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLAotCQkJCQkJRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRQotCQkJCQkJCQktIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLAotCQkJCQkJbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0Y29uZGl0aW9uKG5ld1Bvc3Rjb25kaXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0gZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiwKLQkJCQkJbmV3UG9zdGNvbmRpdGlvbiwgbmV3UG9zdGNvbmRpdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFByZWNvbmRpdGlvbihudWxsLCBtc2dzKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBiYXNpY1NldFBvc3Rjb25kaXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UHJlY29uZGl0aW9uKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQlpZiAocmVzb2x2ZSkKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJcmV0dXJuIGJhc2ljR2V0UG9zdGNvbmRpdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXNldFByZWNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJc2V0UG9zdGNvbmRpdGlvbigoQ29uc3RyYWludCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJc2V0UHJlY29uZGl0aW9uKChDb25zdHJhaW50KSBudWxsKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXNldFBvc3Rjb25kaXRpb24oKENvbnN0cmFpbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCXJldHVybiBwcmVjb25kaXRpb24gIT0gbnVsbDsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCXJldHVybiBwb3N0Y29uZGl0aW9uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtEZWZpbml0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMmE1YjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtPcmRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXJUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBPcmRlcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtPcmRlckltcGwjZ2V0UHJlZCA8ZW0+UHJlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtPcmRlckltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrT3JkZXIgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZSBMSU5LX1RZUEVfRURFRkFVTFQgPSBXb3JrT3JkZXJUeXBlLkZJTklTSF9UT19TVEFSVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExpbmtUeXBlKCkgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJUeXBlIGxpbmtUeXBlID0gTElOS19UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZCgpIDxlbT5QcmVkPC9lbT59JyByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnQgcHJlZDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrT3JkZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX09SREVSOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGdldExpbmtUeXBlKCkgewotCQlyZXR1cm4gbGlua1R5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlua1R5cGUoV29ya09yZGVyVHlwZSBuZXdMaW5rVHlwZSkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWxpbmtUeXBlID0gbmV3TGlua1R5cGUgPT0gbnVsbCA/IExJTktfVFlQRV9FREVGQVVMVCA6IG5ld0xpbmtUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRSwgb2xkTGlua1R5cGUsIGxpbmtUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGdldFByZWQoKSB7Ci0JCWlmIChwcmVkICE9IG51bGwgJiYgKChFT2JqZWN0KSBwcmVkKS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJlZCA9IChJbnRlcm5hbEVPYmplY3QpIHByZWQ7Ci0JCQlwcmVkID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSBlUmVzb2x2ZVByb3h5KG9sZFByZWQpOwotCQkJaWYgKHByZWQgIT0gb2xkUHJlZCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtCcmVha2Rvd25FbGVtZW50IGJhc2ljR2V0UHJlZCgpIHsKLQkJcmV0dXJuIHByZWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZChXb3JrQnJlYWtkb3duRWxlbWVudCBuZXdQcmVkKSB7Ci0JCVdvcmtCcmVha2Rvd25FbGVtZW50IG9sZFByZWQgPSBwcmVkOwotCQlwcmVkID0gbmV3UHJlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVELCBvbGRQcmVkLCBwcmVkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJcmV0dXJuIGdldExpbmtUeXBlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFByZWQoKTsKLQkJCXJldHVybiBiYXNpY0dldFByZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJc2V0TGlua1R5cGUoKFdvcmtPcmRlclR5cGUpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1BSRUQ6Ci0JCQlzZXRQcmVkKChXb3JrQnJlYWtkb3duRWxlbWVudCkgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCXNldExpbmtUeXBlKExJTktfVFlQRV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19QUkVEOgotCQkJc2V0UHJlZCgoV29ya0JyZWFrZG93bkVsZW1lbnQpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQlyZXR1cm4gbGlua1R5cGUgIT0gTElOS19UWVBFX0VERUZBVUxUOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fUFJFRDoKLQkJCXJldHVybiBwcmVkICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobGlua1R5cGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQobGlua1R5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrT3JkZXJJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDM2OTU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkJaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW1wYWN0T2ZOb3RIYXZpbmcgPSBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID0gIiI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIDxlbT5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwKLQkJCQkJcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiBpbXBhY3RPZk5vdEhhdmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbXBhY3RPZk5vdEhhdmluZyhTdHJpbmcgbmV3SW1wYWN0T2ZOb3RIYXZpbmcpIHsKLQkJU3RyaW5nIG9sZEltcGFjdE9mTm90SGF2aW5nID0gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWltcGFjdE9mTm90SGF2aW5nID0gbmV3SW1wYWN0T2ZOb3RIYXZpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORywKLQkJCQkJb2xkSW1wYWN0T2ZOb3RIYXZpbmcsIGltcGFjdE9mTm90SGF2aW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpIHsKLQkJcmV0dXJuIHJlYXNvbnNGb3JOb3ROZWVkaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZyBuZXdSZWFzb25zRm9yTm90TmVlZGluZykgewotCQlTdHJpbmcgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcgPSByZWFzb25zRm9yTm90TmVlZGluZzsKLQkJcmVhc29uc0Zvck5vdE5lZWRpbmcgPSBuZXdSZWFzb25zRm9yTm90TmVlZGluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwoCi0JCQkJCXRoaXMsCi0JCQkJCU5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORywKLQkJCQkJb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcsIHJlYXNvbnNGb3JOb3ROZWVkaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQlyZXR1cm4gZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlyZXR1cm4gZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJc2V0UHVycG9zZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCXNldEltcGFjdE9mTm90SGF2aW5nKElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQlzZXRSZWFzb25zRm9yTm90TmVlZGluZyhSRUFTT05TX0ZPUl9OT1RfTkVFRElOR19FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCXJldHVybiBQVVJQT1NFX0VERUZBVUxUID09IG51bGwgPyBwdXJwb3NlICE9IG51bGwKLQkJCQkJOiAhUFVSUE9TRV9FREVGQVVMVC5lcXVhbHMocHVycG9zZSk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJcmV0dXJuIElNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxUID09IG51bGwgPyBpbXBhY3RPZk5vdEhhdmluZyAhPSBudWxsCi0JCQkJCTogIUlNUEFDVF9PRl9OT1RfSEFWSU5HX0VERUZBVUxULmVxdWFscyhpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJcmV0dXJuIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID09IG51bGwgPyByZWFzb25zRm9yTm90TmVlZGluZyAhPSBudWxsCi0JCQkJCTogIVJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUCi0JCQkJCQkJLmVxdWFscyhyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHVycG9zZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdXJwb3NlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbXBhY3RPZk5vdEhhdmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChpbXBhY3RPZk5vdEhhdmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhc29uc0Zvck5vdE5lZWRpbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQocmVhc29uc0Zvck5vdE5lZWRpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ODExYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRJbXBhY3RzIDxlbT5JbXBhY3RzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXREZWxpdmVyYWJsZVBhcnRzIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwgZXh0ZW5kcyBEZXNjcmlwdG9ySW1wbCBpbXBsZW1lbnRzCi0JCVdvcmtQcm9kdWN0RGVzY3JpcHRvciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RW50cnlTdGF0ZSA9IEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGFjdGl2aXR5RXhpdFN0YXRlID0gQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdGVkQnkoKSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0ZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gaW1wYWN0ZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEltcGFjdHMoKSA8ZW0+SW1wYWN0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbXBhY3RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBpbXBhY3RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsaXZlcmFibGVQYXJ0cygpIDxlbT5EZWxpdmVyYWJsZSBQYXJ0czwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBkZWxpdmVyYWJsZVBhcnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFbnRyeVN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RW50cnlTdGF0ZShTdHJpbmcgbmV3QWN0aXZpdHlFbnRyeVN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUVudHJ5U3RhdGUgPSBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JCWFjdGl2aXR5RW50cnlTdGF0ZSA9IG5ld0FjdGl2aXR5RW50cnlTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEUsCi0JCQkJCW9sZEFjdGl2aXR5RW50cnlTdGF0ZSwgYWN0aXZpdHlFbnRyeVN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIGFjdGl2aXR5RXhpdFN0YXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2aXR5RXhpdFN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUV4aXRTdGF0ZSkgewotCQlTdHJpbmcgb2xkQWN0aXZpdHlFeGl0U3RhdGUgPSBhY3Rpdml0eUV4aXRTdGF0ZTsKLQkJYWN0aXZpdHlFeGl0U3RhdGUgPSBuZXdBY3Rpdml0eUV4aXRTdGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSwKLQkJCQkJb2xkQWN0aXZpdHlFeGl0U3RhdGUsIGFjdGl2aXR5RXhpdFN0YXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0IGdldFdvcmtQcm9kdWN0KCkgewotCQlpZiAod29ya1Byb2R1Y3QgIT0gbnVsbCAmJiAoKEVPYmplY3QpIHdvcmtQcm9kdWN0KS5lSXNQcm94eSgpKSB7Ci0JCQlJbnRlcm5hbEVPYmplY3Qgb2xkV29ya1Byb2R1Y3QgPSAoSW50ZXJuYWxFT2JqZWN0KSB3b3JrUHJvZHVjdDsKLQkJCXdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSBlUmVzb2x2ZVByb3h5KG9sZFdvcmtQcm9kdWN0KTsKLQkJCWlmICh3b3JrUHJvZHVjdCAhPSBvbGRXb3JrUHJvZHVjdCkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsCi0JCQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULAotCQkJCQkJCW9sZFdvcmtQcm9kdWN0LCB3b3JrUHJvZHVjdCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3QgYmFzaWNHZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtQcm9kdWN0KFdvcmtQcm9kdWN0IG5ld1dvcmtQcm9kdWN0KSB7Ci0JCVdvcmtQcm9kdWN0IG9sZFdvcmtQcm9kdWN0ID0gd29ya1Byb2R1Y3Q7Ci0JCXdvcmtQcm9kdWN0ID0gbmV3V29ya1Byb2R1Y3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCwKLQkJCQkJb2xkV29ya1Byb2R1Y3QsIHdvcmtQcm9kdWN0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3REZXNjcmlwdG9yPiBnZXRJbXBhY3RlZEJ5KCkgewotCQlpZiAoaW1wYWN0ZWRCeSA9PSBudWxsKSB7Ci0JCQlpbXBhY3RlZEJ5ID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0Lk1hbnlJbnZlcnNlPFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlksCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMpOwotCQl9Ci0JCXJldHVybiBpbXBhY3RlZEJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW1wYWN0cygpIHsKLQkJaWYgKGltcGFjdHMgPT0gbnVsbCkgewotCQkJaW1wYWN0cyA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdC5NYW55SW52ZXJzZTxXb3JrUHJvZHVjdERlc2NyaXB0b3I+KAotCQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQkJfQotCQlyZXR1cm4gaW1wYWN0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldERlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCWlmIChkZWxpdmVyYWJsZVBhcnRzID09IG51bGwpIHsKLQkJCWRlbGl2ZXJhYmxlUGFydHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4oCi0JCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgdGhpcywKLQkJCQkJVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMpOwotCQl9Ci0JCXJldHVybiBkZWxpdmVyYWJsZVBhcnRzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsCi0JCQlpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PEludGVybmFsRU9iamVjdD4pIChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbXBhY3RlZEJ5KCkpCi0JCQkJCS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8SW50ZXJuYWxFT2JqZWN0PikgKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdHMoKSkKLQkJCQkJLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwKLQkJCWludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pIGdldEltcGFjdGVkQnkoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsCi0JCQkJCW1zZ3MpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVFM6Ci0JCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KSBnZXRJbXBhY3RzKCkpCi0JCQkJCS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXJldHVybiBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJcmV0dXJuIGdldEFjdGl2aXR5RXhpdFN0YXRlKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJaWYgKHJlc29sdmUpCi0JCQkJcmV0dXJuIGdldFdvcmtQcm9kdWN0KCk7Ci0JCQlyZXR1cm4gYmFzaWNHZXRXb3JrUHJvZHVjdCgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuIGdldEltcGFjdGVkQnkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJcmV0dXJuIGdldEltcGFjdHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCXJldHVybiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1Q6Ci0JCQlzZXRXb3JrUHJvZHVjdCgoV29ya1Byb2R1Y3QpIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJZ2V0SW1wYWN0ZWRCeSgpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQlnZXRJbXBhY3RzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJZ2V0RGVsaXZlcmFibGVQYXJ0cygpLmNsZWFyKCk7Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKAotCQkJCQkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZShBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCXNldEFjdGl2aXR5RXhpdFN0YXRlKEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXNldFdvcmtQcm9kdWN0KChXb3JrUHJvZHVjdCkgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQlnZXRJbXBhY3RlZEJ5KCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJZ2V0SW1wYWN0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUVudHJ5U3RhdGUgIT0gbnVsbAotCQkJCQk6ICFBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFbnRyeVN0YXRlKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJcmV0dXJuIEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RXhpdFN0YXRlICE9IG51bGwKLQkJCQkJOiAhQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVC5lcXVhbHMoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCXJldHVybiB3b3JrUHJvZHVjdCAhPSBudWxsOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJcmV0dXJuIGltcGFjdGVkQnkgIT0gbnVsbCAmJiAhaW1wYWN0ZWRCeS5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCXJldHVybiBpbXBhY3RzICE9IG51bGwgJiYgIWltcGFjdHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJcmV0dXJuIGRlbGl2ZXJhYmxlUGFydHMgIT0gbnVsbCAmJiAhZGVsaXZlcmFibGVQYXJ0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWN0aXZpdHlFbnRyeVN0YXRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZpdHlFeGl0U3RhdGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoYWN0aXZpdHlFeGl0U3RhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZjAwOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0UmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RnVsZmlsbHMgPGVtPkZ1bGZpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldFJlcG9ydHMgPGVtPlJlcG9ydHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VGVtcGxhdGVzIDxlbT5UZW1wbGF0ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VG9vbE1lbnRvcnMgPGVtPlRvb2wgTWVudG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdEltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGdWxmaWxscygpIDxlbT5GdWxmaWxsczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGdWxmaWxscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEZ1bGZpbGxhYmxlRWxlbWVudD4gZnVsZmlsbHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBvcnRzKCkgPGVtPlJlcG9ydHM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFJlcG9ydD4gcmVwb3J0czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBsYXRlcygpIDxlbT5UZW1wbGF0ZXM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcGxhdGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8VGVtcGxhdGU+IHRlbXBsYXRlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRvb2xNZW50b3JzKCkgPGVtPlRvb2wgTWVudG9yczwvZW0+fScgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sTWVudG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFRvb2xNZW50b3I+IHRvb2xNZW50b3JzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RnVsZmlsbGFibGVFbGVtZW50PiBnZXRGdWxmaWxscygpIHsKLQkJaWYgKGZ1bGZpbGxzID09IG51bGwpIHsKLQkJCWZ1bGZpbGxzID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxGdWxmaWxsYWJsZUVsZW1lbnQ+KAotCQkJCQlGdWxmaWxsYWJsZUVsZW1lbnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUyk7Ci0JCX0KLQkJcmV0dXJuIGZ1bGZpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFJlcG9ydD4gZ2V0UmVwb3J0cygpIHsKLQkJaWYgKHJlcG9ydHMgPT0gbnVsbCkgewotCQkJcmVwb3J0cyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8UmVwb3J0PihSZXBvcnQuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTKTsKLQkJfQotCQlyZXR1cm4gcmVwb3J0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdDxUZW1wbGF0ZT4gZ2V0VGVtcGxhdGVzKCkgewotCQlpZiAodGVtcGxhdGVzID09IG51bGwpIHsKLQkJCXRlbXBsYXRlcyA9IG5ldyBFT2JqZWN0UmVzb2x2aW5nRUxpc3Q8VGVtcGxhdGU+KFRlbXBsYXRlLmNsYXNzLAotCQkJCQl0aGlzLCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEVTKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMaXN0PFRvb2xNZW50b3I+IGdldFRvb2xNZW50b3JzKCkgewotCQlpZiAodG9vbE1lbnRvcnMgPT0gbnVsbCkgewotCQkJdG9vbE1lbnRvcnMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFRvb2xNZW50b3I+KAotCQkJCQlUb29sTWVudG9yLmNsYXNzLCB0aGlzLAotCQkJCQlVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTKTsKLQkJfQotCQlyZXR1cm4gdG9vbE1lbnRvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCWlmIChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPT0gbnVsbCkgewotCQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zID0gbmV3IEVPYmplY3RSZXNvbHZpbmdFTGlzdDxFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM+KAotCQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJfQotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZ2V0RnVsZmlsbHMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUzoKLQkJCXJldHVybiBnZXRSZXBvcnRzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCXJldHVybiBnZXRUZW1wbGF0ZXMoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIGdldFRvb2xNZW50b3JzKCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlnZXRGdWxmaWxscygpLmNsZWFyKCk7Ci0JCQlnZXRGdWxmaWxscygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEZ1bGZpbGxhYmxlRWxlbWVudD4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUUzoKLQkJCWdldFJlcG9ydHMoKS5jbGVhcigpOwotCQkJZ2V0UmVwb3J0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUmVwb3J0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19URU1QTEFURVM6Ci0JCQlnZXRUZW1wbGF0ZXMoKS5jbGVhcigpOwotCQkJZ2V0VGVtcGxhdGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUZW1wbGF0ZT4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJZ2V0VG9vbE1lbnRvcnMoKS5jbGVhcigpOwotCQkJZ2V0VG9vbE1lbnRvcnMoKQotCQkJCQkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUb29sTWVudG9yPikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucz4pIG5ld1ZhbHVlKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOgotCQkJZ2V0RnVsZmlsbHMoKS5jbGVhcigpOwotCQkJcmV0dXJuOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJZ2V0UmVwb3J0cygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCWdldFRlbXBsYXRlcygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SUzoKLQkJCWdldFRvb2xNZW50b3JzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRlVMRklMTFM6Ci0JCQlyZXR1cm4gZnVsZmlsbHMgIT0gbnVsbCAmJiAhZnVsZmlsbHMuaXNFbXB0eSgpOwotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlRTOgotCQkJcmV0dXJuIHJlcG9ydHMgIT0gbnVsbCAmJiAhcmVwb3J0cy5pc0VtcHR5KCk7Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFUzoKLQkJCXJldHVybiB0ZW1wbGF0ZXMgIT0gbnVsbCAmJiAhdGVtcGxhdGVzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1JTOgotCQkJcmV0dXJuIHRvb2xNZW50b3JzICE9IG51bGwgJiYgIXRvb2xNZW50b3JzLmlzRW1wdHkoKTsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgIT0gbnVsbAotCQkJCQkmJiAhZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykgewotCQlpZiAoYmFzZUNsYXNzID09IEZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcykgewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRnVsZmlsbGFibGVFbGVtZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5GVUxGSUxMQUJMRV9FTEVNRU5UX19GVUxGSUxMUzoKLQkJCQlyZXR1cm4gVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0ZVTEZJTExTOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0SW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9Xb3JrUHJvZHVjdFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTRmM2IuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsI2dldFdvcmtQcm9kdWN0cyA8ZW0+V29yayBQcm9kdWN0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMKLQkJV29ya1Byb2R1Y3RUeXBlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0cygpIDxlbT5Xb3JrIFByb2R1Y3RzPC9lbT59JyByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFdvcmtQcm9kdWN0PiB3b3JrUHJvZHVjdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3RUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3Q8V29ya1Byb2R1Y3Q+IGdldFdvcmtQcm9kdWN0cygpIHsKLQkJaWYgKHdvcmtQcm9kdWN0cyA9PSBudWxsKSB7Ci0JCQl3b3JrUHJvZHVjdHMgPSBuZXcgRU9iamVjdFJlc29sdmluZ0VMaXN0PFdvcmtQcm9kdWN0PigKLQkJCQkJV29ya1Byb2R1Y3QuY2xhc3MsIHRoaXMsCi0JCQkJCVVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFMpOwotCQl9Ci0JCXJldHVybiB3b3JrUHJvZHVjdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3RzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCWdldFdvcmtQcm9kdWN0cygpLmFkZEFsbCgKLQkJCQkJKENvbGxlY3Rpb248PyBleHRlbmRzIFdvcmtQcm9kdWN0PikgbmV3VmFsdWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1RTOgotCQkJZ2V0V29ya1Byb2R1Y3RzKCkuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVFM6Ci0JCQlyZXR1cm4gd29ya1Byb2R1Y3RzICE9IG51bGwgJiYgIXdvcmtQcm9kdWN0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0VHlwZUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL2ltcGwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBmYjc1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0Mzg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQXNzb2NpYXRpb25IZWxwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDc0ZWZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9Bc3NvY2lhdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyNCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQmFzaWNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVW5pcXVlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkZ1bGZpbGxhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJlcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUuaW1wbC5NdWx0aVJlc291cmNlRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciBuYXZpZ2F0aW5nIGFuZCBxdWVyeWluZyBiaWRpcmVjdGlvbmFsIGFzc29jaWF0aW9ucyBhbW9uZwotICogdGhlIG1vZGVsIG9iamVjdHMuCi0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uSGVscGVyIHsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYSB0YXNrIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVGFza19EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfRGlzY2lwbGluZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2tzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgc3BlY2lmaWMgdGFzay4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUYXNrX1Rhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlUYXNrLmNsYXNzLAotCQkJIlRhc2tfVGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZG9tYWlucyB3aGljaCBhIHdvcmsgcHJvZHVjdAotCSAqIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X0RvbWFpbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfRG9tYWlucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggcHJvZHVjZSBhIHdvcmsKLQkgKiBwcm9kdWN0IGFzIGFuIG91dHB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9PdXRwdXRGcm9tX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X091dHB1dEZyb21fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX091dHB1dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCB1c2UgYSB3b3JrCi0JICogcHJvZHVjdCBhcyBhIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0lucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdCB0eXBlcyB3aGljaCBhCi0JICogd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X1dvcmtQcm9kdWN0VHlwZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3QuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3RfV29ya1Byb2R1Y3RUeXBlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcmVzcG9uc2libGUgcm9sZXMgZm9yIGEgd29yawotCSAqIHByb2R1Y3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZXMgd2hpY2ggYSB3b3JrCi0JICogcHJvZHVjdCBpcyBjb250YWluZWQgaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X0RlbGl2ZXJhYmxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB0aGF0IHVzZSBhIHdvcmsgcHJvZHVjdAotCSAqIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0X09wdGlvbmFsSW5wdXRUb19UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdC5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdF9PcHRpb25hbElucHV0VG9fVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0IGRlc2NyaXB0b3JzCi0JICogd2hpY2ggYXJlIGNyZWF0ZWQgZnJvbSBhIHdvcmsgcHJvZHVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdERlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0LmNsYXNzLAotCQkJIldvcmtQcm9kdWN0X1dvcmtQcm9kdWN0RGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByaW1hcnkgdGFza3Mgb2YgYSByb2xlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVfUHJpbWFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUHJpbWFyeV9UYXNrcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc2Vjb25kYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1NlY29uZGFyeV9UYXNrcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfU2Vjb25kYXJ5X1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldHMgd2hpY2ggYSByb2xlIGlzCi0JICogY2F0ZWdvcml6ZWQgdW5kZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZV9Sb2xlU2V0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZVNldHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbXBvc2l0ZSByb2xlcyB3aGljaAotCSAqIGluY2x1ZGVzIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX0NvbXBvc2l0ZVJvbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGUuY2xhc3MsCi0JCQkiUm9sZV9Db21wb3NpdGVSb2xlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlCi0JICogY3JlYXRlZCBmcm9tIGEgcm9sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSb2xlX1JvbGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlLmNsYXNzLAotCQkJIlJvbGVfUm9sZURlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogY2hlY2tsaXN0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNoZWNrbGlzdC5jbGFzcywKLQkJCSJDaGVja2xpc3RfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgY2hlY2tsaXN0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENoZWNrbGlzdF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDaGVja2xpc3QuY2xhc3MsCi0JCQkiQ2hlY2tsaXN0X0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3RzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBjb25jZXB0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbmNlcHRfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJDb25jZXB0X0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0cygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhbiBleGFtcGxlIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEV4YW1wbGVfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ29uY2VwdC5jbGFzcywKLQkJCSJFeGFtcGxlX0JyZWFrZG93bkVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlcygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWN0aXZpdGllcyB3aGljaCBhIFJldXNhYmxlQXNzZXQgaXMKLQkgKiBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUmV1c2FibGVBc3NldF9CcmVha2Rvd25FbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb25jZXB0LmNsYXNzLAotCQkJIlJldXNhYmxlQXNzZXRfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXRzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIGNvbmNlcHQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbmNlcHRfQ29udGVudEVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUNvbmNlcHQuY2xhc3MsCi0JCQkiQ29uY2VwdF9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0c0FuZFBhcGVycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGFuCi0JICogZXhhbXBsZSBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRXhhbXBsZV9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJRXhhbXBsZS5jbGFzcywKLQkJCSJFeGFtcGxlX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0V4YW1wbGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIHJlcG9ydCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUmVwb3J0X1dvcmtQcm9kdWN0cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSZXBvcnQuY2xhc3MsCi0JCQkiUmVwb3J0X1dvcmtQcm9kdWN0cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X1JlcG9ydHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFza3Mgd2hpY2ggYQotCSAqIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zX1Rhc2tzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfVGFza3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgd29yayBwcm9kdWN0cyB3aGljaCBhCi0JICogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJlcG9ydC5jbGFzcywKLQkJCSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGNvbnRlbnQgZWxlbWVudHMgd2hpY2ggYQotCSAqIHJldXNhYmxlIGFzc2V0IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBSZXVzYWJsZUFzc2V0X0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSZXVzYWJsZUFzc2V0LmNsYXNzLAotCQkJIlJldXNhYmxlQXNzZXRfQ29udGVudEVsZW1lbnRzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfQXNzZXRzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSByb2FkbWFwIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvYWRtYXBfQWN0aXZpdGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvYWRtYXAuY2xhc3MsCi0JCQkiUm9hZG1hcF9BY3Rpdml0ZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Sb2FkbWFwcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBmdWxmaWxscyBlbGVtZW50cyB3aGljaCBhIHdvcmtwcm9kdWN0IGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEZ1bEZpbGxzX0Z1bGxGaWxsYWJsZUVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUZ1bGZpbGxhYmxlRWxlbWVudC5jbGFzcywKLQkJCSJGdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEZ1bGZpbGxhYmxlRWxlbWVudF9GdWxmaWxscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBhY3Rpdml0aWVzIHdoaWNoIGEgc3VwcG9ydGluZwotCSAqIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQnJlYWtkb3duRWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU3VwcG9ydGluZ01hdGVyaWFsLmNsYXNzLAotCQkJIlN1cHBvcnRpbmdNYXRlcmlhbF9CcmVha2Rvd25FbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFscygpLCB0cnVlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY29udGVudCBlbGVtZW50cyB3aGljaCBhCi0JICogc3VwcG9ydGluZyBtYXRlcmlhbCBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbnRlbnRFbGVtZW50cyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVsaXZlcnkgcHJvY2Vzc2VzIHdoaWNoIGEKLQkgKiBjb21tdW5pY2F0aW9uIHN1cHBvcnRpbmcgbWF0ZXJpYWwgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1cHBvcnRpbmdNYXRlcmlhbF9Db21tdW5pY2F0aW9uc19EZWxpdmVyeVByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlTdXBwb3J0aW5nTWF0ZXJpYWwuY2xhc3MsCi0JCQkiU3VwcG9ydGluZ01hdGVyaWFsX0NvbW11bmljYXRpb25zX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0NvbW11bmljYXRpb25zTWF0ZXJpYWxzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRlbGl2ZXJ5IHByb2Nlc3NlcyB3aGljaCBhbgotCSAqIGVkdWNhdGlvbiBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfRWR1Y2F0aW9uX0RlbGl2ZXJ5UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFscygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgdW5pdHMgd2hpY2ggYQotCSAqIGNvcHlyaWdodCBzdXBwb3J0aW5nIG1hdGVyaWFsIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFVuaXRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywKLQkJCSJTdXBwb3J0aW5nTWF0ZXJpYWxfQ29weXJpZ2h0U3RhdGVtZW50X01ldGhvZFBsdWdpbnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NvcHlyaWdodFN0YXRlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IGVsZW1lbnRzIHdoaWNoIGEKLQkgKiBndWlkZWxpbmUgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEd1aWRlbGluZV9Db250ZW50RWxlbWVudHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJR3VpZGVsaW5lLmNsYXNzLAotCQkJIkd1aWRlbGluZV9Db250ZW50RWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdGl2aXRpZXMgd2hpY2ggYSBndWlkZWxpbmUKLQkgKiBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgR3VpZGVsaW5lX0JyZWFrZG93bkVsZW1lbnRzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUd1aWRlbGluZS5jbGFzcywKLQkJCSJHdWlkZWxpbmVfQnJlYWtkb3duRWxlbWVudHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZXMoKSwgdHJ1ZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHdvcmsgcHJvZHVjdHMgd2hpY2ggYQotCSAqIHRlbXBsYXRlIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBUZW1wbGF0ZV9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkiVGVtcGxhdGVfV29ya1Byb2R1Y3RzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRvb2wgd2hpY2ggYSB0b29sIG1lbnRvciBpcwotCSAqIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfVG9vbHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rvb2xzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrcyB3aGljaCBhIHRvb2wgbWVudG9yIGlzCi0JICogYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFRvb2xNZW50b3JfVGFza3MgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVG9vbE1lbnRvci5jbGFzcywKLQkJCSJUb29sTWVudG9yX1Rhc2tzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB3b3JrIHByb2R1Y3RzIHdoaWNoIGEgdG9vbAotCSAqIG1lbnRvciBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVGVtcGxhdGUuY2xhc3MsCi0JCQkiVG9vbE1lbnRvcl9Xb3JrUHJvZHVjdHMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9ycygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAkKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgY3VzdG9tIGNhdGVnb3JpZXMgd2hpY2ggYQotCSAqIGRlc2NyaWJhYmxlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIERlc2NyaWJhYmxlRWxlbWVudF9DdXN0b21DYXRlZ29yaWVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9DdXN0b21DYXRlZ29yaWVzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmFjdGljZXMgcmVmZXJlbmNlZCBieSBhCi0JICogY29udGVudCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDb250ZW50RWxlbWVudC5jbGFzcywKLQkJCSJDb250ZW50RWxlbWVudF9QcmFjdGljZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBtZXRob2QgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieQotCSAqIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9EaXJlY3RFeHRlbnNpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX0Jhc2VzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBtZXRob2QgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RQbHVnaW5fTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGx1Z2luLmNsYXNzLAotCQkJIk1ldGhvZFBsdWdpbl9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBwYWNrYWdlcwotCSAqIHVzZWQvcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RQYWNrYWdlLmNsYXNzLAotCQkJIk1ldGhvZFBhY2thZ2VfVXNpbmdQYWNrYWdlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgbWV0aG9kIGNvbmZpZ3VyYXRpb25zIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIG1ldGhvZCBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZFBhY2thZ2VfTWV0aG9kQ29uZmlndXJhdGlvbnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJTWV0aG9kUGFja2FnZS5jbGFzcywKLQkJCSJNZXRob2RQYWNrYWdlX01ldGhvZENvbmZpZ3VyYXRpb25zIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIG1ldGhvZCBjb25maWd1cmF0aW9ucyB3aGljaAotCSAqIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBDdXN0b21DYXRlZ29yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlDdXN0b21DYXRlZ29yeS5jbGFzcywKLQkJCSJDdXN0b21DYXRlZ29yeV9NZXRob2RDb25maWd1cmF0aW9ucyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fUHJvY2Vzc1ZpZXdzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmUgZ3JvdXBpbmdzIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCURpc2NpcGxpbmUuY2xhc3MsCi0JCQkiRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmVzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGRpc2NpcGxpbmVzIHdoaWNoCi0JICogY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUgKGllLCBhIHN1YmRpc2NpcGxpbmUpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlEaXNjaXBsaW5lLmNsYXNzLAotCQkJIlN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfU3ViZGlzY2lwbGluZSgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSByb2xlIHNldCBncm91cGluZ3Mgd2hpY2gKLQkgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgcm9sZSBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZVNldF9Sb2xlU2V0R3JvdXBwaW5ncyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlU2V0LmNsYXNzLAotCQkJIlJvbGVTZXRfUm9sZVNldEdyb3VwcGluZ3MiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldHMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgc3VjY2Vzc29yIG9mIGEgd29yayBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrT3JkZXJfU3VjY2Vzc29yID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtPcmRlci5jbGFzcywKLQkJCSJXb3JrT3JkZXJfU3VjY2Vzc29yIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvUHJlZGVjZXNzb3IoKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHN1Y2Nlc3NvciBsaW5rIG9mIGEgd29yawotCSAqIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtCcmVha2Rvd25FbGVtZW50X0xpbmtUb1N1Y2Nlc3NvciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywKLQkJCSJXb3JrQnJlYWtkb3duRWxlbWVudF9MaW5rVG9TdWNjZXNzb3IiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfUHJlZCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBpbW1lZGlhdGUgdmFyaWF0aWVzIG9mIGEKLQkgKiB2YXJpYWJpbGl0eSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJVmFyaWFiaWxpdHlFbGVtZW50LmNsYXNzLAotCQkJIlZhcmlhYmlsaXR5RWxlbWVudF9JbW1lZGlhdGVWYXJpZXRpZXMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eUVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBzdWNjZXNzb3JzIHRvIGEgc2VjdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBTZWN0aW9uX1N1Y2Nlc3NvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJU2VjdGlvbi5jbGFzcywKLQkJCSJTZWN0aW9uX1N1Y2Nlc3NvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggYQotCSAqIHNlY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFNlY3Rpb25fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVNlY3Rpb24uY2xhc3MsCi0JCQkiU2VjdGlvbl9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9TZWxlY3RlZFN0ZXBzKCksIHRydWUsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzCi0JICogYSBzcGVjaWZpYyByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfVGVhbVByb2ZpbGVzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVJvbGVEZXNjcmlwdG9yLmNsYXNzLAotCQkJIlJvbGVEZXNjcmlwdG9yX1RlYW1Qcm9maWxlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRlYW1Qcm9maWxlX1RlYW1Sb2xlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcmltYXJ5IHRhc2sgZGVzY3JpcHRvcnMKLQkgKiBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUm9sZURlc2NyaXB0b3JfUHJpbWFyeVRhc2tEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlSb2xlRGVzY3JpcHRvci5jbGFzcywKLQkJCSJSb2xlRGVzY3JpcHRvcl9QcmltYXJ5VGFza0Rlc2NyaXB0b3JzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgYWRkaXRpb25hbCB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0FkZGl0aW9uYWxUYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFzc2lzdGluZyB0YXNrIGRlc2NyaXB0b3JzCi0JICogcGVyZm9ybWVkIGJ5IGEgcm9sZSBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFJvbGVEZXNjcmlwdG9yX0Fzc2lzdHNJbl9UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUm9sZURlc2NyaXB0b3IuY2xhc3MsCi0JCQkiUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcwotCSAqIHJlZmVyZW5jZWQgaW4gYSBtZXRob2QgY29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBNZXRob2RDb25maWd1cmF0aW9uX0RlcGVuZGVudFByb2Nlc3NlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLAotCQkJIk1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB2YWxpZCBwcm9jZXNzZXMgcmVmZXJlbmNlZCBpbgotCSAqIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsCi0JCQkiTWV0aG9kQ29uZmlndXJhdGlvbl9WYWxpZENvbnRleHRfUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaAotCSAqIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbiBvdXRwdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb21fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG9wdGlvbmFsIGlucHV0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywKLQkJCSJXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYQotCSAqIHdvcmsgcHJvZHVjdCBkZXNjcmlwdG9yIGFzIGFuIG1hbmRhdG9yeSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHVzZSBhCi0JICogd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4gZXh0ZXJuYWwgaW5wdXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzIiwgLy8kTk9OLU5MUy0xJAotCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpLCB0cnVlKTsKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcm9sZSBkZXNjcmlwdG9ycyB3aGljaCBhcmUKLQkgKiByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlRGVzY3JpcHRvcnMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLAotCQkJIldvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGVEZXNjcmlwdG9ycyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCksIHRydWUpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaAotCSAqIGNvbnRhaW4gYSBzcGVjaWZpYyB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsCi0JCQkiV29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlRGVzY3JpcHRvcnMiLCBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVQYXJ0cygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBkaXNjaXBsaW5lcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9EaXNjaXBsaW5lcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9EaXNjaXBsaW5lcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3dzKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIHByYWN0aWNlcyB3aGljaCBhbiBhY3Rpdml0eQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBBY3Rpdml0eV9QcmF0aWNlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlBY3Rpdml0eS5jbGFzcywKLQkJCSJBY3Rpdml0eV9QcmF0aWNlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlcygpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBwcm9jZXNzIHBsYW5uaW5nIHRlbXBsYXRlcwotCSAqIHdoaWNoIGEgcHJvY2VzcyBpcyBhc3NvY2lhdGVkIHdpdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgUHJvY2Vzc19Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJUHJvY2Vzcy5jbGFzcywKLQkJCSJQcm9jZXNzX1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlcyIsIFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0Jhc2VkT25Qcm9jZXNzZXMoKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIG9wcG9zaXRlIGZlYXR1cmUgdXNlZCBmb3IgcmV0cmlldmluZyB0aGUgcHJvY2VzZXNzIHdoaWNoIHJlZmVyZW5jZXMgYQotCSAqIGNhcGFiaWxpdHkgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9wcG9zaXRlRmVhdHVyZSBDYXBhYmlsaXR5UGF0dGVybl9Db25zdW1pbmdQcm9jZXNzZXMgPSBuZXcgT3Bwb3NpdGVGZWF0dXJlKAotCQkJQ2FwYWJpbGl0eVBhdHRlcm4uY2xhc3MsCi0JCQkiQ2FwYWJpbGl0eVBhdHRlcm5fQ29uc3VtaW5nUHJvY2Vzc2VzIiwgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm5zKCksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGJlZm9yZSBhIGJyZWFrZG93biBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlID0gbmV3IE9wcG9zaXRlRmVhdHVyZSgKLQkJCUJyZWFrZG93bkVsZW1lbnQuY2xhc3MsCi0JCQkiQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIHRydWUsCi0JCQlmYWxzZSk7Ci0KLQkvKioKLQkgKiBBbiBvcHBvc2l0ZSBmZWF0dXJlIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGJyZWFrZG93biBlbGVtZW50IHdoaWNoIGlzCi0JICogZGlzcGxheWVkIGFmdGVyIGEgYnJlYWtkb3duIGVsZW1lbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcHBvc2l0ZUZlYXR1cmUgQnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlciA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlCcmVha2Rvd25FbGVtZW50LmNsYXNzLAotCQkJIkJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIiLCAvLyROT04tTkxTLTEkCi0JCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JLyoqCi0JICogQW4gb3Bwb3NpdGUgZmVhdHVyZSB1c2VkIGZvciByZXRyaWV2aW5nIHRoZSBVTUEgc2VtYXRpYyBtb2RlbCBicmlkZ2VzCi0JICogcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3Bwb3NpdGVGZWF0dXJlIE1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyA9IG5ldyBPcHBvc2l0ZUZlYXR1cmUoCi0JCQlNZXRob2RFbGVtZW50LmNsYXNzLAotCQkJIk1ldGhvZEVsZW1lbnRfVU1BU2VtYXRpY01vZGVsQnJpZGdlcyIsIC8vJE5PTi1OTFMtMSQKLQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFVNQVNlbWFudGljTW9kZWxCcmlkZ2VfRWxlbWVudCgpLCB0cnVlLAotCQkJZmFsc2UpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IHByZWRlZmluZWRPcHBvc2l0ZUZlYXR1cmVzOwotCi0Jc3RhdGljIHsKLQkJcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOwotCX0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyB0aGUgcHJlZGVmaW5lZCBvcHBvc2l0ZSBmZWF0dXJlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpIHsKLQkJcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFzc29jaWF0aW9uSGVscGVyIG9iamVjdCA9IG5ldyBBc3NvY2lhdGlvbkhlbHBlcigpOwotCQlGaWVsZFtdIGZpZWxkcyA9IG9iamVjdC5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWVsZCBmaWVsZCA9IGZpZWxkc1tpXTsKLQkJCWludCBtb2QgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLQkJCWlmIChNb2RpZmllci5pc1B1YmxpYyhtb2QpICYmIE1vZGlmaWVyLmlzU3RhdGljKG1vZCkKLQkJCQkJJiYgTW9kaWZpZXIuaXNGaW5hbChtb2QpCi0JCQkJCSYmIGZpZWxkLmdldFR5cGUoKSA9PSBPcHBvc2l0ZUZlYXR1cmUuY2xhc3MpIHsKLQkJCQl0cnkgewotCQkJCQlwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5hZGQoZmllbGQuZ2V0KG9iamVjdCkpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogU3lzdGVtLm91dAotCQkgKiAucHJpbnRsbigiQXNzb2NpYXRpb25IZWxwZXIucmVnaXN0ZXJQcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcygpOgotCQkgKiBkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzOiAiICsgcHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMuc2l6ZSgpKTsKLQkJICogLy8kTk9OLU5MUy0xJCBTeXN0ZW0ub3V0LnByaW50bG4ocHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMpOwotCQkgKi8KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlcy5pdGVyYXRvcigpOyBpdGVyCi0JCQkJLmhhc05leHQoKTspIHsKLQkJCU9wcG9zaXRlRmVhdHVyZSBmZWF0dXJlID0gKE9wcG9zaXRlRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlPcHBvc2l0ZUZlYXR1cmUucmVnaXN0ZXJPcHBvc2l0ZUZlYXR1cmUoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmVkZWZpbmVkIG9wcG9zaXRlIGZlYXR1cmVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByZWRlZmluZWQgb3Bwb3NpdGUgZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb24gZ2V0UHJlZGVmaW5lZE9wcG9zaXRlRmVhdHVyZXMoKSB7Ci0JCXJldHVybiBwcmVkZWZpbmVkT3Bwb3NpdGVGZWF0dXJlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkZWxpdmVyYWJsZSBkZXNjcmlwdG9ycyB3aGljaCBjb250YWluIHRoZSBnaXZlbiB3b3JrIHByb2R1Y3QKLQkgKiBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgZGVsaXZlcmFibGUgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdG9ycyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfRGVsaXZlcmFibGVEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCB1c2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvciBhcyBhbgotCSAqIGV4dGVybmFsIGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cGQKLQkgKiAgICAgICAgICAgIGEgd29yayBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRFeHRlcm5hbElucHV0VG8oV29ya1Byb2R1Y3REZXNjcmlwdG9yIHdwZCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwZCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX0V4dGVybmFsSW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYQotCSAqIG1hbmRhdG9yeSBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0TWFuZGF0b3J5SW5wdXRUbyhXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUb19UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2sgZGVzY3JpcHRvcnMgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGRlc2NyaXB0b3IgYXMgYW4KLQkgKiBvcHRpb25hbCBpbnB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3B0aW9uYWxJbnB1dFRvKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cGQpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG9fVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YXNrIGRlc2NyaXB0b3JzIHdoaWNoIHdoaWNoIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgZGVzY3JpcHRvcgotCSAqIGFzIGFuIG91dHB1dC4KLQkgKiAKLQkgKiBAcGFyYW0gd3BkCi0JICogICAgICAgICAgICBhIHdvcmsgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0T3V0cHV0RnJvbShXb3JrUHJvZHVjdERlc2NyaXB0b3Igd3BkKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3BkKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbV9UYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIHJlc3BvbnNpYmxlIGZvciBhIHdvcmsgcHJvZHVjdAotCSAqIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHdwZAotCSAqICAgICAgICAgICAgYSB3b3JrIGRlc2NyaXB0b3IKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIGRlc2NyaXB0b3JzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFJlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKFdvcmtQcm9kdWN0RGVzY3JpcHRvciB3cGQpIHsKLQkJcmV0dXJuIChMaXN0KSB3cGQKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZURlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0aGUgZGVwZW5kZW50IHByb2Nlc3NlcyByZWZlcmVuY2VkIGluIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBwcm9jZXNzZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGVwZW5kZW50UHJvY2Vzc2VzKE1ldGhvZENvbmZpZ3VyYXRpb24gZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKE1ldGhvZENvbmZpZ3VyYXRpb25fRGVwZW5kZW50UHJvY2Vzc2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZWFtIHByb2ZpbGVzIHdoaWNoIGluY2x1ZGVzIGEgc3BlY2lmaWMgcm9sZSBkZXNjcmlwdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRlYW0gcHJvZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0VGVhbVByb2ZpbGVzKFJvbGVEZXNjcmlwdG9yIGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9UZWFtUHJvZmlsZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHByYWN0aWNlcyByZWZlcmVuY2VkIGJ5IGEgY29udGVudCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHByYWN0aWNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmFjdGljZXMoQ29udGVudEVsZW1lbnQgZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKENvbnRlbnRFbGVtZW50X1ByYWN0aWNlcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdG9vbCB3aGljaCBhIHRvb2wgbWVudG9yIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHRvb2wgbWVudG9yCi0JICogQHJldHVybiBhIHRvb2wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8PyBleHRlbmRzIFRvb2xNZW50b3I+IGdldFRvb2xzKFRvb2xNZW50b3IgdG9vbE1lbnRvcikgewotCQlyZXR1cm4gKExpc3Q8PyBleHRlbmRzIFRvb2xNZW50b3I+KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB0b29sTWVudG9yKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUb29sTWVudG9yX1Rvb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdWNjZXNzb3JzIHRvIGEgc2VjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBzZWN0aW9uCi0JICogQHJldHVybiBhIGxpc3Qgb2Ygc2VjdGlvbnMgdGhhdCBhcmUgcG9zdGlvbmVkIGFmdGVyIHRoZSBnaXZlbiBzZWN0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldFN1Y2Nlc3NvcnMoU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgc2VjdGlvbikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoU2VjdGlvbl9TdWNjZXNzb3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbW1lZGlhdGUgdmFyaWF0aWVzIG9mIGEgdmFyaWFiaWxpdHkgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB2YXJpYWJpbGl0eSBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgaW1tZWRpYXRlIHZhcmlhdGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRJbW1lZGlhdGVWYXJpZXRpZXMoVmFyaWFiaWxpdHlFbGVtZW50IGUpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShWYXJpYWJpbGl0eUVsZW1lbnRfSW1tZWRpYXRlVmFyaWV0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwcmltYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0UHJpbWFyeVRhc2tzKFJvbGUgcm9sZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVfUHJpbWFyeV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2Vjb25kYXJ5IHRhc2tzIG9mIGEgcm9sZS4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZQotCSAqICAgICAgICAgICAgYSByb2xlCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0U2Vjb25kYXJ5VGFza3MoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9TZWNvbmRhcnlfVGFza3MpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHN1Y2Nlc3NvciBsaW5rIG9mIGEgd29yayBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBicmVhayBkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBsaW5rcyB0byB3b3JrIGJyZWFrZG93biBlbGVtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRMaW5rVG9TdWNjZXNzb3IoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya0JyZWFrZG93bkVsZW1lbnRfTGlua1RvU3VjY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzdWNjZXNzb3Igb2YgYSB3b3JrIG9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3b3JrT3JkZXIKLQkgKiAgICAgICAgICAgIGEgd29yayBvcmRlcgotCSAqIEByZXR1cm4gYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBnZXRTdWNjZXNzb3IoV29ya09yZGVyIHdvcmtPcmRlcikgewotCQlyZXR1cm4gKFdvcmtCcmVha2Rvd25FbGVtZW50KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3b3JrT3JkZXIpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtPcmRlcl9TdWNjZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHRhc2tzIHdoaWNoIHByb2R1Y2UgYSB3b3JrIHByb2R1Y3QgYXMgYW4gb3V0cHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRPdXRwdXR0aW5nVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfT3V0cHV0RnJvbV9UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFza3Mgd2hpY2ggdXNlIGEgd29yayBwcm9kdWN0IGFzIGEgbWFuZGF0b3J5IGlucHV0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB0YXNrcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNYW5kYXRvcnlJbnB1dFRvVGFza3MoV29ya1Byb2R1Y3Qgd3ApIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSB3cCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfTWFuZGF0b3J5SW5wdXRUb19UYXNrcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcmVzcG9uc2libGUgcm9sZXMgZm9yIGEgd29yayBwcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSZXNwb25zaWJsZVJvbGVzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgd3AuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlcyk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgbGlzdCBvZiB3b3JrIHByb2R1Y3RzIGZvciB3aGljaCBnaXZlbiB3b3JrIHByb2R1Y3QgZnVsZmlsbHMuCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIHdvcmsgcHJvZHVjdAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHdvcmsgcHJvZHVjdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RnVsbEZpbGxzKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgd3AuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoRnVsRmlsbHNfRnVsbEZpbGxhYmxlRWxlbWVudHMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHdvcmsgcHJvZHVjdHMgbW9kaWZpZWQgYnkgYSByb2xlLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB3b3JrIHByb2R1Y3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldE1vZGlmaWVkV29ya1Byb2R1Y3RzKFJvbGUgcm9sZSkgewotCQlMaXN0IHBlcmZvcm1zID0gZ2V0UHJpbWFyeVRhc2tzKHJvbGUpOwotCQlMaXN0IG1vZGlmaWVzID0gbmV3IEJhc2ljRUxpc3QoKTsKLQkJaWYgKHBlcmZvcm1zICE9IG51bGwgJiYgcGVyZm9ybXMuc2l6ZSgpID4gMCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcGVyZm9ybXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJVGFzayB0YXNrID0gKFRhc2spIGkubmV4dCgpOwotCi0JCQkJLy8gZm9yIGVhY2ggdGFzaywgZ2V0IG91dHB1dCB3b3JrIHByb2R1Y3Q7Ci0JCQkJTGlzdCBvdXRwdXRXUHMgPSB0YXNrLmdldE91dHB1dCgpOwotCQkJCWlmIChvdXRwdXRXUHMgIT0gbnVsbCAmJiBvdXRwdXRXUHMuc2l6ZSgpID4gMCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0V1BzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCVdvcmtQcm9kdWN0IHdwID0gKFdvcmtQcm9kdWN0KSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAod3AgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbW9kaWZpZXMuY29udGFpbnMod3ApKSB7Ci0JCQkJCQkJCW1vZGlmaWVzLmFkZCh3cCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RpZmllczsKLQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGVzIHRoYXQgbW9kaWZ5IGEgd29yayBwcm9kdWN0LgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRNb2RpZmllZEJ5KFdvcmtQcm9kdWN0IHdwKSB7Ci0JCUxpc3Qgb3V0cHV0RnJvbSA9IEFzc29jaWF0aW9uSGVscGVyLmdldE91dHB1dHRpbmdUYXNrcyh3cCk7Ci0JCVVuaXF1ZUVMaXN0PFJvbGU+IG1vZGlmaWVzID0gbmV3IFVuaXF1ZUVMaXN0PFJvbGU+KCk7Ci0JCWlmIChvdXRwdXRGcm9tICE9IG51bGwgJiYgb3V0cHV0RnJvbS5zaXplKCkgPiAwKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gb3V0cHV0RnJvbS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJLy8JZm9yIGVhY2ggdGFzayBnZXQsIGdldCBwcmltYXJ5IHBlcmZvcm1lciByb2xlCi0JCQkJVGFzayB0YXNrID0gKFRhc2spIGl0Lm5leHQoKTsKLQkJCQltb2RpZmllcy5hZGRBbGwodGFzay5nZXRQZXJmb3JtZWRCeSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZXM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY2lwbGluZSBncm91cGluZ3Mgd2hpY2ggY29udGFpbiBhIHJlZmVyZW5jZSB0byBhIGRpc2NpcGxpbmUuCi0JICogCi0JICogQHBhcmFtIGRpc2NpcGxpbmUKLQkgKiAgICAgICAgICAgIGEgZGlzY2lwbGluZQotCSAqIEByZXR1cm4gYSBsaXN0IG9mIGRpc2NpcGxpbmUgZ3JvdXBpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERpc2NpcGxpbmVHcm91cHMoRGlzY2lwbGluZSBkaXNjaXBsaW5lKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZGlzY2lwbGluZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoRGlzY2lwbGluZV9EaXNjaXBsaW5lR3JvdXBpbmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkaXNjaXBsaW5lIHdoaWNoIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gYSBzdWJkaXNjaXBsaW5lLgotCSAqIAotCSAqIEBwYXJhbSBkaXNjaXBsaW5lCi0JICogICAgICAgICAgICBhIGRpc2NpcGxpbmUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lIGdyb3VwaW5ncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lKERpc2NpcGxpbmUgc3ViZGlzY2lwbGluZSkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHN1YmRpc2NpcGxpbmUpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFN1YmRpc2NpcGxpbmVfRGlzY2lwbGluZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZG9tYWlucyB3aGljaCBhIHdvcmsgcHJvZHVjdCBpcyBjYXRlZ29yaXplZCB1bmRlci4KLQkgKiAKLQkgKiBAcGFyYW0gd3AKLQkgKiAgICAgICAgICAgIGEgd29yayBwcm9kdWN0Ci0JICogQHJldHVybiBhIGRvbWFpbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREb21haW5zKFdvcmtQcm9kdWN0IHdwKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgd3ApCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFdvcmtQcm9kdWN0X0RvbWFpbnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHJvbGUgc2V0IGdyb3VwaW5ncyB3aGljaCBjb250YWluIGEgcmVmZXJlbmNlIHRvIGEgcm9sZSBzZXQuCi0JICogCi0JICogQHBhcmFtIHJvbGVTZXQKLQkgKiAgICAgICAgICAgIGEgcm9sZSBzZXQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIHNldCBncm91cGluZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um9sZVNldEdyb3VwcyhSb2xlU2V0IHJvbGVTZXQpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlU2V0KQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlU2V0X1JvbGVTZXRHcm91cHBpbmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSByb2xlIHNldHMgd2hpY2ggYSByb2xlIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSByb2xlCi0JICogICAgICAgICAgICBhIHJvbGUKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiByb2xlIHNldHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0Um9sZVNldHMoUm9sZSByb2xlKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZSkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZV9Sb2xlU2V0cyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdGFzayBkZXNjcmlwdG9ycyB3aGljaCBoYXZlIGJlZW4gY3JlYXRlZCBmcm9tIGEgdGFzay4KLQkgKiAKLQkgKiBAcGFyYW0gdGFzawotCSAqICAgICAgICAgICAgYSB0YXNrCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRUYXNrRGVzY3JpcHRvcnMoVGFzayB0YXNrKSB7Ci0JCXJldHVybiAoTGlzdCkgdGFzay5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShUYXNrX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzY2lwbGluZXMgd2hpY2ggYSB0YXNrIGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB0YXNrCi0JICogICAgICAgICAgICBhIHRhc2sKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBkaXNjaXBsaW5lcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXREaXNjaXBsaW5lcyhUYXNrIHRhc2spIHsKLQkJcmV0dXJuIChMaXN0KSB0YXNrLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFRhc2tfRGlzY2lwbGluZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc2NpcGxpbmVzIHdoaWNoIGFuIGFjdGl2aXR5IGlzIGFzc29jaWF0ZWQgd2l0aC4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZpdHkKLQkgKiAgICAgICAgICAgIGFuIGFjdGl2aXR5Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgZGlzY2lwbGluZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0RGlzY2lwbGluZXMoQWN0aXZpdHkgYWN0aXZpdHkpIHsKLQkJcmV0dXJuIChMaXN0KSBhY3Rpdml0eS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShBY3Rpdml0eV9EaXNjaXBsaW5lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcHJpbWFyeSB0YXNrIGRlc2NyaXB0b3JzIHBlcmZvcm1lZCBieSBhIHJvbGUgZGVzY3JpcHRvci4KLQkgKiAKLQkgKiBAcGFyYW0gcm9sZURlc2MKLQkgKiAgICAgICAgICAgIGEgcm9sZSBkZXNjcmlwdG9yCi0JICogQHJldHVybiBhIGxpc3Qgb2YgdGFzayBkZXNjcmlwdG9ycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRQcmltYXJ5VGFza0Rlc2NyaXB0b3JzKFJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjKSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgcm9sZURlc2MpCi0JCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKFJvbGVEZXNjcmlwdG9yX1ByaW1hcnlUYXNrRGVzY3JpcHRvcnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkZGl0aW9uYWwgdGFzayBkZXNjcmlwdG9ycyBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QWRkaXRpb25hbFRhc2tEZXNjcmlwdG9ycyhSb2xlRGVzY3JpcHRvciByb2xlRGVzYykgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHJvbGVEZXNjKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShSb2xlRGVzY3JpcHRvcl9BZGRpdGlvbmFsVGFza0Rlc2NyaXB0b3JzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBhc3Npc3RpbmcgdGFzayBkZXNjcmlwdG9ycyBwZXJmb3JtZWQgYnkgYSByb2xlIGRlc2NyaXB0b3IuCi0JICogCi0JICogQHBhcmFtIHJvbGVEZXNjCi0JICogICAgICAgICAgICBhIHJvbGUgZGVzY3JpcHRvcgotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRhc2sgZGVzY3JpcHRvcnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0QXNzaXN0ZWRUYXNrRGVzY3JpcHRvcnMoUm9sZURlc2NyaXB0b3Igcm9sZURlc2MpIHsKLQkJcmV0dXJuIChMaXN0KSAoKE11bHRpUmVzb3VyY2VFT2JqZWN0KSByb2xlRGVzYykKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoUm9sZURlc2NyaXB0b3JfQXNzaXN0c0luX1Rhc2tEZXNjcmlwdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgd29yayBwcm9kdWN0IHR5cGVzIHdoaWNoIGEgd29yayBwcm9kdWN0IGlzIGNhdGVnb3JpemVkIHVuZGVyLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSB3b3JrIHByb2R1Y3QKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiB3b3JrIHByb2R1Y3QgdHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgZ2V0V29ya1Byb2R1Y3RUeXBlcyhXb3JrUHJvZHVjdCB3cCkgewotCQlyZXR1cm4gKExpc3QpICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHdwKQotCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShXb3JrUHJvZHVjdF9Xb3JrUHJvZHVjdFR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjdXN0b20gY2F0ZWdvcmllcyB3aGljaCBhIGRlc2NyaWJhYmxlIGVsZW1lbnQgaXMgYXNzb2NpYXRlZAotCSAqIHdpdGguCi0JICogCi0JICogQHBhcmFtIHdwCi0JICogICAgICAgICAgICBhIGRlc2NyaWJhYmxlIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBjdXN0b20gY2F0ZWdvcmllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDdXN0b21DYXRlZ29yaWVzKERlc2NyaWJhYmxlRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoRGVzY3JpYmFibGVFbGVtZW50X0N1c3RvbUNhdGVnb3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIERlbGl2ZXJhYmxlcyB3aGljaCBhIFdvcmtQcm9kdWN0IGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLgotCSAqIAotCSAqIEBwYXJhbSB3cAotCSAqICAgICAgICAgICAgYSBXb3JrUHJvZHVjdCBlbGVtZW50Ci0JICogQHJldHVybiBhIGxpc3Qgb2YgRGVsaXZlcmFibGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IGdldERlbGl2ZXJhYmxlcyhXb3JrUHJvZHVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoTGlzdCkgKChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudCkKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoV29ya1Byb2R1Y3RfRGVsaXZlcmFibGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSBhIG1ldGhvZCBwbHVnLWluLgotCSAqIAotCSAqIEBwYXJhbSBwbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcmV0dXJuIGEgbGlzdCBvZiBtZXRob2QgcGx1Zy1pbnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8TWV0aG9kUGx1Z2luPiBnZXRQbHVnaW5EaXJlY3RFeHRlbnNpb25zKE1ldGhvZFBsdWdpbiBwbHVnaW4pIHsKLQkJcmV0dXJuIChMaXN0PE1ldGhvZFBsdWdpbj4pICgoTXVsdGlSZXNvdXJjZUVPYmplY3QpIHBsdWdpbikKLQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUoTWV0aG9kUGx1Z2luX0RpcmVjdEV4dGVuc2lvbnMpOwotCX0KLQotCS8qKgotCSAqIEdldHMgYWxsIHRoZSByZWZlcmVuY2VzIHRvIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBtZXRob2QgZWxlbWVudCByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFJlZmVyZW5jZXMoTWV0aG9kRWxlbWVudCBlbGVtZW50KSB7Ci0JCVNldCByZWZlcmVuY2VzID0gbmV3IEhhc2hTZXQoKTsKLQkJTXVsdGlSZXNvdXJjZUVPYmplY3QgZU9iaiA9IChNdWx0aVJlc291cmNlRU9iamVjdCkgZWxlbWVudDsKLQotCQlpZiAoZU9iai5iYXNpY0dldE9wcG9zaXRlRmVhdHVyZU1hcCgpID09IG51bGwpCi0JCQlyZXR1cm4gcmVmZXJlbmNlczsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJb3Bwb3NpdGVGZWF0dXJlLmdldFRhcmdldEZlYXR1cmUoKTsKLQkJCWlmIChvcHBvc2l0ZUZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCQlyZWZlcmVuY2VzLmFkZEFsbCgoQ29sbGVjdGlvbikgZU9iagotCQkJCQkJLmdldE9wcG9zaXRlRmVhdHVyZVZhbHVlKG9wcG9zaXRlRmVhdHVyZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCQkJcmVmZXJlbmNlcy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCB0aGUgcmVmZXJlbmNlcyB0byBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50Ci0JICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIG1ldGhvZCBlbGVtZW50IHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1hcDxFT2JqZWN0LCBDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4+IGdldFJlZmVyZW5jZU1hcChNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4gb2JqZWN0VG9GZWF0dXJlc01hcCA9IG5ldyBIYXNoTWFwPEVPYmplY3QsIENvbGxlY3Rpb248RVN0cnVjdHVyYWxGZWF0dXJlPj4oKTsKLQotCQlNdWx0aVJlc291cmNlRU9iamVjdCBlT2JqID0gKE11bHRpUmVzb3VyY2VFT2JqZWN0KSBlbGVtZW50OwotCi0JCWlmIChlT2JqLmJhc2ljR2V0T3Bwb3NpdGVGZWF0dXJlTWFwKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG9iamVjdFRvRmVhdHVyZXNNYXA7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlT2JqLmdldE9wcG9zaXRlRmVhdHVyZU1hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCU9wcG9zaXRlRmVhdHVyZSBvcHBvc2l0ZUZlYXR1cmUgPSAoKE9wcG9zaXRlRmVhdHVyZSkgZW50cnkuZ2V0S2V5KCkpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBvcHBvc2l0ZUZlYXR1cmUuZ2V0VGFyZ2V0RmVhdHVyZSgpOwotCQkJaWYgKG9wcG9zaXRlRmVhdHVyZS5pc01hbnkoKSkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENvbGxlY3Rpb24pIGVPYmoKLQkJCQkJCS5nZXRPcHBvc2l0ZUZlYXR1cmVWYWx1ZShvcHBvc2l0ZUZlYXR1cmUpKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkJLmhhc05leHQoKTspIHsKLQkJCQkJRU9iamVjdCBvYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlDb2xsZWN0aW9uPEVTdHJ1Y3R1cmFsRmVhdHVyZT4gZmVhdHVyZXMgPSBvYmplY3RUb0ZlYXR1cmVzTWFwCi0JCQkJCQkJLmdldChvYmplY3QpOwotCQkJCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkgewotCQkJCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PEVTdHJ1Y3R1cmFsRmVhdHVyZT4oKTsKLQkJCQkJCW9iamVjdFRvRmVhdHVyZXNNYXAucHV0KG9iamVjdCwgZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQl9Ci0JCQkJOwotCQkJfSBlbHNlIHsKLQkJCQlFT2JqZWN0IG9iamVjdCA9IChFT2JqZWN0KSBlT2JqCi0JCQkJCQkuZ2V0T3Bwb3NpdGVGZWF0dXJlVmFsdWUob3Bwb3NpdGVGZWF0dXJlKTsKLQkJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQkJQ29sbGVjdGlvbjxFU3RydWN0dXJhbEZlYXR1cmU+IGZlYXR1cmVzID0gb2JqZWN0VG9GZWF0dXJlc01hcAotCQkJCQkJCS5nZXQob2JqZWN0KTsKLQkJCQkJaWYgKGZlYXR1cmVzID09IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxFU3RydWN0dXJhbEZlYXR1cmU+KCk7Ci0JCQkJCQlvYmplY3RUb0ZlYXR1cmVzTWFwLnB1dChvYmplY3QsIGZlYXR1cmVzKTsKLQkJCQkJfQotCQkJCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9iamVjdFRvRmVhdHVyZXNNYXA7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGluaXQoKSB7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSBzZXQgb2YgZWxlbWVudHMsIHJldHVybnMgdGhlIHNldCBvZiB0aG9zZSBlbGVtZW50cyBwbHVzIGFueQotCSAqIHZhcmlhYmlsaXR5IGVsZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50U2V0Ci0JICogICAgICAgICAgICBhIHNldCBvZiBtZXRob2QgZWxlbWVudHMgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSB2YXJpYWJpbGl0eQotCSAqICAgICAgICAgICAgZWxlbWVudHMKLQkgKiBAcGFyYW0gZ2V0QmFzZXMKLQkgKiAgICAgICAgICAgIGlmIDxjb2RlPnRydWU8L2NvZGU+LCByZWN1cnNlIGludG8gdGhlIHZhcmlhYmlsaXR5IGJhc2UKLQkgKiAgICAgICAgICAgIGVsZW1lbnRzICgidXAgdGhlIHRyZWUiKQotCSAqIEBwYXJhbSBnZXRDaGlsZHJlbgotCSAqICAgICAgICAgICAgaWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJlY3Vyc2UgaW50byB0aGUgdmFyaWV0aWVzICgiZG93biB0aGUKLQkgKiAgICAgICAgICAgIHRyZWUiKQotCSAqIEByZXR1cm4gYSBjb2xsZWN0aXZlIHNldCBvZiBtZXRob2QgZWxlbWVudHMgcGx1cyB0aGUgYXNzb2NpYXRlZAotCSAqICAgICAgICAgdmFyaWFiaWxpdHkgZWxlbWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNldCBnZXRWYXJpYWJpbGl0eUVsZW1lbnRzKFNldCBlbGVtZW50U2V0LCBib29sZWFuIGdldEJhc2VzLAotCQkJYm9vbGVhbiBnZXRDaGlsZHJlbikgewotCQlpZiAoZWxlbWVudFNldCAhPSBudWxsICYmICFlbGVtZW50U2V0LmlzRW1wdHkoKSkgewotCQkJU2V0IHZhclNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlbGVtZW50U2V0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCQkJVmFyaWFiaWxpdHlFbGVtZW50IGVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSBvOwotCQkJCQlpZiAoZ2V0Q2hpbGRyZW4pCi0JCQkJCQl2YXJTZXQuYWRkQWxsKGdldEltbWVkaWF0ZVZhcmlldGllcyhlbGVtZW50KSk7Ci0JCQkJCWlmIChnZXRCYXNlcwotCQkJCQkJCSYmIGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpICE9IG51bGwpCi0JCQkJCQl2YXJTZXQuYWRkKGVsZW1lbnQuZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodmFyU2V0LmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZWxlbWVudFNldDsKLQkJCWlmIChlbGVtZW50U2V0LmNvbnRhaW5zQWxsKHZhclNldCkpCi0JCQkJcmV0dXJuIGVsZW1lbnRTZXQ7Ci0JCQllbGVtZW50U2V0LmFkZEFsbCh2YXJTZXQpOwotCQkJZWxlbWVudFNldC5hZGRBbGwoZ2V0VmFyaWFiaWxpdHlFbGVtZW50cyhlbGVtZW50U2V0LCBnZXRCYXNlcywKLQkJCQkJZ2V0Q2hpbGRyZW4pKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudFNldDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL0NvbnRlbnREZXNjcmlwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1ZTc4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsOwotCi0vKioKLSAqIE1hbmFnZXMgdGhlIGNyZWF0aW9uIG9mIGNvbnRlbnQgZGVzY3JpcHRpb25zLgotICogCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaXB0aW9uRmFjdG9yeSB7Ci0KLQkvLyBNYXBzIENvbnRlbnRFbGVtZW50IGltcGxlbWVudGF0aW9uIENsYXNzIHRvIENvbnRlbnREZXNjaXB0aW9uSW5mby4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8RUNsYXNzLCBFQ2xhc3M+IGNvbnRlbnREZXNjQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcDxFQ2xhc3MsIEVDbGFzcz4oKTsKLQotCXN0YXRpYyB7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFByYWN0aWNlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFzaygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRFeGFtcGxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEd1aWRhbmNlRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdoaXRlcGFwZXIoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Y29tZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0KLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dCgKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXREZXNjcmlwdG9yRGVzY3JpcHRpb24oKSk7Ci0KLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRBY3Rpdml0eSgpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFBoYXNlKCksCi0JCQkJVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJY29udGVudERlc2NDbGFzc01hcC5wdXQoVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKSwKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JCWNvbnRlbnREZXNjQ2xhc3NNYXAucHV0KFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpLAotCQkJCVVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkpOwotCQljb250ZW50RGVzY0NsYXNzTWFwLnB1dChVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpLCBVbWFQYWNrYWdlLmVJTlNUQU5DRQotCQkJCS5nZXRQcm9jZXNzRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFQ2xhc3MgZ2V0Q29udGVudERlc2NyaXB0aW9uVHlwZShFQ2xhc3MgZGVzY3JpYmFibGVFbGVtZW50VHlwZSkgewotCQlFQ2xhc3MgdHlwZSA9IChFQ2xhc3MpIGNvbnRlbnREZXNjQ2xhc3NNYXAuZ2V0KGRlc2NyaWJhYmxlRWxlbWVudFR5cGUpOwotCQlpZih0eXBlID09IG51bGwgJiYgVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkuaXNTdXBlclR5cGVPZihkZXNjcmliYWJsZUVsZW1lbnRUeXBlKSkgewotCQkJdHlwZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbigKLQkJCURlc2NyaWJhYmxlRWxlbWVudCBlKSB7Ci0JCUVDbGFzcyBlQ2xhc3MgPSAoRUNsYXNzKSBjb250ZW50RGVzY0NsYXNzTWFwLmdldChlLmVDbGFzcygpKTsKLQkJaWYgKGVDbGFzcyA9PSBudWxsKSB7Ci0JCQllQ2xhc3MgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfQotCQlDb250ZW50RGVzY3JpcHRpb24gY29udGVudCA9IChDb250ZW50RGVzY3JpcHRpb24pIFVtYUZhY3RvcnkuZUlOU1RBTkNFCi0JCQkJLmNyZWF0ZShlQ2xhc3MpOwotCQljb250ZW50LnNldE5hbWUoVW1hVXRpbC5jcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKGUpKTsKLQkJY29udGVudC5zZXRHdWlkKFVtYVV0aWwuZ2VuZXJhdGVHVUlEKGUuZ2V0R3VpZCgpKSk7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCBmb3IgdGhlIGdpdmVuIENvbnRlbnRFbGVtZW50IGFuZAotCSAqIHNhdmUgaXQgdG8gYSBmaWxlCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiBAcmV0dXJuCi0JICogQGRlcHJlY2F0ZWQgdXNlIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihEZXNjcmliYWJsZUVsZW1lbnQgZSkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudERlc2NyaXB0aW9uIGNyZWF0ZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RWxlbWVudCBlKSB7Ci0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogQHBhcmFtIHNhdmVDb250ZW50T25seQotCSAqIEByZXR1cm4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKERlc2NyaWJhYmxlRWxlbWVudCBlKSBpbnN0ZWFkCi0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKAotCQkJRGVzY3JpYmFibGVFbGVtZW50IGUsIGJvb2xlYW4gc2F2ZUNvbnRlbnRPbmx5KSB7Ci0JCS8vIGlmICggZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50KQotCQkvLyB7Ci0JCS8vIHJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKENvbnRlbnRFbGVtZW50KWUsIHNhdmVDb250ZW50T25seSk7Ci0JCS8vIH0KLQkJLy8JCQotCQkvLyByZXR1cm4gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKGUpOwotCi0JCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnRFbGVtZW50IGUsCi0JCQlib29sZWFuIHNhdmVDb250ZW50T25seSkgewotCQlDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKERlc2NyaWJhYmxlRWxlbWVudCkgZSk7Ci0KLQkJLy8gU2V0IGRlc2NyaXB0aW9ucyA9IChTZXQpCi0JCS8vIGNvbnRlbnREZXNjcmlwdGlvbnNNYXAuZ2V0KGRlc2NJbmZvLnBhY2thZ2VOYW1lKTsKLQkJLy8gaWYoZGVzY3JpcHRpb25zID09IG51bGwpIHsKLQkJLy8gZGVzY3JpcHRpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJLy8gY29udGVudERlc2NyaXB0aW9uc01hcC5wdXQoZGVzY0luZm8ucGFja2FnZU5hbWUsIGRlc2NyaXB0aW9ucyk7Ci0JCS8vIH0KLQkJLy8gZGVzY3JpcHRpb25zLmFkZChkZXNjcmlwdGlvbik7Ci0KLQkJLy8gc2F2aW5nIENvbnRlbnREZXNjcmlwdGlvbiByaWdodCBhZnRlciBpdHMgY3JlYXRpb24gaXQgbm8gbG9uZ2VyCi0JCS8vIG5lZWRlZCBzaW5jZSBDb250ZW50RGVzY3JpcHRpb24gaXMKLQkJLy8gbm93IGNvbnRhaW5lZCBieSBhIERlc2NyaWJhYmxlRWxlbWVudAotCQkvLwotCQkvLyBpZihsaWJQZXJzaXN0ZXIgIT0gbnVsbCkgewotCQkvLyBsaWJQZXJzaXN0ZXIuc2F2ZShlLCBkZXNjcmlwdGlvbiwgc2F2ZUNvbnRlbnRPbmx5KTsKLQkJLy8gfQotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBNYXAgZ2V0Q29udGVudERlc2NyaXB0aW9uc01hcCgpIHsKLQkvLyByZXR1cm4gY29udGVudERlc2NyaXB0aW9uc01hcDsKLQkvLyB9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzUHJlc2VudGF0aW9uKE1ldGhvZEVsZW1lbnQgZSkgewotCQlpZiAoZSBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50SW1wbCkgewotCQkJcmV0dXJuICgoQ29udGVudEVsZW1lbnRJbXBsKSBlKS5iYXNpY0dldFByZXNlbnRhdGlvbigpICE9IG51bGw7Ci0JCX0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50SW1wbCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0VsZW1lbnRJbXBsKSBlKS5iYXNpY0dldFByZXNlbnRhdGlvbigpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbkVDbGFzcyhEZXNjcmliYWJsZUVsZW1lbnQgZSkgewotCQlyZXR1cm4gKEVDbGFzcykgY29udGVudERlc2NDbGFzc01hcC5nZXQoZS5lQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIE1lc3NhZ2VEaWdlc3QgbWQ1ID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7Ci0JCVN0cmluZyBpbnB1dCA9IGFyZ3NbMF07Ci0JCS8vIGJ5dGVbXSBoYXNoID0gbWQ1LmRpZ2VzdChpbnB1dC5nZXRCeXRlcygpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJpbnB1dDogJyIgKyBpbnB1dCArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkphdmEncyBoYXNoIGNvZGU6ICIgKyBpbnB1dC5oYXNoQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImhhc2ggbGVuZ3RoOiAiICsgaGFzaC5sZW5ndGgpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImJhc2U2NCBlbmNvZGVkOiAiICsKLQkJLy8gRGF0YVZhbHVlLkJhc2U2NC5lbmNvZGUoaGFzaCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBHVUlEOiAiICsgVW1hVXRpbC5nZW5lcmF0ZUdVSUQoaW5wdXQpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvTWVzc2FnZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGE4OGJiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9NZXNzYWdlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBTaWduYWxzIHRoYXQgYSBtZXRob2QgbGlicmFyeSBwZXJzaXN0ZW5jZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VFeGNlcHRpb24gZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbiBEVU1NWV9FWENFUFRJT04gPSBuZXcgRXhjZXB0aW9uKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTA0NjgyNjU2NjgzMDEzNDMzTDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7Ci0JCXN1cGVyKG1zZywgRFVNTVlfRVhDRVBUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBhbiBlcnJvciBtZXNzYWdlCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgYW4gZXhjZXB0aW9uIG9iamVjdAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCXN1cGVyKG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzI2MWExLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLWNvcHlyaWdodD1JQk0gQ29ycG9yYXRpb24KLWVycl9jYW5ub3RNb2RpZnkwPUNhbm5vdCBtb2RpZnkgJyd7MH0nJwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYUFkYXB0ZXJGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVkMWJmYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db3JlU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRnVsZmlsbGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhDb25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTGVhZkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QaGFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVNQVNlbWFudGljTW9kZWxCcmlkZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS4qOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBVbWFQYWNrYWdlIG1vZGVsUGFja2FnZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hQWRhcHRlckZhY3RvcnkoKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyBlaXRoZXIgdGhlIG1vZGVsJ3MgcGFja2FnZSBvciBpcyBhbiBpbnN0YW5jZSBvYmplY3Qgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVtYVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9IG5ldyBVbWFTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ2xhc3NpZmllcihDbGFzc2lmaWVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNsYXNzaWZpZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVR5cGUoVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUVsZW1lbnQoRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrYWdlKG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQYWNrYWdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lc3BhY2UoTmFtZXNwYWNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU5hbWVzcGFjZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29uc3RyYWludChDb25zdHJhaW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkoTWV0aG9kRWxlbWVudFByb3BlcnR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlS2luZChLaW5kIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUtpbmRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGVudERlc2NyaXB0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFVuaXQoTWV0aG9kVW5pdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVNZXRob2RVbml0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3VpZGFuY2UoR3VpZGFuY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlY3Rpb24oU2VjdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZWN0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoVmFyaWFiaWxpdHlFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVZhcmlhYmlsaXR5RWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29uY2VwdChDb25jZXB0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUd1aWRlbGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRXhhbXBsZShFeGFtcGxlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJldXNhYmxlQXNzZXQoUmV1c2FibGVBc3NldCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oCi0JCQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm9BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUFydGlmYWN0KEFydGlmYWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRnVsZmlsbGFibGVFbGVtZW50KEZ1bGZpbGxhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVGdWxmaWxsYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVwb3J0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVG9vbE1lbnRvcihUb29sTWVudG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucygKLQkJCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEZWxpdmVyYWJsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlT3V0Y29tZShPdXRjb21lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVN0ZXAoU3RlcCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTdGVwQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrRGVmaW5pdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2soVGFzayBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYXNrQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlKFJvbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUm9sZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihBcnRpZmFjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oV29ya1Byb2R1Y3REZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZURlc2NyaXB0aW9uKFJvbGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGFza0Rlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlU2V0QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRG9tYWluKERvbWFpbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEb21haW5BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVHcm91cGluZ0FkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlzY2lwbGluZShEaXNjaXBsaW5lIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUFjdGl2aXR5KEFjdGl2aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQnJlYWtkb3duRWxlbWVudChCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlV29ya09yZGVyKFdvcmtPcmRlciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2FkbWFwQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVG9vbEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZVNldEdyb3VwaW5nKFJvbGVTZXRHcm91cGluZyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWlsZXN0b25lQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSXRlcmF0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQaGFzZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlVGVhbVByb2ZpbGUoVGVhbVByb2ZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29tcG9zaXRlUm9sZShDb21wb3NpdGVSb2xlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgKLQkJCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJhY3RpY2UoUHJhY3RpY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigKLQkJCQlCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oCi0JCQkJRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JEZXNjcmlwdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IoCi0JCQkJUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlhZ3JhbShEaWFncmFtIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoTm9kZShHcmFwaE5vZGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlR3JhcGhOb2RlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUdyYXBoRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRGlhZ3JhbUVsZW1lbnQoRGlhZ3JhbUVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRGlhZ3JhbUVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVJlZmVyZW5jZShSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUmVmZXJlbmNlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUG9pbnQoUG9pbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlUG9pbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZURpYWdyYW1MaW5rKERpYWdyYW1MaW5rIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VHcmFwaENvbm5lY3RvcihHcmFwaENvbm5lY3RvciBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaENvbm5lY3RvckFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlR3JhcGhFZGdlKEdyYXBoRWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaEVkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVNlbWFudGljTW9kZWxCcmlkZ2UoU2VtYW50aWNNb2RlbEJyaWRnZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VEaW1lbnNpb24oRGltZW5zaW9uIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURpbWVuc2lvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KAotCQkJCVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZVNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VVTUFTZW1hbnRpY01vZGVsQnJpZGdlKFVNQVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlVU1BU2VtYW50aWNNb2RlbEJyaWRnZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoCi0JCQkJQ29yZVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUxlYWZFbGVtZW50KExlYWZFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUxlYWZFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXh0RWxlbWVudChUZXh0RWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVUZXh0RWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlSW1hZ2UoSW1hZ2Ugb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlSW1hZ2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZUdyYXBoaWNQcmltaXRpdmUoR3JhcGhpY1ByaW1pdGl2ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVHcmFwaGljUHJpbWl0aXZlQWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VQb2x5bGluZShQb2x5bGluZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQb2x5bGluZUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBjYXNlRWxsaXBzZShFbGxpcHNlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVsbGlwc2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY2FzZVByb2Nlc3NGYW1pbHkoUHJvY2Vzc0ZhbWlseSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRmFtaWx5QWRhcHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kTGlicmFyeUFkYXB0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KLQkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KSB0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyIDxlbT5DbGFzc2lmaWVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2xhc3NpZmllcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDbGFzc2lmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQgPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGFja2FnZSA8ZW0+UGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lc3BhY2UgPGVtPk5hbWVzcGFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVzcGFjZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lc3BhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5LaW5kIDxlbT5LaW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVLaW5kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50IDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlNlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU2VjdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQgPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRnVsZmlsbGFibGVFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2sgPGVtPlRhc2s8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0RlZmluaXRpb24gPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtEZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN0ZXAgPGVtPlN0ZXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TdGVwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVN0ZXBBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGFuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZSA8ZW0+T3V0Y29tZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk91dGNvbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlT3V0Y29tZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiA8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGFuY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eSA8ZW0+QWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUGhhc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGhhc2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVhbVByb2ZpbGUgPGVtPlRlYW0gUHJvZmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlYW1Qcm9maWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVEZXNjcmlwdG9yIDxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya09yZGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUGxhbm5pbmdEYXRhQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3IgPGVtPkRlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVGFza0Rlc2NyaXB0b3IgPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRhc2tEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb21wb3NpdGVSb2xlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25jZXB0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3VpZGVsaW5lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUmVwb3J0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlRlbXBsYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRlbXBsYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sTWVudG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLldoaXRlcGFwZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV2hpdGVwYXBlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGVybURlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm9BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50Q2F0ZWdvcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudENhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbiA8ZW0+RG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURvbWFpbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3RUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2wgPGVtPlRvb2w8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nIDxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXRHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2FkbWFwQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIDxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IgPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGx1Z2luQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLlZhcmlhYmlsaXR5RWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVWYXJpYWJpbGl0eUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kVW5pdCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0ZhbWlseSA8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRmFtaWx5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NGYW1pbHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQgPGVtPlBvaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9pbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50IDxlbT5HcmFwaCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtRWxlbWVudCA8ZW0+RGlhZ3JhbSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlhZ3JhbUVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUxpbmsgPGVtPkRpYWdyYW0gTGluazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW1MaW5rCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1MaW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoQ29ubmVjdG9yIDxlbT5HcmFwaCBDb25uZWN0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHcmFwaENvbm5lY3RvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlbWFudGljTW9kZWxCcmlkZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRGltZW5zaW9uIDxlbT5EaW1lbnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaW1lbnNpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGltZW5zaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLlJlZmVyZW5jZSA8ZW0+UmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUmVmZXJlbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlZmVyZW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eSA8ZW0+UHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9wZXJ0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9wZXJ0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UgPGVtPkdyYXBoIEVkZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaEVkZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlR3JhcGhFZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkRpYWdyYW0gPGVtPkRpYWdyYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURpYWdyYW1BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlIDxlbT5HcmFwaCBOb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoTm9kZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCA8ZW0+U2ltcGxlIFNlbWFudGljIE1vZGVsIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5TaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5VTUFTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVVTUFTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIDxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYudW1hLkxlYWZFbGVtZW50IDxlbT5MZWFmIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVMZWFmRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXh0RWxlbWVudCA8ZW0+VGV4dCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuVGV4dEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGV4dEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UgPGVtPkltYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuSW1hZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlSW1hZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhpY1ByaW1pdGl2ZSA8ZW0+R3JhcGhpYyBQcmltaXRpdmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaGljUHJpbWl0aXZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUdyYXBoaWNQcmltaXRpdmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUgPGVtPlBvbHlsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuUG9seWxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUG9seWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZSA8ZW0+RWxsaXBzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLkVsbGlwc2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxsaXBzZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0gLy9VbWFBZGFwdGVyRmFjdG9yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFSZXNvdXJjZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmYzg0Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hUmVzb3VyY2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBVTUEgcmVzb3VyY2UgYnVuZGxlLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFVtYVJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQlVORExFX05BTUUgPSBVbWFSZXNvdXJjZXMuY2xhc3MuZ2V0UGFja2FnZSgpCi0JCQkuZ2V0TmFtZSgpCi0JCQkrICIuUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBVbWFSZXNvdXJjZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycl9jYW5ub3RNb2RpZnkwOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgVW1hUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3VtYS91dGlsL1VtYVN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzNiZmUzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MzggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvcmVTZW1hbnRpY01vZGVsQnJpZGdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRWxsaXBzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkV4YW1wbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5GdWxmaWxsYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HcmFwaENvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkdyYXBoaWNQcmltaXRpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkZWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5MZWFmRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NGYW1pbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5SZXVzYWJsZUFzc2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0R3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVG9vbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVU1BU2VtYW50aWNNb2RlbEJyaWRnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLio7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFTd2l0Y2g8VD4gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBzd2l0Y2guCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXJldHVybiBkb1N3aXRjaCh0aGVFT2JqZWN0LmVDbGFzcygpLCB0aGVFT2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUIGRvU3dpdGNoKEVDbGFzcyB0aGVFQ2xhc3MsIEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXJldHVybiBkb1N3aXRjaCh0aGVFQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCksIHRoZUVPYmplY3QpOwotCQl9IGVsc2UgewotCQkJTGlzdDxFQ2xhc3M+IGVTdXBlclR5cGVzID0gdGhlRUNsYXNzLmdldEVTdXBlclR5cGVzKCk7Ci0JCQlyZXR1cm4gZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8gZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOiBkb1N3aXRjaCgKLQkJCQkJZVN1cGVyVHlwZXMuZ2V0KDApLCB0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxzIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCB1bnRpbCBvbmUgcmV0dXJucyBhIG5vbiBudWxsIHJlc3VsdDsgaXQgeWllbGRzIHRoYXQgcmVzdWx0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkIGJ5IGEgPGNvZGU+Y2FzZVhYWDwvY29kZT4gY2FsbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFQgZG9Td2l0Y2goaW50IGNsYXNzaWZpZXJJRCwgRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCXN3aXRjaCAoY2xhc3NpZmllcklEKSB7Ci0JCWNhc2UgVW1hUGFja2FnZS5DTEFTU0lGSUVSOiB7Ci0JCQlDbGFzc2lmaWVyIGNsYXNzaWZpZXIgPSAoQ2xhc3NpZmllcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoY2xhc3NpZmllcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjbGFzc2lmaWVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNsYXNzaWZpZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVFlQRTogewotCQkJVHlwZSB0eXBlID0gKFR5cGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUeXBlKHR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0eXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHsKLQkJCVBhY2thZ2VhYmxlRWxlbWVudCBwYWNrYWdlYWJsZUVsZW1lbnQgPSAoUGFja2FnZWFibGVFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBhY2thZ2VhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UOiB7Ci0JCQlOYW1lZEVsZW1lbnQgbmFtZWRFbGVtZW50ID0gKE5hbWVkRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG5hbWVkRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5FTEVNRU5UOiB7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QQUNLQUdFOiB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYudW1hLlBhY2thZ2UgcGFja2FnZV8gPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUGFja2FnZShwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlXyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZV8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTkFNRVNQQUNFOiB7Ci0JCQlOYW1lc3BhY2UgbmFtZXNwYWNlID0gKE5hbWVzcGFjZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobmFtZXNwYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChuYW1lc3BhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDogewotCQkJQ29uc3RyYWludCBjb25zdHJhaW50ID0gKENvbnN0cmFpbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb25zdHJhaW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UOiB7Ci0JCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSAoTWV0aG9kRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6IHsKLQkJCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBtZXRob2RFbGVtZW50UHJvcGVydHkgPSAoTWV0aG9kRWxlbWVudFByb3BlcnR5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudFByb3BlcnR5KG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuS0lORDogewotCQkJS2luZCBraW5kID0gKEtpbmQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VLaW5kKGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoa2luZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShraW5kKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGtpbmQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiB7Ci0JCQlDb250ZW50RWxlbWVudCBjb250ZW50RWxlbWVudCA9IChDb250ZW50RWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiB7Ci0JCQlEZXNjcmliYWJsZUVsZW1lbnQgZGVzY3JpYmFibGVFbGVtZW50ID0gKERlc2NyaWJhYmxlRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT046IHsKLQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiB7Ci0JCQlNZXRob2RVbml0IG1ldGhvZFVuaXQgPSAoTWV0aG9kVW5pdCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogewotCQkJU3VwcG9ydGluZ01hdGVyaWFsIHN1cHBvcnRpbmdNYXRlcmlhbCA9IChTdXBwb3J0aW5nTWF0ZXJpYWwpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2Uoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiB7Ci0JCQlHdWlkYW5jZSBndWlkYW5jZSA9IChHdWlkYW5jZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGd1aWRhbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046IHsKLQkJCVNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlU2VjdGlvbihzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlY3Rpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2VjdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChzZWN0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlZBUklBQklMSVRZX0VMRU1FTlQ6IHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2YXJpYWJpbGl0eUVsZW1lbnQgPSAoVmFyaWFiaWxpdHlFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodmFyaWFiaWxpdHlFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh2YXJpYWJpbGl0eUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHZhcmlhYmlsaXR5RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiB7Ci0JCQlDb25jZXB0IGNvbmNlcHQgPSAoQ29uY2VwdCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbmNlcHQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29uY2VwdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb25jZXB0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbmNlcHQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ0hFQ0tMSVNUOiB7Ci0JCQlDaGVja2xpc3QgY2hlY2tsaXN0ID0gKENoZWNrbGlzdCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNoZWNrbGlzdChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjaGVja2xpc3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOiB7Ci0JCQlHdWlkZWxpbmUgZ3VpZGVsaW5lID0gKEd1aWRlbGluZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUd1aWRlbGluZShndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChndWlkZWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRTogewotCQkJRXhhbXBsZSBleGFtcGxlID0gKEV4YW1wbGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VFeGFtcGxlKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGV4YW1wbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZXhhbXBsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChleGFtcGxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiB7Ci0JCQlSZXVzYWJsZUFzc2V0IHJldXNhYmxlQXNzZXQgPSAoUmV1c2FibGVBc3NldCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJldXNhYmxlQXNzZXQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocmV1c2FibGVBc3NldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyZXVzYWJsZUFzc2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiB7Ci0JCQlUZXJtRGVmaW5pdGlvbiB0ZXJtRGVmaW5pdGlvbiA9IChUZXJtRGVmaW5pdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRlcm1EZWZpbml0aW9uKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3VpZGFuY2UodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86IHsKLQkJCUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHsKLQkJCUFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQXJ0aWZhY3QoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHsKLQkJCVdvcmtQcm9kdWN0IHdvcmtQcm9kdWN0ID0gKFdvcmtQcm9kdWN0KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRlVMRklMTEFCTEVfRUxFTUVOVDogewotCQkJRnVsZmlsbGFibGVFbGVtZW50IGZ1bGZpbGxhYmxlRWxlbWVudCA9IChGdWxmaWxsYWJsZUVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGZ1bGZpbGxhYmxlRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZnVsZmlsbGFibGVFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChmdWxmaWxsYWJsZUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVQT1JUOiB7Ci0JCQlSZXBvcnQgcmVwb3J0ID0gKFJlcG9ydCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHJlcG9ydCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVwb3J0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyZXBvcnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEVNUExBVEU6IHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGVtcGxhdGUodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UT09MX01FTlRPUjogewotCQkJVG9vbE1lbnRvciB0b29sTWVudG9yID0gKFRvb2xNZW50b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUb29sTWVudG9yKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZSh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRvb2xNZW50b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodG9vbE1lbnRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHsKLQkJCUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPSAoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRTogewotCQkJRGVsaXZlcmFibGUgZGVsaXZlcmFibGUgPSAoRGVsaXZlcmFibGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZShkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLk9VVENPTUU6IHsKLQkJCU91dGNvbWUgb3V0Y29tZSA9IChPdXRjb21lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlT3V0Y29tZShvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3Qob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKG91dGNvbWUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUob3V0Y29tZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChvdXRjb21lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNURVA6IHsKLQkJCVN0ZXAgc3RlcCA9IChTdGVwKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlU3RlcChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VjdGlvbihzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24oc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzdGVwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHN0ZXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc3RlcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHsKLQkJCVdvcmtEZWZpbml0aW9uIHdvcmtEZWZpbml0aW9uID0gKFdvcmtEZWZpbml0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24od29ya0RlZmluaXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOiB7Ci0JCQlXaGl0ZXBhcGVyIHdoaXRlcGFwZXIgPSAoV2hpdGVwYXBlcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdoaXRlcGFwZXIod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbmNlcHQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod2hpdGVwYXBlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3aGl0ZXBhcGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVEFTSzogewotCQkJVGFzayB0YXNrID0gKFRhc2spIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUYXNrKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24odGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRhc2spOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGFzayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEU6IHsKLQkJCVJvbGUgcm9sZSA9IChSb2xlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUm9sZShyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHsKLQkJCUFydGlmYWN0RGVzY3JpcHRpb24gYXJ0aWZhY3REZXNjcmlwdGlvbiA9IChBcnRpZmFjdERlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjogewotCQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT046IHsKLQkJCURlbGl2ZXJhYmxlRGVzY3JpcHRpb24gZGVsaXZlcmFibGVEZXNjcmlwdGlvbiA9IChEZWxpdmVyYWJsZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGVEZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT046IHsKLQkJCVJvbGVEZXNjcmlwdGlvbiByb2xlRGVzY3JpcHRpb24gPSAoUm9sZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OOiB7Ci0JCQlUYXNrRGVzY3JpcHRpb24gdGFza0Rlc2NyaXB0aW9uID0gKFRhc2tEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVRhc2tEZXNjcmlwdGlvbih0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT046IHsKLQkJCUd1aWRhbmNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChHdWlkYW5jZURlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQlQcmFjdGljZURlc2NyaXB0aW9uIHByYWN0aWNlRGVzY3JpcHRpb24gPSAoUHJhY3RpY2VEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByYWN0aWNlRGVzY3JpcHRpb24ocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDogewotCQkJUm9sZVNldCByb2xlU2V0ID0gKFJvbGVTZXQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlU2V0KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlU2V0KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGVTZXQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZVNldCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZOiB7Ci0JCQlDb250ZW50Q2F0ZWdvcnkgY29udGVudENhdGVnb3J5ID0gKENvbnRlbnRDYXRlZ29yeSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiB7Ci0JCQlEb21haW4gZG9tYWluID0gKERvbWFpbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURvbWFpbihkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChkb21haW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRvbWFpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZG9tYWluKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFOiB7Ci0JCQlXb3JrUHJvZHVjdFR5cGUgd29ya1Byb2R1Y3RUeXBlID0gKFdvcmtQcm9kdWN0VHlwZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0VHlwZSh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkc6IHsKLQkJCURpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogewotCQkJRGlzY2lwbGluZSBkaXNjaXBsaW5lID0gKERpc2NpcGxpbmUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaXNjaXBsaW5lKGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkaXNjaXBsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKGRpc2NpcGxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWTogewotCQkJQWN0aXZpdHkgYWN0aXZpdHkgPSAoQWN0aXZpdHkpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24oYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYWN0aXZpdHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGFjdGl2aXR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHdvcmtCcmVha2Rvd25FbGVtZW50ID0gKFdvcmtCcmVha2Rvd25FbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShicmVha2Rvd25FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiB7Ci0JCQlQcm9jZXNzRWxlbWVudCBwcm9jZXNzRWxlbWVudCA9IChQcm9jZXNzRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBOiB7Ci0JCQlQbGFubmluZ0RhdGEgcGxhbm5pbmdEYXRhID0gKFBsYW5uaW5nRGF0YSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVBsYW5uaW5nRGF0YShwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSOiB7Ci0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtPcmRlcih3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya09yZGVyKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrT3JkZXIpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHdvcmtPcmRlcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0FETUFQOiB7Ci0JCQlSb2FkbWFwIHJvYWRtYXAgPSAoUm9hZG1hcCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJvYWRtYXAocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocm9hZG1hcCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShyb2FkbWFwKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvYWRtYXApOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuVE9PTDogewotCQkJVG9vbCB0b29sID0gKFRvb2wpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUb29sKHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0b29sKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHRvb2wpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodG9vbCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogewotCQkJUm9sZVNldEdyb3VwaW5nIHJvbGVTZXRHcm91cGluZyA9IChSb2xlU2V0R3JvdXBpbmcpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlU2V0R3JvdXBpbmcocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUlk6IHsKLQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ3VzdG9tQ2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHsKLQkJCU1ldGhvZFBhY2thZ2UgbWV0aG9kUGFja2FnZSA9IChNZXRob2RQYWNrYWdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRTogewotCQkJQ29udGVudFBhY2thZ2UgY29udGVudFBhY2thZ2UgPSAoQ29udGVudFBhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VDb250ZW50UGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiB7Ci0JCQlNaWxlc3RvbmUgbWlsZXN0b25lID0gKE1pbGVzdG9uZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1pbGVzdG9uZShtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SOiB7Ci0JCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd29ya1Byb2R1Y3REZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogewotCQkJRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKERlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGRlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoZGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLklURVJBVElPTjogewotCQkJSXRlcmF0aW9uIGl0ZXJhdGlvbiA9IChJdGVyYXRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VJdGVyYXRpb24oaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRnVsZmlsbGFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChpdGVyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBIQVNFOiB7Ci0JCQlQaGFzZSBwaGFzZSA9IChQaGFzZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVBoYXNlKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUZ1bGZpbGxhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocGhhc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBoYXNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwaGFzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEU6IHsKLQkJCVRlYW1Qcm9maWxlIHRlYW1Qcm9maWxlID0gKFRlYW1Qcm9maWxlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVGVhbVByb2ZpbGUodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcih0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjogewotCQkJUm9sZURlc2NyaXB0b3Igcm9sZURlc2NyaXB0b3IgPSAoUm9sZURlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVR5cGUocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjogewotCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRvcih0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpcHRvcih0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZSh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEU6IHsKLQkJCUNvbXBvc2l0ZVJvbGUgY29tcG9zaXRlUm9sZSA9IChDb21wb3NpdGVSb2xlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29tcG9zaXRlUm9sZShjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaXB0b3IoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIoY29tcG9zaXRlUm9sZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjb21wb3NpdGVSb2xlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTUzogewotCQkJRGVsaXZlcnlQcm9jZXNzIGRlbGl2ZXJ5UHJvY2VzcyA9IChEZWxpdmVyeVByb2Nlc3MpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyeVByb2Nlc3MoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eShkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTUzogewotCQkJb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzIHByb2Nlc3MgPSAob3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQWN0aXZpdHkocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVZhcmlhYmlsaXR5RWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0RlZmluaXRpb24ocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzcyk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3MpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiB7Ci0JCQlDYXBhYmlsaXR5UGF0dGVybiBjYXBhYmlsaXR5UGF0dGVybiA9IChDYXBhYmlsaXR5UGF0dGVybikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2VzcyhjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT046IHsKLQkJCU1ldGhvZENvbmZpZ3VyYXRpb24gbWV0aG9kQ29uZmlndXJhdGlvbiA9IChNZXRob2RDb25maWd1cmF0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kQ29uZmlndXJhdGlvbihtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOOiB7Ci0JCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFBsdWdpbihtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2UobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UobWV0aG9kUGx1Z2luKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOiB7Ci0JCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA9IChQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzcyhwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VGdWxmaWxsYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VWYXJpYWJpbGl0eUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VXb3JrRGVmaW5pdGlvbihwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VDbGFzc2lmaWVyKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVHlwZShwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0U6IHsKLQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJhY3RpY2UocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHdWlkYW5jZShwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlVmFyaWFiaWxpdHlFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByYWN0aWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjogewotCQkJQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA9IChCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiB7Ci0JCQlBY3Rpdml0eURlc2NyaXB0aW9uIGFjdGl2aXR5RGVzY3JpcHRpb24gPSAoQWN0aXZpdHlEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCVByb2Nlc3NEZXNjcmlwdGlvbiBwcm9jZXNzRGVzY3JpcHRpb24gPSAoUHJvY2Vzc0Rlc2NyaXB0aW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0Rlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiB7Ci0JCQlEZXNjcmlwdG9yRGVzY3JpcHRpb24gZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gKERlc2NyaXB0b3JEZXNjcmlwdGlvbikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3JEZXNjcmlwdGlvbihkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0RFU0NSSVBUT1I6IHsKLQkJCVByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yIHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yID0gKFByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUNsYXNzaWZpZXIocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudERlc2NyaXB0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnREZXNjcmlwdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDogewotCQkJUHJvY2Vzc0NvbXBvbmVudCBwcm9jZXNzQ29tcG9uZW50ID0gKFByb2Nlc3NDb21wb25lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzQ29tcG9uZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lc3BhY2UocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogewotCQkJUHJvY2Vzc1BhY2thZ2UgcHJvY2Vzc1BhY2thZ2UgPSAoUHJvY2Vzc1BhY2thZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVzcGFjZShwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTTogewotCQkJRGlhZ3JhbSBkaWFncmFtID0gKERpYWdyYW0pIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaWFncmFtKGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaE5vZGUoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGlhZ3JhbSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaWFncmFtKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGRpYWdyYW0pOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfTk9ERTogewotCQkJR3JhcGhOb2RlIGdyYXBoTm9kZSA9IChHcmFwaE5vZGUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VHcmFwaE5vZGUoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhOb2RlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChncmFwaE5vZGUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoTm9kZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FTEVNRU5UOiB7Ci0JCQlHcmFwaEVsZW1lbnQgZ3JhcGhFbGVtZW50ID0gKEdyYXBoRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3JhcGhFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuRElBR1JBTV9FTEVNRU5UOiB7Ci0JCQlEaWFncmFtRWxlbWVudCBkaWFncmFtRWxlbWVudCA9IChEaWFncmFtRWxlbWVudCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGRpYWdyYW1FbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaWFncmFtRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbUVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUkVGRVJFTkNFOiB7Ci0JCQlSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlZmVyZW5jZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVJlZmVyZW5jZShyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocmVmZXJlbmNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChyZWZlcmVuY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUFJPUEVSVFk6IHsKLQkJCVByb3BlcnR5IHByb3BlcnR5ID0gKFByb3BlcnR5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvcGVydHkocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChwcm9wZXJ0eSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvcGVydHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb3BlcnR5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBPSU5UOiB7Ci0JCQlQb2ludCBwb2ludCA9IChQb2ludCkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVBvaW50KHBvaW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkRJQUdSQU1fTElOSzogewotCQkJRGlhZ3JhbUxpbmsgZGlhZ3JhbUxpbmsgPSAoRGlhZ3JhbUxpbmspIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VEaWFncmFtTGluayhkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGRpYWdyYW1MaW5rKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkaWFncmFtTGluayk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGlhZ3JhbUxpbmspOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuR1JBUEhfQ09OTkVDVE9SOiB7Ci0JCQlHcmFwaENvbm5lY3RvciBncmFwaENvbm5lY3RvciA9IChHcmFwaENvbm5lY3RvcikgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoQ29ubmVjdG9yKGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhDb25uZWN0b3IpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoQ29ubmVjdG9yKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChncmFwaENvbm5lY3Rvcik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSF9FREdFOiB7Ci0JCQlHcmFwaEVkZ2UgZ3JhcGhFZGdlID0gKEdyYXBoRWRnZSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZUdyYXBoRWRnZShncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaEVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChncmFwaEVkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoRWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3JhcGhFZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlNFTUFOVElDX01PREVMX0JSSURHRTogewotCQkJU2VtYW50aWNNb2RlbEJyaWRnZSBzZW1hbnRpY01vZGVsQnJpZGdlID0gKFNlbWFudGljTW9kZWxCcmlkZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChzZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQoc2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5ESU1FTlNJT046IHsKLQkJCURpbWVuc2lvbiBkaW1lbnNpb24gPSAoRGltZW5zaW9uKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRGltZW5zaW9uKGRpbWVuc2lvbik7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U6IHsKLQkJCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSA9IChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlQ2xhc3NpZmllcihwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VUeXBlKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5TSU1QTEVfU0VNQU5USUNfTU9ERUxfRUxFTUVOVDogewotCQkJU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgPSAoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VTaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVNlbWFudGljTW9kZWxCcmlkZ2Uoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChzaW1wbGVTZW1hbnRpY01vZGVsRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHNpbXBsZVNlbWFudGljTW9kZWxFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlVNQV9TRU1BTlRJQ19NT0RFTF9CUklER0U6IHsKLQkJCVVNQVNlbWFudGljTW9kZWxCcmlkZ2UgdW1hU2VtYW50aWNNb2RlbEJyaWRnZSA9IChVTUFTZW1hbnRpY01vZGVsQnJpZGdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlVU1BU2VtYW50aWNNb2RlbEJyaWRnZSh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlU2VtYW50aWNNb2RlbEJyaWRnZSh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodW1hU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh1bWFTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHVtYVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuQ09SRV9TRU1BTlRJQ19NT0RFTF9CUklER0U6IHsKLQkJCUNvcmVTZW1hbnRpY01vZGVsQnJpZGdlIGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlID0gKENvcmVTZW1hbnRpY01vZGVsQnJpZGdlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoY29yZVNlbWFudGljTW9kZWxCcmlkZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvcmVTZW1hbnRpY01vZGVsQnJpZGdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChjb3JlU2VtYW50aWNNb2RlbEJyaWRnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5MRUFGX0VMRU1FTlQ6IHsKLQkJCUxlYWZFbGVtZW50IGxlYWZFbGVtZW50ID0gKExlYWZFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChsZWFmRWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobGVhZkVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGxlYWZFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlRFWFRfRUxFTUVOVDogewotCQkJVGV4dEVsZW1lbnQgdGV4dEVsZW1lbnQgPSAoVGV4dEVsZW1lbnQpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VUZXh0RWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQodGV4dEVsZW1lbnQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRleHRFbGVtZW50KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXh0RWxlbWVudCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5JTUFHRTogewotCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VJbWFnZShpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZUxlYWZFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoaW1hZ2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGltYWdlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChpbWFnZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWNhc2UgVW1hUGFja2FnZS5HUkFQSElDX1BSSU1JVElWRTogewotCQkJR3JhcGhpY1ByaW1pdGl2ZSBncmFwaGljUHJpbWl0aXZlID0gKEdyYXBoaWNQcmltaXRpdmUpIHRoZUVPYmplY3Q7Ci0JCQlUIHJlc3VsdCA9IGNhc2VHcmFwaGljUHJpbWl0aXZlKGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VMZWFmRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRGlhZ3JhbUVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZ3JhcGhpY1ByaW1pdGl2ZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChncmFwaGljUHJpbWl0aXZlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KGdyYXBoaWNQcmltaXRpdmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuUE9MWUxJTkU6IHsKLQkJCVBvbHlsaW5lIHBvbHlsaW5lID0gKFBvbHlsaW5lKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlUG9seWxpbmUocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VHcmFwaGljUHJpbWl0aXZlKHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VEaWFncmFtRWxlbWVudChwb2x5bGluZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocG9seWxpbmUpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHBvbHlsaW5lKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLkVMTElQU0U6IHsKLQkJCUVsbGlwc2UgZWxsaXBzZSA9IChFbGxpcHNlKSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlRWxsaXBzZShlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlR3JhcGhpY1ByaW1pdGl2ZShlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTGVhZkVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZURpYWdyYW1FbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGVsbGlwc2UpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZWxsaXBzZSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChlbGxpcHNlKTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfRkFNSUxZOiB7Ci0JCQlQcm9jZXNzRmFtaWx5IHByb2Nlc3NGYW1pbHkgPSAoUHJvY2Vzc0ZhbWlseSkgdGhlRU9iamVjdDsKLQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NGYW1pbHkocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZENvbmZpZ3VyYXRpb24ocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0ZhbWlseSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRmFtaWx5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NGYW1pbHkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHsKLQkJCU1ldGhvZExpYnJhcnkgbWV0aG9kTGlicmFyeSA9IChNZXRob2RMaWJyYXJ5KSB0aGVFT2JqZWN0OwotCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kTGlicmFyeShtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlUGFja2FnZShtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlTmFtZXNwYWNlKG1ldGhvZExpYnJhcnkpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCXJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNsYXNzaWZpZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DbGFzc2lmaWVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2xhc3NpZmllcihDbGFzc2lmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVR5cGUoVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBhY2thZ2Uob3JnLmVjbGlwc2UuZXBmLnVtYS5QYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lc3BhY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VOYW1lc3BhY2UoTmFtZXNwYWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kRWxlbWVudChNZXRob2RFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uc3RyYWludDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnN0cmFpbnQoQ29uc3RyYWludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShNZXRob2RFbGVtZW50UHJvcGVydHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPktpbmQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlS2luZChLaW5kIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnREZXNjcmlwdGlvbihDb250ZW50RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3QoV29ya1Byb2R1Y3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkZ1bGZpbGxhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5GdWxmaWxsYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRnVsZmlsbGFibGVFbGVtZW50KEZ1bGZpbGxhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtEZWZpbml0aW9uKFdvcmtEZWZpbml0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdGVwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3RlcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVN0ZXAoU3RlcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRhbmNlKEd1aWRhbmNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXJ0aWZhY3QoQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRQYWNrYWdlKENvbnRlbnRQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXJ0aWZhY3REZXNjcmlwdGlvbihBcnRpZmFjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZURlc2NyaXB0aW9uKFJvbGVEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrRGVzY3JpcHRpb24oVGFza0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihHdWlkYW5jZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJhY3RpY2VEZXNjcmlwdGlvbihQcmFjdGljZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHkoQWN0aXZpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQoV29ya0JyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUl0ZXJhdGlvbihJdGVyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGVhbVByb2ZpbGUoVGVhbVByb2ZpbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVEZXNjcmlwdG9yKFJvbGVEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtPcmRlcihXb3JrT3JkZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NFbGVtZW50KFByb2Nlc3NFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVzY3JpcHRvcihEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcihXb3JrUHJvZHVjdERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihBY3Rpdml0eURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihQcm9jZXNzRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKERlc2NyaXB0b3JEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNoZWNrbGlzdChDaGVja2xpc3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FeGFtcGxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXhhbXBsZShFeGFtcGxlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkZWxpbmU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUVzdGltYXRpb25Db25zaWRlcmF0aW9ucyhFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVG9vbE1lbnRvcihUb29sTWVudG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdoaXRlcGFwZXIoV2hpdGVwYXBlciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGVybURlZmluaXRpb24oVGVybURlZmluaXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyhBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByYWN0aWNlKFByYWN0aWNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUmV1c2FibGVBc3NldChSZXVzYWJsZUFzc2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9sZVNldChSb2xlU2V0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb21haW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb21haW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3RUeXBlKFdvcmtQcm9kdWN0VHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Ub29sPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRvb2woVG9vbCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlbGl2ZXJ5UHJvY2VzcyhEZWxpdmVyeVByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNhcGFiaWxpdHlQYXR0ZXJuKENhcGFiaWxpdHlQYXR0ZXJuIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvYWRtYXAoUm9hZG1hcCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnQoUHJvY2Vzc0NvbXBvbmVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BhY2thZ2UoUHJvY2Vzc1BhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvcihQcm9jZXNzQ29tcG9uZW50RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5WYXJpYWJpbGl0eSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VmFyaWFiaWxpdHkgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVZhcmlhYmlsaXR5RWxlbWVudChWYXJpYWJpbGl0eUVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRmFtaWx5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBGYW1pbHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzRmFtaWx5KFByb2Nlc3NGYW1pbHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UG9pbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQb2ludChQb2ludCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaEVsZW1lbnQoR3JhcGhFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaWFncmFtRWxlbWVudChEaWFncmFtRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbSBMaW5rPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGlhZ3JhbUxpbmsoRGlhZ3JhbUxpbmsgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIENvbm5lY3RvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUdyYXBoQ29ubmVjdG9yKEdyYXBoQ29ubmVjdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VTZW1hbnRpY01vZGVsQnJpZGdlKFNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpbWVuc2lvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpbWVuc2lvbihEaW1lbnNpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJlZmVyZW5jZShSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9wZXJ0eShQcm9wZXJ0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggRWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIEVkZ2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaEVkZ2UoR3JhcGhFZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaWFncmFtPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlhZ3JhbTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpYWdyYW0oRGlhZ3JhbSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3JhcGggTm9kZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoIE5vZGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHcmFwaE5vZGUoR3JhcGhOb2RlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TaW1wbGUgU2VtYW50aWMgTW9kZWwgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNpbXBsZSBTZW1hbnRpYyBNb2RlbCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQoU2ltcGxlU2VtYW50aWNNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlVNQSBTZW1hbnRpYyBNb2RlbCBCcmlkZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5VTUEgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVU1BU2VtYW50aWNNb2RlbEJyaWRnZShVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db3JlIFNlbWFudGljIE1vZGVsIEJyaWRnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvcmUgU2VtYW50aWMgTW9kZWwgQnJpZGdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29yZVNlbWFudGljTW9kZWxCcmlkZ2UoQ29yZVNlbWFudGljTW9kZWxCcmlkZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxlYWYgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUxlYWZFbGVtZW50KExlYWZFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXh0IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZXh0RWxlbWVudChUZXh0RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SW1hZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5JbWFnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUltYWdlKEltYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HcmFwaGljIFByaW1pdGl2ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkdyYXBoaWMgUHJpbWl0aXZlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3JhcGhpY1ByaW1pdGl2ZShHcmFwaGljUHJpbWl0aXZlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qb2x5bGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBvbHlsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUG9seWxpbmUoUG9seWxpbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsbGlwc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGxpcHNlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRWxsaXBzZShFbGxpcHNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvL1VtYVN3aXRjaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvVW1hVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRiNDE5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9VbWFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FQ29udGVudHNFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIGZvciBhY2Nlc3NpbmcgYW5kIHVwZGF0aW5nIHRoZSBVTUEgbW9kZWwgb2JqZWN0cy4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW1hVXRpbCB7Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyB0aGUgZmVhdHVyZSB2YWx1ZXMgb2YgYW4gb2xkIG1ldGhvZCBlbGVtZW50IHdpdGggdGhlCi0JICogY29ycmVzcG9uZGluZyBmZWF0dXJlIHZhbHVlcyBvZiBhIG5ldyBtZXRob2QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiBOb3RlOiBBbGwgZmVhdHVyZXMgYXJlIHVwZGF0ZWQgZXhjZXB0IGZvciB0aGUgR1VJRCBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBvbGRFbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgb2xkIG1ldGhvZCBlbGVtZW50Ci0JICogQHBhcmFtIG5ld0VsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgbWV0aG9kIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVwbGFjZShNZXRob2RFbGVtZW50IG9sZEVsZW1lbnQsCi0JCQlNZXRob2RFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJTGlzdCBmZWF0dXJlcyA9IG9sZEVsZW1lbnQuZUNsYXNzKCkuZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpOwotCQlpZiAoZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmZWF0dXJlcy5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgZmVhdHVyZXMKLQkJCQkJCS5nZXQoaSk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9HdWlkKCkpIHsKLQkJCQkJLy8gZG9uJ3QgcmVwbGFjZSBHVUlECi0JCQkJCU9iamVjdCBuZXdWYWx1ZSA9IG5ld0VsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCQkJb2xkRWxlbWVudC5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbW9kZWwgb2JqZWN0IGhhcyBhIGRpcmVjdCByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBtb2RlbCBvYmplY3QKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgbW9kZWwgb2JqZWN0IGlzIGNvbnRhaW5lZCBieQotCSAqICAgICAgICAgYSByZXNvdXJjZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEaXJlY3RSZXNvdXJjZShFT2JqZWN0IGUpIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBlLmVSZXNvdXJjZSgpOwotCQlyZXR1cm4gKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jb250YWlucyhlKSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYWxsIHJlc291cmNlcyBvd25lZCBieSB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldFJlc291cmNlcyhFT2JqZWN0IGUpIHsKLQkJSGFzaFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0JCWdldFJlc291cmNlcyhlLCByZXNvdXJjZXMpOwotCQlyZXR1cm4gcmVzb3VyY2VzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0UmVzb3VyY2VzKEVPYmplY3QgZSwgQ29sbGVjdGlvbjxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7Ci0JCWlmIChVbWFVdGlsLmhhc0RpcmVjdFJlc291cmNlKGUpKSB7Ci0JCQlyZXNvdXJjZXMuYWRkKGUuZVJlc291cmNlKCkpOwotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZS5lQ29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlnZXRSZXNvdXJjZXMoKEVPYmplY3QpIGl0ZXIubmV4dCgpLCByZXNvdXJjZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIHNwZWNpZmljIHR5cGUgb2YgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggYSBub3RpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iagotCSAqICAgICAgICAgICAgYSBub3RpZmllcgotCSAqIEBwYXJhbSBjbHMKLQkgKiAgICAgICAgICAgIHRoZSBhZGFwdGVyIGNsYXNzCi0JICogQHJldHVybiBhbiA8Y29kZT5BZGFwdGVyPGNvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEFkYXB0ZXIoRU9iamVjdCBlT2JqLCBDbGFzcyBjbHMpIHsKLQkJZm9yIChJdGVyYXRvciBhZGFwdGVycyA9IGVPYmouZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKTsgYWRhcHRlcnMKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJQWRhcHRlciBhZGFwdGVyID0gKEFkYXB0ZXIpIGFkYXB0ZXJzLm5leHQoKTsKLQkJCWlmIChjbHMuaXNJbnN0YW5jZShhZGFwdGVyKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBhZGFwdGVycyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbi4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxBZGFwdGVycyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJZm9yIChUcmVlSXRlcmF0b3I8RU9iamVjdD4gaXRlciA9IGVPYmplY3QuZUFsbENvbnRlbnRzKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvID0gaXRlci5uZXh0KCk7Ci0JCQlvLmVBZGFwdGVycygpLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGFja2FnZXMKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBtZXRob2QgcGFja2FnZSBuYW1lCi0JICogQHJldHVybiBhIG1ldGhvZCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZmluZE1ldGhvZFBhY2thZ2UoTGlzdCBtZXRob2RQYWNrYWdlcywKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RQYWNrYWdlcy5zaXplKCkgLSAxOyBpID4gLTE7IGktLSkgewotCQkJT2JqZWN0IG9iaiA9IG1ldGhvZFBhY2thZ2VzLmdldChpKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSB7Ci0JCQkJTWV0aG9kUGFja2FnZSBwa2cgPSAoTWV0aG9kUGFja2FnZSkgb2JqOwotCQkJCWlmIChuYW1lLmVxdWFscyhwa2cuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGtnOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtZXRob2QgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIG1ldGhvZCBlbGVtZW50IHBhdGggZnJhZ21lbnRzCi0JICogQHJldHVybiBhIG1ldGhvZCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBhY2thZ2UgZmluZE1ldGhvZFBhY2thZ2UoTWV0aG9kUGx1Z2luIG1ldGhvZFBsdWdpbiwKLQkJCVN0cmluZ1tdIHBhdGgpIHsKLQkJTWV0aG9kUGFja2FnZSBwa2cgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBtZXRob2RQbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlwa2cgPSBmaW5kTWV0aG9kUGFja2FnZShsaXN0LCBwYXRoW2ldKTsKLQkJCWlmIChwa2cgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJbGlzdCA9IHBrZy5nZXRDaGlsZFBhY2thZ2VzKCk7Ci0JCX0KLQkJcmV0dXJuIHBrZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBwYXJlbnQgYWN0aXZpdHkgb2YgYSBicmVha2Rvd24gZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCBhY3Rpdml0eSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgZ2V0UGFyZW50QWN0aXZpdHkoQnJlYWtkb3duRWxlbWVudCBlKSB7Ci0JCXJldHVybiBlLmdldFN1cGVyQWN0aXZpdGllcygpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBhY3Rpdml0eSBvZiBhIHdvcmsgb3JkZXIuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcgotCSAqICAgICAgICAgICAgYSB3b3JrIG9yZGVyCi0JICogQHJldHVybiB0aGUgcGFyZW50IGFjdGl2aXR5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBBY3Rpdml0eSBnZXRPd25pbmdBY3Rpdml0eShXb3JrT3JkZXIgd29ya09yZGVyKSB7Ci0JCVByb2Nlc3NQYWNrYWdlIHBrZyA9IChQcm9jZXNzUGFja2FnZSkgd29ya09yZGVyLmVDb250YWluZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGtnLmdldFByb2Nlc3NFbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIKLQkJCQkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGVsZW1lbnQgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLQkJCQlyZXR1cm4gKEFjdGl2aXR5KSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgcGFja2FnZSB3aXRoIGEgc3BlY2lmaWMgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWV0aG9kUGFja2FnZXMKLQkgKiAgICAgICAgICAgIGEgbGlzdCBvZiBtZXRob2QgcGFja2FnZXMKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgYSBjb250ZW50IHBhY2thZ2UgbmFtZQotCSAqIEByZXR1cm4gYSBjb250ZW50IHBhY2thZ2Ugd2l0aCB0aGUgbWF0aGNpbmcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgZmluZENvbnRlbnRQYWNrYWdlKExpc3QgbWV0aG9kUGFja2FnZXMsCi0JCQlTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gbWV0aG9kUGFja2FnZXMuc2l6ZSgpIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvYmogPSBtZXRob2RQYWNrYWdlcy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlDb250ZW50UGFja2FnZSBwa2cgPSAoQ29udGVudFBhY2thZ2UpIG9iajsKLQkJCQlpZiAobmFtZS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHBrZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwYWNrYWdlIHdpdGggYSBzcGVjaWZpYyBwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBtZXRob2RQbHVnaW4KLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIHBsdWctaW4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgbWV0aG9kIGVsZW1lbnQgcGF0aCBmcmFnbWVudHMKLQkgKiBAcmV0dXJuIGEgY29udGVudCBwYWNrYWdlIHdpdGggdGhlIG1hdGNoaW5nIHBhdGggb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnRlbnRQYWNrYWdlIGZpbmRDb250ZW50UGFja2FnZShNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luLAotCQkJU3RyaW5nW10gcGF0aCkgewotCQlDb250ZW50UGFja2FnZSBwa2cgPSBudWxsOwotCQlMaXN0IGxpc3QgPSBtZXRob2RQbHVnaW4uZ2V0TWV0aG9kUGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7Ci0JCQlwa2cgPSBmaW5kQ29udGVudFBhY2thZ2UobGlzdCwgcGF0aFtpXSk7Ci0JCQlpZiAocGtnID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWxpc3QgPSBwa2cuZ2V0Q2hpbGRQYWNrYWdlcygpOwotCQl9Ci0JCXJldHVybiBwa2c7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCBwbHVnLWluIG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgTWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIHBsdWctaW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oRU9iamVjdCBlbGVtZW50KSB7Ci0JCWZvciAoRU9iamVjdCBvYmogPSBlbGVtZW50OyBvYmogIT0gbnVsbDsgb2JqID0gb2JqLmVDb250YWluZXIoKSkgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikgewotCQkJCXJldHVybiAoTWV0aG9kUGx1Z2luKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCBsaWJyYXJ5IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIGxpYnJhcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXJldHVybiAoTWV0aG9kTGlicmFyeSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEVPYmplY3QgZ2V0VG9wQ29udGFpbmVyKEVPYmplY3QgZWxlbWVudCkgewotCQlFT2JqZWN0IGNvbnRhaW5lciA9IG51bGw7Ci0JCWZvciAoRU9iamVjdCBvYmogPSBlbGVtZW50LmVDb250YWluZXIoKTsgb2JqICE9IG51bGw7IG9iaiA9IG9iai5lQ29udGFpbmVyKCkpIHsKLQkJCWNvbnRhaW5lciA9IG9iajsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwkJCi0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGNvbnRlbnQgcGFja2FnZSBvZiBhIGNvbnRlbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBjb250ZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgY29udGVudCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBnZXRDb250ZW50UGFja2FnZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKENvbnRlbnRQYWNrYWdlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IHByb2Nlc3MgcGFja2FnZSBvZiBhIHByb2Nlc3MgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBQcm9jZXNzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcHJvY2VzcyBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBQcm9jZXNzUGFja2FnZSBnZXRQcm9jZXNzUGFja2FnZShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCQlyZXR1cm4gKFByb2Nlc3NQYWNrYWdlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IGRpYWdyYW0gb2YgYSBkaWFncmFtIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgZGlhZ3JhbSBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcGFyZW50IGRpYWdyYW0gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gZ2V0RGlhZ3JhbShFT2JqZWN0IGVsZW1lbnQpIHsKLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVsZW1lbnQ7IG9iaiAhPSBudWxsOyBvYmogPSBvYmouZUNvbnRhaW5lcigpKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCXJldHVybiAoRGlhZ3JhbSkgb2JqOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGEgbWV0aG9kIGVsZW1lbnQgaXMgY29udGFpbmVkIGJ5IGEgc3BlY2lmaWMgY29udGVudAotCSAqIHBhY2thZ2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcGFyYW0gY29udGVudFBhY2thZ2UKLQkgKiAgICAgICAgICAgIGEgY29udGVudCBwYWNrYWdlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbWV0aG9kIGVsZW1lbnQgaXMgY29udGFpbmVkIGJ5IHRoZQotCSAqICAgICAgICAgY29udGVudCBwYWNrYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29udGFpbmVkQnlDb250ZW50UGFja2FnZShFT2JqZWN0IGVsZW1lbnQsCi0JCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSkgewotCQlyZXR1cm4gaXNDb250YWluZWRCeShlbGVtZW50LCBjb250ZW50UGFja2FnZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBtb2RlbCBvYmplY3QgaXMgY29udGFpbmVkIGJ5IGEgc3BlY2lmaWMgY29udGFpbmVyLgotCSAqIAotCSAqIEBwYXJhbSBlT2JqCi0JICogICAgICAgICAgICBhIG1vZGVsIG9iamVjdAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIGEgY29udGFpbmVyCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbW9kZWwgb2JqZWN0IGlzIGNvbnRhaW5lZCBieSB0aGUKLQkgKiAgICAgICAgIGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnRhaW5lZEJ5KEVPYmplY3QgZU9iaiwgT2JqZWN0IGNvbnRhaW5lcikgewotCQlpZiAoZU9iaiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChFT2JqZWN0IG9iaiA9IGVPYmouZUNvbnRhaW5lcigpOyBvYmogIT0gbnVsbDsgb2JqID0gb2JqCi0JCQkJLmVDb250YWluZXIoKSkgewotCQkJaWYgKG9iaiA9PSBjb250YWluZXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGFuZCByZXR1cm5zIGEgdW5pcXVlIElELgotCSAqIAotCSAqIEByZXR1cm4gYSB1bmlxdWUgSUQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZW5lcmF0ZUdVSUQoKSB7Ci0JCXJldHVybiBFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgY29udGVudCBkZXNjcmlwdGlvbiBuYW1lIG9mIGEgZ2l2ZW4gbWV0aG9kCi0JICogZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgYSBtZXRob2QgZWxlbWVudAotCSAqIEByZXR1cm4gYSBzdWl0YWJsZSBjb250ZW50IGRlc2NyaXB0aW9uIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25OYW1lKE1ldGhvZEVsZW1lbnQgZSkgewotCQlyZXR1cm4gZS5nZXROYW1lKCkgKyAnLCcgKyBlLmdldEd1aWQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2V0QWxsU3VwZXJzKExpc3Qgc3VwZXJzLCBWYXJpYWJpbGl0eUVsZW1lbnQgZSwKLQkJCVZhcmlhYmlsaXR5VHlwZSB0eXBlKSB7Ci0JCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlID0gZS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCWlmIChiYXNlICE9IG51bGwgJiYgZS5nZXRWYXJpYWJpbGl0eVR5cGUoKSA9PSB0eXBlCi0JCQkJJiYgIXN1cGVycy5jb250YWlucyhiYXNlKSkgewotCQkJc3VwZXJzLmFkZChiYXNlKTsKLQkJCWdldEFsbFN1cGVycyhzdXBlcnMsIGJhc2UsIHR5cGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdldEFsbFN1cGVyc0JvdGgoTGlzdCBzdXBlcnMsIFZhcmlhYmlsaXR5RWxlbWVudCBlLAotCQkJVmFyaWFiaWxpdHlUeXBlIHR5cGUxLCBWYXJpYWJpbGl0eVR5cGUgdHlwZTIpIHsKLQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UgPSBlLmdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQkJaWYgKGJhc2UgIT0gbnVsbAotCQkJCSYmIChlLmdldFZhcmlhYmlsaXR5VHlwZSgpID09IHR5cGUxIHx8IGUuZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPT0gdHlwZTIpCi0JCQkJJiYgIXN1cGVycy5jb250YWlucyhiYXNlKSkgewotCQkJc3VwZXJzLmFkZChiYXNlKTsKLQkJCWdldEFsbFN1cGVyc0JvdGgoc3VwZXJzLCBiYXNlLCB0eXBlMSwgdHlwZTIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY2xhc3Mgb2YgYSBjb250ZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRFbGVtZW50Ci0JICogICAgICAgICAgICBhIGNvbnRlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZWxlbWVudCBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3MgZ2V0Q2xhc3NPZkNvbnRlbnRFbGVtZW50KENvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50KSB7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIFJvbGUpCi0JCQlyZXR1cm4gUm9sZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgVGFzaykKLQkJCXJldHVybiBUYXNrLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdCkKLQkJCXJldHVybiBXb3JrUHJvZHVjdC5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgR3VpZGFuY2UpCi0JCQlyZXR1cm4gR3VpZGFuY2UuY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERvbWFpbikKLQkJCXJldHVybiBEb21haW4uY2xhc3M7Ci0JCWlmIChjb250ZW50RWxlbWVudCBpbnN0YW5jZW9mIERpc2NpcGxpbmUpCi0JCQlyZXR1cm4gRGlzY2lwbGluZS5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgRGlzY2lwbGluZUdyb3VwaW5nKQotCQkJcmV0dXJuIERpc2NpcGxpbmVHcm91cGluZy5jbGFzczsKLQkJaWYgKGNvbnRlbnRFbGVtZW50IGluc3RhbmNlb2YgUm9sZVNldCkKLQkJCXJldHVybiBSb2xlU2V0LmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBSb2xlU2V0R3JvdXBpbmcpCi0JCQlyZXR1cm4gUm9sZVNldEdyb3VwaW5nLmNsYXNzOwotCQlpZiAoY29udGVudEVsZW1lbnQgaW5zdGFuY2VvZiBXb3JrUHJvZHVjdFR5cGUpCi0JCQlyZXR1cm4gV29ya1Byb2R1Y3RUeXBlLmNsYXNzOwotCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IHdvcmsgb3JkZXIgZm9yIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqICAgICAgICAgICAgYSB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHBhcmFtIHByZWRlY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJlZGVjZXNzb3Igd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgd29yayBvcmRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoc3VjYywgcHJlZCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGNyZWF0ZURlZmF1bHRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgc3VjYywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IHByZWQsIGJvb2xlYW4gbGluaykgewotCQlXb3JrT3JkZXIgd28gPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrT3JkZXIoKTsKLQkJd28uc2V0UHJlZChwcmVkKTsKLQkJaWYobGluaykgewotCQkJc3VjYy5nZXRMaW5rVG9QcmVkZWNlc3NvcigpLmFkZCh3byk7Ci0JCX0KLQkJcmV0dXJuIHdvOwotCX0JCi0KLQkvKioKLQkgKiBMb2NhdGVzIHRoZSB3b3JrIG9yZGVyIGFzc29jaWF0ZWQgd2l0aCB0d28gd29yayBicmVha2Rvd24gZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgd29yayBicmVha2Rvd24gZWxlbWVudAotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByZWRlY2Vzc29yIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcmV0dXJuIGEgd29yayBvcmRlciBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyIGZpbmRXb3JrT3JkZXIoV29ya0JyZWFrZG93bkVsZW1lbnQgZSwKLQkJCU9iamVjdCBwcmVkZWNlc3NvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAod29ya09yZGVyLmdldFByZWQoKSA9PSBwcmVkZWNlc3NvcikKLQkJCQlyZXR1cm4gd29ya09yZGVyOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIExvY2F0ZXMgdGhlIHdvcmsgb3JkZXIgYXNzb2NpYXRlZCB3aXRoIHR3byB3b3JrIGJyZWFrZG93biBlbGVtZW50cy4gSWYKLQkgKiBpbmNsdWRlQmFzZSBpcyB0cnVlLCB3aWxsIGNvbGxlY3QgV29ya09yZGVyIGZvciBiYXNlIGVsZW1lbnQgb2YgdGhlCi0JICogcHJlZGVjZXNzb3IgYXMgd2VsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqIEBwYXJhbSBpbmNsdWRlQmFzZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248V29ya09yZGVyPiBmaW5kV29ya09yZGVyKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsIFdvcmtCcmVha2Rvd25FbGVtZW50IHByZWRlY2Vzc29yLCBib29sZWFuIGluY2x1ZGVCYXNlKSB7Ci0JCWlmKCFpbmNsdWRlQmFzZSkgewotCQkJV29ya09yZGVyIHdvID0gZmluZFdvcmtPcmRlcihlLCBwcmVkZWNlc3Nvcik7Ci0JCQlyZXR1cm4gKENvbGxlY3Rpb248V29ya09yZGVyPikgKHdvID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qod28pKTsKLQkJfQotCQlBcnJheUxpc3Q8V29ya09yZGVyPiB3b3JrT3JkZXJzID0gbmV3IEFycmF5TGlzdDxXb3JrT3JkZXI+KCk7Ci0JCWNvbGxlY3RXb3JrT3JkZXJzKHdvcmtPcmRlcnMsIGUsIHByZWRlY2Vzc29yKTsKLQkJcmV0dXJuIHdvcmtPcmRlcnM7Ci0JfQotCQotCS8qKgotCSAqIENvbGxlY3RzIHRoZSBXb3JrT3JkZXIgb2JqZWN0cyBhc3NvY2lhdGVkIGJldHdlZW4gdGhlIHNwZWNpZmllZCB3b3JrCi0JICogYnJlYWtkb3duIGVsZW1lbnQgPGNvZGU+ZTwvY29kZT4gYW5kIHRoZSBwcmVkZWNlc3NvciBvciBhbnkgb2YgaXRzIGJhc2UgZWxlbWVudHMuCi0JICogCi0JICogQHBhcmFtIHdvcmtPcmRlcnMKLQkgKiBAcGFyYW0gZQotCSAqIEBwYXJhbSBwcmVkZWNlc3NvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb2xsZWN0V29ya09yZGVycyhDb2xsZWN0aW9uPFdvcmtPcmRlcj4gd29ya09yZGVycywKLQkJCVdvcmtCcmVha2Rvd25FbGVtZW50IGUsIE9iamVjdCBwcmVkZWNlc3NvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBlLmdldExpbmtUb1ByZWRlY2Vzc29yKCkuaXRlcmF0b3IoKTsgaXRlcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAod29ya09yZGVyLmdldFByZWQoKSA9PSBwcmVkZWNlc3NvcikgewotCQkJCXdvcmtPcmRlcnMuYWRkKHdvcmtPcmRlcik7Ci0JCQl9Ci0JCX0KLQkJaWYocHJlZGVjZXNzb3IgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQpIHsKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCB2ZSA9ICgoVmFyaWFiaWxpdHlFbGVtZW50KXByZWRlY2Vzc29yKS5nZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0JCQlpZih2ZSAhPSBudWxsKSB7Ci0JCQkJY29sbGVjdFdvcmtPcmRlcnMod29ya09yZGVycywgZSwgdmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgd29yayBvcmRlciBhc3NvY2lhdGVkIHdpdGggdHdvIHdvcmsgYnJlYWtkb3duIGVsZW1lbnRzLgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIHdvcmsgYnJlYWtkb3duIGVsZW1lbnQKLQkgKiBAcGFyYW0gcHJlZGVjZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcmVkZWNlc3NvciB3b3JrIGJyZWFrZG93biBlbGVtZW50Ci0JICogQHJldHVybiB0aGUgcmVtb3ZlZCB3b3JrIG9yZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXIgcmVtb3ZlV29ya09yZGVyKFdvcmtCcmVha2Rvd25FbGVtZW50IGUsCi0JCQlPYmplY3QgcHJlZGVjZXNzb3IpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGUuZ2V0TGlua1RvUHJlZGVjZXNzb3IoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQlXb3JrT3JkZXIgb3JkZXIgPSAoV29ya09yZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAob3JkZXIuZ2V0UHJlZCgpID09IHByZWRlY2Vzc29yKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJcmV0dXJuIG9yZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBhcmVudCBwcm9jZXNzIGNvbXBvbmVudCBvZiBhIG1ldGhvZCBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlCi0JICogICAgICAgICAgICBhIG1ldGhvZCBlbGVtZW50LCB0eXBpY2FsbHkgYSBwcm9jZXNzIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgcHJvY2VzcyBjb21wb25lbnQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NDb21wb25lbnQgZ2V0UHJvY2Vzc0NvbXBvbmVudChNZXRob2RFbGVtZW50IGUpIHsKLQkJRU9iamVjdCBjb250YWluZXI7Ci0JCWZvciAoY29udGFpbmVyID0gZTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoKFByb2Nlc3NDb21wb25lbnQpIGNvbnRhaW5lcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgcGFyZW50IG1ldGhvZCB1bml0IG9mIGEgbWV0aG9kIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGUKLQkgKiAgICAgICAgICAgIGEgbWV0aG9kIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgbWV0aG9kIHVuaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFVuaXQgZ2V0TWV0aG9kVW5pdChNZXRob2RFbGVtZW50IGUpIHsKLQkJRU9iamVjdCBjb250YWluZXI7Ci0JCWZvciAoY29udGFpbmVyID0gZTsgY29udGFpbmVyICE9IG51bGwKLQkJCQkmJiAhKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1ldGhvZFVuaXQpOyBjb250YWluZXIgPSBjb250YWluZXIKLQkJCQkuZUNvbnRhaW5lcigpKQotCQkJOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCXJldHVybiAoKE1ldGhvZFVuaXQpIGNvbnRhaW5lcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciBhIG1ldGhvZCBwbHVnLWluIGhhcyBtZXRob2QgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UKLQkgKiBlbGVtZW50cyBpbiBhIGJhc2UgcGx1Zy1pbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIGEgZXhwZW5zaXZlIGNhbGwgdG8gbWFrZSBmb3IgYSBsYXJnZSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIGEgYmFzZSBtZXRob2QgcGx1Zy1pbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBtZXRob2QgcGx1Zy1pbiBjb250YWluCi0JICogICAgICAgICBtZXRob2QgZWxlbWVudHMgdGhhdCByZWZlcmVuY2UgZWxlbWVudHMgaW4gYSBiYXNlIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1JlZmVyZW5jZShNZXRob2RQbHVnaW4gcGx1Z2luLCBNZXRob2RQbHVnaW4gYmFzZSkgewotCQlmb3IgKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvciBmZWF0dXJlSXRlcmF0b3IgPSAoRUNvbnRlbnRzRUxpc3QuRmVhdHVyZUl0ZXJhdG9yKSBwbHVnaW4KLQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IHJlZiA9IChFT2JqZWN0KSBmZWF0dXJlSXRlcmF0b3IubmV4dCgpOwotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSBmZWF0dXJlSXRlcmF0b3IuZmVhdHVyZSgpOwotCi0JCQlpZiAoZiAhPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fQmFzZXMoKQotCQkJCQkmJiBVbWFVdGlsLmdldE1ldGhvZFBsdWdpbihyZWYpID09IGJhc2UpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBsdWdpbi5lQWxsQ29udGVudHMoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlFT2JqZWN0IGVsZW1lbnQgPSAoRU9iamVjdCkgaXRlci5uZXh0KCk7Ci0KLQkJCS8vIGlnbm9yZSBQcm9jZXNzRWxlbWVudCBiL2MgaXQgY2FuIHJlZmVyZW5jZXMgYW55dGhpbmcKLQkJCS8vCi0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBlbGVtZW50LmVDcm9zc1JlZmVyZW5jZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvcgotCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgcmVmID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoZ2V0TWV0aG9kUGx1Z2luKHJlZikgPT0gYmFzZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiBhIG1ldGhvZCBwbHVnLWluIHRoYXQgcG9pbnQgdG8gZWxlbWVudHMKLQkgKiBpbiBhIGJhc2UgcGx1Zy1pbi4KLQkgKiA8cD4KLQkgKiBOb3RlOiBUaGlzIGlzIGEgZXhwZW5zaXZlIGNhbGwgdG8gbWFrZSBmb3IgYSBsYXJnZSBtZXRob2QgcGx1Zy1pbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGx1Z2luCi0JICogICAgICAgICAgICBhIG1ldGhvZCBwbHVnLWluCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIHRoZSBiYXNlIG1ldGhvZCBwbHVnLWluCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIGlzIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlUmVmZXJlbmNlcyhNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJTWV0aG9kUGx1Z2luIGJhc2UpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGx1Z2luLmVBbGxDb250ZW50cygpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUVPYmplY3QgZWxlbWVudCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQotCQkJLy8gaWdub3JlIFByb2Nlc3NFbGVtZW50IGIvYyBpdCBjYW4gcmVmZXJlbmNlcyBhbnl0aGluZwotCQkJLy8KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJZm9yIChFQ29udGVudHNFTGlzdC5GZWF0dXJlSXRlcmF0b3IgZmVhdHVyZUl0ZXJhdG9yID0gKEVDb250ZW50c0VMaXN0LkZlYXR1cmVJdGVyYXRvcikgZWxlbWVudAotCQkJCQkuZUNyb3NzUmVmZXJlbmNlcygpLml0ZXJhdG9yKCk7IGZlYXR1cmVJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU9iamVjdCByZWYgPSAoRU9iamVjdCkgZmVhdHVyZUl0ZXJhdG9yLm5leHQoKTsKLQotCQkJCWlmIChnZXRNZXRob2RQbHVnaW4ocmVmKSA9PSBiYXNlKSB7Ci0JCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gZmVhdHVyZUl0ZXJhdG9yLmZlYXR1cmUoKTsKLQkJCQkJaWYgKGYuaXNNYW55KCkpIHsKLQkJCQkJCSgoQ29sbGVjdGlvbikgZWxlbWVudC5lR2V0KGYpKS5yZW1vdmUocmVmKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWVsZW1lbnQuZVNldChmLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXNzYWdlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobXNnKTsKLQkJCUlTdGF0dXMgc3RhdHVzZXNbXSA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNlcy5sZW5ndGg7IGkrKykgewotCQkJCXN0ckJ1Zi5hcHBlbmQoJ1xuJykuYXBwZW5kKHN0YXR1c2VzW2ldLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQltc2cgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQltc2cgPSBudWxsOwotCQl9Ci0JCXJldHVybiBtc2c7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIGEgR1VJRCB1c2luZyBhIGJhc2UgR1VJRC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUdVSUQKLQkgKiAgICAgICAgICAgIGEgYmFzZSBHVUlECi0JICogQHJldHVybiBhIHVuaXF1ZSBJRAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdlbmVyYXRlR1VJRChTdHJpbmcgYmFzZUdVSUQpIHsKLQkJcmV0dXJuIEdVSUQuZ2VuZXJhdGUoYmFzZUdVSUQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEdVSUQgewotCQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1kNSA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZURpZ2VzdCBnZXRNRDUoKSB7Ci0JCQlpZiAobWQ1ID09IG51bGwpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKEdVSUQuY2xhc3MpIHsKLQkJCQkJaWYgKG1kNSA9PSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewotCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbWQ1OwotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2VuZXJhdGUoU3RyaW5nIGJhc2VHVUlEKSB7Ci0JCQlNZXNzYWdlRGlnZXN0IG1kNSA9IGdldE1ENSgpOwotCQkJbWQ1LnVwZGF0ZShiYXNlR1VJRC5nZXRCeXRlcygpKTsKLQkJCWJ5dGVbXSBoYXNoID0gbWQ1LmRpZ2VzdCgpOwotCQkJY2hhcltdIGJ1ZmZlciA9IG5ldyBjaGFyWzIzXTsKLQkJCWJ1ZmZlclswXSA9ICctJzsKLQotCQkJLy8gRG8gYSBiYXNlIDY0IGNvbnZlcnNpb24gYnkgdHVybmluZyBldmVyeSAzIGJ5dGVzIGludG8gNCBiYXNlIDY0Ci0JCQkvLyBjaGFyYWN0ZXJzCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKLQkJCQlidWZmZXJbNCAqIGkgKyAxXSA9IEJBU0U2NF9ESUdJVFNbKGhhc2hbaSAqIDNdID4+IDIpICYgMHgzRl07Ci0JCQkJYnVmZmVyWzQgKiBpICsgMl0gPSBCQVNFNjRfRElHSVRTWygoaGFzaFtpICogM10gPDwgNCkgJiAweDMwKQotCQkJCQkJfCAoKGhhc2hbaSAqIDMgKyAxXSA+PiA0KSAmIDB4RildOwotCQkJCWJ1ZmZlcls0ICogaSArIDNdID0gQkFTRTY0X0RJR0lUU1soKGhhc2hbaSAqIDMgKyAxXSA8PCAyKSAmIDB4M0MpCi0JCQkJCQl8ICgoaGFzaFtpICogMyArIDJdID4+IDYpICYgMHgzKV07Ci0JCQkJYnVmZmVyWzQgKiBpICsgNF0gPSBCQVNFNjRfRElHSVRTW2hhc2hbaSAqIDMgKyAyXSAmIDB4M0ZdOwotCQkJfQotCi0JCQkvLyBIYW5kbGUgdGhlIGxhc3QgYnl0ZSBhdCB0aGUgZW5kLgotCQkJLy8KLQkJCWJ1ZmZlclsyMV0gPSBCQVNFNjRfRElHSVRTWyhoYXNoWzE1XSA+PiAyKSAmIDB4M0ZdOwotCQkJYnVmZmVyWzIyXSA9IEJBU0U2NF9ESUdJVFNbKGhhc2hbMTVdIDw8IDQpICYgMHgzMF07Ci0KLQkJCXJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlcik7Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gQkFTRTY0X0RJR0lUUyA9IHsgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsCi0JCQkJJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywKLQkJCQknUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYScsICdiJywgJ2MnLAotCQkJCSdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsCi0JCQkJJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsICcwJywKLQkJCQknMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnLScsICdfJyB9OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihnZW5lcmF0ZUdVSUQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYvdW1hL3V0aWwvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzc3NmViLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi91bWEvdXRpbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIFVNQSBtb2RlbCBvYmplY3RzLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5jbGFzc3BhdGggYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ub3B0aW9ucyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzg0MmZjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIFR1cm4gb24gZGVidWcgdHJhY2UgZm9yIHRoZSBDb21tb24gcGx1Zy1pbgotb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vZGVidWc9dHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlZTJkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxOGUyNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgRmViIDAxIDE3OjAzOjQ1IFBTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9SZXNvdXJjZXMucHJvcGVydGllcz04ODU5XzEKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzljZWEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb247c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5BY3RpdmF0b3IKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQsCi0gb3JnLmVjbGlwc2UudWkKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24sCi0gb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMsCi0gb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMzRmNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlhY2QxNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uLgotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLSMgUGx1Zy1pbgotcGx1Z2luTmFtZT1FUEYgVmFsaWRhdGlvbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhN2ZjNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5jb25zdHJhaW50UHJvdmlkZXJzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmxpYnJhcnkuY2F0ZWdvcnkiCi0gICAgICAgICAgICBuYW1lPSJNZXRob2QgTGlicmFyeSBDb25zdHJhaW50cyIvPgotICAgICAgPGNvbnN0cmFpbnRQcm92aWRlcgotICAgICAgICAgICAgY2FjaGU9InRydWUiCi0gICAgICAgICAgICA+Ci0gICAgICAgICA8cGFja2FnZSBuYW1lc3BhY2VVcmk9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiLz4KLSAgICAgICAgIDxjb25zdHJhaW50cyBjYXRlZ29yaWVzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5saWJyYXJ5LmNhdGVnb3J5Ij4KLSAgICAgICAgICAgIDxjb25zdHJhaW50Ci0gICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTmFtZUNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTmFtZUNvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBsYW5nPSJKYXZhIgotICAgICAgICAgICAgICAgICAgbW9kZT0iQmF0Y2giCi0gICAgICAgICAgICAgICAgICBuYW1lPSJOYW1lIENvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBzZXZlcml0eT0iRVJST1IiCi0gICAgICAgICAgICAgICAgICBzdGF0dXNDb2RlPSIxIj4KLSAgICAgICAgICAgICAgIDxtZXNzYWdlPgotICAgICAgICAgICAgICAgICAgQSB7MH0gaGFzIGJlZW4gZm91bmQgdG8gaGF2ZSBjaGlsZHJlbiB3aXRoIGludmFsaWQgbmFtZSBvciBwcmVzZW50YXRpb24gbmFtZQotICAgICAgICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgICAgPC9jb25zdHJhaW50PgotICAgICAgICAgICAgPGNvbnN0cmFpbnQKLSAgICAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50cy5SZWxhdGlvbnNoaXBDb25zdHJhaW50IgotICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlJlbGF0aW9uc2hpcENvbnN0cmFpbnQiCi0gICAgICAgICAgICAgICAgICBsYW5nPSJKYXZhIgotICAgICAgICAgICAgICAgICAgbW9kZT0iQmF0Y2giCi0gICAgICAgICAgICAgICAgICBuYW1lPSJSZWxhdGlvbnNoaXAgQ29uc3RyYWludCIKLSAgICAgICAgICAgICAgICAgIHNldmVyaXR5PSJFUlJPUiIKLSAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU9IjIiPgotICAgICAgICAgICAgICAgPG1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICBBIHswfSBoYXMgYmVlbiBmb3VuZCB0byBoYXZlIGludmFsaWQgcmVsYXRpb25zaGlwCi0gICAgICAgICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICAgICA8L2NvbnN0cmFpbnQ+Ci0gICAgICAgICA8L2NvbnN0cmFpbnRzPgotICAgICAgPC9jb25zdHJhaW50UHJvdmlkZXI+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLmNvbnN0cmFpbnRCaW5kaW5ncyI+Ci0gICAgICA8Y2xpZW50Q29udGV4dAotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5saWJyYXJ5LmRlZmF1bHRDbGllbnRDb250ZXh0Ij4KLSAgICAgICAgIDxlbmFibGVtZW50PgotICAgICAgICAgICAgPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudCIvPgotICAgICAgICAgPC9lbmFibGVtZW50PgotICAgICAgPC9jbGllbnRDb250ZXh0PgotICAgPC9leHRlbnNpb24+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi50cmF2ZXJzYWwiPgotICAgICAgPHRyYXZlcnNhbFN0cmF0ZWd5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5IgotICAgICAgICAgICAgbmFtZXNwYWNlVXJpPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIj4KLSAgICAgIDxzdGFydHVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsLlN0YXJ0dXAiLz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2MzNiNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2lucyNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL0xpYnJhcnlFVmFsaWRhdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vTGlicmFyeUVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ4NDEzNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vTGlicmFyeUVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkJhc2ljRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpY0NoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuSVRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLkV2YWx1YXRpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm1vZGVsLklDb25zdHJhaW50U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUJhdGNoVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUNvbnN0cmFpbnREZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuSUNvbnN0cmFpbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uc2VydmljZS5Nb2RlbFZhbGlkYXRpb25TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LklBZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5EZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQucHJvY2Vzcy5JQlNJdGVtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5EZXBlbmRlbmN5VmFsaWRhdGlvbk1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uSVZhbGlkYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHMuTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLnV0aWwuVmFsaWRhdGlvblN0YXR1czsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgcGx1Z3MgdGhlIEVNRiBNb2RlbCBWYWxpZGF0aW9uIFNlcnZpY2UgQVBJIGludG8gdGhlCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3J9IEFQSS4KLSAqIAotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlFVmFsaWRhdG9yIGV4dGVuZHMgRU9iamVjdFZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgZmVhdHVyZVRvUHJvcGVydHlNYXAgPSBjcmVhdGVGZWF0dXJlVG9BdHRyaWJ1dGVNYXAoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENUWF9BREFQVEVSX0ZBQ1RPUllfUFJPVklERVIgPSAiQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUiA9ICJDVFhfREVQRU5ERU5DWV9WQUxJREFUSU9OX01HUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVFhfQ09OU1RSQUlOVF9GSUxURVIgPSAiQ1RYX0NPTlNUUkFJTlRfRklMVEVSIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUkFJTlRfQ0FURUdPUlkgPSAib3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubGlicmFyeS5jYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIE1hcCBjcmVhdGVGZWF0dXJlVG9BdHRyaWJ1dGVNYXAoKSB7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQltYXAucHV0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9OQU1FKTsKLQkJbWFwLnB1dChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSwgSUJTSXRlbVByb3ZpZGVyLkNPTF9QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCS8qKgotCSAqIE1vZGVsIFZhbGlkYXRpb24gU2VydmljZSBpbnRlcmZhY2UgZm9yIGJhdGNoIHZhbGlkYXRpb24gb2YgRU1GIGVsZW1lbnRzLgotCSAqLwotCXByaXZhdGUgZmluYWwgSUJhdGNoVmFsaWRhdG9yIGJhdGNoVmFsaWRhdG9yOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgbWUuCi0JICovCi0JcHVibGljIExpYnJhcnlFVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCi0JCWJhdGNoVmFsaWRhdG9yID0gKElCYXRjaFZhbGlkYXRvcikgTW9kZWxWYWxpZGF0aW9uU2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLm5ld1ZhbGlkYXRvcihFdmFsdWF0aW9uTW9kZS5CQVRDSCk7Ci0JCWJhdGNoVmFsaWRhdG9yLnNldEluY2x1ZGVMaXZlQ29uc3RyYWludHModHJ1ZSk7Ci0JCWJhdGNoVmFsaWRhdG9yLnNldFJlcG9ydFN1Y2Nlc3NlcyhmYWxzZSk7Ci0JCWJhdGNoVmFsaWRhdG9yLmFkZENvbnN0cmFpbnRGaWx0ZXIobmV3IElDb25zdHJhaW50RmlsdGVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSUNvbnN0cmFpbnREZXNjcmlwdG9yIGNvbnN0cmFpbnQsCi0JCQkJCUVPYmplY3QgdGFyZ2V0KSB7Ci0JCQkJU2V0PENhdGVnb3J5PiBjYXRlZ29yaWVzID0gY29uc3RyYWludC5nZXRDYXRlZ29yaWVzKCk7Ci0JCQkJaWYoY2F0ZWdvcmllcyAhPSBudWxsICYmICFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotCQkJCQlmb3IgKEl0ZXJhdG9yPENhdGVnb3J5PiBpdGVyYXRvciA9IGNhdGVnb3JpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkuaGFzTmV4dCgpOykgewotCQkJCQkJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWlmKENPTlNUUkFJTlRfQ0FURUdPUlkuZXF1YWxzKGNhdGVnb3J5LmdldElkKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCX0pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVPYmplY3QgZU9iamVjdCwgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzLAotCQkJTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHZhbGlkYXRlKGVPYmplY3QuZUNsYXNzKCksIGVPYmplY3QsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRzIHZhbGlkYXRpb24gYnkgZGVsZWdhdGlvbiB0byB0aGUgRU1GIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVDbGFzcyBlQ2xhc3MsIEVPYmplY3QgZU9iamVjdCwKLQkJCURpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJLy8gZmlyc3QsIGRvIHdoYXRldmVyIHRoZSBiYXNpYyBFY29yZVZhbGlkYXRvciBkb2VzCi0JCS8vIHN1cGVyLnZhbGlkYXRlKGVDbGFzcywgZU9iamVjdCwgZGlhZ25vc3RpY3MsIGNvbnRleHQpOwotCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlib29sZWFuIGNpcmN1bGFyQ2hlY2tPayA9IHRydWU7Ci0JCURlcGVuZGVuY3lWYWxpZGF0aW9uTWdyIG1nciA9IChEZXBlbmRlbmN5VmFsaWRhdGlvbk1ncikgY29udGV4dC5nZXQoQ1RYX0RFUEVOREVOQ1lfVkFMSURBVElPTl9NR1IpOwotCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2sgJiYgbWdyICE9IG51bGwgJiYgCi0JCQkJKGVPYmplY3QgaW5zdGFuY2VvZiBWYXJpYWJpbGl0eUVsZW1lbnQgfHwgZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbikpIHsKLQkJCXN0YXR1cyA9IG1nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSgoTWV0aG9kRWxlbWVudCkgZU9iamVjdCk7Ci0JCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCWNpcmN1bGFyQ2hlY2tPayA9IGZhbHNlOwotCQkJCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCWlmKFN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJCS8vbXNnID0gTkxTLmJpbmQoVmFsaWRhdGlvblJlc291cmNlcy5jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3IsIHJlZi5nZXRFQ29udGFpbmluZ0NsYXNzKCkuZ2V0TmFtZSgpLCByZWYuZ2V0TmFtZSgpKTsKLQkJCQkJbXNnID0gVmFsaWRhdGlvblJlc291cmNlcy5jaXJjdWxhckRlcGVuZGVuY3lfZXJyb3I7Ci0JCQkJfQotCQkJCWFwcGVuZERpYWdub3N0aWNzKHN0YXR1cywgZGlhZ25vc3RpY3MpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBubyBwb2ludCBpbiB2YWxpZGF0aW5nIGlmIHdlIGNhbid0IHJlcG9ydCByZXN1bHRzCi0JCWlmIChkaWFnbm9zdGljcyAhPSBudWxsKSB7Ci0JCQkvLyBpZiBFTUYgTW9kZSBWYWxpZGF0aW9uIFNlcnZpY2UgYWxyZWFkeSBjb3ZlcmVkIHRoZSBzdWItdHJlZSwKLQkJCS8vIHdoaWNoIGl0IGRvZXMgZm9yIGVmZmljaWVudCBjb21wdXRhdGlvbiBhbmQgZXJyb3IgcmVwb3J0aW5nLAotCQkJLy8gdGhlbiBkb24ndCByZXBlYXQgKHRoZSBEaWFnbm9zdGljaWFuIGRvZXMgdGhlIHJlY3Vyc2lvbgotCQkJLy8gZXh0ZXJuYWxseSkuIElmIHRoZXJlIGlzIG5vIGNvbnRleHQgbWFwLCB0aGVuIHdlIGNhbid0Ci0JCQkvLyBoZWxwIGl0Ci0JCQlpZiAoIWhhc1Byb2Nlc3NlZChlT2JqZWN0LCBjb250ZXh0KSkgewotCQkJCWlmIChnZXRUcmF2ZXJzYWxUeXBlKGNvbnRleHQpID09IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5ERUVQKSB7Ci0JCQkJCWJhdGNoVmFsaWRhdG9yCi0JCQkJCQkJLnNldFRyYXZlcnNhbFN0cmF0ZWd5KExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5kZWVwVHJhdmVyc2FsU3RyYXRlZ3kpOwotCQkJCX0KLQkJCQkKLQkJCQlJQ29uc3RyYWludEZpbHRlciBmaWx0ZXIgPSAoSUNvbnN0cmFpbnRGaWx0ZXIpIGNvbnRleHQuZ2V0KENUWF9DT05TVFJBSU5UX0ZJTFRFUik7Ci0JCQkJaWYoZmlsdGVyICE9IG51bGwpIHsKLQkJCQkJYmF0Y2hWYWxpZGF0b3IuYWRkQ29uc3RyYWludEZpbHRlcihmaWx0ZXIpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlzdGF0dXMgPSBiYXRjaFZhbGlkYXRvci52YWxpZGF0ZShlT2JqZWN0LAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkgewotCQkJCQkJYmF0Y2hWYWxpZGF0b3IucmVtb3ZlQ29uc3RyYWludEZpbHRlcihmaWx0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcHJvY2Vzc2VkKGVPYmplY3QsIGNvbnRleHQsIHN0YXR1cyk7Ci0KLQkJCQlhcHBlbmREaWFnbm9zdGljcyhzdGF0dXMsIGRpYWdub3N0aWNzKTsKLQkJCX0KLQkJfQotCi0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJUHJvY2VzcyBwcm9jID0gKChQcm9jZXNzQ29tcG9uZW50KSBlT2JqZWN0KS5nZXRQcm9jZXNzKCk7Ci0JCQlpZiAocHJvYyAhPSBudWxsKSB7Ci0JCQkJdmFsaWRhdGVQcm9jZXNzKHByb2MsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjaXJjdWxhckNoZWNrT2sgJiYgc3RhdHVzLmlzT0soKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHByb2MKLQkgKiBAcGFyYW0gZGlhZ25vc3RpY3MKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUHJvY2VzcyhQcm9jZXNzIHByb2MsIGZpbmFsIERpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywKLQkJCU1hcCBjb250ZXh0KSB7Ci0JCU9iamVjdCBvID0gY29udGV4dC5nZXQoQ1RYX0FEQVBURVJfRkFDVE9SWV9QUk9WSURFUik7Ci0JCWlmICghKG8gaW5zdGFuY2VvZiBJQWRhcHRlckZhY3RvcnlQcm92aWRlcikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNsYXNzIEZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvciB7Ci0JCQkKLQkJCXB1YmxpYyBGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yKEFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJc3VwZXIoYWRhcHRlckZhY3RvcnksIG9iamVjdCk7Ci0JCQl9Ci0JCQkKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChPYmplY3QgY2hpbGQpIHsKLQkJCQlyZXR1cm4gY2hpbGQgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQ7Ci0JCQl9Ci0JCQkKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKiAKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVkaXQucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IjZ2V0Q2hpbGRyZW4oamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN1cGVyLmdldENoaWxkcmVuKG8pOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJT2JqZWN0IGNoaWxkID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQKLQkJCQkJCQl8fCAoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnRXcmFwcGVySXRlbVByb3ZpZGVyCi0JCQkJCQkJJiYgISgoRGVzY3JpYmFibGVFbGVtZW50V3JhcHBlckl0ZW1Qcm92aWRlcikgY2hpbGQpLmlzUmVhZE9ubHkoKSkpIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCQljaGlsZCA9IFRuZ1V0aWwudW53cmFwKGNoaWxkKTsKLQkJCQkJfQotCQkJCQlpZiAoYWNjZXB0KGNoaWxkKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJZmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVF9fTkFNRSk7Ci0JCQkJCQkJaWYoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQkJCQkJZmVhdHVyZXMuYWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKTsKLQkJCQkJCQl9Ci0JCQkJCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBjaGlsZDsKLQkJCQkJCQlpZiAoZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCQkJCQkJLy9jb250aW51ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCQkJU3lzdGVtLm91dAotCQkJCQkJCQkJCS5wcmludGxuKCJGaWx0ZXJlZEFkYXB0ZXJGYWN0b3J5VHJlZUl0ZXJhdG9yLmdldENoaWxkcmVuKCk6IHZhbGlkYXRpbmcgJyIgKyBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IKLQkJCQkJCQkJCS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gKEVTdHJ1Y3R1cmFsRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkJCQkJLmNyZWF0ZVZhbGlkYXRvcihvLCBudWxsLAotCQkJCQkJCQkJCQkJKEVPYmplY3QpIGNoaWxkLCBmZWF0dXJlLAotCQkJCQkJCQkJCQkJYWRhcHRlckZhY3RvcnkpOwotCQkJCQkJCQlPYmplY3QgaXRlbVByb3ZpZGVyID0gYWRhcHRlckZhY3RvcnkuYWRhcHQoY2hpbGQsIElUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5jbGFzcyk7Ci0JCQkJCQkJCVN0cmluZyBwcm9wID0gKFN0cmluZykgZmVhdHVyZVRvUHJvcGVydHlNYXAuZ2V0KGZlYXR1cmUpOwotCQkJCQkJCQlTdHJpbmcgbmFtZTsKLQkJCQkJCQkJaWYoaXRlbVByb3ZpZGVyIGluc3RhbmNlb2YgSUJTSXRlbVByb3ZpZGVyICYmIHByb3AgIT0gbnVsbCkgewotCQkJCQkJCQkJbmFtZSA9ICgoSUJTSXRlbVByb3ZpZGVyKWl0ZW1Qcm92aWRlcikuZ2V0QXR0cmlidXRlKGNoaWxkLCBwcm9wKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCW5hbWUgPSAoU3RyaW5nKSBlLmVHZXQoZmVhdHVyZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJU3RyaW5nIG1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpOwotCQkJCQkJCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCQkJCQkJCWFwcGVuZERpYWdub3N0aWNzKG5ldyBWYWxpZGF0aW9uU3RhdHVzKAotCQkJCQkJCQkJCQlJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGUsIGZlYXR1cmUpLAotCQkJCQkJCQkJCQlkaWFnbm9zdGljcyk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCQotCQkJCXJldHVybiBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCQlJQWRhcHRlckZhY3RvcnlQcm92aWRlciBwcm92aWRlciA9IChJQWRhcHRlckZhY3RvcnlQcm92aWRlcikgbzsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBuZXcgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihwcm92aWRlcgotCQkJCS5nZXRXQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKTsKLQkJZm9yICg7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJOwotCQkKLQkJaXRlcmF0b3IgPSBuZXcgRmlsdGVyZWRBZGFwdGVyRmFjdG9yeVRyZWVJdGVyYXRvcihwcm92aWRlci5nZXRUQlNBZGFwdGVyRmFjdG9yeSgpLCBwcm9jKSB7Ci0JCQkvKioKLQkJCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCQkgKi8KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlICNhY2NlcHQoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBjaGlsZCkgewotCQkJCXJldHVybiBjaGlsZCBpbnN0YW5jZW9mIFJvbGVEZXNjcmlwdG9yIHx8IGNoaWxkIGluc3RhbmNlb2YgVGVhbVByb2ZpbGU7Ci0JCQl9Ci0JCX07Ci0JCWZvciAoOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCTsKLQkJCi0JCWl0ZXJhdG9yID0gbmV3IEZpbHRlcmVkQWRhcHRlckZhY3RvcnlUcmVlSXRlcmF0b3IocHJvdmlkZXIuZ2V0V1BCU0FkYXB0ZXJGYWN0b3J5KCksIHByb2MpIHsKLQkJCS8qKgotCQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgI2FjY2VwdChqYXZhLmxhbmcuT2JqZWN0KQotCQkJICovCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IGNoaWxkKSB7Ci0JCQkJcmV0dXJuIGNoaWxkIGluc3RhbmNlb2YgV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCQkJfQotCQl9OwotCQlmb3IgKDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpdGVyYXRvci5uZXh0KCkpCi0JCQk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRyYXZlcnNhbFR5cGUoTWFwIGNvbnRleHQpIHsKLQkJT2JqZWN0IHR5cGUgPSBjb250ZXh0LmdldChMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuVFJBVkVSU0FMX1RZUEUpOwotCQlyZXR1cm4gKHR5cGUgaW5zdGFuY2VvZiBOdW1iZXIgJiYgKChOdW1iZXIpIHR5cGUpLmludFZhbHVlKCkgPT0gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LkRFRVApID8gTGlicmFyeVRyYXZlcnNhbFN0cmF0ZWd5LkRFRVAKLQkJCQk6IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5TSEFET1c7Ci0JfQotCi0JLyoqCi0JICogRGlyZWN0IHZhbGlkYXRpb24gb2Yge0BsaW5rIEVEYXRhVHlwZX1zIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEVNRgotCSAqIHZhbGlkYXRpb24gZnJhbWV3b3JrOyB0aGV5IGFyZSB2YWxpZGF0ZWQgaW5kaXJlY3RseSB2aWEgdGhlCi0JICoge0BsaW5rIEVPYmplY3R9cyB0aGF0IGhvbGQgdGhlaXIgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCB2YWx1ZSwKLQkJCURpYWdub3N0aWNDaGFpbiBkaWFnbm9zdGljcywgTWFwIGNvbnRleHQpIHsKLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGVEYXRhVHlwZSwgdmFsdWUsIGRpYWdub3N0aWNzLCBjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBoYXZlIGEgY29udGV4dCBtYXAsIHJlY29yZCB0aGlzIG9iamVjdCdzIDxjb2RlPnN0YXR1czwvY29kZT4gaW4KLQkgKiBpdCBzbyB0aGF0IHdlIHdpbGwga25vdyBsYXRlciB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGl0IGFuZCBpdHMgc3ViLXRyZWUuCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIGFuIGVsZW1lbnQgdGhhdCB3ZSBoYXZlIHZhbGlkYXRlZAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICB0aGUgY29udGV4dCAobWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+KQotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50J3MgdmFsaWRhdGlvbiBzdGF0dXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc2VkKEVPYmplY3QgZU9iamVjdCwgTWFwIGNvbnRleHQsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWNvbnRleHQucHV0KGVPYmplY3QsIHN0YXR1cyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgd2UgaGF2ZSBwcm9jZXNzZWQgdGhpcyA8Y29kZT5lT2JqZWN0PC9jb2RlPiBiZWZvcmUsCi0JICogYnkgYXV0b21hdGljIHJlY3Vyc2lvbiBvZiB0aGUgRU1GIE1vZGVsIFZhbGlkYXRpb24gU2VydmljZS4gVGhpcyBpcyBvbmx5Ci0JICogcG9zc2libGUgaWYgd2UgZG8sIGluZGVlZCwgaGF2ZSBhIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGVPYmplY3QKLQkgKiAgICAgICAgICAgIGFuIGVsZW1lbnQgdG8gYmUgdmFsaWRhdGVkICh3ZSBob3BlIG5vdCkKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgKG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPikKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb250ZXh0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQKLQkgKiAgICAgICAgIHRoZSA8Y29kZT5lT2JqZWN0PC9jb2RlPiBvciBvbmUgb2YgaXRzIGNvbnRhaW5lcnMgaGFzIGFscmVhZHkKLQkgKiAgICAgICAgIGJlZW4gdmFsaWRhdGVkOyA8Y29kZT5mYWxzZTwvY29kZT4sIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNQcm9jZXNzZWQoRU9iamVjdCBlT2JqZWN0LCBNYXAgY29udGV4dCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCS8vIHRoaXMgaXMgTyhObG9nTikgYnV0IHRoZXJlJ3Mgbm8gaGVscGluZyBpdAotCQkJd2hpbGUgKGVPYmplY3QgIT0gbnVsbCkgewotCQkJCWlmIChjb250ZXh0LmNvbnRhaW5zS2V5KGVPYmplY3QpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWVPYmplY3QgPSBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVPYmplY3QgPSBlT2JqZWN0LmVDb250YWluZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RhdHVzIHJlc3VsdCBmcm9tIHRoZSBFTUYgdmFsaWRhdGlvbiBzZXJ2aWNlIHRvIGRpYWdub3N0aWNzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMKLQkgKiAgICAgICAgICAgIHRoZSBFTUYgdmFsaWRhdGlvbiBzZXJ2aWNlJ3Mgc3RhdHVzIHJlc3VsdAotCSAqIEBwYXJhbSBkaWFnbm9zdGljcwotCSAqICAgICAgICAgICAgYSBkaWFnbm9zdGljIGNoYWluIHRvIGFjY3VtdWxhdGUgcmVzdWx0cyBvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmREaWFnbm9zdGljcyhJU3RhdHVzIHN0YXR1cywgRGlhZ25vc3RpY0NoYWluIGRpYWdub3N0aWNzKSB7Ci0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERpYWdub3N0aWNzKGNoaWxkcmVuW2ldLCBkaWFnbm9zdGljcyk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoc3RhdHVzIGluc3RhbmNlb2YgSUNvbnN0cmFpbnRTdGF0dXMpIHsKLQkJCWRpYWdub3N0aWNzLmFkZChuZXcgQmFzaWNEaWFnbm9zdGljKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMKLQkJCQkJLmdldFBsdWdpbigpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotCQkJCQkoKElDb25zdHJhaW50U3RhdHVzKSBzdGF0dXMpLmdldFJlc3VsdExvY3VzKCkudG9BcnJheSgpKSk7Ci0JCX0gZWxzZSBpZiAoc3RhdHVzIGluc3RhbmNlb2Ygb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0dXMpIHsKLQkJCWRpYWdub3N0aWNzLmFkZChuZXcgQmFzaWNEaWFnbm9zdGljKHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMKLQkJCQkJLmdldFBsdWdpbigpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLAotCQkJCQluZXcgT2JqZWN0W10geyAoKG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5WYWxpZGF0aW9uU3RhdHVzKSBzdGF0dXMpCi0JCQkJCQkJLmdldENoZWNrZWRPYmplY3QoKSB9KSk7Ci0JCX0gZWxzZSB7Ci0JCQlkaWFnbm9zdGljcy5hZGQobmV3IEJhc2ljRGlhZ25vc3RpYyhzdGF0dXMuZ2V0U2V2ZXJpdHkoKSwgc3RhdHVzCi0JCQkJCS5nZXRQbHVnaW4oKSwgc3RhdHVzLmdldENvZGUoKSwgc3RhdHVzLmdldE1lc3NhZ2UoKSwKLQkJCQkJbnVsbCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vUmVzb3VyY2VzLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MmE0MjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCi0jLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLQotY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yPUN5Y2xlcyBmb3VuZCBpbiB0aGUgZGVwZW5kZW5jeSBncmFwaCBvZiB0aGUgYXNzb2NpYXRpb24gezB9LnsxfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXNvdXJjZXMuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9WYWxpZGF0aW9uUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDU0NDkuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL1ZhbGlkYXRpb25SZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvblJlc291cmNlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLlJlc291cmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvcjsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBWYWxpZGF0aW9uUmVzb3VyY2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFZhbGlkYXRpb25SZXNvdXJjZXMoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL0xpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL0xpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIzNDUxLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9MaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVDb250ZW50c0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbC5Db250ZW50VHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLnNlcnZpY2UuQWJzdHJhY3RUcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5zZXJ2aWNlLklUcmF2ZXJzYWxTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuTW9kZWxTdHJ1Y3R1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlhZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLlVtYVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBQaG9uZyBOZ3V5ZW4gTGUKLSAqIEBzaW5jZSAgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3kgZXh0ZW5kcyBBYnN0cmFjdFRyYXZlcnNhbFN0cmF0ZWd5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFWRVJTQUxfVFlQRSA9ICJUUkFWRVJTQUxfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUcmF2ZXJzYWwgc3RyYXRlZ3kgdHlwZSBjb25zdGFudCBmb3Igc2hhZG93IHRyYXZlcnNhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNIQURPVyA9IDA7Ci0JCi0JLyoqCi0JICogVHJhdmVyc2FsIHN0cmF0ZWd5IHR5cGUgY29uc3RhbnQgZm9yIGRlZXAgdHJhdmVyc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVFUCA9IDE7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJVHJhdmVyc2FsU3RyYXRlZ3kgZGVlcFRyYXZlcnNhbFN0cmF0ZWd5ID0gbmV3IExpYnJhcnlUcmF2ZXJzYWxTdHJhdGVneShERUVQKTsKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIExpYnJhcnlJdGVyYXRvciBleHRlbmRzIENvbnRlbnRUcmVlSXRlcmF0b3IgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTE3NTQyODAyNzUwMzQ0MDk3MEw7Ci0JCXByaXZhdGUgaW50IHRyYXZlcnNhbFR5cGUgPSBERUVQOwotCQkKLQkJcHJvdGVjdGVkIExpYnJhcnlJdGVyYXRvcihDb2xsZWN0aW9uIGVtZk9iamVjdHMpIHsKLQkJCXN1cGVyKGVtZk9iamVjdHMpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHBhcmFtIG9iamVjdAotCQkgKiBAcGFyYW0gaXNSZXNvbHZlUHJveGllcwotCQkgKi8KLQkJcHVibGljIExpYnJhcnlJdGVyYXRvcihDb2xsZWN0aW9uIGVPYmplY3RzLCBib29sZWFuIGlzUmVzb2x2ZVByb3hpZXMsIGludCB0cmF2ZXJzYWxUeXBlLCBib29sZWFuIGRpc2pvaW50KSB7Ci0JCQlzdXBlcihkaXNqb2ludCA/IG1ha2VUYXJnZXRzRGlzam9pbnQoZU9iamVjdHMpIDogZU9iamVjdHMsIGlzUmVzb2x2ZVByb3hpZXMpOwotCQkJdGhpcy50cmF2ZXJzYWxUeXBlICA9IHRyYXZlcnNhbFR5cGU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmF0b3I8Pz4gZ2V0RU9iamVjdENoaWxkcmVuKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZih0cmF2ZXJzYWxUeXBlID09IERFRVApIHsKLQkJCQlpZighKG9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpCi0JCQkJCQl8fCAob2JqZWN0IGluc3RhbmNlb2YgQ29uc3RyYWludCB8fCBvYmplY3QgaW5zdGFuY2VvZiBEaWFncmFtRWxlbWVudCkpIAotCQkJCXsKLQkJCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEVPYmplY3RDaGlsZHJlbihvYmplY3QpOwotCQkJfQotCQkJCi0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4oKEN1c3RvbUNhdGVnb3J5KW9iamVjdCwgVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTLAotCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUlkpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCQl8fCBvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RDb25maWd1cmF0aW9uCi0JCQkJCXx8IG9iamVjdCBpbnN0YW5jZW9mIENvbnRlbnRFbGVtZW50Ci0JCQkpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCU1ldGhvZFBhY2thZ2UgcGtnID0gKE1ldGhvZFBhY2thZ2UpIG9iamVjdDsKLQkJCQlpZihUbmdVdGlsLmlzUHJlZGVmaW5lZChwa2cpICYmIE1vZGVsU3RydWN0dXJlLkNVU1RPTV9DQVRFR09SWV9QQUNLQUdFX05BTUUuZXF1YWxzKHBrZy5nZXROYW1lKCkpKSB7Ci0JCQkJCS8vIHRoaXMgaXMgdGhlIGNvbnRlbnQgcGFja2FnZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgY3VzdG9tIGNhdGVnb3JpZXMKLQkJCQkJLy8gcmV0dXJuIHJvb3QgY3VzdG9tIGNhdGVnb3J5IGFzIGl0cyBvbmx5IGNoaWxkCi0JCQkJCS8vCi0JCQkJCUNvbnRlbnRQYWNrYWdlIGhpZGRlblBrZyA9IFVtYVV0aWwuZmluZENvbnRlbnRQYWNrYWdlKHBrZwotCQkJCQkJCS5nZXRDaGlsZFBhY2thZ2VzKCksIE1vZGVsU3RydWN0dXJlLkhJRERFTl9QQUNLQUdFX05BTUUpOwotCQkJCQlpZiAoaGlkZGVuUGtnICE9IG51bGwgJiYgIWhpZGRlblBrZy5nZXRDb250ZW50RWxlbWVudHMoKS5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybiBoaWRkZW5Qa2cuZ2V0Q29udGVudEVsZW1lbnRzKCkuaXRlcmF0b3IoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4ocGtnLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJCXJldHVybiBnZXRFT2JqZWN0Q2hpbGRyZW4oCi0JCQkJCQkoTWV0aG9kTGlicmFyeSkgb2JqZWN0LAotCQkJCQkJbmV3IEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIHsKLQkJCQkJCQkJVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTlMsCi0JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMgfSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gZ2V0RU9iamVjdENoaWxkcmVuKChFT2JqZWN0KSBvYmplY3QsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0VTLCBudWxsKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCA9PSB0aGlzLm9iamVjdCkgewotCQkJCXJldHVybiAoKENvbGxlY3Rpb24pb2JqZWN0KS5pdGVyYXRvcigpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpOwotCQl9Ci0JCQotCQlwcml2YXRlIEl0ZXJhdG9yIGdldEVPYmplY3RDaGlsZHJlbihFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCQlFQ29udGVudHNFTGlzdCBsaXN0ID0gbmV3IEVDb250ZW50c0VMaXN0KGVPYmplY3QsIGZlYXR1cmVzKTsKLQkJCXJldHVybiBpc1Jlc29sdmVQcm94aWVzKCkgPyBsaXN0Lml0ZXJhdG9yKCkgOiBsaXN0LmJhc2ljSXRlcmF0b3IoKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJdGVyYXRvciBnZXRFT2JqZWN0Q2hpbGRyZW4oRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZmVyZW5jZSwgRUNsYXNzIGVDbGFzcykgewotCQkJSXRlcmF0b3IgaXRlcjsKLQkJCWlmKHJlZmVyZW5jZS5pc01hbnkoKSkgewotCQkJCWJvb2xlYW4gcmVzb2x2ZSA9IGlzUmVzb2x2ZVByb3hpZXMoKTsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgZU9iamVjdC5lR2V0KHJlZmVyZW5jZSwgcmVzb2x2ZSk7Ci0JCQkJaXRlciA9ICFyZXNvbHZlICYmIChsaXN0IGluc3RhbmNlb2YgSW50ZXJuYWxFTGlzdCkgPyAoKEludGVybmFsRUxpc3QpbGlzdCkuYmFzaWNJdGVyYXRvcigpIDogbGlzdC5pdGVyYXRvcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gZU9iamVjdC5lR2V0KHJlZmVyZW5jZSwgaXNSZXNvbHZlUHJveGllcygpKTsKLQkJCQlpdGVyID0gdmFsdWUgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpLml0ZXJhdG9yKCkgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCQlpZihlQ2xhc3MgPT0gbnVsbCkgewotCQkJCXJldHVybiBpdGVyOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYoZUNsYXNzLmlzSW5zdGFuY2UobykpIHsKLQkJCQkJCWxpc3QuYWRkKG8pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbGlzdC5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBjb3VudEVsZW1lbnRzKENvbGxlY3Rpb24gdHJhdmVyc2FsUm9vdHMsIGludCB0cmF2ZXJzYWxUeXBlKSB7Ci0JCXJldHVybiBjb3VudEVsZW1lbnRzKHRyYXZlcnNhbFJvb3RzLCB0cnVlLCB0cmF2ZXJzYWxUeXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvdW50RWxlbWVudHMoQ29sbGVjdGlvbiB0cmF2ZXJzYWxSb290cywgYm9vbGVhbiBtYWtlRGlzam9pbnQsIGludCB0cmF2ZXJzYWxUeXBlKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihJdGVyYXRvciBpdGVyID0gbmV3IExpYnJhcnlJdGVyYXRvcih0cmF2ZXJzYWxSb290cywgdHJ1ZSwgdHJhdmVyc2FsVHlwZSwgbWFrZURpc2pvaW50KTsgaXRlci5oYXNOZXh0KCk7IGNvdW50KyspIHsKLQkJCWl0ZXIubmV4dCgpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gcm9vdHM7Ci0JcHJpdmF0ZSBib29sZWFuIGNvbnRleHRDaGFuZ2VkID0gdHJ1ZTsKLQotCXByaXZhdGUgaW50IHR5cGUgPSBERUVQOwotCQotCS8qKgotCSAqIEluaXRpYWxpemVzIG1lLgotCSAqLwotCXB1YmxpYyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBMaWJyYXJ5VHJhdmVyc2FsU3RyYXRlZ3koaW50IHRyYXZlcnNhbFR5cGUpIHsKLQkJdGhpcy50eXBlICA9IHRyYXZlcnNhbFR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN0YXJ0VHJhdmVyc2FsKAotCQkJQ29sbGVjdGlvbiB0cmF2ZXJzYWxSb290cywKLQkJCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCQotCQlyb290cyA9IG1ha2VUYXJnZXRzRGlzam9pbnQodHJhdmVyc2FsUm9vdHMpOwotCQkKLQkJc3VwZXIuc3RhcnRUcmF2ZXJzYWwodHJhdmVyc2FsUm9vdHMsIHByb2dyZXNzTW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSb290cygpIHsKLQkJcmV0dXJuIHJvb3RzOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogSW1wbGVtZW50cyB0aGUgaW5oZXJpdGVkIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvdW50RWxlbWVudHMoQ29sbGVjdGlvbiBpZ25vcmVkKSB7Ci0JCXJldHVybiBjb3VudEVsZW1lbnRzKGdldFJvb3RzKCksIGZhbHNlLCB0eXBlKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEltcGxlbWVudHMgdGhlIGluaGVyaXRlZCBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGNyZWF0ZUl0ZXJhdG9yKENvbGxlY3Rpb24gaWdub3JlZCkgewotCQlyZXR1cm4gbmV3IExpYnJhcnlJdGVyYXRvcihnZXRSb290cygpLCB0cnVlLCB0eXBlLCBmYWxzZSkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU2NTMxMzQ5ODkyMzU2NjM5NzNMOwotCi0JCQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQkJCWlmIChvYmogPT0gZ2V0Um9vdHMoKSkgewotCQkJCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvciBkZWxlZ2F0ZSA9Ci0JCQkJCQkJZ2V0Um9vdHMoKS5pdGVyYXRvcigpOwotCQkJCQkJCi0JCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQkJCXJldHVybiBkZWxlZ2F0ZS5oYXNOZXh0KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJCQkvLyBpZiBJJ20gYmVpbmcgYXNrZWQgZm9yIG15IG5leHQgZWxlbWVudCwgdGhlbgotCQkJCQkJCS8vICAgIHdlIGFyZSBzdGVwcGluZyB0byBhbm90aGVyIHRyYXZlcnNhbCByb290Ci0JCQkJCQkJY29udGV4dENoYW5nZWQgPSB0cnVlOwotCQkJCQkJCQotCQkJCQkJCXJldHVybiBkZWxlZ2F0ZS5uZXh0KCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQkJCQlkZWxlZ2F0ZS5yZW1vdmUoKTsKLQkJCQkJCX19OwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihvYmopOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCS8vIHRoaXMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBhZ2FpbiB0aGUgbmV4dCB0aW1lIHdlIHRlc3QgaGFzTmV4dCgpIGF0Ci0JCQkJLy8gICAgdGhlIHRyYXZlcnNhbCByb290IGxldmVsCi0JCQkJY29udGV4dENoYW5nZWQgPSBmYWxzZTsKLQkJCQkKLQkJCQlyZXR1cm4gc3VwZXIubmV4dCgpOwotCQkJfX07Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2xpZW50Q29udGV4dENoYW5nZWQoKSB7Ci0JCXJldHVybiBjb250ZXh0Q2hhbmdlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXQgbWFrZVRhcmdldHNEaXNqb2ludChDb2xsZWN0aW9uIG9iamVjdHMpIHsKLQkJU2V0IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldCgpOwotCQkKLQkJLy8gZW5zdXJlIHRoYXQgYW55IGNvbnRhaW5lZCAoZGVzY2VuZGVudCkgZWxlbWVudHMgb2Ygb3RoZXIgZWxlbWVudHMKLQkJLy8gICAgdGhhdCB3ZSBpbmNsdWRlIGFyZSBub3QgaW5jbHVkZWQsIGJlY2F1c2UgdGhleSB3aWxsIGJlCi0JCS8vICAgIHRyYXZlcnNlZCBieSByZWN1cnNpb24sIGFueXdheQotCQkKLQkJZm9yIChJdGVyYXRvciBvdXRlciA9IG9iamVjdHMuaXRlcmF0b3IoKTsgb3V0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBvdXRlck5leHQgPSAoRU9iamVjdClvdXRlci5uZXh0KCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3IgaW5uZXIgPSByZXN1bHQuaXRlcmF0b3IoKTsgaW5uZXIuaGFzTmV4dCgpOykgewotCQkJCUVPYmplY3QgaW5uZXJOZXh0ID0gKEVPYmplY3QpaW5uZXIubmV4dCgpOwotCQkJCQotCQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcihpbm5lck5leHQsIG91dGVyTmV4dCkpIHsKLQkJCQkJb3V0ZXJOZXh0ID0gbnVsbDsgIC8vIGZvcmdldCB0aGlzIG9uZQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChvdXRlck5leHQgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQob3V0ZXJOZXh0KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL2NvbnN0cmFpbnRzL05hbWVDb25zdHJhaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTmFtZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyZjZjMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvTmFtZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5jb25zdHJhaW50czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTXVsdGlTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkFic3RyYWN0TW9kZWxDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkVNRkV2ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5UbmdVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5JVmFsaWRhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yRmFjdG9yeS5UeXBlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuVW1hVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbC5WYWxpZGF0aW9uU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBOYW1lQ29uc3RyYWludCBleHRlbmRzIEFic3RyYWN0TW9kZWxDb25zdHJhaW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQWN0aXZhdG9yLmdldERlZmF1bHQoKS5pc0RlYnVnZ2luZygpOwotCQotLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUNsYXNzW10gQ09OVEVOVF9FTEVNRU5UX1RZUEVTID0gZ2V0Q29udGVudEVsZW1lbnRUeXBlcygpOwotLy8KLS8vCXByaXZhdGUgc3RhdGljIEVDbGFzc1tdIGdldENvbnRlbnRFbGVtZW50VHlwZXMoKSB7Ci0vLwkJQXJyYXlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotLy8JCWZvciAoSXRlcmF0b3IgaXRlciA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEVDbGFzc2lmaWVycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQlPYmplY3QgdHlwZSA9IGl0ZXIubmV4dCgpOwotLy8JCQlpZih0eXBlIGluc3RhbmNlb2YgRUNsYXNzICYmIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5ULmlzU3VwZXJUeXBlT2YoKEVDbGFzcykgdHlwZSkpIHsKLS8vCQkJCXR5cGVzLmFkZCh0eXBlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQlFQ2xhc3NbXSBlQ2xhc3NlcyA9IG5ldyBFQ2xhc3NbdHlwZXMuc2l6ZSgpXTsKLS8vCQl0eXBlcy50b0FycmF5KGVDbGFzc2VzKTsKLS8vCQlyZXR1cm4gZUNsYXNzZXM7Ci0vLwl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNhbkNoZWNrKE9iamVjdCBlT2JqKSB7Ci0JCXJldHVybiBlT2JqIGluc3RhbmNlb2YgTWV0aG9kUGx1Z2luCi0JCQkJfHwgZU9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24KLQkJCQl8fCBlT2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UKLQkJCQl8fCBlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudAotCQkJCXx8ICgoZU9iaiBpbnN0YW5jZW9mIFByb2Nlc3NQYWNrYWdlIHx8IGVPYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgJiYgVW1hVXRpbAotCQkJCQkJLmdldFByb2Nlc3NDb21wb25lbnQoKE1ldGhvZEVsZW1lbnQpIGVPYmopID09IG51bGwpOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLkFic3RyYWN0TW9kZWxDb25zdHJhaW50I3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgY3R4KSB7Ci0JCUVPYmplY3QgZU9iaiA9IGN0eC5nZXRUYXJnZXQoKTsKLQkJRU1GRXZlbnRUeXBlIGVUeXBlID0gY3R4LmdldEV2ZW50VHlwZSgpOwotCi0JCWlmKERFQlVHKSB7Ci0JCQlpZihlT2JqIGluc3RhbmNlb2YgTmFtZWRFbGVtZW50KSB7Ci0JCQkJTmFtZWRFbGVtZW50IGUgPSAoTmFtZWRFbGVtZW50KSBlT2JqOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTmFtZUNvbnN0cmFpbnQudmFsaWRhdGUoKTogIiArIFRuZ1V0aWwuZ2V0VHlwZVRleHQoZSkgKyAiOiAnIiArIGUuZ2V0TmFtZSgpICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBNaWxlc3RvbmUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJfQotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbiB0aGUgY2FzZSBvZiBiYXRjaCBtb2RlLgotCQlpZiAoZVR5cGUgPT0gRU1GRXZlbnRUeXBlLk5VTEwpIHsKLQkJCWlmKChlT2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCAmJiBUbmdVdGlsLmlzUHJlZGVmaW5lZCgoTWV0aG9kRWxlbWVudCkgZU9iaikpKQotCQkJewotCQkJCS8vIHNraXAgdmFsaWRhdGluZyBwcmVkZWZpbmVkIG1ldGhvZCBlbGVtZW50cywgQ29udGVudERlc2NyaXB0aW9uCi0JCQkJLy8KLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQkJCX0KLQkJCQotCQkJLy8gdmFsaWRhdGUgb2JqZWN0J3MgbmFtZQotCQkJLy8KLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBDdXN0b21DYXRlZ29yeSkgewotCQkJCUN1c3RvbUNhdGVnb3J5IGNjID0gKEN1c3RvbUNhdGVnb3J5KWVPYmo7Ci0JCQkJTGlzdCBsaXN0ID0gQXNzb2NpYXRpb25IZWxwZXIuZ2V0Q3VzdG9tQ2F0ZWdvcmllcyhjYyk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQkJQ3VzdG9tQ2F0ZWdvcnkgcGFyZW50ID0gKEN1c3RvbUNhdGVnb3J5KSBpdGVyLm5leHQoKTsKLQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVOYW1lVmFsaWRhdG9yKHBhcmVudCwgY2MpOwotCQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoY2MuZ2V0TmFtZSgpKTsKLQkJCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGNjLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpKTsKLQkJCQkJfQotCQkJCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKHBhcmVudCwgY2MpOwotCQkJCQltc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChjYy5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCQlpZihtc2cgIT0gbnVsbCkgewotCQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgY2MsIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmKGNhbkNoZWNrKGVPYmopKSAKLQkJCXsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpZU9iajsKLQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFLmNyZWF0ZU5hbWVWYWxpZGF0b3IoZU9iai5lQ29udGFpbmVyKCksIGUpOwotCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlLmdldE5hbWUoKSk7Ci0JCQkJaWYobXNnICE9IG51bGwpIHsKLQkJCQkJbXVsdGlTdGF0dXMuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywgZSwgVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKSk7Ci0JCQkJfQotLyoJCQkJaWYoZU9iaiBpbnN0YW5jZW9mIERlc2NyaWJhYmxlRWxlbWVudCkgewotCQkJCQlEZXNjcmliYWJsZUVsZW1lbnQgZGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBlT2JqOwotCQkJCQl2YWxpZGF0b3IgPSBJVmFsaWRhdG9yRmFjdG9yeS5JTlNUQU5DRS5jcmVhdGVQcmVzZW50YXRpb25OYW1lVmFsaWRhdG9yKGVPYmouZUNvbnRhaW5lcigpLCBkZSk7Ci0JCQkJCW1zZyA9IHZhbGlkYXRvci5pc1ZhbGlkKGRlLmdldFByZXNlbnRhdGlvbk5hbWUoKSk7Ci0JCQkJCWlmKG1zZyAhPSBudWxsKSB7Ci0JCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBlLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSkpOwotCQkJCQl9Ci0JCQkJfSovCi0JCQl9Ci0JCQkKLS8vCQkJLy8gdmFsaWRhdGUgbmFtZSBvZiB0aGUgY2hpbGRyZW4KLS8vCQkJLy8KLS8vCQkJaWYoZU9iaiBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOUywgCi0vLwkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BMVUdJTik7Ci0vLwkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCW11bHRpU3RhdHVzLm1lcmdlKHN0YXR1cyk7Ci0vLwkJCQl9Ci0vLwkJCQlzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0xJQlJBUllfX1BSRURFRklORURfQ09ORklHVVJBVElPTlMsIAotLy8JCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9DT05GSUdVUkFUSU9OKTsKLS8vCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQllbHNlIGlmKGVPYmogaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotLy8JCQkJQ29udGVudFBhY2thZ2UgcGtnID0gKENvbnRlbnRQYWNrYWdlKSBlT2JqOwotLy8JCQkJYm9vbGVhbiBjaGVja2VkID0gZmFsc2U7Ci0vLwkJCQlpZihUbmdVdGlsLmlzUHJlZGVmaW5lZChwa2cpKSB7Ci0vLwkJCQkJU3RyaW5nIG5hbWUgPSBwa2cuZ2V0TmFtZSgpOwotLy8JCQkJCWlmKE1vZGVsU3RydWN0dXJlLkRJU0NJUExJTkVfUEFDS0FHRV9OQU1FLmVxdWFscyhuYW1lKSkgewotLy8JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsIAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORSk7CQkJCQotLy8JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCQkJfQotLy8JCQkJCQljaGVja2VkID0gdHJ1ZTsKLS8vCQkJCQl9Ci0vLwkJCQkJZWxzZSBpZiAoTW9kZWxTdHJ1Y3R1cmUuUk9MRV9TRVRfUEFDS0FHRV9OQU1FLmVxdWFscyhuYW1lKSkgewotLy8JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNoZWNrQ2hpbGRyZW4oZU9iaiwgVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVFMsIAotLy8JCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVQpOwkJCQkKLS8vCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJCW11bHRpU3RhdHVzLm1lcmdlKHN0YXR1cyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQkJY2hlY2tlZCA9IHRydWU7Ci0vLwkJCQkJfQotLy8JCQkJCWVsc2UgaWYgKCEoTW9kZWxTdHJ1Y3R1cmUuQ09SRV9DT05URU5UX1BBQ0FLR0VfTkFNRS5lcXVhbHMobmFtZSkpKSB7Ci0vLwkJCQkJCWNoZWNrZWQgPSB0cnVlOwotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCWlmKCFjaGVja2VkKSB7Ci0vLwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBDT05URU5UX0VMRU1FTlRfVFlQRVMubGVuZ3RoOyBpKyspIHsKLS8vCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBjaGVja0NoaWxkcmVuKGVPYmosIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlRTLCAKLS8vCQkJCQkJCQlDT05URU5UX0VMRU1FTlRfVFlQRVNbaV0pOwkJCQkKLS8vCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLS8vCQkJCQkJCW11bHRpU3RhdHVzLm1lcmdlKHN0YXR1cyk7Ci0vLwkJCQkJCX0KLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZihlT2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLS8vCQkJCUlTdGF0dXMgc3RhdHVzID0gY2hlY2tDaGlsZHJlbihlT2JqLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19DSElMRF9QQUNLQUdFUywgCi0vLwkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFKTsKLS8vCQkJCWlmKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJbXVsdGlTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLS8vCQkJCX0KLS8vCQkJfQotCQkJCi0JCQlpZihtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBtdWx0aVN0YXR1czsKLQkJCX0KLQkJCQotCQkvLyBJbiB0aGUgY2FzZSBvZiBsaXZlIG1vZGUuCi0JCX0gZWxzZSB7Ci0JCQlPYmplY3QgbmV3VmFsdWUgPSBjdHguZ2V0RmVhdHVyZU5ld1ZhbHVlKCk7Ci0JCQkKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsIHx8ICgoU3RyaW5nKW5ld1ZhbHVlKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGN0eC5jcmVhdGVGYWlsdXJlU3RhdHVzKG5ldyBPYmplY3RbXSB7ZU9iai5lQ2xhc3MoKS5nZXROYW1lKCl9KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGN0eC5jcmVhdGVTdWNjZXNzU3RhdHVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hpbGRGaWx0ZXIgZXh0ZW5kcyBUeXBlRmlsdGVyIHsKLQotCQlwcml2YXRlIFNldCBjaGVja2VkQ2hpbGRyZW47Ci0KLQkJcHVibGljIENoaWxkRmlsdGVyKEVDbGFzcyBlQ2xhc3MsIFNldCBjaGVja2VkQ2hpbGRyZW4pIHsKLQkJCXN1cGVyKGVDbGFzcyk7Ci0JCQl0aGlzLmNoZWNrZWRDaGlsZHJlbiA9IGNoZWNrZWRDaGlsZHJlbjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoY2hlY2tlZENoaWxkcmVuLmNvbnRhaW5zKG9iaikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG9iaik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgY2hlY2tDaGlsZHJlbihFT2JqZWN0IG9iamVjdCwgRVJlZmVyZW5jZSBjaGlsZEZlYXR1cmUsCi0JCQlFQ2xhc3MgZUNsYXNzKSB7Ci0JCUxpc3Qgc3RhdHVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBjaGlsZHJlbiA9IChMaXN0KSBvYmplY3QuZUdldChjaGlsZEZlYXR1cmUpOwotCQlTZXQgY2hlY2tlZENoaWxkcmVuID0gbmV3IEhhc2hTZXQoKTsKLQkJSUZpbHRlciBjaGlsZEZpbHRlciA9IG5ldyBDaGlsZEZpbHRlcihlQ2xhc3MsIGNoZWNrZWRDaGlsZHJlbik7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRU9iamVjdCBjaGlsZCA9IChFT2JqZWN0KSBpdGVyLm5leHQoKTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgewotCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gSVZhbGlkYXRvckZhY3RvcnkuSU5TVEFOQ0UKLQkJCQkJCS5jcmVhdGVWYWxpZGF0b3Iob2JqZWN0LCBjaGlsZEZlYXR1cmUsIGNoaWxkRmlsdGVyLAotCQkJCQkJCQljaGlsZCwgVW1hUGFja2FnZS5MaXRlcmFscy5OQU1FRF9FTEVNRU5UX19OQU1FKTsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGNoaWxkOwotCQkJCVN0cmluZyBtc2cgPSB2YWxpZGF0b3IuaXNWYWxpZChlLmdldE5hbWUoKSk7Ci0JCQkJaWYgKG1zZyAhPSBudWxsKSB7Ci0JCQkJCXN0YXR1c0xpc3QuYWRkKG5ldyBWYWxpZGF0aW9uU3RhdHVzKElTdGF0dXMuRVJST1IsIDAsIG1zZywKLQkJCQkJCQllLCBVbWFQYWNrYWdlLkxpdGVyYWxzLk5BTUVEX0VMRU1FTlRfX05BTUUpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBEZXNjcmliYWJsZUVsZW1lbnQpIHsKLQkJCQlJVmFsaWRhdG9yIHZhbGlkYXRvciA9IElWYWxpZGF0b3JGYWN0b3J5LklOU1RBTkNFCi0JCQkJCQkuY3JlYXRlVmFsaWRhdG9yKAotCQkJCQkJCQlvYmplY3QsCi0JCQkJCQkJCWNoaWxkRmVhdHVyZSwKLQkJCQkJCQkJY2hpbGRGaWx0ZXIsCi0JCQkJCQkJCWNoaWxkLAotCQkJCQkJCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSk7Ci0JCQkJRGVzY3JpYmFibGVFbGVtZW50IGUgPSAoRGVzY3JpYmFibGVFbGVtZW50KSBjaGlsZDsKLQkJCQlTdHJpbmcgbXNnID0gdmFsaWRhdG9yLmlzVmFsaWQoZS5nZXRQcmVzZW50YXRpb25OYW1lKCkpOwotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlzdGF0dXNMaXN0Ci0JCQkJCQkJLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cygKLQkJCQkJCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCQkJCQkwLAotCQkJCQkJCQkJbXNnLAotCQkJCQkJCQkJZSwKLQkJCQkJCQkJCVVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghc3RhdHVzTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWlmIChzdGF0dXNMaXN0LnNpemUoKSA9PSAxKSB7Ci0JCQkJcmV0dXJuIChJU3RhdHVzKSBzdGF0dXNMaXN0LmdldCgwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVN0YXR1c1tdIG5ld0NoaWxkcmVuID0gbmV3IElTdGF0dXNbc3RhdHVzTGlzdC5zaXplKCldOwotCQkJCXN0YXR1c0xpc3QudG9BcnJheShuZXdDaGlsZHJlbik7Ci0JCQkJcmV0dXJuIG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuUExVR0lOX0lELCAwLCBuZXdDaGlsZHJlbiwKLQkJCQkJCSIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9SZWxhdGlvbnNoaXBDb25zdHJhaW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vY29uc3RyYWludHMvUmVsYXRpb25zaGlwQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVlY2EyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi9jb25zdHJhaW50cy9SZWxhdGlvbnNoaXBDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uY29uc3RyYWludHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uQWJzdHJhY3RNb2RlbENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnZhbGlkYXRpb24uRU1GRXZlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlN0clV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC51dGlsLlRuZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsLlZhbGlkYXRpb25TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcENvbnN0cmFpbnQgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsQ29uc3RyYWludCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IEFjdGl2YXRvci5nZXREZWZhdWx0KCkuaXNEZWJ1Z2dpbmcoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb24gcmVmZXJlbmNlc1RvQ2hlY2tGb3JDaXJjdWxhckRlcGVuZGVuY3kgPSBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7Ci0JCQlVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTCi0JCQksIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVkFSSUFCSUxJVFlfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVAotCQkJLCBVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVFMKLQkJCSwgVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVFMKLQkJCSwgVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlRTCi0JfSk7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5BYnN0cmFjdE1vZGVsQ29uc3RyYWludCN2YWxpZGF0ZShvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbi5JVmFsaWRhdGlvbkNvbnRleHQpCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGN0eCkgewotCQlpZiAoRGVwZW5kZW5jeUNoZWNrZXIubmV3Q2hlY2spIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUVPYmplY3QgZU9iaiA9IGN0eC5nZXRUYXJnZXQoKTsKLQkJRU1GRXZlbnRUeXBlIGVUeXBlID0gY3R4LmdldEV2ZW50VHlwZSgpOwotCQkKLQkJaWYoREVCVUcpIHsKLQkJCWlmKGVPYmogaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKLQkJCQlOYW1lZEVsZW1lbnQgZSA9IChOYW1lZEVsZW1lbnQpIGVPYmo7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJSZWxhdGlvbnNoaXBDb25zdHJhaW50LnZhbGlkYXRlKCk6ICIgKyBUbmdVdGlsLmdldFR5cGVUZXh0KGUpICsgIjogJyIgKyBlLmdldE5hbWUoKSArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQotCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuUExVR0lOX0lELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbiB0aGUgY2FzZSBvZiBiYXRjaCBtb2RlLgotCQlpZiAoZVR5cGUgPT0gRU1GRXZlbnRUeXBlLk5VTEwpIHsKLQkJCUNvbGxlY3Rpb24gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KHJlZmVyZW5jZXNUb0NoZWNrRm9yQ2lyY3VsYXJEZXBlbmRlbmN5KTsKLQkJCWZlYXR1cmVzLnJldGFpbkFsbChlT2JqLmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQkJaWYocmVmLmlzTWFueSgpKSB7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKExpc3QpZU9iai5lR2V0KHJlZikpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJCU9iamVjdCBvID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShlT2JqLCByZWYsIG8pOwotCQkJCQkJaWYoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTdHJpbmcgbXNnID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJCQkJCQlpZihTdHJVdGlsLmlzQmxhbmsobXNnKSkgewotCQkJCQkJCQltc2cgPSBOTFMuYmluZChWYWxpZGF0aW9uUmVzb3VyY2VzLmNpcmN1bGFyRGVwZW5kZW5jeV9lcnJvciwgcmVmLmdldEVDb250YWluaW5nQ2xhc3MoKS5nZXROYW1lKCksIHJlZi5nZXROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCQltdWx0aVN0YXR1cy5hZGQobmV3IFZhbGlkYXRpb25TdGF0dXMoSVN0YXR1cy5FUlJPUiwgMCwgbXNnLCBlT2JqLCByZWYpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJT2JqZWN0IG8gPSBlT2JqLmVHZXQocmVmKTsKLQkJCQkJaWYobyAhPSBudWxsKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IERlcGVuZGVuY3lDaGVja2VyLmNoZWNrQ2lyY3VsYXJEZXBlbmRlbmN5KGVPYmosIHJlZiwgbyk7Ci0JCQkJCQlpZighc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN0cmluZyBtc2cgPSBzdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJCQkJCWlmKFN0clV0aWwuaXNCbGFuayhtc2cpKSB7Ci0JCQkJCQkJCW1zZyA9IE5MUy5iaW5kKFZhbGlkYXRpb25SZXNvdXJjZXMuY2lyY3VsYXJEZXBlbmRlbmN5X2Vycm9yLCByZWYuZ2V0RUNvbnRhaW5pbmdDbGFzcygpLmdldE5hbWUoKSwgcmVmLmdldE5hbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCW11bHRpU3RhdHVzLmFkZChuZXcgVmFsaWRhdGlvblN0YXR1cyhJU3RhdHVzLkVSUk9SLCAwLCBtc2csIGVPYmosIHJlZikpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZihtdWx0aVN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gY3R4LmNyZWF0ZVN1Y2Nlc3NTdGF0dXMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBtdWx0aVN0YXR1czsKLQkJCX0JCQkKLQkJfSAKLQkJCi0JCXJldHVybiBjdHguY3JlYXRlU3VjY2Vzc1N0YXR1cygpOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1N0YXJ0dXAuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS9lcGYvdmFsaWRhdGlvbi91dGlsL1N0YXJ0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZjMzE3OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9TdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkxpYnJhcnlFVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdGFydHVwOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTdGFydHVwI2Vhcmx5U3RhcnR1cCgpCi0JICovCi0JcHVibGljIHZvaWQgZWFybHlTdGFydHVwKCkgewotCQlFVmFsaWRhdG9yLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dCgKLQkJCQlVbWFQYWNrYWdlLmVJTlNUQU5DRSwKLQkJCQluZXcgTGlicmFyeUVWYWxpZGF0b3IoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9WYWxpZGF0aW9uU3RhdHVzLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2UvZXBmL3ZhbGlkYXRpb24vdXRpbC9WYWxpZGF0aW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZDQ3YzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL2VwZi92YWxpZGF0aW9uL3V0aWwvVmFsaWRhdGlvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24udXRpbDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLkFjdGl2YXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIFBob25nIE5ndXllbiBMZQotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25TdGF0dXMgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXR1cyB7Ci0KLQlwdWJsaWMgVmFsaWRhdGlvblN0YXR1cyhpbnQgc2V2ZXJpdHksIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGNoZWNrZWRPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKEFjdGl2YXRvci5QTFVHSU5fSUQsIHNldmVyaXR5LCBjb2RlLCBtZXNzYWdlLCBjaGVja2VkT2JqZWN0LCBmZWF0dXJlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxNjRiOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJydW50aW1lIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2YTdkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXJ1bnRpbWUKLWJpbgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvLnByb2plY3QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzMmE5YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi54bWwudW1hPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwMDFjNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSNUaHUgTWF5IDAzIDE2OjU2OjU3IFBEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwOTA3MTMzNC54c2Q9VVRGOAotZW5jb2RpbmcvL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2Q9VVRGOAotZW5jb2RpbmcvL3NyYy9tb2RlbC9VTUEueHNkPVVURjgKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjQxYzIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEsCi0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbCwKLSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlYWJpbGl0eQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmYjE2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyA8Y29weXJpZ2h0PgotIyA8L2NvcHlyaWdodD4KLSMKLSMgJElkOiBidWlsZC5wcm9wZXJ0aWVzLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTM6MDQganRoYW0gRXhwICQKLQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnByb3BlcnRpZXMgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4MTRmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMgPGNvcHlyaWdodD4KLSMgPC9jb3B5cmlnaHQ+Ci0jCi0jICRJZDogcGx1Z2luLnByb3BlcnRpZXMsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowNCBqdGhhbSBFeHAgJAotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIE5MU19NRVNTQUdFRk9STUFUX1ZBUgotCi1wbHVnaW5OYW1lID0gRVBGIFhNTCBVTUEgTW9kZWwKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ueG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzNWIxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLQotPCEtLQotIDxjb3B5cmlnaHQ+Ci0gPC9jb3B5cmlnaHQ+Ci0KLSAkSWQ6IHBsdWdpbi54bWwsdiAxLjEgMjAwOC8wMS8xNSAwODo1MzowNCBqdGhhbSBFeHAgJAotLS0+Ci0KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KLSAgICA8cGFja2FnZSAKLSAgICAgICB1cmkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiAKLSAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlIiAvPgotICA8L2V4dGVuc2lvbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0gICAgPHBhcnNlciAKLSAgICAgICB0eXBlPSJ1bWEiIAotICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlRmFjdG9yeUltcGwiIC8+Ci0gIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KLQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDYwODMwMDczNi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmM0NTEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA4MzAwNzM2LnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRhdGlvbiIgdHlwZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAicnVwX2FyY2hpdGVjdHVyZV9kb2N1bWVudCIgdG8gZGlmZmVyZW50aWF0ZSBmcm9tIGEgImoyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQiIHdoZXJlYXMgdGhlIGV4dGVybmFsIHByZXNlbnRhdGlvbiB3b3VsZCBhbHdheXMgYmUgIkFyY2hpdGVjdHVyZSBEb2N1bWVudCIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJub2RlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uY2VwdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNoZWNrbGlzdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXhhbXBsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGVsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25NZXRyaWMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW5nTWV0cmljIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IGRlc2NyaWJlcyBhIG1ldHJpYyBvciBtZWFzdXJlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQgYW5kIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSB3b3JrIGVmZm9ydCBhcyB3ZWxsIGFzIGEgcmFuZ2Ugb2YgcG90ZW50aWFsIGxhYm9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvYWRtYXAiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuCi1BbiBpbnN0YW5jZSBvZiBhIFJvYWRtYXAgcmVwcmVzZW50cyBpbXBvcnRhbnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFjdGl2aXR5IG9yIFByb2Nlc3MgaXQgaXMgcmVsYXRlZCB0by4gIE9mdGVuIGEgY29tcGxleCBBY3Rpdml0eSBzdWNoIGFzIGEgUHJvY2VzcyBjYW4gYmUgbXVjaCBlYXNpZXIgdW5kZXJzdG9vZCBieSBwcm92aWRpbmcgYSB3YWxrdGhyb3VnaCB3aXRoIGEgbGluZWFyIHRocmVhZCBvZiBhIHR5cGljYWwgaW5zdGFudGlhdGlvbiBvZiB0aGlzIEFjdGl2aXR5LiAgSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSBwcm9jZXNzIHByYWN0aXRpb25lciB1bmRlcnN0YW5kIGhvdyB3b3JrIGluIHRoZSBwcm9jZXNzIGlzIGJlaW5nIHBlcmZvcm1lZCwgYSBSb2FkbWFwIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgaG93IEFjdGl2aXRpZXMgYW5kIFRhc2tzIHJlbGF0ZSB0byBlYWNoIG90aGVyIG92ZXIgdGltZS4gIFJvYWRtYXBzIGFyZSBhbHNvIHVzZWQgdG8gc2hvdyBob3cgc3BlY2lmaWMgYXNwZWN0cyBhcmUgZGlzdHJpYnV0ZWQgb3ZlciBhIHdob2xlIHByb2Nlc3MgcHJvdmlkaW5nIGEga2luZCBvZiBmaWx0ZXIgb24gdGhlIHByb2Nlc3MgZm9yIHRoaXMgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJlcG9ydCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHByZWRlZmluZWQgdGVtcGxhdGUgb2YgYSByZXN1bHQgdGhhdCBpcyBnZW5lcmF0ZWQgb24gdGhlIGJhc2lzIG9mIG90aGVyIHdvcmsgcHJvZHVjdHMgYXMgYW4gb3V0cHV0IGZyb20gc29tZSBmb3JtIG9mIHRvb2wgYXV0b21hdGlvbi4gQW4gZXhhbXBsZSBmb3IgYSByZXBvcnQgd291bGQgYmUgYSB1c2UgY2FzZSBtb2RlbCBzdXJ2ZXksIHdoaWNoIGlzIGdlbmVyYXRlZCBieSBleHRyYWN0aW5nIGRpYWdyYW0gaW5mb3JtYXRpb24gZnJvbSBhIGdyYXBoaWNhbCBtb2RlbCBhbmQgdGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIGRvY3VtZW50cyBhbmQgY29tYmluZXMgdGhlc2UgdHdvIHR5cGVzIG9mIGluZm9ybWF0aW9uIGludG8gYSByZXBvcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRjaGFsbCBmb3Igb3RoZXIgdHlwZXMgb2YgZ3VpZGFuY2Ugbm90IHNwZWNpZmljYWxseSBkZWZpbmVkIGVsc2V3aGVyZS4gSXQgY2FuIGJlIHJlbGF0ZWQgdG8gYWxsIGtpbmRzIG9mIENvbnRlbnQgRWxlbWVudHMsIGkuZS4gaW5jbHVkaW5nIG90aGVyIGd1aWRhbmNlIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sTWVudG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldoaXRlcGFwZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbmNlcHQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZXJtRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByb3ZlbiB3YXkgb3Igc3RyYXRlZ3kgb2YgZG9pbmcgd29yayB0byBhY2hpZXZlIGEgZ29hbCB0aGF0IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiB3b3JrIHByb2R1Y3Qgb3IgcHJvY2VzcyBxdWFsaXR5LiAgUHJhY3RpY2VzIGFyZSBkZWZpbmVkIG9ydGhvZ29uYWwgdG8gbWV0aG9kcyBhbmQgcHJvY2Vzc2VzLiAgVGhleSBjb3VsZCBzdW1tYXJpemUgYXNwZWN0cyB0aGF0IGltcGFjdCBtYW55IGRpZmZlcmVudCBwYXJ0cyBvZiBhIG1ldGhvZCBvciBzcGVjaWZpYyBwcm9jZXNzZXMuICBFeGFtcGxlcyBmb3IgcHJhY3RpY2VzIHdvdWxkIGJlICJNYW5hZ2UgUmlza3MiLCAiQ29udGludW91c2x5IHZlcmlmeSBxdWFsaXR5IiwgIkFyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQiLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBY3Rpdml0eVJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudFJlZmVyZW5jZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViUHJhY3RpY2UiIHR5cGU9InVtYTpQcmFjdGljZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXVzYWJsZUFzc2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcKLWhvdyB0aGUgYXNzZXQgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIHdoaWNoIHByb3ZpZGVzIGEgZ2VuZXJhbGl6YXRpb24gZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgdHlwZXMgQXJ0aWZhY3QsIE91dGNvbWUsIGFuZCBEZWxpdmVyYWJsZS4gIFRoZSBtZXRhLW1vZGVsIGNsYXNzIFdvcmsgUHJvZHVjdCBhY3R1YWxseSByZXByZXNlbnRzIHdvcmsgcHJvZHVjdCB0eXBlcywgaS5lLiBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHNwZWNpZmljIHR5cGUgb2Ygd29yayBwcm9kdWN0IGFuZCBub3QgYW4gaW5kaXZpZHVhbCB3b3JrIHByb2R1Y3QgaW5zdGFuY2UuICBIb3dldmVyLCBmb3Igc2ltcGxpY2l0eSByZWFzb25zIGFuZCBiZWNhdXNlIG9mIGxvdyByaXNrIG9mIG1pc2ludGVycHJldGF0aW9uIHdlIGRpZCBub3QgYXBwZW5kIHRoZSB3b3JkICd0eXBlJyB0byBldmVyeSBtZXRhLWNsYXNzLgotQSB3b3JrIHByb2R1Y3QgaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGRlc2NyaXB0aW9ucyBvZiBjb250ZW50IGVsZW1lbnRzIHRoYXQgYXJlIHVzZWQgdG8gZGVmaW5lIGFueXRoaW5nIHVzZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBhIHRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRlbXBsYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuCi1BcnRpZmFjdHMgYXJlIHRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgY29uc3VtZWQsIHByb2R1Y2VkLCBvciBtb2RpZmllZCBieSBUYXNrcy4gIEl0IG1heSBzZXJ2ZSBhcyBhIGJhc2lzIGZvciBkZWZpbmluZyByZXVzYWJsZSBhc3NldHMuICBSb2xlcyB1c2UgQXJ0aWZhY3RzIHRvIHBlcmZvcm0gVGFza3MgYW5kIHByb2R1Y2UgQXJ0aWZhY3RzIGluIHRoZSBjb3Vyc2Ugb2YgcGVyZm9ybWluZyBUYXNrcy4gIEFydGlmYWN0cyBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGEgc2luZ2xlIFJvbGUsIG1ha2luZyByZXNwb25zaWJpbGl0eSBlYXN5IHRvIGlkZW50aWZ5IGFuZCB1bmRlcnN0YW5kLCBhbmQgcHJvbW90aW5nIHRoZSBpZGVhIHRoYXQgZXZlcnkgcGllY2Ugb2YgaW5mb3JtYXRpb24gcHJvZHVjZWQgaW4gdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHNraWxscy4gRXZlbiB0aG91Z2ggb25lIHJvbGUgbWlnaHQgIm93biIgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRhaW5lZEFydGlmYWN0IiB0eXBlPSJ1bWE6QXJ0aWZhY3QiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iT3V0Y29tZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgCi1BIFJvbGUgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcyBvZiBhbiBpbmRpdmlkdWFsIG9yIGEgc2V0IG9mIGluZGl2aWR1YWxzLiAgUm9sZXMgYXJlIG5vdCBpbmRpdmlkdWFscyBvciByZXNvdXJjZXMuICBJbmRpdmlkdWFsIG1lbWJlcnMgb2YgdGhlIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiB3aWxsIHdlYXIgZGlmZmVyZW50IGhhdHMsIG9yIHBlcmZvcm0gZGlmZmVyZW50IHJvbGVzLiBUaGUgbWFwcGluZyBmcm9tIGluZGl2aWR1YWwgdG8gcm9sZSwgcGVyZm9ybWVkIGJ5IHRoZSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhbmQgc3RhZmZpbmcgZm9yIGEgcHJvamVjdCwgYWxsb3dzIGRpZmZlcmVudCBpbmRpdmlkdWFscyB0byBhY3QgYXMgc2V2ZXJhbCBkaWZmZXJlbnQgcm9sZXMsIGFuZCBmb3IgYSByb2xlIHRvIGJlIHBsYXllZCBieSBzZXZlcmFsIGluZGl2aWR1YWxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFzayI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi1BIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLUZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtEZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IE1ldGhvZCBFbGVtZW50IHRoYXQgZ2VuZXJhbGl6ZXMgYWxsIGRlc2NyaXB0aW9ucyBvZiB3b3JrIHdpdGhpbiB0aGUgVW5pZmllZCBNZXRob2QgQXJjaGl0ZWN0dXJlLiAgVGhpcyBwYWNrYWdlIGludHJvZHVjZXMgdHdvIGNvbmNyZXRlIHR5cGVzIG9mIFdvcmsgRGVmaW5pdGlvbnM6IFRhc2sgYW5kIFN0ZXAuICBXb3JrIERlZmluaXRpb25zIGNhbiBjb250YWluIHNldHMgb2YgcHJlLSBhbmQgcG9zdC1jb25kaXRpb25zIGRlZmluaW5nIGNvbnN0cmFpbnRzIHRoYXQgbmVlZCB0byBiZSB2YWxpZCBiZWZvcmUgdGhlIGRlc2NyaWJlZCB3b3JrIGNhbiBiZWdpbiBvciBiZWZvcmUgaXQgY2FuIGJlIGRlY2xhcmVkIGFzIGZpbmlzaGVkLiAgTm90ZSB0aGF0IGdlbmVyYWwgb3duZWRSdWxlcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYWRkaXRpb25hbCBjb25zdHJhaW50cyBhbmQgcnVsZXMgZm9yIFdvcmsgRGVmaW5pdGlvbnMuCi1Xb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBnZW5lcmFsaXppbmcgY29udGVudCBjYXRlZ29yeSB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3JpemF0aW9uIG9mIHdvcmsgKGkuZS4gVGFza3MgZm9yIE1ldGhvZCBDb250ZW50KSwgYmFzZWQgdXBvbiBzaW1pbGFyaXR5IG9mIGNvbmNlcm5zIGFuZCBjb29wZXJhdGlvbiBvZiB3b3JrIGVmZm9ydC4KLUEgZGlzY2lwbGluZSBpcyBhIGNvbGxlY3Rpb24gb2YgVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBhIG1ham9yICdhcmVhIG9mIGNvbmNlcm4nIHdpdGhpbiB0aGUgb3ZlcmFsbCBwcm9qZWN0LiBUaGUgZ3JvdXBpbmcgb2YgVGFza3MgaW50byBkaXNjaXBsaW5lcyBpcyBtYWlubHkgYW4gYWlkIHRvIHVuZGVyc3RhbmRpbmcgdGhlIHByb2plY3QgZnJvbSBhICd0cmFkaXRpb25hbCcgd2F0ZXJmYWxsIHBlcnNwZWN0aXZlLiBIb3dldmVyLCB0eXBpY2FsbHksIGZvciBleGFtcGxlLCBpdCBpcyBtb3JlIGNvbW1vbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVxdWlyZW1lbnRzIGFjdGl2aXRpZXMgaW4gY2xvc2UgY29vcmRpbmF0aW9uIHdpdGggYW5hbHlzaXMgYW5kIGRlc2lnbiBhY3Rpdml0aWVzLiBTZXBhcmF0aW5nIHRoZXNlIGFjdGl2aXRpZXMgaW50byBzZXBhcmF0ZSBkaXNjaXBsaW5lcyBtYWtlcyB0aGUgYWN0aXZpdGllcyBlYXNpZXIgdG8gY29tcHJlaGVuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJEaXNjaXBsaW5lIiB0eXBlPSJ1bWE6RGlzY2lwbGluZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlV29ya2Zsb3ciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGlzY2lwbGluZUdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgdG8gZ3JvdXAgRGlzY2lwbGluZXMuICBGb3IgZXhhbXBsZSwgdGhlIERpc2NpcGxpbmUgR3JvdXBpbmcgIlNvZnR3YXJlIERpc2NpcGxpbmVzIiB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICJSZXF1aXJlbWVudHMgTWFuYWdlbWVudCIgb3IgIlRlc3RpbmciOyAiSVQgSW5mcmFzdHJ1Y3R1cmUgTWFuYWdlbWVudCIgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAiSVQgT3BlcmF0aW9uYWwgU2VydmljZXMiLCAiSVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyIsIG9yICJJVCBFbmFibGluZyBTZXJ2aWNlcyIuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGlzY2lwbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEb21haW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi1Eb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJkb21haW4iIHR5cGU9InVtYTpEb21haW4iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Pcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAiQW5hbHlzdHMiIFJvbGUgU2V0IGNvdWxkIGdyb3VwIHRoZSAiQnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0IiwgIlN5c3RlbSBBbmFseXN0IiwgYXMgd2VsbCBhcyAiUmVxdWlyZW1lbnRzIFNwZWNpZmllciIgcm9sZXMuICBBbGwgb2YgdGhlc2Ugd29yayB3aXRoIHNpbWlsYXIgdGVjaG5pcXVlcyBhbmQgaGF2ZSBvdmVybGFwcGluZyBza2lsbHMsIGJ1dCBhcmUgcmVxdWlyZWQgYXMgZGlzdGluY3Qgcm9sZXMgZm9yIGEgbWV0aG9kIChlLmcuIHRoZSBtZXRob2QgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgaXMgYmFzZWQgb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZVNldEdyb3VwaW5nIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJvbGUgU2V0cyBjYW4gYmUgY2F0ZWdvcml6ZWQgaW50byBSb2xlIFNldCBHcm91cGluZ3MuICBGb3IgZXhhbXBsZSwgZGlmZmVyZW50IG1ldGhvZHMgbWlnaHQgZGVmaW5lIHNpbWlsYXIgUm9sZSBTZXRzLCB3aGljaCBob3dldmVyIG5lZWQgdG8gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgb24gYSBnbG9iYWwgc2NhbGUuICBUaHVzLCBSb2xlIFNldCBHcm91cGluZ3MgYWxsb3cgZGlzdGluZ3Vpc2hpbmcsIGZvciBleGFtcGxlLCBTb2Z0d2FyZSBTZXJ2aWNlcyBNYW5hZ2VyIFJvbGUgU2V0cyBmcm9tIFNvZnR3YXJlIERldmVsb3BtZW50IE9yZ2FuaXphdGlvbiBNYW5hZ2VyIFJvbGUgU2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlU2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2wiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNlY29uZCBjYXRlZ29yeSBmb3Igd29yayBwcm9kdWN0cywgd2hpY2ggaW4gY29udHJhc3QgdG8gRG9tYWluIGlzIG1vcmUgcHJlc2VudGF0aW9uIG9yaWVudGVkLiAgQSB3b3JrIHByb2R1Y3QgY2FuIGhhdmUgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBFeGFtcGxlcywgZm9yIGEgV29yayBQcm9kdWN0IFR5cGUgaXMgIkNsYXNzIERpYWdyYW0iLCB3aGljaCBjYXRlZ29yaXplcyB0aGUgQXJ0aWZhY3RzIEFuYWx5c2lzIE1vZGVsLCBEZXNpZ24gTW9kZWwsIFVzZXIgRXhwZXJpZW5jZSBNb2RlbCwgb3IgIlNwZWNpZmljYXRpb24iLCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkN1c3RvbUNhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcnkgaW50cm9kdWNlZCBieSBhIG1ldGhvZCBjb250ZW50IGF1dGhvciB0byBzdHJ1Y3R1cmUgYW55IG51bWJlciBvZiBtZXRob2QgQ29udGVudCBFbGVtZW50cyBvZiBhbnkgc3VidHlwZSBiYXNlZCBvbiB1c2VyLWRlZmluZWQgY3JpdGVyaWEuICBCZWNhdXNlIENvbnRlbnQgQ2F0ZWdvcmllcyAoYW5kIHRoZXJlZm9yZSBDdXN0b20gQ2F0ZWdvcmllcywgdG9vKSBhcmUgQ29udGVudCBFbGVtZW50cyB0aGVtc2VsdmVzLCBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byByZWN1cnNpdmVseSBjYXRlZ29yaXplIENvbnRlbnQgQ2F0ZWdvcmllcyBhcyB3ZWxsLiAgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGFsc28gYmUgbmVzdGVkIHdpdGggYW55IENvbnRlbnQgQ2F0ZWdvcnkuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBjYXRlZ29yaXplIGNvbnRlbnQgYmFzZWQgb24gdGhlIHVzZXIncyBjcml0ZXJpYSBhcyB3ZWxsIGFzIHRvIGRlZmluZSB3aG9sZSB0cmVlLXN0cnVjdHVyZXMgb2YgbmVzdGVkIGNhdGVnb3JpZXMgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3lzdGVtYXRpY2FsbHkgbmF2aWdhdGUgYW5kIGJyb3dzZSBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGJhc2VkIG9uIHRoZXNlIGNhdGVnb3JpZXMuICBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGNyZWF0ZSBhIGN1c3RvbSBjYXRlZ29yeSB0byBsb2dpY2FsbHkgb3JnYW5pemUgY29udGVudCByZWxldmFudCBmb3IgdGhlIHVzZXIncyBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gZGVwYXJ0bWVudHM7IGUuZy4gYSAiVGVzdGluZyIgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDYXRlZ29yaXplZEVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkNhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZm9yIHBhY2thZ2luZyBNZXRob2QgRWxlbWVudHMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIHNoYWxsIGJlIGxvY2F0ZWQgaW4gZXhhY3RseSBvbmUgb2YgTWV0aG9kIFBhY2thZ2UncyBjb25jcmV0ZSBzcGVjaWFsaXphdGlvbnMgKGUuZy4gQ29udGVudCBQYWNrYWdlKS4gICBNZXRob2QgUGFja2FnZSBkZWZpbmVzIGNvbW1vbiBwcm9wZXJ0aWVzIGZvciBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4gRWxlbWVudHMgYXJlIG9yZ2FuaXplZCBpbiBNZXRob2QgUGFja2FnZXMgdG8gc3RydWN0dXJlIGxhcmdlIHNjYWxlIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYXMgd2VsbCBhcyB0byBkZWZpbmUgYSBtZWNoYW5pc20gZm9yIHJldXNlLiAgTWV0aG9kIEVsZW1lbnRzIGZyb20gb25lIHBhY2thZ2UgY2FuIHJldXNlIGVsZW1lbnQgZnJvbSBvdGhlciBwYWNrYWdlcyBieSBkZWZpbmluZyBhIHJldXNlZFBhY2thZ2VzIGxpbmsuICBGb3IgZXhhbXBsZSwgYSB3b3JrIHByb2R1Y3QgZGVmaW5lZCBpbiBvbmUgcGFja2FnZSBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCBmb3IgVGFza3MgZGVmaW5lZCBpbiBvdGhlciBwYWNrYWdlcy4gIEJ5IHJldXNpbmcgaXQgZnJvbSBvbmUgY29tbW9uIHBsYWNlIChpLmUuIHRoZSBwYWNrYWdlIGluIHdoaWNoIGl0IGhhcyBiZWVuIGRlZmluZWQpIGVuc3VyZXMgdGhhdCBubyByZWR1bmRhbnQgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudHMgYXJlIHJlcXVpcmVkLiAgQWxzbyBtYWludGVuYW5jZSBvZiBtZXRob2QgY29udGVudCBpcyBncmVhdGx5IGltcHJvdmVkIGFzIGNoYW5nZXMgY2FuIGJlIHBlcmZvcm1lZCBpbiBvbmx5IG9uZSBwbGFjZS4gIE5vdGUsIHRoYXQgb3RoZXIgcGFja2FnZXMgd2lsbCBpbnRyb2R1Y2UgbW9yZSBzcGVjaWFsaXphdGlvbnMgb2YgTWV0aG9kIFBhY2thZ2UsIGUuZy4gUHJvY2VzcyBQYWNrYWdlIGFuZCBQcm9jZXNzIENvbXBvbmVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2VkUGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2xvYmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIENvbnRlbnQgRWxlbWVudHMgYW5kIENvbnRlbnQgRWxlbWVudHMsIG9ubHkuICBFeGFtcGxlcyBmb3IgQ29udGVudCBFbGVtZW50IGFyZSBBcnRpZmFjdHMsIFRhc2tzLCBSb2xlcywgZXRjLiAgQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudEVsZW1lbnQiIHR5cGU9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGVudENhdGVnb3J5IiB0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBQcm9jZXNzIHBhY2thZ2UuCi1Qcm9jZXNzIEVsZW1lbnRzIHJlcHJlc2VudHMgUHJvY2VzcyBzcGVjaWZpYyBlbGVtZW50cyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIFByb2Nlc3MgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBQcm9jZXNzIEVsZW1lbnQgZnJvbSBDb250ZW50IEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQbGFubmluZ0RhdGEiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBQcm9jZXNzIEVsZW1lbnQgdGhhdCBhZGRzIHBsYW5uaW5nIGRhdGEgdG8gQnJlYWtkb3duIEVsZW1lbnRzIHdoZW4gaXQgaXMgdXNlZCBmb3IgYSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlLiAgRm9yIERlbGl2ZXJ5IFByb2Nlc3NlcyBhbmQgQ2FwYWJpbGl0eSBQYXR0ZXJucyB0aGlzIGNsYXNzIGNhbiBlaXRoZXIgbm90IGJlIGluc3RhbnRpYXRlZCBvciBwb3B1bGF0ZWQgd2l0aCBkZWZhdWx0IGRhdGEuCi1QbGFubmluZyBEYXRhIGZhY3RvcnMgb3V0IHNwZWNpZmljIG9wdGlvbmFsIGRhdGEgbmVlZGVkIGZvciByZXByZXNlbnRpbmcgcGxhbm5pbmcgdGVtcGxhdGVzLiAgVGhpcyBhc3NvY2lhdGlvbiBhbGxvd3MgdG8gYWNjZXNzIHBsYW5uaW5nIGRhdGEgaWYgaXQgaXMgc3RvcmVkIGZvciB0aGUgQnJlYWtkb3duIEVsZW1lbnQuCi0oTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0RGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHN0YXJ0IGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmluaXNoRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IGZpbmlzaCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQWZ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGVkQmVmb3JlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBsYW5uaW5nRGF0YSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlckFjdGl2aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnbG9iYWwgdW5pcXVlIGlkIGZvciBhIHdvcmsgb3JkZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIHR5cGU9InVtYTpCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQaGFzZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlcmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikhvd1RvU3RhZmYiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmaW5lZERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NvcGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVXNhZ2VOb3RlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dEZyb20iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RMaWJyYXJ5IiB0eXBlPSJ1bWE6TWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwNjA5MDcxMzM0LnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzZTRmZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA2MDkwNzEzMzQueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kc1JlcGxhY2VzIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVkRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpOYW1lZEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQYWNrYWdlYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3duZWRSdWxlIiB0eXBlPSJ1bWE6Q29uc3RyYWludCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlNlY3Rpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBzdHJ1Y3R1cmFsIHN1YnNlY3Rpb25zIG9mIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIHNlY3Rpb25EZXNjcmlwdGlvbiBhdHRyaWJ1dGUuICBJdCBpcyB1c2VkIGZvciBlaXRoZXIgbGFyZ2Ugc2NhbGUgZG9jdW1lbnRhdGlvbiBvZiBDb250ZW50IEVsZW1lbnRzIG9yZ2FuaXplZCBpbnRvIHNlY3Rpb25zIGFzIHdlbGwgYXMgdG8gZmxleGlibHkgYWRkIG5ldyBTZWN0aW9ucyB0byBDb250ZW50IEVsZW1lbnRzIHVzaW5nIGNvbnRyaWJ1dGlvbiB2YXJpYWJpbGl0eSBhZGRlZCB0byB0aGUgU2VjdGlvbiBjb25jZXB0IGZvciBNZXRob2QgUGx1Zy1pbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlcyBzdG9yZSB0aGUgZGVzY3JpcHRpb24gdGV4dCBmb3IgYSBDb250ZW50IERlc2NyaXB0aW9uJ3MgU2VjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWN0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZGVjZXNzb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kVW5pdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iS2V5Q29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsSW5mbyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBcHBsaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYWNrZ3JvdW5kIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHb2FscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJMZXZlbHNPZkFkb3B0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvYmxlbSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RPZk5vdEhhdmluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWFzb25zRm9yTm90TmVlZGluZyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyaWVmT3V0bGluZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uT3B0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGFja2FnaW5nR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNraWxscyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3lub255bXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViRGlzY2lwbGluZSIgdHlwZT0idW1hOkRpc2NpcGxpbmUiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpc2NpcGxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRG9tYWluIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViZG9tYWluIiB0eXBlPSJ1bWE6RG9tYWluIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+T3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZVNldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcml6ZWRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNlZFBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRFbGVtZW50IiB0eXBlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgdHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdGFydERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpbmlzaERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyYW5rIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEFmdGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZXNlbnRlZEJlZm9yZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQbGFubmluZ0RhdGEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJBY3Rpdml0eSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICJTUkEuRXN0YWJsaXNoIFJlcXVpcmVtZW50cyIgd2l0aCBTUkEgaW5kaWNhdGluZyB0aGF0IHRoaXMgQWN0aXZpdHkgYmVsb25ncyB0byB0aGUgIlNvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyIgbW9kdWxlLiAgQW5vdGhlciBjb21tb24gYXBwbGljYXRpb24gZm9yIHByZWZpeCBpcyB0byBxdWFsaWZ5IHJvbGVzIGluIFJvbGUgRGVzY3JpcHRvcnMuICBGb3IgZXhhbXBsZSwgIkN1c3RvbWVyLkFyY2hpdGVjdCIgd291bGQgZGVmaW5lIGEgIkN1c3RvbWVyIiBwcmVmaXggZm9yIHRoZSBSb2xlIERlc2NyaXB0b3IgIkFyY2hpdGVjdCIgZXhwcmVzc2luZyB0aGF0IHRoaXMgaXMgYW4gYXJjaGl0ZWN0IG9uIHRoZSBjdXN0b21lciBzaWRlIGFuZCBub3QgdGhlIGRldmVsb3BtZW50IHRlYW0gc2lkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1BsYW5uZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEga2V5IGFwcGxpY2F0aW9uIGZvciBEZXZlbG9wbWVudCBQcm9jZXNzZXMgZXhwcmVzc2VkIHdpdGggQnJlYWtkb3duIHN0cnVjdHVyZXMgaXMgdG8gZ2VuZXJhdGUgYSBwcm9qZWN0IHBsYW4gZnJvbSBpdC4gIEEgcHJvY2VzcyBhcyBkZWZpbmVkIGluIFVNQSAoY2YuIHdpdGggU2VjdGlvbnMgWFggYW5kIDUuMikgaXMgYSBtdWx0aS1kaW1lbnNpb25hbCBzdHJ1Y3R1cmUgZGVmaW5pbmcgd2hhdCB3b3JrIGlzIGJlaW5nIHBlcmZvcm1lZCBhdCB3aGF0IHRpbWUgYnkgd2hpY2ggcm9sZXMgdXNpbmcgd2hpY2ggaW5wdXQgYW5kIHByb2R1Y2luZyB3aGF0IG91dHB1dHMuICBBIHByb2plY3QgcGxhbiBhcyBpdCBpcyByZXByZXNlbnRlZCBpbiBwcm9qZWN0IHBsYW5uaW5nIHRvb2xzIHN1Y2ggYXMgSUJNIFJhdGlvbmFsIFBvcnRmb2xpbyBNYW5hZ2VyIG9yIE1pY3Jvc29mdCBQcm9qZWN0IG5vcm1hbGx5IGRvZXMgbm90IG5lZWQgYWxsIHRoaXMgaW5mb3JtYXRpb24gYW5kIGlzIG5vcm1hbGx5IGxpbWl0ZWQgdG8ganVzdCByZXByZXNlbnRpbmcgYSBzdWJzZXQuICBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIE1TIFByb2plY3QgcGxhbiBvbmx5IHJlcHJlc2VudHMgdGhlIHdvcmsgYnJlYWtkb3duIGNvbnNpc3Rpbmcgb2YgVGFza3MgYW5kIEFjdGl2aXRpZXMgKHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBzdW1tYXJ5IHRhc2tzKS4gIEl0IGRvZXMgbm90IHNob3cgdGhlIGlucHV0IGFuZCBvdXRwdXQgV29yayBQcm9kdWN0cyBmb3IgYSBUYXNrLCBidXQgaXQgY2FuIHNob3cgd2hpY2ggcm9sZXMgc2hhbGwgYmUgc3RhZmZlZCBmb3IgcGVyZm9ybWluZyB0aGUgVGFzay4gIEhvd2V2ZXIsIHN1Y2ggcm9sZSBhbGxvY2F0aW9uIG5lZWQgdG8gYmUgcmVwbGFjZWQgd2l0aCBjb25jcmV0ZSByZXNvdXJjZXMgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBTb21ldGltZXMgcHJvamVjdCBwbGFucyBjYW4gdGhlbiBhZ2FpbiBiZSBvcmdhbml6ZWQgZGlmZmVyZW50bHkgYnkgb3JnYW5pemluZyB3b3JrIGJ5IGRlbGl2ZXJhYmxlcyBpbiB3aGljaCBXb3JrIFByb2R1Y3RzIGFyZSBtYXBwZWQgdG8gdGhlIHBsYW4ncyBzdW1tYXJ5IHRhc2tzIGFuZCBUYXNrIHRoYXQgaGF2ZSB0aGVzZSB3b3JrIHByb2R1Y3RzIGFzIG91dHB1dCBtYXBwZWQgYmVsb3cgc3VjaCBhcyBzdW1tYXJ5IHRhc2suICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBjYW4gbWFrZSByZWNvbW1lbmRhdGlvbnMgYWJvdXQgd2hpY2ggZWxlbWVudHMgdG8gaW5jbHVkZSBhbmQgd2hpY2ggdG8gZXhjbHVkZSB3aGVuIGdlbmVyYXRpbmcgYSBwbGFuLiAgV2hlbiB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSBpcyBzZXQgdG8gRmFsc2UgZm9yIGFuIGluc3RhbmNlIG9mIGEgQnJlYWtkb3duIEVsZW1lbnQsIHRoZW4gdGhpcyBlbGVtZW50IHNoYWxsIG5vdCBiZSBub3QgaW5jbHVkZWQgd2hlbiBhIGNvbmNyZXRlIHByb2plY3QgcGxhbiBpcyBiZWluZyBnZW5lcmF0ZWQgZnJvbSB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoaXMgZWxlbWVudC4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imhhc011bHRpcGxlT2NjdXJyZW5jZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkp1c3QgYXMgdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgdGhlIGhhc011bHRpcGxlT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBhbiBpbXBhY3Qgb24gZ2VuZXJhdGluZyBwbGFucyBmcm9tIGEgUHJvY2Vzcy4gIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQgdGhlbiBpdCB3aWxsIHR5cGljYWxseSBvY2N1ciBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUgQWN0aXZpdHkuICBGb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldGFpbCBVc2UgQ2FzZSIgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya09yZGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gIAotVGhlIFdvcmsgT3JkZXIgY2xhc3MgZGVmaW5lcyBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIHJlbGF0aW9ucyBhbW9uZ3N0IEJyZWFrZG93biBFbGVtZW50cy4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW4gcGFydGljdWxhciBjcml0aWNhbCBmb3IgcGxhbm5pbmcgYXBwbGljYXRpb25zLiAgU2VlIG1vcmUgZGV0YWlscyBvbiBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF0IFdvcmsgT3JkZXIgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2xvYmFsIHVuaXF1ZSBpZCBmb3IgYSB3b3JrIG9yZGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImxpbmtUeXBlIiB0eXBlPSJ1bWE6V29ya09yZGVyVHlwZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6c2ltcGxlQ29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IHByb3ZpZGVzIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlcHJlc2VudCBvciByZWZlciB0byBXb3JrIERlZmluaXRpb25zLiAgRm9yIGV4YW1wbGUgaXRzIHN1YmNsYXNzIEFjdGl2aXR5IGRlZmluZXMgd29yayBhcyBpdCBpcyBhbHNvIGEgc3ViY2xhc3Mgb2YgV29yayBEZWZpbml0aW9uLiAgSXRzIHN1YmNsYXNzIFRhc2sgRGVzY3JpcHRvciBkb2VzIG5vdCBkZWZpbmUgd29yayBieSBpdHNlbGYsIGJ1dCByZWZlcnMgdG8gYSBXb3JrIERlZmluaXRpb24gYW5kIHRoZXJlZm9yZSBjYW4gaGF2ZSB0aGUgc2FtZSBjb21tb24gcHJvcGVydGllcyBhbmQgV29yayBCcmVha2Rvd24gRWxlbWVudCBoYXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ1bWE6V29ya09yZGVyIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUmVwZWF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgcmVwZXRpdGlvbiBvZiB3b3JrLCBlLmcuIGl0ZXJhdGlvbnMuICBBIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIHdpdGggdGhpcyBhdHRyaWJ1dGUgc2V0IHRvIFRydWUgc2hhbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgc2V0IG9mIGFydGlmYWN0cy4gIEZvciBleGFtcGxlLCBmb3IgYW4gaW5zdGFuY2Ugb2YgSXRlcmF0aW9uIChkZWZpbmVkIGFzIGEgc3BlY2lhbCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBiZWxvdykgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgYnkgZGVmYXVsdCBpbmRpY2F0aW5nIHRoYXQgZXZlcnkgc3ViLUFjdGl2aXR5IHdpbGwgYmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBIb3dldmVyLCBhbnkgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY2FuIHNldCB0aGlzIGF0dHJpYnV0ZSB0byBUcnVlIHRvIGRlZmluZSBpdGVyYXRpb25zIChlLmcuIHRvIGl0ZXJhdGUgb25lIEFjdGl2aXR5IGNvbnNpc3Rpbmcgb2YgbWFueSBzdWItYWN0aXZpdGllcyBvciBldmVuIFBoYXNlcywgYnV0IHRvIGl0ZXJhdGUganVzdCBvbmUgVGFzaykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNPbmdvaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0V2ZW50RHJpdmVuIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNaWxlc3RvbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uCi1BY3Rpdml0eSByZXByZXNlbnRzIGEgZ3JvdXBpbmcgZWxlbWVudCBmb3Igb3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIHN1Y2ggYXMgQWN0aXZpdGllcywgRGVzY3JpcHRvcnMsIE1pbGVzdG9uZXMsIGV0Yy4gIEl0IGlzIG5vdCBwZXItc2UgYSAnaGlnaC1sZXZlbCcgZ3JvdXBpbmcgb2Ygb25seSB3b3JrIGFzIGluIG90aGVyIG1ldGEtbW9kZWxzLCBidXQgZ3JvdXBzIGFueSBraW5kIG9mIEJyZWFrZG93biBFbGVtZW50cy4gIEZvciBleGFtcGxlLCBvbmUgY2FuIGRlZmluZSB2YWxpZCBBY3Rpdml0aWVzIHRoYXQgZ3JvdXAgb25seSBXb3JrIFByb2R1Y3RzIERlc2NyaXB0b3JzIHdpdGhvdXQgYW55IG1hdGNoaW5nIFRhc2sgRGVzY3JpcHRvcnMuICBBY3Rpdml0aWVzIGFsc28gaW5oZXJpdCBhbGwgcHJvcGVydGllcyBmcm9tIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIGluZGlyZWN0bHkgZnJvbSBQcm9jZXNzIEVsZW1lbnQ7IGkuZS4gQWN0aXZpdHkgaXMgcmVhZHkgdG8gaGF2ZSBhIGZ1bGwgY29udGVudCBkZXNjcmlwdGlvbiBhdHRhY2hlZCB0byBpdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiB0eXBlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9hZG1hcCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgZGVsaXZlcnkgcGF0dGVybnMgYW5kIG1vZGVscy4gSXQgaXMgdXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFByb2Nlc3MgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJ5IFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdENoYXJhY3RlcmlzdGljcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzczwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmlza0xldmVsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGluZ1RlY2huaXF1ZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVHlwZU9mQ29udHJhY3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZVJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0VG8iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXRGcm9tIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVsaXZlcmFibGVQYXJ0cyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAKLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4KLUZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaXB0b3IiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgcHJveHkgZm9yIGEgVGFzayBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgVGFzayBEZXNjcmlwdG9ycyB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuIFRoZXJlZm9yZSBvbmUgVGFzayBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBUYXNrIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLUEga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2VzcyBpcyB0aGF0IGEgQ29udGVudCBFbGVtZW50IHN1Y2ggYXMgVGFzayBkZXNjcmliZXMgYWxsIGFzcGVjdHMgb2YgZG9pbmcgd29yayBkZWZpbmVkIGFyb3VuZCB0aGlzIFRhc2suICBUaGlzIGRlc2NyaXB0aW9uIGlzIG1hbmFnZWQgaW4gc3RlcHMsIHdoaWNoIGFyZSBtb2RlbGVkIGFzIFNlY3Rpb25zIG9mIHRoZSBUYXNrcycgQ29udGVudCBEZXNjcmlwdGlvbnMuICBXaGVuIGFwcGx5aW5nIGEgVGFzayBpbiBhIFByb2Nlc3MnIEFjdGl2aXR5IHdpdGggYSBUYXNrIERlc2NyaXB0b3IgYSBQcm9jZXNzIEVuZ2luZWVyIG5lZWRzIHRvIGluZGljYXRlIHRoYXQgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gdGhlIFByb2Nlc3MgZGVmaW5pdGlvbiBmb3Igd2hpY2ggdGhlIFRhc2sgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLCBvbmx5IGEgc3Vic2V0IG9mIHN0ZXBzIHNoYWxsIGJlIHBlcmZvcm1lZC4gIEhlIGRlZmluZXMgdGhpcyBzZWxlY3Rpb24gdXNpbmcgdGhlIHNlbGVjdGVkU3RlcHMgYXNzb2NpYXRpb24uICBJZiBoZSB3YW50cyB0byBhZGQgc3RlcHMgdG8gYSBUYXNrIERlc2NyaXB0b3IsIGhlIGNhbiBkZXNjcmliZSB0aGVzZSBlaXRoZXIgcHJhZ21hdGljYWxseSBpbiB0aGUgcmVmaW5lZERlc2NyaXB0aW9uIGF0dHJpYnV0ZSBvciAncHJvcGVybHknIGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBUYXNrIHRvIHRoZSBUYXNrIHRoZSBUYXNrIERlc2NyaXB0b3IgcmVmZXJzIHRvLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lzdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN0ZXAiIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbXBvc2l0ZVJvbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFJvbGUgRGVzY3JpcHRvciB0aGF0IHJlbGF0ZXMgdG8gbW9yZSB0aGVuIG9uZSBSb2xlLiAgSXQgcmVwcmVzZW50cyBhIGdyb3VwaW5nIG9mIFJvbGVzIHdpdGggdGhlIG1haW4gcHVycG9zZSBvZiBzaW1wbGlmaWNhdGlvbiwgaS5lLiByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIHJvbGVzIGZvciBhIHByb2Nlc3MuCi1BIENvbXBvc2l0ZSBSb2xlIGlzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgdGhhdCBjYW4gYmUgdXNlZCBpbiBhbiBBY3Rpdml0eSBvciBQcm9jZXNzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIFJvbGVzLiAgQSB0eXBpY2FsIGFwcGxpY2F0aW9uIHdvdWxkIGJlIGEgcHJvY2VzcyBmb3IgYSBzbWFsbCB0ZWFtIGluIHdoaWNoIGEgc3RhbmRhcmQgc2V0IG9mIHJvbGVzIGZyb20gdGhlIG1ldGhvZCBjb250ZW50IHdvdWxkIGJlIGFsbCBwZXJmb3JtZWQgYnkgb25lIG9yIG1vcmUgcmVzb3VyY2UuICBCeSB1c2luZyBDb21wb3NpdGUgUm9sZSB0aGUgcHJvY2VzcyB3b3VsZCBzdWdnZXN0IGEgdHlwaWNhbCBjbHVzdGVyaW5nIG9mIFJvbGVzIHRvIFJlc291cmNlcy4gIEEgQ29tcG9zaXRlIFJvbGUgY291bGQgcGVyZm9ybSBhbGwgVGFza3MgZGVmaW5lZCBmb3IgdGhlIFJvbGVzIGl0IHJlZmVycyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlJvbGVEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFnZ3JlZ2F0ZWRSb2xlIiB0eXBlPSJ1bWE6Um9sZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZWFtUHJvZmlsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZ3JvdXBzIFJvbGUgRGVzY3JpcHRvcnMgb3IgUmVzb3VyY2UgRGVmaW5pdGlvbnMgZGVmaW5pbmcgYSBuZXN0ZWQgaGllcmFyY2h5IG9mIHRlYW1zIGFuZCB0ZWFtIG1lbWJlcnMuCi1Xb3JrIGFzc2lnbm1lbnRzIGFuZCBXb3JrIFByb2R1Y3QgcmVzcG9uc2liaWxpdGllcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gQWN0aXZpdHkgdG8gQWN0aXZpdHkgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LiBEaWZmZXJlbnQgcGhhc2VzIHJlcXVpcmUgZGlmZmVyZW50IHN0YWZmaW5nIHByb2ZpbGVzLCBpLmUuIGRpZmZlcmVudCBza2lsbHMgYW5kIHJlc291cmNlcyBkb2luZyBkaWZmZXJlbnQgdHlwZXMgb2Ygd29yay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIG5lZWRzIHRvIGRlZmluZSBzdWNoIGRpZmZlcmVudCBwcm9maWxlcyBpbiBhIGZsZXhpYmxlIG1hbm5lci4gIFdoZXJlYXMgQ29yZSBNZXRob2QgQ29udGVudCBkZWZpbmVzIHN0YW5kYXJkIHJlc3BvbnNpYmlsaXRpZXMgYW5kIGFzc2lnbm1lbnRzLCBhIHByb2Nlc3MgZXhwcmVzcyBieSBhIGJyZWFrZG93biBzdHJ1Y3R1cmVzIG5lZWRzIHRvIGJlIGFibGUgcmVmaW5lIGFuZCByZWRlZmluZSB0aGVzZSB0aHJvdWdob3V0IGl0cyBkZWZpbml0aW9uLiAgUm9sZSBEZXNjcmlwdG9ycywgUmVzb3VyY2UgRGVmaW5pdGlvbnMsIGFzIHdlbGwgYXMgVGVhbSBQcm9maWxlcyBwcm92aWRlIHRoZSBkYXRhIHN0cnVjdHVyZSBuZWNlc3NhcnkgdG8gYWNoaWV2ZSB0aGlzIGZsZXhpYmlsaXR5IGFuZCB0byBwcm92aWRlIGEgcHJvY2VzcyB1c2VyIHdpdGggdGhlIGNhcGFiaWxpdHkgdG8gZGVmaW5lIGRpZmZlcmVudCB0ZWFtcyBhbmQgcm9sZSByZWxhdGlvbnNoaXBzIGZvciBldmVyeSBBY3Rpdml0eSAoaW5jbHVkaW5nIEFjdGl2aXRpZXMgb24gYW55IG5lc3RpbmctbGV2ZWwgYXMgd2VsbCBhcyBJdGVyYXRpb25zIG9yIFBoYXNlcykuCi1IZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViVGVhbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLUNvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW5jbHVkZXNQYXR0ZXJuIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0Q29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJWYWxpZENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaWFncmFtVVJJIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBVUkkgb2YgdGhlIGRpYWdyYW0gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLgotQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGEgUHJvY2VzcyB0aGF0IGNvdmVycyBhIHdob2xlIGRldmVsb3BtZW50IGxpZmVjeWNsZSBmcm9tIGJlZ2lubmluZyB0byBlbmQuICBBIERlbGl2ZXJ5IFByb2Nlc3Mgc2hhbGwgYmUgdXNlZCBhcyBhIHRlbXBsYXRlIGZvciBwbGFubmluZyBhbmQgcnVubmluZyBhIHByb2plY3QuICBJdCBwcm92aWRlcyBhIGNvbXBsZXRlIGxpZmVjeWNsZSBtb2RlbCB3aXRoIHByZWRlZmluZWQgcGhhc2VzLCBpdGVyYXRpb25zLCBhbmQgYWN0aXZpdGllcyB0aGF0IGhhdmUgYmVlbiBkZXRhaWxlZCBieSBzZXF1ZW5jaW5nIHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSXQgaXMgZGVmaW5lZCBvbiB0aGUgYmFzaXMgb2YgZXhwZXJpZW5jZSB3aXRoIHBhc3QgcHJvamVjdHMgb3IgZW5nYWdlbWVudHMsIGFuZC9vciB0aGUgYmVzdCBwcmFjdGljZSB1c2Ugb2YgYSBkZXZlbG9wbWVudCBvciBkZWxpdmVyeSBhcHByb2FjaC4gIEl0IGRlZmluZXMgd2hhdCBnZXRzIHByb2R1Y2VkLCBob3cgdGhvc2UgaXRlbXMgYXJlIHByb2R1Y2VkLCBhbmQgdGhlIHJlcXVpcmVkIHN0YWZmaW5nIGluIHRoZSBmb3JtIG9mIGludGVncmF0ZWQgV29yaywgV29yayBQcm9kdWN0LCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlcy4gIEZvciBleGFtcGxlLCBhIHByb2Nlc3MgZW5naW5lZXIgY2FuIGRlZmluZSBhbHRlcm5hdGl2ZSBEZWxpdmVyeSBQcm9jZXNzZXMgZm9yIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3RzIHRoYXQgZGlmZmVyIGluIHRoZSBzY2FsZSBvZiB0aGUgZW5nYWdlbWVudCBhbmQgc3RhZmZpbmcgbmVjZXNzYXJ5LCB0aGUgdHlwZSBvZiB0aGUgc29mdHdhcmUgYXBwbGljYXRpb24gdG8gYmUgZGV2ZWxvcGVkLCB0aGUgZGV2ZWxvcG1lbnQgbWV0aG9kcyBhbmQgdGVjaG5vbG9naWVzIHRvIGJlIHVzZWQsIGV0Yy4gIEFsdGhvdWdoLCB0aGUgRGVsaXZlcnkgUHJvY2VzcyBhaW1zIHRvIGNvdmVyIGEgd2hvbGUgcHJvamVjdCBpdCBrZWVwcyBjZXJ0YWluIGRlY2lzaW9uIHRoYXQgYXJlIHRvbyBwcm9qZWN0IHNwZWNpZmljIG9wZW4uICBGb3IgZXhhbXBsZSwgdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgZGVmaW5lcyB3aGljaCBCcmVha2Rvd24gRWxlbWVudHMgaGF2ZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvciBpcyByZXBlYXRhYmxlIHZpYSBpdCByZXNwZWN0aXZlIGF0dHJpYnV0ZXMsIGJ1dCBkb2VzIG5vdCBzYXkgaG93IG1hbnkgb2NjdXJyZW5jZXMgYW5kIGhvdyBtYW55IHJlcGVhdHMvaXRlcmF0aW9ucyBpdCB3aWxsIGhhdmUuICBUaGVzZSBkZWNpc2lvbnMgaGF2ZSB0byBiZSBkb25lIGJ5IGEgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYSBjb25jcmV0ZSBwcm9qZWN0LCBwcm9qZWN0IHBoYXNlLCBvciBwcm9qZWN0IGl0ZXJhdGlvbnMuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWx3YXlzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgYSBwcm9jZXNzIGluIHRlcm1zIG9mIGNvbXBsZXRlbmVzcyBvZiB0aGUgbGlmZWN5Y2xlLCBhcyB3ZWxsIGFzIGluIHRlcm1zIG9mIGFsbCB0aHJlZSB2aWV3cyBvbiB0aGUgcHJvY2VzcyB3aGljaCBhcmUgdGhlIFdvcmsgQnJlYWtkb3duIFN0cnVjdHVyZSwgV29yayBQcm9kdWN0IEJyZWFrZG93biBTdHJ1Y3R1cmUsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmUgaGF2ZSB0byBiZSBmdWxseSBhbmQgY29uc2lzdGVudGx5IHBvcHVsYXRlZC4gIENvbnNpc3RlbmN5IG9mIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhY3R1YWxseSBlbnN1cmVkIGJ5IHRoZSBmYWN0IHRoYXQgYWxsIHRocmVlIGJyZWFrZG93bnMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgYW5kIG9uZSBwYXJ0aWN1bGFyIGJyZWFrZG93biBzdWNoIGFzIFRlYW0gQnJlYWtkb3duIGlzIGp1c3QgYSB2aWV3IG9uIHRoYXQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVkdWNhdGlvbk1hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJuIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4KLUEgQ2FwYWJpbGl0eSBQYXR0ZXJuIGlzIGEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGEgZ2VuZXJhbCBwcm9jZXNzIGFyZWEgdGhhdCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgZGV2ZWxvcG1lbnQgYXBwcm9hY2ggdG8gY29tbW9uIHByb2JsZW1zLiAgRXhhbXBsZXMgZm9yIENhcGFiaWxpdHkgUGF0dGVybiBjb3VsZCBiZSAndXNlIGNhc2UtYmFzZWQgcmVxdWlyZW1lbnRzIG1hbmFnZW1lbnQnLCAndXNlIGNhc2UgYW5hbHlzaXMnLCBvciAndW5pdCB0ZXN0aW5nJy4gVHlwaWNhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHksIENhcGFiaWxpdHkgUGF0dGVybnMgaGF2ZSB0aGUgc2NvcGUgb2Ygb25lIGRpc2NpcGxpbmUgcHJvdmlkaW5nIGEgYnJlYWtkb3duIG9mIHJldXNhYmxlIGNvbXBsZXggQWN0aXZpdGllcywgcmVsYXRpb25zaGlwcyB0byB0aGUgUm9sZXMgd2hpY2ggcGVyZm9ybSBUYXNrcyB3aXRoaW4gdGhlc2UgQWN0aXZpdGllcywgYXMgd2VsbCBhcyB0byB0aGUgV29yayBQcm9kdWN0cyB0aGF0IGFyZSB1c2VkIGFuZCBwcm9kdWNlZC4gIEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGRvZXMgbm90IHJlbGF0ZSB0byBhbnkgc3BlY2lmaWMgcGhhc2Ugb3IgaXRlcmF0aW9uIG9mIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLCBhbmQgc2hvdWxkIG5vdCBpbXBseSBhbnkuICBJbiBvdGhlciB3b3JkcywgYSBwYXR0ZXJuIHNob3VsZCBiZSBkZXNpZ25lZCBpbiBhIHdheSB0aGF0IGl0IGlzIGFwcGxpY2FibGUgYW55d2hlcmUgaW4gYSBEZWxpdmVyeSBQcm9jZXNzLiAgVGhpcyBlbmFibGVzIGl0cyBBY3Rpdml0aWVzIHRvIGJlIGZsZXhpYmx5IGFzc2lnbmVkIHRvIHdoYXRldmVyIHBoYXNlcyB0aGVyZSBhcmUgaW4gdGhlIERlbGl2ZXJ5IFByb2Nlc3MgdG8gd2hpY2ggaXQgaXMgYmVpbmcgYXBwbGllZC4gIEl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBkZXNpZ24gYSBDYXBhYmlsaXR5IFBhdHRlcm4gdG8gcHJvZHVjZSBvbmUgb3IgbW9yZSBnZW5lcmljIERlbGl2ZXJhYmxlcy4gIFRoZSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gaXMgdGhhdCBlYWNoIEFjdGl2aXR5IGluIHRoZSBDYXBhYmlsaXR5IFBhdHRlcm4gcHJvZHVjZXMgb25lIERlbGl2ZXJhYmxlLCBhbmQgdGhlIGxhc3QgVGFzayBEZXNjcmlwdG9yIGluIHRoZSBBY3Rpdml0eSBleHBsaWNpdGx5IG91dHB1dHMganVzdCB0aGlzIERlbGl2ZXJhYmxlLiAgVGhpcyBlbmFibGVzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIHNlbGVjdCBQYXR0ZXJucyBvciBqdXN0IEFjdGl2aXRpZXMgYnkgZGVjaWRpbmcgd2hpY2ggRGVsaXZlcmFibGVzIGFyZSByZXF1aXJlZC4gIEl0IGFsc28gb2ZmZXJzIGEgc2ltcGxlIGludGVncmF0aW9uIGFwcHJvYWNoOiBhbiBBY3Rpdml0eSBmcm9tIGEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGxpbmtlZCB0byB0aGUgUGhhc2Ugb3IgSXRlcmF0aW9uIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHByb2R1Y2UgdGhlIEFjdGl2aXR5J3MgRGVsaXZlcmFibGUuICBLZXkgYXBwbGljYXRpb25zIGFyZWFzIG9mIC8gYXJlYXMgb2YgcmV1c2UgZm9yIENhcGFiaWxpdHkgUGF0dGVybnMgYXJlOgotLSBUbyBzZXJ2ZSBhcyBidWlsZGluZyBibG9ja3MgZm9yIGFzc2VtYmxpbmcgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zLiAgTm9ybWFsbHkgZGV2ZWxvcGluZyBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgbm90IGRvbmUgZnJvbSBzY3JhdGNoIGJ1dCBieSBzeXN0ZW1hdGljYWxseSBhcHBseWluZyBhbmQgYmluZGluZyBwYXR0ZXJucy4gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBwYXR0ZXJuIGFwcGxpY2F0aW9uIG9mICdjb3B5LWFuZC1tb2RpZnknLCB3aGljaCBhbGxvd3MgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gaW5kaXZpZHVhbGx5IGN1c3RvbWl6ZSB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIHBhcnRpY3VsYXIgc2l0dWF0aW9uIGl0IGlzIGFwcGxpZWQgZm9yLCB0aGUgUGx1Z2luIG1ldGEtbW9kZWwgcGFja2FnZSAoU2VjdGlvbiA2LjEpIGludHJvZHVjZXMgZXZlbiBtb3JlIHNvcGhpc3RpY2F0ZWQgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcyB0aGF0IHN1cHBvcnQgZHluYW1pYyBiaW5kaW5nIG9mIHBhdHRlcm5zIChpLmUuIHRoZSBwYXR0ZXJuIGlzIHJlZmVyZW5jZWQgYW5kIG5vdCBjb3BpZWQpLiAgVGhpcyB1bmlxdWUgbmV3IHdheSBvZiByZXVzaW5nIHByb2Nlc3Mga25vd2xlZGdlIGFsbG93cyB0byBmYWN0b3Igb3V0IGNvbW1vbmx5IHJlb2NjdXJyaW5nIEFjdGl2aXRpZXMgaW50byBwYXR0ZXJucyBhbmQgdG8gYXBwbHkgdGhlbSBvdmVyIGFuZCBvdmVyIGFnYWluIGZvciBhIHByb2Nlc3MuICBXaGVuIHRoZSBwYXR0ZXJuIGlzIGJlaW5nIHJldmlzZWQgb3IgdXBkYXRlZCwgYWxsIGNoYW5nZXMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZCBpbiBhbGwgcGF0dGVybiBhcHBsaWNhdGlvbiBpbiBhbGwgcHJvY2Vzc2VzIGJlY2F1c2Ugb2YgdGhlIGR5bmFtaWMgYmluZGluZy4KLS0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuCi0tIFRvIHN1cHBvcnQgcHJvY2VzcyBlZHVjYXRpb24gYnkgZGVzY3JpYmluZyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgc3VjaCBhcyBiZXN0IHByYWN0aWNlcyBvbiBob3cgdG8gcGVyZm9ybSB0aGUgd29yayBmb3IgYSBEaXNjaXBsaW5lIChlLmcuIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50KSwgZm9yIGEgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgdGVjaG5pcXVlIChhc3BlY3Qtb3JpZW50ZWQgZGV2ZWxvcG1lbnQpLCBvciBhIHNwZWNpZmljIHRlY2huaWNhbCBhcmVhIChlLmcuIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduKSwgd2hpY2ggaXMgdXNlZCBmb3IgZWR1Y2F0aW9uIGFuZCB0ZWFjaGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGlzIHByZXBhcmVkIGZvciBpbnN0YW50aWF0aW9uIGJ5IGEgcHJvamVjdCBwbGFubmluZyB0b29sLiAgVHlwaWNhbGx5LCBpdCBpcyBjcmVhdGVkIGJhc2VkIG9uIGEgUHJvY2VzcyBzdWNoIGFzIGEgRGVsaXZlcnkgUHJvY2VzcyBhcyBhIHdob2xlIChlLmcuIGluIGNhc2Ugb2YgYSB3YXRlcmZhbGwtYmFzZWQgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpIG9yIGluIHBhcnRzIChlLmcuIGluIGNhc2Ugb2YgYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IGFwcHJvYWNoKS4KLUEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlUHJvY2VzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBQcm9jZXNzIEVsZW1lbnRzLCBvbmx5LgotQSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFBhY2thZ2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiIHR5cGU9InVtYTpQcm9jZXNzRWxlbWVudCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBhIGxpc3Qgb2YgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIChzaW1pbGFyIHRvIG9wZXJhdGlvbiBkZWNsYXJhdGlvbnMpIHRoYXQgZXhwcmVzcyBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIGEgcHJvY2VzcyBjb21wb25lbnQuICBUaGVzZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgYXJlIGV4cHJlc3NlZCB1c2luZyBUYXNrIERlc2NyaXB0b3JzIHdoaWNoIGFyZSBub3QgbGlua2VkIHRvIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFzIHdlbGwgYXMgb3B0aW9uYWwgYSBSb2xlIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZVNwZWNpZmljYXRpb24iIHR5cGU9InVtYTpUYXNrRGVzY3JpcHRvciIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlSU8iIHR5cGU9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBQYWNrYWdlIHRoYXQgYXBwbGllcyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiAgQSBQcm9jZXNzIENvbXBvbmVudCByZWFsaXplcyBvbmUgb3IgbW9yZSBJbnRlcmZhY2VzIHdoaWNoIHNwZWNpZnkgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIHRoZSBjb21wb25lbnQuIFRoZXJlIG1pZ2h0IGJlIG1hbnkgY29tcG9uZW50cyByZWFsaXppbmcgdGhlIHNhbWUgaW50ZXJmYWNlcywgYnV0IHVzaW5nIGRpZmZlcmVudCB0ZWNobmlxdWVzIHRvIGFjaGlldmUgc2ltaWxhciBvdXRwdXRzIGZvciBzaW1pbGFyIGlucHV0cy4gIFdoZXJlYXMgdGhlIENvbXBvbmVudCBJbnRlcmZhY2VzIHJlcHJlc2VudCBjb21wb25lbnQgc3BlY2lmaWNhdGlvbnMgKGJsYWNrIGJveCBkZXNjcmlwdGlvbnMgb2YgdGhlIGNvbXBvbmVudCksIGdvb2QgY2FuZGlkYXRlcyBmb3IgY29tcG9uZW50IHJlYWxpemF0aW9ucyBjYW4gYmUgZm91bmQgaW4gQ2FwYWJpbGl0eSBQYXR0ZXJucyAod2hpdGUgYm94IGRlc2NyaXB0aW9ucyBmb3IgdGhlIGNvbXBvbmVudCkuCi1VTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgImJsYWNrIGJveCIuICBBdCBhbnkgcG9pbnQgZHVyaW5nIGEgcHJvamVjdCB0aGUgY29tcG9uZW50ICJyZWFsaXphdGlvbiIgZGV0YWlsaW5nIHRoZSB3b3JrIGNhbiBiZSBhZGRlZCB0byB0aGUgcHJvY2Vzcy4gIFRoZSBjb21wb25lbnQgYXBwcm9hY2ggYWxzbyBhbGxvd3MgdGhhdCBkaWZmZXJlbnQgc3R5bGVzIG9yIHRlY2huaXF1ZXMgb2YgZG9pbmcgd29yayBjYW4gYmUgcmVwbGFjZWQgd2l0aCBvbmUgYW5vdGhlci4gIEZvciBleGFtcGxlLCBhIHNvZnR3YXJlIGNvZGUgb3V0cHV0IG9mIGEgY29tcG9uZW50IGNvdWxkIGJlIHByb2R1Y2VkIHdpdGggYSBtb2RlbC1kcml2ZW4gZGV2ZWxvcG1lbnQgb3IgYSBjb2RlLWNlbnRyaWMgdGVjaG5pcXVlLiAgVGhlIGNvbXBvbmVudCBjb25jZXB0IGVuY2Fwc3VsYXRlcyB0aGUgYWN0dWFsIHdvcmsgYW5kIGxldHMgdGhlIGRldmVsb3BtZW50IHRlYW0gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB0ZWNobmlxdWUgYW5kIGZpbGwgdGhlIGNvbXBvbmVudCdzIHJlYWxpemF0aW9uIHdpdGggdGhlaXIgY2hvaWNlIG9mIEFjdGl2aXRpZXMgdGhhdCBwcm9kdWNlIHRoZSByZXF1aXJlZCBvdXRwdXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc1BhY2thZ2UiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzIiB0eXBlPSJ1bWE6UHJvY2VzcyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNlckNoYW5nZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VDb25maWd1cmF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW5TZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0b29sIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA3MDQwMzE0MjUueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTdiMTYzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9FUEZfU2NoZW1hXzIwMDcwNDAzMTQyNS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIEVQRiBVTUEgWE1MIERhdGEgSW50ZXJjaGFuZ2UgU2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6dW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIj4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iV29ya09yZGVyVHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50IGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudCBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudCBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuIFRoaXMgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdmFpbGFibGUgaW4gVU1BIGFuZCBpcyB1c2VkIHRvIHByb3ZpZGUgdmFsdWVzIGZvciBXb3JrIE9yZGVyJ3MgbGlua1R5cGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5pc2hUb0ZpbmlzaCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb1N0YXJ0Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvRmluaXNoIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IlZhcmlhYmlsaXR5VHlwZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5hIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb250cmlidXRlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmVwbGFjZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsQ29udHJpYnV0aW9uIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbFJlcGxhY2VtZW50Ii8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzUmVwbGFjZXMiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5IiB0eXBlPSJ1bWE6TWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29uc3RyYWludCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFpbkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZWZpbml0aW9uIG9mIHRoZSBjb25zdHJhaW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQkgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudFByb3BlcnR5Ij4KLQkgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLQkgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotCSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kVW5pdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iS2V5Q29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBhcnRpZmFjdC4gVXNlZCBsaWtlIGEgc3lub255bS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4JCQkJCi0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXR0YWNobWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZmllbGQgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIGF0dGFjaG1lbnRzIGF1Z21lbnRpbmcgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGZvciBndWlkYW5jZS4gIEluIHBhcnRpY3VsYXIgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciBUZW1wbGF0ZXMsIEV4YW1wbGVzLCBhbmQgUmV1c2FibGUgQXNzZXRzIHRvIGNvbnRhaW4gdGhlIGFjdHVhbCBhdHRhY2htZW50IGRlc2NyaWJlZCBpbiB0aGUgbWFpbkRlc2NyaXB0aW9uLiAgSXQgY2FuIGFkZGl0aW9uYWxseSBjb250YWluIHJlcHJlc2VudGF0aW9ucyBvZiB0aGUgZ3VpZGFuY2UgaW4ganVzdCBhIHRoaXJkIHBhcnR5IGZvcm1hdCwgZS5nLiBQREYsIE1TIFdvcmQsIG9yIFdvcmQgUGVyZmVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJhY3RpY2VEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbEluZm8iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIEluZm9ybWF0aW9uIG5vdCBjb3ZlcmVkIGJ5IHRoZSBvdGhlciBhdHRyaWJ1dGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXBwbGljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyBob3cgdGhlIFByYWN0aWNlIGlzIGJlaW5nIGFwcGxpZWQgb3IgaW50cm9kdWNlZCBpbnRvIHRoZSBjb250ZXh0IGRlc2NyaWJlZCBpbiBiYWNrZ3JvdW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFja2dyb3VuZCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR29hbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTGV2ZWxzT2ZBZG9wdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdGhlIGRpZmZlcmVudCBmb3JtcyBvciB2YXJpYW50cyBpbiB3aGljaCB0aGUgcHJhY3RpY2UgY291bGQgYmUgcmVhbGl6ZWQuIChlLmcuIGZ1bGwgYWRvcHRpb24gdmVydXMgYSBwYXJ0aWFsIGFkb3B0aW9uIG9mIHRoZSBQcmFjdGljZSk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2JsZW0iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2JsZW0gdGhlIFByYWN0aWNlIGFkZHJlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0T2ZOb3RIYXZpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgd2h5IHRoZSB3b3JrIHByb2R1Y3QgaXMgcHJvZHVjZWQgYW5kIHRvIHdoYXQgdXNlIGl0IHdpbGwgYmUgcHV0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2lyY3Vtc3RhbmNlcyBpbiB3aGljaCBpdCBpcyByZWFzb25hYmxlIG5vdCB0byBwcm9kdWNlIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIG9mIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCcmllZk91dGxpbmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRpc2N1c3NlcyBkaWZmZXJlbnQgcG9zc2libGUgYWx0ZXJuYXRpdmUgcmVwcmVzZW50YXRpb25zIGZvciB0aGUgYXJ0aWZhY3QuIEZvciBleGFtcGxlIGEgZGVzaWduIG1vZGVsIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFVNTCBtb2RlbCBvciBhbiBpbmZvcm1hbCBibG9jayBkaWFncmFtIG9yIGJ5IHRleHR1YWwgZGVzY3JpcHRpb24gb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcHJlc2VudGF0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTm90YXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+CQkJCQkKLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyYWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeHRlcm5hbERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBhY2thZ2luZ0d1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFzc2lnbm1lbnRBcHByb2FjaGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBndWlkYW5jZSBvbiBmb3IgYXNzaWduaW5nIGluZGl2aWR1YWxzIHRvIHRoZSBSb2xlIGluIHRlcm1zIG9mIHdoYXQgb3RoZXIgcm9sZXMgdGhlc2UgaW5kaXZpZHVhbHMgY291bGQgcGVyZm9ybSBhbmQgd2hhdCByZXNwb25zaWJpbGl0eSBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgYXNzaWduZWQgdG8gdGhpcyByb2xlIG1pZ2h0IGhhdmUuICBUaGUgZ3VpZGFuY2UgY2FuIGFsc28gZGVzY3JpYmUgZGlmZmVyZW50IGFzc2lnbm1lbnQgYXBwcm9hY2hlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3RzLCBlLmcuIGZvciBsYXJnZSB2ZXJzdXMgc21hbGwgdGVhbXMgd2hlcmUgaW5kaXZpZHVhbHMgY291bGQgYmUgYWxsb2NhdGVkIHRvIHJvbGVzIGZ1bGwgdGltZSB2ZXJzdXMgc2hhcmluZyByb2xlcyB3aXRoaW4gdGhlIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTa2lsbHMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN5bm9ueW1zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBzeW5vbnltcywgaS5lLiBvdGhlciBuYW1lcyB0aGUgUm9sZSBtaWdodCBiZSByZWZlcnJlZCBieS4gIFRvb2wgc3VwcG9ydCBmb3IgdGhlIG1ldGEtbW9kZWwgbWlnaHQgc3VwcG9ydCB0aGF0IGEgUm9sZSBuYW1lIGNhbiBiZSBjb25zaXN0ZW50bHkgYmUgcmVwbGFjZWQgd2l0aCBvbmUgb2YgaXRzIHN5bm9ueW1zIHRocm91Z2h0IGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQdXJwb3NlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIFRhc2sgYW5kIHdoYXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNoaWV2ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLVRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlc2VudGF0aW9uIiB0eXBlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZXNlbnRhdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgRGVzY3JpYmFibGUgRWxlbWVudCBoYXMgYSBwcmVzZW50YXRpb24gbmFtZSwgd2hpY2ggaXMgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIG5hbWUgKHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbikgbWlnaHQgYmUgc2V0IHRvICJydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50IiB0byBkaWZmZXJlbnRpYXRlIGZyb20gYSAiajJlZV9hcmNoaXRjdHVyZV9kb2N1bWVudCIgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAiQXJjaGl0ZWN0dXJlIERvY3VtZW50Ii48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFwZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RlbGluZyB3aXRoIHNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBpbnN0YW5jZXMgKGFzIGdyYXBoaWNhbCBzdGVyZW90eXBlcywgZS5nLiBhIHVzZSBjYXNlIHN5bWJvbCBmb3IgYSB1c2UgY2FzZSBhcnRpZmFjdCkgYXMgd2VsbCBhcyBwdWJsaWNhdGlvbiBvZiBjb250ZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im5vZGVpY29uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuCi1Db250ZW50IEVsZW1lbnRzIHJlcHJlc2VudHMgcmV1c2FibGUgTWV0aG9kIENvbnRlbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBtYW5hZ2VkIGluIENvbnRlbnQgUGFja2FnZXMuICBUaGUgc2VwYXJhdGlvbiBvZiBDb250ZW50IEVsZW1lbnQgZnJvbSBQcm9jZXNzIEVsZW1lbnQgYWxsb3dzIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBwdXJlIG1ldGhvZCBjb250ZW50IGZyb20gY29udGVudCB0aGF0IGlzIHJlcHJlc2VudGVkIGluIHByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkd1aWRhbmNlIGlzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBjb250ZW50IGVsZW1lbnRzIHN1Y2ggYXMgUm9sZXMsIFRhc2tzLCBhbmQgV29yayBQcm9kdWN0cy4gIEV4YW1wbGVzIGZvciBHdWlkYW5jZSBhcmUgR3VpZGVsaW5lcywgVGVtcGxhdGVzLCBDaGVja2xpc3RzLCBUb29sIE1lbnRvcnMsIEVzdGltYXRlcywgU3VwcG9ydGluZyBNYXRlcmlhbHMsIFJlcG9ydHMsIENvbmNlcHRzLCBldGMuICBUaGlzIHBhY2thZ2Ugb25seSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYWJzdHJhY3QgR3VpZGFuY2UgY2xhc3MuICBUaGUgcGFja2FnZSBHdWlkYW5jZSBUeXBlcyBkZWZpbmVzIGNvbmNyZXRlIGd1aWRhbmNlIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25jZXB0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2hlY2tsaXN0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGlkZW50aWZpZXMgYSBzZXJpZXMgb2YgaXRlbXMgdGhhdCBuZWVkIHRvIGJlIGNvbXBsZXRlZCBvciB2ZXJpLWZpZWQuICBDaGVja2xpc3RzIGFyZSBvZnRlbiB1c2VkIGluIHJldmlld3Mgc3VjaCBhcyB3YWxrdGhyb3VnaHMgb3IgaW5zcGVjdGlvbnMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFeGFtcGxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSB0eXBpY2FsLCBwYXJ0aWFsbHkgY29tcGxldGVkLCBzYW1wbGUgaW5zdGFuY2Ugb2Ygb25lIG9yIG1vcmUgd29yayBwcm9kdWN0cyBvciBzY2VuYXJpbyBsaWtlIGRlc2NyaXB0aW9ucyBvZiBob3cgVGFzayBtYXkgYmUgcGVyZm9ybWVkLiBFeGFtcGxlcyBjYW4gYmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3RzIGFzIHdlbGwgYXMgVGFza3MgdGhhdCBwcm9kdWNlIHRoZW0gYXMgd2VsbCBhcyBhbnkgb3RoZXIgQ29udGVudCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkZWxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwgb24gaG93IHRvIHBlcmZvcm0gYSBwYXJ0aWN1bGFyIHRhc2sgb3IgZ3JvdXBpbmcgb2YgdGFza3MgKGUuZy4gZ3JvdXBlZCB0b2dldGhlciBhcyBhY3Rpdml0aWVzKSBvciB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsLCBydWxlcywgYW5kIHJlY29tbWVuZGF0aW9ucyBvbiB3b3JrIHByb2R1Y3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiAgQW1vbmdzdCBvdGhlcnMsIGl0IGNhbiBpbmNsdWRlIGRldGFpbHMgYWJvdXQgYmVzdCBwcmFjdGljZXMgYW5kIGRpZmZlcmVudCBhcHByb2FjaGVzIGZvciBkb2luZyB3b3JrLCBob3cgdG8gdXNlIHBhcnRpY3VsYXIgdHlwZXMgb2Ygd29yayBwcm9kdWN0cywgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IHN1YnR5cGVzIGFuZCB2YXJpYW50cyBvZiB0aGUgd29yayBwcm9kdWN0IGFuZCBob3cgdGhleSBldm9sdmUgdGhyb3VnaG91dCBhIGxpZmVjeWNsZSwgZGlzY3Vzc2lvbnMgb24gc2tpbGxzIHRoZSBwZXJmb3JtaW5nIHJvbGVzIHNob3VsZCBhY3F1aXJlIG9yIGltcHJvdmUgdXBvbiwgbWVhc3VyZW1lbnRzIGZvciBwcm9ncmVzcyBhbmQgbWF0dXJpdHksIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgc2l6aW5nIG1lYXN1cmVzLCBvciBzdGFuZGFyZHMgZm9yIHNpemluZyB0aGUgd29yayBlZmZvcnQgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBwYXJ0aWN1bGFyIHBpZWNlIG9mIHdvcmsgYW5kIGluc3RydWN0aW9ucyBmb3IgdGhlaXIgc3VjY2Vzc2Z1bCB1c2UuIEl0IG1heSBiZSBjb21wcmlzZWQgb2YgZXN0aW1hdGlvbiBjb25zaWRlcmF0aW9ucyBhbmQgZXN0aW1hdGlvbiBtZXRyaWNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbk1ldHJpYyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9hZG1hcCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLUFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmVwb3J0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcHJlZGVmaW5lZCB0ZW1wbGF0ZSBvZiBhIHJlc3VsdCB0aGF0IGlzIGdlbmVyYXRlZCBvbiB0aGUgYmFzaXMgb2Ygb3RoZXIgd29yayBwcm9kdWN0cyBhcyBhbiBvdXRwdXQgZnJvbSBzb21lIGZvcm0gb2YgdG9vbCBhdXRvbWF0aW9uLiBBbiBleGFtcGxlIGZvciBhIHJlcG9ydCB3b3VsZCBiZSBhIHVzZSBjYXNlIG1vZGVsIHN1cnZleSwgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IGV4dHJhY3RpbmcgZGlhZ3JhbSBpbmZvcm1hdGlvbiBmcm9tIGEgZ3JhcGhpY2FsIG1vZGVsIGFuZCB0ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gZG9jdW1lbnRzIGFuZCBjb21iaW5lcyB0aGVzZSB0d28gdHlwZXMgb2YgaW5mb3JtYXRpb24gaW50byBhIHJlcG9ydC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGNoYWxsIGZvciBvdGhlciB0eXBlcyBvZiBndWlkYW5jZSBub3Qgc3BlY2lmaWNhbGx5IGRlZmluZWQgZWxzZXdoZXJlLiBJdCBjYW4gYmUgcmVsYXRlZCB0byBhbGwga2luZHMgb2YgQ29udGVudCBFbGVtZW50cywgaS5lLiBpbmNsdWRpbmcgb3RoZXIgZ3VpZGFuY2UgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRvb2xNZW50b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV2hpdGVwYXBlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQ29uY2VwdCBndWlkYW5jZSB0aGF0IGhhdmUgYmVlbiBleHRlcm5hbGx5IHJldmlld2VkIG9yIHB1Ymxpc2hlZCBhbmQgY2FuIGJlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgaW4gaXNvbGF0aW9uIG9mIG90aGVyIGNvbnRlbnQgZWxlbWVudHMgYW5kIGd1aWRhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29uY2VwdCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlcm1EZWZpbml0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgIk1hbmFnZSBSaXNrcyIsICJDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkiLCAiQXJjaGl0ZWN0dXJlLWNlbnRyaWMgYW5kIGNvbXBvbmVudC1iYXNlZCBkZXZlbG9wbWVudCIsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFjdGl2aXR5UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50UmVmZXJlbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJQcmFjdGljZSIgdHlwZT0idW1hOlByYWN0aWNlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJldXNhYmxlQXNzZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgYSBzb2x1dGlvbiB0byBhIHByb2JsZW0gZm9yIGEgZ2l2ZW4gY29udGV4dC4gVGhlIGFzc2V0IG1heSBoYXZlIGEgdmFyaWFiaWxpdHkgcG9pbnQsIHdoaWNoIGlzIGEgbG9jYXRpb24gaW4gdGhlIGFzc2V0IHRoYXQgbWF5IGhhdmUgYSB2YWx1ZSBwcm92aWRlZCBvciBjdXN0b21pemVkIGJ5IHRoZSBhc3NldCBjb25zdW1lci4gVGhlIGFzc2V0IGhhcyBydWxlcyBmb3IgdXNhZ2Ugd2hpY2ggYXJlIHRoZSBpbnN0cnVjdGlvbnMgZGVzY3JpYmluZwotaG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi1BIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcG9ydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGVtcGxhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciB0YW5naWJsZSB3b3JrIHByb2R1Y3QgdHlwZXMuIEFydGlmYWN0cyBtYXkgYmUgY29tcG9zZWQgb2Ygb3RoZXIgYXJ0aWZhY3RzLiBGb3IgZXhhbXBsZSwgYSBtb2RlbCBhcnRpZmFjdCBjYW4gYmUgY29tcG9zZWQgb2YgbW9kZWwgZWxlbWVudHMsIHdoaWNoIGFyZSBhbHNvIGFydGlmYWN0cy4KLUFydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAib3duIiBhIHNwZWNpZmljIHR5cGUgb2YgQXJ0aWZhY3RzLCBvdGhlciByb2xlcyBjYW4gc3RpbGwgdXNlIHRoZSBBcnRpZmFjdHM7IHBlcmhhcHMgZXZlbiB1cGRhdGUgdGhlbSBpZiB0aGUgUm9sZSBoYXMgYmVlbiBnaXZlbiBwZXJtaXNzaW9uIHRvIGRvIHNvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29udGFpbmVkQXJ0aWZhY3QiIHR5cGU9InVtYTpBcnRpZmFjdCIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyYWJsZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHBhY2thZ2luZyBvdGhlciBXb3JrIFByb2R1Y3RzLCBhbmQgbWF5IGJlIGRlbGl2ZXJlZCB0byBhbiBpbnRlcm5hbCBvciBleHRlcm5hbCBwYXJ0eS4gIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuIFRoZXJlZm9yZSwgYSBEZWxpdmVyYWJsZSBhZ2dyZWdhdGVzIG90aGVyIFdvcmsgUHJvZHVjdHMuICBBIERlbGl2ZXJhYmxlIGlzIHVzZWQgdG8gcHJlLWRlZmluZSB0eXBpY2FsIG9yIHJlY29tbWVuZGVkIGNvbnRlbnQgaW4gdGhlIGZvcm0gb3Igd29yayBwcm9kdWN0cyB0aGF0IHdvdWxkIGJlIHBhY2thZ2VkIGZvciBkZWxpdmVyeS4gIFRoZSBhY3R1YWwgcGFja2FnaW5nIG9mIHRoZSBEZWxpdmVyYWJsZSBpbiBhbiBhY3R1YWwgcHJvY2VzcyBvciBldmVuIHByb2plY3QgY291bGQgYmUgYSBtb2RpZmljYXRpb24gb2YgdGhpcyByZWNvbW1lbmRhdGlvbi4gIERlbGl2ZXJhYmxlcyBhcmUgdXNlZCB0byByZXByZXNlbnQgYW4gb3V0cHV0IGZyb20gYSBwcm9jZXNzIHRoYXQgaGFzIHZhbHVlLCBtYXRlcmlhbCBvciBvdGhlcndpc2UsIHRvIGEgY2xpZW50LCBjdXN0b21lciBvciBvdGhlciBzdGFrZWhvbGRlci4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyZWRXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJPdXRjb21lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLUEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIHdvcmsgYmVpbmcgcGVyZm9ybWVkIGJ5IFJvbGVzLiAgSXQgZGVmaW5lcyBvbmUgZGVmYXVsdCBwZXJmb3JtaW5nIFJvbGUgYXMgd2VsbCBhcyBtYW55IGFkZGl0aW9uYWwgcGVyZm9ybWVycy4gIEEgVGFzayBpcyBhc3NvY2lhdGVkIHRvIGlucHV0IGFuZCBvdXRwdXQgd29yayBwcm9kdWN0cy4gIElucHV0cyBhcmUgZGlmZmVyZW50aWF0ZWQgaW4gbWFuZGF0b3J5IHZlcnN1cyBvcHRpb25hbCBpbnB1dHMuICBUaGUgYXNzb2NpYXRpb25zIHRvIFdvcmsgUHJvZHVjdHMgYXJlIG5vdCBpbnN0YW50aWF0YWJsZS92YXJpYWJsZS1saWtlIHBhcmFtZXRlcnMuICBUaGV5IHJhdGhlciBleHByZXNzIChoeXBlci0pbGlua3MgdG8gdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgd29yayBwcm9kdWN0cyB0eXBlcyB0aGF0IGFyZSByZWxhdGVkIHRvIHRoZSBUYXNrIGFzIGlucHV0cyBhbmQgb3V0cHV0cy4gIEluIG90aGVyIHdvcmRzLCB0aGVzZSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGNhcHR1cmUgd2hpY2ggY29uY3JldGUgaW5zdGFuY2VzIHdpbGwgYmUgcGFzc2VkIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgbWV0aG9kIGluIGEgcHJvamVjdC4gIEFsbCBvZiB0aGUgVGFzaydzIGRlZmF1bHQgYXNzb2NpYXRpb25zIGNhbiBiZSBvdmVycmlkZGVuIGluIGFuIGFjdHVhbCBwcm9jZXNzIGRlZmluaXRpb24uCi1BIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAKLUEgVGFzayBoYXMgYSBjbGVhciBwdXJwb3NlIGluIHdoaWNoIHRoZSBwZXJmb3JtaW5nIHJvbGVzIGFjaGlldmUgYSB3ZWxsIGRlZmluZWQgZ29hbC4gIEl0IHByb3ZpZGVzIGNvbXBsZXRlIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMgb2YgZG9pbmcgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBhY2hpZXZlIHRoaXMgZ29hbC4gIFRoaXMgZGVzY3JpcHRpb24gaXMgY29tcGxldGUsIGluZGVwZW5kZW50IG9mIHdoZW4gaW4gYSBwcm9jZXNzIGxpZmVjeWNsZSB0aGUgd29yayB3b3VsZCBhY3R1YWxseSBiZSBkb25lLiAgSXQgdGhlcmVmb3JlIGRvZXMgbm90IGRlc2NyaWJlIHdoZW4geW91IGRvIHdoYXQgd29yayBhdCB3aGF0IHBvaW50IG9mIHRpbWUsIGJ1dCBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgZ2V0cyBkb25lIHRocm91Z2hvdXQgdGhlIGRldmVsb3BtZW50IGxpZmVjeWNsZSB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBhY2hpZXZlbWVudCBvZiB0aGlzIGdvYWwuICBXaGVuIHRoZSBUYXNrIGlzIGJlaW5nIGFwcGxpZWQgaW4gYSBwcm9jZXNzIHRoZW4gdGhpcyBwcm9jZXNzIGFwcGxpY2F0aW9uIChkZWZpbmVkIGFzIFRhc2sgRGVzY3JpcHRvcikgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIG9mIHdoaWNoIHBpZWNlcyBvZiB0aGUgVGFzayB3aWxsIGFjdHVhbGx5IGJlIHBlcmZvcm1lZCBhdCBhbnkgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgVGFzayB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgcHJvY2VzcyBvdmVyIGFuZCBvdmVyIGFnYWluLCBidXQgZWFjaCB0aW1lIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgZW1waGFzaXMgb24gZGlmZmVyZW50IHN0ZXBzIG9yIGFzcGVjdHMgb2YgdGhlIHRhc2sgZGVzY3JpcHRpb24uIAotRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXZlbG9wIFVzZSBDYXNlIE1vZGVsIiBkZXNjcmliZXMgYWxsIHRoZSB3b3JrIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSB0byBkZXZlbG9wIGEgY29tcGxldGUgdXNlIGNhc2UgbW9kZWwuIFRoaXMgd291bGQgY29tcHJpc2Ugb2YgdGhlIGlkZW50aWZpY2F0aW9uIGFuZCBuYW1pbmcgb2YgdXNlIGNhc2VzIGFuZCBhY3RvcnMsIHRoZSB3cml0aW5nIG9mIGEgYnJpZWYgZGVzY3JpcHRpb24sIHRoZSBtb2RlbGluZyBvZiB1c2UgY2FzZXMgYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMgaW4gZGlhZ3JhbXMsIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhIGJhc2ljIGZsb3csIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBhbHRlcm5hdGl2ZXMgZmxvd3MsIHBlcmZvcm1pbmcgb2Ygd2Fsa3Rocm91Z2hzIHdvcmtzaG9wcyBhbmQgcmV2aWV3cywgZXRjLiAgQWxsIG9mIHRoZXNlIHBhcnRzIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IGdvYWwgb2YgZGV2ZWxvcGluZyB0aGUgdXNlIGNhc2UgbW9kZWwsIGJ1dCB0aGUgcGFydHMgd2lsbCBiZSBwZXJmb3JtZWQgYXQgZGlmZmVyZW50IHBvaW50cyBpbiB0aW1lIGluIGEgcHJvY2Vzcy4gIElkZW50aWZpY2F0aW9uLCBuYW1pbmcsIGFuZCBicmllZiBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGVyZm9ybWVkIGVhcmx5IGluIGEgdHlwaWNhbCBkZXZlbG9wbWVudCBwcm9jZXNzIHZlcnN1cyB0aGUgd3JpdGluZyBvZiBkZXRhaWxlZCBhbHRlcm5hdGl2ZSBmbG93cyB3aGljaCB3b3VsZCBiZSBwZXJmb3JtZWQgbXVjaCBsYXRlci4gIEFsbCB0aGVzZSBwYXJ0cyBvciBzdGVwcyB3aXRoaW4gdGhlIHNhbWUgVGFzayBkZWZpbmUgdGhlICJtZXRob2QiIG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsaW5rVHlwZSIgdHlwZT0idW1hOldvcmtPcmRlclR5cGUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGUgZXhwcmVzc2VzIHRoZSB0eXBlIG9mIHRoZSBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcCBieSBhc3NpZ25pbmcgYSB2YWx1ZSBmcm9tIHRoZSBXb3JrIE9yZGVyIFR5cGUgZW51bWVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBwcm92aWRlcyBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZXByZXNlbnQgb3IgcmVmZXIgdG8gV29yayBEZWZpbml0aW9ucy4gIEZvciBleGFtcGxlIGl0cyBzdWJjbGFzcyBBY3Rpdml0eSBkZWZpbmVzIHdvcmsgYXMgaXQgaXMgYWxzbyBhIHN1YmNsYXNzIG9mIFdvcmsgRGVmaW5pdGlvbi4gIEl0cyBzdWJjbGFzcyBUYXNrIERlc2NyaXB0b3IgZG9lcyBub3QgZGVmaW5lIHdvcmsgYnkgaXRzZWxmLCBidXQgcmVmZXJzIHRvIGEgV29yayBEZWZpbml0aW9uIGFuZCB0aGVyZWZvcmUgY2FuIGhhdmUgdGhlIHNhbWUgY29tbW9uIHByb3BlcnRpZXMgYW5kIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgaGFzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVkZWNlc3NvciIgdHlwZT0idW1hOldvcmtPcmRlciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1JlcGVhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gZGVmaW5lIHJlcGV0aXRpb24gb2Ygd29yaywgZS5nLiBpdGVyYXRpb25zLiAgQSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiB3aXRoIHRoaXMgYXR0cmlidXRlIHNldCB0byBUcnVlIHNoYWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIHNldCBvZiBhcnRpZmFjdHMuICBGb3IgZXhhbXBsZSwgZm9yIGFuIGluc3RhbmNlIG9mIEl0ZXJhdGlvbiAoZGVmaW5lZCBhcyBhIHNwZWNpYWwgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gYmVsb3cpIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGJ5IGRlZmF1bHQgaW5kaWNhdGluZyB0aGF0IGV2ZXJ5IHN1Yi1BY3Rpdml0eSB3aWxsIGJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSG93ZXZlciwgYW55IFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNhbiBzZXQgdGhpcyBhdHRyaWJ1dGUgdG8gVHJ1ZSB0byBkZWZpbmUgaXRlcmF0aW9ucyAoZS5nLiB0byBpdGVyYXRlIG9uZSBBY3Rpdml0eSBjb25zaXN0aW5nIG9mIG1hbnkgc3ViLWFjdGl2aXRpZXMgb3IgZXZlbiBQaGFzZXMsIGJ1dCB0byBpdGVyYXRlIGp1c3Qgb25lIFRhc2spLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT25nb2luZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhlIGlzT25nb2luZyBhdHRyaWJ1dGUgaXMgc2V0IHRvIFRydWUgZm9yIGEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gaW5zdGFuY2UsIHRoZW4gdGhlIGVsZW1lbnQgZGVzY3JpYmVzIGFuIG9uZ29pbmcgcGllY2Ugb2Ygd29yayB3aXRob3V0IGEgZml4ZWQgZHVyYXRpb24gb3IgZW5kIHN0YXRlLiAgRm9yIGV4YW1wbGUsIHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayBvZiBhbiBhZG1pbmlzdHJhdG9yIGNvbnRpbnVvdXNseSAoZS5nLiAzaCBhIGRheSkgd29ya2luZyB0byBlbnN1cmUgdGhhdCBzeXN0ZW1zIGFyZSBrZXB0IGluIGEgY2VydGFpbiBzdGF0ZS4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBwcm9ncmFtIG1hbmFnZW1lbnQgd29yayBvdmVyc2VlaW5nIG1hbnkgZGlmZmVyZW50IHByb2plY3RzIGJlaW5nIHNjaGVkdWxlZCBmb3Igb25lIHBhcnRpY3VsYXIgcHJvamVjdCBhdCBzcGVjaWZpYyByZW9jY3VycmluZyBpbnRlcnZhbHMgZHVyaW5nIHRoZSB3aG9sZSBsaWZlY3ljbGUgb2YgdGhlIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNFdmVudERyaXZlbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGlzRXZlbnREcml2ZW4gYXR0cmlidXRlIGluZGljYXRlcyB0aGF0IHRoZSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBkZXNjcmliZXMgYW4gaW5zdGFuY2Ugb2Ygd29yayB3aGljaCBpcyBub3Qgc3RhcnRlZCBiZWNhdXNlIGl0IGhhcyBiZWVuIHNjaGVkdWxlZCB0byBzdGFydCBhdCBhIGNlcnRhaW4gcG9pbnQgb2YgdGltZSwgYmVjYXVzZSBwcmVjZWRpbmcgd29yayBpcyBiZWluZyBjb21wbGV0ZWQsIG9yIGlucHV0IHdvcmsgcHJvZHVjdHMgYXJlIGF2YWlsYWJsZSwgYnV0IGJlY2F1c2UgYW5vdGhlciBzcGVjaWZpYyBldmVudCBoYXMgb2NjdXJyZWQuICBFeGFtcGxlcyBmb3Igc3VjaCBldmVudHMgYXJlIGV4Y2VwdGlvbnMgb3IgcHJvYmxlbSBzaXR1YXRpb25zIHdoaWNoIHJlcXVpcmUgc3BlY2lmaWMgd29yayB0byBiZSBwZXJmb3JtZWQgYXMgYSByZXN1bHQuICBBbHNvIGNoYW5nZSBtYW5hZ2VtZW50IHdvcmsgY2FuIGJlIG1vZGVsZWQgYXMgZXZlbnQgZHJpdmVuIHdvcmsgYW5hbHl6aW5nIGEgY2hhbmdlIHJlcXVlc3Qgb3IgZGVmZWN0IGFuZCBhbGxvY2F0aW5nIHdvcmsgZHluYW1pY2FsbHkgdG8gcmVzb3VyY2VzIHRvIGRlYWwgd2l0aCBpdCBmb2xsb3dpbmcgdGhlIHdvcmsgZGVzY3JpYmVkIHdpdGggc3VjaCBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbi4gIFRoZSBldmVudHMgdGhlbXNlbHZlcyBhcmUgbm90IG1vZGVsZWQgaW4gdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAgVGhleSBzaGFsbCBiZSBkZXNjcmliZWQgYXMgcGFydCBvZiB0aGUgbm9ybWFsIGRlc2NyaXB0aW9ucyBmaWVsZHMgYXZhaWxhYmxlLgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWlsZXN0b25lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHNpZ25pZmljYW50IGV2ZW50IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCwgc3VjaCBhcyBhIG1ham9yIGRlY2lzaW9uLCBjb21wbGV0aW9uIG9mIGEgZGVsaXZlcmFibGUsIG9yIG1lZXRpbmcgb2YgYSBtYWpvciBkZXBlbmRlbmN5IChsaWtlIGNvbXBsZXRpb24gb2YgYSBwcm9qZWN0IHBoYXNlKS4gIEJlY2F1c2UsIE1pbGVzdG9uZSBpcyBjb21tb25seSB1c2VkIHRvIHJlZmVyIHRvIGJvdGggdGhlIGV2ZW50IGl0c2VsZiBhbmQgdGhlIHBvaW50IGluIHRpbWUgYXQgd2hpY2ggdGhlIGV2ZW50IGlzIHNjaGVkdWxlZCB0byBoYXBwZW4sIGl0IGlzIG1vZGVsZWQgYXMgYSBCcmVha2Rvd24gRWxlbWVudCAoaS5lLiBpdCBhcHBlYXJzIGFzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvYWRtYXAiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzYWJsZUFzc2V0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV2hpdGVwYXBlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiB0eXBlPSJ1bWE6VmFyaWFiaWxpdHlUeXBlIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9IklzRW5hY3RhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBoYXNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLVBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJJdGVyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdJdGVyYXRpb24nKSBhbmQgaXNSZXBlYXRhYmxlICgnVHJ1ZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotSXRlcmF0aW9uIGdyb3VwcyBhIHNldCBvZiBuZXN0ZWQgQWN0aXZpdGllcyB0aGF0IGFyZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEl0IHJlcHJlc2VudHMgYW4gaW1wb3J0YW50IHN0cnVjdHVyaW5nIGVsZW1lbnQgdG8gb3JnYW5pemUgd29yayBpbiByZXBldGl0aXZlIGN5Y2xlcy4gIFRoZSBjb25jZXB0IG9mIEl0ZXJhdGlvbiBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGRpZmZlcmVudCBydWxlcyBpbiBkaWZmZXJlbnQgbWV0aG9kcy4gIEZvciBleGFtcGxlLCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBtZXRob2QgZnJhbWV3b3JrIChSVVApIGRlZmluZXMgYSBydWxlIHRoYXQgSXRlcmF0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gc3BhbiBhY3Jvc3MgUGhhc2VzLiAgSW4gY29udHJhc3QgSUJNIEdsb2JhbCBTZXJ2aWNlcyBNZXRob2QgKEdTTWV0aG9kKSBiYXNlZCBtZXRob2QgZnJhbWV3b3JrcyB0aGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgYW5kIEl0ZXJhdGlvbiBjYW4gYmUgZGVmaW5lZCB3aGljaCBuZXN0IFBoYXNlcy4gIFJ1bGVzIGxpa2UgdGhlc2UsIHdoaWNoIHBsYXkgYW4gaW1wb3J0YW50IHJvbGUgZm9yIGVhY2ggaW5kaXZpZHVhbCBtZXRob2QgYW5kIGFyZSB0aGVyZWZvcmUgbm90IGVuZm9yY2VkIGJ5IHRoaXMgbWV0YS1tb2RlbC4gIEluc3RlYWQsIHByb2Nlc3MgYXV0aG9ycyBhcmUgZXhwZWN0ZWQgdG8gZm9sbG93IGFuZCBjaGVjayB0aGVzZSBydWxlcyBtYW51YWxseS4gIChOb3RlOiBBbnkgQnJlYWtkb3duIEVsZW1lbnQgY2FuIGJlIHJlcGVhdGVkOyBob3dldmVyLCBJdGVyYXRpb25zIGhhcyBiZWVuIGludHJvZHVjZWQgYXMgYSBzcGVjaWFsIG1ldGEtbW9kZWwgY29uY2VwdCwgYmVjYXVzZSBvZiBpdHMgaW1wb3J0YW50IHJvbGUgZm9yIG1hbnkgbWV0aG9kcy4pPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEJyZWFrZG93biBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2FnZUd1aWRhbmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGluZm9ybWF0aW9uIGFuZCBndWlkYW5jZSBvbiB0aGUgbWVhbmluZyBvZiB0aGUgQm9vbGVhbiBmbGFnIHZhbHVlcyBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoZXkgc2hvdWxkIGJlIG92ZXJyaWRkZW4uIEZvciBleGFtcGxlLCBpdCBkZXNjcmliZXMgd2h5IHRoZSBicmVha2Rvd24gZWxlbWVudCBpcyBvcHRpb25hbCBvciBjb25zaWRlcmF0aW9ucyBmb3IgcmVwZWF0aW5nIGl0IGFuZCBkaWZmZXJlbmNlcyBpbiB0aGUgaW5kaXZpZHVhbCBvY2N1cnJlbmNlcyBvZiB0aGlzIEJyZWFrZG93biBFbGVtZW50IGFjcm9zcyB0aGUgbGlmZWN5Y2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBkb2luZyB0aGUgd29yayBvZiB0aGlzIEFjdGl2aXR5IG5vdCBjb3ZlcmVkIGJ5IHRoZSBBY3Rpdml0eSdzIFRhc2tzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSG93VG9TdGFmZiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZpbmVkRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTY29wZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJVc2FnZU5vdGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBub3RlcyBvbiBob3cgdG8gYXBwbHkgYW5kIGluc3RhbnRpYXRlIHRoaXMgcHJvY2VzcyBmb3IgYSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSaXNrTGV2ZWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW5nVGVjaG5pcXVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvamVjdE1lbWJlckV4cGVydGlzZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUeXBlT2ZDb250cmFjdCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdGVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbXBhY3RzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWFuZGF0b3J5SW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXRUbyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dEZyb20iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRQcmltYXJpbHlCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlZmF1bHRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpYWdyYW1VUkkiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIFVSSSBvZiB0aGUgZGlhZ3JhbSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgZGVzY3JpYmluZyBhIGNvbXBsZXRlIGFuZCBpbnRlZ3JhdGVkIGFwcHJvYWNoIGZvciBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgcHJvamVjdCB0eXBlLiAgSXQgZGVzY3JpYmVzIGEgY29tcGxldGUgcHJvamVjdCBsaWZlY3ljbGUgZW5kLXRvLWVuZCBhbmQgc2hhbGwgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBmb3IgcnVubmluZyBwcm9qZWN0cyB3aXRoIHNpbWlsYXIgY2hhcmFjdGVyaXN0aWNzIGFzIGRlZmluZWQgZm9yIHRoZSBwcm9jZXNzLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIHJlbGF0ZWQgdG8gc3BlY2lmaWMgc3VwcG9ydGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzIFJvYWRtYXBzIChpbmhlcml0ZWQgdmlhIEFjdGl2aXR5KSBhcyB3ZWxsIGFzIENvbW11bmljYXRpb25zIGFuZCBFZHVjYXRpb24gTWF0ZXJpYWwuCi1BIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRWR1Y2F0aW9uTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gY29tbW9uIHByb2Nlc3MgYXJlYXMuICBDYXBhYmlsaXRpZXMgUGF0dGVybnMgZXhwcmVzcyBhbmQgY29tbXVuaWNhdGUgcHJvY2VzcyBrbm93bGVkZ2UgZm9yIGEga2V5IGFyZWEgb2YgaW50ZXJlc3Qgc3VjaCBhcyBhIERpc2NpcGxpbmUgYW5kIGNhbiBiZSBkaXJlY3RseSB1c2VkIGJ5IHByb2Nlc3MgcHJhY3RpdGlvbmVyIHRvIGd1aWRlIGhpcyB3b3JrLiAgVGhleSBhcmUgYWxzbyB1c2VkIGFzIGJ1aWxkaW5nIGJsb2NrcyB0byBhc3NlbWJsZSBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMgZW5zdXJpbmcgb3B0aW1hbCByZXVzZSBhbmQgYXBwbGljYXRpb24gb2YgdGhlIGtleSBwcmFjdGljZXMgdGhleSBleHByZXNzLgotQSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6Ci0tIFRvIHNlcnZlIGFzIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYXNzZW1ibGluZyBEZWxpdmVyeSBQcm9jZXNzZXMgb3IgbGFyZ2VyIENhcGFiaWxpdHkgUGF0dGVybnMuICBOb3JtYWxseSBkZXZlbG9waW5nIGEgRGVsaXZlcnkgUHJvY2VzcyBpcyBub3QgZG9uZSBmcm9tIHNjcmF0Y2ggYnV0IGJ5IHN5c3RlbWF0aWNhbGx5IGFwcGx5aW5nIGFuZCBiaW5kaW5nIHBhdHRlcm5zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIHBhdHRlcm4gYXBwbGljYXRpb24gb2YgJ2NvcHktYW5kLW1vZGlmeScsIHdoaWNoIGFsbG93cyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBpbmRpdmlkdWFsbHkgY3VzdG9taXplIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgcGFydGljdWxhciBzaXR1YXRpb24gaXQgaXMgYXBwbGllZCBmb3IsIHRoZSBQbHVnaW4gbWV0YS1tb2RlbCBwYWNrYWdlIChTZWN0aW9uIDYuMSkgaW50cm9kdWNlcyBldmVuIG1vcmUgc29waGlzdGljYXRlZCBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIHRoYXQgc3VwcG9ydCBkeW5hbWljIGJpbmRpbmcgb2YgcGF0dGVybnMgKGkuZS4gdGhlIHBhdHRlcm4gaXMgcmVmZXJlbmNlZCBhbmQgbm90IGNvcGllZCkuICBUaGlzIHVuaXF1ZSBuZXcgd2F5IG9mIHJldXNpbmcgcHJvY2VzcyBrbm93bGVkZ2UgYWxsb3dzIHRvIGZhY3RvciBvdXQgY29tbW9ubHkgcmVvY2N1cnJpbmcgQWN0aXZpdGllcyBpbnRvIHBhdHRlcm5zIGFuZCB0byBhcHBseSB0aGVtIG92ZXIgYW5kIG92ZXIgYWdhaW4gZm9yIGEgcHJvY2Vzcy4gIFdoZW4gdGhlIHBhdHRlcm4gaXMgYmVpbmcgcmV2aXNlZCBvciB1cGRhdGVkLCBhbGwgY2hhbmdlcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkIGluIGFsbCBwYXR0ZXJuIGFwcGxpY2F0aW9uIGluIGFsbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiB0aGUgZHluYW1pYyBiaW5kaW5nLgotLSBUbyBzdXBwb3J0IGRpcmVjdCBleGVjdXRpb24gaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0IHRoYXQgZG9lcyBub3Qgd29yayBmb2xsb3dpbmcgYSB3ZWxsLWRlZmluZWQgcHJvY2VzcywgYnV0IHdvcmtzIGJhc2VkIG9uIGxvb3NlbHkgY29ubmVjdGVkIHByb2Nlc3MgZnJhZ21lbnRzIG9mIGJlc3QgcHJhY3RpY2VzIGluIGEgZmxleGlibGUgbWFubmVyIChlLmcuIEFnaWxlIERldmVsb3BtZW50KS4KLS0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgaXMgcHJlcGFyZWQgZm9yIGluc3RhbnRpYXRpb24gYnkgYSBwcm9qZWN0IHBsYW5uaW5nIHRvb2wuICBUeXBpY2FsbHksIGl0IGlzIGNyZWF0ZWQgYmFzZWQgb24gYSBQcm9jZXNzIHN1Y2ggYXMgYSBEZWxpdmVyeSBQcm9jZXNzIGFzIGEgd2hvbGUgKGUuZy4gaW4gY2FzZSBvZiBhIHdhdGVyZmFsbC1iYXNlZCBkZXZlbG9wbWVudCBhcHByb2FjaCkgb3IgaW4gcGFydHMgKGUuZy4gaW4gY2FzZSBvZiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgYXBwcm9hY2gpLgotQSBQcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlIHJlcHJlc2VudHMgYSBwYXJ0aWFsbHkgZmluaXNoZWQgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgSXQgdXNlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmVzIGFzIGFsbCBvdGhlciBQcm9jZXNzIFR5cGVzIHRvIHJlcHJlc2VudCB0ZW1wbGF0ZXMgZm9yIHByb2plY3QgcGxhbnMuICBIb3dldmVyLCBjZXJ0YWluIHBsYW5uaW5nIGRlY2lzaW9ucyBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSB0ZW1wbGF0ZSBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kL29yIHJlZm9ybWF0dGVkIHRvIGJlIHJlYWR5IGZvciBleHBvcnQgdG8gYSBzcGVjaWZpYyBwbGFubmluZyB0b29sLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZGVjaXNpb25zIGFyZTogYSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIHRvIHJlcHJlc2VudCBhIHBsYW4gZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gaW4gYW4gaXRlcmF0aXZlIGRldmVsb3BtZW50IHByb2plY3QsIHdoaWNoIGZyIGV4YW1wbGUgZGlzdGluZ3Vpc2hlcyBlYXJseSBmcm9tIGxhdGUgaXRlcmF0aW9ucyBpbiB0aGUgRWxhYm9yYXRpb24gcGhhc2Ugb2YgYSBwcm9qZWN0OyBpZiB0aGUgdGFyZ2V0ZWQgcGxhbm5pbmcgdG9vbCBjYW5ub3QgcmVwcmVzZW50IGlucHV0IGFuZCBvdXRwdXQgb2YgVGFzaywgdGhlbiB0aGVzZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJ1Y3R1cmU7IGNlcnRhaW4gcmVwZXRpdGlvbnMgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCwgZS5nLiBzdGF0aW5nIHRoYXQgYSBjeWNsZSBvZiBzcGVjaWZpYyBUYXNrIGdyb3VwZWQgaW4gYW4gQWN0aXZpdHkgaGF2ZSB0byBiZSByZXBlYXRlZCBuLXRpbWVzOyBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhc2VQcm9jZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IGNvbnRhaW5zIFByb2Nlc3MgRWxlbWVudHMsIG9ubHkuCi1BIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzRWxlbWVudCIgdHlwZT0idW1hOlByb2Nlc3NFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIgdHlwZT0idW1hOlRhc2tEZXNjcmlwdG9yIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VJTyIgdHlwZT0idW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzQ29tcG9uZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLVVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzUGFja2FnZSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvcHlyaWdodCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2UiIHR5cGU9InVtYTpQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3MiIHR5cGU9InVtYTpQcm9jZXNzIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXV0aG9ycyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGF0ZSIgdHlwZT0ieHNkOmRhdGVUaW1lIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZSIgdHlwZT0idW1hOk1ldGhvZFBhY2thZ2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1c2VyQ2hhbmdlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLgotTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi1TcGVjaWFsIGV4dGVuc2liaWxpdHkgbWVjaGFuaXNtcyBkZWZpbmVkIGZvciB0aGUgbWV0YS1jbGFzc2VzIFZhcmlhYmlsaXR5IEVsZW1lbnQgYW5kIFByb2Nlc3MgQ29udHJpYnV0aW9uIGFsbG93IFBsdWdpbiBjb250ZW50IHRvIGRpcmVjdGx5IGNvbnRyaWJ1dGUgbmV3IGNvbnRlbnQsIHJlcGxhY2UgZXhpc3RpbmcgY29udGVudCwgb3IgdG8gY3Jvc3MtcmVmZXJlbmNlIHRvIGFueSBDb250ZW50IEVsZW1lbnQgb3IgUHJvY2VzcyB3aXRoaW4gYW5vdGhlciBQbHVnaW4gdGhhdCBpdCBleHRlbmRzLiAgU2ltaWxhciB0byBVTUwgMi4wJ3MgJ3BhY2thZ2UgbWVyZ2UnIG1lY2hhbmlzbSB0cmFuc2Zvcm1hdGlvbiBpbnRlcnByZXRhdGlvbnMsIGludGVycHJldGluZyB0aGVzZSBNZXRob2QgUGx1Z2luIG1lY2hhbmlzbXMgcmVzdWx0cyBpbnRvIG5ldyBleHRlbmRlZCBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RVbml0Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZUNvbmZpZ3VyYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdFZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2Vzc1ZpZXciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YnRyYWN0ZWRDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkZWRDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idG9vbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdG9vbCB0aGF0IGdlbmVyYXRlZCB0aGUgWE1MIGZpbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RMaWJyYXJ5IiB0eXBlPSJ1bWE6TWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL0VQRl9TY2hlbWFfMjAwODAxMjcwOTQyLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTllNjQwYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvRVBGX1NjaGVtYV8yMDA4MDEyNzA5NDIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBFUEYgVU1BIFhNTCBEYXRhIEludGVyY2hhbmdlIFNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41IiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNSI+Ci0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9IldvcmtPcmRlclR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluaXNoVG9GaW5pc2giLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9TdGFydCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RhcnRUb0ZpbmlzaCIvPgotCQk8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJWYXJpYWJpbGl0eVR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gRW51bWVyYXRpb24gdXNlZCBmb3IgdmFsdWVzIGZvciBpbnN0YW5jZXMgb2YgVmFyaWFiaWxpdHkgRWxlbWVudCdzIGF0dHJpYnV0ZSB2YXJpYWJpbGl0eVR5cGUuICBJdCBkZWZpbmVzIHRoZSBuYXR1cmUgb2YgaG93IGEgVmFyaWFiaWxpdHkgRWxlbWVudCBleHRlbmRzIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudC4gU2VlIGVudW1lcmF0aW9uIGxpdGVyYWxzIGZvciBkZWZpbml0aW9ucyBmb3IgZWFjaCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOk5DTmFtZSI+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuYSIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29udHJpYnV0ZXMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImV4dGVuZHMiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJlcGxhY2VzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJsb2NhbENvbnRyaWJ1dGlvbiIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxSZXBsYWNlbWVudCIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZXh0ZW5kc1JlcGxhY2VzIi8+Ci0JCTwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik5hbWVkRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBOYW1lZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFVNTCAyLjAgbWV0YS1jbGFzcyBQYWNrYWdhYmxlIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpOYW1lZEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyI+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1ByaW1hcnlFeHRlbnNpb24iIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcm9vdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBEZWZpbmVzIGEgY29tbW9uIHNldCBvZiBhdHRyaWJ1dGVzIGluaGVyaXRlZCBieSBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIE1ldGhvZCBFbGVtZW50IGl0c2VsZiBpcyBkZXJpdmVkIGZyb20gUGFja2FnZWFibGUgRWxlbWVudCBmcm9tIHRoZSBVTUwgMi4wIEluZnJhc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UGFja2FnZWFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik93bmVkUnVsZSIgdHlwZT0idW1hOkNvbnN0cmFpbnQiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwYWNrYWdpbmcgcnVsZXMgZm9yIHRoaXMgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiIHR5cGU9InVtYTpNZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJicmllZkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3VwcHJlc3NlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGlzIGRlcml2ZWQgZnJvbSBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQgdXNpbmcgdGhlICJleHRlbmRzIiBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcmRlcmluZ0d1aWRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnN0cmFpbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RFbGVtZW50UHJvcGVydHkiPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJTZWN0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VjdGlvbk5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgU2VjdGlvbiBoYXMgYSBuYW1lIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgc2VjdGlvbiwgZS5nLiB3aGVuIHB1Ymxpc2hlZCBvciB3aGVuIHNlY3Rpb24gaGVhZGluZyBhcmUgbGlzdGVkIGluIGEgdGFibGUgb2YgY29udGVudHMuICBUaGlzIGF0dHJpYnV0ZSBpcyBzaW1pbGFyIHRvIFByZXNlbnRhdGlvbiBOYW1lIGZvciBDb250ZW50IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RVbml0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHNoYWxsIGJlIG1haW50YWluZWQgaW4gYSBNZXRob2QgTGlicmFyeSBhcyBhIHNlcGFyYXRlIHVuaXQgb2YgY29udHJvbC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImF1dGhvcnMiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImNoYW5nZURlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYWR2aXNlIGFuZCBndWlkYW5jZSBvZiBhIGNyaXRpY2FsIG5hdHVyZSBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCBhcyB3ZWxsIGFzIHdhcm5pbmdzLCBjYXV0aW9ucywgcGl0ZmFsbHMsIGRhbmdlcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTZWN0aW9uIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4dGVybmFsSWQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gZXh0ZXJuYWwgdmlzaWJsZSBudW1iZXIgdGhhdCBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIGFydGlmYWN0LiBVc2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRhbmNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBHdWlkYW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkF0dGFjaG1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHN1bW1hcnkgb2YgdGhlIG92ZXJhbGwgZ29hbHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSBQcmFjdGljZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNvbnNlcXVlbmNlcyBvZiBub3QgcHJvZHVjaW5nIHRoZSB3b3JrIHByb2R1Y3QuICBUaGlzIGlzIGludGVuZGVkIHRvIGFpZCBpbiB0aGUgdGFpbG9yaW5nIHRoZSBtZXRob2QvcHJvY2VzcyB0byB0aGUgbmVlZHMgb2YgYSBzcGVjaWZpYyBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgV29yayBQcm9kdWN0IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQXJ0aWZhY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGlzIGFydGlmYWN0LiBGb3IgZXhhbXBsZSwgZGlzY3Vzc2VzIHRoZSBjb250ZW50cyBmb3Iga2V5IGNoYXB0ZXJzIG9mIGEgZG9jdW1lbnQgYXJ0aWZhY3Qgb3IgdGhlIGtleSBwYWNrYWdlcyBhbmQgbW9kdWxlcyBvZiBhIG1vZGVsIGFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXByZXNlbnRhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJOb3RhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcmFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBEZWxpdmVyYWJsZSB1c2VkIGZvciBjbGllbnQgZG9jdW1lbnRzIChwcm9wb3NhbCwgc3RhdGVtZW50cyBvZiB3b3JrIG9yIGNvbnRyYWN0dWFsIGFncmVlbWVudHMpLiAgSXQgbWlnaHQgdXNlIGEgZGlmZmVyZW50IGxhbmd1YWdlIGFuZCBmb2xsb3cgbGVnYWwgY29uc3RyYWludHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gaG93IHRvIGFzc2VtYmxlIHRoZSBkZWxpdmVyYWJsZSBmcm9tIGFsbCBpdHMgcmVxdWlyZWQgaW5wdXRzLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBtZWRpdW0gYW5kIGZvcm1hdC4gIERpc3RyaWJ1dGlvbiBvZiB0aGUgZGVsaXZlcmFibGUgaXMgYWRkcmVzc2VkIGluIHRoaXMgc2VjdGlvbiwgaWYgbmVjZXNzYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgZ3VpZGFuY2Ugb24gZm9yIGFzc2lnbmluZyBpbmRpdmlkdWFscyB0byB0aGUgUm9sZSBpbiB0ZXJtcyBvZiB3aGF0IG90aGVyIHJvbGVzIHRoZXNlIGluZGl2aWR1YWxzIGNvdWxkIHBlcmZvcm0gYW5kIHdoYXQgcmVzcG9uc2liaWxpdHkgZGlmZmVyZW50IGluZGl2aWR1YWxzIGFzc2lnbmVkIHRvIHRoaXMgcm9sZSBtaWdodCBoYXZlLiAgVGhlIGd1aWRhbmNlIGNhbiBhbHNvIGRlc2NyaWJlIGRpZmZlcmVudCBhc3NpZ25tZW50IGFwcHJvYWNoZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0cywgZS5nLiBmb3IgbGFyZ2UgdmVyc3VzIHNtYWxsIHRlYW1zIHdoZXJlIGluZGl2aWR1YWxzIGNvdWxkIGJlIGFsbG9jYXRlZCB0byByb2xlcyBmdWxsIHRpbWUgdmVyc3VzIHNoYXJpbmcgcm9sZXMgd2l0aGluIHRoZSB0ZWFtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyBvZiBzZXQgb2YgcmVxdWlyZWQgc2tpbGxzIGEgcGVyc29uIG5lZWRzIHRvIHBvc3Nlc3MgdG8gZnVsZmlsbCB0aGF0IFJvbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgc3lub255bXMsIGkuZS4gb3RoZXIgbmFtZXMgdGhlIFJvbGUgbWlnaHQgYmUgcmVmZXJyZWQgYnkuICBUb29sIHN1cHBvcnQgZm9yIHRoZSBtZXRhLW1vZGVsIG1pZ2h0IHN1cHBvcnQgdGhhdCBhIFJvbGUgbmFtZSBjYW4gYmUgY29uc2lzdGVudGx5IGJlIHJlcGxhY2VkIHdpdGggb25lIG9mIGl0cyBzeW5vbnltcyB0aHJvdWdodCBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgYWNoaWV2aW5nIHRoaXMgVGFzaydzIGRldmVsb3BtZW50IGdvYWxzIHRoYXQgd2VyZSBub3QgY292ZXJlZCBieSB0aGUgVGFzaydzIFN0ZXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBNZXRob2QgRWxlbWVudHMgZm9yIHdoaWNoIGV4dGVybmFsIHByZXNlbnRhdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGNvbnRlbnQgZGVzY3JpcHRpb25zIGhhdmUgYmVlbiBkZWZpbmVkLCBzdWNoIGFzIFJvbGVzIG9yIFdvcmsgUHJvZHVjdHMuICBQcmVzZW50YXRpb24gTmFtZSBhbmQgQ29udGVudCBEZXNjcmlwdGlvbnMgYXJlIHR5cGljYWxseSBsb2NhbGl6ZWQgdXNpbmcgYSByZXNvdXJjZSBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgaXRzIFN0cmluZyB0eXBlIGF0dHJpYnV0ZXMuCi1UaGlzIGFic3RyYWN0aW9uIHJlcHJlc2VudHMgYWxsIGVsZW1lbnRzIGluIHRoZSBNZXRob2QgQ29udGVudCBhcyB3ZWxsIGFzIFByb2Nlc3Mgc3BhY2UgZm9yIHdoaWNoIGNvbmNyZXRlIHRleHR1YWwgZGVzY3JpcHRpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBmb3JtIG9mIGRvY3VtZW50aW5nIGF0dHJpYnV0ZXMgZ3JvdXBlZCBpbiBhIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gaW5zdGFuY2UuICBEZXNjcmliYWJsZSBFbGVtZW50cyBhcmUgaW50ZW5kZWQgdG8gYmUgcHVibGlzaGVkIGluIG1ldGhvZCBvciBwcm9jZXNzIHB1YmxpY2F0aW9ucyAoc2ltaWxhciB0byB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyB3ZWIpLiAgRGVzY3JpYmFibGUgRWxlbWVudCBkZWZpbmVzIHRoYXQgdGhlIGVsZW1lbnQgaXQgcmVwcmVzZW50cyB3aWxsIGhhdmUgY29udGVudCAnYXR0YWNoZWQnIHRvIGl0LiAgQ29udGVudCBEZXNjcmlwdGlvbiBpcyB0aGUgYWJzdHJhY3Rpb24gZm9yIHRoZSBhY3R1YWwgcGxhY2VzIGluIHdoaWNoIHRoZSBjb250ZW50IGlzIGJlaW5nIHJlcHJlc2VudGVkLiAgVGhpcyBzZXBhcmF0aW9uIGFsbG93cyBhIGRpc3RpbmN0aW9uIGJldHdlZW4gY29yZSBtZXRob2QgbW9kZWwgZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBtb2RlbCBmcm9tIHRoZSBhY3R1YWwgZGVzY3JpcHRpb24gY29udGFpbmVyIHByb3ZpZGluZywgZm9yIGV4YW1wbGUsIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBjb250ZW50IGVsZW1lbnQgaW4gZGlmZmVyZW50IGFsdGVybmF0aXZlcyBsYW5ndWFnZXMsIGF1ZGllbmNlcywgbGljZW5zaW5nIGxldmVscywgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRnVsZmlsbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc0Fic3RyYWN0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpYmFibGUgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGFuZCBtYW5hZ2VkIGFzIE1ldGhvZCBDb250ZW50LgotQ29udGVudCBFbGVtZW50cyByZXByZXNlbnRzIHJldXNhYmxlIE1ldGhvZCBDb250ZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBDb250ZW50IFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgQ29udGVudCBFbGVtZW50IGZyb20gUHJvY2VzcyBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmliYWJsZUVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNoZWNrbGlzdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbmNlcHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFeGFtcGxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iR3VpZGVsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJLaW5kIj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQZXJmb3JtZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0RlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgTWV0aG9kIEVsZW1lbnQgdGhhdCBnZW5lcmFsaXplcyBhbGwgZGVzY3JpcHRpb25zIG9mIHdvcmsgd2l0aGluIHRoZSBVbmlmaWVkIE1ldGhvZCBBcmNoaXRlY3R1cmUuICBUaGlzIHBhY2thZ2UgaW50cm9kdWNlcyB0d28gY29uY3JldGUgdHlwZXMgb2YgV29yayBEZWZpbml0aW9uczogVGFzayBhbmQgU3RlcC4gIFdvcmsgRGVmaW5pdGlvbnMgY2FuIGNvbnRhaW4gc2V0cyBvZiBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbnMgZGVmaW5pbmcgY29uc3RyYWludHMgdGhhdCBuZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB0aGUgZGVzY3JpYmVkIHdvcmsgY2FuIGJlZ2luIG9yIGJlZm9yZSBpdCBjYW4gYmUgZGVjbGFyZWQgYXMgZmluaXNoZWQuICBOb3RlIHRoYXQgZ2VuZXJhbCBvd25lZFJ1bGVzIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFuZCBydWxlcyBmb3IgV29yayBEZWZpbml0aW9ucy4KLVdvcmsgRGVmaW5pdGlvbnMgcmVwcmVzZW50IGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGZvciBkb2luZyB3b3JrLiAgVGhlc2UgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgYXJlIG5vdCBib3VuZCB0byBvbmUgc3BlY2lmaWMgY2xhc3NpZmllciwgYnV0IHJlcHJlc2VudCBhbiBhcmJpdHJhcnkgZGVmaW5pdGlvbiBvZiB3b3JrLiAgRm9yIGV4YW1wbGUsIGEgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkIGJ5IGEgc3BlY2lmaWMgUm9sZSAoZS5nLiBhIFJvbGUgcGVyZm9ybWluZyBhIHNwZWNpZmljIFRhc2sgb3IgU3RlcHMgb2YgYSBUYXNrKSwgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNsb3NlIGNvbGxhYm9yYXRpb24gKG1hbnkgUm9sZXMgYWxsIHdvcmtpbmcgdG9nZXRoZXIgb24gdGhlIHNhbWUgaW50ZXJkaXNjaXBsaW5hcnkgVGFzayksIG9yIGNvbXBsZXggd29yayB0aGF0IGlzIHBlcmZvcm1lZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgKGUuZy4gYSBwcm9jZXNzIGRlZmluaW5nIGEgYnJlYWtkb3duIHN0cnVjdHVyZSBmb3Igb3JnYW5pemluZyBsYXJnZXIgY29tcG9zaXRlIHVuaXRzIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjb2xsYWJvcmF0aW9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUG9zdGNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LgotQSBkaXNjaXBsaW5lIGlzIGEgY29sbGVjdGlvbiBvZiBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgbWFqb3IgJ2FyZWEgb2YgY29uY2Vybicgd2l0aGluIHRoZSBvdmVyYWxsIHByb2plY3QuIFRoZSBncm91cGluZyBvZiBUYXNrcyBpbnRvIGRpc2NpcGxpbmVzIGlzIG1haW5seSBhbiBhaWQgdG8gdW5kZXJzdGFuZGluZyB0aGUgcHJvamVjdCBmcm9tIGEgJ3RyYWRpdGlvbmFsJyB3YXRlcmZhbGwgcGVyc3BlY3RpdmUuIEhvd2V2ZXIsIHR5cGljYWxseSwgZm9yIGV4YW1wbGUsIGl0IGlzIG1vcmUgY29tbW9uIHRvIHBlcmZvcm0gY2VydGFpbiByZXF1aXJlbWVudHMgYWN0aXZpdGllcyBpbiBjbG9zZSBjb29yZGluYXRpb24gd2l0aCBhbmFseXNpcyBhbmQgZGVzaWduIGFjdGl2aXRpZXMuIFNlcGFyYXRpbmcgdGhlc2UgYWN0aXZpdGllcyBpbnRvIHNlcGFyYXRlIGRpc2NpcGxpbmVzIG1ha2VzIHRoZSBhY3Rpdml0aWVzIGVhc2llciB0byBjb21wcmVoZW5kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRhc2siIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YkRpc2NpcGxpbmUiIHR5cGU9InVtYTpEaXNjaXBsaW5lIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VXb3JrZmxvdyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEaXNjaXBsaW5lR3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAiU29mdHdhcmUgRGlzY2lwbGluZXMiIHdvdWxkIGJlIHRoZSBncm91cCBvZiBhbGwgZGlzY2lwbGluZXMgcmVsYXRlZCB0byBkZXZlbG9waW5nIHNvZnR3YXJlIHN1Y2ggYXMgIlJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IiBvciAiVGVzdGluZyI7ICJJVCBJbmZyYXN0cnVjdHVyZSBNYW5hZ2VtZW50IiB3b3VsZCBiZSBhIERpc2NpcGxpbmVzIEdyb3VwaW5nIGZvciBkaXNjaXBsaW5lcyBzdWNoIGFzICJJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyIsICJJVCBDdXN0b21lciBSZWxhdGlvbnNoaXBzIiwgb3IgIklUIEVuYWJsaW5nIFNlcnZpY2VzIi4gIERpc2NpcGxpbmVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIG1vcmUgdGhhbiBvbmUgRGlzY2lwbGluZSBHcm91cGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEaXNjaXBsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRvbWFpbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4KLURvbWFpbiBpcyBhIGxvZ2ljYWwgZ3JvdXBpbmcgb2Ygd29yayBwcm9kdWN0cyB0aGF0IGhhdmUgYW4gYWZmaW5pdHkgdG8gZWFjaCBvdGhlciBiYXNlZCBvbiByZXNvdXJjZXMsIHRpbWluZywgb3IgcmVsYXRpb25zaGlwLiAgQSBEb21haW4gbWF5IGJlIGRpdmlkZWQgaW50byBzdWJkb21haW5zLiAgRm9yIGV4YW1wbGUsIEdTIE1ldGhvZCB1c2VzIHNpeCBwcmVkZWZpbmVkIERvbWFpbnMgZm9yIFdvcmsgUHJvZHVjdHM6IEFwcGxpY2F0aW9uLCBBcmNoaXRlY3R1cmUsIEJ1c2luZXNzLCBFbmdhZ2VtZW50LCBPcGVyYXRpb25zIGFuZCBPcmdhbml6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YmRvbWFpbiIgdHlwZT0idW1hOkRvbWFpbiIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPk9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlU2V0R3JvdXBpbmciPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+Um9sZSBTZXRzIGNhbiBiZSBjYXRlZ29yaXplZCBpbnRvIFJvbGUgU2V0IEdyb3VwaW5ncy4gIEZvciBleGFtcGxlLCBkaWZmZXJlbnQgbWV0aG9kcyBtaWdodCBkZWZpbmUgc2ltaWxhciBSb2xlIFNldHMsIHdoaWNoIGhvd2V2ZXIgbmVlZCB0byBiZSBkaXN0aW5ndWlzaGVkIGZyb20gZWFjaCBvdGhlciBvbiBhIGdsb2JhbCBzY2FsZS4gIFRodXMsIFJvbGUgU2V0IEdyb3VwaW5ncyBhbGxvdyBkaXN0aW5ndWlzaGluZywgZm9yIGV4YW1wbGUsIFNvZnR3YXJlIFNlcnZpY2VzIE1hbmFnZXIgUm9sZSBTZXRzIGZyb20gU29mdHdhcmUgRGV2ZWxvcG1lbnQgT3JnYW5pemF0aW9uIE1hbmFnZXIgUm9sZSBTZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJvbGVTZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbnRhaW5lci9hZ2dyZWdhdGUgZm9yIFRvb2xNZW50b3JzLiAgSXQgY2FuIGFsc28gcHJvdmlkZSBnZW5lcmFsIGRlc2NyaXB0aW9ucyBvZiB0aGUgdG9vbCBhbmQgaXRzIGdlbmVyYWwgY2FwYWJpbGl0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlRvb2xNZW50b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3RUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ3VzdG9tQ2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNhdGVnb3JpemVkRWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViQ2F0ZWdvcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kUGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXVzZWRQYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnbG9iYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBQYWNrYWdlcyBjYW4gaGF2ZSBhIGdsb2JhbCBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCBldmVyeSBlbGVtZW50IG9mIGV2ZXJ5IG90aGVyIE1ldGhvZCBQYWNrYWdlIGNhbiBzZWUgdGhlIGdsb2JhbCBwYWNrYWdlJ3MgY29udGVudHMuICBHbG9iYWwgTWV0aG9kIFBhY2thZ2VzIGFyZSBwcmltYXJpbHkgdXNlZCB0byBzdG9yZSBjb21tb25seSB1c2VkIGNhdGVnb3J5IGRlZmluaXRpb25zIHN1Y2ggYXMgZm9yIERpc2NpcGxpbmVzIG9yIERvbWFpbnMsIHdoaWNoIGFyZSB1c2VkIGJ5IG1hbnkgVGFzayBhbmQgV29yayBQcm9kdWN0cyByZXNwZWN0aXZlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudFBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50RWxlbWVudCIgdHlwZT0idW1hOkNvbnRlbnRFbGVtZW50Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kUGFja2FnZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiIHR5cGU9InVtYTpDb250ZW50Q2F0ZWdvcnkiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0VsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4KLVByb2Nlc3MgRWxlbWVudHMgcmVwcmVzZW50cyBQcm9jZXNzIHNwZWNpZmljIGVsZW1lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gUHJvY2VzcyBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIFByb2Nlc3MgRWxlbWVudCBmcm9tIENvbnRlbnQgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkRlc2NyaWJhYmxlRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlBsYW5uaW5nRGF0YSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLVBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLShOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RhcnREYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmaW5pc2hEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCByYW5rIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRBZnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50ZWRCZWZvcmUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUGxhbm5pbmdEYXRhIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cGVyQWN0aXZpdHkiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzUGxhbm5lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrT3JkZXIiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi1UaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6c2ltcGxlQ29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnbG9iYWwgdW5pcXVlIGlkIGZvciBhIHdvcmsgb3JkZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlcXVpcmVkUmVzdWx0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBXb3JrIERlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgdGhlIG5lc3RpbmcgYW5kIGxvZ2ljYWwgZ3JvdXBpbmcgb2YgcmVsYXRlZCBCcmVha2Rvd24gRWxlbWVudHMgZm9ybWluZyBicmVha2Rvd24gc3RydWN0dXJlcy4gIEFsdGhvdWdoIEFjdGl2aXR5IGlzIGEgY29uY3JldGUgbWV0YS1jbGFzcywgb3RoZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVyaXZlIGZyb20gaXQ7IHN1Y2ggYXMgUGhhc2UsIEl0ZXJhdGlvbiwgRGVsaXZlcnkgUHJvY2Vzcywgb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuLgotQWN0aXZpdHkgcmVwcmVzZW50cyBhIGdyb3VwaW5nIGVsZW1lbnQgZm9yIG90aGVyIEJyZWFrZG93biBFbGVtZW50cyBzdWNoIGFzIEFjdGl2aXRpZXMsIERlc2NyaXB0b3JzLCBNaWxlc3RvbmVzLCBldGMuICBJdCBpcyBub3QgcGVyLXNlIGEgJ2hpZ2gtbGV2ZWwnIGdyb3VwaW5nIG9mIG9ubHkgd29yayBhcyBpbiBvdGhlciBtZXRhLW1vZGVscywgYnV0IGdyb3VwcyBhbnkga2luZCBvZiBCcmVha2Rvd24gRWxlbWVudHMuICBGb3IgZXhhbXBsZSwgb25lIGNhbiBkZWZpbmUgdmFsaWQgQWN0aXZpdGllcyB0aGF0IGdyb3VwIG9ubHkgV29yayBQcm9kdWN0cyBEZXNjcmlwdG9ycyB3aXRob3V0IGFueSBtYXRjaGluZyBUYXNrIERlc2NyaXB0b3JzLiAgQWN0aXZpdGllcyBhbHNvIGluaGVyaXQgYWxsIHByb3BlcnRpZXMgZnJvbSBXb3JrIEJyZWFrZG93biBFbGVtZW50IGFuZCBpbmRpcmVjdGx5IGZyb20gUHJvY2VzcyBFbGVtZW50OyBpLmUuIEFjdGl2aXR5IGlzIHJlYWR5IHRvIGhhdmUgYSBmdWxsIGNvbnRlbnQgZGVzY3JpcHRpb24gYXR0YWNoZWQgdG8gaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQnJlYWtkb3duRWxlbWVudCIgdHlwZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iSXNFbmFjdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGhhc2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHdoaWNoIHByZXNjcmliZXMgcHJlLWRlZmluZWQgdmFsdWVzIGZvciBpdHMgaW5zdGFuY2VzIGZvciB0aGUgYXR0cmlidXRlcyBwcmVmaXggKCdQaGFzZScpIGFuZCBpc1JlcGVhdGFibGUgKCdGYWxzZScpLiAgSXQgaGFzIGJlZW4gaW5jbHVkZWQgaW50byB0aGUgbWV0YS1tb2RlbCBmb3IgY29udmVuaWVuY2UgYW5kIHRvIHByb3ZpZGUgYSBzcGVjaWFsIHN0ZXJlb3R5cGUsIGJlY2F1c2UgaXQgcmVwcmVzZW50cyBhIHZlcnkgY29tbW9ubHkgdXNlZCBBY3Rpdml0eSB0eXBlLgotUGhhc2UgcmVwcmVzZW50IGEgc2lnbmlmaWNhbnQgcGVyaW9kIGluIGEgcHJvamVjdCwgZW5kaW5nIHdpdGggbWFqb3IgbWFuYWdlbWVudCBjaGVja3BvaW50LCBtaWxlc3RvbmUgb3Igc2V0IG9mIERlbGl2ZXJhYmxlcy4gIEl0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBhcyBhIHByZWRlZmluZWQgc3BlY2lhbCBBY3Rpdml0eSwgYmVjYXVzZSBvZiBpdHMgc2lnbmlmaWNhbmNlIGluIGRlZmluaW5nIGJyZWFrZG93bnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikl0ZXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1JdGVyYXRpb24gZ3JvdXBzIGEgc2V0IG9mIG5lc3RlZCBBY3Rpdml0aWVzIHRoYXQgYXJlIHJlcGVhdGVkIG1vcmUgdGhhbiBvbmNlLiAgSXQgcmVwcmVzZW50cyBhbiBpbXBvcnRhbnQgc3RydWN0dXJpbmcgZWxlbWVudCB0byBvcmdhbml6ZSB3b3JrIGluIHJlcGV0aXRpdmUgY3ljbGVzLiAgVGhlIGNvbmNlcHQgb2YgSXRlcmF0aW9uIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZGlmZmVyZW50IHJ1bGVzIGluIGRpZmZlcmVudCBtZXRob2RzLiAgRm9yIGV4YW1wbGUsIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIG1ldGhvZCBmcmFtZXdvcmsgKFJVUCkgZGVmaW5lcyBhIHJ1bGUgdGhhdCBJdGVyYXRpb25zIGFyZSBub3QgYWxsb3dlZCB0byBzcGFuIGFjcm9zcyBQaGFzZXMuICBJbiBjb250cmFzdCBJQk0gR2xvYmFsIFNlcnZpY2VzIE1ldGhvZCAoR1NNZXRob2QpIGJhc2VkIG1ldGhvZCBmcmFtZXdvcmtzIHRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBhbmQgSXRlcmF0aW9uIGNhbiBiZSBkZWZpbmVkIHdoaWNoIG5lc3QgUGhhc2VzLiAgUnVsZXMgbGlrZSB0aGVzZSwgd2hpY2ggcGxheSBhbiBpbXBvcnRhbnQgcm9sZSBmb3IgZWFjaCBpbmRpdmlkdWFsIG1ldGhvZCBhbmQgYXJlIHRoZXJlZm9yZSBub3QgZW5mb3JjZWQgYnkgdGhpcyBtZXRhLW1vZGVsLiAgSW5zdGVhZCwgcHJvY2VzcyBhdXRob3JzIGFyZSBleHBlY3RlZCB0byBmb2xsb3cgYW5kIGNoZWNrIHRoZXNlIHJ1bGVzIG1hbnVhbGx5LiAgKE5vdGU6IEFueSBCcmVha2Rvd24gRWxlbWVudCBjYW4gYmUgcmVwZWF0ZWQ7IGhvd2V2ZXIsIEl0ZXJhdGlvbnMgaGFzIGJlZW4gaW50cm9kdWNlZCBhcyBhIHNwZWNpYWwgbWV0YS1tb2RlbCBjb25jZXB0LCBiZWNhdXNlIG9mIGl0cyBpbXBvcnRhbnQgcm9sZSBmb3IgbWFueSBtZXRob2RzLik8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzYWdlR3VpZGFuY2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBbHRlcm5hdGl2ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGRvaW5nIHRoZSB3b3JrIG9mIHRoaXMgQWN0aXZpdHkgbm90IGNvdmVyZWQgYnkgdGhlIEFjdGl2aXR5J3MgVGFza3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJIb3dUb1N0YWZmIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIG9uIHdobyBzaG91bGQgYmUgaW52b2x2ZWQgaW4gdGhpcyBhY3Rpdml0eSB3aGF0IGFyZSB0aGUgcmVxdWlyZWQgc2tpbGxzLCBleHBlcmllbmNlLCAgYW5kIHBlcmhhcHMgYXR0aXR1ZGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBBY3Rpdml0eSwgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdGl2aXR5IGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYWNoaWV2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmluZWREZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgRGVzY3JpcHRvciBtaWdodCBhZGQgcmVmaW5lbWVudHMgdG8gdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGhlIENvbnRlbnQgRWxlbWVudCBpdCByZWZlcnMgdG8uICBGb3IgZXhhbXBsZSwgaXQgY291bGQgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgV29yayBQcm9kdWN0IHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgcG9pbnQgaW4gdGltZSBpbiB0aGUgcHJvY2VzcyB0aGlzIFdvcmsgUHJvZHVjdCB0eXBlIGlzIGJlaW5nIHVzZWQuICBJdCBjb3VsZCBkZXNjcmliZSBhZGRpdGlvbmFsIHNraWxscyBuZWVkZWQgZm9yIGEgUm9sZSBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiBhIHByb2Nlc3MsIGV0Yy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlNjb3BlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlVzYWdlTm90ZXMiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFueSBhZGRpdGlvbmFsIG5vdGVzIG9uIGhvdyB0byBhcHBseSBhbmQgaW5zdGFudGlhdGUgdGhpcyBwcm9jZXNzIGZvciBhIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBQcm9jZXNzIERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZWxpdmVyeSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIGNoYXJhY3RlcmlzdGljcyBhYm91dCB0aGUgc2l6ZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvamVjdCBleHByZXNzZWQgaW4gdGVhbSBzaXplLCBtYW4geWVhcnMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNoYXJhY3Rlcml6ZXMgdGhlIHByb2plY3QgdGhhdCB3b3VsZCB0eXBpY2FsbHkgcGVyZm9ybSB0aGlzIFByb2Nlc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3V0bGluZXMgdHlwaWNhbCBwcm9qZWN0IHJpc2tzIHRoYXQgYXJlIGFkZHJlc3NlZCB3aXRoIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHByb3ZpZGVkIGZvciB0aGlzIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBhIHByb2ZpbGUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGVhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiByb2xlcywgc2tpbGxzIHJlcXVpcmVkIGZvciBhIHRlYW0gcGVyZm9ybXMgYSBwcm9qZWN0IGJhc2VkIG9uIHRoaXMgcHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb0knbSBjaGFJJ20gbnRyYWN0cyB0aGF0IG5lZWQgdG8gYmUgZXN0YWJsaXNoZWQgYmV0d2VlbiBhIHByb2plY3QgdGVhbSB0aGF0IHBlcmZvcm1zIHRoaXMgcHJvY2VzcyBhbmQgYSBjbGllbnQgKGUuZy4gZm9yIGFuIElHUyBlbmdhZ2VtZW50KS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4KLURlc2NyaXB0b3JzIGFyZSB0aGUga2V5IGNvbmNlcHQgZm9yIHJlYWxpemluZyB0aGUgc2VwYXJhdGlvbiBvZiBwcm9jZXNzZXMgZnJvbSBtZXRob2QgY29udGVudC4gIEEgRGVzY3JpcHRvciBjYW4gYmUgY2hhcmFjdGVyaXplZCBhcyBhIHJlZmVyZW5jZSBvYmplY3QgZm9yIG9uZSBwYXJ0aWN1bGFyIENvbnRlbnQgRWxlbWVudCwgd2hpY2ggaGFzIGl0cyBvd24gcmVsYXRpb25zaGlwcyBhbmQgcHJvcGVydGllcy4gIFdoZW4gYSBEZXNjcmlwdG9yIGlzIGNyZWF0ZWQgaXQgc2hhbGwgYmUgcHJvdmlkZWQgd2l0aCBjb25ncnVlbnQgY29waWVzIG9mIHRoZSByZWxhdGlvbnNoaXBzIGRlZmluZWQgZm9yIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgZWxlbWVudC4gIEhvd2V2ZXIsIGEgdXNlciBjYW4gbW9kaWZ5IHRoZXNlIHJlbGF0aW9uc2hpcHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgc2l0dWF0aW9uIGZvciB3aGljaCB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVzcG9uc2libGVSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dFRvIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0RnJvbSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJhYmxlUGFydHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5HaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWN0aXZpdHlFeGl0U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFeGlzdCBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBmaW5pc2hlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaGFzIGZpbmlzaGVkIHRoYXQgaGF2ZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIG91dHB1dCkuCi1Gb3Igc29tZSBXb3JrIFByb2R1Y3RzIHN0YXRlIGlzIGV4cHJlc3NlZCBpbiBwZXJjZW50YWdlIG9mIGNvbXBsZXRpb24sIGNvbXBsaWFuY2UgdG8gd29yayBwcm9kdWN0IGNoZWNrbGlzdCwgaW5mb3JtYWwgc3RhdGUgZGVzY3JpcHRpb25zLCBldGMuICBPdGhlcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHN0YXRlcyBleHByZXNzZWQgYXMgZW51bWVyYXRpb25zIHN1Y2ggYXMgW2lkZW50aWZpZWQsIGJyaWVmbHkgZGVzY3JpYmVkLCBvdXRsaW5lZCwgZGV0YWlsZWRdIGZvciB1c2UgY2FzZXMuICBPdGhlciBXb3JrIFByb2R1Y3Qgc3RhdGVzIHJlbGF0ZSB0byBzb21lIHF1YWxpdHkgbWVhc3VyZXMgb3IgbGlmZWN5Y2xlIHN0YXRlcyBzdWNoIGFzIFtyZXZpZXdlZCwgaW1wbGVtZW50ZWQsIHRlc3RlZF0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUm9sZURlc2NyaXB0b3IiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgUm9sZSBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgUm9sZSBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFJvbGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgUm9sZSBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpEZXNjcmlwdG9yIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZXNwb25zaWJsZUZvciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi1BIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBc3Npc3RlZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXh0ZXJuYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3B0aW9uYWxJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik91dHB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdGVwIiB0eXBlPSJ1bWE6U2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb21wb3NpdGVSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBSb2xlIERlc2NyaXB0b3IgdGhhdCByZWxhdGVzIHRvIG1vcmUgdGhlbiBvbmUgUm9sZS4gIEl0IHJlcHJlc2VudHMgYSBncm91cGluZyBvZiBSb2xlcyB3aXRoIHRoZSBtYWluIHB1cnBvc2Ugb2Ygc2ltcGxpZmljYXRpb24sIGkuZS4gcmVkdWNpbmcgdGhlIG51bWJlciBvZiByb2xlcyBmb3IgYSBwcm9jZXNzLgotQSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpSb2xlRGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZ2dyZWdhdGVkUm9sZSIgdHlwZT0idW1hOlJvbGUiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVhbVByb2ZpbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBlclRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlRlYW0iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuCi1Db3JlIE1ldGhvZCBDb250ZW50IHByb3ZpZGVzIHN0ZXAtYnktc3RlcCBleHBsYW5hdGlvbnMsIGRlc2NyaWJpbmcgaG93IHZlcnkgc3BlY2lmaWMgZGV2ZWxvcG1lbnQgZ29hbHMgYXJlIGFjaGlldmVkIGluZGVwZW5kZW50IG9mIHRoZSBwbGFjZW1lbnQgb2YgdGhlc2Ugc3RlcHMgd2l0aGluIGEgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlLiAgUHJvY2Vzc2VzIHRha2UgdGhlc2UgbWV0aG9kIGVsZW1lbnRzIGFuZCByZWxhdGUgdGhlbSBpbnRvIHNlbWktb3JkZXJlZCBzZXF1ZW5jZXMgdGhhdCBhcmUgY3VzdG9taXplZCB0byBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0cy4gIFRodXMsIGEgcHJvY2VzcyBpcyBhIHNldCBvZiBwYXJ0aWFsbHkgb3JkZXJlZCB3b3JrIGRlc2NyaXB0aW9ucyBpbnRlbmRlZCB0byByZWFjaCBhIGhpZ2hlciBkZXZlbG9wbWVudCBnb2FsLCBzdWNoIGFzIHRoZSByZWxlYXNlIG9mIGEgc3BlY2lmaWMgc29mdHdhcmUgc3lzdGVtLiAgQSBwcm9jZXNzIGFuZCB0aGUgcHJvY2VzcyBtZXRhLW1vZGVsIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoaXMgc3BlY2lmaWNhdGlvbiBmb2N1c2VzIG9uIHRoZSBsaWZlY3ljbGUgYW5kIHRoZSBzZXF1ZW5jaW5nIG9mIHdvcmsgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUbyBhY2hpZXZlIHRoaXMgaXQgdXNlcyB0aGUgRGVzY3JpcHRvciBjb25jZXB0IHJlZmVyZW5jaW5nIG1ldGhvZCBjb250ZW50IGFuZCBhbGxvd2luZyBkZWZpbmluZyB0aW1lLXNwZWNpZmljIGN1c3RvbWl6YXRpb25zIG9mIHRoZSByZWZlcmVuY2VkIGNvbnRlbnQgKGUuZy4gZGVmaW5pbmcgYSBmb2N1cyBvbiBkaWZmZXJlbnQgc3RlcHMgb2YgdGhlIHNhbWUgVGFzayBhbmQgcHJvdmlkaW5nIGlucHV0IFdvcmsgUHJvZHVjdHMgaW4gZGlmZmVyZW50IHN0YXRlcyB3aXRoaW4gdGhlIGRpZmZlcmVudCBQaGFzZXMgb2YgYSBwcm9jZXNzIGxpZmVjeWNsZSBpbiB3aGljaCB0aGUgc2FtZSBUYXNrIGlzIHBlcmZvcm1lZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eSI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkluY2x1ZGVzUGF0dGVybiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVmFsaWRDb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlhZ3JhbVVSSSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgVVJJIG9mIHRoZSBkaWFncmFtIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29weXJpZ2h0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZSIgdHlwZT0idW1hOlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIG1pbk9jY3Vycz0iMCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWZhdWx0VmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VidHJhY3RlZENhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBZGRlZENhdGVnb3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiB0eXBlPSJ1bWE6TWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kVW5pdCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBsdWdpbiIgdHlwZT0idW1hOk1ldGhvZFBsdWdpbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0b29sIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZExpYnJhcnkiIHR5cGU9InVtYTpNZXRob2RMaWJyYXJ5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgTWV0aG9kIExpYnJhcnkgaXMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQbHVnaW5zIGFuZCBNZXRob2QgQ29uZmlndXJhdGlvbiBkZWZpbml0aW9ucy4gIEFsbCBNZXRob2QgRWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIE1ldGhvZCBMaWJyYXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JPC94c2Q6ZWxlbWVudD4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMzNTk0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyODM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InVtYSIKLSAgICBuc1VSST0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41IiBuc1ByZWZpeD0idW1hIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eSIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFdvcmsgQnJlYWtkb3duIEVsZW1lbnQgYW5kIFdvcmsgRGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyB0aGUgbmVzdGluZyBhbmQgbG9naWNhbCBncm91cGluZyBvZiByZWxhdGVkIEJyZWFrZG93biBFbGVtZW50cyBmb3JtaW5nIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgQWx0aG91Z2ggQWN0aXZpdHkgaXMgYSBjb25jcmV0ZSBtZXRhLWNsYXNzLCBvdGhlciBjbGFzc2VzIHdoaWNoIHJlcHJlc2VudCBicmVha2Rvd24gc3RydWN0dXJlcyBkZXJpdmUgZnJvbSBpdDsgc3VjaCBhcyBQaGFzZSwgSXRlcmF0aW9uLCBEZWxpdmVyeSBQcm9jZXNzLCBvciBDYXBhYmlsaXR5IFBhdHRlcm4uJiN4RDsmI3hBO0FjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYnJlYWtkb3duRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9CcmVha2Rvd25FbGVtZW50IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyb2FkbWFwIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9hZG1hcCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzRW5hY3RhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJc0VuYWN0YWJsZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlUeXBlIiBlVHlwZT0iIy8vVmFyaWFiaWxpdHlUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhcmlhYmlsaXR5VHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYW4gQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBY3Rpdml0eURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbHRlcm5hdGl2ZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imhvd1RvU3RhZmYiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBvbiB3aG8gc2hvdWxkIGJlIGludm9sdmVkIGluIHRoaXMgYWN0aXZpdHkgd2hhdCBhcmUgdGhlIHJlcXVpcmVkIHNraWxscywgZXhwZXJpZW5jZSwgIGFuZCBwZXJoYXBzIGF0dGl0dWRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSG93VG9TdGFmZiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlB1cnBvc2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iIGVTdXBlclR5cGVzPSIjLy9QYWNrYWdlYWJsZUVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUHJpbWFyeUV4dGVuc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaXNQcmltYXJ5RXh0ZW5zaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0IiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgdGFuZ2libGUgd29yayBwcm9kdWN0IHR5cGVzLiBBcnRpZmFjdHMgbWF5IGJlIGNvbXBvc2VkIG9mIG90aGVyIGFydGlmYWN0cy4gRm9yIGV4YW1wbGUsIGEgbW9kZWwgYXJ0aWZhY3QgY2FuIGJlIGNvbXBvc2VkIG9mIG1vZGVsIGVsZW1lbnRzLCB3aGljaCBhcmUgYWxzbyBhcnRpZmFjdHMuJiN4RDsmI3hBO0FydGlmYWN0cyBhcmUgdGFuZ2libGUgd29yayBwcm9kdWN0cyBjb25zdW1lZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IFRhc2tzLiAgSXQgbWF5IHNlcnZlIGFzIGEgYmFzaXMgZm9yIGRlZmluaW5nIHJldXNhYmxlIGFzc2V0cy4gIFJvbGVzIHVzZSBBcnRpZmFjdHMgdG8gcGVyZm9ybSBUYXNrcyBhbmQgcHJvZHVjZSBBcnRpZmFjdHMgaW4gdGhlIGNvdXJzZSBvZiBwZXJmb3JtaW5nIFRhc2tzLiAgQXJ0aWZhY3RzIGFyZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYSBzaW5nbGUgUm9sZSwgbWFraW5nIHJlc3BvbnNpYmlsaXR5IGVhc3kgdG8gaWRlbnRpZnkgYW5kIHVuZGVyc3RhbmQsIGFuZCBwcm9tb3RpbmcgdGhlIGlkZWEgdGhhdCBldmVyeSBwaWVjZSBvZiBpbmZvcm1hdGlvbiBwcm9kdWNlZCBpbiB0aGUgbWV0aG9kIHJlcXVpcmVzIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2Ygc2tpbGxzLiBFdmVuIHRob3VnaCBvbmUgcm9sZSBtaWdodCAmcXVvdDtvd24mcXVvdDsgYSBzcGVjaWZpYyB0eXBlIG9mIEFydGlmYWN0cywgb3RoZXIgcm9sZXMgY2FuIHN0aWxsIHVzZSB0aGUgQXJ0aWZhY3RzOyBwZXJoYXBzIGV2ZW4gdXBkYXRlIHRoZW0gaWYgdGhlIFJvbGUgaGFzIGJlZW4gZ2l2ZW4gcGVybWlzc2lvbiB0byBkbyBzby4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFydGlmYWN0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb250YWluZWRBcnRpZmFjdCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9BcnRpZmFjdCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250YWluZWRBcnRpZmFjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFydGlmYWN0RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZPdXRsaW5lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoaXMgYXJ0aWZhY3QuIEZvciBleGFtcGxlLCBkaXNjdXNzZXMgdGhlIGNvbnRlbnRzIGZvciBrZXkgY2hhcHRlcnMgb2YgYSBkb2N1bWVudCBhcnRpZmFjdCBvciB0aGUga2V5IHBhY2thZ2VzIGFuZCBtb2R1bGVzIG9mIGEgbW9kZWwgYXJ0aWZhY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyaWVmT3V0bGluZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXByZXNlbnRhdGlvbk9wdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVwcmVzZW50YXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcHJlc2VudGF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vdGF0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOb3RhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vUHJvY2Vzc0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHBhcnQgb2YgYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSXQgZGVmaW5lcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSB0byBhbGwgb2YgaXRzIHNwZWNpYWxpemF0aW9ucy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJyZWFrZG93bkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZXNlbnRlZEFmdGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVzZW50ZWRBZnRlciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50ZWRCZWZvcmUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRlZEJlZm9yZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwbGFubmluZ0RhdGEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBsYW5uaW5nRGF0YSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBlckFjdGl2aXR5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdXBlckFjdGl2aXR5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoZWNrbGlzdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmNlcHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkZWxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxOCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzYWJsZUFzc2V0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE4Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndoaXRlcGFwZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXaGl0ZXBhcGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTgiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXRhaWwgVXNlIENhc2UmcXVvdDsgd291bGQgYmUgcGVyZm9ybWVkIGZvciBldmVyeSB1c2UgY2FzZSBpZGVudGlmaWVkIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIG9yIEFjdGl2aXR5LiAgR2VuZXJhdGluZyBhIHBsYW4gd291bGQgbGlzdCBvbmUgVGFzayBpbnN0YW5jZSBwZXIgdXNlIGNhc2UuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc09wdGlvbmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJbmRpY2F0ZXMgdGhhdCB0aGUgQnJlYWtkb3duIEVsZW1lbnQgZGVzY3JpYmVzIHdvcmssIGEgd29yayByZXN1bHQsIG9yIGV2ZW4gd29yayByZXNvdXJjZXMsIHdoaWNoIGluY2x1c2lvbiBpcyBub3QgbWFuZGF0b3J5IHdoZW4gcGVyZm9ybWluZyBhIHByb2plY3QgdGhhdCBpcyBwbGFubmVkIGJhc2VkIG9uIGEgcHJvY2VzcyBjb250YWluaW5nIHRoaXMgZWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc09wdGlvbmFsIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlzUGxhbm5lZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIgotICAgICAgICB1bnNldHRhYmxlPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LiYjeEQ7JiN4QTsiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1BsYW5uZWQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByZWZpeCByZXByZXNlbnRzIGFuIGFkZGl0aW9uYWwgbGFiZWwgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBhcyBhIHByZWZpeCB0byBhbnkgQnJlYWtkb3duIEVsZW1lbnQgdG8gaW5kaWNhdGUgYSB1c2VyLWRlZmluZWQgc3ViLXR5cGUgZm9yIHRoZSBlbGVtZW50LiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHdvdWxkIGxpa2UgdG8gZGlzdGluZ3Vpc2ggaGlzIEFjdGl2aXRpZXMgYnkgJ01vZHVsZScgKGFzIGRvbmUgaW4gdGhlIElCTSBSYXRpb25hbCBTdW1taXQgQXNjZW5kYW50IE1ldGhvZCksIGhlIGNhbiBkZWZpbmUgYSBkaWZmZXJlbnQgcHJlZml4IGZvciBldmVyeSBtb2RlbCB0byBiZSB1c2VkIGluIGFkZGl0aW9uIHRvIG5hbWluZyBBY3Rpdml0aWVzLCBlLmcuICZxdW90O1NSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzJnF1b3Q7IHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICZxdW90O1NvZnR3YXJlIFJlcXVpcmVtZW50cyBBbmFseXNpcyZxdW90OyBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAmcXVvdDtDdXN0b21lci5BcmNoaXRlY3QmcXVvdDsgd291bGQgZGVmaW5lIGEgJnF1b3Q7Q3VzdG9tZXImcXVvdDsgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICZxdW90O0FyY2hpdGVjdCZxdW90OyBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlR3VpZGFuY2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idXNhZ2VHdWlkYW5jZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBQcm9jZXNzIHRoYXQgZGVzY3JpYmVzIGEgcmV1c2FibGUgY2x1c3RlciBvZiBkb2luZyB3b3JrIGluIGNvbW1vbiBwcm9jZXNzIGFyZWFzLiAgQ2FwYWJpbGl0aWVzIFBhdHRlcm5zIGV4cHJlc3MgYW5kIGNvbW11bmljYXRlIHByb2Nlc3Mga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIG9mIGludGVyZXN0IHN1Y2ggYXMgYSBEaXNjaXBsaW5lIGFuZCBjYW4gYmUgZGlyZWN0bHkgdXNlZCBieSBwcm9jZXNzIHByYWN0aXRpb25lciB0byBndWlkZSBoaXMgd29yay4gIFRoZXkgYXJlIGFsc28gdXNlZCBhcyBidWlsZGluZyBibG9ja3MgdG8gYXNzZW1ibGUgRGVsaXZlcnkgUHJvY2Vzc2VzIG9yIGxhcmdlciBDYXBhYmlsaXR5IFBhdHRlcm5zIGVuc3VyaW5nIG9wdGltYWwgcmV1c2UgYW5kIGFwcGxpY2F0aW9uIG9mIHRoZSBrZXkgcHJhY3RpY2VzIHRoZXkgZXhwcmVzcy4mI3hEOyYjeEE7QSBDYXBhYmlsaXR5IFBhdHRlcm4gaXMgYSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBkZXNjcmliZXMgYSByZXVzYWJsZSBjbHVzdGVyIG9mIGRvaW5nIHdvcmsgaW4gYSBnZW5lcmFsIHByb2Nlc3MgYXJlYSB0aGF0IHByb3ZpZGVzIGEgY29uc2lzdGVudCBkZXZlbG9wbWVudCBhcHByb2FjaCB0byBjb21tb24gcHJvYmxlbXMuICBFeGFtcGxlcyBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJuIGNvdWxkIGJlICd1c2UgY2FzZS1iYXNlZCByZXF1aXJlbWVudHMgbWFuYWdlbWVudCcsICd1c2UgY2FzZSBhbmFseXNpcycsIG9yICd1bml0IHRlc3RpbmcnLiBUeXBpY2FsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSwgQ2FwYWJpbGl0eSBQYXR0ZXJucyBoYXZlIHRoZSBzY29wZSBvZiBvbmUgZGlzY2lwbGluZSBwcm92aWRpbmcgYSBicmVha2Rvd24gb2YgcmV1c2FibGUgY29tcGxleCBBY3Rpdml0aWVzLCByZWxhdGlvbnNoaXBzIHRvIHRoZSBSb2xlcyB3aGljaCBwZXJmb3JtIFRhc2tzIHdpdGhpbiB0aGVzZSBBY3Rpdml0aWVzLCBhcyB3ZWxsIGFzIHRvIHRoZSBXb3JrIFByb2R1Y3RzIHRoYXQgYXJlIHVzZWQgYW5kIHByb2R1Y2VkLiAgQSBjYXBhYmlsaXR5IHBhdHRlcm4gZG9lcyBub3QgcmVsYXRlIHRvIGFueSBzcGVjaWZpYyBwaGFzZSBvciBpdGVyYXRpb24gb2YgYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUsIGFuZCBzaG91bGQgbm90IGltcGx5IGFueS4gIEluIG90aGVyIHdvcmRzLCBhIHBhdHRlcm4gc2hvdWxkIGJlIGRlc2lnbmVkIGluIGEgd2F5IHRoYXQgaXQgaXMgYXBwbGljYWJsZSBhbnl3aGVyZSBpbiBhIERlbGl2ZXJ5IFByb2Nlc3MuICBUaGlzIGVuYWJsZXMgaXRzIEFjdGl2aXRpZXMgdG8gYmUgZmxleGlibHkgYXNzaWduZWQgdG8gd2hhdGV2ZXIgcGhhc2VzIHRoZXJlIGFyZSBpbiB0aGUgRGVsaXZlcnkgUHJvY2VzcyB0byB3aGljaCBpdCBpcyBiZWluZyBhcHBsaWVkLiAgSXQgaXMgYSBnb29kIHByYWN0aWNlIHRvIGRlc2lnbiBhIENhcGFiaWxpdHkgUGF0dGVybiB0byBwcm9kdWNlIG9uZSBvciBtb3JlIGdlbmVyaWMgRGVsaXZlcmFibGVzLiAgVGhlIHR5cGljYWwgY29uZmlndXJhdGlvbiBpcyB0aGF0IGVhY2ggQWN0aXZpdHkgaW4gdGhlIENhcGFiaWxpdHkgUGF0dGVybiBwcm9kdWNlcyBvbmUgRGVsaXZlcmFibGUsIGFuZCB0aGUgbGFzdCBUYXNrIERlc2NyaXB0b3IgaW4gdGhlIEFjdGl2aXR5IGV4cGxpY2l0bHkgb3V0cHV0cyBqdXN0IHRoaXMgRGVsaXZlcmFibGUuICBUaGlzIGVuYWJsZXMgdGhlIHByb2Nlc3MgZW5naW5lZXIgdG8gc2VsZWN0IFBhdHRlcm5zIG9yIGp1c3QgQWN0aXZpdGllcyBieSBkZWNpZGluZyB3aGljaCBEZWxpdmVyYWJsZXMgYXJlIHJlcXVpcmVkLiAgSXQgYWxzbyBvZmZlcnMgYSBzaW1wbGUgaW50ZWdyYXRpb24gYXBwcm9hY2g6IGFuIEFjdGl2aXR5IGZyb20gYSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgbGlua2VkIHRvIHRoZSBQaGFzZSBvciBJdGVyYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUgQWN0aXZpdHkncyBEZWxpdmVyYWJsZS4gIEtleSBhcHBsaWNhdGlvbnMgYXJlYXMgb2YgLyBhcmVhcyBvZiByZXVzZSBmb3IgQ2FwYWJpbGl0eSBQYXR0ZXJucyBhcmU6JiN4RDsmI3hBOy0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBkaXJlY3QgZXhlY3V0aW9uIGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCB0aGF0IGRvZXMgbm90IHdvcmsgZm9sbG93aW5nIGEgd2VsbC1kZWZpbmVkIHByb2Nlc3MsIGJ1dCB3b3JrcyBiYXNlZCBvbiBsb29zZWx5IGNvbm5lY3RlZCBwcm9jZXNzIGZyYWdtZW50cyBvZiBiZXN0IHByYWN0aWNlcyBpbiBhIGZsZXhpYmxlIG1hbm5lciAoZS5nLiBBZ2lsZSBEZXZlbG9wbWVudCkuJiN4RDsmI3hBOy0gVG8gc3VwcG9ydCBwcm9jZXNzIGVkdWNhdGlvbiBieSBkZXNjcmliaW5nIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBzdWNoIGFzIGJlc3QgcHJhY3RpY2VzIG9uIGhvdyB0byBwZXJmb3JtIHRoZSB3b3JrIGZvciBhIERpc2NpcGxpbmUgKGUuZy4gUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQpLCBmb3IgYSBzcGVjaWZpYyBkZXZlbG9wbWVudCB0ZWNobmlxdWUgKGFzcGVjdC1vcmllbnRlZCBkZXZlbG9wbWVudCksIG9yIGEgc3BlY2lmaWMgdGVjaG5pY2FsIGFyZWEgKGUuZy4gcmVsYXRpb25hbCBkYXRhYmFzZSBkZXNpZ24pLCB3aGljaCBpcyB1c2VkIGZvciBlZHVjYXRpb24gYW5kIHRlYWNoaW5nLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNoZWNrbGlzdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29tcG9zaXRlUm9sZSIgZVN1cGVyVHlwZXM9IiMvL1JvbGVEZXNjcmlwdG9yIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4mI3hEOyYjeEE7QSBDb21wb3NpdGUgUm9sZSBpcyBhIGdyb3VwaW5nIG9mIFJvbGVzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYW4gQWN0aXZpdHkgb3IgUHJvY2VzcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBSb2xlcy4gIEEgdHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBiZSBhIHByb2Nlc3MgZm9yIGEgc21hbGwgdGVhbSBpbiB3aGljaCBhIHN0YW5kYXJkIHNldCBvZiByb2xlcyBmcm9tIHRoZSBtZXRob2QgY29udGVudCB3b3VsZCBiZSBhbGwgcGVyZm9ybWVkIGJ5IG9uZSBvciBtb3JlIHJlc291cmNlLiAgQnkgdXNpbmcgQ29tcG9zaXRlIFJvbGUgdGhlIHByb2Nlc3Mgd291bGQgc3VnZ2VzdCBhIHR5cGljYWwgY2x1c3RlcmluZyBvZiBSb2xlcyB0byBSZXNvdXJjZXMuICBBIENvbXBvc2l0ZSBSb2xlIGNvdWxkIHBlcmZvcm0gYWxsIFRhc2tzIGRlZmluZWQgZm9yIHRoZSBSb2xlcyBpdCByZWZlcnMgdG8uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb21wb3NpdGVSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhZ2dyZWdhdGVkUm9sZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Sb2xlIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIKLSAgICAgICAgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFnZ3JlZ2F0ZWRSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29uY2VwdCIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBvdXRsaW5lcyBrZXkgaWRlYXMgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIHByaW5jaXBsZXMgdW5kZXJseWluZyB0aGUgcmVmZXJlbmNlZCBpdGVtLiBDb25jZXB0cyBub3JtYWxseSBhZGRyZXNzIG1vcmUgZ2VuZXJhbCB0b3BpY3MgdGhhbiBHdWlkZWxpbmVzIGFuZCBzcGFuIGFjcm9zcyBzZXYtZXJhbCB3b3JrIHByb2R1Y3QgYW5kL29yIHRhc2tzL2FjdGl2aXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBjb25kaXRpb24gb3IgcmVzdHJpY3Rpb24gZXhwcmVzc2VkIGluIG5hdHVyYWwgbGFuZ3VhZ2UgdGV4dCBvciBpbiBhIG1hY2hpbmUgcmVhZGFibGUgbGFuZ3VhZ2UgZm9yIHRoZSBwdXJwb3NlIG9mIGRlY2xhcmluZyBzb21lIG9mIHRoZSBzZW1hbnRpY3Mgb2YgYSBNZXRob2QgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnN0cmFpbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1haW5EZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJTdG9yZXMgdGhlIG1haW4gZGVmaW5pdGlvbiBvZiB0aGUgY29uc3RyYWludC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJtYWluRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudENhdGVnb3J5IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIGdlbmVyYWxpemluZyBjb250ZW50IGNhdGVnb3J5IHR5cGVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgb25seSBjb250YWlucyBDb250ZW50IENhdGVnb3J5IEVsZW1lbnRzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudENhdGVnb3J5IiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbnRlbnRDYXRlZ29yeSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50Q2F0ZWdvcnkiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBDb250ZW50IEVsZW1lbnQuICBJdCBkZWZpbmVzIHN0YW5kYXJkIGF0dHJpYnV0ZXMgYXBwbGljYWJsZSBmb3IgYWxsIENvbnRlbnQgRWxlbWVudCB0eXBlcy4gIFNwZWNpZmljIENvbnRlbnQgRWxlbWVudCBzdWItdHlwZXMgY2FuIGRlZmluZSB0aGVpciBvd24gbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBzdWItdHlwZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudERlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYWluRGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iU3RvcmVzIHRoZSBtYWluIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBDb250ZW50IEVsZW1lbnQuICBBbGwgdGV4dCB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFueSBvZiB0aGUgbW9yZSBzcGVjaWZpYyBhdHRyaWJ1dGVzIHNoYWxsIGJlIHN0b3JlZCBoZXJlLiAgSWYgdGhlIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgZGl2aWRlZCBpbnRvIHNlY3Rpb25zIHVzaW5nIHRoZSBTZWN0aW9uIGNsYXNzLCB0aGVuIG9ubHkgdGhlIHRleHQgZnJvbSB0aGUgJ3N0YXJ0JyBvZiB0aGUgY29udGVudCBkZXNjcmlwdGlvbiB0byB0aGUgZmlyc3Qgc2VjdGlvbiB3aWxsIGJlIHN0b3JlZCBoZXJlIChzaW1pbGFyIHRvIGEgbm9ybWFsIGRvY3VtZW50IHdoZXJlIHlvdSBjYW4gcGxhY2UgdGV4dCBiZXR3ZWVuIGl0cyBiZWdpbm5pbmcgdG8gaXRzIGZpcnN0IGRpY3Rpb24gaGVhZGluZykuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJrZXlDb25zaWRlcmF0aW9ucyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iS2V5Q29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VjdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TZWN0aW9uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNlY3Rpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZXh0ZXJuYWxJZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDb250ZW50RWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYW5kIG1hbmFnZWQgYXMgTWV0aG9kIENvbnRlbnQuJiN4RDsmI3hBO0NvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudEVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoZWNrbGlzdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNoZWNrbGlzdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbmNlcHQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb25jZXB0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhhbXBsZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4YW1wbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJndWlkZWxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkZWxpbmUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXVzYWJsZUFzc2V0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmV1c2FibGVBc3NldCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN1cHBvcnRpbmdNYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjE0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndoaXRlcGFwZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXaGl0ZXBhcGVyIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MTQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29udGVudFBhY2thZ2UiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RQYWNrYWdlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDb250ZW50UGFja2FnZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MTMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udGVudEVsZW1lbnQiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29udGVudEVsZW1lbnQiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQ29udGVudEVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJDdXN0b21DYXRlZ29yeSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICZxdW90O1Rlc3RpbmcmcXVvdDsgY2F0ZWdvcnkgdGhhdCBncm91cHMgdG9nZXRoZXIgYWxsIHJvbGVzLCB3b3JrIHByb2R1Y3RzLCB0YXNrcywgYW5kIGd1aWRhbmNlIGVsZW1lbnQgcmVsZXZhbnQgdG8gdGVzdGluZy4gIEFub3RoZXIgZXhhbXBsZSB3b3VsZCBiZSBjYXRlZ29yaWVzIHRoYXQgZXhwcmVzcyBsaWNlbnNpbmcgbGV2ZWxzIG9mIHRoZSBjb250ZW50IGdyb3VwaW5nIGZyZWVseSBkaXN0cmlidXRhYmxlIG1ldGhvZCBjb250ZW50IHZlcnN1cyBjb250ZW50IHRoYXQgcmVwcmVzZW50IGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgcmVxdWlyZXMgYSBsaWNlbnNlIHRvIGJlIHB1cmNoYXNlZCB0byBiZSBhYmxlIHRvIHVzZSBpdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkN1c3RvbUNhdGVnb3J5Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRlZ29yaXplZEVsZW1lbnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJDYXRlZ29yaXplZEVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJDYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1YkNhdGVnb3J5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcmFibGUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrUHJvZHVjdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcmFibGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcmVkV29ya1Byb2R1Y3QiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJEZWxpdmVyYWJsZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVsaXZlcmFibGVEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYWNrYWdpbmdHdWlkYW5jZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBhY2thZ2luZ0d1aWRhbmNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3MiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBQcm9jZXNzIGRlc2NyaWJpbmcgYSBjb21wbGV0ZSBhbmQgaW50ZWdyYXRlZCBhcHByb2FjaCBmb3IgcGVyZm9ybWluZyBhIHNwZWNpZmljIHByb2plY3QgdHlwZS4gIEl0IGRlc2NyaWJlcyBhIGNvbXBsZXRlIHByb2plY3QgbGlmZWN5Y2xlIGVuZC10by1lbmQgYW5kIHNoYWxsIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgZm9yIHJ1bm5pbmcgcHJvamVjdHMgd2l0aCBzaW1pbGFyIGNoYXJhY3RlcmlzdGljcyBhcyBkZWZpbmVkIGZvciB0aGUgcHJvY2Vzcy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyByZWxhdGVkIHRvIHNwZWNpZmljIHN1cHBvcnRpbmcgaW5mb3JtYXRpb24gc3VjaCBhcyBSb2FkbWFwcyAoaW5oZXJpdGVkIHZpYSBBY3Rpdml0eSkgYXMgd2VsbCBhcyBDb21tdW5pY2F0aW9ucyBhbmQgRWR1Y2F0aW9uIE1hdGVyaWFsLiYjeEQ7JiN4QTtBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYSBQcm9jZXNzIHRoYXQgY292ZXJzIGEgd2hvbGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIGZyb20gYmVnaW5uaW5nIHRvIGVuZC4gIEEgRGVsaXZlcnkgUHJvY2VzcyBzaGFsbCBiZSB1c2VkIGFzIGEgdGVtcGxhdGUgZm9yIHBsYW5uaW5nIGFuZCBydW5uaW5nIGEgcHJvamVjdC4gIEl0IHByb3ZpZGVzIGEgY29tcGxldGUgbGlmZWN5Y2xlIG1vZGVsIHdpdGggcHJlZGVmaW5lZCBwaGFzZXMsIGl0ZXJhdGlvbnMsIGFuZCBhY3Rpdml0aWVzIHRoYXQgaGF2ZSBiZWVuIGRldGFpbGVkIGJ5IHNlcXVlbmNpbmcgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJdCBpcyBkZWZpbmVkIG9uIHRoZSBiYXNpcyBvZiBleHBlcmllbmNlIHdpdGggcGFzdCBwcm9qZWN0cyBvciBlbmdhZ2VtZW50cywgYW5kL29yIHRoZSBiZXN0IHByYWN0aWNlIHVzZSBvZiBhIGRldmVsb3BtZW50IG9yIGRlbGl2ZXJ5IGFwcHJvYWNoLiAgSXQgZGVmaW5lcyB3aGF0IGdldHMgcHJvZHVjZWQsIGhvdyB0aG9zZSBpdGVtcyBhcmUgcHJvZHVjZWQsIGFuZCB0aGUgcmVxdWlyZWQgc3RhZmZpbmcgaW4gdGhlIGZvcm0gb2YgaW50ZWdyYXRlZCBXb3JrLCBXb3JrIFByb2R1Y3QsIGFuZCBUZWFtIEJyZWFrZG93biBTdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGUsIGEgcHJvY2VzcyBlbmdpbmVlciBjYW4gZGVmaW5lIGFsdGVybmF0aXZlIERlbGl2ZXJ5IFByb2Nlc3NlcyBmb3Igc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdHMgdGhhdCBkaWZmZXIgaW4gdGhlIHNjYWxlIG9mIHRoZSBlbmdhZ2VtZW50IGFuZCBzdGFmZmluZyBuZWNlc3NhcnksIHRoZSB0eXBlIG9mIHRoZSBzb2Z0d2FyZSBhcHBsaWNhdGlvbiB0byBiZSBkZXZlbG9wZWQsIHRoZSBkZXZlbG9wbWVudCBtZXRob2RzIGFuZCB0ZWNobm9sb2dpZXMgdG8gYmUgdXNlZCwgZXRjLiAgQWx0aG91Z2gsIHRoZSBEZWxpdmVyeSBQcm9jZXNzIGFpbXMgdG8gY292ZXIgYSB3aG9sZSBwcm9qZWN0IGl0IGtlZXBzIGNlcnRhaW4gZGVjaXNpb24gdGhhdCBhcmUgdG9vIHByb2plY3Qgc3BlY2lmaWMgb3Blbi4gIEZvciBleGFtcGxlLCB0aGUgYnJlYWtkb3duIHN0cnVjdHVyZSBkZWZpbmVzIHdoaWNoIEJyZWFrZG93biBFbGVtZW50cyBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzIG9yIGlzIHJlcGVhdGFibGUgdmlhIGl0IHJlc3BlY3RpdmUgYXR0cmlidXRlcywgYnV0IGRvZXMgbm90IHNheSBob3cgbWFueSBvY2N1cnJlbmNlcyBhbmQgaG93IG1hbnkgcmVwZWF0cy9pdGVyYXRpb25zIGl0IHdpbGwgaGF2ZS4gIFRoZXNlIGRlY2lzaW9ucyBoYXZlIHRvIGJlIGRvbmUgYnkgYSBwcm9qZWN0IG1hbmFnZXIgd2hlbiBwbGFubmluZyBhIGNvbmNyZXRlIHByb2plY3QsIHByb2plY3QgcGhhc2UsIG9yIHByb2plY3QgaXRlcmF0aW9ucy4gIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhbHdheXMgYSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBvZiBhIHByb2Nlc3MgaW4gdGVybXMgb2YgY29tcGxldGVuZXNzIG9mIHRoZSBsaWZlY3ljbGUsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgYWxsIHRocmVlIHZpZXdzIG9uIHRoZSBwcm9jZXNzIHdoaWNoIGFyZSB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCBXb3JrIFByb2R1Y3QgQnJlYWtkb3duIFN0cnVjdHVyZSwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZSBoYXZlIHRvIGJlIGZ1bGx5IGFuZCBjb25zaXN0ZW50bHkgcG9wdWxhdGVkLiAgQ29uc2lzdGVuY3kgb2YgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFjdHVhbGx5IGVuc3VyZWQgYnkgdGhlIGZhY3QgdGhhdCBhbGwgdGhyZWUgYnJlYWtkb3ducyBhcmUgcmVwcmVzZW50ZWQgYnkgb25lIHNpbmdsZSBkYXRhIHN0cnVjdHVyZSBhbmQgb25lIHBhcnRpY3VsYXIgYnJlYWtkb3duIHN1Y2ggYXMgVGVhbSBCcmVha2Rvd24gaXMganVzdCBhIHZpZXcgb24gdGhhdCBkYXRhIHN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJ5UHJvY2VzcyIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXA0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6NDciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29tbXVuaWNhdGlvbnNNYXRlcmlhbCIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbW11bmljYXRpb25zTWF0ZXJpYWwiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlZHVjYXRpb25NYXRlcmlhbCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVkdWNhdGlvbk1hdGVyaWFsIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6NDciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzRGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2FsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjYWxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RDaGFyYWN0ZXJpc3RpY3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJpc2tMZXZlbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPdXRsaW5lcyB0eXBpY2FsIHByb2plY3Qgcmlza3MgdGhhdCBhcmUgYWRkcmVzc2VkIHdpdGggdGhpcyBwcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSaXNrTGV2ZWwiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGluZ1RlY2huaXF1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByb2plY3RNZW1iZXJFeHBlcnRpc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2plY3RNZW1iZXJFeHBlcnRpc2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZU9mQ29udHJhY3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iUHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlR5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRlc2NyaWJhYmxlRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4mI3hEOyYjeEE7VGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRlc2NyaWJhYmxlRWxlbWVudCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJlc2VudGF0aW9uIiBlVHlwZT0iIy8vQ29udGVudERlc2NyaXB0aW9uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByZXNlbnRhdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmdWxmaWxsIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRnVsZmlsbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0Fic3RyYWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc0Fic3RyYWN0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vZGVpY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBpbiB0cmVlIGJyb3dzZXIgcHJlc2VudGF0aW9ucyBhbmQgYnJlYWtkb3duIHN0cnVjdHVyZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibm9kZWljb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcGVpY29uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgcmVmZXJlbmNlIHRvIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgbW9kZWxpbmcgd2l0aCBzcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgaW5zdGFuY2VzIChhcyBncmFwaGljYWwgc3RlcmVvdHlwZXMsIGUuZy4gYSB1c2UgY2FzZSBzeW1ib2wgZm9yIGEgdXNlIGNhc2UgYXJ0aWZhY3QpIGFzIHdlbGwgYXMgcHVibGljYXRpb24gb2YgY29udGVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzaGFwZWljb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50cyB0aGF0IHJlZmVyZW5jZXMgb25lIGNvbmNyZXRlIENvbnRlbnQgRWxlbWVudC4gIEEgZGVzY3JpcHRvciBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29udGVudCBFbGVtZW50IHdpdGhpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEluIGFkZGl0aW9uIHRvIGp1c3QgcmVmZXJlbmNpbmcgQ29udGVudCBFbGVtZW50cyBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgQ29udGVudCBFbGVtZW50cyBzdHJ1Y3R1cmFsIHJlbGF0aW9uc2hpcHMgYnkgZGVmaW5pbmcgaXRzIG93biBzZXRzIG9mIGFzc29jaWF0aW9ucy4mI3hEOyYjeEE7RGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVzY3JpcHRvckRlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWZpbmVkRGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVmaW5lZERlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0ZWdvcml6YXRpb24gb2Ygd29yayAoaS5lLiBUYXNrcyBmb3IgTWV0aG9kIENvbnRlbnQpLCBiYXNlZCB1cG9uIHNpbWlsYXJpdHkgb2YgY29uY2VybnMgYW5kIGNvb3BlcmF0aW9uIG9mIHdvcmsgZWZmb3J0LiYjeEQ7JiN4QTtBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEaXNjaXBsaW5lIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXNrIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciIHZvbGF0aWxlPSJ0cnVlIgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YkRpc2NpcGxpbmUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRGlzY2lwbGluZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJEaXNjaXBsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlV29ya2Zsb3ciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZWZlcmVuY2VXb3JrZmxvdyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVXNlZCB0byBncm91cCBEaXNjaXBsaW5lcy4gIEZvciBleGFtcGxlLCB0aGUgRGlzY2lwbGluZSBHcm91cGluZyAmcXVvdDtTb2Z0d2FyZSBEaXNjaXBsaW5lcyZxdW90OyB3b3VsZCBiZSB0aGUgZ3JvdXAgb2YgYWxsIGRpc2NpcGxpbmVzIHJlbGF0ZWQgdG8gZGV2ZWxvcGluZyBzb2Z0d2FyZSBzdWNoIGFzICZxdW90O1JlcXVpcmVtZW50cyBNYW5hZ2VtZW50JnF1b3Q7IG9yICZxdW90O1Rlc3RpbmcmcXVvdDs7ICZxdW90O0lUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQmcXVvdDsgd291bGQgYmUgYSBEaXNjaXBsaW5lcyBHcm91cGluZyBmb3IgZGlzY2lwbGluZXMgc3VjaCBhcyAmcXVvdDtJVCBPcGVyYXRpb25hbCBTZXJ2aWNlcyZxdW90OywgJnF1b3Q7SVQgQ3VzdG9tZXIgUmVsYXRpb25zaGlwcyZxdW90Oywgb3IgJnF1b3Q7SVQgRW5hYmxpbmcgU2VydmljZXMmcXVvdDsuICBEaXNjaXBsaW5lcyBjYW4gYmUgYXNzb2NpYXRlZCB0byBtb3JlIHRoYW4gb25lIERpc2NpcGxpbmUgR3JvdXBpbmcuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEaXNjaXBsaW5lR3JvdXBpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NpcGxpbmUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEaXNjaXBsaW5lIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9jdW1lbnRSb290Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0ibWl4ZWQiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWl4ZWQiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50V2lsZGNhcmQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iOm1peGVkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InhNTE5TUHJlZml4TWFwIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InhtbG5zOnByZWZpeCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4U0lTY2hlbWFMb2NhdGlvbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VTdHJpbmdUb1N0cmluZ01hcEVudHJ5IgotICAgICAgICB0cmFuc2llbnQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ4c2k6c2NoZW1hTG9jYXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kQ29uZmlndXJhdGlvbiIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RDb25maWd1cmF0aW9uIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lc3BhY2UiIHZhbHVlPSIjI3RhcmdldE5hbWVzcGFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RMaWJyYXJ5IiB1cHBlckJvdW5kPSItMiIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZExpYnJhcnkiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kTGlicmFyeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWVzcGFjZSIgdmFsdWU9IiMjdGFyZ2V0TmFtZXNwYWNlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbiIgdXBwZXJCb3VuZD0iLTIiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZXNwYWNlIiB2YWx1ZT0iIyN0YXJnZXROYW1lc3BhY2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRG9tYWluIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHJlZmluZWFibGUgaGllcmFyY2h5IGdyb3VwaW5nIHJlbGF0ZWQgd29yayBwcm9kdWN0cy4gIEluIG90aGVyIHdvcmRzLCBEb21haW5zIGNhbiBiZSBmdXJ0aGVyIGRpdmlkZWQgaW50byBzdWItZG9tYWlucywgd2l0aCB3b3JrIHByb2R1Y3QgZWxlbWVudHMgdG8gYmUgY2F0ZWdvcml6ZWQgb25seSBhdCB0aGUgbGVhZi1sZXZlbCBvZiB0aGlzIGhpZXJhcmNoeS4mI3hEOyYjeEE7RG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkRvbWFpbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya1Byb2R1Y3QiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN1YmRvbWFpbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Eb21haW4iIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViZG9tYWluIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHByb3ZpZGVzIHNpemluZyBtZWFzdXJlcywgb3Igc3RhbmRhcmRzIGZvciBzaXppbmcgdGhlIHdvcmsgZWZmb3J0IGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgcGFydGljdWxhciBwaWVjZSBvZiB3b3JrIGFuZCBpbnN0cnVjdGlvbnMgZm9yIHRoZWlyIHN1Y2Nlc3NmdWwgdXNlLiBJdCBtYXkgYmUgY29tcHJpc2VkIG9mIGVzdGltYXRpb24gY29uc2lkZXJhdGlvbnMgYW5kIGVzdGltYXRpb24gbWV0cmljcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW9uTWV0cmljIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGlvbk1ldHJpYyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVzdGltYXRpbmdNZXRyaWMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgZGVzY3JpYmVzIGEgbWV0cmljIG9yIG1lYXN1cmUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCBhbmQgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHdvcmsgZWZmb3J0IGFzIHdlbGwgYXMgYSByYW5nZSBvZiBwb3RlbnRpYWwgbGFib3IuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW5nTWV0cmljIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcXVhbGlmaWVzIHRoZSB1c2FnZSBhbmQgYXBwbGljYXRpb24gb2YgZXN0aW1hdGlvbiBtZXRyaWNzIGluIHRoZSBkZXZlbG9wbWVudCBvZiBhbiBhY3R1YWwgZXN0aW1hdGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkV4YW1wbGUiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeGFtcGxlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ikd1aWRhbmNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIEd1aWRhbmNlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iR3VpZGFuY2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0YWNobWVudCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkF0dGFjaG1lbnQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iR3VpZGVsaW5lIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHdWlkZWxpbmUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ikl0ZXJhdGlvbiIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ0l0ZXJhdGlvbicpIGFuZCBpc1JlcGVhdGFibGUgKCdUcnVlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO0l0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSXRlcmF0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJLaW5kIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iS2luZCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RDb25maWd1cmF0aW9uIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kVW5pdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXNlQ29uZmlndXJhdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkJhc2VDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZFBsdWdpblNlbGVjdGlvbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRob2RQYWNrYWdlU2VsZWN0aW9uIgotICAgICAgICB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0VmlldyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdFZpZXciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvY2Vzc1ZpZXciIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzVmlldyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJ0cmFjdGVkQ2F0ZWdvcnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkZWRDYXRlZ29yeSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFkZGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZEVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwIiB1bmlxdWU9ImZhbHNlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvd25lZFJ1bGUiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vQ29uc3RyYWludCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlZmluZXMgdGhlIHBhY2thZ2luZyBydWxlcyBmb3IgdGhpcyBNZXRob2QgRWxlbWVudC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3duZWRSdWxlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RFbGVtZW50UHJvcGVydHkiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5IiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIgotICAgICAgICBkZXJpdmVkPSJ0cnVlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYnJpZWZEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBzaGFsbCBiZSBicmllZmx5IGRlc2NyaWJlZCB3aXRoIG9uZSBvciB0d28gc2VudGVuY2VzIHN1bW1hcml6aW5nIHRoZSBlbGVtZW50LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImJyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgaGFzIGEgZ2xvYmFsIHVuaXF1ZSBpZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlcmluZ0d1aWRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlVzZWQgZm9yIENBU0UgdG9vbCByZWFsaXphdGlvbnMgb2YgdGhpcyBtb2RlbCB0byBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxheW91dCBhbmQgb3JkZXJpbmcgb2YgdGhlIG1ldGhvZCBlbGVtZW50IGFuZCBpdHMgcGFydHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ib3JkZXJpbmdHdWlkZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVzZW50YXRpb25OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IERlc2NyaWJhYmxlIEVsZW1lbnQgaGFzIGEgcHJlc2VudGF0aW9uIG5hbWUsIHdoaWNoIGlzIHVzZWQgZm9yIGV4dGVybmFsIHByZXNlbnRhdGlvbiBvZiB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBuYW1lICh0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24pIG1pZ2h0IGJlIHNldCB0byAmcXVvdDtydXBfYXJjaGl0ZWN0dXJlX2RvY3VtZW50JnF1b3Q7IHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICZxdW90O2oyZWVfYXJjaGl0Y3R1cmVfZG9jdW1lbnQmcXVvdDsgd2hlcmVhcyB0aGUgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIHdvdWxkIGFsd2F5cyBiZSAmcXVvdDtBcmNoaXRlY3R1cmUgRG9jdW1lbnQmcXVvdDsuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icHJlc2VudGF0aW9uTmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBwcmVzc2VkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgJnF1b3Q7ZXh0ZW5kcyZxdW90OyBWYXJpYWJpbGl0eSBTcGVjaWFsaXphdGlvbiwgdGhlbiB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdXBwcmVzcyBpbmhlcml0ZWQgTWV0aG9kIEVsZW1lbnRzIHRoYXQgd2VyZSBwYXJ0IG9mIHRoZSBiYXNlZC1vbiBWYXJpYWJpbGl0eSBFbGVtZW50LCB3aGljaCBjYW4gYmUgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQuICBJbiBvdGhlciB3b3JkcywgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUgb24gYSBNZXRob2QgRWxlbWVudCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIHRoYW4gYW4gaW5oZXJpdGVkIG1ldGhvZCBlbGVtZW50IHRoZW4gaXQgd2lsbCBub3QgYmUgcmVnYXJkZWQgYXMgaW5oZXJpdGVkIGF0IGFsbC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJzdXBwcmVzc2VkIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIgZVN1cGVyVHlwZXM9IiMvL1BhY2thZ2VhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InZhbHVlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZExpYnJhcnkiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZExpYnJhcnkiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZFBsdWdpbiIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQbHVnaW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGx1Z2luIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1ldGhvZENvbmZpZ3VyYXRpb24iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vTWV0aG9kQ29uZmlndXJhdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2wiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIHRvb2wgdGhhdCBnZW5lcmF0ZWQgdGhlIFhNTCBmaWxlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InRvb2wiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTWV0aG9kUGFja2FnZSIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDEiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDo5Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJldXNlZFBhY2thZ2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXVzZWRQYWNrYWdlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6OSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtZXRob2RQYWNrYWdlIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL01ldGhvZFBhY2thZ2UiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWV0aG9kUGFja2FnZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2xvYmFsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdsb2JhbCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNZXRob2RQbHVnaW4iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RVbml0Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIFVuaXQgdGhhdCByZXByZXNlbnRzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGFja2FnZXMuICBJdCBkZWZpbmVzIGEgZ3JhbnVsYXJpdHkgbGV2ZWwgZm9yIHRoZSBtb2R1bGFyaXphdGlvbiBhbmQgb3JnYW5pemF0aW9uIG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIE1ldGhvZCBQbHVnaW4gY2FuIGV4dGVuZCBtYW55IG90aGVyIE1ldGhvZCBQbHVnaW5zIGFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgbWFueSBNZXRob2QgUGx1Z2lucy4gIEl0IGNhbiBhbHNvIGJlIHVzZWQgc3RhbmQtYWxvbmUsIGkuZS4gd2l0aCBubyBFeHRlbnNpb24gcmVsYXRpb25zaGlwIHRvIG90aGVyIHBsdWctaW5zLiYjeEQ7JiN4QTtNZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4mI3hEOyYjeEE7U3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBsdWdpbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlZE1ldGhvZFBsdWdpbiIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWV0aG9kUGFja2FnZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9NZXRob2RQYWNrYWdlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXNlckNoYW5nZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InVzZXJDaGFuZ2VhYmxlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik1ldGhvZFVuaXQiIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJNZXRob2RVbml0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3B5cmlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvcHlyaWdodCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdXRob3JzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJhdXRob3JzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNoYW5nZURhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNoYW5nZURhdGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImNoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZlcnNpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0idmVyc2lvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNaWxlc3RvbmUiIGVTdXBlclR5cGVzPSIjLy9Xb3JrQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iTWlsZXN0b25lIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXF1aXJlZFJlc3VsdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlcXVpcmVkUmVzdWx0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9Ik5hbWVkRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0VsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJOYW1lZEVsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVtcHR5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ibmFtZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJPdXRjb21lIiBlU3VwZXJUeXBlcz0iIy8vV29ya1Byb2R1Y3QiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgV29yayBQcm9kdWN0IHRoYXQgZGVzY3JpYmVzIGludGFuZ2libGUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBhIHJlc3VsdCBvciBzdGF0ZS4gT3V0Y29tZXMgbWF5IGFsc28gYmUgdXNlZCB0byBkZXNjcmliZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIG5vdCBmb3JtYWxseSBkZWZpbmVkLiAgQSBrZXkgZGlmZmVyZW50aWF0b3IgZm9yIG91dGNvbWVzIGFnYWluc3QgYXJ0aWZhY3RzIGlzIHRoYXQgb3V0Y29tZXMgYXJlIG5vdCBjYW5kaWRhdGVzIGZvciBoYXJ2ZXN0aW5nIGFzIHJldXNhYmxlIGFzc2V0cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik91dGNvbWUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBhY2thZ2VhYmxlRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL05hbWVkRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGFja2FnZWFibGVFbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbXB0eSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQaGFzZSIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuJiN4RDsmI3hBO1BoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGhhc2UiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBsYW5uaW5nRGF0YSIgZVN1cGVyVHlwZXM9IiMvL1Byb2Nlc3NFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4mI3hEOyYjeEE7UGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LiYjeEQ7JiN4QTsoTk9URSwgVEhFIEFUVFJJQlVURVMgRk9SIFRISVMgQ0xBU1MgQVJFIE5PVCBDT01QTEVURSwgWUVUKSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGxhbm5pbmdEYXRhIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmaW5pc2hEYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0RhdGVUaW1lIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZmluaXNoRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyYW5rIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0icmFuayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdGFydERhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vRGF0ZVRpbWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9InN0YXJ0RGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcmFjdGljZSIgZVN1cGVyVHlwZXM9IiMvL0d1aWRhbmNlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJvdmVuIHdheSBvciBzdHJhdGVneSBvZiBkb2luZyB3b3JrIHRvIGFjaGlldmUgYSBnb2FsIHRoYXQgaGFzIGEgcG9zaXRpdmUgaW1wYWN0IG9uIHdvcmsgcHJvZHVjdCBvciBwcm9jZXNzIHF1YWxpdHkuICBQcmFjdGljZXMgYXJlIGRlZmluZWQgb3J0aG9nb25hbCB0byBtZXRob2RzIGFuZCBwcm9jZXNzZXMuICBUaGV5IGNvdWxkIHN1bW1hcml6ZSBhc3BlY3RzIHRoYXQgaW1wYWN0IG1hbnkgZGlmZmVyZW50IHBhcnRzIG9mIGEgbWV0aG9kIG9yIHNwZWNpZmljIHByb2Nlc3Nlcy4gIEV4YW1wbGVzIGZvciBwcmFjdGljZXMgd291bGQgYmUgJnF1b3Q7TWFuYWdlIFJpc2tzJnF1b3Q7LCAmcXVvdDtDb250aW51b3VzbHkgdmVyaWZ5IHF1YWxpdHkmcXVvdDssICZxdW90O0FyY2hpdGVjdHVyZS1jZW50cmljIGFuZCBjb21wb25lbnQtYmFzZWQgZGV2ZWxvcG1lbnQmcXVvdDssIGV0Yy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByYWN0aWNlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eVJlZmVyZW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFjdGl2aXR5UmVmZXJlbmNlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udGVudFJlZmVyZW5jZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvbnRlbnRSZWZlcmVuY2UiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdWJQcmFjdGljZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9QcmFjdGljZSIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdWJQcmFjdGljZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByYWN0aWNlRGVzY3JpcHRpb24iIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RGVzY3JpcHRpb24iPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmFjdGljZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhZGRpdGlvbmFsSW5mbyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQWRkaXRpb25hbEluZm8iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXBwbGljYXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFwcGxpY2F0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhY2tncm91bmQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRWxhYm9yYXRpb24gb24gdGhlIGJhY2tncm91bmQgYW5kIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycyBhbmQgd2hlcmUgdGhlIHNvbHV0aW9uIGRlc2NyaWJlZCBieSB0aGlzIFByYWN0aWNlIHdpbGwgZml0IGluLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJCYWNrZ3JvdW5kIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImdvYWxzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJHb2FscyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZXZlbHNPZkFkb3B0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ik91dGxpbmVzIHRoZSBkaWZmZXJlbnQgZm9ybXMgb3IgdmFyaWFudHMgaW4gd2hpY2ggdGhlIHByYWN0aWNlIGNvdWxkIGJlIHJlYWxpemVkLiAoZS5nLiBmdWxsIGFkb3B0aW9uIHZlcnVzIGEgcGFydGlhbCBhZG9wdGlvbiBvZiB0aGUgUHJhY3RpY2UpIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkxldmVsc09mQWRvcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvYmxlbSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2JsZW0iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2VzcyIgZVN1cGVyVHlwZXM9IiMvL0FjdGl2aXR5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgQWN0aXZpdHkgdGhhdCBkZXNjcmliZXMgYSBzdHJ1Y3R1cmUgZm9yIHBhcnRpY3VsYXIgdHlwZXMgb2YgZGV2ZWxvcG1lbnQgcHJvamVjdHMuICBUbyBwZXJmb3JtIHN1Y2ggYSBkZXZlbG9wbWVudCBwcm9qZWN0IGEgUHJvY2Vzc2VzIHdvdWxkIGJlICdpbnN0YW50aWF0ZWQnIGFuZCBhZGFwdGVkIGZvciB0aGUgc3BlY2lmaWMgc2l0dWF0aW9uLiAgUHJvY2VzcyBpcyBhbiBhYnN0cmFjdCBjbGFzcyBhbmQgdGhpcyBtZXRhLW1vZGVsIGRlZmluZXMgZGlmZmVyZW50IHNwZWNpYWwgdHlwZXMgb2YgUHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgcHJvY2VzcyBtYW5hZ2VtZW50IGFwcGxpY2F0aW9ucyBhbmQgZGlmZmVyZW50IHNpdHVhdGlvbnMgb2YgcHJvY2VzcyByZXVzZS4gIEV2ZXJ5IFByb2Nlc3MgY29tcHJpc2VzIG9mIGFuZCBpcyB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgYW4gbi1sZXZlbCBicmVha2Rvd24gc3RydWN0dXJlIHVzaW5nIHRoZSBOZXN0aW5nIGFzc29jaWF0aW9uIGRlZmluZWQgb24gQWN0aXZpdHkuJiN4RDsmI3hBO0NvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3MiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImluY2x1ZGVzUGF0dGVybiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkluY2x1ZGVzUGF0dGVybiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0Q29udGV4dCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRGVmYXVsdENvbnRleHQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsaWRDb250ZXh0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFsaWRDb250ZXh0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpYWdyYW1VUkkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhlIFVSSSBvZiB0aGUgZGlhZ3JhbSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvY2Vzcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJkaWFncmFtVVJJIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiIGVTdXBlclR5cGVzPSIjLy9Qcm9jZXNzUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLiYjeEQ7JiN4QTtVTUEgc3VwcG9ydHMgcmVwbGFjZWFibGUgYW5kIHJldXNhYmxlIFByb2Nlc3MgQ29tcG9uZW50cyByZWFsaXppbmcgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gQ2VydGFpbiBzaXR1YXRpb25zIGluIGEgc29mdHdhcmUgZGV2ZWxvcG1lbnQgcHJvamVjdCBtaWdodCByZXF1aXJlIHRoYXQgY29uY3JldGUgcmVhbGl6YXRpb25zIG9mIHBhcnRzIG9mIHRoZSBwcm9jZXNzIHJlbWFpbiB1bmRlY2lkZWQgb3Igd2lsbCBiZSBkZWNpZGVkIGJ5IHRoZSBleGVjdXRpbmcgdGVhbSBpdHNlbGYgKGUuZy4gaW4gb3V0c291cmNpbmcgc2l0dWF0aW9ucykuICBVTUEgcHJvdmlkZXMgYSB1bmlxdWUgY29tcG9uZW50IGNvbmNlcHQgZGVmaW5pbmcgaW50ZXJmYWNlcyBmb3Igd29yayBwcm9kdWN0IGlucHV0IGFuZCBvdXRwdXQsIGFsbG93aW5nIHRyZWF0aW5nIHRoZSBhY3R1YWwgZGVmaW5pdGlvbiBvZiB0aGUgd29yayB0aGF0IHByb2R1Y2VzIHRoZSBvdXRwdXRzIGFzIGEgJnF1b3Q7YmxhY2sgYm94JnF1b3Q7LiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAmcXVvdDtyZWFsaXphdGlvbiZxdW90OyBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzQ29tcG9uZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3B5cmlnaHQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkNvcHlyaWdodCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnRlcmZhY2UiIGVUeXBlPSIjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iIy8vUHJvY2VzcyIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF1dGhvcnMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImF1dGhvcnMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2hhbmdlRGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9EYXRlVGltZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iY2hhbmdlRGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2ZXJzaW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UiIGVTdXBlclR5cGVzPSIjLy9CcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9UYXNrRGVzY3JpcHRvciIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIKLSAgICAgICAgZGVyaXZlZD0idHJ1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW50ZXJmYWNlSU8iIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIiB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkludGVyZmFjZUlPIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBnZW5lcmFsaXplZCBBY3Rpdml0eSBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJvY2Vzcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NEZXNjcmlwdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NvcGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIFByb2Nlc3MsIGkuZS4gd2hpY2ggdHlwZXMgb2YgcHJvamVjdHMgZG9lcyBpdCBhZGRyZXNzIGFuZCB3aGljaCBub3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlNjb3BlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InVzYWdlTm90ZXMiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVXNhZ2VOb3RlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQcm9jZXNzRWxlbWVudCIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBEZXNjcmliYWJsZSBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYWxsIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIFByb2Nlc3MgcGFja2FnZS4mI3hEOyYjeEE7UHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuICIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc0VsZW1lbnQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQYWNrYWdlIiBlU3VwZXJUeXBlcz0iIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4mI3hEOyYjeEE7QSBrZXkgc2VwYXJhdGlvbiBvZiBjb25jZXJucyBpbiBVTUEgaXMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MuICBUaGlzIHNlcGFyYXRpb24gaXMgZW5mb3JjZWQgYnkgc3BlY2lhbCBwYWNrYWdlIHR5cGVzLCB3aGljaCBkbyBub3QgYWxsb3cgdGhlIG1peGluZyBvZiBtZXRob2QgY29udGVudCB3aXRoIHByb2Nlc3Nlcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlByb2Nlc3NQYWNrYWdlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoxMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9jZXNzRWxlbWVudCIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Qcm9jZXNzRWxlbWVudCIgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcm9jZXNzRWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjEzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vUHJvY2VzcyI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuJiN4RDsmI3hBO0EgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZSByZXByZXNlbnRzIGEgcGFydGlhbGx5IGZpbmlzaGVkIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIEl0IHVzZXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gc3RydWN0dXJlcyBhcyBhbGwgb3RoZXIgUHJvY2VzcyBUeXBlcyB0byByZXByZXNlbnQgdGVtcGxhdGVzIGZvciBwcm9qZWN0IHBsYW5zLiAgSG93ZXZlciwgY2VydGFpbiBwbGFubmluZyBkZWNpc2lvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUgdGVtcGxhdGUgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZC9vciByZWZvcm1hdHRlZCB0byBiZSByZWFkeSBmb3IgZXhwb3J0IHRvIGEgc3BlY2lmaWMgcGxhbm5pbmcgdG9vbC4gIEV4YW1wbGVzIGZvciBzdWNoIGRlY2lzaW9ucyBhcmU6IGEgdGVtcGxhdGUgaGFzIGJlZW4gY3JlYXRlZCB0byByZXByZXNlbnQgYSBwbGFuIGZvciBhIHBhcnRpY3VsYXIgSXRlcmF0aW9uIGluIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBwcm9qZWN0LCB3aGljaCBmciBleGFtcGxlIGRpc3Rpbmd1aXNoZXMgZWFybHkgZnJvbSBsYXRlIGl0ZXJhdGlvbnMgaW4gdGhlIEVsYWJvcmF0aW9uIHBoYXNlIG9mIGEgcHJvamVjdDsgaWYgdGhlIHRhcmdldGVkIHBsYW5uaW5nIHRvb2wgY2Fubm90IHJlcHJlc2VudCBpbnB1dCBhbmQgb3V0cHV0IG9mIFRhc2ssIHRoZW4gdGhlc2UgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RydWN0dXJlOyBjZXJ0YWluIHJlcGV0aXRpb25zIGhhdmUgYmVlbiBhbHJlYWR5IGFwcGxpZWQsIGUuZy4gc3RhdGluZyB0aGF0IGEgY3ljbGUgb2Ygc3BlY2lmaWMgVGFzayBncm91cGVkIGluIGFuIEFjdGl2aXR5IGhhdmUgdG8gYmUgcmVwZWF0ZWQgbi10aW1lczsgZXRjLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwNCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjQ3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImJhc2VQcm9jZXNzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQmFzZVByb2Nlc3MiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDo0NyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXBvcnQiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVwb3J0Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSZXVzYWJsZUFzc2V0IiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGEgc29sdXRpb24gdG8gYSBwcm9ibGVtIGZvciBhIGdpdmVuIGNvbnRleHQuIFRoZSBhc3NldCBtYXkgaGF2ZSBhIHZhcmlhYmlsaXR5IHBvaW50LCB3aGljaCBpcyBhIGxvY2F0aW9uIGluIHRoZSBhc3NldCB0aGF0IG1heSBoYXZlIGEgdmFsdWUgcHJvdmlkZWQgb3IgY3VzdG9taXplZCBieSB0aGUgYXNzZXQgY29uc3VtZXIuIFRoZSBhc3NldCBoYXMgcnVsZXMgZm9yIHVzYWdlIHdoaWNoIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGRlc2NyaWJpbmcmI3hEOyYjeEE7aG93IHRoZSBhc3NldCBzaG91bGQgYmUgdXNlZC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJldXNhYmxlQXNzZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvYWRtYXAiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHdoaWNoIGlzIG9ubHkgcmVsYXRlZCB0byBBY3RpdmF0ZXMgYW5kIHRoZXJlZm9yZSBoYXMgYmVlbiBhZGRlZCBieSB0aGlzIHBhY2thZ2UgdG8gdGhlIGxpc3Qgb2YgR3VpZGFuY2UgVHlwZXMgcmF0aGVyIHRoYW4gbGlzdGVkIGluIHRoZSBHdWlkYW5jZSBUeXBlcyBwYWNrYWdlLiAgQSBSb2FkbWFwIHJlcHJlc2VudHMgYSBsaW5lYXIgd2Fsa3Rocm91Z2ggb2YgYW4gQWN0aXZpdHksIHR5cGljYWxseSBhIFByb2Nlc3MuJiN4RDsmI3hBO0FuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvYWRtYXAiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlJvbGUiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgUm9sZXMgYXJlIHVzZWQgYnkgVGFza3MgdG8gZGVmaW5lIHdobyBwZXJmb3JtcyB0aGVtIGFzIHdlbGwgYXMgZGVmaW5lIGEgc2V0IG9mIHdvcmsgcHJvZHVjdHMgdGhleSBhcmUgcmVzcG9uc2libGUgZm9yLiAgJiN4RDsmI3hBO0EgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZUZvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlRm9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZURlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFJvbGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lnbm1lbnRBcHByb2FjaGVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iQXNzaWdubWVudEFwcHJvYWNoZXMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2tpbGxzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2tpbGxzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN5bm9ueW1zIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9Ikxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTeW5vbnltcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL0Rlc2NyaXB0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUm9sZURlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzcG9uc2libGVGb3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXNwb25zaWJsZUZvciIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJSb2xlU2V0IiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJPcmdhbml6ZXMgUm9sZXMgaW50byBjYXRlZ29yaWVzLiAgSXQgaXMgdXNlZCB0byBncm91cCByb2xlcyB0b2dldGhlciB0aGF0IGhhdmUgY2VydGFpbiBjb21tb25hbGl0aWVzLiAgRm9yIGV4YW1wbGUsIHRoZSAmcXVvdDtBbmFseXN0cyZxdW90OyBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgJnF1b3Q7QnVzaW5lc3MgUHJvY2VzcyBBbmFseXN0JnF1b3Q7LCAmcXVvdDtTeXN0ZW0gQW5hbHlzdCZxdW90OywgYXMgd2VsbCBhcyAmcXVvdDtSZXF1aXJlbWVudHMgU3BlY2lmaWVyJnF1b3Q7IHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGVTZXQiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGUiIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIgdm9sYXRpbGU9InRydWUiCi0gICAgICAgIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUm9sZVNldEdyb3VwaW5nIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudENhdGVnb3J5Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0R3JvdXBpbmciLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJvbGVTZXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSb2xlU2V0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU2VjdGlvbiIgZVN1cGVyVHlwZXM9IiMvL01ldGhvZEVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lhbCBNZXRob2QgRWxlbWVudCB0aGF0IHJlcHJlc2VudHMgc3RydWN0dXJhbCBzdWJzZWN0aW9ucyBvZiBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBzZWN0aW9uRGVzY3JpcHRpb24gYXR0cmlidXRlLiAgSXQgaXMgdXNlZCBmb3IgZWl0aGVyIGxhcmdlIHNjYWxlIGRvY3VtZW50YXRpb24gb2YgQ29udGVudCBFbGVtZW50cyBvcmdhbml6ZWQgaW50byBzZWN0aW9ucyBhcyB3ZWxsIGFzIHRvIGZsZXhpYmx5IGFkZCBuZXcgU2VjdGlvbnMgdG8gQ29udGVudCBFbGVtZW50cyB1c2luZyBjb250cmlidXRpb24gdmFyaWFiaWxpdHkgYWRkZWQgdG8gdGhlIFNlY3Rpb24gY29uY2VwdCBmb3IgTWV0aG9kIFBsdWctaW5zLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU2VjdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3ViU2VjdGlvbiIgZVR5cGU9IiMvL1NlY3Rpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViU2VjdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcmVkZWNlc3NvciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3IiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iVGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZXNjcmlwdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWN0aW9uTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJFdmVyeSBTZWN0aW9uIGhhcyBhIG5hbWUgdXNlZCBmb3IgZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBzZWN0aW9uLCBlLmcuIHdoZW4gcHVibGlzaGVkIG9yIHdoZW4gc2VjdGlvbiBoZWFkaW5nIGFyZSBsaXN0ZWQgaW4gYSB0YWJsZSBvZiBjb250ZW50cy4gIFRoaXMgYXR0cmlidXRlIGlzIHNpbWlsYXIgdG8gUHJlc2VudGF0aW9uIE5hbWUgZm9yIENvbnRlbnQgRWxlbWVudHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJhdHRyaWJ1dGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0ic2VjdGlvbk5hbWUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgZVR5cGU9IiMvL1ZhcmlhYmlsaXR5VHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0ibmEiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJ2YXJpYWJpbGl0eVR5cGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFzayIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLiYjeEQ7JiN4QTtBIFRhc2sgZGVzY3JpYmVzIGFuIGFzc2lnbmFibGUgdW5pdCBvZiB3b3JrLiAgRXZlcnkgVGFzayBpcyBhc3NpZ25lZCB0byBzcGVjaWZpYyBSb2xlcy4gIFRoZSBncmFudWxhcml0eSBvZiBhIFRhc2sgaXMgZ2VuZXJhbGx5IGEgZmV3IGhvdXJzIHRvIGEgZmV3IGRheXMuICBJdCB1c3VhbGx5IGFmZmVjdHMgb25lIG9yIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygd29yayBwcm9kdWN0cy4gQSBUYXNrIGlzIHVzZWQgYXMgYW4gZWxlbWVudCBvZiBkZWZpbmluZyBhIHByb2Nlc3MuIFRhc2tzIGFyZSBmdXJ0aGVyIHVzZWQgZm9yIHBsYW5uaW5nIGFuZCB0cmFja2luZyBwcm9ncmVzczsgdGhlcmVmb3JlLCBpZiB0aGV5IGFyZSBkZWZpbmVkIHRvbyBmaW5lLWdyYWluZWQsIHRoZXkgd2lsbCBiZSBuZWdsZWN0ZWQsIGFuZCBpZiB0aGV5IGFyZSB0b28gbGFyZ2UsIHByb2dyZXNzIHdvdWxkIGhhdmUgdG8gYmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGEgVGFzaydzIHBhcnRzIChlLmcuIFN0ZXBzLCB3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLiAmI3hEOyYjeEE7QSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gJiN4RDsmI3hBO0ZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAmcXVvdDtEZXZlbG9wIFVzZSBDYXNlIE1vZGVsJnF1b3Q7IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgJnF1b3Q7bWV0aG9kJnF1b3Q7IG9mIERldmVsb3BpbmcgYSBVc2UgQ2FzZSBNb2RlbC4gIEFwcGx5aW5nIHN1Y2ggYSBtZXRob2QgaW4gYSBsaWZlY3ljbGUgKGkuZS4gaW4gYSBwcm9jZXNzKSBpcyBkZWZpbmluZyB3aGljaCBzdGVwcyBhcmUgZG9uZSB3aGVuIGdvaW5nIGZyb20gb25lIGl0ZXJhdGlvbiB0byB0aGUgbmV4dC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlY29uZGl0aW9uIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBvc3Rjb25kaXRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlBvc3Rjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icGVyZm9ybWVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQZXJmb3JtZWRCeSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3V0cHV0IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0cHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9wdGlvbmFsSW5wdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPcHRpb25hbElucHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXN0aW1hdGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRvb2xNZW50b3IiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sTWVudG9yIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iVGFza0Rlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrRGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsdGVybmF0aXZlcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJDb21wcmlzZXMgb2Ygc3VtbWFyaWVzIGRlc2NyaWJpbmcgaW1wb3J0YW50IGV4Y2VwdGlvbmFsIGFuZCBub24tc3RhbmRhcmQgd2F5cyBvZiBhY2hpZXZpbmcgdGhpcyBUYXNrJ3MgZGV2ZWxvcG1lbnQgZ29hbHMgdGhhdCB3ZXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBUYXNrJ3MgU3RlcHMuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkFsdGVybmF0aXZlcyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwdXJwb3NlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUYXNrRGVzY3JpcHRvciIgZVN1cGVyVHlwZXM9IiMvL1dvcmtCcmVha2Rvd25FbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLiYjeEQ7JiN4QTtBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4mI3hEOyYjeEE7Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUYXNrRGVzY3JpcHRvciIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFzayIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwZXJmb3JtZWRQcmltYXJpbHlCeSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUGVyZm9ybWVkUHJpbWFyaWx5QnkiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjM3Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFzc2lzdGVkQnkiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJBc3Npc3RlZEJ5Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXh0ZXJuYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkV4dGVybmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYW5kYXRvcnlJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmRhdG9yeUlucHV0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWxJbnB1dCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik9wdGlvbmFsSW5wdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPdXRwdXQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozNyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzdGVwIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL1NlY3Rpb24iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3RlcCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIKLSAgICAgICAgdW5zZXR0YWJsZT0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJUZWFtUHJvZmlsZSIgZVN1cGVyVHlwZXM9IiMvL0JyZWFrZG93bkVsZW1lbnQiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4mI3hEOyYjeEE7V29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLiYjeEQ7JiN4QTtIZW5jZSwgaW4gYWRkaXRpb24gdG8gdGhlIHdvcmsgYnJlYWtkb3duIGFuZCB3b3JrIHByb2R1Y3QgYnJlYWtkb3duIHN0cnVjdHVyZXMgZGVmaW5lZCBzbyBmYXIsIFRlYW0gUHJvZmlsZXMgYXJlIHVzZWQgdG8gZGVmaW5lIGEgdGhpcmQgdHlwZSBvZiBicmVha2Rvd24gc3RydWN0dXJlOiB0ZWFtIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVGhlc2UgYXJlIGNyZWF0ZWQgYXMgYW4gQWN0aXZpdHkgc3BlY2lmaWMgaGllcmFyY2h5IG9mIFRlYW0gUHJvZmlsZXMgY29tcHJpc2luZyBvZiBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFRoZXNlIHN0cnVjdHVyZXMgY2FuIGJlIHByZXNlbnRlZCBhcyB3ZWxsLWtub3duIE9yZy1DaGFydHMuICBKdXN0IGFzIHdpdGggYW55IG90aGVyIEJyZWFrZG93biBFbGVtZW50IGFuZCBEZXNjcmlwdG9ycywgVGVhbSBQcm9maWxlcyBjYW4gYmUgZGVmaW5lZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFueSBBY3Rpdml0eSBpbiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJbiBvdGhlciB3b3JkcyBldmVyeSBBY3Rpdml0eSBjYW4gZGVmaW5lIGl0cyBvd24gVGVhbSBQcm9maWxlcyBjb25zaXN0aW5nIG9mIEFjdGl2aXR5IHNwZWNpZmljIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVHlwaWNhbGx5LCBUZWFtIFByb2ZpbGVzIGFyZSBkZWZpbmVkIG9uIHRoZSBsZXZlbCBvZiBJdGVyYXRpb25zIG9yIFBoYXNlcyBvciBvdGhlciBoaWdoZXItbGV2ZWwgQWN0aXZpdHkuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUZWFtUHJvZmlsZSIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ3JvdXAyIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRUZlYXR1cmVNYXBFbnRyeSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZ3JvdXAiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iZ3JvdXA6MzAiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icm9sZSIgdW5pcXVlPSJmYWxzZSIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIiB2b2xhdGlsZT0idHJ1ZSIKLSAgICAgICAgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJvbGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdXBlclRlYW0iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJTdXBlclRlYW0iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdWJUZWFtIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iU3ViVGVhbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMwIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlbXBsYXRlIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGZvciBhIHdvcmsgcHJvZHVjdCBhIHByZS1kZWZpbmVkIHRhYmxlIG9mIGNvbnRlbnRzLCBzZWN0aW9ucywgcGFja2FnZXMsIGFuZC9vciBoZWFkaW5ncywgYSBzdGFuZGFyZGl6ZWQgZm9ybWF0LCBhcyB3ZWxsIGFzIGRlc2NyaXB0aW9ucyBob3cgdGhlIHNlY3Rpb25zIGFuZCBwYWNrYWdlcyBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBhbmQgY29tcGxldGVkLiBUZW1wbGF0ZXMgY2Fubm90IG9ubHkgYmUgcHJvdmlkZWQgZm9yIGRvY3VtZW50cywgYnV0IGFsc28gZm9yIGNvbmNlcHR1YWwgbW9kZWxzIG9yIHBoeXNpY2FsIGRhdGEgc3RvcmVzLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGVtcGxhdGUiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRlcm1EZWZpbml0aW9uIiBlU3VwZXJUeXBlcz0iIy8vR3VpZGFuY2UiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IGRlZmluZXMgY29uY2VwdHMgYW5kIGFyZSB1c2VkIHRvIGJ1aWxkIHVwIHRoZSBHbG9zc2FyeS4gVGVybURlZmluaXRpb25zIGFyZSBub3QgZGlyZWN0bHkgcmVsYXRlZCB0byBDb250ZW50RWxlbWVudHMsIGJ1dCB0aGVpciByZWxhdGlvbnNoaXAgaXMgYmVpbmcgZGVyaXZlZCB3aGVuIHRoZSBUZXJtIGlzIHVzZWQgaW4gdGhlIENvbnRlbnRFbGVtZW50cyBkZXNjcmlwdGlvbiB0ZXh0LiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVGVybURlZmluaXRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2wiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50Q2F0ZWdvcnkiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJUb29sIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0b29sTWVudG9yIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVG9vbE1lbnRvciIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlRvb2xNZW50b3IiIGVTdXBlclR5cGVzPSIjLy9HdWlkYW5jZSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSAgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHNob3dzIGhvdyB0byB1c2UgYSBzcGVjaWZpYyB0b29sIHRvIGFjY29tcGxpc2ggc29tZSBwaWVjZSBvZiB3b3JrIGEgV29yayBQcm9kdWN0IGVpdGhlciBpbiB0aGUgY29udGV4dCBvZiBvciBpbmRlcGVuZGVudCBmcm9tIGEgVGFzayBvciBBY3Rpdml0eS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBFbnVtZXJhdGlvbiB1c2VkIGZvciB2YWx1ZXMgZm9yIGluc3RhbmNlcyBvZiBWYXJpYWJpbGl0eSBFbGVtZW50J3MgYXR0cmlidXRlIHZhcmlhYmlsaXR5VHlwZS4gIEl0IGRlZmluZXMgdGhlIG5hdHVyZSBvZiBob3cgYSBWYXJpYWJpbGl0eSBFbGVtZW50IGV4dGVuZHMgYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50LiBTZWUgZW51bWVyYXRpb24gbGl0ZXJhbHMgZm9yIGRlZmluaXRpb25zIGZvciBlYWNoIHR5cGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJWYXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Im5hIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJjb250cmlidXRlcyIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJyZXBsYWNlcyIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImxvY2FsQ29udHJpYnV0aW9uIiB2YWx1ZT0iNCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0ibG9jYWxSZXBsYWNlbWVudCIgdmFsdWU9IjUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIgdmFsdWU9IjYiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVEYXRhVHlwZSIgbmFtZT0iVmFyaWFiaWxpdHlUeXBlT2JqZWN0IiBpbnN0YW5jZUNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3IiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iVmFyaWFiaWxpdHlUeXBlOk9iamVjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9IlZhcmlhYmlsaXR5VHlwZSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXaGl0ZXBhcGVyIiBlU3VwZXJUeXBlcz0iIy8vQ29uY2VwdCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldoaXRlcGFwZXIiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtCcmVha2Rvd25FbGVtZW50IiBlU3VwZXJUeXBlcz0iIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtCcmVha2Rvd25FbGVtZW50Ii8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVkZWNlc3NvciIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9Xb3JrT3JkZXIiIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiIGNvbnRhaW5tZW50PSJ0cnVlIgotICAgICAgICByZXNvbHZlUHJveGllcz0iZmFsc2UiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHJlZGVjZXNzb3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpc0V2ZW50RHJpdmVuIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuJiN4RDsmI3hBOyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImlzRXZlbnREcml2ZW4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNPbmdvaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJJZiB0aGUgaXNPbmdvaW5nIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBpbnN0YW5jZSwgdGhlbiB0aGUgZWxlbWVudCBkZXNjcmliZXMgYW4gb25nb2luZyBwaWVjZSBvZiB3b3JrIHdpdGhvdXQgYSBmaXhlZCBkdXJhdGlvbiBvciBlbmQgc3RhdGUuICBGb3IgZXhhbXBsZSwgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGNvdWxkIHJlcHJlc2VudCB3b3JrIG9mIGFuIGFkbWluaXN0cmF0b3IgY29udGludW91c2x5IChlLmcuIDNoIGEgZGF5KSB3b3JraW5nIHRvIGVuc3VyZSB0aGF0IHN5c3RlbXMgYXJlIGtlcHQgaW4gYSBjZXJ0YWluIHN0YXRlLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIHByb2dyYW0gbWFuYWdlbWVudCB3b3JrIG92ZXJzZWVpbmcgbWFueSBkaWZmZXJlbnQgcHJvamVjdHMgYmVpbmcgc2NoZWR1bGVkIGZvciBvbmUgcGFydGljdWxhciBwcm9qZWN0IGF0IHNwZWNpZmljIHJlb2NjdXJyaW5nIGludGVydmFscyBkdXJpbmcgdGhlIHdob2xlIGxpZmVjeWNsZSBvZiB0aGUgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc09uZ29pbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaXNSZXBlYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iCi0gICAgICAgIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpc1JlcGVhdGFibGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya0RlZmluaXRpb24iIGVTdXBlclR5cGVzPSIjLy9NZXRob2RFbGVtZW50Ij4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLiYjeEQ7JiN4QTtXb3JrIERlZmluaXRpb25zIHJlcHJlc2VudCBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBmb3IgZG9pbmcgd29yay4gIFRoZXNlIGJlaGF2aW9yYWwgZGVzY3JpcHRpb25zIGFyZSBub3QgYm91bmQgdG8gb25lIHNwZWNpZmljIGNsYXNzaWZpZXIsIGJ1dCByZXByZXNlbnQgYW4gYXJiaXRyYXJ5IGRlZmluaXRpb24gb2Ygd29yay4gIEZvciBleGFtcGxlLCBhIFdvcmsgRGVmaW5pdGlvbiBjb3VsZCByZXByZXNlbnQgd29yayB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZCBieSBhIHNwZWNpZmljIFJvbGUgKGUuZy4gYSBSb2xlIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBUYXNrIG9yIFN0ZXBzIG9mIGEgVGFzayksIGJ5IG1hbnkgUm9sZXMgd29ya2luZyBpbiBjbG9zZSBjb2xsYWJvcmF0aW9uIChtYW55IFJvbGVzIGFsbCB3b3JraW5nIHRvZ2V0aGVyIG9uIHRoZSBzYW1lIGludGVyZGlzY2lwbGluYXJ5IFRhc2spLCBvciBjb21wbGV4IHdvcmsgdGhhdCBpcyBwZXJmb3JtZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIChlLmcuIGEgcHJvY2VzcyBkZWZpbmluZyBhIGJyZWFrZG93biBzdHJ1Y3R1cmUgZm9yIG9yZ2FuaXppbmcgbGFyZ2VyIGNvbXBvc2l0ZSB1bml0cyBvZiB3b3JrIHBlcmZvcm1lZCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY29sbGFib3JhdGlvbikuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrRGVmaW5pdGlvbiIvPgotICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudE9ubHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJlY29uZGl0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJQcmVjb25kaXRpb24iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icG9zdGNvbmRpdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUG9zdGNvbmRpdGlvbiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrT3JkZXIiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnRzIGluIHdoaWNoIG9uZSBCcmVha2Rvd24gRWxlbWVudHMgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnRzIGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gICYjeEQ7JiN4QTtUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya09yZGVyIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSI6MCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJzaW1wbGUiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJpZCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsaW5rVHlwZSIgZVR5cGU9IiMvL1dvcmtPcmRlclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9ImZpbmlzaFRvU3RhcnQiIHVuc2V0dGFibGU9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImF0dHJpYnV0ZSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJsaW5rVHlwZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IldvcmtPcmRlclR5cGUiPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXJUeXBlIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb1N0YXJ0Ii8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJmaW5pc2hUb0ZpbmlzaCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9TdGFydCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9InN0YXJ0VG9GaW5pc2giIHZhbHVlPSIzIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRGF0YVR5cGUiIG5hbWU9IldvcmtPcmRlclR5cGVPYmplY3QiIGluc3RhbmNlQ2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrT3JkZXJUeXBlOk9iamVjdCIvPgotICAgICAgPGRldGFpbHMga2V5PSJiYXNlVHlwZSIgdmFsdWU9IldvcmtPcmRlclR5cGUiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3QiIGVTdXBlclR5cGVzPSIjLy9Db250ZW50RWxlbWVudCI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuJiN4RDsmI3hBO0Egd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3QiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imdyb3VwMiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSMvL0VGZWF0dXJlTWFwRW50cnkiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9Imdyb3VwIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Imdyb3VwOjI0Ii8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVzdGltYXRlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iRXN0aW1hdGUiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXBvcnQiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJSZXBvcnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0ZW1wbGF0ZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRlbXBsYXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idG9vbE1lbnRvciIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlRvb2xNZW50b3IiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQ29udGVudERlc2NyaXB0aW9uIj4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJBIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFdvcmsgUHJvZHVjdC4iLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdE9mTm90SGF2aW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkRlc2NyaWJlcyB0aGUgY29uc2VxdWVuY2VzIG9mIG5vdCBwcm9kdWNpbmcgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3JpbmcgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IkltcGFjdE9mTm90SGF2aW5nIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InB1cnBvc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iRGVzY3JpYmVzIHdoeSB0aGUgd29yayBwcm9kdWN0IGlzIHByb2R1Y2VkIGFuZCB0byB3aGF0IHVzZSBpdCB3aWxsIGJlIHB1dC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUHVycG9zZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZWFzb25zRm9yTm90TmVlZGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4iLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iUmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIiBlU3VwZXJUeXBlcz0iIy8vRGVzY3JpcHRvciI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzcGVjaWFsIERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnRzIGEgV29yayBQcm9kdWN0IGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgV29yayBQcm9kdWN0IGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuIi8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdERlc2NyaXB0b3IiLz4KLSAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnRPbmx5Ii8+Ci0gICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9IndvcmtQcm9kdWN0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJXb3JrUHJvZHVjdCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXNwb25zaWJsZVJvbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IlJlc3BvbnNpYmxlUm9sZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHRlcm5hbElucHV0VG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJFeHRlcm5hbElucHV0VG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbXBhY3RlZEJ5IiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iSW1wYWN0ZWRCeSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImltcGFjdHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJJbXBhY3RzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFuZGF0b3J5SW5wdXRUbyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9Ik1hbmRhdG9yeUlucHV0VG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbElucHV0VG8iIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJPcHRpb25hbElucHV0VG8iLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJncm91cCIgdmFsdWU9IiNncm91cDozMyIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvdXRwdXRGcm9tIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciCi0gICAgICAgIHZvbGF0aWxlPSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIGRlcml2ZWQ9InRydWUiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ia2luZCIgdmFsdWU9ImVsZW1lbnQiLz4KLSAgICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iT3V0cHV0RnJvbSIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Imdyb3VwIiB2YWx1ZT0iI2dyb3VwOjMzIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlbGl2ZXJhYmxlUGFydHMiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIKLSAgICAgICAgdm9sYXRpbGU9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iZWxlbWVudCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJEZWxpdmVyYWJsZVBhcnRzIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MzMiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWN0aXZpdHlFbnRyeVN0YXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyI+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCI+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZG9jdW1lbnRhdGlvbiIgdmFsdWU9IkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRW50cnkgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgaW5pdGlhdGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBpcyBiZWluZyBpbml0aWF0ZWQgdGhhdCB1c2UgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBpbnB1dCkuICAmI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImFjdGl2aXR5RW50cnlTdGF0ZSIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY3Rpdml0eUV4aXRTdGF0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImRvY3VtZW50YXRpb24iIHZhbHVlPSJHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEV4aXN0IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGZpbmlzaGVkIChpLmUuIHdvcmsgb24gdGhlIEFjdGl2aXR5J3MgVGFzayBEZXNjcmlwdG9ycyBoYXMgZmluaXNoZWQgdGhhdCBoYXZlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgb3V0cHV0KS4mI3hEOyYjeEE7Rm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLiIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgICA8ZUFubm90YXRpb25zIHNvdXJjZT0iaHR0cDovLy9vcmcvZWNsaXBzZS9lbWYvZWNvcmUvdXRpbC9FeHRlbmRlZE1ldGFEYXRhIj4KLSAgICAgICAgPGRldGFpbHMga2V5PSJraW5kIiB2YWx1ZT0iYXR0cmlidXRlIi8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9ImFjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L2VTdHJ1Y3R1cmFsRmVhdHVyZXM+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IldvcmtQcm9kdWN0VHlwZSIgZVN1cGVyVHlwZXM9IiMvL0NvbnRlbnRDYXRlZ29yeSI+Ci0gICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiPgotICAgICAgPGRldGFpbHMga2V5PSJkb2N1bWVudGF0aW9uIiB2YWx1ZT0iQSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICZxdW90O0NsYXNzIERpYWdyYW0mcXVvdDssIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7LCB3aGljaCBjYXRlZ29yaXplcyByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbnMgdGhhdCBkZWZpbmUgYSBzeXN0ZW0gd2l0aCBhIHdlbGwtZGVmaW5lZCBzeXN0ZW0gYm91bmRhcnksIHN1Y2ggYXMgdXNlIGNhc2Ugb3IgZnVuY3Rpb25hbCByZXF1aXJlbWVudHMgc3BlY2lmaWNhdGlvbi4gIEEgV29yayBQcm9kdWN0IGNhbiBiZSBjYXRlZ29yaXplZCB0byBiZSBvZiBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEZvciBleGFtcGxlLCBhIHVzZSBjYXNlIG1vZGVsIGNhbiBiZSBjYXRlZ29yaXplZCBhcyBhIFNwZWNpZmljYXRpb24gYXMgd2VsbCBhcyBEaWFncmFtIFdvcmsgUHJvZHVjdCBUeXBlLiIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgPGRldGFpbHMga2V5PSJuYW1lIiB2YWx1ZT0iV29ya1Byb2R1Y3RUeXBlIi8+Ci0gICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50T25seSIvPgotICAgIDwvZUFubm90YXRpb25zPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJncm91cDIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUjLy9FRmVhdHVyZU1hcEVudHJ5Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJncm91cCIvPgotICAgICAgICA8ZGV0YWlscyBrZXk9Im5hbWUiIHZhbHVlPSJncm91cDoyNCIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9lU3RydWN0dXJhbEZlYXR1cmVzPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ3b3JrUHJvZHVjdCIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIgotICAgICAgICB2b2xhdGlsZT0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIj4KLSAgICAgIDxlQW5ub3RhdGlvbnMgc291cmNlPSJodHRwOi8vL29yZy9lY2xpcHNlL2VtZi9lY29yZS91dGlsL0V4dGVuZGVkTWV0YURhdGEiPgotICAgICAgICA8ZGV0YWlscyBrZXk9ImtpbmQiIHZhbHVlPSJlbGVtZW50Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0ibmFtZSIgdmFsdWU9IldvcmtQcm9kdWN0Ii8+Ci0gICAgICAgIDxkZXRhaWxzIGtleT0iZ3JvdXAiIHZhbHVlPSIjZ3JvdXA6MjQiLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvZVN0cnVjdHVyYWxGZWF0dXJlcz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci08L2Vjb3JlOkVQYWNrYWdlPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5nZW5tb2RlbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9tb2RlbC9VTUEuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWZlMmYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS5nZW5tb2RlbAorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGdlbm1vZGVsOkdlbk1vZGVsIHhtaTp2ZXJzaW9uPSIyLjAiCi0gICAgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIKLSAgICB4bWxuczpnZW5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9HZW5Nb2RlbCIgbW9kZWxEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMiCi0gICAgZWRpdERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXQvc3JjIiBlZGl0b3JEaXJlY3Rvcnk9Ii9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5lZGl0b3Ivc3JjIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hIiB0ZW1wbGF0ZURpcmVjdG9yeT0iIiBtb2RlbE5hbWU9IlVNQSIgZWRpdFBsdWdpbkNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5lZGl0LlVNQUVkaXRQbHVnaW4iCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmVkaXRvci5VTUFFZGl0b3JQbHVnaW4iIHJvb3RFeHRlbmRzSW50ZXJmYWNlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0IgotICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGwiIHJvb3RJbXBsZW1lbnRzSW50ZXJmYWNlPSIiCi0gICAgdGVzdFN1aXRlQ2xhc3M9Im9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnRlc3RzLlVNQUFsbFRlc3RzIiBpbXBvcnRlcklEPSJvcmcuZWNsaXBzZS54c2QuZWNvcmUuaW1wb3J0ZXIiCi0gICAgY29tcGxpYW5jZUxldmVsPSI1LjAiPgotICA8Zm9yZWlnbk1vZGVsPkVQRl9TY2hlbWFfMjAwODAxMjcwOTQyLnhzZDwvZm9yZWlnbk1vZGVsPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJVbWEiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5lcGYueG1sIiByZXNvdXJjZT0iWE1MIiBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIgotICAgICAgZWNvcmVQYWNrYWdlPSJVTUEuZWNvcmUjLyI+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9uYSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvY29udHJpYnV0ZXMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL2V4dGVuZHMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iVU1BLmVjb3JlIy8vVmFyaWFiaWxpdHlUeXBlL3JlcGxhY2VzIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1ZhcmlhYmlsaXR5VHlwZS9sb2NhbENvbnRyaWJ1dGlvbiIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvbG9jYWxSZXBsYWNlbWVudCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGUvZXh0ZW5kc1JlcGxhY2VzIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iVU1BLmVjb3JlIy8vV29ya09yZGVyVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvZmluaXNoVG9TdGFydCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJVTUEuZWNvcmUjLy9Xb3JrT3JkZXJUeXBlL2ZpbmlzaFRvRmluaXNoIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb1N0YXJ0Ii8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGUvc3RhcnRUb0ZpbmlzaCIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkRhdGFUeXBlcyBlY29yZURhdGFUeXBlPSJVTUEuZWNvcmUjLy9WYXJpYWJpbGl0eVR5cGVPYmplY3QiLz4KLSAgICA8Z2VuRGF0YVR5cGVzIGVjb3JlRGF0YVR5cGU9IlVNQS5lY29yZSMvL1dvcmtPcmRlclR5cGVPYmplY3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BY3Rpdml0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHkvcG9zdGNvbmRpdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQWN0aXZpdHkvYnJlYWtkb3duRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3JvYWRtYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS9pc0VuYWN0YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FjdGl2aXR5L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eS92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQWN0aXZpdHlEZXNjcmlwdGlvbi9hbHRlcm5hdGl2ZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL2hvd1RvU3RhZmYiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BY3Rpdml0eURlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvL2lzUHJpbWFyeUV4dGVuc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BcnRpZmFjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0L2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9BcnRpZmFjdC9jb250YWluZWRBcnRpZmFjdCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9BcnRpZmFjdERlc2NyaXB0aW9uL2JyaWVmT3V0bGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vcmVwcmVzZW50YXRpb25PcHRpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQXJ0aWZhY3REZXNjcmlwdGlvbi9yZXByZXNlbnRhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0FydGlmYWN0RGVzY3JpcHRpb24vbm90YXRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wcmVzZW50ZWRBZnRlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlc2VudGVkQmVmb3JlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9wbGFubmluZ0RhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3N1cGVyQWN0aXZpdHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9ncm91cDEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2NoZWNrbGlzdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvZXhhbXBsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvZ3VpZGVsaW5lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9yZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudC9zdXBwb3J0aW5nTWF0ZXJpYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L3doaXRlcGFwZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2hhc011bHRpcGxlT2NjdXJyZW5jZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzT3B0aW9uYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9CcmVha2Rvd25FbGVtZW50L2lzUGxhbm5lZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnQvcHJlZml4Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uL3VzYWdlR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ2FwYWJpbGl0eVBhdHRlcm4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9DaGVja2xpc3QiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db21wb3NpdGVSb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29tcG9zaXRlUm9sZS9hZ2dyZWdhdGVkUm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Db25jZXB0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29uc3RyYWludC9tYWluRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UvY29udGVudENhdGVnb3J5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudERlc2NyaXB0aW9uL21haW5EZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9rZXlDb25zaWRlcmF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Db250ZW50RGVzY3JpcHRpb24vc2VjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnREZXNjcmlwdGlvbi9leHRlcm5hbElkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY2hlY2tsaXN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvY29uY2VwdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L2V4YW1wbGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9ndWlkZWxpbmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC9yZXVzYWJsZUFzc2V0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvc3VwcG9ydGluZ01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vQ29udGVudEVsZW1lbnQvd2hpdGVwYXBlciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0NvbnRlbnRFbGVtZW50L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50RWxlbWVudC92YXJpYWJpbGl0eVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Db250ZW50UGFja2FnZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vQ29udGVudFBhY2thZ2UvY29udGVudEVsZW1lbnQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vQ3VzdG9tQ2F0ZWdvcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9jYXRlZ29yaXplZEVsZW1lbnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9DdXN0b21DYXRlZ29yeS9zdWJDYXRlZ29yeSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZWxpdmVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2dyb3VwMyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlL2RlbGl2ZXJlZFdvcmtQcm9kdWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vZXh0ZXJuYWxEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24vcGFja2FnaW5nR3VpZGFuY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2dyb3VwNCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzcy9jb21tdW5pY2F0aW9uc01hdGVyaWFsIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzL2VkdWNhdGlvbk1hdGVyaWFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9zY2FsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3Byb2plY3RDaGFyYWN0ZXJpc3RpY3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9yaXNrTGV2ZWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi9lc3RpbWF0aW5nVGVjaG5pcXVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24vcHJvamVjdE1lbWJlckV4cGVydGlzZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uL3R5cGVPZkNvbnRyYWN0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9wcmVzZW50YXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmliYWJsZUVsZW1lbnQvZnVsZmlsbCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaWJhYmxlRWxlbWVudC9pc0Fic3RyYWN0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L25vZGVpY29uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGVzY3JpYmFibGVFbGVtZW50L3NoYXBlaWNvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9EZXNjcmlwdG9yL2lzU3luY2hyb25pemVkV2l0aFNvdXJjZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9EZXNjcmlwdG9yRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi9yZWZpbmVkRGVzY3JpcHRpb24iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGlzY2lwbGluZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZS90YXNrIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvc3ViRGlzY2lwbGluZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmUvcmVmZXJlbmNlV29ya2Zsb3ciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRGlzY2lwbGluZUdyb3VwaW5nL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0Rpc2NpcGxpbmVHcm91cGluZy9kaXNjaXBsaW5lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0RvY3VtZW50Um9vdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9taXhlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb2N1bWVudFJvb3QveE1MTlNQcmVmaXhNYXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vRG9jdW1lbnRSb290L3hTSVNjaGVtYUxvY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9tZXRob2RDb25maWd1cmF0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9tZXRob2RMaWJyYXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL0RvY3VtZW50Um9vdC9tZXRob2RQbHVnaW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRG9tYWluIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vRG9tYWluL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0RvbWFpbi93b3JrUHJvZHVjdCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9Eb21haW4vc3ViZG9tYWluIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VsZW1lbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Fc3RpbWF0ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0VzdGltYXRlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0VzdGltYXRlL2VzdGltYXRpb25NZXRyaWMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Fc3RpbWF0ZS9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vRXN0aW1hdGluZ01ldHJpYyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0V4YW1wbGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9HdWlkYW5jZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL0d1aWRhbmNlRGVzY3JpcHRpb24vYXR0YWNobWVudCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9HdWlkZWxpbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9JdGVyYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9LaW5kIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9LaW5kL2FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24iPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vYmFzZUNvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL21ldGhvZFBsdWdpblNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vbWV0aG9kUGFja2FnZVNlbGVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZENvbmZpZ3VyYXRpb24vZGVmYXVsdFZpZXciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL3Byb2Nlc3NWaWV3Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kQ29uZmlndXJhdGlvbi9zdWJ0cmFjdGVkQ2F0ZWdvcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RDb25maWd1cmF0aW9uL2FkZGVkQ2F0ZWdvcnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnQvZ3JvdXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vd25lZFJ1bGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9tZXRob2RFbGVtZW50UHJvcGVydHkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2JyaWVmRGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RFbGVtZW50L2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9vcmRlcmluZ0d1aWRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9wcmVzZW50YXRpb25OYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudC9zdXBwcmVzc2VkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZEVsZW1lbnRQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kRWxlbWVudFByb3BlcnR5L3ZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZExpYnJhcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZFBsdWdpbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L21ldGhvZENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RMaWJyYXJ5L3Rvb2wiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ3JvdXAxIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGFja2FnZS9yZXVzZWRQYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvbWV0aG9kUGFja2FnZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL01ldGhvZFBhY2thZ2UvZ2xvYmFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01ldGhvZFBsdWdpbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL3JlZmVyZW5jZWRNZXRob2RQbHVnaW4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vTWV0aG9kUGx1Z2luL21ldGhvZFBhY2thZ2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RQbHVnaW4vdXNlckNoYW5nZWFibGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vTWV0aG9kVW5pdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2F1dGhvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9NZXRob2RVbml0L2NoYW5nZURlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWV0aG9kVW5pdC92ZXJzaW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL01pbGVzdG9uZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTWlsZXN0b25lL3JlcXVpcmVkUmVzdWx0Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL05hbWVkRWxlbWVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vTmFtZWRFbGVtZW50L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vT3V0Y29tZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BhY2thZ2VhYmxlRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1BoYXNlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QbGFubmluZ0RhdGEvZmluaXNoRGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1BsYW5uaW5nRGF0YS9yYW5rIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUGxhbm5pbmdEYXRhL3N0YXJ0RGF0ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlL2FjdGl2aXR5UmVmZXJlbmNlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2UvY29udGVudFJlZmVyZW5jZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBub3RpZnk9ImZhbHNlIiBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBVTUEuZWNvcmUjLy9QcmFjdGljZS9zdWJQcmFjdGljZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2FkZGl0aW9uYWxJbmZvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJhY3RpY2VEZXNjcmlwdGlvbi9hcHBsaWNhdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vYmFja2dyb3VuZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1ByYWN0aWNlRGVzY3JpcHRpb24vZ29hbHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL2xldmVsc09mQWRvcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9QcmFjdGljZURlc2NyaXB0aW9uL3Byb2JsZW0iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2VzcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy9pbmNsdWRlc1BhdHRlcm4iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2RlZmF1bHRDb250ZXh0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzcy92YWxpZENvbnRleHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzL2RpYWdyYW1VUkkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jb3B5cmlnaHQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9pbnRlcmZhY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9wcm9jZXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9hdXRob3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudC9jaGFuZ2VEZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnQvdmVyc2lvbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS9pbnRlcmZhY2VTcGVjaWZpY2F0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UvaW50ZXJmYWNlSU8iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vc2NvcGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Qcm9jZXNzRGVzY3JpcHRpb24vdXNhZ2VOb3RlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Qcm9jZXNzRWxlbWVudCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc1BhY2thZ2UvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIG5vdGlmeT0iZmFsc2UiIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Byb2Nlc3NQYWNrYWdlL3Byb2Nlc3NFbGVtZW50Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvZ3JvdXA0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUvYmFzZVByb2Nlc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUmVwb3J0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vUmV1c2FibGVBc3NldCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvYWRtYXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Sb2xlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL2Fzc2lnbm1lbnRBcHByb2FjaGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0aW9uL3NraWxscyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdGlvbi9zeW5vbnltcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Sb2xlRGVzY3JpcHRvciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZURlc2NyaXB0b3Ivcm9sZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVEZXNjcmlwdG9yL3Jlc3BvbnNpYmxlRm9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1JvbGVTZXQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0L2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1JvbGVTZXQvcm9sZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Sb2xlU2V0R3JvdXBpbmcvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vUm9sZVNldEdyb3VwaW5nL3JvbGVTZXQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vU2VjdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1NlY3Rpb24vc3ViU2VjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vcHJlZGVjZXNzb3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9TZWN0aW9uL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vU2VjdGlvbi9zZWN0aW9uTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1NlY3Rpb24vdmFyaWFiaWxpdHlUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1N1cHBvcnRpbmdNYXRlcmlhbCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rhc2siPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svcHJlY29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9wZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2dyb3VwMiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL291dHB1dCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2svYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL29wdGlvbmFsSW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL2VzdGltYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFzay9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrL3Rvb2xNZW50b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRpb24vYWx0ZXJuYXRpdmVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0aW9uL3B1cnBvc2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3Rhc2siLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9wZXJmb3JtZWRQcmltYXJpbHlCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9ncm91cDMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL2Fzc2lzdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9leHRlcm5hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3IvbWFuZGF0b3J5SW5wdXQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9vcHRpb25hbElucHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGFza0Rlc2NyaXB0b3Ivb3V0cHV0Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIFVNQS5lY29yZSMvL1Rhc2tEZXNjcmlwdG9yL3N0ZXAiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UYXNrRGVzY3JpcHRvci9pc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9UZWFtUHJvZmlsZS9yb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3VwZXJUZWFtIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVGVhbVByb2ZpbGUvc3ViVGVhbSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9UZW1wbGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rlcm1EZWZpbml0aW9uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vVG9vbCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1Rvb2wvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vVG9vbC90b29sTWVudG9yIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1Rvb2xNZW50b3IiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJVTUEuZWNvcmUjLy9XaGl0ZXBhcGVyIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvcHJlZGVjZXNzb3IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrQnJlYWtkb3duRWxlbWVudC9pc0V2ZW50RHJpdmVuIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNPbmdvaW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya0JyZWFrZG93bkVsZW1lbnQvaXNSZXBlYXRhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtEZWZpbml0aW9uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wcmVjb25kaXRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrRGVmaW5pdGlvbi9wb3N0Y29uZGl0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtPcmRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya09yZGVyL3ZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya09yZGVyL2lkIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya09yZGVyL2xpbmtUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvZ3JvdXAyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3QvZXN0aW1hdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9lc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC9yZXBvcnQiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdC90ZW1wbGF0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0L3Rvb2xNZW50b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdGlvbi9pbXBhY3RPZk5vdEhhdmluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcHVycG9zZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24vcmVhc29uc0Zvck5vdE5lZWRpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3Ivd29ya1Byb2R1Y3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvcmVzcG9uc2libGVSb2xlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvZXh0ZXJuYWxJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2ltcGFjdGVkQnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvaW1wYWN0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9tYW5kYXRvcnlJbnB1dFRvIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL29wdGlvbmFsSW5wdXRUbyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0RGVzY3JpcHRvci9vdXRwdXRGcm9tIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2RlbGl2ZXJhYmxlUGFydHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdERlc2NyaXB0b3IvYWN0aXZpdHlFbnRyeVN0YXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgVU1BLmVjb3JlIy8vV29ya1Byb2R1Y3REZXNjcmlwdG9yL2FjdGl2aXR5RXhpdFN0YXRlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9IlVNQS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIFVNQS5lY29yZSMvL1dvcmtQcm9kdWN0VHlwZS9ncm91cDIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBVTUEuZWNvcmUjLy9Xb3JrUHJvZHVjdFR5cGUvd29ya1Byb2R1Y3QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gIDwvZ2VuUGFja2FnZXM+Ci08L2dlbm1vZGVsOkdlbk1vZGVsPgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL21vZGVsL1VNQS54c2QgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZTg3ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvbW9kZWwvVU1BLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRVBGIFVNQSBYTUwgRGF0YSBJbnRlcmNoYW5nZSBTY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB4bWxuczp1bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMyIgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMiPgotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJXb3JrT3JkZXJUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gQnJlYWtkb3duIEVsZW1lbnQgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50IGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50IGluIG9yZGVyIHRvIGJlZ2luIG9yIGVuZC4gVGhpcyBlbnVtZXJhdGlvbiBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgV29yayBPcmRlciByZWxhdGlvbnNoaXBzIGF2YWlsYWJsZSBpbiBVTUEgYW5kIGlzIHVzZWQgdG8gcHJvdmlkZSB2YWx1ZXMgZm9yIFdvcmsgT3JkZXIncyBsaW5rVHlwZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6TkNOYW1lIj4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmlzaFRvRmluaXNoIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdGFydFRvU3RhcnQiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0YXJ0VG9GaW5pc2giLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iVmFyaWFiaWxpdHlUeXBlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpOQ05hbWUiPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibmEiLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbnRyaWJ1dGVzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJleHRlbmRzIi8+Ci0JCQk8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXBsYWNlcyIvPgotCQkJPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWxDb250cmlidXRpb24iLz4KLQkJCTx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImxvY2FsUmVwbGFjZW1lbnQiLz4KLQkJPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTmFtZWRFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGFja2FnZWFibGVFbGVtZW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgVU1MIDIuMCBtZXRhLWNsYXNzIFBhY2thZ2FibGUgRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk5hbWVkRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1ldGhvZEVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJvb3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgRGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYXR0cmlidXRlcyBpbmhlcml0ZWQgYnkgYWxsIFVNQSBNZXRob2QgRWxlbWVudHMuICBNZXRob2QgRWxlbWVudCBpdHNlbGYgaXMgZGVyaXZlZCBmcm9tIFBhY2thZ2VhYmxlIEVsZW1lbnQgZnJvbSB0aGUgVU1MIDIuMCBJbmZyYXN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlBhY2thZ2VhYmxlRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPd25lZFJ1bGUiIHR5cGU9InVtYTpDb25zdHJhaW50Ij4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBpbnN0YW5jZSBvZiBNZXRob2QgRWxlbWVudCBoYXMgYSBnbG9iYWwgdW5pcXVlIGlkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImJyaWVmRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RXZlcnkgaW5zdGFuY2Ugb2YgTWV0aG9kIEVsZW1lbnQgc2hhbGwgYmUgYnJpZWZseSBkZXNjcmliZWQgd2l0aCBvbmUgb3IgdHdvIHNlbnRlbmNlcyBzdW1tYXJpemluZyB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdXBwcmVzc2VkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgaXMgZGVyaXZlZCBmcm9tIGFub3RoZXIgVmFyaWFiaWxpdHkgRWxlbWVudCB1c2luZyB0aGUgImV4dGVuZHMiIFZhcmlhYmlsaXR5IFNwZWNpYWxpemF0aW9uLCB0aGVuIHRoaXMgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGluaGVyaXRlZCBNZXRob2QgRWxlbWVudHMgdGhhdCB3ZXJlIHBhcnQgb2YgdGhlIGJhc2VkLW9uIFZhcmlhYmlsaXR5IEVsZW1lbnQsIHdoaWNoIGNhbiBiZSBhbnkgdHlwZSBvZiBNZXRob2QgRWxlbWVudC4gIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSBvbiBhIE1ldGhvZCBFbGVtZW50IHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgdGhhbiBhbiBpbmhlcml0ZWQgbWV0aG9kIGVsZW1lbnQgdGhlbiBpdCB3aWxsIG5vdCBiZSByZWdhcmRlZCBhcyBpbmhlcml0ZWQgYXQgYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Im9yZGVyaW5nR3VpZGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VXNlZCBmb3IgQ0FTRSB0b29sIHJlYWxpemF0aW9ucyBvZiB0aGlzIG1vZGVsIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgbGF5b3V0IGFuZCBvcmRlcmluZyBvZiB0aGUgbWV0aG9kIGVsZW1lbnQgYW5kIGl0cyBwYXJ0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb25zdHJhaW50Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgY29uZGl0aW9uIG9yIHJlc3RyaWN0aW9uIGV4cHJlc3NlZCBpbiBuYXR1cmFsIGxhbmd1YWdlIHRleHQgb3IgaW4gYSBtYWNoaW5lIHJlYWRhYmxlIGxhbmd1YWdlIGZvciB0aGUgcHVycG9zZSBvZiBkZWNsYXJpbmcgc29tZSBvZiB0aGUgc2VtYW50aWNzIG9mIGEgTWV0aG9kIEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYWluRGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+U3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU2VjdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlN1YlNlY3Rpb24iIHR5cGU9InVtYTpTZWN0aW9uIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWRlY2Vzc29yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBhdHRyaWJ1dGVzIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZvciBhIENvbnRlbnQgRGVzY3JpcHRpb24ncyBTZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY3Rpb25OYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kVW5pdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBNZXRob2QgRWxlbWVudCB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQ29udGVudCBFbGVtZW50LiAgSXQgZGVmaW5lcyBzdGFuZGFyZCBhdHRyaWJ1dGVzIGFwcGxpY2FibGUgZm9yIGFsbCBDb250ZW50IEVsZW1lbnQgdHlwZXMuICBTcGVjaWZpYyBDb250ZW50IEVsZW1lbnQgc3ViLXR5cGVzIGNhbiBkZWZpbmUgdGhlaXIgb3duIG1hdGNoaW5nIENvbnRlbnQgRGVzY3JpcHRpb24gc3ViLXR5cGVzLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1haW5EZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN0b3JlcyB0aGUgbWFpbiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciB0aGUgQ29udGVudCBFbGVtZW50LiAgQWxsIHRleHQgdGhhdCBpcyBub3QgcGFydCBvZiBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlcyBzaGFsbCBiZSBzdG9yZWQgaGVyZS4gIElmIHRoZSBDb250ZW50IERlc2NyaXB0aW9uIGlzIGRpdmlkZWQgaW50byBzZWN0aW9ucyB1c2luZyB0aGUgU2VjdGlvbiBjbGFzcywgdGhlbiBvbmx5IHRoZSB0ZXh0IGZyb20gdGhlICdzdGFydCcgb2YgdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24gdG8gdGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBzdG9yZWQgaGVyZSAoc2ltaWxhciB0byBhIG5vcm1hbCBkb2N1bWVudCB3aGVyZSB5b3UgY2FuIHBsYWNlIHRleHQgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIHRvIGl0cyBmaXJzdCBkaWN0aW9uIGhlYWRpbmcpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJLZXlDb25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGFkdmlzZSBhbmQgZ3VpZGFuY2Ugb2YgYSBjcml0aWNhbCBuYXR1cmUgZm9yIHRoZSBjb250ZW50IGVsZW1lbnQgYXMgd2VsbCBhcyB3YXJuaW5ncywgY2F1dGlvbnMsIHBpdGZhbGxzLCBkYW5nZXJzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iU2VjdGlvbiIgdHlwZT0idW1hOlNlY3Rpb24iLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJHdWlkYW5jZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJBdHRhY2htZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgdXNlZCBmb3IgYXR0YWNobWVudHMgYXVnbWVudGluZyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgZm9yIGd1aWRhbmNlLiAgSW4gcGFydGljdWxhciB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIFRlbXBsYXRlcywgRXhhbXBsZXMsIGFuZCBSZXVzYWJsZSBBc3NldHMgdG8gY29udGFpbiB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgZGVzY3JpYmVkIGluIHRoZSBtYWluRGVzY3JpcHRpb24uICBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gcmVwcmVzZW50YXRpb25zIG9mIHRoZSBndWlkYW5jZSBpbiBqdXN0IGEgdGhpcmQgcGFydHkgZm9ybWF0LCBlLmcuIFBERiwgTVMgV29yZCwgb3IgV29yZCBQZXJmZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcmFjdGljZURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFkZGl0aW9uYWxJbmZvIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgSW5mb3JtYXRpb24gbm90IGNvdmVyZWQgYnkgdGhlIG90aGVyIGF0dHJpYnV0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFwcGxpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIGhvdyB0aGUgUHJhY3RpY2UgaXMgYmVpbmcgYXBwbGllZCBvciBpbnRyb2R1Y2VkIGludG8gdGhlIGNvbnRleHQgZGVzY3JpYmVkIGluIGJhY2tncm91bmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkJhY2tncm91bmQiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FbGFib3JhdGlvbiBvbiB0aGUgYmFja2dyb3VuZCBhbmQgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHByb2JsZW0gb2NjdXJzIGFuZCB3aGVyZSB0aGUgc29sdXRpb24gZGVzY3JpYmVkIGJ5IHRoaXMgUHJhY3RpY2Ugd2lsbCBmaXQgaW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkdvYWxzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzdW1tYXJ5IG9mIHRoZSBvdmVyYWxsIGdvYWxzIHRvIGJlIGFkZHJlc3NlZCBieSB0aGUgUHJhY3RpY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkxldmVsc09mQWRvcHRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9ibGVtIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0aGUgUHJhY3RpY2UgYWRkcmVzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtQcm9kdWN0RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBXb3JrIFByb2R1Y3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkltcGFjdE9mTm90SGF2aW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJlYXNvbnNGb3JOb3ROZWVkaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaXJjdW1zdGFuY2VzIGluIHdoaWNoIGl0IGlzIHJlYXNvbmFibGUgbm90IHRvIHByb2R1Y2UgdGhlIHdvcmsgcHJvZHVjdC4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYWlkIGluIHRoZSB0YWlsb3Jpbmcgb2YgdGhlIG1ldGhvZC9wcm9jZXNzIHRvIHRoZSBuZWVkcyBvZiBhIHNwZWNpZmljIHByb2plY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXh0ZXJuYWxJZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQXJ0aWZhY3REZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQnJpZWZPdXRsaW5lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVwcmVzZW50YXRpb25PcHRpb25zIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+RGlzY3Vzc2VzIGRpZmZlcmVudCBwb3NzaWJsZSBhbHRlcm5hdGl2ZSByZXByZXNlbnRhdGlvbnMgZm9yIHRoZSBhcnRpZmFjdC4gRm9yIGV4YW1wbGUgYSBkZXNpZ24gbW9kZWwgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVU1MIG1vZGVsIG9yIGFuIGluZm9ybWFsIGJsb2NrIGRpYWdyYW0gb3IgYnkgdGV4dHVhbCBkZXNjcmlwdGlvbiBvbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRXh0ZXJuYWxEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgRGVsaXZlcmFibGUgdXNlZCBmb3IgY2xpZW50IGRvY3VtZW50cyAocHJvcG9zYWwsIHN0YXRlbWVudHMgb2Ygd29yayBvciBjb250cmFjdHVhbCBhZ3JlZW1lbnRzKS4gIEl0IG1pZ2h0IHVzZSBhIGRpZmZlcmVudCBsYW5ndWFnZSBhbmQgZm9sbG93IGxlZ2FsIGNvbnN0cmFpbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQYWNrYWdpbmdHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGhvdyB0byBhc3NlbWJsZSB0aGUgZGVsaXZlcmFibGUgZnJvbSBhbGwgaXRzIHJlcXVpcmVkIGlucHV0cy4gIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1vc3QgY29tbW9uIGNvbnRlbnQgbWVkaXVtIGFuZCBmb3JtYXQuICBEaXN0cmlidXRpb24gb2YgdGhlIGRlbGl2ZXJhYmxlIGlzIGFkZHJlc3NlZCBpbiB0aGlzIHNlY3Rpb24sIGlmIG5lY2Vzc2FyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlRGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJBc3NpZ25tZW50QXBwcm9hY2hlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2tpbGxzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgb2Ygc2V0IG9mIHJlcXVpcmVkIHNraWxscyBhIHBlcnNvbiBuZWVkcyB0byBwb3NzZXNzIHRvIGZ1bGZpbGwgdGhhdCBSb2xlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTeW5vbnltcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2tEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIENvbnRlbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RGVzY3JpcHRpb24iPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkFsdGVybmF0aXZlcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHVycG9zZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgVGFzayBhbmQgd2hhdCBpcyBpbnRlbmRlZCB0byBiZSBhY2hpZXZlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJEZXNjcmliYWJsZUVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgTWV0aG9kIEVsZW1lbnRzIGZvciB3aGljaCBleHRlcm5hbCBwcmVzZW50YXRpb24gbmFtZXMgYXMgd2VsbCBhcyBjb250ZW50IGRlc2NyaXB0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCwgc3VjaCBhcyBSb2xlcyBvciBXb3JrIFByb2R1Y3RzLiAgUHJlc2VudGF0aW9uIE5hbWUgYW5kIENvbnRlbnQgRGVzY3JpcHRpb25zIGFyZSB0eXBpY2FsbHkgbG9jYWxpemVkIHVzaW5nIGEgcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIGl0cyBTdHJpbmcgdHlwZSBhdHRyaWJ1dGVzLgotVGhpcyBhYnN0cmFjdGlvbiByZXByZXNlbnRzIGFsbCBlbGVtZW50cyBpbiB0aGUgTWV0aG9kIENvbnRlbnQgYXMgd2VsbCBhcyBQcm9jZXNzIHNwYWNlIGZvciB3aGljaCBjb25jcmV0ZSB0ZXh0dWFsIGRlc2NyaXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9ybSBvZiBkb2N1bWVudGluZyBhdHRyaWJ1dGVzIGdyb3VwZWQgaW4gYSBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIGluc3RhbmNlLiAgRGVzY3JpYmFibGUgRWxlbWVudHMgYXJlIGludGVuZGVkIHRvIGJlIHB1Ymxpc2hlZCBpbiBtZXRob2Qgb3IgcHJvY2VzcyBwdWJsaWNhdGlvbnMgKHNpbWlsYXIgdG8gdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3Mgd2ViKS4gIERlc2NyaWJhYmxlIEVsZW1lbnQgZGVmaW5lcyB0aGF0IHRoZSBlbGVtZW50IGl0IHJlcHJlc2VudHMgd2lsbCBoYXZlIGNvbnRlbnQgJ2F0dGFjaGVkJyB0byBpdC4gIENvbnRlbnQgRGVzY3JpcHRpb24gaXMgdGhlIGFic3RyYWN0aW9uIGZvciB0aGUgYWN0dWFsIHBsYWNlcyBpbiB3aGljaCB0aGUgY29udGVudCBpcyBiZWluZyByZXByZXNlbnRlZC4gIFRoaXMgc2VwYXJhdGlvbiBhbGxvd3MgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGNvcmUgbWV0aG9kIG1vZGVsIGVsZW1lbnRzIGRlc2NyaWJpbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwgZnJvbSB0aGUgYWN0dWFsIGRlc2NyaXB0aW9uIGNvbnRhaW5lciBwcm92aWRpbmcsIGZvciBleGFtcGxlLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgY29udGVudCBlbGVtZW50IGluIGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMgbGFuZ3VhZ2VzLCBhdWRpZW5jZXMsIGxpY2Vuc2luZyBsZXZlbHMsIGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJQcmVzZW50YXRpb24iIHR5cGU9InVtYTpDb250ZW50RGVzY3JpcHRpb24iLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlc2VudGF0aW9uTmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXBlaWNvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibm9kZWljb24iIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSByZWZlcmVuY2UgdG8gYW4gaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGluIHRyZWUgYnJvd3NlciBwcmVzZW50YXRpb25zIGFuZCBicmVha2Rvd24gc3RydWN0dXJlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50RWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLUNvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDaGVja2xpc3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb25jZXB0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXhhbXBsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ikd1aWRlbGluZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNhYmxlQXNzZXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdXBwb3J0aW5nTWF0ZXJpYWwiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXaGl0ZXBhcGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eVR5cGUiIHR5cGU9InVtYTpWYXJpYWJpbGl0eVR5cGUiLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iR3VpZGFuY2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+R3VpZGFuY2UgaXMgYW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNvbnRlbnQgZWxlbWVudHMgc3VjaCBhcyBSb2xlcywgVGFza3MsIGFuZCBXb3JrIFByb2R1Y3RzLiAgRXhhbXBsZXMgZm9yIEd1aWRhbmNlIGFyZSBHdWlkZWxpbmVzLCBUZW1wbGF0ZXMsIENoZWNrbGlzdHMsIFRvb2wgTWVudG9ycywgRXN0aW1hdGVzLCBTdXBwb3J0aW5nIE1hdGVyaWFscywgUmVwb3J0cywgQ29uY2VwdHMsIGV0Yy4gIFRoaXMgcGFja2FnZSBvbmx5IGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhYnN0cmFjdCBHdWlkYW5jZSBjbGFzcy4gIFRoZSBwYWNrYWdlIEd1aWRhbmNlIFR5cGVzIGRlZmluZXMgY29uY3JldGUgZ3VpZGFuY2UgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkNvbmNlcHQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgb3V0bGluZXMga2V5IGlkZWFzIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBwcmluY2lwbGVzIHVuZGVybHlpbmcgdGhlIHJlZmVyZW5jZWQgaXRlbS4gQ29uY2VwdHMgbm9ybWFsbHkgYWRkcmVzcyBtb3JlIGdlbmVyYWwgdG9waWNzIHRoYW4gR3VpZGVsaW5lcyBhbmQgc3BhbiBhY3Jvc3Mgc2V2LWVyYWwgd29yayBwcm9kdWN0IGFuZC9vciB0YXNrcy9hY3Rpdml0aWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDaGVja2xpc3QiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgaWRlbnRpZmllcyBhIHNlcmllcyBvZiBpdGVtcyB0aGF0IG5lZWQgdG8gYmUgY29tcGxldGVkIG9yIHZlcmktZmllZC4gIENoZWNrbGlzdHMgYXJlIG9mdGVuIHVzZWQgaW4gcmV2aWV3cyBzdWNoIGFzIHdhbGt0aHJvdWdocyBvciBpbnNwZWN0aW9ucy4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkV4YW1wbGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIEd1aWRhbmNlIHRoYXQgcmVwcmVzZW50cyBhIHR5cGljYWwsIHBhcnRpYWxseSBjb21wbGV0ZWQsIHNhbXBsZSBpbnN0YW5jZSBvZiBvbmUgb3IgbW9yZSB3b3JrIHByb2R1Y3RzIG9yIHNjZW5hcmlvIGxpa2UgZGVzY3JpcHRpb25zIG9mIGhvdyBUYXNrIG1heSBiZSBwZXJmb3JtZWQuIEV4YW1wbGVzIGNhbiBiZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdHMgYXMgd2VsbCBhcyBUYXNrcyB0aGF0IHByb2R1Y2UgdGhlbSBhcyB3ZWxsIGFzIGFueSBvdGhlciBDb250ZW50IEVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ikd1aWRlbGluZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCBvbiBob3cgdG8gcGVyZm9ybSBhIHBhcnRpY3VsYXIgdGFzayBvciBncm91cGluZyBvZiB0YXNrcyAoZS5nLiBncm91cGVkIHRvZ2V0aGVyIGFzIGFjdGl2aXRpZXMpIG9yIHRoYXQgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWwsIHJ1bGVzLCBhbmQgcmVjb21tZW5kYXRpb25zIG9uIHdvcmsgcHJvZHVjdHMgYW5kIHRoZWlyIHByb3BlcnRpZXMuICBBbW9uZ3N0IG90aGVycywgaXQgY2FuIGluY2x1ZGUgZGV0YWlscyBhYm91dCBiZXN0IHByYWN0aWNlcyBhbmQgZGlmZmVyZW50IGFwcHJvYWNoZXMgZm9yIGRvaW5nIHdvcmssIGhvdyB0byB1c2UgcGFydGljdWxhciB0eXBlcyBvZiB3b3JrIHByb2R1Y3RzLCBpbmZvcm1hdGlvbiBvbiBkaWZmZXJlbnQgc3VidHlwZXMgYW5kIHZhcmlhbnRzIG9mIHRoZSB3b3JrIHByb2R1Y3QgYW5kIGhvdyB0aGV5IGV2b2x2ZSB0aHJvdWdob3V0IGEgbGlmZWN5Y2xlLCBkaXNjdXNzaW9ucyBvbiBza2lsbHMgdGhlIHBlcmZvcm1pbmcgcm9sZXMgc2hvdWxkIGFjcXVpcmUgb3IgaW1wcm92ZSB1cG9uLCBtZWFzdXJlbWVudHMgZm9yIHByb2dyZXNzIGFuZCBtYXR1cml0eSwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJFc3RpbWF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uTWV0cmljIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGluZ01ldHJpYyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB0aGF0IHF1YWxpZmllcyB0aGUgdXNhZ2UgYW5kIGFwcGxpY2F0aW9uIG9mIGVzdGltYXRpb24gbWV0cmljcyBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgYW4gYWN0dWFsIGVzdGltYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2FkbWFwIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBHdWlkYW5jZSB3aGljaCBpcyBvbmx5IHJlbGF0ZWQgdG8gQWN0aXZhdGVzIGFuZCB0aGVyZWZvcmUgaGFzIGJlZW4gYWRkZWQgYnkgdGhpcyBwYWNrYWdlIHRvIHRoZSBsaXN0IG9mIEd1aWRhbmNlIFR5cGVzIHJhdGhlciB0aGFuIGxpc3RlZCBpbiB0aGUgR3VpZGFuY2UgVHlwZXMgcGFja2FnZS4gIEEgUm9hZG1hcCByZXByZXNlbnRzIGEgbGluZWFyIHdhbGt0aHJvdWdoIG9mIGFuIEFjdGl2aXR5LCB0eXBpY2FsbHkgYSBQcm9jZXNzLgotQW4gaW5zdGFuY2Ugb2YgYSBSb2FkbWFwIHJlcHJlc2VudHMgaW1wb3J0YW50IGRvY3VtZW50YXRpb24gZm9yIHRoZSBBY3Rpdml0eSBvciBQcm9jZXNzIGl0IGlzIHJlbGF0ZWQgdG8uICBPZnRlbiBhIGNvbXBsZXggQWN0aXZpdHkgc3VjaCBhcyBhIFByb2Nlc3MgY2FuIGJlIG11Y2ggZWFzaWVyIHVuZGVyc3Rvb2QgYnkgcHJvdmlkaW5nIGEgd2Fsa3Rocm91Z2ggd2l0aCBhIGxpbmVhciB0aHJlYWQgb2YgYSB0eXBpY2FsIGluc3RhbnRpYXRpb24gb2YgdGhpcyBBY3Rpdml0eS4gIEluIGFkZGl0aW9uIHRvIG1ha2luZyB0aGUgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdW5kZXJzdGFuZCBob3cgd29yayBpbiB0aGUgcHJvY2VzcyBpcyBiZWluZyBwZXJmb3JtZWQsIGEgUm9hZG1hcCBwcm92aWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGhvdyBBY3Rpdml0aWVzIGFuZCBUYXNrcyByZWxhdGUgdG8gZWFjaCBvdGhlciBvdmVyIHRpbWUuICBSb2FkbWFwcyBhcmUgYWxzbyB1c2VkIHRvIHNob3cgaG93IHNwZWNpZmljIGFzcGVjdHMgYXJlIGRpc3RyaWJ1dGVkIG92ZXIgYSB3aG9sZSBwcm9jZXNzIHByb3ZpZGluZyBhIGtpbmQgb2YgZmlsdGVyIG9uIHRoZSBwcm9jZXNzIGZvciB0aGlzIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSZXBvcnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUZW1wbGF0ZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBmb3IgYSB3b3JrIHByb2R1Y3QgYSBwcmUtZGVmaW5lZCB0YWJsZSBvZiBjb250ZW50cywgc2VjdGlvbnMsIHBhY2thZ2VzLCBhbmQvb3IgaGVhZGluZ3MsIGEgc3RhbmRhcmRpemVkIGZvcm1hdCwgYXMgd2VsbCBhcyBkZXNjcmlwdGlvbnMgaG93IHRoZSBzZWN0aW9ucyBhbmQgcGFja2FnZXMgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgYW5kIGNvbXBsZXRlZC4gVGVtcGxhdGVzIGNhbm5vdCBvbmx5IGJlIHByb3ZpZGVkIGZvciBkb2N1bWVudHMsIGJ1dCBhbHNvIGZvciBjb25jZXB0dWFsIG1vZGVscyBvciBwaHlzaWNhbCBkYXRhIHN0b3Jlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iU3VwcG9ydGluZ01hdGVyaWFsIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkd1aWRhbmNlIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVG9vbE1lbnRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BICBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgc2hvd3MgaG93IHRvIHVzZSBhIHNwZWNpZmljIHRvb2wgdG8gYWNjb21wbGlzaCBzb21lIHBpZWNlIG9mIHdvcmsgYSBXb3JrIFByb2R1Y3QgZWl0aGVyIGluIHRoZSBjb250ZXh0IG9mIG9yIGluZGVwZW5kZW50IGZyb20gYSBUYXNrIG9yIEFjdGl2aXR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXaGl0ZXBhcGVyIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBDb25jZXB0IGd1aWRhbmNlIHRoYXQgaGF2ZSBiZWVuIGV4dGVybmFsbHkgcmV2aWV3ZWQgb3IgcHVibGlzaGVkIGFuZCBjYW4gYmUgcmVhZCBhbmQgdW5kZXJzdG9vZCBpbiBpc29sYXRpb24gb2Ygb3RoZXIgY29udGVudCBlbGVtZW50cyBhbmQgZ3VpZGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb25jZXB0Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iVGVybURlZmluaXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgZGVmaW5lcyBjb25jZXB0cyBhbmQgYXJlIHVzZWQgdG8gYnVpbGQgdXAgdGhlIEdsb3NzYXJ5LiBUZXJtRGVmaW5pdGlvbnMgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIENvbnRlbnRFbGVtZW50cywgYnV0IHRoZWlyIHJlbGF0aW9uc2hpcCBpcyBiZWluZyBkZXJpdmVkIHdoZW4gdGhlIFRlcm0gaXMgdXNlZCBpbiB0aGUgQ29udGVudEVsZW1lbnRzIGRlc2NyaXB0aW9uIHRleHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpHdWlkYW5jZSIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByYWN0aWNlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWN0aXZpdHlSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRSZWZlcmVuY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1YlByYWN0aWNlIiB0eXBlPSJ1bWE6UHJhY3RpY2UiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUmV1c2FibGVBc3NldCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi1ob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6R3VpZGFuY2UiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBjbGFzcyB3aGljaCBwcm92aWRlcyBhIGdlbmVyYWxpemF0aW9uIGZvciB0aGUgY29udGVudCBlbGVtZW50IHR5cGVzIEFydGlmYWN0LCBPdXRjb21lLCBhbmQgRGVsaXZlcmFibGUuICBUaGUgbWV0YS1tb2RlbCBjbGFzcyBXb3JrIFByb2R1Y3QgYWN0dWFsbHkgcmVwcmVzZW50cyB3b3JrIHByb2R1Y3QgdHlwZXMsIGkuZS4gYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IGlzIGEgZGVzY3JpcHRpb24gb2YgYSBzcGVjaWZpYyB0eXBlIG9mIHdvcmsgcHJvZHVjdCBhbmQgbm90IGFuIGluZGl2aWR1YWwgd29yayBwcm9kdWN0IGluc3RhbmNlLiAgSG93ZXZlciwgZm9yIHNpbXBsaWNpdHkgcmVhc29ucyBhbmQgYmVjYXVzZSBvZiBsb3cgcmlzayBvZiBtaXNpbnRlcnByZXRhdGlvbiB3ZSBkaWQgbm90IGFwcGVuZCB0aGUgd29yZCAndHlwZScgdG8gZXZlcnkgbWV0YS1jbGFzcy4KLUEgd29yayBwcm9kdWN0IGlzIGFuIGFic3RyYWN0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgY29udGVudCBlbGVtZW50cyB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBhbnl0aGluZyB1c2VkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgYSB0YXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUZW1wbGF0ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBcnRpZmFjdCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrUHJvZHVjdCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb250YWluZWRBcnRpZmFjdCIgdHlwZT0idW1hOkFydGlmYWN0Ii8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJhYmxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBQcm9kdWN0IHRoYXQgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBhbmQgZGVmaW5pdGlvbiBmb3IgcGFja2FnaW5nIG90aGVyIFdvcmsgUHJvZHVjdHMsIGFuZCBtYXkgYmUgZGVsaXZlcmVkIHRvIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHBhcnR5LiAgVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gVGhlcmVmb3JlLCBhIERlbGl2ZXJhYmxlIGFnZ3JlZ2F0ZXMgb3RoZXIgV29yayBQcm9kdWN0cy4gIEEgRGVsaXZlcmFibGUgaXMgdXNlZCB0byBwcmUtZGVmaW5lIHR5cGljYWwgb3IgcmVjb21tZW5kZWQgY29udGVudCBpbiB0aGUgZm9ybSBvciB3b3JrIHByb2R1Y3RzIHRoYXQgd291bGQgYmUgcGFja2FnZWQgZm9yIGRlbGl2ZXJ5LiAgVGhlIGFjdHVhbCBwYWNrYWdpbmcgb2YgdGhlIERlbGl2ZXJhYmxlIGluIGFuIGFjdHVhbCBwcm9jZXNzIG9yIGV2ZW4gcHJvamVjdCBjb3VsZCBiZSBhIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHJlY29tbWVuZGF0aW9uLiAgRGVsaXZlcmFibGVzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhbiBvdXRwdXQgZnJvbSBhIHByb2Nlc3MgdGhhdCBoYXMgdmFsdWUsIG1hdGVyaWFsIG9yIG90aGVyd2lzZSwgdG8gYSBjbGllbnQsIGN1c3RvbWVyIG9yIG90aGVyIHN0YWtlaG9sZGVyLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtQcm9kdWN0Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRlbGl2ZXJlZFdvcmtQcm9kdWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik91dGNvbWUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBXb3JrIFByb2R1Y3QgdGhhdCBkZXNjcmliZXMgaW50YW5naWJsZSB3b3JrIHByb2R1Y3RzIHRoYXQgYXJlIGEgcmVzdWx0IG9yIHN0YXRlLiBPdXRjb21lcyBtYXkgYWxzbyBiZSB1c2VkIHRvIGRlc2NyaWJlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgbm90IGZvcm1hbGx5IGRlZmluZWQuICBBIGtleSBkaWZmZXJlbnRpYXRvciBmb3Igb3V0Y29tZXMgYWdhaW5zdCBhcnRpZmFjdHMgaXMgdGhhdCBvdXRjb21lcyBhcmUgbm90IGNhbmRpZGF0ZXMgZm9yIGhhcnZlc3RpbmcgYXMgcmV1c2FibGUgYXNzZXRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya1Byb2R1Y3QiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJSb2xlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQ29udGVudCBFbGVtZW50IHRoYXQgZGVmaW5lcyBhIHNldCBvZiByZWxhdGVkIHNraWxscywgY29tcGV0ZW5jaWVzLCBhbmQgcmVzcG9uc2liaWxpdGllcy4gIFJvbGVzIGFyZSB1c2VkIGJ5IFRhc2tzIHRvIGRlZmluZSB3aG8gcGVyZm9ybXMgdGhlbSBhcyB3ZWxsIGFzIGRlZmluZSBhIHNldCBvZiB3b3JrIHByb2R1Y3RzIHRoZXkgYXJlIHJlc3BvbnNpYmxlIGZvci4gIAotQSBSb2xlIGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMgb2YgYW4gaW5kaXZpZHVhbCBvciBhIHNldCBvZiBpbmRpdmlkdWFscy4gIFJvbGVzIGFyZSBub3QgaW5kaXZpZHVhbHMgb3IgcmVzb3VyY2VzLiAgSW5kaXZpZHVhbCBtZW1iZXJzIG9mIHRoZSBkZXZlbG9wbWVudCBvcmdhbml6YXRpb24gd2lsbCB3ZWFyIGRpZmZlcmVudCBoYXRzLCBvciBwZXJmb3JtIGRpZmZlcmVudCByb2xlcy4gVGhlIG1hcHBpbmcgZnJvbSBpbmRpdmlkdWFsIHRvIHJvbGUsIHBlcmZvcm1lZCBieSB0aGUgcHJvamVjdCBtYW5hZ2VyIHdoZW4gcGxhbm5pbmcgYW5kIHN0YWZmaW5nIGZvciBhIHByb2plY3QsIGFsbG93cyBkaWZmZXJlbnQgaW5kaXZpZHVhbHMgdG8gYWN0IGFzIHNldmVyYWwgZGlmZmVyZW50IHJvbGVzLCBhbmQgZm9yIGEgcm9sZSB0byBiZSBwbGF5ZWQgYnkgc2V2ZXJhbCBpbmRpdmlkdWFscy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlc3BvbnNpYmxlRm9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRhc2siPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBDb250ZW50IEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd29yayBiZWluZyBwZXJmb3JtZWQgYnkgUm9sZXMuICBJdCBkZWZpbmVzIG9uZSBkZWZhdWx0IHBlcmZvcm1pbmcgUm9sZSBhcyB3ZWxsIGFzIG1hbnkgYWRkaXRpb25hbCBwZXJmb3JtZXJzLiAgQSBUYXNrIGlzIGFzc29jaWF0ZWQgdG8gaW5wdXQgYW5kIG91dHB1dCB3b3JrIHByb2R1Y3RzLiAgSW5wdXRzIGFyZSBkaWZmZXJlbnRpYXRlZCBpbiBtYW5kYXRvcnkgdmVyc3VzIG9wdGlvbmFsIGlucHV0cy4gIFRoZSBhc3NvY2lhdGlvbnMgdG8gV29yayBQcm9kdWN0cyBhcmUgbm90IGluc3RhbnRpYXRhYmxlL3ZhcmlhYmxlLWxpa2UgcGFyYW1ldGVycy4gIFRoZXkgcmF0aGVyIGV4cHJlc3MgKGh5cGVyLSlsaW5rcyB0byB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSB3b3JrIHByb2R1Y3RzIHR5cGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIFRhc2sgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiAgSW4gb3RoZXIgd29yZHMsIHRoZXNlIGFzc29jaWF0aW9ucyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHVzZWQgdG8gY2FwdHVyZSB3aGljaCBjb25jcmV0ZSBpbnN0YW5jZXMgd2lsbCBiZSBwYXNzZWQgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBtZXRob2QgaW4gYSBwcm9qZWN0LiAgQWxsIG9mIHRoZSBUYXNrJ3MgZGVmYXVsdCBhc3NvY2lhdGlvbnMgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYW4gYWN0dWFsIHByb2Nlc3MgZGVmaW5pdGlvbi4KLUEgVGFzayBkZXNjcmliZXMgYW4gYXNzaWduYWJsZSB1bml0IG9mIHdvcmsuICBFdmVyeSBUYXNrIGlzIGFzc2lnbmVkIHRvIHNwZWNpZmljIFJvbGVzLiAgVGhlIGdyYW51bGFyaXR5IG9mIGEgVGFzayBpcyBnZW5lcmFsbHkgYSBmZXcgaG91cnMgdG8gYSBmZXcgZGF5cy4gIEl0IHVzdWFsbHkgYWZmZWN0cyBvbmUgb3Igb25seSBhIHNtYWxsIG51bWJlciBvZiB3b3JrIHByb2R1Y3RzLiBBIFRhc2sgaXMgdXNlZCBhcyBhbiBlbGVtZW50IG9mIGRlZmluaW5nIGEgcHJvY2Vzcy4gVGFza3MgYXJlIGZ1cnRoZXIgdXNlZCBmb3IgcGxhbm5pbmcgYW5kIHRyYWNraW5nIHByb2dyZXNzOyB0aGVyZWZvcmUsIGlmIHRoZXkgYXJlIGRlZmluZWQgdG9vIGZpbmUtZ3JhaW5lZCwgdGhleSB3aWxsIGJlIG5lZ2xlY3RlZCwgYW5kIGlmIHRoZXkgYXJlIHRvbyBsYXJnZSwgcHJvZ3Jlc3Mgd291bGQgaGF2ZSB0byBiZSBleHByZXNzZWQgaW4gdGVybXMgb2YgYSBUYXNrJ3MgcGFydHMgKGUuZy4gU3RlcHMsIHdoaWNoIGlzIG5vdCByZWNvbW1lbmRlZCkuIAotQSBUYXNrIGhhcyBhIGNsZWFyIHB1cnBvc2UgaW4gd2hpY2ggdGhlIHBlcmZvcm1pbmcgcm9sZXMgYWNoaWV2ZSBhIHdlbGwgZGVmaW5lZCBnb2FsLiAgSXQgcHJvdmlkZXMgY29tcGxldGUgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucyBvZiBkb2luZyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGFjaGlldmUgdGhpcyBnb2FsLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBjb21wbGV0ZSwgaW5kZXBlbmRlbnQgb2Ygd2hlbiBpbiBhIHByb2Nlc3MgbGlmZWN5Y2xlIHRoZSB3b3JrIHdvdWxkIGFjdHVhbGx5IGJlIGRvbmUuICBJdCB0aGVyZWZvcmUgZG9lcyBub3QgZGVzY3JpYmUgd2hlbiB5b3UgZG8gd2hhdCB3b3JrIGF0IHdoYXQgcG9pbnQgb2YgdGltZSwgYnV0IGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBnZXRzIGRvbmUgdGhyb3VnaG91dCB0aGUgZGV2ZWxvcG1lbnQgbGlmZWN5Y2xlIHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIGFjaGlldmVtZW50IG9mIHRoaXMgZ29hbC4gIFdoZW4gdGhlIFRhc2sgaXMgYmVpbmcgYXBwbGllZCBpbiBhIHByb2Nlc3MgdGhlbiB0aGlzIHByb2Nlc3MgYXBwbGljYXRpb24gKGRlZmluZWQgYXMgVGFzayBEZXNjcmlwdG9yKSBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gb2Ygd2hpY2ggcGllY2VzIG9mIHRoZSBUYXNrIHdpbGwgYWN0dWFsbHkgYmUgcGVyZm9ybWVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUuIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBUYXNrIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBwcm9jZXNzIG92ZXIgYW5kIG92ZXIgYWdhaW4sIGJ1dCBlYWNoIHRpbWUgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBlbXBoYXNpcyBvbiBkaWZmZXJlbnQgc3RlcHMgb3IgYXNwZWN0cyBvZiB0aGUgdGFzayBkZXNjcmlwdGlvbi4gCi1Gb3IgZXhhbXBsZSwgYSBUYXNrIHN1Y2ggYXMgIkRldmVsb3AgVXNlIENhc2UgTW9kZWwiIGRlc2NyaWJlcyBhbGwgdGhlIHdvcmsgdGhhdCBuZWVkcyB0byBiZSBkb25lIHRvIGRldmVsb3AgYSBjb21wbGV0ZSB1c2UgY2FzZSBtb2RlbC4gVGhpcyB3b3VsZCBjb21wcmlzZSBvZiB0aGUgaWRlbnRpZmljYXRpb24gYW5kIG5hbWluZyBvZiB1c2UgY2FzZXMgYW5kIGFjdG9ycywgdGhlIHdyaXRpbmcgb2YgYSBicmllZiBkZXNjcmlwdGlvbiwgdGhlIG1vZGVsaW5nIG9mIHVzZSBjYXNlcyBhbmQgdGhlaXIgcmVsYXRpb25zaGlwcyBpbiBkaWFncmFtcywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgYmFzaWMgZmxvdywgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGFsdGVybmF0aXZlcyBmbG93cywgcGVyZm9ybWluZyBvZiB3YWxrdGhyb3VnaHMgd29ya3Nob3BzIGFuZCByZXZpZXdzLCBldGMuICBBbGwgb2YgdGhlc2UgcGFydHMgY29udHJpYnV0ZSB0byB0aGUgZGV2ZWxvcG1lbnQgZ29hbCBvZiBkZXZlbG9waW5nIHRoZSB1c2UgY2FzZSBtb2RlbCwgYnV0IHRoZSBwYXJ0cyB3aWxsIGJlIHBlcmZvcm1lZCBhdCBkaWZmZXJlbnQgcG9pbnRzIGluIHRpbWUgaW4gYSBwcm9jZXNzLiAgSWRlbnRpZmljYXRpb24sIG5hbWluZywgYW5kIGJyaWVmIGRlc2NyaXB0aW9ucyB3b3VsZCBiZSBwZXJmb3JtZWQgZWFybHkgaW4gYSB0eXBpY2FsIGRldmVsb3BtZW50IHByb2Nlc3MgdmVyc3VzIHRoZSB3cml0aW5nIG9mIGRldGFpbGVkIGFsdGVybmF0aXZlIGZsb3dzIHdoaWNoIHdvdWxkIGJlIHBlcmZvcm1lZCBtdWNoIGxhdGVyLiAgQWxsIHRoZXNlIHBhcnRzIG9yIHN0ZXBzIHdpdGhpbiB0aGUgc2FtZSBUYXNrIGRlZmluZSB0aGUgIm1ldGhvZCIgb2YgRGV2ZWxvcGluZyBhIFVzZSBDYXNlIE1vZGVsLiAgQXBwbHlpbmcgc3VjaCBhIG1ldGhvZCBpbiBhIGxpZmVjeWNsZSAoaS5lLiBpbiBhIHByb2Nlc3MpIGlzIGRlZmluaW5nIHdoaWNoIHN0ZXBzIGFyZSBkb25lIHdoZW4gZ29pbmcgZnJvbSBvbmUgaXRlcmF0aW9uIHRvIHRoZSBuZXh0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudEVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1hbmRhdG9yeUlucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3V0cHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcHRpb25hbElucHV0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iRXN0aW1hdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJUb29sTWVudG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrRGVmaW5pdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6TWV0aG9kRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlY29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBvc3Rjb25kaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50Q2F0ZWdvcnkiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50RWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi1BIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVGFzayIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViRGlzY2lwbGluZSIgdHlwZT0idW1hOkRpc2NpcGxpbmUiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJlZmVyZW5jZVdvcmtmbG93IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRpc2NpcGxpbmVHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Q29udGVudENhdGVnb3J5Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkRpc2NpcGxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRG9tYWluIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgcmVmaW5lYWJsZSBoaWVyYXJjaHkgZ3JvdXBpbmcgcmVsYXRlZCB3b3JrIHByb2R1Y3RzLiAgSW4gb3RoZXIgd29yZHMsIERvbWFpbnMgY2FuIGJlIGZ1cnRoZXIgZGl2aWRlZCBpbnRvIHN1Yi1kb21haW5zLCB3aXRoIHdvcmsgcHJvZHVjdCBlbGVtZW50cyB0byBiZSBjYXRlZ29yaXplZCBvbmx5IGF0IHRoZSBsZWFmLWxldmVsIG9mIHRoaXMgaGllcmFyY2h5LgotRG9tYWluIGlzIGEgbG9naWNhbCBncm91cGluZyBvZiB3b3JrIHByb2R1Y3RzIHRoYXQgaGF2ZSBhbiBhZmZpbml0eSB0byBlYWNoIG90aGVyIGJhc2VkIG9uIHJlc291cmNlcywgdGltaW5nLCBvciByZWxhdGlvbnNoaXAuICBBIERvbWFpbiBtYXkgYmUgZGl2aWRlZCBpbnRvIHN1YmRvbWFpbnMuICBGb3IgZXhhbXBsZSwgR1MgTWV0aG9kIHVzZXMgc2l4IHByZWRlZmluZWQgRG9tYWlucyBmb3IgV29yayBQcm9kdWN0czogQXBwbGljYXRpb24sIEFyY2hpdGVjdHVyZSwgQnVzaW5lc3MsIEVuZ2FnZW1lbnQsIE9wZXJhdGlvbnMgYW5kIE9yZ2FuaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3ViZG9tYWluIiB0eXBlPSJ1bWE6RG9tYWluIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+T3JnYW5pemVzIFJvbGVzIGludG8gY2F0ZWdvcmllcy4gIEl0IGlzIHVzZWQgdG8gZ3JvdXAgcm9sZXMgdG9nZXRoZXIgdGhhdCBoYXZlIGNlcnRhaW4gY29tbW9uYWxpdGllcy4gIEZvciBleGFtcGxlLCB0aGUgIkFuYWx5c3RzIiBSb2xlIFNldCBjb3VsZCBncm91cCB0aGUgIkJ1c2luZXNzIFByb2Nlc3MgQW5hbHlzdCIsICJTeXN0ZW0gQW5hbHlzdCIsIGFzIHdlbGwgYXMgIlJlcXVpcmVtZW50cyBTcGVjaWZpZXIiIHJvbGVzLiAgQWxsIG9mIHRoZXNlIHdvcmsgd2l0aCBzaW1pbGFyIHRlY2huaXF1ZXMgYW5kIGhhdmUgb3ZlcmxhcHBpbmcgc2tpbGxzLCBidXQgYXJlIHJlcXVpcmVkIGFzIGRpc3RpbmN0IHJvbGVzIGZvciBhIG1ldGhvZCAoZS5nLiB0aGUgbWV0aG9kIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGJhc2VkIG9uKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2xlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVTZXRHcm91cGluZyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Sb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZVNldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUb29sIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgY29udGFpbmVyL2FnZ3JlZ2F0ZSBmb3IgVG9vbE1lbnRvcnMuICBJdCBjYW4gYWxzbyBwcm92aWRlIGdlbmVyYWwgZGVzY3JpcHRpb25zIG9mIHRoZSB0b29sIGFuZCBpdHMgZ2VuZXJhbCBjYXBhYmlsaXRpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iVG9vbE1lbnRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJXb3JrUHJvZHVjdFR5cGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzZWNvbmQgY2F0ZWdvcnkgZm9yIHdvcmsgcHJvZHVjdHMsIHdoaWNoIGluIGNvbnRyYXN0IHRvIERvbWFpbiBpcyBtb3JlIHByZXNlbnRhdGlvbiBvcmllbnRlZC4gIEEgd29yayBwcm9kdWN0IGNhbiBoYXZlIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRXhhbXBsZXMsIGZvciBhIFdvcmsgUHJvZHVjdCBUeXBlIGlzICJDbGFzcyBEaWFncmFtIiwgd2hpY2ggY2F0ZWdvcml6ZXMgdGhlIEFydGlmYWN0cyBBbmFseXNpcyBNb2RlbCwgRGVzaWduIE1vZGVsLCBVc2VyIEV4cGVyaWVuY2UgTW9kZWwsIG9yICJTcGVjaWZpY2F0aW9uIiwgd2hpY2ggY2F0ZWdvcml6ZXMgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb25zIHRoYXQgZGVmaW5lIGEgc3lzdGVtIHdpdGggYSB3ZWxsLWRlZmluZWQgc3lzdGVtIGJvdW5kYXJ5LCBzdWNoIGFzIHVzZSBjYXNlIG9yIGZ1bmN0aW9uYWwgcmVxdWlyZW1lbnRzIHNwZWNpZmljYXRpb24uICBBIFdvcmsgUHJvZHVjdCBjYW4gYmUgY2F0ZWdvcml6ZWQgdG8gYmUgb2YgbWFueSBXb3JrIFByb2R1Y3QgVHlwZXMuICBGb3IgZXhhbXBsZSwgYSB1c2UgY2FzZSBtb2RlbCBjYW4gYmUgY2F0ZWdvcml6ZWQgYXMgYSBTcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgRGlhZ3JhbSBXb3JrIFByb2R1Y3QgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnRDYXRlZ29yeSI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJXb3JrUHJvZHVjdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDdXN0b21DYXRlZ29yeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNhdGVnb3J5IGludHJvZHVjZWQgYnkgYSBtZXRob2QgY29udGVudCBhdXRob3IgdG8gc3RydWN0dXJlIGFueSBudW1iZXIgb2YgbWV0aG9kIENvbnRlbnQgRWxlbWVudHMgb2YgYW55IHN1YnR5cGUgYmFzZWQgb24gdXNlci1kZWZpbmVkIGNyaXRlcmlhLiAgQmVjYXVzZSBDb250ZW50IENhdGVnb3JpZXMgKGFuZCB0aGVyZWZvcmUgQ3VzdG9tIENhdGVnb3JpZXMsIHRvbykgYXJlIENvbnRlbnQgRWxlbWVudHMgdGhlbXNlbHZlcywgQ3VzdG9tIENhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcmVjdXJzaXZlbHkgY2F0ZWdvcml6ZSBDb250ZW50IENhdGVnb3JpZXMgYXMgd2VsbC4gIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBhbHNvIGJlIG5lc3RlZCB3aXRoIGFueSBDb250ZW50IENhdGVnb3J5LiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gY2F0ZWdvcml6ZSBjb250ZW50IGJhc2VkIG9uIHRoZSB1c2VyJ3MgY3JpdGVyaWEgYXMgd2VsbCBhcyB0byBkZWZpbmUgd2hvbGUgdHJlZS1zdHJ1Y3R1cmVzIG9mIG5lc3RlZCBjYXRlZ29yaWVzIGFsbG93aW5nIHRoZSB1c2VyIHRvIHN5c3RlbWF0aWNhbGx5IG5hdmlnYXRlIGFuZCBicm93c2UgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBiYXNlZCBvbiB0aGVzZSBjYXRlZ29yaWVzLiAgRm9yIGV4YW1wbGUsIG9uZSBjb3VsZCBjcmVhdGUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gbG9naWNhbGx5IG9yZ2FuaXplIGNvbnRlbnQgcmVsZXZhbnQgZm9yIHRoZSB1c2VyJ3MgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIGRlcGFydG1lbnRzOyBlLmcuIGEgIlRlc3RpbmciIGNhdGVnb3J5IHRoYXQgZ3JvdXBzIHRvZ2V0aGVyIGFsbCByb2xlcywgd29yayBwcm9kdWN0cywgdGFza3MsIGFuZCBndWlkYW5jZSBlbGVtZW50IHJlbGV2YW50IHRvIHRlc3RpbmcuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgY2F0ZWdvcmllcyB0aGF0IGV4cHJlc3MgbGljZW5zaW5nIGxldmVscyBvZiB0aGUgY29udGVudCBncm91cGluZyBmcmVlbHkgZGlzdHJpYnV0YWJsZSBtZXRob2QgY29udGVudCB2ZXJzdXMgY29udGVudCB0aGF0IHJlcHJlc2VudCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgYW5kIHJlcXVpcmVzIGEgbGljZW5zZSB0byBiZSBwdXJjaGFzZWQgdG8gYmUgYWJsZSB0byB1c2UgaXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpDb250ZW50Q2F0ZWdvcnkiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2F0ZWdvcml6ZWRFbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJDYXRlZ29yeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQYWNrYWdlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGFic3RyYWN0IGNsYXNzIGZvciBwYWNrYWdpbmcgTWV0aG9kIEVsZW1lbnRzLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBzaGFsbCBiZSBsb2NhdGVkIGluIGV4YWN0bHkgb25lIG9mIE1ldGhvZCBQYWNrYWdlJ3MgY29uY3JldGUgc3BlY2lhbGl6YXRpb25zIChlLmcuIENvbnRlbnQgUGFja2FnZSkuICAgTWV0aG9kIFBhY2thZ2UgZGVmaW5lcyBjb21tb24gcHJvcGVydGllcyBmb3IgYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuIEVsZW1lbnRzIGFyZSBvcmdhbml6ZWQgaW4gTWV0aG9kIFBhY2thZ2VzIHRvIHN0cnVjdHVyZSBsYXJnZSBzY2FsZSBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdG8gZGVmaW5lIGEgbWVjaGFuaXNtIGZvciByZXVzZS4gIE1ldGhvZCBFbGVtZW50cyBmcm9tIG9uZSBwYWNrYWdlIGNhbiByZXVzZSBlbGVtZW50IGZyb20gb3RoZXIgcGFja2FnZXMgYnkgZGVmaW5pbmcgYSByZXVzZWRQYWNrYWdlcyBsaW5rLiAgRm9yIGV4YW1wbGUsIGEgd29yayBwcm9kdWN0IGRlZmluZWQgaW4gb25lIHBhY2thZ2UgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgZm9yIFRhc2tzIGRlZmluZWQgaW4gb3RoZXIgcGFja2FnZXMuICBCeSByZXVzaW5nIGl0IGZyb20gb25lIGNvbW1vbiBwbGFjZSAoaS5lLiB0aGUgcGFja2FnZSBpbiB3aGljaCBpdCBoYXMgYmVlbiBkZWZpbmVkKSBlbnN1cmVzIHRoYXQgbm8gcmVkdW5kYW50IGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIGVsZW1lbnRzIGFyZSByZXF1aXJlZC4gIEFsc28gbWFpbnRlbmFuY2Ugb2YgbWV0aG9kIGNvbnRlbnQgaXMgZ3JlYXRseSBpbXByb3ZlZCBhcyBjaGFuZ2VzIGNhbiBiZSBwZXJmb3JtZWQgaW4gb25seSBvbmUgcGxhY2UuICBOb3RlLCB0aGF0IG90aGVyIHBhY2thZ2VzIHdpbGwgaW50cm9kdWNlIG1vcmUgc3BlY2lhbGl6YXRpb25zIG9mIE1ldGhvZCBQYWNrYWdlLCBlLmcuIFByb2Nlc3MgUGFja2FnZSBhbmQgUHJvY2VzcyBDb21wb25lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RFbGVtZW50Ij4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlJldXNlZFBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik1ldGhvZFBhY2thZ2UiIHR5cGU9InVtYTpNZXRob2RQYWNrYWdlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9Imdsb2JhbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIFBhY2thZ2VzIGNhbiBoYXZlIGEgZ2xvYmFsIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgZXZlcnkgb3RoZXIgTWV0aG9kIFBhY2thZ2UgY2FuIHNlZSB0aGUgZ2xvYmFsIHBhY2thZ2UncyBjb250ZW50cy4gIEdsb2JhbCBNZXRob2QgUGFja2FnZXMgYXJlIHByaW1hcmlseSB1c2VkIHRvIHN0b3JlIGNvbW1vbmx5IHVzZWQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgc3VjaCBhcyBmb3IgRGlzY2lwbGluZXMgb3IgRG9tYWlucywgd2hpY2ggYXJlIHVzZWQgYnkgbWFueSBUYXNrIGFuZCBXb3JrIFByb2R1Y3RzIHJlc3BlY3RpdmVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDb250ZW50UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBjb250YWlucyBDb250ZW50IEVsZW1lbnRzIGFuZCBDb250ZW50IEVsZW1lbnRzLCBvbmx5LiAgRXhhbXBsZXMgZm9yIENvbnRlbnQgRWxlbWVudCBhcmUgQXJ0aWZhY3RzLCBUYXNrcywgUm9sZXMsIGV0Yy4gIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRFbGVtZW50IiB0eXBlPSJ1bWE6Q29udGVudEVsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29udGVudENhdGVnb3J5UGFja2FnZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgTWV0aG9kIFBhY2thZ2UgdGhhdCBvbmx5IGNvbnRhaW5zIENvbnRlbnQgQ2F0ZWdvcnkgRWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkNvbnRlbnRDYXRlZ29yeSIgdHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeSIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQcm9jZXNzRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpYmFibGVFbGVtZW50Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUGxhbm5pbmdEYXRhIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgUHJvY2VzcyBFbGVtZW50IHRoYXQgYWRkcyBwbGFubmluZyBkYXRhIHRvIEJyZWFrZG93biBFbGVtZW50cyB3aGVuIGl0IGlzIHVzZWQgZm9yIGEgUHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZS4gIEZvciBEZWxpdmVyeSBQcm9jZXNzZXMgYW5kIENhcGFiaWxpdHkgUGF0dGVybnMgdGhpcyBjbGFzcyBjYW4gZWl0aGVyIG5vdCBiZSBpbnN0YW50aWF0ZWQgb3IgcG9wdWxhdGVkIHdpdGggZGVmYXVsdCBkYXRhLgotUGxhbm5pbmcgRGF0YSBmYWN0b3JzIG91dCBzcGVjaWZpYyBvcHRpb25hbCBkYXRhIG5lZWRlZCBmb3IgcmVwcmVzZW50aW5nIHBsYW5uaW5nIHRlbXBsYXRlcy4gIFRoaXMgYXNzb2NpYXRpb24gYWxsb3dzIHRvIGFjY2VzcyBwbGFubmluZyBkYXRhIGlmIGl0IGlzIHN0b3JlZCBmb3IgdGhlIEJyZWFrZG93biBFbGVtZW50LgotKE5PVEUsIFRIRSBBVFRSSUJVVEVTIEZPUiBUSElTIENMQVNTIEFSRSBOT1QgQ09NUExFVEUsIFlFVCk8L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NFbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdGFydERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBzdGFydCBkYXRlIGZvciBhIHBsYW5lZCBUYXNrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpbmlzaERhdGUiIHR5cGU9InhzZDpkYXRlVGltZSI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVmYXVsdCBmaW5pc2ggZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyYW5rIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkZWZhdWx0IHJhbmsgZm9yIGEgcGxhbmVkIFRhc2suPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQnJlYWtkb3duRWxlbWVudCI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3IgYW55IHR5cGUgb2YgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEl0IGRlZmluZXMgYSBzZXQgb2YgcHJvcGVydGllcyBhdmFpbGFibGUgdG8gYWxsIG9mIGl0cyBzcGVjaWFsaXphdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzRWxlbWVudCI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlc2VudGVkQWZ0ZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUHJlc2VudGVkQmVmb3JlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBsYW5uaW5nRGF0YSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJBY3Rpdml0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5QcmVmaXggcmVwcmVzZW50cyBhbiBhZGRpdGlvbmFsIGxhYmVsIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgYXMgYSBwcmVmaXggdG8gYW55IEJyZWFrZG93biBFbGVtZW50IHRvIGluZGljYXRlIGEgdXNlci1kZWZpbmVkIHN1Yi10eXBlIGZvciB0aGUgZWxlbWVudC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcHJvY2VzcyBlbmdpbmVlciB3b3VsZCBsaWtlIHRvIGRpc3Rpbmd1aXNoIGhpcyBBY3Rpdml0aWVzIGJ5ICdNb2R1bGUnIChhcyBkb25lIGluIHRoZSBJQk0gUmF0aW9uYWwgU3VtbWl0IEFzY2VuZGFudCBNZXRob2QpLCBoZSBjYW4gZGVmaW5lIGEgZGlmZmVyZW50IHByZWZpeCBmb3IgZXZlcnkgbW9kZWwgdG8gYmUgdXNlZCBpbiBhZGRpdGlvbiB0byBuYW1pbmcgQWN0aXZpdGllcywgZS5nLiAiU1JBLkVzdGFibGlzaCBSZXF1aXJlbWVudHMiIHdpdGggU1JBIGluZGljYXRpbmcgdGhhdCB0aGlzIEFjdGl2aXR5IGJlbG9uZ3MgdG8gdGhlICJTb2Z0d2FyZSBSZXF1aXJlbWVudHMgQW5hbHlzaXMiIG1vZHVsZS4gIEFub3RoZXIgY29tbW9uIGFwcGxpY2F0aW9uIGZvciBwcmVmaXggaXMgdG8gcXVhbGlmeSByb2xlcyBpbiBSb2xlIERlc2NyaXB0b3JzLiAgRm9yIGV4YW1wbGUsICJDdXN0b21lci5BcmNoaXRlY3QiIHdvdWxkIGRlZmluZSBhICJDdXN0b21lciIgcHJlZml4IGZvciB0aGUgUm9sZSBEZXNjcmlwdG9yICJBcmNoaXRlY3QiIGV4cHJlc3NpbmcgdGhhdCB0aGlzIGlzIGFuIGFyY2hpdGVjdCBvbiB0aGUgY3VzdG9tZXIgc2lkZSBhbmQgbm90IHRoZSBkZXZlbG9wbWVudCB0ZWFtIHNpZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNQbGFubmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGtleSBhcHBsaWNhdGlvbiBmb3IgRGV2ZWxvcG1lbnQgUHJvY2Vzc2VzIGV4cHJlc3NlZCB3aXRoIEJyZWFrZG93biBzdHJ1Y3R1cmVzIGlzIHRvIGdlbmVyYXRlIGEgcHJvamVjdCBwbGFuIGZyb20gaXQuICBBIHByb2Nlc3MgYXMgZGVmaW5lZCBpbiBVTUEgKGNmLiB3aXRoIFNlY3Rpb25zIFhYIGFuZCA1LjIpIGlzIGEgbXVsdGktZGltZW5zaW9uYWwgc3RydWN0dXJlIGRlZmluaW5nIHdoYXQgd29yayBpcyBiZWluZyBwZXJmb3JtZWQgYXQgd2hhdCB0aW1lIGJ5IHdoaWNoIHJvbGVzIHVzaW5nIHdoaWNoIGlucHV0IGFuZCBwcm9kdWNpbmcgd2hhdCBvdXRwdXRzLiAgQSBwcm9qZWN0IHBsYW4gYXMgaXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvamVjdCBwbGFubmluZyB0b29scyBzdWNoIGFzIElCTSBSYXRpb25hbCBQb3J0Zm9saW8gTWFuYWdlciBvciBNaWNyb3NvZnQgUHJvamVjdCBub3JtYWxseSBkb2VzIG5vdCBuZWVkIGFsbCB0aGlzIGluZm9ybWF0aW9uIGFuZCBpcyBub3JtYWxseSBsaW1pdGVkIHRvIGp1c3QgcmVwcmVzZW50aW5nIGEgc3Vic2V0LiAgRm9yIGV4YW1wbGUsIGEgdHlwaWNhbCBNUyBQcm9qZWN0IHBsYW4gb25seSByZXByZXNlbnRzIHRoZSB3b3JrIGJyZWFrZG93biBjb25zaXN0aW5nIG9mIFRhc2tzIGFuZCBBY3Rpdml0aWVzIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgc3VtbWFyeSB0YXNrcykuICBJdCBkb2VzIG5vdCBzaG93IHRoZSBpbnB1dCBhbmQgb3V0cHV0IFdvcmsgUHJvZHVjdHMgZm9yIGEgVGFzaywgYnV0IGl0IGNhbiBzaG93IHdoaWNoIHJvbGVzIHNoYWxsIGJlIHN0YWZmZWQgZm9yIHBlcmZvcm1pbmcgdGhlIFRhc2suICBIb3dldmVyLCBzdWNoIHJvbGUgYWxsb2NhdGlvbiBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggY29uY3JldGUgcmVzb3VyY2VzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgcGxhbiBmb3IgYSBjb25jcmV0ZSBwcm9qZWN0LiAgU29tZXRpbWVzIHByb2plY3QgcGxhbnMgY2FuIHRoZW4gYWdhaW4gYmUgb3JnYW5pemVkIGRpZmZlcmVudGx5IGJ5IG9yZ2FuaXppbmcgd29yayBieSBkZWxpdmVyYWJsZXMgaW4gd2hpY2ggV29yayBQcm9kdWN0cyBhcmUgbWFwcGVkIHRvIHRoZSBwbGFuJ3Mgc3VtbWFyeSB0YXNrcyBhbmQgVGFzayB0aGF0IGhhdmUgdGhlc2Ugd29yayBwcm9kdWN0cyBhcyBvdXRwdXQgbWFwcGVkIGJlbG93IHN1Y2ggYXMgc3VtbWFyeSB0YXNrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgY2FuIG1ha2UgcmVjb21tZW5kYXRpb25zIGFib3V0IHdoaWNoIGVsZW1lbnRzIHRvIGluY2x1ZGUgYW5kIHdoaWNoIHRvIGV4Y2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGEgcGxhbi4gIFdoZW4gdGhlIGlzUGxhbm5lZCBhdHRyaWJ1dGUgaXMgc2V0IHRvIEZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBhIEJyZWFrZG93biBFbGVtZW50LCB0aGVuIHRoaXMgZWxlbWVudCBzaGFsbCBub3QgYmUgbm90IGluY2x1ZGVkIHdoZW4gYSBjb25jcmV0ZSBwcm9qZWN0IHBsYW4gaXMgYmVpbmcgZ2VuZXJhdGVkIGZyb20gdGhlIGJyZWFrZG93biBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGlzIGVsZW1lbnQuCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5KdXN0IGFzIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIHRoZSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzIGF0dHJpYnV0ZSBoYXMgYW4gaW1wYWN0IG9uIGdlbmVyYXRpbmcgcGxhbnMgZnJvbSBhIFByb2Nlc3MuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIEJyZWFrZG93biBFbGVtZW50IHRoZW4gaXQgd2lsbCB0eXBpY2FsbHkgb2NjdXIgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lIEFjdGl2aXR5LiAgRm9yIGV4YW1wbGUsIGEgVGFzayBzdWNoIGFzICJEZXRhaWwgVXNlIENhc2UiIHdvdWxkIGJlIHBlcmZvcm1lZCBmb3IgZXZlcnkgdXNlIGNhc2UgaWRlbnRpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBvciBBY3Rpdml0eS4gIEdlbmVyYXRpbmcgYSBwbGFuIHdvdWxkIGxpc3Qgb25lIFRhc2sgaW5zdGFuY2UgcGVyIHVzZSBjYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzT3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGF0IHRoZSBCcmVha2Rvd24gRWxlbWVudCBkZXNjcmliZXMgd29yaywgYSB3b3JrIHJlc3VsdCwgb3IgZXZlbiB3b3JrIHJlc291cmNlcywgd2hpY2ggaW5jbHVzaW9uIGlzIG5vdCBtYW5kYXRvcnkgd2hlbiBwZXJmb3JtaW5nIGEgcHJvamVjdCB0aGF0IGlzIHBsYW5uZWQgYmFzZWQgb24gYSBwcm9jZXNzIGNvbnRhaW5pbmcgdGhpcyBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IldvcmtPcmRlciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIEJyZWFrZG93biBFbGVtZW50cyBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnRzIGRlcGVuZHMgb24gdGhlIHN0YXJ0IG9yIGZpbmlzaCBvZiBhbm90aGVyIEJyZWFrZG93biBFbGVtZW50cyBpbiBvcmRlciB0byBiZWdpbiBvciBlbmQuICAKLVRoZSBXb3JrIE9yZGVyIGNsYXNzIGRlZmluZXMgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciByZWxhdGlvbnMgYW1vbmdzdCBCcmVha2Rvd24gRWxlbWVudHMuICBUaGlzIGluZm9ybWF0aW9uIGlzIGluIHBhcnRpY3VsYXIgY3JpdGljYWwgZm9yIHBsYW5uaW5nIGFwcGxpY2F0aW9ucy4gIFNlZSBtb3JlIGRldGFpbHMgb24gZGlmZmVyZW50IHR5cGVzIG9mIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwcyBhdCBXb3JrIE9yZGVyIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpzaW1wbGVDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGlua1R5cGUiIHR5cGU9InVtYTpXb3JrT3JkZXJUeXBlIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgYXR0cmlidXRlIGV4cHJlc3NlcyB0aGUgdHlwZSBvZiB0aGUgV29yayBPcmRlciByZWxhdGlvbnNoaXAgYnkgYXNzaWduaW5nIGEgdmFsdWUgZnJvbSB0aGUgV29yayBPcmRlciBUeXBlIGVudW1lcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpzaW1wbGVDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJlZGVjZXNzb3IiIHR5cGU9InVtYTpXb3JrT3JkZXIiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXNSZXBlYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc09uZ29pbmciIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImlzRXZlbnREcml2ZW4iIHR5cGU9InhzZDpib29sZWFuIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpc0V2ZW50RHJpdmVuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gZGVzY3JpYmVzIGFuIGluc3RhbmNlIG9mIHdvcmsgd2hpY2ggaXMgbm90IHN0YXJ0ZWQgYmVjYXVzZSBpdCBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gc3RhcnQgYXQgYSBjZXJ0YWluIHBvaW50IG9mIHRpbWUsIGJlY2F1c2UgcHJlY2VkaW5nIHdvcmsgaXMgYmVpbmcgY29tcGxldGVkLCBvciBpbnB1dCB3b3JrIHByb2R1Y3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIGFub3RoZXIgc3BlY2lmaWMgZXZlbnQgaGFzIG9jY3VycmVkLiAgRXhhbXBsZXMgZm9yIHN1Y2ggZXZlbnRzIGFyZSBleGNlcHRpb25zIG9yIHByb2JsZW0gc2l0dWF0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpZmljIHdvcmsgdG8gYmUgcGVyZm9ybWVkIGFzIGEgcmVzdWx0LiAgQWxzbyBjaGFuZ2UgbWFuYWdlbWVudCB3b3JrIGNhbiBiZSBtb2RlbGVkIGFzIGV2ZW50IGRyaXZlbiB3b3JrIGFuYWx5emluZyBhIGNoYW5nZSByZXF1ZXN0IG9yIGRlZmVjdCBhbmQgYWxsb2NhdGluZyB3b3JrIGR5bmFtaWNhbGx5IHRvIHJlc291cmNlcyB0byBkZWFsIHdpdGggaXQgZm9sbG93aW5nIHRoZSB3b3JrIGRlc2NyaWJlZCB3aXRoIHN1Y2ggUHJvY2VzcyBXb3JrIERlZmluaXRpb24uICBUaGUgZXZlbnRzIHRoZW1zZWx2ZXMgYXJlIG5vdCBtb2RlbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gIFRoZXkgc2hhbGwgYmUgZGVzY3JpYmVkIGFzIHBhcnQgb2YgdGhlIG5vcm1hbCBkZXNjcmlwdGlvbnMgZmllbGRzIGF2YWlsYWJsZS4KLTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Ik1pbGVzdG9uZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBzaWduaWZpY2FudCBldmVudCBpbiBhIGRldmVsb3BtZW50IHByb2plY3QsIHN1Y2ggYXMgYSBtYWpvciBkZWNpc2lvbiwgY29tcGxldGlvbiBvZiBhIGRlbGl2ZXJhYmxlLCBvciBtZWV0aW5nIG9mIGEgbWFqb3IgZGVwZW5kZW5jeSAobGlrZSBjb21wbGV0aW9uIG9mIGEgcHJvamVjdCBwaGFzZSkuICBCZWNhdXNlLCBNaWxlc3RvbmUgaXMgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byBib3RoIHRoZSBldmVudCBpdHNlbGYgYW5kIHRoZSBwb2ludCBpbiB0aW1lIGF0IHdoaWNoIHRoZSBldmVudCBpcyBzY2hlZHVsZWQgdG8gaGFwcGVuLCBpdCBpcyBtb2RlbGVkIGFzIGEgQnJlYWtkb3duIEVsZW1lbnQgKGkuZS4gaXQgYXBwZWFycyBhcyBwYXJ0IG9mIGEgYnJlYWtkb3duIHN0cnVjdHVyZSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpXb3JrQnJlYWtkb3duRWxlbWVudCIvPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFjdGl2aXR5Ij4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLUFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6V29ya0JyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByZWNvbmRpdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQb3N0Y29uZGl0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkJyZWFrZG93bkVsZW1lbnQiIHR5cGU9InVtYTpCcmVha2Rvd25FbGVtZW50Ii8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ2hlY2tsaXN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQ29uY2VwdCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4YW1wbGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJHdWlkZWxpbmUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJSb2FkbWFwIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmV1c2FibGVBc3NldCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlN1cHBvcnRpbmdNYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IldoaXRlcGFwZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5VHlwZSIgdHlwZT0idW1hOlZhcmlhYmlsaXR5VHlwZSIvPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJJc0VuYWN0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJQaGFzZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgQWN0aXZpdHkgd2hpY2ggcHJlc2NyaWJlcyBwcmUtZGVmaW5lZCB2YWx1ZXMgZm9yIGl0cyBpbnN0YW5jZXMgZm9yIHRoZSBhdHRyaWJ1dGVzIHByZWZpeCAoJ1BoYXNlJykgYW5kIGlzUmVwZWF0YWJsZSAoJ0ZhbHNlJykuICBJdCBoYXMgYmVlbiBpbmNsdWRlZCBpbnRvIHRoZSBtZXRhLW1vZGVsIGZvciBjb252ZW5pZW5jZSBhbmQgdG8gcHJvdmlkZSBhIHNwZWNpYWwgc3RlcmVvdHlwZSwgYmVjYXVzZSBpdCByZXByZXNlbnRzIGEgdmVyeSBjb21tb25seSB1c2VkIEFjdGl2aXR5IHR5cGUuCi1QaGFzZSByZXByZXNlbnQgYSBzaWduaWZpY2FudCBwZXJpb2QgaW4gYSBwcm9qZWN0LCBlbmRpbmcgd2l0aCBtYWpvciBtYW5hZ2VtZW50IGNoZWNrcG9pbnQsIG1pbGVzdG9uZSBvciBzZXQgb2YgRGVsaXZlcmFibGVzLiAgSXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsIGFzIGEgcHJlZGVmaW5lZCBzcGVjaWFsIEFjdGl2aXR5LCBiZWNhdXNlIG9mIGl0cyBzaWduaWZpY2FuY2UgaW4gZGVmaW5pbmcgYnJlYWtkb3ducy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkFjdGl2aXR5Ii8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iSXRlcmF0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLUl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiLz4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBnZW5lcmFsaXplZCBDb250ZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBCcmVha2Rvd24gRWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkNvbnRlbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idXNhZ2VHdWlkYW5jZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Qcm92aWRlcyBpbmZvcm1hdGlvbiBhbmQgZ3VpZGFuY2Ugb24gdGhlIG1lYW5pbmcgb2YgdGhlIEJvb2xlYW4gZmxhZyB2YWx1ZXMgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyB0aGV5IHNob3VsZCBiZSBvdmVycmlkZGVuLiBGb3IgZXhhbXBsZSwgaXQgZGVzY3JpYmVzIHdoeSB0aGUgYnJlYWtkb3duIGVsZW1lbnQgaXMgb3B0aW9uYWwgb3IgY29uc2lkZXJhdGlvbnMgZm9yIHJlcGVhdGluZyBpdCBhbmQgZGlmZmVyZW5jZXMgaW4gdGhlIGluZGl2aWR1YWwgb2NjdXJyZW5jZXMgb2YgdGhpcyBCcmVha2Rvd24gRWxlbWVudCBhY3Jvc3MgdGhlIGxpZmVjeWNsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhbiBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iQWx0ZXJuYXRpdmVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSG93VG9TdGFmZiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPlByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlB1cnBvc2UiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5TdW1tYXJpemVzIHRoZSBtYWluIHJlYXNvbiBmb3IgcGVyZm9ybWluZyB0aGlzIEFjdGl2aXR5LCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0aXZpdHkgYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhY2hpZXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlc2NyaXB0b3JEZXNjcmlwdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGdlbmVyYWxpemVkIEJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUmVmaW5lZERlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QSBEZXNjcmlwdG9yIG1pZ2h0IGFkZCByZWZpbmVtZW50cyB0byB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0aGUgQ29udGVudCBFbGVtZW50IGl0IHJlZmVycyB0by4gIEZvciBleGFtcGxlLCBpdCBjb3VsZCBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBXb3JrIFByb2R1Y3QgcmVsZXZhbnQgZm9yIHRoZSBzcGVjaWZpYyBwb2ludCBpbiB0aW1lIGluIHRoZSBwcm9jZXNzIHRoaXMgV29yayBQcm9kdWN0IHR5cGUgaXMgYmVpbmcgdXNlZC4gIEl0IGNvdWxkIGRlc2NyaWJlIGFkZGl0aW9uYWwgc2tpbGxzIG5lZWRlZCBmb3IgYSBSb2xlIGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIGEgcHJvY2VzcywgZXRjLiA8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgQWN0aXZpdHkgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIFByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJTY29wZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBQcm9jZXNzLCBpLmUuIHdoaWNoIHR5cGVzIG9mIHByb2plY3RzIGRvZXMgaXQgYWRkcmVzcyBhbmQgd2hpY2ggbm90LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJVc2FnZU5vdGVzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+QW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleHRlcm5hbElkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkFuIGV4dGVybmFsIHZpc2libGUgbnVtYmVyIHRoYXQgaXMgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBkZWxpdmVyeSBwYXR0ZXJucyBhbmQgbW9kZWxzLiBJdCBpcyB1c2VkIGxpa2UgYSBzeW5vbnltLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NEZXNjcmlwdGlvbiI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iU2NhbGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdXRsaW5lcyBjaGFyYWN0ZXJpc3RpY3MgYWJvdXQgdGhlIHNpemUgb2YgYSB0eXBpY2FsIHByb2plY3QgdGhhdCBwZXJmb3JtcyB0aGlzIHByb2plY3QgZXhwcmVzc2VkIGluIHRlYW0gc2l6ZSwgbWFuIHllYXJzLCBldGMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlByb2plY3RDaGFyYWN0ZXJpc3RpY3MiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5DaGFyYWN0ZXJpemVzIHRoZSBwcm9qZWN0IHRoYXQgd291bGQgdHlwaWNhbGx5IHBlcmZvcm0gdGhpcyBQcm9jZXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlJpc2tMZXZlbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkVzdGltYXRpbmdUZWNobmlxdWUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIEVzdGltYXRpb24gVGVjaG5pcXVlcyBwcm92aWRlZCBmb3IgdGhpcyBQcm9jZXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYSBwcm9maWxlIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRlYW0sIHRoZSBkaXN0cmlidXRpb24gb2Ygcm9sZXMsIHNraWxscyByZXF1aXJlZCBmb3IgYSB0ZWFtIHBlcmZvcm1zIGEgcHJvamVjdCBiYXNlZCBvbiB0aGlzIHByb2Nlc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlR5cGVPZkNvbnRyYWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+UHJvdmlkZXMgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29JJ20gY2hhSSdtIG50cmFjdHMgdGhhdCBuZWVkIHRvIGJlIGVzdGFibGlzaGVkIGJldHdlZW4gYSBwcm9qZWN0IHRlYW0gdGhhdCBwZXJmb3JtcyB0aGlzIHByb2Nlc3MgYW5kIGEgY2xpZW50IChlLmcuIGZvciBhbiBJR1MgZW5nYWdlbWVudCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBmb3Igc3BlY2lhbCBCcmVha2Rvd24gRWxlbWVudHMgdGhhdCByZWZlcmVuY2VzIG9uZSBjb25jcmV0ZSBDb250ZW50IEVsZW1lbnQuICBBIGRlc2NyaXB0b3IgcHJvdmlkZXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIENvbnRlbnQgRWxlbWVudCB3aXRoaW4gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBJbiBhZGRpdGlvbiB0byBqdXN0IHJlZmVyZW5jaW5nIENvbnRlbnQgRWxlbWVudHMgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIENvbnRlbnQgRWxlbWVudHMgc3RydWN0dXJhbCByZWxhdGlvbnNoaXBzIGJ5IGRlZmluaW5nIGl0cyBvd24gc2V0cyBvZiBhc3NvY2lhdGlvbnMuCi1EZXNjcmlwdG9ycyBhcmUgdGhlIGtleSBjb25jZXB0IGZvciByZWFsaXppbmcgdGhlIHNlcGFyYXRpb24gb2YgcHJvY2Vzc2VzIGZyb20gbWV0aG9kIGNvbnRlbnQuICBBIERlc2NyaXB0b3IgY2FuIGJlIGNoYXJhY3Rlcml6ZWQgYXMgYSByZWZlcmVuY2Ugb2JqZWN0IGZvciBvbmUgcGFydGljdWxhciBDb250ZW50IEVsZW1lbnQsIHdoaWNoIGhhcyBpdHMgb3duIHJlbGF0aW9uc2hpcHMgYW5kIHByb3BlcnRpZXMuICBXaGVuIGEgRGVzY3JpcHRvciBpcyBjcmVhdGVkIGl0IHNoYWxsIGJlIHByb3ZpZGVkIHdpdGggY29uZ3J1ZW50IGNvcGllcyBvZiB0aGUgcmVsYXRpb25zaGlwcyBkZWZpbmVkIGZvciB0aGUgcmVmZXJlbmNlZCBjb250ZW50IGVsZW1lbnQuICBIb3dldmVyLCBhIHVzZXIgY2FuIG1vZGlmeSB0aGVzZSByZWxhdGlvbnNoaXBzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIHNpdHVhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZC4gPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iV29ya1Byb2R1Y3REZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFdvcmsgUHJvZHVjdCBpbiB0aGUgY29udGV4dCBvZiBvbmUgc3BlY2lmaWMgQWN0aXZpdHkuICBFdmVyeSBicmVha2Rvd24gc3RydWN0dXJlIGNhbiBkZWZpbmUgZGlmZmVyZW50IHJlbGF0aW9uc2hpcHMgb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFJvbGUgRGVzY3JpcHRvcnMuICBUaGVyZWZvcmUgb25lIFdvcmsgUHJvZHVjdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iV29ya1Byb2R1Y3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iSW1wYWN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkltcGFjdHMiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJEZWxpdmVyYWJsZVBhcnRzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTwveHNkOmNob2ljZT4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY3Rpdml0eUVudHJ5U3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+R2l2ZW4gdGhhdCBhbiBpbnN0YW5jZSBvZiBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBoYXMgYmVlbiBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEFjdGl2aXR5LCB0aGVuIHRoZSBBY3Rpdml0eSBFbnRyeSBTdGF0ZSBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIGluc3RhbmNlcyBvZiB0aGUgcmVmZXJlbmNlZCBXb3JrIFByb2R1Y3Qgd2hlbiB3b3JrIG9uIHRoZSBBY3Rpdml0eSBpcyBpbml0aWF0ZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGlzIGJlaW5nIGluaXRpYXRlZCB0aGF0IHVzZSB0aGlzIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGFzIGlucHV0KS4gIAotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjdGl2aXR5RXhpdFN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJPC94c2Q6YXR0cmlidXRlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlJvbGVEZXNjcmlwdG9yIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIFJvbGUgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFJvbGUgRGVzY3JpcHRvcnMgdG8gVGFzayBEZXNjcmlwdG9ycyBhbmQgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBSb2xlIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFJvbGUgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6RGVzY3JpcHRvciI+Ci0JCQkJPHhzZDpzZXF1ZW5jZT4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iUmVzcG9uc2libGVGb3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJUYXNrRGVzY3JpcHRvciI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBwcm94eSBmb3IgYSBUYXNrIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBUYXNrIERlc2NyaXB0b3JzIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhbmQgUm9sZSBEZXNjcmlwdG9ycy4gVGhlcmVmb3JlIG9uZSBUYXNrIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IFRhc2sgRGVzY3JpcHRvcnMgZWFjaCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgYW4gQWN0aXZpdHkgd2l0aCBpdHMgb3duIHNldCBvZiByZWxhdGlvbnNoaXBzLgotQSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzIGlzIHRoYXQgYSBDb250ZW50IEVsZW1lbnQgc3VjaCBhcyBUYXNrIGRlc2NyaWJlcyBhbGwgYXNwZWN0cyBvZiBkb2luZyB3b3JrIGRlZmluZWQgYXJvdW5kIHRoaXMgVGFzay4gIFRoaXMgZGVzY3JpcHRpb24gaXMgbWFuYWdlZCBpbiBzdGVwcywgd2hpY2ggYXJlIG1vZGVsZWQgYXMgU2VjdGlvbnMgb2YgdGhlIFRhc2tzJyBDb250ZW50IERlc2NyaXB0aW9ucy4gIFdoZW4gYXBwbHlpbmcgYSBUYXNrIGluIGEgUHJvY2VzcycgQWN0aXZpdHkgd2l0aCBhIFRhc2sgRGVzY3JpcHRvciBhIFByb2Nlc3MgRW5naW5lZXIgbmVlZHMgdG8gaW5kaWNhdGUgdGhhdCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSBpbiB0aGUgUHJvY2VzcyBkZWZpbml0aW9uIGZvciB3aGljaCB0aGUgVGFzayBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIG9ubHkgYSBzdWJzZXQgb2Ygc3RlcHMgc2hhbGwgYmUgcGVyZm9ybWVkLiAgSGUgZGVmaW5lcyB0aGlzIHNlbGVjdGlvbiB1c2luZyB0aGUgc2VsZWN0ZWRTdGVwcyBhc3NvY2lhdGlvbi4gIElmIGhlIHdhbnRzIHRvIGFkZCBzdGVwcyB0byBhIFRhc2sgRGVzY3JpcHRvciwgaGUgY2FuIGRlc2NyaWJlIHRoZXNlIGVpdGhlciBwcmFnbWF0aWNhbGx5IGluIHRoZSByZWZpbmVkRGVzY3JpcHRpb24gYXR0cmlidXRlIG9yICdwcm9wZXJseScgY3JlYXRlIGEgY29udHJpYnV0aW5nIFRhc2sgdG8gdGhlIFRhc2sgdGhlIFRhc2sgRGVzY3JpcHRvciByZWZlcnMgdG8uCi08L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOldvcmtCcmVha2Rvd25FbGVtZW50Ij4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJUYXNrIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IlBlcmZvcm1lZFByaW1hcmlseUJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQXNzaXN0ZWRCeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkV4dGVybmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJNYW5kYXRvcnlJbnB1dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wdGlvbmFsSW5wdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPdXRwdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPC94c2Q6Y2hvaWNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iU3RlcCIgdHlwZT0idW1hOlNlY3Rpb24iLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQ29tcG9zaXRlUm9sZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLUEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6Um9sZURlc2NyaXB0b3IiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQWdncmVnYXRlZFJvbGUiIHR5cGU9InVtYTpSb2xlIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlRlYW1Qcm9maWxlIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgQnJlYWtkb3duIEVsZW1lbnQgdGhhdCBncm91cHMgUm9sZSBEZXNjcmlwdG9ycyBvciBSZXNvdXJjZSBEZWZpbml0aW9ucyBkZWZpbmluZyBhIG5lc3RlZCBoaWVyYXJjaHkgb2YgdGVhbXMgYW5kIHRlYW0gbWVtYmVycy4KLVdvcmsgYXNzaWdubWVudHMgYW5kIFdvcmsgUHJvZHVjdCByZXNwb25zaWJpbGl0aWVzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSBBY3Rpdml0eSB0byBBY3Rpdml0eSBpbiBhIGRldmVsb3BtZW50IHByb2plY3QuIERpZmZlcmVudCBwaGFzZXMgcmVxdWlyZSBkaWZmZXJlbnQgc3RhZmZpbmcgcHJvZmlsZXMsIGkuZS4gZGlmZmVyZW50IHNraWxscyBhbmQgcmVzb3VyY2VzIGRvaW5nIGRpZmZlcmVudCB0eXBlcyBvZiB3b3JrLiAgVGhlcmVmb3JlLCBhIHByb2Nlc3MgbmVlZHMgdG8gZGVmaW5lIHN1Y2ggZGlmZmVyZW50IHByb2ZpbGVzIGluIGEgZmxleGlibGUgbWFubmVyLiAgV2hlcmVhcyBDb3JlIE1ldGhvZCBDb250ZW50IGRlZmluZXMgc3RhbmRhcmQgcmVzcG9uc2liaWxpdGllcyBhbmQgYXNzaWdubWVudHMsIGEgcHJvY2VzcyBleHByZXNzIGJ5IGEgYnJlYWtkb3duIHN0cnVjdHVyZXMgbmVlZHMgdG8gYmUgYWJsZSByZWZpbmUgYW5kIHJlZGVmaW5lIHRoZXNlIHRocm91Z2hvdXQgaXRzIGRlZmluaXRpb24uICBSb2xlIERlc2NyaXB0b3JzLCBSZXNvdXJjZSBEZWZpbml0aW9ucywgYXMgd2VsbCBhcyBUZWFtIFByb2ZpbGVzIHByb3ZpZGUgdGhlIGRhdGEgc3RydWN0dXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIHRoaXMgZmxleGliaWxpdHkgYW5kIHRvIHByb3ZpZGUgYSBwcm9jZXNzIHVzZXIgd2l0aCB0aGUgY2FwYWJpbGl0eSB0byBkZWZpbmUgZGlmZmVyZW50IHRlYW1zIGFuZCByb2xlIHJlbGF0aW9uc2hpcHMgZm9yIGV2ZXJ5IEFjdGl2aXR5IChpbmNsdWRpbmcgQWN0aXZpdGllcyBvbiBhbnkgbmVzdGluZy1sZXZlbCBhcyB3ZWxsIGFzIEl0ZXJhdGlvbnMgb3IgUGhhc2VzKS4KLUhlbmNlLCBpbiBhZGRpdGlvbiB0byB0aGUgd29yayBicmVha2Rvd24gYW5kIHdvcmsgcHJvZHVjdCBicmVha2Rvd24gc3RydWN0dXJlcyBkZWZpbmVkIHNvIGZhciwgVGVhbSBQcm9maWxlcyBhcmUgdXNlZCB0byBkZWZpbmUgYSB0aGlyZCB0eXBlIG9mIGJyZWFrZG93biBzdHJ1Y3R1cmU6IHRlYW0gYnJlYWtkb3duIHN0cnVjdHVyZXMuICBUaGVzZSBhcmUgY3JlYXRlZCBhcyBhbiBBY3Rpdml0eSBzcGVjaWZpYyBoaWVyYXJjaHkgb2YgVGVhbSBQcm9maWxlcyBjb21wcmlzaW5nIG9mIFJvbGUgRGVzY3JpcHRvcnMgYW5kIFJlc291cmNlIERlZmluaXRpb25zLiAgVGhlc2Ugc3RydWN0dXJlcyBjYW4gYmUgcHJlc2VudGVkIGFzIHdlbGwta25vd24gT3JnLUNoYXJ0cy4gIEp1c3QgYXMgd2l0aCBhbnkgb3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgYW5kIERlc2NyaXB0b3JzLCBUZWFtIFByb2ZpbGVzIGNhbiBiZSBkZWZpbmVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYW55IEFjdGl2aXR5IGluIGEgYnJlYWtkb3duIHN0cnVjdHVyZS4gIEluIG90aGVyIHdvcmRzIGV2ZXJ5IEFjdGl2aXR5IGNhbiBkZWZpbmUgaXRzIG93biBUZWFtIFByb2ZpbGVzIGNvbnNpc3Rpbmcgb2YgQWN0aXZpdHkgc3BlY2lmaWMgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUeXBpY2FsbHksIFRlYW0gUHJvZmlsZXMgYXJlIGRlZmluZWQgb24gdGhlIGxldmVsIG9mIEl0ZXJhdGlvbnMgb3IgUGhhc2VzIG9yIG90aGVyIGhpZ2hlci1sZXZlbCBBY3Rpdml0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOkJyZWFrZG93bkVsZW1lbnQiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUm9sZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iU3VwZXJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJTdWJUZWFtIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3MiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIEFjdGl2aXR5IHRoYXQgZGVzY3JpYmVzIGEgc3RydWN0dXJlIGZvciBwYXJ0aWN1bGFyIHR5cGVzIG9mIGRldmVsb3BtZW50IHByb2plY3RzLiAgVG8gcGVyZm9ybSBzdWNoIGEgZGV2ZWxvcG1lbnQgcHJvamVjdCBhIFByb2Nlc3NlcyB3b3VsZCBiZSAnaW5zdGFudGlhdGVkJyBhbmQgYWRhcHRlZCBmb3IgdGhlIHNwZWNpZmljIHNpdHVhdGlvbi4gIFByb2Nlc3MgaXMgYW4gYWJzdHJhY3QgY2xhc3MgYW5kIHRoaXMgbWV0YS1tb2RlbCBkZWZpbmVzIGRpZmZlcmVudCBzcGVjaWFsIHR5cGVzIG9mIFByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IHByb2Nlc3MgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgYW5kIGRpZmZlcmVudCBzaXR1YXRpb25zIG9mIHByb2Nlc3MgcmV1c2UuICBFdmVyeSBQcm9jZXNzIGNvbXByaXNlcyBvZiBhbmQgaXMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIGFuIG4tbGV2ZWwgYnJlYWtkb3duIHN0cnVjdHVyZSB1c2luZyB0aGUgTmVzdGluZyBhc3NvY2lhdGlvbiBkZWZpbmVkIG9uIEFjdGl2aXR5LgotQ29yZSBNZXRob2QgQ29udGVudCBwcm92aWRlcyBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zLCBkZXNjcmliaW5nIGhvdyB2ZXJ5IHNwZWNpZmljIGRldmVsb3BtZW50IGdvYWxzIGFyZSBhY2hpZXZlZCBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2VtZW50IG9mIHRoZXNlIHN0ZXBzIHdpdGhpbiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZS4gIFByb2Nlc3NlcyB0YWtlIHRoZXNlIG1ldGhvZCBlbGVtZW50cyBhbmQgcmVsYXRlIHRoZW0gaW50byBzZW1pLW9yZGVyZWQgc2VxdWVuY2VzIHRoYXQgYXJlIGN1c3RvbWl6ZWQgdG8gc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdHMuICBUaHVzLCBhIHByb2Nlc3MgaXMgYSBzZXQgb2YgcGFydGlhbGx5IG9yZGVyZWQgd29yayBkZXNjcmlwdGlvbnMgaW50ZW5kZWQgdG8gcmVhY2ggYSBoaWdoZXIgZGV2ZWxvcG1lbnQgZ29hbCwgc3VjaCBhcyB0aGUgcmVsZWFzZSBvZiBhIHNwZWNpZmljIHNvZnR3YXJlIHN5c3RlbS4gIEEgcHJvY2VzcyBhbmQgdGhlIHByb2Nlc3MgbWV0YS1tb2RlbCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9jdXNlcyBvbiB0aGUgbGlmZWN5Y2xlIGFuZCB0aGUgc2VxdWVuY2luZyBvZiB3b3JrIGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgVG8gYWNoaWV2ZSB0aGlzIGl0IHVzZXMgdGhlIERlc2NyaXB0b3IgY29uY2VwdCByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBhbmQgYWxsb3dpbmcgZGVmaW5pbmcgdGltZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucyBvZiB0aGUgcmVmZXJlbmNlZCBjb250ZW50IChlLmcuIGRlZmluaW5nIGEgZm9jdXMgb24gZGlmZmVyZW50IHN0ZXBzIG9mIHRoZSBzYW1lIFRhc2sgYW5kIHByb3ZpZGluZyBpbnB1dCBXb3JrIFByb2R1Y3RzIGluIGRpZmZlcmVudCBzdGF0ZXMgd2l0aGluIHRoZSBkaWZmZXJlbnQgUGhhc2VzIG9mIGEgcHJvY2VzcyBsaWZlY3ljbGUgaW4gd2hpY2ggdGhlIHNhbWUgVGFzayBpcyBwZXJmb3JtZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QWN0aXZpdHkiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJJbmNsdWRlc1BhdHRlcm4iIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iRGVmYXVsdENvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9IlZhbGlkQ29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkRlbGl2ZXJ5UHJvY2VzcyI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLUEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6UHJvY2VzcyI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJDb21tdW5pY2F0aW9uc01hdGVyaWFsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJFZHVjYXRpb25NYXRlcmlhbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOmNob2ljZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi1BIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLS0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0tIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpQcm9jZXNzIi8+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi1BIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3MiPgotCQkJCTx4c2Q6Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iQmFzZVByb2Nlc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc1BhY2thZ2UiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLUEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJPHhzZDpjb21wbGV4Q29udGVudD4KLQkJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InVtYTpNZXRob2RQYWNrYWdlIj4KLQkJCQk8eHNkOmNob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IlByb2Nlc3NFbGVtZW50IiB0eXBlPSJ1bWE6UHJvY2Vzc0VsZW1lbnQiLz4KLQkJCQk8L3hzZDpjaG9pY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db21wcmlzZXMgb2YgYSBsaXN0IG9mIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyAoc2ltaWxhciB0byBvcGVyYXRpb24gZGVjbGFyYXRpb25zKSB0aGF0IGV4cHJlc3MgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciBhIHByb2Nlc3MgY29tcG9uZW50LiAgVGhlc2UgaW50ZXJmYWNlIHNwZWNpZmljYXRpb25zIGFyZSBleHByZXNzZWQgdXNpbmcgVGFzayBEZXNjcmlwdG9ycyB3aGljaCBhcmUgbm90IGxpbmtlZCB0byBUYXNrcyB0aGF0IGFyZSByZWxhdGVkIHRvIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyBhcyB3ZWxsIGFzIG9wdGlvbmFsIGEgUm9sZSBEZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCTwveHNkOmFubm90YXRpb24+Ci0JCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0JCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJ1bWE6QnJlYWtkb3duRWxlbWVudCI+Ci0JCQkJPHhzZDpjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiB0eXBlPSJ1bWE6VGFza0Rlc2NyaXB0b3IiLz4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9IkludGVyZmFjZUlPIiB0eXBlPSJ1bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIi8+Ci0JCQkJPC94c2Q6Y2hvaWNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IlByb2Nlc3NDb21wb25lbnQiPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIFByb2Nlc3MgUGFja2FnZSB0aGF0IGFwcGxpZXMgdGhlIHByaW5jaXBsZXMgb2YgZW5jYXBzdWxhdGlvbi4gIEEgUHJvY2VzcyBDb21wb25lbnQgcmVhbGl6ZXMgb25lIG9yIG1vcmUgSW50ZXJmYWNlcyB3aGljaCBzcGVjaWZ5IGlucHV0cyBhbmQgb3V0cHV0cyBvZiB0aGUgY29tcG9uZW50LiBUaGVyZSBtaWdodCBiZSBtYW55IGNvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBzYW1lIGludGVyZmFjZXMsIGJ1dCB1c2luZyBkaWZmZXJlbnQgdGVjaG5pcXVlcyB0byBhY2hpZXZlIHNpbWlsYXIgb3V0cHV0cyBmb3Igc2ltaWxhciBpbnB1dHMuICBXaGVyZWFzIHRoZSBDb21wb25lbnQgSW50ZXJmYWNlcyByZXByZXNlbnQgY29tcG9uZW50IHNwZWNpZmljYXRpb25zIChibGFjayBib3ggZGVzY3JpcHRpb25zIG9mIHRoZSBjb21wb25lbnQpLCBnb29kIGNhbmRpZGF0ZXMgZm9yIGNvbXBvbmVudCByZWFsaXphdGlvbnMgY2FuIGJlIGZvdW5kIGluIENhcGFiaWxpdHkgUGF0dGVybnMgKHdoaXRlIGJveCBkZXNjcmlwdGlvbnMgZm9yIHRoZSBjb21wb25lbnQpLgotVU1BIHN1cHBvcnRzIHJlcGxhY2VhYmxlIGFuZCByZXVzYWJsZSBQcm9jZXNzIENvbXBvbmVudHMgcmVhbGl6aW5nIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uIENlcnRhaW4gc2l0dWF0aW9ucyBpbiBhIHNvZnR3YXJlIGRldmVsb3BtZW50IHByb2plY3QgbWlnaHQgcmVxdWlyZSB0aGF0IGNvbmNyZXRlIHJlYWxpemF0aW9ucyBvZiBwYXJ0cyBvZiB0aGUgcHJvY2VzcyByZW1haW4gdW5kZWNpZGVkIG9yIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgZXhlY3V0aW5nIHRlYW0gaXRzZWxmIChlLmcuIGluIG91dHNvdXJjaW5nIHNpdHVhdGlvbnMpLiAgVU1BIHByb3ZpZGVzIGEgdW5pcXVlIGNvbXBvbmVudCBjb25jZXB0IGRlZmluaW5nIGludGVyZmFjZXMgZm9yIHdvcmsgcHJvZHVjdCBpbnB1dCBhbmQgb3V0cHV0LCBhbGxvd2luZyB0cmVhdGluZyB0aGUgYWN0dWFsIGRlZmluaXRpb24gb2YgdGhlIHdvcmsgdGhhdCBwcm9kdWNlcyB0aGUgb3V0cHV0cyBhcyBhICJibGFjayBib3giLiAgQXQgYW55IHBvaW50IGR1cmluZyBhIHByb2plY3QgdGhlIGNvbXBvbmVudCAicmVhbGl6YXRpb24iIGRldGFpbGluZyB0aGUgd29yayBjYW4gYmUgYWRkZWQgdG8gdGhlIHByb2Nlc3MuICBUaGUgY29tcG9uZW50IGFwcHJvYWNoIGFsc28gYWxsb3dzIHRoYXQgZGlmZmVyZW50IHN0eWxlcyBvciB0ZWNobmlxdWVzIG9mIGRvaW5nIHdvcmsgY2FuIGJlIHJlcGxhY2VkIHdpdGggb25lIGFub3RoZXIuICBGb3IgZXhhbXBsZSwgYSBzb2Z0d2FyZSBjb2RlIG91dHB1dCBvZiBhIGNvbXBvbmVudCBjb3VsZCBiZSBwcm9kdWNlZCB3aXRoIGEgbW9kZWwtZHJpdmVuIGRldmVsb3BtZW50IG9yIGEgY29kZS1jZW50cmljIHRlY2huaXF1ZS4gIFRoZSBjb21wb25lbnQgY29uY2VwdCBlbmNhcHN1bGF0ZXMgdGhlIGFjdHVhbCB3b3JrIGFuZCBsZXRzIHRoZSBkZXZlbG9wbWVudCB0ZWFtIGNob29zZSB0aGUgYXBwcm9wcmlhdGUgdGVjaG5pcXVlIGFuZCBmaWxsIHRoZSBjb21wb25lbnQncyByZWFsaXphdGlvbiB3aXRoIHRoZWlyIGNob2ljZSBvZiBBY3Rpdml0aWVzIHRoYXQgcHJvZHVjZSB0aGUgcmVxdWlyZWQgb3V0cHV0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOlByb2Nlc3NQYWNrYWdlIj4KLQkJCQk8eHNkOnNlcXVlbmNlPgotCQkJCQk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJDb3B5cmlnaHQiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkJCQkJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iSW50ZXJmYWNlIiB0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iUHJvY2VzcyIgdHlwZT0idW1hOlByb2Nlc3MiLz4KLQkJCQk8L3hzZDpzZXF1ZW5jZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdXRob3JzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkV2ZXJ5IE1ldGhvZCBVbml0IGlzIGJlaW5nIGNyZWF0ZWQgYW5kIG93bmVkIGJ5IGFuIGF1dGhvciBvciBhdXRob3JpbmcgdGVhbS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEYXRlIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiPgotCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGUgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24gaGFzIGJlZW4gbWFkZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjaGFuZ2VEZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQk8L3hzZDphdHRyaWJ1dGU+Ci0JCQkJPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyI+Ci0JCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5FdmVyeSBQYWNrYWdlIGhhcyBhIHZlcnNpb24gbnVtYmVyIHVzZWQgdG8gdHJhY2sgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCTwveHNkOmF0dHJpYnV0ZT4KLQkJCTwveHNkOmV4dGVuc2lvbj4KLQkJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJNZXRob2RQbHVnaW4iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLU1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJSZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQYWNrYWdlIiB0eXBlPSJ1bWE6TWV0aG9kUGFja2FnZSIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJCTx4c2Q6YXR0cmlidXRlIG5hbWU9InVzZXJDaGFuZ2VhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kUGx1Z2luIiB0eXBlPSJ1bWE6TWV0aG9kUGx1Z2luIj4KLQkJPHhzZDphbm5vdGF0aW9uPgotCQkJPHhzZDpkb2N1bWVudGF0aW9uPkEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi1NZXRob2QgUGx1Z2luIGNvbmNlcHR1YWxseSByZXByZXNlbnRzIGEgdW5pdCBmb3IgY29uZmlndXJhdGlvbiwgbW9kdWxhcml6YXRpb24sIGV4dGVuc2lvbiwgcGFja2FnaW5nLCBhbmQgZGVwbG95bWVudCBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBQcm9jZXNzIEVuZ2luZWVyIHNoYWxsIGRlc2lnbiBoaXMgUGx1Z2lucyBhbmQgYWxsb2NhdGUgaGlzIGNvbnRlbnQgdG8gdGhlc2UgUGx1Z2lucyB3aXRoIHJlcXVpcmVtZW50cyBmb3IgZXh0ZW5zaWJpbGl0eSwgbW9kdWxhcml0eSwgcmV1c2UsIGFuZCBtYWludGFpbmFiaWxpdHkgaW4gbWluZC4KLVNwZWNpYWwgZXh0ZW5zaWJpbGl0eSBtZWNoYW5pc21zIGRlZmluZWQgZm9yIHRoZSBtZXRhLWNsYXNzZXMgVmFyaWFiaWxpdHkgRWxlbWVudCBhbmQgUHJvY2VzcyBDb250cmlidXRpb24gYWxsb3cgUGx1Z2luIGNvbnRlbnQgdG8gZGlyZWN0bHkgY29udHJpYnV0ZSBuZXcgY29udGVudCwgcmVwbGFjZSBleGlzdGluZyBjb250ZW50LCBvciB0byBjcm9zcy1yZWZlcmVuY2UgdG8gYW55IENvbnRlbnQgRWxlbWVudCBvciBQcm9jZXNzIHdpdGhpbiBhbm90aGVyIFBsdWdpbiB0aGF0IGl0IGV4dGVuZHMuICBTaW1pbGFyIHRvIFVNTCAyLjAncyAncGFja2FnZSBtZXJnZScgbWVjaGFuaXNtIHRyYW5zZm9ybWF0aW9uIGludGVycHJldGF0aW9ucywgaW50ZXJwcmV0aW5nIHRoZXNlIE1ldGhvZCBQbHVnaW4gbWVjaGFuaXNtcyByZXN1bHRzIGludG8gbmV3IGV4dGVuZGVkIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgTWV0aG9kIE1vZGVscyBhbmQgTWV0aG9kUGFja2FnZXMuIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgZXhwb3J0ZWQgaW50byBpdHMgb3duIHN0YW5kYWxvbmUgbGlicmFyeSB3aGVuIGl0IGluY2x1ZGVzIHRoZSBmdWxsIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiBhbGwgZWxlbWVudHMgYWxsIG90aGVyIGVsZW1lbnRzIGRlcGVuZCBvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJCYXNlQ29uZmlndXJhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCQk8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIgbmFtZT0iTWV0aG9kUGx1Z2luU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQYWNrYWdlU2VsZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9IkRlZmF1bHRWaWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJQcm9jZXNzVmlldyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCQkJCTwveHNkOnNlcXVlbmNlPgotCQkJPC94c2Q6ZXh0ZW5zaW9uPgotCQk8L3hzZDpjb21wbGV4Q29udGVudD4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLQk8eHNkOmVsZW1lbnQgbmFtZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIgdHlwZT0idW1hOk1ldGhvZENvbmZpZ3VyYXRpb24iPgotCQk8eHNkOmFubm90YXRpb24+Ci0JCQk8eHNkOmRvY3VtZW50YXRpb24+QSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIE1ldGhvZCBNb2RlbHMgYW5kIE1ldGhvZFBhY2thZ2VzLiBBIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGV4cG9ydGVkIGludG8gaXRzIG93biBzdGFuZGFsb25lIGxpYnJhcnkgd2hlbiBpdCBpbmNsdWRlcyB0aGUgZnVsbCB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgYWxsIGVsZW1lbnRzIGFsbCBvdGhlciBlbGVtZW50cyBkZXBlbmQgb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJPC94c2Q6YW5ub3RhdGlvbj4KLQk8L3hzZDplbGVtZW50PgotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iTWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCQk8eHNkOmNvbXBsZXhDb250ZW50PgotCQkJPHhzZDpleHRlbnNpb24gYmFzZT0idW1hOk1ldGhvZFVuaXQiPgotCQkJCTx4c2Q6c2VxdWVuY2U+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIiBuYW1lPSJNZXRob2RQbHVnaW4iIHR5cGU9InVtYTpNZXRob2RQbHVnaW4iLz4KLQkJCQkJPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiIG5hbWU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iIHR5cGU9InVtYTpNZXRob2RDb25maWd1cmF0aW9uIi8+Ci0JCQkJPC94c2Q6c2VxdWVuY2U+Ci0JCQk8L3hzZDpleHRlbnNpb24+Ci0JCTwveHNkOmNvbXBsZXhDb250ZW50PgotCTwveHNkOmNvbXBsZXhUeXBlPgotCTx4c2Q6ZWxlbWVudCBuYW1lPSJNZXRob2RMaWJyYXJ5IiB0eXBlPSJ1bWE6TWV0aG9kTGlicmFyeSI+Ci0JCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5BIE1ldGhvZCBMaWJyYXJ5IGlzIGEgcGh5c2ljYWwgY29udGFpbmVyIGZvciBNZXRob2QgUGx1Z2lucyBhbmQgTWV0aG9kIENvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMuICBBbGwgTWV0aG9kIEVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBNZXRob2QgTGlicmFyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQk8L3hzZDphbm5vdGF0aW9uPgotCTwveHNkOmVsZW1lbnQ+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBhNWNiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BY3Rpdml0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQWN0aXZpdHkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgV29yayBEZWZpbml0aW9uIHdoaWNoIHN1cHBvcnRzIHRoZSBuZXN0aW5nIGFuZCBsb2dpY2FsIGdyb3VwaW5nIG9mIHJlbGF0ZWQgQnJlYWtkb3duIEVsZW1lbnRzIGZvcm1pbmcgYnJlYWtkb3duIHN0cnVjdHVyZXMuICBBbHRob3VnaCBBY3Rpdml0eSBpcyBhIGNvbmNyZXRlIG1ldGEtY2xhc3MsIG90aGVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlcml2ZSBmcm9tIGl0OyBzdWNoIGFzIFBoYXNlLCBJdGVyYXRpb24sIERlbGl2ZXJ5IFByb2Nlc3MsIG9yIENhcGFiaWxpdHkgUGF0dGVybi4KLSAqIEFjdGl2aXR5IHJlcHJlc2VudHMgYSBncm91cGluZyBlbGVtZW50IGZvciBvdGhlciBCcmVha2Rvd24gRWxlbWVudHMgc3VjaCBhcyBBY3Rpdml0aWVzLCBEZXNjcmlwdG9ycywgTWlsZXN0b25lcywgZXRjLiAgSXQgaXMgbm90IHBlci1zZSBhICdoaWdoLWxldmVsJyBncm91cGluZyBvZiBvbmx5IHdvcmsgYXMgaW4gb3RoZXIgbWV0YS1tb2RlbHMsIGJ1dCBncm91cHMgYW55IGtpbmQgb2YgQnJlYWtkb3duIEVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIG9uZSBjYW4gZGVmaW5lIHZhbGlkIEFjdGl2aXRpZXMgdGhhdCBncm91cCBvbmx5IFdvcmsgUHJvZHVjdHMgRGVzY3JpcHRvcnMgd2l0aG91dCBhbnkgbWF0Y2hpbmcgVGFzayBEZXNjcmlwdG9ycy4gIEFjdGl2aXRpZXMgYWxzbyBpbmhlcml0IGFsbCBwcm9wZXJ0aWVzIGZyb20gV29yayBCcmVha2Rvd24gRWxlbWVudCBhbmQgaW5kaXJlY3RseSBmcm9tIFByb2Nlc3MgRWxlbWVudDsgaS5lLiBBY3Rpdml0eSBpcyByZWFkeSB0byBoYXZlIGEgZnVsbCBjb250ZW50IGRlc2NyaXB0aW9uIGF0dGFjaGVkIHRvIGl0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0QnJlYWtkb3duRWxlbWVudCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdBY3Rpdml0eScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5IGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUHJlY29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBvc3Rjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bvc3Rjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxCcmVha2Rvd25FbGVtZW50PiBnZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2FkbWFwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9hZG1hcDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlfUm9hZG1hcCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2FkbWFwJyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFbmFjdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFbmFjdGFibGUoKQotCSAqIEBzZWUgI3Vuc2V0SXNFbmFjdGFibGUoKQotCSAqIEBzZWUgI3NldElzRW5hY3RhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J0lzRW5hY3RhYmxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNpc0lzRW5hY3RhYmxlIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SXNFbmFjdGFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRW5hY3RhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjaXNJc0VuYWN0YWJsZSgpCi0JICogQHNlZSAjc2V0SXNFbmFjdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzRW5hY3RhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+Im5hIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9Im5hIiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ZhcmlhYmlsaXR5VHlwZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLX0gLy8gQWN0aXZpdHkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FjdGl2aXR5RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljMzkxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQWN0aXZpdHlEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93VG9TdGFmZiA8ZW0+SG93IFRvIFN0YWZmPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQWN0aXZpdHlEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGl2aXR5RGVzY3JpcHRpb24gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ29tcHJpc2VzIG9mIHN1bW1hcmllcyBkZXNjcmliaW5nIGltcG9ydGFudCBleGNlcHRpb25hbCBhbmQgbm9uLXN0YW5kYXJkIHdheXMgb2YgZG9pbmcgdGhlIHdvcmsgb2YgdGhpcyBBY3Rpdml0eSBub3QgY292ZXJlZCBieSB0aGUgQWN0aXZpdHkncyBUYXNrcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBbHRlcm5hdGl2ZXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbHRlcm5hdGl2ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWx0ZXJuYXRpdmVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgb24gd2hvIHNob3VsZCBiZSBpbnZvbHZlZCBpbiB0aGlzIGFjdGl2aXR5IHdoYXQgYXJlIHRoZSByZXF1aXJlZCBza2lsbHMsIGV4cGVyaWVuY2UsICBhbmQgcGVyaGFwcyBhdHRpdHVkZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhvdyBUbyBTdGFmZjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SG93VG9TdGFmZihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdIb3dUb1N0YWZmJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEhvd1RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93VG9TdGFmZiA8ZW0+SG93IFRvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3cgVG8gU3RhZmY8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhvd1RvU3RhZmYoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFN1bW1hcml6ZXMgdGhlIG1haW4gcmVhc29uIGZvciBwZXJmb3JtaW5nIHRoaXMgQWN0aXZpdHksIGRlc2NyaWJlcyB3aGF0IHRoZSBhY3Rpdml0eSBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFjaGlldmUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBY3Rpdml0eURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyYjU5My4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXBwbGljYWJsZU1ldGFDbGFzc0luZm8uamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbiA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvJyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gZXh0ZW5kcyBQYWNrYWdlYWJsZUVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3Vuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICNzZXRJc1ByaW1hcnlFeHRlbnNpb24oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm9fSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUHJpbWFyeUV4dGVuc2lvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAc2VlICN1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3NldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvI2lzSXNQcmltYXJ5RXh0ZW5zaW9uIDxlbT5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKQotCSAqIEBzZWUgI3NldElzUHJpbWFyeUV4dGVuc2lvbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNQcmltYXJ5RXh0ZW5zaW9uKCk7Ci0KLX0gLy8gQXBwbGljYWJsZU1ldGFDbGFzc0luZm8KZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDNhZTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0FydGlmYWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gYW5kIGRlZmluaXRpb24gZm9yIHRhbmdpYmxlIHdvcmsgcHJvZHVjdCB0eXBlcy4gQXJ0aWZhY3RzIG1heSBiZSBjb21wb3NlZCBvZiBvdGhlciBhcnRpZmFjdHMuIEZvciBleGFtcGxlLCBhIG1vZGVsIGFydGlmYWN0IGNhbiBiZSBjb21wb3NlZCBvZiBtb2RlbCBlbGVtZW50cywgd2hpY2ggYXJlIGFsc28gYXJ0aWZhY3RzLgotICogQXJ0aWZhY3RzIGFyZSB0YW5naWJsZSB3b3JrIHByb2R1Y3RzIGNvbnN1bWVkLCBwcm9kdWNlZCwgb3IgbW9kaWZpZWQgYnkgVGFza3MuICBJdCBtYXkgc2VydmUgYXMgYSBiYXNpcyBmb3IgZGVmaW5pbmcgcmV1c2FibGUgYXNzZXRzLiAgUm9sZXMgdXNlIEFydGlmYWN0cyB0byBwZXJmb3JtIFRhc2tzIGFuZCBwcm9kdWNlIEFydGlmYWN0cyBpbiB0aGUgY291cnNlIG9mIHBlcmZvcm1pbmcgVGFza3MuICBBcnRpZmFjdHMgYXJlIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIHNpbmdsZSBSb2xlLCBtYWtpbmcgcmVzcG9uc2liaWxpdHkgZWFzeSB0byBpZGVudGlmeSBhbmQgdW5kZXJzdGFuZCwgYW5kIHByb21vdGluZyB0aGUgaWRlYSB0aGF0IGV2ZXJ5IHBpZWNlIG9mIGluZm9ybWF0aW9uIHByb2R1Y2VkIGluIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBza2lsbHMuIEV2ZW4gdGhvdWdoIG9uZSByb2xlIG1pZ2h0ICJvd24iIGEgc3BlY2lmaWMgdHlwZSBvZiBBcnRpZmFjdHMsIG90aGVyIHJvbGVzIGNhbiBzdGlsbCB1c2UgdGhlIEFydGlmYWN0czsgcGVyaGFwcyBldmVuIHVwZGF0ZSB0aGVtIGlmIHRoZSBSb2xlIGhhcyBiZWVuIGdpdmVuIHBlcm1pc3Npb24gdG8gZG8gc28uCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3QoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FydGlmYWN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJ0aWZhY3QgZXh0ZW5kcyBXb3JrUHJvZHVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0X0dyb3VwMygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRhaW5lZCBBcnRpZmFjdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGFpbmVkQXJ0aWZhY3QnIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxBcnRpZmFjdD4gZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKTsKLQotfSAvLyBBcnRpZmFjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQXJ0aWZhY3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODk3MzVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9BcnRpZmFjdERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcnRpZmFjdERlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIFdvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGFuIEFydGlmYWN0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0QnJpZWZPdXRsaW5lIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucyA8ZW0+UmVwcmVzZW50YXRpb24gT3B0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbiA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0FydGlmYWN0RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBBcnRpZmFjdERlc2NyaXB0aW9uIGV4dGVuZHMgV29ya1Byb2R1Y3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhpcyBhcnRpZmFjdC4gRm9yIGV4YW1wbGUsIGRpc2N1c3NlcyB0aGUgY29udGVudHMgZm9yIGtleSBjaGFwdGVycyBvZiBhIGRvY3VtZW50IGFydGlmYWN0IG9yIHRoZSBrZXkgcGFja2FnZXMgYW5kIG1vZHVsZXMgb2YgYSBtb2RlbCBhcnRpZmFjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QnJpZWYgT3V0bGluZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QnJpZWZPdXRsaW5lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQnJpZWZPdXRsaW5lJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJyaWVmT3V0bGluZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEaXNjdXNzZXMgZGlmZmVyZW50IHBvc3NpYmxlIGFsdGVybmF0aXZlIHJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGFydGlmYWN0LiBGb3IgZXhhbXBsZSBhIGRlc2lnbiBtb2RlbCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBVTUwgbW9kZWwgb3IgYW4gaW5mb3JtYWwgYmxvY2sgZGlhZ3JhbSBvciBieSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9ubHkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlcHJlc2VudGF0aW9uT3B0aW9ucyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcHJlc2VudGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXByZXNlbnRhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVwcmVzZW50YXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXByZXNlbnRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVwcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlcHJlc2VudGF0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm90YXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vdGF0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdOb3RhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb3RhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90YXRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBBcnRpZmFjdERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9CcmVha2Rvd25FbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmU2ZmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUuICBJdCBkZWZpbmVzIGEgc2V0IG9mIHByb3BlcnRpZXMgYXZhaWxhYmxlIHRvIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0JyZWFrZG93bkVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGVkQWZ0ZXIoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEFmdGVyJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEFmdGVyIDxlbT5QcmVzZW50ZWQgQWZ0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEFmdGVyKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZXNlbnRlZEJlZm9yZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZXNlbnRlZEJlZm9yZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlc2VudGVkQmVmb3JlIDxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50ZWQgQmVmb3JlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRCZWZvcmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRlZEJlZm9yZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQbGFubmluZ0RhdGEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQbGFubmluZ0RhdGEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFBsYW5uaW5nRGF0YSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQbGFubmluZ0RhdGEoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3VwZXJBY3Rpdml0eShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdXBlckFjdGl2aXR5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN1cGVyQWN0aXZpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTdXBlckFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBlckFjdGl2aXR5KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9DaGVja2xpc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2hlY2tsaXN0JyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29uY2VwdCcgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhhbXBsZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeGFtcGxlJyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkd1aWRlbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR3VpZGVsaW5lJyBncm91cD0nI2dyb3VwOjE4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmV1c2FibGVBc3NldCcgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1cHBvcnRpbmdNYXRlcmlhbCcgZ3JvdXA9JyNncm91cDoxOCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V2hpdGVwYXBlcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1doaXRlcGFwZXInIGdyb3VwPScjZ3JvdXA6MTgnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSnVzdCBhcyB0aGUgaXNQbGFubmVkIGF0dHJpYnV0ZSB0aGUgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyBhdHRyaWJ1dGUgaGFzIGFuIGltcGFjdCBvbiBnZW5lcmF0aW5nIHBsYW5zIGZyb20gYSBQcm9jZXNzLiAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBmb3IgYSBCcmVha2Rvd24gRWxlbWVudCB0aGVuIGl0IHdpbGwgdHlwaWNhbGx5IG9jY3VyIG11bHRpcGxlIHRpbWVzIHdpdGhpbiB0aGUgc2FtZSBBY3Rpdml0eS4gIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV0YWlsIFVzZSBDYXNlIiB3b3VsZCBiZSBwZXJmb3JtZWQgZm9yIGV2ZXJ5IHVzZSBjYXNlIGlkZW50aWZpZWQgZm9yIGEgcGFydGljdWxhciBJdGVyYXRpb24gb3IgQWN0aXZpdHkuICBHZW5lcmF0aW5nIGEgcGxhbiB3b3VsZCBsaXN0IG9uZSBUYXNrIGluc3RhbmNlIHBlciB1c2UgY2FzZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBzZWUgI3Vuc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naGFzTXVsdGlwbGVPY2N1cnJlbmNlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA8ZW0+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAc2VlICNzZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogSW5kaWNhdGVzIHRoYXQgdGhlIEJyZWFrZG93biBFbGVtZW50IGRlc2NyaWJlcyB3b3JrLCBhIHdvcmsgcmVzdWx0LCBvciBldmVuIHdvcmsgcmVzb3VyY2VzLCB3aGljaCBpbmNsdXNpb24gaXMgbm90IG1hbmRhdG9yeSB3aGVuIHBlcmZvcm1pbmcgYSBwcm9qZWN0IHRoYXQgaXMgcGxhbm5lZCBiYXNlZCBvbiBhIHByb2Nlc3MgY29udGFpbmluZyB0aGlzIGVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjc2V0SXNPcHRpb25hbChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNPcHRpb25hbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI3Vuc2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc09wdGlvbmFsKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNPcHRpb25hbCA8ZW0+SXMgT3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNPcHRpb25hbCgpCi0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAc2VlICNzZXRJc09wdGlvbmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgT3B0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzT3B0aW9uYWwoKQotCSAqIEBzZWUgI2lzSXNPcHRpb25hbCgpCi0JICogQHNlZSAjc2V0SXNPcHRpb25hbChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNPcHRpb25hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBrZXkgYXBwbGljYXRpb24gZm9yIERldmVsb3BtZW50IFByb2Nlc3NlcyBleHByZXNzZWQgd2l0aCBCcmVha2Rvd24gc3RydWN0dXJlcyBpcyB0byBnZW5lcmF0ZSBhIHByb2plY3QgcGxhbiBmcm9tIGl0LiAgQSBwcm9jZXNzIGFzIGRlZmluZWQgaW4gVU1BIChjZi4gd2l0aCBTZWN0aW9ucyBYWCBhbmQgNS4yKSBpcyBhIG11bHRpLWRpbWVuc2lvbmFsIHN0cnVjdHVyZSBkZWZpbmluZyB3aGF0IHdvcmsgaXMgYmVpbmcgcGVyZm9ybWVkIGF0IHdoYXQgdGltZSBieSB3aGljaCByb2xlcyB1c2luZyB3aGljaCBpbnB1dCBhbmQgcHJvZHVjaW5nIHdoYXQgb3V0cHV0cy4gIEEgcHJvamVjdCBwbGFuIGFzIGl0IGlzIHJlcHJlc2VudGVkIGluIHByb2plY3QgcGxhbm5pbmcgdG9vbHMgc3VjaCBhcyBJQk0gUmF0aW9uYWwgUG9ydGZvbGlvIE1hbmFnZXIgb3IgTWljcm9zb2Z0IFByb2plY3Qgbm9ybWFsbHkgZG9lcyBub3QgbmVlZCBhbGwgdGhpcyBpbmZvcm1hdGlvbiBhbmQgaXMgbm9ybWFsbHkgbGltaXRlZCB0byBqdXN0IHJlcHJlc2VudGluZyBhIHN1YnNldC4gIEZvciBleGFtcGxlLCBhIHR5cGljYWwgTVMgUHJvamVjdCBwbGFuIG9ubHkgcmVwcmVzZW50cyB0aGUgd29yayBicmVha2Rvd24gY29uc2lzdGluZyBvZiBUYXNrcyBhbmQgQWN0aXZpdGllcyAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIHN1bW1hcnkgdGFza3MpLiAgSXQgZG9lcyBub3Qgc2hvdyB0aGUgaW5wdXQgYW5kIG91dHB1dCBXb3JrIFByb2R1Y3RzIGZvciBhIFRhc2ssIGJ1dCBpdCBjYW4gc2hvdyB3aGljaCByb2xlcyBzaGFsbCBiZSBzdGFmZmVkIGZvciBwZXJmb3JtaW5nIHRoZSBUYXNrLiAgSG93ZXZlciwgc3VjaCByb2xlIGFsbG9jYXRpb24gbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIHJlc291cmNlcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIHBsYW4gZm9yIGEgY29uY3JldGUgcHJvamVjdC4gIFNvbWV0aW1lcyBwcm9qZWN0IHBsYW5zIGNhbiB0aGVuIGFnYWluIGJlIG9yZ2FuaXplZCBkaWZmZXJlbnRseSBieSBvcmdhbml6aW5nIHdvcmsgYnkgZGVsaXZlcmFibGVzIGluIHdoaWNoIFdvcmsgUHJvZHVjdHMgYXJlIG1hcHBlZCB0byB0aGUgcGxhbidzIHN1bW1hcnkgdGFza3MgYW5kIFRhc2sgdGhhdCBoYXZlIHRoZXNlIHdvcmsgcHJvZHVjdHMgYXMgb3V0cHV0IG1hcHBlZCBiZWxvdyBzdWNoIGFzIHN1bW1hcnkgdGFzay4gIFRoZXJlZm9yZSwgYSBwcm9jZXNzIGNhbiBtYWtlIHJlY29tbWVuZGF0aW9ucyBhYm91dCB3aGljaCBlbGVtZW50cyB0byBpbmNsdWRlIGFuZCB3aGljaCB0byBleGNsdWRlIHdoZW4gZ2VuZXJhdGluZyBhIHBsYW4uICBXaGVuIHRoZSBpc1BsYW5uZWQgYXR0cmlidXRlIGlzIHNldCB0byBGYWxzZSBmb3IgYW4gaW5zdGFuY2Ugb2YgYSBCcmVha2Rvd24gRWxlbWVudCwgdGhlbiB0aGlzIGVsZW1lbnQgc2hhbGwgbm90IGJlIG5vdCBpbmNsdWRlZCB3aGVuIGEgY29uY3JldGUgcHJvamVjdCBwbGFuIGlzIGJlaW5nIGdlbmVyYXRlZCBmcm9tIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhpcyBlbGVtZW50LgotCSAqIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUGxhbm5lZCgpCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI3NldElzUGxhbm5lZChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc1BsYW5uZWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNQbGFubmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBQbGFubmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUGxhbm5lZCgpCi0JICogQHNlZSAjdW5zZXRJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1BsYW5uZWQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICNpc0lzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzUGxhbm5lZCA8ZW0+SXMgUGxhbm5lZDwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUGxhbm5lZDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0SXNQbGFubmVkKCkKLQkgKiBAc2VlICNpc0lzUGxhbm5lZCgpCi0JICogQHNlZSAjc2V0SXNQbGFubmVkKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRJc1BsYW5uZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJlZml4IHJlcHJlc2VudHMgYW4gYWRkaXRpb25hbCBsYWJlbCB0aGF0IHdpbGwgYmUgcHJlc2VudGVkIGFzIGEgcHJlZml4IHRvIGFueSBCcmVha2Rvd24gRWxlbWVudCB0byBpbmRpY2F0ZSBhIHVzZXItZGVmaW5lZCBzdWItdHlwZSBmb3IgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHByb2Nlc3MgZW5naW5lZXIgd291bGQgbGlrZSB0byBkaXN0aW5ndWlzaCBoaXMgQWN0aXZpdGllcyBieSAnTW9kdWxlJyAoYXMgZG9uZSBpbiB0aGUgSUJNIFJhdGlvbmFsIFN1bW1pdCBBc2NlbmRhbnQgTWV0aG9kKSwgaGUgY2FuIGRlZmluZSBhIGRpZmZlcmVudCBwcmVmaXggZm9yIGV2ZXJ5IG1vZGVsIHRvIGJlIHVzZWQgaW4gYWRkaXRpb24gdG8gbmFtaW5nIEFjdGl2aXRpZXMsIGUuZy4gIlNSQS5Fc3RhYmxpc2ggUmVxdWlyZW1lbnRzIiB3aXRoIFNSQSBpbmRpY2F0aW5nIHRoYXQgdGhpcyBBY3Rpdml0eSBiZWxvbmdzIHRvIHRoZSAiU29mdHdhcmUgUmVxdWlyZW1lbnRzIEFuYWx5c2lzIiBtb2R1bGUuICBBbm90aGVyIGNvbW1vbiBhcHBsaWNhdGlvbiBmb3IgcHJlZml4IGlzIHRvIHF1YWxpZnkgcm9sZXMgaW4gUm9sZSBEZXNjcmlwdG9ycy4gIEZvciBleGFtcGxlLCAiQ3VzdG9tZXIuQXJjaGl0ZWN0IiB3b3VsZCBkZWZpbmUgYSAiQ3VzdG9tZXIiIHByZWZpeCBmb3IgdGhlIFJvbGUgRGVzY3JpcHRvciAiQXJjaGl0ZWN0IiBleHByZXNzaW5nIHRoYXQgdGhpcyBpcyBhbiBhcmNoaXRlY3Qgb24gdGhlIGN1c3RvbWVyIHNpZGUgYW5kIG5vdCB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBzaWRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncHJlZml4JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWZpeCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVmaXggPGVtPlByZWZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWZpeChTdHJpbmcgdmFsdWUpOwotCi19IC8vIEJyZWFrZG93bkVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGM0OTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgQnJlYWtkb3duIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uI2dldFVzYWdlR3VpZGFuY2UgPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYW5kIGd1aWRhbmNlIG9uIHRoZSBtZWFuaW5nIG9mIHRoZSBCb29sZWFuIGZsYWcgdmFsdWVzIGFuZCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhleSBzaG91bGQgYmUgb3ZlcnJpZGRlbi4gRm9yIGV4YW1wbGUsIGl0IGRlc2NyaWJlcyB3aHkgdGhlIGJyZWFrZG93biBlbGVtZW50IGlzIG9wdGlvbmFsIG9yIGNvbnNpZGVyYXRpb25zIGZvciByZXBlYXRpbmcgaXQgYW5kIGRpZmZlcmVuY2VzIGluIHRoZSBpbmRpdmlkdWFsIG9jY3VycmVuY2VzIG9mIHRoaXMgQnJlYWtkb3duIEVsZW1lbnQgYWNyb3NzIHRoZSBsaWZlY3ljbGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzYWdlIEd1aWRhbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVc2FnZUd1aWRhbmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd1c2FnZUd1aWRhbmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVzYWdlR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlR3VpZGFuY2UoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2FwYWJpbGl0eVBhdHRlcm4uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU3MWUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DYXBhYmlsaXR5UGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDYXBhYmlsaXR5UGF0dGVybi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DYXBhYmlsaXR5IFBhdHRlcm48L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBjb21tb24gcHJvY2VzcyBhcmVhcy4gIENhcGFiaWxpdGllcyBQYXR0ZXJucyBleHByZXNzIGFuZCBjb21tdW5pY2F0ZSBwcm9jZXNzIGtub3dsZWRnZSBmb3IgYSBrZXkgYXJlYSBvZiBpbnRlcmVzdCBzdWNoIGFzIGEgRGlzY2lwbGluZSBhbmQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgYnkgcHJvY2VzcyBwcmFjdGl0aW9uZXIgdG8gZ3VpZGUgaGlzIHdvcmsuICBUaGV5IGFyZSBhbHNvIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2tzIHRvIGFzc2VtYmxlIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucyBlbnN1cmluZyBvcHRpbWFsIHJldXNlIGFuZCBhcHBsaWNhdGlvbiBvZiB0aGUga2V5IHByYWN0aWNlcyB0aGV5IGV4cHJlc3MuCi0gKiBBIENhcGFiaWxpdHkgUGF0dGVybiBpcyBhIHNwZWNpYWwgUHJvY2VzcyB0aGF0IGRlc2NyaWJlcyBhIHJldXNhYmxlIGNsdXN0ZXIgb2YgZG9pbmcgd29yayBpbiBhIGdlbmVyYWwgcHJvY2VzcyBhcmVhIHRoYXQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGRldmVsb3BtZW50IGFwcHJvYWNoIHRvIGNvbW1vbiBwcm9ibGVtcy4gIEV4YW1wbGVzIGZvciBDYXBhYmlsaXR5IFBhdHRlcm4gY291bGQgYmUgJ3VzZSBjYXNlLWJhc2VkIHJlcXVpcmVtZW50cyBtYW5hZ2VtZW50JywgJ3VzZSBjYXNlIGFuYWx5c2lzJywgb3IgJ3VuaXQgdGVzdGluZycuIFR5cGljYWxseSBidXQgbm90IG5lY2Vzc2FyaWx5LCBDYXBhYmlsaXR5IFBhdHRlcm5zIGhhdmUgdGhlIHNjb3BlIG9mIG9uZSBkaXNjaXBsaW5lIHByb3ZpZGluZyBhIGJyZWFrZG93biBvZiByZXVzYWJsZSBjb21wbGV4IEFjdGl2aXRpZXMsIHJlbGF0aW9uc2hpcHMgdG8gdGhlIFJvbGVzIHdoaWNoIHBlcmZvcm0gVGFza3Mgd2l0aGluIHRoZXNlIEFjdGl2aXRpZXMsIGFzIHdlbGwgYXMgdG8gdGhlIFdvcmsgUHJvZHVjdHMgdGhhdCBhcmUgdXNlZCBhbmQgcHJvZHVjZWQuICBBIGNhcGFiaWxpdHkgcGF0dGVybiBkb2VzIG5vdCByZWxhdGUgdG8gYW55IHNwZWNpZmljIHBoYXNlIG9yIGl0ZXJhdGlvbiBvZiBhIGRldmVsb3BtZW50IGxpZmVjeWNsZSwgYW5kIHNob3VsZCBub3QgaW1wbHkgYW55LiAgSW4gb3RoZXIgd29yZHMsIGEgcGF0dGVybiBzaG91bGQgYmUgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBpdCBpcyBhcHBsaWNhYmxlIGFueXdoZXJlIGluIGEgRGVsaXZlcnkgUHJvY2Vzcy4gIFRoaXMgZW5hYmxlcyBpdHMgQWN0aXZpdGllcyB0byBiZSBmbGV4aWJseSBhc3NpZ25lZCB0byB3aGF0ZXZlciBwaGFzZXMgdGhlcmUgYXJlIGluIHRoZSBEZWxpdmVyeSBQcm9jZXNzIHRvIHdoaWNoIGl0IGlzIGJlaW5nIGFwcGxpZWQuICBJdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gZGVzaWduIGEgQ2FwYWJpbGl0eSBQYXR0ZXJuIHRvIHByb2R1Y2Ugb25lIG9yIG1vcmUgZ2VuZXJpYyBEZWxpdmVyYWJsZXMuICBUaGUgdHlwaWNhbCBjb25maWd1cmF0aW9uIGlzIHRoYXQgZWFjaCBBY3Rpdml0eSBpbiB0aGUgQ2FwYWJpbGl0eSBQYXR0ZXJuIHByb2R1Y2VzIG9uZSBEZWxpdmVyYWJsZSwgYW5kIHRoZSBsYXN0IFRhc2sgRGVzY3JpcHRvciBpbiB0aGUgQWN0aXZpdHkgZXhwbGljaXRseSBvdXRwdXRzIGp1c3QgdGhpcyBEZWxpdmVyYWJsZS4gIFRoaXMgZW5hYmxlcyB0aGUgcHJvY2VzcyBlbmdpbmVlciB0byBzZWxlY3QgUGF0dGVybnMgb3IganVzdCBBY3Rpdml0aWVzIGJ5IGRlY2lkaW5nIHdoaWNoIERlbGl2ZXJhYmxlcyBhcmUgcmVxdWlyZWQuICBJdCBhbHNvIG9mZmVycyBhIHNpbXBsZSBpbnRlZ3JhdGlvbiBhcHByb2FjaDogYW4gQWN0aXZpdHkgZnJvbSBhIGNhcGFiaWxpdHkgcGF0dGVybiBpcyBsaW5rZWQgdG8gdGhlIFBoYXNlIG9yIEl0ZXJhdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoZSBBY3Rpdml0eSdzIERlbGl2ZXJhYmxlLiAgS2V5IGFwcGxpY2F0aW9ucyBhcmVhcyBvZiAvIGFyZWFzIG9mIHJldXNlIGZvciBDYXBhYmlsaXR5IFBhdHRlcm5zIGFyZToKLSAqIC0gVG8gc2VydmUgYXMgYnVpbGRpbmcgYmxvY2tzIGZvciBhc3NlbWJsaW5nIERlbGl2ZXJ5IFByb2Nlc3NlcyBvciBsYXJnZXIgQ2FwYWJpbGl0eSBQYXR0ZXJucy4gIE5vcm1hbGx5IGRldmVsb3BpbmcgYSBEZWxpdmVyeSBQcm9jZXNzIGlzIG5vdCBkb25lIGZyb20gc2NyYXRjaCBidXQgYnkgc3lzdGVtYXRpY2FsbHkgYXBwbHlpbmcgYW5kIGJpbmRpbmcgcGF0dGVybnMuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgcGF0dGVybiBhcHBsaWNhdGlvbiBvZiAnY29weS1hbmQtbW9kaWZ5Jywgd2hpY2ggYWxsb3dzIHRoZSBwcm9jZXNzIGVuZ2luZWVyIHRvIGluZGl2aWR1YWxseSBjdXN0b21pemUgdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBwYXJ0aWN1bGFyIHNpdHVhdGlvbiBpdCBpcyBhcHBsaWVkIGZvciwgdGhlIFBsdWdpbiBtZXRhLW1vZGVsIHBhY2thZ2UgKFNlY3Rpb24gNi4xKSBpbnRyb2R1Y2VzIGV2ZW4gbW9yZSBzb3BoaXN0aWNhdGVkIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMgdGhhdCBzdXBwb3J0IGR5bmFtaWMgYmluZGluZyBvZiBwYXR0ZXJucyAoaS5lLiB0aGUgcGF0dGVybiBpcyByZWZlcmVuY2VkIGFuZCBub3QgY29waWVkKS4gIFRoaXMgdW5pcXVlIG5ldyB3YXkgb2YgcmV1c2luZyBwcm9jZXNzIGtub3dsZWRnZSBhbGxvd3MgdG8gZmFjdG9yIG91dCBjb21tb25seSByZW9jY3VycmluZyBBY3Rpdml0aWVzIGludG8gcGF0dGVybnMgYW5kIHRvIGFwcGx5IHRoZW0gb3ZlciBhbmQgb3ZlciBhZ2FpbiBmb3IgYSBwcm9jZXNzLiAgV2hlbiB0aGUgcGF0dGVybiBpcyBiZWluZyByZXZpc2VkIG9yIHVwZGF0ZWQsIGFsbCBjaGFuZ2VzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZsZWN0ZWQgaW4gYWxsIHBhdHRlcm4gYXBwbGljYXRpb24gaW4gYWxsIHByb2Nlc3NlcyBiZWNhdXNlIG9mIHRoZSBkeW5hbWljIGJpbmRpbmcuCi0gKiAtIFRvIHN1cHBvcnQgZGlyZWN0IGV4ZWN1dGlvbiBpbiBhIGRldmVsb3BtZW50IHByb2plY3QgdGhhdCBkb2VzIG5vdCB3b3JrIGZvbGxvd2luZyBhIHdlbGwtZGVmaW5lZCBwcm9jZXNzLCBidXQgd29ya3MgYmFzZWQgb24gbG9vc2VseSBjb25uZWN0ZWQgcHJvY2VzcyBmcmFnbWVudHMgb2YgYmVzdCBwcmFjdGljZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIgKGUuZy4gQWdpbGUgRGV2ZWxvcG1lbnQpLgotICogLSBUbyBzdXBwb3J0IHByb2Nlc3MgZWR1Y2F0aW9uIGJ5IGRlc2NyaWJpbmcga25vd2xlZGdlIGZvciBhIGtleSBhcmVhIHN1Y2ggYXMgYmVzdCBwcmFjdGljZXMgb24gaG93IHRvIHBlcmZvcm0gdGhlIHdvcmsgZm9yIGEgRGlzY2lwbGluZSAoZS5nLiBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCksIGZvciBhIHNwZWNpZmljIGRldmVsb3BtZW50IHRlY2huaXF1ZSAoYXNwZWN0LW9yaWVudGVkIGRldmVsb3BtZW50KSwgb3IgYSBzcGVjaWZpYyB0ZWNobmljYWwgYXJlYSAoZS5nLiByZWxhdGlvbmFsIGRhdGFiYXNlIGRlc2lnbiksIHdoaWNoIGlzIHVzZWQgZm9yIGVkdWNhdGlvbiBhbmQgdGVhY2hpbmcuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2FwYWJpbGl0eVBhdHRlcm4nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDYXBhYmlsaXR5UGF0dGVybiBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotfSAvLyBDYXBhYmlsaXR5UGF0dGVybgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DaGVja2xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlZDdkZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ2hlY2tsaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENoZWNrbGlzdC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBpZGVudGlmaWVzIGEgc2VyaWVzIG9mIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSBjb21wbGV0ZWQgb3IgdmVyaS1maWVkLiAgQ2hlY2tsaXN0cyBhcmUgb2Z0ZW4gdXNlZCBpbiByZXZpZXdzIHN1Y2ggYXMgd2Fsa3Rocm91Z2hzIG9yIGluc3BlY3Rpb25zLiAKLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENoZWNrbGlzdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ2hlY2tsaXN0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2hlY2tsaXN0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDaGVja2xpc3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbXBvc2l0ZVJvbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkzMDc0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29tcG9zaXRlUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wb3NpdGVSb2xlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcG9zaXRlIFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUm9sZSBEZXNjcmlwdG9yIHRoYXQgcmVsYXRlcyB0byBtb3JlIHRoZW4gb25lIFJvbGUuICBJdCByZXByZXNlbnRzIGEgZ3JvdXBpbmcgb2YgUm9sZXMgd2l0aCB0aGUgbWFpbiBwdXJwb3NlIG9mIHNpbXBsaWZpY2F0aW9uLCBpLmUuIHJlZHVjaW5nIHRoZSBudW1iZXIgb2Ygcm9sZXMgZm9yIGEgcHJvY2Vzcy4KLSAqIEEgQ29tcG9zaXRlIFJvbGUgaXMgYSBncm91cGluZyBvZiBSb2xlcyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIEFjdGl2aXR5IG9yIFByb2Nlc3MgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgUm9sZXMuICBBIHR5cGljYWwgYXBwbGljYXRpb24gd291bGQgYmUgYSBwcm9jZXNzIGZvciBhIHNtYWxsIHRlYW0gaW4gd2hpY2ggYSBzdGFuZGFyZCBzZXQgb2Ygcm9sZXMgZnJvbSB0aGUgbWV0aG9kIGNvbnRlbnQgd291bGQgYmUgYWxsIHBlcmZvcm1lZCBieSBvbmUgb3IgbW9yZSByZXNvdXJjZS4gIEJ5IHVzaW5nIENvbXBvc2l0ZSBSb2xlIHRoZSBwcm9jZXNzIHdvdWxkIHN1Z2dlc3QgYSB0eXBpY2FsIGNsdXN0ZXJpbmcgb2YgUm9sZXMgdG8gUmVzb3VyY2VzLiAgQSBDb21wb3NpdGUgUm9sZSBjb3VsZCBwZXJmb3JtIGFsbCBUYXNrcyBkZWZpbmVkIGZvciB0aGUgUm9sZXMgaXQgcmVmZXJzIHRvLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUgPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb21wb3NpdGVSb2xlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb21wb3NpdGVSb2xlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9zaXRlUm9sZSBleHRlbmRzIFJvbGVEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZ2dyZWdhdGVkIFJvbGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBZ2dyZWdhdGVkUm9sZScgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFJvbGU+IGdldEFnZ3JlZ2F0ZWRSb2xlKCk7Ci0KLX0gLy8gQ29tcG9zaXRlUm9sZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29uY2VwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmEzMjJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25jZXB0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbmNlcHQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IG91dGxpbmVzIGtleSBpZGVhcyBhc3NvY2lhdGVkIHdpdGggYmFzaWMgcHJpbmNpcGxlcyB1bmRlcmx5aW5nIHRoZSByZWZlcmVuY2VkIGl0ZW0uIENvbmNlcHRzIG5vcm1hbGx5IGFkZHJlc3MgbW9yZSBnZW5lcmFsIHRvcGljcyB0aGFuIEd1aWRlbGluZXMgYW5kIHNwYW4gYWNyb3NzIHNldi1lcmFsIHdvcmsgcHJvZHVjdCBhbmQvb3IgdGFza3MvYWN0aXZpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbmNlcHQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbmNlcHQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25jZXB0IGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBDb25jZXB0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTRlZjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29uc3RyYWludC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIE1ldGhvZCBFbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGNvbmRpdGlvbiBvciByZXN0cmljdGlvbiBleHByZXNzZWQgaW4gbmF0dXJhbCBsYW5ndWFnZSB0ZXh0IG9yIGluIGEgbWFjaGluZSByZWFkYWJsZSBsYW5ndWFnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGVjbGFyaW5nIHNvbWUgb2YgdGhlIHNlbWFudGljcyBvZiBhIE1ldGhvZCBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnN0cmFpbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25zdHJhaW50IGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3RvcmVzIHRoZSBtYWluIGRlZmluaXRpb24gb2YgdGhlIGNvbnN0cmFpbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1haW5EZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nbWFpbkRlc2NyaXB0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE1haW5EZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCNnZXRNYWluRGVzY3JpcHRpb24gPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gQ29uc3RyYWludApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjNzgxNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudENhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDYganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgY2xhc3MgZ2VuZXJhbGl6aW5nIGNvbnRlbnQgY2F0ZWdvcnkgdHlwZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0NvbnRlbnRDYXRlZ29yeScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRDYXRlZ29yeSBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLX0gLy8gQ29udGVudENhdGVnb3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50Q2F0ZWdvcnlQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZDQ0NTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudENhdGVnb3J5UGFja2FnZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBNZXRob2QgUGFja2FnZSB0aGF0IG9ubHkgY29udGFpbnMgQ29udGVudCBDYXRlZ29yeSBFbGVtZW50cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50Q2F0ZWdvcnlQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudENhdGVnb3J5UGFja2FnZSBleHRlbmRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfQ29udGVudENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbnRlbnRDYXRlZ29yeScgZ3JvdXA9JyNncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PENvbnRlbnRDYXRlZ29yeT4gZ2V0Q29udGVudENhdGVnb3J5KCk7Ci0KLX0gLy8gQ29udGVudENhdGVnb3J5UGFja2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmNzQ0ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb250ZW50RGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgTWV0aG9kIEVsZW1lbnQgdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIENvbnRlbnQgRWxlbWVudC4gIEl0IGRlZmluZXMgc3RhbmRhcmQgYXR0cmlidXRlcyBhcHBsaWNhYmxlIGZvciBhbGwgQ29udGVudCBFbGVtZW50IHR5cGVzLiAgU3BlY2lmaWMgQ29udGVudCBFbGVtZW50IHN1Yi10eXBlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBtYXRjaGluZyBDb250ZW50IERlc2NyaXB0aW9uIHN1Yi10eXBlcy4gCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRTZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50RGVzY3JpcHRpb24gZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBTdG9yZXMgdGhlIG1haW4gZGVzY3JpcHRpdmUgdGV4dCBmb3IgdGhlIENvbnRlbnQgRWxlbWVudC4gIEFsbCB0ZXh0IHRoYXQgaXMgbm90IHBhcnQgb2YgYW55IG9mIHRoZSBtb3JlIHNwZWNpZmljIGF0dHJpYnV0ZXMgc2hhbGwgYmUgc3RvcmVkIGhlcmUuICBJZiB0aGUgQ29udGVudCBEZXNjcmlwdGlvbiBpcyBkaXZpZGVkIGludG8gc2VjdGlvbnMgdXNpbmcgdGhlIFNlY3Rpb24gY2xhc3MsIHRoZW4gb25seSB0aGUgdGV4dCBmcm9tIHRoZSAnc3RhcnQnIG9mIHRoZSBjb250ZW50IGRlc2NyaXB0aW9uIHRvIHRoZSBmaXJzdCBzZWN0aW9uIHdpbGwgYmUgc3RvcmVkIGhlcmUgKHNpbWlsYXIgdG8gYSBub3JtYWwgZG9jdW1lbnQgd2hlcmUgeW91IGNhbiBwbGFjZSB0ZXh0IGJldHdlZW4gaXRzIGJlZ2lubmluZyB0byBpdHMgZmlyc3QgZGljdGlvbiBoZWFkaW5nKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYWluRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1haW5EZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBhZHZpc2UgYW5kIGd1aWRhbmNlIG9mIGEgY3JpdGljYWwgbmF0dXJlIGZvciB0aGUgY29udGVudCBlbGVtZW50IGFzIHdlbGwgYXMgd2FybmluZ3MsIGNhdXRpb25zLCBwaXRmYWxscywgZGFuZ2Vycy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2V5IENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRLZXlDb25zaWRlcmF0aW9ucyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdLZXlDb25zaWRlcmF0aW9ucyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU2VjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFNlY3Rpb24+IGdldFNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbiBleHRlcm5hbCB2aXNpYmxlIG51bWJlciB0aGF0IGlzIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgYXJ0aWZhY3QuIFVzZWQgbGlrZSBhIHN5bm9ueW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4dGVybmFsIElkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeHRlcm5hbElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdleHRlcm5hbElkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEV4dGVybmFsSWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEV4dGVybmFsSWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBDb250ZW50RGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvQ29udGVudEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDA2MjhkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudEVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBhbmQgbWFuYWdlZCBhcyBNZXRob2QgQ29udGVudC4KLSAqIENvbnRlbnQgRWxlbWVudHMgcmVwcmVzZW50cyByZXVzYWJsZSBNZXRob2QgQ29udGVudCB0aGF0IGlzIHN1cHBvc2VkIHRvIGJlIG1hbmFnZWQgaW4gQ29udGVudCBQYWNrYWdlcy4gIFRoZSBzZXBhcmF0aW9uIG9mIENvbnRlbnQgRWxlbWVudCBmcm9tIFByb2Nlc3MgRWxlbWVudCBhbGxvd3MgdG8gY2xlYXJseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHB1cmUgbWV0aG9kIGNvbnRlbnQgZnJvbSBjb250ZW50IHRoYXQgaXMgcmVwcmVzZW50ZWQgaW4gcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFdoaXRlcGFwZXIgPGVtPldoaXRlcGFwZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nQ29udGVudEVsZW1lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250ZW50RWxlbWVudCBleHRlbmRzIERlc2NyaWJhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDE8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hlY2tsaXN0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ2hlY2tsaXN0JyBncm91cD0nI2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbmNlcHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbmNlcHQnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGFtcGxlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0V4YW1wbGUnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nR3VpZGVsaW5lJyBncm91cD0nI2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRHdWlkZWxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JldXNhYmxlQXNzZXQnIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBncm91cD0nI2dyb3VwOjE0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1doaXRlcGFwZXInIGdyb3VwPScjZ3JvdXA6MTQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0ibmEiIHVuc2V0dGFibGU9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI3NldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotfSAvLyBDb250ZW50RWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Db250ZW50UGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZWZhYjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0NvbnRlbnRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29udGVudCBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgQ29udGVudCBFbGVtZW50cyBhbmQgQ29udGVudCBFbGVtZW50cywgb25seS4gIEV4YW1wbGVzIGZvciBDb250ZW50IEVsZW1lbnQgYXJlIEFydGlmYWN0cywgVGFza3MsIFJvbGVzLCBldGMuICBBIGtleSBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zIGluIFVNQSBpcyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBNZXRob2QgQ29udGVudCBhbmQgUHJvY2Vzcy4gIFRoaXMgc2VwYXJhdGlvbiBpcyBlbmZvcmNlZCBieSBzcGVjaWFsIHBhY2thZ2UgdHlwZXMsIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGUgbWl4aW5nIG9mIG1ldGhvZCBjb250ZW50IHdpdGggcHJvY2Vzc2VzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRQYWNrYWdlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdDb250ZW50UGFja2FnZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnRlbnRQYWNrYWdlIGV4dGVuZHMgTWV0aG9kUGFja2FnZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjEzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudEVsZW1lbnQnIGdyb3VwPScjZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudEVsZW1lbnQoKTsKLQotfSAvLyBDb250ZW50UGFja2FnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9DdXN0b21DYXRlZ29yeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzk4ODQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0N1c3RvbUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEN1c3RvbUNhdGVnb3J5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q3VzdG9tIENhdGVnb3J5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRlZ29yeSBpbnRyb2R1Y2VkIGJ5IGEgbWV0aG9kIGNvbnRlbnQgYXV0aG9yIHRvIHN0cnVjdHVyZSBhbnkgbnVtYmVyIG9mIG1ldGhvZCBDb250ZW50IEVsZW1lbnRzIG9mIGFueSBzdWJ0eXBlIGJhc2VkIG9uIHVzZXItZGVmaW5lZCBjcml0ZXJpYS4gIEJlY2F1c2UgQ29udGVudCBDYXRlZ29yaWVzIChhbmQgdGhlcmVmb3JlIEN1c3RvbSBDYXRlZ29yaWVzLCB0b28pIGFyZSBDb250ZW50IEVsZW1lbnRzIHRoZW1zZWx2ZXMsIEN1c3RvbSBDYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIHJlY3Vyc2l2ZWx5IGNhdGVnb3JpemUgQ29udGVudCBDYXRlZ29yaWVzIGFzIHdlbGwuICBDdXN0b20gQ2F0ZWdvcmllcyBjYW4gYWxzbyBiZSBuZXN0ZWQgd2l0aCBhbnkgQ29udGVudCBDYXRlZ29yeS4gIEN1c3RvbSBjYXRlZ29yaWVzIGNhbiBiZSB1c2VkIHRvIGNhdGVnb3JpemUgY29udGVudCBiYXNlZCBvbiB0aGUgdXNlcidzIGNyaXRlcmlhIGFzIHdlbGwgYXMgdG8gZGVmaW5lIHdob2xlIHRyZWUtc3RydWN0dXJlcyBvZiBuZXN0ZWQgY2F0ZWdvcmllcyBhbGxvd2luZyB0aGUgdXNlciB0byBzeXN0ZW1hdGljYWxseSBuYXZpZ2F0ZSBhbmQgYnJvd3NlIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMgYmFzZWQgb24gdGhlc2UgY2F0ZWdvcmllcy4gIEZvciBleGFtcGxlLCBvbmUgY291bGQgY3JlYXRlIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGxvZ2ljYWxseSBvcmdhbml6ZSBjb250ZW50IHJlbGV2YW50IGZvciB0aGUgdXNlcidzIGRldmVsb3BtZW50IG9yZ2FuaXphdGlvbiBkZXBhcnRtZW50czsgZS5nLiBhICJUZXN0aW5nIiBjYXRlZ29yeSB0aGF0IGdyb3VwcyB0b2dldGhlciBhbGwgcm9sZXMsIHdvcmsgcHJvZHVjdHMsIHRhc2tzLCBhbmQgZ3VpZGFuY2UgZWxlbWVudCByZWxldmFudCB0byB0ZXN0aW5nLiAgQW5vdGhlciBleGFtcGxlIHdvdWxkIGJlIGNhdGVnb3JpZXMgdGhhdCBleHByZXNzIGxpY2Vuc2luZyBsZXZlbHMgb2YgdGhlIGNvbnRlbnQgZ3JvdXBpbmcgZnJlZWx5IGRpc3RyaWJ1dGFibGUgbWV0aG9kIGNvbnRlbnQgdmVyc3VzIGNvbnRlbnQgdGhhdCByZXByZXNlbnQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGFuZCByZXF1aXJlcyBhIGxpY2Vuc2UgdG8gYmUgcHVyY2hhc2VkIHRvIGJlIGFibGUgdG8gdXNlIGl0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRDYXRlZ29yaXplZEVsZW1lbnQgPGVtPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5I2dldFN1YkNhdGVnb3J5IDxlbT5TdWIgQ2F0ZWdvcnk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0N1c3RvbUNhdGVnb3J5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ3VzdG9tQ2F0ZWdvcnkgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRlZ29yaXplZCBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NhdGVnb3JpemVkRWxlbWVudCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdWIgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViQ2F0ZWdvcnknIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1YkNhdGVnb3J5KCk7Ci0KLX0gLy8gQ3VzdG9tQ2F0ZWdvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcmFibGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGY3NzI2Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBXb3JrIFByb2R1Y3QgdGhhdCBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIGFuZCBkZWZpbml0aW9uIGZvciBwYWNrYWdpbmcgb3RoZXIgV29yayBQcm9kdWN0cywgYW5kIG1heSBiZSBkZWxpdmVyZWQgdG8gYW4gaW50ZXJuYWwgb3IgZXh0ZXJuYWwgcGFydHkuICBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiBUaGVyZWZvcmUsIGEgRGVsaXZlcmFibGUgYWdncmVnYXRlcyBvdGhlciBXb3JrIFByb2R1Y3RzLiAgQSBEZWxpdmVyYWJsZSBpcyB1c2VkIHRvIHByZS1kZWZpbmUgdHlwaWNhbCBvciByZWNvbW1lbmRlZCBjb250ZW50IGluIHRoZSBmb3JtIG9yIHdvcmsgcHJvZHVjdHMgdGhhdCB3b3VsZCBiZSBwYWNrYWdlZCBmb3IgZGVsaXZlcnkuICBUaGUgYWN0dWFsIHBhY2thZ2luZyBvZiB0aGUgRGVsaXZlcmFibGUgaW4gYW4gYWN0dWFsIHByb2Nlc3Mgb3IgZXZlbiBwcm9qZWN0IGNvdWxkIGJlIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVjb21tZW5kYXRpb24uICBEZWxpdmVyYWJsZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGFuIG91dHB1dCBmcm9tIGEgcHJvY2VzcyB0aGF0IGhhcyB2YWx1ZSwgbWF0ZXJpYWwgb3Igb3RoZXJ3aXNlLCB0byBhIGNsaWVudCwgY3VzdG9tZXIgb3Igb3RoZXIgc3Rha2Vob2xkZXIuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSNnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCA8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVsaXZlcmFibGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWxpdmVyYWJsZSBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGl2ZXJlZFdvcmtQcm9kdWN0JyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi19IC8vIERlbGl2ZXJhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyYWJsZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTZjOTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBXb3JrIFByb2R1Y3QgRGVzY3JpcHRpb24gdGhhdCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGZvciBhIERlbGl2ZXJhYmxlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyYWJsZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIERlbGl2ZXJhYmxlIHVzZWQgZm9yIGNsaWVudCBkb2N1bWVudHMgKHByb3Bvc2FsLCBzdGF0ZW1lbnRzIG9mIHdvcmsgb3IgY29udHJhY3R1YWwgYWdyZWVtZW50cykuICBJdCBtaWdodCB1c2UgYSBkaWZmZXJlbnQgbGFuZ3VhZ2UgYW5kIGZvbGxvdyBsZWdhbCBjb25zdHJhaW50cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4dGVybmFsRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldEV4dGVybmFsRGVzY3JpcHRpb24gPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXh0ZXJuYWxEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBQcm92aWRlcyBndWlkYW5jZSBvbiBob3cgdG8gYXNzZW1ibGUgdGhlIGRlbGl2ZXJhYmxlIGZyb20gYWxsIGl0cyByZXF1aXJlZCBpbnB1dHMuICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGNvbW1vbiBjb250ZW50IG1lZGl1bSBhbmQgZm9ybWF0LiAgRGlzdHJpYnV0aW9uIG9mIHRoZSBkZWxpdmVyYWJsZSBpcyBhZGRyZXNzZWQgaW4gdGhpcyBzZWN0aW9uLCBpZiBuZWNlc3NhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFja2FnaW5nR3VpZGFuY2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1BhY2thZ2luZ0d1aWRhbmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFBhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uI2dldFBhY2thZ2luZ0d1aWRhbmNlIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVsaXZlcmFibGVEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZWxpdmVyeVByb2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0NGM5MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzcy5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgUHJvY2VzcyBkZXNjcmliaW5nIGEgY29tcGxldGUgYW5kIGludGVncmF0ZWQgYXBwcm9hY2ggZm9yIHBlcmZvcm1pbmcgYSBzcGVjaWZpYyBwcm9qZWN0IHR5cGUuICBJdCBkZXNjcmliZXMgYSBjb21wbGV0ZSBwcm9qZWN0IGxpZmVjeWNsZSBlbmQtdG8tZW5kIGFuZCBzaGFsbCBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIGZvciBydW5uaW5nIHByb2plY3RzIHdpdGggc2ltaWxhciBjaGFyYWN0ZXJpc3RpY3MgYXMgZGVmaW5lZCBmb3IgdGhlIHByb2Nlc3MuICBBIERlbGl2ZXJ5IFByb2Nlc3MgaXMgcmVsYXRlZCB0byBzcGVjaWZpYyBzdXBwb3J0aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgUm9hZG1hcHMgKGluaGVyaXRlZCB2aWEgQWN0aXZpdHkpIGFzIHdlbGwgYXMgQ29tbXVuaWNhdGlvbnMgYW5kIEVkdWNhdGlvbiBNYXRlcmlhbC4KLSAqIEEgRGVsaXZlcnkgUHJvY2VzcyBpcyBhIFByb2Nlc3MgdGhhdCBjb3ZlcnMgYSB3aG9sZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgZnJvbSBiZWdpbm5pbmcgdG8gZW5kLiAgQSBEZWxpdmVyeSBQcm9jZXNzIHNoYWxsIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3IgcGxhbm5pbmcgYW5kIHJ1bm5pbmcgYSBwcm9qZWN0LiAgSXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBsaWZlY3ljbGUgbW9kZWwgd2l0aCBwcmVkZWZpbmVkIHBoYXNlcywgaXRlcmF0aW9ucywgYW5kIGFjdGl2aXRpZXMgdGhhdCBoYXZlIGJlZW4gZGV0YWlsZWQgYnkgc2VxdWVuY2luZyByZWZlcmVuY2luZyBtZXRob2QgY29udGVudCBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIEl0IGlzIGRlZmluZWQgb24gdGhlIGJhc2lzIG9mIGV4cGVyaWVuY2Ugd2l0aCBwYXN0IHByb2plY3RzIG9yIGVuZ2FnZW1lbnRzLCBhbmQvb3IgdGhlIGJlc3QgcHJhY3RpY2UgdXNlIG9mIGEgZGV2ZWxvcG1lbnQgb3IgZGVsaXZlcnkgYXBwcm9hY2guICBJdCBkZWZpbmVzIHdoYXQgZ2V0cyBwcm9kdWNlZCwgaG93IHRob3NlIGl0ZW1zIGFyZSBwcm9kdWNlZCwgYW5kIHRoZSByZXF1aXJlZCBzdGFmZmluZyBpbiB0aGUgZm9ybSBvZiBpbnRlZ3JhdGVkIFdvcmssIFdvcmsgUHJvZHVjdCwgYW5kIFRlYW0gQnJlYWtkb3duIFN0cnVjdHVyZXMuICBGb3IgZXhhbXBsZSwgYSBwcm9jZXNzIGVuZ2luZWVyIGNhbiBkZWZpbmUgYWx0ZXJuYXRpdmUgRGVsaXZlcnkgUHJvY2Vzc2VzIGZvciBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0cyB0aGF0IGRpZmZlciBpbiB0aGUgc2NhbGUgb2YgdGhlIGVuZ2FnZW1lbnQgYW5kIHN0YWZmaW5nIG5lY2Vzc2FyeSwgdGhlIHR5cGUgb2YgdGhlIHNvZnR3YXJlIGFwcGxpY2F0aW9uIHRvIGJlIGRldmVsb3BlZCwgdGhlIGRldmVsb3BtZW50IG1ldGhvZHMgYW5kIHRlY2hub2xvZ2llcyB0byBiZSB1c2VkLCBldGMuICBBbHRob3VnaCwgdGhlIERlbGl2ZXJ5IFByb2Nlc3MgYWltcyB0byBjb3ZlciBhIHdob2xlIHByb2plY3QgaXQga2VlcHMgY2VydGFpbiBkZWNpc2lvbiB0aGF0IGFyZSB0b28gcHJvamVjdCBzcGVjaWZpYyBvcGVuLiAgRm9yIGV4YW1wbGUsIHRoZSBicmVha2Rvd24gc3RydWN0dXJlIGRlZmluZXMgd2hpY2ggQnJlYWtkb3duIEVsZW1lbnRzIGhhdmUgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb3IgaXMgcmVwZWF0YWJsZSB2aWEgaXQgcmVzcGVjdGl2ZSBhdHRyaWJ1dGVzLCBidXQgZG9lcyBub3Qgc2F5IGhvdyBtYW55IG9jY3VycmVuY2VzIGFuZCBob3cgbWFueSByZXBlYXRzL2l0ZXJhdGlvbnMgaXQgd2lsbCBoYXZlLiAgVGhlc2UgZGVjaXNpb25zIGhhdmUgdG8gYmUgZG9uZSBieSBhIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGEgY29uY3JldGUgcHJvamVjdCwgcHJvamVjdCBwaGFzZSwgb3IgcHJvamVjdCBpdGVyYXRpb25zLiAgQSBEZWxpdmVyeSBQcm9jZXNzIGlzIGFsd2F5cyBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2VzcyBpbiB0ZXJtcyBvZiBjb21wbGV0ZW5lc3Mgb2YgdGhlIGxpZmVjeWNsZSwgYXMgd2VsbCBhcyBpbiB0ZXJtcyBvZiBhbGwgdGhyZWUgdmlld3Mgb24gdGhlIHByb2Nlc3Mgd2hpY2ggYXJlIHRoZSBXb3JrIEJyZWFrZG93biBTdHJ1Y3R1cmUsIFdvcmsgUHJvZHVjdCBCcmVha2Rvd24gU3RydWN0dXJlLCBhbmQgVGVhbSBCcmVha2Rvd24gU3RydWN0dXJlIGhhdmUgdG8gYmUgZnVsbHkgYW5kIGNvbnNpc3RlbnRseSBwb3B1bGF0ZWQuICBDb25zaXN0ZW5jeSBvZiBhIERlbGl2ZXJ5IFByb2Nlc3MgaXMgYWN0dWFsbHkgZW5zdXJlZCBieSB0aGUgZmFjdCB0aGF0IGFsbCB0aHJlZSBicmVha2Rvd25zIGFyZSByZXByZXNlbnRlZCBieSBvbmUgc2luZ2xlIGRhdGEgc3RydWN0dXJlIGFuZCBvbmUgcGFydGljdWxhciBicmVha2Rvd24gc3VjaCBhcyBUZWFtIEJyZWFrZG93biBpcyBqdXN0IGEgdmlldyBvbiB0aGF0IGRhdGEgc3RydWN0dXJlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3MoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RlbGl2ZXJ5UHJvY2Vzcycga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJ5UHJvY2VzcyBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfR3JvdXA0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0NvbW11bmljYXRpb25zTWF0ZXJpYWwnIGdyb3VwPScjZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRWR1Y2F0aW9uTWF0ZXJpYWwnIGdyb3VwPScjZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVkdWNhdGlvbk1hdGVyaWFsKCk7Ci0KLX0gLy8gRGVsaXZlcnlQcm9jZXNzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwNmM2OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgUHJvY2VzcyBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVsaXZlcnkgUHJvY2Vzcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGV4dGVuZHMgUHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogT3V0bGluZXMgY2hhcmFjdGVyaXN0aWNzIGFib3V0IHRoZSBzaXplIG9mIGEgdHlwaWNhbCBwcm9qZWN0IHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9qZWN0IGV4cHJlc3NlZCBpbiB0ZWFtIHNpemUsIG1hbiB5ZWFycywgZXRjLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NhbGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTY2FsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTY2FsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUgPGVtPlNjYWxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2FsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjYWxlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQ2hhcmFjdGVyaXplcyB0aGUgcHJvamVjdCB0aGF0IHdvdWxkIHR5cGljYWxseSBwZXJmb3JtIHRoaXMgUHJvY2VzcwotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvamVjdENoYXJhY3RlcmlzdGljcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJpc2sgTGV2ZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIE91dGxpbmVzIHR5cGljYWwgcHJvamVjdCByaXNrcyB0aGF0IGFyZSBhZGRyZXNzZWQgd2l0aCB0aGlzIHByb2Nlc3MuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJpc2tMZXZlbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSaXNrTGV2ZWwnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Umlza0xldmVsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJpc2sgTGV2ZWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJpc2tMZXZlbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Umlza0xldmVsKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBFc3RpbWF0aW9uIFRlY2huaXF1ZXMgcHJvdmlkZWQgZm9yIHRoaXMgUHJvY2Vzcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEVzdGltYXRpbmdUZWNobmlxdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpbmdUZWNobmlxdWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSA8ZW0+RXN0aW1hdGluZyBUZWNobmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFc3RpbWF0aW5nVGVjaG5pcXVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGEgcHJvZmlsZSBvZiBhIHR5cGljYWwgcHJvamVjdCB0ZWFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHJvbGVzLCBza2lsbHMgcmVxdWlyZWQgZm9yIGEgdGVhbSBwZXJmb3JtcyBhIHByb2plY3QgYmFzZWQgb24gdGhpcyBwcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2plY3RNZW1iZXJFeHBlcnRpc2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgT2YgQ29udHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGJhY2tncm91bmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvSSdtIGNoYUknbSBudHJhY3RzIHRoYXQgbmVlZCB0byBiZSBlc3RhYmxpc2hlZCBiZXR3ZWVuIGEgcHJvamVjdCB0ZWFtIHRoYXQgcGVyZm9ybXMgdGhpcyBwcm9jZXNzIGFuZCBhIGNsaWVudCAoZS5nLiBmb3IgYW4gSUdTIGVuZ2FnZW1lbnQpLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUeXBlT2ZDb250cmFjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1R5cGVPZkNvbnRyYWN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1R5cGVPZkNvbnRyYWN0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRUeXBlT2ZDb250cmFjdCA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpYmFibGVFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzg5YTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaWJhYmxlRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpYmFibGVFbGVtZW50LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpYmFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIG9mIE1ldGhvZCBFbGVtZW50cyBmb3Igd2hpY2ggZXh0ZXJuYWwgcHJlc2VudGF0aW9uIG5hbWVzIGFzIHdlbGwgYXMgY29udGVudCBkZXNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRlZmluZWQsIHN1Y2ggYXMgUm9sZXMgb3IgV29yayBQcm9kdWN0cy4gIFByZXNlbnRhdGlvbiBOYW1lIGFuZCBDb250ZW50IERlc2NyaXB0aW9ucyBhcmUgdHlwaWNhbGx5IGxvY2FsaXplZCB1c2luZyBhIHJlc291cmNlIGFsbG9jYXRpb24gbWVjaGFuaXNtIGZvciBpdHMgU3RyaW5nIHR5cGUgYXR0cmlidXRlcy4KLSAqIFRoaXMgYWJzdHJhY3Rpb24gcmVwcmVzZW50cyBhbGwgZWxlbWVudHMgaW4gdGhlIE1ldGhvZCBDb250ZW50IGFzIHdlbGwgYXMgUHJvY2VzcyBzcGFjZSBmb3Igd2hpY2ggY29uY3JldGUgdGV4dHVhbCBkZXNjcmlwdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGZvcm0gb2YgZG9jdW1lbnRpbmcgYXR0cmlidXRlcyBncm91cGVkIGluIGEgbWF0Y2hpbmcgQ29udGVudCBEZXNjcmlwdGlvbiBpbnN0YW5jZS4gIERlc2NyaWJhYmxlIEVsZW1lbnRzIGFyZSBpbnRlbmRlZCB0byBiZSBwdWJsaXNoZWQgaW4gbWV0aG9kIG9yIHByb2Nlc3MgcHVibGljYXRpb25zIChzaW1pbGFyIHRvIHRoZSBJQk0gUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIHdlYikuICBEZXNjcmliYWJsZSBFbGVtZW50IGRlZmluZXMgdGhhdCB0aGUgZWxlbWVudCBpdCByZXByZXNlbnRzIHdpbGwgaGF2ZSBjb250ZW50ICdhdHRhY2hlZCcgdG8gaXQuICBDb250ZW50IERlc2NyaXB0aW9uIGlzIHRoZSBhYnN0cmFjdGlvbiBmb3IgdGhlIGFjdHVhbCBwbGFjZXMgaW4gd2hpY2ggdGhlIGNvbnRlbnQgaXMgYmVpbmcgcmVwcmVzZW50ZWQuICBUaGlzIHNlcGFyYXRpb24gYWxsb3dzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiBjb3JlIG1ldGhvZCBtb2RlbCBlbGVtZW50cyBkZXNjcmliaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsIGZyb20gdGhlIGFjdHVhbCBkZXNjcmlwdGlvbiBjb250YWluZXIgcHJvdmlkaW5nLCBmb3IgZXhhbXBsZSwgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGNvbnRlbnQgZWxlbWVudCBpbiBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIGxhbmd1YWdlcywgYXVkaWVuY2VzLCBsaWNlbnNpbmcgbGV2ZWxzLCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFByZXNlbnRhdGlvbiA8ZW0+UHJlc2VudGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0RnVsZmlsbCA8ZW0+RnVsZmlsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0Rlc2NyaWJhYmxlRWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlc2NyaWJhYmxlRWxlbWVudCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uKENvbnRlbnREZXNjcmlwdGlvbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVzZW50YXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZXNlbnRhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZ1bGZpbGw8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GdWxmaWxsPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfRnVsZmlsbCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdGdWxmaWxsJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRGdWxmaWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNBYnN0cmFjdCgpCi0JICogQHNlZSAjdW5zZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNzZXRJc0Fic3RyYWN0KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzQWJzdHJhY3QnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzSXNBYnN0cmFjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3Vuc2V0SXNBYnN0cmFjdCgpCi0JICogQHNlZSAjaXNJc0Fic3RyYWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc0Fic3RyYWN0KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3NldElzQWJzdHJhY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldElzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2lzSXNBYnN0cmFjdCA8ZW0+SXMgQWJzdHJhY3Q8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEFic3RyYWN0PC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBzZWUgI3NldElzQWJzdHJhY3QoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzQWJzdHJhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHJlZSBicm93c2VyIHByZXNlbnRhdGlvbnMgYW5kIGJyZWFrZG93biBzdHJ1Y3R1cmVzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob2RlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9kZWljb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdub2RlaWNvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROb2RlaWNvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9kZWljb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb2RlaWNvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIHJlZmVyZW5jZSB0byBhbiBpY29uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGVsaW5nIHdpdGggc3BlY2lmaWMgQ29udGVudCBFbGVtZW50IGluc3RhbmNlcyAoYXMgZ3JhcGhpY2FsIHN0ZXJlb3R5cGVzLCBlLmcuIGEgdXNlIGNhc2Ugc3ltYm9sIGZvciBhIHVzZSBjYXNlIGFydGlmYWN0KSBhcyB3ZWxsIGFzIHB1YmxpY2F0aW9uIG9mIGNvbnRlbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNoYXBlaWNvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2hhcGVpY29uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3NoYXBlaWNvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTaGFwZWljb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRTaGFwZWljb24gPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcGVpY29uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTaGFwZWljb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNoYXBlaWNvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIERlc2NyaWJhYmxlRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTFmY2I0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0b3IuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgZ2VuZXJhbGl6YXRpb24gZm9yIHNwZWNpYWwgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlcyBvbmUgY29uY3JldGUgQ29udGVudCBFbGVtZW50LiAgQSBkZXNjcmlwdG9yIHByb3ZpZGVzIGEgcmVwcmVzZW50YXRpb24gb2YgYSBDb250ZW50IEVsZW1lbnQgd2l0aGluIGJyZWFrZG93biBzdHJ1Y3R1cmVzLiAgSW4gYWRkaXRpb24gdG8ganVzdCByZWZlcmVuY2luZyBDb250ZW50IEVsZW1lbnRzIGl0IGFsbG93cyBvdmVycmlkaW5nIHRoZSBDb250ZW50IEVsZW1lbnRzIHN0cnVjdHVyYWwgcmVsYXRpb25zaGlwcyBieSBkZWZpbmluZyBpdHMgb3duIHNldHMgb2YgYXNzb2NpYXRpb25zLgotICogRGVzY3JpcHRvcnMgYXJlIHRoZSBrZXkgY29uY2VwdCBmb3IgcmVhbGl6aW5nIHRoZSBzZXBhcmF0aW9uIG9mIHByb2Nlc3NlcyBmcm9tIG1ldGhvZCBjb250ZW50LiAgQSBEZXNjcmlwdG9yIGNhbiBiZSBjaGFyYWN0ZXJpemVkIGFzIGEgcmVmZXJlbmNlIG9iamVjdCBmb3Igb25lIHBhcnRpY3VsYXIgQ29udGVudCBFbGVtZW50LCB3aGljaCBoYXMgaXRzIG93biByZWxhdGlvbnNoaXBzIGFuZCBwcm9wZXJ0aWVzLiAgV2hlbiBhIERlc2NyaXB0b3IgaXMgY3JlYXRlZCBpdCBzaGFsbCBiZSBwcm92aWRlZCB3aXRoIGNvbmdydWVudCBjb3BpZXMgb2YgdGhlIHJlbGF0aW9uc2hpcHMgZGVmaW5lZCBmb3IgdGhlIHJlZmVyZW5jZWQgY29udGVudCBlbGVtZW50LiAgSG93ZXZlciwgYSB1c2VyIGNhbiBtb2RpZnkgdGhlc2UgcmVsYXRpb25zaGlwcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBzaXR1YXRpb24gZm9yIHdoaWNoIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvciBleHRlbmRzIEJyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3Vuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNTeW5jaHJvbml6ZWRXaXRoU291cmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICN1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi19IC8vIERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGVzY3JpcHRvckRlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZGZhNGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9yRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBnZW5lcmFsaXplZCBCcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24jZ2V0UmVmaW5lZERlc2NyaXB0aW9uIDxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGVzY3JpcHRvckRlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVzY3JpcHRvckRlc2NyaXB0aW9uIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZpbmVkIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIERlc2NyaXB0b3IgbWlnaHQgYWRkIHJlZmluZW1lbnRzIHRvIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIHRoZSBDb250ZW50IEVsZW1lbnQgaXQgcmVmZXJzIHRvLiAgRm9yIGV4YW1wbGUsIGl0IGNvdWxkIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIFdvcmsgUHJvZHVjdCByZWxldmFudCBmb3IgdGhlIHNwZWNpZmljIHBvaW50IGluIHRpbWUgaW4gdGhlIHByb2Nlc3MgdGhpcyBXb3JrIFByb2R1Y3QgdHlwZSBpcyBiZWluZyB1c2VkLiAgSXQgY291bGQgZGVzY3JpYmUgYWRkaXRpb25hbCBza2lsbHMgbmVlZGVkIGZvciBhIFJvbGUgYXQgdGhhdCBwYXJ0aWN1bGFyIHBvaW50IGluIHRpbWUgaW4gYSBwcm9jZXNzLCBldGMuIAotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlZmluZWREZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZpbmVkRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVmaW5lZERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gRGVzY3JpcHRvckRlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjhhOGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0Rpc2NpcGxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjYXRlZ29yaXphdGlvbiBvZiB3b3JrIChpLmUuIFRhc2tzIGZvciBNZXRob2QgQ29udGVudCksIGJhc2VkIHVwb24gc2ltaWxhcml0eSBvZiBjb25jZXJucyBhbmQgY29vcGVyYXRpb24gb2Ygd29yayBlZmZvcnQuCi0gKiBBIGRpc2NpcGxpbmUgaXMgYSBjb2xsZWN0aW9uIG9mIFRhc2tzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gYSBtYWpvciAnYXJlYSBvZiBjb25jZXJuJyB3aXRoaW4gdGhlIG92ZXJhbGwgcHJvamVjdC4gVGhlIGdyb3VwaW5nIG9mIFRhc2tzIGludG8gZGlzY2lwbGluZXMgaXMgbWFpbmx5IGFuIGFpZCB0byB1bmRlcnN0YW5kaW5nIHRoZSBwcm9qZWN0IGZyb20gYSAndHJhZGl0aW9uYWwnIHdhdGVyZmFsbCBwZXJzcGVjdGl2ZS4gSG93ZXZlciwgdHlwaWNhbGx5LCBmb3IgZXhhbXBsZSwgaXQgaXMgbW9yZSBjb21tb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlcXVpcmVtZW50cyBhY3Rpdml0aWVzIGluIGNsb3NlIGNvb3JkaW5hdGlvbiB3aXRoIGFuYWx5c2lzIGFuZCBkZXNpZ24gYWN0aXZpdGllcy4gU2VwYXJhdGluZyB0aGVzZSBhY3Rpdml0aWVzIGludG8gc2VwYXJhdGUgZGlzY2lwbGluZXMgbWFrZXMgdGhlIGFjdGl2aXRpZXMgZWFzaWVyIHRvIGNvbXByZWhlbmQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93IDxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRGlzY2lwbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NpcGxpbmUgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lX1Rhc2soKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzaycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIERpc2NpcGxpbmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfU3ViRGlzY2lwbGluZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJEaXNjaXBsaW5lJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8RGlzY2lwbGluZT4gZ2V0U3ViRGlzY2lwbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVmZXJlbmNlV29ya2Zsb3cnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJlZmVyZW5jZVdvcmtmbG93KCk7Ci0KLX0gLy8gRGlzY2lwbGluZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9EaXNjaXBsaW5lR3JvdXBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhZWJjZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRGlzY2lwbGluZUdyb3VwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc2NpcGxpbmVHcm91cGluZy5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBVc2VkIHRvIGdyb3VwIERpc2NpcGxpbmVzLiAgRm9yIGV4YW1wbGUsIHRoZSBEaXNjaXBsaW5lIEdyb3VwaW5nICJTb2Z0d2FyZSBEaXNjaXBsaW5lcyIgd291bGQgYmUgdGhlIGdyb3VwIG9mIGFsbCBkaXNjaXBsaW5lcyByZWxhdGVkIHRvIGRldmVsb3Bpbmcgc29mdHdhcmUgc3VjaCBhcyAiUmVxdWlyZW1lbnRzIE1hbmFnZW1lbnQiIG9yICJUZXN0aW5nIjsgIklUIEluZnJhc3RydWN0dXJlIE1hbmFnZW1lbnQiIHdvdWxkIGJlIGEgRGlzY2lwbGluZXMgR3JvdXBpbmcgZm9yIGRpc2NpcGxpbmVzIHN1Y2ggYXMgIklUIE9wZXJhdGlvbmFsIFNlcnZpY2VzIiwgIklUIEN1c3RvbWVyIFJlbGF0aW9uc2hpcHMiLCBvciAiSVQgRW5hYmxpbmcgU2VydmljZXMiLiAgRGlzY2lwbGluZXMgY2FuIGJlIGFzc29jaWF0ZWQgdG8gbW9yZSB0aGFuIG9uZSBEaXNjaXBsaW5lIEdyb3VwaW5nLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldERpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdEaXNjaXBsaW5lR3JvdXBpbmcnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjaXBsaW5lR3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzY2lwbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY2lwbGluZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0Rpc2NpcGxpbmUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldERpc2NpcGxpbmUoKTsKLQotfSAvLyBEaXNjaXBsaW5lR3JvdXBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9jdW1lbnRSb290LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRG9jdW1lbnRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTVjM2EuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvY3VtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRvY3VtZW50IFJvb3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldFhNTE5TUHJlZml4TWFwIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24gPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nJyBraW5kPSdtaXhlZCciCi0gKiBAZXh0ZW5kcyBFRGF0YU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvY3VtZW50Um9vdCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaXhlZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWl4ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NaXhlZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01peGVkKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50V2lsZGNhcmQnIG5hbWU9JzptaXhlZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0TWl4ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlhNTE5TIFByZWZpeCBNYXA8L2I+PC9lbT4nIG1hcC4KLQkgKiBUaGUga2V5IGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIGFuZCB0aGUgdmFsdWUgaXMgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30sCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT4nIG1hcCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicgbWFwLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKQotCSAqIEBtb2RlbCBtYXBUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZ1RvU3RyaW5nTWFwRW50cnk8b3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmcsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nPiIgdHJhbnNpZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3htbG5zOnByZWZpeCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFhNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAuCi0JICogVGhlIGtleSBpcyBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSwKLQkgKiBhbmQgdGhlIHZhbHVlIGlzIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LAotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+JyBtYXAgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5YU0kgU2NoZW1hIExvY2F0aW9uPC9lbT4nIG1hcC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAbW9kZWwgbWFwVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5PG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RyaW5nLCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cmluZz4iIHRyYW5zaWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd4c2k6c2NoZW1hTG9jYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB1cHBlcj0iLTIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZENvbmZpZ3VyYXRpb24nIG5hbWVzcGFjZT0nIyN0YXJnZXROYW1lc3BhY2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RDb25maWd1cmF0aW9uIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGhvZENvbmZpZ3VyYXRpb24oTWV0aG9kQ29uZmlndXJhdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgTGlicmFyeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvY3VtZW50Um9vdF9NZXRob2RMaWJyYXJ5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHVwcGVyPSItMiIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kTGlicmFyeScgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZExpYnJhcnkgZ2V0TWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3BlY2lhbCBNZXRob2QgVW5pdCB0aGF0IHJlcHJlc2VudHMgYSBwaHlzaWNhbCBjb250YWluZXIgZm9yIE1ldGhvZCBQYWNrYWdlcy4gIEl0IGRlZmluZXMgYSBncmFudWxhcml0eSBsZXZlbCBmb3IgdGhlIG1vZHVsYXJpemF0aW9uIGFuZCBvcmdhbml6YXRpb24gb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgTWV0aG9kIFBsdWdpbiBjYW4gZXh0ZW5kIG1hbnkgb3RoZXIgTWV0aG9kIFBsdWdpbnMgYW5kIGl0IGNhbiBiZSBleHRlbmRlZCBieSBtYW55IE1ldGhvZCBQbHVnaW5zLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBzdGFuZC1hbG9uZSwgaS5lLiB3aXRoIG5vIEV4dGVuc2lvbiByZWxhdGlvbnNoaXAgdG8gb3RoZXIgcGx1Zy1pbnMuCi0JICogTWV0aG9kIFBsdWdpbiBjb25jZXB0dWFsbHkgcmVwcmVzZW50cyBhIHVuaXQgZm9yIGNvbmZpZ3VyYXRpb24sIG1vZHVsYXJpemF0aW9uLCBleHRlbnNpb24sIHBhY2thZ2luZywgYW5kIGRlcGxveW1lbnQgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3Nlcy4gIEEgUHJvY2VzcyBFbmdpbmVlciBzaGFsbCBkZXNpZ24gaGlzIFBsdWdpbnMgYW5kIGFsbG9jYXRlIGhpcyBjb250ZW50IHRvIHRoZXNlIFBsdWdpbnMgd2l0aCByZXF1aXJlbWVudHMgZm9yIGV4dGVuc2liaWxpdHksIG1vZHVsYXJpdHksIHJldXNlLCBhbmQgbWFpbnRhaW5hYmlsaXR5IGluIG1pbmQuCi0JICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB1cHBlcj0iLTIiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBsdWdpbicgbmFtZXNwYWNlPScjI3RhcmdldE5hbWVzcGFjZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiB2YWx1ZSk7Ci0KLX0gLy8gRG9jdW1lbnRSb290ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0RvbWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmY1NTI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Eb21haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9tYWluLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9tYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSByZWZpbmVhYmxlIGhpZXJhcmNoeSBncm91cGluZyByZWxhdGVkIHdvcmsgcHJvZHVjdHMuICBJbiBvdGhlciB3b3JkcywgRG9tYWlucyBjYW4gYmUgZnVydGhlciBkaXZpZGVkIGludG8gc3ViLWRvbWFpbnMsIHdpdGggd29yayBwcm9kdWN0IGVsZW1lbnRzIHRvIGJlIGNhdGVnb3JpemVkIG9ubHkgYXQgdGhlIGxlYWYtbGV2ZWwgb2YgdGhpcyBoaWVyYXJjaHkuCi0gKiBEb21haW4gaXMgYSBsb2dpY2FsIGdyb3VwaW5nIG9mIHdvcmsgcHJvZHVjdHMgdGhhdCBoYXZlIGFuIGFmZmluaXR5IHRvIGVhY2ggb3RoZXIgYmFzZWQgb24gcmVzb3VyY2VzLCB0aW1pbmcsIG9yIHJlbGF0aW9uc2hpcC4gIEEgRG9tYWluIG1heSBiZSBkaXZpZGVkIGludG8gc3ViZG9tYWlucy4gIEZvciBleGFtcGxlLCBHUyBNZXRob2QgdXNlcyBzaXggcHJlZGVmaW5lZCBEb21haW5zIGZvciBXb3JrIFByb2R1Y3RzOiBBcHBsaWNhdGlvbiwgQXJjaGl0ZWN0dXJlLCBCdXNpbmVzcywgRW5nYWdlbWVudCwgT3BlcmF0aW9ucyBhbmQgT3JnYW5pemF0aW9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRTdWJkb21haW4gPGVtPlN1YmRvbWFpbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXREb21haW4oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0RvbWFpbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERvbWFpbiBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldERvbWFpbl9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtQcm9kdWN0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWlufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1YmRvbWFpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YmRvbWFpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RG9tYWluX1N1YmRvbWFpbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJkb21haW4nIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxEb21haW4+IGdldFN1YmRvbWFpbigpOwotCi19IC8vIERvbWFpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FbGVtZW50LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjY5OWI0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9FbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVsZW1lbnQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBleHRlbmRzIEVEYXRhT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWxlbWVudCBleHRlbmRzIEVEYXRhT2JqZWN0IHsKLX0gLy8gRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOGYwM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBwcm92aWRlcyBzaXppbmcgbWVhc3VyZXMsIG9yIHN0YW5kYXJkcyBmb3Igc2l6aW5nIHRoZSB3b3JrIGVmZm9ydCBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIHBhcnRpY3VsYXIgcGllY2Ugb2Ygd29yayBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGVpciBzdWNjZXNzZnVsIHVzZS4gSXQgbWF5IGJlIGNvbXByaXNlZCBvZiBlc3RpbWF0aW9uIGNvbnNpZGVyYXRpb25zIGFuZCBlc3RpbWF0aW9uIG1ldHJpY3MuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25NZXRyaWMgPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0RXN0aW1hdGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGUgZXh0ZW5kcyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gTWV0cmljPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25NZXRyaWMnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25NZXRyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotfSAvLyBFc3RpbWF0ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW5nTWV0cmljLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXN0aW1hdGluZ01ldHJpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQ5YTlhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW5nTWV0cmljLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRpbmdNZXRyaWMuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGluZyBNZXRyaWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBkZXNjcmliZXMgYSBtZXRyaWMgb3IgbWVhc3VyZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50IGFuZCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgd29yayBlZmZvcnQgYXMgd2VsbCBhcyBhIHJhbmdlIG9mIHBvdGVudGlhbCBsYWJvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRpbmdNZXRyaWMoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0VzdGltYXRpbmdNZXRyaWMnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFc3RpbWF0aW5nTWV0cmljIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW5nTWV0cmljClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0VzdGltYXRpb25Db25zaWRlcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2JlMmJlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCBxdWFsaWZpZXMgdGhlIHVzYWdlIGFuZCBhcHBsaWNhdGlvbiBvZiBlc3RpbWF0aW9uIG1ldHJpY3MgaW4gdGhlIGRldmVsb3BtZW50IG9mIGFuIGFjdHVhbCBlc3RpbWF0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0V4YW1wbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiMjA0Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvRXhhbXBsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFeGFtcGxlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNiBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2UgdGhhdCByZXByZXNlbnRzIGEgdHlwaWNhbCwgcGFydGlhbGx5IGNvbXBsZXRlZCwgc2FtcGxlIGluc3RhbmNlIG9mIG9uZSBvciBtb3JlIHdvcmsgcHJvZHVjdHMgb3Igc2NlbmFyaW8gbGlrZSBkZXNjcmlwdGlvbnMgb2YgaG93IFRhc2sgbWF5IGJlIHBlcmZvcm1lZC4gRXhhbXBsZXMgY2FuIGJlIHJlbGF0ZWQgdG8gV29yayBQcm9kdWN0cyBhcyB3ZWxsIGFzIFRhc2tzIHRoYXQgcHJvZHVjZSB0aGVtIGFzIHdlbGwgYXMgYW55IG90aGVyIENvbnRlbnQgRWxlbWVudC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEV4YW1wbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0V4YW1wbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBFeGFtcGxlIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBFeGFtcGxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRhbmNlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxZDAxMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGFuY2UuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBHdWlkYW5jZSBpcyBhbiBhYnN0cmFjdCBnZW5lcmFsaXphdGlvbiBvZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gY29udGVudCBlbGVtZW50cyBzdWNoIGFzIFJvbGVzLCBUYXNrcywgYW5kIFdvcmsgUHJvZHVjdHMuICBFeGFtcGxlcyBmb3IgR3VpZGFuY2UgYXJlIEd1aWRlbGluZXMsIFRlbXBsYXRlcywgQ2hlY2tsaXN0cywgVG9vbCBNZW50b3JzLCBFc3RpbWF0ZXMsIFN1cHBvcnRpbmcgTWF0ZXJpYWxzLCBSZXBvcnRzLCBDb25jZXB0cywgZXRjLiAgVGhpcyBwYWNrYWdlIG9ubHkgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGFic3RyYWN0IEd1aWRhbmNlIGNsYXNzLiAgVGhlIHBhY2thZ2UgR3VpZGFuY2UgVHlwZXMgZGVmaW5lcyBjb25jcmV0ZSBndWlkYW5jZSB0eXBlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdHdWlkYW5jZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRhbmNlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotfSAvLyBHdWlkYW5jZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvR3VpZGFuY2VEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTA0ZGNhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkYW5jZURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgR3VpZGFuY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50IDxlbT5BdHRhY2htZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldEd1aWRhbmNlRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRhbmNlRGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBHdWlkYW5jZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGZpZWxkIGlzIHByaW1hcmlseSB1c2VkIGZvciBhdHRhY2htZW50cyBhdWdtZW50aW5nIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBmb3IgZ3VpZGFuY2UuICBJbiBwYXJ0aWN1bGFyIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgVGVtcGxhdGVzLCBFeGFtcGxlcywgYW5kIFJldXNhYmxlIEFzc2V0cyB0byBjb250YWluIHRoZSBhY3R1YWwgYXR0YWNobWVudCBkZXNjcmliZWQgaW4gdGhlIG1haW5EZXNjcmlwdGlvbi4gIEl0IGNhbiBhZGRpdGlvbmFsbHkgY29udGFpbiByZXByZXNlbnRhdGlvbnMgb2YgdGhlIGd1aWRhbmNlIGluIGp1c3QgYSB0aGlyZCBwYXJ0eSBmb3JtYXQsIGUuZy4gUERGLCBNUyBXb3JkLCBvciBXb3JkIFBlcmZlY3QuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dGFjaG1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dGFjaG1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQXR0YWNobWVudCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRhY2htZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dGFjaG1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dGFjaG1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dGFjaG1lbnQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBHdWlkYW5jZURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0d1aWRlbGluZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmI5MDY4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9HdWlkZWxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGVsaW5lLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlsIG9uIGhvdyB0byBwZXJmb3JtIGEgcGFydGljdWxhciB0YXNrIG9yIGdyb3VwaW5nIG9mIHRhc2tzIChlLmcuIGdyb3VwZWQgdG9nZXRoZXIgYXMgYWN0aXZpdGllcykgb3IgdGhhdCBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbCwgcnVsZXMsIGFuZCByZWNvbW1lbmRhdGlvbnMgb24gd29yayBwcm9kdWN0cyBhbmQgdGhlaXIgcHJvcGVydGllcy4gIEFtb25nc3Qgb3RoZXJzLCBpdCBjYW4gaW5jbHVkZSBkZXRhaWxzIGFib3V0IGJlc3QgcHJhY3RpY2VzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBmb3IgZG9pbmcgd29yaywgaG93IHRvIHVzZSBwYXJ0aWN1bGFyIHR5cGVzIG9mIHdvcmsgcHJvZHVjdHMsIGluZm9ybWF0aW9uIG9uIGRpZmZlcmVudCBzdWJ0eXBlcyBhbmQgdmFyaWFudHMgb2YgdGhlIHdvcmsgcHJvZHVjdCBhbmQgaG93IHRoZXkgZXZvbHZlIHRocm91Z2hvdXQgYSBsaWZlY3ljbGUsIGRpc2N1c3Npb25zIG9uIHNraWxscyB0aGUgcGVyZm9ybWluZyByb2xlcyBzaG91bGQgYWNxdWlyZSBvciBpbXByb3ZlIHVwb24sIG1lYXN1cmVtZW50cyBmb3IgcHJvZ3Jlc3MgYW5kIG1hdHVyaXR5LCBldGMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRHdWlkZWxpbmUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J0d1aWRlbGluZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEd1aWRlbGluZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gR3VpZGVsaW5lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0l0ZXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL0l0ZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ4NWI3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9JdGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSXRlcmF0aW9uLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkl0ZXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnSXRlcmF0aW9uJykgYW5kIGlzUmVwZWF0YWJsZSAoJ1RydWUnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIEl0ZXJhdGlvbiBncm91cHMgYSBzZXQgb2YgbmVzdGVkIEFjdGl2aXRpZXMgdGhhdCBhcmUgcmVwZWF0ZWQgbW9yZSB0aGFuIG9uY2UuICBJdCByZXByZXNlbnRzIGFuIGltcG9ydGFudCBzdHJ1Y3R1cmluZyBlbGVtZW50IHRvIG9yZ2FuaXplIHdvcmsgaW4gcmVwZXRpdGl2ZSBjeWNsZXMuICBUaGUgY29uY2VwdCBvZiBJdGVyYXRpb24gY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBkaWZmZXJlbnQgcnVsZXMgaW4gZGlmZmVyZW50IG1ldGhvZHMuICBGb3IgZXhhbXBsZSwgdGhlIElCTSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgbWV0aG9kIGZyYW1ld29yayAoUlVQKSBkZWZpbmVzIGEgcnVsZSB0aGF0IEl0ZXJhdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHRvIHNwYW4gYWNyb3NzIFBoYXNlcy4gIEluIGNvbnRyYXN0IElCTSBHbG9iYWwgU2VydmljZXMgTWV0aG9kIChHU01ldGhvZCkgYmFzZWQgbWV0aG9kIGZyYW1ld29ya3MgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGFuZCBJdGVyYXRpb24gY2FuIGJlIGRlZmluZWQgd2hpY2ggbmVzdCBQaGFzZXMuICBSdWxlcyBsaWtlIHRoZXNlLCB3aGljaCBwbGF5IGFuIGltcG9ydGFudCByb2xlIGZvciBlYWNoIGluZGl2aWR1YWwgbWV0aG9kIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBlbmZvcmNlZCBieSB0aGlzIG1ldGEtbW9kZWwuICBJbnN0ZWFkLCBwcm9jZXNzIGF1dGhvcnMgYXJlIGV4cGVjdGVkIHRvIGZvbGxvdyBhbmQgY2hlY2sgdGhlc2UgcnVsZXMgbWFudWFsbHkuICAoTm90ZTogQW55IEJyZWFrZG93biBFbGVtZW50IGNhbiBiZSByZXBlYXRlZDsgaG93ZXZlciwgSXRlcmF0aW9ucyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGFzIGEgc3BlY2lhbCBtZXRhLW1vZGVsIGNvbmNlcHQsIGJlY2F1c2Ugb2YgaXRzIGltcG9ydGFudCByb2xlIGZvciBtYW55IG1ldGhvZHMuKQotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0SXRlcmF0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdJdGVyYXRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVyYXRpb24gZXh0ZW5kcyBBY3Rpdml0eSB7Ci19IC8vIEl0ZXJhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9LaW5kLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjY5NzU1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9LaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEtpbmQuamF2YSx2IDEuMSAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+S2luZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRLaW5kKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdLaW5kJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgS2luZCBleHRlbmRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotfSAvLyBLaW5kCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiOTczOC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kQ29uZmlndXJhdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBNZXRob2QgTW9kZWxzIGFuZCBNZXRob2RQYWNrYWdlcy4gQSBjb25maWd1cmF0aW9uIGNhbiBiZSBleHBvcnRlZCBpbnRvIGl0cyBvd24gc3RhbmRhbG9uZSBsaWJyYXJ5IHdoZW4gaXQgaW5jbHVkZXMgdGhlIGZ1bGwgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIGFsbCBlbGVtZW50cyBhbGwgb3RoZXIgZWxlbWVudHMgZGVwZW5kIG9uLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb24gPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24gPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldFByb2Nlc3NWaWV3IDxlbT5Qcm9jZXNzIFZpZXc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkgPGVtPkFkZGVkIENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J01ldGhvZENvbmZpZ3VyYXRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RDb25maWd1cmF0aW9uIGV4dGVuZHMgTWV0aG9kVW5pdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZUNvbmZpZ3VyYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEJhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGx1Z2luU2VsZWN0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZVNlbGVjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWaWV3PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWZhdWx0IFZpZXc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmlldyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVmYXVsdFZpZXcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFZpZXcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdFZpZXcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBWaWV3PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Byb2Nlc3NWaWV3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRQcm9jZXNzVmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3VidHJhY3RlZCBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YnRyYWN0ZWQgQ2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YnRyYWN0ZWRDYXRlZ29yeSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRlZCBDYXRlZ29yeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FkZGVkQ2F0ZWdvcnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFkZGVkQ2F0ZWdvcnkoKTsKLQotfSAvLyBNZXRob2RDb25maWd1cmF0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODFhNmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZEVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIFRoZSByb290IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgVU1BIE1ldGhvZCBFbGVtZW50cy4gIERlZmluZXMgYSBjb21tb24gc2V0IG9mIGF0dHJpYnV0ZXMgaW5oZXJpdGVkIGJ5IGFsbCBVTUEgTWV0aG9kIEVsZW1lbnRzLiAgTWV0aG9kIEVsZW1lbnQgaXRzZWxmIGlzIGRlcml2ZWQgZnJvbSBQYWNrYWdlYWJsZSBFbGVtZW50IGZyb20gdGhlIFVNTCAyLjAgSW5mcmFzdHJ1Y3R1cmUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlIDxlbT5Pd25lZCBSdWxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0QnJpZWZEZXNjcmlwdGlvbiA8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfR3JvdXAoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoxJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyB0aGUgcGFja2FnaW5nIHJ1bGVzIGZvciB0aGlzIE1ldGhvZCBFbGVtZW50LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Pd25lZCBSdWxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RFbGVtZW50X093bmVkUnVsZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPd25lZFJ1bGUnIGdyb3VwPScjZ3JvdXA6MSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PENvbnN0cmFpbnQ+IGdldE93bmVkUnVsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kRWxlbWVudFByb3BlcnR5JyBncm91cD0nI2dyb3VwOjEnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RFbGVtZW50UHJvcGVydHk+IGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IHNoYWxsIGJlIGJyaWVmbHkgZGVzY3JpYmVkIHdpdGggb25lIG9yIHR3byBzZW50ZW5jZXMgc3VtbWFyaXppbmcgdGhlIGVsZW1lbnQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRCcmllZkRlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudF9CcmllZkRlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYnJpZWZEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRCcmllZkRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QnJpZWZEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IGluc3RhbmNlIG9mIE1ldGhvZCBFbGVtZW50IGhhcyBhIGdsb2JhbCB1bmlxdWUgaWQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfSWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpZCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBVc2VkIGZvciBDQVNFIHRvb2wgcmVhbGl6YXRpb25zIG9mIHRoaXMgbW9kZWwgdG8gY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCBsYXlvdXQgYW5kIG9yZGVyaW5nIG9mIHRoZSBtZXRob2QgZWxlbWVudCBhbmQgaXRzIHBhcnRzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlcmluZyBHdWlkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3JkZXJpbmdHdWlkZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J29yZGVyaW5nR3VpZGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0T3JkZXJpbmdHdWlkZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9yZGVyaW5nR3VpZGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBEZXNjcmliYWJsZSBFbGVtZW50IGhhcyBhIHByZXNlbnRhdGlvbiBuYW1lLCB3aGljaCBpcyB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnQuICBGb3IgZXhhbXBsZSwgbmFtZSAodGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uKSBtaWdodCBiZSBzZXQgdG8gInJ1cF9hcmNoaXRlY3R1cmVfZG9jdW1lbnQiIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBhICJqMmVlX2FyY2hpdGN0dXJlX2RvY3VtZW50IiB3aGVyZWFzIHRoZSBleHRlcm5hbCBwcmVzZW50YXRpb24gd291bGQgYWx3YXlzIGJlICJBcmNoaXRlY3R1cmUgRG9jdW1lbnQiLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlc2VudGF0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3ByZXNlbnRhdGlvbk5hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZXNlbnRhdGlvbk5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIGEgVmFyaWFiaWxpdHkgRWxlbWVudCBpcyBkZXJpdmVkIGZyb20gYW5vdGhlciBWYXJpYWJpbGl0eSBFbGVtZW50IHVzaW5nIHRoZSAiZXh0ZW5kcyIgVmFyaWFiaWxpdHkgU3BlY2lhbGl6YXRpb24sIHRoZW4gdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3MgaW5oZXJpdGVkIE1ldGhvZCBFbGVtZW50cyB0aGF0IHdlcmUgcGFydCBvZiB0aGUgYmFzZWQtb24gVmFyaWFiaWxpdHkgRWxlbWVudCwgd2hpY2ggY2FuIGJlIGFueSB0eXBlIG9mIE1ldGhvZCBFbGVtZW50LiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIG9uIGEgTWV0aG9kIEVsZW1lbnQgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSB0aGFuIGFuIGluaGVyaXRlZCBtZXRob2QgZWxlbWVudCB0aGVuIGl0IHdpbGwgbm90IGJlIHJlZ2FyZGVkIGFzIGluaGVyaXRlZCBhdCBhbGwuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjdW5zZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNzZXRTdXBwcmVzc2VkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRfU3VwcHJlc3NlZCgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdzdXBwcmVzc2VkJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1N1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjaXNTdXBwcmVzc2VkIDxlbT5TdXBwcmVzc2VkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBwcmVzc2VkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI3Vuc2V0U3VwcHJlc3NlZCgpCi0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTdXBwcmVzc2VkKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRTdXBwcmVzc2VkKCkKLQkgKiBAc2VlICNpc1N1cHByZXNzZWQoKQotCSAqIEBzZWUgI3NldFN1cHByZXNzZWQoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFN1cHByZXNzZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldFN1cHByZXNzZWQoKQotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjc2V0U3VwcHJlc3NlZChib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0U3VwcHJlc3NlZCgpOwotCi19IC8vIE1ldGhvZEVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kRWxlbWVudFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDMyMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZEVsZW1lbnRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50UHJvcGVydHkuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWV0aG9kRWxlbWVudFByb3BlcnR5JyBraW5kPSdlbXB0eSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kRWxlbWVudFByb3BlcnR5IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFsdWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RFbGVtZW50UHJvcGVydHkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kTGlicmFyeS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZExpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMGY3MC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kTGlicmFyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RMaWJyYXJ5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBNZXRob2QgTGlicmFyeSBpcyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBsdWdpbnMgYW5kIE1ldGhvZCBDb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiAgQWxsIE1ldGhvZCBFbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgTWV0aG9kIExpYnJhcnkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbiA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCA8ZW0+VG9vbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RMaWJyYXJ5KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RMaWJyYXJ5JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kTGlicmFyeSBleHRlbmRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBsdWdpbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PE1ldGhvZFBsdWdpbj4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZENvbmZpZ3VyYXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSB0b29sIHRoYXQgZ2VuZXJhdGVkIHRoZSBYTUwgZmlsZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VG9vbChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZExpYnJhcnlfVG9vbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J3Rvb2wnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VG9vbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRUb29sIDxlbT5Ub29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUb29sKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gTWV0aG9kTGlicmFyeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjlkZWQ0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBjbGFzcyBmb3IgcGFja2FnaW5nIE1ldGhvZCBFbGVtZW50cy4gIEFsbCBNZXRob2QgRWxlbWVudHMgc2hhbGwgYmUgbG9jYXRlZCBpbiBleGFjdGx5IG9uZSBvZiBNZXRob2QgUGFja2FnZSdzIGNvbmNyZXRlIHNwZWNpYWxpemF0aW9ucyAoZS5nLiBDb250ZW50IFBhY2thZ2UpLiAgIE1ldGhvZCBQYWNrYWdlIGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgZm9yIGFsbCBvZiBpdHMgc3BlY2lhbGl6YXRpb25zLiBFbGVtZW50cyBhcmUgb3JnYW5pemVkIGluIE1ldGhvZCBQYWNrYWdlcyB0byBzdHJ1Y3R1cmUgbGFyZ2Ugc2NhbGUgb2YgbWV0aG9kIGNvbnRlbnQgYW5kIHByb2Nlc3NlcyBhcyB3ZWxsIGFzIHRvIGRlZmluZSBhIG1lY2hhbmlzbSBmb3IgcmV1c2UuICBNZXRob2QgRWxlbWVudHMgZnJvbSBvbmUgcGFja2FnZSBjYW4gcmV1c2UgZWxlbWVudCBmcm9tIG90aGVyIHBhY2thZ2VzIGJ5IGRlZmluaW5nIGEgcmV1c2VkUGFja2FnZXMgbGluay4gIEZvciBleGFtcGxlLCBhIHdvcmsgcHJvZHVjdCBkZWZpbmVkIGluIG9uZSBwYWNrYWdlIGNhbiBiZSB1c2VkIGFzIGFuIGlucHV0IGZvciBUYXNrcyBkZWZpbmVkIGluIG90aGVyIHBhY2thZ2VzLiAgQnkgcmV1c2luZyBpdCBmcm9tIG9uZSBjb21tb24gcGxhY2UgKGkuZS4gdGhlIHBhY2thZ2UgaW4gd2hpY2ggaXQgaGFzIGJlZW4gZGVmaW5lZCkgZW5zdXJlcyB0aGF0IG5vIHJlZHVuZGFudCBkZWZpbml0aW9ucyBvZiB0aGUgc2FtZSBlbGVtZW50cyBhcmUgcmVxdWlyZWQuICBBbHNvIG1haW50ZW5hbmNlIG9mIG1ldGhvZCBjb250ZW50IGlzIGdyZWF0bHkgaW1wcm92ZWQgYXMgY2hhbmdlcyBjYW4gYmUgcGVyZm9ybWVkIGluIG9ubHkgb25lIHBsYWNlLiAgTm90ZSwgdGhhdCBvdGhlciBwYWNrYWdlcyB3aWxsIGludHJvZHVjZSBtb3JlIHNwZWNpYWxpemF0aW9ucyBvZiBNZXRob2QgUGFja2FnZSwgZS5nLiBQcm9jZXNzIFBhY2thZ2UgYW5kIFByb2Nlc3MgQ29tcG9uZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0UmV1c2VkUGFja2FnZSA8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kUGFja2FnZSBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAxPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX0dyb3VwMSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV1c2VkIFBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldXNlZCBQYWNrYWdlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXVzZWRQYWNrYWdlJyBncm91cD0nI2dyb3VwOjknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJldXNlZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWV0aG9kUGFja2FnZScgZ3JvdXA9JyNncm91cDo5JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBNZXRob2QgUGFja2FnZXMgY2FuIGhhdmUgYSBnbG9iYWwgc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgZXZlcnkgZWxlbWVudCBvZiBldmVyeSBvdGhlciBNZXRob2QgUGFja2FnZSBjYW4gc2VlIHRoZSBnbG9iYWwgcGFja2FnZSdzIGNvbnRlbnRzLiAgR2xvYmFsIE1ldGhvZCBQYWNrYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWQgdG8gc3RvcmUgY29tbW9ubHkgdXNlZCBjYXRlZ29yeSBkZWZpbml0aW9ucyBzdWNoIGFzIGZvciBEaXNjaXBsaW5lcyBvciBEb21haW5zLCB3aGljaCBhcmUgdXNlZCBieSBtYW55IFRhc2sgYW5kIFdvcmsgUHJvZHVjdHMgcmVzcGVjdGl2ZWx5LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HbG9iYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0R2xvYmFsKCkKLQkgKiBAc2VlICN1bnNldEdsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBhY2thZ2VfR2xvYmFsKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2dsb2JhbCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNHbG9iYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2xvYmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldEdsb2JhbCgpCi0JICogQHNlZSAjdW5zZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjaXNHbG9iYWwgPGVtPkdsb2JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRHbG9iYWwoKQotCSAqIEBzZWUgI2lzR2xvYmFsKCkKLQkgKiBAc2VlICNzZXRHbG9iYWwoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldEdsb2JhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2lzR2xvYmFsIDxlbT5HbG9iYWw8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdsb2JhbDwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0R2xvYmFsKCkKLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQHNlZSAjc2V0R2xvYmFsKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRHbG9iYWwoKTsKLQotfSAvLyBNZXRob2RQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBsdWdpbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01ldGhvZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q0MDZlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBsdWdpbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBVbml0IHRoYXQgcmVwcmVzZW50cyBhIHBoeXNpY2FsIGNvbnRhaW5lciBmb3IgTWV0aG9kIFBhY2thZ2VzLiAgSXQgZGVmaW5lcyBhIGdyYW51bGFyaXR5IGxldmVsIGZvciB0aGUgbW9kdWxhcml6YXRpb24gYW5kIG9yZ2FuaXphdGlvbiBvZiBtZXRob2QgY29udGVudCBhbmQgcHJvY2Vzc2VzLiAgQSBNZXRob2QgUGx1Z2luIGNhbiBleHRlbmQgbWFueSBvdGhlciBNZXRob2QgUGx1Z2lucyBhbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IG1hbnkgTWV0aG9kIFBsdWdpbnMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHN0YW5kLWFsb25lLCBpLmUuIHdpdGggbm8gRXh0ZW5zaW9uIHJlbGF0aW9uc2hpcCB0byBvdGhlciBwbHVnLWlucy4KLSAqIE1ldGhvZCBQbHVnaW4gY29uY2VwdHVhbGx5IHJlcHJlc2VudHMgYSB1bml0IGZvciBjb25maWd1cmF0aW9uLCBtb2R1bGFyaXphdGlvbiwgZXh0ZW5zaW9uLCBwYWNrYWdpbmcsIGFuZCBkZXBsb3ltZW50IG9mIG1ldGhvZCBjb250ZW50IGFuZCBwcm9jZXNzZXMuICBBIFByb2Nlc3MgRW5naW5lZXIgc2hhbGwgZGVzaWduIGhpcyBQbHVnaW5zIGFuZCBhbGxvY2F0ZSBoaXMgY29udGVudCB0byB0aGVzZSBQbHVnaW5zIHdpdGggcmVxdWlyZW1lbnRzIGZvciBleHRlbnNpYmlsaXR5LCBtb2R1bGFyaXR5LCByZXVzZSwgYW5kIG1haW50YWluYWJpbGl0eSBpbiBtaW5kLgotICogU3BlY2lhbCBleHRlbnNpYmlsaXR5IG1lY2hhbmlzbXMgZGVmaW5lZCBmb3IgdGhlIG1ldGEtY2xhc3NlcyBWYXJpYWJpbGl0eSBFbGVtZW50IGFuZCBQcm9jZXNzIENvbnRyaWJ1dGlvbiBhbGxvdyBQbHVnaW4gY29udGVudCB0byBkaXJlY3RseSBjb250cmlidXRlIG5ldyBjb250ZW50LCByZXBsYWNlIGV4aXN0aW5nIGNvbnRlbnQsIG9yIHRvIGNyb3NzLXJlZmVyZW5jZSB0byBhbnkgQ29udGVudCBFbGVtZW50IG9yIFByb2Nlc3Mgd2l0aGluIGFub3RoZXIgUGx1Z2luIHRoYXQgaXQgZXh0ZW5kcy4gIFNpbWlsYXIgdG8gVU1MIDIuMCdzICdwYWNrYWdlIG1lcmdlJyBtZWNoYW5pc20gdHJhbnNmb3JtYXRpb24gaW50ZXJwcmV0YXRpb25zLCBpbnRlcnByZXRpbmcgdGhlc2UgTWV0aG9kIFBsdWdpbiBtZWNoYW5pc21zIHJlc3VsdHMgaW50byBuZXcgZXh0ZW5kZWQgTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3Nlcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RQbHVnaW4nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RQbHVnaW4gZXh0ZW5kcyBNZXRob2RVbml0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVmZXJlbmNlZE1ldGhvZFBsdWdpbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kIFBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01ldGhvZFBhY2thZ2UnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxNZXRob2RQYWNrYWdlPiBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd1c2VyQ2hhbmdlYWJsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNVc2VyQ2hhbmdlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICN1bnNldFVzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAc2VlICNpc1VzZXJDaGFuZ2VhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVc2VyQ2hhbmdlYWJsZShib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQHNlZSAjc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCB1bnNldFVzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNpc1VzZXJDaGFuZ2VhYmxlIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIEBzZWUgI3Vuc2V0VXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI3NldFVzZXJDaGFuZ2VhYmxlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRVc2VyQ2hhbmdlYWJsZSgpOwotCi19IC8vIE1ldGhvZFBsdWdpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvTWV0aG9kVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjEwNTY3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NZXRob2RVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RVbml0LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFVuaXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCBzaGFsbCBiZSBtYWludGFpbmVkIGluIGEgTWV0aG9kIExpYnJhcnkgYXMgYSBzZXBhcmF0ZSB1bml0IG9mIGNvbnRyb2wuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdNZXRob2RVbml0JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kVW5pdCBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29weXJpZ2h0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvcHlyaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgTWV0aG9kIFVuaXQgaXMgYmVpbmcgY3JlYXRlZCBhbmQgb3duZWQgYnkgYW4gYXV0aG9yIG9yIGF1dGhvcmluZyB0ZWFtLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdXRob3JzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nYXV0aG9ycyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdXRob3JzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF1dGhvcnMoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGF0ZSB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbiBoYXMgYmVlbiBtYWRlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEYXRlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZ2V0Q2hhbmdlRGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGxhc3QgY2hhbmdlIHRoYXQgcmVzdWx0ZWQgaW50byB0aGlzIHZlcnNpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nY2hhbmdlRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlRGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFBhY2thZ2UgaGFzIGEgdmVyc2lvbiBudW1iZXIgdXNlZCB0byB0cmFjayBjaGFuZ2VzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TWV0aG9kVW5pdF9WZXJzaW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmVyc2lvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBNZXRob2RVbml0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL01pbGVzdG9uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzgwYjg3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9NaWxlc3RvbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWlsZXN0b25lLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWlsZXN0b25lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgZGVzY3JpYmVzIGEgc2lnbmlmaWNhbnQgZXZlbnQgaW4gYSBkZXZlbG9wbWVudCBwcm9qZWN0LCBzdWNoIGFzIGEgbWFqb3IgZGVjaXNpb24sIGNvbXBsZXRpb24gb2YgYSBkZWxpdmVyYWJsZSwgb3IgbWVldGluZyBvZiBhIG1ham9yIGRlcGVuZGVuY3kgKGxpa2UgY29tcGxldGlvbiBvZiBhIHByb2plY3QgcGhhc2UpLiAgQmVjYXVzZSwgTWlsZXN0b25lIGlzIGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gYm90aCB0aGUgZXZlbnQgaXRzZWxmIGFuZCB0aGUgcG9pbnQgaW4gdGltZSBhdCB3aGljaCB0aGUgZXZlbnQgaXMgc2NoZWR1bGVkIHRvIGhhcHBlbiwgaXQgaXMgbW9kZWxlZCBhcyBhIEJyZWFrZG93biBFbGVtZW50IChpLmUuIGl0IGFwcGVhcnMgYXMgcGFydCBvZiBhIGJyZWFrZG93biBzdHJ1Y3R1cmUpLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdCA8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nTWlsZXN0b25lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWlsZXN0b25lIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVxdWlyZWQgUmVzdWx0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXF1aXJlZFJlc3VsdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVxdWlyZWRSZXN1bHQoKTsKLX0gLy8gTWlsZXN0b25lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL05hbWVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2FkNWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9OYW1lZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTmFtZWRFbGVtZW50LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgVU1MIDIuMCBtZXRhLWNsYXNzIE5hbWVkIEVsZW1lbnQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0TmFtZWRFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdOYW1lZEVsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZEVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXROYW1lZEVsZW1lbnRfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J25hbWUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBOYW1lZEVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL091dGNvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOWQxYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvT3V0Y29tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBPdXRjb21lLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk91dGNvbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFdvcmsgUHJvZHVjdCB0aGF0IGRlc2NyaWJlcyBpbnRhbmdpYmxlIHdvcmsgcHJvZHVjdHMgdGhhdCBhcmUgYSByZXN1bHQgb3Igc3RhdGUuIE91dGNvbWVzIG1heSBhbHNvIGJlIHVzZWQgdG8gZGVzY3JpYmUgd29yayBwcm9kdWN0cyB0aGF0IGFyZSBub3QgZm9ybWFsbHkgZGVmaW5lZC4gIEEga2V5IGRpZmZlcmVudGlhdG9yIGZvciBvdXRjb21lcyBhZ2FpbnN0IGFydGlmYWN0cyBpcyB0aGF0IG91dGNvbWVzIGFyZSBub3QgY2FuZGlkYXRlcyBmb3IgaGFydmVzdGluZyBhcyByZXVzYWJsZSBhc3NldHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRPdXRjb21lKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdPdXRjb21lJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3V0Y29tZSBleHRlbmRzIFdvcmtQcm9kdWN0IHsKLX0gLy8gT3V0Y29tZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QYWNrYWdlYWJsZUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4NTdhYS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGFja2FnZWFibGVFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBhY2thZ2VhYmxlRWxlbWVudC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDgganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYWNrYWdlYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBVTUwgMi4wIG1ldGEtY2xhc3MgUGFja2FnYWJsZSBFbGVtZW50LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQYWNrYWdlYWJsZUVsZW1lbnQnIGtpbmQ9J2VtcHR5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQYWNrYWdlYWJsZUVsZW1lbnQgZXh0ZW5kcyBOYW1lZEVsZW1lbnQgewotfSAvLyBQYWNrYWdlYWJsZUVsZW1lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUGhhc2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUyMmVjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQaGFzZS5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QaGFzZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBBY3Rpdml0eSB3aGljaCBwcmVzY3JpYmVzIHByZS1kZWZpbmVkIHZhbHVlcyBmb3IgaXRzIGluc3RhbmNlcyBmb3IgdGhlIGF0dHJpYnV0ZXMgcHJlZml4ICgnUGhhc2UnKSBhbmQgaXNSZXBlYXRhYmxlICgnRmFsc2UnKS4gIEl0IGhhcyBiZWVuIGluY2x1ZGVkIGludG8gdGhlIG1ldGEtbW9kZWwgZm9yIGNvbnZlbmllbmNlIGFuZCB0byBwcm92aWRlIGEgc3BlY2lhbCBzdGVyZW90eXBlLCBiZWNhdXNlIGl0IHJlcHJlc2VudHMgYSB2ZXJ5IGNvbW1vbmx5IHVzZWQgQWN0aXZpdHkgdHlwZS4KLSAqIFBoYXNlIHJlcHJlc2VudCBhIHNpZ25pZmljYW50IHBlcmlvZCBpbiBhIHByb2plY3QsIGVuZGluZyB3aXRoIG1ham9yIG1hbmFnZW1lbnQgY2hlY2twb2ludCwgbWlsZXN0b25lIG9yIHNldCBvZiBEZWxpdmVyYWJsZXMuICBJdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwgYXMgYSBwcmVkZWZpbmVkIHNwZWNpYWwgQWN0aXZpdHksIGJlY2F1c2Ugb2YgaXRzIHNpZ25pZmljYW5jZSBpbiBkZWZpbmluZyBicmVha2Rvd25zLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UGhhc2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BoYXNlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGhhc2UgZXh0ZW5kcyBBY3Rpdml0eSB7Ci19IC8vIFBoYXNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1BsYW5uaW5nRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYxNGMwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QbGFubmluZ0RhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBsYW5uaW5nRGF0YS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIFByb2Nlc3MgRWxlbWVudCB0aGF0IGFkZHMgcGxhbm5pbmcgZGF0YSB0byBCcmVha2Rvd24gRWxlbWVudHMgd2hlbiBpdCBpcyB1c2VkIGZvciBhIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUuICBGb3IgRGVsaXZlcnkgUHJvY2Vzc2VzIGFuZCBDYXBhYmlsaXR5IFBhdHRlcm5zIHRoaXMgY2xhc3MgY2FuIGVpdGhlciBub3QgYmUgaW5zdGFudGlhdGVkIG9yIHBvcHVsYXRlZCB3aXRoIGRlZmF1bHQgZGF0YS4KLSAqIFBsYW5uaW5nIERhdGEgZmFjdG9ycyBvdXQgc3BlY2lmaWMgb3B0aW9uYWwgZGF0YSBuZWVkZWQgZm9yIHJlcHJlc2VudGluZyBwbGFubmluZyB0ZW1wbGF0ZXMuICBUaGlzIGFzc29jaWF0aW9uIGFsbG93cyB0byBhY2Nlc3MgcGxhbm5pbmcgZGF0YSBpZiBpdCBpcyBzdG9yZWQgZm9yIHRoZSBCcmVha2Rvd24gRWxlbWVudC4KLSAqIChOT1RFLCBUSEUgQVRUUklCVVRFUyBGT1IgVEhJUyBDTEFTUyBBUkUgTk9UIENPTVBMRVRFLCBZRVQpCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldEZpbmlzaERhdGUgPGVtPkZpbmlzaCBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSA8ZW0+U3RhcnQgRGF0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGEoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1BsYW5uaW5nRGF0YScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBsYW5uaW5nRGF0YSBleHRlbmRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgZmluaXNoIGRhdGUgZm9yIGEgcGxhbmVkIFRhc2suCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbmlzaCBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRGaW5pc2hEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGFfRmluaXNoRGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuRGF0ZVRpbWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0nZmluaXNoRGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldEZpbmlzaERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmluaXNoIERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEZpbmlzaERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZpbmlzaERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuazwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgcmFuayBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmFuayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFBsYW5uaW5nRGF0YV9SYW5rKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ncmFuayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSYW5rKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0UmFuayA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmFuayhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogVGhlIGRlZmF1bHQgc3RhcnQgZGF0ZSBmb3IgYSBwbGFuZWQgVGFzay4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RhcnQgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3RhcnREYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5EYXRlVGltZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdzdGFydERhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRTdGFydERhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YXJ0IERhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RhcnREYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIHZhbHVlKTsKLQotfSAvLyBQbGFubmluZ0RhdGEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJhY3RpY2UuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDQ2OWM3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lmaWMgdHlwZSBvZiBndWlkYW5jZSB0aGF0IHJlcHJlc2VudHMgYSBwcm92ZW4gd2F5IG9yIHN0cmF0ZWd5IG9mIGRvaW5nIHdvcmsgdG8gYWNoaWV2ZSBhIGdvYWwgdGhhdCBoYXMgYSBwb3NpdGl2ZSBpbXBhY3Qgb24gd29yayBwcm9kdWN0IG9yIHByb2Nlc3MgcXVhbGl0eS4gIFByYWN0aWNlcyBhcmUgZGVmaW5lZCBvcnRob2dvbmFsIHRvIG1ldGhvZHMgYW5kIHByb2Nlc3Nlcy4gIFRoZXkgY291bGQgc3VtbWFyaXplIGFzcGVjdHMgdGhhdCBpbXBhY3QgbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgYSBtZXRob2Qgb3Igc3BlY2lmaWMgcHJvY2Vzc2VzLiAgRXhhbXBsZXMgZm9yIHByYWN0aWNlcyB3b3VsZCBiZSAiTWFuYWdlIFJpc2tzIiwgIkNvbnRpbnVvdXNseSB2ZXJpZnkgcXVhbGl0eSIsICJBcmNoaXRlY3R1cmUtY2VudHJpYyBhbmQgY29tcG9uZW50LWJhc2VkIGRldmVsb3BtZW50IiwgZXRjLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJhY3RpY2UnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcmFjdGljZSBleHRlbmRzIEd1aWRhbmNlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWN0aXZpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FjdGl2aXR5UmVmZXJlbmNlJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRBY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudCBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudCBSZWZlcmVuY2U8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29udGVudFJlZmVyZW5jZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29udGVudFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2V9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFByYWN0aWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdWJQcmFjdGljZScgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFByYWN0aWNlPiBnZXRTdWJQcmFjdGljZSgpOwotCi19IC8vIFByYWN0aWNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9QcmFjdGljZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOGI4ZTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ByYWN0aWNlRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByYWN0aWNlRGVzY3JpcHRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmFjdGljZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUHJhY3RpY2UuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBZGRpdGlvbmFsSW5mbyA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEFwcGxpY2F0aW9uIDxlbT5BcHBsaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSA8ZW0+UHJvYmxlbTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcmFjdGljZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJhY3RpY2VEZXNjcmlwdGlvbiBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBbnkgYWRkaXRpb25hbCBJbmZvcm1hdGlvbiBub3QgY292ZXJlZCBieSB0aGUgb3RoZXIgYXR0cmlidXRlcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbEluZm8nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRkaXRpb25hbEluZm8oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFwcGxpY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgaG93IHRoZSBQcmFjdGljZSBpcyBiZWluZyBhcHBsaWVkIG9yIGludHJvZHVjZWQgaW50byB0aGUgY29udGV4dCBkZXNjcmliZWQgaW4gYmFja2dyb3VuZC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXBwbGljYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFwcGxpY2F0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBcHBsaWNhdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBcHBsaWNhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFwcGxpY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBcHBsaWNhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXBwbGljYXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEVsYWJvcmF0aW9uIG9uIHRoZSBiYWNrZ3JvdW5kIGFuZCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnMgYW5kIHdoZXJlIHRoZSBzb2x1dGlvbiBkZXNjcmliZWQgYnkgdGhpcyBQcmFjdGljZSB3aWxsIGZpdCBpbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QmFja2dyb3VuZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdCYWNrZ3JvdW5kJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmFja2dyb3VuZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QmFja2dyb3VuZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R29hbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEEgc3VtbWFyeSBvZiB0aGUgb3ZlcmFsbCBnb2FscyB0byBiZSBhZGRyZXNzZWQgYnkgdGhlIFByYWN0aWNlLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hb2FsczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0R29hbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0dvYWxzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEdvYWxzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzIDxlbT5Hb2FsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R29hbHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHb2FscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGV2ZWxzIE9mIEFkb3B0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBPdXRsaW5lcyB0aGUgZGlmZmVyZW50IGZvcm1zIG9yIHZhcmlhbnRzIGluIHdoaWNoIHRoZSBwcmFjdGljZSBjb3VsZCBiZSByZWFsaXplZC4gKGUuZy4gZnVsbCBhZG9wdGlvbiB2ZXJ1cyBhIHBhcnRpYWwgYWRvcHRpb24gb2YgdGhlIFByYWN0aWNlKQotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExldmVsc09mQWRvcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTGV2ZWxzT2ZBZG9wdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldExldmVsc09mQWRvcHRpb24gPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZXZlbHNPZkFkb3B0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9ibGVtPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRoZSBQcmFjdGljZSBhZGRyZXNzZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByb2JsZW0oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcmFjdGljZURlc2NyaXB0aW9uX1Byb2JsZW0oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJvYmxlbSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2JsZW08L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2JsZW0oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcmFjdGljZURlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODZjMGYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3MuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBBY3Rpdml0eSB0aGF0IGRlc2NyaWJlcyBhIHN0cnVjdHVyZSBmb3IgcGFydGljdWxhciB0eXBlcyBvZiBkZXZlbG9wbWVudCBwcm9qZWN0cy4gIFRvIHBlcmZvcm0gc3VjaCBhIGRldmVsb3BtZW50IHByb2plY3QgYSBQcm9jZXNzZXMgd291bGQgYmUgJ2luc3RhbnRpYXRlZCcgYW5kIGFkYXB0ZWQgZm9yIHRoZSBzcGVjaWZpYyBzaXR1YXRpb24uICBQcm9jZXNzIGlzIGFuIGFic3RyYWN0IGNsYXNzIGFuZCB0aGlzIG1ldGEtbW9kZWwgZGVmaW5lcyBkaWZmZXJlbnQgc3BlY2lhbCB0eXBlcyBvZiBQcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBwcm9jZXNzIG1hbmFnZW1lbnQgYXBwbGljYXRpb25zIGFuZCBkaWZmZXJlbnQgc2l0dWF0aW9ucyBvZiBwcm9jZXNzIHJldXNlLiAgRXZlcnkgUHJvY2VzcyBjb21wcmlzZXMgb2YgYW5kIGlzIHRoZSB0b3AtbGV2ZWwgZWxlbWVudCBvZiBhbiBuLWxldmVsIGJyZWFrZG93biBzdHJ1Y3R1cmUgdXNpbmcgdGhlIE5lc3RpbmcgYXNzb2NpYXRpb24gZGVmaW5lZCBvbiBBY3Rpdml0eS4KLSAqIENvcmUgTWV0aG9kIENvbnRlbnQgcHJvdmlkZXMgc3RlcC1ieS1zdGVwIGV4cGxhbmF0aW9ucywgZGVzY3JpYmluZyBob3cgdmVyeSBzcGVjaWZpYyBkZXZlbG9wbWVudCBnb2FscyBhcmUgYWNoaWV2ZWQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsYWNlbWVudCBvZiB0aGVzZSBzdGVwcyB3aXRoaW4gYSBkZXZlbG9wbWVudCBsaWZlY3ljbGUuICBQcm9jZXNzZXMgdGFrZSB0aGVzZSBtZXRob2QgZWxlbWVudHMgYW5kIHJlbGF0ZSB0aGVtIGludG8gc2VtaS1vcmRlcmVkIHNlcXVlbmNlcyB0aGF0IGFyZSBjdXN0b21pemVkIHRvIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3RzLiAgVGh1cywgYSBwcm9jZXNzIGlzIGEgc2V0IG9mIHBhcnRpYWxseSBvcmRlcmVkIHdvcmsgZGVzY3JpcHRpb25zIGludGVuZGVkIHRvIHJlYWNoIGEgaGlnaGVyIGRldmVsb3BtZW50IGdvYWwsIHN1Y2ggYXMgdGhlIHJlbGVhc2Ugb2YgYSBzcGVjaWZpYyBzb2Z0d2FyZSBzeXN0ZW0uICBBIHByb2Nlc3MgYW5kIHRoZSBwcm9jZXNzIG1ldGEtbW9kZWwgc3RydWN0dXJlIGRlZmluZWQgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIGZvY3VzZXMgb24gdGhlIGxpZmVjeWNsZSBhbmQgdGhlIHNlcXVlbmNpbmcgb2Ygd29yayBpbiBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRvIGFjaGlldmUgdGhpcyBpdCB1c2VzIHRoZSBEZXNjcmlwdG9yIGNvbmNlcHQgcmVmZXJlbmNpbmcgbWV0aG9kIGNvbnRlbnQgYW5kIGFsbG93aW5nIGRlZmluaW5nIHRpbWUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMgb2YgdGhlIHJlZmVyZW5jZWQgY29udGVudCAoZS5nLiBkZWZpbmluZyBhIGZvY3VzIG9uIGRpZmZlcmVudCBzdGVwcyBvZiB0aGUgc2FtZSBUYXNrIGFuZCBwcm92aWRpbmcgaW5wdXQgV29yayBQcm9kdWN0cyBpbiBkaWZmZXJlbnQgc3RhdGVzIHdpdGhpbiB0aGUgZGlmZmVyZW50IFBoYXNlcyBvZiBhIHByb2Nlc3MgbGlmZWN5Y2xlIGluIHdoaWNoIHRoZSBzYW1lIFRhc2sgaXMgcGVyZm9ybWVkKS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybiA8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldFZhbGlkQ29udGV4dCA8ZW0+VmFsaWQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdQcm9jZXNzJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2VzcyBleHRlbmRzIEFjdGl2aXR5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5jbHVkZXMgUGF0dGVybjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW5jbHVkZXNQYXR0ZXJuJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlc1BhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVmYXVsdENvbnRleHQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzX0RlZmF1bHRDb250ZXh0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlZmF1bHRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldERlZmF1bHRDb250ZXh0IDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlZmF1bHRDb250ZXh0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWQgQ29udGV4dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc19WYWxpZENvbnRleHQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVmFsaWRDb250ZXh0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRWYWxpZENvbnRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpYWdyYW0gVVJJPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgVVJJIG9mIHRoZSBkaWFncmFtIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaWFncmFtIFVSSTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlhZ3JhbVVSSShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NfRGlhZ3JhbVVSSSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2RpYWdyYW1VUkknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGlhZ3JhbVVSSSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREaWFncmFtVVJJIDxlbT5EaWFncmFtIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlhZ3JhbSBVUkk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpYWdyYW1VUkkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERpYWdyYW1VUkkoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzQ29tcG9uZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OGQyMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIENvbXBvbmVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBQcm9jZXNzIFBhY2thZ2UgdGhhdCBhcHBsaWVzIHRoZSBwcmluY2lwbGVzIG9mIGVuY2Fwc3VsYXRpb24uICBBIFByb2Nlc3MgQ29tcG9uZW50IHJlYWxpemVzIG9uZSBvciBtb3JlIEludGVyZmFjZXMgd2hpY2ggc3BlY2lmeSBpbnB1dHMgYW5kIG91dHB1dHMgb2YgdGhlIGNvbXBvbmVudC4gVGhlcmUgbWlnaHQgYmUgbWFueSBjb21wb25lbnRzIHJlYWxpemluZyB0aGUgc2FtZSBpbnRlcmZhY2VzLCBidXQgdXNpbmcgZGlmZmVyZW50IHRlY2huaXF1ZXMgdG8gYWNoaWV2ZSBzaW1pbGFyIG91dHB1dHMgZm9yIHNpbWlsYXIgaW5wdXRzLiAgV2hlcmVhcyB0aGUgQ29tcG9uZW50IEludGVyZmFjZXMgcmVwcmVzZW50IGNvbXBvbmVudCBzcGVjaWZpY2F0aW9ucyAoYmxhY2sgYm94IGRlc2NyaXB0aW9ucyBvZiB0aGUgY29tcG9uZW50KSwgZ29vZCBjYW5kaWRhdGVzIGZvciBjb21wb25lbnQgcmVhbGl6YXRpb25zIGNhbiBiZSBmb3VuZCBpbiBDYXBhYmlsaXR5IFBhdHRlcm5zICh3aGl0ZSBib3ggZGVzY3JpcHRpb25zIGZvciB0aGUgY29tcG9uZW50KS4KLSAqIFVNQSBzdXBwb3J0cyByZXBsYWNlYWJsZSBhbmQgcmV1c2FibGUgUHJvY2VzcyBDb21wb25lbnRzIHJlYWxpemluZyB0aGUgcHJpbmNpcGxlcyBvZiBlbmNhcHN1bGF0aW9uLiBDZXJ0YWluIHNpdHVhdGlvbnMgaW4gYSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBwcm9qZWN0IG1pZ2h0IHJlcXVpcmUgdGhhdCBjb25jcmV0ZSByZWFsaXphdGlvbnMgb2YgcGFydHMgb2YgdGhlIHByb2Nlc3MgcmVtYWluIHVuZGVjaWRlZCBvciB3aWxsIGJlIGRlY2lkZWQgYnkgdGhlIGV4ZWN1dGluZyB0ZWFtIGl0c2VsZiAoZS5nLiBpbiBvdXRzb3VyY2luZyBzaXR1YXRpb25zKS4gIFVNQSBwcm92aWRlcyBhIHVuaXF1ZSBjb21wb25lbnQgY29uY2VwdCBkZWZpbmluZyBpbnRlcmZhY2VzIGZvciB3b3JrIHByb2R1Y3QgaW5wdXQgYW5kIG91dHB1dCwgYWxsb3dpbmcgdHJlYXRpbmcgdGhlIGFjdHVhbCBkZWZpbml0aW9uIG9mIHRoZSB3b3JrIHRoYXQgcHJvZHVjZXMgdGhlIG91dHB1dHMgYXMgYSAiYmxhY2sgYm94Ii4gIEF0IGFueSBwb2ludCBkdXJpbmcgYSBwcm9qZWN0IHRoZSBjb21wb25lbnQgInJlYWxpemF0aW9uIiBkZXRhaWxpbmcgdGhlIHdvcmsgY2FuIGJlIGFkZGVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGNvbXBvbmVudCBhcHByb2FjaCBhbHNvIGFsbG93cyB0aGF0IGRpZmZlcmVudCBzdHlsZXMgb3IgdGVjaG5pcXVlcyBvZiBkb2luZyB3b3JrIGNhbiBiZSByZXBsYWNlZCB3aXRoIG9uZSBhbm90aGVyLiAgRm9yIGV4YW1wbGUsIGEgc29mdHdhcmUgY29kZSBvdXRwdXQgb2YgYSBjb21wb25lbnQgY291bGQgYmUgcHJvZHVjZWQgd2l0aCBhIG1vZGVsLWRyaXZlbiBkZXZlbG9wbWVudCBvciBhIGNvZGUtY2VudHJpYyB0ZWNobmlxdWUuICBUaGUgY29tcG9uZW50IGNvbmNlcHQgZW5jYXBzdWxhdGVzIHRoZSBhY3R1YWwgd29yayBhbmQgbGV0cyB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIHRlY2huaXF1ZSBhbmQgZmlsbCB0aGUgY29tcG9uZW50J3MgcmVhbGl6YXRpb24gd2l0aCB0aGVpciBjaG9pY2Ugb2YgQWN0aXZpdGllcyB0aGF0IHByb2R1Y2UgdGhlIHJlcXVpcmVkIG91dHB1dHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UgPGVtPkludGVyZmFjZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NDb21wb25lbnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzQ29tcG9uZW50IGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2UgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHlyaWdodDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29weXJpZ2h0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Db3B5cmlnaHQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQ29weXJpZ2h0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvcHlyaWdodCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29weXJpZ2h0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvcHlyaWdodChTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJmYWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9JbnRlcmZhY2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBnZXRJbnRlcmZhY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkludGVyZmFjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHJlcXVpcmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBFdmVyeSBNZXRob2QgVW5pdCBpcyBiZWluZyBjcmVhdGVkIGFuZCBvd25lZCBieSBhbiBhdXRob3Igb3IgYXV0aG9yaW5nIHRlYW0uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcnM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF1dGhvcnMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhdXRob3JzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF1dGhvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0QXV0aG9ycyA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkYXRlIHRoZSBsYXN0IGNoYW5nZSB0aGF0IHJlc3VsdGVkIGludG8gdGhpcyB2ZXJzaW9uIGhhcyBiZWVuIG1hZGUuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkRhdGVUaW1lIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2NoYW5nZURhdGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRDaGFuZ2VEYXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlRGF0ZShYTUxHcmVnb3JpYW5DYWxlbmRhciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbGFzdCBjaGFuZ2UgdGhhdCByZXN1bHRlZCBpbnRvIHRoaXMgdmVyc2lvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdjaGFuZ2VEZXNjcmlwdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRXZlcnkgUGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB1c2VkIHRvIHRyYWNrIGNoYW5nZXMuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZlcnNpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2ZXJzaW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFByb2Nlc3NDb21wb25lbnQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyMjYyYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQ29tcHJpc2VzIG9mIGEgbGlzdCBvZiBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbnMgKHNpbWlsYXIgdG8gb3BlcmF0aW9uIGRlY2xhcmF0aW9ucykgdGhhdCBleHByZXNzIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgYSBwcm9jZXNzIGNvbXBvbmVudC4gIFRoZXNlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9ucyBhcmUgZXhwcmVzc2VkIHVzaW5nIFRhc2sgRGVzY3JpcHRvcnMgd2hpY2ggYXJlIG5vdCBsaW5rZWQgdG8gVGFza3MgdGhhdCBhcmUgcmVsYXRlZCB0byBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBhIFJvbGUgRGVzY3JpcHRvci4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24gPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZUlPIDxlbT5JbnRlcmZhY2UgSU88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozMCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVyZmFjZSBTcGVjaWZpY2F0aW9uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbnRlcmZhY2VTcGVjaWZpY2F0aW9uJyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnRlcmZhY2UgSU88L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW50ZXJmYWNlSU8nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxXb3JrUHJvZHVjdERlc2NyaXB0b3I+IGdldEludGVyZmFjZUlPKCk7Ci0KLX0gLy8gUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMWZkNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0Rlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NEZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIGdlbmVyYWxpemVkIEFjdGl2aXR5IERlc2NyaXB0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgYSBQcm9jZXNzLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NEZXNjcmlwdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb2Nlc3NEZXNjcmlwdGlvbiBleHRlbmRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZWZpbmVzIHRoZSBzY29wZSBvZiB0aGUgUHJvY2VzcywgaS5lLiB3aGljaCB0eXBlcyBvZiBwcm9qZWN0cyBkb2VzIGl0IGFkZHJlc3MgYW5kIHdoaWNoIG5vdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NvcGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjb3BlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Njb3BlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjb3BlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY29wZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NvcGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjb3BlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogQW55IGFkZGl0aW9uYWwgbm90ZXMgb24gaG93IHRvIGFwcGx5IGFuZCBpbnN0YW50aWF0ZSB0aGlzIHByb2Nlc3MgZm9yIGEgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVzYWdlTm90ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdVc2FnZU5vdGVzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNhZ2UgTm90ZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVzYWdlTm90ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBQcm9jZXNzRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc0VsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDVhMzZkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRWxlbWVudC5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIERlc2NyaWJhYmxlIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGFuIGFic3RyYWN0IGdlbmVyYWxpemF0aW9uIGZvciBhbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgUHJvY2VzcyBwYWNrYWdlLgotICogUHJvY2VzcyBFbGVtZW50cyByZXByZXNlbnRzIFByb2Nlc3Mgc3BlY2lmaWMgZWxlbWVudHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgbWFuYWdlZCBpbiBQcm9jZXNzIFBhY2thZ2VzLiAgVGhlIHNlcGFyYXRpb24gb2YgUHJvY2VzcyBFbGVtZW50IGZyb20gQ29udGVudCBFbGVtZW50IGFsbG93cyB0byBjbGVhcmx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gcHVyZSBtZXRob2QgY29udGVudCBmcm9tIGNvbnRlbnQgdGhhdCBpcyByZXByZXNlbnRlZCBpbiBwcm9jZXNzZXMuIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc0VsZW1lbnQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NFbGVtZW50JyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc0VsZW1lbnQgZXh0ZW5kcyBEZXNjcmliYWJsZUVsZW1lbnQgewotfSAvLyBQcm9jZXNzRWxlbWVudApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Qcm9jZXNzUGFja2FnZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGYzZGQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NQYWNrYWdlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBQYWNrYWdlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIE1ldGhvZCBQYWNrYWdlIHRoYXQgY29udGFpbnMgUHJvY2VzcyBFbGVtZW50cywgb25seS4KLSAqIEEga2V5IHNlcGFyYXRpb24gb2YgY29uY2VybnMgaW4gVU1BIGlzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIE1ldGhvZCBDb250ZW50IGFuZCBQcm9jZXNzLiAgVGhpcyBzZXBhcmF0aW9uIGlzIGVuZm9yY2VkIGJ5IHNwZWNpYWwgcGFja2FnZSB0eXBlcywgd2hpY2ggZG8gbm90IGFsbG93IHRoZSBtaXhpbmcgb2YgbWV0aG9kIGNvbnRlbnQgd2l0aCBwcm9jZXNzZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2UjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldFByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Byb2Nlc3NQYWNrYWdlJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvY2Vzc1BhY2thZ2UgZXh0ZW5kcyBNZXRob2RQYWNrYWdlIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BhY2thZ2VfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MTMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcm9jZXNzRWxlbWVudCcgZ3JvdXA9JyNncm91cDoxMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFByb2Nlc3NFbGVtZW50PiBnZXRQcm9jZXNzRWxlbWVudCgpOwotCi19IC8vIFByb2Nlc3NQYWNrYWdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2OGMxMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIFByb2Nlc3MgdGhhdCBpcyBwcmVwYXJlZCBmb3IgaW5zdGFudGlhdGlvbiBieSBhIHByb2plY3QgcGxhbm5pbmcgdG9vbC4gIFR5cGljYWxseSwgaXQgaXMgY3JlYXRlZCBiYXNlZCBvbiBhIFByb2Nlc3Mgc3VjaCBhcyBhIERlbGl2ZXJ5IFByb2Nlc3MgYXMgYSB3aG9sZSAoZS5nLiBpbiBjYXNlIG9mIGEgd2F0ZXJmYWxsLWJhc2VkIGRldmVsb3BtZW50IGFwcHJvYWNoKSBvciBpbiBwYXJ0cyAoZS5nLiBpbiBjYXNlIG9mIGFuIGl0ZXJhdGl2ZSBkZXZlbG9wbWVudCBhcHByb2FjaCkuCi0gKiBBIFByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGUgcmVwcmVzZW50cyBhIHBhcnRpYWxseSBmaW5pc2hlZCBwbGFuIGZvciBhIGNvbmNyZXRlIHByb2plY3QuICBJdCB1c2VzIHRoZSBzYW1lIGluZm9ybWF0aW9uIHN0cnVjdHVyZXMgYXMgYWxsIG90aGVyIFByb2Nlc3MgVHlwZXMgdG8gcmVwcmVzZW50IHRlbXBsYXRlcyBmb3IgcHJvamVjdCBwbGFucy4gIEhvd2V2ZXIsIGNlcnRhaW4gcGxhbm5pbmcgZGVjaXNpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlIHRlbXBsYXRlIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQvb3IgcmVmb3JtYXR0ZWQgdG8gYmUgcmVhZHkgZm9yIGV4cG9ydCB0byBhIHNwZWNpZmljIHBsYW5uaW5nIHRvb2wuICBFeGFtcGxlcyBmb3Igc3VjaCBkZWNpc2lvbnMgYXJlOiBhIHRlbXBsYXRlIGhhcyBiZWVuIGNyZWF0ZWQgdG8gcmVwcmVzZW50IGEgcGxhbiBmb3IgYSBwYXJ0aWN1bGFyIEl0ZXJhdGlvbiBpbiBhbiBpdGVyYXRpdmUgZGV2ZWxvcG1lbnQgcHJvamVjdCwgd2hpY2ggZnIgZXhhbXBsZSBkaXN0aW5ndWlzaGVzIGVhcmx5IGZyb20gbGF0ZSBpdGVyYXRpb25zIGluIHRoZSBFbGFib3JhdGlvbiBwaGFzZSBvZiBhIHByb2plY3Q7IGlmIHRoZSB0YXJnZXRlZCBwbGFubmluZyB0b29sIGNhbm5vdCByZXByZXNlbnQgaW5wdXQgYW5kIG91dHB1dCBvZiBUYXNrLCB0aGVuIHRoZXNlIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cnVjdHVyZTsgY2VydGFpbiByZXBldGl0aW9ucyBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkLCBlLmcuIHN0YXRpbmcgdGhhdCBhIGN5Y2xlIG9mIHNwZWNpZmljIFRhc2sgZ3JvdXBlZCBpbiBhbiBBY3Rpdml0eSBoYXZlIHRvIGJlIHJlcGVhdGVkIG4tdGltZXM7IGV0Yy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0QmFzZVByb2Nlc3MgPGVtPkJhc2UgUHJvY2VzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBleHRlbmRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXA0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9Hcm91cDQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDo0NyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXA0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNlIFByb2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2UgUHJvY2VzczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhc2UgUHJvY2VzczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQmFzZVByb2Nlc3MnIGdyb3VwPScjZ3JvdXA6NDcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEJhc2VQcm9jZXNzKCk7Ci0KLX0gLy8gUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmVwb3J0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmVwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDg4OGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSZXBvcnQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBwcmVkZWZpbmVkIHRlbXBsYXRlIG9mIGEgcmVzdWx0IHRoYXQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBiYXNpcyBvZiBvdGhlciB3b3JrIHByb2R1Y3RzIGFzIGFuIG91dHB1dCBmcm9tIHNvbWUgZm9ybSBvZiB0b29sIGF1dG9tYXRpb24uIEFuIGV4YW1wbGUgZm9yIGEgcmVwb3J0IHdvdWxkIGJlIGEgdXNlIGNhc2UgbW9kZWwgc3VydmV5LCB3aGljaCBpcyBnZW5lcmF0ZWQgYnkgZXh0cmFjdGluZyBkaWFncmFtIGluZm9ybWF0aW9uIGZyb20gYSBncmFwaGljYWwgbW9kZWwgYW5kIHRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSBkb2N1bWVudHMgYW5kIGNvbWJpbmVzIHRoZXNlIHR3byB0eXBlcyBvZiBpbmZvcm1hdGlvbiBpbnRvIGEgcmVwb3J0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UmVwb3J0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSZXBvcnQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXBvcnQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJlcG9ydApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUmV1c2FibGVBc3NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQ5NjFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9SZXVzYWJsZUFzc2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJldXNhYmxlQXNzZXQuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBwcm92aWRlcyBhIHNvbHV0aW9uIHRvIGEgcHJvYmxlbSBmb3IgYSBnaXZlbiBjb250ZXh0LiBUaGUgYXNzZXQgbWF5IGhhdmUgYSB2YXJpYWJpbGl0eSBwb2ludCwgd2hpY2ggaXMgYSBsb2NhdGlvbiBpbiB0aGUgYXNzZXQgdGhhdCBtYXkgaGF2ZSBhIHZhbHVlIHByb3ZpZGVkIG9yIGN1c3RvbWl6ZWQgYnkgdGhlIGFzc2V0IGNvbnN1bWVyLiBUaGUgYXNzZXQgaGFzIHJ1bGVzIGZvciB1c2FnZSB3aGljaCBhcmUgdGhlIGluc3RydWN0aW9ucyBkZXNjcmliaW5nCi0gKiBob3cgdGhlIGFzc2V0IHNob3VsZCBiZSB1c2VkLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0UmV1c2FibGVBc3NldCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUmV1c2FibGVBc3NldCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJldXNhYmxlQXNzZXQgZXh0ZW5kcyBHdWlkYW5jZSB7Ci19IC8vIFJldXNhYmxlQXNzZXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9hZG1hcC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvYWRtYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwNjc4NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9hZG1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2FkbWFwLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgR3VpZGFuY2Ugd2hpY2ggaXMgb25seSByZWxhdGVkIHRvIEFjdGl2YXRlcyBhbmQgdGhlcmVmb3JlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoaXMgcGFja2FnZSB0byB0aGUgbGlzdCBvZiBHdWlkYW5jZSBUeXBlcyByYXRoZXIgdGhhbiBsaXN0ZWQgaW4gdGhlIEd1aWRhbmNlIFR5cGVzIHBhY2thZ2UuICBBIFJvYWRtYXAgcmVwcmVzZW50cyBhIGxpbmVhciB3YWxrdGhyb3VnaCBvZiBhbiBBY3Rpdml0eSwgdHlwaWNhbGx5IGEgUHJvY2Vzcy4KLSAqIEFuIGluc3RhbmNlIG9mIGEgUm9hZG1hcCByZXByZXNlbnRzIGltcG9ydGFudCBkb2N1bWVudGF0aW9uIGZvciB0aGUgQWN0aXZpdHkgb3IgUHJvY2VzcyBpdCBpcyByZWxhdGVkIHRvLiAgT2Z0ZW4gYSBjb21wbGV4IEFjdGl2aXR5IHN1Y2ggYXMgYSBQcm9jZXNzIGNhbiBiZSBtdWNoIGVhc2llciB1bmRlcnN0b29kIGJ5IHByb3ZpZGluZyBhIHdhbGt0aHJvdWdoIHdpdGggYSBsaW5lYXIgdGhyZWFkIG9mIGEgdHlwaWNhbCBpbnN0YW50aWF0aW9uIG9mIHRoaXMgQWN0aXZpdHkuICBJbiBhZGRpdGlvbiB0byBtYWtpbmcgdGhlIHByb2Nlc3MgcHJhY3RpdGlvbmVyIHVuZGVyc3RhbmQgaG93IHdvcmsgaW4gdGhlIHByb2Nlc3MgaXMgYmVpbmcgcGVyZm9ybWVkLCBhIFJvYWRtYXAgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgQWN0aXZpdGllcyBhbmQgVGFza3MgcmVsYXRlIHRvIGVhY2ggb3RoZXIgb3ZlciB0aW1lLiAgUm9hZG1hcHMgYXJlIGFsc28gdXNlZCB0byBzaG93IGhvdyBzcGVjaWZpYyBhc3BlY3RzIGFyZSBkaXN0cmlidXRlZCBvdmVyIGEgd2hvbGUgcHJvY2VzcyBwcm92aWRpbmcgYSBraW5kIG9mIGZpbHRlciBvbiB0aGUgcHJvY2VzcyBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvYWRtYXAoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvYWRtYXAnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2FkbWFwIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBSb2FkbWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYmJhMTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlZmluZXMgYSBzZXQgb2YgcmVsYXRlZCBza2lsbHMsIGNvbXBldGVuY2llcywgYW5kIHJlc3BvbnNpYmlsaXRpZXMuICBSb2xlcyBhcmUgdXNlZCBieSBUYXNrcyB0byBkZWZpbmUgd2hvIHBlcmZvcm1zIHRoZW0gYXMgd2VsbCBhcyBkZWZpbmUgYSBzZXQgb2Ygd29yayBwcm9kdWN0cyB0aGV5IGFyZSByZXNwb25zaWJsZSBmb3IuICAKLSAqIEEgUm9sZSBkZWZpbmVzIGEgc2V0IG9mIHJlbGF0ZWQgc2tpbGxzLCBjb21wZXRlbmNpZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzIG9mIGFuIGluZGl2aWR1YWwgb3IgYSBzZXQgb2YgaW5kaXZpZHVhbHMuICBSb2xlcyBhcmUgbm90IGluZGl2aWR1YWxzIG9yIHJlc291cmNlcy4gIEluZGl2aWR1YWwgbWVtYmVycyBvZiB0aGUgZGV2ZWxvcG1lbnQgb3JnYW5pemF0aW9uIHdpbGwgd2VhciBkaWZmZXJlbnQgaGF0cywgb3IgcGVyZm9ybSBkaWZmZXJlbnQgcm9sZXMuIFRoZSBtYXBwaW5nIGZyb20gaW5kaXZpZHVhbCB0byByb2xlLCBwZXJmb3JtZWQgYnkgdGhlIHByb2plY3QgbWFuYWdlciB3aGVuIHBsYW5uaW5nIGFuZCBzdGFmZmluZyBmb3IgYSBwcm9qZWN0LCBhbGxvd3MgZGlmZmVyZW50IGluZGl2aWR1YWxzIHRvIGFjdCBhcyBzZXZlcmFsIGRpZmZlcmVudCByb2xlcywgYW5kIGZvciBhIHJvbGUgdG8gYmUgcGxheWVkIGJ5IHNldmVyYWwgaW5kaXZpZHVhbHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Jlc3BvbnNpYmxlRm9yJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpOwotCi19IC8vIFJvbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OGIyMmMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVEZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZURlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgUm9sZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldFNraWxscyA8ZW0+U2tpbGxzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nUm9sZURlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUm9sZURlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIFByb3ZpZGVzIGd1aWRhbmNlIG9uIGZvciBhc3NpZ25pbmcgaW5kaXZpZHVhbHMgdG8gdGhlIFJvbGUgaW4gdGVybXMgb2Ygd2hhdCBvdGhlciByb2xlcyB0aGVzZSBpbmRpdmlkdWFscyBjb3VsZCBwZXJmb3JtIGFuZCB3aGF0IHJlc3BvbnNpYmlsaXR5IGRpZmZlcmVudCBpbmRpdmlkdWFscyBhc3NpZ25lZCB0byB0aGlzIHJvbGUgbWlnaHQgaGF2ZS4gIFRoZSBndWlkYW5jZSBjYW4gYWxzbyBkZXNjcmliZSBkaWZmZXJlbnQgYXNzaWdubWVudCBhcHByb2FjaGVzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdHMsIGUuZy4gZm9yIGxhcmdlIHZlcnN1cyBzbWFsbCB0ZWFtcyB3aGVyZSBpbmRpdmlkdWFscyBjb3VsZCBiZSBhbGxvY2F0ZWQgdG8gcm9sZXMgZnVsbCB0aW1lIHZlcnN1cyBzaGFyaW5nIHJvbGVzIHdpdGhpbiB0aGUgdGVhbS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3NpZ25tZW50QXBwcm9hY2hlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ta2lsbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIG9mIHNldCBvZiByZXF1aXJlZCBza2lsbHMgYSBwZXJzb24gbmVlZHMgdG8gcG9zc2VzcyB0byBmdWxmaWxsIHRoYXQgUm9sZS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTa2lsbHMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1NraWxscyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTa2lsbHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2tpbGxzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTa2lsbHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNraWxscyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIExpc3RzIHN5bm9ueW1zLCBpLmUuIG90aGVyIG5hbWVzIHRoZSBSb2xlIG1pZ2h0IGJlIHJlZmVycmVkIGJ5LiAgVG9vbCBzdXBwb3J0IGZvciB0aGUgbWV0YS1tb2RlbCBtaWdodCBzdXBwb3J0IHRoYXQgYSBSb2xlIG5hbWUgY2FuIGJlIGNvbnNpc3RlbnRseSBiZSByZXBsYWNlZCB3aXRoIG9uZSBvZiBpdHMgc3lub255bXMgdGhyb3VnaHQgYSBQcm9jZXNzLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TeW5vbnltczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lub255bXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3lub255bXMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3lub255bXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTeW5vbnltcyA8ZW0+U3lub255bXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN5bm9ueW1zPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lub255bXMoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZURlc2NyaXB0b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjBmZTQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBSb2xlIGluIHRoZSBjb250ZXh0IG9mIG9uZSBzcGVjaWZpYyBBY3Rpdml0eS4gIEV2ZXJ5IGJyZWFrZG93biBzdHJ1Y3R1cmUgY2FuIGRlZmluZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyBvZiBSb2xlIERlc2NyaXB0b3JzIHRvIFRhc2sgRGVzY3JpcHRvcnMgYW5kIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycy4gIFRoZXJlZm9yZSBvbmUgUm9sZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgbWFueSBSb2xlIERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZUZvciA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSb2xlRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJvbGVEZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSb2xlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZURlc2NyaXB0b3JfUm9sZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSb2xlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUgPGVtPlJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIEZvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZXNwb25zaWJsZUZvciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVzcG9uc2libGVGb3IoKTsKLQotfSAvLyBSb2xlRGVzY3JpcHRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvUm9sZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ4M2JiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVTZXQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIE9yZ2FuaXplcyBSb2xlcyBpbnRvIGNhdGVnb3JpZXMuICBJdCBpcyB1c2VkIHRvIGdyb3VwIHJvbGVzIHRvZ2V0aGVyIHRoYXQgaGF2ZSBjZXJ0YWluIGNvbW1vbmFsaXRpZXMuICBGb3IgZXhhbXBsZSwgdGhlICJBbmFseXN0cyIgUm9sZSBTZXQgY291bGQgZ3JvdXAgdGhlICJCdXNpbmVzcyBQcm9jZXNzIEFuYWx5c3QiLCAiU3lzdGVtIEFuYWx5c3QiLCBhcyB3ZWxsIGFzICJSZXF1aXJlbWVudHMgU3BlY2lmaWVyIiByb2xlcy4gIEFsbCBvZiB0aGVzZSB3b3JrIHdpdGggc2ltaWxhciB0ZWNobmlxdWVzIGFuZCBoYXZlIG92ZXJsYXBwaW5nIHNraWxscywgYnV0IGFyZSByZXF1aXJlZCBhcyBkaXN0aW5jdCByb2xlcyBmb3IgYSBtZXRob2QgKGUuZy4gdGhlIG1ldGhvZCB0aGUgSUJNIFJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzcyBpcyBiYXNlZCBvbikuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXQoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1JvbGVTZXQnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0IGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldF9Sb2xlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvbGUoKTsKLQotfSAvLyBSb2xlU2V0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1JvbGVTZXRHcm91cGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM0YWMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Sb2xlU2V0R3JvdXBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUm9sZVNldEdyb3VwaW5nLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBSb2xlIFNldHMgY2FuIGJlIGNhdGVnb3JpemVkIGludG8gUm9sZSBTZXQgR3JvdXBpbmdzLiAgRm9yIGV4YW1wbGUsIGRpZmZlcmVudCBtZXRob2RzIG1pZ2h0IGRlZmluZSBzaW1pbGFyIFJvbGUgU2V0cywgd2hpY2ggaG93ZXZlciBuZWVkIHRvIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbSBlYWNoIG90aGVyIG9uIGEgZ2xvYmFsIHNjYWxlLiAgVGh1cywgUm9sZSBTZXQgR3JvdXBpbmdzIGFsbG93IGRpc3Rpbmd1aXNoaW5nLCBmb3IgZXhhbXBsZSwgU29mdHdhcmUgU2VydmljZXMgTWFuYWdlciBSb2xlIFNldHMgZnJvbSBTb2Z0d2FyZSBEZXZlbG9wbWVudCBPcmdhbml6YXRpb24gTWFuYWdlciBSb2xlIFNldHMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcjZ2V0Um9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdSb2xlU2V0R3JvdXBpbmcnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBSb2xlU2V0R3JvdXBpbmcgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBTZXQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGVTZXQnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvbGVTZXQoKTsKLQotfSAvLyBSb2xlU2V0R3JvdXBpbmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU2VjdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1NlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwNjc4YS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgTWV0aG9kIEVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHN0cnVjdHVyYWwgc3Vic2VjdGlvbnMgb2YgYSBDb250ZW50IERlc2NyaXB0aW9uJ3Mgc2VjdGlvbkRlc2NyaXB0aW9uIGF0dHJpYnV0ZS4gIEl0IGlzIHVzZWQgZm9yIGVpdGhlciBsYXJnZSBzY2FsZSBkb2N1bWVudGF0aW9uIG9mIENvbnRlbnQgRWxlbWVudHMgb3JnYW5pemVkIGludG8gc2VjdGlvbnMgYXMgd2VsbCBhcyB0byBmbGV4aWJseSBhZGQgbmV3IFNlY3Rpb25zIHRvIENvbnRlbnQgRWxlbWVudHMgdXNpbmcgY29udHJpYnV0aW9uIHZhcmlhYmlsaXR5IGFkZGVkIHRvIHRoZSBTZWN0aW9uIGNvbmNlcHQgZm9yIE1ldGhvZCBQbHVnLWlucy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFN1YlNlY3Rpb24gPGVtPlN1YiBTZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yIDxlbT5QcmVkZWNlc3NvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdTZWN0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VjdGlvbiBleHRlbmRzIE1ldGhvZEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdWIgU2VjdGlvbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3ViU2VjdGlvbihTZWN0aW9uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3ViU2VjdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVNlY3Rpb24gZ2V0U3ViU2VjdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTdWJTZWN0aW9uIDxlbT5TdWIgU2VjdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3ViIFNlY3Rpb248L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN1YlNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFN1YlNlY3Rpb24oU2VjdGlvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFByZWRlY2Vzc29yKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdQcmVkZWNlc3NvciciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVkZWNlc3NvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlZGVjZXNzb3IoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZXMgc3RvcmUgdGhlIGRlc2NyaXB0aW9uIHRleHQgZm9yIGEgQ29udGVudCBEZXNjcmlwdGlvbidzIFNlY3Rpb24uCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRGVzY3JpcHRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZWN0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEV2ZXJ5IFNlY3Rpb24gaGFzIGEgbmFtZSB1c2VkIGZvciBleHRlcm5hbCBwcmVzZW50YXRpb24gb2YgdGhlIHNlY3Rpb24sIGUuZy4gd2hlbiBwdWJsaXNoZWQgb3Igd2hlbiBzZWN0aW9uIGhlYWRpbmcgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIG9mIGNvbnRlbnRzLiAgVGhpcyBhdHRyaWJ1dGUgaXMgc2ltaWxhciB0byBQcmVzZW50YXRpb24gTmFtZSBmb3IgQ29udGVudCBFbGVtZW50cy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VjdGlvbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZWN0aW9uTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFNlY3Rpb25fU2VjdGlvbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdzZWN0aW9uTmFtZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRTZWN0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWN0aW9uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0ndmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4ibmEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgI2lzU2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICN1bnNldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJuYSIgdW5zZXR0YWJsZT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSd2YXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUKLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCi19IC8vIFNlY3Rpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvU3VwcG9ydGluZ01hdGVyaWFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjk0MjYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1N1cHBvcnRpbmdNYXRlcmlhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTdXBwb3J0aW5nTWF0ZXJpYWwuamF2YSx2IDEuMSAyMDA4LzAxLzE1IDA4OjUyOjA3IGp0aGFtIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgY2F0Y2hhbGwgZm9yIG90aGVyIHR5cGVzIG9mIGd1aWRhbmNlIG5vdCBzcGVjaWZpY2FsbHkgZGVmaW5lZCBlbHNld2hlcmUuIEl0IGNhbiBiZSByZWxhdGVkIHRvIGFsbCBraW5kcyBvZiBDb250ZW50IEVsZW1lbnRzLCBpLmUuIGluY2x1ZGluZyBvdGhlciBndWlkYW5jZSBlbGVtZW50cy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFN1cHBvcnRpbmdNYXRlcmlhbCgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nU3VwcG9ydGluZ01hdGVyaWFsJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3VwcG9ydGluZ01hdGVyaWFsIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBTdXBwb3J0aW5nTWF0ZXJpYWwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFzay5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhkZGU1OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFzay5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIENvbnRlbnQgRWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3b3JrIGJlaW5nIHBlcmZvcm1lZCBieSBSb2xlcy4gIEl0IGRlZmluZXMgb25lIGRlZmF1bHQgcGVyZm9ybWluZyBSb2xlIGFzIHdlbGwgYXMgbWFueSBhZGRpdGlvbmFsIHBlcmZvcm1lcnMuICBBIFRhc2sgaXMgYXNzb2NpYXRlZCB0byBpbnB1dCBhbmQgb3V0cHV0IHdvcmsgcHJvZHVjdHMuICBJbnB1dHMgYXJlIGRpZmZlcmVudGlhdGVkIGluIG1hbmRhdG9yeSB2ZXJzdXMgb3B0aW9uYWwgaW5wdXRzLiAgVGhlIGFzc29jaWF0aW9ucyB0byBXb3JrIFByb2R1Y3RzIGFyZSBub3QgaW5zdGFudGlhdGFibGUvdmFyaWFibGUtbGlrZSBwYXJhbWV0ZXJzLiAgVGhleSByYXRoZXIgZXhwcmVzcyAoaHlwZXItKWxpbmtzIHRvIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHdvcmsgcHJvZHVjdHMgdHlwZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgVGFzayBhcyBpbnB1dHMgYW5kIG91dHB1dHMuICBJbiBvdGhlciB3b3JkcywgdGhlc2UgYXNzb2NpYXRpb25zIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBjYXB0dXJlIHdoaWNoIGNvbmNyZXRlIGluc3RhbmNlcyB3aWxsIGJlIHBhc3NlZCB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIG1ldGhvZCBpbiBhIHByb2plY3QuICBBbGwgb2YgdGhlIFRhc2sncyBkZWZhdWx0IGFzc29jaWF0aW9ucyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhbiBhY3R1YWwgcHJvY2VzcyBkZWZpbml0aW9uLgotICogQSBUYXNrIGRlc2NyaWJlcyBhbiBhc3NpZ25hYmxlIHVuaXQgb2Ygd29yay4gIEV2ZXJ5IFRhc2sgaXMgYXNzaWduZWQgdG8gc3BlY2lmaWMgUm9sZXMuICBUaGUgZ3JhbnVsYXJpdHkgb2YgYSBUYXNrIGlzIGdlbmVyYWxseSBhIGZldyBob3VycyB0byBhIGZldyBkYXlzLiAgSXQgdXN1YWxseSBhZmZlY3RzIG9uZSBvciBvbmx5IGEgc21hbGwgbnVtYmVyIG9mIHdvcmsgcHJvZHVjdHMuIEEgVGFzayBpcyB1c2VkIGFzIGFuIGVsZW1lbnQgb2YgZGVmaW5pbmcgYSBwcm9jZXNzLiBUYXNrcyBhcmUgZnVydGhlciB1c2VkIGZvciBwbGFubmluZyBhbmQgdHJhY2tpbmcgcHJvZ3Jlc3M7IHRoZXJlZm9yZSwgaWYgdGhleSBhcmUgZGVmaW5lZCB0b28gZmluZS1ncmFpbmVkLCB0aGV5IHdpbGwgYmUgbmVnbGVjdGVkLCBhbmQgaWYgdGhleSBhcmUgdG9vIGxhcmdlLCBwcm9ncmVzcyB3b3VsZCBoYXZlIHRvIGJlIGV4cHJlc3NlZCBpbiB0ZXJtcyBvZiBhIFRhc2sncyBwYXJ0cyAoZS5nLiBTdGVwcywgd2hpY2ggaXMgbm90IHJlY29tbWVuZGVkKS4gCi0gKiBBIFRhc2sgaGFzIGEgY2xlYXIgcHVycG9zZSBpbiB3aGljaCB0aGUgcGVyZm9ybWluZyByb2xlcyBhY2hpZXZlIGEgd2VsbCBkZWZpbmVkIGdvYWwuICBJdCBwcm92aWRlcyBjb21wbGV0ZSBzdGVwLWJ5LXN0ZXAgZXhwbGFuYXRpb25zIG9mIGRvaW5nIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gYWNoaWV2ZSB0aGlzIGdvYWwuICBUaGlzIGRlc2NyaXB0aW9uIGlzIGNvbXBsZXRlLCBpbmRlcGVuZGVudCBvZiB3aGVuIGluIGEgcHJvY2VzcyBsaWZlY3ljbGUgdGhlIHdvcmsgd291bGQgYWN0dWFsbHkgYmUgZG9uZS4gIEl0IHRoZXJlZm9yZSBkb2VzIG5vdCBkZXNjcmliZSB3aGVuIHlvdSBkbyB3aGF0IHdvcmsgYXQgd2hhdCBwb2ludCBvZiB0aW1lLCBidXQgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IGdldHMgZG9uZSB0aHJvdWdob3V0IHRoZSBkZXZlbG9wbWVudCBsaWZlY3ljbGUgdGhhdCBjb250cmlidXRlcyB0byB0aGUgYWNoaWV2ZW1lbnQgb2YgdGhpcyBnb2FsLiAgV2hlbiB0aGUgVGFzayBpcyBiZWluZyBhcHBsaWVkIGluIGEgcHJvY2VzcyB0aGVuIHRoaXMgcHJvY2VzcyBhcHBsaWNhdGlvbiAoZGVmaW5lZCBhcyBUYXNrIERlc2NyaXB0b3IpIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBvZiB3aGljaCBwaWVjZXMgb2YgdGhlIFRhc2sgd2lsbCBhY3R1YWxseSBiZSBwZXJmb3JtZWQgYXQgYW55IHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZS4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIFRhc2sgd2lsbCBiZSBwZXJmb3JtZWQgaW4gdGhlIHByb2Nlc3Mgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgYnV0IGVhY2ggdGltZSB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGVtcGhhc2lzIG9uIGRpZmZlcmVudCBzdGVwcyBvciBhc3BlY3RzIG9mIHRoZSB0YXNrIGRlc2NyaXB0aW9uLiAKLSAqIEZvciBleGFtcGxlLCBhIFRhc2sgc3VjaCBhcyAiRGV2ZWxvcCBVc2UgQ2FzZSBNb2RlbCIgZGVzY3JpYmVzIGFsbCB0aGUgd29yayB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgdG8gZGV2ZWxvcCBhIGNvbXBsZXRlIHVzZSBjYXNlIG1vZGVsLiBUaGlzIHdvdWxkIGNvbXByaXNlIG9mIHRoZSBpZGVudGlmaWNhdGlvbiBhbmQgbmFtaW5nIG9mIHVzZSBjYXNlcyBhbmQgYWN0b3JzLCB0aGUgd3JpdGluZyBvZiBhIGJyaWVmIGRlc2NyaXB0aW9uLCB0aGUgbW9kZWxpbmcgb2YgdXNlIGNhc2VzIGFuZCB0aGVpciByZWxhdGlvbnNoaXBzIGluIGRpYWdyYW1zLCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYSBiYXNpYyBmbG93LCB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWx0ZXJuYXRpdmVzIGZsb3dzLCBwZXJmb3JtaW5nIG9mIHdhbGt0aHJvdWdocyB3b3Jrc2hvcHMgYW5kIHJldmlld3MsIGV0Yy4gIEFsbCBvZiB0aGVzZSBwYXJ0cyBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBnb2FsIG9mIGRldmVsb3BpbmcgdGhlIHVzZSBjYXNlIG1vZGVsLCBidXQgdGhlIHBhcnRzIHdpbGwgYmUgcGVyZm9ybWVkIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGltZSBpbiBhIHByb2Nlc3MuICBJZGVudGlmaWNhdGlvbiwgbmFtaW5nLCBhbmQgYnJpZWYgZGVzY3JpcHRpb25zIHdvdWxkIGJlIHBlcmZvcm1lZCBlYXJseSBpbiBhIHR5cGljYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyB2ZXJzdXMgdGhlIHdyaXRpbmcgb2YgZGV0YWlsZWQgYWx0ZXJuYXRpdmUgZmxvd3Mgd2hpY2ggd291bGQgYmUgcGVyZm9ybWVkIG11Y2ggbGF0ZXIuICBBbGwgdGhlc2UgcGFydHMgb3Igc3RlcHMgd2l0aGluIHRoZSBzYW1lIFRhc2sgZGVmaW5lIHRoZSAibWV0aG9kIiBvZiBEZXZlbG9waW5nIGEgVXNlIENhc2UgTW9kZWwuICBBcHBseWluZyBzdWNoIGEgbWV0aG9kIGluIGEgbGlmZWN5Y2xlIChpLmUuIGluIGEgcHJvY2VzcykgaXMgZGVmaW5pbmcgd2hpY2ggc3RlcHMgYXJlIGRvbmUgd2hlbiBnb2luZyBmcm9tIG9uZSBpdGVyYXRpb24gdG8gdGhlIG5leHQuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2soKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rhc2snIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUYXNrIGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlY29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByZWNvbmRpdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQb3N0Y29uZGl0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Bvc3Rjb25kaXRpb24nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfUGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyZm9ybWVkQnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdNYW5kYXRvcnlJbnB1dCcgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3V0cHV0PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX091dHB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPdXRwdXQnIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE91dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbGx5UGVyZm9ybWVkQnknIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19PcHRpb25hbElucHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXQnIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrX0VzdGltYXRlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRlJyBncm91cD0nI2dyb3VwOjI3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycgZ3JvdXA9JyNncm91cDoyNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza19Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBUYXNrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRjMjBjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrRGVzY3JpcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0Rlc2NyaXB0aW9uLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgVGFzay4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0QWx0ZXJuYXRpdmVzIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdGlvbigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGFza0Rlc2NyaXB0aW9uJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFza0Rlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIENvbXByaXNlcyBvZiBzdW1tYXJpZXMgZGVzY3JpYmluZyBpbXBvcnRhbnQgZXhjZXB0aW9uYWwgYW5kIG5vbi1zdGFuZGFyZCB3YXlzIG9mIGFjaGlldmluZyB0aGlzIFRhc2sncyBkZXZlbG9wbWVudCBnb2FscyB0aGF0IHdlcmUgbm90IGNvdmVyZWQgYnkgdGhlIFRhc2sncyBTdGVwcy4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0FsdGVybmF0aXZlcyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBbHRlcm5hdGl2ZXMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogU3VtbWFyaXplcyB0aGUgbWFpbiByZWFzb24gZm9yIHBlcmZvcm1pbmcgdGhpcyBUYXNrIGFuZCB3aGF0IGlzIGludGVuZGVkIHRvIGJlIGFjaGlldmVkLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QdXJwb3NlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQdXJwb3NlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb24jZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVycG9zZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVycG9zZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFRhc2tEZXNjcmlwdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UYXNrRGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2NkZDYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rhc2tEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrRGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc3BlY2lhbCBEZXNjcmlwdG9yIHRoYXQgcmVwcmVzZW50cyBhIHByb3h5IGZvciBhIFRhc2sgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFRhc2sgRGVzY3JpcHRvcnMgdG8gV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiBUaGVyZWZvcmUgb25lIFRhc2sgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgVGFzayBEZXNjcmlwdG9ycyBlYWNoIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbiBBY3Rpdml0eSB3aXRoIGl0cyBvd24gc2V0IG9mIHJlbGF0aW9uc2hpcHMuCi0gKiBBIGtleSBkaWZmZXJlbmNlIGJldHdlZW4gTWV0aG9kIENvbnRlbnQgYW5kIFByb2Nlc3MgaXMgdGhhdCBhIENvbnRlbnQgRWxlbWVudCBzdWNoIGFzIFRhc2sgZGVzY3JpYmVzIGFsbCBhc3BlY3RzIG9mIGRvaW5nIHdvcmsgZGVmaW5lZCBhcm91bmQgdGhpcyBUYXNrLiAgVGhpcyBkZXNjcmlwdGlvbiBpcyBtYW5hZ2VkIGluIHN0ZXBzLCB3aGljaCBhcmUgbW9kZWxlZCBhcyBTZWN0aW9ucyBvZiB0aGUgVGFza3MnIENvbnRlbnQgRGVzY3JpcHRpb25zLiAgV2hlbiBhcHBseWluZyBhIFRhc2sgaW4gYSBQcm9jZXNzJyBBY3Rpdml0eSB3aXRoIGEgVGFzayBEZXNjcmlwdG9yIGEgUHJvY2VzcyBFbmdpbmVlciBuZWVkcyB0byBpbmRpY2F0ZSB0aGF0IGF0IHRoYXQgcGFydGljdWxhciBwb2ludCBpbiB0aW1lIGluIHRoZSBQcm9jZXNzIGRlZmluaXRpb24gZm9yIHdoaWNoIHRoZSBUYXNrIERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCwgb25seSBhIHN1YnNldCBvZiBzdGVwcyBzaGFsbCBiZSBwZXJmb3JtZWQuICBIZSBkZWZpbmVzIHRoaXMgc2VsZWN0aW9uIHVzaW5nIHRoZSBzZWxlY3RlZFN0ZXBzIGFzc29jaWF0aW9uLiAgSWYgaGUgd2FudHMgdG8gYWRkIHN0ZXBzIHRvIGEgVGFzayBEZXNjcmlwdG9yLCBoZSBjYW4gZGVzY3JpYmUgdGhlc2UgZWl0aGVyIHByYWdtYXRpY2FsbHkgaW4gdGhlIHJlZmluZWREZXNjcmlwdGlvbiBhdHRyaWJ1dGUgb3IgJ3Byb3Blcmx5JyBjcmVhdGUgYSBjb250cmlidXRpbmcgVGFzayB0byB0aGUgVGFzayB0aGUgVGFzayBEZXNjcmlwdG9yIHJlZmVycyB0by4KLSAqIAotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldEFzc2lzdGVkQnkgPGVtPkFzc2lzdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dCA8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwIDxlbT5TdGVwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUYXNrRGVzY3JpcHRvcicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhc2tEZXNjcmlwdG9yIGV4dGVuZHMgV29ya0JyZWFrZG93bkVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhc2s8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFzazwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFzayhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRhc2tEZXNjcmlwdG9yX1Rhc2soKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGFzayciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYXNrKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYXNrKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBlcmZvcm1lZFByaW1hcmlseUJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUGVyZm9ybWVkUHJpbWFyaWx5QnknIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nQWRkaXRpb25hbGx5UGVyZm9ybWVkQnknIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3Npc3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzaXN0ZWQgQnk8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3Npc3RlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfQXNzaXN0ZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdBc3Npc3RlZEJ5JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRBc3Npc3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdFeHRlcm5hbElucHV0JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFeHRlcm5hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nTWFuZGF0b3J5SW5wdXQnIGdyb3VwPScjZ3JvdXA6MzcnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdPcHRpb25hbElucHV0JyBncm91cD0nI2dyb3VwOjM3JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRPcHRpb25hbElucHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk91dHB1dDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J091dHB1dCcgZ3JvdXA9JyNncm91cDozNyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGVwPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RlcDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdTdGVwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U2VjdGlvbj4gZ2V0U3RlcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI3NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUYXNrRGVzY3JpcHRvcl9Jc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNTeW5jaHJvbml6ZWRXaXRoU291cmNlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpCi0JICogQHNlZSAjc2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCi19IC8vIFRhc2tEZXNjcmlwdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlYW1Qcm9maWxlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlMjc1NS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVhbVByb2ZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlYW1Qcm9maWxlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGVhbSBQcm9maWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBCcmVha2Rvd24gRWxlbWVudCB0aGF0IGdyb3VwcyBSb2xlIERlc2NyaXB0b3JzIG9yIFJlc291cmNlIERlZmluaXRpb25zIGRlZmluaW5nIGEgbmVzdGVkIGhpZXJhcmNoeSBvZiB0ZWFtcyBhbmQgdGVhbSBtZW1iZXJzLgotICogV29yayBhc3NpZ25tZW50cyBhbmQgV29yayBQcm9kdWN0IHJlc3BvbnNpYmlsaXRpZXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIEFjdGl2aXR5IHRvIEFjdGl2aXR5IGluIGEgZGV2ZWxvcG1lbnQgcHJvamVjdC4gRGlmZmVyZW50IHBoYXNlcyByZXF1aXJlIGRpZmZlcmVudCBzdGFmZmluZyBwcm9maWxlcywgaS5lLiBkaWZmZXJlbnQgc2tpbGxzIGFuZCByZXNvdXJjZXMgZG9pbmcgZGlmZmVyZW50IHR5cGVzIG9mIHdvcmsuICBUaGVyZWZvcmUsIGEgcHJvY2VzcyBuZWVkcyB0byBkZWZpbmUgc3VjaCBkaWZmZXJlbnQgcHJvZmlsZXMgaW4gYSBmbGV4aWJsZSBtYW5uZXIuICBXaGVyZWFzIENvcmUgTWV0aG9kIENvbnRlbnQgZGVmaW5lcyBzdGFuZGFyZCByZXNwb25zaWJpbGl0aWVzIGFuZCBhc3NpZ25tZW50cywgYSBwcm9jZXNzIGV4cHJlc3MgYnkgYSBicmVha2Rvd24gc3RydWN0dXJlcyBuZWVkcyB0byBiZSBhYmxlIHJlZmluZSBhbmQgcmVkZWZpbmUgdGhlc2UgdGhyb3VnaG91dCBpdHMgZGVmaW5pdGlvbi4gIFJvbGUgRGVzY3JpcHRvcnMsIFJlc291cmNlIERlZmluaXRpb25zLCBhcyB3ZWxsIGFzIFRlYW0gUHJvZmlsZXMgcHJvdmlkZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFjaGlldmUgdGhpcyBmbGV4aWJpbGl0eSBhbmQgdG8gcHJvdmlkZSBhIHByb2Nlc3MgdXNlciB3aXRoIHRoZSBjYXBhYmlsaXR5IHRvIGRlZmluZSBkaWZmZXJlbnQgdGVhbXMgYW5kIHJvbGUgcmVsYXRpb25zaGlwcyBmb3IgZXZlcnkgQWN0aXZpdHkgKGluY2x1ZGluZyBBY3Rpdml0aWVzIG9uIGFueSBuZXN0aW5nLWxldmVsIGFzIHdlbGwgYXMgSXRlcmF0aW9ucyBvciBQaGFzZXMpLgotICogSGVuY2UsIGluIGFkZGl0aW9uIHRvIHRoZSB3b3JrIGJyZWFrZG93biBhbmQgd29yayBwcm9kdWN0IGJyZWFrZG93biBzdHJ1Y3R1cmVzIGRlZmluZWQgc28gZmFyLCBUZWFtIFByb2ZpbGVzIGFyZSB1c2VkIHRvIGRlZmluZSBhIHRoaXJkIHR5cGUgb2YgYnJlYWtkb3duIHN0cnVjdHVyZTogdGVhbSBicmVha2Rvd24gc3RydWN0dXJlcy4gIFRoZXNlIGFyZSBjcmVhdGVkIGFzIGFuIEFjdGl2aXR5IHNwZWNpZmljIGhpZXJhcmNoeSBvZiBUZWFtIFByb2ZpbGVzIGNvbXByaXNpbmcgb2YgUm9sZSBEZXNjcmlwdG9ycyBhbmQgUmVzb3VyY2UgRGVmaW5pdGlvbnMuICBUaGVzZSBzdHJ1Y3R1cmVzIGNhbiBiZSBwcmVzZW50ZWQgYXMgd2VsbC1rbm93biBPcmctQ2hhcnRzLiAgSnVzdCBhcyB3aXRoIGFueSBvdGhlciBCcmVha2Rvd24gRWxlbWVudCBhbmQgRGVzY3JpcHRvcnMsIFRlYW0gUHJvZmlsZXMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbnkgQWN0aXZpdHkgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiAgSW4gb3RoZXIgd29yZHMgZXZlcnkgQWN0aXZpdHkgY2FuIGRlZmluZSBpdHMgb3duIFRlYW0gUHJvZmlsZXMgY29uc2lzdGluZyBvZiBBY3Rpdml0eSBzcGVjaWZpYyBSb2xlIERlc2NyaXB0b3JzIGFuZCBSZXNvdXJjZSBEZWZpbml0aW9ucy4gIFR5cGljYWxseSwgVGVhbSBQcm9maWxlcyBhcmUgZGVmaW5lZCBvbiB0aGUgbGV2ZWwgb2YgSXRlcmF0aW9ucyBvciBQaGFzZXMgb3Igb3RoZXIgaGlnaGVyLWxldmVsIEFjdGl2aXR5LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldFN1YlRlYW0gPGVtPlN1YiBUZWFtPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZWFtUHJvZmlsZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlYW1Qcm9maWxlIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlYW1Qcm9maWxlX0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9Sb2xlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JvbGUnIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN1cGVyIFRlYW08L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdXBlciBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nU3VwZXJUZWFtJyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRTdXBlclRlYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdWIgVGVhbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN1YiBUZWFtPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1N1YlRlYW0nIGdyb3VwPScjZ3JvdXA6MzAnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFN1YlRlYW0oKTsKLQotfSAvLyBUZWFtUHJvZmlsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZW1wbGF0ZS5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjY2RhYWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlbXBsYXRlLmphdmEsdiAxLjEgMjAwOC8wMS8xNSAwODo1MjowNyBqdGhhbSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWZpYyB0eXBlIG9mIGd1aWRhbmNlIHRoYXQgcHJvdmlkZXMgZm9yIGEgd29yayBwcm9kdWN0IGEgcHJlLWRlZmluZWQgdGFibGUgb2YgY29udGVudHMsIHNlY3Rpb25zLCBwYWNrYWdlcywgYW5kL29yIGhlYWRpbmdzLCBhIHN0YW5kYXJkaXplZCBmb3JtYXQsIGFzIHdlbGwgYXMgZGVzY3JpcHRpb25zIGhvdyB0aGUgc2VjdGlvbnMgYW5kIHBhY2thZ2VzIGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIGFuZCBjb21wbGV0ZWQuIFRlbXBsYXRlcyBjYW5ub3Qgb25seSBiZSBwcm92aWRlZCBmb3IgZG9jdW1lbnRzLCBidXQgYWxzbyBmb3IgY29uY2VwdHVhbCBtb2RlbHMgb3IgcGh5c2ljYWwgZGF0YSBzdG9yZXMuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUZW1wbGF0ZSgpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nVGVtcGxhdGUnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUZW1wbGF0ZSBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVGVtcGxhdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVGVybURlZmluaXRpb24uamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJlNTZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9UZXJtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZXJtRGVmaW5pdGlvbi5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBkZWZpbmVzIGNvbmNlcHRzIGFuZCBhcmUgdXNlZCB0byBidWlsZCB1cCB0aGUgR2xvc3NhcnkuIFRlcm1EZWZpbml0aW9ucyBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8gQ29udGVudEVsZW1lbnRzLCBidXQgdGhlaXIgcmVsYXRpb25zaGlwIGlzIGJlaW5nIGRlcml2ZWQgd2hlbiB0aGUgVGVybSBpcyB1c2VkIGluIHRoZSBDb250ZW50RWxlbWVudHMgZGVzY3JpcHRpb24gdGV4dC4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRlcm1EZWZpbml0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUZXJtRGVmaW5pdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlcm1EZWZpbml0aW9uIGV4dGVuZHMgR3VpZGFuY2UgewotfSAvLyBUZXJtRGVmaW5pdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDg5YTMyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRvb2wuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBjb250YWluZXIvYWdncmVnYXRlIGZvciBUb29sTWVudG9ycy4gIEl0IGNhbiBhbHNvIHByb3ZpZGUgZ2VuZXJhbCBkZXNjcmlwdGlvbnMgb2YgdGhlIHRvb2wgYW5kIGl0cyBnZW5lcmFsIGNhcGFiaWxpdGllcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFRvb2woKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1Rvb2wnIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBUb29sIGV4dGVuZHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwLkVudHJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwMjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0VG9vbF9Ub29sTWVudG9yKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1Rvb2xNZW50b3InIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRvb2xNZW50b3IoKTsKLQotfSAvLyBUb29sClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Ub29sTWVudG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NGY3OTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1Rvb2xNZW50b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVG9vbE1lbnRvci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgIHNwZWNpZmljIHR5cGUgb2YgZ3VpZGFuY2UgdGhhdCBzaG93cyBob3cgdG8gdXNlIGEgc3BlY2lmaWMgdG9vbCB0byBhY2NvbXBsaXNoIHNvbWUgcGllY2Ugb2Ygd29yayBhIFdvcmsgUHJvZHVjdCBlaXRoZXIgaW4gdGhlIGNvbnRleHQgb2Ygb3IgaW5kZXBlbmRlbnQgZnJvbSBhIFRhc2sgb3IgQWN0aXZpdHkuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRUb29sTWVudG9yKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdUb29sTWVudG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVG9vbE1lbnRvciBleHRlbmRzIEd1aWRhbmNlIHsKLX0gLy8gVG9vbE1lbnRvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzVhZDVmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFGYWN0b3J5LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFGYWN0b3J5IGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hRmFjdG9yeUltcGwuaW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQXBwbGljYWJsZU1ldGFDbGFzc0luZm8gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlBcnRpZmFjdCBjcmVhdGVBcnRpZmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUFydGlmYWN0RGVzY3JpcHRpb24gY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnQgY3JlYXRlQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhcGFiaWxpdHlQYXR0ZXJuIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoZWNrbGlzdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29tcG9zaXRlUm9sZSBjcmVhdGVDb21wb3NpdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbmNlcHQgY3JlYXRlQ29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudENhdGVnb3J5IGNyZWF0ZUNvbnRlbnRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ29udGVudENhdGVnb3J5UGFja2FnZSBjcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnREZXNjcmlwdGlvbiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNvbnRlbnRFbGVtZW50IGNyZWF0ZUNvbnRlbnRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyYWJsZSBjcmVhdGVEZWxpdmVyYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJhYmxlRGVzY3JpcHRpb24gY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaWJhYmxlRWxlbWVudCBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGVzY3JpcHRvciBjcmVhdGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURpc2NpcGxpbmVHcm91cGluZyBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG9jdW1lbnRSb290IGNyZWF0ZURvY3VtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Eb21haW48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRG9tYWluIGNyZWF0ZURvbWFpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0ZSBjcmVhdGVFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVzdGltYXRpbmdNZXRyaWMgY3JlYXRlRXN0aW1hdGluZ01ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUd1aWRhbmNlIGNyZWF0ZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JR3VpZGFuY2VEZXNjcmlwdGlvbiBjcmVhdGVHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlHdWlkZWxpbmUgY3JlYXRlR3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkl0ZXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJdGVyYXRpb24gY3JlYXRlSXRlcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPktpbmQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUtpbmQgY3JlYXRlS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnQgY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZEVsZW1lbnRQcm9wZXJ0eSBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RMaWJyYXJ5IGNyZWF0ZU1ldGhvZExpYnJhcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNZXRob2RQYWNrYWdlIGNyZWF0ZU1ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWV0aG9kUGx1Z2luIGNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU1ldGhvZFVuaXQgY3JlYXRlTWV0aG9kVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5NaWxlc3RvbmU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlOYW1lZEVsZW1lbnQgY3JlYXRlTmFtZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU91dGNvbWUgY3JlYXRlT3V0Y29tZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQYWNrYWdlYWJsZUVsZW1lbnQgY3JlYXRlUGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBoYXNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGhhc2UgY3JlYXRlUGhhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUGxhbm5pbmdEYXRhIGNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByYWN0aWNlIGNyZWF0ZVByYWN0aWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByYWN0aWNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJhY3RpY2VEZXNjcmlwdGlvbiBjcmVhdGVQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCW9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgY3JlYXRlUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NDb21wb25lbnQgY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBjcmVhdGVQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVByb2Nlc3NFbGVtZW50IGNyZWF0ZVByb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXBvcnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUmVwb3J0IGNyZWF0ZVJlcG9ydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJldXNhYmxlQXNzZXQgY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlSb2FkbWFwIGNyZWF0ZVJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZSBjcmVhdGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdGlvbiBjcmVhdGVSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldCBjcmVhdGVSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUm9sZVNldEdyb3VwaW5nIGNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUYXNrIGNyZWF0ZVRhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0aW9uIGNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlYW1Qcm9maWxlIGNyZWF0ZVRlYW1Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVtcGxhdGUgY3JlYXRlVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRlcm1EZWZpbml0aW9uIGNyZWF0ZVRlcm1EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlRvb2w8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2wgY3JlYXRlVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Ub29sIE1lbnRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXaGl0ZXBhcGVyIGNyZWF0ZVdoaXRlcGFwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya0JyZWFrZG93bkVsZW1lbnQgY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtEZWZpbml0aW9uIGNyZWF0ZVdvcmtEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtPcmRlciBjcmVhdGVXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVdvcmtQcm9kdWN0IGNyZWF0ZVdvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlXb3JrUHJvZHVjdERlc2NyaXB0b3IgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya1Byb2R1Y3RUeXBlIGNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlVbWFQYWNrYWdlIGdldFVtYVBhY2thZ2UoKTsKLQotfSAvL1VtYUZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFQYWNrYWdlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVW1hUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjNkZjU5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9VbWFQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzE4OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVBhY2thZ2UuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFVtYVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZU5BTUUgPSAidW1hIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOU19VUkkgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC41IjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gInVtYSI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRWxlbWVudEltcGwgPGVtPkVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRUxFTUVOVCA9IDI5OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsIDxlbT5OYW1lZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBOQU1FRF9FTEVNRU5UID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE5BTUVEX0VMRU1FTlRfX05BTUUgPSBFTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsIDxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QYWNrYWdlYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFBhY2thZ2VhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQQUNLQUdFQUJMRV9FTEVNRU5UID0gNDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBBQ0tBR0VBQkxFX0VMRU1FTlRfX05BTUUgPSBOQU1FRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gTkFNRURfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlQgPSA0MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fR1JPVVAgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9fSUQgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaWJhYmxlRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRSA9IE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fSUQgPSBNRVRIT0RfRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEID0gTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVCA9IDU4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0dST1VQID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PV05FRF9SVUxFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9fRlVMRklMTCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQID0gUFJPQ0VTU19FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRSA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTCA9IFBST0NFU1NfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVCA9IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT04gPSBQUk9DRVNTX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkUgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gUFJPQ0VTU19FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVggPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlQgPSA4MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0ZVTEZJTEwgPSBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCA8ZW0+QWN0aXZpdHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBBQ1RJVklUWSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRBVElPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fRlVMRklMTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19OT0RFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19TSEFQRUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUExBTk5JTkdfREFUQSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19HUk9VUDEgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fQ0hFQ0tMSVNUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19DT05DRVBUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fRVhBTVBMRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1VJREVMSU5FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1dISVRFUEFQRVIgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT1BUSU9OQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0lTX1BMQU5ORUQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fR1JPVVAyID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFREVDRVNTT1IgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fSVNfT05HT0lORyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19SRVBFQVRBQkxFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fUFJFQ09ORElUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1BPU1RDT05ESVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX0dST1VQMyA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfX1JPQURNQVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19JU19FTkFDVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCA8ZW0+TWV0aG9kIFVuaXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1ldGhvZFVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVQgPSA0NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19BVVRIT1JTID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9VTklUX19WRVJTSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwgPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT04gPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzYWdlIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCA8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5RGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT04gPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBQ1RJVklUWV9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX05BTUUgPSBQQUNLQUdFQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19GRUFUVVJFX0NPVU5UID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVCA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05BTUUgPSBERVNDUklCQUJMRV9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dST1VQID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PV05FRF9SVUxFID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19JRCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBERVNDUklCQUJMRV9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT04gPSBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0dST1VQMSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEUgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBERVNDUklCQUJMRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUiA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSA9IERFU0NSSUJBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gREVTQ1JJQkFCTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1QgPSA4MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dST1VQID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRlVMRklMTCA9IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fR1JPVVAyID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX0VTVElNQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9fUkVQT1JUID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwgPGVtPkFydGlmYWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1QgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTkFNRSA9IFdPUktfUFJPRFVDVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQID0gV09SS19QUk9EVUNUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19QUk9EVUNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19CUklFRl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX09SREVSSU5HX0dVSURFID0gV09SS19QUk9EVUNUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19QUkVTRU5UQVRJT05fTkFNRSA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19QUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRlVMRklMTCA9IFdPUktfUFJPRFVDVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fTk9ERUlDT04gPSBXT1JLX1BST0RVQ1RfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19TSEFQRUlDT04gPSBXT1JLX1BST0RVQ1RfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DSEVDS0xJU1QgPSBXT1JLX1BST0RVQ1RfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fQ09OQ0VQVCA9IFdPUktfUFJPRFVDVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19HVUlERUxJTkUgPSBXT1JLX1BST0RVQ1RfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1JFVVNBQkxFX0FTU0VUID0gV09SS19QUk9EVUNUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fV0hJVEVQQVBFUiA9IFdPUktfUFJPRFVDVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBXT1JLX1BST0RVQ1RfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMiA9IFdPUktfUFJPRFVDVF9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fRVNUSU1BVEUgPSBXT1JLX1BST0RVQ1RfX0VTVElNQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX1JFUE9SVCA9IFdPUktfUFJPRFVDVF9fUkVQT1JUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVEVNUExBVEUgPSBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfX0dST1VQMyA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250YWluZWQgQXJ0aWZhY3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1QgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJ0aWZhY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTiA9IDg0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwgPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19HUk9VUCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEFSVElGQUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIE91dGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwcmVzZW50YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm90YXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBBUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQVJUSUZBQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTID0gNTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05BTUUgPSBBQ1RJVklUWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fT1dORURfUlVMRSA9IEFDVElWSVRZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEFDVElWSVRZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSUQgPSBBQ1RJVklUWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19PUkRFUklOR19HVUlERSA9IEFDVElWSVRZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQUkVTU0VEID0gQUNUSVZJVFlfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEFUSU9OID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19GVUxGSUxMID0gQUNUSVZJVFlfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19BQlNUUkFDVCA9IEFDVElWSVRZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX05PREVJQ09OID0gQUNUSVZJVFlfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0FGVEVSID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IEFDVElWSVRZX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWSA9IEFDVElWSVRZX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0dST1VQMSA9IEFDVElWSVRZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0NPTkNFUFQgPSBBQ1RJVklUWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19FWEFNUExFID0gQUNUSVZJVFlfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVCA9IEFDVElWSVRZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQUNUSVZJVFlfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEFDVElWSVRZX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19PUFRJT05BTCA9IEFDVElWSVRZX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1BSRUZJWCA9IEFDVElWSVRZX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HUk9VUDIgPSBBQ1RJVklUWV9fR1JPVVAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19FVkVOVF9EUklWRU4gPSBBQ1RJVklUWV9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19JU19PTkdPSU5HID0gQUNUSVZJVFlfX0lTX09OR09JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QUkVDT05ESVRJT04gPSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19QT1NUQ09ORElUSU9OID0gQUNUSVZJVFlfX1BPU1RDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19HUk9VUDMgPSBBQ1RJVklUWV9fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVCA9IEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19ST0FETUFQID0gQUNUSVZJVFlfX1JPQURNQVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5jbHVkZXMgUGF0dGVybjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTiA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbGlkIENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfX0RJQUdSQU1fVVJJID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgPSBBQ1RJVklUWV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENhcGFiaWxpdHlQYXR0ZXJuKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTkFNRSA9IFBST0NFU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAgPSBQUk9DRVNTX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX09XTkVEX1JVTEUgPSBQUk9DRVNTX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUFJPQ0VTU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lEID0gUFJPQ0VTU19fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX09SREVSSU5HX0dVSURFID0gUFJPQ0VTU19fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5UQVRJT04gPSBQUk9DRVNTX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19GVUxGSUxMID0gUFJPQ0VTU19fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fTk9ERUlDT04gPSBQUk9DRVNTX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NIQVBFSUNPTiA9IFBST0NFU1NfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVTRU5URURfQkVGT1JFID0gUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QTEFOTklOR19EQVRBID0gUFJPQ0VTU19fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fR1JPVVAxID0gUFJPQ0VTU19fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DSEVDS0xJU1QgPSBQUk9DRVNTX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0VYQU1QTEUgPSBQUk9DRVNTX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HVUlERUxJTkUgPSBQUk9DRVNTX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBQUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fV0hJVEVQQVBFUiA9IFBST0NFU1NfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX09QVElPTkFMID0gUFJPQ0VTU19fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfUExBTk5FRCA9IFBST0NFU1NfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0dST1VQMiA9IFBST0NFU1NfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19QUkVERUNFU1NPUiA9IFBST0NFU1NfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX09OR09JTkcgPSBQUk9DRVNTX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX0lTX1JFUEVBVEFCTEUgPSBQUk9DRVNTX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1BPU1RDT05ESVRJT04gPSBQUk9DRVNTX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19HUk9VUDMgPSBQUk9DRVNTX19HUk9VUDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1JPQURNQVAgPSBQUk9DRVNTX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSVNfRU5BQ1RBQkxFID0gUFJPQ0VTU19fSVNfRU5BQ1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDQVBBQklMSVRZX1BBVFRFUk5fX1ZBUklBQklMSVRZX1RZUEUgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluY2x1ZGVzIFBhdHRlcm48L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fSU5DTFVERVNfUEFUVEVSTiA9IFBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBDb250ZXh0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX19WQUxJRF9DT05URVhUID0gUFJPQ0VTU19fVkFMSURfQ09OVEVYVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaWFncmFtIFVSSTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENBUEFCSUxJVFlfUEFUVEVSTl9fRElBR1JBTV9VUkkgPSBQUk9DRVNTX19ESUFHUkFNX1VSSTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0FQQUJJTElUWV9QQVRURVJOX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBHVUlEQU5DRSA9IDM0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX0dST1VQID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fRlVMRklMTCA9IENPTlRFTlRfRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19TSEFQRUlDT04gPSBDT05URU5UX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fQ09OQ0VQVCA9IENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENoZWNrbGlzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDSEVDS0xJU1QgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ0hFQ0tMSVNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENIRUNLTElTVF9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoZWNrbGlzdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDSEVDS0xJU1RfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsIDxlbT5EZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERFU0NSSVBUT1IgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19PV05FRF9SVUxFID0gQlJFQUtET1dOX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0ZVTEZJTEwgPSBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQUZURVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0NIRUNLTElTVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fQ09OQ0VQVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0dVSURFTElORSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUID0gQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19XSElURVBBUEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9fUFJFRklYID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZURlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTkFNRSA9IERFU0NSSVBUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fR1JPVVAgPSBERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBERVNDUklQVE9SX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gREVTQ1JJUFRPUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lEID0gREVTQ1JJUFRPUl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gREVTQ1JJUFRPUl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IERFU0NSSVBUT1JfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBERVNDUklQVE9SX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19GVUxGSUxMID0gREVTQ1JJUFRPUl9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBERVNDUklQVE9SX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBERVNDUklQVE9SX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFkgPSBERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fR1JPVVAxID0gREVTQ1JJUFRPUl9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19DSEVDS0xJU1QgPSBERVNDUklQVE9SX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19DT05DRVBUID0gREVTQ1JJUFRPUl9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0VYQU1QTEUgPSBERVNDUklQVE9SX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19HVUlERUxJTkUgPSBERVNDUklQVE9SX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQgPSBERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUiA9IERFU0NSSVBUT1JfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gREVTQ1JJUFRPUl9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19QUkVGSVggPSBERVNDUklQVE9SX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUiA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbXBvc2l0ZVJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEUgPSA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0dST1VQID0gUk9MRV9ERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fT1dORURfUlVMRSA9IFJPTEVfREVTQ1JJUFRPUl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gUk9MRV9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19CUklFRl9ERVNDUklQVElPTiA9IFJPTEVfREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fSUQgPSBST0xFX0RFU0NSSVBUT1JfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX09SREVSSU5HX0dVSURFID0gUk9MRV9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5UQVRJT05fTkFNRSA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBQUkVTU0VEID0gUk9MRV9ERVNDUklQVE9SX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5UQVRJT04gPSBST0xFX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fRlVMRklMTCA9IFJPTEVfREVTQ1JJUFRPUl9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19BQlNUUkFDVCA9IFJPTEVfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fTk9ERUlDT04gPSBST0xFX0RFU0NSSVBUT1JfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TSEFQRUlDT04gPSBST0xFX0RFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUFJFU0VOVEVEX0FGVEVSID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19QUkVTRU5URURfQkVGT1JFID0gUk9MRV9ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUExBTk5JTkdfREFUQSA9IFJPTEVfREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19TVVBFUl9BQ1RJVklUWSA9IFJPTEVfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1JPVVAxID0gUk9MRV9ERVNDUklQVE9SX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fQ0hFQ0tMSVNUID0gUk9MRV9ERVNDUklQVE9SX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0NPTkNFUFQgPSBST0xFX0RFU0NSSVBUT1JfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0VYQU1QTEUgPSBST0xFX0RFU0NSSVBUT1JfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1VJREVMSU5FID0gUk9MRV9ERVNDUklQVE9SX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19SRVVTQUJMRV9BU1NFVCA9IFJPTEVfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBST0xFX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1dISVRFUEFQRVIgPSBST0xFX0RFU0NSSVBUT1JfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IFJPTEVfREVTQ1JJUFRPUl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX09QVElPTkFMID0gUk9MRV9ERVNDUklQVE9SX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0lTX1BMQU5ORUQgPSBST0xFX0RFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1BSRUZJWCA9IFJPTEVfREVTQ1JJUFRPUl9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTVBPU0lURV9ST0xFX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBST0xFX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX1JPTEUgPSBST0xFX0RFU0NSSVBUT1JfX1JPTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVzcG9uc2libGUgRm9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fUkVTUE9OU0lCTEVfRk9SID0gUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9fR1JPVVAyID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFnZ3JlZ2F0ZWQgUm9sZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRSA9IFJPTEVfREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT01QT1NJVEVfUk9MRV9GRUFUVVJFX0NPVU5UID0gUk9MRV9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsIDxlbT5Db25jZXB0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25jZXB0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTkNFUFQgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OQ0VQVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05DRVBUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db25jZXB0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTkNFUFRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsIDxlbT5Db25zdHJhaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlNUUkFJTlQgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19PV05FRF9SVUxFID0gTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05TVFJBSU5UX19JRCA9IE1FVEhPRF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlNUUkFJTlRfX1NVUFBSRVNTRUQgPSBNRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnN0cmFpbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWSA9IDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HUk9VUCA9IENPTlRFTlRfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRSA9IENPTlRFTlRfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fSUQgPSBDT05URU5UX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEID0gQ09OVEVOVF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEwgPSBDT05URU5UX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVCA9IENPTlRFTlRfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OID0gQ09OVEVOVF9FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19HUk9VUDEgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVCA9IENPTlRFTlRfRUxFTUVOVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQgPSBDT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRSA9IENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORSA9IENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSID0gQ09OVEVOVF9FTEVNRU5UX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBhY2thZ2VJbXBsIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRSA9IDQzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fR1JPVVAgPSBNRVRIT0RfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX09SREVSSU5HX0dVSURFID0gTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRSA9IDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUCA9IE1FVEhPRF9QQUNLQUdFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX09XTkVEX1JVTEUgPSBNRVRIT0RfUEFDS0FHRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfUEFDS0FHRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0lEID0gTUVUSE9EX1BBQ0tBR0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9QQUNLQUdFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfUEFDS0FHRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fU1VQUFJFU1NFRCA9IE1FVEhPRF9QQUNLQUdFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDEgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdsb2JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR0xPQkFMID0gTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudCBDYXRlZ29yeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q29udGVudCBDYXRlZ29yeSBQYWNrYWdlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsIDxlbT5Db250ZW50IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0UgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR1JPVVAgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19PV05FRF9SVUxFID0gTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19JRCA9IE1FVEhPRF9QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENPTlRFTlRfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDT05URU5UX1BBQ0tBR0VfX0dST1VQMiA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ09OVEVOVF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWSA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fRlVMRklMTCA9IENPTlRFTlRfQ0FURUdPUllfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TSEFQRUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ09OQ0VQVCA9IENPTlRFTlRfQ0FURUdPUllfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUID0gQ09OVEVOVF9DQVRFR09SWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGVnb3JpemVkIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IENVU1RPTV9DQVRFR09SWV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEUgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05BTUUgPSBXT1JLX1BST0RVQ1RfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0lEID0gV09SS19QUk9EVUNUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fUFJFU0VOVEFUSU9OID0gV09SS19QUk9EVUNUX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0ZVTEZJTEwgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fSVNfQUJTVFJBQ1QgPSBXT1JLX1BST0RVQ1RfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX05PREVJQ09OID0gV09SS19QUk9EVUNUX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1JPVVAxID0gV09SS19QUk9EVUNUX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fQ0hFQ0tMSVNUID0gV09SS19QUk9EVUNUX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0NPTkNFUFQgPSBXT1JLX1BST0RVQ1RfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VYQU1QTEUgPSBXT1JLX1BST0RVQ1RfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fR1VJREVMSU5FID0gV09SS19QUk9EVUNUX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfUFJPRFVDVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBXT1JLX1BST0RVQ1RfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1dISVRFUEFQRVIgPSBXT1JLX1BST0RVQ1RfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IFdPUktfUFJPRFVDVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDIgPSBXT1JLX1BST0RVQ1RfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0VTVElNQVRFID0gV09SS19QUk9EVUNUX19FU1RJTUFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19SRVBPUlQgPSBXT1JLX1BST0RVQ1RfX1JFUE9SVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RFTVBMQVRFID0gV09SS19QUk9EVUNUX19URU1QTEFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX1RPT0xfTUVOVE9SID0gV09SS19QUk9EVUNUX19UT09MX01FTlRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX19HUk9VUDMgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsaXZlcmVkIFdvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1QgPSBXT1JLX1BST0RVQ1RfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT04gPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19HUk9VUCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lEID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5LZXkgQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OID0gV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2luZyBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19QQUNLQUdJTkdfR1VJREFOQ0UgPSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUCA9IFBST0NFU1NfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX09XTkVEX1JVTEUgPSBQUk9DRVNTX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0lEID0gUFJPQ0VTU19fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0ZVTEZJTEwgPSBQUk9DRVNTX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMSA9IFBST0NFU1NfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDIgPSBQUk9DRVNTX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX0dST1VQMyA9IFBST0NFU1NfX0dST1VQMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX19ESUFHUkFNX1VSSSA9IFBST0NFU1NfX0RJQUdSQU1fVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0ID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUwgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVkdWNhdGlvbiBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTiA9IDU3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0dST1VQID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0lEID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdyBUbyBTdGFmZjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRiA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBBQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IEFDVElWSVRZX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTiA9IDIxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fR1JPVVAgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gUFJPQ0VTU19ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19JRCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gUFJPQ0VTU19ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fQVVUSE9SUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVkVSU0lPTiA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gUFJPQ0VTU19ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gUFJPQ0VTU19ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgR3VpZGFuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsdGVybmF0aXZlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19QVVJQT1NFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjb3BlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBOb3RlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTID0gUFJPQ0VTU19ERVNDUklQVElPTl9fVVNBR0VfTk9URVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NhbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvamVjdCBDaGFyYWN0ZXJpc3RpY3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUyA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IFBST0NFU1NfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBPZiBDb250cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1QgPSBQUk9DRVNTX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UID0gUFJPQ0VTU19ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsIDxlbT5EZXNjcmlwdG9yIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fR1JPVVAgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQVVUSE9SUyA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEUgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fVkVSU0lPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCA9IEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZmluZWQgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfX1RBU0sgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlIFdvcmtmbG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1cgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmVHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HID0gMjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX09XTkVEX1JVTEUgPSBDT05URU5UX0NBVEVHT1JZX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0lEID0gQ09OVEVOVF9DQVRFR09SWV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU1VQUFJFU1NFRCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0NBVEVHT1JZX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAxID0gQ09OVEVOVF9DQVRFR09SWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0VYQU1QTEUgPSBDT05URU5UX0NBVEVHT1JZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NpcGxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkUgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRElTQ0lQTElORV9HUk9VUElOR19GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsIDxlbT5Eb2N1bWVudCBSb290PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX01JWEVEID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5YTUxOUyBQcmVmaXggTWFwPC9iPjwvZW0+JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fWE1MTlNfUFJFRklYX01BUCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WFNJIFNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04gPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlkgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPQ1VNRU5UX1JPT1RfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBET01BSU4gPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBET01BSU5fX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fV09SS19QUk9EVUNUID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJkb21haW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERPTUFJTl9fU1VCRE9NQUlOID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Eb21haW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRE9NQUlOX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCA8ZW0+RXN0aW1hdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBFU1RJTUFURSA9IDMwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAgPSBHVUlEQU5DRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gR1VJREFOQ0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1BSRVNFTlRBVElPTl9OQU1FID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19GVUxGSUxMID0gR1VJREFOQ0VfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NIQVBFSUNPTiA9IEdVSURBTkNFX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19DT05DRVBUID0gR1VJREFOQ0VfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fUkVVU0FCTEVfQVNTRVQgPSBHVUlEQU5DRV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVEVfX0dST1VQMiA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gTWV0cmljPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUMgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRFX0ZFQVRVUkVfQ09VTlQgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbCA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpbmdNZXRyaWNJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpbmdNZXRyaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUMgPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJTkdfTUVUUklDX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElOR19NRVRSSUNfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU5HX01FVFJJQ19GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IDMyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVTVElNQVRJT05fQ09OU0lERVJBVElPTlNfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVNUSU1BVElPTl9DT05TSURFUkFUSU9OU19GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwgPGVtPkV4YW1wbGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkV4YW1wbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRVhBTVBMRSA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX09XTkVEX1JVTEUgPSBHVUlEQU5DRV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0lEID0gR1VJREFOQ0VfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fU1VQUFJFU1NFRCA9IEdVSURBTkNFX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fSVNfQUJTVFJBQ1QgPSBHVUlEQU5DRV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fR1JPVVAxID0gR1VJREFOQ0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0VYQU1QTEUgPSBHVUlEQU5DRV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBHVUlEQU5DRV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBFWEFNUExFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEVYQU1QTEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9fVkFSSUFCSUxJVFlfVFlQRSA9IEdVSURBTkNFX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkV4YW1wbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRVhBTVBMRV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OID0gMzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0dST1VQID0gQ09OVEVOVF9ERVNDUklQVElPTl9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FVVEhPUlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19BVVRIT1JTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX1ZFUlNJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fU0VDVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlEQU5DRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURBTkNFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRHdWlkZWxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FID0gMzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBHVUlERUxJTkVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgR1VJREVMSU5FX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+R3VpZGVsaW5lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEdVSURFTElORV9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEl0ZXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBJVEVSQVRJT04gPSAzNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OQU1FID0gQUNUSVZJVFlfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19PV05FRF9SVUxFID0gQUNUSVZJVFlfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBBQ1RJVklUWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19JRCA9IEFDVElWSVRZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBBQ1RJVklUWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUFBSRVNTRUQgPSBBQ1RJVklUWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRBVElPTiA9IEFDVElWSVRZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19GVUxGSUxMID0gQUNUSVZJVFlfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX0FCU1RSQUNUID0gQUNUSVZJVFlfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19OT0RFSUNPTiA9IEFDVElWSVRZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVTRU5URURfQUZURVIgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRVNFTlRFRF9CRUZPUkUgPSBBQ1RJVklUWV9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1NVUEVSX0FDVElWSVRZID0gQUNUSVZJVFlfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDEgPSBBQ1RJVklUWV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fQ09OQ0VQVCA9IEFDVElWSVRZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fRVhBTVBMRSA9IEFDVElWSVRZX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1JFVVNBQkxFX0FTU0VUID0gQUNUSVZJVFlfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IEFDVElWSVRZX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTID0gQUNUSVZJVFlfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT1BUSU9OQUwgPSBBQ1RJVklUWV9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUFJFRklYID0gQUNUSVZJVFlfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fR1JPVVAyID0gQUNUSVZJVFlfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX0VWRU5UX0RSSVZFTiA9IEFDVElWSVRZX19JU19FVkVOVF9EUklWRU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT25nb2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfT05HT0lORyA9IEFDVElWSVRZX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX1BSRUNPTkRJVElPTiA9IEFDVElWSVRZX19QUkVDT05ESVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUE9TVENPTkRJVElPTiA9IEFDVElWSVRZX19QT1NUQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19HUk9VUDMgPSBBQ1RJVklUWV9fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fX0JSRUFLRE9XTl9FTEVNRU5UID0gQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fUk9BRE1BUCA9IEFDVElWSVRZX19ST0FETUFQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEVuYWN0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgSVRFUkFUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IElURVJBVElPTl9fVkFSSUFCSUxJVFlfVFlQRSA9IEFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkl0ZXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBJVEVSQVRJT05fRkVBVFVSRV9DT1VOVCA9IEFDVElWSVRZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLktpbmRJbXBsIDxlbT5LaW5kPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IEtJTkQgPSAzODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IEtJTkRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBLSU5EX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OID0gMzk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1dORURfUlVMRSA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fSUQgPSBNRVRIT0RfVU5JVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzZSBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTiA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmlldzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVcgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfQ09ORklHVVJBVElPTl9GRUFUVVJFX0NPVU5UID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCA8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gNDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19OQU1FID0gUEFDS0FHRUFCTEVfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfRkVBVFVSRV9DT1VOVCA9IFBBQ0tBR0VBQkxFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RMaWJyYXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZID0gNDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19OQU1FID0gTUVUSE9EX1VOSVRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1dORURfUlVMRSA9IE1FVEhPRF9VTklUX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfVU5JVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fSUQgPSBNRVRIT0RfVU5JVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfVU5JVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19TVVBQUkVTU0VEID0gTUVUSE9EX1VOSVRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NPUFlSSUdIVCA9IE1FVEhPRF9VTklUX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfTElCUkFSWV9fQ0hBTkdFX0RBVEUgPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX0NIQU5HRV9ERVNDUklQVElPTiA9IE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU4gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9MSUJSQVJZX19UT09MID0gTUVUSE9EX1VOSVRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX0xJQlJBUllfRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwgPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU4gPSA0NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTkFNRSA9IE1FVEhPRF9VTklUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19HUk9VUCA9IE1FVEhPRF9VTklUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19PV05FRF9SVUxFID0gTUVUSE9EX1VOSVRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gTUVUSE9EX1VOSVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19JRCA9IE1FVEhPRF9VTklUX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX09SREVSSU5HX0dVSURFID0gTUVUSE9EX1VOSVRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfVU5JVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fX1NVUFBSRVNTRUQgPSBNRVRIT0RfVU5JVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DT1BZUklHSFQgPSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19BVVRIT1JTID0gTUVUSE9EX1VOSVRfX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREFURSA9IE1FVEhPRF9VTklUX19DSEFOR0VfREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19DSEFOR0VfREVTQ1JJUFRJT04gPSBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19WRVJTSU9OID0gTUVUSE9EX1VOSVRfX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19SRUZFUkVOQ0VEX01FVEhPRF9QTFVHSU4gPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Vc2VyIENoYW5nZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUgPSBNRVRIT0RfVU5JVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1FVEhPRF9QTFVHSU5fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9VTklUX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwgPGVtPk1pbGVzdG9uZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNaWxlc3RvbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FID0gNDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19GVUxGSUxMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fU1VQRVJfQUNUSVZJVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fR1JPVVAxID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19DSEVDS0xJU1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19DT05DRVBUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0VYQU1QTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19HVUlERUxJTkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fV0hJVEVQQVBFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0dST1VQMiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE1JTEVTVE9ORV9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcXVpcmVkIFJlc3VsdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1pbGVzdG9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBNSUxFU1RPTkVfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuT3V0Y29tZUltcGwgPGVtPk91dGNvbWU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE91dGNvbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgT1VUQ09NRSA9IDQ4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OQU1FID0gV09SS19QUk9EVUNUX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUCA9IFdPUktfUFJPRFVDVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1dORURfUlVMRSA9IFdPUktfUFJPRFVDVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBXT1JLX1BST0RVQ1RfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBXT1JLX1BST0RVQ1RfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fSUQgPSBXT1JLX1BST0RVQ1RfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fT1JERVJJTkdfR1VJREUgPSBXT1JLX1BST0RVQ1RfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBXT1JLX1BST0RVQ1RfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19TVVBQUkVTU0VEID0gV09SS19QUk9EVUNUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1BSRVNFTlRBVElPTiA9IFdPUktfUFJPRFVDVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0ZVTEZJTEwgPSBXT1JLX1BST0RVQ1RfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19JU19BQlNUUkFDVCA9IFdPUktfUFJPRFVDVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19OT0RFSUNPTiA9IFdPUktfUFJPRFVDVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU0hBUEVJQ09OID0gV09SS19QUk9EVUNUX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19HUk9VUDEgPSBXT1JLX1BST0RVQ1RfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NIRUNLTElTVCA9IFdPUktfUFJPRFVDVF9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0NPTkNFUFQgPSBXT1JLX1BST0RVQ1RfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fRVhBTVBMRSA9IFdPUktfUFJPRFVDVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0dVSURFTElORSA9IFdPUktfUFJPRFVDVF9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19SRVVTQUJMRV9BU1NFVCA9IFdPUktfUFJPRFVDVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IFdPUktfUFJPRFVDVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19XSElURVBBUEVSID0gV09SS19QUk9EVUNUX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19WQVJJQUJJTElUWV9UWVBFID0gV09SS19QUk9EVUNUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fR1JPVVAyID0gV09SS19QUk9EVUNUX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX0VTVElNQVRFID0gV09SS19QUk9EVUNUX19FU1RJTUFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBPVVRDT01FX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fUkVQT1JUID0gV09SS19QUk9EVUNUX19SRVBPUlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcGxhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IE9VVENPTUVfX1RFTVBMQVRFID0gV09SS19QUk9EVUNUX19URU1QTEFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9fVE9PTF9NRU5UT1IgPSBXT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk91dGNvbWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgT1VUQ09NRV9GRUFUVVJFX0NPVU5UID0gV09SS19QUk9EVUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQaGFzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQSEFTRSA9IDUwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTkFNRSA9IEFDVElWSVRZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1JPVVAgPSBBQ1RJVklUWV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09XTkVEX1JVTEUgPSBBQ1RJVklUWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQUNUSVZJVFlfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gQUNUSVZJVFlfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lEID0gQUNUSVZJVFlfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX09SREVSSU5HX0dVSURFID0gQUNUSVZJVFlfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRBVElPTl9OQU1FID0gQUNUSVZJVFlfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQUFJFU1NFRCA9IEFDVElWSVRZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5UQVRJT04gPSBBQ1RJVklUWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19GVUxGSUxMID0gQUNUSVZJVFlfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfQUJTVFJBQ1QgPSBBQ1RJVklUWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fTk9ERUlDT04gPSBBQ1RJVklUWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NIQVBFSUNPTiA9IEFDVElWSVRZX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEFmdGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BSRVNFTlRFRF9BRlRFUiA9IEFDVElWSVRZX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVTRU5URURfQkVGT1JFID0gQUNUSVZJVFlfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QTEFOTklOR19EQVRBID0gQUNUSVZJVFlfX1BMQU5OSU5HX0RBVEE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwZXIgQWN0aXZpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fU1VQRVJfQUNUSVZJVFkgPSBBQ1RJVklUWV9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fR1JPVVAxID0gQUNUSVZJVFlfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19DSEVDS0xJU1QgPSBBQ1RJVklUWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19DT05DRVBUID0gQUNUSVZJVFlfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0VYQU1QTEUgPSBBQ1RJVklUWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HVUlERUxJTkUgPSBBQ1RJVklUWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUkVVU0FCTEVfQVNTRVQgPSBBQ1RJVklUWV9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBBQ1RJVklUWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fV0hJVEVQQVBFUiA9IEFDVElWSVRZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBBQ1RJVklUWV9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09QVElPTkFMID0gQUNUSVZJVFlfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfUExBTk5FRCA9IEFDVElWSVRZX19JU19QTEFOTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVGSVggPSBBQ1RJVklUWV9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0dST1VQMiA9IEFDVElWSVRZX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19QUkVERUNFU1NPUiA9IEFDVElWSVRZX19QUkVERUNFU1NPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFdmVudCBEcml2ZW48L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRVZFTlRfRFJJVkVOID0gQUNUSVZJVFlfX0lTX0VWRU5UX0RSSVZFTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPbmdvaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX09OR09JTkcgPSBBQ1RJVklUWV9fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX0lTX1JFUEVBVEFCTEUgPSBBQ1RJVklUWV9fSVNfUkVQRUFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fUFJFQ09ORElUSU9OID0gQUNUSVZJVFlfX1BSRUNPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1BPU1RDT05ESVRJT04gPSBBQ1RJVklUWV9fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBIQVNFX19HUk9VUDMgPSBBQ1RJVklUWV9fR1JPVVAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fQlJFQUtET1dOX0VMRU1FTlQgPSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1JPQURNQVAgPSBBQ1RJVklUWV9fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9fSVNfRU5BQ1RBQkxFID0gQUNUSVZJVFlfX0lTX0VOQUNUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUEhBU0VfX1ZBUklBQklMSVRZX1RZUEUgPSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QaGFzZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQSEFTRV9GRUFUVVJFX0NPVU5UID0gQUNUSVZJVFlfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQSA9IDUxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19OQU1FID0gUFJPQ0VTU19FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19HUk9VUCA9IFBST0NFU1NfRUxFTUVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1dORURfUlVMRSA9IFBST0NFU1NfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBQUk9DRVNTX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fSUQgPSBQUk9DRVNTX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fT1JERVJJTkdfR1VJREUgPSBQUk9DRVNTX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19TVVBQUkVTU0VEID0gUFJPQ0VTU19FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX1BSRVNFTlRBVElPTiA9IFBST0NFU1NfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfX0ZVTEZJTEwgPSBQUk9DRVNTX0VMRU1FTlRfX0ZVTEZJTEw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgQWJzdHJhY3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19JU19BQlNUUkFDVCA9IFBST0NFU1NfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19OT0RFSUNPTiA9IFBST0NFU1NfRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU0hBUEVJQ09OID0gUFJPQ0VTU19FTEVNRU5UX19TSEFQRUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmluaXNoIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQTEFOTklOR19EQVRBX19GSU5JU0hfREFURSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fUkFOSyA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdGFydCBEYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUExBTk5JTkdfREFUQV9fU1RBUlRfREFURSA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBMQU5OSU5HX0RBVEFfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0UgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19HUk9VUDIgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UgPSBHVUlEQU5DRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db250ZW50IFJlZmVyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9fU1VCX1BSQUNUSUNFID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTiA9IDUzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fTkFNRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DT1BZUklHSFQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19DT1BZUklHSFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19DSEFOR0VfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXBwbGljYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhY2tncm91bmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R29hbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxldmVscyBPZiBBZG9wdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2JsZW08L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0UgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAgPSBNRVRIT0RfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19PV05FRF9SVUxFID0gTUVUSE9EX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OID0gTUVUSE9EX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19JRCA9IE1FVEhPRF9QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FID0gTUVUSE9EX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX1NVUFBSRVNTRUQgPSBNRVRIT0RfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUEFDS0FHRV9fR1JPVVAxID0gTUVUSE9EX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfUEFDS0FHRSA9IE1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dMT0JBTCA9IE1FVEhPRF9QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMiA9IE1FVEhPRF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBNRVRIT0RfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlQgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUCA9IFBST0NFU1NfUEFDS0FHRV9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3duZWQgUnVsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX09XTkVEX1JVTEUgPSBQUk9DRVNTX1BBQ0tBR0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfUEFDS0FHRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX1BBQ0tBR0VfX0JSSUVGX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0lEID0gUFJPQ0VTU19QQUNLQUdFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfUEFDS0FHRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX1BBQ0tBR0VfX1BSRVNFTlRBVElPTl9OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHByZXNzZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fU1VQUFJFU1NFRCA9IFBST0NFU1NfUEFDS0FHRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX19HUk9VUDEgPSBQUk9DRVNTX1BBQ0tBR0VfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzZWQgUGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1JFVVNFRF9QQUNLQUdFID0gUFJPQ0VTU19QQUNLQUdFX19SRVVTRURfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX01FVEhPRF9QQUNLQUdFID0gUFJPQ0VTU19QQUNLQUdFX19NRVRIT0RfUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HbG9iYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fR0xPQkFMID0gUFJPQ0VTU19QQUNLQUdFX19HTE9CQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fR1JPVVAyID0gUFJPQ0VTU19QQUNLQUdFX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTU19FTEVNRU5UID0gUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NPUFlSSUdIVCA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFID0gUFJPQ0VTU19QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEUgPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04gPSBQUk9DRVNTX1BBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfRkVBVFVSRV9DT1VOVCA9IFBST0NFU1NfUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRSA9IDU2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUCA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX09XTkVEX1JVTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fQlJJRUZfREVTQ1JJUFRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19PUkRFUklOR19HVUlERSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OX05BTUUgPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQUFJFU1NFRCA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEFUSU9OID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0ZVTEZJTEwgPSBCUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSVNfQUJTVFJBQ1QgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX05PREVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU0hBUEVJQ09OID0gQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BSRVNFTlRFRF9BRlRFUiA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGVkIEJlZm9yZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUFJFU0VOVEVEX0JFRk9SRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX1BMQU5OSU5HX0RBVEEgPSBCUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fU1VQRVJfQUNUSVZJVFkgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAxPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0NIRUNLTElTVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19DT05DRVBUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19FWEFNUExFID0gQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dVSURFTElORSA9IEJSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fUkVVU0FCTEVfQVNTRVQgPSBCUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19XSElURVBBUEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBCUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19PUFRJT05BTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBQbGFubmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JU19QTEFOTkVEID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19QUkVGSVggPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDIgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZSBJTzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8gPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX0ZFQVRVUkVfQ09VTlQgPSBCUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05BTUUgPSBQUk9DRVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUCA9IFBST0NFU1NfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX09XTkVEX1JVTEUgPSBQUk9DRVNTX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IFBST0NFU1NfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBQUk9DRVNTX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0lEID0gUFJPQ0VTU19fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19PUkRFUklOR19HVUlERSA9IFBST0NFU1NfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBQUk9DRVNTX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQUFJFU1NFRCA9IFBST0NFU1NfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEFUSU9OID0gUFJPQ0VTU19fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0ZVTEZJTEwgPSBQUk9DRVNTX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfQUJTVFJBQ1QgPSBQUk9DRVNTX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX05PREVJQ09OID0gUFJPQ0VTU19fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU0hBUEVJQ09OID0gUFJPQ0VTU19fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRVNFTlRFRF9BRlRFUiA9IFBST0NFU1NfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFU0VOVEVEX0JFRk9SRSA9IFBST0NFU1NfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BMQU5OSU5HX0RBVEEgPSBQUk9DRVNTX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fU1VQRVJfQUNUSVZJVFkgPSBQUk9DRVNTX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMSA9IFBST0NFU1NfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0NIRUNLTElTVCA9IFBST0NFU1NfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19DT05DRVBUID0gUFJPQ0VTU19fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19FWEFNUExFID0gUFJPQ0VTU19fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dVSURFTElORSA9IFBST0NFU1NfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUkVVU0FCTEVfQVNTRVQgPSBQUk9DRVNTX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19TVVBQT1JUSU5HX01BVEVSSUFMID0gUFJPQ0VTU19fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19XSElURVBBUEVSID0gUFJPQ0VTU19fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBQUk9DRVNTX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PUFRJT05BTCA9IFBST0NFU1NfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19QTEFOTkVEID0gUFJPQ0VTU19fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QUkVGSVggPSBQUk9DRVNTX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDIgPSBQUk9DRVNTX19HUk9VUDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZGVjZXNzb3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1BSRURFQ0VTU09SID0gUFJPQ0VTU19fUFJFREVDRVNTT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfRVZFTlRfRFJJVkVOID0gUFJPQ0VTU19fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19PTkdPSU5HID0gUFJPQ0VTU19fSVNfT05HT0lORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fSVNfUkVQRUFUQUJMRSA9IFBST0NFU1NfX0lTX1JFUEVBVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fUFJFQ09ORElUSU9OID0gUFJPQ0VTU19fUFJFQ09ORElUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19QT1NUQ09ORElUSU9OID0gUFJPQ0VTU19fUE9TVENPTkRJVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQMyA9IFBST0NFU1NfX0dST1VQMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmVha2Rvd24gRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQlJFQUtET1dOX0VMRU1FTlQgPSBQUk9DRVNTX19CUkVBS0RPV05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2FkbWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ST0FETUFQID0gUFJPQ0VTU19fUk9BRE1BUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBFbmFjdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JU19FTkFDVEFCTEUgPSBQUk9DRVNTX19JU19FTkFDVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBQUk9DRVNTX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gUFJPQ0VTU19fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19JTkNMVURFU19QQVRURVJOID0gUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ERUZBVUxUX0NPTlRFWFQgPSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fVkFMSURfQ09OVEVYVCA9IFBST0NFU1NfX1ZBTElEX0NPTlRFWFQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19ESUFHUkFNX1VSSSA9IFBST0NFU1NfX0RJQUdSQU1fVVJJOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwNDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0ID0gUFJPQ0VTU19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyA9IFBST0NFU1NfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX0ZFQVRVUkVfQ09VTlQgPSBQUk9DRVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJlcG9ydEltcGwgPGVtPlJlcG9ydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmVwb3J0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXBvcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgUkVQT1JUID0gNjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVBPUlRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVQT1JUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFUE9SVF9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXVzYWJsZUFzc2V0SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBSRVVTQUJMRV9BU1NFVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJFVVNBQkxFX0FTU0VUX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUkVVU0FCTEVfQVNTRVRfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvYWRtYXBJbXBsIDxlbT5Sb2FkbWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2FkbWFwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPQURNQVAgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9BRE1BUF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0FETUFQX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2FkbWFwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPQURNQVBfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFJPTEUgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX0dST1VQMiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsIDxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OID0gNjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19HUk9VUCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX09XTkVEX1JVTEUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fU1VQUFJFU1NFRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29weXJpZ2h0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ09QWVJJR0hUID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ09QWVJJR0hUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BVVRIT1JTID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQVVUSE9SUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RBVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQ0hBTkdFX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19WRVJTSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2V5IENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TID0gQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNraWxsczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3lub255bXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZVNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1NFVCA9IDY3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfX1JPTEUgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgU2V0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwgPGVtPlJvbGUgU2V0IEdyb3VwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElORyA9IDY4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTkFNRSA9IENPTlRFTlRfQ0FURUdPUllfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HUk9VUCA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9DQVRFR09SWV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fQlJJRUZfREVTQ1JJUFRJT04gPSBDT05URU5UX0NBVEVHT1JZX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9DQVRFR09SWV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fUFJFU0VOVEFUSU9OX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0NBVEVHT1JZX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0ZVTEZJTEwgPSBDT05URU5UX0NBVEVHT1JZX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fTk9ERUlDT04gPSBDT05URU5UX0NBVEVHT1JZX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fU0hBUEVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19DSEVDS0xJU1QgPSBDT05URU5UX0NBVEVHT1JZX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0NPTkNFUFQgPSBDT05URU5UX0NBVEVHT1JZX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19HVUlERUxJTkUgPSBDT05URU5UX0NBVEVHT1JZX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19SRVVTQUJMRV9BU1NFVCA9IENPTlRFTlRfQ0FURUdPUllfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBST0xFX1NFVF9HUk9VUElOR19fV0hJVEVQQVBFUiA9IENPTlRFTlRfQ0FURUdPUllfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMiA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um9sZSBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFJPTEVfU0VUX0dST1VQSU5HX19ST0xFX1NFVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgUk9MRV9TRVRfR1JPVVBJTkdfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwgPGVtPlNlY3Rpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgU0VDVElPTiA9IDY5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19OQU1FID0gTUVUSE9EX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0dST1VQID0gTUVUSE9EX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBNRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fT1JERVJJTkdfR1VJREUgPSBNRVRIT0RfRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU0VDVElPTl9fU1VCX1NFQ1RJT04gPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1BSRURFQ0VTU09SID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19ERVNDUklQVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1NFQ1RJT05fTkFNRSA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBNRVRIT0RfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TZWN0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlN1cHBvcnRpbmdNYXRlcmlhbEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUwgPSA3MDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgU1VQUE9SVElOR19NQVRFUklBTF9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBTVVBQT1JUSU5HX01BVEVSSUFMX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFNVUFBPUlRJTkdfTUFURVJJQUxfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRBU0sgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTkFNRSA9IENPTlRFTlRfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1JPVVAgPSBDT05URU5UX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09XTkVEX1JVTEUgPSBDT05URU5UX0VMRU1FTlRfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQ09OVEVOVF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0lEID0gQ09OVEVOVF9FTEVNRU5UX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX09SREVSSU5HX0dVSURFID0gQ09OVEVOVF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fU1VQUFJFU1NFRCA9IENPTlRFTlRfRUxFTUVOVF9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVTRU5UQVRJT04gPSBDT05URU5UX0VMRU1FTlRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19GVUxGSUxMID0gQ09OVEVOVF9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fSVNfQUJTVFJBQ1QgPSBDT05URU5UX0VMRU1FTlRfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fTk9ERUlDT04gPSBDT05URU5UX0VMRU1FTlRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NIQVBFSUNPTiA9IENPTlRFTlRfRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fR1JPVVAxID0gQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DSEVDS0xJU1QgPSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19DT05DRVBUID0gQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VYQU1QTEUgPSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HVUlERUxJTkUgPSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBDT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fV0hJVEVQQVBFUiA9IENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fVkFSSUFCSUxJVFlfVFlQRSA9IENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QUkVDT05ESVRJT04gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1BPU1RDT05ESVRJT04gPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19QRVJGT1JNRURfQlkgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19HUk9VUDIgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19NQU5EQVRPUllfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX19PVVRQVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19fT1BUSU9OQUxfSU5QVVQgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRFID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBDT05URU5UX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfX1RPT0xfTUVOVE9SID0gQ09OVEVOVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5UYXNrPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTiA9IDcyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fR1JPVVAgPSBDT05URU5UX0RFU0NSSVBUSU9OX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19PV05FRF9SVUxFID0gQ09OVEVOVF9ERVNDUklQVElPTl9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0RFU0NSSVBUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19JRCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0RFU0NSSVBUSU9OX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9ERVNDUklQVElPTl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX1NVUFBSRVNTRUQgPSBDT05URU5UX0RFU0NSSVBUSU9OX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHlyaWdodDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NPUFlSSUdIVCA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NPUFlSSUdIVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQVVUSE9SUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0FVVEhPUlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIERhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19DSEFOR0VfREFURSA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9EQVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0NIQU5HRV9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fVkVSU0lPTiA9IENPTlRFTlRfREVTQ1JJUFRJT05fX1ZFUlNJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFpbiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04gPSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX19TRUNUSU9OID0gQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0lEID0gQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWx0ZXJuYXRpdmVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gQ09OVEVOVF9ERVNDUklQVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QdXJwb3NlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSA9IENPTlRFTlRfREVTQ1JJUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgPSBDT05URU5UX0RFU0NSSVBUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SID0gNzM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTkFNRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09XTkVEX1JVTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lEID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQUFJFU1NFRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5UQVRJT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19GVUxGSUxMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfQUJTVFJBQ1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTk9ERUlDT04gPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BSRVNFTlRFRF9BRlRFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVTRU5URURfQkVGT1JFID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QbGFubmluZyBEYXRhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fU1VQRVJfQUNUSVZJVFkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAxID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19DSEVDS0xJU1QgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19DT05DRVBUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0VYQU1QTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HVUlERUxJTkUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fUkVVU0FCTEVfQVNTRVQgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX09QVElPTkFMID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVGSVggPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0dST1VQMiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19QUkVERUNFU1NPUiA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEV2ZW50IERyaXZlbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fSVNfRVZFTlRfRFJJVkVOID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX09OR09JTkcgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFJlcGVhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1JFUEVBVEFCTEUgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhc2s8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1RBU0sgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19HUk9VUDMgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzaXN0ZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlkgPSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW5kYXRvcnkgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RlcDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEFTS19ERVNDUklQVE9SX19TVEVQID0gV09SS19CUkVBS0RPV05fRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUQVNLX0RFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCA9IFdPUktfQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFID0gNzQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dST1VQID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fT1dORURfUlVMRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gQlJFQUtET1dOX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19CUklFRl9ERVNDUklQVElPTiA9IEJSRUFLRE9XTl9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fSUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX09SREVSSU5HX0dVSURFID0gQlJFQUtET1dOX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT05fTkFNRSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBQUkVTU0VEID0gQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5UQVRJT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fRlVMRklMTCA9IEJSRUFLRE9XTl9FTEVNRU5UX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19JU19BQlNUUkFDVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fTk9ERUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TSEFQRUlDT04gPSBCUkVBS0RPV05fRUxFTUVOVF9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBBZnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUFJFU0VOVEVEX0FGVEVSID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQmVmb3JlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19QUkVTRU5URURfQkVGT1JFID0gQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUExBTk5JTkdfREFUQSA9IEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIEFjdGl2aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19TVVBFUl9BQ1RJVklUWSA9IEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1JPVVAxID0gQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fQ0hFQ0tMSVNUID0gQlJFQUtET1dOX0VMRU1FTlRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0NPTkNFUFQgPSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0VYQU1QTEUgPSBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fR1VJREVMSU5FID0gQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVBTV9QUk9GSUxFX19SRVVTQUJMRV9BU1NFVCA9IEJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1dISVRFUEFQRVIgPSBCUkVBS0RPV05fRUxFTUVOVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SXMgT3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX09QVElPTkFMID0gQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0lTX1BMQU5ORUQgPSBCUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1BSRUZJWCA9IEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX0dST1VQMiA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fUk9MRSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cGVyIFRlYW08L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSA9IEJSRUFLRE9XTl9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1YiBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURUFNX1BST0ZJTEVfX1NVQl9URUFNID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVhbSBQcm9maWxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFQU1fUFJPRklMRV9GRUFUVVJFX0NPVU5UID0gQlJFQUtET1dOX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsIDxlbT5UZW1wbGF0ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVtcGxhdGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlbXBsYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFRFTVBMQVRFID0gNzU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OQU1FID0gR1VJREFOQ0VfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HUk9VUCA9IEdVSURBTkNFX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBHVUlEQU5DRV9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fQlJJRUZfREVTQ1JJUFRJT04gPSBHVUlEQU5DRV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fT1JERVJJTkdfR1VJREUgPSBHVUlEQU5DRV9fT1JERVJJTkdfR1VJREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fUFJFU0VOVEFUSU9OX05BTUUgPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX1BSRVNFTlRBVElPTiA9IEdVSURBTkNFX19QUkVTRU5UQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RnVsZmlsbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0ZVTEZJTEwgPSBHVUlEQU5DRV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19OT0RFSUNPTiA9IEdVSURBTkNFX19OT0RFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFwZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU0hBUEVJQ09OID0gR1VJREFOQ0VfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NIRUNLTElTVCA9IEdVSURBTkNFX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0NPTkNFUFQgPSBHVUlEQU5DRV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfX0dVSURFTElORSA9IEdVSURBTkNFX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19SRVVTQUJMRV9BU1NFVCA9IEdVSURBTkNFX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURU1QTEFURV9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19XSElURVBBUEVSID0gR1VJREFOQ0VfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFTVBMQVRFX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVtcGxhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVNUExBVEVfRkVBVFVSRV9DT1VOVCA9IEdVSURBTkNFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbCA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZXJtRGVmaW5pdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OID0gNzY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTkFNRSA9IEdVSURBTkNFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fT1dORURfUlVMRSA9IEdVSURBTkNFX19PV05FRF9SVUxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gR1VJREFOQ0VfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fSUQgPSBHVUlEQU5DRV9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXJpbmcgR3VpZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX09SREVSSU5HX0dVSURFID0gR1VJREFOQ0VfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TVVBQUkVTU0VEID0gR1VJREFOQ0VfX1NVUFBSRVNTRUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19QUkVTRU5UQVRJT04gPSBHVUlEQU5DRV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19JU19BQlNUUkFDVCA9IEdVSURBTkNFX19JU19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fTk9ERUlDT04gPSBHVUlEQU5DRV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HUk9VUDEgPSBHVUlEQU5DRV9fR1JPVVAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoZWNrbGlzdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19DSEVDS0xJU1QgPSBHVUlEQU5DRV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fRVhBTVBMRSA9IEdVSURBTkNFX19FWEFNUExFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkd1aWRlbGluZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19HVUlERUxJTkUgPSBHVUlEQU5DRV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fU1VQUE9SVElOR19NQVRFUklBTCA9IEdVSURBTkNFX19TVVBQT1JUSU5HX01BVEVSSUFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9fV0hJVEVQQVBFUiA9IEdVSURBTkNFX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBURVJNX0RFRklOSVRJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVEVSTV9ERUZJTklUSU9OX19WQVJJQUJJTElUWV9UWVBFID0gR1VJREFOQ0VfX1ZBUklBQklMSVRZX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRFUk1fREVGSU5JVElPTl9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbEltcGwgPGVtPlRvb2w8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTCA9IDc3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19PV05FRF9SVUxFID0gQ09OVEVOVF9DQVRFR09SWV9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05URU5UX0NBVEVHT1JZX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19JRCA9IENPTlRFTlRfQ0FURUdPUllfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fT1JERVJJTkdfR1VJREUgPSBDT05URU5UX0NBVEVHT1JZX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NVUFBSRVNTRUQgPSBDT05URU5UX0NBVEVHT1JZX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1BSRVNFTlRBVElPTiA9IENPTlRFTlRfQ0FURUdPUllfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19GVUxGSUxMID0gQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0lTX0FCU1RSQUNUID0gQ09OVEVOVF9DQVRFR09SWV9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19OT0RFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dST1VQMSA9IENPTlRFTlRfQ0FURUdPUllfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0NIRUNLTElTVCA9IENPTlRFTlRfQ0FURUdPUllfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19FWEFNUExFID0gQ09OVEVOVF9DQVRFR09SWV9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX0dVSURFTElORSA9IENPTlRFTlRfQ0FURUdPUllfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX19XSElURVBBUEVSID0gQ09OVEVOVF9DQVRFR09SWV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05URU5UX0NBVEVHT1JZX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fR1JPVVAyID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9fVE9PTF9NRU5UT1IgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlRvb2w8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9GRUFUVVJFX0NPVU5UID0gQ09OVEVOVF9DQVRFR09SWV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sTWVudG9ySW1wbCA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1IgPSA3ODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05BTUUgPSBHVUlEQU5DRV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dST1VQID0gR1VJREFOQ0VfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PV05FRF9SVUxFID0gR1VJREFOQ0VfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IEdVSURBTkNFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19CUklFRl9ERVNDUklQVElPTiA9IEdVSURBTkNFX19CUklFRl9ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19JRCA9IEdVSURBTkNFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19PUkRFUklOR19HVUlERSA9IEdVSURBTkNFX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19QUkVTRU5UQVRJT05fTkFNRSA9IEdVSURBTkNFX19QUkVTRU5UQVRJT05fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1NVUFBSRVNTRUQgPSBHVUlEQU5DRV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fUFJFU0VOVEFUSU9OID0gR1VJREFOQ0VfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fRlVMRklMTCA9IEdVSURBTkNFX19GVUxGSUxMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIEFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0lTX0FCU1RSQUNUID0gR1VJREFOQ0VfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX05PREVJQ09OID0gR1VJREFOQ0VfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TSEFQRUlDT04gPSBHVUlEQU5DRV9fU0hBUEVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX0dST1VQMSA9IEdVSURBTkNFX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQ0hFQ0tMSVNUID0gR1VJREFOQ0VfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fQ09OQ0VQVCA9IEdVSURBTkNFX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19FWEFNUExFID0gR1VJREFOQ0VfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9fR1VJREVMSU5FID0gR1VJREFOQ0VfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1JFVVNBQkxFX0FTU0VUID0gR1VJREFOQ0VfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFRPT0xfTUVOVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMID0gR1VJREFOQ0VfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1dISVRFUEFQRVIgPSBHVUlEQU5DRV9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgVE9PTF9NRU5UT1JfX1ZBUklBQklMSVRZX1RZUEUgPSBHVUlEQU5DRV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBUT09MX01FTlRPUl9GRUFUVVJFX0NPVU5UID0gR1VJREFOQ0VfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwgPGVtPldoaXRlcGFwZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldoaXRlcGFwZXJJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdoaXRlcGFwZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUiA9IDc5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OQU1FID0gQ09OQ0VQVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fR1JPVVAgPSBDT05DRVBUX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19PV05FRF9SVUxFID0gQ09OQ0VQVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBDT05DRVBUX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OQ0VQVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19JRCA9IENPTkNFUFRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fT1JERVJJTkdfR1VJREUgPSBDT05DRVBUX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OQ0VQVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NVUFBSRVNTRUQgPSBDT05DRVBUX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1BSRVNFTlRBVElPTiA9IENPTkNFUFRfX1BSRVNFTlRBVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19GVUxGSUxMID0gQ09OQ0VQVF9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0lTX0FCU1RSQUNUID0gQ09OQ0VQVF9fSVNfQUJTVFJBQ1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9kZWljb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19OT0RFSUNPTiA9IENPTkNFUFRfX05PREVJQ09OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXBlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1NIQVBFSUNPTiA9IENPTkNFUFRfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0dST1VQMSA9IENPTkNFUFRfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0NIRUNLTElTVCA9IENPTkNFUFRfX0NIRUNLTElTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19DT05DRVBUID0gQ09OQ0VQVF9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19FWEFNUExFID0gQ09OQ0VQVF9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX0dVSURFTElORSA9IENPTkNFUFRfX0dVSURFTElORTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fUkVVU0FCTEVfQVNTRVQgPSBDT05DRVBUX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19TVVBQT1JUSU5HX01BVEVSSUFMID0gQ09OQ0VQVF9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXSElURVBBUEVSX19XSElURVBBUEVSID0gQ09OQ0VQVF9fV0hJVEVQQVBFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTkNFUFRfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdISVRFUEFQRVJfX1ZBUklBQklMSVRZX1RZUEUgPSBDT05DRVBUX19WQVJJQUJJTElUWV9UWVBFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldoaXRlcGFwZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV0hJVEVQQVBFUl9GRUFUVVJFX0NPVU5UID0gQ09OQ0VQVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwgPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtEZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTiA9IDgxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19HUk9VUCA9IE1FVEhPRF9FTEVNRU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX09XTkVEX1JVTEUgPSBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IE1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fQlJJRUZfREVTQ1JJUFRJT04gPSBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fX0lEID0gTUVUSE9EX0VMRU1FTlRfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19ERUZJTklUSU9OX19PUkRFUklOR19HVUlERSA9IE1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb24gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFU0VOVEFUSU9OX05BTUUgPSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fU1VQUFJFU1NFRCA9IE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OID0gTUVUSE9EX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTiA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgRGVmaW5pdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX0RFRklOSVRJT05fRkVBVFVSRV9DT1VOVCA9IE1FVEhPRF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwgPGVtPldvcmsgT3JkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtPcmRlckltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVIgPSA4MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfT1JERVJfX0lEID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MaW5rIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX09SREVSX19MSU5LX1RZUEUgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgT3JkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19PUkRFUl9GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1IgPSA4NTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05BTUUgPSBERVNDUklQVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAgPSBERVNDUklQVE9SX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1dORURfUlVMRSA9IERFU0NSSVBUT1JfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IERFU0NSSVBUT1JfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0JSSUVGX0RFU0NSSVBUSU9OID0gREVTQ1JJUFRPUl9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSUQgPSBERVNDUklQVE9SX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUkRFUklOR19HVUlERSA9IERFU0NSSVBUT1JfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRVNFTlRBVElPTl9OQU1FID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQUkVTU0VEID0gREVTQ1JJUFRPUl9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OID0gREVTQ1JJUFRPUl9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19GVUxGSUxMID0gREVTQ1JJUFRPUl9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19BQlNUUkFDVCA9IERFU0NSSVBUT1JfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX05PREVJQ09OID0gREVTQ1JJUFRPUl9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1NIQVBFSUNPTiA9IERFU0NSSVBUT1JfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSID0gREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0FGVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUFJFU0VOVEVEX0JFRk9SRSA9IERFU0NSSVBUT1JfX1BSRVNFTlRFRF9CRUZPUkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19QTEFOTklOR19EQVRBID0gREVTQ1JJUFRPUl9fUExBTk5JTkdfREFUQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBFUl9BQ1RJVklUWSA9IERFU0NSSVBUT1JfX1NVUEVSX0FDVElWSVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMSA9IERFU0NSSVBUT1JfX0dST1VQMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19DSEVDS0xJU1QgPSBERVNDUklQVE9SX19DSEVDS0xJU1Q7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29uY2VwdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0NPTkNFUFQgPSBERVNDUklQVE9SX19DT05DRVBUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWEFNUExFID0gREVTQ1JJUFRPUl9fRVhBTVBMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HdWlkZWxpbmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HVUlERUxJTkUgPSBERVNDUklQVE9SX19HVUlERUxJTkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVVTQUJMRV9BU1NFVCA9IERFU0NSSVBUT1JfX1JFVVNBQkxFX0FTU0VUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19TVVBQT1JUSU5HX01BVEVSSUFMID0gREVTQ1JJUFRPUl9fU1VQUE9SVElOR19NQVRFUklBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV0hJVEVQQVBFUiA9IERFU0NSSVBUT1JfX1dISVRFUEFQRVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IERFU0NSSVBUT1JfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBPcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JU19PUFRJT05BTCA9IERFU0NSSVBUT1JfX0lTX09QVElPTkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklzIFBsYW5uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfUExBTk5FRCA9IERFU0NSSVBUT1JfX0lTX1BMQU5ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1BSRUZJWCA9IERFU0NSSVBUT1JfX1BSRUZJWDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHRlcm5hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUX1RPID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PdXRwdXQgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyYWJsZSBQYXJ0czwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTID0gREVTQ1JJUFRPUl9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IERFU0NSSVBUT1JfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgPSBERVNDUklQVE9SX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEUgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX05BTUUgPSBDT05URU5UX0NBVEVHT1JZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Pd25lZCBSdWxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fT1dORURfUlVMRSA9IENPTlRFTlRfQ0FURUdPUllfX09XTkVEX1JVTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWSA9IENPTlRFTlRfQ0FURUdPUllfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJyaWVmIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX0JSSUVGX0RFU0NSSVBUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fQlJJRUZfREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fSUQgPSBDT05URU5UX0NBVEVHT1JZX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlcmluZyBHdWlkZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19PUkRFUklOR19HVUlERSA9IENPTlRFTlRfQ0FURUdPUllfX09SREVSSU5HX0dVSURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1BSRVNFTlRBVElPTl9OQU1FID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3VwcHJlc3NlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19TVVBQUkVTU0VEID0gQ09OVEVOVF9DQVRFR09SWV9fU1VQUFJFU1NFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50YXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUFJFU0VOVEFUSU9OID0gQ09OVEVOVF9DQVRFR09SWV9fUFJFU0VOVEFUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZ1bGZpbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19GVUxGSUxMID0gQ09OVEVOVF9DQVRFR09SWV9fRlVMRklMTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19JU19BQlNUUkFDVCA9IENPTlRFTlRfQ0FURUdPUllfX0lTX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vZGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX05PREVJQ09OID0gQ09OVEVOVF9DQVRFR09SWV9fTk9ERUlDT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1NIQVBFSUNPTiA9IENPTlRFTlRfQ0FURUdPUllfX1NIQVBFSUNPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUDEgPSBDT05URU5UX0NBVEVHT1JZX19HUk9VUDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fQ0hFQ0tMSVNUID0gQ09OVEVOVF9DQVRFR09SWV9fQ0hFQ0tMSVNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19DT05DRVBUID0gQ09OVEVOVF9DQVRFR09SWV9fQ09OQ0VQVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fRVhBTVBMRSA9IENPTlRFTlRfQ0FURUdPUllfX0VYQU1QTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fR1VJREVMSU5FID0gQ09OVEVOVF9DQVRFR09SWV9fR1VJREVMSU5FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fUkVVU0FCTEVfQVNTRVQgPSBDT05URU5UX0NBVEVHT1JZX19SRVVTQUJMRV9BU1NFVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdXBwb3J0aW5nIE1hdGVyaWFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fU1VQUE9SVElOR19NQVRFUklBTCA9IENPTlRFTlRfQ0FURUdPUllfX1NVUFBPUlRJTkdfTUFURVJJQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+V2hpdGVwYXBlcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1dISVRFUEFQRVIgPSBDT05URU5UX0NBVEVHT1JZX19XSElURVBBUEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBXT1JLX1BST0RVQ1RfVFlQRV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCA9IENPTlRFTlRfQ0FURUdPUllfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19WQVJJQUJJTElUWV9UWVBFID0gQ09OVEVOVF9DQVRFR09SWV9fVkFSSUFCSUxJVFlfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IFdPUktfUFJPRFVDVF9UWVBFX19HUk9VUDIgPSBDT05URU5UX0NBVEVHT1JZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfX1dPUktfUFJPRFVDVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgV09SS19QUk9EVUNUX1RZUEVfRkVBVFVSRV9DT1VOVCA9IENPTlRFTlRfQ0FURUdPUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBWQVJJQUJJTElUWV9UWVBFID0gODc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrT3JkZXJUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IFdPUktfT1JERVJfVFlQRSA9IDg4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRWYXJpYWJpbGl0eVR5cGVPYmplY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgVkFSSUFCSUxJVFlfVFlQRV9PQkpFQ1QgPSA4OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICc8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBXT1JLX09SREVSX1RZUEVfT0JKRUNUID0gOTA7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5IDxlbT5BY3Rpdml0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BY3Rpdml0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRBY3Rpdml0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFByZWNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5X0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRBY3Rpdml0eV9CcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFJvYWRtYXAoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Sb2FkbWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUgPGVtPklzIEVuYWN0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEVuYWN0YWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2lzSXNFbmFjdGFibGUoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5I2dldFZhcmlhYmlsaXR5VHlwZSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eSNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24gPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBzZWUgI2dldEFjdGl2aXR5RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0SG93VG9TdGFmZiA8ZW0+SG93IFRvIFN0YWZmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SG93IFRvIFN0YWZmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRIb3dUb1N0YWZmKCkKLQkgKiBAc2VlICNnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHlEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm8jaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQHNlZSAjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEFydGlmYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0X0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0IDxlbT5Db250YWluZWQgQXJ0aWZhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRhaW5lZCBBcnRpZmFjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0I2dldENvbnRhaW5lZEFydGlmYWN0KCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24gPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSA8ZW0+QnJpZWYgT3V0bGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkJyaWVmIE91dGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldEJyaWVmT3V0bGluZSgpCi0JICogQHNlZSAjZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbiNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBzZWUgI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0UmVwcmVzZW50YXRpb24gPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb24jZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uI2dldE5vdGF0aW9uKCkKLQkgKiBAc2VlICNnZXRBcnRpZmFjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlciA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSA8ZW0+U3VwZXIgQWN0aXZpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdXBlciBBY3Rpdml0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDaGVja2xpc3QoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRDb25jZXB0KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGUgPGVtPkV4YW1wbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldEV4YW1wbGUoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0R3VpZGVsaW5lKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNnZXRSZXVzYWJsZUFzc2V0KCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0V2hpdGVwYXBlcigpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9IYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc09wdGlvbmFsIDxlbT5JcyBPcHRpb25hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIE9wdGlvbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudCNpc0lzT3B0aW9uYWwoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgUGxhbm5lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjaXNJc1BsYW5uZWQoKQotCSAqIEBzZWUgI2dldEJyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZml4IDxlbT5QcmVmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QcmVmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50I2dldFByZWZpeCgpCi0JICogQHNlZSAjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiA8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24jZ2V0VXNhZ2VHdWlkYW5jZSA8ZW0+VXNhZ2UgR3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiNnZXRVc2FnZUd1aWRhbmNlKCkKLQkgKiBAc2VlICNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0IDxlbT5DaGVja2xpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDaGVja2xpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUgPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbXBvc2l0ZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDb21wb3NpdGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGUjZ2V0QWdncmVnYXRlZFJvbGUgPGVtPkFnZ3JlZ2F0ZWQgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZSNnZXRBZ2dyZWdhdGVkUm9sZSgpCi0JICogQHNlZSAjZ2V0Q29tcG9zaXRlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25jZXB0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uY2VwdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludCA8ZW0+Q29uc3RyYWludDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29uc3RyYWludCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50I2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50I2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0Q29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeSA8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5UGFja2FnZSNnZXRDb250ZW50Q2F0ZWdvcnkgPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlI2dldENvbnRlbnRDYXRlZ29yeSgpCi0JICogQHNlZSAjZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Db250ZW50Q2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldEtleUNvbnNpZGVyYXRpb25zIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldENvbnRlbnREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uI2dldFNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0U2VjdGlvbigpCi0JICogQHNlZSAjZ2V0Q29udGVudERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxJZCA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiNnZXRFeHRlcm5hbElkKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRDb250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCNnZXRDaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q2hlY2tsaXN0KCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ2hlY2tsaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0Q29uY2VwdCA8ZW0+Q29uY2VwdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldENvbmNlcHQoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEV4YW1wbGUoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0R3VpZGVsaW5lIDxlbT5HdWlkZWxpbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldEd1aWRlbGluZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0d1aWRlbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFJldXNhYmxlQXNzZXQgPGVtPlJldXNhYmxlIEFzc2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFJldXNhYmxlQXNzZXQoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkgKiBAc2VlICNnZXRDb250ZW50RWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V2hpdGVwYXBlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFdoaXRlcGFwZXIoKQotCSAqIEBzZWUgI2dldENvbnRlbnRFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudEVsZW1lbnQjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50I2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQHNlZSAjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UgPGVtPkNvbnRlbnQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50IFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q29udGVudFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDb250ZW50UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q29udGVudFBhY2thZ2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnQgPGVtPkNvbnRlbnQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udGVudCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudFBhY2thZ2UjZ2V0Q29udGVudEVsZW1lbnQoKQotCSAqIEBzZWUgI2dldENvbnRlbnRQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkgPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50IDxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5DYXRlZ29yaXplZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkKLQkgKiBAc2VlICNnZXRDdXN0b21DYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfQ2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3ViIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnkjZ2V0U3ViQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldEN1c3RvbUNhdGVnb3J5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUgPGVtPkRlbGl2ZXJhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldEdyb3VwMygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0dyb3VwMygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlI2dldERlbGl2ZXJlZFdvcmtQcm9kdWN0IDxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGVEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbiA8ZW0+RXh0ZXJuYWwgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0RXh0ZXJuYWxEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9FeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UgPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhY2thZ2luZyBHdWlkYW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24jZ2V0UGFja2FnaW5nR3VpZGFuY2UoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fUGFja2FnaW5nR3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyA8ZW0+RGVsaXZlcnkgUHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZWxpdmVyeVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwNDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRHcm91cDQoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsIDxlbT5Db21tdW5pY2F0aW9ucyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcyNnZXRFZHVjYXRpb25NYXRlcmlhbCA8ZW0+RWR1Y2F0aW9uIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5FZHVjYXRpb24gTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3MjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NhbGUoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIDxlbT5Qcm9qZWN0IENoYXJhY3RlcmlzdGljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0Umlza0xldmVsIDxlbT5SaXNrIExldmVsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmlzayBMZXZlbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFJpc2tMZXZlbCgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlIDxlbT5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQHNlZSAjZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QgPGVtPlR5cGUgT2YgQ29udHJhY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24jZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBzZWUgI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50IDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERlc2NyaWJhYmxlRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QcmVzZW50YXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0UHJlc2VudGF0aW9uKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERlc2NyaWJhYmxlRWxlbWVudF9QcmVzZW50YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjZ2V0RnVsZmlsbCA8ZW0+RnVsZmlsbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RnVsZmlsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXRGdWxmaWxsKCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNpc0lzQWJzdHJhY3QgPGVtPklzIEFic3RyYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SXMgQWJzdHJhY3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQjaXNJc0Fic3RyYWN0KCkKLQkgKiBAc2VlICNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbiA8ZW0+Tm9kZWljb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob2RlaWNvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudCNnZXROb2RlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcGVpY29uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50I2dldFNoYXBlaWNvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpYmFibGVFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yIDxlbT5EZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBzZWUgI2dldERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiNnZXRSZWZpbmVkRGVzY3JpcHRpb24gPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZpbmVkIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkRpc2NpcGxpbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERpc2NpcGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRUYXNrKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFN1YkRpc2NpcGxpbmUgPGVtPlN1YiBEaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWIgRGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUjZ2V0U3ViRGlzY2lwbGluZSgpCi0JICogQHNlZSAjZ2V0RGlzY2lwbGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZSNnZXRSZWZlcmVuY2VXb3JrZmxvdyA8ZW0+UmVmZXJlbmNlIFdvcmtmbG93PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2UgV29ya2Zsb3c8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lI2dldFJlZmVyZW5jZVdvcmtmbG93KCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1JlZmVyZW5jZVdvcmtmbG93KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcgPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmcjZ2V0RGlzY2lwbGluZSA8ZW0+RGlzY2lwbGluZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZyNnZXREaXNjaXBsaW5lKCkKLQkgKiBAc2VlICNnZXREaXNjaXBsaW5lR3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RG9jdW1lbnRSb290KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1peGVkIDxlbT5NaXhlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWl4ZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWl4ZWQoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYTUxOU1ByZWZpeE1hcCA8ZW0+WE1MTlMgUHJlZml4IE1hcDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WE1MTlNQcmVmaXhNYXAoKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIG1hcCAnPGVtPlhTSSBTY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9jdW1lbnRSb290I2dldE1ldGhvZExpYnJhcnkgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQHNlZSAjZ2V0RG9jdW1lbnRSb290KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QjZ2V0TWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCNnZXRNZXRob2RQbHVnaW4oKQotCSAqIEBzZWUgI2dldERvY3VtZW50Um9vdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluIDxlbT5Eb21haW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RG9tYWluPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbiNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldERvbWFpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluI2dldFN1YmRvbWFpbiA8ZW0+U3ViZG9tYWluPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdWJkb21haW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4jZ2V0U3ViZG9tYWluKCkKLQkgKiBAc2VlICNnZXREb21haW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERvbWFpbl9TdWJkb21haW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldEVzdGltYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRFc3RpbWF0ZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljIDxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZSNnZXRFc3RpbWF0aW9uTWV0cmljKCkKLQkgKiBAc2VlICNnZXRFc3RpbWF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JICogQHNlZSAjZ2V0RXN0aW1hdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEVzdGltYXRlX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYyA8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRFeGFtcGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZSA8ZW0+R3VpZGFuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb24gPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRhY2htZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2VEZXNjcmlwdGlvbiNnZXRBdHRhY2htZW50KCkKLQkgKiBAc2VlICNnZXRHdWlkYW5jZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkd1aWRlbGluZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0R3VpZGVsaW5lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24gPGVtPkl0ZXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5JdGVyYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldEl0ZXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8gPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQjZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKQotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldEtpbmRfQXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0QmFzZUNvbmZpZ3VyYXRpb24gPGVtPkJhc2UgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QmFzZSBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRCYXNlQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWV0aG9kIFBsdWdpbiBTZWxlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPGVtPk1ldGhvZCBQYWNrYWdlIFNlbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2UgU2VsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldyA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBWaWV3PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXREZWZhdWx0VmlldygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0UHJvY2Vzc1ZpZXcgPGVtPlByb2Nlc3MgVmlldzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UHJvY2VzcyBWaWV3PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRQcm9jZXNzVmlldygpCi0JICogQHNlZSAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb24jZ2V0U3VidHJhY3RlZENhdGVnb3J5IDxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5TdWJ0cmFjdGVkIENhdGVnb3J5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kQ29uZmlndXJhdGlvbiNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uI2dldEFkZGVkQ2F0ZWdvcnkoKQotCSAqIEBzZWUgI2dldE1ldGhvZENvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQWRkZWRDYXRlZ29yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCA8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRHcm91cCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0T3duZWRSdWxlIDxlbT5Pd25lZCBSdWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Pd25lZCBSdWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRPd25lZFJ1bGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQjZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RFbGVtZW50X01ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QnJpZWYgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldEJyaWVmRGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldElkIDxlbT5JZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudCNnZXRJZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9JZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3JkZXJpbmcgR3VpZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldE9yZGVyaW5nR3VpZGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlc2VudGF0aW9uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2dldFByZXNlbnRhdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldE1ldGhvZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCA8ZW0+U3VwcHJlc3NlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN1cHByZXNzZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50I2lzU3VwcHJlc3NlZCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5I2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeSNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kTGlicmFyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnkjZ2V0VG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5I2dldFRvb2woKQotCSAqIEBzZWUgI2dldE1ldGhvZExpYnJhcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZExpYnJhcnlfVG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRHcm91cDEoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmV1c2VkIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlI2dldFJldXNlZFBhY2thZ2UoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UjZ2V0TWV0aG9kUGFja2FnZSA8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2xvYmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZSNpc0dsb2JhbCgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbiA8ZW0+UmVmZXJlbmNlZCBNZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5SZWZlcmVuY2VkIE1ldGhvZCBQbHVnaW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0UmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RQbHVnaW5fUmVmZXJlbmNlZE1ldGhvZFBsdWdpbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbiNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWV0aG9kIFBhY2thZ2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jZ2V0TWV0aG9kUGFja2FnZSgpCi0JICogQHNlZSAjZ2V0TWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW4jaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1VzZXJDaGFuZ2VhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0IDxlbT5NZXRob2QgVW5pdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NZXRob2QgVW5pdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE1ldGhvZFVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvcHlyaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NvcHlyaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0TWV0aG9kVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRNZXRob2RVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSA8ZW0+TWlsZXN0b25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0TWlsZXN0b25lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lI2dldFJlcXVpcmVkUmVzdWx0IDxlbT5SZXF1aXJlZCBSZXN1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlcXVpcmVkIFJlc3VsdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZSNnZXRSZXF1aXJlZFJlc3VsdCgpCi0JICogQHNlZSAjZ2V0TWlsZXN0b25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudCA8ZW0+TmFtZWQgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXROYW1lZEVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldE5hbWVkRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0TmFtZWRFbGVtZW50X05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldE91dGNvbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlIDxlbT5QaGFzZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQaGFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBsYW5uaW5nIERhdGE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFBsYW5uaW5nRGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEjZ2V0RmluaXNoRGF0ZSA8ZW0+RmluaXNoIERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaW5pc2ggRGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rIDxlbT5SYW5rPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmFuazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRSYW5rKCkKLQkgKiBAc2VlICNnZXRQbGFubmluZ0RhdGEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9SYW5rKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YSNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TdGFydCBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhI2dldFN0YXJ0RGF0ZSgpCi0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSA8ZW0+UHJhY3RpY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UHJhY3RpY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2UgPGVtPkFjdGl2aXR5IFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2UgPGVtPkNvbnRlbnQgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlI2dldENvbnRlbnRSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3ViIFByYWN0aWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UjZ2V0U3ViUHJhY3RpY2UoKQotCSAqIEBzZWUgI2dldFByYWN0aWNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRQcmFjdGljZV9TdWJQcmFjdGljZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiA8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcmFjdGljZURlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BcHBsaWNhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QXBwbGljYXRpb24oKQotCSAqIEBzZWUgI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRCYWNrZ3JvdW5kIDxlbT5CYWNrZ3JvdW5kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmFja2dyb3VuZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0QmFja2dyb3VuZCgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0R29hbHMgPGVtPkdvYWxzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R29hbHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uI2dldEdvYWxzKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRMZXZlbHNPZkFkb3B0aW9uKCkKLQkgKiBAc2VlICNnZXRQcmFjdGljZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbiNnZXRQcm9ibGVtIDxlbT5Qcm9ibGVtPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvYmxlbTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb24jZ2V0UHJvYmxlbSgpCi0JICogQHNlZSAjZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRJbmNsdWRlc1BhdHRlcm4gPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzI2dldEluY2x1ZGVzUGF0dGVybigpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCA8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVmYXVsdCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXREZWZhdWx0Q29udGV4dCgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0VmFsaWRDb250ZXh0IDxlbT5WYWxpZCBDb250ZXh0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5WYWxpZCBDb250ZXh0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyNnZXRWYWxpZENvbnRleHQoKQotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGlhZ3JhbVVSSSA8ZW0+RGlhZ3JhbSBVUkk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaWFncmFtIFVSSTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQHNlZSAjZ2V0UHJvY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19EaWFncmFtVVJJKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDb3B5cmlnaHQgPGVtPkNvcHlyaWdodDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvcHlyaWdodDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0Q29weXJpZ2h0KCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEludGVyZmFjZSA8ZW0+SW50ZXJmYWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW50ZXJmYWNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRJbnRlcmZhY2UoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFByb2Nlc3MoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRfUHJvY2VzcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdXRob3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRBdXRob3JzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0F1dGhvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEYXRlIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNoYW5nZSBEYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbiA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzQ29tcG9uZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIENvbXBvbmVudCBJbnRlcmZhY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlI2dldEludGVyZmFjZVNwZWNpZmljYXRpb24oKQotCSAqIEBzZWUgI2dldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UjZ2V0SW50ZXJmYWNlSU8gPGVtPkludGVyZmFjZSBJTzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW50ZXJmYWNlIElPPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSNnZXRJbnRlcmZhY2VJTygpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VJTygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5Qcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUgPGVtPlNjb3BlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NvcGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24jZ2V0U2NvcGUoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVzYWdlIE5vdGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0Rlc2NyaXB0aW9uI2dldFVzYWdlTm90ZXMoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1VzYWdlTm90ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50IDxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByb2Nlc3MgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRQcm9jZXNzUGFja2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFByb2Nlc3NQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSNnZXRQcm9jZXNzRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUjZ2V0R3JvdXA0IDxlbT5Hcm91cDQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwNDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEdyb3VwNCgpCi0JICogQHNlZSAjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwNCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzIDxlbT5CYXNlIFByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkJhc2UgUHJvY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlI2dldEJhc2VQcm9jZXNzKCkKLQkgKiBAc2VlICNnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJlcG9ydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5SZXVzYWJsZSBBc3NldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJldXNhYmxlQXNzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAgPGVtPlJvYWRtYXA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9hZG1hcDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvYWRtYXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlI2dldFJlc3BvbnNpYmxlRm9yIDxlbT5SZXNwb25zaWJsZSBGb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGUjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX0Fzc2lnbm1lbnRBcHByb2FjaGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNraWxsczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiNnZXRTa2lsbHMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMgPGVtPlN5bm9ueW1zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lub255bXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24jZ2V0U3lub255bXMoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yI2dldFJvbGUoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3IjZ2V0UmVzcG9uc2libGVGb3IoKQotCSAqIEBzZWUgI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCA8ZW0+Um9sZSBTZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRSb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFJvbGVTZXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldCNnZXRSb2xlKCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0X1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0R3JvdXBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldEdyb3VwMigpCi0JICogQHNlZSAjZ2V0Um9sZVNldEdyb3VwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyNnZXRSb2xlU2V0KCkKLQkgKiBAc2VlICNnZXRSb2xlU2V0R3JvdXBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uIDxlbT5TZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdWIgU2VjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U3ViU2VjdGlvbigpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNlY3Rpb24gTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0U2VjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb24jZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAc2VlICNnZXRTZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsIDxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayA8ZW0+VGFzazwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzawotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VGFzaygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQcmVjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UG9zdGNvbmRpdGlvbiA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfUG9zdGNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0UGVyZm9ybWVkQnkgPGVtPlBlcmZvcm1lZCBCeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UGVyZm9ybWVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRNYW5kYXRvcnlJbnB1dCgpCi0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3V0cHV0IDxlbT5PdXRwdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0T3V0cHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX091dHB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldE9wdGlvbmFsSW5wdXQoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGUoKQotCSAqIEBzZWUgI2dldFRhc2soKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzayNnZXRUb29sTWVudG9yKCkKLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrX1Rvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcyA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx0ZXJuYXRpdmVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uI2dldEFsdGVybmF0aXZlcygpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbiNnZXRQdXJwb3NlKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciA8ZW0+VGFzayBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUYXNrRGVzY3JpcHRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRUYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFzazwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFRhc2soKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9UYXNrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5IDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldFBlcmZvcm1lZFByaW1hcmlseUJ5KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0R3JvdXAzKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSA8ZW0+QXNzaXN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkFzc2lzdGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0QXNzaXN0ZWRCeSgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0IDxlbT5FeHRlcm5hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRFeHRlcm5hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPcHRpb25hbElucHV0KCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2dldE91dHB1dCA8ZW0+T3V0cHV0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5PdXRwdXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRPdXRwdXQoKQotCSAqIEBzZWUgI2dldFRhc2tEZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvciNnZXRTdGVwIDxlbT5TdGVwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdGVwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjZ2V0U3RlcCgpCi0JICogQHNlZSAjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1N0ZXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAc2VlICNnZXRUYXNrRGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSA8ZW0+VGVhbSBQcm9maWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlYW0gUHJvZmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZWFtUHJvZmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUjZ2V0Um9sZSgpCi0JICogQHNlZSAjZ2V0VGVhbVByb2ZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1JvbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0gPGVtPlN1cGVyIFRlYW08L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlN1cGVyIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdXBlclRlYW0oKQotCSAqIEBzZWUgI2dldFRlYW1Qcm9maWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtIDxlbT5TdWIgVGVhbTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+U3ViIFRlYW08L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZSNnZXRTdWJUZWFtKCkKLQkgKiBAc2VlICNnZXRUZWFtUHJvZmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbiA8ZW0+VGVybSBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRUZXJtRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ub29sPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkdyb3VwMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUb29sX0dyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2wjZ2V0VG9vbE1lbnRvciA8ZW0+VG9vbCBNZW50b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCNnZXRUb29sTWVudG9yKCkKLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRUb29sX1Rvb2xNZW50b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0VG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQgPGVtPldvcmsgQnJlYWtkb3duIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDIoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRQcmVkZWNlc3NvciA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByZWRlY2Vzc29yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uIDxlbT5Xb3JrIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+V29yayBEZWZpbml0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAc2VlICNnZXRXb3JrRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQHNlZSAjZ2V0V29ya0RlZmluaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciA8ZW0+V29yayBPcmRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIE9yZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrT3JkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldFZhbHVlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9WYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQgPGVtPklkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0SWQoKQotCSAqIEBzZWUgI2dldFdvcmtPcmRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya09yZGVyX0lkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGluayBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlKCkKLQkgKiBAc2VlICNnZXRXb3JrT3JkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+R3JvdXAyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldEVzdGltYXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0UmVwb3J0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0VGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRlbXBsYXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUb29sTWVudG9yKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRQdXJwb3NlIDxlbT5QdXJwb3NlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVycG9zZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UHVycG9zZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IgPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRSZXNwb25zaWJsZVJvbGUgPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSgpCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dFRvIDxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RXh0ZXJuYWwgSW5wdXQgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dFRvKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0ZWRCeSA8ZW0+SW1wYWN0ZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+SW1wYWN0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRJbXBhY3RzKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0VG8gPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+TWFuZGF0b3J5IElucHV0IFRvPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0VG8oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dFRvIDxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3B0aW9uYWxJbnB1dFRvKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0T3V0cHV0RnJvbSA8ZW0+T3V0cHV0IEZyb208L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPk91dHB1dCBGcm9tPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE91dHB1dEZyb20oKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RGVsaXZlcmFibGVQYXJ0cyA8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RW50cnlTdGF0ZSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKQotCSAqIEBzZWUgI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFeGl0U3RhdGUgPGVtPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlIDxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0V29ya1Byb2R1Y3RUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5Hcm91cDI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0R3JvdXAyKCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldFdvcmtQcm9kdWN0KCkKLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0VHlwZV9Xb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlIDxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Xb3JrIE9yZGVyIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVFbnVtIGdldFdvcmtPcmRlclR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGUgT2JqZWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhcmlhYmlsaXR5VHlwZTpPYmplY3QnIGJhc2VUeXBlPSdWYXJpYWJpbGl0eVR5cGUnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRGF0YVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSA8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZGF0YSB0eXBlICc8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAbW9kZWwgaW5zdGFuY2VDbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya09yZGVyVHlwZTpPYmplY3QnIGJhc2VUeXBlPSdXb3JrT3JkZXJUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRURhdGFUeXBlIGdldFdvcmtPcmRlclR5cGVPYmplY3QoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50ZXJmYWNlIExpdGVyYWxzICB7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwgPGVtPkFjdGl2aXR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFjdGl2aXR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFDVElWSVRZID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fUFJFQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19QT1NUQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX0dST1VQMyA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Hcm91cDMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBQ1RJVklUWV9fQlJFQUtET1dOX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9hZG1hcDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX1JPQURNQVAgPSBlSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfUm9hZG1hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRW5hY3RhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9Jc0VuYWN0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwgPGVtPkFjdGl2aXR5IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBQ1RJVklUWV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRBY3Rpdml0eURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3cgVG8gU3RhZmY8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFID0gZUlOU1RBTkNFLmdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwgPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPID0gZUlOU1RBTkNFLmdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBQcmltYXJ5IEV4dGVuc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiA9IGVJTlNUQU5DRS5nZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsIDxlbT5BcnRpZmFjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRBcnRpZmFjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBBUlRJRkFDVCA9IGVJTlNUQU5DRS5nZXRBcnRpZmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBBUlRJRkFDVF9fR1JPVVAzID0gZUlOU1RBTkNFLmdldEFydGlmYWN0X0dyb3VwMygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udGFpbmVkIEFydGlmYWN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBBUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUID0gZUlOU1RBTkNFLmdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEFydGlmYWN0RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQVJUSUZBQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QnJpZWYgT3V0bGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FID0gZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlMgPSBlSU5TVEFOQ0UuZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbk9wdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcHJlc2VudGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OID0gZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OID0gZUlOU1RBTkNFLmdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0QnJlYWtkb3duRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBCUkVBS0RPV05fRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVzZW50ZWQgQWZ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRlZCBCZWZvcmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEJlZm9yZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGxhbm5pbmcgRGF0YTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUGxhbm5pbmdEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBlciBBY3Rpdml0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19TVVBFUl9BQ1RJVklUWSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X1N1cGVyQWN0aXZpdHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db25jZXB0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4YW1wbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfRXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfR3VpZGVsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXVzYWJsZSBBc3NldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzIE11bHRpcGxlIE9jY3VycmVuY2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUyA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQlJFQUtET1dOX0VMRU1FTlRfX0lTX09QVElPTkFMID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNPcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUGxhbm5lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBCUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYID0gZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfUHJlZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2FnZSBHdWlkYW5jZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXRCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25fVXNhZ2VHdWlkYW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DYXBhYmlsaXR5UGF0dGVybkltcGwgPGVtPkNhcGFiaWxpdHkgUGF0dGVybjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2FwYWJpbGl0eVBhdHRlcm5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDYXBhYmlsaXR5UGF0dGVybigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBDQVBBQklMSVRZX1BBVFRFUk4gPSBlSU5TVEFOQ0UuZ2V0Q2FwYWJpbGl0eVBhdHRlcm4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ2hlY2tsaXN0SW1wbCA8ZW0+Q2hlY2tsaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DaGVja2xpc3RJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDaGVja2xpc3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ0hFQ0tMSVNUID0gZUlOU1RBTkNFLmdldENoZWNrbGlzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCA8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbXBvc2l0ZVJvbGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb21wb3NpdGVSb2xlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTVBPU0lURV9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09NUE9TSVRFX1JPTEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb21wb3NpdGVSb2xlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWdncmVnYXRlZCBSb2xlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBDT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFID0gZUlOU1RBTkNFLmdldENvbXBvc2l0ZVJvbGVfQWdncmVnYXRlZFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uY2VwdEltcGwgPGVtPkNvbmNlcHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbmNlcHRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb25jZXB0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTkNFUFQgPSBlSU5TVEFOQ0UuZ2V0Q29uY2VwdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db25zdHJhaW50SW1wbCA8ZW0+Q29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29uc3RyYWludEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnN0cmFpbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OU1RSQUlOVCA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYWluIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsIDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50Q2F0ZWdvcnlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50Q2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFID0gZUlOU1RBTkNFLmdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudENhdGVnb3J5UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsIDxlbT5Db250ZW50IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRDb250ZW50RGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1haW4gRGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPktleSBDb25zaWRlcmF0aW9uczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIENPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX0V4dGVybmFsSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsIDxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q29udGVudEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ09OVEVOVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fR1JPVVAxID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X0dyb3VwMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2hlY2tsaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9Db25jZXB0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGFtcGxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0VYQU1QTEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX0dVSURFTElORSA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNhYmxlIEFzc2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1JldXNhYmxlQXNzZXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX0VMRU1FTlRfX1ZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50UGFja2FnZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldENvbnRlbnRQYWNrYWdlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIENPTlRFTlRfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDT05URU5UX1BBQ0tBR0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRDb250ZW50UGFja2FnZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsIDxlbT5DdXN0b20gQ2F0ZWdvcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkN1c3RvbUNhdGVnb3J5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Q3VzdG9tQ2F0ZWdvcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgQ1VTVE9NX0NBVEVHT1JZID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIENVU1RPTV9DQVRFR09SWV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwgPGVtPkRlbGl2ZXJhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJBQkxFX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcmFibGVfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxpdmVyZWQgV29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZV9EZWxpdmVyZWRXb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCA8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIERlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnaW5nIEd1aWRhbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwgPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2VzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERUxJVkVSWV9QUk9DRVNTID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzX0dyb3VwNCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29tbXVuaWNhdGlvbnMgTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FZHVjYXRpb24gTWF0ZXJpYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NfRWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEUgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fU2NhbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmlzayBMZXZlbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1JJU0tfTEVWRUwgPSBlSU5TVEFOQ0UuZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW5nIFRlY2huaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFID0gZUlOU1RBTkNFLmdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX0VzdGltYXRpbmdUZWNobmlxdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRSA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlIE9mIENvbnRyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVCA9IGVJTlNUQU5DRS5nZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsIDxlbT5EZXNjcmliYWJsZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmliYWJsZUVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgREVTQ1JJQkFCTEVfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZXNlbnRhdGlvbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiA9IGVJTlNUQU5DRS5nZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GdWxmaWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBERVNDUklCQUJMRV9FTEVNRU5UX19GVUxGSUxMID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JcyBBYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob2RlaWNvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9Ob2RlaWNvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcGVpY29uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJQkFCTEVfRUxFTUVOVF9fU0hBUEVJQ09OID0gZUlOU1RBTkNFLmdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpcHRvckltcGwgPGVtPkRlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERFU0NSSVBUT1IgPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBERVNDUklQVE9SX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVmaW5lZCBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lSW1wbCA8ZW0+RGlzY2lwbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERpc2NpcGxpbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFzazwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fVEFTSyA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1Rhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBEaXNjaXBsaW5lPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZSBXb3JrZmxvdzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCA8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIERJU0NJUExJTkVfR1JPVVBJTkcgPSBlSU5TVEFOQ0UuZ2V0RGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FID0gZUlOU1RBTkNFLmdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwgPGVtPkRvY3VtZW50IFJvb3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldERvY3VtZW50Um9vdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBET0NVTUVOVF9ST09UID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWl4ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPQ1VNRU5UX1JPT1RfX01JWEVEID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NaXhlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+WE1MTlMgUHJlZml4IE1hcDwvYj48L2VtPicgbWFwIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVAgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YU0kgU2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBtYXAgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTiA9IGVJTlNUQU5DRS5nZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04gPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlkgPSBlSU5TVEFOQ0UuZ2V0RG9jdW1lbnRSb290X01ldGhvZExpYnJhcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBQbHVnaW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCA8ZW0+RG9tYWluPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb21haW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXREb21haW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRE9NQUlOID0gZUlOU1RBTkNFLmdldERvbWFpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBET01BSU5fX0dST1VQMiA9IGVJTlNUQU5DRS5nZXREb21haW5fR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIERPTUFJTl9fV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldERvbWFpbl9Xb3JrUHJvZHVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViZG9tYWluPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBET01BSU5fX1NVQkRPTUFJTiA9IGVJTlNUQU5DRS5nZXREb21haW5fU3ViZG9tYWluKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVsZW1lbnRJbXBsIDxlbT5FbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFTEVNRU5UID0gZUlOU1RBTkNFLmdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsIDxlbT5Fc3RpbWF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRFc3RpbWF0ZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFURSA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldEVzdGltYXRlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGlvbiBNZXRyaWM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBFU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGluZ01ldHJpY0ltcGwgPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0aW5nTWV0cmljSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0RXN0aW1hdGluZ01ldHJpYygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU5HX01FVFJJQyA9IGVJTlNUQU5DRS5nZXRFc3RpbWF0aW5nTWV0cmljKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBFU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TID0gZUlOU1RBTkNFLmdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5FeGFtcGxlSW1wbCA8ZW0+RXhhbXBsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXhhbXBsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEV4YW1wbGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgRVhBTVBMRSA9IGVJTlNUQU5DRS5nZXRFeGFtcGxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbCA8ZW0+R3VpZGFuY2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgR1VJREFOQ0UgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwgPGVtPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5HdWlkYW5jZURlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBHVUlEQU5DRV9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRHdWlkYW5jZURlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRhY2htZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQgPSBlSU5TVEFOQ0UuZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRlbGluZUltcGwgPGVtPkd1aWRlbGluZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuR3VpZGVsaW5lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0R3VpZGVsaW5lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIEdVSURFTElORSA9IGVJTlNUQU5DRS5nZXRHdWlkZWxpbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuSXRlcmF0aW9uSW1wbCA8ZW0+SXRlcmF0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5JdGVyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRJdGVyYXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgSVRFUkFUSU9OID0gZUlOU1RBTkNFLmdldEl0ZXJhdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbCA8ZW0+S2luZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuS2luZEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldEtpbmQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgS0lORCA9IGVJTlNUQU5DRS5nZXRLaW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8gPSBlSU5TVEFOQ0UuZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCA8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIE1FVEhPRF9DT05GSUdVUkFUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2UgQ29uZmlndXJhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0Jhc2VDb25maWd1cmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QTFVHSU5fU0VMRUNUSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fTWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUEFDS0FHRV9TRUxFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZpZXc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXID0gZUlOU1RBTkNFLmdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3MgVmlldzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWJ0cmFjdGVkIENhdGVnb3J5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkZWQgQ2F0ZWdvcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0dST1VQID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfR3JvdXAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk93bmVkIFJ1bGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CcmllZiBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX0lEID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9yZGVyaW5nIEd1aWRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFID0gZUlOU1RBTkNFLmdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlc2VudGF0aW9uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBwcmVzc2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9FTEVNRU5UX1BST1BFUlRZX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kTGlicmFyeUltcGwgPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kTGlicmFyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfTElCUkFSWSA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGx1Z2luPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIENvbmZpZ3VyYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIE1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2w8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfTElCUkFSWV9fVE9PTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RMaWJyYXJ5X1Rvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kUGFja2FnZUltcGwgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kUGFja2FnZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QQUNLQUdFX19HUk9VUDEgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldXNlZCBQYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFID0gZUlOU1RBTkNFLmdldE1ldGhvZFBhY2thZ2VfTWV0aG9kUGFja2FnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2xvYmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCA9IGVJTlNUQU5DRS5nZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRNZXRob2RQbHVnaW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTUVUSE9EX1BMVUdJTiA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOID0gZUlOU1RBTkNFLmdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0UgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVzZXIgQ2hhbmdlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSA9IGVJTlNUQU5DRS5nZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwgPGVtPk1ldGhvZCBVbml0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0TWV0aG9kVW5pdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNRVRIT0RfVU5JVCA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBNRVRIT0RfVU5JVF9fQ09QWVJJR0hUID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgTUVUSE9EX1VOSVRfX0FVVEhPUlMgPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREFURSA9IGVJTlNUQU5DRS5nZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0TWV0aG9kVW5pdF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1FVEhPRF9VTklUX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldE1ldGhvZFVuaXRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NaWxlc3RvbmVJbXBsIDxlbT5NaWxlc3RvbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1pbGVzdG9uZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldE1pbGVzdG9uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBNSUxFU1RPTkUgPSBlSU5TVEFOQ0UuZ2V0TWlsZXN0b25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZCBSZXN1bHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIE1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUID0gZUlOU1RBTkNFLmdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsIDxlbT5OYW1lZCBFbGVtZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5OYW1lZEVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXROYW1lZEVsZW1lbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgTkFNRURfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXROYW1lZEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBOQU1FRF9FTEVNRU5UX19OQU1FID0gZUlOU1RBTkNFLmdldE5hbWVkRWxlbWVudF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk91dGNvbWVJbXBsIDxlbT5PdXRjb21lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5PdXRjb21lSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0T3V0Y29tZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBPVVRDT01FID0gZUlOU1RBTkNFLmdldE91dGNvbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbCA8ZW0+UGFja2FnZWFibGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGFja2FnZWFibGVFbGVtZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGFja2FnZWFibGVFbGVtZW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBBQ0tBR0VBQkxFX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0UGFja2FnZWFibGVFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbCA8ZW0+UGhhc2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlBoYXNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGhhc2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUEhBU0UgPSBlSU5TVEFOQ0UuZ2V0UGhhc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UGxhbm5pbmdEYXRhKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBMQU5OSU5HX0RBVEEgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaW5pc2ggRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFID0gZUlOU1RBTkNFLmdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SYW5rPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUExBTk5JTkdfREFUQV9fUkFOSyA9IGVJTlNUQU5DRS5nZXRQbGFubmluZ0RhdGFfUmFuaygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhcnQgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUgPSBlSU5TVEFOQ0UuZ2V0UGxhbm5pbmdEYXRhX1N0YXJ0RGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwgPGVtPlByYWN0aWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY3Rpdml0eSBSZWZlcmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQgUmVmZXJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VfQ29udGVudFJlZmVyZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3ViIFByYWN0aWNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUkFDVElDRV9fU1VCX1BSQUNUSUNFID0gZUlOU1RBTkNFLmdldFByYWN0aWNlX1N1YlByYWN0aWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByYWN0aWNlRGVzY3JpcHRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJBQ1RJQ0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBJbmZvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BcHBsaWNhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTiA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYWNrZ3JvdW5kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQgPSBlSU5TVEFOQ0UuZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9CYWNrZ3JvdW5kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hb2FsczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUyA9IGVJTlNUQU5DRS5nZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MZXZlbHMgT2YgQWRvcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fTGV2ZWxzT2ZBZG9wdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvYmxlbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNID0gZUlOU1RBTkNFLmdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCA8ZW0+UHJvY2VzczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFByb2Nlc3MoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmNsdWRlcyBQYXR0ZXJuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOID0gZUlOU1RBTkNFLmdldFByb2Nlc3NfSW5jbHVkZXNQYXR0ZXJuKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IENvbnRleHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWQgQ29udGV4dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19fVkFMSURfQ09OVEVYVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlhZ3JhbSBVUkk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX19ESUFHUkFNX1VSSSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzX0RpYWdyYW1VUkkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwgPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5cmlnaHQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdXRob3JzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgRGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBEZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudF9DaGFuZ2VEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCA8ZW0+UHJvY2VzcyBDb21wb25lbnQgSW50ZXJmYWNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0UgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJmYWNlIFNwZWNpZmljYXRpb248L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9JbnRlcmZhY2VTcGVjaWZpY2F0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2UgSU88L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFUmVmZXJlbmNlIFBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPID0gZUlOU1RBTkNFLmdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFBST0NFU1NfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY29wZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXNhZ2UgTm90ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzRWxlbWVudEltcGwgPGVtPlByb2Nlc3MgRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0VsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBQUk9DRVNTX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc0VsZW1lbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsIDxlbT5Qcm9jZXNzIFBhY2thZ2U8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BhY2thZ2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QQUNLQUdFID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfUEFDS0FHRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBQUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGFja2FnZV9Qcm9jZXNzRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUFJPQ0VTU19QTEFOTklOR19URU1QTEFURSA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQgPSBlSU5TVEFOQ0UuZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXNlIFByb2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyA9IGVJTlNUQU5DRS5nZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5SZXBvcnRJbXBsIDxlbT5SZXBvcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJlcG9ydEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJlcG9ydCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBSRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0UmVwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJldXNhYmxlQXNzZXRJbXBsIDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUmV1c2FibGVBc3NldEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJldXNhYmxlQXNzZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUkVVU0FCTEVfQVNTRVQgPSBlSU5TVEFOQ0UuZ2V0UmV1c2FibGVBc3NldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2FkbWFwSW1wbCA8ZW0+Um9hZG1hcDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9hZG1hcEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvYWRtYXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9BRE1BUCA9IGVJTlNUQU5DRS5nZXRSb2FkbWFwKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVJbXBsIDxlbT5Sb2xlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0Um9sZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFID0gZUlOU1RBTkNFLmdldFJvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFJvbGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUiA9IGVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwgPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXNzaWdubWVudCBBcHByb2FjaGVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2tpbGxzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fU0tJTExTID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdGlvbl9Ta2lsbHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN5bm9ueW1zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9ERVNDUklQVElPTl9fU1lOT05ZTVMgPSBlSU5TVEFOQ0UuZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVEZXNjcmlwdG9ySW1wbCA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVEZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFJPTEVfREVTQ1JJUFRPUiA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRPUl9fUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBGb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SID0gZUlOU1RBTkNFLmdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRJbXBsIDxlbT5Sb2xlIFNldDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgUk9MRV9TRVQgPSBlSU5TVEFOQ0UuZ2V0Um9sZVNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFJvbGVTZXRfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBST0xFX1NFVF9fUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlJvbGVTZXRHcm91cGluZ0ltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFJvbGVTZXRHcm91cGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBST0xFX1NFVF9HUk9VUElORyA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUID0gZUlOU1RBTkNFLmdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsIDxlbT5TZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U2VjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBTRUNUSU9OID0gZUlOU1RBTkNFLmdldFNlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN1YiBTZWN0aW9uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVSZWZlcmVuY2UgU0VDVElPTl9fU1VCX1NFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9TdWJTZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVkZWNlc3NvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1BSRURFQ0VTU09SID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VjdGlvbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgU0VDVElPTl9fU0VDVElPTl9OQU1FID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFNlY3Rpb25fVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFiaWxpdHkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU3VwcG9ydGluZ01hdGVyaWFsSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFNVUFBPUlRJTkdfTUFURVJJQUwgPSBlSU5TVEFOQ0UuZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsIDxlbT5UYXNrPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFzaygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUQVNLID0gZUlOU1RBTkNFLmdldFRhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1BSRUNPTkRJVElPTiA9IGVJTlNUQU5DRS5nZXRUYXNrX1ByZWNvbmRpdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdGNvbmRpdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1BPU1RDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFza19Qb3N0Y29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX1BFUkZPUk1FRF9CWSA9IGVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRUYXNrX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3V0cHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19PVVRQVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza19PdXRwdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWxseSBQZXJmb3JtZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza19BZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWwgSW5wdXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tfT3B0aW9uYWxJbnB1dCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0VTVElNQVRFID0gZUlOU1RBTkNFLmdldFRhc2tfRXN0aW1hdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlMgPSBlSU5TVEFOQ0UuZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX19UT09MX01FTlRPUiA9IGVJTlNUQU5DRS5nZXRUYXNrX1Rvb2xNZW50b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCA8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRBU0tfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbHRlcm5hdGl2ZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHVycG9zZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGFza0Rlc2NyaXB0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEFTS19ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXNrPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19UQVNLID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBlcmZvcm1lZCBQcmltYXJpbHkgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19HUk9VUDMgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfR3JvdXAzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc2lzdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4dGVybmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hbmRhdG9yeSBJbnB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBUQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUID0gZUlOU1RBTkNFLmdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19PVVRQVVQgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdGVwPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBUQVNLX0RFU0NSSVBUT1JfX1NURVAgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEFTS19ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0VGFza0Rlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlYW1Qcm9maWxlSW1wbCA8ZW0+VGVhbSBQcm9maWxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRlYW1Qcm9maWxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFRFQU1fUFJPRklMRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFRFQU1fUFJPRklMRV9fUk9MRSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9Sb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdXBlciBUZWFtPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBURUFNX1BST0ZJTEVfX1NVUEVSX1RFQU0gPSBlSU5TVEFOQ0UuZ2V0VGVhbVByb2ZpbGVfU3VwZXJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdWIgVGVhbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVEVBTV9QUk9GSUxFX19TVUJfVEVBTSA9IGVJTlNUQU5DRS5nZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlbXBsYXRlSW1wbCA8ZW0+VGVtcGxhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlbXBsYXRlSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVtcGxhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVNUExBVEUgPSBlSU5TVEFOQ0UuZ2V0VGVtcGxhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVybURlZmluaXRpb25JbXBsIDxlbT5UZXJtIERlZmluaXRpb248L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRlcm1EZWZpbml0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VGVybURlZmluaXRpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVEVSTV9ERUZJTklUSU9OID0gZUlOU1RBTkNFLmdldFRlcm1EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsIDxlbT5Ub29sPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Ub29sSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VG9vbCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBUT09MID0gZUlOU1RBTkNFLmdldFRvb2woKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVE9PTF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFRvb2xfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgVE9PTF9fVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0VG9vbF9Ub29sTWVudG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xNZW50b3JJbXBsIDxlbT5Ub29sIE1lbnRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVG9vbE1lbnRvckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFRvb2xNZW50b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0VG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5XaGl0ZXBhcGVySW1wbCA8ZW0+V2hpdGVwYXBlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV2hpdGVwYXBlckltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdoaXRlcGFwZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV0hJVEVQQVBFUiA9IGVJTlNUQU5DRS5nZXRXaGl0ZXBhcGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCA8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5VbWFQYWNrYWdlSW1wbCNnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Hcm91cDIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRVJlZmVyZW5jZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUiA9IGVJTlNUQU5DRS5nZXRXb3JrQnJlYWtkb3duRWxlbWVudF9QcmVkZWNlc3NvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HID0gZUlOU1RBTkNFLmdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SXMgUmVwZWF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrRGVmaW5pdGlvbkltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtEZWZpbml0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRXb3JrRGVmaW5pdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0Y29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OID0gZUlOU1RBTkNFLmdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCA8ZW0+V29yayBPcmRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfT1JERVIgPSBlSU5TVEFOQ0UuZ2V0V29ya09yZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFdvcmtPcmRlcl9WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX09SREVSX19JRCA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfT1JERVJfX0xJTktfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJfTGlua1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsIDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQ2xhc3MgV09SS19QUk9EVUNUID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fR1JPVVAyID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0X0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fRVNUSU1BVEUgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19SRVBPUlQgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX19URU1QTEFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdF9UZW1wbGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9vbCBNZW50b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1BVUlBPU0UgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFzb25zIEZvciBOb3QgTmVlZGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkcgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUNsYXNzIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3BvbnNpYmxlIFJvbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfUmVzcG9uc2libGVSb2xlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Hcm91cDI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDIgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUyA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbCBJbnB1dCBUbzwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk91dHB1dCBGcm9tPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST00gPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGl2ZXJhYmxlIFBhcnRzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFID0gZUlOU1RBTkNFLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUF0dHJpYnV0ZSBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RUeXBlSW1wbCA8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtQcm9kdWN0VHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVDbGFzcyBXT1JLX1BST0RVQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVBdHRyaWJ1dGUgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMiA9IGVJTlNUQU5DRS5nZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFQXR0cmlidXRlIFdPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1QgPSBlSU5TVEFOQ0UuZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRUVudW0gVkFSSUFCSUxJVFlfVFlQRSA9IGVJTlNUQU5DRS5nZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUgPGVtPldvcmsgT3JkZXIgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0V29ya09yZGVyVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCUVFbnVtIFdPUktfT1JERVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5WYXJpYWJpbGl0eSBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVW1hUGFja2FnZUltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJRURhdGFUeXBlIFZBUklBQklMSVRZX1RZUEVfT0JKRUNUID0gZUlOU1RBTkNFLmdldFZhcmlhYmlsaXR5VHlwZU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+V29yayBPcmRlciBUeXBlIE9iamVjdDwvZW0+JyBkYXRhIHR5cGUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlVtYVBhY2thZ2VJbXBsI2dldFdvcmtPcmRlclR5cGVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlFRGF0YVR5cGUgV09SS19PUkRFUl9UWVBFX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRXb3JrT3JkZXJUeXBlT2JqZWN0KCk7Ci0KLQl9Ci0KLX0gLy9VbWFQYWNrYWdlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvVmFyaWFiaWxpdHlUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDdlYjEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1ZhcmlhYmlsaXR5VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVmFyaWFiaWxpdHlUeXBlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEFuIEVudW1lcmF0aW9uIHVzZWQgZm9yIHZhbHVlcyBmb3IgaW5zdGFuY2VzIG9mIFZhcmlhYmlsaXR5IEVsZW1lbnQncyBhdHRyaWJ1dGUgdmFyaWFiaWxpdHlUeXBlLiAgSXQgZGVmaW5lcyB0aGUgbmF0dXJlIG9mIGhvdyBhIFZhcmlhYmlsaXR5IEVsZW1lbnQgZXh0ZW5kcyBhbm90aGVyIFZhcmlhYmlsaXR5IEVsZW1lbnQuIFNlZSBlbnVtZXJhdGlvbiBsaXRlcmFscyBmb3IgZGVmaW5pdGlvbnMgZm9yIGVhY2ggdHlwZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRWYXJpYWJpbGl0eVR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1ZhcmlhYmlsaXR5VHlwZSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFZhcmlhYmlsaXR5VHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOQV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5BKDAsICJuYSIsICJuYSIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ09OVFJJQlVURVMoMSwgImNvbnRyaWJ1dGVzIiwgImNvbnRyaWJ1dGVzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhURU5EUygyLCAiZXh0ZW5kcyIsICJleHRlbmRzIiksCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVQTEFDRVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlSRVBMQUNFUygzLCAicmVwbGFjZXMiLCAicmVwbGFjZXMiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5Mb2NhbCBDb250cmlidXRpb248L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfQ09OVFJJQlVUSU9OKDQsICJsb2NhbENvbnRyaWJ1dGlvbiIsICJsb2NhbENvbnRyaWJ1dGlvbiIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTE9DQUxfUkVQTEFDRU1FTlQoNSwgImxvY2FsUmVwbGFjZW1lbnQiLCAibG9jYWxSZXBsYWNlbWVudCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHMgUmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EU19SRVBMQUNFU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVYVEVORFNfUkVQTEFDRVMoNiwgImV4dGVuZHNSZXBsYWNlcyIsICJleHRlbmRzUmVwbGFjZXMiKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OYTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TmE8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTkEKLQkgKiBAbW9kZWwgbmFtZT0ibmEiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q29udHJpYnV0ZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNvbnRyaWJ1dGVzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NPTlRSSUJVVEVTCi0JICogQG1vZGVsIG5hbWU9ImNvbnRyaWJ1dGVzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRSSUJVVEVTX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkV4dGVuZHM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhURU5EUwotCSAqIEBtb2RlbCBuYW1lPSJleHRlbmRzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYVEVORFNfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UmVwbGFjZXM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJlcGxhY2VzPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9InJlcGxhY2VzIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VTX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkxvY2FsIENvbnRyaWJ1dGlvbjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TG9jYWwgQ29udHJpYnV0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX0NPTlRSSUJVVElPTgotCSAqIEBtb2RlbCBuYW1lPSJsb2NhbENvbnRyaWJ1dGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTF9DT05UUklCVVRJT05fVkFMVUUgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TG9jYWwgUmVwbGFjZW1lbnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxvY2FsIFJlcGxhY2VtZW50PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xPQ0FMX1JFUExBQ0VNRU5UCi0JICogQG1vZGVsIG5hbWU9ImxvY2FsUmVwbGFjZW1lbnQiCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DQUxfUkVQTEFDRU1FTlRfVkFMVUUgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RXh0ZW5kcyBSZXBsYWNlczwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWFRFTkRTX1JFUExBQ0VTCi0JICogQG1vZGVsIG5hbWU9ImV4dGVuZHNSZXBsYWNlcyIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFID0gNjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVmFyaWFiaWxpdHlUeXBlW10gewotCQkJTkEsCi0JCQlDT05UUklCVVRFUywKLQkJCUVYVEVORFMsCi0JCQlSRVBMQUNFUywKLQkJCUxPQ0FMX0NPTlRSSUJVVElPTiwKLQkJCUxPQ0FMX1JFUExBQ0VNRU5ULAotCQkJRVhURU5EU19SRVBMQUNFUywKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VmFyaWFiaWxpdHlUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlZhcmlhYmlsaXR5IFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlWYXJpYWJpbGl0eVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5WYXJpYWJpbGl0eSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFyaWFiaWxpdHlUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOQV9WQUxVRTogcmV0dXJuIE5BOwotCQkJY2FzZSBDT05UUklCVVRFU19WQUxVRTogcmV0dXJuIENPTlRSSUJVVEVTOwotCQkJY2FzZSBFWFRFTkRTX1ZBTFVFOiByZXR1cm4gRVhURU5EUzsKLQkJCWNhc2UgUkVQTEFDRVNfVkFMVUU6IHJldHVybiBSRVBMQUNFUzsKLQkJCWNhc2UgTE9DQUxfQ09OVFJJQlVUSU9OX1ZBTFVFOiByZXR1cm4gTE9DQUxfQ09OVFJJQlVUSU9OOwotCQkJY2FzZSBMT0NBTF9SRVBMQUNFTUVOVF9WQUxVRTogcmV0dXJuIExPQ0FMX1JFUExBQ0VNRU5UOwotCQkJY2FzZSBFWFRFTkRTX1JFUExBQ0VTX1ZBTFVFOiByZXR1cm4gRVhURU5EU19SRVBMQUNFUzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVmFyaWFiaWxpdHlUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1doaXRlcGFwZXIuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9XaGl0ZXBhcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2VhNzQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1doaXRlcGFwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV2hpdGVwYXBlci5qYXZhLHYgMS4xIDIwMDgvMDEvMTUgMDg6NTI6MDcganRoYW0gRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5XaGl0ZXBhcGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIENvbmNlcHQgZ3VpZGFuY2UgdGhhdCBoYXZlIGJlZW4gZXh0ZXJuYWxseSByZXZpZXdlZCBvciBwdWJsaXNoZWQgYW5kIGNhbiBiZSByZWFkIGFuZCB1bmRlcnN0b29kIGluIGlzb2xhdGlvbiBvZiBvdGhlciBjb250ZW50IGVsZW1lbnRzIGFuZCBndWlkYW5jZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdoaXRlcGFwZXIoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1doaXRlcGFwZXInIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXaGl0ZXBhcGVyIGV4dGVuZHMgQ29uY2VwdCB7Ci19IC8vIFdoaXRlcGFwZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjhmODhhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrQnJlYWtkb3duRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0JyZWFrZG93bkVsZW1lbnQuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQSBzcGVjaWFsIEJyZWFrZG93biBFbGVtZW50IHRoYXQgcHJvdmlkZXMgc3BlY2lmaWMgcHJvcGVydGllcyBmb3IgQnJlYWtkb3duIEVsZW1lbnRzIHRoYXQgcmVwcmVzZW50IG9yIHJlZmVyIHRvIFdvcmsgRGVmaW5pdGlvbnMuICBGb3IgZXhhbXBsZSBpdHMgc3ViY2xhc3MgQWN0aXZpdHkgZGVmaW5lcyB3b3JrIGFzIGl0IGlzIGFsc28gYSBzdWJjbGFzcyBvZiBXb3JrIERlZmluaXRpb24uICBJdHMgc3ViY2xhc3MgVGFzayBEZXNjcmlwdG9yIGRvZXMgbm90IGRlZmluZSB3b3JrIGJ5IGl0c2VsZiwgYnV0IHJlZmVycyB0byBhIFdvcmsgRGVmaW5pdGlvbiBhbmQgdGhlcmVmb3JlIGNhbiBoYXZlIHRoZSBzYW1lIGNvbW1vbiBwcm9wZXJ0aWVzIGFuZCBXb3JrIEJyZWFrZG93biBFbGVtZW50IGhhcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrQnJlYWtkb3duRWxlbWVudCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtCcmVha2Rvd25FbGVtZW50IGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZlYXR1cmVNYXBFbnRyeSIgbWFueT0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZ3JvdXAnIG5hbWU9J2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRmVhdHVyZU1hcCBnZXRHcm91cDIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWRlY2Vzc29yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZWRlY2Vzc29yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlZGVjZXNzb3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtCcmVha2Rvd25FbGVtZW50X1ByZWRlY2Vzc29yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1ByZWRlY2Vzc29yJyBncm91cD0nI2dyb3VwOjMwJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8V29ya09yZGVyPiBnZXRQcmVkZWNlc3NvcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SXMgRXZlbnQgRHJpdmVuPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGUgaXNFdmVudERyaXZlbiBhdHRyaWJ1dGUgaW5kaWNhdGVzIHRoYXQgdGhlIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGRlc2NyaWJlcyBhbiBpbnN0YW5jZSBvZiB3b3JrIHdoaWNoIGlzIG5vdCBzdGFydGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gc2NoZWR1bGVkIHRvIHN0YXJ0IGF0IGEgY2VydGFpbiBwb2ludCBvZiB0aW1lLCBiZWNhdXNlIHByZWNlZGluZyB3b3JrIGlzIGJlaW5nIGNvbXBsZXRlZCwgb3IgaW5wdXQgd29yayBwcm9kdWN0cyBhcmUgYXZhaWxhYmxlLCBidXQgYmVjYXVzZSBhbm90aGVyIHNwZWNpZmljIGV2ZW50IGhhcyBvY2N1cnJlZC4gIEV4YW1wbGVzIGZvciBzdWNoIGV2ZW50cyBhcmUgZXhjZXB0aW9ucyBvciBwcm9ibGVtIHNpdHVhdGlvbnMgd2hpY2ggcmVxdWlyZSBzcGVjaWZpYyB3b3JrIHRvIGJlIHBlcmZvcm1lZCBhcyBhIHJlc3VsdC4gIEFsc28gY2hhbmdlIG1hbmFnZW1lbnQgd29yayBjYW4gYmUgbW9kZWxlZCBhcyBldmVudCBkcml2ZW4gd29yayBhbmFseXppbmcgYSBjaGFuZ2UgcmVxdWVzdCBvciBkZWZlY3QgYW5kIGFsbG9jYXRpbmcgd29yayBkeW5hbWljYWxseSB0byByZXNvdXJjZXMgdG8gZGVhbCB3aXRoIGl0IGZvbGxvd2luZyB0aGUgd29yayBkZXNjcmliZWQgd2l0aCBzdWNoIFByb2Nlc3MgV29yayBEZWZpbml0aW9uLiAgVGhlIGV2ZW50cyB0aGVtc2VsdmVzIGFyZSBub3QgbW9kZWxlZCBpbiB0aGlzIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24uICBUaGV5IHNoYWxsIGJlIGRlc2NyaWJlZCBhcyBwYXJ0IG9mIHRoZSBub3JtYWwgZGVzY3JpcHRpb25zIGZpZWxkcyBhdmFpbGFibGUuCi0JICogCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICN1bnNldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNFdmVudERyaXZlbigpCi0JICogQG1vZGVsIHVuc2V0dGFibGU9InRydWUiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdpc0V2ZW50RHJpdmVuJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBFdmVudCBEcml2ZW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjdW5zZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzRXZlbnREcml2ZW4oYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNFdmVudERyaXZlbiA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQHNlZSAjc2V0SXNFdmVudERyaXZlbihib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNFdmVudERyaXZlbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc0V2ZW50RHJpdmVuKCkKLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBzZWUgI3NldElzRXZlbnREcml2ZW4oYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzRXZlbnREcml2ZW4oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIE9uZ29pbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIElmIHRoZSBpc09uZ29pbmcgYXR0cmlidXRlIGlzIHNldCB0byBUcnVlIGZvciBhIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGluc3RhbmNlLCB0aGVuIHRoZSBlbGVtZW50IGRlc2NyaWJlcyBhbiBvbmdvaW5nIHBpZWNlIG9mIHdvcmsgd2l0aG91dCBhIGZpeGVkIGR1cmF0aW9uIG9yIGVuZCBzdGF0ZS4gIEZvciBleGFtcGxlLCB0aGUgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgb2YgYW4gYWRtaW5pc3RyYXRvciBjb250aW51b3VzbHkgKGUuZy4gM2ggYSBkYXkpIHdvcmtpbmcgdG8gZW5zdXJlIHRoYXQgc3lzdGVtcyBhcmUga2VwdCBpbiBhIGNlcnRhaW4gc3RhdGUuICBBbm90aGVyIGV4YW1wbGUgd291bGQgYmUgcHJvZ3JhbSBtYW5hZ2VtZW50IHdvcmsgb3ZlcnNlZWluZyBtYW55IGRpZmZlcmVudCBwcm9qZWN0cyBiZWluZyBzY2hlZHVsZWQgZm9yIG9uZSBwYXJ0aWN1bGFyIHByb2plY3QgYXQgc3BlY2lmaWMgcmVvY2N1cnJpbmcgaW50ZXJ2YWxzIGR1cmluZyB0aGUgd2hvbGUgbGlmZWN5Y2xlIG9mIHRoZSBwcm9qZWN0LgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBPbmdvaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzT25nb2luZygpCi0JICogQHNlZSAjdW5zZXRJc09uZ29pbmcoKQotCSAqIEBzZWUgI3NldElzT25nb2luZyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKQotCSAqIEBtb2RlbCB1bnNldHRhYmxlPSJ0cnVlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naXNPbmdvaW5nJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0lzT25nb2luZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElzT25nb2luZyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFVuc2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU2V0SXNPbmdvaW5nKCkKLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQHNlZSAjc2V0SXNPbmdvaW5nKGJvb2xlYW4pCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRJc09uZ29pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIE9uZ29pbmc8L2VtPicgYXR0cmlidXRlIGlzIHNldC4KLQkgKiBAc2VlICN1bnNldElzT25nb2luZygpCi0JICogQHNlZSAjaXNJc09uZ29pbmcoKQotCSAqIEBzZWUgI3NldElzT25nb2luZyhib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzU2V0SXNPbmdvaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBSZXBlYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGRlZmluZSByZXBldGl0aW9uIG9mIHdvcmssIGUuZy4gaXRlcmF0aW9ucy4gIEEgUHJvY2VzcyBXb3JrIERlZmluaXRpb24gd2l0aCB0aGlzIGF0dHJpYnV0ZSBzZXQgdG8gVHJ1ZSBzaGFsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBzZXQgb2YgYXJ0aWZhY3RzLiAgRm9yIGV4YW1wbGUsIGZvciBhbiBpbnN0YW5jZSBvZiBJdGVyYXRpb24gKGRlZmluZWQgYXMgYSBzcGVjaWFsIFByb2Nlc3MgV29yayBEZWZpbml0aW9uIGJlbG93KSB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gVHJ1ZSBieSBkZWZhdWx0IGluZGljYXRpbmcgdGhhdCBldmVyeSBzdWItQWN0aXZpdHkgd2lsbCBiZSByZXBlYXRlZCBtb3JlIHRoYW4gb25jZS4gIEhvd2V2ZXIsIGFueSBQcm9jZXNzIFdvcmsgRGVmaW5pdGlvbiBjYW4gc2V0IHRoaXMgYXR0cmlidXRlIHRvIFRydWUgdG8gZGVmaW5lIGl0ZXJhdGlvbnMgKGUuZy4gdG8gaXRlcmF0ZSBvbmUgQWN0aXZpdHkgY29uc2lzdGluZyBvZiBtYW55IHN1Yi1hY3Rpdml0aWVzIG9yIGV2ZW4gUGhhc2VzLCBidXQgdG8gaXRlcmF0ZSBqdXN0IG9uZSBUYXNrKS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNTZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3Vuc2V0SXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkKLQkgKiBAbW9kZWwgdW5zZXR0YWJsZT0idHJ1ZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2lzUmVwZWF0YWJsZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNJc1JlcGVhdGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJc1JlcGVhdGFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVbnNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1NldElzUmVwZWF0YWJsZSgpCi0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI3NldElzUmVwZWF0YWJsZShib29sZWFuKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHVuc2V0SXNSZXBlYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50I2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUgaXMgc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZXBlYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRJc1JlcGVhdGFibGUoKQotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAc2VlICNzZXRJc1JlcGVhdGFibGUoYm9vbGVhbikKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc1NldElzUmVwZWF0YWJsZSgpOwotCi19IC8vIFdvcmtCcmVha2Rvd25FbGVtZW50ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtEZWZpbml0aW9uLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5MmFhYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0RlZmluaXRpb24uamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBbiBhYnN0cmFjdCBNZXRob2QgRWxlbWVudCB0aGF0IGdlbmVyYWxpemVzIGFsbCBkZXNjcmlwdGlvbnMgb2Ygd29yayB3aXRoaW4gdGhlIFVuaWZpZWQgTWV0aG9kIEFyY2hpdGVjdHVyZS4gIFRoaXMgcGFja2FnZSBpbnRyb2R1Y2VzIHR3byBjb25jcmV0ZSB0eXBlcyBvZiBXb3JrIERlZmluaXRpb25zOiBUYXNrIGFuZCBTdGVwLiAgV29yayBEZWZpbml0aW9ucyBjYW4gY29udGFpbiBzZXRzIG9mIHByZS0gYW5kIHBvc3QtY29uZGl0aW9ucyBkZWZpbmluZyBjb25zdHJhaW50cyB0aGF0IG5lZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHRoZSBkZXNjcmliZWQgd29yayBjYW4gYmVnaW4gb3IgYmVmb3JlIGl0IGNhbiBiZSBkZWNsYXJlZCBhcyBmaW5pc2hlZC4gIE5vdGUgdGhhdCBnZW5lcmFsIG93bmVkUnVsZXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFkZGl0aW9uYWwgY29uc3RyYWludHMgYW5kIHJ1bGVzIGZvciBXb3JrIERlZmluaXRpb25zLgotICogV29yayBEZWZpbml0aW9ucyByZXByZXNlbnQgYmVoYXZpb3JhbCBkZXNjcmlwdGlvbnMgZm9yIGRvaW5nIHdvcmsuICBUaGVzZSBiZWhhdmlvcmFsIGRlc2NyaXB0aW9ucyBhcmUgbm90IGJvdW5kIHRvIG9uZSBzcGVjaWZpYyBjbGFzc2lmaWVyLCBidXQgcmVwcmVzZW50IGFuIGFyYml0cmFyeSBkZWZpbml0aW9uIG9mIHdvcmsuICBGb3IgZXhhbXBsZSwgYSBXb3JrIERlZmluaXRpb24gY291bGQgcmVwcmVzZW50IHdvcmsgdGhhdCBpcyBiZWluZyBwZXJmb3JtZWQgYnkgYSBzcGVjaWZpYyBSb2xlIChlLmcuIGEgUm9sZSBwZXJmb3JtaW5nIGEgc3BlY2lmaWMgVGFzayBvciBTdGVwcyBvZiBhIFRhc2spLCBieSBtYW55IFJvbGVzIHdvcmtpbmcgaW4gY2xvc2UgY29sbGFib3JhdGlvbiAobWFueSBSb2xlcyBhbGwgd29ya2luZyB0b2dldGhlciBvbiB0aGUgc2FtZSBpbnRlcmRpc2NpcGxpbmFyeSBUYXNrKSwgb3IgY29tcGxleCB3b3JrIHRoYXQgaXMgcGVyZm9ybWVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSAoZS5nLiBhIHByb2Nlc3MgZGVmaW5pbmcgYSBicmVha2Rvd24gc3RydWN0dXJlIGZvciBvcmdhbml6aW5nIGxhcmdlciBjb21wb3NpdGUgdW5pdHMgb2Ygd29yayBwZXJmb3JtZWQgYnkgbWFueSBSb2xlcyB3b3JraW5nIGluIGNvbGxhYm9yYXRpb24pLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrRGVmaW5pdGlvbicga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtEZWZpbml0aW9uIGV4dGVuZHMgTWV0aG9kRWxlbWVudCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlY29uZGl0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmVjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcmVjb25kaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHJlY29uZGl0aW9uJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFByZWNvbmRpdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb24jZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZWNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3Rjb25kaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3Rjb25kaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UG9zdGNvbmRpdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUG9zdGNvbmRpdGlvbiciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0Y29uZGl0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gV29ya0RlZmluaXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTRiNmQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya09yZGVyLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVEYXRhT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIE9yZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudHMgaW4gd2hpY2ggb25lIEJyZWFrZG93biBFbGVtZW50cyBkZXBlbmRzIG9uIHRoZSBzdGFydCBvciBmaW5pc2ggb2YgYW5vdGhlciBCcmVha2Rvd24gRWxlbWVudHMgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiAgCi0gKiBUaGUgV29yayBPcmRlciBjbGFzcyBkZWZpbmVzIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3IgcmVsYXRpb25zIGFtb25nc3QgQnJlYWtkb3duIEVsZW1lbnRzLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbiBwYXJ0aWN1bGFyIGNyaXRpY2FsIGZvciBwbGFubmluZyBhcHBsaWNhdGlvbnMuICBTZWUgbW9yZSBkZXRhaWxzIG9uIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXQgV29yayBPcmRlciBUeXBlLgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya09yZGVyJyBraW5kPSdzaW1wbGUnIgotICogQGV4dGVuZHMgRURhdGFPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrT3JkZXIgZXh0ZW5kcyBFRGF0YU9iamVjdCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtPcmRlcl9WYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSc6MCcga2luZD0nc2ltcGxlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVmaW5lcyBhIGdsb2JhbCB1bmlxdWUgaWQgZm9yIGEgd29yayBvcmRlci4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya09yZGVyX0lkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2F0dHJpYnV0ZScgbmFtZT0naWQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlciNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxpbmsgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmaW5pc2hUb1N0YXJ0IjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBUaGlzIGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIHR5cGUgb2YgdGhlIFdvcmsgT3JkZXIgcmVsYXRpb25zaGlwIGJ5IGFzc2lnbmluZyBhIHZhbHVlIGZyb20gdGhlIFdvcmsgT3JkZXIgVHlwZSBlbnVtZXJhdGlvbi4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGUKLQkgKiBAc2VlICNpc1NldExpbmtUeXBlKCkKLQkgKiBAc2VlICN1bnNldExpbmtUeXBlKCkKLQkgKiBAc2VlICNzZXRMaW5rVHlwZShXb3JrT3JkZXJUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJfTGlua1R5cGUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSJmaW5pc2hUb1N0YXJ0IiB1bnNldHRhYmxlPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2xpbmtUeXBlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyI2dldExpbmtUeXBlIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxpbmsgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlCi0JICogQHNlZSAjaXNTZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjdW5zZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogVW5zZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgdW5zZXRMaW5rVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIjZ2V0TGlua1R5cGUgPGVtPkxpbmsgVHlwZTwvZW0+fScgYXR0cmlidXRlIGlzIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGluayBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpcyBzZXQuCi0JICogQHNlZSAjdW5zZXRMaW5rVHlwZSgpCi0JICogQHNlZSAjZ2V0TGlua1R5cGUoKQotCSAqIEBzZWUgI3NldExpbmtUeXBlKFdvcmtPcmRlclR5cGUpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNTZXRMaW5rVHlwZSgpOwotCi19IC8vIFdvcmtPcmRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya09yZGVyVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzUyM2NhLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrT3JkZXJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrT3JkZXJUeXBlLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBCcmVha2Rvd24gRWxlbWVudCBpbiB3aGljaCBvbmUgQnJlYWtkb3duIEVsZW1lbnQgZGVwZW5kcyBvbiB0aGUgc3RhcnQgb3IgZmluaXNoIG9mIGFub3RoZXIgQnJlYWtkb3duIEVsZW1lbnQgaW4gb3JkZXIgdG8gYmVnaW4gb3IgZW5kLiBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBXb3JrIE9yZGVyIHJlbGF0aW9uc2hpcHMgYXZhaWxhYmxlIGluIFVNQSBhbmQgaXMgdXNlZCB0byBwcm92aWRlIHZhbHVlcyBmb3IgV29yayBPcmRlcidzIGxpbmtUeXBlIGF0dHJpYnV0ZS4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrT3JkZXJUeXBlKCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrT3JkZXJUeXBlJyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gV29ya09yZGVyVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRklOSVNIX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRklOSVNIX1RPX1NUQVJUKDAsICJmaW5pc2hUb1N0YXJ0IiwgImZpbmlzaFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gRmluaXNoPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0ZJTklTSF9UT19GSU5JU0hfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlGSU5JU0hfVE9fRklOSVNIKDEsICJmaW5pc2hUb0ZpbmlzaCIsICJmaW5pc2hUb0ZpbmlzaCIpLAotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fU1RBUlQoMiwgInN0YXJ0VG9TdGFydCIsICJzdGFydFRvU3RhcnQiKSwKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RBUlRfVE9fRklOSVNIX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RBUlRfVE9fRklOSVNIKDMsICJzdGFydFRvRmluaXNoIiwgInN0YXJ0VG9GaW5pc2giKTsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GaW5pc2ggVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkZpbmlzaCBUbyBTdGFydDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fU1RBUlQKLQkgKiBAbW9kZWwgbmFtZT0iZmluaXNoVG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSU5JU0hfVE9fU1RBUlRfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RmluaXNoIFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGSU5JU0hfVE9fRklOSVNICi0JICogQG1vZGVsIG5hbWU9ImZpbmlzaFRvRmluaXNoIgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJTklTSF9UT19GSU5JU0hfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U3RhcnQgVG8gU3RhcnQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIFN0YXJ0PC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUQVJUX1RPX1NUQVJUCi0JICogQG1vZGVsIG5hbWU9InN0YXJ0VG9TdGFydCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19TVEFSVF9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TdGFydCBUbyBGaW5pc2g8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlN0YXJ0IFRvIEZpbmlzaDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTVEFSVF9UT19GSU5JU0gKLQkgKiBAbW9kZWwgbmFtZT0ic3RhcnRUb0ZpbmlzaCIKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFSVF9UT19GSU5JU0hfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgV29ya09yZGVyVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBXb3JrT3JkZXJUeXBlW10gewotCQkJRklOSVNIX1RPX1NUQVJULAotCQkJRklOSVNIX1RPX0ZJTklTSCwKLQkJCVNUQVJUX1RPX1NUQVJULAotCQkJU1RBUlRfVE9fRklOSVNILAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPldvcmsgT3JkZXIgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFdvcmtPcmRlclR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVdvcmtPcmRlclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Xb3JrIE9yZGVyIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBXb3JrT3JkZXJUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJV29ya09yZGVyVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+V29yayBPcmRlciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgV29ya09yZGVyVHlwZSBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgRklOSVNIX1RPX1NUQVJUX1ZBTFVFOiByZXR1cm4gRklOSVNIX1RPX1NUQVJUOwotCQkJY2FzZSBGSU5JU0hfVE9fRklOSVNIX1ZBTFVFOiByZXR1cm4gRklOSVNIX1RPX0ZJTklTSDsKLQkJCWNhc2UgU1RBUlRfVE9fU1RBUlRfVkFMVUU6IHJldHVybiBTVEFSVF9UT19TVEFSVDsKLQkJCWNhc2UgU1RBUlRfVE9fRklOSVNIX1ZBTFVFOiByZXR1cm4gU1RBUlRfVE9fRklOSVNIOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBXb3JrT3JkZXJUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0LmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRkY2JmZi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0LmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0OCBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotICogQW4gYWJzdHJhY3QgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSBnZW5lcmFsaXphdGlvbiBmb3IgdGhlIGNvbnRlbnQgZWxlbWVudCB0eXBlcyBBcnRpZmFjdCwgT3V0Y29tZSwgYW5kIERlbGl2ZXJhYmxlLiAgVGhlIG1ldGEtbW9kZWwgY2xhc3MgV29yayBQcm9kdWN0IGFjdHVhbGx5IHJlcHJlc2VudHMgd29yayBwcm9kdWN0IHR5cGVzLCBpLmUuIGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBpcyBhIGRlc2NyaXB0aW9uIG9mIGEgc3BlY2lmaWMgdHlwZSBvZiB3b3JrIHByb2R1Y3QgYW5kIG5vdCBhbiBpbmRpdmlkdWFsIHdvcmsgcHJvZHVjdCBpbnN0YW5jZS4gIEhvd2V2ZXIsIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb2YgbG93IHJpc2sgb2YgbWlzaW50ZXJwcmV0YXRpb24gd2UgZGlkIG5vdCBhcHBlbmQgdGhlIHdvcmQgJ3R5cGUnIHRvIGV2ZXJ5IG1ldGEtY2xhc3MuCi0gKiBBIHdvcmsgcHJvZHVjdCBpcyBhbiBhYnN0cmFjdGlvbiBmb3IgZGVzY3JpcHRpb25zIG9mIGNvbnRlbnQgZWxlbWVudHMgdGhhdCBhcmUgdXNlZCB0byBkZWZpbmUgYW55dGhpbmcgdXNlZCwgcHJvZHVjZWQsIG9yIG1vZGlmaWVkIGJ5IGEgdGFzay4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QjZ2V0RXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdCNnZXRUZW1wbGF0ZSA8ZW0+VGVtcGxhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0I2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0KCkKLSAqIEBtb2RlbCBleHRlbmRlZE1ldGFEYXRhPSJuYW1lPSdXb3JrUHJvZHVjdCcga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0IGV4dGVuZHMgQ29udGVudEVsZW1lbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdF9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXN0aW1hdGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Fc3RpbWF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXN0aW1hdGUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0VzdGltYXRpb25Db25zaWRlcmF0aW9ucycgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1JlcG9ydCcgZ3JvdXA9JyNncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0UmVwb3J0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wbGF0ZTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcGxhdGU8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wbGF0ZTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nVGVtcGxhdGUnIGdyb3VwPScjZ3JvdXA6MjQnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldFRlbXBsYXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ub29sIE1lbnRvcjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9vbCBNZW50b3I8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sIE1lbnRvcjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RfVG9vbE1lbnRvcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdUb29sTWVudG9yJyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCk7Ci0KLX0gLy8gV29ya1Byb2R1Y3QKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2NGMwMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgZ2VuZXJhbGl6ZWQgQ29udGVudCBEZXNjcmlwdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIHRleHR1YWwgZGVzY3JpcHRpb24gZm9yIGEgV29yayBQcm9kdWN0LgotICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0SW1wYWN0T2ZOb3RIYXZpbmcgPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24jZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0RGVzY3JpcHRpb24nIGtpbmQ9J2VsZW1lbnRPbmx5JyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3QgT2YgTm90IEhhdmluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0JICogRGVzY3JpYmVzIHRoZSBjb25zZXF1ZW5jZXMgb2Ygbm90IHByb2R1Y2luZyB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEltcGFjdE9mTm90SGF2aW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9JbXBhY3RPZk5vdEhhdmluZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RPZk5vdEhhdmluZyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRJbXBhY3RPZk5vdEhhdmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdCBPZiBOb3QgSGF2aW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbXBhY3RPZk5vdEhhdmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1cnBvc2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIERlc2NyaWJlcyB3aHkgdGhlIHdvcmsgcHJvZHVjdCBpcyBwcm9kdWNlZCBhbmQgdG8gd2hhdCB1c2UgaXQgd2lsbCBiZSBwdXQuCi0JICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFB1cnBvc2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUHVycG9zZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQdXJwb3NlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlB1cnBvc2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFB1cnBvc2UoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBEZXNjcmliZXMgdGhlIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggaXQgaXMgcmVhc29uYWJsZSBub3QgdG8gcHJvZHVjZSB0aGUgd29yayBwcm9kdWN0LiAgVGhpcyBpcyBpbnRlbmRlZCB0byBhaWQgaW4gdGhlIHRhaWxvcmluZyBvZiB0aGUgbWV0aG9kL3Byb2Nlc3MgdG8gdGhlIG5lZWRzIG9mIGEgc3BlY2lmaWMgcHJvamVjdC4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdSZWFzb25zRm9yTm90TmVlZGluZyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFzb25zRm9yTm90TmVlZGluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEzZGY0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9Xb3JrUHJvZHVjdERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRvci5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+V29yayBQcm9kdWN0IERlc2NyaXB0b3I8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+Ci0gKiBBIHNwZWNpYWwgRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudHMgYSBXb3JrIFByb2R1Y3QgaW4gdGhlIGNvbnRleHQgb2Ygb25lIHNwZWNpZmljIEFjdGl2aXR5LiAgRXZlcnkgYnJlYWtkb3duIHN0cnVjdHVyZSBjYW4gZGVmaW5lIGRpZmZlcmVudCByZWxhdGlvbnNoaXBzIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9ycyB0byBUYXNrIERlc2NyaXB0b3JzIGFuZCBSb2xlIERlc2NyaXB0b3JzLiAgVGhlcmVmb3JlIG9uZSBXb3JrIFByb2R1Y3QgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IG1hbnkgV29yayBQcm9kdWN0IERlc2NyaXB0b3JzIGVhY2ggd2l0aGluIHRoZSBjb250ZXh0IG9mIGFuIEFjdGl2aXR5IHdpdGggaXRzIG93biBzZXQgb2YgcmVsYXRpb25zaGlwcy4KLSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0RXh0ZXJuYWxJbnB1dFRvIDxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE1hbmRhdG9yeUlucHV0VG8gPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldE9wdGlvbmFsSW5wdXRUbyA8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRPdXRwdXRGcm9tIDxlbT5PdXRwdXQgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcigpCi0gKiBAbW9kZWwgZXh0ZW5kZWRNZXRhRGF0YT0ibmFtZT0nV29ya1Byb2R1Y3REZXNjcmlwdG9yJyBraW5kPSdlbGVtZW50T25seSciCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29yayBQcm9kdWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+V29yayBQcm9kdWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JrUHJvZHVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Xb3JrUHJvZHVjdCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdXb3JrUHJvZHVjdCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRXb3JrUHJvZHVjdCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFdvcmtQcm9kdWN0IDxlbT5Xb3JrIFByb2R1Y3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFdvcmtQcm9kdWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXNwb25zaWJsZSBSb2xlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXNwb25zaWJsZSBSb2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3BvbnNpYmxlUm9sZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nUmVzcG9uc2libGVSb2xlJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlc3BvbnNpYmxlUm9sZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXNwb25zaWJsZVJvbGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwMjwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXAuRW50cnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R3JvdXAyPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfR3JvdXAyKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmVhdHVyZU1hcEVudHJ5IiBtYW55PSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdncm91cCcgbmFtZT0nZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlGZWF0dXJlTWFwIGdldEdyb3VwMigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXh0ZXJuYWwgSW5wdXQgVG88L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4dGVybmFsIElucHV0IFRvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXh0ZXJuYWwgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nRXh0ZXJuYWxJbnB1dFRvJyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRFeHRlcm5hbElucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkltcGFjdGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkltcGFjdGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0ZWRCeSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiB0cmFuc2llbnQ9InRydWUiIHZvbGF0aWxlPSJ0cnVlIiBkZXJpdmVkPSJ0cnVlIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdlbGVtZW50JyBuYW1lPSdJbXBhY3RlZEJ5JyBncm91cD0nI2dyb3VwOjMzJyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRJbXBhY3RlZEJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbXBhY3RzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbXBhY3RzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW1wYWN0czwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nSW1wYWN0cycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0SW1wYWN0cygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFuZGF0b3J5IElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYW5kYXRvcnkgSW5wdXQgVG88L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J01hbmRhdG9yeUlucHV0VG8nIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0VG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9wdGlvbmFsIElucHV0IFRvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpb25hbCBJbnB1dCBUbzwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsIElucHV0IFRvPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dFRvKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J09wdGlvbmFsSW5wdXRUbycgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3B0aW9uYWxJbnB1dFRvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PdXRwdXQgRnJvbTwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3V0cHV0IEZyb208L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PdXRwdXQgRnJvbTwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX091dHB1dEZyb20oKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgdHJhbnNpZW50PSJ0cnVlIiB2b2xhdGlsZT0idHJ1ZSIgZGVyaXZlZD0idHJ1ZSIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nZWxlbWVudCcgbmFtZT0nT3V0cHV0RnJvbScgZ3JvdXA9JyNncm91cDozMyciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0T3V0cHV0RnJvbSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaXZlcmFibGUgUGFydHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaXZlcmFibGUgUGFydHM8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9EZWxpdmVyYWJsZVBhcnRzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J0RlbGl2ZXJhYmxlUGFydHMnIGdyb3VwPScjZ3JvdXA6MzMnIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxTdHJpbmc+IGdldERlbGl2ZXJhYmxlUGFydHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLQkgKiBHaXZlbiB0aGF0IGFuIGluc3RhbmNlIG9mIFdvcmsgUHJvZHVjdCBEZXNjcmlwdG9yIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQWN0aXZpdHksIHRoZW4gdGhlIEFjdGl2aXR5IEVudHJ5IFN0YXRlIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgaW5zdGFuY2VzIG9mIHRoZSByZWZlcmVuY2VkIFdvcmsgUHJvZHVjdCB3aGVuIHdvcmsgb24gdGhlIEFjdGl2aXR5IGlzIGluaXRpYXRlZCAoaS5lLiB3b3JrIG9uIHRoZSBBY3Rpdml0eSdzIFRhc2sgRGVzY3JpcHRvcnMgaXMgYmVpbmcgaW5pdGlhdGVkIHRoYXQgdXNlIHRoaXMgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgYXMgaW5wdXQpLiAgCi0JICogRm9yIHNvbWUgV29yayBQcm9kdWN0cyBzdGF0ZSBpcyBleHByZXNzZWQgaW4gcGVyY2VudGFnZSBvZiBjb21wbGV0aW9uLCBjb21wbGlhbmNlIHRvIHdvcmsgcHJvZHVjdCBjaGVja2xpc3QsIGluZm9ybWFsIHN0YXRlIGRlc2NyaXB0aW9ucywgZXRjLiAgT3RoZXJzIGhhdmUgdmVyeSBzcGVjaWZpYyBzdGF0ZXMgZXhwcmVzc2VkIGFzIGVudW1lcmF0aW9ucyBzdWNoIGFzIFtpZGVudGlmaWVkLCBicmllZmx5IGRlc2NyaWJlZCwgb3V0bGluZWQsIGRldGFpbGVkXSBmb3IgdXNlIGNhc2VzLiAgT3RoZXIgV29yayBQcm9kdWN0IHN0YXRlcyByZWxhdGUgdG8gc29tZSBxdWFsaXR5IG1lYXN1cmVzIG9yIGxpZmVjeWNsZSBzdGF0ZXMgc3VjaCBhcyBbcmV2aWV3ZWQsIGltcGxlbWVudGVkLCB0ZXN0ZWRdLgotCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqICAgICAgICBleHRlbmRlZE1ldGFEYXRhPSJraW5kPSdhdHRyaWJ1dGUnIG5hbWU9J2FjdGl2aXR5RW50cnlTdGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvciNnZXRBY3Rpdml0eUVudHJ5U3RhdGUgPGVtPkFjdGl2aXR5IEVudHJ5IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY3Rpdml0eUVudHJ5U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjdGl2aXR5IEV4aXQgU3RhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgotCSAqIEdpdmVuIHRoYXQgYW4gaW5zdGFuY2Ugb2YgV29yayBQcm9kdWN0IERlc2NyaXB0b3IgaGFzIGJlZW4gY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBBY3Rpdml0eSwgdGhlbiB0aGUgQWN0aXZpdHkgRXhpc3QgU3RhdGUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBzdGF0ZSBvZiBpbnN0YW5jZXMgb2YgdGhlIHJlZmVyZW5jZWQgV29yayBQcm9kdWN0IHdoZW4gd29yayBvbiB0aGUgQWN0aXZpdHkgaXMgZmluaXNoZWQgKGkuZS4gd29yayBvbiB0aGUgQWN0aXZpdHkncyBUYXNrIERlc2NyaXB0b3JzIGhhcyBmaW5pc2hlZCB0aGF0IGhhdmUgdGhpcyBXb3JrIFByb2R1Y3QgRGVzY3JpcHRvciBhcyBvdXRwdXQpLgotCSAqIEZvciBzb21lIFdvcmsgUHJvZHVjdHMgc3RhdGUgaXMgZXhwcmVzc2VkIGluIHBlcmNlbnRhZ2Ugb2YgY29tcGxldGlvbiwgY29tcGxpYW5jZSB0byB3b3JrIHByb2R1Y3QgY2hlY2tsaXN0LCBpbmZvcm1hbCBzdGF0ZSBkZXNjcmlwdGlvbnMsIGV0Yy4gIE90aGVycyBoYXZlIHZlcnkgc3BlY2lmaWMgc3RhdGVzIGV4cHJlc3NlZCBhcyBlbnVtZXJhdGlvbnMgc3VjaCBhcyBbaWRlbnRpZmllZCwgYnJpZWZseSBkZXNjcmliZWQsIG91dGxpbmVkLCBkZXRhaWxlZF0gZm9yIHVzZSBjYXNlcy4gIE90aGVyIFdvcmsgUHJvZHVjdCBzdGF0ZXMgcmVsYXRlIHRvIHNvbWUgcXVhbGl0eSBtZWFzdXJlcyBvciBsaWZlY3ljbGUgc3RhdGVzIHN1Y2ggYXMgW3Jldmlld2VkLCBpbXBsZW1lbnRlZCwgdGVzdGVkXS4KLQkgKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWN0aXZpdHkgRXhpdCBTdGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFeGl0U3RhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiAgICAgICAgZXh0ZW5kZWRNZXRhRGF0YT0ia2luZD0nYXR0cmlidXRlJyBuYW1lPSdhY3Rpdml0eUV4aXRTdGF0ZSciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBXb3JrUHJvZHVjdERlc2NyaXB0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvV29ya1Byb2R1Y3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWRiYWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL1dvcmtQcm9kdWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdFR5cGUuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KLSAqIEEgc2Vjb25kIGNhdGVnb3J5IGZvciB3b3JrIHByb2R1Y3RzLCB3aGljaCBpbiBjb250cmFzdCB0byBEb21haW4gaXMgbW9yZSBwcmVzZW50YXRpb24gb3JpZW50ZWQuICBBIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtYW55IFdvcmsgUHJvZHVjdCBUeXBlcy4gIEV4YW1wbGVzLCBmb3IgYSBXb3JrIFByb2R1Y3QgVHlwZSBpcyAiQ2xhc3MgRGlhZ3JhbSIsIHdoaWNoIGNhdGVnb3JpemVzIHRoZSBBcnRpZmFjdHMgQW5hbHlzaXMgTW9kZWwsIERlc2lnbiBNb2RlbCwgVXNlciBFeHBlcmllbmNlIE1vZGVsLCBvciAiU3BlY2lmaWNhdGlvbiIsIHdoaWNoIGNhdGVnb3JpemVzIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9ucyB0aGF0IGRlZmluZSBhIHN5c3RlbSB3aXRoIGEgd2VsbC1kZWZpbmVkIHN5c3RlbSBib3VuZGFyeSwgc3VjaCBhcyB1c2UgY2FzZSBvciBmdW5jdGlvbmFsIHJlcXVpcmVtZW50cyBzcGVjaWZpY2F0aW9uLiAgQSBXb3JrIFByb2R1Y3QgY2FuIGJlIGNhdGVnb3JpemVkIHRvIGJlIG9mIG1hbnkgV29yayBQcm9kdWN0IFR5cGVzLiAgRm9yIGV4YW1wbGUsIGEgdXNlIGNhc2UgbW9kZWwgY2FuIGJlIGNhdGVnb3JpemVkIGFzIGEgU3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIERpYWdyYW0gV29yayBQcm9kdWN0IFR5cGUuCi0gKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZSNnZXRXb3JrUHJvZHVjdFR5cGUoKQotICogQG1vZGVsIGV4dGVuZGVkTWV0YURhdGE9Im5hbWU9J1dvcmtQcm9kdWN0VHlwZScga2luZD0nZWxlbWVudE9ubHknIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdvcmtQcm9kdWN0VHlwZSBleHRlbmRzIENvbnRlbnRDYXRlZ29yeSB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcC5FbnRyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cDI8L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlI2dldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGZWF0dXJlTWFwRW50cnkiIG1hbnk9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2dyb3VwJyBuYW1lPSdncm91cDoyNCciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZlYXR1cmVNYXAgZ2V0R3JvdXAyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Xb3JrIFByb2R1Y3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPldvcmsgUHJvZHVjdDwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHRyYW5zaWVudD0idHJ1ZSIgdm9sYXRpbGU9InRydWUiIGRlcml2ZWQ9InRydWUiCi0JICogICAgICAgIGV4dGVuZGVkTWV0YURhdGE9ImtpbmQ9J2VsZW1lbnQnIG5hbWU9J1dvcmtQcm9kdWN0JyBncm91cD0nI2dyb3VwOjI0JyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpOwotCi19IC8vIFdvcmtQcm9kdWN0VHlwZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFmNzkyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eURlc2NyaXB0aW9uSW1wbCNnZXRIb3dUb1N0YWZmIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlEZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIEFjdGl2aXR5RGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFMVEVSTkFUSVZFU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbHRlcm5hdGl2ZXMoKSA8ZW0+QWx0ZXJuYXRpdmVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbHRlcm5hdGl2ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWx0ZXJuYXRpdmVzID0gQUxURVJOQVRJVkVTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvd1RvU3RhZmYoKSA8ZW0+SG93IFRvIFN0YWZmPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIb3dUb1N0YWZmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIT1dfVE9fU1RBRkZfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SG93VG9TdGFmZigpIDxlbT5Ib3cgVG8gU3RhZmY8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvd1RvU3RhZmYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaG93VG9TdGFmZiA9IEhPV19UT19TVEFGRl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BQ1RJVklUWV9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIGFsdGVybmF0aXZlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHRlcm5hdGl2ZXMoU3RyaW5nIG5ld0FsdGVybmF0aXZlcykgewotCQlTdHJpbmcgb2xkQWx0ZXJuYXRpdmVzID0gYWx0ZXJuYXRpdmVzOwotCQlhbHRlcm5hdGl2ZXMgPSBuZXdBbHRlcm5hdGl2ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUywgb2xkQWx0ZXJuYXRpdmVzLCBhbHRlcm5hdGl2ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvd1RvU3RhZmYoKSB7Ci0JCXJldHVybiBob3dUb1N0YWZmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvd1RvU3RhZmYoU3RyaW5nIG5ld0hvd1RvU3RhZmYpIHsKLQkJU3RyaW5nIG9sZEhvd1RvU3RhZmYgPSBob3dUb1N0YWZmOwotCQlob3dUb1N0YWZmID0gbmV3SG93VG9TdGFmZjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fSE9XX1RPX1NUQUZGLCBvbGRIb3dUb1N0YWZmLCBob3dUb1N0YWZmKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX1BVUlBPU0UsIG9sZFB1cnBvc2UsIHB1cnBvc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gZ2V0QWx0ZXJuYXRpdmVzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlyZXR1cm4gZ2V0SG93VG9TdGFmZigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTOgotCQkJCXNldEFsdGVybmF0aXZlcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlzZXRIb3dUb1N0YWZmKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlzZXRIb3dUb1N0YWZmKEhPV19UT19TVEFGRl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXNldFB1cnBvc2UoUFVSUE9TRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbCA6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfREVTQ1JJUFRJT05fX0hPV19UT19TVEFGRjoKLQkJCQlyZXR1cm4gSE9XX1RPX1NUQUZGX0VERUZBVUxUID09IG51bGwgPyBob3dUb1N0YWZmICE9IG51bGwgOiAhSE9XX1RPX1NUQUZGX0VERUZBVUxULmVxdWFscyhob3dUb1N0YWZmKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWx0ZXJuYXRpdmVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGhvd1RvU3RhZmY6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGhvd1RvU3RhZmYpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FjdGl2aXR5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMzkzMWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQWN0aXZpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBY3Rpdml0eUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BY3Rpdml0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0UHJlY29uZGl0aW9uIDxlbT5QcmVjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldFBvc3Rjb25kaXRpb24gPGVtPlBvc3Rjb25kaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQWN0aXZpdHlJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRCcmVha2Rvd25FbGVtZW50IDxlbT5CcmVha2Rvd24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjZ2V0Um9hZG1hcCA8ZW0+Um9hZG1hcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BY3Rpdml0eUltcGwjaXNJc0VuYWN0YWJsZSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFjdGl2aXR5SW1wbCNnZXRWYXJpYWJpbGl0eVR5cGUgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0eUltcGwgZXh0ZW5kcyBXb3JrQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBBY3Rpdml0eSB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVjb25kaXRpb24gPSBQUkVDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3N0Y29uZGl0aW9uID0gUE9TVENPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0VuYWN0YWJsZSgpIDxlbT5JcyBFbmFjdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFbmFjdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FTkFDVEFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFbmFjdGFibGUoKSA8ZW0+SXMgRW5hY3RhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRW5hY3RhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWN0YWJsZSA9IElTX0VOQUNUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRW5hY3RhYmxlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWN0YWJsZUVTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIDxlbT5WYXJpYWJpbGl0eSBCYXNlZCBPbiBFbGVtZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eVR5cGUoKSA8ZW0+VmFyaWFiaWxpdHkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZhcmlhYmlsaXR5VHlwZSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUID0gVmFyaWFiaWxpdHlUeXBlLk5BOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFZhcmlhYmlsaXR5VHlwZSB2YXJpYWJpbGl0eVR5cGUgPSBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBWYXJpYWJpbGl0eSBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFjdGl2aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyBuZXdQcmVjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT04sIG9sZFBvc3Rjb25kaXRpb24sIHBvc3Rjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDMoKSB7Ci0JCWlmIChncm91cDMgPT0gbnVsbCkgewotCQkJZ3JvdXAzID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEJyZWFrZG93bkVsZW1lbnQ+IGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDMoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSb2FkbWFwKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkFDVElWSVRZX19ST0FETUFQKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzRW5hY3RhYmxlKCkgewotCQlyZXR1cm4gaXNFbmFjdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNFbmFjdGFibGUoYm9vbGVhbiBuZXdJc0VuYWN0YWJsZSkgewotCQlib29sZWFuIG9sZElzRW5hY3RhYmxlID0gaXNFbmFjdGFibGU7Ci0JCWlzRW5hY3RhYmxlID0gbmV3SXNFbmFjdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGVFU2V0ID0gaXNFbmFjdGFibGVFU2V0OwotCQlpc0VuYWN0YWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEUsIG9sZElzRW5hY3RhYmxlLCBpc0VuYWN0YWJsZSwgIW9sZElzRW5hY3RhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNFbmFjdGFibGUoKSB7Ci0JCWJvb2xlYW4gb2xkSXNFbmFjdGFibGUgPSBpc0VuYWN0YWJsZTsKLQkJYm9vbGVhbiBvbGRJc0VuYWN0YWJsZUVTZXQgPSBpc0VuYWN0YWJsZUVTZXQ7Ci0JCWlzRW5hY3RhYmxlID0gSVNfRU5BQ1RBQkxFX0VERUZBVUxUOwotCQlpc0VuYWN0YWJsZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEUsIG9sZElzRW5hY3RhYmxlLCBJU19FTkFDVEFCTEVfRURFRkFVTFQsIG9sZElzRW5hY3RhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiBpc0VuYWN0YWJsZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFN0cmluZyBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSB7Ci0JCVN0cmluZyBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQsIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlIG5ld1ZhcmlhYmlsaXR5VHlwZSkgewotCQlWYXJpYWJpbGl0eVR5cGUgb2xkVmFyaWFiaWxpdHlUeXBlID0gdmFyaWFiaWxpdHlUeXBlOwotCQl2YXJpYWJpbGl0eVR5cGUgPSBuZXdWYXJpYWJpbGl0eVR5cGUgPT0gbnVsbCA/IFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQgOiBuZXdWYXJpYWJpbGl0eVR5cGU7Ci0JCWJvb2xlYW4gb2xkVmFyaWFiaWxpdHlUeXBlRVNldCA9IHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JCXZhcmlhYmlsaXR5VHlwZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUsIG9sZFZhcmlhYmlsaXR5VHlwZSwgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCwgb2xkVmFyaWFiaWxpdHlUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QnJlYWtkb3duRWxlbWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gZ2V0UG9zdGNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0QnJlYWtkb3duRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCXJldHVybiBnZXRSb2FkbWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQlyZXR1cm4gaXNJc0VuYWN0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBnZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1BPU1RDT05ESVRJT046Ci0JCQkJc2V0UG9zdGNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19ST0FETUFQOgotCQkJCWdldFJvYWRtYXAoKS5jbGVhcigpOwotCQkJCWdldFJvYWRtYXAoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fSVNfRU5BQ1RBQkxFOgotCQkJCXNldElzRW5hY3RhYmxlKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUE9TVENPTkRJVElPTjoKLQkJCQlzZXRQb3N0Y29uZGl0aW9uKFBPU1RDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVDoKLQkJCQlnZXRCcmVha2Rvd25FbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1JPQURNQVA6Ci0JCQkJZ2V0Um9hZG1hcCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19JU19FTkFDVEFCTEU6Ci0JCQkJdW5zZXRJc0VuYWN0YWJsZSgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlzZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0dST1VQMzoKLQkJCQlyZXR1cm4gZ3JvdXAzICE9IG51bGwgJiYgIWdyb3VwMy5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0JSRUFLRE9XTl9FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0QnJlYWtkb3duRWxlbWVudCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9fUk9BRE1BUDoKLQkJCQlyZXR1cm4gIWdldFJvYWRtYXAoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX0lTX0VOQUNUQUJMRToKLQkJCQlyZXR1cm4gaXNTZXRJc0VuYWN0YWJsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwgOiAhVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHModmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGlzU2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwcmVjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcG9zdGNvbmRpdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocG9zdGNvbmRpdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRW5hY3RhYmxlOiAiKTsKLQkJaWYgKGlzRW5hY3RhYmxlRVNldCkgcmVzdWx0LmFwcGVuZChpc0VuYWN0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5VHlwZTogIik7Ci0JCWlmICh2YXJpYWJpbGl0eVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BY3Rpdml0eUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEyOTBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwjaXNJc1ByaW1hcnlFeHRlbnNpb24gPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1ByaW1hcnlFeHRlbnNpb24oKSA8ZW0+SXMgUHJpbWFyeSBFeHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNQcmltYXJ5RXh0ZW5zaW9uKCkgPGVtPklzIFByaW1hcnkgRXh0ZW5zaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUHJpbWFyeUV4dGVuc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmltYXJ5RXh0ZW5zaW9uID0gSVNfUFJJTUFSWV9FWFRFTlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFByaW1hcnkgRXh0ZW5zaW9uIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByaW1hcnlFeHRlbnNpb25FU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBpc1ByaW1hcnlFeHRlbnNpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNQcmltYXJ5RXh0ZW5zaW9uKGJvb2xlYW4gbmV3SXNQcmltYXJ5RXh0ZW5zaW9uKSB7Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uID0gaXNQcmltYXJ5RXh0ZW5zaW9uOwotCQlpc1ByaW1hcnlFeHRlbnNpb24gPSBuZXdJc1ByaW1hcnlFeHRlbnNpb247Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IGlzUHJpbWFyeUV4dGVuc2lvbkVTZXQ7Ci0JCWlzUHJpbWFyeUV4dGVuc2lvbkVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTiwgb2xkSXNQcmltYXJ5RXh0ZW5zaW9uLCBpc1ByaW1hcnlFeHRlbnNpb24sICFvbGRJc1ByaW1hcnlFeHRlbnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCWJvb2xlYW4gb2xkSXNQcmltYXJ5RXh0ZW5zaW9uID0gaXNQcmltYXJ5RXh0ZW5zaW9uOwotCQlib29sZWFuIG9sZElzUHJpbWFyeUV4dGVuc2lvbkVTZXQgPSBpc1ByaW1hcnlFeHRlbnNpb25FU2V0OwotCQlpc1ByaW1hcnlFeHRlbnNpb24gPSBJU19QUklNQVJZX0VYVEVOU0lPTl9FREVGQVVMVDsKLQkJaXNQcmltYXJ5RXh0ZW5zaW9uRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OLCBvbGRJc1ByaW1hcnlFeHRlbnNpb24sIElTX1BSSU1BUllfRVhURU5TSU9OX0VERUZBVUxULCBvbGRJc1ByaW1hcnlFeHRlbnNpb25FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiBpc1ByaW1hcnlFeHRlbnNpb25FU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GT19fSVNfUFJJTUFSWV9FWFRFTlNJT046Ci0JCQkJcmV0dXJuIGlzSXNQcmltYXJ5RXh0ZW5zaW9uKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk9fX0lTX1BSSU1BUllfRVhURU5TSU9OOgotCQkJCXNldElzUHJpbWFyeUV4dGVuc2lvbigoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCQl1bnNldElzUHJpbWFyeUV4dGVuc2lvbigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTjoKLQkJCQlyZXR1cm4gaXNTZXRJc1ByaW1hcnlFeHRlbnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGlzUHJpbWFyeUV4dGVuc2lvbjogIik7Ci0JCWlmIChpc1ByaW1hcnlFeHRlbnNpb25FU2V0KSByZXN1bHQuYXBwZW5kKGlzUHJpbWFyeUV4dGVuc2lvbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0ltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JhOWM1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXRCcmllZk91dGxpbmUgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3REZXNjcmlwdGlvbkltcGwjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0RGVzY3JpcHRpb25JbXBsI2dldFJlcHJlc2VudGF0aW9uIDxlbT5SZXByZXNlbnRhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5BcnRpZmFjdERlc2NyaXB0aW9uSW1wbCNnZXROb3RhdGlvbiA8ZW0+Tm90YXRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQXJ0aWZhY3REZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJyaWVmT3V0bGluZSgpIDxlbT5CcmllZiBPdXRsaW5lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCcmllZk91dGxpbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJSSUVGX09VVExJTkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZPdXRsaW5lKCkgPGVtPkJyaWVmIE91dGxpbmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJyaWVmT3V0bGluZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZk91dGxpbmUgPSBCUklFRl9PVVRMSU5FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpIDxlbT5SZXByZXNlbnRhdGlvbiBPcHRpb25zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbk9wdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUFJFU0VOVEFUSU9OX09QVElPTlNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgPGVtPlJlcHJlc2VudGF0aW9uIE9wdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXByZXNlbnRhdGlvbk9wdGlvbnMgPSBSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcHJlc2VudGF0aW9uKCkgPGVtPlJlcHJlc2VudGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXByZXNlbnRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQUkVTRU5UQVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwcmVzZW50YXRpb24oKSA8ZW0+UmVwcmVzZW50YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcHJlc2VudGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcHJlc2VudGF0aW9uID0gUkVQUkVTRU5UQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm90YXRpb24oKSA8ZW0+Tm90YXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROb3RhdGlvbigpIDxlbT5Ob3RhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm90YXRpb24gPSBOT1RBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQVJUSUZBQ1RfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCcmllZk91dGxpbmUoKSB7Ci0JCXJldHVybiBicmllZk91dGxpbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QnJpZWZPdXRsaW5lKFN0cmluZyBuZXdCcmllZk91dGxpbmUpIHsKLQkJU3RyaW5nIG9sZEJyaWVmT3V0bGluZSA9IGJyaWVmT3V0bGluZTsKLQkJYnJpZWZPdXRsaW5lID0gbmV3QnJpZWZPdXRsaW5lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19CUklFRl9PVVRMSU5FLCBvbGRCcmllZk91dGxpbmUsIGJyaWVmT3V0bGluZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb25PcHRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhTdHJpbmcgbmV3UmVwcmVzZW50YXRpb25PcHRpb25zKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbk9wdGlvbnMgPSByZXByZXNlbnRhdGlvbk9wdGlvbnM7Ci0JCXJlcHJlc2VudGF0aW9uT3B0aW9ucyA9IG5ld1JlcHJlc2VudGF0aW9uT3B0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUywgb2xkUmVwcmVzZW50YXRpb25PcHRpb25zLCByZXByZXNlbnRhdGlvbk9wdGlvbnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcmVwcmVzZW50YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb24oU3RyaW5nIG5ld1JlcHJlc2VudGF0aW9uKSB7Ci0JCVN0cmluZyBvbGRSZXByZXNlbnRhdGlvbiA9IHJlcHJlc2VudGF0aW9uOwotCQlyZXByZXNlbnRhdGlvbiA9IG5ld1JlcHJlc2VudGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTiwgb2xkUmVwcmVzZW50YXRpb24sIHJlcHJlc2VudGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb3RhdGlvbigpIHsKLQkJcmV0dXJuIG5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uKFN0cmluZyBuZXdOb3RhdGlvbikgewotCQlTdHJpbmcgb2xkTm90YXRpb24gPSBub3RhdGlvbjsKLQkJbm90YXRpb24gPSBuZXdOb3RhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT04sIG9sZE5vdGF0aW9uLCBub3RhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlyZXR1cm4gZ2V0QnJpZWZPdXRsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OX09QVElPTlM6Ci0JCQkJcmV0dXJuIGdldFJlcHJlc2VudGF0aW9uT3B0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVwcmVzZW50YXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJcmV0dXJuIGdldE5vdGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlzZXRCcmllZk91dGxpbmUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJCXNldFJlcHJlc2VudGF0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fTk9UQVRJT046Ci0JCQkJc2V0Tm90YXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlzZXRCcmllZk91dGxpbmUoQlJJRUZfT1VUTElORV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TOgotCQkJCXNldFJlcHJlc2VudGF0aW9uT3B0aW9ucyhSRVBSRVNFTlRBVElPTl9PUFRJT05TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX1JFUFJFU0VOVEFUSU9OOgotCQkJCXNldFJlcHJlc2VudGF0aW9uKFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJCXNldE5vdGF0aW9uKE5PVEFUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fQlJJRUZfT1VUTElORToKLQkJCQlyZXR1cm4gQlJJRUZfT1VUTElORV9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZPdXRsaW5lICE9IG51bGwgOiAhQlJJRUZfT1VUTElORV9FREVGQVVMVC5lcXVhbHMoYnJpZWZPdXRsaW5lKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT05fT1BUSU9OUzoKLQkJCQlyZXR1cm4gUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVCA9PSBudWxsID8gcmVwcmVzZW50YXRpb25PcHRpb25zICE9IG51bGwgOiAhUkVQUkVTRU5UQVRJT05fT1BUSU9OU19FREVGQVVMVC5lcXVhbHMocmVwcmVzZW50YXRpb25PcHRpb25zKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIFJFUFJFU0VOVEFUSU9OX0VERUZBVUxUID09IG51bGwgPyByZXByZXNlbnRhdGlvbiAhPSBudWxsIDogIVJFUFJFU0VOVEFUSU9OX0VERUZBVUxULmVxdWFscyhyZXByZXNlbnRhdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT05fX05PVEFUSU9OOgotCQkJCXJldHVybiBOT1RBVElPTl9FREVGQVVMVCA9PSBudWxsID8gbm90YXRpb24gIT0gbnVsbCA6ICFOT1RBVElPTl9FREVGQVVMVC5lcXVhbHMobm90YXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYnJpZWZPdXRsaW5lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChicmllZk91dGxpbmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcHJlc2VudGF0aW9uT3B0aW9uczogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVwcmVzZW50YXRpb25PcHRpb25zKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXByZXNlbnRhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVwcmVzZW50YXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vdGF0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub3RhdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQXJ0aWZhY3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkZWNhNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9BcnRpZmFjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEFydGlmYWN0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXJ0aWZhY3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQXJ0aWZhY3RJbXBsI2dldEdyb3VwMyA8ZW0+R3JvdXAzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkFydGlmYWN0SW1wbCNnZXRDb250YWluZWRBcnRpZmFjdCA8ZW0+Q29udGFpbmVkIEFydGlmYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgQXJ0aWZhY3QgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMygpIDxlbT5Hcm91cDM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXJ0aWZhY3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDMoKSB7Ci0JCWlmIChncm91cDMgPT0gbnVsbCkgewotCQkJZ3JvdXAzID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDMpOwotCQl9Ci0JCXJldHVybiBncm91cDM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEFydGlmYWN0PiBnZXRDb250YWluZWRBcnRpZmFjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnRhaW5lZEFydGlmYWN0KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19HUk9VUDM6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAzKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDMoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJcmV0dXJuIGdldENvbnRhaW5lZEFydGlmYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX19DT05UQUlORURfQVJUSUZBQ1Q6Ci0JCQkJZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5jbGVhcigpOwotCQkJCWdldENvbnRhaW5lZEFydGlmYWN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcnRpZmFjdD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfX0dST1VQMzoKLQkJCQlnZXRHcm91cDMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCWdldENvbnRhaW5lZEFydGlmYWN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUlRJRkFDVF9fQ09OVEFJTkVEX0FSVElGQUNUOgotCQkJCXJldHVybiAhZ2V0Q29udGFpbmVkQXJ0aWZhY3QoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0FydGlmYWN0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1MTQyNy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCNnZXRVc2FnZUd1aWRhbmNlIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VHdWlkYW5jZSgpIDxlbT5Vc2FnZSBHdWlkYW5jZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZUd1aWRhbmNlID0gVVNBR0VfR1VJREFOQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gdXNhZ2VHdWlkYW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVc2FnZUd1aWRhbmNlKFN0cmluZyBuZXdVc2FnZUd1aWRhbmNlKSB7Ci0JCVN0cmluZyBvbGRVc2FnZUd1aWRhbmNlID0gdXNhZ2VHdWlkYW5jZTsKLQkJdXNhZ2VHdWlkYW5jZSA9IG5ld1VzYWdlR3VpZGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFLCBvbGRVc2FnZUd1aWRhbmNlLCB1c2FnZUd1aWRhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OX19VU0FHRV9HVUlEQU5DRToKLQkJCQlyZXR1cm4gZ2V0VXNhZ2VHdWlkYW5jZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXNldFVzYWdlR3VpZGFuY2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0U6Ci0JCQkJc2V0VXNhZ2VHdWlkYW5jZShVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfREVTQ1JJUFRJT05fX1VTQUdFX0dVSURBTkNFOgotCQkJCXJldHVybiBVU0FHRV9HVUlEQU5DRV9FREVGQVVMVCA9PSBudWxsID8gdXNhZ2VHdWlkYW5jZSAhPSBudWxsIDogIVVTQUdFX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyh1c2FnZUd1aWRhbmNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHVzYWdlR3VpZGFuY2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVzYWdlR3VpZGFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNmRlMGIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEJyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QnJlYWtkb3duIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlc2VudGVkQWZ0ZXIgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRQcmVzZW50ZWRCZWZvcmUgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UGxhbm5pbmdEYXRhIDxlbT5QbGFubmluZyBEYXRhPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFN1cGVyQWN0aXZpdHkgPGVtPlN1cGVyIEFjdGl2aXR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldEdyb3VwMSA8ZW0+R3JvdXAxPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldENvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0RXhhbXBsZSA8ZW0+RXhhbXBsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRSZXVzYWJsZUFzc2V0IDxlbT5SZXVzYWJsZSBBc3NldDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNnZXRTdXBwb3J0aW5nTWF0ZXJpYWwgPGVtPlN1cHBvcnRpbmcgTWF0ZXJpYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5CcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzT3B0aW9uYWwgPGVtPklzIE9wdGlvbmFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNQbGFubmVkIDxlbT5JcyBQbGFubmVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkJyZWFrZG93bkVsZW1lbnRJbXBsI2dldFByZWZpeCA8ZW0+UHJlZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtkb3duRWxlbWVudEltcGwgZXh0ZW5kcyBQcm9jZXNzRWxlbWVudEltcGwgaW1wbGVtZW50cyBCcmVha2Rvd25FbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQWZ0ZXIoKSA8ZW0+UHJlc2VudGVkIEFmdGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50ZWRBZnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEVEX0FGVEVSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZXNlbnRlZEFmdGVyKCkgPGVtPlByZXNlbnRlZCBBZnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQWZ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlc2VudGVkQWZ0ZXIgPSBQUkVTRU5URURfQUZURVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlc2VudGVkQmVmb3JlKCkgPGVtPlByZXNlbnRlZCBCZWZvcmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZXNlbnRlZEJlZm9yZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50ZWRCZWZvcmUoKSA8ZW0+UHJlc2VudGVkIEJlZm9yZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlc2VudGVkQmVmb3JlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRlZEJlZm9yZSA9IFBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhbm5pbmdEYXRhKCkgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBsYW5uaW5nRGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBTk5JTkdfREFUQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQbGFubmluZ0RhdGEoKSA8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGxhbm5pbmdEYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBsYW5uaW5nRGF0YSA9IFBMQU5OSU5HX0RBVEFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJBY3Rpdml0eSgpIDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3VwZXJBY3Rpdml0eSgpIDxlbT5TdXBlciBBY3Rpdml0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3VwZXJBY3Rpdml0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdXBlckFjdGl2aXR5ID0gU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIDxlbT5IYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPGVtPkhhcyBNdWx0aXBsZSBPY2N1cnJlbmNlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzID0gSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBIYXMgTXVsdGlwbGUgT2NjdXJyZW5jZXMgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfT1BUSU9OQUxfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPcHRpb25hbCgpIDxlbT5JcyBPcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc09wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIE9wdGlvbmFsIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09wdGlvbmFsRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzUGxhbm5lZCgpIDxlbT5JcyBQbGFubmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzUGxhbm5lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX1BMQU5ORURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNQbGFubmVkKCkgPGVtPklzIFBsYW5uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNQbGFubmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BsYW5uZWQgPSBJU19QTEFOTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBQbGFubmVkIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BsYW5uZWRFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWZpeCgpIDxlbT5QcmVmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXggPSBQUkVGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQnJlYWtkb3duRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiBwcmVzZW50ZWRBZnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50ZWRBZnRlcihTdHJpbmcgbmV3UHJlc2VudGVkQWZ0ZXIpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRlZEFmdGVyID0gcHJlc2VudGVkQWZ0ZXI7Ci0JCXByZXNlbnRlZEFmdGVyID0gbmV3UHJlc2VudGVkQWZ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUiwgb2xkUHJlc2VudGVkQWZ0ZXIsIHByZXNlbnRlZEFmdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiBwcmVzZW50ZWRCZWZvcmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlc2VudGVkQmVmb3JlKFN0cmluZyBuZXdQcmVzZW50ZWRCZWZvcmUpIHsKLQkJU3RyaW5nIG9sZFByZXNlbnRlZEJlZm9yZSA9IHByZXNlbnRlZEJlZm9yZTsKLQkJcHJlc2VudGVkQmVmb3JlID0gbmV3UHJlc2VudGVkQmVmb3JlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQkVGT1JFLCBvbGRQcmVzZW50ZWRCZWZvcmUsIHByZXNlbnRlZEJlZm9yZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYW5uaW5nRGF0YShTdHJpbmcgbmV3UGxhbm5pbmdEYXRhKSB7Ci0JCVN0cmluZyBvbGRQbGFubmluZ0RhdGEgPSBwbGFubmluZ0RhdGE7Ci0JCXBsYW5uaW5nRGF0YSA9IG5ld1BsYW5uaW5nRGF0YTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUExBTk5JTkdfREFUQSwgb2xkUGxhbm5pbmdEYXRhLCBwbGFubmluZ0RhdGEpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1cGVyQWN0aXZpdHkoKSB7Ci0JCXJldHVybiBzdXBlckFjdGl2aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN1cGVyQWN0aXZpdHkoU3RyaW5nIG5ld1N1cGVyQWN0aXZpdHkpIHsKLQkJU3RyaW5nIG9sZFN1cGVyQWN0aXZpdHkgPSBzdXBlckFjdGl2aXR5OwotCQlzdXBlckFjdGl2aXR5ID0gbmV3U3VwZXJBY3Rpdml0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFksIG9sZFN1cGVyQWN0aXZpdHksIHN1cGVyQWN0aXZpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEpOwotCQl9Ci0JCXJldHVybiBncm91cDE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbmNlcHQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQlJFQUtET1dOX0VMRU1FTlRfX0VYQU1QTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEd1aWRlbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXaGl0ZXBhcGVyKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoYm9vbGVhbiBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzKSB7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXMgPSBuZXdIYXNNdWx0aXBsZU9jY3VycmVuY2VzOwotCQlib29sZWFuIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQ7Ci0JCWhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTLCBvbGRIYXNNdWx0aXBsZU9jY3VycmVuY2VzLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzLCAhb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IGhhc011bHRpcGxlT2NjdXJyZW5jZXM7Ci0JCWJvb2xlYW4gb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyA9IEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVDsKLQkJaGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMsIG9sZEhhc011bHRpcGxlT2NjdXJyZW5jZXMsIEhBU19NVUxUSVBMRV9PQ0NVUlJFTkNFU19FREVGQVVMVCwgb2xkSGFzTXVsdGlwbGVPY2N1cnJlbmNlc0VTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKSB7Ci0JCXJldHVybiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBpc09wdGlvbmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzT3B0aW9uYWwoYm9vbGVhbiBuZXdJc09wdGlvbmFsKSB7Ci0JCWJvb2xlYW4gb2xkSXNPcHRpb25hbCA9IGlzT3B0aW9uYWw7Ci0JCWlzT3B0aW9uYWwgPSBuZXdJc09wdGlvbmFsOwotCQlib29sZWFuIG9sZElzT3B0aW9uYWxFU2V0ID0gaXNPcHRpb25hbEVTZXQ7Ci0JCWlzT3B0aW9uYWxFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsIGlzT3B0aW9uYWwsICFvbGRJc09wdGlvbmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNPcHRpb25hbCgpIHsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQkJYm9vbGVhbiBvbGRJc09wdGlvbmFsRVNldCA9IGlzT3B0aW9uYWxFU2V0OwotCQlpc09wdGlvbmFsID0gSVNfT1BUSU9OQUxfRURFRkFVTFQ7Ci0JCWlzT3B0aW9uYWxFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUwsIG9sZElzT3B0aW9uYWwsIElTX09QVElPTkFMX0VERUZBVUxULCBvbGRJc09wdGlvbmFsRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNQbGFubmVkKCkgewotCQlyZXR1cm4gaXNQbGFubmVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUGxhbm5lZChib29sZWFuIG5ld0lzUGxhbm5lZCkgewotCQlib29sZWFuIG9sZElzUGxhbm5lZCA9IGlzUGxhbm5lZDsKLQkJaXNQbGFubmVkID0gbmV3SXNQbGFubmVkOwotCQlib29sZWFuIG9sZElzUGxhbm5lZEVTZXQgPSBpc1BsYW5uZWRFU2V0OwotCQlpc1BsYW5uZWRFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLCBpc1BsYW5uZWQsICFvbGRJc1BsYW5uZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1BsYW5uZWQoKSB7Ci0JCWJvb2xlYW4gb2xkSXNQbGFubmVkID0gaXNQbGFubmVkOwotCQlib29sZWFuIG9sZElzUGxhbm5lZEVTZXQgPSBpc1BsYW5uZWRFU2V0OwotCQlpc1BsYW5uZWQgPSBJU19QTEFOTkVEX0VERUZBVUxUOwotCQlpc1BsYW5uZWRFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRCwgb2xkSXNQbGFubmVkLCBJU19QTEFOTkVEX0VERUZBVUxULCBvbGRJc1BsYW5uZWRFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc1BsYW5uZWQoKSB7Ci0JCXJldHVybiBpc1BsYW5uZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgbmV3UHJlZml4KSB7Ci0JCVN0cmluZyBvbGRQcmVmaXggPSBwcmVmaXg7Ci0JCXByZWZpeCA9IG5ld1ByZWZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYLCBvbGRQcmVmaXgsIHByZWZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVTRU5URURfQUZURVI6Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEFmdGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRlZEJlZm9yZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJCXJldHVybiBnZXRQbGFubmluZ0RhdGEoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFk6Ci0JCQkJcmV0dXJuIGdldFN1cGVyQWN0aXZpdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiBnZXRDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlyZXR1cm4gZ2V0Q29uY2VwdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gZ2V0R3VpZGVsaW5lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCXJldHVybiBnZXRSZXVzYWJsZUFzc2V0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiBnZXRXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0hBU19NVUxUSVBMRV9PQ0NVUlJFTkNFUzoKLQkJCQlyZXR1cm4gaXNIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlyZXR1cm4gaXNJc09wdGlvbmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXJldHVybiBpc0lzUGxhbm5lZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFRklYOgotCQkJCXJldHVybiBnZXRQcmVmaXgoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXNldFByZXNlbnRlZEFmdGVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlzZXRQcmVzZW50ZWRCZWZvcmUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJCXNldFBsYW5uaW5nRGF0YSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXNldFN1cGVyQWN0aXZpdHkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCWdldENoZWNrbGlzdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29uY2VwdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCWdldEV4YW1wbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUOgotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5jbGVhcigpOwotCQkJCWdldFJldXNhYmxlQXNzZXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCWdldFdoaXRlcGFwZXIoKS5jbGVhcigpOwotCQkJCWdldFdoaXRlcGFwZXIoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJCXNldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQlzZXRJc09wdGlvbmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfUExBTk5FRDoKLQkJCQlzZXRJc1BsYW5uZWQoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQkJc2V0UHJlZml4KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUjoKLQkJCQlzZXRQcmVzZW50ZWRBZnRlcihQUkVTRU5URURfQUZURVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0JFRk9SRToKLQkJCQlzZXRQcmVzZW50ZWRCZWZvcmUoUFJFU0VOVEVEX0JFRk9SRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBOgotCQkJCXNldFBsYW5uaW5nRGF0YShQTEFOTklOR19EQVRBX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXNldFN1cGVyQWN0aXZpdHkoU1VQRVJfQUNUSVZJVFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCWdldEdyb3VwMSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1Q6Ci0JCQkJZ2V0Q2hlY2tsaXN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1VJREVMSU5FOgotCQkJCWdldEd1aWRlbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVI6Ci0JCQkJZ2V0V2hpdGVwYXBlcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVM6Ci0JCQkJdW5zZXRIYXNNdWx0aXBsZU9jY3VycmVuY2VzKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTDoKLQkJCQl1bnNldElzT3B0aW9uYWwoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQ6Ci0JCQkJdW5zZXRJc1BsYW5uZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRUZJWDoKLQkJCQlzZXRQcmVmaXgoUFJFRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUFJFU0VOVEVEX0FGVEVSOgotCQkJCXJldHVybiBQUkVTRU5URURfQUZURVJfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRlZEFmdGVyICE9IG51bGwgOiAhUFJFU0VOVEVEX0FGVEVSX0VERUZBVUxULmVxdWFscyhwcmVzZW50ZWRBZnRlcik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkU6Ci0JCQkJcmV0dXJuIFBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQgPT0gbnVsbCA/IHByZXNlbnRlZEJlZm9yZSAhPSBudWxsIDogIVBSRVNFTlRFRF9CRUZPUkVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRlZEJlZm9yZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1BMQU5OSU5HX0RBVEE6Ci0JCQkJcmV0dXJuIFBMQU5OSU5HX0RBVEFfRURFRkFVTFQgPT0gbnVsbCA/IHBsYW5uaW5nRGF0YSAhPSBudWxsIDogIVBMQU5OSU5HX0RBVEFfRURFRkFVTFQuZXF1YWxzKHBsYW5uaW5nRGF0YSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX1NVUEVSX0FDVElWSVRZOgotCQkJCXJldHVybiBTVVBFUl9BQ1RJVklUWV9FREVGQVVMVCA9PSBudWxsID8gc3VwZXJBY3Rpdml0eSAhPSBudWxsIDogIVNVUEVSX0FDVElWSVRZX0VERUZBVUxULmVxdWFscyhzdXBlckFjdGl2aXR5KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fQ0hFQ0tMSVNUOgotCQkJCXJldHVybiAhZ2V0Q2hlY2tsaXN0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUOgotCQkJCXJldHVybiAhZ2V0Q29uY2VwdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlyZXR1cm4gIWdldEV4YW1wbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlyZXR1cm4gIWdldEd1aWRlbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuICFnZXRSZXVzYWJsZUFzc2V0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19XSElURVBBUEVSOgotCQkJCXJldHVybiAhZ2V0V2hpdGVwYXBlcigpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSEFTX01VTFRJUExFX09DQ1VSUkVOQ0VTOgotCQkJCXJldHVybiBpc1NldEhhc011bHRpcGxlT2NjdXJyZW5jZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9fSVNfT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIGlzU2V0SXNPcHRpb25hbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19JU19QTEFOTkVEOgotCQkJCXJldHVybiBpc1NldElzUGxhbm5lZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVg6Ci0JCQkJcmV0dXJuIFBSRUZJWF9FREVGQVVMVCA9PSBudWxsID8gcHJlZml4ICE9IG51bGwgOiAhUFJFRklYX0VERUZBVUxULmVxdWFscyhwcmVmaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlc2VudGVkQWZ0ZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRlZEFmdGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50ZWRCZWZvcmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZXNlbnRlZEJlZm9yZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGxhbm5pbmdEYXRhOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwbGFubmluZ0RhdGEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHN1cGVyQWN0aXZpdHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN1cGVyQWN0aXZpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAxKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBoYXNNdWx0aXBsZU9jY3VycmVuY2VzOiAiKTsKLQkJaWYgKGhhc011bHRpcGxlT2NjdXJyZW5jZXNFU2V0KSByZXN1bHQuYXBwZW5kKGhhc011bHRpcGxlT2NjdXJyZW5jZXMpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc09wdGlvbmFsOiAiKTsKLQkJaWYgKGlzT3B0aW9uYWxFU2V0KSByZXN1bHQuYXBwZW5kKGlzT3B0aW9uYWwpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc1BsYW5uZWQ6ICIpOwotCQlpZiAoaXNQbGFubmVkRVNldCkgcmVzdWx0LmFwcGVuZChpc1BsYW5uZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVmaXg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0JyZWFrZG93bkVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZjYmU5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DYXBhYmlsaXR5UGF0dGVybkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ2FwYWJpbGl0eVBhdHRlcm5JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhcGFiaWxpdHkgUGF0dGVybjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENhcGFiaWxpdHlQYXR0ZXJuSW1wbCBleHRlbmRzIFByb2Nlc3NJbXBsIGltcGxlbWVudHMgQ2FwYWJpbGl0eVBhdHRlcm4gewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDYXBhYmlsaXR5UGF0dGVybkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNBUEFCSUxJVFlfUEFUVEVSTjsKLQl9Ci0KLX0gLy9DYXBhYmlsaXR5UGF0dGVybkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9DaGVja2xpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjExNTUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ2hlY2tsaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDaGVja2xpc3RJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGVja2xpc3Q8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja2xpc3RJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgQ2hlY2tsaXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hlY2tsaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ0hFQ0tMSVNUOwotCX0KLQotfSAvL0NoZWNrbGlzdEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29tcG9zaXRlUm9sZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5YTQ3Ny4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db21wb3NpdGVSb2xlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tcG9zaXRlUm9sZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wb3NpdGUgUm9sZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db21wb3NpdGVSb2xlSW1wbCNnZXRBZ2dyZWdhdGVkUm9sZSA8ZW0+QWdncmVnYXRlZCBSb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUm9sZUltcGwgZXh0ZW5kcyBSb2xlRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBDb21wb3NpdGVSb2xlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGVSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09NUE9TSVRFX1JPTEU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxSb2xlPiBnZXRBZ2dyZWdhdGVkUm9sZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT01QT1NJVEVfUk9MRV9fQUdHUkVHQVRFRF9ST0xFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFnZ3JlZ2F0ZWRSb2xlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJcmV0dXJuIGdldEFnZ3JlZ2F0ZWRSb2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09NUE9TSVRFX1JPTEVfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5jbGVhcigpOwotCQkJCWdldEFnZ3JlZ2F0ZWRSb2xlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJZ2V0QWdncmVnYXRlZFJvbGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTVBPU0lURV9ST0xFX19BR0dSRUdBVEVEX1JPTEU6Ci0JCQkJcmV0dXJuICFnZXRBZ2dyZWdhdGVkUm9sZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vQ29tcG9zaXRlUm9sZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29uY2VwdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNjdlZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25jZXB0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25jZXB0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbmNlcHQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25jZXB0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIENvbmNlcHQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb25jZXB0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OQ0VQVDsKLQl9Ci0KLX0gLy9Db25jZXB0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db25zdHJhaW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQ1MjQyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnN0cmFpbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb25zdHJhaW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db25zdHJhaW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnN0cmFpbnRJbXBsI2dldE1haW5EZXNjcmlwdGlvbiA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnN0cmFpbnRJbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBDb25zdHJhaW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYWluRGVzY3JpcHRpb24oKSA8ZW0+TWFpbiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1haW5EZXNjcmlwdGlvbiA9IE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29uc3RyYWludEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlNUUkFJTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBtYWluRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdNYWluRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZE1haW5EZXNjcmlwdGlvbiA9IG1haW5EZXNjcmlwdGlvbjsKLQkJbWFpbkRlc2NyaXB0aW9uID0gbmV3TWFpbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT04sIG9sZE1haW5EZXNjcmlwdGlvbiwgbWFpbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldE1haW5EZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVF9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXNldE1haW5EZXNjcmlwdGlvbihNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05TVFJBSU5UX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFpbkRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db25zdHJhaW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwNmM2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50Q2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgQ2F0ZWdvcnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgQ29udGVudENhdGVnb3J5IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9DQVRFR09SWTsKLQl9Ci0KLX0gLy9Db250ZW50Q2F0ZWdvcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNGFmZmIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IENhdGVnb3J5IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwjZ2V0Q29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udGVudENhdGVnb3J5UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxDb250ZW50Q2F0ZWdvcnk+IGdldENvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udGVudENhdGVnb3J5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRDYXRlZ29yeSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19DT05URU5UX0NBVEVHT1JZOgotCQkJCWdldENvbnRlbnRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudENhdGVnb3J5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWToKLQkJCQlnZXRDb250ZW50Q2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0VfX0NPTlRFTlRfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50Q2F0ZWdvcnkoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ29udGVudERlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc4MDU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbnRlbnREZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0TWFpbkRlc2NyaXB0aW9uIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnREZXNjcmlwdGlvbkltcGwjZ2V0S2V5Q29uc2lkZXJhdGlvbnMgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RGVzY3JpcHRpb25JbXBsI2dldFNlY3Rpb24gPGVtPlNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudERlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbElkIDxlbT5FeHRlcm5hbCBJZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIENvbnRlbnREZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1haW5EZXNjcmlwdGlvbigpIDxlbT5NYWluIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYWluRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSU5fREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFpbkRlc2NyaXB0aW9uKCkgPGVtPk1haW4gRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1haW5EZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYWluRGVzY3JpcHRpb24gPSBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtleUNvbnNpZGVyYXRpb25zKCkgPGVtPktleSBDb25zaWRlcmF0aW9uczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0S2V5Q29uc2lkZXJhdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLZXlDb25zaWRlcmF0aW9ucygpIDxlbT5LZXkgQ29uc2lkZXJhdGlvbnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEtleUNvbnNpZGVyYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGtleUNvbnNpZGVyYXRpb25zID0gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VjdGlvbigpIDxlbT5TZWN0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4dGVybmFsSWQoKSA8ZW0+RXh0ZXJuYWwgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4dGVybmFsSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZXJuYWxJZCA9IEVYVEVSTkFMX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnREZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBtYWluRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFpbkRlc2NyaXB0aW9uKFN0cmluZyBuZXdNYWluRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZE1haW5EZXNjcmlwdGlvbiA9IG1haW5EZXNjcmlwdGlvbjsKLQkJbWFpbkRlc2NyaXB0aW9uID0gbmV3TWFpbkRlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT04sIG9sZE1haW5EZXNjcmlwdGlvbiwgbWFpbkRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXlDb25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGtleUNvbnNpZGVyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtleUNvbnNpZGVyYXRpb25zKFN0cmluZyBuZXdLZXlDb25zaWRlcmF0aW9ucykgewotCQlTdHJpbmcgb2xkS2V5Q29uc2lkZXJhdGlvbnMgPSBrZXlDb25zaWRlcmF0aW9uczsKLQkJa2V5Q29uc2lkZXJhdGlvbnMgPSBuZXdLZXlDb25zaWRlcmF0aW9uczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMsIG9sZEtleUNvbnNpZGVyYXRpb25zLCBrZXlDb25zaWRlcmF0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTZWN0aW9uPiBnZXRTZWN0aW9uKCkgewotCQlpZiAoc2VjdGlvbiA9PSBudWxsKSB7Ci0JCQlzZWN0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFNlY3Rpb24+KFNlY3Rpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTik7Ci0JCX0KLQkJcmV0dXJuIHNlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbElkKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbElkKFN0cmluZyBuZXdFeHRlcm5hbElkKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbElkID0gZXh0ZXJuYWxJZDsKLQkJZXh0ZXJuYWxJZCA9IG5ld0V4dGVybmFsSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQsIG9sZEV4dGVybmFsSWQsIGV4dGVybmFsSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlY3Rpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWFpbkRlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fS0VZX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiBnZXRLZXlDb25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlyZXR1cm4gZ2V0RXh0ZXJuYWxJZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX01BSU5fREVTQ1JJUFRJT046Ci0JCQkJc2V0TWFpbkRlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlM6Ci0JCQkJc2V0S2V5Q29uc2lkZXJhdGlvbnMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJZ2V0U2VjdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0U2VjdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU2VjdGlvbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlzZXRFeHRlcm5hbElkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTjoKLQkJCQlzZXRNYWluRGVzY3JpcHRpb24oTUFJTl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlzZXRLZXlDb25zaWRlcmF0aW9ucyhLRVlfQ09OU0lERVJBVElPTlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19TRUNUSU9OOgotCQkJCWdldFNlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRDoKLQkJCQlzZXRFeHRlcm5hbElkKEVYVEVSTkFMX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OX19NQUlOX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBtYWluRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFNQUlOX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhtYWluRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX0tFWV9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gS0VZX0NPTlNJREVSQVRJT05TX0VERUZBVUxUID09IG51bGwgPyBrZXlDb25zaWRlcmF0aW9ucyAhPSBudWxsIDogIUtFWV9DT05TSURFUkFUSU9OU19FREVGQVVMVC5lcXVhbHMoa2V5Q29uc2lkZXJhdGlvbnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfREVTQ1JJUFRJT05fX1NFQ1RJT046Ci0JCQkJcmV0dXJuIHNlY3Rpb24gIT0gbnVsbCAmJiAhc2VjdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTl9fRVhURVJOQUxfSUQ6Ci0JCQkJcmV0dXJuIEVYVEVSTkFMX0lEX0VERUZBVUxUID09IG51bGwgPyBleHRlcm5hbElkICE9IG51bGwgOiAhRVhURVJOQUxfSURfRURFRkFVTFQuZXF1YWxzKGV4dGVybmFsSWQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWFpbkRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYWluRGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGtleUNvbnNpZGVyYXRpb25zOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChrZXlDb25zaWRlcmF0aW9ucyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXh0ZXJuYWxJZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXh0ZXJuYWxJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnREZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50RWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjBiMjQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudEVsZW1lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbnRlbnQgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0R3JvdXAxIDxlbT5Hcm91cDE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldENoZWNrbGlzdCA8ZW0+Q2hlY2tsaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRDb25jZXB0IDxlbT5Db25jZXB0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRFeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRFbGVtZW50SW1wbCNnZXRHdWlkZWxpbmUgPGVtPkd1aWRlbGluZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0UmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudEVsZW1lbnRJbXBsI2dldFN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0V2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Db250ZW50RWxlbWVudEltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEVsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIENvbnRlbnRFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDEoKSA8ZW0+R3JvdXAxPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAxOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDEoKSB7Ci0JCWlmIChncm91cDEgPT0gbnVsbCkgewotCQkJZ3JvdXAxID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAxOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0Q29uY2VwdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4YW1wbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRHdWlkZWxpbmUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJldXNhYmxlQXNzZXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMSgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DT05URU5UX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChTdHJpbmcgbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkgewotCQlTdHJpbmcgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ7Ci0JCXZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSBuZXdWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCwgb2xkVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBWYXJpYWJpbGl0eVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlKCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUgbmV3VmFyaWFiaWxpdHlUeXBlKSB7Ci0JCVZhcmlhYmlsaXR5VHlwZSBvbGRWYXJpYWJpbGl0eVR5cGUgPSB2YXJpYWJpbGl0eVR5cGU7Ci0JCXZhcmlhYmlsaXR5VHlwZSA9IG5ld1ZhcmlhYmlsaXR5VHlwZSA9PSBudWxsID8gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA6IG5ld1ZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIFZBUklBQklMSVRZX1RZUEVfRURFRkFVTFQsIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMSgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAxKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gZ2V0Q2hlY2tsaXN0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19DT05DRVBUOgotCQkJCXJldHVybiBnZXRDb25jZXB0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCXJldHVybiBnZXRFeGFtcGxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuIGdldEd1aWRlbGluZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJcmV0dXJuIGdldFJldXNhYmxlQXNzZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX1NVUFBPUlRJTkdfTUFURVJJQUw6Ci0JCQkJcmV0dXJuIGdldFN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlyZXR1cm4gZ2V0V2hpdGVwYXBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCWdldENoZWNrbGlzdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVDoKLQkJCQlnZXRDb25jZXB0KCkuY2xlYXIoKTsKLQkJCQlnZXRDb25jZXB0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19FWEFNUExFOgotCQkJCWdldEV4YW1wbGUoKS5jbGVhcigpOwotCQkJCWdldEV4YW1wbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dVSURFTElORToKLQkJCQlnZXRHdWlkZWxpbmUoKS5jbGVhcigpOwotCQkJCWdldEd1aWRlbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fUkVVU0FCTEVfQVNTRVQ6Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2FibGVBc3NldCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTDoKLQkJCQlnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKS5jbGVhcigpOwotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQlzZXRWYXJpYWJpbGl0eVR5cGUoKFZhcmlhYmlsaXR5VHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlnZXRDaGVja2xpc3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJZ2V0Q29uY2VwdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlnZXRFeGFtcGxlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJZ2V0R3VpZGVsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlnZXRSZXVzYWJsZUFzc2V0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCWdldFN1cHBvcnRpbmdNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlnZXRXaGl0ZXBhcGVyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRToKLQkJCQl1bnNldFZhcmlhYmlsaXR5VHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fR1JPVVAxOgotCQkJCXJldHVybiBncm91cDEgIT0gbnVsbCAmJiAhZ3JvdXAxLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVDoKLQkJCQlyZXR1cm4gIWdldENoZWNrbGlzdCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0VMRU1FTlRfX0NPTkNFUFQ6Ci0JCQkJcmV0dXJuICFnZXRDb25jZXB0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRToKLQkJCQlyZXR1cm4gIWdldEV4YW1wbGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19HVUlERUxJTkU6Ci0JCQkJcmV0dXJuICFnZXRHdWlkZWxpbmUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVDoKLQkJCQlyZXR1cm4gIWdldFJldXNhYmxlQXNzZXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19TVVBQT1JUSU5HX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0U3VwcG9ydGluZ01hdGVyaWFsKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUjoKLQkJCQlyZXR1cm4gIWdldFdoaXRlcGFwZXIoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXJldHVybiBWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxUID09IG51bGwgPyB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ICE9IG51bGwgOiAhVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVC5lcXVhbHModmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhcmlhYmlsaXR5VHlwZTogIik7Ci0JCWlmICh2YXJpYWJpbGl0eVR5cGVFU2V0KSByZXN1bHQuYXBwZW5kKHZhcmlhYmlsaXR5VHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Db250ZW50RWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Db250ZW50UGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDhhYmI5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0NvbnRlbnRQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29udGVudFBhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50IFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ29udGVudFBhY2thZ2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkNvbnRlbnRQYWNrYWdlSW1wbCNnZXRDb250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFBhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cyBDb250ZW50UGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50UGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNPTlRFTlRfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxDb250ZW50RWxlbWVudD4gZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb250ZW50RWxlbWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19DT05URU5UX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlnZXRDb250ZW50RWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudEVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRlbnRFbGVtZW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVDoKLQkJCQlnZXRDb250ZW50RWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfUEFDS0FHRV9fQ09OVEVOVF9FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0Q29udGVudEVsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0NvbnRlbnRQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0N1c3RvbUNhdGVnb3J5SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzY3MzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvQ3VzdG9tQ2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDdXN0b21DYXRlZ29yeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ3VzdG9tQ2F0ZWdvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkN1c3RvbSBDYXRlZ29yeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuQ3VzdG9tQ2F0ZWdvcnlJbXBsI2dldENhdGVnb3JpemVkRWxlbWVudCA8ZW0+Q2F0ZWdvcml6ZWQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5DdXN0b21DYXRlZ29yeUltcGwjZ2V0U3ViQ2F0ZWdvcnkgPGVtPlN1YiBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEN1c3RvbUNhdGVnb3J5SW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBDdXN0b21DYXRlZ29yeSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBDdXN0b21DYXRlZ29yeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENhdGVnb3JpemVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1YkNhdGVnb3J5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fQ0FURUdPUklaRURfRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19TVUJfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGdldFN1YkNhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQ6Ci0JCQkJZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuY2xlYXIoKTsKLQkJCQlnZXRDYXRlZ29yaXplZEVsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWToKLQkJCQlnZXRTdWJDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViQ2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCWdldENhdGVnb3JpemVkRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZOgotCQkJCWdldFN1YkNhdGVnb3J5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5DVVNUT01fQ0FURUdPUllfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ1VTVE9NX0NBVEVHT1JZX19DQVRFR09SSVpFRF9FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0Q2F0ZWdvcml6ZWRFbGVtZW50KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWV9fU1VCX0NBVEVHT1JZOgotCQkJCXJldHVybiAhZ2V0U3ViQ2F0ZWdvcnkoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0N1c3RvbUNhdGVnb3J5SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTNjYTU4Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyYWJsZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRFeHRlcm5hbERlc2NyaXB0aW9uIDxlbT5FeHRlcm5hbCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCNnZXRQYWNrYWdpbmdHdWlkYW5jZSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcmFibGVEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgPGVtPkV4dGVybmFsIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dGVybmFsRGVzY3JpcHRpb24gPSBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIDxlbT5QYWNrYWdpbmcgR3VpZGFuY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2luZ0d1aWRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnaW5nR3VpZGFuY2UoKSA8ZW0+UGFja2FnaW5nIEd1aWRhbmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYWNrYWdpbmdHdWlkYW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYWNrYWdpbmdHdWlkYW5jZSA9IFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUkFCTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHRlcm5hbERlc2NyaXB0aW9uKFN0cmluZyBuZXdFeHRlcm5hbERlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGRFeHRlcm5hbERlc2NyaXB0aW9uID0gZXh0ZXJuYWxEZXNjcmlwdGlvbjsKLQkJZXh0ZXJuYWxEZXNjcmlwdGlvbiA9IG5ld0V4dGVybmFsRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OLCBvbGRFeHRlcm5hbERlc2NyaXB0aW9uLCBleHRlcm5hbERlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdpbmdHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIHBhY2thZ2luZ0d1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2thZ2luZ0d1aWRhbmNlKFN0cmluZyBuZXdQYWNrYWdpbmdHdWlkYW5jZSkgewotCQlTdHJpbmcgb2xkUGFja2FnaW5nR3VpZGFuY2UgPSBwYWNrYWdpbmdHdWlkYW5jZTsKLQkJcGFja2FnaW5nR3VpZGFuY2UgPSBuZXdQYWNrYWdpbmdHdWlkYW5jZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFLCBvbGRQYWNrYWdpbmdHdWlkYW5jZSwgcGFja2FnaW5nR3VpZGFuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRFeHRlcm5hbERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRToKLQkJCQlyZXR1cm4gZ2V0UGFja2FnaW5nR3VpZGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTjoKLQkJCQlzZXRFeHRlcm5hbERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXNldFBhY2thZ2luZ0d1aWRhbmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXNldEV4dGVybmFsRGVzY3JpcHRpb24oRVhURVJOQUxfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXNldFBhY2thZ2luZ0d1aWRhbmNlKFBBQ0tBR0lOR19HVUlEQU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX0VYVEVSTkFMX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBFWFRFUk5BTF9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZXh0ZXJuYWxEZXNjcmlwdGlvbiAhPSBudWxsIDogIUVYVEVSTkFMX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9ERVNDUklQVElPTl9fUEFDS0FHSU5HX0dVSURBTkNFOgotCQkJCXJldHVybiBQQUNLQUdJTkdfR1VJREFOQ0VfRURFRkFVTFQgPT0gbnVsbCA/IHBhY2thZ2luZ0d1aWRhbmNlICE9IG51bGwgOiAhUEFDS0FHSU5HX0dVSURBTkNFX0VERUZBVUxULmVxdWFscyhwYWNrYWdpbmdHdWlkYW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHRlcm5hbERlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleHRlcm5hbERlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYWNrYWdpbmdHdWlkYW5jZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFja2FnaW5nR3VpZGFuY2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJhYmxlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2I0NTMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcmFibGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZWxpdmVyYWJsZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJhYmxlSW1wbCNnZXRHcm91cDMgPGVtPkdyb3VwMzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyYWJsZUltcGwjZ2V0RGVsaXZlcmVkV29ya1Byb2R1Y3QgPGVtPkRlbGl2ZXJlZCBXb3JrIFByb2R1Y3Q8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxpdmVyYWJsZUltcGwgZXh0ZW5kcyBXb3JrUHJvZHVjdEltcGwgaW1wbGVtZW50cyBEZWxpdmVyYWJsZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAzKCkgPGVtPkdyb3VwMzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZWxpdmVyYWJsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJBQkxFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMygpIHsKLQkJaWYgKGdyb3VwMyA9PSBudWxsKSB7Ci0JCQlncm91cDMgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMyk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19HUk9VUDM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDMoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMygpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuIGdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEVfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUOgotCQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXREZWxpdmVyZWRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX19ERUxJVkVSRURfV09SS19QUk9EVUNUOgotCQkJCWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fR1JPVVAzOgotCQkJCXJldHVybiBncm91cDMgIT0gbnVsbCAmJiAhZ3JvdXAzLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRV9fREVMSVZFUkVEX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gIWdldERlbGl2ZXJlZFdvcmtQcm9kdWN0KCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyYWJsZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZhYjU0Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRSaXNrTGV2ZWwgPGVtPlJpc2sgTGV2ZWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldEVzdGltYXRpbmdUZWNobmlxdWUgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlIDxlbT5Qcm9qZWN0IE1lbWJlciBFeHBlcnRpc2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsI2dldFR5cGVPZkNvbnRyYWN0IDxlbT5UeXBlIE9mIENvbnRyYWN0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2FsZSgpIDxlbT5TY2FsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NhbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NhbGUgPSBTQ0FMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkgPGVtPlByb2plY3QgQ2hhcmFjdGVyaXN0aWNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSaXNrTGV2ZWwoKSA8ZW0+UmlzayBMZXZlbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Umlza0xldmVsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSSVNLX0xFVkVMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJpc2tMZXZlbCgpIDxlbT5SaXNrIExldmVsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSaXNrTGV2ZWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmlza0xldmVsID0gUklTS19MRVZFTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkgPGVtPkVzdGltYXRpbmcgVGVjaG5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFc3RpbWF0aW5nVGVjaG5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGVzdGltYXRpbmdUZWNobmlxdWUgPSBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgPGVtPlByb2plY3QgTWVtYmVyIEV4cGVydGlzZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2plY3RNZW1iZXJFeHBlcnRpc2UoKSA8ZW0+UHJvamVjdCBNZW1iZXIgRXhwZXJ0aXNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3RNZW1iZXJFeHBlcnRpc2UgPSBQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZU9mQ29udHJhY3QoKSA8ZW0+VHlwZSBPZiBDb250cmFjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZU9mQ29udHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZU9mQ29udHJhY3QgPSBUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjYWxlKCkgewotCQlyZXR1cm4gc2NhbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoU3RyaW5nIG5ld1NjYWxlKSB7Ci0JCVN0cmluZyBvbGRTY2FsZSA9IHNjYWxlOwotCQlzY2FsZSA9IG5ld1NjYWxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFLCBvbGRTY2FsZSwgc2NhbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSB7Ci0JCXJldHVybiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoU3RyaW5nIG5ld1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MpIHsKLQkJU3RyaW5nIG9sZFByb2plY3RDaGFyYWN0ZXJpc3RpY3MgPSBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzOwotCQlwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzID0gbmV3UHJvamVjdENoYXJhY3RlcmlzdGljczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUywgb2xkUHJvamVjdENoYXJhY3RlcmlzdGljcywgcHJvamVjdENoYXJhY3RlcmlzdGljcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Umlza0xldmVsKCkgewotCQlyZXR1cm4gcmlza0xldmVsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJpc2tMZXZlbChTdHJpbmcgbmV3Umlza0xldmVsKSB7Ci0JCVN0cmluZyBvbGRSaXNrTGV2ZWwgPSByaXNrTGV2ZWw7Ci0JCXJpc2tMZXZlbCA9IG5ld1Jpc2tMZXZlbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMLCBvbGRSaXNrTGV2ZWwsIHJpc2tMZXZlbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpIHsKLQkJcmV0dXJuIGVzdGltYXRpbmdUZWNobmlxdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXN0aW1hdGluZ1RlY2huaXF1ZShTdHJpbmcgbmV3RXN0aW1hdGluZ1RlY2huaXF1ZSkgewotCQlTdHJpbmcgb2xkRXN0aW1hdGluZ1RlY2huaXF1ZSA9IGVzdGltYXRpbmdUZWNobmlxdWU7Ci0JCWVzdGltYXRpbmdUZWNobmlxdWUgPSBuZXdFc3RpbWF0aW5nVGVjaG5pcXVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFLCBvbGRFc3RpbWF0aW5nVGVjaG5pcXVlLCBlc3RpbWF0aW5nVGVjaG5pcXVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgewotCQlyZXR1cm4gcHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKFN0cmluZyBuZXdQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSB7Ci0JCVN0cmluZyBvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlID0gcHJvamVjdE1lbWJlckV4cGVydGlzZTsKLQkJcHJvamVjdE1lbWJlckV4cGVydGlzZSA9IG5ld1Byb2plY3RNZW1iZXJFeHBlcnRpc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9NRU1CRVJfRVhQRVJUSVNFLCBvbGRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIHR5cGVPZkNvbnRyYWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVPZkNvbnRyYWN0KFN0cmluZyBuZXdUeXBlT2ZDb250cmFjdCkgewotCQlTdHJpbmcgb2xkVHlwZU9mQ29udHJhY3QgPSB0eXBlT2ZDb250cmFjdDsKLQkJdHlwZU9mQ29udHJhY3QgPSBuZXdUeXBlT2ZDb250cmFjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNULCBvbGRUeXBlT2ZDb250cmFjdCwgdHlwZU9mQ29udHJhY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJcmV0dXJuIGdldFNjYWxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJcmV0dXJuIGdldFByb2plY3RDaGFyYWN0ZXJpc3RpY3MoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXJldHVybiBnZXRSaXNrTGV2ZWwoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19FU1RJTUFUSU5HX1RFQ0hOSVFVRToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGluZ1RlY2huaXF1ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlyZXR1cm4gZ2V0UHJvamVjdE1lbWJlckV4cGVydGlzZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1RZUEVfT0ZfQ09OVFJBQ1Q6Ci0JCQkJcmV0dXJuIGdldFR5cGVPZkNvbnRyYWN0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ0FMRToKLQkJCQlzZXRTY2FsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1M6Ci0JCQkJc2V0UHJvamVjdENoYXJhY3RlcmlzdGljcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCQlzZXRSaXNrTGV2ZWwoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXNldEVzdGltYXRpbmdUZWNobmlxdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfTUVNQkVSX0VYUEVSVElTRToKLQkJCQlzZXRQcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXNldFR5cGVPZkNvbnRyYWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fU0NBTEU6Ci0JCQkJc2V0U2NhbGUoU0NBTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX0NIQVJBQ1RFUklTVElDUzoKLQkJCQlzZXRQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKFBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUklTS19MRVZFTDoKLQkJCQlzZXRSaXNrTGV2ZWwoUklTS19MRVZFTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXNldEVzdGltYXRpbmdUZWNobmlxdWUoRVNUSU1BVElOR19URUNITklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQkJc2V0UHJvamVjdE1lbWJlckV4cGVydGlzZShQUk9KRUNUX01FTUJFUl9FWFBFUlRJU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUOgotCQkJCXNldFR5cGVPZkNvbnRyYWN0KFRZUEVfT0ZfQ09OVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFOgotCQkJCXJldHVybiBTQ0FMRV9FREVGQVVMVCA9PSBudWxsID8gc2NhbGUgIT0gbnVsbCA6ICFTQ0FMRV9FREVGQVVMVC5lcXVhbHMoc2NhbGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1BST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTOgotCQkJCXJldHVybiBQUk9KRUNUX0NIQVJBQ1RFUklTVElDU19FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdENoYXJhY3RlcmlzdGljcyAhPSBudWxsIDogIVBST0pFQ1RfQ0hBUkFDVEVSSVNUSUNTX0VERUZBVUxULmVxdWFscyhwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMOgotCQkJCXJldHVybiBSSVNLX0xFVkVMX0VERUZBVUxUID09IG51bGwgPyByaXNrTGV2ZWwgIT0gbnVsbCA6ICFSSVNLX0xFVkVMX0VERUZBVUxULmVxdWFscyhyaXNrTGV2ZWwpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX0VTVElNQVRJTkdfVEVDSE5JUVVFOgotCQkJCXJldHVybiBFU1RJTUFUSU5HX1RFQ0hOSVFVRV9FREVGQVVMVCA9PSBudWxsID8gZXN0aW1hdGluZ1RlY2huaXF1ZSAhPSBudWxsIDogIUVTVElNQVRJTkdfVEVDSE5JUVVFX0VERUZBVUxULmVxdWFscyhlc3RpbWF0aW5nVGVjaG5pcXVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0U6Ci0JCQkJcmV0dXJuIFBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVCA9PSBudWxsID8gcHJvamVjdE1lbWJlckV4cGVydGlzZSAhPSBudWxsIDogIVBST0pFQ1RfTUVNQkVSX0VYUEVSVElTRV9FREVGQVVMVC5lcXVhbHMocHJvamVjdE1lbWJlckV4cGVydGlzZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fVFlQRV9PRl9DT05UUkFDVDoKLQkJCQlyZXR1cm4gVFlQRV9PRl9DT05UUkFDVF9FREVGQVVMVCA9PSBudWxsID8gdHlwZU9mQ29udHJhY3QgIT0gbnVsbCA6ICFUWVBFX09GX0NPTlRSQUNUX0VERUZBVUxULmVxdWFscyh0eXBlT2ZDb250cmFjdCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzY2FsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NhbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb2plY3RDaGFyYWN0ZXJpc3RpY3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJpc2tMZXZlbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmlza0xldmVsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlc3RpbWF0aW5nVGVjaG5pcXVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlc3RpbWF0aW5nVGVjaG5pcXVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0eXBlT2ZDb250cmFjdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZU9mQ29udHJhY3QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZWxpdmVyeVByb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNWZmM2YuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVsaXZlcnlQcm9jZXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVsaXZlcnlQcm9jZXNzSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRlbGl2ZXJ5IFByb2Nlc3M8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVsaXZlcnlQcm9jZXNzSW1wbCNnZXRHcm91cDQgPGVtPkdyb3VwNDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZWxpdmVyeVByb2Nlc3NJbXBsI2dldENvbW11bmljYXRpb25zTWF0ZXJpYWwgPGVtPkNvbW11bmljYXRpb25zIE1hdGVyaWFsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlbGl2ZXJ5UHJvY2Vzc0ltcGwjZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwgPGVtPkVkdWNhdGlvbiBNYXRlcmlhbDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlbGl2ZXJ5UHJvY2Vzc0ltcGwgZXh0ZW5kcyBQcm9jZXNzSW1wbCBpbXBsZW1lbnRzIERlbGl2ZXJ5UHJvY2VzcyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXA0KCkgPGVtPkdyb3VwNDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwNDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVsaXZlcnlQcm9jZXNzSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVMSVZFUllfUFJPQ0VTUzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDQoKSB7Ci0JCWlmIChncm91cDQgPT0gbnVsbCkgewotCQkJZ3JvdXA0ID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0dST1VQNCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwNDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFZHVjYXRpb25NYXRlcmlhbCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwNCgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ERUxJVkVSWV9QUk9DRVNTX19FRFVDQVRJT05fTUFURVJJQUwpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0OgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwNCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXA0KCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTDoKLQkJCQlyZXR1cm4gZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlnZXRDb21tdW5pY2F0aW9uc01hdGVyaWFsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCWdldEVkdWNhdGlvbk1hdGVyaWFsKCkuY2xlYXIoKTsKLQkJCQlnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19HUk9VUDQ6Ci0JCQkJZ2V0R3JvdXA0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fQ09NTVVOSUNBVElPTlNfTUFURVJJQUw6Ci0JCQkJZ2V0Q29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTDoKLQkJCQlnZXRFZHVjYXRpb25NYXRlcmlhbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0OgotCQkJCXJldHVybiBncm91cDQgIT0gbnVsbCAmJiAhZ3JvdXA0LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX19DT01NVU5JQ0FUSU9OU19NQVRFUklBTDoKLQkJCQlyZXR1cm4gIWdldENvbW11bmljYXRpb25zTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19fRURVQ0FUSU9OX01BVEVSSUFMOgotCQkJCXJldHVybiAhZ2V0RWR1Y2F0aW9uTWF0ZXJpYWwoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwNCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RlbGl2ZXJ5UHJvY2Vzc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmliYWJsZUVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzcwYzAuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpYmFibGVFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmliYWJsZSBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjZ2V0UHJlc2VudGF0aW9uIDxlbT5QcmVzZW50YXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGVzY3JpYmFibGVFbGVtZW50SW1wbCNnZXRGdWxmaWxsIDxlbT5GdWxmaWxsPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRlc2NyaWJhYmxlRWxlbWVudEltcGwjaXNJc0Fic3RyYWN0IDxlbT5JcyBBYnN0cmFjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldE5vZGVpY29uIDxlbT5Ob2RlaWNvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmliYWJsZUVsZW1lbnRJbXBsI2dldFNoYXBlaWNvbiA8ZW0+U2hhcGVpY29uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBleHRlbmRzIE1ldGhvZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRGVzY3JpYmFibGVFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb24oKSA8ZW0+UHJlc2VudGF0aW9uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDb250ZW50RGVzY3JpcHRpb24gcHJlc2VudGF0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RnVsZmlsbCgpIDxlbT5GdWxmaWxsPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZ1bGZpbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGZ1bGZpbGw7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19BQlNUUkFDVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc0Fic3RyYWN0KCkgPGVtPklzIEFic3RyYWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzQWJzdHJhY3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3QgPSBJU19BQlNUUkFDVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgQWJzdHJhY3QgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3RFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vZGVpY29uKCkgPGVtPk5vZGVpY29uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb2RlaWNvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9kZWljb24oKSA8ZW0+Tm9kZWljb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5vZGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5vZGVpY29uID0gTk9ERUlDT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFQRUlDT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcGVpY29uKCkgPGVtPlNoYXBlaWNvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcGVpY29uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNoYXBlaWNvbiA9IFNIQVBFSUNPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmliYWJsZUVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ERVNDUklCQUJMRV9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gZ2V0UHJlc2VudGF0aW9uKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZXNlbnRhdGlvbihDb250ZW50RGVzY3JpcHRpb24gbmV3UHJlc2VudGF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCUNvbnRlbnREZXNjcmlwdGlvbiBvbGRQcmVzZW50YXRpb24gPSBwcmVzZW50YXRpb247Ci0JCXByZXNlbnRhdGlvbiA9IG5ld1ByZXNlbnRhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG9sZFByZXNlbnRhdGlvbiwgbmV3UHJlc2VudGF0aW9uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb24oQ29udGVudERlc2NyaXB0aW9uIG5ld1ByZXNlbnRhdGlvbikgewotCQlpZiAobmV3UHJlc2VudGF0aW9uICE9IHByZXNlbnRhdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlc2VudGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZXNlbnRhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVzZW50YXRpb24gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlc2VudGF0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlc2VudGF0aW9uKG5ld1ByZXNlbnRhdGlvbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTiwgbmV3UHJlc2VudGF0aW9uLCBuZXdQcmVzZW50YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRGdWxmaWxsKCkgewotCQlpZiAoZnVsZmlsbCA9PSBudWxsKSB7Ci0JCQlmdWxmaWxsID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEwpOwotCQl9Ci0JCXJldHVybiBmdWxmaWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNBYnN0cmFjdChib29sZWFuIG5ld0lzQWJzdHJhY3QpIHsKLQkJYm9vbGVhbiBvbGRJc0Fic3RyYWN0ID0gaXNBYnN0cmFjdDsKLQkJaXNBYnN0cmFjdCA9IG5ld0lzQWJzdHJhY3Q7Ci0JCWJvb2xlYW4gb2xkSXNBYnN0cmFjdEVTZXQgPSBpc0Fic3RyYWN0RVNldDsKLQkJaXNBYnN0cmFjdEVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNULCBvbGRJc0Fic3RyYWN0LCBpc0Fic3RyYWN0LCAhb2xkSXNBYnN0cmFjdEVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzQWJzdHJhY3QoKSB7Ci0JCWJvb2xlYW4gb2xkSXNBYnN0cmFjdCA9IGlzQWJzdHJhY3Q7Ci0JCWJvb2xlYW4gb2xkSXNBYnN0cmFjdEVTZXQgPSBpc0Fic3RyYWN0RVNldDsKLQkJaXNBYnN0cmFjdCA9IElTX0FCU1RSQUNUX0VERUZBVUxUOwotCQlpc0Fic3RyYWN0RVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1QsIG9sZElzQWJzdHJhY3QsIElTX0FCU1RSQUNUX0VERUZBVUxULCBvbGRJc0Fic3RyYWN0RVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIGlzQWJzdHJhY3RFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZWljb24oKSB7Ci0JCXJldHVybiBub2RlaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlaWNvbihTdHJpbmcgbmV3Tm9kZWljb24pIHsKLQkJU3RyaW5nIG9sZE5vZGVpY29uID0gbm9kZWljb247Ci0JCW5vZGVpY29uID0gbmV3Tm9kZWljb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT04sIG9sZE5vZGVpY29uLCBub2RlaWNvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGVpY29uKCkgewotCQlyZXR1cm4gc2hhcGVpY29uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoYXBlaWNvbihTdHJpbmcgbmV3U2hhcGVpY29uKSB7Ci0JCVN0cmluZyBvbGRTaGFwZWljb24gPSBzaGFwZWljb247Ci0JCXNoYXBlaWNvbiA9IG5ld1NoYXBlaWNvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04sIG9sZFNoYXBlaWNvbiwgc2hhcGVpY29uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1BSRVNFTlRBVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVzZW50YXRpb24obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIGdldFByZXNlbnRhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw6Ci0JCQkJcmV0dXJuIGdldEZ1bGZpbGwoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVDoKLQkJCQlyZXR1cm4gaXNJc0Fic3RyYWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXJldHVybiBnZXROb2RlaWNvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlyZXR1cm4gZ2V0U2hhcGVpY29uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fUFJFU0VOVEFUSU9OOgotCQkJCXNldFByZXNlbnRhdGlvbigoQ29udGVudERlc2NyaXB0aW9uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTDoKLQkJCQlnZXRGdWxmaWxsKCkuY2xlYXIoKTsKLQkJCQlnZXRGdWxmaWxsKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJc2V0SXNBYnN0cmFjdCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fTk9ERUlDT046Ci0JCQkJc2V0Tm9kZWljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlzZXRTaGFwZWljb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJc2V0UHJlc2VudGF0aW9uKChDb250ZW50RGVzY3JpcHRpb24pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw6Ci0JCQkJZ2V0RnVsZmlsbCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0lTX0FCU1RSQUNUOgotCQkJCXVuc2V0SXNBYnN0cmFjdCgpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTjoKLQkJCQlzZXROb2RlaWNvbihOT0RFSUNPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlzZXRTaGFwZWljb24oU0hBUEVJQ09OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT046Ci0JCQkJcmV0dXJuIHByZXNlbnRhdGlvbiAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX0ZVTEZJTEw6Ci0JCQkJcmV0dXJuIGZ1bGZpbGwgIT0gbnVsbCAmJiAhZnVsZmlsbC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVF9fSVNfQUJTVFJBQ1Q6Ci0JCQkJcmV0dXJuIGlzU2V0SXNBYnN0cmFjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX05PREVJQ09OOgotCQkJCXJldHVybiBOT0RFSUNPTl9FREVGQVVMVCA9PSBudWxsID8gbm9kZWljb24gIT0gbnVsbCA6ICFOT0RFSUNPTl9FREVGQVVMVC5lcXVhbHMobm9kZWljb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSUJBQkxFX0VMRU1FTlRfX1NIQVBFSUNPTjoKLQkJCQlyZXR1cm4gU0hBUEVJQ09OX0VERUZBVUxUID09IG51bGwgPyBzaGFwZWljb24gIT0gbnVsbCA6ICFTSEFQRUlDT05fRURFRkFVTFQuZXF1YWxzKHNoYXBlaWNvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmdWxmaWxsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmdWxmaWxsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpc0Fic3RyYWN0OiAiKTsKLQkJaWYgKGlzQWJzdHJhY3RFU2V0KSByZXN1bHQuYXBwZW5kKGlzQWJzdHJhY3QpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub2RlaWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9kZWljb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNoYXBlaWNvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2hhcGVpY29uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpYmFibGVFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1ZTgzMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9yRGVzY3JpcHRpb25JbXBsI2dldFJlZmluZWREZXNjcmlwdGlvbiA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgRGVzY3JpcHRvckRlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkgPGVtPlJlZmluZWQgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmluZWREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGSU5FRF9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZpbmVkRGVzY3JpcHRpb24oKSA8ZW0+UmVmaW5lZCBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmluZWREZXNjcmlwdGlvbiA9IFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRvckRlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUl9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmluZWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJlZmluZWREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZpbmVkRGVzY3JpcHRpb24oU3RyaW5nIG5ld1JlZmluZWREZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkUmVmaW5lZERlc2NyaXB0aW9uID0gcmVmaW5lZERlc2NyaXB0aW9uOwotCQlyZWZpbmVkRGVzY3JpcHRpb24gPSBuZXdSZWZpbmVkRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTiwgb2xkUmVmaW5lZERlc2NyaXB0aW9uLCByZWZpbmVkRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTl9fUkVGSU5FRF9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0UmVmaW5lZERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OOgotCQkJCXNldFJlZmluZWREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJc2V0UmVmaW5lZERlc2NyaXB0aW9uKFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfREVTQ1JJUFRJT05fX1JFRklORURfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIFJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHJlZmluZWREZXNjcmlwdGlvbiAhPSBudWxsIDogIVJFRklORURfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWZpbmVkRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlZmluZWREZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0Rlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNDcyOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EZXNjcmlwdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRvckltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EZXNjcmlwdG9ySW1wbCNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSA8ZW0+SXMgU3luY2hyb25pemVkIFdpdGggU291cmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvckltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIERlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIDxlbT5JcyBTeW5jaHJvbml6ZWQgV2l0aCBTb3VyY2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoYm9vbGVhbiBuZXdJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSwgIW9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQlzZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX19JU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U6ICIpOwotCQlpZiAoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkgcmVzdWx0LmFwcGVuZChpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGVzY3JpcHRvckltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lR3JvdXBpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkODg1YTguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzY2lwbGluZUdyb3VwaW5nSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lR3JvdXBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUdyb3VwaW5nSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5EaXNjaXBsaW5lR3JvdXBpbmdJbXBsI2dldERpc2NpcGxpbmUgPGVtPkRpc2NpcGxpbmU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmVHcm91cGluZyB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX0dST1VQSU5HOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldERpc2NpcGxpbmUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9HUk9VUElOR19fRElTQ0lQTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuIGdldERpc2NpcGxpbmUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FOgotCQkJCWdldERpc2NpcGxpbmUoKS5jbGVhcigpOwotCQkJCWdldERpc2NpcGxpbmUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkU6Ci0JCQkJZ2V0RGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HX19ESVNDSVBMSU5FOgotCQkJCXJldHVybiAhZ2V0RGlzY2lwbGluZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUdyb3VwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9EaXNjaXBsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODMxNjg1Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0Rpc2NpcGxpbmVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEaXNjaXBsaW5lSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNjaXBsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRpc2NpcGxpbmVJbXBsI2dldFRhc2sgPGVtPlRhc2s8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0U3ViRGlzY2lwbGluZSA8ZW0+U3ViIERpc2NpcGxpbmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRGlzY2lwbGluZUltcGwjZ2V0UmVmZXJlbmNlV29ya2Zsb3cgPGVtPlJlZmVyZW5jZSBXb3JrZmxvdzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc2NpcGxpbmVJbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERpc2NpcGxpbmUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzY2lwbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkRJU0NJUExJTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0VGFzaygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19UQVNLKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8RGlzY2lwbGluZT4gZ2V0U3ViRGlzY2lwbGluZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlV29ya2Zsb3coKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN1YkRpc2NpcGxpbmUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLOgotCQkJCXJldHVybiBnZXRUYXNrKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJcmV0dXJuIGdldFN1YkRpc2NpcGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZVdvcmtmbG93KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fVEFTSzoKLQkJCQlnZXRUYXNrKCkuY2xlYXIoKTsKLQkJCQlnZXRUYXNrKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkU6Ci0JCQkJZ2V0U3ViRGlzY2lwbGluZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViRGlzY2lwbGluZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGlzY2lwbGluZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJZ2V0UmVmZXJlbmNlV29ya2Zsb3coKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZVdvcmtmbG93KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19UQVNLOgotCQkJCWdldFRhc2soKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19TVUJfRElTQ0lQTElORToKLQkJCQlnZXRTdWJEaXNjaXBsaW5lKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9fUkVGRVJFTkNFX1dPUktGTE9XOgotCQkJCWdldFJlZmVyZW5jZVdvcmtmbG93KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1RBU0s6Ci0JCQkJcmV0dXJuICFnZXRUYXNrKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkVfX1NVQl9ESVNDSVBMSU5FOgotCQkJCXJldHVybiAhZ2V0U3ViRGlzY2lwbGluZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX19SRUZFUkVOQ0VfV09SS0ZMT1c6Ci0JCQkJcmV0dXJuICFnZXRSZWZlcmVuY2VXb3JrZmxvdygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRGlzY2lwbGluZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb2N1bWVudFJvb3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NjIxYjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRG9jdW1lbnRSb290SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRG9jdW1lbnRSb290SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZUVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Eb2N1bWVudCBSb290PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWl4ZWQgPGVtPk1peGVkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0WE1MTlNQcmVmaXhNYXAgPGVtPlhNTE5TIFByZWZpeCBNYXA8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRYU0lTY2hlbWFMb2NhdGlvbiA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Eb2N1bWVudFJvb3RJbXBsI2dldE1ldGhvZENvbmZpZ3VyYXRpb24gPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvY3VtZW50Um9vdEltcGwjZ2V0TWV0aG9kTGlicmFyeSA8ZW0+TWV0aG9kIExpYnJhcnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9jdW1lbnRSb290SW1wbCNnZXRNZXRob2RQbHVnaW4gPGVtPk1ldGhvZCBQbHVnaW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJvb3RJbXBsIGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMgRG9jdW1lbnRSb290IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaXhlZCgpIDxlbT5NaXhlZDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNaXhlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgbWl4ZWQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRYTUxOU1ByZWZpeE1hcCgpIDxlbT5YTUxOUyBQcmVmaXggTWFwPC9lbT59JyBtYXAuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRYTUxOU1ByZWZpeE1hcCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVNYXA8U3RyaW5nLCBTdHJpbmc+IHhNTE5TUHJlZml4TWFwOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSA8ZW0+WFNJIFNjaGVtYSBMb2NhdGlvbjwvZW0+fScgbWFwLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0WFNJU2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTWFwPFN0cmluZywgU3RyaW5nPiB4U0lTY2hlbWFMb2NhdGlvbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFJvb3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldE1peGVkKCkgewotCQlpZiAobWl4ZWQgPT0gbnVsbCkgewotCQkJbWl4ZWQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUlYRUQpOwotCQl9Ci0JCXJldHVybiBtaXhlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WE1MTlNQcmVmaXhNYXAoKSB7Ci0JCWlmICh4TUxOU1ByZWZpeE1hcCA9PSBudWxsKSB7Ci0JCQl4TUxOU1ByZWZpeE1hcCA9IG5ldyBFY29yZUVNYXA8U3RyaW5nLFN0cmluZz4oRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQl9Ci0JCXJldHVybiB4TUxOU1ByZWZpeE1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKSB7Ci0JCWlmICh4U0lTY2hlbWFMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQl4U0lTY2hlbWFMb2NhdGlvbiA9IG5ldyBFY29yZUVNYXA8U3RyaW5nLFN0cmluZz4oRWNvcmVQYWNrYWdlLkxpdGVyYWxzLkVTVFJJTkdfVE9fU1RSSU5HX01BUF9FTlRSWSwgRVN0cmluZ1RvU3RyaW5nTWFwRW50cnlJbXBsLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT04pOwotCQl9Ci0JCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kQ29uZmlndXJhdGlvbiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pZ2V0TWl4ZWQoKS5nZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RDb25maWd1cmF0aW9uIG5ld01ldGhvZENvbmZpZ3VyYXRpb24sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OLCBuZXdNZXRob2RDb25maWd1cmF0aW9uLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gbmV3TWV0aG9kQ29uZmlndXJhdGlvbikgewotCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuc2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT04sIG5ld01ldGhvZENvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldE1ldGhvZExpYnJhcnkoKSB7Ci0JCXJldHVybiAoTWV0aG9kTGlicmFyeSlnZXRNaXhlZCgpLmdldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbmV3TWV0aG9kTGlicmFyeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLmJhc2ljQWRkKFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlksIG5ld01ldGhvZExpYnJhcnksIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZExpYnJhcnkoTWV0aG9kTGlicmFyeSBuZXdNZXRob2RMaWJyYXJ5KSB7Ci0JCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQoVW1hUGFja2FnZS5MaXRlcmFscy5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSwgbmV3TWV0aG9kTGlicmFyeSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFBsdWdpbiBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoTWV0aG9kUGx1Z2luKWdldE1peGVkKCkuZ2V0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTiwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBuZXdNZXRob2RQbHVnaW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5iYXNpY0FkZChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4sIG5ld01ldGhvZFBsdWdpbiwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kUGx1Z2luKE1ldGhvZFBsdWdpbiBuZXdNZXRob2RQbHVnaW4pIHsKLQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldE1peGVkKCkpLnNldChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9QTFVHSU4sIG5ld01ldGhvZFBsdWdpbik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWl4ZWQoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRYTUxOU1ByZWZpeE1hcCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNZXRob2RDb25maWd1cmF0aW9uKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXJldHVybiBiYXNpY1NldE1ldGhvZExpYnJhcnkobnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNZXRob2RQbHVnaW4obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRNaXhlZCgpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0TWl4ZWQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0WE1MTlNQcmVmaXhNYXAoKTsKLQkJCQllbHNlIHJldHVybiBnZXRYTUxOU1ByZWZpeE1hcCgpLm1hcCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hTSV9TQ0hFTUFfTE9DQVRJT046Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0WFNJU2NoZW1hTG9jYXRpb24oKTsKLQkJCQllbHNlIHJldHVybiBnZXRYU0lTY2hlbWFMb2NhdGlvbigpLm1hcCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZExpYnJhcnkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW4oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01JWEVEOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRNaXhlZCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YTUxOU19QUkVGSVhfTUFQOgotCQkJCSgoRVN0cnVjdHVyYWxGZWF0dXJlLlNldHRpbmcpZ2V0WE1MTlNQcmVmaXhNYXAoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTjoKLQkJCQkoKEVTdHJ1Y3R1cmFsRmVhdHVyZS5TZXR0aW5nKWdldFhTSVNjaGVtYUxvY2F0aW9uKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXNldE1ldGhvZENvbmZpZ3VyYXRpb24oKE1ldGhvZENvbmZpZ3VyYXRpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWToKLQkJCQlzZXRNZXRob2RMaWJyYXJ5KChNZXRob2RMaWJyYXJ5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlzZXRNZXRob2RQbHVnaW4oKE1ldGhvZFBsdWdpbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlnZXRNaXhlZCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJZ2V0WE1MTlNQcmVmaXhNYXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCWdldFhTSVNjaGVtYUxvY2F0aW9uKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJc2V0TWV0aG9kQ29uZmlndXJhdGlvbigoTWV0aG9kQ29uZmlndXJhdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0xJQlJBUlk6Ci0JCQkJc2V0TWV0aG9kTGlicmFyeSgoTWV0aG9kTGlicmFyeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX1BMVUdJTjoKLQkJCQlzZXRNZXRob2RQbHVnaW4oKE1ldGhvZFBsdWdpbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NSVhFRDoKLQkJCQlyZXR1cm4gbWl4ZWQgIT0gbnVsbCAmJiAhbWl4ZWQuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVA6Ci0JCQkJcmV0dXJuIHhNTE5TUHJlZml4TWFwICE9IG51bGwgJiYgIXhNTE5TUHJlZml4TWFwLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19YU0lfU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXJldHVybiB4U0lTY2hlbWFMb2NhdGlvbiAhPSBudWxsICYmICF4U0lTY2hlbWFMb2NhdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVF9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPQ1VNRU5UX1JPT1RfX01FVEhPRF9MSUJSQVJZOgotCQkJCXJldHVybiBnZXRNZXRob2RMaWJyYXJ5KCkgIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRNZXRob2RQbHVnaW4oKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobWl4ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1peGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vRG9jdW1lbnRSb290SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0RvbWFpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjZjY1Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Eb21haW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEb21haW5JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RG9tYWluPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRG9tYWluSW1wbCNnZXRXb3JrUHJvZHVjdCA8ZW0+V29yayBQcm9kdWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkRvbWFpbkltcGwjZ2V0U3ViZG9tYWluIDxlbT5TdWJkb21haW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEb21haW5JbXBsIGV4dGVuZHMgQ29udGVudENhdGVnb3J5SW1wbCBpbXBsZW1lbnRzIERvbWFpbiB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEb21haW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ET01BSU5fX1dPUktfUFJPRFVDVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PERvbWFpbj4gZ2V0U3ViZG9tYWluKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLkRPTUFJTl9fU1VCRE9NQUlOKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3ViZG9tYWluKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gZ2V0V29ya1Byb2R1Y3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlyZXR1cm4gZ2V0U3ViZG9tYWluKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1NVQkRPTUFJTjoKLQkJCQlnZXRTdWJkb21haW4oKS5jbGVhcigpOwotCQkJCWdldFN1YmRvbWFpbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRG9tYWluPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ET01BSU5fX1dPUktfUFJPRFVDVDoKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fU1VCRE9NQUlOOgotCQkJCWdldFN1YmRvbWFpbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiAhZ2V0V29ya1Byb2R1Y3QoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOX19TVUJET01BSU46Ci0JCQkJcmV0dXJuICFnZXRTdWJkb21haW4oKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0RvbWFpbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzOGIzNS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uaW1wbC5FRGF0YU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsIGV4dGVuZHMgRURhdGFPYmplY3RJbXBsIGltcGxlbWVudHMgRWxlbWVudCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FTEVNRU5UOwotCX0KLQotfSAvL0VsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyZWI4ZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuRXN0aW1hdGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkVzdGltYXRlSW1wbCNnZXRFc3RpbWF0aW9uTWV0cmljIDxlbT5Fc3RpbWF0aW9uIE1ldHJpYzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Fc3RpbWF0ZUltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXN0aW1hdGUgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXN0aW1hdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbk1ldHJpYygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCXJldHVybiBnZXRFc3RpbWF0aW9uTWV0cmljKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9NRVRSSUM6Ci0JCQkJZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbk1ldHJpYygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fTUVUUklDOgotCQkJCWdldEVzdGltYXRpb25NZXRyaWMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFURV9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQzoKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRpb25NZXRyaWMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEVfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0VzdGltYXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW5nTWV0cmljSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTdjYWNjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0VzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVzdGltYXRpbmdNZXRyaWNJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXN0aW1hdGluZyBNZXRyaWM8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFc3RpbWF0aW5nTWV0cmljSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEVzdGltYXRpbmdNZXRyaWMgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFc3RpbWF0aW5nTWV0cmljSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuRVNUSU1BVElOR19NRVRSSUM7Ci0JfQotCi19IC8vRXN0aW1hdGluZ01ldHJpY0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzhlMjUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVzdGltYXRpb25Db25zaWRlcmF0aW9uc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM7Ci0JfQotCi19IC8vRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9FeGFtcGxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjlmNTBkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0V4YW1wbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEV4YW1wbGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXhhbXBsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEV4YW1wbGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgRXhhbXBsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEV4YW1wbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5FWEFNUExFOwotCX0KLQotfSAvL0V4YW1wbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NWQ2NzguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEd1aWRhbmNlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkd1aWRhbmNlIERlc2NyaXB0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLkd1aWRhbmNlRGVzY3JpcHRpb25JbXBsI2dldEF0dGFjaG1lbnQgPGVtPkF0dGFjaG1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBHdWlkYW5jZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0YWNobWVudCgpIDxlbT5BdHRhY2htZW50PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRhY2htZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRBQ0hNRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dGFjaG1lbnQoKSA8ZW0+QXR0YWNobWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0YWNobWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRhY2htZW50ID0gQVRUQUNITUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBHdWlkYW5jZURlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0VfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRhY2htZW50KCkgewotCQlyZXR1cm4gYXR0YWNobWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRhY2htZW50KFN0cmluZyBuZXdBdHRhY2htZW50KSB7Ci0JCVN0cmluZyBvbGRBdHRhY2htZW50ID0gYXR0YWNobWVudDsKLQkJYXR0YWNobWVudCA9IG5ld0F0dGFjaG1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQsIG9sZEF0dGFjaG1lbnQsIGF0dGFjaG1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQ6Ci0JCQkJcmV0dXJuIGdldEF0dGFjaG1lbnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXNldEF0dGFjaG1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTl9fQVRUQUNITUVOVDoKLQkJCQlzZXRBdHRhY2htZW50KEFUVEFDSE1FTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFX0RFU0NSSVBUSU9OX19BVFRBQ0hNRU5UOgotCQkJCXJldHVybiBBVFRBQ0hNRU5UX0VERUZBVUxUID09IG51bGwgPyBhdHRhY2htZW50ICE9IG51bGwgOiAhQVRUQUNITUVOVF9FREVGQVVMVC5lcXVhbHMoYXR0YWNobWVudCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRhY2htZW50OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRhY2htZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9HdWlkYW5jZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQ0ODM5Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRhbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBHdWlkYW5jZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGFuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHdWlkYW5jZUltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBHdWlkYW5jZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRhbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuR1VJREFOQ0U7Ci0JfQotCi19IC8vR3VpZGFuY2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvR3VpZGVsaW5lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTMwOWMzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0d1aWRlbGluZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogR3VpZGVsaW5lSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3VpZGVsaW5lPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgR3VpZGVsaW5lSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIEd1aWRlbGluZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEd1aWRlbGluZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLkdVSURFTElORTsKLQl9Ci0KLX0gLy9HdWlkZWxpbmVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvSXRlcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmY5ZGRlLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0l0ZXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSXRlcmF0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SXRlcmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSXRlcmF0aW9uSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIEl0ZXJhdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLklURVJBVElPTjsKLQl9Ci0KLX0gLy9JdGVyYXRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvS2luZEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL0tpbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MTgyMDguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvS2luZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEtpbmRJbXBsLmphdmEsdiAxLjEgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVEYXRhVHlwZUVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+S2luZDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5LaW5kSW1wbCNnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBLaW5kSW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIEtpbmQgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkgPGVtPkFwcGxpY2FibGUgTWV0YSBDbGFzcyBJbmZvPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBLaW5kSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuS0lORDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJaWYgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID09IG51bGwpIHsKLQkJCWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPKTsKLQkJfQotCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJCXJldHVybiBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLktJTkRfX0FQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPOgotCQkJCWdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCkuY2xlYXIoKTsKLQkJCQlnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EX19BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzoKLQkJCQlnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86Ci0JCQkJcmV0dXJuIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvICE9IG51bGwgJiYgIWFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL0tpbmRJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjODg2Zi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RDb25maWd1cmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kQ29uZmlndXJhdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBDb25maWd1cmF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldEJhc2VDb25maWd1cmF0aW9uIDxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uIDxlbT5NZXRob2QgUGx1Z2luIFNlbGVjdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kQ29uZmlndXJhdGlvbkltcGwjZ2V0RGVmYXVsdFZpZXcgPGVtPkRlZmF1bHQgVmlldzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRQcm9jZXNzVmlldyA8ZW0+UHJvY2VzcyBWaWV3PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZENvbmZpZ3VyYXRpb25JbXBsI2dldFN1YnRyYWN0ZWRDYXRlZ29yeSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RDb25maWd1cmF0aW9uSW1wbCNnZXRBZGRlZENhdGVnb3J5IDxlbT5BZGRlZCBDYXRlZ29yeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZENvbmZpZ3VyYXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kVW5pdEltcGwgaW1wbGVtZW50cyBNZXRob2RDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNlQ29uZmlndXJhdGlvbigpIDxlbT5CYXNlIENvbmZpZ3VyYXRpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGJhc2VDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgPGVtPk1ldGhvZCBQbHVnaW4gU2VsZWN0aW9uPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIDxlbT5NZXRob2QgUGFja2FnZSBTZWxlY3Rpb248L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0VmlldygpIDxlbT5EZWZhdWx0IFZpZXc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRWaWV3KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1ZJRVdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZpZXcoKSA8ZW0+RGVmYXVsdCBWaWV3PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZWZhdWx0VmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmlldyA9IERFRkFVTFRfVklFV19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NWaWV3KCkgPGVtPlByb2Nlc3MgVmlldzwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZXNzVmlldygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gcHJvY2Vzc1ZpZXc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKSA8ZW0+U3VidHJhY3RlZCBDYXRlZ29yeTwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IHN1YnRyYWN0ZWRDYXRlZ29yeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGVkQ2F0ZWdvcnkoKSA8ZW0+QWRkZWQgQ2F0ZWdvcnk8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkZWRDYXRlZ29yeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gYWRkZWRDYXRlZ29yeTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0NPTkZJR1VSQVRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChiYXNlQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQliYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkgewotCQlpZiAobWV0aG9kUGx1Z2luU2VsZWN0aW9uID09IG51bGwpIHsKLQkJCW1ldGhvZFBsdWdpblNlbGVjdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBtZXRob2RQbHVnaW5TZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZVNlbGVjdGlvbiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWaWV3KCkgewotCQlyZXR1cm4gZGVmYXVsdFZpZXc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZpZXcoU3RyaW5nIG5ld0RlZmF1bHRWaWV3KSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VmlldyA9IGRlZmF1bHRWaWV3OwotCQlkZWZhdWx0VmlldyA9IG5ld0RlZmF1bHRWaWV3OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVcsIG9sZERlZmF1bHRWaWV3LCBkZWZhdWx0VmlldykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFByb2Nlc3NWaWV3KCkgewotCQlpZiAocHJvY2Vzc1ZpZXcgPT0gbnVsbCkgewotCQkJcHJvY2Vzc1ZpZXcgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyk7Ci0JCX0KLQkJcmV0dXJuIHByb2Nlc3NWaWV3OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJaWYgKHN1YnRyYWN0ZWRDYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQlzdWJ0cmFjdGVkQ2F0ZWdvcnkgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBzdWJ0cmFjdGVkQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QWRkZWRDYXRlZ29yeSgpIHsKLQkJaWYgKGFkZGVkQ2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJYWRkZWRDYXRlZ29yeSA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlkpOwotCQl9Ci0JCXJldHVybiBhZGRlZENhdGVnb3J5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQkFTRV9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRCYXNlQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19ERUZBVUxUX1ZJRVc6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWaWV3KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlyZXR1cm4gZ2V0UHJvY2Vzc1ZpZXcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCQlyZXR1cm4gZ2V0U3VidHJhY3RlZENhdGVnb3J5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJCXJldHVybiBnZXRBZGRlZENhdGVnb3J5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzZUNvbmZpZ3VyYXRpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BMVUdJTl9TRUxFQ1RJT046Ci0JCQkJZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXNldERlZmF1bHRWaWV3KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fUFJPQ0VTU19WSUVXOgotCQkJCWdldFByb2Nlc3NWaWV3KCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9jZXNzVmlldygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCWdldFN1YnRyYWN0ZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3VidHJhY3RlZENhdGVnb3J5KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0FEREVEX0NBVEVHT1JZOgotCQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCWdldEFkZGVkQ2F0ZWdvcnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRCYXNlQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlnZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fTUVUSE9EX1BBQ0tBR0VfU0VMRUNUSU9OOgotCQkJCWdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXNldERlZmF1bHRWaWV3KERFRkFVTFRfVklFV19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19QUk9DRVNTX1ZJRVc6Ci0JCQkJZ2V0UHJvY2Vzc1ZpZXcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fU1VCVFJBQ1RFRF9DQVRFR09SWToKLQkJCQlnZXRTdWJ0cmFjdGVkQ2F0ZWdvcnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJZ2V0QWRkZWRDYXRlZ29yeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX0JBU0VfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24gIT0gbnVsbCAmJiAhYmFzZUNvbmZpZ3VyYXRpb24uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGx1Z2luU2VsZWN0aW9uICE9IG51bGwgJiYgIW1ldGhvZFBsdWdpblNlbGVjdGlvbi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kUGFja2FnZVNlbGVjdGlvbiAhPSBudWxsICYmICFtZXRob2RQYWNrYWdlU2VsZWN0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fREVGQVVMVF9WSUVXOgotCQkJCXJldHVybiBERUZBVUxUX1ZJRVdfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWaWV3ICE9IG51bGwgOiAhREVGQVVMVF9WSUVXX0VERUZBVUxULmVxdWFscyhkZWZhdWx0Vmlldyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVzoKLQkJCQlyZXR1cm4gcHJvY2Vzc1ZpZXcgIT0gbnVsbCAmJiAhcHJvY2Vzc1ZpZXcuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OX19TVUJUUkFDVEVEX0NBVEVHT1JZOgotCQkJCXJldHVybiBzdWJ0cmFjdGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhc3VidHJhY3RlZENhdGVnb3J5LmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfQ09ORklHVVJBVElPTl9fQURERURfQ0FURUdPUlk6Ci0JCQkJcmV0dXJuIGFkZGVkQ2F0ZWdvcnkgIT0gbnVsbCAmJiAhYWRkZWRDYXRlZ29yeS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChiYXNlQ29uZmlndXJhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmFzZUNvbmZpZ3VyYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZFBsdWdpblNlbGVjdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWV0aG9kUGx1Z2luU2VsZWN0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtZXRob2RQYWNrYWdlU2VsZWN0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtZXRob2RQYWNrYWdlU2VsZWN0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0VmlldzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdFZpZXcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHByb2Nlc3NWaWV3OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcm9jZXNzVmlldyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3VidHJhY3RlZENhdGVnb3J5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzdWJ0cmFjdGVkQ2F0ZWdvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFkZGVkQ2F0ZWdvcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFkZGVkQ2F0ZWdvcnkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RDb25maWd1cmF0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTBkNDhiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZEVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIEVsZW1lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kRWxlbWVudEltcGwjZ2V0R3JvdXAgPGVtPkdyb3VwPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldE93bmVkUnVsZSA8ZW0+T3duZWQgUnVsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRNZXRob2RFbGVtZW50UHJvcGVydHkgPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldEJyaWVmRGVzY3JpcHRpb24gPGVtPkJyaWVmIERlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRJbXBsI2dldElkIDxlbT5JZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRPcmRlcmluZ0d1aWRlIDxlbT5PcmRlcmluZyBHdWlkZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNnZXRQcmVzZW50YXRpb25OYW1lIDxlbT5QcmVzZW50YXRpb24gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RFbGVtZW50SW1wbCNpc1N1cHByZXNzZWQgPGVtPlN1cHByZXNzZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRob2RFbGVtZW50SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXRob2RFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cCgpIDxlbT5Hcm91cDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpIDxlbT5CcmllZiBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QnJpZWZEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBicmllZkRlc2NyaXB0aW9uID0gQlJJRUZfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlcmluZ0d1aWRlKCkgPGVtPk9yZGVyaW5nIEd1aWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlcmluZ0d1aWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG9yZGVyaW5nR3VpZGUgPSBPUkRFUklOR19HVUlERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVzZW50YXRpb25OYW1lKCkgPGVtPlByZXNlbnRhdGlvbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVzZW50YXRpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZXNlbnRhdGlvbk5hbWUgPSBQUkVTRU5UQVRJT05fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N1cHByZXNzZWQoKSA8ZW0+U3VwcHJlc3NlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNTdXBwcmVzc2VkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1VQUFJFU1NFRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdXBwcmVzc2VkKCkgPGVtPlN1cHByZXNzZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzU3VwcHJlc3NlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3NlZCA9IFNVUFBSRVNTRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIFN1cHByZXNzZWQgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN1cHByZXNzZWRFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cCgpIHsKLQkJaWYgKGdyb3VwID09IG51bGwpIHsKLQkJCWdyb3VwID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUCk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxDb25zdHJhaW50PiBnZXRPd25lZFJ1bGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cCgpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PE1ldGhvZEVsZW1lbnRQcm9wZXJ0eT4gZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJyaWVmRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBicmllZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJyaWVmRGVzY3JpcHRpb24oU3RyaW5nIG5ld0JyaWVmRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZEJyaWVmRGVzY3JpcHRpb24gPSBicmllZkRlc2NyaXB0aW9uOwotCQlicmllZkRlc2NyaXB0aW9uID0gbmV3QnJpZWZEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04sIG9sZEJyaWVmRGVzY3JpcHRpb24sIGJyaWVmRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRCwgb2xkSWQsIGlkKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPcmRlcmluZ0d1aWRlKCkgewotCQlyZXR1cm4gb3JkZXJpbmdHdWlkZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlcmluZ0d1aWRlKFN0cmluZyBuZXdPcmRlcmluZ0d1aWRlKSB7Ci0JCVN0cmluZyBvbGRPcmRlcmluZ0d1aWRlID0gb3JkZXJpbmdHdWlkZTsKLQkJb3JkZXJpbmdHdWlkZSA9IG5ld09yZGVyaW5nR3VpZGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFLCBvbGRPcmRlcmluZ0d1aWRlLCBvcmRlcmluZ0d1aWRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVzZW50YXRpb25OYW1lKCkgewotCQlyZXR1cm4gcHJlc2VudGF0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVzZW50YXRpb25OYW1lKFN0cmluZyBuZXdQcmVzZW50YXRpb25OYW1lKSB7Ci0JCVN0cmluZyBvbGRQcmVzZW50YXRpb25OYW1lID0gcHJlc2VudGF0aW9uTmFtZTsKLQkJcHJlc2VudGF0aW9uTmFtZSA9IG5ld1ByZXNlbnRhdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FLCBvbGRQcmVzZW50YXRpb25OYW1lLCBwcmVzZW50YXRpb25OYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gc3VwcHJlc3NlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2VkKGJvb2xlYW4gbmV3U3VwcHJlc3NlZCkgewotCQlib29sZWFuIG9sZFN1cHByZXNzZWQgPSBzdXBwcmVzc2VkOwotCQlzdXBwcmVzc2VkID0gbmV3U3VwcHJlc3NlZDsKLQkJYm9vbGVhbiBvbGRTdXBwcmVzc2VkRVNldCA9IHN1cHByZXNzZWRFU2V0OwotCQlzdXBwcmVzc2VkRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQsIG9sZFN1cHByZXNzZWQsIHN1cHByZXNzZWQsICFvbGRTdXBwcmVzc2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0U3VwcHJlc3NlZCgpIHsKLQkJYm9vbGVhbiBvbGRTdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKLQkJYm9vbGVhbiBvbGRTdXBwcmVzc2VkRVNldCA9IHN1cHByZXNzZWRFU2V0OwotCQlzdXBwcmVzc2VkID0gU1VQUFJFU1NFRF9FREVGQVVMVDsKLQkJc3VwcHJlc3NlZEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VELCBvbGRTdXBwcmVzc2VkLCBTVVBQUkVTU0VEX0VERUZBVUxULCBvbGRTdXBwcmVzc2VkRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0U3VwcHJlc3NlZCgpIHsKLQkJcmV0dXJuIHN1cHByZXNzZWRFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09XTkVEX1JVTEU6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPd25lZFJ1bGUoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gZ2V0T3duZWRSdWxlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZOgotCQkJCXJldHVybiBnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldEJyaWVmRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJcmV0dXJuIGdldElkKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXJldHVybiBnZXRPcmRlcmluZ0d1aWRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXJldHVybiBnZXRQcmVzZW50YXRpb25OYW1lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJcmV0dXJuIGlzU3VwcHJlc3NlZCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCWdldE93bmVkUnVsZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3duZWRSdWxlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb25zdHJhaW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kRWxlbWVudFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19CUklFRl9ERVNDUklQVElPTjoKLQkJCQlzZXRCcmllZkRlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJc2V0SWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCQlzZXRPcmRlcmluZ0d1aWRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJc2V0UHJlc2VudGF0aW9uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1NVUFBSRVNTRUQ6Ci0JCQkJc2V0U3VwcHJlc3NlZCgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19HUk9VUDoKLQkJCQlnZXRHcm91cCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PV05FRF9SVUxFOgotCQkJCWdldE93bmVkUnVsZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWToKLQkJCQlnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT046Ci0JCQkJc2V0QnJpZWZEZXNjcmlwdGlvbihCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19JRDoKLQkJCQlzZXRJZChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19PUkRFUklOR19HVUlERToKLQkJCQlzZXRPcmRlcmluZ0d1aWRlKE9SREVSSU5HX0dVSURFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX1BSRVNFTlRBVElPTl9OQU1FOgotCQkJCXNldFByZXNlbnRhdGlvbk5hbWUoUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fU1VQUFJFU1NFRDoKLQkJCQl1bnNldFN1cHByZXNzZWQoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fR1JPVVA6Ci0JCQkJcmV0dXJuIGdyb3VwICE9IG51bGwgJiYgIWdyb3VwLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRToKLQkJCQlyZXR1cm4gIWdldE93bmVkUnVsZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6Ci0JCQkJcmV0dXJuICFnZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX0JSSUVGX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBCUklFRl9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gYnJpZWZEZXNjcmlwdGlvbiAhPSBudWxsIDogIUJSSUVGX0RFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhicmllZkRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fSUQ6Ci0JCQkJcmV0dXJuIElEX0VERUZBVUxUID09IG51bGwgPyBpZCAhPSBudWxsIDogIUlEX0VERUZBVUxULmVxdWFscyhpZCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFOgotCQkJCXJldHVybiBPUkRFUklOR19HVUlERV9FREVGQVVMVCA9PSBudWxsID8gb3JkZXJpbmdHdWlkZSAhPSBudWxsIDogIU9SREVSSU5HX0dVSURFX0VERUZBVUxULmVxdWFscyhvcmRlcmluZ0d1aWRlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIFBSRVNFTlRBVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcmVzZW50YXRpb25OYW1lICE9IG51bGwgOiAhUFJFU0VOVEFUSU9OX05BTUVfRURFRkFVTFQuZXF1YWxzKHByZXNlbnRhdGlvbk5hbWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEOgotCQkJCXJldHVybiBpc1NldFN1cHByZXNzZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYnJpZWZEZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYnJpZWZEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlcmluZ0d1aWRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmRlcmluZ0d1aWRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50YXRpb25OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVzZW50YXRpb25OYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdXBwcmVzc2VkOiAiKTsKLQkJaWYgKHN1cHByZXNzZWRFU2V0KSByZXN1bHQuYXBwZW5kKHN1cHByZXNzZWQpOyBlbHNlIHJlc3VsdC5hcHBlbmQoIjx1bnNldD4iKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTWV0aG9kRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTQwZmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFByb3BlcnR5SW1wbCBleHRlbmRzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgaW1wbGVtZW50cyBNZXRob2RFbGVtZW50UHJvcGVydHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfRUxFTUVOVF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RFbGVtZW50UHJvcGVydHlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZExpYnJhcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTViOTQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kTGlicmFyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZExpYnJhcnlJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBMaWJyYXJ5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZExpYnJhcnlJbXBsI2dldE1ldGhvZFBsdWdpbiA8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRNZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RMaWJyYXJ5SW1wbCNnZXRUb29sIDxlbT5Ub29sPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kTGlicmFyeUltcGwgZXh0ZW5kcyBNZXRob2RVbml0SW1wbCBpbXBsZW1lbnRzIE1ldGhvZExpYnJhcnkgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZFBsdWdpbigpIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZFBsdWdpbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PE1ldGhvZFBsdWdpbj4gbWV0aG9kUGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RDb25maWd1cmF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kQ29uZmlndXJhdGlvbj4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb29sKCkgPGVtPlRvb2w8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRvb2woKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9vbCgpIDxlbT5Ub29sPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUb29sKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRvb2wgPSBUT09MX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1ldGhvZExpYnJhcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfTElCUkFSWTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kUGx1Z2luPiBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCWlmIChtZXRob2RQbHVnaW4gPT0gbnVsbCkgewotCQkJbWV0aG9kUGx1Z2luID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1ldGhvZFBsdWdpbj4oTWV0aG9kUGx1Z2luLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfUExVR0lOKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGx1Z2luOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxNZXRob2RDb25maWd1cmF0aW9uPiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlpZiAobWV0aG9kQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQltZXRob2RDb25maWd1cmF0aW9uID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PE1ldGhvZENvbmZpZ3VyYXRpb24+KE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2woKSB7Ci0JCXJldHVybiB0b29sOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvb2woU3RyaW5nIG5ld1Rvb2wpIHsKLQkJU3RyaW5nIG9sZFRvb2wgPSB0b29sOwotCQl0b29sID0gbmV3VG9vbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTCwgb2xkVG9vbCwgdG9vbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZFBsdWdpbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OOgotCQkJCXJldHVybiBnZXRNZXRob2RDb25maWd1cmF0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX1RPT0w6Ci0JCQkJcmV0dXJuIGdldFRvb2woKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCWdldE1ldGhvZFBsdWdpbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTWV0aG9kUGx1Z2luPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RDb25maWd1cmF0aW9uKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RDb25maWd1cmF0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXNldFRvb2woKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fTUVUSE9EX0NPTkZJR1VSQVRJT046Ci0JCQkJZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19UT09MOgotCQkJCXNldFRvb2woVE9PTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUllfX01FVEhPRF9QTFVHSU46Ci0JCQkJcmV0dXJuIG1ldGhvZFBsdWdpbiAhPSBudWxsICYmICFtZXRob2RQbHVnaW4uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9MSUJSQVJZX19NRVRIT0RfQ09ORklHVVJBVElPTjoKLQkJCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbiAhPSBudWxsICYmICFtZXRob2RDb25maWd1cmF0aW9uLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfTElCUkFSWV9fVE9PTDoKLQkJCQlyZXR1cm4gVE9PTF9FREVGQVVMVCA9PSBudWxsID8gdG9vbCAhPSBudWxsIDogIVRPT0xfRURFRkFVTFQuZXF1YWxzKHRvb2wpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodG9vbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodG9vbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZExpYnJhcnlJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBhY2thZ2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZTE5ZGEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kUGFja2FnZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1ldGhvZFBhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NZXRob2QgUGFja2FnZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRHcm91cDEgPGVtPkdyb3VwMTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRSZXVzZWRQYWNrYWdlIDxlbT5SZXVzZWQgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNnZXRNZXRob2RQYWNrYWdlIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQYWNrYWdlSW1wbCNpc0dsb2JhbCA8ZW0+R2xvYmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGFja2FnZUltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFBhY2thZ2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMSgpIDxlbT5Hcm91cDE8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAxKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDE7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEdMT0JBTF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHbG9iYWwoKSA8ZW0+R2xvYmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0dsb2JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2xvYmFsID0gR0xPQkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBHbG9iYWwgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdsb2JhbEVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMSgpIHsKLQkJaWYgKGdyb3VwMSA9PSBudWxsKSB7Ci0JCQlncm91cDEgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSk7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXVzZWRQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAxKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PE1ldGhvZFBhY2thZ2U+IGdldE1ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDEoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpIHsKLQkJcmV0dXJuIGdsb2JhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHbG9iYWwoYm9vbGVhbiBuZXdHbG9iYWwpIHsKLQkJYm9vbGVhbiBvbGRHbG9iYWwgPSBnbG9iYWw7Ci0JCWdsb2JhbCA9IG5ld0dsb2JhbDsKLQkJYm9vbGVhbiBvbGRHbG9iYWxFU2V0ID0gZ2xvYmFsRVNldDsKLQkJZ2xvYmFsRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTCwgb2xkR2xvYmFsLCBnbG9iYWwsICFvbGRHbG9iYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRHbG9iYWwoKSB7Ci0JCWJvb2xlYW4gb2xkR2xvYmFsID0gZ2xvYmFsOwotCQlib29sZWFuIG9sZEdsb2JhbEVTZXQgPSBnbG9iYWxFU2V0OwotCQlnbG9iYWwgPSBHTE9CQUxfRURFRkFVTFQ7Ci0JCWdsb2JhbEVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUwsIG9sZEdsb2JhbCwgR0xPQkFMX0VERUZBVUxULCBvbGRHbG9iYWxFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRHbG9iYWwoKSB7Ci0JCXJldHVybiBnbG9iYWxFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR1JPVVAxOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAxKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNZXRob2RQYWNrYWdlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAxKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDEoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0UmV1c2VkUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gZ2V0TWV0aG9kUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJcmV0dXJuIGlzR2xvYmFsKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMSgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U6Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HTE9CQUw6Ci0JCQkJc2V0R2xvYmFsKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dST1VQMToKLQkJCQlnZXRHcm91cDEoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fUkVVU0VEX1BBQ0tBR0U6Ci0JCQkJZ2V0UmV1c2VkUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX0dMT0JBTDoKLQkJCQl1bnNldEdsb2JhbCgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19HUk9VUDE6Ci0JCQkJcmV0dXJuIGdyb3VwMSAhPSBudWxsICYmICFncm91cDEuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QQUNLQUdFX19SRVVTRURfUEFDS0FHRToKLQkJCQlyZXR1cm4gIWdldFJldXNlZFBhY2thZ2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0VfX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiAhZ2V0TWV0aG9kUGFja2FnZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUEFDS0FHRV9fR0xPQkFMOgotCQkJCXJldHVybiBpc1NldEdsb2JhbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAxOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDEpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdsb2JhbDogIik7Ci0JCWlmIChnbG9iYWxFU2V0KSByZXN1bHQuYXBwZW5kKGdsb2JhbCk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NZXRob2RQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01ldGhvZFBsdWdpbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyM2I1NC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RQbHVnaW5JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBNZXRob2RQbHVnaW5JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWV0aG9kIFBsdWdpbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RQbHVnaW5JbXBsI2dldE1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFBsdWdpbkltcGwjaXNVc2VyQ2hhbmdlYWJsZSA8ZW0+VXNlciBDaGFuZ2VhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGx1Z2luSW1wbCBleHRlbmRzIE1ldGhvZFVuaXRJbXBsIGltcGxlbWVudHMgTWV0aG9kUGx1Z2luIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkgPGVtPlJlZmVyZW5jZWQgTWV0aG9kIFBsdWdpbjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kUGFja2FnZSgpIDxlbT5NZXRob2QgUGFja2FnZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2RQYWNrYWdlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8TWV0aG9kUGFja2FnZT4gbWV0aG9kUGFja2FnZTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1VzZXJDaGFuZ2VhYmxlKCkgPGVtPlVzZXIgQ2hhbmdlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNVc2VyQ2hhbmdlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRVJfQ0hBTkdFQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNVc2VyQ2hhbmdlYWJsZSgpIDxlbT5Vc2VyIENoYW5nZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzVXNlckNoYW5nZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZXJDaGFuZ2VhYmxlID0gVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBVc2VyIENoYW5nZWFibGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHVzZXJDaGFuZ2VhYmxlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNZXRob2RQbHVnaW5JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSB7Ci0JCWlmIChyZWZlcmVuY2VkTWV0aG9kUGx1Z2luID09IG51bGwpIHsKLQkJCXJlZmVyZW5jZWRNZXRob2RQbHVnaW4gPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlZE1ldGhvZFBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8TWV0aG9kUGFja2FnZT4gZ2V0TWV0aG9kUGFja2FnZSgpIHsKLQkJaWYgKG1ldGhvZFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbWV0aG9kUGFja2FnZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxNZXRob2RQYWNrYWdlPihNZXRob2RQYWNrYWdlLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckNoYW5nZWFibGUoYm9vbGVhbiBuZXdVc2VyQ2hhbmdlYWJsZSkgewotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlID0gdXNlckNoYW5nZWFibGU7Ci0JCXVzZXJDaGFuZ2VhYmxlID0gbmV3VXNlckNoYW5nZWFibGU7Ci0JCWJvb2xlYW4gb2xkVXNlckNoYW5nZWFibGVFU2V0ID0gdXNlckNoYW5nZWFibGVFU2V0OwotCQl1c2VyQ2hhbmdlYWJsZUVTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRSwgb2xkVXNlckNoYW5nZWFibGUsIHVzZXJDaGFuZ2VhYmxlLCAhb2xkVXNlckNoYW5nZWFibGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRVc2VyQ2hhbmdlYWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRVc2VyQ2hhbmdlYWJsZSA9IHVzZXJDaGFuZ2VhYmxlOwotCQlib29sZWFuIG9sZFVzZXJDaGFuZ2VhYmxlRVNldCA9IHVzZXJDaGFuZ2VhYmxlRVNldDsKLQkJdXNlckNoYW5nZWFibGUgPSBVU0VSX0NIQU5HRUFCTEVfRURFRkFVTFQ7Ci0JCXVzZXJDaGFuZ2VhYmxlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fVVNFUl9DSEFOR0VBQkxFLCBvbGRVc2VyQ2hhbmdlYWJsZSwgVVNFUl9DSEFOR0VBQkxFX0VERUZBVUxULCBvbGRVc2VyQ2hhbmdlYWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NldFVzZXJDaGFuZ2VhYmxlKCkgewotCQlyZXR1cm4gdXNlckNoYW5nZWFibGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1ldGhvZFBhY2thZ2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZFBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEU6Ci0JCQkJcmV0dXJuIGlzVXNlckNoYW5nZWFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCWdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5jbGVhcigpOwotCQkJCWdldFJlZmVyZW5jZWRNZXRob2RQbHVnaW4oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRToKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuY2xlYXIoKTsKLQkJCQlnZXRNZXRob2RQYWNrYWdlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2RQYWNrYWdlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlzZXRVc2VyQ2hhbmdlYWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTjoKLQkJCQlnZXRSZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fTUVUSE9EX1BBQ0tBR0U6Ci0JCQkJZ2V0TWV0aG9kUGFja2FnZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQl1bnNldFVzZXJDaGFuZ2VhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTl9fUkVGRVJFTkNFRF9NRVRIT0RfUExVR0lOOgotCQkJCXJldHVybiByZWZlcmVuY2VkTWV0aG9kUGx1Z2luICE9IG51bGwgJiYgIXJlZmVyZW5jZWRNZXRob2RQbHVnaW4uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX01FVEhPRF9QQUNLQUdFOgotCQkJCXJldHVybiBtZXRob2RQYWNrYWdlICE9IG51bGwgJiYgIW1ldGhvZFBhY2thZ2UuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU5fX1VTRVJfQ0hBTkdFQUJMRToKLQkJCQlyZXR1cm4gaXNTZXRVc2VyQ2hhbmdlYWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmVmZXJlbmNlZE1ldGhvZFBsdWdpbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmZXJlbmNlZE1ldGhvZFBsdWdpbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNlckNoYW5nZWFibGU6ICIpOwotCQlpZiAodXNlckNoYW5nZWFibGVFU2V0KSByZXN1bHQuYXBwZW5kKHVzZXJDaGFuZ2VhYmxlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFBsdWdpbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWV0aG9kVW5pdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzNWY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9NZXRob2RVbml0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWV0aG9kVW5pdEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1ldGhvZCBVbml0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldENvcHlyaWdodCA8ZW0+Q29weXJpZ2h0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk1ldGhvZFVuaXRJbXBsI2dldEF1dGhvcnMgPGVtPkF1dGhvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGF0ZSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWV0aG9kVW5pdEltcGwjZ2V0Q2hhbmdlRGVzY3JpcHRpb24gPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5NZXRob2RVbml0SW1wbCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWV0aG9kVW5pdEltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1ldGhvZFVuaXQgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHQoKSA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5cmlnaHQoKSA8ZW0+Q29weXJpZ2h0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5cmlnaHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29weXJpZ2h0ID0gQ09QWVJJR0hUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JzKCkgPGVtPkF1dGhvcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF1dGhvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXV0aG9ycyA9IEFVVEhPUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGF0ZSgpIDxlbT5DaGFuZ2UgRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBDSEFOR0VfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgY2hhbmdlRGF0ZSA9IENIQU5HRV9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNoYW5nZURlc2NyaXB0aW9uID0gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWV0aG9kVW5pdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9VTklUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0KCkgewotCQlyZXR1cm4gY29weXJpZ2h0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChTdHJpbmcgbmV3Q29weXJpZ2h0KSB7Ci0JCVN0cmluZyBvbGRDb3B5cmlnaHQgPSBjb3B5cmlnaHQ7Ci0JCWNvcHlyaWdodCA9IG5ld0NvcHlyaWdodDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hULCBvbGRDb3B5cmlnaHQsIGNvcHlyaWdodCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9ycygpIHsKLQkJcmV0dXJuIGF1dGhvcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXV0aG9ycyhTdHJpbmcgbmV3QXV0aG9ycykgewotCQlTdHJpbmcgb2xkQXV0aG9ycyA9IGF1dGhvcnM7Ci0JCWF1dGhvcnMgPSBuZXdBdXRob3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19BVVRIT1JTLCBvbGRBdXRob3JzLCBhdXRob3JzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldENoYW5nZURhdGUoKSB7Ci0JCXJldHVybiBjaGFuZ2VEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3Q2hhbmdlRGF0ZSkgewotCQlYTUxHcmVnb3JpYW5DYWxlbmRhciBvbGRDaGFuZ2VEYXRlID0gY2hhbmdlRGF0ZTsKLQkJY2hhbmdlRGF0ZSA9IG5ld0NoYW5nZURhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFLCBvbGRDaGFuZ2VEYXRlLCBjaGFuZ2VEYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNoYW5nZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoYW5nZURlc2NyaXB0aW9uKFN0cmluZyBuZXdDaGFuZ2VEZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkQ2hhbmdlRGVzY3JpcHRpb24gPSBjaGFuZ2VEZXNjcmlwdGlvbjsKLQkJY2hhbmdlRGVzY3JpcHRpb24gPSBuZXdDaGFuZ2VEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OLCBvbGRDaGFuZ2VEZXNjcmlwdGlvbiwgY2hhbmdlRGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5ld1ZlcnNpb24pIHsKLQkJU3RyaW5nIG9sZFZlcnNpb24gPSB2ZXJzaW9uOwotCQl2ZXJzaW9uID0gbmV3VmVyc2lvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTiwgb2xkVmVyc2lvbiwgdmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBnZXRDb3B5cmlnaHQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gZ2V0QXV0aG9ycygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlRGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldENoYW5nZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DT1BZUklHSFQ6Ci0JCQkJc2V0Q29weXJpZ2h0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZSgoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlzZXRWZXJzaW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlzZXRDb3B5cmlnaHQoQ09QWVJJR0hUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycyhBVVRIT1JTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoQ0hBTkdFX0RBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXNldENoYW5nZURlc2NyaXB0aW9uKENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0NPUFlSSUdIVDoKLQkJCQlyZXR1cm4gQ09QWVJJR0hUX0VERUZBVUxUID09IG51bGwgPyBjb3B5cmlnaHQgIT0gbnVsbCA6ICFDT1BZUklHSFRfRURFRkFVTFQuZXF1YWxzKGNvcHlyaWdodCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1VOSVRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIEFVVEhPUlNfRURFRkFVTFQgPT0gbnVsbCA/IGF1dGhvcnMgIT0gbnVsbCA6ICFBVVRIT1JTX0VERUZBVUxULmVxdWFscyhhdXRob3JzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIENIQU5HRV9EQVRFX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEYXRlICE9IG51bGwgOiAhQ0hBTkdFX0RBVEVfRURFRkFVTFQuZXF1YWxzKGNoYW5nZURhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIENIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gY2hhbmdlRGVzY3JpcHRpb24gIT0gbnVsbCA6ICFDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29weXJpZ2h0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb3B5cmlnaHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF1dGhvcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF1dGhvcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNoYW5nZURlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjaGFuZ2VEZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmVyc2lvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmVyc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL01ldGhvZFVuaXRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTWlsZXN0b25lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU3ZmU3Li4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL01pbGVzdG9uZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1pbGVzdG9uZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NaWxlc3RvbmU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuTWlsZXN0b25lSW1wbCNnZXRSZXF1aXJlZFJlc3VsdCA8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWlsZXN0b25lSW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIE1pbGVzdG9uZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVxdWlyZWRSZXN1bHQoKSA8ZW0+UmVxdWlyZWQgUmVzdWx0PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcXVpcmVkUmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiByZXF1aXJlZFJlc3VsdDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBNaWxlc3RvbmVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5NSUxFU1RPTkU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVxdWlyZWRSZXN1bHQoKSB7Ci0JCWlmIChyZXF1aXJlZFJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXF1aXJlZFJlc3VsdCA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVCk7Ci0JCX0KLQkJcmV0dXJuIHJlcXVpcmVkUmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVDoKLQkJCQlyZXR1cm4gZ2V0UmVxdWlyZWRSZXN1bHQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5NSUxFU1RPTkVfX1JFUVVJUkVEX1JFU1VMVDoKLQkJCQlnZXRSZXF1aXJlZFJlc3VsdCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVxdWlyZWRSZXN1bHQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FX19SRVFVSVJFRF9SRVNVTFQ6Ci0JCQkJZ2V0UmVxdWlyZWRSZXN1bHQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUOgotCQkJCXJldHVybiByZXF1aXJlZFJlc3VsdCAhPSBudWxsICYmICFyZXF1aXJlZFJlc3VsdC5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZXF1aXJlZFJlc3VsdDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVxdWlyZWRSZXN1bHQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9NaWxlc3RvbmVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvTmFtZWRFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY3OTRkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL05hbWVkRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE5hbWVkRWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLk5hbWVkRWxlbWVudEltcGwjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkRWxlbWVudEltcGwgZXh0ZW5kcyBFbGVtZW50SW1wbCBpbXBsZW1lbnRzIE5hbWVkRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTmFtZWRFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuTkFNRURfRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5OQU1FRF9FTEVNRU5UX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vTmFtZWRFbGVtZW50SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9PdXRjb21lSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZhNGFjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL091dGNvbWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE91dGNvbWVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T3V0Y29tZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE91dGNvbWVJbXBsIGV4dGVuZHMgV29ya1Byb2R1Y3RJbXBsIGltcGxlbWVudHMgT3V0Y29tZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE91dGNvbWVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5PVVRDT01FOwotCX0KLQotfSAvL091dGNvbWVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDQ3YjdjLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BhY2thZ2VhYmxlRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFja2FnZWFibGVFbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBhY2thZ2VhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFja2FnZWFibGUgRWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhY2thZ2VhYmxlRWxlbWVudEltcGwgZXh0ZW5kcyBOYW1lZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUGFja2FnZWFibGVFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUEFDS0FHRUFCTEVfRUxFTUVOVDsKLQl9Ci0KLX0gLy9QYWNrYWdlYWJsZUVsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUGhhc2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJhYTc5OS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QaGFzZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGhhc2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBoYXNlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VJbXBsIGV4dGVuZHMgQWN0aXZpdHlJbXBsIGltcGxlbWVudHMgUGhhc2UgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQaGFzZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBIQVNFOwotCX0KLQotfSAvL1BoYXNlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1BsYW5uaW5nRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmODU4Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QbGFubmluZ0RhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQbGFubmluZ0RhdGFJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBsYW5uaW5nIERhdGE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRGaW5pc2hEYXRlIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QbGFubmluZ0RhdGFJbXBsI2dldFJhbmsgPGVtPlJhbms8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUGxhbm5pbmdEYXRhSW1wbCNnZXRTdGFydERhdGUgPGVtPlN0YXJ0IERhdGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGFubmluZ0RhdGFJbXBsIGV4dGVuZHMgUHJvY2Vzc0VsZW1lbnRJbXBsIGltcGxlbWVudHMgUGxhbm5pbmdEYXRhIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmluaXNoRGF0ZSgpIDxlbT5GaW5pc2ggRGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmluaXNoRGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBGSU5JU0hfREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaW5pc2hEYXRlKCkgPGVtPkZpbmlzaCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaW5pc2hEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWE1MR3JlZ29yaWFuQ2FsZW5kYXIgZmluaXNoRGF0ZSA9IEZJTklTSF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmsoKSA8ZW0+UmFuazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFOS19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5rKCkgPGVtPlJhbms8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmsoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmFuayA9IFJBTktfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RhcnREYXRlKCkgPGVtPlN0YXJ0IERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0YXJ0RGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYTUxHcmVnb3JpYW5DYWxlbmRhciBTVEFSVF9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0YXJ0RGF0ZSgpIDxlbT5TdGFydCBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdGFydERhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBzdGFydERhdGUgPSBTVEFSVF9EQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBsYW5uaW5nRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBMQU5OSU5HX0RBVEE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldEZpbmlzaERhdGUoKSB7Ci0JCXJldHVybiBmaW5pc2hEYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbmlzaERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3RmluaXNoRGF0ZSkgewotCQlYTUxHcmVnb3JpYW5DYWxlbmRhciBvbGRGaW5pc2hEYXRlID0gZmluaXNoRGF0ZTsKLQkJZmluaXNoRGF0ZSA9IG5ld0ZpbmlzaERhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUsIG9sZEZpbmlzaERhdGUsIGZpbmlzaERhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJhbmsoKSB7Ci0JCXJldHVybiByYW5rOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmsoU3RyaW5nIG5ld1JhbmspIHsKLQkJU3RyaW5nIG9sZFJhbmsgPSByYW5rOwotCQlyYW5rID0gbmV3UmFuazsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LLCBvbGRSYW5rLCByYW5rKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhNTEdyZWdvcmlhbkNhbGVuZGFyIGdldFN0YXJ0RGF0ZSgpIHsKLQkJcmV0dXJuIHN0YXJ0RGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydERhdGUoWE1MR3JlZ29yaWFuQ2FsZW5kYXIgbmV3U3RhcnREYXRlKSB7Ci0JCVhNTEdyZWdvcmlhbkNhbGVuZGFyIG9sZFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLQkJc3RhcnREYXRlID0gbmV3U3RhcnREYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEUsIG9sZFN0YXJ0RGF0ZSwgc3RhcnREYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX0ZJTklTSF9EQVRFOgotCQkJCXJldHVybiBnZXRGaW5pc2hEYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlyZXR1cm4gZ2V0UmFuaygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIGdldFN0YXJ0RGF0ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEU6Ci0JCQkJc2V0RmluaXNoRGF0ZSgoWE1MR3JlZ29yaWFuQ2FsZW5kYXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19SQU5LOgotCQkJCXNldFJhbmsoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJc2V0U3RhcnREYXRlKChYTUxHcmVnb3JpYW5DYWxlbmRhciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCQlzZXRGaW5pc2hEYXRlKEZJTklTSF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlzZXRSYW5rKFJBTktfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19TVEFSVF9EQVRFOgotCQkJCXNldFN0YXJ0RGF0ZShTVEFSVF9EQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QTEFOTklOR19EQVRBX19GSU5JU0hfREFURToKLQkJCQlyZXR1cm4gRklOSVNIX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGZpbmlzaERhdGUgIT0gbnVsbCA6ICFGSU5JU0hfREFURV9FREVGQVVMVC5lcXVhbHMoZmluaXNoRGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQV9fUkFOSzoKLQkJCQlyZXR1cm4gUkFOS19FREVGQVVMVCA9PSBudWxsID8gcmFuayAhPSBudWxsIDogIVJBTktfRURFRkFVTFQuZXF1YWxzKHJhbmspOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBMQU5OSU5HX0RBVEFfX1NUQVJUX0RBVEU6Ci0JCQkJcmV0dXJuIFNUQVJUX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IHN0YXJ0RGF0ZSAhPSBudWxsIDogIVNUQVJUX0RBVEVfRURFRkFVTFQuZXF1YWxzKHN0YXJ0RGF0ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaW5pc2hEYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChmaW5pc2hEYXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByYW5rOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyYW5rKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdGFydERhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN0YXJ0RGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1BsYW5uaW5nRGF0YUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFlYjY1ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2UgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QWRkaXRpb25hbEluZm8gPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRBcHBsaWNhdGlvbiA8ZW0+QXBwbGljYXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0QmFja2dyb3VuZCA8ZW0+QmFja2dyb3VuZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZURlc2NyaXB0aW9uSW1wbCNnZXRHb2FscyA8ZW0+R29hbHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwjZ2V0TGV2ZWxzT2ZBZG9wdGlvbiA8ZW0+TGV2ZWxzIE9mIEFkb3B0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlRGVzY3JpcHRpb25JbXBsI2dldFByb2JsZW0gPGVtPlByb2JsZW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmFjdGljZURlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBQcmFjdGljZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbEluZm8oKSA8ZW0+QWRkaXRpb25hbCBJbmZvPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsSW5mbygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURESVRJT05BTF9JTkZPX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFkZGl0aW9uYWxJbmZvKCkgPGVtPkFkZGl0aW9uYWwgSW5mbzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWRkaXRpb25hbEluZm8oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBBRERJVElPTkFMX0lORk9fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXBwbGljYXRpb24oKSA8ZW0+QXBwbGljYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFwcGxpY2F0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBcHBsaWNhdGlvbigpIDxlbT5BcHBsaWNhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXBwbGljYXRpb24gPSBBUFBMSUNBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYWNrZ3JvdW5kKCkgPGVtPkJhY2tncm91bmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhY2tncm91bmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFja2dyb3VuZCgpIDxlbT5CYWNrZ3JvdW5kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYWNrZ3JvdW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhY2tncm91bmQgPSBCQUNLR1JPVU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdvYWxzKCkgPGVtPkdvYWxzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHb2FscygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09BTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R29hbHMoKSA8ZW0+R29hbHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdvYWxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdvYWxzID0gR09BTFNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpIDxlbT5MZXZlbHMgT2YgQWRvcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExldmVsc09mQWRvcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMU19PRl9BRE9QVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZXZlbHNPZkFkb3B0aW9uKCkgPGVtPkxldmVscyBPZiBBZG9wdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBsZXZlbHNPZkFkb3B0aW9uID0gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2JsZW0oKSA8ZW0+UHJvYmxlbTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvYmxlbSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9ibGVtKCkgPGVtPlByb2JsZW08L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2JsZW0oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvYmxlbSA9IFBST0JMRU1fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSW5mbyhTdHJpbmcgbmV3QWRkaXRpb25hbEluZm8pIHsKLQkJU3RyaW5nIG9sZEFkZGl0aW9uYWxJbmZvID0gYWRkaXRpb25hbEluZm87Ci0JCWFkZGl0aW9uYWxJbmZvID0gbmV3QWRkaXRpb25hbEluZm87Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTywgb2xkQWRkaXRpb25hbEluZm8sIGFkZGl0aW9uYWxJbmZvKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyBuZXdBcHBsaWNhdGlvbikgewotCQlTdHJpbmcgb2xkQXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKLQkJYXBwbGljYXRpb24gPSBuZXdBcHBsaWNhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT04sIG9sZEFwcGxpY2F0aW9uLCBhcHBsaWNhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZCgpIHsKLQkJcmV0dXJuIGJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZChTdHJpbmcgbmV3QmFja2dyb3VuZCkgewotCQlTdHJpbmcgb2xkQmFja2dyb3VuZCA9IGJhY2tncm91bmQ7Ci0JCWJhY2tncm91bmQgPSBuZXdCYWNrZ3JvdW5kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5ELCBvbGRCYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHb2FscygpIHsKLQkJcmV0dXJuIGdvYWxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdvYWxzKFN0cmluZyBuZXdHb2FscykgewotCQlTdHJpbmcgb2xkR29hbHMgPSBnb2FsczsKLQkJZ29hbHMgPSBuZXdHb2FsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFMsIG9sZEdvYWxzLCBnb2FscykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGV2ZWxzT2ZBZG9wdGlvbigpIHsKLQkJcmV0dXJuIGxldmVsc09mQWRvcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGV2ZWxzT2ZBZG9wdGlvbihTdHJpbmcgbmV3TGV2ZWxzT2ZBZG9wdGlvbikgewotCQlTdHJpbmcgb2xkTGV2ZWxzT2ZBZG9wdGlvbiA9IGxldmVsc09mQWRvcHRpb247Ci0JCWxldmVsc09mQWRvcHRpb24gPSBuZXdMZXZlbHNPZkFkb3B0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT04sIG9sZExldmVsc09mQWRvcHRpb24sIGxldmVsc09mQWRvcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2JsZW0oKSB7Ci0JCXJldHVybiBwcm9ibGVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2JsZW0oU3RyaW5nIG5ld1Byb2JsZW0pIHsKLQkJU3RyaW5nIG9sZFByb2JsZW0gPSBwcm9ibGVtOwotCQlwcm9ibGVtID0gbmV3UHJvYmxlbTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSwgb2xkUHJvYmxlbSwgcHJvYmxlbSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJCXJldHVybiBnZXRBZGRpdGlvbmFsSW5mbygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlyZXR1cm4gZ2V0QXBwbGljYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORDoKLQkJCQlyZXR1cm4gZ2V0QmFja2dyb3VuZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlyZXR1cm4gZ2V0R29hbHMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXJldHVybiBnZXRMZXZlbHNPZkFkb3B0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX1BST0JMRU06Ci0JCQkJcmV0dXJuIGdldFByb2JsZW0oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJc2V0QWRkaXRpb25hbEluZm8oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJc2V0QmFja2dyb3VuZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTOgotCQkJCXNldEdvYWxzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OOgotCQkJCXNldExldmVsc09mQWRvcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19QUk9CTEVNOgotCQkJCXNldFByb2JsZW0oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQURESVRJT05BTF9JTkZPOgotCQkJCXNldEFkZGl0aW9uYWxJbmZvKEFERElUSU9OQUxfSU5GT19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BUFBMSUNBVElPTjoKLQkJCQlzZXRBcHBsaWNhdGlvbihBUFBMSUNBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19CQUNLR1JPVU5EOgotCQkJCXNldEJhY2tncm91bmQoQkFDS0dST1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19HT0FMUzoKLQkJCQlzZXRHb2FscyhHT0FMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19MRVZFTFNfT0ZfQURPUFRJT046Ci0JCQkJc2V0TGV2ZWxzT2ZBZG9wdGlvbihMRVZFTFNfT0ZfQURPUFRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlzZXRQcm9ibGVtKFBST0JMRU1fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OX19BRERJVElPTkFMX0lORk86Ci0JCQkJcmV0dXJuIEFERElUSU9OQUxfSU5GT19FREVGQVVMVCA9PSBudWxsID8gYWRkaXRpb25hbEluZm8gIT0gbnVsbCA6ICFBRERJVElPTkFMX0lORk9fRURFRkFVTFQuZXF1YWxzKGFkZGl0aW9uYWxJbmZvKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fQVBQTElDQVRJT046Ci0JCQkJcmV0dXJuIEFQUExJQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBhcHBsaWNhdGlvbiAhPSBudWxsIDogIUFQUExJQ0FUSU9OX0VERUZBVUxULmVxdWFscyhhcHBsaWNhdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0JBQ0tHUk9VTkQ6Ci0JCQkJcmV0dXJuIEJBQ0tHUk9VTkRfRURFRkFVTFQgPT0gbnVsbCA/IGJhY2tncm91bmQgIT0gbnVsbCA6ICFCQUNLR1JPVU5EX0VERUZBVUxULmVxdWFscyhiYWNrZ3JvdW5kKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fR09BTFM6Ci0JCQkJcmV0dXJuIEdPQUxTX0VERUZBVUxUID09IG51bGwgPyBnb2FscyAhPSBudWxsIDogIUdPQUxTX0VERUZBVUxULmVxdWFscyhnb2Fscyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0xFVkVMU19PRl9BRE9QVElPTjoKLQkJCQlyZXR1cm4gTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxUID09IG51bGwgPyBsZXZlbHNPZkFkb3B0aW9uICE9IG51bGwgOiAhTEVWRUxTX09GX0FET1BUSU9OX0VERUZBVUxULmVxdWFscyhsZXZlbHNPZkFkb3B0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTToKLQkJCQlyZXR1cm4gUFJPQkxFTV9FREVGQVVMVCA9PSBudWxsID8gcHJvYmxlbSAhPSBudWxsIDogIVBST0JMRU1fRURFRkFVTFQuZXF1YWxzKHByb2JsZW0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWRkaXRpb25hbEluZm86ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFkZGl0aW9uYWxJbmZvKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhcHBsaWNhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXBwbGljYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGJhY2tncm91bmQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGJhY2tncm91bmQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdvYWxzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChnb2Fscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbGV2ZWxzT2ZBZG9wdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGV2ZWxzT2ZBZG9wdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvYmxlbTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvYmxlbSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1ByYWN0aWNlRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJhY3RpY2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkYmFkMy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9QcmFjdGljZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByYWN0aWNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJhY3RpY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJhY3RpY2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRBY3Rpdml0eVJlZmVyZW5jZSA8ZW0+QWN0aXZpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByYWN0aWNlSW1wbCNnZXRDb250ZW50UmVmZXJlbmNlIDxlbT5Db250ZW50IFJlZmVyZW5jZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5QcmFjdGljZUltcGwjZ2V0U3ViUHJhY3RpY2UgPGVtPlN1YiBQcmFjdGljZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByYWN0aWNlSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFByYWN0aWNlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByYWN0aWNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFjdGl2aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldENvbnRlbnRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8UHJhY3RpY2U+IGdldFN1YlByYWN0aWNlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3ViUHJhY3RpY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX0FDVElWSVRZX1JFRkVSRU5DRToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnRSZWZlcmVuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fU1VCX1BSQUNUSUNFOgotCQkJCXJldHVybiBnZXRTdWJQcmFjdGljZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFOgotCQkJCWdldEFjdGl2aXR5UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19DT05URU5UX1JFRkVSRU5DRToKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlnZXRDb250ZW50UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRToKLQkJCQlnZXRTdWJQcmFjdGljZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViUHJhY3RpY2UoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByYWN0aWNlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJZ2V0QWN0aXZpdHlSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJZ2V0Q29udGVudFJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJZ2V0U3ViUHJhY3RpY2UoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19BQ1RJVklUWV9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuICFnZXRBY3Rpdml0eVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9fQ09OVEVOVF9SRUZFUkVOQ0U6Ci0JCQkJcmV0dXJuICFnZXRDb250ZW50UmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX19TVUJfUFJBQ1RJQ0U6Ci0JCQkJcmV0dXJuICFnZXRTdWJQcmFjdGljZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJhY3RpY2VJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NDb21wb25lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NGQ2NGMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NDb21wb25lbnRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmF4LnhtbC5kYXRhdHlwZS5YTUxHcmVnb3JpYW5DYWxlbmRhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBDb21wb25lbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0Q29weXJpZ2h0IDxlbT5Db3B5cmlnaHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0SW50ZXJmYWNlIDxlbT5JbnRlcmZhY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW1wbCNnZXRBdXRob3JzIDxlbT5BdXRob3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURhdGUgPGVtPkNoYW5nZSBEYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NDb21wb25lbnRJbXBsI2dldENoYW5nZURlc2NyaXB0aW9uIDxlbT5DaGFuZ2UgRGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0NvbXBvbmVudEltcGwjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NDb21wb25lbnRJbXBsIGV4dGVuZHMgUHJvY2Vzc1BhY2thZ2VJbXBsIGltcGxlbWVudHMgUHJvY2Vzc0NvbXBvbmVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvcHlyaWdodCgpIDxlbT5Db3B5cmlnaHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcHlyaWdodCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb3B5cmlnaHQgPSBDT1BZUklHSFRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnRlcmZhY2UoKSA8ZW0+SW50ZXJmYWNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJbnRlcmZhY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGludGVyZmFjZV87Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZXNzKCkgPGVtPlByb2Nlc3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIHByb2Nlc3M7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9ycygpIDxlbT5BdXRob3JzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdXRob3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF1dGhvcnMoKSA8ZW0+QXV0aG9yczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXV0aG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdXRob3JzID0gQVVUSE9SU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFuZ2VEYXRlKCkgPGVtPkNoYW5nZSBEYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhNTEdyZWdvcmlhbkNhbGVuZGFyIENIQU5HRV9EQVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURhdGUoKSA8ZW0+Q2hhbmdlIERhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENoYW5nZURhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYTUxHcmVnb3JpYW5DYWxlbmRhciBjaGFuZ2VEYXRlID0gQ0hBTkdFX0RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSA8ZW0+Q2hhbmdlIERlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VEZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYW5nZURlc2NyaXB0aW9uKCkgPGVtPkNoYW5nZSBEZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2hhbmdlRGVzY3JpcHRpb24gPSBDSEFOR0VfREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmVyc2lvbigpIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2ZXJzaW9uID0gVkVSU0lPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzQ29tcG9uZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb3B5cmlnaHQoKSB7Ci0JCXJldHVybiBjb3B5cmlnaHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBuZXdDb3B5cmlnaHQpIHsKLQkJU3RyaW5nIG9sZENvcHlyaWdodCA9IGNvcHlyaWdodDsKLQkJY29weXJpZ2h0ID0gbmV3Q29weXJpZ2h0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQsIG9sZENvcHlyaWdodCwgY29weXJpZ2h0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgZ2V0SW50ZXJmYWNlKCkgewotCQlyZXR1cm4gaW50ZXJmYWNlXzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBuZXdJbnRlcmZhY2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvbGRJbnRlcmZhY2UgPSBpbnRlcmZhY2VfOwotCQlpbnRlcmZhY2VfID0gbmV3SW50ZXJmYWNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG9sZEludGVyZmFjZSwgbmV3SW50ZXJmYWNlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBuZXdJbnRlcmZhY2UpIHsKLQkJaWYgKG5ld0ludGVyZmFjZSAhPSBpbnRlcmZhY2VfKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnRlcmZhY2VfICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWludGVyZmFjZV8pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0ludGVyZmFjZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnRlcmZhY2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW50ZXJmYWNlKG5ld0ludGVyZmFjZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0UsIG5ld0ludGVyZmFjZSwgbmV3SW50ZXJmYWNlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJvY2VzcyhvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzIG5ld1Byb2Nlc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBvbGRQcm9jZXNzID0gcHJvY2VzczsKLQkJcHJvY2VzcyA9IG5ld1Byb2Nlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG9sZFByb2Nlc3MsIG5ld1Byb2Nlc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3Mob3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBuZXdQcm9jZXNzKSB7Ci0JCWlmIChuZXdQcm9jZXNzICE9IHByb2Nlc3MpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJvY2VzcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Byb2Nlc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJvY2VzcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvY2VzcyhuZXdQcm9jZXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1MsIG5ld1Byb2Nlc3MsIG5ld1Byb2Nlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF1dGhvcnMoKSB7Ci0JCXJldHVybiBhdXRob3JzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF1dGhvcnMoU3RyaW5nIG5ld0F1dGhvcnMpIHsKLQkJU3RyaW5nIG9sZEF1dGhvcnMgPSBhdXRob3JzOwotCQlhdXRob3JzID0gbmV3QXV0aG9yczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUywgb2xkQXV0aG9ycywgYXV0aG9ycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYTUxHcmVnb3JpYW5DYWxlbmRhciBnZXRDaGFuZ2VEYXRlKCkgewotCQlyZXR1cm4gY2hhbmdlRGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEYXRlKFhNTEdyZWdvcmlhbkNhbGVuZGFyIG5ld0NoYW5nZURhdGUpIHsKLQkJWE1MR3JlZ29yaWFuQ2FsZW5kYXIgb2xkQ2hhbmdlRGF0ZSA9IGNoYW5nZURhdGU7Ci0JCWNoYW5nZURhdGUgPSBuZXdDaGFuZ2VEYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSwgb2xkQ2hhbmdlRGF0ZSwgY2hhbmdlRGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2hhbmdlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBjaGFuZ2VEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VEZXNjcmlwdGlvbihTdHJpbmcgbmV3Q2hhbmdlRGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZENoYW5nZURlc2NyaXB0aW9uID0gY2hhbmdlRGVzY3JpcHRpb247Ci0JCWNoYW5nZURlc2NyaXB0aW9uID0gbmV3Q2hhbmdlRGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTiwgb2xkQ2hhbmdlRGVzY3JpcHRpb24sIGNoYW5nZURlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyBuZXdWZXJzaW9uKSB7Ci0JCVN0cmluZyBvbGRWZXJzaW9uID0gdmVyc2lvbjsKLQkJdmVyc2lvbiA9IG5ld1ZlcnNpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnRlcmZhY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJvY2VzcyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJcmV0dXJuIGdldENvcHlyaWdodCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJcmV0dXJuIGdldEludGVyZmFjZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19QUk9DRVNTOgotCQkJCXJldHVybiBnZXRQcm9jZXNzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJcmV0dXJuIGdldEF1dGhvcnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJcmV0dXJuIGdldENoYW5nZURhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXRDaGFuZ2VEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXJldHVybiBnZXRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUOgotCQkJCXNldENvcHlyaWdodCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0lOVEVSRkFDRToKLQkJCQlzZXRJbnRlcmZhY2UoKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlzZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlM6Ci0JCQkJc2V0QXV0aG9ycygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9EQVRFOgotCQkJCXNldENoYW5nZURhdGUoKFhNTEdyZWdvcmlhbkNhbGVuZGFyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlzZXRDaGFuZ2VEZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DT1BZUklHSFQ6Ci0JCQkJc2V0Q29weXJpZ2h0KENPUFlSSUdIVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19JTlRFUkZBQ0U6Ci0JCQkJc2V0SW50ZXJmYWNlKChQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUzoKLQkJCQlzZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlzZXRBdXRob3JzKEFVVEhPUlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ0hBTkdFX0RBVEU6Ci0JCQkJc2V0Q2hhbmdlRGF0ZShDSEFOR0VfREFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREVTQ1JJUFRJT046Ci0JCQkJc2V0Q2hhbmdlRGVzY3JpcHRpb24oQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbihWRVJTSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUOgotCQkJCXJldHVybiBDT1BZUklHSFRfRURFRkFVTFQgPT0gbnVsbCA/IGNvcHlyaWdodCAhPSBudWxsIDogIUNPUFlSSUdIVF9FREVGQVVMVC5lcXVhbHMoY29weXJpZ2h0KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFOgotCQkJCXJldHVybiBpbnRlcmZhY2VfICE9IG51bGw7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX1BST0NFU1M6Ci0JCQkJcmV0dXJuIHByb2Nlc3MgIT0gbnVsbDsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9fQVVUSE9SUzoKLQkJCQlyZXR1cm4gQVVUSE9SU19FREVGQVVMVCA9PSBudWxsID8gYXV0aG9ycyAhPSBudWxsIDogIUFVVEhPUlNfRURFRkFVTFQuZXF1YWxzKGF1dGhvcnMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURToKLQkJCQlyZXR1cm4gQ0hBTkdFX0RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNoYW5nZURhdGUgIT0gbnVsbCA6ICFDSEFOR0VfREFURV9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGF0ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gQ0hBTkdFX0RFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBjaGFuZ2VEZXNjcmlwdGlvbiAhPSBudWxsIDogIUNIQU5HRV9ERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoY2hhbmdlRGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX19WRVJTSU9OOgotCQkJCXJldHVybiBWRVJTSU9OX0VERUZBVUxUID09IG51bGwgPyB2ZXJzaW9uICE9IG51bGwgOiAhVkVSU0lPTl9FREVGQVVMVC5lcXVhbHModmVyc2lvbik7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb3B5cmlnaHQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvcHlyaWdodCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYXV0aG9yczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYXV0aG9ycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGF0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2hhbmdlRGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2hhbmdlRGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNoYW5nZURlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmYzcxZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIDxlbT5JbnRlcmZhY2UgU3BlY2lmaWNhdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlSW1wbCNnZXRJbnRlcmZhY2VJTyA8ZW0+SW50ZXJmYWNlIElPPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8VGFza0Rlc2NyaXB0b3I+IGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFdvcmtQcm9kdWN0RGVzY3JpcHRvcj4gZ2V0SW50ZXJmYWNlSU8oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SW50ZXJmYWNlSU8oKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJcmV0dXJuIGdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0lOVEVSRkFDRV9JTzoKLQkJCQlyZXR1cm4gZ2V0SW50ZXJmYWNlSU8oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmNsZWFyKCk7Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVGFza0Rlc2NyaXB0b3I+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJZ2V0SW50ZXJmYWNlSU8oKS5jbGVhcigpOwotCQkJCWdldEludGVyZmFjZUlPKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrUHJvZHVjdERlc2NyaXB0b3I+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX1NQRUNJRklDQVRJT046Ci0JCQkJZ2V0SW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRV9fSU5URVJGQUNFX0lPOgotCQkJCWdldEludGVyZmFjZUlPKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTjoKLQkJCQlyZXR1cm4gIWdldEludGVyZmFjZVNwZWNpZmljYXRpb24oKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU86Ci0JCQkJcmV0dXJuICFnZXRJbnRlcmZhY2VJTygpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzEzZjcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRTY29wZSA8ZW0+U2NvcGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCNnZXRVc2FnZU5vdGVzIDxlbT5Vc2FnZSBOb3RlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjb3BlKCkgPGVtPlNjb3BlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY29wZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NPUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NvcGUoKSA8ZW0+U2NvcGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjb3BlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjb3BlID0gU0NPUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNBR0VfTk9URVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNhZ2VOb3RlcygpIDxlbT5Vc2FnZSBOb3RlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXNhZ2VOb3RlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB1c2FnZU5vdGVzID0gVVNBR0VfTk9URVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0Rlc2NyaXB0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjb3BlKCkgewotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIG5ld1Njb3BlKSB7Ci0JCVN0cmluZyBvbGRTY29wZSA9IHNjb3BlOwotCQlzY29wZSA9IG5ld1Njb3BlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFLCBvbGRTY29wZSwgc2NvcGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVzYWdlTm90ZXMoKSB7Ci0JCXJldHVybiB1c2FnZU5vdGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVzYWdlTm90ZXMoU3RyaW5nIG5ld1VzYWdlTm90ZXMpIHsKLQkJU3RyaW5nIG9sZFVzYWdlTm90ZXMgPSB1c2FnZU5vdGVzOwotCQl1c2FnZU5vdGVzID0gbmV3VXNhZ2VOb3RlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUywgb2xkVXNhZ2VOb3RlcywgdXNhZ2VOb3RlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlyZXR1cm4gZ2V0U2NvcGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19VU0FHRV9OT1RFUzoKLQkJCQlyZXR1cm4gZ2V0VXNhZ2VOb3RlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19ERVNDUklQVElPTl9fU0NPUEU6Ci0JCQkJc2V0U2NvcGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXNldFVzYWdlTm90ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OX19TQ09QRToKLQkJCQlzZXRTY29wZShTQ09QRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXNldFVzYWdlTm90ZXMoVVNBR0VfTk9URVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFOgotCQkJCXJldHVybiBTQ09QRV9FREVGQVVMVCA9PSBudWxsID8gc2NvcGUgIT0gbnVsbCA6ICFTQ09QRV9FREVGQVVMVC5lcXVhbHMoc2NvcGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTOgotCQkJCXJldHVybiBVU0FHRV9OT1RFU19FREVGQVVMVCA9PSBudWxsID8gdXNhZ2VOb3RlcyAhPSBudWxsIDogIVVTQUdFX05PVEVTX0VERUZBVUxULmVxdWFscyh1c2FnZU5vdGVzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNjb3BlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY29wZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdXNhZ2VOb3RlczogIik7Ci0JCXJlc3VsdC5hcHBlbmQodXNhZ2VOb3Rlcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NEZXNjcmlwdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzRWxlbWVudEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JiY2EwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NFbGVtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzRWxlbWVudEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzcyBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc0VsZW1lbnRJbXBsIGV4dGVuZHMgRGVzY3JpYmFibGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFByb2Nlc3NFbGVtZW50IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0VsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX0VMRU1FTlQ7Ci0JfQotCi19IC8vUHJvY2Vzc0VsZW1lbnRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YjczODEuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFByb2Nlc3NJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRJbmNsdWRlc1BhdHRlcm4gPGVtPkluY2x1ZGVzIFBhdHRlcm48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0RGVmYXVsdENvbnRleHQgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Qcm9jZXNzSW1wbCNnZXRWYWxpZENvbnRleHQgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc0ltcGwjZ2V0RGlhZ3JhbVVSSSA8ZW0+RGlhZ3JhbSBVUkk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzSW1wbCBleHRlbmRzIEFjdGl2aXR5SW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluY2x1ZGVzUGF0dGVybigpIDxlbT5JbmNsdWRlcyBQYXR0ZXJuPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluY2x1ZGVzUGF0dGVybigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFN0cmluZz4gaW5jbHVkZXNQYXR0ZXJuOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRDb250ZXh0KCkgPGVtPkRlZmF1bHQgQ29udGV4dDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdENvbnRleHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVYVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0Q29udGV4dCgpIDxlbT5EZWZhdWx0IENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDb250ZXh0ID0gREVGQVVMVF9DT05URVhUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsaWRDb250ZXh0KCkgPGVtPlZhbGlkIENvbnRleHQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsaWRDb250ZXh0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiB2YWxpZENvbnRleHQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbVVSSSgpIDxlbT5EaWFncmFtIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBR1JBTV9VUklfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlhZ3JhbVVSSSgpIDxlbT5EaWFncmFtIFVSSTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlhZ3JhbVVSSSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkaWFncmFtVVJJID0gRElBR1JBTV9VUklfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZXNQYXR0ZXJuKCkgewotCQlpZiAoaW5jbHVkZXNQYXR0ZXJuID09IG51bGwpIHsKLQkJCWluY2x1ZGVzUGF0dGVybiA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOKTsKLQkJfQotCQlyZXR1cm4gaW5jbHVkZXNQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbnRleHQoKSB7Ci0JCXJldHVybiBkZWZhdWx0Q29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0Q29udGV4dChTdHJpbmcgbmV3RGVmYXVsdENvbnRleHQpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRDb250ZXh0ID0gZGVmYXVsdENvbnRleHQ7Ci0JCWRlZmF1bHRDb250ZXh0ID0gbmV3RGVmYXVsdENvbnRleHQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhULCBvbGREZWZhdWx0Q29udGV4dCwgZGVmYXVsdENvbnRleHQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRWYWxpZENvbnRleHQoKSB7Ci0JCWlmICh2YWxpZENvbnRleHQgPT0gbnVsbCkgewotCQkJdmFsaWRDb250ZXh0ID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCQl9Ci0JCXJldHVybiB2YWxpZENvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaWFncmFtVVJJKCkgewotCQlyZXR1cm4gZGlhZ3JhbVVSSTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFncmFtVVJJKFN0cmluZyBuZXdEaWFncmFtVVJJKSB7Ci0JCVN0cmluZyBvbGREaWFncmFtVVJJID0gZGlhZ3JhbVVSSTsKLQkJZGlhZ3JhbVVSSSA9IG5ld0RpYWdyYW1VUkk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuUFJPQ0VTU19fRElBR1JBTV9VUkksIG9sZERpYWdyYW1VUkksIGRpYWdyYW1VUkkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlyZXR1cm4gZ2V0SW5jbHVkZXNQYXR0ZXJuKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fREVGQVVMVF9DT05URVhUOgotCQkJCXJldHVybiBnZXREZWZhdWx0Q29udGV4dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIGdldFZhbGlkQ29udGV4dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXJldHVybiBnZXREaWFncmFtVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fSU5DTFVERVNfUEFUVEVSTjoKLQkJCQlnZXRJbmNsdWRlc1BhdHRlcm4oKS5jbGVhcigpOwotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlzZXREZWZhdWx0Q29udGV4dCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19fVkFMSURfQ09OVEVYVDoKLQkJCQlnZXRWYWxpZENvbnRleHQoKS5jbGVhcigpOwotCQkJCWdldFZhbGlkQ29udGV4dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXNldERpYWdyYW1VUkkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19JTkNMVURFU19QQVRURVJOOgotCQkJCWdldEluY2x1ZGVzUGF0dGVybigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlzZXREZWZhdWx0Q29udGV4dChERUZBVUxUX0NPTlRFWFRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX19WQUxJRF9DT05URVhUOgotCQkJCWdldFZhbGlkQ29udGV4dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXNldERpYWdyYW1VUkkoRElBR1JBTV9VUklfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0lOQ0xVREVTX1BBVFRFUk46Ci0JCQkJcmV0dXJuIGluY2x1ZGVzUGF0dGVybiAhPSBudWxsICYmICFpbmNsdWRlc1BhdHRlcm4uaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RFRkFVTFRfQ09OVEVYVDoKLQkJCQlyZXR1cm4gREVGQVVMVF9DT05URVhUX0VERUZBVUxUID09IG51bGwgPyBkZWZhdWx0Q29udGV4dCAhPSBudWxsIDogIURFRkFVTFRfQ09OVEVYVF9FREVGQVVMVC5lcXVhbHMoZGVmYXVsdENvbnRleHQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX1ZBTElEX0NPTlRFWFQ6Ci0JCQkJcmV0dXJuIHZhbGlkQ29udGV4dCAhPSBudWxsICYmICF2YWxpZENvbnRleHQuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfX0RJQUdSQU1fVVJJOgotCQkJCXJldHVybiBESUFHUkFNX1VSSV9FREVGQVVMVCA9PSBudWxsID8gZGlhZ3JhbVVSSSAhPSBudWxsIDogIURJQUdSQU1fVVJJX0VERUZBVUxULmVxdWFscyhkaWFncmFtVVJJKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGluY2x1ZGVzUGF0dGVybjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5jbHVkZXNQYXR0ZXJuKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0Q29udGV4dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdENvbnRleHQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbGlkQ29udGV4dDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsaWRDb250ZXh0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaWFncmFtVVJJOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaWFncmFtVVJJKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUHJvY2Vzc0ltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Qcm9jZXNzUGFja2FnZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWRmYTliLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUHJvY2Vzc1BhY2thZ2VJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Qcm9jZXNzIFBhY2thZ2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BhY2thZ2VJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQYWNrYWdlSW1wbCNnZXRQcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BhY2thZ2VJbXBsIGV4dGVuZHMgTWV0aG9kUGFja2FnZUltcGwgaW1wbGVtZW50cyBQcm9jZXNzUGFja2FnZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzUGFja2FnZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUEFDS0FHRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxQcm9jZXNzRWxlbWVudD4gZ2V0UHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9jZXNzRWxlbWVudCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIGdldFByb2Nlc3NFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvY2Vzc0VsZW1lbnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFByb2Nlc3NFbGVtZW50PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0VfX1BST0NFU1NfRUxFTUVOVDoKLQkJCQlnZXRQcm9jZXNzRWxlbWVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QQUNLQUdFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRV9fUFJPQ0VTU19FTEVNRU5UOgotCQkJCXJldHVybiAhZ2V0UHJvY2Vzc0VsZW1lbnQoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NQYWNrYWdlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNTljYzcuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsI2dldEdyb3VwNCA8ZW0+R3JvdXA0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlByb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbCNnZXRCYXNlUHJvY2VzcyA8ZW0+QmFzZSBQcm9jZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsIGV4dGVuZHMgUHJvY2Vzc0ltcGwgaW1wbGVtZW50cyBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXA0KCkgPGVtPkdyb3VwNDwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwNDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwNCgpIHsKLQkJaWYgKGdyb3VwNCA9PSBudWxsKSB7Ci0JCQlncm91cDQgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fR1JPVVA0KTsKLQkJfQotCQlyZXR1cm4gZ3JvdXA0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEJhc2VQcm9jZXNzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXA0KCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwNCgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQ6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXA0KCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDQoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0JBU0VfUFJPQ0VTUzoKLQkJCQlyZXR1cm4gZ2V0QmFzZVByb2Nlc3MoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQ6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwNCgpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1M6Ci0JCQkJZ2V0QmFzZVByb2Nlc3MoKS5jbGVhcigpOwotCQkJCWdldEJhc2VQcm9jZXNzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlnZXRHcm91cDQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1M6Ci0JCQkJZ2V0QmFzZVByb2Nlc3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEVfX0dST1VQNDoKLQkJCQlyZXR1cm4gZ3JvdXA0ICE9IG51bGwgJiYgIWdyb3VwNC5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURV9fQkFTRV9QUk9DRVNTOgotCQkJCXJldHVybiAhZ2V0QmFzZVByb2Nlc3MoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwNCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Byb2Nlc3NQbGFubmluZ1RlbXBsYXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JlcG9ydEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwYjU1MS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXBvcnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlcG9ydEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcG9ydDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBSZXBvcnQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXBvcnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5SRVBPUlQ7Ci0JfQotCi19IC8vUmVwb3J0SW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9SZXVzYWJsZUFzc2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzM1N2QyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JldXNhYmxlQXNzZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJldXNhYmxlQXNzZXRJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UmV1c2FibGUgQXNzZXQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXVzYWJsZUFzc2V0SW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJldXNhYmxlQXNzZXQgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXVzYWJsZUFzc2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUkVVU0FCTEVfQVNTRVQ7Ci0JfQotCi19IC8vUmV1c2FibGVBc3NldEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9hZG1hcEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVlMTlkYy4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2FkbWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2FkbWFwSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvYWRtYXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSb2FkbWFwSW1wbCBleHRlbmRzIEd1aWRhbmNlSW1wbCBpbXBsZW1lbnRzIFJvYWRtYXAgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2FkbWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9BRE1BUDsKLQl9Ci0KLX0gLy9Sb2FkbWFwSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4MmNhMS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzIDxlbT5Bc3NpZ25tZW50IEFwcHJvYWNoZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZURlc2NyaXB0aW9uSW1wbCNnZXRTa2lsbHMgPGVtPlNraWxsczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRpb25JbXBsI2dldFN5bm9ueW1zIDxlbT5TeW5vbnltczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdGlvbkltcGwgZXh0ZW5kcyBDb250ZW50RGVzY3JpcHRpb25JbXBsIGltcGxlbWVudHMgUm9sZURlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKSA8ZW0+QXNzaWdubWVudCBBcHByb2FjaGVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTSUdOTUVOVF9BUFBST0FDSEVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFzc2lnbm1lbnRBcHByb2FjaGVzKCkgPGVtPkFzc2lnbm1lbnQgQXBwcm9hY2hlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXNzaWdubWVudEFwcHJvYWNoZXMgPSBBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2tpbGxzKCkgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lMTFNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2tpbGxzKCkgPGVtPlNraWxsczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2tpbGxzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNraWxscyA9IFNLSUxMU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeW5vbnltcygpIDxlbT5TeW5vbnltczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3lub255bXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZTk9OWU1TX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5bm9ueW1zKCkgPGVtPlN5bm9ueW1zPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTeW5vbnltcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzeW5vbnltcyA9IFNZTk9OWU1TX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJvbGVEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRJT047Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBc3NpZ25tZW50QXBwcm9hY2hlcygpIHsKLQkJcmV0dXJuIGFzc2lnbm1lbnRBcHByb2FjaGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFzc2lnbm1lbnRBcHByb2FjaGVzKFN0cmluZyBuZXdBc3NpZ25tZW50QXBwcm9hY2hlcykgewotCQlTdHJpbmcgb2xkQXNzaWdubWVudEFwcHJvYWNoZXMgPSBhc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJYXNzaWdubWVudEFwcHJvYWNoZXMgPSBuZXdBc3NpZ25tZW50QXBwcm9hY2hlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVMsIG9sZEFzc2lnbm1lbnRBcHByb2FjaGVzLCBhc3NpZ25tZW50QXBwcm9hY2hlcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2tpbGxzKCkgewotCQlyZXR1cm4gc2tpbGxzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNraWxscyhTdHJpbmcgbmV3U2tpbGxzKSB7Ci0JCVN0cmluZyBvbGRTa2lsbHMgPSBza2lsbHM7Ci0JCXNraWxscyA9IG5ld1NraWxsczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFMsIG9sZFNraWxscywgc2tpbGxzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeW5vbnltcygpIHsKLQkJcmV0dXJuIHN5bm9ueW1zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5bm9ueW1zKFN0cmluZyBuZXdTeW5vbnltcykgewotCQlTdHJpbmcgb2xkU3lub255bXMgPSBzeW5vbnltczsKLQkJc3lub255bXMgPSBuZXdTeW5vbnltczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUywgb2xkU3lub255bXMsIHN5bm9ueW1zKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlyZXR1cm4gZ2V0QXNzaWdubWVudEFwcHJvYWNoZXMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJcmV0dXJuIGdldFNraWxscygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXJldHVybiBnZXRTeW5vbnltcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTOgotCQkJCXNldEFzc2lnbm1lbnRBcHByb2FjaGVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJc2V0U2tpbGxzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUzoKLQkJCQlzZXRTeW5vbnltcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX0FTU0lHTk1FTlRfQVBQUk9BQ0hFUzoKLQkJCQlzZXRBc3NpZ25tZW50QXBwcm9hY2hlcyhBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJc2V0U2tpbGxzKFNLSUxMU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXNldFN5bm9ueW1zKFNZTk9OWU1TX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19BU1NJR05NRU5UX0FQUFJPQUNIRVM6Ci0JCQkJcmV0dXJuIEFTU0lHTk1FTlRfQVBQUk9BQ0hFU19FREVGQVVMVCA9PSBudWxsID8gYXNzaWdubWVudEFwcHJvYWNoZXMgIT0gbnVsbCA6ICFBU1NJR05NRU5UX0FQUFJPQUNIRVNfRURFRkFVTFQuZXF1YWxzKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OX19TS0lMTFM6Ci0JCQkJcmV0dXJuIFNLSUxMU19FREVGQVVMVCA9PSBudWxsID8gc2tpbGxzICE9IG51bGwgOiAhU0tJTExTX0VERUZBVUxULmVxdWFscyhza2lsbHMpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRJT05fX1NZTk9OWU1TOgotCQkJCXJldHVybiBTWU5PTllNU19FREVGQVVMVCA9PSBudWxsID8gc3lub255bXMgIT0gbnVsbCA6ICFTWU5PTllNU19FREVGQVVMVC5lcXVhbHMoc3lub255bXMpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYXNzaWdubWVudEFwcHJvYWNoZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFzc2lnbm1lbnRBcHByb2FjaGVzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBza2lsbHM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNraWxscyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3lub255bXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHN5bm9ueW1zKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVEZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGVmZjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlRGVzY3JpcHRvckltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRURhdGFUeXBlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRGVzY3JpcHRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0Um9sZSA8ZW0+Um9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlRGVzY3JpcHRvckltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVEZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMgUm9sZURlc2NyaXB0b3IgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb2xlKCkgPGVtPlJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZSgpIDxlbT5Sb2xlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJvbGUgPSBST0xFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVGb3IoKSA8ZW0+UmVzcG9uc2libGUgRm9yPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlRm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiByZXNwb25zaWJsZUZvcjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlRGVzY3JpcHRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlJPTEVfREVTQ1JJUFRPUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJvbGUoKSB7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvbGUoU3RyaW5nIG5ld1JvbGUpIHsKLQkJU3RyaW5nIG9sZFJvbGUgPSByb2xlOwotCQlyb2xlID0gbmV3Um9sZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEUsIG9sZFJvbGUsIHJvbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJaWYgKHJlc3BvbnNpYmxlRm9yID09IG51bGwpIHsKLQkJCXJlc3BvbnNpYmxlRm9yID0gbmV3IEVEYXRhVHlwZUVMaXN0PFN0cmluZz4oU3RyaW5nLmNsYXNzLCB0aGlzLCBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SKTsKLQkJfQotCQlyZXR1cm4gcmVzcG9uc2libGVGb3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlyZXR1cm4gZ2V0Um9sZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCXJldHVybiBnZXRSZXNwb25zaWJsZUZvcigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUk9MRToKLQkJCQlzZXRSb2xlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVzcG9uc2libGVGb3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SX19ST0xFOgotCQkJCXNldFJvbGUoUk9MRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JPTEU6Ci0JCQkJcmV0dXJuIFJPTEVfRURFRkFVTFQgPT0gbnVsbCA/IHJvbGUgIT0gbnVsbCA6ICFST0xFX0VERUZBVUxULmVxdWFscyhyb2xlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlyZXR1cm4gcmVzcG9uc2libGVGb3IgIT0gbnVsbCAmJiAhcmVzcG9uc2libGVGb3IuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocm9sZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocm9sZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzcG9uc2libGVGb3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3BvbnNpYmxlRm9yKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZURlc2NyaXB0b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzE3N2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvUm9sZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJvbGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZUltcGwjZ2V0UmVzcG9uc2libGVGb3IgPGVtPlJlc3BvbnNpYmxlIEZvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJvbGVJbXBsIGV4dGVuZHMgQ29udGVudEVsZW1lbnRJbXBsIGltcGxlbWVudHMgUm9sZSB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlJPTEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRSZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5ST0xFX19SRVNQT05TSUJMRV9GT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDIoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19SRVNQT05TSUJMRV9GT1I6Ci0JCQkJcmV0dXJuIGdldFJlc3BvbnNpYmxlRm9yKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlnZXRSZXNwb25zaWJsZUZvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJZ2V0R3JvdXAyKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9fUkVTUE9OU0lCTEVfRk9SOgotCQkJCWdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfX1JFU1BPTlNJQkxFX0ZPUjoKLQkJCQlyZXR1cm4gIWdldFJlc3BvbnNpYmxlRm9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Sb2xlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRHcm91cGluZ0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzZDA5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlU2V0R3JvdXBpbmdJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBTZXQgR3JvdXBpbmc8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuUm9sZVNldEdyb3VwaW5nSW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0R3JvdXBpbmdJbXBsI2dldFJvbGVTZXQgPGVtPlJvbGUgU2V0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEdyb3VwaW5nSW1wbCBleHRlbmRzIENvbnRlbnRDYXRlZ29yeUltcGwgaW1wbGVtZW50cyBSb2xlU2V0R3JvdXBpbmcgewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUm9sZVNldEdyb3VwaW5nSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvbGVTZXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJcmV0dXJuIGdldFJvbGVTZXQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUOgotCQkJCWdldFJvbGVTZXQoKS5jbGVhcigpOwotCQkJCWdldFJvbGVTZXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQ6Ci0JCQkJZ2V0Um9sZVNldCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMjoKLQkJCQlyZXR1cm4gZ3JvdXAyICE9IG51bGwgJiYgIWdyb3VwMi5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkdfX1JPTEVfU0VUOgotCQkJCXJldHVybiAhZ2V0Um9sZVNldCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vUm9sZVNldEdyb3VwaW5nSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Sb2xlU2V0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQ1NmUwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1JvbGVTZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSb2xlU2V0SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIFNldDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Sb2xlU2V0SW1wbCNnZXRSb2xlIDxlbT5Sb2xlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUm9sZVNldEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgUm9sZVNldCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSb2xlU2V0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9TRVRfX1JPTEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19HUk9VUDI6Ci0JCQkJaWYgKGNvcmVUeXBlKSByZXR1cm4gZ2V0R3JvdXAyKCk7Ci0JCQkJcmV0dXJuICgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuZ2V0V3JhcHBlcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfU0VUX19ST0xFOgotCQkJCWdldFJvbGUoKS5jbGVhcigpOwotCQkJCWdldFJvbGUoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRToKLQkJCQlnZXRSb2xlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9fUk9MRToKLQkJCQlyZXR1cm4gIWdldFJvbGUoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChncm91cDI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1JvbGVTZXRJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1NlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMmNhZWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU2VjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlY3Rpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0U3ViU2VjdGlvbiA8ZW0+U3ViIFNlY3Rpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5TZWN0aW9uSW1wbCNnZXRTZWN0aW9uTmFtZSA8ZW0+U2VjdGlvbiBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlNlY3Rpb25JbXBsI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuU2VjdGlvbkltcGwjZ2V0VmFyaWFiaWxpdHlUeXBlIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkltcGwgZXh0ZW5kcyBNZXRob2RFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFNlY3Rpb24gewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN1YlNlY3Rpb24oKSA8ZW0+U3ViIFNlY3Rpb248L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN1YlNlY3Rpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uIHN1YlNlY3Rpb247Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlZGVjZXNzb3IoKSA8ZW0+UHJlZGVjZXNzb3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWRlY2Vzc29yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVERUNFU1NPUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVkZWNlc3NvcigpIDxlbT5QcmVkZWNlc3NvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlZGVjZXNzb3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlZGVjZXNzb3IgPSBQUkVERUNFU1NPUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY3Rpb25OYW1lKCkgPGVtPlNlY3Rpb24gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VjdGlvbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1RJT05fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWN0aW9uTmFtZSgpIDxlbT5TZWN0aW9uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY3Rpb25OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNlY3Rpb25OYW1lID0gU0VDVElPTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSA8ZW0+VmFyaWFiaWxpdHkgQmFzZWQgT24gRWxlbWVudDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCkgPGVtPlZhcmlhYmlsaXR5IEJhc2VkIE9uIEVsZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCA9IFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFyaWFiaWxpdHlUeXBlKCkgPGVtPlZhcmlhYmlsaXR5IFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmlsaXR5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBWYXJpYWJpbGl0eVR5cGUgVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVCA9IFZhcmlhYmlsaXR5VHlwZS5OQTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmlsaXR5VHlwZSgpIDxlbT5WYXJpYWJpbGl0eSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYXJpYWJpbGl0eVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBWYXJpYWJpbGl0eVR5cGUgdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgVmFyaWFiaWxpdHkgVHlwZSBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuU0VDVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBnZXRTdWJTZWN0aW9uKCkgewotCQlyZXR1cm4gc3ViU2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdWJTZWN0aW9uKFNlY3Rpb24gbmV3U3ViU2VjdGlvbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlTZWN0aW9uIG9sZFN1YlNlY3Rpb24gPSBzdWJTZWN0aW9uOwotCQlzdWJTZWN0aW9uID0gbmV3U3ViU2VjdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgb2xkU3ViU2VjdGlvbiwgbmV3U3ViU2VjdGlvbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3ViU2VjdGlvbihTZWN0aW9uIG5ld1N1YlNlY3Rpb24pIHsKLQkJaWYgKG5ld1N1YlNlY3Rpb24gIT0gc3ViU2VjdGlvbikgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3ViU2VjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzdWJTZWN0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3ViU2VjdGlvbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdWJTZWN0aW9uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTdWJTZWN0aW9uKG5ld1N1YlNlY3Rpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTiwgbmV3U3ViU2VjdGlvbiwgbmV3U3ViU2VjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiBwcmVkZWNlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVkZWNlc3NvcihTdHJpbmcgbmV3UHJlZGVjZXNzb3IpIHsKLQkJU3RyaW5nIG9sZFByZWRlY2Vzc29yID0gcHJlZGVjZXNzb3I7Ci0JCXByZWRlY2Vzc29yID0gbmV3UHJlZGVjZXNzb3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1IsIG9sZFByZWRlY2Vzc29yLCBwcmVkZWNlc3NvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBzZWN0aW9uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmcgbmV3U2VjdGlvbk5hbWUpIHsKLQkJU3RyaW5nIG9sZFNlY3Rpb25OYW1lID0gc2VjdGlvbk5hbWU7Ci0JCXNlY3Rpb25OYW1lID0gbmV3U2VjdGlvbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FLCBvbGRTZWN0aW9uTmFtZSwgc2VjdGlvbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoU3RyaW5nIG5ld1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQpIHsKLQkJU3RyaW5nIG9sZFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgPSB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50OwotCQl2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50ID0gbmV3VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5ULCBvbGRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50LCB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBnZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFiaWxpdHlUeXBlKFZhcmlhYmlsaXR5VHlwZSBuZXdWYXJpYWJpbGl0eVR5cGUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJdmFyaWFiaWxpdHlUeXBlID0gbmV3VmFyaWFiaWxpdHlUeXBlID09IG51bGwgPyBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxUIDogbmV3VmFyaWFiaWxpdHlUeXBlOwotCQlib29sZWFuIG9sZFZhcmlhYmlsaXR5VHlwZUVTZXQgPSB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCQl2YXJpYWJpbGl0eVR5cGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFLCBvbGRWYXJpYWJpbGl0eVR5cGUsIHZhcmlhYmlsaXR5VHlwZSwgIW9sZFZhcmlhYmlsaXR5VHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIG9sZFZhcmlhYmlsaXR5VHlwZSA9IHZhcmlhYmlsaXR5VHlwZTsKLQkJYm9vbGVhbiBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0ID0gdmFyaWFiaWxpdHlUeXBlRVNldDsKLQkJdmFyaWFiaWxpdHlUeXBlID0gVkFSSUFCSUxJVFlfVFlQRV9FREVGQVVMVDsKLQkJdmFyaWFiaWxpdHlUeXBlRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfVFlQRSwgb2xkVmFyaWFiaWxpdHlUeXBlLCBWQVJJQUJJTElUWV9UWVBFX0VERUZBVUxULCBvbGRWYXJpYWJpbGl0eVR5cGVFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRWYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiB2YXJpYWJpbGl0eVR5cGVFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdWJTZWN0aW9uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJcmV0dXJuIGdldFN1YlNlY3Rpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gZ2V0UHJlZGVjZXNzb3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TRUNUSU9OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlY3Rpb25OYW1lKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVDoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJc2V0U3ViU2VjdGlvbigoU2VjdGlvbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXNldFByZWRlY2Vzc29yKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU0VDVElPTl9OQU1FOgotCQkJCXNldFNlY3Rpb25OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJc2V0VmFyaWFiaWxpdHlUeXBlKChWYXJpYWJpbGl0eVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fU1VCX1NFQ1RJT046Ci0JCQkJc2V0U3ViU2VjdGlvbigoU2VjdGlvbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTl9fUFJFREVDRVNTT1I6Ci0JCQkJc2V0UHJlZGVjZXNzb3IoUFJFREVDRVNTT1JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlzZXRTZWN0aW9uTmFtZShTRUNUSU9OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UOgotCQkJCXNldFZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX1RZUEU6Ci0JCQkJdW5zZXRWYXJpYWJpbGl0eVR5cGUoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19TVUJfU0VDVElPTjoKLQkJCQlyZXR1cm4gc3ViU2VjdGlvbiAhPSBudWxsOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1BSRURFQ0VTU09SOgotCQkJCXJldHVybiBQUkVERUNFU1NPUl9FREVGQVVMVCA9PSBudWxsID8gcHJlZGVjZXNzb3IgIT0gbnVsbCA6ICFQUkVERUNFU1NPUl9FREVGQVVMVC5lcXVhbHMocHJlZGVjZXNzb3IpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1NFQ1RJT05fTkFNRToKLQkJCQlyZXR1cm4gU0VDVElPTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBzZWN0aW9uTmFtZSAhPSBudWxsIDogIVNFQ1RJT05fTkFNRV9FREVGQVVMVC5lcXVhbHMoc2VjdGlvbk5hbWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT05fX1ZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlQ6Ci0JCQkJcmV0dXJuIFZBUklBQklMSVRZX0JBU0VEX09OX0VMRU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgIT0gbnVsbCA6ICFWQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UX0VERUZBVUxULmVxdWFscyh2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KTsKLQkJCWNhc2UgVW1hUGFja2FnZS5TRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBpc1NldFZhcmlhYmlsaXR5VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlZGVjZXNzb3I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWRlY2Vzc29yKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY3Rpb25OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZWN0aW9uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFyaWFiaWxpdHlUeXBlOiAiKTsKLQkJaWYgKHZhcmlhYmlsaXR5VHlwZUVTZXQpIHJlc3VsdC5hcHBlbmQodmFyaWFiaWxpdHlUeXBlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1NlY3Rpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGE0MmZiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU3VwcG9ydGluZ01hdGVyaWFsSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3VwcG9ydGluZyBNYXRlcmlhbDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFN1cHBvcnRpbmdNYXRlcmlhbEltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBTdXBwb3J0aW5nTWF0ZXJpYWwgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdXBwb3J0aW5nTWF0ZXJpYWxJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5TVVBQT1JUSU5HX01BVEVSSUFMOwotCX0KLQotfSAvL1N1cHBvcnRpbmdNYXRlcmlhbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NzcyY2QuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGFza0Rlc2NyaXB0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRhc2sgRGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0aW9uSW1wbCNnZXRBbHRlcm5hdGl2ZXMgPGVtPkFsdGVybmF0aXZlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRpb25JbXBsI2dldFB1cnBvc2UgPGVtPlB1cnBvc2U8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrRGVzY3JpcHRpb25JbXBsIGV4dGVuZHMgQ29udGVudERlc2NyaXB0aW9uSW1wbCBpbXBsZW1lbnRzIFRhc2tEZXNjcmlwdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxURVJOQVRJVkVTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsdGVybmF0aXZlcygpIDxlbT5BbHRlcm5hdGl2ZXM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsdGVybmF0aXZlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbHRlcm5hdGl2ZXMgPSBBTFRFUk5BVElWRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVJQT1NFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1cnBvc2UoKSA8ZW0+UHVycG9zZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHVycG9zZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwdXJwb3NlID0gUFVSUE9TRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUYXNrRGVzY3JpcHRpb25JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUSU9OOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gYWx0ZXJuYXRpdmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsdGVybmF0aXZlcyhTdHJpbmcgbmV3QWx0ZXJuYXRpdmVzKSB7Ci0JCVN0cmluZyBvbGRBbHRlcm5hdGl2ZXMgPSBhbHRlcm5hdGl2ZXM7Ci0JCWFsdGVybmF0aXZlcyA9IG5ld0FsdGVybmF0aXZlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMsIG9sZEFsdGVybmF0aXZlcywgYWx0ZXJuYXRpdmVzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdXJwb3NlKCkgewotCQlyZXR1cm4gcHVycG9zZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXJwb3NlKFN0cmluZyBuZXdQdXJwb3NlKSB7Ci0JCVN0cmluZyBvbGRQdXJwb3NlID0gcHVycG9zZTsKLQkJcHVycG9zZSA9IG5ld1B1cnBvc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVM6Ci0JCQkJcmV0dXJuIGdldEFsdGVybmF0aXZlcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJcmV0dXJuIGdldFB1cnBvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0U6Ci0JCQkJc2V0UHVycG9zZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlzZXRBbHRlcm5hdGl2ZXMoQUxURVJOQVRJVkVTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRJT05fX0FMVEVSTkFUSVZFUzoKLQkJCQlyZXR1cm4gQUxURVJOQVRJVkVTX0VERUZBVUxUID09IG51bGwgPyBhbHRlcm5hdGl2ZXMgIT0gbnVsbCA6ICFBTFRFUk5BVElWRVNfRURFRkFVTFQuZXF1YWxzKGFsdGVybmF0aXZlcyk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWx0ZXJuYXRpdmVzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhbHRlcm5hdGl2ZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrRGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGFza0Rlc2NyaXB0b3JJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmMDJkNC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrRGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRhc2tEZXNjcmlwdG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzayBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRUYXNrIDxlbT5UYXNrPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSA8ZW0+UGVyZm9ybWVkIFByaW1hcmlseSBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0R3JvdXAzIDxlbT5Hcm91cDM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IDxlbT5BZGRpdGlvbmFsbHkgUGVyZm9ybWVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRBc3Npc3RlZEJ5IDxlbT5Bc3Npc3RlZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0RXh0ZXJuYWxJbnB1dCA8ZW0+RXh0ZXJuYWwgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE1hbmRhdG9yeUlucHV0IDxlbT5NYW5kYXRvcnkgSW5wdXQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0Rlc2NyaXB0b3JJbXBsI2dldE9wdGlvbmFsSW5wdXQgPGVtPk9wdGlvbmFsIElucHV0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tEZXNjcmlwdG9ySW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjZ2V0U3RlcCA8ZW0+U3RlcDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrRGVzY3JpcHRvckltcGwjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdG9ySW1wbCBleHRlbmRzIFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRhc2tEZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFzaygpIDxlbT5UYXNrPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXNrKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhc2soKSA8ZW0+VGFzazwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFzaygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB0YXNrID0gVEFTS19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpIDxlbT5QZXJmb3JtZWQgUHJpbWFyaWx5IEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwZXJmb3JtZWRQcmltYXJpbHlCeSA9IFBFUkZPUk1FRF9QUklNQVJJTFlfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDMoKSA8ZW0+R3JvdXAzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RlcCgpIDxlbT5TdGVwPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0ZXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTZWN0aW9uPiBzdGVwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgPGVtPklzIFN5bmNocm9uaXplZCBXaXRoIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgU3luY2hyb25pemVkIFdpdGggU291cmNlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRhc2tEZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19ERVNDUklQVE9SOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFzayhTdHJpbmcgbmV3VGFzaykgewotCQlTdHJpbmcgb2xkVGFzayA9IHRhc2s7Ci0JCXRhc2sgPSBuZXdUYXNrOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSywgb2xkVGFzaywgdGFzaykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCXJldHVybiBwZXJmb3JtZWRQcmltYXJpbHlCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQZXJmb3JtZWRQcmltYXJpbHlCeShTdHJpbmcgbmV3UGVyZm9ybWVkUHJpbWFyaWx5QnkpIHsKLQkJU3RyaW5nIG9sZFBlcmZvcm1lZFByaW1hcmlseUJ5ID0gcGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0JCXBlcmZvcm1lZFByaW1hcmlseUJ5ID0gbmV3UGVyZm9ybWVkUHJpbWFyaWx5Qnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZLCBvbGRQZXJmb3JtZWRQcmltYXJpbHlCeSwgcGVyZm9ybWVkUHJpbWFyaWx5QnkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDMoKSB7Ci0JCWlmIChncm91cDMgPT0gbnVsbCkgewotCQkJZ3JvdXAzID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0QXNzaXN0ZWRCeSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFeHRlcm5hbElucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE1hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRPcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAzKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE91dHB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMygpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFNlY3Rpb24+IGdldFN0ZXAoKSB7Ci0JCWlmIChzdGVwID09IG51bGwpIHsKLQkJCXN0ZXAgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U2VjdGlvbj4oU2VjdGlvbi5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1NURVApOwotCQl9Ci0JCXJldHVybiBzdGVwOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZShib29sZWFuIG5ld0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSkgewotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZSA9IGlzU3luY2hyb25pemVkV2l0aFNvdXJjZTsKLQkJaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gbmV3SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRSwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlLCBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsICFvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdW5zZXRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UoKSB7Ci0JCWJvb2xlYW4gb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlID0gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOwotCQlib29sZWFuIG9sZElzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2VFU2V0OwotCQlpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UgPSBJU19TWU5DSFJPTklaRURfV0lUSF9TT1VSQ0VfRURFRkFVTFQ7Ci0JCWlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFLCBvbGRJc1N5bmNocm9uaXplZFdpdGhTb3VyY2UsIElTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRV9FREVGQVVMVCwgb2xkSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCkgewotCQlyZXR1cm4gaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRHcm91cDMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUDoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN0ZXAoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19UQVNLOgotCQkJCXJldHVybiBnZXRUYXNrKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXJldHVybiBnZXRQZXJmb3JtZWRQcmltYXJpbHlCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMygpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWToKLQkJCQlyZXR1cm4gZ2V0QXNzaXN0ZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsSW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJcmV0dXJuIGdldE91dHB1dCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUDoKLQkJCQlyZXR1cm4gZ2V0U3RlcCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1RBU0s6Ci0JCQkJc2V0VGFzaygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19QRVJGT1JNRURfUFJJTUFSSUxZX0JZOgotCQkJCXNldFBlcmZvcm1lZFByaW1hcmlseUJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0dST1VQMzoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAzKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0FTU0lTVEVEX0JZOgotCQkJCWdldEFzc2lzdGVkQnkoKS5jbGVhcigpOwotCQkJCWdldEFzc2lzdGVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0VYVEVSTkFMX0lOUFVUOgotCQkJCWdldEV4dGVybmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldEV4dGVybmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVDoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX09VVFBVVDoKLQkJCQlnZXRPdXRwdXQoKS5jbGVhcigpOwotCQkJCWdldE91dHB1dCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fU1RFUDoKLQkJCQlnZXRTdGVwKCkuY2xlYXIoKTsKLQkJCQlnZXRTdGVwKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTZWN0aW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlzZXRUYXNrKFRBU0tfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX1BFUkZPUk1FRF9QUklNQVJJTFlfQlk6Ci0JCQkJc2V0UGVyZm9ybWVkUHJpbWFyaWx5QnkoUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzOgotCQkJCWdldEdyb3VwMygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJZ2V0QXNzaXN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCWdldFN0ZXAoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUT1JfX0lTX1NZTkNIUk9OSVpFRF9XSVRIX1NPVVJDRToKLQkJCQl1bnNldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fVEFTSzoKLQkJCQlyZXR1cm4gVEFTS19FREVGQVVMVCA9PSBudWxsID8gdGFzayAhPSBudWxsIDogIVRBU0tfRURFRkFVTFQuZXF1YWxzKHRhc2spOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWToKLQkJCQlyZXR1cm4gUEVSRk9STUVEX1BSSU1BUklMWV9CWV9FREVGQVVMVCA9PSBudWxsID8gcGVyZm9ybWVkUHJpbWFyaWx5QnkgIT0gbnVsbCA6ICFQRVJGT1JNRURfUFJJTUFSSUxZX0JZX0VERUZBVUxULmVxdWFscyhwZXJmb3JtZWRQcmltYXJpbHlCeSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19HUk9VUDM6Ci0JCQkJcmV0dXJuIGdyb3VwMyAhPSBudWxsICYmICFncm91cDMuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gIWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fQVNTSVNURURfQlk6Ci0JCQkJcmV0dXJuICFnZXRBc3Npc3RlZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRFeHRlcm5hbElucHV0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0TWFuZGF0b3J5SW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVDoKLQkJCQlyZXR1cm4gIWdldE9wdGlvbmFsSW5wdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19PVVRQVVQ6Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SX19TVEVQOgotCQkJCXJldHVybiBzdGVwICE9IG51bGwgJiYgIXN0ZXAuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFOgotCQkJCXJldHVybiBpc1NldElzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodGFzazogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFzayk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGVyZm9ybWVkUHJpbWFyaWx5Qnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBlcmZvcm1lZFByaW1hcmlseUJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBncm91cDM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdyb3VwMyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlOiAiKTsKLQkJaWYgKGlzU3luY2hyb25pemVkV2l0aFNvdXJjZUVTZXQpIHJlc3VsdC5hcHBlbmQoaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKTsgZWxzZSByZXN1bHQuYXBwZW5kKCI8dW5zZXQ+Iik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1Rhc2tEZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UYXNrSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2JkMTFiLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rhc2tJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUYXNrSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFzazwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRQcmVjb25kaXRpb24gPGVtPlByZWNvbmRpdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFBlcmZvcm1lZEJ5IDxlbT5QZXJmb3JtZWQgQnk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0TWFuZGF0b3J5SW5wdXQgPGVtPk1hbmRhdG9yeSBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRPdXRwdXQgPGVtPk91dHB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSA8ZW0+QWRkaXRpb25hbGx5IFBlcmZvcm1lZCBCeTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRPcHRpb25hbElucHV0IDxlbT5PcHRpb25hbCBJbnB1dDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UYXNrSW1wbCNnZXRFc3RpbWF0ZSA8ZW0+RXN0aW1hdGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGFza0ltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRhc2tJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGFza0ltcGwgZXh0ZW5kcyBDb250ZW50RWxlbWVudEltcGwgaW1wbGVtZW50cyBUYXNrIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY29uZGl0aW9uKCkgPGVtPlByZWNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWNvbmRpdGlvbiA9IFBSRUNPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0Y29uZGl0aW9uKCkgPGVtPlBvc3Rjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBvc3Rjb25kaXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RDT05ESVRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBvc3Rjb25kaXRpb24gPSBQT1NUQ09ORElUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGVyZm9ybWVkQnkoKSA8ZW0+UGVyZm9ybWVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcmZvcm1lZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBwZXJmb3JtZWRCeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwMigpIDxlbT5Hcm91cDI8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R3JvdXAyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmVhdHVyZU1hcCBncm91cDI7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVGFza0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwcmVjb25kaXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlY29uZGl0aW9uKFN0cmluZyBuZXdQcmVjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFByZWNvbmRpdGlvbiA9IHByZWNvbmRpdGlvbjsKLQkJcHJlY29uZGl0aW9uID0gbmV3UHJlY29uZGl0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLlRBU0tfX1BSRUNPTkRJVElPTiwgb2xkUHJlY29uZGl0aW9uLCBwcmVjb25kaXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiBwb3N0Y29uZGl0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3Rjb25kaXRpb24oU3RyaW5nIG5ld1Bvc3Rjb25kaXRpb24pIHsKLQkJU3RyaW5nIG9sZFBvc3Rjb25kaXRpb24gPSBwb3N0Y29uZGl0aW9uOwotCQlwb3N0Y29uZGl0aW9uID0gbmV3UG9zdGNvbmRpdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UGVyZm9ybWVkQnkoKSB7Ci0JCWlmIChwZXJmb3JtZWRCeSA9PSBudWxsKSB7Ci0JCQlwZXJmb3JtZWRCeSA9IG5ldyBFRGF0YVR5cGVFTGlzdDxTdHJpbmc+KFN0cmluZy5jbGFzcywgdGhpcywgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlkpOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRCeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNYW5kYXRvcnlJbnB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE91dHB1dCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19PVVRQVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0FERElUSU9OQUxMWV9QRVJGT1JNRURfQlkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXQoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEVzdGltYXRlKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRBU0tfX0VTVElNQVRFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0VG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5UQVNLX19UT09MX01FTlRPUik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFByZWNvbmRpdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QRVJGT1JNRURfQlk6Ci0JCQkJcmV0dXJuIGdldFBlcmZvcm1lZEJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuIGdldE1hbmRhdG9yeUlucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJCXJldHVybiBnZXRPdXRwdXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiBnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiBnZXRPcHRpb25hbElucHV0KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVEU6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QUkVDT05ESVRJT046Ci0JCQkJc2V0UHJlY29uZGl0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCWdldE1hbmRhdG9yeUlucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fT1VUUFVUOgotCQkJCWdldE91dHB1dCgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0cHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PUFRJT05BTF9JTlBVVDoKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuY2xlYXIoKTsKLQkJCQlnZXRPcHRpb25hbElucHV0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUzoKLQkJCQlnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCWdldFRvb2xNZW50b3IoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbihQUkVDT05ESVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oUE9TVENPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJZ2V0TWFuZGF0b3J5SW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJZ2V0T3V0cHV0KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlnZXRBZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCWdldE9wdGlvbmFsSW5wdXQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlnZXRFc3RpbWF0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBQUkVDT05ESVRJT05fRURFRkFVTFQgPT0gbnVsbCA/IHByZWNvbmRpdGlvbiAhPSBudWxsIDogIVBSRUNPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocHJlY29uZGl0aW9uKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19QT1NUQ09ORElUSU9OOgotCQkJCXJldHVybiBQT1NUQ09ORElUSU9OX0VERUZBVUxUID09IG51bGwgPyBwb3N0Y29uZGl0aW9uICE9IG51bGwgOiAhUE9TVENPTkRJVElPTl9FREVGQVVMVC5lcXVhbHMocG9zdGNvbmRpdGlvbik7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fUEVSRk9STUVEX0JZOgotCQkJCXJldHVybiBwZXJmb3JtZWRCeSAhPSBudWxsICYmICFwZXJmb3JtZWRCeS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19NQU5EQVRPUllfSU5QVVQ6Ci0JCQkJcmV0dXJuICFnZXRNYW5kYXRvcnlJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19PVVRQVVQ6Ci0JCQkJcmV0dXJuICFnZXRPdXRwdXQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWToKLQkJCQlyZXR1cm4gIWdldEFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX09QVElPTkFMX0lOUFVUOgotCQkJCXJldHVybiAhZ2V0T3B0aW9uYWxJbnB1dCgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX19FU1RJTUFURToKLQkJCQlyZXR1cm4gIWdldEVzdGltYXRlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuICFnZXRFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuICFnZXRUb29sTWVudG9yKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlY29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvc3Rjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvc3Rjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBlcmZvcm1lZEJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwZXJmb3JtZWRCeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9UYXNrSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1RlYW1Qcm9maWxlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmYyYTYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVhbVByb2ZpbGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUZWFtUHJvZmlsZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlYW0gUHJvZmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFJvbGUgPGVtPlJvbGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuVGVhbVByb2ZpbGVJbXBsI2dldFN1cGVyVGVhbSA8ZW0+U3VwZXIgVGVhbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5UZWFtUHJvZmlsZUltcGwjZ2V0U3ViVGVhbSA8ZW0+U3ViIFRlYW08L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZWFtUHJvZmlsZUltcGwgZXh0ZW5kcyBCcmVha2Rvd25FbGVtZW50SW1wbCBpbXBsZW1lbnRzIFRlYW1Qcm9maWxlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZWFtUHJvZmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldFJvbGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19ST0xFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdXBlclRlYW0oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRTdWJUZWFtKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19ST0xFOgotCQkJCXJldHVybiBnZXRSb2xlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19TVVBFUl9URUFNOgotCQkJCXJldHVybiBnZXRTdXBlclRlYW0oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCXJldHVybiBnZXRTdWJUZWFtKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0Um9sZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCQlnZXRTdXBlclRlYW0oKS5jbGVhcigpOwotCQkJCWdldFN1cGVyVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VCX1RFQU06Ci0JCQkJZ2V0U3ViVGVhbSgpLmNsZWFyKCk7Ci0JCQkJZ2V0U3ViVGVhbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJZ2V0Um9sZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCQlnZXRTdXBlclRlYW0oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCWdldFN1YlRlYW0oKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1JPTEU6Ci0JCQkJcmV0dXJuICFnZXRSb2xlKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTToKLQkJCQlyZXR1cm4gIWdldFN1cGVyVGVhbSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URUFNX1BST0ZJTEVfX1NVQl9URUFNOgotCQkJCXJldHVybiAhZ2V0U3ViVGVhbSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVGVhbVByb2ZpbGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVtcGxhdGVJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczMTA2ZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9UZW1wbGF0ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVGVtcGxhdGVJbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRlbXBsYXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVJbXBsIGV4dGVuZHMgR3VpZGFuY2VJbXBsIGltcGxlbWVudHMgVGVtcGxhdGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wbGF0ZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRFTVBMQVRFOwotCX0KLQotfSAvL1RlbXBsYXRlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rlcm1EZWZpbml0aW9uSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTQ3YWUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVGVybURlZmluaXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFRlcm1EZWZpbml0aW9uSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UZXJtIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXJtRGVmaW5pdGlvbkltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUZXJtRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFRlcm1EZWZpbml0aW9uSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVEVSTV9ERUZJTklUSU9OOwotCX0KLQotfSAvL1Rlcm1EZWZpbml0aW9uSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTViNWFkLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1Rvb2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUb29sSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuQmFzaWNGZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkZlYXR1cmVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ub29sPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLlRvb2xJbXBsI2dldFRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbEltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgVG9vbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBUb29sSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuVE9PTDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZU1hcCBnZXRHcm91cDIoKSB7Ci0JCWlmIChncm91cDIgPT0gbnVsbCkgewotCQkJZ3JvdXAyID0gbmV3IEJhc2ljRmVhdHVyZU1hcCh0aGlzLCBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfX1RPT0xfTUVOVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlnZXRUb29sTWVudG9yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19UT09MX01FTlRPUjoKLQkJCQlnZXRUb29sTWVudG9yKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfX1RPT0xfTUVOVE9SOgotCQkJCXJldHVybiAhZ2V0VG9vbE1lbnRvcigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vVG9vbEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVG9vbE1lbnRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmYzNmMi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Ub29sTWVudG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBUb29sTWVudG9ySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRvb2wgTWVudG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVG9vbE1lbnRvckltcGwgZXh0ZW5kcyBHdWlkYW5jZUltcGwgaW1wbGVtZW50cyBUb29sTWVudG9yIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVG9vbE1lbnRvckltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLlRPT0xfTUVOVE9SOwotCX0KLQotfSAvL1Rvb2xNZW50b3JJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYUZhY3RvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzIxZWYuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvVW1hRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFGYWN0b3J5SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlZhcmlhYmlsaXR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIDxiPkZhY3Rvcnk8L2I+LgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIFVtYUZhY3RvcnkgewotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVtYUZhY3RvcnkgaW5pdCgpIHsKLQkJdHJ5IHsKLQkJCVVtYUZhY3RvcnkgdGhlVW1hRmFjdG9yeSA9IChVbWFGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjUiKTsgCi0JCQlpZiAodGhlVW1hRmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoZVVtYUZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgVW1hRmFjdG9yeUltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQWN0aXZpdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5BUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVBcnRpZmFjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXJ0aWZhY3REZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQnJlYWtkb3duRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkJSRUFLRE9XTl9FTEVNRU5UX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ0FQQUJJTElUWV9QQVRURVJOOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVDaGVja2xpc3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbXBvc2l0ZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29uY2VwdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlNUUkFJTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb25zdHJhaW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRDYXRlZ29yeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfQ0FURUdPUllfUEFDS0FHRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQ29udGVudEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb250ZW50UGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUN1c3RvbUNhdGVnb3J5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUkFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyYWJsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVEZWxpdmVyeVByb2Nlc3MoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklCQUJMRV9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpYmFibGVFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ERVNDUklQVE9SX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ESVNDSVBMSU5FX0dST1VQSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9DVU1FTlRfUk9PVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURvY3VtZW50Um9vdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkRPTUFJTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZURvbWFpbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJTkdfTUVUUklDOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXN0aW1hdGluZ01ldHJpYygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRJT05fQ09OU0lERVJBVElPTlM6IHJldHVybiAoRU9iamVjdCljcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5FWEFNUExFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlRXhhbXBsZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlR3VpZGFuY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlERUxJTkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVHdWlkZWxpbmUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5JVEVSQVRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVJdGVyYXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5LSU5EOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlS2luZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UX1BST1BFUlRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RMaWJyYXJ5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVNZXRob2RQYWNrYWdlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BMVUdJTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1ldGhvZFBsdWdpbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9VTklUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlTWV0aG9kVW5pdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk1JTEVTVE9ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1pbGVzdG9uZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVOYW1lZEVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5PVVRDT01FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlT3V0Y29tZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QSEFTRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBoYXNlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBsYW5uaW5nRGF0YSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJhY3RpY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRV9ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2VzcygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfQ09NUE9ORU5UX0lOVEVSRkFDRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX1BBQ0tBR0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUExBTk5JTkdfVEVNUExBVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJFUE9SVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJlcG9ydCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJFVVNBQkxFX0FTU0VUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUmV1c2FibGVBc3NldCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlJPQURNQVA6IHJldHVybiAoRU9iamVjdCljcmVhdGVSb2FkbWFwKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX0RFU0NSSVBUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZURlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlUm9sZURlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGVTZXQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFX1NFVF9HUk9VUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVJvbGVTZXRHcm91cGluZygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlNFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVTZWN0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6IHJldHVybiAoRU9iamVjdCljcmVhdGVUYXNrKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2tEZXNjcmlwdGlvbigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0tfREVTQ1JJUFRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRhc2tEZXNjcmlwdG9yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVhbVByb2ZpbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVRlbXBsYXRlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVSTV9ERUZJTklUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVGVybURlZmluaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5UT09MOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVG9vbCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0xfTUVOVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlVG9vbE1lbnRvcigpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldISVRFUEFQRVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVXaGl0ZXBhcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya0RlZmluaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya09yZGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlV29ya1Byb2R1Y3QoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3IoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlT2JqZWN0RnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY3JlYXRlV29ya09yZGVyVHlwZU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRXb3JrT3JkZXJUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5WQVJJQUJJTElUWV9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFZhcmlhYmlsaXR5VHlwZU9iamVjdFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9UWVBFX09CSkVDVDoKLQkJCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFjdGl2aXR5IGNyZWF0ZUFjdGl2aXR5KCkgewotCQlBY3Rpdml0eUltcGwgYWN0aXZpdHkgPSBuZXcgQWN0aXZpdHlJbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWN0aXZpdHlEZXNjcmlwdGlvbiBjcmVhdGVBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlBY3Rpdml0eURlc2NyaXB0aW9uSW1wbCBhY3Rpdml0eURlc2NyaXB0aW9uID0gbmV3IEFjdGl2aXR5RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhY3Rpdml0eURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJQXBwbGljYWJsZU1ldGFDbGFzc0luZm9JbXBsIGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvID0gbmV3IEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvSW1wbCgpOwotCQlyZXR1cm4gYXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KCkgewotCQlBcnRpZmFjdEltcGwgYXJ0aWZhY3QgPSBuZXcgQXJ0aWZhY3RJbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXJ0aWZhY3REZXNjcmlwdGlvbiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0aW9uKCkgewotCQlBcnRpZmFjdERlc2NyaXB0aW9uSW1wbCBhcnRpZmFjdERlc2NyaXB0aW9uID0gbmV3IEFydGlmYWN0RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCcmVha2Rvd25FbGVtZW50IGNyZWF0ZUJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnRJbXBsIGJyZWFrZG93bkVsZW1lbnQgPSBuZXcgQnJlYWtkb3duRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oKSB7Ci0JCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uID0gbmV3IEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ2FwYWJpbGl0eVBhdHRlcm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oKSB7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuSW1wbCBjYXBhYmlsaXR5UGF0dGVybiA9IG5ldyBDYXBhYmlsaXR5UGF0dGVybkltcGwoKTsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDaGVja2xpc3QgY3JlYXRlQ2hlY2tsaXN0KCkgewotCQlDaGVja2xpc3RJbXBsIGNoZWNrbGlzdCA9IG5ldyBDaGVja2xpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGVja2xpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVJvbGUgY3JlYXRlQ29tcG9zaXRlUm9sZSgpIHsKLQkJQ29tcG9zaXRlUm9sZUltcGwgY29tcG9zaXRlUm9sZSA9IG5ldyBDb21wb3NpdGVSb2xlSW1wbCgpOwotCQlyZXR1cm4gY29tcG9zaXRlUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29uY2VwdCBjcmVhdGVDb25jZXB0KCkgewotCQlDb25jZXB0SW1wbCBjb25jZXB0ID0gbmV3IENvbmNlcHRJbXBsKCk7Ci0JCXJldHVybiBjb25jZXB0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb25zdHJhaW50IGNyZWF0ZUNvbnN0cmFpbnQoKSB7Ci0JCUNvbnN0cmFpbnRJbXBsIGNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludEltcGwoKTsKLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRDYXRlZ29yeSBjcmVhdGVDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCUNvbnRlbnRDYXRlZ29yeUltcGwgY29udGVudENhdGVnb3J5ID0gbmV3IENvbnRlbnRDYXRlZ29yeUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRDYXRlZ29yeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudENhdGVnb3J5UGFja2FnZSBjcmVhdGVDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkgewotCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlSW1wbCBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlID0gbmV3IENvbnRlbnRDYXRlZ29yeVBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb250ZW50RGVzY3JpcHRpb24gY3JlYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotCQlDb250ZW50RGVzY3JpcHRpb25JbXBsIGNvbnRlbnREZXNjcmlwdGlvbiA9IG5ldyBDb250ZW50RGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBjb250ZW50RGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbnRlbnRFbGVtZW50IGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkgewotCQlDb250ZW50RWxlbWVudEltcGwgY29udGVudEVsZW1lbnQgPSBuZXcgQ29udGVudEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoKSB7Ci0JCUNvbnRlbnRQYWNrYWdlSW1wbCBjb250ZW50UGFja2FnZSA9IG5ldyBDb250ZW50UGFja2FnZUltcGwoKTsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDdXN0b21DYXRlZ29yeSBjcmVhdGVDdXN0b21DYXRlZ29yeSgpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnlJbXBsIGN1c3RvbUNhdGVnb3J5ID0gbmV3IEN1c3RvbUNhdGVnb3J5SW1wbCgpOwotCQlyZXR1cm4gY3VzdG9tQ2F0ZWdvcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJhYmxlIGNyZWF0ZURlbGl2ZXJhYmxlKCkgewotCQlEZWxpdmVyYWJsZUltcGwgZGVsaXZlcmFibGUgPSBuZXcgRGVsaXZlcmFibGVJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBjcmVhdGVEZWxpdmVyYWJsZURlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyYWJsZURlc2NyaXB0aW9uSW1wbCBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gbmV3IERlbGl2ZXJhYmxlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZWxpdmVyeVByb2Nlc3MgY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkgewotCQlEZWxpdmVyeVByb2Nlc3NJbXBsIGRlbGl2ZXJ5UHJvY2VzcyA9IG5ldyBEZWxpdmVyeVByb2Nlc3NJbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gPSBuZXcgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGVzY3JpYmFibGVFbGVtZW50IGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudCgpIHsKLQkJRGVzY3JpYmFibGVFbGVtZW50SW1wbCBkZXNjcmliYWJsZUVsZW1lbnQgPSBuZXcgRGVzY3JpYmFibGVFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gZGVzY3JpYmFibGVFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoKSB7Ci0JCURlc2NyaXB0b3JJbXBsIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0b3JEZXNjcmlwdGlvbiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb24oKSB7Ci0JCURlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwgZGVzY3JpcHRvckRlc2NyaXB0aW9uID0gbmV3IERlc2NyaXB0b3JEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY2lwbGluZSBjcmVhdGVEaXNjaXBsaW5lKCkgewotCQlEaXNjaXBsaW5lSW1wbCBkaXNjaXBsaW5lID0gbmV3IERpc2NpcGxpbmVJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEaXNjaXBsaW5lR3JvdXBpbmcgY3JlYXRlRGlzY2lwbGluZUdyb3VwaW5nKCkgewotCQlEaXNjaXBsaW5lR3JvdXBpbmdJbXBsIGRpc2NpcGxpbmVHcm91cGluZyA9IG5ldyBEaXNjaXBsaW5lR3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERvY3VtZW50Um9vdCBjcmVhdGVEb2N1bWVudFJvb3QoKSB7Ci0JCURvY3VtZW50Um9vdEltcGwgZG9jdW1lbnRSb290ID0gbmV3IERvY3VtZW50Um9vdEltcGwoKTsKLQkJcmV0dXJuIGRvY3VtZW50Um9vdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRG9tYWluIGNyZWF0ZURvbWFpbigpIHsKLQkJRG9tYWluSW1wbCBkb21haW4gPSBuZXcgRG9tYWluSW1wbCgpOwotCQlyZXR1cm4gZG9tYWluOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoKSB7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBuZXcgRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVzdGltYXRlIGNyZWF0ZUVzdGltYXRlKCkgewotCQlFc3RpbWF0ZUltcGwgZXN0aW1hdGUgPSBuZXcgRXN0aW1hdGVJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRXN0aW1hdGluZ01ldHJpYyBjcmVhdGVFc3RpbWF0aW5nTWV0cmljKCkgewotCQlFc3RpbWF0aW5nTWV0cmljSW1wbCBlc3RpbWF0aW5nTWV0cmljID0gbmV3IEVzdGltYXRpbmdNZXRyaWNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW5nTWV0cmljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IG5ldyBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNJbXBsKCk7Ci0JCXJldHVybiBlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4YW1wbGUgY3JlYXRlRXhhbXBsZSgpIHsKLQkJRXhhbXBsZUltcGwgZXhhbXBsZSA9IG5ldyBFeGFtcGxlSW1wbCgpOwotCQlyZXR1cm4gZXhhbXBsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR3VpZGFuY2UgY3JlYXRlR3VpZGFuY2UoKSB7Ci0JCUd1aWRhbmNlSW1wbCBndWlkYW5jZSA9IG5ldyBHdWlkYW5jZUltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHdWlkYW5jZURlc2NyaXB0aW9uIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb24oKSB7Ci0JCUd1aWRhbmNlRGVzY3JpcHRpb25JbXBsIGd1aWRhbmNlRGVzY3JpcHRpb24gPSBuZXcgR3VpZGFuY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEd1aWRlbGluZSBjcmVhdGVHdWlkZWxpbmUoKSB7Ci0JCUd1aWRlbGluZUltcGwgZ3VpZGVsaW5lID0gbmV3IEd1aWRlbGluZUltcGwoKTsKLQkJcmV0dXJuIGd1aWRlbGluZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSXRlcmF0aW9uIGNyZWF0ZUl0ZXJhdGlvbigpIHsKLQkJSXRlcmF0aW9uSW1wbCBpdGVyYXRpb24gPSBuZXcgSXRlcmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gaXRlcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBLaW5kIGNyZWF0ZUtpbmQoKSB7Ci0JCUtpbmRJbXBsIGtpbmQgPSBuZXcgS2luZEltcGwoKTsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZENvbmZpZ3VyYXRpb24gY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigpIHsKLQkJTWV0aG9kQ29uZmlndXJhdGlvbkltcGwgbWV0aG9kQ29uZmlndXJhdGlvbiA9IG5ldyBNZXRob2RDb25maWd1cmF0aW9uSW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kRWxlbWVudCBjcmVhdGVNZXRob2RFbGVtZW50KCkgewotCQlNZXRob2RFbGVtZW50SW1wbCBtZXRob2RFbGVtZW50ID0gbmV3IE1ldGhvZEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50UHJvcGVydHkgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsIG1ldGhvZEVsZW1lbnRQcm9wZXJ0eSA9IG5ldyBNZXRob2RFbGVtZW50UHJvcGVydHlJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RFbGVtZW50UHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZExpYnJhcnkgY3JlYXRlTWV0aG9kTGlicmFyeSgpIHsKLQkJTWV0aG9kTGlicmFyeUltcGwgbWV0aG9kTGlicmFyeSA9IG5ldyBNZXRob2RMaWJyYXJ5SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kTGlicmFyeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWV0aG9kUGFja2FnZSBjcmVhdGVNZXRob2RQYWNrYWdlKCkgewotCQlNZXRob2RQYWNrYWdlSW1wbCBtZXRob2RQYWNrYWdlID0gbmV3IE1ldGhvZFBhY2thZ2VJbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKCkgewotCQlNZXRob2RQbHVnaW5JbXBsIG1ldGhvZFBsdWdpbiA9IG5ldyBNZXRob2RQbHVnaW5JbXBsKCk7Ci0JCXJldHVybiBtZXRob2RQbHVnaW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE1ldGhvZFVuaXQgY3JlYXRlTWV0aG9kVW5pdCgpIHsKLQkJTWV0aG9kVW5pdEltcGwgbWV0aG9kVW5pdCA9IG5ldyBNZXRob2RVbml0SW1wbCgpOwotCQlyZXR1cm4gbWV0aG9kVW5pdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWlsZXN0b25lIGNyZWF0ZU1pbGVzdG9uZSgpIHsKLQkJTWlsZXN0b25lSW1wbCBtaWxlc3RvbmUgPSBuZXcgTWlsZXN0b25lSW1wbCgpOwotCQlyZXR1cm4gbWlsZXN0b25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOYW1lZEVsZW1lbnQgY3JlYXRlTmFtZWRFbGVtZW50KCkgewotCQlOYW1lZEVsZW1lbnRJbXBsIG5hbWVkRWxlbWVudCA9IG5ldyBOYW1lZEVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBuYW1lZEVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE91dGNvbWUgY3JlYXRlT3V0Y29tZSgpIHsKLQkJT3V0Y29tZUltcGwgb3V0Y29tZSA9IG5ldyBPdXRjb21lSW1wbCgpOwotCQlyZXR1cm4gb3V0Y29tZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGFja2FnZWFibGVFbGVtZW50IGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudCgpIHsKLQkJUGFja2FnZWFibGVFbGVtZW50SW1wbCBwYWNrYWdlYWJsZUVsZW1lbnQgPSBuZXcgUGFja2FnZWFibGVFbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gcGFja2FnZWFibGVFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQaGFzZSBjcmVhdGVQaGFzZSgpIHsKLQkJUGhhc2VJbXBsIHBoYXNlID0gbmV3IFBoYXNlSW1wbCgpOwotCQlyZXR1cm4gcGhhc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBsYW5uaW5nRGF0YSBjcmVhdGVQbGFubmluZ0RhdGEoKSB7Ci0JCVBsYW5uaW5nRGF0YUltcGwgcGxhbm5pbmdEYXRhID0gbmV3IFBsYW5uaW5nRGF0YUltcGwoKTsKLQkJcmV0dXJuIHBsYW5uaW5nRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJhY3RpY2UgY3JlYXRlUHJhY3RpY2UoKSB7Ci0JCVByYWN0aWNlSW1wbCBwcmFjdGljZSA9IG5ldyBQcmFjdGljZUltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmFjdGljZURlc2NyaXB0aW9uIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCVByYWN0aWNlRGVzY3JpcHRpb25JbXBsIHByYWN0aWNlRGVzY3JpcHRpb24gPSBuZXcgUHJhY3RpY2VEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByYWN0aWNlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgY3JlYXRlUHJvY2VzcygpIHsKLQkJUHJvY2Vzc0ltcGwgcHJvY2VzcyA9IG5ldyBQcm9jZXNzSW1wbCgpOwotCQlyZXR1cm4gcHJvY2VzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0NvbXBvbmVudCBjcmVhdGVQcm9jZXNzQ29tcG9uZW50KCkgewotCQlQcm9jZXNzQ29tcG9uZW50SW1wbCBwcm9jZXNzQ29tcG9uZW50ID0gbmV3IFByb2Nlc3NDb21wb25lbnRJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VJbXBsIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSBuZXcgUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NEZXNjcmlwdGlvbiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCVByb2Nlc3NEZXNjcmlwdGlvbkltcGwgcHJvY2Vzc0Rlc2NyaXB0aW9uID0gbmV3IFByb2Nlc3NEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc0VsZW1lbnQgY3JlYXRlUHJvY2Vzc0VsZW1lbnQoKSB7Ci0JCVByb2Nlc3NFbGVtZW50SW1wbCBwcm9jZXNzRWxlbWVudCA9IG5ldyBQcm9jZXNzRWxlbWVudEltcGwoKTsKLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcm9jZXNzUGFja2FnZSBjcmVhdGVQcm9jZXNzUGFja2FnZSgpIHsKLQkJUHJvY2Vzc1BhY2thZ2VJbXBsIHByb2Nlc3NQYWNrYWdlID0gbmV3IFByb2Nlc3NQYWNrYWdlSW1wbCgpOwotCQlyZXR1cm4gcHJvY2Vzc1BhY2thZ2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIGNyZWF0ZVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkgewotCQlQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUltcGwgcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgPSBuZXcgUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVJbXBsKCk7Ci0JCXJldHVybiBwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3J0IGNyZWF0ZVJlcG9ydCgpIHsKLQkJUmVwb3J0SW1wbCByZXBvcnQgPSBuZXcgUmVwb3J0SW1wbCgpOwotCQlyZXR1cm4gcmVwb3J0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSZXVzYWJsZUFzc2V0IGNyZWF0ZVJldXNhYmxlQXNzZXQoKSB7Ci0JCVJldXNhYmxlQXNzZXRJbXBsIHJldXNhYmxlQXNzZXQgPSBuZXcgUmV1c2FibGVBc3NldEltcGwoKTsKLQkJcmV0dXJuIHJldXNhYmxlQXNzZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvYWRtYXAgY3JlYXRlUm9hZG1hcCgpIHsKLQkJUm9hZG1hcEltcGwgcm9hZG1hcCA9IG5ldyBSb2FkbWFwSW1wbCgpOwotCQlyZXR1cm4gcm9hZG1hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKCkgewotCQlSb2xlSW1wbCByb2xlID0gbmV3IFJvbGVJbXBsKCk7Ci0JCXJldHVybiByb2xlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlRGVzY3JpcHRpb24gY3JlYXRlUm9sZURlc2NyaXB0aW9uKCkgewotCQlSb2xlRGVzY3JpcHRpb25JbXBsIHJvbGVEZXNjcmlwdGlvbiA9IG5ldyBSb2xlRGVzY3JpcHRpb25JbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJvbGVEZXNjcmlwdG9yIGNyZWF0ZVJvbGVEZXNjcmlwdG9yKCkgewotCQlSb2xlRGVzY3JpcHRvckltcGwgcm9sZURlc2NyaXB0b3IgPSBuZXcgUm9sZURlc2NyaXB0b3JJbXBsKCk7Ci0JCXJldHVybiByb2xlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUm9sZVNldCBjcmVhdGVSb2xlU2V0KCkgewotCQlSb2xlU2V0SW1wbCByb2xlU2V0ID0gbmV3IFJvbGVTZXRJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBSb2xlU2V0R3JvdXBpbmcgY3JlYXRlUm9sZVNldEdyb3VwaW5nKCkgewotCQlSb2xlU2V0R3JvdXBpbmdJbXBsIHJvbGVTZXRHcm91cGluZyA9IG5ldyBSb2xlU2V0R3JvdXBpbmdJbXBsKCk7Ci0JCXJldHVybiByb2xlU2V0R3JvdXBpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbigpIHsKLQkJU2VjdGlvbkltcGwgc2VjdGlvbiA9IG5ldyBTZWN0aW9uSW1wbCgpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3VwcG9ydGluZ01hdGVyaWFsIGNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpIHsKLQkJU3VwcG9ydGluZ01hdGVyaWFsSW1wbCBzdXBwb3J0aW5nTWF0ZXJpYWwgPSBuZXcgU3VwcG9ydGluZ01hdGVyaWFsSW1wbCgpOwotCQlyZXR1cm4gc3VwcG9ydGluZ01hdGVyaWFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUYXNrIGNyZWF0ZVRhc2soKSB7Ci0JCVRhc2tJbXBsIHRhc2sgPSBuZXcgVGFza0ltcGwoKTsKLQkJcmV0dXJuIHRhc2s7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRhc2tEZXNjcmlwdGlvbiBjcmVhdGVUYXNrRGVzY3JpcHRpb24oKSB7Ci0JCVRhc2tEZXNjcmlwdGlvbkltcGwgdGFza0Rlc2NyaXB0aW9uID0gbmV3IFRhc2tEZXNjcmlwdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGFza0Rlc2NyaXB0b3IgY3JlYXRlVGFza0Rlc2NyaXB0b3IoKSB7Ci0JCVRhc2tEZXNjcmlwdG9ySW1wbCB0YXNrRGVzY3JpcHRvciA9IG5ldyBUYXNrRGVzY3JpcHRvckltcGwoKTsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZWFtUHJvZmlsZSBjcmVhdGVUZWFtUHJvZmlsZSgpIHsKLQkJVGVhbVByb2ZpbGVJbXBsIHRlYW1Qcm9maWxlID0gbmV3IFRlYW1Qcm9maWxlSW1wbCgpOwotCQlyZXR1cm4gdGVhbVByb2ZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBsYXRlIGNyZWF0ZVRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZUltcGwgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGVJbXBsKCk7Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVybURlZmluaXRpb24gY3JlYXRlVGVybURlZmluaXRpb24oKSB7Ci0JCVRlcm1EZWZpbml0aW9uSW1wbCB0ZXJtRGVmaW5pdGlvbiA9IG5ldyBUZXJtRGVmaW5pdGlvbkltcGwoKTsKLQkJcmV0dXJuIHRlcm1EZWZpbml0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUb29sIGNyZWF0ZVRvb2woKSB7Ci0JCVRvb2xJbXBsIHRvb2wgPSBuZXcgVG9vbEltcGwoKTsKLQkJcmV0dXJuIHRvb2w7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRvb2xNZW50b3IgY3JlYXRlVG9vbE1lbnRvcigpIHsKLQkJVG9vbE1lbnRvckltcGwgdG9vbE1lbnRvciA9IG5ldyBUb29sTWVudG9ySW1wbCgpOwotCQlyZXR1cm4gdG9vbE1lbnRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV2hpdGVwYXBlciBjcmVhdGVXaGl0ZXBhcGVyKCkgewotCQlXaGl0ZXBhcGVySW1wbCB3aGl0ZXBhcGVyID0gbmV3IFdoaXRlcGFwZXJJbXBsKCk7Ci0JCXJldHVybiB3aGl0ZXBhcGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrQnJlYWtkb3duRWxlbWVudCBjcmVhdGVXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIHdvcmtCcmVha2Rvd25FbGVtZW50ID0gbmV3IFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbCgpOwotCQlyZXR1cm4gd29ya0JyZWFrZG93bkVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtEZWZpbml0aW9uIGNyZWF0ZVdvcmtEZWZpbml0aW9uKCkgewotCQlXb3JrRGVmaW5pdGlvbkltcGwgd29ya0RlZmluaXRpb24gPSBuZXcgV29ya0RlZmluaXRpb25JbXBsKCk7Ci0JCXJldHVybiB3b3JrRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyIGNyZWF0ZVdvcmtPcmRlcigpIHsKLQkJV29ya09yZGVySW1wbCB3b3JrT3JkZXIgPSBuZXcgV29ya09yZGVySW1wbCgpOwotCQlyZXR1cm4gd29ya09yZGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdCBjcmVhdGVXb3JrUHJvZHVjdCgpIHsKLQkJV29ya1Byb2R1Y3RJbXBsIHdvcmtQcm9kdWN0ID0gbmV3IFdvcmtQcm9kdWN0SW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwgd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IG5ldyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRvcigpIHsKLQkJV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCB3b3JrUHJvZHVjdERlc2NyaXB0b3IgPSBuZXcgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpOwotCQlyZXR1cm4gd29ya1Byb2R1Y3REZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrUHJvZHVjdFR5cGUgY3JlYXRlV29ya1Byb2R1Y3RUeXBlKCkgewotCQlXb3JrUHJvZHVjdFR5cGVJbXBsIHdvcmtQcm9kdWN0VHlwZSA9IG5ldyBXb3JrUHJvZHVjdFR5cGVJbXBsKCk7Ci0JCXJldHVybiB3b3JrUHJvZHVjdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFZhcmlhYmlsaXR5VHlwZSBjcmVhdGVWYXJpYWJpbGl0eVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJVmFyaWFiaWxpdHlUeXBlIHJlc3VsdCA9IFZhcmlhYmlsaXR5VHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFdvcmtPcmRlclR5cGUgY3JlYXRlV29ya09yZGVyVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlXb3JrT3JkZXJUeXBlIHJlc3VsdCA9IFdvcmtPcmRlclR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVmFyaWFiaWxpdHlUeXBlIGNyZWF0ZVZhcmlhYmlsaXR5VHlwZU9iamVjdEZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlyZXR1cm4gY3JlYXRlVmFyaWFiaWxpdHlUeXBlRnJvbVN0cmluZyhVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX1RZUEUsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFyaWFiaWxpdHlUeXBlT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRWYXJpYWJpbGl0eVR5cGVUb1N0cmluZyhVbWFQYWNrYWdlLkxpdGVyYWxzLlZBUklBQklMSVRZX1RZUEUsIGluc3RhbmNlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBXb3JrT3JkZXJUeXBlIGNyZWF0ZVdvcmtPcmRlclR5cGVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKLQkJcmV0dXJuIGNyZWF0ZVdvcmtPcmRlclR5cGVGcm9tU3RyaW5nKFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUl9UWVBFLCBpbml0aWFsVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFdvcmtPcmRlclR5cGVPYmplY3RUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgewotCQlyZXR1cm4gY29udmVydFdvcmtPcmRlclR5cGVUb1N0cmluZyhVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfT1JERVJfVFlQRSwgaW5zdGFuY2VWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVBhY2thZ2UgZ2V0VW1hUGFja2FnZSgpIHsKLQkJcmV0dXJuIChVbWFQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgVW1hUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vVW1hRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9VbWFQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU3NjUyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1VtYVBhY2thZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzEwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVW1hUGFja2FnZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbXBvc2l0ZVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvckRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGVsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1pbGVzdG9uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5OYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbE1lbnRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldoaXRlcGFwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0JyZWFrZG93bkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3RUeXBlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVBhY2thZ2VJbXBsIGV4dGVuZHMgRVBhY2thZ2VJbXBsIGltcGxlbWVudHMgVW1hUGFja2FnZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNoZWNrbGlzdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb21wb3NpdGVSb2xlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbmNlcHRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29uc3RyYWludEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50Q2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY29udGVudFBhY2thZ2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkZWxpdmVyeVByb2Nlc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRpc2NpcGxpbmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGRvY3VtZW50Um9vdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkb21haW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlc3RpbWF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlc3RpbWF0aW5nTWV0cmljRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBleGFtcGxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZ3VpZGVsaW5lRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGl0ZXJhdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBraW5kRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kRWxlbWVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgbWV0aG9kTGlicmFyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1ldGhvZFBsdWdpbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtZXRob2RVbml0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIG1pbGVzdG9uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBuYW1lZEVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgb3V0Y29tZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGhhc2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcGxhbm5pbmdEYXRhRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NQYWNrYWdlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJlcG9ydEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByZXVzYWJsZUFzc2V0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHJvYWRtYXBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgcm9sZVNldEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyByb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgc2VjdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0YXNrRGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGFza0Rlc2NyaXB0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVhbVByb2ZpbGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVtcGxhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdGVybURlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgdG9vbEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB0b29sTWVudG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdoaXRlcGFwZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya0RlZmluaXRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya09yZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3Mgd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHdvcmtQcm9kdWN0VHlwZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHZhcmlhYmlsaXR5VHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gd29ya09yZGVyVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRURhdGFUeXBlIHZhcmlhYmlsaXR5VHlwZU9iamVjdEVEYXRhVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVEYXRhVHlwZSB3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVtYVBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBVbWFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzCi0JICogbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuICBTaW1wbGUKLQkgKiBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIG9uIGFsbAotCSAqIGRlcGVuZGVudCBwYWNrYWdlcyBiZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZS4gIFRoaXMgbWV0aG9kIGRyaXZlcwotCSAqIGluaXRpYWxpemF0aW9uIGZvciBpbnRlcmRlcGVuZGVudCBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwKLQkgKiB3aXRoIHRoaXMgcGFja2FnZSwgaXRzZWxmLgotCSAqIDxwPk9mIHRoaXMgcGFja2FnZSBhbmQgaXRzIGludGVyZGVwZW5kZW5jaWVzLCBhbGwgcGFja2FnZXMgd2hpY2gKLQkgKiBoYXZlIG5vdCB5ZXQgYmVlbiByZWdpc3RlcmVkIGJ5IHRoZWlyIFVSSSB2YWx1ZXMgYXJlIGZpcnN0IGNyZWF0ZWQKLQkgKiBhbmQgcmVnaXN0ZXJlZC4gIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6Ci0JICogbWV0YS1tb2RlbCBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkKLQkgKiBhcmUgaW5pdGlhbGl6ZWQsIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0bwotCSAqIHRob3NlIG9mIGFub3RoZXIuCi0JICogPHA+SW52b2NhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhZmZlY3QgYW55IHBhY2thZ2VzIHRoYXQgaGF2ZQotCSAqIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVtYVBhY2thZ2UgaW5pdCgpIHsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFVtYVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoVW1hUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVVtYVBhY2thZ2VJbXBsIHRoZVVtYVBhY2thZ2UgPSAoVW1hUGFja2FnZUltcGwpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKGVOU19VUkkpIGluc3RhbmNlb2YgVW1hUGFja2FnZUltcGwgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShlTlNfVVJJKSA6IG5ldyBVbWFQYWNrYWdlSW1wbCgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVVbWFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlVW1hUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVVbWFQYWNrYWdlLmZyZWV6ZSgpOwotCi0JCXJldHVybiB0aGVVbWFQYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWN0aXZpdHkoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfUm9hZG1hcCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFjdGl2aXR5X1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBY3Rpdml0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0hvd1RvU3RhZmYoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXBwbGljYWJsZU1ldGFDbGFzc0luZm8oKSB7Ci0JCXJldHVybiBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb19Jc1ByaW1hcnlFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXJ0aWZhY3QoKSB7Ci0JCXJldHVybiBhcnRpZmFjdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBcnRpZmFjdF9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFydGlmYWN0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fQnJpZWZPdXRsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb25PcHRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9Ob3RhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEJyZWFrZG93bkVsZW1lbnQoKSB7Ci0JCXJldHVybiBicmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQWZ0ZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QbGFubmluZ0RhdGEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfQ29uY2VwdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnRfSGFzTXVsdGlwbGVPY2N1cnJlbmNlcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlicmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDYXBhYmlsaXR5UGF0dGVybigpIHsKLQkJcmV0dXJuIGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hlY2tsaXN0KCkgewotCQlyZXR1cm4gY2hlY2tsaXN0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29tcG9zaXRlUm9sZSgpIHsKLQkJcmV0dXJuIGNvbXBvc2l0ZVJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbXBvc2l0ZVJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbmNlcHQoKSB7Ci0JCXJldHVybiBjb25jZXB0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29uc3RyYWludCgpIHsKLQkJcmV0dXJuIGNvbnN0cmFpbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29uc3RyYWludF9NYWluRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb25zdHJhaW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjb250ZW50Q2F0ZWdvcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKCkgewotCQlyZXR1cm4gY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbnRlbnREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250ZW50RGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb250ZW50RWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfQ29uY2VwdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDb250ZW50RWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljb250ZW50RWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRFbGVtZW50X1ZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb250ZW50UGFja2FnZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSljb250ZW50UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q3VzdG9tQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjdXN0b21DYXRlZ29yeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDdXN0b21DYXRlZ29yeV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEN1c3RvbUNhdGVnb3J5X0NhdGVnb3JpemVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWN1c3RvbUNhdGVnb3J5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q3VzdG9tQ2F0ZWdvcnlfU3ViQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljdXN0b21DYXRlZ29yeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcmFibGUoKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZV9Hcm91cDMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzKCkgewotCQlyZXR1cm4gZGVsaXZlcnlQcm9jZXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlbGl2ZXJ5UHJvY2Vzc19FZHVjYXRpb25NYXRlcmlhbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUmlza0xldmVsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmliYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERlc2NyaWJhYmxlRWxlbWVudF9GdWxmaWxsKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmliYWJsZUVsZW1lbnRfU2hhcGVpY29uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gZGVzY3JpcHRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREZXNjcmlwdG9yRGVzY3JpcHRpb25fUmVmaW5lZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gZGlzY2lwbGluZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREaXNjaXBsaW5lX1Rhc2soKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZGlzY2lwbGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlkaXNjaXBsaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREaXNjaXBsaW5lR3JvdXBpbmcoKSB7Ci0JCXJldHVybiBkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREb2N1bWVudFJvb3QoKSB7Ci0JCXJldHVybiBkb2N1bWVudFJvb3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9jdW1lbnRSb290X01peGVkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZG9jdW1lbnRSb290RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9jdW1lbnRSb290X01ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvY3VtZW50Um9vdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERvY3VtZW50Um9vdF9NZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlkb2N1bWVudFJvb3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERvbWFpbigpIHsKLQkJcmV0dXJuIGRvbWFpbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREb21haW5fR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RG9tYWluX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZG9tYWluRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RG9tYWluX1N1YmRvbWFpbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWRvbWFpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIGVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIGVzdGltYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVzdGltYXRlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVzdGltYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbk1ldHJpYygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWVzdGltYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXN0aW1hdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVzdGltYXRpbmdNZXRyaWMoKSB7Ci0JCXJldHVybiBlc3RpbWF0aW5nTWV0cmljRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGV4YW1wbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRHdWlkYW5jZSgpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0R3VpZGFuY2VEZXNjcmlwdGlvbl9BdHRhY2htZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0R3VpZGVsaW5lKCkgewotCQlyZXR1cm4gZ3VpZGVsaW5lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0SXRlcmF0aW9uKCkgewotCQlyZXR1cm4gaXRlcmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWtpbmRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiBtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fQmFzZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQbHVnaW5TZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZENvbmZpZ3VyYXRpb25fRGVmYXVsdFZpZXcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0dyb3VwKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfT3duZWRSdWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldE1ldGhvZEVsZW1lbnRfTWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X0lkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRfT3JkZXJpbmdHdWlkZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RFbGVtZW50X1ByZXNlbnRhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZEVsZW1lbnRQcm9wZXJ0eV9WYWx1ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kTGlicmFyeSgpIHsKLQkJcmV0dXJuIG1ldGhvZExpYnJhcnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RMaWJyYXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RDb25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpbWV0aG9kTGlicmFyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZExpYnJhcnlfVG9vbCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiBtZXRob2RQYWNrYWdlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfR3JvdXAxKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBhY2thZ2VfUmV1c2VkUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGFja2FnZV9HbG9iYWwoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiBtZXRob2RQbHVnaW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RQbHVnaW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRNZXRob2RQbHVnaW5fTWV0aG9kUGFja2FnZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFBsdWdpbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TWV0aG9kVW5pdCgpIHsKLQkJcmV0dXJuIG1ldGhvZFVuaXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltZXRob2RVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldE1ldGhvZFVuaXRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1ldGhvZFVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1pbGVzdG9uZSgpIHsKLQkJcmV0dXJuIG1pbGVzdG9uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSltaWxlc3RvbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE5hbWVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIG5hbWVkRWxlbWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXROYW1lZEVsZW1lbnRfTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW5hbWVkRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0T3V0Y29tZSgpIHsKLQkJcmV0dXJuIG91dGNvbWVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQaGFzZSgpIHsKLQkJcmV0dXJuIHBoYXNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UGxhbm5pbmdEYXRhKCkgewotCQlyZXR1cm4gcGxhbm5pbmdEYXRhRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UGxhbm5pbmdEYXRhX1JhbmsoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwbGFubmluZ0RhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQbGFubmluZ0RhdGFfU3RhcnREYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmFjdGljZSgpIHsKLQkJcmV0dXJuIHByYWN0aWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VfQWN0aXZpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlX0NvbnRlbnRSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJhY3RpY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByYWN0aWNlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9BcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2VzcygpIHsKLQkJcmV0dXJuIHByb2Nlc3NFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzX0RpYWdyYW1VUkkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzQ29tcG9uZW50KCkgewotCQlyZXR1cm4gcHJvY2Vzc0NvbXBvbmVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50X1Byb2Nlc3MoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlwcm9jZXNzQ29tcG9uZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc0NvbXBvbmVudF9BdXRob3JzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRfVmVyc2lvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NDb21wb25lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFByb2Nlc3NEZXNjcmlwdGlvbl9Vc2FnZU5vdGVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcm9jZXNzRWxlbWVudCgpIHsKLQkJcmV0dXJuIHByb2Nlc3NFbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJvY2Vzc1BhY2thZ2UoKSB7Ci0JCXJldHVybiBwcm9jZXNzUGFja2FnZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlwcm9jZXNzUGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpcHJvY2Vzc1BhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKCkgewotCQlyZXR1cm4gcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXBvcnQoKSB7Ci0JCXJldHVybiByZXBvcnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSZXVzYWJsZUFzc2V0KCkgewotCQlyZXR1cm4gcmV1c2FibGVBc3NldEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvYWRtYXAoKSB7Ci0JCXJldHVybiByb2FkbWFwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZSgpIHsKLQkJcmV0dXJuIHJvbGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fQXNzaWdubWVudEFwcHJvYWNoZXMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZURlc2NyaXB0aW9uX1N5bm9ueW1zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRSb2xlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHJvbGVEZXNjcmlwdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1JvbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVEZXNjcmlwdG9yX1Jlc3BvbnNpYmxlRm9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZURlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTZXQoKSB7Ci0JCXJldHVybiByb2xlU2V0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVTZXRfUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVTZXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFJvbGVTZXRHcm91cGluZygpIHsKLQkJcmV0dXJuIHJvbGVTZXRHcm91cGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlU2V0R3JvdXBpbmdfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZVNldEdyb3VwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZVNldEdyb3VwaW5nX1JvbGVTZXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNlY3Rpb24oKSB7Ci0JCXJldHVybiBzZWN0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFNlY3Rpb25fU3ViU2VjdGlvbigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc2VjdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXNlY3Rpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eVR5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlzZWN0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRTdXBwb3J0aW5nTWF0ZXJpYWwoKSB7Ci0JCXJldHVybiBzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGFza0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1ByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19QZXJmb3JtZWRCeSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrX01hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfT3V0cHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19PcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tfRXN0aW1hdGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza19Ub29sTWVudG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRhc2tEZXNjcmlwdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0aW9uX1B1cnBvc2UoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRhc2tEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gdGFza0Rlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0dyb3VwMygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGFza0Rlc2NyaXB0b3JfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX01hbmRhdG9yeUlucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PcHRpb25hbElucHV0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUYXNrRGVzY3JpcHRvcl9PdXRwdXQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFRhc2tEZXNjcmlwdG9yX1N0ZXAoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl0YXNrRGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRhc2tEZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVhbVByb2ZpbGUoKSB7Ci0JCXJldHVybiB0ZWFtUHJvZmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRUZWFtUHJvZmlsZV9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1JvbGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl0ZWFtUHJvZmlsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRlYW1Qcm9maWxlX1N1cGVyVGVhbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0VGVhbVByb2ZpbGVfU3ViVGVhbSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRlYW1Qcm9maWxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHRlbXBsYXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0VGVybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0ZXJtRGVmaW5pdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2woKSB7Ci0JCXJldHVybiB0b29sRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRvb2xfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpdG9vbEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFRvb2xfVG9vbE1lbnRvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXRvb2xFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFRvb2xNZW50b3IoKSB7Ci0JCXJldHVybiB0b29sTWVudG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0V2hpdGVwYXBlcigpIHsKLQkJcmV0dXJuIHdoaXRlcGFwZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpIHsKLQkJcmV0dXJuIHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzT25nb2luZygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gd29ya0RlZmluaXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrRGVmaW5pdGlvbl9Qb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya0RlZmluaXRpb25FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtPcmRlcigpIHsKLQkJcmV0dXJuIHdvcmtPcmRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfVmFsdWUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfSWQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrT3JkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gd29ya1Byb2R1Y3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdF9Ub29sTWVudG9yKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9QdXJwb3NlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUmVhc29uc0Zvck5vdE5lZWRpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiB3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfRXh0ZXJuYWxJbnB1dFRvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfSW1wYWN0cygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9NYW5kYXRvcnlJbnB1dFRvKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfQWN0aXZpdHlFbnRyeVN0YXRlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMTApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDExKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFdvcmtQcm9kdWN0VHlwZSgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0VHlwZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0V29ya1Byb2R1Y3RUeXBlX1dvcmtQcm9kdWN0KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFZhcmlhYmlsaXR5VHlwZSgpIHsKLQkJcmV0dXJuIHZhcmlhYmlsaXR5VHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRXb3JrT3JkZXJUeXBlKCkgewotCQlyZXR1cm4gd29ya09yZGVyVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0VmFyaWFiaWxpdHlUeXBlT2JqZWN0KCkgewotCQlyZXR1cm4gdmFyaWFiaWxpdHlUeXBlT2JqZWN0RURhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRGF0YVR5cGUgZ2V0V29ya09yZGVyVHlwZU9iamVjdCgpIHsKLQkJcmV0dXJuIHdvcmtPcmRlclR5cGVPYmplY3RFRGF0YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUZhY3RvcnkgZ2V0VW1hRmFjdG9yeSgpIHsKLQkJcmV0dXJuIChVbWFGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCWFjdGl2aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFDVElWSVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1BSRUNPTkRJVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19QT1NUQ09ORElUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0dST1VQMyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19CUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19ST0FETUFQKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX0lTX0VOQUNUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWN0aXZpdHlFQ2xhc3MsIEFDVElWSVRZX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhY3Rpdml0eUVDbGFzcywgQUNUSVZJVFlfX1ZBUklBQklMSVRZX1RZUEUpOwotCi0JCWFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUNUSVZJVFlfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19BTFRFUk5BVElWRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19IT1dfVE9fU1RBRkYpOwotCQljcmVhdGVFQXR0cmlidXRlKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIEFDVElWSVRZX0RFU0NSSVBUSU9OX19QVVJQT1NFKTsKLQotCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUFBMSUNBQkxFX01FVEFfQ0xBU1NfSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MsIEFQUExJQ0FCTEVfTUVUQV9DTEFTU19JTkZPX19JU19QUklNQVJZX0VYVEVOU0lPTik7Ci0KLQkJYXJ0aWZhY3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVJUSUZBQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RUNsYXNzLCBBUlRJRkFDVF9fR1JPVVAzKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhcnRpZmFjdEVDbGFzcywgQVJUSUZBQ1RfX0NPTlRBSU5FRF9BUlRJRkFDVCk7Ci0KLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBUlRJRkFDVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcywgQVJUSUZBQ1RfREVTQ1JJUFRJT05fX0JSSUVGX09VVExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFSVElGQUNUX0RFU0NSSVBUSU9OX19SRVBSRVNFTlRBVElPTl9PUFRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBUlRJRkFDVF9ERVNDUklQVElPTl9fUkVQUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGFydGlmYWN0RGVzY3JpcHRpb25FQ2xhc3MsIEFSVElGQUNUX0RFU0NSSVBUSU9OX19OT1RBVElPTik7Ci0KLQkJYnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCUkVBS0RPV05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9BRlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1BSRVNFTlRFRF9CRUZPUkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QTEFOTklOR19EQVRBKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQRVJfQUNUSVZJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19HUk9VUDEpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19DSEVDS0xJU1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19DT05DRVBUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0dVSURFTElORSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1JFVVNBQkxFX0FTU0VUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX1dISVRFUEFQRVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19IQVNfTVVMVElQTEVfT0NDVVJSRU5DRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19JU19PUFRJT05BTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudEVDbGFzcywgQlJFQUtET1dOX0VMRU1FTlRfX0lTX1BMQU5ORUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGJyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIEJSRUFLRE9XTl9FTEVNRU5UX19QUkVGSVgpOwotCi0JCWJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCBCUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTl9fVVNBR0VfR1VJREFOQ0UpOwotCi0JCWNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzID0gY3JlYXRlRUNsYXNzKENBUEFCSUxJVFlfUEFUVEVSTik7Ci0KLQkJY2hlY2tsaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENIRUNLTElTVCk7Ci0KLQkJY29tcG9zaXRlUm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT01QT1NJVEVfUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29tcG9zaXRlUm9sZUVDbGFzcywgQ09NUE9TSVRFX1JPTEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29tcG9zaXRlUm9sZUVDbGFzcywgQ09NUE9TSVRFX1JPTEVfX0FHR1JFR0FURURfUk9MRSk7Ci0KLQkJY29uY2VwdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05DRVBUKTsKLQotCQljb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlNUUkFJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnN0cmFpbnRFQ2xhc3MsIENPTlNUUkFJTlRfX01BSU5fREVTQ1JJUFRJT04pOwotCi0JCWNvbnRlbnRDYXRlZ29yeUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT05URU5UX0NBVEVHT1JZKTsKLQotCQljb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudENhdGVnb3J5UGFja2FnZUVDbGFzcywgQ09OVEVOVF9DQVRFR09SWV9QQUNLQUdFX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIENPTlRFTlRfQ0FURUdPUllfUEFDS0FHRV9fQ09OVEVOVF9DQVRFR09SWSk7Ci0KLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTlRFTlRfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ09OVEVOVF9ERVNDUklQVElPTl9fTUFJTl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19LRVlfQ09OU0lERVJBVElPTlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgQ09OVEVOVF9ERVNDUklQVElPTl9fU0VDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudERlc2NyaXB0aW9uRUNsYXNzLCBDT05URU5UX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9JRCk7Ci0KLQkJY29udGVudEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19HUk9VUDEpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDT05URU5UX0VMRU1FTlRfX0NIRUNLTElTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fQ09OQ0VQVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fRVhBTVBMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fR1VJREVMSU5FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50RWxlbWVudEVDbGFzcywgQ09OVEVOVF9FTEVNRU5UX19SRVVTQUJMRV9BU1NFVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fU1VQUE9SVElOR19NQVRFUklBTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fV0hJVEVQQVBFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfQkFTRURfT05fRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY29udGVudEVsZW1lbnRFQ2xhc3MsIENPTlRFTlRfRUxFTUVOVF9fVkFSSUFCSUxJVFlfVFlQRSk7Ci0KLQkJY29udGVudFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ09OVEVOVF9QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjb250ZW50UGFja2FnZUVDbGFzcywgQ09OVEVOVF9QQUNLQUdFX19HUk9VUDIpOwotCQljcmVhdGVFUmVmZXJlbmNlKGNvbnRlbnRQYWNrYWdlRUNsYXNzLCBDT05URU5UX1BBQ0tBR0VfX0NPTlRFTlRfRUxFTUVOVCk7Ci0KLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ1VTVE9NX0NBVEVHT1JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShjdXN0b21DYXRlZ29yeUVDbGFzcywgQ1VTVE9NX0NBVEVHT1JZX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX0NBVEVHT1JJWkVEX0VMRU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCBDVVNUT01fQ0FURUdPUllfX1NVQl9DQVRFR09SWSk7Ci0KLQkJZGVsaXZlcmFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRUNsYXNzLCBERUxJVkVSQUJMRV9fR1JPVVAzKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyYWJsZUVDbGFzcywgREVMSVZFUkFCTEVfX0RFTElWRVJFRF9XT1JLX1BST0RVQ1QpOwotCi0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUkFCTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJBQkxFX0RFU0NSSVBUSU9OX19FWFRFUk5BTF9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUkFCTEVfREVTQ1JJUFRJT05fX1BBQ0tBR0lOR19HVUlEQU5DRSk7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRUNsYXNzID0gY3JlYXRlRUNsYXNzKERFTElWRVJZX1BST0NFU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0VDbGFzcywgREVMSVZFUllfUFJPQ0VTU19fR1JPVVA0KTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfX0NPTU1VTklDQVRJT05TX01BVEVSSUFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NFQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfX0VEVUNBVElPTl9NQVRFUklBTCk7Ci0KLQkJZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIERFTElWRVJZX1BST0NFU1NfREVTQ1JJUFRJT05fX1NDQUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fUFJPSkVDVF9DSEFSQUNURVJJU1RJQ1MpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19SSVNLX0xFVkVMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTl9fRVNUSU1BVElOR19URUNITklRVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19QUk9KRUNUX01FTUJFUl9FWFBFUlRJU0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBERUxJVkVSWV9QUk9DRVNTX0RFU0NSSVBUSU9OX19UWVBFX09GX0NPTlRSQUNUKTsKLQotCQlkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJQkFCTEVfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19QUkVTRU5UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgREVTQ1JJQkFCTEVfRUxFTUVOVF9fRlVMRklMTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19JU19BQlNUUkFDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19OT0RFSUNPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLCBERVNDUklCQUJMRV9FTEVNRU5UX19TSEFQRUlDT04pOwotCi0JCWRlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckVDbGFzcywgREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQlkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoREVTQ1JJUFRPUl9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGVzY3JpcHRvckRlc2NyaXB0aW9uRUNsYXNzLCBERVNDUklQVE9SX0RFU0NSSVBUSU9OX19SRUZJTkVEX0RFU0NSSVBUSU9OKTsKLQotCQlkaXNjaXBsaW5lRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fVEFTSyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZGlzY2lwbGluZUVDbGFzcywgRElTQ0lQTElORV9fU1VCX0RJU0NJUExJTkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVFQ2xhc3MsIERJU0NJUExJTkVfX1JFRkVSRU5DRV9XT1JLRkxPVyk7Ci0KLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKERJU0NJUExJTkVfR1JPVVBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRElTQ0lQTElORV9HUk9VUElOR19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkaXNjaXBsaW5lR3JvdXBpbmdFQ2xhc3MsIERJU0NJUExJTkVfR1JPVVBJTkdfX0RJU0NJUExJTkUpOwotCi0JCWRvY3VtZW50Um9vdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhET0NVTUVOVF9ST09UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX01JWEVEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb2N1bWVudFJvb3RFQ2xhc3MsIERPQ1VNRU5UX1JPT1RfX1hNTE5TX1BSRUZJWF9NQVApOwotCQljcmVhdGVFUmVmZXJlbmNlKGRvY3VtZW50Um9vdEVDbGFzcywgRE9DVU1FTlRfUk9PVF9fWFNJX1NDSEVNQV9MT0NBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfQ09ORklHVVJBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfTElCUkFSWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZG9jdW1lbnRSb290RUNsYXNzLCBET0NVTUVOVF9ST09UX19NRVRIT0RfUExVR0lOKTsKLQotCQlkb21haW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRE9NQUlOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb21haW5FQ2xhc3MsIERPTUFJTl9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkb21haW5FQ2xhc3MsIERPTUFJTl9fV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkb21haW5FQ2xhc3MsIERPTUFJTl9fU1VCRE9NQUlOKTsKLQotCQllbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVMRU1FTlQpOwotCi0JCWVzdGltYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShlc3RpbWF0ZUVDbGFzcywgRVNUSU1BVEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXN0aW1hdGVFQ2xhc3MsIEVTVElNQVRFX19FU1RJTUFUSU9OX01FVFJJQyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXN0aW1hdGVFQ2xhc3MsIEVTVElNQVRFX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQotCQllc3RpbWF0aW5nTWV0cmljRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVTVElNQVRJTkdfTUVUUklDKTsKLQotCQllc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0KLQkJZXhhbXBsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFWEFNUExFKTsKLQotCQlndWlkYW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRSk7Ci0KLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlEQU5DRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgR1VJREFOQ0VfREVTQ1JJUFRJT05fX0FUVEFDSE1FTlQpOwotCi0JCWd1aWRlbGluZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhHVUlERUxJTkUpOwotCi0JCWl0ZXJhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhJVEVSQVRJT04pOwotCi0JCWtpbmRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoS0lORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoa2luZEVDbGFzcywgS0lORF9fQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk8pOwotCi0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19CQVNFX0NPTkZJR1VSQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19NRVRIT0RfUExVR0lOX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX01FVEhPRF9QQUNLQUdFX1NFTEVDVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX0RFRkFVTFRfVklFVyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1BST0NFU1NfVklFVyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgTUVUSE9EX0NPTkZJR1VSQVRJT05fX1NVQlRSQUNURURfQ0FURUdPUlkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MsIE1FVEhPRF9DT05GSUdVUkFUSU9OX19BRERFRF9DQVRFR09SWSk7Ci0KLQkJbWV0aG9kRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fT1dORURfUlVMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX01FVEhPRF9FTEVNRU5UX1BST1BFUlRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fQlJJRUZfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kRWxlbWVudEVDbGFzcywgTUVUSE9EX0VMRU1FTlRfX09SREVSSU5HX0dVSURFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RFbGVtZW50RUNsYXNzLCBNRVRIT0RfRUxFTUVOVF9fUFJFU0VOVEFUSU9OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1FVEhPRF9FTEVNRU5UX19TVVBQUkVTU0VEKTsKLQotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywgTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFlfX1ZBTFVFKTsKLQotCQltZXRob2RMaWJyYXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1FVEhPRF9MSUJSQVJZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kTGlicmFyeUVDbGFzcywgTUVUSE9EX0xJQlJBUllfX01FVEhPRF9DT05GSUdVUkFUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RMaWJyYXJ5RUNsYXNzLCBNRVRIT0RfTElCUkFSWV9fVE9PTCk7Ci0KLQkJbWV0aG9kUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX0dST1VQMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGFja2FnZUVDbGFzcywgTUVUSE9EX1BBQ0tBR0VfX1JFVVNFRF9QQUNLQUdFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShtZXRob2RQYWNrYWdlRUNsYXNzLCBNRVRIT0RfUEFDS0FHRV9fTUVUSE9EX1BBQ0tBR0UpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFBhY2thZ2VFQ2xhc3MsIE1FVEhPRF9QQUNLQUdFX19HTE9CQUwpOwotCi0JCW1ldGhvZFBsdWdpbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhNRVRIT0RfUExVR0lOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RQbHVnaW5FQ2xhc3MsIE1FVEhPRF9QTFVHSU5fX1JFRkVSRU5DRURfTUVUSE9EX1BMVUdJTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19NRVRIT0RfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobWV0aG9kUGx1Z2luRUNsYXNzLCBNRVRIT0RfUExVR0lOX19VU0VSX0NIQU5HRUFCTEUpOwotCi0JCW1ldGhvZFVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUVUSE9EX1VOSVQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DT1BZUklHSFQpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19BVVRIT1JTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtZXRob2RVbml0RUNsYXNzLCBNRVRIT0RfVU5JVF9fQ0hBTkdFX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19DSEFOR0VfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKG1ldGhvZFVuaXRFQ2xhc3MsIE1FVEhPRF9VTklUX19WRVJTSU9OKTsKLQotCQltaWxlc3RvbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTUlMRVNUT05FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShtaWxlc3RvbmVFQ2xhc3MsIE1JTEVTVE9ORV9fUkVRVUlSRURfUkVTVUxUKTsKLQotCQluYW1lZEVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoTkFNRURfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUobmFtZWRFbGVtZW50RUNsYXNzLCBOQU1FRF9FTEVNRU5UX19OQU1FKTsKLQotCQlvdXRjb21lRUNsYXNzID0gY3JlYXRlRUNsYXNzKE9VVENPTUUpOwotCi0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQQUNLQUdFQUJMRV9FTEVNRU5UKTsKLQotCQlwaGFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQSEFTRSk7Ci0KLQkJcGxhbm5pbmdEYXRhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBMQU5OSU5HX0RBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHBsYW5uaW5nRGF0YUVDbGFzcywgUExBTk5JTkdfREFUQV9fRklOSVNIX0RBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHBsYW5uaW5nRGF0YUVDbGFzcywgUExBTk5JTkdfREFUQV9fUkFOSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocGxhbm5pbmdEYXRhRUNsYXNzLCBQTEFOTklOR19EQVRBX19TVEFSVF9EQVRFKTsKLQotCQlwcmFjdGljZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkFDVElDRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VFQ2xhc3MsIFBSQUNUSUNFX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHByYWN0aWNlRUNsYXNzLCBQUkFDVElDRV9fQUNUSVZJVFlfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX0NPTlRFTlRfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcmFjdGljZUVDbGFzcywgUFJBQ1RJQ0VfX1NVQl9QUkFDVElDRSk7Ci0KLQkJcHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkFDVElDRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FERElUSU9OQUxfSU5GTyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0FQUExJQ0FUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fQkFDS0dST1VORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUFJBQ1RJQ0VfREVTQ1JJUFRJT05fX0dPQUxTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fTEVWRUxTX09GX0FET1BUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcmFjdGljZURlc2NyaXB0aW9uRUNsYXNzLCBQUkFDVElDRV9ERVNDUklQVElPTl9fUFJPQkxFTSk7Ci0KLQkJcHJvY2Vzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRUNsYXNzLCBQUk9DRVNTX19JTkNMVURFU19QQVRURVJOKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRUNsYXNzLCBQUk9DRVNTX19ERUZBVUxUX0NPTlRFWFQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX1ZBTElEX0NPTlRFWFQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NFQ2xhc3MsIFBST0NFU1NfX0RJQUdSQU1fVVJJKTsKLQotCQlwcm9jZXNzQ29tcG9uZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfQ09NUE9ORU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fQ09QWVJJR0hUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fSU5URVJGQUNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzQ29tcG9uZW50RUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9fUFJPQ0VTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0FVVEhPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFBST0NFU1NfQ09NUE9ORU5UX19DSEFOR0VfREFURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX0NIQU5HRV9ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc0NvbXBvbmVudEVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfX1ZFUlNJT04pOwotCi0JCXByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLCBQUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfX0dST1VQMik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfU1BFQ0lGSUNBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgUFJPQ0VTU19DT01QT05FTlRfSU5URVJGQUNFX19JTlRFUkZBQ0VfSU8pOwotCi0JCXByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX1NDT1BFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShwcm9jZXNzRGVzY3JpcHRpb25FQ2xhc3MsIFBST0NFU1NfREVTQ1JJUFRJT05fX1VTQUdFX05PVEVTKTsKLQotCQlwcm9jZXNzRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUk9DRVNTX0VMRU1FTlQpOwotCi0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUEFDS0FHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocHJvY2Vzc1BhY2thZ2VFQ2xhc3MsIFBST0NFU1NfUEFDS0FHRV9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShwcm9jZXNzUGFja2FnZUVDbGFzcywgUFJPQ0VTU19QQUNLQUdFX19QUk9DRVNTX0VMRU1FTlQpOwotCi0JCXByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBST0NFU1NfUExBTk5JTkdfVEVNUExBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19HUk9VUDQpOwotCQljcmVhdGVFQXR0cmlidXRlKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCBQUk9DRVNTX1BMQU5OSU5HX1RFTVBMQVRFX19CQVNFX1BST0NFU1MpOwotCi0JCXJlcG9ydEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhSRVBPUlQpOwotCi0JCXJldXNhYmxlQXNzZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUkVVU0FCTEVfQVNTRVQpOwotCi0JCXJvYWRtYXBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9BRE1BUCk7Ci0KLQkJcm9sZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRUNsYXNzLCBST0xFX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVFQ2xhc3MsIFJPTEVfX1JFU1BPTlNJQkxFX0ZPUik7Ci0KLQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEZXNjcmlwdGlvbkVDbGFzcywgUk9MRV9ERVNDUklQVElPTl9fQVNTSUdOTUVOVF9BUFBST0FDSEVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIFJPTEVfREVTQ1JJUFRJT05fX1NLSUxMUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBST0xFX0RFU0NSSVBUSU9OX19TWU5PTllNUyk7Ci0KLQkJcm9sZURlc2NyaXB0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19ST0xFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRGVzY3JpcHRvckVDbGFzcywgUk9MRV9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9GT1IpOwotCi0JCXJvbGVTZXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRFQ2xhc3MsIFJPTEVfU0VUX19ST0xFKTsKLQotCQlyb2xlU2V0R3JvdXBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9TRVRfR1JPVVBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHJvbGVTZXRHcm91cGluZ0VDbGFzcywgUk9MRV9TRVRfR1JPVVBJTkdfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBST0xFX1NFVF9HUk9VUElOR19fUk9MRV9TRVQpOwotCi0JCXNlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU0VDVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU1VCX1NFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHNlY3Rpb25FQ2xhc3MsIFNFQ1RJT05fX1BSRURFQ0VTU09SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoc2VjdGlvbkVDbGFzcywgU0VDVElPTl9fU0VDVElPTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19WQVJJQUJJTElUWV9CQVNFRF9PTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzZWN0aW9uRUNsYXNzLCBTRUNUSU9OX19WQVJJQUJJTElUWV9UWVBFKTsKLQotCQlzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoU1VQUE9SVElOR19NQVRFUklBTCk7Ci0KLQkJdGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUQVNLKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BPU1RDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19NQU5EQVRPUllfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX09VVFBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fQURESVRJT05BTExZX1BFUkZPUk1FRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0VDbGFzcywgVEFTS19fT1BUSU9OQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tFQ2xhc3MsIFRBU0tfX0VTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRUNsYXNzLCBUQVNLX19UT09MX01FTlRPUik7Ci0KLQkJdGFza0Rlc2NyaXB0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVEFTS19ERVNDUklQVElPTl9fQUxURVJOQVRJVkVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIFRBU0tfREVTQ1JJUFRJT05fX1BVUlBPU0UpOwotCi0JCXRhc2tEZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRBU0tfREVTQ1JJUFRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fVEFTSyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fUEVSRk9STUVEX1BSSU1BUklMWV9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fR1JPVVAzKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19BRERJVElPTkFMTFlfUEVSRk9STUVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0YXNrRGVzY3JpcHRvckVDbGFzcywgVEFTS19ERVNDUklQVE9SX19BU1NJU1RFRF9CWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHRhc2tEZXNjcmlwdG9yRUNsYXNzLCBUQVNLX0RFU0NSSVBUT1JfX09VVFBVVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fU1RFUCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGFza0Rlc2NyaXB0b3JFQ2xhc3MsIFRBU0tfREVTQ1JJUFRPUl9fSVNfU1lOQ0hST05JWkVEX1dJVEhfU09VUkNFKTsKLQotCQl0ZWFtUHJvZmlsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURUFNX1BST0ZJTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHRlYW1Qcm9maWxlRUNsYXNzLCBURUFNX1BST0ZJTEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fUk9MRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VQRVJfVEVBTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodGVhbVByb2ZpbGVFQ2xhc3MsIFRFQU1fUFJPRklMRV9fU1VCX1RFQU0pOwotCi0JCXRlbXBsYXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFRFTVBMQVRFKTsKLQotCQl0ZXJtRGVmaW5pdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhURVJNX0RFRklOSVRJT04pOwotCi0JCXRvb2xFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoVE9PTCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUodG9vbEVDbGFzcywgVE9PTF9fR1JPVVAyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh0b29sRUNsYXNzLCBUT09MX19UT09MX01FTlRPUik7Ci0KLQkJdG9vbE1lbnRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhUT09MX01FTlRPUik7Ci0KLQkJd2hpdGVwYXBlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXSElURVBBUEVSKTsKLQotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX0JSRUFLRE9XTl9FTEVNRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1IpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtCcmVha2Rvd25FbGVtZW50RUNsYXNzLCBXT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19PTkdPSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRSk7Ci0KLQkJd29ya0RlZmluaXRpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19ERUZJTklUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtEZWZpbml0aW9uRUNsYXNzLCBXT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT04pOwotCi0JCXdvcmtPcmRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX09SREVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0lEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrT3JkZXJFQ2xhc3MsIFdPUktfT1JERVJfX0xJTktfVFlQRSk7Ci0KLQkJd29ya1Byb2R1Y3RFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19HUk9VUDIpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX0VTVElNQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19SRVBPUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RUNsYXNzLCBXT1JLX1BST0RVQ1RfX1RFTVBMQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdEVDbGFzcywgV09SS19QUk9EVUNUX19UT09MX01FTlRPUik7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhXT1JLX1BST0RVQ1RfREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORyk7Ci0KLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFdPUktfUFJPRFVDVF9ERVNDUklQVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19XT1JLX1BST0RVQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE8pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8pOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLCBXT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIFdPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFKTsKLQotCQl3b3JrUHJvZHVjdFR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoV09SS19QUk9EVUNUX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywgV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJdmFyaWFiaWxpdHlUeXBlRUVudW0gPSBjcmVhdGVFRW51bShWQVJJQUJJTElUWV9UWVBFKTsKLQkJd29ya09yZGVyVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oV09SS19PUkRFUl9UWVBFKTsKLQotCQkvLyBDcmVhdGUgZGF0YSB0eXBlcwotCQl2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUgPSBjcmVhdGVFRGF0YVR5cGUoVkFSSUFCSUxJVFlfVFlQRV9PQkpFQ1QpOwotCQl3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKFdPUktfT1JERVJfVFlQRV9PQkpFQ1QpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlhY3Rpdml0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQlhY3Rpdml0eURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKCkpOwotCQlhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFBhY2thZ2VhYmxlRWxlbWVudCgpKTsKLQkJYXJ0aWZhY3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdCgpKTsKLQkJYXJ0aWZhY3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb24oKSk7Ci0JCWJyZWFrZG93bkVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzRWxlbWVudCgpKTsKLQkJYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQljYXBhYmlsaXR5UGF0dGVybkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3MoKSk7Ci0JCWNoZWNrbGlzdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQljb21wb3NpdGVSb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZURlc2NyaXB0b3IoKSk7Ci0JCWNvbmNlcHRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJY29uc3RyYWludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRDYXRlZ29yeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRFbGVtZW50KCkpOwotCQljb250ZW50Q2F0ZWdvcnlQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJY29udGVudERlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJY29udGVudEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCWNvbnRlbnRQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJY3VzdG9tQ2F0ZWdvcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWRlbGl2ZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCWRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NEZXNjcmlwdGlvbigpKTsKLQkJZGVzY3JpYmFibGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJZGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCWRlc2NyaXB0b3JEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbigpKTsKLQkJZGlzY2lwbGluZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQlkb21haW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCWVzdGltYXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWVzdGltYXRpbmdNZXRyaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWV4YW1wbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJZ3VpZGFuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJZ3VpZGVsaW5lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCWl0ZXJhdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFjdGl2aXR5KCkpOwotCQlraW5kRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCW1ldGhvZENvbmZpZ3VyYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UGFja2FnZWFibGVFbGVtZW50KCkpOwotCQltZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQYWNrYWdlYWJsZUVsZW1lbnQoKSk7Ci0JCW1ldGhvZExpYnJhcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRNZXRob2RVbml0KCkpOwotCQltZXRob2RQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJbWV0aG9kUGx1Z2luRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kVW5pdCgpKTsKLQkJbWV0aG9kVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCW1pbGVzdG9uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFdvcmtCcmVha2Rvd25FbGVtZW50KCkpOwotCQluYW1lZEVsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFbGVtZW50KCkpOwotCQlvdXRjb21lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0V29ya1Byb2R1Y3QoKSk7Ci0JCXBhY2thZ2VhYmxlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE5hbWVkRWxlbWVudCgpKTsKLQkJcGhhc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJcGxhbm5pbmdEYXRhRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSk7Ci0JCXByYWN0aWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RGVzY3JpcHRpb24oKSk7Ci0JCXByb2Nlc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBY3Rpdml0eSgpKTsKLQkJcHJvY2Vzc0NvbXBvbmVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFByb2Nlc3NQYWNrYWdlKCkpOwotCQlwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QnJlYWtkb3duRWxlbWVudCgpKTsKLQkJcHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbigpKTsKLQkJcHJvY2Vzc0VsZW1lbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREZXNjcmliYWJsZUVsZW1lbnQoKSk7Ci0JCXByb2Nlc3NQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpKTsKLQkJcHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRQcm9jZXNzKCkpOwotCQlyZXBvcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRHdWlkYW5jZSgpKTsKLQkJcmV1c2FibGVBc3NldEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQlyb2FkbWFwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXJvbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJcm9sZURlc2NyaXB0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkpOwotCQlyb2xlRGVzY3JpcHRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERlc2NyaXB0b3IoKSk7Ci0JCXJvbGVTZXRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50Q2F0ZWdvcnkoKSk7Ci0JCXJvbGVTZXRHcm91cGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpKTsKLQkJc2VjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldE1ldGhvZEVsZW1lbnQoKSk7Ci0JCXN1cHBvcnRpbmdNYXRlcmlhbEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0YXNrRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudEVsZW1lbnQoKSk7Ci0JCXRhc2tEZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJdGFza0Rlc2NyaXB0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRXb3JrQnJlYWtkb3duRWxlbWVudCgpKTsKLQkJdGVhbVByb2ZpbGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCkpOwotCQl0ZW1wbGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0ZXJtRGVmaW5pdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEd1aWRhbmNlKCkpOwotCQl0b29sRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCQl0b29sTWVudG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0R3VpZGFuY2UoKSk7Ci0JCXdoaXRlcGFwZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb25jZXB0KCkpOwotCQl3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEJyZWFrZG93bkVsZW1lbnQoKSk7Ci0JCXdvcmtEZWZpbml0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0TWV0aG9kRWxlbWVudCgpKTsKLQkJd29ya1Byb2R1Y3RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb250ZW50RWxlbWVudCgpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKLQkJd29ya1Byb2R1Y3REZXNjcmlwdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RGVzY3JpcHRvcigpKTsKLQkJd29ya1Byb2R1Y3RUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29udGVudENhdGVnb3J5KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlFQ2xhc3MsIEFjdGl2aXR5LmNsYXNzLCAiQWN0aXZpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X1ByZWNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Qb3N0Y29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicG9zdGNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSwgdGhpcy5nZXRCcmVha2Rvd25FbGVtZW50KCksIG51bGwsICJicmVha2Rvd25FbGVtZW50IiwgbnVsbCwgMCwgLTEsIEFjdGl2aXR5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBY3Rpdml0eV9Sb2FkbWFwKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9hZG1hcCIsIG51bGwsIDAsIC0xLCBBY3Rpdml0eS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5X0lzRW5hY3RhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzRW5hY3RhYmxlIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlfVmFyaWFiaWxpdHlUeXBlKCksIHRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksICJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAwLCAxLCBBY3Rpdml0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWN0aXZpdHlEZXNjcmlwdGlvbkVDbGFzcywgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIkFjdGl2aXR5RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWx0ZXJuYXRpdmVzIiwgbnVsbCwgMCwgMSwgQWN0aXZpdHlEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWN0aXZpdHlEZXNjcmlwdGlvbl9Ib3dUb1N0YWZmKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaG93VG9TdGFmZiIsIG51bGwsIDAsIDEsIEFjdGl2aXR5RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fUHVycG9zZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1cnBvc2UiLCBudWxsLCAwLCAxLCBBY3Rpdml0eURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXBwbGljYWJsZU1ldGFDbGFzc0luZm9FQ2xhc3MsIEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvLmNsYXNzLCAiQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1ByaW1hcnlFeHRlbnNpb24iLCBudWxsLCAwLCAxLCBBcHBsaWNhYmxlTWV0YUNsYXNzSW5mby5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXJ0aWZhY3RFQ2xhc3MsIEFydGlmYWN0LmNsYXNzLCAiQXJ0aWZhY3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0X0dyb3VwMygpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAzIiwgbnVsbCwgMCwgLTEsIEFydGlmYWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3QoKSwgdGhpcy5nZXRBcnRpZmFjdCgpLCBudWxsLCAiY29udGFpbmVkQXJ0aWZhY3QiLCBudWxsLCAwLCAtMSwgQXJ0aWZhY3QuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAiQXJ0aWZhY3REZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJicmllZk91dGxpbmUiLCBudWxsLCAwLCAxLCBBcnRpZmFjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcHJlc2VudGF0aW9uT3B0aW9ucyIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0RGVzY3JpcHRpb25fUmVwcmVzZW50YXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXByZXNlbnRhdGlvbiIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFydGlmYWN0RGVzY3JpcHRpb25fTm90YXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJub3RhdGlvbiIsIG51bGwsIDAsIDEsIEFydGlmYWN0RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhicmVha2Rvd25FbGVtZW50RUNsYXNzLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAiQnJlYWtkb3duRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRBZnRlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRlZEFmdGVyIiwgbnVsbCwgMCwgMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVzZW50ZWRCZWZvcmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVzZW50ZWRCZWZvcmUiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBsYW5uaW5nRGF0YSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfU3VwZXJBY3Rpdml0eSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cGVyQWN0aXZpdHkiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0dyb3VwMSgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAxIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0NoZWNrbGlzdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoZWNrbGlzdCIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Db25jZXB0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29uY2VwdCIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9FeGFtcGxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXhhbXBsZSIsIG51bGwsIDAsIC0xLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9HdWlkZWxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJndWlkZWxpbmUiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfUmV1c2FibGVBc3NldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJldXNhYmxlQXNzZXQiLCBudWxsLCAwLCAtMSwgQnJlYWtkb3duRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3VwcG9ydGluZ01hdGVyaWFsIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X1doaXRlcGFwZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3aGl0ZXBhcGVyIiwgbnVsbCwgMCwgLTEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaGFzTXVsdGlwbGVPY2N1cnJlbmNlcyIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9Jc09wdGlvbmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzT3B0aW9uYWwiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnRfSXNQbGFubmVkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzUGxhbm5lZCIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcmVmaXgiLCBudWxsLCAwLCAxLCBCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uRUNsYXNzLCBCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24uY2xhc3MsICJCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbl9Vc2FnZUd1aWRhbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidXNhZ2VHdWlkYW5jZSIsIG51bGwsIDAsIDEsIEJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNhcGFiaWxpdHlQYXR0ZXJuRUNsYXNzLCBDYXBhYmlsaXR5UGF0dGVybi5jbGFzcywgIkNhcGFiaWxpdHlQYXR0ZXJuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoY2hlY2tsaXN0RUNsYXNzLCBDaGVja2xpc3QuY2xhc3MsICJDaGVja2xpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhjb21wb3NpdGVSb2xlRUNsYXNzLCBDb21wb3NpdGVSb2xlLmNsYXNzLCAiQ29tcG9zaXRlUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29tcG9zaXRlUm9sZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBDb21wb3NpdGVSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29tcG9zaXRlUm9sZV9BZ2dyZWdhdGVkUm9sZSgpLCB0aGlzLmdldFJvbGUoKSwgbnVsbCwgImFnZ3JlZ2F0ZWRSb2xlIiwgbnVsbCwgMCwgLTEsIENvbXBvc2l0ZVJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb25jZXB0RUNsYXNzLCBDb25jZXB0LmNsYXNzLCAiQ29uY2VwdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnN0cmFpbnRFQ2xhc3MsIENvbnN0cmFpbnQuY2xhc3MsICJDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb25zdHJhaW50X01haW5EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1haW5EZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbnN0cmFpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50Q2F0ZWdvcnlFQ2xhc3MsIENvbnRlbnRDYXRlZ29yeS5jbGFzcywgIkNvbnRlbnRDYXRlZ29yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsICJDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpLCB0aGlzLmdldENvbnRlbnRDYXRlZ29yeSgpLCBudWxsLCAiY29udGVudENhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRDYXRlZ29yeVBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb250ZW50RGVzY3JpcHRpb25FQ2xhc3MsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIkNvbnRlbnREZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1haW5EZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudERlc2NyaXB0aW9uX0tleUNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAia2V5Q29uc2lkZXJhdGlvbnMiLCBudWxsLCAwLCAxLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9uKCksIHRoaXMuZ2V0U2VjdGlvbigpLCBudWxsLCAic2VjdGlvbiIsIG51bGwsIDAsIC0xLCBDb250ZW50RGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnREZXNjcmlwdGlvbl9FeHRlcm5hbElkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXh0ZXJuYWxJZCIsIG51bGwsIDAsIDEsIENvbnRlbnREZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbnRlbnRFbGVtZW50RUNsYXNzLCBDb250ZW50RWxlbWVudC5jbGFzcywgIkNvbnRlbnRFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0NoZWNrbGlzdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNoZWNrbGlzdCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb25jZXB0IiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfRXhhbXBsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4YW1wbGUiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9HdWlkZWxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJndWlkZWxpbmUiLCBudWxsLCAwLCAtMSwgQ29udGVudEVsZW1lbnQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2FibGVBc3NldCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1N1cHBvcnRpbmdNYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1cHBvcnRpbmdNYXRlcmlhbCIsIG51bGwsIDAsIC0xLCBDb250ZW50RWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRFbGVtZW50X1doaXRlcGFwZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3aGl0ZXBhcGVyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiLCBudWxsLCAwLCAxLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksIHRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksICJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAwLCAxLCBDb250ZW50RWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoY29udGVudFBhY2thZ2VFQ2xhc3MsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAiQ29udGVudFBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIENvbnRlbnRQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSwgdGhpcy5nZXRDb250ZW50RWxlbWVudCgpLCBudWxsLCAiY29udGVudEVsZW1lbnQiLCBudWxsLCAwLCAtMSwgQ29udGVudFBhY2thZ2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjdXN0b21DYXRlZ29yeUVDbGFzcywgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICJDdXN0b21DYXRlZ29yeSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRlZ29yaXplZEVsZW1lbnQiLCBudWxsLCAwLCAtMSwgQ3VzdG9tQ2F0ZWdvcnkuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRDdXN0b21DYXRlZ29yeV9TdWJDYXRlZ29yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1YkNhdGVnb3J5IiwgbnVsbCwgMCwgLTEsIEN1c3RvbUNhdGVnb3J5LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlbGl2ZXJhYmxlRUNsYXNzLCBEZWxpdmVyYWJsZS5jbGFzcywgIkRlbGl2ZXJhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyYWJsZV9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBEZWxpdmVyYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlX0RlbGl2ZXJlZFdvcmtQcm9kdWN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVsaXZlcmVkV29ya1Byb2R1Y3QiLCBudWxsLCAwLCAtMSwgRGVsaXZlcmFibGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcmFibGVEZXNjcmlwdGlvbkVDbGFzcywgRGVsaXZlcmFibGVEZXNjcmlwdGlvbi5jbGFzcywgIkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJhYmxlRGVzY3JpcHRpb25fRXh0ZXJuYWxEZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImV4dGVybmFsRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX1BhY2thZ2luZ0d1aWRhbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFja2FnaW5nR3VpZGFuY2UiLCBudWxsLCAwLCAxLCBEZWxpdmVyYWJsZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICJEZWxpdmVyeVByb2Nlc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwNCIsIG51bGwsIDAsIC0xLCBEZWxpdmVyeVByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NfQ29tbXVuaWNhdGlvbnNNYXRlcmlhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbW11bmljYXRpb25zTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZWR1Y2F0aW9uTWF0ZXJpYWwiLCBudWxsLCAwLCAtMSwgRGVsaXZlcnlQcm9jZXNzLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbi5jbGFzcywgIkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjYWxlIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RDaGFyYWN0ZXJpc3RpY3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Jpc2tMZXZlbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJpc2tMZXZlbCIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGluZ1RlY2huaXF1ZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Qcm9qZWN0TWVtYmVyRXhwZXJ0aXNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvamVjdE1lbWJlckV4cGVydGlzZSIsIG51bGwsIDAsIDEsIERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9UeXBlT2ZDb250cmFjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGVPZkNvbnRyYWN0IiwgbnVsbCwgMCwgMSwgRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmliYWJsZUVsZW1lbnRFQ2xhc3MsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIkRlc2NyaWJhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1ByZXNlbnRhdGlvbigpLCB0aGlzLmdldENvbnRlbnREZXNjcmlwdGlvbigpLCBudWxsLCAicHJlc2VudGF0aW9uIiwgbnVsbCwgMCwgMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfRnVsZmlsbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImZ1bGZpbGwiLCBudWxsLCAwLCAtMSwgRGVzY3JpYmFibGVFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpYmFibGVFbGVtZW50X0lzQWJzdHJhY3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNBYnN0cmFjdCIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmliYWJsZUVsZW1lbnRfTm9kZWljb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJub2RlaWNvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpYmFibGVFbGVtZW50X1NoYXBlaWNvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNoYXBlaWNvbiIsIG51bGwsIDAsIDEsIERlc2NyaWJhYmxlRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRlc2NyaXB0b3JFQ2xhc3MsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3IuY2xhc3MsICJEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLCBudWxsLCAwLCAxLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGVzY3JpcHRvckRlc2NyaXB0aW9uX1JlZmluZWREZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlZmluZWREZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIERlc2NyaXB0b3JEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRpc2NpcGxpbmVFQ2xhc3MsIERpc2NpcGxpbmUuY2xhc3MsICJEaXNjaXBsaW5lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lX1Rhc2soKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0YXNrIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREaXNjaXBsaW5lX1N1YkRpc2NpcGxpbmUoKSwgdGhpcy5nZXREaXNjaXBsaW5lKCksIG51bGwsICJzdWJEaXNjaXBsaW5lIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERpc2NpcGxpbmVfUmVmZXJlbmNlV29ya2Zsb3coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZlcmVuY2VXb3JrZmxvdyIsIG51bGwsIDAsIC0xLCBEaXNjaXBsaW5lLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGRpc2NpcGxpbmVHcm91cGluZ0VDbGFzcywgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAiRGlzY2lwbGluZUdyb3VwaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXREaXNjaXBsaW5lR3JvdXBpbmdfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgRGlzY2lwbGluZUdyb3VwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RGlzY2lwbGluZUdyb3VwaW5nX0Rpc2NpcGxpbmUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaXNjaXBsaW5lIiwgbnVsbCwgMCwgLTEsIERpc2NpcGxpbmVHcm91cGluZy5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkb2N1bWVudFJvb3RFQ2xhc3MsIERvY3VtZW50Um9vdC5jbGFzcywgIkRvY3VtZW50Um9vdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9jdW1lbnRSb290X01peGVkKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJtaXhlZCIsIG51bGwsIDAsIC0xLCBudWxsLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X1hNTE5TUHJlZml4TWFwKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSgpLCBudWxsLCAieE1MTlNQcmVmaXhNYXAiLCBudWxsLCAwLCAtMSwgbnVsbCwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfWFNJU2NoZW1hTG9jYXRpb24oKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmdUb1N0cmluZ01hcEVudHJ5KCksIG51bGwsICJ4U0lTY2hlbWFMb2NhdGlvbiIsIG51bGwsIDAsIC0xLCBudWxsLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvY3VtZW50Um9vdF9NZXRob2RDb25maWd1cmF0aW9uKCksIHRoaXMuZ2V0TWV0aG9kQ29uZmlndXJhdGlvbigpLCBudWxsLCAibWV0aG9kQ29uZmlndXJhdGlvbiIsIG51bGwsIDAsIC0yLCBudWxsLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpLCB0aGlzLmdldE1ldGhvZExpYnJhcnkoKSwgbnVsbCwgIm1ldGhvZExpYnJhcnkiLCBudWxsLCAwLCAtMiwgbnVsbCwgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RG9jdW1lbnRSb290X01ldGhvZFBsdWdpbigpLCB0aGlzLmdldE1ldGhvZFBsdWdpbigpLCBudWxsLCAibWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTIsIG51bGwsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhkb21haW5FQ2xhc3MsIERvbWFpbi5jbGFzcywgIkRvbWFpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RG9tYWluX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldERvbWFpbl9Xb3JrUHJvZHVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIndvcmtQcm9kdWN0IiwgbnVsbCwgMCwgLTEsIERvbWFpbi5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldERvbWFpbl9TdWJkb21haW4oKSwgdGhpcy5nZXREb21haW4oKSwgbnVsbCwgInN1YmRvbWFpbiIsIG51bGwsIDAsIC0xLCBEb21haW4uY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhlbGVtZW50RUNsYXNzLCBFbGVtZW50LmNsYXNzLCAiRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGVzdGltYXRlRUNsYXNzLCBFc3RpbWF0ZS5jbGFzcywgIkVzdGltYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFc3RpbWF0ZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBFc3RpbWF0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVzdGltYXRlX0VzdGltYXRpb25NZXRyaWMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJlc3RpbWF0aW9uTWV0cmljIiwgbnVsbCwgMCwgLTEsIEVzdGltYXRlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIEVzdGltYXRlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVzdGltYXRpbmdNZXRyaWNFQ2xhc3MsIEVzdGltYXRpbmdNZXRyaWMuY2xhc3MsICJFc3RpbWF0aW5nTWV0cmljIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zRUNsYXNzLCBFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMuY2xhc3MsICJFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhleGFtcGxlRUNsYXNzLCBFeGFtcGxlLmNsYXNzLCAiRXhhbXBsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGd1aWRhbmNlRUNsYXNzLCBHdWlkYW5jZS5jbGFzcywgIkd1aWRhbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGFuY2VEZXNjcmlwdGlvbkVDbGFzcywgR3VpZGFuY2VEZXNjcmlwdGlvbi5jbGFzcywgIkd1aWRhbmNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEd1aWRhbmNlRGVzY3JpcHRpb25fQXR0YWNobWVudCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dGFjaG1lbnQiLCBudWxsLCAwLCAxLCBHdWlkYW5jZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZ3VpZGVsaW5lRUNsYXNzLCBHdWlkZWxpbmUuY2xhc3MsICJHdWlkZWxpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhpdGVyYXRpb25FQ2xhc3MsIEl0ZXJhdGlvbi5jbGFzcywgIkl0ZXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGtpbmRFQ2xhc3MsIEtpbmQuY2xhc3MsICJLaW5kIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRLaW5kX0FwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLCBudWxsLCAwLCAtMSwgS2luZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RDb25maWd1cmF0aW9uRUNsYXNzLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAiTWV0aG9kQ29uZmlndXJhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhc2VDb25maWd1cmF0aW9uIiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1ldGhvZFBsdWdpblNlbGVjdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kUGFja2FnZVNlbGVjdGlvbiIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlZmF1bHRWaWV3IiwgbnVsbCwgMCwgMSwgTWV0aG9kQ29uZmlndXJhdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9Qcm9jZXNzVmlldygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByb2Nlc3NWaWV3IiwgbnVsbCwgMCwgLTEsIE1ldGhvZENvbmZpZ3VyYXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RDb25maWd1cmF0aW9uX1N1YnRyYWN0ZWRDYXRlZ29yeSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInN1YnRyYWN0ZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9BZGRlZENhdGVnb3J5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWRkZWRDYXRlZ29yeSIsIG51bGwsIDAsIC0xLCBNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRFQ2xhc3MsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICJNZXRob2RFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0dyb3VwKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cCIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSwgdGhpcy5nZXRDb25zdHJhaW50KCksIG51bGwsICJvd25lZFJ1bGUiLCBudWxsLCAwLCAtMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwgdGhpcy5nZXRNZXRob2RFbGVtZW50UHJvcGVydHkoKSwgbnVsbCwgIm1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsIG51bGwsIDAsIC0xLCBNZXRob2RFbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X0JyaWVmRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJicmllZkRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgTWV0aG9kRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3JkZXJpbmdHdWlkZSIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZEVsZW1lbnRfUHJlc2VudGF0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZXNlbnRhdGlvbk5hbWUiLCBudWxsLCAwLCAxLCBNZXRob2RFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50X1N1cHByZXNzZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAic3VwcHJlc3NlZCIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZEVsZW1lbnRQcm9wZXJ0eUVDbGFzcywgTWV0aG9kRWxlbWVudFByb3BlcnR5LmNsYXNzLCAiTWV0aG9kRWxlbWVudFByb3BlcnR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RFbGVtZW50UHJvcGVydHlfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIE1ldGhvZEVsZW1lbnRQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKG1ldGhvZExpYnJhcnlFQ2xhc3MsIE1ldGhvZExpYnJhcnkuY2xhc3MsICJNZXRob2RMaWJyYXJ5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRNZXRob2RMaWJyYXJ5X01ldGhvZFBsdWdpbigpLCB0aGlzLmdldE1ldGhvZFBsdWdpbigpLCBudWxsLCAibWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kQ29uZmlndXJhdGlvbigpLCB0aGlzLmdldE1ldGhvZENvbmZpZ3VyYXRpb24oKSwgbnVsbCwgIm1ldGhvZENvbmZpZ3VyYXRpb24iLCBudWxsLCAwLCAtMSwgTWV0aG9kTGlicmFyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbCIsIG51bGwsIDAsIDEsIE1ldGhvZExpYnJhcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQYWNrYWdlRUNsYXNzLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAiTWV0aG9kUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmV1c2VkUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0TWV0aG9kUGFja2FnZV9NZXRob2RQYWNrYWdlKCksIHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLCBudWxsLCAibWV0aG9kUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJnbG9iYWwiLCBudWxsLCAwLCAxLCBNZXRob2RQYWNrYWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhtZXRob2RQbHVnaW5FQ2xhc3MsIE1ldGhvZFBsdWdpbi5jbGFzcywgIk1ldGhvZFBsdWdpbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kUGx1Z2luX1JlZmVyZW5jZWRNZXRob2RQbHVnaW4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZlcmVuY2VkTWV0aG9kUGx1Z2luIiwgbnVsbCwgMCwgLTEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldE1ldGhvZFBsdWdpbl9NZXRob2RQYWNrYWdlKCksIHRoaXMuZ2V0TWV0aG9kUGFja2FnZSgpLCBudWxsLCAibWV0aG9kUGFja2FnZSIsIG51bGwsIDAsIC0xLCBNZXRob2RQbHVnaW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFBsdWdpbl9Vc2VyQ2hhbmdlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJ1c2VyQ2hhbmdlYWJsZSIsIG51bGwsIDAsIDEsIE1ldGhvZFBsdWdpbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWV0aG9kVW5pdEVDbGFzcywgTWV0aG9kVW5pdC5jbGFzcywgIk1ldGhvZFVuaXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfQ29weXJpZ2h0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29weXJpZ2h0IiwgbnVsbCwgMCwgMSwgTWV0aG9kVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWV0aG9kVW5pdF9BdXRob3JzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXV0aG9ycyIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXREYXRlVGltZSgpLCAiY2hhbmdlRGF0ZSIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjaGFuZ2VEZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIE1ldGhvZFVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1ldGhvZFVuaXRfVmVyc2lvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZlcnNpb24iLCBudWxsLCAwLCAxLCBNZXRob2RVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MobWlsZXN0b25lRUNsYXNzLCBNaWxlc3RvbmUuY2xhc3MsICJNaWxlc3RvbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldE1pbGVzdG9uZV9SZXF1aXJlZFJlc3VsdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlcXVpcmVkUmVzdWx0IiwgbnVsbCwgMCwgLTEsIE1pbGVzdG9uZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhuYW1lZEVsZW1lbnRFQ2xhc3MsIE5hbWVkRWxlbWVudC5jbGFzcywgIk5hbWVkRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TmFtZWRFbGVtZW50X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTmFtZWRFbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mob3V0Y29tZUVDbGFzcywgT3V0Y29tZS5jbGFzcywgIk91dGNvbWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MsIFBhY2thZ2VhYmxlRWxlbWVudC5jbGFzcywgIlBhY2thZ2VhYmxlRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBoYXNlRUNsYXNzLCBQaGFzZS5jbGFzcywgIlBoYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocGxhbm5pbmdEYXRhRUNsYXNzLCBQbGFubmluZ0RhdGEuY2xhc3MsICJQbGFubmluZ0RhdGEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9GaW5pc2hEYXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldERhdGVUaW1lKCksICJmaW5pc2hEYXRlIiwgbnVsbCwgMCwgMSwgUGxhbm5pbmdEYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQbGFubmluZ0RhdGFfUmFuaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJhbmsiLCBudWxsLCAwLCAxLCBQbGFubmluZ0RhdGEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgInN0YXJ0RGF0ZSIsIG51bGwsIDAsIDEsIFBsYW5uaW5nRGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByYWN0aWNlRUNsYXNzLCBQcmFjdGljZS5jbGFzcywgIlByYWN0aWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlX0FjdGl2aXR5UmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWN0aXZpdHlSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgUHJhY3RpY2UuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29udGVudFJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCBQcmFjdGljZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByYWN0aWNlX1N1YlByYWN0aWNlKCksIHRoaXMuZ2V0UHJhY3RpY2UoKSwgbnVsbCwgInN1YlByYWN0aWNlIiwgbnVsbCwgMCwgLTEsIFByYWN0aWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJhY3RpY2VEZXNjcmlwdGlvbkVDbGFzcywgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIlByYWN0aWNlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQWRkaXRpb25hbEluZm8oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsSW5mbyIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQXBwbGljYXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhcHBsaWNhdGlvbiIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByYWN0aWNlRGVzY3JpcHRpb25fQmFja2dyb3VuZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImJhY2tncm91bmQiLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX0dvYWxzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZ29hbHMiLCBudWxsLCAwLCAxLCBQcmFjdGljZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcmFjdGljZURlc2NyaXB0aW9uX0xldmVsc09mQWRvcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJsZXZlbHNPZkFkb3B0aW9uIiwgbnVsbCwgMCwgMSwgUHJhY3RpY2VEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Qcm9ibGVtKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvYmxlbSIsIG51bGwsIDAsIDEsIFByYWN0aWNlRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzRUNsYXNzLCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzLmNsYXNzLCAiUHJvY2VzcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc19JbmNsdWRlc1BhdHRlcm4oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbmNsdWRlc1BhdHRlcm4iLCBudWxsLCAwLCAtMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfRGVmYXVsdENvbnRleHQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWZhdWx0Q29udGV4dCIsIG51bGwsIDAsIDEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NfVmFsaWRDb250ZXh0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsaWRDb250ZXh0IiwgbnVsbCwgMCwgLTEsIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzX0RpYWdyYW1VUkkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaWFncmFtVVJJIiwgbnVsbCwgMCwgMSwgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICJQcm9jZXNzQ29tcG9uZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X0NvcHlyaWdodCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvcHlyaWdodCIsIG51bGwsIDAsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NDb21wb25lbnRfSW50ZXJmYWNlKCksIHRoaXMuZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSgpLCBudWxsLCAiaW50ZXJmYWNlIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksIHRoaXMuZ2V0UHJvY2VzcygpLCBudWxsLCAicHJvY2VzcyIsIG51bGwsIDEsIDEsIFByb2Nlc3NDb21wb25lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF1dGhvcnMiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0RGF0ZVRpbWUoKSwgImNoYW5nZURhdGUiLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X0NoYW5nZURlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2hhbmdlRGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBQcm9jZXNzQ29tcG9uZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50X1ZlcnNpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2ZXJzaW9uIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0NvbXBvbmVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VFQ2xhc3MsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICJQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZVNwZWNpZmljYXRpb24oKSwgdGhpcy5nZXRUYXNrRGVzY3JpcHRvcigpLCBudWxsLCAiaW50ZXJmYWNlU3BlY2lmaWNhdGlvbiIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlX0ludGVyZmFjZUlPKCksIHRoaXMuZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yKCksIG51bGwsICJpbnRlcmZhY2VJTyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc0Rlc2NyaXB0aW9uRUNsYXNzLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICJQcm9jZXNzRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NEZXNjcmlwdGlvbl9TY29wZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjb3BlIiwgbnVsbCwgMCwgMSwgUHJvY2Vzc0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInVzYWdlTm90ZXMiLCBudWxsLCAwLCAxLCBQcm9jZXNzRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhwcm9jZXNzRWxlbWVudEVDbGFzcywgUHJvY2Vzc0VsZW1lbnQuY2xhc3MsICJQcm9jZXNzRWxlbWVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHByb2Nlc3NQYWNrYWdlRUNsYXNzLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIlByb2Nlc3NQYWNrYWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRQcm9jZXNzUGFja2FnZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFByb2Nlc3NQYWNrYWdlX1Byb2Nlc3NFbGVtZW50KCksIHRoaXMuZ2V0UHJvY2Vzc0VsZW1lbnQoKSwgbnVsbCwgInByb2Nlc3NFbGVtZW50IiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQYWNrYWdlLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVFQ2xhc3MsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAiUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlX0dyb3VwNCgpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXA0IiwgbnVsbCwgMCwgLTEsIFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfQmFzZVByb2Nlc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJiYXNlUHJvY2VzcyIsIG51bGwsIDAsIC0xLCBQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhyZXBvcnRFQ2xhc3MsIFJlcG9ydC5jbGFzcywgIlJlcG9ydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHJldXNhYmxlQXNzZXRFQ2xhc3MsIFJldXNhYmxlQXNzZXQuY2xhc3MsICJSZXVzYWJsZUFzc2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mocm9hZG1hcEVDbGFzcywgUm9hZG1hcC5jbGFzcywgIlJvYWRtYXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhyb2xlRUNsYXNzLCBSb2xlLmNsYXNzLCAiUm9sZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZV9SZXNwb25zaWJsZUZvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZURlc2NyaXB0aW9uRUNsYXNzLCBSb2xlRGVzY3JpcHRpb24uY2xhc3MsICJSb2xlRGVzY3JpcHRpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFzc2lnbm1lbnRBcHByb2FjaGVzIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRpb25fU2tpbGxzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2tpbGxzIiwgbnVsbCwgMCwgMSwgUm9sZURlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRpb25fU3lub255bXMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzeW5vbnltcyIsIG51bGwsIDAsIDEsIFJvbGVEZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVEZXNjcmlwdG9yRUNsYXNzLCBSb2xlRGVzY3JpcHRvci5jbGFzcywgIlJvbGVEZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicm9sZSIsIG51bGwsIDAsIDEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlRGVzY3JpcHRvcl9SZXNwb25zaWJsZUZvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlRm9yIiwgbnVsbCwgMCwgLTEsIFJvbGVEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHJvbGVTZXRFQ2xhc3MsIFJvbGVTZXQuY2xhc3MsICJSb2xlU2V0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0X0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0X1JvbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyb2xlIiwgbnVsbCwgMCwgLTEsIFJvbGVTZXQuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mocm9sZVNldEdyb3VwaW5nRUNsYXNzLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsICJSb2xlU2V0R3JvdXBpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBSb2xlU2V0R3JvdXBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlU2V0R3JvdXBpbmdfUm9sZVNldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGVTZXQiLCBudWxsLCAwLCAtMSwgUm9sZVNldEdyb3VwaW5nLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHNlY3Rpb25FQ2xhc3MsIFNlY3Rpb24uY2xhc3MsICJTZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTZWN0aW9uX1N1YlNlY3Rpb24oKSwgdGhpcy5nZXRTZWN0aW9uKCksIG51bGwsICJzdWJTZWN0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9QcmVkZWNlc3NvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWRlY2Vzc29yIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9TZWN0aW9uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNlY3Rpb25OYW1lIiwgbnVsbCwgMCwgMSwgU2VjdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U2VjdGlvbl9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIsIG51bGwsIDAsIDEsIFNlY3Rpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCksIHRoaXMuZ2V0VmFyaWFiaWxpdHlUeXBlKCksICJ2YXJpYWJpbGl0eVR5cGUiLCAibmEiLCAwLCAxLCBTZWN0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MsIFN1cHBvcnRpbmdNYXRlcmlhbC5jbGFzcywgIlN1cHBvcnRpbmdNYXRlcmlhbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHRhc2tFQ2xhc3MsIFRhc2suY2xhc3MsICJUYXNrIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1ByZWNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInByZWNvbmRpdGlvbiIsIG51bGwsIDAsIDEsIFRhc2suY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfUG9zdGNvbmRpdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBvc3Rjb25kaXRpb24iLCBudWxsLCAwLCAxLCBUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX1BlcmZvcm1lZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGVyZm9ybWVkQnkiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19PdXRwdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvdXRwdXQiLCBudWxsLCAwLCAtMSwgVGFzay5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tfQWRkaXRpb25hbGx5UGVyZm9ybWVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19PcHRpb25hbElucHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3B0aW9uYWxJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Fc3RpbWF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRlIiwgbnVsbCwgMCwgLTEsIFRhc2suY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrX0VzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza19Ub29sTWVudG9yKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidG9vbE1lbnRvciIsIG51bGwsIDAsIC0xLCBUYXNrLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHRhc2tEZXNjcmlwdGlvbkVDbGFzcywgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAiVGFza0Rlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRpb25fQWx0ZXJuYXRpdmVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWx0ZXJuYXRpdmVzIiwgbnVsbCwgMCwgMSwgVGFza0Rlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInB1cnBvc2UiLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0YXNrRGVzY3JpcHRvckVDbGFzcywgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICJUYXNrRGVzY3JpcHRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfVGFzaygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhc2siLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfUGVyZm9ybWVkUHJpbWFyaWx5QnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwZXJmb3JtZWRQcmltYXJpbHlCeSIsIG51bGwsIDAsIDEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMyIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWRkaXRpb25hbGx5UGVyZm9ybWVkQnkiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUYXNrRGVzY3JpcHRvcl9Bc3Npc3RlZEJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXNzaXN0ZWRCeSIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0V4dGVybmFsSW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYW5kYXRvcnlJbnB1dCIsIG51bGwsIDAsIC0xLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX09wdGlvbmFsSW5wdXQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcHRpb25hbElucHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGFza0Rlc2NyaXB0b3JfT3V0cHV0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib3V0cHV0IiwgbnVsbCwgMCwgLTEsIFRhc2tEZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpLCB0aGlzLmdldFNlY3Rpb24oKSwgbnVsbCwgInN0ZXAiLCBudWxsLCAwLCAtMSwgVGFza0Rlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJpc1N5bmNocm9uaXplZFdpdGhTb3VyY2UiLCBudWxsLCAwLCAxLCBUYXNrRGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3ModGVhbVByb2ZpbGVFQ2xhc3MsIFRlYW1Qcm9maWxlLmNsYXNzLCAiVGVhbVByb2ZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRlYW1Qcm9maWxlX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFRlYW1Qcm9maWxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0VGVhbVByb2ZpbGVfUm9sZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJvbGUiLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJzdXBlclRlYW0iLCBudWxsLCAwLCAtMSwgVGVhbVByb2ZpbGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRUZWFtUHJvZmlsZV9TdWJUZWFtKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic3ViVGVhbSIsIG51bGwsIDAsIC0xLCBUZWFtUHJvZmlsZS5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0ZW1wbGF0ZUVDbGFzcywgVGVtcGxhdGUuY2xhc3MsICJUZW1wbGF0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHRlcm1EZWZpbml0aW9uRUNsYXNzLCBUZXJtRGVmaW5pdGlvbi5jbGFzcywgIlRlcm1EZWZpbml0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3ModG9vbEVDbGFzcywgVG9vbC5jbGFzcywgIlRvb2wiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRvb2xfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgVG9vbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFRvb2xfVG9vbE1lbnRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRvb2xNZW50b3IiLCBudWxsLCAwLCAtMSwgVG9vbC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh0b29sTWVudG9yRUNsYXNzLCBUb29sTWVudG9yLmNsYXNzLCAiVG9vbE1lbnRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHdoaXRlcGFwZXJFQ2xhc3MsIFdoaXRlcGFwZXIuY2xhc3MsICJXaGl0ZXBhcGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3Mod29ya0JyZWFrZG93bkVsZW1lbnRFQ2xhc3MsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAiV29ya0JyZWFrZG93bkVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSwgdGhpcy5nZXRXb3JrT3JkZXIoKSwgbnVsbCwgInByZWRlY2Vzc29yIiwgbnVsbCwgMCwgLTEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc0V2ZW50RHJpdmVuKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzRXZlbnREcml2ZW4iLCBudWxsLCAwLCAxLCBXb3JrQnJlYWtkb3duRWxlbWVudC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiaXNPbmdvaW5nIiwgbnVsbCwgMCwgMSwgV29ya0JyZWFrZG93bkVsZW1lbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfSXNSZXBlYXRhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImlzUmVwZWF0YWJsZSIsIG51bGwsIDAsIDEsIFdvcmtCcmVha2Rvd25FbGVtZW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrRGVmaW5pdGlvbkVDbGFzcywgV29ya0RlZmluaXRpb24uY2xhc3MsICJXb3JrRGVmaW5pdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya0RlZmluaXRpb25fUHJlY29uZGl0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJlY29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwb3N0Y29uZGl0aW9uIiwgbnVsbCwgMCwgMSwgV29ya0RlZmluaXRpb24uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrT3JkZXJFQ2xhc3MsIFdvcmtPcmRlci5jbGFzcywgIldvcmtPcmRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya09yZGVyX1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCBXb3JrT3JkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtPcmRlcl9JZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImlkIiwgbnVsbCwgMCwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrT3JkZXJfTGlua1R5cGUoKSwgdGhpcy5nZXRXb3JrT3JkZXJUeXBlKCksICJsaW5rVHlwZSIsICJmaW5pc2hUb1N0YXJ0IiwgMCwgMSwgV29ya09yZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh3b3JrUHJvZHVjdEVDbGFzcywgV29ya1Byb2R1Y3QuY2xhc3MsICJXb3JrUHJvZHVjdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfR3JvdXAyKCksIGVjb3JlUGFja2FnZS5nZXRFRmVhdHVyZU1hcEVudHJ5KCksICJncm91cDIiLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3QuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdF9Fc3RpbWF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVzdGltYXRlIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfUmVwb3J0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVwb3J0IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3RfVGVtcGxhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0ZW1wbGF0ZSIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdC5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0b29sTWVudG9yIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0LmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVzY3JpcHRpb25FQ2xhc3MsIFdvcmtQcm9kdWN0RGVzY3JpcHRpb24uY2xhc3MsICJXb3JrUHJvZHVjdERlc2NyaXB0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX0ltcGFjdE9mTm90SGF2aW5nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW1wYWN0T2ZOb3RIYXZpbmciLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0aW9uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1B1cnBvc2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwdXJwb3NlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdGlvbl9SZWFzb25zRm9yTm90TmVlZGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlYXNvbnNGb3JOb3ROZWVkaW5nIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdGlvbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHdvcmtQcm9kdWN0RGVzY3JpcHRvckVDbGFzcywgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAiV29ya1Byb2R1Y3REZXNjcmlwdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JrUHJvZHVjdCIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1Jlc3BvbnNpYmxlUm9sZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3BvbnNpYmxlUm9sZSIsIG51bGwsIDAsIDEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0dyb3VwMigpLCBlY29yZVBhY2thZ2UuZ2V0RUZlYXR1cmVNYXBFbnRyeSgpLCAiZ3JvdXAyIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJleHRlcm5hbElucHV0VG8iLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbXBhY3RlZEJ5IiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiaW1wYWN0cyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hbmRhdG9yeUlucHV0VG8iLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX09wdGlvbmFsSW5wdXRUbygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9wdGlvbmFsSW5wdXRUbyIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfT3V0cHV0RnJvbSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm91dHB1dEZyb20iLCBudWxsLCAwLCAtMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCBJU19UUkFOU0lFTlQsIElTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCBJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZWxpdmVyYWJsZVBhcnRzIiwgbnVsbCwgMCwgLTEsIFdvcmtQcm9kdWN0RGVzY3JpcHRvci5jbGFzcywgSVNfVFJBTlNJRU5ULCBJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUVudHJ5U3RhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhY3Rpdml0eUVudHJ5U3RhdGUiLCBudWxsLCAwLCAxLCBXb3JrUHJvZHVjdERlc2NyaXB0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9BY3Rpdml0eUV4aXRTdGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFjdGl2aXR5RXhpdFN0YXRlIiwgbnVsbCwgMCwgMSwgV29ya1Byb2R1Y3REZXNjcmlwdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3Mod29ya1Byb2R1Y3RUeXBlRUNsYXNzLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICJXb3JrUHJvZHVjdFR5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFdvcmtQcm9kdWN0VHlwZV9Hcm91cDIoKSwgZWNvcmVQYWNrYWdlLmdldEVGZWF0dXJlTWFwRW50cnkoKSwgImdyb3VwMiIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JrUHJvZHVjdCIsIG51bGwsIDAsIC0xLCBXb3JrUHJvZHVjdFR5cGUuY2xhc3MsIElTX1RSQU5TSUVOVCwgSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsIElTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCi0JCWluaXRFRW51bSh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLmNsYXNzLCAiVmFyaWFiaWxpdHlUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLk5BKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTKTsKLQkJYWRkRUVudW1MaXRlcmFsKHZhcmlhYmlsaXR5VHlwZUVFbnVtLCBWYXJpYWJpbGl0eVR5cGUuUkVQTEFDRVMpOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9DT05UUklCVVRJT04pOwotCQlhZGRFRW51bUxpdGVyYWwodmFyaWFiaWxpdHlUeXBlRUVudW0sIFZhcmlhYmlsaXR5VHlwZS5MT0NBTF9SRVBMQUNFTUVOVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh2YXJpYWJpbGl0eVR5cGVFRW51bSwgVmFyaWFiaWxpdHlUeXBlLkVYVEVORFNfUkVQTEFDRVMpOwotCi0JCWluaXRFRW51bSh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuY2xhc3MsICJXb3JrT3JkZXJUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuRklOSVNIX1RPX1NUQVJUKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fRklOSVNIKTsKLQkJYWRkRUVudW1MaXRlcmFsKHdvcmtPcmRlclR5cGVFRW51bSwgV29ya09yZGVyVHlwZS5TVEFSVF9UT19TVEFSVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh3b3JrT3JkZXJUeXBlRUVudW0sIFdvcmtPcmRlclR5cGUuU1RBUlRfVE9fRklOSVNIKTsKLQotCQkvLyBJbml0aWFsaXplIGRhdGEgdHlwZXMKLQkJaW5pdEVEYXRhVHlwZSh2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUsIFZhcmlhYmlsaXR5VHlwZS5jbGFzcywgIlZhcmlhYmlsaXR5VHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVEYXRhVHlwZSh3b3JrT3JkZXJUeXBlT2JqZWN0RURhdGFUeXBlLCBXb3JrT3JkZXJUeXBlLmNsYXNzLCAiV29ya09yZGVyVHlwZU9iamVjdCIsIElTX1NFUklBTElaQUJMRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIGFubm90YXRpb25zCi0JCS8vIGh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YQotCQljcmVhdGVFeHRlbmRlZE1ldGFEYXRhQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYW5ub3RhdGlvbnMgZm9yIDxiPmh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YTwvYj4uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRXh0ZW5kZWRNZXRhRGF0YUFubm90YXRpb25zKCkgewotCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly8vb3JnL2VjbGlwc2UvZW1mL2Vjb3JlL3V0aWwvRXh0ZW5kZWRNZXRhRGF0YSI7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYWN0aXZpdHlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFjdGl2aXR5IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQnJlYWtkb3duRWxlbWVudCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9Sb2FkbWFwKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvYWRtYXAiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QWN0aXZpdHlfSXNFbmFjdGFibGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJJc0VuYWN0YWJsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eV9WYXJpYWJpbGl0eVR5cGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGFjdGl2aXR5RGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFjdGl2aXR5RGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eURlc2NyaXB0aW9uX0FsdGVybmF0aXZlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBbHRlcm5hdGl2ZXMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFjdGl2aXR5RGVzY3JpcHRpb25fSG93VG9TdGFmZigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJIb3dUb1N0YWZmIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBY3Rpdml0eURlc2NyaXB0aW9uX1B1cnBvc2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHVycG9zZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQXBwbGljYWJsZU1ldGFDbGFzc0luZm8iLAotCQkJICJraW5kIiwgImVtcHR5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvX0lzUHJpbWFyeUV4dGVuc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUHJpbWFyeUV4dGVuc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoYXJ0aWZhY3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkFydGlmYWN0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdF9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEFydGlmYWN0X0NvbnRhaW5lZEFydGlmYWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRhaW5lZEFydGlmYWN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChhcnRpZmFjdERlc2NyaXB0aW9uRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJBcnRpZmFjdERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9CcmllZk91dGxpbmUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQnJpZWZPdXRsaW5lIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX1JlcHJlc2VudGF0aW9uT3B0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXByZXNlbnRhdGlvbk9wdGlvbnMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QXJ0aWZhY3REZXNjcmlwdGlvbl9SZXByZXNlbnRhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZXByZXNlbnRhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRBcnRpZmFjdERlc2NyaXB0aW9uX05vdGF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk5vdGF0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChicmVha2Rvd25FbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJCcmVha2Rvd25FbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1ByZXNlbnRlZEFmdGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRlZEFmdGVyIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfUHJlc2VudGVkQmVmb3JlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRlZEJlZm9yZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X1BsYW5uaW5nRGF0YSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQbGFubmluZ0RhdGEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBlckFjdGl2aXR5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1cGVyQWN0aXZpdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNoZWNrbGlzdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0NvbmNlcHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29uY2VwdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0V4YW1wbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXhhbXBsZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxOCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0d1aWRlbGluZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJHdWlkZWxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9TdXBwb3J0aW5nTWF0ZXJpYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwcG9ydGluZ01hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEJyZWFrZG93bkVsZW1lbnRfV2hpdGVwYXBlcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXaGl0ZXBhcGVyIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE4IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0hhc011bHRpcGxlT2NjdXJyZW5jZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJoYXNNdWx0aXBsZU9jY3VycmVuY2VzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0lzT3B0aW9uYWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc09wdGlvbmFsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRCcmVha2Rvd25FbGVtZW50X0lzUGxhbm5lZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUGxhbm5lZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudF9QcmVmaXgoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJwcmVmaXgiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0QnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uX1VzYWdlR3VpZGFuY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ1c2FnZUd1aWRhbmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjYXBhYmlsaXR5UGF0dGVybkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ2FwYWJpbGl0eVBhdHRlcm4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjaGVja2xpc3RFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNoZWNrbGlzdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbXBvc2l0ZVJvbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbXBvc2l0ZVJvbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbXBvc2l0ZVJvbGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb21wb3NpdGVSb2xlX0FnZ3JlZ2F0ZWRSb2xlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFnZ3JlZ2F0ZWRSb2xlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb25jZXB0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb25jZXB0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoY29uc3RyYWludEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29uc3RyYWludCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnN0cmFpbnRfTWFpbkRlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibWFpbkRlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250ZW50Q2F0ZWdvcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRDYXRlZ29yeVBhY2thZ2VFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRDYXRlZ29yeVBhY2thZ2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50Q2F0ZWdvcnlQYWNrYWdlX0NvbnRlbnRDYXRlZ29yeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJDb250ZW50Q2F0ZWdvcnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnREZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudERlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYWluRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnREZXNjcmlwdGlvbl9LZXlDb25zaWRlcmF0aW9ucygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJLZXlDb25zaWRlcmF0aW9ucyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTZWN0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RGVzY3JpcHRpb25fRXh0ZXJuYWxJZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImV4dGVybmFsSWQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGNvbnRlbnRFbGVtZW50RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDb250ZW50RWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfR3JvdXAxKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9DaGVja2xpc3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2hlY2tsaXN0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjE0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRFbGVtZW50X0NvbmNlcHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29uY2VwdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9FeGFtcGxlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4YW1wbGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfR3VpZGVsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkd1aWRlbGluZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9SZXVzYWJsZUFzc2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJldXNhYmxlQXNzZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfU3VwcG9ydGluZ01hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1cHBvcnRpbmdNYXRlcmlhbCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoxNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDb250ZW50RWxlbWVudF9XaGl0ZXBhcGVyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudEVsZW1lbnRfVmFyaWFiaWxpdHlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChjb250ZW50UGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiQ29udGVudFBhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldENvbnRlbnRQYWNrYWdlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q29udGVudFBhY2thZ2VfQ29udGVudEVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29udGVudEVsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGN1c3RvbUNhdGVnb3J5RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJDdXN0b21DYXRlZ29yeSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Q3VzdG9tQ2F0ZWdvcnlfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRDdXN0b21DYXRlZ29yeV9DYXRlZ29yaXplZEVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ2F0ZWdvcml6ZWRFbGVtZW50IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldEN1c3RvbUNhdGVnb3J5X1N1YkNhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YkNhdGVnb3J5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyYWJsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJhYmxlX0dyb3VwMygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVfRGVsaXZlcmVkV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVsaXZlcmVkV29ya1Byb2R1Y3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyYWJsZURlc2NyaXB0aW9uX0V4dGVybmFsRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcmFibGVEZXNjcmlwdGlvbl9QYWNrYWdpbmdHdWlkYW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQYWNrYWdpbmdHdWlkYW5jZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGVsaXZlcnlQcm9jZXNzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEZWxpdmVyeVByb2Nlc3MiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc19Hcm91cDQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjQ3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc19Db21tdW5pY2F0aW9uc01hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbW11bmljYXRpb25zTWF0ZXJpYWwiLAotCQkJICJncm91cCIsICIjZ3JvdXA6NDciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzX0VkdWNhdGlvbk1hdGVyaWFsKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVkdWNhdGlvbk1hdGVyaWFsIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjQ3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9TY2FsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTY2FsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fUHJvamVjdENoYXJhY3RlcmlzdGljcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9qZWN0Q2hhcmFjdGVyaXN0aWNzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9SaXNrTGV2ZWwoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmlza0xldmVsIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbl9Fc3RpbWF0aW5nVGVjaG5pcXVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpbmdUZWNobmlxdWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uX1Byb2plY3RNZW1iZXJFeHBlcnRpc2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvamVjdE1lbWJlckV4cGVydGlzZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25fVHlwZU9mQ29udHJhY3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVHlwZU9mQ29udHJhY3QiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaWJhYmxlRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRGVzY3JpYmFibGVFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfUHJlc2VudGF0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZXNlbnRhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREZXNjcmliYWJsZUVsZW1lbnRfRnVsZmlsbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJGdWxmaWxsIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9Jc0Fic3RyYWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNBYnN0cmFjdCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGVzY3JpYmFibGVFbGVtZW50X05vZGVpY29uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAibm9kZWljb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaWJhYmxlRWxlbWVudF9TaGFwZWljb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzaGFwZWljb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGRlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0b3JfSXNTeW5jaHJvbml6ZWRXaXRoU291cmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkZXNjcmlwdG9yRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkRlc2NyaXB0b3JEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERlc2NyaXB0b3JEZXNjcmlwdGlvbl9SZWZpbmVkRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVmaW5lZERlc2NyaXB0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChkaXNjaXBsaW5lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEaXNjaXBsaW5lIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREaXNjaXBsaW5lX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9UYXNrKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRhc2siLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9TdWJEaXNjaXBsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YkRpc2NpcGxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RGlzY2lwbGluZV9SZWZlcmVuY2VXb3JrZmxvdygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJSZWZlcmVuY2VXb3JrZmxvdyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZGlzY2lwbGluZUdyb3VwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEaXNjaXBsaW5lR3JvdXBpbmciLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVHcm91cGluZ19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERpc2NpcGxpbmVHcm91cGluZ19EaXNjaXBsaW5lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkRpc2NpcGxpbmUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZG9jdW1lbnRSb290RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICIiLAotCQkJICJraW5kIiwgIm1peGVkIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvY3VtZW50Um9vdF9NaXhlZCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50V2lsZGNhcmQiLAotCQkJICJuYW1lIiwgIjptaXhlZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfWE1MTlNQcmVmaXhNYXAoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ4bWxuczpwcmVmaXgiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RG9jdW1lbnRSb290X1hTSVNjaGVtYUxvY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAieHNpOnNjaGVtYUxvY2F0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RDb25maWd1cmF0aW9uIiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kTGlicmFyeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RMaWJyYXJ5IiwKLQkJCSAibmFtZXNwYWNlIiwgIiMjdGFyZ2V0TmFtZXNwYWNlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb2N1bWVudFJvb3RfTWV0aG9kUGx1Z2luKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIsCi0JCQkgIm5hbWVzcGFjZSIsICIjI3RhcmdldE5hbWVzcGFjZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZG9tYWluRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJEb21haW4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldERvbWFpbl9Xb3JrUHJvZHVjdCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJXb3JrUHJvZHVjdCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXREb21haW5fU3ViZG9tYWluKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YmRvbWFpbiIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVzdGltYXRlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJFc3RpbWF0ZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXN0aW1hdGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRFc3RpbWF0ZV9Fc3RpbWF0aW9uTWV0cmljKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25NZXRyaWMiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0RXN0aW1hdGVfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXN0aW1hdGluZ01ldHJpY0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXN0aW1hdGluZ01ldHJpYyIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGVzdGltYXRpb25Db25zaWRlcmF0aW9uc0VDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZXhhbXBsZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiRXhhbXBsZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGd1aWRhbmNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJHdWlkYW5jZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGd1aWRhbmNlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkd1aWRhbmNlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRHdWlkYW5jZURlc2NyaXB0aW9uX0F0dGFjaG1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXR0YWNobWVudCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ3VpZGVsaW5lRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJHdWlkZWxpbmUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChpdGVyYXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIkl0ZXJhdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoa2luZEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiS2luZCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0S2luZF9BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kQ29uZmlndXJhdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kQ29uZmlndXJhdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9CYXNlQ29uZmlndXJhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYXNlQ29uZmlndXJhdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX01ldGhvZFBsdWdpblNlbGVjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNZXRob2RQbHVnaW5TZWxlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9NZXRob2RQYWNrYWdlU2VsZWN0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBhY2thZ2VTZWxlY3Rpb24iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kQ29uZmlndXJhdGlvbl9EZWZhdWx0VmlldygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWZhdWx0VmlldyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX1Byb2Nlc3NWaWV3KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2Nlc3NWaWV3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZENvbmZpZ3VyYXRpb25fU3VidHJhY3RlZENhdGVnb3J5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlN1YnRyYWN0ZWRDYXRlZ29yeSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RDb25maWd1cmF0aW9uX0FkZGVkQ2F0ZWdvcnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWRkZWRDYXRlZ29yeSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9Hcm91cCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9Pd25lZFJ1bGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3duZWRSdWxlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9NZXRob2RFbGVtZW50UHJvcGVydHkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kRWxlbWVudFByb3BlcnR5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjEiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZEVsZW1lbnRfQnJpZWZEZXNjcmlwdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImJyaWVmRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZEVsZW1lbnRfSWQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9PcmRlcmluZ0d1aWRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAib3JkZXJpbmdHdWlkZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9QcmVzZW50YXRpb25OYW1lKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAicHJlc2VudGF0aW9uTmFtZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudF9TdXBwcmVzc2VkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAic3VwcHJlc3NlZCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChtZXRob2RFbGVtZW50UHJvcGVydHlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZEVsZW1lbnRQcm9wZXJ0eSIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kRWxlbWVudFByb3BlcnR5X1ZhbHVlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFsdWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1ldGhvZExpYnJhcnlFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk1ldGhvZExpYnJhcnkiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZExpYnJhcnlfTWV0aG9kUGx1Z2luKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1ldGhvZFBsdWdpbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RMaWJyYXJ5X01ldGhvZENvbmZpZ3VyYXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kTGlicmFyeV9Ub29sKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidG9vbCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kUGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFja2FnZV9Hcm91cDEoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGFja2FnZV9SZXVzZWRQYWNrYWdlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJldXNlZFBhY2thZ2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6OSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX01ldGhvZFBhY2thZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQYWNrYWdlX0dsb2JhbCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImdsb2JhbCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kUGx1Z2luRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJNZXRob2RQbHVnaW4iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFBsdWdpbl9SZWZlcmVuY2VkTWV0aG9kUGx1Z2luKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlZmVyZW5jZWRNZXRob2RQbHVnaW4iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kUGx1Z2luX01ldGhvZFBhY2thZ2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWV0aG9kUGFja2FnZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RQbHVnaW5fVXNlckNoYW5nZWFibGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ1c2VyQ2hhbmdlYWJsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAobWV0aG9kVW5pdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWV0aG9kVW5pdCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0TWV0aG9kVW5pdF9Db3B5cmlnaHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQ29weXJpZ2h0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0F1dGhvcnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJhdXRob3JzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0NoYW5nZURhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEYXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNZXRob2RVbml0X0NoYW5nZURlc2NyaXB0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiY2hhbmdlRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldE1ldGhvZFVuaXRfVmVyc2lvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInZlcnNpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG1pbGVzdG9uZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTWlsZXN0b25lIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRNaWxlc3RvbmVfUmVxdWlyZWRSZXN1bHQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVxdWlyZWRSZXN1bHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG5hbWVkRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiTmFtZWRFbGVtZW50IiwKLQkJCSAia2luZCIsICJlbXB0eSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXROYW1lZEVsZW1lbnRfTmFtZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgIm5hbWUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKG91dGNvbWVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIk91dGNvbWUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwYWNrYWdlYWJsZUVsZW1lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlBhY2thZ2VhYmxlRWxlbWVudCIsCi0JCQkgImtpbmQiLCAiZW1wdHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBoYXNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQaGFzZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHBsYW5uaW5nRGF0YUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUGxhbm5pbmdEYXRhIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UGxhbm5pbmdEYXRhX0ZpbmlzaERhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJmaW5pc2hEYXRlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQbGFubmluZ0RhdGFfUmFuaygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgInJhbmsiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFBsYW5uaW5nRGF0YV9TdGFydERhdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzdGFydERhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByYWN0aWNlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcmFjdGljZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9BY3Rpdml0eVJlZmVyZW5jZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBY3Rpdml0eVJlZmVyZW5jZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZV9Db250ZW50UmVmZXJlbmNlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvbnRlbnRSZWZlcmVuY2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VfU3ViUHJhY3RpY2UoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViUHJhY3RpY2UiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByYWN0aWNlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByYWN0aWNlRGVzY3JpcHRpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FkZGl0aW9uYWxJbmZvKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxJbmZvIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0FwcGxpY2F0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFwcGxpY2F0aW9uIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcmFjdGljZURlc2NyaXB0aW9uX0JhY2tncm91bmQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQmFja2dyb3VuZCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9Hb2FscygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJHb2FscyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJhY3RpY2VEZXNjcmlwdGlvbl9MZXZlbHNPZkFkb3B0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkxldmVsc09mQWRvcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByYWN0aWNlRGVzY3JpcHRpb25fUHJvYmxlbSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQcm9ibGVtIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX0luY2x1ZGVzUGF0dGVybigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbmNsdWRlc1BhdHRlcm4iCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc19EZWZhdWx0Q29udGV4dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJEZWZhdWx0Q29udGV4dCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzX1ZhbGlkQ29udGV4dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJWYWxpZENvbnRleHQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NfRGlhZ3JhbVVSSSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImRpYWdyYW1VUkkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NDb21wb25lbnRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlByb2Nlc3NDb21wb25lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ29weXJpZ2h0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkNvcHlyaWdodCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzQ29tcG9uZW50X0ludGVyZmFjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2UiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByb2Nlc3MiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQXV0aG9ycygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImF1dGhvcnMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImNoYW5nZURhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRfQ2hhbmdlRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJjaGFuZ2VEZXNjcmlwdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudF9WZXJzaW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmVyc2lvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlU3BlY2lmaWNhdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJJbnRlcmZhY2VTcGVjaWZpY2F0aW9uIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VfSW50ZXJmYWNlSU8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW50ZXJmYWNlSU8iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NEZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0Rlc2NyaXB0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc0Rlc2NyaXB0aW9uX1Njb3BlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlNjb3BlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzRGVzY3JpcHRpb25fVXNhZ2VOb3RlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJVc2FnZU5vdGVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc0VsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChwcm9jZXNzUGFja2FnZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUHJvY2Vzc1BhY2thZ2UiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFByb2Nlc3NQYWNrYWdlX0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJvY2Vzc0VsZW1lbnQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MTMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0UHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVfR3JvdXA0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDo0NyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZV9CYXNlUHJvY2VzcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJCYXNlUHJvY2VzcyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDo0NyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocmVwb3J0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSZXBvcnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyZXVzYWJsZUFzc2V0RUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSZXVzYWJsZUFzc2V0IiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9hZG1hcEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiUm9hZG1hcCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGUiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlc3BvbnNpYmxlRm9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChyb2xlRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdGlvbl9Bc3NpZ25tZW50QXBwcm9hY2hlcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJBc3NpZ25tZW50QXBwcm9hY2hlcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0aW9uX1NraWxscygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTa2lsbHMiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVEZXNjcmlwdGlvbl9TeW5vbnltcygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTeW5vbnltcyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZURlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVEZXNjcmlwdG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlRGVzY3JpcHRvcl9Sb2xlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvbGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0Um9sZURlc2NyaXB0b3JfUmVzcG9uc2libGVGb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVGb3IiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHJvbGVTZXRFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlJvbGVTZXQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRSb2xlU2V0X1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAocm9sZVNldEdyb3VwaW5nRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJSb2xlU2V0R3JvdXBpbmciLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRHcm91cGluZ19Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFJvbGVTZXRHcm91cGluZ19Sb2xlU2V0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJvbGVTZXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHNlY3Rpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlNlY3Rpb24iLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fU3ViU2VjdGlvbigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdWJTZWN0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fUHJlZGVjZXNzb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlZGVjZXNzb3IiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fRGVzY3JpcHRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVzY3JpcHRpb24iCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fU2VjdGlvbk5hbWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJzZWN0aW9uTmFtZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRTZWN0aW9uX1ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJ2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFNlY3Rpb25fVmFyaWFiaWxpdHlUeXBlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAidmFyaWFiaWxpdHlUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChzdXBwb3J0aW5nTWF0ZXJpYWxFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlN1cHBvcnRpbmdNYXRlcmlhbCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHRhc2tFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRhc2siLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfUHJlY29uZGl0aW9uKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlByZWNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX1BlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlBlcmZvcm1lZEJ5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX01hbmRhdG9yeUlucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk1hbmRhdG9yeUlucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfT3V0cHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dCIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfT3B0aW9uYWxJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfRXN0aW1hdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza19Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI3IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YXNrRGVzY3JpcHRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRhc2tEZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdGlvbl9BbHRlcm5hdGl2ZXMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQWx0ZXJuYXRpdmVzIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0YXNrRGVzY3JpcHRvckVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVGFza0Rlc2NyaXB0b3IiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX1Rhc2soKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVGFzayIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9QZXJmb3JtZWRQcmltYXJpbHlCeSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQZXJmb3JtZWRQcmltYXJpbHlCeSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9Hcm91cDMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0Fzc2lzdGVkQnkoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiQXNzaXN0ZWRCeSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozNyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUYXNrRGVzY3JpcHRvcl9FeHRlcm5hbElucHV0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkV4dGVybmFsSW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiTWFuZGF0b3J5SW5wdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfT3B0aW9uYWxJbnB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPcHRpb25hbElucHV0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjM3IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX091dHB1dCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJPdXRwdXQiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzciCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VGFza0Rlc2NyaXB0b3JfU3RlcCgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJTdGVwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRhc2tEZXNjcmlwdG9yX0lzU3luY2hyb25pemVkV2l0aFNvdXJjZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzU3luY2hyb25pemVkV2l0aFNvdXJjZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVhbVByb2ZpbGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlYW1Qcm9maWxlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUZWFtUHJvZmlsZV9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1JvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUm9sZSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRUZWFtUHJvZmlsZV9TdXBlclRlYW0oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3VwZXJUZWFtIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMwIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRlYW1Qcm9maWxlX1N1YlRlYW0oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiU3ViVGVhbSIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVtcGxhdGVFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlbXBsYXRlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodGVybURlZmluaXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlRlcm1EZWZpbml0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodG9vbEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiVG9vbCIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0VG9vbF9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFRvb2xfVG9vbE1lbnRvcigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh0b29sTWVudG9yRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJUb29sTWVudG9yIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAodmFyaWFiaWxpdHlUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlZhcmlhYmlsaXR5VHlwZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh2YXJpYWJpbGl0eVR5cGVPYmplY3RFRGF0YVR5cGUsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIlZhcmlhYmlsaXR5VHlwZTpPYmplY3QiLAotCQkJICJiYXNlVHlwZSIsICJWYXJpYWJpbGl0eVR5cGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdoaXRlcGFwZXJFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldoaXRlcGFwZXIiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrQnJlYWtkb3duRWxlbWVudEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya0JyZWFrZG93bkVsZW1lbnQiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya0JyZWFrZG93bkVsZW1lbnRfUHJlZGVjZXNzb3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlZGVjZXNzb3IiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzAiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzRXZlbnREcml2ZW4oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc0V2ZW50RHJpdmVuIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrQnJlYWtkb3duRWxlbWVudF9Jc09uZ29pbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiYXR0cmlidXRlIiwKLQkJCSAibmFtZSIsICJpc09uZ29pbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtCcmVha2Rvd25FbGVtZW50X0lzUmVwZWF0YWJsZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImlzUmVwZWF0YWJsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya0RlZmluaXRpb25FQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtEZWZpbml0aW9uIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrRGVmaW5pdGlvbl9QcmVjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUHJlY29uZGl0aW9uIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtEZWZpbml0aW9uX1Bvc3Rjb25kaXRpb24oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUG9zdGNvbmRpdGlvbiIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya09yZGVyRUNsYXNzLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAibmFtZSIsICJXb3JrT3JkZXIiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrT3JkZXJfVmFsdWUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiOjAiLAotCQkJICJraW5kIiwgInNpbXBsZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya09yZGVyX0lkKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiaWQiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtPcmRlcl9MaW5rVHlwZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImxpbmtUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrT3JkZXJUeXBlRUVudW0sIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtPcmRlclR5cGUiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya09yZGVyVHlwZU9iamVjdEVEYXRhVHlwZSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya09yZGVyVHlwZTpPYmplY3QiLAotCQkJICJiYXNlVHlwZSIsICJXb3JrT3JkZXJUeXBlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdEVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiLAotCQkJICJraW5kIiwgImVsZW1lbnRPbmx5IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X0dyb3VwMigpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJncm91cCIsCi0JCQkgIm5hbWUiLCAiZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXN0aW1hdGUiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3RfRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdF9SZXBvcnQoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVwb3J0IiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X1RlbXBsYXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlRlbXBsYXRlIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjI0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0X1Rvb2xNZW50b3IoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiVG9vbE1lbnRvciIsCi0JCQkgImdyb3VwIiwgIiNncm91cDoyNCIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAod29ya1Byb2R1Y3REZXNjcmlwdGlvbkVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3REZXNjcmlwdGlvbiIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fSW1wYWN0T2ZOb3RIYXZpbmcoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW1wYWN0T2ZOb3RIYXZpbmciCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRpb25fUHVycG9zZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJQdXJwb3NlIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0aW9uX1JlYXNvbnNGb3JOb3ROZWVkaW5nKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIlJlYXNvbnNGb3JOb3ROZWVkaW5nIgotCQkgICB9KTsJCQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgICh3b3JrUHJvZHVjdERlc2NyaXB0b3JFQ2xhc3MsIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0RGVzY3JpcHRvciIsCi0JCQkgImtpbmQiLCAiZWxlbWVudE9ubHkiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX1dvcmtQcm9kdWN0KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIldvcmtQcm9kdWN0IgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9SZXNwb25zaWJsZVJvbGUoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiUmVzcG9uc2libGVSb2xlIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9Hcm91cDIoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZ3JvdXAiLAotCQkJICJuYW1lIiwgImdyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9FeHRlcm5hbElucHV0VG8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRXh0ZXJuYWxJbnB1dFRvIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9JbXBhY3RlZEJ5KCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIkltcGFjdGVkQnkiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0ltcGFjdHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiSW1wYWN0cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdERlc2NyaXB0b3JfTWFuZGF0b3J5SW5wdXRUbygpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJlbGVtZW50IiwKLQkJCSAibmFtZSIsICJNYW5kYXRvcnlJbnB1dFRvIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PcHRpb25hbElucHV0VG8oKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiT3B0aW9uYWxJbnB1dFRvIiwKLQkJCSAiZ3JvdXAiLCAiI2dyb3VwOjMzIgotCQkgICB9KTsJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKGdldFdvcmtQcm9kdWN0RGVzY3JpcHRvcl9PdXRwdXRGcm9tKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImVsZW1lbnQiLAotCQkJICJuYW1lIiwgIk91dHB1dEZyb20iLAotCQkJICJncm91cCIsICIjZ3JvdXA6MzMiCi0JCSAgIH0pOwkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0RlbGl2ZXJhYmxlUGFydHMoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiRGVsaXZlcmFibGVQYXJ0cyIsCi0JCQkgImdyb3VwIiwgIiNncm91cDozMyIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RW50cnlTdGF0ZSgpLCAKLQkJICAgc291cmNlLCAKLQkJICAgbmV3IFN0cmluZ1tdIHsKLQkJCSAia2luZCIsICJhdHRyaWJ1dGUiLAotCQkJICJuYW1lIiwgImFjdGl2aXR5RW50cnlTdGF0ZSIKLQkJICAgfSk7CQkJCi0JCWFkZEFubm90YXRpb24KLQkJICAoZ2V0V29ya1Byb2R1Y3REZXNjcmlwdG9yX0FjdGl2aXR5RXhpdFN0YXRlKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImF0dHJpYnV0ZSIsCi0JCQkgIm5hbWUiLCAiYWN0aXZpdHlFeGl0U3RhdGUiCi0JCSAgIH0pOwkJCQotCQlhZGRBbm5vdGF0aW9uCi0JCSAgKHdvcmtQcm9kdWN0VHlwZUVDbGFzcywgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3RUeXBlIiwKLQkJCSAia2luZCIsICJlbGVtZW50T25seSIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdFR5cGVfR3JvdXAyKCksIAotCQkgICBzb3VyY2UsIAotCQkgICBuZXcgU3RyaW5nW10gewotCQkJICJraW5kIiwgImdyb3VwIiwKLQkJCSAibmFtZSIsICJncm91cDoyNCIKLQkJICAgfSk7CQkKLQkJYWRkQW5ub3RhdGlvbgotCQkgIChnZXRXb3JrUHJvZHVjdFR5cGVfV29ya1Byb2R1Y3QoKSwgCi0JCSAgIHNvdXJjZSwgCi0JCSAgIG5ldyBTdHJpbmdbXSB7Ci0JCQkgImtpbmQiLCAiZWxlbWVudCIsCi0JCQkgIm5hbWUiLCAiV29ya1Byb2R1Y3QiLAotCQkJICJncm91cCIsICIjZ3JvdXA6MjQiCi0JCSAgIH0pOwotCX0KLQotfSAvL1VtYVBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV2hpdGVwYXBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlMDczOS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9XaGl0ZXBhcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXaGl0ZXBhcGVySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldoaXRlcGFwZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXaGl0ZXBhcGVySW1wbCBleHRlbmRzIENvbmNlcHRJbXBsIGltcGxlbWVudHMgV2hpdGVwYXBlciB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdoaXRlcGFwZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XSElURVBBUEVSOwotCX0KLQotfSAvL1doaXRlcGFwZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ2ZWFkMC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtCcmVha2Rvd25FbGVtZW50SW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrQnJlYWtkb3duRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNnZXRHcm91cDIgPGVtPkdyb3VwMjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjZ2V0UHJlZGVjZXNzb3IgPGVtPlByZWRlY2Vzc29yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtCcmVha2Rvd25FbGVtZW50SW1wbCNpc0lzRXZlbnREcml2ZW4gPGVtPklzIEV2ZW50IERyaXZlbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwjaXNJc09uZ29pbmcgPGVtPklzIE9uZ29pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsI2lzSXNSZXBlYXRhYmxlIDxlbT5JcyBSZXBlYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsIGV4dGVuZHMgQnJlYWtkb3duRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrQnJlYWtkb3duRWxlbWVudCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0R3JvdXAyKCkgPGVtPkdyb3VwMjwvZW0+fScgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHcm91cDIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBGZWF0dXJlTWFwIGdyb3VwMjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzRXZlbnREcml2ZW4oKSA8ZW0+SXMgRXZlbnQgRHJpdmVuPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzRXZlbnREcml2ZW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNFdmVudERyaXZlbigpIDxlbT5JcyBFdmVudCBEcml2ZW48L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNFdmVudERyaXZlbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFdmVudERyaXZlbiA9IElTX0VWRU5UX0RSSVZFTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgSXMgRXZlbnQgRHJpdmVuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0V2ZW50RHJpdmVuRVNldDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0lzT25nb2luZygpIDxlbT5JcyBPbmdvaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0lzT25nb2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIElTX09OR09JTkdfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNPbmdvaW5nKCkgPGVtPklzIE9uZ29pbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNPbmdvaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZ29pbmcgPSBJU19PTkdPSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhpcyBpcyB0cnVlIGlmIHRoZSBJcyBPbmdvaW5nIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZ29pbmdFU2V0OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSXNSZXBlYXRhYmxlKCkgPGVtPklzIFJlcGVhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzSXNSZXBlYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfUkVQRUFUQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJc1JlcGVhdGFibGUoKSA8ZW0+SXMgUmVwZWF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNJc1JlcGVhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRydWUgaWYgdGhlIElzIFJlcGVhdGFibGUgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVwZWF0YWJsZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya0JyZWFrZG93bkVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxXb3JrT3JkZXI+IGdldFByZWRlY2Vzc29yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX1BSRURFQ0VTU09SKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lzRXZlbnREcml2ZW4oKSB7Ci0JCXJldHVybiBpc0V2ZW50RHJpdmVuOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzRXZlbnREcml2ZW4oYm9vbGVhbiBuZXdJc0V2ZW50RHJpdmVuKSB7Ci0JCWJvb2xlYW4gb2xkSXNFdmVudERyaXZlbiA9IGlzRXZlbnREcml2ZW47Ci0JCWlzRXZlbnREcml2ZW4gPSBuZXdJc0V2ZW50RHJpdmVuOwotCQlib29sZWFuIG9sZElzRXZlbnREcml2ZW5FU2V0ID0gaXNFdmVudERyaXZlbkVTZXQ7Ci0JCWlzRXZlbnREcml2ZW5FU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19FVkVOVF9EUklWRU4sIG9sZElzRXZlbnREcml2ZW4sIGlzRXZlbnREcml2ZW4sICFvbGRJc0V2ZW50RHJpdmVuRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNFdmVudERyaXZlbigpIHsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuID0gaXNFdmVudERyaXZlbjsKLQkJYm9vbGVhbiBvbGRJc0V2ZW50RHJpdmVuRVNldCA9IGlzRXZlbnREcml2ZW5FU2V0OwotCQlpc0V2ZW50RHJpdmVuID0gSVNfRVZFTlRfRFJJVkVOX0VERUZBVUxUOwotCQlpc0V2ZW50RHJpdmVuRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOLCBvbGRJc0V2ZW50RHJpdmVuLCBJU19FVkVOVF9EUklWRU5fRURFRkFVTFQsIG9sZElzRXZlbnREcml2ZW5FU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc0V2ZW50RHJpdmVuKCkgewotCQlyZXR1cm4gaXNFdmVudERyaXZlbkVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SXNPbmdvaW5nKGJvb2xlYW4gbmV3SXNPbmdvaW5nKSB7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nID0gaXNPbmdvaW5nOwotCQlpc09uZ29pbmcgPSBuZXdJc09uZ29pbmc7Ci0JCWJvb2xlYW4gb2xkSXNPbmdvaW5nRVNldCA9IGlzT25nb2luZ0VTZXQ7Ci0JCWlzT25nb2luZ0VTZXQgPSB0cnVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkcsIG9sZElzT25nb2luZywgaXNPbmdvaW5nLCAhb2xkSXNPbmdvaW5nRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0SXNPbmdvaW5nKCkgewotCQlib29sZWFuIG9sZElzT25nb2luZyA9IGlzT25nb2luZzsKLQkJYm9vbGVhbiBvbGRJc09uZ29pbmdFU2V0ID0gaXNPbmdvaW5nRVNldDsKLQkJaXNPbmdvaW5nID0gSVNfT05HT0lOR19FREVGQVVMVDsKLQkJaXNPbmdvaW5nRVNldCA9IGZhbHNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uVU5TRVQsIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORywgb2xkSXNPbmdvaW5nLCBJU19PTkdPSU5HX0VERUZBVUxULCBvbGRJc09uZ29pbmdFU2V0KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTZXRJc09uZ29pbmcoKSB7Ci0JCXJldHVybiBpc09uZ29pbmdFU2V0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gaXNSZXBlYXRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElzUmVwZWF0YWJsZShib29sZWFuIG5ld0lzUmVwZWF0YWJsZSkgewotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZSA9IGlzUmVwZWF0YWJsZTsKLQkJaXNSZXBlYXRhYmxlID0gbmV3SXNSZXBlYXRhYmxlOwotCQlib29sZWFuIG9sZElzUmVwZWF0YWJsZUVTZXQgPSBpc1JlcGVhdGFibGVFU2V0OwotCQlpc1JlcGVhdGFibGVFU2V0ID0gdHJ1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFLCBvbGRJc1JlcGVhdGFibGUsIGlzUmVwZWF0YWJsZSwgIW9sZElzUmVwZWF0YWJsZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldElzUmVwZWF0YWJsZSgpIHsKLQkJYm9vbGVhbiBvbGRJc1JlcGVhdGFibGUgPSBpc1JlcGVhdGFibGU7Ci0JCWJvb2xlYW4gb2xkSXNSZXBlYXRhYmxlRVNldCA9IGlzUmVwZWF0YWJsZUVTZXQ7Ci0JCWlzUmVwZWF0YWJsZSA9IElTX1JFUEVBVEFCTEVfRURFRkFVTFQ7Ci0JCWlzUmVwZWF0YWJsZUVTZXQgPSBmYWxzZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlVOU0VULCBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX1JFUEVBVEFCTEUsIG9sZElzUmVwZWF0YWJsZSwgSVNfUkVQRUFUQUJMRV9FREVGQVVMVCwgb2xkSXNSZXBlYXRhYmxlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0SXNSZXBlYXRhYmxlKCkgewotCQlyZXR1cm4gaXNSZXBlYXRhYmxlRVNldDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0R3JvdXAyKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByZWRlY2Vzc29yKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I6Ci0JCQkJcmV0dXJuIGdldFByZWRlY2Vzc29yKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXJldHVybiBpc0lzRXZlbnREcml2ZW4oKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlyZXR1cm4gaXNJc09uZ29pbmcoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfUkVQRUFUQUJMRToKLQkJCQlyZXR1cm4gaXNJc1JlcGVhdGFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCSgoRmVhdHVyZU1hcC5JbnRlcm5hbClnZXRHcm91cDIoKSkuc2V0KG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fUFJFREVDRVNTT1I6Ci0JCQkJZ2V0UHJlZGVjZXNzb3IoKS5jbGVhcigpOwotCQkJCWdldFByZWRlY2Vzc29yKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBXb3JrT3JkZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfRVZFTlRfRFJJVkVOOgotCQkJCXNldElzRXZlbnREcml2ZW4oKChCb29sZWFuKW5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX09OR09JTkc6Ci0JCQkJc2V0SXNPbmdvaW5nKCgoQm9vbGVhbiluZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXNldElzUmVwZWF0YWJsZSgoKEJvb2xlYW4pbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlnZXRQcmVkZWNlc3NvcigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCQl1bnNldElzRXZlbnREcml2ZW4oKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQl1bnNldElzT25nb2luZygpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXVuc2V0SXNSZXBlYXRhYmxlKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19QUkVERUNFU1NPUjoKLQkJCQlyZXR1cm4gIWdldFByZWRlY2Vzc29yKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfQlJFQUtET1dOX0VMRU1FTlRfX0lTX0VWRU5UX0RSSVZFTjoKLQkJCQlyZXR1cm4gaXNTZXRJc0V2ZW50RHJpdmVuKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19CUkVBS0RPV05fRUxFTUVOVF9fSVNfT05HT0lORzoKLQkJCQlyZXR1cm4gaXNTZXRJc09uZ29pbmcoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UX19JU19SRVBFQVRBQkxFOgotCQkJCXJldHVybiBpc1NldElzUmVwZWF0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZ3JvdXAyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChncm91cDIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzRXZlbnREcml2ZW46ICIpOwotCQlpZiAoaXNFdmVudERyaXZlbkVTZXQpIHJlc3VsdC5hcHBlbmQoaXNFdmVudERyaXZlbik7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzT25nb2luZzogIik7Ci0JCWlmIChpc09uZ29pbmdFU2V0KSByZXN1bHQuYXBwZW5kKGlzT25nb2luZyk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGlzUmVwZWF0YWJsZTogIik7Ci0JCWlmIChpc1JlcGVhdGFibGVFU2V0KSByZXN1bHQuYXBwZW5kKGlzUmVwZWF0YWJsZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrQnJlYWtkb3duRWxlbWVudEltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrRGVmaW5pdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjhjMWQzLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtEZWZpbml0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya0RlZmluaXRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya0RlZmluaXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIERlZmluaXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya0RlZmluaXRpb25JbXBsI2dldFByZWNvbmRpdGlvbiA8ZW0+UHJlY29uZGl0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtEZWZpbml0aW9uSW1wbCNnZXRQb3N0Y29uZGl0aW9uIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya0RlZmluaXRpb25JbXBsIGV4dGVuZHMgTWV0aG9kRWxlbWVudEltcGwgaW1wbGVtZW50cyBXb3JrRGVmaW5pdGlvbiB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZWNvbmRpdGlvbigpIDxlbT5QcmVjb25kaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZWNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVjb25kaXRpb24gPSBQUkVDT05ESVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdGNvbmRpdGlvbigpIDxlbT5Qb3N0Y29uZGl0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0Y29uZGl0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUQ09ORElUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3Rjb25kaXRpb24oKSA8ZW0+UG9zdGNvbmRpdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdGNvbmRpdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwb3N0Y29uZGl0aW9uID0gUE9TVENPTkRJVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBXb3JrRGVmaW5pdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfREVGSU5JVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWNvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHByZWNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjb25kaXRpb24oU3RyaW5nIG5ld1ByZWNvbmRpdGlvbikgewotCQlTdHJpbmcgb2xkUHJlY29uZGl0aW9uID0gcHJlY29uZGl0aW9uOwotCQlwcmVjb25kaXRpb24gPSBuZXdQcmVjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT04sIG9sZFByZWNvbmRpdGlvbiwgcHJlY29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQb3N0Y29uZGl0aW9uKCkgewotCQlyZXR1cm4gcG9zdGNvbmRpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0Y29uZGl0aW9uKFN0cmluZyBuZXdQb3N0Y29uZGl0aW9uKSB7Ci0JCVN0cmluZyBvbGRQb3N0Y29uZGl0aW9uID0gcG9zdGNvbmRpdGlvbjsKLQkJcG9zdGNvbmRpdGlvbiA9IG5ld1Bvc3Rjb25kaXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OLCBvbGRQb3N0Y29uZGl0aW9uLCBwb3N0Y29uZGl0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXJldHVybiBnZXRQcmVjb25kaXRpb24oKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BPU1RDT05ESVRJT046Ci0JCQkJcmV0dXJuIGdldFBvc3Rjb25kaXRpb24oKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUFJFQ09ORElUSU9OOgotCQkJCXNldFByZWNvbmRpdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT05fX1BSRUNPTkRJVElPTjoKLQkJCQlzZXRQcmVjb25kaXRpb24oUFJFQ09ORElUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QT1NUQ09ORElUSU9OOgotCQkJCXNldFBvc3Rjb25kaXRpb24oUE9TVENPTkRJVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19ERUZJTklUSU9OX19QUkVDT05ESVRJT046Ci0JCQkJcmV0dXJuIFBSRUNPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcHJlY29uZGl0aW9uICE9IG51bGwgOiAhUFJFQ09ORElUSU9OX0VERUZBVUxULmVxdWFscyhwcmVjb25kaXRpb24pOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfREVGSU5JVElPTl9fUE9TVENPTkRJVElPTjoKLQkJCQlyZXR1cm4gUE9TVENPTkRJVElPTl9FREVGQVVMVCA9PSBudWxsID8gcG9zdGNvbmRpdGlvbiAhPSBudWxsIDogIVBPU1RDT05ESVRJT05fRURFRkFVTFQuZXF1YWxzKHBvc3Rjb25kaXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocHJlY29uZGl0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwcmVjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBvc3Rjb25kaXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBvc3Rjb25kaXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrRGVmaW5pdGlvbkltcGwKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9Xb3JrT3JkZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGU2NjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya09yZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogV29ya09yZGVySW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDcga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLmltcGwuRURhdGFPYmplY3RJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgT3JkZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRJZCA8ZW0+SWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya09yZGVySW1wbCNnZXRMaW5rVHlwZSA8ZW0+TGluayBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya09yZGVySW1wbCBleHRlbmRzIEVEYXRhT2JqZWN0SW1wbCBpbXBsZW1lbnRzIFdvcmtPcmRlciB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZCgpIDxlbT5JZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaWQgPSBJRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFdvcmtPcmRlclR5cGUgTElOS19UWVBFX0VERUZBVUxUID0gV29ya09yZGVyVHlwZS5GSU5JU0hfVE9fU1RBUlQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMaW5rVHlwZSgpIDxlbT5MaW5rIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExpbmtUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVyVHlwZSBsaW5rVHlwZSA9IExJTktfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgTGluayBUeXBlIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsaW5rVHlwZUVTZXQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya09yZGVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19PUkRFUjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCVN0cmluZyBvbGRJZCA9IGlkOwotCQlpZCA9IG5ld0lkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lELCBvbGRJZCwgaWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgV29ya09yZGVyVHlwZSBnZXRMaW5rVHlwZSgpIHsKLQkJcmV0dXJuIGxpbmtUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpbmtUeXBlKFdvcmtPcmRlclR5cGUgbmV3TGlua1R5cGUpIHsKLQkJV29ya09yZGVyVHlwZSBvbGRMaW5rVHlwZSA9IGxpbmtUeXBlOwotCQlsaW5rVHlwZSA9IG5ld0xpbmtUeXBlID09IG51bGwgPyBMSU5LX1RZUEVfRURFRkFVTFQgOiBuZXdMaW5rVHlwZTsKLQkJYm9vbGVhbiBvbGRMaW5rVHlwZUVTZXQgPSBsaW5rVHlwZUVTZXQ7Ci0JCWxpbmtUeXBlRVNldCA9IHRydWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFLCBvbGRMaW5rVHlwZSwgbGlua1R5cGUsICFvbGRMaW5rVHlwZUVTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldExpbmtUeXBlKCkgewotCQlXb3JrT3JkZXJUeXBlIG9sZExpbmtUeXBlID0gbGlua1R5cGU7Ci0JCWJvb2xlYW4gb2xkTGlua1R5cGVFU2V0ID0gbGlua1R5cGVFU2V0OwotCQlsaW5rVHlwZSA9IExJTktfVFlQRV9FREVGQVVMVDsKLQkJbGlua1R5cGVFU2V0ID0gZmFsc2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5VTlNFVCwgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEUsIG9sZExpbmtUeXBlLCBMSU5LX1RZUEVfRURFRkFVTFQsIG9sZExpbmtUeXBlRVNldCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2V0TGlua1R5cGUoKSB7Ci0JCXJldHVybiBsaW5rVHlwZUVTZXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQlyZXR1cm4gZ2V0TGlua1R5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19JRDoKLQkJCQlzZXRJZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fTElOS19UWVBFOgotCQkJCXNldExpbmtUeXBlKChXb3JrT3JkZXJUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19PUkRFUl9fSUQ6Ci0JCQkJc2V0SWQoSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX09SREVSX19MSU5LX1RZUEU6Ci0JCQkJdW5zZXRMaW5rVHlwZSgpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX1ZBTFVFOgotCQkJCXJldHVybiBWQUxVRV9FREVGQVVMVCA9PSBudWxsID8gdmFsdWUgIT0gbnVsbCA6ICFWQUxVRV9FREVGQVVMVC5lcXVhbHModmFsdWUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVJfX0xJTktfVFlQRToKLQkJCQlyZXR1cm4gaXNTZXRMaW5rVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAodmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxpbmtUeXBlOiAiKTsKLQkJaWYgKGxpbmtUeXBlRVNldCkgcmVzdWx0LmFwcGVuZChsaW5rVHlwZSk7IGVsc2UgcmVzdWx0LmFwcGVuZCgiPHVuc2V0PiIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy9Xb3JrT3JkZXJJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzRkMjMuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsLmphdmEsdiAxLjIgMjAwOC8wMS8zMCAwMDo0MTo0NyBrbG93IEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRJbXBhY3RPZk5vdEhhdmluZyA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwjZ2V0UHVycG9zZSA8ZW0+UHVycG9zZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCNnZXRSZWFzb25zRm9yTm90TmVlZGluZyA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uSW1wbCBleHRlbmRzIENvbnRlbnREZXNjcmlwdGlvbkltcGwgaW1wbGVtZW50cyBXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKSA8ZW0+SW1wYWN0IE9mIE5vdCBIYXZpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEltcGFjdE9mTm90SGF2aW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbXBhY3RPZk5vdEhhdmluZygpIDxlbT5JbXBhY3QgT2YgTm90IEhhdmluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW1wYWN0T2ZOb3RIYXZpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgaW1wYWN0T2ZOb3RIYXZpbmcgPSBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdXJwb3NlKCkgPGVtPlB1cnBvc2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFB1cnBvc2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBVUlBPU0VfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVycG9zZSgpIDxlbT5QdXJwb3NlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQdXJwb3NlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHB1cnBvc2UgPSBQVVJQT1NFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkgPGVtPlJlYXNvbnMgRm9yIE5vdCBOZWVkaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFzb25zRm9yTm90TmVlZGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSA8ZW0+UmVhc29ucyBGb3IgTm90IE5lZWRpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlYXNvbnNGb3JOb3ROZWVkaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlYXNvbnNGb3JOb3ROZWVkaW5nID0gUkVBU09OU19GT1JfTk9UX05FRURJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEltcGFjdE9mTm90SGF2aW5nKCkgewotCQlyZXR1cm4gaW1wYWN0T2ZOb3RIYXZpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1wYWN0T2ZOb3RIYXZpbmcoU3RyaW5nIG5ld0ltcGFjdE9mTm90SGF2aW5nKSB7Ci0JCVN0cmluZyBvbGRJbXBhY3RPZk5vdEhhdmluZyA9IGltcGFjdE9mTm90SGF2aW5nOwotCQlpbXBhY3RPZk5vdEhhdmluZyA9IG5ld0ltcGFjdE9mTm90SGF2aW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkcsIG9sZEltcGFjdE9mTm90SGF2aW5nLCBpbXBhY3RPZk5vdEhhdmluZykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVycG9zZSgpIHsKLQkJcmV0dXJuIHB1cnBvc2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVycG9zZShTdHJpbmcgbmV3UHVycG9zZSkgewotCQlTdHJpbmcgb2xkUHVycG9zZSA9IHB1cnBvc2U7Ci0JCXB1cnBvc2UgPSBuZXdQdXJwb3NlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRSwgb2xkUHVycG9zZSwgcHVycG9zZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKSB7Ci0JCXJldHVybiByZWFzb25zRm9yTm90TmVlZGluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFzb25zRm9yTm90TmVlZGluZyhTdHJpbmcgbmV3UmVhc29uc0Zvck5vdE5lZWRpbmcpIHsKLQkJU3RyaW5nIG9sZFJlYXNvbnNGb3JOb3ROZWVkaW5nID0gcmVhc29uc0Zvck5vdE5lZWRpbmc7Ci0JCXJlYXNvbnNGb3JOb3ROZWVkaW5nID0gbmV3UmVhc29uc0Zvck5vdE5lZWRpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORywgb2xkUmVhc29uc0Zvck5vdE5lZWRpbmcsIHJlYXNvbnNGb3JOb3ROZWVkaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJcmV0dXJuIGdldEltcGFjdE9mTm90SGF2aW5nKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19QVVJQT1NFOgotCQkJCXJldHVybiBnZXRQdXJwb3NlKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19SRUFTT05TX0ZPUl9OT1RfTkVFRElORzoKLQkJCQlyZXR1cm4gZ2V0UmVhc29uc0Zvck5vdE5lZWRpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fSU1QQUNUX09GX05PVF9IQVZJTkc6Ci0JCQkJc2V0SW1wYWN0T2ZOb3RIYXZpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUSU9OX19JTVBBQ1RfT0ZfTk9UX0hBVklORzoKLQkJCQlzZXRJbXBhY3RPZk5vdEhhdmluZyhJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlzZXRQdXJwb3NlKFBVUlBPU0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX1JFQVNPTlNfRk9SX05PVF9ORUVESU5HOgotCQkJCXNldFJlYXNvbnNGb3JOb3ROZWVkaW5nKFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRJT05fX0lNUEFDVF9PRl9OT1RfSEFWSU5HOgotCQkJCXJldHVybiBJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVCA9PSBudWxsID8gaW1wYWN0T2ZOb3RIYXZpbmcgIT0gbnVsbCA6ICFJTVBBQ1RfT0ZfTk9UX0hBVklOR19FREVGQVVMVC5lcXVhbHMoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUFVSUE9TRToKLQkJCQlyZXR1cm4gUFVSUE9TRV9FREVGQVVMVCA9PSBudWxsID8gcHVycG9zZSAhPSBudWxsIDogIVBVUlBPU0VfRURFRkFVTFQuZXF1YWxzKHB1cnBvc2UpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTl9fUkVBU09OU19GT1JfTk9UX05FRURJTkc6Ci0JCQkJcmV0dXJuIFJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxUID09IG51bGwgPyByZWFzb25zRm9yTm90TmVlZGluZyAhPSBudWxsIDogIVJFQVNPTlNfRk9SX05PVF9ORUVESU5HX0VERUZBVUxULmVxdWFscyhyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChpbXBhY3RPZk5vdEhhdmluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW1wYWN0T2ZOb3RIYXZpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1cnBvc2U6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHB1cnBvc2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYXNvbnNGb3JOb3ROZWVkaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFzb25zRm9yTm90TmVlZGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvL1dvcmtQcm9kdWN0RGVzY3JpcHRpb25JbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQxNGEwLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldFJlc3BvbnNpYmxlUm9sZSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0RXh0ZXJuYWxJbnB1dFRvIDxlbT5FeHRlcm5hbCBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEltcGFjdGVkQnkgPGVtPkltcGFjdGVkIEJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0SW1wYWN0cyA8ZW0+SW1wYWN0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldE1hbmRhdG9yeUlucHV0VG8gPGVtPk1hbmRhdG9yeSBJbnB1dCBUbzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldE9wdGlvbmFsSW5wdXRUbyA8ZW0+T3B0aW9uYWwgSW5wdXQgVG88L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCNnZXRPdXRwdXRGcm9tIDxlbT5PdXRwdXQgRnJvbTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldERlbGl2ZXJhYmxlUGFydHMgPGVtPkRlbGl2ZXJhYmxlIFBhcnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0RGVzY3JpcHRvckltcGwjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdERlc2NyaXB0b3JJbXBsI2dldEFjdGl2aXR5RXhpdFN0YXRlIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCBleHRlbmRzIERlc2NyaXB0b3JJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3REZXNjcmlwdG9yIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0V29ya1Byb2R1Y3QoKSA8ZW0+V29yayBQcm9kdWN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JrUHJvZHVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19QUk9EVUNUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFdvcmtQcm9kdWN0KCkgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0V29ya1Byb2R1Y3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgd29ya1Byb2R1Y3QgPSBXT1JLX1BST0RVQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzcG9uc2libGVSb2xlKCkgPGVtPlJlc3BvbnNpYmxlIFJvbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3BvbnNpYmxlUm9sZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0lCTEVfUk9MRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXNwb25zaWJsZVJvbGUoKSA8ZW0+UmVzcG9uc2libGUgUm9sZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzcG9uc2libGVSb2xlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3BvbnNpYmxlUm9sZSA9IFJFU1BPTlNJQkxFX1JPTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFbnRyeSBTdGF0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWN0aXZpdHlFbnRyeVN0YXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSA8ZW0+QWN0aXZpdHkgRW50cnkgU3RhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjdGl2aXR5RW50cnlTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3Rpdml0eUVudHJ5U3RhdGUgPSBBQ1RJVklUWV9FTlRSWV9TVEFURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpIDxlbT5BY3Rpdml0eSBFeGl0IFN0YXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY3Rpdml0eUV4aXRTdGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY3Rpdml0eUV4aXRTdGF0ZSA9IEFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIHdvcmtQcm9kdWN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdvcmtQcm9kdWN0KFN0cmluZyBuZXdXb3JrUHJvZHVjdCkgewotCQlTdHJpbmcgb2xkV29ya1Byb2R1Y3QgPSB3b3JrUHJvZHVjdDsKLQkJd29ya1Byb2R1Y3QgPSBuZXdXb3JrUHJvZHVjdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNULCBvbGRXb3JrUHJvZHVjdCwgd29ya1Byb2R1Y3QpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNpYmxlUm9sZSgpIHsKLQkJcmV0dXJuIHJlc3BvbnNpYmxlUm9sZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNwb25zaWJsZVJvbGUoU3RyaW5nIG5ld1Jlc3BvbnNpYmxlUm9sZSkgewotCQlTdHJpbmcgb2xkUmVzcG9uc2libGVSb2xlID0gcmVzcG9uc2libGVSb2xlOwotCQlyZXNwb25zaWJsZVJvbGUgPSBuZXdSZXNwb25zaWJsZVJvbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1JFU1BPTlNJQkxFX1JPTEUsIG9sZFJlc3BvbnNpYmxlUm9sZSwgcmVzcG9uc2libGVSb2xlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZlYXR1cmVNYXAgZ2V0R3JvdXAyKCkgewotCQlpZiAoZ3JvdXAyID09IG51bGwpIHsKLQkJCWdyb3VwMiA9IG5ldyBCYXNpY0ZlYXR1cmVNYXAodGhpcywgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyKTsKLQkJfQotCQlyZXR1cm4gZ3JvdXAyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEV4dGVybmFsSW5wdXRUbygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldEltcGFjdGVkQnkoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRJbXBhY3RzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRNYW5kYXRvcnlJbnB1dFRvKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19NQU5EQVRPUllfSU5QVVRfVE8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE9wdGlvbmFsSW5wdXRUbygpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE8pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTdHJpbmc+IGdldE91dHB1dEZyb20oKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXREZWxpdmVyYWJsZVBhcnRzKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKSB7Ci0JCXJldHVybiBhY3Rpdml0eUVudHJ5U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFbnRyeVN0YXRlKFN0cmluZyBuZXdBY3Rpdml0eUVudHJ5U3RhdGUpIHsKLQkJU3RyaW5nIG9sZEFjdGl2aXR5RW50cnlTdGF0ZSA9IGFjdGl2aXR5RW50cnlTdGF0ZTsKLQkJYWN0aXZpdHlFbnRyeVN0YXRlID0gbmV3QWN0aXZpdHlFbnRyeVN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURSwgb2xkQWN0aXZpdHlFbnRyeVN0YXRlLCBhY3Rpdml0eUVudHJ5U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGl2aXR5RXhpdFN0YXRlKCkgewotCQlyZXR1cm4gYWN0aXZpdHlFeGl0U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZpdHlFeGl0U3RhdGUoU3RyaW5nIG5ld0FjdGl2aXR5RXhpdFN0YXRlKSB7Ci0JCVN0cmluZyBvbGRBY3Rpdml0eUV4aXRTdGF0ZSA9IGFjdGl2aXR5RXhpdFN0YXRlOwotCQlhY3Rpdml0eUV4aXRTdGF0ZSA9IG5ld0FjdGl2aXR5RXhpdFN0YXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFLCBvbGRBY3Rpdml0eUV4aXRTdGF0ZSwgYWN0aXZpdHlFeGl0U3RhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXJldHVybiBnZXRSZXNwb25zaWJsZVJvbGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE86Ci0JCQkJcmV0dXJuIGdldEV4dGVybmFsSW5wdXRUbygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RFRF9CWToKLQkJCQlyZXR1cm4gZ2V0SW1wYWN0ZWRCeSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCXJldHVybiBnZXRJbXBhY3RzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gZ2V0TWFuZGF0b3J5SW5wdXRUbygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PUFRJT05BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gZ2V0T3B0aW9uYWxJbnB1dFRvKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQkJCXJldHVybiBnZXRPdXRwdXRGcm9tKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCXJldHVybiBnZXREZWxpdmVyYWJsZVBhcnRzKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXJldHVybiBnZXRBY3Rpdml0eUVudHJ5U3RhdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRVhJVF9TVEFURToKLQkJCQlyZXR1cm4gZ2V0QWN0aXZpdHlFeGl0U3RhdGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXNldFdvcmtQcm9kdWN0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fUkVTUE9OU0lCTEVfUk9MRToKLQkJCQlzZXRSZXNwb25zaWJsZVJvbGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE86Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlnZXRFeHRlcm5hbElucHV0VG8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmNsZWFyKCk7Ci0JCQkJZ2V0SW1wYWN0ZWRCeSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCWdldEltcGFjdHMoKS5jbGVhcigpOwotCQkJCWdldEltcGFjdHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCWdldE1hbmRhdG9yeUlucHV0VG8oKS5jbGVhcigpOwotCQkJCWdldE1hbmRhdG9yeUlucHV0VG8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0JCQkJZ2V0T3B0aW9uYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlnZXRPcHRpb25hbElucHV0VG8oKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1VUUFVUX0ZST006Ci0JCQkJZ2V0T3V0cHV0RnJvbSgpLmNsZWFyKCk7Ci0JCQkJZ2V0T3V0cHV0RnJvbSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19ERUxJVkVSQUJMRV9QQVJUUzoKLQkJCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuY2xlYXIoKTsKLQkJCQlnZXREZWxpdmVyYWJsZVBhcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VOVFJZX1NUQVRFOgotCQkJCXNldEFjdGl2aXR5RW50cnlTdGF0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fV09SS19QUk9EVUNUOgotCQkJCXNldFdvcmtQcm9kdWN0KFdPUktfUFJPRFVDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXNldFJlc3BvbnNpYmxlUm9sZShSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fRVhURVJOQUxfSU5QVVRfVE86Ci0JCQkJZ2V0RXh0ZXJuYWxJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0lNUEFDVEVEX0JZOgotCQkJCWdldEltcGFjdGVkQnkoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNUUzoKLQkJCQlnZXRJbXBhY3RzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX01BTkRBVE9SWV9JTlBVVF9UTzoKLQkJCQlnZXRNYW5kYXRvcnlJbnB1dFRvKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09QVElPTkFMX0lOUFVUX1RPOgotCQkJCWdldE9wdGlvbmFsSW5wdXRUbygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19PVVRQVVRfRlJPTToKLQkJCQlnZXRPdXRwdXRGcm9tKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0RFTElWRVJBQkxFX1BBUlRTOgotCQkJCWdldERlbGl2ZXJhYmxlUGFydHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fQUNUSVZJVFlfRU5UUllfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFbnRyeVN0YXRlKEFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX0FDVElWSVRZX0VYSVRfU1RBVEU6Ci0JCQkJc2V0QWN0aXZpdHlFeGl0U3RhdGUoQUNUSVZJVFlfRVhJVF9TVEFURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX1dPUktfUFJPRFVDVDoKLQkJCQlyZXR1cm4gV09SS19QUk9EVUNUX0VERUZBVUxUID09IG51bGwgPyB3b3JrUHJvZHVjdCAhPSBudWxsIDogIVdPUktfUFJPRFVDVF9FREVGQVVMVC5lcXVhbHMod29ya1Byb2R1Y3QpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19SRVNQT05TSUJMRV9ST0xFOgotCQkJCXJldHVybiBSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxUID09IG51bGwgPyByZXNwb25zaWJsZVJvbGUgIT0gbnVsbCA6ICFSRVNQT05TSUJMRV9ST0xFX0VERUZBVUxULmVxdWFscyhyZXNwb25zaWJsZVJvbGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19FWFRFUk5BTF9JTlBVVF9UTzoKLQkJCQlyZXR1cm4gIWdldEV4dGVybmFsSW5wdXRUbygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fSU1QQUNURURfQlk6Ci0JCQkJcmV0dXJuICFnZXRJbXBhY3RlZEJ5KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19JTVBBQ1RTOgotCQkJCXJldHVybiAhZ2V0SW1wYWN0cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fTUFOREFUT1JZX0lOUFVUX1RPOgotCQkJCXJldHVybiAhZ2V0TWFuZGF0b3J5SW5wdXRUbygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fT1BUSU9OQUxfSU5QVVRfVE86Ci0JCQkJcmV0dXJuICFnZXRPcHRpb25hbElucHV0VG8oKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1JfX09VVFBVVF9GUk9NOgotCQkJCXJldHVybiAhZ2V0T3V0cHV0RnJvbSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfREVTQ1JJUFRPUl9fREVMSVZFUkFCTEVfUEFSVFM6Ci0JCQkJcmV0dXJuICFnZXREZWxpdmVyYWJsZVBhcnRzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FTlRSWV9TVEFURToKLQkJCQlyZXR1cm4gQUNUSVZJVFlfRU5UUllfU1RBVEVfRURFRkFVTFQgPT0gbnVsbCA/IGFjdGl2aXR5RW50cnlTdGF0ZSAhPSBudWxsIDogIUFDVElWSVRZX0VOVFJZX1NUQVRFX0VERUZBVUxULmVxdWFscyhhY3Rpdml0eUVudHJ5U3RhdGUpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVE9SX19BQ1RJVklUWV9FWElUX1NUQVRFOgotCQkJCXJldHVybiBBQ1RJVklUWV9FWElUX1NUQVRFX0VERUZBVUxUID09IG51bGwgPyBhY3Rpdml0eUV4aXRTdGF0ZSAhPSBudWxsIDogIUFDVElWSVRZX0VYSVRfU1RBVEVfRURFRkFVTFQuZXF1YWxzKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHdvcmtQcm9kdWN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh3b3JrUHJvZHVjdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzcG9uc2libGVSb2xlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXNwb25zaWJsZVJvbGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhY3Rpdml0eUVudHJ5U3RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RW50cnlTdGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWN0aXZpdHlFeGl0U3RhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjdGl2aXR5RXhpdFN0YXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3REZXNjcmlwdG9ySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0SW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYjg2MWIuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBXb3JrUHJvZHVjdEltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPldvcmsgUHJvZHVjdDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0R3JvdXAyIDxlbT5Hcm91cDI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLmltcGwuV29ya1Byb2R1Y3RJbXBsI2dldEVzdGltYXRlIDxlbT5Fc3RpbWF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIDxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRSZXBvcnQgPGVtPlJlcG9ydDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdEltcGwjZ2V0VGVtcGxhdGUgPGVtPlRlbXBsYXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0SW1wbCNnZXRUb29sTWVudG9yIDxlbT5Ub29sIE1lbnRvcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0SW1wbCBleHRlbmRzIENvbnRlbnRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFdvcmtQcm9kdWN0IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19HUk9VUDIpOwotCQl9Ci0JCXJldHVybiBncm91cDI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGUoKSB7Ci0JCXJldHVybiBnZXRHcm91cDIoKS5saXN0KFVtYVBhY2thZ2UuTGl0ZXJhbHMuV09SS19QUk9EVUNUX19FU1RJTUFURSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fRVNUSU1BVElPTl9DT05TSURFUkFUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFN0cmluZz4gZ2V0UmVwb3J0KCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fUkVQT1JUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRUb29sTWVudG9yKCkgewotCQlyZXR1cm4gZ2V0R3JvdXAyKCkubGlzdChVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1IpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlpZiAoY29yZVR5cGUpIHJldHVybiBnZXRHcm91cDIoKTsKLQkJCQlyZXR1cm4gKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5nZXRXcmFwcGVyKCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFURToKLQkJCQlyZXR1cm4gZ2V0RXN0aW1hdGUoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRJT05fQ09OU0lERVJBVElPTlM6Ci0JCQkJcmV0dXJuIGdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCXJldHVybiBnZXRSZXBvcnQoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFOgotCQkJCXJldHVybiBnZXRUZW1wbGF0ZSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJcmV0dXJuIGdldFRvb2xNZW50b3IoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQkoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLnNldChuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fRVNUSU1BVEU6Ci0JCQkJZ2V0RXN0aW1hdGUoKS5jbGVhcigpOwotCQkJCWdldEVzdGltYXRlKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19SRVBPUlQ6Ci0JCQkJZ2V0UmVwb3J0KCkuY2xlYXIoKTsKLQkJCQlnZXRSZXBvcnQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RFTVBMQVRFOgotCQkJCWdldFRlbXBsYXRlKCkuY2xlYXIoKTsKLQkJCQlnZXRUZW1wbGF0ZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVE9PTF9NRU5UT1I6Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmNsZWFyKCk7Ci0JCQkJZ2V0VG9vbE1lbnRvcigpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0dST1VQMjoKLQkJCQlnZXRHcm91cDIoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCWdldEVzdGltYXRlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCWdldEVzdGltYXRpb25Db25zaWRlcmF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCWdldFJlcG9ydCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJZ2V0VGVtcGxhdGUoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOgotCQkJCWdldFRvb2xNZW50b3IoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fR1JPVVAyOgotCQkJCXJldHVybiBncm91cDIgIT0gbnVsbCAmJiAhZ3JvdXAyLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX0VTVElNQVRFOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGUoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX19FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOgotCQkJCXJldHVybiAhZ2V0RXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fUkVQT1JUOgotCQkJCXJldHVybiAhZ2V0UmVwb3J0KCkuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9fVEVNUExBVEU6Ci0JCQkJcmV0dXJuICFnZXRUZW1wbGF0ZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfX1RPT0xfTUVOVE9SOgotCQkJCXJldHVybiAhZ2V0VG9vbE1lbnRvcigpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL2ltcGwvV29ya1Byb2R1Y3RUeXBlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDFhZTIyLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL1dvcmtQcm9kdWN0VHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFdvcmtQcm9kdWN0VHlwZUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ3IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Xb3JrIFByb2R1Y3QgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuaW1wbC5Xb3JrUHJvZHVjdFR5cGVJbXBsI2dldEdyb3VwMiA8ZW0+R3JvdXAyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5pbXBsLldvcmtQcm9kdWN0VHlwZUltcGwjZ2V0V29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFdvcmtQcm9kdWN0VHlwZUltcGwgZXh0ZW5kcyBDb250ZW50Q2F0ZWdvcnlJbXBsIGltcGxlbWVudHMgV29ya1Byb2R1Y3RUeXBlIHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHcm91cDIoKSA8ZW0+R3JvdXAyPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdyb3VwMigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZlYXR1cmVNYXAgZ3JvdXAyOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFdvcmtQcm9kdWN0VHlwZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBVbWFQYWNrYWdlLkxpdGVyYWxzLldPUktfUFJPRFVDVF9UWVBFOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZWF0dXJlTWFwIGdldEdyb3VwMigpIHsKLQkJaWYgKGdyb3VwMiA9PSBudWxsKSB7Ci0JCQlncm91cDIgPSBuZXcgQmFzaWNGZWF0dXJlTWFwKHRoaXMsIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMik7Ci0JCX0KLQkJcmV0dXJuIGdyb3VwMjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRXb3JrUHJvZHVjdCgpIHsKLQkJcmV0dXJuIGdldEdyb3VwMigpLmxpc3QoVW1hUGFja2FnZS5MaXRlcmFscy5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKSB7Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX1RZUEVfX0dST1VQMjoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEdyb3VwMigpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCWlmIChjb3JlVHlwZSkgcmV0dXJuIGdldEdyb3VwMigpOwotCQkJCXJldHVybiAoKEZlYXR1cmVNYXAuSW50ZXJuYWwpZ2V0R3JvdXAyKCkpLmdldFdyYXBwZXIoKTsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUOgotCQkJCXJldHVybiBnZXRXb3JrUHJvZHVjdCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJKChGZWF0dXJlTWFwLkludGVybmFsKWdldEdyb3VwMigpKS5zZXQobmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fV09SS19QUk9EVUNUOgotCQkJCWdldFdvcmtQcm9kdWN0KCkuY2xlYXIoKTsKLQkJCQlnZXRXb3JrUHJvZHVjdCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKLQkJc3dpdGNoIChmZWF0dXJlSUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRV9fR1JPVVAyOgotCQkJCWdldEdyb3VwMigpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJZ2V0V29ya1Byb2R1Y3QoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkgewotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19HUk9VUDI6Ci0JCQkJcmV0dXJuIGdyb3VwMiAhPSBudWxsICYmICFncm91cDIuaXNFbXB0eSgpOwotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9UWVBFX19XT1JLX1BST0RVQ1Q6Ci0JCQkJcmV0dXJuICFnZXRXb3JrUHJvZHVjdCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwMjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ3JvdXAyKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vV29ya1Byb2R1Y3RUeXBlSW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbCBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS9pbXBsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlMjhkZS4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvaW1wbC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxodG1sPgotPGJvZHk+Ci1Qcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBVTUEgbW9kZWwgb2JqZWN0cy4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvcGFja2FnZS5odG1sIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ2YTE5Mi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgdGhlIGludGVyZmFjZXMgZm9yIHRoZSBVTUEgWE1MIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOWNlNjguLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NTUgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFBZGFwdGVyRmFjdG9yeS5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5BZGFwdGVyIEZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhbiBhZGFwdGVyIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgVW1hUGFja2FnZSBtb2RlbFBhY2thZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYUFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaXMgZWl0aGVyIHRoZSBtb2RlbCdzIHBhY2thZ2Ugb3IgaXMgYW4gaW5zdGFuY2Ugb2JqZWN0IG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBmYWN0b3J5IGlzIGFwcGxpY2FibGUgZm9yIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG1vZGVsUGFja2FnZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEVPYmplY3QpIHsKLQkJCXJldHVybiAoKEVPYmplY3Qpb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFVtYVN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9Ci0JCW5ldyBVbWFTd2l0Y2g8QWRhcHRlcj4oKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQWN0aXZpdHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKEFjdGl2aXR5RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyhBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXBwbGljYWJsZU1ldGFDbGFzc0luZm9BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcnRpZmFjdChBcnRpZmFjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQXJ0aWZhY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUJyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGVja2xpc3QoQ2hlY2tsaXN0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDaGVja2xpc3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb21wb3NpdGVSb2xlKENvbXBvc2l0ZVJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbmNlcHRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb25zdHJhaW50KENvbnN0cmFpbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnN0cmFpbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50Q2F0ZWdvcnkoQ29udGVudENhdGVnb3J5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50Q2F0ZWdvcnlQYWNrYWdlKENvbnRlbnRDYXRlZ29yeVBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVDb250ZW50RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDb250ZW50UGFja2FnZShDb250ZW50UGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDdXN0b21DYXRlZ29yeShDdXN0b21DYXRlZ29yeSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlQ3VzdG9tQ2F0ZWdvcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZShEZWxpdmVyYWJsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlbGl2ZXJhYmxlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyeVByb2Nlc3MoRGVsaXZlcnlQcm9jZXNzIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmliYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yKERlc2NyaXB0b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEZXNjcmlwdG9yRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lKERpc2NpcGxpbmUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZURpc2NpcGxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb2N1bWVudFJvb3QoRG9jdW1lbnRSb290IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb2N1bWVudFJvb3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VEb21haW4oRG9tYWluIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVEb21haW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFbGVtZW50KEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFc3RpbWF0ZShFc3RpbWF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlRXN0aW1hdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFc3RpbWF0aW5nTWV0cmljKEVzdGltYXRpbmdNZXRyaWMgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnNBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4YW1wbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlR3VpZGFuY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkYW5jZURlc2NyaXB0aW9uKEd1aWRhbmNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VHdWlkZWxpbmUoR3VpZGVsaW5lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VJdGVyYXRpb24oSXRlcmF0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUtpbmRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkoTWV0aG9kRWxlbWVudFByb3BlcnR5IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50UHJvcGVydHlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RMaWJyYXJ5KE1ldGhvZExpYnJhcnkgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RQYWNrYWdlKE1ldGhvZFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFBhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RQbHVnaW4oTWV0aG9kUGx1Z2luIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU1ldGhvZFVuaXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VNaWxlc3RvbmUoTWlsZXN0b25lIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVNaWxlc3RvbmVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VOYW1lZEVsZW1lbnQoTmFtZWRFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU91dGNvbWVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoUGFja2FnZWFibGVFbGVtZW50IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQYWNrYWdlYWJsZUVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQaGFzZShQaGFzZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUGhhc2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQbGFubmluZ0RhdGEoUGxhbm5pbmdEYXRhIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQbGFubmluZ0RhdGFBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJhY3RpY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKFByYWN0aWNlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKFByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2Ugb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oUHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVQcm9jZXNzRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc0VsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGFja2FnZShQcm9jZXNzUGFja2FnZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BhY2thZ2VBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZShQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZXBvcnQoUmVwb3J0IG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSZXBvcnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJldXNhYmxlQXNzZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2FkbWFwKFJvYWRtYXAgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvYWRtYXBBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlKFJvbGUgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlUm9sZURlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlU2V0KFJvbGVTZXQgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VSb2xlU2V0R3JvdXBpbmcoUm9sZVNldEdyb3VwaW5nIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVSb2xlU2V0R3JvdXBpbmdBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTZWN0aW9uKFNlY3Rpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VTdXBwb3J0aW5nTWF0ZXJpYWwoU3VwcG9ydGluZ01hdGVyaWFsIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrKFRhc2sgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRhc2tBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrRGVzY3JpcHRpb24oVGFza0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUYXNrRGVzY3JpcHRvcihUYXNrRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZW1wbGF0ZShUZW1wbGF0ZSBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVtcGxhdGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlVGVybURlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRvb2xBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVRvb2xNZW50b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXaGl0ZXBhcGVyKFdoaXRlcGFwZXIgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChXb3JrQnJlYWtkb3duRWxlbWVudCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0JyZWFrZG93bkVsZW1lbnRBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya0RlZmluaXRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrT3JkZXJBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJCQlyZXR1cm4gY3JlYXRlV29ya1Byb2R1Y3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0aW9uKFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZVdvcmtQcm9kdWN0RGVzY3JpcHRpb25BZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdERlc2NyaXB0b3IoV29ya1Byb2R1Y3REZXNjcmlwdG9yIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdERlc2NyaXB0b3JBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGNhc2VXb3JrUHJvZHVjdFR5cGUoV29ya1Byb2R1Y3RUeXBlIG9iamVjdCkgewotCQkJCXJldHVybiBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgotCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgewotCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQWN0aXZpdHkgPGVtPkFjdGl2aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uIDxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BY3Rpdml0eURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFjdGl2aXR5RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIDxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcHBsaWNhYmxlTWV0YUNsYXNzSW5mbwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVBcHBsaWNhYmxlTWV0YUNsYXNzSW5mb0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3QgPGVtPkFydGlmYWN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFydGlmYWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uIDxlbT5BcnRpZmFjdCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5BcnRpZmFjdERlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQgPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIDxlbT5CcmVha2Rvd24gRWxlbWVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybiA8ZW0+Q2FwYWJpbGl0eSBQYXR0ZXJuPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNhcGFiaWxpdHlQYXR0ZXJuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QgPGVtPkNoZWNrbGlzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hlY2tsaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlIDxlbT5Db21wb3NpdGUgUm9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db21wb3NpdGVSb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbXBvc2l0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbmNlcHQgPGVtPkNvbmNlcHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29uY2VwdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb25jZXB0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25zdHJhaW50IDxlbT5Db25zdHJhaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29uc3RyYWludEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5IDxlbT5Db250ZW50IENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVDb250ZW50Q2F0ZWdvcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50Q2F0ZWdvcnlQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnREZXNjcmlwdGlvbiA8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQ29udGVudERlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50RWxlbWVudCA8ZW0+Q29udGVudCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db250ZW50UGFja2FnZSA8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNvbnRlbnRQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DdXN0b21DYXRlZ29yeSA8ZW0+Q3VzdG9tIENhdGVnb3J5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUN1c3RvbUNhdGVnb3J5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZWxpdmVyYWJsZSA8ZW0+RGVsaXZlcmFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24gPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVsaXZlcmFibGVEZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzIDxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEZWxpdmVyeVByb2Nlc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIDxlbT5EZWxpdmVyeSBQcm9jZXNzIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmliYWJsZUVsZW1lbnQgPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpYmFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaWJhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVzY3JpcHRvciA8ZW0+RGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGVzY3JpcHRvckRlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lIDxlbT5EaXNjaXBsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRGlzY2lwbGluZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGlzY2lwbGluZUdyb3VwaW5nIDxlbT5EaXNjaXBsaW5lIEdyb3VwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRvY3VtZW50Um9vdCA8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9jdW1lbnRSb290QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4gPGVtPkRvbWFpbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb21haW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRG9tYWluQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FbGVtZW50IDxlbT5FbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGUgPGVtPkVzdGltYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljIDxlbT5Fc3RpbWF0aW5nIE1ldHJpYzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW5nTWV0cmljCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVzdGltYXRpbmdNZXRyaWNBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA8ZW0+RXN0aW1hdGlvbiBDb25zaWRlcmF0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5FeGFtcGxlIDxlbT5FeGFtcGxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkV4YW1wbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRXhhbXBsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuR3VpZGFuY2UgPGVtPkd1aWRhbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRhbmNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uIDxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUd1aWRhbmNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZSA8ZW0+R3VpZGVsaW5lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVHdWlkZWxpbmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbiA8ZW0+SXRlcmF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkl0ZXJhdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVJdGVyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLktpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVLaW5kQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uIDxlbT5NZXRob2QgQ29uZmlndXJhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZENvbmZpZ3VyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQgPGVtPk1ldGhvZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5IDxlbT5NZXRob2QgRWxlbWVudCBQcm9wZXJ0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RFbGVtZW50UHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kRWxlbWVudFByb3BlcnR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5IDxlbT5NZXRob2QgTGlicmFyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RMaWJyYXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1ldGhvZExpYnJhcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UgPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBhY2thZ2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kUGFja2FnZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGx1Z2luIDxlbT5NZXRob2QgUGx1Z2luPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFBsdWdpbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVNZXRob2RQbHVnaW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQgPGVtPk1ldGhvZCBVbml0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZFVuaXQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlTWV0aG9kVW5pdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lIDxlbT5NaWxlc3RvbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWlsZXN0b25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZU1pbGVzdG9uZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50IDxlbT5OYW1lZCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk5hbWVkRWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVOYW1lZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWUgPGVtPk91dGNvbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuT3V0Y29tZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVPdXRjb21lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QYWNrYWdlYWJsZUVsZW1lbnQgPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBhY2thZ2VhYmxlRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGhhc2UgPGVtPlBoYXNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBoYXNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QbGFubmluZ0RhdGEgPGVtPlBsYW5uaW5nIERhdGE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGxhbm5pbmdEYXRhCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVBsYW5uaW5nRGF0YUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJhY3RpY2UgPGVtPlByYWN0aWNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByYWN0aWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uIDxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByYWN0aWNlRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50IDxlbT5Qcm9jZXNzIENvbXBvbmVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2VBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NEZXNjcmlwdGlvbiA8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUHJvY2Vzc0Rlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRWxlbWVudCA8ZW0+UHJvY2VzcyBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NFbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGFja2FnZSA8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NQYWNrYWdlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVByb2Nlc3NQYWNrYWdlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSA8ZW0+UHJvY2VzcyBQbGFubmluZyBUZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVQcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJlcG9ydEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldCA8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmV1c2FibGVBc3NldAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVSZXVzYWJsZUFzc2V0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2FkbWFwIDxlbT5Sb2FkbWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvYWRtYXAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9hZG1hcEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZSA8ZW0+Um9sZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbiA8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZURlc2NyaXB0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvciA8ZW0+Um9sZSBEZXNjcmlwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0IDxlbT5Sb2xlIFNldDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZyA8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9sZVNldEdyb3VwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVTZXRHcm91cGluZ0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuU2VjdGlvbiA8ZW0+U2VjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVNlY3Rpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbCA8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TdXBwb3J0aW5nTWF0ZXJpYWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrIDxlbT5UYXNrPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2sKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0aW9uIDxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUYXNrRGVzY3JpcHRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdG9yIDxlbT5UYXNrIERlc2NyaXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGFza0Rlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGFza0Rlc2NyaXB0b3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlYW1Qcm9maWxlIDxlbT5UZWFtIFByb2ZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVhbVByb2ZpbGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVGVhbVByb2ZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRlbXBsYXRlIDxlbT5UZW1wbGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZW1wbGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVGVybURlZmluaXRpb24gPGVtPlRlcm0gRGVmaW5pdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVUZXJtRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVG9vbCA8ZW0+VG9vbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVRvb2xBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IgPGVtPlRvb2wgTWVudG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlVG9vbE1lbnRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV2hpdGVwYXBlciA8ZW0+V2hpdGVwYXBlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdoaXRlcGFwZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50IDxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtCcmVha2Rvd25FbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrRGVmaW5pdGlvbiA8ZW0+V29yayBEZWZpbml0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtEZWZpbml0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrT3JkZXIgPGVtPldvcmsgT3JkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOwotCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya09yZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVdvcmtPcmRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3QgPGVtPldvcmsgUHJvZHVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdGlvbiA8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuV29ya1Byb2R1Y3REZXNjcmlwdG9yIDxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7Ci0JICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlV29ya1Byb2R1Y3REZXNjcmlwdG9yQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGUgPGVtPldvcmsgUHJvZHVjdCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKLQkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0VHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVXb3JrUHJvZHVjdFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIHRoZSBkZWZhdWx0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFT2JqZWN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk3ZmVjZC4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFSZXNvdXJjZUZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVJlc291cmNlRmFjdG9yeUltcGwuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLlhNTFJlc291cmNlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UmVzb3VyY2UgRmFjdG9yeTwvYj4gYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWwuVW1hUmVzb3VyY2VJbXBsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsIGV4dGVuZHMgUmVzb3VyY2VGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVW1hUmVzb3VyY2VGYWN0b3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgewotCQlYTUxSZXNvdXJjZSByZXN1bHQgPSBuZXcgVW1hUmVzb3VyY2VJbXBsKHVyaSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX0VYVEVOREVEX01FVEFfREFUQSwgQm9vbGVhbi5UUlVFKTsKLQkJcmVzdWx0LmdldERlZmF1bHRMb2FkT3B0aW9ucygpLnB1dChYTUxSZXNvdXJjZS5PUFRJT05fRVhURU5ERURfTUVUQV9EQVRBLCBCb29sZWFuLlRSVUUpOwotCi0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1NDSEVNQV9MT0NBVElPTiwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfRU5DT0RFRF9BVFRSSUJVVEVfU1RZTEUsIEJvb2xlYW4uVFJVRSk7Ci0JCXJlc3VsdC5nZXREZWZhdWx0U2F2ZU9wdGlvbnMoKS5wdXQoWE1MUmVzb3VyY2UuT1BUSU9OX1VTRV9FTkNPREVEX0FUVFJJQlVURV9TVFlMRSwgQm9vbGVhbi5UUlVFKTsKLQotCQlyZXN1bHQuZ2V0RGVmYXVsdExvYWRPcHRpb25zKCkucHV0KFhNTFJlc291cmNlLk9QVElPTl9VU0VfTEVYSUNBTF9IQU5ETEVSLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfSAvL1VtYVJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVJlc291cmNlSW1wbC5qYXZhIGIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDJkNjQuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFVtYVJlc291cmNlSW1wbC5qYXZhLHYgMS4yIDIwMDgvMDEvMzAgMDA6NDE6NDgga2xvdyBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuWE1MU2F2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MSGVscGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1MUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5SZXNvdXJjZSA8L2I+IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsLlVtYVJlc291cmNlRmFjdG9yeUltcGwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVtYVJlc291cmNlSW1wbCBleHRlbmRzIFhNTFJlc291cmNlSW1wbCB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdXJpIHRoZSBVUkkgb2YgdGhlIG5ldyByZXNvdXJjZS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFVtYVJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JfQotCi0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gY3VzdG9taXphdGlvbiBoZXJlLCBKaW5odWEgWGkgMDQvMjgvMjAwNgotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQotCS8qCi0JICogSmF2YWRvYyBjb3BpZWQgZnJvbSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShNYXAgb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2F2ZShvcHRpb25zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MU2F2ZSBjcmVhdGVYTUxTYXZlKCkgewotCQkvLyByZXR1cm4gc3VwZXIuY3JlYXRlWE1MU2F2ZSgpOwotCQlyZXR1cm4gbmV3IFVtYVhNTFNhdmVJbXBsKGNyZWF0ZVhNTEhlbHBlcigpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBYTUxIZWxwZXIgY3JlYXRlWE1MSGVscGVyKCkgewotCQlYTUxIZWxwZXJJbXBsIGhlbHBlciA9IG5ldyBYTUxIZWxwZXJJbXBsKHRoaXMpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZFByZWZpeChTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0JCQkJaWYgKHByZWZpeC5lcXVhbHMoInVtYSIpKSB7CQkvLyROT04tTkxTLTEkCi0JCQkJCXVyaSA9IFVtYVBhY2thZ2UuZU5TX1VSSTsKLQkJCQl9Ci0JCQkJc3VwZXIuYWRkUHJlZml4KHByZWZpeCwgdXJpKTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGhlbHBlcjsKLQl9Ci0JCi19IC8vIFVtYVJlc291cmNlSW1wbApkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hU3dpdGNoLmphdmEgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0YzVmNi4uMDAwMDAwMAotLS0gYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NjEgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFTd2l0Y2guamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkFjdGl2aXR5RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXBwbGljYWJsZU1ldGFDbGFzc0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQXJ0aWZhY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29tcG9zaXRlUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Db25jZXB0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRDYXRlZ29yeVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJhYmxlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaWJhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRlc2NyaXB0b3JEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5EaXNjaXBsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkRpc2NpcGxpbmVHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Eb2N1bWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXN0aW1hdGluZ01ldHJpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Fc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuRXhhbXBsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5HdWlkYW5jZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLkd1aWRlbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5JdGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kRWxlbWVudFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTWV0aG9kVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5NaWxlc3RvbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLk91dGNvbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUGFja2FnZWFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBoYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlBsYW5uaW5nRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5QcmFjdGljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Qcm9jZXNzRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJldXNhYmxlQXNzZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUm9hZG1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlJvbGVTZXRHcm91cGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlN1cHBvcnRpbmdNYXRlcmlhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRhc2tEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UYXNrRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZWFtUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5UZXJtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Ub29sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlRvb2xNZW50b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5XaGl0ZXBhcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtCcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLldvcmtQcm9kdWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5Td2l0Y2g8L2I+IGZvciB0aGUgbW9kZWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gKiBJdCBzdXBwb3J0cyB0aGUgY2FsbCB7QGxpbmsgI2RvU3dpdGNoKEVPYmplY3QpIGRvU3dpdGNoKG9iamVjdCl9Ci0gKiB0byBpbnZva2UgdGhlIDxjb2RlPmNhc2VYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwsCi0gKiBzdGFydGluZyB3aXRoIHRoZSBhY3R1YWwgY2xhc3Mgb2YgdGhlIG9iamVjdAotICogYW5kIHByb2NlZWRpbmcgdXAgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotICogdW50aWwgYSBub24tbnVsbCByZXN1bHQgaXMgcmV0dXJuZWQsCi0gKiB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzd2l0Y2guCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuVW1hUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgVW1hU3dpdGNoPFQ+IHsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIG1vZGVsIHBhY2thZ2UKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFVtYVBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFTd2l0Y2goKSB7Ci0JCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgewotCQkJbW9kZWxQYWNrYWdlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGRvU3dpdGNoKEVPYmplY3QgdGhlRU9iamVjdCkgewotCQlyZXR1cm4gZG9Td2l0Y2godGhlRU9iamVjdC5lQ2xhc3MoKSwgdGhlRU9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChFQ2xhc3MgdGhlRUNsYXNzLCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJaWYgKHRoZUVDbGFzcy5lQ29udGFpbmVyKCkgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gZG9Td2l0Y2godGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpLCB0aGVFT2JqZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3Q8RUNsYXNzPiBlU3VwZXJUeXBlcyA9IHRoZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpOwotCQkJcmV0dXJuCi0JCQkJZVN1cGVyVHlwZXMuaXNFbXB0eSgpID8KLQkJCQkJZGVmYXVsdENhc2UodGhlRU9iamVjdCkgOgotCQkJCQlkb1N3aXRjaChlU3VwZXJUeXBlcy5nZXQoMCksIHRoZUVPYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKLQkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKLQkJCWNhc2UgVW1hUGFja2FnZS5BQ1RJVklUWTogewotCQkJCUFjdGl2aXR5IGFjdGl2aXR5ID0gKEFjdGl2aXR5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQWN0aXZpdHkoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYWN0aXZpdHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkFDVElWSVRZX0RFU0NSSVBUSU9OOiB7Ci0JCQkJQWN0aXZpdHlEZXNjcmlwdGlvbiBhY3Rpdml0eURlc2NyaXB0aW9uID0gKEFjdGl2aXR5RGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBY3Rpdml0eURlc2NyaXB0aW9uKGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbihhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFjdGl2aXR5RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYWN0aXZpdHlEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhY3Rpdml0eURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVBQTElDQUJMRV9NRVRBX0NMQVNTX0lORk86IHsKLQkJCQlBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyBhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyA9IChBcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKGFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYXBwbGljYWJsZU1ldGFDbGFzc0luZm8pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhcHBsaWNhYmxlTWV0YUNsYXNzSW5mbyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkFSVElGQUNUOiB7Ci0JCQkJQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VBcnRpZmFjdChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3QoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYXJ0aWZhY3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGFydGlmYWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQVJUSUZBQ1RfREVTQ1JJUFRJT046IHsKLQkJCQlBcnRpZmFjdERlc2NyaXB0aW9uIGFydGlmYWN0RGVzY3JpcHRpb24gPSAoQXJ0aWZhY3REZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUFydGlmYWN0RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGFydGlmYWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYXJ0aWZhY3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChhcnRpZmFjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQlJFQUtET1dOX0VMRU1FTlQ6IHsKLQkJCQlCcmVha2Rvd25FbGVtZW50IGJyZWFrZG93bkVsZW1lbnQgPSAoQnJlYWtkb3duRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChicmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5CUkVBS0RPV05fRUxFTUVOVF9ERVNDUklQVElPTjogewotCQkJCUJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbiBicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24gPSAoQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChicmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoYnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGJyZWFrZG93bkVsZW1lbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNBUEFCSUxJVFlfUEFUVEVSTjogewotCQkJCUNhcGFiaWxpdHlQYXR0ZXJuIGNhcGFiaWxpdHlQYXR0ZXJuID0gKENhcGFiaWxpdHlQYXR0ZXJuKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ2FwYWJpbGl0eVBhdHRlcm4oY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjYXBhYmlsaXR5UGF0dGVybik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNhcGFiaWxpdHlQYXR0ZXJuKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY2FwYWJpbGl0eVBhdHRlcm4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DSEVDS0xJU1Q6IHsKLQkJCQlDaGVja2xpc3QgY2hlY2tsaXN0ID0gKENoZWNrbGlzdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNoZWNrbGlzdChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY2hlY2tsaXN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNoZWNrbGlzdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjaGVja2xpc3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT01QT1NJVEVfUk9MRTogewotCQkJCUNvbXBvc2l0ZVJvbGUgY29tcG9zaXRlUm9sZSA9IChDb21wb3NpdGVSb2xlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29tcG9zaXRlUm9sZShjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSb2xlRGVzY3JpcHRvcihjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmlwdG9yKGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29tcG9zaXRlUm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb21wb3NpdGVSb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbXBvc2l0ZVJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05DRVBUOiB7Ci0JCQkJQ29uY2VwdCBjb25jZXB0ID0gKENvbmNlcHQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VDb25jZXB0KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbmNlcHQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uY2VwdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb25jZXB0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OU1RSQUlOVDogewotCQkJCUNvbnN0cmFpbnQgY29uc3RyYWludCA9IChDb25zdHJhaW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29uc3RyYWludChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnN0cmFpbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29uc3RyYWludCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb25zdHJhaW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9DQVRFR09SWTogewotCQkJCUNvbnRlbnRDYXRlZ29yeSBjb250ZW50Q2F0ZWdvcnkgPSAoQ29udGVudENhdGVnb3J5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoY29udGVudENhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGNvbnRlbnRDYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX0NBVEVHT1JZX1BBQ0tBR0U6IHsKLQkJCQlDb250ZW50Q2F0ZWdvcnlQYWNrYWdlIGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UgPSAoQ29udGVudENhdGVnb3J5UGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kUGFja2FnZShjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRDYXRlZ29yeVBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudENhdGVnb3J5UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50Q2F0ZWdvcnlQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuQ09OVEVOVF9ERVNDUklQVElPTjogewotCQkJCUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSAoQ29udGVudERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNPTlRFTlRfRUxFTUVOVDogewotCQkJCUNvbnRlbnRFbGVtZW50IGNvbnRlbnRFbGVtZW50ID0gKENvbnRlbnRFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjb250ZW50RWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGNvbnRlbnRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY29udGVudEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5DT05URU5UX1BBQ0tBR0U6IHsKLQkJCQlDb250ZW50UGFja2FnZSBjb250ZW50UGFja2FnZSA9IChDb250ZW50UGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUNvbnRlbnRQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGNvbnRlbnRQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoY29udGVudFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChjb250ZW50UGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkNVU1RPTV9DQVRFR09SWTogewotCQkJCUN1c3RvbUNhdGVnb3J5IGN1c3RvbUNhdGVnb3J5ID0gKEN1c3RvbUNhdGVnb3J5KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlQ3VzdG9tQ2F0ZWdvcnkoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChjdXN0b21DYXRlZ29yeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGN1c3RvbUNhdGVnb3J5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoY3VzdG9tQ2F0ZWdvcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ERUxJVkVSQUJMRTogewotCQkJCURlbGl2ZXJhYmxlIGRlbGl2ZXJhYmxlID0gKERlbGl2ZXJhYmxlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcmFibGUoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlbGl2ZXJhYmxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZWxpdmVyYWJsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJBQkxFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJRGVsaXZlcmFibGVEZXNjcmlwdGlvbiBkZWxpdmVyYWJsZURlc2NyaXB0aW9uID0gKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRpb24oZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyYWJsZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJhYmxlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcmFibGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRFTElWRVJZX1BST0NFU1M6IHsKLQkJCQlEZWxpdmVyeVByb2Nlc3MgZGVsaXZlcnlQcm9jZXNzID0gKERlbGl2ZXJ5UHJvY2Vzcyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURlbGl2ZXJ5UHJvY2VzcyhkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZWxpdmVyeVByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVMSVZFUllfUFJPQ0VTU19ERVNDUklQVElPTjogewotCQkJCURlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uID0gKERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQWN0aXZpdHlEZXNjcmlwdGlvbihkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJQkFCTEVfRUxFTUVOVDogewotCQkJCURlc2NyaWJhYmxlRWxlbWVudCBkZXNjcmliYWJsZUVsZW1lbnQgPSAoRGVzY3JpYmFibGVFbGVtZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGRlc2NyaWJhYmxlRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChkZXNjcmliYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZGVzY3JpYmFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUjogewotCQkJCURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChEZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuREVTQ1JJUFRPUl9ERVNDUklQVElPTjogewotCQkJCURlc2NyaXB0b3JEZXNjcmlwdGlvbiBkZXNjcmlwdG9yRGVzY3JpcHRpb24gPSAoRGVzY3JpcHRvckRlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGVzY3JpcHRvckRlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChkZXNjcmlwdG9yRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGVzY3JpcHRvckRlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRlc2NyaXB0b3JEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkRJU0NJUExJTkU6IHsKLQkJCQlEaXNjaXBsaW5lIGRpc2NpcGxpbmUgPSAoRGlzY2lwbGluZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZURpc2NpcGxpbmUoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZGlzY2lwbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRElTQ0lQTElORV9HUk9VUElORzogewotCQkJCURpc2NpcGxpbmVHcm91cGluZyBkaXNjaXBsaW5lR3JvdXBpbmcgPSAoRGlzY2lwbGluZUdyb3VwaW5nKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRGlzY2lwbGluZUdyb3VwaW5nKGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZGlzY2lwbGluZUdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGRpc2NpcGxpbmVHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChkaXNjaXBsaW5lR3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ET0NVTUVOVF9ST09UOiB7Ci0JCQkJRG9jdW1lbnRSb290IGRvY3VtZW50Um9vdCA9IChEb2N1bWVudFJvb3QpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEb2N1bWVudFJvb3QoZG9jdW1lbnRSb290KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRE9NQUlOOiB7Ci0JCQkJRG9tYWluIGRvbWFpbiA9IChEb21haW4pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VEb21haW4oZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50Q2F0ZWdvcnkoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChkb21haW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZG9tYWluKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGRvbWFpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVMRU1FTlQ6IHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkVTVElNQVRFOiB7Ci0JCQkJRXN0aW1hdGUgZXN0aW1hdGUgPSAoRXN0aW1hdGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VFc3RpbWF0ZShlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXN0aW1hdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVNUSU1BVElOR19NRVRSSUM6IHsKLQkJCQlFc3RpbWF0aW5nTWV0cmljIGVzdGltYXRpbmdNZXRyaWMgPSAoRXN0aW1hdGluZ01ldHJpYyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZUVzdGltYXRpbmdNZXRyaWMoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoZXN0aW1hdGluZ01ldHJpYyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW5nTWV0cmljKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KGVzdGltYXRpbmdNZXRyaWMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5FU1RJTUFUSU9OX0NPTlNJREVSQVRJT05TOiB7Ci0JCQkJRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zIGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyA9IChFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VFc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGVzdGltYXRpb25Db25zaWRlcmF0aW9ucyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChlc3RpbWF0aW9uQ29uc2lkZXJhdGlvbnMpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuRVhBTVBMRTogewotCQkJCUV4YW1wbGUgZXhhbXBsZSA9IChFeGFtcGxlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlRXhhbXBsZShleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChleGFtcGxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGV4YW1wbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZXhhbXBsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLkdVSURBTkNFOiB7Ci0JCQkJR3VpZGFuY2UgZ3VpZGFuY2UgPSAoR3VpZGFuY2UpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkYW5jZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KGd1aWRhbmNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGFuY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5HVUlEQU5DRV9ERVNDUklQVElPTjogewotCQkJCUd1aWRhbmNlRGVzY3JpcHRpb24gZ3VpZGFuY2VEZXNjcmlwdGlvbiA9IChHdWlkYW5jZURlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlR3VpZGFuY2VEZXNjcmlwdGlvbihndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24oZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KGd1aWRhbmNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoZ3VpZGFuY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChndWlkYW5jZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuR1VJREVMSU5FOiB7Ci0JCQkJR3VpZGVsaW5lIGd1aWRlbGluZSA9IChHdWlkZWxpbmUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VHdWlkZWxpbmUoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGd1aWRlbGluZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChndWlkZWxpbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoZ3VpZGVsaW5lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuSVRFUkFUSU9OOiB7Ci0JCQkJSXRlcmF0aW9uIGl0ZXJhdGlvbiA9IChJdGVyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VJdGVyYXRpb24oaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KGl0ZXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChpdGVyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoaXRlcmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuS0lORDogewotCQkJCUtpbmQga2luZCA9IChLaW5kKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlS2luZChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChraW5kKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KGtpbmQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQoa2luZCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9DT05GSUdVUkFUSU9OOiB7Ci0JCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBtZXRob2RDb25maWd1cmF0aW9uID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RDb25maWd1cmF0aW9uKG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RDb25maWd1cmF0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZENvbmZpZ3VyYXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kQ29uZmlndXJhdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9FTEVNRU5UOiB7Ci0JCQkJTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0VMRU1FTlRfUFJPUEVSVFk6IHsKLQkJCQlNZXRob2RFbGVtZW50UHJvcGVydHkgbWV0aG9kRWxlbWVudFByb3BlcnR5ID0gKE1ldGhvZEVsZW1lbnRQcm9wZXJ0eSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnRQcm9wZXJ0eShtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChtZXRob2RFbGVtZW50UHJvcGVydHkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kRWxlbWVudFByb3BlcnR5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX0xJQlJBUlk6IHsKLQkJCQlNZXRob2RMaWJyYXJ5IG1ldGhvZExpYnJhcnkgPSAoTWV0aG9kTGlicmFyeSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZExpYnJhcnkobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZExpYnJhcnkpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kTGlicmFyeSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RMaWJyYXJ5KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUVUSE9EX1BBQ0tBR0U6IHsKLQkJCQlNZXRob2RQYWNrYWdlIG1ldGhvZFBhY2thZ2UgPSAoTWV0aG9kUGFja2FnZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChtZXRob2RQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobWV0aG9kUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk1FVEhPRF9QTFVHSU46IHsKLQkJCQlNZXRob2RQbHVnaW4gbWV0aG9kUGx1Z2luID0gKE1ldGhvZFBsdWdpbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU1ldGhvZFBsdWdpbihtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFVuaXQobWV0aG9kUGx1Z2luKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG1ldGhvZFBsdWdpbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RQbHVnaW4pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5NRVRIT0RfVU5JVDogewotCQkJCU1ldGhvZFVuaXQgbWV0aG9kVW5pdCA9IChNZXRob2RVbml0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KG1ldGhvZFVuaXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWV0aG9kVW5pdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChtZXRob2RVbml0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuTUlMRVNUT05FOiB7Ci0JCQkJTWlsZXN0b25lIG1pbGVzdG9uZSA9IChNaWxlc3RvbmUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VNaWxlc3RvbmUobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChtaWxlc3RvbmUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQobWlsZXN0b25lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KG1pbGVzdG9uZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLk5BTUVEX0VMRU1FTlQ6IHsKLQkJCQlOYW1lZEVsZW1lbnQgbmFtZWRFbGVtZW50ID0gKE5hbWVkRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChuYW1lZEVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQobmFtZWRFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuT1VUQ09NRTogewotCQkJCU91dGNvbWUgb3V0Y29tZSA9IChPdXRjb21lKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlT3V0Y29tZShvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrUHJvZHVjdChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChvdXRjb21lKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KG91dGNvbWUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQob3V0Y29tZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBBQ0tBR0VBQkxFX0VMRU1FTlQ6IHsKLQkJCQlQYWNrYWdlYWJsZUVsZW1lbnQgcGFja2FnZWFibGVFbGVtZW50ID0gKFBhY2thZ2VhYmxlRWxlbWVudCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwYWNrYWdlYWJsZUVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocGFja2FnZWFibGVFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUEhBU0U6IHsKLQkJCQlQaGFzZSBwaGFzZSA9IChQaGFzZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVBoYXNlKHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBY3Rpdml0eShwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocGhhc2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwaGFzZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHBoYXNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUExBTk5JTkdfREFUQTogewotCQkJCVBsYW5uaW5nRGF0YSBwbGFubmluZ0RhdGEgPSAoUGxhbm5pbmdEYXRhKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUGxhbm5pbmdEYXRhKHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocGxhbm5pbmdEYXRhKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHBsYW5uaW5nRGF0YSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwbGFubmluZ0RhdGEpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUkFDVElDRTogewotCQkJCVByYWN0aWNlIHByYWN0aWNlID0gKFByYWN0aWNlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJhY3RpY2UocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByYWN0aWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJhY3RpY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcmFjdGljZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBSQUNUSUNFX0RFU0NSSVBUSU9OOiB7Ci0JCQkJUHJhY3RpY2VEZXNjcmlwdGlvbiBwcmFjdGljZURlc2NyaXB0aW9uID0gKFByYWN0aWNlRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcmFjdGljZURlc2NyaXB0aW9uKHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnREZXNjcmlwdGlvbihwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJhY3RpY2VEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcmFjdGljZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByYWN0aWNlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTOiB7Ci0JCQkJb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEuUHJvY2VzcyBwcm9jZXNzID0gKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3MpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzKHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzcyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3MpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVDogewotCQkJCVByb2Nlc3NDb21wb25lbnQgcHJvY2Vzc0NvbXBvbmVudCA9IChQcm9jZXNzQ29tcG9uZW50KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc0NvbXBvbmVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzUGFja2FnZShwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RQYWNrYWdlKHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzQ29tcG9uZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NDb21wb25lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5QUk9DRVNTX0NPTVBPTkVOVF9JTlRFUkZBQ0U6IHsKLQkJCQlQcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlIHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UgPSAoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzQ29tcG9uZW50SW50ZXJmYWNlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfREVTQ1JJUFRJT046IHsKLQkJCQlQcm9jZXNzRGVzY3JpcHRpb24gcHJvY2Vzc0Rlc2NyaXB0aW9uID0gKFByb2Nlc3NEZXNjcmlwdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVByb2Nlc3NEZXNjcmlwdGlvbihwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24ocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHByb2Nlc3NEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19FTEVNRU5UOiB7Ci0JCQkJUHJvY2Vzc0VsZW1lbnQgcHJvY2Vzc0VsZW1lbnQgPSAoUHJvY2Vzc0VsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VQcm9jZXNzRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHByb2Nlc3NFbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocHJvY2Vzc0VsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChwcm9jZXNzRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlBST0NFU1NfUEFDS0FHRTogewotCQkJCVByb2Nlc3NQYWNrYWdlIHByb2Nlc3NQYWNrYWdlID0gKFByb2Nlc3NQYWNrYWdlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZFBhY2thZ2UocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocHJvY2Vzc1BhY2thZ2UpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChwcm9jZXNzUGFja2FnZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHByb2Nlc3NQYWNrYWdlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUFJPQ0VTU19QTEFOTklOR19URU1QTEFURTogewotCQkJCVByb2Nlc3NQbGFubmluZ1RlbXBsYXRlIHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlID0gKFByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3MocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUFjdGl2aXR5KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChwcm9jZXNzUGxhbm5pbmdUZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHByb2Nlc3NQbGFubmluZ1RlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5SRVBPUlQ6IHsKLQkJCQlSZXBvcnQgcmVwb3J0ID0gKFJlcG9ydCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJlcG9ydChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmVwb3J0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJlcG9ydCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyZXBvcnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5SRVVTQUJMRV9BU1NFVDogewotCQkJCVJldXNhYmxlQXNzZXQgcmV1c2FibGVBc3NldCA9IChSZXVzYWJsZUFzc2V0KXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUmV1c2FibGVBc3NldChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VHdWlkYW5jZShyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyZXVzYWJsZUFzc2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJldXNhYmxlQXNzZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocmV1c2FibGVBc3NldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJPQURNQVA6IHsKLQkJCQlSb2FkbWFwIHJvYWRtYXAgPSAoUm9hZG1hcCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvYWRtYXAocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9hZG1hcCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2FkbWFwKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvYWRtYXApOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5ST0xFOiB7Ci0JCQkJUm9sZSByb2xlID0gKFJvbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlKHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9ERVNDUklQVElPTjogewotCQkJCVJvbGVEZXNjcmlwdGlvbiByb2xlRGVzY3JpcHRpb24gPSAoUm9sZURlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudERlc2NyaXB0aW9uKHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdChyb2xlRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZURlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlJPTEVfREVTQ1JJUFRPUjogewotCQkJCVJvbGVEZXNjcmlwdG9yIHJvbGVEZXNjcmlwdG9yID0gKFJvbGVEZXNjcmlwdG9yKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlUm9sZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQocm9sZURlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHJvbGVEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVQ6IHsKLQkJCQlSb2xlU2V0IHJvbGVTZXQgPSAoUm9sZVNldCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHJvbGVTZXQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQocm9sZVNldCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChyb2xlU2V0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuUk9MRV9TRVRfR1JPVVBJTkc6IHsKLQkJCQlSb2xlU2V0R3JvdXBpbmcgcm9sZVNldEdyb3VwaW5nID0gKFJvbGVTZXRHcm91cGluZyl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVTZXRHcm91cGluZyhyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRDYXRlZ29yeShyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHJvbGVTZXRHcm91cGluZyk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudChyb2xlU2V0R3JvdXBpbmcpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQocm9sZVNldEdyb3VwaW5nKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuU0VDVElPTjogewotCQkJCVNlY3Rpb24gc2VjdGlvbiA9IChTZWN0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlU2VjdGlvbihzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHNlY3Rpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc2VjdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudChzZWN0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuU1VQUE9SVElOR19NQVRFUklBTDogewotCQkJCVN1cHBvcnRpbmdNYXRlcmlhbCBzdXBwb3J0aW5nTWF0ZXJpYWwgPSAoU3VwcG9ydGluZ01hdGVyaWFsKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlU3VwcG9ydGluZ01hdGVyaWFsKHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudChzdXBwb3J0aW5nTWF0ZXJpYWwpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQoc3VwcG9ydGluZ01hdGVyaWFsKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHN1cHBvcnRpbmdNYXRlcmlhbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRBU0s6IHsKLQkJCQlUYXNrIHRhc2sgPSAoVGFzayl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRhc2sodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFzayk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2spOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5UQVNLX0RFU0NSSVBUSU9OOiB7Ci0JCQkJVGFza0Rlc2NyaXB0aW9uIHRhc2tEZXNjcmlwdGlvbiA9IChUYXNrRGVzY3JpcHRpb24pdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24odGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RVbml0KHRhc2tEZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0YXNrRGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGFza0Rlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEFTS19ERVNDUklQVE9SOiB7Ci0JCQkJVGFza0Rlc2NyaXB0b3IgdGFza0Rlc2NyaXB0b3IgPSAoVGFza0Rlc2NyaXB0b3IpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUYXNrRGVzY3JpcHRvcih0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlV29ya0JyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUJyZWFrZG93bkVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVByb2Nlc3NFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodGFza0Rlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0YXNrRGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRhc2tEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVEVBTV9QUk9GSUxFOiB7Ci0JCQkJVGVhbVByb2ZpbGUgdGVhbVByb2ZpbGUgPSAoVGVhbVByb2ZpbGUpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VUZWFtUHJvZmlsZSh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh0ZWFtUHJvZmlsZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRlYW1Qcm9maWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQodGVhbVByb2ZpbGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5URU1QTEFURTogewotCQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gKFRlbXBsYXRlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVGVtcGxhdGUodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlbXBsYXRlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVtcGxhdGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZW1wbGF0ZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRFUk1fREVGSU5JVElPTjogewotCQkJCVRlcm1EZWZpbml0aW9uIHRlcm1EZWZpbml0aW9uID0gKFRlcm1EZWZpbml0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlVGVybURlZmluaXRpb24odGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUd1aWRhbmNlKHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRlcm1EZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQodGVybURlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0ZXJtRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLlRPT0w6IHsKLQkJCQlUb29sIHRvb2wgPSAoVG9vbCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRvb2wodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbnRlbnRFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHRvb2wpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQodG9vbCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh0b29sKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuVE9PTF9NRU5UT1I6IHsKLQkJCQlUb29sTWVudG9yIHRvb2xNZW50b3IgPSAoVG9vbE1lbnRvcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVRvb2xNZW50b3IodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2UodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQodG9vbE1lbnRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh0b29sTWVudG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHRvb2xNZW50b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XSElURVBBUEVSOiB7Ci0JCQkJV2hpdGVwYXBlciB3aGl0ZXBhcGVyID0gKFdoaXRlcGFwZXIpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXaGl0ZXBhcGVyKHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNvbmNlcHQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlR3VpZGFuY2Uod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU1ldGhvZEVsZW1lbnQod2hpdGVwYXBlcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3aGl0ZXBhcGVyKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VFbGVtZW50KHdoaXRlcGFwZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0JSRUFLRE9XTl9FTEVNRU5UOiB7Ci0JCQkJV29ya0JyZWFrZG93bkVsZW1lbnQgd29ya0JyZWFrZG93bkVsZW1lbnQgPSAoV29ya0JyZWFrZG93bkVsZW1lbnQpdGhlRU9iamVjdDsKLQkJCQlUIHJlc3VsdCA9IGNhc2VXb3JrQnJlYWtkb3duRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQnJlYWtkb3duRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaWJhYmxlRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kRWxlbWVudCh3b3JrQnJlYWtkb3duRWxlbWVudCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtCcmVha2Rvd25FbGVtZW50KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUVsZW1lbnQod29ya0JyZWFrZG93bkVsZW1lbnQpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX0RFRklOSVRJT046IHsKLQkJCQlXb3JrRGVmaW5pdGlvbiB3b3JrRGVmaW5pdGlvbiA9IChXb3JrRGVmaW5pdGlvbil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtEZWZpbml0aW9uKHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtEZWZpbml0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya0RlZmluaXRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrRGVmaW5pdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfT1JERVI6IHsKLQkJCQlXb3JrT3JkZXIgd29ya09yZGVyID0gKFdvcmtPcmRlcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtPcmRlcih3b3JrT3JkZXIpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1Q6IHsKLQkJCQlXb3JrUHJvZHVjdCB3b3JrUHJvZHVjdCA9IChXb3JrUHJvZHVjdCl0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRGVzY3JpYmFibGVFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0KTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VQYWNrYWdlYWJsZUVsZW1lbnQod29ya1Byb2R1Y3QpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZU5hbWVkRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJY2FzZSBVbWFQYWNrYWdlLldPUktfUFJPRFVDVF9ERVNDUklQVElPTjogewotCQkJCVdvcmtQcm9kdWN0RGVzY3JpcHRpb24gd29ya1Byb2R1Y3REZXNjcmlwdGlvbiA9IChXb3JrUHJvZHVjdERlc2NyaXB0aW9uKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbih3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDb250ZW50RGVzY3JpcHRpb24od29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTWV0aG9kVW5pdCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRpb24pOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVBhY2thZ2VhYmxlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VOYW1lZEVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdGlvbik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0aW9uKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQljYXNlIFVtYVBhY2thZ2UuV09SS19QUk9EVUNUX0RFU0NSSVBUT1I6IHsKLQkJCQlXb3JrUHJvZHVjdERlc2NyaXB0b3Igd29ya1Byb2R1Y3REZXNjcmlwdG9yID0gKFdvcmtQcm9kdWN0RGVzY3JpcHRvcil0aGVFT2JqZWN0OwotCQkJCVQgcmVzdWx0ID0gY2FzZVdvcmtQcm9kdWN0RGVzY3JpcHRvcih3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZURlc2NyaXB0b3Iod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VCcmVha2Rvd25FbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUHJvY2Vzc0VsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3REZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0RGVzY3JpcHRvcik7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdERlc2NyaXB0b3IpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWNhc2UgVW1hUGFja2FnZS5XT1JLX1BST0RVQ1RfVFlQRTogewotCQkJCVdvcmtQcm9kdWN0VHlwZSB3b3JrUHJvZHVjdFR5cGUgPSAoV29ya1Byb2R1Y3RUeXBlKXRoZUVPYmplY3Q7Ci0JCQkJVCByZXN1bHQgPSBjYXNlV29ya1Byb2R1Y3RUeXBlKHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudENhdGVnb3J5KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ29udGVudEVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VEZXNjcmliYWJsZUVsZW1lbnQod29ya1Byb2R1Y3RUeXBlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VNZXRob2RFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUGFja2FnZWFibGVFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTmFtZWRFbGVtZW50KHdvcmtQcm9kdWN0VHlwZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlRWxlbWVudCh3b3JrUHJvZHVjdFR5cGUpOwotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFjdGl2aXR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBY3Rpdml0eShBY3Rpdml0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QWN0aXZpdHkgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BY3Rpdml0eSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFjdGl2aXR5RGVzY3JpcHRpb24oQWN0aXZpdHlEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXBwbGljYWJsZSBNZXRhIENsYXNzIEluZm88L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcHBsaWNhYmxlIE1ldGEgQ2xhc3MgSW5mbzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvKEFwcGxpY2FibGVNZXRhQ2xhc3NJbmZvIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BcnRpZmFjdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQXJ0aWZhY3QoQXJ0aWZhY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkFydGlmYWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXJ0aWZhY3QgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VBcnRpZmFjdERlc2NyaXB0aW9uKEFydGlmYWN0RGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50KEJyZWFrZG93bkVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkJyZWFrZG93biBFbGVtZW50IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QnJlYWtkb3duIEVsZW1lbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VCcmVha2Rvd25FbGVtZW50RGVzY3JpcHRpb24oQnJlYWtkb3duRWxlbWVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DYXBhYmlsaXR5IFBhdHRlcm48L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDYXBhYmlsaXR5UGF0dGVybihDYXBhYmlsaXR5UGF0dGVybiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hlY2tsaXN0PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ2hlY2tsaXN0KENoZWNrbGlzdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29tcG9zaXRlIFJvbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db21wb3NpdGUgUm9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbXBvc2l0ZVJvbGUoQ29tcG9zaXRlUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29uY2VwdDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbmNlcHQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb25jZXB0KENvbmNlcHQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnN0cmFpbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29uc3RyYWludChDb25zdHJhaW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IENhdGVnb3J5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRDYXRlZ29yeShDb250ZW50Q2F0ZWdvcnkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgQ2F0ZWdvcnkgUGFja2FnZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUNvbnRlbnRDYXRlZ29yeVBhY2thZ2UoQ29udGVudENhdGVnb3J5UGFja2FnZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNvbnRlbnQgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50RGVzY3JpcHRpb24oQ29udGVudERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Db250ZW50IEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VDb250ZW50RWxlbWVudChDb250ZW50RWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q29udGVudCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlQ29udGVudFBhY2thZ2UoQ29udGVudFBhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkN1c3RvbSBDYXRlZ29yeTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUN1c3RvbUNhdGVnb3J5KEN1c3RvbUNhdGVnb3J5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyYWJsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcmFibGUoRGVsaXZlcmFibGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJhYmxlIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcmFibGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyYWJsZURlc2NyaXB0aW9uKERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3M8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZWxpdmVyeSBQcm9jZXNzPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRGVsaXZlcnlQcm9jZXNzKERlbGl2ZXJ5UHJvY2VzcyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVsaXZlcnkgUHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlbGl2ZXJ5IFByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbihEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpYmFibGUgRWxlbWVudDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaWJhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmliYWJsZUVsZW1lbnQoRGVzY3JpYmFibGVFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EZXNjcmlwdG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURlc2NyaXB0b3IoRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGVzY3JpcHRvciBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRlc2NyaXB0b3IgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEZXNjcmlwdG9yRGVzY3JpcHRpb24oRGVzY3JpcHRvckRlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5EaXNjaXBsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURpc2NpcGxpbmUoRGlzY2lwbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RGlzY2lwbGluZSBHcm91cGluZzwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRpc2NpcGxpbmUgR3JvdXBpbmc8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VEaXNjaXBsaW5lR3JvdXBpbmcoRGlzY2lwbGluZUdyb3VwaW5nIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Eb2N1bWVudCBSb290PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RG9jdW1lbnQgUm9vdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURvY3VtZW50Um9vdChEb2N1bWVudFJvb3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkRvbWFpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZURvbWFpbihEb21haW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRWxlbWVudChFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0ZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXN0aW1hdGUoRXN0aW1hdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpbmcgTWV0cmljPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXN0aW1hdGluZyBNZXRyaWM8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFc3RpbWF0aW5nTWV0cmljKEVzdGltYXRpbmdNZXRyaWMgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVzdGltYXRpb24gQ29uc2lkZXJhdGlvbnM8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Fc3RpbWF0aW9uIENvbnNpZGVyYXRpb25zPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlRXN0aW1hdGlvbkNvbnNpZGVyYXRpb25zKEVzdGltYXRpb25Db25zaWRlcmF0aW9ucyBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RXhhbXBsZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkV4YW1wbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VFeGFtcGxlKEV4YW1wbGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkd1aWRhbmNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VHdWlkYW5jZShHdWlkYW5jZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGFuY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5HdWlkYW5jZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZUd1aWRhbmNlRGVzY3JpcHRpb24oR3VpZGFuY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+R3VpZGVsaW5lPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlR3VpZGVsaW5lKEd1aWRlbGluZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+SXRlcmF0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlSXRlcmF0aW9uKEl0ZXJhdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPktpbmQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VLaW5kKEtpbmQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBDb25maWd1cmF0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIENvbmZpZ3VyYXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RDb25maWd1cmF0aW9uKE1ldGhvZENvbmZpZ3VyYXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBFbGVtZW50IFByb3BlcnR5PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIEVsZW1lbnQgUHJvcGVydHk8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RFbGVtZW50UHJvcGVydHkoTWV0aG9kRWxlbWVudFByb3BlcnR5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgTGlicmFyeTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBMaWJyYXJ5PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kTGlicmFyeShNZXRob2RMaWJyYXJ5IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGFja2FnZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTWV0aG9kUGFja2FnZShNZXRob2RQYWNrYWdlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5NZXRob2QgUGx1Z2luPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFBsdWdpbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1ldGhvZFBsdWdpbihNZXRob2RQbHVnaW4gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1ldGhvZCBVbml0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TWV0aG9kIFVuaXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VNZXRob2RVbml0KE1ldGhvZFVuaXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk1pbGVzdG9uZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZU1pbGVzdG9uZShNaWxlc3RvbmUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk5hbWVkIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5OYW1lZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlTmFtZWRFbGVtZW50KE5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+T3V0Y29tZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPk91dGNvbWU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VPdXRjb21lKE91dGNvbWUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlBhY2thZ2VhYmxlIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QYWNrYWdlYWJsZSBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUGFja2FnZWFibGVFbGVtZW50KFBhY2thZ2VhYmxlRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGhhc2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QaGFzZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBoYXNlKFBoYXNlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QbGFubmluZyBEYXRhPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UGxhbm5pbmcgRGF0YTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVBsYW5uaW5nRGF0YShQbGFubmluZ0RhdGEgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByYWN0aWNlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2U8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcmFjdGljZShQcmFjdGljZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJhY3RpY2UgRGVzY3JpcHRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5QcmFjdGljZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByYWN0aWNlRGVzY3JpcHRpb24oUHJhY3RpY2VEZXNjcmlwdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzczwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3M8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzKG9yZy5lY2xpcHNlLmVwZi54bWwudW1hLlByb2Nlc3Mgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBDb21wb25lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzQ29tcG9uZW50KFByb2Nlc3NDb21wb25lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgQ29tcG9uZW50IEludGVyZmFjZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVByb2Nlc3NDb21wb25lbnRJbnRlcmZhY2UoUHJvY2Vzc0NvbXBvbmVudEludGVyZmFjZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzRGVzY3JpcHRpb24oUHJvY2Vzc0Rlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIEVsZW1lbnQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VQcm9jZXNzRWxlbWVudChQcm9jZXNzRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UHJvY2VzcyBQYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BhY2thZ2UoUHJvY2Vzc1BhY2thZ2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlByb2Nlc3MgUGxhbm5pbmcgVGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Qcm9jZXNzIFBsYW5uaW5nIFRlbXBsYXRlPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUoUHJvY2Vzc1BsYW5uaW5nVGVtcGxhdGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJlcG9ydDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJlcG9ydChSZXBvcnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJldXNhYmxlIEFzc2V0PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+UmV1c2FibGUgQXNzZXQ8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSZXVzYWJsZUFzc2V0KFJldXNhYmxlQXNzZXQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvYWRtYXA8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2FkbWFwPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlUm9hZG1hcChSb2FkbWFwIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGUoUm9sZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlRGVzY3JpcHRpb24oUm9sZURlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIERlc2NyaXB0b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VSb2xlRGVzY3JpcHRvcihSb2xlRGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVTZXQoUm9sZVNldCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBTZXQgR3JvdXBpbmc8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIFNldCBHcm91cGluZzwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVJvbGVTZXRHcm91cGluZyhSb2xlU2V0R3JvdXBpbmcgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlNlY3Rpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlU2VjdGlvbihTZWN0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5TdXBwb3J0aW5nIE1hdGVyaWFsPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+U3VwcG9ydGluZyBNYXRlcmlhbDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVN1cHBvcnRpbmdNYXRlcmlhbChTdXBwb3J0aW5nTWF0ZXJpYWwgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2s8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlVGFzayhUYXNrIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UYXNrIERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGFzayBEZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdGlvbihUYXNrRGVzY3JpcHRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRhc2sgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRhc2tEZXNjcmlwdG9yKFRhc2tEZXNjcmlwdG9yIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZWFtIFByb2ZpbGU8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZWFtUHJvZmlsZShUZWFtUHJvZmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VGVtcGxhdGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZW1wbGF0ZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVRlbXBsYXRlKFRlbXBsYXRlIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5UZXJtIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUZXJtRGVmaW5pdGlvbihUZXJtRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbDwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2w8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUb29sKFRvb2wgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlRvb2wgTWVudG9yPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+VG9vbCBNZW50b3I8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VUb29sTWVudG9yKFRvb2xNZW50b3Igb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldoaXRlcGFwZXI8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5XaGl0ZXBhcGVyPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV2hpdGVwYXBlcihXaGl0ZXBhcGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIEJyZWFrZG93biBFbGVtZW50PC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBCcmVha2Rvd24gRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtCcmVha2Rvd25FbGVtZW50KFdvcmtCcmVha2Rvd25FbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIERlZmluaXRpb248L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrRGVmaW5pdGlvbihXb3JrRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBPcmRlcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgT3JkZXI8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrT3JkZXIoV29ya09yZGVyIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3Q8L2VtPicuCi0JICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUIGNhc2VXb3JrUHJvZHVjdChXb3JrUHJvZHVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7Ci0JICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IERlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdGlvbihXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgRGVzY3JpcHRvcjwvZW0+Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOwotCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPldvcmsgUHJvZHVjdCBEZXNjcmlwdG9yPC9lbT4nLgotCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVCBjYXNlV29ya1Byb2R1Y3REZXNjcmlwdG9yKFdvcmtQcm9kdWN0RGVzY3JpcHRvciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+V29yayBQcm9kdWN0IFR5cGU8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KLQkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Xb3JrIFByb2R1Y3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgY2FzZVdvcmtQcm9kdWN0VHlwZShXb3JrUHJvZHVjdFR5cGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKLQkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgY2FzZSBhbnl3YXkuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCi0JICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFQgZGVmYXVsdENhc2UoRU9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19IC8vVW1hU3dpdGNoCmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9VbWFYTUxQcm9jZXNzb3IuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQwNGZmLi4wMDAwMDAwCi0tLSBhLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVbWFYTUxQcm9jZXNzb3IuamF2YSx2IDEuMiAyMDA4LzAxLzMwIDAwOjQxOjQ4IGtsb3cgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS51dGlsLlhNTFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYueG1sLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVyIG1ldGhvZHMgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBYTUwgZG9jdW1lbnRzCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVbWFYTUxQcm9jZXNzb3IgZXh0ZW5kcyBYTUxQcm9jZXNzb3IgewotCS8qKgotCSAqIFB1YmxpYyBjb25zdHJ1Y3RvciB0byBpbnN0YW50aWF0ZSB0aGUgaGVscGVyLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVbWFYTUxQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRSkpOwotCQlVbWFQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXIgZm9yICIqIiBhbmQgInhtbCIgZmlsZSBleHRlbnNpb25zIHRoZSBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFJlc291cmNlLkZhY3Rvcnk+IGdldFJlZ2lzdHJhdGlvbnMoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25zID09IG51bGwpIHsKLQkJCXN1cGVyLmdldFJlZ2lzdHJhdGlvbnMoKTsKLQkJCXJlZ2lzdHJhdGlvbnMucHV0KFhNTF9FWFRFTlNJT04sIG5ldyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQkJcmVnaXN0cmF0aW9ucy5wdXQoU1RBUl9FWFRFTlNJT04sIG5ldyBVbWFSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCQl9Ci0JCXJldHVybiByZWdpc3RyYXRpb25zOwotCX0KLQotfSAvL1VtYVhNTFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YSBiLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi54bWwudW1hL3NyYy9vcmcvZWNsaXBzZS9lcGYveG1sL3VtYS91dGlsL1VtYVhNTFNhdmVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDk2MmUuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvVW1hWE1MU2F2ZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5YTUxIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaS5pbXBsLlhNTFNhdmVJbXBsOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY3VzdG9taXplIHRoZSBYTUxTYXZlSW1wbCB0byBzYXZlIHRoZSBzdHJpbmcgdGFncyBhcyBDREFUQQotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFVtYVhNTFNhdmVJbXBsIGV4dGVuZHMgWE1MU2F2ZUltcGwgewotCi0JcHVibGljIHN0YXRpYyBMaXN0IGNkYXRhRmVhdHVyZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCXN0YXRpYyB7Ci0JCQotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImFsdGVybmF0aXZlcyIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoIm1haW5EZXNjcmlwdGlvbiIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoImhvd1RvU3RhZmYiKTsKLQkJY2RhdGFGZWF0dXJlTmFtZXMuYWRkKCJrZXlDb25zaWRlcmF0aW9ucyIpOwotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInB1cnBvc2UiKTsJCi0JCWNkYXRhRmVhdHVyZU5hbWVzLmFkZCgic2NvcGUiKTsJCQkJCS8vIFByb2Nlc3NEZXNjcmlwdGlvbgotCQljZGF0YUZlYXR1cmVOYW1lcy5hZGQoInVzYWdlTm90ZXMiKTsJCQkvLyBQcm9jZXNzRGVzY3JpcHRpb24KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzQ0RBVEFGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmLCBib29sZWFuIGlzQXR0cmlidXRlKSB7Ci0JCQotCQlpZiAoIGlzQXR0cmlidXRlICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotLy8JCWlmICggZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fS2V5Q29uc2lkZXJhdGlvbnMoKSAKLS8vCQkJfHwgZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCkKLS8vCQkJfHwgZiA9PSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZWN0aW9uX0Rlc2NyaXB0aW9uKCkKLS8vCQkpIHsKLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0Iik7Ci0vLwkJfQotCQkKLQkJcmV0dXJuIGNkYXRhRmVhdHVyZU5hbWVzLmNvbnRhaW5zKGYuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqLwotCXB1YmxpYyBVbWFYTUxTYXZlSW1wbChYTUxIZWxwZXIgaGVscGVyKSB7Ci0JCXN1cGVyKGhlbHBlcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9wdGlvbnMgTWFwCi0JICogQHBhcmFtIGhlbHBlciBYTUxIZWxwZXIKLQkgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nCi0JICovCi0JcHVibGljIFVtYVhNTFNhdmVJbXBsKE1hcCBvcHRpb25zLCBYTUxIZWxwZXIgaGVscGVyLCBTdHJpbmcgZW5jb2RpbmcpIHsKLQkJc3VwZXIob3B0aW9ucywgaGVscGVyLCBlbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhdHlwZVZhbHVlKE9iamVjdCB2YWx1ZSwgRVN0cnVjdHVyYWxGZWF0dXJlIGYsCi0JCQlib29sZWFuIGlzQXR0cmlidXRlKSB7CQotCQkKLQkJaWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCIiKSApIHsKLQkJCXJldHVybiAiIjsKLQkJfQkJCQkKLQkJCi0JCWlmICggaXNDREFUQUZlYXR1cmUoZiwgaXNBdHRyaWJ1dGUpICkgewotCQkJU3RyaW5nIHN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcmVwbGFjZWQgPSAiXV0+IjsJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIuaW5kZXhPZihyZXBsYWNlZCkgPj0gMCkgewotCQkJCXN0ciA9IHN0ci5yZXBsYWNlQWxsKHJlcGxhY2VkLCAiXV1dXT48IVtDREFUQVs+IiApOwkvLyROT04tTkxTLTEkCS8vMTc1Mzk1Ci0JCQl9Ci0JCQlyZXR1cm4gIjwhW0NEQVRBWyIgKyBzdHIgKyAiXV0+IjsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldERhdGF0eXBlVmFsdWUodmFsdWUsIGYsIGlzQXR0cmlidXRlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwgYi8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYueG1sLnVtYS9zcmMvb3JnL2VjbGlwc2UvZXBmL3htbC91bWEvdXRpbC9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTlmY2MuLjAwMDAwMDAKLS0tIGEvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEvc3JjL29yZy9lY2xpcHNlL2VwZi94bWwvdW1hL3V0aWwvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotUHJvdmlkZXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydCBmb3IgYWNjZXNzaW5nIHRoZSBYTUwgVU1BIG1vZGVsIG9iamVjdHMuCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy8ucHJvamVjdCBiLzEuNS9yZWxlbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTA3ZWEuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yZWxlbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYWxsRWxlbWVudHMueG1sIGIvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL2FsbEVsZW1lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwMWM0Mi4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYWxsRWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYWxsRWxlbWVudHMgRGVsZWdhdG9yIj4KLQkKLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTwhLS0gUnVuIGEgZ2l2ZW4gJHt0YXJnZXR9IG9uIGFsbCBlbGVtZW50cyBiZWluZyBidWlsdCAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIFJlcGxhY2UgZWxlbWVudC5pZCB3aXRoIHRoZSBpZCBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICAgIC0tPgotCTwhLS0gSWYgZWxlbWVudC5pZCBkb2VzIG5vdCBleGlzdCBpbiAke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcy9lbGVtZW50LmlkICAgLS0+Ci0JPCEtLSBvciAke2Jhc2VMb2NhdGlvbn0vZmVhdHVyZXMvZWxlbWVudC5pZCwgdGhlbiB5b3UgbXVzdCBwcm92aWRlIHRoZSAgICAgICAtLT4KLQk8IS0tIGxvY2F0aW9uIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5ICJwbHVnaW5QYXRoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAgICAgICAgICAgICAtLT4KLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHNEZWxlZ2F0b3IiPgotIAkJPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCSAJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmVhdHVyZSIgLz4KLQkgCQk8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlIiAvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLSAKLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTwhLS0gVGFyZ2V0cyB0byBhc3NlbWJsZSB0aGUgYnVpbHQgZWxlbWVudHMgZm9yIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbnMgIC0tPgotIAk8IS0tIFRoZXNlIGdlbmVyYWxseSBjYWxsIHRoZSBnZW5lcmF0ZWQgYXNzZW1ibGUgc2NyaXB0cyAobmFtZWQgaW4gICAgICAgICAtLT4KLSAJPCEtLSAke2Fzc2VtYmxlU2NyaXB0TmFtZX0pIGJ1dCBtYXkgYWxzbyBhZGQgcHJlIGFuZCBwb3N0IHByb2Nlc3NpbmcgICAgICAgLS0+Ci0gCTwhLS0gQWRkIG9uZSB0YXJnZXQgZm9yIGVhY2ggcm9vdCBlbGVtZW50IGFuZCBlYWNoIGNvbmZpZ3VyYXRpb24gICAgICAgICAgIC0tPgotIAk8IS0tIFJlcGxhY2UgZWxlbWVudC5pZCB3aXRoIHRoZSBpZCBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQgICAtLT4KLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLSAJPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlLndpbjMyLndpbjMyLng4NiI+Ci0gCQk8YW50IGFudGZpbGU9IiR7YXNzZW1ibGVTY3JpcHROYW1lfSIgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iYXJjaGl2ZU5hbWUiIHZhbHVlPSIke2FyY2hpdmVOYW1lUHJlZml4fS0ke3RndFZlcn0tJHtidWlsZExhYmVsfS13aW4zMi56aXAiLz4KLQkJPC9hbnQ+Ci0gCTwvdGFyZ2V0PgotCi0gCTx0YXJnZXQgbmFtZT0iYXNzZW1ibGUub3JnLmVjbGlwc2UuZXBmLnByb2R1Y3QuZmVhdHVyZS5saW51eC5ndGsueDg2Ij4KLSAJCTxhbnQgYW50ZmlsZT0iJHthc3NlbWJsZVNjcmlwdE5hbWV9IiBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJhcmNoaXZlTmFtZSIgdmFsdWU9IiR7YXJjaGl2ZU5hbWVQcmVmaXh9LSR7dGd0VmVyfS0ke2J1aWxkTGFiZWx9LWxpbnV4LnppcCIvPgotCQk8L2FudD4KLSAJPC90YXJnZXQ+Ci0KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5NjI0Yy4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBhcmFtZXRlcnMgZGVzY3JpYmluZyBob3cgYW5kIHdoZXJlIHRvIGV4ZWN1dGUgdGhlIGJ1aWxkLgotIyBUeXBpY2FsIHVzZXJzIG5lZWQgb25seSB1cGRhdGUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgotIyAgICBiYXNlTG9jYXRpb24gLSB3aGVyZSB0aGluZ3MgeW91IGFyZSBidWlsZGluZyBhZ2FpbnN0IGFyZSBpbnN0YWxsZWQKLSMgICAgYm9vdGNsYXNzcGF0aCAtIFRoZSBiYXNlIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0ICh0eXBpY2FseSBydC5qYXIpCi0jICAgIGNvbmZpZ3MgLSB0aGUgbGlzdCBvZiB7b3MsIHdzLCBhcmNofSBjb25maWd1cmF0aW9ucyB0byBidWlsZC4gIAotIwotIyBPZiBjb3Vyc2UgYW55IG9mIHRoZSBzZXR0aW5ncyBoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNwZWMnaW5nIAotIyB0aGVtIG9uIHRoZSBjb21tYW5kIGxpbmUgKGUuZy4sIC1EYmFzZUxvY2F0aW9uPWQ6L2VjbGlwc2UKLQotIyMjIyMjIyMjIyMjIyBQUk9EVUNUL1BBQ0tBR0lORyBDT05UUk9MICMjIyMjIyMjIyMjIyMKLSNwcm9kdWN0PS9wbHVnaW4gb3IgZmVhdHVyZSBpZC9wYXRoL3RvLy5wcm9kdWN0Ci1wcm9kdWN0PW9yZy5lY2xpcHNlLmVwZi5yY3AudWkvY29tcG9zZXIucHJvZHVjdAotcnVuUGFja2FnZXI9dHJ1ZQotCi0jU2V0IHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIHRoYXQgd2lsbCByZXN1bHQgZnJvbSB0aGUgcHJvZHVjdCBidWlsZC4KLWFyY2hpdmVOYW1lUHJlZml4PWVwZi1jb21wb3NlcgotCi0jIFRoZSBwcmVmaXggdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBhcmNoaXZlLgotYXJjaGl2ZVByZWZpeD1lcGYtY29tcG9zZXIKLQotIyBUaGUgbG9jYXRpb24gdW5kZXJ3aGljaCBhbGwgb2YgdGhlIGJ1aWxkIG91dHB1dCB3aWxsIGJlIGNvbGxlY3RlZC4KLWNvbGxlY3RpbmdGb2xkZXI9JHthcmNoaXZlUHJlZml4fQotCi0jIFRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgVGhpcyAKLSMgdmFsdWUgaXMgYSAnJicgc2VwYXJhdGVkIGxpc3Qgb2YgJywnIHNlcGFyYXRlIHRyaXBsZXMuICBGb3IgZXhhbXBsZSwgCi0jICAgICBjb25maWdzPXdpbjMyLHdpbjMyLHg4NiAmIGxpbnV4LG1vdGlmLHg4NgotIyBCeSBkZWZhdWx0IHRoZSB2YWx1ZSBpcyAqLCosKgotI2NvbmZpZ3M9d2luMzIsIHdpbjMyLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHBwYyAmXAotIyBsaW51eCwgZ3RrLCB4ODYgJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAmIFwKLSMJbGludXgsIG1vdGlmLCB4ODYgJiBcCi0jCXNvbGFyaXMsIG1vdGlmLCBzcGFyYyAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAmIFwKLSMJYWl4LCBtb3RpZiwgcHBjICYgXAotIwlocHV4LCBtb3RpZiwgUEFfUklTQyAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYwotCi0jY29uZmlncz13aW4zMix3aW4zMix4ODYKLWNvbmZpZ3M9d2luMzIsd2luMzIseDg2ICYgbGludXgsZ3RrLHg4NgotCi0jIEJ5IGRlZmF1bHQgUERFIGNyZWF0ZXMgb25lIGFyY2hpdmUgKHJlc3VsdCkgcGVyIGVudHJ5IGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSMgU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRyeSB3aWxsIGNhdXNlIFBERSB0byBvbmx5IGNyZWF0ZSBvbmUgb3V0cHV0IGNvbnRhaW5pbmcgYWxsIAotIyBhcnRpZmFjdHMgZm9yIGFsbCB0aGUgcGxhdGZvcm1zIGxpc3RlZCBpbiB0aGUgY29uZmlncyBwcm9wZXJ0eS4KLSNncm91cENvbmZpZ3VyYXRpb25zPXRydWUKLQotI1RoZSBmb3JtYXQgb2YgdGhlIGFyY2hpdmUuIEJ5IGRlZmF1bHQgYSB6aXAgaXMgY3JlYXRlZCB1c2luZyBhbnRaaXAuCi0jVGhlIGxpc3QgY2FuIG9ubHkgY29udGFpbiB0aGUgY29uZmlndXJhdGlvbiBmb3Igd2hpY2ggdGhlIGRlc2lyZWQgZm9ybWF0IGlzIGRpZmZlcmVudCB0aGFuIHppcC4KLSNhcmNoaXZlc0Zvcm1hdD13aW4zMiwgd2luMzIsIHg4NiAtIGFudFppcCYgXAotIwlsaW51eCwgZ3RrLCBwcGMgLSBhbnRaaXAgJlwKLSMgICAgbGludXgsIGd0aywgeDg2IC0gYW50WmlwJiBcCi0jCWxpbnV4LCBndGssIHg4Nl82NCAtIGFudFppcCYgXAotIyBsaW51eCwgbW90aWYsIHg4NiAtIGFudFppcCYgXAotIwlzb2xhcmlzLCBtb3RpZiwgc3BhcmMgLSBhbnRaaXAmIFwKLSMJc29sYXJpcywgZ3RrLCBzcGFyYyAtIGFudFppcCYgXAotIwlhaXgsIG1vdGlmLCBwcGMgLSBhbnRaaXAmIFwKLSMJaHB1eCwgbW90aWYsIFBBX1JJU0MgLSBhbnRaaXAmIFwKLSMJbWFjb3N4LCBjYXJib24sIHBwYyAtIGFudFppcAotCi0jYXJjaGl2ZXNGb3JtYXQ9d2luMzIsd2luMzIseDg2IC0gZm9sZGVyJlwKLSMgICAgbGludXgsIGd0aywgeDg2IC0gZm9sZGVyCi1hcmNoaXZlc0Zvcm1hdD13aW4zMix3aW4zMix4ODYgLSBhbnRaaXAmXAotICAgIGxpbnV4LCBndGssIHg4NiAtIGFudFppcAotCQotI1NldCB0byB0cnVlIGlmIHlvdSB3YW50IHRoZSBvdXRwdXQgdG8gYmUgcmVhZHkgZm9yIGFuIHVwZGF0ZSBqYXIgKG5vIHNpdGUueG1sIGdlbmVyYXRlZCkKLSNvdXRwdXRVcGRhdGVKYXJzID0gZmFsc2UKLQotI1NldCB0byB0cnVlIGZvciBKbmxwIGdlbmVyYXRpb24KLSNjb2RlYmFzZSBzaG91bGQgYmUgYSBVUkwgdGhhdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHJvb3Qgb2YgYWxsIHJlbGF0aXZlIFVSTHMgaW4gdGhlIG91dHB1dC4KLSNnZW5lcmF0ZUpubHA9ZmFsc2UKLSNqbmxwLmNvZGViYXNlPTxjb2RlYmFzZSB1cmw+Ci0jam5scC5qMnNlPTxqMnNlIHZlcnNpb24+Ci0jam5scC5sb2NhbGU9PGEgbG9jYWxlPgotCi0jU2V0IHRvIHRydWUgaWYgeW91IHdhbnQgdG8gc2lnbiBqYXJzCi0jc2lnbkphcnM9ZmFsc2UKLSNzaWduLmFsaWFzPTxhbGlhcz4KLSNzaWduLmtleXN0b3JlPTxrZXlzdG9yZSBsb2NhdGlvbj4KLSNzaWduLnN0b3JlcGFzcz08a2V5c3RvcmUgcGFzc3dvcmQ+Ci0KLSNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgemlwIGV4ZWN1dGFibGUKLXppcGFyZ3M9Ci0KLSNBcmd1bWVudHMgdG8gc2VuZCB0byB0aGUgdGFyIGV4ZWN1dGFibGUKLXRhcmFyZ3M9Ci0KLSNDb250cm9sIHRoZSBjcmVhdGlvbiBvZiBhIGZpbGUgY29udGFpbmluZyB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBlYWNoIGNvbmZpZ3VyYXRpb24gLSBvbiBieSBkZWZhdWx0IAotI2dlbmVyYXRlVmVyc2lvbnNMaXN0cz1mYWxzZQotCi0jIyMjIyMjIyMjIyMjIyBCVUlMRCBOQU1JTkcgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgYnVpbGQgZWxlbWVudHMgYXJlIGZldGNoZWQgYW5kIHdoZXJlCi0jIHRoZSBidWlsZCB0YWtlcyBwbGFjZS4KLWJ1aWxkRGlyZWN0b3J5PSR7YnVpbGRlcn0vYnVpbGQKLQotIyBUeXBlIG9mIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dC4gIFR5cGljYWxseSB0aGlzIHZhbHVlIGlzCi0jIG9uZSBvZiBJLCBOLCBNLCBTLCAuLi4KLWJ1aWxkVHlwZT1OCi0KLSNidWlsZElkIGlzIHNldCBpbiBydW4uYmF0Ci0jIElEIG9mIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQuCi0jYnVpbGRJZD0yMDA3MDIxNS0yMTUwCi10Z3RWZXI9MS4yLjAKLXRndE1pbGVzdG9uZT1NMgotCi0jIExhYmVsIGZvciB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0Ci0jIENyZWF0ZXMgYSBmb2xkZXIgbmFtZWQgYXMgJHtidWlsTGFiZWx9IGluIHRoZSBvdXRwdXQgbG9jYXRpb24KLWJ1aWxkTGFiZWw9JHtidWlsZFR5cGV9LiR7YnVpbGRJZH0KLQotIyBUaW1lc3RhbXAgZm9yIHRoZSBidWlsZC4gIFVzZWQgaW4gbmFtaW5nIHRoZSBidWlsZCBvdXRwdXQKLXRpbWVzdGFtcD0wMDcKLQotI1RoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgcXVhbGlmaWVyIG9mIGEgcGx1Z2luIG9yIGZlYXR1cmUgd2hlbiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgdmFsdWUgY29tcHV0ZWQgYnkgcGRlLgotI1RoZSB2YWx1ZSB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byBwbHVnaW4gb3IgZmVhdHVyZXMgaW5kaWNhdGluZyBidWlsZC5wcm9wZXJ0aWVzLCBxdWFsaWZpZXIgPSBjb250ZXh0IAotI2ZvcmNlQ29udGV4dFF1YWxpZmllcj08dGhlIHZhbHVlIGZvciB0aGUgcXVhbGlmaWVyPgotCi0jRW5hYmxlIC8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiBhIHN1ZmZpeCBmb3IgdGhlIGZlYXR1cmVzIHRoYXQgdXNlIC5xdWFsaWZpZXIuIAotI1RoZSBnZW5lcmF0ZWQgc3VmZml4IGlzIGNvbXB1dGVkIGFjY29yZGluZyB0byB0aGUgY29udGVudCBvZiB0aGUgZmVhdHVyZSAgIAotI2dlbmVyYXRlRmVhdHVyZVZlcnNpb25TdWZmaXg9dHJ1ZQotCi0jIyMjIyMjIyMjIyMjIEJBU0UgQ09OVFJPTCAjIyMjIyMjIyMjIyMjCi0jIFNldHRpbmdzIGZvciB0aGUgYmFzZSBFY2xpcHNlIGNvbXBvbmVudHMgYW5kIEphdmEgY2xhc3MgbGlicmFyaWVzIAotIyBhZ2FpbnN0IHdoaWNoIHlvdSBhcmUgYnVpbGRpbmcuCi0jIEJhc2UgbG9jYXRpb24gZm9yIGFueXRoaW5nIHRoZSBidWlsZCBuZWVkcyB0byBjb21waWxlIGFnYWluc3QuICBGb3IgZXhhbXBsZSwKLSMgaW4gbW9zdCBSQ1AgYXBwIG9yIGEgcGx1Zy1pbiwgIHRoZSBiYXNlTG9jYXRpb24gc2hvdWxkIGJlIHRoZSBsb2NhdGlvbiBvZiBhIHByZXZpb3VzbHkKLSMgaW5zdGFsbGVkIEVjbGlwc2UgYWdhaW5zdCB3aGljaCB0aGUgYXBwbGljYXRpb24gb3IgcGx1Zy1pbiBjb2RlIHdpbGwgYmUgY29tcGlsZWQgYW5kIHRoZSBSQ1AgZGVsdGEgcGFjay4KLQotI09zL1dzL0FyY2gvbmwgb2YgdGhlIGVjbGlwc2Ugc3BlY2lmaWVkIGJ5IGJhc2VMb2NhdGlvbgotYmFzZW9zPXdpbjMyCi1iYXNld3M9d2luMzIKLWJhc2VhcmNoPXg4NgotCi0jcGx1Z2luUGF0aCBpcyBhIGxpc3Qgb2YgbG9jYXRpb25zIGluIHdoaWNoIHRvIGZpbmQgcGx1Z2lucyBhbmQgZmVhdHVyZXMuICBUaGlzIGxpc3QgaXMgc2VwYXJhdGVkIGJ5IHRoZSBwbGF0Zm9ybSBmaWxlIHNlcGFyYXRvciAoOyBvciA6KQotI2EgbG9jYXRpb24gaXMgb25lIG9mOiAgCi0jLSB0aGUgbG9jYXRpb24gb2YgdGhlIGphciBvciBmb2xkZXIgdGhhdCBpcyB0aGUgcGx1Z2luIG9yIGZlYXR1cmUgOiAvcGF0aC90by9mb28uamFyIG9yIC9wYXRoL3RvL2ZvbwotIy0gYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIC9wbHVnaW5zIG9yIC9mZWF0dXJlcyBzdWJkaXJlY3RvcnkKLSMtIHRoZSBsb2NhdGlvbiBvZiBhIGZlYXR1cmUueG1sLCBvciBmb3IgMi4xIHN0eWxlIHBsdWdpbnMsIHRoZSBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbAotI3BsdWdpblBhdGg9Ci0KLXNraXBCYXNlPXRydWUKLWVjbGlwc2VVUkw9PHVybCBmb3IgZWNsaXBzZSBkb3dubG9hZCBzaXRlPgotZWNsaXBzZUJ1aWxkSWQ9PElkIG9mIEVjbGlwc2UgYnVpbGQgdG8gZ2V0PgotZWNsaXBzZUJhc2VVUkw9JHtlY2xpcHNlVVJMfS9lY2xpcHNlLXBsYXRmb3JtLSR7ZWNsaXBzZUJ1aWxkSWR9LXdpbjMyLnppcAotCi0KLSMjIyMjIyMjIyMjIyMgTUFQIEZJTEUgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgc2VjdGlvbiBkZWZpbmVzIENWUyB0YWdzIHRvIHVzZSB3aGVuIGZldGNoaW5nIHRoZSBtYXAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4KLSMgSWYgeW91IHdhbnQgdG8gZmV0Y2ggdGhlIG1hcCBmaWxlIGZyb20gcmVwb3NpdG9yeSAvIGxvY2F0aW9uLCBjaGFuZ2UgdGhlIGdldE1hcEZpbGVzIHRhcmdldCBpbiB0aGUgY3VzdG9tVGFyZ2V0cy54bWwKLQotI3NraXBNYXBzPXRydWUKLSNtYXBzUmVwbz06cHNlcnZlcjphbm9ueW1vdXNAZXhhbXBsZS5jb20vcGF0aC90by9yZXBvCi1tYXBzUmVwbz0ke2N2c0luZm99QGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5Ci0jbWFwc1Jvb3Q9cGF0aC90by9tYXBzCi1tYXBzUm9vdD1vcmcuZWNsaXBzZS5lcGYvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmVsZW5nL21hcHMKLW1hcHNDaGVja291dFRhZz1IRUFECi0jbWFwc0NoZWNrb3V0VGFnPXYke2J1aWxkSWR9Ci0KLXRhZ01hcHM9dHJ1ZQotbWFwc1RhZ1RhZz12JHtidWlsZElkfQotCi0jIyMjIyMjIyMjIyMjIFVQREFURSBTSVRFIEZJTEUgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi11cGRhdGVTaXRlUmVwbz0ke2N2c0luZm99QGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9vcmcuZWNsaXBzZQotdXBkYXRlU2l0ZUZpbGU9d3d3L2VwZi9kb3dubG9hZHMvdG9vbC90b29sX2Rvd25sb2Fkcy5waHAKLXVwZGF0ZVNpdGVDaGVja291dFRhZz1IRUFECi11cGRhdGVTaXRlRGVzdGluYXRpb249Ci0KLQotIyMjIyMjIyMjIyMjIFJFUE9TSVRPUlkgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBzZWN0aW9uIGRlZmluZXMgcHJvcGVydGllcyBwYXJhbWV0ZXJpemluZyB0aGUgcmVwb3NpdG9yaWVzIHdoZXJlIHBsdWdpbnMsIGZyYWdtZW50cwotIyBidW5kbGVzIGFuZCBmZWF0dXJlcyBhcmUgYmVpbmcgb2J0YWluZWQgZnJvbS4gCi0KLSMgVGhlIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZWxlbWVudHMgdG8gYnVpbGQuCi0jIEJ5IGRlZmF1bHQgdGhlYnVpbGRlciB3aWxsIHVzZSB3aGF0ZXZlciBpcyBpbiB0aGUgbWFwcy4gIAotIyBUaGlzIHZhbHVlIHRha2VzIHRoZSBmb3JtIG9mIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBpZGVudGlmaWVyIChsaWtlIHVzZWQgaW4gdGhlIG1hcCBmaWxlcykgYW5kIHRoZSAKLSMgb3ZlcnJpZGluZyB2YWx1ZQotIyBGb3IgZXhhbXBsZSBmZXRjaFRhZz1DVlM9SEVBRCwgU1ZOPXYyMDA1MDEwMQotI2ZldGNoVGFnPVIxXzBfQlJBTkNICi0jZmV0Y2hUYWc9SEVBRAotI3NraXBGZXRjaD10cnVlCi0KLQotIyMjIyMjIyMjIyMjIyBKQVZBIENPTVBJTEVSIE9QVElPTlMgIyMjIyMjIyMjIyMjIyMKLSMgVGhlIGxvY2F0aW9uIG9mIHRoZSBKYXZhIGphcnMgdG8gY29tcGlsZSBhZ2FpbnN0LiAgVHlwaWNhbGx5IHRoZSBydC5qYXIgZm9yIHlvdXIgSkRLL0pSRQotYm9vdGNsYXNzcGF0aD0ke2phdmEuaG9tZX0vbGliL2NvcmUuamFyOyR7amF2YS5ob21lfS9saWIvY2hhcnNldHMuamFyOyR7amF2YS5ob21lfS9saWIvQkQuamFyOyR7amF2YS5ob21lfS9saWIvZGVwbG95Lmphcjske2phdmEuaG9tZX0vbGliL2dyYXBoaWNzLmphcjske2phdmEuaG9tZX0vbGliL2libWNlcnRwYXRocHJvdmlkZXIuamFyOyR7amF2YS5ob21lfS9saWIvaWJtY2Z3Lmphcjske2phdmEuaG9tZX0vbGliL2libWphYXNhY3RpdmVsbS5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1qYWFzbG0uamFyOyR7amF2YS5ob21lfS9saWIvaWJtamNlZncuamFyOyR7amF2YS5ob21lfS9saWIvaWJtamdzc3Byb3ZpZGVyLmphcjske2phdmEuaG9tZX0vbGliL2libWpzc2Vwcm92aWRlcjIuamFyOyR7amF2YS5ob21lfS9saWIvaWJtb3JiLmphcjske2phdmEuaG9tZX0vbGliL2libW9yYmFwaS5qYXI7JHtqYXZhLmhvbWV9L2xpYi9pYm1wa2NzLmphcjske2phdmEuaG9tZX0vbGliL2phdmF3cy5qYXI7JHtqYXZhLmhvbWV9L2xpYi9wbHVnaW4uamFyOyR7amF2YS5ob21lfS9saWIvc2VjdXJpdHkuamFyOyR7amF2YS5ob21lfS9saWIvc2VydmVyLmphcjske2phdmEuaG9tZX0vbGliL3ZtLmphcjske2phdmEuaG9tZX0vbGliL3htbC5qYXI7JHtqYXZhLmhvbWV9L2xpYi9ydC5qYXIKLQotIyBzcGVjaWZpYyBKUkUgbG9jYXRpb25zIHRvIGNvbXBpbGUgYWdhaW5zdC4gVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIGNvbXBpbGUgYnVuZGxlcyBzcGVjaWZ5aW5nIGEgCi0jIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50LiBVbmNvbW1lbnQgYW5kIHNldCB2YWx1ZXMgZm9yIGVudmlyb25tZW50cyB0aGF0IHlvdSBzdXBwb3J0Ci0jQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMD0gL3BhdGgvdG8vcnQuamFyCi0jQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMT0KLSNPU0dpL01pbmltdW0tMS4wPQotI09TR2kvTWluaW11bS0xLjE9Ci0jSlJFLTEuMT0KLSNKMlNFLTEuMj0KLSNKMlNFLTEuMz0KLSNKMlNFLTEuND0KLSNKMlNFLTEuNT0KLSNKYXZhU0UtMS42PQotI1BlcnNvbmFsSmF2YS0xLjE9Ci0jUGVyc29uYWxKYXZhLTEuMj0KLSNDREMtMS4wL1BlcnNvbmFsQmFzaXMtMS4wPQotI0NEQy0xLjAvUGVyc29uYWxKYXZhLTEuMD0KLSNDREMtMS4xL1BlcnNvbmFsQmFzaXMtMS4xPQotI0NEQy0xLjEvUGVyc29uYWxKYXZhLTEuMT0KLQotIyBTcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBjb21waWxlciBsb2cgd2hlbiBlY2xpcHNlIGpkdCBpcyB1c2VkCi1sb2dFeHRlbnNpb249LmxvZwotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZGVidWcgaW5mbyBpbiB0aGUgb3V0cHV0IGphcnMKLWphdmFjRGVidWdJbmZvPXRydWUgCi0KLSMgV2hldGhlciBvciBub3QgdG8gZmFpbCB0aGUgYnVpbGQgaWYgdGhlcmUgYXJlIGNvbXBpbGVyIGVycm9ycwotamF2YWNGYWlsT25FcnJvcj10cnVlCi0KLSMgRW5hYmxlIG9yIGRpc2FibGUgdmVyYm9zZSBtb2RlIG9mIHRoZSBjb21waWxlcgotI2phdmFjVmVyYm9zZT10cnVlCi0KLSMgRXh0cmEgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIuIFRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgamF2YSBjb21waWxlciBiZWluZyB1c2VkLgotI2NvbXBpbGVyQXJnPS1nCi1jb21waWxlckFyZz0tbm93YXJuCi0KLSMgRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlLiBUaGlzIHZhbHVlIGlzIHVzZWQgd2hlbiBjb21waWxpbmcgcGx1Zy1pbnMgdGhhdCBkbyBub3Qgc2V0IHRoZSBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudCBvciBzZXQgamF2YWNTb3VyY2UgaW4gYnVpbGQucHJvcGVydGllcwotamF2YWNTb3VyY2U9MS41Ci0KLSMgRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIGJ5dGUgY29kZSB0YXJnZXRlZC4gVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIHBsdWctaW5zIHRoYXQgZG8gbm90IHNldCB0aGUgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgb3Igc2V0IGphdmFjVGFyZ2V0IGluIGJ1aWxkLnByb3BlcnRpZXMuCi1qYXZhY1RhcmdldD0xLjUKLQotCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvY3VzdG9tVGFyZ2V0cy54bWwgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvY3VzdG9tVGFyZ2V0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWExMzguLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL2N1c3RvbVRhcmdldHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkJ1aWxkIHNwZWNpZmljIHRhcmdldHMgYW5kIHByb3BlcnRpZXMiIGRlZmF1bHQ9Im5vRGVmYXVsdCI+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFJ1biBhIGdpdmVuICR7dGFyZ2V0fSBvbiBhbGwgZWxlbWVudHMgYmVpbmcgYnVpbHQgLS0+Ci0JPCEtLSBBZGQgb24gPGFudD4gdGFzayBmb3IgZWFjaCB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHByb3BlcnR5IG5hbWU9ImFsbEVsZW1lbnRzRmlsZSIgdmFsdWU9IiR7YnVpbGRlcn0vYWxsRWxlbWVudHMueG1sIi8+Ci0JPGltcG9ydCBmaWxlPSIke2FsbEVsZW1lbnRzRmlsZX0iLz4KLQotCTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHMiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzRGVsZWdhdG9yIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJnZXRCYXNlQ29tcG9uZW50cyIgZGVwZW5kcz0iY2hlY2tMb2NhbEJhc2UiIHVubGVzcz0ic2tpcEJhc2UiPgotCQk8Z2V0IHNyYz0iJHtlY2xpcHNlQmFzZVVSTH0iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9Ly4uL3RlbXAtYmFzZS56aXAiLz4KLQkJPHVuemlwIGRlc3Q9IiR7YmFzZX0iIG92ZXJ3cml0ZT0idHJ1ZSIgc3JjPSIke2J1aWxkRGlyZWN0b3J5fS8uLi90ZW1wLWJhc2UuemlwIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNoZWNrTG9jYWxCYXNlIj4KLQkJPGF2YWlsYWJsZSBmaWxlPSIke2Jhc2V9IiBwcm9wZXJ0eT0ic2tpcEJhc2UiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQ2hlY2sgb3V0IG1hcCBmaWxlcyBmcm9tIGNvcnJlY3QgcmVwb3NpdG9yeSAtLT4KLQk8IS0tIFJlcGxhY2UgdmFsdWVzIGZvciBtYXBzQ2hlY2tvdXRUYWcgYXMgZGVzaXJlZC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJnZXRNYXBGaWxlcyIgZGVwZW5kcz0iY2hlY2tMb2NhbE1hcHMiIHVubGVzcz0ic2tpcE1hcHMiPgotCQk8IS0tIDxwcm9wZXJ0eSBuYW1lPSJtYXBzQ2hlY2tvdXRUYWciIHZhbHVlPSJIRUFEIi8+IC0tPgotCQk8Y3ZzIGN2c1Jvb3Q9IiR7bWFwc1JlcG99IiBwYWNrYWdlPSIke21hcHNSb290fSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vbWFwcyIgdGFnPSIke21hcHNDaGVja291dFRhZ30iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2hlY2tMb2NhbE1hcHMiPgotCQk8YXZhaWxhYmxlIHByb3BlcnR5PSJza2lwTWFwcyIgZmlsZT0iJHtidWlsZERpcmVjdG9yeX0vbWFwcyIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ0YWdNYXBGaWxlcyIgaWY9InRhZ01hcHMiPgotCQk8Y3ZzIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L21hcHMvJHttYXBzUm9vdH0iIGNvbW1hbmQ9InRhZyAke21hcHNUYWdUYWd9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIHVubGVzcz0ibm9jbGVhbiI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsRWxlbWVudHMiPgotCQkJPHBhcmFtIG5hbWU9InRhcmdldCIgdmFsdWU9ImNsZWFuRWxlbWVudCIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuQnVpbGREaXIiPgotCQk8ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fSIgCi0JCQkJaW5jbHVkZXM9IioqLyoiCi0JCQkJZGVmYXVsdGV4Y2x1ZGVzPSJubyIKLQkJCS8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJnYXRoZXJMb2dzIj4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZERpcmVjdG9yeX0vJHtidWlsZExhYmVsfS9jb21waWxlbG9ncyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImFsbEVsZW1lbnRzIj4KLQkJCTxwYXJhbSBuYW1lPSJ0YXJnZXQiIHZhbHVlPSJnYXRoZXJMb2dzIi8+Ci0JCTwvYW50Y2FsbD4KLQkJPHVuemlwIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0vY29tcGlsZWxvZ3MiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9L2ZlYXR1cmVzIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqKi8qLmxvZy56aXAiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC91bnppcD4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImdlbmVyYXRlQWJvdXRNYXBwaW5ncyI+Ci0JCTxyZXBsYWNlIGRpcj0iJHtidWlsZERpcmVjdG9yeX0vcGx1Z2lucyIgdmFsdWU9IiR7YnVpbGRJZH0iIHRva2VuPSJAYnVpbGRJZEAiPgotCQkJPGluY2x1ZGUgbmFtZT0iKiovYWJvdXQubWFwcGluZ3MiIC8+Ci0JCTwvcmVwbGFjZT4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9InVwZGF0ZVJjcEluaUZpbGUiPgotCQk8cmVwbGFjZSBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9IiB2YWx1ZT0iJHtidWlsZElkfSIgdG9rZW49IkBidWlsZElkQCI+Ci0JCQk8aW5jbHVkZSBuYW1lPSIqKi9lcGYuaW5pIiAvPgotCQk8L3JlcGxhY2U+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJ1cGRhdGVCdWlsZFN0YXRlIj4KLQkJPHRzdGFtcD4KLQkJCTxmb3JtYXQgcHJvcGVydHk9ImJ1aWxkRGF0ZSIgcGF0dGVybj0ieXl5eS1NTS1kIi8+Ci0JCTwvdHN0YW1wPgotCQk8cHJvcGVydHkgbmFtZT0iY3VycmVudEJ1aWxkU3RhdGVGaWxlIiB2YWx1ZT0iJHtidWlsZFN0YXRlRGlyfS90YWcuY3VycmVudC5wcm9wZXJ0aWVzIi8+Ci0JCTxwcm9wZXJ0eSBmaWxlPSIke2N1cnJlbnRCdWlsZFN0YXRlRmlsZX0iIHByZWZpeD0icHJldiIvPgotCQk8cHJvcGVydHkgbmFtZT0icHJldi5idWlsZERhdGUiIHZhbHVlPSIke2J1aWxkRGF0ZX0iLz4KLQkJPHBhdGggaWQ9ImJ1aWxkRGlyVGVtcFBhdGgiIGxvY2F0aW9uPSIke2J1aWxkRGlyZWN0b3J5fSIvPgotCQk8cGF0aGNvbnZlcnQgZGlyc2VwPSIvIiBwcm9wZXJ0eT0iYnVpbGREaXJlY3RvcnlQYXRoIiByZWZpZD0iYnVpbGREaXJUZW1wUGF0aCIvPgotCQk8cHJvcGVydHlmaWxlCi0JCSAgICBmaWxlPSIke2N1cnJlbnRCdWlsZFN0YXRlRmlsZX0iCi0JCSAgICBjb21tZW50PSJMYXN0IGJ1aWxkIElEIGFuZCBkYXRlIj4KLQkJICA8ZW50cnkga2V5PSJidWlsZElkIiB2YWx1ZT0iJHtidWlsZElkfSIvPgotCQkgIDxlbnRyeSBrZXk9ImJ1aWxkRGF0ZSIgdmFsdWU9IiR7YnVpbGREYXRlfSIvPgotCQkgIDxlbnRyeSBrZXk9ImJ1aWxkRGlyIiB2YWx1ZT0iJHtidWlsZERpcmVjdG9yeVBhdGh9Ii8+Ci0JCTwvcHJvcGVydHlmaWxlPgotCQk8ZWNobyBmaWxlPSIke2J1aWxkU3RhdGVEaXJ9Ly4uLyR7YnVpbGRJZH0uYnVncyI+aHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvYnVnbGlzdC5jZ2k/cXVlcnlfZm9ybWF0PWFkdmFuY2VkJmFtcDtzaG9ydF9kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO3Nob3J0X2Rlc2M9JmFtcDtwcm9kdWN0PUVQRiZhbXA7bG9uZ19kZXNjX3R5cGU9YWxsd29yZHNzdWJzdHImYW1wO2xvbmdfZGVzYz0mYW1wO2J1Z19maWxlX2xvY190eXBlPWFsbHdvcmRzc3Vic3RyJmFtcDtidWdfZmlsZV9sb2M9JmFtcDtzdGF0dXNfd2hpdGVib2FyZF90eXBlPWFsbHdvcmRzc3Vic3RyJmFtcDtzdGF0dXNfd2hpdGVib2FyZD0mYW1wO2tleXdvcmRzX3R5cGU9YWxsd29yZHMmYW1wO2tleXdvcmRzPSZhbXA7ZW1haWx0eXBlMT1zdWJzdHJpbmcmYW1wO2VtYWlsMT0mYW1wO2VtYWlsdHlwZTI9c3Vic3RyaW5nJmFtcDtlbWFpbDI9JmFtcDtidWdpZHR5cGU9aW5jbHVkZSZhbXA7YnVnX2lkPSZhbXA7dm90ZXM9JmFtcDtjaGZpZWxkZnJvbT0ke3ByZXYuYnVpbGREYXRlfSZhbXA7Y2hmaWVsZHRvPSR7YnVpbGREYXRlfSZhbXA7Y2hmaWVsZD1yZXNvbHV0aW9uJmFtcDtjaGZpZWxkdmFsdWU9JmFtcDtjbWR0eXBlPWRvaXQmYW1wO29yZGVyPVJldXNlK3NhbWUrc29ydCthcytsYXN0K3RpbWUmYW1wO2ZpZWxkMC0wLTA9bm9vcCZhbXA7dHlwZTAtMC0wPW5vb3AmYW1wO3ZhbHVlMC0wLTA9Ci08L2VjaG8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tCi0JPHRhcmdldCBuYW1lPSJwdXNoMlNpdGUiPgotCQk8cHJvcGVydHkgbmFtZT0idXBTY3JpcHRBcmdzIiB2YWx1ZT0iLi4uIi8+Ci0JCTxleGVjIGRpcj0iJHtidWlsZGVyfSIgZXhlY3V0YWJsZT0iJHt1cFNjcmlwdH0iIG91dHB1dD0iZXBmX3B1c2gyc3ZyLm91dHB1dC50eHQiPgotCQkJPGFyZyBsaW5lPSIke3VwU2NyaXB0QXJnc30iLz4KLQkJPC9leGVjPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGVja291dERMUGciPgotCQk8Y3ZzIGN2c1Jvb3Q9IiR7dXBkYXRlU2l0ZVJlcG99IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9lcGZTaXRlIiBwYWNrYWdlPSIke3VwZGF0ZVNpdGVGaWxlfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJ1cGRhdGVETFBnIiBkZXBlbmRzPSJjaGVja291dERMUGciPgotCQk8cHJvcGVydHkgbmFtZT0iY29tbWl0TXNnIiB2YWx1ZT0iTmlnaHRseV9CdWlsZHMiLz4KLQkJPHByb3BlcnR5IG5hbWU9InVwZGF0ZVBhZ2VBcmdzIiB2YWx1ZT0iJHt0Z3RWZXJ9ICR7dGd0TWlsZXN0b25lfSAke2VwZi5idWlsZElkfSAke2J1aWxkRGlyZWN0b3J5fS9lcGZTaXRlLyR7dXBkYXRlU2l0ZUZpbGV9Ii8+Ci0JCTxleGVjIGRpcj0iJHtidWlsZGVyfSIgZXhlY3V0YWJsZT0iczovYmluL2VwZl9jaGFuZ2VwYWdlLmNtZCIgb3V0cHV0PSJlcGZfY2hhbmdlcGFnZS5vdXRwdXQudHh0Ij4KLQkJCTxhcmcgbGluZT0iJHt1cGRhdGVQYWdlQXJnc30iLz4KLQkJPC9leGVjPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjb21taXRETFBnIiBkZXBlbmRzPSJ1cGRhdGVETFBnIiB1bmxlc3M9Im5vRExQZyI+Ci0JCTxjdnMgY3ZzUm9vdD0iJHt1cGRhdGVTaXRlUmVwb30iIGRlc3Q9IiR7YnVpbGREaXJlY3Rvcnl9L2VwZlNpdGUvJHt1cGRhdGVTaXRlRmlsZX0iIGNvbW1hbmQ9ImNoZWNraW4gLW0gJHtjb21taXRNc2d9ICR7dXBkYXRlU2l0ZUZpbGV9Ii8+Ci0JPC90YXJnZXQ+Ci0JLS0+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBzZXR1cCAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVNldHVwIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbkJ1aWxkRGlyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIHNldHVwIGJ1dCBiZWZvcmUgc3RhcnRpbmcgdGhlIGJ1aWxkIHByb3BlciAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RTZXR1cCI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iZ2V0QmFzZUNvbXBvbmVudHMiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIGZldGNoaW5nIHRoZSBidWlsZCBlbGVtZW50cyAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZUZldGNoIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEZldGNoIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJ0YWdNYXBGaWxlcyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdlbmVyYXRlQWJvdXRNYXBwaW5ncyIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9InVwZGF0ZVJjcEluaUZpbGUiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGJ1aWxkIHNjcmlwdHMuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlR2VuZXJhdGUiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBnZW5lcmF0aW5nIHRoZSBidWlsZCBzY3JpcHRzLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RHZW5lcmF0ZSI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgdGhlIGJ1aWxkLnhtbHMgZm9yIHRoZSBlbGVtZW50cyBiZWluZyBidWlsdC4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVQcm9jZXNzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgcnVubmluZyB0aGUgYnVpbGQueG1scyBmb3IgdGhlIGVsZW1lbnRzIGJlaW5nIGJ1aWx0LiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RQcm9jZXNzIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHJ1bm5pbmcgYXNzZW1ibGUuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlQXNzZW1ibGUiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0QXNzZW1ibGUiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBwYWNrYWdlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVBhY2thZ2UiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciAgcnVubmluZyBwYWNrYWdlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RQYWNrYWdlIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIGJ1aWxkIGlzIGRvbmUuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEJ1aWxkIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnYXRoZXJMb2dzIi8+Ci0JCTxhbnRjYWxsIHRhcmdldD0idXBkYXRlQnVpbGRTdGF0ZSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyB0byB0ZXN0IHRoZSBidWlsZCByZXN1bHRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0idGVzdCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIHRvIHB1Ymxpc2ggdGhlIGJ1aWxkIHJlc3VsdHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwdWJsaXNoIj4KLQkJPCEtLQotCQk8YW50Y2FsbCB0YXJnZXQ9InB1c2gyU2l0ZSIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImNvbW1pdERMUGciLz4KLQkJLS0+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IllvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2hlbiBpbnZva2luZyB0aGlzIGZpbGUiLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3JlYWRtZS50eHQgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjZTE5Ny4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXJ1bi5iYXQJCQliYXRjaCBmaWxlIHRvIHJ1biBoZWFkbGVzcyBidWlsZAotYnVpbGQucHJvcGVydGllcwljb250YWlucyBidWlsZCBvcHRpb25zCi1hbGxFbGVtZW50cy54bWwJCWJ1aWxkIHNjcmlwdAotY3VzdG9tVGFyZ2V0cy54bWwJYnVpbGQgc2NyaXB0Ci1yZWFkbWUudHh0CQl0aGlzIGZpbGUKLWJ1aWxkLwkJCWRpcmVjdG9yeSBjb250YWluaW5nIHNvdXJjZSBwdWxsZWQgZnJvbSBDVlMgYW5kIGJ1aWxkIG91dHB1dCAtIHRvIGJlIGNsZWFuZWQgdXAgYWZ0ZXIgZXZlcnkgYnVpbGQKLXRlbXBsYXRlcy8JCWRpcmVjdG9yeSBjb250YWluaW5nIHRlbXBsYXRlIGZpbGVzIGZyb20gZWNsaXBzZQotd29ya3NwYWNlLwkJd29ya3NwYWNlIGNyZWF0ZWQgYnkgRWNsaXBzZSBJREUgYXMgbWVudGlvbmVkIGluIDEuNgotCi0KLU1vcmUgRGV0YWlsZWQgSW5zdHJ1Y3Rpb25zCi0KLTEuIFNldCB1cCBIZWFkbGVzcyBCdWlsZCBFbnZpcm9ubWVudAotCi0gIDEuMSBJbnN0YWxsIEpTREsgaXMgb24gdGhlIHN5c3RlbSBhbmQgbWFrZSBzdXJlIGphdmEuZXhlIGlzIGF2YWlsYWJsZSBvbiBzeXN0ZW0gUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gW0pBVkFFWEVdCi0gIDEuMiBJbnN0YWxsIEFwYWNoZSBBTlQgb24gdGhlIHN5c3RlbSBhbmQgbWFrZSBzdXJlIHRoZSBBbnQgYmluYXJpZXMgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgMS4zIEluc3RhbGwgSUVTIG9yIE9wZW4tU291cmNlIEVjbGlwc2UgU0RQIGlzIG9uIHRoZSBzeXN0ZW0gYW5kIG5vdGUgdGhlIGluc3RhbGwgbG9jYXRpb24gb2YgRWNsaXBzZSBbRUNMSVBTRUhPTUVdCi0gIDEuNCBPYnRhaW4gdGhlIHBsdWdpbnMgb3JnLmVjbGlwc2UucGRlLmJ1aWxkIGFuZCBoYXZlIHRoaXMgcGx1Z2luIGluIHRoZSBFY2xpcHNlIFNEUCBbU0NSSVBUU0hPTUVdCi0gIDEuNSBPYnRhaW4gdGhlIEhFQURMRVNTIGJ1aWxkIHNjcmlwdHMgYW5kIHB1dCB0aGVtIGl0IGEgZGlyZWN0b3J5IGJ5IHRoZW1zZWx2ZXMgW0JVSUxESE9NRV0KLSAgMS42IFN0YXJ0IEVjbGlwc2UgU0RQIGFuZCBkZWZpbmUgYSB3b3Jrc3BhY2UgbG9jYXRpb24gW1dPUktTUEFDRV0uICBBbGxvdyB0aGUgSURFIHRvIHN0YXJ0IGZ1bGx5IGFuZCB0aGVuIGV4aXQuICBPbmx5IHRoZSB3b3Jrc3BhY2UgaXMgbmVlZGVkLgotCi0KLTIuIEN1c3RvbWl6ZSB0aGUgSGVhZGxlc3MgQnVpbGQgU2NyaXB0cwotCi0gIDIuMSBNb2RpZnkgcnVuLmJhdCBmaWxlIHRvIHN1aXQgeW91ciBlbnZpcm9ubWVudC4KLSAgMi4yIE1vZGlmeSBidWlsZC5wcm9wZXJ0aWVzIG1ha2luZyBzdXJlIHRoYXQgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBhZGRyZXNzZWQuCi0gICAgICAgIHByb2R1Y3Q9Ci0gICAgICAgIGJ1aWxkRGlyZWN0b3J5PQotICAgICAgICBiYXNlPQotICAgICAgICBiYXNlTG9jYXRpb249Ci0gICAgICAgIG1hcHNSZXBvPQotICAgICAgICBtYXBzUm9vdD0KLSAgICAgICAgZmV0Y2hUYWc9Ci0gIDIuMyBNb2RpZnkgYWxsRWxlbWVudHMueG1sCi0JUHJvdmlkZSB0aGUgY29ycmVjdCB0b3AgbGV2ZWwgZmVhdHVyZSBiZWluZyBidWlsdC4KLQlQcm92aWRlIHRoZSBjb3JyZWN0IGVsZW1lbnRQYXRoIHByb3BlcnR5IGluIHRoZSBhbGxFbGVtZW50c0RlbGVnYXRvciB0YXJnZXQuCi0KLSAgMi40IE1ha2Ugc3VyZSB0aGUgbWFwIGZpbGVzIGluIG9yZy5lY2xpcHNlLmVwZi5yZWxlbmcvbWFwcyBhcmUgYWNjdXJhdGUKLQotCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvcnVuLmJhdCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9ydW4uYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTUxM2YyLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy9ydW4uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotQGVjaG8gb2ZmCi1zZXRsb2NhbAotCi1SRU0gVGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBoZWFkbGVzcyBidWlsZCBzY3JpcHRzICYgcmVzb3VyY2UgZmlsZXMgbGl2ZS4KLXNldCBCVUlMREhPTUU9JX5kcDAKLQotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNICogICAgICAgICAgQ0hBTkdFIFRIRVNFIFNFVFRJTkdTICAgICAgICAgKgotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1SRU0gVGhlIEpSRSBqYXZhLmV4ZSB0byBiZSB1c2VkCi1zZXQgSkFWQUVYRT1DOlxiaW5camRrXHN1blxiaW5camF2YS5leGUKLQotUkVNIHRoZSBFY2xpcHNlIHRvIHVzZQotc2V0IEVDTElQU0VIT01FPUM6XGJpblxzZHBcMy4yLjJcZWNsaXBzZQotCi1SRU0gQ1ZTIGxvZ2luIGluZm8gLSBwcm92aWRlIENWUyB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCi1SRU0gOmV4dHNzaDo8dXNlcm5hbWU+OjxwYXNzd29yZD4KLVJFTSBwdXQgIiIgYXJvdW5kIHRoZSB2YWx1ZSBpZiBpdCBjb250YWlucyBub24tYWxwaGFudW1lcmljIGNoYXJzCi1zZXQgQ1ZTSU5GTz06cHNlcnZlcjphbm9ueW1vdXMKLQotUkVNIFRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0YWcuY3VycmVudC5wcm9wZXJ0aWVzCi1TRVQgQlVJTERTVEFURURJUj1TOlxwcm9qZWN0c1xlcGZcMS4yLjBcc3RhdGUKLQotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotUkVNICogICAgIERPIE5PVCBDSEFOR0UgVEhFU0UgU0VUVElOR1MgICAgICAgKgotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1SRU0gVGhlIEVjbGlwc2Ugc3RhcnR1cC5qYXIKLXNldCBTVEFSVFVQSkFSPSIlRUNMSVBTRUhPTUUlXHN0YXJ0dXAuamFyIgotCi1SRU0gVGhlIHNjcmlwdHMgZGlyZWN0b3J5IGluIHRoZSBvcmcuZWNsaXBzZS5wZGUuYnVpbGQgRWNsaXBzZSBwbHVnaW4uCi1zZXQgU0NSSVBUU0hPTUU9IiVFQ0xJUFNFSE9NRSVccGx1Z2luc1xvcmcuZWNsaXBzZS5wZGUuYnVpbGRfMy4yLjEucjMyMV92MjAwNjA4MjNcc2NyaXB0cyIKLQotUkVNIFRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgaGVhZGxlc3MgYnVpbGQgc2NyaXB0cyAmIHJlc291cmNlIGZpbGVzIGxpdmUuCi1SRU0gc2V0IEJVSUxESE9NRT1DOlxidWlsZHNcZXBmXzExMFxoZWFkbGVzcwotc2V0IEJVSUxESE9NRT0lfmRwMAotCi1SRU0gVGhlIGxvY2F0aW9uIG9mIHRoZSB0ZW1wb3JhcnkgYnVpbGQgd29ya3NwYWNlCi1zZXQgV09SS1NQQUNFPSVCVUlMREhPTUUlXHdvcmtzcGFjZQotCi1SRU0gVGhlIGJ1aWxkZmlsZSB0byB1c2UgZm9yIHRoZSBidWlsZAotc2V0IEJVSUxERklMRT1idWlsZC54bWwKLQotUkVNIFRoZSBidWlsZGVyIGRpcmVjdG9yeSBjb250YWluaW5nIGJ1aWxkLnByb3BlcnRpZXMKLVJFTSBidWlsZC5wcm9wZXJ0aWVzLCBhbGxFbGVtZW50cy54bWwgYW5kIGN1c3RvbVRhcmdldHMueG1sIG5lZWRzIHRvIGJlIGluIHRoZSBzYW1lIHBsYWNlCi1zZXQgQlVJTERFUkRJUj0lQlVJTERIT01FJQotCi1zZXQgSE9VUj0ldGltZTp+MCwyJQotaWYgIiVIT1VSOn4wLDElIj09IiAiIHNldCBIT1VSPTAldGltZTp+MSwxJQotc2V0IEJVSUxESUQ9JWRhdGU6fi00JSVkYXRlOn40LDIlJWRhdGU6fjcsMiUtJUhPVVIlJXRpbWU6fjMsMiUKLQotUkVNICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi1pZiBub3QgZXhpc3QgJUpBVkFFWEUlIGVjaG8gRVJST1I6IGluY29ycmVjdCBqYXZhLmV4ZT0lSkFWQUVYRSUsIGVkaXQgdGhpcyBmaWxlIGFuZCBjb3JyZWN0IHRoZSBKQVZBRVhFIGVudmFyCi1pZiBub3QgZXhpc3QgJUpBVkFFWEUlIGdvdG8gZG9uZQotCi1pZiBub3QgZXhpc3QgJVNUQVJUVVBKQVIlIGVjaG8gRVJST1I6IGluY29ycmVjdCBzdGFydHVwLmphcj0lU1RBUlRVUEpBUiUsIGVkaXQgdGhpcyBmaWxlIGFuZCBjb3JyZWN0IHRoZSBTVEFSVFVQSkFSIGVudmFyCi1pZiBub3QgZXhpc3QgJVNUQVJUVVBKQVIlIGdvdG8gZG9uZQotCi1pZiBub3QgZXhpc3QgJUJVSUxERVJESVIlIGVjaG8gRVJST1I6IGluY29ycmVjdCBidWlsZGVyZGlyPSVCVUlMREVSRElSJSwgZWRpdCB0aGlzIGZpbGUgYW5kIGNvcnJlY3QgdGhlIEJVSUxERVJESVIgZW52YXIKLWlmIG5vdCBleGlzdCAlQlVJTERFUkRJUiUgZ290byBkb25lCi0KLWlmIG5vdCBleGlzdCAlQlVJTERTVEFURURJUiUgZWNobyBFUlJPUjogaW5jb3JyZWN0IGJ1aWxkU3RhdGVEaXI9JUJVSUxEU1RBVEVESVIlLCBlZGl0IHRoaXMgZmlsZSBhbmQgY29ycmVjdCB0aGUgQlVJTERTVEFURURJUiBlbnZhcgotaWYgbm90IGV4aXN0ICVCVUlMRFNUQVRFRElSJSBnb3RvIGRvbmUKLQotCi06cnVuCi0KLXB1c2hkICVTQ1JJUFRTSE9NRSUKLQotaWYgbm90IGV4aXN0ICVCVUlMREZJTEUlIGVjaG8gRVJST1I6IGluY29ycmVjdCBidWlsZGZpbGU9JUJVSUxERklMRSUsIGVkaXQgdGhpcyBmaWxlIGFuZCBjb3JyZWN0IHRoZSBCVUlMREZJTEUgZW52YXIKLWlmIG5vdCBleGlzdCAlQlVJTERGSUxFJSBnb3RvIGRvbmUKLQotQGVjaG8gb24KLQotcmQgL3MgL3EgJVdPUktTUEFDRSUKLQotJUpBVkFFWEUlIC1jcCAlU1RBUlRVUEpBUiUgb3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluIC1ub3VwZGF0ZSAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuYW50LmNvcmUuYW50UnVubmVyIC1kYXRhICVXT1JLU1BBQ0UlIC1idWlsZGZpbGUgJUJVSUxERklMRSUgLURidWlsZGVyPSVCVUlMREVSRElSJSAtRGJ1aWxkSWQ9JUJVSUxESUQlIC1EYnVpbGRTdGF0ZURpcj0lQlVJTERTVEFURURJUiUgLURjdnNJbmZvPSVDVlNJTkZPJSAtRGJhc2VMb2NhdGlvbj0lRUNMSVBTRUhPTUUlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5Ci0KLUBlY2hvIG9mZgotcG9wZAotCi06ZG9uZQotUkVNIHBhdXNlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2FsbEVsZW1lbnRzLnhtbCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvYWxsRWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVlYzg0Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvYWxsRWxlbWVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYWxsRWxlbWVudHMgRGVsZWdhdG9yIj4KLQkKLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTwhLS0gUnVuIGEgZ2l2ZW4gJHt0YXJnZXR9IG9uIGFsbCBlbGVtZW50cyBiZWluZyBidWlsdCAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIFJlcGxhY2UgZWxlbWVudC5pZCB3aXRoIHRoZSBpZCBvZiB0aGUgdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuICAgIC0tPgotCTwhLS0gSWYgZWxlbWVudC5pZCBkb2VzIG5vdCBleGlzdCBpbiAke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcy9lbGVtZW50LmlkICAgLS0+Ci0JPCEtLSBvciAke2Jhc2VMb2NhdGlvbn0vZmVhdHVyZXMvZWxlbWVudC5pZCwgdGhlbiB5b3UgbXVzdCBwcm92aWRlIHRoZSAgICAgICAtLT4KLQk8IS0tIGxvY2F0aW9uIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5ICJwbHVnaW5QYXRoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotIAk8IS0tIEFkZCBvbiA8YW50PiB0YXNrIGZvciBlYWNoIHRvcCBsZXZlbCBlbGVtZW50IGJlaW5nIGJ1aWx0LiAgICAgICAgICAgICAtLT4KLSAJPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0gCTx0YXJnZXQgbmFtZT0iYWxsRWxlbWVudHNEZWxlZ2F0b3IiPgotIAkJPGFudCBhbnRmaWxlPSIke2dlbmVyaWNUYXJnZXRzfSIgdGFyZ2V0PSIke3RhcmdldH0iPgotCSAJCTxwcm9wZXJ0eSBuYW1lPSJ0eXBlIiB2YWx1ZT0iZmVhdHVyZSIgLz4KLQkgCQk8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJlbGVtZW50LmlkIiAvPgotIAkJPC9hbnQ+Ci0gCTwvdGFyZ2V0PgotIAotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPCEtLSBUYXJnZXRzIHRvIGFzc2VtYmxlIHRoZSBidWlsdCBlbGVtZW50cyBmb3IgcGFydGljdWxhciBjb25maWd1cmF0aW9ucyAgLS0+Ci0gCTwhLS0gVGhlc2UgZ2VuZXJhbGx5IGNhbGwgdGhlIGdlbmVyYXRlZCBhc3NlbWJsZSBzY3JpcHRzIChuYW1lZCBpbiAgICAgICAgIC0tPgotIAk8IS0tICR7YXNzZW1ibGVTY3JpcHROYW1lfSkgYnV0IG1heSBhbHNvIGFkZCBwcmUgYW5kIHBvc3QgcHJvY2Vzc2luZyAgICAgICAtLT4KLSAJPCEtLSBBZGQgb25lIHRhcmdldCBmb3IgZWFjaCByb290IGVsZW1lbnQgYW5kIGVhY2ggY29uZmlndXJhdGlvbiAgICAgICAgICAgLS0+Ci0gCTwhLS0gUmVwbGFjZSBlbGVtZW50LmlkIHdpdGggdGhlIGlkIG9mIHRoZSB0b3AgbGV2ZWwgZWxlbWVudCBiZWluZyBidWlsdCAgIC0tPgotIAk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAJPHRhcmdldCBuYW1lPSJhc3NlbWJsZS5lbGVtZW50LmlkWy5jb25maWcuc3BlY10iPgotIAkJPGFudCBhbnRmaWxlPSIke2Fzc2VtYmxlU2NyaXB0TmFtZX0iIGRpcj0iJHtidWlsZERpcmVjdG9yeX0iLz4KLSAJPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvcmVsZW5nL2J1aWxkLXNjcmlwdHMvdGVtcGxhdGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTk1ODUuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUGFyYW1ldGVycyBkZXNjcmliaW5nIGhvdyBhbmQgd2hlcmUgdG8gZXhlY3V0ZSB0aGUgYnVpbGQuCi0jIFR5cGljYWwgdXNlcnMgbmVlZCBvbmx5IHVwZGF0ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6Ci0jICAgIGJhc2VMb2NhdGlvbiAtIHdoZXJlIHRoaW5ncyB5b3UgYXJlIGJ1aWxkaW5nIGFnYWluc3QgYXJlIGluc3RhbGxlZAotIyAgICBib290Y2xhc3NwYXRoIC0gVGhlIGJhc2UgamFycyB0byBjb21waWxlIGFnYWluc3QgKHR5cGljYWx5IHJ0LmphcikKLSMgICAgY29uZmlncyAtIHRoZSBsaXN0IG9mIHtvcywgd3MsIGFyY2h9IGNvbmZpZ3VyYXRpb25zIHRvIGJ1aWxkLiAgCi0jCi0jIE9mIGNvdXJzZSBhbnkgb2YgdGhlIHNldHRpbmdzIGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3BlYydpbmcgCi0jIHRoZW0gb24gdGhlIGNvbW1hbmQgbGluZSAoZS5nLiwgLURiYXNlTG9jYXRpb249ZDovZWNsaXBzZQotCi0jIyMjIyMjIyMjIyMjIFBST0RVQ1QvUEFDS0FHSU5HIENPTlRST0wgIyMjIyMjIyMjIyMjIwotcHJvZHVjdD0vcGx1Z2luIG9yIGZlYXR1cmUgaWQvcGF0aC90by8ucHJvZHVjdAotcnVuUGFja2FnZXI9dHJ1ZQotCi0jU2V0IHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIHRoYXQgd2lsbCByZXN1bHQgZnJvbSB0aGUgcHJvZHVjdCBidWlsZC4KLSNhcmNoaXZlTmFtZVByZWZpeD0KLQotIyBUaGUgcHJlZml4IHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgYXJjaGl2ZS4KLWFyY2hpdmVQcmVmaXg9PG91dHB1dCBhcmNoaXZlIHJvb3Q+Ci0KLSMgVGhlIGxvY2F0aW9uIHVuZGVyd2hpY2ggYWxsIG9mIHRoZSBidWlsZCBvdXRwdXQgd2lsbCBiZSBjb2xsZWN0ZWQuCi1jb2xsZWN0aW5nRm9sZGVyPSR7YXJjaGl2ZVByZWZpeH0KLQotIyBUaGUgbGlzdCBvZiB7b3MsIHdzLCBhcmNofSBjb25maWd1cmF0aW9ucyB0byBidWlsZC4gIFRoaXMgCi0jIHZhbHVlIGlzIGEgJyYnIHNlcGFyYXRlZCBsaXN0IG9mICcsJyBzZXBhcmF0ZSB0cmlwbGVzLiAgRm9yIGV4YW1wbGUsIAotIyAgICAgY29uZmlncz13aW4zMix3aW4zMix4ODYgJiBsaW51eCxtb3RpZix4ODYKLSMgQnkgZGVmYXVsdCB0aGUgdmFsdWUgaXMgKiwqLCoKLSNjb25maWdzPXdpbjMyLCB3aW4zMiwgeDg2ICYgXAotIwlsaW51eCwgZ3RrLCBwcGMgJlwKLSMgbGludXgsIGd0aywgeDg2ICYgXAotIwlsaW51eCwgZ3RrLCB4ODZfNjQgJiBcCi0jCWxpbnV4LCBtb3RpZiwgeDg2ICYgXAotIwlzb2xhcmlzLCBtb3RpZiwgc3BhcmMgJiBcCi0jCXNvbGFyaXMsIGd0aywgc3BhcmMgJiBcCi0jCWFpeCwgbW90aWYsIHBwYyAmIFwKLSMJaHB1eCwgbW90aWYsIFBBX1JJU0MgJiBcCi0jCW1hY29zeCwgY2FyYm9uLCBwcGMKLQotIyBCeSBkZWZhdWx0IFBERSBjcmVhdGVzIG9uZSBhcmNoaXZlIChyZXN1bHQpIHBlciBlbnRyeSBsaXN0ZWQgaW4gdGhlIGNvbmZpZ3MgcHJvcGVydHkuCi0jIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnkgd2lsbCBjYXVzZSBQREUgdG8gb25seSBjcmVhdGUgb25lIG91dHB1dCBjb250YWluaW5nIGFsbCAKLSMgYXJ0aWZhY3RzIGZvciBhbGwgdGhlIHBsYXRmb3JtcyBsaXN0ZWQgaW4gdGhlIGNvbmZpZ3MgcHJvcGVydHkuCi0jZ3JvdXBDb25maWd1cmF0aW9ucz10cnVlCi0KLSNUaGUgZm9ybWF0IG9mIHRoZSBhcmNoaXZlLiBCeSBkZWZhdWx0IGEgemlwIGlzIGNyZWF0ZWQgdXNpbmcgYW50WmlwLgotI1RoZSBsaXN0IGNhbiBvbmx5IGNvbnRhaW4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIHdoaWNoIHRoZSBkZXNpcmVkIGZvcm1hdCBpcyBkaWZmZXJlbnQgdGhhbiB6aXAuCi0jYXJjaGl2ZXNGb3JtYXQ9d2luMzIsIHdpbjMyLCB4ODYgLSBhbnRaaXAmIFwKLSMJbGludXgsIGd0aywgcHBjIC0gYW50WmlwICZcCi0jICAgIGxpbnV4LCBndGssIHg4NiAtIGFudFppcCYgXAotIwlsaW51eCwgZ3RrLCB4ODZfNjQgLSBhbnRaaXAmIFwKLSMgbGludXgsIG1vdGlmLCB4ODYgLSBhbnRaaXAmIFwKLSMJc29sYXJpcywgbW90aWYsIHNwYXJjIC0gYW50WmlwJiBcCi0jCXNvbGFyaXMsIGd0aywgc3BhcmMgLSBhbnRaaXAmIFwKLSMJYWl4LCBtb3RpZiwgcHBjIC0gYW50WmlwJiBcCi0jCWhwdXgsIG1vdGlmLCBQQV9SSVNDIC0gYW50WmlwJiBcCi0jCW1hY29zeCwgY2FyYm9uLCBwcGMgLSBhbnRaaXAKLQkKLSNTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgb3V0cHV0IHRvIGJlIHJlYWR5IGZvciBhbiB1cGRhdGUgamFyIChubyBzaXRlLnhtbCBnZW5lcmF0ZWQpCi0jb3V0cHV0VXBkYXRlSmFycyA9IGZhbHNlCi0KLSNTZXQgdG8gdHJ1ZSBmb3IgSm5scCBnZW5lcmF0aW9uCi0jY29kZWJhc2Ugc2hvdWxkIGJlIGEgVVJMIHRoYXQgd2lsbCBiZSB1c2VkIGFzIHRoZSByb290IG9mIGFsbCByZWxhdGl2ZSBVUkxzIGluIHRoZSBvdXRwdXQuCi0jZ2VuZXJhdGVKbmxwPWZhbHNlCi0jam5scC5jb2RlYmFzZT08Y29kZWJhc2UgdXJsPgotI2pubHAuajJzZT08ajJzZSB2ZXJzaW9uPgotI2pubHAubG9jYWxlPTxhIGxvY2FsZT4KLQotI1NldCB0byB0cnVlIGlmIHlvdSB3YW50IHRvIHNpZ24gamFycwotI3NpZ25KYXJzPWZhbHNlCi0jc2lnbi5hbGlhcz08YWxpYXM+Ci0jc2lnbi5rZXlzdG9yZT08a2V5c3RvcmUgbG9jYXRpb24+Ci0jc2lnbi5zdG9yZXBhc3M9PGtleXN0b3JlIHBhc3N3b3JkPgotCi0jQXJndW1lbnRzIHRvIHNlbmQgdG8gdGhlIHppcCBleGVjdXRhYmxlCi16aXBhcmdzPQotCi0jQXJndW1lbnRzIHRvIHNlbmQgdG8gdGhlIHRhciBleGVjdXRhYmxlCi10YXJhcmdzPQotCi0jQ29udHJvbCB0aGUgY3JlYXRpb24gb2YgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHZlcnNpb24gaW5jbHVkZWQgaW4gZWFjaCBjb25maWd1cmF0aW9uIC0gb24gYnkgZGVmYXVsdCAKLSNnZW5lcmF0ZVZlcnNpb25zTGlzdHM9ZmFsc2UKLQotIyMjIyMjIyMjIyMjIyMgQlVJTEQgTkFNSU5HIENPTlRST0wgIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGJ1aWxkIGVsZW1lbnRzIGFyZSBmZXRjaGVkIGFuZCB3aGVyZQotIyB0aGUgYnVpbGQgdGFrZXMgcGxhY2UuCi1idWlsZERpcmVjdG9yeT0ke3VzZXIuaG9tZX0vZWNsaXBzZS5idWlsZAotCi0jIFR5cGUgb2YgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LiAgVHlwaWNhbGx5IHRoaXMgdmFsdWUgaXMKLSMgb25lIG9mIEksIE4sIE0sIFMsIC4uLgotYnVpbGRUeXBlPUkKLQotIyBJRCBvZiB0aGUgYnVpbGQuICBVc2VkIGluIG5hbWluZyB0aGUgYnVpbGQgb3V0cHV0LgotYnVpbGRJZD1UZXN0QnVpbGQKLQotIyBMYWJlbCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotYnVpbGRMYWJlbD0ke2J1aWxkVHlwZX0uJHtidWlsZElkfQotCi0jIFRpbWVzdGFtcCBmb3IgdGhlIGJ1aWxkLiAgVXNlZCBpbiBuYW1pbmcgdGhlIGJ1aWxkIG91dHB1dAotdGltZXN0YW1wPTAwNwotCi0jVGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBxdWFsaWZpZXIgb2YgYSBwbHVnaW4gb3IgZmVhdHVyZSB3aGVuIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSB2YWx1ZSBjb21wdXRlZCBieSBwZGUuCi0jVGhlIHZhbHVlIHdpbGwgb25seSBiZSBhcHBsaWVkIHRvIHBsdWdpbiBvciBmZWF0dXJlcyBpbmRpY2F0aW5nIGJ1aWxkLnByb3BlcnRpZXMsIHF1YWxpZmllciA9IGNvbnRleHQgCi0jZm9yY2VDb250ZXh0UXVhbGlmaWVyPTx0aGUgdmFsdWUgZm9yIHRoZSBxdWFsaWZpZXI+Ci0KLSNFbmFibGUgLyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIGEgc3VmZml4IGZvciB0aGUgZmVhdHVyZXMgdGhhdCB1c2UgLnF1YWxpZmllci4gCi0jVGhlIGdlbmVyYXRlZCBzdWZmaXggaXMgY29tcHV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmZWF0dXJlICAgCi0jZ2VuZXJhdGVGZWF0dXJlVmVyc2lvblN1ZmZpeD10cnVlCi0KLSMjIyMjIyMjIyMjIyMgQkFTRSBDT05UUk9MICMjIyMjIyMjIyMjIyMKLSMgU2V0dGluZ3MgZm9yIHRoZSBiYXNlIEVjbGlwc2UgY29tcG9uZW50cyBhbmQgSmF2YSBjbGFzcyBsaWJyYXJpZXMgCi0jIGFnYWluc3Qgd2hpY2ggeW91IGFyZSBidWlsZGluZy4KLSMgQmFzZSBsb2NhdGlvbiBmb3IgYW55dGhpbmcgdGhlIGJ1aWxkIG5lZWRzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIEZvciBleGFtcGxlLAotIyBpbiBtb3N0IFJDUCBhcHAgb3IgYSBwbHVnLWluLCAgdGhlIGJhc2VMb2NhdGlvbiBzaG91bGQgYmUgdGhlIGxvY2F0aW9uIG9mIGEgcHJldmlvdXNseQotIyBpbnN0YWxsZWQgRWNsaXBzZSBhZ2FpbnN0IHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBvciBwbHVnLWluIGNvZGUgd2lsbCBiZSBjb21waWxlZCBhbmQgdGhlIFJDUCBkZWx0YSBwYWNrLgotCi1iYXNlPTxwYXRoL3RvL3BhcmVudC9vZi9lY2xpcHNlPgotYmFzZUxvY2F0aW9uPSR7YmFzZX0vZWNsaXBzZQotI09zL1dzL0FyY2gvbmwgb2YgdGhlIGVjbGlwc2Ugc3BlY2lmaWVkIGJ5IGJhc2VMb2NhdGlvbgotYmFzZW9zPXdpbjMyCi1iYXNld3M9d2luMzIKLWJhc2VhcmNoPXg4NgotCi0jcGx1Z2luUGF0aCBpcyBhIGxpc3Qgb2YgbG9jYXRpb25zIGluIHdoaWNoIHRvIGZpbmQgcGx1Z2lucyBhbmQgZmVhdHVyZXMuICBUaGlzIGxpc3QgaXMgc2VwYXJhdGVkIGJ5IHRoZSBwbGF0Zm9ybSBmaWxlIHNlcGFyYXRvciAoOyBvciA6KQotI2EgbG9jYXRpb24gaXMgb25lIG9mOiAgCi0jLSB0aGUgbG9jYXRpb24gb2YgdGhlIGphciBvciBmb2xkZXIgdGhhdCBpcyB0aGUgcGx1Z2luIG9yIGZlYXR1cmUgOiAvcGF0aC90by9mb28uamFyIG9yIC9wYXRoL3RvL2ZvbwotIy0gYSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIC9wbHVnaW5zIG9yIC9mZWF0dXJlcyBzdWJkaXJlY3RvcnkKLSMtIHRoZSBsb2NhdGlvbiBvZiBhIGZlYXR1cmUueG1sLCBvciBmb3IgMi4xIHN0eWxlIHBsdWdpbnMsIHRoZSBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbAotI3BsdWdpblBhdGg9Ci0KLXNraXBCYXNlPXRydWUKLWVjbGlwc2VVUkw9PHVybCBmb3IgZWNsaXBzZSBkb3dubG9hZCBzaXRlPgotZWNsaXBzZUJ1aWxkSWQ9PElkIG9mIEVjbGlwc2UgYnVpbGQgdG8gZ2V0PgotZWNsaXBzZUJhc2VVUkw9JHtlY2xpcHNlVVJMfS9lY2xpcHNlLXBsYXRmb3JtLSR7ZWNsaXBzZUJ1aWxkSWR9LXdpbjMyLnppcAotCi0KLSMjIyMjIyMjIyMjIyMgTUFQIEZJTEUgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMjCi0jIFRoaXMgc2VjdGlvbiBkZWZpbmVzIENWUyB0YWdzIHRvIHVzZSB3aGVuIGZldGNoaW5nIHRoZSBtYXAgZmlsZXMgZnJvbSB0aGUgcmVwb3NpdG9yeS4KLSMgSWYgeW91IHdhbnQgdG8gZmV0Y2ggdGhlIG1hcCBmaWxlIGZyb20gcmVwb3NpdG9yeSAvIGxvY2F0aW9uLCBjaGFuZ2UgdGhlIGdldE1hcEZpbGVzIHRhcmdldCBpbiB0aGUgY3VzdG9tVGFyZ2V0cy54bWwKLQotc2tpcE1hcHM9dHJ1ZQotbWFwc1JlcG89OnBzZXJ2ZXI6YW5vbnltb3VzQGV4YW1wbGUuY29tL3BhdGgvdG8vcmVwbwotbWFwc1Jvb3Q9cGF0aC90by9tYXBzCi1tYXBzQ2hlY2tvdXRUYWc9SEVBRAotCi0jdGFnTWFwcz10cnVlCi1tYXBzVGFnVGFnPXYke2J1aWxkSWR9Ci0KLQotIyMjIyMjIyMjIyMjIFJFUE9TSVRPUlkgQ09OVFJPTCAjIyMjIyMjIyMjIyMjIyMKLSMgVGhpcyBzZWN0aW9uIGRlZmluZXMgcHJvcGVydGllcyBwYXJhbWV0ZXJpemluZyB0aGUgcmVwb3NpdG9yaWVzIHdoZXJlIHBsdWdpbnMsIGZyYWdtZW50cwotIyBidW5kbGVzIGFuZCBmZWF0dXJlcyBhcmUgYmVpbmcgb2J0YWluZWQgZnJvbS4gCi0KLSMgVGhlIHRhZ3MgdG8gdXNlIHdoZW4gZmV0Y2hpbmcgZWxlbWVudHMgdG8gYnVpbGQuCi0jIEJ5IGRlZmF1bHQgdGhlYnVpbGRlciB3aWxsIHVzZSB3aGF0ZXZlciBpcyBpbiB0aGUgbWFwcy4gIAotIyBUaGlzIHZhbHVlIHRha2VzIHRoZSBmb3JtIG9mIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcmVwb3NpdG9yeSBpZGVudGlmaWVyIChsaWtlIHVzZWQgaW4gdGhlIG1hcCBmaWxlcykgYW5kIHRoZSAKLSMgb3ZlcnJpZGluZyB2YWx1ZQotIyBGb3IgZXhhbXBsZSBmZXRjaFRhZz1DVlM9SEVBRCwgU1ZOPXYyMDA1MDEwMQotIyBmZXRjaFRhZz1IRUFECi1za2lwRmV0Y2g9dHJ1ZQotCi0KLSMjIyMjIyMjIyMjIyMgSkFWQSBDT01QSUxFUiBPUFRJT05TICMjIyMjIyMjIyMjIyMjCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgSmF2YSBqYXJzIHRvIGNvbXBpbGUgYWdhaW5zdC4gIFR5cGljYWxseSB0aGUgcnQuamFyIGZvciB5b3VyIEpESy9KUkUKLSNib290Y2xhc3NwYXRoPSR7amF2YS5ob21lfS9saWIvcnQuamFyCi0KLSMgc3BlY2lmaWMgSlJFIGxvY2F0aW9ucyB0byBjb21waWxlIGFnYWluc3QuIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBjb21waWxlIGJ1bmRsZXMgc3BlY2lmeWluZyBhIAotIyBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudC4gVW5jb21tZW50IGFuZCBzZXQgdmFsdWVzIGZvciBlbnZpcm9ubWVudHMgdGhhdCB5b3Ugc3VwcG9ydAotI0NEQy0xLjAvRm91bmRhdGlvbi0xLjA9IC9wYXRoL3RvL3J0LmphcgotI0NEQy0xLjEvRm91bmRhdGlvbi0xLjE9Ci0jT1NHaS9NaW5pbXVtLTEuMD0KLSNPU0dpL01pbmltdW0tMS4xPQotI0pSRS0xLjE9Ci0jSjJTRS0xLjI9Ci0jSjJTRS0xLjM9Ci0jSjJTRS0xLjQ9Ci0jSjJTRS0xLjU9Ci0jSmF2YVNFLTEuNj0KLSNQZXJzb25hbEphdmEtMS4xPQotI1BlcnNvbmFsSmF2YS0xLjI9Ci0jQ0RDLTEuMC9QZXJzb25hbEJhc2lzLTEuMD0KLSNDREMtMS4wL1BlcnNvbmFsSmF2YS0xLjA9Ci0jQ0RDLTEuMS9QZXJzb25hbEJhc2lzLTEuMT0KLSNDREMtMS4xL1BlcnNvbmFsSmF2YS0xLjE9Ci0KLSMgU3BlY2lmeSB0aGUgb3V0cHV0IGZvcm1hdCBvZiB0aGUgY29tcGlsZXIgbG9nIHdoZW4gZWNsaXBzZSBqZHQgaXMgdXNlZAotbG9nRXh0ZW5zaW9uPS5sb2cKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGRlYnVnIGluZm8gaW4gdGhlIG91dHB1dCBqYXJzCi1qYXZhY0RlYnVnSW5mbz1mYWxzZSAKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBmYWlsIHRoZSBidWlsZCBpZiB0aGVyZSBhcmUgY29tcGlsZXIgZXJyb3JzCi1qYXZhY0ZhaWxPbkVycm9yPXRydWUKLQotIyBFbmFibGUgb3IgZGlzYWJsZSB2ZXJib3NlIG1vZGUgb2YgdGhlIGNvbXBpbGVyCi1qYXZhY1ZlcmJvc2U9dHJ1ZQotCi0jIEV4dHJhIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyLiBUaGVzZSBhcmUgc3BlY2lmaWMgdG8gdGhlIGphdmEgY29tcGlsZXIgYmVpbmcgdXNlZC4KLSNjb21waWxlckFyZz0KLQotIyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIGNvZGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB3aGVuIGNvbXBpbGluZyBwbHVnLWlucyB0aGF0IGRvIG5vdCBzZXQgdGhlIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50IG9yIHNldCBqYXZhY1NvdXJjZSBpbiBidWlsZC5wcm9wZXJ0aWVzCi0jamF2YWNTb3VyY2U9MS4zCi0KLSMgRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHZlcnNpb24gb2YgdGhlIGJ5dGUgY29kZSB0YXJnZXRlZC4gVGhpcyB2YWx1ZSBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIHBsdWctaW5zIHRoYXQgZG8gbm90IHNldCB0aGUgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQgb3Igc2V0IGphdmFjVGFyZ2V0IGluIGJ1aWxkLnByb3BlcnRpZXMuCi0jamF2YWNUYXJnZXQ9MS4xCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9jdXN0b21UYXJnZXRzLnhtbCBiLzEuNS9yZWxlbmcvYnVpbGQtc2NyaXB0cy90ZW1wbGF0ZXMvY3VzdG9tVGFyZ2V0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNzI1NmYuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9idWlsZC1zY3JpcHRzL3RlbXBsYXRlcy9jdXN0b21UYXJnZXRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBSdW4gYSBnaXZlbiAke3RhcmdldH0gb24gYWxsIGVsZW1lbnRzIGJlaW5nIGJ1aWx0IC0tPgotCTwhLS0gQWRkIG9uIDxhbnQ+IHRhc2sgZm9yIGVhY2ggdG9wIGxldmVsIGVsZW1lbnQgYmVpbmcgYnVpbHQuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJhbGxFbGVtZW50c0ZpbGUiIHZhbHVlPSIke2J1aWxkZXJ9L2FsbEVsZW1lbnRzLnhtbCIvPgotCTxpbXBvcnQgZmlsZT0iJHthbGxFbGVtZW50c0ZpbGV9Ii8+Ci0JPHRhcmdldCBuYW1lPSJhbGxFbGVtZW50cyI+Ci0JCTxhbnRjYWxsIHRhcmdldD0iYWxsRWxlbWVudHNEZWxlZ2F0b3IiLz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImdldEJhc2VDb21wb25lbnRzIiBkZXBlbmRzPSJjaGVja0xvY2FsQmFzZSIgdW5sZXNzPSJza2lwQmFzZSI+Ci0JCTxnZXQgc3JjPSIke2VjbGlwc2VCYXNlVVJMfSIgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vLi4vdGVtcC1iYXNlLnppcCIvPgotCQk8dW56aXAgZGVzdD0iJHtiYXNlfSIgb3ZlcndyaXRlPSJ0cnVlIiBzcmM9IiR7YnVpbGREaXJlY3Rvcnl9Ly4uL3RlbXAtYmFzZS56aXAiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2hlY2tMb2NhbEJhc2UiPgotCQk8YXZhaWxhYmxlIGZpbGU9IiR7YmFzZX0iIHByb3BlcnR5PSJza2lwQmFzZSIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBDaGVjayBvdXQgbWFwIGZpbGVzIGZyb20gY29ycmVjdCByZXBvc2l0b3J5IC0tPgotCTwhLS0gUmVwbGFjZSB2YWx1ZXMgZm9yIG1hcHNDaGVja291dFRhZyBhcyBkZXNpcmVkLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImdldE1hcEZpbGVzIiBkZXBlbmRzPSJjaGVja0xvY2FsTWFwcyIgdW5sZXNzPSJza2lwTWFwcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXBzQ2hlY2tvdXRUYWciIHZhbHVlPSJIRUFEIi8+Ci0JCTxjdnMgY3ZzUm9vdD0iJHttYXBzUmVwb30iIHBhY2thZ2U9IiR7bWFwc1Jvb3R9IiBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIiB0YWc9IiR7bWFwc0NoZWNrb3V0VGFnfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjaGVja0xvY2FsTWFwcyI+Ci0JCTxhdmFpbGFibGUgcHJvcGVydHk9InNraXBNYXBzIiBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9tYXBzIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InRhZ01hcEZpbGVzIiBpZj0idGFnTWFwcyI+Ci0JCTxjdnMgZGVzdD0iJHtidWlsZERpcmVjdG9yeX0vbWFwcy8ke21hcHNSb290fSIgY29tbWFuZD0idGFnICR7bWFwc1RhZ1RhZ30iLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgdW5sZXNzPSJub2NsZWFuIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGxFbGVtZW50cyI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iY2xlYW5FbGVtZW50Ii8+Ci0JCTwvYW50Y2FsbD4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iZ2F0aGVyTG9ncyI+Ci0JCTxta2RpciBkaXI9IiR7YnVpbGREaXJlY3Rvcnl9LyR7YnVpbGRMYWJlbH0vY29tcGlsZWxvZ3MiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJhbGxFbGVtZW50cyI+Ci0JCQk8cGFyYW0gbmFtZT0idGFyZ2V0IiB2YWx1ZT0iZ2F0aGVyTG9ncyIvPgotCQk8L2FudGNhbGw+Ci0JCTx1bnppcCBkZXN0PSIke2J1aWxkRGlyZWN0b3J5fS8ke2J1aWxkTGFiZWx9L2NvbXBpbGVsb2dzIiBvdmVyd3JpdGU9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke2J1aWxkRGlyZWN0b3J5fS9mZWF0dXJlcyI+Ci0JCQkJPGluY2x1ZGUgbmFtZT0iKiovKi5sb2cuemlwIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCTwvdW56aXA+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBzZXR1cCAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVNldHVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgc2V0dXAgYnV0IGJlZm9yZSBzdGFydGluZyB0aGUgYnVpbGQgcHJvcGVyIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFNldHVwIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJnZXRCYXNlQ29tcG9uZW50cyIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZmV0Y2hpbmcgdGhlIGJ1aWxkIGVsZW1lbnRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlRmV0Y2giPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBmZXRjaGluZyB0aGUgYnVpbGQgZWxlbWVudHMgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0RmV0Y2giPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgZ2VuZXJhdGluZyB0aGUgYnVpbGQgc2NyaXB0cy4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVHZW5lcmF0ZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyIGdlbmVyYXRpbmcgdGhlIGJ1aWxkIHNjcmlwdHMuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdEdlbmVyYXRlIj4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjbGVhbiIvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyB0aGUgYnVpbGQueG1scyBmb3IgdGhlIGVsZW1lbnRzIGJlaW5nIGJ1aWx0LiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InByZVByb2Nlc3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciBydW5uaW5nIHRoZSBidWlsZC54bWxzIGZvciB0aGUgZWxlbWVudHMgYmVpbmcgYnVpbHQuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFByb2Nlc3MiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBiZWZvcmUgcnVubmluZyBhc3NlbWJsZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwcmVBc3NlbWJsZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIGFzc2VtYmxlLiAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InBvc3RBc3NlbWJsZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGJlZm9yZSBydW5uaW5nIHBhY2thZ2UuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlUGFja2FnZSI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIFN0ZXBzIHRvIGRvIGFmdGVyICBydW5uaW5nIHBhY2thZ2UuIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdFBhY2thZ2UiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyBhZnRlciB0aGUgYnVpbGQgaXMgZG9uZS4gLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJwb3N0QnVpbGQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImdhdGhlckxvZ3MiLz4KLQk8L3RhcmdldD4KLQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gdG8gdGVzdCB0aGUgYnVpbGQgcmVzdWx0cyAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9InRlc3QiPgotCTwvdGFyZ2V0PgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBTdGVwcyB0byBkbyB0byBwdWJsaXNoIHRoZSBidWlsZCByZXN1bHRzIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHVibGlzaCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmF1bHQgdGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9Im5vRGVmYXVsdCI+Ci0JCTxlY2hvIG1lc3NhZ2U9IllvdSBtdXN0IHNwZWNpZnkgYSB0YXJnZXQgd2hlbiBpbnZva2luZyB0aGlzIGZpbGUiLz4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfZW4ubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9lbi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MDFlZGQuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9lbi5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmU9djIwMDgwNDMwLTE3MDksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLmRvYy5mZWF0dXJlPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYuZG9jLmZlYXR1cmUKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmU9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZT12MjAwODA0MDItMTExMCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5mZWF0dXJlPXYyMDA4MDQzMC0xNzE0LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZmVhdHVyZQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlPXYyMDA4MDQzMC0xNzA5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucHJvZHVjdC5mZWF0dXJlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aT12MjAwODA0MzAtMTgwMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmJhc2U9djIwMDgwNDAyLTExMTAsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmJhc2UKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuY29tbW9uPXYyMDA4MDUwMS0xMTExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5jb21tb24KLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2U9djIwMDgwNTAxLTExMTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aT12MjAwODA0MzAtMTcwOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODY9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi53aW4zMi53aW4zMi54ODYKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZD12MjAwODAyMDQtMTQyNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZD12MjAwODAyMDQtMTQyNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlPXYyMDA4MDQyNC0xODM4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0PXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZD12MjAwODAyMDQtMTQyNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmRvYz12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZG9jCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmV4cG9ydD12MjAwODA0MjMtMTAxMyw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3A9djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aT12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sPXYyMDA4MDQzMC0xNzA5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmhlbHAuZG9jPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5oZWxwLmRvYwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQ9djIwMDgwNDMwLTE3MDksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sPXYyMDA4MDQzMC0xNzA5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmxpYnJhcnk9djIwMDgwNTAxLTExMTQsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0PXYyMDA4MDUwMS0xMDI0LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnVpPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZT12MjAwODA0MzAtMTcwOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpPXYyMDA4MDQzMC0xNzA5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pPXYyMDA4MDMxNy0xNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaT12MjAwODA0MzAtMTcwOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW09djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLm1zcHJvamVjdD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubXNwcm9qZWN0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nPXYyMDA4MDQxNC0xMTA4LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWk9djIwMDgwNDMwLTIwNTMsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmNwPXYyMDA4MDQwMi0xMTEwLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmNwLnVpPXYyMDA4MDQzMC0xNzA5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQ9djIwMDgwNDMwLTE3MDksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Ci1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlYXJjaD12MjAwODAxMjQtMTYxMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aT12MjAwODA0MjktMTgxOCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZXJ2aWNlcwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi51aT12MjAwODA0MDItMTIxMCw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYudWkuaW50cm89djIwMDgwMTI0LTE2MTEsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLmludHJvCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYT12MjAwODAyMjItMTIzNiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZT12MjAwODA0MTAtMTgyMSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0PXYyMDA4MDQxOC0xNDIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdAotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uPXYyMDA4MDEyNC0xNjExLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uCi1wbHVnaW5Ab3JnLmVjbGlwc2UuZXBmLnhtbC51bWE9djIwMDgwNDMwLTE3MDksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnhtbC51bWEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL21hcHMvZXBmX25sczEubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMxLm1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhNWQyOS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL21hcHMvZXBmX25sczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYuYmFzZS5mZWF0dXJlLm5sczE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMxCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sczE9djIwMDcxMDE4LTE4NTksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5wbGF0Zm9ybS5mZWF0dXJlLm5sczEKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uZWRpdC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuaW1wb3J0Lm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmNwLnVpLm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC51aS5ubDEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51aS5ubDE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudWkubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudW1hLm5sMT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwxCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwxPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyLm1hcCBiLzEuNS9yZWxlbmcvbWFwcy9lcGZfbmxzMi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOTg2N2UuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyLm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmxzMgotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyPXYyMDA3MTAxOC0xODU5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyCi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkZC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmNvcmUubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmVkaXQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLndwZGQubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ud3BkZC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5leHBvcnQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5pbXBvcnQueG1sLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wZXJzaXN0ZW5jZS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudWkueG1pLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLm1pZ3JhdGlvbi5kaWFncmFtLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy51aS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnJjcC51aS5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5zZWFyY2gudWkubmwyCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYudWkubmwyPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5ubDI9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLm5sMgotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEuZWRpdC5ubDIKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMj12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfbmxzMmEubWFwIGIvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyYS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NDc2YjQuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9tYXBzL2VwZl9ubHMyYS5tYXAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi5iYXNlLmZlYXR1cmUubmxzMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLmJhc2UuZmVhdHVyZS5ubHMyYQotZmVhdHVyZUBvcmcuZWNsaXBzZS5lcGYucGxhdGZvcm0uZmVhdHVyZS5ubHMyYT12MjAwNzEwMTgtMTg1OSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXBmLnBsYXRmb3JtLmZlYXR1cmUubmxzMmEKLWZlYXR1cmVAb3JnLmVjbGlwc2UuZXBmLnJjcC5mZWF0dXJlLm5sczJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmVwZi5yY3AuZmVhdHVyZS5ubHMyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uYWRkLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5hZGQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5lZGl0Lm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS53cGRkLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5leHBvcnQubXNwLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0Lm1zcC51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5tc3AudWkubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnhtbC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0LnhtbC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5Lm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucGVyc2lzdGVuY2UubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnBlcnNpc3RlbmNlLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51aS54bWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnVpLnhtaS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYubWlncmF0aW9uLmRpYWdyYW0ubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5taWdyYXRpb24uZGlhZ3JhbS5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYucHVibGlzaGluZy5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnB1Ymxpc2hpbmcudWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5wdWJsaXNoaW5nLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi5yY3AudWkubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnNlYXJjaC5ubDJhCi1mcmFnbWVudEBvcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYuc2VhcmNoLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51aS5ubDJhPXYyMDA3MDgyODE3MjIsOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvbmxfc3JjL3BsdWdpbnMvb3JnLmVjbGlwc2UuZXBmLnVpLm5sMmEKLWZyYWdtZW50QG9yZy5lY2xpcHNlLmVwZi51bWEubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi51bWEubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnVtYS5lZGl0Lm5sMmE9djIwMDcwODI4MTcyMiw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9ubF9zcmMvcGx1Z2lucy9vcmcuZWNsaXBzZS5lcGYudW1hLmVkaXQubmwyYQotZnJhZ21lbnRAb3JnLmVjbGlwc2UuZXBmLnZhbGlkYXRpb24ubmwyYT12MjAwNzA4MjgxNzIyLDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL25sX3NyYy9wbHVnaW5zL29yZy5lY2xpcHNlLmVwZi52YWxpZGF0aW9uLm5sMmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL21hcHMvZXBmX3Rlc3RzLm1hcCBiLzEuNS9yZWxlbmcvbWFwcy9lcGZfdGVzdHMubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTViZTE4Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvbWFwcy9lcGZfdGVzdHMubWFwCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1mZWF0dXJlQG9yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlPXYyMDA4MDIxMS0xODM5LDpwc2VydmVyOmFub255bW91c0BkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSwsb3JnLmVjbGlwc2UuZXBmL2NvbXBvc2VyLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZQotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM9djIwMDgwMjExLTE4MzksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cz12MjAwODAyMTEtMTgzOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cz12MjAwODAyMTgtMTc0Niw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLXBsdWdpbkBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHM9djIwMDgwMjExLTE4MzksOnBzZXJ2ZXI6YW5vbnltb3VzQGRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LCxvcmcuZWNsaXBzZS5lcGYvY29tcG9zZXIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cwotcGx1Z2luQG9yZy5lY2xpcHNlLmVwZi50ZXN0cz12MjAwODAyMTEtMTgzOSw6cHNlcnZlcjphbm9ueW1vdXNAZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksLG9yZy5lY2xpcHNlLmVwZi9jb21wb3Nlci8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzLmh0bWwgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyMzIwOS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyNzkgKzAsMCBAQAot77u/PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiCi14bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTAiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDEwIj4KLTxsaW5rIHJlbD1GaWxlLUxpc3QgaHJlZj0icmVsZWFzZS1ub3Rlc19maWxlcy9maWxlbGlzdC54bWwiPgotPGxpbmsgcmVsPUVkaXQtVGltZS1EYXRhIGhyZWY9InJlbGVhc2Utbm90ZXNfZmlsZXMvZWRpdGRhdGEubXNvIj4KLTwhLS1baWYgIW1zb10+Ci08c3R5bGU+Ci12XDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Ci1vXDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Ci13XDoqIHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTt9Ci0uc2hhcGUge2JlaGF2aW9yOnVybCgjZGVmYXVsdCNWTUwpO30KLTwvc3R5bGU+Ci08IVtlbmRpZl0tLT4KLTx0aXRsZT5JQk0gUmF0aW9uYWwgTWV0aG9kIENvbXBvc2VyIC0gUmVsZWFzZSBOb3RlczwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOkF1dGhvcj5JQk1fVVNFUjwvbzpBdXRob3I+Ci0gIDxvOkxhc3RBdXRob3I+SUJNX1VTRVI8L286TGFzdEF1dGhvcj4KLSAgPG86UmV2aXNpb24+OTwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjI0PC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA2LTA0LTE5VDIyOjU1OjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNi0wNC0yMVQyMjoxNjowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz4xPC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xOTU4PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjExMTYzPC9vOkNoYXJhY3RlcnM+Ci0gIDxvOkNvbXBhbnk+SUJNPC9vOkNvbXBhbnk+Ci0gIDxvOkxpbmVzPjkzPC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjI2PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjEzMDk1PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjEwLjY3MzU8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpTcGVsbGluZ1N0YXRlPkNsZWFuPC93OlNwZWxsaW5nU3RhdGU+Ci0gIDx3OkdyYW1tYXJTdGF0ZT5DbGVhbjwvdzpHcmFtbWFyU3RhdGU+Ci0gIDx3OkJyb3dzZXJMZXZlbD5NaWNyb3NvZnRJbnRlcm5ldEV4cGxvcmVyNDwvdzpCcm93c2VyTGV2ZWw+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLSBAZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OldpbmdkaW5nczsKLQlwYW5vc2UtMTo1IDAgMCAwIDAgMCAwIDAgMCAwOwotCW1zby1mb250LWNoYXJzZXQ6MjsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTphdXRvOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTowIDI2ODQzNTQ1NiAwIDAgLTIxNDc0ODM2NDggMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLSBwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotaDEKLQl7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCW1zby1vdXRsaW5lLWxldmVsOjE7Ci0JZm9udC1zaXplOjI0LjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQlmb250LXdlaWdodDpib2xkO30KLWgyCi0Je21zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQltc28tb3V0bGluZS1sZXZlbDoyOwotCWZvbnQtc2l6ZToxOC4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JZm9udC13ZWlnaHQ6Ym9sZDt9Ci1oMwotCXttc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JbXNvLW91dGxpbmUtbGV2ZWw6MzsKLQlmb250LXNpemU6MTMuNXB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCWZvbnQtd2VpZ2h0OmJvbGQ7fQotYTpsaW5rLCBzcGFuLk1zb0h5cGVybGluawotCXtjb2xvcjpibHVlOwotCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci0JdGV4dC11bmRlcmxpbmU6c2luZ2xlO30KLWE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZAotCXtjb2xvcjpibHVlOwotCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7Ci0JdGV4dC11bmRlcmxpbmU6c2luZ2xlO30KLXAKLQl7bXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotY29kZQotCXtmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1hc2NpaS1mb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1oYW5zaS1mb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7fQotc3Bhbi5TcGVsbEUKLQl7bXNvLXN0eWxlLW5hbWU6IiI7Ci0JbXNvLXNwbC1lOnllczt9Ci1zcGFuLkdyYW1FCi0Je21zby1zdHlsZS1uYW1lOiIiOwotCW1zby1ncmFtLWU6eWVzO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotIC8qIExpc3QgRGVmaW5pdGlvbnMgKi8KLSBAbGlzdCBsMAotCXttc28tbGlzdC1pZDo4MDg4MDI2MzsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6MjA3NDEwMDgyNjt9Ci1AbGlzdCBsMDpsZXZlbDEKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Ou+CtzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6U3ltYm9sO30KLUBsaXN0IGwxCi0Je21zby1saXN0LWlkOjE2NDcxMjk0NTsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTEzMDY2MTU2OTY7fQotQGxpc3QgbDE6bGV2ZWwxCi0Je21zby1sZXZlbC1zdGFydC1hdDozOwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDIKLQl7bXNvLWxpc3QtaWQ6MjA3NDk3NTY3OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotODM0MjE5NTMyO30KLUBsaXN0IGwyOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDI6bGV2ZWwyCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDpvOwotCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsKLQltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AbGlzdCBsMjpsZXZlbDMKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjEuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDI6bGV2ZWw0Ci0Je21zby1sZXZlbC10YWItc3RvcDoyLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyOmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjpsZXZlbDYKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDI6bGV2ZWw3Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyOmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjpsZXZlbDkKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDMKLQl7bXNvLWxpc3QtaWQ6MzIwODE0NDIzOwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotNDc3OTgyNzI2O30KLUBsaXN0IGwzOmxldmVsMQotCXttc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw0Ci0Je21zby1saXN0LWlkOjM5NjgyNjgyNDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTQ1Njg3MTQzMDt9Ci1AbGlzdCBsNDpsZXZlbDEKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Ou+CtzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6U3ltYm9sO30KLUBsaXN0IGw0OmxldmVsMgotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ6bzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Ci0JbXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQGxpc3QgbDQ6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw0OmxldmVsNAotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsNDpsZXZlbDUKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDQ6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw0OmxldmVsNwotCXttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsNDpsZXZlbDgKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDQ6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw1Ci0Je21zby1saXN0LWlkOjQ5MjE4MzMzNTsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE4MTgwODUyNTY7fQotQGxpc3QgbDU6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsNTpsZXZlbDIKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Om87Ci0JbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBsaXN0IGw2Ci0Je21zby1saXN0LWlkOjUxNTE5Mjc4MzsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE5OTk0NjgxODA7fQotQGxpc3QgbDY6bGV2ZWwxCi0Je21zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDcKLQl7bXNvLWxpc3QtaWQ6NTgwNzE2NzEzOwotCW1zby1saXN0LXR5cGU6aHlicmlkOwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotOTE3MDc2MTMyIDY3Njk4NzAzIDY3Njk4NjkxIDY3Njk4NjkzIDY3Njk4Njg5IDY3Njk4NjkxIDY3Njk4NjkzIDY3Njk4Njg5IDY3Njk4NjkxIDY3Njk4NjkzO30KLUBsaXN0IGw3OmxldmVsMQotCXttc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw4Ci0Je21zby1saXN0LWlkOjY1NTQ1MDI5NDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTM4NzE3MDEzMjt9Ci1AbGlzdCBsODpsZXZlbDEKLQl7bXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsODpsZXZlbDIKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDg6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw4OmxldmVsNAotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsODpsZXZlbDUKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDg6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw4OmxldmVsNwotCXttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsODpsZXZlbDgKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDg6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGw5Ci0Je21zby1saXN0LWlkOjg3NTg0NzI4NDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTE5ODc2NzUzMjY7fQotQGxpc3QgbDk6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsOTpsZXZlbDIKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Om87Ci0JbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBsaXN0IGwxMAotCXttc28tbGlzdC1pZDo5NjkwMTY1NDA7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjEzOTA5NDM2NTY7fQotQGxpc3QgbDEwOmxldmVsMQotCXttc28tbGV2ZWwtc3RhcnQtYXQ6NDsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMDpsZXZlbDIKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Om87Ci0JbXNvLWxldmVsLXRhYi1zdG9wOjEuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiQ291cmllciBOZXciOwotCW1zby1iaWRpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBsaXN0IGwxMQotCXttc28tbGlzdC1pZDo5OTU1NzI5OTc7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjE2MTMyNTA0NDI7fQotQGxpc3QgbDExOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDEyCi0Je21zby1saXN0LWlkOjEwMDk3OTQxMzY7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjE0NjY3MTMzNjA7fQotQGxpc3QgbDEyOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDEyOmxldmVsMgotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ6bzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7Ci0JbXNvLWJpZGktZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQGxpc3QgbDEyOmxldmVsMwotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTI6bGV2ZWw0Ci0Je21zby1sZXZlbC10YWItc3RvcDoyLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMjpsZXZlbDUKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEyOmxldmVsNgotCXttc28tbGV2ZWwtdGFiLXN0b3A6My4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTI6bGV2ZWw3Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMjpsZXZlbDgKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEyOmxldmVsOQotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTMKLQl7bXNvLWxpc3QtaWQ6MTAxMTEwOTA0MTsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6LTM4NzQwNTkxMjt9Ci1AbGlzdCBsMTM6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsMTM6bGV2ZWwyCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMzpsZXZlbDMKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjEuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEzOmxldmVsNAotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTM6bGV2ZWw1Ci0Je21zby1sZXZlbC10YWItc3RvcDoyLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMzpsZXZlbDYKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDEzOmxldmVsNwotCXttc28tbGV2ZWwtdGFiLXN0b3A6My41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTM6bGV2ZWw4Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxMzpsZXZlbDkKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjQuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE0Ci0Je21zby1saXN0LWlkOjEwNzMyMzg3NDg7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0yODEwOTU1MzA7fQotQGxpc3QgbDE0OmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDE0OmxldmVsMgotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTQ6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNDpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE0OmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTQ6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNDpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE0OmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTQ6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNQotCXttc28tbGlzdC1pZDoxMDk1MzE4OTkwOwotCW1zby1saXN0LXRlbXBsYXRlLWlkczoyMDI0NjgwMTI0O30KLUBsaXN0IGwxNTpsZXZlbDEKLQl7bXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTU6bGV2ZWwyCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDpvOwotCW1zby1sZXZlbC10YWItc3RvcDoxLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsKLQltc28tYmlkaS1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AbGlzdCBsMTU6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNTpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE1OmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTU6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNTpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE1OmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTU6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNgotCXttc28tbGlzdC1pZDoxMTAzNDU4NjE3OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotMTIzODQ1NDM2Mjt9Ci1AbGlzdCBsMTY6bGV2ZWwxCi0Je21zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE2OmxldmVsMgotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTY6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNjpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE2OmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTY6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNjpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE2OmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMTY6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwxNwotCXttc28tbGlzdC1pZDoxNDk4OTU0NTU3OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczotMTYxMjk0OTE1MDt9Ci1AbGlzdCBsMTc6bGV2ZWwxCi0Je21zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDE4Ci0Je21zby1saXN0LWlkOjE4MjY3Nzg1MDM7Ci0JbXNvLWxpc3QtdGVtcGxhdGUtaWRzOjc2MDg5MzUyMDt9Ci1AbGlzdCBsMTg6bGV2ZWwxCi0Je21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsKLQltc28tbGV2ZWwtdGV4dDrvgrc7Ci0JbXNvLWxldmVsLXRhYi1zdG9wOi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjsKLQltc28tYW5zaS1mb250LXNpemU6MTAuMHB0OwotCWZvbnQtZmFtaWx5OlN5bWJvbDt9Ci1AbGlzdCBsMTkKLQl7bXNvLWxpc3QtaWQ6MjA0NDIwODY0MDsKLQltc28tbGlzdC10ZW1wbGF0ZS1pZHM6Mjk5MTI5NTk4O30KLUBsaXN0IGwxOTpsZXZlbDEKLQl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0OwotCW1zby1sZXZlbC10ZXh0Ou+CtzsKLQltc28tbGV2ZWwtdGFiLXN0b3A6LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluOwotCW1zby1hbnNpLWZvbnQtc2l6ZToxMC4wcHQ7Ci0JZm9udC1mYW1pbHk6U3ltYm9sO30KLUBsaXN0IGwyMAotCXttc28tbGlzdC1pZDoyMDg5MTgzNzQ2OwotCW1zby1saXN0LXRlbXBsYXRlLWlkczozNjA2MzY0ODA7fQotQGxpc3QgbDIwOmxldmVsMQotCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7Ci0JbXNvLWxldmVsLXRleHQ674K3OwotCW1zby1sZXZlbC10YWItc3RvcDouNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47Ci0JbXNvLWFuc2ktZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseTpTeW1ib2w7fQotQGxpc3QgbDIwOmxldmVsMgotCXttc28tbGV2ZWwtdGFiLXN0b3A6MS4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjA6bGV2ZWwzCi0Je21zby1sZXZlbC10YWItc3RvcDoxLjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyMDpsZXZlbDQKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjIuMGluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDIwOmxldmVsNQotCXttc28tbGV2ZWwtdGFiLXN0b3A6Mi41aW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjA6bGV2ZWw2Ci0Je21zby1sZXZlbC10YWItc3RvcDozLjBpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLUBsaXN0IGwyMDpsZXZlbDcKLQl7bXNvLWxldmVsLXRhYi1zdG9wOjMuNWluOwotCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsKLQl0ZXh0LWluZGVudDotLjI1aW47fQotQGxpc3QgbDIwOmxldmVsOAotCXttc28tbGV2ZWwtdGFiLXN0b3A6NC4waW47Ci0JbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0OwotCXRleHQtaW5kZW50Oi0uMjVpbjt9Ci1AbGlzdCBsMjA6bGV2ZWw5Ci0Je21zby1sZXZlbC10YWItc3RvcDo0LjVpbjsKLQltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7Ci0JdGV4dC1pbmRlbnQ6LS4yNWluO30KLW9sCi0Je21hcmdpbi1ib3R0b206MGluO30KLXVsCi0Je21hcmdpbi1ib3R0b206MGluO30KLS0tPgotPC9zdHlsZT4KLTwhLS1baWYgZ3RlIG1zbyAxMF0+Ci08c3R5bGU+Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLSB0YWJsZS5Nc29Ob3JtYWxUYWJsZQotCXttc28tc3R5bGUtbmFtZToiVGFibGUgTm9ybWFsIjsKLQltc28tdHN0eWxlLXJvd2JhbmQtc2l6ZTowOwotCW1zby10c3R5bGUtY29sYmFuZC1zaXplOjA7Ci0JbXNvLXN0eWxlLW5vc2hvdzp5ZXM7Ci0JbXNvLXN0eWxlLXBhcmVudDoiIjsKLQltc28tcGFkZGluZy1hbHQ6MGluIDUuNHB0IDBpbiA1LjRwdDsKLQltc28tcGFyYS1tYXJnaW46MGluOwotCW1zby1wYXJhLW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEwLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci08L3N0eWxlPgotPCFbZW5kaWZdLS0+Ci08bWV0YSBuYW1lPWNvcHlyaWdodCBjb250ZW50PSIoQykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDA2Ij4KLTxtZXRhIG5hbWU9REMucmlnaHRzLm93bmVyIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDYiPgotPG1ldGEgbmFtZT1zZWN1cml0eSBjb250ZW50PXB1YmxpYz4KLTxtZXRhIG5hbWU9Um9ib3RzIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyI+Ci08bWV0YSBodHRwLWVxdWl2PVBJQ1MtTGFiZWwKLWNvbnRlbnQ9IihQSUNTLTEuMSAmcXVvdDtodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCZxdW90OyBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgJnF1b3Q7aHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwmcXVvdDsgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICZxdW90O2h0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyZxdW90OyBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpIj4KLTxtZXRhIG5hbWU9REMuRm9ybWF0IGNvbnRlbnQ9WEhUTUw+Ci08bWV0YSBuYW1lPURDLkxhbmd1YWdlIGNvbnRlbnQ9ZW4tdXM+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIExpY2Vuc2VkIE1hdGVyaWFscyBQcm9wZXJ0eSBvZiBJQk0gLS0+PCEtLSBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0tPjwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+PCEtLSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIC0tPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIGxpbms9Ymx1ZSB2bGluaz1ibHVlIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxoMT5FUEYgQ29tcG9zZXIgUmVsZWFzZSBOb3RlczwvaDE+Ci0KLTxwPjxzdHJvbmc+UmVsZWFzZSAxLjAtTTI8L3N0cm9uZz48L3A+Ci0KLTxoMj48YSBuYW1lPWludHJvPjwvYT48bzpwPiZuYnNwOzwvbzpwPjwvaDI+Ci0KLTxoMj5JbnRyb2R1Y3Rpb248L2gyPgotCi08cD5UaGlzIGlzIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiBFUEYgQ29tcG9zZXIuIFRoZSBtYWluIGZlYXR1cmVzIGFkZGVkIGluIHRoaXMKLXJlbGVhc2UgaW5jbHVkZSB0aGUgZm9sbG93aW5nOjwvcD4KLQotPHVsIHR5cGU9ZGlzYz4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIgbGV2ZWwxIGxmbzM7dGFiLXN0b3BzOmxpc3QgLjVpbic+U3VwcG9ydCBmb3IgTGludXggcGxhdGZvcm1zPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIgbGV2ZWwxIGxmbzM7dGFiLXN0b3BzOmxpc3QgLjVpbic+U2V2ZXJhbCBmdW5jdGlvbmFsCi0gICAgIGltcHJvdmVtZW50cyBhbmQgZml4ZXM8L2xpPgotPC91bD4KLQotPGgyPjxhIG5hbWU9cmVxdWlyZW1lbnRzPjwvYT5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9oMj4KLQotPGgzPjxhIG5hbWU9aGFyZHdhcmU+PC9hPkhhcmR3YXJlIFJlcXVpcmVtZW50czwvaDM+Ci0KLTx1bCB0eXBlPWRpc2M+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw0IGxldmVsMSBsZm82O3RhYi1zdG9wczpsaXN0IC41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPkludGVsKFRNKQotICAgICBQZW50aXVtwq4gSUlJIDgwMCBNSHogb3IgaGlnaGVyIHByb2Nlc3Nvci48L3NwYW4+IDwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw0IGxldmVsMSBsZm82O3RhYi1zdG9wczpsaXN0IC41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPjc2ODwvc3Bhbj4KLSAgICAgTUIgUkFNIG1pbmltdW0uIE1vcmUgbWVtb3J5IDxzcGFuIGNsYXNzPUdyYW1FPmlzIHJlY29tbWVuZGVkPC9zcGFuPiBhcyBpdAotICAgICBpbXByb3ZlcyByZXNwb25zaXZlbmVzcy4gPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDQgbGV2ZWwxIGxmbzY7dGFiLXN0b3BzOmxpc3QgLjVpbic+RGlzayBzcGFjZTogPC9saT4KLSA8dWwgdHlwZT1jaXJjbGU+Ci0gIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDoKLSAgICAgIGF1dG87bXNvLWxpc3Q6bDQgbGV2ZWwyIGxmbzY7dGFiLXN0b3BzOmxpc3QgMS4waW4nPjxzcGFuIGNsYXNzPUdyYW1FPjUwCi0gICAgICBNQiB0byBpbnN0YWxsIEVQRiBDb21wb3Nlci48L3NwYW4+IDwvbGk+Ci0gPC91bD4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDQgbGV2ZWwxIGxmbzY7dGFiLXN0b3BzOmxpc3QgLjVpbic+PHNwYW4gY2xhc3M9R3JhbUU+RGlzcGxheQotICAgICByZXNvbHV0aW9uIG9mIDEwMjQgeCA3NjggeCAyNTYtY29sb3IgdmlkZW8gcmVzb2x1dGlvbiwgb3IgaGlnaGVyLjwvc3Bhbj4KLSAgICAgSGlnaC1jb2xvciBvciB0cnVlLWNvbG9yIHJlY29tbWVuZGVkPC9saT4KLTwvdWw+Ci0KLTxoMz48YSBuYW1lPXNvZnR3YXJlPjwvYT5Tb2Z0d2FyZSBSZXF1aXJlbWVudHM8L2gzPgotCi08cD5UaGUgZm9sbG93aW5nIHNvZnR3YXJlIDxzcGFuIGNsYXNzPUdyYW1FPm11c3QgYmUgaW5zdGFsbGVkPC9zcGFuPiBiZWZvcmUgeW91Ci1pbnN0YWxsIEVQRiBDb21wb3NlcjogPC9wPgotCi08dWwgdHlwZT1kaXNjPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTIgbGV2ZWwxIGxmbzk7dGFiLXN0b3BzOmxpc3QgLjVpbic+T25lIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgb3BlcmF0aW5nIHN5c3RlbXM6IDwvbGk+Ci0gPHVsIHR5cGU9Y2lyY2xlPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+V2luZG93c8KuIFhQCi0gICAgICBQcm9mZXNzaW9uYWwgd2l0aCBTZXJ2aWNlIFBhY2tzIDEgYW5kIDIgPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPldpbmRvd3MgMjAwMAotICAgICAgUHJvZmVzc2lvbmFsIHdpdGggU2VydmljZSBQYWNrIDQgPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPldpbmRvd3MgMjAwMwotICAgICAgRW50ZXJwcmlzZSBFZGl0aW9uIHdpdGggU2VydmljZSBQYWNrIDE8L2xpPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+UmVkIEhhdCBFbnRlcnByaXNlCi0gICAgICBMaW51eCA0IFdTPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPlNVU0UgTGludXggU0xFUyA5IFNQMzwvbGk+Ci0gPC91bD4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDEyIGxldmVsMSBsZm85O3RhYi1zdG9wczpsaXN0IC41aW4nPk9uZSBvZiB0aGUgZm9sbG93aW5nCi0gICAgIGJyb3dzZXJzOjwvbGk+Ci0gPHVsIHR5cGU9Y2lyY2xlPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+SW50ZXJuZXQgRXhwbG9yZXLCrgotICAgICAgNi4wIHdpdGggU2VydmljZSBQYWNrIDE8L2xpPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxMiBsZXZlbDIgbGZvOTt0YWItc3RvcHM6bGlzdCAxLjBpbic+SW50ZXJuZXQgRXhwbG9yZXIgNS41Ci0gICAgICB3aXRoIFNlcnZpY2UgUGFjayAyPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPjxzcGFuIGNsYXNzPVNwZWxsRT5Nb3ppbGxhPC9zcGFuPgotICAgICAgMS43LjEyPC9saT4KLSAgPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OgotICAgICAgYXV0bzttc28tbGlzdDpsMTIgbGV2ZWwyIGxmbzk7dGFiLXN0b3BzOmxpc3QgMS4waW4nPjxzcGFuIGNsYXNzPVNwZWxsRT5GaXJlZm94PC9zcGFuPgotICAgICAgMS4wLjcgb3IgMS41PGEgbmFtZT1vdGhlcj48L2E+PC9saT4KLSA8L3VsPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTIgbGV2ZWwxIGxmbzk7dGFiLXN0b3BzOmxpc3QgLjVpbic+TWluaW11bSBTVU7CriBKUkUgMS40LjIsIG9yCi0gICAgIGxhdGVyLCBpcyByZWNvbW1lbmRlZC4gPC9saT4KLTwvdWw+Ci0KLTxoMj48YSBuYW1lPWluc3RhbGxpbmc+PC9hPjxhIG5hbWU9ZmVhdHVyZXM+PC9hPk5ldyBGZWF0dXJlczwvaDI+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD5UaGUgbWFpbiBuZXcgZmVhdHVyZXMgaW4gRVBGIENvbXBvc2VyIDxzcGFuIGNsYXNzPUdyYW1FPmFyZQotZGVzY3JpYmVkPC9zcGFuPiBiZWxvdy4gPC9wPgotCi08aDM+RXhwb3J0IHRvIE1pY3Jvc29mdCBQcm9qZWN0PC9oMz4KLQotPHA+WW91IGNhbiBub3cgZXhwb3J0IGEgcHJvY2VzcyB0byBNaWNyb3NvZnQgUHJvamVjdC4gWW91IGNhbiBkbyB0aGlzIGFzCi1mb2xsb3dzOjwvcD4KLQotPG9sIHN0YXJ0PTEgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+U3RhcnQgRVBGIENvbXBvc2VyIGFuZCBvcGVuCi0gICAgIHRoZSBsaWJyYXJ5IGNvbnRhaW5pbmcgdGhlIHByb2Nlc3MgeW91IHdhbnQgdG8gZXhwb3J0LjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw4IGxldmVsMSBsZm8xMjt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPHN0cm9uZz5GaWxlLSZndDtFeHBvcnQ8L3N0cm9uZz4uCi0gICAgIFRoaXMgc3RhcnRzIHRoZSBFeHBvcnQgd2l6YXJkLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw4IGxldmVsMSBsZm8xMjt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPHN0cm9uZz5NaWNyb3NvZnQKLSAgICAgUHJvamVjdCBUZW1wbGF0ZTwvc3Ryb25nPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9R3JhbUU+PHN0cm9uZz5OZXh0PC9zdHJvbmc+PC9zcGFuPi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+Q2hvb3NlIHRoZSB0eXBlIG9mIHByb2Nlc3MKLSAgICAgdG8gZXhwb3J0IC0gQ2FwYWJpbGl0eSBQYXR0ZXJuIG9yIERlbGl2ZXJ5IFByb2Nlc3MgYW5kIHNlbGVjdCB0aGUgcHJvY2VzcwotICAgICB5b3Ugd2FudCB0byBleHBvcnQuIElmIHRoZXJlIDxzcGFuIGNsYXNzPUdyYW1FPmlzPC9zcGFuPiBtb3JlIHRoYW4gb25lCi0gICAgIENvbmZpZ3VyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzLCBzZWxlY3QgdGhlIGNvbmZpZ3VyYXRpb24geW91Ci0gICAgIHdhbnQgdG8gdXNlLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw4IGxldmVsMSBsZm8xMjt0YWItc3RvcHM6bGlzdCAuNWluJz5Zb3UgY2FuIGNob29zZSB0byBwdWJsaXNoCi0gICAgIHRoZSBjb25maWd1cmF0aW9uIGF0IHRoZSBzYW1lIHRpbWUgYnkgY2hlY2tpbmcgdGhlICZxdW90O1B1Ymxpc2ggdGhlCi0gICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMmcXVvdDsgY2hlY2tib3guIFlvdSBjYW4gYWxzbyBjaG9vc2UgdG8gb25seSBleHBvcnQKLSAgICAgdGFza3MgYW5kIGFjdGl2aXRpZXMgd2l0aCB0aGUgUGxhbm5lZCBhdHRyaWJ1dGUgc2V0IHRvIHRydWUuIElmIHlvdSBkbyBub3QKLSAgICAgY2hlY2sgdGhpcyBib3gsIGFsbCBhY3Rpdml0aWVzIGFuZCB0YXNrcyBpbiB0aGUgc2VsZWN0ZWQgcHJvY2VzcyA8c3BhbgotICAgICBjbGFzcz1HcmFtRT53aWxsIGJlIGV4cG9ydGVkPC9zcGFuPi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+UHJvdmlkZSBhIG5hbWUgZm9yIHlvdXIgZXhwb3J0ZWQKLSAgICAgdGVtcGxhdGUgZmlsZSBhbmQgc2VsZWN0IGEgbG9jYXRpb24gZm9yIHRoZSBmaWxlLiBDbGljayA8c3Ryb25nPkZpbmlzaDwvc3Ryb25nPi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsOCBsZXZlbDEgbGZvMTI7dGFiLXN0b3BzOmxpc3QgLjVpbic+WW91IGNhbiBvcGVuIHRoZSBYTUwgZmlsZQotICAgICB0aGF0IDxzcGFuIGNsYXNzPUdyYW1FPmlzIGV4cG9ydGVkPC9zcGFuPiB1c2luZyBNaWNyb3NvZnQgUHJvamVjdCAyMDAzIG9yCi0gICAgIGxhdGVyLiBUaGUgWE1MIGZpbGUgZm9ybWF0IDxzcGFuIGNsYXNzPUdyYW1FPmlzIG5vdCBvZmZpY2lhbGx5IHN1cHBvcnRlZDwvc3Bhbj4KLSAgICAgaW4gZWFybGllciB2ZXJzaW9ucy48L2xpPgotPC9vbD4KLQotPGgzPjxhIG5hbWU9c3luY2hyb25pemF0aW9uPjwvYT5TeW5jaHJvbml6YXRpb24gb2YgUHJvY2Vzc2VzIHRvIE1ldGhvZCBFbGVtZW50czwvaDM+Ci0KLTxwPldoZW4gYSBkZXNjcmlwdG9yIDxzcGFuIGNsYXNzPUdyYW1FPmlzIGNyZWF0ZWQ8L3NwYW4+IGluIGEgcHJvY2VzcywgaXQgaGFzCi10aGUgc2FtZSBwcm9wZXJ0aWVzIGFzIGl0cyBjb3JyZXNwb25kaW5nIGJhc2UgZWxlbWVudC4gSWYgdGhlIGJhc2UgZWxlbWVudCBpcwotY2hhbmdlZCwgdGhlIGNoYW5nZXMgPHNwYW4gY2xhc3M9R3JhbUU+YXJlIG5vdCBhdXRvbWF0aWNhbGx5IHJlZmxlY3RlZDwvc3Bhbj4KLWluIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvcnMuIFN5bmNocm9uaXphdGlvbiBhbGxvd3MgeW91IHRvIHVwZGF0ZSBkZXNjcmlwdG9ycwotaW4gYSBwcm9jZXNzIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbWV0aG9kIGVsZW1lbnQuCi1UaGlzIG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHByb2Nlc3NlcyB1cCB0byBkYXRlIHdpdGggY2hhbmdlcyBtYWRlIHRvIG1ldGhvZAotZWxlbWVudHMgYWZ0ZXIgdGhleSA8c3BhbiBjbGFzcz1HcmFtRT5hcmUgdXNlZDwvc3Bhbj4gaW4gcHJvY2Vzc2VzLjwvcD4KLQotPHA+RWFjaCBkZXNjcmlwdG9yIGhhcyBhIG5ldyBwcm9wZXJ0eSwgdGhlICZxdW90O1N5bmNocm9uaXplZCB3aXRoIHNvdXJjZSZxdW90OwotZmxhZywgd2hpY2ggY2FuIGJlIHNldCBpZiB5b3Ugd2FudCB0byBzeW5jaHJvbml6ZSB0aGUgZWxlbWVudCB3aXRoIGl0cyBiYXNlCi1tZXRob2QgZWxlbWVudC48L3A+Ci0KLTxwPjxzcGFuIGNsYXNzPUdyYW1FPlRoZXJlIGlzIGEgbmV3IHN5bmNocm9uaXphdGlvbiB3aXphcmQgdGhhdDwvc3Bhbj4gYWxsb3dzCi15b3UgdG8gY2hvb3NlIHRoZSBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSBpbiBhIGRlc2NyaXB0b3IgZnJvbSB0aGUgY29ycmVzcG9uZGluZwotYmFzZSBlbGVtZW50LjwvcD4KLQotPHA+PHNwYW4gY2xhc3M9R3JhbUU+VG8gb3BlbiB0aGUgc3luY2hyb25pemF0aW9uIHdpemFyZCwgaW4gdGhlIHByb2Nlc3MgZWRpdG9yLAotcmlnaHQtY2xpY2sgb24gYW55IGJyZWFrZG93biBlbGVtZW50IGFuZCBzZWxlY3QgJnF1b3Q7Q3VzdG9tCi1TeW5jaHJvbml6YXRpb24mcXVvdDsuPC9zcGFuPiBUaGUgd2l6YXJkIGV4cGxhaW5zIHRoZSBmZWF0dXJlIGFuZCBhbGxvd3MgeW91IHRvCi1zZWxlY3Qgd2hpY2ggcHJvcGVydGllcyB0byB1cGRhdGUgZnJvbSB0aGUgYmFzZSBlbGVtZW50LjwvcD4KLQotPHA+WW91IGNhbiBhbHNvIHVwZGF0ZSBhbGwgZWxlbWVudHMgYnkgPHNwYW4gY2xhc3M9R3JhbUU+cmlnaHQtY2xpY2tpbmc8L3NwYW4+Ci1vbiBhIGJyZWFrZG93biBlbGVtZW50IGFuZCBzZWxlY3RpbmcgJnF1b3Q7RGVmYXVsdCBTeW5jaHJvbml6YXRpb24gZnJvbSBNZXRob2QKLUNvbnRlbnQmcXVvdDsuPC9wPgotCi08cD5UaGUgc3luY2hyb25pemF0aW9uIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgZm9yIGRlc2NyaXB0b3JzIGFuZCBhY3Rpdml0aWVzLgotSWYgeW91IGFwcGx5IHN5bmNocm9uaXphdGlvbiBmb3IgYW4gYWN0aXZpdHksIGFsbCBkZXNjcmlwdG9ycyB3aXRoaW4gdGhlCi1hY3Rpdml0eSB0aGF0IGhhdmUgdGhlICZxdW90O1N5bmNocm9uaXplZCB3aXRoIHNvdXJjZSZxdW90OyBmbGFnIGNoZWNrZWQgPHNwYW4KLWNsYXNzPUdyYW1FPndpbGwgYmUgc3luY2hyb25pemVkPC9zcGFuPi48L3A+Ci0KLTxoMz5JbXByb3ZlbWVudHMgdG8gRGlhZ3JhbXM8L2gzPgotCi08cD5XaGVuIGFuIGVsZW1lbnQgaW4gYW4gZXh0ZW5kZWQgQ2FwYWJpbGl0eSBQYXR0ZXJuIDxzcGFuIGNsYXNzPUdyYW1FPmlzCi1zdXBwcmVzc2VkPC9zcGFuPiBpbiB0aGUgV29yayBCcmVha2Rvd24gU3RydWN0dXJlLCB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20KLXRoZSBjb3JyZXNwb25kaW5nIGRpYWdyYW1zLiBXaGVuIGVsZW1lbnRzIDxzcGFuIGNsYXNzPUdyYW1FPmFyZSByZW1vdmVkPC9zcGFuPgotZnJvbSBhIGRpYWdyYW0sIHRoZSByZXN1bHRpbmcgZGlhZ3JhbSBtYXkgbm90IGJlIHNhdGlzZmFjdG9yeS4gRm9yIGV4YW1wbGUsIHlvdQotbWF5IGhhdmUgbGFyZ2UgZW1wdHkgc3BhY2VzIHRoYXQgc2VlbSBpbmFwcHJvcHJpYXRlLiBZb3UgbWF5IGFsc28gaGF2ZSBub2RlcwotdGhhdCA8c3BhbiBjbGFzcz1HcmFtRT5hcmUgbm90IGNvbm5lY3RlZDwvc3Bhbj4gdG8gYW55dGhpbmcuIFlvdSBjYW4gbWFudWFsbHkKLW1vZGlmeSB0aGVzZSBkaWFncmFtcyB0byBpbXByb3ZlIHRoZWlyIGFwcGVhcmFuY2UuIFlvdSA8c3BhbiBjbGFzcz1HcmFtRT53b24ndDwvc3Bhbj4KLWJlIGFibGUgdG8gbWFrZSBjb25uZWN0aW9ucyB0byBub2RlcyB0aGF0IGFyZSBleHRlbnNpb25zIHRvIG90aGVyIHByb2Nlc3MKLWVsZW1lbnRzICh0aGV5IGFwcGVhciB3aXRoIGdyZWVuIGl0YWxpYyB0ZXh0IHVuZGVyIHRoZSBub2RlKS4gVG8gZW5hYmxlIHRoZQotYWJpbGl0eSB0byBjb25uZWN0IHRvIHRoZXNlIG5vZGVzIG9uIHlvdXIgZGlhZ3JhbSwgbG9jYXRlIHRoZSBub2RlIGluIHRoZSB3b3JrCi1icmVha2Rvd24gc3RydWN0dXJlIChXQlMpIHZpZXcuIENob29zZSAnTG9jYWwgQ29udHJpYnV0aW9uJyBmcm9tIHRoaXMgZWxlbWVudCdzCi1jb250ZXh0IG1lbnUuPC9wPgotCi08cD5JdCBpcyBub3cgcG9zc2libGUgdG8gYXNzb2NpYXRlIGEgZGlhZ3JhbSBwcm9kdWNlZCBpbiBhbiBleHRlcm5hbCBncmFwaGljcwotdG9vbCB3aXRoIGFuIGVsZW1lbnQgaW4gYSBicmVha2Rvd24gc3RydWN0dXJlLiA8c3BhbiBjbGFzcz1HcmFtRT5UbyB1c2UgdGhpcwotZmFjaWxpdHksIGluIHRoZSBwcm9jZXNzIGVkaXRvciwgcmlnaHQtY2xpY2sgb24gYW4gYWN0aXZpdHkgYW5kIHNlbGVjdAotRGlhZ3JhbXMmZ3Q7VXNlciBEZWZpbmVkIERpYWdyYW1zLjwvc3Bhbj4gWW91IGNhbiBzZWxlY3Qgd2hpY2ggdHlwZSBvZiB1c2VyCi1kZWZpbmVkIGRpYWdyYW0geW91IHdhbnQgdG8gdXNlIGFuZCBzZWxlY3QgdGhlIGRpYWdyYW0gZmlsZS48L3A+Ci0KLTxwPllvdSBjYW4gbm93IHJlc2l6ZSB0aGUgbm9kZXMgb24gYW4gYWN0aXZpdHkgZGlhZ3JhbSB0byB3cmFwIHRoZSBuYW1lIG9mIHRoZQotbm9kZS4gPHNwYW4gY2xhc3M9R3JhbUU+T24gYW4gYWN0aXZpdHkgZGlhZ3JhbSBjbGljayBvbiBhbiBhY3Rpdml0eSBvciBhIHRhc2sKLWRlc2NyaXB0b3IuPC9zcGFuPiBBIGJveCB3aXRoIGhhbmRsZXMgPHNwYW4gY2xhc3M9R3JhbUU+aXMgZGlzcGxheWVkPC9zcGFuPgotYXJvdW5kIHRoZSBub2RlLiBVc2UgdGhlIGhhbmRsZXMgb24gdGhlIHNpZGUgb2YgdGhlIGJveCB0byByZWR1Y2Ugb3IgaW5jcmVhc2UKLXRoZSB3aWR0aCBvZiB0aGUgYm94LiBUaGUgbmFtZSBvZiB0aGUgYWN0aXZpdHkgb3IgdGFzayBkZXNjcmlwdG9yIHdpbGwgd3JhcAotd2l0aGluIHRoZSBuZXcgc2l6ZS48L3A+Ci0KLTxoMz5JbXByb3ZlbWVudHMgdG8gR3VpZGFuY2U8L2gzPgotCi08cD5BIG5ldyB0eXBlIG9mIGd1aWRhbmNlIC0gZXN0aW1hdGluZyBjb25zaWRlcmF0aW9ucyA8c3BhbiBjbGFzcz1HcmFtRT5oYXMKLWJlZW4gYWRkZWQ8L3NwYW4+LiBUaGUgZXN0aW1hdGluZyBjb25zaWRlcmF0aW9ucyBndWlkYW5jZSBhbGxvd3MgeW91IHRvIGFkZAotZ3VpZGFuY2UgYXJvdW5kIGhvdyB0byBlc3RpbWF0ZSBlZmZvcnQgZm9yIHRhc2tzIGFuZCB3b3JrIHByb2R1Y3RzLiA8L3A+Ci0KLTxwPkEgZ3VpZGFuY2UgZWxlbWVudCBjYW4gbm93IGhhdmUgYXNzb2NpYXRlZCBndWlkYW5jZSBlbGVtZW50cy4gV2Ugbm93IHN1cHBvcnQKLWFkZGluZyBndWlkYW5jZSBlbGVtZW50cyB0byBvdGhlciBndWlkYW5jZSBlbGVtZW50cyB1c2luZyBhIG5ldyBHdWlkYW5jZSB0YWIgb24KLXRoZSBndWlkYW5jZSBlbGVtZW50IGVkaXRvci48L3A+Ci0KLTxwPkEgVGVtcGxhdGUgY2FuIG5vdyBoYXZlIG11bHRpcGxlIGZpbGUgYXR0YWNobWVudHMuPC9wPgotCi08aDM+U3VwcG9ydCBmb3IgVGVhbSBQcm9maWxlczwvaDM+Ci0KLTxwPkluIGEgcHJvY2Vzcywgcm9sZXMgPHNwYW4gY2xhc3M9R3JhbUU+Y2FuIG5vdyBiZSBvcmdhbml6ZWQ8L3NwYW4+IGludG8KLXRlYW1zLiBZb3UgZG8gdGhpcyBhcyBmb2xsb3dzOjwvcD4KLQotPG9sIHN0YXJ0PTEgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTYgbGV2ZWwxIGxmbzE1O3RhYi1zdG9wczpsaXN0IC41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPk9uIHRoZQotICAgICBUZWFtIEFsbG9jYXRpb24gdmlldyBpbiB0aGUgcHJvY2VzcyBlZGl0b3IsIHJpZ2h0LWNsaWNrIG9uIGFuIGFjdGl2aXR5Ljwvc3Bhbj4KLSAgICAgU2VsZWN0IE5ldyBDaGlsZCBvciBOZXcgU2libGluZywgYW5kIHRoZW4gc2VsZWN0IFRlYW0gUHJvZmlsZS4gVGhlIFRlYW0KLSAgICAgUHJvZmlsZSA8c3BhbiBjbGFzcz1HcmFtRT53aWxsIGJlIGFkZGVkPC9zcGFuPiBhcyBhIGJyZWFrZG93biBlbGVtZW50IGFuZAotICAgICB5b3UgY2FuIGVkaXQgaXRzIGluZm9ybWF0aW9uIGluIHRoZSBwcm9wZXJ0aWVzIHZpZXcuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE2IGxldmVsMSBsZm8xNTt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgYSByb2xlIGRlc2NyaXB0b3IKLSAgICAgYW5kIG9wZW4gdGhlIHByb3BlcnRpZXMgdmlldy4gVGhlIFRlYW0gdGFiIGFsbG93cyB5b3UgdG8gYXNzaWduIHRoZSByb2xlCi0gICAgIHRvIG9uZSBvciBtb3JlIHRlYW1zLjwvbGk+Ci08L29sPgotCi08cD5Zb3UgY2FuIHVzZSB0aGlzIGZlYXR1cmUgdG8gb3JnYW5pemUgdGhlIHJvbGVzIGluIGEgcHJvY2VzcyBpbnRvIHRlYW1zIGFuZAotc3ViLXRlYW1zLiBUaGUgbWFrZS11cCBvZiB0ZWFtcyBjYW4gYmUgZGlmZmVyZW50IGluIGRpZmZlcmVudCBwYXJ0cyBvZiBhCi1wcm9jZXNzLjwvcD4KLQotPGgzPkltcHJvdmVtZW50cyB0byBQdWJsaXNoZWQgV2ViIFNpdGVzPC9oMz4KLQotPHA+VGhlIHB1YmxpY2F0aW9uIG9mIHByb2Nlc3MgaW5mb3JtYXRpb24gPHNwYW4gY2xhc3M9R3JhbUU+aGFzIGJlZW4gaW1wcm92ZWQ8L3NwYW4+Ci1hcyBmb2xsb3dzOjwvcD4KLQotPHVsIHR5cGU9ZGlzYz4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIwIGxldmVsMSBsZm8xODt0YWItc3RvcHM6bGlzdCAuNWluJz5UaGUgV29yayBCcmVha2Rvd24KLSAgICAgU3RydWN0dXJlIHRhYiBub3cgc2hvd3MgYSAmcXVvdDtjb25zb2xpZGF0ZWQgdmlldyZxdW90OyBvZiB0YXNrcyB3aXRoCi0gICAgIHRoZWlyIHJvbGVzIGFuZCB3b3JrIHByb2R1Y3RzLiBUaGUgZGlzcGxheSBpcyBsaW1pdGVkIHRvIDxzcGFuCi0gICAgIGNsYXNzPUdyYW1FPjM8L3NwYW4+IGxldmVscywgc28gc29tZXRpbWVzIHRoZSB0YXNrcyBhbmQgcm9sZXMgbWF5IG5vdCBiZQotICAgICB2aXNpYmxlIGJlY2F1c2UgdGhleSBhcmUgdG9vIGRlZXAgaW4gdGhlIGhpZXJhcmNoeSB0byBiZSBzZWVuLiBUbyBzZWUgdGhlCi0gICAgIGRlZXBlciBsZXZlbHMsIGh5cGVybGluayB0byBhIGxvd2VyIGxldmVsLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwyMCBsZXZlbDEgbGZvMTg7dGFiLXN0b3BzOmxpc3QgLjVpbic+VGhlIFRlYW0gQWxsb2NhdGlvbiB0YWIgbm93Ci0gICAgIHNob3dzIGFsbCByb2xlcyAncm9sbGVkLXVwJyB0byB0aGUgc2VsZWN0ZWQgYWN0aXZpdHkgd2l0aCB0aGVpciBhc3NvY2lhdGVkCi0gICAgIHdvcmsgcHJvZHVjdHMgYW5kIHRhc2tzLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwyMCBsZXZlbDEgbGZvMTg7dGFiLXN0b3BzOmxpc3QgLjVpbic+VGhlIFdvcmsgUHJvZHVjdCBVc2FnZSB0YWIKLSAgICAgbm93IHNob3dzIGFsbCB3b3JrIHByb2R1Y3RzICdyb2xsZWQtdXAnIHRvIHRoZSBzZWxlY3RlZCBhY3Rpdml0eSB3aXRoCi0gICAgIHRoZWlyIGFzc29jaWF0ZWQgd29yayBwcm9kdWN0cyBhbmQgdGFza3MuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDIwIGxldmVsMSBsZm8xODt0YWItc3RvcHM6bGlzdCAuNWluJz5FYWNoIG9mIHRoZSBhYm92ZSB0YWIKLSAgICAgZGlzcGxheXMgcHJvdmlkZSBjb2xsYXBzZSAvIGV4cGFuZCBhdCB0aGUgYWN0aXZpdHkvdGFzaywgcm9sZSBhbmQgd29yawotICAgICBwcm9kdWN0LjwvbGk+Ci08L3VsPgotCi08cD5UaGVzZSBjaGFuZ2VzIHByb3ZpZGUgY2xlYXJlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgPHNwYW4gY2xhc3M9R3JhbUU+cHJvY2VzcwotYW5kIGltcHJvdmUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHJvbGVzPC9zcGFuPiBhbmQgd29yayBwcm9kdWN0cy48L3A+Ci0KLTxoMz5JbXByb3ZlZCBOYXZpZ2F0aW9uIGJldHdlZW4gVmlld3MgYW5kIEVsZW1lbnRzPC9oMz4KLQotPHA+SW4gdGhlIGxpYnJhcnkgdmlldywgeW91IGNhbiBuYXZpZ2F0ZSB0byB2YXJpYWJpbGl0eSBlbGVtZW50cyBmb3IgYSBiYXNlCi1lbGVtZW50LiA8c3BhbiBjbGFzcz1HcmFtRT5SaWdodC1jbGljayBvbiBhbiBlbGVtZW50IGFuZCBzZWxlY3QgJnF1b3Q7T3BlbiB2aWEKLVZhcmlhYmlsaXR5IEVsZW1lbnRzJnF1b3Q7Ljwvc3Bhbj4gQSBzZWxlY3QgZGlhbG9nIDxzcGFuIGNsYXNzPUdyYW1FPmlzIG9wZW5lZDwvc3Bhbj4KLXRoYXQgbGlzdHMgdGhlIGJhc2UgZWxlbWVudCBhbmQgYWxsIHZhcmlhYmlsaXR5IGVsZW1lbnRzIHRoYXQgYXJlIGJhc2VkIG9uIHRoZQotc2VsZWN0ZWQgZWxlbWVudC4gWW91IGNhbiB0aGVuIG9wZW4gYW4gZWxlbWVudCBieSBkb3VibGUtY2xpY2tpbmcgb24gaXQuIFlvdQotY2FuIGFsc28gZG8gdGhpcyBmcm9tIGEgdmFyaWFiaWxpdHkgZWxlbWVudCB0byBmaW5kIHRoZSBiYXNlIGVsZW1lbnQuPC9wPgotCi08cD5UaGUgYWJpbGl0eSB0byBsaW5rIGJldHdlZW4gdGhlIGxpYnJhcnkgdmlldyBhbmQgb3RoZXIgdmlld3MgPHNwYW4KLWNsYXNzPUdyYW1FPmhhcyBiZWVuIGVuaGFuY2VkPC9zcGFuPiBhcyBmb2xsb3dzOjwvcD4KLQotPHVsIHR5cGU9ZGlzYz4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE0IGxldmVsMSBsZm8yMTt0YWItc3RvcHM6bGlzdCAuNWluJz5XaGlsZSBpbiB0aGUgcHJvY2VzcwotICAgICBlZGl0b3IsIHlvdSBjYW4gbGluayBmcm9tIGEgZGVzY3JpcHRvciB0byB0aGUgYmFzZSBtZXRob2QgZWxlbWVudC4gPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+UmlnaHQtY2xpY2sgb24gYSBkZXNjcmlwdG9yIGluIGEgYnJlYWtkb3duIGFuZCBzZWxlY3QKLSAgICAgJnF1b3Q7U2hvdyBMaW5rZWQgRWxlbWVudCBpbiBMaWJyYXJ5IFZpZXcmcXVvdDsuPC9zcGFuPiA8c3BhbiBjbGFzcz1HcmFtRT5UaGVyZQotICAgICBpcyBhbHNvIGEgdG9vbGJhciBidXR0b24gdGhhdDwvc3Bhbj4gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgY29udGV4dAotICAgICBtZW51IGl0ZW0uPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE0IGxldmVsMSBsZm8yMTt0YWItc3RvcHM6bGlzdCAuNWluJz5XaGlsZSBpbiB0aGUgY29uZmlndXJhdGlvbgotICAgICB2aWV3LCB5b3UgY2FuIGxvY2F0ZSBhIG1ldGhvZCBlbGVtZW50IGluIHRoZSBsaWJyYXJ5IHZpZXcuIDxzcGFuCi0gICAgIGNsYXNzPUdyYW1FPlJpZ2h0LWNsaWNrIG9uIGEgcHJvY2VzcyBlbGVtZW50IGFuZCBzZWxlY3QgJnF1b3Q7U2hvdyBpbgotICAgICBMaWJyYXJ5IFZpZXcmcXVvdDsuPC9zcGFuPjwvbGk+Ci08L3VsPgotCi08cD5JbiBlYWNoIGNhc2UsIHRoZSBjb3JyZXNwb25kaW5nIGJhc2UgbWV0aG9kIGVsZW1lbnQgPHNwYW4gY2xhc3M9R3JhbUU+aXMKLWhpZ2hsaWdodGVkPC9zcGFuPiBpbiB0aGUgbGlicmFyeSB2aWV3LiBUaGVyZSBjb3VsZCBiZSBjb250cmlidXRvcnMgdG8gdGhpcwotZWxlbWVudCB0aGF0IGFkZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCByb2xlcywgb3Igd29yayBwcm9kdWN0cy4gWW91IGNhbiB1c2UKLSZxdW90O09wZW4gdmlhIFZhcmlhYmlsaXR5IEVsZW1lbnRzJnF1b3Q7IGRlc2NyaWJlZCBhYm92ZSB0byBsb2NhdGUgdmFyaWFiaWxpdHkKLWVsZW1lbnRzLjwvcD4KLQotPGgzPkEgZmV3IG90aGVyIGltcHJvdmVtZW50czwvaDM+Ci0KLTx1bCB0eXBlPWRpc2M+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxMyBsZXZlbDEgbGZvMjQ7dGFiLXN0b3BzOmxpc3QgLjVpbic+VGhlcmUgYXJlIG5vdyB0b29sYmFyCi0gICAgIGJ1dHRvbnMgaW4gdGhlIHByb2Nlc3MgZWRpdG9yIHRvIG1vdmUgYWN0aXZpdGllcy90YXNrcyB1cCBvciBkb3duLjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxMyBsZXZlbDEgbGZvMjQ7dGFiLXN0b3BzOmxpc3QgLjVpbic+JnF1b3Q7Q29udHJpYnV0ZXMgdG88c3BhbgotICAgICBjbGFzcz1HcmFtRT4uLiZxdW90Ozwvc3Bhbj4gaW5mb3JtYXRpb24gaXMgbm93IG9uIGFsbCB0YWJzIGluIGVkaXRvcnMuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDEzIGxldmVsMSBsZm8yNDt0YWItc3RvcHM6bGlzdCAuNWluJz5Vc2VyIGNhbiBjdXN0b21pemUgd2hhdAotICAgICBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIHByb2Nlc3MgZWRpdG9yczwvbGk+Ci08L3VsPgotCi08aDI+PGEgbmFtZT1sb2NhbGl6ZWQ+PC9hPjxhIG5hbWU9dG9vbGluZz48L2E+S25vd24gRVBGIENvbXBvc2VyIElzc3VlczwvaDI+Ci0KLTxvbCBzdGFydD0xIHR5cGU9MT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE1IGxldmVsMSBsZm8yNzt0YWItc3RvcHM6bGlzdCAuNWluJz5XaGVuIHVzaW5nIHRoZSBuZXcgPGEKLSAgICAgaHJlZj0iI3N5bmNocm9uaXphdGlvbiI+c3luY2hyb25pemF0aW9uIGZlYXR1cmU8L2E+LCBhZnRlciBlYWNoCi0gICAgIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb24gb24gYSBjYXBhYmlsaXR5IHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcywKLSAgICAgcGxlYXNlIHNhdmUgaXQgYmVmb3JlIGRvaW5nIGFub3RoZXIgc3luY2hyb25pemF0aW9uIG9wZXJhdGlvbi4gVGhpcyBpcyB0bwotICAgICBwcmV2ZW50IHRvbyBtYW55IG9iamVjdHMgYmVpbmcgc3RvcmVkIGluIHRoZSB1bmRvIGNvbW1hbmQgc3RhY2suIEhhdmluZwotICAgICB0b28gbXVjaCBpbiB0aGUgdW5kbyBjb21tYW5kIHN0YWNrIG1heSBjYXVzZSB0b28gbXVjaCBtZW1vcnkgY29uc3VtcHRpb24uPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE1IGxldmVsMSBsZm8yNzt0YWItc3RvcHM6bGlzdCAuNWluJz5FUEYgQ29tcG9zZXIgKEVQRikgPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+aXMgbm90IGRlc2lnbmVkPC9zcGFuPiBmb3IgY29uY3VycmVudCB0ZWFtIGF1dGhvcmluZyBvbiB0aGUKLSAgICAgc2FtZSBpbnN0YW5jZSBvZiBhIG1ldGhvZCBsaWJyYXJ5LiBIb3dldmVyLCB0aGVyZSBpcyBhIDxzcGFuIGNsYXNzPVNwZWxsRT53aGl0ZXBhcGVyPC9zcGFuPgotICAgICBvbiAmcXVvdDtVc2luZyBFUEYgd2l0aCBhIFZlcnNpb24gQ29udHJvbCBTeXN0ZW0mcXVvdDsgYXZhaWxhYmxlIG9uIHRoZQotICAgICBFUEYgcHJvamVjdCB3ZWIgc2l0ZSBhdDogPC9saT4KLTwvb2w+Ci0KLTxwIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmLzwvYT48L3A+Ci0KLTxwIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz5UaGlzIGV4cGxhaW5zIGhvdyB5b3UgY2FuIHVzZSBhIHZlcnNpb24gY29udHJvbAotc3lzdGVtIHRvIG1haW50YWluIHlvdXIgRVBGIENvbXBvc2VyIGxpYnJhcnkuPC9wPgotCi08b2wgc3RhcnQ9MyB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxNSBsZXZlbDEgbGZvMjc7dGFiLXN0b3BzOmxpc3QgLjVpbic+SWYgeW91IHVzZSBvbmUgb2YgdGhlCi0gICAgIGZvbGxvd2luZyBFUEYgNy4wLjEgZmVhdHVyZXMgaW4geW91ciBjb250ZW50IGxpYnJhcnksIHlvdSBtYXkgbm90IGJlIGFibGUKLSAgICAgb3BlbiB0aGUgbGlicmFyeSB1c2luZyBFUEYgNy4wIHRvb2wuIDwvbGk+Ci08L29sPgotCi08cCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+QTogQWRkZWQgbW9yZSB0aGFuIG9uZSBhdHRhY2htZW50IHRvIGEgdGVtcGxhdGU8L3A+Ci0KLTxwIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz5COiBDcmVhdGVkIHRlYW0gcHJvZmlsZTwvcD4KLQotPHAgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIGNsYXNzPUdyYW1FPkM6IEN1c3RvbWl6ZWQgYWN0aXZpdHkgZGlhZ3JhbXMKLXRoYXQgY29udGFpbiBzdXBwcmVzc2VkIGFjdGl2aXRpZXMgb3IgdGFza3MuPC9zcGFuPiBUaGVzZSBkaWFncmFtcyB3aWxsIG5vdAotaGF2ZSBhIGRlc2lyYWJsZSBsb29rIHdoZW4gdmlld2VkIHVzaW5nIEVQRiA3LjAsIGJlY2F1c2UgdGhlIHN1cHByZXNzZWQKLWVsZW1lbnRzIHdpbGwgcmVhcHBlYXIuPC9wPgotCi08cCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+WW91IG11c3QgdXNlIEVQRiBDb21wb3NlciB0byB1c2UgYSBsaWJyYXJ5IHdpdGgKLXRoZXNlIGZlYXR1cmVzLjwvcD4KLQotPG9sIHN0YXJ0PTQgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPiZxdW90O0xpbmsgd2l0aAotICAgICBFZGl0b3ImcXVvdDsgYnV0dG9uIGRvZXMgbm90IGxvY2F0ZSBDdXN0b20gQ2F0ZWdvcmllcywgYnV0IHdpbGwgZXhwYW5kCi0gICAgIGRvd24gdG8gdGhlICZxdW90O0N1c3RvbSBDYXRlZ29yaWVzJnF1b3Q7IFVJIGZvbGRlciBpbiB0aGUgTGlicmFyeSBWaWV3LjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0OmwxNSBsZXZlbDEgbGZvMjc7dGFiLXN0b3BzOmxpc3QgLjVpbic+RWRpdG9yIHRleHQgZmllbGRzIDxzcGFuCi0gICAgIGNsYXNzPUdyYW1FPmNhbm5vdCBiZSByZWFkPC9zcGFuPiBpbiBIaWdoIGNvbnRyYXN0IG1vZGUuIFdoZW4gSGlnaAotICAgICBDb250cmFzdCBtb2RlIGlzIDxzcGFuIGNsYXNzPUdyYW1FPmFjdGl2YXRlZDwvc3Bhbj4gYXMgRVBGIGlzIHJ1bm5pbmcsCi0gICAgIHRleHQgaW4gbm9uLXJpY2gtdGV4dCBmaWVsZHMgYmVjb21lcyB1bnJlYWRhYmxlLiBUaGlzIGlzIGFuIEVjbGlwc2UgcGxhdGZvcm0KLSAgICAgYnVnLiBUaGUgd29ya2Fyb3VuZCBpcyB0byByZXN0YXJ0IEVQRi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYQotICAgICBjb25maWd1cmF0aW9uIHRoYXQgPHNwYW4gY2xhc3M9R3JhbUU+aXMgdXNlZDwvc3Bhbj4gYnkgYW4gYWN0aXZlIHByb2Nlc3MKLSAgICAgZWRpdG9yLCB0aGUgY2hhbmdlcyB0byB0aGUgY29uZmlndXJhdGlvbiBhcmUgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVkCi0gICAgIGluIHRoZSBwcm9jZXNzIGVkaXRvci4gVGhlIHdvcmthcm91bmQgaXMgdG8gcmUtc2VsZWN0IHRoZSBjb25maWd1cmF0aW9uCi0gICAgIGFnYWluIGluIHRoZSBjb21ibyBib3ggaW4gdGhlIHRvb2xiYXIgb3IgdXNlIHJlZnJlc2ggaW4gdGhlIGNvbnRleHQgbWVudQotICAgICBvciBjbG9zZSBhbmQgcmVvcGVuIHRoZSBwcm9jZXNzIGVkaXRvci48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkRyYWcgYW5kIGRyb3AgYSBjYXBhYmlsaXR5Ci0gICAgIHBhdHRlcm4gb3IgZGVsaXZlcnkgcHJvY2VzcyBmcm9tIGxpYnJhcnkgdmlldyB0byBhIHJpY2gtdGV4dCBlZGl0b3IgbWF5Ci0gICAgIG5vdCBjcmVhdGUgdGhlIGRlc2lyZWQgbWV0aG9kIGVsZW1lbnQgbGluay4gVG8gY3JlYXRlIGEgbWV0aG9kIGVsZW1lbnQKLSAgICAgbGluayB0byBhIGNhcGFiaWxpdHkgcGF0dGVybiBvciBkZWxpdmVyeSBwcm9jZXNzLCBleHBhbmQgYSByaWNoLXRleHQKLSAgICAgZWRpdG9yLCBjbGljayBvbiAnYWRkIGxpbmsnIGJ1dHRvbiwgc2VsZWN0IHRoZSBkZXNpcmVkIGxpbmsgdHlwZSwgY2xpY2sKLSAgICAgQnJvd3NlLCBuYXZpZ2F0ZSB0byB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MsIGV4cGFuZCBpdAotICAgICBhbmQgc2VsZWN0IHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY2FwYWJpbGl0eSBwYXR0ZXJuIG9yIGRlbGl2ZXJ5IHByb2Nlc3MuPC9saT4KLSA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLSAgICAgbXNvLWxpc3Q6bDE1IGxldmVsMSBsZm8yNzt0YWItc3RvcHM6bGlzdCAuNWluJz5XaW5kb3dzIGhhcyBhIGxpbWl0ZWQKLSAgICAgb3ZlcmFsbCBudW1iZXIgb2Ygc3lzdGVtIGhhbmRsZXMuIFdoZW4gdGhlIHN5c3RlbSBydW5zIG91dCBvZiBzeXN0ZW0KLSAgICAgaGFuZGxlcywgRVBGIHdpbGwgbm90IGZ1bmN0aW9uIHByb3Blcmx5LiBGb3IgZXhhbXBsZSwgZG91YmxlLWNsaWNraW5nIG9uIGEKLSAgICAgbWV0aG9kIGVsZW1lbnQgd2lsbCBub3QgYnJpbmcgdXAgdGhlIGVkaXRvci4gWW91IG5lZWQgdG8gY2xvc2UgRVBGIGFuZAotICAgICBjbG9zZSBvdGhlciBhcHBsaWNhdGlvbnMgdG8gYnJpbmcgdGhlIGF2YWlsYWJsZSBzeXN0ZW0gaGFuZGxlcyB0byBhCi0gICAgIHJlYXNvbmFibGUgbGV2ZWwgYW5kIHN0YXJ0IEVQRiBhZ2Fpbi48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkNoYW5nZXMgbWFkZSB0byB0aGUgYmFzZQotICAgICBBY3Rpdml0eSBEaWFncmFtIG9mIGFuIGFjdGl2aXR5IDxzcGFuIGNsYXNzPUdyYW1FPmFyZSBub3QgYXV0b21hdGljYWxseQotICAgICByZWZsZWN0ZWQ8L3NwYW4+IGluIGFueSBleHRlbnNpb25zIG9mIHRoZSBhY3Rpdml0eS4gVG8gc2VlIHRoZSBjaGFuZ2VzLAotICAgICBvcGVuIHRoZSBBY3Rpdml0eSBEaWFncmFtIG9mIGVhY2ggYWN0aXZpdHkgdGhhdCBleHRlbmRzIHRoZSBtb2RpZmllZCBvbmUsCi0gICAgIHJpZ2h0IGNsaWNrIG9uIHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBkaWFncmFtIGFuZCBjaG9vc2UgJnF1b3Q7UmVmcmVzaCBmcm9tCi0gICAgIEJhc2UmcXVvdDsuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGRpYWdyYW0uIFNhdmUgdGhlIGNoYW5nZS48L2xpPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkluIHRoZSBSaWNoIFRleHQgRWRpdG9yLCBpdAotICAgICBpcyBub3QgcG9zc2libGUgdG8gaW5wdXQgYWNjZW50ZWQgY2hhcmFjdGVycyB0aGF0IHJlcXVpcmUgPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+Mjwvc3Bhbj4ga2V5IGNvbWJpbmF0aW9ucy4gPHNwYW4gY2xhc3M9R3JhbUU+Rm9yIGV4YW1wbGUsICdgJwotICAgICBhbmQgJ2EnIHRvIHByb2R1Y2UgJzxzcGFuIGNsYXNzPVNwZWxsRT7DoDwvc3Bhbj4nLjwvc3Bhbj4gPHNwYW4KLSAgICAgY2xhc3M9R3JhbUU+VGhpcyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIEVjbGlwc2UgU1dUIEJyb3dzZXIgd2lkZ2V0IHRoYXQgd2UKLSAgICAgdXNlLjwvc3Bhbj4gU2VlIDxjb2RlPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTMxMDE3PC9zcGFuPjwvY29kZT4KLSAgICAgZm9yIG1vcmUgaW5mby4gV29ya2Fyb3VuZHMgYXJlOjwvbGk+Ci0gPHVsIHR5cGU9Y2lyY2xlPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxNSBsZXZlbDIgbGZvMjc7dGFiLXN0b3BzOmxpc3QgMS4waW4nPlVzZSBBbHQga2V5IGNvZGVzIHRvCi0gICAgICBlbnRlciB0aGUgYWNjZW50ZWQgY2hhcmFjdGVycy4gRm9yIGEgbGlzdGluZyBvZiBBbHQga2V5IGNvZGVzIG9uIFdpbmRvd3MsCi0gICAgICBzZWUgPGNvZGU+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmh0dHA6Ly90bHQuaXRzLnBzdS5lZHUvc3VnZ2VzdGlvbnMvaW50ZXJuYXRpb25hbC9hY2NlbnRzL2NvZGVhbHQuaHRtbDwvc3Bhbj48L2NvZGU+LjwvbGk+Ci0gIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDoKLSAgICAgIGF1dG87bXNvLWxpc3Q6bDE1IGxldmVsMiBsZm8yNzt0YWItc3RvcHM6bGlzdCAxLjBpbic+VHlwZSB0aGUgYWNjZW50ZWQKLSAgICAgIGNoYXJhY3RlcnMgaW4gYSA8c3BhbiBjbGFzcz1HcmFtRT5ub24gcmljaDwvc3Bhbj4gdGV4dCBmaWVsZCAobGlrZSBCcmllZgotICAgICAgRGVzY3JpcHRpb24pLCBhbmQgY3V0IGFuZCBwYXN0ZSB0aGUgY2hhcmFjdGVycyBvbnRvIHRoZSByaWNoIHRleHQgZmllbGQKLSAgICAgIG9yIGVkaXRvci48L2xpPgotICA8bGkgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6Ci0gICAgICBhdXRvO21zby1saXN0OmwxNSBsZXZlbDIgbGZvMjc7dGFiLXN0b3BzOmxpc3QgMS4waW4nPkV4cGFuZCB0aGUgcmljaCB0ZXh0Ci0gICAgICBmaWVsZCwgc2VsZWN0IHRoZSBIVE1MIHRhYiBhbmQgZW50ZXIgdGhlIGFjY2VudGVkIGNoYXJhY3RlcnMgaW4gdGhlIEhUTUwKLSAgICAgIHNvdXJjZSBlZGl0b3IuPC9saT4KLSA8L3VsPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsMTUgbGV2ZWwxIGxmbzI3O3RhYi1zdG9wczpsaXN0IC41aW4nPkluIHRoZSBSaWNoIFRleHQgRWRpdG9yLAotICAgICBmb3JtYXR0aW5nIG9mIHRleHQgaW5zaWRlICZsdDtwcmUmZ3Q7Li4uJmx0Oy9wcmUmZ3Q7IG1heSBub3QgYmUgZnVsbHkKLSAgICAgcHJlc2VydmVkLjwvbGk+Ci08L29sPgotCi08aDI+VmVyc2lvbiBjb250cm9sIHN1cHBvcnQgaW4gRVBGPG86cD48L286cD48L2gyPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxzcGFuIGNsYXNzPVNwZWxsRT48Yj48aT5DbGVhckNhc2U8L2k+PC9iPjwvc3Bhbj48Yj48aT4KLVJlbW90ZSBDbGllbnQgKENDUkMpPG86cD48L286cD48L2k+PC9iPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi4yNWluJz48Yj5JbnN0YWxsIENDUkMgZnJvbSA8c3BhbiBjbGFzcz1TcGVsbEU+Q2xlYXJDYXNlPC9zcGFuPgotc2VydmVyPG86cD48L286cD48L2I+PC9wPgotCi08b2wgc3RhcnQ9MSB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz48c3BhbiBjbGFzcz1HcmFtRT5NZW51IEhlbHAKLSAgICAgLyBTb2Z0d2FyZSBVcGRhdGVzIC8gRmluZCBhbmQgSW5zdGFsbOKApjwvc3Bhbj48bzpwPjwvbzpwPjwvbGk+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0OgotICAgICBub3JtYWwnPlNlYXJjaCBmb3IgbmV3IGZlYXR1cmVzIHRvIGluc3RhbGwgPC9iPnRoZW4gY2xpY2sgPGIKLSAgICAgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0Om5vcm1hbCc+TmV4dDwvYj48YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZXR5cGUgaWQ9Il94MDAwMF90NzUiIGNvb3Jkc2l6ZT0iMjE2MDAsMjE2MDAiCi0gICAgICBvOnNwdD0iNzUiIG86cHJlZmVycmVsYXRpdmU9InQiIHBhdGg9Im1ANEA1bEA0QDExQDlAMTFAOUA1eGUiIGZpbGxlZD0iZiIKLSAgICAgIHN0cm9rZWQ9ImYiPgotICAgICAgPHY6c3Ryb2tlIGpvaW5zdHlsZT0ibWl0ZXIiLz4KLSAgICAgIDx2OmZvcm11bGFzPgotICAgICAgIDx2OmYgZXFuPSJpZiBsaW5lRHJhd24gcGl4ZWxMaW5lV2lkdGggMCIvPgotICAgICAgIDx2OmYgZXFuPSJzdW0gQDAgMSAwIi8+Ci0gICAgICAgPHY6ZiBlcW49InN1bSAwIDAgQDEiLz4KLSAgICAgICA8djpmIGVxbj0icHJvZCBAMiAxIDIiLz4KLSAgICAgICA8djpmIGVxbj0icHJvZCBAMyAyMTYwMCBwaXhlbFdpZHRoIi8+Ci0gICAgICAgPHY6ZiBlcW49InByb2QgQDMgMjE2MDAgcGl4ZWxIZWlnaHQiLz4KLSAgICAgICA8djpmIGVxbj0ic3VtIEAwIDAgMSIvPgotICAgICAgIDx2OmYgZXFuPSJwcm9kIEA2IDEgMiIvPgotICAgICAgIDx2OmYgZXFuPSJwcm9kIEA3IDIxNjAwIHBpeGVsV2lkdGgiLz4KLSAgICAgICA8djpmIGVxbj0ic3VtIEA4IDIxNjAwIDAiLz4KLSAgICAgICA8djpmIGVxbj0icHJvZCBANyAyMTYwMCBwaXhlbEhlaWdodCIvPgotICAgICAgIDx2OmYgZXFuPSJzdW0gQDEwIDIxNjAwIDAiLz4KLSAgICAgIDwvdjpmb3JtdWxhcz4KLSAgICAgIDx2OnBhdGggbzpleHRydXNpb25vaz0iZiIgZ3JhZGllbnRzaGFwZW9rPSJ0IiBvOmNvbm5lY3R0eXBlPSJyZWN0Ii8+Ci0gICAgICA8bzpsb2NrIHY6ZXh0PSJlZGl0IiBhc3BlY3RyYXRpbz0idCIvPgotICAgICA8L3Y6c2hhcGV0eXBlPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMjUiIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6NmluOwotICAgICAgaGVpZ2h0OjM4MS43NXB0Jz4KLSAgICAgIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDEucG5nIiBvOnRpdGxlPSIiLz4KLSAgICAgPC92OnNoYXBlPjwhW2VuZGlmXS0tPjwhW2lmICF2bWxdPjxpbWcgYm9yZGVyPTAgd2lkdGg9NTc2IGhlaWdodD01MDkKLSAgICAgc3JjPSJyZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAyLmpwZyIgdjpzaGFwZXM9Il94MDAwMF9pMTAyNSI+PCFbZW5kaWZdPjwvbGk+Ci08L29sPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvJz48bzpwPiZuYnNwOzwvbzpwPjwvcD4KLQotPG9sIHN0YXJ0PTMgdHlwZT0xPgotIDxsaSBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotICAgICBtc28tbGlzdDpsNyBsZXZlbDEgbGZvMzA7dGFiLXN0b3BzOmxpc3QgLjVpbic+RW50ZXIgbmV3IHJlbW90ZSB1cGRhdGUgc2l0ZQotICAgICBmb3IgQ0NSQzxicj4KLSAgICAgPCEtLVtpZiBndGUgdm1sIDFdPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMjYiIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6MjY3cHQ7Ci0gICAgICBoZWlnaHQ6MTEwLjI1cHQnPgotICAgICAgPHY6aW1hZ2VkYXRhIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMy5wbmciIG86dGl0bGU9IiIvPgotICAgICA8L3Y6c2hhcGU+PCFbZW5kaWZdLS0+PCFbaWYgIXZtbF0+PGltZyBib3JkZXI9MCB3aWR0aD0zNTYgaGVpZ2h0PTE0NwotICAgICBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDQuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI2Ij48IVtlbmRpZl0+PGJyPgotICAgICA8YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDMzIiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSAgICAgIGhlaWdodDozODEuNzVwdCc+Ci0gICAgICA8djppbWFnZWRhdGEgc3JjPSJyZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA1LnBuZyIgbzp0aXRsZT0iIi8+Ci0gICAgIDwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NTA5Ci0gICAgIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNi5qcGciIHY6c2hhcGVzPSJfeDAwMDBfaTEwMzMiPjwhW2VuZGlmXT48YnI+Ci0gICAgIHRoZW4gY2xpY2sgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0Om5vcm1hbCc+RmluaXNoPC9iPjxvOnA+PC9vOnA+PC9saT4KLTwvb2w+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08b2wgc3RhcnQ9NCB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5TZWxlY3QgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0OgotICAgICBub3JtYWwnPlJhdGlvbmFsIDxzcGFuIGNsYXNzPVNwZWxsRT5DbGVhckNhc2U8L3NwYW4+IFJlbW90ZSBDbGllbnQgZm9yCi0gICAgIEVjbGlwc2U8L2I+IHRoZW4gY2xpY2sgPGIgc3R5bGU9J21zby1iaWRpLWZvbnQtd2VpZ2h0Om5vcm1hbCc+TmV4dDwvYj48YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDMyIiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSAgICAgIGhlaWdodDo1aW4nPgotICAgICAgPHY6aW1hZ2VkYXRhIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNy5wbmciIG86dGl0bGU9IiIvPgotICAgICA8L3Y6c2hhcGU+PCFbZW5kaWZdLS0+PCFbaWYgIXZtbF0+PGltZyBib3JkZXI9MCB3aWR0aD01NzYgaGVpZ2h0PTQ4MAotICAgICBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDguanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDMyIj48IVtlbmRpZl0+PC9saT4KLTwvb2w+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08b2wgc3RhcnQ9NSB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5Gb2xsb3cgdGhlIG9uLXNjcmVlbgotICAgICBpbnN0cnVjdGlvbnMgdG8gaW5zdGFsbCBDQ1JDIHRvIFJNQzxicj4KLSAgICAgPCEtLVtpZiBndGUgdm1sIDFdPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMzEiIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6NmluOwotICAgICAgaGVpZ2h0OjVpbic+Ci0gICAgICA8djppbWFnZWRhdGEgc3JjPSJyZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA5LnBuZyIgbzp0aXRsZT0iIi8+Ci0gICAgIDwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NDgwCi0gICAgIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMC5qcGciIHY6c2hhcGVzPSJfeDAwMDBfaTEwMzEiPjwhW2VuZGlmXT48YnIKLSAgICAgc3R5bGU9J21zby1zcGVjaWFsLWNoYXJhY3RlcjpsaW5lLWJyZWFrJz4KLSAgICAgPCFbaWYgIXN1cHBvcnRMaW5lQnJlYWtOZXdMaW5lXT48YnIgc3R5bGU9J21zby1zcGVjaWFsLWNoYXJhY3RlcjpsaW5lLWJyZWFrJz4KLSAgICAgPCFbZW5kaWZdPjwvbGk+Ci08L29sPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvJz48bzpwPiZuYnNwOzwvbzpwPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi41aW4nPjwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDMwIiB0eXBlPSIjX3gwMDAwX3Q3NSIKLSBzdHlsZT0nd2lkdGg6NmluO2hlaWdodDo1aW4nPgotIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTEucG5nIiBvOnRpdGxlPSIiLz4KLTwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NDgwCi1zcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTIuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDMwIj48IVtlbmRpZl0+PGJyCi1zdHlsZT0nbXNvLXNwZWNpYWwtY2hhcmFjdGVyOmxpbmUtYnJlYWsnPgotPCFbaWYgIXN1cHBvcnRMaW5lQnJlYWtOZXdMaW5lXT48YnIgc3R5bGU9J21zby1zcGVjaWFsLWNoYXJhY3RlcjpsaW5lLWJyZWFrJz4KLTwhW2VuZGlmXT48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG8nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08b2wgc3RhcnQ9NiB0eXBlPTE+Ci0gPGxpIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0gICAgIG1zby1saXN0Omw3IGxldmVsMSBsZm8zMDt0YWItc3RvcHM6bGlzdCAuNWluJz5DbGljayBvbiA8YgotICAgICBzdHlsZT0nbXNvLWJpZGktZm9udC13ZWlnaHQ6bm9ybWFsJz5JbnN0YWxsIEFsbDwvYj4gd2hlbiB5b3Ugc2VlIHRoZSBiZWxvdwotICAgICBzY3JlZW48YnI+Ci0gICAgIDwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDI5IiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSAgICAgIGhlaWdodDo1aW4nPgotICAgICAgPHY6aW1hZ2VkYXRhIHNyYz0icmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMy5wbmciIG86dGl0bGU9IiIvPgotICAgICA8L3Y6c2hhcGU+PCFbZW5kaWZdLS0+PCFbaWYgIXZtbF0+PGltZyBib3JkZXI9MCB3aWR0aD01NzYgaGVpZ2h0PTQ4MAotICAgICBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTQuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI5Ij48IVtlbmRpZl0+PGJyCi0gICAgIHN0eWxlPSdtc28tc3BlY2lhbC1jaGFyYWN0ZXI6bGluZS1icmVhayc+Ci0gICAgIDwhW2lmICFzdXBwb3J0TGluZUJyZWFrTmV3TGluZV0+PGJyIHN0eWxlPSdtc28tc3BlY2lhbC1jaGFyYWN0ZXI6bGluZS1icmVhayc+Ci0gICAgIDwhW2VuZGlmXT48L2xpPgotPC9vbD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi41aW4nPkNsaWNrIG9uIDxiIHN0eWxlPSdtc28tYmlkaS1mb250LXdlaWdodDpub3JtYWwnPkFwcGx5IENoYW5nZXM8L2I+Ci13aGVuIHlvdSBzZWUgdGhlIGZvbGxvd2luZyBkaWFsb2cgYm94PGJyPgotPCEtLVtpZiBndGUgdm1sIDFdPjx2OnNoYXBlIGlkPSJfeDAwMDBfaTEwMjciIHR5cGU9IiNfeDAwMDBfdDc1IiBzdHlsZT0nd2lkdGg6MzMwLjc1cHQ7Ci0gaGVpZ2h0OjEwOS41cHQnPgotIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTUucG5nIiBvOnRpdGxlPSIiLz4KLTwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTQ0MSBoZWlnaHQ9MTQ2Ci1zcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTYuanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI3Ij48IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87bXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci1tYXJnaW4tbGVmdDouMjVpbic+PGI+PGk+Q1ZTPG86cD48L286cD48L2k+PC9iPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzttc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLW1hcmdpbi1sZWZ0Oi4yNWluJz48Yj5TZXR0aW5nIHVwPGJyPgotPC9iPjwhLS1baWYgZ3RlIHZtbCAxXT48djpzaGFwZSBpZD0iX3gwMDAwX2kxMDI4IiB0eXBlPSIjX3gwMDAwX3Q3NSIgc3R5bGU9J3dpZHRoOjZpbjsKLSBoZWlnaHQ6MzkwLjc1cHQnPgotIDx2OmltYWdlZGF0YSBzcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTcucG5nIiBvOnRpdGxlPSIiLz4KLTwvdjpzaGFwZT48IVtlbmRpZl0tLT48IVtpZiAhdm1sXT48aW1nIGJvcmRlcj0wIHdpZHRoPTU3NiBoZWlnaHQ9NTIxCi1zcmM9InJlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTguanBnIiB2OnNoYXBlcz0iX3gwMDAwX2kxMDI4Ij48IVtlbmRpZl0+PGI+PG86cD48L286cD48L2I+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21zby1tYXJnaW4tdG9wLWFsdDphdXRvO21zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotbWFyZ2luLWxlZnQ6LjI1aW4nPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvZmlsZWxpc3QueG1sIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ZpbGVsaXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzNGU4MS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvZmlsZWxpc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAot77u/PHhtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiPgotIDxvOk1haW5GaWxlIEhSZWY9Ii4uL3JlbGVhc2Utbm90ZXMuaHRtbCIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMDEucG5nIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAwMi5qcGciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDAzLnBuZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMDQuanBnIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAwNS5wbmciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDA2LmpwZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMDcucG5nIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAwOC5qcGciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDA5LnBuZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMTAuanBnIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAxMS5wbmciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDEyLmpwZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMTMucG5nIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAxNC5qcGciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDE1LnBuZyIvPgotIDxvOkZpbGUgSFJlZj0iaW1hZ2UwMTYuanBnIi8+Ci0gPG86RmlsZSBIUmVmPSJpbWFnZTAxNy5wbmciLz4KLSA8bzpGaWxlIEhSZWY9ImltYWdlMDE4LmpwZyIvPgotIDxvOkZpbGUgSFJlZj0iZmlsZWxpc3QueG1sIi8+Ci08L3htbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDEucG5nIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMmYzNS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAyLmpwZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWMwMDQuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDAyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMy5wbmcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNkZjBiLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDQuanBnIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkM2EyYy4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDQuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA1LnBuZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2I4NTUuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNi5qcGcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDYuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDg0ZWUwLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwNi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDcucG5nIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMDIyMC4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA4LmpwZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwOC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjEzZWMuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDA4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwOS5wbmcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODllNzE0Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAwOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTAuanBnIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDEwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlMjRhYS4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDExLnBuZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDc2M2MuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMi5qcGcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjgxOWQxLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTMucG5nIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0MmU2Yy4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE0LmpwZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjZlODcuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNS5wbmcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU2MjVhLi4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTYuanBnIGIvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkNzBmMC4uMDAwMDAwMAotLS0gYS8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE3LnBuZyBiLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxNy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTRlOWUuLjAwMDAwMDAKLS0tIGEvMS41L3JlbGVuZy9yZWxlYXNlLW5vdGVzX2ZpbGVzL2ltYWdlMDE3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxOC5qcGcgYi8xLjUvcmVsZW5nL3JlbGVhc2Utbm90ZXNfZmlsZXMvaW1hZ2UwMTguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzY3NTM4Li4wMDAwMDAwCi0tLSBhLzEuNS9yZWxlbmcvcmVsZWFzZS1ub3Rlc19maWxlcy9pbWFnZTAxOC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0ZTU5ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY0NTg2OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBDb21tb24gVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzk5NzIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0IHN1aXRlIGZvciBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbW1vblRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShDb21tb25UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJVdGlsVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYTUxVdGlsVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWZXJzaW9uVXRpbFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRVBGVmVyc2lvbnNUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVQRlZlcnNpb25UZXN0LmNsYXNzKTsKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0ZDJhZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5WZXJzaW9uVXRpbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEVQRlZlcnNpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVQRlZlcnNpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUb29sVmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjIiKSx2ZXJzaW9uLmdldFRvb2xWZXJzaW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMaWJyYXJ5VmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAuNC4xIiksdmVyc2lvbi5nZXRMaWJyYXJ5VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WE1MU2NoZW1hVmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAuMSIpLHZlcnNpb24uZ2V0WE1MU2NoZW1hVmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvb2xWZXJzaW9uVG8oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlVG9vbFZlcnNpb25UbyhuZXcgVmVyc2lvbigiMS4yIikpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMyIpKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZVRvb2xWZXJzaW9uVG8obmV3IFZlcnNpb24oIjAuOSIpKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlTGlicmFyeVZlcnNpb25UbygpIHsKLQkJRVBGVmVyc2lvbiB2ZXJzaW9uID0gVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCkuZ2V0Q3VycmVudFZlcnNpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuNC4xIikpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb24uY29tcGFyZUxpYnJhcnlWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMC40LjIiKSkgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVMaWJyYXJ5VmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuMi4wIikpID4gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8oKSB7Ci0JCUVQRlZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpLmdldEN1cnJlbnRWZXJzaW9uKCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIxLjAuMSIpKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmNvbXBhcmVYTUxTY2hlbWFWZXJzaW9uVG8obmV3IFZlcnNpb24oIjEuMC4yIikpIDwgMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbi5jb21wYXJlWE1MU2NoZW1hVmVyc2lvblRvKG5ldyBWZXJzaW9uKCIwLjkuOSIpKSA+IDApOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvRVBGVmVyc2lvbnNUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUyZWZlZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9FUEZWZXJzaW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnNlcnZpY2UudmVyc2lvbmluZy5FUEZWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLkVQRlZlcnNpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24uc2VydmljZS52ZXJzaW9uaW5nLlZlcnNpb25VdGlsOwotCi1wdWJsaWMgY2xhc3MgRVBGVmVyc2lvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVQRlZlcnNpb25zVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VycmVudFZlcnNpb24oKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gKEVQRlZlcnNpb25zKVZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEVQRlZlcnNpb24oIjEuMiIsIjEuMC40LjEiLCIxLjAuMSIpLCB2ZXJzaW9ucy5nZXRDdXJyZW50VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmVyc2lvbigpIHsKLQkJRVBGVmVyc2lvbnMgdmVyc2lvbnMgPSAoRVBGVmVyc2lvbnMpVmVyc2lvblV0aWwuZ2V0VmVyc2lvbnMoRVBGVmVyc2lvbnMuVE9PTF9JRCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRVBGVmVyc2lvbigiMS4wIiwiMS4wLjMuMCIsIjEuMC4wIiksIHZlcnNpb25zLmdldFZlcnNpb24oIjEuMCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsVmVyc2lvbnMoKSB7Ci0JCUVQRlZlcnNpb25zIHZlcnNpb25zID0gKEVQRlZlcnNpb25zKVZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlMaXN0IGV4cGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZXhwZWN0ZWRMaXN0LmFkZChuZXcgRVBGVmVyc2lvbigiMS4wIiwiMS4wLjMuMCIsIjEuMC4wIikpOwotCQlleHBlY3RlZExpc3QuYWRkKG5ldyBFUEZWZXJzaW9uKCIxLjEiLCIxLjAuNC4wIiwiMS4wLjAiKSk7Ci0JCWV4cGVjdGVkTGlzdC5hZGQobmV3IEVQRlZlcnNpb24oIjEuMiIsIjEuMC40LjEiLCIxLjAuMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTGlzdCwgdmVyc2lvbnMuZ2V0QWxsVmVyc2lvbnMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9TdHJVdGlsVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvU3RyVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwYTQ0ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9TdHJVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbCBjbGFzc2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0clV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN0clV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBTdHJVdGlsLmlzTnVsbCgpIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc051bGwobnVsbCkpOwotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNOdWxsKCIiKSk7Ci0JICAgIGFzc2VydEZhbHNlKFN0clV0aWwuaXNOdWxsKCJIZWxsbyIpKTsJICAgIAotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgU3RyVXRpbC5pc0JsYW5rKCkgbWV0aG9kLgotCSAqLwkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNCbGFuaygpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBhc3NlcnRUcnVlKFN0clV0aWwuaXNCbGFuayhudWxsKSk7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc0JsYW5rKCIiKSk7Ci0JICAgIGFzc2VydEZhbHNlKFN0clV0aWwuaXNCbGFuaygiSGVsbG8iKSk7CSAgICAKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvVmVyc2lvblV0aWxUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9WZXJzaW9uVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5YTAwOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9WZXJzaW9uVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuRVBGVmVyc2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi5zZXJ2aWNlLnZlcnNpb25pbmcuVmVyc2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLQotcHVibGljIGNsYXNzIFZlcnNpb25VdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBWZXJzaW9uVXRpbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbFRvb2xJRHMoKSB7Ci0JCVNldCB0b29sSURzID0gVmVyc2lvblV0aWwuZ2V0QWxsVG9vbElEcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0b29sSURzLml0ZXJhdG9yKCk7aXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgdG9vbElEID0gKFN0cmluZylpdGVyLm5leHQoKTsKLQkJCWFzc2VydFRydWUodG9vbElELmVxdWFscygiZXBmIikgfHwgdG9vbElELmVxdWFscygicm1jIikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb25zKCkgewotCQlFUEZWZXJzaW9ucyB2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLmdldFZlcnNpb25zKEVQRlZlcnNpb25zLlRPT0xfSUQpOwotCQlhc3NlcnROb3ROdWxsKHZlcnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpIHsKLQkJYXNzZXJ0RmFsc2UoVmVyc2lvblV0aWwuaXNWZXJzaW9uQ2hlY2tpbmdEaXNhYmxlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlYWRWZXJzaW9uc0Zyb21GaWxlKCkgewotCQkvLyB0ZXN0IG5vLXZlcnNpb25zLWluLWZpbGUgY2FzZQotCQlGaWxlIHhtaUZpbGUgPSBjcmVhdGVUZXN0WE1JRmlsZSgiIik7Ci0JCWlmICh4bWlGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlNYXAgdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9ucyk7Ci0JCXhtaUZpbGUuZGVsZXRlKCk7Ci0JCi0JCS8vIHRlc3QgZXBmLW9ubHkgY2FzZQotCQl4bWlGaWxlID0gY3JlYXRlVGVzdFhNSUZpbGUoImVwZjp2ZXJzaW9uPVwiMS4wLjBcIiIpOwotCQlpZiAoeG1pRmlsZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJU3RyaW5nIGVwZlZlciA9IChTdHJpbmcpdmVyc2lvbnMuZ2V0KCJlcGYiKTsKLQkJYXNzZXJ0VHJ1ZShlcGZWZXIuZXF1YWxzKCIxLjAuMCIpKTsKLQkJeG1pRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBtdWx0aXBsZSB2ZXJzaW9ucyBjYXNlCi0JCXhtaUZpbGUgPSBjcmVhdGVUZXN0WE1JRmlsZSgiZXBmOnZlcnNpb249XCIxLjAuMFwiIHJtYzp2ZXJzaW9uPVwiNy4xLjBcIiIpOwotCQlpZiAoeG1pRmlsZSA9PSBudWxsKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJdmVyc2lvbnMgPSBWZXJzaW9uVXRpbC5yZWFkVmVyc2lvbnNGcm9tRmlsZSh4bWlGaWxlKTsKLQkJZXBmVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoImVwZiIpOwotCQlTdHJpbmcgcm1jVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoInJtYyIpOwotCQlhc3NlcnRUcnVlKGVwZlZlci5lcXVhbHMoIjEuMC4wIikpOwotCQlhc3NlcnRUcnVlKHJtY1Zlci5lcXVhbHMoIjcuMS4wIikpOwotCQl4bWlGaWxlLmRlbGV0ZSgpOwotCQkKLQkJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkJLy8gdGVzdCBYTUwgZmlsZQotCQkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCQkvLyB0ZXN0IG5vLXZlcnNpb25zLWluLWZpbGUgY2FzZQotCQlGaWxlIHhtbEZpbGUgPSBjcmVhdGVUZXN0WE1MRmlsZSgiIik7Ci0JCWlmICh4bWxGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtbEZpbGUpOwotCQlhc3NlcnROdWxsKHZlcnNpb25zKTsKLQkJeG1sRmlsZS5kZWxldGUoKTsKLQkKLQkJLy8gdGVzdCBlcGYtb25seSBjYXNlCi0JCXhtbEZpbGUgPSBjcmVhdGVUZXN0WE1MRmlsZSgidG9vbD1cImVwZj0xLjAuMFwiIik7Ci0JCWlmICh4bWxGaWxlID09IG51bGwpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQl2ZXJzaW9ucyA9IFZlcnNpb25VdGlsLnJlYWRWZXJzaW9uc0Zyb21GaWxlKHhtbEZpbGUpOwotCQllcGZWZXIgPSAoU3RyaW5nKXZlcnNpb25zLmdldCgiZXBmIik7Ci0JCWFzc2VydFRydWUoZXBmVmVyLmVxdWFscygiMS4wLjAiKSk7Ci0JCXhtbEZpbGUuZGVsZXRlKCk7Ci0JCi0JCS8vIHRlc3QgbXVsdGlwbGUgdmVyc2lvbnMgY2FzZQotCQl4bWxGaWxlID0gY3JlYXRlVGVzdFhNTEZpbGUoInRvb2w9XCJlcGY9MS4wLjA7cm1jPTcuMS4wXCIiKTsKLQkJaWYgKHhtbEZpbGUgPT0gbnVsbCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXZlcnNpb25zID0gVmVyc2lvblV0aWwucmVhZFZlcnNpb25zRnJvbUZpbGUoeG1sRmlsZSk7Ci0JCWVwZlZlciA9IChTdHJpbmcpdmVyc2lvbnMuZ2V0KCJlcGYiKTsKLQkJcm1jVmVyID0gKFN0cmluZyl2ZXJzaW9ucy5nZXQoInJtYyIpOwotCQlhc3NlcnRUcnVlKGVwZlZlci5lcXVhbHMoIjEuMC4wIikpOwotCQlhc3NlcnRUcnVlKHJtY1Zlci5lcXVhbHMoIjcuMS4wIikpOwotCQl4bWxGaWxlLmRlbGV0ZSgpOwotCX0KLQkKLQlwcml2YXRlIEZpbGUgY3JlYXRlVGVzdFhNSUZpbGUoU3RyaW5nIHZlcnNpb25BdHRyaWJ1dGVzKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIHhtaUZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJFUEZfSlVOSVRfIiwgIi54bWkiKTsKLQkJCVN0cmluZyB4bWlUZXh0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIgKwotCQkJICAgICJcbjx4bWk6WE1JIHhtaTp2ZXJzaW9uPVwiMi4wXCIgeG1sbnM6eG1pPVwiaHR0cDovL3d3dy5vbWcub3JnL1hNSVwiIiArCi0JCQkgICAgIiB4bWxuczp4c2k9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZVwiIiArCi0JCQkgICAgIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPVwiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZVwiIiArIAotCQkJICAgICIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9XCJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlXCIgIiArIAotCQkJICAgIHZlcnNpb25BdHRyaWJ1dGVzICsgIj5cbi4uLlxuPC94bWk6WE1JPlxuIjsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoeG1pRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1pVGV4dCk7Ci0JCQlyZXR1cm4geG1pRmlsZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGNyZWF0ZVRlc3RYTUxGaWxlKFN0cmluZyB2ZXJzaW9uQXR0cmlidXRlcykgewotCQl0cnkgewotCQkJRmlsZSB4bWxGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiRVBGX0pVTklUXyIsICIueG1sIik7Ci0JCQlTdHJpbmcgeG1sVGV4dCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iICsKLQkJCQkiXG48dW1hOk1ldGhvZExpYnJhcnkgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiIgKwotCQkJCSJ4bWxuczp1bWE9XCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjNcIiAiICsKLQkJCQl2ZXJzaW9uQXR0cmlidXRlcyArCi0JCQkJIiBuYW1lPVwiYVwiIGJyaWVmRGVzY3JpcHRpb249XCJcIiBpZD1cIl9IVm5HOERMNUVkdTQyTjBYUzdvblVnXCIiICsKLQkJCQkib3JkZXJpbmdHdWlkZT1cIlwiIHN1cHByZXNzZWQ9XCJmYWxzZVwiIGF1dGhvcnM9XCJcIiBjaGFuZ2VEZXNjcmlwdGlvbj1cIlwiIHZlcnNpb249XCJcIj4iICsKLQkJCQkiXG4uLi5cbjwvdW1hOk1ldGhvZExpYnJhcnk+IjsKLQkJCUZpbGVVdGlsLndyaXRlVVRGOEZpbGUoeG1sRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgeG1sVGV4dCk7Ci0JCQlyZXR1cm4geG1sRmlsZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9YTUxVdGlsVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9jb21tb24vdGVzdHMvWE1MVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljZjJjMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2NvbW1vbi90ZXN0cy9YTUxVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3Igb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFhNTFV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgWE1MVXRpbC5lc2NhcGVBdHRyKCkgbWV0aG9kLgotCSAqLwkKLQlwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlQXR0cigpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBTdHJpbmcgcmVzdWx0ID0gWE1MVXRpbC5lc2NhcGUoIjxiPkhlbGxvPC9iPiIpOwotCSAgICBhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIiZsdDtiJmd0O0hlbGxvJmx0Oy9iJmd0OyIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGI4OTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTcyZmQwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEVQRiBEaWFncmFtIFRlc3RzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMuRGlhZ3JhbVRlc3RQbHVnaW4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuanVuaXQsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcGYudW1hLAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LAotIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnhtaSwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cywKLSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5jb3JlLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLmFkLAotIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWksCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdENhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDcxYTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0qIFRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgRGlhZ3JhbSBKVW5pdCB0ZXN0IGNhc2VzLgotKiAKLSogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSogQHNpbmNlIDEuMgotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFncmFtVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgTWV0aG9kTGlicmFyeSBsaWJyYXJ5OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsZXRlTGlicmFyeU9uRXhpdCA9IGZhbHNlOwotCi0JcHVibGljIERpYWdyYW1UZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUZXN0TWV0aG9kTGlicmFyeSgpOwotCQkKLQkJLy8gYWN0aXZhdGUgdGhlIEF1dGhvcmluZyBwbHVnaW5zIHRvIGluaXRpYWxpemUgc29tZXRoaW5nCi0JCS8vIHRoZSByZWFzb24gdG8gcHV0IGl0IGFmdGVyIHRoZSBsaWJyYXJ5IGlzIGNyZWF0ZWQgaXMgdG8gYXZvaWQgdGhlIE9wZW4gTGlicmFyeSBkaWFsb2cKLQkJQXV0aG9yaW5nVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0UGx1Z2luLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9kaWFncmFtL3Rlc3RzL0RpYWdyYW1UZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDQ0N2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdFBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy9BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vL2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy93aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy9odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vQ29udHJpYnV0b3JzOgotLy9JQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udWkuQWJzdHJhY3RQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotKiBUaGUgVGVzdHMgcGx1Zy1pbiBjbGFzcy4KLSogCi0qIEBhdXRob3IJU2hpbHBhIFRvcmFza2FyCi0qIEBzaW5jZQkxLjIKLSovCi1wdWJsaWMgY2xhc3MgRGlhZ3JhbVRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBEaWFncmFtVGVzdFBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIERpYWdyYW1UZXN0UGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBEaWFncmFtVGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBEaWFncmFtVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ODM4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0IHN1aXRlIGZvciBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS4KLSAqIAotICogQGF1dGhvciBTaGlscGEgVG9yYXNrYXIKLSAqIEBzaW5jZSAxLjIKLSAqLwotcHVibGljIGNsYXNzIERpYWdyYW1UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRGlhZ3JhbVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERpYWdyYW1VSVNlcnZpY2VUZXN0LmNsYXNzKTsKLQkJCi0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVUlTZXJ2aWNlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvZGlhZ3JhbS90ZXN0cy9EaWFncmFtVUlTZXJ2aWNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTRjZWVkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2RpYWdyYW0vdGVzdHMvRGlhZ3JhbVVJU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0uY29yZS5zZXJ2aWNlcy5EaWFncmFtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5zZXJ2aWNlLkRpYWdyYW1VSVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udWkuc2VydmljZS5JRGlhZ3JhbVVJU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFjdGl2aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5ub3RhdGlvbi5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLm5vdGF0aW9uLk5vZGU7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHRoZSBvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS51aS5EaWFncmFtVUlTZXJ2aWNlIGNsYXNzZXMuCi0gKiAKLSAqIEBhdXRob3IgU2hpbHBhIFRvcmFza2FyCi0gKiBAc2luY2UgMS4yCi0gKi8KLXB1YmxpYyBjbGFzcyBEaWFncmFtVUlTZXJ2aWNlVGVzdCBleHRlbmRzIERpYWdyYW1UZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElEaWFncmFtVUlTZXJ2aWNlIGRpYWdyYW1VSVNlcnZpY2UgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgRGlhZ3JhbVVJU2VydmljZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIERpYWdhbVVJU2VydmljZS5jcmVhdGVEaWFncmFtIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlhZ3JhbSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIGNyZWF0ZSBtZXRob2QgcGx1Z2luCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlcgotCQkJCS5jcmVhdGVNZXRob2RQbHVnaW4oIlRlc3QgUGx1Z2luIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwKLQkJCQkicDEiKTsKLQotCQkvLyBjcmVhdGUgY29uZmlndXJhdGlvbgotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyCi0JCQkJLmNyZWF0ZUNvbmZpZ3VyYXRpb24oIlRlc3QgQ29uZmlnIik7Ci0KLQkJLy8gY3JlYXRlIHByb2Nlc3MKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oCi0JCQkJcGx1Z2luLCAiY3AxIiwgY29uZmlnKTsKLQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgKLQkJCQkoUHJvY2Vzc0NvbXBvbmVudCkgY3AxLmVDb250YWluZXIoKSk7Ci0KLQkJLy8gY3JlYXRlIHRhc2sKLQkJVGFzayB0YXNrMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAiVGFzazEiKTsKLQkJVGFzayB0YXNrMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAiVGFzazIiKTsKLQkJVGFza1tdIHRhc2tzID0gbmV3IFRhc2tbXSB7IHRhc2sxLCB0YXNrMiB9OwotCi0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgIkExIiwKLQkJCQl0YXNrcyk7Ci0JCUFjdGl2aXR5IGFjdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgIkEyIiwKLQkJCQl0YXNrcyk7Ci0KLQkJZGlhZ3JhbVVJU2VydmljZSA9IG5ldyBEaWFncmFtVUlTZXJ2aWNlKCk7Ci0JCURpYWdyYW1NYW5hZ2VyIG1nciA9IERpYWdyYW1NYW5hZ2VyLmdldEluc3RhbmNlKGNwMSwgdGhpcyk7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlUcmFuc2FjdGlvbiB0eCA9ICBtZ3IuZ2V0RWRpdGluZ0RvbWFpbigpLnN0YXJ0VHJhbnNhY3Rpb24oZmFsc2UsCi0JCQkJCUNvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IG1nci5nZXRSZXNvdXJjZSgpOwotCQotCQkJZGlhZ3JhbSA9IGRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlQWN0aXZpdHlEaWFncmFtKGNwMSk7Ci0JCi0JCQlOb2RlIGFjdDFOb2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sICBhY3QxKTsKLQkJCU5vZGUgaW5pdGlhbE5vZGUgPSBkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZU5vZGUoZGlhZ3JhbSwgSURpYWdyYW1VSVNlcnZpY2UuSU5JVElBTF9OT0RFLCAiaW5pdGlhbCIpOwotCQkJTm9kZSBhY3QyTm9kZSA9IGRpYWdyYW1VSVNlcnZpY2UuY3JlYXRlTm9kZShkaWFncmFtLCBhY3QyKTsKLQkJCU5vZGUgZGVjaXNpb25Ob2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIElEaWFncmFtVUlTZXJ2aWNlLkRFQ0lTSU9OX05PREUsICJkZWNpc2lvbiIpOwotCQkJTm9kZSBlbmROb2RlID0gZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVOb2RlKGRpYWdyYW0sIElEaWFncmFtVUlTZXJ2aWNlLkZJTkFMX05PREUsICJlbmQiKTsKLQkJCQotCQkJZGlhZ3JhbVVJU2VydmljZS5jcmVhdGVFZGdlKGRpYWdyYW0sIGluaXRpYWxOb2RlLCBhY3QxTm9kZSwgImxpbmsxIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgYWN0MU5vZGUsIGRlY2lzaW9uTm9kZSwgImxpbmsyIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgZGVjaXNpb25Ob2RlLCBhY3QyTm9kZSwgImxpbmszIik7Ci0JCQlkaWFncmFtVUlTZXJ2aWNlLmNyZWF0ZUVkZ2UoZGlhZ3JhbSwgYWN0Mk5vZGUsIGVuZE5vZGUsICJsaW5rNCIpOwotCQkJCQkJCi0JCQlMaXN0IG5vZGVzID0gZGlhZ3JhbVVJU2VydmljZS5nZXROb2RlcyhkaWFncmFtLCBjcDEsIElEaWFncmFtVUlTZXJ2aWNlLkFDVElWSVRZX05PREUpOwotCQkJaWYgKCFub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKiBBQ1RJVklUWSBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJbm9kZXMgPSBkaWFncmFtVUlTZXJ2aWNlLmdldE5vZGVzKGRpYWdyYW0sIGNwMSwgSURpYWdyYW1VSVNlcnZpY2UuSU5JVElBTF9OT0RFKTsKLQkJCWlmICghbm9kZXMuaXNFbXB0eSgpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiogSW5pdGlhbCBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJbm9kZXMgPSBkaWFncmFtVUlTZXJ2aWNlLmdldE5vZGVzKGRpYWdyYW0sIGNwMSwgSURpYWdyYW1VSVNlcnZpY2UuREVDSVNJT05fTk9ERSk7Ci0JCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIERlY2lzaW9uIE5vZGVzIC0gIik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihub2Rlcy5nZXQoaSkpOwotCQkJfQotCQkJCi0JCQlub2RlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0QWxsTm9kZXMoZGlhZ3JhbSk7Ci0JCQlpZiAoIW5vZGVzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIEFMTCBOb2RlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IG5vZGVzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obm9kZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJYXNzZXJ0VHJ1ZSghbm9kZXMuaXNFbXB0eSgpKTsKLQkJCQotCQkJTGlzdCBlZGdlcyA9IGRpYWdyYW1VSVNlcnZpY2UuZ2V0RWRnZXMoZGlhZ3JhbSk7Ci0JCQlpZiAoIWVkZ2VzLmlzRW1wdHkoKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqIEFMTCBFZGdlcyAtICIpOwotCQkJCWZvciAoaW50IGk9MDsgaSA8IGVkZ2VzLnNpemUoKTsgaSsrKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZWRnZXMuZ2V0KGkpKTsKLQkJCX0KLQkJCQotCQkJYXNzZXJ0VHJ1ZSghZWRnZXMuaXNFbXB0eSgpKTsKLQkJCi0JCQkvLyBzYXZlIGRpYWdyYW0KLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0uZ2V0RWxlbWVudCgpKTsKLQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJdHguY29tbWl0KCk7Ci0JCQlyZXNvdXJjZS5zYXZlKG51bGwpOwotCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJbWdyLnJlbW92ZUNvbnN1bWVyKHRoaXMpOwotCQkJfQotCQl9CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy8uY2xhc3NwYXRoIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZmM5MDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjcudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2Ny50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5MzVkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2Ny50YworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3Q+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiI+Ci0JPC9PcGVuTGlicmFyeT4KLQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNDM4NjdtIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTQzODY3bSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0UGx1Z2lucyBpbXBvcnRGb2xkZXJOYW1lPSIxNDM4NjdlIj4KLQk8L0ltcG9ydFBsdWdpbnM+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IjE0Mzg2N2dvbGRlbiIgPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9QbHVnX0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3ZS9QbHVnX0EvcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiYmRjOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvUGx1Z19BL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgZXBmOnZlcnNpb249IjEuMC4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIvPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUGx1Z19BIiBndWlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsY1V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb250ZW50IiBndWlkPSJfekJHbGNVemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGNremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGMwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il96QkdsZFV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZGt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX3pCR2xka3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlRvb2xzIiBndWlkPSJfekJHbGQwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfekJHbGVFemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il96QkdsZWt6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX3pCR2xlMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfekJHbGUwemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfekJHbGZFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8wSFpmSUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfMEhaZklFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il8wc0taRUV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJuZXdfcm9sZSIgZ3VpZD0iXzBzS1pFRXppRWR1c1RMX0kzakpRdEEiIHByZXNlbnRhdGlvbk5hbWU9Ik5ldyBSb2xlIi8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il96QkdsZlV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfekJHbGZremlFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGYwemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il96QkdsZjB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhNDEzYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiBlcGY6dmVyc2lvbj0iMS4wLjAiIHhtaTppZD0iXzJtT1NBRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZkV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY2t6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZDB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZUV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdlL2V4cG9ydC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvZXhwb3J0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTExMzQwOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2UvZXhwb3J0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIiBndWlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSI+Ci08c3ViTWFuYWdlcnMgeG1pOmlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiPgotPC9zdWJNYW5hZ2Vycz4KLTxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hLUzAwRXppRWR1c1RMX0kzakpRdEEiIGlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgdXJpPSIiPgotPC9yZXNvdXJjZURlc2NyaXB0b3JzPgotPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJNc0VremlFZHVzVExfSTNqSlF0QSIgaWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIj4KLTwvcmVzb3VyY2VEZXNjcmlwdG9ycz4KLTxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3pCTXNFMHppRWR1c1RMX0kzakpRdEEiIGlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSI+Ci08L3Jlc291cmNlRGVzY3JpcHRvcnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iMTQzODY3bSIgZ3VpZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiPgotPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiPgotPC9tZXRob2RQbHVnaW5zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYyZTdkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTQzODY3bTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9QbHVnX0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmViM2NkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfekJNc0VVemlFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlBsdWdfQSIgZ3VpZD0iX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGNVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3pCR2xjVXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xja3ppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il96QkdsY2t6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il96QkdsYzB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZEV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX3pCR2xkRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfekJHbGRVemlFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGRremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il96QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZDB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJUb29scyIgZ3VpZD0iX3pCR2xkMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il96QkdsZVV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfekJHbGVremlFZHVzVExfSTNqSlF0QSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfekJHbGVremlFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il96QkdsZTB6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3pCR2xlMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZkV6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX3pCR2xmRXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMEhaZklFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0ibmV3X2NvbnRlbnRfcGFja2FnZSIgZ3VpZD0iXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfMHNLWkVFemlFZHVzVExfSTNqSlF0QSIgbmFtZT0ibmV3X3JvbGUiIGd1aWQ9Il8wc0taRUV6aUVkdXNUTF9JM2pKUXRBIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSIvPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfekJHbGZVemlFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il96QkdsZmt6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3pCR2xmMHppRWR1c1RMX0kzakpRdEEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL1BsdWdfQV9yZW5hbWVkL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mzk0MTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQbHVnX0FfcmVuYW1lZCIgZ3VpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UThVempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX0JJOVE4VXpqRWR1c1RMX0kzakpRdEEiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4a3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlROGt6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4MHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9CSTlRODB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROUV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX0JJOVE5RXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5VXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfQkk5UTlVempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlrempFZHVzVExfSTNqSlF0QSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9CSTlROWt6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJUb29scyIgZ3VpZD0iX0JJOVE5MHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEtVXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLVV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfQkk5US1rempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9CSTlRLTB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX0JJOVEtMHpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX0V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX0JJOVFfRXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9CSTlRX1V6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfa3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfQkk5UV9rempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV8wempFZHVzVExfSTNqSlF0QSIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9CSTlRXzB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZjdkOTYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnX0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iXzJtT1NBRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfMm1PU0FFemlFZHVzVExfSTNqSlF0QSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjRXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZkV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xkVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsY2t6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGRFemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xjMHppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZDB6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGZVemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xma3ppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZGt6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGYwemlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjX3pCR2xlVXppRWR1c1RMX0kzakpRdEEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL196QkdsY0V6aUVkdXNUTF9JM2pKUXRBI196QkdsZUV6aUVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGVremlFZHVzVExfSTNqSlF0QSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3pCR2xjRXppRWR1c1RMX0kzakpRdEEjXzBIWmZJRXppRWR1c1RMX0kzakpRdEEiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4Njdnb2xkZW4vY29uZmlndXJhdGlvbnMvQ29uZmlnX0FfcmVuYW1lZC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQV9yZW5hbWVkLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEyOGE3MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdfQV9yZW5hbWVkLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0RIczFrRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BX3JlbmFtZWQiIGd1aWQ9Il9ESHMxa0V6akVkdXNUTF9JM2pKUXRBIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N2dvbGRlbi9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2QzYjdhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3Z29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfeEtNdU1FemlFZHVzVExfSTNqSlF0QSIgZ3VpZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UkFVempFZHVzVExfSTNqSlF0QSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJNc0VVemlFZHVzVExfSTNqSlF0QSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hLUzAwRXppRWR1c1RMX0kzakpRdEEiIGlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il96Qk1zRWt6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3pCTXNFVXppRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQWt6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9CSTlSQTB6akVkdXNUTF9JM2pKUXRBIiBpZD0iX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiIHVyaT0iUGx1Z19BX3JlbmFtZWQvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3p5M09zTGNfRWR1UTF2TmRKZUppRlEiIGlkPSJfekJHbGNFemlFZHVzVExfSTNqSlF0QSIgdXJpPSJQbHVnX0EvcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIiBuYW1lPSIxNDM4NjdtIiBndWlkPSJfeEtHbmtFemlFZHVzVExfSTNqSlF0QSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfQkk5UThFempFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEjX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il96QkdsY0V6aUVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fekJHbGNFemlFZHVzVExfSTNqSlF0QSNfekJHbGNFemlFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0MDI3ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTQzODY3LzE0Mzg2N20vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNDM4NjdtIDI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL1BsdWdfQS9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL1BsdWdfQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2MyOTBmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9QbHVnX0EvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJQbHVnX0EiIGd1aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE4VXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9CSTlROFV6akVkdXNUTF9JM2pKUXRBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROGt6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfQkk5UThrempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRODB6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEb21haW5zIiBndWlkPSJfQkk5UTgwempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTlFempFZHVzVExfSTNqSlF0QSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9CSTlROUV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlROVV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX0JJOVE5VXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVE5a3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfQkk5UTlrempFZHVzVExfSTNqSlF0QSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UTkwempFZHVzVExfSTNqSlF0QSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9CSTlROTB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRLUV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLUV6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRLVV6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfQkk5US1VempFZHVzVExfSTNqSlF0QSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX0JJOVEta3pqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX0JJOVEta3pqRWR1c1RMX0kzakpRdEEiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfQkk5US0wempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9CSTlRLTB6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfQkk5UV9FempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il9CSTlRX0V6akVkdXNUTF9JM2pKUXRBIi8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfQkk5UV9VempFZHVzVExfSTNqSlF0QSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfQkk5UV9VempFZHVzVExfSTNqSlF0QSIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9CSTlRX2t6akVkdXNUTF9JM2pKUXRBIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX0JJOVFfa3pqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JJOVFfMHpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfQkk5UV8wempFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9jb25maWd1cmF0aW9ucy9Db25maWdfQS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZTRhN2YuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ19BLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX0RIczFrRXpqRWR1c1RMX0kzakpRdEEiIG5hbWU9IkNvbmZpZ19BIiBndWlkPSJfREhzMWtFempFZHVzVExfSTNqSlF0QSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE0Mzg2Ny8xNDM4NjdtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2FlN2Y4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNDM4NjcvMTQzODY3bS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3hLTXVNRXppRWR1c1RMX0kzakpRdEEiIGd1aWQ9Il94S011TUV6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfQkk5UkFVempFZHVzVExfSTNqSlF0QSIgaHJlZj0idW1hOi8vX0JJOVE4RXpqRWR1c1RMX0kzakpRdEEjX0JJOVJBVXpqRWR1c1RMX0kzakpRdEEiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il94S1MwMEV6aUVkdXNUTF9JM2pKUXRBIiBpZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJNc0VremlFZHVzVExfSTNqSlF0QSIgaWQ9Il96Qk1zRVV6aUVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQkk5UkFrempFZHVzVExfSTNqSlF0QSIgaWQ9Il9CSTlSQVV6akVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQkk5UkEwempFZHVzVExfSTNqSlF0QSIgaWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiB1cmk9IlBsdWdfQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX3hLR25rRXppRWR1c1RMX0kzakpRdEEiIG5hbWU9IjE0Mzg2N20iIGd1aWQ9Il94S0dua0V6aUVkdXNUTF9JM2pKUXRBIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9CSTlROEV6akVkdXNUTF9JM2pKUXRBIiBocmVmPSJ1bWE6Ly9fQkk5UThFempFZHVzVExfSTNqSlF0QSNfQkk5UThFempFZHVzVExfSTNqSlF0QSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDIudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDczYTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDIudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iPgotCTwvT3BlbkxpYnJhcnk+Ci0KLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTUwNzAybSI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1MDcwMm0iPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydENvbmZpZ3VyYXRpb24gaW1wb3J0Rm9sZGVyTmFtZT0iMTUwNzAyZSI+Ci0JPC9JbXBvcnRDb25maWd1cmF0aW9uPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSIxNTA3MDJnb2xkZW4iID4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzg2NjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTUwNzAyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyNDcxYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgbmFtZT0iY3AsX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4xPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4xPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+MTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4xPC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPjE8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPjE8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT4xPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+MTwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNjM2RhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfUldEQ01VMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX1JXRENNVTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JXRENNazIxRWR1REE2RG56U3ljS1EiIGlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcCIgZ3VpZD0iX0pSUlRjVTIxRWR1REE2RG56U3ljS1EiIGJyaWVmRGVzY3JpcHRpb249IjEiIHByZXNlbnRhdGlvbk5hbWU9ImNwIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgaHJlZj0idW1hOi8vLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWcjLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFjMWQ4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX1JWODdrazIxRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9SV0RDTVUyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfUldEQ01VMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdsVTIxRWR1REE2RG56U3ljS1EiIGlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgdXJpPSJyb2xlcy9uZXdfcm9sZV8xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdsazIxRWR1REE2RG56U3ljS1EiIGlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgdXJpPSJ0YXNrcy9uZXdfdGFzayUyMDEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUldEQ01FMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQbHVnQSIgZ3VpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il81YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJUb29scyIgZ3VpZD0iXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iSGlkZGVuIiBndWlkPSJfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXzViUzVTMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzViUzVURTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY29udGVudF9wYWNrYWdlXzEiIGd1aWQ9Il9fa1MzMEUyMEVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld19yb2xlXzEiIGd1aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgUm9sZSAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgaHJlZj0idW1hOi8vLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEjLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iX0dlclFBRTIxRWR1REE2RG56U3ljS1EiIG5hbWU9Im5ld190YXNrIDEiIGd1aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJOZXcgVGFzayAxIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgaHJlZj0idW1hOi8vLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEjLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXzViUzVUVTIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZhNGNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS9yb2xlcy9uZXdfcm9sZV8xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgbmFtZT0ibmV3X3JvbGUsX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBhdXRob3JzPSIxIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE2OjQxLjU4MC0wNzAwIiBjaGFuZ2VEZXNjcmlwdGlvbj0iMSI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2tpbGxzPjE8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPjE8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+MTwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJlL1BsdWdBL3Rhc2tzL25ld190YXNrIDEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzE5NGY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0iLF9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNzowMS45NzktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+MTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPjE8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+MTwvYWx0ZXJuYXRpdmVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiOWJmNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvY29uZmlndXJhdGlvbnMvQ29uZmlnQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29uZmlnQSIgZ3VpZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiPgotICA8bWV0aG9kUGx1Z2luU2VsZWN0aW9uIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UlUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UTAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U1UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI19fa1MzMEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19KUlJUY0UyMUVkdURBNkRuelN5Y0tRI19KUlJUY0UyMUVkdURBNkRuelN5Y0tRIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZS9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MmNiYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmUvbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9SVjg3a0UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSJfUlY4N2tFMjFFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX1JWODdrazIxRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI19SVjg3a2syMUVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2tVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1JWODdrMDIxRWR1REE2RG56U3ljS1EiIGlkPSJfUlY4N2trMjFFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUlY4N2xFMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iMTUwNzAybSIgZ3VpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UUUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5MmU1NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1MDcwMm08L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzI0NzFhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIG5hbWU9ImNwLF9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+MTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPjE8L3B1cnBvc2U+Ci0gIDxhbHRlcm5hdGl2ZXM+MTwvYWx0ZXJuYXRpdmVzPgotICA8aG93dG9TdGFmZj4xPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD4xPC9leHRlcm5hbElkPgotICA8c2NvcGU+MTwvc2NvcGU+Ci0gIDx1c2FnZU5vdGVzPjE8L3VzYWdlTm90ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjUxODkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KU09Wc1UyMUVkdURBNkRuelN5Y0tRIiBpZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3AiIGd1aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3AiIGd1aWQ9Il9KUlJUY1UyMUVkdURBNkRuelN5Y0tRIiBicmllZkRlc2NyaXB0aW9uPSIxIiBwcmVzZW50YXRpb25OYW1lPSJjcCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIGhyZWY9InVtYTovLy1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIy1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vXzNPbm1VRTIwRWR1REE2RG56U3ljS1EjXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vXzNPbm1VRTIwRWR1REE2RG56U3ljS1EjXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTcwYWIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIGd1aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9Gd3ZMOFUyMUVkdURBNkRuelN5Y0tRIiBpZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIHVyaT0icm9sZXMvbmV3X3JvbGVfMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9INHBUb0UyMUVkdURBNkRuelN5Y0tRIiBpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIHVyaT0idGFza3MvbmV3X3Rhc2slMjAxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pSWGFFVTIxRWR1REE2RG56U3ljS1EiIGlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUGx1Z0EiIGd1aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il81YlM1UVUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UlUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfNWJTNVMwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX19rUzMwRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV8xIiBndWlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfcm9sZV8xIiBndWlkPSJfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFJvbGUgMSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGhyZWY9InVtYTovLy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfdGFzayAxIiBndWlkPSJfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFRhc2sgMSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGhyZWY9InVtYTovLy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VDAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL1BsdWdBL3JvbGVzL25ld19yb2xlXzEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGIzMGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIG5hbWU9Im5ld19yb2xlXzEsX0JJWWd3RTIxRWR1REE2RG56U3ljS1EiIGd1aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBhdXRob3JzPSIxIiBjaGFuZ2VEYXRlPSIyMDA2LTA5LTI2VDE2OjE2OjQxLjU4MC0wNzAwIiBjaGFuZ2VEZXNjcmlwdGlvbj0iMSI+Ci0gIDxtYWluRGVzY3JpcHRpb24+MTwvbWFpbkRlc2NyaXB0aW9uPgotICA8c2tpbGxzPjE8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPjE8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+MTwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJnb2xkZW4vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhMDBhMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9QbHVnQS90YXNrcy9uZXdfdGFzayAxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0ibmV3X3Rhc2sgMSxfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTc6MDEuOTc5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPjE8L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPjE8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT4xPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPjE8L2FsdGVybmF0aXZlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI5YmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iXzhmZDA0RTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbmZpZ0EiIGd1aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVURTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UVUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VFUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VDAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U2syMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMmdvbGRlbi9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdhYmYwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAyZ29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfM090czhFMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzNPdHM4RTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNPdHM4VTIwRWR1REE2RG56U3ljS1EiIGlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81YmZHZ2syMEVkdURBNkRuelN5Y0tRIiBpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzVibE5JRTIwRWR1REE2RG56U3ljS1EiIGlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgdXJpPSJQbHVnQS9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IjE1MDcwMm0iIGd1aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM5MmU1NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTA3MDJtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9jYXBhYmlsaXR5cGF0dGVybnMvY3BtL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjI5ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1pNU9ZQ0t5SXRlV1YyWEgxRHQycWFnIiBuYW1lPSJjcCxfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIG0KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDxleHRlcm5hbElkPm08L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvY2FwYWJpbGl0eXBhdHRlcm5zL2NwbS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjkzMzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL2NhcGFiaWxpdHlwYXR0ZXJucy9jcG0vbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iX0pTT1ZzRTIxRWR1REE2RG56U3ljS1EiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pTT1ZzVTIxRWR1REE2RG56U3ljS1EiIGlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJjcG0iIGd1aWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgbmFtZT0iY3BtIiBndWlkPSJfSlJSVGNVMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iY3BtIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItaTVPWUNLeUl0ZVdWMlhIMUR0MnFhZyIgaHJlZj0idW1hOi8vLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWcjLWk1T1lDS3lJdGVXVjJYSDFEdDJxYWciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fM09ubVVFMjBFZHVEQTZEbnpTeWNLUSNfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTU4Y2YxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iXzViZkdnVTIwRWR1REE2RG56U3ljS1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9KU09Wc0UyMUVkdURBNkRuelN5Y0tRIiBocmVmPSJ1bWE6Ly9fSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSNfSlNPVnNFMjFFZHVEQTZEbnpTeWNLUSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0Z3dkw4VTIxRWR1REE2RG56U3ljS1EiIGlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgdXJpPSJyb2xlcy9uZXdfcm9sZV9tLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0g0cFRvRTIxRWR1REE2RG56U3ljS1EiIGlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgdXJpPSJ0YXNrcy9uZXdfdGFzayUyMG0ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSlJYYUVVMjFFZHVEQTZEbnpTeWNLUSIgaWQ9Il9KUlJUY0UyMUVkdURBNkRuelN5Y0tRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcG0vbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iUGx1Z0EiIGd1aWQ9Il81YlM1UUUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVRVTIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il81YlM1UVUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UWsyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfNWJTNVFrMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UTAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfNWJTNVEwMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il81YlM1UkUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1UlUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVSazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfNWJTNVJrMjBFZHVEQTZEbnpTeWNLUSIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVIwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iVG9vbHMiIGd1aWQ9Il81YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il81YlM1U1UyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfNWJTNVNVMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXzViUzVTazIwRWR1REE2RG56U3ljS1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfNWJTNVMwMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il81YlM1UzAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNWJTNVRFMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il81YlM1VEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX19rUzMwRTIwRWR1REE2RG56U3ljS1EiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV8xIiBndWlkPSJfX2tTMzBFMjBFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0iMSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfcm9sZV9tIiBndWlkPSJfQklZZ3dFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFJvbGUgbSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUJRdkFmdDhLUm5PdUszMk5JdFpHNFEiIGhyZWY9InVtYTovLy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIy1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiB4bWk6aWQ9Il9HZXJRQUUyMUVkdURBNkRuelN5Y0tRIiBuYW1lPSJuZXdfdGFzayBtIiBndWlkPSJfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgYnJpZWZEZXNjcmlwdGlvbj0ibSIgcHJlc2VudGF0aW9uTmFtZT0iTmV3IFRhc2sgbSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGhyZWY9InVtYTovLy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIy0xQ3J1cWdQaEQ2ZmptTWxuTkdxcS1RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il81YlM1VFUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfSlJSVGNFMjFFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNWJTNVRrMjBFZHVEQTZEbnpTeWNLUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il81YlM1VGsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81YlM1VDAyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXzViUzVUMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9yb2xlcy9uZXdfcm9sZV9tLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9QbHVnQS9yb2xlcy9uZXdfcm9sZV9tLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiNTVmOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0Evcm9sZXMvbmV3X3JvbGVfbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1CUXZBZnQ4S1JuT3VLMzJOSXRaRzRRIiBuYW1lPSJuZXdfcm9sZV9tLF9CSVlnd0UyMUVkdURBNkRuelN5Y0tRIiBndWlkPSItQlF2QWZ0OEtSbk91SzMyTkl0Wkc0USIgYXV0aG9ycz0ibSIgY2hhbmdlRGF0ZT0iMjAwNi0wOS0yNlQxNjoxNjo0MS41ODAtMDcwMCIgY2hhbmdlRGVzY3JpcHRpb249IjEiIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxza2lsbHM+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0Ozwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+MTwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz4xPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTUwNzAyLzE1MDcwMm0vUGx1Z0EvdGFza3MvbmV3X3Rhc2sgbS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjA0OWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL1BsdWdBL3Rhc2tzL25ld190YXNrIG0ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMUNydXFnUGhENmZqbU1sbk5HcXEtUSIgbmFtZT0ibmV3X3Rhc2sgbSxfR2VyUUFFMjFFZHVEQTZEbnpTeWNLUSIgZ3VpZD0iLTFDcnVxZ1BoRDZmam1NbG5OR3FxLVEiIGNoYW5nZURhdGU9IjIwMDYtMDktMjZUMTY6MTc6MDEuOTc5LTA3MDAiIHZlcnNpb249IjEuMC4wIj4KLSAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgbQotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBtCi0mbHQ7L3AmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2NvbmZpZ3VyYXRpb25zL0NvbmZpZ0EueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI5YmY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9jb25maWd1cmF0aW9ucy9Db25maWdBLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il84ZmQwNEUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSJDb25maWdBIiBndWlkPSJfOGZkMDRFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1VEUyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVFVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVSVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UWsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVJFMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRMDIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UjAyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVRVMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVUazIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1UmsyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVQwMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVTVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL181YlM1UUUyMEVkdURBNkRuelN5Y0tRI181YlM1U0UyMEVkdURBNkRuelN5Y0tRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSNfNWJTNVNrMjBFZHVEQTZEbnpTeWNLUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjX19rUzMwRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX0pSUlRjRTIxRWR1REE2RG56U3ljS1EjX0pSUlRjRTIxRWR1REE2RG56U3ljS1EiLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1MDcwMi8xNTA3MDJtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdhYmYwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTA3MDIvMTUwNzAybS9saWJyYXJ5LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzNPdHM4RTIwRWR1REE2RG56U3ljS1EiIGd1aWQ9Il8zT3RzOEUyMEVkdURBNkRuelN5Y0tRIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNWJmR2dVMjBFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViZkdnVTIwRWR1REE2RG56U3ljS1EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8zT3RzOFUyMEVkdURBNkRuelN5Y0tRIiBpZD0iXzNPbm1VRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNWJmR2drMjBFZHVEQTZEbnpTeWNLUSIgaWQ9Il81YmZHZ1UyMEVkdURBNkRuelN5Y0tRIiB1cmk9IlBsdWdBL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81YmxOSUUyMEVkdURBNkRuelN5Y0tRIiBpZD0iXzViUzVRRTIwRWR1REE2RG56U3ljS1EiIHVyaT0iUGx1Z0EvcGx1Z2luLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeSB4bWk6aWQ9Il8zT25tVUUyMEVkdURBNkRuelN5Y0tRIiBuYW1lPSIxNTA3MDJtIiBndWlkPSJfM09ubVVFMjBFZHVEQTZEbnpTeWNLUSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfNWJTNVFFMjBFZHVEQTZEbnpTeWNLUSIgaHJlZj0idW1hOi8vXzViUzVRRTIwRWR1REE2RG56U3ljS1EjXzViUzVRRTIwRWR1REE2RG56U3ljS1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMi50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI3OTU2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyLnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdD4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU3OTMyZ29sZGVuIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU3OTMyZ29sZGVuIj4KLQk8L09wZW5MaWJyYXJ5PgotCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1NzkzMm0iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTc5MzJtIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRYbWwgaW1wb3J0Rm9sZGVyTmFtZT0iMTU3OTMyZSI+Ci0JPC9JbXBvcnRYbWw+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IjE1NzkzMmdvbGRlbiIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMzMiCi0JCXVzZU5hbWVBc0lkPSJ0cnVlIj4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmUvMTU3OTMyZS54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmUvMTU3OTMyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzNlOWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJlLzE1NzkzMmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVtYTpNZXRob2RMaWJyYXJ5IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuYW1lPSIxNTc5MzJtIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfZUdoMm9FMnJFZHVXSmRmWjlnbjZKUSIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHRvb2w9ImVwZj0xLjIuMCI+Ci0gIDxNZXRob2RQbHVnaW4gbmFtZT0ibmV3X3BsdWctaW4iIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgdXNlckNoYW5nZWFibGU9InRydWUiPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6Q29udGVudENhdGVnb3J5UGFja2FnZSIgbmFtZT0iQ29udGVudENhdGVnb3JpZXMiIGlkPSJfa0VwYTRFMnJFZHVXSmRmWjlnbjZKUSIvPgotICA8L01ldGhvZFBsdWdpbj4KLTwvdW1hOk1ldGhvZExpYnJhcnk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDM5YThlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+MTU3OTMyZ29sZGVuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMyZ29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbGlicmFyeS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmY2I5ZTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIiBndWlkPSJfcG9aWFVFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iXzIwU0owRTJyRWR1dzBPdWxNYjJKMnciIGhyZWY9InVtYTovL19mNDhQY0UyckVkdVdKZGZaOWduNkpRI18yMFNKMEUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcG9sa2tFMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9wb1RRc0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3FiZm9NVTJyRWR1aUc1M05xdkU0SGciIGlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01rMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluX3JlbmFtZWQvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzIwU0owVTJyRWR1dzBPdWxNYjJKMnciIGlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfMjBTSjBrMnJFZHV3ME91bE1iMkoydyIgaWQ9Il9mNDhQY0UyckVkdVdKZGZaOWduNkpRIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfZUdoMm9FMnJFZHVXSmRmWjlnbjZKUSIgbmFtZT0iMTU3OTMybSIgZ3VpZD0iX2VHaDJvRTJyRWR1V0pkZlo5Z242SlEiPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYlpoa0UyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSIgaHJlZj0idW1hOi8vX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEjX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5Zjk4MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfMjBTSjBFMnJFZHV3ME91bE1iMkoydyIgZ3VpZD0iXzIwU0owRTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2Y0OFBjRTJyRWR1V0pkZlo5Z242SlEiIG5hbWU9Im5ld19wbHVnLWluIiBndWlkPSJfZjQ4UGNFMnJFZHVXSmRmWjlnbjZKUSI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VUUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDb250ZW50IiBndWlkPSJfMno1dlVFMnJFZHV3ME91bE1iMkoydyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlVVMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iXzJ6NXZVVTJyRWR1dzBPdWxNYjJKMnciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlVrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iXzJ6NXZVazJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZVMDJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfMno1dlUwMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlZFMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iUm9sZVNldHMiIGd1aWQ9Il8yejV2VkUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VlUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iXzJ6NXZWVTJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXzJ6NXZWazJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IlRvb2xzIiBndWlkPSJfMno1dlZrMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dlYwMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfMno1dlYwMnJFZHV3ME91bE1iMkoydyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfMno1dldFMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iXzJ6NXZXRTJyRWR1dzBPdWxNYjJKMnciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2V1UyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il8yejV2V1UyckVkdXcwT3VsTWIySjJ3Ij4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iXzJ6NXZXazJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfMno1dldrMnJFZHV3ME91bE1iMkoydyIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8yejV2VzAyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXzJ6NXZXMDJyRWR1dzBPdWxNYjJKMnciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8yejV2WEUyckVkdXcwT3VsTWIySjJ3IiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il8yejV2WEUyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXzJ6NXZYVTJyRWR1dzBPdWxNYjJKMnciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfMno1dlhVMnJFZHV3ME91bE1iMkoydyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfMno1dlhrMnJFZHV3ME91bE1iMkoydyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il8yejV2WGsyckVkdXcwT3VsTWIySjJ3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbl9yZW5hbWVkL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMmdvbGRlbi9uZXdfcGx1Zy1pbl9yZW5hbWVkL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODYwY2IuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJnb2xkZW4vbmV3X3BsdWctaW5fcmVuYW1lZC9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgZ3VpZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9Im5ld19wbHVnLWluX3JlbmFtZWQiIGd1aWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9xYlpoa1UyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoa2syckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfcWJaaGtrMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoazAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEb21haW5zIiBndWlkPSJfcWJaaGswMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxFMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9xYlpobEUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobFUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX3FiWmhsVTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfcWJaaGxrMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGwwMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9xYlpobDAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobUUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobVUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfcWJaaG1VMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX3FiWmhtazJyRWR1aUc1M05xdkU0SGciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfcWJaaG0wMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobTAyckVkdWlHNTNOcXZFNEhnIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhuRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfcWJaaG5FMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX3FiWmhuVTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG5rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il9xYlpobmsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobjAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3FiWmhuMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcyMmU0YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT4xNTc5MzJtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTc5MzIvMTU3OTMybS9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmNDY5Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbGlicmFyeS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9wb1pYVUUyckVkdWlHNTNOcXZFNEhnIiBndWlkPSJfcG9aWFVFMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcG9sa2tFMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9wb1RRc0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3FiZm9NVTJyRWR1aUc1M05xdkU0SGciIGlkPSJfcWJmb01FMnJFZHVpRzUzTnF2RTRIZyIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcWJmb01rMnJFZHVpRzUzTnF2RTRIZyIgaWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiB1cmk9Im5ld19wbHVnLWluL3BsdWdpbi54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnkgeG1pOmlkPSJfcG9UUXNFMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iMTU3OTMybSIgZ3VpZD0iX3BvVFFzRTJyRWR1aUc1M05xdkU0SGciPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciIGhyZWY9InVtYTovL19xYlpoa0UyckVkdWlHNTNOcXZFNEhnI19xYlpoa0UyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1NzkzMi8xNTc5MzJtL25ld19wbHVnLWluL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU2YjU3Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU3OTMyLzE1NzkzMm0vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX3FiZm9NRTJyRWR1aUc1M05xdkU0SGciIGd1aWQ9Il9xYmZvTUUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9xYlpoa0UyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJuZXdfcGx1Zy1pbiIgZ3VpZD0iX3FiWmhrRTJyRWR1aUc1M05xdkU0SGciPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGtVMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX3FiWmhrVTJyRWR1aUc1M05xdkU0SGciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpoa2syckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhrMDJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9xYlpoazAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobEUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX3FiWmhsRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhsVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfcWJaaGxVMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaGxrMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9xYlpobGsyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobDAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJUb29scyIgZ3VpZD0iX3FiWmhsMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3FiWmhtVTJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9xYlpobVUyckVkdWlHNTNOcXZFNEhnIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfcWJaaG1rMnJFZHVpRzUzTnF2RTRIZyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9xYlpobTAyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX3FiWmhtMDJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9xYlpobkUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX3FiWmhuRTJyRWR1aUc1M05xdkU0SGciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9xYlpoblUyckVkdWlHNTNOcXZFNEhnIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9xYlpoblUyckVkdWlHNTNOcXZFNEhnIi8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX3FiWmhuazJyRWR1aUc1M05xdkU0SGciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfcWJaaG5rMnJFZHVpRzUzTnF2RTRIZyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfcWJaaG4wMnJFZHVpRzUzTnF2RTRIZyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9xYlpobjAyckVkdWlHNTNOcXZFNEhnIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1MzU5MC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdD4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWdvbGRlbiI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE1ODkxM24xNTg5MjVnb2xkZW4iPgotCTwvT3BlbkxpYnJhcnk+Ci0KLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNW0iPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNTg5MTNuMTU4OTI1bSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0WG1sIGltcG9ydEZvbGRlck5hbWU9IjE1ODkxM24xNTg5MjVlIj4KLQk8L0ltcG9ydFhtbD4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0iMTU4OTEzbjE1ODkyNWdvbGRlbiIKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIyMSIKLQkJdXNlTmFtZUFzSWQ9InRydWUiPgkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVlLzE1ODkxM24xNTg5MjVlLnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVlLzE1ODkxM24xNTg5MjVlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlNmNlMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1ZS8xNTg5MTNuMTU4OTI1ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHVtYTpNZXRob2RMaWJyYXJ5IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zIiBuYW1lPSIxNTg5MTNuMTU4OTI1bSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB0b29sPSJlcGY9MS4yLjAiPgotICA8TWV0aG9kUGx1Z2luIG5hbWU9Im5ld19wbHVnLWluIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLSAgICA8TWV0aG9kUGFja2FnZSB4c2k6dHlwZT0idW1hOkNvbnRlbnRDYXRlZ29yeVBhY2thZ2UiIG5hbWU9IkNvbnRlbnRDYXRlZ29yaWVzIiBpZD0iX0dUNjRvRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8TWV0aG9kUGFja2FnZSB4c2k6dHlwZT0idW1hOkNvbnRlbnRQYWNrYWdlIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBicmllZkRlc2NyaXB0aW9uPSIiIGlkPSJfRDFmSFVFNVJFZHVHa3FXR3p3cG43USIgb3JkZXJpbmdHdWlkZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgZ2xvYmFsPSJmYWxzZSIvPgotICAgIDxNZXRob2RQYWNrYWdlIHhzaTp0eXBlPSJ1bWE6UHJvY2Vzc0NvbXBvbmVudCIgbmFtZT0iY3AiIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci0gICAgICA8UHJvY2VzcyB4c2k6dHlwZT0idW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBuYW1lPSJjcCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iX0NlTDlNVTVSRWR1R2txV0d6d3BuN1EiIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHByZXNlbnRhdGlvbk5hbWU9ImNwIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUGxhbm5lZD0idHJ1ZSIgcHJlZml4PSIiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBJc0VuYWN0YWJsZT0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotICAgICAgICA8UHJlc2VudGF0aW9uIHhzaTp0eXBlPSJ1bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIiBuYW1lPSJjcCxfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgYnJpZWZEZXNjcmlwdGlvbj0iIiBpZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciIG9yZGVyaW5nR3VpZGU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB1c2FnZUd1aWRhbmNlPSIiIGV4dGVybmFsSWQ9IiI+Ci0gICAgICAgICAgPE1haW5EZXNjcmlwdGlvbj48L01haW5EZXNjcmlwdGlvbj4KLSAgICAgICAgICA8S2V5Q29uc2lkZXJhdGlvbnM+PC9LZXlDb25zaWRlcmF0aW9ucz4KLSAgICAgICAgICA8QWx0ZXJuYXRpdmVzPjwvQWx0ZXJuYXRpdmVzPgotICAgICAgICAgIDxIb3dUb1N0YWZmPjwvSG93VG9TdGFmZj4KLSAgICAgICAgICA8UHVycG9zZT48L1B1cnBvc2U+Ci0gICAgICAgICAgPFNjb3BlPjwvU2NvcGU+Ci0gICAgICAgICAgPFVzYWdlTm90ZXM+PC9Vc2FnZU5vdGVzPgotICAgICAgICA8L1ByZXNlbnRhdGlvbj4KLSAgICAgICAgPERlZmF1bHRDb250ZXh0Pl9BZ0JuWUU1UkVkdUdrcVdHendwbjdRPC9EZWZhdWx0Q29udGV4dD4KLSAgICAgICAgPFZhbGlkQ29udGV4dD5fQWdCbllFNVJFZHVHa3FXR3p3cG43UTwvVmFsaWRDb250ZXh0PgotICAgICAgPC9Qcm9jZXNzPgotICAgIDwvTWV0aG9kUGFja2FnZT4KLSAgPC9NZXRob2RQbHVnaW4+Ci0gIDxNZXRob2RDb25maWd1cmF0aW9uIG5hbWU9ImMiIGJyaWVmRGVzY3JpcHRpb249IiIgaWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBvcmRlcmluZ0d1aWRlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci0gICAgPE1ldGhvZFBsdWdpblNlbGVjdGlvbj5fLVBERFFFNVFFZHVHa3FXR3p3cG43UTwvTWV0aG9kUGx1Z2luU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl9DZUw5TUU1UkVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl8tUEREVFU1UUVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICAgIDxNZXRob2RQYWNrYWdlU2VsZWN0aW9uPl8tUEREUVU1UUVkdUdrcVdHendwbjdRPC9NZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotICA8L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L3VtYTpNZXRob2RMaWJyYXJ5PgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGQ3NmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1ODkxM24xNTg5MjVnb2xkZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdE5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9jb25maWd1cmF0aW9ucy9jLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vY29uZmlndXJhdGlvbnMvYy54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTMyMGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9jb25maWd1cmF0aW9ucy9jLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjIiBndWlkPSJfQWdCbllFNVJFZHVHa3FXR3p3cG43USI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREVFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFVNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fQ2VMOU1FNVJFZHVHa3FXR3p3cG43USNfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERURTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUlU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFrNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUTA1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFIwNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERUazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREUms1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFQwNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREU0U1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFNrNVFFZHVHa3FXR3p3cG43USIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNWYwNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USIgZ3VpZD0iXzh6RmJrRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzh6Um8wRTVRRWR1R2txV0d6d3BuN1EiIGlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8tUEpKNGs1UUVkdUdrcVdHendwbjdRIiBpZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0MDVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IjE1ODkxM24xNTg5MjVtIiBndWlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjdmZWJkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiBuYW1lPSJjcCxfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgZ3VpZD0iLXQ3Mkp3YnF2Szl1NHN0ajMxYnFDb2ciLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3OTc2Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9ucTdnb1U1UkVkdU9vcHE1VGV2WWF3IiBndWlkPSJfbnE3Z29VNVJFZHVPb3BxNVRldllhdyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbnE3Z29rNVJFZHVPb3BxNVRldllhdyIgaWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0NlTDlNRTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0NlTDlNVTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfQ2VMOU1VNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii10NzJKd2Jxdks5dTRzdGozMWJxQ29nIiBocmVmPSJ1bWE6Ly8tdDcySndicXZLOXU0c3RqMzFicUNvZyMtdDcySndicXZLOXU0c3RqMzFicUNvZyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzAwN2IzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwX3JlbmFtZWQvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIG5hbWU9ImNwLF9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBndWlkPSItdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNWdvbGRlbi9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3BfcmVuYW1lZC9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNDkzYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGd1aWQ9Il9MY1JTZ1U1UkVkdUdrcVdHendwbjdRIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9MY1JTZ2s1UkVkdUdrcVdHendwbjdRIiBpZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIgbmFtZT0iY3BfcmVuYW1lZCIgZ3VpZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9MYnNxd1U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjcF9yZW5hbWVkIiBndWlkPSJfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBocmVmPSJ1bWE6Ly8tdkJkZnVpazV1amhKZVZLeXpWN19ZQSMtdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVnb2xkZW4vbmV3X3BsdWctaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwYWU3NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1Z29sZGVuL25ld19wbHVnLWluL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MY1JTZ1U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX25xN2dvVTVSRWR1T29wcTVUZXZZYXciIGhyZWY9InVtYTovL19DZUw5TUU1UkVkdUdrcVdHendwbjdRI19ucTdnb1U1UkVkdU9vcHE1VGV2WWF3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGJ5eFlVNVJFZHVHa3FXR3p3cG43USIgaWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcF9yZW5hbWVkL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX25xN2dvRTVSRWR1T29wcTVUZXZZYXciIGlkPSJfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0ibmV3X3BsdWctaW4iIGd1aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il8tUEREUVU1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUWs1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfLVBERFFrNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUTA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEb21haW5zIiBndWlkPSJfLVBERFEwNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJFNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il8tUEREUkU1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUlU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfLVBERFJrNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFIwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iVG9vbHMiIGd1aWQ9Il8tUEREUjA1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREU0U1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il8tUEREU0U1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREU1U1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfLVBERFNVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iXy1QRERTazVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfLVBERFMwNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il8tUEREUzA1UUVkdUdrcVdHendwbjdRIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERURTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNvcmVDb250ZW50IiBndWlkPSJfLVBERFRFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9LUnJ1c0U1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlX3JlbmFtZWQiIGd1aWQ9Il9LUnJ1c0U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9EMWZIVUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfY29udGVudF9wYWNrYWdlIiBndWlkPSJfRDFmSFVFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iXy1QRERUVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9DZUw5TUU1UkVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fQ2VMOU1FNVJFZHVHa3FXR3p3cG43USNfQ2VMOU1FNVJFZHVHa3FXR3p3cG43USIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVGs1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iXy1QRERUazVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iXy1QRERUMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfLVBERFQwNVFFZHVHa3FXR3p3cG43USIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vLnByb2plY3QgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhMjMyYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPjE1ODkxM24xNTg5MjVtPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnByb2plY3QuTWV0aG9kTGlicmFyeVByb2plY3ROYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2NvbmZpZ3VyYXRpb25zL2MueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vY29uZmlndXJhdGlvbnMvYy54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMGFjODIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vY29uZmlndXJhdGlvbnMvYy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Il9BZ0JuWUU1UkVkdUdrcVdHendwbjdRIiBuYW1lPSJjIiBndWlkPSJfQWdCbllFNVJFZHVHa3FXR3p3cG43USI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL18tUEREUUU1UUVkdUdrcVdHendwbjdRI18tUEREVFU1UUVkdUdrcVdHendwbjdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBERFFVNVFFZHVHa3FXR3p3cG43USIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fTGJzcXdFNVJFZHVHa3FXR3p3cG43USNfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIvPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY1ZjA2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfOHpGYmtFNVFFZHVHa3FXR3p3cG43USIgZ3VpZD0iXzh6RmJrRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBocmVmPSJ1bWE6Ly9fLVBERFFFNVFFZHVHa3FXR3p3cG43USNfLVBKSjRVNVFFZHVHa3FXR3p3cG43USIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzh6Um8wRTVRRWR1R2txV0d6d3BuN1EiIGlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8tUEpKNGs1UUVkdUdrcVdHendwbjdRIiBpZD0iXy1QSko0VTVRRWR1R2txV0d6d3BuN1EiIHVyaT0ibmV3X3BsdWctaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy1QSko0MDVRRWR1R2txV0d6d3BuN1EiIGlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgdXJpPSJuZXdfcGx1Zy1pbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iXzh5Z3owRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IjE1ODkxM24xNTg5MjVtIiBndWlkPSJfOHlnejBFNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfLVBERFFFNVFFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vXy1QRERRRTVRRWR1R2txV0d6d3BuN1EjXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDA3YjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvQnVnc18xLzE1ODkxM24xNTg5MjUvMTU4OTEzbjE1ODkyNW0vbmV3X3BsdWctaW4vY2FwYWJpbGl0eXBhdHRlcm5zL2NwL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBuYW1lPSJjcCxfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgZ3VpZD0iLXZCZGZ1aWs1dWpoSmVWS3l6VjdfWUEiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9jYXBhYmlsaXR5cGF0dGVybnMvY3AvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGFkNjhjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL2NhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9MY1JTZ1U1UkVkdUdrcVdHendwbjdRIiBndWlkPSJfTGNSU2dVNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGNSU2drNVJFZHVHa3FXR3p3cG43USIgaWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0xic3F3VTVSRWR1R2txV0d6d3BuN1EiIG5hbWU9ImNwIiBndWlkPSJfTGJzcXdVNVJFZHVHa3FXR3p3cG43USIgcHJlc2VudGF0aW9uTmFtZT0iY3AiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii12QmRmdWlrNXVqaEplVkt5elY3X1lBIiBocmVmPSJ1bWE6Ly8tdkJkZnVpazV1amhKZVZLeXpWN19ZQSMtdkJkZnVpazV1amhKZVZLeXpWN19ZQSIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL184eWd6MEU1UUVkdUdrcVdHendwbjdRI19BZ0JuWUU1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9CdWdzXzEvMTU4OTEzbjE1ODkyNS8xNTg5MTNuMTU4OTI1bS9uZXdfcGx1Zy1pbi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNmZGVkLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L0J1Z3NfMS8xNTg5MTNuMTU4OTI1LzE1ODkxM24xNTg5MjVtL25ld19wbHVnLWluL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il8tUEpKNFU1UUVkdUdrcVdHendwbjdRIiBndWlkPSJfLVBKSjRVNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX0xjUlNnVTVSRWR1R2txV0d6d3BuN1EiIGhyZWY9InVtYTovL19MYnNxd0U1UkVkdUdrcVdHendwbjdRI19MY1JTZ1U1UkVkdUdrcVdHendwbjdRIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTGJ5eFlVNVJFZHVHa3FXR3p3cG43USIgaWQ9Il9MYnNxd0U1UkVkdUdrcVdHendwbjdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jcC9tb2RlbC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il8tUEREUUU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJuZXdfcGx1Zy1pbiIgZ3VpZD0iXy1QRERRRTVRRWR1R2txV0d6d3BuN1EiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFFVNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iQ29udGVudCIgZ3VpZD0iXy1QRERRVTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRazVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREUWs1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERRMDVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il8tUEREUTA1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUkU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iXy1QRERSRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERSVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfLVBERFJVNVFFZHVHa3FXR3p3cG43USIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFJrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il8tUEREUms1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREUjA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJUb29scyIgZ3VpZD0iXy1QRERSMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTRTVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iXy1QRERTVTVRRWR1R2txV0d6d3BuN1EiIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il8tUEREU1U1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iSGlkZGVuIiBndWlkPSJfLVBERFNrNVFFZHVHa3FXR3p3cG43USI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il8tUEREUzA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iXy1QRERTMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVEU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iXy1QRERURTVRRWR1R2txV0d6d3BuN1EiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfS1JydXNFNVJFZHVHa3FXR3p3cG43USIgbmFtZT0ibmV3X2NvbnRlbnRfcGFja2FnZSIgZ3VpZD0iX0tScnVzRTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVFU1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il8tUEREVFU1UUVkdUdrcVdHendwbjdRIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfTGJzcXdFNVJFZHVHa3FXR3p3cG43USIgaHJlZj0idW1hOi8vX0xic3F3RTVSRWR1R2txV0d6d3BuN1EjX0xic3F3RTVSRWR1R2txV0d6d3BuN1EiLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfLVBERFRrNVFFZHVHa3FXR3p3cG43USIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il8tUEREVGs1UUVkdUdrcVdHendwbjdRIi8+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il8tUEREVDA1UUVkdUdrcVdHendwbjdRIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iXy1QRERUMDVRRWR1R2txV0d6d3BuN1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzLy5wcm9qZWN0IGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZGIwMWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5QYXJpczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0TmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBBMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNkOGJmZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDE2ZGIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljVWpRT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNValFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNValFPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgQTEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNValF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljVWpRLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY1VqUk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JY20zT2V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zT3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWNtM08teDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBBMSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0ljbTNQT3g0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zUC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNQZXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNRdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zUHV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNQLXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNQT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1FPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNRZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1F1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNQZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNRLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zUk94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWNtM1JleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWNtM1J1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0ljbTNTZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjEgcHJlc25ldCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1IteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1MteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNTT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWNtM1NleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWNtM1J1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zU3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNTLXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zUi14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JY20zVE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1RleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0ljbTNUdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0ljbTNULXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JY20zVXV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNVT3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNWT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0ljbTNVdXg0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0ljbTNULXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1UteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVk94NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1VPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1ZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0ljbTNWdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JY20zVi14NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWNtM1dPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JY20zV094NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JY20zVi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0ljbTNXZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWNtM1d1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWNtM1cteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNtM1hPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNtM09leDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0MSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zWU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWNtM091eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNZZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM1l1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zWS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNaT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNadXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSIxNjkiIHdpZHRoPSIxNTgiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNtM1oteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNQdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY20zYU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljbTNhZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNtM2F1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY20zYS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY20zYmV4NEVkdTJPbzZxLW5IV2dnIiB4PSI4NiIgeT0iMSIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjE0OCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zYnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1F1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNiLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2NPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zY2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNjdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljbTNkT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjkxIiB5PSIyNDIiIHdpZHRoPSI3NCIgaGVpZ2h0PSIxMTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNtM2RleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0ljbTNST3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY20zZHV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljbTNkLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNtM2VPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY20zZWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY20zZS14NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iNzkzIiB3aWR0aD0iMTk2IiBoZWlnaHQ9IjUzIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljbTNmT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JY20zU094NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNtM2ZleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY20zZnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljbTNmLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNtM2dPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNtM2d1eDRFZHUyT282cS1uSFdnZyIgeD0iMTMwIiB5PSI3MDYiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY20zZy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1MteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljbTNoT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM2hleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY20zaHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljbTNoLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczl3T3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iODY2IiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0ljczl3ZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JY20zVGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWNzOXd1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY3M5dy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0ljczl4T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWNzOXhleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWNzOXgteDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjExMDUiIHdpZHRoPSIxOTYiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOXlPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNVZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5eWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczl5dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOXkteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5ek94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5enV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjEwMTgiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5ei14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWNtM1ZPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczkwT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTBleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5MHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczkwLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczkxZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMTE3OCIgd2lkdGg9IjczIiBoZWlnaHQ9IjExMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JY3M5MXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWNtM1Z1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0ljczkxLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNzOTJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JY3M5MmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0ljczkydXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0ljczkzT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIwIiB5PSI0ODEiIHdpZHRoPSIxMjQiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOTNleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNWLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5M3V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczkzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOTRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5NGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5NC14NEVkdTJPbzZxLW5IV2dnIiB4PSI3NiIgeT0iMzk0IiB3aWR0aD0iNzQiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWNzOTVPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0ljbTNXdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JY3M5NWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0ljczk1dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWNzOTUteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JY3M5Nk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JY3M5NnV4NEVkdTJPbzZxLW5IV2dnIiB4PSI3NiIgeT0iNTU0IiB3aWR0aD0iNzQiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0ljbTNYZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JY20zWHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNtM1gteDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEExL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGUyYWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQTEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX2RGMk80RUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9kRjJPNEVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9kRjJPNFVBdkVkcUZxSXU4LWNrb2xnIiBpZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfZEJodmtFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQ1AgQTEiIGd1aWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVpTendFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQWN0MSIgZ3VpZD0iX2VaU3p3RUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iQWN0MSIgZ3VpZD0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHN1cGVyQWN0aXZpdGllcz0iX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciIGJyZWFrZG93bkVsZW1lbnRzPSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyBfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyBfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyBfakJGZVFFQXZFZHFGcUl1OC1ja29sZyBfanZTQkFFQXZFZHFGcUl1OC1ja29sZyBfanZTQkFVQXZFZHFGcUl1OC1ja29sZyBfanZTQkFrQXZFZHFGcUl1OC1ja29sZyBfanZTQkEwQXZFZHFGcUl1OC1ja29sZyBfanZTQkJFQXZFZHFGcUl1OC1ja29sZyBfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyBfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyBfYTBna3dFQTNFZHFGcUl1OC1ja29sZyBfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyBfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyBfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19BMSIgZ3VpZD0iX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGcgX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHZGNE1CQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHprSWdCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0ExIiBndWlkPSJfZ0Y3VXNVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgcmVzcG9uc2libGVGb3I9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIF9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzU1emswQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfZ0Y3VXNrQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0icm9sZV9BMiIgZ3VpZD0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2dHRWVvRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGd1aWQ9Il9nR0Vlb1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGcgX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGcgX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0Vlb2tBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfZ0dFZW9rQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX2dHRWVvMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfZ0dFZXBFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9nR0VlcEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2dHRWVwVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19CMSIgZ3VpZD0iX2pCRmVRRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDRBcUFCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDU4anNCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyNfVDhWSlVCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQUVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0IxIiBndWlkPSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiByZXNwb25zaWJsZUZvcj0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGcgX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0IyIiBndWlkPSJfanZTQkFVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IxIiBndWlkPSJfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19tcUozQUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgZ3VpZD0iX2p2U0JBMEF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfanZiSzhFQXZFZHFGcUl1OC1ja29sZyBfanZiSzhVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il9qdlNCQkVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2p2Yks4RUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IxIiBndWlkPSJfanZiSzhFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19tcUozQUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9qdmJLOFVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IxIiBndWlkPSJfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQjIiIGd1aWQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfanZTQkFFQXZFZHFGcUl1OC1ja29sZyIgbWFuZGF0b3J5SW5wdXQ9Il9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBvcHRpb25hbElucHV0PSJfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyIgb3V0cHV0PSJfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgcGVyZm9ybWVkUHJpbWFyaWx5Qnk9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F1UXBBQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2tZX3NZRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfa1lfc1lFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgZ3VpZD0iX2tZX3NZVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyBfa1pKZFlVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX25xRldFQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2tZX3NZa0F2RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il9rWV9zWWtBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfa1pKZFlFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfa1pKZFlVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9InRhc2tfQTIiIGd1aWQ9Il9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iX2ExdGVvRUEzRWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il9hMmRGZ0VBM0VkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il9hM01zWUVBM0VkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGkyQllCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9hMXRlb0VBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2EyZEZnRUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBndWlkPSJfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2VhQ2FvRUF2RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIF9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTNNc1lFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfYTRHRVFFQTNFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2E0MXJJRUEzRWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il9hNDFySUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX3dfVEZrRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGa0VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZrVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGa1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URmtrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZrMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGazBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0Y3VXNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZsRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGbFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URmxVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZsa0F2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9IjE2OS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URmwwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZsMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URm1FQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjE1OC4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGbVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm1VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZta0F2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9IjQ4MS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URm0wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZtMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc2tBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URm5FQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjEyNC4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGblVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm5VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZua0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGbjBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URm4wQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGb0VBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URm9VQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZvVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGb2tBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URm8wQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZvMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nR0Vlb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnBFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZwVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnBrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZwMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGcDBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZxRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGcVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnFVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZxa0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGcTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnEwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGckVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnJVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZyVUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGcmtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnIwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZyMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnNFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZzVUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGc1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnNrQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iNzkzLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGczBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnMwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGdEVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ0VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdFVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnRrQXZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iMTEwNS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnQwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ0MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qdlNCQVVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnVFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjE5Ni4wIiBoZWlnaHQ9IjUzLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGdVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnVVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ1a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGdTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnUwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2p2U0JBa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGdkVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnZVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ2VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGdmtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnYwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ2MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qdlNCQTBBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URndFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ3VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGd1VBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URndrQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ3MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGdzBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfanZTQkJFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEZ4RUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGeFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URnhVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEZ4a0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGeDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URngwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZam5nRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGeUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19URnlVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ5VUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il93X1RGeWtBdkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19URnkwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfVEZ5MEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19URnpFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3dfVEZ6VUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGelVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19URnprQXZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3dfVEZ6MEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X1RGejBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfa1lfc1lVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3dfVEYwRUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X1RGMFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjBVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfVEYwa0F2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGMDBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjAwQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2tZX3NZa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X1RGMUVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfd19jMmtFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJrRUF2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il93X2Mya1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmtVQXZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3dfYzJra0F2RWRxRnFJdTgtY2tvbGciIHg9Ijg2LjAiIHk9IjEuMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il93X2MybTBBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMm0wQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfd19jMm1rQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il96VUtyUlVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclJVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfelVLclJFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il82VjRhY1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfNlY0YWNVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfNlY0YWNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9udWE2b1VBd0VkcUZxSXU4LWNrb2xnIiBndWlkPSJfbnVhNm9VQXdFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfbnVhNm9FQXdFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fb0xaZ0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX29MWmdFQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX252VW9FQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfd19jMm1rQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJta0F2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3dfYzJtMEF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3pVS3JSRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUkVBdkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il96VUtyUlVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il82VjRhY0VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfNlY0YWNFQXZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfNlY0YWNVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfbnVhNm9FQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX251YTZvRUF3RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX251YTZvVUF3RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19udlVvRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fbnZVb0VBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fb0xaZ0VBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfd19jMmswQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3dfYzJrMEF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfd19jMmxFQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iMTQ4LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il93X2MybFVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMmxVQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3dfYzJsa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il93X2MybGtBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfd19jMmwwQXZFZHFGcUl1OC1ja29sZyIgeD0iOTEuMCIgeT0iMjQyLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X2MybUVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19jMm1FQXZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iX2dGN1VzRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il93X2MybVVBdkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzQuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JNRUF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTUVBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLck1VQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JNVUF2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyTWtBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iNzA2LjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfelVLclIwQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JSMEF2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3pVS3JSa0F2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3BFeFlFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19wRXhZRUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX19vb0ZjRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3pVS3JSa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUmtBdkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il96VUtyUjBBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9fb29GY0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX29vRmNFQTZFZHFGcUl1OC1ja29sZyIgZ3JhcGhFZGdlPSJfX3BFeFlFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3pVS3JNMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTTBBdkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfakJGZVFFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3pVS3JORUF2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3My4wIiBoZWlnaHQ9IjY3LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il96VUtyTlVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck5VQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3pVS3JOa0F2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTmtBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfelVLck4wQXZFZHFGcUl1OC1ja29sZyIgeD0iMTMwLjAiIHk9Ijg2Ni4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLck9FQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JPRUF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLck9VQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iMTExLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il96VUtyT2tBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLck9rQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX3pVS3JPMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyTzBBdkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfelVLclBFQXZFZHFGcUl1OC1ja29sZyIgeD0iMTMwLjAiIHk9IjEwMTguMCIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il96VUtyU1VBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfelVLclNVQXZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfelVLclNFQXZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9fcDBZUUVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX3AwWVFFQTZFZHFGcUl1OC1ja29sZyIgYW5jaG9yPSJfX3BoZFVFQTZFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfelVLclNFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JTRUF2RWRxRnFJdTgtY2tvbGciIGdyYXBoRWRnZT0iX3pVS3JTVUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19waGRVRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fcGhkVUVBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fcDBZUUVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLclBVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JQVUF2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLclBrQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3pVS3JQMEF2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il96VUtyUDBBdkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfelVLclFFQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JRRUF2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il96VUtyUVVBdkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMTE3OC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfelVLclFrQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3pVS3JRa0F2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9rWWpuZ0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfelVLclEwQXZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iMTExLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fbTE4d0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfX20xOHdFQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX19tMTh3VUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fbTE4d1VBNkVkcUZxSXU4LWNrb2xnIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX20xOHdrQTZFZHFGcUl1OC1ja29sZyIgeD0iNzYuMCIgeT0iMzk0LjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3FSRU1VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19xUkVNVUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX19xUkVNRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19xUkVNRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fcVJFTUVBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il9fcVJFTVVBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX20xOHcwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19tMTh3MEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il9hMGdrd0VBM0VkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX20xOHhFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ijc0LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19uU29zRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fblNvc0VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfX25Tb3NVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX19uU29zVUE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fblNvc2tBNkVkcUZxSXU4LWNrb2xnIiB4PSI3Ni4wIiB5PSI1NTQuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19uU29zMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9fblNvczBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfYTBna3dFQTNFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19uU290RUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSI3NC4wIiBoZWlnaHQ9IjExMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il93X1RGMVVBdkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfd19URjFVQXZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfbm0wZDBFQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX25tMGQwRUF3RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfbm0wZDBVQXdFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX25tMGQwVUF3RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX2RCaHZrVUF2RWRxRnFJdTgtY2tvbGciIG5hbWU9IkNQIEExIiBndWlkPSJfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQTEiIGJyZWFrZG93bkVsZW1lbnRzPSJfZWFDYW9FQXZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTk4V1RXdXJCTVNpRWhoWkZJc3lra0EiIGhyZWY9InVtYTovLy05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIy05OFdUV3VyQk1TaUVoaFpGSXN5a2tBIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0ICJhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2NvbnRlbnQueG1pIiAiYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9jb250ZW50LnhtaSIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzMzMzEuLjAwMDAwMDAKLS0tICJhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2NvbnRlbnQueG1pIgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciPgotICA8bWFpbkRlc2NyaXB0aW9uPkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cycga2V5IGNvbjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPiZsdDtwJmd0OwotICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCAmbHQ7c3Ryb25nJmd0O2VsZW1lbnRzJyBhbHRlcm4mbHQ7L3N0cm9uZyZndDs8L2FsdGVybmF0aXZlcz4KLSAgPGhvd3RvU3RhZmY+Q1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIHN0YWZmPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD5leHRlcm5JRDpDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyc8L2V4dGVybmFsSWQ+Ci0gIDxzY29wZT5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cycgc2NvcGU8L3Njb3BlPgotICA8dXNhZ2VOb3Rlcz5DUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyd1c2FnZTwvdXNhZ2VOb3Rlcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvZGlhZ3JhbS54bWkiICJiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgZXh0ZW5kaW5nIFwwNDdDUDEgd2l0aCBhbGwgZWxlbWVudHNcMDQ3L2RpYWdyYW0ueG1pIgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyMGNhMS4uMDAwMDAwMAotLS0gImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvZGlhZ3JhbS54bWkiCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljT2NvT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNPY29leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNPY29PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0ljT2NvdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JY09jby14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWNPY3BPeDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgImEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBleHRlbmRpbmcgXDA0N0NQMSB3aXRoIGFsbCBlbGVtZW50c1wwNDcvbW9kZWwueG1pIiAiYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9tb2RlbC54bWkiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDYyMjUxLi4wMDAwMDAwCi0tLSAiYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIGV4dGVuZGluZyBcMDQ3Q1AxIHdpdGggYWxsIGVsZW1lbnRzXDA0Ny9tb2RlbC54bWkiCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfY25XbUVCQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iX2NuV21FQkJORWRxQnM3S2hkVkxSTEEiPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2NuV21FUkJORWRxQnM3S2hkVkxSTEEiIGlkPSItYnEwMG84djEyRFhVVkZ0Q25pSk5jZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIiBuYW1lPSJDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIGd1aWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIj4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfRVcwOU1EMEtFZHFqQUk3N0RIdkJ3QSIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBndWlkPSJfRVcwOU1EMEtFZHFqQUk3N0RIdkJ3QSI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGd1aWQ9Il9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBzdXBlckFjdGl2aXRpZXM9Il9hSFVTUVJCTkVkcUJzN0toZFZMUkxBIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotICAgICAgICA8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfWnFKTzhFQXRFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX1pxSk84RUF0RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfWnFKTzhVQXRFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX1pxSk84VUF0RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICAgIDwvZGlhZ3JhbXM+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9IkNQIGV4dGVuZGluZyAnQ1AxIHdpdGggYWxsIGVsZW1lbnRzJyIgZ3VpZD0iX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmQ1AgZXh0ZW5kaW5nICdDUDEgd2l0aCBhbGwgZWxlbWVudHMnIiBwcmVzZW50YXRpb25OYW1lPSJDUCBleHRlbmRpbmcgJ0NQMSB3aXRoIGFsbCBlbGVtZW50cyciIGJyZWFrZG93bkVsZW1lbnRzPSJfRVhhekVEMEtFZHFqQUk3N0RIdkJ3QSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWJxMDBvOHYxMkRYVVZGdENuaUpOY2ciIGhyZWY9InVtYTovLy1icTAwbzh2MTJEWFVWRnRDbmlKTmNnIy1icTAwbzh2MTJEWFVWRnRDbmlKTmNnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlZmFkMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDk2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOmlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyIgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBndWlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlCi0gICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmYW1wO25ic3A7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvcgotZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8cHVycG9zZT5UaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3IKLWV4dGVuZCB0aGUgcGF0dGVybiZhbXA7bmJzcDtyZXBlYXRlZGx5IHRvIGNyZWF0ZSBhcyBtYW55IGl0ZXJhdGlvbnMgYXMgbmVjZXNzYXJ5IGZvciB0aGUgcGFydGljdWxhciBkZWxpdmVyeSBwcm9jZXNzLiAmbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvCi0gICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gZm9yIHRoZSBkaXNjaXBsaW5lLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgSW4gdGhlIEluY2VwdGlvbiBQaGFzZSwgYW5hbHlzaXMgYW5kIGRlc2lnbiBpcyBjb25jZXJuZWQgd2l0aCBlc3RhYmxpc2hpbmcgd2hldGhlciB0aGUgc3lzdGVtIGFzIGVudmlzaW9uZWQgaXMKLSAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50Ci0gICAgKGJlY2F1c2UsIGZvciBleGFtcGxlLCB0aGUgZG9tYWluIGlzIHdlbGwgdW5kZXJzdG9vZCwgdGhlIHN5c3RlbSBpcyBub3Qgbm92ZWwsIGFuZCBzbyBvbikgdGhlbiB0aGlzIHdvcmtmbG93IGRldGFpbCBtYXkKLSAgICBiZSBvbWl0dGVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nCi0gICAgcG9pbnQgZm9yIHRoZSBtYWluIGFuYWx5c2lzIHdvcmsuIElmIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBwcm9kdWNlZCBpbiBwcmV2aW91cwotICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvCi0gICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspCi0gICAgYW5kIGFuYWx5emluZyBiZWhhdmlvciBhbmQgY3JlYXRpbmcgYW4gaW5pdGlhbCBzZXQgb2YgZWxlbWVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvCi0gICAgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBzeXN0ZW0uIElmIHRoZSBzeXN0ZW0gaW5jbHVkZXMgYSBkYXRhYmFzZSwgdGhlbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUKLSAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OwotJmx0Oy9wJmd0OyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvCi0gICAgYSBjYXBhYmlsaXR5IHBhdHRlcm4gZm9yIHRoZSBkaXNjaXBsaW5lLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgSW4gdGhlIEluY2VwdGlvbiBQaGFzZSwgYW5hbHlzaXMgYW5kIGRlc2lnbiBpcyBjb25jZXJuZWQgd2l0aCBlc3RhYmxpc2hpbmcgd2hldGhlciB0aGUgc3lzdGVtIGFzIGVudmlzaW9uZWQgaXMKLSAgICBmZWFzaWJsZSwgYW5kIHdpdGggYXNzZXNzaW5nIHBvdGVudGlhbCB0ZWNobm9sb2dpZXMgZm9yIHRoZSBzb2x1dGlvbiAoaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FyY2hzeW4uaHRtJnF1b3Q7Jmd0OyZsdDtmb250Ci0gICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50Ci0gICAgKGJlY2F1c2UsIGZvciBleGFtcGxlLCB0aGUgZG9tYWluIGlzIHdlbGwgdW5kZXJzdG9vZCwgdGhlIHN5c3RlbSBpcyBub3Qgbm92ZWwsIGFuZCBzbyBvbikgdGhlbiB0aGlzIHdvcmtmbG93IGRldGFpbCBtYXkKLSAgICBiZSBvbWl0dGVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVGhlIGVhcmx5IEVsYWJvcmF0aW9uIFBoYXNlIGZvY3VzZXMgb24gY3JlYXRpbmcgYW4gaW5pdGlhbCBhcmNoaXRlY3R1cmUgZm9yIHRoZSBzeXN0ZW0gKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nCi0gICAgcG9pbnQgZm9yIHRoZSBtYWluIGFuYWx5c2lzIHdvcmsuIElmIHRoZSBhcmNoaXRlY3R1cmUgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBiZWNhdXNlIGl0IHdhcyBwcm9kdWNlZCBpbiBwcmV2aW91cwotICAgIGl0ZXJhdGlvbnMsIGluIHByZXZpb3VzIHByb2plY3RzLCBvciBpcyBvYnRhaW5lZCBmcm9tIGFuIGFwcGxpY2F0aW9uIGZyYW1ld29yayksIHRoZSBmb2N1cyBvZiB0aGUgd29yayBjaGFuZ2VzIHRvCi0gICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspCi0gICAgYW5kIGFuYWx5emluZyBiZWhhdmlvciBhbmQgY3JlYXRpbmcgYW4gaW5pdGlhbCBzZXQgb2YgZWxlbWVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgKCAmbHQ7YQotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQzLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0FuYWx5emUgQmVoYXZpb3ImbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBZnRlciB0aGUgaW5pdGlhbCBlbGVtZW50cyBhcmUgaWRlbnRpZmllZCwgdGhleSBhcmUgZnVydGhlciByZWZpbmVkLiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvCi0gICAgc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9uIHRoZSBzeXN0ZW0uIElmIHRoZSBzeXN0ZW0gaW5jbHVkZXMgYSBkYXRhYmFzZSwgdGhlbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kNy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiB0aGUgRGF0YWJhc2UmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBvY2N1cnMgaW4gcGFyYWxsZWwuIFRoZSByZXN1bHQgaXMgYW4gaW5pdGlhbCBzZXQgb2YgY29tcG9uZW50cyB3aGljaCBhcmUKLSAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OwotJmx0Oy9wJmd0OwotJmFtcDtuYnNwOyZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9ob3d0b1N0YWZmPgotICAgIDxleHRlcm5hbElkPkVYdGVybmFsIElEOkNQMSB3aXRoIGFsbCBlbGVtZW50czwvZXh0ZXJuYWxJZD4KLSAgICA8c2NvcGU+Jmx0O3AmZ3Q7Ci0gICAgVG8gZXhwbGFpbiB0aGUgd29yayBpbnZvbHZlZCBpbiB0aGUgQW5hbHlzaXMgYW5kIERlc2lnbiBkaXNjaXBsaW5lLCB0aGUgYWN0aXZpdGllcyBhbmQgd29yayBwcm9kdWN0cyBhcmUgb3JnYW5pemVkIGludG8KLSAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcwotICAgIGZlYXNpYmxlLCBhbmQgd2l0aCBhc3Nlc3NpbmcgcG90ZW50aWFsIHRlY2hub2xvZ2llcyBmb3IgdGhlIHNvbHV0aW9uIChpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYXJjaHN5bi5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQKLSAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1BlcmZvcm0gQXJjaGl0ZWN0dXJhbCBTeW50aGVzaXMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykuIElmIGl0IGlzIGZlbHQgdGhhdCBsaXR0bGUgcmlzayBhdHRhY2hlcyB0byB0aGUgZGV2ZWxvcG1lbnQKLSAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heQotICAgIGJlIG9taXR0ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBUaGUgZWFybHkgRWxhYm9yYXRpb24gUGhhc2UgZm9jdXNlcyBvbiBjcmVhdGluZyBhbiBpbml0aWFsIGFyY2hpdGVjdHVyZSBmb3IgdGhlIHN5c3RlbSAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDEuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVmaW5lIGEgQ2FuZGlkYXRlIEFyY2hpdGVjdHVyZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KSB0byBwcm92aWRlIGEgc3RhcnRpbmcKLSAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzCi0gICAgaXRlcmF0aW9ucywgaW4gcHJldmlvdXMgcHJvamVjdHMsIG9yIGlzIG9idGFpbmVkIGZyb20gYW4gYXBwbGljYXRpb24gZnJhbWV3b3JrKSwgdGhlIGZvY3VzIG9mIHRoZSB3b3JrIGNoYW5nZXMgdG8KLSAgICByZWZpbmluZyB0aGUgYXJjaGl0ZWN0dXJlICggJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDIuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7UmVmaW5lIHRoZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykKLSAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthCi0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDMuaHRtJnF1b3Q7Jmd0OyZsdDtmb250IGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7QW5hbHl6ZSBCZWhhdmlvciZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7KS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFmdGVyIHRoZSBpbml0aWFsIGVsZW1lbnRzIGFyZSBpZGVudGlmaWVkLCB0aGV5IGFyZSBmdXJ0aGVyIHJlZmluZWQuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ0Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIENvbXBvbmVudHMmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OyBwcm9kdWNlIGEgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggcHJvdmlkZSB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgdG8KLSAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udAotICAgIGNvbG9yPSZxdW90OyMwMDAwZmYmcXVvdDsmZ3Q7RGVzaWduIHRoZSBEYXRhYmFzZSZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7IG9jY3VycyBpbiBwYXJhbGxlbC4gVGhlIHJlc3VsdCBpcyBhbiBpbml0aWFsIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIGFyZQotICAgIGZ1cnRoZXIgcmVmaW5lZCBpbiAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy93ZmRfaW1wLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0ltcGxlbWVudGF0aW9uJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsuJmx0O2JyIC8mZ3Q7Ci0mbHQ7L3AmZ3Q7JmFtcDtuYnNwOyZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC9zY29wZT4KLSAgICA8dXNhZ2VOb3Rlcz4mbHQ7cCZndDsKLSAgICBUaGUgc3ViY2F0ZWdvcmllcyBvZiBwcm9jZXNzIGFyZSBkZWxpdmVyeSBwcm9jZXNzIGFuZCBjYXBhYmlsaXR5IHBhdHRlcm4uJmFtcDtuYnNwOyBBIGRlbGl2ZXJ5IHByb2Nlc3MgZGVmaW5lcyBhIGNvbXBsZXRlCi0gICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuCi0mbHQ7L3AmZ3Q7PC91c2FnZU5vdGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uIHhtaTppZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLVlWVFpSRTVveTVvR2N1ZTFYWGgzZFEiPgotICAgIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgVGhpcyBXb3JrZmxvdyBEZXRhaWw6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7dWwmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cwotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcwotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7RGVzY3JpYmVzJmx0Oy9iJmd0OyB0aGUgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0ncyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbgotICAgICAgICAgICAgICAgIGVmZm9ydC4KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICZsdDsvdWwmZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIEtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MgotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTQKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk2Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTcKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UKLSAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mCi0gICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3Ci0gICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwKLSAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluCi0gICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldwotICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLgotJmx0Oy9wJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHB1cnBvc2U+Jmx0O3AmZ3Q7Ci0gICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBBbHRlcmFudGl2ZXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0OzwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPiZsdDtwJmd0OwotICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZQotICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQKLSAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0KLSAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZQotICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUKLSAgICBwYWlkIHRvIHNwZWNpZmljIHRlY2hub2xvZ3kgaXNzdWVzLiBUaGlzIHdpbGwgZm9yY2UgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIHRvIHNoaWZ0IG1lbWJlcnMgb3IgZXhwYW5kIHRvIGluY2x1ZGUgcGVvcGxlCi0gICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQKLSAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZQotICAgIGJ1aWxkIG1hbmFnZW1lbnQgcHJvY2VzcyBpcyB1c2VmdWwgdG8gaGF2ZS4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEF0IHRoZSBzYW1lIHRpbWUsIGl0IGlzIGVzc2VudGlhbCB0aGF0IHRoZSBhcmNoaXRlY3R1cmUgdGVhbSBub3QgYmUgY29tcG9zZWQgb2YgYSBsYXJnZSBleHRlbmRlZCB0ZWFtLiBBIHN0cmF0ZWd5IGZvcgotICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0Ci0gICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZQotICAgIHNwZWNpZmljIGV4cGVydGlzZSBtYXkgYmUgYm9ycm93ZWQgb3IgY29udHJhY3RlZCBmcm9tIG90aGVyIG9yZ2FuaXphdGlvbnM7IHRoZXkgY2FuIGJlIGJyb3VnaHQgaW4gYXMgc3BlY2lmaWMgaXNzdWVzCi0gICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuCi0mbHQ7L3AmZ3Q7PC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiBuYW1lPSJJdGVyYXRpb24xLF9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItVlJVQ1NoQXZYcnNMZ3M3UFp6SGdVdyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIENyZWF0ZSBhbiBpbml0aWFsIHNrZXRjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBzeXN0ZW0gCi0gICAgICAgICZsdDt1bCZndDsKLSAgICAgICAgICAgICZsdDtsaSZndDsKLSAgICAgICAgICAgICAgICBEZWZpbmUgYW4gaW5pdGlhbCBzZXQgb2YgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGVsZW1lbnRzIHRvIHVzZSBhcyB0aGUgYmFzaXMgZm9yIGFuYWx5c2lzCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhbmFseXNpcyBtZWNoYW5pc21zCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIERlZmluZSB0aGUgaW5pdGlhbCBsYXllcmluZyBhbmQgb3JnYW5pemF0aW9uIG9mIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgRGVmaW5lIHRoZSB1c2UtY2FzZSByZWFsaXphdGlvbnMgdG8gYmUgYWRkcmVzc2VkIGluIHRoZSBjdXJyZW50IGl0ZXJhdGlvbgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIEtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTExCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTIyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTMzCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlCi0gICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9JnF1b3Q7Jmd0O0FyY2hpdGVjdHVyYWwgQW5hbHlzaXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3syODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9JnF1b3Q7Jmd0O1VzZS1DYXNlIEFuYWx5c2lzJmx0Oy9hJmd0Oy4gUGVyZm9ybSBhbiBpbml0aWFsIHBhc3MgYXQgdGhlIGFyY2hpdGVjdHVyZSBpbiAmbHQ7YQotICAgIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UKLSAgICBjYXNlcywgcGVyZm9ybWluZyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy91c2VfY2FzZV9hbmFseXNpcyx7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7MjgwMTQ2MTUtQTYyRi00NTJELUI4MjEtMzBDN0NBQjBFQzQ0fSZxdW90OyZndDtVc2UtQ2FzZSBBbmFseXNpcyZsdDsvYSZndDsgb24gZWFjaCBvbmUuIEFmdGVyIChvciBhcykgZWFjaCB1c2UgY2FzZSBpcwotICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbQotICAgIGFuZCB0byBhZGRyZXNzIHBvdGVudGlhbCBhcmNoaXRlY3R1cmFsIHByb2JsZW1zIHdoaWNoIGFyZSBpZGVudGlmaWVkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgV2hlcmUgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGZyb20gYSBwcmlvciBwcm9qZWN0IG9yIGl0ZXJhdGlvbiksIGNoYW5nZSByZXF1ZXN0cyBtYXkgbmVlZCB0byBiZQotICAgIGNyZWF0ZWQgdG8gY2hhbmdlIHRoZSBhcmNoaXRlY3R1cmUgdG8gYWNjb3VudCBmb3IgdGhlIG5ldyBiZWhhdmlvciB0aGUgc3lzdGVtIG11c3Qgc3VwcG9ydC4gVGhlc2UgY2hhbmdlcyBtYXkgYmUgdG8gYW55Ci0gICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4KLSZsdDsvcCZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPiZsdDtwJmd0OwotICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz4mbHQ7cCZndDsKLSAgICBBbHRlcm5hdGl2ZXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3JvbGVzL3JvbGVfQTEueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cm9sZV9BMS54bWkmbHQ7L2EmZ3Q7Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICZsdDthIGhyZWY9JnF1b3Q7Li4vdGFza3MvdGFza19BMi54bWkmcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDt0YXNrX0EyLnhtaSZsdDsvYSZndDsKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDs8L2FsdGVybmF0aXZlcz4KLSAgICA8aG93dG9TdGFmZj4mbHQ7cCZndDsKLSAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUKLSAgICB0eXBpY2FsbHkgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50IGluY2x1ZGUgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbQotICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlCi0gICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuCi0mbHQ7L3AmZ3Q7PC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLW5VSDB2b0Q3Um9LUWdQVDByYk93UVEiIG5hbWU9InRhc2tfQjIsX01jWUgwRHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1uVUgwdm9EN1JvS1FnUFQwcmJPd1FRIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAga2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O29sJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgazMKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy9vbCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgIHVzYWdlIGd1aWRhbmNlIGZvciB0YXNrX0IyCi0mbHQ7L3AmZ3Q7Ci0mbHQ7dGFibGUgY2VsbHNwYWNpbmc9JnF1b3Q7MiZxdW90OyBjZWxscGFkZGluZz0mcXVvdDsyJnF1b3Q7IHdpZHRoPSZxdW90OzE4MCZxdW90OyBib3JkZXI9JnF1b3Q7MSZxdW90OyZndDsKLSAgICAmbHQ7dGJvZHkmZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90Ym9keSZndDsKLSZsdDsvdGFibGUmZ3Q7Ci0mbHQ7dGFibGUgY2VsbHNwYWNpbmc9JnF1b3Q7MiZxdW90OyBjZWxscGFkZGluZz0mcXVvdDsyJnF1b3Q7IHdpZHRoPSZxdW90OzE4MCZxdW90OyBib3JkZXI9JnF1b3Q7MSZxdW90OyZndDsKLSAgICAmbHQ7dGJvZHkmZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjEKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGMyCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjMwotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzQKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjIKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgYXNkCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtyb3cmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgcjMKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MjgmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1dHRvbnMuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzMzNyZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByNAotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHNkZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByNQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkYWYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgc2RmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyAKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgJmx0Oy90Ym9keSZndDsKLSZsdDsvdGFibGUmZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDs8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICAmbHQ7YSBocmVmPSZxdW90O3Jlc291cmNlcy9wYXBlcnMuaHRtJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7cGFwZXJzLmh0bSZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb246Ci0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1hREU0eUZ6RV9tX24yUEl6Y090NHJBIiBuYW1lPSJ0YXNrX0EyLF9KQ3JCRUR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItYURFNHlGekVfbV9uMlBJemNPdDRyQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIGtleXM6Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7b2wmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrazEKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2syCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtrMwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L29sJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHRhc2tfQjIKLSZsdDsvcCZndDsKLSZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OwotICAgICZsdDt0Ym9keSZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMQotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAgICAgYzIKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIGMzCi0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsKLSAgICAgICAgICAgICAgICBjNAotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMgotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBhc2QKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgZHNmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRzZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O3JvdyZxdW90OyZndDsKLSAgICAgICAgICAgICAgICByMwotICAgICAgICAgICAgJmx0Oy90aCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsyOCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvYnV0dG9ucy5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MzM3JnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBkc2YKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI0Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgc2RmCi0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7cm93JnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHI1Ci0gICAgICAgICAgICAmbHQ7L3RoJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIGRhZgotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICBzZGYKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTImcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL2J1bGxldDEuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzEyJnF1b3Q7IC8mZ3Q7IAotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAmbHQ7L3Rib2R5Jmd0OwotJmx0Oy90YWJsZSZndDsKLSZsdDticiAvJmd0OwotJmx0O2JyIC8mZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlRhc2sgQTIncyByZWZpbmVkIGRlc2NyaXB0aW9uPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiBuYW1lPSJ3cERlc2MxLF9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItNXQ4R3RvTDRJQm94ZmF6QklfMGNyQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTp3cERlc2MxPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTp3cERlc2MxPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcmVmaW5lZDogd3BEZXNjMQotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItaWZtUU5CNXkxUlpLRjFIcm0zQ2RSQSIgbmFtZT0idGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMSxfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLWlmbVFOQjV5MVJaS0YxSHJtM0NkUkEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz4mbHQ7cCZndDsKLSAgICBrZXlzOgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAga2V5MSxrZXkyCi0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mbHQ7cCZndDsKLSAgICB1c2FnZToKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIFRoZSB3b3JrIGlzIGJlc3QgZG9uZSBpbiBzZXZlcmFsIHNlc3Npb25zLCBwZXJoYXBzIHBlcmZvcm1lZCBvdmVyIGEgZmV3IGRheXMgKG9yIHdlZWtzIGFuZCBtb250aHMgZm9yIHZlcnkgbGFyZ2UKLSAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3tDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9JnF1b3Q7Jmd0O0lkZW50aWZ5IERlc2lnbiBNZWNoYW5pc21zJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mCi0gICAgaXRlcmF0aW9uIHdpdGggdGhlICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3Ci0gICAgZWxlbWVudHMgZG8gbm90IGR1cGxpY2F0ZSBmdW5jdGlvbmFsaXR5IG9mIGV4aXN0aW5nIGVsZW1lbnRzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGRlc2lnbiBlbWVyZ2VzLCBjb25jdXJyZW5jeSBhbmQgZGlzdHJpYnV0aW9uIGlzc3VlcyBhcmUgaW50cm9kdWNlZCBpbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX2Rpc3RyaWJ1dGlvbix7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwKLSAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluCi0gICAgcmVzcGVjdGl2ZSB2aWV3IHNlY3Rpb25zIGluIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgKGUuZy4sIGFzIHRoZSBEZXNpZ24gTW9kZWwgaXMgcmVmaW5lZCwgdGhlIExvZ2ljYWwgVmlldwotICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmx0O2JyIC8mZ3Q7Ci0gICAgJmx0O2JyIC8mZ3Q7Ci0gICAgJmFtcDtuYnNwOwotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24KLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItcE84TGVjZUdYaktlYXB1TG9GZmt4QSIgbmFtZT0icm9sZURlc2MxLF9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItcE84TGVjZUdYaktlYXB1TG9GZmt4QSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPiZsdDtwJmd0OwotICAgIGtleSBjb25zaWRlcmF0aW9uczoKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIGtleTEKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIGtleTIKLSZsdDsvcCZndDs8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDt1c2FnZSBmb3Igcm9sZUExJmFtcDtuYnNwOwotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVEZXNjMTwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItX1RoLWp2NWptMGgwZjBtRmhLdHFnUSIgbmFtZT0icm9sZURlc2MyLF9ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIiBndWlkPSItX1RoLWp2NWptMGgwZjBtRmhLdHFnUSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleSBjb25zaWRlcmF0aW9uIGZvciByb2xlQTI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPiZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMgotJmx0Oy9wJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24gZm9yIHJvbGVBMgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTIKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLUJrdjZWVGRNcGc0YkQwWWtmSFo0ZGciIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMgotJmx0Oy9wJmd0OwotJmx0O3RhYmxlIGNlbGxzcGFjaW5nPSZxdW90OzImcXVvdDsgY2VsbHBhZGRpbmc9JnF1b3Q7MiZxdW90OyB3aWR0aD0mcXVvdDsxODAmcXVvdDsgYm9yZGVyPSZxdW90OzEmcXVvdDsmZ3Q7Ci0gICAgJmx0O3Rib2R5Jmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIDEKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGgmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICB6Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIDIKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICAgICAmbHQ7dHImZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgegotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAgICAgMwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgJmx0Oy90ciZndDsKLSAgICAgICAgJmx0O3RyJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIHoKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICA0Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICZsdDsvdHImZ3Q7Ci0gICAgICAgICZsdDt0ciZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICAgICB6Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgJmx0Oy90ZCZndDsKLSAgICAgICAgICAgICZsdDt0ZCZndDsKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAgICAgJmx0O3RkJmd0OwotICAgICAgICAgICAgICAgIDUKLSAgICAgICAgICAgICZsdDsvdGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dGQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RkJmd0OwotICAgICAgICAmbHQ7L3RyJmd0OwotICAgICZsdDsvdGJvZHkmZ3Q7Ci0mbHQ7L3RhYmxlJmd0OzwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyIgbmFtZT0idGFzayB3aXRoIG5vIGxpbmtzLF81akpZQUR6a0VkcTV5c0ZPTnIxQkdRIiBndWlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTp0YXNrIHdpdGggbm8gbGlua3M8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOnRhc2sgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQ6dGFzayB3aXRoIG5vIGxpbmtzCi0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5RGVzY3JpcHRpb24geG1pOmlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyIgbmFtZT0iQWN0aXZpdHkyLF9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj4mbHQ7cCZndDsKLSAgICBUaGlzIFdvcmtmbG93IERldGFpbDoKLSZsdDsvcCZndDsKLSZsdDt1bCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIFByb3ZpZGVzIHRoZSBuYXR1cmFsICZsdDtiJmd0O3RyYW5zaXRpb24gZnJvbSBhbmFseXNpcyZsdDsvYiZndDsgYWN0aXZpdGllcyAmbHQ7YiZndDt0byBkZXNpZ24mbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMsIGlkZW50aWZ5aW5nOiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBlbGVtZW50cyBmcm9tIGFuYWx5c2lzIGVsZW1lbnRzCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGRlc2lnbiBtZWNoYW5pc21zIGZyb20gcmVsYXRlZCBhbmFseXNpcyBtZWNoYW5pc21zCi0gICAgICAgICAgICAmbHQ7L2xpJmd0OwotICAgICAgICAmbHQ7L3VsJmd0OwotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSdzICZsdDtiJmd0O3J1bi10aW1lIGFuZCBkZXBsb3ltZW50IGFyY2hpdGVjdHVyZSZsdDsvYiZndDsKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7T3JnYW5pemVzIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCZsdDsvYiZndDsgc28gYXMgdG8gbWFrZSB0aGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gc2VhbWxlc3MKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgJmx0O2ImZ3Q7TWFpbnRhaW5zIHRoZSBjb25zaXN0ZW5jeSBhbmQgaW50ZWdyaXR5IG9mIHRoZSBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7LCBlbnN1cmluZyB0aGF0OiAKLSAgICAgICAgJmx0O3VsJmd0OwotICAgICAgICAgICAgJmx0O2xpJmd0OwotICAgICAgICAgICAgICAgIG5ldyBkZXNpZ24gZWxlbWVudHMgaWRlbnRpZmllZCBmb3IgdGhlIGN1cnJlbnQgaXRlcmF0aW9uIGFyZSBpbnRlZ3JhdGVkIHdpdGggcHJlLWV4aXN0aW5nIGRlc2lnbiBlbGVtZW50cy4KLSAgICAgICAgICAgICZsdDsvbGkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgICAgICAgICAgbWF4aW1hbCByZS11c2Ugb2YgYXZhaWxhYmxlIGNvbXBvbmVudHMgYW5kIGRlc2lnbiBlbGVtZW50cyBpcyBhY2hpZXZlZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGUgZGVzaWduCi0gICAgICAgICAgICAgICAgZWZmb3J0LgotICAgICAgICAgICAgJmx0Oy9saSZndDsKLSAgICAgICAgJmx0Oy91bCZndDsKLSAgICAmbHQ7L2xpJmd0OwotJmx0Oy91bCZndDs8L21haW5EZXNjcmlwdGlvbj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgS2V5IGNvbnNpZGVyYXRpb25zOgotJmx0Oy9wJmd0OwotJmx0O3VsJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5MQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXkyCi0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTMKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NAotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBrZXk1Ci0gICAgJmx0Oy9saSZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIGtleTYKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAga2V5NwotICAgICZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZQotICAgIHN5c3RlbXMpLiBUaGUgaW5pdGlhbCBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduLHs1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YKLSAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsKLSAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pbmNvcnBvcmF0ZV9kZXNpZ25fZWxlbWVudHMsezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcKLSAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfcnVudGltZV9hcmNoaXRlY3R1cmUsezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0uaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7Ci0gICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsKLSAgICBndWlkPSZxdW90O3s2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9JnF1b3Q7Jmd0O0Rlc2NyaWJlIERpc3RyaWJ1dGlvbiZsdDsvYSZndDssIHJlc3BlY3RpdmVseS4gQXMgdGhlc2UgaXNzdWVzIGFyZSBjb25zaWRlcmVkLAotICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4KLSAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3Ci0gICAgb2YgdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCBpcyByZWZpbmVkLCBhcyB3ZWxsKS4gVGhlIHJlc3VsdGluZyBhcmNoaXRlY3R1cmUgaXMgcmV2aWV3ZWQuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7YnIgLyZndDsKLSZsdDticiAvJmd0OzwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cHVycG9zZT4mbHQ7cCZndDsKLSAgICBQdXJwb3NlIG9mIHRoaXMgYWN0aXZpdHkgaXMgdG8gaGF2ZSB0YXNrcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHRvIG90aGVyIHRhc2tzLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzcxJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXAuanBnJnF1b3Q7IHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0OzwvcHVycG9zZT4KLSAgICA8YWx0ZXJuYXRpdmVzPiZsdDtwJmd0OwotICAgIEFsdGVyYW50aXZlczoKLSZsdDsvcCZndDsKLSZsdDtvbCZndDsKLSAgICAmbHQ7bGkmZ3Q7Ci0gICAgICAgIEFsdGVyMQotICAgICZsdDsvbGkmZ3Q7Ci0gICAgJmx0O2xpJmd0OwotICAgICAgICBBbHRlcjIKLSAgICAmbHQ7L2xpJmd0OwotICAgICZsdDtsaSZndDsKLSAgICAgICAgQWx0ZXIzCi0gICAgJmx0Oy9saSZndDsKLSZsdDsvb2wmZ3Q7PC9hbHRlcm5hdGl2ZXM+Ci0gICAgPGhvd3RvU3RhZmY+Jmx0O3AmZ3Q7Ci0gICAgVGhlc2UgYWN0aXZpdGllcyBhcmUgYmVzdCBjYXJyaWVkIG91dCBieSBhIHNtYWxsIHRlYW0gc3RhZmZlZCBieSBjcm9zcy1mdW5jdGlvbmFsIHRlYW0gbWVtYmVycy4gSXNzdWVzIHRoYXQgYXJlCi0gICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbQotICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlCi0gICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZQotICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUKLSAgICB3aXRoIGRpc3RyaWJ1dGlvbiBhbmQgZGVwbG95bWVudCBleHBlcnRpc2UgKGlmIHRob3NlIGlzc3VlcyBhcmUgYXJjaGl0ZWN0dXJhbGx5IHNpZ25pZmljYW50KS4gSW4gb3JkZXIgdG8gdW5kZXJzdGFuZAotICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlCi0gICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLgotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yCi0gICAgY291bnRlcmluZyB0aGlzIHRyZW5kIGlzIHRvIHJldGFpbiBhIHJlbGF0aXZlbHkgc21hbGwgY29yZSB0ZWFtIHdpdGggYSBzYXRlbGxpdGUgZ3JvdXAgb2YgZXh0ZW5kZWQgdGVhbSBtZW1iZXJzIHRoYXQKLSAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlCi0gICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMKLSAgICBuZWVkIHRvIGJlIGFkZHJlc3NlZC4KLSZsdDsvcCZndDs8L2hvd3RvU3RhZmY+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eURlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItQllfX3RpandSclY0MVlVclhJdFUwdyIgbmFtZT0icm9sZV9BMixfSkM5OEFEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUJZX190aWp3UnJWNDFZVXJYSXRVMHciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzIGNvbnNpZGVyYXRpb246Um9sZSBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6Um9sZSBBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIHJlZmluZWQgZGVzY3JpcHRpb24gOiBSb2xlIEEyCi0mbHQ7L3AmZ3Q7PC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1ET1pyUl9zWnd3cGNVdGNvdS1qSXlRIiBuYW1lPSJyb2xlX0ExLF9KQzk4QVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItRE9aclJfc1p3d3BjVXRjb3Utakl5USI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTE6a2V5IGNvbnNpZGVyYXRpb248L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPlJvbGUgQTE6dXNhZ2U8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5Sb2xlIEExOlJlZmluZWQgZGVzY3JpcHRpb248L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLWFyRnJKaXNCeVA5MFlDck1iLWl5amciIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rczwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQgZGVzY3JpcHRpb24gOiByb2xlRGVzYyB3aXRoIG5vIGxpbmtzPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii01T2VHUEg4SlJ6U1JBRlB6QmdIbkpBIiBuYW1lPSJyb2xlX0IyLF9NYzB6d0R6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItNU9lR1BIOEpSelNSQUZQekJnSG5KQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpSb2xlIEIyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpSb2xlIEIyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpSb2xlIEIyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1ZZXJJakRySWxld2Q4aURoSVNNZzFnIiBuYW1lPSJyb2xlX0IxLF9NYzB6d1R6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItWWVySWpEcklsZXdkOGlEaElTTWcxZyI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpSb2xlIEIxPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpSb2xlIEIxPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDogUm9sZSBCMTwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItbmNMaFU0dmhnNmRob0VLVFRrS2tEUSIgbmFtZT0id3BEZXNjMixfVEN1NElEemlFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLW5jTGhVNHZoZzZkaG9FS1RUa0trRFEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6d3BkZXNjMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6d3BkZXNjMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IHdwZGVzYzI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IHdwRGVzYzMgd2l0aCBubyBsaW5rczwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItaG1DQ3ItREtaNnpyOFM2RFhkcWZTQSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0pDOThBanpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1obUNDci1ES1o2enI4UzZEWGRxZlNBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5IDogQXJ0aWZhY3QgQTI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOiBBcnRpZmFjdCBBMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6IEFydGlmYWN0IEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1DREpvX29ZQ2REaTV2cDhJNjl2OU93IiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfSkM5OEF6emxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLUNESm9fb1lDZERpNXZwOEk2OXY5T3ciPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXlzOiBEZWxpdmVyYWJsZSBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IERlbGl2ZXJhYmxlIEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpEZWxpdmVyYWJsZSBBMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItUU45UkdMNWNuMFNsYlV3bkdWMkdfQSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0pESHRBRHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1RTjlSR0w1Y24wU2xiVXduR1YyR19BIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5czpBcnRpZmFjdCBBMjwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6QXJ0aWZhY3QgQTI8L3VzYWdlR3VpZGFuY2U+Ci0gICAgPHJlZmluZWREZXNjcmlwdGlvbj5yZWZpbmVkOkFydGlmYWN0IEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii0xalREcVM0UnZfUEFFSFlGcGVvam1BIiBuYW1lPSJvdXRjb21lX0EyLF9KREh0QVR6bEVkcTV5c0ZPTnIxQkdRIiBndWlkPSItMWpURHFTNFJ2X1BBRUhZRnBlb2ptQSI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPmtleTpPdXRjb21lIEEyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpPdXRjb21lIEEyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpPdXRjb21lIEEyPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1EYWt6bXZBLXFod0dFU0NmWksxMXNRIiBuYW1lPSJhcnRpZmFjdF9CMixfTWRSZnNEemxFZHE1eXNGT05yMUJHUSIgZ3VpZD0iLURha3ptdkEtcWh3R0VTQ2ZaSzExc1EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6QXJ0aWZhY3QgQjI8L2tleUNvbnNpZGVyYXRpb25zPgotICAgIDx1c2FnZUd1aWRhbmNlPnVzYWdlOkFydGlmYWN0IEIyPC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+cmVmaW5lZDpBcnRpZmFjdCBCMjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItTGFEeUF1anhCa1BUaHIyOHQyWGR3ZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIsX01kUmZzVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1MYUR5QXVqeEJrUFRocjI4dDJYZHdnIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OkRlbGl2ZXJhYmxlIEIyPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgICA8dXNhZ2VHdWlkYW5jZT51c2FnZTpEZWxpdmVyYWJsZSBCMjwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPnJlZmluZWQ6RGVsaXZlcmFibGUgQjI8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLW5UdDZIM3JYeXRVc09xcEpMRVFqZHciIG5hbWU9Im91dGNvbWVfQjIsX01ka2FvVHpsRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Ii1uVHQ2SDNyWHl0VXNPcXBKTEVRamR3Ij4KLSAgICA8dXNhZ2VHdWlkYW5jZT4mYW1wO25ic3A7JmFtcDtuYnNwOyZhbXA7bmJzcDs8L3VzYWdlR3VpZGFuY2U+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbiB4bWk6aWQ9Ii16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBndWlkPSItekJBczExUmdMZ19ZU2JzN0Jka1N1USI+Ci0gICAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTEmYW1wO25ic3A7IGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Jmx0O3AmZ3Q7Ci0gICAgVGFzayBBMSZhbXA7bmJzcDsgZ3VpZGFuY2UKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvaGVscGJvb2suZ2lmJnF1b3Q7Ci0gICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7PC91c2FnZUd1aWRhbmNlPgotICAgIDxyZWZpbmVkRGVzY3JpcHRpb24+VGFzayBBMSZhbXA7bmJzcDsgcmVmaW5lZCBkZXNjcmlwdGlvbjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSIteWItTEdpa2NBNU1QZVI4TDNZVzJDQSIgbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5UYXNrIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+VGFzayBBMiBndWlkYW5jZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlRhc2sgQTIgcmVmaW5lZCBkZXNjcmlwdGlvbjwvcmVmaW5lZERlc2NyaXB0aW9uPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24geG1pOmlkPSItd0JWd25LTkE3dnhQWnBZNWgwbmpCUSIgbmFtZT0icm9sZV9BMSxfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLXdCVnduS05BN3Z4UFpwWTVoMG5qQlEiPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Um9sZSBBMSBndWlkYW5jZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFJvbGUgQTEgcmVmaW5lZCBkZXNjCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OwotICAgICB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsKLSZsdDsvcCZndDs8L3JlZmluZWREZXNjcmlwdGlvbj4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVzY3JpcHRvckRlc2NyaXB0aW9uIHhtaTppZD0iLV9qM2Y4ZGp3S3hzS2FDSERuSklxVkEiIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIj4KLSAgICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBBMiBrZXkKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2NyZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7Ci0gICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZiZxdW90OwotICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OwotJmx0Oy9wJmd0Ozwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+Um9sZSBBMiB1c2FnZTwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cmVmaW5lZERlc2NyaXB0aW9uPlJvbGUgQTIgcmVmaW5lZCBkZXNjPC9yZWZpbmVkRGVzY3JpcHRpb24+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9kaWFncmFtLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjU4Y2RiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL2RpYWdyYW0ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JSGdKME94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lIZ0owZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lIZ0owT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JSGdKMHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSUhnSjAteDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lIZ0oxT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lIc1hFT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlBoYXNlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRGFrUWNEemlFZHE1eXNGT05yMUJHUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSUhzWEVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSUhzWEVPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUGhhc2UxIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpQYWdlU3R5bGUiIHhtaTppZD0iX0lIc1hFdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpHdWlkZVN0eWxlIiB4bWk6aWQ9Il9JSHNYRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSUhzWEZPeDRFZHUyT282cS1uSFdnZyIvPgotICA8L25vdGF0aW9uOkRpYWdyYW0+Ci0gIDxvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0geG1pOmlkPSJfSUhzWEZleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6SXRlcmF0aW9uIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRUZWcndUemlFZHE1eXNGT05yMUJHUSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSUhzWEZ1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSUhzWEZleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iSXRlcmF0aW9uMSIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JSHNYRi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSUhzWEdPeDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lIc1hHZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lNRnU2ZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRTczcklUemlFZHE1eXNGT05yMUJHUSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU2dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JTUZ1Ni14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJyb2xlRGVzYzEiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JTUZ1N094NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSU1GdTcteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFza19MaW5rZWRfVG9fVGFza0ExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1N2V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1OGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSU1GdTd1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JTUZ1Ny14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JTUZ1N094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lNRnU4T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IndwRGVzYzEgaXMgbGlua2VkIHRvIGFydGlmYWN0Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU4ZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JTUZ1N2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JTUZ1OHV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJ3cERlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JTUZ1OC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSU1GdTlPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0icm9sZURlc2MyIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19ROTlrQUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSU1GdTlleDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lNRnUtT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSU1GdTl1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSU1GdS11eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lNRnU5LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSU1GdS1PeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSU1GdTlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JTUZ1LWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJ3cERlc2MyIGxpbmtlZCB0byBkZWxpdmVyYWJsZSI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JTUZ1LXV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSU1GdTl1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSU1GdS0teDRFZHUyT282cS1uSFdnZyIgbmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JTUZ1X094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JTUZ1NmV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3Rpdml0eTEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVVaV1VPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lNRnU2dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVVpXVWV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lVWldVdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVVaV1UteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVVpXVk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVkVFc094NEVkdTJPbzZxLW5IV2dnIiB4PSIxMCIgeT0iMTg2Ii8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWUVI4T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1N3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZRUjhleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVlFSOHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWUVI4LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZRUjlPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZRUjl1eDRFZHUyT282cS1uSFdnZyIgeD0iLTEyIiB5PSI0OSIgd2lkdGg9IjE1MSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVldZa094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSU1GdThleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWV1lrZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZXWWt1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVldZay14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWV1lsT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWV1lsdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjY5IiB5PSIyOTciIHdpZHRoPSI5NiIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JVldZbC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSU1GdTgteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lWV1ltT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSVZXWW1leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JVldZbXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lWV1ltLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lWV1luZXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjIxMSIgeT0iMTI5IiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjUyIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1ludXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1OS14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWW4teDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZb094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1lvZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWW91eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWXBPeDRFZHUyT282cS1uSFdnZyIgeD0iMzQyIiB5PSI1MiIgd2lkdGg9IjYzIiBoZWlnaHQ9IjUyIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lWV1lwZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDIiIGVsZW1lbnQ9Il9JTUZ1LXV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSVZXWXB1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVldZcC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lWV1lxT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSVZXWXFleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSVZXWXEteDRFZHUyT282cS1uSFdnZyIgeD0iMjc0IiB5PSIyNTUiIHdpZHRoPSIxNTQiIGhlaWdodD0iNTIiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSU1GdV9leDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lNRnVfdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JTUZ1Xy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JVmlsMnV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsMi14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMERrNk1FREVFZHFPOU0zZnVrWUFfQSIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSVZpbDNPeDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lWaWwzZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRFJfUUVERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSVZpbDNleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbDNPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsM3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSVZpbDMteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsNE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMERSX1FFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsNGV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEExIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18wRHVyTTBERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSVZpbDR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JVmlsNU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG91dGdvaW5nQ29ubmVjdGlvbnMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkxpbmsiIHhtaTppZD0iX0lWaWw1T3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSVZpbDVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JVmlsNXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JVmlsNS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI18yOVpuQWtERUVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JVmlsNk94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JVmlsMnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3Rpdml0eTIiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbDdPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lWaWwyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsN2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWw3dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbDcteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsOE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmlsOHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWwzT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsOU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWw5ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbDl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmlsLWV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbC11eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw0T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmlsLS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaWxfT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbF9leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmlsX3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltQU94NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lWaWw0dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltQXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1BLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltQmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltQi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw0LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltQ2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1DdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUMteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltRE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltRHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSVZpbUQteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lWaWw1dXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JVmltRU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lWaW1FZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSVZpbUV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JVmltRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JVmltRmV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSVZpbDZleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lWaWw2dXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JVmlsNi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPGVkZ2VzIHhtaTp0eXBlPSJub3RhdGlvbjpFZGdlIiB4bWk6aWQ9Il9JV0hOa094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIzMDAxIiBlbGVtZW50PSJfSVZpbDNleDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSVZpbDgteDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lYY3FVT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDQiPgotICAgICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246TG9jYXRpb24iIHhtaTppZD0iX0lYY3FVZXg0RWR1Mk9vNnEtbkhXZ2ciIHk9IjQwIi8+Ci0gICAgICA8L2NoaWxkcmVuPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Um91dGluZ1N0eWxlIiB4bWk6aWQ9Il9JV0hOa2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lXSE5rdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JV0hOay14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8YmVuZHBvaW50cyB4bWk6dHlwZT0ibm90YXRpb246UmVsYXRpdmVCZW5kcG9pbnRzIiB4bWk6aWQ9Il9JYUNFUU94NEVkdTJPbzZxLW5IV2dnIiBwb2ludHM9IlswLCAwLCAwLCAwXSRbMCwgMCwgMCwgMF0iLz4KLSAgICA8L2VkZ2VzPgotICAgIDxlZGdlcyB4bWk6dHlwZT0ibm90YXRpb246RWRnZSIgeG1pOmlkPSJfSWFDRVFleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMzAwMSIgZWxlbWVudD0iX0lWaWw1T3g0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0iX0lWaW1DT3g0RWR1Mk9vNnEtbkhXZ2ciIHRhcmdldD0iX0lWaW1DT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYUlLNE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA0Ij4KLSAgICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkxvY2F0aW9uIiB4bWk6aWQ9Il9JYUlLNGV4NEVkdTJPbzZxLW5IV2dnIiB5PSI0MCIvPgotICAgICAgPC9jaGlsZHJlbj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlJvdXRpbmdTdHlsZSIgeG1pOmlkPSJfSWFDRVF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYUNFUS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWFDRVJPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGJlbmRwb2ludHMgeG1pOnR5cGU9Im5vdGF0aW9uOlJlbGF0aXZlQmVuZHBvaW50cyIgeG1pOmlkPSJfSWFJSzR1eDRFZHUyT282cS1uSFdnZyIgcG9pbnRzPSJbMCwgMCwgMCwgMF0kWzAsIDAsIDAsIDBdIi8+Ci0gICAgPC9lZGdlcz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2JiNGIxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDM4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il80eWMzc1R6Z0VkcTV5c0ZPTnIxQkdRIiBndWlkPSJfNHljM3NUemdFZHE1eXNGT05yMUJHUSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNHljM3NqemdFZHE1eXNGT05yMUJHUSIgaWQ9Ii1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd3lEbndEemlFZHE1eXNGT05yMUJHUSIgaWQ9Ii1ZVlRaUkU1b3k1b0djdWUxWFhoM2RRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUDJXdzBUemtFZHE1eXNGT05yMUJHUSIgaWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTC02VFFEem1FZHE1eXNGT05yMUJHUSIgaWQ9Ii1uVUgwdm9EN1JvS1FnUFQwcmJPd1FRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfaW9WLVFEem1FZHE1eXNGT05yMUJHUSIgaWQ9Ii1hREU0eUZ6RV9tX24yUEl6Y090NHJBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNEhONG9EejhFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1pZm1RTkI1eTFSWktGMUhybTNDZFJBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNEkyM1lEejhFZHFFWnBUSzBXQVVkdyIgaWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbU5mb2tEejlFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM2pWVEFEejlFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRmhERHNEMEJFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTFlHOXNEMEJFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1UUnhoeEFzMXhPS05SckZDRVBwQWx3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfV2U5cmNEMERFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1BZHdBam41dlJDbkVRUUxVYVlKMWR3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfaEZhRnNEMERFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1CWV9fdGlqd1JyVjQxWVVyWEl0VTB3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRVROUU1EMEVFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1ET1pyUl9zWnd3cGNVdGNvdS1qSXlRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfU2FFZE1EMEVFZHFFWnBUSzBXQVVkdyIgaWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSWNfb3NEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii01T2VHUEg4SlJ6U1JBRlB6QmdIbkpBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSWRJeW9EMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1ZZXJJakRySWxld2Q4aURoSVNNZzFnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTDR5YUlEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVURFVDhEMEhFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1yRFhvVzZiV1pfN21rTF9FOVdjeWhnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYWJaU2dEMElFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1obUNDci1ES1o2enI4UzZEWGRxZlNBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTUw3R29EMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1DREpvX29ZQ2REaTV2cDhJNjl2OU93IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUWgwdjREMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1RTjlSR0w1Y24wU2xiVXduR1YyR19BIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfc1pnQllEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii0xalREcVM0UnZfUEFFSFlGcGVvam1BIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdmZQRFFEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1EYWt6bXZBLXFod0dFU0NmWksxMXNRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOGc5TklEMEpFZHFqQUk3N0RIdkJ3QSIgaWQ9Ii1MYUR5QXVqeEJrUFRocjI4dDJYZHdnIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcTYwYTREMGZFZHFOTV9ZUDUzSEtCdyIgaWQ9Ii1uVHQ2SDNyWHl0VXNPcXBKTEVRamR3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOEYtRFVFREVFZHFPOU0zZnVrWUFfQSIgaWQ9Ii16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfX0dNVEVFREVFZHFPOU0zZnVrWUFfQSIgaWQ9Ii15Yi1MR2lrY0E1TVBlUjhMM1lXMkNBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfR19XQW9FREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii13QlZ3bktOQTd2eFBacFk1aDBuakJRIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT3JFOVFFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgZ3VpZD0iXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EiPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9EYUhrZ0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJQaGFzZTEiIGd1aWQ9Il9EYUhrZ0R6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9FRlZyd0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJJdGVyYXRpb24xIiBndWlkPSJfRUZWcndEemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJBY3Rpdml0eTEiIGd1aWQ9Il9FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJBY3Rpdml0eTEiIGd1aWQ9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJ0cnVlIiBzdXBlckFjdGl2aXRpZXM9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBicmVha2Rvd25FbGVtZW50cz0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EgX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EgX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EgX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EgX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EgX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EgXzF4NTdBRHprRWRxNXlzRk9OcjFCR1EgXzNfVU53RHprRWRxNXlzRk9OcjFCR1EgXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZVlRaUkU1b3k1b0djdWUxWFhoM2RRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtWVZUWlJFNW95NW9HY3VlMVhYaDNkUSIvPgotICAgICAgICAgICAgPHJvYWRtYXBzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8c3VwcG9ydGluZ01hdGVyaWFscyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNoZWNrbGlzdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNvbmNlcHRzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8ZXhhbXBsZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxndWlkZWxpbmVzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8cmV1c2FibGVBc3NldHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGd1aWQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGFzc29jaWF0ZWQgdG8gdGFza0ExIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrX0xpbmtlZF9Ub19UYXNrQTEiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiIGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgbWFuZGF0b3J5SW5wdXQ9Il9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBvdXRwdXQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pZm1RTkI1eTFSWktGMUhybTNDZFJBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtaWZtUU5CNXkxUlpLRjFIcm0zQ2RSQSIvPgotICAgICAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdHprSWdCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIGd1aWQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIgbWFuZGF0b3J5SW5wdXQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBvdXRwdXQ9Il9TVUdRZ0R6aUVkcTV5c0ZPTnIxQkdRIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1Ca3Y2VlRkTXBnNGJEMFlrZkhaNGRnIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtQmt2NlZUZE1wZzRiRDBZa2ZIWjRkZyIvPgotICAgICAgICAgICAgPFRhc2sgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RuZGJvQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJyb2xlRGVzYzEiIGd1aWQ9Il9QMXNVWUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzEgbGlua2VkIHRvIHJvbGVBMSIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MxIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXBPOExlY2VHWGpLZWFwdUxvRmZreEEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1wTzhMZWNlR1hqS2VhcHVMb0Zma3hBIi8+Ci0gICAgICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiIG5hbWU9InJvbGVEZXNjMiIgZ3VpZD0iX1E5OWtBRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InJvbGVEZXNjMiBsaW5rZWQgdG8gcm9sZUEyIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYzIiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fVGgtanY1am0waDBmMG1GaEt0cWdRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtX1RoLWp2NWptMGgwZjBtRmhLdHFnUSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfU1VHUWdEemlFZHE1eXNGT05yMUJHUSIgbmFtZT0id3BEZXNjMSIgZ3VpZD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249InRoaXMgd3AgaXMgbGlua2VkIHRvIGFydGlmYWN0IiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MxIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgcHJlZml4PSJwcmVmaXgiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii01dDhHdG9MNElCb3hmYXpCSV8wY3JBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtNXQ4R3RvTDRJQm94ZmF6QklfMGNyQSIvPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJ3cERlc2MyIiBndWlkPSJfVEN1NElEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIgZGVsaXZlcmFibGVQYXJ0cz0iX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EgX1hzWHEwRHprRWRxNXlzRk9OcjFCR1EgX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1uY0xoVTR2aGc2ZGhvRUtUVGtLa0RRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtbmNMaFU0dmhnNmRob0VLVFRrS2tEUSIvPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9Xcl95OER6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfV3JfeThEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9Yc1hxMER6a0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iX1hzWHEwRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBndWlkPSJfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9InByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXJEWG9XNmJXWl83bWtMX0U5V2N5aGciIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy1yRFhvVzZiV1pfN21rTF9FOVdjeWhnIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfM19VTndEemtFZHE1eXNGT05yMUJHUSIgbmFtZT0icm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgZ3VpZD0iXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MiIHN1cGVyQWN0aXZpdGllcz0iX0U3M3JJVHppRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1hckZySmlzQnlQOTBZQ3JNYi1peWpnIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtYXJGckppc0J5UDkwWUNyTWItaXlqZyIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIHhtaTppZD0iXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgZ3VpZD0iXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOnRhc2sgd2l0aCBubyBsaW5rcyIgcHJlc2VudGF0aW9uTmFtZT0idGFzayB3aXRoIG5vIGxpbmtzIiBzdXBlckFjdGl2aXRpZXM9Il9FNzNySVR6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVFJ4aHhBczF4T0tOUnJGQ0VQcEFsdyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLVRSeGh4QXMxeE9LTlJyRkNFUHBBbHciLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfUk1ON0VEemxFZHE1eXNGT05yMUJHUSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il9STU43RUR6bEVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX2Y2cHdVRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VUR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3VVR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1VUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3VWp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdVenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3VXp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfRnJ0TW9EemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3VkR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3VlR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1ZUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3Vmp6akVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdWenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3Vnp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfTHdMUWdEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3V0R6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mNnB3V1R6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1dUempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mNnB3V2p6akVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSIxODYuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3V3p6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1d6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd1hEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1hUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdYVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1hqempFZHE1eXNGT05yMUJHUSIgeD0iMjExLjAiIHk9IjEyOS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Y2cHdYenpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mNnB3WHp6akVkcTV5c0ZPTnIxQkdRIiBlbGVtZW50PSJfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9mNnB3WUR6akVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iMjEwLjAiIGhlaWdodD0iNTIuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1lUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdZVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1lqempFZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3WXp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1l6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd1pEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjZwd1pUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2cHdaVHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjZwd1pqempFZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mNnB3Wnp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjZwd1p6empFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX1RDdTRJRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjZwd2FEempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfZjdQbU1EempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NRHpqRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfZjdQbU1UempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NVHpqRWRxNXlzRk9OcjFCR1EiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfZjdQbU1qempFZHE1eXNGT05yMUJHUSIgeD0iLTEyLjAiIHk9IjQ5LjAiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX2Y3aklNVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN2pJTVR6akVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9mN2pJTUR6akVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9nV1hiOFR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZ1dYYjhUempFZHE1eXNGT05yMUJHUSIgYW5jaG9yPSJfZ1dYYjhEempFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfc1FvUHNUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3NRb1BzVHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX3NRb1BzRHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3RpbG0wVHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il90aWxtMFR6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il90aWxtMER6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il94SDZ1d1R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfeEg2dXdUejlFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfeEg2dXdEejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfMFU5U2dUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzBVOVNnVHo5RWRxRVpwVEswV0FVZHciIGFuY2hvcj0iXzBVOVNnRHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iXzhpRWQ2eno5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNnp6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il84aUVkNmp6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZZHJpUVQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVFUMEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWWRyaVFEMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfWXc1Wk1UMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1l3NVpNVDBBRWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX1l3NVpNRDBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lLWEFNVDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTVQwZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95S1hBTUQwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il95aURIY0QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWlESGNEMGVFZHFOTV9ZUDUzSEtCdyIgYW5jaG9yPSJfeWg1OWdEMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX2Y3aklNRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9mN2pJTUR6akVkcTV5c0ZPTnIxQkdRIiBncmFwaEVkZ2U9Il9mN2pJTVR6akVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfZ1dYYjhEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2dXWGI4RHpqRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX2dXWGI4VHpqRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9zUW9Qc0R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfc1FvUHNEejlFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfc1FvUHNUejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3RpbG0wRHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il90aWxtMER6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il90aWxtMFR6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeEg2dXdEejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX3hINnV3RHo5RWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX3hINnV3VHo5RWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il8wVTlTZ0R6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfMFU5U2dEejlFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfMFU5U2dUejlFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzhpRWQ2ano5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNmp6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il84aUVkNnp6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfWWRyaVFEMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1lkcmlRRDBBRWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX1lkcmlRVDBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZdzVaTUQwQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk1EMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWXc1Wk1UMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3lLWEFNRDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTUQwZUVkcU5NX1lQNTNIS0J3IiBncmFwaEVkZ2U9Il95S1hBTVQwZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeWg1OWdEMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3loNTlnRDBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lpREhjRDBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjdQbU16empFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y3UG1NenpqRWRxNXlzRk9OcjFCR1EiIGVsZW1lbnQ9Il9GcnRNb0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX2Y3UG1ORHpqRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSIxNTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9mN1BtTlR6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU5UempFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9mN1BtTmp6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU5qempFZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9mN1BtTnp6akVkcTV5c0ZPTnIxQkdRIiB4PSI2OS4wIiB5PSIyOTcuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9mN1BtT0R6akVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfZjdQbU9EempFZHE1eXNGT05yMUJHUSIgZWxlbWVudD0iX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfZjdQbU9UempFZHE1eXNGT05yMUJHUSIgd2lkdGg9Ijk2LjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfOGlFZDREejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0RHo5RWRxRVpwVEswV0FVZHciPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfOGlFZDRUejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0VHo5RWRxRVpwVEswV0FVZHciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfOGlFZDRqejlFZHFFWnBUSzBXQVVkdyIgeD0iMzQyLjAiIHk9IjUyLjAiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iXzhpRWQ3VHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkN1R6OUVkcUVacFRLMFdBVWR3IiBhbmNob3I9Il84aUVkN0R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il9ZZHJpUXowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWWRyaVF6MEFFZHFFWnBUSzBXQVVkdyIgYW5jaG9yPSJfWWRyaVFqMEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfWXc1Wk16MEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1l3NVpNejBBRWRxRVpwVEswV0FVZHciIGFuY2hvcj0iX1l3NVpNajBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX3lLWEFNejBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTXowZUVkcU5NX1lQNTNIS0J3IiBhbmNob3I9Il95S1hBTWowZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhFZGdlIiB4bWk6aWQ9Il95aURIY2owZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfeWlESGNqMGVFZHFOTV9ZUDUzSEtCdyIgYW5jaG9yPSJfeWlESGNUMGVFZHFOTV9ZUDUzSEtCdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iXzhpRWQ3RHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkN0R6OUVkcUVacFRLMFdBVWR3IiBncmFwaEVkZ2U9Il84aUVkN1R6OUVkcUVacFRLMFdBVWR3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfWWRyaVFqMEFFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iX1lkcmlRajBBRWRxRVpwVEswV0FVZHciIGdyYXBoRWRnZT0iX1lkcmlRejBBRWRxRVpwVEswV0FVZHciLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9ZdzVaTWowQUVkcUVacFRLMFdBVWR3IiBndWlkPSJfWXc1Wk1qMEFFZHFFWnBUSzBXQVVkdyIgZ3JhcGhFZGdlPSJfWXc1Wk16MEFFZHFFWnBUSzBXQVVkdyIvPgotICAgICAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3lLWEFNajBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il95S1hBTWowZUVkcU5NX1lQNTNIS0J3IiBncmFwaEVkZ2U9Il95S1hBTXowZUVkcU5NX1lQNTNIS0J3Ii8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfeWlESGNUMGVFZHFOTV9ZUDUzSEtCdyIgZ3VpZD0iX3lpREhjVDBlRWRxTk1fWVA1M0hLQnciIGdyYXBoRWRnZT0iX3lpREhjajBlRWRxTk1fWVA1M0hLQnciLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfOGlFZDR6ejlFZHFFWnBUSzBXQVVkdyIgZ3VpZD0iXzhpRWQ0eno5RWRxRVpwVEswV0FVZHciIGVsZW1lbnQ9Il9Md0xRZ0R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iXzhpRWQ1RHo5RWRxRVpwVEswV0FVZHciIHdpZHRoPSI2My4wIiBoZWlnaHQ9IjUyLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iXzhpRWQ1VHo5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNVR6OUVkcUVacFRLMFdBVWR3Ij4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iXzhpRWQ1ano5RWRxRVpwVEswV0FVZHciIGd1aWQ9Il84aUVkNWp6OUVkcUVacFRLMFdBVWR3IiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iXzhpRWQ1eno5RWRxRVpwVEswV0FVZHciIHg9IjI3NC4wIiB5PSIyNTUuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il84aUVkNkR6OUVkcUVacFRLMFdBVWR3IiBndWlkPSJfOGlFZDZEejlFZHFFWnBUSzBXQVVkdyIgZWxlbWVudD0iX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfOGlFZDZUejlFZHFFWnBUSzBXQVVkdyIgd2lkdGg9IjE1NC4wIiBoZWlnaHQ9IjUyLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZjZ5NlFEempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2Y2eTZRRHpqRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfRTczcklUemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX0JTNmdFRHpsRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MiIgZ3VpZD0iX0JTNmdFRHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHkiIHhtaTppZD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIG5hbWU9IkFjdGl2aXR5MiIgZ3VpZD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IkFjdGl2aXR5MiBjb250YWluaW5kIERuRCB0YXNrcyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBwcmVmaXg9IlByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJlYWtkb3duRWxlbWVudHM9Il8wRFJfUUVERUVkcU85TTNmdWtZQV9BIF8wRGs2TUVERUVkcU85TTNmdWtZQV9BIF8wRGs2TVVERUVkcU85TTNmdWtZQV9BIF8wRHVyTUVERUVkcU85TTNmdWtZQV9BIF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIF8wRHVyTWtERUVkcU85TTNmdWtZQV9BIF8wRHVyTTBERUVkcU85TTNmdWtZQV9BIF8yODg3RUVERUVkcU85TTNmdWtZQV9BIF8yOVpuQUVERUVkcU85TTNmdWtZQV9BIF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIF8yOVpuQWtERUVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQWR3QWpuNXZSQ25FUVFMVWFZSjFkdyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLUFkd0FqbjV2UkNuRVFRTFVhWUoxZHciLz4KLSAgICAgICAgICAgIDxyb2FkbWFwcyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPHN1cHBvcnRpbmdNYXRlcmlhbHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxjaGVja2xpc3RzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I191ckxkY0I4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciLz4KLSAgICAgICAgICAgIDxjb25jZXB0cyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPGV4YW1wbGVzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I195UXpnVUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgICA8Z3VpZGVsaW5lcyBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIvPgotICAgICAgICAgICAgPHJldXNhYmxlQXNzZXRzIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182N2s0RUI4ckVkcVF2T2pYOGRvQ0N3Ii8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfMERSX1FFREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0idGFza19BMSIgZ3VpZD0iXzBEUl9RRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgIiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIG1hbmRhdG9yeUlucHV0PSJfMER1ck1FREVFZHFPOU0zZnVrWUFfQSBfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIgb3B0aW9uYWxJbnB1dD0iXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIG91dHB1dD0iXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfMERrNk1FREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXpCQXMxMVJnTGdfWVNiczdCZGtTdVEiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy16QkFzMTFSZ0xnX1lTYnM3QmRrU3VRIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfN004bnNBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHcjX3R2RjRNQkJQRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyNfdUNCYlFCQlBFZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il8wRGs2TUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiByZXNwb25zaWJsZUZvcj0iXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EgXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii13QlZ3bktOQTd2eFBacFk1aDBuakJRIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtd0JWd25LTkE3dnhQWnBZNWgwbmpCUSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzU1emswQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRGs2TVVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfMERrNk1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fajNmOGRqd0t4c0thQ0hEbkpJcVZBIiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtX2ozZjhkandLeHNLYUNIRG5KSXFWQSIvPgotICAgICAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il8wRHVyTUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBEdXJNVURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfMER1ck1VREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRHVyTWtERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBkZWxpdmVyYWJsZVBhcnRzPSJfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSBfMEVVaEVVREVFZHFPOU0zZnVrWUFfQSBfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il8wRHVyTTBERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfMEVVaEVFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8wRVVoRVVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzBFVWhFa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il8yODg3RUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJ0YXNrX0EyIiBndWlkPSJfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMiAiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIG1hbmRhdG9yeUlucHV0PSJfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgb3B0aW9uYWxJbnB1dD0iXzI5Wm5BVURFRWRxTzlNM2Z1a1lBX0EiIG91dHB1dD0iXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfMERrNk1VREVFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXliLUxHaWtjQTVNUGVSOEwzWVcyQ0EiIGhyZWY9InVtYTovLy1FLWQ0SmN1Mjk3cnhVcThsdGU4cW53Iy15Yi1MR2lrY0E1TVBlUjhMM1lXMkNBIi8+Ci0gICAgICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPHNlbGVjdGVkU3RlcHMgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyNfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOVpuQUVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzI5Wm5BRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMjlabkFVREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSIgZGVsaXZlcmFibGVQYXJ0cz0iXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EgXzI5c2g4VURFRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOVpuQWtERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfMjlabkFrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9CUzZnRVR6bEVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il8yOXNoOEVERUVkcU85TTNmdWtZQV9BIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iXzI5c2g4VURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfTmdEODhEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg4RHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDg4VHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4OFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDg4anptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEODh6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg4enptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEODlEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEODlUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg5VHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEODlqem1FZHE1eXNGT05yMUJHUSIgeD0iMTAuMCIgeT0iMTg2LjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEODl6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDg5enptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOC1Eem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOC1Uem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDgtVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOC1qem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q4LXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOC16em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q4X0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q4X1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOF9Uem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q4X2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDhfenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q4X3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlBRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlBVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5QVR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlBanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUF6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlBenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUJEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUJUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlCVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUJqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5Qnp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUJ6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5Q0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5Q1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUNUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5Q2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlDenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5Q3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlERHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlEVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlEanptRWRxNXlzRk9OcjFCR1EiIHg9IjEwLjAiIHk9IjU4NC4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlEenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RHp6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlFRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlFVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5RVR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlFanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUV6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlFenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUZEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdEOUZUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlGVHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdEOUZqem1FZHE1eXNGT05yMUJHUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ0Q5Rnp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUZ6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ0Q5R0R6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ0Q5R1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdEOUdUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ0Q5R2p6bUVkcTV5c0ZPTnIxQkdRIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlHenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5R3p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxzaXplIHhtaTppZD0iX05nRDlIRHptRWRxNXlzRk9OcjFCR1EiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX05nRDlIVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5SFR6bUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX05nRDlIanptRWRxNXlzRk9OcjFCR1EiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfTmdEOUh6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nRDlIenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPHNpemUgeG1pOmlkPSJfTmdEOUlEem1FZHE1eXNGT05yMUJHUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfTmdOdDhEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnQ4RHptRWRxNXlzRk9OcjFCR1EiPgotICAgICAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfTmdOdDhUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnQ4VHptRWRxNXlzRk9OcjFCR1EiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfTmdOdDhqem1FZHE1eXNGT05yMUJHUSIgeD0iMTAuMCIgeT0iNjAuMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTmdOdUJUem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCVHptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX05nTnVCRHptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX04wN1pzVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac1R6bUVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9OMDdac0R6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfTmdOdUJEem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCRHptRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX05nTnVCVHptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OMDdac0R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTjA3WnNEem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTjA3WnNUem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050OHp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDh6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050OUR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050OVR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDlUem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ050OWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdDlqem1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ050OXp6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSIzMTIuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050LUR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC1Eem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050LVR6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050LWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC1qem1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ050LXp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdC16em1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ050X0R6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSI0NDguMCIvPgotICAgICAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfTmdOdUJ6em1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCenptRWRxNXlzRk9OcjFCR1EiIGFuY2hvcj0iX05nTnVCanptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaEVkZ2UiIHhtaTppZD0iX04wN1pzenptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OMDdac3p6bUVkcTV5c0ZPTnIxQkdRIiBhbmNob3I9Il9OMDdac2p6bUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgICAgICAgIDxhbmNob3JhZ2UgeG1pOmlkPSJfTmdOdUJqem1FZHE1eXNGT05yMUJHUSIgZ3VpZD0iX05nTnVCanptRWRxNXlzRk9OcjFCR1EiIGdyYXBoRWRnZT0iX05nTnVCenptRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgICAgPGFuY2hvcmFnZSB4bWk6aWQ9Il9OMDdac2p6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTjA3WnNqem1FZHE1eXNGT05yMUJHUSIgZ3JhcGhFZGdlPSJfTjA3WnN6em1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ050X1R6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdF9Uem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ050X2p6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9OZ050X3p6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdF96em1FZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9OZ051QUR6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUFEem1FZHE1eXNGT05yMUJHUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIi8+Ci0gICAgICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9OZ051QVR6bUVkcTV5c0ZPTnIxQkdRIiB4PSIxMC4wIiB5PSI3MjAuMCIvPgotICAgICAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9OZ051QWp6bUVkcTV5c0ZPTnIxQkdRIiBndWlkPSJfTmdOdUFqem1FZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9OZ051QXp6bUVkcTV5c0ZPTnIxQkdRIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX05nRDlJVHptRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9OZ0Q5SVR6bUVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICA8L2RpYWdyYW1zPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6SXRlcmF0aW9uIiB4bWk6aWQ9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJJdGVyYXRpb24xIiBndWlkPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBzdXBlckFjdGl2aXRpZXM9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBpc09uZ29pbmc9InRydWUiIGJyZWFrZG93bkVsZW1lbnRzPSJfRTczcklUemlFZHE1eXNGT05yMUJHUSBfQlM2Z0VUemxFZHE1eXNGT05yMUJHUSI+Ci0gICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1WUlVDU2hBdlhyc0xnczdQWnpIZ1V3IiBocmVmPSJ1bWE6Ly8tRS1kNEpjdTI5N3J4VXE4bHRlOHFudyMtVlJVQ1NoQXZYcnNMZ3M3UFp6SGdVdyIvPgotICAgICAgICAgIDxyb2FkbWFwcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfWXVrZ1FBLVZFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxzdXBwb3J0aW5nTWF0ZXJpYWxzIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPGNoZWNrbGlzdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Y29uY2VwdHMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX09WTFZjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8ZXhhbXBsZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3VhaldjQS1URWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICA8Z3VpZGVsaW5lcyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDxyZXVzYWJsZUFzc2V0cyBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX3JrVzhrRDBlRWRxTk1fWVA1M0hLQnciIGd1aWQ9Il9ya1c4a0QwZUVkcU5NX1lQNTNIS0J3Ij4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9ya1c4a1QwZUVkcU5NX1lQNTNIS0J3IiBndWlkPSJfcmtXOGtUMGVFZHFOTV9ZUDUzSEtCdyIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9FRlZyd1R6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gICAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlBoYXNlIiB4bWk6aWQ9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBuYW1lPSJQaGFzZTEiIGd1aWQ9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb25OYW1lPSJQaGFzZTEiIHN1cGVyQWN0aXZpdGllcz0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiIGJyZWFrZG93bkVsZW1lbnRzPSJfRUZWcndUemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX2V3bHc4RHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9ld2x3OER6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfZXdsdzhUempFZHE1eXNGT05yMUJHUSIgZ3VpZD0iX2V3bHc4VHpqRWRxNXlzRk9OcjFCR1EiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfRGFrUWNEemlFZHE1eXNGT05yMUJHUSIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPGRpYWdyYW1zIHhtaTppZD0iX2Jjc1hRRHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9iY3NYUUR6akVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX2Jjc1hRVHpqRWRxNXlzRk9OcjFCR1EiIGd1aWQ9Il9iY3NYUVR6akVkcTV5c0ZPTnIxQkdRIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8L2RpYWdyYW1zPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBuYW1lPSJDUDEgd2l0aCBhbGwgZWxlbWVudHMiIGd1aWQ9Il80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJlYWtkb3duRWxlbWVudHM9Il9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIj4KLSAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItRS1kNEpjdTI5N3J4VXE4bHRlOHFudyIgaHJlZj0idW1hOi8vLUUtZDRKY3UyOTdyeFVxOGx0ZThxbncjLUUtZDRKY3UyOTdyeFVxOGx0ZThxbnciLz4KLSAgICAgIDxkZWZhdWx0Q29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgICAgPHZhbGlkQ29udGV4dCBocmVmPSJ1bWE6Ly9fcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSNfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIvPgotICAgIDwvcHJvY2Vzcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQ+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0YzRkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTppZD0iLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzLF9adFpiTVVERkVkcU85TTNmdWtZQV9BIiBndWlkPSItaWNPNnBJSGRabTlWeHljLUpaOVV5dyI+Ci0gICAgPG1haW5EZXNjcmlwdGlvbj5tYWluOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvbWFpbkRlc2NyaXB0aW9uPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5LZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC91c2FnZUd1aWRhbmNlPgotICAgIDxwdXJwb3NlPlB1cnBvc2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9wdXJwb3NlPgotICAgIDxhbHRlcm5hdGl2ZXM+YWx0ZXJuYXRpdmVzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPkhvdyB0byBzdGFmZjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L2hvd3RvU3RhZmY+Ci0gICAgPGV4dGVybmFsSWQ+RXh0ZXJuYWwgSUQ6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9leHRlcm5hbElkPgotICAgIDxzY29wZT5zY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3Njb3BlPgotICAgIDx1c2FnZU5vdGVzPnVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50czwvdXNhZ2VOb3Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbiB4bWk6aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiBuYW1lPSIsX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGd1aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIj4KLSAgICA8bWFpbkRlc2NyaXB0aW9uPm1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvbWFpbkRlc2NyaXB0aW9uPgotICAgIDxrZXlDb25zaWRlcmF0aW9ucz5rZXk6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gICAgPHVzYWdlR3VpZGFuY2U+dXNhZ2U6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvdXNhZ2VHdWlkYW5jZT4KLSAgICA8cHVycG9zZT5wdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHM8L3B1cnBvc2U+Ci0gICAgPGFsdGVybmF0aXZlcz5hbHRlcm5hdGl2ZXM6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50czwvYWx0ZXJuYXRpdmVzPgotICAgIDxob3d0b1N0YWZmPmhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzPC9ob3d0b1N0YWZmPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6QWN0aXZpdHlEZXNjcmlwdGlvbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmViMzc3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZ21mL3J1bnRpbWUvMS4wLjAvbm90YXRpb24iIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi9kaWFncmFtLzEuMC4wL2RpYWdyYW0uZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lheTVSdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbERobDhFREZFZHFPOU0zZnVrWUFfQSIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lheTVSLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTVVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JYXk1U094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6VGFza05vZGUiIHhtaTppZD0iX0lheTVTZXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JYXk1VE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWF5NVN1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWF5NVR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lheTVTLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWF5NVRPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWF5NVNleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYXk1VGV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lheTVUdXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JYXk1U3V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYXk1VC14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19HcWhtTkVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtPgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JYXk1VU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBREQiIGVsZW1lbnQ9Il9JYXk1UnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJhY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWF5NVZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lheTVSLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYXk1VmV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lheTVWdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWF5NVYteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYXk1V094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYXk1V3V4NEVkdTJPbzZxLW5IV2dnIiB4PSIzMCIgeT0iODgiIHdpZHRoPSIyMjgiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWF5NVcteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lheTVTLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYXk1WE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lheTVYZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWF5NVh1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYXk1WC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYXk1WWV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxNDMiIHk9IjEiIHdpZHRoPSI4NCIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYXk1WXV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWF5NVR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lheTVZLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWF5NVpPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYXk1WmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lheTVadXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lheTVhT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjE0MyIgeT0iMTc1IiB3aWR0aD0iODQiIGhlaWdodD0iODMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWF5NVVleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lheTVVdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JYXk1VS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPG9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbSB4bWk6aWQ9Il9JYTRfNC14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JYTRfNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWE0XzVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQVVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWE0XzV1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lhNF82ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYTRfNS14NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYTRfN2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWE0XzZPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JYTRfNmV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JYTRfNXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lhNF82dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19sNXlVQkVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JYTRfNi14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0XzdPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JYTRfN2V4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWE0XzUteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0Xzd1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWE0XzcteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWE0XzhPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWE0XzQteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgbWVhc3VyZW1lbnRVbml0PSJQaXhlbCI+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JYTRfOU94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWE0XzVPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lhNF85ZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWE0Xzl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JYTRfOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lhNF8tT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lhNF8tdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjMwIiB5PSIyMzYiIHdpZHRoPSIyMjEiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWE0Xy0teDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lhNF82T3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYTRfX094NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNF9fZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWE0X191eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYTRfXy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYTVBQWV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzIiIHk9IjEiIHdpZHRoPSI5NCIgaGVpZ2h0PSIyMTUiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWE1QUF1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lhNF83ZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JYTVBQS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNUFCT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWE1QUJleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JYTVBQnV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JYTVBQ094NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzciIHk9IjMyMyIgd2lkdGg9Ijg0IiBoZWlnaHQ9IjE2NiIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JYTRfOGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWE0Xzh1eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lhNF84LXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMzljMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9aekRYUVVERkVkcU85TTNmdWtZQV9BIiBndWlkPSJfWnpEWFFVREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWnpEWFFrREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1pY082cElIZFptOVZ4eWMtSlo5VXl3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdEdGNHdVREdFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EiIG5hbWU9IkNQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBndWlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiIG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgZ3VpZD0iX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBndWlkPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgc3VwZXJBY3Rpdml0aWVzPSJfWnRaYk1VREZFZHFPOU0zZnVrWUFfQSIgYnJlYWtkb3duRWxlbWVudHM9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIF9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTVVEUUVkcXJoc1poM1FOQU1RIF9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIF9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1TcmNWUy03ZFNZREUyUnBtN1NJa3lBIiBocmVmPSJ1bWE6Ly8taWNPNnBJSGRabTlWeHljLUpaOVV5dyMtU3JjVlMtN2RTWURFMlJwbTdTSWt5QSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBuYW1lPSJ0YXNrX0EzIiBndWlkPSJfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IFRhc2sgQTMiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEgX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiIG1hbmRhdG9yeUlucHV0PSJfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgb3B0aW9uYWxJbnB1dD0iX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIG91dHB1dD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19vVWx1RUVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI19yQ1d3VUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI191bXlnWUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnI192eDVCa0VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQTMiIGd1aWQ9Il9HcVgxTVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJicmllZiA6IFJvbGUgQTMiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTMgZXh0ZW5kcyBSb2xlIEEyIiBzdXBlckFjdGl2aXRpZXM9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9BMiIgZ3VpZD0iX0dxaG1NRURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSIgcmVzcG9uc2libGVGb3I9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIF9HcWhtTTBEUUVkcXJoc1poM1FOQU1RIF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0icm9sZV9BMSIgZ3VpZD0iX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU1rRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBndWlkPSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2xEaGw4RURGRWRxTzlNM2Z1a1lBX0EiIGRlbGl2ZXJhYmxlUGFydHM9Il9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIF9HcXF3SVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3FobU5FRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9HcXF3SUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIG5hbWU9Im91dGNvbWVfQTIiIGd1aWQ9Il9HcXF3SVVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPGRpYWdyYW1zIHhtaTppZD0iX19wbGRrRURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxka0VEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRrVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxka1VEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZGtrRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRrMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkazBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FYMU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRsRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkbFVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZGxVRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRsa0RRRWRxcmhzWmgzUU5BTVEiIHg9IjMwLjAiIHk9Ijg4LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkbDBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZGwwRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxWDFNVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkbUVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iMjI4LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRtVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbVVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZG1rRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRtMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkbTBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU1FRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRuRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkblVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG5VRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRua0RRRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkbjBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZG4wRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxaG1NVURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkb0VEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3BsZG9VRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRvVURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcGxkb2tEUUVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3BsZG8wRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wbGRvMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcWhtTWtEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3BsZHBFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wbGRwVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcFVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfX3BsZHBrRFFFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX19wbGRwMERRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcGxkcDBEUUVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfR3FobU0wRFFFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX19wbGRxRURRRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9fcGxkcVVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHFVRFFFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wbGRxa0RRRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkcTBEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHEwRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxaG1ORURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcGxkckVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfX3A0WWdFRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFlnRURRRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9fcDRZZ1VEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWdVRFFFZHFyaHNaaDNRTkFNUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX19wNFlna0RRRWRxcmhzWmgzUU5BTVEiIHg9IjE0My4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfX3FDSmdVRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19xQ0pnVURRRWRxcmhzWmgzUU5BTVEiIGFuY2hvcj0iX19xQ0pnRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX19xQ0pnRURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcUNKZ0VEUUVkcXJoc1poM1FOQU1RIiBncmFwaEVkZ2U9Il9fcUNKZ1VEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfX3A0WWcwRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFlnMERRRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfX3A0WWhFRFFFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX19wNFloVURRRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9fcDRZaFVEUUVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfX3A0WWhrRFFFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX19wNFloa0RRRWRxcmhzWmgzUU5BTVEiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9fcDRZaDBEUUVkcXJoc1poM1FOQU1RIiB4PSIxNDMuMCIgeT0iMTc1LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcDRZaUVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3A0WWlFRFFFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX0dxWDFNRURRRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9fcDRZaVVEUUVkcXJoc1poM1FOQU1RIiB3aWR0aD0iODQuMCIgaGVpZ2h0PSI4My4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9fcGxkclVEUUVkcXJoc1poM1FOQU1RIiBndWlkPSJfX3BsZHJVRFFFZHFyaHNaaDNRTkFNUSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiIGVsZW1lbnQ9Il9sRGhsOEVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICA8L2RpYWdyYW1zPgotICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZFhEZDhFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX2RYRGQ4RURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgeG1pOmlkPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIHN1cGVyQWN0aXZpdGllcz0iX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyZWFrZG93bkVsZW1lbnRzPSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUFFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0idGFza19CMiIgZ3VpZD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEgX2w1eVVBMERQRWRxcmhzWmgzUU5BTVEiIG1hbmRhdG9yeUlucHV0PSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJVRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgb3B0aW9uYWxJbnB1dD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEgX2w1eVVDRURQRWRxcmhzWmgzUU5BTVEiIG91dHB1dD0iX2w1eVVDVURQRWRxcmhzWmgzUU5BTVEgX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19vcVlzd0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1KM3owSUdmamVoaXQwdUZiVEpjYTdnI19xeXU1VUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVBVURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIHJlc3BvbnNpYmxlRm9yPSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSBfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVBa0RQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQTBEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFJvbGUgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVCRURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iX2w1eVVCVURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il9sNXlVQmtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEiIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBndWlkPSJfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGRlbGl2ZXJhYmxlUGFydHM9Il9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIF9sNTdkOFVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGd1aWQ9Il9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSIgZGVsaXZlcmFibGVQYXJ0cz0iX2w1N2Q4a0RQRWRxcmhzWmgzUU5BTVEgX2w1N2Q4MERQRWRxcmhzWmgzUU5BTVEgX2w1N2Q5RURQRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQ1VEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfbDV5VUNrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il9kWUdtMEVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJhcnRpZmFjdF9CMiIgZ3VpZD0iX2w1N2Q4RURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDU3ZDhVRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iYXJ0aWZhY3RfQTEiIGd1aWQ9Il9sNTdkOGtEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iX2w1N2Q4MERQRWRxcmhzWmgzUU5BTVEiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfbDU3ZDlFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxkaWFncmFtcyB4bWk6aWQ9Il9COUdfWUVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1lFRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfWVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1lVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19Za0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfWTBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX1kwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfWkVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX1pVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19aVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfWmtEUkVkcXJoc1poM1FOQU1RIiB4PSIzMC4wIiB5PSIyMzYuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19aMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfWjBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUFVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19hRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSIyMjEuMCIgaGVpZ2h0PSI2Ny4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2FVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19hVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfYWtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2EwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19hMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQWtEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2JFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19iVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfYlVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2JrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19iMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfYjBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19jRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfY1VEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2NVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ja0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfYzBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2MwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVCRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfZEVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2RVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19kVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfZGtEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2QwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19kMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2VFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19lVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZVVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2VrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19lMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfZTBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUJrRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19mRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfZlVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2ZVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19ma0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfZjBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2YwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVCMERQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfZ0VEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2dVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19nVURSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9COUdfZ2tEUkVkcXJoc1poM1FOQU1RIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2cwRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19nMERSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQ0VEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2hFRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX0I5R19oVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaFVEUkVkcXJoc1poM1FOQU1RIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2hrRFJFZHFyaHNaaDNRTkFNUSIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19oMERSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfaDBEUkVkcXJoc1poM1FOQU1RIiBlbGVtZW50PSJfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX0I5R19pRURSRWRxcmhzWmgzUU5BTVEiIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfaVVEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2lVRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19pa0RSRWRxcmhzWmgzUU5BTVEiIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9COUdfaTBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2kwRFJFZHFyaHNaaDNRTkFNUSIgZWxlbWVudD0iX2w1eVVDa0RQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9COUdfakVEUkVkcXJoc1poM1FOQU1RIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfQjlHX2prRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19qa0RSRWRxcmhzWmgzUU5BTVEiPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il9COUdfajBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2owRFJFZHFyaHNaaDNRTkFNUSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX0I5R19rRURSRWRxcmhzWmgzUU5BTVEiIHg9IjEzMi4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfQjlHX21VRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19tVURSRWRxcmhzWmgzUU5BTVEiIGFuY2hvcj0iX0I5R19tRURSRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX0I5R19tRURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfbUVEUkVkcXJoc1poM1FOQU1RIiBncmFwaEVkZ2U9Il9COUdfbVVEUkVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2tVRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19rVURSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2trRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijk0LjAiIGhlaWdodD0iMjE1LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9COUdfazBEUkVkcXJoc1poM1FOQU1RIiBndWlkPSJfQjlHX2swRFJFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICAgICAgPHByb3BlcnR5IHhtaTppZD0iX0I5R19sRURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfbEVEUkVkcXJoc1poM1FOQU1RIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiLz4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfQjlHX2xVRFJFZHFyaHNaaDNRTkFNUSIgeD0iMTM3LjAiIHk9IjMyMy4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfQjlHX2xrRFJFZHFyaHNaaDNRTkFNUSIgZ3VpZD0iX0I5R19sa0RSRWRxcmhzWmgzUU5BTVEiIGVsZW1lbnQ9Il9sNXlVQUVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfQjlHX2wwRFJFZHFyaHNaaDNRTkFNUSIgd2lkdGg9Ijg0LjAiIGhlaWdodD0iMTY2LjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX0I5R19qVURSRWRxcmhzWmgzUU5BTVEiIGd1aWQ9Il9COUdfalVEUkVkcXJoc1poM1FOQU1RIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il9adFpiTVVERkVkcU85TTNmdWtZQV9BIiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgZ3VpZD0iX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlc2VudGF0aW9uTmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyZWFrZG93bkVsZW1lbnRzPSJfbERobDhFREZFZHFPOU0zZnVrWUFfQSBfZFlHbTBFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWljTzZwSUhkWm05Vnh5Yy1KWjlVeXciIGhyZWY9InVtYTovLy1pY082cElIZFptOVZ4eWMtSlo5VXl3Iy1pY082cElIZFptOVZ4eWMtSlo5VXl3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvRWRpdG9yTG9hZC5ydGYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9FZGl0b3JMb2FkLnJ0ZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5YzEwNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9FZGl0b3JMb2FkLnJ0ZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2FwcGxpZWRpcy5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9hcHBsaWVkaXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVmMWIwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2FwcGxpZWRpcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idWxsZXQxLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1bGxldDEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzM4YzI0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2J1bGxldDEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvYnV0dG9ucy5qcGcgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idXR0b25zLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0YjJkMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9idXR0b25zLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL2hlbHBib29rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyZDYyZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9uaV9nZXRTdGFydGVkLmdpZiBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL25pX2dldFN0YXJ0ZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Q4Y2EwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL25pX2dldFN0YXJ0ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcGFwZXJzLmh0bSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3BhcGVycy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWQzZDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcGFwZXJzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIzMSArMCwwIEBACi0gCi0gPGh0bWw+Ci0KLTxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4gPG1ldGEgbmFtZT0iZWxlbWVudF90eXBlIiBjb250ZW50PSJvdGhlciI+ICA8bWV0YSBuYW1lPSJmaWxldHlwZSIgY29udGVudD0iZGVzY3JpcHRpb24iPiAKLTx0aXRsZT5XaGl0ZSBQYXBlcnM8L3RpdGxlPgotPGxpbmsgcmVsPSJTdHlsZVNoZWV0IiBocmVmPSIuLi9yb3AuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+Ci0KLTxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTWljcm9zb2Z0IEZyb250UGFnZSA0LjAiPgotPG1ldGEgbmFtZT0iUHJvZ0lkIiBjb250ZW50PSJGcm9udFBhZ2UuRWRpdG9yLkRvY3VtZW50Ij4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLSAKLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPjx0cj48dGQgdmFsaWduPSJ0b3AiPgotCi08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLQotLy9UZWxsIHRoZSBUcmVlUGF0aCB0byB1cGRhdGUgaXRzZWxmCi12YXIgdGhlUGF0aCA9ICIiOwotdmFyIHR5cGUgPSB0eXBlb2YgcGFyZW50Lm9yeV9idXR0b247Ci1pZiAodHlwZSAhPSAidW5kZWZpbmVkIikgewotCSB0eXBlID0gdHlwZW9mIHBhcmVudC5vcnlfYnV0dG9uLmdldFRyZWVQYXRoKCk7Ci0JIGlmICh0eXBlICE9ICJ1bmRlZmluZWQiKSB7Ci0JIAkgdGhlUGF0aCA9IHBhcmVudC5vcnlfYnV0dG9uLmdldFRyZWVQYXRoKCk7Ci0JIH0KLX0KLWRvY3VtZW50LndyaXRlKHRoZVBhdGgpOwotLS0+Ci08L3NjcmlwdD4KLQotIAotCi0KLQotPGgxIGNsYXNzPSJiYW5uZXIiPjxiPlJhdGlvbmFsIFVuaWZpZWQgUHJvY2VzczombmJzcDtXaGl0ZSBQYXBlcnM8L2I+PC9oMT4KLTxwIGNsYXNzPSJiYW5uZXIiPlRoZSBSVVAgaW5jbHVkZXMgYSBudW1iZXIgb2Ygd2hpdGUgcGFwZXJzLCBsaXN0ZWQgYmVsb3cuPC9wPgotPHVsPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfZGlzY2lwbGluZXMuaHRtIj5EaXNjaXBsaW5lczwvYT48dWw+Ci08bGk+PGEgaHJlZj0iYXBwcm11Yy5odG0iPkFwcGx5aW5nIFJlcXVpcmVtZW50cyBNYW5hZ2VtZW50IHdpdGggVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idHJhY2VhYmlsaXR5Lmh0bSI+VHJhY2VhYmlsaXR5IFN0cmF0ZWdpZXMgZm9yIE1hbmFnaW5nIFJlcXVpcmVtZW50cyB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19yZXF1aXJlbWVudHMuaHRtIj5SZXF1aXJlbWVudHM8L2E+PHVsPgotPGxpPjxhIGhyZWY9ImFwcHJtdWMuaHRtIj5BcHBseWluZyBSZXF1aXJlbWVudHMgTWFuYWdlbWVudCB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InVzZWNhc2UuaHRtIj5UaGUgRXN0aW1hdGlvbiBvZiBFZmZvcnQgQmFzZWQgb24gVXNlIENhc2VzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idHJhY2VhYmlsaXR5Lmh0bSI+VHJhY2VhYmlsaXR5IFN0cmF0ZWdpZXMgZm9yIE1hbmFnaW5nIFJlcXVpcmVtZW50cyB3aXRoIFVzZSBDYXNlczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRlbmVzcy5odG0iPlRoZSBUZW4gRXNzZW50aWFscyBvZiBSVVA8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfYXJjaGl0ZWN0dXJlLmh0bSI+QXJjaGl0ZWN0dXJlPC9hPjx1bD4KLTxsaT48YSBocmVmPSJsYXllcmluZ19zdHJhdGVnaWVzLmh0bSI+TGF5ZXJpbmcgU3RyYXRlZ2llczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iLi4vY29tcG9uZW50cy9wY19kZXNpZ24uaHRtIj5EZXNpZ248L2E+PHVsPgotPGxpPjxhIGhyZWY9InhwcmVmYWN0Lmh0bSI+UlVQL1hQIEd1aWRlbGluZXM6IFRlc3QtZmlyc3QgRGVzaWduIGFuZCBSZWZhY3RvcmluZzwvYT48L2xpPgotPGxpPjxhIGhyZWY9InNpcy5odG0iPkRldmVsb3BpbmcgTGFyZ2UtU2NhbGUgU3lzdGVtcyB3aXRoIHRoZSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3M8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfaW1wbGVtZW50YXRpb24uaHRtIj5JbXBsZW1lbnRhdGlvbjwvYT48dWw+Ci08bGk+PGEgaHJlZj0ieHByZWZhY3QuaHRtIj5SVVAvWFAgR3VpZGVsaW5lczogVGVzdC1maXJzdCBEZXNpZ24gYW5kIFJlZmFjdG9yaW5nPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ieHBwYWlyLmh0bSI+UlVQL1hQIEd1aWRlbGluZXM6IFBhaXIgUHJvZ3JhbW1pbmc8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfYXNzZXNzbWVudC5odG0iPkFzc2Vzc21lbnQ8L2E+PHVsPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvYXNzZXNzbWVudC9wY190ZXN0Lmh0bSI+VGVzdDwvYT48dWw+Ci08bGk+PGEgaHJlZj0icnRfdGVzdC5odG0iPlRlc3RpbmcgRW1iZWRkZWQgU3lzdGVtczwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL3BjX21hbmFnZW1lbnQuaHRtIj5NYW5hZ2VtZW50PC9hPjx1bD4KLTxsaT48YSBocmVmPSIuLi9jb21wb25lbnRzL21hbmFnZW1lbnQvcGNfY2NtLmh0bSI+Q29uZmlndXJhdGlvbiAmIENoYW5nZSBNYW5hZ2VtZW50PC9hPjx1bD4KLTxsaT48YSBocmVmPSJjb250ZW50bWdtdC5odG0iPkNvbnRlbnQgTWFuYWdlbWVudCBVc2luZyB0aGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idGVuZXNzLmh0bSI+VGhlIFRlbiBFc3NlbnRpYWxzIG9mIFJVUDwvYT48L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idGVuZXNzLmh0bSI+VGhlIFRlbiBFc3NlbnRpYWxzIG9mIFJVUDwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRyYW5zd2ZhbGwuaHRtIj5Gcm9tIFdhdGVyZmFsbCB0byBJdGVyYXRpdmUgTGlmZWN5Y2xlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idXNlY2FzZS5odG0iPlRoZSBFc3RpbWF0aW9uIG9mIEVmZm9ydCBCYXNlZCBvbiBVc2UgQ2FzZXM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJydXB4cC5odG0iPkEgQ29tcGFyaXNvbiBvZiBSVVAgYW5kIFhQPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0ic21wcm9qLmh0bSI+VXNpbmcgdGhlIFJVUCBmb3IgU21hbGwgUHJvamVjdHM6IEV4cGFuZGluZyB1cG9uIGVYdHJlbWUgUHJvZ3JhbW1pbmc8L2E+PC9saT4KLTxsaT48YSBocmVmPSJydXBjbW0uaHRtIj5SZWFjaGluZyBDTU0gTGV2ZWxzIDIgYW5kIDM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJwcm9jZXNzX21hdHVyaXR5Lmh0bSI+QW4gRW5hYmxlciBmb3IgSGlnaGVyIFByb2Nlc3MgTWF0dXJpdHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJzaXMuaHRtIj5EZXZlbG9waW5nIExhcmdlLVNjYWxlIFN5c3RlbXMgd2l0aCB0aGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0idmFyaWFudHMuaHRtIj5TeXN0ZW0gVmFyaWFudHM8L2E+PC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9Ii4uL2NvbXBvbmVudHMvcGNfdG9vbHMuaHRtIj5Ub29sczwvYT48dWw+Ci08bGk+PGEgaHJlZj0iLi4vdG9vbG1lbnQveGRlX2VjbGlwc2UvbW9kZWxfc3RydWN0dXJlX2d1aWRlbGluZXMuaHRtIj5Nb2RlbCBTdHJ1Y3R1cmUgR3VpZGVsaW5lcyBmb3IgUmF0aW9uYWwgWERFIERldmVsb3BlciAtIEphdmEgUGxhdGZvcm0gRWRpdGlvbjwvYT48L2xpPgotPGxpPjxhIGhyZWY9Ii4uL3Rvb2xtZW50L3hkZV92c25ldC9tb2RlbF9zdHJ1Y3R1cmVfZ3VpZGVsaW5lcy5odG0iPk1vZGVsIFN0cnVjdHVyZSBHdWlkZWxpbmVzIGZvciBSYXRpb25hbCBYREUgRGV2ZWxvcGVyIC0gLk5FVCBFZGl0aW9uPC9hPjwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci0KLTxwPklmIHlvdSBoYXZlIEludGVybmV0IGFjY2VzcywmbmJzcDsgc29tZSBvZiB0aGUgUlVQIHdoaXRlIHBhcGVycyBjYW4gYmUgZG93bmxvYWRlZCAKLSAgZnJvbSZuYnNwO3RoZSA8YSBocmVmPSJodHRwOi8vd3d3LTMwNi5pYm0uY29tL3NvZnR3YXJlL3JhdGlvbmFsL2luZm8vbGl0ZXJhdHVyZS93aGl0ZXBhcGVycy5qc3AiIHRhcmdldD0iX2JsYW5rIj5JQk0gV2ViIHNpdGUuPC9hPjwvcD4KLTxicj48YnI+Ci0KLSAKLTxkaXYgY2xhc3M9Im1hcmdpbnMyMCI+Ci08cD4KLSA8YSBocmVmPSIuLi9jb3B5cml0ZS9jb3B5cml0ZS5odG0iPgotIDxmb250IHNpemU9Ii0yIj4mY29weTsgQ29weXJpZ2h0IElCTSBDb3JwLiAxOTg3LCAyMDA0LiBBbGwgUmlnaHRzIFJlc2VydmVkLjwvZm9udD4KLSA8L2E+Ci08L3A+Ci08L2Rpdj4KLQotCi08L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjI0Ij48L3RkPjx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjElIj4KLTxwPgotPGEgaHJlZj0iLi4vaW5kZXguaHRtIj48L2E+Ci08L3A+Ci0KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotCi1mdW5jdGlvbiBsb2FkVG9wKCkKLXsKLSAgaWYocGFyZW50LmZyYW1lcy5sZW5ndGghPTAgJiYgcGFyZW50LmZyYW1lc1sxXS5uYW1lPT0ib3J5X3RvYyIpCi0gIHsKLQkgdmFyIG1zZyA9ICJUaGUgUmF0aW9uYWwgVW5pZmllZCBQcm9jZXNzIGlzIGFscmVhZHkgZGlzcGxheWVkIHVzaW5nIGZyYW1lcyI7Ci0gICAgIGFsZXJ0KG1zZyk7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgdmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpOwotICAgIGV4cGlyZXMuc2V0VGltZSAoZXhwaXJlcy5nZXRUaW1lKCkgKyAoMTAwMCAqIDIwKSk7Ci0gICAgZG9jdW1lbnQuY29va2llID0gInJ1cF9vcnlfZG9jPSIgKyBlc2NhcGUgKGRvY3VtZW50LlVSTCkgKwotICAgICI7IGV4cGlyZXM9IiArIGV4cGlyZXMudG9VVENTdHJpbmcoKSArICAiOyBwYXRoPS8iOwotCi0gICAgdmFyIG5ld19vcnlfZG9jX2xvYyA9IG51bGw7Ci0KLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZjsKLSAgICAgICAgIGJyZWFrOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihuZXdfb3J5X2RvY19sb2MhPW51bGwpCi0gICAgewotCWlmKCBzZWxmLm5hbWUgPT0gIm9yeV9kb2MiICkKLQl7Ci0JCXdpbmRvdy5jbG9zZSgpOwotCQl3aW5kb3cub3BlbiggbmV3X29yeV9kb2NfbG9jICk7CQkKLQl9Ci0JZWxzZQotCXsKLQkgICAgICAgCXRvcC5sb2NhdGlvbiA9IG5ld19vcnlfZG9jX2xvYzsKLQl9Ci0gICAgfQotICAgfQotfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgotPCEtLQotICBmdW5jdGlvbiBnZXRJbWFnZVVybChpbWFnZSkKLSAgewotICAgIHZhciBuZXdfb3J5X2RvY19sb2M9bnVsbDsKLSAgICBmb3IoaT1kb2N1bWVudC5saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSkKLSAgICB7Ci0gICAgICAgaWYoZG9jdW1lbnQubGlua3NbaV0uaHJlZi5pbmRleE9mKCJpbmRleC5odG0iKSE9LTEpCi0gICAgICAgewotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gZG9jdW1lbnQubGlua3NbaV0uaHJlZi5zdWJzdHJpbmcoMCxkb2N1bWVudC5saW5rc1tpXS5ocmVmLmxhc3RJbmRleE9mKCIvIikpOwotICAgICAgICAgbmV3X29yeV9kb2NfbG9jID0gbmV3X29yeV9kb2NfbG9jICsgIiIgKyBpbWFnZTsKLSAgICAgICAgIHJldHVybiBuZXdfb3J5X2RvY19sb2M7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotLy8gLS0+Ci08L3NjcmlwdD4KLTxzY3JpcHQKLWxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLU1TRlBob3ZlciA9Ci0oKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTmV0c2NhcGUiKSAmJgotICAocGFyc2VJbnQobmF2aWdhdG9yLmFwcFZlcnNpb24pID49IDMgKSkgfHwKLSAgKChuYXZpZ2F0b3IuYXBwTmFtZSA9PSAiTWljcm9zb2Z0IEludGVybmV0IEV4cGxvcmVyIikgJiYKLSAgKHBhcnNlSW50KG5hdmlnYXRvci5hcHBWZXJzaW9uKSA+PSA0ICkpKTsKLQotICBmdW5jdGlvbiBNU0ZQcHJlbG9hZChpbWcpCi0gIHsKLSAgICAgdmFyIGE9bmV3IEltYWdlKCk7Ci0gICAgIGEuc3JjPWltZzsKLSAgICAgcmV0dXJuIGE7Ci0gIH0KLS8vIC0tPgotPC9zY3JpcHQ+Ci08c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KLTwhLS0KLSAgICBpZihNU0ZQaG92ZXIpCi0gICAgewotICAgICAgICBSdXBHcmF5PU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL3J1cDEuZ2lmJykpOwotICAgICAgICBSdXBCbHVlPU1TRlBwcmVsb2FkKGdldEltYWdlVXJsKCcvaW1hZ2VzL3J1cDFfYS5naWYnKSk7Ci0gICAgfQotLy8gLS0+Ci0KLS8vZGlzcGxheSB0aGUgbG9hZCBidXR0b24gb3Igbm90Ci12YXIgb3J5X3RvY19leGlzdCA9IHR5cGVvZiBwYXJlbnQub3J5X3RvYzsKLWlmIChvcnlfdG9jX2V4aXN0ID09ICJ1bmRlZmluZWQiKSB7Ci0JLy8gc3BsaXQgYWx0IHRleHQgb3V0IHRvIGFsbG93IHRyYW5zbGF0aW9uCi0JdmFyIGFsdFRleHQgPSAiRGlzcGxheSBSYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MgdXNpbmcgZnJhbWVzIjsKLQlkb2N1bWVudC53cml0ZSgiPGEgaHJlZj1cIkphdmFTY3JpcHQ6bG9hZFRvcCgpO1wiIG9ubW91c2VvdmVyPVwiaWYoTVNGUGhvdmVyKSBkb2N1bWVudFsnSG9tZSddLnNyYz1SdXBCbHVlLnNyYzsgc2VsZi5zdGF0dXM9JyAnOyByZXR1cm4gdHJ1ZVwiIG9ubW91c2VvdXQ9XCJpZihNU0ZQaG92ZXIpIGRvY3VtZW50WydIb21lJ10uc3JjPVJ1cEdyYXkuc3JjOyBzZWxmLnN0YXR1cz0gJyAnO3JldHVybiB0cnVlXCI+IDxicj4gPGltZyBzcmM9XCIuLi9pbWFnZXMvcnVwMS5naWYiKTsKLQlkb2N1bWVudC53cml0ZSgiXCIgIGJvcmRlcj1cIjBcIiBhbHQ9XCIiKTsKLSAgICAgICAgZG9jdW1lbnQud3JpdGUoYWx0VGV4dCk7Ci0gICAgICAgIGRvY3VtZW50LndyaXRlKCJcIiBuYW1lPVwiSG9tZVwiIHdpZHRoPVwiMjZcIiBoZWlnaHQ9XCIxNjdcIj48L2E+Iik7Ci0KLX0KLWVsc2UgewotCXZhciBuYnNwID0gIiZuYnNwOyI7Ci0JZG9jdW1lbnQud3JpdGUobmJzcCk7Ci19Ci08L3NjcmlwdD4KLQotPC90ZD48L3RyPjwvdGFibGU+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiB3aWR0aD0iMTAwJSI+PHRyPjx0ZD4KLTxwIGFsaWduPSJyaWdodCI+PHNtYWxsPjxzbWFsbD5SYXRpb25hbCBVbmlmaWVkIFByb2Nlc3MmbmJzcDsmbmJzcDsgCi08aW1nIGJvcmRlcj0iMCIgYWx0PSIyMDAzLjA2LjE1IiBzcmM9Ii4uL2ltYWdlcy9ydXB2ZXJzaW9uLmdpZiI+Ci08L3NtYWxsPjwvc21hbGw+Ci08L3RkPjwvdHI+PC90YWJsZT4KLQotIAotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cC5qcGcgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdmNTM2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwMV9hLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5NjM4ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9ydXAxX2EuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cF9wbGF0Zm9ybS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMGM3ODAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA5MzRiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3N5bmNlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxMmFiMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEsX01LUG5rQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii01UlRLMUdPZkJtMmNjT2puMWluZnN3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUzOjE1LjgyOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Q3VzdG9tIENhdGVnb3J5IEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjMzMDEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItVnBoejY1WjFCOS1ySU1KS2pYN2gwQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxODowMjowNy4xNzItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q3VzdG9tIENhdGVnb3J5IEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkN1c3RvbSBDYXRlZ29yeSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvY3VzdG9tY2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGQ1MWEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9jdXN0b21jYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgZ3VpZD0iLWpxU3JiRlpZOUdiNGpwRGlZU1pjRlEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTg6MDE6MjYuODI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5TdWItQ3VzdG9tIENhdGVnb3J5IEExLjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFlZWJiOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY1Bha19BMS4xL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3IiBuYW1lPSJkZWxQcm9jUGFrX0ExLjEsX3VxNUs4Uk0xRWRxcW5kaS1nRHV4cHciIGd1aWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Ij4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxQcm9jUGFrIEExLjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsUHJvY1BhayBBMS4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxwdXJwb3NlPkRlbFByb2NQYWsgQTEuMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5EZWxQcm9jUGFrIEExLjEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci0gIDxob3d0b1N0YWZmPkRlbFByb2NQYWsgQTEuMSBzdGFmZjwvaG93dG9TdGFmZj4KLSAgPGV4dGVybmFsSWQ+RGVsUHJvY1BhayBBMS4xIGV4dGVybklEPC9leHRlcm5hbElkPgotICA8c2NvcGU+RGVsUHJvY1BhayBBMS4xIHNjb3BlPC9zY29wZT4KLSAgPHVzYWdlTm90ZXM+RGVsUHJvY1BhayBBMS4xIHVzYWdlPC91c2FnZU5vdGVzPgotICA8c2NhbGU+RGVsUHJvY1BhayBBMS4xIHNjYWxlPC9zY2FsZT4KLSAgPHByb2plY3RDaGFyYWN0ZXJpc3RpY3M+RGVsUHJvY1BhayBBMS4xIGNoYXI8L3Byb2plY3RDaGFyYWN0ZXJpc3RpY3M+Ci0gIDxyaXNrTGV2ZWw+RGVsUHJvY1BhayBBMS4xIHJpc2s8L3Jpc2tMZXZlbD4KLSAgPGVzdGltYXRpbmdUZWNobmlxdWU+RGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2VzdGltYXRpbmcgdGVjaCZsdDshLS1TdGFydEZyYWdtZW50LS0mZ3Q7Jmx0OyEtLUVuZEZyYWdtZW50LS0mZ3Q7PC9lc3RpbWF0aW5nVGVjaG5pcXVlPgotICA8cHJvamVjdE1lbWJlckV4cGVydGlzZT5EZWxQcm9jUGFrIEExLjEgZXhwZXJ0aXNlPC9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPgotICA8dHlwZU9mQ29udHJhY3Q+RGVsUHJvY1BhayBBMS4xJmFtcDtuYnNwO2NvbnRyYWN0PC90eXBlT2ZDb250cmFjdD4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjIyOTEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEuMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il91dW4wWUJNMUVkcXFuZGktZ0R1eHB3IiBndWlkPSJfdXVuMFlCTTFFZHFxbmRpLWdEdXhwdyI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdXVuMFlSTTFFZHFxbmRpLWdEdXhwdyIgaWQ9Ii02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHciIG5hbWU9ImRlbFByb2NQYWtfQTEuMSIgZ3VpZD0iX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBndWlkPSJfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvY1BhayBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jUGFrIEExLjEgcHJlc2VudCI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTYzdXNnUVdGalZfZ0htUVlNM1JVeXciIGhyZWY9InVtYTovLy02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Iy02M3VzZ1FXRmpWX2dIbVFZTTNSVXl3Ii8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5MDdjNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVThfTEd2TVNvZi1kYjI0YUZBTWI2dyIgbmFtZT0iRGVsUHJvYyBBMSxfVzZhNGNSQk5FZHFCczdLaGRWTFJMQSIgZ3VpZD0iLVU4X0xHdk1Tb2YtZGIyNGFGQU1iNnciPgotICA8bWFpbkRlc2NyaXB0aW9uPkRlbFByb2MgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsUHJvYyBBMSBrZXkgY29uPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+RGVsUHJvYyBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGFsdGVybmF0aXZlcz5EZWxQcm9jIEExIGFsdGVybjwvYWx0ZXJuYXRpdmVzPgotICA8aG93dG9TdGFmZj5EZWxQcm9jIEExIHN0YWZmPC9ob3d0b1N0YWZmPgotICA8ZXh0ZXJuYWxJZD5EZWxQcm9jIEExIGV4dGVybklEPC9leHRlcm5hbElkPgotICA8c2NvcGU+RGVsUHJvYyBBMSBzY29wZTwvc2NvcGU+Ci0gIDx1c2FnZU5vdGVzPkRlbFByb2MgQTEgdXNhZ2U8L3VzYWdlTm90ZXM+Ci0gIDxzY2FsZT5EZWxQcm9jIEExIHNjYWxlPC9zY2FsZT4KLSAgPHByb2plY3RDaGFyYWN0ZXJpc3RpY3M+RGVsUHJvYyBBMSBwcm9qIGNoYXI8L3Byb2plY3RDaGFyYWN0ZXJpc3RpY3M+Ci0gIDxyaXNrTGV2ZWw+RGVsUHJvYyBBMSByaXNrPC9yaXNrTGV2ZWw+Ci0gIDxlc3RpbWF0aW5nVGVjaG5pcXVlPkRlbFByb2MgQTEgZXN0IHRlY2g8L2VzdGltYXRpbmdUZWNobmlxdWU+Ci0gIDxwcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPkRlbFByb2MgQTEgZXhwZXJ0aXNlPC9wcm9qZWN0TWVtYmVyRXhwZXJ0aXNlPgotICA8dHlwZU9mQ29udHJhY3Q+RGVsUHJvYyBBMSBjb250eXBlPC90eXBlT2ZDb250cmFjdD4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3NEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0ExL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4ZjFlYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19BMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9YVlk5TUJCTkVkcUJzN0toZFZMUkxBIiBndWlkPSJfWFZZOU1CQk5FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWFZpdU1CQk5FZHFCczdLaGRWTFJMQSIgaWQ9Ii1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3IiB1cmk9ImNvbnRlbnQueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IHhtaTppZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9ImRlbFByb2NfQTEiIGd1aWQ9Il9XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIj4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3MiIHhtaTppZD0iX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIG5hbWU9ImRlbFByb2NfQTEiIGd1aWQ9Il9XNmE0Y1JCTkVkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxQcm9jIEExIHByZXNlbnQiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1VOF9MR3ZNU29mLWRiMjRhRkFNYjZ3IiBocmVmPSJ1bWE6Ly8tVThfTEd2TVNvZi1kYjI0YUZBTWI2dyMtVThfTEd2TVNvZi1kYjI0YUZBTWI2dyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lZ3JvdXBpbmdzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTBiNzkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEsX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQyOjM3Ljc4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEdyb3VwaW5nIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgR3JvdXBpbmcgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2ZjZWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1HYUdsNWtISjR4S0NfU2hnNloxNlpnIiBuYW1lPSJkaXNjaXBsaW5lX0ExLF9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0yMlQxMDo0NTowMi45NjktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGlzY2lwbGluZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWI0NThhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIgbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVEwbGlhNXlFeU5YV2QtS05KNmNHckEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTc6NDQ6MTQuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRpc2NpcGxpbmUgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWY1Zjg1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL2RvbWFpbl9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciIG5hbWU9ImRvbWFpbl9BMSxfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTk6MTU6MzUuMDMxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERvbWFpbiBBMSBtYWluCi0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvZG9tYWluX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1NTZiNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZG9tYWlucy9kb21haW5fQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3IiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQ3OjI4Ljc2Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Eb21haW4gQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RG9tYWluIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9kb21haW5zL3N1Yl9kb21haW5fQTEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYmNhMGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2RvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIgbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNzo0Njo1My45MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3ViLURvbWFpbiBBMS4xIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlN1Yi1Eb21haW4gQTEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZmI2YzkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIG5hbWU9ImNoZWNrbGlzdF9BMSxfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLW9XbzNVQ2lmWDRJY19WQklDV3dxUnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzQuMTI1LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNoZWNrbGlzdCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YzM0ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItSjlVcjlzbXBRdXZWR3B1RzlpX3drUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozNi4yMTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q2hlY2tsaXN0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxMjg3OC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgbmFtZT0iY29uY2VwdF9BMSxfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzAuOTM4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIENvbmNlcHQgQTEgY29udGVudAotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0gICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OwotICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHdpdGggdHlwZTomYW1wO25ic3A7Jmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVHlwZSZxdW90OwotICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7Ci0gICAgZ3VpZD0mcXVvdDtfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSZxdW90OyZndDtDb25jZXB0OiBDb25jZXB0IEEyIHByZXNlbnQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLSAgICBFbGVtZW50IHdpdGggdXNlciB0ZXh0OiZhbXA7bmJzcDsgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmtXaXRoVXNlclRleHQmcXVvdDsKLSAgICBocmVmPSZxdW90Oy4vLi4vLi4vLi4vUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTIsX09WTFZjQS1URWRxTDJPMVBKVjljWkEuaHRtbCZxdW90OwotICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDk4ZjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MjQuNTc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkNvbmNlcHQgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjY1MjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvY29uY2VwdF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tLmlibS51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6Y29tLmlibS51bWE9Imh0dHA6Ly93d3cuaWJtLmNvbS91bWEvMS4wLjIvdW1hLmVjb3JlIiB4bWk6aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBuYW1lPSJjb25jZXB0X0ExLF9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDozMC45MzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q29uY2VwdCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L2NvbS5pYm0udW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvY29uY2VwdHMvcmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MmU3YjAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2NDQxZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItQTk0OXdIZFRGcUczV3M2My1xOUIydyIgbmFtZT0iZXhhbXBsZV9BMSxfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MzguOTY5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkV4YW1wbGUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0MTI0NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2V4YW1wbGVzL2V4YW1wbGVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgbmFtZT0iZXhhbXBsZV9BMixfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NDEuMDE2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkV4YW1wbGUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmNlMDVmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjQzLjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5HdWlkZWxpbmUgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NGE4Y2MuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NDUuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkd1aWRlbGluZSBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEuMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS4xLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxN2I1MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii05eFA0ZDdiYTZvc3dHa1BlcFhXa193IiBuYW1lPSJwcmFjdGljZV9BMS4xLF8tRlNVZ0EtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItOXhQNGQ3YmE2b3N3R2tQZXBYV2tfdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToyMC43MDMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQTEuMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBBMS4xIGFkZDwvYWRkaXRpb25hbEluZm8+Ci0gIDxwcm9ibGVtPlByYWN0aWNlIEExLjEgcHJvYmxlbTwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQTEuMSBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQTEuMSBnb2FsPC9nb2Fscz4KLSAgPGFwcGxpY2F0aW9uPlByYWN0aWNlIEExLjEgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQTEuMSBsZXZlbDwvbGV2ZWxzT2ZBZG9wdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTYzMzJiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTguMjk3LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlByYWN0aWNlIEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEExIGFkZDwvYWRkaXRpb25hbEluZm8+Ci0gIDxwcm9ibGVtPlByYWN0aWNlIEExIHByb2JsZW08L3Byb2JsZW0+Ci0gIDxiYWNrZ3JvdW5kPlByYWN0aWNlIEExIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBBMSBnb2FsPC9nb2Fscz4KLSAgPGFwcGxpY2F0aW9uPlByYWN0aWNlIEExIGFwcDwvYXBwbGljYXRpb24+Ci0gIDxsZXZlbHNPZkFkb3B0aW9uPlByYWN0aWNlIEExIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJkYmMzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVI5c1F6b0pqUW00LU5CeFVxYUxXTGciIG5hbWU9InByYWN0aWNlX0EyLjEsX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1SOXNRem9KalFtNC1OQnhVcWFMV0xnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjI1LjA5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBBMi4xIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEEyLjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTIuMSBwcm9ibGVtPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBBMi4xIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBBMi4xIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTIuMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBBMi4xIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOGQyZTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU5jU01UZmhNbHR0UFVLMkY2d1hnRWciIG5hbWU9InByYWN0aWNlX0EyLF9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMToyMy4wOTQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQTIgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQTIgcHJvYmxlbTwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQTIgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEEyIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQTIgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQTIgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmYwMTAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIG5hbWU9InJlcG9ydF9BMSxfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NTEuNDIyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJlcG9ydCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmM2ZmNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgbmFtZT0icmVwb3J0X0EyLF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1My45ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDBmYzRhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0xaEhFT0w4cXl4VE1NUjc3NVVHZnJ3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjI3LjIxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXVzYWJsZSBBc3NldCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjdjOTMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MjkuNDIyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjY2NzguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteG9EWmFxcjdKLXdmMmxCN3JTalNadyIgbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXhvRFphcXI3Si13ZjJsQjdyU2pTWnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MDQuMDQ3LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODNkOWU5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUowc3p3cktiaUwySm0tRmlmUXRJOXciIG5hbWU9InJvYWRtYXBfQTIsX1l1a2dRQS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1KMHN6d3JLYmlMMkptLUZpZlF0STl3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjA2Ljg1OS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2FkbWFwIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDViZjYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii00NkFKbEF2dDVCRFlmTDlfZy0yUjd3IiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExLF9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMTowMS4yODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBBMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjJiNjBjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMixfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTd3NTNqRk96d3BOQmdlQ0RfQV92WWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MDMuNTE2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFjNmY2OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1jOXNiOURpNE1ZbVItUm9vRmtQM2p3IiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6NTYuNDg0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlbXBsYXRlIEExIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTFmY2EzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWhMU09Xckc1YmlTWC1QQWtfM0JiOUEiIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBndWlkPSItaExTT1dyRzViaVNYLVBBa18zQmI5QSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDo1OC45NTMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGVtcGxhdGUgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwYjgzYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjEyLjE0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZXJtIERlZmluaXRpb24gQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2Y5ZDA0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6NDIuNjU2LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYWRjZDIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIgbmFtZT0idG9vbG1lbnRvcl9BMSxfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXA0eGtRbVB6RXFhblhuMWtTYldZQWciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MDUuODI4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTUwYzg4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXN4VnEtNWFhSWUzenQ1YUV1bjhGQ2ciIG5hbWU9InRvb2xtZW50b3JfQTIsX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMxOjA4LjU5NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sbWVudG9yIEEyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNDZhZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItN1BaSExGU0tWTHNZT0FObjBnR3FJdyIgbmFtZT0id2hpdGVwYXBlcl9BMSxfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTMuMzU5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQTEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkYmFlMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItdEdERmloNVQxbHRWbk1aZWY4QTc2dyIgbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzE6MTUuNTc4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQTIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGIxZmNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iXzZsSzJBQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Il82bEsyQUEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfWFZZOU1CQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEjX1hWWTlNQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfY25XbUVCQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2NuV21FQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfdXVuMFlCTTFFZHFxbmRpLWdEdXhwdyIgaHJlZj0idW1hOi8vX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHcjX3V1bjBZQk0xRWRxcW5kaS1nRHV4cHciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNHljM3NUemdFZHE1eXNGT05yMUJHUSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzR5YzNzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfZEYyTzRFQXZFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RGMk80RUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfWnpEWFFVREZFZHFPOU0zZnVrWUFfQSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX1p6RFhRVURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82bEsyQVEtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIHVyaT0icm9sZXMvcm9sZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83Tl93a0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciIHVyaT0icm9sZXMvcm9sZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83T0k2Z0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLVMxaWdMU2k2QUlfdmx1eldPQ3U2VHciIHVyaT0idGFza3MvdGFza19BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il83N1M3Y0EtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iLTEzcThKSkFhMGl4NnJETVpBcXd5MXciIHVyaT0idGFza3MvdGFza19BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FOEFSZ0EtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0Y3TFBnQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItSlRXS241ZDRDTGM0S0ZRTURURnBTUSIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSEVWM0FBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiB1cmk9Indvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JSW1KVUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEiIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0EyLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSkNITFFBLVJFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1BYlhSZzQ0TDhUeHg0Q2tCMmh4NU5RIiB1cmk9Indvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9LQnZjUUEtUkVkcUwyTzFQSlY5Y1pBIiBpZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIHVyaT0id29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0t3MHYwQS1SRWRxTDJPMVBKVjljWkEiIGlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgdXJpPSJ3b3JrcHJvZHVjdHMvb3V0Y29tZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9GYlUxVUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIHVyaT0id29ya3Byb2R1Y3RzL291dGNvbWVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfTkRlNWdBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3IiB1cmk9Imd1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9PQ055b0EtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTZ5N2FCUXQzY0NTQkxvOHNtTVJlbUEiIHVyaT0iZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT2tWb1FBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3IiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1A4MjZZQS1TRWRxTDJPMVBKVjljWkEiIGlkPSItXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfUTVnSTBBLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVFdSR01BLVNFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1YUmVCTGRONGlMYnZhZmZCd2ViTkN3IiB1cmk9Imd1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9abFVDWUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTFoSEVPTDhxeXhUTU1SNzc1VUdmcnciIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2FHR2JRQS1TRWRxTDJPMVBKVjljWkEiIGlkPSIteG9EWmFxcjdKLXdmMmxCN3JTalNadyIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9iRms3UUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3ciIHVyaT0iZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oSGhQa0EtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciIHVyaT0iZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oOHR5TUEtU0VkcUwyTzFQSlY5Y1pBIiBpZD0iLXA0eGtRbVB6RXFhblhuMWtTYldZQWciIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQTEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfT1dOM1FBLVRFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03UFpITEZTS1ZMc1lPQU5uMGdHcUl3IiB1cmk9Imd1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2tzSXdZQS1URWRxTDJPMVBKVjljWkEiIGlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il91Ykp6WUEtVEVkcUwyTzFQSlY5Y1pBIiBpZD0iLUo5VXI5c21wUXV2VkdwdUc5aV93a1EiIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzZZN004QS1URWRxTDJPMVBKVjljWkEiIGlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgdXJpPSJndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HcnROTUEtVUVkcUwyTzFQSlY5Y1pBIiBpZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIHVyaT0iZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1F3eFlzQS1VRWRxTDJPMVBKVjljWkEiIGlkPSItNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIgdXJpPSJndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbVFKcllBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdG1TTGNBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03dzUzakZPendwTkJnZUNEX0FfdllnIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfM1lTUkFBLVVFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiB1cmk9Imd1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0VxX2RNQS1WRWRxTDJPMVBKVjljWkEiIGlkPSItOXhQNGQ3YmE2b3N3R2tQZXBYV2tfdyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0ExLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRXJTWUlBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii10R0RGaWg1VDFsdFZuTVplZjhBNzZ3IiB1cmk9Imd1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1NOQ3M4QS1WRWRxTDJPMVBKVjljWkEiIGlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1NOTWQ4QS1WRWRxTDJPMVBKVjljWkEiIGlkPSItUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIgdXJpPSJndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0EyLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfWXZLOU1BLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIiB1cmk9Imd1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9BMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9vSC02UUEtVkVkcUwyTzFQSlY5Y1pBIiBpZD0iLUowc3p3cktiaUwySm0tRmlmUXRJOXciIHVyaT0iZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfcnlycVlBLVZFZHFMMk8xUEpWOWNaQSIgaWQ9Ii04QlBSSWdfU2JIVHdRQWlBWnk4M1B3IiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzJhVS1nQS1WRWRxTDJPMVBKVjljWkEiIGlkPSItTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSIgdXJpPSJndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9DNWRfd1EtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIHVyaT0iZGlzY2lwbGluZWdyb3VwaW5ncy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0QxWU9ZQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0VaSkN3QS1XRWRxTDJPMVBKVjljWkEiIGlkPSItUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIgdXJpPSJkaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0ZxcEc0QS1XRWRxTDJPMVBKVjljWkEiIGlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgdXJpPSJkb21haW5zL2RvbWFpbl9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9HT3RkUUEtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIHVyaT0iZG9tYWlucy9kb21haW5fQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRzVCbGtBLVdFZHFMMk8xUEpWOWNaQSIgaWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiB1cmk9ImRvbWFpbnMvc3ViX2RvbWFpbl9BMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0lHTnhjQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0pZNnZjQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0tHendNQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIgdXJpPSJyb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0xoMng0QS1XRWRxTDJPMVBKVjljWkEiIGlkPSIteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIgdXJpPSJ0b29scy90b29sX0ExLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX01LWXhnQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItenpCUC01NEd1UVdmVlR6NjBTZFFzdyIgdXJpPSJ0b29scy90b29sX0EyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX09TbDBJQS1XRWRxTDJPMVBKVjljWkEiIGlkPSItNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9UUXVpRUEtV0VkcUwyTzFQSlY5Y1pBIiBpZD0iLVZwaHo2NVoxQjktcklNSktqWDdoMEEiIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfOVA4d1FCQktFZHFCczdLaGRWTFJMQSIgaWQ9Ii1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXy11NE1ZQkJLRWRxQnM3S2hkVkxSTEEiIGlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9BMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fWGFNQUJCS0VkcUJzN0toZFZMUkxBIiBpZD0iLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXciIHVyaT0icm9sZXNldHMvcm9sZV9zZXRfQTIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfVzYza1lCQk5FZHFCczdLaGRWTFJMQSIgaWQ9Il9XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIiB1cmk9ImRlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQTEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYUlmLUFCQk5FZHFCczdLaGRWTFJMQSIgaWQ9Il9hSFVTUUJCTkVkcUJzN0toZFZMUkxBIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMGV4dGVuZGluZyUyMCdDUDElMjB3aXRoJTIwYWxsJTIwZWxlbWVudHMnL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3VzaUpzQk0xRWRxcW5kaS1nRHV4cHciIGlkPSJfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIgdXJpPSJkZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jUGFrX0ExLjEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNHRGUGdEemdFZHE1eXNGT05yMUJHUSIgaWQ9Il80c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUDElMjB3aXRoJTIwYWxsJTIwZWxlbWVudHMvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZER3a01FQXZFZHFGcUl1OC1ja29sZyIgaWQ9Il9kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMEExL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1p1YjlBRURGRWRxTzlNM2Z1a1lBX0EiIGlkPSJfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIgdXJpPSJjYXBhYmlsaXR5cGF0dGVybnMvQ1AyJTIwY29udGFpbmluZyUyMHZhcmlhYmlsaXR5JTIwZWxlbWVudHMvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd1dGZlVFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIiB1cmk9InRhc2tzL3Rhc2tfQTMueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfX0NNdWNFREZFZHFPOU0zZnVrWUFfQSIgaWQ9Ii1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3IiB1cmk9InJvbGVzL3JvbGVfQTMueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4geG1pOmlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iUGx1ZyBBIiBndWlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxJUS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il95VWVMSVEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSWctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfeVVlTElnLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSXctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJEb21haW5zIiBndWlkPSJfeVVlTEl3LVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRvbWFpbl9BMSIgZ3VpZD0iX0ZFek80QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTzEzVXVKYjhHcUJMVnRXYVVxZ3FSdyIgaHJlZj0idW1hOi8vLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUncjLU8xM1V1SmI4R3FCTFZ0V2FVcWdxUnciLz4KLSAgICAgICAgICAgIDxzdWJkb21haW5zIHhtaTppZD0iX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1Yl9kb21haW5fQTEuMSIgZ3VpZD0iX0dPWjdRQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yi1Eb21haW4gQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViLURvbWFpbiBBMS4xIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiB3b3JrUHJvZHVjdHM9Il9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1LRDcyRW81bE1NUHA3YlM4b1BCdlB3IiBocmVmPSJ1bWE6Ly8tS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyMtS0Q3MkVvNWxNTVBwN2JTOG9QQnZQdyIvPgotICAgICAgICAgICAgPC9zdWJkb21haW5zPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RG9tYWluIiB4bWk6aWQ9Il9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkb21haW5fQTIiIGd1aWQ9Il9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgd29ya1Byb2R1Y3RzPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTNoWUp5cjNUcWlNZzZRZHk5QVhJeHciIGhyZWY9InVtYTovLy0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3Iy0zaFlKeXIzVHFpTWc2UWR5OUFYSXh3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxKQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkRpc2NpcGxpbmVzIiBndWlkPSJfeVVlTEpBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEaXNjaXBsaW5lR3JvdXBpbmciIHhtaTppZD0iX0NDVmpjQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiIGd1aWQ9Il9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIGRpc2NpcGxpbmVzPSJfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW11QWtYREpmb19LYlJGNEtPYm45T1EiIGhyZWY9InVtYTovLy1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIy1tdUFrWERKZm9fS2JSRjRLT2JuOU9RIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEaXNjaXBsaW5lIiB4bWk6aWQ9Il9DNWRfd0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkaXNjaXBsaW5lX0ExIiBndWlkPSJfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgdGFza3M9Il83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItR2FHbDVrSEo0eEtDX1NoZzZaMTZaZyIgaHJlZj0idW1hOi8vLUdhR2w1a0hKNHhLQ19TaGc2WjE2WmcjLUdhR2w1a0hKNHhLQ19TaGc2WjE2WmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmUiIHhtaTppZD0iX0R6dlBvQS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRpc2NpcGxpbmVfQTIiIGd1aWQ9Il9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB0YXNrcz0iXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1RMGxpYTV5RXlOWFdkLUtOSjZjR3JBIiBocmVmPSJ1bWE6Ly8tUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSMtUTBsaWE1eUV5TlhXZC1LTko2Y0dyQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMSlEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX3lVZUxKUS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZVNldEdyb3VwaW5nIiB4bWk6aWQ9Il9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX3NldF9ncm91cGluZ19BMSIgZ3VpZD0iX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEdyb3VwaW5nIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBHcm91cGluZyBBMSBwcmVzZW50IiByb2xlU2V0cz0iXzlQcDFVQkJLRWRxQnM3S2hkVkxSTEEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiBocmVmPSJ1bWE6Ly8tRlY5OUswVk03ZjRjbEFVa1lib0ZPUSMtRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZVNldCIgeG1pOmlkPSJfOVBwMVVCQktFZHFCczdLaGRWTFJMQSIgbmFtZT0icm9sZV9zZXRfQTEiIGd1aWQ9Il85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJvbGVzPSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVdHYTlOUUotYk01VVowSnVZX0FFUHciIGhyZWY9InVtYTovLy1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3Iy1XR2E5TlFKLWJNNVVaMEp1WV9BRVB3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0IiB4bWk6aWQ9Il8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBuYW1lPSJyb2xlX3NldF9BMiIgZ3VpZD0iXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcm9sZXM9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTFJHbGVISXBOczVNYjlRQU9HZlpRdyIgaHJlZj0idW1hOi8vLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXcjLUxSR2xlSElwTnM1TWI5UUFPR2ZaUXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTEpnLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il95VWVMSmctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0VHlwZSIgeG1pOmlkPSJfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEiIGd1aWQ9Il9IZ2hEWUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHdvcmtQcm9kdWN0cz0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEgX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEgX0lJU25VQS1SRWRxTDJPMVBKVjljWkEgX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiBocmVmPSJ1bWE6Ly8tVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyMtVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3RUeXBlIiB4bWk6aWQ9Il9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMiIgZ3VpZD0iX0lGblVnQS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgd29ya1Byb2R1Y3RzPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEiIGhyZWY9InVtYTovLy1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIy1jbGZEQTBQTTZ4TElqeWhTcDFpTFFRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxKdy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlRvb2xzIiBndWlkPSJfeVVlTEp3LVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUb29sIiB4bWk6aWQ9Il9LeGJhZ0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0b29sX0ExIiBndWlkPSJfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteTA0d1BFMTAtU0I4aUZudTVjWGFNQSIgaHJlZj0idW1hOi8vLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEjLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2wiIHhtaTppZD0iX0xoYUY4QS1XRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xfQTIiIGd1aWQ9Il9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiBocmVmPSJ1bWE6Ly8tenpCUC01NEd1UVdmVlR6NjBTZFFzdyMtenpCUC01NEd1UVdmVlR6NjBTZFFzdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMS0EtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il95VWVMS0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il95VWVMS1EtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfeVVlTEtRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il95VWVMS3ctUEVkcUwyTzFQSlY5Y1pBIiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfTUtQbmtBLVdFZHFMMk8xUEpWOWNaQSBfT1NTU0lBLVdFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTEiIGd1aWQ9Il9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNVJUSzFHT2ZCbTJjY09qbjFpbmZzdyIgaHJlZj0idW1hOi8vLTVSVEsxR09mQm0yY2NPam4xaW5mc3cjLTVSVEsxR09mQm0yY2NPam4xaW5mc3ciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiBocmVmPSIjXzdkWFlVQkJLRWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIGhyZWY9IiNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgaHJlZj0iI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0iI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0iI19JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSIjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNUemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2FIVVNRUkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgaHJlZj0idW1hOi8vX3VxNUs4Qk0xRWRxcW5kaS1nRHV4cHcjX3VxNUs4Uk0xRWRxcW5kaS1nRHV4cHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQTIiIGd1aWQ9Il9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiBjYXRlZ29yaXplZEVsZW1lbnRzPSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSBfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSBfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSBfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVZwaHo2NVoxQjktcklNSktqWDdoMEEiIGhyZWY9InVtYTovLy1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIy1WcGh6NjVaMUI5LXJJTUpLalg3aDBBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgbmFtZT0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIiBndWlkPSJfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iXzU1emswQS1QRWRxTDJPMVBKVjljWkEgX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1qcVNyYkZaWTlHYjRqcERpWVNaY0ZRIiBocmVmPSJ1bWE6Ly8tanFTcmJGWlk5R2I0anBEaVlTWmNGUSMtanFTcmJGWlk5R2I0anBEaVlTWmNGUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfeVVlTExBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il95VWVMTEEtUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX3ppX3p3QS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9ImNvbnRlbnRfcGFja2FnZV9BMSIgZ3VpZD0iX3ppX3p3QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNvblBhayBBMSBicmllZiI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX0ExIiBndWlkPSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMSIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHJlc3BvbnNpYmxlRm9yPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSBfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIGhyZWY9InVtYTovLy1nN205OEpsOGFSYlY2bmZPR1VwR25nIy1nN205OEpsOGFSYlY2bmZPR1VwR25nIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiBleHRlbmRlZCBieSBSb2xlIEEzIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVzcG9uc2libGVGb3I9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSHhrY1ZpSHU1N2JER3VsNDIxckJ2ZyIgaHJlZj0idW1hOi8vLUh4a2NWaUh1NTdiREd1bDQyMXJCdmcjLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIHhtaTppZD0iXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9InRhc2tfQTEiIGd1aWQ9Il83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExICIgc3VwcG9ydGluZ01hdGVyaWFscz0iX2FGcHZVQS1TRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il9Pa0N0VUEtU0VkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIHBlcmZvcm1lZEJ5PSJfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIgbWFuZGF0b3J5SW5wdXQ9Il9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIF85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBvdXRwdXQ9Il9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIG9wdGlvbmFsSW5wdXQ9Il9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3IiBocmVmPSJ1bWE6Ly8tUzFpZ0xTaTZBSV92bHV6V09DdTZUdyMtUzFpZ0xTaTZBSV92bHV6V09DdTZUdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGFza19BMiIgZ3VpZD0iXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgKCBleHRlbmRlZCBieSBUYXNrIEEzICkiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX09WTFZjQS1URWRxTDJPMVBKVjljWkEgXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBwZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIG1hbmRhdG9yeUlucHV0PSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgb3V0cHV0PSJfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBvcHRpb25hbElucHV0PSJfSkJxZlVBLVJFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMTNxOEpKQWEwaXg2ckRNWkFxd3kxdyIgaHJlZj0idW1hOi8vLTEzcThKSkFhMGl4NnJETVpBcXd5MXcjLTEzcThKSkFhMGl4NnJETVpBcXd5MXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiB4bWk6aWQ9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJhcnRpZmFjdF9BMSIgZ3VpZD0iXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW45VEpRYTBGSnZHX2F2RFhhQVRqSVEiIGhyZWY9InVtYTovLy1uOVRKUWEwRkp2R19hdkRYYUFUaklRIy1uOVRKUWEwRkp2R19hdkRYYUFUaklRIi8+Ci0gICAgICAgICAgICA8Y29udGFpbmVkQXJ0aWZhY3RzIHhtaTppZD0iX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBndWlkPSJfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiBocmVmPSJ1bWE6Ly8tOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSMtOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSIvPgotICAgICAgICAgICAgPC9jb250YWluZWRBcnRpZmFjdHM+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgeG1pOmlkPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIgbmFtZT0iYXJ0aWZhY3RfQTIiIGd1aWQ9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX21Qc19jQS1VRWRxTDJPMVBKVjljWkEiIGNvbmNlcHRzQW5kUGFwZXJzPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSBfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgY2hlY2tsaXN0cz0iX2tyaVRjQS1URWRxTDJPMVBKVjljWkEiIGd1aWRlbGluZXM9Il82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIiBleGFtcGxlcz0iX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGFzc2V0cz0iX1NNYzNFQS1WRWRxTDJPMVBKVjljWkEiIHJlcG9ydHM9Il9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIiB0ZW1wbGF0ZXM9Il9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiB0b29sTWVudG9ycz0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiBocmVmPSJ1bWE6Ly8tSlRXS241ZDRDTGM0S0ZRTURURnBTUSMtSlRXS241ZDRDTGM0S0ZRTURURnBTUSIvPgotICAgICAgICAgICAgPGNvbnRhaW5lZEFydGlmYWN0cyB4bWk6aWQ9Il9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJhcnRpZmFjdF9BMi4xIiBndWlkPSJfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIuMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIgaHJlZj0idW1hOi8vLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEjLVVGUm9lQUtIZFhYMlNTQjFLVVh0WUEiLz4KLSAgICAgICAgICAgIDwvY29udGFpbmVkQXJ0aWZhY3RzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIHhtaTppZD0iX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBndWlkPSJfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBjb25jZXB0c0FuZFBhcGVycz0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEgX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGNoZWNrbGlzdHM9Il9LVjRxMEEtU0VkcUwyTzFQSlY5Y1pBIiBndWlkZWxpbmVzPSJfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSIgZXhhbXBsZXM9Il9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBhc3NldHM9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiByZXBvcnRzPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgdGVtcGxhdGVzPSJfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgdG9vbE1lbnRvcnM9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIiBkZWxpdmVyZWRXb3JrUHJvZHVjdHM9Il85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIF9GNTF5d0EtUkVkcUwyTzFQSlY5Y1pBIF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIgaHJlZj0idW1hOi8vLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEjLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiB4bWk6aWQ9Il9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgZ3VpZD0iX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSIgZGVsaXZlcmVkV29ya1Byb2R1Y3RzPSJfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSBfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIGhyZWY9InVtYTovLy1NZHFvYS1ueHdFSGZBSmNvQTZYTktRIy1NZHFvYS1ueHdFSGZBSmNvQTZYTktRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJvdXRjb21lX0ExIiBndWlkPSJfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9OREwta0EtU0VkcUwyTzFQSlY5Y1pBIF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTNvZHlCeUllelJSWGdRZ2VIdU02U0EiIGhyZWY9InVtYTovLy0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIy0zb2R5QnlJZXpSUlhnUWdlSHVNNlNBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgY29uY2VwdHNBbmRQYXBlcnM9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIiBjaGVja2xpc3RzPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgZ3VpZGVsaW5lcz0iXzZZVXdBQS1URWRxTDJPMVBKVjljWkEiIGV4YW1wbGVzPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYXNzZXRzPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgcmVwb3J0cz0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIHRlbXBsYXRlcz0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIHRvb2xNZW50b3JzPSJfdjdKS0FBLVVFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIGhyZWY9InVtYTovLy00R2JBV0diODdBbHotR3pfR185cDFnIy00R2JBV0diODdBbHotR3pfR185cDFnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDaGVja2xpc3QiIHhtaTppZD0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9ImNoZWNrbGlzdF9BMSIgZ3VpZD0iX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1vV28zVUNpZlg0SWNfVkJJQ1d3cVJ3IiBocmVmPSJ1bWE6Ly8tb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyMtb1dvM1VDaWZYNEljX1ZCSUNXd3FSdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29uY2VwdCIgeG1pOmlkPSJfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY29uY2VwdF9BMSIgZ3VpZD0iX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkNvbmNlcHQgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkNvbmNlcHQgQTEgcHJlc2VudCIgc2hhcGVpY29uPSJmaWxlOi9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy90cmFuLWx1dS9JQk0vTWV0aG9kTGlicmFyaWVzL3BhcmlzL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9yZXNvdXJjZXMvdHlyYW5ub3NhdXJ1cy5naWYiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02eTdhQlF0M2NDU0JMbzhzbU1SZW1BIiBocmVmPSJ1bWE6Ly8tNnk3YUJRdDNjQ1NCTG84c21NUmVtQSMtNnk3YUJRdDNjQ1NCTG84c21NUmVtQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RXhhbXBsZSIgeG1pOmlkPSJfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZXhhbXBsZV9BMSIgZ3VpZD0iX09CeHR3QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUE5NDl3SGRURnFHM1dzNjMtcTlCMnciIGhyZWY9InVtYTovLy1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3Iy1BOTQ5d0hkVEZxRzNXczYzLXE5QjJ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkZWxpbmUiIHhtaTppZD0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9Imd1aWRlbGluZV9BMSIgZ3VpZD0iX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1fMjFfRWlzUVNUSHd0bEpqb0o4YnZ3IiBocmVmPSJ1bWE6Ly8tXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyMtXzIxX0Vpc1FTVEh3dGxKam9KOGJ2dyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2UiIHhtaTppZD0iX1A4allZQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InByYWN0aWNlX0ExIiBndWlkPSJfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEExIHByZXNlbnQiIGNvbnRlbnRSZWZlcmVuY2VzPSJfOUt0NzhBLVBFZHFMMk8xUEpWOWNaQSBfTUtQbmtBLVdFZHFMMk8xUEpWOWNaQSBfQzVkX3dBLVdFZHFMMk8xUEpWOWNaQSBfRkV6TzRBLVdFZHFMMk8xUEpWOWNaQSBfOVBwMVVCQktFZHFCczdLaGRWTFJMQSBfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSBfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSBfS1Y0cTBBLVNFZHFMMk8xUEpWOWNaQSBfTkRMLWtBLVNFZHFMMk8xUEpWOWNaQSBfT0J4dHdBLVNFZHFMMk8xUEpWOWNaQSBfT2tDdFVBLVNFZHFMMk8xUEpWOWNaQSBfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSBfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSBfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSBfVFYwYVFBLVNFZHFMMk8xUEpWOWNaQSBfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSBfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSBfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSBfN004bnNBLVBFZHFMMk8xUEpWOWNaQSBfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSBfaEhFam9BLVNFZHFMMk8xUEpWOWNaQSBfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSBfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSBfSUlTblVBLVJFZHFMMk8xUEpWOWNaQSBfN2RYWVVCQktFZHFCczdLaGRWTFJMQSBfQ0NWamNBLVdFZHFMMk8xUEpWOWNaQSBfR09aN1FBLVdFZHFMMk8xUEpWOWNaQSBfSlluMGdBLVdFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVo3a2RJa0NwLW1IVWRiX0pvUXB6V1EiIGhyZWY9InVtYTovLy1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIy1aN2tkSWtDcC1tSFVkYl9Kb1FweldRIi8+Ci0gICAgICAgICAgICA8c3ViUHJhY3RpY2VzIHhtaTppZD0iXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InByYWN0aWNlX0ExLjEiIGd1aWQ9Il8tRlNVZ0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBBMS4xIHByZXNlbnQiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTl4UDRkN2JhNm9zd0drUGVwWFdrX3ciIGhyZWY9InVtYTovLy05eFA0ZDdiYTZvc3dHa1BlcFhXa193Iy05eFA0ZDdiYTZvc3dHa1BlcFhXa193Ii8+Ci0gICAgICAgICAgICA8L3N1YlByYWN0aWNlcz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJlcG9ydCIgeG1pOmlkPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0icmVwb3J0X0ExIiBndWlkPSJfUTVEYzRBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVhSZUJMZE40aUxidmFmZkJ3ZWJOQ3ciIGhyZWY9InVtYTovLy1YUmVCTGRONGlMYnZhZmZCd2ViTkN3Iy1YUmVCTGRONGlMYnZhZmZCd2ViTkN3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXVzYWJsZUFzc2V0IiB4bWk6aWQ9Il9UVjBhUUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMSIgZ3VpZD0iX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMWhIRU9MOHF5eFRNTVI3NzVVR2ZydyIgaHJlZj0idW1hOi8vLTFoSEVPTDhxeXhUTU1SNzc1VUdmcncjLTFoSEVPTDhxeXhUTU1SNzc1VUdmcnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvYWRtYXAiIHhtaTppZD0iX1prMzlnQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InJvYWRtYXBfQTEiIGd1aWQ9Il9aazM5Z0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii14b0RaYXFyN0otd2YybEI3clNqU1p3IiBocmVmPSJ1bWE6Ly8teG9EWmFxcjdKLXdmMmxCN3JTalNadyMteG9EWmFxcjdKLXdmMmxCN3JTalNadyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6U3VwcG9ydGluZ01hdGVyaWFsIiB4bWk6aWQ9Il9hRnB2VUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0ExIiBndWlkPSJfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNDZBSmxBdnQ1QkRZZkw5X2ctMlI3dyIgaHJlZj0idW1hOi8vLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3cjLTQ2QUpsQXZ0NUJEWWZMOV9nLTJSN3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlbXBsYXRlIiB4bWk6aWQ9Il9iRklQVUEtU0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0ZW1wbGF0ZV9BMSIgZ3VpZD0iX2JGSVBVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItYzlzYjlEaTRNWW1SLVJvb0ZrUDNqdyIgaHJlZj0idW1hOi8vLWM5c2I5RGk0TVltUi1Sb29Ga1AzancjLWM5c2I5RGk0TVltUi1Sb29Ga1AzanciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xtZW50b3JfQTEiIGd1aWQ9Il9oSEVqb0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1wNHhrUW1QekVxYW5YbjFrU2JXWUFnIiBocmVmPSJ1bWE6Ly8tcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyMtcDR4a1FtUHpFcWFuWG4xa1NiV1lBZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfaDhSR1FBLVNFZHFMMk8xUEpWOWNaQSIgbmFtZT0id2hpdGVwYXBlcl9BMSIgZ3VpZD0iX2g4UkdRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTdQWkhMRlNLVkxzWU9BTm4wZ0dxSXciIGhyZWY9InVtYTovLy03UFpITEZTS1ZMc1lPQU5uMGdHcUl3Iy03UFpITEZTS1ZMc1lPQU5uMGdHcUl3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb25jZXB0IiB4bWk6aWQ9Il9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjb25jZXB0X0EyIiBndWlkPSJfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTFBJYXhPSExYcTlpZEdWNDFpVXI5ZyIgaHJlZj0idW1hOi8vLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWcjLUxQSWF4T0hMWHE5aWRHVjQxaVVyOWciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNoZWNrbGlzdCIgeG1pOmlkPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgbmFtZT0iY2hlY2tsaXN0X0EyIiBndWlkPSJfa3JpVGNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUo5VXI5c21wUXV2VkdwdUc5aV93a1EiIGhyZWY9InVtYTovLy1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIy1KOVVyOXNtcFF1dlZHcHVHOWlfd2tRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpFeGFtcGxlIiB4bWk6aWQ9Il91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJleGFtcGxlX0EyIiBndWlkPSJfdWFqV2NBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItcGxEMk0xc2hTRS1MbGJEdzV5WXByZyIgaHJlZj0idW1hOi8vLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmcjLXBsRDJNMXNoU0UtTGxiRHc1eVlwcmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRlbGluZSIgeG1pOmlkPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgbmFtZT0iZ3VpZGVsaW5lX0EyIiBndWlkPSJfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVBjWnR0Vi1zYy1FY1VRd0ItWmhBSXciIGhyZWY9InVtYTovLy1QY1p0dFYtc2MtRWNVUXdCLVpoQUl3Iy1QY1p0dFYtc2MtRWNVUXdCLVpoQUl3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXBvcnQiIHhtaTppZD0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InJlcG9ydF9BMiIgZ3VpZD0iX0dyR3dRQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii01TG5kbWR4eGJHMU0xTWZwQVBLcEFRIiBocmVmPSJ1bWE6Ly8tNUxuZG1keHhiRzFNMU1mcEFQS3BBUSMtNUxuZG1keHhiRzFNMU1mcEFQS3BBUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX1pYcTlFQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InRlbXBsYXRlX0EyIiBndWlkPSJfWlhxOUVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1oTFNPV3JHNWJpU1gtUEFrXzNCYjlBIiBocmVmPSJ1bWE6Ly8taExTT1dyRzViaVNYLVBBa18zQmI5QSMtaExTT1dyRzViaVNYLVBBa18zQmI5QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6U3VwcG9ydGluZ01hdGVyaWFsIiB4bWk6aWQ9Il9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBndWlkPSJfbVBzX2NBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItN3c1M2pGT3p3cE5CZ2VDRF9BX3ZZZyIgaHJlZj0idW1hOi8vLTd3NTNqRk96d3BOQmdlQ0RfQV92WWcjLTd3NTNqRk96d3BOQmdlQ0RfQV92WWciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX3Y3SktBQS1VRWRxTDJPMVBKVjljWkEiIG5hbWU9InRvb2xtZW50b3JfQTIiIGd1aWQ9Il92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1zeFZxLTVhYUllM3p0NWFFdW44RkNnIiBocmVmPSJ1bWE6Ly8tc3hWcS01YWFJZTN6dDVhRXVuOEZDZyMtc3hWcS01YWFJZTN6dDVhRXVuOEZDZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgbmFtZT0id2hpdGVwYXBlcl9BMiIgZ3VpZD0iXzNYcjBFQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXRHREZpaDVUMWx0Vm5NWmVmOEE3NnciIGhyZWY9InVtYTovLy10R0RGaWg1VDFsdFZuTVplZjhBNzZ3Iy10R0RGaWg1VDFsdFZuTVplZjhBNzZ3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcmFjdGljZSIgeG1pOmlkPSJfRXBmb1lBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTIiIGd1aWQ9Il9FcGZvWUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTIgcHJlc2VudCIgY29udGVudFJlZmVyZW5jZXM9Il9FN1owa0EtUkVkcUwyTzFQSlY5Y1pBIF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBIF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIF91YWpXY0EtVEVkcUwyTzFQSlY5Y1pBIF82WVV3QUEtVEVkcUwyTzFQSlY5Y1pBIF9Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIF9QOGpZWUEtU0VkcUwyTzFQSlY5Y1pBIF9Hckd3UUEtVUVkcUwyTzFQSlY5Y1pBIF9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIF82azNVQUEtUEVkcUwyTzFQSlY5Y1pBIF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIF8zWHIwRUEtVUVkcUwyTzFQSlY5Y1pBIF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIF9EenZQb0EtV0VkcUwyTzFQSlY5Y1pBIF9GcVdMOEEtV0VkcUwyTzFQSlY5Y1pBIF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTmNTTVRmaE1sdHRQVUsyRjZ3WGdFZyIgaHJlZj0idW1hOi8vLU5jU01UZmhNbHR0UFVLMkY2d1hnRWcjLU5jU01UZmhNbHR0UFVLMkY2d1hnRWciLz4KLSAgICAgICAgICAgIDxzdWJQcmFjdGljZXMgeG1pOmlkPSJfSnJnd3dBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icHJhY3RpY2VfQTIuMSIgZ3VpZD0iX0pyZ3d3QS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCI+Ci0gICAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItUjlzUXpvSmpRbTQtTkJ4VXFhTFdMZyIgaHJlZj0idW1hOi8vLVI5c1F6b0pqUW00LU5CeFVxYUxXTGcjLVI5c1F6b0pqUW00LU5CeFVxYUxXTGciLz4KLSAgICAgICAgICAgIDwvc3ViUHJhY3RpY2VzPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmV1c2FibGVBc3NldCIgeG1pOmlkPSJfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0icmV1c2FibGVfYXNzZXRfQTIiIGd1aWQ9Il9TTWMzRUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTdnbEdZaUphczloWkdrSjljY1E1S1EiIGhyZWY9InVtYTovLy03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIy03Z2xHWWlKYXM5aFpHa0o5Y2NRNUtRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2FkbWFwIiB4bWk6aWQ9Il9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJyb2FkbWFwX0EyIiBndWlkPSJfWXVrZ1FBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSjBzendyS2JpTDJKbS1GaWZRdEk5dyIgaHJlZj0idW1hOi8vLUowc3p3cktiaUwySm0tRmlmUXRJOXcjLUowc3p3cktiaUwySm0tRmlmUXRJOXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlcm1EZWZpbml0aW9uIiB4bWk6aWQ9Il9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTIiIGd1aWQ9Il9vOEk3RUEtVkVkcUwyTzFQSlY5Y1pBIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLThCUFJJZ19TYkhUd1FBaUFaeTgzUHciIGhyZWY9InVtYTovLy04QlBSSWdfU2JIVHdRQWlBWnk4M1B3Iy04QlBSSWdfU2JIVHdRQWlBWnk4M1B3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUZXJtRGVmaW5pdGlvbiIgeG1pOmlkPSJfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgbmFtZT0idGVybV9kZWZpbml0aW9uX0ExIiBndWlkPSJfc2ZpSlVBLVZFZHFMMk8xUEpWOWNaQSIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1OdmN0U3VtN21tTzRxXzA4Z0xwRDVBIiBocmVmPSJ1bWE6Ly8tTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSMtTnZjdFN1bTdtbU80cV8wOGdMcEQ1QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0idGFza19BMyIgZ3VpZD0iX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmOiBUYXNrIEEzIiBvcmRlcmluZ0d1aWRlPSImbHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtBU0NJSSZxdW90Oz8mZ3Q7ICZsdDtjb20uaWJtLnVtYS5lZGl0LnRuZy51dGlsLm1vZGVsOk9yZGVySW5mb0NvbGxlY3Rpb24geG1pOnZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7IHhtbG5zOnhtaT0mcXVvdDtodHRwOi8vd3d3Lm9tZy5vcmcvWE1JJnF1b3Q7IHhtbG5zOmNvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw9JnF1b3Q7aHR0cDovLy9jb20vaWJtL3VtYS9lZGl0L3RuZy91dGlsL21vZGVsLmVjb3JlJnF1b3Q7Jmd0OyAgICZsdDtvcmRlckluZm9zIG5hbWU9JnF1b3Q7c2VjdGlvbnMmcXVvdDsgdGltZXN0YW1wPSZxdW90OzExMjk3NDcyNjQxMDkmcXVvdDsmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3JDV3dVRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190aTJCWUJCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdW15Z1lFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RrN3NFQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O192eDVCa0VEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgJmx0Oy9vcmRlckluZm9zJmd0OyAmbHQ7L2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiZndDsgIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEzIGV4dGVuZHMgVGFzayBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiB2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PSJfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgcGVyZm9ybWVkQnk9Il84Wk42QUVERkVkcU85TTNmdWtZQV9BIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1iUjlUWDFiWjZXOVJZNUl2SVBHVWpnIiBocmVmPSJ1bWE6Ly8tYlI5VFgxYlo2VzlSWTVJdklQR1VqZyMtYlI5VFgxYlo2VzlSWTVJdklQR1VqZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZSIgeG1pOmlkPSJfOFpONkFFREZFZHFPOU0zZnVrWUFfQSIgbmFtZT0icm9sZV9BMyIgZ3VpZD0iXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIgdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD0iXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZdW1kc1VPSEZWaEdrZXd3SUNOZGd3IiBocmVmPSJ1bWE6Ly8tWXVtZHNVT0hGVmhHa2V3d0lDTmRndyMtWXVtZHNVT0hGVmhHa2V3d0lDTmRndyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfeVVlTExRLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfeVVlTExRLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIiBuYW1lPSJjYXBQYXRQYWtfQTEiIGd1aWQ9Il9UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIj4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il80c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfNHNDdHNEemdFZHE1eXNGT05yMUJHUSIvPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19adFpiTUVERkVkcU85TTNmdWtZQV9BIi8+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfYUhVU1FCQk5FZHFCczdLaGRWTFJMQSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEiLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfZEJodmtFQXZFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGcjX2RCaHZrRUF2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICA8L21ldGhvZFBhY2thZ2VzPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfeVVlTExnLVBFZHFMMk8xUEpWOWNaQSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGd1aWQ9Il95VWVMTGctUEVkcUwyTzFQSlY5Y1pBIj4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iX1c2YTRjQkJORWRxQnM3S2hkVkxSTEEiIGhyZWY9InVtYTovL19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBI19XNmE0Y0JCTkVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfalVOZm9CQk5FZHFCczdLaGRWTFJMQSIgbmFtZT0iZGVsUHJvY1BhayBBMSIgZ3VpZD0iX2pVTmZvQkJORWRxQnM3S2hkVkxSTEEiPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il91cTVLOEJNMUVkcXFuZGktZ0R1eHB3IiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il95VWVMTHctUEVkcUwyTzFQSlY5Y1pBIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX3lVZUxMdy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4Zjk4Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWc3bTk4Smw4YVJiVjZuZk9HVXBHbmciIG5hbWU9InJvbGVfQTEsXzU1emswQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1nN205OEpsOGFSYlY2bmZPR1VwR25nIiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE4VDE2OjA0OjEwLjYwOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEExIHNraWxsczwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+Um9sZSBBMSBhc3NpZ248L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+Um9sZSBBMSBzeW48L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExNTFjYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUh4a2NWaUh1NTdiREd1bDQyMXJCdmciIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1IeGtjVmlIdTU3YkRHdWw0MjFyQnZnIiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjMyOjM1LjQyMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEEyIHNraWxsczwvc2tpbGxzPgotICA8YXNzaWdubWVudEFwcHJvYWNoZXM+Um9sZSBBMiBhc3NpZ248L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+Um9sZSBBMiBzeW48L3N5bm9ueW1zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EzLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlcy9yb2xlX0EzLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2NjMwNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXMvcm9sZV9BMy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVl1bWRzVU9IRlZoR2tld3dJQ05kZ3ciIG5hbWU9Im5ld19yb2xlLF84Wk42QUVERkVkcU85TTNmdWtZQV9BIiBndWlkPSItWXVtZHNVT0hGVmhHa2V3d0lDTmRndyIgY2hhbmdlRGF0ZT0iMjAwNS0xMC0xOVQxMDoyOTo1OS40NTMtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+bWFpbjogUm9sZSBBMzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+a2V5OiBSb2xlIEEzPC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5za2lsbHM6IFJvbGUgQTM8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPmFzc2lnbm1lbnQ6IFJvbGUgQTM8L2Fzc2lnbm1lbnRBcHByb2FjaGVzPgotICA8c3lub255bXM+c3lub255bW5zIDogUm9sZSBBMzwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmUwOTFjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRlY5OUswVk03ZjRjbEFVa1lib0ZPUSIgbmFtZT0icm9sZV9zZXRfZ3JvdXBpbmdfQTEsX0pZbjBnQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1GVjk5SzBWTTdmNGNsQVVrWWJvRk9RIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjQ5OjMxLjY0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBHcm91cGluZyBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBHcm91cGluZyBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvcm9sZXNldHMvcm9sZV9zZXRfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWIxYTk0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVdHYTlOUUotYk01VVowSnVZX0FFUHciIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBndWlkPSItV0dhOU5RSi1iTTVVWjBKdVlfQUVQdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0yMlQxMDo0NzoyMy4yNTAtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Um9sZSBTZXQgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBTZXQgQTExIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS9yb2xlc2V0cy9yb2xlX3NldF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDVmMzMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3JvbGVzZXRzL3JvbGVfc2V0X0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTFJHbGVISXBOczVNYjlRQU9HZlpRdyIgbmFtZT0icm9sZV9zZXRfQTIsXy11YmdjQkJLRWRxQnM3S2hkVkxSTEEiIGd1aWQ9Ii1MUkdsZUhJcE5zNU1iOVFBT0dmWlF3IiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUwOjQwLjMyOC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMTlhNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdGFza3MvdGFza19BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3IiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItUzFpZ0xTaTZBSV92bHV6V09DdTZUdyIgY2hhbmdlRGF0ZT0iMjAwNS0xMC0xOVQxMDoyODozOS40MjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VGFzayBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90dkY0TUJCUEVkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEExLjEiIGd1aWQ9Il90dkY0TUJCUEVkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPmFscGhhPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il90emtJZ0JCUEVkcUJzN0toZFZMUkxBIiBuYW1lPSJTdGVwIEExLjIiIGd1aWQ9Il90emtJZ0JCUEVkcUJzN0toZFZMUkxBIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPmJldGE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTEuMyIgZ3VpZD0iX3VDQmJRQkJQRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Z2FtbWE8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+VGFzayBBMSBwdXJwb3NlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQTEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmQ3YjcxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTEzcThKSkFhMGl4NnJETVpBcXd5MXciIG5hbWU9InRhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3IiBjaGFuZ2VEYXRlPSIyMDA1LTEwLTE5VDEwOjI5OjIyLjU0Ny0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UYXNrIEEyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiIG5hbWU9IlN0ZXAgQTIuMSIgZ3VpZD0iX3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgcHV0IHlvdXIgcmlnaHQgZm9vdCBpbgotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMi4yIiBndWlkPSJfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5wdXQgeW91ciByaWdodCBmb290IG91dDwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSIgbmFtZT0iU3RlcCBBMi4zIiBndWlkPSJfdG5kYm9CQk9FZHFCczdLaGRWTFJMQSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5EbyB0aGUgaG9rZXktcG9rZXk8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRhc2sgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHB1cnBvc2U+VGFzayBBMiBwdXJwb3NlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQTIgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTMueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rhc2tzL3Rhc2tfQTMueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNhZjNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90YXNrcy90YXNrX0EzLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIG5hbWU9Iixfb1VsdUVFREZFZHFPOU0zZnVrWUFfQSIgZ3VpZD0iLWJSOVRYMWJaNlc5Ulk1SXZJUEdVamciIGNoYW5nZURhdGU9IjIwMDUtMTAtMTlUMTA6Mjc6NDMuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPm1haW46IFRhc2sgQTM8L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3JDV3dVRURQRWRxcmhzWmgzUU5BTVEiIG5hbWU9IlN0ZXAgQTMuMSIgZ3VpZD0iX3JDV3dVRURQRWRxcmhzWmgzUU5BTVEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+U3RlcCBBMy4xPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il91bXlnWUVEUEVkcXJoc1poM1FOQU1RIiBuYW1lPSJTdGVwIEEzLjIiIGd1aWQ9Il91bXlnWUVEUEVkcXJoc1poM1FOQU1RIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPlN0ZXAgQTMuMjwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8c2VjdGlvbnMgeG1pOmlkPSJfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSIgbmFtZT0iU3RlcCBBMy4zIiBndWlkPSJfdng1QmtFRFBFZHFyaHNaaDNRTkFNUSI+Ci0gICAgPHNlY3Rpb25EZXNjcmlwdGlvbj5TdGVwIEEzLjM8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPGtleUNvbnNpZGVyYXRpb25zPmtleXM6IFRhc2sgQTM8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5wdXJwb3NlOiBUYXNrIEEzPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPmFsdGVybmF0aXZlczogVGFzayBBMzwvYWx0ZXJuYXRpdmVzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS90b29scy90b29sX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MjcwMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXkwNHdQRTEwLVNCOGlGbnU1Y1hhTUEiIG5hbWU9InRvb2xfQTEsX0t4YmFnQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii15MDR3UEUxMC1TQjhpRm51NWNYYU1BIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE3OjUyOjA3LjIwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRvb2wgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvdG9vbHMvdG9vbF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNzNiZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3Rvb2xzL3Rvb2xfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii16ekJQLTU0R3VRV2ZWVHo2MFNkUXN3IiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItenpCUC01NEd1UVdmVlR6NjBTZFFzdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNzo1MjozNC41NzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+VG9vbCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Ub29sIEEyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMDBiYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1uOVRKUWEwRkp2R19hdkRYYUFUaklRIiBuYW1lPSJhcnRpZmFjdF9BMSB4LF85S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIiBndWlkPSItbjlUSlFhMEZKdkdfYXZEWGFBVGpJUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wN1QxNDo1Mjo0NC45ODQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+QXJ0aWZhY3QgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQTEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBBMSBwdXJwb3NlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+QXJ0aWZhY3QgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkFydGlmYWN0IEExIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+QXJ0aWZhY3QgQTEgYnJpZWY8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5BcnRpZmFjdCBBMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTkxZjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1VRlJvZUFLSGRYWDJTU0IxS1VYdFlBIiBuYW1lPSJhcnRpZmFjdF9BMi4xLF9IRU10RUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItVUZSb2VBS0hkWFgyU1NCMUtVWHRZQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xN1QxOTo0NDowNy43ODEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQTIuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBBMi4xIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkFydGlmYWN0IEEyLjEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBBMi4xIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMi4xIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBBMi4xIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+QXJ0aWZhY3QgQTIuMSBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEEyLjEgcmVwPC9yZXByZXNlbnRhdGlvbk9wdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQTIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOWIzYWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItSlRXS241ZDRDTGM0S0ZRTURURnBTUSIgbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1KVFdLbjVkNENMYzRLRlFNRFRGcFNRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE3VDE5OjQxOjI0LjM5MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5BcnRpZmFjdCBBMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5BcnRpZmFjdCBBMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5BcnRpZmFjdCBBMiB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkFydGlmYWN0IEEyIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+QXJ0aWZhY3QgQTIgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBBMiBicmllZjwvYnJpZWZPdXRsaW5lPgotICA8cmVwcmVzZW50YXRpb25PcHRpb25zPkFydGlmYWN0IEEyIHJlcDwvcmVwcmVzZW50YXRpb25PcHRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0ExLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDYyYTI1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUFiWFJnNDRMOFR4eDRDa0IyaHg1TlEiIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItQWJYUmc0NEw4VHh4NENrQjJoeDVOUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDoyOTo1OS4zOTEtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQTEgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEExIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBBMSByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMSBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBBMSBwa2c8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY0N2UzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQTIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU1kcW9hLW54d0VIZkFKY29BNlhOS1EiIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF9KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIiBndWlkPSItTWRxb2Etbnh3RUhmQUpjb0E2WE5LUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxNDozMDoxNS4xNzItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQTIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQTIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQTIgdW5pcXVlPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBBMiBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEEyJmFtcDtuYnNwO2ltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBBMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBBMiBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBBMiBwa2c8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0ExLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YjQ2MS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3RzL291dGNvbWVfQTEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItM29keUJ5SWV6UlJYZ1FnZUh1TTZTQSIgbmFtZT0ib3V0Y29tZV9BMSxfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iLTNvZHlCeUllelJSWGdRZ2VIdU02U0EiIGNoYW5nZURhdGU9IjIwMDUtMDgtMThUMTQ6MzA6MTguMTg4LTA3MDAiIGNoYW5nZURlc2NyaXB0aW9uPSIgT3V0Y29tZSBBMSAiPgotICA8bWFpbkRlc2NyaXB0aW9uPk91dGNvbWUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+T3V0Y29tZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5PdXRjb21lIEExIHVuaXF1ZTwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+T3V0Y29tZSBBMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPk91dGNvbWUgQTEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPk91dGNvbWUgQTEgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvb3V0Y29tZV9BMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjFlNDMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9vdXRjb21lX0EyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTRHYkFXR2I4N0Fsei1Hel9HXzlwMWciIG5hbWU9Im91dGNvbWVfQTIsX0t2THhFQS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii00R2JBV0diODdBbHotR3pfR185cDFnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE0OjMwOjIxLjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5PdXRjb21lIEExIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPk91dGNvbWUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+T3V0Y29tZSBBMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPk91dGNvbWUgQTEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5PdXRjb21lIEExIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5PdXRjb21lIEExIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHMvc3ViX2FydGlmYWN0X0ExLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmE1YzQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0cy9zdWJfYXJ0aWZhY3RfQTEuMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItOW4xV1g1ZDdJRmhWSjRwekhWX3ZyUSIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii05bjFXWDVkN0lGaFZKNHB6SFZfdnJRIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjA0OjE5LjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5TdWJfQXJ0aWZhY3QgQTEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5TdWJfQXJ0aWZhY3QgQTEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5TdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWU8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBBMS4xIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBBMS4xIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxicmllZk91dGxpbmU+U3ViX0FydGlmYWN0IEExLjEgYnJpZWY8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5TdWJfQXJ0aWZhY3QgQTEuMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBBL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjdjOGYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0ExLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItVGZSRG9IaXNtc2hqOGNMMmxPUnRjZyIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEsX0hnaERZQS1XRWRxTDJPMVBKVjljWkEiIGd1aWQ9Ii1UZlJEb0hpc21zaGo4Y0wybE9SdGNnIiBjaGFuZ2VEYXRlPSIyMDA1LTA4LTE4VDE4OjAyOjQ0LjEyNS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Xb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQS93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0EyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1NDc2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEEvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9BMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWNsZkRBMFBNNnhMSWp5aFNwMWlMUVEiIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBndWlkPSItY2xmREEwUE02eExJanloU3AxaUxRUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOC0xOFQxODowMzoxNi4zNDQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+V29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+V29yayBQcm9kdWN0IFR5cGUgQTEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2NvbnRlbnQueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzZTA4NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2NvbnRlbnQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii13eWJIS1VkbFhiREZHMEhPUGhBSjZRIiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iLXd5YkhLVWRsWGJERkcwSE9QaEFKNlEiLz4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvZGlhZ3JhbS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL0NQIEIxL2RpYWdyYW0ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzU1NjlmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvZGlhZ3JhbS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIHhtbG5zOm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2dtZi9ydW50aW1lLzEuMC4wL25vdGF0aW9uIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvZGlhZ3JhbS8xLjAuMC9kaWFncmFtLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczp1bWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwiPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0ljX1JvT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOkFjdGl2aXR5RGV0YWlsRGlhZ3JhbT4KLSAgPG5vdGF0aW9uOkRpYWdyYW0geG1pOmlkPSJfSWNfUm9leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iQUREIiBlbGVtZW50PSJfSWNfUm9PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQ1AgQjEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWNfUm91eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0ljX1JvLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JY19ScE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLSAgPHVtbDpBY3Rpdml0eSB4bWk6aWQ9Il9JZV9jd094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3QxIj4KLSAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWVfY3dleDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0llX2N3dXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWVfY3cteDRFZHUyT282cS1uSFdnZyIga2V5PSJ0eXBlIiB2YWx1ZT0iQWN0aXZpdHkiLz4KLSAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfSWdKVFVPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMSBwcmVzZW50Ij4KLSAgICAgIDxlQW5ub3RhdGlvbnMgeG1pOnR5cGU9ImVjb3JlOkVBbm5vdGF0aW9uIiB4bWk6aWQ9Il9JZ1Zna094NEVkdTJPbzZxLW5IV2dnIiBzb3VyY2U9InVtYV9lbGVtZW50Ij4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JZ1Zna2V4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InVyaSIgdmFsdWU9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWdWZ2t1eDRFZHUyT282cS1uSFdnZyIga2V5PSJ0eXBlIiB2YWx1ZT0iVGFzayIvPgotICAgICAgPC9lQW5ub3RhdGlvbnM+Ci0gICAgPC9ub2RlPgotICAgIDxub2RlIHhtaTp0eXBlPSJ1bWw6QWN0aXZpdHlQYXJhbWV0ZXJOb2RlIiB4bWk6aWQ9Il9JaDNLa3V4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJUYXNrIEIxIHByZXNuZXQiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0loM0trLXg0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0idW1hX2VsZW1lbnQiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tsT3g0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JaDNLbGV4NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L25vZGU+Ci0gICAgPG5vZGUgeG1pOnR5cGU9InVtbDpBY3Rpdml0eVBhcmFtZXRlck5vZGUiIHhtaTppZD0iX0loM0tuLXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgcHJlc2VudCI+Ci0gICAgICA8ZUFubm90YXRpb25zIHhtaTp0eXBlPSJlY29yZTpFQW5ub3RhdGlvbiIgeG1pOmlkPSJfSWgzS29PeDRFZHUyT282cS1uSFdnZyIgc291cmNlPSJ1bWFfZWxlbWVudCI+Ci0gICAgICAgIDxkZXRhaWxzIHhtaTp0eXBlPSJlY29yZTpFU3RyaW5nVG9TdHJpbmdNYXBFbnRyeSIgeG1pOmlkPSJfSWgzS29leDRFZHUyT282cS1uSFdnZyIga2V5PSJ1cmkiIHZhbHVlPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tvdXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idHlwZSIgdmFsdWU9IlRhc2siLz4KLSAgICAgIDwvZUFubm90YXRpb25zPgotICAgIDwvbm9kZT4KLSAgICA8bm9kZSB4bWk6dHlwZT0idW1sOkFjdGl2aXR5UGFyYW1ldGVyTm9kZSIgeG1pOmlkPSJfSWgzS3JPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBBMiAiPgotICAgICAgPGVBbm5vdGF0aW9ucyB4bWk6dHlwZT0iZWNvcmU6RUFubm90YXRpb24iIHhtaTppZD0iX0loM0tyZXg0RWR1Mk9vNnEtbkhXZ2ciIHNvdXJjZT0idW1hX2VsZW1lbnQiPgotICAgICAgICA8ZGV0YWlscyB4bWk6dHlwZT0iZWNvcmU6RVN0cmluZ1RvU3RyaW5nTWFwRW50cnkiIHhtaTppZD0iX0loM0tydXg0RWR1Mk9vNnEtbkhXZ2ciIGtleT0idXJpIiB2YWx1ZT0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgPGRldGFpbHMgeG1pOnR5cGU9ImVjb3JlOkVTdHJpbmdUb1N0cmluZ01hcEVudHJ5IiB4bWk6aWQ9Il9JaDNLci14NEVkdTJPbzZxLW5IV2dnIiBrZXk9InR5cGUiIHZhbHVlPSJUYXNrIi8+Ci0gICAgICA8L2VBbm5vdGF0aW9ucz4KLSAgICA8L25vZGU+Ci0gIDwvdW1sOkFjdGl2aXR5PgotICA8bm90YXRpb246RGlhZ3JhbSB4bWk6aWQ9Il9JZlJ3b094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSJBRCIgZWxlbWVudD0iX0llX2N3T3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWhrMnNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwOSIgZWxlbWVudD0iX0lnSlRVT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaHhEOE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0trT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWhrMnNleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaGsyc3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0loazJzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWhrMnRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWgzS2tleDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tsdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDkiIGVsZW1lbnQ9Il9JaDNLa3V4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS25PeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLbmV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0loM0tsLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWgzS21PeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaDNLbWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0loM0ttdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0loM0tudXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDNLby14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDA5IiBlbGVtZW50PSJfSWgzS24teDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0txZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDgiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWgzS3F1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaDNLcE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0loM0twZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWgzS3B1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaDNLcC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaDNLcS14NEVkdTJPbzZxLW5IV2dnIiB4PSIxMjkiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0loM0tzT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDkiIGVsZW1lbnQ9Il9JaDNLck94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWg5Uk1PeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwOCIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaDlSTWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDA4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0loM0tzZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWgzS3N1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaDNLcy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0loM0t0T3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0loOVJNdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JZlJ3b2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWZSd291eDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lmUndvLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6QWN0aXZpdHlEZXRhaWxEaWFncmFtIHhtaTppZD0iX0lpVnIwT3g0RWR1Mk9vNnEtbkhXZ2ciPgotICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIwZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JaVZyMHV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEExIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjAteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnIxdXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjFPeDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjJleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIxZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjF1eDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjAteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyMS14NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjJPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Q29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyMmV4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjFPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXNjcmlwdG9yTm9kZSIgeG1pOmlkPSJfSWlWcjJ1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZVRhc2tDb21wb3NpdGUiIHhtaTppZD0iX0lpVnIyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZazBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVOb2RlIiB4bWk6aWQ9Il9JaVZyM094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJSb2xlIEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlRhc2tOb2RlIiB4bWk6aWQ9Il9JaVZyM2V4NEVkdTJPbzZxLW5IV2dnIiBpbmNvbWluZ0Nvbm5lY3Rpb25zPSJfSWlWcjRPeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iVGFzayBCMSBwcmVzbmV0Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyM3V4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNHV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjMteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyNE94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyM2V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI0ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZblVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjR1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnIzdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI0LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOlJvbGVUYXNrQ29tcG9zaXRlIiB4bWk6aWQ9Il9JaVZyNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlTm9kZSIgeG1pOmlkPSJfSWlWcjVleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iUm9sZSBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbDBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjV1eDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI2ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjUteDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjYteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnI2T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8b3V0Z29pbmdDb25uZWN0aW9ucyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6TGluayIgeG1pOmlkPSJfSWlWcjZleDRFZHUyT282cS1uSFdnZyIgdGFyZ2V0PSJfSWlWcjV1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyNnV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50Ij4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9ub2Rlcz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3RDb21wb3NpdGUiIHhtaTppZD0iX0lpVnI2LXg0RWR1Mk9vNnEtbkhXZ2ciIGluY29taW5nQ29ubmVjdGlvbnM9Il9JaVZyNS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdERlc2NyaXB0b3JOb2RlIiB4bWk6aWQ9Il9JaVZyN094NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbGtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpSb2xlVGFza0NvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjdleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6Um9sZU5vZGUiIHhtaTppZD0iX0lpVnI3dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlJvbGUgQTIgIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbVVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpUYXNrTm9kZSIgeG1pOmlkPSJfSWlWcjcteDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI4dXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IlRhc2sgQTIgIj4KLSAgICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyOE94NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyOU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjhleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDxvdXRnb2luZ0Nvbm5lY3Rpb25zIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpMaW5rIiB4bWk6aWQ9Il9JaVZyOHV4NEVkdTJPbzZxLW5IV2dnIiB0YXJnZXQ9Il9JaVZyNy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI4LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiPgotICAgICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L25vZGVzPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdENvbXBvc2l0ZSIgeG1pOmlkPSJfSWlWcjlPeDRFZHUyT282cS1uSFdnZyIgaW5jb21pbmdDb25uZWN0aW9ucz0iX0lpVnI4T3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZUmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVzY3JpcHRvck5vZGUiIHhtaTppZD0iX0lpVnI5ZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvbm9kZXM+Ci0gICAgPC9ub2Rlcz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpBY3Rpdml0eURldGFpbERpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lpVnI5dXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IkFERCIgZWxlbWVudD0iX0lpVnIwT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFjdDEiIG1lYXN1cmVtZW50VW5pdD0iUGl4ZWwiPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWci11eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lpVnIwZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZyLS14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnJfT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWcl9leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZyX3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzQU94NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0FleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIxZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzQXV4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNBLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0JPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzQmV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzQi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0NPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIyZXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzQ2V4NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNDdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0MteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzRE94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzRHV4NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0QteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lpVnIyLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzRU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNFZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0V1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzRmV4NEVkdTJPbzZxLW5IV2dnIiB4PSIyMCIgeT0iODgiIHdpZHRoPSIxOTYiIGhlaWdodD0iNTMiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlWc0Z1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnIzLXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaVZzRi14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnNHT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlWc0dleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaVZzR3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaVZzSE94NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjEiIHdpZHRoPSI3MyIgaGVpZ2h0PSI2NyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaVZzSGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjR1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpVnNIdXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlWc0gteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaVZzSU94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpVnNJZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlVT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMTYxIiB3aWR0aD0iNzMiIGhlaWdodD0iMTExIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lpYnlVZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JaVZyNU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWlieVV1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JaWJ5VS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lpYnlWT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWlieVZleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWlieVYteDRFZHUyT282cS1uSFdnZyIgeD0iMjAiIHk9IjQwMCIgd2lkdGg9IjE5NiIgaGVpZ2h0PSI1MyIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5V094NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjZPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlXZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieVd1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5Vy14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnlYT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlYdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEzMCIgeT0iMzEzIiB3aWR0aD0iNzMiIGhlaWdodD0iNjciLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWlieVgteDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMiIgZWxlbWVudD0iX0lpVnI2LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JaWJ5WU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpYnlZZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWlieVl1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JaWJ5WS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JaWJ5WmV4NEVkdTJPbzZxLW5IV2dnIiB4PSIxMzAiIHk9IjQ3MyIgd2lkdGg9IjczIiBoZWlnaHQ9IjExMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5WnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWlWcjdleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlaLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWFPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5YWV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnlhdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnliT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5YmV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjhleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlidXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWIteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5Y094NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnljZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnljLXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JaWJ5ZE94NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAyIiBlbGVtZW50PSJfSWlWcjlPeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lpYnlkZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWlieWR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JaWJ5ZC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lpYnllT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lpYnlldXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246UGFnZVN0eWxlIiB4bWk6aWQ9Il9JaVZyOS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246R3VpZGVTdHlsZSIgeG1pOmlkPSJfSWlWci1PeDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lpVnItZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgPC9ub3RhdGlvbjpEaWFncmFtPgotICA8b3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3REZXBlbmRlbmN5RGlhZ3JhbSB4bWk6aWQ9Il9JalN0OE94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBY3Rpdml0eSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDhleDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbmtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDh1eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdDgteDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiB0eXBlPSIzIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OU94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiB0eXBlPSIxIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1luVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OWV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiB0eXBlPSIyIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICAgIDxub2RlcyB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0ubW9kZWw6V29ya1Byb2R1Y3ROb2RlIiB4bWk6aWQ9Il9JalN0OXV4NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHR5cGU9IjMiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3Q5LXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHR5cGU9IjEiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3QtT3g0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHR5cGU9IjIiPgotICAgICAgPGxpbmtlZEVsZW1lbnQgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgIDwvbm9kZXM+Ci0gICAgPG5vZGVzIHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYuZGlhZ3JhbS5tb2RlbDpXb3JrUHJvZHVjdE5vZGUiIHhtaTppZD0iX0lqU3QtZXg0RWR1Mk9vNnEtbkhXZ2ciIG5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgdHlwZT0iMyI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbGtBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC11eDRFZHUyT282cS1uSFdnZyIgbmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgdHlwZT0iMSI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdC0teDRFZHUyT282cS1uSFdnZyIgbmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgdHlwZT0iMiI+Ci0gICAgICA8bGlua2VkRWxlbWVudCB4bWk6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZbTBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgPC9ub2Rlcz4KLSAgICA8bm9kZXMgeG1pOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0Tm9kZSIgeG1pOmlkPSJfSWpTdF9PeDRFZHUyT282cS1uSFdnZyIgbmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiB0eXBlPSIzIj4KLSAgICAgIDxsaW5rZWRFbGVtZW50IHhtaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L25vZGVzPgotICA8L29yZy5lY2xpcHNlLmVwZi5kaWFncmFtLm1vZGVsOldvcmtQcm9kdWN0RGVwZW5kZW5jeURpYWdyYW0+Ci0gIDxub3RhdGlvbjpEaWFncmFtIHhtaTppZD0iX0lqWTBrT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IldQREQiIGVsZW1lbnQ9Il9JalN0OE94NEVkdTJPbzZxLW5IV2dnIiBuYW1lPSJBY3QxIiBtZWFzdXJlbWVudFVuaXQ9IlBpeGVsIj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqZTdNT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OGV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjBPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCMGV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqZTdNZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWplN011eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JamU3TS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqZTdOT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqbEIwdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCMC14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDh1eDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEIyZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjJ1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JamxCMU94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqbEIxZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpsQjF1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JamxCMS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JamxCMi14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpsQjNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q4LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JamxCNHV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEI0LXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpsQjNleDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JamxCM3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqbEIzLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpsQjRPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpsQjVPeDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqbEI1ZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OU94NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWNPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJY2V4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqbEI1dXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpsQjUteDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JamxCNk94NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqbEI2ZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqckljdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9IjEwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJYy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdDlleDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqckllZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWV1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanJJZE94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqcklkZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpySWR1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanJJZC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanJJZS14NEVkdTJPbzZxLW5IV2dnIiB4PSIxNDIiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklmT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0OXV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWd1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJZy14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqcklmZXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySWZ1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJZi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqcklnT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqckloT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjI5MSIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWhleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3Q5LXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJaS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklqT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWpySWh1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanJJaC14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqcklpT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWpySWlleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWpySWpleDRFZHUyT282cS1uSFdnZyIgeD0iNDMwIiB5PSIxMCIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJanV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdC1PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklsT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySWxleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanJJai14NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqcklrT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWpySWtleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanJJa3V4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanJJbHV4NEVkdTJPbzZxLW5IV2dnIiB4PSI1NjIiIHk9IjEwIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqcklsLXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0LWV4NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWpySW5leDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanJJbnV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqckltT3g0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWpySW1leDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanJJbXV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqckltLXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqeFBFT3g0RWR1Mk9vNnEtbkhXZ2ciIHg9IjcxMSIgeT0iMTAiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEVleDRFZHUyT282cS1uSFdnZyIgdHlwZT0iMTAwMSIgZWxlbWVudD0iX0lqU3QtdXg0RWR1Mk9vNnEtbkhXZ2ciPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQRi14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBHT3g0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZvbnRTdHlsZSIgeG1pOmlkPSJfSWp4UEV1eDRFZHUyT282cS1uSFdnZyIgZm9udE5hbWU9IkFyaWFsIiBmb250SGVpZ2h0PSI4Ii8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9JanhQRS14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGaWxsU3R5bGUiIHhtaTppZD0iX0lqeFBGT3g0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkxpbmVTdHlsZSIgeG1pOmlkPSJfSWp4UEZleDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPGxheW91dENvbnN0cmFpbnQgeG1pOnR5cGU9Im5vdGF0aW9uOkJvdW5kcyIgeG1pOmlkPSJfSWp4UEdleDRFZHUyT282cS1uSFdnZyIgeD0iLTEiIHk9Ii0xIi8+Ci0gICAgPC9jaGlsZHJlbj4KLSAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBHdXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjEwMDEiIGVsZW1lbnQ9Il9JalN0LS14NEVkdTJPbzZxLW5IV2dnIj4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UElPeDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQSWV4NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSI0MDAxIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpGb250U3R5bGUiIHhtaTppZD0iX0lqeFBHLXg0RWR1Mk9vNnEtbkhXZ2ciIGZvbnROYW1lPSJBcmlhbCIgZm9udEhlaWdodD0iOCIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RGVzY3JpcHRpb25TdHlsZSIgeG1pOmlkPSJfSWp4UEhPeDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246RmlsbFN0eWxlIiB4bWk6aWQ9Il9JanhQSGV4NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpMaW5lU3R5bGUiIHhtaTppZD0iX0lqeFBIdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxsYXlvdXRDb25zdHJhaW50IHhtaTp0eXBlPSJub3RhdGlvbjpCb3VuZHMiIHhtaTppZD0iX0lqeFBJdXg0RWR1Mk9vNnEtbkhXZ2ciIHg9Ii0xIiB5PSItMSIvPgotICAgIDwvY2hpbGRyZW4+Ci0gICAgPGNoaWxkcmVuIHhtaTp0eXBlPSJub3RhdGlvbjpOb2RlIiB4bWk6aWQ9Il9JanhQSS14NEVkdTJPbzZxLW5IV2dnIiB0eXBlPSIxMDAxIiBlbGVtZW50PSJfSWpTdF9PeDRFZHUyT282cS1uSFdnZyI+Ci0gICAgICA8Y2hpbGRyZW4geG1pOnR5cGU9Im5vdGF0aW9uOk5vZGUiIHhtaTppZD0iX0lqeFBLZXg0RWR1Mk9vNnEtbkhXZ2ciIHR5cGU9IjQwMDEiLz4KLSAgICAgIDxjaGlsZHJlbiB4bWk6dHlwZT0ibm90YXRpb246Tm9kZSIgeG1pOmlkPSJfSWp4UEt1eDRFZHUyT282cS1uSFdnZyIgdHlwZT0iNDAwMSIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246Rm9udFN0eWxlIiB4bWk6aWQ9Il9JanhQSk94NEVkdTJPbzZxLW5IV2dnIiBmb250TmFtZT0iQXJpYWwiIGZvbnRIZWlnaHQ9IjgiLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkRlc2NyaXB0aW9uU3R5bGUiIHhtaTppZD0iX0lqeFBKZXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkZpbGxTdHlsZSIgeG1pOmlkPSJfSWp4UEp1eDRFZHUyT282cS1uSFdnZyIvPgotICAgICAgPHN0eWxlcyB4bWk6dHlwZT0ibm90YXRpb246TGluZVN0eWxlIiB4bWk6aWQ9Il9JanhQSi14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gICAgICA8bGF5b3V0Q29uc3RyYWludCB4bWk6dHlwZT0ibm90YXRpb246Qm91bmRzIiB4bWk6aWQ9Il9JanhQSy14NEVkdTJPbzZxLW5IV2dnIiB4PSItMSIgeT0iLTEiLz4KLSAgICA8L2NoaWxkcmVuPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOlBhZ2VTdHlsZSIgeG1pOmlkPSJfSWpZMGtleDRFZHUyT282cS1uSFdnZyIvPgotICAgIDxzdHlsZXMgeG1pOnR5cGU9Im5vdGF0aW9uOkd1aWRlU3R5bGUiIHhtaTppZD0iX0lqWTBrdXg0RWR1Mk9vNnEtbkhXZ2ciLz4KLSAgICA8c3R5bGVzIHhtaTp0eXBlPSJub3RhdGlvbjpEZXNjcmlwdGlvblN0eWxlIiB4bWk6aWQ9Il9Jalkway14NEVkdTJPbzZxLW5IV2dnIi8+Ci0gIDwvbm90YXRpb246RGlhZ3JhbT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvQ1AgQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9tb2RlbC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDQ3MGIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9DUCBCMS9tb2RlbC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyIgZ3VpZD0iXzU5d0N3RUE1RWRxRnFJdTgtY2tvbGciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzU5d0N3VUE1RWRxRnFJdTgtY2tvbGciIGlkPSItd3liSEtVZGxYYkRGRzBIT1BoQUo2USIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il81NnhuUUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJDUCBCMSIgZ3VpZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciPgotICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il81NjdZUUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfNTY3WVFFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFjdGl2aXR5IiB4bWk6aWQ9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJBY3QxIiBndWlkPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WW9rQTVFZHFGcUl1OC1ja29sZyIgYnJlYWtkb3duRWxlbWVudHM9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIF81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIF81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIF81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIF81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIF81NjdZazBBNUVkcUZxSXU4LWNrb2xnIF81NjdZbDBBNUVkcUZxSXU4LWNrb2xnIF81NjdZblVBNUVkcUZxSXU4LWNrb2xnIF81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIF81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIF81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIF81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIF81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIF81NjdZUmtBNUVkcUZxSXU4LWNrb2xnIF81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIF81NjdZajBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0ExIiBndWlkPSJfNTY3WVNVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyBfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190dkY0TUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I190emtJZ0JCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1TMWlnTFNpNkFJX3ZsdXpXT0N1NlR3I191Q0JiUUJCUEVkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQTEiIGd1aWQ9Il81NjdZU0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiByZXNwb25zaWJsZUZvcj0iXzU2N1lua0E1RWRxRnFJdTgtY2tvbGcgXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGcgXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNTV6azBBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbVVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJyb2xlX0EyIiBndWlkPSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmszVUFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW9VQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGd1aWQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lua0E1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgZ3VpZD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBkZWxpdmVyYWJsZVBhcnRzPSJfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyBfNTY3WWtrQTVFZHFGcUl1OC1ja29sZyBfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0lJU25VQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1luMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQTEiIGd1aWQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX0tBXzFZQS1SRWRxTDJPMVBKVjljWkEiLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1luRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImFydGlmYWN0X0ExIiBndWlkPSJfNTY3WW5FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI185S3Q3OEEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZa2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgZ3VpZD0iXzU2N1lra0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRjUxeXdBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVFVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMSIgZ3VpZD0iXzU2N1lRVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS0FfMVlBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJ0YXNrX0IxIiBndWlkPSJfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMSBwcmVzbmV0IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WWswQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19YVTZMVUI4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UNThqc0I4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3I19UOFZKVUI4NEVkcU52ZWx5YkRYWkZRIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjEiIGd1aWQ9Il81NjdZazBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIHJlc3BvbnNpYmxlRm9yPSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyBfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxSb2xlIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il81NjdZbDBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Um9sZSBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IxIiBndWlkPSJfNTY3WW9FQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il81NjdZUzBBNUVkcUZxSXU4LWNrb2xnIF81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkhmMllCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMSIgZ3VpZD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVMwQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il81NjdZUzBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX21xSjNBQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lURUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjEiIGd1aWQ9Il81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19CMiIgZ3VpZD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il81NjdZazBBNUVkcUZxSXU4LWNrb2xnIiBtYW5kYXRvcnlJbnB1dD0iXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciIG9wdGlvbmFsSW5wdXQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIiBvdXRwdXQ9Il81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIiBwZXJmb3JtZWRQcmltYXJpbHlCeT0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8VGFzayBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfb3FZc3dCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXVRcEFCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgICA8c2VsZWN0ZWRTdGVwcyBocmVmPSJ1bWE6Ly8tSjN6MElHZmplaGl0MHVGYlRKY2E3ZyNfcXl1NVVCODRFZHFOdmVseWJEWFpGUSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il81NjdZUWtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBndWlkPSJfNTY3WWxFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHN1cGVyQWN0aXZpdGllcz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGRlbGl2ZXJhYmxlUGFydHM9Il81NjdZa1VBNUVkcUZxSXU4LWNrb2xnIF81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9CMiIgZ3VpZD0iXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW1rQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iYXJ0aWZhY3RfQjIiIGd1aWQ9Il81NjdZbWtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX195RzdjQjhtRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0b3IiIHhtaTppZD0iXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGciIG5hbWU9Im91dGNvbWVfQjIiIGd1aWQ9Il81NjdZa1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciLz4KLSAgICAgIDwvcHJvY2Vzc0VsZW1lbnRzPgotICAgICAgPHByb2Nlc3NFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0idGFza19BMiIgZ3VpZD0iXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iXzU2N1lTRUE1RWRxRnFJdTgtY2tvbGciIG1hbmRhdG9yeUlucHV0PSJfNTY3WWtFQTVFZHFGcUl1OC1ja29sZyIgb3B0aW9uYWxJbnB1dD0iXzU2N1ltMEE1RWRxRnFJdTgtY2tvbGciIG91dHB1dD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciIHBlcmZvcm1lZFByaW1hcmlseUJ5PSJfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgIDxUYXNrIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190aTJCWUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190azdzRUJCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICAgIDxzZWxlY3RlZFN0ZXBzIGhyZWY9InVtYTovLy0xM3E4SkpBYTBpeDZyRE1aQXF3eTF3I190bmRib0JCT0VkcUJzN0toZFZMUkxBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzU2N1lrRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGd1aWQ9Il81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgc3VwZXJBY3Rpdml0aWVzPSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIgZGVsaXZlcmFibGVQYXJ0cz0iXzU2N1lSVUE1RWRxRnFJdTgtY2tvbGcgXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8V29ya1Byb2R1Y3QgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19KQnFmVUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZajBBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJvdXRjb21lX0EyIiBndWlkPSJfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBzdXBlckFjdGl2aXRpZXM9Il81NjdZUTBBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOk91dGNvbWUiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19Ldkx4RUEtUkVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICA8L3Byb2Nlc3NFbGVtZW50cz4KLSAgICAgIDxwcm9jZXNzRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdG9yIiB4bWk6aWQ9Il81NjdZU2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJhcnRpZmFjdF9BMiIgZ3VpZD0iXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50Ij4KLSAgICAgICAgPFdvcmtQcm9kdWN0IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0IiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfRTdaMGtBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8cHJvY2Vzc0VsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRvciIgeG1pOmlkPSJfNTY3WVJVQTVFZHFGcUl1OC1ja29sZyIgbmFtZT0ib3V0Y29tZV9BMiIgZ3VpZD0iXzU2N1lSVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCI+Ci0gICAgICAgIDxXb3JrUHJvZHVjdCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIvPgotICAgICAgPC9wcm9jZXNzRWxlbWVudHM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfcmF4RkFFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JheEZBRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfcmJOSjRFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JiTko0RUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9yYk5KNFVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMC4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfcmJOSjRrQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3JiTko0a0E2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfcmJOSjQwQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3JiTko1RUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9yYk5KNUVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfcmJOSjVVQTZFZHFGcUl1OC1ja29sZyIgeD0iMTI5LjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9yYk5KNWtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmJOSjVrQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9yYk5KNTBBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9yYXhGQVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfcmF4RkFVQTZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJXb3JrZmxvdyIgZWxlbWVudD0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfc0FkekVFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekVVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6RWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekUwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpFMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkekZFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpGVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6RlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkekZrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpGMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6RjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpHRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6R1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekdVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpHa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6RzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekcwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6SEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekhVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpIVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6SGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekgwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpIMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkeklFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpJVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6SVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkeklrQTZFZHFGcUl1OC1ja29sZyIgeD0iMTAuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpJMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6STBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpKRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6SlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekpVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpKa0E2RWRxRnFJdTgtY2tvbGciIHg9IjE0Mi4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0FkekowQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpKMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkektFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpLVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6S1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkektrQTZFZHFGcUl1OC1ja29sZyIgeD0iMjkxLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6SzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkekswQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6TEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0FkekxVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpMVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6TGtBNkVkcUZxSXU4LWNrb2xnIiB4PSI0MzAuMCIgeT0iMTAuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpMMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVFrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpNRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6TVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek1VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpNa0E2RWRxRnFJdTgtY2tvbGciIHg9IjU2Mi4wIiB5PSIxMC4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0Fkek0wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpNMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0Fkek5FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpOVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6TlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0Fkek5rQTZFZHFGcUl1OC1ja29sZyIgeD0iNzExLjAiIHk9IjEwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6TjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0Fkek4wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6T0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfc0Fkek9VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpPVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il9zQWR6T2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfc0Fkek8wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3NBZHpPMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfc0FkelBFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3NBZHpQVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfc0FkelBrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3NBZHpQMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il9zQWR6UDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3NBZHpRRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il9zQWR6UVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelFVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3NBZHpRa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6UTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelEwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il9zQWR6UkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il9zQWR6UlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfc0FkelJVQTZFZHFGcUl1OC1ja29sZyIgcHJlc2VudGF0aW9uPSJXb3JrIFByb2R1Y3QgRGVwZW5kZW5jeSIgZWxlbWVudD0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgIDwvZGlhZ3JhbXM+Ci0gICAgICA8ZGlhZ3JhbXMgeG1pOmlkPSJfdTM1VE1FQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VE1VQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUTWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VE0wQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRNMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZU1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VE5FQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVROVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUTlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VE5rQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVROMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUTjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRPRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUT1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE9VQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRPa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUTzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VE8wQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltVUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUUEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFBVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRQVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUUGtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFAwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRQMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFFFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRRVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUVVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFFrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRRMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUUTBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5rQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRSRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUUlVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFJVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRSa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUUjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFIwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1ltRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUU0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFNVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRTVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUU2tBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFMwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRTMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFRFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRUVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVFVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFRrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRUMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVDBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVIwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRVRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUVVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFVVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRVa0E2RWRxRnFJdTgtY2tvbGciIHg9IjIwLjAiIHk9Ijg4LjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUVTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFUwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lrMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUVkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRWVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFZrQTZFZHFGcUl1OC1ja29sZyIgeD0iMjAuMCIgeT0iNDAwLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUVjBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFYwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lsMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUV0VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iMTk2LjAiIGhlaWdodD0iNTMuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRXVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUV1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFdrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRXMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUVzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW5VQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRYRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUWFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFhVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRYa0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUWDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VFgwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lvRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUWUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VFlVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRZVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUWWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VFkwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRZMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbFVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VFpFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRaVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VFprQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRaMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUWjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WVJFQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRhRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUYVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGFVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRha0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUYTBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGEwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUYkVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGJVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRiVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUYmtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGIwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRiMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZbEVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGNFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRjVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUY1VBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGNrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRjMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUYzBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WWxrQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRkRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUZFVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGRVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRka0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUZDBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGQwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSa0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUZUVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTM1VGVVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRlVUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91MzVUZWtBNkVkcUZxSXU4LWNrb2xnIiB4PSItMS4wIiB5PSItMS4wIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGUwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRlMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTM1VGZFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9Ii0xLjAiIGhlaWdodD0iLTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3UzNVRmVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cG9zaXRpb24geG1pOmlkPSJfdTM1VGZrQTZFZHFGcUl1OC1ja29sZyIgeD0iLTEuMCIgeT0iLTEuMCIvPgotICAgICAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iX3UzNVRmMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91MzVUZjBBNkVkcUZxSXU4LWNrb2xnIiBlbGVtZW50PSJfNTY3WW0wQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgICAgIDxzaXplIHhtaTppZD0iX3UzNVRnRUE2RWRxRnFJdTgtY2tvbGciIHdpZHRoPSItMS4wIiBoZWlnaHQ9Ii0xLjAiLz4KLSAgICAgICAgPC9jb250YWluZWQ+Ci0gICAgICAgIDxjb250YWluZWQgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3JhcGhOb2RlIiB4bWk6aWQ9Il91MzVUZ1VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGdVQTZFZHFGcUl1OC1ja29sZyI+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3UzNVRna0E2RWRxRnFJdTgtY2tvbGciIHg9Ii0xLjAiIHk9Ii0xLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91MzVUZzBBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTM1VGcwQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lqMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91MzVUaEVBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iLTEuMCIgaGVpZ2h0PSItMS4wIi8+Ci0gICAgICAgIDwvY29udGFpbmVkPgotICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoTm9kZSIgeG1pOmlkPSJfdTRWX0lFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9JRUE2RWRxRnFJdTgtY2tvbGciPgotICAgICAgICAgIDxwcm9wZXJ0eSB4bWk6aWQ9Il91NFZfSVVBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0lVQTZFZHFGcUl1OC1ja29sZyIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIi8+Ci0gICAgICAgICAgPHBvc2l0aW9uIHhtaTppZD0iX3U0Vl9Ja0E2RWRxRnFJdTgtY2tvbGciIHg9IjEzMC4wIiB5PSIxLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfdTRmd0tVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLVUE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3U0ZndLRUE2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3U0ZndLRUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3S0VBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il91NGZ3S1VBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTRWX0kwQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9JMEE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUjBBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTRWX0pFQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0Vl9KVUE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfSlVBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRWX0prQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9Ka0E2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NFZfSjBBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMTYxLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NFZfS0VBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRWX0tFQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NFZfS1VBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0Vl9La0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NFZfS2tBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRWX0swQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0Vl9LMEE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NGZ3SUVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iMzEzLjAiLz4KLSAgICAgICAgICA8Y29udGFpbmVkIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkdyYXBoRWRnZSIgeG1pOmlkPSJfdTRmd0swQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndLMEE2RWRxRnFJdTgtY2tvbGciIGFuY2hvcj0iX3U0ZndLa0E2RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8YW5jaG9yYWdlIHhtaTppZD0iX3U0ZndLa0E2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3S2tBNkVkcUZxSXU4LWNrb2xnIiBncmFwaEVkZ2U9Il91NGZ3SzBBNkVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTRmd0lVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndJVUE2RWRxRnFJdTgtY2tvbGciIGVsZW1lbnQ9Il81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPHNpemUgeG1pOmlkPSJfdTRmd0lrQTZFZHFGcUl1OC1ja29sZyIgd2lkdGg9IjczLjAiIGhlaWdodD0iNjcuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPGNvbnRhaW5lZCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpHcmFwaE5vZGUiIHhtaTppZD0iX3U0ZndJMEE2RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il91NGZ3STBBNkVkcUZxSXU4LWNrb2xnIj4KLSAgICAgICAgICA8cHJvcGVydHkgeG1pOmlkPSJfdTRmd0pFQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3U0ZndKRUE2RWRxRnFJdTgtY2tvbGciIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiIvPgotICAgICAgICAgIDxwb3NpdGlvbiB4bWk6aWQ9Il91NGZ3SlVBNkVkcUZxSXU4LWNrb2xnIiB4PSIxMzAuMCIgeT0iNDczLjAiLz4KLSAgICAgICAgICA8c2VtYW50aWNNb2RlbCB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpVTUFTZW1hbnRpY01vZGVsQnJpZGdlIiB4bWk6aWQ9Il91NGZ3SmtBNkVkcUZxSXU4LWNrb2xnIiBndWlkPSJfdTRmd0prQTZFZHFGcUl1OC1ja29sZyIgZWxlbWVudD0iXzU2N1lSRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICAgICAgICA8c2l6ZSB4bWk6aWQ9Il91NGZ3SjBBNkVkcUZxSXU4LWNrb2xnIiB3aWR0aD0iNzMuMCIgaGVpZ2h0PSIxMTEuMCIvPgotICAgICAgICA8L2NvbnRhaW5lZD4KLSAgICAgICAgPHNlbWFudGljTW9kZWwgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VU1BU2VtYW50aWNNb2RlbEJyaWRnZSIgeG1pOmlkPSJfdTM1VGhVQTZFZHFGcUl1OC1ja29sZyIgZ3VpZD0iX3UzNVRoVUE2RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIiBlbGVtZW50PSJfNTY3WVEwQTVFZHFGcUl1OC1ja29sZyIvPgotICAgICAgPC9kaWFncmFtcz4KLSAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPGRpYWdyYW1zIHhtaTppZD0iXzU2eG5RVUE1RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il81NnhuUVVBNUVkcUZxSXU4LWNrb2xnIj4KLSAgICAgIDxzZW1hbnRpY01vZGVsIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlVNQVNlbWFudGljTW9kZWxCcmlkZ2UiIHhtaTppZD0iXzU2eG5Ra0E1RWRxRnFJdTgtY2tvbGciIGd1aWQ9Il81NnhuUWtBNUVkcUZxSXU4LWNrb2xnIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCIgZWxlbWVudD0iXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8L2RpYWdyYW1zPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiB4bWk6aWQ9Il81NjdZb2tBNUVkcUZxSXU4LWNrb2xnIiBuYW1lPSJDUCBCMSIgZ3VpZD0iXzU2N1lva0E1RWRxRnFJdTgtY2tvbGciIHByZXNlbnRhdGlvbk5hbWU9IkNQIEIxIiBicmVha2Rvd25FbGVtZW50cz0iXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii13eWJIS1VkbFhiREZHMEhPUGhBSjZRIiBocmVmPSJ1bWE6Ly8td3liSEtVZGxYYkRGRzBIT1BoQUo2USMtd3liSEtVZGxYYkRGRzBIT1BoQUo2USIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL2NvbnRlbnQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDczMjk5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxLjEvY29udGVudC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIG5hbWU9ImNhcFBhdF9CMS4xLF9JUGRaNFI4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItb0V1T2RlV0pjdEdmVE5ZVXo4MlpuZyIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9tb2RlbC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2YTYzMi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS4xL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0lUQ1NVQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9JVENTVUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9JVENTVVI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxLjEiIGd1aWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgeG1pOmlkPSJfSVBkWjRSODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxLjEiIGd1aWQ9Il9JUGRaNFI4MUVkcWdCSVR1SUNMSkV3IiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEuMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLW9FdU9kZVdKY3RHZlROWVV6ODJabmciIGhyZWY9InVtYTovLy1vRXVPZGVXSmN0R2ZUTllVejgyWm5nIy1vRXVPZGVXSmN0R2ZUTllVejgyWm5nIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4Y2FjOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY2FwYWJpbGl0eXBhdHRlcm5zL2NhcFBhdF9CMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIgbmFtZT0iY2FwUGF0X0IxLF9FNkV5Y1I4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItWDgzSzFvOWJzcGxOZTFfYV9LVTJGUSIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2NhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkyODc1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jYXBhYmlsaXR5cGF0dGVybnMvY2FwUGF0X0IxL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0U4bWlBQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9FOG1pQUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9FOHdUQUI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEiIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0X0IxIiBndWlkPSJfRTZFeWNCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgPHByb2Nlc3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIHhtaTppZD0iX0U2RXljUjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImNhcFBhdF9CMSIgZ3VpZD0iX0U2RXljUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImNhcFBhdF9CMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVg4M0sxbzlic3BsTmUxX2FfS1UyRlEiIGhyZWY9InVtYTovLy1YODNLMW85YnNwbE5lMV9hX0tVMkZRIy1YODNLMW85YnNwbE5lMV9hX0tVMkZRIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRlYTNhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS4xLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWXpjS2FUM0dZWlhSa1kzWk1yX21SZyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEsX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjE0OjQ0LjA3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQjEuMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQjEuMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJkZTM1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9jdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSxfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDU6NDAuNjQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkN1c3RvbSBDYXRlZ29yeSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5DdXN0b20gQ2F0ZWdvcnkgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2N1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxZjJhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBuYW1lPSJjdXN0b21fY2F0ZWdvcnlfQjIsXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjA2OjEyLjgxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DdXN0b20gQ2F0ZWdvcnkgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Q3VzdG9tIENhdGVnb3J5IEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9jb250ZW50LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvY29udGVudC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ODQzMzUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEuMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIiBuYW1lPSJkZWxQcm9jX0IxLjEsX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL21vZGVsLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY5MWEzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxLjEvbW9kZWwueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfVjNMTXdCODFFZHFnQklUdUlDTEpFdyIgZ3VpZD0iX1YzTE13QjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1YzTE13UjgxRWRxZ0JJVHVJQ0xKRXciIGlkPSItVkxBWFZocUVZMnRVNzBFU1padjdGZyIgdXJpPSJjb250ZW50LnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCB4bWk6aWQ9Il9WMFY3TUI4MUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkZWxQcm9jX0IxLjEiIGd1aWQ9Il9WMFY3TUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cHJvY2VzcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyeVByb2Nlc3MiIHhtaTppZD0iX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRlbFByb2NfQjEuMSIgZ3VpZD0iX1YwVjdNUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEuMSI+Ci0gICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVZMQVhWaHFFWTJ0VTcwRVNaWnY3RmciIGhyZWY9InVtYTovLy1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIy1WTEFYVmhxRVkydFU3MEVTWlp2N0ZnIi8+Ci0gICAgICA8ZGVmYXVsdENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICAgIDx2YWxpZENvbnRleHQgaHJlZj0idW1hOi8vX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEjX3JybUNJQkFkRWRxN0ZyY195TWhRLUEiLz4KLSAgICA8L3Byb2Nlc3M+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50PgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvY29udGVudC54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9jb250ZW50LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyNjE2ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9jb250ZW50LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3IiBuYW1lPSJkZWxQcm9jX0IxLF9SZnh1c1I4MUVkcWdCSVR1SUNMSkV3IiBndWlkPSItY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyIvPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvbW9kZWwueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RlbGl2ZXJ5cHJvY2Vzc2VzL2RlbFByb2NfQjEvbW9kZWwueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTcwZGZjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kZWxpdmVyeXByb2Nlc3Nlcy9kZWxQcm9jX0IxL21vZGVsLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX1JpS1VVQjgxRWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Il9SaUtVVUI4MUVkcWdCSVR1SUNMSkV3Ij4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SaUtVVVI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iLWNkUkNDQ0YxMVZoN1JJSWVKX2tmNHciIHVyaT0iY29udGVudC54bWkiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQgeG1pOmlkPSJfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY19CMSIgZ3VpZD0iX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgIDxwcm9jZXNzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJ5UHJvY2VzcyIgeG1pOmlkPSJfUmZ4dXNSODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY19CMSIgZ3VpZD0iX1JmeHVzUjgxRWRxZ0JJVHVJQ0xKRXciIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEiPgotICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1jZFJDQ0NGMTFWaDdSSUllSl9rZjR3IiBocmVmPSJ1bWE6Ly8tY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyMtY2RSQ0NDRjExVmg3UklJZUpfa2Y0dyIvPgotICAgICAgPGRlZmF1bHRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgICA8dmFsaWRDb250ZXh0IGhyZWY9InVtYTovL19xend5d0EtUEVkcUwyTzFQSlY5Y1pBI19ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIi8+Ci0gICAgPC9wcm9jZXNzPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudD4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lZ3JvdXBpbmdzL2Rpc2NpcGxpbmVfZ3JvdXBpbmdfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2MyYTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiIG5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQjEsX1NaTXhZQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii02cnZtM3V2enFJMHk4aC0xUHZWZjdBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjAwOjE5LjMxMi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EaXNjaXBsaW5lIEdyb3VwaW5nIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjY2OTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIiBuYW1lPSJkaXNjaXBsaW5lX0IxLF9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3IiBndWlkPSItRmVmSm1hQk1VblBGTFpoOUZTdV85ZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzowMDo1Ny43MTktMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGlzY2lwbGluZSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EaXNjaXBsaW5lIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA0YzE5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaEU1TlZQek1CY2Z2WFZPNHVsbzFyQSIgbmFtZT0iZGlzY2lwbGluZV9CMixfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDE6MzQuMjUwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERpc2NpcGxpbmUgQjIgbWFpbgotJmx0Oy9wJmd0OzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGlzY2lwbGluZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTk3NDhiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9kb21haW5zL2RvbWFpbl9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIG5hbWU9ImRvbWFpbl9CMSxfbWRyellCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MDI6MDQuNzgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkRvbWFpbiBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Eb21haW4gQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2RvbWFpbnMvZG9tYWluX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYWYxZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZG9tYWlucy9kb21haW5fQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiBuYW1lPSJkb21haW5fQjIsX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjAyOjM3Ljc1MC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Eb21haW4gQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RG9tYWluIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIxMWU2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgbmFtZT0iY2hlY2tsaXN0X0IxLF91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyNzoyMi42NTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q2hlY2tsaXN0IEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTEzYmQyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY2hlY2tsaXN0cy9jaGVja2xpc3RfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1XN3dESFZlSVFFRFA1OWU5RDQxS3V3IiBuYW1lPSJjaGVja2xpc3RfQjIsX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1XN3dESFZlSVFFRFA1OWU5RDQxS3V3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI4OjA0LjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5DaGVja2xpc3QgQjIgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzcyZDVlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEiIG5hbWU9ImNvbmNlcHRfQjEsX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1uLUhXWmlLZlhxOVJSUktlRk9CMFVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjE2OjAxLjczNC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Db25jZXB0IEIxIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1YmZmNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii02THBPZ2ljV1NodzJDZEJoVlpIcTB3IiBuYW1lPSJjb25jZXB0X0IyLF94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoxNjoyNy44MTItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Q29uY2VwdCBCMiBjb250ZXh0PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDk4MDQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiIG5hbWU9ImV4YW1wbGVfQjEsX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1iRC0yaUVHUmhkTDd1aGs5VmdZMWlRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjI4OjM3LjU3OC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5FeGFtcGxlIEIxIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MTM0YmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLU9ka1FON2d5VXpkYi1sVjVLSFFzOUEiIG5hbWU9Im5ld19leGFtcGxlX0IyLF96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjoyOToxOC4wOTQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RXhhbXBsZSBCMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjAyNWEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIG5hbWU9Imd1aWRlbGluZV9CMSxfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mzc6NTUuMTg4LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkd1aWRlbGluZSBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9ndWlkZWxpbmVzL2d1aWRlbGluZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhZWJmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgbmFtZT0iZ3VpZGVsaW5lX0IyLF8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0Njo1NC40MzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+R3VpZGVsaW5lIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS4xLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjJkZmY4Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IxLjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIG5hbWU9InByYWN0aWNlX0IxLjEsXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1nVnZCMFB4Uks3NU14b09kbTkzMF93IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQzOjQ4LjE3Mi0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBCMS4xIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGFkZGl0aW9uYWxJbmZvPlByYWN0aWNlIEIxLjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQjEuMSBwcm9iPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBCMS4xIGJhY2s8L2JhY2tncm91bmQ+Ci0gIDxnb2Fscz5QcmFjdGljZSBCMS4xIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQjEuMSBhcHA8L2FwcGxpY2F0aW9uPgotICA8bGV2ZWxzT2ZBZG9wdGlvbj5QcmFjdGljZSBCMS4xIGxldmVsPC9sZXZlbHNPZkFkb3B0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZDY2ZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiIG5hbWU9InByYWN0aWNlX0IxLF8xSS1uVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSIteU5zS3d3UDhCWmZzMTJQYlpBNUFlUSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0MjowMC4wNDctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UHJhY3RpY2UgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotICA8YWRkaXRpb25hbEluZm8+UHJhY3RpY2UgQjEgYWRkPC9hZGRpdGlvbmFsSW5mbz4KLSAgPHByb2JsZW0+UHJhY3RpY2UgQjEgcHJvYjwvcHJvYmxlbT4KLSAgPGJhY2tncm91bmQ+UHJhY3RpY2UgQjEgYmFjazwvYmFja2dyb3VuZD4KLSAgPGdvYWxzPlByYWN0aWNlIEIxIGdvYWw8L2dvYWxzPgotICA8YXBwbGljYXRpb24+UHJhY3RpY2UgQjEgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQjEgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcHJhY3RpY2VzL3ByYWN0aWNlX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYwYTAyMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSIgbmFtZT0icHJhY3RpY2VfQjIsXzRpMWZFQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQwOjUwLjczNC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5QcmFjdGljZSBCMiBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxhZGRpdGlvbmFsSW5mbz5QcmFjdGljZSBCMiBhZGQ8L2FkZGl0aW9uYWxJbmZvPgotICA8cHJvYmxlbT5QcmFjdGljZSBCMiBwcm9iPC9wcm9ibGVtPgotICA8YmFja2dyb3VuZD5QcmFjdGljZSBCMiBiYWNrPC9iYWNrZ3JvdW5kPgotICA8Z29hbHM+UHJhY3RpY2UgQjIgZ29hbDwvZ29hbHM+Ci0gIDxhcHBsaWNhdGlvbj5QcmFjdGljZSZhbXA7bmJzcDsgYXBwPC9hcHBsaWNhdGlvbj4KLSAgPGxldmVsc09mQWRvcHRpb24+UHJhY3RpY2UgQjIgbGV2ZWw8L2xldmVsc09mQWRvcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmNhZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIG5hbWU9InJlcG9ydF9CMSxfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6Mzg6MzguMzkxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJlcG9ydCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXBvcnRzL3JlcG9ydF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ4M2MzYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgbmFtZT0icmVwb3J0X0IyLF82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjozOTowNy42NTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+UmVwb3J0IEIyIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjA0NTMyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZV9wQkczZDkwOU5CME92bmZRb0o5QSIgbmFtZT0icmV1c2FibGVfYXNzZXRfQjEsXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjQ2OjE5LjI1MC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5SZXVzYWJsZSBBc3NldCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcmV1c2FibGVhc3NldHMvcmV1c2FibGVfYXNzZXRfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNGQzMmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIiBuYW1lPSJyZXVzYWJsZV9hc3NldF9CMixfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDA6MDAuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJldXNhYmxlIEFzc2V0IEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDBhMzYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9yb2FkbWFwcy9yb2FkbWFwX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgbmFtZT0icm9hZG1hcF9CMSxfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MzY6MDIuODEyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvYWRtYXAgQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTNiY2QzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciIG5hbWU9InJvYWRtYXBfQjIsXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii0zblE1SmdQSUUxSm16UW1USVpoS3RnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjM1OjM1LjcxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2FkbWFwIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3N1cHBvcnRpbmdtYXRlcmlhbHMvc3VwcG9ydGluZ19tYXRlcmlhbF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjEyZDAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxLF9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkPSItSkZpanktRTl2blo1UUpaSlQxQUEyQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNjo0NTozMS4yMzQtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+U3VwcG9ydGluZyBNYXRlcmlhbCBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTlkZTMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvc3VwcG9ydGluZ21hdGVyaWFscy9zdXBwb3J0aW5nX21hdGVyaWFsX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItaWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMixfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWlsYk5PYXE2MzV2SkdlYjZ1aENQVEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6NDQ6NTIuMTcyLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgQ29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3Jlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy9yZXNvdXJjZXMvVGVtcGxhdGUgZm9yIFBhc3RlIFRlc3QgQ2FzZXMuZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmE5MDcyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3Jlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNDcwYTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZWE2ZHczQmpfTmZwblRmbDBoXzdIQSIgbmFtZT0idGVtcGxhdGVfQjEsX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjM2OjUxLjI4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZW1wbGF0ZSBCMSBjb250ZW50PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVtcGxhdGVzL3RlbXBsYXRlX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4ZTMxMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3RlbXBsYXRlcy90ZW1wbGF0ZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpHdWlkYW5jZURlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiBuYW1lPSJ0ZW1wbGF0ZV9CMixfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLVRHaWpma0thbDQ4ZzA2cXRqSFZISmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjQ6NTQuNjQxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRlbXBsYXRlIEIyIGNvbnRlbnQ8L21haW5EZXNjcmlwdGlvbj4KLSAgPGF0dGFjaG1lbnRzPnJlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2M8L2F0dGFjaG1lbnRzPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3N2ZmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEsX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjIzOjU1LjQ4NC0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UZXJtIERlZmluaXRpb24gQjEgY29udGVudDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rlcm1kZWZpbml0aW9ucy90ZXJtX2RlZmluaXRpb25fQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJlNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXBTU3h0TU5QNWlzeG9tMUdlOVRCM2ciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMixfR0VTNDhCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLXBTU3h0TU5QNWlzeG9tMUdlOVRCM2ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjM6MTAuMzU5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRlcm0gRGVmaW5pdGlvbiBCMiBjb250ZW50Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmRlZjMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgbmFtZT0idG9vbG1lbnRvcl9CMSxfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MjA6MzQuNTMxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2xtZW50b3IgQjEgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZhZDZiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9ndWlkYW5jZXMvdG9vbG1lbnRvcnMvdG9vbG1lbnRvcl9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUJ2bkFmR1hEaWJjSk00ZF83cVdYUVEiIG5hbWU9InRvb2xtZW50b3JfQjIsX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGd1aWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE2OjE5OjQ0LjIwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sbWVudG9yIEIyIGNvbnRleHQ8L21haW5EZXNjcmlwdGlvbj4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAwZjkzNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgbmFtZT0id2hpdGVwYXBlcl9CMSxfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTk6MDcuMjgxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQjEgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL2d1aWRhbmNlcy93aGl0ZXBhcGVycy93aGl0ZXBhcGVyX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MTYxNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGFuY2VEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgbmFtZT0id2hpdGVwYXBlcl9CMixfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgZ3VpZD0iLWpJN05ud0dGRFMtekpXLWprcUpkTUEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTY6MTg6MzYuODkxLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldoaXRlcGFwZXIgQjIgY29udGV4dDwvbWFpbkRlc2NyaXB0aW9uPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRhbmNlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcGx1Z2luLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9wbHVnaW4ueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmIzM2Q5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9wbHVnaW4ueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX0pSNnhzQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Il9KUjZ4c0I4UEVkcXNoTU5TSTA3WE9nIj4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfRThtaUFCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX0U2RXljQjgxRWRxZ0JJVHVJQ0xKRXcjX0U4bWlBQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfSVRDU1VCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX0lQZFo0QjgxRWRxZ0JJVHVJQ0xKRXcjX0lUQ1NVQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfUmlLVVVCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JpS1VVQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfVjNMTXdCODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YzTE13QjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICA8c3ViTWFuYWdlcnMgeG1pOmlkPSJfNTl3Q3dFQTVFZHFGcUl1OC1ja29sZyIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU5d0N3RUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9KUjZ4c1I4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiIHVyaT0icm9sZXMvcm9sZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SWGNIVUI4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUZpZGVEMDFwVURVWE1YRXNWcnMzR1EiIHVyaT0icm9sZXMvcm9sZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9YV0dlSUI4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLWxZanI2Vml0TDFWbm5GTk83OFh1WXciIHVyaT0idGFza3MvdGFza19CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9aTWtRZ0I4UEVkcXNoTU5TSTA3WE9nIiBpZD0iLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciIHVyaT0idGFza3MvdGFza19CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fTFhFZ1I4bUVkcTFPby1Eb3dkcEJnIiBpZD0iLS11Z2l2ejExTDZMYmpPdnY1M3JfVGciIHVyaT0id29ya3Byb2R1Y3RzL2FydGlmYWN0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0tIdUVZQjhuRWRxMU9vLURvd2RwQmciIGlkPSItTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIgdXJpPSJ3b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfYUlVYU1COG5FZHExT28tRG93ZHBCZyIgaWQ9Ii1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIiB1cmk9Indvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9iV1o5OEI4bkVkcTFPby1Eb3dkcEJnIiBpZD0iLUhOWExIMUhnZG43MldYRzc3QUhHWkEiIHVyaT0id29ya3Byb2R1Y3RzL291dGNvbWVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfbnNVS3NCOG5FZHExT28tRG93ZHBCZyIgaWQ9Ii15YlRQdVZPNFJHd25fd1FsdkFXYWF3IiB1cmk9Indvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX1ZrNDEwQjhvRWRxMU9vLURvd2RwQmciIGlkPSItS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIgdXJpPSJ3b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfd0Z4ek1COHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1HYWktMHZDbnFCMFdnS2NrMWJtbnB3IiB1cmk9Imd1aWRhbmNlcy9jaGVja2xpc3RzL2NoZWNrbGlzdF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il93N0hmd0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIHVyaT0iZ3VpZGFuY2VzL2NoZWNrbGlzdHMvY2hlY2tsaXN0X0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3hvSHZzQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIgdXJpPSJndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il95UlpXTUI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTZMcE9naWNXU2h3MkNkQmhWWkhxMHciIHVyaT0iZ3VpZGFuY2VzL2NvbmNlcHRzL2NvbmNlcHRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfekJZb3NCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1iRC0yaUVHUmhkTDd1aGs5VmdZMWlRIiB1cmk9Imd1aWRhbmNlcy9leGFtcGxlcy9leGFtcGxlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3psY1lBQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIgdXJpPSJndWlkYW5jZXMvZXhhbXBsZXMvZXhhbXBsZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il8wUkdrSUI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTBpM0RMQ29hSTR4aFdfczM0THA3SnciIHVyaT0iZ3VpZGFuY2VzL2d1aWRlbGluZXMvZ3VpZGVsaW5lX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzFKbEVRQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItYXhLUkdMR3hidjNGRTJISG1FYnFkdyIgdXJpPSJndWlkYW5jZXMvZ3VpZGVsaW5lcy9ndWlkZWxpbmVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNGs3SndCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNGxFNndCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1nVnZCMFB4Uks3NU14b09kbTkzMF93IiB1cmk9Imd1aWRhbmNlcy9wcmFjdGljZXMvcHJhY3RpY2VfQjEuMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il81bGN5b0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLUR4bE10dktpdVZIdS1rdFoyVTJaVEEiIHVyaT0iZ3VpZGFuY2VzL3ByYWN0aWNlcy9wcmFjdGljZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82UG5KOEI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciIHVyaT0iZ3VpZGFuY2VzL3JlcG9ydHMvcmVwb3J0X0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzY4S3Q4QjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItdTVEYThMeGZRUmhINkxoNWN2X2JaQSIgdXJpPSJndWlkYW5jZXMvcmVwb3J0cy9yZXBvcnRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfN3h6OGdCOHJFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1lX3BCRzNkOTA5TkIwT3ZuZlFvSjlBIiB1cmk9Imd1aWRhbmNlcy9yZXVzYWJsZWFzc2V0cy9yZXVzYWJsZV9hc3NldF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il84aUdKOEI4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTBhMjNnLWFRaGNaclRIN3AycnR5QVEiIHVyaT0iZ3VpZGFuY2VzL3JldXNhYmxlYXNzZXRzL3JldXNhYmxlX2Fzc2V0X0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzlHYzBNQjhyRWRxUXZPalg4ZG9DQ3ciIGlkPSItZWFKWnJXZUZWYzRQRU1BOUt2MTBEQSIgdXJpPSJndWlkYW5jZXMvcm9hZG1hcHMvcm9hZG1hcF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9fYjZQc0I4ckVkcVF2T2pYOGRvQ0N3IiBpZD0iLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciIHVyaT0iZ3VpZGFuY2VzL3JvYWRtYXBzL3JvYWRtYXBfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQlBpd2dCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfQ19KczhCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIiB1cmk9Imd1aWRhbmNlcy9zdXBwb3J0aW5nbWF0ZXJpYWxzL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRF9yVjBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRXFjS0VCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiB1cmk9Imd1aWRhbmNlcy90ZW1wbGF0ZXMvdGVtcGxhdGVfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfR0ZDZjBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1kLTVRUmo3cUptem42MkNFLV9FNlVBIiB1cmk9Imd1aWRhbmNlcy90ZXJtZGVmaW5pdGlvbnMvdGVybV9kZWZpbml0aW9uX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0dwR1BJQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSItcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIgdXJpPSJndWlkYW5jZXMvdGVybWRlZmluaXRpb25zL3Rlcm1fZGVmaW5pdGlvbl9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9INVJka0I4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiIHVyaT0iZ3VpZGFuY2VzL3Rvb2xtZW50b3JzL3Rvb2xtZW50b3JfQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSXdzMDBCOHNFZHFRdk9qWDhkb0NDdyIgaWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiB1cmk9Imd1aWRhbmNlcy90b29sbWVudG9ycy90b29sbWVudG9yX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX0plbWNvQjhzRWRxUXZPalg4ZG9DQ3ciIGlkPSItNkNkbTRTOEJBNFVfVmE1TlVvWFlzdyIgdXJpPSJndWlkYW5jZXMvd2hpdGVwYXBlcnMvd2hpdGVwYXBlcl9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9laWFOb0I4c0VkcVF2T2pYOGRvQ0N3IiBpZD0iLWpJN05ud0dGRFMtekpXLWprcUpkTUEiIHVyaT0iZ3VpZGFuY2VzL3doaXRlcGFwZXJzL3doaXRlcGFwZXJfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfY1o5RW9COHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii02cnZtM3V2enFJMHk4aC0xUHZWZjdBIiB1cmk9ImRpc2NpcGxpbmVncm91cGluZ3MvZGlzY2lwbGluZV9ncm91cGluZ19CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9oLUdDb0I4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLUZlZkptYUJNVW5QRkxaaDlGU3VfOWciIHVyaT0iZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9tZC11VUI4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIHVyaT0iZGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9yYmhtWUI4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIHVyaT0iZG9tYWlucy9kb21haW5fQjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfdnVtbElCOHlFZHFnQklUdUlDTEpFdyIgaWQ9Ii1VamFWbzNveWxMdG1PYlcxZTI1dHR3IiB1cmk9ImRvbWFpbnMvZG9tYWluX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3lDM0d3Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItZmg4WG85SUlxMkZaeURkcDFlaWRvZyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3piT240Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgdXJpPSJ3b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzBONWE4Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItZnZzeVg2NVpzZUsyeDhCTmJMYnBsUSIgdXJpPSJyb2xlc2V0Z3JvdXBpbmdzL3JvbGVfc2V0X2dyb3VwaW5nX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzB1WVIwQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItWWxqRVlHQjRmUENFNUx2VDREYVB0QSIgdXJpPSJ0b29scy90b29sX0IxLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNGTEtFQjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItM18tQWF6enNfbDQzSE9PRzhEQXNZdyIgdXJpPSJ0b29scy90b29sX0IyLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzNzZzI0Qjh5RWRxZ0JJVHVJQ0xKRXciIGlkPSItV1BxaHhVcHg0dUc2V3lyNVVqZm9pZyIgdXJpPSJjdXN0b21jYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il80dFZhc0I4eUVkcWdCSVR1SUNMSkV3IiBpZD0iLThYZlBtdDU1SE5CVlV5X2ZXU3ZONVEiIHVyaT0iY3VzdG9tY2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZEhVUEFCODBFZHFnQklUdUlDTEpFdyIgaWQ9Ii1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIiB1cmk9ImN1c3RvbWNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxLjEueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfRTY5alFCODFFZHFnQklUdUlDTEpFdyIgaWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3IiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEvbW9kZWwueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfSVFOQXdCODFFZHFnQklUdUlDTEpFdyIgaWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3IiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9jYXBQYXRfQjEuMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9SZ2hWa0I4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS9tb2RlbC54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9WMHluSUI4MUVkcWdCSVR1SUNMSkV3IiBpZD0iX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciIHVyaT0iZGVsaXZlcnlwcm9jZXNzZXMvZGVsUHJvY19CMS4xL21vZGVsLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iXzBadXpVQjg1RWRxTnZlbHliRFhaRlEiIGlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgdXJpPSJyb2xlc2V0cy9yb2xlX3NldF9CMS54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il82UURHY0I4NUVkcU52ZWx5YkRYWkZRIiBpZD0iLWtIdTNINGVfOElrREUxSWFieTVxZ3ciIHVyaT0icm9sZXNldHMvcm9sZV9zZXRfQjIueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfNTltNDBFQTVFZHFGcUl1OC1ja29sZyIgaWQ9Il81NnhuUUVBNUVkcUZxSXU4LWNrb2xnIiB1cmk9ImNhcGFiaWxpdHlwYXR0ZXJucy9DUCUyMEIxL21vZGVsLnhtaSIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlcj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IlBsdWcgQiIgZ3VpZD0iX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHciIGJyaWVmRGVzY3JpcHRpb249IlBsdWcgQiBicmllZiIgYXV0aG9ycz0iUGx1ZyBCIGFydGh1ciI+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1d1JNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDb250ZW50IiBndWlkPSJfZWN5NXdSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXdoTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ2F0ZWdvcmllcyIgZ3VpZD0iX2VjeTV3aE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXd4TTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iRG9tYWlucyIgZ3VpZD0iX2VjeTV3eE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RG9tYWluIiB4bWk6aWQ9Il9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJkb21haW5fQjEiIGd1aWQ9Il9tZHJ6WUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgd29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWtGamt4b2dKNGpBT3otZ1dRUHNxTEEiIGhyZWY9InVtYTovLy1rRmpreG9nSjRqQU96LWdXUVBzcUxBIy1rRmpreG9nSjRqQU96LWdXUVBzcUxBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEb21haW4iIHhtaTppZD0iX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRvbWFpbl9CMiIgZ3VpZD0iX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItVWphVm8zb3lsTHRtT2JXMWUyNXR0dyIgaHJlZj0idW1hOi8vLVVqYVZvM295bEx0bU9iVzFlMjV0dHcjLVVqYVZvM295bEx0bU9iVzFlMjV0dHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXhCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9lY3k1eEJNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmVHcm91cGluZyIgeG1pOmlkPSJfU1pNeFlCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGlzY2lwbGluZV9ncm91cGluZ19CMSIgZ3VpZD0iX1NaTXhZQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgR3JvdXBpbmcgQjEgcHJlc2VudCIgZGlzY2lwbGluZXM9Il9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNnJ2bTN1dnpxSTB5OGgtMVB2VmY3QSIgaHJlZj0idW1hOi8vLTZydm0zdXZ6cUkweThoLTFQdlZmN0EjLTZydm0zdXZ6cUkweThoLTFQdlZmN0EiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRpc2NpcGxpbmUiIHhtaTppZD0iX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImRpc2NpcGxpbmVfQjEiIGd1aWQ9Il9jWTU3d0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB0YXNrcz0iX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GZWZKbWFCTVVuUEZMWmg5RlN1XzlnIiBocmVmPSJ1bWE6Ly8tRmVmSm1hQk1VblBGTFpoOUZTdV85ZyMtRmVmSm1hQk1VblBGTFpoOUZTdV85ZyIvPgotICAgICAgICAgICAgPHJlZmVyZW5jZVdvcmtmbG93cyBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGlzY2lwbGluZSIgeG1pOmlkPSJfaDlmbHNCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGlzY2lwbGluZV9CMiIgZ3VpZD0iX2g5ZmxzQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHRhc2tzPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWhFNU5WUHpNQmNmdlhWTzR1bG8xckEiIGhyZWY9InVtYTovLy1oRTVOVlB6TUJjZnZYVk80dWxvMXJBIy1oRTVOVlB6TUJjZnZYVk80dWxvMXJBIi8+Ci0gICAgICAgICAgICA8cmVmZXJlbmNlV29ya2Zsb3dzIGhyZWY9InVtYTovL19JUGRaNEI4MUVkcWdCSVR1SUNMSkV3I19JUGRaNFI4MUVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VjeTV4Uk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfZWN5NXhSTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0R3JvdXBpbmciIHhtaTppZD0iX3phVlFBQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxIiBndWlkPSJfemFWUUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEdyb3VwaW5nIEIxIHByZXNlbnQiIHJvbGVTZXRzPSJfdVBBV2NCODVFZHFOdmVseWJEWFpGUSI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiIGhyZWY9InVtYTovLy1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIy1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlU2V0IiB4bWk6aWQ9Il91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIiBuYW1lPSJyb2xlX3NldF9CMSIgZ3VpZD0iX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcm9sZXM9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgaHJlZj0idW1hOi8vLU5Md1pwVmU0M0EzcEV2MUwwbm13bUEjLU5Md1pwVmU0M0EzcEV2MUwwbm13bUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVTZXQiIHhtaTppZD0iXzBZX01jQjg1RWRxTnZlbHliRFhaRlEiIG5hbWU9InJvbGVfc2V0X0IyIiBndWlkPSJfMFlfTWNCODVFZHFOdmVseWJEWFpGUSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgU2V0IEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByb2xlcz0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1rSHUzSDRlXzhJa0RFMUlhYnk1cWd3IiBocmVmPSJ1bWE6Ly8ta0h1M0g0ZV84SWtERTFJYWJ5NXFndyMta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eGhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJXUCBUeXBlcyIgZ3VpZD0iX2VjeTV4aE0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3RUeXBlIiB4bWk6aWQ9Il94S3NJb0I4eUVkcWdCSVR1SUNMSkV3IiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSIgZ3VpZD0iX3hLc0lvQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgd29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciIGhyZWY9InVtYTovLy1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIy1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdFR5cGUiIHhtaTppZD0iX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0IyIiBndWlkPSJfeUNrTDBCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiB3b3JrUHJvZHVjdHM9Il9feUc3Y0I4bUVkcTFPby1Eb3dkcEJnIF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgaHJlZj0idW1hOi8vLUtvVW51MmJMX0ZfT18zMFNkNVBKOXcjLUtvVW51MmJMX0ZfT18zMFNkNVBKOXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXh4TTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9lY3k1eHhNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2wiIHhtaTppZD0iXzBOY3ZBQjh5RWRxZ0JJVHVJQ0xKRXciIG5hbWU9InRvb2xfQjEiIGd1aWQ9Il8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEIxIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3c2RTk4QjhyRWRxUXZPalg4ZG9DQ3cgX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfemtaUElCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il95UXpnVUI4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1ZbGpFWUdCNGZQQ0U1THZUNERhUHRBIiBocmVmPSJ1bWE6Ly8tWWxqRVlHQjRmUENFNUx2VDREYVB0QSMtWWxqRVlHQjRmUENFNUx2VDREYVB0QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbCIgeG1pOmlkPSJfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0idG9vbF9CMiIgZ3VpZD0iXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjIgcHJlc2VudGF0aW9uIiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM18tQWF6enNfbDQzSE9PRzhEQXNZdyIgaHJlZj0idW1hOi8vLTNfLUFhenpzX2w0M0hPT0c4REFzWXcjLTNfLUFhenpzX2w0M0hPT0c4REFzWXciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXlCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBndWlkPSJfZWN5NXlCTTNFZHFxbmRpLWdEdXhwdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZWN5NXlSTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgZ3VpZD0iX2VjeTV5Uk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1eWhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJIaWRkZW4iIGd1aWQ9Il9lY3k1eWhNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX2VjeTV5eE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkN1c3RvbSBDYXRlZ29yaWVzIiBndWlkPSJfZWN5NXl4TTNFZHFxbmRpLWdEdXhwdyIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iXzNFU1pRQjh5RWRxZ0JJVHVJQ0xKRXcgXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxIiBndWlkPSJfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVdQcWh4VXB4NHVHNld5cjVVamZvaWciIGhyZWY9InVtYTovLy1XUHFoeFVweDR1RzZXeXI1VWpmb2lnIy1XUHFoeFVweDR1RzZXeXI1VWpmb2lnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgaHJlZj0iI19YZlRkb0I4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrIiBocmVmPSIjX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIGhyZWY9IiNfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIGhyZWY9IiNfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGUiIGhyZWY9IiNfWkhmMllCOG5FZHExT28tRG93ZHBCZyIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6T3V0Y29tZSIgaHJlZj0iI19jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIi8+Ci0gICAgICAgICAgICA8Y2F0ZWdvcml6ZWRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDYXBhYmlsaXR5UGF0dGVybiIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjXzRzQ3RzVHpnRWRxNXlzRk9OcjFCR1EiLz4KLSAgICAgICAgICAgIDxjYXRlZ29yaXplZEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNhcGFiaWxpdHlQYXR0ZXJuIiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIvPgotICAgICAgICAgICAgPGNhdGVnb3JpemVkRWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2FwYWJpbGl0eVBhdHRlcm4iIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NjdZb2tBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IyIiBndWlkPSJfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjIgcHJlc2VudCIgY2F0ZWdvcml6ZWRFbGVtZW50cz0iX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cgX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmcgX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii04WGZQbXQ1NUhOQlZVeV9mV1N2TjVRIiBocmVmPSJ1bWE6Ly8tOFhmUG10NTVITkJWVXlfZldTdk41USMtOFhmUG10NTVITkJWVXlfZldTdk41USIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIHhtaTppZD0iX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMS4xIiBndWlkPSJfWGZUZG9CODBFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxLjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBCMS4xIHByZXNlbnRhdGlvbiI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVl6Y0thVDNHWVpYUmtZM1pNcl9tUmciIGhyZWY9InVtYTovLy1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIy1ZemNLYVQzR1laWFJrWTNaTXJfbVJnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1ekJNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIgbmFtZT0iY29udGVudF9wYWNrYWdlX0IxIiBndWlkPSJfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uIFBhayBCMSBicmllZiI+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlIiB4bWk6aWQ9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBuYW1lPSJyb2xlX0IxIiBndWlkPSJfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVzcG9uc2libGVGb3I9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIF9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIj4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItRmMydVlYQV80N3M3dFJUQm1tS1F2USIgaHJlZj0idW1hOi8vLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEjLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGUiIHhtaTppZD0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG5hbWU9InJvbGVfQjIiIGd1aWQ9Il9LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByZXNwb25zaWJsZUZvcj0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX25xRldFQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1GaWRlRDAxcFVEVVhNWEVzVnJzM0dRIiBocmVmPSJ1bWE6Ly8tRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSMtRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0idGFza19CMSIgZ3VpZD0iX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHBlcmZvcm1lZEJ5PSJfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgbWFuZGF0b3J5SW5wdXQ9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBvdXRwdXQ9Il9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIiBhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG9wdGlvbmFsSW5wdXQ9Il9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1sWWpyNlZpdEwxVm5uRk5PNzhYdVl3IiBocmVmPSJ1bWE6Ly8tbFlqcjZWaXRMMVZubkZOTzc4WHVZdyMtbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGFzayIgeG1pOmlkPSJfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0idGFza19CMiIgZ3VpZD0iX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBwZXJmb3JtZWRCeT0iX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2ciIG1hbmRhdG9yeUlucHV0PSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgb3V0cHV0PSJfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk9Il9BOURZZ0I4UEVkcXNoTU5TSTA3WE9nIiBvcHRpb25hbElucHV0PSJfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItSjN6MElHZmplaGl0MHVGYlRKY2E3ZyIgaHJlZj0idW1hOi8vLUozejBJR2ZqZWhpdDB1RmJUSmNhN2cjLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciLz4KLSAgICAgICAgICAgIDx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50IHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2siIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI183TThuc0EtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdCIgeG1pOmlkPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyIgbmFtZT0iYXJ0aWZhY3RfQjEiIGd1aWQ9Il9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3VyTGRjQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIHJlcG9ydHM9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiB0ZW1wbGF0ZXM9Il9DOTBRTUI4c0VkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0tdWdpdnoxMUw2TGJqT3Z2NTNyX1RnIiBocmVmPSJ1bWE6Ly8tLXVnaXZ6MTFMNkxiak92djUzcl9UZyMtLXVnaXZ6MTFMNkxiak92djUzcl9UZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3QiIHhtaTppZD0iX195RzdjQjhtRWRxMU9vLURvd2RwQmciIG5hbWU9ImFydGlmYWN0X0IyIiBndWlkPSJfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHN1cHBvcnRpbmdNYXRlcmlhbHM9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBjb25jZXB0c0FuZFBhcGVycz0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGNoZWNrbGlzdHM9Il93RXVxVUI4ckVkcVF2T2pYOGRvQ0N3IiBndWlkZWxpbmVzPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgZXhhbXBsZXM9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBhc3NldHM9Il83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiByZXBvcnRzPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgdGVtcGxhdGVzPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgdG9vbE1lbnRvcnM9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItTWplZWVkX3BfTVF5Z3JXN0RCa0FyZyIgaHJlZj0idW1hOi8vLU1qZWVlZF9wX01ReWdyVzdEQmtBcmcjLU1qZWVlZF9wX01ReWdyVzdEQmtBcmciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlIiB4bWk6aWQ9Il9aSGYyWUI4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgZ3VpZD0iX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgZGVsaXZlcmVkV29ya1Byb2R1Y3RzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWd1Zng0UmFGd2hpVWhoQmtvcTN2WmciIGhyZWY9InVtYTovLy1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIy1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJvdXRjb21lX0IyIiBndWlkPSJfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfQk41eHdCOHNFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IF9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfekFvYXdCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfSDRPVXNCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUhOWExIMUhnZG43MldYRzc3QUhHWkEiIGhyZWY9InVtYTovLy1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIy1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpPdXRjb21lIiB4bWk6aWQ9Il9jWFhyc0I4bkVkcTFPby1Eb3dkcEJnIiBuYW1lPSJvdXRjb21lX0IxIiBndWlkPSJfY1hYcnNCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBzdXBwb3J0aW5nTWF0ZXJpYWxzPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgY29uY2VwdHNBbmRQYXBlcnM9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IF9JdkQyRUI4c0VkcVF2T2pYOGRvQ0N3IiBjaGVja2xpc3RzPSJfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgZ3VpZGVsaW5lcz0iX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGV4YW1wbGVzPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYXNzZXRzPSJfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyIgcmVwb3J0cz0iXzVramF3QjhyRWRxUXZPalg4ZG9DQ3ciIHRlbXBsYXRlcz0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIHRvb2xNZW50b3JzPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIGhyZWY9InVtYTovLy15YlRQdVZPNFJHd25fd1FsdkFXYWF3Iy15YlRQdVZPNFJHd25fd1FsdkFXYWF3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZSIgeG1pOmlkPSJfbnFGV0VCOG5FZHExT28tRG93ZHBCZyIgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGd1aWQ9Il9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgc3VwcG9ydGluZ01hdGVyaWFscz0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGNvbmNlcHRzQW5kUGFwZXJzPSJfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyBfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgY2hlY2tsaXN0cz0iX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3ciIGd1aWRlbGluZXM9Il8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBleGFtcGxlcz0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIGFzc2V0cz0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIHJlcG9ydHM9Il82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiB0ZW1wbGF0ZXM9Il9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiB0b29sTWVudG9ycz0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIGRlbGl2ZXJlZFdvcmtQcm9kdWN0cz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1LeE5zRndnOWNONC0xczViczN4WklnIiBocmVmPSJ1bWE6Ly8tS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyMtS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q2hlY2tsaXN0IiB4bWk6aWQ9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJjaGVja2xpc3RfQjEiIGd1aWQ9Il91ckxkY0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQjEiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItR2FpLTB2Q25xQjBXZ0tjazFibW5wdyIgaHJlZj0idW1hOi8vLUdhaS0wdkNucUIwV2dLY2sxYm1ucHcjLUdhaS0wdkNucUIwV2dLY2sxYm1ucHciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNoZWNrbGlzdCIgeG1pOmlkPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iY2hlY2tsaXN0X0IyIiBndWlkPSJfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLVc3d0RIVmVJUUVEUDU5ZTlENDFLdXciIGhyZWY9InVtYTovLy1XN3dESFZlSVFFRFA1OWU5RDQxS3V3Iy1XN3dESFZlSVFFRFA1OWU5RDQxS3V3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb25jZXB0IiB4bWk6aWQ9Il93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJjb25jZXB0X0IxIiBndWlkPSJfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItbi1IV1ppS2ZYcTlSUlJLZUZPQjBVQSIgaHJlZj0idW1hOi8vLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEjLW4tSFdaaUtmWHE5UlJSS2VGT0IwVUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbmNlcHQiIHhtaTppZD0iX3huRk40QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImNvbmNlcHRfQjIiIGd1aWQ9Il94bkZONEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii02THBPZ2ljV1NodzJDZEJoVlpIcTB3IiBocmVmPSJ1bWE6Ly8tNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyMtNkxwT2dpY1dTaHcyQ2RCaFZaSHEwdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6RXhhbXBsZSIgeG1pOmlkPSJfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iZXhhbXBsZV9CMSIgZ3VpZD0iX3lRemdVQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgcmllZiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItYkQtMmlFR1JoZEw3dWhrOVZnWTFpUSIgaHJlZj0idW1hOi8vLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEjLWJELTJpRUdSaGRMN3VoazlWZ1kxaVEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkV4YW1wbGUiIHhtaTppZD0iX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9ImV4YW1wbGVfQjIiIGd1aWQ9Il96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1PZGtRTjdneVV6ZGItbFY1S0hRczlBIiBocmVmPSJ1bWE6Ly8tT2RrUU43Z3lVemRiLWxWNUtIUXM5QSMtT2RrUU43Z3lVemRiLWxWNUtIUXM5QSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6R3VpZGVsaW5lIiB4bWk6aWQ9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJndWlkZWxpbmVfQjEiIGd1aWQ9Il96a1pQSUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9Ikd1aWRlbGluZSBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItMGkzRExDb2FJNHhoV19zMzRMcDdKdyIgaHJlZj0idW1hOi8vLTBpM0RMQ29hSTR4aFdfczM0THA3SncjLTBpM0RMQ29hSTR4aFdfczM0THA3SnciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkd1aWRlbGluZSIgeG1pOmlkPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0iZ3VpZGVsaW5lX0IyIiBndWlkPSJfMFFndVFCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQjIiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1heEtSR0xHeGJ2M0ZFMkhIbUVicWR3IiBocmVmPSJ1bWE6Ly8tYXhLUkdMR3hidjNGRTJISG1FYnFkdyMtYXhLUkdMR3hidjNGRTJISG1FYnFkdyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJhY3RpY2UiIHhtaTppZD0iXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InByYWN0aWNlX0IxIiBndWlkPSJfMUktblVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxIHByZXNlbnQiIGNvbnRlbnRSZWZlcmVuY2VzPSJfbXFKM0FCOFBFZHFzaE1OU0kwN1hPZyBfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyBfY1k1N3dCOHlFZHFnQklUdUlDTEpFdyBfbWRyellCOHlFZHFnQklUdUlDTEpFdyBfdVBBV2NCODVFZHFOdmVseWJEWFpGUSBfME5jdkFCOHlFZHFnQklUdUlDTEpFdyBfeEtzSW9COHlFZHFnQklUdUlDTEpFdyBfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyBfdzZFOThCOHJFZHFRdk9qWDhkb0NDdyBfWkhmMllCOG5FZHExT28tRG93ZHBCZyBfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyBfemtaUElCOHJFZHFRdk9qWDhkb0NDdyBfY1hYcnNCOG5FZHExT28tRG93ZHBCZyBfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyBfNWtqYXdCOHJFZHFRdk9qWDhkb0NDdyBfNjdrNEVCOHJFZHFRdk9qWDhkb0NDdyBfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyBfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyBfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyBfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyBfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyBfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyBfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyBfWGZUZG9CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXlOc0t3d1A4QlpmczEyUGJaQTVBZVEiIGhyZWY9InVtYTovLy15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIy15TnNLd3dQOEJaZnMxMlBiWkE1QWVRIi8+Ci0gICAgICAgICAgICA8c3ViUHJhY3RpY2VzIHhtaTppZD0iXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InByYWN0aWNlX0IxLjEiIGd1aWQ9Il8ydk0tUUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMS4xIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBCMS4xIHByZXNlbnQiPgotICAgICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWdWdkIwUHhSSzc1TXhvT2RtOTMwX3ciIGhyZWY9InVtYTovLy1nVnZCMFB4Uks3NU14b09kbTkzMF93Iy1nVnZCMFB4Uks3NU14b09kbTkzMF93Ii8+Ci0gICAgICAgICAgICA8L3N1YlByYWN0aWNlcz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByYWN0aWNlIiB4bWk6aWQ9Il80aTFmRUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJwcmFjdGljZV9CMiIgZ3VpZD0iXzRpMWZFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJQcmFjdGljZSBCMiBwcmVzZW50IiBjb250ZW50UmVmZXJlbmNlcz0iX195RzdjQjhtRWRxMU9vLURvd2RwQmcgX3dFdXFVQjhyRWRxUXZPalg4ZG9DQ3cgX3huRk40QjhyRWRxUXZPalg4ZG9DQ3cgX25xRldFQjhuRWRxMU9vLURvd2RwQmcgX3pBb2F3QjhyRWRxUXZPalg4ZG9DQ3cgXzBRZ3VRQjhyRWRxUXZPalg4ZG9DQ3cgX2FzRk9rQjhuRWRxMU9vLURvd2RwQmcgXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3cgXzJ2TS1RQjhyRWRxUXZPalg4ZG9DQ3cgXzZPdVpJQjhyRWRxUXZPalg4ZG9DQ3cgXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3cgXy1nd1BBQjhyRWRxUXZPalg4ZG9DQ3cgX0tDTV9JQjhQRWRxc2hNTlNJMDdYT2cgX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3cgX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cgX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3cgX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3cgX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3cgXzNzRXlBQjh5RWRxZ0JJVHVJQ0xKRXcgX2g5ZmxzQjh5RWRxZ0JJVHVJQ0xKRXcgX3Jhb09nQjh5RWRxZ0JJVHVJQ0xKRXcgXzBZX01jQjg1RWRxTnZlbHliRFhaRlEgXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXcgX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1EeGxNdHZLaXVWSHUta3RaMlUyWlRBIiBocmVmPSJ1bWE6Ly8tRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSMtRHhsTXR2S2l1Vkh1LWt0WjJVMlpUQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UmVwb3J0IiB4bWk6aWQ9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyZXBvcnRfQjEiIGd1aWQ9Il81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItNmlNT1hLamhQVE1xcGFnNTRiUTN3dyIgaHJlZj0idW1hOi8vLTZpTU9YS2poUFRNcXBhZzU0YlEzd3cjLTZpTU9YS2poUFRNcXBhZzU0YlEzd3ciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJlcG9ydCIgeG1pOmlkPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icmVwb3J0X0IyIiBndWlkPSJfNk91WklCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQjIgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLXU1RGE4THhmUVJoSDZMaDVjdl9iWkEiIGhyZWY9InVtYTovLy11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIy11NURhOEx4ZlFSaEg2TGg1Y3ZfYlpBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSZXVzYWJsZUFzc2V0IiB4bWk6aWQ9Il82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyZXVzYWJsZV9hc3NldF9CMSIgZ3VpZD0iXzY3azRFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEIxIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZV9wQkczZDkwOU5CME92bmZRb0o5QSIgaHJlZj0idW1hOi8vLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEjLWVfcEJHM2Q5MDlOQjBPdm5mUW9KOUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlJldXNhYmxlQXNzZXQiIHhtaTppZD0iXzd4T0dvQjhyRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyIiBndWlkPSJfN3hPR29COHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii0wYTIzZy1hUWhjWnJUSDdwMnJ0eUFRIiBocmVmPSJ1bWE6Ly8tMGEyM2ctYVFoY1pyVEg3cDJydHlBUSMtMGEyM2ctYVFoY1pyVEg3cDJydHlBUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Um9hZG1hcCIgeG1pOmlkPSJfOGhXakVCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0icm9hZG1hcF9CMSIgZ3VpZD0iXzhoV2pFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLWVhSlpyV2VGVmM0UEVNQTlLdjEwREEiIGhyZWY9InVtYTovLy1lYUpacldlRlZjNFBFTUE5S3YxMERBIy1lYUpacldlRlZjNFBFTUE5S3YxMERBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpSb2FkbWFwIiB4bWk6aWQ9Il8tZ3dQQUI4ckVkcVF2T2pYOGRvQ0N3IiBuYW1lPSJyb2FkbWFwX0IyIiBndWlkPSJfLWd3UEFCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBCMiBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItM25RNUpnUElFMUptelFtVElaaEt0ZyIgaHJlZj0idW1hOi8vLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGcjLTNuUTVKZ1BJRTFKbXpRbVRJWmhLdGciLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlN1cHBvcnRpbmdNYXRlcmlhbCIgeG1pOmlkPSJfX2JLbzBCOHJFZHFRdk9qWDhkb0NDdyIgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9CMSIgZ3VpZD0iX19iS28wQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLUpGaWp5LUU5dm5aNVFKWkpUMUFBMkEiIGhyZWY9InVtYTovLy1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIy1KRmlqeS1FOXZuWjVRSlpKVDFBQTJBIi8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpTdXBwb3J0aW5nTWF0ZXJpYWwiIHhtaTppZD0iX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiIGd1aWQ9Il9CTjV4d0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1pbGJOT2FxNjM1dkpHZWI2dWhDUFRBIiBocmVmPSJ1bWE6Ly8taWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSMtaWxiTk9hcTYzNXZKR2ViNnVoQ1BUQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlbXBsYXRlX0IxIiBndWlkPSJfQzkwUU1COHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIxIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1lYTZkdzNCal9OZnBuVGZsMGhfN0hBIiBocmVmPSJ1bWE6Ly8tZWE2ZHczQmpfTmZwblRmbDBoXzdIQSMtZWE2ZHczQmpfTmZwblRmbDBoXzdIQSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVtcGxhdGUiIHhtaTppZD0iX0QteDk4QjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlbXBsYXRlX0IyIiBndWlkPSJfRC14OThCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjIgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1UR2lqZmtLYWw0OGcwNnF0akhWSEpnIiBocmVmPSJ1bWE6Ly8tVEdpamZrS2FsNDhnMDZxdGpIVkhKZyMtVEdpamZrS2FsNDhnMDZxdGpIVkhKZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VGVybURlZmluaXRpb24iIHhtaTppZD0iX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMSIgZ3VpZD0iX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItZC01UVJqN3FKbXpuNjJDRS1fRTZVQSIgaHJlZj0idW1hOi8vLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEjLWQtNVFSajdxSm16bjYyQ0UtX0U2VUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRlcm1EZWZpbml0aW9uIiB4bWk6aWQ9Il9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjIiIGd1aWQ9Il9HRVM0OEI4c0VkcVF2T2pYOGRvQ0N3IiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQjIgYnJpZWYiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1wU1N4dE1OUDVpc3hvbTFHZTlUQjNnIiBocmVmPSJ1bWE6Ly8tcFNTeHRNTlA1aXN4b20xR2U5VEIzZyMtcFNTeHRNTlA1aXN4b20xR2U5VEIzZyIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6VG9vbE1lbnRvciIgeG1pOmlkPSJfR29EdFVCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0idG9vbG1lbnRvcl9CMSIgZ3VpZD0iX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50byBCMSBicmllZiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbG1lbnRvciBCMSBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSIteWkwbzlna1VVTjA2ek5jQ2Y5dFdKQSIgaHJlZj0idW1hOi8vLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEjLXlpMG85Z2tVVU4wNnpOY0NmOXRXSkEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlRvb2xNZW50b3IiIHhtaTppZD0iX0g0T1VzQjhzRWRxUXZPalg4ZG9DQ3ciIG5hbWU9InRvb2xtZW50b3JfQjIiIGd1aWQ9Il9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIyIGJyaWVmIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEIyIHByZXNlbnQiPgotICAgICAgICAgICAgPHByZXNlbnRhdGlvbiB4bWk6aWQ9Ii1Cdm5BZkdYRGliY0pNNGRfN3FXWFFRIiBocmVmPSJ1bWE6Ly8tQnZuQWZHWERpYmNKTTRkXzdxV1hRUSMtQnZuQWZHWERpYmNKTTRkXzdxV1hRUSIvPgotICAgICAgICAgIDwvY29udGVudEVsZW1lbnRzPgotICAgICAgICAgIDxjb250ZW50RWxlbWVudHMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6V2hpdGVwYXBlciIgeG1pOmlkPSJfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgbmFtZT0id2hpdGVwYXBlcl9CMSIgZ3VpZD0iX0l2RDJFQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjEgYnJpZWYiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQjEgcHJlc2VudCI+Ci0gICAgICAgICAgICA8cHJlc2VudGF0aW9uIHhtaTppZD0iLTZDZG00UzhCQTRVX1ZhNU5Vb1hZc3ciIGhyZWY9InVtYTovLy02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3Iy02Q2RtNFM4QkE0VV9WYTVOVW9YWXN3Ii8+Ci0gICAgICAgICAgPC9jb250ZW50RWxlbWVudHM+Ci0gICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpXaGl0ZXBhcGVyIiB4bWk6aWQ9Il9KZHRFd0I4c0VkcVF2T2pYOGRvQ0N3IiBuYW1lPSJ3aGl0ZXBhcGVyX0IyIiBndWlkPSJfSmR0RXdCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMiBwcmVzZW50Ij4KLSAgICAgICAgICAgIDxwcmVzZW50YXRpb24geG1pOmlkPSItakk3Tm53R0ZEUy16SlctamtxSmRNQSIgaHJlZj0idW1hOi8vLWpJN05ud0dGRFMtekpXLWprcUpkTUEjLWpJN05ud0dGRFMtekpXLWprcUpkTUEiLz4KLSAgICAgICAgICA8L2NvbnRlbnRFbGVtZW50cz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgZ3VpZD0iX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfNl91cE1CODBFZHFnQklUdUlDTEpFdyIgbmFtZT0iY2FwUGF0UGFrX0IxIiBndWlkPSJfNl91cE1CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX19VNVNvQjgwRWRxZ0JJVHVJQ0xKRXciIG5hbWU9ImNhcFBhdFBha19CMS4xIiBndWlkPSJfX1U1U29CODBFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9JUGRaNEI4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9FNkV5Y0I4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIHhtaTppZD0iXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGciIGhyZWY9InVtYTovL181NnhuUUVBNUVkcUZxSXU4LWNrb2xnI181NnhuUUVBNUVkcUZxSXU4LWNrb2xnIi8+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VjeTV6aE0zRWRxcW5kaS1nRHV4cHciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfZWN5NXpoTTNFZHFxbmRpLWdEdXhwdyI+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfTDZKaThCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY1Bha19CMSIgZ3VpZD0iX0w2Smk4QjgxRWRxZ0JJVHVJQ0xKRXciPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfTjBmSXNCODFFZHFnQklUdUlDTEpFdyIgbmFtZT0iZGVsUHJvY1Bha19CMS4xIiBndWlkPSJfTjBmSXNCODFFZHFnQklUdUlDTEpFdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgeG1pOmlkPSJfVjBWN01CODFFZHFnQklUdUlDTEpFdyIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiB4bWk6aWQ9Il9SZnh1c0I4MUVkcWdCSVR1SUNMSkV3IiBocmVmPSJ1bWE6Ly9fUmZ4dXNCODFFZHFnQklUdUlDTEpFdyNfUmZ4dXNCODFFZHFnQklUdUlDTEpFdyIvPgotICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lY3k1enhNM0VkcXFuZGktZ0R1eHB3IiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgZ3VpZD0iX2VjeTV6eE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgICA8YmFzZXMgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbj4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IxLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM3MTIxZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXMvcm9sZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUZjMnVZWEFfNDdzN3RSVEJtbUtRdlEiIG5hbWU9InJvbGVfQjEsX0E5RFlnQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Ii1GYzJ1WVhBXzQ3czd0UlRCbW1LUXZRIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDEyOjQ3OjIzLjE0MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPHNraWxscz5Sb2xlIEIxIHNraWxsPC9za2lsbHM+Ci0gIDxhc3NpZ25tZW50QXBwcm9hY2hlcz5Sb2xlIEIxIGFzc2lnbjwvYXNzaWdubWVudEFwcHJvYWNoZXM+Ci0gIDxzeW5vbnltcz5Sb2xlIEIxIHN5bjwvc3lub255bXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Um9sZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzL3JvbGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2E5MjhhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlcy9yb2xlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlJvbGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItRmlkZUQwMXBVRFVYTVhFc1ZyczNHUSIgbmFtZT0icm9sZV9CMixfS0NNX0lCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLUZpZGVEMDFwVURVWE1YRXNWcnMzR1EiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NDg6MjEuNzM0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Um9sZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8c2tpbGxzPlJvbGUgQjIgc2tpbGw8L3NraWxscz4KLSAgPGFzc2lnbm1lbnRBcHByb2FjaGVzPlJvbGUgQjIgYXNzPC9hc3NpZ25tZW50QXBwcm9hY2hlcz4KLSAgPHN5bm9ueW1zPlJvbGUgQjIgc3luPC9zeW5vbnltcz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpSb2xlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldGdyb3VwaW5ncy9yb2xlX3NldF9ncm91cGluZ19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWIzYjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRncm91cGluZ3Mvcm9sZV9zZXRfZ3JvdXBpbmdfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1mdnN5WDY1WnNlSzJ4OEJOYkxicGxRIiBuYW1lPSJyb2xlX3NldF9ncm91cGluZ19CMSxfemFWUUFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWZ2c3lYNjVac2VLMng4Qk5iTGJwbFEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTY6MjUuNTAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlJvbGUgU2V0IEdyb3VwaW5nIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlJvbGUgU2V0IEdyb3VwaW5nIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDU0MTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3JvbGVzZXRzL3JvbGVfc2V0X0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItTkx3WnBWZTQzQTNwRXYxTDBubXdtQSIgbmFtZT0icm9sZV9zZXRfQjEsX3VQQVdjQjg1RWRxTnZlbHliRFhaRlEiIGd1aWQ9Ii1OTHdacFZlNDNBM3BFdjFMMG5td21BIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjUzOjA3LjM3NS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Sb2xlIFNldCBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Sb2xlIFNldCBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvcm9sZXNldHMvcm9sZV9zZXRfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdjYWMzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi9yb2xlc2V0cy9yb2xlX3NldF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLWtIdTNINGVfOElrREUxSWFieTVxZ3ciIG5hbWU9InJvbGVfc2V0X0IyLF8wWV9NY0I4NUVkcU52ZWx5YkRYWkZRIiBndWlkPSIta0h1M0g0ZV84SWtERTFJYWJ5NXFndyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNzo1Mzo0My41NDctMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBTZXQgQjIgbWFpbgotJmx0Oy9wJmd0OzwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+Jmx0O3AmZ3Q7Ci0gICAgUm9sZSBTZXQgQjIga2V5Ci0mbHQ7L3AmZ3Q7PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdGFza3MvdGFza19CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjU0NWMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlRhc2tEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItbFlqcjZWaXRMMVZubkZOTzc4WHVZdyIgbmFtZT0idGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZyIgZ3VpZD0iLWxZanI2Vml0TDFWbm5GTk83OFh1WXciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTI6NTA6NDcuMjAzLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFRhc2sgQjEgbWFpbiAmYW1wO2FtcDsgXCBcXCAmcXVvdDsgJyAlICZhbXA7Z3Q7ICZhbXA7bHQ7Ci0mbHQ7L3AmZ3Q7PC9tYWluRGVzY3JpcHRpb24+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIxLjEiIGd1aWQ9Il9UNEFxQUI4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPnVwPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9UNThqc0I4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIxLjIiIGd1aWQ9Il9UNThqc0I4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIERvd24KLSZsdDsvcCZndDs8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX1Q4VkpVQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjEuMyIgZ3VpZD0iX1Q4VkpVQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+T3Zlcjwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEIxIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQjEgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rhc2tzL3Rhc2tfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGEwOWFmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90YXNrcy90YXNrX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpUYXNrRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUozejBJR2ZqZWhpdDB1RmJUSmNhN2ciIG5hbWU9InRhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2ciIGd1aWQ9Ii1KM3owSUdmamVoaXQwdUZiVEpjYTdnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDEyOjUwOjA3LjcwMy0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5UYXNrIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjIuMSIgZ3VpZD0iX29xWXN3Qjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+RWluPC9zZWN0aW9uRGVzY3JpcHRpb24+Ci0gIDwvc2VjdGlvbnM+Ci0gIDxzZWN0aW9ucyB4bWk6aWQ9Il9xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIiBuYW1lPSJTdGVwIEIyLjIiIGd1aWQ9Il9xdVFwQUI4NEVkcU52ZWx5YkRYWkZRIj4KLSAgICA8c2VjdGlvbkRlc2NyaXB0aW9uPiZsdDtwJmd0OwotICAgIFp3ZWkKLSZsdDsvcCZndDs8L3NlY3Rpb25EZXNjcmlwdGlvbj4KLSAgPC9zZWN0aW9ucz4KLSAgPHNlY3Rpb25zIHhtaTppZD0iX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiIG5hbWU9IlN0ZXAgQjIuMyIgZ3VpZD0iX3F5dTVVQjg0RWRxTnZlbHliRFhaRlEiPgotICAgIDxzZWN0aW9uRGVzY3JpcHRpb24+Jmx0O3AmZ3Q7Ci0gICAgRHJlaQotJmx0Oy9wJmd0Ozwvc2VjdGlvbkRlc2NyaXB0aW9uPgotICA8L3NlY3Rpb25zPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VGFzayBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8cHVycG9zZT5UYXNrIEIyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8YWx0ZXJuYXRpdmVzPlRhc2sgQjIgYWx0PC9hbHRlcm5hdGl2ZXM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6VGFza0Rlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3Rvb2xzL3Rvb2xfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDZjNzk1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItWWxqRVlHQjRmUENFNUx2VDREYVB0QSIgbmFtZT0idG9vbF9CMSxfME5jdkFCOHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLVlsakVZR0I0ZlBDRTVMdlQ0RGFQdEEiIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTU6MjkuMDAwLTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPlRvb2wgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+VG9vbCBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi90b29scy90b29sX0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3NDFhNS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvdG9vbHMvdG9vbF9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLTNfLUFhenpzX2w0M0hPT0c4REFzWXciIG5hbWU9InRvb2xfQjIsXzE3SHh3Qjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii0zXy1BYXp6c19sNDNIT09HOERBc1l3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjE1OjU4LjcxOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Ub29sIEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPlRvb2wgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2EzMDU1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvYXJ0aWZhY3RfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkFydGlmYWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLS11Z2l2ejExTDZMYmpPdnY1M3JfVGciIG5hbWU9ImFydGlmYWN0X0IxLF9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBndWlkPSItLXVnaXZ6MTFMNkxiak92djUzcl9UZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTozNzo0MC4wNzgtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+QXJ0aWZhY3QgQjEgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+QXJ0aWZhY3QgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+QXJ0aWZhY3QgQjEgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5BcnRpZmFjdCBCMSBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkFydGlmYWN0IEIxIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5BcnRpZmFjdCBCMSByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8YnJpZWZPdXRsaW5lPkFydGlmYWN0IEIxIG91dGxpbmU8L2JyaWVmT3V0bGluZT4KLSAgPHJlcHJlc2VudGF0aW9uT3B0aW9ucz5BcnRpZmFjdCBCMSByZXA8L3JlcHJlc2VudGF0aW9uT3B0aW9ucz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9hcnRpZmFjdF9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IyLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwYjNkYi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2FydGlmYWN0X0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpBcnRpZmFjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1NamVlZWRfcF9NUXlnclc3REJrQXJnIiBuYW1lPSJhcnRpZmFjdF9CMixfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgZ3VpZD0iLU1qZWVlZF9wX01ReWdyVzdEQmtBcmciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTU6Mzk6MDQuOTY5LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPkFydGlmYWN0IEIyIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPkFydGlmYWN0IEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPkFydGlmYWN0IEIyIHVuaXF1ZSBJRDwvZXh0ZXJuYWxJZD4KLSAgPHB1cnBvc2U+QXJ0aWZhY3QgQjIgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5BcnRpZmFjdCBCMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+QXJ0aWZhY3QgQjIgcmVhc29uPC9yZWFzb25zRm9yTm90TmVlZGluZz4KLSAgPGJyaWVmT3V0bGluZT5BcnRpZmFjdCBCMiBvdXRsaW5lPC9icmllZk91dGxpbmU+Ci0gIDxyZXByZXNlbnRhdGlvbk9wdGlvbnM+QXJ0aWZhY3QgQjIgcmVwPC9yZXByZXNlbnRhdGlvbk9wdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6QXJ0aWZhY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjEueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWI1ZGUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9kZWxpdmVyYWJsZV9CMS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6RGVsaXZlcmFibGVEZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItZ3VmeDRSYUZ3aGlVaGhCa29xM3ZaZyIgbmFtZT0iZGVsaXZlcmFibGVfQjEsX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii1ndWZ4NFJhRndoaVVoaEJrb3EzdlpnIiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQyOjE0Ljc4MS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBCMSBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5EZWxpdmVyYWJsZSBCMSBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotICA8ZXh0ZXJuYWxJZD5EZWxpdmVyYWJsZSBCMSB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPkRlbGl2ZXJhYmxlIEIxIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+RGVsaXZlcmFibGUgQjEgaW1wYWN0PC9pbXBhY3RPZk5vdEhhdmluZz4KLSAgPHJlYXNvbnNGb3JOb3ROZWVkaW5nPkRlbGl2ZXJhYmxlIEIxIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci0gIDxleHRlcm5hbERlc2NyaXB0aW9uPkRlbGl2ZXJhYmxlIEIxIGV4dGVybjwvZXh0ZXJuYWxEZXNjcmlwdGlvbj4KLSAgPHBhY2thZ2luZ0d1aWRhbmNlPkRlbGl2ZXJhYmxlIEIxIHBhY2s8L3BhY2thZ2luZ0d1aWRhbmNlPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL2RlbGl2ZXJhYmxlX0IyLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBkYjQyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvZGVsaXZlcmFibGVfQjIueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkRlbGl2ZXJhYmxlRGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLUt4TnNGd2c5Y040LTFzNWJzM3haSWciIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9ucUZXRUI4bkVkcTFPby1Eb3dkcEJnIiBndWlkPSItS3hOc0Z3ZzljTjQtMXM1YnMzeFpJZyIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTo0MzozMC41NjItMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+RGVsaXZlcmFibGUgQjIgbWFpbjwvbWFpbkRlc2NyaXB0aW9uPgotICA8a2V5Q29uc2lkZXJhdGlvbnM+RGVsaXZlcmFibGUgQjIga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+RGVsaXZlcmFibGUgQjIgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5EZWxpdmVyYWJsZSBCMiBwb3Jwb2lzZTwvcHVycG9zZT4KLSAgPGltcGFjdE9mTm90SGF2aW5nPkRlbGl2ZXJhYmxlIEIyIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5EZWxpdmVyYWJsZSBCMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotICA8ZXh0ZXJuYWxEZXNjcmlwdGlvbj5EZWxpdmVyYWJsZSBCMiBleHRlcm48L2V4dGVybmFsRGVzY3JpcHRpb24+Ci0gIDxwYWNrYWdpbmdHdWlkYW5jZT5EZWxpdmVyYWJsZSBCMiBwYWNrPC9wYWNrYWdpbmdHdWlkYW5jZT4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpEZWxpdmVyYWJsZURlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTU2MTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0cy9vdXRjb21lX0IxLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iLXliVFB1Vk80Ukd3bl93UWx2QVdhYXciIG5hbWU9Im91dGNvbWVfQjEsX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIGd1aWQ9Ii15YlRQdVZPNFJHd25fd1FsdkFXYWF3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE1OjQ3OjM4LjEwOS0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5PdXRjb21lIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPk91dGNvbWUgQjEga2V5PC9rZXlDb25zaWRlcmF0aW9ucz4KLSAgPGV4dGVybmFsSWQ+T3V0Y29tZSBCMSB1bmlxdWUgSUQ8L2V4dGVybmFsSWQ+Ci0gIDxwdXJwb3NlPk91dGNvbWUgQjEgcG9ycG9pc2U8L3B1cnBvc2U+Ci0gIDxpbXBhY3RPZk5vdEhhdmluZz5PdXRjb21lIEIxIGltcGFjdDwvaW1wYWN0T2ZOb3RIYXZpbmc+Ci0gIDxyZWFzb25zRm9yTm90TmVlZGluZz5PdXRjb21lIEIxIHJlYXNvbjwvcmVhc29uc0Zvck5vdE5lZWRpbmc+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6V29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3RzL291dGNvbWVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmFkNDZmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHMvb3V0Y29tZV9CMi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08b3JnLmVjbGlwc2UuZXBmLnVtYTpXb3JrUHJvZHVjdERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1ITlhMSDFIZ2RuNzJXWEc3N0FIR1pBIiBuYW1lPSJvdXRjb21lX0IyLF9hc0ZPa0I4bkVkcTFPby1Eb3dkcEJnIiBndWlkPSItSE5YTEgxSGdkbjcyV1hHNzdBSEdaQSIgY2hhbmdlRGF0ZT0iMjAwNS0wOS0wNlQxNTo0NjowMS4xNTYtMDcwMCI+Ci0gIDxtYWluRGVzY3JpcHRpb24+T3V0Y29tZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5PdXRjb21lIEIyIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci0gIDxleHRlcm5hbElkPk91dGNvbWUgQjIgdW5pcXVlIElEPC9leHRlcm5hbElkPgotICA8cHVycG9zZT5PdXRjb21lIEIyIHBvcnBvaXNlPC9wdXJwb3NlPgotICA8aW1wYWN0T2ZOb3RIYXZpbmc+T3V0Y29tZSBCMiBpbXBhY3Q8L2ltcGFjdE9mTm90SGF2aW5nPgotICA8cmVhc29uc0Zvck5vdE5lZWRpbmc+T3V0Y29tZSBCMiByZWFzb248L3JlYXNvbnNGb3JOb3ROZWVkaW5nPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOldvcmtQcm9kdWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9QbHVnIEIvd29ya3Byb2R1Y3R0eXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMTY2MzYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjEueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6ZXBmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZiIgZXBmOnZlcnNpb249IjEuMi4wIiB4bWk6aWQ9Ii1maDhYbzlJSXEyRlp5RGRwMWVpZG9nIiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9CMSxfeEtzSW9COHlFZHFnQklUdUlDTEpFdyIgZ3VpZD0iLWZoOFhvOUlJcTJGWnlEZHAxZWlkb2ciIGNoYW5nZURhdGU9IjIwMDUtMDktMDZUMTc6MTc6MjguNDg0LTA3MDAiPgotICA8bWFpbkRlc2NyaXB0aW9uPldvcmsgUHJvZHVjdCBUeXBlIEIxIG1haW48L21haW5EZXNjcmlwdGlvbj4KLSAgPGtleUNvbnNpZGVyYXRpb25zPldvcmsgUHJvZHVjdCBUeXBlIEIxIGtleTwva2V5Q29uc2lkZXJhdGlvbnM+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvUGx1ZyBCL3dvcmtwcm9kdWN0dHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQjIueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY1YmQxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL1BsdWcgQi93b3JrcHJvZHVjdHR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IyLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSItS29VbnUyYkxfRl9PXzMwU2Q1UEo5dyIgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIsX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIGd1aWQ9Ii1Lb1VudTJiTF9GX09fMzBTZDVQSjl3IiBjaGFuZ2VEYXRlPSIyMDA1LTA5LTA2VDE3OjA0OjU1Ljc2Ni0wNzAwIj4KLSAgPG1haW5EZXNjcmlwdGlvbj5Xb3JrIFByb2R1Y3QgVHlwZSBCMiBtYWluPC9tYWluRGVzY3JpcHRpb24+Ci0gIDxrZXlDb25zaWRlcmF0aW9ucz5Xb3JrIFByb2R1Y3QgVHlwZSBCMiBrZXk8L2tleUNvbnNpZGVyYXRpb25zPgotPC9vcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnREZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBBLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBBLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3MmRjZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9Db25maWcgQS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfcnJtQ0lCQWRFZHE3RnJjX3lNaFEtQSIgbmFtZT0iQ29uZmlnIEEiIGd1aWQ9Il9ycm1DSUJBZEVkcTdGcmNfeU1oUS1BIiBicmllZkRlc2NyaXB0aW9uPSJDb25maWcgQSBkZXNjcmlwdGlvbiI+Ci0gIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24gaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxMQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSVEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfemlfendBLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxMUS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19UUWJuSUEtV0VkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfRGFIa2dEemlFZHE1eXNGT05yMUJHUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzRzQ3RzRHpnRWRxNXlzRk9OcjFCR1EjX0VGVnJ3RHppRWRxNXlzRk9OcjFCR1EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL180c0N0c0R6Z0VkcTV5c0ZPTnIxQkdRI19FNzNySUR6aUVkcTV5c0ZPTnIxQkdRIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fNHNDdHNEemdFZHE1eXNGT05yMUJHUSNfQlM2Z0VEemxFZHE1eXNGT05yMUJHUSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fWnRaYk1FREZFZHFPOU0zZnVrWUFfQSNfWnRaYk1FREZFZHFPOU0zZnVrWUFfQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX1p0WmJNRURGRWRxTzlNM2Z1a1lBX0EjX2xDN3dFRURGRWRxTzlNM2Z1a1lBX0EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19adFpiTUVERkVkcU85TTNmdWtZQV9BI19kWERkOEVEUEVkcXJoc1poM1FOQU1RIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NDb21wb25lbnQiIGhyZWY9InVtYTovL19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnI19kQmh2a0VBdkVkcUZxSXU4LWNrb2xnIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZEJodmtFQXZFZHFGcUl1OC1ja29sZyNfZVpTendFQXZFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fYUhVU1FCQk5FZHFCczdLaGRWTFJMQSNfYUhVU1FCQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2FIVVNRQkJORWRxQnM3S2hkVkxSTEEjX0VXMDlNRDBLRWRxakFJNzdESHZCd0EiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMTGctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfalVOZm9CQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyNfdXE1SzhCTTFFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fVzZhNGNCQk5FZHFCczdLaGRWTFJMQSNfVzZhNGNCQk5FZHFCczdLaGRWTFJMQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d1JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182X3VwTUI4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX1U1U29CODBFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1emhNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTDZKaThCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX04wZklzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSnctUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTElnLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxKZy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSkEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEtRLVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxLZy1QRWRxTDJPMVBKVjljWkEiLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI195VWVMSlEtUEVkcUwyTzFQSlY5Y1pBIi8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfeVVlTEl3LVBFZHFMMk8xUEpWOWNaQSIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV4aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d2hNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXhCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV4eE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d3hNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXlSTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV5aE0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1eFJNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxwcm9jZXNzVmlld3MgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q3VzdG9tQ2F0ZWdvcnkiIGhyZWY9InVtYTovL195VWVMSUEtUEVkcUwyTzFQSlY5Y1pBI19NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIi8+Ci08L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBCLnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2NvbmZpZ3VyYXRpb25zL0NvbmZpZyBCLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZlN2I1Ny4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9Db25maWcgQi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuNC91bWEuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCIgeG1pOmlkPSJfVUxxQklCTTNFZHFxbmRpLWdEdXhwdyIgbmFtZT0iQ29uZmlnIEIiIGd1aWQ9Il9VTHFCSUJNM0VkcXFuZGktZ0R1eHB3Ij4KLSAgPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Qk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1d1JNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfNW5yR1lCOE9FZHFzaE1OU0kwN1hPZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX2VjeTV6Uk0zRWRxcW5kaS1nRHV4cHciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I182X3VwTUI4MEVkcWdCSVR1SUNMSkV3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfX1U1U29CODBFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fSVBkWjRCODFFZHFnQklUdUlDTEpFdyNfSVBkWjRCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fRTZFeWNCODFFZHFnQklUdUlDTEpFdyNfRTZFeWNCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzQ29tcG9uZW50IiBocmVmPSJ1bWE6Ly9fNTZ4blFFQTVFZHFGcUl1OC1ja29sZyNfNTZ4blFFQTVFZHFGcUl1OC1ja29sZyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vXzU2eG5RRUE1RWRxRnFJdTgtY2tvbGcjXzU2N1lRRUE1RWRxRnFJdTgtY2tvbGciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIGhyZWY9InVtYTovL19lY3k1d0JNM0VkcXFuZGktZ0R1eHB3I19lY3k1emhNM0VkcXFuZGktZ0R1eHB3Ii8+Ci0gIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfTDZKaThCODFFZHFnQklUdUlDTEpFdyIvPgotICA8bWV0aG9kUGFja2FnZVNlbGVjdGlvbiB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjX04wZklzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXcjX1YwVjdNQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24geHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc0NvbXBvbmVudCIgaHJlZj0idW1hOi8vX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXcjX1JmeHVzQjgxRWRxZ0JJVHVJQ0xKRXciLz4KLSAgPHByb2Nlc3NWaWV3cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgaHJlZj0idW1hOi8vX2VjeTV3Qk0zRWRxcW5kaS1nRHV4cHcjXzNFU1pRQjh5RWRxZ0JJVHVJQ0xKRXciLz4KLTwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9FeHBvcnRJbXBvcnQvUGFyaXMvY29uZmlndXJhdGlvbnMvcHJvY19GYW1pbHlfQS54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9wcm9jX0ZhbWlseV9BLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwYjliMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9jb25maWd1cmF0aW9ucy9wcm9jX0ZhbWlseV9BLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NGYW1pbHkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjQvdW1hLmVjb3JlIiB4bWxuczplcGY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmIiBlcGY6dmVyc2lvbj0iMS4yLjAiIHhtaTppZD0iX1lVaUFBQjgxRWRxZ0JJVHVJQ0xKRXciIG5hbWU9InByb2NfRmFtaWx5X0EiIGd1aWQ9Il9ZVWlBQUI4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSJwcm9jX0ZhbWlseV9BIGRlc2NyaXB0aW9uIi8+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL0V4cG9ydEltcG9ydC9QYXJpcy9saWJyYXJ5LnhtaSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2xpYnJhcnkueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRjYjExLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvRXhwb3J0SW1wb3J0L1BhcmlzL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC40L3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHhtbG5zOmVwZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYiIGVwZjp2ZXJzaW9uPSIxLjIuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfcXp3eXdRLVBFZHFMMk8xUEpWOWNaQSIgZ3VpZD0iX3F6d3l3US1QRWRxTDJPMVBKVjljWkEiPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il82bEsyQUEtUEVkcUwyTzFQSlY5Y1pBIiBocmVmPSJ1bWE6Ly9feVVlTElBLVBFZHFMMk8xUEpWOWNaQSNfNmxLMkFBLVBFZHFMMk8xUEpWOWNaQSIvPgotICAgIDxzdWJNYW5hZ2VycyB4bWk6aWQ9Il9KUjZ4c0I4UEVkcXNoTU5TSTA3WE9nIiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfSlI2eHNCOFBFZHFzaE1OU0kwN1hPZyIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX3F6d3l3Zy1QRWRxTDJPMVBKVjljWkEiIGlkPSJfcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSIgdXJpPSIiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il95VW44SUEtUEVkcUwyTzFQSlY5Y1pBIiBpZD0iX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiIHVyaT0iUGx1ZyUyMEEvcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VkUGxzQk0zRWRxcW5kaS1nRHV4cHciIGlkPSJfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIgdXJpPSJQbHVnJTIwQi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX3F6d3l3QS1QRWRxTDJPMVBKVjljWkEiIG5hbWU9IlBhcmlzIiBndWlkPSJfcXp3eXdBLVBFZHFMMk8xUEpWOWNaQSI+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfeVVlTElBLVBFZHFMMk8xUEpWOWNaQSIgaHJlZj0idW1hOi8vX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEjX3lVZUxJQS1QRWRxTDJPMVBKVjljWkEiLz4KLSAgICA8bWV0aG9kUGx1Z2lucyB4bWk6aWQ9Il9lY3k1d0JNM0VkcXFuZGktZ0R1eHB3IiBocmVmPSJ1bWE6Ly9fZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyNfZWN5NXdCTTNFZHFxbmRpLWdEdXhwdyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kTGlicmFyeT4KLTwveG1pOlhNST4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy8xc3RUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMjljOGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iLi4vRXhwb3J0SW1wb3J0L1BhcmlzIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iUGFyaXMiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEV4cG9ydFBsdWdpbnMgZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0ZWQwMDEiPgotCTwvRXhwb3J0UGx1Z2lucz4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iQmFzZV8xIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxJbXBvcnRQbHVnaW5zIGltcG9ydEZvbGRlck5hbWU9IkV4cG9ydGVkMDAxIj4KLQk8L0ltcG9ydFBsdWdpbnM+Ci0JCi0JPE91dHB1dExpYnJhcnkgZGlzYWJsZT0idHJ1ZSIgLz4KLQkKLQk8T3V0cHV0UGx1Z2luIHBhdGg9IlBsdWcgQSIgcmVjdXJzaXZlPSJmYWxzZSI+Ci0JPC9PdXRwdXRQbHVnaW4+Ci0JCi0JPE91dHB1dENvbmZpZ3VyYXRpb24gcGF0aD0iQ29uZmlnIEEiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0Q29uZmlndXJhdGlvbj4KLQkKLQk8T3V0cHV0TWV0aG9kRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0TWV0aG9kRWxlbWVudD4KLQotCTxPdXRwdXRNZXRob2RFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIiByZWN1cnNpdmU9InRydWUiPgotCTwvT3V0cHV0TWV0aG9kRWxlbWVudD4KLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC54bWwgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvMXN0VGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMGMzMDUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzLzFzdFRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODY2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IG5hbWU9IkJhc2VfMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08TWV0aG9kUGx1Z2luIG5hbWU9IlBsdWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEb21haW5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEb21haW4gbmFtZT0iZG9tYWluX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0ExLF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxOToxNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEb21haW4gQTEgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTxEb21haW4gbmFtZT0ic3ViX2RvbWFpbl9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1Eb21haW4gQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0Njo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLURvbWFpbiBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItRG9tYWluIEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L0RvbWFpbj4KLTwvRG9tYWluPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTIiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEb21haW4gQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExLF9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0MjozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQTEsX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ1OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L3Rhc2tzPgotPC9EaXNjaXBsaW5lPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDQ6MTQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExLF9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0OTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iTW9uIEF1ZyAyMiAxMDo0NzoyMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEExMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0EyLF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MDo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJXUCBUeXBlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSxfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMzoxNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvV29ya1Byb2R1Y3RUeXBlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJUb29scyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFRvb2wgbmFtZT0idG9vbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9BMSxfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NTI6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08VG9vbCBuYW1lPSJ0b29sX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9TdGFuZGFyZENhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJIaWRkZW4iIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExLF9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MzoxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEvZGVsUHJvY1Bha19BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDE6MjYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29yZUNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25QYWsgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIE9jdCAxOCAxNjowNDoxMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHNraWxscz0iUm9sZSBBMSBza2lsbHMiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEExIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQTEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxSb2xlIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjMyOjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEEyIGtleSIgc2tpbGxzPSJSb2xlIEEyIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTIgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFRhc2sgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyODozOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSBrZXkiIHB1cnBvc2U9IlRhc2sgQTEgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEExIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJhbHBoYSI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJiZXRhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImdhbW1hIj4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08VGFzayBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICggZXh0ZW5kZWQgYnkgVGFzayBBMyApIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRhc2sgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiBwdXJwb3NlPSJUYXNrIEEyIHB1cnBvc2UiIGFsdGVybmF0aXZlcz0iVGFzayBBMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBwdXQgeW91ciByaWdodCBmb290IGluJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0icHV0IHlvdXIgcmlnaHQgZm9vdCBvdXQiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRG8gdGhlIGhva2V5LXBva2V5Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExIHgsXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgU2VwIDA3IDE0OjUyOjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMSB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEExIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMSByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjA0OjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEga2V5IiBleHRlcm5hbElkPSJTdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWUiIHB1cnBvc2U9IlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMS4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExLjEgcmVhc29uIiBicmllZk91dGxpbmU9IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IlN1Yl9BcnRpZmFjdCBBMS4xIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08Y29udGFpbmVyQXJ0aWZhY3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgQXVnIDE3IDE5OjQxOjI0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMiB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEEyIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTIgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMi4xIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMi4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIuMSxfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDQ6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEEyLjEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMi4xIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIuMSBwdXJwb3NlIiBpbXBhY3RPZk5vdEhhdmluZz0iQXJ0aWZhY3QgQTIuMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMi4xIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEEyLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRhaW5lckFydGlmYWN0PgotPC9BcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08RGVsaXZlcmFibGUgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDoyOTo1OSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbGl2ZXJhYmxlIEExIGtleSIgZXh0ZXJuYWxJZD0iRGVsaXZlcmFibGUgQTEgdW5pcXVlIiBwdXJwb3NlPSJEZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkRlbGl2ZXJhYmxlIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkRlbGl2ZXJhYmxlIEExIHJlYXNvbiIgZXh0ZXJuYWxEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgZXh0ZXJuIiBwYWNrYWdpbmdHdWlkYW5jZT0iRGVsaXZlcmFibGUgQTEgcGtnIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMiB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEEyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTImYW1wO25ic3A7aW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMiBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiBPdXRjb21lIEExICIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEExIHVuaXF1ZSIgcHVycG9zZT0iT3V0Y29tZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBBMSByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTEsX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMSBwcmVzZW50IiBzaGFwZWljb249ImZpbGU6L0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL3RyYW4tbHV1L0lCTS9NZXRob2RMaWJyYXJpZXMvcGFyaXMvUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNvbmNlcHRfQTEsX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIENvbmNlcHQgQTEgY29udGVudCYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHR5cGU6JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFR5cGUmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQ6IENvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgd2l0aCB1c2VyIHRleHQ6JmFtcDtuYnNwOyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhVc2VyVGV4dCZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NvbmNlcHQ+Ci08RXhhbXBsZSBuYW1lPSJleGFtcGxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJleGFtcGxlX0ExLF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEExIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLjEsXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMS4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMS4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMS4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMS4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTEuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9wcmFjdGljZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9BMS9zdWJfZG9tYWluX0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQTEsX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJvYWRtYXAgbmFtZT0icm9hZG1hcF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUm9hZG1hcD4KLTxTdXBwb3J0aW5nTWF0ZXJpYWwgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSxfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvU3VwcG9ydGluZ01hdGVyaWFsPgotPFRlbXBsYXRlIG5hbWU9InRlbXBsYXRlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08R3VpZGFuY2VEZXNjcmlwdGlvbiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGF0dGFjaG1lbnRzPSIiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTEsX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0ExLF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTIsX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMixfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyLF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0EyLF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTIsX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMiBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMiBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEEyIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMi4xLF9Kcmd3d0EtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyLjEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTIuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEEyLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0EyLF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6NDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjEyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGFzayBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0FTQ0lJJnF1b3Q7PyZndDsgJmx0O2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiB4bWk6dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsgeG1sbnM6eG1pPSZxdW90O2h0dHA6Ly93d3cub21nLm9yZy9YTUkmcXVvdDsgeG1sbnM6Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbD0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUmcXVvdDsmZ3Q7ICAgJmx0O29yZGVySW5mb3MgbmFtZT0mcXVvdDtzZWN0aW9ucyZxdW90OyB0aW1lc3RhbXA9JnF1b3Q7MTEyOTc0NzI2NDEwOSZxdW90OyZndDsgICAgICZsdDtnVUlEcyZndDtfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O191bXlnWUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190bmRib0JCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAmbHQ7L29yZGVySW5mb3MmZ3Q7ICZsdDsvY29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uJmd0OyAiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSIsX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI3OjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBUYXNrIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogVGFzayBBMyIgcHVycG9zZT0icHVycG9zZTogVGFzayBBMyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IFRhc2sgQTMiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4xIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMiI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjMiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4yIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3N0ZXBzPgotPC9UYXNrPgotPFJvbGUgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0ibmV3X3JvbGUsXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBSb2xlIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBSb2xlIEEzIiBza2lsbHM9InNraWxsczogUm9sZSBBMyIgYXNzaWdubWVudEFwcHJvYWNoZXM9ImFzc2lnbm1lbnQ6IFJvbGUgQTMiIHN5bm9ueW1zPSJzeW5vbnltbnMgOiBSb2xlIEEzIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTMiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPC9Sb2xlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJjYXBQYXRQYWtfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUGhhc2UxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9InRydWUiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX1Rhc2tBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEsX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXlzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAga2V5MSxrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2U6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayBsaW5rZWQgdG8gdGFza0EyIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgJmx0O3Rib2R5Jmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDEmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICAyJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgNCYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA1JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy90Ym9keSZndDsmIzEzOyYjMTA7Jmx0Oy90YWJsZSZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvVGFzaz4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjMSIgYnJpZWZEZXNjcmlwdGlvbj0icm9sZURlc2MxIGxpbmtlZCB0byByb2xlQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjMSIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlRGVzYzEsX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0O3VzYWdlIGZvciByb2xlQTEmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZURlc2MxIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzIgbGlua2VkIHRvIHJvbGVBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMixfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbiBmb3Igcm9sZUEyIiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJ0aGlzIHdwIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzEsX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwRGVzYzEiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwRGVzYzEiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOiB3cERlc2MxJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMiIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ3cERlc2MyLF9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTp3cGRlc2MyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp3cGRlc2MyIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwZGVzYzIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfWHNYcTBEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkOiB3cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIDogcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6dGFzayB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MsXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OnRhc2sgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIHdpdGggbm8gbGlua3MmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3Rpdml0eTIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3Rpdml0eTIsX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIFdvcmtmbG93IERldGFpbDomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgUHJvdmlkZXMgdGhlIG5hdHVyYWwgJmx0O2ImZ3Q7dHJhbnNpdGlvbiBmcm9tIGFuYWx5c2lzJmx0Oy9iJmd0OyBhY3Rpdml0aWVzICZsdDtiJmd0O3RvIGRlc2lnbiZsdDsvYiZndDsgYWN0aXZpdGllcywgaWRlbnRpZnlpbmc6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIGVsZW1lbnRzIGZyb20gYW5hbHlzaXMgZWxlbWVudHMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIG1lY2hhbmlzbXMgZnJvbSByZWxhdGVkIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSZhcG9zO3MgJmx0O2ImZ3Q7cnVuLXRpbWUgYW5kIGRlcGxveW1lbnQgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtPcmdhbml6ZXMgdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsJmx0Oy9iJmd0OyBzbyBhcyB0byBtYWtlIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBzZWFtbGVzcyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtNYWludGFpbnMgdGhlIGNvbnNpc3RlbmN5IGFuZCBpbnRlZ3JpdHkgb2YgdGhlIGFyY2hpdGVjdHVyZSZsdDsvYiZndDssIGVuc3VyaW5nIHRoYXQ6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbmV3IGRlc2lnbiBlbGVtZW50cyBpZGVudGlmaWVkIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gYXJlIGludGVncmF0ZWQgd2l0aCBwcmUtZXhpc3RpbmcgZGVzaWduIGVsZW1lbnRzLiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBtYXhpbWFsIHJlLXVzZSBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBhbmQgZGVzaWduIGVsZW1lbnRzIGlzIGFjaGlldmVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBkZXNpZ24mIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGVmZm9ydC4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NCYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk1JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTYmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcykuIFRoZSBpbml0aWFsIGZvY3VzIHdpbGwgYmUgb24gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24sezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mJiMxMzsmIzEwOyAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2luY29ycG9yYXRlX2Rlc2lnbl9lbGVtZW50cyx7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3JiMxMzsmIzEwOyAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9ydW50aW1lX2FyY2hpdGVjdHVyZSx7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0mcXVvdDsmZ3Q7RGVzY3JpYmUgRGlzdHJpYnV0aW9uJmx0Oy9hJmd0OywgcmVzcGVjdGl2ZWx5LiBBcyB0aGVzZSBpc3N1ZXMgYXJlIGNvbnNpZGVyZWQsJiMxMzsmIzEwOyAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluJiMxMzsmIzEwOyAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3JiMxMzsmIzEwOyAgICBvZiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IGlzIHJlZmluZWQsIGFzIHdlbGwpLiBUaGUgcmVzdWx0aW5nIGFyY2hpdGVjdHVyZSBpcyByZXZpZXdlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2Ugb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBoYXZlIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gb3RoZXIgdGFza3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cC5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGFsdGVybmF0aXZlcz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBbHRlcmFudGl2ZXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O29sJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUmIzEzOyYjMTA7ICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUmIzEzOyYjMTA7ICAgIHdpdGggZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IGV4cGVydGlzZSAoaWYgdGhvc2UgaXNzdWVzIGFyZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQpLiBJbiBvcmRlciB0byB1bmRlcnN0YW5kJiMxMzsmIzEwOyAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZSYjMTM7JiMxMDsgICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yJiMxMzsmIzEwOyAgICBjb3VudGVyaW5nIHRoaXMgdHJlbmQgaXMgdG8gcmV0YWluIGEgcmVsYXRpdmVseSBzbWFsbCBjb3JlIHRlYW0gd2l0aCBhIHNhdGVsbGl0ZSBncm91cCBvZiBleHRlbmRlZCB0ZWFtIG1lbWJlcnMgdGhhdCYjMTM7JiMxMDsgICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZSYjMTM7JiMxMDsgICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMmIzEzOyYjMTA7ICAgIG5lZWQgdG8gYmUgYWRkcmVzc2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMSI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvQWN0aXZpdHk+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEmYW1wO25ic3A7IGtleSIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUYXNrIEExJmFtcDtuYnNwOyBndWlkYW5jZSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTEmYW1wO25ic3A7IHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTEgZ3VpZGFuY2UiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEExIHJlZmluZWQgZGVzYyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEEyIGtleSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTY3JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiB1c2FnZUd1aWRhbmNlPSJSb2xlIEEyIHVzYWdlIiByZWZpbmVkRGVzY3JpcHRpb249IlJvbGUgQTIgcmVmaW5lZCBkZXNjIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEEyIGtleSIgdXNhZ2VHdWlkYW5jZT0iVGFzayBBMiBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSJUYXNrIEEyIHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxJdGVyYXRpb24gbmFtZT0iSXRlcmF0aW9uMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJ0cnVlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9Ikl0ZXJhdGlvbjEsX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQ3JlYXRlIGFuIGluaXRpYWwgc2tldGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbSAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgZWxlbWVudHMgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgYW5hbHlzaXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBpbml0aWFsIGxheWVyaW5nIGFuZCBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIHVzZS1jYXNlIHJlYWxpemF0aW9ucyB0byBiZSBhZGRyZXNzZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7LiBQZXJmb3JtIGFuIGluaXRpYWwgcGFzcyBhdCB0aGUgYXJjaGl0ZWN0dXJlIGluICZsdDthJiMxMzsmIzEwOyAgICBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UmIzEzOyYjMTA7ICAgIGNhc2VzLCBwZXJmb3JtaW5nICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7IG9uIGVhY2ggb25lLiBBZnRlciAob3IgYXMpIGVhY2ggdXNlIGNhc2UgaXMmIzEzOyYjMTA7ICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgYW5kIHRvIGFkZHJlc3MgcG90ZW50aWFsIGFyY2hpdGVjdHVyYWwgcHJvYmxlbXMgd2hpY2ggYXJlIGlkZW50aWZpZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBXaGVyZSB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgZnJvbSBhIHByaW9yIHByb2plY3Qgb3IgaXRlcmF0aW9uKSwgY2hhbmdlIHJlcXVlc3RzIG1heSBuZWVkIHRvIGJlJiMxMzsmIzEwOyAgICBjcmVhdGVkIHRvIGNoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgYmVoYXZpb3IgdGhlIHN5c3RlbSBtdXN0IHN1cHBvcnQuIFRoZXNlIGNoYW5nZXMgbWF5IGJlIHRvIGFueSYjMTM7JiMxMDsgICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVybmF0aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2EgaHJlZj0mcXVvdDsuLi9yb2xlcy9yb2xlX0ExLnhtaSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3JvbGVfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3Rhc2tzL3Rhc2tfQTIueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7dGFza19BMi54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL0FjdGl2aXR5MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9BY3Rpdml0eTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMiI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvSXRlcmF0aW9uPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQaGFzZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUGhhc2UxIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iUGhhc2UxLF9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvUGhhc2UxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvUGhhc2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJUaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3ImIzEzOyYjMTA7ZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4gJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBleHRlcm5hbElkPSJFWHRlcm5hbCBJRDpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHNjb3BlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiB1c2FnZU5vdGVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUmIzEzOyYjMTA7ICAgIG9yIGVuZC10by1lbmQgcHJvY2Vzcy4mYW1wO25ic3A7IEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgcHJvY2VzcyBmcmFnbWVudCB1c2VkIHRvIGNvbXBvc2UgYSBkZWxpdmVyeSBwcm9jZXNzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iLF9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249Im1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJwdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGFsdGVybmF0aXZlcz0iYWx0ZXJuYXRpdmVzOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9ImhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EzLF9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMyxfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvUm9sZT4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMsX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIGV4dGVuZHMgVGFzayBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMsX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGtleUNvbnNpZGVyYXRpb25zPSJLZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJQdXJwb3NlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBob3d0b1N0YWZmPSJIb3cgdG8gc3RhZmY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBleHRlcm5hbElkPSJFeHRlcm5hbCBJRDogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHNjb3BlPSJzY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlTm90ZXM9InVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBicmllZkRlc2NyaXB0aW9uPSJicmllZkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsICZsdDtzdHJvbmcmZ3Q7ZWxlbWVudHMmYXBvczsgYWx0ZXJuJmx0Oy9zdHJvbmcmZ3Q7IiBob3d0b1N0YWZmPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHN0YWZmIiBleHRlcm5hbElkPSJleHRlcm5JRDpDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBzY29wZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBzY29wZSIgdXNhZ2VOb3Rlcz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zO3VzYWdlIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3QxLF9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9BY3QxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIxIHByZXNuZXQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IxLF9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjEsX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMSxfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfanZTQkEwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTIsX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTQxcklFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvYyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvYyBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkRlbFByb2MgQTEsX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jIEExIGtleSBjb24iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iRGVsUHJvYyBBMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jIEExIGFsdGVybiIgaG93dG9TdGFmZj0iRGVsUHJvYyBBMSBzdGFmZiIgZXh0ZXJuYWxJZD0iRGVsUHJvYyBBMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2MgQTEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2MgQTEgdXNhZ2UiIHNjYWxlPSJEZWxQcm9jIEExIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jIEExIHByb2ogY2hhciIgcmlza0xldmVsPSJEZWxQcm9jIEExIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2MgQTEgZXN0IHRlY2giIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IkRlbFByb2MgQTEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvYyBBMSBjb250eXBlIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEvZGVsUHJvY19BMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWsgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jUGFrIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2NQYWsgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImRlbFByb2NQYWtfQTEuMSxfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsUHJvY1BhayBBMS4xIGtleSIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jUGFrIEExLjEgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iRGVsUHJvY1BhayBBMS4xIGFsdCIgaG93dG9TdGFmZj0iRGVsUHJvY1BhayBBMS4xIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jUGFrIEExLjEgZXh0ZXJuSUQiIHNjb3BlPSJEZWxQcm9jUGFrIEExLjEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2NQYWsgQTEuMSB1c2FnZSIgc2NhbGU9IkRlbFByb2NQYWsgQTEuMSBzY2FsZSIgcHJvamVjdENoYXJhY3RlcmlzdGljcz0iRGVsUHJvY1BhayBBMS4xIGNoYXIiIHJpc2tMZXZlbD0iRGVsUHJvY1BhayBBMS4xIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtlc3RpbWF0aW5nIHRlY2gmbHQ7IS0tU3RhcnRGcmFnbWVudC0tJmd0OyZsdDshLS1FbmRGcmFnbWVudC0tJmd0OyIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvY1BhayBBMS4xIGV4cGVydGlzZSIgdHlwZU9mQ29udHJhY3Q9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtjb250cmFjdCI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZFBsdWdpbiBuYW1lPSJQbHVnIEIiIGJyaWVmRGVzY3JpcHRpb249IlBsdWcgQiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iUGx1ZyBCIGFydGh1ciIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiB1c2VyQ2hhbmdlYWJsZT0idHJ1ZSI+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29udGVudCIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iRG9tYWlucyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9CMSxfbWRyellCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDI6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Eb21haW4+Ci08RG9tYWluIG5hbWU9ImRvbWFpbl9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRG9tYWluIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEb21haW4gQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRvbWFpbl9CMixfcmFvT2dCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDI6MzcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRvbWFpbiBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEIyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0IxIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0IxLF9TWk14WUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMDoxOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBCMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQjEsX2NZNTd3Qjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjAwOjU3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L3Rhc2tzPgotPHJlZmVyZW5jZVdvcmtmbG93cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdF9CMS9jYXBQYXRfQjEiPgotPC9yZWZlcmVuY2VXb3JrZmxvd3M+Ci08L0Rpc2NpcGxpbmU+Ci08RGlzY2lwbGluZSBuYW1lPSJkaXNjaXBsaW5lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX0IyLF9oOWZsc0I4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzowMTozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEaXNjaXBsaW5lIEIyIG1haW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvdGFza3M+Ci08cmVmZXJlbmNlV29ya2Zsb3dzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEvY2FwUGF0X0IxLjEvY2FwUGF0X0IxLjEiPgotPC9yZWZlcmVuY2VXb3JrZmxvd3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0IxLF96YVZRQUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzoxNjoyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0IxIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0IxLF91UEFXY0I4NUVkcU52ZWx5YkRYWkZRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzo1MzowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPFJvbGVTZXQgbmFtZT0icm9sZV9zZXRfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgU2V0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIFNldCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9sZV9zZXRfQjIsXzBZX01jQjg1RWRxTnZlbHliRFhaRlEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjUzOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFJvbGUgU2V0IEIyIG1haW4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUm9sZSBTZXQgQjIga2V5JiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvbGVfQjIiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iV1AgVHlwZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjEsX3hLc0lvQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L1dvcmtQcm9kdWN0VHlwZT4KLTxXb3JrUHJvZHVjdFR5cGUgbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQjIsX3lDa0wwQjh5RWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjA0OjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iV29yayBQcm9kdWN0IFR5cGUgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlRvb2xzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08VG9vbCBuYW1lPSJ0b29sX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0IxLF8wTmN2QUI4eUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNzoxNToyOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBCMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTxUb29sIG5hbWU9InRvb2xfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRvb2wgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2wgQjIgcHJlc2VudGF0aW9uIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9CMixfMTdIeHdCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MTU6NTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQjIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQjIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvU3RhbmRhcmRDYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ3VzdG9tQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iSGlkZGVuIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX2VjeTV5eE0zRWRxcW5kaS1nRHV4cHciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08L0NvbnRlbnRQYWNrYWdlPgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMSxfM0VTWlFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDU6NDAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIxIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9DUCBCMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDdXN0b20gQ2F0ZWdvcnkgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMixfM3NFeUFCOHlFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTc6MDY6MTIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkN1c3RvbSBDYXRlZ29yeSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9ImN1c3RvbV9jYXRlZ29yeV9CMS4xIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ3VzdG9tIENhdGVnb3J5IEIxLjEgcHJlc2VudGF0aW9uIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0IxLjEsX1hmVGRvQjgwRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE3OjE0OjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQjEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQ3VzdG9tIENhdGVnb3J5IEIxLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNvcmVDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQiPgotPC9wYXJlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9ImNvbnRlbnRfcGFja2FnZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uIFBhayBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFJvbGUgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfQTlEWWdCOFBFZHFzaE1OU0kwN1hPZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTI6NDc6MjMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvbGUgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgQjEga2V5IiBza2lsbHM9IlJvbGUgQjEgc2tpbGwiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEIxIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQjEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGU+Ci08Um9sZSBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9LQ01fSUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxMjo0ODoyMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBCMiBrZXkiIHNraWxscz0iUm9sZSBCMiBza2lsbCIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQjIgYXNzIiBzeW5vbnltcz0iUm9sZSBCMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxUYXNrIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08VGFza0Rlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDEyOjUwOjQ3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRhc2sgQjEgbWFpbiAmYW1wO2FtcDsgXCBcXCAmcXVvdDsgJmFwb3M7ICUgJmFtcDtndDsgJmFtcDtsdDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQjEga2V5IiBwdXJwb3NlPSJUYXNrIEIxIHBvcnBvaXNlIiBhbHRlcm5hdGl2ZXM9IlRhc2sgQjEgYWx0Ij4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249InVwIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRG93biYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249Ik92ZXIiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMS90YXNrX0IxLF9YVTZMVUI4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjEuMiI+Ci08L3N0ZXBzPgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc3RlcHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvVGFzaz4KLTxUYXNrIG5hbWU9InRhc2tfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjIgZXh0ZW5kcyBUYXNrIEExIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxMjo1MDowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBCMiBrZXkiIHB1cnBvc2U9IlRhc2sgQjIgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iVGFzayBCMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBCMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRWluIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjIuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgWndlaSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQjIuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRHJlaSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIvdGFza19CMixfWkxPTXNCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9tcUozQUI4UEVkcXNoTU5TSTA3WE9nIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNTozNzo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEIxIGtleSIgZXh0ZXJuYWxJZD0iQXJ0aWZhY3QgQjEgdW5pcXVlIElEIiBwdXJwb3NlPSJBcnRpZmFjdCBCMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkFydGlmYWN0IEIxIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEIxIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBCMSBvdXRsaW5lIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEIxIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvc3VwcG9ydGluZ19tYXRlcmlhbF9CMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NvbmNlcHRfQjEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvd2hpdGVwYXBlcl9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZXhhbXBsZV9CMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IxIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3RlbXBsYXRlX0IxIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90b29sbWVudG9yX0IxIj4KLTwvdG9vbE1lbnRvcnM+Ci08L0FydGlmYWN0PgotPEFydGlmYWN0IG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08QXJ0aWZhY3REZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfX3lHN2NCOG1FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6Mzk6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJBcnRpZmFjdCBCMiBrZXkiIGV4dGVybmFsSWQ9IkFydGlmYWN0IEIyIHVuaXF1ZSBJRCIgcHVycG9zZT0iQXJ0aWZhY3QgQjIgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBCMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBCMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQjIgb3V0bGluZSIgcmVwcmVzZW50YXRpb25PcHRpb25zPSJBcnRpZmFjdCBCMiByZXAiPgotPC9BcnRpZmFjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9BcnRpZmFjdD4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjEsX1pIZjJZQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQyOjE0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQjEga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBCMSB1bmlxdWUgSUQiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEIxIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQjEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQjEgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMSBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBCMSBwYWNrIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMSI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTwvRGVsaXZlcmFibGU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfYXNGT2tCOG5FZHExT28tRG93ZHBCZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTU6NDY6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQjIga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEIyIHVuaXF1ZSBJRCIgcHVycG9zZT0iT3V0Y29tZSBCMiBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQjIgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBCMiByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JlcG9ydF9CMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90ZW1wbGF0ZV9CMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPE91dGNvbWUgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2NYWHJzQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQ3OjM4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJPdXRjb21lIEIxIGtleSIgZXh0ZXJuYWxJZD0iT3V0Y29tZSBCMSB1bmlxdWUgSUQiIHB1cnBvc2U9Ik91dGNvbWUgQjEgcG9ycG9pc2UiIGltcGFjdE9mTm90SGF2aW5nPSJPdXRjb21lIEIxIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9Ik91dGNvbWUgQjEgcmVhc29uIj4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IxIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjEiPgotPC90b29sTWVudG9ycz4KLTwvT3V0Y29tZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsX25xRldFQjhuRWRxMU9vLURvd2RwQmciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE1OjQzOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQjIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBCMiB1bmlxdWUgSUQiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEIyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQjIgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQjIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBCMiBwYWNrIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY2hlY2tsaXN0X0IyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9ndWlkZWxpbmVfQjIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXVzYWJsZV9hc3NldF9CMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9yZXBvcnRfQjIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rvb2xtZW50b3JfQjIiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJlZFdvcmtQcm9kdWN0cz4KLTwvRGVsaXZlcmFibGU+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIxIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9CMSxfdXJMZGNCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjc6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q2hlY2tsaXN0IG5hbWU9ImNoZWNrbGlzdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDaGVja2xpc3QgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNoZWNrbGlzdF9CMixfd0V1cVVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjg6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNoZWNrbGlzdCBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DaGVja2xpc3Q+Ci08Q29uY2VwdCBuYW1lPSJjb25jZXB0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJDb25jZXB0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDb25jZXB0IEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjb25jZXB0X0IxLF93NkU5OEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxNjowMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBCMSBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Db25jZXB0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9CMixfeG5GTjRCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MTY6MjcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQjIgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgcmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRXhhbXBsZSBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZXhhbXBsZV9CMSxfeVF6Z1VCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6Mjg6MzcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkV4YW1wbGUgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvRXhhbXBsZT4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Im5ld19leGFtcGxlX0IyLF96QW9hd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyOToxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQjEsX3prWlBJQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM3OjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEIyIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZ3VpZGVsaW5lX0IyLF8wUWd1UUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0Njo1NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0d1aWRlbGluZT4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQjEsXzFJLW5VQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQyOjAwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQjEgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBCMSBwcm9iIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBCMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQjEgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEIxIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEIxLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEIxLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9CMS4xLF8ydk0tUUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0Mzo0OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQjEuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQjEuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEIxLjEgcHJvYiIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQjEuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQjEuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQjEuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEIxLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvYXJ0aWZhY3RfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMvcm9sZV9zZXRfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzL3Rvb2xfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzL3dvcmtfcHJvZHVjdF90eXBlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jb25jZXB0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2V4YW1wbGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL291dGNvbWVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcHJhY3RpY2VfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvYWRtYXBfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9CMixfNGkxZkVCOHJFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6NDA6NTAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEIyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBCMiBhZGQiIHByb2JsZW09IlByYWN0aWNlIEIyIHByb2IiIGJhY2tncm91bmQ9IlByYWN0aWNlIEIyIGJhY2siIGdvYWxzPSJQcmFjdGljZSBCMiBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UmYW1wO25ic3A7IGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQjIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9hcnRpZmFjdF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9jaGVja2xpc3RfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9kZWxpdmVyYWJsZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2d1aWRlbGluZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9vdXRjb21lX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3ByYWN0aWNlX0IxIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3ByYWN0aWNlX0IxL3ByYWN0aWNlX0IxLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmVwb3J0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JldXNhYmxlX2Fzc2V0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3JvYWRtYXBfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9sZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9zdXBwb3J0aW5nX21hdGVyaWFsX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGVtcGxhdGVfQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdG9vbG1lbnRvcl9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS93aGl0ZXBhcGVyX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucy9kb21haW5fQjIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scy90b29sX0IyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9XUCBUeXBlcy93b3JrX3Byb2R1Y3RfdHlwZV9CMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPC9QcmFjdGljZT4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0IxLF81a2phd0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozODozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxSZXBvcnQgbmFtZT0icmVwb3J0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJSZXBvcnQgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJlcG9ydCBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmVwb3J0X0IyLF82T3VaSUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozOTowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmVwb3J0IEIyIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JlcG9ydD4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IxLF82N2s0RUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0NjoxOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSZXVzYWJsZUFzc2V0IG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmV1c2FibGUgQXNzZXQgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJldXNhYmxlX2Fzc2V0X0IyLF83eE9Hb0I4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0MDowMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmV1c2FibGVBc3NldD4KLTxSb2FkbWFwIG5hbWU9InJvYWRtYXBfQjEiIGJyaWVmRGVzY3JpcHRpb249IlJvYWRtYXAgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvYWRtYXAgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvYWRtYXBfQjEsXzhoV2pFQjhyRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM2OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIxIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JvYWRtYXA+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0IyLF8tZ3dQQUI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjozNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBCMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0IxLF9fYktvMEI4ckVkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjo0NTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08U3VwcG9ydGluZ01hdGVyaWFsIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIiIGJyaWVmRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQjIsX0JONXh3QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjQ0OjUyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEIyIENvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1N1cHBvcnRpbmdNYXRlcmlhbD4KLTxUZW1wbGF0ZSBuYW1lPSJ0ZW1wbGF0ZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlbXBsYXRlIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEd1aWRhbmNlRGVzY3JpcHRpb24gbmFtZT0idGVtcGxhdGVfQjEsX0M5MFFNQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjM2OjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBCMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhdHRhY2htZW50cz0iIj4KLTwvR3VpZGFuY2VEZXNjcmlwdGlvbj4KLTwvVGVtcGxhdGU+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBCMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0IyLF9ELXg5OEI4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoyNDo1NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQjIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9InJlc291cmNlcy9UZW1wbGF0ZSBmb3IgUGFzdGUgVGVzdCBDYXNlcy5kb2MiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEIxIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQjEsX0Vwc2pNQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjIzOjU1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQjEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGVybURlZmluaXRpb24gbmFtZT0idGVybV9kZWZpbml0aW9uX0IyIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRlcm0gRGVmaW5pdGlvbiBCMiBicmllZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9CMixfR0VTNDhCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MjM6MTAgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGVybSBEZWZpbml0aW9uIEIyIGNvbnRlbnQmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG8gQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQjEsX0dvRHRVQjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjIwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIxIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEIyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0IyLF9INE9Vc0I4c0VkcVF2T2pYOGRvQ0N3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxNjoxOTo0NCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBCMiBjb250ZXh0IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBCMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9CMSxfSXZEMkVCOHNFZHFRdk9qWDhkb0NDdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlR1ZSBTZXAgMDYgMTY6MTk6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjEgY29udGV4dCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxXaGl0ZXBhcGVyIG5hbWU9IndoaXRlcGFwZXJfQjIiIGJyaWVmRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQjIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldoaXRlcGFwZXIgQjIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndoaXRlcGFwZXJfQjIsX0pkdEV3QjhzRWRxUXZPalg4ZG9DQ3ciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUdWUgU2VwIDA2IDE2OjE4OjM2IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEIyIGNvbnRleHQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1doaXRlcGFwZXI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImNhcFBhdFBha19CMS4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJjYXBQYXRfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJjYXBQYXRfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEuMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iY2FwUGF0X0IxLjEsX0lQZFo0UjgxRWRxZ0JJVHVJQ0xKRXciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iIiBhbHRlcm5hdGl2ZXM9IiIgaG93dG9TdGFmZj0iIiBleHRlcm5hbElkPSIiIHNjb3BlPSIiIHVzYWdlTm90ZXM9IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xL2NhcFBhdF9CMS4xIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJjYXBQYXRfQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9ImNhcFBhdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJjYXBQYXRfQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImNhcFBhdF9CMSxfRTZFeWNSODFFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxL2NhcFBhdF9CMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AgQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdDEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0MSIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdDEsXzU2N1lRMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL0FjdDEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTEsXzU2N1lTVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19BMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfNTY3WVNFQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMiAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfNTY3WW1VQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF81NjdZb1VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF81NjdZbmtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF81NjdZbUVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfNTY3WW4wQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzU2N1luRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfNTY3WWtrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzU2N1lRVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQjEiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQjEgcHJlc25ldCIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjEsXzU2N1lSMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvcm9sZV9CMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3Rhc2tfQjEvdGFza19CMSxfWFU2TFVCOFBFZHFzaE1OU0kwN1hPZy9TdGVwIEIxLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfNTY3WWswQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IxIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMixfNTY3WWwwQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0IyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF81NjdZblVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IxLF81NjdZb0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfNTY3WWxVQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IxIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjEsXzU2N1lTMEE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IxLF81NjdZVEVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IyLF81NjdZUkVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3JvbGVfQjEiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQjIiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IyL3Rhc2tfQjIsX1pMT01zQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMi4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsXzU2N1lRa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0IyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQjIsXzU2N1lsRUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9kZWxpdmVyYWJsZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF81NjdZbGtBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfNTY3WW1rQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsXzU2N1lrVUE1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNTY3WVJrQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL3Rhc2tfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0EyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF81NjdZa0VBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF81NjdZbTBBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvZGVsaXZlcmFibGVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfNTY3WWowQTVFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL291dGNvbWVfQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzU2N1lTa0E1RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF81NjdZUlVBNUVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MS9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iV29ya2Zsb3ciPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IldvcmsgUHJvZHVjdCBEZXBlbmRlbmN5Ij4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AgQjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ1AgQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNQIEExLF9kQmh2a1VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiPgotPC9Qcm9jZXNzRGVzY3JpcHRpb24+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEvQWN0MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMS9DUCBCMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvQ2FwYWJpbGl0eVBhdHRlcm4+Ci08L1Byb2Nlc3NDb21wb25lbnQ+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJkZWxQcm9jUGFrX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWtfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0IxLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xL2RlbFByb2NfQjEuMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08RGVsaXZlcnlQcm9jZXNzIG5hbWU9ImRlbFByb2NfQjEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJkZWxQcm9jX0IxLjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY19CMS4xLF9WMFY3TVI4MUVkcWdCSVR1SUNMSkV3IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiIgZXh0ZXJuYWxJZD0iIiBzY29wZT0iIiB1c2FnZU5vdGVzPSIiIHNjYWxlPSIiIHByb2plY3RDaGFyYWN0ZXJpc3RpY3M9IiIgcmlza0xldmVsPSIiIGVzdGltYXRpbmdUZWNobmlxdWU9IiIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iIiB0eXBlT2ZDb250cmFjdD0iIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xL2RlbFByb2NfQjEuMS9kZWxQcm9jX0IxLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPERlbGl2ZXJ5UHJvY2VzcyBuYW1lPSJkZWxQcm9jX0IxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9ImRlbFByb2NfQjEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08RGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iZGVsUHJvY19CMSxfUmZ4dXNSODFFZHFnQklUdUlDTEpFdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIiBzY2FsZT0iIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSIiIHJpc2tMZXZlbD0iIiBlc3RpbWF0aW5nVGVjaG5pcXVlPSIiIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IiIgdHlwZU9mQ29udHJhY3Q9IiI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEvZGVsUHJvY19CMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPGJhc2VzIHBhdGg9IlBsdWcgQSI+Ci08L2Jhc2VzPgotPC9NZXRob2RQbHVnaW4+Ci08TWV0aG9kQ29uZmlndXJhdGlvbiBuYW1lPSJDb25maWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uZmlnIEEgZGVzY3JpcHRpb24iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiPgotPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBwYXRoPSJQbHVnIEEiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGx1Z2luU2VsZWN0aW9uIHBhdGg9IlBsdWcgQiI+Ci08L21ldGhvZFBsdWdpblNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50Ij4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3NlcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0UGFrX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMS9jYXBQYXRfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdF9CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEIxL0FjdDEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1Bha19CMS9kZWxQcm9jUGFrX0IxLjEvZGVsUHJvY19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Ub29scyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1dQIFR5cGVzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1Rvb2xzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvRG9tYWlucyI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL0hpZGRlbiI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxwcm9jZXNzVmlld3MgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL2N1c3RvbV9jYXRlZ29yeV9BMSI+Ci08L3Byb2Nlc3NWaWV3cz4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTxNZXRob2RDb25maWd1cmF0aW9uIG5hbWU9IkNvbmZpZyBCIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiPgotPG1ldGhvZFBsdWdpblNlbGVjdGlvbiBwYXRoPSJQbHVnIEIiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudCI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19CMS9jYXBQYXRQYWtfQjEuMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0IxL2NhcFBhdFBha19CMS4xL2NhcFBhdF9CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQjEvY2FwUGF0X0IxIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBCMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQjEvQWN0MSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJQbHVnIEIvRGVsaXZlcnlQcm9jZXNzZXMiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY1Bha19CMS4xIj4KLTwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4KLTxtZXRob2RQYWNrYWdlU2VsZWN0aW9uIHBhdGg9IlBsdWcgQi9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrX0IxL2RlbFByb2NQYWtfQjEuMS9kZWxQcm9jX0IxLjEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24gcGF0aD0iUGx1ZyBCL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQjEvZGVsUHJvY19CMSI+Ci08L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci08cHJvY2Vzc1ZpZXdzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQjEiPgotPC9wcm9jZXNzVmlld3M+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L01ldGhvZExpYnJhcnk+Ci08TWV0aG9kUGx1Z2luIG5hbWU9IlBsdWcgQSIgYnJpZWZEZXNjcmlwdGlvbj0iUGx1ZyBBIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSJQbHVnIEEgQXJ0aHVyIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIj4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDb250ZW50IiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IkNhdGVnb3JpZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEb21haW5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEb21haW4gbmFtZT0iZG9tYWluX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEb21haW4gQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRvbWFpbiBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZG9tYWluX0ExLF9GRXpPNEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIFNlcCAwNiAxOToxNTozNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBEb21haW4gQTEgbWFpbiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiBrZXlDb25zaWRlcmF0aW9ucz0iRG9tYWluIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTxEb21haW4gbmFtZT0ic3ViX2RvbWFpbl9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWItRG9tYWluIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yi1Eb21haW4gQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3ViX2RvbWFpbl9BMS4xLF9HT1o3UUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0Njo1MyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3ViLURvbWFpbiBBMS4xIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJTdWItRG9tYWluIEExLjEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08L0RvbWFpbj4KLTwvRG9tYWluPgotPERvbWFpbiBuYW1lPSJkb21haW5fQTIiIGJyaWVmRGVzY3JpcHRpb249IkRvbWFpbiBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRG9tYWluIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkb21haW5fQTIsX0ZxV0w4QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE3OjQ3OjI4IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEb21haW4gQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyL2FydGlmYWN0X0EyLjEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvRG9tYWluPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJEaXNjaXBsaW5lcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPERpc2NpcGxpbmVHcm91cGluZyBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEaXNjaXBsaW5lIEdyb3VwaW5nIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJkaXNjaXBsaW5lX2dyb3VwaW5nX0ExLF9DQ1ZqY0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0MjozNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGlzY2lwbGluZSBHcm91cGluZyBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08ZGlzY2lwbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX0ExIj4KLTwvZGlzY2lwbGluZXM+Ci08L0Rpc2NpcGxpbmVHcm91cGluZz4KLTxEaXNjaXBsaW5lIG5hbWU9ImRpc2NpcGxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRpc2NpcGxpbmUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImRpc2NpcGxpbmVfQTEsX0M1ZF93QS1XRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJNb24gQXVnIDIyIDEwOjQ1OjAyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTx0YXNrcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L3Rhc2tzPgotPC9EaXNjaXBsaW5lPgotPERpc2NpcGxpbmUgbmFtZT0iZGlzY2lwbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGlzY2lwbGluZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iZGlzY2lwbGluZV9BMixfRHp2UG9BLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NDQ6MTQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHRhc2tzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvdGFza3M+Ci08L0Rpc2NpcGxpbmU+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIG5hbWU9IlJvbGVTZXRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Um9sZVNldEdyb3VwaW5nIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBHcm91cGluZyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X2dyb3VwaW5nX0ExLF9KWW4wZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo0OTozMSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgR3JvdXBpbmcgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEdyb3VwaW5nIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxyb2xlU2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X0ExIj4KLTwvcm9sZVNldHM+Ci08L1JvbGVTZXRHcm91cGluZz4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0ExLF85UHAxVUJCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iTW9uIEF1ZyAyMiAxMDo0NzoyMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEExMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cm9sZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTEiPgotPC9yb2xlcz4KLTwvUm9sZVNldD4KLTxSb2xlU2V0IG5hbWU9InJvbGVfc2V0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIFNldCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBTZXQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJvbGVfc2V0X0EyLF8tdWJnY0JCS0VkcUJzN0toZFZMUkxBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MDo0MCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBTZXQgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlJvbGUgU2V0IEEyIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyb2xlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L3JvbGVzPgotPC9Sb2xlU2V0PgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJXUCBUeXBlcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFdvcmtQcm9kdWN0VHlwZSBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IldvcmsgUHJvZHVjdCBUeXBlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3b3JrX3Byb2R1Y3RfdHlwZV9BMSxfSGdoRFlBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDI6NDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldvcmsgUHJvZHVjdCBUeXBlIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC93b3JrUHJvZHVjdHM+Ci08d29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvd29ya1Byb2R1Y3RzPgotPC9Xb3JrUHJvZHVjdFR5cGU+Ci08V29ya1Byb2R1Y3RUeXBlIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJXb3JrIFByb2R1Y3QgVHlwZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV29yayBQcm9kdWN0IFR5cGUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9IndvcmtfcHJvZHVjdF90eXBlX0EyLF9JRm5VZ0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMzoxNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV29yayBQcm9kdWN0IFR5cGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IldvcmsgUHJvZHVjdCBUeXBlIEExIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L3dvcmtQcm9kdWN0cz4KLTx3b3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0EyIj4KLTwvd29ya1Byb2R1Y3RzPgotPHdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3dvcmtQcm9kdWN0cz4KLTwvV29ya1Byb2R1Y3RUeXBlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJUb29scyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPFRvb2wgbmFtZT0idG9vbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVG9vbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVG9vbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0idG9vbF9BMSxfS3hiYWdBLVdFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTc6NTI6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRvb2wgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rvb2w+Ci08VG9vbCBuYW1lPSJ0b29sX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sX0EyLF9MaGFGOEEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MjozNCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVG9vbCBBMiBrZXkiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTwvVG9vbD4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9TdGFuZGFyZENhdGVnb3JpZXMiPgotPC9wYXJlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBuYW1lPSJIaWRkZW4iIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuIj4KLTwvcGFyZW50UGFja2FnZT4KLTxDdXN0b21DYXRlZ29yeSBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfeVVlTEt3LVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExLF9NS1Bua0EtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNzo1MzoxNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTEga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzL3N1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMS9kZWxQcm9jUGFrX0ExLjEvZGVsUHJvY1Bha19BMS4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTwvQ3VzdG9tQ2F0ZWdvcnk+Ci08Q3VzdG9tQ2F0ZWdvcnkgbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDdXN0b20gQ2F0ZWdvcnkgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkN1c3RvbSBDYXRlZ29yeSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0EyLF9PU1NTSUEtV0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxODowMjowNyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ3VzdG9tIENhdGVnb3J5IEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJDdXN0b20gQ2F0ZWdvcnkgQTIga2V5Ij4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIiPgotPC9jYXRlZ29yaXplZEVsZW1lbnRzPgotPGNhdGVnb3JpemVkRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMi9hcnRpZmFjdF9BMi4xIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08Y2F0ZWdvcml6ZWRFbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPEN1c3RvbUNhdGVnb3J5IG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWItQ3VzdG9tIENhdGVnb3J5IEExLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEuMSxfN2RYWVVCQktFZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTg6MDE6MjYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1Yi1DdXN0b20gQ2F0ZWdvcnkgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViLUN1c3RvbSBDYXRlZ29yeSBBMS4xIGtleSI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY2F0ZWdvcml6ZWRFbGVtZW50cz4KLTxjYXRlZ29yaXplZEVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2NhdGVnb3JpemVkRWxlbWVudHM+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iQ29yZUNvbnRlbnQiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCI+Ci08L3BhcmVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJDb25QYWsgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxSb2xlIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFJvbGVEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0ExLF81NXprMEEtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVHVlIE9jdCAxOCAxNjowNDoxMCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9sZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHNraWxscz0iUm9sZSBBMSBza2lsbHMiIGFzc2lnbm1lbnRBcHByb2FjaGVzPSJSb2xlIEExIGFzc2lnbiIgc3lub255bXM9IlJvbGUgQTEgc3luIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvbW9kaWZpZXM+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2RlbGl2ZXJhYmxlX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZT4KLTxSb2xlIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzZrM1VBQS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjMyOjM1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSb2xlIEEyIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEEyIGtleSIgc2tpbGxzPSJSb2xlIEEyIHNraWxscyIgYXNzaWdubWVudEFwcHJvYWNoZXM9IlJvbGUgQTIgYXNzaWduIiBzeW5vbnltcz0iUm9sZSBBMiBzeW4iPgotPC9Sb2xlRGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMiI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9hc3NldHM+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL291dGNvbWVfQTIiPgotPC9tb2RpZmllcz4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlPgotPFRhc2sgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iV2VkIE9jdCAxOSAxMDoyODozOSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iVGFzayBBMSBrZXkiIHB1cnBvc2U9IlRhc2sgQTEgcHVycG9zZSIgYWx0ZXJuYXRpdmVzPSJUYXNrIEExIGFsdCI+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJhbHBoYSI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEExLjIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJiZXRhIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTEuMyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249ImdhbW1hIj4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTEiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMSI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0ExIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08VGFzayBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICggZXh0ZW5kZWQgYnkgVGFzayBBMyApIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBPY3QgMTkgMTA6Mjk6MjIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRhc2sgQTIgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTIga2V5IiBwdXJwb3NlPSJUYXNrIEEyIHB1cnBvc2UiIGFsdGVybmF0aXZlcz0iVGFzayBBMiBhbHQiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBwdXQgeW91ciByaWdodCBmb290IGluJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4yIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0icHV0IHlvdXIgcmlnaHQgZm9vdCBvdXQiPgotPC9TZWN0aW9uPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMi4zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iRG8gdGhlIGhva2V5LXBva2V5Ij4KLTwvU2VjdGlvbj4KLTwvVGFza0Rlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvcGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvb3V0cHV0PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyL3Rhc2tfQTIsXzc1TlF3QS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMi4xIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3N0ZXBzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0EyIj4KLTwvdG9vbE1lbnRvcnM+Ci08L1Rhc2s+Ci08QXJ0aWZhY3QgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBcnRpZmFjdERlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExIHgsXzlLdDc4QS1QRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgU2VwIDA3IDE0OjUyOjQ0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMSB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEExIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMSByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTEgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX0Y1MXl3QS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE4OjA0OjE5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iU3ViX0FydGlmYWN0IEExLjEga2V5IiBleHRlcm5hbElkPSJTdWJfQXJ0aWZhY3QgQTEuMSB1bmlxdWUiIHB1cnBvc2U9IlN1Yl9BcnRpZmFjdCBBMS4xIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMS4xIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkFydGlmYWN0IEExLjEgcmVhc29uIiBicmllZk91dGxpbmU9IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IlN1Yl9BcnRpZmFjdCBBMS4xIHJlcCI+Ci08L0FydGlmYWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08Y29udGFpbmVyQXJ0aWZhY3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvY29udGFpbmVyQXJ0aWZhY3Q+Ci08L0FydGlmYWN0PgotPC9BcnRpZmFjdD4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0U3WjBrQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgQXVnIDE3IDE5OjQxOjI0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZhY3QgQTIga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMiB1bmlxdWUiIHB1cnBvc2U9IkFydGlmYWN0IEEyIHB1cnBvc2UiIGltcGFjdE9mTm90SGF2aW5nPSJBcnRpZmFjdCBBMiBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMiByZWFzb24iIGJyaWVmT3V0bGluZT0iQXJ0aWZhY3QgQTIgYnJpZWYiIHJlcHJlc2VudGF0aW9uT3B0aW9ucz0iQXJ0aWZhY3QgQTIgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxBcnRpZmFjdCBuYW1lPSJhcnRpZmFjdF9BMi4xIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMi4xIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFydGlmYWN0RGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIuMSxfSEVNdEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IldlZCBBdWcgMTcgMTk6NDQ6MDcgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkFydGlmYWN0IEEyLjEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkFydGlmYWN0IEEyLjEga2V5IiBleHRlcm5hbElkPSJBcnRpZmFjdCBBMi4xIHVuaXF1ZSIgcHVycG9zZT0iQXJ0aWZhY3QgQTIuMSBwdXJwb3NlIiBpbXBhY3RPZk5vdEhhdmluZz0iQXJ0aWZhY3QgQTIuMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJBcnRpZmFjdCBBMi4xIHJlYXNvbiIgYnJpZWZPdXRsaW5lPSJBcnRpZmFjdCBBMi4xIGJyaWVmIiByZXByZXNlbnRhdGlvbk9wdGlvbnM9IkFydGlmYWN0IEEyLjEgcmVwIj4KLTwvQXJ0aWZhY3REZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0EyIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0EyIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTIiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTIiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTIiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC90b29sTWVudG9ycz4KLTxjb250YWluZXJBcnRpZmFjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRhaW5lckFydGlmYWN0PgotPC9BcnRpZmFjdD4KLTwvQXJ0aWZhY3Q+Ci08RGVsaXZlcmFibGUgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxEZWxpdmVyYWJsZURlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0ExLF9JSVNuVUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDoyOTo1OSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkRlbGl2ZXJhYmxlIEExIGtleSIgZXh0ZXJuYWxJZD0iRGVsaXZlcmFibGUgQTEgdW5pcXVlIiBwdXJwb3NlPSJEZWxpdmVyYWJsZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9IkRlbGl2ZXJhYmxlIEExIGltcGFjdCIgcmVhc29uc0Zvck5vdE5lZWRpbmc9IkRlbGl2ZXJhYmxlIEExIHJlYXNvbiIgZXh0ZXJuYWxEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgZXh0ZXJuIiBwYWNrYWdpbmdHdWlkYW5jZT0iRGVsaXZlcmFibGUgQTEgcGtnIj4KLTwvRGVsaXZlcmFibGVEZXNjcmlwdGlvbj4KLTxzdXBwb3J0aW5nTWF0ZXJpYWxzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9zdXBwb3J0aW5nX21hdGVyaWFsX0ExIj4KLTwvc3VwcG9ydGluZ01hdGVyaWFscz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0ExIj4KLTwvZXhhbXBsZXM+Ci08YXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L2Fzc2V0cz4KLTxyZXBvcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9yZXBvcnRzPgotPHRlbXBsYXRlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGVtcGxhdGVfQTEiPgotPC90ZW1wbGF0ZXM+Ci08dG9vbE1lbnRvcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTEiPgotPC90b29sTWVudG9ycz4KLTxkZWxpdmVyZWRXb3JrUHJvZHVjdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2FydGlmYWN0X0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxEZWxpdmVyYWJsZSBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPERlbGl2ZXJhYmxlRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0pCcWZVQS1SRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjE1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsaXZlcmFibGUgQTIga2V5IiBleHRlcm5hbElkPSJEZWxpdmVyYWJsZSBBMiB1bmlxdWUiIHB1cnBvc2U9IkRlbGl2ZXJhYmxlIEEyIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iRGVsaXZlcmFibGUgQTImYW1wO25ic3A7aW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iRGVsaXZlcmFibGUgQTIgcmVhc29uIiBleHRlcm5hbERlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBleHRlcm4iIHBhY2thZ2luZ0d1aWRhbmNlPSJEZWxpdmVyYWJsZSBBMiBwa2ciPgotPC9EZWxpdmVyYWJsZURlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPGRlbGl2ZXJlZFdvcmtQcm9kdWN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyZWRXb3JrUHJvZHVjdHM+Ci08ZGVsaXZlcmVkV29ya1Byb2R1Y3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmVkV29ya1Byb2R1Y3RzPgotPC9EZWxpdmVyYWJsZT4KLTxPdXRjb21lIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08V29ya1Byb2R1Y3REZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9LQV8xWUEtUkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDoxOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiBPdXRjb21lIEExICIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iT3V0Y29tZSBBMSBrZXkiIGV4dGVybmFsSWQ9Ik91dGNvbWUgQTEgdW5pcXVlIiBwdXJwb3NlPSJPdXRjb21lIEExIHBvcnBvaXNlIiBpbXBhY3RPZk5vdEhhdmluZz0iT3V0Y29tZSBBMSBpbXBhY3QiIHJlYXNvbnNGb3JOb3ROZWVkaW5nPSJPdXRjb21lIEExIHJlYXNvbiI+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRpb24+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjb25jZXB0c0FuZFBhcGVycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMSI+Ci08L2NvbmNlcHRzQW5kUGFwZXJzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMSI+Ci08L2NoZWNrbGlzdHM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0ExIj4KLTwvZ3VpZGVsaW5lcz4KLTxleGFtcGxlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2V4YW1wbGVzPgotPGFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9hc3NldHM+Ci08cmVwb3J0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmVwb3J0X0ExIj4KLTwvcmVwb3J0cz4KLTx0ZW1wbGF0ZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0ExIj4KLTwvdGVtcGxhdGVzPgotPHRvb2xNZW50b3JzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvdG9vbE1lbnRvcnM+Ci08L091dGNvbWU+Ci08T3V0Y29tZSBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfS3ZMeEVBLVJFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IiBleHRlcm5hbElkPSJPdXRjb21lIEExIHVuaXF1ZSIgcHVycG9zZT0iT3V0Y29tZSBBMSBwb3Jwb2lzZSIgaW1wYWN0T2ZOb3RIYXZpbmc9Ik91dGNvbWUgQTEgaW1wYWN0IiByZWFzb25zRm9yTm90TmVlZGluZz0iT3V0Y29tZSBBMSByZWFzb24iPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0aW9uPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNvbmNlcHRzQW5kUGFwZXJzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jb25jZXB0X0EyIj4KLTwvY29uY2VwdHNBbmRQYXBlcnM+Ci08Y29uY2VwdHNBbmRQYXBlcnMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0c0FuZFBhcGVycz4KLTxjaGVja2xpc3RzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jaGVja2xpc3RzPgotPGd1aWRlbGluZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2d1aWRlbGluZXM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTIiPgotPC9leGFtcGxlcz4KLTxhc3NldHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JldXNhYmxlX2Fzc2V0X0EyIj4KLTwvYXNzZXRzPgotPHJlcG9ydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L3JlcG9ydHM+Ci08dGVtcGxhdGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMiI+Ci08L3RlbXBsYXRlcz4KLTx0b29sTWVudG9ycyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdG9vbG1lbnRvcl9BMiI+Ci08L3Rvb2xNZW50b3JzPgotPC9PdXRjb21lPgotPENoZWNrbGlzdCBuYW1lPSJjaGVja2xpc3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkNoZWNrbGlzdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ2hlY2tsaXN0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJjaGVja2xpc3RfQTEsX0tWNHEwQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjM0IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ2hlY2tsaXN0PgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMSBwcmVzZW50IiBzaGFwZWljb249ImZpbGU6L0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL3RyYW4tbHV1L0lCTS9NZXRob2RMaWJyYXJpZXMvcGFyaXMvUGx1ZyUyMEEvZ3VpZGFuY2VzL2NvbmNlcHRzL3Jlc291cmNlcy90eXJhbm5vc2F1cnVzLmdpZiIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImNvbmNlcHRfQTEsX05ETC1rQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjMwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIENvbmNlcHQgQTEgY29udGVudCYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRmlsZSBsaW5rOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2ZpbGU6Ly8vcmVzb3VyY2VzL2NvbmNlcHRfQTEueG1pJnF1b3Q7Jmd0O2NvbmNlcHRfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVVJMOiZhbXA7bmJzcDsmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cucG9zaXRyb25ncm91cC5jb20mcXVvdDsmZ3Q7aHR0cDovL3d3dy5wb3NpdHJvbmdyb3VwLmNvbSZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEltYWdlOiZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDszMiZxdW90OyBhbHQ9JnF1b3Q7UCZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3R5cmFubm9zYXVydXMuZ2lmJnF1b3Q7IHdpZHRoPSZxdW90OzMyJnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBFbGVtZW50IHBsYWluOiZhbXA7bmJzcDsmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Q29uY2VwdCBBMiBwcmVzZW50Jmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgRWxlbWVudCB3aXRoIHR5cGU6JmFtcDtuYnNwOyZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rV2l0aFR5cGUmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7Li8uLi8uLi8uLi9QbHVnJTIwQS9ndWlkYW5jZXMvY29uY2VwdHMvY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O19PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBJnF1b3Q7Jmd0O0NvbmNlcHQ6IENvbmNlcHQgQTIgcHJlc2VudCZsdDsvYSZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEVsZW1lbnQgd2l0aCB1c2VyIHRleHQ6JmFtcDtuYnNwOyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGlua1dpdGhVc2VyVGV4dCZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDsuLy4uLy4uLy4uL1BsdWclMjBBL2d1aWRhbmNlcy9jb25jZXB0cy9jb25jZXB0X0EyLF9PVkxWY0EtVEVkcUwyTzFQSlY5Y1pBLmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7X09WTFZjQS1URWRxTDJPMVBKVjljWkEmcXVvdDsmZ3Q7Y29uY2VwdF9BMiB1c2VyIHRleHQmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NvbmNlcHQ+Ci08RXhhbXBsZSBuYW1lPSJleGFtcGxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJFeGFtcGxlIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJleGFtcGxlX0ExLF9PQnh0d0EtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9FeGFtcGxlPgotPEd1aWRlbGluZSBuYW1lPSJndWlkZWxpbmVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iR3VpZGVsaW5lIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJndWlkZWxpbmVfQTEsX09rQ3RVQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJHdWlkZWxpbmUgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvR3VpZGVsaW5lPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMSxfUDhqWVlBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTggUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlByYWN0aWNlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEExIHByb2JsZW0iIGJhY2tncm91bmQ9IlByYWN0aWNlIEExIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTEgYXBwIiBsZXZlbHNPZkFkb3B0aW9uPSJQcmFjdGljZSBBMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08UHJhY3RpY2UgbmFtZT0icHJhY3RpY2VfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUHJhY3RpY2UgQTEuMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcmFjdGljZURlc2NyaXB0aW9uIG5hbWU9InByYWN0aWNlX0ExLjEsXy1GU1VnQS1VRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIwIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMS4xIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGFkZGl0aW9uYWxJbmZvPSJQcmFjdGljZSBBMS4xIGFkZCIgcHJvYmxlbT0iUHJhY3RpY2UgQTEuMSBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMS4xIGJhY2siIGdvYWxzPSJQcmFjdGljZSBBMS4xIGdvYWwiIGFwcGxpY2F0aW9uPSJQcmFjdGljZSBBMS4xIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTEuMSBsZXZlbCI+Ci08L1ByYWN0aWNlRGVzY3JpcHRpb24+Ci08L1ByYWN0aWNlPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9hcnRpZmFjdF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NvbmNlcHRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZXhhbXBsZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvb3V0Y29tZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9wcmFjdGljZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXBvcnRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90ZW1wbGF0ZV9BMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90b29sbWVudG9yX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTEvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZGVsaXZlcmFibGVfQTEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvc3ViX2N1c3RvbV9jYXRlZ29yeV9BMS4xIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9EaXNjaXBsaW5lcy9kaXNjaXBsaW5lX2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zL2RvbWFpbl9BMS9zdWJfZG9tYWluX0ExLjEiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL1JvbGVTZXRzL3JvbGVfc2V0X2dyb3VwaW5nX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08L1ByYWN0aWNlPgotPFJlcG9ydCBuYW1lPSJyZXBvcnRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJlcG9ydCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUmVwb3J0IEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXBvcnRfQTEsX1E1RGM0QS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjUxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUmVwb3J0PgotPFJldXNhYmxlQXNzZXQgbmFtZT0icmV1c2FibGVfYXNzZXRfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXVzYWJsZSBBc3NldCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icmV1c2FibGVfYXNzZXRfQTEsX1RWMGFRQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjI3IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBc3NldCBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXVzYWJsZUFzc2V0PgotPFJvYWRtYXAgbmFtZT0icm9hZG1hcF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9hZG1hcCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9hZG1hcCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0icm9hZG1hcF9BMSxfWmszOWdBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MDQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvUm9hZG1hcD4KLTxTdXBwb3J0aW5nTWF0ZXJpYWwgbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMSBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0ic3VwcG9ydGluZ19tYXRlcmlhbF9BMSxfYUZwdlVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MDEgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlN1cHBvcnRpbmcgTWF0ZXJpYWwgQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvU3VwcG9ydGluZ01hdGVyaWFsPgotPFRlbXBsYXRlIG5hbWU9InRlbXBsYXRlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVtcGxhdGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08R3VpZGFuY2VEZXNjcmlwdGlvbiBuYW1lPSJ0ZW1wbGF0ZV9BMSxfYkZJUFVBLVNFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTYgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlbXBsYXRlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiIGF0dGFjaG1lbnRzPSIiPgotPC9HdWlkYW5jZURlc2NyaXB0aW9uPgotPC9UZW1wbGF0ZT4KLTxUb29sTWVudG9yIG5hbWU9InRvb2xtZW50b3JfQTEiIGJyaWVmRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRvb2xtZW50b3IgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRvb2xtZW50b3JfQTEsX2hIRWpvQS1TRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjA1IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1Rvb2xNZW50b3I+Ci08V2hpdGVwYXBlciBuYW1lPSJ3aGl0ZXBhcGVyX0ExIiBicmllZkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJXaGl0ZXBhcGVyIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ3aGl0ZXBhcGVyX0ExLF9oOFJHUUEtU0VkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToxMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9XaGl0ZXBhcGVyPgotPENvbmNlcHQgbmFtZT0iY29uY2VwdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQ29uY2VwdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQ29uY2VwdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY29uY2VwdF9BMixfT1ZMVmNBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6MjQgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNvbmNlcHQgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvQ29uY2VwdD4KLTxDaGVja2xpc3QgbmFtZT0iY2hlY2tsaXN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNoZWNrbGlzdCBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0iY2hlY2tsaXN0X0EyLF9rcmlUY0EtVEVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDozNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iQ2hlY2tsaXN0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0NoZWNrbGlzdD4KLTxFeGFtcGxlIG5hbWU9ImV4YW1wbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkV4YW1wbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkV4YW1wbGUgQTEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9ImV4YW1wbGVfQTIsX3VhaldjQS1URWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjQxIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJFeGFtcGxlIEExIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0V4YW1wbGU+Ci08R3VpZGVsaW5lIG5hbWU9Imd1aWRlbGluZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iR3VpZGVsaW5lIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJHdWlkZWxpbmUgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9Imd1aWRlbGluZV9BMixfNllVd0FBLVRFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NDUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9HdWlkZWxpbmU+Ci08UmVwb3J0IG5hbWU9InJlcG9ydF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmVwb3J0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSZXBvcnQgQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InJlcG9ydF9BMixfR3JHd1FBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzA6NTMgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJlcG9ydCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9SZXBvcnQ+Ci08VGVtcGxhdGUgbmFtZT0idGVtcGxhdGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRlbXBsYXRlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZW1wbGF0ZSBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxHdWlkYW5jZURlc2NyaXB0aW9uIG5hbWU9InRlbXBsYXRlX0EyLF9aWHE5RUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDo1OCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVGVtcGxhdGUgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiIgYXR0YWNobWVudHM9IiI+Ci08L0d1aWRhbmNlRGVzY3JpcHRpb24+Ci08L1RlbXBsYXRlPgotPFN1cHBvcnRpbmdNYXRlcmlhbCBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyIiBicmllZkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdXBwb3J0aW5nIE1hdGVyaWFsIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJzdXBwb3J0aW5nX21hdGVyaWFsX0EyLF9tUHNfY0EtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowMyBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iU3VwcG9ydGluZyBNYXRlcmlhbCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9TdXBwb3J0aW5nTWF0ZXJpYWw+Ci08VG9vbE1lbnRvciBuYW1lPSJ0b29sbWVudG9yX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUb29sbWVudG9yIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUb29sbWVudG9yIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0b29sbWVudG9yX0EyLF92N0pLQUEtVUVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMTowOCBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iVG9vbG1lbnRvciBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Ub29sTWVudG9yPgotPFdoaXRlcGFwZXIgbmFtZT0id2hpdGVwYXBlcl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iV2hpdGVwYXBlciBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iV2hpdGVwYXBlciBBMiBwcmVzZW50IiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gbmFtZT0id2hpdGVwYXBlcl9BMixfM1hyMEVBLVVFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MTUgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IldoaXRlcGFwZXIgQTIgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvV2hpdGVwYXBlcj4KLTxQcmFjdGljZSBuYW1lPSJwcmFjdGljZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPFByYWN0aWNlRGVzY3JpcHRpb24gbmFtZT0icHJhY3RpY2VfQTIsX0VwZm9ZQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMxOjIzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIgYWRkIiBwcm9ibGVtPSJQcmFjdGljZSBBMiBwcm9ibGVtIiBiYWNrZ3JvdW5kPSJQcmFjdGljZSBBMiBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIgZ29hbCIgYXBwbGljYXRpb249IlByYWN0aWNlIEEyIGFwcCIgbGV2ZWxzT2ZBZG9wdGlvbj0iUHJhY3RpY2UgQTIgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPFByYWN0aWNlIG5hbWU9InByYWN0aWNlX0EyLjEiIGJyaWVmRGVzY3JpcHRpb249IlByYWN0aWNlIEEyLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlByYWN0aWNlIEEyLjEgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08UHJhY3RpY2VEZXNjcmlwdGlvbiBuYW1lPSJwcmFjdGljZV9BMi4xLF9Kcmd3d0EtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMToyNSBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUHJhY3RpY2UgQTIuMSBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIiBhZGRpdGlvbmFsSW5mbz0iUHJhY3RpY2UgQTIuMSBhZGQiIHByb2JsZW09IlByYWN0aWNlIEEyLjEgcHJvYmxlbSIgYmFja2dyb3VuZD0iUHJhY3RpY2UgQTIuMSBiYWNrIiBnb2Fscz0iUHJhY3RpY2UgQTIuMSBnb2FsIiBhcHBsaWNhdGlvbj0iUHJhY3RpY2UgQTIuMSBhcHAiIGxldmVsc09mQWRvcHRpb249IlByYWN0aWNlIEEyLjEgbGV2ZWwiPgotPC9QcmFjdGljZURlc2NyaXB0aW9uPgotPC9QcmFjdGljZT4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvYXJ0aWZhY3RfQTIvYXJ0aWZhY3RfQTIuMSI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9jaGVja2xpc3RfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9kZWxpdmVyYWJsZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2d1aWRlbGluZV9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9vdXRjb21lX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3ByYWN0aWNlX0ExIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JlcG9ydF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3RlbXBsYXRlX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rvb2xtZW50b3JfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvd2hpdGVwYXBlcl9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9jdXN0b21fY2F0ZWdvcnlfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzL2Rpc2NpcGxpbmVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTxjb250ZW50UmVmZXJlbmNlcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0RvbWFpbnMvZG9tYWluX0EyIj4KLTwvY29udGVudFJlZmVyZW5jZXM+Ci08Y29udGVudFJlZmVyZW5jZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMvdG9vbF9BMiI+Ci08L2NvbnRlbnRSZWZlcmVuY2VzPgotPGNvbnRlbnRSZWZlcmVuY2VzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMvd29ya19wcm9kdWN0X3R5cGVfQTIiPgotPC9jb250ZW50UmVmZXJlbmNlcz4KLTwvUHJhY3RpY2U+Ci08UmV1c2FibGVBc3NldCBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iUmV1c2FibGUgQXNzZXQgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJldXNhYmxlIEFzc2V0IEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyZXVzYWJsZV9hc3NldF9BMixfU01jM0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6MjkgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlJldXNhYmxlIEFzc2V0IEEyIGNvbnRlbnQiIGtleUNvbnNpZGVyYXRpb25zPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L1JldXNhYmxlQXNzZXQ+Ci08Um9hZG1hcCBuYW1lPSJyb2FkbWFwX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2FkbWFwIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2FkbWFwIEEyIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJyb2FkbWFwX0EyLF9ZdWtnUUEtVkVkcUwyTzFQSlY5Y1pBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGF0ZT0iVGh1IEF1ZyAxOCAxNDozMDowNiBQRFQgMjAwNSIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iMS4wLjAiIG1haW5EZXNjcmlwdGlvbj0iUm9hZG1hcCBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9Sb2FkbWFwPgotPFRlcm1EZWZpbml0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUZXJtIERlZmluaXRpb24gQTIgcHJlc2VudCIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIG5hbWU9InRlcm1fZGVmaW5pdGlvbl9BMixfbzhJN0VBLVZFZHFMMk8xUEpWOWNaQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURhdGU9IlRodSBBdWcgMTggMTQ6MzE6NDIgUERUIDIwMDUiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IlRlcm0gRGVmaW5pdGlvbiBBMiBjb250ZW50IiBrZXlDb25zaWRlcmF0aW9ucz0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9UZXJtRGVmaW5pdGlvbj4KLTxUZXJtRGVmaW5pdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGVybSBEZWZpbml0aW9uIEExIHByZXNlbnQiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPENvbnRlbnREZXNjcmlwdGlvbiBuYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEsX3NmaUpVQS1WRWRxTDJPMVBKVjljWkEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJUaHUgQXVnIDE4IDE0OjMwOjEyIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJUZXJtIERlZmluaXRpb24gQTEgY29udGVudCIga2V5Q29uc2lkZXJhdGlvbnM9IiI+Ci08L0NvbnRlbnREZXNjcmlwdGlvbj4KLTwvVGVybURlZmluaXRpb24+Ci08VGFzayBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O0FTQ0lJJnF1b3Q7PyZndDsgJmx0O2NvbS5pYm0udW1hLmVkaXQudG5nLnV0aWwubW9kZWw6T3JkZXJJbmZvQ29sbGVjdGlvbiB4bWk6dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsgeG1sbnM6eG1pPSZxdW90O2h0dHA6Ly93d3cub21nLm9yZy9YTUkmcXVvdDsgeG1sbnM6Y29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbD0mcXVvdDtodHRwOi8vL2NvbS9pYm0vdW1hL2VkaXQvdG5nL3V0aWwvbW9kZWwuZWNvcmUmcXVvdDsmZ3Q7ICAgJmx0O29yZGVySW5mb3MgbmFtZT0mcXVvdDtzZWN0aW9ucyZxdW90OyB0aW1lc3RhbXA9JnF1b3Q7MTEyOTc0NzI2NDEwOSZxdW90OyZndDsgICAgICZsdDtnVUlEcyZndDtfckNXd1VFRFBFZHFyaHNaaDNRTkFNUSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3RpMkJZQkJPRWRxQnM3S2hkVkxSTEEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O191bXlnWUVEUEVkcXJoc1poM1FOQU1RJmx0Oy9nVUlEcyZndDsgICAgICZsdDtnVUlEcyZndDtfdGs3c0VCQk9FZHFCczdLaGRWTFJMQSZsdDsvZ1VJRHMmZ3Q7ICAgICAmbHQ7Z1VJRHMmZ3Q7X3Z4NUJrRURQRWRxcmhzWmgzUU5BTVEmbHQ7L2dVSURzJmd0OyAgICAgJmx0O2dVSURzJmd0O190bmRib0JCT0VkcUJzN0toZFZMUkxBJmx0Oy9nVUlEcyZndDsgICAmbHQ7L29yZGVySW5mb3MmZ3Q7ICZsdDsvY29tLmlibS51bWEuZWRpdC50bmcudXRpbC5tb2RlbDpPcmRlckluZm9Db2xsZWN0aW9uJmd0OyAiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTMgZXh0ZW5kcyBUYXNrIEEyIiB2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiPgotPFRhc2tEZXNjcmlwdGlvbiBuYW1lPSIsX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI3OjQzIFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBUYXNrIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogVGFzayBBMyIgcHVycG9zZT0icHVycG9zZTogVGFzayBBMyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IFRhc2sgQTMiPgotPFNlY3Rpb24gbmFtZT0iU3RlcCBBMy4xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIHNlY3Rpb25OYW1lPSIiIHNlY3Rpb25EZXNjcmlwdGlvbj0iU3RlcCBBMy4xIj4KLTwvU2VjdGlvbj4KLTxTZWN0aW9uIG5hbWU9IlN0ZXAgQTMuMiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBzZWN0aW9uTmFtZT0iIiBzZWN0aW9uRGVzY3JpcHRpb249IlN0ZXAgQTMuMiI+Ci08L1NlY3Rpb24+Ci08U2VjdGlvbiBuYW1lPSJTdGVwIEEzLjMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgc2VjdGlvbk5hbWU9IiIgc2VjdGlvbkRlc2NyaXB0aW9uPSJTdGVwIEEzLjMiPgotPC9TZWN0aW9uPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08cGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMiPgotPC9wZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9sZV9BMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPHN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjEiPgotPC9zdGVwcz4KLTxzdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4yIj4KLTwvc3RlcHM+Ci08c3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3N0ZXBzPgotPC9UYXNrPgotPFJvbGUgbmFtZT0icm9sZV9BMyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWYgOiBSb2xlIEEzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEzIGV4dGVuZHMgUm9sZSBBMiIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIj4KLTxSb2xlRGVzY3JpcHRpb24gbmFtZT0ibmV3X3JvbGUsXzhaTjZBRURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEYXRlPSJXZWQgT2N0IDE5IDEwOjI5OjU5IFBEVCAyMDA1IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJtYWluOiBSb2xlIEEzIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OiBSb2xlIEEzIiBza2lsbHM9InNraWxsczogUm9sZSBBMyIgYXNzaWdubWVudEFwcHJvYWNoZXM9ImFzc2lnbm1lbnQ6IFJvbGUgQTMiIHN5bm9ueW1zPSJzeW5vbnltbnMgOiBSb2xlIEEzIj4KLTwvUm9sZURlc2NyaXB0aW9uPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3JvbGVfQTMiPgotPC92YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotPC9Sb2xlPgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJjYXBQYXRQYWtfQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iUGhhc2UxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJJdGVyYXRpb24xIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQWN0aXZpdHkxIiBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGFjdGl2aXR5IGNvbnRhaW5zIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gYW5vdGhlciB0YXNrcy5BbHNvIHRoZWlyIHN0ZXBzIGFyZSBhZGRlZC4iIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdGl2aXR5MSBjb250YWluaW5nIHRhc2tzIGxpbmtlZCB0byBtZXRob2QgZWxlbWVudHMiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9InRydWUiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5MSxfRTczcklUemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoaXMgV29ya2Zsb3cgRGV0YWlsOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBQcm92aWRlcyB0aGUgbmF0dXJhbCAmbHQ7YiZndDt0cmFuc2l0aW9uIGZyb20gYW5hbHlzaXMmbHQ7L2ImZ3Q7IGFjdGl2aXRpZXMgJmx0O2ImZ3Q7dG8gZGVzaWduJmx0Oy9iJmd0OyBhY3Rpdml0aWVzLCBpZGVudGlmeWluZzogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gZWxlbWVudHMgZnJvbSBhbmFseXNpcyBlbGVtZW50cyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSBkZXNpZ24gbWVjaGFuaXNtcyBmcm9tIHJlbGF0ZWQgYW5hbHlzaXMgbWVjaGFuaXNtcyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O0Rlc2NyaWJlcyZsdDsvYiZndDsgdGhlIG9yZ2FuaXphdGlvbiBvZiB0aGUgc3lzdGVtJmFwb3M7cyAmbHQ7YiZndDtydW4tdGltZSBhbmQgZGVwbG95bWVudCBhcmNoaXRlY3R1cmUmbHQ7L2ImZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O09yZ2FuaXplcyB0aGUgaW1wbGVtZW50YXRpb24gbW9kZWwmbHQ7L2ImZ3Q7IHNvIGFzIHRvIG1ha2UgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIHNlYW1sZXNzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDtiJmd0O01haW50YWlucyB0aGUgY29uc2lzdGVuY3kgYW5kIGludGVncml0eSBvZiB0aGUgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OywgZW5zdXJpbmcgdGhhdDogJiMxMzsmIzEwOyAgICAgICAgJmx0O3VsJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBuZXcgZGVzaWduIGVsZW1lbnRzIGlkZW50aWZpZWQgZm9yIHRoZSBjdXJyZW50IGl0ZXJhdGlvbiBhcmUgaW50ZWdyYXRlZCB3aXRoIHByZS1leGlzdGluZyBkZXNpZ24gZWxlbWVudHMuJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIG1heGltYWwgcmUtdXNlIG9mIGF2YWlsYWJsZSBjb21wb25lbnRzIGFuZCBkZXNpZ24gZWxlbWVudHMgaXMgYWNoaWV2ZWQgYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlIGRlc2lnbiYjMTM7JiMxMDsgICAgICAgICAgICAgICAgZWZmb3J0LiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDsvdWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk0JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTUmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk3JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsiIHB1cnBvc2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgUHVycG9zZSBvZiB0aGlzIGFjdGl2aXR5IGlzIHRvIGhhdmUgdGFza3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB0byBvdGhlciB0YXNrcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmbHQ7aW1nIGhlaWdodD0mcXVvdDs3MSZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwLmpwZyZxdW90OyB3aWR0aD0mcXVvdDsxNzYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVyYW50aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIxJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyZsdDsvb2wmZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZXNlIGFjdGl2aXRpZXMgYXJlIGJlc3QgY2FycmllZCBvdXQgYnkgYSBzbWFsbCB0ZWFtIHN0YWZmZWQgYnkgY3Jvc3MtZnVuY3Rpb25hbCB0ZWFtIG1lbWJlcnMuIElzc3VlcyB0aGF0IGFyZSYjMTM7JiMxMDsgICAgdHlwaWNhbGx5IGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCBpbmNsdWRlIHVzYWJpbGl0eSwgcGVyZm9ybWFuY2UsIHNjYWxpbmcsIHByb2Nlc3MgYW5kIHRocmVhZCBzeW5jaHJvbml6YXRpb24sIGFuZCYjMTM7JiMxMDsgICAgZGlzdHJpYnV0aW9uLiBUaGUgdGVhbSBzaG91bGQgYWxzbyBpbmNsdWRlIG1lbWJlcnMgd2l0aCBkb21haW4gZXhwZXJpZW5jZSB3aG8gY2FuIGlkZW50aWZ5IGtleSBhYnN0cmFjdGlvbnMuIFRoZSB0ZWFtJiMxMzsmIzEwOyAgICBzaG91bGQgYWxzbyBoYXZlIGV4cGVyaWVuY2Ugd2l0aCBtb2RlbCBvcmdhbml6YXRpb24gYW5kIGxheWVyaW5nLiBUaGUgdGVhbSB3aWxsIG5lZWQgdG8gYmUgYWJsZSB0byBwdWxsIGFsbCB0aGVzZSYjMTM7JiMxMDsgICAgZGlzcGFyYXRlIHRocmVhZHMgaW50byBhIGNvaGVzaXZlLCBjb2hlcmVudCAoYWxiZWl0IHByZWxpbWluYXJ5KSBhcmNoaXRlY3R1cmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBCZWNhdXNlIHRoZSBmb2N1cyBvZiB0aGUgYXJjaGl0ZWN0dXJlIGVmZm9ydCBpcyBzaGlmdGluZyB0b3dhcmQgaW1wbGVtZW50YXRpb24gaXNzdWVzLCBncmVhdGVyIGF0dGVudGlvbiBuZWVkcyB0byBiZSYjMTM7JiMxMDsgICAgcGFpZCB0byBzcGVjaWZpYyB0ZWNobm9sb2d5IGlzc3Vlcy4gVGhpcyB3aWxsIGZvcmNlIHRoZSBhcmNoaXRlY3R1cmUgdGVhbSB0byBzaGlmdCBtZW1iZXJzIG9yIGV4cGFuZCB0byBpbmNsdWRlIHBlb3BsZSYjMTM7JiMxMDsgICAgd2l0aCBkaXN0cmlidXRpb24gYW5kIGRlcGxveW1lbnQgZXhwZXJ0aXNlIChpZiB0aG9zZSBpc3N1ZXMgYXJlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCkuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQmIzEzOyYjMTA7ICAgIHRoZSBwb3RlbnRpYWwgaW1wYWN0IG9mIHRoZSBzdHJ1Y3R1cmUgb24gdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIG9uIHRoZSBlYXNlIG9mIGludGVncmF0aW9uLCBleHBlcnRpc2UgaW4gdGhlIHNvZnR3YXJlJiMxMzsmIzEwOyAgICBidWlsZCBtYW5hZ2VtZW50IHByb2Nlc3MgaXMgdXNlZnVsIHRvIGhhdmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBdCB0aGUgc2FtZSB0aW1lLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gbm90IGJlIGNvbXBvc2VkIG9mIGEgbGFyZ2UgZXh0ZW5kZWQgdGVhbS4gQSBzdHJhdGVneSBmb3ImIzEzOyYjMTA7ICAgIGNvdW50ZXJpbmcgdGhpcyB0cmVuZCBpcyB0byByZXRhaW4gYSByZWxhdGl2ZWx5IHNtYWxsIGNvcmUgdGVhbSB3aXRoIGEgc2F0ZWxsaXRlIGdyb3VwIG9mIGV4dGVuZGVkIHRlYW0gbWVtYmVycyB0aGF0JiMxMzsmIzEwOyAgICBhcmUgYnJvdWdodCBpbiBhcyAmcXVvdDtjb25zdWx0YW50cyZxdW90OyBvbiBrZXkgaXNzdWVzJmx0O2ImZ3Q7LiZsdDsvYiZndDsgVGhpcyBzdHJ1Y3R1cmUgYWxzbyB3b3JrcyB3ZWxsIGZvciBzbWFsbGVyIHByb2plY3RzIHdoZXJlJiMxMzsmIzEwOyAgICBzcGVjaWZpYyBleHBlcnRpc2UgbWF5IGJlIGJvcnJvd2VkIG9yIGNvbnRyYWN0ZWQgZnJvbSBvdGhlciBvcmdhbml6YXRpb25zOyB0aGV5IGNhbiBiZSBicm91Z2h0IGluIGFzIHNwZWNpZmljIGlzc3VlcyYjMTM7JiMxMDsgICAgbmVlZCB0byBiZSBhZGRyZXNzZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvQWN0aXZpdHkxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzMgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYyB3aXRoIG5vIGxpbmtzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPHJvYWRtYXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2FkbWFwX0ExIj4KLTwvcm9hZG1hcHM+Ci08c3VwcG9ydGluZ01hdGVyaWFscyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvc3VwcG9ydGluZ19tYXRlcmlhbF9BMSI+Ci08L3N1cHBvcnRpbmdNYXRlcmlhbHM+Ci08Y2hlY2tsaXN0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY2hlY2tsaXN0X0ExIj4KLTwvY2hlY2tsaXN0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMSI+Ci08L2NvbmNlcHRzPgotPGNvbmNlcHRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS93aGl0ZXBhcGVyX0ExIj4KLTwvY29uY2VwdHM+Ci08ZXhhbXBsZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2V4YW1wbGVfQTEiPgotPC9leGFtcGxlcz4KLTxndWlkZWxpbmVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9ndWlkZWxpbmVfQTEiPgotPC9ndWlkZWxpbmVzPgotPHJldXNhYmxlQXNzZXRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yZXVzYWJsZV9hc3NldF9BMSI+Ci08L3JldXNhYmxlQXNzZXRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTEiIGJyaWVmRGVzY3JpcHRpb249InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX1Rhc2tBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTEsX0ZydE1vRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXlzOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAga2V5MSxrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2U6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGUgd29yayBpcyBiZXN0IGRvbmUgaW4gc2V2ZXJhbCBzZXNzaW9ucywgcGVyaGFwcyBwZXJmb3JtZWQgb3ZlciBhIGZldyBkYXlzIChvciB3ZWVrcyBhbmQgbW9udGhzIGZvciB2ZXJ5IGxhcmdlJiMxMzsmIzEwOyAgICBzeXN0ZW1zKS4gVGhlIGluaXRpYWwgZm9jdXMgd2lsbCBiZSBvbiB0aGUgYWN0aXZpdGllcyAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX21lY2hhbmlzbXMse0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7QzdBMjZCRDctMzgyMC00OEQ5LTgzMEYtNjg0QzNBRjE1NUY5fSZxdW90OyZndDtJZGVudGlmeSBEZXNpZ24gTWVjaGFuaXNtcyZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9pZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbix7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1ODY5NjNEMC02MDdELTRFQzItOEQ1My0yOTJEQUZBQjlDOTJ9JnF1b3Q7Jmd0O2lkZW50aWZ5X2Rlc2lnbl9lbGVtZW50c19yZWFsLXRpbWVfZGVzaWduJmx0Oy9hJmd0Oywgd2l0aCBhIGdyZWF0IGRlYWwgb2YmIzEzOyYjMTA7ICAgIGl0ZXJhdGlvbiB3aXRoIHRoZSAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaW5jb3Jwb3JhdGVfZGVzaWduX2VsZW1lbnRzLHs1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezVDNjQ3MTczLTRFMzItNDU5NC05NkE5LTI1NDhCNDc3MjJGQX0mcXVvdDsmZ3Q7SW5jb3Jwb3JhdGUgRXhpc3RpbmcgRGVzaWduIEVsZW1lbnRzJmx0Oy9hJmd0OyBhY3Rpdml0eSB0byBtYWtlIHN1cmUgdGhhdCBuZXcmIzEzOyYjMTA7ICAgIGVsZW1lbnRzIGRvIG5vdCBkdXBsaWNhdGUgZnVuY3Rpb25hbGl0eSBvZiBleGlzdGluZyBlbGVtZW50cy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBkZXNpZ24gZW1lcmdlcywgY29uY3VycmVuY3kgYW5kIGRpc3RyaWJ1dGlvbiBpc3N1ZXMgYXJlIGludHJvZHVjZWQgaW4gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2Rlc2NyaWJlX3J1bnRpbWVfYXJjaGl0ZWN0dXJlLHs0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezREMzVDMDM4LUEyRDAtNDhCOC05RUNELTUyNzE3RkVBRTMzQX0mcXVvdDsmZ3Q7RGVzY3JpYmUgdGhlIFJ1bi10aW1lIEFyY2hpdGVjdHVyZSZsdDsvYSZndDsgYW5kICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9kaXN0cmlidXRpb24sezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NkExMTI4MDgtMEE5MC00MjdBLUJBQjktRTE0RjNGQkY3MkI1fSZxdW90OyZndDtEZXNjcmliZSBEaXN0cmlidXRpb24mbHQ7L2EmZ3Q7LCByZXNwZWN0aXZlbHkuIEFzIHRoZXNlIGlzc3VlcyBhcmUgY29uc2lkZXJlZCwmIzEzOyYjMTA7ICAgIGNoYW5nZXMgdG8gZGVzaWduIGVsZW1lbnRzIG1heSBiZSByZXF1aXJlZCB0byBzcGxpdCBiZWhhdmlvciBhY3Jvc3MgcHJvY2Vzc2VzLCB0aHJlYWRzIG9yIG5vZGVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXMgdGhlIGluZGl2aWR1YWwgbW9kZWxzIGFyZSByZWZpbmVkIHRvIGluY29ycG9yYXRlIHRoZSBhcmNoaXRlY3R1cmFsIGRlY2lzaW9ucywgdGhlIHJlc3VsdHMgYXJlIGRvY3VtZW50ZWQgaW4mIzEzOyYjMTA7ICAgIHJlc3BlY3RpdmUgdmlldyBzZWN0aW9ucyBpbiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IChlLmcuLCBhcyB0aGUgRGVzaWduIE1vZGVsIGlzIHJlZmluZWQsIHRoZSBMb2dpY2FsIFZpZXcmIzEzOyYjMTA7ICAgIG9mIHRoZSBTb2Z0d2FyZSBBcmNoaXRlY3R1cmUgRG9jdW1lbnQgaXMgcmVmaW5lZCwgYXMgd2VsbCkuIFRoZSByZXN1bHRpbmcgYXJjaGl0ZWN0dXJlIGlzIHJldmlld2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7YnIgLyZndDsmIzEzOyYjMTA7ICAgICZhbXA7bmJzcDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQgZGVzY3JpcHRpb24mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzE2JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsgd2lkdGg9JnF1b3Q7MTYmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3BhcGVycy5odG0mcXVvdDsgdGFyZ2V0PSZxdW90O19ibGFuayZxdW90OyZndDtwYXBlcnMuaHRtJmx0Oy9hJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgbGlua2VkIHRvIHRhc2tBMSI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExL3Rhc2tfQTEsXzdNOG5zQS1QRWRxTDJPMVBKVjljWkEvU3RlcCBBMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFzayBsaW5rZWQgdG8gdGFza0EyIiBicmllZkRlc2NyaXB0aW9uPSJ0YXNrIGxpbmtlZCB0byB0YXNrQTIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2tfTGlua2VkX1RvX3Rhc2tBMiIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2sgYXNzb2NpYXRlZCB0byB0YXNrQTIsX0x3TFFnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5czogdGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiIgcmVmaW5lZERlc2NyaXB0aW9uPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHJlZmluZWQ6dGFzayBhc3NvY2lhdGVkIHRvIHRhc2tBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt0YWJsZSBjZWxsc3BhY2luZz0mcXVvdDsyJnF1b3Q7IGNlbGxwYWRkaW5nPSZxdW90OzImcXVvdDsgd2lkdGg9JnF1b3Q7MTgwJnF1b3Q7IGJvcmRlcj0mcXVvdDsxJnF1b3Q7Jmd0OyYjMTM7JiMxMDsgICAgJmx0O3Rib2R5Jmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDEmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIHomIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90aCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICAyJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIDMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgNCYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgICAgICZsdDt0ciZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgeiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L3RkJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7dGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICA1JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvdGQmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDt0ZCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy90ZCZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3RyJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy90Ym9keSZndDsmIzEzOyYjMTA7Jmx0Oy90YWJsZSZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS90YXNrIGxpbmtlZCB0byB0YXNrQTIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvVGFzaz4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMiI+Ci08L21hbmRhdG9yeUlucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvd3BEZXNjMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvdGFzayBsaW5rZWQgdG8gdGFza0EyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVEZXNjMSIgYnJpZWZEZXNjcmlwdGlvbj0icm9sZURlc2MxIGxpbmtlZCB0byByb2xlQTEiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9InJvbGVEZXNjMSIgcHJlZml4PSJwcmVmaXgiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlRGVzYzEsX1Axc1VZRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkgY29uc2lkZXJhdGlvbnM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkxJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBrZXkyJiMxMzsmIzEwOyZsdDsvcCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NDc0JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9ydXBfcGxhdGZvcm0uanBnJnF1b3Q7IHdpZHRoPSZxdW90OzUwNCZxdW90OyAvJmd0O3VzYWdlIGZvciByb2xlQTEmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIHJlZmluZWREZXNjcmlwdGlvbj0icmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZURlc2MxIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvcm9sZURlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3dwRGVzYzIiPgotPC9tb2RpZmllcz4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZURlc2MyIiBicmllZkRlc2NyaXB0aW9uPSJyb2xlRGVzYzIgbGlua2VkIHRvIHJvbGVBMiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0icm9sZURlc2MyIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjMixfUTk5a0FEemlFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXkgY29uc2lkZXJhdGlvbiBmb3Igcm9sZUEyIiB1c2FnZUd1aWRhbmNlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgICZsdDtpbWcgaGVpZ2h0PSZxdW90OzEyJnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsgc3JjPSZxdW90O3Jlc291cmNlcy9idWxsZXQxLmdpZiZxdW90OyB3aWR0aD0mcXVvdDsxMiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgdXNhZ2UgZ3VpZGFuY2UgZm9yIHJvbGVBMiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZCBkZXNjcmlwdGlvbiBmb3Igcm9sZUEyJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkIGRlc2NyaXB0aW9uIGZvciByb2xlQTImIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9yb2xlRGVzYzIiPgotPC9Sb2xlPgotPG1vZGlmaWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJ3cERlc2MxIiBicmllZkRlc2NyaXB0aW9uPSJ0aGlzIHdwIGlzIGxpbmtlZCB0byBhcnRpZmFjdCIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0id3BEZXNjMSBpcyBsaW5rZWQgdG8gYXJ0aWZhY3QiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzEsX1NVR1FnRHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OndwRGVzYzEiIHVzYWdlR3VpZGFuY2U9InVzYWdlOndwRGVzYzEiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICByZWZpbmVkOiB3cERlc2MxJiMxMzsmIzEwOyZsdDsvcCZndDsiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMiIgYnJpZWZEZXNjcmlwdGlvbj0id3BkZXNjMiBsaW5rZWQgdG8gZGVsaXZlcmFibGUiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IndwRGVzYzIgbGlua2VkIHRvIGRlbGl2ZXJhYmxlIiBwcmVmaXg9InByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ3cERlc2MyLF9UQ3U0SUR6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTp3cGRlc2MyIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTp3cGRlc2MyIiByZWZpbmVkRGVzY3JpcHRpb249InJlZmluZWQ6IHdwZGVzYzIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvb3V0Y29tZV9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX1dyX3k4RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfWHNYcTBEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0id3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogd3BEZXNjMyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ3cERlc2MzIHdpdGggbm8gbGlua3MiIHByZWZpeD0icHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9IndwRGVzYzMgd2l0aCBubyBsaW5rcyxfMXg1N0FEemtFZHE1eXNGT05yMUJHUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJrZXk6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IHdwRGVzYzMgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkOiB3cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS93cERlc2MzIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjpyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJyb2xlRGVzYyB3aXRoIG5vIGxpbmtzIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVEZXNjIHdpdGggbm8gbGlua3MsXzNfVU53RHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5IGNvbnNpZGVyYXRpb246cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6cm9sZURlc2Mgd2l0aCBubyBsaW5rcyIgcmVmaW5lZERlc2NyaXB0aW9uPSJyZWZpbmVkIGRlc2NyaXB0aW9uIDogcm9sZURlc2Mgd2l0aCBubyBsaW5rcyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3JvbGVEZXNjIHdpdGggbm8gbGlua3MiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2sgd2l0aCBubyBsaW5rcyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6dGFzayB3aXRoIG5vIGxpbmtzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrIHdpdGggbm8gbGlua3MsXzVqSllBRHprRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0ia2V5OnRhc2sgd2l0aCBubyBsaW5rcyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6dGFzayB3aXRoIG5vIGxpbmtzIiByZWZpbmVkRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgcmVmaW5lZDp0YXNrIHdpdGggbm8gbGlua3MmIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL3Rhc2sgd2l0aCBubyBsaW5rcyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX1JNTjdFRHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBuYW1lPSJBY3Rpdml0eTIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5MiIgYnJpZWZEZXNjcmlwdGlvbj0iQWN0aXZpdHkyIGNvbnRhaW5pbmQgRG5EIHRhc2tzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBY3Rpdml0eTIgY29udGFpbmluZCBEbkQgdGFza3MiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3Rpdml0eTIsX0JTNmdFVHpsRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIFdvcmtmbG93IERldGFpbDomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgUHJvdmlkZXMgdGhlIG5hdHVyYWwgJmx0O2ImZ3Q7dHJhbnNpdGlvbiBmcm9tIGFuYWx5c2lzJmx0Oy9iJmd0OyBhY3Rpdml0aWVzICZsdDtiJmd0O3RvIGRlc2lnbiZsdDsvYiZndDsgYWN0aXZpdGllcywgaWRlbnRpZnlpbmc6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIGVsZW1lbnRzIGZyb20gYW5hbHlzaXMgZWxlbWVudHMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVzaWduIG1lY2hhbmlzbXMgZnJvbSByZWxhdGVkIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtEZXNjcmliZXMmbHQ7L2ImZ3Q7IHRoZSBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSZhcG9zO3MgJmx0O2ImZ3Q7cnVuLXRpbWUgYW5kIGRlcGxveW1lbnQgYXJjaGl0ZWN0dXJlJmx0Oy9iJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtPcmdhbml6ZXMgdGhlIGltcGxlbWVudGF0aW9uIG1vZGVsJmx0Oy9iJmd0OyBzbyBhcyB0byBtYWtlIHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBzZWFtbGVzcyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YiZndDtNYWludGFpbnMgdGhlIGNvbnNpc3RlbmN5IGFuZCBpbnRlZ3JpdHkgb2YgdGhlIGFyY2hpdGVjdHVyZSZsdDsvYiZndDssIGVuc3VyaW5nIHRoYXQ6ICYjMTM7JiMxMDsgICAgICAgICZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgbmV3IGRlc2lnbiBlbGVtZW50cyBpZGVudGlmaWVkIGZvciB0aGUgY3VycmVudCBpdGVyYXRpb24gYXJlIGludGVncmF0ZWQgd2l0aCBwcmUtZXhpc3RpbmcgZGVzaWduIGVsZW1lbnRzLiYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBtYXhpbWFsIHJlLXVzZSBvZiBhdmFpbGFibGUgY29tcG9uZW50cyBhbmQgZGVzaWduIGVsZW1lbnRzIGlzIGFjaGlldmVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBkZXNpZ24mIzEzOyYjMTA7ICAgICAgICAgICAgICAgIGVmZm9ydC4mIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7L3VsJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEtleSBjb25zaWRlcmF0aW9uczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5MSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTMmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NCYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXk1JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIGtleTYmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAga2V5NyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcykuIFRoZSBpbml0aWFsIGZvY3VzIHdpbGwgYmUgb24gdGhlIGFjdGl2aXRpZXMgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2lkZW50aWZ5X2Rlc2lnbl9tZWNoYW5pc21zLHtDN0EyNkJENy0zODIwLTQ4RDktODMwRi02ODRDM0FGMTU1Rjl9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7e0M3QTI2QkQ3LTM4MjAtNDhEOS04MzBGLTY4NEMzQUYxNTVGOX0mcXVvdDsmZ3Q7SWRlbnRpZnkgRGVzaWduIE1lY2hhbmlzbXMmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvaWRlbnRpZnlfZGVzaWduX2VsZW1lbnRzX3JlYWwtdGltZV9kZXNpZ24sezU4Njk2M0QwLTYwN0QtNEVDMi04RDUzLTI5MkRBRkFCOUM5Mn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7NTg2OTYzRDAtNjA3RC00RUMyLThENTMtMjkyREFGQUI5QzkyfSZxdW90OyZndDtpZGVudGlmeV9kZXNpZ25fZWxlbWVudHNfcmVhbC10aW1lX2Rlc2lnbiZsdDsvYSZndDssIHdpdGggYSBncmVhdCBkZWFsIG9mJiMxMzsmIzEwOyAgICBpdGVyYXRpb24gd2l0aCB0aGUgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2luY29ycG9yYXRlX2Rlc2lnbl9lbGVtZW50cyx7NUM2NDcxNzMtNEUzMi00NTk0LTk2QTktMjU0OEI0NzcyMkZBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s1QzY0NzE3My00RTMyLTQ1OTQtOTZBOS0yNTQ4QjQ3NzIyRkF9JnF1b3Q7Jmd0O0luY29ycG9yYXRlIEV4aXN0aW5nIERlc2lnbiBFbGVtZW50cyZsdDsvYSZndDsgYWN0aXZpdHkgdG8gbWFrZSBzdXJlIHRoYXQgbmV3JiMxMzsmIzEwOyAgICBlbGVtZW50cyBkbyBub3QgZHVwbGljYXRlIGZ1bmN0aW9uYWxpdHkgb2YgZXhpc3RpbmcgZWxlbWVudHMuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBcyB0aGUgZGVzaWduIGVtZXJnZXMsIGNvbmN1cnJlbmN5IGFuZCBkaXN0cmlidXRpb24gaXNzdWVzIGFyZSBpbnRyb2R1Y2VkIGluIHRoZSBhY3Rpdml0aWVzICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7JiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy9kZXNjcmliZV9ydW50aW1lX2FyY2hpdGVjdHVyZSx7NEQzNUMwMzgtQTJEMC00OEI4LTlFQ0QtNTI3MTdGRUFFMzNBfS5odG1sJnF1b3Q7JiMxMzsmIzEwOyAgICBndWlkPSZxdW90O3s0RDM1QzAzOC1BMkQwLTQ4QjgtOUVDRC01MjcxN0ZFQUUzM0F9JnF1b3Q7Jmd0O0Rlc2NyaWJlIHRoZSBSdW4tdGltZSBBcmNoaXRlY3R1cmUmbHQ7L2EmZ3Q7IGFuZCAmbHQ7YSBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyYjMTM7JiMxMDsgICAgaHJlZj0mcXVvdDtyZXNvdXJjZXMvZGVzY3JpYmVfZGlzdHJpYnV0aW9uLHs2QTExMjgwOC0wQTkwLTQyN0EtQkFCOS1FMTRGM0ZCRjcyQjV9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezZBMTEyODA4LTBBOTAtNDI3QS1CQUI5LUUxNEYzRkJGNzJCNX0mcXVvdDsmZ3Q7RGVzY3JpYmUgRGlzdHJpYnV0aW9uJmx0Oy9hJmd0OywgcmVzcGVjdGl2ZWx5LiBBcyB0aGVzZSBpc3N1ZXMgYXJlIGNvbnNpZGVyZWQsJiMxMzsmIzEwOyAgICBjaGFuZ2VzIHRvIGRlc2lnbiBlbGVtZW50cyBtYXkgYmUgcmVxdWlyZWQgdG8gc3BsaXQgYmVoYXZpb3IgYWNyb3NzIHByb2Nlc3NlcywgdGhyZWFkcyBvciBub2Rlcy4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFzIHRoZSBpbmRpdmlkdWFsIG1vZGVscyBhcmUgcmVmaW5lZCB0byBpbmNvcnBvcmF0ZSB0aGUgYXJjaGl0ZWN0dXJhbCBkZWNpc2lvbnMsIHRoZSByZXN1bHRzIGFyZSBkb2N1bWVudGVkIGluJiMxMzsmIzEwOyAgICByZXNwZWN0aXZlIHZpZXcgc2VjdGlvbnMgaW4gdGhlIFNvZnR3YXJlIEFyY2hpdGVjdHVyZSBEb2N1bWVudCAoZS5nLiwgYXMgdGhlIERlc2lnbiBNb2RlbCBpcyByZWZpbmVkLCB0aGUgTG9naWNhbCBWaWV3JiMxMzsmIzEwOyAgICBvZiB0aGUgU29mdHdhcmUgQXJjaGl0ZWN0dXJlIERvY3VtZW50IGlzIHJlZmluZWQsIGFzIHdlbGwpLiBUaGUgcmVzdWx0aW5nIGFyY2hpdGVjdHVyZSBpcyByZXZpZXdlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2Ugb2YgdGhpcyBhY3Rpdml0eSBpcyB0byBoYXZlIHRhc2tzIHRoYXQgYXJlIGFzc29jaWF0ZWQgdG8gb3RoZXIgdGFza3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7Jmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyBzcmM9JnF1b3Q7cmVzb3VyY2VzL3J1cC5qcGcmcXVvdDsgd2lkdGg9JnF1b3Q7MTc2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGFsdGVybmF0aXZlcz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBBbHRlcmFudGl2ZXM6JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O29sJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIEFsdGVyMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBBbHRlcjImIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQWx0ZXIzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSB1c2FiaWxpdHksIHBlcmZvcm1hbmNlLCBzY2FsaW5nLCBwcm9jZXNzIGFuZCB0aHJlYWQgc3luY2hyb25pemF0aW9uLCBhbmQmIzEzOyYjMTA7ICAgIGRpc3RyaWJ1dGlvbi4gVGhlIHRlYW0gc2hvdWxkIGFsc28gaW5jbHVkZSBtZW1iZXJzIHdpdGggZG9tYWluIGV4cGVyaWVuY2Ugd2hvIGNhbiBpZGVudGlmeSBrZXkgYWJzdHJhY3Rpb25zLiBUaGUgdGVhbSYjMTM7JiMxMDsgICAgc2hvdWxkIGFsc28gaGF2ZSBleHBlcmllbmNlIHdpdGggbW9kZWwgb3JnYW5pemF0aW9uIGFuZCBsYXllcmluZy4gVGhlIHRlYW0gd2lsbCBuZWVkIHRvIGJlIGFibGUgdG8gcHVsbCBhbGwgdGhlc2UmIzEzOyYjMTA7ICAgIGRpc3BhcmF0ZSB0aHJlYWRzIGludG8gYSBjb2hlc2l2ZSwgY29oZXJlbnQgKGFsYmVpdCBwcmVsaW1pbmFyeSkgYXJjaGl0ZWN0dXJlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQmVjYXVzZSB0aGUgZm9jdXMgb2YgdGhlIGFyY2hpdGVjdHVyZSBlZmZvcnQgaXMgc2hpZnRpbmcgdG93YXJkIGltcGxlbWVudGF0aW9uIGlzc3VlcywgZ3JlYXRlciBhdHRlbnRpb24gbmVlZHMgdG8gYmUmIzEzOyYjMTA7ICAgIHBhaWQgdG8gc3BlY2lmaWMgdGVjaG5vbG9neSBpc3N1ZXMuIFRoaXMgd2lsbCBmb3JjZSB0aGUgYXJjaGl0ZWN0dXJlIHRlYW0gdG8gc2hpZnQgbWVtYmVycyBvciBleHBhbmQgdG8gaW5jbHVkZSBwZW9wbGUmIzEzOyYjMTA7ICAgIHdpdGggZGlzdHJpYnV0aW9uIGFuZCBkZXBsb3ltZW50IGV4cGVydGlzZSAoaWYgdGhvc2UgaXNzdWVzIGFyZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQpLiBJbiBvcmRlciB0byB1bmRlcnN0YW5kJiMxMzsmIzEwOyAgICB0aGUgcG90ZW50aWFsIGltcGFjdCBvZiB0aGUgc3RydWN0dXJlIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBtb2RlbCBvbiB0aGUgZWFzZSBvZiBpbnRlZ3JhdGlvbiwgZXhwZXJ0aXNlIGluIHRoZSBzb2Z0d2FyZSYjMTM7JiMxMDsgICAgYnVpbGQgbWFuYWdlbWVudCBwcm9jZXNzIGlzIHVzZWZ1bCB0byBoYXZlLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQXQgdGhlIHNhbWUgdGltZSwgaXQgaXMgZXNzZW50aWFsIHRoYXQgdGhlIGFyY2hpdGVjdHVyZSB0ZWFtIG5vdCBiZSBjb21wb3NlZCBvZiBhIGxhcmdlIGV4dGVuZGVkIHRlYW0uIEEgc3RyYXRlZ3kgZm9yJiMxMzsmIzEwOyAgICBjb3VudGVyaW5nIHRoaXMgdHJlbmQgaXMgdG8gcmV0YWluIGEgcmVsYXRpdmVseSBzbWFsbCBjb3JlIHRlYW0gd2l0aCBhIHNhdGVsbGl0ZSBncm91cCBvZiBleHRlbmRlZCB0ZWFtIG1lbWJlcnMgdGhhdCYjMTM7JiMxMDsgICAgYXJlIGJyb3VnaHQgaW4gYXMgJnF1b3Q7Y29uc3VsdGFudHMmcXVvdDsgb24ga2V5IGlzc3VlcyZsdDtiJmd0Oy4mbHQ7L2ImZ3Q7IFRoaXMgc3RydWN0dXJlIGFsc28gd29ya3Mgd2VsbCBmb3Igc21hbGxlciBwcm9qZWN0cyB3aGVyZSYjMTM7JiMxMDsgICAgc3BlY2lmaWMgZXhwZXJ0aXNlIG1heSBiZSBib3Jyb3dlZCBvciBjb250cmFjdGVkIGZyb20gb3RoZXIgb3JnYW5pemF0aW9uczsgdGhleSBjYW4gYmUgYnJvdWdodCBpbiBhcyBzcGVjaWZpYyBpc3N1ZXMmIzEzOyYjMTA7ICAgIG5lZWQgdG8gYmUgYWRkcmVzc2VkLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL0FjdGl2aXR5MiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3JvbGVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcm9hZG1hcF9CMSI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQjEiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL2NoZWNrbGlzdF9CMSI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBCL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0IxL3doaXRlcGFwZXJfQjEiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvY29uY2VwdF9CMSI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS9leGFtcGxlX0IxIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvZ3VpZGVsaW5lX0IxIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvcmV1c2FibGVfYXNzZXRfQjEiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvQWN0aXZpdHk+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMSAiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF8wRFJfUUVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEmYW1wO25ic3A7IGtleSIgdXNhZ2VHdWlkYW5jZT0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUYXNrIEExJmFtcDtuYnNwOyBndWlkYW5jZSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTYmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvc3luY2VkLmdpZiZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE2JnF1b3Q7IC8mZ3Q7JiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7aW1nIGhlaWdodD0mcXVvdDsxNiZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7JiMxMzsmIzEwOyAgICBzcmM9JnF1b3Q7ZmlsZTovLy9DOi9Eb2N1bWVudHMlMjBhbmQlMjBTZXR0aW5ncy9BZG1pbmlzdHJhdG9yL0lCTS9NZXRob2RMaWJyYXJpZXMvUGFyaXMvUGFyaXMvUGx1ZyUyMEEvY2FwYWJpbGl0eXBhdHRlcm5zL3Jlc291cmNlcy9oZWxwYm9vay5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsxNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiByZWZpbmVkRGVzY3JpcHRpb249IlRhc2sgQTEmYW1wO25ic3A7IHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsXzBEazZNRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iUm9sZSBBMSBrZXkiIHVzYWdlR3VpZGFuY2U9IlJvbGUgQTEgZ3VpZGFuY2UiIHJlZmluZWREZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEExIHJlZmluZWQgZGVzYyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7NzEmcXVvdDsgYWx0PSZxdW90OyZxdW90OyYjMTM7JiMxMDsgICAgc3JjPSZxdW90O2ZpbGU6Ly8vQzovRG9jdW1lbnRzJTIwYW5kJTIwU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9JQk0vTWV0aG9kTGlicmFyaWVzL1BhcmlzL1BhcmlzL1BsdWclMjBBL2NhcGFiaWxpdHlwYXR0ZXJucy9yZXNvdXJjZXMvcnVwLmpwZyZxdW90OyYjMTM7JiMxMDsgICAgIHdpZHRoPSZxdW90OzE3NiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMSI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsXzBEazZNVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBSb2xlIEEyIGtleSYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmx0O2ltZyBoZWlnaHQ9JnF1b3Q7MTY3JnF1b3Q7IGFsdD0mcXVvdDsmcXVvdDsmIzEzOyYjMTA7ICAgIHNyYz0mcXVvdDtmaWxlOi8vL0M6L0RvY3VtZW50cyUyMGFuZCUyMFNldHRpbmdzL0FkbWluaXN0cmF0b3IvSUJNL01ldGhvZExpYnJhcmllcy9QYXJpcy9QYXJpcy9QbHVnJTIwQS9jYXBhYmlsaXR5cGF0dGVybnMvcmVzb3VyY2VzL3J1cDFfYS5naWYmcXVvdDsmIzEzOyYjMTA7ICAgICB3aWR0aD0mcXVvdDsyNiZxdW90OyAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7IiB1c2FnZUd1aWRhbmNlPSJSb2xlIEEyIHVzYWdlIiByZWZpbmVkRGVzY3JpcHRpb249IlJvbGUgQTIgcmVmaW5lZCBkZXNjIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0EyIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfMER1ck1FREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF8wRHVyTVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTEsXzBEdXJNa0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsXzBEdXJNMERFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsXzBFVWhFRURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsXzBFVWhFVURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMSxfMEVVaEVrREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFRhc2tEZXNjcmlwdG9yIG5hbWU9InRhc2tfQTIiIGJyaWVmRGVzY3JpcHRpb249IlRhc2sgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlRhc2sgQTIgIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19BMixfMjg4N0VFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSJUYXNrIEEyIGtleSIgdXNhZ2VHdWlkYW5jZT0iVGFzayBBMiBndWlkYW5jZSIgcmVmaW5lZERlc2NyaXB0aW9uPSJUYXNrIEEyIHJlZmluZWQgZGVzY3JpcHRpb24iPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL3Rhc2tfQTIiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvZGVsaXZlcmFibGVfQTIiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfMjlabkFFREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0EyLF8yOVpuQVVERUVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL2FydGlmYWN0X0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsXzI5Wm5Ba0RFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsXzI5c2g4RURFRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfMjlzaDhVREVFZHFPOU0zZnVrWUFfQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkyIj4KLTwvZ3JhcGhFbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5MiI+Ci08L2dyYXBoRWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvSXRlcmF0aW9uMS9BY3Rpdml0eTIiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxJdGVyYXRpb24gbmFtZT0iSXRlcmF0aW9uMSIgYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpdGVyYXRpb24gY29udGFpbnMgdHdvIGFjdGl2aXRpZXMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ikl0ZXJhdGlvbjEiIHByZWZpeD0iUHJlZml4IiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJ0cnVlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9Ikl0ZXJhdGlvbjEsX0VGVnJ3VHppRWRxNXlzRk9OcjFCR1EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGlzIHdvcmtmbG93IGRldGFpbCBoYXMgdGhlIGZvbGxvd2luZyBnb2FsczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgQ3JlYXRlIGFuIGluaXRpYWwgc2tldGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIHN5c3RlbSAmIzEzOyYjMTA7ICAgICAgICAmbHQ7dWwmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgICAgIERlZmluZSBhbiBpbml0aWFsIHNldCBvZiBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgZWxlbWVudHMgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgYW5hbHlzaXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIGFuIGluaXRpYWwgc2V0IG9mIGFuYWx5c2lzIG1lY2hhbmlzbXMmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICAgICAgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBpbml0aWFsIGxheWVyaW5nIGFuZCBvcmdhbml6YXRpb24gb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgICAgICAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIHVzZS1jYXNlIHJlYWxpemF0aW9ucyB0byBiZSBhZGRyZXNzZWQgaW4gdGhlIGN1cnJlbnQgaXRlcmF0aW9uJiMxMzsmIzEwOyAgICAgICAgICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0Oy91bCZndDsmIzEzOyYjMTA7ICAgICZsdDsvbGkmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgSWRlbnRpZnkgYW5hbHlzaXMgY2xhc3NlcyBmcm9tIHRoZSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgdXNlIGNhc2VzJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsgICAgJmx0O2xpJmd0OyYjMTM7JiMxMDsgICAgICAgIFVwZGF0ZSB0aGUgdXNlLWNhc2UgcmVhbGl6YXRpb25zIHdpdGggYW5hbHlzaXMgY2xhc3MgaW50ZXJhY3Rpb25zJiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L3VsJmd0OyIga2V5Q29uc2lkZXJhdGlvbnM9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgS2V5IGNvbnNpZGVyYXRpb25zOiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDt1bCZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkxMSYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkyMiYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICBrZXkzMyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7Jmx0Oy91bCZndDsiIHVzYWdlR3VpZGFuY2U9IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHdvcmsgaXMgYmVzdCBkb25lIGluIHNldmVyYWwgc2Vzc2lvbnMsIHBlcmhhcHMgcGVyZm9ybWVkIG92ZXIgYSBmZXcgZGF5cyAob3Igd2Vla3MgYW5kIG1vbnRocyBmb3IgdmVyeSBsYXJnZSYjMTM7JiMxMDsgICAgc3lzdGVtcyksIHdpdGggaXRlcmF0aW9uIGJldHdlZW4gJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL2FyY2hpdGVjdHVyYWxfYW5hbHlzaXMsezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0uaHRtbCZxdW90OyYjMTM7JiMxMDsgICAgZ3VpZD0mcXVvdDt7OENCNDg0MDItRDRDNS00RTE3LUJCMzMtNTA3MzE1Q0IxQkJGfSZxdW90OyZndDtBcmNoaXRlY3R1cmFsIEFuYWx5c2lzJmx0Oy9hJmd0OyBhbmQgJmx0O2EgY2xhc3M9JnF1b3Q7ZWxlbWVudExpbmsmcXVvdDsmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7LiBQZXJmb3JtIGFuIGluaXRpYWwgcGFzcyBhdCB0aGUgYXJjaGl0ZWN0dXJlIGluICZsdDthJiMxMzsmIzEwOyAgICBjbGFzcz0mcXVvdDtlbGVtZW50TGluayZxdW90OyBocmVmPSZxdW90O3Jlc291cmNlcy9hcmNoaXRlY3R1cmFsX2FuYWx5c2lzLHs4Q0I0ODQwMi1ENEM1LTRFMTctQkIzMy01MDczMTVDQjFCQkZ9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezhDQjQ4NDAyLUQ0QzUtNEUxNy1CQjMzLTUwNzMxNUNCMUJCRn0mcXVvdDsmZ3Q7QXJjaGl0ZWN0dXJhbCBBbmFseXNpcyZsdDsvYSZndDssIHRoZW4gY2hvb3NlIGFyY2hpdGVjdHVyYWxseSBzaWduaWZpY2FudCB1c2UmIzEzOyYjMTA7ICAgIGNhc2VzLCBwZXJmb3JtaW5nICZsdDthIGNsYXNzPSZxdW90O2VsZW1lbnRMaW5rJnF1b3Q7IGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3VzZV9jYXNlX2FuYWx5c2lzLHsyODAxNDYxNS1BNjJGLTQ1MkQtQjgyMS0zMEM3Q0FCMEVDNDR9Lmh0bWwmcXVvdDsmIzEzOyYjMTA7ICAgIGd1aWQ9JnF1b3Q7ezI4MDE0NjE1LUE2MkYtNDUyRC1CODIxLTMwQzdDQUIwRUM0NH0mcXVvdDsmZ3Q7VXNlLUNhc2UgQW5hbHlzaXMmbHQ7L2EmZ3Q7IG9uIGVhY2ggb25lLiBBZnRlciAob3IgYXMpIGVhY2ggdXNlIGNhc2UgaXMmIzEzOyYjMTA7ICAgIGFuYWx5emVkLCB1cGRhdGUgdGhlIGFyY2hpdGVjdHVyZSBhcyBuZWVkZWQgdG8gcmVmbGVjdCBhZGFwdGF0aW9ucyByZXF1aXJlZCB0byBhY2NvbW1vZGF0ZSBuZXcgYmVoYXZpb3Igb2YgdGhlIHN5c3RlbSYjMTM7JiMxMDsgICAgYW5kIHRvIGFkZHJlc3MgcG90ZW50aWFsIGFyY2hpdGVjdHVyYWwgcHJvYmxlbXMgd2hpY2ggYXJlIGlkZW50aWZpZWQuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBXaGVyZSB0aGUgYXJjaGl0ZWN0dXJlIGFscmVhZHkgZXhpc3RzIChlaXRoZXIgZnJvbSBhIHByaW9yIHByb2plY3Qgb3IgaXRlcmF0aW9uKSwgY2hhbmdlIHJlcXVlc3RzIG1heSBuZWVkIHRvIGJlJiMxMzsmIzEwOyAgICBjcmVhdGVkIHRvIGNoYW5nZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgYmVoYXZpb3IgdGhlIHN5c3RlbSBtdXN0IHN1cHBvcnQuIFRoZXNlIGNoYW5nZXMgbWF5IGJlIHRvIGFueSYjMTM7JiMxMDsgICAgYXJ0aWZhY3QgaW4gdGhlIHByb2Nlc3MsIGRlcGVuZGluZyBvbiB0aGUgc2NvcGUgb2YgdGhlIGNoYW5nZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFB1cnBvc2U6IFRoaXMgaXRlcnRhaW9uIGlzIGNyZWF0ZWQgZm9yIHR3byBhY3Rpdml0aWVzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgJmFtcDtuYnNwOyZsdDtpbWcgaGVpZ2h0PSZxdW90OzQ3NCZxdW90OyBhbHQ9JnF1b3Q7JnF1b3Q7IHNyYz0mcXVvdDtyZXNvdXJjZXMvcnVwX3BsYXRmb3JtLmpwZyZxdW90OyB3aWR0aD0mcXVvdDs1MDQmcXVvdDsgLyZndDsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIEFsdGVybmF0aXZlczomIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7b2wmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7bGkmZ3Q7JiMxMzsmIzEwOyAgICAgICAgJmx0O2EgaHJlZj0mcXVvdDsuLi9yb2xlcy9yb2xlX0ExLnhtaSZxdW90OyB0YXJnZXQ9JnF1b3Q7X2JsYW5rJnF1b3Q7Jmd0O3JvbGVfQTEueG1pJmx0Oy9hJmd0OyYjMTM7JiMxMDsgICAgJmx0Oy9saSZndDsmIzEzOyYjMTA7ICAgICZsdDtsaSZndDsmIzEzOyYjMTA7ICAgICAgICAmbHQ7YSBocmVmPSZxdW90Oy4uL3Rhc2tzL3Rhc2tfQTIueG1pJnF1b3Q7IHRhcmdldD0mcXVvdDtfYmxhbmsmcXVvdDsmZ3Q7dGFza19BMi54bWkmbHQ7L2EmZ3Q7JiMxMzsmIzEwOyAgICAmbHQ7L2xpJmd0OyYjMTM7JiMxMDsmbHQ7L29sJmd0OyIgaG93dG9TdGFmZj0iJmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBUaGVzZSBhY3Rpdml0aWVzIGFyZSBiZXN0IGNhcnJpZWQgb3V0IGJ5IGEgc21hbGwgdGVhbSBzdGFmZmVkIGJ5IGNyb3NzLWZ1bmN0aW9uYWwgdGVhbSBtZW1iZXJzLiBJc3N1ZXMgdGhhdCBhcmUmIzEzOyYjMTA7ICAgIHR5cGljYWxseSBhcmNoaXRlY3R1cmFsbHkgc2lnbmlmaWNhbnQgaW5jbHVkZSBwZXJmb3JtYW5jZSwgc2NhbGluZywgcHJvY2VzcyBhbmQgdGhyZWFkIHN5bmNocm9uaXphdGlvbiwgYW5kJiMxMzsmIzEwOyAgICBkaXN0cmlidXRpb24uIFRoZSB0ZWFtIHNob3VsZCBhbHNvIGluY2x1ZGUgbWVtYmVycyB3aXRoIGRvbWFpbiBleHBlcmllbmNlIHdobyBjYW4gaWRlbnRpZnkga2V5IGFic3RyYWN0aW9ucy4gVGhlIHRlYW0mIzEzOyYjMTA7ICAgIHNob3VsZCBhbHNvIGhhdmUgZXhwZXJpZW5jZSB3aXRoIG1vZGVsIG9yZ2FuaXphdGlvbiBhbmQgbGF5ZXJpbmcuIFRoZSB0ZWFtIHdpbGwgbmVlZCB0byBiZSBhYmxlIHRvIHB1bGwgYWxsIHRoZXNlJiMxMzsmIzEwOyAgICBkaXNwYXJhdGUgdGhyZWFkcyBpbnRvIGEgY29oZXNpdmUsIGNvaGVyZW50IChhbGJlaXQgcHJlbGltaW5hcnkpIGFyY2hpdGVjdHVyZS4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEvQWN0aXZpdHkxL0FjdGl2aXR5MSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0FjdGl2aXR5Mi9BY3Rpdml0eTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxyb2FkbWFwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcm9hZG1hcF9BMiI+Ci08L3JvYWRtYXBzPgotPHN1cHBvcnRpbmdNYXRlcmlhbHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3N1cHBvcnRpbmdfbWF0ZXJpYWxfQTIiPgotPC9zdXBwb3J0aW5nTWF0ZXJpYWxzPgotPGNoZWNrbGlzdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL2NoZWNrbGlzdF9BMiI+Ci08L2NoZWNrbGlzdHM+Ci08Y29uY2VwdHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3doaXRlcGFwZXJfQTIiPgotPC9jb25jZXB0cz4KLTxjb25jZXB0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvY29uY2VwdF9BMiI+Ci08L2NvbmNlcHRzPgotPGV4YW1wbGVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9leGFtcGxlX0EyIj4KLTwvZXhhbXBsZXM+Ci08Z3VpZGVsaW5lcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvZ3VpZGVsaW5lX0EyIj4KLTwvZ3VpZGVsaW5lcz4KLTxyZXVzYWJsZUFzc2V0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvcmV1c2FibGVfYXNzZXRfQTIiPgotPC9yZXVzYWJsZUFzc2V0cz4KLTwvSXRlcmF0aW9uPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxL0l0ZXJhdGlvbjEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQaGFzZSBuYW1lPSJQaGFzZTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUGhhc2UxIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iUGhhc2UxLF9EYWtRY0R6aUVkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9QaGFzZTEvUGhhc2UxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9JdGVyYXRpb24xL0l0ZXJhdGlvbjEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTwvUGhhc2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMvUGhhc2UxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08Q2FwYWJpbGl0eVBhdHRlcm4gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZjpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF80c0N0c1R6Z0VkcTV5c0ZPTnIxQkdRIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiZsdDtwJmd0OyYjMTM7JiMxMDsgICAgVGhlIHN1YmNhdGVnb3JpZXMgb2YgcHJvY2VzcyBhcmUgZGVsaXZlcnkgcHJvY2VzcyBhbmQgY2FwYWJpbGl0eSBwYXR0ZXJuLiZhbXA7bmJzcDsgQSBkZWxpdmVyeSBwcm9jZXNzIGRlZmluZXMgYSBjb21wbGV0ZSYjMTM7JiMxMDsgICAgb3IgZW5kLXRvLWVuZCBwcm9jZXNzLiZhbXA7bmJzcDsgQSBjYXBhYmlsaXR5IHBhdHRlcm4gaXMgYSBwcm9jZXNzIGZyYWdtZW50IHVzZWQgdG8gY29tcG9zZSBhIGRlbGl2ZXJ5IHByb2Nlc3MuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICAmYW1wO25ic3A7JiMxMzsmIzEwOyZsdDsvcCZndDsiIGtleUNvbnNpZGVyYXRpb25zPSJUaGlzIGNhcGFiaWxpdHkgcGF0dGVybiBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGNvbnN0cnVjdCBhbiBJbmNlcHRpb24gcGhhc2UgaXRlcmF0aW9uIGluIGEgZGVsaXZlcnkgcHJvY2Vzcy4mYW1wO25ic3A7IENvcHkgb3ImIzEzOyYjMTA7ZXh0ZW5kIHRoZSBwYXR0ZXJuJmFtcDtuYnNwO3JlcGVhdGVkbHkgdG8gY3JlYXRlIGFzIG1hbnkgaXRlcmF0aW9ucyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBwYXJ0aWN1bGFyIGRlbGl2ZXJ5IHByb2Nlc3MuIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IlRoaXMgY2FwYWJpbGl0eSBwYXR0ZXJuIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY29uc3RydWN0IGFuIEluY2VwdGlvbiBwaGFzZSBpdGVyYXRpb24gaW4gYSBkZWxpdmVyeSBwcm9jZXNzLiZhbXA7bmJzcDsgQ29weSBvciYjMTM7JiMxMDtleHRlbmQgdGhlIHBhdHRlcm4mYW1wO25ic3A7cmVwZWF0ZWRseSB0byBjcmVhdGUgYXMgbWFueSBpdGVyYXRpb25zIGFzIG5lY2Vzc2FyeSBmb3IgdGhlIHBhcnRpY3VsYXIgZGVsaXZlcnkgcHJvY2Vzcy4gJmx0O2JyIC8mZ3Q7JiMxMzsmIzEwOyZsdDticiAvJmd0OyIgYWx0ZXJuYXRpdmVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBob3d0b1N0YWZmPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiBleHRlcm5hbElkPSJFWHRlcm5hbCBJRDpDUDEgd2l0aCBhbGwgZWxlbWVudHMiIHNjb3BlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRvIGV4cGxhaW4gdGhlIHdvcmsgaW52b2x2ZWQgaW4gdGhlIEFuYWx5c2lzIGFuZCBEZXNpZ24gZGlzY2lwbGluZSwgdGhlIGFjdGl2aXRpZXMgYW5kIHdvcmsgcHJvZHVjdHMgYXJlIG9yZ2FuaXplZCBpbnRvJiMxMzsmIzEwOyAgICBhIGNhcGFiaWxpdHkgcGF0dGVybiBmb3IgdGhlIGRpc2NpcGxpbmUuJiMxMzsmIzEwOyZsdDsvcCZndDsmIzEzOyYjMTA7Jmx0O3AmZ3Q7JiMxMzsmIzEwOyAgICBJbiB0aGUgSW5jZXB0aW9uIFBoYXNlLCBhbmFseXNpcyBhbmQgZGVzaWduIGlzIGNvbmNlcm5lZCB3aXRoIGVzdGFibGlzaGluZyB3aGV0aGVyIHRoZSBzeXN0ZW0gYXMgZW52aXNpb25lZCBpcyYjMTM7JiMxMDsgICAgZmVhc2libGUsIGFuZCB3aXRoIGFzc2Vzc2luZyBwb3RlbnRpYWwgdGVjaG5vbG9naWVzIGZvciB0aGUgc29sdXRpb24gKGluICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hcmNoc3luLmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtQZXJmb3JtIEFyY2hpdGVjdHVyYWwgU3ludGhlc2lzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiBJZiBpdCBpcyBmZWx0IHRoYXQgbGl0dGxlIHJpc2sgYXR0YWNoZXMgdG8gdGhlIGRldmVsb3BtZW50JiMxMzsmIzEwOyAgICAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkb21haW4gaXMgd2VsbCB1bmRlcnN0b29kLCB0aGUgc3lzdGVtIGlzIG5vdCBub3ZlbCwgYW5kIHNvIG9uKSB0aGVuIHRoaXMgd29ya2Zsb3cgZGV0YWlsIG1heSYjMTM7JiMxMDsgICAgYmUgb21pdHRlZC4mIzEzOyYjMTA7Jmx0Oy9wJmd0OyYjMTM7JiMxMDsmbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBlYXJseSBFbGFib3JhdGlvbiBQaGFzZSBmb2N1c2VzIG9uIGNyZWF0aW5nIGFuIGluaXRpYWwgYXJjaGl0ZWN0dXJlIGZvciB0aGUgc3lzdGVtICggJmx0O2EmIzEzOyYjMTA7ICAgIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQxLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0RlZmluZSBhIENhbmRpZGF0ZSBBcmNoaXRlY3R1cmUmbHQ7L2ZvbnQmZ3Q7Jmx0Oy9hJmd0OykgdG8gcHJvdmlkZSBhIHN0YXJ0aW5nJiMxMzsmIzEwOyAgICBwb2ludCBmb3IgdGhlIG1haW4gYW5hbHlzaXMgd29yay4gSWYgdGhlIGFyY2hpdGVjdHVyZSBhbHJlYWR5IGV4aXN0cyAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIHByb2R1Y2VkIGluIHByZXZpb3VzJiMxMzsmIzEwOyAgICBpdGVyYXRpb25zLCBpbiBwcmV2aW91cyBwcm9qZWN0cywgb3IgaXMgb2J0YWluZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmcmFtZXdvcmspLCB0aGUgZm9jdXMgb2YgdGhlIHdvcmsgY2hhbmdlcyB0byYjMTM7JiMxMDsgICAgcmVmaW5pbmcgdGhlIGFyY2hpdGVjdHVyZSAoICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQyLmh0bSZxdW90OyZndDsmbHQ7Zm9udCBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O1JlZmluZSB0aGUgQXJjaGl0ZWN0dXJlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspJiMxMzsmIzEwOyAgICBhbmQgYW5hbHl6aW5nIGJlaGF2aW9yIGFuZCBjcmVhdGluZyBhbiBpbml0aWFsIHNldCBvZiBlbGVtZW50cyB3aGljaCBwcm92aWRlIHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvciAoICZsdDthJiMxMzsmIzEwOyAgICBocmVmPSZxdW90O3Jlc291cmNlcy93ZnNfYW5kMy5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtBbmFseXplIEJlaGF2aW9yJmx0Oy9mb250Jmd0OyZsdDsvYSZndDspLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZsdDtwJmd0OyYjMTM7JiMxMDsgICAgQWZ0ZXIgdGhlIGluaXRpYWwgZWxlbWVudHMgYXJlIGlkZW50aWZpZWQsIHRoZXkgYXJlIGZ1cnRoZXIgcmVmaW5lZC4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZzX2FuZDQuaHRtJnF1b3Q7Jmd0OyZsdDtmb250JiMxMzsmIzEwOyAgICBjb2xvcj0mcXVvdDsjMDAwMGZmJnF1b3Q7Jmd0O0Rlc2lnbiBDb21wb25lbnRzJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgcHJvZHVjZSBhIHNldCBvZiBjb21wb25lbnRzIHdoaWNoIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yIHRvJiMxMzsmIzEwOyAgICBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb24gdGhlIHN5c3RlbS4gSWYgdGhlIHN5c3RlbSBpbmNsdWRlcyBhIGRhdGFiYXNlLCB0aGVuICZsdDthIGhyZWY9JnF1b3Q7cmVzb3VyY2VzL3dmc19hbmQ3Lmh0bSZxdW90OyZndDsmbHQ7Zm9udCYjMTM7JiMxMDsgICAgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtEZXNpZ24gdGhlIERhdGFiYXNlJmx0Oy9mb250Jmd0OyZsdDsvYSZndDsgb2NjdXJzIGluIHBhcmFsbGVsLiBUaGUgcmVzdWx0IGlzIGFuIGluaXRpYWwgc2V0IG9mIGNvbXBvbmVudHMgd2hpY2ggYXJlJiMxMzsmIzEwOyAgICBmdXJ0aGVyIHJlZmluZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtyZXNvdXJjZXMvd2ZkX2ltcC5odG0mcXVvdDsmZ3Q7Jmx0O2ZvbnQgY29sb3I9JnF1b3Q7IzAwMDBmZiZxdW90OyZndDtJbXBsZW1lbnRhdGlvbiZsdDsvZm9udCZndDsmbHQ7L2EmZ3Q7LiZsdDticiAvJmd0OyYjMTM7JiMxMDsmbHQ7L3AmZ3Q7JiMxMzsmIzEwOyZhbXA7bmJzcDsmbHQ7YnIgLyZndDsmIzEzOyYjMTA7Jmx0O2JyIC8mZ3Q7IiB1c2FnZU5vdGVzPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIFRoZSBzdWJjYXRlZ29yaWVzIG9mIHByb2Nlc3MgYXJlIGRlbGl2ZXJ5IHByb2Nlc3MgYW5kIGNhcGFiaWxpdHkgcGF0dGVybi4mYW1wO25ic3A7IEEgZGVsaXZlcnkgcHJvY2VzcyBkZWZpbmVzIGEgY29tcGxldGUmIzEzOyYjMTA7ICAgIG9yIGVuZC10by1lbmQgcHJvY2Vzcy4mYW1wO25ic3A7IEEgY2FwYWJpbGl0eSBwYXR0ZXJuIGlzIGEgcHJvY2VzcyBmcmFnbWVudCB1c2VkIHRvIGNvbXBvc2UgYSBkZWxpdmVyeSBwcm9jZXNzLiYjMTM7JiMxMDsmbHQ7L3AmZ3Q7Ij4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL1BoYXNlMS9QaGFzZTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NDb21wb25lbnQgbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9ImFjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iYnJpZWY6IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwcmVmaXg9IlByZWZpeCIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iLF9sRGhsOEVERkVkcU85TTNmdWtZQV9BIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249Im1haW46IEFjdGl2aXR5IGZvciB2YXJpYWJpbGl0eSBlbGVtZW50cyIga2V5Q29uc2lkZXJhdGlvbnM9ImtleTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiB1c2FnZUd1aWRhbmNlPSJ1c2FnZTogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJwdXJwb3NlOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGFsdGVybmF0aXZlcz0iYWx0ZXJuYXRpdmVzOiBBY3Rpdml0eSBmb3IgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGhvd3RvU3RhZmY9ImhvdyB0byBzdGFmZjogQWN0aXZpdHkgZm9yIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EzIiBicmllZkRlc2NyaXB0aW9uPSJicmllZjogVGFzayBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBBMyBleHRlbmRzIFRhc2sgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0EzLF9HcVgxTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvdGFza19BMyI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3Rhc2tfQTMiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2RlbGl2ZXJhYmxlX0EyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy90YXNrX0EzIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMy8sX29VbHVFRURGRWRxTzlNM2Z1a1lBX0EvU3RlcCBBMy4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0EzLyxfb1VsdUVFREZFZHFPOU0zZnVrWUFfQS9TdGVwIEEzLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTMvLF9vVWx1RUVERkVkcU85TTNmdWtZQV9BL1N0ZXAgQTMuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMi90YXNrX0EyLF83NU5Rd0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTMiIGJyaWVmRGVzY3JpcHRpb249ImJyaWVmIDogUm9sZSBBMyIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBBMyBleHRlbmRzIFJvbGUgQTIiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMyxfR3FYMU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTMiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0EzIj4KLTwvUm9sZT4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvbW9kaWZpZXM+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgZXh0ZW5kZWQgYnkgUm9sZSBBMyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0EyLF9HcWhtTUVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvcm9sZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxSb2xlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL2FydGlmYWN0X0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvZGVsaXZlcmFibGVfQTIiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMSxfR3FobU1VRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL3JvbGVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9yb2xlX0ExIj4KLTwvUm9sZT4KLTwvUm9sZURlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0EyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTIsX0dxaG1Na0RRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImRlbGl2ZXJhYmxlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJEZWxpdmVyYWJsZSBBMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsaXZlcmFibGUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iZGVsaXZlcmFibGVfQTIsX0dxaG1NMERRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9kZWxpdmVyYWJsZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0EyLF9HcWhtTkVEUUVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvb3V0Y29tZV9BMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9vdXRjb21lX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfR3Fxd0lFRFFFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMvYXJ0aWZhY3RfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX0dxcXdJVURRRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPERpYWdyYW0gbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvYWN0aXZpdHlfZm9yX3ZhcmlhYmlsaXR5X2VsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iQWN0aXZpdHkgRGV0YWlsIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0RpYWdyYW0+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9wYXJlbnRQYWNrYWdlPgotPEFjdGl2aXR5IG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIG5hbWU9IkFjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMsX2RZR20wRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHB1cnBvc2U9IiIgYWx0ZXJuYXRpdmVzPSIiIGhvd3RvU3RhZmY9IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIyIGV4dGVuZHMgVGFzayBBMSIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQjIsX2w1eVVBRURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvdGFza19CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0IyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9vcHRpb25hbElucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2RlbGl2ZXJhYmxlX0ExIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9vdXRwdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0ExIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEvdGFza19BMS90YXNrX0ExLF83TThuc0EtUEVkcUwyTzFQSlY5Y1pBL1N0ZXAgQTEuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJyb2xlX0IyLF9sNXlVQVVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08Um9sZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQjIiPgotPC9tb2RpZmllcz4KLTxtb2RpZmllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3Jlc3BvbnNpYmxlRm9yPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0IxIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9CMSxfbDV5VUFrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQjEiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0EyIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEEyIGV4dGVuZGVkIGJ5IFJvbGUgQTMiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0icm9sZV9BMixfbDV5VUEwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3JvbGVfQTIiPgotPC9Sb2xlPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMixfbDV5VUJFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSIgYnJpZWZEZXNjcmlwdGlvbj0iU3ViX0FydGlmYWN0IEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlN1Yl9BcnRpZmFjdCBBMS4xIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xLF9sNXlVQlVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0ExIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQTEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQTEsX2w1eVVCa0RQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMixfbDV5VUIwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9CMiI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9CMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfbDV5VUNFRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9kZWxpdmVyYWJsZV9BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvZGVsaXZlcmFibGVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvc3ViX2FydGlmYWN0X0ExLjEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPGRlbGl2ZXJhYmxlUGFydHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfbDV5VUNVRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNXlVQ2tEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9sNTdkOEVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjIsX2w1N2Q4VURQRWRxcmhzWmgzUU5BTVEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cy9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfbDU3ZDhrRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfbDU3ZDgwRFBFZHFyaHNaaDNRTkFNUSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9sNTdkOUVEUEVkcXJoc1poM1FOQU1RIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvb3V0Y29tZV9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NhcFBhdFBha19BMS9DUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cy9BY3Rpdml0eSBmb3Igb3RoZXIgcGx1Z2luIHZhcmlhYmlsaXR5IGVsZW1lbnRzIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSIgaXNFbmFjdGFibGU9ImZhbHNlIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gbmFtZT0iQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMsX1p0WmJNVURGRWRxTzlNM2Z1a1lBX0EiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0ibWFpbjogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIGtleUNvbnNpZGVyYXRpb25zPSJLZXlzOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgdXNhZ2VHdWlkYW5jZT0idXNhZ2U6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBwdXJwb3NlPSJQdXJwb3NlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyIgYWx0ZXJuYXRpdmVzPSJhbHRlcm5hdGl2ZXM6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBob3d0b1N0YWZmPSJIb3cgdG8gc3RhZmY6IENQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzIiBleHRlcm5hbElkPSJFeHRlcm5hbCBJRDogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHNjb3BlPSJzY29wZTogQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiIHVzYWdlTm90ZXM9InVzYWdlOiBDUDIgY29udGFpbmluZyB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL2FjdGl2aXR5X2Zvcl92YXJpYWJpbGl0eV9lbGVtZW50cy9hY3Rpdml0eV9mb3JfdmFyaWFiaWxpdHlfZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExL0NQMiBjb250YWluaW5nIHZhcmlhYmlsaXR5IGVsZW1lbnRzL0FjdGl2aXR5IGZvciBvdGhlciBwbHVnaW4gdmFyaWFiaWxpdHkgZWxlbWVudHMvQWN0aXZpdHkgZm9yIG90aGVyIHBsdWdpbiB2YXJpYWJpbGl0eSBlbGVtZW50cyI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jYXBQYXRQYWtfQTEvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMvQ1AyIGNvbnRhaW5pbmcgdmFyaWFiaWxpdHkgZWxlbWVudHMiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiPgotPC9wYXJlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IkNQMSB3aXRoIGFsbCBlbGVtZW50cyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3BhcmVudFBhY2thZ2U+Ci08QWN0aXZpdHkgbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJleHRlbmRzIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gbmFtZT0iQ1AxIHdpdGggYWxsIGVsZW1lbnRzLF9FWGF6RUQwS0VkcWpBSTc3REh2QndBIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUDEgd2l0aCBhbGwgZWxlbWVudHMvQ1AxIHdpdGggYWxsIGVsZW1lbnRzIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsvQ1AxIHdpdGggYWxsIGVsZW1lbnRzL0NQMSB3aXRoIGFsbCBlbGVtZW50cyI+Ci08L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvRGlhZ3JhbT4KLTxDYXBhYmlsaXR5UGF0dGVybiBuYW1lPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBicmllZkRlc2NyaXB0aW9uPSJicmllZkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkNhcFBhdCBBMSxfYUhVU1FSQk5FZHFCczdLaGRWTFJMQSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsgbWFpbiIga2V5Q29uc2lkZXJhdGlvbnM9IkNQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsga2V5IGNvbiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSImbHQ7cCZndDsmIzEzOyYjMTA7ICAgIHB1cnBvc2U6IENQIGV4dGVuZGluZyAmYXBvcztDUDEgd2l0aCBhbGwgZWxlbWVudHMmYXBvczsmIzEzOyYjMTA7Jmx0Oy9wJmd0OyIgYWx0ZXJuYXRpdmVzPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsICZsdDtzdHJvbmcmZ3Q7ZWxlbWVudHMmYXBvczsgYWx0ZXJuJmx0Oy9zdHJvbmcmZ3Q7IiBob3d0b1N0YWZmPSJDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IHN0YWZmIiBleHRlcm5hbElkPSJleHRlcm5JRDpDUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7IiBzY29wZT0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOyBzY29wZSIgdXNhZ2VOb3Rlcz0iQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zO3VzYWdlIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7L0NQMSB3aXRoIGFsbCBlbGVtZW50cy9DUDEgd2l0aCBhbGwgZWxlbWVudHMiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgZXh0ZW5kaW5nICZhcG9zO0NQMSB3aXRoIGFsbCBlbGVtZW50cyZhcG9zOy9DUCBleHRlbmRpbmcgJmFwb3M7Q1AxIHdpdGggYWxsIGVsZW1lbnRzJmFwb3M7Ij4KLTwvZGVmYXVsdENvbnRleHQ+Ci08dmFsaWRDb250ZXh0IHBhdGg9IkNvbmZpZyBBIj4KLTwvdmFsaWRDb250ZXh0PgotPC9DYXBhYmlsaXR5UGF0dGVybj4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTxQcm9jZXNzQ29tcG9uZW50IG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iQWN0MSIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBnbG9iYWw9ImZhbHNlIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvcGFyZW50UGFja2FnZT4KLTxBY3Rpdml0eSBuYW1lPSJBY3QxIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFjdDEiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiIGlzRW5hY3RhYmxlPSJmYWxzZSI+Ci08QWN0aXZpdHlEZXNjcmlwdGlvbiBuYW1lPSJBY3QxLF9lYUNhb0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiPgotPC9BY3Rpdml0eURlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9BY3QxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTIiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPC9BY3Rpdml0eT4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0ExIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0ExLF9nRjdVc0VBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQTEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQTIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMSI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMSI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTEvdGFza19BMSxfN004bnNBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEExLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxSb2xlRGVzY3JpcHRvciBuYW1lPSJyb2xlX0ExIiBicmllZkRlc2NyaXB0aW9uPSJSb2xlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJSb2xlIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTEsX2dGN1VzVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQTEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTxyZXNwb25zaWJsZUZvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08L1JvbGVEZXNjcmlwdG9yPgotPFJvbGVEZXNjcmlwdG9yIG5hbWU9InJvbGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IlJvbGUgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IlJvbGUgQTIgIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQTIsX2dGN1Vza0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IlN1Yl9BcnRpZmFjdCBBMS4xIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJTdWJfQXJ0aWZhY3QgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJzdWJfYXJ0aWZhY3RfQTEuMSxfZ0Y3VXMwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMSxfZ0dFZW9FQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMSxfZ0dFZW9VQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9zdWJfYXJ0aWZhY3RfQTEuMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0ExIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTEsX2dHRWVva0F2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEExIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0ExLF9nR0VlbzBBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9InN1Yl9hcnRpZmFjdF9BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJTdWJfQXJ0aWZhY3QgQTEuMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iU3ViX0FydGlmYWN0IEExLjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ic3ViX2FydGlmYWN0X0ExLjEsX2dHRWVwRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3N1Yl9hcnRpZmFjdF9BMS4xIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9BMSIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0ExLF9nR0VlcFVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0ExIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0IxIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEIxIHByZXNuZXQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9ImZhbHNlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJ0YXNrX0IxLF9qQkZlUUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19CMSI+Ci08L3N1cGVyQWN0aXZpdGllcz4KLTxUYXNrIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9UYXNrPgotPGFkZGl0aW9uYWxseVBlcmZvcm1lZEJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3JvbGVfQjIiPgotPC9hZGRpdGlvbmFsbHlQZXJmb3JtZWRCeT4KLTxtYW5kYXRvcnlJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L21hbmRhdG9yeUlucHV0PgotPG9wdGlvbmFsSW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9vcHRpb25hbElucHV0PgotPG91dHB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvb3V0cHV0PgotPHBlcmZvcm1lZFByaW1hcmlseUJ5IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjEiPgotPC9wZXJmb3JtZWRQcmltYXJpbHlCeT4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4xIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4yIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTxzZWxlY3RlZFN0ZXBzIHBhdGg9IlBsdWcgQi9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9CMS90YXNrX0IxL3Rhc2tfQjEsX1hVNkxVQjhQRWRxc2hNTlNJMDdYT2cvU3RlcCBCMS4zIj4KLTwvc2VsZWN0ZWRTdGVwcz4KLTwvVGFza0Rlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjEsX2p2U0JBRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMSI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L21vZGlmaWVzPgotPHJlc3BvbnNpYmxlRm9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvcmVzcG9uc2libGVGb3I+Ci08cmVzcG9uc2libGVGb3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjEiPgotPC9yZXNwb25zaWJsZUZvcj4KLTwvUm9sZURlc2NyaXB0b3I+Ci08Um9sZURlc2NyaXB0b3IgbmFtZT0icm9sZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iUm9sZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InJvbGVfQjIsX2p2U0JBVUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFJvbGUgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9CMiI+Ci08L1JvbGU+Ci08bW9kaWZpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L21vZGlmaWVzPgotPC9Sb2xlRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQjEiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9CMSxfanZTQkFrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQjEiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBCMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9CMSxfanZTQkEwQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IxIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0IxIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEIxIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQjEsX2p2U0JCRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IxIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjEiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMSIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIxIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IxLF9qdmJLOEVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjEiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjEgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMSxfanZiSzhVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMSI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08VGFza0Rlc2NyaXB0b3IgbmFtZT0idGFza19CMiIgYnJpZWZEZXNjcmlwdGlvbj0iVGFzayBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iVGFzayBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJmYWxzZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0idGFza19CMixfa1lqbmdFQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL3Rhc2tfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08VGFzayBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvVGFzaz4KLTxhZGRpdGlvbmFsbHlQZXJmb3JtZWRCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9yb2xlX0IxIj4KLTwvYWRkaXRpb25hbGx5UGVyZm9ybWVkQnk+Ci08bWFuZGF0b3J5SW5wdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9tYW5kYXRvcnlJbnB1dD4KLTxvcHRpb25hbElucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0IyIj4KLTwvb3B0aW9uYWxJbnB1dD4KLTxvdXRwdXQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L291dHB1dD4KLTxwZXJmb3JtZWRQcmltYXJpbHlCeSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0IyIj4KLTwvcGVyZm9ybWVkUHJpbWFyaWx5Qnk+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMSI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMiI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08c2VsZWN0ZWRTdGVwcyBwYXRoPSJQbHVnIEIvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQjEvdGFza19CMi90YXNrX0IyLF9aTE9Nc0I4UEVkcXNoTU5TSTA3WE9nL1N0ZXAgQjIuMyI+Ci08L3NlbGVjdGVkU3RlcHM+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0IyLF9rWV9zWUVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvYXJ0aWZhY3RfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJkZWxpdmVyYWJsZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbGl2ZXJhYmxlIEIyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImRlbGl2ZXJhYmxlX0IyLF9rWV9zWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvZGVsaXZlcmFibGVfQjIiPgotPC9Xb3JrUHJvZHVjdD4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTxkZWxpdmVyYWJsZVBhcnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9kZWxpdmVyYWJsZVBhcnRzPgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQjIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQjIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9CMixfa1lfc1lrQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQjIiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9CMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9ImFydGlmYWN0X0IyIiBicmllZkRlc2NyaXB0aW9uPSJBcnRpZmFjdCBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iQXJ0aWZhY3QgQjIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0iYXJ0aWZhY3RfQjIsX2taSmRZRUF2RWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0ib3V0Y29tZV9CMiIgYnJpZWZEZXNjcmlwdGlvbj0iT3V0Y29tZSBCMiBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iT3V0Y29tZSBCMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJvdXRjb21lX0IyLF9rWkpkWVVBdkVkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0IyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxUYXNrRGVzY3JpcHRvciBuYW1lPSJ0YXNrX0EyIiBicmllZkRlc2NyaXB0aW9uPSJUYXNrIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJUYXNrIEEyICIgcHJlZml4PSIiIGlzUGxhbm5lZD0iZmFsc2UiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9InRhc2tfQTIsX2EwZ2t3RUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS90YXNrX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L1Rhc2s+Ci08YWRkaXRpb25hbGx5UGVyZm9ybWVkQnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvcm9sZV9BMSI+Ci08L2FkZGl0aW9uYWxseVBlcmZvcm1lZEJ5PgotPG1hbmRhdG9yeUlucHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvbWFuZGF0b3J5SW5wdXQ+Ci08b3B0aW9uYWxJbnB1dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9kZWxpdmVyYWJsZV9BMiI+Ci08L29wdGlvbmFsSW5wdXQ+Ci08b3V0cHV0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9vdXRwdXQ+Ci08cGVyZm9ybWVkUHJpbWFyaWx5QnkgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvdGFza19BMiI+Ci08L3BlcmZvcm1lZFByaW1hcmlseUJ5PgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjEiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjIiPgotPC9zZWxlY3RlZFN0ZXBzPgotPHNlbGVjdGVkU3RlcHMgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExL3Rhc2tfQTIvdGFza19BMixfNzVOUXdBLVBFZHFMMk8xUEpWOWNaQS9TdGVwIEEyLjMiPgotPC9zZWxlY3RlZFN0ZXBzPgotPC9UYXNrRGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iYXJ0aWZhY3RfQTIiIGJyaWVmRGVzY3JpcHRpb249IkFydGlmYWN0IEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJBcnRpZmFjdCBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJhcnRpZmFjdF9BMixfYTF0ZW9FQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2FydGlmYWN0X0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08L1dvcmtQcm9kdWN0RGVzY3JpcHRvcj4KLTxXb3JrUHJvZHVjdERlc2NyaXB0b3IgbmFtZT0iZGVsaXZlcmFibGVfQTIiIGJyaWVmRGVzY3JpcHRpb249IkRlbGl2ZXJhYmxlIEEyIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJEZWxpdmVyYWJsZSBBMiBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgYWN0aXZpdHlFbnRyeVN0YXRlPSIiIGFjdGl2aXR5RXhpdFN0YXRlPSIiPgotPERlc2NyaXB0b3JEZXNjcmlwdGlvbiBuYW1lPSJkZWxpdmVyYWJsZV9BMixfYTJkRmdFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL2RlbGl2ZXJhYmxlX0EyIj4KLTwvV29ya1Byb2R1Y3Q+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L2RlbGl2ZXJhYmxlUGFydHM+Ci08ZGVsaXZlcmFibGVQYXJ0cyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvZGVsaXZlcmFibGVQYXJ0cz4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJvdXRjb21lX0EyIiBicmllZkRlc2NyaXB0aW9uPSJPdXRjb21lIEExIGJyaWVmIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSJPdXRjb21lIEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9Im91dGNvbWVfQTIsX2EzTXNZRUEzRWRxRnFJdTgtY2tvbGciIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiB1c2FnZUd1aWRhbmNlPSIiIHJlZmluZWREZXNjcmlwdGlvbj0iIj4KLTwvRGVzY3JpcHRvckRlc2NyaXB0aW9uPgotPHN1cGVyQWN0aXZpdGllcyBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9vdXRjb21lX0EyIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFdvcmtQcm9kdWN0IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL291dGNvbWVfQTIiPgotPC9Xb3JrUHJvZHVjdD4KLTwvV29ya1Byb2R1Y3REZXNjcmlwdG9yPgotPFdvcmtQcm9kdWN0RGVzY3JpcHRvciBuYW1lPSJhcnRpZmFjdF9BMiIgYnJpZWZEZXNjcmlwdGlvbj0iQXJ0aWZhY3QgQTIgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkFydGlmYWN0IEEyIHByZXNlbnQiIHByZWZpeD0iIiBpc1BsYW5uZWQ9InRydWUiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNTeW5jaHJvbml6ZWRXaXRoU291cmNlPSJ0cnVlIiBhY3Rpdml0eUVudHJ5U3RhdGU9IiIgYWN0aXZpdHlFeGl0U3RhdGU9IiI+Ci08RGVzY3JpcHRvckRlc2NyaXB0aW9uIG5hbWU9ImFydGlmYWN0X0EyLF9hNEdFUUVBM0VkcUZxSXU4LWNrb2xnIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiByZWZpbmVkRGVzY3JpcHRpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxXb3JrUHJvZHVjdCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MS9hcnRpZmFjdF9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08V29ya1Byb2R1Y3REZXNjcmlwdG9yIG5hbWU9Im91dGNvbWVfQTIiIGJyaWVmRGVzY3JpcHRpb249Ik91dGNvbWUgQTEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9Ik91dGNvbWUgQTIgcHJlc2VudCIgcHJlZml4PSIiIGlzUGxhbm5lZD0idHJ1ZSIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1N5bmNocm9uaXplZFdpdGhTb3VyY2U9InRydWUiIGFjdGl2aXR5RW50cnlTdGF0ZT0iIiBhY3Rpdml0eUV4aXRTdGF0ZT0iIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gbmFtZT0ib3V0Y29tZV9BMixfYTQxcklFQTNFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IiIgbWFpbkRlc2NyaXB0aW9uPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIHVzYWdlR3VpZGFuY2U9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiPgotPC9EZXNjcmlwdG9yRGVzY3JpcHRpb24+Ci08V29ya1Byb2R1Y3QgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEvb3V0Y29tZV9BMiI+Ci08L1dvcmtQcm9kdWN0PgotPC9Xb3JrUHJvZHVjdERlc2NyaXB0b3I+Ci08RGlhZ3JhbSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08R3JhcGhDb25uZWN0b3IgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGdyYXBoRWRnZSBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWRnZT4KLTwvR3JhcGhDb25uZWN0b3I+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjIiPgotPC9Qcm9wZXJ0eT4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMSI+Ci08L1Byb3BlcnR5PgotPEdyYXBoRWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08YW5jaG9yIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvYW5jaG9yPgotPC9HcmFwaEVkZ2U+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxHcmFwaENvbm5lY3RvciBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08Z3JhcGhFZGdlIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFZGdlPgotPC9HcmFwaENvbm5lY3Rvcj4KLTxVTUFTZW1hbnRpY01vZGVsQnJpZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIHByZXNlbnRhdGlvbj0iIj4KLTxncmFwaEVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2VsZW1lbnQ+Ci08L1VNQVNlbWFudGljTW9kZWxCcmlkZ2U+Ci08L0dyYXBoTm9kZT4KLTxHcmFwaE5vZGUgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPFByb3BlcnR5IG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiIGtleT0id3BDb21wb3NpdGVUeXBlIiB2YWx1ZT0iMiI+Ci08L1Byb3BlcnR5PgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIxIj4KLTwvUHJvcGVydHk+Ci08R3JhcGhFZGdlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxhbmNob3IgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9hbmNob3I+Ci08L0dyYXBoRWRnZT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08R3JhcGhOb2RlIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGNvbnRhaW5lciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2NvbnRhaW5lcj4KLTxQcm9wZXJ0eSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBrZXk9IndwQ29tcG9zaXRlVHlwZSIgdmFsdWU9IjEiPgotPC9Qcm9wZXJ0eT4KLTxHcmFwaEVkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSI+Ci08Y29udGFpbmVyIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvY29udGFpbmVyPgotPGFuY2hvciBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2FuY2hvcj4KLTwvR3JhcGhFZGdlPgotPEdyYXBoQ29ubmVjdG9yIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxncmFwaEVkZ2UgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9ncmFwaEVkZ2U+Ci08L0dyYXBoQ29ubmVjdG9yPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSIiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQWN0MSI+Ci08L2dyYXBoRWxlbWVudD4KLTxlbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZWxlbWVudD4KLTwvVU1BU2VtYW50aWNNb2RlbEJyaWRnZT4KLTwvR3JhcGhOb2RlPgotPEdyYXBoTm9kZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIj4KLTxjb250YWluZXIgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9jb250YWluZXI+Ci08UHJvcGVydHkgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIga2V5PSJ3cENvbXBvc2l0ZVR5cGUiIHZhbHVlPSIyIj4KLTwvUHJvcGVydHk+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IiI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9HcmFwaE5vZGU+Ci08VU1BU2VtYW50aWNNb2RlbEJyaWRnZSBuYW1lPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgaXNWaXNpYmxlPSJ0cnVlIiBwcmVzZW50YXRpb249IkFjdGl2aXR5IERldGFpbCI+Ci08Z3JhcGhFbGVtZW50IHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxIj4KLTwvZ3JhcGhFbGVtZW50PgotPGVsZW1lbnQgcGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQIEExL0FjdDEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxEaWFncmFtIG5hbWU9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBpc1Zpc2libGU9InRydWUiPgotPFVNQVNlbWFudGljTW9kZWxCcmlkZ2UgbmFtZT0iIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGlzVmlzaWJsZT0idHJ1ZSIgcHJlc2VudGF0aW9uPSJBY3Rpdml0eSBEZXRhaWwiPgotPGdyYXBoRWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9ncmFwaEVsZW1lbnQ+Ci08ZWxlbWVudCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEiPgotPC9lbGVtZW50PgotPC9VTUFTZW1hbnRpY01vZGVsQnJpZGdlPgotPC9EaWFncmFtPgotPENhcGFiaWxpdHlQYXR0ZXJuIG5hbWU9IkNQIEExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkNQIEExIiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPFByb2Nlc3NEZXNjcmlwdGlvbiBuYW1lPSJDUCBBMSxfZEJodmtVQXZFZHFGcUl1OC1ja29sZyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IiIga2V5Q29uc2lkZXJhdGlvbnM9IiIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSIiIGFsdGVybmF0aXZlcz0iIiBob3d0b1N0YWZmPSIiIGV4dGVybmFsSWQ9IiIgc2NvcGU9IiIgdXNhZ2VOb3Rlcz0iIj4KLTwvUHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGJyZWFrZG93bkVsZW1lbnRzIHBhdGg9IlBsdWcgQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUCBBMS9BY3QxL0FjdDEiPgotPC9icmVha2Rvd25FbGVtZW50cz4KLTxkZWZhdWx0Q29udGV4dCBwYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AgQTEvQ1AgQTEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jX0ExIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiIGF1dGhvcnM9IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgdmVyc2lvbj0iIj4KLTxwYXJlbnRQYWNrYWdlIHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jX0ExIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY19BMSIgYnJpZWZEZXNjcmlwdGlvbj0iRGVsUHJvYyBBMSBicmllZiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iRGVsUHJvYyBBMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9IkRlbFByb2MgQTEsX1c2YTRjUkJORWRxQnM3S2hkVkxSTEEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIxLjAuMCIgbWFpbkRlc2NyaXB0aW9uPSJEZWxQcm9jIEExIG1haW4iIGtleUNvbnNpZGVyYXRpb25zPSJEZWxQcm9jIEExIGtleSBjb24iIHVzYWdlR3VpZGFuY2U9IiIgcHVycG9zZT0iRGVsUHJvYyBBMSBwb3Jwb2lzZSIgYWx0ZXJuYXRpdmVzPSJEZWxQcm9jIEExIGFsdGVybiIgaG93dG9TdGFmZj0iRGVsUHJvYyBBMSBzdGFmZiIgZXh0ZXJuYWxJZD0iRGVsUHJvYyBBMSBleHRlcm5JRCIgc2NvcGU9IkRlbFByb2MgQTEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2MgQTEgdXNhZ2UiIHNjYWxlPSJEZWxQcm9jIEExIHNjYWxlIiBwcm9qZWN0Q2hhcmFjdGVyaXN0aWNzPSJEZWxQcm9jIEExIHByb2ogY2hhciIgcmlza0xldmVsPSJEZWxQcm9jIEExIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2MgQTEgZXN0IHRlY2giIHByb2plY3RNZW1iZXJFeHBlcnRpc2U9IkRlbFByb2MgQTEgZXhwZXJ0aXNlIiB0eXBlT2ZDb250cmFjdD0iRGVsUHJvYyBBMSBjb250eXBlIj4KLTwvRGVsaXZlcnlQcm9jZXNzRGVzY3JpcHRpb24+Ci08ZGVmYXVsdENvbnRleHQgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NfQTEvZGVsUHJvY19BMSI+Ci08L2RlZmF1bHRDb250ZXh0PgotPHZhbGlkQ29udGV4dCBwYXRoPSJDb25maWcgQSI+Ci08L3ZhbGlkQ29udGV4dD4KLTwvRGVsaXZlcnlQcm9jZXNzPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9ImRlbFByb2NQYWsgQTEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSI+Ci08cGFyZW50UGFja2FnZSBwYXRoPSJQbHVnIEEvRGVsaXZlcnlQcm9jZXNzZXMvZGVsUHJvY1BhayBBMSI+Ci08L3BhcmVudFBhY2thZ2U+Ci08UHJvY2Vzc0NvbXBvbmVudCBuYW1lPSJkZWxQcm9jUGFrX0ExLjEiIGJyaWVmRGVzY3JpcHRpb249IiIgc3VwcHJlc3NlZD0iZmFsc2UiIG9yZGVyaW5nR3VpZGU9IiIgZ2xvYmFsPSJmYWxzZSIgYXV0aG9ycz0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiB2ZXJzaW9uPSIiPgotPHBhcmVudFBhY2thZ2UgcGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWsgQTEvZGVsUHJvY1Bha19BMS4xIj4KLTwvcGFyZW50UGFja2FnZT4KLTxEZWxpdmVyeVByb2Nlc3MgbmFtZT0iZGVsUHJvY1Bha19BMS4xIiBicmllZkRlc2NyaXB0aW9uPSJEZWxQcm9jUGFrIEExLjEgYnJpZWYiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IkRlbFByb2NQYWsgQTEuMSBwcmVzZW50IiBwcmVmaXg9IiIgaXNQbGFubmVkPSJ0cnVlIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIiBpc0VuYWN0YWJsZT0iZmFsc2UiPgotPERlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uIG5hbWU9ImRlbFByb2NQYWtfQTEuMSxfdXE1SzhSTTFFZHFxbmRpLWdEdXhwdyIgYnJpZWZEZXNjcmlwdGlvbj0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgb3JkZXJpbmdHdWlkZT0iIiBhdXRob3JzPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIHZlcnNpb249IjEuMC4wIiBtYWluRGVzY3JpcHRpb249IkRlbFByb2NQYWsgQTEuMSBtYWluIiBrZXlDb25zaWRlcmF0aW9ucz0iRGVsUHJvY1BhayBBMS4xIGtleSIgdXNhZ2VHdWlkYW5jZT0iIiBwdXJwb3NlPSJEZWxQcm9jUGFrIEExLjEgcG9ycG9pc2UiIGFsdGVybmF0aXZlcz0iRGVsUHJvY1BhayBBMS4xIGFsdCIgaG93dG9TdGFmZj0iRGVsUHJvY1BhayBBMS4xIHN0YWZmIiBleHRlcm5hbElkPSJEZWxQcm9jUGFrIEExLjEgZXh0ZXJuSUQiIHNjb3BlPSJEZWxQcm9jUGFrIEExLjEgc2NvcGUiIHVzYWdlTm90ZXM9IkRlbFByb2NQYWsgQTEuMSB1c2FnZSIgc2NhbGU9IkRlbFByb2NQYWsgQTEuMSBzY2FsZSIgcHJvamVjdENoYXJhY3RlcmlzdGljcz0iRGVsUHJvY1BhayBBMS4xIGNoYXIiIHJpc2tMZXZlbD0iRGVsUHJvY1BhayBBMS4xIHJpc2siIGVzdGltYXRpbmdUZWNobmlxdWU9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtlc3RpbWF0aW5nIHRlY2gmbHQ7IS0tU3RhcnRGcmFnbWVudC0tJmd0OyZsdDshLS1FbmRGcmFnbWVudC0tJmd0OyIgcHJvamVjdE1lbWJlckV4cGVydGlzZT0iRGVsUHJvY1BhayBBMS4xIGV4cGVydGlzZSIgdHlwZU9mQ29udHJhY3Q9IkRlbFByb2NQYWsgQTEuMSZhbXA7bmJzcDtjb250cmFjdCI+Ci08L0RlbGl2ZXJ5UHJvY2Vzc0Rlc2NyaXB0aW9uPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IlBsdWcgQS9EZWxpdmVyeVByb2Nlc3Nlcy9kZWxQcm9jUGFrIEExL2RlbFByb2NQYWtfQTEuMS9kZWxQcm9jUGFrX0ExLjEiPgotPC9kZWZhdWx0Q29udGV4dD4KLTx2YWxpZENvbnRleHQgcGF0aD0iQ29uZmlnIEEiPgotPC92YWxpZENvbnRleHQ+Ci08L0RlbGl2ZXJ5UHJvY2Vzcz4KLTwvUHJvY2Vzc0NvbXBvbmVudD4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBicmllZkRlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiBvcmRlcmluZ0d1aWRlPSIiIGdsb2JhbD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzEvMm5kVGVzdC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS8ybmRUZXN0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTViMWYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS8ybmRUZXN0LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJ0cnVlIj4KLQkKLQk8Q29weUxpYnJhcnkgbGliRm9sZGVyTmFtZT0iLi4vLi4vRXhwb3J0SW1wb3J0L1BhcmlzIj4KLQk8L0NvcHlMaWJyYXJ5PgkKLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iUGFyaXMiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEV4cG9ydENvbmZpZ3VyYXRpb24gZXhwb3J0Rm9sZGVyTmFtZT0iRXhwb3J0MDAwMSIgc2VsZWN0ZWRDb25maWdOYW1lPSJDb25maWcgQSI+Ci0JPC9FeHBvcnRDb25maWd1cmF0aW9uPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJCYXNlXzEiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydENvbmZpZ3VyYXRpb24gaW1wb3J0Rm9sZGVyTmFtZT0iRXhwb3J0MDAwMSI+Ci0JPC9JbXBvcnRDb25maWd1cmF0aW9uPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMCIKLQkJdXNlTmFtZUFzSWQ9ImZhbHNlIj4KLQkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS9TdWJTdWIvM3JkVGVzdC50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMS9TdWJTdWIvM3JkVGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk4MzgzMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzEvU3ViU3ViLzNyZFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi8uLi8uLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0WG1sIGV4cG9ydEZvbGRlck5hbWU9IkV4cG9ydDAwMDEiPgotCTwvRXhwb3J0WG1sPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJCYXNlXzEiPgotCTwvT3BlbkxpYnJhcnk+Ci0JCi0JPEltcG9ydFhtbCBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIiBtZXJnZT0iZmFsc2UiPgotCTwvSW1wb3J0WG1sPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMjgiIAotCQllbGVtZW50Q291bnQ9IjM3MCIKLQkJdXNlTmFtZUFzSWQ9InRydWUiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzFzdFRlc3QudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMXN0VGVzdC50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdiMzA4Zi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1RDU2FtcGxlQ2FzZXMvU3ViRGlyXzIvMXN0VGVzdC50YworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0idHJ1ZSI+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Ii4uLy4uL0V4cG9ydEltcG9ydC9QYXJpcyI+Ci0JPC9Db3B5TGlicmFyeT4JCi0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IlBhcmlzIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxFeHBvcnRQbHVnaW5zIGV4cG9ydEZvbGRlck5hbWU9IkV4cG9ydGVkMDAxIj4KLQk8L0V4cG9ydFBsdWdpbnM+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0UGx1Z2lucyBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnRlZDAwMSI+Ci0JPC9JbXBvcnRQbHVnaW5zPgotCQotCTxDb21wYXJlVG9MaWJyYXJ5IAotCQlnb2xkZW5MaWJGb2xkZXJOYW1lPSJQYXJpcyIgCi0JCWRpZmZDb3VudD0iMCIgCi0JCWVsZW1lbnRDb3VudD0iMCIKLQkJdXNlTmFtZUFzSWQ9ImZhbHNlIj4KLQkJCi0JPC9Db21wYXJlVG9MaWJyYXJ5PgotCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVENTYW1wbGVDYXNlcy9TdWJEaXJfMi8ybmRUZXN0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzJuZFRlc3QudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmEyODcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UQ1NhbXBsZUNhc2VzL1N1YkRpcl8yLzJuZFRlc3QudGMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0PgotCQotCTxDb3B5TGlicmFyeSBsaWJGb2xkZXJOYW1lPSIuLi8uLi9FeHBvcnRJbXBvcnQvUGFyaXMiPgotCTwvQ29weUxpYnJhcnk+CQotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJQYXJpcyI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8RXhwb3J0Q29uZmlndXJhdGlvbiBleHBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIiBzZWxlY3RlZENvbmZpZ05hbWU9IkNvbmZpZyBBIj4KLQk8L0V4cG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IkJhc2VfMSI+Ci0JPC9PcGVuTGlicmFyeT4KLQkKLQk8SW1wb3J0Q29uZmlndXJhdGlvbiBpbXBvcnRGb2xkZXJOYW1lPSJFeHBvcnQwMDAxIj4KLQk8L0ltcG9ydENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0xpYnJhcnkgCi0JCWdvbGRlbkxpYkZvbGRlck5hbWU9IlBhcmlzIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIwIgotCQl1c2VOYW1lQXNJZD0iZmFsc2UiPgotCQkKLQk8L0NvbXBhcmVUb0xpYnJhcnk+Ci0KLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvZWRpdEFsbEVsZW1lbnRzLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvZWRpdEFsbEVsZW1lbnRzLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjAyNmNmLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2VkaXRBbGxFbGVtZW50cy50YworKysgL2Rldi9udWxsCkBAIC0xLDU1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi08IS0tIFRoaXMgY2FzZSBpbmNsdWRlcyBjcmVhdGluZyBhbmQgZWRpdG5nIGFsbW9zdCBldmVyeSB0eXBlIG9mIG1laHRvZCBlbGVtZW50IC0tPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSJhbGxFbGVtZW50cyI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi08IS0tIFBsdWcgQSAtLT4KLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnIEEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1ZyBBIgotCQlhdXRob3JzPSJQbHVnIEEgQXV0aG9yIgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCi08IS0tIGNvbnRlbnRfcGFja2FnZV9BMSAtLT4KLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDb250ZW50UGFja2FnZSIKLQkJbmFtZT0iY29udGVudF9wYWNrYWdlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudCIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIENvbmZpZ19BIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgQ29uZmlnX0EiCi0JCT4KLQkgIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JICAJPFZhbHVlPlBsdWcgQTwvVmFsdWU+Ci0gIAkgIDwvbWV0aG9kUGx1Z2luU2VsZWN0aW9uPgotCQkJCQkKLQkgIDxtZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotCSAgCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTE8L1ZhbHVlPgotICAJICA8L21ldGhvZFBhY2thZ2VTZWxlY3Rpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkKLQkKLTwhLS0gcm9sZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJbmFtZT0icm9sZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvbGUgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSb2xlIEExIGtleSIKLQkJCXNraWxscz0iUm9sZSBBMSBza2lsbHMiCi0JCQlhc3NpZ25tZW50QXBwcm9hY2hlcz0iUm9sZSBBMSBhc3NpZyBBcHAiCi0JCQlzeW5vbnltcz0iUm9sZSBzeW4iCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSB0YXNrX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUYXNrIgotCQluYW1lPSJ0YXNrX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iVGFzayBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRhc2sgQTEga2V5IgotCQkJc2tpbGxzPSJUYXNrIEExIHNraWxscyIKLQkJCWFzc2lnbm1lbnRBcHByb2FjaGVzPSJUYXNrIEExIGFzc2lnIEFwcCIKLQkJCXN5bm9ueW1zPSJUYXNrIHN5biIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCQkKLQkJPG93bmVkUnVsZXMgYm9keT0iQm9keSAxIiAvPgotCQk8b3duZWRSdWxlcyBib2R5PSJCb2R5IDIiIC8+Ci0JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGFydGlmYWN0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJBcnRpZmFjdCIKLQkJbmFtZT0iYXJ0aWZhY3RfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJBcnRpZmlmYWN0IEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iQXJ0aWZpZmFjdCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotPCEtLSBkZWxpdmVyYWJsZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iRGVsaXZlcmFibGUiCi0JCW5hbWU9ImRlbGl2ZXJhYmxlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRGVsaXZlcmFibGUgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEZWxpdmVyYWJsZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotPCEtLSBvdXRjb21lX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJPdXRjb21lIgotCQluYW1lPSJvdXRjb21lX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iT3V0Y29tZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9Ik91dGNvbWUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBjb25jZXB0X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDb25jZXB0IgotCQluYW1lPSJjb25jZXB0X0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iQ29uY2VwdCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNvbmNlcHQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGNoZWNrbGlzdF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ2hlY2tsaXN0IgotCQluYW1lPSJjaGVja2xpc3RfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJDaGVja2xpc3QgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJDaGVja2xpc3QgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBleGFtcGxlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJFeGFtcGxlIgotCQluYW1lPSJleGFtcGxlX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50X3BhY2thZ2VfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRXhhbXBsZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkV4YW1wbGUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkKLQkKLTwhLS0gZ3VpZGVsaW5lX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJHdWlkZWxpbmUiCi0JCW5hbWU9Imd1aWRlbGluZV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249Ikd1aWRlbGluZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9Ikd1aWRlbGluZSBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkKLQkJCi08IS0tIHJlcG9ydF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUmVwb3J0IgotCQluYW1lPSJyZXBvcnRfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSZXBvcnQgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSZXBvcnQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIHRlbXBsYXRlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUZW1wbGF0ZSIKLQkJbmFtZT0idGVtcGxhdGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUZW1wbGF0ZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRlbXBsYXRlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSBzdXBwb3J0aW5nX21hdGVyaWFsX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJTdXBwb3J0aW5nTWF0ZXJpYWwiCi0JCW5hbWU9InN1cHBvcnRpbmdfbWF0ZXJpYWxfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJTdXBwb3J0aW5nX21hdGVyaWFsIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iU3VwcG9ydGluZ19tYXRlcmlhbCBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gdG9vbG1lbnRvcl9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iVG9vbE1lbnRvciIKLQkJbmFtZT0idG9vbG1lbnRvcl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlRvb2xtZW50b3IgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJUb29sbWVudG9yIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQotCi08IS0tIHdoaXRlcGFwZXJfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IldoaXRlcGFwZXIiCi0JCW5hbWU9IndoaXRlcGFwZXJfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJXaGl0ZXBhcGVyIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iV2hpdGVwYXBlciBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi08IS0tIHByYWN0aWNlX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJQcmFjdGljZSIKLQkJbmFtZT0icHJhY3RpY2VfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJQcmFjdGljZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlByYWN0aWNlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSByZXVzYWJsZV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUmV1c2FibGVBc3NldCIKLQkJbmFtZT0icmV1c2FibGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJSZXVzYWJsZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJldXNhYmxlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLTwhLS0gcm9hZG1hcF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9hZG1hcCIKLQkJbmFtZT0icm9hZG1hcF9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudF9wYWNrYWdlX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvYWRtYXAgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJSb2FkbWFwIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSB0ZXJtX2RlZmluaXRpb25fQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRlcm1EZWZpbml0aW9uIgotCQluYW1lPSJ0ZXJtX2RlZmluaXRpb25fQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJUZXJtX2RlZmluaXRpb24gQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJUZXJtX2RlZmluaXRpb24gQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi08IS0tIGRpc2NpcGxpbmVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkRpc2NpcGxpbmUiCi0JCW5hbWU9ImRpc2NpcGxpbmVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRGlzY2lwbGluZSBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRpc2NpcGxpbmUgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHRhc2tzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS90YXNrX0ExPC9WYWx1ZT4KLQkJPC90YXNrcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSBkaXNjaXBsaW5lX2dyb3VwaW5nX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEaXNjaXBsaW5lR3JvdXBpbmciCi0JCW5hbWU9ImRpc2NpcGxpbmVfZ3JvdXBpbmdfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMiCi0JCT4JCQkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJEaXNjaXBsaW5lR3JvdXBpbmcgQTEgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lR3JvdXBpbmcgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPGRpc2NpcGxpbmVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvRGlzY2lwbGluZXMvZGlzY2lwbGluZV9BMTwvVmFsdWU+Ci0JCTwvZGlzY2lwbGluZXM+CQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCQotPCEtLSBkaXNjaXBsaW5lX0EyIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEaXNjaXBsaW5lIgotCQluYW1lPSJkaXNjaXBsaW5lX0EyIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0Rpc2NpcGxpbmVzIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkRpc2NpcGxpbmUgQTIgbWFpbiIKLQkJCWtleUNvbnNpZGVyYXRpb25zPSJEaXNjaXBsaW5lIEEyIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkJCQkJCQotCQkKLTwhLS0gZG9tYWluX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEb21haW4iCi0JCW5hbWU9ImRvbWFpbl9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Eb21haW5zIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkRvbWFpbiBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkRvbWFpbiBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8c3ViZG9tYWlucyAKLQkJCW5hbWU9InN1Yl9kb21haW5fQTEiCi0JCQk+Ci0JCQk8cHJlc2VudGF0aW9uCi0JCQkJbWFpbkRlc2NyaXB0aW9uPSJTdWIgRG9tYWluIEExIG1haW4iCi0JCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlN1YiBEb21haW4gQTEga2V5IgotCQkJCT4JCQkKLQkJCTwvcHJlc2VudGF0aW9uPgotCQk8L3N1YmRvbWFpbnM+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQotCQkKLTwhLS0gd29ya19wcm9kdWN0X3R5cGVfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IldvcmtQcm9kdWN0VHlwZSIKLQkJbmFtZT0id29ya19wcm9kdWN0X3R5cGVfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvV1AgVHlwZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iV29ya1Byb2R1Y3RUeXBlIEExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iV29ya1Byb2R1Y3RUeXBlIEExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotPCEtLSByb2xlX3NldF9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldCIKLQkJbmFtZT0icm9sZV9zZXRfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZVNldCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXQgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHJvbGVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExPC9WYWx1ZT4KLQkJPC9yb2xlcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSByb2xlX3NldF9ncm91cGluZ19BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldEdyb3VwaW5nIgotCQluYW1lPSJyb2xlX3NldF9ncm91cGluZ19BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cyIKLQkJPgkJCQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IlJvbGVTZXRHcm91cGluZyBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXRHcm91cGluZyBBMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8cm9sZVNldHM+Ci0JCQk8VmFsdWU+UGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9Sb2xlU2V0cy9yb2xlX3NldF9BMTwvVmFsdWU+Ci0JCTwvcm9sZVNldHM+CQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCQotPCEtLSByb2xlX3NldF9BMiAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZVNldCIKLQkJbmFtZT0icm9sZV9zZXRfQTIiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvUm9sZVNldHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iUm9sZVNldCBBMiBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlJvbGVTZXQgQTIga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHJvbGVzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRfcGFja2FnZV9BMS9yb2xlX0ExPC9WYWx1ZT4KLQkJPC9yb2xlcz4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCi08IS0tIHRvb2xfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IlRvb2wiCi0JCW5hbWU9InRvb2xfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvVG9vbHMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iVG9vbCBBMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IlRvb2wgQTEga2V5IgotCQkJPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gc3ViX2N1c3RvbV9jYXRlZ29yeV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ3VzdG9tQ2F0ZWdvcnkiCi0JCW5hbWU9InN1Yl9jdXN0b21fY2F0ZWdvcnlfQTEiCi0JCXBhcmVudFBhdGg9IlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcyIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbgotCQkJbWFpbkRlc2NyaXB0aW9uPSJzdWJfY3VzdG9tX2NhdGVnb3J5X0ExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0ic3ViX2N1c3RvbV9jYXRlZ29yeV9BMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gY3VzdG9tX2NhdGVnb3J5X0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDdXN0b21DYXRlZ29yeSIKLQkJbmFtZT0iY3VzdG9tX2NhdGVnb3J5X0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iY3VzdG9tX2NhdGVnb3J5X0ExIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iY3VzdG9tX2NhdGVnb3J5X0ExIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxjYXRlZ29yaXplZEVsZW1lbnRzPgotCQkJPFZhbHVlPlBsdWcgQS9Db250ZW50L0NhdGVnb3JpZXMvQ3VzdG9tQ2F0ZWdvcmllcy9zdWJfY3VzdG9tX2NhdGVnb3J5X0ExPC9WYWx1ZT4KLQkJPC9jYXRlZ29yaXplZEVsZW1lbnRzPgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8IS0tIGN1c3RvbV9jYXRlZ29yeV9BMiAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ3VzdG9tQ2F0ZWdvcnkiCi0JCW5hbWU9ImN1c3RvbV9jYXRlZ29yeV9BMiIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2F0ZWdvcmllcy9DdXN0b21DYXRlZ29yaWVzIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249ImN1c3RvbV9jYXRlZ29yeV9BMiBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9ImN1c3RvbV9jYXRlZ29yeV9BMiBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkN1c3RvbUNhdGVnb3J5IgotCQlwYXRoPSJQbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvSGlkZGVuL0N1c3RvbSBDYXRlZ29yaWVzIgotCQk+CQotCQk8Y2F0ZWdvcml6ZWRFbGVtZW50cz4KLQkJCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0ExPC9WYWx1ZT4KLQkJCTxWYWx1ZT5QbHVnIEEvQ29udGVudC9DYXRlZ29yaWVzL0N1c3RvbUNhdGVnb3JpZXMvY3VzdG9tX2NhdGVnb3J5X0EyPC9WYWx1ZT4JCQkKLQkJPC9jYXRlZ29yaXplZEVsZW1lbnRzPgkJCQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkJCQkJCQotCQkKLTwhLS0gY2FwUGF0UGFrX0ExIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJQcm9jZXNzUGFja2FnZSIKLQkJbmFtZT0iY2FwUGF0UGFrX0ExIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCT4JCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gQ1AxIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJbmFtZT0iQ1AxIgotCQlwYXJlbnRQYXRoPSJQbHVnIEEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY2FwUGF0UGFrX0ExIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkNQMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNQMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgotCQk8dmFsaWRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC92YWxpZENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCi0JCi08IS0tIENQMV9BMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCW5hbWU9IkNQMV9BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQk+CQotCQk8cHJlc2VudGF0aW9uCi0JCQltYWluRGVzY3JpcHRpb249IkNQMV9BMSBtYWluIgotCQkJa2V5Q29uc2lkZXJhdGlvbnM9IkNQMV9BMSBrZXkiCi0JCQk+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgotCQk8dmFsaWRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC92YWxpZENvbnRleHQ+CQkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCi0JCi08IS0tIGRlbFByb2NQYWtfQTEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJQcm9jZXNzUGFja2FnZSIKLQkJbmFtZT0iZGVsUHJvY1Bha19BMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzIgotCQk+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLTwhLS0gRFAxIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJEZWxpdmVyeVByb2Nlc3MiCi0JCW5hbWU9IkRQMSIKLQkJcGFyZW50UGF0aD0iUGx1ZyBBL0RlbGl2ZXJ5UHJvY2Vzc2VzL2RlbFByb2NQYWtfQTEiCi0JCT4JCi0JCTxwcmVzZW50YXRpb24KLQkJCW1haW5EZXNjcmlwdGlvbj0iRFAxIG1haW4iCi0JCQlrZXlDb25zaWRlcmF0aW9ucz0iRFAxIGtleSIKLQkJCT4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+Ci0JCTx2YWxpZENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L3ZhbGlkQ29udGV4dD4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCi0JCQotCTxPdXRwdXRMaWJyYXJ5IG91dHB1dEZpbGVOYW1lPSJ0LnhtbCIvPgkKLQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2YTZhNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9rZWx2aW5DYXNlLnRjCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi08IS0tIDEuIENyZWF0ZSBhIG5ldyBtZXRob2QgbGlicmFyeSAtLT4JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9ImtlbHZpbkNhc2UiPgotCTwvT3BlbkxpYnJhcnk+CQotCQotPCEtLSAyLiBDcmVhdGUgYSBuZXcgcGx1Z2luXzEgLS0+CQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9InBsdWdpbl8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBsdWdpbl8xIgotCQlhdXRob3JzPSJLZWx2aW4iCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCQotPCEtLSAzLiBDcmVhdGUgYSBuZXcgY29udGVudFBhY2thZ2VfMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iQ29udGVudFBhY2thZ2UiCi0JCW5hbWU9ImNvbnRlbnRQYWNrYWdlXzEiCi0JCXBhcmVudFBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSA0LiBDcmVhdGUgYSBuZXcgdGFza18xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJUYXNrIgotCQluYW1lPSJ0YXNrXzEiCi0JCXBhcmVudFBhdGg9InBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMSIKLQkJPgkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiB0YXNrXzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gNS4gQ3JlYXRlIGEgbmV3IGNvbmZpZ18xIHRoYXQgaW5jbHVkZXMgcGx1Z2luXzEgJiBjb250ZW50UGFja2FnZV8xIC0tPgkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iY29uZmlnXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY29uZmlnXzEiCi0JCT4KLQkgIDxtZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JICAJPFZhbHVlPnBsdWdpbl8xPC9WYWx1ZT4KLSAgCSAgPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci0JCQkJCQotCSAgPG1ldGhvZFBhY2thZ2VTZWxlY3Rpb24+Ci0JICAJPFZhbHVlPnBsdWdpbl8xL0NvbnRlbnQvQ29yZUNvbnRlbnQvY29udGVudFBhY2thZ2VfMTwvVmFsdWU+Ci0gIAkgIDwvbWV0aG9kUGFja2FnZVNlbGVjdGlvbj4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotPCEtLSA2LiBDcmVhdGUgYSBuZXcgY3BfMSB1c2luZyBjb25maWdfMSAtLT4JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iY3BfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBjcF8xIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPmNvbmZpZ18xPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4KLQkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCi08IS0tIDYuIEFkZCBhIG5ldyB0ZF8xIHRvIGNwXzEgdGhhdCBpcyBsaW5rZWQgdG8gdGFza18xIC0tPgkJCQotCTxOZXdNZXRob2RFbGVtZW50IAotCQl0eXBlPSJUYXNrRGVzY3JpcHRvciIKLQkJcGFyZW50UGF0aD0icGx1Z2luXzEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMSIKLQkJbmFtZT0idGRfMSIKLQkJPgotCQk8VGFzaz4KLQkJCTxWYWx1ZT5wbHVnaW5fMS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRQYWNrYWdlXzEvdGFza18xPC9WYWx1ZT4KLQkJPC9UYXNrPgkJCQkKLQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLTwhLS0gNy4gU3VwcHJlc3MgdGRfMSAtLT4JCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgCi0JCXR5cGU9IlRhc2tEZXNjcmlwdG9yIgotCQlwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL3RkXzEiCi0JCXN1cHByZXNzZWQ9InRydWUiCi0JCT4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4gCQkJCi0JCi0JPE91dHB1dExpYnJhcnkgb3V0cHV0RmlsZU5hbWU9InQueG1sIi8+CQotCQotCTxDb21wYXJlVG9Hb2xkZW5GaWxlICAKLQkJZ29sZGVuRmlsZU5hbWU9ImtlbHZpbkNhc2UueG1sIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzNSIKLQkJPgotCTwvQ29tcGFyZVRvR29sZGVuRmlsZT4KLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL2tlbHZpbkNhc2UueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZTM3M2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMva2VsdmluQ2FzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfZWI5LWNOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0ia2VsdmluQ2FzZSIgb3JkZXJpbmdHdWlkZT0iIiBwYXRoPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08TWV0aG9kUGx1Z2luIGF1dGhvcnM9IktlbHZpbiIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBwbHVnaW5fMSIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iX2VoZi1zTkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9InBsdWdpbl8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi1zZEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXN0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtczlCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdE5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXRkQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi10dEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdDlCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXVOQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdWRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi11dEJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il9laGYtdTlCV0VkeVNLT2NDTEx0VFpRIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1QbENGRTR4bzVvM1hPNWZsRXJZak5RIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX2VoZi11OUJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdk5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9lbWQtUU5CV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJjb250ZW50UGFja2FnZV8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFRhc2sgYnJpZWZEZXNjcmlwdGlvbj0iIiBndWlkPSJfZW0yWXdOQldFZHlTS09jQ0xMdFRaUSIgaXNBYnN0cmFjdD0iZmFsc2UiIG5hbWU9InRhc2tfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxUYXNrRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii0tN2tqeVVqUmZtdE9qa1Fwc0N6SFdRIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgdGFza18xIiBuYW1lPSJ0YXNrXzEsX2VtMll3TkJXRWR5U0tPY0NMTHRUWlEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9UYXNrRGVzY3JpcHRpb24+Ci08L1Rhc2s+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9laGYtdmRCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08UHJvY2Vzc0NvbXBvbmVudCBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VySnA4TkJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9ImNwXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9lc3hha2RCV0VkeVNLT2NDTEx0VFpRIiBuYW1lPSJ0ZF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFRhc2tEZXNjcmlwdG9yIGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iX2VzeGFrTkJXRWR5U0tPY0NMTHRUWlEiIGhhc011bHRpcGxlT2NjdXJyZW5jZXM9ImZhbHNlIiBpc0Fic3RyYWN0PSJmYWxzZSIgaXNFdmVudERyaXZlbj0iZmFsc2UiIGlzT25nb2luZz0iZmFsc2UiIGlzT3B0aW9uYWw9ImZhbHNlIiBpc1BsYW5uZWQ9InRydWUiIGlzUmVwZWF0YWJsZT0iZmFsc2UiIGlzU3luY2hyb25pemVkV2l0aFNvdXJjZT0idHJ1ZSIgbmFtZT0idGRfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVmaXg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJ0cnVlIj4KLTxEZXNjcmlwdG9yRGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLUdQWU1uNThYZXphOThlTEFTbkJ3VHciIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJ0ZF8xLF9lc3hha05CV0VkeVNLT2NDTEx0VFpRIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcmVmaW5lZERlc2NyaXB0aW9uPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHZlcnNpb249IiI+Ci08L0Rlc2NyaXB0b3JEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0icGx1Z2luXzEvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9jcF8xIj4KLTwvc3VwZXJBY3Rpdml0aWVzPgotPFRhc2sgcGF0aD0icGx1Z2luXzEvQ29udGVudC9Db3JlQ29udGVudC9jb250ZW50UGFja2FnZV8xL3Rhc2tfMSI+Ci08L1Rhc2s+Ci08L1Rhc2tEZXNjcmlwdG9yPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwXzEiIGd1aWQ9Il9lcTljc2RCV0VkeVNLT2NDTEx0VFpRIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1MSlNXSXBvVEktazhuTmlUa2NwZ3pnIiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIiBuYW1lPSJjcF8xLF9lcTljc2RCV0VkeVNLT2NDTEx0VFpRIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHVycG9zZT0iIiBzY29wZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNhZ2VHdWlkYW5jZT0iIiB1c2FnZU5vdGVzPSIiIHZlcnNpb249IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL3RkXzEvdGRfMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9ImNvbmZpZ18xIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfZWhmLXZ0QldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX2VoZi12OUJXRWR5U0tPY0NMTHRUWlEiIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNvbmZpZ18xIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQ0OjM1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfZXFsQ01OQldFZHlTS09jQ0xMdFRaUSIgbmFtZT0iY29uZmlnXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxtZXRob2RQbHVnaW5TZWxlY3Rpb24gcGF0aD0icGx1Z2luXzEiPgotPC9tZXRob2RQbHVnaW5TZWxlY3Rpb24+Ci08bWV0aG9kUGFja2FnZVNlbGVjdGlvbiBwYXRoPSJwbHVnaW5fMS9Db250ZW50L0NvcmVDb250ZW50L2NvbnRlbnRQYWNrYWdlXzEiPgotPC9tZXRob2RQYWNrYWdlU2VsZWN0aW9uPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPC9NZXRob2RMaWJyYXJ5PgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy50YwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ1YzUxMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdBY3Rpdml0aWVzLnRjCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld0xpYiI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwXzEiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgY3BfMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEiCQotCQk+CQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGNwXzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkKLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xIgotCQluYW1lPSJhY3RfMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBhY3RfMSIKLQkJPgkJCQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgYWN0XzEiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iUGhhc2UiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2FjdF8xIgotCQluYW1lPSJwaGFzZV8xIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBoYXNlXzEiCi0JCT4JCQkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCQotCQotCTxPdXRwdXRMaWJyYXJ5IC8+CQotCQotCTxDb21wYXJlVG9Hb2xkZW5GaWxlICBkaXNhYmxlPSJmYWxzZSIKLQkJZ29sZGVuRmlsZU5hbWU9Im5ld0FjdGl2aXRpZXMueG1sIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzNCIKLQkJPgotCTwvQ29tcGFyZVRvR29sZGVuRmlsZT4KLQkKLQkJCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld0FjdGl2aXRpZXMueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMGEwODAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3QWN0aXZpdGllcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfb09zMTBORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0ibmV3TGliIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iU29tZWJvZHkiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfb1VVOHNORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iUGx1Z19BIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVThzZER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHN0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4czlEd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dE5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHRkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh0dER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dDlEd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHVORHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dWREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh1dER3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vVVU4dTlEd0VkeU03UHkxbXNTYVdnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1zTVdRYnM2M1FkTTZCQXlFQlhvUGRRIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsX29VVTh1OUR3RWR5TTdQeTFtc1NhV2ciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vVVU4dk5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHZkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPFByb2Nlc3NDb21wb25lbnQgYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il9vWHdFSWREd0VkeU03UHkxbXNTYVdnIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb2FJcHdkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iYWN0XzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb2FuSzRkRHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0icGhhc2VfMSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxQaGFzZSBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIHBoYXNlXzEiIGd1aWQ9Il9vYW5LNE5Ed0VkeU03UHkxbXNTYVdnIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJwaGFzZV8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxBY3Rpdml0eURlc2NyaXB0aW9uIGFsdGVybmF0aXZlcz0iIiBhdXRob3JzPSIiIGJyaWVmRGVzY3JpcHRpb249IiIgY2hhbmdlRGVzY3JpcHRpb249IiIgZXh0ZXJuYWxJZD0iIiBndWlkPSItTUdGamFLRUp3b3dPdEM2NmJzRDM1dyIgaG93dG9TdGFmZj0iIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0icGhhc2VfMSxfb2FuSzRORHdFZHlNN1B5MW1zU2FXZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHB1cnBvc2U9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzYWdlR3VpZGFuY2U9IiIgdmVyc2lvbj0iIj4KLTwvQWN0aXZpdHlEZXNjcmlwdGlvbj4KLTxzdXBlckFjdGl2aXRpZXMgcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEvYWN0XzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08L1BoYXNlPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxBY3Rpdml0eSBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGFjdF8xIiBndWlkPSJfb2FJcHdORHdFZHlNN1B5MW1zU2FXZyIgaGFzTXVsdGlwbGVPY2N1cnJlbmNlcz0iZmFsc2UiIGlzQWJzdHJhY3Q9ImZhbHNlIiBpc0V2ZW50RHJpdmVuPSJmYWxzZSIgaXNPbmdvaW5nPSJmYWxzZSIgaXNPcHRpb25hbD0iZmFsc2UiIGlzUGxhbm5lZD0idHJ1ZSIgaXNSZXBlYXRhYmxlPSJmYWxzZSIgbmFtZT0iYWN0XzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlZml4PSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZhcmlhYmlsaXR5VHlwZT0ibmEiPgotPEFjdGl2aXR5RGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJGcmkgRmViIDAxIDEwOjA4OjAzIFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1UclZmdHlIUXJHNWc4VE5JVjNoTzJ3IiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBhY3RfMSIgbmFtZT0iYWN0XzEsX29hSXB3TkR3RWR5TTdQeTFtc1NhV2ciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBwdXJwb3NlPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB1c2FnZUd1aWRhbmNlPSIiIHZlcnNpb249IiI+Ci08L0FjdGl2aXR5RGVzY3JpcHRpb24+Ci08c3VwZXJBY3Rpdml0aWVzIHBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcF8xL2NwXzEiPgotPC9zdXBlckFjdGl2aXRpZXM+Ci08YnJlYWtkb3duRWxlbWVudHMgcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwXzEvYWN0XzEvcGhhc2VfMS9waGFzZV8xIj4KLTwvYnJlYWtkb3duRWxlbWVudHM+Ci08L0FjdGl2aXR5PgotPC9Qcm9jZXNzUGFja2FnZT4KLTxDYXBhYmlsaXR5UGF0dGVybiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwXzEiIGd1aWQ9Il9vWHdFSU5Ed0VkeU03UHkxbXNTYVdnIiBoYXNNdWx0aXBsZU9jY3VycmVuY2VzPSJmYWxzZSIgaXNBYnN0cmFjdD0iZmFsc2UiIGlzRXZlbnREcml2ZW49ImZhbHNlIiBpc09uZ29pbmc9ImZhbHNlIiBpc09wdGlvbmFsPSJmYWxzZSIgaXNQbGFubmVkPSJ0cnVlIiBpc1JlcGVhdGFibGU9ImZhbHNlIiBuYW1lPSJjcF8xIiBvcmRlcmluZ0d1aWRlPSIiIHByZWZpeD0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxQcm9jZXNzRGVzY3JpcHRpb24gYWx0ZXJuYXRpdmVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJGcmkgRmViIDAxIDEwOjA4OjAzIFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1fWGE2cTRTZVV0VHI0ZDhQN2VvcUFnIiBob3d0b1N0YWZmPSIiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBjcF8xIiBuYW1lPSJjcF8xLF9vWHdFSU5Ed0VkeU03UHkxbXNTYVdnIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgcHVycG9zZT0iIiBzY29wZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNhZ2VHdWlkYW5jZT0iIiB1c2FnZU5vdGVzPSIiIHZlcnNpb249IiI+Ci08L1Byb2Nlc3NEZXNjcmlwdGlvbj4KLTxicmVha2Rvd25FbGVtZW50cyBwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3BfMS9hY3RfMS9hY3RfMSI+Ci08L2JyZWFrZG93bkVsZW1lbnRzPgotPGRlZmF1bHRDb250ZXh0IHBhdGg9IkNvbmZpZ19BIj4KLTwvZGVmYXVsdENvbnRleHQ+Ci08L0NhcGFiaWxpdHlQYXR0ZXJuPgotPC9Qcm9jZXNzQ29tcG9uZW50PgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfb1VVOHZ0RHdFZHlNN1B5MW1zU2FXZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iX29VVTh2OUR3RWR5TTdQeTFtc1NhV2ciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IkZyaSBGZWIgMDEgMTA6MDg6MDMgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il9vV19QSU5Ed0VkeU03UHkxbXNTYVdnIiBuYW1lPSJDb25maWdfQSIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPC9NZXRob2RMaWJyYXJ5PgotPC9UZXN0ZXJPdXRwdXQ+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RFbGVtZW50cy9uZXdNZXRob2RFbGVtZW50cy50YyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTI3ZmJiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnRjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld0xpYiI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIKLQkJbmFtZT0iUGx1Z1Rlc3QiCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX1Rlc3QiCi0JCT4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWdfQiIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0IiCi0JCWF1dGhvcnM9IlJNQyB0ZWFtIG1lbWJlciBCIgkKLQkJPgotCQk8YmFzZXM+Ci0JCQk8VmFsdWU+UGx1Z19BPC9WYWx1ZT4KLQkJPC9iYXNlcz4JCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIgotCQlwYXRoPSJQbHVnX0IiCi0JCT4KLQkJPGJhc2VzPgotCQkJPFZhbHVlPlBsdWdfQTA8L1ZhbHVlPgotCQk8L2Jhc2VzPgkJCi0JPC9FZGl0TWV0aG9kRWxlbWVudD4KLQkJCQotCQkJCi0JPE5ld01ldGhvZENvbmZpZ3VyYXRpb24gZGlzYWJsZT0iZmFsc2UiCi0JCW5hbWU9IkNvbmZpZ19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RDb25maWd1cmF0aW9uPgotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9IkNvbnRlbnRQYWNrYWdlIgotCQluYW1lPSJDb250ZW50UGFja2FnZV8xIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9Db3JlQ29udGVudCIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJbmFtZT0icm9sZV8xIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9Db3JlQ29udGVudC9Db250ZW50UGFja2FnZV8xIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQKLQkJdHlwZT0iUm9sZSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ29yZUNvbnRlbnQvQ29udGVudFBhY2thZ2VfMS9yb2xlXzEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IlJvbGUgMSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iVGhpcyBpcyBhIGJyaWVmIGRzZXNjcmlwdGlvbiBvZiBSb2xlIDEiCi0JCT4KLQkJPHByZXNlbnRhdGlvbiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgUm9sZSAxIj4KLQkJCQotCQk8L3ByZXNlbnRhdGlvbj4JCQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkJCi0JCi0JPE91dHB1dExpYnJhcnkgZGlzYWJsZT0iZmFsc2UiIC8+Ci0JCi0JPE91dHB1dFBsdWdpbiBwYXRoPSJQbHVnX0EiIHJlY3Vyc2l2ZT0iZmFsc2UiPgotCTwvT3V0cHV0UGx1Z2luPgotCQotCTxPdXRwdXRDb25maWd1cmF0aW9uIHBhdGg9IkNvbmZpZ19BIiByZWN1cnNpdmU9ImZhbHNlIj4KLQk8L091dHB1dENvbmZpZ3VyYXRpb24+Ci0JCi0JPENvbXBhcmVUb0dvbGRlbkZpbGUgCi0JCWdvbGRlbkZpbGVOYW1lPSJuZXdNZXRob2RFbGVtZW50cy54bWwiIAotCQlkaWZmQ291bnQ9IjAiIAotCQllbGVtZW50Q291bnQ9IjY0IgotCQk+Ci0JPC9Db21wYXJlVG9Hb2xkZW5GaWxlPgotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kRWxlbWVudHMvbmV3TWV0aG9kRWxlbWVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTBlMWQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZEVsZW1lbnRzL25ld01ldGhvZEVsZW1lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFRlc3Rlck91dHB1dD4KLTxNZXRob2RMaWJyYXJ5IGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNUJaYVlOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0ibmV3TGliIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTxNZXRob2RQbHVnaW4gY2hhbmdlRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVIT1ZrTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlBsdWdUZXN0IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZrZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmt0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WazlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVmxkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZsdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbDlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm1OQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9WbWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZtdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il81SE9WbTlCVkVkeWZhTGFKWXZXNFFnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii02SF9jRFFNX1FBYnpHNnlmUElKeFZBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsXzVIT1ZtOUJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81SE9Wbk5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm5kQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNUhPVm50QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVIT1ZuOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZFBsdWdpbiBhdXRob3JzPSJSTUMgdGVhbSBtZW1iZXIgQSIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81TzlWUWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQbHVnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlF0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUTlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZSTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRvbWFpbnMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZSZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRpc2NpcGxpbmVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWUnRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJSb2xlU2V0cyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlI5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iV1AgVHlwZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZTTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlRvb2xzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWU2RCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZTdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlM5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iSGlkZGVuIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPEN1c3RvbUNhdGVnb3J5IGJyaWVmRGVzY3JpcHRpb249IiIgZ3VpZD0iXzVPOVZUTkJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2YXJpYWJpbGl0eVR5cGU9Im5hIj4KLTxDb250ZW50RGVzY3JpcHRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGV4dGVybmFsSWQ9IiIgZ3VpZD0iLWFaQlNQcGFrVUluclc1MHF0R2pIa1EiIGtleUNvbnNpZGVyYXRpb25zPSIiIG1haW5EZXNjcmlwdGlvbj0iIiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyxfNU85VlROQlZFZHlmYUxhSll2VzRRZyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9Db250ZW50RGVzY3JpcHRpb24+Ci08L0N1c3RvbUNhdGVnb3J5PgotPC9Db250ZW50UGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvcmVDb250ZW50IiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVUY3pzTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnRQYWNrYWdlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Um9sZSBicmllZkRlc2NyaXB0aW9uPSJUaGlzIGlzIGEgYnJpZWYgZHNlc2NyaXB0aW9uIG9mIFJvbGUgMSIgZ3VpZD0iXzVUcEE4TkJWRWR5ZmFMYUpZdlc0UWciIGlzQWJzdHJhY3Q9ImZhbHNlIiBuYW1lPSJyb2xlXzEiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iUm9sZSAxIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Um9sZURlc2NyaXB0aW9uIGFzc2lnbm1lbnRBcHByb2FjaGVzPSIiIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQwOjI1IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii15WlBfcTlSLUhZUjNpX2doQ3JOSWdBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgUm9sZSAxIiBuYW1lPSJyb2xlXzEsXzVUcEE4TkJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBza2lsbHM9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHN5bm9ueW1zPSIiIHZlcnNpb249IiI+Ci08L1JvbGVEZXNjcmlwdGlvbj4KLTwvUm9sZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUdEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNhcGFiaWxpdHlQYXR0ZXJucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZUOUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxQcm9jZXNzUGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81TzlWVU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJQcm9jZXNzQ29udHJpYnV0aW9ucyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvUHJvY2Vzc1BhY2thZ2U+Ci08L01ldGhvZFBsdWdpbj4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iUk1DIHRlYW0gbWVtYmVyIEIiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19CIiBjaGFuZ2VEYXRlPSJUaHUgSmFuIDMxIDE1OjQwOjI0IFBTVCAyMDA4IiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVBWdndOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUGx1Z19CIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHVzZXJDaGFuZ2VhYmxlPSJ0cnVlIiB2ZXJzaW9uPSIiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ3ZEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkNvbnRlbnQiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnd0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2F0ZWdvcmllcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2dzlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEb21haW5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eE5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJEaXNjaXBsaW5lcyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnhkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUm9sZVNldHMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L0NvbnRlbnRQYWNrYWdlPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ4dEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IldQIFR5cGVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eDlCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJUb29scyIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnlOQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iU3RhbmRhcmRDYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2eWRCVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPENvbnRlbnRQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ5dEJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IkhpZGRlbiIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTxDdXN0b21DYXRlZ29yeSBicmllZkRlc2NyaXB0aW9uPSIiIGd1aWQ9Il81UFZ2eTlCVkVkeWZhTGFKWXZXNFFnIiBpc0Fic3RyYWN0PSJmYWxzZSIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmFyaWFiaWxpdHlUeXBlPSJuYSI+Ci08Q29udGVudERlc2NyaXB0aW9uIGF1dGhvcnM9IiIgYnJpZWZEZXNjcmlwdGlvbj0iIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBleHRlcm5hbElkPSIiIGd1aWQ9Ii1xc1FKLS1ySk9hVklhOVBjNm1kNmpBIiBrZXlDb25zaWRlcmF0aW9ucz0iIiBtYWluRGVzY3JpcHRpb249IiIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMsXzVQVnZ5OUJWRWR5ZmFMYUpZdlc0UWciIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvQ29udGVudERlc2NyaXB0aW9uPgotPC9DdXN0b21DYXRlZ29yeT4KLTwvQ29udGVudFBhY2thZ2U+Ci08L0NvbnRlbnRQYWNrYWdlPgotPC9Db250ZW50UGFja2FnZT4KLTxDb250ZW50UGFja2FnZSBicmllZkRlc2NyaXB0aW9uPSIiIGdsb2JhbD0iZmFsc2UiIGd1aWQ9Il81UFZ2ek5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb3JlQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnpkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNVBWdnp0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVQVnZ6OUJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTxiYXNlcyBwYXRoPSJQbHVnX0EiPgotPC9iYXNlcz4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSIiIGNoYW5nZURhdGU9IlRodSBKYW4gMzEgMTU6NDA6MjQgUFNUIDIwMDgiIGNoYW5nZURlc2NyaXB0aW9uPSIiIGd1aWQ9Il81T2UwSU5CVkVkeWZhTGFKWXZXNFFnIiBuYW1lPSJDb25maWdfVGVzdCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIiB2ZXJzaW9uPSIiPgotPC9NZXRob2RDb25maWd1cmF0aW9uPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVAwUTROQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29uZmlnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdmVyc2lvbj0iIj4KLTwvTWV0aG9kQ29uZmlndXJhdGlvbj4KLTwvTWV0aG9kTGlicmFyeT4KLTxNZXRob2RQbHVnaW4gYXV0aG9ycz0iUk1DIHRlYW0gbWVtYmVyIEEiIGJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNU85VlFkQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iUGx1Z19BIiBvcmRlcmluZ0d1aWRlPSIiIHBhdGg9IlBsdWdfQSIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSIgdXNlckNoYW5nZWFibGU9InRydWUiIHZlcnNpb249IiI+Ci08Q29udGVudFBhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlF0QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29udGVudCIgb3JkZXJpbmdHdWlkZT0iIiBwcmVzZW50YXRpb25OYW1lPSIiIHN1cHByZXNzZWQ9ImZhbHNlIj4KLTwvQ29udGVudFBhY2thZ2U+Ci08UHJvY2Vzc1BhY2thZ2UgYnJpZWZEZXNjcmlwdGlvbj0iIiBnbG9iYWw9ImZhbHNlIiBndWlkPSJfNU85VlQ5QlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iRGVsaXZlcnlQcm9jZXNzZXMiIG9yZGVyaW5nR3VpZGU9IiIgcHJlc2VudGF0aW9uTmFtZT0iIiBzdXBwcmVzc2VkPSJmYWxzZSI+Ci08L1Byb2Nlc3NQYWNrYWdlPgotPFByb2Nlc3NQYWNrYWdlIGJyaWVmRGVzY3JpcHRpb249IiIgZ2xvYmFsPSJmYWxzZSIgZ3VpZD0iXzVPOVZVTkJWRWR5ZmFMYUpZdlc0UWciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBvcmRlcmluZ0d1aWRlPSIiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiPgotPC9Qcm9jZXNzUGFja2FnZT4KLTwvTWV0aG9kUGx1Z2luPgotPE1ldGhvZENvbmZpZ3VyYXRpb24gYXV0aG9ycz0iIiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIENvbmZpZ19BIiBjaGFuZ2VEZXNjcmlwdGlvbj0iIiBndWlkPSJfNVAwUTROQlZFZHlmYUxhSll2VzRRZyIgbmFtZT0iQ29uZmlnX0EiIG9yZGVyaW5nR3VpZGU9IiIgcGF0aD0iQ29uZmlnX0EiIHByZXNlbnRhdGlvbk5hbWU9IiIgc3VwcHJlc3NlZD0iZmFsc2UiIHZlcnNpb249IiI+Ci08L01ldGhvZENvbmZpZ3VyYXRpb24+Ci08L1Rlc3Rlck91dHB1dD4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4udGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luLnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVjMTA1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4udGMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0ibmV3TGliIj4KLQk8L09wZW5MaWJyYXJ5PgotCQotCTxOZXdNZXRob2RQbHVnaW4gCi0JCW5hbWU9Ik15IDFzdCBwbHVnaW4iCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gYWJveXQgdGhlIDFzdCBwbHVnaW4iCi0JCWF1dGhvcnM9Im5hbWUgMSwgbmFtZTIsIG5hbWUzIGV0YyIJCi0JCT4JCi0JPC9OZXdNZXRob2RQbHVnaW4+Ci0JCi0JPE5ld01ldGhvZFBsdWdpbiBkaXNhYmxlPSJmYWxzZSIKLQkJbmFtZT0iTXkgMm5kIHBsdWdpbiIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBhYm95dCB0aGUgMm5kIHBsdWdpbiIKLQkJYXV0aG9ycz0ibmFtZSAxMSwgbmFtZTIyLCBuYW1lMzMgZXRjIgkKLQkJPgotCQk8YmFzZXM+Ci0JCQk8VmFsdWU+TXkgMXN0IHBsdWdpbjwvVmFsdWU+Ci0JCTwvYmFzZXM+CQkJCi0JPC9OZXdNZXRob2RQbHVnaW4+Ci0JCi0JPENvcHlMaWJyYXJ5IGxpYkZvbGRlck5hbWU9Im5ld01ldGhvZFBsdWdpbiI+Ci0JPC9Db3B5TGlicmFyeT4KLQkKLQk8Q29tcGFyZVRvTGlicmFyeSAKLQkJZ29sZGVuTGliRm9sZGVyTmFtZT0ibmV3TWV0aG9kUGx1Z2luIiAKLQkJZGlmZkNvdW50PSIwIiAKLQkJZWxlbWVudENvdW50PSIzMyIKLQkJdXNlTmFtZUFzSWQ9InRydWUiCi0JCT4JCQotCTwvQ29tcGFyZVRvTGlicmFyeT4JCi08L01ldGhvZExpYnJhcnlUZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVGVzdENvbW1hbmRzL25ld01ldGhvZFBsdWdpbi9uZXdNZXRob2RQbHVnaW4vTXkgMXN0IHBsdWdpbi9wbHVnaW4ueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAxc3QgcGx1Z2luL3BsdWdpbi54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZGNiZmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAxc3QgcGx1Z2luL3BsdWdpbi54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHhtaTpYTUkgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VwZi91bWEvMS4wLjMvdW1hLmVjb3JlIiB4bWxuczpvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcj0iaHR0cDovLy9vcmcvZWNsaXBzZS9lcGYvdW1hL3Jlc291cmNlbWFuYWdlci5lY29yZSIgcm1jOnZlcnNpb249IjcuMS4wIiBlcGY6dmVyc2lvbj0iMS4wLjAiPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyIHhtaTppZD0iX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciIGd1aWQ9Il9lVTdOVUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZFBsdWdpbiB4bWk6aWQ9Il9lVTFHc0Z1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJNeSAxc3QgcGx1Z2luIiBndWlkPSJfZVUxR3NGdTBFZHVzcU9jVWp4Y1IxdyIgYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBhYm95dCB0aGUgMXN0IHBsdWdpbiIgYXV0aG9ycz0ibmFtZSAxLCBuYW1lMiwgbmFtZTMgZXRjIj4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUdzVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNvbnRlbnQiIGd1aWQ9Il9lVTFHc1Z1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHc2x1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDYXRlZ29yaWVzIiBndWlkPSJfZVUxR3NsdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHczF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEb21haW5zIiBndWlkPSJfZVUxR3MxdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3RGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iRGlzY2lwbGluZXMiIGd1aWQ9Il9lVTFHdEZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdFZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJSb2xlU2V0cyIgZ3VpZD0iX2VVMUd0VnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd0bHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IldQIFR5cGVzIiBndWlkPSJfZVUxR3RsdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3QxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iVG9vbHMiIGd1aWQ9Il9lVTFHdDF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdUZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJTdGFuZGFyZENhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHdUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdVZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDdXN0b21DYXRlZ29yaWVzIiBndWlkPSJfZVUxR3VWdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VVMUd1bHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkhpZGRlbiIgZ3VpZD0iX2VVMUd1bHUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgICAgICAgPGNvbnRlbnRFbGVtZW50cyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDdXN0b21DYXRlZ29yeSIgeG1pOmlkPSJfZVUxR3UxdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ3VzdG9tIENhdGVnb3JpZXMiIGd1aWQ9Il9lVTFHdTF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgICAgPC9jaGlsZFBhY2thZ2VzPgotICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVUxR3ZGdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ29yZUNvbnRlbnQiIGd1aWQ9Il9lVTFHdkZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVUxR3ZWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ2FwYWJpbGl0eVBhdHRlcm5zIiBndWlkPSJfZVUxR3ZWdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgIDwvbWV0aG9kUGFja2FnZXM+Ci0gICAgPG1ldGhvZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVTFHdmx1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEZWxpdmVyeVByb2Nlc3NlcyIgZ3VpZD0iX2VVMUd2bHUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VVMUd2MXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlByb2Nlc3NDb250cmlidXRpb25zIiBndWlkPSJfZVUxR3YxdTBFZHVzcU9jVWp4Y1IxdyIvPgotICA8L29yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luPgotPC94bWk6WE1JPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9NeSAybmQgcGx1Z2luL3BsdWdpbi54bWkgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDJuZCBwbHVnaW4vcGx1Z2luLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlMDVhZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL015IDJuZCBwbHVnaW4vcGx1Z2luLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08eG1pOlhNSSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWE9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZXBmL3VtYS8xLjAuMy91bWEuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyPSJodHRwOi8vL29yZy9lY2xpcHNlL2VwZi91bWEvcmVzb3VyY2VtYW5hZ2VyLmVjb3JlIiBybWM6dmVyc2lvbj0iNy4xLjAiIGVwZjp2ZXJzaW9uPSIxLjAuMCI+Ci0gIDxvcmcuZWNsaXBzZS5lcGYudW1hLnJlc291cmNlbWFuYWdlcjpSZXNvdXJjZU1hbmFnZXIgeG1pOmlkPSJfZVZOaE1GdTBFZHVzcU9jVWp4Y1IxdyIgZ3VpZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWE6TWV0aG9kUGx1Z2luIHhtaTppZD0iX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9Ik15IDJuZCBwbHVnaW4iIGd1aWQ9Il9lVkhha0Z1MEVkdXNxT2NVanhjUjF3IiBicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIGFib3l0IHRoZSAybmQgcGx1Z2luIiBhdXRob3JzPSJuYW1lIDExLCBuYW1lMjIsIG5hbWUzMyBldGMiPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWtWdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iQ29udGVudCIgZ3VpZD0iX2VWSGFrVnUwRWR1c3FPY1VqeGNSMXciPgotICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFrbHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkNhdGVnb3JpZXMiIGd1aWQ9Il9lVkhha2x1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFrMXUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRvbWFpbnMiIGd1aWQ9Il9lVkhhazF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbEZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJEaXNjaXBsaW5lcyIgZ3VpZD0iX2VWSGFsRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFsVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlJvbGVTZXRzIiBndWlkPSJfZVZIYWxWdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYWxsdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iV1AgVHlwZXMiIGd1aWQ9Il9lVkhhbGx1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbDF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJUb29scyIgZ3VpZD0iX2VWSGFsMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFtRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IlN0YW5kYXJkQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFtRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgPGNoaWxkUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6Q29udGVudFBhY2thZ2UiIHhtaTppZD0iX2VWSGFtVnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkN1c3RvbUNhdGVnb3JpZXMiIGd1aWQ9Il9lVkhhbVZ1MEVkdXNxT2NVanhjUjF3Ij4KLSAgICAgICAgICA8Y2hpbGRQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpDb250ZW50UGFja2FnZSIgeG1pOmlkPSJfZVZIYW1sdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iSGlkZGVuIiBndWlkPSJfZVZIYW1sdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgICAgICAgICA8Y29udGVudEVsZW1lbnRzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkN1c3RvbUNhdGVnb3J5IiB4bWk6aWQ9Il9lVkhhbTF1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDdXN0b20gQ2F0ZWdvcmllcyIgZ3VpZD0iX2VWSGFtMXUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgICAgICA8L2NoaWxkUGFja2FnZXM+Ci0gICAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDwvY2hpbGRQYWNrYWdlcz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOkNvbnRlbnRQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhbkZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDb3JlQ29udGVudCIgZ3VpZD0iX2VWSGFuRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgICAgIDxjaGlsZFBhY2thZ2VzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5lcGYudW1hOlByb2Nlc3NQYWNrYWdlIiB4bWk6aWQ9Il9lVkhhblZ1MEVkdXNxT2NVanhjUjF3IiBuYW1lPSJDYXBhYmlsaXR5UGF0dGVybnMiIGd1aWQ9Il9lVkhhblZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPC9tZXRob2RQYWNrYWdlcz4KLSAgICA8bWV0aG9kUGFja2FnZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmVwZi51bWE6UHJvY2Vzc1BhY2thZ2UiIHhtaTppZD0iX2VWSGFubHUwRWR1c3FPY1VqeGNSMXciIG5hbWU9IkRlbGl2ZXJ5UHJvY2Vzc2VzIiBndWlkPSJfZVZIYW5sdTBFZHVzcU9jVWp4Y1IxdyIvPgotICAgIDxtZXRob2RQYWNrYWdlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuZXBmLnVtYTpQcm9jZXNzUGFja2FnZSIgeG1pOmlkPSJfZVZIYW4xdTBFZHVzcU9jVWp4Y1IxdyIgbmFtZT0iUHJvY2Vzc0NvbnRyaWJ1dGlvbnMiIGd1aWQ9Il9lVkhhbjF1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPGJhc2VzIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RQbHVnaW4+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL2xpYnJhcnkueG1pIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9UZXN0Q29tbWFuZHMvbmV3TWV0aG9kUGx1Z2luL25ld01ldGhvZFBsdWdpbi9saWJyYXJ5LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmMDkzNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1Rlc3RDb21tYW5kcy9uZXdNZXRob2RQbHVnaW4vbmV3TWV0aG9kUGx1Z2luL2xpYnJhcnkueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx4bWk6WE1JIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lcGYvdW1hLzEuMC4zL3VtYS5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvZXBmL3VtYS9yZXNvdXJjZW1hbmFnZXIuZWNvcmUiIHJtYzp2ZXJzaW9uPSI3LjEuMCIgZXBmOnZlcnNpb249IjEuMC4wIj4KLSAgPG9yZy5lY2xpcHNlLmVwZi51bWEucmVzb3VyY2VtYW5hZ2VyOlJlc291cmNlTWFuYWdlciB4bWk6aWQ9Il9lUDNISUZ1MEVkdXNxT2NVanhjUjF3IiBndWlkPSJfZVAzSElGdTBFZHVzcU9jVWp4Y1IxdyI+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX2VVN05VRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTdOVUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPHN1Yk1hbmFnZXJzIHhtaTppZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVkhha0Z1MEVkdXNxT2NVanhjUjF3I19lVk5oTUZ1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVAzSElWdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lUHhBZ0Z1MEVkdXNxT2NVanhjUjF3IiB1cmk9IiIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VVN05VVnUwRWR1c3FPY1VqeGNSMXciIGlkPSJfZVU3TlVGdTBFZHVzcU9jVWp4Y1IxdyIgdXJpPSJNeSUyMDFzdCUyMHBsdWdpbi9wbHVnaW4ueG1pIi8+Ci0gICAgPHJlc291cmNlRGVzY3JpcHRvcnMgeG1pOmlkPSJfZVU3TlVsdTBFZHVzcU9jVWp4Y1IxdyIgaWQ9Il9lVTFHc0Z1MEVkdXNxT2NVanhjUjF3IiB1cmk9Ik15JTIwMXN0JTIwcGx1Z2luL3BsdWdpbi54bWkiLz4KLSAgICA8cmVzb3VyY2VEZXNjcmlwdG9ycyB4bWk6aWQ9Il9lVk5oTVZ1MEVkdXNxT2NVanhjUjF3IiBpZD0iX2VWTmhNRnUwRWR1c3FPY1VqeGNSMXciIHVyaT0iTXklMjAybmQlMjBwbHVnaW4vcGx1Z2luLnhtaSIvPgotICAgIDxyZXNvdXJjZURlc2NyaXB0b3JzIHhtaTppZD0iX2VWTmhNbHUwRWR1c3FPY1VqeGNSMXciIGlkPSJfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIgdXJpPSJNeSUyMDJuZCUyMHBsdWdpbi9wbHVnaW4ueG1pIi8+Ci0gIDwvb3JnLmVjbGlwc2UuZXBmLnVtYS5yZXNvdXJjZW1hbmFnZXI6UmVzb3VyY2VNYW5hZ2VyPgotICA8b3JnLmVjbGlwc2UuZXBmLnVtYTpNZXRob2RMaWJyYXJ5IHhtaTppZD0iX2VQeEFnRnUwRWR1c3FPY1VqeGNSMXciIG5hbWU9Im5ld0xpYiIgZ3VpZD0iX2VQeEFnRnUwRWR1c3FPY1VqeGNSMXciPgotICAgIDxtZXRob2RQbHVnaW5zIHhtaTppZD0iX2VVMUdzRnUwRWR1c3FPY1VqeGNSMXciIGhyZWY9InVtYTovL19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3I19lVTFHc0Z1MEVkdXNxT2NVanhjUjF3Ii8+Ci0gICAgPG1ldGhvZFBsdWdpbnMgeG1pOmlkPSJfZVZIYWtGdTBFZHVzcU9jVWp4Y1IxdyIgaHJlZj0idW1hOi8vX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXcjX2VWSGFrRnUwRWR1c3FPY1VqeGNSMXciLz4KLSAgPC9vcmcuZWNsaXBzZS5lcGYudW1hOk1ldGhvZExpYnJhcnk+Ci08L3htaTpYTUk+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjIxNDgudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjIxNDgudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzMGI0OGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTYyMTQ4LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9InRydWUiPgotCQotCTxPcGVuTGlicmFyeSBsaWJGb2xkZXJOYW1lPSIxNjIxNDgiPgotCTwvT3BlbkxpYnJhcnk+CQotCQotCTxOZXdNZXRob2RFbGVtZW50Ci0JCXR5cGU9Ik1ldGhvZFBsdWdpbiIgCi0JCW5hbWU9IlBsdWdfQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBQbHVnX0EiCi0JCWF1dGhvcnM9IlNvbWVib2R5IgkKLQkJPgkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IAotCQl0eXBlPSJNZXRob2RDb25maWd1cmF0aW9uIgotCQluYW1lPSJDb25maWdfQSIKLQkJPgkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJCIgotCQlwcmVzZW50YXRpb25OYW1lPSJCIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIEIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CIgotCQluYW1lPSJCMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQjEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CL0IxIgotCQluYW1lPSJCMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQjIiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQSIKLQkJYnJpZWZEZXNjcmlwdGlvbj0iQnJpZWYgZGVzY2lwdGlvbiBvZiBBIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDIgotCQlwcmVzZW50YXRpb25OYW1lPSJDIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIEMiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9CIgotCQl2YXJpYWJpbGl0eVR5cGU9ImNvbnRyaWJ1dGVzIgotCQk+CQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIEIiPgkJCQotCQk8L3ByZXNlbnRhdGlvbj4KLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0E8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgQyI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0IvQjEvQjIiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHByZXNlbnRhdGlvbiAKLQkJCW1haW5EZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgbWFpbiBkZXNjcmlwdGlvbiBvZiBCMiI+CQkJCi0JCTwvcHJlc2VudGF0aW9uPgotCQk8dmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4KLQkJCTxWYWx1ZT5QbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQzwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjEiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSI1IgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjk1MDEudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNjk1MDEudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTA0ZmIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTY5NTAxLnRjCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxNZXRob2RMaWJyYXJ5VGVzdCBkaXNhYmxlPSJmYWxzZSIgdmVyYm9zZT0idHJ1ZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE2OTUwMSI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkJCQkJCQkJCQkKLQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iY3AxIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIGNwMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL2NwMSIKLQkJbmFtZT0iYTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9ImNwMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iY3AyIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQotCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcDIiCi0JCW5hbWU9ImEyIgotCQlwcmVzZW50YXRpb25OYW1lPSJhMiIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8RWRpdE1ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvY3AxL2ExIgotCQl2YXJpYWJpbGl0eVR5cGU9ImNvbnRyaWJ1dGVzIgotCQk+CQkJCQotCQk8cHJlc2VudGF0aW9uIAotCQkJbWFpbkRlc2NyaXB0aW9uPSJUaGlzIGlzIHRoZSBtYWluIGRlc2NyaXB0aW9uIG9mIGExIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9jcDIvYTI8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIGVycm9yQ291bnQ9IjAiPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwMjk0LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwMjk0LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWY2ZjU5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MDI5NC50YworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE3MDI5NCI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQkJCQkJCQkJCQotCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1BhIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUGEiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhIgotCQluYW1lPSJhMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BhL2ExIgotCQluYW1lPSJhMTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImExMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIiAKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEvYTExIgotCQluYW1lPSJhMTExIgotCQlwcmVzZW50YXRpb25OYW1lPSJhMTExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQYiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1BiIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYiIKLQkJbmFtZT0iYjEiCi0JCXByZXNlbnRhdGlvbk5hbWU9ImIxIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9iMSIKLQkJbmFtZT0iYjExIgotCQlwcmVzZW50YXRpb25OYW1lPSJiMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIgCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1BiL2IxL2IxMSIKLQkJbmFtZT0iYjExMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iYjExMSIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iY29udHJpYnV0ZXMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGIvYjE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvYTEvYTExL2ExMTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9iMTwvVmFsdWU+Ci0JCTwvdmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudD4JCQotCTwvRWRpdE1ldGhvZEVsZW1lbnQ+Ci0JCQotCTxDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBkaXNhYmxlPSJmYWxzZSIgCi0JCWVycm9yQ291bnQ9IjIiCi0JCWNpcmN1bGFyRWxlbWVudENvdW50PSI5IgotCQk+Ci0JPC9DaXJjdWxhckRlcGVuZGVuY3lDaGVjaz4JCi0JCi0JCi0JCQotPC9NZXRob2RMaWJyYXJ5VGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzA1OTcudGMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvTGlicmFyaWVzLzEuMC4wL1ZhbGlkYXRpb24vQnVncy8xNzA1OTcudGMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YWYyNDUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcwNTk3LnRjCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08TWV0aG9kTGlicmFyeVRlc3QgZGlzYWJsZT0iZmFsc2UiIHZlcmJvc2U9ImZhbHNlIj4KLQkKLQk8T3BlbkxpYnJhcnkgbGliRm9sZGVyTmFtZT0iMTcwNTk3Ij4KLQk8L09wZW5MaWJyYXJ5PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudAotCQl0eXBlPSJNZXRob2RQbHVnaW4iIAotCQluYW1lPSJQbHVnX0EiCi0JCWJyaWVmRGVzY3JpcHRpb249IkJyaWVmIGRlc2NpcHRpb24gb2YgUGx1Z19BIgotCQlhdXRob3JzPSJTb21lYm9keSIJCi0JCT4JCi0JPC9OZXdNZXRob2RFbGVtZW50PgkKLQkKLQk8TmV3TWV0aG9kRWxlbWVudCAKLQkJdHlwZT0iTWV0aG9kQ29uZmlndXJhdGlvbiIKLQkJbmFtZT0iQ29uZmlnX0EiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUDEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkNhcGFiaWxpdHlQYXR0ZXJuIgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMiCi0JCW5hbWU9IkNQMiIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AyIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1AzIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUDMiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkJCQkJCQkJCQkJCQkJCQkJCQotCQkJCQkJCQkJCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AxIgotCQluYW1lPSJDUDIiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMiIKLQkJPgkJCQkJCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiCi0JCXR5cGU9IkFjdGl2aXR5IgotCQlwYXJlbnRQYXRoPSJQbHVnX0EvQ29udGVudC9DYXBhYmlsaXR5UGF0dGVybnMvQ1AyIgotCQluYW1lPSJDUDMiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQMyIKLQkJPgkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0KLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDMiCi0JCW5hbWU9IkNQMSIKLQkJcHJlc2VudGF0aW9uTmFtZT0iQ1AxIgotCQk+CQkKLQkJPGRlZmF1bHRDb250ZXh0PgotCQkJPFZhbHVlPkNvbmZpZ19BPC9WYWx1ZT4KLQkJPC9kZWZhdWx0Q29udGV4dD4JCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0KLQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDEvQ1AyIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDI8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgkKLQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDIvQ1AzIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDM8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDMvQ1AxIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUDE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIAotCQllcnJvckNvdW50PSIxIgotCQljaXJjdWxhckVsZW1lbnRDb3VudD0iNiIKLQkJPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcxMDI4LnRjIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL0xpYnJhcmllcy8xLjAuMC9WYWxpZGF0aW9uL0J1Z3MvMTcxMDI4LnRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ0ZDc0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9MaWJyYXJpZXMvMS4wLjAvVmFsaWRhdGlvbi9CdWdzLzE3MTAyOC50YworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPE1ldGhvZExpYnJhcnlUZXN0IGRpc2FibGU9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSI+Ci0JCi0JPE9wZW5MaWJyYXJ5IGxpYkZvbGRlck5hbWU9IjE3MTAyOCI+Ci0JPC9PcGVuTGlicmFyeT4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQKLQkJdHlwZT0iTWV0aG9kUGx1Z2luIiAKLQkJbmFtZT0iUGx1Z19BIgotCQlicmllZkRlc2NyaXB0aW9uPSJCcmllZiBkZXNjaXB0aW9uIG9mIFBsdWdfQSIKLQkJYXV0aG9ycz0iU29tZWJvZHkiCQotCQk+CQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPE5ld01ldGhvZEVsZW1lbnQgCi0JCXR5cGU9Ik1ldGhvZENvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IkNvbmZpZ19BIgotCQk+CQkKLQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCQkJCQkJCQkJCi0JCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJDYXBhYmlsaXR5UGF0dGVybiIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zIgotCQluYW1lPSJDUGEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkNQYSIKLQkJPgkJCi0JCTxkZWZhdWx0Q29udGV4dD4KLQkJCTxWYWx1ZT5Db25maWdfQTwvVmFsdWU+Ci0JCTwvZGVmYXVsdENvbnRleHQ+CQkKLQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCQkJCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYSIKLQkJbmFtZT0iQTEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkExIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+Ci0JCi0JPE5ld01ldGhvZEVsZW1lbnQgZGlzYWJsZT0iZmFsc2UiIAotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9BMSIKLQkJbmFtZT0iQTExIgotCQlwcmVzZW50YXRpb25OYW1lPSJBMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4KLQkKLQk8TmV3TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQ2FwYWJpbGl0eVBhdHRlcm4iCi0JCXBhcmVudFBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucyIKLQkJbmFtZT0iQ1BiIgotCQlwcmVzZW50YXRpb25OYW1lPSJDUGIiCi0JCT4JCQotCQk8ZGVmYXVsdENvbnRleHQ+Ci0JCQk8VmFsdWU+Q29uZmlnX0E8L1ZhbHVlPgotCQk8L2RlZmF1bHRDb250ZXh0PgkJCi0JCQkJCi0JPC9OZXdNZXRob2RFbGVtZW50PgotCQkJCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYiIKLQkJbmFtZT0iQjEiCi0JCXByZXNlbnRhdGlvbk5hbWU9IkIxIgotCQk+CQkJCQkJCQkKLQk8L05ld01ldGhvZEVsZW1lbnQ+CQotCQotCTxOZXdNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGFyZW50UGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9CMSIKLQkJbmFtZT0iQjExIgotCQlwcmVzZW50YXRpb25OYW1lPSJCMTEiCi0JCT4JCQkJCQkJCQotCTwvTmV3TWV0aG9kRWxlbWVudD4JCi0JCi0JPEVkaXRNZXRob2RFbGVtZW50IGRpc2FibGU9ImZhbHNlIgotCQl0eXBlPSJBY3Rpdml0eSIKLQkJcGF0aD0iUGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYS9BMS9BMTEiCi0JCXZhcmlhYmlsaXR5VHlwZT0iZXh0ZW5kcyIKLQkJPgkJCQkKLQkJPHZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+Ci0JCQk8VmFsdWU+UGx1Z19BL0NvbnRlbnQvQ2FwYWJpbGl0eVBhdHRlcm5zL0NQYi9CMS9CMTE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQotCTxFZGl0TWV0aG9kRWxlbWVudCBkaXNhYmxlPSJmYWxzZSIKLQkJdHlwZT0iQWN0aXZpdHkiCi0JCXBhdGg9IlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGIvQjEvQjExIgotCQl2YXJpYWJpbGl0eVR5cGU9ImV4dGVuZHMiCi0JCT4JCQkJCi0JCTxwcmVzZW50YXRpb24gCi0JCQltYWluRGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIG1haW4gZGVzY3JpcHRpb24gb2YgQjExIj4JCQkKLQkJPC9wcmVzZW50YXRpb24+Ci0JCTx2YXJpYWJpbGl0eUJhc2VkT25FbGVtZW50PgotCQkJPFZhbHVlPlBsdWdfQS9Db250ZW50L0NhcGFiaWxpdHlQYXR0ZXJucy9DUGEvQTE8L1ZhbHVlPgotCQk8L3ZhcmlhYmlsaXR5QmFzZWRPbkVsZW1lbnQ+CQkKLQk8L0VkaXRNZXRob2RFbGVtZW50PgotCQkKLQk8Q2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZGlzYWJsZT0iZmFsc2UiIAotCQllcnJvckNvdW50PSIxIgotCQljaXJjdWxhckVsZW1lbnRDb3VudD0iMyIKLQkJPgotCTwvQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s+CQotCQotCQotCQkKLTwvTWV0aG9kTGlicmFyeVRlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmRiODQ3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IExpYnJhcnkgVGVzdHMgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMC5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLAotIG9yZy5lY2xpcHNlLmVwZi5kYXRhZXhjaGFuZ2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnksCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmVwZi5leHBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLAotIG9yZy5lY2xpcHNlLmVwZi5pbXBvcnQsCi0gb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmltcG9ydC54bWwsCi0gb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlciwKLSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLlRlc3RzUGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5YzUxMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIExpYnJhcmllcy8KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlEaWZmQW5hbHl6b3IuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlEaWZmQW5hbHl6b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNhNDFmOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5RGlmZkFuYWx5em9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uRVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUmVzb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0VHJhY2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuR3JhcGhOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQYWNrYWdlOwotCi0vKioKLSAqIENsYXNzIHRvIGFuYWx5emUgdGhlIGRpZmZlcm5lY2VzIGJldHdlZW4gdHdvIG1ldGhvZCBsaWJyYXJpZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlEaWZmQW5hbHl6b3IgewotCQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXN0VHJhY2VyIHRyYWNlcjsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGliMTsKLQlwcml2YXRlIE1ldGhvZExpYnJhcnkgbGJpMjsKLQlwcml2YXRlIGJvb2xlYW4gZ3JlZWR5ID0gdHJ1ZTsKLQlwcml2YXRlIGludCBjb21wYXJlT3B0aW9uID0gMTsJCS8vMDogZWxlbWVudDEgYW5kIGVsZW1lbnQyIGFyZSBvbiBlcXVhbCBmb290aW5nLCAvLzE6IGVsZW1lbnQxIGlzIGEgc3VwZXIgc2V0IG9mIGVsZW1lbnQyCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRUb0FuYWx5emUgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBjb21wYXJlUmVzdWx0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZGlmZkNvdW50ID0gMDsKLQlwcml2YXRlIGludCBlbGVtQ29tcGFyZWRDb3VudCA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVtcHR5U3RyaW5nID0gIiI7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBlbXB0eUxpbmUgPSBQYXR0ZXJuLmNvbXBpbGUoIlxccyIsIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSB8IFBhdHRlcm4uRE9UQUxMKTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJpbSA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljICBib29sZWFuIHNraXBSZWYgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlTmFtZUFzMm5kSWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBTZXQgc2tpcEZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCi0JcHVibGljIExpYnJhcnlEaWZmQW5hbHl6b3IoVGVzdFRyYWNlciB0LCBNZXRob2RMaWJyYXJ5IGwxLCBNZXRob2RMaWJyYXJ5IGwyKSB7Ci0JCXRyYWNlciA9IHQ7Ci0JCWxpYjEgPSBsMTsKLQkJbGJpMiA9IGwyOwotCQlMaWJyYXJ5VXRpbC5sb2FkQWxsKChNZXRob2RMaWJyYXJ5KSBsaWIxKTsKLQkJTGlicmFyeVV0aWwubG9hZEFsbCgoTWV0aG9kTGlicmFyeSkgbGJpMik7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VHJpbShib29sZWFuIGIpIHsKLQkJdHJpbSA9IGI7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTa2lwUmVmKGJvb2xlYW4gYikgewotCQlza2lwUmVmID0gYjsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRFeGNsdWRlZEZlYXR1cmUoU3RyaW5nIGZlYXR1cmVOYW1lKSB7Ci0JCXNraXBGZWF0dXJlU2V0LmFkZChmZWF0dXJlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplKCkgewotCQlpZiAoISBuZWVkVG9BbmFseXplKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJY29tcGFyZVJlc3VsdCA9IGVsZW1lbnRFcXVhbHMobGliMSwgbGJpMik7Ci0JCW5lZWRUb0FuYWx5emUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKCkgewotCQlhbmFseXplKCk7Ci0JCXJldHVybiBjb21wYXJlUmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHcmVlZHkoYm9vbGVhbiBiKSB7Ci0JCWlmIChncmVlZHkgIT0gYikgewotCQkJbmVlZFRvQW5hbHl6ZSA9IHRydWU7Ci0JCX0KLQkJZ3JlZWR5ID0gYjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyZU9wdGlvbihpbnQgaXgpIHsKLQkJaWYgKGNvbXBhcmVPcHRpb24gIT0gaXgpIHsKLQkJCW5lZWRUb0FuYWx5emUgPSB0cnVlOwotCQl9Ci0JCWNvbXBhcmVPcHRpb24gPSBpeDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFVzZU5hbWVBczJuZElkKGJvb2xlYW4gYikgewotCQl1c2VOYW1lQXMybmRJZCA9IGI7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQlpZiAodHJhY2VyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cmFjZXIudHJhY2UobGluZSk7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQl9Ci0JCi0JLy9Ub3AgZW50cnkgZm9yIGNvbXBhcml6b24KLQlwdWJsaWMgYm9vbGVhbiBlbGVtZW50RXF1YWxzKE1ldGhvZEVsZW1lbnQgZWxlbTEsICBNZXRob2RFbGVtZW50IGVsZW0yKSB7Ci0JCWRpZmZDb3VudCA9IDA7Ci0JCWVsZW1Db21wYXJlZENvdW50ID0gMDsKLQkJdHJhY2UoIiIpOwotCQl0cmFjZSgiZWxlbWVudEVxdWFscyAtPiAiKTsKLQkJdHJhY2UoImVsZW0xOiAiICsgZWxlbTEpOwotCQl0cmFjZSgiZWxlbTI6ICIgKyBlbGVtMiArICJcbiIpOwotCQljb21wYXJlKG5ldyBBcnJheUxpc3QoKSwgZWxlbTEsIGVsZW0yLCBuZXcgSGFzaE1hcCgpKTsKLQkJdHJhY2UoImVsZW1lbnRFcXVhbHMgPC0gZGlmZnM6ICIgKyBkaWZmQ291bnQgKyAiLCBlbGVtZW50czogIiArIGVsZW1Db21wYXJlZENvdW50ICsgIlxuIik7Ci0JCXJldHVybiBkaWZmQ291bnQgPT0gMDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCAgTWV0aG9kRWxlbWVudCBlbGVtMiwgTWFwIGNvbXBhcmVkRWxlbU1hcCkgewotCQlwYXRoLmFkZChlbGVtMSk7Ci0JCWVsZW1Db21wYXJlZENvdW50Kys7Ci0JCWNvbXBhcmVfKHBhdGgsIGVsZW0xLCBlbGVtMiwgY29tcGFyZWRFbGVtTWFwKTsKLQkJcGF0aC5yZW1vdmUocGF0aC5zaXplKCkgLSAxKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVfKExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgIE1ldGhvZEVsZW1lbnQgZWxlbTIsIE1hcCBjb21wYXJlZEVsZW1NYXApIHsKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCXRyYWNlKCJwYXRoOiAiICsgcGF0aFRvU3RyaW5nKHBhdGgpKTsKLQkJfQkJCQkKLQkJCi0JCWJvb2xlYW4gdG9wTGV2ZWwgPSBlbGVtMSA9PSBsaWIxICYmIGVsZW0yID09IGxiaTI7Ci0JCWJvb2xlYW4gY2hlY2tFcXVhbFNpemUgPSBjb21wYXJlT3B0aW9uID09IDAgJiYgIXRvcExldmVsOwotCQkKLQkJTGlzdCBjb250ZW50TGlzdDEgPSBlbGVtMS5lQ29udGVudHMoKTsKLQkJTGlzdCBjb250ZW50TGlzdDIgPSBlbGVtMi5lQ29udGVudHMoKTsKLQkJaW50IHN6MSA9IGNvbnRlbnRMaXN0MS5zaXplKCk7Ci0JCWludCBzejIgPSBjb250ZW50TGlzdDIuc2l6ZSgpOwotCQkKLQkJaWYgKCBjaGVja0VxdWFsU2l6ZSAmJiBzejEgIT0gc3oyKSB7Ci0JCQlTdHJpbmcgbXNnID0gInN6MSAhPSBzejI6ICIgKyBzejEgKyAiICE9ICIgKyBzejI7Ci0JCQlsb2dXYXJuaW5nKG1zZywgcGF0aCwgZWxlbTEsIGVsZW0yKTsJCQotCQl9CQkKLQkJCi0JCWludCBlbGVtQ291bnQxID0gMDsKLQkJSGFzaE1hcCBlbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSGFzaE1hcCBlbGVtZW50TmFtZU1hcCA9IHVzZU5hbWVBczJuZElkID8gbmV3IEhhc2hNYXAoKSA6IG51bGw7Ci0JCUhhc2hNYXAgZWxlbWVudENoaWxkTWFwID0gdXNlTmFtZUFzMm5kSWQgPyBuZXcgSGFzaE1hcCgpIDogbnVsbDsKLQkJZm9yIChpbnQgaT0wOyBpIDwgc3oxOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjb250ZW50TGlzdDEuZ2V0KGkpOwotCQkJaWYgKHRvQ2hlY2tPYmplY3Qob2JqKSkgewotCQkJCWVsZW1Db3VudDErKzsKLQkJCQlTdHJpbmcgZ3VpZCA9ICgoTWV0aG9kRWxlbWVudCkgb2JqKS5nZXRHdWlkKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoKE1ldGhvZEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQkJCWlmICghIGNvbXBhcmVkRWxlbU1hcC5jb250YWluc0tleShndWlkKSkgewotCQkJCQllbGVtZW50TWFwLnB1dChndWlkLCBvYmopOwotCQkJCQlpZiAodXNlTmFtZUFzMm5kSWQpIHsKLQkJCQkJCU9iamVjdCBvYmpJbk1hcCA9IGVsZW1lbnROYW1lTWFwLmdldChuYW1lKTsKLQkJCQkJCWlmIChvYmpJbk1hcCA9PSBudWxsKSB7Ci0JCQkJCQkJZWxlbWVudE5hbWVNYXAucHV0KG5hbWUsIG9iaik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUxpc3QgbGlzdCA9IG51bGw7Ci0JCQkJCQkJaWYgKG9iakluTWFwIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQkJCQlsaXN0ID0gKExpc3QpIG9iakluTWFwOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQkJCWxpc3QuYWRkKG9iakluTWFwKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbGlzdC5hZGQob2JqKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJTGlzdCBjaGlsZExpc3QgPSBudWxsOwotCQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCQkJCQljaGlsZExpc3QgPSAoKE1ldGhvZFBhY2thZ2UpIG9iaikuZUNvbnRlbnRzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY2hpbGRMaXN0ICE9IG51bGwgJiYgISBjaGlsZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQkJTWV0aG9kRWxlbWVudCBjaDAgPSAoTWV0aG9kRWxlbWVudCkgY2hpbGRMaXN0LmdldCgwKTsKLQkJCQkJCQllbGVtZW50Q2hpbGRNYXAucHV0KGNoMC5nZXRHdWlkKCksIG9iaik7Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX0KLQkJCQkJCi0JCQkJCWNvbXBhcmVkRWxlbU1hcC5wdXQoZ3VpZCwgb2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaW50IGVsZW1Db3VudDIgPSAwOwotCQlmb3IgKGludCBpPTA7IGkgPCBzejI7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGNvbnRlbnRMaXN0Mi5nZXQoaSk7Ci0JCQlpZiAodG9DaGVja09iamVjdChvYmopKSB7Ci0JCQkJZWxlbUNvdW50MisrOwotCQkJfQotCQl9Ci0JCWlmIChlbGVtQ291bnQxIDwgZWxlbUNvdW50MiB8fCBlbGVtQ291bnQxID4gZWxlbUNvdW50MiAmJiBjaGVja0VxdWFsU2l6ZSkgewotCQkJU3RyaW5nIG1zZyA9ICJlbGVtQ291bnQxICE9IGVsZW1Db3VudDI6ICIgKyBlbGVtQ291bnQxICsgIiAhPSAiICsgZWxlbUNvdW50MjsKLQkJCWxvZ0RpZmYobXNnLCBwYXRoLCBlbGVtMSwgZWxlbTIpOwotCQkJaWYgKCFncmVlZHkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKCEgKGVsZW0xIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkpIHsKLQkJCUxpc3QgcHJvcGVydGllcyA9IGVsZW0xLmdldEluc3RhbmNlUHJvcGVydGllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRVByb3BlcnR5IGVwID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBlcC5nZXRFU3RydWN0dXJhbEZlYXR1cmUoKTsKLQkJCQlpZiAoc2tpcEZlYXR1cmVTZXQuY29udGFpbnMoZmVhdHVyZS5nZXROYW1lKCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlPYmplY3QgdmFsMSA9ICIxIC4uLiA/IjsKLQkJCQlPYmplY3QgdmFsMiA9ICIyIC4uLiA/IjsKLQkJCQl0cnkgewotCQkJCQl2YWwxID0gZWxlbTEuZUdldChmZWF0dXJlKTsKLQkJCQkJdmFsMiA9IGVsZW0yLmVHZXQoZmVhdHVyZSk7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsJCQkJCQotCQkJCX0KLQkJCQlpZiAoISBmZWF0dXJlVmFsdWVFcXVhbHModmFsMSwgdmFsMikpIHsKLQkJCQkJaWYgKGZlYXR1cmUuZ2V0TmFtZSgpICE9ICJndWlkIiB8fCAhdXNlTmFtZUFzMm5kSWQpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSAiRGlmZiB2YWx1ZXMgaW4gZmVhdHVyZTogIiArIGZlYXR1cmUuZ2V0TmFtZSgpOwotCQkJCQkJbG9nRGlmZihtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgdmFsMSwgdmFsMik7Ci0JCQkJCQlpZiAoIWdyZWVkeSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkJCQotCQkvL0NvbXBhcmUgZm9yIGNvbnRhaW5lZCBlbGVtZW50cwkJCi0JCWZvciAoaW50IGk9MDsgaSA8IHN6MjsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY29udGVudExpc3QyLmdldChpKTsKLQkJCWlmICghIHRvQ2hlY2tPYmplY3Qob2JqKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlNZXRob2RFbGVtZW50IHN1YkVsZW0yID0gKE1ldGhvZEVsZW1lbnQpIG9iajsKLQkJCU1ldGhvZEVsZW1lbnQgc3ViRWxlbTEgPSAoTWV0aG9kRWxlbWVudCkgZWxlbWVudE1hcC5nZXQoc3ViRWxlbTIuZ2V0R3VpZCgpKTsKLQkJCWlmICh1c2VOYW1lQXMybmRJZCAmJiBzdWJFbGVtMSA9PSBudWxsKSB7Ci0JCQkJT2JqZWN0IHN1Yk9iajEgPSBlbGVtZW50TmFtZU1hcC5nZXQoc3ViRWxlbTIuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoc3ViT2JqMSBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQpIHsKLQkJCQkJc3ViRWxlbTEgPSAoTWV0aG9kRWxlbWVudCkgIHN1Yk9iajE7Ci0JCQkJfSBlbHNlIGlmIChzdWJPYmoxIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlsb2dXYXJuaW5nKCJzdWJPYmoxIGlzIGxpc3Q6ICIgKyBzdWJPYmoxLnRvU3RyaW5nKCksIHBhdGgsIHN1YkVsZW0xLCBzdWJFbGVtMik7CQkJCi0JCQkJfQotCQkJCWlmIChzdWJFbGVtMSA9PSBudWxsICYmIHN1YkVsZW0yIGluc3RhbmNlb2YgTWV0aG9kUGFja2FnZSkgewotCQkJCQlMaXN0IGNoaWxkTGlzdCA9ICgoTWV0aG9kUGFja2FnZSkgc3ViRWxlbTIpLmVDb250ZW50cygpOwotCQkJCQlpZiAoY2hpbGRMaXN0ICE9IG51bGwgJiYgISBjaGlsZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJCQlNZXRob2RFbGVtZW50IGNoMCA9IChNZXRob2RFbGVtZW50KSBjaGlsZExpc3QuZ2V0KDApOwotCQkJCQkJc3ViRWxlbTEgPSAgKE1ldGhvZEVsZW1lbnQpIGVsZW1lbnRDaGlsZE1hcC5nZXQoY2gwLmdldEd1aWQoKSk7Ci0JCQkJCX0JCi0JCQkJfQotCQkJfQotCQkJaWYgKHN1YkVsZW0xID09IG51bGwpIHsKLQkJCQlsb2dEaWZmKCJzdWJFbGVtMSA9PSBudWxsIiAsIHBhdGgsIHN1YkVsZW0xLCBzdWJFbGVtMik7CQkJCi0JCQkJaWYgKCFncmVlZHkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0JCQkKLQkJCWNvbXBhcmUocGF0aCwgc3ViRWxlbTEsIHN1YkVsZW0yLCBjb21wYXJlZEVsZW1NYXApOwkJCQotCQkJaWYgKGRpZmZDb3VudCA+IDAgJiYgIWdyZWVkeSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQkJCQkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBmZWF0dXJlVmFsdWVFcXVhbHMoT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWlmICh2YWwxID09IG51bGwpIHsKLQkJCXJldHVybiB2YWwyID09IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh2YWwyID09IG51bGwpIHsKLQkJCXJldHVybiB2YWwxID09IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh2YWwxIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJaWYgKCEgKHZhbDEgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWJvb2xlYW4gYiAgPSAoKE1ldGhvZEVsZW1lbnQpIHZhbDEpLmdldEd1aWQoKS5lcXVhbHMoKChNZXRob2RFbGVtZW50KSB2YWwxKS5nZXRHdWlkKCkpOwotCQkJaWYgKCFiICYmIHVzZU5hbWVBczJuZElkKSB7Ci0JCQkJYiA9ICgoTWV0aG9kRWxlbWVudCkgdmFsMSkuZ2V0TmFtZSgpLmVxdWFscygoKE1ldGhvZEVsZW1lbnQpIHZhbDEpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYjsKLQkJfQkJCQkKLQkJCi0JCWludCBvcHRpb24gPSAwOyAJLy8wOiBub3QgdG8gY29tcGFyZSBsaXN0IHZhbHVlcwotCQkJCQkJCS8vMTogICAgICAgIGNvbXBhcmUgbGlzdCB2YWx1ZXMKLQkJCQkJCQkvLzI6CQljb21wYXJlIHNpemUgc3RyaWN0bHkKLQkJaWYgKG9wdGlvbiA+IDAgJiYgdmFsMSBpbnN0YW5jZW9mIExpc3QpIHsJCQkKLQkJCWlmICghICh2YWwyIGluc3RhbmNlb2YgTGlzdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlMaXN0IGwxID0gKExpc3QpIHZhbDE7Ci0JCQlMaXN0IGwyID0gKExpc3QpIHZhbDI7Ci0JCQlpZiAobDEuc2l6ZSgpIDwgbDIuc2l6ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAob3B0aW9uID4gMSAmJiBsMS5zaXplKCkgPiBsMi5zaXplKCkpIHsJCQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJYm9vbGVhbiBtZSA9IGwxLnNpemUoKSA9PSAwID8gZmFsc2UgOiBsMS5nZXQoMCkgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50OwotCQkJaWYgKG1lKSB7Ci0JCQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJTWFwIG5hbWVNYXAgPSB1c2VOYW1lQXMybmRJZCA/IG5ldyBIYXNoTWFwKCkgOiBudWxsOwotCQkJCWZvciAoaW50IGk9MDsgaTxsMS5zaXplKCk7IGkrKykgewotCQkJCQlNZXRob2RFbGVtZW50IGUxID0gKE1ldGhvZEVsZW1lbnQpIGwxLmdldChpKTsKLQkJCQkJbWFwLnB1dChlMS5nZXRHdWlkKCksIGUxKTsKLQkJCQkJaWYgKHVzZU5hbWVBczJuZElkKSB7Ci0JCQkJCQluYW1lTWFwLnB1dChlMS5nZXROYW1lKCksIGUxKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3IgKGludCBpPTA7IGk8bDIuc2l6ZSgpOyBpKyspIHsKLQkJCQkJTWV0aG9kRWxlbWVudCBlMiA9IChNZXRob2RFbGVtZW50KSBsMi5nZXQoaSk7Ci0JCQkJCWJvb2xlYW4gZm91bmQgPSBtYXAuY29udGFpbnNLZXkoZTIuZ2V0R3VpZCgpKSB8fCAKLQkJCQkJCQl1c2VOYW1lQXMybmRJZCAmJiBuYW1lTWFwLmNvbnRhaW5zS2V5KGUyLmdldE5hbWUoKSk7Ci0JCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0JCQkJCQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpPTA7IGk8bDEuc2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKCEgKGZlYXR1cmVWYWx1ZUVxdWFscyhsMS5nZXQoaSksIGwyLmdldChpKSkpKSAgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQkJCi0JCWlmICh2YWwxIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlpZiAoISh2YWwyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCVN0cmluZyBzdHIxID0gKFN0cmluZykgdmFsMTsKLQkJCVN0cmluZyBzdHIyID0gKFN0cmluZykgdmFsMjsKLQkJCWlmIChza2lwUmVmKSB7Ci0JCQkJc3RyMSA9IHJlcGxhY2VSZWZXaXRoRHVtbXkoc3RyMSk7Ci0JCQkJc3RyMiA9IHJlcGxhY2VSZWZXaXRoRHVtbXkoc3RyMik7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cmltKSB7Ci0JCQkJc3RyMSA9IHN0cjEudHJpbSgpOwotCQkJCXN0cjIgPSBzdHIyLnRyaW0oKTsKLQkJCQlpZiAodXNlTmFtZUFzMm5kSWQgJiYgc3RyMS5sZW5ndGgoKSA+IDI1MCAmJiBzdHIyLmxlbmd0aCgpID4gMjUwKSB7Ci0JCQkJCXN0cjEgPSBzdHIxLnN1YnN0cmluZygwLCAyNTApOwotCQkJCQlzdHIyID0gc3RyMi5zdWJzdHJpbmcoMCwgMjUwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyMS5lcXVhbHMoc3RyMik7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGludCBpbmNEaWZmQ291bnQoKSB7Ci0JCXJldHVybiArK2RpZmZDb3VudDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGlmZlByb21wdCgpIHsKLQkJcmV0dXJuICJEXyIgKyBkaWZmQ291bnQgKyAiPiAiOwkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yKSB7Ci0JCWxvZyhtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgZmFsc2UpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgTWV0aG9kRWxlbWVudCBlbGVtMikgewotCQlsb2cobXNnLCBwYXRoLCBlbGVtMSwgZWxlbTIsIHRydWUpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZywgTGlzdCBwYXRoLCBNZXRob2RFbGVtZW50IGVsZW0xLCBNZXRob2RFbGVtZW50IGVsZW0yLCBib29sZWFuIGRpZmYpIHsKLQkJaWYgKGRpZmYpIHsKLQkJCWluY0RpZmZDb3VudCgpOwotCQl9Ci0JCVN0cmluZyBwcm9tcHQgPSBkaWZmID8gZ2V0RGlmZlByb21wdCgpIDogIldhcm5pbmc+ICI7Ci0JCXRyYWNlKHByb21wdCArICJwYXRoOiAiICsgcGF0aFRvU3RyaW5nKHBhdGgpKTsKLQkJdHJhY2UocHJvbXB0ICsgIm1zZzogIiArIG1zZyk7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbTAgPSAoTWV0aG9kRWxlbWVudCkgcGF0aC5nZXQocGF0aC5zaXplKCkgLSAxKTsKLQkJaWYgKGVsZW0wICE9IGVsZW0xKSB7Ci0JCQl0cmFjZShwcm9tcHQgKyBnZXRFbGVtU3RyaW5nKGVsZW0wLCAiZWxlbTAiKSk7Ci0JCX0KLQkJdHJhY2UocHJvbXB0ICsgZ2V0RWxlbVN0cmluZyhlbGVtMSwgImVsZW0xIikpOwotCQl0cmFjZShwcm9tcHQgKyBnZXRFbGVtU3RyaW5nKGVsZW0yLCAiZWxlbTIiKSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1TdHJpbmcoTWV0aG9kRWxlbWVudCBlbGVtLCBTdHJpbmcgbGFiZWwpIHsKLQkJU3RyaW5nIHN0ciA9IGxhYmVsOwotCQlpZiAoZWxlbSA9PSBudWxsKSB7Ci0JCQlzdHIgKz0gIiAtPiBudWxsIjsKLQkJfSBlbHNlIHsJCQotCQkJc3RyICs9ICIgLT4gdHlwZTogIiArIGdldENsYXNzTGFzdE5hbWUoZWxlbSkgKyAiLCBuYW1lOiAiICsgZWxlbS5nZXROYW1lKCkgKyAiLCBndWlkOiAiICsgZWxlbS5nZXRHdWlkKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NMYXN0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCVN0cmluZyBzdHIgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpeCA9IHN0ci5sYXN0SW5kZXhPZigiLiIpICsgMTsKLQkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoaXgpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIExpc3QgcGF0aCwgTWV0aG9kRWxlbWVudCBlbGVtMSwgTWV0aG9kRWxlbWVudCBlbGVtMiwgT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWxvZyhtc2csIHBhdGgsIGVsZW0xLCBlbGVtMiwgdHJ1ZSk7Ci0JCVN0cmluZyBwcm9tcHQgPSBnZXREaWZmUHJvbXB0KCk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwxOiAiICsgdmFsMSk7Ci0JCXRyYWNlKHByb21wdCArICJ2YWwyOiAiICsgdmFsMik7CQotCQl0cmFjZSgiIik7Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGF0aFRvU3RyaW5nKExpc3QgcGF0aCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpPTA7IGk8cGF0aC5zaXplKCk7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtID0gKE1ldGhvZEVsZW1lbnQpIHBhdGguZ2V0KGkpOwotCQkJaWYgKGVsZW0gaW5zdGFuY2VvZiBNZXRob2RMaWJyYXJ5KSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotCQkJCWJ1Zi5hcHBlbmQoIjoiKTsKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQoZWxlbS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXREaWZmQ291bnQoKSB7Ci0JCXJldHVybiBkaWZmQ291bnQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RWxlbUNvbXBhcmVkQ291bnQoKSB7Ci0JCXJldHVybiBlbGVtQ29tcGFyZWRDb3VudDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHRvQ2hlY2tPYmplY3QoT2JqZWN0IG9iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHVzZU5hbWVBczJuZElkICYmIG9iaiBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEdyYXBoTm9kZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VSZWZXaXRoRHVtbXkoU3RyaW5nIHNvdXJjZSkgewkJCi0JCVN0cmluZyByZXQgPSByZXBsYWNlUmVmV2l0aER1bW15KHNvdXJjZSwgUmVzb3VyY2VTY2FubmVyLnBfc3JjX3JlZiwgZW1wdHlTdHJpbmcpOwotCQlyZXQgPSByZXBsYWNlUmVmV2l0aER1bW15KHJldCwgUmVzb3VyY2VTY2FubmVyLnBfaHJlZl9yZWYsIGVtcHR5U3RyaW5nKTsKLQkJcmV0ID0gcmVwbGFjZVJlZldpdGhEdW1teShyZXQsIGVtcHR5TGluZSwgZW1wdHlTdHJpbmcpOwotCQlpZiAoZmFsc2UgJiYgIXNvdXJjZS5lcXVhbHMocmV0KSkgewotCQkJdHJhY2UoIkxEPiBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJdHJhY2UoIkxEPiByZXQ6ICAgICIgKyByZXQpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VSZWZXaXRoRHVtbXkoU3RyaW5nIHNvdXJjZSwgUGF0dGVybiBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU1hdGNoZXIgbSA9IHBhdHRlcm4ubWF0Y2hlcihzb3VyY2UpOwotCQotCQl3aGlsZSAobS5maW5kKCkpIHsKLQkJCVN0cmluZyB0ZXh0ID0gbS5ncm91cCgpOwkJCQkJCQotCQkJbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgcmVwbGFjZSk7CQotCQl9Ci0KLQkJbS5hcHBlbmRUYWlsKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeUp1bml0VGVzdFNlcnZpY2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YzYzYTcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvTGlicmFyeUp1bml0VGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5SnVuaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5VGVzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIExpYnJhcnlUZXN0ZXIgc2VydmljZSBhbmQgaXMgdXNlZCBpbiBMaWJyYXJ5SnVuaXRUZXN0LiAgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBleHRlbmRzIFRlc3RGb2xkZXJTZXR1cCBpbXBsZW1lbnRzIFRlc3RUcmFjZXIgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0R3JvdXBOYW1lID0gIkp1bml0VGVzdHMiOwotCXByaXZhdGUgc3RhdGljIEZpbGUgdGVzdEdyb3VwOwotCQkKLQlwcml2YXRlIExpYnJhcnlUZXN0ZXIgdGVzdGVyOwotCQotCXByaXZhdGUgc3RhdGljIE1hcCBpbnN0YW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgRmlsZSB0b3BDbGVhblVwRm9sZGVyOwotCQotCXByaXZhdGUgTGlicmFyeUp1bml0VGVzdFNlcnZpY2UgKCkgewotCQl0ZXN0ZXIgPSBMaWJyYXJ5VGVzdGVyRmFjdG9yeS5uZXdUZXN0ZXIoZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGdldEluc3RhbmNlKExpYnJhcnlKdW5pdFRlc3QgdGVzdENhc2UpIHsKLQkJQ2xhc3MgdGVzdENsYXNzID0gdGVzdENhc2UuZ2V0Q2xhc3MoKTsgCi0JCUxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlIGluc3RhbmNlID0gKExpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlKSBpbnN0YW5jZXMuZ2V0KHRlc3RDbGFzcyk7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSgpOwotCQkJaW5zdGFuY2VzLnB1dCh0ZXN0Q2xhc3MsIGluc3RhbmNlKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0R3JvdXAoKSB7Ci0JCWlmICh0ZXN0R3JvdXAgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRUZXN0SG9tZSgpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyB0ZXN0R3JvdXBOYW1lOwotCQkJdGVzdEdyb3VwID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHRlc3RHcm91cDsKLQl9Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGZyb20gTGlicmFyeUp1bml0VGVzdCdzIHNldFVwIG1ldGhvZCB0byB1cGRhdGUgdGVzdGVyJ3MKLQkgKiBmb2xkZXIgc2V0dXAuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXAoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIEZpbGUgdGVzdERpciwgTGlicmFyeUp1bml0VGVzdCB0ZXN0Q2FzZSkgewotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RTb3VyY2UodGVzdFJvb3RTb3VyY2UpOwotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RXb3JraW5nKHRlc3RSb290V29ya2luZyk7Ci0JCUZpbGUgcGFyZW50ID0gdGVzdFJvb3RXb3JraW5nLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHRvcENsZWFuVXBGb2xkZXIgPT0gbnVsbCkgewotCQkJdG9wQ2xlYW5VcEZvbGRlciA9IHBhcmVudDsKLQkJfSBlbHNlIGlmICghIHRvcENsZWFuVXBGb2xkZXIuZXF1YWxzKHBhcmVudCkpewotCQkJLy9Xb24ndCBoYXBwZW4gZm9yIG5vdwotCQl9Ci0JCXRlc3Rlci5vcGVuQ3VyclRlc3REaXIodGVzdERpcik7Ci0JfQkKLQkKLQkvKioKLQkgKiBDYWxsZWQgZnJvbSBMaWJyYXJ5SnVuaXRUZXN0J3MgdGVhckRvd24gbWV0aG9kIHRvIGNsZWFyIHNvbWUKLQkgKiByZXNvdXJjZXMgaW4gdGVzdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlYXJEb3duKExpYnJhcnlKdW5pdFRlc3QgdGVzdENhc2UpIHsKLQkJdGVzdGVyLmNsb3NlQ3VyclRlc3REaXIoKTsKLQkJaWYgKHRlc3Rlci5pbmNFeGVjdXRlZFRlc3RDb3VudCgpID09IHRlc3RDYXNlLm51bVRlc3RDYXNlcygpKSB7Ci0JCQl0ZXN0ZXIuZG9uZVdpdGhBbGxUZXN0cyhnZXRUZXN0R3JvdXAoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGEgdGVzdCBjb21tYW5kIGluc3RhbmNlIG9mIHRoZSB0cHllICJjbHMiLgotCSAqLwotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJcmV0dXJuIHRlc3RlciA9PSBudWxsID8gbnVsbCA6IHRlc3Rlci5uZXdUZXN0Q29tbWFuZChjbHMpOwotCX0KLQkKLQkvKioKLQkgKiBUcmFjaW5nIG1ldGhvZCB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgaW4gTGlicmFyeUp1bml0VGVzdCdzIGNvZGUuCi0JICovCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKHRlc3RlciAhPSBudWxsKSB7Ci0JCQl0ZXN0ZXIudHJhY2UobGluZSk7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5VGVzdFNlcnZpY2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJhZTBiLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0U2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5wcm9qZWN0Lk1ldGhvZExpYnJhcnlQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHVzZWQgaW4gSlVuaXQgdGVzdHMgZm9yIGxpYnJhcnkgZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RTZXJ2aWNlIHsJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVRlc3RTZXJ2aWNlIGluc3RhbmNlID0gbmV3IExpYnJhcnlUZXN0U2VydmljZSgpOwkKLQkJCi0JcHJpdmF0ZSBMaWJyYXJ5VGVzdFNlcnZpY2UoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVRlc3RTZXJ2aWNlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQkKLQkJCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZUxpYnJhcnkoU3RyaW5nIHBhdGgsIFN0cmluZyBsaWJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlNYXAgcGFyYW1zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXBhcmFtcy5wdXQoImxpYnJhcnkucGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlNZXRob2RMaWJyYXJ5IGxpYiA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkobGliTmFtZSwgInhtaSIsIHBhcmFtcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5zZXRDdXJyZW50TWV0aG9kTGlicmFyeShsaWIpOwotCQkJcmV0dXJuIGxpYjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogY2xvc2UgdGhlIHRlbXAgbGlicmFyeSBhbmQgZGVsZXRlIHRoZSBsaWJyYXJ5IHJlc291cmNlIGZpbGVzCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUxpYnJhcnkoTWV0aG9kTGlicmFyeSBsaWIpIHsKLQkJaWYgKGxpYiA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCWlmIChsaWIgIT0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCUZpbGUgbGliRm9sZGVyID0gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkuY2xvc2VDdXJyZW50TWV0aG9kTGlicmFyeSgpOwkJCi0JCQkKLQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChsaWJGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCksIG51bGwpOwotCQkJCi0JCX0gY2F0Y2goRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkTGlicmFyeShmaW5hbCBTdHJpbmcgcGF0aCkgewotCQlmaW5hbCBNZXRob2RMaWJyYXJ5W10gbGliID0gbmV3IE1ldGhvZExpYnJhcnlbMV07Ci0JCWxpYlswXSA9IG51bGw7Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJTWV0aG9kTGlicmFyeVByb2plY3Qub3BlblByb2plY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWxpYlswXSA9IExpYnJhcnlVdGlsLmxvYWRMaWJyYXJ5KHBhdGggKyBGaWxlLnNlcGFyYXRvciArICJsaWJyYXJ5LnhtaSIpOwotCQkJCQlNZXRob2RMaWJyYXJ5UHJvamVjdC5jbG9zZVByb2plY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBsaWJbMF07Ci0JfQkJCi0JCi0JcHVibGljIHZvaWQgZGVsZXRlRm9sZGVyKEZpbGUgZm9sZGVyKSB7Ci0JCWlmIChmb2xkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUZpbGVVdGlsLmRlbGV0ZUFsbEZpbGVzKGZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWZvbGRlci5kZWxldGUoKTsKLQl9CQkJCi0JCi0JcHVibGljIHN0YXRpYyBNZXRob2RFbGVtZW50IGdldEVsZW1lbnQoTGlzdCBlbGVtZW50cywgU3RyaW5nIG5hbWUpIHsKLQkJaW50IHN6ID0gZWxlbWVudHMgPT0gbnVsbCA/IDAgOiBlbGVtZW50cy5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJT2JqZWN0IG9iaiA9IGVsZW1lbnRzLmdldChpKTsKLQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgPyAoTWV0aG9kRWxlbWVudCkgb2JqIDogbnVsbDsKLQkJCWlmIChlbGVtICE9IG51bGwgJiYgZWxlbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVsZW07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0ZXJGYWN0b3J5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9MaWJyYXJ5VGVzdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGJkMWRjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL0xpYnJhcnlUZXN0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5MaWJyYXJ5VGVzdGVySW1wbDsKLQotLyoqCi0gKiBDbGFzcyBmYWN0b3J5IGZvciBMaWJyYXJ5VGVzZXIgaW5zdGFuY2VzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VGVzdGVyRmFjdG9yeSB7CQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVRlc3RlciBuZXdUZXN0ZXIoYm9vbGVhbiB0cmFjZSkgewkJCQotCQlyZXR1cm4gbmV3IExpYnJhcnlUZXN0ZXJJbXBsKHRyYWNlKTsKLQl9Ci0JCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL091dHB1dERpZmZBbmFseXpvci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvT3V0cHV0RGlmZkFuYWx5em9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjJiZGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvT3V0cHV0RGlmZkFuYWx5em9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBDbGFzcyB0byBhbmFseXplIHRoZSBkaWZmZXJuZWNlcyBiZXR3ZWVuIHR3byBsaWJyYXJ5IHRlc3RlciBvdXRwdXRzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXREaWZmQW5hbHl6b3IgewotCQotCXByaXZhdGUgYm9vbGVhbiBsb2NhbERlYnVnID0gZmFsc2U7Ci0JcHJpdmF0ZSBUZXN0VHJhY2VyIHRyYWNlcjsKLQlwcml2YXRlIGJvb2xlYW4gbmVlZFRvQW5hbHl6ZSA9IHRydWU7IAotCXByaXZhdGUgRmlsZSBmMTsKLQlwcml2YXRlIEZpbGUgZjI7Ci0JcHJpdmF0ZSBEb2N1bWVudCBkMTsKLQlwcml2YXRlIERvY3VtZW50IGQyOwotCXByaXZhdGUgaW50IGRpZmZDb3VudCA9IDA7Ci0JcHJpdmF0ZSBpbnQgZWxlbUNvbXBhcmVkQ291bnQgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXhjbHVkZUd1aWRGcm9tTmFtZSA9IHRydWU7Ci0JLy9NYXkgd2FudCB0byB1c2UgZmVhdHVyZSBjbGFzc2VzIGRpcmVjdGx5IGluc3RlYWQgb2YgbmFtZXMgbGF0ZXIKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBleGNsdWRlZEZlYXR1cmVzID0gewotCQkiZ3VpZCIsCi0JCSJjaGFuZ2VEYXRlIgotCX07Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU2V0IGV4Y2x1ZGVkRmVhdHVyZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCi0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaT0wOyBpPGV4Y2x1ZGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWV4Y2x1ZGVkRmVhdHVyZVNldC5hZGQoZXhjbHVkZWRGZWF0dXJlc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIE91dHB1dERpZmZBbmFseXpvcihUZXN0VHJhY2VyIHQsIERvY3VtZW50IGQxLCBEb2N1bWVudCBkMiwgRmlsZSBmMSwgRmlsZSBmMikgewotCQl0cmFjZXIgPSB0OwotCQl0aGlzLmYxID0gZjE7Ci0JCXRoaXMuZjIgPSBmMjsKLQkJdGhpcy5kMSA9IGQxID09IG51bGwgPyBnZXREb2N1bWVudChmMSkgOiBkMTsKLQkJdGhpcy5kMiA9IGQyID09IG51bGwgPyBnZXREb2N1bWVudChmMikgOiBkMjsKLQl9CQkKLQkKLQlwcml2YXRlIERvY3VtZW50IGdldERvY3VtZW50KEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gWE1MVXRpbC5sb2FkWG1sKGZpbGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJdHJhY2VyLnRyYWNlKGxpbmUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYW5hbHl6ZSgpIHsKLQkJdHJhY2UoIk91dHB1dERpZmZBbmFseXpvci5hbmFseXplIC0+Iik7Ci0JCXRyYWNlKCJmMTogIiArIGYxLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJhY2UoImYyOiAiICsgZjIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl0cmFjZSgiIik7CQkKLQkJYW5hbHl6ZV8oKTsKLQkJdHJhY2UoIk91dHB1dERpZmZBbmFseXpvci5hbmFseXplIDwtIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhbmFseXplXygpIHsKLQkJaWYgKCEgbmVlZFRvQW5hbHl6ZSkgewotCQkJdHJhY2UoIm5vIG5lZWQgdG8gYW5hbHlzZSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNvbXBhcmVSb290KGQxLmdldERvY3VtZW50RWxlbWVudCgpLCBkMi5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0JCW5lZWRUb0FuYWx5emUgPSBmYWxzZTsKLQl9Ci0JCi0vLwlUb3AgZW50cnkgZm9yIG1ldGhvZCBlbGVtZW50IGNvbXBhcmlzb24KLQlwdWJsaWMgdm9pZCBjb21wYXJlUm9vdChFbGVtZW50IHJvb3QxLCAgRWxlbWVudCByb290MikgewkJCi0JCWRpZmZDb3VudCA9IDA7Ci0JCWVsZW1Db21wYXJlZENvdW50ID0gMTsJCQotCQl0cmFjZSgiIik7Ci0JCXRyYWNlKCJjb21wYXJlUm9vdCAtPiAiKTsKLQkKLQkJTGlzdCBlbGVtZW50TGlzdDEgPSBjb2xsZWN0RWxlbWVudHMocm9vdDEuZ2V0Q2hpbGROb2RlcygpKTsKLQkJTGlzdCBlbGVtZW50TGlzdDIgPSBjb2xsZWN0RWxlbWVudHMocm9vdDIuZ2V0Q2hpbGROb2RlcygpKTsJCQotCQlpbnQgc3oxID0gZWxlbWVudExpc3QxLnNpemUoKTsKLQkJaW50IHN6MiA9IGVsZW1lbnRMaXN0Mi5zaXplKCk7Ci0KLQkJaWYgKHN6MSAhPSBzejIpIHsKLQkJCVN0cmluZyBtc2cgPSAicm9vdCBjaGlsZCBlbGVtZW50czogc3oxICE9IHN6MiAtPiAiICsgSW50ZWdlci50b1N0cmluZyhzejEpICsgIiAhPSAiICsgSW50ZWdlci50b1N0cmluZyhzejIpOwotCQkJbG9nRGlmZihtc2csIHJvb3QxLCByb290Mik7Ci0JCX0KLQkJCi0JCWludCBzeiA9IHN6MSA8IHN6MiA/IHN6MSA6IHN6MjsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCWNvbXBhcmUoKEVsZW1lbnQpIGVsZW1lbnRMaXN0MS5nZXQoaSksIChFbGVtZW50KSBlbGVtZW50TGlzdDIuZ2V0KGkpKTsKLQkJfQotCQkKLQkJdHJhY2UoImNvbXBhcmVSb290IDwtIGRpZmZzOiAiICsgZGlmZkNvdW50ICsgIiwgZWxlbWVudHM6ICIgKyBlbGVtQ29tcGFyZWRDb3VudCArICJcbiIpOwotCX0KLQkKLQlwcml2YXRlIExpc3QgY29sbGVjdEVsZW1lbnRzKE5vZGVMaXN0IG5vZGVMaXN0KSB7Ci0JCUxpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxub2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIG5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJZWxlbWVudHMuYWRkKG5vZGUpOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZShFbGVtZW50IG5vZGUxLCAgRWxlbWVudCBub2RlMikgewotCQl0cmFjZSgiY29tcGFyZSAtPiAiKTsKLQkJY29tcGFyZUlubmVyKG5vZGUxLCBub2RlMik7Ci0JCXRyYWNlKCJjb21wYXJlIDwtICIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29tcGFyZUlubmVyKEVsZW1lbnQgbm9kZTEsICBFbGVtZW50IG5vZGUyKSB7Ci0JCWVsZW1Db21wYXJlZENvdW50Kys7Ci0JCWlmIChsb2NhbERlYnVnKSB7Ci0JCQl0cmFjZSgiY29tcGFyZUlubmVyLCBub2RlMTogIiArIG91dHB1dFN0cmluZyhub2RlMSkpOwotCQkJdHJhY2UoImNvbXBhcmVJbm5lciwgbm9kZTI6ICIgKyBvdXRwdXRTdHJpbmcobm9kZTEpKTsKLQkJCXRyYWNlKCIiKTsKLQkJfQotCQkKLQkJYXR0cmlidXRlRXF1YWxzKG5vZGUxLCBub2RlMik7Ci0JCQkKLQkJTGlzdCBlbGVtZW50TGlzdDEgPSBjb2xsZWN0RWxlbWVudHMobm9kZTEuZ2V0Q2hpbGROb2RlcygpKTsKLQkJTGlzdCBlbGVtZW50TGlzdDIgPSBjb2xsZWN0RWxlbWVudHMobm9kZTIuZ2V0Q2hpbGROb2RlcygpKTsJCQotCQlpbnQgc3oxID0gZWxlbWVudExpc3QxLnNpemUoKTsKLQkJaW50IHN6MiA9IGVsZW1lbnRMaXN0Mi5zaXplKCk7Ci0KLQkJaWYgKHN6MSAhPSBzejIpIHsKLQkJCVN0cmluZyBtc2cgPSAiQ2hpbGQgZWxlbWVudHM6IHN6MSAhPSBzejIgLT4gIiArIEludGVnZXIudG9TdHJpbmcoc3oxKSArICIgIT0gIiArIEludGVnZXIudG9TdHJpbmcoc3oyKTsKLQkJCWxvZ0RpZmYobXNnLCBub2RlMSwgbm9kZTIpOwotCQl9Ci0JCQotCQlpbnQgc3ogPSBzejEgPCBzejIgPyBzejEgOiBzejI7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQljb21wYXJlSW5uZXIoKEVsZW1lbnQpIGVsZW1lbnRMaXN0MS5nZXQoaSksIChFbGVtZW50KSBlbGVtZW50TGlzdDIuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhdHRyaWJ1dGVFcXVhbHMoRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMikgewotCQlib29sZWFuIHJldCA9IHRydWU7Ci0JCQotCQlOYW1lZE5vZGVNYXAgYXR0czEgPSBub2RlMS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5hbWVkTm9kZU1hcCBhdHRzMiA9IG5vZGUyLmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHN6MSA9IGF0dHMxLmdldExlbmd0aCgpOwotCQlpbnQgc3oyID0gYXR0czIuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChzejEgIT0gc3oyKSB7Ci0JCQlsb2dEaWZmKCJBdHRyaWJ1dGVzOiBzejEgIT0gc3oyIiwgbm9kZTEsIG5vZGUyKTsKLQkJCXJldCA9IGZhbHNlOwotCQl9Ci0JCWludCBzeiA9IHN6MSA8IHN6MiA/IHN6MSA6IHN6MjsJCQotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJU3RyaW5nIGF0dE5hbWUgPSBhdHRzMS5pdGVtKGkpLmdldE5vZGVOYW1lKCk7Ci0JCQlpZiAoZXhjbHVkZWRGZWF0dXJlU2V0LmNvbnRhaW5zKGF0dE5hbWUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdmFsMSA9IG5vZGUxLmdldEF0dHJpYnV0ZShhdHROYW1lKTsKLQkJCVN0cmluZyB2YWwyID0gbm9kZTIuZ2V0QXR0cmlidXRlKGF0dE5hbWUpOwotCQkJaWYgKGF0dE5hbWUuZXF1YWxzKCJuYW1lIikgJiYgZXhjbHVkZUd1aWRGcm9tTmFtZSkgewotCQkJCWludCBpeCA9IHZhbDEuaW5kZXhPZigiLCIpOwotCQkJCWlmIChpeCA+IDApIHsKLQkJCQkJdmFsMSA9IHZhbDEuc3Vic3RyaW5nKDAsIGl4KTsKLQkJCQl9Ci0JCQkJaXggPSB2YWwyLmluZGV4T2YoIiwiKTsKLQkJCQlpZiAoaXggPiAwKSB7Ci0JCQkJCXZhbDIgPSB2YWwyLnN1YnN0cmluZygwLCBpeCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCEgdmFsdWVFcXVhbHModmFsMSwgdmFsMikpIHsKLQkJCQlTdHJpbmcgbXNnID0gYXR0TmFtZSArICIgdmFsdWVzIG5vdCB0aGUgc2FtZSEiOwotCQkJCWxvZ0RpZmYobXNnLCBub2RlMSwgbm9kZTIsIHZhbDEsIHZhbDIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IHZhbDEsIE9iamVjdCB2YWwyKSB7Ci0JCWlmICh2YWwxID09IG51bGwpIHsKLQkJCXZhbDEgPSAiIjsKLQkJfQotCQkKLQkJaWYgKHZhbDIgPT0gbnVsbCkgewotCQkJdmFsMiA9ICIiOwotCQl9Ci0JCQotCQlpZiAodmFsMSBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJU3RyaW5nIHN0cjEgPSAoU3RyaW5nKSB2YWwxOwotCQkJU3RyaW5nIHN0cjIgPSAoU3RyaW5nKSB2YWwyOwotCQkJcmV0dXJuIHN0cjEuZXF1YWxzKHN0cjIpOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBsb2dEaWZmKFN0cmluZyBtc2csIEVsZW1lbnQgbm9kZTEsIEVsZW1lbnQgbm9kZTIsIE9iamVjdCB2YWwxLCBPYmplY3QgdmFsMikgewotCQlsb2cobXNnLCBub2RlMSwgbm9kZTIsIHRydWUpOwotCQlTdHJpbmcgcHJvbXB0ID0gZ2V0RGlmZlByb21wdCgpOwotCQl0cmFjZShwcm9tcHQgKyAidmFsMTogIiArIHZhbDEpOwotCQl0cmFjZShwcm9tcHQgKyAidmFsMjogIiArIHZhbDIpOwkKLQkJdHJhY2UoIiIpOwotCX0JCi0JCQotCXByaXZhdGUgaW50IGluY0RpZmZDb3VudCgpIHsKLQkJcmV0dXJuICsrZGlmZkNvdW50OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREaWZmUHJvbXB0KCkgewotCQlyZXR1cm4gIkRfIiArIGRpZmZDb3VudCArICI+ICI7CQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGxvZ0RpZmYoU3RyaW5nIG1zZywgRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMikgewotCQlsb2cobXNnLCBub2RlMSwgbm9kZTIsIHRydWUpOwotCQl0cmFjZSgiIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2coU3RyaW5nIG1zZywgRWxlbWVudCBub2RlMSwgRWxlbWVudCBub2RlMiwgYm9vbGVhbiBkaWZmKSB7Ci0JCWlmIChkaWZmKSB7Ci0JCQlpbmNEaWZmQ291bnQoKTsKLQkJfQotCQlTdHJpbmcgcHJvbXB0ID0gZGlmZiA/IGdldERpZmZQcm9tcHQoKSA6ICJXYXJuaW5nPiAiOwotCQkvL3RyYWNlKHByb21wdCArICJwYXRoOiAiICsgcGF0aFN0cmluZyhub2RlMSkpOwotCQl0cmFjZShwcm9tcHQgKyAibXNnOiAiICsgbXNnKTsKLQkJdHJhY2UocHJvbXB0ICsgIm5vZGUxOiAiICsgb3V0cHV0U3RyaW5nKG5vZGUxKSk7Ci0JCXRyYWNlKHByb21wdCArICJub2RlMjogIiArIG91dHB1dFN0cmluZyhub2RlMikpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBwYXRoU3RyaW5nKEVsZW1lbnQgbm9kZSkgewotCQlTdGFjayBwYXRocyA9IG5ldyBTdGFjaygpOwotCQlOb2RlIGN1cnJOb2RlID0gbm9kZTsKLQkJd2hpbGUgKGN1cnJOb2RlICE9IG51bGwgJiYgY3Vyck5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICgoRWxlbWVudCkgY3Vyck5vZGUpLmdldEF0dHJpYnV0ZSgibmFtZSIpOwotCQkJcGF0aHMucHVzaChuYW1lKTsKLQkJCWN1cnJOb2RlID0gY3Vyck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCVN0cmluZyByZXQgPSAiIjsKLQkJd2hpbGUoISBwYXRocy5pc0VtcHR5KCkpIHsKLQkJCXJldCArPSAiLyIgKyBwYXRocy5wb3AoKTsKLQkJfQkJCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoKSB7Ci0JCWFuYWx5emUoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIG91dHB1dFN0cmluZyhFbGVtZW50IG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQkKLQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldEF0dHJpYnV0ZSgidHlwZSIpOwotCQlyZXR1cm4gdHlwZSArICI6ICIgKyBwYXRoU3RyaW5nKG5vZGUpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldERpZmZDb3VudCgpIHsKLQkJcmV0dXJuIGRpZmZDb3VudDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRFbGVtQ29tcGFyZWRDb3VudCgpIHsKLQkJcmV0dXJuIGVsZW1Db21wYXJlZENvdW50OwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvUWFUZXN0U2VydmljZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvUWFUZXN0U2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTcwZjUwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1FhVGVzdFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLklUZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIExpYnJhcnlUZXN0ZXIgc2VydmljZSB0byBydW4gdGVzdCBjb21tYW5kIGZpbGVzLgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUWFUZXN0U2VydmljZSBpbXBsZW1lbnRzIElUZXN0Rm9sZGVyU2V0dXAgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0R3JvdXBOYW1lID0gIlRlc3RDb21tYW5kRmlsZVRlc3RzIjsKLQlwcml2YXRlIHN0YXRpYyBGaWxlIHRlc3RHcm91cDsJCQotCQotCXByaXZhdGUgTGlicmFyeVRlc3RlciB0ZXN0ZXI7Ci0JcHJpdmF0ZSBJVGVzdEZvbGRlclNldHVwIHRlc3RGb2xkZXJTZXR1cDsKLQkKLQlwdWJsaWMgc3RhdGljIEZpbGVGaWx0ZXIgdGNGaWx0ZXIgPSBuZXcgRmlsZUZpbHRlcigpIHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCXJldHVybiBwYXRobmFtZS5nZXROYW1lKCkuZW5kc1dpdGgoVGVzdENvbW1hbmQuVGVzdE5hbWVFeHQpOwotCQl9OwkJCQotCX07Ci0JCi0JcHVibGljIHN0YXRpYyBGaWxlRmlsdGVyIGRpckZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJcmV0dXJuIHBhdGhuYW1lLmlzRGlyZWN0b3J5KCk7Ci0JCX07CQkJCi0JfTsKLQkKLQlwdWJsaWMgUWFUZXN0U2VydmljZShJVGVzdEZvbGRlclNldHVwIHRlc3RGb2xkZXJTZXR1cCwgYm9vbGVhbiB0cmFjZSkgewotCQl0aGlzLnRlc3RGb2xkZXJTZXR1cCA9IHRlc3RGb2xkZXJTZXR1cDsKLQkJdGVzdGVyID0gTGlicmFyeVRlc3RlckZhY3RvcnkubmV3VGVzdGVyKHRyYWNlKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRvcCB0ZXN0IHJvb3Qgc291cmNlIGZvbGRlciBmaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKSB7Ci0JCXJldHVybiB0ZXN0Rm9sZGVyU2V0dXAuZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRlc3QgaG9tZSBmb2xkZXIgZmlsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldFRlc3RIb21lKCkgewotCQlyZXR1cm4gdGVzdEZvbGRlclNldHVwLmdldFRlc3RIb21lKCk7Ci0JfQkKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdEdyb3VwKCkgewotCQlpZiAodGVzdEdyb3VwID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0VGVzdEhvbWUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgdGVzdEdyb3VwTmFtZTsKLQkJCXRlc3RHcm91cCA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCXJldHVybiB0ZXN0R3JvdXA7Ci0JfQotCQotCS8qKgotCSAqIFBpY2tzIHVwIGFuZCBydW5zIGFsbCB0ZXN0IGNvbW1hbmQgZmlsZXMgdW5kZXIgInN0YXJ0aW5nVGVzdFJvb3RTb3VyY2UiCi0JICogZm9sZGVyIHJlY3Vyc2l2ZWx5LiBUZXN0IHdvcmtpbmcgbG9jYXRpb24gc3RhcnRzIGZyb20gInN0YXJ0aW5nVGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkFsbENhc2VzKEZpbGUgc3RhcnRpbmdUZXN0Um9vdFNvdXJjZSwgRmlsZSBzdGFydGluZ1Rlc3RSb290V29ya2luZykgewkKLQkJU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cmF2ZXJzZUZvbGRlcihzdGFydGluZ1Rlc3RSb290U291cmNlLCBzdGFydGluZ1Rlc3RSb290V29ya2luZywgZXJyb3JNc2dCdWYsIHRydWUpOwotCQl0ZXN0ZXIuY2xvc2VDdXJyVGVzdERpcigpOwotCQl0ZXN0ZXIuZG9uZVdpdGhBbGxUZXN0cyhnZXRUZXN0R3JvdXAoKSk7Ci0JCXJldHVybiBlcnJvck1zZ0J1Zi50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBQaWNrcyB1cCBhbmQgcnVucyBhbGwgbG9jYWwgdGVzdCBjb21tYW5kIGZpbGVzIHVuZGVyICJ0ZXN0Um9vdFNvdXJjZSIKLQkgKiBmb2xkZXIuIFRlc3Qgd29ya2luZyBsb2NhdGlvbiBpcyBnaXZlbiBieSAidGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkxvY2FsQ2FzZXMoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcpIHsJCi0JCVN0cmluZ0J1ZmZlciBlcnJvck1zZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdHJhdmVyc2VGb2xkZXIodGVzdFJvb3RTb3VyY2UsIHRlc3RSb290V29ya2luZywgZXJyb3JNc2dCdWYsIGZhbHNlKTsKLQkJcmV0dXJuIGVycm9yTXNnQnVmLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgdGhlIHRlc3QgY29tbWFuZCBmaWxlICJ0Y0ZpbGUiIHdpdGggdGVzdCByb290IHNvdXJjZSBmb2xkZXIKLQkgKiBnaXZlbiBieSAidGVzdFJvb3RTb3VyY2UiIGFuZCB0ZXN0IHJvb3Qgd29ya2luZyBmb2xkZXIgZ2l2ZW4gYnkKLQkgKiAidGVzdFJvb3RXb3JraW5nIi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJ1bkNhc2UoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIEZpbGUgdGNGaWxlKSB7CQotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RTb3VyY2UodGVzdFJvb3RTb3VyY2UpOwotCQl0ZXN0ZXIuc2V0VGVzdFJvb3RXb3JraW5nKHRlc3RSb290V29ya2luZyk7Ci0JCQotCQlTdHJpbmdCdWZmZXIgZXJyb3JNc2dCdWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXJ1bkNhc2UoZXJyb3JNc2dCdWYsIHRjRmlsZSk7Ci0JCXJldHVybiBlcnJvck1zZ0J1Zi50b1N0cmluZygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdHJhdmVyc2VGb2xkZXIoRmlsZSB0ZXN0Um9vdFNvdXJjZSwgRmlsZSB0ZXN0Um9vdFdvcmtpbmcsIAotCQkJU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmLCBib29sZWFuIHJlY3Vyc3V2ZWx5KSB7CQkKLQkJCQkJCi0JCUZpbGUgZmlsZXNbXSA9IHRlc3RSb290U291cmNlLmxpc3RGaWxlcyh0Y0ZpbHRlcik7Ci0JCWV4ZWN1dGVUQ0ZpbGVzKHRlc3RSb290U291cmNlLCB0ZXN0Um9vdFdvcmtpbmcsICBmaWxlcywgZXJyb3JNc2dCdWYpOwotCQlpZiAoISByZWN1cnN1dmVseSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJRmlsZSBkaXJzW10gPSB0ZXN0Um9vdFNvdXJjZS5saXN0RmlsZXMoZGlyRmlsdGVyKTsKLQkJaW50IHN6ID0gZGlycyA9PSBudWxsID8gMCA6IGRpcnMubGVuZ3RoOwotCQlpZiAoc3ogPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlGaWxlIGRpciA9IGRpcnNbaV07Ci0JCQlTdHJpbmcgcGF0aCA9IHRlc3RSb290V29ya2luZy5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgZGlyLmdldE5hbWUoKSAKLQkJCQkJCQkJKyBGaWxlLnNlcGFyYXRvcjsKLQkJCXRyYXZlcnNlRm9sZGVyKGRpciwgbmV3IEZpbGUocGF0aCksIGVycm9yTXNnQnVmLCByZWN1cnN1dmVseSk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBleGVjdXRlVENGaWxlcyhGaWxlIHRlc3RSb290U291cmNlLCBGaWxlIHRlc3RSb290V29ya2luZywgRmlsZSB0Y0ZpbGVzW10sIFN0cmluZ0J1ZmZlciBlcnJvck1zZ0J1ZikgewotCQlpbnQgc3ogPSB0Y0ZpbGVzID09IG51bGwgPyAwIDogdGNGaWxlcy5sZW5ndGg7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQkKLQkJdGVzdGVyLnNldFRlc3RSb290U291cmNlKHRlc3RSb290U291cmNlKTsKLQkJdGVzdGVyLnNldFRlc3RSb290V29ya2luZyh0ZXN0Um9vdFdvcmtpbmcpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCUZpbGUgdGNGaWxlID0gdGNGaWxlc1tpXTsKLQkJCXJ1bkNhc2UoZXJyb3JNc2dCdWYsIHRjRmlsZSk7CQkJCi0JCX0JCQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJ1bkNhc2UoU3RyaW5nQnVmZmVyIGVycm9yTXNnQnVmLCBGaWxlIHRjRmlsZSkgewkKLQkJdGVzdGVyLnNldFRlc3QodGNGaWxlKTsKLQkJVENFeGVSZXBseUxpc3QgcmVzdWx0ID0gdGVzdGVyLmV4ZWN1dGUoKTsKLQkJaWYgKCEgcmVzdWx0LnBhc3NpbmcoKSkgewotCQkJU3RyaW5nIG1zZyA9IHJlc3VsdC5nZXRTdW1tYXJ5UmVwbHkoKTsKLQkJCWVycm9yTXNnQnVmLmFwcGVuZCgiXG4iICsgbXNnKTsKLQkJCXRlc3Rlci50cmFjZShtc2cpOwotCQl9Ci0JfQotCQotCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjAxOGEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdENvbW1hbmRGaWxlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEpVTklUIHRlc3Qgb24gcnVuaW5nIGEgdGVzdCBjb21tYW5kIGZpbGUgaW4gdHJhY2UgbW9kZQotICogZm9yIGRlYnVnIHB1cnBvc2UuCi0gKiBUaGUgbG9jYXRpb24gb2YgdGVzdCBmaWxlIGlzIGhhcmQgY29kZWQgZm9yIG5vdy4KLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21tYW5kRmlsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JLyoqCi0JICogVGVzdCBmaWxlIHBhdGggcmVsYXRpdmUgdG8gdG9wVGVzdFJvb3RTb3VyY2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW10gPSB7Ci0vKgkJIlRlc3RDb21tYW5kcyIsCi0JCSJuZXdNZXRob2RQbHVnaW4iLAotCQkibmV3TWV0aG9kUGx1Z2luLnRjIiovCi0vKgkJCi0JCSJFeHBvcnRJbXBvcnQiLAotCQkiQnVnc18xIiwKLQkJIjE1MDcwMiIsCi0JCSIxNTA3MDIudGMiKi8JCQotCQkKLQkJIlRlc3RDb21tYW5kcyIsCi0JCSJuZXdNZXRob2RFbGVtZW50cyIsCi0JCSJuZXdNZXRob2RFbGVtZW50cy50YyIKLQkJCi0vKgkJIlRlc3RDb21tYW5kcyIsCi0JCSJrZWx2aW5DYXNlLnRjIiovCi0JCQotLyoJCSJWYWxpZGF0aW9uIiwKLQkJIkJ1Z3MiLAotCQkiMTcxMDI4LnRjIiovCi0JfTsKLQkJCi0JcHJpdmF0ZSBRYVRlc3RTZXJ2aWNlIHNlcnZpY2UgPSBuZXcJUWFUZXN0U2VydmljZShuZXcgVGVzdEZvbGRlclNldHVwKCksIHRydWUpOwotCQotCXB1YmxpYyBUZXN0Q29tbWFuZEZpbGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHRlc3QgcnVucyB0aGUgZ2l2ZW4gdGVzdCBjb21tYW5kIGZpbGUuCi0JICovIAotCXB1YmxpYyB2b2lkIHRlc3RPbmVDYXNlKCkgewotCQlydW5UZXN0T25lQ2FzZShzZXJ2aWNlLCB0Y0ZpbGVQYXRoRnJvbVRvcFJvb3RTb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcnVuVGVzdE9uZUNhc2UoUWFUZXN0U2VydmljZSBzZXJ2aWNlLCBTdHJpbmcgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW10pIHsKLQkJU3RyaW5nIHBhdGggPSBzZXJ2aWNlLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkvL3BhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBMb25nLnRvSGV4U3RyaW5nKENhbGVuZGFyLmdldEluc3RhbmNlKCkuZ2V0VGltZUluTWlsbGlzKCkpICsgRmlsZS5zZXBhcmF0b3I7CQkKLQkJRmlsZSB0ZXN0Um9vdFdvcmtpbmcgPSBuZXcgRmlsZShwYXRoKTsKLQkJTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCkuZGVsZXRlRm9sZGVyKHRlc3RSb290V29ya2luZyk7Ci0JCQotCQlGaWxlIHRvcFRlc3RSb290U291cmNlID0gc2VydmljZS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpOwotCQkKLQkJcGF0aCA9IHRvcFRlc3RSb290U291cmNlLmdldEFic29sdXRlUGF0aCgpOwotCQlmb3IgKGludCBpPTA7IGk8dGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlLmxlbmd0aDsgaSsrKSB7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgdGNGaWxlUGF0aEZyb21Ub3BSb290U291cmNlW2ldOwotCQl9Ci0JCUZpbGUgdGNGaWxlID0gbmV3IEZpbGUocGF0aCk7CQkKLQkJCi0JCVN0cmluZyBlcnJvck1zZyA9IHNlcnZpY2UucnVuQ2FzZSh0Y0ZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0ZXN0Um9vdFdvcmtpbmcsIHRjRmlsZSk7Ci0JCWFzc2VydFRydWUoZXJyb3JNc2csIGVycm9yTXNnLmxlbmd0aCgpID09IDApOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdENvbW1hbmRGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU0NDFjYS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Q29tbWFuZEZpbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuQ2FsZW5kYXI7Ci0KLS8qKgotICogSlVOSVQgdGVzdCBvbiB0ZXN0IGNvbW1hbmQgZmlsZXMKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21tYW5kRmlsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgUWFUZXN0U2VydmljZSBzZXJ2aWNlID0gbmV3CVFhVGVzdFNlcnZpY2UobmV3IFRlc3RGb2xkZXJTZXR1cCgpLCBmYWxzZSk7Ci0JCi0JcHVibGljIFRlc3RDb21tYW5kRmlsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0JCQkJCQkKLQkJCQotCS8qKgotCSAqIFRoaXMgdGVzdCBwaWNrcyB1cCBhbmQgcnVucyBhbGwgdGVzdCBjb21tYW5kIGZpbGVzIHVuZGVyIHRoZQotCSAqIGZvbGRlciBzZXJ2aWNlLmdldFRvcFRlc3RSb290U291cmNlKCkgcmVjdXJzaXZlbHkuIAotCSAqLyAKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsQ2FzZXMoKSB7Ci0JCXJ1blRlc3RBbGxDYXNlcyhzZXJ2aWNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJ1blRlc3RBbGxDYXNlcyhRYVRlc3RTZXJ2aWNlIHNlcnZpY2UpIHsKLQkJU3RyaW5nIHBhdGggPSBzZXJ2aWNlLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkKLQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzczpTU1MiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KG5ldyBEYXRlKCkpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnXycpOwotCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJzonLCAnLScpOwotCQkKLQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIGR0U3RyICsgRmlsZS5zZXBhcmF0b3I7Ci0JCVN0cmluZyBlcnJvck1zZyA9IHNlcnZpY2UucnVuQWxsQ2FzZXMoc2VydmljZS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpLCBuZXcgRmlsZShwYXRoKSk7Ci0JCWFzc2VydFRydWUoZXJyb3JNc2csIGVycm9yTXNnLmxlbmd0aCgpID09IDApOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0Rm9sZGVyU2V0dXAuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RGb2xkZXJTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjc5MzQ2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL1Rlc3RGb2xkZXJTZXR1cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLklUZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuVGVzdHNQbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzZXRzIHRoZSB0b3AgZm9sZGVyIGxvY2F0aW9ucyBmb3IgTGlicmFyeVRlc3RlciAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RGb2xkZXJTZXR1cCBpbXBsZW1lbnRzIElUZXN0Rm9sZGVyU2V0dXAgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdG9wVGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZSAoVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAgCi0JCQkiTGlicmFyaWVzIiArIEZpbGUuc2VwYXJhdG9yICsgIjEuMC4wIiArIEZpbGUuc2VwYXJhdG9yKSA7Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVzdEhvbWUgPSBuZXcgRmlsZSAoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yIC8vJE5PTi1OTFMtMiQKLQkJCSsgIkVQRiIgKyBGaWxlLnNlcGFyYXRvciArICJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdG9wIHRlc3Qgcm9vdCBzb3VyY2UgZm9sZGVyIGZpbGUKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRUb3BUZXN0Um9vdFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRvcFRlc3RSb290U291cmNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGVzdCBob21lIGZvbGRlciBmaWxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0VGVzdEhvbWUoKSB7Ci0JCXJldHVybiB0ZXN0SG9tZTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0ZXJPdXRwdXRVdGlsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9UZXN0ZXJPdXRwdXRVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTkyZTQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvVGVzdGVyT3V0cHV0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdFRyYWNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHRlc3RlciBvdXRwdXQgbWFuaXB1bGF0aW9ucwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdGVyT3V0cHV0VXRpbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdFRyYWNlciB0cmFjZXI7Ci0JcHVibGljIHN0YXRpYyB2b2lkIHNldFRyYWNlcihUZXN0VHJhY2VyIHQpIHsKLQkJdHJhY2VyID0gdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBsaW5lKSB7Ci0JCWlmICh0cmFjZXIgPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQl9IGVsc2UgewotCQkJdHJhY2VyLnRyYWNlKGxpbmUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kUGx1Z2luIGdldE1ldGhvZFBsdWdpbihNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIG5hbWUpIHsKLQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChsaWIuZ2V0TWV0aG9kUGx1Z2lucygpKTsKLQkJcmV0dXJuIChNZXRob2RQbHVnaW4pIG5hbWVNYXAuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZENvbmZpZ3VyYXRpb24gZ2V0TWV0aG9kQ29uZmlndXJhdGlvbihNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIG5hbWUpIHsKLQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChsaWIuZ2V0UHJlZGVmaW5lZENvbmZpZ3VyYXRpb25zKCkpOwotCQlyZXR1cm4gKE1ldGhvZENvbmZpZ3VyYXRpb24pIG5hbWVNYXAuZ2V0KG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1ldGhvZEVsZW1lbnQgZ2V0TWV0aG9kRWxlbWVudChNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGdldE1ldGhvZEVsZW1lbnRfKGxpYiwgcGF0aCx0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgsIGJvb2xlYW4gcmVzb2x2ZVByb2Nlc3NFbGVtZW50KSB7Ci0JCU1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IGdldE1ldGhvZEVsZW1lbnRfKGxpYiwgcGF0aCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UgJiYgcmVzb2x2ZVByb2Nlc3NFbGVtZW50KSB7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSAoUHJvY2Vzc1BhY2thZ2UpIGVsZW1lbnQ7Ci0JCQlMaXN0IGNoaWxkcmVuID0gcGtnLmdldFByb2Nlc3NFbGVtZW50cygpOwotCQkJaWYgKGNoaWxkcmVuLnNpemUoKSA9PSAxICYmIAotCQkJCQkoKFByb2Nlc3NFbGVtZW50KSBjaGlsZHJlbi5nZXQoMCkpLmdldE5hbWUoKS5lcXVhbHMocGtnLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gKE1ldGhvZEVsZW1lbnQpIGNoaWxkcmVuLmdldCgwKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50XyhNZXRob2RMaWJyYXJ5IGxpYiwgU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBsaWI7Ci0JCX0KLQkJTGlzdCBwYXRocyA9IHBhcnNlTWV0aG9kRWxlbWVudFBhdGgocGF0aCk7Ci0JCWludCBzeiA9IHBhdGhzLnNpemUoKTsKLQkJaWYgKHN6ID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQkJTWV0aG9kRWxlbWVudCBtZSA9IGdldEZpcnN0TWV0aG9kRWxlbWVudChsaWIsIChTdHJpbmcpIHBhdGhzLmdldCgwKSk7Ci0JCWlmIChtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKGludCBpPTE7IGk8c3o7IGkrKykgewotCQkJTWFwIG5hbWVNYXAgPSBnZXRNZXRob2RFbGVtZW50TmFtZU1hcChtZS5lQ29udGVudHMoKSk7Ci0JCQltZSA9IChNZXRob2RFbGVtZW50KSBuYW1lTWFwLmdldChwYXRocy5nZXQoaSkpOwotCQkJaWYgKG1lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kRWxlbWVudCBnZXRGaXJzdE1ldGhvZEVsZW1lbnQoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBmaXJzdFBhdGgpIHsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IGdldE1ldGhvZFBsdWdpbihsaWIsIGZpcnN0UGF0aCk7Ci0JCWlmIChtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWU7Ci0JCX0KLQkJcmV0dXJuIGdldE1ldGhvZENvbmZpZ3VyYXRpb24obGliLCBmaXJzdFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByb2Nlc3NFbGVtZW50IGdldFByb2Nlc3NFbGVtZW50KE1ldGhvZExpYnJhcnkgbGliLCBTdHJpbmcgcGF0aCkgewotCQlpbnQgaXggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7Ci0JCVN0cmluZyBwYXJlbnRQYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaXgpOwotCQlTdHJpbmcgbmFtZSA9IHBhdGguc3Vic3RyaW5nKGl4ICsgMSk7Ci0JCQotCQlQcm9jZXNzUGFja2FnZSBvdXRlclBhcmVudCA9IGdldFByb2Nlc3NFbGVtZW50UGFyZW50KGxpYiwgcGFyZW50UGF0aCk7Ci0JCQotCQlNYXAgbmFtZU1hcCA9IGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKG91dGVyUGFyZW50LmdldENoaWxkUGFja2FnZXMoKSk7Ci0JCVByb2Nlc3NQYWNrYWdlIGlubmVyUGFyZW50ID0gKFByb2Nlc3NQYWNrYWdlKSBuYW1lTWFwLmdldChuYW1lKTsKLQkJaWYgKGlubmVyUGFyZW50IGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJcmV0dXJuICgoUHJvY2Vzc0NvbXBvbmVudCkgaW5uZXJQYXJlbnQpLmdldFByb2Nlc3MoKTsKLQkJfQotCQlMaXN0IHBlcyA9IGlubmVyUGFyZW50LmdldFByb2Nlc3NFbGVtZW50cygpOwotCQlpZiAocGVzLnNpemUoKSAhPSAxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBwZXMuc2l6ZSgpID09ICIgKyBwZXMuc2l6ZSgpICsgIiAhPSAxIik7Ci0JCX0KLQkJCi0JCXJldHVybiAoUHJvY2Vzc0VsZW1lbnQpIHBlcy5nZXQoMCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc1BhY2thZ2UgZ2V0UHJvY2Vzc0VsZW1lbnRQYXJlbnQoTWV0aG9kTGlicmFyeSBsaWIsIFN0cmluZyBwYXJlbnRQYXRoKSB7Ci0JCQlyZXR1cm4gKFByb2Nlc3NQYWNrYWdlKSBnZXRNZXRob2RFbGVtZW50XyhsaWIsIHBhcmVudFBhdGgsIGZhbHNlKTsJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBwYXJzZU1ldGhvZEVsZW1lbnRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCUxpc3QgcmV0ID0gbmV3IEFycmF5TGlzdCgpOwkJCi0JCVN0cmluZyBuYW1lID0gcGF0aDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWludCBpeCA9IHBhdGguaW5kZXhPZigiLyIpOwotCQkJaWYgKGl4IDwgMCkgewotCQkJCXJldC5hZGQocGF0aCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXQuYWRkKHBhdGguc3Vic3RyaW5nKDAsIGl4KSk7Ci0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoaXggKyAxKTsKLQkJfQkKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldE1ldGhvZEVsZW1lbnROYW1lTWFwKExpc3QgY29udGVudHMpIHsKLQkJTWFwIG5hbWVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y29udGVudHMuc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjb250ZW50cy5nZXQoaSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkgewotCQkJCU1ldGhvZEVsZW1lbnQgZWxlbSA9IChNZXRob2RFbGVtZW50KSBvYmo7Ci0JCQkJbmFtZU1hcC5wdXQoZWxlbS5nZXROYW1lKCksIGVsZW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lTWFwOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRQYXRoKE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKG1lIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCWlmIChtZSBpbnN0YW5jZW9mIE1ldGhvZFBsdWdpbiB8fCBtZSBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCXJldHVybiBtZS5nZXROYW1lKCk7Ci0JCX0KLQkJU3RhY2sgc3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJTWV0aG9kRWxlbWVudCBjdXJyTWUgPSBtZTsKLQkJd2hpbGUgKCEgKGN1cnJNZSBpbnN0YW5jZW9mIE1ldGhvZExpYnJhcnkpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGN1cnJNZS5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZSAhPSBudWxsICYmIG5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc3RhY2sucHVzaChuYW1lKTsKLQkJCX0KLQkJCU1ldGhvZEVsZW1lbnQgb2xkTWUgPSBjdXJyTWU7Ci0JCQljdXJyTWUgPSAoTWV0aG9kRWxlbWVudCkgY3Vyck1lLmVDb250YWluZXIoKTsKLQkJCWlmIChjdXJyTWUgPT0gbnVsbCApIHsKLQkJCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBjdXJyTWUgPT0gbnVsbCwgb2xkTWU6ICIgKyBvbGRNZSk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0JCXdoaWxlICghIHN0YWNrLmlzRW1wdHkoKSkgewotCQkJcGF0aCArPSAoU3RyaW5nKSBzdGFjay5wb3AoKSArICIvIjsJCQkKLQkJfQotCQlpbnQgaXggPSBwYXRoLmxlbmd0aCgpIC0gMTsKLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIGl4KTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93KFN0cmluZyBtc2csIExpc3QgbGlzdCkgewotCQl0cmFjZShtc2cpOwotCQlmb3IgKGludCBpPTA7IGk8bGlzdC5zaXplKCk7IGkrKykgewotCQkJdHJhY2UoImxpc3RbIiArIGkgKyAiXSIgKyBsaXN0LmdldChpKSk7Ci0JCX0KLQkJdHJhY2UoIiIpOwotCX0KLQkJCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvSVRlc3RGb2xkZXJTZXR1cC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvSVRlc3RGb2xkZXJTZXR1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGVhMWMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0lUZXN0Rm9sZGVyU2V0dXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0Rm9sZGVyU2V0dXAgewotCi0JLyoqCi0JICogUmV0dXJuIHRvcCB0ZXN0IHJvb3Qgc291cmNlIGZvbGRlciBmaWxlCi0JICovCi0JRmlsZSBnZXRUb3BUZXN0Um9vdFNvdXJjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0ZXN0IGhvbWUgZm9sZGVyIGZpbGUKLQkgKi8KLQlGaWxlIGdldFRlc3RIb21lKCk7CQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeUp1bml0VGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeUp1bml0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjkzZDIyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL0xpYnJhcnlKdW5pdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgVGVzdENhc2UKLSAqIGNsYXNzZXMgdGhhdCB3YW50IHRvIHVzZSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZS4gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlicmFyeUp1bml0VGVzdCB7Ci0JCi0JLyoKLQkgKiBOdW1iZXIgb2YgdGVzdCBjYXNlcyBpbiB0aGUgaW1wbGVtZW50aW5nCi0JICogVGVzdENhc2UgY2xhc3MuIEl0IGlzIHVzZWQgYnkgTGlicmFyeUp1bml0VGVzdFNlcnZpY2UKLQkgKiB0byBkZXRlcm1pbmUgd2hlbiB0byBjbGVhciB1cCBzb21lIHRlc3RlciByZXNvdXJjZXMuCi0JICovCi0JaW50IG51bVRlc3RDYXNlcygpOwotCQotCS8qCi0JICogTmFtZSBvZiB0aGUgdGVzdCBjbGFzcyBpbnN0YW5jZQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5VGVzdGVyLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9MaWJyYXJ5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YjE0MjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvTGlicmFyeVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVXNlZCBpbiBKVW5pdCB0ZXN0cyAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5VGVzdGVyIGV4dGVuZHMgVGVzdFRyYWNlciB7CQotCQotCVRlc3RDb21tYW5kIG5ld1Rlc3RDb21tYW5kKENsYXNzIGNscyk7CQotCQotCXZvaWQgc2V0VGVzdFJvb3RTb3VyY2UoRmlsZSBkaXJGaWxlKTsKLQkKLQl2b2lkIHNldFRlc3RSb290V29ya2luZyhGaWxlIGRpckZpbGUpOwotCQotCXZvaWQgb3BlbkN1cnJUZXN0RGlyKEZpbGUgZGlyRmlsZSk7Ci0JCi0Jdm9pZCBjbG9zZUN1cnJUZXN0RGlyKCk7Ci0JCi0Jdm9pZCBkb25lV2l0aEFsbFRlc3RzKEZpbGUgdG9wQ2xlYW5VcEZvbGRlcik7CQotCQkKLQl2b2lkIHNldFRlc3QoRmlsZSB0ZXN0RmlsZSk7CQkJCi0JCi0JaW50IGluY0V4ZWN1dGVkVGVzdENvdW50KCk7Ci0JCi0Jdm9pZCB0cmFjZShTdHJpbmcgbGluZSk7Ci0JCi0JVENFeGVSZXBseUxpc3QgZXhlY3V0ZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGE5M2Q3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1RDRXhlUmVwbHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgcmVwbHkgZnJvbSBhIHRlc3QgY29tbWFuZCBleGVjdXRpb24gCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVENFeGVSZXBseSB7Ci0JU3RyaW5nIGdldExhc3RNc2coKTsKLQlMaXN0IGdldE1zZ3MoKTsKLQlib29sZWFuIHBhc3NpbmcoKTsJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5TGlzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVENFeGVSZXBseUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4MDc5ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UQ0V4ZVJlcGx5TGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyByZXBseSBmcm9tIGEgdGVzdCBjb21tYW5kIGV4ZWN1dGlvbiAKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBUQ0V4ZVJlcGx5TGlzdCB7Ci0JaW50IHNpemUoKTsKLQlUQ0V4ZVJlcGx5IGl0ZW0oaW50IGkpOwotCVN0cmluZyBnZXRTdW1tYXJ5UmVwbHkoKTsKLQlib29sZWFuIHBhc3NpbmcoKTsJCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0Q29tbWFuZC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZWNkMS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pZmFjZS9UZXN0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlOwotCi1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RDb21tYW5kIHsJCQkJCi0JCi0JU3RyaW5nIFRlc3ROYW1lRXh0ID0gIi50YyI7Ci0JCi0JLy9BbGwgdGhlIHRhZ3Mgd2lsbCBiZSBmb3JtYWxseSBzcGVjaWZpZWQgYW5kIHJlYWQgZnJvbQotCS8vYSBzY2hlbWEgbGF0ZXIuCi0JCi0JLy9BdHRyaWJ1dGUgdGFncwotCVN0cmluZyBBVF9FeHRJZCA9ICJleHRJZCI7Ci0JU3RyaW5nIEFUX0Rpc2FibGUgPSAiZGlzYWJsZSI7Ci0JU3RyaW5nIEFUX0xpYkZvbGRlck5hbWUgPSAibGliRm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0V4cG9ydEZvbGRlck5hbWUgPSAiZXhwb3J0Rm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0ltcG9ydEZvbGRlck5hbWUgPSAiaW1wb3J0Rm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX0dvbGRlbkxpYkZvbGRlck5hbWUgPSAiZ29sZGVuTGliRm9sZGVyTmFtZSI7Ci0JU3RyaW5nIEFUX1NlbGVjdGVkQ29uZmlnTmFtZSA9ICJzZWxlY3RlZENvbmZpZ05hbWUiOwotCVN0cmluZyBBVF9EaWZmQ291bnQgPSAiZGlmZkNvdW50IjsKLQlTdHJpbmcgQVRfRWxlbWVudENvdW50ID0gImVsZW1lbnRDb3VudCI7Ci0JU3RyaW5nIEFUX1VzZU5hbWVBc0lkPSAidXNlTmFtZUFzSWQiOwotCVN0cmluZyBBVF9NZXJnZSA9ICJtZXJnZSI7Ci0JU3RyaW5nIEFUX05hbWUgPSAibmFtZSI7Ci0JU3RyaW5nIEFUX1R5cGUgPSAidHlwZSI7Ci0JU3RyaW5nIEFUX0JyaWVmRGVzY3JpcHRpb24gPSAiYnJpZWZEZXNjcmlwdGlvbiI7Ci0JU3RyaW5nIEFUX0F1dGhvcnMgPSAiYXV0aG9ycyI7Ci0JU3RyaW5nIEFUX1BhcmVudFBhdGg9InBhcmVudFBhdGgiOwotCVN0cmluZyBBVF9QYXJlbnRFeHRJZD0icGFyZW50RXh0SWQiOwotCVN0cmluZyBBVF9QYXRoPSJwYXRoIjsKLQlTdHJpbmcgQVRfUmVjdXJzaXZlPSJyZWN1cnNpdmUiOwotCVN0cmluZyBBVF9Hb2xkZW5GaWxlTmFtZSA9ICJnb2xkZW5GaWxlTmFtZSI7Ci0JU3RyaW5nIEFUX091dHB1dEZpbGVOYW1lID0gIm91dHB1dEZpbGVOYW1lIjsKLQlTdHJpbmcgQVRfRXJyb3JDb3VudCA9ICJlcnJvckNvdW50IjsKLQlTdHJpbmcgQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQgPSAiY2lyY3VsYXJFbGVtZW50Q291bnQiOwotCVN0cmluZyBBVF9WZXJib3NlID0gInZlcmJvc2UiOwotCQkKLQkvL1ZhbHVlIGVsZW1lbnQgdGFncwotCVN0cmluZyBWVF9iYXNlcyA9ICJiYXNlcyI7Ci0JU3RyaW5nIFZUX1ZhbHVlID0gIlZhbHVlIjsKLQkJCQkKLQlTdHJpbmcgdGFnTmFtZSgpOwotCS8vTGlicmFyeVRlc3RlciBnZXRUZXN0ZXIoKTsJCi0Jdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSk7Ci0JU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSk7Ci0Jdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpOwotCVRDRXhlUmVwbHkgZXhlY3V0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdFRyYWNlci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaWZhY2UvVGVzdFRyYWNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDgyY2Y3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2lmYWNlL1Rlc3RUcmFjZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZTsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRlc3RUcmFjZXIgewotCXZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpOwotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9FeHBvcnRJbXBvcnRUZXN0SW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9FeHBvcnRJbXBvcnRUZXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY4M2M1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvRXhwb3J0SW1wb3J0VGVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwb3J0SW1wb3J0VGVzdEltcGwgZXh0ZW5kcyBMaWJyYXJ5SnVuaXRUZXN0SW1wbCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNvdXJjZUZvbGRlck5hbWUgPSAiRXhwb3J0SW1wb3J0IjsKLQlwcml2YXRlIHN0YXRpYyAgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0ZXN0Um9vdFdvcmtpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRmlsZSBkZWZhdWx0VGVzdERpcjsgCi0JCi0JcHVibGljIEV4cG9ydEltcG9ydFRlc3RJbXBsKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEZpbGUgZ2V0VGVzdFJvb3RTb3VyY2UoKSB7Ci0JCWlmICh0ZXN0Um9vdFNvdXJjZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGdldFNlcnZpY2UoKS5nZXRUb3BUZXN0Um9vdFNvdXJjZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIHNvdXJjZUZvbGRlck5hbWUgKyAgRmlsZS5zZXBhcmF0b3I7Ci0JCQl0ZXN0Um9vdFNvdXJjZSA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCXJldHVybiB0ZXN0Um9vdFNvdXJjZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBGaWxlIGdldFRlc3RSb290V29ya2luZygpIHsKLQkJRmlsZSB0ZXN0Um9vdFdvcmtpbmcgPSAoRmlsZSkgdGVzdFJvb3RXb3JraW5nTWFwLmdldChnZXRDbGFzcygpKTsKLQkJaWYgKHRlc3RSb290V29ya2luZyA9PSBudWxsKSB7Ci0JCQlDbGFzcyBjbHMgPSBnZXRDbGFzcygpOwotCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gY2xzLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7Ci0JCQkKLQkJCVNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3M6U1NTIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkdFN0ciA9IHNkZi5mb3JtYXQobmV3IERhdGUoKSk7Ci0JCQlkdFN0ciA9IGR0U3RyLnJlcGxhY2UoJyAnLCAnXycpOwotCQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCc6JywgJy0nKTsKLQkJCQotCQkJU3RyaW5nIHBhdGggPSBnZXRTZXJ2aWNlKCkuZ2V0VGVzdEdyb3VwKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlwYXRoICs9IEZpbGUuc2VwYXJhdG9yICsgY2xzLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWUubGVuZ3RoKCkgKyAxKTsKLQkJCXBhdGggKz0gIl8iICsgZHRTdHIgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCXRlc3RSb290V29ya2luZyA9IG5ldyBGaWxlKHBhdGgpOwotCQkJdGVzdFJvb3RXb3JraW5nTWFwLnB1dChnZXRDbGFzcygpLCB0ZXN0Um9vdFdvcmtpbmcpOwotCQl9Ci0JCXJldHVybiB0ZXN0Um9vdFdvcmtpbmc7Ci0JfQotCQotCXByb3RlY3RlZCBGaWxlIGdldERlZmF1bHRUZXN0RGlyKCkgewotCQlpZiAoZGVmYXVsdFRlc3REaXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRUZXN0Um9vdFdvcmtpbmcoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgZ2V0TmFtZSgpOyAKLQkJCWRlZmF1bHRUZXN0RGlyID0gbmV3IEZpbGUocGF0aCk7Ci0JCX0KLQkJCi0JCXJldHVybiBkZWZhdWx0VGVzdERpcjsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5SnVuaXRUZXN0SW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5SnVuaXRUZXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODExNzBlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvTGlicmFyeUp1bml0VGVzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlKdW5pdFRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuTGlicmFyeUp1bml0VGVzdDsKLQotLyoqCi0gKiBMaWJyYXJ5IGp1bml0IHRlc3QgYmFzZSBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlicmFyeUp1bml0VGVzdEltcGwgZXh0ZW5kcyBUZXN0Q2FzZSBpbXBsZW1lbnRzIExpYnJhcnlKdW5pdFRlc3QgewotCi0JcHJpdmF0ZSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlOwkKLQkKLQlwdWJsaWMgTGlicmFyeUp1bml0VGVzdEltcGwoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXNlcnZpY2UgPSBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZS5nZXRJbnN0YW5jZSh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEZpbGUgZ2V0VGVzdFJvb3RTb3VyY2UoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRUZXN0Um9vdFdvcmtpbmcoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXREZWZhdWx0VGVzdERpcigpOwotCQotCQotCXB1YmxpYyBMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBnZXRTZXJ2aWNlKCkgewotCQlyZXR1cm4gc2VydmljZTsKLQl9CQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXNlcnZpY2Uuc2V0VXAoZ2V0VGVzdFJvb3RTb3VyY2UoKSwgZ2V0VGVzdFJvb3RXb3JraW5nKCksIGdldERlZmF1bHRUZXN0RGlyKCksIHRoaXMpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJc2VydmljZS50ZWFyRG93bih0aGlzKTsKLQl9CQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmRTZXRVcCgpIHsKLQkJc2VydmljZS50cmFjZSgiZW5kU2V0VXA6ICIgKyBnZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmRUZWFyRG93bigpIHsJCQotCQlzZXJ2aWNlLnRyYWNlKCJlbmRUZWFyRG93bjogIiArIGdldE5hbWUoKSk7Ci0JCXNlcnZpY2UudHJhY2UoIiIpOwkKLQl9CQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5VGVzdGVySW1wbC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9MaWJyYXJ5VGVzdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNjOTZlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvTGlicmFyeVRlc3RlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLkxpYnJhcnlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RlckltcGwgaW1wbGVtZW50cyBMaWJyYXJ5VGVzdGVyIHsKLQkKLQlwcml2YXRlIFRlc3RDb21tYW5kTWdyIHRlc3RDb21tYW5kTWdyOwotCQotCXB1YmxpYyBMaWJyYXJ5VGVzdGVySW1wbChib29sZWFuIHRyYWNlKSB7Ci0JCXRlc3RDb21tYW5kTWdyID0gbmV3IFRlc3RDb21tYW5kTWdyKHRyYWNlKTsKLQl9CQkJCi0JCi0JcHVibGljIHZvaWQgc2V0VGVzdFJvb3RTb3VyY2UoRmlsZSBkaXJGaWxlKSB7Ci0JCXRlc3RDb21tYW5kTWdyLnNldFRlc3RSb290U291cmNlKGRpckZpbGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFdvcmtpbmcoRmlsZSBkaXJGaWxlKSB7Ci0JCXRlc3RDb21tYW5kTWdyLnNldFRlc3RSb290V29ya2luZyhkaXJGaWxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3BlbkN1cnJUZXN0RGlyKEZpbGUgZGlyRmlsZSkgewotCQl0ZXN0Q29tbWFuZE1nci5vcGVuQ3VyclRlc3REaXIoZGlyRmlsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQ3VyclRlc3REaXIoKSB7Ci0JCXRlc3RDb21tYW5kTWdyLmNsb3NlQ3VyclRlc3REaXIoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZG9uZVdpdGhBbGxUZXN0cyhGaWxlIHRvcENsZWFuVXBGb2xkZXIpIHsKLQkJdGVzdENvbW1hbmRNZ3IuZG9uZVdpdGhBbGxUZXN0cyh0b3BDbGVhblVwRm9sZGVyKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0Q3VyclRlc3REaXIoKSB7Ci0JCXJldHVybiB0ZXN0Q29tbWFuZE1nci5nZXRDdXJyVGVzdERpcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0KEZpbGUgdGVzdEZpbGUpIHsKLQkJdGVzdENvbW1hbmRNZ3Iuc2V0VGVzdCh0ZXN0RmlsZSk7Ci0JfQkJCi0JCi0JcHVibGljIFRDRXhlUmVwbHlMaXN0IGV4ZWN1dGUoKSB7Ci0JCXJldHVybiB0ZXN0Q29tbWFuZE1nci5leGVjdXRlKCk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0cmFjZShTdHJpbmcgbGluZSkgewotCQl0ZXN0Q29tbWFuZE1nci50cmFjZShsaW5lKTsKLQl9CQotCQotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLm5ld1Rlc3RDb21tYW5kKGNscyk7Ci0JfQkJCi0JCi0JcHVibGljIGludCBpbmNFeGVjdXRlZFRlc3RDb3VudCgpIHsKLQkJcmV0dXJuIHRlc3RDb21tYW5kTWdyLmluY0V4ZWN1dGVkVGVzdENvdW50KCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMjRjZjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC9UZXN0Q29tbWFuZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UZXN0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFVzZWQgaW4gSlVuaXQgdGVzdHMgCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0Q29tbWFuZEltcGwgaW1wbGVtZW50cyBUZXN0Q29tbWFuZCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBUQ05ld01ldGhvZEVsZW1lbnQgbmV3TWV0aG9kRWxlbWVudCA9IG5ldyBUQ05ld01ldGhvZEVsZW1lbnQoKTsgCi0JCi0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCXByaXZhdGUgVGVzdENvbW1hbmRNZ3Igb3duZXI7Ci0JcHJpdmF0ZSBNYXAgYXR0dGlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkKLQlwdWJsaWMgdm9pZCBzZXRPd25lcihUZXN0Q29tbWFuZE1nciBtZ3IpIHsKLQkJb3duZXIgPSBtZ3I7Ci0JfQotCQotCXByb3RlY3RlZCBNYXAgZ2V0QXR0cmlidXRlTWFwKCkgewotCQlyZXR1cm4gYXR0dGlidXRlTWFwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRWYWx1ZSkgewotCQlpZiAoYXR0VmFsdWUgIT0gbnVsbCAmJiBhdHRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCWF0dHRpYnV0ZU1hcC5wdXQoYXR0TmFtZSwgYXR0VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgcmVtb3ZlQXR0cmlidXRlKFN0cmluZyBhdHROYW1lKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBhdHR0aWJ1dGVNYXAucmVtb3ZlKGF0dE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0TmFtZSkgewotCQlyZXR1cm4gKFN0cmluZykgYXR0dGlidXRlTWFwLmdldChhdHROYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXNldEF0dHJpYnV0ZShBVF9WZXJib3NlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9WZXJib3NlKSk7Ci0JCXZlcmJvc2UgPSBwYXJzZUJvb2xlYW4oQVRfVmVyYm9zZSwgdmVyYm9zZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFZlcmJvc2UoKSB7Ci0JCXJldHVybiB2ZXJib3NlOwotCX0KLQkKLQlwcm90ZWN0ZWQgRWxlbWVudCBnZXRFbGVtZW50KCkgewotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VDaGlsZHJlbihFbGVtZW50IGVsZW1lbnQpIHsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlc3RDb21tYW5kTWdyIGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIHRhZ05hbWUoKSB7Ci0JCXJldHVybiBvd25lciA9PSBudWxsID8gbnVsbCA6IG93bmVyLmdldFRhZ05hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHBhcnNlQm9vbGVhbihTdHJpbmcgYXR0LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgdG9DaGVja1N0ciA9IGRlZmF1bHRWYWx1ZSA/ICJmYWxzZSIgOiAidHJ1ZSI7Ci0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoYXR0KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5lcXVhbHNJZ25vcmVDYXNlKHRvQ2hlY2tTdHIpKSB7Ci0JCQlyZXR1cm4gIWRlZmF1bHRWYWx1ZTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgcGFyc2VJbnRlZ2VyKFN0cmluZyBhdHQsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGF0dCAhPSBudWxsICYmIGF0dC5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGF0dCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIEVDbGFzcyBnZXRFQ2xhc3MoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ld01ldGhvZEVsZW1lbnQuZ2V0RUNsYXNzKHR5cGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlKE1ldGhvZEVsZW1lbnQgZWxlbWVudCkgewotCQluZXdNZXRob2RFbGVtZW50LnNhdmUoZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBsaW5lKSB7Ci0JCWdldE93bmVyKCkubG9nKGxpbmUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRNZ3IuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvVGVzdENvbW1hbmRNZ3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2MzVkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL1Rlc3RDb21tYW5kTWdyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuWE1MVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkucHJvamVjdC5NZXRob2RMaWJyYXJ5UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeURpZmZBbmFseXpvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5MaWJyYXJ5SnVuaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RUcmFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvR29sZGVuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb21wYXJlVG9MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvcHlMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0VkaXRNZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4ZVJlcGx5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeGVSZXBseUxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0V4cG9ydENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0UGx1Z2luczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRQbHVnaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydFhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENOZXdNZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDTmV3TWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ091dHB1dE1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS54bWkuWE1JTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DYXBhYmlsaXR5UGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBVc2VkIGluIEpVbml0IHRlc3RzIAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGVzdENvbW1hbmRNZ3IgaW1wbGVtZW50cyBUZXN0VHJhY2VyIHsJCi0JCi0JLy9BbGwgdGhlIHRhZ3Mgd2lsbCBiZSBmb3JtYWxseSBzcGVjaWZpZWQgYW5kIHJlYWQgZnJvbQotCS8vYSBzY2hlbWEgbGF0ZXIuCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0NvcHlMaWJyYXJ5ID0gIkNvcHlMaWJyYXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENPcGVuTGlicmFyeSA9ICJPcGVuTGlicmFyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRXhwb3J0UGx1Z2lucyA9ICJFeHBvcnRQbHVnaW5zIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENJbXBvcnRQbHVnaW5zID0gIkltcG9ydFBsdWdpbnMiOwkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFeHBvcnRDb25maWd1cmF0aW9uID0gIkV4cG9ydENvbmZpZ3VyYXRpb24iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0ltcG9ydENvbmZpZ3VyYXRpb24gPSAiSW1wb3J0Q29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRXhwb3J0WG1sID0gIkV4cG9ydFhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDSW1wb3J0WG1sID0gIkltcG9ydFhtbCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDQ29tcGFyZVRvTGlicmFyeSA9ICJDb21wYXJlVG9MaWJyYXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENDb21wYXJlVG9Hb2xkZW5GaWxlID0gIkNvbXBhcmVUb0dvbGRlbkZpbGUiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ05ld01ldGhvZFBsdWdpbiA9ICJOZXdNZXRob2RQbHVnaW4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ05ld01ldGhvZENvbmZpZ3VyYXRpb24gPSAiTmV3TWV0aG9kQ29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDTmV3TWV0aG9kRWxlbWVudCA9ICJOZXdNZXRob2RFbGVtZW50IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVENFZGl0TWV0aG9kRWxlbWVudCA9ICJFZGl0TWV0aG9kRWxlbWVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgPSAiQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2siOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VuZCA9ICJFbmQiOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VkaXRQbHVnaW49IkVkaXRQbHVnaW4iOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUQ0VkaXRDb25maWd1cmF0aW9uPSJFZGl0Q29uZmlndXJhdGlvbiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFRDRWRpdENvbnRlbnRQYWNrYWdlPSJFZGl0Q29udGVudFBhY2thZ2UiOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRDT3V0cHV0TGlicmFyeT0iT3V0cHV0TGlicmFyeSI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENPdXRwdXRQbHVnaW49Ik91dHB1dFBsdWdpbiI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVENPdXRwdXRDb25maWd1cmF0aW9uPSJPdXRwdXRDb25maWd1cmF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQ091dHB1dE1ldGhvZEVsZW1lbnQ9Ik91dHB1dE1ldGhvZEVsZW1lbnQiOwotCQkKLQlwcml2YXRlIGJvb2xlYW4gdHJhY2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlRmlsZXMgPSB0cnVlOwotCQotCXByaXZhdGUgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQlwcml2YXRlIEZpbGUgdGVzdFJvb3RXb3JraW5nOwotCXByaXZhdGUgRmlsZSBjdXJyVGVzdERpcjsKLQlwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoOwotCXByaXZhdGUgRG9jdW1lbnQgb3V0cHV0RG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQcmludFN0cmVhbSB0ZXN0Um9vdE91dDsKLQlwcml2YXRlIFByaW50U3RyZWFtIGN1cnJUZXN0T3V0OwotCXByaXZhdGUgaW50IGV4ZWN1dGVkVGVzdENvdW50ID0gMDsJCi0JCQotCXByaXZhdGUgc3RhdGljIExpYnJhcnlUZXN0U2VydmljZSBzZXJ2aWNlID0gTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBGaWxlIHRlc3RGaWxlOwotCXByaXZhdGUgTGlzdCB0ZXN0Q29tbWFuZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaWJyYXJ5SnVuaXRUZXN0IGp1bml0VGVzdENhc2U7Ci0JCi0JcHJpdmF0ZSBNZXRob2RMaWJyYXJ5IGN1cnJlbnRCYXNlTGliOwotCXByaXZhdGUgTWFwIGFsbExpYnMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCXByaXZhdGUgTWFwIGFsbEV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgdGNDbGFzc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIHRjVGFnTmFtZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCi0JcHJpdmF0ZSBQcmludFN0cmVhbSBsb2dQUyA9IFN5c3RlbS5vdXQ7Ci0JCi0Jc3RhdGljIHsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDQ29weUxpYnJhcnksIFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPcGVuTGlicmFyeSwgVENPcGVuTGlicmFyeS5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0V4cG9ydFBsdWdpbnMsIFRDRXhwb3J0UGx1Z2lucy5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0ltcG9ydFBsdWdpbnMsIFRDSW1wb3J0UGx1Z2lucy5jbGFzcyk7CQkKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRXhwb3J0Q29uZmlndXJhdGlvbiwgVENFeHBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDSW1wb3J0Q29uZmlndXJhdGlvbiwgVENJbXBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRXhwb3J0WG1sLCBUQ0V4cG9ydFhtbC5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0ltcG9ydFhtbCwgVENJbXBvcnRYbWwuY2xhc3MpOwkJCi0JCWFkZFRvVGNDbGFzc01hcChUQ0NvbXBhcmVUb0xpYnJhcnksIFRDQ29tcGFyZVRvTGlicmFyeS5jbGFzcyk7Ci0JCWFkZFRvVGNDbGFzc01hcChUQ0NvbXBhcmVUb0dvbGRlbkZpbGUsIFRDQ29tcGFyZVRvR29sZGVuRmlsZS5jbGFzcyk7Ci0JCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENOZXdNZXRob2RQbHVnaW4sIFRDTmV3TWV0aG9kUGx1Z2luLmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDTmV3TWV0aG9kQ29uZmlndXJhdGlvbiwgVENOZXdNZXRob2RDb25maWd1cmF0aW9uLmNsYXNzKTsJCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENOZXdNZXRob2RFbGVtZW50LCBUQ05ld01ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0TWV0aG9kRWxlbWVudCwgVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCQotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0UGx1Z2luLCBUQ0VkaXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDRWRpdENvbmZpZ3VyYXRpb24sIFRDRWRpdE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENFZGl0Q29udGVudFBhY2thZ2UsIFRDRWRpdE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQkKLQkJYWRkVG9UY0NsYXNzTWFwKFRDT3V0cHV0TGlicmFyeSwgVENPdXRwdXRNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJYWRkVG9UY0NsYXNzTWFwKFRDT3V0cHV0UGx1Z2luLCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRDb25maWd1cmF0aW9uLCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENPdXRwdXRNZXRob2RFbGVtZW50LCBUQ091dHB1dE1ldGhvZEVsZW1lbnQuY2xhc3MpOwotCQlhZGRUb1RjQ2xhc3NNYXAoVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjaywgVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjay5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkVG9UY0NsYXNzTWFwKFN0cmluZyBlbGVtZW50TmFtZSwgQ2xhc3MgY2xzKSB7Ci0JCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnN0YW5jZSA9IGNscy5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFRlc3RDb21tYW5kKSB7Ci0JCQl0Y0NsYXNzTWFwLnB1dChlbGVtZW50TmFtZSwgaW5zdGFuY2UpOwotCQkJdGNUYWdOYW1lTWFwLnB1dChjbHMsIGVsZW1lbnROYW1lKTsKLQkJfQkJCi0JfQotCi0JcHVibGljIFRlc3RDb21tYW5kTWdyKGJvb2xlYW4gdHJhY2UpIHsKLQkJaWYgKHRyYWNlKSB7Ci0JCQl0aGlzLnRyYWNlID0gdHJhY2U7Ci0JCQl0aGlzLnJlbW92ZUZpbGVzID0gIXRyYWNlOwotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhZ05hbWUoVGVzdENvbW1hbmQgdGNJbnN0YW5jZSkgewotCQlyZXR1cm4gKFN0cmluZykgdGNUYWdOYW1lTWFwLmdldCh0Y0luc3RhbmNlLmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFNvdXJjZShGaWxlIGRpckZpbGUpIHsKLQkJdGVzdFJvb3RTb3VyY2UgPSBkaXJGaWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUZXN0Um9vdFdvcmtpbmcoRmlsZSBkaXJGaWxlKSB7Ci0JCWJvb2xlYW4gbmVlZFRvQ3JlYXRlT3V0cHV0RmlsZSA9IHRlc3RSb290V29ya2luZyA9PSBudWxsIHx8Ci0JCQkJCQkJCSEgdGVzdFJvb3RXb3JraW5nLmVxdWFscyhkaXJGaWxlKTsKLQkJCi0JCXRlc3RSb290V29ya2luZyA9IGRpckZpbGU7Ci0JCQotCQlpZiAodHJhY2UgJiYgbmVlZFRvQ3JlYXRlT3V0cHV0RmlsZSkgewotCQkJdHJ5IHsKLQkJCQlpZiAoISB0ZXN0Um9vdFdvcmtpbmcuZXhpc3RzKCkpIHsJCQkJCQotCQkJCQlpZiAoISBta0Rpcih0ZXN0Um9vdFdvcmtpbmcpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCQkJdGVzdFJvb3RPdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJU3RyaW5nIHBhdGggPSB0ZXN0Um9vdFdvcmtpbmcuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArICJ0cmFjZXMub3V0IjsKLQkJCQl0ZXN0Um9vdE91dCA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1rRGlyKEZpbGUgZmlsZSkgewotCQlGaWxlIHBGaWxlID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CQkKLQkJaWYgKCEgcEZpbGUuZXhpc3RzKCkpIHsJCQkJCQotCQkJaWYgKCEgbWtEaXIocEZpbGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaWxlLm1rZGlyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9wZW5DdXJyVGVzdERpcihGaWxlIGRpckZpbGUpIHsKLQkJY3VyclRlc3REaXIgPSBkaXJGaWxlOwotCQkKLQkJdHJ5IHsKLQkJCWlmICghIGN1cnJUZXN0RGlyLmV4aXN0cygpKSB7Ci0JCQkJY3VyclRlc3REaXIubWtkaXIoKTsKLQkJCX0KLQkJCVN0cmluZyBwYXRoID0gY3VyclRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCWlmICh0cmFjZSkgewotCQkJCWN1cnJUZXN0T3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBhdGggKyAidHJhY2Uub3V0IikpOwotCQkJfQotCQkJb3V0cHV0UGF0aCA9IHBhdGggKyAib3V0cHV0LnhtbCI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZUN1cnJUZXN0RGlyKCkgewotCQljbG9zZUxpYnJhcnkoZ2V0Q3VycmVudEJhc2VMaWIoKSk7Ci0JCWlmIChjdXJyVGVzdE91dCAhPSBudWxsKSB7Ci0JCQljdXJyVGVzdE91dC5jbG9zZSgpOwotCQkJY3VyclRlc3RPdXQgPSBudWxsOwotCQl9Ci0JCWNsZWFyT3V0cHV0RG9jdW1lbnQoKTsKLQkJYWxsTGlicyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JCWFsbEV4cG9ydHMgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQljbG9zZUZvbGRlcihjdXJyVGVzdERpcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRvbmVXaXRoQWxsVGVzdHMoRmlsZSB0b3BDbGVhblVwRm9sZGVyKSB7Ci0JCWNsb3NlQWxsRXhwb3J0UHJvamVjdHMoKTsKLQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCXRlc3RSb290T3V0LmNsb3NlKCk7Ci0JCX0KLQkJY2xvc2VGb2xkZXIodG9wQ2xlYW5VcEZvbGRlcik7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldEN1cnJUZXN0RGlyKCkgewotCQlyZXR1cm4gY3VyclRlc3REaXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRlc3QoRmlsZSB0ZXN0RmlsZSkgewotCQl0aGlzLnRlc3RGaWxlID0gdGVzdEZpbGU7CQkKLQl9CQotCQotCXB1YmxpYyBGaWxlIGdldFRlc3RGaWxlKCkgewotCQlyZXR1cm4gdGVzdEZpbGU7CQkKLQl9CQotCQotCQotCXB1YmxpYyBMaWJyYXJ5VGVzdFNlcnZpY2UgZ2V0U2VydmljZSgpIHsKLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5TGlzdCBleGVjdXRlKCkgewotCQl0cmFjZSgiQmVnaW4gZXhlY3V0aW5nOiAiICsgdGVzdEZpbGUpOwotCi0JCVRDRXhlUmVwbHlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCUV4Y2VwdGlvbiBsb2FkRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWxvYWRlZCA9IGxvYWRUZXN0KCk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2FkRXhjZXB0aW9uID0gZTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJCi0JCWlmIChsb2FkZWQpIHsJCQkKLQkJCVN0cmluZyBwYXRoID0gdGVzdFJvb3RXb3JraW5nLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyB0ZXN0RmlsZS5nZXROYW1lKCkgKyAiLmRpciI7Ci0JCQlvcGVuQ3VyclRlc3REaXIobmV3IEZpbGUgKHBhdGgpKTsKLQkJCXJlc3VsdCA9IGV4ZWN1dGVDb21tYW5kcygpOwkJCi0JCQljbG9zZUN1cnJUZXN0RGlyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXcgVENFeGVSZXBseUxpc3RJbXBsKCk7Ci0JCQlpZiAobG9hZEV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1zZyA9ICJUZXN0IGxvYWQgZmFpbGVkOiAiICsgbG9hZEV4Y2VwdGlvbi5nZXRNZXNzYWdlKCk7Ci0JCQkJKChUQ0V4ZVJlcGx5TGlzdEltcGwpIHJlc3VsdCkuYWRkKG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKSk7Ci0JCQkJdHJhY2UobXNnKTsKLQkJCX0gZWxzZSB7CQkJCi0JCQkJdHJhY2UoIlRlc3QgZGlzYWJsZWQiKTsKLQkJCX0KLQkJfQotCQkKLQkJdHJhY2UoIkVuZCBleGVjdXRpbmcgIDogIiArIHRlc3RGaWxlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRlc3RDb21tYW5kTGlzdC5jbGVhcigpOwotCQlEb2N1bWVudCBkb2N1bWVudCA9IFhNTFV0aWwubG9hZFhtbCh0ZXN0RmlsZSk7CQotCQlFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJaWYgKHJvb3QuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0Rpc2FibGUpLmVxdWFscygidHJ1ZSIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CQkJCQotCQl9Ci0JCWJvb2xlYW4gdmVyYm9zZSA9IHJvb3QuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1ZlcmJvc2UpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQkJTm9kZUxpc3Qgbm9kZXMgPSByb290LmdldENoaWxkTm9kZXMoKTsKLQkJaW50IHN6ID0gbm9kZXMgPT0gbnVsbCA/IDAgOiBub2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9WZXJib3NlLCAidHJ1ZSIpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShUQ0VuZCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWFkZENvbW1hbmQobm9kZSk7Ci0JCQl9Ci0JCX0JCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5TGlzdCBleGVjdXRlQ29tbWFuZHMoKSB7Ci0JCVRDRXhlUmVwbHlMaXN0SW1wbCByZXN1bHQgPSBuZXcgVENFeGVSZXBseUxpc3RJbXBsKCk7Ci0JCWZvciAoaW50IGk9MDsgaTx0ZXN0Q29tbWFuZExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCVRlc3RDb21tYW5kSW1wbCBjb21tYW5kID0gKFRlc3RDb21tYW5kSW1wbCkgdGVzdENvbW1hbmRMaXN0LmdldChpKTsKLQkJCVRDRXhlUmVwbHkgcmVwbHkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXBseSA9IGNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCXJlcGx5ID0gbmV3IFRDRXhlUmVwbHlJbXBsKGUuZ2V0TWVzc2FnZSgpLCBmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQocmVwbHkpOwotCQkJCWlmICghcmVwbHkucGFzc2luZygpKSB7Ci0JCQkJCWxvZygiXG5UaGUgZm9sbG93aW5nIGNvbW1hbmQgaXMgbm90IHBhc3Npbmc6IFxuIiArICBjb21tYW5kLmdldEVsZW1lbnQoKSArICJcbiIpOwotCQkJCX0KLQkJCX0KLQkJfQkJCQotCQkKLQkJU3RyaW5nIGxpbmUgPSB0ZXN0RmlsZS5nZXROYW1lKCkgKyAiIGlzICI7Ci0JCVN0cmluZyBkaXJTdHIgPSAidGVzdFJvb3RTb3VyY2U6ICIgKyB0ZXN0Um9vdFNvdXJjZSAKLQkJCQkJCSsgIiwgdGVzdFJvb3RXb3JraW5nOiAiICsgdGVzdFJvb3RXb3JraW5nOwotCQlpZiAocmVzdWx0LnBhc3NpbmcoKSkgewotCQkJbGluZSArPSAicGFzc2luZy4gIiArIGRpclN0cjsKLQkJfSBlbHNlIHsKLQkJCWxpbmUgKz0gImZhaWxpbmchICIgKyBkaXJTdHI7Ci0JCX0KLQkJcmVzdWx0LnNldFN1bW1hcnlSZXBseShsaW5lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJaWYgKHRlc3RSb290T3V0ICE9IG51bGwpIHsKLQkJCXRlc3RSb290T3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQkJCi0JCWlmIChjdXJyVGVzdE91dCAhPSBudWxsKSB7Ci0JCQljdXJyVGVzdE91dC5wcmludGxuKGxpbmUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDb21tYW5kKE5vZGUgbm9kZSkgewotCQlpZiAoICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmICghIGVsZW1lbnQuZ2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0Rpc2FibGUpLmVxdWFscygidHJ1ZSIpKSB7Ci0JCQlUZXN0Q29tbWFuZCBjb21tYW5kID0gbmV3VGVzdENvbW1hbmQoZWxlbWVudC5nZXRUYWdOYW1lKCkpOwotCQkJaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotCQkJCWNvbW1hbmQucGFyc2UoZWxlbWVudCk7Ci0JCQkJdGVzdENvbW1hbmRMaXN0LmFkZChjb21tYW5kKTsKLQkJCX0KLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChTdHJpbmcgY29tYW5kTmFtZSkgewotCQlPYmplY3Qgb2JqID0gdGNDbGFzc01hcC5nZXQoY29tYW5kTmFtZSk7Ci0JCXJldHVybiBvYmogPT0gbnVsbCA/IG51bGwgOiBuZXdUZXN0Q29tbWFuZChvYmouZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyBUZXN0Q29tbWFuZCBuZXdUZXN0Q29tbWFuZChDbGFzcyBjbHMpIHsKLQkJVGVzdENvbW1hbmQgcmV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldCA9IChUZXN0Q29tbWFuZCkgY2xzLm5ld0luc3RhbmNlKCk7Ci0JCQkoKFRlc3RDb21tYW5kSW1wbCkgcmV0KS5zZXRPd25lcih0aGlzKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCQotCXByaXZhdGUgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYihTdHJpbmcgbmFtZSwgYm9vbGVhbiBpZk5ld1RoZW5CdWlsZERlYWZhdWx0TGliKSB7Ci0JCWlmIChjdXJyZW50QmFzZUxpYiAhPSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShjdXJyZW50QmFzZUxpYi5lUmVzb3VyY2UoKS5nZXRVUkkoKS50b0ZpbGVTdHJpbmcoKSkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewkJCQotCQkJCXJldHVybiBjdXJyZW50QmFzZUxpYjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGFsbEV4cG9ydHMuY29udGFpbnNLZXkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlzZXJ2aWNlLmNsb3NlTGlicmFyeShjdXJyZW50QmFzZUxpYik7Ci0JCQotCQljdXJyZW50QmFzZUxpYiA9IG51bGw7Ci0JCVN0cmluZyBsaWJQYXRoID0gKFN0cmluZykgYWxsTGlicy5nZXQobmFtZSk7Ci0JCWlmIChsaWJQYXRoID09IG51bGwpIHsKLQkJCWxpYlBhdGggPSBjdXJyVGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmFtZTsJCi0JCQl0cnkgewotCQkJCWN1cnJlbnRCYXNlTGliID0gY29weUZyb21UZXN0TGlicyhsaWJQYXRoLCBuYW1lKSA/ICAKLQkJCQkJCQkJWE1JTGlicmFyeVV0aWwub3Blbk1ldGhvZExpYnJhcnkobGliUGF0aCkgOiBudWxsOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsJCQkJCi0JCQl9Ci0JCQlpZiAoY3VycmVudEJhc2VMaWIgPT0gbnVsbCkgewotCQkJCWN1cnJlbnRCYXNlTGliID0gc2VydmljZS5jcmVhdGVMaWJyYXJ5KGxpYlBhdGgsIG5hbWUpOwotCQkJCWlmIChpZk5ld1RoZW5CdWlsZERlYWZhdWx0TGliKSB7Ci0JCQkJCWJ1aWxkRGVmYXVsdExpYnJhcnkoKTsKLQkJCQl9Ci0JCQkJdHJhY2UoIkJhc2UgbGliIFwiIiArIG5hbWUgKyAiXCIgaXMgY3JlYXRlZC4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdHJhY2UoIkJhc2UgbGliIFwiIiArIG5hbWUgKyAiXCIgaXMgY29waWVkIGZyb20gdGVzdExpYnMgYW5kIGxhb2RlZC4iKTsKLQkJCX0KLQkJCWFsbExpYnMucHV0KG5hbWUsIGxpYlBhdGgpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQljdXJyZW50QmFzZUxpYiA9IFhNSUxpYnJhcnlVdGlsLm9wZW5NZXRob2RMaWJyYXJ5KGxpYlBhdGgpOwotCQkJCXRyYWNlKCJCYXNlIGxpYiBcIiIgKyBuYW1lICsgIlwiIGlzIGxvYWRlZC4iKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBjdXJyZW50QmFzZUxpYjsKLQl9CQkJCi0JCi0JcHVibGljIE1ldGhvZExpYnJhcnkgbG9hZE5vbkJhc2VMaWIoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIGxpYlBhdGggPSAoU3RyaW5nKSBhbGxMaWJzLmdldChuYW1lKTsKLQkJaWYgKGxpYlBhdGggPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2UubG9hZExpYnJhcnkobGliUGF0aCk7Ci0JfQkJCQotCQotCXB1YmxpYyBNZXRob2RMaWJyYXJ5IGdldEN1cnJlbnRCYXNlTGliKCkgewotCQlyZXR1cm4gY3VycmVudEJhc2VMaWI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRCYXNlTGliKE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCWN1cnJlbnRCYXNlTGliID0gbGliOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbG9hZEJhc2VMaWIobmFtZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgTWV0aG9kTGlicmFyeSBsb2FkQmFzZUxpYk9yQnVpbGRCYXNlV2l0aERlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGxvYWRCYXNlTGliKG5hbWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRJbXBvcnRGaWxlKFN0cmluZyBpbXBvcnRGb2xkZXJOYW1lKSB7Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBhbGxFeHBvcnRzLmdldChpbXBvcnRGb2xkZXJOYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJZmlsZSA9IG5ldyBGaWxlKHRlc3RSb290U291cmNlLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBpbXBvcnRGb2xkZXJOYW1lKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXB1YmxpYyBGaWxlIHJlZ2lzdGVyRXhwb3J0RGVzdGluYXRpb24oU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNYTUwpIHsKLQkJaWYgKGFsbExpYnMuY29udGFpbnNLZXkobmFtZSkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUZpbGUgZmlsZSA9IChGaWxlKSBhbGxFeHBvcnRzLmdldChuYW1lKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBjdXJyVGVzdERpci5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmFtZTsKLQkJCWlmIChpc1hNTCkgewotCQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBuYW1lICsgIi54bWwiOwotCQkJfQotCQkJZmlsZSA9ICBuZXcgRmlsZShwYXRoKTsKLQkJCWFsbEV4cG9ydHMucHV0KG5hbWUsIGZpbGUpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0JCi0JCi0JcHVibGljIHZvaWQgY2xvc2VMaWJyYXJ5KE1ldGhvZExpYnJhcnkgbGliKSB7Ci0JCXNlcnZpY2UuY2xvc2VMaWJyYXJ5KGxpYik7Ci0JCXNldEN1cnJlbnRCYXNlTGliKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbG9zZUZvbGRlcihGaWxlIGZvbGRlcikgewotCQlpZiAocmVtb3ZlRmlsZXMpIHsKLQkJCXNlcnZpY2UuZGVsZXRlRm9sZGVyKGZvbGRlcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGludCBpbmNFeGVjdXRlZFRlc3RDb3VudCgpIHsKLQkJcmV0dXJuICsrZXhlY3V0ZWRUZXN0Q291bnQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsb3NlQWxsRXhwb3J0UHJvamVjdHMoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBhbGxFeHBvcnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdC5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCU1ldGhvZExpYnJhcnlQcm9qZWN0LmNsb3NlUHJvamVjdChmaWxlLmdldEFic29sdXRlUGF0aCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKXsJCQkJCQotCQkJfQotCQl9CQotCX0JCi0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZUxpYnMoTWV0aG9kTGlicmFyeSBsaWIxLCAgTWV0aG9kTGlicmFyeSBsaWIyKSB7Ci0JCXJldHVybiBjb21wYXJlTGlicyhsaWIxLCBsaWIyLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNvbXBhcmVMaWJzKE1ldGhvZExpYnJhcnkgbGliMSwgIE1ldGhvZExpYnJhcnkgbGliMiwgYm9vbGVhbiB1c2VOYW1lQXMybmRJZCkgewotCQlMaWJyYXJ5RGlmZkFuYWx5em9yIGFuYWx5em9yID0gbmV3IExpYnJhcnlEaWZmQW5hbHl6b3IodGhpcywgbGliMSwgbGliMik7Ci0JCWFuYWx5em9yLnNldEdyZWVkeSh0cmFjZSk7Ci0JCWFuYWx5em9yLnNldFVzZU5hbWVBczJuZElkKHVzZU5hbWVBczJuZElkKTsKLQkJcmV0dXJuIGFuYWx5em9yLmNvbXBhcmUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29tcGFyZUxpYnMoTWV0aG9kTGlicmFyeSBsaWIxLCAgTWV0aG9kTGlicmFyeSBsaWIyLCBpbnQgZGlmZkNvdW50LCBpbnQgZWxlbUNvbXBhcmVkQ291bnQsIGJvb2xlYW4gdXNlTmFtZUFzMm5kSWQpIHsKLQkJaWYgKGRpZmZDb3VudCA9PSAwICYmIGVsZW1Db21wYXJlZENvdW50ID09IDApIHsKLQkJCXJldHVybiBjb21wYXJlTGlicyhsaWIxLCBsaWIyLCB1c2VOYW1lQXMybmRJZCk7Ci0JCX0KLQkJTGlicmFyeURpZmZBbmFseXpvciBhbmFseXpvciA9IG5ldyBMaWJyYXJ5RGlmZkFuYWx5em9yKHRoaXMsIGxpYjEsIGxpYjIpOwotCQlhbmFseXpvci5zZXRHcmVlZHkodHJ1ZSk7Ci0JCWFuYWx5em9yLnNldFVzZU5hbWVBczJuZElkKHVzZU5hbWVBczJuZElkKTsKLQkJYW5hbHl6b3IuY29tcGFyZSgpOwotCQlyZXR1cm4gCWFuYWx5em9yLmdldERpZmZDb3VudCgpID09IGRpZmZDb3VudCAmJgotCQkJIAlhbmFseXpvci5nZXRFbGVtQ29tcGFyZWRDb3VudCgpID09IGVsZW1Db21wYXJlZENvdW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZERlZmF1bHRMaWJyYXJ5KCkgewkJCi0JCXRyYWNlKCJidWlsZERlZmF1bHRMaWJyYXJ5IC0+Iik7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJQbHVnX0EiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oIkNvbmZpZ19BIik7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7CQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoY3AyLCBjcDEpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uCi0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AxLmVDb250YWluZXIoKSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMi5lQ29udGFpbmVyKCkpOwotCQkKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJZmluYWwgU3RyaW5nIGNwMV90ZXh0ID0gImNwMSBtYWluIGRlc2MiOwotCQlmaW5hbCBTdHJpbmcgY3AyX3RleHQgPSAiY3AyIG1haW4gZGVzYyI7Ci0JCQkKLQkJY3AxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjcDFfdGV4dCk7Ci0JCWNwMi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY3AyX3RleHQpOwotCi0JCXRyYWNlKCJidWlsZERlZmF1bHRMaWJyYXJ5IDwtIik7Ci0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29weUZyb21UZXN0TGlicyhTdHJpbmcgbGliUGF0aCwgU3RyaW5nIHJlbExpYk5hbWVQYXRoKSB7Ci0JCUZpbGUgc291cmNlID0gbmV3IEZpbGUodGVzdFJvb3RTb3VyY2UuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIHJlbExpYk5hbWVQYXRoKTsKLQkJU3RyaW5nIGxpYk5hbWUgPSBzb3VyY2UuZ2V0TmFtZSgpOwotCQlGaWxlIGxpYkxpc3RbXSA9IHNvdXJjZS5nZXRQYXJlbnRGaWxlKCkubGlzdEZpbGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxsaWJMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBsaWJMaXN0W2ldOwotCQkJaWYgKGxpYk5hbWUuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUobGliUGF0aCk7Ci0JCQkJUGx1Z2luSW1wb3J0aW5nU2VydmljZS5jb3B5RGlyKHNvdXJjZSwgdGFyZ2V0KTsKLQkJCQlhbGxMaWJzLnB1dChsaWJOYW1lLCBsaWJQYXRoKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBEb2N1bWVudCBnZXRPdXRwdXREb2N1bWVudCgpIHsKLQkJaWYgKG91dHB1dERvY3VtZW50ID09IG51bGwpIHsJCQkKLQkJCXRyeSB7Ci0JCQkJb3V0cHV0RG9jdW1lbnQgPSBYTUxVdGlsLmNyZWF0ZURvY3VtZW50KCk7Ci0JCSAgICAgICAgRWxlbWVudCByb290ID0gb3V0cHV0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiVGVzdGVyT3V0cHV0Iik7Ci0JCSAgICAgICAgb3V0cHV0RG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG91dHB1dERvY3VtZW50OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xlYXJPdXRwdXREb2N1bWVudCgpIHsKLQkJb3V0cHV0RG9jdW1lbnQgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE91dHB1dFBhdGgoKSB7Ci0JCXJldHVybiBvdXRwdXRQYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBsb2coU3RyaW5nIGxpbmUpIHsKLQkJbG9nUFMucHJpbnRsbihsaW5lKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMmMzY2UuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDaXJjdWxhckRlcGVuZGVuY3lDaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lJbmZvTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudmFsaWRhdGlvbi5UcmFjZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2sgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfQ2lyY3VsYXJFbGVtZW50Q291bnQsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0NpcmN1bGFyRWxlbWVudENvdW50KSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlpbnQgZXJyb3JDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfRXJyb3JDb3VudCksIDApOwotCQlpbnQgY2lyY3VsYXJFbGVtZW50Q291bnQgPSBwYXJzZUludGVnZXIoZ2V0QXR0cmlidXRlKEFUX0NpcmN1bGFyRWxlbWVudENvdW50KSwgMCk7Ci0JCWZpbmFsIFRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJCi0JCVRyYWNlciB0cmFjZXIgPSBuZXcgVHJhY2VyKCkgewotCQkJcHVibGljIHZvaWQgdHJhY2UoU3RyaW5nIGxpbmUpIHsKLQkJCQlvd25lci50cmFjZShsaW5lKTsKLQkJCX0KLQkJfTsKLQkJCi0JCURlcGVuZGVuY3lJbmZvTWdyIGluZm9NZ3IgPSBuZXcgRGVwZW5kZW5jeUluZm9NZ3Iob3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKSk7Ci0JCURlcGVuZGVuY3lJbmZvTWdyLkNoZWNrUmVzdWx0IGNoZWNrUmVzdWx0ID0gaW5mb01nci5jaGVja0NpcmN1bGFyRGVwZW5kbmVjeSh0cmFjZXIpOwotCQkKLQkJaWYgKGNoZWNrUmVzdWx0LmdldEVycm9yQ291bnQoKSAhPSBlcnJvckNvdW50IHx8IAotCQkJCWNoZWNrUmVzdWx0LmdldENpcmN1bGFyRWxlbWVudENvdW50KCkgIT0gY2lyY3VsYXJFbGVtZW50Q291bnQpIHsKLQkJCVN0cmluZyBtc2cgPSAiY2hlY2tSZXN1bHQuZ2V0RXJyb3JDb3VudCgpID0gIiArIGNoZWNrUmVzdWx0LmdldEVycm9yQ291bnQoKSArICJcbiI7Ci0JCQltc2cgKz0gImNoZWNrUmVzdWx0LmdldENpcmN1bGFyRWxlbWVudENvdW50KCkgPSAiICsgY2hlY2tSZXN1bHQuZ2V0Q2lyY3VsYXJFbGVtZW50Q291bnQoKTsKLQkJCW93bmVyLnRyYWNlKG1zZyk7Ci0JCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKG1zZywgZmFsc2UpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0dvbGRlbkZpbGUuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvR29sZGVuRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjM2MGZhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29tcGFyZVRvR29sZGVuRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5YTUxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5PdXRwdXREaWZmQW5hbHl6b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDQ29tcGFyZVRvR29sZGVuRmlsZSBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9Hb2xkZW5GaWxlTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfR29sZGVuRmlsZU5hbWUpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0RpZmZDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9FbGVtZW50Q291bnQsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGdvbGRlbkZpbGVOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0dvbGRlbkZpbGVOYW1lKTsKLQkJaW50IGRpZmZDb3VudCA9IHBhcnNlSW50ZWdlcihnZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KSwgMCk7Ci0JCWludCBlbGVtZW50Q291bnQgPSBwYXJzZUludGVnZXIoZ2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCksIDApOwkKLQkJVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQkKLQkJRG9jdW1lbnQgb3V0cHV0RG9jdW1lbnQgPSBvd25lci5nZXRPdXRwdXREb2N1bWVudCgpOwotCQlpZiAob3V0cHV0RG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBvdXRwdXRQYXRoID0gb3duZXIuZ2V0T3V0cHV0UGF0aCgpOwotCQl0cnkgewotCQkJWE1MVXRpbC5zYXZlRG9jdW1lbnQob3V0cHV0RG9jdW1lbnQsIG91dHB1dFBhdGgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCVN0cmluZyBwYXRoID0gb3duZXIuZ2V0VGVzdEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaW50IGl4ID0gcGF0aC5sYXN0SW5kZXhPZigiLiIpOwotCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaXgpICsgIi54bWwiOwotCQlGaWxlIGdvbGRlbk91dHB1dCA9IG5ldyBGaWxlKHBhdGgpOwotCQlpZiAoZ29sZGVuT3V0cHV0LmV4aXN0cygpKSB7Ci0JCQlPdXRwdXREaWZmQW5hbHl6b3IgYW5hbHlzb3IgPSBuZXcgT3V0cHV0RGlmZkFuYWx5em9yKG93bmVyLCBudWxsLCBvdXRwdXREb2N1bWVudCwKLQkJCQkJZ29sZGVuT3V0cHV0LCBuZXcgRmlsZShvdXRwdXRQYXRoKSk7Ci0JCQlhbmFseXNvci5jb21wYXJlKCk7Ci0JCQlpZiAoYW5hbHlzb3IuZ2V0RGlmZkNvdW50KCkgIT0gZGlmZkNvdW50IHx8Ci0JCQkJCWVsZW1lbnRDb3VudCAhPSAwICYmIGFuYWx5c29yLmdldEVsZW1Db21wYXJlZENvdW50KCkgIT0gZWxlbWVudENvdW50KSB7CQkJCQotCQkJCVN0cmluZyBtc2cgPSAiT3VwdHV0IGFuZCBnb2xkZW4gZmlsZSBjb21wYXJpc29uIGZhaWxzISAiOwotCQkJCW93bmVyLnRyYWNlKG1zZyk7Ci0JCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENDb21wYXJlVG9MaWJyYXJ5LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0xpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExZTM1ZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvbXBhcmVUb0xpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0NvbXBhcmVUb0xpYnJhcnkgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfR29sZGVuTGliRm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfR29sZGVuTGliRm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50LCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9EaWZmQ291bnQpKTsKLQkJc2V0QXR0cmlidXRlKEFUX0VsZW1lbnRDb3VudCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9Vc2VOYW1lQXNJZCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfVXNlTmFtZUFzSWQpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCVN0cmluZyBnb2xkZW5MaWJGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0dvbGRlbkxpYkZvbGRlck5hbWUpOwotCQlpbnQgZGlmZkNvdW50ID0gMDsKLQkJaW50IGVsZW1lbnRDb3VudCA9IDA7Ci0JCWJvb2xlYW4gdXNlTmFtZUFzSWQgPSBmYWxzZTsKLQkJCi0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfRGlmZkNvdW50KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCWRpZmZDb3VudCA9IEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQotCQlzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfRWxlbWVudENvdW50KTsKLQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApIHsKLQkJCWVsZW1lbnRDb3VudCA9IEludGVnZXIucGFyc2VJbnQoc3RyKTsKLQkJfQkJCi0JCXN0ciA9IGdldEF0dHJpYnV0ZShBVF9Vc2VOYW1lQXNJZCk7Ci0JCWlmIChzdHIgIT0gbnVsbCAmJiBzdHIubGVuZ3RoKCkgPiAwKSB7Ci0JCQl1c2VOYW1lQXNJZCA9IHN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7Ci0JCX0JCi0JCQotCQlUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCU1ldGhvZExpYnJhcnkgZ29sZGVuTGliICA9IG93bmVyLmxvYWROb25CYXNlTGliKGdvbGRlbkxpYkZvbGRlck5hbWUpOwotCQlNZXRob2RMaWJyYXJ5IGN1ckxpYiAgPSBvd25lci5nZXRDdXJyZW50QmFzZUxpYigpOwkKLQkJaWYgKHVzZU5hbWVBc0lkKSB7Ci0JCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5maXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGdvbGRlbkxpYiwgY3VyTGliKTsKLQkJfQotCQlib29sZWFuIHJlc3VsdCA9IG93bmVyLmNvbXBhcmVMaWJzKGdvbGRlbkxpYiwgY3VyTGliLCBkaWZmQ291bnQsIGVsZW1lbnRDb3VudCwgdXNlTmFtZUFzSWQpOwotCQlyZXR1cm4gbmV3IFRDRXhlUmVwbHlJbXBsKCIiLCByZXN1bHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29weUxpYnJhcnkuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDQ29weUxpYnJhcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkYTFjZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0NvcHlMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENDb3B5TGlicmFyeSBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJc2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUpKTsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIHJlbExpYk5hbWVQYXRoID0gZ2V0QXR0cmlidXRlKEFUX0xpYkZvbGRlck5hbWUpOwotCQlpbnQgaXggPSByZWxMaWJOYW1lUGF0aC5sYXN0SW5kZXhPZigiLyIpOwkJCi0JCVN0cmluZyBsaWJGb2xkZXJOYW1lID0gaXggPCAwID8gcmVsTGliTmFtZVBhdGggOiByZWxMaWJOYW1lUGF0aC5zdWJzdHJpbmcoaXggKyAxKTsKLQkJU3RyaW5nIGxpYlBhdGggPSBnZXRPd25lcigpLmdldEN1cnJUZXN0RGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGxpYkZvbGRlck5hbWU7CQotCQlnZXRPd25lcigpLmNvcHlGcm9tVGVzdExpYnMobGliUGF0aCwgcmVsTGliTmFtZVBhdGgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMzg5MjQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFZGl0TWV0aG9kRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3Rlck91dHB1dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRWRpdE1ldGhvZEVsZW1lbnQgZXh0ZW5kcyBUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSB7CQkJCQkKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlyZXR1cm4gc3VwZXIuZXhlY3V0ZSgpOwotCX0KLQotCQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnRCYXNlLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0VkaXRNZXRob2RFbGVtZW50QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODg2Y2NlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRWRpdE1ldGhvZEVsZW1lbnRCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVmFyaWFiaWxpdHlUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCQotCQotCXN0YXRpYyBjbGFzcyBUYWdEYXRhIHsKLQkJcHVibGljIE1hcCBhdHRNYXAgPSBuZXcgTGlua2VkSGFzaE1hcCgpOwotCQlwdWJsaWMgTWFwIHJlZk1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0JfQotCQotCXByaXZhdGUgRUNsYXNzIGVjbGFzczsKLQlwcml2YXRlIFRhZ0RhdGEgdGFnRGF0YTsKLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudDsKLQlwcml2YXRlIE1hcCByZWZWYWx1ZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVjbGFzc0RhdGFNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgTGlzdCBjaGlsZENvbW1hbmRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgYm9vbGVhbiBpc0NoaWxkQ29tbWFuZCA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBUZXN0Q29tbWFuZCBuZXdDaGlsZENvbW1hbmQoQ2xhc3MgdHlwZSkgewotCQl0cnkgewotCQkJVENFZGl0TWV0aG9kRWxlbWVudEJhc2UgY29tbWFuZCA9IChUQ0VkaXRNZXRob2RFbGVtZW50QmFzZSkgdHlwZS5uZXdJbnN0YW5jZSgpOwotCQkJY29tbWFuZC5zZXRPd25lcihnZXRPd25lcigpKTsKLQkJCWNvbW1hbmQuc2V0SXNDaGlsZENvbW1hbmQodHJ1ZSk7Ci0JCQlpZiAobG9jYWxEZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IG5ld0NoaWxkQ29tbWFuZDogIiArIHR5cGUpOwotCQkJfQotCQkJcmV0dXJuIGNvbW1hbmQ7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJaW5pdChlbGVtZW50KTsKLQkJcGFyc2VBdHRyaWJ1dGVzKCk7CQkKLQkJcGFyc2VWYWx1ZUNoaWxkcmVuKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX1R5cGUpOwotCQllY2xhc3MgPSBtZXRob2RFbGVtZW50ID09IG51bGwgPyBnZXRFQ2xhc3ModHlwZSkgOiBtZXRob2RFbGVtZW50LmVDbGFzcygpOwotCQlpZiAoZWNsYXNzID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0YWdEYXRhID0gKFRhZ0RhdGEpIGVjbGFzc0RhdGFNYXAuZ2V0KGVjbGFzcyk7Ci0JCWlmICh0YWdEYXRhICE9IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQkJCi0JCXRhZ0RhdGEgPSBuZXcgVGFnRGF0YSgpOwotCQllY2xhc3NEYXRhTWFwLnB1dChlY2xhc3MsIHRhZ0RhdGEpOwotCQkKLQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVjbGFzczogIiArIGVjbGFzcy5nZXROYW1lKCkpOwotCQkJVGVzdGVyT3V0cHV0VXRpbC5zaG93KCJlY2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKSIsIGVjbGFzcy5nZXRFQWxsQXR0cmlidXRlcygpKTsKLQkJCVRlc3Rlck91dHB1dFV0aWwuc2hvdygiZWNsYXNzLmdldEVBbGxSZWZlcmVuY2VzKCkiLCBlY2xhc3MuZ2V0RUFsbFJlZmVyZW5jZXMoKSk7Ci0JCX0KLQkJCi0JCWFkZFRvRWNsYXNzRGF0YU1hcChlY2xhc3MuZ2V0RUFsbEF0dHJpYnV0ZXMoKSwgdGFnRGF0YS5hdHRNYXApOwotCQlhZGRUb0VjbGFzc0RhdGFNYXAoZWNsYXNzLmdldEVBbGxSZWZlcmVuY2VzKCksIHRhZ0RhdGEucmVmTWFwKTsKLQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRUb0VjbGFzc0RhdGFNYXAoTGlzdCBmZWF0dXJlcywgTWFwIGZlYU1hcCkgewotCQlib29sZWFuIHZlcmJvc2UgPSBnZXRWZXJib3NlKCk7Ci0JCWJvb2xlYW4gaXNSZWYgPSBmYWxzZTsKLQkJaWYgKHZlcmJvc2UpIHsKLQkJCWlmIChmZWFNYXAgPT0gdGFnRGF0YS5hdHRNYXApIHsKLQkJCQlsb2coIlxuQXR0cmlidXRlIGZlYXR1ZXMgZm9yICIgKyAiXCIiICsgZWNsYXNzLmdldE5hbWUoKSArICJcIjogIik7Ci0JCQl9IGVsc2UgaWYgKGZlYU1hcCA9PSB0YWdEYXRhLnJlZk1hcCkgewotCQkJCWxvZygiXG5SZWZlcmVuY2UgZmVhdHVlcyBmb3IgIiArICJcIiIgKyBlY2xhc3MuZ2V0TmFtZSgpICsgIlwiOiAiKTsKLQkJCQlpc1JlZiA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsJCQkKLQkJCWZlYU1hcC5wdXQoZmVhdHVyZS5nZXROYW1lKCksIGZlYXR1cmUpOwotCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQlTdHJpbmcgbGluZSA9ICIiOwotCQkJCWlmIChpc1JlZikgewotCQkJCQlsaW5lICs9ICgoRVJlZmVyZW5jZSkgZmVhdHVyZSkuaXNDb250YWlubWVudCgpID8KLQkJCQkJCQkiY29udGFpbmVkLCAiIDogInJlZmVycmVkICwgIjsKLQkJCQkJbGluZSArPSAoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmlzTWFueSgpID8KLQkJCQkJCQkibWFueSAgIC0+ICIgOiAic2luZ2xlIC0+ICI7Ci0JCQkJfQotCQkJCWxpbmUgKz0gZmVhdHVyZS5nZXROYW1lKCkgKyAiOiAiOwotCQkJCWxpbmUgKz0gaXNSZWYgPyAoKEVSZWZlcmVuY2UpIGZlYXR1cmUpLmdldEVSZWZlcmVuY2VUeXBlKCkuZ2V0SW5zdGFuY2VDbGFzc05hbWUoKQotCQkJCQkJCTogKChFQXR0cmlidXRlKSBmZWF0dXJlKS5nZXRFQXR0cmlidXRlVHlwZSgpLmdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQkJbG9nKGxpbmUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlQXR0cmlidXRlcygpIHsKLQkJc2V0QXR0cmlidXRlKEFUX1R5cGUsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoQVRfVHlwZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUGF0aCwgZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShBVF9QYXRoKSk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdGFnRGF0YS5hdHRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgYXRfdGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlzZXRBdHRyaWJ1dGUoYXRfdGFnLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKGF0X3RhZykpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlVmFsdWVDaGlsZHJlbigpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRhZ0RhdGEucmVmTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGNoaWxkVGFnID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlzZXRBdHRyaWJ1dGUoY2hpbGRUYWcsIGdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoY2hpbGRUYWcpKTsKLQkJCXBhcnNlQ2hpbGRUYWdBc1ZhbHVlKGNoaWxkVGFnKTsJCQkJCQkJCQkKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUNoaWxkVGFnQXNWYWx1ZShTdHJpbmcgY2hpbGRUYWcpIHsKLQkJTm9kZUxpc3QgY25vZGVzID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnKTsKLQkJaWYgKGNub2RlcyA9PSBudWxsIHx8IGNub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRWxlbWVudCBjRWxlbWVudCA9IChFbGVtZW50KSBjbm9kZXMuaXRlbSgwKTsKLQkJY25vZGVzID0gY0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVlRfVmFsdWUpOwkKLQkJaWYgKGNub2RlcyA9PSBudWxsIHx8IGNub2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTGlzdCB2YWx1ZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjbm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJRWxlbWVudCB2RWxlbSA9IChFbGVtZW50KSBjbm9kZXMuaXRlbShpKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHZFbGVtLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsKLQkJCXZhbHVlTGlzdC5hZGQodmFsdWUpOwotCQl9Ci0JCXJlZlZhbHVlTWFwLnB1dChjaGlsZFRhZywgdmFsdWVMaXN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZEVsZW1lbnQoTWV0aG9kRWxlbWVudCBlKSB7Ci0JCW1ldGhvZEVsZW1lbnQgPSBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWV0aG9kRWxlbWVudCBnZXRNZXRob2RFbGVtZW50KCkgewotCQlyZXR1cm4gbWV0aG9kRWxlbWVudDsKLQl9CQotCQotCXByb3RlY3RlZCBUYWdEYXRhIGdldFRhZ0RhdGEoKSB7Ci0JCXJldHVybiB0YWdEYXRhOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcGFyc2VDaGlsZFRhZ0FzQ29tbWFuZChFbGVtZW50IGNFbGVtZW50LCBTdHJpbmcgY2hpbGRUYWcpIHsKLQkJRVJlZmVyZW5jZSBmZWF0dXJlID0gKEVSZWZlcmVuY2UpIHRhZ0RhdGEucmVmTWFwLmdldChjaGlsZFRhZyk7Ci0JCWlmICghIGZlYXR1cmUuaXNDb250YWlubWVudCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJVENFZGl0TWV0aG9kRWxlbWVudEJhc2UgY2hpbGRDb21tYW5kID0gKFRDRWRpdE1ldGhvZEVsZW1lbnRCYXNlKSBuZXdDaGlsZENvbW1hbmQoVENFZGl0TWV0aG9kRWxlbWVudC5jbGFzcyk7Ci0JCU9iamVjdCBmZWF0dXJlT2JqID0gbWV0aG9kRWxlbWVudC5lR2V0KGZlYXR1cmUpOwotCQlpZiAoZmVhdHVyZS5pc01hbnkoKSkgewotCQkJTGlzdCBvd25lckxpc3QgPSAoTGlzdCkgZmVhdHVyZU9iajsKLQkJCWZlYXR1cmVPYmogPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZmVhdHVyZS5nZXRFUmVmZXJlbmNlVHlwZSgpKTsKLQkJCW93bmVyTGlzdC5hZGQoZmVhdHVyZU9iaik7Ci0JCX0gCi0JCWNoaWxkQ29tbWFuZC5zZXRNZXRob2RFbGVtZW50KChNZXRob2RFbGVtZW50KSBmZWF0dXJlT2JqKTsKLQkJaWYgKGdldFZlcmJvc2UoKSkgewotCQkJY0VsZW1lbnQuc2V0QXR0cmlidXRlKEFUX1ZlcmJvc2UsICJ0cnVlIik7Ci0JCX0KLQkJY2hpbGRDb21tYW5kLnBhcnNlKGNFbGVtZW50KTsKLQkJYWRkVG9DaGlsZENvbW1hbmRzKGNoaWxkQ29tbWFuZCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFyc2VDb21tYW5kQ2hpbGRyZW4oKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSB0YWdEYXRhLnJlZk1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBjaGlsZFRhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJTm9kZUxpc3QgY25vZGVzID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRzQnlUYWdOYW1lKGNoaWxkVGFnKTsKLQkJCWlmIChjbm9kZXMgPT0gbnVsbCB8fCBjbm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZm9yIChpbnQgaT0wOyBpPGNub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBjRWxlbWVudCA9IChFbGVtZW50KSBjbm9kZXMuaXRlbShpKTsKLQkJCQlwYXJzZUNoaWxkVGFnQXNDb21tYW5kKGNFbGVtZW50LCBjaGlsZFRhZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBUQ0V4ZVJlcGx5IGV4ZWN1dGVDaGlsZENvbW1hbmRzKCkgewotCQlmb3IgKGludCBpPTA7IGk8Y2hpbGRDb21tYW5kcy5zaXplKCk7IGkrKykgewotCQkJVGVzdENvbW1hbmQgY29tbWFuZCA9IChUZXN0Q29tbWFuZCkgY2hpbGRDb21tYW5kcy5nZXQoaSk7Ci0JCQlUQ0V4ZVJlcGx5IHJlc3VsdCA9IGNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQucGFzc2luZygpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsJCQotCQlNZXRob2RMaWJyYXJ5IGN1cnJMaWIgPSBnZXRPd25lcigpLmdldEN1cnJlbnRCYXNlTGliKCk7CQkKLQkJU3RyaW5nIHBhdGggPSBnZXRBdHRyaWJ1dGUoQVRfUGF0aCk7Ci0JCWlmIChtZXRob2RFbGVtZW50ID09IG51bGwpIHsKLQkJCWlmIChVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZWNsYXNzKSBpbnN0YW5jZW9mIFByb2Nlc3NFbGVtZW50KSB7Ci0JCQkJbWV0aG9kRWxlbWVudCA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0UHJvY2Vzc0VsZW1lbnQoY3VyckxpYiwgcGF0aCk7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZEVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcGF0aCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1ldGhvZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcGFyc2VDb21tYW5kQ2hpbGRyZW4oKTsKLQkJCi0JCWVTZXRCeUF0dHJpYnV0ZXMoKTsKLQkJZVNldEJ5VmFsdWVDaGlsZHJlbigpOwotCQkKLQkJZXhlY3V0ZUNoaWxkQ29tbWFuZHMoKTsKLQkJCi0JCWlmICghIGdldElzQ2hpbGRDb21tYW5kKCkpIHsKLQkJCXNhdmUobWV0aG9kRWxlbWVudCk7Ci0JCQkvL3NhdmUoKE1ldGhvZEVsZW1lbnQpIG1ldGhvZEVsZW1lbnQuZUNvbnRhaW5lcigpKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBlU2V0QnlBdHRyaWJ1dGVzKCkgewotCQlNYXAgYXR0TWFwID0gZ2V0VGFnRGF0YSgpLmF0dE1hcDsKLQkJTWFwIGF0dHJpYnV0ZU1hcCA9IGdldEF0dHJpYnV0ZU1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYXR0TWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIGF0X3RhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJRUF0dHJpYnV0ZSBlYXR0ID0gKEVBdHRyaWJ1dGUpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFRGF0YVR5cGUgZGF0YVR5cGUgPSBlYXR0LmdldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQlTdHJpbmcgYXRfdmFsID0gKFN0cmluZykgYXR0cmlidXRlTWFwLmdldChhdF90YWcpOwotCQkJaWYgKGxvY2FsRGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxEPiBhdF90YWc6ICIgKyBhdF90YWcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGF0X3ZhbDogIiArIGF0X3ZhbCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZWF0dDogIiArIGVhdHQpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGRhdGFUeXBlOiAiICsgZGF0YVR5cGUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQl9CQkJCi0JCQlpZiAoYXRfdmFsID09IG51bGwgfHwgYXRfdmFsLmxlbmd0aCgpID09IDApIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCBuZXdWYWx1ZSA9IGdldEVTZXRWYWx1ZShkYXRhVHlwZSwgYXRfdmFsKTsKLQkJCQotCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKLQkJCQltZXRob2RFbGVtZW50LmVTZXQoZWF0dCwgbmV3VmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2coIlxuV2FybmluZzogbm90IGhhbmRsZWQgZGF0YVR5cGU6ICIgKyBkYXRhVHlwZS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpKTsKLQkJCX0KLQkJfQotCQlFQXR0cmlidXRlIGRhdGVBdHQgPSAoRUF0dHJpYnV0ZSkgYXR0TWFwLmdldCgiY2hhbmdlRGF0ZSIpOwotCQlpZiAoZGF0ZUF0dCAhPSBudWxsKSB7Ci0JCQltZXRob2RFbGVtZW50LmVTZXQoZGF0ZUF0dCwgbmV3IERhdGUoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RVNldFZhbHVlKEVEYXRhVHlwZSBkYXRhVHlwZSwgU3RyaW5nIHN0clZhbCkgewotCQlDbGFzcyBjbHMgPSBkYXRhVHlwZS5nZXRJbnN0YW5jZUNsYXNzKCk7CQkKLQkJaWYgKGNscy5lcXVhbHMoU3RyaW5nLmNsYXNzKSkgewotCQkJcmV0dXJuIHN0clZhbDsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhCb29sZWFuLmNsYXNzKSkgewotCQkJYm9vbGVhbiBiID0gc3RyVmFsLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsKLQkJCWlmICghYiAmJiAhc3RyVmFsLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgQm9vbGVhbihiKTsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhEYXRlLmNsYXNzKSkgewotCQkJU2ltcGxlRGF0ZUZvcm1hdCBzZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOwotCQkJRGF0ZSBkYXRlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZGF0ZSA9IHNkZi5wYXJzZShzdHJWYWwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZGF0ZTsKLQkJfQotCQlpZiAoY2xzLmVxdWFscyhWYXJpYWJpbGl0eVR5cGUuY2xhc3MpKSB7Ci0JCQlpZiAoc3RyVmFsLmVxdWFscygiY29udHJpYnV0ZXMiKSkgewotCQkJCXJldHVybiBWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVM7Ci0JCQl9Ci0JCQlpZiAoc3RyVmFsLmVxdWFscygiZXh0ZW5kcyIpKSB7Ci0JCQkJcmV0dXJuIFZhcmlhYmlsaXR5VHlwZS5FWFRFTkRTOwotCQkJfQotCQkJaWYgKHN0clZhbC5lcXVhbHMoInJlcGxhY2VzIikpIHsKLQkJCQlyZXR1cm4gVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZVNldEJ5VmFsdWVDaGlsZHJlbigpIHsKLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwkKLQkJTWFwIHJlZk1hcCA9IGdldFRhZ0RhdGEoKS5yZWZNYXA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZWZNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVmX3RhZyA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotCQkJRVJlZmVyZW5jZSBlcmVmID0gKEVSZWZlcmVuY2UpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlFQ2xhc3NpZmllciBlVHlwZSA9IGVyZWYuZ2V0RVR5cGUoKTsKLQkJCUxpc3QgdmFsdWVMaXN0ID0gKExpc3QpIHJlZlZhbHVlTWFwLmdldChyZWZfdGFnKTsKLQkJCWlmIChsb2NhbERlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gcmVmX3RhZzogIiArIHJlZl90YWcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IHZhbHVlTGlzdDogIiArIHZhbHVlTGlzdCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMRD4gZXJlZjogIiArIGVyZWYpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTEQ+IGVUeXBlOiAiICsgZVR5cGUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQl9Ci0JCQkKLQkJCWludCBzeiA9IHZhbHVlTGlzdCA9PSBudWxsID8gMCA6IHZhbHVlTGlzdC5zaXplKCk7Ci0JCQlpZiAoc3ogPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGVyZWYuaXNNYW55KCkpIHsKLQkJCQlMaXN0IG93bmVyTGlzdCA9IChMaXN0KSBtZXRob2RFbGVtZW50LmVHZXQoZXJlZik7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQkJU3RyaW5nIHJlZlBhdGggPSAoU3RyaW5nKSB2YWx1ZUxpc3QuZ2V0KGkpOwotCQkJCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcmVmUGF0aCk7Ci0JCQkJCWlmIChyZWZFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCW93bmVyTGlzdC5hZGQocmVmRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHN6ID09IDEpewotCQkJCVN0cmluZyByZWZQYXRoID0gKFN0cmluZykgdmFsdWVMaXN0LmdldCgwKTsKLQkJCQlNZXRob2RFbGVtZW50IHJlZkVsZW1lbnQgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZEVsZW1lbnQoY3VyckxpYiwgcmVmUGF0aCk7Ci0JCQkJaWYgKGVyZWYuZ2V0TmFtZSgpLmVxdWFscygidmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudCIpIAotCQkJCQkJJiYgcmVmRWxlbWVudCBpbnN0YW5jZW9mIFByb2Nlc3NDb21wb25lbnQpIHsKLQkJCQkJcmVmRWxlbWVudCA9ICgoUHJvY2Vzc0NvbXBvbmVudClyZWZFbGVtZW50KS5nZXRQcm9jZXNzKCk7Ci0JCQkJfQotCQkJCW1ldGhvZEVsZW1lbnQuZVNldChlcmVmLCByZWZFbGVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SXNDaGlsZENvbW1hbmQoYm9vbGVhbiBiKSB7Ci0JCWlzQ2hpbGRDb21tYW5kID0gYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0SXNDaGlsZENvbW1hbmQoKSB7Ci0JCXJldHVybiBpc0NoaWxkQ29tbWFuZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9DaGlsZENvbW1hbmRzKFRlc3RDb21tYW5kIGNvbW1hbmQpIHsKLQkJY2hpbGRDb21tYW5kcy5hZGQoY29tbWFuZCk7Ci0JfQotfQotCi0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlJbXBsLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4ZVJlcGx5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTdkNjJlLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci0KLS8qKgotICogSW1wbGVtZW50aW5nIFRDRXhlUmVwbHkKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRXhlUmVwbHlJbXBsIGltcGxlbWVudHMgVENFeGVSZXBseSB7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHBhc3NpbmcgPSB0cnVlOwotCXByaXZhdGUgTGlzdCBtc2dzOwotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5SW1wbChTdHJpbmcgbXNnLCBib29sZWFuIHBhc3NpbmcpIHsKLQkJYWRkTXNnKG1zZyk7Ci0JCXNldFBhc3NpbmcocGFzc2luZyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdE1zZygpIHsKLQkJaW50IHN6ID0gbXNncyA9PSBudWxsID8gMCA6IG1zZ3Muc2l6ZSgpOwkJCQotCQlyZXR1cm4gc3ogPT0gMCA/IG51bGwgOiAoU3RyaW5nKSBtc2dzLmdldChzeiAtIDEpOwotCX0KLQkKLQlwdWJsaWMgTGlzdCBnZXRNc2dzKCkgewotCQlyZXR1cm4gbXNnczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGFzc2luZygpIHsKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1zZyhTdHJpbmcgbXNnKSB7Ci0JCWlmIChtc2cgPT0gbnVsbCB8fCBtc2cubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtc2dzID09IG51bGwpIHsKLQkJCW1zZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJbXNncy5hZGQobXNnKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UGFzc2luZyhib29sZWFuIGIpIHsKLQkJcGFzc2luZyA9IGI7Ci0JfQotfQotCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4ZVJlcGx5TGlzdEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMwNmMwLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhlUmVwbHlMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5TGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRpbmcgQ0V4ZVJlcGx5TGlzdAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBUQ0V4ZVJlcGx5TGlzdEltcGwgaW1wbGVtZW50cyBUQ0V4ZVJlcGx5TGlzdCB7Ci0JTGlzdCByZXBseUxpc3QgPSBudWxsOwotCVN0cmluZyAJc3VtbWFyeVJlcGx5OwotCQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHJlcGx5TGlzdCA9PSBudWxsID8gMCA6IHJlcGx5TGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIFRDRXhlUmVwbHkgaXRlbShpbnQgaSkgewotCQlyZXR1cm4gKFRDRXhlUmVwbHkpIHJlcGx5TGlzdC5nZXQoaSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHBhc3NpbmcoKSB7CQotCQlmb3IgKGludCBpPTA7IGk8c2l6ZSgpOyBpKyspIHsKLQkJCWlmICghIGl0ZW0oaSkucGFzc2luZygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChUQ0V4ZVJlcGx5IHJlcGx5KSB7Ci0JCWlmIChyZXBseUxpc3QgPT0gbnVsbCkgewotCQkJcmVwbHlMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJlcGx5TGlzdC5hZGQocmVwbHkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdW1tYXJ5UmVwbHkoU3RyaW5nIHN0cikgewotCQlzdW1tYXJ5UmVwbHkgPSBzdHI7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeVJlcGx5KCkgewotCQlyZXR1cm4gc3VtbWFyeVJlcGx5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjY2NkOC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5Db25maWd1cmF0aW9uRXhwb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENFeHBvcnRDb25maWd1cmF0aW9uIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfU2VsZWN0ZWRDb25maWdOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9TZWxlY3RlZENvbmZpZ05hbWUpKTsKLQl9CQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCVRlc3RDb21tYW5kTWdyIG93bmVyID0gZ2V0T3duZXIoKTsKLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gb3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJaWYgKGN1cnJMaWIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZyBleHBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0V4cG9ydEZvbGRlck5hbWUpOwkJCi0JCVN0cmluZyBzZWxlY3RlZENvbmZpZ05hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfU2VsZWN0ZWRDb25maWdOYW1lKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gKE1ldGhvZENvbmZpZ3VyYXRpb24pIExpYnJhcnlUZXN0U2VydmljZS5nZXRFbGVtZW50Ci0JCQkJCQkoY3VyckxpYi5nZXRQcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKSwgc2VsZWN0ZWRDb25maWdOYW1lKTsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJRmlsZSBleHBvcnRGb2xkZXIgPSBvd25lci5yZWdpc3RlckV4cG9ydERlc3RpbmF0aW9uKGV4cG9ydEZvbGRlck5hbWUsIGZhbHNlKTsJCQkJCi0JCWZpbmFsIENvbmZpZ3VyYXRpb25FeHBvcnREYXRhIGRhdGEgPSBuZXcgQ29uZmlndXJhdGlvbkV4cG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShjdXJyTGliLmdldE5hbWUoKSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihleHBvcnRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlkYXRhLmV4cG9ydE9uZUNvbmZpZyA9IHRydWU7Ci0JCWRhdGEuZXhwb3J0Q29uZmlnU3BlY3MgPSBmYWxzZTsKLQkJZGF0YS5zZWxlY3RlZENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRhdGEuc2VsZWN0ZWRDb25maWdzLmFkZChjb25maWcpOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCShuZXcgQ29uZmlndXJhdGlvbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0V4cG9ydFBsdWdpbnMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0UGx1Z2lucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI2NmVjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0UGx1Z2lucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZXhwb3J0LnNlcnZpY2VzLlBsdWdpbkV4cG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC5zZXJ2aWNlcy5QbHVnaW5FeHBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0V4cG9ydFBsdWdpbnMgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJTGlzdCBzZWxlY3RlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KGdldE93bmVyKCkuZ2V0Q3VycmVudEJhc2VMaWIoKS5nZXRNZXRob2RQbHVnaW5zKCkpOwkKLQkJCi0JCWludCBzeiA9IHNlbGVjdGVkUGx1Z2lucyA9PSBudWxsID8gMCA6IHNlbGVjdGVkUGx1Z2lucy5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsgCi0JCX0KLQkJCi0JCVN0cmluZyBleHBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0V4cG9ydEZvbGRlck5hbWUpOwotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgc2VsZWN0ZWRQbHVnaW5zLmdldCgwKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocGx1Z2luLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBleHBvcnRGb2xkZXIgPSBnZXRPd25lcigpLnJlZ2lzdGVyRXhwb3J0RGVzdGluYXRpb24oZXhwb3J0Rm9sZGVyTmFtZSwgZmFsc2UpOwotCQkKLQkJZmluYWwgUGx1Z2luRXhwb3J0RGF0YSBkYXRhID0gbmV3IFBsdWdpbkV4cG9ydERhdGEoKTsKLQkJZGF0YS5sbERhdGEuc2V0TGliTmFtZShmaWxlLmdldE5hbWUoKSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihleHBvcnRGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlkYXRhLnNldFNlbGVjdGVkUGx1Z2lucyhzZWxlY3RlZFBsdWdpbnMpOwotCQlkYXRhLmJ1aWxkQXNzb2NpYXRlZENvbmZpZ01hcCgpOwotCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkobmV3IFBsdWdpbkV4cG9ydFNlcnZpY2UoZGF0YSkpLnJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRYbWwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDRXhwb3J0WG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YTdkZWQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENFeHBvcnRYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5leHBvcnQueG1sLnNlcnZpY2VzLkV4cG9ydFhNTERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmV4cG9ydC54bWwuc2VydmljZXMuRXhwb3J0WE1MU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDRXhwb3J0WG1sIGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfRXhwb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQlTdHJpbmcgZXhwb3J0Rm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9FeHBvcnRGb2xkZXJOYW1lKTsKLQkJCi0JCU1ldGhvZExpYnJhcnkgbGliID0gb3duZXIuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobGliLmVSZXNvdXJjZSgpLmdldFVSSSgpLnRvRmlsZVN0cmluZygpKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLQkJRmlsZSBleHBvcnRGaWxlID0gb3duZXIucmVnaXN0ZXJFeHBvcnREZXN0aW5hdGlvbihleHBvcnRGb2xkZXJOYW1lLCB0cnVlKTsJCQotCQkKLQkJZmluYWwgRXhwb3J0WE1MRGF0YSBkYXRhID0gbmV3IEV4cG9ydFhNTERhdGEoKTsKLQkJZGF0YS5zZXRFeHBvcnRUeXBlKEV4cG9ydFhNTERhdGEuRVhQT1JUX01FVEhPRF9MSUJSQVJZKTsKLQkJZGF0YS5zZXRYTUxGaWxlKGV4cG9ydEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCShuZXcgRXhwb3J0WE1MU2VydmljZShkYXRhKSkuZG9FeHBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNmUxMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuQ29uZmlndXJhdGlvbkltcG9ydERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5Db25maWd1cmF0aW9uSW1wb3J0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkVsZW1lbnREaWZmVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnV0aWwuVG5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5zZXJ2aWNlcy5TYWZlVXBkYXRlQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDSW1wb3J0Q29uZmlndXJhdGlvbiBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJZmluYWwgVGVzdENvbW1hbmRNZ3Igb3duZXIgPSBnZXRPd25lcigpOwotCQlTdHJpbmcgaW1wb3J0Rm9sZGVyTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9JbXBvcnRGb2xkZXJOYW1lKTsKLQkJCi0JCUZpbGUgZmlsZSA9IG93bmVyLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlDb25maWd1cmF0aW9uSW1wb3J0RGF0YSBkYXRhID0gbmV3IENvbmZpZ3VyYXRpb25JbXBvcnREYXRhKCk7Ci0JCWRhdGEubGxEYXRhLnNldExpYk5hbWUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCi0KLQkJZmluYWwgQ29uZmlndXJhdGlvbkltcG9ydFNlcnZpY2UgaW1wb3J0U2VydmljZSA9IG5ldyBDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZShkYXRhKTsKLQkJaW1wb3J0U2VydmljZS5hbmFseXplKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCU9iamVjdFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoaW1wb3J0U2VydmljZS5nZXREaWZmVHJlZSgpKTsKLQkJZGF0YS5pbXBvcnRMaXN0LmNsZWFyKCk7Ci0JCWZvciAoIGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrICkgewotCQkJZGF0YS5pbXBvcnRMaXN0LmFkZChlbGVtZW50c1tpXSk7Ci0JCX0KLQkJCi0JCVNhZmVVcGRhdGVDb250cm9sbGVyLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlpbXBvcnRTZXJ2aWNlLnBlcmZvcm1JbXBvcnQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCU1ldGhvZExpYnJhcnkgbGliICA9IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJCQkJb3duZXIuc2V0Q3VycmVudEJhc2VMaWIobGliKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNlbGVjdGFibGUoRWxlbWVudERpZmZUcmVlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG5vZGUuaXNPbGRPbmx5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlNZXRob2RFbGVtZW50IGJhc2UgPSBub2RlLmdldEJhc2VFbGVtZW50KCk7Ci0JCWlmICggKGJhc2UgaW5zdGFuY2VvZiBNZXRob2RQYWNrYWdlKSAKLQkJCQkmJiBUbmdVdGlsLmlzUm9vdEN1dG9tQ2F0ZWdvcnlQYWNrYWdlKChNZXRob2RQYWNrYWdlKWJhc2UpICkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2VsZWN0Tm9kZXMoRWxlbWVudERpZmZUcmVlIG5vZGUsIEFycmF5TGlzdCBzZWxlY3RlZE5vZGVzKSB7Ci0JCWlmICghIHNlbGVjdGFibGUobm9kZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzZWxlY3RlZE5vZGVzLmFkZChub2RlKTsKLQkJTGlzdCBjbm9kZXMgPSBub2RlLmdldENoaWxkcmVuKCk7Ci0JCWludCBzeiA9IGNub2RlcyA9PSBudWxsID8gMCA6IGNub2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzejsgaSsrKSB7Ci0JCQlFbGVtZW50RGlmZlRyZWUgY25vZGUgPSAoRWxlbWVudERpZmZUcmVlKSBjbm9kZXMuZ2V0KGkpOwotCQkJc2VsZWN0Tm9kZXMoY25vZGUsIHNlbGVjdGVkTm9kZXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RWxlbWVudHMoRWxlbWVudERpZmZUcmVlIHJvb3QpIHsKLQkJQXJyYXlMaXN0IHNlbGVjdGVkTm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNlbGVjdE5vZGVzKHJvb3QsIHNlbGVjdGVkTm9kZXMpOwotCQlyZXR1cm4gc2VsZWN0ZWROb2Rlcy50b0FycmF5KCk7Ci0JfQotCQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENJbXBvcnRQbHVnaW5zLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFBsdWdpbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE3Yjg1ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFBsdWdpbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5pbXBvcnRpbmcuc2VydmljZXMuUGx1Z2luSW1wb3J0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLlBsdWdpbkltcG9ydGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmltcG9ydGluZy5zZXJ2aWNlcy5QbHVnaW5JbXBvcnREYXRhLlBsdWdpbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuc2VydmljZXMuU2FmZVVwZGF0ZUNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ0ltcG9ydFBsdWdpbnMgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGltcG9ydEZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCQotCQlGaWxlIGZpbGUgPSBnZXRPd25lcigpLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwoIkNhbiBub3QgbG9jYXRlIGltcG9ydEZvbGRlck5hbWU6ICIgKyBpbXBvcnRGb2xkZXJOYW1lLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCVBsdWdpbkltcG9ydERhdGEgZGF0YSA9IG5ldyBQbHVnaW5JbXBvcnREYXRhKCk7Ci0JCWRhdGEubGxEYXRhLnNldExpYk5hbWUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWRhdGEubGxEYXRhLnNldFBhcmVudEZvbGRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCQotCQlmaW5hbCBQbHVnaW5JbXBvcnRpbmdTZXJ2aWNlIGltcG9ydFNlcnZpY2UgPSBuZXcgUGx1Z2luSW1wb3J0aW5nU2VydmljZShkYXRhKTsKLQkJaW1wb3J0U2VydmljZS52YWxpZGF0ZShudWxsKTsKLQkJTGlzdCBpbXBvcnRQbHVnaW5zID0gZGF0YS5nZXRQbHVnaW5zKCk7Ci0JCWZvciAoaW50IGk9MDsgaSA8IGltcG9ydFBsdWdpbnMuc2l6ZSgpOyBpKyspIHsKLQkJCVBsdWdpbkluZm8gaW5mbyA9IChQbHVnaW5JbmZvKSBpbXBvcnRQbHVnaW5zLmdldChpKTsKLQkJCWluZm8uc2VsZWN0ZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlTYWZlVXBkYXRlQ29udHJvbGxlci5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW1wb3J0U2VydmljZS5wZXJmb3JtSW1wb3J0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiAgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCWdldE93bmVyKCkuc2V0Q3VycmVudEJhc2VMaWIobGliKTsKLQkJCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0WG1sLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ0ltcG9ydFhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTI1MjIxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDSW1wb3J0WG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnhtbC5zZXJ2aWNlcy5JbXBvcnRYTUxTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnNlcnZpY2VzLlNhZmVVcGRhdGVDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZE1ncjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotLyoqCi0gKiBBIHRlc3QgY29tbWFuZCBjbGFzcwotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVENJbXBvcnRYbWwgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSW1wb3J0Rm9sZGVyTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTWVyZ2UsIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX01lcmdlKSk7Ci0JfQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewotCQlmaW5hbCBUZXN0Q29tbWFuZE1nciBvd25lciA9IGdldE93bmVyKCk7Ci0JCVN0cmluZyBpbXBvcnRGb2xkZXJOYW1lID0gZ2V0QXR0cmlidXRlKEFUX0ltcG9ydEZvbGRlck5hbWUpOwotCQlib29sZWFuIG1lcmdlID0gZmFsc2U7Ci0JCVN0cmluZyBzdHIgPSBnZXRBdHRyaWJ1dGUoQVRfTWVyZ2UpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSkgewotCQkJbWVyZ2UgPSBmYWxzZTsKLQkJfQotCQkKLQkJRmlsZSBmaWxlMCA9IG93bmVyLmdldEltcG9ydEZpbGUoaW1wb3J0Rm9sZGVyTmFtZSk7Ci0JCWlmIChmaWxlMC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IGZpbGUwLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlMC5nZXROYW1lKCkgKyAiLnhtbCI7Ci0JCQlmaWxlMCA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCQotCQlmaW5hbCBGaWxlIGZpbGUgPSBmaWxlMDsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhIGZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQkJCi0JCWZpbmFsIGJvb2xlYW4gb3ZlcndyaXRlID0gISBtZXJnZTsKLQkJU2FmZVVwZGF0ZUNvbnRyb2xsZXIuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCUltcG9ydFhNTFNlcnZpY2UgaW1wb3J0U2VydmljZSA9IG5ldyBJbXBvcnRYTUxTZXJ2aWNlKCk7Ci0JCQkJCWltcG9ydFNlcnZpY2Uuc2V0T3ZlcndyaXRlKG92ZXJ3cml0ZSk7Ci0JCQkJCWltcG9ydFNlcnZpY2UubG9hZFhtbChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJCQkJCQotCQkJCQlpbXBvcnRTZXJ2aWNlLmRvSW1wb3J0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlNZXRob2RMaWJyYXJ5IGxpYiAgPSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCQkJCW93bmVyLnNldEN1cnJlbnRCYXNlTGliKGxpYik7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RDb25maWd1cmF0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5ZjMzNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aS5QZXJzcGVjdGl2ZUxpc3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5hdXRob3JpbmcudWkuVUlBY3Rpb25EaXNwYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwcml2YXRlIExpc3QgcmVmZXJlbmNlZFBsdWdpbnM7Ci0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbiwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbikpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJCi0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUX05hbWUpOwotCQlTdHJpbmcgYnJpZWZEZXNjcmlwdGlvbiA9IGdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gbnVsbDsKLQkJCi0JCW5hbWUgPSBuYW1lLnRyaW0oKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQljb25maWcgPSBMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCQkuY3JlYXRlTWV0aG9kQ29uZmlndXJhdGlvbigKLQkJCQkJCQkJbmFtZSwKLQkJCQkJCQkJTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJCS5nZXRDdXJyZW50TWV0aG9kTGlicmFyeSgpKTsKLQkJCQljb25maWcuc2V0QnJpZWZEZXNjcmlwdGlvbihicmllZkRlc2NyaXB0aW9uKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCWlmICghUGVyc3BlY3RpdmVMaXN0VXRpbC5pc0F1dGhvcmluZ1BlcnNwZWN0aXZlKCkpIHsKLQkJCVVJQWN0aW9uRGlzcGF0Y2hlci5vcGVuQXV0aG9yaW5nUGVyc3BlY3RpdmUoKTsKLQkJfQotCQlJTGlicmFyeVBlcnNpc3Rlci5GYWlsU2FmZU1ldGhvZExpYnJhcnlQZXJzaXN0ZXIgcGVyc2lzdGVyID0gTGlicmFyeVNlcnZpY2VVdGlsLmdldEN1cnJlbnRQZXJzaXN0ZXIoKS5nZXRGYWlsU2FmZVBlcnNpc3RlcigpOwotCQl0cnkgewotCQkJcGVyc2lzdGVyLnNhdmUoY29uZmlnKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0JCQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kRWxlbWVudC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDNlMzAuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENOZXdNZXRob2RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lZGl0LmNvbW1hbmQuQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuVGVzdGVyT3V0cHV0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnNlcnZpY2VzLklMaWJyYXJ5UGVyc2lzdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5CcmVha2Rvd25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGVsaXZlcnlQcm9jZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3NQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZEVsZW1lbnQgZXh0ZW5kcyBUZXN0Q29tbWFuZEltcGwgewkJCQkKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXAgdHlwZUNsYXNzTWFwID0gbmV3IEhhc2hNYXAoKTsJCi0Jc3RhdGljIHsKLQkJVW1hRmFjdG9yeSB1ZiA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJNZXRob2RQbHVnaW4iLCB1Zi5jcmVhdGVNZXRob2RQbHVnaW4oKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIk1ldGhvZENvbmZpZ3VyYXRpb24iLCB1Zi5jcmVhdGVNZXRob2RDb25maWd1cmF0aW9uKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJDb250ZW50UGFja2FnZSIsIHVmLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSb2xlIiwgdWYuY3JlYXRlUm9sZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVGFzayIsIHVmLmNyZWF0ZVRhc2soKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkFydGlmYWN0IiwgdWYuY3JlYXRlQXJ0aWZhY3QoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkRlbGl2ZXJhYmxlIiwgdWYuY3JlYXRlRGVsaXZlcmFibGUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIk91dGNvbWUiLCB1Zi5jcmVhdGVPdXRjb21lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJDb25jZXB0IiwgdWYuY3JlYXRlQ29uY2VwdCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQ2hlY2tsaXN0IiwgdWYuY3JlYXRlQ2hlY2tsaXN0KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJFeGFtcGxlIiwgdWYuY3JlYXRlRXhhbXBsZSgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiR3VpZGVsaW5lIiwgdWYuY3JlYXRlR3VpZGVsaW5lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSZXBvcnQiLCB1Zi5jcmVhdGVSZXBvcnQoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlRlbXBsYXRlIiwgdWYuY3JlYXRlVGVtcGxhdGUoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlN1cHBvcnRpbmdNYXRlcmlhbCIsIHVmLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVG9vbE1lbnRvciIsIHVmLmNyZWF0ZVRvb2xNZW50b3IoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIldoaXRlcGFwZXIiLCB1Zi5jcmVhdGVXaGl0ZXBhcGVyKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJQcmFjdGljZSIsIHVmLmNyZWF0ZVByYWN0aWNlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJSZXVzYWJsZUFzc2V0IiwgdWYuY3JlYXRlUmV1c2FibGVBc3NldCgpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiUm9hZG1hcCIsIHVmLmNyZWF0ZVJvYWRtYXAoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlRlcm1EZWZpbml0aW9uIiwgdWYuY3JlYXRlVGVybURlZmluaXRpb24oKS5lQ2xhc3MoKSk7Ci0JCQkJCi0JCXR5cGVDbGFzc01hcC5wdXQoIkRpc2NpcGxpbmUiLCB1Zi5jcmVhdGVEaXNjaXBsaW5lKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJEaXNjaXBsaW5lR3JvdXBpbmciLCB1Zi5jcmVhdGVEaXNjaXBsaW5lR3JvdXBpbmcoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkRvbWFpbiIsIHVmLmNyZWF0ZURvbWFpbigpLmVDbGFzcygpKTsJCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJXb3JrUHJvZHVjdFR5cGUiLCB1Zi5jcmVhdGVXb3JrUHJvZHVjdFR5cGUoKS5lQ2xhc3MoKSk7CQkKLQkJdHlwZUNsYXNzTWFwLnB1dCgiUm9sZVNldCIsIHVmLmNyZWF0ZVJvbGVTZXQoKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIlJvbGVTZXRHcm91cGluZyIsIHVmLmNyZWF0ZVJvbGVTZXRHcm91cGluZygpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiVG9vbCIsIHVmLmNyZWF0ZVRvb2woKS5lQ2xhc3MoKSk7Ci0JCXR5cGVDbGFzc01hcC5wdXQoIkN1c3RvbUNhdGVnb3J5IiwgdWYuY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoKS5lQ2xhc3MoKSk7Ci0JCQotCQl0eXBlQ2xhc3NNYXAucHV0KCJQcm9jZXNzUGFja2FnZSIsIHVmLmNyZWF0ZVByb2Nlc3NQYWNrYWdlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJBY3Rpdml0eSIsIHVmLmNyZWF0ZUFjdGl2aXR5KCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJQaGFzZSIsIHVmLmNyZWF0ZVBoYXNlKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJJdGVyYXRpb24iLCB1Zi5jcmVhdGVJdGVyYXRpb24oKS5lQ2xhc3MoKSk7CQkKLQkJdHlwZUNsYXNzTWFwLnB1dCgiQ2FwYWJpbGl0eVBhdHRlcm4iLCB1Zi5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybigpLmVDbGFzcygpKTsKLQkJdHlwZUNsYXNzTWFwLnB1dCgiRGVsaXZlcnlQcm9jZXNzIiwgdWYuY3JlYXRlRGVsaXZlcnlQcm9jZXNzKCkuZUNsYXNzKCkpOwotCQl0eXBlQ2xhc3NNYXAucHV0KCJUYXNrRGVzY3JpcHRvciIsIHVmLmNyZWF0ZVRhc2tEZXNjcmlwdG9yKCkuZUNsYXNzKCkpOwotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBUZXN0Q29tbWFuZEltcGwgZGVsZWdhdGU7Ci0JCQotCXB1YmxpYyB2b2lkIHBhcnNlKEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlci5wYXJzZShlbGVtZW50KTsKLQkJaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0eXBlIikuZXF1YWxzKCJNZXRob2RQbHVnaW4iKSkgewotCQkJZGVsZWdhdGUgPSBuZXcgVENOZXdNZXRob2RQbHVnaW4oKTsKLQkJCWRlbGVnYXRlLnNldE93bmVyKGdldE93bmVyKCkpOwotCQkJZGVsZWdhdGUucGFyc2UoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfVHlwZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfVHlwZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTmFtZSkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfUGFyZW50UGF0aCkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5leGVjdXRlKCk7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IGdldEF0dHJpYnV0ZShBVF9UeXBlKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfTmFtZSk7Ci0JCVN0cmluZyBwYXJlbnRQYXRoID0gZ2V0QXR0cmlidXRlKEFUX1BhcmVudFBhdGgpOwotCQkKLQkJRUNsYXNzIGVDbGFzcyA9IGdldEVDbGFzcyh0eXBlKTsKLQkJTWV0aG9kRWxlbWVudCBtZSA9IChNZXRob2RFbGVtZW50KSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGUoZUNsYXNzKTsKLQkJbWUuc2V0TmFtZShuYW1lKTsKLQkJbWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQlUQ0V4ZVJlcGx5IHJlcGx5ID0gYWRkVG9MaWIocGFyZW50UGF0aCwgbWUpOwotCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhcmVwbHkucGFzc2luZygpKSB7Ci0JCQlyZXR1cm4gcmVwbHk7Ci0JCX0KLQkJcmV0dXJuIGV4ZWN1dGVFZGl0KG5hbWUsIHBhcmVudFBhdGgpOwotCX0KLQotCXByaXZhdGUgVENFeGVSZXBseSBleGVjdXRlRWRpdChTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudFBhdGgpIHsJCQotCQkvL1RvIGRvOiBjaGVjayB0byBzZWUgaWYgZWRpdCBpcyBuZWVkZWQuIFJldHVybiBpZiBub3QgbmVlZGVkLgotCQkKLQkJVGVzdENvbW1hbmRJbXBsIGVkaXQgPSBuZXcgVENFZGl0TWV0aG9kRWxlbWVudCgpOwotCQllZGl0LnNldE93bmVyKGdldE93bmVyKCkpOwotCQllZGl0LnBhcnNlKGdldEVsZW1lbnQoKSk7Ci0JCVN0cmluZyBwYXRoID0gcGFyZW50UGF0aCA9PSBudWxsIHx8IHBhcmVudFBhdGgubGVuZ3RoKCkgPT0gMCA/IG5hbWUgIDogcGFyZW50UGF0aCArICIvIiArIG5hbWU7CQkKLQkJZWRpdC5yZW1vdmVBdHRyaWJ1dGUoQVRfTmFtZSk7Ci0JCWVkaXQucmVtb3ZlQXR0cmlidXRlKEFUX1BhcmVudFBhdGgpOwotCQllZGl0LnNldEF0dHJpYnV0ZShBVF9QYXRoLCBwYXRoKTsKLQkJCi0JCXJldHVybiBlZGl0LmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcml2YXRlIFRDRXhlUmVwbHkgYWRkVG9MaWIoU3RyaW5nIHBhcmVudFBhdGgsIE1ldGhvZEVsZW1lbnQgbWUpIHsKLQkJaWYgKG1lIGluc3RhbmNlb2YgQnJlYWtkb3duRWxlbWVudCkgewotCQkJcmV0dXJuIGFkZFByb2Nlc3NFbGVtZW50VG9MaWIocGFyZW50UGF0aCwgKFByb2Nlc3NFbGVtZW50KSBtZSk7Ci0JCX0KLQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlNZXRob2RFbGVtZW50IHBhcmVudE1lID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRNZXRob2RFbGVtZW50KGN1cnJMaWIsIHBhcmVudFBhdGgpOwotCQlpZiAocGFyZW50TWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgicGFyZW50TWUgPT0gbnVsbCIsIGZhbHNlKTsKLQkJfQkJCi0JCWFkZFRvUGFyZW50KG1lLCBwYXJlbnRNZSk7Ci0KLQkJc2F2ZShtZSk7Ci0JCS8vc2F2ZShwYXJlbnRNZSk7Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBUQ0V4ZVJlcGx5IGFkZFByb2Nlc3NFbGVtZW50VG9MaWIoU3RyaW5nIHBhcmVudFBhdGgsIFByb2Nlc3NFbGVtZW50IHBlKSB7Ci0JCU1ldGhvZExpYnJhcnkgY3VyckxpYiA9IGdldE93bmVyKCkuZ2V0Q3VycmVudEJhc2VMaWIoKTsKLQkJUHJvY2Vzc1BhY2thZ2UgcGFyZW50TWUgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldFByb2Nlc3NFbGVtZW50UGFyZW50KGN1cnJMaWIsIHBhcmVudFBhdGgpOwotCQlpZiAocGFyZW50TWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbCgicGFyZW50TWUgPT0gbnVsbCIsIGZhbHNlKTsKLQkJfQotCQlpZiAocGUgaW5zdGFuY2VvZiBDYXBhYmlsaXR5UGF0dGVybiB8fCBwZSBpbnN0YW5jZW9mIERlbGl2ZXJ5UHJvY2VzcykgewkJCQotCi0JCQlQcm9jZXNzQ29tcG9uZW50IHBjID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUHJvY2Vzc0NvbXBvbmVudCgpOwotCQkJcGMuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCQkJcGMuc2V0TmFtZShwZS5nZXROYW1lKCkpOwotCQkJcGFyZW50TWUuZ2V0Q2hpbGRQYWNrYWdlcygpLmFkZChwYyk7Ci0JCQlwYy5zZXRQcm9jZXNzKChvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHBlKTsJCQkKLQkJCWFkZFRvUGFyZW50KHBlLCBwYyk7Ci0JCQkKLQkJfSBlbHNlIGlmIChwZSBpbnN0YW5jZW9mIEJyZWFrZG93bkVsZW1lbnQpIHsKLQkJCUJyZWFrZG93bkVsZW1lbnQgYmUgPSAoQnJlYWtkb3duRWxlbWVudCkgcGU7Ci0JCQlQcm9jZXNzUGFja2FnZSBwa2cgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQcm9jZXNzUGFja2FnZSgpOwotCQkJcGtnLnNldE5hbWUocGUuZ2V0TmFtZSgpKTsKLQkJCXBhcmVudE1lLmdldENoaWxkUGFja2FnZXMoKS5hZGQocGtnKTs7Ci0JCQlhZGRUb1BhcmVudChwZSwgcGtnKTsKLQkJCQotCQkJQWN0aXZpdHkgcGFyZW50QWN0ID0gcGFyZW50TWUgaW5zdGFuY2VvZiBQcm9jZXNzQ29tcG9uZW50ID8gCi0JCQkJCSgoUHJvY2Vzc0NvbXBvbmVudCkgcGFyZW50TWUpLmdldFByb2Nlc3MoKSA6Ci0JCQkJCShBY3Rpdml0eSkgcGFyZW50TWUuZ2V0UHJvY2Vzc0VsZW1lbnRzKCkuZ2V0KDApOwotCQkJcGFyZW50QWN0LmdldEJyZWFrZG93bkVsZW1lbnRzKCkuYWRkKGJlKTsKLQkJfQotCi0JCXNhdmUocGFyZW50TWUpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQkKLQotCXByaXZhdGUgdm9pZCBhZGRUb1BhcmVudChNZXRob2RFbGVtZW50IG1lLCBNZXRob2RFbGVtZW50IHBhcmVudE1lKSB7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gZ2V0Q29udGFpbm1lbnRGZWF0dXJlKHBhcmVudE1lLCBtZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5XYXJuaW5nOiBjb250YWlubWVudCBmZWF0dXJlIG5vdCByZWdpc3RlcmVkISIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCAgIldhcm5pbmc6IHBhcmVudE1lOiAiICsgcGFyZW50TWUpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCAgIldhcm5pbmc6ICAgICAgIG1lOiAiICsgbWUpOwotCQl9IGVsc2UgaWYgKGZlYXR1cmUuaXNNYW55KCkpIHsKLQkJCUVMaXN0IGVsaXN0ID0gQWJzdHJhY3RPdmVycmlkZWFibGVDb21tYW5kLmdldE93bmVyTGlzdChwYXJlbnRNZSwgZmVhdHVyZSk7IAotCQkJTGlzdCBjID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYy5hZGQobWUpOwkJCi0JCQllbGlzdC5hZGRBbGwoYyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYXJlbnRNZS5lU2V0KGZlYXR1cmUsIG1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgRUNsYXNzIGdldEVDbGFzcyhTdHJpbmcgdHlwZSkgewotCQlFQ2xhc3MgcmV0ID0gKEVDbGFzcykgdHlwZUNsYXNzTWFwLmdldCh0eXBlKTsKLQkJaWYgKHJldCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuV2FybmluZzogXCIiICsgdHlwZSArIAotCQkJCQkiXCIgaXMgbm90IHJlZ2lzdGVyZWQgaW4gXCJ0eXBlQ2xhc3NNYXBcIiEiKTsKLQkJfQotCQlyZXR1cm4gcmV0OwkJCi0JfQotCQotCXByaXZhdGUgRVN0cnVjdHVyYWxGZWF0dXJlIGdldENvbnRhaW5tZW50RmVhdHVyZShFT2JqZWN0IG93bmVyLCBFT2JqZWN0IGVvYmopIHsKLQkJVW1hUGFja2FnZSB1cCA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFOwotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgTWV0aG9kTGlicmFyeSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBNZXRob2RQbHVnaW4pIHsKLQkJCQlyZXR1cm4gdXAuZ2V0TWV0aG9kTGlicmFyeV9NZXRob2RQbHVnaW5zKCk7Ci0JCQl9Ci0JCQlpZiAoZW9iaiBpbnN0YW5jZW9mIE1ldGhvZENvbmZpZ3VyYXRpb24pIHsKLQkJCQlyZXR1cm4gdXAuZ2V0TWV0aG9kTGlicmFyeV9QcmVkZWZpbmVkQ29uZmlndXJhdGlvbnMoKTsKLQkJCX0KLQkJfQkJCi0JCQotCQlpZiAob3duZXIgaW5zdGFuY2VvZiBDb250ZW50UGFja2FnZSkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBDb250ZW50RWxlbWVudCkgewotCQkJCXJldHVybiB1cC5nZXRDb250ZW50UGFja2FnZV9Db250ZW50RWxlbWVudHMoKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc0NvbXBvbmVudCkgewotCQkJaWYgKGVvYmogaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5lcGYudW1hLlByb2Nlc3MpIHsKLQkJCQlyZXR1cm4gdXAuZ2V0UHJvY2Vzc0NvbXBvbmVudF9Qcm9jZXNzKCk7Ci0JCQl9Ci0JCX0KLQkJCQkKLQkJaWYgKG93bmVyIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UpIHsKLQkJCWlmIChlb2JqIGluc3RhbmNlb2YgUHJvY2Vzc0VsZW1lbnQpIHsKLQkJCQlyZXR1cm4gdXAuZ2V0UHJvY2Vzc1BhY2thZ2VfUHJvY2Vzc0VsZW1lbnRzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChvd25lciBpbnN0YW5jZW9mIE1ldGhvZFBhY2thZ2UpIHsKLQkJCWlmIChlb2JqIGluc3RhbmNlb2YgQ29udGVudFBhY2thZ2UgfHwKLQkJCQllb2JqIGluc3RhbmNlb2YgUHJvY2Vzc1BhY2thZ2UJKSB7Ci0JCQkJcmV0dXJuIHVwLmdldE1ldGhvZFBhY2thZ2VfQ2hpbGRQYWNrYWdlcygpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZShNZXRob2RFbGVtZW50IGVsZW1lbnQpIHsKLQkJZmluYWwgSUxpYnJhcnlQZXJzaXN0ZXIuRmFpbFNhZmVNZXRob2RMaWJyYXJ5UGVyc2lzdGVyIHBlcnNpc3RlciA9IExpYnJhcnlTZXJ2aWNlVXRpbAotCQkJCS5nZXRQZXJzaXN0ZXJGb3IoZWxlbWVudC5lUmVzb3VyY2UoKSkuZ2V0RmFpbFNhZmVQZXJzaXN0ZXIoKTsKLQkJZmluYWwgUmVzb3VyY2UgcmVzID0gZWxlbWVudC5lUmVzb3VyY2UoKTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyeSB7Ci0JCQkJCXBlcnNpc3Rlci5zYXZlKHJlcyk7Ci0JCQkJCXBlcnNpc3Rlci5jb21taXQoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kUGx1Z2luLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ05ld01ldGhvZFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWZhNzk2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDTmV3TWV0aG9kUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLkxpYnJhcnlUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5UZXN0Q29tbWFuZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLk1vZGVsU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ05ld01ldGhvZFBsdWdpbiBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7CQkJCQotCQotCXByaXZhdGUgTGlzdCByZWZlcmVuY2VkUGx1Z2luczsKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCXNldEF0dHJpYnV0ZShBVF9OYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9OYW1lKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9CcmllZkRlc2NyaXB0aW9uKSk7Ci0JCXNldEF0dHJpYnV0ZShBVF9BdXRob3JzLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9BdXRob3JzKSk7Ci0JCXBhcnNlQ2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBhcnNlQ2hpbGRyZW4oRWxlbWVudCBlbGVtZW50KSB7Ci0JCU5vZGVMaXN0IGNub2RlcyA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoVlRfYmFzZXMpOwotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbGVtZW50IGNFbGVtZW50ID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKDApOwotCQljbm9kZXMgPSBjRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShWVF9WYWx1ZSk7CQotCQlpZiAoY25vZGVzID09IG51bGwgfHwgY25vZGVzLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlyZWZlcmVuY2VkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlFbGVtZW50IHZFbGVtID0gKEVsZW1lbnQpIGNub2Rlcy5pdGVtKGkpOwotCQkJU3RyaW5nIHZhbHVlID0gdkVsZW0uZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotCQkJcmVmZXJlbmNlZFBsdWdpbnMuYWRkKHZhbHVlKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBUQ0V4ZVJlcGx5IGV4ZWN1dGUoKSB7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVF9OYW1lKTsKLQkJU3RyaW5nIGJyaWVmRGVzY3JpcHRpb24gPSBnZXRBdHRyaWJ1dGUoQVRfQnJpZWZEZXNjcmlwdGlvbik7Ci0JCVN0cmluZyBhdXRob3JzID0gZ2V0QXR0cmlidXRlKEFUX0F1dGhvcnMpOwotCQkKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBuZXcgVENFeGVSZXBseUltcGwoIkVtcHR5IHBsdWdpbiBuYW1lIiwgZmFsc2UpOwotCQl9Ci0JCVN0cmluZyBtc2cgPSBMaWJyYXJ5VXRpbC5jaGVja1BsdWdpbk5hbWUobnVsbCwgbmFtZSk7Ci0JCWlmIChtc2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBUQ0V4ZVJlcGx5SW1wbChtc2csIGZhbHNlKTsKLQkJfQotCQkJCQotCQl0cnkgewotCQkJTWV0aG9kTGlicmFyeSBjdXJyTGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQkJTGlzdCBwbHVnaW5zID0gY3VyckxpYi5nZXRNZXRob2RQbHVnaW5zKCk7Ci0JCQkKLQkJCS8vIENyZWF0ZSB0aGUgbWV0aG9kIHBsdWctaW4gYW5kIGFkZCBpdCB0byB0aGUgY3VycmVudCBtZXRob2QKLQkJCS8vIGxpYnJhcnkuCi0JCQlmaW5hbCBNZXRob2RQbHVnaW4gbmV3UGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQluZXdQbHVnaW4uc2V0TmFtZShTdHJVdGlsLm1ha2VWYWxpZEZpbGVOYW1lKG5hbWUpKTsKLQkJCW5ld1BsdWdpbi5zZXRCcmllZkRlc2NyaXB0aW9uKGJyaWVmRGVzY3JpcHRpb24pOwotCQkJbmV3UGx1Z2luLnNldEF1dGhvcnMoYXV0aG9ycyk7Ci0JCQkKLQkJCWludCBzeiA9IHJlZmVyZW5jZWRQbHVnaW5zID09IG51bGwgPyAwIDogcmVmZXJlbmNlZFBsdWdpbnMuc2l6ZSgpOwotCQkJaWYgKHN6ID4gMCAmJiAhIHBsdWdpbnMuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHN6OyBpKyspIHsKLQkJCQkJU3RyaW5nIHJlZmVyZWROYW1lID0gKFN0cmluZykgcmVmZXJlbmNlZFBsdWdpbnMuZ2V0KGkpOwotCQkJCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gKE1ldGhvZFBsdWdpbikgTGlicmFyeVRlc3RTZXJ2aWNlLmdldEVsZW1lbnQKLQkJCQkJCShwbHVnaW5zLCByZWZlcmVkTmFtZSk7Ci0JCQkJCWlmIChwbHVnaW4gIT0gbnVsbCkgewotCQkJCQkJbmV3UGx1Z2luLmdldEJhc2VzKCkuYWRkKHBsdWdpbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUlMaWJyYXJ5TWFuYWdlciBtYW5hZ2VyID0gKElMaWJyYXJ5TWFuYWdlcikgTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudExpYnJhcnlNYW5hZ2VyKCk7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJbWFuYWdlci5hZGRNZXRob2RQbHVnaW4oTW9kZWxTdG9yYWdlLmluaXRpYWxpemUobmV3UGx1Z2luKSk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPcGVuTGlicmFyeS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPcGVuTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDc1NjYzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdGVyL2ltcGwvdGVzdGNvbW1hbmRzL1RDT3BlbkxpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pZmFjZS5UQ0V4ZVJlcGx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEEgdGVzdCBjb21tYW5kIGNsYXNzCi0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBUQ09wZW5MaWJyYXJ5IGV4dGVuZHMgVGVzdENvbW1hbmRJbXBsIHsJCQkJCi0JCi0JcHVibGljIHZvaWQgcGFyc2UoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyLnBhcnNlKGVsZW1lbnQpOwotCQlzZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSkpOwotCX0JCi0JCi0JcHVibGljIFRDRXhlUmVwbHkgZXhlY3V0ZSgpIHsKLQkJU3RyaW5nIGxpYkZvbGRlck5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRfTGliRm9sZGVyTmFtZSk7CQotCQlnZXRPd25lcigpLmxvYWRCYXNlTGliKGxpYkZvbGRlck5hbWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0ZXIvaW1wbC90ZXN0Y29tbWFuZHMvVENPdXRwdXRNZXRob2RFbGVtZW50LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ091dHB1dE1ldGhvZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIzMjE3Ni4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3Rlci9pbXBsL3Rlc3Rjb21tYW5kcy9UQ091dHB1dE1ldGhvZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvLkVQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnV0aWxzLlhNTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3Rlck91dHB1dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLlRlc3RDb21tYW5kTWdyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQSB0ZXN0IGNvbW1hbmQgY2xhc3MKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRDT3V0cHV0TWV0aG9kRWxlbWVudCBleHRlbmRzIFRlc3RDb21tYW5kSW1wbCB7Ci0KLQkvL01heSB3YW50IHRvIHVzZSBmZWF0dXJlIGNsYXNzZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBuYW1lcyBsYXRlcgotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGV4Y2x1ZGVkRmVhdHVyZXMgPSB7Ci0JCS8vImd1aWQiLAotCQkvLyJnVUlEcyIKLQl9OwotCQotCXByaXZhdGUgc3RhdGljIFNldCBleGNsdWRlZEZlYXR1cmVTZXQgPSBuZXcgSGFzaFNldCgpOwotCQotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGk9MDsgaTxleGNsdWRlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlleGNsdWRlZEZlYXR1cmVTZXQuYWRkKGV4Y2x1ZGVkRmVhdHVyZXNbaV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9jYWxEZWJ1ZyA9IGZhbHNlOwotCVN0cmluZyBwYXRoOwotCXByaXZhdGUgRG9jdW1lbnQgZG9jOwotCXByaXZhdGUgTWFwIHN5c3RlbVBrZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBFbGVtZW50IHJvb3Q7Ci0JcHJpdmF0ZSBib29sZWFuIHJlY3Vyc2l2ZSA9IHRydWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFnTmFtZTsKLQkKLQlwdWJsaWMgdm9pZCBwYXJzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIucGFyc2UoZWxlbWVudCk7Ci0JCWRvYyA9IGdldE93bmVyKCkuZ2V0T3V0cHV0RG9jdW1lbnQoKTsKLQkJLy9TdHJpbmcgdGFnTmFtZSA9IHRhZ05hbWUoKTsgbmVlZCB0byBmaXggdGFnTmFtZSgpIG1laHRvZAotCQl0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQotCQlzZXRBdHRyaWJ1dGUoQVRfUGF0aCwgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfUGF0aCkpOwotCQlzZXRBdHRyaWJ1dGUoQVRfUmVjdXJzaXZlLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9SZWN1cnNpdmUpKTsKLQkJc2V0QXR0cmlidXRlKEFUX091dHB1dEZpbGVOYW1lLCBlbGVtZW50LmdldEF0dHJpYnV0ZShBVF9PdXRwdXRGaWxlTmFtZSkpOwkKLQl9CQkKLQkKLQlwdWJsaWMgVENFeGVSZXBseSBleGVjdXRlKCkgewkKLQkJcGF0aCA9IGdldEF0dHJpYnV0ZShBVF9QYXRoKTsKLQkJcmVjdXJzaXZlID0gcGFyc2VCb29sZWFuKEFUX1JlY3Vyc2l2ZSwgcmVjdXJzaXZlKTsKLQkJCi0JCU1ldGhvZExpYnJhcnkgbGliID0gZ2V0T3duZXIoKS5nZXRDdXJyZW50QmFzZUxpYigpOwotCQlyb290ID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQotCQlpZiAodGFnTmFtZS5lcXVhbHMoVGVzdENvbW1hbmRNZ3IuVENPdXRwdXRMaWJyYXJ5KSkgewotCQkJb3V0cHV0TWV0aG9kRWxlbWVudChsaWIsIHJvb3QpOwotCQl9IGVsc2UgaWYgKHRhZ05hbWUuZXF1YWxzKFRlc3RDb21tYW5kTWdyLlRDT3V0cHV0UGx1Z2luKSkgewotCQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IFRlc3Rlck91dHB1dFV0aWwuZ2V0TWV0aG9kUGx1Z2luKGxpYiwgcGF0aCk7Ci0JCQlvdXRwdXRNZXRob2RFbGVtZW50KHBsdWdpbiwgcm9vdCk7Ci0JCX0gZWxzZSBpZiAodGFnTmFtZS5lcXVhbHMoVGVzdENvbW1hbmRNZ3IuVENPdXRwdXRDb25maWd1cmF0aW9uKSkgewotCQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBUZXN0ZXJPdXRwdXRVdGlsLmdldE1ldGhvZENvbmZpZ3VyYXRpb24obGliLCBwYXRoKTsKLQkJCW91dHB1dE1ldGhvZEVsZW1lbnQoY29uZmlnLCByb290KTsKLQkJfSBlbHNlIGlmICh0YWdOYW1lLmVxdWFscyhUZXN0Q29tbWFuZE1nci5UQ091dHB1dE1ldGhvZEVsZW1lbnQpKSB7Ci0JCQlNZXRob2RFbGVtZW50IG1lID0gVGVzdGVyT3V0cHV0VXRpbC5nZXRNZXRob2RFbGVtZW50KGxpYiwgcGF0aCk7Ci0JCQlvdXRwdXRNZXRob2RFbGVtZW50KG1lLCByb290KTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJb3V0cHV0VG9GaWxlKCk7CQkKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRUb0ZpbGUoKSB7Ci0JCVN0cmluZyBvdXRwdXRGaWxlTmFtZSA9IGdldEF0dHJpYnV0ZShBVF9PdXRwdXRGaWxlTmFtZSk7Ci0JCWlmIChvdXRwdXRGaWxlTmFtZSA9PSBudWxsIHx8IG91dHB1dEZpbGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgb3V0cHV0UGF0aCA9IGdldE93bmVyKCkuZ2V0T3V0cHV0UGF0aCgpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShvdXRwdXRQYXRoKS5nZXRQYXJlbnRGaWxlKCk7Ci0JCW91dHB1dFBhdGggPSBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBvdXRwdXRGaWxlTmFtZTsKLQkJCi0JCURvY3VtZW50IG91dHB1dERvY3VtZW50ID0gZ2V0T3duZXIoKS5nZXRPdXRwdXREb2N1bWVudCgpOwotCQl0cnkgewotCQkJWE1MVXRpbC5zYXZlRG9jdW1lbnQob3V0cHV0RG9jdW1lbnQsIG91dHB1dFBhdGgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRNZXRob2RFbGVtZW50KE1ldGhvZEVsZW1lbnQgZWxlbWVudCwgRWxlbWVudCBwYXJlbnROb2RlKSB7CQotCQlFbGVtZW50IG5vZGUgPSBkb2MuY3JlYXRlRWxlbWVudChnZXRUeXBlKGVsZW1lbnQpKTsJCQotCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQlpZiAocGFyZW50Tm9kZSA9PSByb290KSB7Ci0JCQlub2RlLnNldEF0dHJpYnV0ZSgicGF0aCIsIHBhdGgpOwotCQl9Ci0JCW91dHB1dEZlYXR1cmVzKGVsZW1lbnQsIG5vZGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0cHV0UmVmZXJlbmNlKEVSZWZlcmVuY2UgZmVhdHVyZSwgTWV0aG9kRWxlbWVudCBlbGVtZW50LCBFbGVtZW50IHBhcmVudE5vZGUpIHsKLQkJRWxlbWVudCBub2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoZmVhdHVyZS5nZXROYW1lKCkpOwotCQlwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpOwotCQlub2RlLnNldEF0dHJpYnV0ZSgicGF0aCIsIFRlc3Rlck91dHB1dFV0aWwuZ2V0T3V0cHV0UGF0aChlbGVtZW50KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBvdXRwdXRGZWF0dXJlcyhNZXRob2RFbGVtZW50IGVsZW1lbnQsIEVsZW1lbnQgbm9kZSkgewotCQlMaXN0IHByb3BlcnRpZXMgPSBlbGVtZW50LmdldEluc3RhbmNlUHJvcGVydGllcygpOwkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydGllcy5zaXplKCk7IGkrKykgewotCQkJRVByb3BlcnR5IGVwID0gKEVQcm9wZXJ0eSkgcHJvcGVydGllcy5nZXQoaSk7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IGVwLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgpOwotCQkJaWYgKGV4Y2x1ZGVkRmVhdHVyZVNldC5jb250YWlucyhmZWF0dXJlLmdldE5hbWUoKSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCU9iamVjdCB2YWx1ZSA9IGVsZW1lbnQuZUdldChmZWF0dXJlKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEVSZWZlcmVuY2UpIHsKLQkJCQlpZiAoISByZWN1cnNpdmUgJiYgbm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gcm9vdCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRVJlZmVyZW5jZSByZWZGZWF0dXJlID0gKEVSZWZlcmVuY2UpIGZlYXR1cmU7Ci0JCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCQlvdXRwdXRMaXN0RmVhdHVyZShyZWZGZWF0dXJlLCAoTGlzdCkgdmFsdWUsIG5vZGUpOwotCQkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXRob2RFbGVtZW50KSB7Ci0JCQkJCWlmIChyZWZGZWF0dXJlLmlzQ29udGFpbm1lbnQoKSkgewotCQkJCQkJb3V0cHV0TWV0aG9kRWxlbWVudCgoTWV0aG9kRWxlbWVudCkgdmFsdWUsIG5vZGUpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJb3V0cHV0UmVmZXJlbmNlKHJlZkZlYXR1cmUsIChNZXRob2RFbGVtZW50KSB2YWx1ZSwgbm9kZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGxvY2FsRGVidWcpewotCQkJCQlnZXRPd25lcigpLnRyYWNlKCJXYXJuaW5nPiB2YWx1ZSBpcyBvZiBub24tb3V0cHV0IHR5cGU6ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmZWF0dXJlIGluc3RhbmNlb2YgRUF0dHJpYnV0ZSkgewotCQkJCW5vZGUuc2V0QXR0cmlidXRlKGZlYXR1cmUuZ2V0TmFtZSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJfQkJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3V0cHV0TGlzdEZlYXR1cmUoRVJlZmVyZW5jZSBmZWF0dXJlLCBMaXN0IGxpc3QsIEVsZW1lbnQgcGFyZW50Tm9kZSkgewotCQlpbnQgc3ogPSBsaXN0ID09IG51bGwgPyAwIDogbGlzdC5zaXplKCk7Ci0JCWlmIChzeiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCEgKGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgTWV0aG9kRWxlbWVudCkpIHsKLQkJCWdldE93bmVyKCkudHJhY2UoIldhcm5pbmc+IGxpc3QuZ2V0KDApIGlzIG9mIHR5cGU6ICIgKyBsaXN0LmdldCgwKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiBjb250YWlubWVudCA9IGZlYXR1cmUuaXNDb250YWlubWVudCgpOwotCQlmb3IgKGludCBpPTA7IGk8c3o7IGkrKykgewotCQkJTWV0aG9kRWxlbWVudCBlbGVtZW50ID0gKE1ldGhvZEVsZW1lbnQpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbnRhaW5tZW50KSB7Ci0JCQkJb3V0cHV0TWV0aG9kRWxlbWVudChlbGVtZW50LCBwYXJlbnROb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3V0cHV0UmVmZXJlbmNlKGZlYXR1cmUsIGVsZW1lbnQsIHBhcmVudE5vZGUpOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKE9iamVjdCBvYmopIHsKLQkJU3RyaW5nIGNsc05hbWUgPSBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCWludCBpeCA9IGNsc05hbWUubGFzdEluZGV4T2YoIi4iKSArIDE7Ci0JCVN0cmluZyB0eXBlID0gY2xzTmFtZS5zdWJzdHJpbmcoaXgpOwotCQlpeCA9IHR5cGUubGFzdEluZGV4T2YoIkltcGwiKTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIE1ldGhvZEVsZW1lbnQgJiYgaXggKyA0ID09ICB0eXBlLmxlbmd0aCgpKSB7Ci0JCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcoMCwgaXgpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0JCi0JCi0JCi0JCi19Ci0KLQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9BYnN0cmFjdExpYnJhcnlUZXN0Q2FzZS5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9BYnN0cmFjdExpYnJhcnlUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTc1ODNjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvQWJzdHJhY3RMaWJyYXJ5VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkueG1pLlhNSUxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5wZXJzaXN0ZW5jZS5NdWx0aUZpbGVTYXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBKVW5pdCB0ZXN0IGNhc2VzIHRoYXQgbmVlZHMgdG8gb3BlbiBhIG1ldGhvZCBsaWJyYXJ5Ci0gKiAKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpYnJhcnlUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IGxpYnJhcnk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxldGVMaWJyYXJ5T25FeGl0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgQWJzdHJhY3RMaWJyYXJ5VGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQlvcGVuTGlicmFyeSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoZGVsZXRlTGlicmFyeU9uRXhpdCkgewotCQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JCX0gZWxzZSB7Ci0JCQlMaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IG9wZW5MaWJyYXJ5KCkgdGhyb3dzIExpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGxpYlBhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVwZi5saWJyYXJ5Iik7Ci0JCWlmKGxpYlBhdGggPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0SW5zdGFsbFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgIkxpYnJhcmllcyIgKyBGaWxlLnNlcGFyYXRvciArICJPcGVuVVAiOwotCQkJaWYobmV3IEZpbGUocGF0aCwgTXVsdGlGaWxlU2F2ZVV0aWwuREVGQVVMVF9MSUJSQVJZX01PREVMX0ZJTEVOQU1FKS5leGlzdHMoKSkgewotCQkJCWxpYlBhdGggPSBwYXRoOwotCQkJfQotCQl9Ci0JCWlmIChsaWJQYXRoICE9IG51bGwpIHsKLQkJCWxpYnJhcnkgPSBYTUlMaWJyYXJ5VXRpbC5vcGVuTWV0aG9kTGlicmFyeShsaWJQYXRoKTsKLQkJCUxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkuc2V0Q3VycmVudE1ldGhvZExpYnJhcnkobGlicmFyeSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaWJyYXJ5ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGVzdE1ldGhvZExpYnJhcnkoKTsKLQkJCWRlbGV0ZUxpYnJhcnlPbkV4aXQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBsaWJyYXJ5OwotCX0KLQotCXByb3RlY3RlZCBNZXRob2RMaWJyYXJ5IHJlb3BlbkxpYnJhcnkoKSB0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKS5yZW9wZW5DdXJyZW50TWV0aG9kTGlicmFyeSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9EZXBlbmRlbmN5Q2hlY2tlclRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvRGVwZW5kZW5jeUNoZWNrZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTE3OWYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9EZXBlbmRlbmN5Q2hlY2tlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuZWRpdC52YWxpZGF0aW9uLkRlcGVuZGVuY3lDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlCi0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeUNoZWNrZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRGVwZW5kZW5jeUNoZWNrZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LnZhbGlkYXRpb24uRGVwZW5kZW5jeUNoZWNrZXIjY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmUsIGphdmEubGFuZy5PYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tDaXJjdWxhckRlcGVuZGVuY3koKSB7Ci0JCS8qCi0JCXBsdWdpbjEgPC0gcGx1Z2luMiA8LSBwbHVnaW4zIAotCQkJCQl8Ci0JCSAgICAgICAgICAgIHYKLQkJICAgICAgICAgICBwbHVnaW40IC0+IHBsdWdpbjUJCSAgICAgICAgICAgCi0JCSovCi0JCU1ldGhvZExpYnJhcnkgbGliID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kTGlicmFyeSgpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luMS5zZXROYW1lKCJwbHVnaW4xIik7Ci0JCWxpYi5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbjEpOwotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjIgPSBVbWFGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RQbHVnaW4oKTsKLQkJcGx1Z2luMi5zZXROYW1lKCJwbHVnaW4yIik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCWxpYi5nZXRNZXRob2RQbHVnaW5zKCkuYWRkKHBsdWdpbjIpOwotCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4zID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjMuc2V0TmFtZSgicGx1Z2luMyIpOwotCQlwbHVnaW4zLmdldEJhc2VzKCkuYWRkKHBsdWdpbjIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW4zKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW40ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjQuc2V0TmFtZSgicGx1Z2luNCIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW40KTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW41ID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCXBsdWdpbjUuc2V0TmFtZSgicGx1Z2luNSIpOwotCQlsaWIuZ2V0TWV0aG9kUGx1Z2lucygpLmFkZChwbHVnaW41KTsKLQotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjQpOwotCQlwbHVnaW40LmdldEJhc2VzKCkuYWRkKHBsdWdpbjUpOwotCi0KLQkJYXNzZXJ0RmFsc2UoRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGx1Z2luMSwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgcGx1Z2luMykuaXNPSygpKTsKLQkJYXNzZXJ0RmFsc2UoRGVwZW5kZW5jeUNoZWNrZXIuY2hlY2tDaXJjdWxhckRlcGVuZGVuY3kocGx1Z2luNSwgVW1hUGFja2FnZS5MaXRlcmFscy5NRVRIT0RfUExVR0lOX19CQVNFUywgcGx1Z2luMykuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZShEZXBlbmRlbmN5Q2hlY2tlci5jaGVja0NpcmN1bGFyRGVwZW5kZW5jeShwbHVnaW41LCBVbWFQYWNrYWdlLkxpdGVyYWxzLk1FVEhPRF9QTFVHSU5fX0JBU0VTLCBwbHVnaW4xKS5pc09LKCkpOwotCQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlTZXJ2aWNlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5U2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiOTIxYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlTZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5JTGlicmFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5Nb2RlbFN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFGYWN0b3J5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkgcGx1Zy1pbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5U2VydmljZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9YTUkgPSAibGlicmFyeS54bWkiOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9YTUkgPSAicGx1Z2luLnhtaSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9MSUJSQVJZXzEgPSAibGlicmFyeV8xIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOXzEgPSAicGx1Z2luXzEiOyAvLyROT04tTkxTLTEkCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgTGlicmFyeVNlcnZpY2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoZSBjcmVhdGlvbiBvZiBhIG1ldGhvZCBsaWJyYXJ5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0Q3JlYXRlTWV0aG9kTGlicmFyeSgpIHsKLQkJdHJ5IHsKLQkJCUxpYnJhcnlUZXN0SGVscGVyCi0JCQkJCS5jcmVhdGVUZXN0TWV0aG9kTGlicmFyeShMaWJyYXJ5VGVzdEhlbHBlci5URU1QX1RFU1RfRElSCi0JCQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIFRFU1RfTElCUkFSWV8xKTsKLQkJCUZpbGUgbGliRmlsZSA9IG5ldyBGaWxlKExpYnJhcnlUZXN0SGVscGVyLlRFTVBfVEVTVF9ESVIKLQkJCQkJKyBGaWxlLnNlcGFyYXRvciArIFRFU1RfTElCUkFSWV8xICsgRmlsZS5zZXBhcmF0b3IKLQkJCQkJKyBMSUJSQVJZX1hNSSk7Ci0JCQlhc3NlcnRUcnVlKGxpYkZpbGUuZXhpc3RzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIGNyZWF0aW9uIG9mIGEgbWV0aG9kIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHRlc3RDcmVhdGVNZXRob2RQbHVnaW4oKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gVW1hRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kUGx1Z2luKCk7Ci0JCQlwbHVnaW4uc2V0TmFtZShURVNUX1BMVUdJTl8xKTsKLQotCQkJSUxpYnJhcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUxpYnJhcnlNYW5hZ2VyKSBMaWJyYXJ5U2VydmljZQotCQkJCQkuZ2V0SW5zdGFuY2UoKS5nZXRDdXJyZW50TGlicmFyeU1hbmFnZXIoKTsKLQkJCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltYW5hZ2VyLmFkZE1ldGhvZFBsdWdpbihNb2RlbFN0b3JhZ2UuaW5pdGlhbGl6ZShwbHVnaW4pKTsKLQkJCX0KLQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoTGlicmFyeVRlc3RIZWxwZXIuVEVNUF9URVNUX0RJUgotCQkJCQkrIEZpbGUuc2VwYXJhdG9yICsgVEVTVF9MSUJSQVJZXzEgKyBGaWxlLnNlcGFyYXRvcgotCQkJCQkrIFRFU1RfUExVR0lOXzEgKyBGaWxlLnNlcGFyYXRvciArIFBMVUdJTl9YTUkpOwotCQkJYXNzZXJ0VHJ1ZShwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQotCQkJTGlicmFyeVRlc3RIZWxwZXIuY2xvc2VMaWJyYXJ5KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0SGVscGVyLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1Mjk0NTUuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51dGlscy5GaWxlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5MaWJyYXJ5U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuZGF0YWV4Y2hhbmdlLmltcG9ydGluZy5QbHVnaW5TZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BY3Rpdml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2FwYWJpbGl0eVBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5DaGVja2xpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkN1c3RvbUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRGlzY2lwbGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkRvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkd1aWRhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZExpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Qcm9jZXNzQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5WYXJpYWJpbGl0eVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Xb3JrUHJvZHVjdFR5cGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLkNhbGVuZGFyOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBtYW5pcHVsYXRlIGEgdGVzdCBtZXRob2QgbGlicmFyeS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIExpYnJhcnlUZXN0SGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBfVEVTVF9ESVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgLy8kTk9OLU5MUy0yJAotCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1hNSSA9ICJsaWJyYXJ5LnhtaSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1JX1RZUEUgPSAieG1pIjsgLy8kTk9OLU5MUy0xJAkJCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRlc3QgbWV0aG9kIGxpYnJhcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RMaWJyYXJ5IGNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCkKLQkJCXRocm93cyBMaWJyYXJ5U2VydmljZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwYXRoID0gVEVNUF9URVNUX0RJUgotCQkJCSsgTG9uZy50b0hleFN0cmluZyhDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmdldFRpbWVJbk1pbGxpcygpKQotCQkJCSsgRmlsZS5zZXBhcmF0b3I7Ci0JCQotCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJTWFwIHBhcmFtcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXBhcmFtcy5wdXQoImxpYnJhcnkucGF0aCIsIHBhdGgpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJLmNyZWF0ZU1ldGhvZExpYnJhcnkoTElCUkFSWV9YTUksIFhNSV9UWVBFLCBwYXJhbXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSB0ZXN0IG1ldGhvZCBsaWJyYXJ5IG9uIGEgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZExpYnJhcnkgY3JlYXRlVGVzdE1ldGhvZExpYnJhcnkoU3RyaW5nIHBhdGgpCi0JCQl0aHJvd3MgTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gewotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gVEVNUF9URVNUX0RJUgotCQkJCQkrIExvbmcKLQkJCQkJCQkudG9IZXhTdHJpbmcoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKQotCQkJCQkJCQkJLmdldFRpbWVJbk1pbGxpcygpKSArIEZpbGUuc2VwYXJhdG9yOwotCQl9Ci0JCQotCQkvLyBJZiB0aGUgbGlicmFyeSBwYXRoIGFscmVhZHkgZXhpc3RzLCBkZWxldGUgaXQuCi0JCUZpbGUgbGlicmFyeVBhdGggPSBuZXcgRmlsZShwYXRoKTsKLQkJaWYgKGxpYnJhcnlQYXRoLmV4aXN0cygpKSB7Ci0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhsaWJyYXJ5UGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlsaWJyYXJ5UGF0aC5kZWxldGUoKTsJCQkKLQkJfQotCQkKLQkJb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jbG9zZUN1cnJlbnRNZXRob2RMaWJyYXJ5KCk7Ci0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KCJsaWJyYXJ5LnBhdGgiLCBwYXRoKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UuZ2V0SW5zdGFuY2UoKQotCQkJCS5jcmVhdGVNZXRob2RMaWJyYXJ5KExJQlJBUllfWE1JLCBYTUlfVFlQRSwgcGFyYW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZXMgdGhlIGN1cnJlbnQgbWV0aG9kIGxpYnJhcnkgYW5kIGRlbGV0ZSB0aGUgbGlicmFyeSByZXNvdXJjZSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VMaWJyYXJ5KCkgewotCQl0cnkgewotCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUob3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuTGlicmFyeVNlcnZpY2UKLQkJCQkJLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudE1ldGhvZExpYnJhcnlMb2NhdGlvbigpKTsKLQkJCW9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LkxpYnJhcnlTZXJ2aWNlLmdldEluc3RhbmNlKCkKLQkJCQkJLmNsb3NlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQotCQkJLy8gRGVsZXRlIHRoZSBsaWJyYXJ5IGZvbGRlciBhbmQgZmlsZXMuCi0JCQlGaWxlVXRpbC5kZWxldGVBbGxGaWxlcyhwYXRoLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXBhdGguZGVsZXRlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUxpYnJhcnkoKSB7Ci0JCXRyeSB7Ci0JCQlvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5MaWJyYXJ5U2VydmljZS5nZXRJbnN0YW5jZSgpCi0JCQkJCS5zYXZlQ3VycmVudE1ldGhvZExpYnJhcnkoKTsKLQkJfSBjYXRjaCAoTGlicmFyeVNlcnZpY2VFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kQ29uZmlndXJhdGlvbiBjcmVhdGVDb25maWd1cmF0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVDb25maWd1cmF0aW9uKG5hbWUsIEVjb3JlVXRpbAotCQkJCS5nZW5lcmF0ZVVVSUQoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBNZXRob2RQbHVnaW4gY3JlYXRlTWV0aG9kUGx1Z2luKFN0cmluZyBuYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luKG5hbWUsIEVjb3JlVXRpbAotCQkJCQkuZ2VuZXJhdGVVVUlEKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEaXNjaXBsaW5lIGNyZWF0ZURpc2NpcGxpbmUoTWV0aG9kUGx1Z2luIHBsdWdpbiwgU3RyaW5nIG5hbWUpIHsKLQkJRGlzY2lwbGluZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pLmNyZWF0ZURpc2NpcGxpbmUoKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJvbGVTZXQgY3JlYXRlUm9sZVNldChNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmFtZSkgewotCQlSb2xlU2V0IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlUm9sZVNldCgpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRG9tYWluIGNyZWF0ZURvbWFpbihNZXRob2RQbHVnaW4gcGx1Z2luLCBTdHJpbmcgbmFtZSkgewotCQlEb21haW4gZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVEb21haW4oKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdvcmtQcm9kdWN0VHlwZSBjcmVhdGVXb3JrUHJvZHVjdFR5cGUoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCVN0cmluZyBuYW1lKSB7Ci0JCVdvcmtQcm9kdWN0VHlwZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZSgKLQkJCQlwbHVnaW4pLmNyZWF0ZVdvcmtQcm9kdWN0VHlwZSgpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ3VzdG9tQ2F0ZWdvcnkgY3JlYXRlQ3VzdG9tQ2F0ZWdvcnkoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUN1c3RvbUNhdGVnb3J5IHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJQ3VzdG9tQ2F0ZWdvcnkgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UoCi0JCQkJcGx1Z2luKS5jcmVhdGVDdXN0b21DYXRlZ29yeShwYXJlbnQpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29udGVudFBhY2thZ2UgY3JlYXRlQ29udGVudFBhY2thZ2UoU3RyaW5nIG5hbWUpIHsKLQotCQlyZXR1cm4gY3JlYXRlQ29udGVudFBhY2thZ2UobnVsbCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50UGFja2FnZSBjcmVhdGVDb250ZW50UGFja2FnZShNZXRob2RQbHVnaW4gcGx1Z2luLAotCQkJU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHBsdWdpbiA9PSBudWxsKSB7Ci0JCQlwbHVnaW4gPSBjcmVhdGVNZXRob2RQbHVnaW4oInRlc3QgcGx1Z2luIik7Ci0JCX0KLQkJQ29udGVudFBhY2thZ2UgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UoCi0JCQkJcGx1Z2luKS5jcmVhdGVDb250ZW50UGFja2FnZShudWxsKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRhc2sgY3JlYXRlVGFzayhDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJVGFzayBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZVRhc2socGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJvbGUgY3JlYXRlUm9sZShDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJUm9sZSBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZVJvbGUocGtnKTsKLQkJZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCQllbGVtZW50LnNldEd1aWQoRWNvcmVVdGlsLmdlbmVyYXRlVVVJRCgpKTsKLQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFydGlmYWN0IGNyZWF0ZUFydGlmYWN0KENvbnRlbnRQYWNrYWdlIHBrZywgU3RyaW5nIG5hbWUpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlVdGlsLmdldE1ldGhvZFBsdWdpbihwa2cpOwotCQlBcnRpZmFjdCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pCi0JCQkJLmNyZWF0ZUFydGlmYWN0KHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHdWlkYW5jZSBjcmVhdGVHdWlkYW5jZShDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJR3VpZGFuY2UgZWxlbWVudCA9IExpYnJhcnlTZXJ2aWNlLklOU1RBTkNFLmNyZWF0ZVBsdWdpblNlcnZpY2UocGx1Z2luKQotCQkJCS5jcmVhdGVHdWlkYW5jZShwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ2hlY2tsaXN0IGNyZWF0ZUNoZWNrbGlzdChDb250ZW50UGFja2FnZSBwa2csIFN0cmluZyBuYW1lKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VXRpbC5nZXRNZXRob2RQbHVnaW4ocGtnKTsKLQkJQ2hlY2tsaXN0IGVsZW1lbnQgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbikKLQkJCQkuY3JlYXRlQ2hlY2tsaXN0KHBrZyk7Ci0JCWVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLQkJZWxlbWVudC5zZXRHdWlkKEVjb3JlVXRpbC5nZW5lcmF0ZVVVSUQoKSk7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdXBwb3J0aW5nTWF0ZXJpYWwgY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKAotCQkJQ29udGVudFBhY2thZ2UgcGtnLCBTdHJpbmcgbmFtZSkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVV0aWwuZ2V0TWV0aG9kUGx1Z2luKHBrZyk7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBlbGVtZW50ID0gTGlicmFyeVNlcnZpY2UuSU5TVEFOQ0UKLQkJCQkuY3JlYXRlUGx1Z2luU2VydmljZShwbHVnaW4pLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cpOwotCQllbGVtZW50LnNldE5hbWUobmFtZSk7Ci0JCWVsZW1lbnQuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbnRlbnREZXNjcmlwdGlvbiBkZXNjLCBTdHJpbmcgbmFtZSwKLQkJCVN0cmluZyBjb250ZW50KSB7Ci0JCVNlY3Rpb24gZSA9IFVtYUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3Rpb24oKTsKLQkJZS5zZXRTZWN0aW9uTmFtZShuYW1lKTsKLQkJZS5zZXRTZWN0aW9uRGVzY3JpcHRpb24oY29udGVudCk7Ci0JCWUuc2V0R3VpZChFY29yZVV0aWwuZ2VuZXJhdGVVVUlEKCkpOwotCi0JCWRlc2MuZ2V0U2VjdGlvbnMoKS5hZGQoZSk7Ci0KLQkJcmV0dXJuIGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDYXBhYmlsaXR5UGF0dGVybiBjcmVhdGVDYXBhYmlsaXR5UGF0dGVybigKLQkJCU1ldGhvZFBsdWdpbiBwbHVnaW4sIFN0cmluZyBuYW1lLCBNZXRob2RDb25maWd1cmF0aW9uIGRlZmF1bHRDb25maWcpIHsKLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKAotCQkJCXBsdWdpbikuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4oZGVmYXVsdENvbmZpZyk7Ci0JCWNwLnNldE5hbWUobmFtZSk7Ci0JCSgoUHJvY2Vzc0NvbXBvbmVudCkgY3AuZUNvbnRhaW5lcigpKS5zZXROYW1lKG5hbWUpOwotCi0JCXNhdmVMaWJyYXJ5KCk7Ci0KLQkJcmV0dXJuIGNwOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQWN0aXZpdHkgY3JlYXRlQWN0aXZpdHkoTWV0aG9kUGx1Z2luIHBsdWdpbiwKLQkJCUFjdGl2aXR5IHN1cGVyQWN0aXZpdHksIFN0cmluZyBuYW1lLCBUYXNrW10gdGFza3MpIHsKLQkJUGx1Z2luU2VydmljZSBzdmMgPSBMaWJyYXJ5U2VydmljZS5JTlNUQU5DRS5jcmVhdGVQbHVnaW5TZXJ2aWNlKHBsdWdpbik7Ci0JCUFjdGl2aXR5IGFjdCA9IHN2Yy5jcmVhdGVBY3Rpdml0eShzdXBlckFjdGl2aXR5KTsKLQkJYWN0LnNldE5hbWUobmFtZSk7Ci0JCXNhdmVMaWJyYXJ5KCk7Ci0KLQkJaWYgKHRhc2tzICE9IG51bGwgJiYgdGFza3MubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykgewotCQkJCXN2Yy5hZGRUYXNrVG9BY3Rpdml0eShhY3QsIHRhc2tzW2ldKTsKLQkJCX0KLQkJCXNhdmVMaWJyYXJ5KCk7Ci0JCX0KLQotCQlyZXR1cm4gYWN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRFeHRlbmRzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQllbGVtZW50LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuRVhURU5EUyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENvbnRyaWJ1dGVzKFZhcmlhYmlsaXR5RWxlbWVudCBlbGVtZW50LAotCQkJVmFyaWFiaWxpdHlFbGVtZW50IGJhc2UpIHsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eUJhc2VkT25FbGVtZW50KGJhc2UpOwotCQllbGVtZW50LnNldFZhcmlhYmlsaXR5VHlwZShWYXJpYWJpbGl0eVR5cGUuQ09OVFJJQlVURVMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZXBsYWNlcyhWYXJpYWJpbGl0eUVsZW1lbnQgZWxlbWVudCwKLQkJCVZhcmlhYmlsaXR5RWxlbWVudCBiYXNlKSB7Ci0JCWVsZW1lbnQuc2V0VmFyaWFiaWxpdHlCYXNlZE9uRWxlbWVudChiYXNlKTsKLQkJZWxlbWVudC5zZXRWYXJpYWJpbGl0eVR5cGUoVmFyaWFiaWxpdHlUeXBlLlJFUExBQ0VTKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0cy5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9MaWJyYXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJiNzc1YS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL0xpYnJhcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLlRlc3RDb21tYW5kRmlsZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydC5Db25maWdFeHBvcnRJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0LlBsdWdpbkV4cG9ydEltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQuWG1sRXhwb3J0SW1wb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkFjdGl2aXR5VmFyaWFiaWxpdHlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkF0dHJpYnV0ZUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkNvcHlyaWdodFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHkuSW5jb21pbmcwMUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LkluY29taW5nMG5GZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eS5PdXRnb2luZzAxRmVhdHVyZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHkuT3V0Z29pbmcwbkZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5LlJlZ3Jlc3Npb25UZXN0OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciB0aGUgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkgY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTGlicmFyeVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShMaWJyYXJ5VGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlicmFyeVNlcnZpY2VUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE91dGdvaW5nMDFGZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPdXRnb2luZzBuRmVhdHVyZVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSW5jb21pbmcwMUZlYXR1cmVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluY29taW5nMG5GZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdHRyaWJ1dGVGZWF0dXJlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb3B5cmlnaHRUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZ3Jlc3Npb25UZXN0LmNsYXNzKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBY3Rpdml0eVZhcmlhYmlsaXR5VGVzdC5jbGFzcyk7CQotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRlc3RDb21tYW5kRmlsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBsdWdpbkV4cG9ydEltcG9ydC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25maWdFeHBvcnRJbXBvcnQuY2xhc3MpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEV4cG9ydEltcG9ydC5jbGFzcyk7Ci0JCQotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvVGVzdHNQbHVnaW4uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2YWQyMy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL1Rlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9Db3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vL0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vL3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vL2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy9Db250cmlidXRvcnM6Ci0vL0lCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0qIFRoZSBUZXN0cyBwbHVnLWluIGNsYXNzLgotKiAKLSogQGF1dGhvcglXZWlwaW5nIEx1Ci0qIEBzaW5jZQkxLjAKLSovCi1wdWJsaWMgY2xhc3MgVGVzdHNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBUZXN0c1BsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFRlc3RzUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24uCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcGYudW1hLmNvcmUucGx1Z2luLkFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVwZi51bWEuY29yZS5wbHVnaW4uQWJzdHJhY3RQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIHBsdWctaW4gaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9Db25maWdFeHBvcnRJbXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMjI5OS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9Db25maWdFeHBvcnRJbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnRXhwb3J0SW1wb3J0IGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdEltcGwgewotCi0JcHVibGljIENvbmZpZ0V4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQkJCi0JCQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IENvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQkJCQotCQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0NvbmZpZ0V4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5M2FjZDguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5SnVuaXRUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb3B5TGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0ltcG9ydENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3BlbkxpYnJhcnk7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWdFeHBvcnRJbXBvcnRUZXN0MDAwMSBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlIHsKLQkKLQlwdWJsaWMgQ29uZmlnRXhwb3J0SW1wb3J0VGVzdDAwMDEoRXhwb3J0SW1wb3J0VGVzdEltcGwgb3duZXIpIHsKLQkJc3VwZXIob3duZXIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKFN0cmluZyB0ZXN0TmFtZSkgewotCQlMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlID0gZ2V0T3duZXIoKS5nZXRTZXJ2aWNlKCk7Ci0JCQotCQlUZXN0Q29tbWFuZCB0Y3NbXSA9IG5ldyBUZXN0Q29tbWFuZFs2XTsKLQkJCi0JCXRjc1swXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb3B5TGlicmFyeS5jbGFzcyk7Ci0JCXRjc1swXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7Ci0JCQotCQl0Y3NbMV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzJdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0V4cG9ydENvbmZpZ3VyYXRpb24uY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCXRjc1syXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfU2VsZWN0ZWRDb25maWdOYW1lLCAiQ29uZmlnIEEiKTsKLQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRDb25maWd1cmF0aW9uLmNsYXNzKTsKLQkJdGNzWzRdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9JbXBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzVdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvbXBhcmVUb0xpYnJhcnkuY2xhc3MpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0dvbGRlbkxpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9FeHBvcnRJbXBvcnQuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVkMmRhLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuZXhwb3J0aW1wb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5RYVRlc3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5UZXN0Rm9sZGVyU2V0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuVGVzdHNQbHVnaW47Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEV4cG9ydEltcG9ydCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgdGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZSAoVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEluc3RhbGxQYXRoKCkgKyAgCi0JCSJMaWJyYXJpZXMiICsgRmlsZS5zZXBhcmF0b3IgKyAiMS4wLjAiICsgRmlsZS5zZXBhcmF0b3IgKyAiRXhwb3J0SW1wb3J0Iik7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGVzdFJvb3RQYXJlbnQgPSAgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yIAotCQkJCQkJCQkJKyAiRVBGIiArIEZpbGUuc2VwYXJhdG9yICsgInRlc3QiICsgRmlsZS5zZXBhcmF0b3I7Ci0KLQkKLQkKLQlwcml2YXRlIFFhVGVzdFNlcnZpY2Ugc2VydmljZSA9IG5ldwlRYVRlc3RTZXJ2aWNlKG5ldyBUZXN0Rm9sZGVyU2V0dXAoKSwgdHJ1ZSk7Ci0JCi0JcHVibGljIEV4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhc2UoKSB7CQkKLQkJZmluYWwgU3RyaW5nIGZpbGVOYW1lID0gIjFzdFRlc3QudGMiOwotCQlGaWxlRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCQlyZXR1cm4gcGF0aG5hbWUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoZmlsZU5hbWUpOwotCQkJfTsJCQkKLQkJfTsKLQkJCi0JCUZpbGUgZmlsZXNbXSA9IHRlc3RSb290U291cmNlLmxpc3RGaWxlcyhmaWx0ZXIpOwotCQlpZiAoZmlsZXMgPT0gbnVsbCB8fCBmaWxlcy5sZW5ndGggPT0gMCkgewotCQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZSArICIgY2Fubm90IGJlIGZvdW5kISIsIGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUodGVzdFJvb3RQYXJlbnQgKyAiRXhwb3J0SW1wb3J0T25lQ2FzZSIpOwotCQlTdHJpbmcgZXJyb3JNc2cgPSBzZXJ2aWNlLnJ1bkNhc2UodGVzdFJvb3RTb3VyY2UsIHRlc3RSb290V29ya2luZywgZmlsZXNbMF0pOwotCQlhc3NlcnRUcnVlKGVycm9yTXNnLCBlcnJvck1zZy5sZW5ndGgoKSA9PSAwKTsKLQl9CQotCQkJCi0JcHVibGljIHZvaWQgdGVzdExvY2FsQ2FzZXMoKSB7Ci0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gbmV3IEZpbGUodGVzdFJvb3RQYXJlbnQgKyAiRXhwb3J0SW1wb3J0Iik7CQkKLQkJU3RyaW5nIGVycm9yTXNnID0gc2VydmljZS5ydW5Mb2NhbENhc2VzKHRlc3RSb290U291cmNlLCB0ZXN0Um9vdFdvcmtpbmcpOwotCQlhc3NlcnRUcnVlKGVycm9yTXNnLCBlcnJvck1zZy5sZW5ndGgoKSA9PSAwKTsKLQl9CQotCQkJCQotCQkJCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L0V4cG9ydEltcG9ydFRlc3RNZXRob2RCYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzc1YzcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JcHJpdmF0ZSBFeHBvcnRJbXBvcnRUZXN0SW1wbCBvd25lcjsKLQkKLQlwdWJsaWMgRXhwb3J0SW1wb3J0VGVzdE1ldGhvZEJhc2UoRXhwb3J0SW1wb3J0VGVzdEltcGwgb3duZXIpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgRXhwb3J0SW1wb3J0VGVzdEltcGwgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiBvd25lcjsKLQl9CQotCQotCWFic3RyYWN0IHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoU3RyaW5nIHRlc3ROYW1lKTsKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvUGx1Z2luRXhwb3J0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjRmMmMuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvUGx1Z2luRXhwb3J0SW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkV4cG9ydEltcG9ydCBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBQbHVnaW5FeHBvcnRJbXBvcnQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkJCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsJCQotCQllbmRTZXRVcCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWVuZFRlYXJEb3duKCk7Ci0JfQkKLQkKLQlwdWJsaWMgaW50IG51bVRlc3RDYXNlcygpIHsKLQkJcmV0dXJuIDE7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IFBsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9QbHVnaW5FeHBvcnRJbXBvcnRUZXN0MDAwMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODAyZWQ1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1BsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ0NvbXBhcmVUb0xpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29weUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDRXhwb3J0UGx1Z2luczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENJbXBvcnRQbHVnaW5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luRXhwb3J0SW1wb3J0VGVzdDAwMDEgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JCi0JcHVibGljIFBsdWdpbkV4cG9ydEltcG9ydFRlc3QwMDAxKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXN1cGVyKG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgdGVzdE5hbWUpIHsJCQotCQlMaWJyYXJ5SnVuaXRUZXN0U2VydmljZSBzZXJ2aWNlID0gZ2V0T3duZXIoKS5nZXRTZXJ2aWNlKCk7Ci0JCQotCQlUZXN0Q29tbWFuZCB0Y3NbXSA9IG5ldyBUZXN0Q29tbWFuZFs2XTsKLQkJCi0JCXRjc1swXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENDb3B5TGlicmFyeS5jbGFzcyk7Ci0JCXRjc1swXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7Ci0JCQotCQl0Y3NbMV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzJdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0V4cG9ydFBsdWdpbnMuY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRQbHVnaW5zLmNsYXNzKTsKLQkJdGNzWzRdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9JbXBvcnRGb2xkZXJOYW1lLCAiRXhwb3J0MDAwMSIpOwotCQkKLQkJdGNzWzVdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ0NvbXBhcmVUb0xpYnJhcnkuY2xhc3MpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0dvbGRlbkxpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1N0YW5kQWxvbmVUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL2V4cG9ydGltcG9ydC9TdGFuZEFsb25lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVhMGY1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1N0YW5kQWxvbmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuaW1wb3J0aW5nLnNlcnZpY2VzLkNvbmZpZ3VyYXRpb25JbXBvcnRTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuVGVzdENvbW1hbmRNZ3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RMaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3RhbmRBbG9uZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIExpYnJhcnlUZXN0U2VydmljZSBzZXJ2aWNlID0gTGlicmFyeVRlc3RTZXJ2aWNlLmdldEluc3RhbmNlKCk7Ci0JCi0JcHVibGljIFN0YW5kQWxvbmVUZXN0KCkgewotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdDAwMDEoKSB7Ci0KLSAJCS8vTGlicmFyeURpZmZBbmFseXpvci5zZXRUcmltKHRydWUpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3Iuc2V0VXNlTmFtZUFzMm5kSWQodHJ1ZSk7Ci0JCS8vTGlicmFyeURpZmZBbmFseXpvci5hZGRFeGNsdWRlZEZlYXR1cmUoInZlcnNpb24iKTsKLQkJLy9MaWJyYXJ5RGlmZkFuYWx5em9yLmFkZEV4Y2x1ZGVkRmVhdHVyZSgibmFtZSIpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJwcmVzZW50YXRpb25OYW1lIik7Ci0JCS8vTGlicmFyeURpZmZBbmFseXpvci5hZGRFeGNsdWRlZEZlYXR1cmUoIm1haW5EZXNjcmlwdGlvbiIpOwotCQkvL0xpYnJhcnlEaWZmQW5hbHl6b3IuYWRkRXhjbHVkZWRGZWF0dXJlKCJzZWN0aW9uRGVzY3JpcHRpb24iKTsJCi0JCQotCQlUZXN0Q29tbWFuZE1nciB0Y01nciA9IG5ldyBUZXN0Q29tbWFuZE1ncih0cnVlKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxMaWJzXFw3MlxcIik7Ci0JCXRjTWdyLm9wZW5DdXJyVGVzdERpcihmaWxlKTsKLQkJCi0JCVN0cmluZyBsaWIxUGF0aCA9ICJDOlxcTGlic1xcNzJcXE9wZW5VcDcyIjsKLQkJU3RyaW5nIGxpYjJQYXRoID0gIkM6XFxMaWJzXFw3MlxcYSI7CQkKLQkJTWV0aG9kTGlicmFyeSBsaWIxID0gc2VydmljZS5sb2FkTGlicmFyeShsaWIxUGF0aCk7Ci0JCU1ldGhvZExpYnJhcnkgbGliMiA9IHNlcnZpY2UubG9hZExpYnJhcnkobGliMlBhdGgpOwotCQlDb25maWd1cmF0aW9uSW1wb3J0U2VydmljZS5maXhJbXBvcnRMaWJyYXJ5U3lzdGVtUGFja2FnZUdVSURzKGxpYjEsIGxpYjIpOwotCQl0Y01nci50cmFjZSgiQ29tcGFyaW5nIGxpYnJhcmllcyAtPiBCZWdpbiIpOwotCQl0Y01nci50cmFjZSgibGliMTogIiArIGxpYjFQYXRoKTsKLQkJdGNNZ3IudHJhY2UoImxpYjI6ICIgKyBsaWIyUGF0aCk7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSB0Y01nci5jb21wYXJlTGlicyhsaWIxLCBsaWIyLCAwLCAwLCB0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQpOwotCQl0Y01nci50cmFjZSgiQ29tcGFyaW5nIGxpYnJhcmllcyA8LSBFbmQgIik7Ci0JfQkJCi0JCQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYmQ5NGYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5leHBvcnRpbXBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5FeHBvcnRJbXBvcnRUZXN0SW1wbDsKLQotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhwb3J0SW1wb3J0IGV4dGVuZHMgRXhwb3J0SW1wb3J0VGVzdEltcGwgewotCi0JcHVibGljIFhtbEV4cG9ydEltcG9ydChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MDAwMV8xKCkgewotCQlnZXRTZXJ2aWNlKCkudHJhY2UoIkJlZ2luIC0+IHRlc3QwMDAxXzEiKTsKLQkJbmV3IFhtbEV4cG9ydEltcG9ydFRlc3QwMDAxKHRoaXMpLmV4ZWN1dGUoInRlc3QwMDAxXzEiKTsKLQkJZ2V0U2VydmljZSgpLnRyYWNlKCJFbmQgICAtPiB0ZXN0MDAwMV8xIik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvZXhwb3J0aW1wb3J0L1htbEV4cG9ydEltcG9ydFRlc3QwMDAxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDE1MjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy9leHBvcnRpbXBvcnQvWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLmV4cG9ydGltcG9ydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5MaWJyYXJ5SnVuaXRUZXN0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVENFeGVSZXBseTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaWZhY2UuVGVzdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwuRXhwb3J0SW1wb3J0VGVzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDQ29tcGFyZVRvTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENDb3B5TGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC50ZXN0Y29tbWFuZHMuVENFeHBvcnRYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDSW1wb3J0WG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ09wZW5MaWJyYXJ5OwotCi0vKioKLSAqIEpVbml0IHRlc3RzIGZvciBwbHVnaW4gZXhwb3J0L2ltcG9ydAotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgWG1sRXhwb3J0SW1wb3J0VGVzdDAwMDEgZXh0ZW5kcyBFeHBvcnRJbXBvcnRUZXN0TWV0aG9kQmFzZSB7Ci0JCi0JcHVibGljIFhtbEV4cG9ydEltcG9ydFRlc3QwMDAxKEV4cG9ydEltcG9ydFRlc3RJbXBsIG93bmVyKSB7Ci0JCXN1cGVyKG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShTdHJpbmcgdGVzdE5hbWUpIHsKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldE93bmVyKCkuZ2V0U2VydmljZSgpOwotCQkKLQkJVGVzdENvbW1hbmQgdGNzW10gPSBuZXcgVGVzdENvbW1hbmRbNl07Ci0JCQotCQl0Y3NbMF0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29weUxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbMF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJQYXJpcyIpOwotCQkKLQkJdGNzWzFdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiUGFyaXMiKTsKLQkJCi0JCXRjc1syXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENFeHBvcnRYbWwuY2xhc3MpOwotCQl0Y3NbMl0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0V4cG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbM10gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDT3BlbkxpYnJhcnkuY2xhc3MpOwotCQl0Y3NbM10uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0xpYkZvbGRlck5hbWUsICJCYXNlXzEiKTsKLQkJCi0JCXRjc1s0XSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENJbXBvcnRYbWwuY2xhc3MpOwotCQl0Y3NbNF0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0ltcG9ydEZvbGRlck5hbWUsICJFeHBvcnQwMDAxIik7Ci0JCQotCQl0Y3NbNV0gPSBzZXJ2aWNlLm5ld1Rlc3RDb21tYW5kKFRDQ29tcGFyZVRvTGlicmFyeS5jbGFzcyk7Ci0JCXRjc1s1XS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfR29sZGVuTGliRm9sZGVyTmFtZSwgIlBhcmlzIik7CQkKLQkJdGNzWzVdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9EaWZmQ291bnQsICIyOCIpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX0VsZW1lbnRDb3VudCwgIjM3MCIpOwotCQl0Y3NbNV0uc2V0QXR0cmlidXRlKFRlc3RDb21tYW5kLkFUX1VzZU5hbWVBc0lkLCAidHJ1ZSIpOwotCQkKLQkJYm9vbGVhbiBwYXNzaW5nID0gdHJ1ZTsKLQkJZm9yIChpbnQgaT0wOyBpPHRjcy5sZW5ndGg7IGkrKykgewotCQkJVENFeGVSZXBseSByZXBseSA9IHRjc1tpXS5leGVjdXRlKCk7Ci0JCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCXBhc3NpbmcgPSBmYWxzZTsKLQkJCX0JCQkJCi0JCX0KLQkJZ2V0T3duZXIoKS5hc3NlcnRUcnVlKHBhc3NpbmcpOwotCQkKLQkJcmV0dXJuIHBhc3Npbmc7Ci0JfQkJCQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YWxpZGF0aW9uL0NpcmN1bGFyRGVwZW5kZW5jeUNoZWNrLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y3NThjZi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vQ2lyY3VsYXJEZXBlbmRlbmN5Q2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuTGlicmFyeUp1bml0VGVzdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRDRXhlUmVwbHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmlmYWNlLlRlc3RDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLkV4cG9ydEltcG9ydFRlc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3Rlci5pbXBsLnRlc3Rjb21tYW5kcy5UQ05ld01ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdGVyLmltcGwudGVzdGNvbW1hbmRzLlRDT3BlbkxpYnJhcnk7Ci0KLS8qKgotICogSlVuaXQgdGVzdHMgZm9yIHBsdWdpbiBleHBvcnQvaW1wb3J0Ci0gKiAKLSAqIEBhdXRob3IgV2VpcGluZyBMdQotICogQHNpbmNlIDEuMAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayBleHRlbmRzIEV4cG9ydEltcG9ydFRlc3RJbXBsIHsKLQotCXB1YmxpYyBDaXJjdWxhckRlcGVuZGVuY3lDaGVjayhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwkJCi0JCWVuZFNldFVwKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZW5kVGVhckRvd24oKTsKLQl9CQotCQotCXB1YmxpYyBpbnQgbnVtVGVzdENhc2VzKCkgewotCQlyZXR1cm4gMTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3QwMDAxXzE2OTUwMSgpIHsKLQkJTGlicmFyeUp1bml0VGVzdFNlcnZpY2Ugc2VydmljZSA9IGdldFNlcnZpY2UoKTsKLQkJCi0JCVRlc3RDb21tYW5kIHRjc1tdID0gbmV3IFRlc3RDb21tYW5kWzhdOwotCQkKLQkJdGNzWzBdID0gc2VydmljZS5uZXdUZXN0Q29tbWFuZChUQ09wZW5MaWJyYXJ5LmNsYXNzKTsKLQkJdGNzWzBdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9MaWJGb2xkZXJOYW1lLCAiMTY5NTAxIik7Ci0JCQotLyoJCXRjc1sxXSA9IHNlcnZpY2UubmV3VGVzdENvbW1hbmQoVENOZXdNZXRob2RFbGVtZW50LmNsYXNzKTsKLQkJdGNzWzFdLnNldEF0dHJpYnV0ZShUZXN0Q29tbWFuZC5BVF9UeXBlLCAiTWV0aG9kUGx1Z2luIik7Ci0JCXRjc1sxXS5zZXRBdHRyaWJ1dGUoVGVzdENvbW1hbmQuQVRfTmFtZSwgIlBsdWcgQSIpOwkqLwkJCQkJCQkJCQkJCi0JCQotCQlib29sZWFuIHBhc3NpbmcgPSB0cnVlOwotCQlmb3IgKGludCBpPTA7IGk8dGNzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGNzW2ldICE9IG51bGwpIHsKLQkJCQlUQ0V4ZVJlcGx5IHJlcGx5ID0gdGNzW2ldLmV4ZWN1dGUoKTsKLQkJCQlpZiAocmVwbHkgIT0gbnVsbCAmJiAhIHJlcGx5LnBhc3NpbmcoKSkgewotCQkJCQlwYXNzaW5nID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUocGFzc2luZyk7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdEltcGwuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFsaWRhdGlvbi9WYWxpZGF0aW9uVGVzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiNzNmNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblRlc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0ZXIuaW1wbC5MaWJyYXJ5SnVuaXRUZXN0SW1wbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgcGx1Z2luIGV4cG9ydC9pbXBvcnQKLSAqIAotICogQGF1dGhvciBXZWlwaW5nIEx1Ci0gKiBAc2luY2UgMS4wCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpb25UZXN0SW1wbCBleHRlbmRzIExpYnJhcnlKdW5pdFRlc3RJbXBsIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc291cmNlRm9sZGVyTmFtZSA9ICJWYWxpZGF0aW9uIjsKLQlwcml2YXRlIHN0YXRpYyAgRmlsZSB0ZXN0Um9vdFNvdXJjZTsKLQotCXByaXZhdGUgc3RhdGljIE1hcCB0ZXN0Um9vdFdvcmtpbmdNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCXByaXZhdGUgRmlsZSBkZWZhdWx0VGVzdERpcjsgCi0JCi0JcHVibGljIFZhbGlkYXRpb25UZXN0SW1wbChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBGaWxlIGdldFRlc3RSb290U291cmNlKCkgewotCQlpZiAodGVzdFJvb3RTb3VyY2UgPT0gbnVsbCkgewotCQkJU3RyaW5nIHBhdGggPSBnZXRTZXJ2aWNlKCkuZ2V0VG9wVGVzdFJvb3RTb3VyY2UoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCXBhdGggKz0gRmlsZS5zZXBhcmF0b3IgKyBzb3VyY2VGb2xkZXJOYW1lICsgIEZpbGUuc2VwYXJhdG9yOwotCQkJdGVzdFJvb3RTb3VyY2UgPSBuZXcgRmlsZShwYXRoKTsKLQkJfQotCQlyZXR1cm4gdGVzdFJvb3RTb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRmlsZSBnZXRUZXN0Um9vdFdvcmtpbmcoKSB7Ci0JCUZpbGUgdGVzdFJvb3RXb3JraW5nID0gKEZpbGUpIHRlc3RSb290V29ya2luZ01hcC5nZXQoZ2V0Q2xhc3MoKSk7Ci0JCWlmICh0ZXN0Um9vdFdvcmtpbmcgPT0gbnVsbCkgewotCQkJQ2xhc3MgY2xzID0gZ2V0Q2xhc3MoKTsKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IGNscy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCQkJCi0JCQlTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIGhoOm1tOnNzOlNTUyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZHRTdHIgPSBzZGYuZm9ybWF0KG5ldyBEYXRlKCkpOwotCQkJZHRTdHIgPSBkdFN0ci5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCWR0U3RyID0gZHRTdHIucmVwbGFjZSgnOicsICctJyk7Ci0JCQkKLQkJCVN0cmluZyBwYXRoID0gZ2V0U2VydmljZSgpLmdldFRlc3RHcm91cCgpLmdldEFic29sdXRlUGF0aCgpOwotCQkJcGF0aCArPSBGaWxlLnNlcGFyYXRvciArIGNscy5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCgpICsgMSk7Ci0JCQlwYXRoICs9ICJfIiArIGR0U3RyICsgRmlsZS5zZXBhcmF0b3I7Ci0JCQl0ZXN0Um9vdFdvcmtpbmcgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXRlc3RSb290V29ya2luZ01hcC5wdXQoZ2V0Q2xhc3MoKSwgdGVzdFJvb3RXb3JraW5nKTsKLQkJfQotCQlyZXR1cm4gdGVzdFJvb3RXb3JraW5nOwotCX0KLQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXREZWZhdWx0VGVzdERpcigpIHsKLQkJaWYgKGRlZmF1bHRUZXN0RGlyID09IG51bGwpIHsKLQkJCVN0cmluZyBwYXRoID0gZ2V0VGVzdFJvb3RXb3JraW5nKCkuZ2V0QWJzb2x1dGVQYXRoKCkgKyBGaWxlLnNlcGFyYXRvciArIGdldE5hbWUoKTsgCi0JCQlkZWZhdWx0VGVzdERpciA9IG5ldyBGaWxlKHBhdGgpOwotCQl9Ci0JCQotCQlyZXR1cm4gZGVmYXVsdFRlc3REaXI7Ci0JfQotCQkKLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3YjYxOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0FjdGl2aXR5VmFyaWFiaWxpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQWN0aXZpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNhcGFiaWxpdHlQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUHJvY2Vzc0NvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVW1hUGFja2FnZTsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGFjdGl2aXR5IHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZpdHlWYXJpYWJpbGl0eVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFjdGl2aXR5VmFyaWFiaWxpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2NwX2NvbnRyaWJ1dGlvbl9mb3JfYXR0cmlidXRlcygpIHsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0KLQkJLy8gbm93IGNyZWF0ZSBhIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDEiLCBjb25maWcpOwotCQkKLQkJLy8gbm93IGNyZWF0ZSBhIGNvbnRyaWJ1dGluZyBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AyIiwgY29uZmlnKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGNwMiwgY3AxKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMS5lQ29udGFpbmVyKCkpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDIuZUNvbnRhaW5lcigpKTsKLQkJCi0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCWZpbmFsIFN0cmluZyBjcDFfdGV4dCA9ICJjcDEgbWFpbiBkZXNjIjsKLQkJZmluYWwgU3RyaW5nIGNwMl90ZXh0ID0gImNwMiBtYWluIGRlc2MiOwotCQkJCi0JCWNwMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY3AxX3RleHQpOwotCQljcDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNwMl90ZXh0KTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgIHRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZShjcDEuZ2V0UHJlc2VudGF0aW9uKCksIGNwMSwgZmVhdHVyZSwgY29uZmlnKTsKLQkJaW50IGkxID0gdGV4dC5pbmRleE9mKGNwMV90ZXh0KTsKLQkJaW50IGkyID0gdGV4dC5pbmRleE9mKGNwMl90ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShpMSA+PSAwICk7Ci0JCWFzc2VydFRydWUoaTIgPiBpMSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfY3BfY29udHJpYnV0aW9uX2Zvcl9ndWlkYW5jZXMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCUNoZWNrbGlzdCBjazEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiY2sxIik7Ci0JCUNoZWNrbGlzdCBjazIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiY2syIik7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCi0JCS8vIG5vdyBjcmVhdGUgYSBjYXBhYmlsaXR5IHBhdHRlcm4KLQkJQ2FwYWJpbGl0eVBhdHRlcm4gY3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2FwYWJpbGl0eVBhdHRlcm4ocGx1Z2luLCAiQ1AxIiwgY29uZmlnKTsKLQkJY3AxLmdldENoZWNrbGlzdHMoKS5hZGQoY2sxKTsKLQkJCi0JCS8vIG5vdyBjcmVhdGUgYSBjb250cmlidXRpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7Ci0JCWNwMi5nZXRDaGVja2xpc3RzKCkuYWRkKGNrMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhjcDIsIGNwMSk7Ci0JCQotCQkvLyB1cGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24KLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDEuZUNvbnRhaW5lcigpKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AyLmVDb250YWluZXIoKSk7Ci0JCQotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEJyZWFrZG93bkVsZW1lbnRfQ2hlY2tsaXN0cygpOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoY3AxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoY2sxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoY2syKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfY3BfY29udHJpYnV0aW9uX2Zvcl9icmVha2Rvd25FbGVtZW50cygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgImFjdDEiLCBudWxsKTsKLQkJCi0JCS8vIG5vdyBjcmVhdGUgYSBjb250cmlidXRpbmcgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMiIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMiwgImFjdDIiLCBudWxsKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGNwMiwgY3AxKTsKLQkJCi0JCS8vIHVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbgotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMS5lQ29udGFpbmVyKCkpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZCgoUHJvY2Vzc0NvbXBvbmVudCljcDIuZUNvbnRhaW5lcigpKTsKLQkJCi0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWN0aXZpdHlfQnJlYWtkb3duRWxlbWVudHMoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGNwMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGFjdDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhY3QyKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfYWN0aXZpdHlfYnJlYWtkb3duRWxlbWVudHNfd2l0aF9jb250cmlidXRvcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJCi0JCS8vIGZpcnN0IHNldCBvZiB0YXNrLCByb2xlLCB3cHMKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExMSIpOwotCQlBcnRpZmFjdCBhMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEyIik7Ci0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIxKTsKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTFfMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGExXzIpOwotCQl0MS5nZXRPdXRwdXQoKS5hZGQoYTFfMik7Ci0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExXzEpOwotCQkKLQkJLy8gc2Vjb25kIHNldCBvZiB0YXNrLCByb2xlLCB3cHMKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAidDIiKTsKLQkJQXJ0aWZhY3QgYTJfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyMSIpOwotCQlBcnRpZmFjdCBhMl8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIyIik7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTJfMSk7Ci0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyXzIpOwotCQl0Mi5nZXRPdXRwdXQoKS5hZGQoYTJfMik7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyXzEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQotCQkvLyBub3cgY3JlYXRlIGEgY2FwYWJpbGl0eSBwYXR0ZXJuCi0JCUNhcGFiaWxpdHlQYXR0ZXJuIGNwMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNhcGFiaWxpdHlQYXR0ZXJuKHBsdWdpbiwgIkNQMSIsIGNvbmZpZyk7Ci0JCUFjdGl2aXR5IGFjdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBY3Rpdml0eShwbHVnaW4sIGNwMSwgImFjdDEiLCBuZXcgVGFza1tde3QxfSk7Ci0JCQotCQkvLyBub3cgY3JlYXRlIGEgY29udHJpYnV0aW5nIGNhcGFiaWxpdHkgcGF0dGVybgotCQlDYXBhYmlsaXR5UGF0dGVybiBjcDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDYXBhYmlsaXR5UGF0dGVybihwbHVnaW4sICJDUDIiLCBjb25maWcpOwotCQlBY3Rpdml0eSBhY3QyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQWN0aXZpdHkocGx1Z2luLCBjcDEsICJhY3QyIiwgbmV3IFRhc2tbXXt0Mn0pOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoY3AyLCBjcDEpOwotCQkKLQkJLy8gdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uCi0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQoKFByb2Nlc3NDb21wb25lbnQpY3AxLmVDb250YWluZXIoKSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKChQcm9jZXNzQ29tcG9uZW50KWNwMi5lQ29udGFpbmVyKCkpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldEFjdGl2aXR5X0JyZWFrZG93bkVsZW1lbnRzKCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShjcDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhY3QxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYWN0MikpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzMzg4NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0F0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgYXR0cmlidXRlIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVGZWF0dXJlVGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX01haW5EZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgdGV4dDsKLQkJCi0JCWZpbmFsIFN0cmluZyB0MXRleHQgPSAiLS10MSB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDJ0ZXh0ID0gIi0tdDIgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQzdGV4dCA9ICItLXQzIHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQydGV4dCk7Ci0JCXQzLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0M3RleHQpOwotCQkKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQxLmdldFByZXNlbnRhdGlvbigpLCB0MSwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQxdGV4dCwgdGV4dCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MiwgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDEuZ2V0UHJlc2VudGF0aW9uKCksIHQxLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRUcnVlKHRleHQgIT0gbnVsbCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDF0ZXh0KSA+PSAwIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MnRleHQpID49IDAgKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0MS5nZXRQcmVzZW50YXRpb24oKSwgdDEsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydFRydWUodGV4dCAhPSBudWxsIAotCQkJCSYmIHRleHQuaW5kZXhPZih0MXRleHQpID49IDAgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQydGV4dCkgPj0gMCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDN0ZXh0KSA+PSAwICk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX21haW5EZXNjcmlwdGlvbl93aXRoX3JlcGxhY2VycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9NYWluRGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIHRleHQ7Ci0JCVRhc2sgdDsKLQkJCi0JCWZpbmFsIFN0cmluZyB0MXRleHQgPSAiLS10MSB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDJ0ZXh0ID0gIi0tdDIgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQzdGV4dCA9ICItLXQzIHRleHQtLSI7Ci0JCQotCQl0MS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDF0ZXh0KTsKLQkJdDIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQydGV4dCk7Ci0JCXQzLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0M3RleHQpOwotCQkKLQkJLy8gMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQl0ID0gKFRhc2spQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDIsIHQpOyAgLy8gaWYgdGhpcyBmYWlsLCB0aGUgcmVtYWluaW5nIGNvZGUgd2lsbCBub3QgYmUgZXhlY3V0ZWQKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKHQydGV4dCwgdGV4dCk7Ci0JCQotCQkvLyAyCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0Mik7Ci0JCXQgPSAoVGFzaylDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MywgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0LmdldFByZXNlbnRhdGlvbigpLCB0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDN0ZXh0LCB0ZXh0KTsKLQotCQkvLyAzCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0MSk7Ci0JCXQgPSAoVGFzaylDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MSwgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCi0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0LmdldFByZXNlbnRhdGlvbigpLCB0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDF0ZXh0LCB0ZXh0KTsKLQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfbWFpbkRlc2NyaXB0aW9uX3dpdGhfZXh0ZW5kZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0OwotCQkKLQkJZmluYWwgU3RyaW5nIHQxdGV4dCA9ICItLXQxIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0MnRleHQgPSAiLS10MiB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDN0ZXh0ID0gIi0tdDMgdGV4dC0tIjsKLQkJCi0JCXQxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MXRleHQpOwotCQl0My5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDN0ZXh0KTsKLQkKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0PT1udWxsIHx8IHRleHQuZXF1YWxzKCIiKSk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCXRleHQgPSAoU3RyaW5nKUNvbmZpZ3VyYXRpb25IZWxwZXIuY2FsY0F0dHJpYnV0ZUZlYXR1cmVWYWx1ZSh0Mi5nZXRQcmVzZW50YXRpb24oKSwgdDIsIGZlYXR1cmUsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyh0MXRleHQsIHRleHQpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDEpOwotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDMuZ2V0UHJlc2VudGF0aW9uKCksIHQzLCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDN0ZXh0LCB0ZXh0KTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfbWFpbkRlc2NyaXB0aW9uX3dpdGhfcmVwbGFjZXJfY29udHJpYnV0b3JfZXh0ZW5kZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCVRhc2sgdDQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQ0Iik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fTWFpbkRlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyB0ZXh0OwotCQlUYXNrIHQ7Ci0JCQotCQlmaW5hbCBTdHJpbmcgdDF0ZXh0ID0gIi0tdDEgdGV4dC0tIjsKLQkJZmluYWwgU3RyaW5nIHQydGV4dCA9ICItLXQyIHRleHQtLSI7Ci0JCWZpbmFsIFN0cmluZyB0M3RleHQgPSAiLS10MyB0ZXh0LS0iOwotCQlmaW5hbCBTdHJpbmcgdDR0ZXh0ID0gIi0tdDQgdGV4dC0tIjsKLQkJCi0JCXQxLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbih0MXRleHQpOwotCQl0Mi5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24odDJ0ZXh0KTsKLQkJdDMuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQzdGV4dCk7Ci0JCS8vdDQuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKHQ0dGV4dCk7Ci0JCQotCQkvLyAxCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDQsIHQxKTsKLQotCQl0ZXh0ID0gKFN0cmluZylDb25maWd1cmF0aW9uSGVscGVyLmNhbGNBdHRyaWJ1dGVGZWF0dXJlVmFsdWUodDQuZ2V0UHJlc2VudGF0aW9uKCksIHQ0LCBmZWF0dXJlLCBjb25maWcpOwotCQlhc3NlcnRFcXVhbHModDJ0ZXh0LCB0ZXh0KTsKLQkJCi0JCS8vIDIKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQyKTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQ0LmdldFByZXNlbnRhdGlvbigpLCB0NCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQydGV4dCkgPj0gMCAKLQkJCQkmJiB0ZXh0LmluZGV4T2YodDN0ZXh0KSA+PSAwICk7Ci0KLQkJLy8gMyBzaW5jZSB0MyBjb250cmlidXRlcyB0byB0NCwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIGJhc2UgaXMgbm90IGluaGVyaXRlZC4KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQ0KTsKLQkJdGV4dCA9IChTdHJpbmcpQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjQXR0cmlidXRlRmVhdHVyZVZhbHVlKHQ0LmdldFByZXNlbnRhdGlvbigpLCB0NCwgZmVhdHVyZSwgY29uZmlnKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXh0ICE9IG51bGwgCi0JCQkJJiYgdGV4dC5pbmRleE9mKHQzdGV4dCkgPj0gMCApOwotCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9Db3B5cmlnaHRUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0NvcHlyaWdodFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmN2ZkNi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0NvcHlyaWdodFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU3VwcG9ydGluZ01hdGVyaWFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLQotLyoqCi0gKiB0ZXN0IGNhc2UgZm9yIGNvcHlyaWdodCB0ZXh0IHJlYWxpemF0aW9uCi0gKiAKLSAqIFdoZW4gYSBjb250cmlidXRpbmcgZWxlbWVudCBoYXMgYSBjb3B5cmlnaHQsIAotICogaXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBjb3B5cmlnaHQgb2YgdGhlIHBhcmVudCBlbGVtZW50IG9uIHRoZSBmaW5hbCBwdWJsaXNoZWQgcGFnZS4KLQotCUFsc28sIHdoZW4gYW4gZXh0ZW5kaW5nIGVsZW1lbnQgaGFzIGEgY29weXJpZ2h0LCAKLQl0aGUgcHVibGlzaGVkIHBhZ2UgZm9yIHRoZSBleHRlbmRpbmcgZWxlbWVudCBzaG91bGQgCi0JaGF2ZSB0aGUgcGFyZW50IGVsZW1lbnQncyBjb3B5cmlnaHQgZm9sbG93ZWQgYnkgdGhlIGV4dGVuZGluZyBlbGVtZW50cyBjb3B5cmlnaHQuCi0KLQlGb3IgcmVwbGFjZXMsIHRoZSByZXBsYWNpbmcgY29weXJpZ2h0IHNob3VsZCBiZSBwcmVzZW50LgotCQotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5cmlnaHRUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0X3RleHRfMSA9ICI9PT09PT09PT09PT09PT09IFRoaXMgaXMgY29weXJpZ2h0IHRleHQgMSA9PT09PT09PT09PT09PT09PT09IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0X3RleHRfMiA9ICI9PT09PT09PT09PT09PT09IFRoaXMgaXMgY29weXJpZ2h0IHRleHQgMiA9PT09PT09PT09PT09PT09PT09IjsKLQkKLQlwdWJsaWMgQ29weXJpZ2h0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvcHlyaWdodCgpIHsKLQkJCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzEsICJjb3B5cmlnaHQgMSIpOwotCQljb3B5cmlnaHRfMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMSk7Ci0JCXBsdWdpbjEuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8xKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMiIpOwotCQlDb250ZW50UGFja2FnZSBwa2cyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMiwgInAyIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cyLCAiY29weXJpZ2h0IDIiKTsKLQkJY29weXJpZ2h0XzIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzIpOwotCQlwbHVnaW4yLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzEpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjIpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cyKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQkKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMSwgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MiIpOwotCi0JCVN0cmluZyB0ZXh0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQxLCBjb25maWcpOwotCQlpbnQgaW5kZXgxID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzEpOwotCQlhc3NlcnRUcnVlKGluZGV4MT49MCk7Ci0JCQotCQl0ZXh0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDb3B5cmlnaHRUZXh0KHQyLCBjb25maWcpOwotCQlpbnQgaW5kZXgyID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIpOwotCQlhc3NlcnRUcnVlKGluZGV4Mj49MCk7Ci0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4xKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzIpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cxLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMiwgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MyIpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MSwgY29uZmlnKTsKLQkJaW50IGluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsJCQotCQlpbnQgaW5kZXgyID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIpOwotCQlpbnQgaW5kZXgzID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzIsIGluZGV4MiArIGNvcHlyaWdodF90ZXh0XzIubGVuZ3RoKCkpOwotCQlhc3NlcnRUcnVlKGluZGV4MT49MCk7Ci0JCWFzc2VydFRydWUoaW5kZXgyPj0wKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDM8MCk7IC8vIHQyIGFuZCB0MyBoYXMgdGhlIHNhbWUgY29weXJpZ2h0LCBzaG91bGQgb25seSBzaG93IG9uY2UKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9yZXBsYWNlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQkJU3VwcG9ydGluZ01hdGVyaWFsIGNvcHlyaWdodF8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU3VwcG9ydGluZ01hdGVyaWFsKHBrZzEsICJjb3B5cmlnaHQgMSIpOwotCQljb3B5cmlnaHRfMS5nZXRQcmVzZW50YXRpb24oKS5zZXRNYWluRGVzY3JpcHRpb24oY29weXJpZ2h0X3RleHRfMSk7Ci0JCXBsdWdpbjEuc2V0Q29weXJpZ2h0U3RhdGVtZW50KGNvcHlyaWdodF8xKTsKLQkJCi0JCU1ldGhvZFBsdWdpbiBwbHVnaW4yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMiIpOwotCQlDb250ZW50UGFja2FnZSBwa2cyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMiwgInAyIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cyLCAiY29weXJpZ2h0IDIiKTsKLQkJY29weXJpZ2h0XzIuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzIpOwotCQlwbHVnaW4yLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMik7Ci0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0KLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjEpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cxKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4yKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMik7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzEsICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cyLCAidDIiKTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQkKLQkJU3RyaW5nIHRleHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDIsIGNvbmZpZyk7Ci0JCWludCBpbmRleDEgPSB0ZXh0LmluZGV4T2YoY29weXJpZ2h0X3RleHRfMSk7CQkKLQkJaW50IGluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDEgPCAwKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDIgPj0gMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5cmlnaHRfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luMSwgInAxIik7Ci0JCVN1cHBvcnRpbmdNYXRlcmlhbCBjb3B5cmlnaHRfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVN1cHBvcnRpbmdNYXRlcmlhbChwa2cxLCAiY29weXJpZ2h0IDEiKTsKLQkJY29weXJpZ2h0XzEuZ2V0UHJlc2VudGF0aW9uKCkuc2V0TWFpbkRlc2NyaXB0aW9uKGNvcHlyaWdodF90ZXh0XzEpOwotCQlwbHVnaW4xLnNldENvcHlyaWdodFN0YXRlbWVudChjb3B5cmlnaHRfMSk7Ci0JCQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCQlTdXBwb3J0aW5nTWF0ZXJpYWwgY29weXJpZ2h0XzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTdXBwb3J0aW5nTWF0ZXJpYWwocGtnMiwgImNvcHlyaWdodCAyIik7Ci0JCWNvcHlyaWdodF8yLmdldFByZXNlbnRhdGlvbigpLnNldE1haW5EZXNjcmlwdGlvbihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJcGx1Z2luMi5zZXRDb3B5cmlnaHRTdGF0ZW1lbnQoY29weXJpZ2h0XzIpOwotCQlwbHVnaW4yLmdldEJhc2VzKCkuYWRkKHBsdWdpbjEpOwotCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4xKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMSk7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luMik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZzIpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCQotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2cxLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnMiwgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZzIsICJ0MyIpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDIpOwotCQkKLQkJaW50IGluZGV4MSwgaW5kZXgyLCBpbmRleDM7Ci0JCQotCQlTdHJpbmcgdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MSwgY29uZmlnKTsKLQkJaW5kZXgxID0gdGV4dC5pbmRleE9mKGNvcHlyaWdodF90ZXh0XzEpOwkKLQkJYXNzZXJ0VHJ1ZShpbmRleDE+PTApOwotCQkKLQkJdGV4dCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q29weXJpZ2h0VGV4dCh0MiwgY29uZmlnKTsJCi0JCWluZGV4MSA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8xKTsJCi0JCWluZGV4MiA9IHRleHQuaW5kZXhPZihjb3B5cmlnaHRfdGV4dF8yKTsKLQkJYXNzZXJ0VHJ1ZShpbmRleDEgPj0gMCk7Ci0JCWFzc2VydFRydWUoaW5kZXgyID4gaW5kZXgxKTsgLy8gYmFzZSBjb3B5cmlnaHQgY29tZXMgZmlyc3QKLQotCQlTdHJpbmcgdGV4dDMgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENvcHlyaWdodFRleHQodDMsIGNvbmZpZyk7CQotCQlhc3NlcnRFcXVhbHModGV4dCwgdGV4dDMpOyAvLyB0MiBhbmQgdDMgaGFzIHRoZSBzYW1lIGNvcHlyaWdodCwgc2hvdWxkIG9ubHkgc2hvdyBvbmNlLCBzbyBzYW1lIGFzIGFib3ZlCQkKLQl9Ci0JCi0JLyoqCi0JICogUjAwMzgzODU1IC0gU2FtZSBjb3B5cmlnaHQgbWVzc2FnZSBnZXRzIHJlYWxpemVkIHR3aWNlCi0JICogU3RlcHMgdG8gcmVwcm9kdWNlOgotCQkwLiBDcmVhdGUgYSBjb25maWcgaW5jbHVkZSBwbHVnaW4gWCBhbmQgWS4KLQkJMS4gQXNzaWduIGNvcHlyaWdodCBBIHRvIHBsdWdpbiBYLgotCQkyLiBBc3NpZ24gY29weXJpZ2h0IEEgdG8gcGx1Z2luIFkuCi0JCTMuIEhhdmUgYSB0YXNrIE0gaW4gcGx1Z2luIFkgdG8gY29udHJpYnV0ZSB0YXNrIE4gaW4gcGx1Z2luIFguCi0JCTQuIHByZXZpZXcgdGFzayBOIGFuZCB5b3Ugd2lsbCBiZSB0aGUgY29weXJpZ2h0IGRpc3BsYWVkIHR3aWNlIGF0IHRoZSBib3R0b20uCi0JICoKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X1IwMDM4Mzg1NSgpIHsKLQkJCi0JCS8vIHNhbWUgYXMgdGhlIGxhc3QgcGFydCBvZiB0ZXN0Q29weXJpZ2h0X3dpdGhfY29udHJpYnV0b3JzKCkKLQkJdGVzdENvcHlyaWdodF93aXRoX2NvbnRyaWJ1dG9ycygpOwotCX0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvRnVsZmlsbG1lbnRUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0Z1bGZpbGxtZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTEyODYxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvRnVsZmlsbG1lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5Db25maWd1cmF0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRGVmYXVsdEVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkVsZW1lbnRSZWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5MaWJyYXJ5VGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS51dGlsLkxpYnJhcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBmdWxmaWxsbWVudCByZWFsaXphdGlvbgotICogCi0gKiBAYXV0aG9yIFdlaXBpbmcgTHUKLSAqIEBzaW5jZSAxLjUKLSAqLwotcHVibGljIGNsYXNzIEZ1bGZpbGxtZW50VGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRnVsZmlsbG1lbnRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QwMSgpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJCi0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCQotCQlBcnRpZmFjdCBzbG90MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgInNsb3QxIik7Ci0JCUFydGlmYWN0IHNsb3QyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAic2xvdDIiKTsKLQkJc2xvdDEuc2V0SXNBYnN0cmFjdCh0cnVlKTsKLQkJc2xvdDIuc2V0SXNBYnN0cmFjdCh0cnVlKTsKLQkJc2xvdDEuc2V0UHJlc2VudGF0aW9uTmFtZSgiYl9zbG90Iik7Ci0JCXNsb3QyLnNldFByZXNlbnRhdGlvbk5hbWUoImFfc2xvdCIpOwotCQkKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlhMS5nZXRGdWxmaWxscygpLmFkZChzbG90MSk7Ci0JCWExLmdldEZ1bGZpbGxzKCkuYWRkKHNsb3QyKTsKLQkJCi0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsKLQkJYTIuZ2V0RnVsZmlsbHMoKS5hZGQoc2xvdDEpOwotCQlhMi5nZXRGdWxmaWxscygpLmFkZChzbG90Mik7Ci0JCQotCQlhMS5zZXRQcmVzZW50YXRpb25OYW1lKCJiX2ExIik7Ci0JCWEyLnNldFByZXNlbnRhdGlvbk5hbWUoImFfYTIiKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmU7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZTsKLQkJTGlzdCBpdGVtczsKLQkJCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHNsb3QxKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoc2xvdDIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCQotCQlvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsYWJsZUVsZW1lbnRfRnVsZmlsbHMoYTEsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscyhzbG90MiwgaXRlbXMuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHNsb3QxLCBpdGVtcy5nZXQoMSkpOwotCQkKLQkJb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5GdWxGaWxsc19GdWxsRmlsbGFibGVFbGVtZW50czsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGNGdWxmaWxsc19GdWxmaWxsYWJsZUVsZW1lbnQoc2xvdDEsIGNvbmZpZyk7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYTIsIGl0ZW1zLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyhhMSwgaXRlbXMuZ2V0KDEpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzAxRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwNmU3ZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMDFGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLmVjb3JlLnV0aWwuT3Bwb3NpdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEudXRpbC5Bc3NvY2lhdGlvbkhlbHBlcjsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIGluY29taW5nIDAuLjEgZmVhdHVyZSB2YXJhaWJpbGl0eS4KLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEluY29taW5nMDFGZWF0dXJlVGVzdCBleHRlbmRzIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSW5jb21pbmcwMUZlYXR1cmVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfRG9tYWluKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlEb21haW4gZDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDEiKTsKLQkJRG9tYWluIGQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQyIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuV29ya1Byb2R1Y3RfRG9tYWluczsKLQkJCi0JCS8vIHNpbmNlIDEuMiwgdGhpcyBpcyBhIHRvLW1hbnkgZmVhdHVyZSwgbm90IHRvLW9uZQotCQkvLyBjYXNlIDEKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhkMiwgaXRlbXMuZ2V0KDApKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGQyLCBkMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZDEsIGl0ZW1zLmdldCgwKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAzOiAKLQkJLy8gaWYgZDIgcmVwbGFjZXMgZDEsIGl0J3Mgb3V0Z29pbmcgdG8tbWFueSBhc3NvY2lhdGlvbiBpcyByZXBhbGNlZCwgCi0JCS8vIGkuZSB0aGUgZW5kIHJlc3VsdCBpcyBkMiAtPiBhMiwgYnV0IGExIGRvZXMgbm90IGhhdmUgYSBkb21haW4KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoZDIsIGQxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSA0OiAKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyhkMiwgZDEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQxLCBpdGVtcy5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoZDIsIGl0ZW1zLmdldCgxKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X0RvbWFpbl93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJRG9tYWluIGQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlRG9tYWluKHBsdWdpbiwgImQxIik7Ci0JCURvbWFpbiBkMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZURvbWFpbihwbHVnaW4sICJkMiIpOwotCQlEb21haW4gZDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVEb21haW4ocGx1Z2luLCAiZDMiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X0RvbWFpbnM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGQyLCBpdGVtcy5nZXQoMCkpOwotCQkKLQkJLy8gY2FzZSAyOiAKLQkJZDEuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGExKTsKLQkJZDIuZ2V0V29ya1Byb2R1Y3RzKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhkMikpOwotCQkJCQotCQkvLyBjYXNlIDM6IG1vcmUgdGhhbiBjb250cmlidXRvcnMsIHJldHVybiBudWxsCi0JCWQxLmdldFdvcmtQcm9kdWN0cygpLnJlbW92ZShhMSk7Ci0JCWQyLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMik7Ci0JCWQzLmdldFdvcmtQcm9kdWN0cygpLmFkZChhMyk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKGEzLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGQyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoZDMpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9JbmNvbWluZzBuRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwNmJmYy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L0luY29taW5nMG5GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5lY29yZS51dGlsLk9wcG9zaXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLnV0aWwuQXNzb2NpYXRpb25IZWxwZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciBpbmNvbWluZyAwLi5uIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNvbWluZzBuRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEluY29taW5nMG5GZWF0dXJlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8qKgotCSAqIHNpbmNlIDEuMG00LCBhIHdvcmsgcHJvZHVjdCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcwotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF93b3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlBcnRpZmFjdCBhMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExIik7Ci0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQlMaXN0IGxpc3QgPSByMS5nZXRSZXNwb25zaWJsZUZvcigpOwotCQlsaXN0LmFkZChhMSk7Ci0JCWxpc3QuYWRkKGExKTsKLQkJCi0JCS8vIGNhc2UgMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDI6IAotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCQotCQkvLyBjYXNlIDM6IAotCQkvLyBzaW5jZSByMiByZXBsYWNlcyByMSwgdGhlIGVuZCByZXN1bHQgaXMgcjIgLT4gYTIsIAotCQkvLyByMSBkb2VzIG5vdCBleGlzdCBhbnkgbW9yZSwgc28gYTEgaGFzIG5vIHJlc3BvbnNpYmxlIHJvbGUKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVtcy5zaXplKCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgNDogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHIyLCByMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQkvLyBjYXNlIDU6IGJvdGggcjEgYW5kIHIyIHJlc3BvbnNpYmxlIGZvciBhMQotCQlyMS5nZXRSZXNwb25zaWJsZUZvcigpLmNsZWFyKCk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuY2xlYXIoKTsKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7IC8vIHRoaXMgbmVlZCB0byB3YWl0IHRpbGwgdGhlIG9wcG9zaXRlIGZlYXR1cmUgY2hhbmdlIGZyb20gcGhvbmcgaXMgZGVsaXZlcmVkCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGl0ZW1zLnNpemUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3dvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXNfd2l0aF9jb250cmlidXRvcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9SZXNwb25zaWJsZVJvbGVzOwotCQlMaXN0IGl0ZW1zOwotCQkKLQkJLy8gY2FzZSAxCi0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGEyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JCS8vIGNhc2UgMjogCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKGExKTsKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTIpOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGExLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3Rfd29ya1Byb2R1Y3RfUmVzcG9uc2libGVSb2xlc193aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotLy8JCVJvbGUgcjMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIzIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotLy8JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJcjEuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQoYTEpOwotCQlyMi5nZXRSZXNwb25zaWJsZUZvcigpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKGEyLCBhMSk7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjIpKTsKLQkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvT3V0Z29pbmcwMUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MTcxYzEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzAxRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Db250ZW50UGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotCi0vKioKLSAqIFRlc3QgY2FzZSBmb3IgMC4uMSBmZWF0dXJlIHZhcmFpYmlsaXR5LgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3V0Z29pbmcwMUZlYXR1cmVUZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBPdXRnb2luZzAxRmVhdHVyZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnkoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCQotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19wZXJmb3JtZWRCeV93aXRoX2NvbnRyaWJ1dG9yKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCQotCQkvLyB0MiBjb250cmlidXRlcyB0byB0MSwgc2luY2UgdDEgYWxyZWFkeSBoYXMgYSB0by1vbmUgYXNzb2NpYXRpb24sIAotCQkvLyB0aGUgb25lIGZyb20gdGhlIGNvbnRyaWJ1dG9yIGlzIGlnbm9yZWQKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJLy9NZXRob2RFbGVtZW50IHIgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfZnJvbV9jb250cmlidXRvcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLS8vCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQkKLQkJLy8gZG9uJ3Qgc2V0IHBlcmZvcm1lciBpbiB0MSwgc28gaXQgd2lsbCBnZXQgZnJvbSB0aGUgY29udHJpYnV0b3IKLQkJLy90MS5zZXRQZXJmb3JtZWRCeShyMSk7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsKLQkJCi0JCS8vIHQyIGNvbnRyaWJ1dGVzIHRvIHQxLCBzaW5jZSB0MSBkb2VzIG5vdCBoYXZlIGEgdG8tb25lIGFzc29jaWF0aW9uLCAKLQkJLy8gdGhlIG9uZSBmcm9tIHRoZSBjb250cmlidXRvciBpcyB1c2VkCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjIsIHIpOwotCQlMaXN0PE1ldGhvZEVsZW1lbnQ+IGxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3BlcmZvcm1lZEJ5X3dpdGhfY29udHJpYnV0b3JzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotLy8JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0KLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJUm9sZSByMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjMiKTsKLQotCQkvLyBkb24ndCBzZXQgcGVyZm9ybWVyIGluIHQxLCBzbyBpdCB3aWxsIGdldCBmcm9tIHRoZSBjb250cmlidXRvcgotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCXQzLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIzKTsKLQkJCi0JCS8vIHQyIGFuZCB0MyBib3RoIGNvbnRyaWJ1dGUgdG8gdDEsIGV2ZW4gdGhvdWdoIHQxIGRvZXMgbm90IGhhdmUgYSB0by1vbmUgYXNzb2NpYXRpb24sIAotCQkvLyB0aGUgb25lcyBmcm9tIHRoZSBjb250cmlidXRvcnMgYXJlIGlnbm9yZWQgc2luY2UgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9yZXBsYWNlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJCi0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIxKTsKLQkJdDIuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MiwgdCk7ICAvLyBpZiB0aGlzIGZhaWwsIHRoZSByZW1haW5pbmcgY29kZSB3aWxsIG5vdCBiZSBleGVjdXRlZAotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9yZXBsYWNlcl9ub19wZXJmb3JtZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCQotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCQotCQkvLyB0MiBoYXMgbm8gcHJpbWFyeSBwZXJmb3JtZXIKLS8vCQl0Mi5zZXRQZXJmb3JtZWRCeShyMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MiwgdDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU1ldGhvZEVsZW1lbnQgdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQyLCB0KTsgIC8vIGlmIHRoaXMgZmFpbCwgdGhlIHJlbWFpbmluZyBjb2RlIHdpbGwgbm90IGJlIGV4ZWN1dGVkCi0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfUGVyZm9ybWVkQnkoKTsKLQkJTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkKLQkJaWYgKEVsZW1lbnRSZWFsaXplci5pc0V4dGVuZFJlcGxhY2VFbmFibGVkKCkgKSB7Ci0JCQlhc3NlcnRFcXVhbHMocjEsIHIpOyAgCi0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRFcXVhbHMobnVsbCwgcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3BlcmZvcm1lZEJ5X3dpdGhfcmVwbGFjZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQlSb2xlIHIzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMyIpOwotCQkKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMik7Ci0JCXQzLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIzKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJLy8gaWYgbW9yZSB0aGFuIG9uZSByZXBsYWNlciwgYWxsIHJlcGxhY2VycyBhcmUgaWdub3JlZAotCQlNZXRob2RFbGVtZW50IHQgPSBDb25maWd1cmF0aW9uSGVscGVyLmdldENhbGN1bGF0ZWRFbGVtZW50KHQxLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyh0MSwgdCk7IAotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCS8vTWV0aG9kRWxlbWVudCByID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCUxpc3Q8TWV0aG9kRWxlbWVudD4gbGlzdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyMSwgbGlzdC5nZXQoMCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfcGVyZm9ybWVkQnlfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0vLwkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLS8vCQlSb2xlIHIzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMyIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MiwgdDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19QZXJmb3JtZWRCeSgpOwotCQlNZXRob2RFbGVtZW50IHI7Ci0JCQotCQkvLyBjYXNlIDE6Ci0JCS8vdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQobnVsbCk7Ci0JCXQyLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHIyKTsJCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhudWxsLCByKTsKLQkJTGlzdDxNZXRob2RFbGVtZW50PiBsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmlzRW1wdHkoKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQkJCi0JCS8vIGNhc2UgMjoKLQkJdDEuZ2V0UGVyZm9ybWVkQnkoKS5hZGQocjEpOwotCQl0Mi5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0KLQkJLy9yID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjEsIHIpOwotCQlsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMiwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRUcnVlKGxpc3Quc2l6ZSgpID09IDIpOwotCQlhc3NlcnRFcXVhbHMocjIsIGxpc3QuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgxKSk7Ci0JCQotCQkvLyBjYXNlIDM6Ci0JCXQxLmdldFBlcmZvcm1lZEJ5KCkuY2xlYXIoKTsKLQkJdDIuZ2V0UGVyZm9ybWVkQnkoKS5jbGVhcigpOwotCQl0MS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyMSk7Ci0JCS8vdDIuZ2V0UGVyZm9ybWVkQnkoKS5hZGQobnVsbCk7Ci0KLQkJLy9yID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMDFGZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJLy9hc3NlcnRFcXVhbHMocjEsIHIpOwotCQlsaXN0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHIxLCBsaXN0LmdldCgwKSk7Ci0JCQotCQkvL3IgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwMUZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQkvL2Fzc2VydEVxdWFscyhyMSwgcik7Ci0JCWxpc3QgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMocjEsIGxpc3QuZ2V0KDApKTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzBuRmVhdHVyZVRlc3QuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvT3V0Z29pbmcwbkZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWM5N2QuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9PdXRnb2luZzBuRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy52YXJpYWJpbGl0eTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkNvbmZpZ3VyYXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5EZWZhdWx0RWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uRWxlbWVudFJlYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnV0aWwuTGlicmFyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5BcnRpZmFjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkNvbnRlbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuVGFzazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlVtYVBhY2thZ2U7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciAwLi5uIGZlYXR1cmUgdmFyYWliaWxpdHkuCi0gKiAKLSAqIEBhdXRob3IgSmluaHVhIFhpCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRnb2luZzBuRmVhdHVyZVRlc3QgZXh0ZW5kcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE91dGdvaW5nMG5GZWF0dXJlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfTWFuZGF0b3J5SW5wdXQoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwotCQkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBjb250cmlidXRlcyB0byBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiByZXBsYWNlcyBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBleHRlbmRzIGExCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMoYTIsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX01hbmRhdG9yeUlucHV0X3dpdGhfY29udHJpYnV0b3IoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDIsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg0LCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhMiBjb250cmlidXRlcyB0byBhMQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyhhMiwgYTEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygzLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCQotCQkvLyBob3cgYWJvdXQgYTMgcmVwbGFjZXMgYTEKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoYTMsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCBhNCByZXBsYWNlcyBhMSB0b286IGEzIGFuZCBhMyB3aWxsIGJlIGlnbm9yZWQsIGEyIGlzIHJlc3VsdGluZyB0byBhMSwgc28gb25seSBnZXQgYTEKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMoYTQsIGExKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19NYW5kYXRvcnlJbnB1dF93aXRoX2NvbnRyaWJ1dG9ycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7CQotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyKTsKLQkJCi0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJQXJ0aWZhY3QgYTQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNCIpOwkKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTMpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNCk7Ci0KLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJQXJ0aWZhY3QgYTUgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNSIpOwotCQl0My5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNSk7Ci0JCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHQzLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQkJCi0JCS8vIGhvdyBhYm91dCB0MyBjb250cmlidXRlcyB0byB0Miwgc2FtZSByZXN1bHQKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXModDMsIHQyKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQkJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19NYW5kYXRvcnlJbnB1dF93aXRoX3JlcGxhY2VycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJQXJ0aWZhY3QgYTEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMSIpOwotCQlBcnRpZmFjdCBhMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEyIik7CQotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMSk7Ci0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEyKTsKLQkJCi0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCUFydGlmYWN0IGEzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTMiKTsKLQkJQXJ0aWZhY3QgYTQgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhNCIpOwkKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTMpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhNCk7Ci0JCi0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCUFydGlmYWN0IGE1ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTUiKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTUpOwotCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQyLCB0MSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJTWV0aG9kRWxlbWVudCB0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDIsIHQpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX01hbmRhdG9yeUlucHV0KCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTMpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNCkpOwotCQkKLQkJLy8gaG93IGFib3V0IHQzIHJlcGxhY2VzIHRvIHQyCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHQzLCB0Mik7Ci0JCQotCQl0ID0gQ29uZmlndXJhdGlvbkhlbHBlci5nZXRDYWxjdWxhdGVkRWxlbWVudCh0MSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHModDMsIHQpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0LCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQotCQkvLyBob3cgYWJvdXQgdDMgcmVwbGFjZXMgdG8gdDEsIHNvIHQyIGFuZCB0MyBib3RoIHJlcGxhY2VzIHQxLCB0aCBlcmVwbGFjZXIgaXMgaWdub3JlZAotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh0MywgdDEpOwotCQkKLQkJdCA9IENvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQxLCB0KTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfTWFuZGF0b3J5SW5wdXRfd2l0aF9leHRlbmRlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdDEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0MS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXQyLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdDIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCi0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCUFydGlmYWN0IGE1ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTUiKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTUpOwotCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDMsIHQxKTsKLQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfTWFuZGF0b3J5SW5wdXQoKTsKLQkJTGlzdCBpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTMpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MywgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMywgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNSkpOwotCQkKLQkJLy8gaG93IGFib3V0IHQzIGV4dGVuZHMgdDIKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDIpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMykpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGE0KSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQzLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg1LCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEzKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTQpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhNSkpOwotCi0JfQotCQotCS8vIHRlc3QgdGhlIHNlY3Rpb25zCi0JcHVibGljIHZvaWQgdGVzdF90YXNrX3N0ZXBzX3dpdGhfY29udHJpYnV0b3JzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCi0JCS8vIHRoZXNlIHR3byBzaG91bGQgZ2VuZXJhdGUgdGhlIHNhbWUgcmVzdWx0Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGVudERlc2NyaXB0aW9uX1NlY3Rpb25zKCk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlMiA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFRhc2tfU3RlcHMoKTsKLQkJTGlzdCBpdGVtczsKLQkJCQkKLQkJU2VjdGlvbiBzMV8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczEiLCAidDFzMSIpOwotCQlTZWN0aW9uIHMxXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQxLmdldFByZXNlbnRhdGlvbigpLCAidDFzMiIsICJ0MXMyIik7Ci0KLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczEiLCAidDJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMiIsICJ0MnMyIik7Ci0KLQkJU2VjdGlvbiBzM18xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0My5nZXRQcmVzZW50YXRpb24oKSwgInQzczEiLCAidDNzMSIpOwotCQlTZWN0aW9uIHMzXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQzLmdldFByZXNlbnRhdGlvbigpLCAidDNzMiIsICJ0M3MyIik7Ci0JCQotCQkvLyBjYXNlIDEKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MS5nZXRQcmVzZW50YXRpb24oKSwgdDEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLCBmZWF0dXJlMiwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCS8vIGNhc2UgMgotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRDb250cmlidXRlcyh0MiwgdDEpOwotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQxLmdldFByZXNlbnRhdGlvbigpLCB0MSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MSwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JfQotCQotCS8vIHRlc3QgdGhlIHNlY3Rpb25zIGZvciByZXBsYWNlcnMKLQlwdWJsaWMgdm9pZCB0ZXN0X3Rhc2tfc3RlcHNfd2l0aF9yZXBsYWNlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVRhc2sgdDIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVRhc2sgdDMgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQzIik7Ci0JCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkKLQkJLy8gdGhlc2UgdHdvIHNob3VsZCBnZW5lcmF0ZSB0aGUgc2FtZSByZXN1bHQKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUyID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19TdGVwcygpOwotCQlMaXN0IGl0ZW1zOwotCQlUYXNrIHQ7Ci0JCQotCQlTZWN0aW9uIHMxXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQxLmdldFByZXNlbnRhdGlvbigpLCAidDFzMSIsICJ0MXMxIik7Ci0JCVNlY3Rpb24gczFfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMyIiwgInQxczIiKTsKLQotCQlTZWN0aW9uIHMyXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMSIsICJ0MnMxIik7Ci0JCVNlY3Rpb24gczJfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDIuZ2V0UHJlc2VudGF0aW9uKCksICJ0MnMyIiwgInQyczIiKTsKLQotCQlTZWN0aW9uIHMzXzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQzLmdldFByZXNlbnRhdGlvbigpLCAidDNzMSIsICJ0M3MxIik7Ci0JCVNlY3Rpb24gczNfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDMuZ2V0UHJlc2VudGF0aW9uKCksICJ0M3MyIiwgInQzczIiKTsKLQkJCi0KLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXModDIsIHQxKTsKLQkJdCA9IChUYXNrKUNvbmZpZ3VyYXRpb25IZWxwZXIuZ2V0Q2FsY3VsYXRlZEVsZW1lbnQodDEsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKHQyLCB0KTsgIAotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodC5nZXRQcmVzZW50YXRpb24oKSwgdCwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodCwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzIpKTsKLQotCX0KLQkKLQkvLyB0ZXN0IHRoZSBzZWN0aW9ucwotCXB1YmxpYyB2b2lkIHRlc3RfdGFza19zdGVwc193aXRoX2V4dGVuZGVycygpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJVGFzayB0MyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDMiKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQotCQkvLyB0aGVzZSB0d28gc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIHJlc3VsdAotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0JCUxpc3QgaXRlbXM7Ci0JCQkJCi0JCVNlY3Rpb24gczFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMxIiwgInQxczEiKTsKLQkJU2VjdGlvbiBzMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczIiLCAidDFzMiIpOwotCi0JCVNlY3Rpb24gczJfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDIuZ2V0UHJlc2VudGF0aW9uKCksICJ0MnMxIiwgInQyczEiKTsKLQkJU2VjdGlvbiBzMl8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczIiLCAidDJzMiIpOwotCi0vLwkJU2VjdGlvbiBzM18xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0My5nZXRQcmVzZW50YXRpb24oKSwgInQzczEiLCAidDNzMSIpOwotLy8JCVNlY3Rpb24gczNfMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDMuZ2V0UHJlc2VudGF0aW9uKCksICJ0M3MyIiwgInQzczIiKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHModDIsIHQxKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0RXh0ZW5kcyh0MywgdDEpOwotCi0JCS8vIGNhc2UgMQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoNCwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MiwgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCS8vIGNhc2UgMiwgdDMgaGFzIG5vIHN0ZXBzLCB0aGlzIHdhcyBvbmNlIGEgYnVnIHNpbmNlIHRoZSBjb250ZW50RGVzY3JpcHRpb24gb2JqZWN0IGlzIG5vdCBjcmVhdGVkCi0JCS8vIGFuZCB0aGUgcmVhbGl6YXRpb24gZmFpbGVkCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDMuZ2V0UHJlc2VudGF0aW9uKCksIHQzLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0MywgZmVhdHVyZTIsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1JlZ3Jlc3Npb25UZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1JlZ3Jlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGZhOTIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvbGlicmFyeS90ZXN0cy92YXJpYWJpbGl0eS9SZWdyZXNzaW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE1ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLnZhcmlhYmlsaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmNvbmZpZ3VyYXRpb24uQ29uZmlndXJhdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5jb25maWd1cmF0aW9uLkRlZmF1bHRFbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkuY29uZmlndXJhdGlvbi5FbGVtZW50UmVhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudXRpbC5MaWJyYXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLkFydGlmYWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ2hlY2tsaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuQ29udGVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5NZXRob2RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLk1ldGhvZFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5Sb2xlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYudW1hLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS5VbWFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi51bWEuZWNvcmUudXRpbC5PcHBvc2l0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnVtYS51dGlsLkFzc29jaWF0aW9uSGVscGVyOwotCi0vKioKLSAqIHJlY29yZCBhbGwgYnVncyByZWxhdGluZyB0byByYXJpYWJpbGl0eSBzbyB0aGF0IHdlIGNhbiBkbyByZWdyZXNzaW9uIHRlc3Qgb24gdGhvc2UgaXNzdWVzLgotICogCi0gKiBAYXV0aG9yIEppbmh1YSBYaQotICogQHNpbmNlIDEuMAotICoKLSAqLwotcHVibGljIGNsYXNzIFJlZ3Jlc3Npb25UZXN0IGV4dGVuZHMgVmFyaWFibGl0eUJhc2VUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVncmVzc2lvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIAkxNDA4NzVJbmFiaWxpdHkgdG8gYWRkIHJlc3BvbnNpYmxlIGZvciByZWxhdGlvbnNoaXAgdG8gYSB3b3JrIHByb2R1Y3QKLQkgKiAKLQkgCUlmIEkgbWFrZSBhIHJvbGUsIFIyLCBpbiBhIHBsdWctaW4sIFAyLCByZXNwb25zaWJsZSBmb3IgYSB3b3JrIHByb2R1Y3QsIFdQMiwKLQkJdGhhdCBjb250cmlidXRlcyB0byBhIHdvcmsgcHJvZHVjdCwgV1AxLCBpbiBhbm90aGVyIHBsdWctaW4sIFAxLCB0aGF0Ci0JCXJlc3BvbnNpYmlsaXR5IGRvZXMgbm90IGFwcGVhciB0byBiZSBhZGRlZC4gIFNwZWNpZmljYWxseSwgdGhlIGZhY3QgdGhhdCBSMiBpcwotCQlyZXNwb25zaWJpbGUgZm9yIFdQMSBpcyBub3QgZGlzcGxheWVkIGluIHRoZSBCcm93c2UgcGVyc3BlY3RpdmUgZm9yIGEKLQkJY29uZmlndXJhdGlvbiB0aGF0IGNvbnRhaW5zIGJvdGggcGx1Zy1pbnMuICBBbHNvLCB0aGUgZmFjdCB0aGF0IFIyIGlzCi0JCXJlc3BvbnNpYmxlIGZvciBXUDIgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgUHJldmlldyB0YWIgZm9yIFIyIG9yIFdQMgotCQkKLQkJSWYgdGhlIGJhc2UgZG9lcyBub3QgaGF2ZSBhbiBpbmNvbWluZyByZWxhdGlvbnNoaXAsIHRoZW4gaXQgc2hvdWxkIGJlIGFibGUgdG8KLQkJYmUgY29udHJpYnV0ZWQuICBJbiB0aGlzIGV4YW1wbGUsIFdQMSBkaWQgbm90IGhhdmUgYSByZXNwb25zaWJsZSByb2xlCi0JCXJlbGF0aW9uc2hpcC4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfMTQwODc1KCkgewotCQkvLyB0aGlzIHNob3VsZCBub3QgYmUgYW4gaXNzdWUgYW55IG1vcmUgc2luY2UgMS4wbTQuCi0JCS8vIFdQIC0tPiBSb2xlIGlzIHRvIG1hbnkgYXNzb2NpYXRpb24gbm93LgotCQkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4xLCAicDEiKTsKLQotCQlNZXRob2RQbHVnaW4gcGx1Z2luMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDIiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbjIsICJwMiIpOwotCi0JCXBsdWdpbjIuZ2V0QmFzZXMoKS5hZGQocGx1Z2luMSk7Ci0JCQotLy8JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZzEsICJyMSIpOwotCQlBcnRpZmFjdCB3cDEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2cxLCAid3AxIik7Ci0JCQotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2cyLCAicjIiKTsKLQkJQXJ0aWZhY3Qgd3AyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnMiwgIndwMiIpOwotCQkKLQkJcjIuZ2V0UmVzcG9uc2libGVGb3IoKS5hZGQod3AyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMod3AyLCB3cDEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbjEpOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cxKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4yKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnMik7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUxpc3QgaXRlbXM7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVfUmVzcG9uc2libGVGb3IoKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cDEpKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUod3AyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCi0JfQotCQotCS8qKgotCSAqIDE0Mzg3MSAtIEFuIGV4dGVuZGluZyBjaGVja2xpc3Qgd2l0aCBubyBpdGVtcyBkb2VzIG5vdCByZWFsaXplIHRoZSBiYXNlIGNoZWNrbGlzdCBpdGVtcwotCSAqIAotCQlIYXZlIGEgYmFzZSB0YXNrLCBUYXNrIEEsIHdpdGggc29tZSBzdGVwcy4KLQkJRXh0ZW5kIGl0IHdpdGggYSBuZXcgVGFzayBCLCB3aGljaCBoYXMgbm8gc3RlcHMuCi0JCQotCQlCcm93c2luZyBUYXNrIEIgc2hvdWxkIHNob3cgdGhlIHN0ZXBzIG9mIFRhc2sgQSwgYnV0IGl0IGRvZXMgbm90LgotCQlJZiBUYXNrIEIgaXMgc3Vic2VxdWVudGx5IGFzc2lnbmVkIHNvbWUgc3RlcHMsIHRoZW4gYWxsIHdpbGwgYmUgcmVhbGl6ZWQgaW4gdGhlCi0JCWJyb3dzZXIuICBGdXJ0aGVyLCBpZiB0aGUgVGFzayBCJ3Mgc3RlcHMgYXJlIHRoZW4gZGVsZXRlZCwgdGhlIHJlYWxpemF0aW9uIHdpbGwKLQkJc3RpbGwgc2hvdyBUYXNrIEEncyBzdGVwcy4KLQkJCi0JCVRoZSBkZXNjcmlwdGlvbiBhcHBsaWVzIHRvIGNoZWNrbGlzdHMsIGFuZCBzaG91bGQgcmVhZDoKLQkJSGF2ZSBhIGJhc2UgY2hlY2tsaXN0LCBDaGVja2xpc3QgQSwgd2l0aCBzb21lIGNoZWNrbGlzdCBpdGVtcy4KLQkJRXh0ZW5kIGl0IHdpdGggYSBuZXcgQ2hlY2tsaXN0IEIsIHdoaWNoIGhhcyBubyBpdGVtcy4KLQkJCi0JCUJyb3dzaW5nIENoZWNrbGlzdCBCIHNob3VsZCBzaG93IHRoZSBzdGVwcyBvZiBDaGVja2xpc3QgQSwgYnV0IGl0IGRvZXMgbm90LgotCQlJZiBDaGVja2xpc3QgQiBpcyBzdWJzZXF1ZW50bHkgYXNzaWduZWQgc29tZSBpdGVtcywgdGhlbiBhbGwgd2lsbCBiZSByZWFsaXplZAotCQlpbiB0aGUgYnJvd3Nlci4gIEZ1cnRoZXIsIGlmIHRoZSBDaGVja2xpc3QgQidzIGl0ZW1zIGFyZSB0aGVuIGRlbGV0ZWQsIHRoZQotCQlyZWFsaXphdGlvbiB3aWxsIHN0aWxsIHNob3cgQ2hlY2tsaXN0IEEncyBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0XzE0Mzg3MV90YXNrX3N0ZXBzKCkgewkKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJVGFzayB0MSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDEiKTsKLQkJVGFzayB0MiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRhc2socGtnLCAidDIiKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQotCQkvLyB0aGVzZSB0d28gc2hvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIHJlc3VsdAotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbnRlbnREZXNjcmlwdGlvbl9TZWN0aW9ucygpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZTIgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1N0ZXBzKCk7Ci0JCUxpc3QgaXRlbXM7Ci0JCQkJCi0JCVNlY3Rpb24gczFfMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVNlY3Rpb24odDEuZ2V0UHJlc2VudGF0aW9uKCksICJ0MXMxIiwgInQxczEiKTsKLQkJU2VjdGlvbiBzMV8yID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0MS5nZXRQcmVzZW50YXRpb24oKSwgInQxczIiLCAidDFzMiIpOwotCQkKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHQyLCB0MSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHQyLmdldFByZXNlbnRhdGlvbigpLCB0MiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUyLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0KLQkJLy8gdGhlbiBzZXQgdGhlIHNlY3Rpb25zIGZvciB0YXNrIDIKLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbih0Mi5nZXRQcmVzZW50YXRpb24oKSwgInQyczEiLCAidDJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKHQyLmdldFByZXNlbnRhdGlvbigpLCAidDJzMiIsICJ0MnMyIik7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh0Mi5nZXRQcmVzZW50YXRpb24oKSwgdDIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodDIsIGZlYXR1cmUyLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyg0LCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8yKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMyXzIpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0XzE0Mzg3MV9jaGVja2xpc3RfaXRlbXMoKSB7CQotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlDaGVja2xpc3QgYzEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDaGVja2xpc3QocGtnLCAiYzEiKTsKLQkJQ2hlY2tsaXN0IGMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ2hlY2tsaXN0KHBrZywgImMyIik7Ci0JCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250ZW50RGVzY3JpcHRpb25fU2VjdGlvbnMoKTsKLQkJTGlzdCBpdGVtczsKLQkJCQkKLQkJU2VjdGlvbiBzMV8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbihjMS5nZXRQcmVzZW50YXRpb24oKSwgImMxczEiLCAiYzFzMSIpOwotCQlTZWN0aW9uIHMxXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKGMxLmdldFByZXNlbnRhdGlvbigpLCAiYzFzMiIsICJjMXMyIik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKGMyLCBjMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGMyLmdldFByZXNlbnRhdGlvbigpLCBjMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMV8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMikpOwotCi0JCS8vIHRoZW4gc2V0IHRoZSBzZWN0aW9ucyBmb3IgY2hlY2tsaXN0IDIKLQkJU2VjdGlvbiBzMl8xID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlU2VjdGlvbihjMi5nZXRQcmVzZW50YXRpb24oKSwgImMyczEiLCAiYzJzMSIpOwotCQlTZWN0aW9uIHMyXzIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVTZWN0aW9uKGMyLmdldFByZXNlbnRhdGlvbigpLCAiYzJzMiIsICJjMnMyIik7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShjMi5nZXRQcmVzZW50YXRpb24oKSwgYzIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczFfMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHMxXzIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhzMl8xKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoczJfMikpOwotCi0JfQotCQotCS8qKgotCSAqIDE0NjE1MyAtIFZhcmlhYmlsaXR5OiBJbmNvbWluZyB0by1tYW55IGFzc29jaWF0aW9ucyBhcmUgbm90IHByZXNlcnZlZCBpbiB0aGUgY2FzZSBvZiByb2xlIHJlcGxhY2VtZW50IGFuZCBleHRlbnNpb24KLQkgKiAKLQkJU1RFUFM6Ci0JCTEuIGNyZWF0ZSByb2xlQSBhbmQgcm9sZUIuIEFzc2lnbiB0aGVtIHRvIHJvbGVzZXRBIGFuZCByb2xlc2V0QiByZXNwZWN0aXZlbHkKLQkJMi4gc2V0IHJvbGVBIHRvIHJlcGxhY2Ugcm9sZUIgYW5kIGJyb3dzZQotCQlyZXN1bHRzPT4gYnJvd3Npbmcgc2hvd3Mgcm9sZUEgaW4gcm9sZXNldEEgb25seS4gCi0JCWV4cGVjdCByZXN1bHRzPT4gcm9sZUEgc2hvdWxkIGJlIGluIHJvbGVzZXRBIGFuZCByb2xlc2V0QgotCQkKLQkJU2ltaWxhciBpc3N1ZSB3aGVuIHJvbGVBIGlzIGV4dGVuZGluZyByb2xlQgotCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0XzE0NjE1M193aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlSb2xlU2V0IHJzMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMxIik7Ci0JCVJvbGVTZXQgcnMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Um9sZVNldF9Sb2xlcygpOwotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1JvbGVTZXRzOwotCQlMaXN0IGl0ZW1zOwotCQkKLQkJcnMxLmdldFJvbGVzKCkuYWRkKHIxKTsKLQkJcnMyLmdldFJvbGVzKCkuYWRkKHIyKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHIyLCByMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJzMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHIyLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczIpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfMTQ2MTUzX3dpdGhfY29udHJpYnV0b3IoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVJvbGUgcjEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVJvbGUgcjIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCVJvbGVTZXQgcnMxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczEiKTsKLQkJUm9sZVNldCByczIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlU2V0KHBsdWdpbiwgInJzMiIpOwotCQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlU2V0X1JvbGVzKCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQlyczEuZ2V0Um9sZXMoKS5hZGQocjEpOwotCQlyczIuZ2V0Um9sZXMoKS5hZGQocjIpOwotCQkKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0Q29udHJpYnV0ZXMocjIsIHIxKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMxLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIxKSk7Ci0KLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyczIsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocjEsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygyLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMikpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdF8xNDYxNTNfd2l0aF9leHRlbmRlcigpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJUm9sZVNldCByczEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlU2V0KHBsdWdpbiwgInJzMSIpOwotCQlSb2xlU2V0IHJzMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMyIik7Ci0JCQkJCi0JCU1ldGhvZENvbmZpZ3VyYXRpb24gY29uZmlnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29uZmlndXJhdGlvbigiY29uZmlnIDEiKTsKLQkJY29uZmlnLmdldE1ldGhvZFBsdWdpblNlbGVjdGlvbigpLmFkZChwbHVnaW4pOwotCQljb25maWcuZ2V0TWV0aG9kUGFja2FnZVNlbGVjdGlvbigpLmFkZChwa2cpOwotCQlMaWJyYXJ5VXRpbC52YWxpZGF0ZU1ldGhvZENvbmZpZ3VyYXRpb24oY29uZmlnKTsJCi0JCUVsZW1lbnRSZWFsaXplciByZWFsaXplciA9IERlZmF1bHRFbGVtZW50UmVhbGl6ZXIubmV3RWxlbWVudFJlYWxpemVyKGNvbmZpZyk7Ci0JCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IFVtYVBhY2thZ2UuZUlOU1RBTkNFLmdldFJvbGVTZXRfUm9sZXMoKTsKLQkJT3Bwb3NpdGVGZWF0dXJlIG9mZWF0dXJlID0gQXNzb2NpYXRpb25IZWxwZXIuUm9sZV9Sb2xlU2V0czsKLQkJTGlzdCBpdGVtczsKLQkJCi0JCXJzMS5nZXRSb2xlcygpLmFkZChyMSk7Ci0JCXJzMi5nZXRSb2xlcygpLmFkZChyMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHIyLCByMSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHJzMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMSkpOwotCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocnMyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHIyKSk7Ci0JCQotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKHIxLCBvZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyczEpKTsKLQkJCi0JCWl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUocjIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygxLCBpdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHJzMikpOwotCX0KLQkKLQkvKioKLQkgKiBSMDAzODIxMjAgLSBBdXRob3Jpbmc6ICBFeHRlbmRpbmcgYSBiYXNlIHRoYXQgaGFzIGJlZW4gcmVwbGFjZWQsIGRvZXMgbm90IGV4dGVuZCB0aGUgcmVwbGFjZW1lbnQKLQkgKiBMZXQgQSwgQiwgYW5kIEMgYmUgZWxlbWVudHMgb3IgY2F0ZWdvcmllcy4KLQkJMS4gIExldCBBIGV4dGVuZCBCLgotCQkyLiAgTGV0IEMgcmVwbGFjZSBCLiAgICAgICAgICAob3JkZXIgZG9lcyBub3QgbWF0dGVyKQotCQkKLQkJUmVzdWx0OgotCQkKLQkJQSBleHRlbmRzIHRoZSBhc3NvY2lhdGlvbnMgb2YgQiwgZXZlbiB0aG91Z2ggQiBpcyBiZWluZyByZXBsYWNlZC4KLQkJCi0JCVNob3VsZCBiZToKLQkJCi0JCUEgZXh0ZW5kcyB0aGUgYXNzb2NpYXRpb25zIG9mIHRoZSByZXBsYWNlbWVudCwgQy4KLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfUjAwMzgyMTIwX3Rhc2tfTWFuZGF0b3J5SW5wdXRfd2l0aF9yZXBsYWNlcnMoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdEEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJdEEuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0QS5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlUYXNrIHRCID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlBcnRpZmFjdCBhMyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImEzIik7Ci0JCUFydGlmYWN0IGE0ID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTQiKTsJCi0JCXRCLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGEzKTsKLQkJdEIuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTQpOwotCQotCQlUYXNrIHRDID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwotCQlBcnRpZmFjdCBhNSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImE1Iik7Ci0JCXRDLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGE1KTsKLQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRFeHRlbmRzKHRBLCB0Qik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHRDLCB0Qik7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0VGFza19NYW5kYXRvcnlJbnB1dCgpOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUodEEsIGZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGl0ZW1zLnNpemUoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhhMSkpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMoYTUpKTsKLQotCX0KLQkKLQkvKioKLQkgKiBSMDAzODIzMjcgLSByZXBsYWNlZCBlbGVtZW50IGRvZXMgbm90IHNob3cgaW5jb21pbmcgcmVsYXRpb25zaGlwcwotCSAqIGUuZy4gcmVwbGFjZSBhIHdvcmsgcHJvZHVjdDogdGhlIHB1Ymxpc2hlZCBwYWdlIGRvZXMgbm90IHNob3cgdGhlIFRhc2tzIAotCSAqIHRoZSB3b3JrcHJvZHVjdCBpcyBpbnB1dC9vdXRwdXQgdG8uICAKLQkgKiBJdCBzaG91bGQgbGlzdCBhbGwgdGhlIFRhc2tzIGZyb20gdGhlIHJlcGxhY2VkIGVsZW1lbnQuCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0X1IwMDM4MjMyN190YXNrX01hbmRhdG9yeUlucHV0X3dpdGhfcmVwbGFjZXJzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlUYXNrIHQxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MSIpOwotCQlUYXNrIHQyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MiIpOwotCQlUYXNrIHQzID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlVGFzayhwa2csICJ0MyIpOwkJCi0JCUFydGlmYWN0IGExID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTEiKTsKLQkJQXJ0aWZhY3QgYTIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVBcnRpZmFjdChwa2csICJhMiIpOwkKLQkJCi0JCS8vIHQxLCB0MyAtPiBhMSwgdDItPmEyLCBhMiAtcmVwbGFjZS0+YTEKLQkJLy8gYTEncyB0YXNrcyBzaG91bGQgYmUgdDEsIHQyLHQzCi0JCXQxLmdldE1hbmRhdG9yeUlucHV0KCkuYWRkKGExKTsKLQkJdDMuZ2V0TWFuZGF0b3J5SW5wdXQoKS5hZGQoYTEpOwotCQl0Mi5nZXRNYW5kYXRvcnlJbnB1dCgpLmFkZChhMik7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyhhMiwgYTEpOwotCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Xb3JrUHJvZHVjdF9NYW5kYXRvcnlJbnB1dFRvX1Rhc2tzOwotCQlMaXN0IGl0ZW1zID0gQ29uZmlndXJhdGlvbkhlbHBlci5jYWxjMG5GZWF0dXJlVmFsdWUoYTIsIG9mZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygzLCBpdGVtcy5zaXplKCkpOwkJCi0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnModDEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh0MikpOwotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHQzKSk7Ci0KLQl9Ci0JCi0JLyoqCi0JICogUjAwMzgyOTcyIC0gQXV0aG9yaW5nOiBXaGVuIHN1Yi1hcnRpZmFjdCBleHRlbmRzIHBhcmVudCBhcnRpZmFjdCwKLQkgKiB0aGF0IHN1YiBhcnRpZmFjdCBoYXMgaW5maW5pdGUgbG9vcCBpbiBjb25maWd1cmF0aW9uIGV4cGxvcmVyIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF9SMDAzODI5NzJfYXJ0aWZhY3RfU3ViQXJ0aWZhY3RzKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlBcnRpZmFjdCBhMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgImExIik7Ci0JCUFydGlmYWN0IGEyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAiYTIiKTsJCi0JCQotCQkvLyBhMSBjb250YWlucyBhMiwgYTIgZXh0ZW5kcyBhMQotCQkvLyB3aGF0J3MgYTEncyBjaGlsZHJlcz8gYTIKLQkJLy8gd2hhdCdzIGEyJ3MgY2hpbGRyZW4/IGEyPyBOT09PTyEKLQkJCi0JCWExLmdldENvbnRhaW5lZEFydGlmYWN0cygpLmFkZChhMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldEV4dGVuZHMoYTIsIGExKTsKLQkJCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlID0gVW1hUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXJ0aWZhY3RfQ29udGFpbmVkQXJ0aWZhY3RzKCk7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShhMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKGEyKSk7Ci0JCQotCQkvLyBhMidzIGNvbnRhaW5lZCBhcmZpZmFjdHMgc2hvdWxkIGNvbnRhaW4gdGhlIG9uZXMgZnJvbSB0aGUgYmFzZSwgd2hpY2ggaW5jbHVkZSBpdHNlbGYKLQkJLy8gc2hvdWxkIG5vdCBjb250YWluIGl0c2VsZgotCQlpdGVtcyA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzBuRmVhdHVyZVZhbHVlKGEyLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVtcy5zaXplKCkpOwkJCi0JCQotCX0KLQkKLQkvKiogCi0JICogUjAwMzgzNTI4IC0gQnJvd3Npbmc6ICBBIHJlcGxhY2luZyByb2xlIGRvZXMgbm90IHBpY2sgdXAgdGhlIHRhc2socykgZm9yIHdoaWNoIHRoZSByZXBsYWNlZCByb2xlIHdhcyBwcmltYXJ5IHBlcmZvcm1lcgotCSAqIAotCSAqCUxldCBSb2xlIEEgYmUgcHJpbWFyeSBwZXJmb3JtZXIgZm9yIFRhc2sgQSwKLSAgIAkJUm9sZSBCIGJlIHByaW1hcnkgcGVyZm9ybWVyIGZvciBUYXNrIEIuCi0KLQkJTm93IGhhdmUgUm9sZSBCIHJlcGxhY2UgUm9sZSBBLgotCQkKLQkJQnJvd3NlIFJvbGUgQiBhbmQgc2hvdWxkIGV4cGVjdCBpdCB0byBiZSB0aGUgcHJpbWFyeSBwZXJmb3JtZXIgZm9yIFRhc2sgQSBhcyB3ZWxsIGFzIFRhc2sgQi4KLQkJSXQgb25seSBzaG93cyBUYXNrIEIuCi0JCQotCQlCcm93c2UgVGFzayBBIGFuZCBpdCBjb3JyZWN0bHkgc2hvd3MgdGhhdCBSb2xlIEIgaXMgdGhlIHByaW1hcnkgcGVyZm9ybWVyLgotCSAqLwotCXB1YmxpYyB2b2lkIFIwMDM4MzUyOF9yb2xlX3Rhc2tzX3dpdGhfcmVwYWxjZXIoKSB7Ci0JCU1ldGhvZFBsdWdpbiBwbHVnaW4gPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVNZXRob2RQbHVnaW4oInBsdWdpbiAxIik7Ci0JCUNvbnRlbnRQYWNrYWdlIHBrZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbnRlbnRQYWNrYWdlKHBsdWdpbiwgInAxIik7Ci0JCVRhc2sgdEEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQxIik7Ci0JCVJvbGUgckEgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIxIik7Ci0JCVRhc2sgdEIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVUYXNrKHBrZywgInQyIik7Ci0JCVJvbGUgckIgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVSb2xlKHBrZywgInIyIik7Ci0JCQotCQl0QS5nZXRQZXJmb3JtZWRCeSgpLmFkZChyQSk7Ci0JCXRCLmdldFBlcmZvcm1lZEJ5KCkuYWRkKHJCKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLnNldFJlcGxhY2VzKHJCLCByQSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkJCi0JCS8vIG91dGdvaW5nIGZlYXR1cmUKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRUYXNrX1BlcmZvcm1lZEJ5KCk7Ci0JCU1ldGhvZEVsZW1lbnQgciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHRBLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyQiwgcik7CQotCQkKLQkJciA9IENvbmZpZ3VyYXRpb25IZWxwZXIuY2FsYzAxRmVhdHVyZVZhbHVlKHRCLCBmZWF0dXJlLCByZWFsaXplcik7Ci0JCWFzc2VydEVxdWFscyhyQiwgcik7CQotCQkKLQkJLy8gaW5jb21pbmcgZmVhdHVyZQotCQlPcHBvc2l0ZUZlYXR1cmUgb2ZlYXR1cmUgPSBBc3NvY2lhdGlvbkhlbHBlci5Sb2xlX1ByaW1hcnlfVGFza3M7Ci0JCUxpc3QgaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyQiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXRlbXMuc2l6ZSgpKTsJCQotCQlhc3NlcnRUcnVlKGl0ZW1zLmNvbnRhaW5zKHRBKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnModEIpKTsKLQotCX0KLQkKLQkvKioKLQkgKiAxNDYxNTMgLSBWYXJpYWJpbGl0eTogSW5jb21pbmcgdG8tbWFueSBhc3NvY2lhdGlvbnMgYXJlIG5vdCBwcmVzZXJ2ZWQgaW4gdGhlIGNhc2Ugb2Ygcm9sZSByZXBsYWNlbWVudAotCSAqIAotCSAqIFNURVBTOgotCQkxLiBjcmVhdGUgcm9sZUEgYW5kIHJvbGVCLiBBc3NpZ24gdGhlbSB0byByb2xlc2V0QSBhbmQgcm9sZXNldEIgcmVzcGVjdGl2ZWx5Ci0JCTIuIHNldCByb2xlQSB0byByZXBsYWNlIHJvbGVCIGFuZCBicm93c2UKLQkJcmVzdWx0cz0+IGJyb3dzaW5nIHNob3dzIHJvbGVBIGluIHJvbGVzZXRBIG9ubHkuIAotCQlleHBlY3QgcmVzdWx0cz0+IHJvbGVBIHNob3VsZCBiZSBpbiByb2xlc2V0QSBhbmQgcm9sZXNldEIKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RfMTQ2MTUzX3JvbGVfcm9sZXNldF93aXRoX3JlcGxhY2VyKCkgewotCQlNZXRob2RQbHVnaW4gcGx1Z2luID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlTWV0aG9kUGx1Z2luKCJwbHVnaW4gMSIpOwotCQlDb250ZW50UGFja2FnZSBwa2cgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb250ZW50UGFja2FnZShwbHVnaW4sICJwMSIpOwotCQlSb2xlIHIxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMSIpOwotCQlSb2xlIHIyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZShwa2csICJyMiIpOwotCQlSb2xlU2V0IHJzMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGVTZXQocGx1Z2luLCAicnMxIik7Ci0JCVJvbGVTZXQgcnMyID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlUm9sZVNldChwbHVnaW4sICJyczIiKTsKLQkJCQkKLQkJTWV0aG9kQ29uZmlndXJhdGlvbiBjb25maWcgPSBMaWJyYXJ5VGVzdEhlbHBlci5jcmVhdGVDb25maWd1cmF0aW9uKCJjb25maWcgMSIpOwotCQljb25maWcuZ2V0TWV0aG9kUGx1Z2luU2VsZWN0aW9uKCkuYWRkKHBsdWdpbik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQYWNrYWdlU2VsZWN0aW9uKCkuYWRkKHBrZyk7Ci0JCUxpYnJhcnlVdGlsLnZhbGlkYXRlTWV0aG9kQ29uZmlndXJhdGlvbihjb25maWcpOwkKLQkJRWxlbWVudFJlYWxpemVyIHJlYWxpemVyID0gRGVmYXVsdEVsZW1lbnRSZWFsaXplci5uZXdFbGVtZW50UmVhbGl6ZXIoY29uZmlnKTsKLQkJCi0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLlJvbGVfUm9sZVNldHM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBjYXNlIDEKLQkJcnMxLmdldFJvbGVzKCkuYWRkKHIxKTsKLQkJcnMyLmdldFJvbGVzKCkuYWRkKHIyKTsKLQkJTGlicmFyeVRlc3RIZWxwZXIuc2V0UmVwbGFjZXMocjIsIHIxKTsKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocnMxKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocnMyKSk7Ci0JCQotCX0KLQkKLQkvKioKLQkgKiAxNTIyMzAgLSBCcm93c2luZzogUm9sZTwtLT5XUCByZWxhdGlvbnNoaXAgc2hvd3MgaW5jb25zaXN0YW5jeQotCSAqIAkxLiBjcmVhdGUgcm9sZTEgcmVzcG9uc2libGUgZm9yIHdwMQotCQkyLiBjcmVhdGUgcm9sZTIgcmVzcG9uc2libGUgZm9yIHdwMgotCQkzLiBoYXMgd3AyIHJlcGxhY3Mgd3AxLCBhbmQgd3AxIGNvbnRyaWJ1dGUgdG8gd3AKLQkJNC4gYnJvd3Npbmcgc2hvd3MgdGhhdAotCQkKLQkJaW4gd3AsIGl0IHNob3dzIHRoYXQgYm90aCByb2xlMSBhbmQgcm9sZTIgYXJlIHJlc3BvbnNpYmxlCi0JCWluIHJvbGUxLCB0aGUgcmVsYXRpb25zaGlwIHNob3dzIGl0IGlzIHJlc3BvbnNpYmxlIGZvciB3cAotCQlidXQgaW4gcm9sZTIsIHRoZSByZWxhdGlvbnNoaXAgc2hvd3Mgbm8gd3AKLQkJCi0JCVRvIGJlIGNvbnNpc3RhbnQsIHdwIHNob3VsZCBiZSBzaG93aW5nIGluIHJvbGUyJ3MgcmVsYXRpb25zaGlwIGRpYWdyYW0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdF8xNTIyMzBfcm9sZV93cCgpIHsKLQkJTWV0aG9kUGx1Z2luIHBsdWdpbiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZU1ldGhvZFBsdWdpbigicGx1Z2luIDEiKTsKLQkJQ29udGVudFBhY2thZ2UgcGtnID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQ29udGVudFBhY2thZ2UocGx1Z2luLCAicDEiKTsKLQkJUm9sZSByMSA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjEiKTsKLQkJUm9sZSByMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVJvbGUocGtnLCAicjIiKTsKLQkJQXJ0aWZhY3Qgd3AxID0gTGlicmFyeVRlc3RIZWxwZXIuY3JlYXRlQXJ0aWZhY3QocGtnLCAid3AxIik7Ci0JCUFydGlmYWN0IHdwMiA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgIndwMiIpOwotCQlBcnRpZmFjdCB3cCA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUFydGlmYWN0KHBrZywgIndwIik7Ci0JCQkJCi0JCXIxLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwMSk7Ci0JCXIyLmdldFJlc3BvbnNpYmxlRm9yKCkuYWRkKHdwMik7Ci0JCUxpYnJhcnlUZXN0SGVscGVyLnNldENvbnRyaWJ1dGVzKHdwMSwgd3ApOwotCQlMaWJyYXJ5VGVzdEhlbHBlci5zZXRSZXBsYWNlcyh3cDIsIHdwMSk7Ci0JCQotCQlNZXRob2RDb25maWd1cmF0aW9uIGNvbmZpZyA9IExpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZUNvbmZpZ3VyYXRpb24oImNvbmZpZyAxIik7Ci0JCWNvbmZpZy5nZXRNZXRob2RQbHVnaW5TZWxlY3Rpb24oKS5hZGQocGx1Z2luKTsKLQkJY29uZmlnLmdldE1ldGhvZFBhY2thZ2VTZWxlY3Rpb24oKS5hZGQocGtnKTsKLQkJTGlicmFyeVV0aWwudmFsaWRhdGVNZXRob2RDb25maWd1cmF0aW9uKGNvbmZpZyk7CQotCQlFbGVtZW50UmVhbGl6ZXIgcmVhbGl6ZXIgPSBEZWZhdWx0RWxlbWVudFJlYWxpemVyLm5ld0VsZW1lbnRSZWFsaXplcihjb25maWcpOwotCQkKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgPSBVbWFQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlX1Jlc3BvbnNpYmxlRm9yKCk7Ci0JCU9wcG9zaXRlRmVhdHVyZSBvZmVhdHVyZSA9IEFzc29jaWF0aW9uSGVscGVyLldvcmtQcm9kdWN0X1Jlc3BvbnNpYmxlUm9sZXM7Ci0JCUxpc3QgaXRlbXM7Ci0JCQotCQkvLyBib3RoIHIxIGFuZCByMiByZXNwb25zaWJsZSBmb3Igd3AKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMSwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZShyMiwgZmVhdHVyZSwgcmVhbGl6ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyh3cCkpOwotCQkKLQkJaXRlbXMgPSBDb25maWd1cmF0aW9uSGVscGVyLmNhbGMwbkZlYXR1cmVWYWx1ZSh3cCwgb2ZlYXR1cmUsIHJlYWxpemVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoaXRlbXMuY29udGFpbnMocjEpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVtcy5jb250YWlucyhyMikpOwotCQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9saWJyYXJ5L3Rlc3RzL3ZhcmlhYmlsaXR5L1ZhcmlhYmxpdHlCYXNlVGVzdENhc2UuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvVmFyaWFibGl0eUJhc2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWRkNGQzLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL2xpYnJhcnkvdGVzdHMvdmFyaWFiaWxpdHkvVmFyaWFibGl0eUJhc2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMudmFyaWFiaWxpdHk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLkF1dGhvcmluZ1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LnRlc3RzLkxpYnJhcnlUZXN0SGVscGVyOwotCi0vKioKLSAqIAotICogQGF1dGhvciBKaW5odWEgWGkKLSAqIEBzaW5jZSAxLjAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYXJpYWJsaXR5QmFzZVRlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFZhcmlhYmxpdHlCYXNlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJCi0JCUxpYnJhcnlUZXN0SGVscGVyLmNyZWF0ZVRlc3RNZXRob2RMaWJyYXJ5KCk7Ci0JCQotCQkvLyBhY3RpdmF0ZSB0aGUgQXV0aG9yaW5nIHBsdWdpbnMgdG8gaW5pdGlhbGl6ZSBzb21ldGhpbmcKLQkJLy8gdGhlIHJlYXNvbiB0byBwdXQgaXQgYWZ0ZXIgdGhlIGxpYnJhcnkgaXMgY3JlYXRlZCBpcyB0byBhdm9pZCB0aGUgT3BlbiBMaWJyYXJ5IGRpYWxvZwotCQlBdXRob3JpbmdVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCQotCQlMaWJyYXJ5VGVzdEhlbHBlci5jbG9zZUxpYnJhcnkoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTZkNjYuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwMDllMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIFJpY2hUZXh0IFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS41LjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuUmljaFRleHRUZXN0c1BsdWdpbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LAotIG9yZy5lY2xpcHNlLnVpLAotIG9yZy5qdW5pdCwKLSBvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvYnVpbGQucHJvcGVydGllcyBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZDNhNy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGljb25zLwpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9pY29ucy9zYW1wbGUuZ2lmIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9pY29ucy9zYW1wbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGZiM2M5Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvaWNvbnMvc2FtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvcGx1Z2luLnhtbCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmM2I2NS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDxjYXRlZ29yeQotICAgICAgICAgICAgbmFtZT0iRVBGIFRlc3RzIENhdGVnb3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyI+Ci0gICAgICA8L2NhdGVnb3J5PgotICAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IlJpY2ggVGV4dCBUZXN0IFZpZXciCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDx2aWV3Ci0gICAgICAgICAgICAgICByYXRpbz0iMC41IgotICAgICAgICAgICAgICAgcmVsYXRpdmU9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLlRhc2tMaXN0IgotICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwPSJyaWdodCIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMudmlld3MuUmljaFRleHRUZXN0VmlldyI+Ci0gICAgICAgICA8L3ZpZXc+Ci0gICAgICA8L3BlcnNwZWN0aXZlRXh0ZW5zaW9uPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9ycy5IVE1MRWRpdG9yIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLkhUTUxFZGl0b3IiCi0gICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9ycy5IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IiICAgICAgICAgICAgCi0gICAgICAgICAgICBuYW1lPSJIVE1MIEVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imh0bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIj4KLSAgICAgIDwvZWRpdG9yPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLk11bHRpUGFnZUhUTUxFZGl0b3IiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmVkaXRvcnMuTXVsdGlQYWdlSFRNTEVkaXRvciIgICAgICAgICAgIAotICAgICAgICAgICAgbmFtZT0iTXVsdGktcGFnZSBIVE1MIEVkaXRvciIKLSAgICAgICAgICAgIGV4dGVuc2lvbnM9Imh0bWwiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+ICAgICAgCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdC5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGQwYWMxLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9SaWNoVGV4dFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udXRpbHMuU3RyVXRpbDsKLQotLyoqCi0gKiBKVW5pdCB0ZXN0cyBmb3IgdGhlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dCBjbGFzc2VzLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlIFN0clV0aWwuaXNOdWxsKCkgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgICAgYXNzZXJ0VHJ1ZShTdHJVdGlsLmlzTnVsbChudWxsKSk7Ci0JICAgIGFzc2VydFRydWUoU3RyVXRpbC5pc051bGwoIiIpKTsKLQkgICAgYXNzZXJ0RmFsc2UoU3RyVXRpbC5pc051bGwoIkhlbGxvIikpOwkgICAgCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9SaWNoVGV4dFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjdiMjcuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogSlVuaXQgdGVzdCBzdWl0ZSBmb3Igb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShSaWNoVGV4dFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJLy9zdWl0ZS5hZGRUZXN0U3VpdGUoU3RyVXRpbFRlc3QuY2xhc3MpOwotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvUmljaFRleHRUZXN0c1BsdWdpbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL1JpY2hUZXh0VGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmZDUxZC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvUmljaFRleHRUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmNvbW1vbi51aS5BYnN0cmFjdFBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgUmljaFRleHQgVGVzdHMgcGx1Zy1pbiBjbGFzcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RzUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFJpY2hUZXh0VGVzdHNQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHRUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0UGx1Z2luI3N0YXJ0KEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdFBsdWdpbiNzdG9wKEJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBwbHVnLWluIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmljaFRleHRUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0Jsb2NrVGFnQ29udHJpYnV0aW9uLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9CbG9ja1RhZ0NvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjI0NGM0Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0Jsb2NrVGFnQ29udHJpYnV0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuQmxvY2tUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb250cmlidXRlcyBhIGNvbWJvIGNvbnRhaW5pbmcgSFRNTCBibG9jayB0YWdzIHRvIGEgdG9vbCBiYXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmxvY2tUYWdDb250cmlidXRpb24gZXh0ZW5kcyBDb250cm9sQ29udHJpYnV0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBDb250cmlidXRpb24gSUQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJJQlVUSU9OX0lEID0gQmxvY2tUYWdDb250cmlidXRpb24uY2xhc3MKLQkJCS5nZXROYW1lKCk7Ci0KLQkvLyBUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0KLQkvLyBUaGUgYmxvY2sgdGFnIGNvbWJvLgotCXByaXZhdGUgc3RhdGljIENvbWJvIGJsb2NrVGFnQ29tYm87Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSByaWNoVGV4dAotCSAqICAgICAgICAgICAgVGhlIHJpY2ggdGV4dCBjb250cm9sLgotCSAqLwotCXB1YmxpYyBCbG9ja1RhZ0NvbnRyaWJ1dGlvbihJUmljaFRleHQgcmljaFRleHQpIHsKLQkJc3VwZXIoQ09OVFJJQlVUSU9OX0lEKTsKLQkJdGhpcy5yaWNoVGV4dCA9IHJpY2hUZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWJsb2NrVGFnQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5QQVJBR1JBUEguZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuSEVBRElOR18xLmdldE5hbWUoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uYWRkKEJsb2NrVGFnLkhFQURJTkdfMi5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5IRUFESU5HXzMuZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuSEVBRElOR180LmdldE5hbWUoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uYWRkKEJsb2NrVGFnLkhFQURJTkdfNS5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5IRUFESU5HXzYuZ2V0TmFtZSgpKTsKLQkJYmxvY2tUYWdDb21iby5hZGQoQmxvY2tUYWcuQUREUkVTUy5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLmFkZChCbG9ja1RhZy5QUkVGT1JNQVRURURfVEVYVC5nZXROYW1lKCkpOwotCQlibG9ja1RhZ0NvbWJvLnNldFZpc2libGVJdGVtQ291bnQoYmxvY2tUYWdDb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWJsb2NrVGFnQ29tYm8uc2VsZWN0KDApOwotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJYmxvY2tUYWdDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGV2ZW50U3JjIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBldmVudFNyYzsKLQkJCQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBCbG9ja1RhZy5nZXRCbG9ja1RhZyhpbmRleCkuZ2V0VmFsdWUoKTsKLQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5GT1JNQVRfQkxPQ0ssCi0JCQkJCQkJCXZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9KTsKLQkJfQotCi0JCXJldHVybiBibG9ja1RhZ0NvbWJvOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0JvbGRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5YWViNC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Cb2xkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0UmVzb3VyY2VzOwotCi0vKioKLSAqIFRvZ2dsZXMgdGhlICdib2xkJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJvbGRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQm9sZEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQk9MRCwgbnVsbCk7CQkJCi0JCX0KLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250TmFtZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvRm9udE5hbWVDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDNiZS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250TmFtZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0Lmh0bWwuRm9udE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBDb250cmlidXRlcyBhIGNvbWJvIGNvbnRhaW5pbmcgSFRNTCBmb250IG5hbWVzIHRvIGEgdG9vbCBiYXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlICAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZvbnROYW1lQ29udHJpYnV0aW9uIGV4dGVuZHMgQ29udHJvbENvbnRyaWJ1dGlvbiB7Ci0JCi0JLyoqCi0JICogVGhlIENvbnRyaWJ1dGlvbiBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUklCVVRJT05fSUQgPSBGb250TmFtZUNvbnRyaWJ1dGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JLy8gVGhlIHJpY2ggdGV4dCBjb250cm9sLgotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCS8vIFRoZSBmb250IG5hbWUgY29tYm8uCi0JcHJpdmF0ZSBzdGF0aWMgQ29tYm8gZm9udE5hbWVDb21ibzsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbQlyaWNoVGV4dAlUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JICovCi0JcHVibGljIEZvbnROYW1lQ29udHJpYnV0aW9uKElSaWNoVGV4dCByaWNoVGV4dCkgewotCQlzdXBlcihDT05UUklCVVRJT05fSUQpOwotCQl0aGlzLnJpY2hUZXh0ID0gcmljaFRleHQ7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkNvbnRyb2xDb250cmlidXRpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZvbnROYW1lQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCQlmb250TmFtZUNvbWJvLmFkZChGb250TmFtZS5ERUZBVUxULmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLkFSSUFMLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLkNPVVJJRVJfTkVXLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uYWRkKEZvbnROYW1lLlRJTUVTX05FV19ST01BTi5nZXROYW1lKCkpOwotCQlmb250TmFtZUNvbWJvLmFkZChGb250TmFtZS5WRVJEQU5BLmdldE5hbWUoKSk7Ci0JCWZvbnROYW1lQ29tYm8uc2V0VmlzaWJsZUl0ZW1Db3VudChmb250TmFtZUNvbWJvLmdldEl0ZW1Db3VudCgpKTsJCQotCQlmb250TmFtZUNvbWJvLnNlbGVjdCgwKTsKLQkJaWYgKHJpY2hUZXh0ICE9IG51bGwpIHsKLQkJCWZvbnROYW1lQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT2JqZWN0IGV2ZW50U3JjID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJCWlmIChldmVudFNyYyBpbnN0YW5jZW9mIENvbWJvKSB7Ci0JCQkJCQlDb21ibyBjb21ibyA9IChDb21ibylldmVudFNyYzsKLQkJCQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJCQlTdHJpbmcgdmFsdWUgPSBGb250TmFtZS5nZXRGb250TmFtZShpbmRleCkuZ2V0VmFsdWUoKTsKLQkJCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5TRVRfRk9OVF9OQU1FLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfSk7Ci0JCX0KLQkJCi0JCXJldHVybiBmb250TmFtZUNvbWJvOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250U2l6ZUNvbnRyaWJ1dGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvRm9udFNpemVDb250cmlidXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkYzg4NC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9Gb250U2l6ZUNvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJvbENvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIENvbnRyaWJ1dGVzIGEgY29tYm8gY29udGFpbmluZyBIVE1MIGZvbnQgc2l6ZXMgdG8gYSB0b29sIGJhci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRm9udFNpemVDb250cmlidXRpb24gZXh0ZW5kcyBDb250cm9sQ29udHJpYnV0aW9uIHsKLQkKLQkvKioKLQkgKiBUaGUgQ29udHJpYnV0aW9uIElELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRSSUJVVElPTl9JRCA9IEZvbnRTaXplQ29udHJpYnV0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQkKLQkvLyBUaGUgcmljaCB0ZXh0IGNvbnRyb2wuCi0JcHJpdmF0ZSBJUmljaFRleHQgcmljaFRleHQ7Ci0JCi0JLy8gVGhlIGZvbnQgc2l6ZSBjb21iby4KLQlwcml2YXRlIHN0YXRpYyBDb21ibyBmb250U2l6ZUNvbWJvOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtCXJpY2hUZXh0CVRoZSByaWNoIHRleHQgY29udHJvbC4KLQkgKi8KLQlwdWJsaWMgRm9udFNpemVDb250cmlidXRpb24oSVJpY2hUZXh0IHJpY2hUZXh0KSB7Ci0JCXN1cGVyKENPTlRSSUJVVElPTl9JRCk7Ci0JCXRoaXMucmljaFRleHQgPSByaWNoVGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQ29udHJvbENvbnRyaWJ1dGlvbiNjcmVhdGVDb250cm9sKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZm9udFNpemVDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCk7Ci0JCWZvbnRTaXplQ29tYm8uYWRkKCIxIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemVDb21iby5hZGQoIjIiKTsgLy8kTk9OLU5MUy0xJAotCQlmb250U2l6ZUNvbWJvLmFkZCgiMyIpOyAvLyROT04tTkxTLTEkCi0JCWZvbnRTaXplQ29tYm8uYWRkKCI0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9udFNpemVDb21iby5hZGQoIjUiKTsgLy8kTk9OLU5MUy0xJAotCQlmb250U2l6ZUNvbWJvLmFkZCgiNiIpOyAvLyROT04tTkxTLTEkCi0JCWZvbnRTaXplQ29tYm8uYWRkKCI3Iik7IC8vJE5PTi1OTFMtMSQJCQotCQlmb250U2l6ZUNvbWJvLnNldFZpc2libGVJdGVtQ291bnQoZm9udFNpemVDb21iby5nZXRJdGVtQ291bnQoKSk7Ci0JCWZvbnRTaXplQ29tYm8uc2VsZWN0KDIpOwotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJZm9udFNpemVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPYmplY3QgZXZlbnRTcmMgPSBldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKGV2ZW50U3JjIGluc3RhbmNlb2YgQ29tYm8pIHsKLQkJCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKWV2ZW50U3JjOwotCQkJCQkJaW50IGZvbnRTaXplID0gY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSArIDE7Ci0JCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU0VUX0ZPTlRfU0laRSwgIiIgKyBmb250U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX07Ci0JCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIGZvbnRTaXplQ29tYm87Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL0l0YWxpY0FjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZWU2M2UuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvSXRhbGljQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAnaXRhbGljJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSXRhbGljQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSXRhbGljQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLml0YWxpY0FjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSVRBTElDLCBudWxsKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvUmljaFRleHRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhMzJmMC4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9SaWNoVGV4dEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzLkhUTUxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCByaWNoIHRleHQgYWN0aW9ucy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSaWNoVGV4dEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgSFRNTEVkaXRvciBlZGl0b3IgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgUmljaFRleHRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgYWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYWN0aXZlIGVkaXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gYWN0aXZlRWRpdG9yCi0JICogICAgICAgICAgICB0aGUgYWN0aXZlIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIEhUTUxFZGl0b3IpIHsKLQkJCWVkaXRvciA9IChIVE1MRWRpdG9yKSBhY3RpdmVFZGl0b3I7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvYWN0aW9ucy9TdWJzY3JpcHRBY3Rpb24uamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFiNmEyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1N1YnNjcmlwdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRSZXNvdXJjZXM7Ci0KLS8qKgotICogVG9nZ2xlcyB0aGUgJ2JvbGQnIGF0dHJpYnV0ZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJzY3JpcHRBY3Rpb24gZXh0ZW5kcyBSaWNoVGV4dEFjdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBTdWJzY3JpcHRBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGFjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQlzZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQk9MRCk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLmJvbGRBY3Rpb25fdG9vbFRpcFRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3IuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQsIG51bGwpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9hY3Rpb25zL1VuZGVybGluZUFjdGlvbi5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMGEyNTguLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2FjdGlvbnMvVW5kZXJsaW5lQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0SW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dFJlc291cmNlczsKLQotLyoqCi0gKiBUb2dnbGVzIHRoZSAndW5kZXJsaW5lJyBhdHRyaWJ1dGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVW5kZXJsaW5lQWN0aW9uIGV4dGVuZHMgUmljaFRleHRBY3Rpb24gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgVW5kZXJsaW5lQWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1VOREVSTElORSk7Ci0JCXNldFRvb2xUaXBUZXh0KFJpY2hUZXh0UmVzb3VyY2VzLnVuZGVybGluZUFjdGlvbl90b29sVGlwVGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWVkaXRvci5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuVU5ERVJMSU5FLCBudWxsKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDc1YjkuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvSFRNTEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0vLyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0vLyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLS8vIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0vLyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotLy8KLS8vIENvbnRyaWJ1dG9yczoKLS8vIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuZWRpdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5JUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7Ci0KLS8qKgotICogQSBIVE1MIGVkaXRvciBidWlsdCB3aXRoIGEgcmljaCB0ZXh0LgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxFZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKLQotCS8vIFRoZSBSaWNoIFRleHQgY29udHJvbC4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEhUTUxFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaW5pdChJRWRpdG9yU2l0ZSwgSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXNldFNpdGUoc2l0ZSk7Ci0JCQlzZXRJbnB1dChpbnB1dCk7Ci0JCQlzZXRQYXJ0TmFtZShpbnB1dC5nZXROYW1lKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCXJpY2hUZXh0ID0gbmV3IFJpY2hUZXh0KHBhcmVudCwgU1dULk5PTkUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmljaFRleHQgPSBudWxsOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjc2V0Rm9jdXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuc2V0Rm9jdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2Rpc0RpcnR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGVzIGEgcmljaCB0ZXh0IGNvbW1hbmQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKiAgICAgICAgICAgIGEgcmljaCB0ZXh0IGNvbW1hbmQgc3RyaW5nCi0JICogQHBhcmFtIHBhcmFtcwotCSAqICAgICAgICAgICAgYSBjb21tYS1kZWxpbWl0ZWQgY29tbWFuZHMgYXNzY2lhdGVkIHdpdGggdGhlIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlQ29tbWFuZChTdHJpbmcgY29tbWFuZCwgU3RyaW5nIHBhcmFtcykgewotCQlpZiAocmljaFRleHQgIT0gbnVsbCkgewotCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgcGFyYW1zKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvSFRNTEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4Y2Q4Mi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9IVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnMuQm9sZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmFjdGlvbnMuVW5kZXJsaW5lQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIEEgSFRNTCBlZGl0b3IgYWN0aW9uIGJhciBjb250cmlidXRvci4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciB7Ci0JCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBlZGl0b3I7Ci0JcHJpdmF0ZSBCb2xkQWN0aW9uIGJvbGRBY3Rpb247Ci0JcHJpdmF0ZSBJdGFsaWNBY3Rpb24gaXRhbGljQWN0aW9uOwotCXByaXZhdGUgVW5kZXJsaW5lQWN0aW9uIHVuZGVybGluZUFjdGlvbjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBIVE1MRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2luaXQoSUFjdGlvbkJhcnMsIElXb3JrYmVuY2hQYWdlKQotCSAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotICAgIAlzdXBlci5pbml0KGJhcnMsIHBhZ2UpOwotICAgIAlib2xkQWN0aW9uID0gbmV3IEJvbGRBY3Rpb24oKTsKLSAgICAJaXRhbGljQWN0aW9uID0gbmV3IEl0YWxpY0FjdGlvbigpOwotICAgIAl1bmRlcmxpbmVBY3Rpb24gPSBuZXcgVW5kZXJsaW5lQWN0aW9uKCk7Ci0gICAgCQotICAgIAlJVG9vbEJhck1hbmFnZXIgdG9vbEJhciA9IGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLSAgICAJCi0gICAgCXRvb2xCYXIuYWRkKGJvbGRBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZChpdGFsaWNBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZCh1bmRlcmxpbmVBY3Rpb24pOwotICAgIAl0b29sQmFyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotICAgIAkKLSAgICB9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0JICovCi0gICAgcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotICAgIAllZGl0b3IgPSBhY3RpdmVFZGl0b3I7Ci0gICAgCWJvbGRBY3Rpb24uc2V0QWN0aXZlRWRpdG9yKGVkaXRvcik7Ci0gICAgCWl0YWxpY0FjdGlvbi5zZXRBY3RpdmVFZGl0b3IoZWRpdG9yKTsKLSAgICAJdW5kZXJsaW5lQWN0aW9uLnNldEFjdGl2ZUVkaXRvcihlZGl0b3IpOwotICAgIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI3NldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvTXVsdGlQYWdlSFRNTEVkaXRvci5qYXZhIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvTXVsdGlQYWdlSFRNTEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzIwOWM1Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy9lZGl0b3JzL011bHRpUGFnZUhUTUxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLmVkaXRvcnM7Ci0KLS8qKgotICogQSBtdWx0aS1wYWdlIEhUTUwgZWRpdG9yIGJ1aWx0IHdpdGggYSByaWNoIHRleHQgY29udHJvbC4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAc2luY2UgMS4wCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuSVJpY2hUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5SaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLQotcHVibGljIGNsYXNzIE11bHRpUGFnZUhUTUxFZGl0b3IgZXh0ZW5kcyBNdWx0aVBhZ2VFZGl0b3JQYXJ0IHsKLQkKLQkvLyBUaGUgUmljaCBUZXh0IGVkaXRvci4KLQlwcml2YXRlIElSaWNoVGV4dCByaWNoVGV4dEVkaXRvcjsKLQkKLQkvLyBUaGUgSFRNTCBzb3VyY2UgZWRpdG9yLgotCXByaXZhdGUgVGV4dCBodG1sRWRpdG9yOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIE11bHRpUGFnZUhUTUxFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2luaXQoSUVkaXRvclNpdGUsIElFZGl0b3JJbnB1dCkKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLSAgICAJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JICAgIHNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7CQotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydCNjcmVhdGVQYWdlKCkKLQkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLSAgICAJY3JlYXRlUmljaFRleHRQYWdlKCk7Ci0gICAgCWNyZWF0ZVNvdXJjZVBhZ2UoKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgUmljaCBUZXh0IHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmljaFRleHRQYWdlKCkgewotCQlyaWNoVGV4dEVkaXRvciA9IG5ldyBSaWNoVGV4dChnZXRDb250YWluZXIoKSwgU1dULk5PTkUpOwotCQlpbnQgaW5kZXggPSBhZGRQYWdlKHJpY2hUZXh0RWRpdG9yLmdldENvbnRyb2woKSk7Ci0JCXNldFBhZ2VUZXh0KGluZGV4LCAiUmljaCBUZXh0Iik7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIEhUTUwgU291cmNlIHBhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpIHsKLSAgICAJaHRtbEVkaXRvciA9IG5ldyBUZXh0KGdldENvbnRhaW5lcigpLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWludCBpbmRleCA9IGFkZFBhZ2UoaHRtbEVkaXRvcik7Ci0JCXNldFBhZ2VUZXh0KGluZGV4LCAiSFRNTCIpOwotICAgIH0gICAgCi0gICAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjcGFnZUNoYW5nZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQkJc3dpdGNoIChuZXdQYWdlSW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQlyaWNoVGV4dEVkaXRvci5zZXRUZXh0KGh0bWxFZGl0b3IuZ2V0VGV4dCgpKTsJCQkKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlodG1sRWRpdG9yLnNldFRleHQocmljaFRleHRFZGl0b3IuZ2V0VGV4dCgpKTsJCQkKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkaXNEaXJ0eSgpCi0JICovICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8gIAotICAgIHB1YmxpYyBib29sZWFuIGlzU2F2ZUFzQWxsb3dlZCgpIHsKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yUGFydCNkb1NhdmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLSAgICBwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0gICAgfQotICAgIAotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8gICAgCi0gICAgcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3JpY2h0ZXh0L3Rlc3RzL2VkaXRvcnMvUmljaFRleHRUZXN0RWRpdG9yLmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9SaWNoVGV4dFRlc3RFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0MDk3Ny4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvZWRpdG9ycy9SaWNoVGV4dFRlc3RFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dFRvb2xCYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZEltYWdlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkFkZExpbmVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQWRkTGlua0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRPcmRlcmVkTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRUYWJsZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5BZGRVbm9yZGVyZWRMaXN0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJsb2NrVGFnQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkJvbGRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuQ29weUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5DdXRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udE5hbWVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFNpemVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuRm9udFN0eWxlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLkluZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5JdGFsaWNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuSnVzdGlmeUNlbnRlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5RnVsbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5TGVmdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5KdXN0aWZ5UmlnaHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuT3V0ZGVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5QYXN0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuYWN0aW9ucy5TdWJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuU3VwZXJzY3JpcHRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmFjdGlvbnMuVGlkeUFjdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5hY3Rpb25zLlVuZGVybGluZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci0KLS8qKgotICogRXh0ZW5kcyB0aGUgYmFzZSByaWNoIHRleHQgZWRpdG9yIGFuZCBwb3B1bGF0ZXMgaXRzIHRvb2wgYmFyIHdpdGggc29tZSB1c2VmdWwKLSAqIGFjdGlvbiBpdGVtcy4KLSAqIAotICogQGF1dGhvciBLZWx2aW4gTG93Ci0gKiBAYXV0aG9yIEplZmYgSGFyZHkKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJpY2hUZXh0VGVzdEVkaXRvciBleHRlbmRzIFJpY2hUZXh0RWRpdG9yIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb21wb3NpdGUuCi0JICogQHBhcmFtIHN0eWxlCi0JICogICAgICAgICAgICBUaGUgc3R5bGUgZm9yIHRoZSBjb250cm9sLgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqICAgICAgICAgICAgVGhlIGJhc2UgcGF0aCB1c2VkIGZvciByZXNvbHZpbmcgaHlwZXJsaW5rcyBpbiB0aGUgZWRpdG9yCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqLwotCXB1YmxpYyBSaWNoVGV4dFRlc3RFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUsIGVkaXRvclNpdGUpOwotCX0KLQotCS8qKgotCSAqIEZpbGxzIHRoZSBSaWNoIFRleHQgZWRpdG9yIHRvb2wgYmFyIHdpdGggYWN0aW9uIGl0ZW1zLgotCSAqIAotCSAqIEBwYXJhbSB0b29sQmFyCi0JICogICAgICAgICAgICBUaGUgUmljaCB0ZXh0IGVkaXRvciB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsVG9vbEJhcihJUmljaFRleHRUb29sQmFyIHRvb2xCYXIpIHsKLS8qCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFN0eWxlQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEJsb2NrVGFnQWN0aW9uKCkpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udE5hbWVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgRm9udFNpemVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQ3V0QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IENvcHlBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgUGFzdGVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQm9sZEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBJdGFsaWNBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgVW5kZXJsaW5lQWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IFN1YnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBTdXBlcnNjcmlwdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBUaWR5QWN0aW9uR3JvdXAodGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUxlZnRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUNlbnRlckFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBKdXN0aWZ5UmlnaHRBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgSnVzdGlmeUZ1bGxBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZFNlcGFyYXRvcigpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkT3JkZXJlZExpc3RBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkVW5vcmRlcmVkTGlzdEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBPdXRkZW50QWN0aW9uKHRoaXMpKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEluZGVudEFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkU2VwYXJhdG9yKCk7Ci0JCWlmIChyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpICE9IG51bGwpCi0JCQl0b29sQmFyLmFkZEFjdGlvbihyaWNoVGV4dC5nZXRGaW5kUmVwbGFjZUFjdGlvbigpKTsKLQkJdG9vbEJhci5hZGRTZXBhcmF0b3IoKTsKLQkJdG9vbEJhci5hZGRBY3Rpb24obmV3IEFkZExpbmVBY3Rpb24odGhpcykpOwotCQl0b29sQmFyLmFkZEFjdGlvbihuZXcgQWRkTGlua0FjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRJbWFnZUFjdGlvbih0aGlzKSk7Ci0JCXRvb2xCYXIuYWRkQWN0aW9uKG5ldyBBZGRUYWJsZUFjdGlvbih0aGlzKSk7Ki8KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy92aWV3cy9SaWNoVGV4dFRlc3RWaWV3LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvcmljaHRleHQvdGVzdHMvdmlld3MvUmljaFRleHRUZXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY3NzgyLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYucmljaHRleHQudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi9yaWNodGV4dC90ZXN0cy92aWV3cy9SaWNoVGV4dFRlc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LnRlc3RzLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LklSaWNoVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LlJpY2hUZXh0Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuUmljaFRleHRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkSW1hZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLnJpY2h0ZXh0LmRpYWxvZ3MuQWRkTGlua0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuZGlhbG9ncy5BZGRUYWJsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYucmljaHRleHQuaHRtbC5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC5odG1sLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkJsb2NrVGFnQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkZvbnROYW1lQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cy5hY3Rpb25zLkZvbnRTaXplQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci0KLS8qKgotICogQSB0ZXN0IHZpZXcgY29udGFpbmluZyBhIHJpY2ggdGV4dCBjb250cm9sLgotICogCi0gKiBAYXV0aG9yIEtlbHZpbiBMb3cKLSAqIEBzaW5jZSAgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBSaWNoVGV4dFRlc3RWaWV3IGV4dGVuZHMgVmlld1BhcnQgewotCQotCXByaXZhdGUgSVJpY2hUZXh0IHJpY2hUZXh0OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFJpY2hUZXh0VGVzdFZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I2NyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQkKLQkJcmljaFRleHQgPSBuZXcgUmljaFRleHQoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWlmIChyaWNoVGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXJpY2hUZXh0LnNldFRleHQoIjxoMz5IZWxsbyBXb3JsZDwvaDM+Iik7Ci0JCQotCQlBY3Rpb24gYm9sZEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkJPTEQpOwotCQkJfQotCQl9OwotCQlib2xkQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19CT0xEKTsKLQkJCi0JCUFjdGlvbiBpdGFsaWNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JVEFMSUMpOwotCQkJfQotCQl9OwotCQlpdGFsaWNBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lUQUxJQyk7CQkKLQkJCi0JCUFjdGlvbiB1bmRlcmxpbmVBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5VTkRFUkxJTkUpOwotCQkJfQotCQl9OwotCQl1bmRlcmxpbmVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX1VOREVSTElORSk7Ci0JCQotCQlBY3Rpb24gc3Vic2NyaXB0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VCU0NSSVBUKTsKLQkJCX0KLQkJfTsKLQkJc3Vic2NyaXB0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19TVUJTQ1JJUFQpOwotCQkKLQkJQWN0aW9uIHN1cGVyc2NyaXB0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuU1VQRVJTQ1JJUFQpOwotCQkJfQotCQl9OwotCQlzdXBlcnNjcmlwdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfU1VQRVJTQ1JJUFQpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlMZWZ0QWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9MRUZUKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUxlZnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfTEVGVCk7Ci0JCQotCQlBY3Rpb24ganVzdGlmeUNlbnRlckFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfQ0VOVEVSKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUNlbnRlckFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfSlVTVElGWV9DRU5URVIpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlSaWdodEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkpVU1RJRllfUklHSFQpOwotCQkJfQotCQl9OwotCQlqdXN0aWZ5UmlnaHRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfUklHSFQpOwotCQkKLQkJQWN0aW9uIGp1c3RpZnlGdWxsQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuSlVTVElGWV9GVUxMKTsKLQkJCX0KLQkJfTsKLQkJanVzdGlmeUZ1bGxBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0pVU1RJRllfRlVMTCk7CQkKLQkJCi0JCUFjdGlvbiBhZGRPcmRlcmVkTGlzdEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9PUkRFUkVEX0xJU1QpOwotCQkJfQotCQl9OwotCQlhZGRPcmRlcmVkTGlzdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX09SREVSRURfTElTVCk7Ci0JCQotCQlBY3Rpb24gYWRkVW5vcmRlcmVkTGlzdEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9VTk9SREVSRURfTElTVCk7Ci0JCQl9Ci0JCX07Ci0JCWFkZFVub3JkZXJlZExpc3RBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0FERF9VTk9SREVSRURfTElTVCk7Ci0JCQotCQlBY3Rpb24gb3V0ZGVudEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLk9VVERFTlQpOwotCQkJfQotCQl9OwotCQlvdXRkZW50QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19PVVRERU5UKTsKLQkJCi0JCUFjdGlvbiBpbmRlbnRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5JTkRFTlQpOwotCQkJfQotCQl9OwotCQlpbmRlbnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFJpY2hUZXh0SW1hZ2VzLklNR19ERVNDX0lOREVOVCk7Ci0JCQotCQlBY3Rpb24gYWRkTGluZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmljaFRleHQuZXhlY3V0ZUNvbW1hbmQoUmljaFRleHRDb21tYW5kLkFERF9MSU5FKTsKLQkJCX0KLQkJfTsKLQkJYWRkTGluZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0xJTkUpOwkJCi0JCQotCQlBY3Rpb24gYWRkTGlua0FjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkTGlua0RpYWxvZyBkaWFsb2cgPSBuZXcgQWRkTGlua0RpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBudWxsKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCUxpbmsgbGluayA9IGRpYWxvZy5nZXRMaW5rKCk7Ci0JCQkJaWYgKGxpbmsuZ2V0VVJMKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJpY2hUZXh0LmV4ZWN1dGVDb21tYW5kKFJpY2hUZXh0Q29tbWFuZC5BRERfTElOSywgbGluay5nZXRVUkwoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRMaW5rQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihSaWNoVGV4dEltYWdlcy5JTUdfREVTQ19BRERfTElOSyk7Ci0JCQotCQlBY3Rpb24gYWRkSW1hZ2VBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFkZEltYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRJbWFnZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJCUltYWdlIGltYWdlID0gZGlhbG9nLmdldEltYWdlKCk7Ci0JCQkJaWYgKGltYWdlLmdldFVSTCgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX0lNQUdFLCBpbWFnZS5nZXRVUkwoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRJbWFnZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX0lNQUdFKTsKLQkJCi0JCUFjdGlvbiBhZGRUYWJsZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkVGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IEFkZFRhYmxlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJVGFibGUgdGFibGUgPSBkaWFsb2cuZ2V0VGFibGUoKTsKLQkJCQlpbnQgcm93cyA9IHRhYmxlLmdldFJvd3MoKTsKLQkJCQlpbnQgY29scyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQlTdHJpbmcgd2lkdGggPSB0YWJsZS5nZXRXaWR0aCgpOwotCQkJCWlmIChyb3dzID4gMCAmJiBjb2xzID4gMCkgewotCQkJCQlyaWNoVGV4dC5leGVjdXRlQ29tbWFuZChSaWNoVGV4dENvbW1hbmQuQUREX1RBQkxFLCByb3dzICsgIicsICciICsgY29scyArICInLCAnIiArIHdpZHRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9OwotCQlhZGRUYWJsZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUmljaFRleHRJbWFnZXMuSU1HX0RFU0NfQUREX1RBQkxFKTsKLQkJCi0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNZ3IgPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQotCQl0b29sQmFyTWdyLmFkZChuZXcgQmxvY2tUYWdDb250cmlidXRpb24ocmljaFRleHQpKTsJCQotCQl0b29sQmFyTWdyLmFkZChuZXcgRm9udE5hbWVDb250cmlidXRpb24ocmljaFRleHQpKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IEZvbnRTaXplQ29udHJpYnV0aW9uKHJpY2hUZXh0KSk7CQkKLQkJCi0JCXRvb2xCYXJNZ3IuYWRkKGJvbGRBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChpdGFsaWNBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZCh1bmRlcmxpbmVBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl0b29sQmFyTWdyLmFkZChzdWJzY3JpcHRBY3Rpb24pOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKHN1cGVyc2NyaXB0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeUxlZnRBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChqdXN0aWZ5Q2VudGVyQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeVJpZ2h0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoanVzdGlmeUZ1bGxBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKGFkZE9yZGVyZWRMaXN0QWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQoYWRkVW5vcmRlcmVkTGlzdEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CQkKLQkJdG9vbEJhck1nci5hZGQob3V0ZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKGluZGVudEFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRvb2xCYXJNZ3IuYWRkKGFkZExpbmVBY3Rpb24pOwkJCi0JCXRvb2xCYXJNZ3IuYWRkKGFkZExpbmtBY3Rpb24pOwotCQl0b29sQmFyTWdyLmFkZChhZGRJbWFnZUFjdGlvbik7Ci0JCXRvb2xCYXJNZ3IuYWRkKGFkZFRhYmxlQWN0aW9uKTsKLQkJdG9vbEJhck1nci5hZGQobmV3IFNlcGFyYXRvcigpKTsJCQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNzZXRGb2N1cygpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7Ci0JCWlmIChyaWNoVGV4dCAhPSBudWxsKSB7Ci0JCQlyaWNoVGV4dC5zZXRGb2N1cygpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0M2M0Yi4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNGY2ZjEuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzY0YTM2Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVQRiBUZXN0cyBGZWF0dXJlIgotICAgICAgdmVyc2lvbj0iMS41LjAiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYuY29tbW9uLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXBmLmRpYWdyYW0udGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi5yaWNodGV4dC50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVwZi50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLy5jbGFzc3BhdGggYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8ucHJvamVjdCBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTE2OGQuLjAwMDAwMDAKLS0tIGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVwZi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmYzOS4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogRVBGIFRlc3RzIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVwZi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuNS4wCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMsCi0gb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMsCi0gb3JnLmVjbGlwc2UuZXBmLmF1dGhvcmluZy51aQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTFjZThjLi4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc291cmNlLmVwZnRlc3RzLmphciA9IHNyYy8KLW91dHB1dC5lcGZ0ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZXBmdGVzdHMuamFyCmRpZmYgLS1naXQgYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvQWxsVGVzdHMuamF2YSBiLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi90ZXN0cy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE1ZWY3Li4wMDAwMDAwCi0tLSBhLzEuNS90ZXN0cy9vcmcuZWNsaXBzZS5lcGYudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VwZi90ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLS8vIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLS8vIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotLy8gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLS8vIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0vLwotLy8gQ29udHJpYnV0b3JzOgotLy8gSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXBmLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5jb21tb24udGVzdHMuQ29tbW9uVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXBmLmxpYnJhcnkudGVzdHMuTGlicmFyeVRlc3RzOwotCi0vKioKLSAqIEpVbml0IFRlc3RzIGZvciBFUEYgQ29tcG9zZXIuCi0gKiAKLSAqIEBhdXRob3IgS2VsdmluIExvdwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkvLyRKVW5pdC1CRUdJTiQJCQotCQlzdWl0ZS5hZGRUZXN0KENvbW1vblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KExpYnJhcnlUZXN0cy5zdWl0ZSgpKTsJCQotCQkvLyRKVW5pdC1FTkQkCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvMS41L3Rlc3RzL29yZy5lY2xpcHNlLmVwZi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXBmL3Rlc3RzL3VpL1VzZXJJbnRlcmFjdGlvbkhhbmRsZXJUZXN0LmphdmEgYi8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvdWkvVXNlckludGVyYWN0aW9uSGFuZGxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5M2Q1Yy4uMDAwMDAwMAotLS0gYS8xLjUvdGVzdHMvb3JnLmVjbGlwc2UuZXBmLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcGYvdGVzdHMvdWkvVXNlckludGVyYWN0aW9uSGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotLy8gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotLy8gYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0vLyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLS8vCi0vLyBDb250cmlidXRvcnM6Ci0vLyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcGYudGVzdHMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS5lZGl0LmNvbW1hbmQuVXNlcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQuY29tbWFuZC5JVXNlckludGVyYWN0aW9uSGFuZGxlci5JTWVzc2VuZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5FeHRlbnNpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVwZi5saWJyYXJ5LmVkaXQudXRpbC5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcGYubGlicmFyeS50ZXN0cy5UZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotCi0vKioKLSAqIEBhdXRob3IgUGhvbmcgTmd1eWVuIExlIC0gT2N0IDI3LCAyMDA2Ci0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VySW50ZXJhY3Rpb25IYW5kbGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3QoamF2YS51dGlsLkxpc3QsIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIsIGJvb2xlYW4sIGphdmEudXRpbC5MaXN0LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlbGVjdCgpIHsKLQkJZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNzZWxlY3RPbmUoaW50W10sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNlbGVjdE9uZSgpIHsKLQkJZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIGZvcgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lcGYuYXV0aG9yaW5nLnVpLmFjdGlvbnMuVXNlckludGVyYWN0aW9uSGFuZGxlciNyZXF1ZXN0SW5wdXQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS51dGlsLkxpc3QpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdElucHV0KCkgewotCQlMaXN0IGlucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7IGk8MjsgaSsrKXsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWxpc3QuYWRkKCJJdGVtMSIpOwotCQkJbGlzdC5hZGQoIkl0ZW0yIik7Ci0JCQlVc2VySW5wdXQgaW5wdXQgPSBuZXcgVXNlcklucHV0KCJMYWJlbCBOYW1lIitpLCBpLCB0cnVlLCBsaXN0LAotCQkJCQkJCW5ldyBJdGVtTGFiZWxQcm92aWRlcigpLCBudWxsLCBudWxsKTsKLQkJCWlucHV0cy5hZGQoaW5wdXQpOwotCQl9Ci0JCQotCQlJVXNlckludGVyYWN0aW9uSGFuZGxlciB1aUhhbmRsZXIgPSBFeHRlbnNpb25NYW5hZ2VyCi0JCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCQl1aUhhbmRsZXIucmVxdWVzdElucHV0KCJUZXN0aW5nIFRpdGxlIiwgIk5pY2UgbWVzc2FnZSIsIGlucHV0cyk7Ci0JCQotCQlmb3IoSXRlcmF0b3IgaXQgPSBpbnB1dHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyl7Ci0JCQlPYmplY3Qgb3ggPSBpdC5uZXh0KCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByaW50IDogIisgKChVc2VySW5wdXQpb3gpLmdldElucHV0KCkpOwotCQl9Ci0JCS8vZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNZXNzZW5nZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVVzZXJJbnRlcmFjdGlvbkhhbmRsZXIgdWlIYW5kbGVyID0gRXh0ZW5zaW9uTWFuYWdlcgotCQkJCS5nZXREZWZhdWx0VXNlckludGVyYWN0aW9uSGFuZGxlcigpOwotCi0JCUlNZXNzZW5nZXIgbWVzc2VuZ2VyID0gdWlIYW5kbGVyLmdldE1lc3NlbmdlcigpOwotCi0JCS8vIFdlIGFyZSB0ZXN0aW5nIG1lc3NhZ2UgZGlhbG9ncyBidXQgRXJyb3JEaWFsb2cuQVVUT01BVEVEX01PREUgaXMgc2V0Ci0JCS8vIHRvIHRydWUgYnkgRWNsaXBzZSB3aGlsZSBydW5uaW5nIEpVbml0IHRlc3QuIFNvIHdlIHNldCB0aGlzIGZsYWcKLQkJLy8gYmFjayB0byBmYWxzZS4KLQkJLy8KLQkJRXJyb3JEaWFsb2cuQVVUT01BVEVEX01PREUgPSBmYWxzZTsKLQotCQkvLyB0ZXN0IHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2cpOwotCQkvLwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJtZXNzYWdlIik7Ci0JCW1lc3Nlbmdlci5zaG93RXJyb3IobnVsbCwgIk5VTEwgdGl0bGUiKTsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcihudWxsLCBudWxsKTsKLQotCQkvLyB0ZXN0IHNob3dFcnJvcihTdHJpbmcgdGl0bGUsIFN0cmluZyBtc2csIElTdGF0dXMgc3RhdHVzKQotCQkvLwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJOVUwgc3RhdHVzIiwgbnVsbCk7Ci0JCVN0cmluZyBwbHVnaW5JRCA9IFRlc3RzUGx1Z2luLlBMVUdJTl9JRDsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcigidGl0bGUiLCAibWVzc2FnZSIsIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywKLQkJCQlwbHVnaW5JRCwgMCwgIk9LIHN0YXR1cyIsIG51bGwpKTsKLQkJbWVzc2VuZ2VyLnNob3dFcnJvcigidGl0bGUiLCAibWVzc2FnZSIsIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQlwbHVnaW5JRCwgMCwgIkVSUk9SIHN0YXR1cyIsIG5ldyBSdW50aW1lRXhjZXB0aW9uKAotCQkJCQkJInJ1bnRpbWUgZXhjZXB0aW9uIikpKTsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKHBsdWdpbklELCAwLCAiIiwgbnVsbCk7Ci0JCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBwbHVnaW5JRCwgMCwgIk9LIHN0YXR1cyIsIG51bGwpKTsKLQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIHBsdWdpbklELCAwLCAiRVJST1Igc3RhdHVzIiwKLQkJCQluZXcgUnVudGltZUV4Y2VwdGlvbigicnVudGltZSBleGNlcHRpb24iKSkpOwotCQltZXNzZW5nZXIuc2hvd0Vycm9yKCJ0aXRsZSIsICJtZXNzYWdlIiwgc3RhdHVzKTsKLQl9Ci19Cg==